summaryrefslogtreecommitdiff
path: root/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'graphics')
-rw-r--r--graphics/asymptote/CMakeLists.txt104
-rw-r--r--graphics/asymptote/CMakePresets.json115
-rw-r--r--graphics/asymptote/ChangeLog6661
-rw-r--r--graphics/asymptote/EXRFiles.h2
-rw-r--r--graphics/asymptote/GUI/ContextWindow.py16
-rw-r--r--graphics/asymptote/GUI/CustMatTransform.py2
-rw-r--r--graphics/asymptote/GUI/SetCustomAnchor.py2
-rw-r--r--graphics/asymptote/GUI/Widg_addLabel.py2
-rw-r--r--graphics/asymptote/GUI/Widg_addPolyOpt.py2
-rw-r--r--graphics/asymptote/GUI/Widg_editBezier.py2
-rw-r--r--graphics/asymptote/GUI/Window1.py19
-rw-r--r--graphics/asymptote/GUI/buildtool.py122
-rw-r--r--graphics/asymptote/GUI/configs/xasyconfig.cson17
-rw-r--r--graphics/asymptote/GUI/labelEditor.py2
-rw-r--r--graphics/asymptote/GUI/requirements.dev.txt1
-rw-r--r--graphics/asymptote/GUI/requirements.txt7
-rw-r--r--graphics/asymptote/GUI/setup.py4
-rwxr-xr-xgraphics/asymptote/GUI/xasy.py7
-rw-r--r--graphics/asymptote/GUI/xasy2asy.py55
-rw-r--r--graphics/asymptote/GUI/xasyArgs.py9
-rw-r--r--graphics/asymptote/GUI/xasyFile.py22
-rw-r--r--graphics/asymptote/GUI/xasyOptions.py17
-rw-r--r--graphics/asymptote/GUI/xasySvg.py38
-rw-r--r--graphics/asymptote/GUI/xasyicons/icons_rc.py (renamed from graphics/asymptote/GUI/icons_rc.py)90
-rw-r--r--graphics/asymptote/GUI/xasyqtui/custMatTransform.py (renamed from graphics/asymptote/GUI/pyUIClass/custMatTransform.py)4
-rw-r--r--graphics/asymptote/GUI/xasyqtui/labelTextEditor.py (renamed from graphics/asymptote/GUI/pyUIClass/labelTextEditor.py)4
-rw-r--r--graphics/asymptote/GUI/xasyqtui/setCustomAnchor.py (renamed from graphics/asymptote/GUI/pyUIClass/setCustomAnchor.py)2
-rw-r--r--graphics/asymptote/GUI/xasyqtui/widg_addLabel.py (renamed from graphics/asymptote/GUI/pyUIClass/widg_addLabel.py)4
-rw-r--r--graphics/asymptote/GUI/xasyqtui/widg_addPolyOpt.py (renamed from graphics/asymptote/GUI/pyUIClass/widg_addPolyOpt.py)2
-rw-r--r--graphics/asymptote/GUI/xasyqtui/widg_editBezier.py (renamed from graphics/asymptote/GUI/pyUIClass/widg_editBezier.py)4
-rw-r--r--graphics/asymptote/GUI/xasyqtui/widgetPointEditor.py (renamed from graphics/asymptote/GUI/pyUIClass/widgetPointEditor.py)4
-rw-r--r--graphics/asymptote/GUI/xasyqtui/window1.py (renamed from graphics/asymptote/GUI/pyUIClass/window1.py)4
-rw-r--r--graphics/asymptote/GUI/xasyversion/version.py1
-rw-r--r--graphics/asymptote/INSTALL-VCPKG.md118
-rw-r--r--graphics/asymptote/INSTALL-WIN.md250
-rw-r--r--graphics/asymptote/LspCpp/CMakeDoxyfile.in297
-rw-r--r--graphics/asymptote/LspCpp/CMakeDoxygenDefaults.cmake715
-rw-r--r--graphics/asymptote/LspCpp/CMakeLists.txt193
-rw-r--r--graphics/asymptote/LspCpp/CMakePresets.json30
-rw-r--r--graphics/asymptote/LspCpp/README.md17
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Cancellation.h17
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Condition.h76
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Context.h297
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Endpoint.h65
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/GCThreadContext.h3
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageIssue.h185
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageJsonHandler.h93
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageProducer.h26
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/NotificationInMessage.h110
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/RemoteEndPoint.h580
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/RequestInMessage.h110
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/ScopeExit.h64
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/StreamMessageProducer.h62
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/TcpServer.h56
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/WebSocketServer.h115
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/future.h250
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/json.h251
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/lsRequestId.h85
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/lsResponseMessage.h112
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/macro_map.h521
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/message.h33
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/serializer.h475
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/stream.h380
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/threaded_queue.h493
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/traits.h278
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/AbsolutePath.h35
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/ClientPreferences.h564
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/CodeActionParams.h94
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/Directory.h11
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/ExecuteCommandParams.h15
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/IProgressMonitor.h83
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/Markup/Markup.h157
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/Markup/string_ref.h1392
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/ParentProcessWatcher.h9
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/ProcessIoService.h62
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/ProtocolJsonHandler.h15
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/ResourceOperation.h104
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/SimpleTimer.h30
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/client/registerCapability.h22
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/client/unregisterCapability.h21
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/Move.h4
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/OverridableMethod.h38
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h8
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/addOverridableMethods.h15
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/buildWorkspace.h12
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h31
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h24
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h43
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkToStringStatus.h30
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/classFileContents.h3
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/codeActionResult.h7
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/executeCommand.h16
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/findLinks.h18
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateAccessors.h15
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateConstructors.h17
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h24
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h27
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateToString.h11
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/getMoveDestinations.h77
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/getRefactorEdit.h88
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/listOverridableMethods.h12
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/organizeImports.h4
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h2
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h32
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/searchSymbols.h20
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/sonarlint/protocol.h186
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/general/InitializeParams.h144
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/general/initialize.h13
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/general/initialized.h2
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsClientCapabilities.h38
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsServerCapabilities.h946
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h1041
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h222
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/general/progress.h8
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/general/shutdown.h2
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/language/language.h123
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/location_type.h47
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lru_cache.h272
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsAny.h227
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsCodeAction.h30
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsCommand.h55
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsDocumentUri.h35
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsFormattingOptions.h46
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsMarkedString.h23
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsPosition.h31
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsRange.h25
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsResponseError.h91
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentEdit.h16
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentIdentifier.h7
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentItem.h23
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentPositionParams.h18
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextEdit.h49
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h12
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsWorkspaceEdit.h40
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_code_action.h99
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_completion.h301
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_diagnostic.h114
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/method_type.h5
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/out_list.h12
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/symbol.h176
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/SemanticTokens.h306
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/callHierarchy.h133
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/code_action.h50
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/code_lens.h36
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/colorPresentation.h44
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/completion.h73
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/declaration_definition.h12
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/didRenameFiles.h49
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_change.h49
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_close.h24
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_open.h23
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_save.h18
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/documentColor.h57
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/document_link.h44
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/document_symbol.h28
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/foldingRange.h45
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/formatting.h23
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/highlight.h6
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/hover.h28
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/implementation.h6
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/inlayHint.h169
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/linkedEditingRange.h38
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/onTypeFormatting.h28
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/prepareRename.h28
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/publishDiagnostics.h22
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/range_formatting.h29
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/references.h42
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/rename.h22
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCodeLens.h2
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCompletionItem.h6
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveTypeHierarchy.h25
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/selectionRange.h37
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/semanticHighlighting.h27
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/signature_help.h106
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/typeHierarchy.h84
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/type_definition.h6
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/willSave.h44
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/utils.h136
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/windows/MessageNotify.h62
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/working_files.h75
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/applyEdit.h27
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/configuration.h22
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/didChangeWorkspaceFolders.h33
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/did_change_configuration.h17
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/did_change_watched_files.h34
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/execute_command.h5
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/symbol.h1
-rw-r--r--graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/workspaceFolders.h20
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/Context.cpp41
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/Endpoint.cpp57
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/GCThreadContext.cpp2
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/MessageJsonHandler.cpp71
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/RemoteEndPoint.cpp862
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/StreamMessageProducer.cpp382
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/TcpServer.cpp485
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/WebSocketServer.cpp505
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/message.cpp138
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/serializer.cpp331
-rw-r--r--graphics/asymptote/LspCpp/src/jsonrpc/threaded_queue.cpp34
-rw-r--r--graphics/asymptote/LspCpp/src/lsp/Markup.cpp1779
-rw-r--r--graphics/asymptote/LspCpp/src/lsp/ParentProcessWatcher.cpp140
-rw-r--r--graphics/asymptote/LspCpp/src/lsp/ProtocolJsonHandler.cpp1095
-rw-r--r--graphics/asymptote/LspCpp/src/lsp/initialize.cpp72
-rw-r--r--graphics/asymptote/LspCpp/src/lsp/lsp.cpp1469
-rw-r--r--graphics/asymptote/LspCpp/src/lsp/lsp_diagnostic.cpp127
-rw-r--r--graphics/asymptote/LspCpp/src/lsp/textDocument.cpp610
-rw-r--r--graphics/asymptote/LspCpp/src/lsp/utils.cpp955
-rw-r--r--graphics/asymptote/LspCpp/src/lsp/working_files.cpp183
-rwxr-xr-xgraphics/asymptote/LspCpp/support/cmake/JoinPaths.cmake26
-rw-r--r--graphics/asymptote/LspCpp/support/cmake/distclean.cmake80
-rwxr-xr-xgraphics/asymptote/LspCpp/support/cmake/lspcpp-config.cmake.in7
-rwxr-xr-xgraphics/asymptote/LspCpp/support/cmake/lspcpp.pc.in11
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/CMakeDirectoryInformation.cmake6
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/doc.dir/build.make14
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/Doxyfile8
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/Makefile207
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/cmake_install.cmake54
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/include/network/uri/detail/translate.hpp10
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/CMakeDirectoryInformation.cmake16
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/DependInfo.cmake30
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/build.make226
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/cmake_clean.cmake25
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/cmake_clean_target.cmake3
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.internal1739
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.make2237
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts2
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/depend.make2
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/flags.make10
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/link.txt2
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/progress.make10
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/progress.marks1
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/Makefile423
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/cmake_install.cmake48
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/libnetwork-uri.abin0 -> 3310132 bytes
-rw-r--r--graphics/asymptote/LspCpp/vcpkg.json27
-rw-r--r--graphics/asymptote/Makefile.in280
-rw-r--r--graphics/asymptote/README9
-rw-r--r--graphics/asymptote/ReleaseNotes67
-rw-r--r--graphics/asymptote/array.cc12
-rw-r--r--graphics/asymptote/asy-keywords.el12
-rwxr-xr-xgraphics/asymptote/asy-list.pl106
-rw-r--r--graphics/asymptote/asy-list.py145
-rw-r--r--graphics/asymptote/asy.list6727
-rw-r--r--graphics/asymptote/asymptote.spec3
-rw-r--r--graphics/asymptote/asyparser.cc (renamed from graphics/asymptote/parser.cc)15
-rw-r--r--graphics/asymptote/asyparser.h (renamed from graphics/asymptote/parser.h)7
-rw-r--r--graphics/asymptote/asyprocess.cc (renamed from graphics/asymptote/process.cc)23
-rw-r--r--graphics/asymptote/asyprocess.h (renamed from graphics/asymptote/process.h)8
-rwxr-xr-xgraphics/asymptote/autogen.sh14
-rw-r--r--graphics/asymptote/ax_pthread.m4451
-rw-r--r--graphics/asymptote/backports/getopt/CMakeLists.txt27
-rw-r--r--graphics/asymptote/backports/getopt/include/getopt.h (renamed from graphics/asymptote/getopt.h)0
-rw-r--r--graphics/asymptote/backports/getopt/src/getopt.c (renamed from graphics/asymptote/getopt.c)0
-rw-r--r--graphics/asymptote/backports/getopt/src/getopt1.c (renamed from graphics/asymptote/getopt1.c)14
-rw-r--r--graphics/asymptote/backports/glew/CMakeLists.txt10
-rw-r--r--graphics/asymptote/backports/glew/include/GL/glew.h (renamed from graphics/asymptote/GL/glew.h)0
-rw-r--r--graphics/asymptote/backports/glew/include/GL/glxew.h (renamed from graphics/asymptote/GL/glxew.h)0
-rw-r--r--graphics/asymptote/backports/glew/include/GL/wglew.h (renamed from graphics/asymptote/GL/wglew.h)0
-rw-r--r--graphics/asymptote/backports/glew/src/glew.c (renamed from graphics/asymptote/GL/glew.c)0
-rw-r--r--graphics/asymptote/backports/optional/CMakeLists.txt6
-rw-r--r--graphics/asymptote/backports/optional/include/optional.hpp (renamed from graphics/asymptote/optional.hpp)0
-rw-r--r--graphics/asymptote/base/animation.asy6
-rw-r--r--graphics/asymptote/base/feynman.asy15
-rw-r--r--graphics/asymptote/base/graph3.asy104
-rw-r--r--graphics/asymptote/base/grid3.asy5
-rw-r--r--graphics/asymptote/base/map.asy62
-rw-r--r--graphics/asymptote/base/mapArray.asy2
-rw-r--r--graphics/asymptote/base/plain.asy22
-rw-r--r--graphics/asymptote/base/plain_Label.asy2
-rw-r--r--graphics/asymptote/base/plain_arrows.asy2
-rw-r--r--graphics/asymptote/base/plain_bounds.asy134
-rw-r--r--graphics/asymptote/base/plain_boxes.asy2
-rw-r--r--graphics/asymptote/base/plain_constants.asy2
-rw-r--r--graphics/asymptote/base/plain_filldraw.asy2
-rw-r--r--graphics/asymptote/base/plain_margins.asy2
-rw-r--r--graphics/asymptote/base/plain_markers.asy4
-rw-r--r--graphics/asymptote/base/plain_paths.asy2
-rw-r--r--graphics/asymptote/base/plain_picture.asy111
-rw-r--r--graphics/asymptote/base/plain_prethree.asy10
-rw-r--r--graphics/asymptote/base/plain_shipout.asy7
-rw-r--r--graphics/asymptote/base/rational.asy189
-rw-r--r--graphics/asymptote/base/rationalSimplex.asy2
-rw-r--r--graphics/asymptote/base/slide.asy14
-rw-r--r--graphics/asymptote/base/three.asy45
-rw-r--r--graphics/asymptote/base/three_surface.asy166
-rw-r--r--graphics/asymptote/base/v3dheadertypes.asy2
-rw-r--r--graphics/asymptote/base/v3dtypes.asy2
-rw-r--r--graphics/asymptote/base/webgl/asygl.js4
-rw-r--r--graphics/asymptote/bbox3.h148
-rw-r--r--graphics/asymptote/bezierpatch.cc11
-rw-r--r--graphics/asymptote/binaries/i386-windows/README62
-rwxr-xr-xgraphics/asymptote/binaries/i386-windows/cygwin1.dllbin3281267 -> 0 bytes
-rw-r--r--graphics/asymptote/binaries/i386-windows/texlive/README5
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/README9
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/cygwin1.dllbin3011637 -> 0 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/fftw3.dllbin0 -> 956416 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/freeglut.dllbin0 -> 247296 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/gc.dllbin0 -> 148480 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/gccpp.dllbin0 -> 11264 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/getopt.dllbin0 -> 18944 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/gsl.dllbin0 -> 2927616 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/gslcblas.dllbin0 -> 415744 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/libcurl.dllbin0 -> 593920 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/pthreadvc3.dllbin0 -> 61440 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/readline.dllbin0 -> 177152 bytes
-rw-r--r--graphics/asymptote/binaries/x86_64-windows/zlib1.dllbin0 -> 90624 bytes
-rw-r--r--graphics/asymptote/build-scripts/HOWTO-MSWindows87
-rwxr-xr-xgraphics/asymptote/build-scripts/build-asymptote30
-rwxr-xr-xgraphics/asymptote/build-scripts/build-asymptote-CTAN34
-rwxr-xr-xgraphics/asymptote/build-scripts/build-asymptote.dos106
-rw-r--r--graphics/asymptote/build-scripts/build-asymptote.ps1317
-rw-r--r--graphics/asymptote/builtin.cc53
-rw-r--r--graphics/asymptote/builtin.h23
-rw-r--r--graphics/asymptote/camp.l19
-rw-r--r--graphics/asymptote/camp.tab.cc2142
-rw-r--r--graphics/asymptote/camp.tab.h39
-rw-r--r--graphics/asymptote/camp.y20
-rw-r--r--graphics/asymptote/camperror.cc6
-rw-r--r--graphics/asymptote/cmake-preset-files/base-presets.json130
-rw-r--r--graphics/asymptote/cmake-scripts/asy-base-files.cmake78
-rw-r--r--graphics/asymptote/cmake-scripts/asy-files.cmake34
-rw-r--r--graphics/asymptote/cmake-scripts/asy-macro.cmake50
-rw-r--r--graphics/asymptote/cmake-scripts/asy-misc-files.cmake35
-rw-r--r--graphics/asymptote/cmake-scripts/backport-libs.cmake11
-rw-r--r--graphics/asymptote/cmake-scripts/basic-parameters.cmake7
-rw-r--r--graphics/asymptote/cmake-scripts/buildfiles-to-src.cmake4
-rw-r--r--graphics/asymptote/cmake-scripts/common.cmake6
-rw-r--r--graphics/asymptote/cmake-scripts/compiler-config.cmake15
-rw-r--r--graphics/asymptote/cmake-scripts/docgen.cmake328
-rw-r--r--graphics/asymptote/cmake-scripts/external-libs.cmake268
-rw-r--r--graphics/asymptote/cmake-scripts/generated-files.cmake224
-rw-r--r--graphics/asymptote/cmake-scripts/gnu-install-macros.cmake18
-rw-r--r--graphics/asymptote/cmake-scripts/linux-install.cmake142
-rw-r--r--graphics/asymptote/cmake-scripts/options.cmake293
-rw-r--r--graphics/asymptote/cmake-scripts/scripts/wce.script.cmake15
-rw-r--r--graphics/asymptote/cmake-scripts/subrepo-projects.cmake74
-rw-r--r--graphics/asymptote/cmake-scripts/tests-asy.cmake126
-rw-r--r--graphics/asymptote/cmake-scripts/tests-wce.cmake14
-rw-r--r--graphics/asymptote/cmake-scripts/thirdparty-impl.cmake7
-rw-r--r--graphics/asymptote/cmake-scripts/vcpkg-features.cmake35
-rw-r--r--graphics/asymptote/cmake-scripts/win32-pre-nsis-installer.cmake206
-rw-r--r--graphics/asymptote/cmake-scripts/win32-specific.cmake102
-rw-r--r--graphics/asymptote/coder.cc38
-rw-r--r--graphics/asymptote/coder.h20
-rw-r--r--graphics/asymptote/common.h73
-rwxr-xr-xgraphics/asymptote/compile348
-rwxr-xr-xgraphics/asymptote/config.guess28
-rw-r--r--graphics/asymptote/config.h.in69
-rwxr-xr-x[-rw-r--r--]graphics/asymptote/config.sub686
-rwxr-xr-xgraphics/asymptote/configure2968
-rw-r--r--graphics/asymptote/configure.ac739
-rw-r--r--graphics/asymptote/constructor.cc2
-rw-r--r--graphics/asymptote/cudareflect/CMakeLists.txt29
-rw-r--r--graphics/asymptote/cudareflect/IrradianceGenerator.sln25
-rw-r--r--graphics/asymptote/cudareflect/IrradianceGenerator.vcxproj119
-rw-r--r--graphics/asymptote/cudareflect/Makefile4
-rw-r--r--graphics/asymptote/cudareflect/common.h2
-rw-r--r--graphics/asymptote/cudareflect/tinyexr.cc15
-rw-r--r--graphics/asymptote/cudareflect/tinyexr/Makefile25
-rwxr-xr-xgraphics/asymptote/cudareflect/tinyexr/experimental/js/compile_to_js.sh10
-rw-r--r--graphics/asymptote/cudareflect/tinyexr/experimental/js/test.js21
-rw-r--r--graphics/asymptote/cudareflect/tinyexr/test/fuzzer/Makefile13
-rw-r--r--graphics/asymptote/cxxtests/CMakeLists.txt21
-rw-r--r--graphics/asymptote/cxxtests/cmake-scripts/external-libs.cmake19
-rw-r--r--graphics/asymptote/cxxtests/cmake-scripts/tests.cmake12
-rw-r--r--graphics/asymptote/cxxtests/include/asycxxtests/common.h9
-rw-r--r--graphics/asymptote/cxxtests/src/testMain.cc14
-rw-r--r--graphics/asymptote/cxxtests/tests/placeholder.cc8
-rw-r--r--graphics/asymptote/dec.cc902
-rw-r--r--graphics/asymptote/dec.h72
-rwxr-xr-xgraphics/asymptote/depcomp791
-rwxr-xr-xgraphics/asymptote/determine_pkg_info.py76
-rw-r--r--graphics/asymptote/doc/CAD.pdfbin198650 -> 199138 bytes
-rw-r--r--graphics/asymptote/doc/FAQ/asy-faq.info2
-rw-r--r--graphics/asymptote/doc/TeXShopAndAsymptote.pdfbin81194 -> 81479 bytes
-rw-r--r--graphics/asymptote/doc/asy-latex.pdfbin209115 -> 209115 bytes
-rw-r--r--graphics/asymptote/doc/asy.14
-rw-r--r--graphics/asymptote/doc/asyRefCard.pdfbin121145 -> 121145 bytes
-rw-r--r--graphics/asymptote/doc/asymptote.pdfbin1249734 -> 1261123 bytes
-rw-r--r--graphics/asymptote/doc/asymptote.texi436
-rw-r--r--graphics/asymptote/doc/axis3.asy2
-rw-r--r--graphics/asymptote/doc/build-asy-1-file.py56
-rw-r--r--graphics/asymptote/doc/build-asymptote-pdf-win.py27
-rw-r--r--graphics/asymptote/doc/build-latexusage-pdf.py103
-rw-r--r--graphics/asymptote/doc/extra/intro.asy75
-rw-r--r--graphics/asymptote/doc/fillcontour.asy3
-rw-r--r--graphics/asymptote/doc/gen-asy-options-file.py37
-rw-r--r--graphics/asymptote/doc/png/asymptote.info1169
-rw-r--r--graphics/asymptote/drawfill.h2
-rw-r--r--graphics/asymptote/drawlabel.cc8
-rw-r--r--graphics/asymptote/drawsurface.cc4
-rw-r--r--graphics/asymptote/drawsurface.h6
-rw-r--r--graphics/asymptote/entry.cc127
-rw-r--r--graphics/asymptote/entry.h56
-rw-r--r--graphics/asymptote/env.cc15
-rw-r--r--graphics/asymptote/env.h25
-rw-r--r--graphics/asymptote/envcompleter.cc2
-rw-r--r--graphics/asymptote/errormsg.cc27
-rw-r--r--graphics/asymptote/errormsg.h7
-rw-r--r--graphics/asymptote/errors62
-rw-r--r--graphics/asymptote/errortest.asy126
-rw-r--r--graphics/asymptote/errortestBrokenTemplate.asy5
-rw-r--r--graphics/asymptote/errortestNonTemplate.asy1
-rw-r--r--graphics/asymptote/errortestTemplate.asy6
-rw-r--r--graphics/asymptote/examples/AiryDisk.asy2
-rw-r--r--graphics/asymptote/examples/RiemannSphere.asy1
-rw-r--r--graphics/asymptote/examples/RiemannSurface.asy2
-rw-r--r--graphics/asymptote/examples/RiemannSurfaceRoot.asy2
-rw-r--r--graphics/asymptote/examples/arrows3.asy2
-rw-r--r--graphics/asymptote/examples/clockarray.asy3
-rw-r--r--graphics/asymptote/examples/cyclohexane.asy4
-rw-r--r--graphics/asymptote/examples/elevation.asy2
-rw-r--r--graphics/asymptote/examples/extrudedcontour.asy5
-rw-r--r--graphics/asymptote/examples/filesurface.asy23
-rw-r--r--graphics/asymptote/examples/gamma3.asy4
-rw-r--r--graphics/asymptote/examples/pdb.asy5
-rw-r--r--graphics/asymptote/examples/projectelevation.asy5
-rw-r--r--graphics/asymptote/examples/slidedemo.asy2
-rw-r--r--graphics/asymptote/examples/smoothelevation.asy4
-rw-r--r--graphics/asymptote/examples/soccerball.asy2
-rw-r--r--graphics/asymptote/examples/splitpatch.asy2
-rw-r--r--graphics/asymptote/examples/teapot.asy12
-rw-r--r--graphics/asymptote/examples/truncatedIcosahedron.asy5
-rw-r--r--graphics/asymptote/examples/twistedtubes.asy2
-rw-r--r--graphics/asymptote/examples/venn.asy2
-rw-r--r--graphics/asymptote/exithandlers.cc57
-rw-r--r--graphics/asymptote/exithandlers.h15
-rw-r--r--graphics/asymptote/exp.cc138
-rw-r--r--graphics/asymptote/fileio.cc198
-rw-r--r--graphics/asymptote/fileio.h160
-rwxr-xr-xgraphics/asymptote/findsym.pl53
-rw-r--r--graphics/asymptote/findsym.py74
-rw-r--r--graphics/asymptote/fundec.cc101
-rw-r--r--graphics/asymptote/fundec.h8
-rw-r--r--graphics/asymptote/gc/AUTHORS470
-rw-r--r--graphics/asymptote/gc/CMakeLists.txt882
-rw-r--r--graphics/asymptote/gc/ChangeLog11012
-rw-r--r--graphics/asymptote/gc/Config.cmake.in5
-rw-r--r--graphics/asymptote/gc/Makefile.am249
-rw-r--r--graphics/asymptote/gc/Makefile.direct431
-rw-r--r--graphics/asymptote/gc/Makefile.in2837
-rw-r--r--graphics/asymptote/gc/NT_MAKEFILE186
-rw-r--r--graphics/asymptote/gc/OS2_MAKEFILE59
-rw-r--r--graphics/asymptote/gc/PCR-Makefile47
-rw-r--r--graphics/asymptote/gc/README.QUICK85
-rw-r--r--graphics/asymptote/gc/README.md575
-rw-r--r--graphics/asymptote/gc/SMakefile.amiga172
-rw-r--r--graphics/asymptote/gc/WCC_MAKEFILE286
-rw-r--r--graphics/asymptote/gc/aclocal.m41212
-rw-r--r--graphics/asymptote/gc/allchblk.c993
-rw-r--r--graphics/asymptote/gc/alloc.c1812
-rwxr-xr-xgraphics/asymptote/gc/autogen.sh18
-rw-r--r--graphics/asymptote/gc/autom4te.cache/output.022068
-rw-r--r--graphics/asymptote/gc/autom4te.cache/output.122068
-rw-r--r--graphics/asymptote/gc/autom4te.cache/output.222068
-rw-r--r--graphics/asymptote/gc/autom4te.cache/output.322069
-rw-r--r--graphics/asymptote/gc/autom4te.cache/requests610
-rw-r--r--graphics/asymptote/gc/autom4te.cache/traces.03054
-rw-r--r--graphics/asymptote/gc/autom4te.cache/traces.11181
-rw-r--r--graphics/asymptote/gc/autom4te.cache/traces.23054
-rw-r--r--graphics/asymptote/gc/autom4te.cache/traces.31181
-rw-r--r--graphics/asymptote/gc/backgraph.c558
-rw-r--r--graphics/asymptote/gc/bdw-gc.pc.in10
-rw-r--r--graphics/asymptote/gc/blacklst.c301
-rw-r--r--graphics/asymptote/gc/build/s60v3/bld.inf11
-rw-r--r--graphics/asymptote/gc/build/s60v3/libgc.mmp78
-rw-r--r--graphics/asymptote/gc/checksums.c178
-rwxr-xr-xgraphics/asymptote/gc/config.guess1774
-rwxr-xr-xgraphics/asymptote/gc/config.sub1907
-rwxr-xr-xgraphics/asymptote/gc/configure22069
-rw-r--r--graphics/asymptote/gc/configure.ac1214
-rw-r--r--graphics/asymptote/gc/cord/cord.am40
-rw-r--r--graphics/asymptote/gc/cord/cordbscs.c942
-rw-r--r--graphics/asymptote/gc/cord/cordprnt.c455
-rw-r--r--graphics/asymptote/gc/cord/cordxtra.c664
-rw-r--r--graphics/asymptote/gc/cord/tests/cordtest.c351
-rw-r--r--graphics/asymptote/gc/cord/tests/de.c640
-rw-r--r--graphics/asymptote/gc/cord/tests/de_cmds.h31
-rw-r--r--graphics/asymptote/gc/cord/tests/de_win.c387
-rw-r--r--graphics/asymptote/gc/cord/tests/de_win.h97
-rw-r--r--graphics/asymptote/gc/cord/tests/de_win.rc70
-rw-r--r--graphics/asymptote/gc/darwin_stop_world.c785
-rw-r--r--graphics/asymptote/gc/dbg_mlc.c1210
-rw-r--r--graphics/asymptote/gc/digimars.mak102
-rw-r--r--graphics/asymptote/gc/doc/README.DGUX38639
-rw-r--r--graphics/asymptote/gc/doc/README.Mac332
-rw-r--r--graphics/asymptote/gc/doc/README.OS26
-rw-r--r--graphics/asymptote/gc/doc/README.amiga284
-rw-r--r--graphics/asymptote/gc/doc/README.arm.cross62
-rw-r--r--graphics/asymptote/gc/doc/README.autoconf59
-rw-r--r--graphics/asymptote/gc/doc/README.cmake62
-rw-r--r--graphics/asymptote/gc/doc/README.cords45
-rw-r--r--graphics/asymptote/gc/doc/README.darwin81
-rw-r--r--graphics/asymptote/gc/doc/README.emscripten15
-rw-r--r--graphics/asymptote/gc/doc/README.environment185
-rw-r--r--graphics/asymptote/gc/doc/README.ews480081
-rw-r--r--graphics/asymptote/gc/doc/README.hp18
-rw-r--r--graphics/asymptote/gc/doc/README.linux127
-rw-r--r--graphics/asymptote/gc/doc/README.macros609
-rw-r--r--graphics/asymptote/gc/doc/README.rs60009
-rw-r--r--graphics/asymptote/gc/doc/README.sgi39
-rw-r--r--graphics/asymptote/gc/doc/README.solaris268
-rw-r--r--graphics/asymptote/gc/doc/README.symbian11
-rw-r--r--graphics/asymptote/gc/doc/README.uts2
-rw-r--r--graphics/asymptote/gc/doc/README.win32215
-rw-r--r--graphics/asymptote/gc/doc/README.win6427
-rw-r--r--graphics/asymptote/gc/doc/debugging.md273
-rw-r--r--graphics/asymptote/gc/doc/doc.am52
-rw-r--r--graphics/asymptote/gc/doc/finalization.md158
-rw-r--r--graphics/asymptote/gc/doc/gc.man155
-rw-r--r--graphics/asymptote/gc/doc/gcdescr.md546
-rw-r--r--graphics/asymptote/gc/doc/gcinterface.md216
-rw-r--r--graphics/asymptote/gc/doc/leak.md160
-rw-r--r--graphics/asymptote/gc/doc/overview.md311
-rw-r--r--graphics/asymptote/gc/doc/porting.md263
-rw-r--r--graphics/asymptote/gc/doc/scale.md173
-rw-r--r--graphics/asymptote/gc/doc/simple_example.md182
-rw-r--r--graphics/asymptote/gc/doc/tree.md182
-rw-r--r--graphics/asymptote/gc/dyn_load.c1575
-rw-r--r--graphics/asymptote/gc/extra/AmigaOS.c544
-rw-r--r--graphics/asymptote/gc/extra/MacOS.c169
-rw-r--r--graphics/asymptote/gc/extra/Mac_files/MacOS_config.h27
-rw-r--r--graphics/asymptote/gc/extra/Mac_files/dataend.c9
-rw-r--r--graphics/asymptote/gc/extra/Mac_files/datastart.c9
-rw-r--r--graphics/asymptote/gc/extra/gc.c93
-rw-r--r--graphics/asymptote/gc/extra/msvc_dbg.c406
-rw-r--r--graphics/asymptote/gc/extra/pcr_interface.c181
-rw-r--r--graphics/asymptote/gc/extra/real_malloc.c39
-rw-r--r--graphics/asymptote/gc/extra/symbian.cpp52
-rw-r--r--graphics/asymptote/gc/extra/symbian/global_end.cpp10
-rw-r--r--graphics/asymptote/gc/extra/symbian/global_start.cpp10
-rw-r--r--graphics/asymptote/gc/extra/symbian/init_global_static_roots.cpp28
-rw-r--r--graphics/asymptote/gc/finalize.c1391
-rw-r--r--graphics/asymptote/gc/fnlz_mlc.c118
-rw-r--r--graphics/asymptote/gc/gc_badalc.cc39
-rw-r--r--graphics/asymptote/gc/gc_badalc.cpp2
-rw-r--r--graphics/asymptote/gc/gc_cpp.cc114
-rw-r--r--graphics/asymptote/gc/gc_cpp.cpp2
-rw-r--r--graphics/asymptote/gc/gc_dlopen.c102
-rw-r--r--graphics/asymptote/gc/gcj_mlc.c266
-rw-r--r--graphics/asymptote/gc/headers.c422
-rw-r--r--graphics/asymptote/gc/ia64_save_regs_in_stack.s11
-rw-r--r--graphics/asymptote/gc/include/config.h.in274
-rw-r--r--graphics/asymptote/gc/include/cord.h378
-rw-r--r--graphics/asymptote/gc/include/cord_pos.h128
-rw-r--r--graphics/asymptote/gc/include/ec.h88
-rw-r--r--graphics/asymptote/gc/include/extra/gc.h2
-rw-r--r--graphics/asymptote/gc/include/extra/gc_cpp.h2
-rw-r--r--graphics/asymptote/gc/include/gc.h2197
-rw-r--r--graphics/asymptote/gc/include/gc_allocator.h355
-rw-r--r--graphics/asymptote/gc/include/gc_backptr.h95
-rw-r--r--graphics/asymptote/gc/include/gc_config_macros.h466
-rw-r--r--graphics/asymptote/gc/include/gc_cpp.h603
-rw-r--r--graphics/asymptote/gc/include/gc_disclaim.h75
-rw-r--r--graphics/asymptote/gc/include/gc_gcj.h111
-rw-r--r--graphics/asymptote/gc/include/gc_inline.h209
-rw-r--r--graphics/asymptote/gc/include/gc_mark.h333
-rw-r--r--graphics/asymptote/gc/include/gc_pthread_redirects.h127
-rw-r--r--graphics/asymptote/gc/include/gc_tiny_fl.h90
-rw-r--r--graphics/asymptote/gc/include/gc_typed.h122
-rw-r--r--graphics/asymptote/gc/include/gc_version.h47
-rw-r--r--graphics/asymptote/gc/include/include.am47
-rw-r--r--graphics/asymptote/gc/include/javaxfc.h65
-rw-r--r--graphics/asymptote/gc/include/leak_detector.h71
-rw-r--r--graphics/asymptote/gc/include/private/darwin_semaphore.h87
-rw-r--r--graphics/asymptote/gc/include/private/darwin_stop_world.h53
-rw-r--r--graphics/asymptote/gc/include/private/dbg_mlc.h193
-rw-r--r--graphics/asymptote/gc/include/private/gc_alloc_ptrs.h60
-rw-r--r--graphics/asymptote/gc/include/private/gc_atomic_ops.h124
-rw-r--r--graphics/asymptote/gc/include/private/gc_hdrs.h215
-rw-r--r--graphics/asymptote/gc/include/private/gc_locks.h281
-rw-r--r--graphics/asymptote/gc/include/private/gc_pmark.h487
-rw-r--r--graphics/asymptote/gc/include/private/gc_priv.h3176
-rw-r--r--graphics/asymptote/gc/include/private/gcconfig.h3422
-rw-r--r--graphics/asymptote/gc/include/private/msvc_dbg.h70
-rw-r--r--graphics/asymptote/gc/include/private/pthread_stop_world.h64
-rw-r--r--graphics/asymptote/gc/include/private/pthread_support.h196
-rw-r--r--graphics/asymptote/gc/include/private/specific.h133
-rw-r--r--graphics/asymptote/gc/include/private/thread_local_alloc.h201
-rwxr-xr-xgraphics/asymptote/gc/install-sh541
-rw-r--r--graphics/asymptote/gc/m4/gc_set_version.m440
-rw-r--r--graphics/asymptote/gc/m4/libtool.m48403
-rw-r--r--graphics/asymptote/gc/m4/ltoptions.m4437
-rw-r--r--graphics/asymptote/gc/m4/ltsugar.m4124
-rw-r--r--graphics/asymptote/gc/m4/ltversion.m424
-rw-r--r--graphics/asymptote/gc/m4/lt~obsolete.m499
-rw-r--r--graphics/asymptote/gc/mach_dep.c429
-rw-r--r--graphics/asymptote/gc/malloc.c727
-rw-r--r--graphics/asymptote/gc/mallocx.c643
-rw-r--r--graphics/asymptote/gc/mark.c1953
-rw-r--r--graphics/asymptote/gc/mark_rts.c961
-rw-r--r--graphics/asymptote/gc/misc.c2710
-rw-r--r--graphics/asymptote/gc/new_hblk.c192
-rw-r--r--graphics/asymptote/gc/obj_map.c90
-rw-r--r--graphics/asymptote/gc/os_dep.c5485
-rw-r--r--graphics/asymptote/gc/pthread_start.c73
-rw-r--r--graphics/asymptote/gc/pthread_stop_world.c1472
-rw-r--r--graphics/asymptote/gc/pthread_support.c2660
-rw-r--r--graphics/asymptote/gc/ptr_chck.c286
-rw-r--r--graphics/asymptote/gc/reclaim.c855
-rw-r--r--graphics/asymptote/gc/sparc_mach_dep.S61
-rw-r--r--graphics/asymptote/gc/sparc_netbsd_mach_dep.s34
-rw-r--r--graphics/asymptote/gc/specific.c187
-rw-r--r--graphics/asymptote/gc/tests/disclaim_bench.c163
-rw-r--r--graphics/asymptote/gc/tests/disclaim_test.c273
-rw-r--r--graphics/asymptote/gc/tests/disclaim_weakmap_test.c464
-rw-r--r--graphics/asymptote/gc/tests/huge_test.c67
-rw-r--r--graphics/asymptote/gc/tests/initsecondarythread.c123
-rw-r--r--graphics/asymptote/gc/tests/leak_test.c40
-rw-r--r--graphics/asymptote/gc/tests/middle.c43
-rw-r--r--graphics/asymptote/gc/tests/realloc_test.c50
-rw-r--r--graphics/asymptote/gc/tests/smash_test.c49
-rw-r--r--graphics/asymptote/gc/tests/staticrootslib.c86
-rw-r--r--graphics/asymptote/gc/tests/staticrootstest.c77
-rw-r--r--graphics/asymptote/gc/tests/subthread_create.c183
-rw-r--r--graphics/asymptote/gc/tests/test.c2540
-rw-r--r--graphics/asymptote/gc/tests/test_atomic_ops.c98
-rw-r--r--graphics/asymptote/gc/tests/test_cpp.cc425
-rw-r--r--graphics/asymptote/gc/tests/tests.am179
-rw-r--r--graphics/asymptote/gc/tests/thread_leak_test.c113
-rw-r--r--graphics/asymptote/gc/tests/threadkey_test.c119
-rw-r--r--graphics/asymptote/gc/tests/trace_test.c62
-rw-r--r--graphics/asymptote/gc/thread_local_alloc.c310
-rwxr-xr-xgraphics/asymptote/gc/tools/callprocs.sh4
-rw-r--r--graphics/asymptote/gc/tools/if_mach.c32
-rw-r--r--graphics/asymptote/gc/tools/if_not_there.c58
-rw-r--r--graphics/asymptote/gc/tools/setjmp_t.c168
-rw-r--r--graphics/asymptote/gc/tools/threadlibs.c82
-rw-r--r--graphics/asymptote/gc/typd_mlc.c730
-rw-r--r--graphics/asymptote/gc/win32_threads.c3375
-rw-r--r--graphics/asymptote/gen_preprocessed_depfile.py261
-rw-r--r--graphics/asymptote/generate_asy_list_file.py65
-rw-r--r--graphics/asymptote/generate_asy_ver_info.py76
-rw-r--r--[-rwxr-xr-x]graphics/asymptote/generate_enums.py195
-rw-r--r--graphics/asymptote/genv.cc101
-rw-r--r--graphics/asymptote/genv.h10
-rw-r--r--graphics/asymptote/glew.c10
-rw-r--r--graphics/asymptote/glrender.cc174
-rw-r--r--graphics/asymptote/glrender.h54
-rw-r--r--graphics/asymptote/gsl.cc2
-rw-r--r--graphics/asymptote/impdatum.cc3
-rwxr-xr-xgraphics/asymptote/install-sh454
-rw-r--r--graphics/asymptote/interact.cc43
-rw-r--r--graphics/asymptote/interact.h19
-rw-r--r--graphics/asymptote/jsfile.cc102
-rw-r--r--graphics/asymptote/keywords.h (renamed from graphics/asymptote/keywords.cc)4
-rwxr-xr-xgraphics/asymptote/keywords.pl60
-rw-r--r--graphics/asymptote/keywords.py70
-rw-r--r--graphics/asymptote/lex.yy.cc666
-rw-r--r--graphics/asymptote/libatomic_ops/AUTHORS60
-rw-r--r--graphics/asymptote/libatomic_ops/CMakeLists.txt380
-rw-r--r--graphics/asymptote/libatomic_ops/COPYING339
-rw-r--r--graphics/asymptote/libatomic_ops/ChangeLog765
-rw-r--r--graphics/asymptote/libatomic_ops/Config.cmake.in5
-rw-r--r--graphics/asymptote/libatomic_ops/LICENSE76
-rw-r--r--graphics/asymptote/libatomic_ops/Makefile.am29
-rw-r--r--graphics/asymptote/libatomic_ops/README.md130
-rw-r--r--graphics/asymptote/libatomic_ops/README_details.txt254
-rw-r--r--graphics/asymptote/libatomic_ops/README_malloc.txt60
-rw-r--r--graphics/asymptote/libatomic_ops/README_stack.txt78
-rw-r--r--graphics/asymptote/libatomic_ops/README_win32.txt46
-rwxr-xr-xgraphics/asymptote/libatomic_ops/autogen.sh10
-rw-r--r--graphics/asymptote/libatomic_ops/configure.ac261
-rw-r--r--graphics/asymptote/libatomic_ops/pkgconfig/atomic_ops-uninstalled.pc.in10
-rw-r--r--graphics/asymptote/libatomic_ops/pkgconfig/atomic_ops.pc.in10
-rw-r--r--graphics/asymptote/libatomic_ops/src/Makefile.am268
-rw-r--r--graphics/asymptote/libatomic_ops/src/Makefile.msft72
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops.c301
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops.h509
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/ao_version.h38
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-arithm.h3408
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-arithm.template852
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-small.h2640
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-small.template528
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/generalize.h729
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/README7
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_acquire_release_volatile.h30
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_aligned_atomic_load_store.h38
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_load_store.h32
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_only_load.h30
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.h552
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.template92
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/armcc/arm_v6.h264
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/emul_cas.h87
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/aarch64.h282
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/alpha.h67
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/arm.h742
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/avr32.h71
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/cris.h65
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/e2k.h28
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.h864
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.template54
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.h632
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.template158
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic.h247
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/hexagon.h140
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/hppa.h94
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/ia64.h287
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/m68k.h68
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/mips.h205
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/powerpc.h348
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/riscv.h32
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/s390.h92
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/sh.h34
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h88
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/tile.h48
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/x86.h657
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/generic_pthread.h442
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/hpc/hppa.h104
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/hpc/ia64.h153
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ibmc/powerpc.h183
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/icc/ia64.h207
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.h62
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.template62
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.h37
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.template37
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.h35
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.template35
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h62
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_load.h37
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_store.h35
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/double_atomic_load_store.h50
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h62
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_load.h37
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_store.h35
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.h135
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.template27
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.h135
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.template27
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h62
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_load.h37
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_store.h35
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm.h112
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm64.h116
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/common32_defs.h1197
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86.h156
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86_64.h151
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ordered.h33
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ordered_except_wr.h42
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/read_ordered.h37
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h89
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.S5
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.h44
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/x86.h240
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h36
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_char.h51
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops_malloc.c385
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops_malloc.h81
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops_stack.c380
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops_stack.h210
-rw-r--r--graphics/asymptote/libatomic_ops/src/atomic_ops_sysdeps.S9
-rw-r--r--graphics/asymptote/libatomic_ops/tests/Makefile.am148
-rw-r--r--graphics/asymptote/libatomic_ops/tests/list_atomic.template132
-rw-r--r--graphics/asymptote/libatomic_ops/tests/run_parallel.h228
-rw-r--r--graphics/asymptote/libatomic_ops/tests/test_atomic.c267
-rw-r--r--graphics/asymptote/libatomic_ops/tests/test_atomic_include.h5364
-rw-r--r--graphics/asymptote/libatomic_ops/tests/test_atomic_include.template596
-rw-r--r--graphics/asymptote/libatomic_ops/tests/test_malloc.c261
-rw-r--r--graphics/asymptote/libatomic_ops/tests/test_stack.c402
-rw-r--r--graphics/asymptote/locate.cc31
-rw-r--r--graphics/asymptote/lspdec.cc233
-rw-r--r--graphics/asymptote/lspexp.cc148
-rw-r--r--graphics/asymptote/lspfundec.cc108
-rw-r--r--graphics/asymptote/lspserv.cc28
-rw-r--r--graphics/asymptote/lspserv.h11
-rw-r--r--graphics/asymptote/lspstm.cc124
-rw-r--r--graphics/asymptote/ltmain.sh11429
-rw-r--r--graphics/asymptote/main.cc117
-rw-r--r--graphics/asymptote/mathop.h8
-rw-r--r--graphics/asymptote/memory.cc74
-rw-r--r--graphics/asymptote/memory.h30
-rw-r--r--graphics/asymptote/misc/aspy.py (renamed from graphics/asymptote/aspy.py)0
-rw-r--r--graphics/asymptote/misc/format_nongui_py_files4
-rw-r--r--graphics/asymptote/misc/format_nongui_py_files.ps14
-rw-r--r--graphics/asymptote/misc/lint_nongui_py_files7
-rw-r--r--graphics/asymptote/misc/lint_nongui_py_files.ps15
-rw-r--r--graphics/asymptote/misc/print_non_gui_py_files_for_linting.py54
-rw-r--r--graphics/asymptote/misc/profile.py (renamed from graphics/asymptote/profile.py)0
-rw-r--r--graphics/asymptote/misc/testv3d.asy (renamed from graphics/asymptote/testv3d.asy)0
-rwxr-xr-xgraphics/asymptote/missing215
-rw-r--r--graphics/asymptote/mod.h23
-rw-r--r--graphics/asymptote/modifier.h3
-rw-r--r--graphics/asymptote/name.cc16
-rw-r--r--graphics/asymptote/newexp.cc36
-rw-r--r--graphics/asymptote/newexp.h1
-rwxr-xr-xgraphics/asymptote/opsymbols.pl50
-rw-r--r--graphics/asymptote/opsymbols.py63
-rw-r--r--graphics/asymptote/patches/cygwin_freeglut-3.0.0.patch48
-rw-r--r--graphics/asymptote/path3.h8
-rw-r--r--graphics/asymptote/picture.cc292
-rw-r--r--graphics/asymptote/picture.h2
-rw-r--r--graphics/asymptote/pipestream.cc7
-rw-r--r--graphics/asymptote/pipestream.h9
-rw-r--r--graphics/asymptote/pkg-info.cmake16
-rw-r--r--graphics/asymptote/prc/CMakeLists.txt27
-rw-r--r--graphics/asymptote/prc/Makefile42
-rw-r--r--graphics/asymptote/prc/PRCTools/bitData.cc4
-rw-r--r--graphics/asymptote/prc/PRCTools/describePRC.cc14
-rw-r--r--graphics/asymptote/prc/PRCTools/iPRCFile.h10
-rw-r--r--graphics/asymptote/prc/PRCTools/makePRC.cc8
-rw-r--r--graphics/asymptote/prc/PRCbitStream.cc8
-rw-r--r--graphics/asymptote/prc/PRCdouble.cc2
-rw-r--r--graphics/asymptote/prc/include/prc/PRC.h (renamed from graphics/asymptote/prc/PRC.h)236
-rw-r--r--graphics/asymptote/prc/include/prc/PRCbitStream.h (renamed from graphics/asymptote/prc/PRCbitStream.h)2
-rw-r--r--graphics/asymptote/prc/include/prc/PRCdouble.h (renamed from graphics/asymptote/prc/PRCdouble.h)13
-rw-r--r--graphics/asymptote/prc/include/prc/PRCuniversalendianness.h11
-rw-r--r--graphics/asymptote/prc/include/prc/oPRCFile.h (renamed from graphics/asymptote/prc/oPRCFile.h)2
-rw-r--r--graphics/asymptote/prc/include/prc/writePRC.h (renamed from graphics/asymptote/prc/writePRC.h)51
-rw-r--r--graphics/asymptote/prc/oPRCFile.cc30
-rw-r--r--graphics/asymptote/prc/test.cc23
-rw-r--r--graphics/asymptote/prc/writePRC.cc392
-rw-r--r--graphics/asymptote/primitives.h2
-rw-r--r--graphics/asymptote/profiler.h6
-rw-r--r--graphics/asymptote/psfile.cc7
-rw-r--r--graphics/asymptote/quick-start-win32.ps160
-rw-r--r--graphics/asymptote/record.cc2
-rw-r--r--graphics/asymptote/record.h4
-rw-r--r--graphics/asymptote/requirements.lint.txt3
-rw-r--r--graphics/asymptote/revision.cc2
-rw-r--r--graphics/asymptote/rounding.h13
-rw-r--r--graphics/asymptote/runarray.cc498
-rw-r--r--graphics/asymptote/runarray.h4
-rw-r--r--graphics/asymptote/runbacktrace.cc18
-rw-r--r--graphics/asymptote/runbacktrace.h4
-rw-r--r--graphics/asymptote/runfile.cc312
-rw-r--r--graphics/asymptote/runfile.h4
-rw-r--r--graphics/asymptote/runfile.in42
-rw-r--r--graphics/asymptote/runhistory.cc43
-rw-r--r--graphics/asymptote/runhistory.h4
-rw-r--r--graphics/asymptote/runhistory.in13
-rw-r--r--graphics/asymptote/runlabel.cc42
-rw-r--r--graphics/asymptote/runlabel.h4
-rw-r--r--graphics/asymptote/runmath.cc279
-rw-r--r--graphics/asymptote/runmath.h4
-rw-r--r--graphics/asymptote/runmath.in27
-rw-r--r--graphics/asymptote/runpair.cc228
-rw-r--r--graphics/asymptote/runpair.h4
-rw-r--r--graphics/asymptote/runpath.cc294
-rw-r--r--graphics/asymptote/runpath.h4
-rw-r--r--graphics/asymptote/runpath3d.cc270
-rw-r--r--graphics/asymptote/runpath3d.h4
-rw-r--r--graphics/asymptote/runpicture.cc401
-rw-r--r--graphics/asymptote/runpicture.h4
-rw-r--r--graphics/asymptote/runpicture.in7
-rw-r--r--graphics/asymptote/runstring.cc158
-rw-r--r--graphics/asymptote/runstring.h4
-rw-r--r--graphics/asymptote/runstring.in32
-rw-r--r--graphics/asymptote/runsystem.cc145
-rw-r--r--graphics/asymptote/runsystem.h4
-rw-r--r--graphics/asymptote/runsystem.in13
-rw-r--r--graphics/asymptote/runtime.cc931
-rw-r--r--graphics/asymptote/runtime.h4
-rw-r--r--graphics/asymptote/runtime.in38
-rw-r--r--[-rwxr-xr-x]graphics/asymptote/runtime.pl103
-rw-r--r--graphics/asymptote/runtriple.cc174
-rw-r--r--graphics/asymptote/runtriple.h4
-rw-r--r--graphics/asymptote/seconds.h3
-rw-r--r--graphics/asymptote/settings.cc289
-rw-r--r--graphics/asymptote/settings.h10
-rw-r--r--graphics/asymptote/shaders.cc15
-rw-r--r--graphics/asymptote/shaders.h18
-rw-r--r--graphics/asymptote/stack.cc33
-rw-r--r--graphics/asymptote/stack.h2
-rw-r--r--graphics/asymptote/stm.cc105
-rw-r--r--graphics/asymptote/template_rev.cc.in4
-rwxr-xr-xgraphics/asymptote/test-driver153
-rw-r--r--graphics/asymptote/tests/arith/integer.asy10
-rw-r--r--graphics/asymptote/tests/arith/pair.asy10
-rw-r--r--graphics/asymptote/tests/arith/real.asy6
-rw-r--r--graphics/asymptote/tests/imp/imports/A.asy3
-rw-r--r--graphics/asymptote/tests/imp/unravel.asy18
-rw-r--r--graphics/asymptote/tests/io/data1.txt3
-rw-r--r--graphics/asymptote/tests/io/data2.txt5
-rw-r--r--graphics/asymptote/tests/io/data3.txt3
-rw-r--r--graphics/asymptote/tests/io/read.asy71
-rw-r--r--graphics/asymptote/tests/template/imports/Cpass.asy3
-rw-r--r--graphics/asymptote/tests/template/imports/notTemplate.asy1
-rw-r--r--graphics/asymptote/tests/template/imports/structTemplate.asy39
-rw-r--r--graphics/asymptote/tests/template/initTest.asy6
-rw-r--r--graphics/asymptote/tests/template/nestedImport.asy7
-rw-r--r--graphics/asymptote/tests/template/structTest.asy18
-rw-r--r--graphics/asymptote/tests/types/autounravel.asy172
-rw-r--r--graphics/asymptote/tests/types/builtinOps.asy35
-rw-r--r--graphics/asymptote/tests/types/init.asy44
-rw-r--r--graphics/asymptote/tests/types/overrideEquals.asy43
-rw-r--r--graphics/asymptote/texfile.cc3
-rw-r--r--graphics/asymptote/texfile.h7
-rw-r--r--graphics/asymptote/thirdparty_impl/tinyexr_impl/CMakeLists.txt22
-rw-r--r--graphics/asymptote/thirdparty_impl/tinyexr_impl/src/tinyexr_impl.cc21
-rw-r--r--graphics/asymptote/tinyexr.cc34
-rw-r--r--graphics/asymptote/tinyexr/CMakeLists.txt (renamed from graphics/asymptote/cudareflect/tinyexr/CMakeLists.txt)10
-rw-r--r--graphics/asymptote/tinyexr/Makefile33
-rw-r--r--graphics/asymptote/tinyexr/Makefile.gcc-mingw (renamed from graphics/asymptote/cudareflect/tinyexr/Makefile.gcc-mingw)0
-rw-r--r--graphics/asymptote/tinyexr/Makefile.gcc-mingw-msys (renamed from graphics/asymptote/cudareflect/tinyexr/Makefile.gcc-mingw-msys)0
-rw-r--r--graphics/asymptote/tinyexr/Makefile.llvm-mingw (renamed from graphics/asymptote/cudareflect/tinyexr/Makefile.llvm-mingw)0
-rw-r--r--graphics/asymptote/tinyexr/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/README.md)32
-rw-r--r--graphics/asymptote/tinyexr/appveyor.yml (renamed from graphics/asymptote/cudareflect/tinyexr/appveyor.yml)0
-rw-r--r--graphics/asymptote/tinyexr/asakusa.exr (renamed from graphics/asymptote/cudareflect/tinyexr/asakusa.exr)bin1127425 -> 1127425 bytes
-rw-r--r--graphics/asymptote/tinyexr/asakusa.png (renamed from graphics/asymptote/cudareflect/tinyexr/asakusa.png)bin202947 -> 202947 bytes
-rw-r--r--graphics/asymptote/tinyexr/cmake/sanitizers/FindASan.cmake (renamed from graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindASan.cmake)0
-rw-r--r--graphics/asymptote/tinyexr/cmake/sanitizers/FindMSan.cmake (renamed from graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindMSan.cmake)0
-rw-r--r--graphics/asymptote/tinyexr/cmake/sanitizers/FindSanitizers.cmake (renamed from graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindSanitizers.cmake)0
-rw-r--r--graphics/asymptote/tinyexr/cmake/sanitizers/FindTSan.cmake (renamed from graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindTSan.cmake)0
-rw-r--r--graphics/asymptote/tinyexr/cmake/sanitizers/FindUBSan.cmake (renamed from graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindUBSan.cmake)0
-rw-r--r--graphics/asymptote/tinyexr/cmake/sanitizers/asan-wrapper (renamed from graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/asan-wrapper)0
-rw-r--r--graphics/asymptote/tinyexr/cmake/sanitizers/sanitize-helpers.cmake (renamed from graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/sanitize-helpers.cmake)0
-rw-r--r--graphics/asymptote/tinyexr/config-msvc.py (renamed from graphics/asymptote/cudareflect/tinyexr/config-msvc.py)0
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/ChangeLog.md (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/ChangeLog.md)435
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/LICENSE (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/LICENSE)44
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/examples/example1.c (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example1.c)0
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/examples/example2.c (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example2.c)0
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/examples/example3.c (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example3.c)0
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/examples/example4.c (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example4.c)0
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/examples/example5.c (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example5.c)0
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/examples/example6.c (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example6.c)0
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/miniz.c (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/miniz.c)365
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/miniz.h (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/miniz.h)124
-rw-r--r--graphics/asymptote/tinyexr/deps/miniz/readme.md (renamed from graphics/asymptote/cudareflect/tinyexr/deps/miniz/readme.md)14
-rw-r--r--graphics/asymptote/tinyexr/deps/nanozlib/README.md48
-rw-r--r--graphics/asymptote/tinyexr/deps/nanozlib/nanozlib.h471
-rw-r--r--graphics/asymptote/tinyexr/deps/nanozlib/wuffs-v0.3.c22438
-rw-r--r--graphics/asymptote/tinyexr/examples/common/cxxopts.hpp (renamed from graphics/asymptote/cudareflect/tinyexr/examples/common/cxxopts.hpp)0
-rw-r--r--graphics/asymptote/tinyexr/examples/common/stb_image.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/common/stb_image.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/common/stb_image_resize.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/common/stb_image_resize.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/common/stb_image_write.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/common/stb_image_write.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/cube2longlat/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/cube2longlat/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/cube2longlat/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/examples/cube2longlat/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/examples/cube2longlat/cube2longlat.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/cube2longlat/cube2longlat.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/deepview/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/deepview/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/deepview/deepview_screencast.gif (renamed from graphics/asymptote/cudareflect/tinyexr/examples/deepview/deepview_screencast.gif)bin3790199 -> 3790199 bytes
-rw-r--r--graphics/asymptote/tinyexr/examples/deepview/main.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/deepview/main.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/deepview/trackball.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/deepview/trackball.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/deepview/trackball.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/deepview/trackball.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exr2fptiff/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exr2fptiff/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exr2fptiff/exr2fptiff.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/exr2fptiff.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exr2fptiff/tiny_dng_writer.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/tiny_dng_writer.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exr2ldr/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exr2ldr/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exr2ldr/exr2ldr.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exr2ldr/exr2ldr.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exr2rgbe/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exr2rgbe/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exr2rgbe/exr2rgbe.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exr2rgbe/exr2rgbe.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrfilter/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrfilter/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrfilter/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrfilter/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrfilter/exrfilter.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrfilter/exrfilter.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/DroidSans.ttf (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/DroidSans.ttf)bin190044 -> 190044 bytes
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/CommonWindowInterface.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/CommonWindowInterface.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.mm (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.mm)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/OpenGL2Include.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/OpenGL2Include.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/OpenGLInclude.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/OpenGLInclude.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32InternalWindowData.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32InternalWindowData.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.cpp (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.cpp)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32Window.cpp (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32Window.cpp)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32Window.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32Window.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.cpp (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.cpp)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glew.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glew.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glxew.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glxew.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/wglew.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/wglew.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/glew.c (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/glew.c)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/LICENSE (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/LICENSE)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_cocoa.png (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_cocoa.png)bin100007 -> 100007 bytes
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_gtk3.png (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_gtk3.png)bin63193 -> 63193 bytes
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_win8.png (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_win8.png)bin16188 -> 16188 bytes
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/SConstruct (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/SConstruct)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/common.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/common.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/include/nfd.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/include/nfd.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_cocoa.m (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_cocoa.m)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.c (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.c)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_gtk.c (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_gtk.c)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_win.cpp (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_win.cpp)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/SConstruct (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/SConstruct)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialog.c (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialog.c)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialogmultiple.c (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialogmultiple.c)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_savedialog.c (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_savedialog.c)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/exr-io.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/exr-io.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/exr-io.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/exr-io.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/findOpenGLGlewGlut.lua (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/findOpenGLGlewGlut.lua)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/main.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/main.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/nuklear.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/nuklear.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/nuklear_btgui_gl2.h (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/nuklear_btgui_gl2.h)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/premake4.lua (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/premake4.lua)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/screenshots/exrview.png (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/screenshots/exrview.png)bin1044671 -> 1044671 bytes
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/shader.frag (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/shader.frag)0
-rw-r--r--graphics/asymptote/tinyexr/examples/exrview/shader.vert (renamed from graphics/asymptote/cudareflect/tinyexr/examples/exrview/shader.vert)0
-rw-r--r--graphics/asymptote/tinyexr/examples/ldr2exr/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/ldr2exr/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/ldr2exr/ldr2exr.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/ldr2exr/ldr2exr.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/nornalmap/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/nornalmap/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/examples/nornalmap/main.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/main.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/resize/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/resize/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/resize/resize.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/resize/resize.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/rgbe2exr/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/rgbe2exr/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/rgbe2exr/rgbe2exr.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/rgbe2exr/rgbe2exr.cc)0
-rw-r--r--graphics/asymptote/tinyexr/examples/testmapgen/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/examples/testmapgen/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/examples/testmapgen/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/examples/testmapgen/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/examples/testmapgen/testmapgen.cc (renamed from graphics/asymptote/cudareflect/tinyexr/examples/testmapgen/testmapgen.cc)0
-rw-r--r--graphics/asymptote/tinyexr/experimental/js/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/experimental/js/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/experimental/js/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/experimental/js/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/experimental/js/binding.cc (renamed from graphics/asymptote/cudareflect/tinyexr/experimental/js/binding.cc)0
-rwxr-xr-xgraphics/asymptote/tinyexr/experimental/js/compile_to_js.sh12
-rw-r--r--graphics/asymptote/tinyexr/experimental/js/index.html (renamed from graphics/asymptote/cudareflect/tinyexr/experimental/js/index.html)0
-rw-r--r--graphics/asymptote/tinyexr/experimental/js/test.js17
-rw-r--r--graphics/asymptote/tinyexr/experimental/js/tinyexr.js1
-rw-r--r--graphics/asymptote/tinyexr/jni/Android.mk (renamed from graphics/asymptote/cudareflect/tinyexr/jni/Android.mk)0
-rw-r--r--graphics/asymptote/tinyexr/jni/Application.mk (renamed from graphics/asymptote/cudareflect/tinyexr/jni/Application.mk)0
-rw-r--r--graphics/asymptote/tinyexr/jni/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/jni/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/jni/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/jni/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/kuroga.py (renamed from graphics/asymptote/cudareflect/tinyexr/kuroga.py)0
-rw-r--r--graphics/asymptote/tinyexr/premake4.lua (renamed from graphics/asymptote/cudareflect/tinyexr/premake4.lua)0
-rw-r--r--graphics/asymptote/tinyexr/test/CMakeLists.txt (renamed from graphics/asymptote/cudareflect/tinyexr/test/CMakeLists.txt)0
-rw-r--r--graphics/asymptote/tinyexr/test/c-binding/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/test/c-binding/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/test/c-binding/test.c (renamed from graphics/asymptote/cudareflect/tinyexr/test/c-binding/test.c)0
-rw-r--r--graphics/asymptote/tinyexr/test/exrcat/exrcat.cpp (renamed from graphics/asymptote/cudareflect/tinyexr/test/exrcat/exrcat.cpp)0
-rw-r--r--graphics/asymptote/tinyexr/test/exrwrite/exrwritetest.cpp (renamed from graphics/asymptote/cudareflect/tinyexr/test/exrwrite/exrwritetest.cpp)0
-rw-r--r--graphics/asymptote/tinyexr/test/fuzzer/Makefile14
-rw-r--r--graphics/asymptote/tinyexr/test/fuzzer/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/test/fuzzer/README.md)5
-rw-r--r--graphics/asymptote/tinyexr/test/fuzzer/fuzz.cc (renamed from graphics/asymptote/cudareflect/tinyexr/test/fuzzer/fuzz.cc)0
-rw-r--r--graphics/asymptote/tinyexr/test/fuzzer/issue-167-heap-buffer-overflowbin0 -> 20811 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/fuzzer/issue-62-tinyexr_memcpy_heap-buffer-overflow (renamed from graphics/asymptote/cudareflect/tinyexr/test/fuzzer/issue-62-tinyexr_memcpy_heap-buffer-overflow)bin64 -> 64 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/fuzzer/issue-63-tinyexr_signed-integer-overflow (renamed from graphics/asymptote/cudareflect/tinyexr/test/fuzzer/issue-63-tinyexr_signed-integer-overflow)bin503 -> 503 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/fuzzer/issue-77-heap-buffer-overflow (renamed from graphics/asymptote/cudareflect/tinyexr/test/fuzzer/issue-77-heap-buffer-overflow)bin20829 -> 20829 bytes
-rwxr-xr-xgraphics/asymptote/tinyexr/test/fuzzer/issue176-heap-buffer-overflowbin0 -> 952 bytes
-rwxr-xr-xgraphics/asymptote/tinyexr/test/fuzzer/issue177-heap-buffer-overflowbin0 -> 1892 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/issues/160/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/test/issues/160/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/test/issues/160/main.py (renamed from graphics/asymptote/cudareflect/tinyexr/test/issues/160/main.py)0
-rw-r--r--graphics/asymptote/tinyexr/test/issues/160/requirements.txt (renamed from graphics/asymptote/cudareflect/tinyexr/test/issues/160/requirements.txt)0
-rw-r--r--graphics/asymptote/tinyexr/test/unit/Makefile (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/Makefile)0
-rw-r--r--graphics/asymptote/tinyexr/test/unit/README.md (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/README.md)0
-rw-r--r--graphics/asymptote/tinyexr/test/unit/catch.hpp (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/catch.hpp)0
-rw-r--r--graphics/asymptote/tinyexr/test/unit/config-msvc.py (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/config-msvc.py)0
-rw-r--r--graphics/asymptote/tinyexr/test/unit/config-posix.py (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/config-posix.py)0
-rwxr-xr-xgraphics/asymptote/tinyexr/test/unit/kuroga.py (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/kuroga.py)0
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/000-issue194.exrbin0 -> 210425 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/2by2.exr (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/2by2.exr)bin395 -> 395 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/flaga.exr (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/flaga.exr)bin4731 -> 4731 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/issue-160-piz-decode.exr (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/issue-160-piz-decode.exr)bin155069 -> 155069 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/piz-bug-issue-100.exr (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/piz-bug-issue-100.exr)bin327 -> 327 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-1383755b301e5f505b2198dc0508918b537fdf48bbfc6deeffe268822e6f6cd6 (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-1383755b301e5f505b2198dc0508918b537fdf48bbfc6deeffe268822e6f6cd6)bin473703 -> 473703 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-24322747c47e87a10e4407528b779a1a763a48135384909b3d1010bbba1d4c28_min (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-24322747c47e87a10e4407528b779a1a763a48135384909b3d1010bbba1d4c28_min)bin630 -> 630 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-255456016cca60ddb5c5ed6898182e13739bf687b17d1411e97bb60ad95e7a84_min (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-255456016cca60ddb5c5ed6898182e13739bf687b17d1411e97bb60ad95e7a84_min)bin832 -> 832 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-360c3b0555cb979ca108f2d178cf8a80959cfeabaa4ec1d310d062fa653a8c6b_min (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-360c3b0555cb979ca108f2d178cf8a80959cfeabaa4ec1d310d062fa653a8c6b_min)bin4738 -> 4738 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-3f1f642c3356fd8e8d2a0787613ec09a56572b3a1e38c9629b6db9e8dead1117_min (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-3f1f642c3356fd8e8d2a0787613ec09a56572b3a1e38c9629b6db9e8dead1117_min)bin4471 -> 4471 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-5ace655ef080932dcc7e4abc9eab1d4f82c845453464993dfa3eb6c5822a1621 (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-5ace655ef080932dcc7e4abc9eab1d4f82c845453464993dfa3eb6c5822a1621)bin298 -> 298 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-5b66774a7498c635334ad386be0c3b359951738ac47f14878a3346d1c6ea0fe5_min (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-5b66774a7498c635334ad386be0c3b359951738ac47f14878a3346d1c6ea0fe5_min)bin678 -> 678 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-d5c9c893e559277a3320c196523095b94db93985620ac338d037487e0e613047_min (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-d5c9c893e559277a3320c196523095b94db93985620ac338d037487e0e613047_min)bin132 -> 132 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-df76d1f27adb8927a1446a603028272140905c168a336128465a1162ec7af270.mini (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-df76d1f27adb8927a1446a603028272140905c168a336128465a1162ec7af270.mini)bin15 -> 15 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-e7fa6404daa861369d2172fe68e08f9d38c0989f57da7bcfb510bab67e19ca9f (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-e7fa6404daa861369d2172fe68e08f9d38c0989f57da7bcfb510bab67e19ca9f)bin473695 -> 473695 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-eedff3a9e99eb1c0fd3a3b0989e7c44c0a69f04f10b23e5264f362a4773f4397_min (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-eedff3a9e99eb1c0fd3a3b0989e7c44c0a69f04f10b23e5264f362a4773f4397_min)bin793 -> 793 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/poc-efe9007bfdcbbe8a1569bf01fa9acadb8261ead49cb83f6e91fcdc4dae2e99a3_min (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-efe9007bfdcbbe8a1569bf01fa9acadb8261ead49cb83f6e91fcdc4dae2e99a3_min)bin15 -> 15 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/regression/tiled_half_1x1_alpha.exr (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/regression/tiled_half_1x1_alpha.exr)bin335 -> 335 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/tester.cc (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/tester.cc)39
-rw-r--r--graphics/asymptote/tinyexr/test/unit/vcbuild.bat (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/vcbuild.bat)0
-rw-r--r--graphics/asymptote/tinyexr/test/unit/win32-filelist-utf16le.inc (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/win32-filelist-utf16le.inc)bin50 -> 50 bytes
-rw-r--r--graphics/asymptote/tinyexr/test/unit/win32-filelist-utf8.inc (renamed from graphics/asymptote/cudareflect/tinyexr/test/unit/win32-filelist-utf8.inc)0
-rw-r--r--graphics/asymptote/tinyexr/test_tinyexr.cc (renamed from graphics/asymptote/cudareflect/tinyexr/test_tinyexr.cc)7
-rw-r--r--graphics/asymptote/tinyexr/tinyexr.cc (renamed from graphics/asymptote/cudareflect/tinyexr/tinyexr.cc)0
-rw-r--r--graphics/asymptote/tinyexr/tinyexr.h (renamed from graphics/asymptote/cudareflect/tinyexr/tinyexr.h)1731
-rw-r--r--graphics/asymptote/tinyexr/transparent.exrbin0 -> 13220052 bytes
-rw-r--r--graphics/asymptote/tinyexr/vcbuild.bat (renamed from graphics/asymptote/cudareflect/tinyexr/vcbuild.bat)0
-rw-r--r--graphics/asymptote/tinyexr/vcsetup2019.bat (renamed from graphics/asymptote/cudareflect/tinyexr/vcsetup2019.bat)0
-rw-r--r--graphics/asymptote/tr.h4
-rw-r--r--graphics/asymptote/types.cc33
-rw-r--r--graphics/asymptote/types.h4
-rw-r--r--graphics/asymptote/util.cc242
-rw-r--r--graphics/asymptote/util.h12
-rw-r--r--graphics/asymptote/v3dfile.cc15
-rw-r--r--graphics/asymptote/v3dfile.h6
-rw-r--r--graphics/asymptote/v3dheadertypes.h40
-rw-r--r--graphics/asymptote/v3dheadertypes.py64
-rw-r--r--graphics/asymptote/v3dtypes.h27
-rw-r--r--graphics/asymptote/v3dtypes.py32
-rw-r--r--graphics/asymptote/vcpkg.json74
-rw-r--r--graphics/asymptote/version.texi.in3
-rw-r--r--graphics/asymptote/versionTemplate.asy.in3
-rw-r--r--graphics/asymptote/webgl/gl.js98
-rw-r--r--graphics/asymptote/webgl/license2
-rw-r--r--graphics/asymptote/win32helpers.cc240
-rw-r--r--graphics/asymptote/win32helpers.h92
-rw-r--r--graphics/asymptote/win32pipestream.cc320
-rw-r--r--graphics/asymptote/win32pipestream.h94
-rw-r--r--graphics/asymptote/win32xdr.cc95
-rw-r--r--graphics/asymptote/win32xdr.h175
-rw-r--r--graphics/asymptote/windows/AsymptoteInstallInfo.nsi.in1
-rw-r--r--[-rwxr-xr-x]graphics/asymptote/windows/EnvVarUpdate.nsh (renamed from graphics/asymptote/EnvVarUpdate.nsh)654
-rw-r--r--graphics/asymptote/windows/asy.ico (renamed from graphics/asymptote/asy.ico)bin4286 -> 4286 bytes
-rw-r--r--graphics/asymptote/windows/asy.rc (renamed from graphics/asymptote/asy.rc)0
-rw-r--r--graphics/asymptote/windows/asymptote.nsi (renamed from graphics/asymptote/asymptote.nsi)0
-rw-r--r--graphics/asymptote/windows/build-asy-installer.ps1.in11
-rw-r--r--graphics/asymptote/windows/build-asymptote-installer.py116
-rw-r--r--graphics/asymptote/windows/lnkX64IconFix.nsh (renamed from graphics/asymptote/lnkX64IconFix.nsh)148
-rw-r--r--graphics/asymptote/windows/texindex-wsl.cmd2
-rw-r--r--graphics/asymptote/xdrcommon.h82
-rw-r--r--graphics/asymptote/xstream.cc372
-rw-r--r--graphics/asymptote/xstream.h398
-rw-r--r--graphics/asypictureb/README4
-rw-r--r--graphics/asypictureb/asypictureB.dtx373
-rw-r--r--graphics/asypictureb/asypictureB.ins27
-rw-r--r--graphics/asypictureb/asypictureB.pdfbin637107 -> 786980 bytes
-rw-r--r--graphics/asypictureb/asypictureB.sty338
-rw-r--r--graphics/bookshelf/LICENSE416
-rw-r--r--graphics/bookshelf/MANIFEST7
-rw-r--r--graphics/bookshelf/Makefile37
-rw-r--r--graphics/bookshelf/README.md207
-rw-r--r--graphics/bookshelf/VERSION1
-rw-r--r--graphics/bookshelf/bookshelf-svgnam.tex313
-rw-r--r--graphics/bookshelf/bookshelf.bst55
-rw-r--r--graphics/bookshelf/bookshelf.dtx1527
-rw-r--r--graphics/bookshelf/bookshelf.ins50
-rw-r--r--graphics/bookshelf/bookshelf.pdfbin1096333 -> 0 bytes
-rw-r--r--graphics/bookshelf/doc/Makefile75
-rw-r--r--graphics/bookshelf/doc/allfonts20194
-rw-r--r--graphics/bookshelf/doc/bookshelf-listallfonts.1119
-rw-r--r--graphics/bookshelf/doc/bookshelf-listallfonts.pdfbin0 -> 138894 bytes
-rw-r--r--graphics/bookshelf/doc/bookshelf-mkfontsel.190
-rw-r--r--graphics/bookshelf/doc/bookshelf-mkfontsel.pdfbin0 -> 115911 bytes
-rw-r--r--graphics/bookshelf/doc/bookshelf.bib36
-rw-r--r--graphics/bookshelf/doc/bookshelf.pdfbin0 -> 2405312 bytes
-rw-r--r--graphics/bookshelf/doc/excluded_patterns56
-rw-r--r--graphics/bookshelf/doc/features8
-rw-r--r--graphics/bookshelf/doc/sample.bib8108
-rw-r--r--graphics/bookshelf/doc/spines.pdfbin0 -> 8090673 bytes
-rw-r--r--graphics/bookshelf/doc/spines.tex12
-rw-r--r--graphics/bookshelf/myshelf.jpgbin861987 -> 0 bytes
-rw-r--r--graphics/bookshelf/scripts/Makefile1
-rwxr-xr-xgraphics/bookshelf/scripts/bookshelf-listallfonts271
-rwxr-xr-xgraphics/bookshelf/scripts/bookshelf-mkfontsel92
-rwxr-xr-xgraphics/bookshelf/svgnam.sh36
-rw-r--r--graphics/callouts-box/LICENCE415
-rw-r--r--graphics/callouts-box/README.md169
-rw-r--r--graphics/callouts-box/callouts-box.dtx249
-rw-r--r--graphics/callouts-box/callouts-box.ins25
-rw-r--r--graphics/callouts-box/callouts-box.pdfbin0 -> 151490 bytes
-rw-r--r--graphics/circuit_macros/CHANGES38
-rw-r--r--graphics/circuit_macros/Copying2
-rw-r--r--graphics/circuit_macros/README9
-rw-r--r--graphics/circuit_macros/darrow.m42
-rw-r--r--graphics/circuit_macros/doc/Circuit_macros.pdfbin1135017 -> 1142252 bytes
-rw-r--r--graphics/circuit_macros/doc/JackMan.m476
-rw-r--r--graphics/circuit_macros/doc/Version.tex2
-rw-r--r--graphics/circuit_macros/doc/arrowex.m412
-rw-r--r--graphics/circuit_macros/doc/body.tex92
-rw-r--r--graphics/circuit_macros/doc/defines.tex78
-rw-r--r--graphics/circuit_macros/dpictools.pic16
-rw-r--r--graphics/circuit_macros/examples/Capacitors.m42
-rw-r--r--graphics/circuit_macros/examples/Fuses.m49
-rw-r--r--graphics/circuit_macros/examples/Jack.m474
-rw-r--r--graphics/circuit_macros/examples/LT3724.m489
-rw-r--r--graphics/circuit_macros/examples/Loglog.m459
-rw-r--r--graphics/circuit_macros/examples/Makefile16
-rw-r--r--graphics/circuit_macros/examples/OneLine.m4 (renamed from graphics/circuit_macros/examples/extras/OneLine.m4)0
-rw-r--r--graphics/circuit_macros/examples/Shapedefs.m4226
-rw-r--r--graphics/circuit_macros/examples/UNO.m412
-rw-r--r--graphics/circuit_macros/examples/cbresistor.m42
-rw-r--r--graphics/circuit_macros/examples/diamond.m454
-rw-r--r--graphics/circuit_macros/examples/dpv/AlogixDPV.m42
-rw-r--r--graphics/circuit_macros/examples/dpv/CsourceDPV.m41
-rw-r--r--graphics/circuit_macros/examples/dpv/JackDPV.m4105
-rw-r--r--graphics/circuit_macros/examples/dpv/LT3724DPV.m488
-rw-r--r--graphics/circuit_macros/examples/dpv/LT3757DPV.m4274
-rw-r--r--graphics/circuit_macros/examples/dpv/Makefile3
-rw-r--r--graphics/circuit_macros/examples/dpv/SwitchesDPV.m42
-rw-r--r--graphics/circuit_macros/examples/dpv/UNODPV.m412
-rw-r--r--graphics/circuit_macros/examples/dpv/diamondDPV.m460
-rw-r--r--graphics/circuit_macros/examples/dpv/examplesDPV.htmx8
-rw-r--r--graphics/circuit_macros/examples/dpv/examplesDPVs.htmx3
-rw-r--r--graphics/circuit_macros/examples/dpv/icsDPV.m4125
-rw-r--r--graphics/circuit_macros/examples/dpv/shapesDPV.m4154
-rw-r--r--graphics/circuit_macros/examples/ex02.tex1573
-rw-r--r--graphics/circuit_macros/examples/ex06.m455
-rw-r--r--graphics/circuit_macros/examples/examples.pdfbin1936421 -> 1914597 bytes
-rw-r--r--graphics/circuit_macros/examples/examples.tex27
-rw-r--r--graphics/circuit_macros/examples/extras/Chuck.m42
-rw-r--r--graphics/circuit_macros/examples/extras/HSVS.m4 (renamed from graphics/circuit_macros/examples/extras/Shadow.m4)0
-rw-r--r--graphics/circuit_macros/examples/extras/OpAmpFilter.m41
-rw-r--r--graphics/circuit_macros/examples/extras/Planes.m4335
-rw-r--r--graphics/circuit_macros/examples/extras/README_extras2
-rw-r--r--graphics/circuit_macros/examples/extras/ex02.m4 (renamed from graphics/circuit_macros/examples/ex02.m4)0
-rw-r--r--graphics/circuit_macros/examples/files.tex59
-rw-r--r--graphics/circuit_macros/examples/ics.m492
-rw-r--r--graphics/circuit_macros/examples/mf/cct.mf2
-rw-r--r--graphics/circuit_macros/examples/shapes.m4156
-rw-r--r--graphics/circuit_macros/examples/xfig/xfiglib.fig2
-rw-r--r--graphics/circuit_macros/gpic.m42
-rw-r--r--graphics/circuit_macros/lib3D.m42
-rw-r--r--graphics/circuit_macros/libSLD.m42
-rw-r--r--graphics/circuit_macros/libcct.m4139
-rw-r--r--graphics/circuit_macros/libgen.m4155
-rw-r--r--graphics/circuit_macros/liblog.m430
-rw-r--r--graphics/circuit_macros/mfpic.m42
-rw-r--r--graphics/circuit_macros/mpost.m42
-rw-r--r--graphics/circuit_macros/pdf.m42
-rw-r--r--graphics/circuit_macros/pgf.m42
-rw-r--r--graphics/circuit_macros/postscript.m42
-rw-r--r--graphics/circuit_macros/psfrag.m42
-rw-r--r--graphics/circuit_macros/pstricks.m42
-rw-r--r--graphics/circuit_macros/svg.m45
-rw-r--r--graphics/circuit_macros/xfig.m42
-rw-r--r--graphics/mahjong/Makefile115
-rw-r--r--graphics/mahjong/mahjong-code.pdfbin611151 -> 617767 bytes
-rw-r--r--graphics/mahjong/mahjong.dtx126
-rw-r--r--graphics/mahjong/mahjong.pdfbin511487 -> 513171 bytes
-rw-r--r--graphics/mcf2graph/CHANGELOG79
-rw-r--r--graphics/mcf2graph/README46
-rw-r--r--graphics/mcf2graph/main_lib.mcf2123
-rw-r--r--graphics/mcf2graph/mcf2graph.mp1327
-rw-r--r--graphics/mcf2graph/mcf_exa_soc.mp20
-rw-r--r--graphics/mcf2graph/mcf_example.pdfbin713698 -> 1132791 bytes
-rw-r--r--graphics/mcf2graph/mcf_example.tex181
-rw-r--r--graphics/mcf2graph/mcf_manual.pdfbin319715 -> 446440 bytes
-rw-r--r--graphics/mcf2graph/mcf_manual.tex1078
-rw-r--r--graphics/mcf2graph/mcf_to_graph.cmd53
-rw-r--r--graphics/mcf2graph/template_lib.mcf31
-rw-r--r--graphics/mcf2graph/template_soc.mp21
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/LICENSE11
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/README.md73
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/K001-1.dat441
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/K001-2.dat1208
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude-1.pdfbin0 -> 31597 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude.1350
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude.mp98
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1-1.pdfbin0 -> 26625 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1-1.pngbin0 -> 34214 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1.mp37
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2-1.pdfbin0 -> 18225 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2-1.pngbin0 -> 40094 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2.mp34
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-001.pdfbin0 -> 1937 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-1.pdfbin0 -> 1986 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-2.pdfbin0 -> 1892 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3.00176
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3.mp58
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/inter-1.pdfbin0 -> 1691 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/inter.mp22
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-1.pdfbin0 -> 2430 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-2.pdfbin0 -> 2131 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-3.pdfbin0 -> 19759 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-4.pdfbin0 -> 9772 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse.mp105
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/hyper-1.pdfbin0 -> 28292 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/hyper.mp41
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/construction/ogiveentiers-1.pdfbin0 -> 5732 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/construction/ogiveentiers.mp126
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp01-1.pdfbin0 -> 31695 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp01.mp38
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp02-1.pdfbin0 -> 31309 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp02.mp35
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp03-1.pdfbin0 -> 25836 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp03.mp21
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp04-1.pdfbin0 -> 29400 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp04.mp37
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp05-1.pdfbin0 -> 38450 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp05.mp37
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp06-1.pdfbin0 -> 31058 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp06.mp31
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp07-1.pdfbin0 -> 22960 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp07.mp26
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp08-1.pdfbin0 -> 23943 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp08.mp38
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-1.dat441
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-1.pdfbin0 -> 37919 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-2.dat1208
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001.mp71
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/brach-1.pdfbin0 -> 19537 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/brach.mp54
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/divers-1.pdfbin0 -> 1738 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/divers.mp14
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/epicycloide-const-1.pdfbin0 -> 32087 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/epicycloide-const.mp66
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/pascalline-1.pdfbin0 -> 2952 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/pascalline.mp28
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point-0.pdfbin0 -> 4907 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point.0446
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point.mp25
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/polygone-1.pdfbin0 -> 1863 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/polygone.mp20
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/vecteurs-1.pdfbin0 -> 1411 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/vecteurs.mp14
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/cos-1.pdfbin0 -> 12489 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/cos.mp10
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction1-1.pdfbin0 -> 37607 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction1.mp25
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction2-1.pdfbin0 -> 40524 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction2.mp53
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol01-1.pdfbin0 -> 29506 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol01.mp40
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol02-1.pdfbin0 -> 42776 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol02.mp52
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol03-1.pdfbin0 -> 154913 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol03.mp33
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol04-1.pdfbin0 -> 23279 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol04.mp44
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol05-1.pdfbin0 -> 27696 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol05.mp57
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol06-1.pdfbin0 -> 22415 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol06.mp42
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol07-1.pdfbin0 -> 28245 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol07.mp29
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/mptextmp.mp1
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/mpxerr.tex14
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes1-1.pdfbin0 -> 11287 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes1.mp49
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes2-1.pdfbin0 -> 19276 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes2.mp69
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette-1.pdfbin0 -> 26385 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette.12343
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette.mp168
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/homothetie-1.pdfbin0 -> 2073 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/homothetie.mp36
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/inversion-1.pdfbin0 -> 11418 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/inversion.mp40
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrie-1.pdfbin0 -> 3952 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrie.mp26
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrieCentrale-1.pdfbin0 -> 4076 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrieCentrale.mp27
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/apollonius-1.pdfbin0 -> 12167 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/apollonius.mp90
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/pedale-1.pdfbin0 -> 23243 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/pedale.mp106
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/triangles-1.pdfbin0 -> 10977 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/triangles.mp27
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/vecteur/vecteur-1.pdfbin0 -> 1382 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/vecteur/vecteur.mp10
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/figure.pdfbin0 -> 18375 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/fond.pdfbin0 -> 1309 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/locctan.bib78
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/mp-geom2d-doc.pdfbin0 -> 677572 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/mp-geom2d-doc.tex3491
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/doc/solution0.dat101
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-arc.mp56
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-c2d.mp300
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-fct.mp22
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-lbl.mp84
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-main.mp1071
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-plt.mp97
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-rep.mp136
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-svgnames.mp152
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-tra.mp44
-rw-r--r--graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d.mp14
-rw-r--r--graphics/metapost/contrib/macros/mp-neuralnetwork/LICENSE11
-rw-r--r--graphics/metapost/contrib/macros/mp-neuralnetwork/README.md16
-rw-r--r--graphics/metapost/contrib/macros/mp-neuralnetwork/doc/ctan.bib56
-rw-r--r--graphics/metapost/contrib/macros/mp-neuralnetwork/doc/fond.pdfbin0 -> 1309 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-doc-en.pdfbin0 -> 183247 bytes
-rw-r--r--graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-doc-en.tex520
-rw-r--r--graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-preamble.tex188
-rw-r--r--graphics/metapost/contrib/macros/mp-neuralnetwork/metapost/mp-neuralnetwork-metaobj-patch.mp74
-rw-r--r--graphics/metapost/contrib/macros/mp-neuralnetwork/metapost/mp-neuralnetwork.mp361
-rw-r--r--graphics/metapost/contrib/macros/mpchess/README.md2
-rw-r--r--graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-en.pdfbin1000703 -> 1536892 bytes
-rw-r--r--graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-en.tex112
-rw-r--r--graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.pdfbin1005336 -> 1543044 bytes
-rw-r--r--graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.tex110
-rw-r--r--graphics/metapost/contrib/macros/mpchess/doc/mpchess-preamble.tex2
-rw-r--r--graphics/metapost/contrib/macros/mpchess/metapost/mpchess.mp122
-rw-r--r--graphics/pgf/contrib/aiplans/Aiplans-Introduction.pdfbin0 -> 505453 bytes
-rw-r--r--graphics/pgf/contrib/aiplans/LICENSE.txt415
-rw-r--r--graphics/pgf/contrib/aiplans/README.md80
-rw-r--r--graphics/pgf/contrib/aiplans/README.pdfbin0 -> 67103 bytes
-rw-r--r--graphics/pgf/contrib/aiplans/tikzlibraryaiplans.code.tex121
-rw-r--r--graphics/pgf/contrib/argumentation/README.md2
-rw-r--r--graphics/pgf/contrib/argumentation/argumentation-doc.pdfbin307239 -> 570323 bytes
-rw-r--r--graphics/pgf/contrib/argumentation/argumentation-doc.tex1457
-rw-r--r--graphics/pgf/contrib/argumentation/argumentation.sty705
-rw-r--r--graphics/pgf/contrib/atableau/LICENSE417
-rw-r--r--graphics/pgf/contrib/atableau/README.md44
-rw-r--r--graphics/pgf/contrib/atableau/atableau.ini13
-rw-r--r--graphics/pgf/contrib/atableau/atableau.pdfbin0 -> 846663 bytes
-rw-r--r--graphics/pgf/contrib/atableau/atableau.sty3394
-rw-r--r--graphics/pgf/contrib/atableau/atableau.tex4441
-rw-r--r--graphics/pgf/contrib/circuitikz/README.md8
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/changelog.tex72
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdfbin13867 -> 13873 bytes
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/circuitikz-context.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdfbin2431321 -> 2482881 bytes
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex429
-rw-r--r--graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4-body.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6-body.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7-body.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3-body.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3-body.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6-body.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0-body.tex112
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2-body.tex112
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7-body.tex112
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6-body.tex112
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6.sty8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/circuitikz.sty12
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex262
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex220
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcirclabel.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircmonopoles.tex59
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircmultipoles.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex14
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircquadpoles.tex355
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircshapes.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircutils.tex8
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex22
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.0.tex112
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.1.2.tex112
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.2.7.tex112
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.4.6.tex112
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex12
-rw-r--r--graphics/pgf/contrib/dynkin-diagrams/README4
-rw-r--r--graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.pdfbin908783 -> 909020 bytes
-rw-r--r--graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.sty27
-rw-r--r--graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.tex13
-rw-r--r--graphics/pgf/contrib/euclidean-lattice/README.md8
-rw-r--r--graphics/pgf/contrib/euclidean-lattice/euclidean-lattice-doc.pdfbin0 -> 263747 bytes
-rw-r--r--graphics/pgf/contrib/euclidean-lattice/euclidean-lattice.dtx695
-rw-r--r--graphics/pgf/contrib/euclidean-lattice/euclidean-lattice.ins23
-rw-r--r--graphics/pgf/contrib/fancyqr/README.md43
-rw-r--r--graphics/pgf/contrib/fancyqr/fancyqr-doc.pdfbin247479 -> 263629 bytes
-rw-r--r--graphics/pgf/contrib/fancyqr/fancyqr-doc.tex26
-rw-r--r--graphics/pgf/contrib/fancyqr/fancyqr-style-blobs.code6
-rw-r--r--graphics/pgf/contrib/fancyqr/fancyqr-style-dots.code2
-rw-r--r--graphics/pgf/contrib/fancyqr/fancyqr-style-flat.code1
-rw-r--r--graphics/pgf/contrib/fancyqr/fancyqr-style-swift.code2
-rw-r--r--graphics/pgf/contrib/fancyqr/fancyqr.sty136
-rw-r--r--graphics/pgf/contrib/fancyqr/qr-example.tex12
-rw-r--r--graphics/pgf/contrib/fancyqr/qr-minimal.tex12
-rw-r--r--graphics/pgf/contrib/lie-hasse/README4
-rw-r--r--graphics/pgf/contrib/lie-hasse/lie-hasse.pdfbin631928 -> 631841 bytes
-rw-r--r--graphics/pgf/contrib/lie-hasse/lie-hasse.sty84
-rw-r--r--graphics/pgf/contrib/lie-hasse/lie-hasse.tex31
-rw-r--r--graphics/pgf/contrib/luatikz/README.txt9
-rw-r--r--graphics/pgf/contrib/luatikz/example/bezier2.lua11
-rw-r--r--graphics/pgf/contrib/luatikz/example/bezier3a.lua12
-rw-r--r--graphics/pgf/contrib/luatikz/example/bezier3b.lua32
-rw-r--r--graphics/pgf/contrib/luatikz/example/blinea.lua23
-rw-r--r--graphics/pgf/contrib/luatikz/example/circle.lua12
-rw-r--r--graphics/pgf/contrib/luatikz/example/curvea.lua14
-rw-r--r--graphics/pgf/contrib/luatikz/example/curveb.lua16
-rw-r--r--graphics/pgf/contrib/luatikz/example/ellipse.lua14
-rw-r--r--graphics/pgf/contrib/luatikz/example/ellipseArc.lua18
-rw-r--r--graphics/pgf/contrib/luatikz/example/immute1.lua4
-rw-r--r--graphics/pgf/contrib/luatikz/example/immute2.lua6
-rw-r--r--graphics/pgf/contrib/luatikz/example/intro.lua8
-rw-r--r--graphics/pgf/contrib/luatikz/example/linea.lua7
-rw-r--r--graphics/pgf/contrib/luatikz/example/lineb.lua9
-rw-r--r--graphics/pgf/contrib/luatikz/example/linec.lua7
-rw-r--r--graphics/pgf/contrib/luatikz/example/lined.lua15
-rw-r--r--graphics/pgf/contrib/luatikz/example/nodea.lua12
-rw-r--r--graphics/pgf/contrib/luatikz/example/nodeb.lua18
-rw-r--r--graphics/pgf/contrib/luatikz/example/plota.lua14
-rw-r--r--graphics/pgf/contrib/luatikz/example/polylinea.lua11
-rw-r--r--graphics/pgf/contrib/luatikz/example/radon1.lua119
-rw-r--r--graphics/pgf/contrib/luatikz/example/recta.lua21
-rw-r--r--graphics/pgf/contrib/luatikz/example/shadea.lua9
-rw-r--r--graphics/pgf/contrib/luatikz/example/sierpinski.lua41
-rw-r--r--graphics/pgf/contrib/luatikz/example/spiral.lua16
-rw-r--r--graphics/pgf/contrib/luatikz/example/stylea.lua19
-rw-r--r--graphics/pgf/contrib/luatikz/example/superEllipse.lua22
-rw-r--r--graphics/pgf/contrib/luatikz/luatikz.lua1999
-rw-r--r--graphics/pgf/contrib/luatikz/luatikz.pdfbin0 -> 112753 bytes
-rw-r--r--graphics/pgf/contrib/luatikz/luatikz.sty5
-rw-r--r--graphics/pgf/contrib/luatikz/luatikz.tex204
-rw-r--r--graphics/pgf/contrib/maritime/LICENSE21
-rw-r--r--graphics/pgf/contrib/maritime/README.md39
-rw-r--r--graphics/pgf/contrib/maritime/doc/maritime-doc.pdfbin0 -> 45057 bytes
-rw-r--r--graphics/pgf/contrib/maritime/doc/maritime-doc.tex160
-rw-r--r--graphics/pgf/contrib/maritime/tex/maritime.sty671
-rw-r--r--graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.pdfbin504537 -> 1039619 bytes
-rw-r--r--graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.tex41
-rw-r--r--graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty141
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/README54
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DiscY.tex8
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_OtherCont.tex4
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TipsTricks.tex58
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TitleLegend.tex50
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex1
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex28
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_decSep.tex24
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex114
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_libCS.tex16
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex1
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_variations.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_user_compactPT.pdfbin0 -> 22638 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_1.pdfbin0 -> 72614 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_1.tex10
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_2.pdfbin0 -> 81563 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_2.tex10
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_3.pdfbin0 -> 73825 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_3.tex17
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_fonts.pdfbin0 -> 101435 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_fonts.tex105
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex31
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty469
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdfbin7570685 -> 8113922 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex141
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.backcolors.keys.tex57
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex23
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.colorSchemes.info.pdfbin111753 -> 127186 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex11
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex21
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.formatNumbers.tex26
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex20
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/translations/pgfPT.lang.zh.tex269
-rw-r--r--graphics/pgf/contrib/pgfornament-han/README.md12
-rw-r--r--graphics/pgf/contrib/pgfornament-han/beamerthemeHeavenlyClouds.sty26
-rw-r--r--graphics/pgf/contrib/pgfornament-han/beamerthemeTianQing.sty20
-rw-r--r--graphics/pgf/contrib/pgfornament-han/beamerthemeXiaoshan.sty5
-rw-r--r--graphics/pgf/contrib/pgfornament-han/heavenlyclouds-sample.pdfbin224881 -> 0 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.pdfbin1349245 -> 2158775 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.tex130
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/Cloud_types_en.pdfbin0 -> 149685 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/SiO2.jpgbin0 -> 20587 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/hangzhou-arch.jpgbin0 -> 289509 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-beamer-sample.pdfbin0 -> 221073 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-beamer-sample.tex (renamed from graphics/pgf/contrib/pgfornament-han/heavenlyclouds-sample.tex)10
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-poster-sample.pdfbin0 -> 261027 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-poster-sample.tex128
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/sample-refs.bib35
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/tianqing-beamer-sample.pdfbin0 -> 111508 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/tianqing-beamer-sample.tex (renamed from graphics/pgf/contrib/pgfornament-han/tianqing-sample.tex)11
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/tianqing-poster-sample.pdfbin0 -> 126209 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/tianqing-poster-sample.tex131
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-beamer-sample.pdfbin0 -> 54780 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-beamer-sample.tex (renamed from graphics/pgf/contrib/pgfornament-han/xiaoshan-sample.tex)1
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-poster-sample.pdfbin0 -> 375507 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-poster-sample.tex111
-rw-r--r--graphics/pgf/contrib/pgfornament-han/tianqing-sample.pdfbin116465 -> 0 bytes
-rw-r--r--graphics/pgf/contrib/pgfornament-han/xiaoshan-sample.pdfbin39913 -> 0 bytes
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/DEPENDS.txt3
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/README.md39
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc-settings.sty200
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.pdfbin0 -> 150527 bytes
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.tex119
-rw-r--r--graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer.sty37
-rw-r--r--graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.pdfbin743791 -> 778044 bytes
-rw-r--r--graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.tex66
-rw-r--r--graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.pdfbin781013 -> 818213 bytes
-rw-r--r--graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.tex89
-rw-r--r--graphics/pgf/contrib/pixelarttikz/doc/testlist.csv4
-rw-r--r--graphics/pgf/contrib/pixelarttikz/tex/PixelArtTikz.sty316
-rw-r--r--graphics/pgf/contrib/pmdraw/README.md6
-rw-r--r--graphics/pgf/contrib/pmdraw/pmdraw.pdfbin397582 -> 428079 bytes
-rw-r--r--graphics/pgf/contrib/pmdraw/pmdraw.sty1047
-rw-r--r--graphics/pgf/contrib/pmdraw/pmdraw.tex379
-rw-r--r--graphics/pgf/contrib/polyomino/README.md25
-rw-r--r--graphics/pgf/contrib/polyomino/polyomino.pdfbin0 -> 109235 bytes
-rw-r--r--graphics/pgf/contrib/polyomino/polyomino.sty286
-rw-r--r--graphics/pgf/contrib/polyomino/polyomino.tex278
-rw-r--r--graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe71.pdfbin17705 -> 17819 bytes
-rw-r--r--graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe71.tex2
-rw-r--r--graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe72.pdfbin25368 -> 25473 bytes
-rw-r--r--graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe72.tex2
-rw-r--r--graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe73.pdfbin23829 -> 23820 bytes
-rw-r--r--graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe73.tex2
-rw-r--r--graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.pdfbin570243 -> 570343 bytes
-rw-r--r--graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.tex10
-rw-r--r--graphics/pgf/contrib/profsio/tex/ProfSio.sty55
-rw-r--r--graphics/pgf/contrib/prooftrees/README39
-rw-r--r--graphics/pgf/contrib/prooftrees/README.md66
-rw-r--r--graphics/pgf/contrib/prooftrees/manifest.txt54
-rw-r--r--graphics/pgf/contrib/prooftrees/prooftrees.pdfbin911388 -> 1172076 bytes
-rw-r--r--graphics/pgf/contrib/prooftrees/prooftrees.sty73
-rw-r--r--graphics/pgf/contrib/prooftrees/prooftrees.tex346
-rw-r--r--graphics/pgf/contrib/prooftrees/prooftrees_biber.bib9
-rw-r--r--graphics/pgf/contrib/sankey/README2
-rw-r--r--graphics/pgf/contrib/sankey/sankey.dtx1577
-rw-r--r--graphics/pgf/contrib/sankey/sankey.ins8
-rw-r--r--graphics/pgf/contrib/sankey/sankey.pdfbin990719 -> 864728 bytes
-rw-r--r--graphics/pgf/contrib/sunpath/README.md60
-rw-r--r--graphics/pgf/contrib/sunpath/horizontal-coordinate.pdfbin0 -> 10978 bytes
-rw-r--r--graphics/pgf/contrib/sunpath/horizontal-coordinate.tex183
-rw-r--r--graphics/pgf/contrib/sunpath/releasenote.txt2
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.article.pdfbin0 -> 139319 bytes
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.article.tex39
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.docpart.tex447
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.dtx353
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.equidistance.pdfbin0 -> 13336 bytes
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.equidistance.tex36
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.ins62
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.pdfbin0 -> 225108 bytes
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.scrartcl.pdfbin0 -> 130301 bytes
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.scrartcl.tex39
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.spherical.pdfbin0 -> 13314 bytes
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.spherical.tex36
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.tex61
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.track.pdfbin0 -> 15315 bytes
-rw-r--r--graphics/pgf/contrib/sunpath/sunpath.track.tex56
-rw-r--r--graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.pdfbin450025 -> 467295 bytes
-rw-r--r--graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.tex325
-rw-r--r--graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.pdfbin451134 -> 454128 bytes
-rw-r--r--graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.tex26
-rw-r--r--graphics/pgf/contrib/tangramtikz/tex/TangramTikz.sty39
-rw-r--r--graphics/pgf/contrib/tikz-bpmn/README.md10
-rw-r--r--graphics/pgf/contrib/tikz-bpmn/tikz-bpmn-doc.pdfbin0 -> 53303 bytes
-rw-r--r--graphics/pgf/contrib/tikz-bpmn/tikz-bpmn-doc.tex333
-rw-r--r--graphics/pgf/contrib/tikz-bpmn/tikzlibrarybpmn.code.tex1031
-rw-r--r--graphics/pgf/contrib/tikz-decofonts/README.md8
-rw-r--r--graphics/pgf/contrib/tikz-decofonts/doc/tikz-decofonts-doc.pdfbin0 -> 190252 bytes
-rw-r--r--graphics/pgf/contrib/tikz-decofonts/doc/tikz-decofonts-doc.tex469
-rw-r--r--graphics/pgf/contrib/tikz-decofonts/doc/tkzbrushA.pdfbin0 -> 17239 bytes
-rw-r--r--graphics/pgf/contrib/tikz-decofonts/doc/tkzbrushA.tex11
-rw-r--r--graphics/pgf/contrib/tikz-decofonts/tex/tikz-decofonts.sty1008
-rw-r--r--graphics/pgf/contrib/tikz-triminos/README.md6
-rw-r--r--graphics/pgf/contrib/tikz-triminos/doc/tikz-triminos-doc.pdfbin0 -> 166166 bytes
-rw-r--r--graphics/pgf/contrib/tikz-triminos/doc/tikz-triminos-doc.tex368
-rw-r--r--graphics/pgf/contrib/tikz-triminos/tex/tikz-triminos.sty179
-rw-r--r--graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.pdfbin605728 -> 745046 bytes
-rw-r--r--graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.tex159
-rw-r--r--graphics/pgf/contrib/tikz3d-fr/tex/tikz3d-fr.sty259
-rw-r--r--graphics/pgf/contrib/tikzbricks/README.md8
-rw-r--r--graphics/pgf/contrib/tikzbricks/tikzbricks-doc-settings.sty70
-rw-r--r--graphics/pgf/contrib/tikzbricks/tikzbricks-doc.pdfbin245454 -> 246736 bytes
-rw-r--r--graphics/pgf/contrib/tikzbricks/tikzbricks-doc.tex21
-rw-r--r--graphics/pgf/contrib/tikzbricks/tikzbricks.sty115
-rw-r--r--graphics/pgf/contrib/tikzdotncross/README.md8
-rw-r--r--graphics/pgf/contrib/tikzdotncross/doc/tikzdotncross.pdfbin242343 -> 244545 bytes
-rw-r--r--graphics/pgf/contrib/tikzdotncross/doc/tikzdotncross.tex40
-rw-r--r--graphics/pgf/contrib/tikzdotncross/latex/tikzdotncross.sty89
-rw-r--r--graphics/pgf/contrib/tikzducks/README.md8
-rw-r--r--graphics/pgf/contrib/tikzducks/t-tikzducks.mkiv62
-rw-r--r--graphics/pgf/contrib/tikzducks/tikzducks-doc-settings.sty91
-rw-r--r--graphics/pgf/contrib/tikzducks/tikzducks-doc.pdfbin412000 -> 404360 bytes
-rw-r--r--graphics/pgf/contrib/tikzducks/tikzducks-doc.tex180
-rw-r--r--graphics/pgf/contrib/tikzducks/tikzducks-generic.tex1843
-rw-r--r--graphics/pgf/contrib/tikzducks/tikzducks-plain.tex61
-rw-r--r--graphics/pgf/contrib/tikzducks/tikzducks.sty1870
-rw-r--r--graphics/pgf/contrib/tikzducks/tikzlibraryducks.code.tex4
-rw-r--r--graphics/pgf/contrib/tikzlings/DEPENDS.txt4
-rw-r--r--graphics/pgf/contrib/tikzlings/README.md27
-rw-r--r--graphics/pgf/contrib/tikzlings/README.pdfbin0 -> 50623 bytes
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlibrarytikzlings.code.tex6
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-addons.sty395
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-anteaters.sty93
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-apes.sty401
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-bats.sty92
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-bears.sty122
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-bees.sty101
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-bugs.sty130
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-cats.sty100
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-chickens.sty106
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-coatis.sty193
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-doc-settings.sty159
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-doc.pdfbin712813 -> 832243 bytes
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-doc.tex412
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-elephants.sty103
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-hippos.sty123
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-koalas.sty84
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-list.sty4
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-marmots.sty112
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-meerkats.sty340
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-mice.sty72
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-moles.sty110
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-owls.sty52
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-pandas.sty78
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-penguins.sty70
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-pigs.sty112
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-rhinos.sty123
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-sheep.sty117
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-sloths.sty181
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-snowmen.sty101
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-squirrels.sty110
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings-wolves.sty74
-rw-r--r--graphics/pgf/contrib/tikzlings/tikzlings.sty8
-rw-r--r--graphics/pgf/contrib/tikzmarmots/README.md8
-rw-r--r--graphics/pgf/contrib/tikzmarmots/tikzlibrarymarmots.code.tex2
-rw-r--r--graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc-settings.sty71
-rw-r--r--graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.pdfbin208537 -> 213788 bytes
-rw-r--r--graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.tex22
-rw-r--r--graphics/pgf/contrib/tikzmarmots/tikzmarmots-v1.sty2
-rw-r--r--graphics/pgf/contrib/tikzmarmots/tikzmarmots.sty4
-rw-r--r--graphics/pgf/contrib/tikzpingus/README.md8
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-bee.lib.tex64
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-christmas.lib.tex153
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-cloak.lib.tex78
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-devil.lib.tex90
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-doc.pdfbin4982285 -> 5161674 bytes
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-doc.tex425
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-emotions.lib.tex56
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-flags.lib.tex45
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-formal.lib.tex116
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-fun.lib.tex309
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-glasses.lib.tex105
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-hats.lib.tex173
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-horse.lib.tex229
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-magic.lib.tex14
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-medieval.lib.tex205
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-movement.lib.tex75
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-safe.lib.tex30
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-science-fiction.lib.tex190
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-shirts.lib.tex63
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-signs.lib.tex53
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-sport.lib.tex79
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus-technology.lib.tex126
-rw-r--r--graphics/pgf/contrib/tikzpingus/tikzpingus.sty2470
-rw-r--r--graphics/pgf/contrib/tikzquads/README.md3
-rw-r--r--graphics/pgf/contrib/tikzquads/doc/tikzquads.pdfbin500087 -> 499653 bytes
-rw-r--r--graphics/pgf/contrib/tikzquads/doc/tikzquads.tex20
-rw-r--r--graphics/pgf/contrib/tikzquads/latex/tikzquads.sty27
-rw-r--r--graphics/pgf/contrib/timechart/README.md16
-rw-r--r--graphics/pgf/contrib/timechart/timechart-doc.pdfbin0 -> 797483 bytes
-rw-r--r--graphics/pgf/contrib/timechart/timechart.dtx3458
-rw-r--r--graphics/pgf/contrib/timechart/timechart.ins38
-rw-r--r--graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-en.pdfbin746493 -> 1232028 bytes
-rw-r--r--graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-en.tex199
-rw-r--r--graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-fr.pdfbin804095 -> 1414695 bytes
-rw-r--r--graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-fr.tex531
-rw-r--r--graphics/pgf/contrib/tkz-grapheur/tex/tkz-grapheur.sty724
-rw-r--r--graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-en.pdfbin284742 -> 289282 bytes
-rw-r--r--graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-en.tex12
-rw-r--r--graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-fr.pdfbin286185 -> 290612 bytes
-rw-r--r--graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-fr.tex12
-rw-r--r--graphics/pgf/contrib/trivialpursuit/tex/TrivialPursuit.sty857
-rw-r--r--graphics/pgf/contrib/wheelchart/README.md6
-rw-r--r--graphics/pgf/contrib/wheelchart/wheelchart.pdfbin1198147 -> 1198402 bytes
-rw-r--r--graphics/pgf/contrib/wheelchart/wheelchart.sty330
-rw-r--r--graphics/pgf/contrib/wheelchart/wheelchart.tex21
-rw-r--r--graphics/pgf/contrib/wordle/README.md41
-rw-r--r--graphics/pgf/contrib/wordle/doc/wordle-doc-en.pdfbin284036 -> 0 bytes
-rw-r--r--graphics/pgf/contrib/wordle/doc/wordle-doc-en.tex426
-rw-r--r--graphics/pgf/contrib/wordle/doc/wordle-doc-fr.pdfbin279989 -> 0 bytes
-rw-r--r--graphics/pgf/contrib/wordle/doc/wordle-doc-fr.tex422
-rw-r--r--graphics/pgf/contrib/wordle/tex/wordle.sty298
-rw-r--r--graphics/pgf/contrib/wordle/wordle-doc-en.pdfbin0 -> 266174 bytes
-rw-r--r--graphics/pgf/contrib/wordle/wordle-doc-en.tex921
-rw-r--r--graphics/pgf/contrib/wordle/wordle-doc-fr.pdfbin0 -> 264372 bytes
-rw-r--r--graphics/pgf/contrib/wordle/wordle-doc-fr.tex767
-rw-r--r--graphics/pgf/contrib/wordle/wordle.sty670
-rw-r--r--graphics/pstricks/base/Changes3
-rw-r--r--graphics/pstricks/base/doc/pst-news24.pdfbin99744 -> 97784 bytes
-rw-r--r--graphics/pstricks/base/generic/pstricks.tex36
-rw-r--r--graphics/pstricks/contrib/pst-circ/Changes1
-rw-r--r--graphics/pstricks/contrib/pst-circ/doc/pst-circ-doc.pdfbin568373 -> 1034519 bytes
-rw-r--r--graphics/pstricks/contrib/pst-circ/tex/pst-circ.tex31
-rw-r--r--graphics/pstricks/contrib/pst-coil/Changes1
-rw-r--r--graphics/pstricks/contrib/pst-coil/README2
-rw-r--r--graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.bib2
-rw-r--r--graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.pdfbin295379 -> 3748115 bytes
-rw-r--r--graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.tex159
-rw-r--r--graphics/pstricks/contrib/pst-coil/dvips/pst-coil.pro21
-rw-r--r--graphics/pstricks/contrib/pst-coil/latex/pst-coil.sty2
-rw-r--r--graphics/pstricks/contrib/pst-coil/tex/pst-coil.tex63
-rw-r--r--graphics/pstricks/contrib/pst-diffraction/Changes3
-rw-r--r--graphics/pstricks/contrib/pst-diffraction/README27
-rw-r--r--graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.bib157
-rw-r--r--graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.pdfbin22756751 -> 23064303 bytes
-rw-r--r--graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.tex83
-rw-r--r--graphics/pstricks/contrib/pst-diffraction/tex/pst-diffraction.tex23
-rw-r--r--graphics/pstricks/contrib/pst-node/Changes3
-rw-r--r--graphics/pstricks/contrib/pst-node/README2
-rw-r--r--graphics/pstricks/contrib/pst-node/doc/pst-node-doc.pdfbin527479 -> 585632 bytes
-rw-r--r--graphics/pstricks/contrib/pst-node/doc/pst-node-doc.tex26
-rw-r--r--graphics/pstricks/contrib/pst-node/dvips/pst-node.pro6
-rw-r--r--graphics/pstricks/contrib/pst-node/latex/pst-node.sty11
-rw-r--r--graphics/pstricks/contrib/pst-node/tex/pst-node.tex56
-rw-r--r--graphics/pstricks/contrib/pst-optic/Changes1
-rw-r--r--graphics/pstricks/contrib/pst-optic/README5
-rw-r--r--graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.bib1
-rw-r--r--graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.pdfbin518230 -> 531736 bytes
-rw-r--r--graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.tex26
-rw-r--r--graphics/pstricks/contrib/pst-optic/tex/pst-optic.tex113
-rw-r--r--graphics/tpic2pdftex/Makefile.in101
-rw-r--r--graphics/tpic2pdftex/aclocal.m4415
-rwxr-xr-xgraphics/tpic2pdftex/configure.texk335
1778 files changed, 428606 insertions, 48720 deletions
diff --git a/graphics/asymptote/CMakeLists.txt b/graphics/asymptote/CMakeLists.txt
new file mode 100644
index 0000000000..0cee80ae56
--- /dev/null
+++ b/graphics/asymptote/CMakeLists.txt
@@ -0,0 +1,104 @@
+cmake_minimum_required(VERSION 3.27)
+
+include(cmake-scripts/common.cmake)
+include(asy-pkg-version-suffix.cmake OPTIONAL RESULT_VARIABLE ASY_ADDR_VERSION_SUFFIX_FILE)
+include(cmake-scripts/options.cmake)
+include(pkg-info.cmake)
+include(cmake-scripts/vcpkg-features.cmake)
+
+project(${ASY_PACKAGE_NAME})
+
+include(cmake-scripts/compiler-config.cmake)
+include(cmake-scripts/basic-parameters.cmake)
+include(cmake-scripts/buildfiles-to-src.cmake)
+include(cmake-scripts/asy-files.cmake)
+
+# setting build files
+if (WIN32)
+ include(cmake-scripts/win32-specific.cmake)
+endif()
+
+build_files_to_src(CORE_BUILD_FILES CORE_SOURCE_FILES)
+include(cmake-scripts/subrepo-projects.cmake)
+include(cmake-scripts/external-libs.cmake)
+include(cmake-scripts/thirdparty-impl.cmake)
+include(cmake-scripts/backport-libs.cmake)
+
+# PRC
+add_subdirectory(prc/)
+list(APPEND ASY_STATIC_LIBARIES PRC)
+
+get_target_property(prc_incl_dir PRC INCLUDE_DIRECTORIES)
+list(APPEND ASYMPTOTE_INCLUDES $<TARGET_PROPERTY:PRC,INCLUDE_DIRECTORIES>)
+
+include(cmake-scripts/gnu-install-macros.cmake)
+include(cmake-scripts/asy-macro.cmake)
+
+include(cmake-scripts/generated-files.cmake)
+
+# asy-reflect
+if (ENABLE_CUDA_ASY_REFLECT)
+ message(STATUS "asy reflect target enabled")
+ add_subdirectory(cudareflect/)
+endif()
+
+# defining asy target
+
+add_library(
+ asycore STATIC
+ ${CORE_SOURCE_FILES}
+ ${ASY_GENERATED_BUILD_SOURCES}
+)
+
+target_include_directories(asycore PUBLIC ${ASYMPTOTE_INCLUDES})
+add_dependencies(asycore asy_gen_headers)
+target_link_libraries(asycore PUBLIC ${ASY_STATIC_LIBARIES})
+target_compile_definitions(asycore PUBLIC ${ASY_MACROS})
+target_compile_options(asycore PUBLIC ${ASY_COMPILE_OPTS})
+
+# asy executable
+
+add_executable(
+ asy ${ASY_SRC_DIR}/main.cc ${ASY_WIN_RC_FILE}
+)
+
+target_link_libraries(asy PUBLIC asycore)
+
+# base files
+include(cmake-scripts/asy-base-files.cmake)
+
+# asy + base files
+add_custom_target(asy-basefiles DEPENDS ${ASY_OUTPUT_BASE_FILES})
+add_custom_target(asy-with-basefiles ALL DEPENDS asy asy-basefiles)
+
+# asy misc files
+if (ENABLE_MISCFILES_GEN)
+ include(cmake-scripts/asy-misc-files.cmake)
+endif()
+
+# documentation generation
+
+if (ENABLE_DOCGEN)
+ include(cmake-scripts/docgen.cmake)
+endif()
+
+# testing
+
+enable_testing()
+include(cmake-scripts/tests-asy.cmake)
+include(cmake-scripts/tests-wce.cmake)
+
+if (ENABLE_ASY_CXXTEST)
+ add_subdirectory(cxxtests)
+endif()
+
+# installation
+if (WIN32)
+ # on windows, pre-NSIS
+ include(cmake-scripts/win32-pre-nsis-installer.cmake)
+else()
+ # on unix systems
+ if (NOT CTAN_BUILD)
+ include(cmake-scripts/linux-install.cmake)
+ endif()
+endif()
diff --git a/graphics/asymptote/CMakePresets.json b/graphics/asymptote/CMakePresets.json
new file mode 100644
index 0000000000..92e8b6de0d
--- /dev/null
+++ b/graphics/asymptote/CMakePresets.json
@@ -0,0 +1,115 @@
+{
+ "version": 6,
+ "cmakeMinimumRequired": {
+ "major": 3,
+ "minor": 27,
+ "patch": 0
+ },
+ "include": [
+ "cmake-preset-files/base-presets.json"
+ ],
+ "configurePresets": [
+ {
+ "name": "linux/release",
+ "displayName": "[linux-x86/64] Release",
+ "binaryDir": "${sourceDir}/cmake-build-linux/release",
+ "inherits": [
+ "base/linux-only",
+ "base/buildBaseWithVcpkg",
+ "base/release",
+ "base/allow_version_override_from_env"
+ ]
+ },
+ {
+ "name": "linux/release/ci/with-ccache",
+ "binaryDir": "${sourceDir}/cmake-build-linux/release",
+ "inherits": [
+ "linux/release",
+ "base/linuxCcache"
+ ]
+ },
+ {
+ "name": "linux/release/ci/with-ccache/compact-zero",
+ "binaryDir": "${sourceDir}/cmake-build-linux/release-compact-zero",
+ "inherits": [
+ "linux/release/ci/with-ccache",
+ "base/compact-zero-mode"
+ ]
+ },
+ {
+ "name": "msvc/release",
+ "displayName": "[MSVC-x86/64] Release",
+ "binaryDir": "${sourceDir}/cmake-build-msvc/release",
+ "inherits": [
+ "base/buildBaseWithVcpkg",
+ "base/release",
+ "base/gccCompatCacheVar",
+ "base/windows-only",
+ "base/ensure-cl-compiler",
+ "base/allow_version_override_from_env"
+ ],
+ "cacheVariables": {
+ "CMAKE_INSTALL_PREFIX": "${sourceDir}/cmake-install-w32-nsis-release"
+ }
+ },
+ {
+ "name": "msvc/release/ci/with-external-asymptote-pdf",
+ "inherits": [
+ "msvc/release"
+ ],
+ "cacheVariables": {
+ "ENABLE_ASYMPTOTE_PDF_DOCGEN": "false",
+ "EXTERNAL_DOCUMENTATION_DIR": "${sourceDir}/asydoc"
+ }
+ },
+ {
+ "name": "msvc/release/with-external-doc-files",
+ "inherits": [
+ "msvc/release/ci/with-external-asymptote-pdf"
+ ],
+ "cacheVariables": {
+ "ENABLE_DOCGEN": "false",
+ "ENABLE_MISCFILES_GEN": "false"
+ }
+ },
+ {
+ "name": "msvc/release/with-external-doc-files/with-ctan",
+ "inherits": [
+ "msvc/release/with-external-doc-files",
+ "base/ctan"
+ ]
+ }
+ ],
+ "buildPresets": [
+ {
+ "name": "msvc/release",
+ "displayName": "[MSVC-x86/64] Release",
+ "inherits": [
+ "build-base/windows-only"
+ ],
+ "configurePreset": "msvc/release"
+ },
+ {
+ "name": "linux/release",
+ "displayName": "[linux-x86/64] Release",
+ "configurePreset": "linux/release",
+ "inherits": [
+ "build-base/linux-only"
+ ]
+ },
+ {
+ "name": "linux/release/ci/with-ccache",
+ "configurePreset": "linux/release/ci/with-ccache",
+ "inherits": [
+ "build-base/linux-only"
+ ]
+ },
+ {
+ "name": "linux/release/ci/with-ccache/compact-zero",
+ "configurePreset": "linux/release/ci/with-ccache/compact-zero",
+ "inherits": [
+ "build-base/linux-only"
+ ]
+ }
+ ]
+}
diff --git a/graphics/asymptote/ChangeLog b/graphics/asymptote/ChangeLog
index d328718705..39b5480574 100644
--- a/graphics/asymptote/ChangeLog
+++ b/graphics/asymptote/ChangeLog
@@ -1,3 +1,4745 @@
+commit 6d4b620bfe8895c4e1d1fce7c81e61d499bf765f
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sun Feb 16 21:45:13 2025 -0800
+
+ Fix CPPFLAGS.
+
+commit edf66a773d0aaf7086e68bc4bcad6409e672e4ba
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 15 11:29:57 2025 -0800
+
+ Simplify code.
+
+commit fe941345cf1f44a690c16f370d3b4c8db4cdd5c3
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Feb 14 20:25:08 2025 -0800
+
+ Search for glm in current directory; don't require tirpc under FreeBSD.
+
+commit a399a7dd6e9784d5d18696e66fd148c453e17ec6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Feb 14 14:38:18 2025 -0800
+
+ Always look for includes in current directory first.
+
+commit 76d289e234c752336333ed9367366059ac978dbd
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Feb 14 10:54:22 2025 -0800
+
+ Update asymptote.spec.
+
+commit 38e5328c1595d187da029c83d61a18061d55800f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Feb 14 10:43:37 2025 -0800
+
+ Update ax_pthread.m4.
+
+commit 8fb038c69868ee0205f8b3852a98167e21fbffe0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Feb 14 10:38:18 2025 -0800
+
+ Prebuilt missing gc automake files.
+
+commit a0c2ea71ef180d391a769d6e78b049571edf0f55
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 10 16:15:41 2025 -0800
+
+ Increment version to 3.00.
+
+commit cf4243cb97f7d700a320cb93a0e7a47328c32b35
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 10 14:44:17 2025 -0800
+
+ Fix make maintainer-clean.
+
+commit 2f0a7cfb60a6a3475ee52990154ba28244832d17
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 10 14:24:29 2025 -0800
+
+ Update config scripts.
+
+commit 214552f58197224a5b3a7efd4a15a6757c90813b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 10 13:35:08 2025 -0800
+
+ Remove libtool dependence from configure.
+
+commit 7fe989a89945c93c85e1e3cbb3cec4ce7460e170
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 10 11:33:00 2025 -0800
+
+ git subrepo pull (merge) LspCpp
+
+ subrepo:
+ subdir: "LspCpp"
+ merged: "84c9831f2"
+ upstream:
+ origin: "git@github.com:vectorgraphics/LspCpp"
+ branch: "master"
+ commit: "aa2d67051"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "https://github.com/ingydotnet/git-subrepo"
+ commit: "b9b059a"
+
+commit d31fd43aad1be82b57517fb4f9bab41a8e9575f7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 10 01:26:47 2025 -0800
+
+ Update install-sh.
+
+commit 947c860f9430ef249407d2a051ed2b7e263c29e6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Feb 9 13:51:32 2025 -0800
+
+ Disable dependency tracking for one-time gc builds.
+
+commit cc35f7e78d0dec53c50b8c34f1318500c3e13187
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Feb 9 11:32:32 2025 -0800
+
+ Increment version to 2.99.
+
+commit 83de5cbc8268d689b52c07c87927cae3ab94e245
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Feb 9 10:01:51 2025 -0800
+
+ Distribute prebuilt GUI files.
+
+commit 23b2d7e2391f1b4a180778d6c1c98f6703fca10e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 22:13:41 2025 -0800
+
+ Increment version to 2.98.
+
+commit ab5e4e770bd96978ae5b211b752eab81433874c8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 22:13:00 2025 -0700
+
+ Revert "Move -std=c++17 to Makefile."
+
+ This reverts commit 71b86dfe8d509eceb5ab4adce66b273135c0b4ca.
+
+commit 10be59fbd725216c3221c62fa64cac251dcd7131
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 22:11:39 2025 -0700
+
+ Revert "Apply -std=c++17 only to C++ compilation."
+
+ This reverts commit dcc187b1f97b317fc0aa11aac27606dc5aa3ba86.
+
+commit 6a0277facfaefa82a001b02e38b074cf1267b431
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 20:57:47 2025 -0800
+
+ Fix clang warning.
+
+commit dcc187b1f97b317fc0aa11aac27606dc5aa3ba86
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 20:50:39 2025 -0800
+
+ Apply -std=c++17 only to C++ compilation.
+
+commit 8df48262a3e2a149774f8fdbe0a1a0b315052d51
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 20:41:03 2025 -0800
+
+ Fix runtime.pl warnings.
+
+commit 71b86dfe8d509eceb5ab4adce66b273135c0b4ca
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 19:41:04 2025 -0800
+
+ Move -std=c++17 to Makefile.
+
+commit 3e1e10f75af1d549c40320c57763690c08b22c62
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 17:30:38 2025 -0800
+
+ Allow compilation without libtirpc-devel (not recommended though as this would disable XDR and V3D support).
+
+commit 5736020c97ce62282e25d0c94c8bb2793f27c381
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 17:00:20 2025 -0800
+
+ Fix symbolic link.
+
+commit 46532008179a304c517e0d467d3d1d23d88c8153
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 12:28:25 2025 -0800
+
+ Qualify nullptr.
+
+commit 0ab6a0d09fac84efbe8d443d782d06f518f1aea2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 11:26:24 2025 -0800
+
+ Fix last revision.
+
+commit fd7ae5be14a71d6080a5b7f497551c8c369693b1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 11:03:46 2025 -0800
+
+ Clean up symbolic link and hidden directories.
+
+commit 071af187de37bef85987ad4af9e75f31d117cf5b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Feb 8 10:14:25 2025 -0800
+
+ Clean up Python caches.
+
+commit ea26e0d22416de4510b6cc5b5f929c3d5a480c57
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Feb 7 09:24:41 2025 -0800
+
+ Remove empty and temporary files and directories.
+
+commit e2917d5092263d49f7cb9bbe34dbbb7b74a6ac34
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Feb 6 22:44:25 2025 -0800
+
+ Increment version to 2.97.
+
+commit a867372f32b18d9943a5b21430d2652f69e6854b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Feb 6 23:04:45 2025 -0700
+
+ Fix last revision.
+
+commit 317e04545e5bbb1cdad3169600e592b40780966d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Feb 6 20:38:39 2025 -0800
+
+ Enforce C++17 standard.
+
+commit 9e7a68caf7cdd75c5c29d6845b20abab9f7738e1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Feb 6 20:35:19 2025 -0800
+
+ Fix #513: libGLX not found.
+
+commit 72e4a21c0939cef70b79cda7d3b04066ffa40a25
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Feb 6 19:59:11 2025 -0800
+
+ Add DoubleLineMidArrow to feynman.asy.
+
+commit 53693b8deabae750395dacdd6416c1ac2a6b3411
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Feb 5 19:08:01 2025 -0800
+
+ Fix #514: fix erase() when settings.render=0.
+
+commit 63137b558638788b0f12fa479629f5e7a5a9a55c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Feb 4 20:56:31 2025 -0800
+
+ Fix listvariables segmentation fault.
+
+commit bf45fb80c3ab62d657a0bd1bab15ac8669ed143c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Feb 4 20:24:58 2025 -0800
+
+ Standardize settings.
+
+commit 2c49492af03fa38c24b29e493d9d4e69c21ea2e2
+Merge: abe03f77 47c76b58
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Feb 4 19:59:52 2025 -0800
+
+ Merge pull request #519 from vectorgraphics/unify-lsp-ast-files.
+
+ Move LSP-related absyntax::* functions into lsp*.cc files
+
+commit 47c76b5830c9fd55e5fee68a0fbcb71b540f6e08
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Feb 4 19:47:06 2025 -0800
+
+ Standardize auxillary errortest files.
+
+commit 8e52525d791a5b771702f7705a2d9fe9c4179527
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Feb 4 18:56:19 2025 -0700
+
+ WCE: Use a dedicated errorsNonTempalate.asy for testing templated imports on a non-template files.
+
+commit 7e5edf6ff1071f057cbe8282e7e8e537cbc67ee8
+Merge: f943e556 abe03f77
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Feb 4 17:29:35 2025 -0800
+
+ Merge branch 'master' into unify-lsp-ast-files.
+
+commit abe03f77f33a30509dee9e8f6d3d73e96657aad3
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Feb 4 17:28:55 2025 -0800
+
+ Update errors.
+
+commit 45c2d3a11cf42267d75f7c1350cb53787b2fd975
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Feb 4 17:26:27 2025 -0800
+
+ Qualify path to version.asy.
+
+commit f943e55620049390cba424f504efd66d30b20d84
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Feb 4 17:22:22 2025 -0700
+
+ LSP: Fix lspstm.cc.
+
+commit bb46f22145a3528b82684a24bcdbc883b10cab70
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Feb 4 17:21:47 2025 -0700
+
+ LSP: Fix lspfundec.cc.
+
+commit 77764a0581c0d7c9e065a185aedf6c09fd033051
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 3 22:39:16 2025 -0800
+
+ Fix include.
+
+commit aefbccad0e33bf613f26d70fe1097c0d8138c7d4
+Merge: b068bad9 efad9f67
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 3 22:30:39 2025 -0800
+
+ Merge branch 'master' into unify-lsp-ast-files.
+
+commit eca17db9487edc1d7299bf0685b400c9b5398b09
+Merge: efad9f67 f0de5475
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 3 22:24:51 2025 -0800
+
+ Merge pull request #518 from vectorgraphics/external-asy-keywords-el
+
+ Use external asy-keywords.el in windows build.
+
+commit efad9f676bb2ed0bc67898f0fa834dc40751b0e1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 3 22:17:39 2025 -0800
+
+ Fix generation of asy-keywords.el.
+
+commit 166fdf1f954e4050465f59b319e96f6f3b71435a
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Feb 3 17:15:52 2025 -0800
+
+ Improve templated import errors.
+
+commit 2643b3266bcf097515bb3aa3d8c375f6a55171e2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jan 30 14:15:03 2025 -0800
+
+ Fix compilation warning under -O3; add file read tests.
+
+commit b068bad9707830c649584ef0bf4c2994d99a7a2d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Feb 2 02:55:29 2025 -0700
+
+ MAKE: Add lspstm to Makefile.in.
+
+commit e01df50b38766f17feb13782e9f3d8689eca591a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Feb 2 02:55:12 2025 -0700
+
+ LSP: Move HAVE_LSP functions in stm.cc to lspstm.cc.
+
+commit aa559e19d5a3e57a3aa2cf23e2e1b35a0637a31e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Feb 2 02:31:13 2025 -0700
+
+ MAKE: Add lspfundec to Makefile.in.
+
+commit 704eb42721ae4cafb0fa8fd7e5d849d0207a69d1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Feb 2 02:29:12 2025 -0700
+
+ LSP: Move HAVE_LSP functions in fundec.cc to lspfundec.cc.
+
+commit bee996462a61d68ef046b5d9e455af179ea3dd61
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Feb 2 01:46:37 2025 -0700
+
+ MAKE: Add lspexp to Makefile.in.
+
+commit a5220020df7677e7a1e0f25fdcfce649795ead91
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Feb 2 01:42:25 2025 -0700
+
+ LSP: Move HAVE_LSP functions in exp.cc to lspexp.cc.
+
+commit c90620f69c785c976963aeb9e93f64298ed7f53f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Feb 2 01:12:56 2025 -0700
+
+ MAKE: Add lspdec to Makefile.in.
+
+commit f86bc3b41e0b311cc9a88d0a63ca77fb59d25873
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Feb 2 01:01:40 2025 -0700
+
+ LSP: Move HAVE_LSP functions in dec.cc to lspdec.cc.
+
+commit c4d16b8facf9a8053e9c1984d2b3853ea7a3709d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Feb 2 00:09:25 2025 -0700
+
+ LSP: Fix header include issues on LSP.
+
+commit 598ca098060ad4f4acde7fa8fc32b8f4fd29c9ba
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Feb 1 23:49:09 2025 -0700
+
+ git subrepo pull (merge) --branch=master LspCpp
+
+ subrepo:
+ subdir: "LspCpp"
+ merged: "4011f7d77"
+ upstream:
+ origin: "git@github.com:vectorgraphics/LspCpp"
+ branch: "master"
+ commit: "4011f7d77"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "???"
+ commit: "???"
+
+commit 17110bda961f0145250c3847c31f82b8d97478b0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Feb 1 23:44:53 2025 -0700
+
+ git subrepo pull --branch=master LspCpp
+
+ subrepo:
+ subdir: "LspCpp"
+ merged: "d5ff0b01b"
+ upstream:
+ origin: "git@github.com:vectorgraphics/LspCpp"
+ branch: "master"
+ commit: "d5ff0b01b"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "???"
+ commit: "???"
+
+commit f0de5475d0492fa39917493a72b09fa7e82852ed
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Feb 1 23:21:35 2025 -0700
+
+ BUILD: Add asy-keywords.el to the list of requried documentation files for windows build script.
+
+commit 420d4b358c9e36f21726d69031269bdd0d76fa21
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Feb 1 23:10:05 2025 -0700
+
+ CMAKE: Disable miscfiles generation in msvc/release/with-external-doc-files preset.
+
+commit 14e8d64a27c2f37b4eca9c14df44adfa886f6f3b
+Merge: 184c6cf4 f7cd5ba0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Jan 29 22:12:28 2025 -0700
+
+ Merge pull request #516 from vectorgraphics/unix-install-cmake
+
+ Add install targets to cmake build for linux & additional tests to asy
+
+commit 184c6cf4fb3f8f88b457741e030ad8f1bfcdd631
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jan 29 10:14:32 2025 -0800
+
+ Fix error message.
+
+commit bfcc7e11e4b4d314e787046cf56a0cd0d80424ab
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jan 29 10:10:40 2025 -0800
+
+ Fix compilation flags.
+
+commit f7cd5ba0d874e83d06d54a22bfa623e259a72660
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 28 23:07:20 2025 -0700
+
+ CI: Simply asy test arguments.
+
+commit 82a7653b9f43f33becd4dce3f5aa144f623830fe
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 28 23:01:19 2025 -0700
+
+ CMAKE: Add check labels to asymptote tests.
+
+commit 9b2f8c0641f5bf251f6ffbea4630abd6f039de0b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 28 17:58:13 2025 -0700
+
+ CMAKE: Add additional asy tests.
+
+commit cee7ccb9f8b1a4a5f20e6601b6ac7936c791183d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 28 17:43:41 2025 -0700
+
+ CMAKE: Add manpage to linux-install.
+
+commit 96b55da7800b8c0c31dab92e5126c1e18a275ad6
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 28 17:39:42 2025 -0700
+
+ CMAKE: Add manpage generation to cmake build process.
+
+commit 4aad4e7ab798b2d8ac4d44baec2af40f4aa4e533
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 28 17:39:33 2025 -0700
+
+ PY: Add script for creating manpage.
+
+commit cf9f84b0efa108629c359d1174d32f8ddaf9c02f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 28 03:25:33 2025 -0700
+
+ CMAKE: Add basic unix install cmake file.
+
+commit 18faad766dac7f0fed0438c41eaa31135522b326
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 28 03:51:59 2025 -0700
+
+ CMAKE: Fix dab7080c37b0bf79fe67e2ca1ea22e5db716a66d.
+
+commit dab7080c37b0bf79fe67e2ca1ea22e5db716a66d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 28 00:36:29 2025 -0700
+
+ CMAKE: Fix CTAN build on linux with cmake.
+
+commit 621dbbeb2be8d2fa5e124051a8e5c5f7291746df
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jan 25 17:07:50 2025 -0800
+
+ Fix #497: Install xasy.py with executable permission.
+
+commit 37fb5cfd12162d950445c957d9cd3359d4406d90
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jan 25 10:09:07 2025 -0800
+
+ Remove trailing whitespace.
+
+commit 8d42b82c8d4a175fdb87f2d1996b30f14de26bc3
+Merge: ae949e77 03973ef5
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jan 25 10:03:53 2025 -0800
+
+ Merge branch 'master' into privacy.
+
+commit ae949e77f75e63cfa70d56e89c2d37b8e86eaf09
+Merge: 56e144cd 3683c526
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jan 25 10:02:54 2025 -0800
+
+ Combine loops.
+
+commit 56e144cd81715e52d4168fb96c90905c2fa6a9c1
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 23 21:03:18 2025 -0800
+
+ Make received template parameters private.
+
+commit 36ca3b801fb7f8d72865f2440a47e9b4f751003b
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 23 20:30:20 2025 -0800
+
+ Make fields autounraveled from private types private.
+
+commit 290c589c9326a56923a8e164b4ff867aed060cb0
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 23 19:20:52 2025 -0800
+
+ Correct private wildcard unraveling.
+
+commit 541d889757f5e212c959478e3f7e533b0c7eed86
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 23 18:21:11 2025 -0800
+
+ Correct behavior when privately unraveling type.
+
+commit 21ca3f0e4ad420a6d59b4d6d12b4d8a0946ef7a9
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 23 18:01:46 2025 -0800
+
+ Fix privacy issue with overloaded unravel.
+
+commit 6f2eba307373334156e1050fb164a88db692ef50
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 23 17:59:35 2025 -0800
+
+ Return to using record in entry rather than frame for permissions.
+
+commit ce2ba4f37d75089f5360c956373bd27fc7334517
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 23 15:50:45 2025 -0800
+
+ Correct one case of privacy enforcement.
+
+commit 3acc7765b3042032ea52acfdd699aed3de69ead1
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 23 14:58:01 2025 -0800
+
+ WIP: Working on privacy commit.
+
+commit 462446dfa70dceae148d9b5df8bd2313fabc7d70
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Jan 21 21:14:35 2025 -0800
+
+ Minor comment improvements.
+
+commit 6e0dc363d5db817ce7096fd87ecf5adf2703b370
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Jan 21 16:54:58 2025 -0800
+
+ Add errorFreeTestTemplate.asy.
+
+commit da7c299309da72c42d7411de67538ad36c8e46da
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 02:19:33 2025 -0700
+
+ CI: Rearrange tests so that all tests except gc is run in linux-sanity.
+
+commit 104743ca4d7904c74ef0a5e42819211d852e87e2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 02:07:38 2025 -0700
+
+ CI: Split latex initializtion into a separate action.
+
+commit a0809e0a94a88c439737a69c5c0775e161cc9f3e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 02:01:37 2025 -0700
+
+ CI: Add linux-sanity step to CI.
+
+commit bd5ae35a18ea072ce41adeb6253c8054649114f2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 01:39:02 2025 -0700
+
+ CMAKE: Remove display names from presets not meant for user.
+
+commit 695fa716bee24b2c928bbe36499c8a82dacbbfc9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 01:34:44 2025 -0700
+
+ CMAKE: Add compact-zero mode to preset.
+
+commit 96984d3fe20b1c77b17ecbca832ab364f737c8a7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 01:29:00 2025 -0700
+
+ CMAKE: Rename some profiles for consistency.
+
+commit 296f466543646b1ec6a79405a8fee3b17db681cf
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 01:27:01 2025 -0700
+
+ CMAKE: Add linux-only flags to presets.
+
+commit 3fdbcd35de0721a268a765522aacb04e3242e427
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 01:25:17 2025 -0700
+
+ CMAKE: Remove ReleaseWithDebugInfo preset since it's not used often.
+
+commit ec91c4a4bc7ae97041c115a8ea8742f3dd8cbb8a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 00:58:18 2025 -0700
+
+ CMAKE: Split cmake build presets.
+
+commit 271575796bab091866fa0ed27ac03860abc0dcf3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 00:45:43 2025 -0700
+
+ CMAKE: Bump minimum version in json.
+
+commit 26fcedc1e26f3dc469ad30b9e8089d8f3afc2235
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 00:35:06 2025 -0700
+
+ CMAKE: Add support for COMPACT=0 build mode.
+
+commit b465a9a249e1d370650ac899512d74238661f301
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 00:32:13 2025 -0700
+
+ CMAKE: Add SET_COMPACT_ZERO option.
+
+commit 52a05a2319ff12d3340391c27cdfbbbcc757796e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jan 18 13:28:47 2025 -0700
+
+ MAKE: Remove additional files from Lsp build process during clean.
+
+commit 3605ff0b93bd80c3989ce8d066badb31918f6074
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jan 18 13:24:43 2025 -0700
+
+ AC: Add in LSPCPP_SUPPORT_BOEHM_GC=OFF explicitly to LSP_CMAKE_OPTIONS if gc is off.
+
+commit 67f066bde5004643c4c608242a1f7ec3108825a5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jan 18 13:24:24 2025 -0700
+
+ AC: Change ac_cv_use_gc to enable_gc in lsp configuration.
+
+commit 07e207a72c56d15e2805bb09360ec4046f5c24ce
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jan 16 20:41:34 2025 -0800
+
+ Format plain*.asy files.
+
+commit cf55d140aa2821eb0b941dc9dcb1a0646d728843
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jan 24 21:35:48 2025 -0800
+
+ Update documentation.
+
+commit 414d57d6d61a69d6345c84d30909a37dc69207b1
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 19:53:36 2025 -0800
+
+ Improve comment.
+
+commit 0db6b3b5962697aeaa3e4741e1d143cbb9cf0366
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 19:37:36 2025 -0800
+
+ Delete unnecessary comment.
+
+commit efcdb3ea715bc9826bb2cb119eb330d61f6487d9
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jul 26 16:21:12 2024 -0700
+
+ Apply type rename after merge.
+
+commit ee927accd425e097d48c214f627ba0b61b15efbd
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jul 26 11:26:32 2024 -0700
+
+ Switch some modules from `typedef` to `using`.
+
+commit 09a787c5e18e2c96b339edecd55da48fa4800084
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jul 26 11:24:38 2024 -0700
+
+ Add comments to justify "using" syntax.
+
+commit 99aa297b02e0846132fe14b41c4282c99343be21
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Apr 19 21:08:01 2016 -0700
+
+ More formatting fixes.
+
+commit e6741efb5ac373172bd3c5c51e43e37ae7a2085c
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Apr 19 21:02:19 2016 -0700
+
+ Improve formatting of new lines in camp.y
+
+commit 2c5a2cb6946112cfd81be0b7512f9ba888dd5b6c
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Apr 19 20:52:13 2016 -0700
+
+ Add using keyword as typedef alternative.
+
+commit d02b1d9df8608646850ae5c98fc6c70759c8e29a
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 16:33:54 2024 -0800
+
+ Unify spellings of two perl variables that should be one.
+
+commit 890e39407221ae267f297b612eacc66a2d5b7ccd
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Jan 21 16:39:41 2025 -0800
+
+ Show error if module is re-imported with wrong param names after correct import.
+
+commit c31e102ec19c312a5cceaf6fcd401586daef724b
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Jan 21 15:24:58 2025 -0800
+
+ Remove unused function from dec.cc.
+
+commit 6f69e9a28ea8543bad606e7469a7dd84dc9bd68d
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Jan 21 14:55:15 2025 -0800
+
+ Change some "0"s to "nullptr".
+
+commit 858723a17fdc4026ac975d548313bbdd4c1aa8d2
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sun Jan 19 20:37:01 2025 -0800
+
+ Omit unneeded getLocation() before encode().
+
+commit 5e82af8e66841645356569334795d40cb2c508e3
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jan 17 17:01:29 2025 -0800
+
+ Non-statically nested types cannot be used in templates.
+
+commit 34b0f710cd2dbf0cf11c448f7f1431ca6c65a708
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jan 17 16:32:07 2025 -0800
+
+ Move encodeParent into trans::coder class.
+
+commit eddd420c2dc06d03b87670e36263364cd308afb8
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 15:24:24 2025 -0800
+
+ Improve error message.
+
+commit 426840a26e67dd50a8061e67b85242752a39b9e8
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 15:19:43 2025 -0800
+
+ Add comment.
+
+commit 5f1775da15b1c49d9b9563cdcfa44c5b6808da0a
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 15:14:00 2025 -0800
+
+ Remove transAsTemplatedRecordBody.
+
+commit 201c1404dc24053092ab0fac65b48114b0b507c1
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 14:58:31 2025 -0800
+
+ Remove `transAsRecordBody` which did very little.
+
+commit 27a534dd30390f963fa17490f60976a3d624e50a
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 14:25:42 2025 -0800
+
+ Simplify loadModuleExp class.
+
+commit 96e19d4e23be968452fef8851f355caeea4f3739
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Jan 15 22:23:19 2025 -0800
+
+ Clean up and document push/pop parents.
+
+commit 2693b6d11f8644947368cdf18af64eaeeca59efa
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Jan 15 20:29:35 2025 -0800
+
+ Clean up code a bit.
+
+commit e0e505f6a81fe2cdb48975809540e77800090604
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Jan 15 20:10:38 2025 -0800
+
+ Guard boost stacktrace by DEBUG_CSTACKTRACE macro and add comment.
+
+commit 57bc300eec90f51f35577cb19a9118211b4b73d1
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Jan 15 16:59:30 2025 -0800
+
+ Add test for passing parameters through multiple templated imports.
+
+commit aba0a3376f1d3e58a709e049131ddba48380961c
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Jan 15 16:53:03 2025 -0800
+
+ Apparently working solution (needs refactor).
+
+commit 871bfc95ef6a10975ff6c17993b937addd8688c2
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Jan 14 14:23:05 2025 -0800
+
+ Add comment.
+
+commit eabdd863bc322d2228ba00691b2309862f99a8a5
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 9 20:57:10 2025 -0800
+
+ Switch to namedTy from namedTyEntry.
+
+commit 6315977004ca2d2495a16be214ddb7907b29fd37
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Jan 8 14:51:51 2025 -0800
+
+ Minor improvements to usableInTemplate function.
+
+commit 1ce0f05b73e7a43af56609dcf193f97884ff8d79
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Jan 8 10:31:28 2025 -0800
+
+ Debugging: Print out translation-time info about specified type.
+
+commit 34ed26cf65b08a0b5c40d69d81c6f5f7c2e68c03
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Jan 7 21:32:33 2025 -0800
+
+ Untested function `usableInTemplate` added to dec.cc.
+
+commit a0b0ce0846244b655776b611b30cff242d39606d
+Author: Andy Hammerlindl <ahammerlindl@gmail.com>
+Date: Fri Jan 3 11:33:43 2025 +1100
+
+ Being better implementation of templated imports.
+
+commit 03973ef58ffb4814f30b5a691bb58f4ecce29059
+Merge: 3683c526 253e9014
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jan 19 15:19:19 2025 -0800
+
+ Merge pull request #515 from vectorgraphics/fix-build-issues-jan2025
+
+ Fix build issues.
+
+commit 253e90142bfa7073308b94cbd516fa059f3edf53
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 02:19:33 2025 -0700
+
+ CI: Rearrange tests so that all tests except gc is run in linux-sanity.
+
+commit 7c504ee74a43ad5d53c73c0bc1c5ace12dbbf1df
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 02:07:38 2025 -0700
+
+ CI: Split latex initializtion into a separate action.
+
+commit 20bf8d91347e26bd6f4a0c65e7618776563a7b09
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 02:01:37 2025 -0700
+
+ CI: Add linux-sanity step to CI.
+
+commit 907048c255c55cd0e4d87116cc419b70b27b8e67
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 01:39:02 2025 -0700
+
+ CMAKE: Remove display names from presets not meant for user.
+
+commit cad6d929e21cc2ecc6e0be158a38190fc39ba484
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 01:34:44 2025 -0700
+
+ CMAKE: Add compact-zero mode to preset.
+
+commit 63d5c152e58f913892091e6b868f550a24181b16
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 01:29:00 2025 -0700
+
+ CMAKE: Rename some profiles for consistency.
+
+commit f4008e156f0689dd882c11f896fb1abac4ef40e3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 01:27:01 2025 -0700
+
+ CMAKE: Add linux-only flags to presets.
+
+commit 906d2c4857b815ac4efa8f8dca118ed60ca17463
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 01:25:17 2025 -0700
+
+ CMAKE: Remove ReleaseWithDebugInfo preset since it's not used often.
+
+commit 0807361df886367420a3d01e6ff066119b7c4ece
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 00:58:18 2025 -0700
+
+ CMAKE: Split cmake build presets.
+
+commit 41be8a2445554f01f0e97d0c87ee62444901d3cc
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 00:45:43 2025 -0700
+
+ CMAKE: Bump minimum version in json.
+
+commit f129628dc98dceb9309e6d3a467679d1f5a220c4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 00:35:06 2025 -0700
+
+ CMAKE: Add support for COMPACT=0 build mode.
+
+commit 94d86829818ce8d49d86909051d9ec5362880610
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 19 00:32:13 2025 -0700
+
+ CMAKE: Add SET_COMPACT_ZERO option.
+
+commit 89e55870b08c6ab108d30aaa58669d25afc342c6
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jan 18 13:28:47 2025 -0700
+
+ MAKE: Remove additional files from Lsp build process during clean.
+
+commit 2c978af1f69a9b09d8a9d621a47802b6a0dd0b1c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jan 18 13:24:43 2025 -0700
+
+ AC: Add in LSPCPP_SUPPORT_BOEHM_GC=OFF explicitly to LSP_CMAKE_OPTIONS if gc is off.
+
+commit 00e0ccfd2bebdf50ed8bcb831e154a557339c546
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jan 18 13:24:24 2025 -0700
+
+ AC: Change ac_cv_use_gc to enable_gc in lsp configuration.
+
+commit 3683c52606fd53adc4b49d3c8645429e16435040
+Merge: 4aa41ce8 5b2096a2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jan 16 20:43:06 2025 -0800
+
+ Merge branch 'using_typedef'.
+
+commit 5b2096a2ae80641b76264b2df2037c3b95824bca
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jan 16 20:41:34 2025 -0800
+
+ Format plain*.asy files.
+
+commit b66679ead880464224dd7512547cd1be4206da88
+Merge: 129ddc0f ef2fd57f
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 20:18:19 2025 -0800
+
+ Merge branch 'using_typedef' of https://github.com/vectorgraphics/asymptote into using_typedef
+
+commit ef2fd57f781bb37f7f42bebf9d15213510078e7a
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jan 16 20:18:00 2025 -0800
+
+ Update documentation.
+
+commit 129ddc0f825a4c0e32c42c6eeec984a63999e727
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 19:53:36 2025 -0800
+
+ Improve comment.
+
+commit 7a3818e937aebee80f271917904503b1a9d3c32d
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 19:37:36 2025 -0800
+
+ Delete unnecessary comment.
+
+commit 4aa41ce8300046efa473ef8f1ebe5ea68212fb10
+Merge: ed93f99b 76635560
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jan 16 19:26:33 2025 -0800
+
+ Merge pull request #510 from vectorgraphics/509-perl-script-has-misspelled-variable-name
+
+ Unify spellings of two perl variables that should be one.
+
+commit e4be79c7500fae335c95b82e042b9297ece1f547
+Merge: 7c60d7be ed93f99b
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 18:13:14 2025 -0800
+
+ Merge branch 'master' into using_typedef
+
+commit 766355606b9d8753216674461a2aef83bda351d0
+Merge: c62a29c8 ed93f99b
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 16 18:08:26 2025 -0800
+
+ Merge branch 'master' into 509-perl-script-has-misspelled-variable-name
+
+commit 1c881a27c2637b5b47864f19a6debfcf9e7e5cfc
+Author: Andy Hammerlindl <ahammerlindl@gmail.com>
+Date: Fri Jan 3 10:55:17 2025 +1100
+
+ Assert type in encodeLevel is a record.
+
+commit 4c062b25a506218b94b3bedb2d5b2e9c083cdf66
+Merge: 65e47202 5ea9cb32
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Jan 2 15:12:31 2025 -0800
+
+ Merge branch '508-error-compiling-nested-template-imports' of https://github.com/vectorgraphics/asymptote into 508-error-compiling-nested-template-imports
+
+commit 65e4720283baab39cc365ec82203b26ecc472014
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Jan 1 18:41:19 2025 -0800
+
+ Debugging WIP
+
+commit 5ea9cb326a92fb62654e348783a3b8352bc663c9
+Merge: 65e0876f ed93f99b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jan 1 15:50:22 2025 -0800
+
+ Merge branch 'master' into 508-error-compiling-nested-template-imports.
+
+commit ed93f99b6649e20afd4fd4c2d80e364b98785c93
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jan 1 15:47:31 2025 -0800
+
+ Fix settings type.
+
+commit 65e0876ffc323cb721580c6dcc60f8856a1c5493
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Dec 29 20:24:06 2024 -0800
+
+ Avoid redefining preprocessor macro.
+
+commit 429fd699bcc24d099206ca7dd896d96e6be71dda
+Merge: 4bfd6b75 0c384938
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sun Dec 29 20:18:34 2024 -0800
+
+ Merge branch 'autounravel' into 508-error-compiling-nested-template-imports
+
+commit 0c3849387bb668d258a2f71a13528d1cf70d3e04
+Merge: 23e17701 5d8454c6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Dec 29 20:04:12 2024 -0800
+
+ Merge branch 'master' into autounravel.
+
+commit c62a29c8a5dc572ad29362cb2596804bdaa934ac
+Merge: ef211932 bb5b8780
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sun Dec 29 09:36:13 2024 -0800
+
+ Merge branch 'master' into 509-perl-script-has-misspelled-variable-name
+
+commit 5d8454c61df9e4fee383e028061581cd02c0220c
+Merge: 06d4a678 7561c251
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 28 23:12:06 2024 -0700
+
+ Merge pull request #512 from vectorgraphics/fix-lsp-warnings-dec2024
+
+ Fix LSP warnings for December 2024
+
+commit 7561c251e5e3cb522844c43728c8fe81f10b3804
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 28 22:44:13 2024 -0700
+
+ CMAKE: Pass in _WIN32_WINNT to LSP project.
+
+commit 70d15e77c0d056f6fa76dc527fa36f50b56e8a3b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 28 22:44:01 2024 -0700
+
+ CMAKE: Fix _WIN32_WINNT macro.
+
+commit af76da3f3dde90fa5d76b5f393df5672c18a21e6
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 28 22:41:15 2024 -0700
+
+ git subrepo pull --branch=build-enhancements-dec-2024 LspCpp
+
+ subrepo:
+ subdir: "LspCpp"
+ merged: "1c3beeedd"
+ upstream:
+ origin: "git@github.com:vectorgraphics/LspCpp"
+ branch: "build-enhancements-dec-2024"
+ commit: "1c3beeedd"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "???"
+ commit: "???"
+
+commit 97ae331d540258840daccda4376261b787aa4696
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 28 22:40:41 2024 -0700
+
+ git subrepo pull (merge) --branch=master LspCpp
+
+ subrepo:
+ subdir: "LspCpp"
+ merged: "d81801194"
+ upstream:
+ origin: "git@github.com:vectorgraphics/LspCpp"
+ branch: "master"
+ commit: "d81801194"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "???"
+ commit: "???"
+
+commit c7d09099a0b2782aa0d1ce1a312abd35e2a68c31
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 28 22:38:26 2024 -0700
+
+ REPO: Fix subrepo parent.
+
+commit 06d4a678c7d1a3dcd1afde1c53e2010631ecf3fe
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 28 21:09:52 2024 -0700
+
+ PY: Change ascii encoding to utf-8.
+
+commit bb5b8780f31fed2bd1e7eac5cf3a17027714445e
+Merge: fc5766d2 e2a02980
+Author: charlesstaats <charlesstaats@users.noreply.github.com>
+Date: Sat Dec 28 22:38:24 2024 -0500
+
+ Merge pull request #511 from vectorgraphics/perl2py
+
+ Convert several perl scripts to python
+
+commit e2a029805d2f24cabd1c1e62420bdc7c2dbbec4d
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 19:18:15 2024 -0800
+
+ Delete extra blank line.
+
+commit ae69112ed1c9f693fa86199c0cefd33c41df43a9
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 19:09:59 2024 -0800
+
+ Port long options to asy-list.py.
+
+commit 885630517831a2653b9d385e4a38a679a878146c
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 18:24:41 2024 -0800
+
+ Fix alignment of generated C++ comment blocks.
+
+commit 354432ac6bf3b45a957b2723af92a4c348f6c796
+Merge: 55b8760a fc5766d2
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 18:09:59 2024 -0800
+
+ Merge branch 'master' into perl2py
+
+commit 55b8760a538b707bfb60291babd226d391a9bee8
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 17:56:50 2024 -0800
+
+ Fix a python shebang to python3.
+
+commit 56e807a02864a1c3b22168d7e514f2c590c9b0d2
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 17:56:04 2024 -0800
+
+ Update asy-misc-files.cmake to use keywords.py rather than keywords.pl.
+
+commit e74e82bb5bb290e2f8a256a1baec03ff3232dbc1
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 17:47:51 2024 -0800
+
+ Fix pylint errors.
+
+commit 7e52fa705bd0affad93e4e464cb83882e4679b64
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 17:28:30 2024 -0800
+
+ Sort imports in findsym.py.
+
+commit 1628b9f409ac05e271028e40edb187ce00828cfb
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 17:26:26 2024 -0800
+
+ Reformat opsymbols.py with slightly different settings.
+
+commit 0a3e0cb123dc969056de146ef6d1e5119cd1d6ff
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 17:17:35 2024 -0800
+
+ Format new python files.
+
+commit 0efe596d63da9d372dbe31163b62566f5e20e24f
+Merge: be5d58e3 5cf1ed44
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 16:50:42 2024 -0800
+
+ Merge branch 'master' into perl2py
+
+commit ef211932bb0907bf7e5c4c82d614f8109cc40585
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 28 16:33:54 2024 -0800
+
+ Unify spellings of two perl variables that should be one.
+
+commit fc5766d273295067dfdea39ada5cc95dd7ee3584
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Dec 28 13:13:29 2024 -0800
+
+ Add to last revision.
+
+commit e54cb453002258c46aa376850a73f4070fe89d88
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Dec 28 11:15:53 2024 -0800
+
+ Access xasy and debug settings as variables.
+
+commit 8703e2a6316862dc6dcd6d247c7faf0a91b9fc2f
+Merge: 5cf1ed44 94ccb43d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Dec 27 22:48:11 2024 -0800
+
+ Merge pull request #507 from vectorgraphics/addr-build-improvements-dec2024
+
+ Additional build improvements for december 2024
+
+commit 94ccb43dfd7618d047eeb0d6bc9261a9f4ad25ca
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Dec 27 22:38:21 2024 -0800
+
+ Run gc/autogen.sh.
+
+commit 492d88321e4c693f57f716c1b481c9316cc4ea6b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Dec 27 22:25:57 2024 -0800
+
+ Update build-asymptote.
+
+commit 9a22de4ac344b69fd8e8ccfe1462db662d3b2f52
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Dec 27 20:30:18 2024 -0800
+
+ Remove extra spaces; fix gc compilation; require libtool instead of libtoolize.
+
+commit 4bfd6b754a8e5dc810bce84510201bed578c4778
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Dec 27 17:32:51 2024 -0800
+
+ Debugging #508: print stack trace.
+
+commit 7fbc53c5807e6836260e6cc0a73a73f5227e7cc6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Dec 26 20:54:22 2024 -0800
+
+ Check for libtoolize.
+
+commit 637ba8f6cf939e1367e577108409c6cd3a85ae5e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Dec 25 22:22:45 2024 -0800
+
+ Quote ENABLE_LSP_MACRO.
+
+commit 3bcf5fdd5788000ff1c86cdb671afce5037fb376
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Dec 25 19:36:48 2024 -0800
+
+ GC: Update configure.ac.
+
+commit 468f63ac40e191951d23523b040a5f5b9f3b3cf0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Dec 25 16:17:47 2024 -0800
+
+ Remove obsolete code.
+
+commit 91d4d8d76f919d9729ff7cb9ef80be42b58c7f2d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Dec 25 16:00:34 2024 -0800
+
+ Update autoconf version.
+
+commit 0916cfcb4fb4c3dc8a6a902898b4fb8be2e9b269
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Dec 25 15:35:18 2024 -0800
+
+ Remove obsolete configuration code.
+
+commit 23e177013d8d2ee12cbcc16e4ff584c4dfaa6139
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Dec 24 19:15:48 2024 -0800
+
+ Fix issue with autounravel overrides of builtin record ops.
+
+commit 8405b6616b07cbe856bd409e2d8389581b590b71
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Dec 24 09:39:09 2024 -0800
+
+ GC: Update GC to latest stable release.
+
+commit 814739609d95ac1475fc86f0db3161045491ae1a
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Dec 24 09:35:38 2024 -0800
+
+ git subrepo clone --force --branch=v8.2.8 https://github.com/ivmai/bdwgc gc
+
+ subrepo:
+ subdir: "gc"
+ merged: "ee59af372"
+ upstream:
+ origin: "https://github.com/ivmai/bdwgc"
+ branch: "v8.2.8"
+ commit: "ee59af372"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "???"
+ commit: "???"
+
+commit e2af319e39aeb939b67edd0c81c9bab80d8276c2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 23 22:05:54 2024 -0700
+
+ CMAKE: Change HAVE_GL to HAVE_LIBGL during configuration.
+
+commit 3c5828d9b66f487b13f6f96dd71e9203a7b0565e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 23 19:38:53 2024 -0700
+
+ GC: Set +x on autogen.sh.
+
+commit 54253b0425e88d3ea2b8cb9bdeac2b5831e21f98
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 23 18:14:03 2024 -0700
+
+ MAKE: Support local gc in build process.
+
+commit 889ba00a5ab95526c1ee44fa614bc6e640b255fa
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 22 14:52:37 2024 -0700
+
+ GUI: Remove click from dev dependency list.
+
+commit 2b0f0c33f127b9cdea7d496cf6cf7b720e727607
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 22 14:52:27 2024 -0700
+
+ GUI: Remove click from buildtool.
+
+commit 203ea75d0c9a7b460309f54296aba105cced8f27
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 22 02:50:59 2024 -0700
+
+ git subrepo pull LspCpp
+
+ subrepo:
+ subdir: "LspCpp"
+ merged: "80e204a4f"
+ upstream:
+ origin: "git@github.com:vectorgraphics/LspCpp"
+ branch: "master"
+ commit: "80e204a4f"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "https://github.com/ingydotnet/git-subrepo"
+ commit: "cce3d93"
+
+commit a02ebe837ea4977b7b56f05a6c955e02438c7c12
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 22 02:09:55 2024 -0700
+
+ CMAKE: Use subrepo-cloned libatomic_ops and bdwgc for asymptote.
+
+commit 92a60fbc9190e8bbdf3c4129f3da9baeaaf39205
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 22 02:09:39 2024 -0700
+
+ VCPKG: Remove gc from vcpkg install list.
+
+commit b5a6fd02a63debff8830884154f8ea7a8b26ef59
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 22 02:09:25 2024 -0700
+
+ REPO: Remove libatomic_ops from ignore list.
+
+commit 15cc98d1576ac69a5407b1c465acc6f89514860d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 22 01:15:03 2024 -0700
+
+ git subrepo clone --branch=v7.8.2 https://github.com/ivmai/libatomic_ops
+
+ subrepo:
+ subdir: "libatomic_ops"
+ merged: "4c00f978c"
+ upstream:
+ origin: "https://github.com/ivmai/libatomic_ops"
+ branch: "v7.8.2"
+ commit: "4c00f978c"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "https://github.com/ingydotnet/git-subrepo"
+ commit: "cce3d93"
+
+commit 535935c7b9cd0e193281c74916485c1dff4cf867
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 23 03:05:25 2024 -0700
+
+ REPO: Unignore gc files.
+
+commit e9e4d3359c8288b90439db8d19c0c76246c37a9d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 23 03:05:09 2024 -0700
+
+ REPO: Rename bdwgc to gc.
+
+commit daf3d0972286f43d706be64b6929cbbf288f964a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 21 23:36:41 2024 -0700
+
+ git subrepo clone --branch=d1ff06cc503a74dca0150d5e988f2c93158b0cdf https://github.com/ivmai/bdwgc
+
+ subrepo:
+ subdir: "bdwgc"
+ merged: "d1ff06cc5"
+ upstream:
+ origin: "https://github.com/ivmai/bdwgc"
+ branch: "d1ff06cc503a74dca0150d5e988f2c93158b0cdf"
+ commit: "d1ff06cc5"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "https://github.com/ingydotnet/git-subrepo"
+ commit: "cce3d93"
+
+commit 5cf1ed4457f398b1d0c71d6b4b7b12599b685f86
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Dec 19 11:43:37 2024 -0800
+
+ Remove diagnostic.
+
+commit be5d58e36fd848f29f8f8f2a07b86a70b995d8fb
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 14 18:49:35 2024 -0800
+
+ Translate keywords.pl to python.
+
+commit 1b157a79685433a9676bd3a6c155e9c6560adbfe
+Merge: 2735aad2 77ba9cd2
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 14 17:51:30 2024 -0800
+
+ Merge branch 'autounravel' of https://github.com/vectorgraphics/asymptote into autounravel
+
+commit 2735aad2347a99630560d6833e0de36abf005255
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 14 17:49:52 2024 -0800
+
+ Change applyAutoUnravel bool parameter to enum for readability.
+
+commit 772e8cb7e41edb38077b3a725a0ecaa188e8bdbf
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 14 17:25:10 2024 -0800
+
+ More uniform code in addRecordOps function.
+
+commit 77ba9cd2bc0746c72caa891f7281be7bee23c2e4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Dec 14 11:48:06 2024 -0800
+
+ Improve documentation of autounravel.
+
+commit b4b9d6e56221d8a35b10adc430f6a7a8402b580a
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Dec 14 11:41:57 2024 -0800
+
+ Improve documentation of autounravel.
+
+commit d94cb9643d60f3beb77d8d466c5dfacd028cea7f
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 14 09:47:55 2024 -0800
+
+ Make rational.asy use autounravel.
+
+commit 4601cc946d130cc66b3ad8d003061cf994d15502
+Merge: a526dfc9 0c3610e0
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Dec 14 09:11:24 2024 -0800
+
+ Merge branch 'autounravel' of https://github.com/vectorgraphics/asymptote into autounravel
+
+commit 77f85b7ac80908e5d8471a2e6c83fa79318533a6
+Merge: 607b655e 6e5a08cb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 14 01:05:32 2024 -0700
+
+ Merge pull request #504 from vectorgraphics/bump-vcpkg-version
+
+ VCPKG: Bump vcpkg baseline version.
+
+commit 6e5a08cb3388130ff82f403a9da464cf69a50935
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 14 00:07:47 2024 -0700
+
+ git subrepo pull LspCpp
+
+ subrepo:
+ subdir: "LspCpp"
+ merged: "d12eab466"
+ upstream:
+ origin: "git@github.com:vectorgraphics/LspCpp"
+ branch: "master"
+ commit: "d12eab466"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "???"
+ commit: "???"
+
+commit 0c3610e039c3380127014197f83c1c2330f71172
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Dec 13 23:01:49 2024 -0800
+
+ Simplify documentation of autounravel.
+
+commit bbd32434aaf4e60dcdd574e6d0f0d34557804206
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Dec 13 18:57:50 2024 -0800
+
+ Update documentation.
+
+commit a526dfc9ae21a91304f50dddece178ac88dfa240
+Merge: fe4aae51 2686dcaa
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Dec 13 16:25:42 2024 -0800
+
+ Merge branch 'master' into autounravel.
+
+commit f99492aa23fa11459d7f347d12cc6fcb3e8101f2
+Merge: fe4aae51 607b655e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Dec 13 16:19:53 2024 -0800
+
+ Merge branch 'master' into autounravel.
+
+commit fe4aae5163c8584a9995357b33721df9c159c69e
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Dec 13 16:11:13 2024 -0800
+
+ Remove .vscode/c_cpp_properties.json
+
+commit 2c34fbcaf9d487f6fd7a9299649dbc9f76860e83
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 12 23:27:22 2024 -0700
+
+ VCPKG: Bump vcpkg baseline version.
+
+commit 607b655e99a4c7e18a90fc175108cc3b7ea55890
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Dec 11 11:37:00 2024 -0800
+
+ Optimize integer mod.
+
+commit 5d546e33962e18cabebc274649bfa02d7ea9ef8f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Dec 11 11:26:15 2024 -0800
+
+ Fix typos in manual.
+
+commit 4cc5c30100c16bfc28be5a77302b3e2b81ce266b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Dec 9 15:40:23 2024 -0800
+
+ Add 1D rational array ops.
+
+commit 2686dcaa7c72b9cf53065f331b66697c9b308158
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Dec 10 00:23:24 2024 -0700
+
+ BUILD: Remove asy-keywords.el from the list of required files in build-asymptote.ps1.
+
+commit 329c0d13295f6bafa7599d0144c60f64d564d26f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 9 21:18:15 2024 -0700
+
+ CMAKE: Re-enable generation of misc files in msvc/release-with-external-doc-files preset.
+
+commit 57a934a9323fb2b67cb417eacf08d41a0bcfde0b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Dec 7 12:02:29 2024 -0800
+
+ Fix last revision.
+
+commit 893121595d45be4ef40f2c0d1509587f7fffa680
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Dec 5 08:49:02 2024 -0800
+
+ Use mask to mod against non-negative powers of two.
+
+commit 875384fae1f19cce4f91a66a56ffc9b687408173
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Dec 6 17:45:44 2024 -0800
+
+ Translate opsymbols.pl to python.
+
+commit 0e4e1916478201f9e720a0e4b09c097fefa59785
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Dec 6 16:22:01 2024 -0800
+
+ Migrate findsym.pl to findsym.py.
+
+ Tested: I used a logging statement in the original `findsym.pl` to check
+ that all of the files written by `findsym.pl` followed the pattern
+ `*symbols.h`. I then checked that after the change, the resulting files
+ differed from the originals by a single character (since the comment now
+ cites `findsym.py` rather than `findsym.pl` as the source). The sole
+ exception was `opsymbols.h`, which had no changes at all since it is
+ generated by a different script.
+
+commit 5f99d1f2944e784ca295ba75055c3f50f5bc2d59
+Merge: 96e6e392 d3003d15
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Dec 4 22:31:03 2024 -0700
+
+ Merge pull request #502 from vectorgraphics/add-el-files-to-asy-win-setup
+
+ Add asy-{init,mode,keywords}.el, and other build enhancements
+
+commit aa2caec3d96bfd7de9d4b62d8fc04a74d33b256a
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Dec 4 17:49:07 2024 -0800
+
+ minor improvements to findsym.py
+
+commit 5ab20779f4e92121bc4a9d6c389336c427866297
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Dec 4 17:07:56 2024 -0800
+
+ minor code improvements
+
+commit ae7db8a3e5e023470bc69b5916f42154377d127c
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Dec 4 15:44:04 2024 -0800
+
+ Remove the empty addFunctionOps functions.
+
+commit f5109f1f8320501563c8683e1045be937321c1d7
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Dec 4 15:00:15 2024 -0800
+
+ Draft of findsym.py.
+
+commit d3003d1596199bbce6bcc3c237964496aae36730
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Dec 3 21:47:30 2024 -0700
+
+ CI: Add misc files to linux asymptote package.
+
+commit ec649e1c20cd59afe7eb25111fdb175ac71e9e45
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Dec 3 16:34:17 2024 -0800
+
+ Convert asy-list.pl to a python script.
+
+ The comments and python code were originally generated by AI based on
+ the original asy-list.pl code; however, both were subsequently checked
+ and modified by a human to improve both Python coding style and accuracy
+ to the original script.
+
+ The change was tested by comparing the output of `make asy-keywords.el`
+ before and after the change. The resulting files are identical except
+ for the comment naming the generating script, which was originally
+ asy-list.pl but is now asy-list.py. Thus, the two output files differ by
+ a single character.
+
+commit 5818d9f7e360461ffb55e503d72a94512eb5b44c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 03:56:35 2024 -0700
+
+ CI: Download built misc files during asy installer packaging step.
+
+commit ffa285470d210fb0f5f28b28477970670bfe3a33
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 03:56:13 2024 -0700
+
+ CI: Add building of misc files to build-asy-windows workflow.
+
+commit dfbe364cb41f544f1b6675ce517bfc831797b427
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 03:53:50 2024 -0700
+
+ CI: Add building of misc files to build-asy-linux workflow.
+
+commit 032fb674b1c4bcb7dca918c7ce4977cb2a7f00dc
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 03:13:09 2024 -0700
+
+ BUILD: Add asy-keywords.el to required external documentation files in build-asymptote.ps1.
+
+commit 5869d017c3b3405537f6004a37ff0ee2be3dbe66
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 03:11:55 2024 -0700
+
+ CMAKE: Add ENABLE_MISCFILES_GEN variable to CMakePresets.json.
+
+commit 3ced15a05ad2e6ae76285131ad9c97bf6b74bf08
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 02:51:34 2024 -0700
+
+ MAKE: Update asy-keywords.el generation to use asy-list.pl's arguments.
+
+commit b41ccb0ff2240eed1b0d1f48c5c5a9afecff935a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 02:46:00 2024 -0700
+
+ CMAKE: Add misc files to win32 install target.
+
+commit 13981466588ab32c849bb7ae44cb9a3d36c230a0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 02:45:46 2024 -0700
+
+ CMAKE: Add build scripts for asy misc files.
+
+commit b79ad0b67393e8133de59284430c389512b418a0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 02:45:20 2024 -0700
+
+ BUILD: Add long options to asy-list.pl.
+
+commit c356d4b62e9e22b1b0a3444bb7426fb7ecce5a07
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 02:44:34 2024 -0700
+
+ BUILD: Add script to generate asy.list.
+
+commit 49e1b645e4bdeddbbbf39568b8556faf39368318
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 01:09:51 2024 -0700
+
+ BUILD: Modify build script to use asydoc directory as destination.
+
+commit 7571acfb3b797be4656c81b8c8ca03029d86ec2f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 00:39:07 2024 -0700
+
+ DOCS: Update install documentation to use asydoc.
+
+commit e45c3fca19b73996ca49128b727a2544b6673cea
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 00:38:56 2024 -0700
+
+ CI: Change download path for asymptote.pdf to asydoc.
+
+commit 74fb29f0cdd9ee515da3b3ce5fa4336d5a23e7bc
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 00:37:41 2024 -0700
+
+ CMAKE: Change external documentation dir to asydoc.
+
+commit b7d068d67ae0e5ae2b6af143942771bb8c445e43
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 2 00:34:35 2024 -0700
+
+ CMAKE: Add base/asy-{init,mode}.el to windows setup file.
+
+commit 96e6e392693227cce3afd1077d7db8de822c790c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Dec 1 20:16:14 2024 -0800
+
+ Share asy-keywords.el with MSWindows build.
+
+commit e81d98429fd814b7e20f659c6d6215aca446d4ef
+Merge: 8a21f0a9 be02adf7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Dec 1 20:00:50 2024 -0800
+
+ Merge pull request #500 from vectorgraphics/initPosition
+
+ Initialize positions to nullPos.
+
+commit 8a21f0a96f53c7fa16b56e9a9433e48f56eb697a
+Merge: 327038c6 ce74561f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 1 01:25:25 2024 -0700
+
+ Merge pull request #501 from vectorgraphics/fix-py-linter-dec-2024
+
+ CI: Fix non-GUI python linter CI workflow.
+
+commit ce74561ffec3089afc132d730acae7cf1e836b89
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 1 01:10:35 2024 -0700
+
+ CI: Add remarks to check-if-non-gui-py-files-changed step.
+
+commit 62ebc749f667c6e637d9266feb0883d11c807efe
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 1 00:36:29 2024 -0700
+
+ CI: Fix non-GUI python linter CI workflow.
+
+commit be02adf7f2b42a22ead3351e748a2d7b7e45d6f5
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Nov 30 13:01:21 2024 -0800
+
+ Initialize positions to nullPos.
+
+commit bbd0a7eded35877813b3e820ee707a141d876ce2
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Nov 30 09:14:49 2024 -0800
+
+ Use C++17 for static analysis tools in vscode.
+
+commit 327038c6f3df340087bd78951d594cba442d7f27
+Merge: cb9b4c58 1dfce308
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 29 03:03:00 2024 -0700
+
+ Merge pull request #499 from vectorgraphics/additional-ci-linter
+
+ Add linting of non-GUI python files to precheck.
+
+commit 1dfce3088bebd74a56620fb8f8726aef57bfc661
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 29 02:42:19 2024 -0700
+
+ PY: Add documentation for CompileOptions.
+
+commit def2504af370f822c1ac2aa752b5f9c74eba9c91
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 29 02:03:51 2024 -0700
+
+ CI: Add linting of non-GUI python files to PR precheck workflow.
+
+commit 7a5c5a2a00cd27bce7d8b4b77806eaa7a1ff0906
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 29 02:01:32 2024 -0700
+
+ CI: Add workflow files for linting non-gui py files.
+
+commit 33c5a8b5f928ca8df3ed4428a79b808ac919a2a7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 23:13:35 2024 -0700
+
+ SH: Add linting scripts for UNIX.
+
+commit 9912d518e3bbf9e3dd54391037baaa6ead23a230
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 23:11:33 2024 -0700
+
+ PY: Fix pylint issues on non-GUI python files.
+
+commit 240c57dc58aae72cd7a4d975385b4dd24539ed57
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 23:04:13 2024 -0700
+
+ PY: Run isort and black on non-GUI python files.
+
+commit f864e70cfd76b5e740aff0abf7d8335005c31114
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 22:52:51 2024 -0700
+
+ PS1: Add powershell scripts for linting python files.
+
+commit 4288d8b067fa7572d0332b2d852ba4e596687c09
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 22:49:10 2024 -0700
+
+ PY: Add script for getting lintable files.
+
+commit 671b2bb9d220b979f173a9e7cfcd56030a99d657
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 22:28:07 2024 -0700
+
+ PY: Add linter configuration files.
+
+commit 48410efdb75191c215765480a167f17b54544f73
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 21:04:06 2024 -0700
+
+ PY: Add requirements.lint.txt.
+
+commit cb9b4c5811c8f103c5dceab749441469b7f55ce3
+Merge: 595e0186 72ad028e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 28 21:21:46 2024 -0800
+
+ Merge pull request #498 from vectorgraphics/use-subrepo-for-cmake
+
+ CMAKE: Use subrepo directories for cmake builds.
+
+commit 595e018686102685fefdeaa34b2c268b021a9c0c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 28 21:17:53 2024 -0800
+
+ Increment version to 2.96.
+
+commit 72ad028e110b1c743d08366f7f79f152405d5fd0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 20:37:56 2024 -0700
+
+ CMAKE: Remove duplicates in arguments passed to gen_preprocessed_depfile.py.
+
+commit 5071e0457dc95a8956011ac460867a67a33f399b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 20:12:42 2024 -0700
+
+ Revert "temp! Add argument view to gen_preprocessed_depfile."
+
+ This reverts commit c22912e96803e244ed16a046e60ff49c4a7edade.
+
+commit c22912e96803e244ed16a046e60ff49c4a7edade
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 20:12:22 2024 -0700
+
+ temp! Add argument view to gen_preprocessed_depfile.
+
+commit 53ac190b36c6787a162f124279a804f2082d0c57
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 28 19:49:48 2024 -0700
+
+ CMAKE: Use subrepo directories for cmake builds.
+
+commit 9a07ab8822dffc63cece044327ceeb3b6e7d3ffa
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 28 15:37:18 2024 -0800
+
+ Support editline again.
+
+commit 38f95276550adbadad55b1efd8353f024289dec3
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Wed Nov 27 18:24:54 2024 -0800
+
+ Less hacky handling of operator init.
+
+commit d0d8fffb8f558cb5abb1f6da73dea5d8ede06000
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Nov 26 23:30:44 2024 -0700
+
+ FMEM: Bump fmem version.
+
+commit f8f653299cdf70166ad482ba2f3667e5d2ce564c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Nov 26 23:00:18 2024 -0700
+
+ BUILD: Deactivate python virtual env after build-asymptote.ps1 is done.
+
+commit 98c698f56e8e3936085d15d39759c12d74dfcc59
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Nov 26 16:10:44 2024 -0800
+
+ Fix type of Default in map.
+
+commit 02788a6129ec93a553919be7cb01750e78309e63
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Nov 26 14:11:18 2024 -0800
+
+ Add another test case for builtinOps.
+
+ This test case checks for the presence of operator== for a nested struct
+ as a field that can be unraveled from the outer struct. If builtinOps
+ were not autounraveled, it would fail without the second call to
+ addRecordOps in recorddec::transAsField.
+
+commit d679251f503d405bd2877c45b0a76ba0a27e594f
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Nov 26 13:54:39 2024 -0800
+
+ Autounravel modes; operator init hack.
+
+commit 75eccaccdea24d678607b9f49d29aece12bf03d4
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Mon Nov 25 19:31:21 2024 -0800
+
+ Use autounravel for operator init.
+
+commit 1b95781e8fb352875ea247d9ca7a4a5be4869850
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 25 08:52:36 2024 -0800
+
+ Remove test file that violates CTAN rules.
+
+commit 9b91f6fbd2bbe96391ebb81489efee2bbc5c9059
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 25 02:51:02 2024 -0700
+
+ BUILD: Force exit when build-asymptote.ps1 hits an error.
+
+commit 4608b094ab2e562924ed5c62ecdda0fe8fad6529
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 25 01:18:15 2024 -0800
+
+ Revert "CMAKE: Use subrepo clones of lspcpp and tinyexr."
+
+ This reverts commit 99f67caa4fd8847b46afa5b4a0b56180937e15ed.
+
+commit d9bea99d53ea1174ca5502fd7de8b95707c67364
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 23:21:05 2024 -0800
+
+ Force creation of asygl.js.
+
+commit 9e5941ba1bee7d1555b9aa51f37f639d4e1cbeb4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 20:30:06 2024 -0800
+
+ Support building LSP with or without GC.
+
+commit adb07aea26e7e89b7b600c8f2811fea64b10c22d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 17:45:44 2024 -0800
+
+ git subrepo pull --force LspCpp
+
+ subrepo:
+ subdir: "LspCpp"
+ merged: "220a861ca"
+ upstream:
+ origin: "git@github.com:vectorgraphics/LspCpp"
+ branch: "master"
+ commit: "220a861ca"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "???"
+ commit: "???"
+
+commit f240306af01490de4880237ba21eff585cb07e52
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Nov 24 15:34:03 2024 -0700
+
+ AC: Use LspBuild directory for buidling LSP.
+
+ The reason for this is CMake produces Makefile, which can collide with asymptote's main makefile.
+
+commit 9cef4211d6c32bfbd8f873210fba807fbf4096d5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Nov 24 15:33:22 2024 -0700
+
+ LSP: Support fully non-system GC for LSP build.
+
+commit 352c0eb471cb28737383c02d0c88b42a8729af51
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Nov 24 15:29:09 2024 -0700
+
+ git subrepo pull LspCpp
+
+ subrepo:
+ subdir: "LspCpp"
+ merged: "a0dda786"
+ upstream:
+ origin: "git@github.com:vectorgraphics/LspCpp"
+ branch: "master"
+ commit: "a0dda786"
+ git-subrepo:
+ version: "0.4.9"
+ origin: "https://github.com/ingydotnet/git-subrepo"
+ commit: "cce3d93"
+
+commit c3ab1a90771772789d09db6f24b63023e7049fad
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 14:08:06 2024 -0800
+
+ Simplify code.
+
+commit 99f67caa4fd8847b46afa5b4a0b56180937e15ed
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Nov 24 14:37:18 2024 -0700
+
+ CMAKE: Use subrepo clones of lspcpp and tinyexr.
+
+commit 2c6bf08923621793d8952dc5479ff453358edff8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 13:40:53 2024 -0800
+
+ Fix typo.
+
+commit 55858fd8cc663e3d8456731ab728a9b6116abf26
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 13:32:49 2024 -0800
+
+ Remove empty directory.
+
+commit ed77bdf43450365006b371ee8a9f911d7cb06eba
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 13:26:50 2024 -0800
+
+ Remove tinyexr workflow.
+
+commit 6ac8d5f4a74dc11159050141f971972aed70f926
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 13:21:17 2024 -0800
+
+ Update tinyexr workflow.
+
+commit b60de16bbdb4179f83019e94b2afc201dc188457
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 12:22:15 2024 -0800
+
+ Fully support --enable-gc again.
+
+commit 7e39f6c3c1ff8686459a2cc156318ab03ee8e7dd
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 12:19:31 2024 -0800
+
+ Remove .gitmodules from tinyexr; update make clean.
+
+commit bf929f7156987bae6bb4e4735ad23e547b9ffc53
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 11:51:05 2024 -0800
+
+ Use git subrepo instead of repeatedly refetching external repos.
+
+commit ab0560904b3afaef3ba251414bd598d85da8fad1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 11:20:20 2024 -0800
+
+ git subrepo clone --force git@github.com:syoyo/tinyexr
+
+ subrepo:
+ subdir: "tinyexr"
+ merged: "5fcb4dcb6"
+ upstream:
+ origin: "git@github.com:syoyo/tinyexr"
+ branch: "release"
+ commit: "5fcb4dcb6"
+ git-subrepo:
+ version: "0.4.6"
+ origin: "???"
+ commit: "???"
+
+commit f77e74c541f74dbd4ca1ef27b3e24d1aeb4115d2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 11:13:53 2024 -0800
+
+ git subrepo clone --force git@github.com:vectorgraphics/LspCpp
+
+ subrepo:
+ subdir: "LspCpp"
+ merged: "ecb49130a"
+ upstream:
+ origin: "git@github.com:vectorgraphics/LspCpp"
+ branch: "master"
+ commit: "ecb49130a"
+ git-subrepo:
+ version: "0.4.6"
+ origin: "???"
+ commit: "???"
+
+commit 8d59161a58971df2ca96354c564ab49c47beefef
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 24 10:50:52 2024 -0800
+
+ Move external directories to top level source directory.
+
+commit f6ca24a5936f2b768fd206c4196fdab8e5a33c95
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Nov 23 21:58:14 2024 -0800
+
+ Fix include.
+
+commit ff6b7f0b0483c2d63ff5067f78e8ed45a82864b1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Nov 23 21:19:47 2024 -0800
+
+ Reorganize INSTALL-VCPKG.md.
+
+commit 5ed6b9926984a4536ee34617f40fb4033db40c13
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Nov 22 15:13:42 2024 -0700
+
+ AC: Support GC with LSP build.
+
+commit 2bdc2a96b220ed5ba4897cc42d51cf6c41d5ad04
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 22 15:05:34 2024 -0700
+
+ AC: Fix compilation with gc and vcpkg in makefile.
+
+commit 7d5507ebdc7ee29b3878de529892957150e5534c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 21 21:48:18 2024 -0800
+
+ Add missing separator.
+
+commit 1ceb7541e680a9395eaf72d22ef1399bfbc4d17a
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 21 21:40:00 2024 -0800
+
+ Read revision for asy-keywords from version.txt.
+
+commit 8c33742e767cb7adcca48412bd9d24d23c655028
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 21 21:33:05 2024 -0800
+
+ Revert "Build asy-keywords.el at the same time as version.asy."
+
+ This reverts commit 8d1ee04795b046813768e7dce91e907e7a0fd141.
+
+commit cb59fd1bff20f11a87825762424d71fb54a07f1e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 21 21:11:21 2024 -0700
+
+ CMAKE: Use "CACHE INTERNAL" option for configuring subprojects.
+
+commit a14e1f0e5008844fdba824eecc65be154f37029b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 21 09:47:54 2024 -0800
+
+ Reinstate INSTALL.
+
+commit 8d1ee04795b046813768e7dce91e907e7a0fd141
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 21 09:44:00 2024 -0800
+
+ Build asy-keywords.el at the same time as version.asy.
+
+commit 7e3e493700c6796fbc4d88d24d2d46a12bbfee91
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 21 09:30:47 2024 -0800
+
+ Fix #495: glitch in Makefile.in.
+
+commit 2dd68b5960b6d58ca76feb4cccdd09dbddedd00d
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Nov 21 09:28:57 2024 -0800
+
+ Add comment documenting possibly unneeded line.
+
+commit 0573715db1b57fa01bbcf4a4ad8253fdc880300d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 18 15:14:21 2024 -0800
+
+ Simplify code.
+
+commit da097adec020c68da722c9421ca019353b5787b4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 18 14:42:21 2024 -0800
+
+ Support --disable-gc again.
+
+commit 7084c2abde5d3a142a969e69691e9cacfb35626a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Nov 17 23:00:17 2024 -0700
+
+ CMAKE: Bump minimum required version to 3.27.
+
+commit 9b6f0329c8f3e17e1741ea77d535a952ed3ca1d9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Nov 17 22:44:56 2024 -0700
+
+ CMAKE: Append /gc to gc's include paths.
+
+commit 7d7c0158adc0874fb355bde7c868033a6dbd4852
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 17 14:36:27 2024 -0800
+
+ Hardwire gc include directory for CMake.
+
+commit 8ee400f9a29353434b543103b20cb07c73a2a7b6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Nov 16 23:52:09 2024 -0800
+
+ Remove unknown pragmas.
+
+commit 0c8b655686dc1463d87a9287e22111a582e0e8f6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Nov 16 23:46:38 2024 -0800
+
+ Fix include paths to Boehm GC header files.
+
+commit 830d26d541817aba995c8526c869cab3744c76d2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Nov 16 23:20:54 2024 -0800
+
+ Disable LSP again if libboost is unavailable.
+
+commit a1c5eaa4bd770bff5cba9dec17d278b0b3ff4823
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Nov 16 23:06:33 2024 -0800
+
+ Support sigsegv again.
+
+commit 69ee1515ede63df109e14fe49d2d4009b4791727
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Nov 16 22:59:24 2024 -0800
+
+ Use consistent formatting.
+
+commit 2696886e8fbd49af2ca113fdb29b46169366f58b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Nov 15 10:45:48 2024 -0800
+
+ Fix #494: Ignore missing PyQt5 module.
+
+commit cbbcfd2335a02654acd333f5ff89302586960720
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Nov 15 10:41:35 2024 -0800
+
+ Fix #493: qualify fpclassify namespace.
+
+commit cb1a3c9e29cca940f08c9fd2527649a8fa108fab
+Merge: efb5c8d2 fd4d0019
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Nov 15 10:37:26 2024 -0800
+
+ Merge pull request #492 from vectorgraphics/fix-misc-asy-build-issues-293
+
+ Fix additional windows build issues in 2.93
+
+commit fd4d0019b976c8a66db11a7ec85746a4f987763b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 15 03:07:31 2024 -0700
+
+ BUILD: Copy setup file before moving to main directory.
+
+commit 733b4f08b45a0f4c819d290c23cc6480b814a8c3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 15 03:04:35 2024 -0700
+
+ BUILD: Add "-Force" option to Copy-Item for copying documentation to extfiles.
+
+commit efb5c8d2e7fc8b621967fd390e0481e6b18fd6ba
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 15 03:03:13 2024 -0700
+
+ CMAKE: Clarify option for offscreen-rendering.
+
+commit b368dcd8473a66e1048b612865ea56252e9bf013
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 15 02:08:51 2024 -0700
+
+ CXX: Add remark to glew.c.
+
+commit 50f47b6ed5566fb3c3ad1edce4f4a4819bf99225
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 14 09:29:09 2024 -0800
+
+ Support --enable-offsreen again.
+
+commit 31a9f922690fbfb88539d80ea5913d1061c8ec41
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 14 01:26:59 2024 -0700
+
+ BUILD: Copy existing documentation files to extfiles directory.
+
+commit a7e55b1bd81a53dbdbbe8de74d198f6291b9def4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 14 01:25:00 2024 -0700
+
+ BUILD: Remove deletion of existing asymptote directory in build-asymptote.ps1.
+
+commit 4a81317bc9937c553ac1ca25de67b27c54d83820
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Nov 14 00:24:25 2024 -0800
+
+ Increment version to 2.95.
+
+commit d851f9c6a85fbc1b5497b9abb6f589d12e1e2c0f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 14 01:18:21 2024 -0700
+
+ BUILD: Clear CMakeCache.txt before building in build-asymptote.ps1.
+
+commit 7c3e653852ca09a30bc072de69d9ce626f496b61
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 14 01:10:21 2024 -0700
+
+ BUILD: Copy setup file to shared directory once build is done for windows build ps1 script.
+
+commit 2d9aa810ecdf52492f98298cdcb6e319e28891e1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 14 01:05:42 2024 -0700
+
+ BUILD: Restore asygl's regex in determine_pkg_info.py.
+
+commit 3f9cf39aff16ba816039425cff697f8cad62f07c
+Merge: a3479bbd 4ce9ccfc
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Nov 13 22:01:15 2024 -0800
+
+ Merge pull request #490 from vectorgraphics/fix-mac-compile-2-93
+
+ Fix compilation issue on macOS
+
+commit 4ce9ccfc38cfe6ddf291074fab2acf235b14ed98
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Nov 13 22:07:06 2024 -0700
+
+ Fix Makefile.
+
+commit 2b70c29fc590dcdda2136ba2caca1898ffdcda83
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Nov 13 21:54:49 2024 -0700
+
+ Fix BUILD_ROOT_DIRECTORY.
+
+commit 59868dd70d7082e7417e54d48fe7a6da9c5f706d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 21:40:45 2024 -0700
+
+ BUILD: Fix determine_asy_pkg_info in determine_pkg_info.py.
+
+commit f97a50097c5701c0556d7cfbe3f32617b4e2b1ad
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Nov 13 21:33:48 2024 -0700
+
+ Back port to Python 3.7.16.
+
+commit a3479bbd6155497cb1fd237106bf769557578818
+Merge: 952e74a7 db6d3a50
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 19:25:27 2024 -0700
+
+ Merge pull request #491 from vectorgraphics/re-enable-lsp-windows
+
+ CMAKE: Re-enable LSP option on windows
+
+commit db6d3a50465474ed5e449c876f17ece869590a2a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 18:36:53 2024 -0700
+
+ CMAKE: Re-enable LSP option on windows.
+
+commit 2c1af56fb4b3c762680f2f3aac1c4072dec685ed
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 18:25:43 2024 -0700
+
+ MAKE: Add quotation mark to CXX variable for GEN_PREOROCESSED_DEPFILE_BASE_ARGS.
+
+commit 952e74a73090dd068ec4e6e9f10da94e82f2f747
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 18:22:05 2024 -0700
+
+ CI: Fix asy test regex.
+
+commit 8cd541dbd016692d47f598b5b1e02d14860134d2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 18:57:29 2024 -0700
+
+ CI: Run "apt-get update" before installing ghostscript.
+
+commit 71b411f18125db9124600bf758d3c5527439bf6d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 18:48:04 2024 -0700
+
+ CI: Add ghostscript to windows testing CI.
+
+commit 905c39b50b4bb8dfbb122160866473e25413bf7d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 18:46:16 2024 -0700
+
+ CI: Add ghostscript to linux testing CI.
+
+commit f65ed9a703536aebefc5d98c9831e83107c43753
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 18:17:27 2024 -0700
+
+ ASY TEST: Add asy.gs.ghostscript test.
+
+commit 16b5bd459515d84c75fb176f1ddfa522ae95d5ab
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 18:17:17 2024 -0700
+
+ ASY TEST: Add -noV option to testing.
+
+commit 90b7efa5859f86075c8b2be9f549f8902dc5ee4f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 13 18:04:28 2024 -0700
+
+ REPO: Add tests/out and tests/out.* to ignore list.
+
+commit 3b4f20c856a19e244371f7ea3b9663a6409806a9
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Nov 12 18:53:10 2024 -0800
+
+ Address pull request #482.
+
+commit d693f5f9928c84170ca23433abe548c848506fe0
+Merge: db52be09 fa4774e0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Nov 12 18:49:48 2024 -0800
+
+ Merge pull request #483 from ccworld1000/patch-2
+
+ fix endl
+
+commit db52be09a81e2f48c6322db4e8919e51be9727fa
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 23:22:05 2024 -0800
+
+ Remove unused file.
+
+commit 8fbdf7a261417b40e7ddc26c5bf41c3941f0c6e2
+Merge: 7cfedab7 d95f595e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 21:15:07 2024 -0700
+
+ Merge pull request #488 from vectorgraphics/add-cmake-wce-testing
+
+ Add wce testing to CI & cmake testing
+
+commit d95f595e6c4d19b03c8577c874606922f09878dc
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 20:56:50 2024 -0700
+
+ CI: Add wce test to CI.
+
+commit a1ccc29f8074ee4660aec18e89e070b2897ad1c8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 20:53:14 2024 -0700
+
+ CMAKE: Add wce test for cmake build.
+
+commit 7cfedab72409c4c36ac6c100aadbe167f9ef32cb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 19:16:33 2024 -0800
+
+ Increment version to 2.94.
+
+commit 594ea5fabff99216b9795606227685db3a9be285
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 15:50:43 2024 -0800
+
+ Update required setuptools version.
+
+commit c5e597d1a17127cf21d582c5c57d970d205c251f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 15:44:05 2024 -0800
+
+ Fix Makefile.in.
+
+commit a4d12d852e288d66e43d24ec88e2cb6b562fdacd
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 15:24:39 2024 -0800
+
+ Fix missing dependencies.
+
+commit a0bfdd5d73dac863577608e2115c35d8002b0d97
+Merge: ce2dfa5d 5839f005
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 12:50:41 2024 -0800
+
+ Merge branch 'msvc-support-make'.
+
+commit 5839f005305446aa51b0efe364305650261eb62f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 13:48:57 2024 -0700
+
+ MAKE: Re-add tests/Makefile.
+
+commit ce2dfa5d76eef26877862a81fbfa4283032e6fc6
+Merge: 34eb2703 cfa4b387
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 12:49:00 2024 -0800
+
+ Merge branch 'msvc-support-make'.
+
+commit cfa4b387ffd690863a55b97660a7f4a6120ec855
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Nov 11 13:47:33 2024 -0700
+
+ WCE: Set +x on wce.
+
+commit 3424862ad2f7b2f33ce2e85682bca20a514bafe4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 13:46:53 2024 -0700
+
+ MAKE: Move wce back to root directory.
+
+commit 34eb2703642123f9886b673a8a9f5743afe3292f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 12:44:42 2024 -0800
+
+ Restore example.
+
+commit 3e030884510819477e9588fecd4285cfb52aae8e
+Merge: 54955c5a e0ee47fb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 12:41:39 2024 -0800
+
+ Merge branch 'msvc-support-make'.
+
+commit e0ee47fbdf08281be6523806094a599e53e71c68
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 13:41:11 2024 -0700
+
+ MAKE: Add xasy to asy target.
+
+commit 54955c5af723b2a8e7812f039b5b5b4e57099773
+Merge: ac9dad0e dd281a48
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 12:39:38 2024 -0800
+
+ Merge branch 'msvc-support-make'.
+
+commit dd281a4806fdd7f9185ea72415070cb0b08031b1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 13:36:55 2024 -0700
+
+ GUI: Fix path import for GUI symlink.
+
+commit ac9dad0e9e1b28a2ad7e6d2dee8e926057beaa9b
+Merge: 6df88fac b9e744cf
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 12:29:16 2024 -0800
+
+ Merge remote-tracking branch 'origin/msvc-support-make'.
+
+commit b9e744cfd9a08c4e404ab598d9a27a6e8fa0b319
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Nov 11 13:21:56 2024 -0700
+
+ XASY: Set +x flag on xasy.py.
+
+commit 57f7f976a57a89a8db910e95c1101cbe7b305e5f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 13:19:21 2024 -0700
+
+ GUI: Add current path to xasy.
+
+commit fca87415bc500f291ece76784679fe35e23bfee7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 13:06:03 2024 -0700
+
+ BUILD: Use top-level directory for acextlibs.
+
+commit e9560ad9219d19bd21874307bf6141f2d4618444
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 13:04:59 2024 -0700
+
+ BUILD: Use master ref from vectorgraphics/LspCpp.
+
+commit bfc3ac9c3b67462f09f443e94ebb0a31f7002e1f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 12:53:19 2024 -0700
+
+ XASY: Remove development helper script as it is not needed anymore.
+
+commit e9f7894121d562a3c703f6f28767a6f53afc782e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 12:46:58 2024 -0700
+
+ XASY: Exclude additional dev files in build-asymptote-installer.py.
+
+commit 1c51e2dff7f6aef2d4df84622d80dbebf82c5730
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 12:45:43 2024 -0700
+
+ XASY: Fix import for xasy.
+
+commit ae5b388cd7751401880612f4e5c2f4326d63322d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 12:41:33 2024 -0700
+
+ Revert "XASY: Move xasy files and imports for compatibility with PEP 517 packaging system."
+
+ This reverts commit 51f58653
+
+commit b2b251eab5c4f09286c683392643cc7e1cf25783
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 11 12:40:17 2024 -0700
+
+ Revert "GUI: Fix xasyTransform import."
+
+ This reverts commit 0c70a3135124788c5faa805f75e0be328be7327b.
+
+commit 6df88faca807a0dc4d8041c43ffee0d59e750115
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Nov 11 10:23:38 2024 -0800
+
+ Remove obsolete build script.
+
+commit 7e6ad89e9fbacd3c059632dfb4d84586421c15c1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 10 13:30:51 2024 -0800
+
+ Standardize formatting.
+
+commit d18983c5fe851b71f8aeb574389317cc67655e84
+Merge: 21d1648f dab310c0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 10 13:11:43 2024 -0800
+
+ Merge branch 'master' into msvc-support-make.
+
+commit dab310c018630fb21701e9b1d62c7cf1c701d580
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Nov 10 12:58:41 2024 -0800
+
+ Fix #486: use PACKAGE_NAME, PACKAGE_VERSION, and PACKAGE_BUGREPORT.
+
+commit 21d1648f58cfa801f05f0fb0a702012acfa96f27
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 21:42:19 2024 -0700
+
+ BULID: Fix win32-pre-nsis-installer's latexusage.tex.
+
+commit 2a1172adcee3695969d55ed31096795e538a83e7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 21:40:42 2024 -0700
+
+ REPO: Add additional remark about cmake-build-msvc/release.
+
+commit 9359f5fcdd5522e32a09c19522fd06aa4150bc97
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 21:33:36 2024 -0700
+
+ REPO: Use current asymptote dir for windows building script.
+
+commit 55222099ae2614a623b3dd1e3b4f9e748f532bd6
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 21:33:22 2024 -0700
+
+ REPO: Add additional files to ignore list.
+
+commit 424a670db2f12b4a6cf1c758e9f853364914d325
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 21:12:52 2024 -0700
+
+ REPO: Add tools-cache to ignore list.
+
+commit 697604fcc34555930a8a976eb6a43fd5a3a0ba7d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 20:55:51 2024 -0700
+
+ BUILD: Install remaining documentation files to examples/ directory on windows.
+
+commit e557e44ad22e1040126e13599c61ce7ab564feaa
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 20:52:54 2024 -0700
+
+ BUILD: Move ASY_DOC_ROOT to basic-parameters.cmake.
+
+commit 3336ed8ca36cf9c4341bb28c2127c721ab95cc1a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 20:34:12 2024 -0700
+
+ BUILD: Replace latexusage.pdf's inclusion with extra doc files.
+
+commit 9e3ff98ac897e5a645451c82f0993c9d62c9c26d
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Nov 9 17:39:45 2024 -0800
+
+ Test double-shadowing when only first shadow is allowed.
+
+ An implicitly defined autounravel function like 'alias' is allowed to be
+ shadowed. However, if the (explicitly defined) replacement is itself
+ shadowed with another autounravel function, that should produce an
+ error.
+
+commit 0d5b2220bdb63583c175c3d49ec04cfe2b25b2c5
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Nov 9 17:32:31 2024 -0800
+
+ Test compiler errors for autounravel.
+
+commit 10248a12f9c6db810da18bd2e70f33d97c20eee4
+Merge: 0c70a313 03587f0f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 18:15:11 2024 -0700
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 94bac8ba470dbba54e90fbc92c4ed07aebd5f3e7
+Merge: 16d05bc2 03587f0f
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Nov 9 17:13:48 2024 -0800
+
+ Merge branch 'master' into autounravel
+
+commit 16d05bc27f01688969e2f616c78a94dcf6ff9154
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Nov 9 17:09:30 2024 -0800
+
+ Move functions from .h to .cc file.
+
+commit 0c70a3135124788c5faa805f75e0be328be7327b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 17:46:53 2024 -0700
+
+ GUI: Fix xasyTransform import.
+
+commit 522152e8384a400257a1f9dde7d12d951866f014
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 17:44:11 2024 -0700
+
+ GUI: Remove cgitb.text import.
+
+commit 65b51981fdd6524d0dc1217172a4e32abd40c531
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 9 17:27:49 2024 -0700
+
+ REPO: Add .python-version to GUI's ignore list.
+
+commit d3e10f087c22ad99db20c1cd8708f648c731bce6
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Nov 7 19:52:58 2024 -0800
+
+ Make alias shadowable to fix error.
+
+commit 955a0b4ed6a5c385fc9c556e6e4015fbb2ba2ef0
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Nov 7 19:46:23 2024 -0800
+
+ Error if one autounravel field cannot shadows another.
+
+commit fa4774e06f1f9f2f34af2780c38ee31c4877eb12
+Author: CC <ccworld1000@gmail.com>
+Date: Fri Oct 25 10:31:49 2024 +0800
+
+ fix endl
+
+ fix endl
+
+commit 699627ed39cb8d135a790159c74d9b6fd5461c04
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Oct 24 18:57:54 2024 -0700
+
+ Autounravel builtin operators; control autounravel order.
+
+commit c407cd81c7baf149474f6c7fb7072fe702bf3402
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Oct 24 18:15:49 2024 -0700
+
+ Add test for builtin operators.
+
+commit 05cc3ffab5340e551251f9074c12b43beb9f7548
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Oct 12 19:53:25 2024 -0700
+
+ Fix behavior when multiple fields autounraveled.
+
+commit 03587f0fbdb5b203780186a6c3410d767a4083c3
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Oct 8 10:32:57 2024 -0700
+
+ Increment version to 2.93.
+
+commit 9ed0a02a09524bec5add75a13151c36bc742fe8f
+Merge: 730570ca d773ca31
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Oct 8 02:36:06 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 730570ca070fe034123b7dc55f80f49e332413ca
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Oct 8 02:35:11 2024 -0600
+
+ XASY: Fix passing in additional asymptote args.
+
+commit 8bc6dcf14a559d74f28f5af248070349d9c88eac
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Oct 8 01:13:11 2024 -0600
+
+ VCPKG: Bump vcpkg baseline.
+
+commit d773ca31bd669e51263748c9e08324f985b31f95
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Oct 7 10:43:36 2024 -0700
+
+ Improve build-asymptote paths.
+
+commit c89a69a2fbfb0d67590bf000cf2c0a89a68610ad
+Merge: f44f70c6 be6cde32
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Oct 3 21:46:49 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit be6cde3282da117e7dee66f2f6ed269fe66fec91
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Oct 3 20:46:04 2024 -0700
+
+ Prebuild pdf and info files for all source releases.
+
+commit f44f70c60d26e8fe05eeb3dbaa185d3bdffb8823
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Oct 3 21:36:44 2024 -0600
+
+ BUILD: Copy dll files to CTAN output directory as well in build-asymptote.ps1.
+
+commit 0876ddee80b7143a5a7d6deaa15969df1de71e25
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Oct 3 20:26:45 2024 -0600
+
+ BUILD: Use ASYMPTOTE_BUILD_SHARED_DIRECTORY for detecting extfilesRoot path.
+
+commit 66b0f9dff50e125798e251b5f4b6da6728e974cb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Oct 3 20:25:28 2024 -0600
+
+ BUILD: Use ASYMPTOTE_BUILD_SHARED_DIRECTORY for outputting CTAN file.
+
+commit cbc265c1590e8818185ccce341b15766bee29c47
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Oct 1 22:10:11 2024 -0600
+
+ BUILD: Fix installation of external documentation files.
+
+commit dbeb75375392f9f5967c3f3cd867206e1e4cdb5d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Oct 1 22:06:33 2024 -0600
+
+ CI: Add trailing slash to extfiles during package-asy-install.
+
+commit 25eeeb5472cfcb7e5b372a8125c3be30453ed6fd
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Oct 1 22:03:05 2024 -0600
+
+ CI: Reconfigure linux with version override information during docgen.
+
+commit 4d95214e46d2c0a4b9748727111e2311faf6b9cf
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Sep 30 20:20:38 2024 -0700
+
+ Remove duplicate error messages.
+
+commit 825eeda1ddb8a58e609283359d0756d143541ab4
+Merge: 6a080594 82c919fb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Sep 30 19:57:32 2024 -0700
+
+ Merge branch 'master' into autounravel.
+
+commit 6a0805946a28c07e7aa0a4a23b56a978d9fd56c8
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Mon Sep 30 19:30:29 2024 -0700
+
+ First draft autounravel doc.
+
+commit 99efd94d4dddf0344e8953b1783099e2850377d0
+Merge: 14cc566d 82c919fb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 29 23:42:19 2024 -0600
+
+ Merge remote-tracking branch 'origin/master' into msvc-support-make
+
+commit 14cc566d926c8ab1a94ebe7f4904fe8c6a08cca2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 29 23:40:43 2024 -0600
+
+ W32: Use checkShellExecuteResult to check displaying files outside help.
+
+commit c9f89d622e195bfca39a6d7d9417b642de68f61b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 29 23:40:13 2024 -0600
+
+ W32: Use ShellExecuteA to display asymptote help file in windows if default viewer is not given.
+
+commit 6014d9534f43dbe6308f9e247c5f02862977dcd1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 29 23:39:47 2024 -0600
+
+ W32: Add helper function to validate ShellExecute/ShellExecuteEx's result.
+
+commit 5e27fa3aac41004543bd92fa0e5b7a2c5f6fe07a
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Sep 28 17:42:20 2024 -0700
+
+ Do not autounravel a type whenever a variable of that type is declared.
+
+commit 65c90bff5ee57f07f121acc3ffeb717530d5f9c1
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Sep 28 17:25:34 2024 -0700
+
+ Error if autounravel used for type or at top-level.
+
+commit 38c56442f50eb5c0663410f4d8fd7b2355fd5346
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Sep 27 16:54:54 2024 -0700
+
+ Test autounravel function.
+
+commit e810b68cee2c9e207d5d8f1522ed66f67bb36737
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Sep 27 16:47:01 2024 -0700
+
+ Apply autounravel modifier to unravel declarations.
+
+commit 5dbc7395767284422e24bd0ff17fad6cff0d7cb5
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Sep 26 19:59:07 2024 -0700
+
+ Delete some commented-out code.
+
+commit 40b26820200d6308547cb999f1eb707e841ccdd1
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Sep 26 19:55:53 2024 -0700
+
+ Autounravel fields of type added via unravel.
+
+commit 28725aa82924b65d3724d13f2924c8cb7c218b48
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Sep 24 16:02:34 2024 -0700
+
+ Passing tests for autounravel parametrized type.
+
+commit 42ce1177890d9d1e4ab74d9e3152b2b172411839
+Merge: 47a6c8e5 604e0e09
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Sep 24 15:23:04 2024 -0700
+
+ Merge branch 'master' into autounravel
+
+commit 82c919fb26d44f80ddf13b1b9b5f19f023ca4fd7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Sep 22 20:58:05 2024 -0700
+
+ Fix revision efc15f4d3cf0f2891ac944d9d0fa3f57a8966fdb.
+
+commit ff1c616e8592e130e90f2a50ef3d6d8e676a71be
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 22 14:04:58 2024 -0600
+
+ BUILD: Enable usage of installed NSIS if present.
+
+commit 88a0a7bd733c84a496257c4b0d4cdb2065798345
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Sep 18 09:24:29 2024 -0700
+
+ Exit gracefully with "qualifier is not a record" instead of aborting.
+
+commit 85f29c2f9d0887f3e08e1c21ea75948a76e5080f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 15 00:54:47 2024 -0600
+
+ BUILD: Determine version automatically in build-asymptote.ps1 for windows.
+
+commit d83a6d34afbc80bfb67feda456f6b6e8d3e09524
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Sep 14 22:41:54 2024 -0600
+
+ CI: Fix determine_asy_version CI stage.
+
+commit 8cc0d0a551c50998bee03e891f0aa52f1097e00b
+Merge: 24679056 c1c5f761
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Sep 14 22:40:28 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 246790569fe2e0ef1c6c3c069991f74595adfcd9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Sep 14 22:36:20 2024 -0600
+
+ CI: Use python script to determine asymptote version.
+
+commit af02da8c4e3c71b9f52a4042bbf449eb5f20f826
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Sep 14 22:35:10 2024 -0600
+
+ PY: Add script to determine asymptote version.
+
+commit c1c5f7613f02b5407a6fdb28674c2ba5edad4a01
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Sep 13 22:42:32 2024 -0700
+
+ Update documentation about ignored shipouts.
+
+commit c2422a927a23cd61268ee927767aab84b2881790
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Sep 13 22:36:38 2024 -0700
+
+ Account for format when ignoring shipouts that would duplicate implicit shipout.
+
+commit 0ce3edd07f471de6697ed9cdf1f0a9021426b2f5
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Sep 7 13:37:32 2024 -0700
+
+ Compute topPos only when needed.
+
+commit 32ee049fcefa99e6ec8361435d2ed10dea139032
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Sep 7 13:34:17 2024 -0700
+
+ XASY: Fix xmap regexp.
+
+commit 93b8e40f12338ea68ae0de061d679712a7f88941
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Sep 3 19:28:50 2024 -0700
+
+ Check for valid clipping planes.
+
+commit 47607f3af7889a75a0ef129313f9ca6b582546ad
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Sep 3 21:58:46 2024 -0700
+
+ Fix comment.
+
+commit 2a65229976b4a2533011216c611ea21c89825144
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Sep 3 21:53:57 2024 -0700
+
+ Update HOWTO-MSWindows.
+
+commit 7c80031204505ca6f16fe5dd7b96b898485a670d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Sep 3 22:50:51 2024 -0600
+
+ BUILD: Move asymptote setup file instead of copying.
+
+commit f05b0fe99fee4790ce49a70af15e6e78435d5b71
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Sep 3 22:38:36 2024 -0600
+
+ BUILD: Build CTAN asy for windows in build-asymptote.ps1.
+
+commit bbfb13aff4e146c8d907d1cfccba1ca8c691b5e3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Sep 3 22:21:56 2024 -0600
+
+ CMAKE: Add preset for CTAN for windows.
+
+commit 18d96804836250863c7c2b77856eb17d8f96bc13
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Sep 3 22:17:11 2024 -0600
+
+ BUILD: Copy installer files to the build root.
+
+commit 6e07a11772810168210ec694d4539b1135006bb2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Sep 3 20:07:49 2024 -0700
+
+ Update shared directory.
+
+commit 1707c1fb468243a3c55c2580ff7822972ae6a254
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Sep 3 21:01:49 2024 -0600
+
+ BUILD: Add asymptote.pdf to build-asymptote.ps1.
+
+commit ee85f42d88aab58a3b7a93353dccd21a6597189e
+Merge: 1a74d2f3 db6d2426
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Sep 2 16:25:35 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 1a74d2f3f4a562cbfd80abf8aba855ee16f6e3d3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Sep 2 16:25:25 2024 -0600
+
+ BUILD: Update instructions on building asymptote on windows.
+
+commit 3596a172fc64fb486f0f0b33fa54719ca7f607d7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Sep 2 15:37:06 2024 -0600
+
+ BUILD: Replace build-asymptote.dos with ps1 script that uses CMake.
+
+commit 0385a313ba3e984e1bbff9b81a767cf4393d37fd
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Sep 2 14:16:34 2024 -0600
+
+ DOC: Update documentation on handling ninja dependency.
+
+commit b26c8a80c9509c6b5f6fb0f7aa3a401eb7d85787
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Sep 2 13:06:35 2024 -0600
+
+ CMAKE: Re-add preset for existing asymptote.pdf.
+
+commit 85d62e50b2076498796c7c2fe24cfb932692dfe1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Sep 2 13:04:38 2024 -0600
+
+ CMAKE: Disable LSP building in msvc/release builds temporarily.
+
+ See https://developercommunity.visualstudio.com/t/MSVC-Compilation-failed-with-boost-templ/10734959 and https://developercommunity.visualstudio.com/t/C-Syntax-Error-after-upgrading-to-Visu/10724553 .
+
+commit fe5b700a7180ff091d21fb97a783e0337e96b7d2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Sep 2 00:21:45 2024 -0600
+
+ CMAKE: Modify presets for msvc/release with external docgen to use new cache variables.
+
+commit cfec6670dc35615e175f69012f44dc1648a3af44
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Sep 2 00:18:22 2024 -0600
+
+ CMAKE: Modify documentation generation options to allow for specify external directory for all files.
+
+commit c7fc84be4583bc1de6c6174c2beaed76488c1fae
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 1 23:06:09 2024 -0600
+
+ W32: Remove the world "application" from System error.
+
+commit cd59c48832654ca4b518e43fedfdfbb1f7475c76
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 1 22:20:11 2024 -0600
+
+ DOC: Simplify dependency notes for windows docgen.
+
+commit 578de54395a1aa836122b58d2d8244aacc458cc7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 1 22:03:55 2024 -0600
+
+ CMAKE: Remvoe SYSDIR from asytest.
+
+commit 74cab4c0263972b119c6febaf539a75ade299f00
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 1 21:52:58 2024 -0600
+
+ CMAKE: Add option for CTAN build.
+
+commit db6d2426749080e7a5035668bb3ffee867a65ec2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Sep 1 19:42:53 2024 -0700
+
+ Reorder ImageMagick arguments.
+
+commit d7f2a95fe274861172c7fe19ddb7fd8269b58ea5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 1 21:05:05 2024 -0600
+
+ CMAKE: Add tests for template tests.
+
+commit 81d0ffcb6dccf2172ca69a27618bf333c4608b4f
+Merge: 080b4447 604e0e09
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Sep 1 21:01:36 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 604e0e09f82116b3dd8c613f8439fb2e994dcd9b
+Merge: abb6d707 442b9b6f
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Aug 29 18:32:42 2024 -0700
+
+ Merge remote-tracking branch 'origin/master' into 471-cannot-unravel-static-field-from-imported-type
+
+commit abb6d7076ffd3cbd1f4a5896a2dbc207ec55e837
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Aug 29 18:25:40 2024 -0700
+
+ Add tests for #471 fix.
+
+commit 442b9b6f214c4ccbb59b823e1285da8f24bf0466
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Aug 29 18:11:40 2024 -0700
+
+ Add test for issue #471.
+
+commit 21bbaa75e735918046b36aa75af8e700728b5a0c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Aug 29 17:23:55 2024 -0700
+
+ Apply Andy's fix for issue #471: Cannot unravel static field from imported type.
+
+commit 080b44472cf59090e16f6a0cef00155714f53105
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 18:29:11 2024 -0600
+
+ DOC: Clean up documentation for installing on windows.
+
+commit 305edb54c6f6ccea0d03d4dfc578ccd73bcfb0a8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 18:03:16 2024 -0600
+
+ DOC: Rearrange INSTALL-WIN.md.
+
+commit 7db469aa883b3eb37433fc17c8b9b999a09f7bf2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 14:54:28 2024 -0600
+
+ CI: Use version-override number in building asy's GUI.
+
+commit 5f1e67b7e2275a5f9fdc1ca493344cea11602ff5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 15:27:32 2024 -0600
+
+ GUI: Add "--version-override" option to buildtool.
+
+commit 3f3807ef14733c753895935b7deb428833d4b38d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 14:39:16 2024 -0600
+
+ CI: Determine asymptote version in pull request precheck step.
+
+commit 3173f9d232445a6d9f2e4d3d7f49a4964564761a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 14:39:09 2024 -0600
+
+ CMAKE: Allow ASY_VERSION_OVERRIDE environment variable to be used for overriding version.
+
+commit 388ff0c46faa359e943e1d005d78d11408eec293
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 14:38:42 2024 -0600
+
+ NSIS: Rename build installer script param for easier usage.
+
+commit 91ddba8f238f05f6dcbaeaf4e3393a172dcb39e7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 02:56:28 2024 -0600
+
+ CI: Remove packaging step from build-asy-windows.
+
+commit 91bd1f50e0c6c786dfb35cee9e77460e5b193e8d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 02:05:16 2024 -0600
+
+ CI: Add packaging step for asy.
+
+commit f92cb6206ff0761ce94cf9b6acbe3fc74a5eef0e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 01:31:54 2024 -0600
+
+ CI: Rearrange CI into a single pr-precheck file.
+
+commit 0c6c890633dcd284bd7759593aefdbace81f768b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 01:06:51 2024 -0600
+
+ CI: Remove on-push CI run.
+
+commit 9a8d8f87118f8b77231b5e8225742727ad5353d2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 00:59:28 2024 -0600
+
+ CI: Add workflow for generating UI files.
+
+commit 9e6ab91af1156783baf9940b7a09d0fd7737c125
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 25 00:12:24 2024 -0600
+
+ CI: Remove output directory from asy run command in building latexusage.
+
+commit 869fb73504a7c72eeaf6de0a110d11f5084761ad
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 24 13:36:55 2024 -0600
+
+ CI: Copy latexusage.pdf to build root for TeX Live support.
+
+commit 2e964f9531c534208bbdabb8bc6f1ea4e81a0efd
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 24 13:21:37 2024 -0600
+
+ CI: Install ghostscript during windows build process.
+
+commit 72b032a86d35ce8b1f87d9917fb6de2de5a86e06
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 24 13:07:38 2024 -0600
+
+ W32: Add application name to error message.
+
+commit 816f51f1d2c722a5379c61d682b00020205e9a9c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 24 12:49:42 2024 -0600
+
+ DOCGEN: Remove "-include-directory" for compatibility with TeX Live.
+
+commit 5a4404073b10b77cd77f983a7a45b3d68a50189f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 24 02:49:39 2024 -0600
+
+ CI: Build asymptote's documentation on windows.
+
+commit d22c2e0c73b92dcebf92089937e4f7c009a11af9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 24 02:48:56 2024 -0600
+
+ CI: Setup TeX Live on windows CI.
+
+commit 5ea2f86cb30c185219b42c5c3fe896e4d7e0ae43
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 24 00:37:20 2024 -0600
+
+ CI: Replace setup ninja on windows with manual ninja installation.
+
+commit 6557661e59511ca9fa65d7b43e9944f5c8b883bf
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Aug 23 20:01:28 2024 -0700
+
+ Remove redundant code.
+
+commit 91905481ab4d654b053b879d3e314d8254f38f94
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Aug 22 20:33:11 2024 -0700
+
+ Fix typos.
+
+commit fb85753c908016b69124b2c435d0b737c05b4e33
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 22 20:55:29 2024 -0600
+
+ W32: Add Ws2_32 library to static linking library.
+
+commit 47a6c8e52c3fce26ced6306018a1859c5b7e1004
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Thu Aug 22 14:20:26 2024 -0700
+
+ WIP: autounravel progress
+
+commit a5c2f091761a9145b3869116ef4fa0c78f2ff7d5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 22 12:40:13 2024 -0600
+
+ CI: Transition all github actions to v4.
+
+commit 2dda70503521e3fb0cbef19419bbf0bf2293ba69
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 22 12:27:39 2024 -0600
+
+ CI: Use Install ninja from apt directly for linux CI.
+
+commit 9cc3a2d7f7cebfe429710bf4bdec958fd033ce6c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 22 02:23:37 2024 -0600
+
+ CMAKE: Handle bezier2 and beziercurve separately in docgen.
+
+commit 17f1456f9541c8eca642a4b068f529c02240c27a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 22 02:07:13 2024 -0600
+
+ CI: Bundle documentation in package-asymptote-artifacts stage.
+
+commit d935806052d4ed36cbfb794a6e4a30f9e1166f1f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 22 01:30:21 2024 -0600
+
+ CI: Use ccache for building asy on linux.
+
+commit a6278da9499287bad59d6a8f07a3423022ca0fdf
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 22 01:29:25 2024 -0600
+
+ CMAKE: Add ccache to compilation preset.
+
+commit b2bb8ca96c58a4b11420c8a49970526b04f1c2a3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 22 01:25:12 2024 -0600
+
+ CI: Add ccache to env initialization.
+
+commit 7c16b94d344b4a20600f0a9f371aba0e386bd07e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 22 01:00:24 2024 -0600
+
+ CI: Bump actions/cache to v4 on linux.
+
+commit 8753ca605c6424da78b9fa7aeb726774eac85fd2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 22 00:17:52 2024 -0600
+
+ CI: Add docgen stage to linux CI.
+
+commit 1002b337879cf6408bbe0fce8c4631e5082c12bf
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 21:47:37 2024 -0600
+
+ DOC: Add documentation for generating install file on windows.
+
+commit 8b909e6ebdf41fcd07df6600761bd3426e48bcf3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 21:10:06 2024 -0600
+
+ REPO: Add extfiles to ignore list.
+
+commit caeaee5ca8faf7c546736beec6e3d0f4da6adc12
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 03:09:28 2024 -0600
+
+ VCPKG: Add baseline for manifest file.
+
+commit 13b33f2305a2c5aba3a5765506a4d6f4c328fd47
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 03:05:23 2024 -0600
+
+ CMAKE: Add install prefix to win32 presets.
+
+commit b11ca50dd5d142bad8b731832cea2a8b927955a7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 02:56:14 2024 -0600
+
+ CMAKE: Add asygl.js to list of files to copy.
+
+commit a2f29b73ccbd45afbb47606831082e77f538b635
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 02:47:30 2024 -0600
+
+ CMAKE: Install README, LICENSE, and asy icon files.
+
+commit eb4d4905a19b58b44a69b55af6cff66d69653f4a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 02:41:28 2024 -0600
+
+ CMAKE: Add additional files to docgen.
+
+commit 5dde08d655c3e72f510246c38439aaeafd19d56a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 02:37:11 2024 -0600
+
+ CMAKE: Add option to specify or search for pdftex.
+
+commit 78ac2bcb8c74cfbcf15f0b2a7674f0c48eb8a51f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 00:22:48 2024 -0600
+
+ CMAKE: Copy asymptote.pdf and other documentation files properly after build.
+
+commit 006ea9e60aa3017965b9160a10c64bea8b4841e5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 00:22:24 2024 -0600
+
+ CMAKE: Move error message for insufficient components to install stage.
+
+commit abd23b2d0ff0ce83fcf81ea5fb91e1cf7a1b9b7f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 00:21:52 2024 -0600
+
+ CMAKE: Add custom docgen target and list of documentation files.
+
+commit 652197730386000f22cdb7df11507c3c85ec7b60
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 00:21:29 2024 -0600
+
+ CMAKE: Build asymptote.pdf only if ENABLE_ASYMPTOTE_PDF_DOCGEN is true.
+
+commit d651f0be009b459475e20a43b8ccd3d7bca716ac
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 19 00:20:29 2024 -0600
+
+ CMAKE: Add option to specify external asymptote.pdf file.
+
+commit da697b6421c6aa05b44d5316d340595518646195
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 18 23:21:16 2024 -0600
+
+ W32: Add helper python script to build installer file.
+
+commit d3ef2bfbf1915e89358c4187d55ba415a99db669
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 18 23:15:12 2024 -0600
+
+ CMAKE: Fix formatting in options.cmake.
+
+commit 0183b01d6d6d8a3ed82abfa049637f247a5e8b95
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 18 13:36:37 2024 -0600
+
+ CMAKE: Add additional files to pre-NSIS installation.
+
+commit b6d037b9ee900854d3a24894302ab3011caf85d1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 18 01:45:55 2024 -0600
+
+ CMAKE: Add draft win32 pre-nsis install script.
+
+commit 3ff1332f1eca64b6937d81c8a2a59082a7fc5bb7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 18 01:13:36 2024 -0600
+
+ REPO: Add cmake-install-* to ignore list.
+
+commit ae75e1ce4c33750df8440b898bb81ba241ba2775
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 18 00:17:44 2024 -0600
+
+ CMAKE: Add option to override asymptote version.
+
+commit 0e285eb89de8ad5fc886a35901855152adc0a4e9
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Aug 16 02:41:07 2024 -0600
+
+ CMAKE: Add asymptote.pdf build target for linux.
+
+commit 6075b61a0b502701449f5cc0737d1811c0de4b86
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Aug 16 02:32:37 2024 -0600
+
+ CMAKE: Fix CDlabel case-sensitive typo.
+
+commit 315d7958ca29a6e0e23b2d86789359070d1e5329
+Merge: 17965535 c2e57e12
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Aug 16 00:39:56 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 17965535285f79f0c5b8296f2526350403bb775a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 15 23:31:05 2024 -0600
+
+ CMAKE: Add docgen target for asymptote.pdf in windows.
+
+commit aebd49b7eea14eeb04ec9aa644158ad81b52a862
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 15 21:24:21 2024 -0600
+
+ CMAKE: Generate remaining documentation-related asymptote files in docgen.
+
+commit f668036f88f1f1b193fb18efee568f51c82ef350
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 15 23:42:15 2024 -0600
+
+ CMAKE: Fix incorrect option() usage in options.cmake.
+
+commit df956c94d855f8e52887d17e0d1a7739cf6d9c94
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Aug 15 23:30:38 2024 -0600
+
+ CMAKE: Determine if the system can build documentation properly.
+
+commit e7e7365b8e02f49e534d015e2b5102c90f008e8e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Aug 16 00:11:18 2024 -0600
+
+ CXX: Use _unlink for windows builds.
+
+commit c2e57e121a47f9f44d80a2012eec05e949c95d99
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Aug 15 01:16:14 2024 -0700
+
+ Increment version to 2.92.
+
+commit 344bbd8514fff4a25cede6be202cee6fdde35988
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Aug 14 22:43:21 2024 -0700
+
+ Fix warning messages in example.
+
+commit c4b0cfe1156e53d1d49b2d74a9e90729bf5d6fd7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Aug 14 22:04:42 2024 -0700
+
+ Remove legacy defaultrender settings from examples.
+
+commit 15d31f395333b0bc6fe78b671843a936473a6b9f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Aug 14 22:01:48 2024 -0700
+
+ Update to use magick convert and magick animate.
+
+commit a5f800a1f5e183cf36e398e5d934ec4ceb758edf
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Aug 14 21:58:18 2024 -0700
+
+ Update introductory talk.
+
+commit 35e076eeaf7057db11df777ac41db80532acb768
+Merge: 1b8712e8 a058c4b3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Aug 14 18:06:01 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit a058c4b32712c63169cabbe8ea4a9b2e4b887203
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Aug 13 00:45:39 2024 -0700
+
+ Improve camera centering when keepAspect=true.
+
+commit 46c6537c637a7fcde78d7fd4f5f0ad1f49012642
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 21:59:57 2024 -0700
+
+ Simplify projection centering code.
+
+commit af6bcf2dc75c11c90822de683e73821d458e6167
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 20:10:54 2024 -0700
+
+ Update camera specification in examples.
+
+commit 6dc3a2fff039c90742c5656d463fa3b1465e667b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 17:37:55 2024 -0700
+
+ Update grid3 module.
+
+commit 54b06839c165a8cdbe5179008decf424a385f1ce
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 15:53:45 2024 -0700
+
+ Document render argument of surface drawing routines.
+
+commit 6a1c5d7c138f8908ef96d52c30f354132ddfa813
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 15:53:22 2024 -0700
+
+ Add missing projection.
+
+commit e572be209f94aaaf7ecba5d1e5128d89bf759080
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 14:59:16 2024 -0700
+
+ Use final projection.
+
+commit 6dd9e271c37e1dc0f5b2d941e0a3c5d556099e98
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 14:57:59 2024 -0700
+
+ Require explicit projection in internal routine autoscale3.
+
+commit 6cba1f1da5facb823b86724cb35e9e01314fdd54
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 14:28:24 2024 -0700
+
+ Only recenter camera on nontrivial scenes.
+
+commit 1b8712e8fecdbd0102ba0af72832f03d82d084a2
+Merge: 98508450 b730244a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 12 15:25:25 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit b730244a19a1b686138491a0c3c4fd9ea3e7ce00
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 13:43:30 2024 -0700
+
+ Update URL.
+
+commit 0e5bd5ed9c35c6871b68a08b4909a5d66c1b40f1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 09:42:40 2024 -0700
+
+ Use general projections in graph3.asy.
+
+commit 97af20d196b35e7627ae0e8b1f14462b551a7b61
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Aug 12 04:13:42 2024 -0700
+
+ Fix last revision.
+
+commit 985084504e91de56d468b6238097616879c6c28f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 12 01:36:16 2024 -0600
+
+ PY: Fix generate_enums.py.
+
+commit 3b3f8258eb8daa1e8953b795bf7814db82b2c29d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 12 01:34:27 2024 -0600
+
+ REPO: Add draft version.texi.in.
+
+commit 1c5389a4fad9d73d885f15da8e38e0a92a21de05
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 12 01:34:09 2024 -0600
+
+ REPO: Unignore version.texi.in.
+
+commit 619c4c1dc308096df9c4b6b5206dcc8b20113e43
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 12 01:14:29 2024 -0600
+
+ CXX: Fix glrender.cc's args.tup.
+
+commit 834efe1548177677f79212b0c6d921f016e13615
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 12 01:13:37 2024 -0600
+
+ CXX: Fix error function in asyparser.cc.
+
+commit cae051f5a9953e8310bc197a2c54cfe33f9a4ebb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 12 01:10:15 2024 -0600
+
+ CXX: Fix definition in picture.cc.
+
+commit 726e71d2c5776d44531cec87128e1b65204ce4a8
+Merge: 2aec573d 560ffb6e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 12 01:07:14 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 2aec573d313e806bc32083efda0b746228cf6b14
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Aug 12 00:45:57 2024 -0600
+
+ CMAKE: Add rule for generating options file for doc.
+
+commit 560ffb6e408ad5301f26e318594274e7aa08ed3f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Aug 11 23:34:20 2024 -0700
+
+ Make -debug report traceback only on error.
+
+commit eb0418fd0fc75f9024f019b0b3c5e7bf931afeb9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 11 20:09:04 2024 -0600
+
+ CMAKE: Add target for relevant asymptote files in docgen.
+
+commit 2307614f006498aeb73c2db22fbf3ecced03869f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Aug 11 18:33:03 2024 -0700
+
+ Add srand example to documentation.
+
+commit a39b6e33590e8e0e8afa2192a905d0389d1ca1e6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Aug 11 15:33:25 2024 -0700
+
+ Fix reported camera up vector.
+
+commit 4f02db56c1e6330db61345e6b12298e882b4e553
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Aug 11 14:31:56 2024 -0700
+
+ Automatically center camera and target within scene by default;
+ change default value of center for orthographics projections to true.
+
+commit 9b49913a7b294c322b57b453ad0e5753c18a1cb7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Aug 9 12:28:26 2024 -0700
+
+ Add url option to figure function in slide.asy.
+
+commit 797c84dbb66101306e2321cc378d5ddba3d06d5f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Aug 7 02:33:44 2024 -0600
+
+ CMAKE: Add target for latexusage.pdf.
+
+commit 3d3351f8149a5f4814c9f1f7defec92430396a51
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Aug 7 02:28:09 2024 -0600
+
+ DOC: Add script to build latexusage.
+
+commit 269a346b471067547950d299c8e2e0d395fcd4f7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Aug 7 02:20:03 2024 -0600
+
+ W32: Terminate process before exiting program in Win32IoPipeStream.
+
+commit 35b37cf5356225c156d657706cd013d5f4a26b55
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Aug 6 23:14:26 2024 -0600
+
+ W32: Check if ReadFile is from a closed pipe or not.
+
+commit aea92ab1bd68f10c20270d1fc2ac94a3ab104a5d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Aug 6 10:42:39 2024 -0600
+
+ CMAKE: Add target for asy-latex.pdf.
+
+commit 715a560bad0d23e4978de3aa8fb599c39180bec3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Aug 6 10:29:50 2024 -0600
+
+ CMAKE: Add skeleton for docgen on windows.
+
+commit e77cf15e28140cb9332e38e6258ef09932ff9a58
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 4 21:04:08 2024 -0600
+
+ MAKE: Add PYFILES dependency to install-asy.
+
+commit 4eba858315796cf3f5ea329e2614f4e459406d31
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 4 21:02:47 2024 -0600
+
+ MAKE: Add PYFILES to DIST variable.
+
+commit 885d64f54a50a5412dd1980f6a70f54011f5acd1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 4 20:55:26 2024 -0600
+
+ MAKE: Add doc/version.texi to sty dependency.
+
+commit eb47e3b4917201723c74868dd862c3487df248f0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 4 20:50:20 2024 -0600
+
+ MAKE: Restore glew to asymptote build dependency.
+
+commit fb68546339e920b6269ec6a4403e068638c84f55
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 4 20:41:20 2024 -0600
+
+ AC: Add HAVE_ZLIB define universally.
+
+commit 70a24707a64658ceeb05d8b7f6ab32d1db7c1e27
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 4 20:31:18 2024 -0600
+
+ MAKE: Make uninstall work with updated GUI layout.
+
+commit 0921bb6e1918743972bf4b3489de913c23163e7c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 4 20:26:04 2024 -0600
+
+ MAKE: Make install work with updated GUI layout.
+
+commit 23513942941fa1bf1b4da5134c0578d764af5357
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Aug 4 20:23:19 2024 -0600
+
+ PERL: Make asy-list.pl work with strict Perl.
+
+commit 35ec3c2f8d0b504ec28f8661713a96c4404ae439
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 16:23:21 2024 -0600
+
+ Make: Use built-in glew for makefile builds.
+
+commit 937b6af7b031b16a03ffb798e6814f643ec937d0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 16:21:26 2024 -0600
+
+ MAKE: Make gen_preprocessed_depfile.h work with parallel builds.
+
+commit 2a6a58f2cdad340fe920b51a6a949ebc1aa1a150
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 15:51:26 2024 -0600
+
+ MAKE: Restore autoheader to Makefile.in.
+
+commit 85ba9045fd9f7337d990c0405b37bf4fe9379078
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 15:01:34 2024 -0600
+
+ GL: Use included glew source for cmake builds.
+
+commit 9997b5edb2f593172b37ef3d1a8a8caea3b18a9d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 14:11:59 2024 -0600
+
+ MAKE: Make xasy target work with Makefile.
+
+commit c3dd075f1586a104380d6a88e73b3aa68013c9ba
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 14:10:53 2024 -0600
+
+ GUI: Add xasy.py as a launch shortcut.
+
+commit ff0e780834985e1f79542703c7bf2e66a37f1ded
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 13:41:21 2024 -0600
+
+ MAKE: Add GUI/xasy* module targets.
+
+commit 06dadf46f03a41808e6f439c81299ef878e49ed5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 13:13:18 2024 -0600
+
+ MAKE: Remove LspCpp from Makefile.in.
+
+commit c1eab5181057533b30d85dc87cfbf4cd7f7a0469
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 13:10:22 2024 -0600
+
+ MAKE: Fix cleaning of acextbuilds.
+
+commit 12aed932c289293b9504a5d5a433ebd0e31e9b70
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 12:53:57 2024 -0600
+
+ GUI: Add __pycache__ to ignore list.
+
+commit 7b895bd208058fb2d7c8754b6496879ba1fc3b56
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 12:50:58 2024 -0600
+
+ GUI: Add option to buildVersionMoudle to use specified version.
+
+commit 5060c2054424238620339bf11c598b1f53f624fe
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 11:42:41 2024 -0600
+
+ GUI: Update buildtool.py to get the version information from configure.ac.
+
+commit 7a56512bebceca1fd8b50a0ad4944cf3dde02712
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 11:25:38 2024 -0600
+
+ CMAKE: Fetch package version information from configure.ac file.
+
+commit 962cd4c4aa2e15fd626c8cfe7834d68ab079944d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 11:17:03 2024 -0600
+
+ PY: Add script to fetch package version information from configure.ac.
+
+commit b43bf009fd0b67401dd09a7e5a7eb041b98a1fcd
+Merge: 926b16f8 1a683cb0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Aug 3 10:29:05 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 926b16f81110df438e127af1e9b1c2bbfa6589cf
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Jul 31 12:58:19 2024 -0600
+
+ MAKE: Add acextbuilds to clean target.
+
+commit 3f35eb894eb1e8b174165b431c7996b3d4330dc7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Jul 31 12:57:34 2024 -0600
+
+ REPO: Add acextbuilds to ignore list.
+
+commit dca520992423feb07ba18b5ae1e7f6935a983cc0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Jul 31 12:56:59 2024 -0600
+
+ MAKE: Build LSP in Makefile.
+
+commit 886ce7f414244a3a8534abacc2d4b32e61a288b4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Jul 31 12:56:23 2024 -0600
+
+ AC: Make LSP work with autoconf.
+
+commit 41f2ef35de9ea1ceeb1640557c587f14879ed871
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Jul 31 12:56:07 2024 -0600
+
+ CXX: Ensure HAVE_LSP is visible to CXX files.
+
+commit 1a683cb01c6bec7948befe5bfc941a2b1d9de788
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jul 31 04:59:54 2024 -0700
+
+ Improve camera autoadjust when keepAspect=false.
+
+commit 0b69049743dbe0e0aa319534cfffc1a0f6d648d9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Jul 31 00:17:48 2024 -0600
+
+ AC: Remove *** from non-urgent messages.
+
+commit d70d2747f0a5303c88d002f7e6fc15b468881981
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Jul 31 00:07:44 2024 -0600
+
+ MAKE: Ensure version check is called every time.
+
+commit 7673f137cfd082c65120dafeeb1ef0285a014d3d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Jul 31 00:03:24 2024 -0600
+
+ CXX: Ensure config.h is directly or indirectly included in all cc files.
+
+commit 1426e5b89247200194b8efcf8f46b1cbf9bef26c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Jul 31 00:02:58 2024 -0600
+
+ AC: Reintroduce header config files.
+
+commit e734bab10dc394f592afe3d52f057212ee3c4b53
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jul 30 22:01:12 2024 -0600
+
+ MAKE: Add revision.o to asy dependency.
+
+commit 587ff8958d156ee1d508556ca5b7bde63463ef15
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jul 30 21:47:10 2024 -0600
+
+ AC: Set with_vcpkg to default to no.
+
+commit e758204a00af4766a3bf06d980752275d0696c07
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jul 30 21:43:15 2024 -0600
+
+ AC: Fix test "x$with_vcpkg" != "xno".
+
+commit 442fc40da78af9b4f7ab1e7c9b203f2f3d174a31
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jul 30 21:00:38 2024 -0600
+
+ REPO: Add fleet files into ignore file list.
+
+commit 3f92e6d6ab59131b82b18c04666ed0fc17039819
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jul 30 01:36:42 2024 -0600
+
+ CMAKE: Use VERBATIM option only on unix systems for gen_preprocessed_depfile since it was causing problems on github runner and windows.
+
+commit 98c49c8c3d9ccf2dfa324d2423d3e5f0b65ced92
+Merge: 7a67ba57 e4ef069e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jul 30 01:24:30 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 7a67ba5747d9981115cfe6193f6a54b29f4b019c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jul 29 00:03:01 2024 -0600
+
+ MAKE: Add additional generated files to clean list.
+
+commit 7f486be1ef9786493285d574b528e765afa9988c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jul 29 00:00:22 2024 -0600
+
+ MAKE: Split version build target into multiple files.
+
+commit 046518d38fae4cd6901d32bf7523c41dea6877ef
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 23:42:04 2024 -0600
+
+ MAKE: Remove windows-specific routine in Makefile.
+
+commit b52e03c4c3ab45e6a926bd78511a925ddcdcda0a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 23:40:19 2024 -0600
+
+ REPO: Ignore keywords.h instead of keywords.cc.
+
+commit 571466e7aa51edd35e9650158f68cf5aca67fef0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 23:39:33 2024 -0600
+
+ MAKE: Set makefile build system to be on par with cmake on dependencies.
+
+commit 26e8b4971485ef2edcbce7b76fe36dd16fbc48c9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 21:39:49 2024 -0600
+
+ AC: Fetch tinyexr from github.
+
+commit 28d99ceeb855d83f72c263cd6c978e76060f6926
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 03:30:27 2024 -0600
+
+ CXX: Remove unused #pragma from util.cc.
+
+commit 7644a97545a19a50750df90131b0017966a3a7f9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 03:04:31 2024 -0600
+
+ AC: Always include HAVE_UNORDERED_MAP since we are >= C++11.
+
+commit 837810b54d0fbfc9a0943288749ac805491c04a7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 23:37:11 2024 -0600
+
+ AC: Fetch LSP directly from github.
+
+commit 2d547731466e04aced19935f2ffcd059f8704bf9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 02:35:25 2024 -0600
+
+ AC: Move AC_SUBST to the end of the file as these are changed later on.
+
+commit 8a35969828d945934988465476eb3297603e28b7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 02:27:13 2024 -0600
+
+ REPO: Add *.raw.i to ignore list.
+
+commit 3fb5fbb8523f4179ed5df96377102503025e8a38
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 02:08:24 2024 -0600
+
+ REPO: Add additional conftest files to ignore list.
+
+commit 1616c997ac1a79ccd2f1bd44d72c4cbf8a13f130
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 02:08:15 2024 -0600
+
+ REPO: Add extlibs and extbuilds to ignore list.
+
+commit e51fa6224218bfa17f5a6bcdac4a120a818dc5d9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jul 27 18:56:34 2024 -0600
+
+ CXX: Use <> brackets for optional.hpp.
+
+commit b14ec24f2360512e85b15a90bd48ed748bb085cb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jul 27 17:49:29 2024 -0600
+
+ AC: Pass in CXX_STANDARD into makefile.
+
+commit 485c5044f784a89b9409942c7bf519193948fb41
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jul 27 17:49:16 2024 -0600
+
+ BUILD: Add options for extra flags in gen_preprocessed_depfile.
+
+commit bd43a40a18f5809fc50685fc005a1484dca2a3a1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Jul 26 02:55:47 2024 -0600
+
+ PRC: Check for univesal endianness if on platforms with unknown endianness.
+
+commit f5f3fdcc3e02021f61084e60827cbf438466d01f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Jul 26 02:52:15 2024 -0600
+
+ PRC: Add endianness check to PRC build target.
+
+commit 026289237dbdb943d2034fa55a93aa30cd66bfed
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Jul 26 01:05:45 2024 -0600
+
+ REPO: Add confdefs.{h,cc} and conftest.cpp to ignore list.
+
+commit 12054fff7ca428401e3452e7fdb76483281c9abb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 28 23:36:45 2024 -0600
+
+ AC: Make configure.ac work with vcpkg.
+
+commit 1f7dd2f1b444a5417ecab408cd24df1b3ab27305
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Jul 26 01:01:18 2024 -0600
+
+ AC: Make configure.ac work with vcpkg.
+
+commit 7c60d7bec543f6dd19086d8395df61b494e424e8
+Merge: 2e65241f e4ef069e
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sat Jul 27 13:18:58 2024 -0700
+
+ Merge branch 'master' into using_typedef
+
+commit 2e65241ff33e209c289b28a7a9763fdb541f386d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jul 26 18:56:33 2024 -0700
+
+ Remove explicit texinfo navigation.
+
+commit 35ee58184bfd49605d3867a62828e1d1524b0ae9
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jul 26 16:21:57 2024 -0700
+
+ WIP: Fix asymptote.texi.
+
+commit 89f14822ec586f29e049864aa9b6b90ac2e41c60
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jul 26 16:21:12 2024 -0700
+
+ Apply type rename after merge.
+
+commit 985175fa00617610e86e5448c9f8a06dc3b04529
+Merge: 0227e6da 472d8ceb
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jul 26 15:21:12 2024 -0700
+
+ Merge branch 'master' into using_typedef
+
+commit 0227e6da925b435121cf5498bf6fa81e8dfa8216
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jul 26 11:26:32 2024 -0700
+
+ Switch some modules from `typedef` to `using`.
+
+commit 5bbcbcc52d68306babc38c9c19dde0e06ef1b6c9
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jul 26 11:24:38 2024 -0700
+
+ Add comments to justify "using" syntax.
+
+commit 6c51091ad2a619d8947880ddb9c1b00dca77d7c1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Jul 26 00:37:05 2024 -0600
+
+ CONFIG: Update config.guess and config.sub.
+
+commit 7e31fd8dc3b2b25f157c1a2dad93e082af653b2a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Jul 26 00:01:39 2024 -0600
+
+ XDR: Add HAVE_CONFIG_H in win32xdr.h if present.
+
+commit e4ef069ed7e8586c3d6eedd4989eeb91b3ac44bd
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jul 25 12:18:34 2024 -0700
+
+ Improve internal documentation links.
+
+commit a8b99a80e307976e30cdeb88543262f82b0559ed
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jul 25 11:52:41 2024 -0700
+
+ Update module map and example to use templated imports (issue #470).
+
+commit bdc8a96080518a980e94859ca4a44cb5bbfd0e4b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Jul 25 01:55:11 2024 -0600
+
+ GL: Delete OpenImageIo include as it's not needed anymore.
+
+commit d9f23a8a3ffad5f0b9c58e873472445502b3f6f7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Jul 25 00:27:29 2024 -0600
+
+ GIT: Add vcpkg_installed to ignore list.
+
+commit e51f6aa11fb03151217790643048f3fb3012a6cb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jul 23 23:24:30 2024 -0700
+
+ Compute normals for tessellated surfaces after transformation.
+ Don't tessellate when settings.render=0.
+
+commit abcc187e719a34a490fe67b5bb0391b577821479
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jul 23 23:23:22 2024 -0700
+
+ Fix settings.render=0.
+
+commit 8277a902085f71f6ba0004f1ad6d5be598fcaaf2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jul 23 01:31:46 2024 -0600
+
+ AC: Add check for vcpkg.
+
+commit 7caa4c47a3274b57c9046766056144bfb922b436
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jul 22 22:42:07 2024 -0600
+
+ AC: Set C++ standard to 17 to match cmake build.
+
+commit 853e24d9bc8e287c273f02438fe809bc2fdd09d0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 22 13:45:42 2024 -0700
+
+ Enable GLSL error reporting again.
+
+commit 5f57f90df7a2cd003c8771906049e58b034572cf
+Merge: 467867e5 0a28468d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jul 22 12:08:17 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 0a28468d010da5159b1d3cdb921e50b469f629e9
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 21 20:32:17 2024 -0700
+
+ Output triangle group for indexed surfaces given render option tessellate=true.
+ Fix triangle group normals.
+
+commit 1f8626d9996fa61ae3be3b1d9469bcb09d15b2f8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 21 18:42:08 2024 -0700
+
+ Update comment.
+
+commit cefa9d615389e34183f0830527ede4318c1cb5d8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 21 18:41:41 2024 -0700
+
+ Simplify code.
+
+commit a2206f5bab482a023144a6ce919096100b851026
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jul 19 09:46:24 2024 -0700
+
+ Use triangle group array assignments.
+
+commit 57c25038f9e1051d7f5c9ca51a59560aa67d317d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jul 19 09:40:42 2024 -0700
+
+ Update asygl.
+
+commit 9399282cf9e1a24fd1ba3f00dcfdc6a790838722
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jul 19 09:31:26 2024 -0700
+
+ WebGL: Allow triangle data array assignments.
+
+commit f80311ae7f35f98ecbfcaa4763305fdd0d95a052
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 15 23:26:12 2024 -0700
+
+ WebGL: Condense triangle groups data.
+
+commit 9523b77d98921e13fb958f78b57d57721df30922
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 15 18:40:18 2024 -0700
+
+ Fix issue #467 (arising from backward incompatibility #450): Missing labels in flattened 3D scene (using settings.render=0) after update to version 2.90.
+
+commit a65d33455949562694765a5384918da1741f89b4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 15 17:40:44 2024 -0700
+
+ Update asygl.
+
+commit 42b211180d7df8ca08a7d331373a650a74917f5d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 15 17:37:18 2024 -0700
+
+ Fix color normalization.
+
+commit 7a9f9ad90a87a26d2814607e96a53ee5a23c13b2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 15 17:34:09 2024 -0700
+
+ Revert "Fix offscreen triangle groups."
+
+ This reverts commit 5841f00d6613e9a32aef986520172738e7bb25a8.
+
+commit 467867e56e61aa3c3c9aa6e9ee796da557ae9d22
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 14 22:07:46 2024 -0600
+
+ MAKE: Restore Make & configure.ac to the latest in master before removal.
+
+commit 16de122ad5ab3518f458434483400b4456db3d62
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 14 22:05:17 2024 -0600
+
+ CXX: Move ax_pthread.m4 back to root directory.
+
+commit a985dae236db05babf7303d6da7edb13984cdd29
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 14 22:00:57 2024 -0600
+
+ Revert "MAKE: Remove Makefile and autotools files."
+
+ This reverts commit f13648ec70031173268fb34b54e097e30a7b21b7.
+
+commit 97768309bfd5b6cbde639472d9b4e503fcc87af2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 14 21:58:11 2024 -0600
+
+ CXX: Rename process/processutils to asyprocess for consistency.
+
+commit 3cf08837b3d0249597dd543e23330f57d70c00e2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 14 21:46:02 2024 -0600
+
+ CXX: Move resources and scripts directory to root directory.
+
+commit 2005fd40b5fdea6cdc0cc15b75a872996dce7d5d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 14 21:30:32 2024 -0600
+
+ CXX: Move src/include/srctemplate files to root directory.
+
+commit 20f7f705e870ee57784480f16532edaf8a39ff80
+Merge: 2d14741e 40f83910
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 14 21:09:58 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support-make
+
+commit 40f83910cdf2961adaace41a30450ea5b71c7ad9
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 14 10:50:38 2024 -0700
+
+ Update asygl.
+
+commit 9eb6b146226d1d3a3aee39918b528017acfb8793
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 14 10:49:28 2024 -0700
+
+ Fix flatness calculation.
+
+commit 5841f00d6613e9a32aef986520172738e7bb25a8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 14 08:54:21 2024 -0700
+
+ Fix offscreen triangle groups.
+
+commit c37fca3f44690d1d90a18dd442e1aef775c206c5
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Jul 12 15:54:09 2024 -0700
+
+ Preliminary autounravel.
+
+commit b9a6e6b082c968579c605fdab8fe29e76af2b398
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Jul 9 18:03:25 2024 -0700
+
+ Hardcoded autounravel structs named TestAuUn.
+
+commit 8c6c5ca0e36c298fa5767b9d7699f95f6ecef8e5
+Merge: b3278634 472d8ceb
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Jul 9 13:22:38 2024 -0700
+
+ Merge branch 'master' into autounravel
+
+commit 2d14741e5805a27f75dc76c4a616f02f6252a5f1
+Merge: 030c13a0 472d8ceb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jul 7 20:35:09 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support
+
+commit 472d8ceb641a7f6fd6e2246b064b81185485195c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 6 22:05:06 2024 -0700
+
+ Fix triangle constructor.
+
+commit 9b25d1d94322fe382087823363dd7833cbdb40ce
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jul 2 10:46:36 2024 -0700
+
+ Fix teapot regularization.
+
+commit 2da7afc8b7a5b0406c3b6cd507ce7b21489509c8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 1 21:41:32 2024 -0700
+
+ Make -d option output call traceback (issue #451).
+
+commit 030c13a0cfcf5ae4b7630e3079979a3017355b3f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jul 1 21:17:33 2024 -0600
+
+ DOC: Update documentation regarding rsvgConverterPath option.
+
+commit a33ee4b660319b3335a36c86c6e09966ef99f075
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 16:53:04 2024 -0600
+
+ XASY: Add support for custom svg converter path.
+
+commit 03b5e658b4fc5c1405ed0695ce663f0466e57140
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jul 1 00:10:08 2024 -0600
+
+ XASY: Fix overriding of settings in xasy.
+
+commit 7d744713189b6c0ac1dbff113c6d346c5654f2d9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 16:52:51 2024 -0600
+
+ XASY: Add additional functions to settings class.
+
+commit abb0b023aab1596d1d049fe05c6deba446ee56fa
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 16:58:33 2024 -0600
+
+ XASY: Fix import for xasyversion.
+
+commit 103f40aee015fb532995d869ec4f050ee8d9b57d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 16:53:17 2024 -0600
+
+ XASY: Clean up Window1 setting initialization.
+
+commit 5429a4963e89111159bdeb05f369901f109e0802
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 16:20:24 2024 -0600
+
+ W32: Use \x04\n as a terminating character for xasy for all platforms.
+
+commit 5bda6e338aa35a1746b7a4626c9e71620f06ef4c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 13:27:44 2024 -0600
+
+ CMAKE: Add asymptote base files not already copied.
+
+commit d67b37cb583d73e54b0c5e751c7143caf9d91188
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 13:22:00 2024 -0600
+
+ CXX: Rename parser to asyparser to avoid collision with windows' parser.h.
+
+commit ca57ccf5b5e3d264049dc8aa176f9c0976e5a256
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 12:58:04 2024 -0600
+
+ TEX: Escape path when given to tex.
+
+commit 29e01591ac963ad9c31815044677ac48b355a3e6
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 12:57:39 2024 -0600
+
+ UTIL: Add escapeCharacters function.
+
+commit 6c8ed678980ffeceafebbe69cc5007f23f05d007
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 11:12:59 2024 -0600
+
+ CXX: Fix exitHandler from master branch.
+
+commit 5e777baf7e8b16096487432d6c0ca6b789b02f1d
+Merge: b4a7504b 5dc79928
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 11:10:02 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support
+
+commit b4a7504b8bdfb26a3a259d3ff9edcd831251855e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 11:07:01 2024 -0600
+
+ CXX: Use _fdopen when possible.
+
+commit 0990ee5d2591424102dd92f7daa1fc186ed51aa0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 01:09:49 2024 -0600
+
+ CXX: Extract "inpipe >= 0" check into a separate variable.
+
+commit 374c7dcea5e86cab4f094ed15d88ef59a845b8af
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 01:07:38 2024 -0600
+
+ CXX: Extract runhistory.in's readline function initial check.
+
+commit b4698efdc38843cb99678c3989042332a7075002
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 00:56:11 2024 -0600
+
+ LSP: Bump GIT_TAG for LSP repo.
+
+commit 80dacad9459ee397cde24d4ebeb13a718d19a3bc
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 30 00:55:49 2024 -0600
+
+ CXX: Move major functions in fileio.h to fileio.cc.
+
+commit 5dc7992891de07af146317ad053ee56d9ffd938d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 29 21:13:23 2024 -0700
+
+ Update asygl.
+
+commit 4d50ea9cf4c76e7489b5d6c49f84f0267aa28ecb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 29 21:12:37 2024 -0700
+
+ AsyGL: Fix stack overflow.
+
+commit c7e3109ecc4f6f4b193dca1fb80f8cb3c006c9f6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 29 20:58:00 2024 -0700
+
+ Revert "Update asygl."
+
+ This reverts commit 8ef173f593d960e79ca79f916acea149e648c6ce.
+
+commit 8ef173f593d960e79ca79f916acea149e648c6ce
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 29 20:21:56 2024 -0700
+
+ Update asygl.
+
+commit 60d6605333f928420dccdac765925685d81bedab
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 29 20:19:54 2024 -0700
+
+ AsyGL: Travel home on initialization.
+
+commit da4cf28d54a98253de71615fc4f2dec07aaa8707
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 29 00:00:53 2024 -0700
+
+ Update asygl.
+
+commit fb9be22ade7e0ea59d9e4d6ef4485ece2777d95c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 28 23:53:18 2024 -0700
+
+ AsyGL: Initialize all vertices in triangle arrays, even if they are offscreen.
+
+commit 9b3c6cafd09457e3e575b770df36003c3ccbbc60
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 28 22:52:00 2024 -0700
+
+ Fix typo.
+
+commit efc15f4d3cf0f2891ac944d9d0fa3f57a8966fdb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jun 26 14:58:12 2024 -0700
+
+ Fix slide margin and landscape mode.
+
+commit 7d206b8a70e8c985a67cfe5dddcc455163bde2b7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jun 25 17:56:40 2024 -0700
+
+ XASY: Fix SyntaxWarning (issue #464).
+
+commit 6e02744a6b93d376e3abe41561d7b0039a8c8d80
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jun 25 17:50:36 2024 -0700
+
+ Replace each tab in error messages by 1 space (issue #444).
+
+commit b016b84079c777364eaa40c20ce5a3d80805980c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jun 25 09:29:42 2024 -0700
+
+ Fix number of colors for prerendering bezier triangles.
+
+commit c1eb726af8eb4afc6c4872fedef0d05b0cd650bd
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 21 13:56:37 2024 -0700
+
+ Increment version to 2.91.
+
commit 58246991e2474ffbd1bfe012d5d0a11407da7795
Author: John Bowman <bowman@ualberta.ca>
Date: Fri Jun 21 10:33:58 2024 -0700
@@ -208,6 +4950,25 @@ Date: Sun Jun 2 17:39:49 2024 -0700
Remove automatic recordInitializer for imported templates; add test.
+commit b327863476ffeb69000a6c0fa19d425fb664f286
+Merge: 122092fa be47ce98
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Sun Jun 2 15:28:58 2024 -0700
+
+ Merge branch 'rename' into autounravel
+
+commit c2ddde9f86e4533fc625997b8bf21791240c6b20
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 2 15:50:02 2024 -0600
+
+ XASY: Remove fromBezierPoints.
+
+commit 3b8f230e281f6796703de8932f0463474ef4c770
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 2 15:09:32 2024 -0600
+
+ XASY: Add --additional-asy-args to xasy.
+
commit 3f6f4361af778517867837b79cc56db28e791935
Author: Charles Staats III <charles.staats.iii@gmail.com>
Date: Sun Jun 2 13:28:17 2024 -0700
@@ -220,6 +4981,12 @@ Date: Sun Jun 2 12:52:08 2024 -0700
Minor readability improvements.
+commit 426c06840600852a8a80c493b42b3f9c75a0a9d4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jun 2 12:44:23 2024 -0600
+
+ XASY: Use StringIO for xasy2asyCode.
+
commit d22b41fb0e7eaf2290951409abf2f867aa317850
Author: John Bowman <bowman@ualberta.ca>
Date: Sat Jun 1 23:39:39 2024 -0700
@@ -410,12 +5177,113 @@ Date: Tue May 21 23:12:58 2024 -0700
This reverts commit 6e8222e13ad71b03376c84f259bf126944beb303.
+commit 3baf11a2ef131e779dde06356f6c20ac3d4aaded
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue May 21 00:18:35 2024 -0600
+
+ XASY: Use windows temp directory directly.
+
+commit 51f58653157f5a1a11f98bc10ac3f41c4f18a694
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue May 21 00:17:28 2024 -0600
+
+ XASY: Move xasy files and imports for compatibility with PEP 517 packaging system.
+
+commit b828e918cf716d1aab2a5c65472c523bc6d3154a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue May 21 00:02:55 2024 -0600
+
+ XASY: Add version generation to build aid script.
+
+commit 9c23ab47190f0abcba32b1d82a426adff34cd771
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon May 20 12:48:49 2024 -0600
+
+ XASY: Add aid scripts for development.
+
+commit 87f8f280897e8fa61b6e7d6ee876f5a536b6efd5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon May 20 12:43:21 2024 -0600
+
+ XASY: Remove duplicate gitignore files in main asy directory.
+
+commit dc8b4b85b9c3b3b22fa0831ba005b1750c8082cb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon May 20 12:30:55 2024 -0600
+
+ XASY: Add buildtool script.
+
+commit fcac100d96025f6b16e0629c769542eca25a7c6f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon May 20 12:30:10 2024 -0600
+
+ XASY: Add develop requirements.
+
+commit 3912b7d779d4135b0a8bb1f92ae326b52336e6c0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat May 18 23:37:16 2024 -0600
+
+ XASY: Add gitignore for xasy.
+
+commit 2ab4ac960bdd206a190da463647b9def55afb213
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat May 18 20:08:31 2024 -0600
+
+ XASY: Remove rsvg-convert from requirements file.
+
+commit f16cd641e51e5dde9c28aa4735c7e9be9d1123fc
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat May 18 20:07:35 2024 -0600
+
+ XASY: Update requirement versions.
+
+commit db9b2954ff472fbda07f95bf1df7e2e6ef8fe687
+Merge: b6671564 8fbeeaa6
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat May 18 20:03:10 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support
+
commit 8fbeeaa6bb7a84be36942b0622294391e46783de
Author: John Bowman <bowman@ualberta.ca>
Date: Fri May 17 16:03:19 2024 -0700
Fix documentation.
+commit b66715648df3559650101d343f5c34399e90bc8b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Apr 11 11:32:45 2024 -0600
+
+ ASY: Increment version to 2.90 for cmake.
+
+commit 9d9d67aab1bc9fd2444e9b40852fc84b8b05ea66
+Merge: da0ecbd4 8b606e7a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Apr 10 23:35:31 2024 -0600
+
+ Merge pull request #10 from vectorgraphics/msvc-support
+
+ update msvc support
+
+commit 8b606e7a66797d6f8c99283733a7813e0894e00e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Apr 10 23:02:58 2024 -0600
+
+ CMAKE: Fix readline import.
+
+commit ee52a02fde8d472adb0c3503624fa50bfc4816c4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Apr 10 22:40:08 2024 -0600
+
+ CXX: Change RPC macro to HAVE_LIBTIRPC.
+
+commit b2f03f07111984f2466ebac0dc689f15868be925
+Merge: da0ecbd4 8371bce0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Apr 10 22:17:59 2024 -0600
+
+ Merge remote-tracking branch 'origin' into msvc-support
+
commit 154a9d938d5c97aa75e83a88ef3de22444d422a5
Author: Jouni K. Seppänen <jks@iki.fi>
Date: Fri Apr 5 15:21:57 2024 +0300
@@ -646,6 +5514,58 @@ Date: Tue Mar 5 09:41:06 2024 -0800
Specify PDF 1.5 instead of 1.4.
+commit da0ecbd4e2f79eac43283d2e20f24eb7aeaed37c
+Merge: 091c183d 00ac5da3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Feb 29 22:01:19 2024 -0700
+
+ Merge pull request #9 from vectorgraphics/msvc-support
+
+ Update msvc support
+
+commit 00ac5da370e5a7db35e465e275a6de607b25171f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Feb 29 21:23:12 2024 -0700
+
+ CI: Add version suffix to windows CI build.
+
+commit 22b0a2d43835592297996564793a9967c2e04f21
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Feb 29 12:29:43 2024 -0700
+
+ CI: Add version suffix to linux CI build.
+
+commit ec303780fb6ce55cf20906470cc23644274d0468
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Feb 29 12:22:07 2024 -0700
+
+ CXX: Change process.h to processutils.h since it collides with Windows' existing process.h.
+
+commit 943b0d5440449ae9f41f443057ddeb92c35b7512
+Merge: 1bf3e0ec cd07b1d3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Feb 29 12:15:52 2024 -0700
+
+ Merge branch 'master' into msvc-support
+
+commit 1bf3e0ec4bb154f670b6e44f08b3262601eba0b0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Feb 29 12:11:46 2024 -0700
+
+ CMAKE: Add documentation for speicfying custom version suffix.
+
+commit d05ccd29522b043c74d8992058bf883375b64e07
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Feb 29 12:09:33 2024 -0700
+
+ CMAKE: Add support for custom version suffix.
+
+commit fd497578538a3b2c589d0a6fea51823a58740a45
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Feb 29 11:29:14 2024 -0700
+
+ CMAKE: Bump version.
+
commit cd07b1d33a9a500e7a4a5835ad39168621ed255f
Author: John Bowman <bowman@ualberta.ca>
Date: Wed Feb 28 11:31:53 2024 -0800
@@ -731,6 +5651,27 @@ Date: Fri Feb 16 22:09:44 2024 -0800
Open context menu only for GUI-drawn items.
+commit 091c183d6a6c5e5e7e53b87488e11b81b3b4235c
+Merge: c5648284 585bad04
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Feb 14 21:44:54 2024 -0700
+
+ Merge pull request #8 from vectorgraphics/msvc-support
+
+ Add packaging step to CI.
+
+commit 585bad046cb9d8c319d0775bf000551afc9b0041
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Feb 14 11:52:08 2024 -0700
+
+ CI: Add package step for windows.
+
+commit 315f32d9bbfedee7602b4deb03810a79139fbee2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Feb 14 11:46:29 2024 -0700
+
+ CI: Add package step to linux build.
+
commit c60f3b513670f266a33c55dd0e11255d1ebaac8d
Author: John Bowman <bowman@ualberta.ca>
Date: Mon Feb 12 21:24:21 2024 -0800
@@ -884,6 +5825,79 @@ Date: Thu Feb 8 15:22:12 2024 -0800
tests with wrapper
+commit c564828450c3bcbaf4b5493aab02f8422c3bb0f7
+Merge: 44544fc8 e3d8a5cb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Feb 7 00:42:05 2024 -0700
+
+ Merge pull request #7 from vectorgraphics/msvc-support
+
+ Update a/ci-staging
+
+commit e3d8a5cb53bebca0710eda673eae283e3efaaf31
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jan 15 23:30:45 2024 -0700
+
+ CMAKE: Add Debug compile flag to all debug builds.
+
+ (cherry picked from commit ccc94a2ac66f88850d6295686701ff1c3cadab81)
+
+commit d1973fffa1dd5e29c1738e851c388c368ab2f78c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 9 02:46:25 2024 -0700
+
+ clang-format: Add BreakAttributes to formatting.
+
+ (cherry picked from commit 9c3bccfe8508a0eb425228b1cc63bd010aeb460f)
+
+commit c59e820c4b5d528f4ccbd75287f0213b9db027e3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Jan 9 02:05:12 2024 -0700
+
+ clang-format: Use C++17 as formatting standard.
+
+ (cherry picked from commit 0ea0878a89bff32ca48b94629c51516e9a0b7e1d)
+
+commit accc9032f21964b6a06cb016178195d21bd08d3a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Feb 4 13:05:39 2024 -0700
+
+ CMAKE: Remove redundant asy-base-file target.
+
+ (cherry picked from commit fda3082675200917795903267d3db07f284dad41)
+
+commit e06e7fde332227bfb1818ea5175815abafd98824
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jan 18 13:14:09 2024 -0800
+
+ Address issue #392.
+
+commit 279d9d49e383a80ca0e82d053bc04d387aa3ca12
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jan 18 12:46:41 2024 -0800
+
+ Fix issue #419: suppress duplicate error message.
+
+commit 79fd87c4075031f8a062c0060736d3e366f0f500
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jan 16 17:27:00 2024 -0800
+
+ Suppress warning message regarding boolean operator.
+
+commit e8f7bc100601912298eaaa56758aa6994d1db998
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jan 16 17:23:33 2024 -0800
+
+ Revert "Fix boolean operator."
+
+ This reverts commit fffdb62031f4f68007b2721bdd8ef86ef37d8e3d.
+
+commit b42f10858fda88dac5f2739fc1e4a0b7d47a9aba
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jan 8 17:56:46 2024 -0800
+
+ Update fftw++.h and seconds.h.
+
commit ee98d7193f93ace9ea168192ec32d31838e34025
Author: Charles Staats III <charles.staats.iii@gmail.com>
Date: Mon Feb 5 16:48:11 2024 -0800
@@ -902,6 +5916,21 @@ Date: Sun Jan 21 09:05:09 2024 -0800
More natural error from camp.y.
+commit 44544fc865ff410e396859f059f9539c0fe60fd7
+Merge: 55ee4cd7 f65f8085
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jan 20 23:12:32 2024 -0700
+
+ Merge pull request #6 from vectorgraphics/msvc-support
+
+ CI: Run apt-get update before installing.
+
+commit f65f808536cce3a0cf9a5993f525fbece5f120b7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Jan 20 22:52:24 2024 -0700
+
+ CI: Run apt-get update before installing.
+
commit 9810e8b2d175837fd86d2e9051f1b9ab0644b85d
Author: Charles Staats III <charles.staats.iii@gmail.com>
Date: Sat Jan 20 14:33:18 2024 -0800
@@ -1094,12 +6123,151 @@ Date: Fri Dec 29 10:12:33 2023 -0800
dummy parse from Andy
+commit 55ee4cd758034e16b9081619c49a1838edbbe30b
+Merge: 2e4f39ad 55808725
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 7 02:51:25 2024 -0700
+
+ Merge pull request #5 from vectorgraphics/msvc-support
+
+ Update a/ci-staging
+
+commit 5580872533b1b47c55bd45012322a474b1c55803
+Merge: 4a69c2ea 2e4f39ad
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 7 02:24:34 2024 -0700
+
+ Merge branch 'a/ci-staging' into msvc-support
+
+commit 4a69c2eab22be42a66d6c5301ad5c8a69f47f3b5
+Merge: 544184aa 98d66af9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Jan 7 02:22:41 2024 -0700
+
+ Merge remote-tracking branch 'origin/master' into msvc-support
+
commit 98d66af9f0a7d942ffcf81a21d2d6aa9961bf12d
Author: John Bowman <bowman@ualberta.ca>
Date: Tue Jan 2 17:06:05 2024 -0800
Improve diagnostic.
+commit 2e4f39adb0c07b88fa78d25808b2cc1501afda2c
+Merge: 93553dc8 544184aa
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jan 1 17:28:39 2024 -0700
+
+ Merge pull request #4 from vectorgraphics/msvc-support
+
+ update msvc support to a/ci-staging
+
+commit 544184aa474a33eba1e1ee40af50c372be39649d
+Merge: 64041044 8c83a8e8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jan 1 17:04:25 2024 -0700
+
+ Merge remote-tracking branch 'origin/master' into msvc-support
+
+commit 64041044ecfd1419c5d2e1b3dc83149d55ee964d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Dec 31 22:20:22 2023 -0800
+
+ Fix issue #414: restore missing outpath.
+
+commit f05eb109fab3e7dc3ca69dee740cbca08e731cd3
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Dec 31 06:56:58 2023 -0800
+
+ Fix issue #412: prevent inferred assignment of void type.
+
+commit 35b1d8252140e5e296b043416205d0cc8cfe7df1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jan 1 12:53:39 2024 -0700
+
+ CI: Add unit testing to linux's CI step.
+
+ (cherry picked from commit 84bb6db450290594d9e679107bb41e90952e3070)
+
+commit d693606274e62d344a744ae1cbdf68a39c74f9e4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jan 1 00:35:59 2024 -0700
+
+ CI: Build and run unit tests on windows CI.
+
+ (cherry picked from commit 0cc5f95d94d3141e464688f4a20ce7aa4370c2d6)
+
+commit 93ccd34992a91b5094bb7bfa993b4a03ee34bb1a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jan 1 00:08:22 2024 -0700
+
+ GTEST: Add cxxtests. prefix to all cmake tests.
+
+ (cherry picked from commit 1906f45f342b7af2d137519c5b4266853f6504e3)
+
+commit 9ae0c37abb62330914f40bffab534c5564c004ba
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Jan 1 00:02:32 2024 -0700
+
+ CI: Exclude vcpkg_installed in linux CI to speed up artifact uploading.
+
+ (cherry picked from commit b2c9ebd822e6c1289e9310288d403a1efeeb6e74)
+
+commit 9e958fca4d326354579b74a5bd4a3c042498a5bf
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 31 23:49:12 2023 -0700
+
+ CI: Extract windows pwsh initialization to a common variable.
+
+ (cherry picked from commit c855f06ae8433800bbf05ab570afc95c12df45d4)
+
+commit c7d5ded52971f031db574d041b9c88d718a56b98
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 31 23:44:24 2023 -0700
+
+ CI: Remove vcpkg cache from configuration artifact since they can be installed by cache.
+
+ (cherry picked from commit 76c0d5bd94d2ebeff81b81735cef95574f286daf)
+
+commit a1af220ff70e602341007e927aae4525e88d6410
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 31 18:04:04 2023 -0700
+
+ CXX: Use backported optional for C++14 compatibility.
+
+ (cherry picked from commit 457688ecc9fb99bdd1fcf846066cbd860107c76d)
+
+commit f68e05b9790d61139eb35c2c081a0e9ba237618d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 31 14:26:38 2023 -0700
+
+ OPTIONAL: Add Optional backport to build.
+
+ (cherry picked from commit 9d9c66adc9dc459cffacc0bd0e2e6f5a97e2bcf4)
+
+commit 130f4c966981a2d0cea4ca5f372d47fc37cbff0d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 19:49:48 2023 -0700
+
+ CMAKE: Add PACKAGE_STRING macro.
+
+ (cherry picked from commit 56c93531dd01639bf4c888e360330ca073cf608c)
+
+commit 054fef7e18deb7679d73e8e0c6bc498e0c7c0ed1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 19:41:15 2023 -0700
+
+ CI: Trigger build actions for push from any msvc-* branches.
+
+ (cherry picked from commit 0b7586c8c13bdeaa3608ca25d59c09901a81e906)
+
+commit 6b01ec8d2697309b11262c6ffde8138dc1c3bd29
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 19:39:47 2023 -0700
+
+ CXX: Add _USE_MATH_DEFINES to all macros.
+
+ (cherry picked from commit b5ccc2f1af1f87f48db5c56aacaf85e2455f0b68)
+
commit 8c83a8e8710f245bab9833850fd8381c612ea1b9
Author: John Bowman <bowman@ualberta.ca>
Date: Mon Jan 1 13:17:56 2024 -0800
@@ -1118,12 +6286,259 @@ Date: Sun Dec 31 06:56:58 2023 -0800
Fix issue #412: prevent inferred assignment of void type.
+commit 93553dc8bdc772277d181b2f4e176f450f6655c2
+Merge: 977b8d31 5176b7c0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 14:48:46 2023 -0700
+
+ Merge pull request #3 from jamievlin/ci-windows-impl
+
+ CI: Add windows CI workflow implementation.
+
+commit 5176b7c0efcce567859c0dc7cbaf3bcf03fb1bba
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 14:36:11 2023 -0700
+
+ CI: Add artifact uploading to build-windows-msvc-x64.
+
+commit de6b05f3bfcbdab726b642eff4c7cae4ce130e55
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 14:19:45 2023 -0700
+
+ CMAKE: Ensure all headers are generated before preprocessing file.
+
+commit f54890e85012d70213ed7e983fa632000d690f42
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 14:15:09 2023 -0700
+
+ CMAKE: Rearrange generated files order.
+
+commit 4867141a15d5ca8ef715c3530889f7fd923cf68a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 14:06:05 2023 -0700
+
+ CMAKE: Move generated directory creation to top of generated-files.cmake.
+
+commit 69836fa89e0c41148fa38642a9910c6906352525
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 12:57:19 2023 -0700
+
+ CI: Trigger CI on either manual dispatch or push to msvc-support.
+
+commit 92aeabe0f4127fd7332c2d09b6f8bb6a3b9b92ea
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 11:53:27 2023 -0700
+
+ CI: Add windows CI workflow implementation.
+
+commit 4ae0f88895253e01ab213871d66e600a7696aa3a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 11:55:52 2023 -0700
+
+ CI: Add initialize windows action file.
+
+commit 977b8d31b3a204e8c557ab0c9b86ea0557ef35d6
+Merge: 60024dde 0078b611
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 11:49:07 2023 -0700
+
+ Merge pull request #2 from jamievlin/ci-windows
+
+ add stub windows CI
+
+commit 0078b611d34b0ad7b667b6f81ae53e5b29d5c97c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 11:43:57 2023 -0700
+
+ CI: Add stub windows build CI workflow.
+
+commit 8d18a50951b1239fb0ca3b000e5772ae5406e6bf
+Merge: d6e86bd1 60024dde
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 02:40:38 2023 -0700
+
+ Merge branch 'a/ci-staging' into msvc-support
+
+commit d6e86bd10d4879d576c173e57c1ee53e8f1ccba1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 02:16:56 2023 -0700
+
+ CXX: Fix include for picture.cc.
+
+commit 60024dde4db321863e04690fabd15a032d2d2e78
+Merge: 69c3e4a1 8428d007
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 02:37:16 2023 -0700
+
+ Merge branch 'vectorgraphics:master' into a/ci-staging
+
+commit 69c3e4a14110d871d09193443904f419bcded8dd
+Merge: b468f92a fdd82c8d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 02:36:36 2023 -0700
+
+ Merge pull request #1 from jamievlin/ci-dev
+
+ CI test
+
+commit fdd82c8df42a1d924071f293acc53ac16a0f0e6c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 02:16:56 2023 -0700
+
+ CXX: Fix include for picture.cc.
+
+commit 6c09baa3bb7164f2dc7b0d762b35c098de003acd
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 00:55:25 2023 -0700
+
+ CI: Add github actions workflow file.
+
+commit a6b3c941959d73352573ba6dfddede8eeac08f48
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 30 01:44:29 2023 -0700
+
+ CI: Add actions file.
+
commit 8428d007fb9ea47f9531c679acf6bd8f58dcbba5
Author: John Bowman <bowman@ualberta.ca>
Date: Thu Dec 28 23:55:02 2023 -0800
Fix typo (issue #411).
+commit 3cc5728993cd99154c079f4d49522a23665f509f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 28 20:45:46 2023 -0700
+
+ SETTINGS: Remove default adobe acrobat detection for windows pdf viewer.
+
+commit dedd5977b4432135be959ffc4a10f7f6f26a26be
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 28 20:45:22 2023 -0700
+
+ WIN32: Set all default viewers to empty string
+
+commit 9bd6a6e7622583ad4ba0f14f4ab8e47b5683ae5b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 28 20:43:24 2023 -0700
+
+ WIN32: Implement opening general files for display.
+
+commit 3ce675093b121cdbc4321b558c05f2e75cd5877b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 28 20:31:04 2023 -0700
+
+ WIN32: Implement opening pdf/eps files with no viewer given.
+
+commit d03906428e4dd229e3dcced4e29c594f37a7a3e4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 28 20:29:20 2023 -0700
+
+ COM: Initialize COM if under windows.
+
+commit 244757a32f7742db001688f15298e6b88980dbe3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 28 13:32:53 2023 -0700
+
+ CMAKE: Add Shell32 to windows linking.
+
+commit 8d58c4ab4325285a21d4bb29c75119378bf6db1c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 28 13:30:24 2023 -0700
+
+ WIN32: Add support for viewing html file with default browser.
+
+commit e69380bcabed61e785c7803d34f0fa84cbc5afd4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 28 13:29:35 2023 -0700
+
+ WIN32: Move GetLastError-based reporting to a separate function.
+
+commit ab7cbfd8674d042e9a28336a1a4ae0743394ec77
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Dec 27 23:07:02 2023 -0700
+
+ UTIL: Clean up SystemWin32.
+
+commit a6eb0153fbfac6767bb8274478e6d8d6f228b5b3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Dec 27 23:06:50 2023 -0700
+
+ UTIL: Add helper function to check if windows process is running.
+
+commit 99d9140a795b9fa09ede51464b05dfab75e3035e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Dec 27 23:05:32 2023 -0700
+
+ WIN32: Query registry only if on windows platform.
+
+commit fb48e3bb840d655280118a651d9cfdc51dc520c3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 24 12:31:12 2023 -0700
+
+ WIN32: Fix registry query.
+
+commit 0838b9364348f0e842d1e0f6f9351ec2c829d172
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 24 12:30:41 2023 -0700
+
+ UTIL: Use backslash for stripFile and stripDir on windows.
+
+commit 6ce66134b6e2736aeaa276650a4e8ac4167477f0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 24 12:25:49 2023 -0700
+
+ DOCS: Move windows-specific notes to INSTALL-WIN.md.
+
+commit de4ea998f5ae372f47ad89f038e30e4d3345117b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 24 02:00:27 2023 -0700
+
+ WIN32: Generate more detailed error for win32pipestream.
+
+commit 235e84c2b97d25d6cdc1da60ee921e08fc81e628
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 24 02:00:13 2023 -0700
+
+ WIN32: Add security attributes to nulfile.
+
+commit ba28e876ef5001e2960c82042fd21c540e72688d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 24 01:50:31 2023 -0700
+
+ WIN32: Check retcode correctly for System function.
+
+commit cedb7c6de8d4b5b531fdfed1479257f439cc7952
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 24 01:49:58 2023 -0700
+
+ WIN32: Fix PROCESS_INFORMATION typo for hStdErr.
+
+commit 1946a6c9565e44a5f8b1d34e8cb3e3c386473311
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 24 01:49:06 2023 -0700
+
+ WIN32: Update checkResult to print windows error.
+
+commit bb115360670dcb29730633811a373b3ed19913d7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 24 00:40:57 2023 -0700
+
+ WIN32: Fix CreateProcessA's arguments.
+
+commit 0b19d8d615b26a33d25291d81f9225a60d56161e
+Merge: b1e03f7a 2b4140b0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Dec 22 23:19:37 2023 -0700
+
+ Merge branch 'master' into msvc-support
+
+commit cf5f033cbe6fd008052b62033265e4fcc05face8
+Merge: 0b07b0db 2b4140b0
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Fri Dec 22 16:22:06 2023 -0800
+
+ Merge branch 'master' into using_typedef
+
commit 2b4140b09ecf2df7312f93c59dff128b1a39c222
Author: John Bowman <bowman@ualberta.ca>
Date: Wed Dec 20 00:10:13 2023 -0800
@@ -1142,6 +6557,19 @@ Date: Tue Dec 19 23:14:21 2023 -0800
Only output v3d format for 3D files.
+commit b1e03f7a30bbbb36fb8675c77b176393a8489183
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Dec 19 21:11:46 2023 -0700
+
+ clang-format: Change clang-format style.
+
+commit f64bd104c950d1ff43176c534f1a126d18265107
+Merge: be005add 081db9d0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Dec 19 20:44:46 2023 -0700
+
+ Merge branch 'master' into msvc-support
+
commit 35c261216d6e45593ccd13155ca0ab31652adaf6
Author: John Bowman <bowman@ualberta.ca>
Date: Tue Dec 19 19:20:56 2023 -0800
@@ -1166,18 +6594,380 @@ Date: Tue Dec 19 19:17:52 2023 -0800
Fix LSP segmentation fault.
+commit be005add467c7822433f1dc8d2bc69c01b25d52c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Dec 19 19:35:28 2023 -0700
+
+ CMAKE: Fix reserved file name.
+
commit 488d80962c76cc60629f590e34b350459ea59621
Author: John Bowman <bowman@ualberta.ca>
Date: Mon Dec 18 22:33:47 2023 -0800
Fix bug #405: implicitly format integers with full precision.
+commit b882b8b4b483834aad94ae3ad36de38831dae7a1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 17 17:14:31 2023 -0700
+
+ DOCS: Edit docs to mention quick start scripts.
+
+commit 6a670adfa3a88008c62d025e6d67e1e8a063fdfe
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 17 17:08:52 2023 -0700
+
+ PWSH: Add quick start script for windows.
+
+commit ebfaac3d1e5a54eacded5b7221d9fdd372dbadb9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 17 16:31:08 2023 -0700
+
+ WIN32: Ensure compiler is cl for msvc/release* target preset.
+
+commit 5e1f0d06d572e50a7c743a7e74aa9b9a6fd49e6a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 10 14:37:01 2023 -0700
+
+ XSTREAM: Move xstream's implementation to a separate file.
+
+commit 2b426301fec370c9f28dbec40b8152b33a56c430
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 10 03:13:57 2023 -0700
+
+ CMAKE: Enable RPC by default.
+
+commit 7df3801dac4472749cb78a053c2d3a190d26e735
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 10 03:05:59 2023 -0700
+
+ CMAKE: Add WIN32_LEAN_AND_MEAN to stop winsock.h's inclusion.
+
+commit ed70da29b70f6fac76ac3b2d1dccdc3fb84fa155
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 10 02:39:51 2023 -0700
+
+ XSTREAM: Make xdr win32 compatible.
+
+commit 81fc9d9320c0ed920ab351fc348a71027a276b6c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 10 02:38:58 2023 -0700
+
+ XDR: Add common xdr file.
+
+commit fee33e1f020090f2af89790ea4ee0ced96559fc7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 10 02:37:40 2023 -0700
+
+ W32-XDR: Add xdr implementation for win32.
+
+commit 3ae7c4be102a56a98ff545b7b42a9ce09b1ed099
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 10 02:36:52 2023 -0700
+
+ CMAKE: Add fmem for common file-in-memory support.
+
+commit 8a1ff0510bfca90afda52a92bb5abd11d250e61b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Dec 10 01:21:20 2023 -0700
+
+ COMMON: Include winsock2.h before any other includes to prevent winsock.h being included.
+
+commit 380cc71f3c903d9a37cbc8e43eaea1bdc6ea5351
+Merge: 4eca6498 6868ca1a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Dec 9 00:47:46 2023 -0700
+
+ Merge branch 'master' into msvc-support
+
commit 6868ca1a66611d72f716e57617d1c9c6031d3fe7
Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
Date: Sat Dec 9 00:00:49 2023 -0700
Add LSPCPP_USEGC macro flag in case of gc.
+commit 4eca64986392c0dadd2eb48fdb720f5dfc735931
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Dec 8 23:49:39 2023 -0700
+
+ CMAKE: Add boehm gc flag to lspcpp compilation.
+
+commit 9b0e491d5cf0af7e83c97a438b1ed0a3b0900a36
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Dec 8 23:49:11 2023 -0700
+
+ LSP: Fix line error in color request handling.
+
+commit 59b892c2936514c68167265d0f83a781e8768f9a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 15:00:55 2023 -0700
+
+ REPO: Move additional files to misc directory.
+
+commit 24fa32a7fc88d580ff280dd82841c95777f3a426
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 14:58:18 2023 -0700
+
+ CXX: Use std::optional everywhere instead of boost::optional.
+
+commit 1a8ae56ed91e5b3e0b98140aef69925bd73cc9b8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 12:47:43 2023 -0700
+
+ VCPKG: Add dependencies for LSP.
+
+commit 5a041e1d4d84f5a3b6ae4b855154240c3d5e1983
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 14:52:52 2023 -0700
+
+ CMAKE: Download LspCpp directly from cmake rather than git subrepo.
+
+commit 840c13599cff3231761dc8750a87006ccf1eca2d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 12:48:00 2023 -0700
+
+ CMAKE: Enable LSP option.
+
+commit 75912e49fcfbc2942d1c370218c203a4c5e7c722
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 12:47:29 2023 -0700
+
+ WSL: Exclude WSL+linux specific options for LSP if compiling outside linux.
+
+commit c077d95169cf4cb4946ef174a1bb009559edc27c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 12:46:43 2023 -0700
+
+ LSP: Move header files around to avoid Winsock.h include twice error.
+
+commit 2529da853acab5b93f2dabb0b8730916be15b97c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 12:43:50 2023 -0700
+
+ CMAKE: Add flag to check if compiling under Linux (Not macOS).
+
+commit e5f39ecccf9938f87f3ca0000a6511fd18765c8c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 12:43:27 2023 -0700
+
+ WIN32: Add _WIN32_WINNT flag for minimum supported windows version.
+
+commit 8d47cfa0346c6153ea26352a4942e14365bd8ec3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 12:41:43 2023 -0700
+
+ MEM: Remove inline flag from stdString.
+
+commit f7b7cfa4bd6ae492aafff463d41fb5445cc6866f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 00:03:38 2023 -0700
+
+ VS: Remove VS solution files from cudareflect.
+
+commit ef635ff641b2d26737bbf87b6dd1320130b5fe69
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 00:03:15 2023 -0700
+
+ CMAKE: Add asy-cuda-reflect to root asymptote project with options to disable and CUDA check.
+
+commit f79960b12f7929b690067236aaa9f970f5ffdfa5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Dec 7 00:00:36 2023 -0700
+
+ CMAKE: Add CMakeLists.txt for asy-cuda-reflect.
+
+commit 40cb7b1aa0dd15faf1bb8021cec33aee5907c2a9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Dec 5 20:20:29 2023 -0700
+
+ WIN32: Add rc file to win32 binary.
+
+commit afa78a1c50a106851281f6399dcc0c020b7c105e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Dec 5 20:13:39 2023 -0700
+
+ REPO: Add windows specific ignore files.
+
+commit c45e94ee38f7861743c37bbce2c55eda31b03774
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Dec 5 12:44:31 2023 -0700
+
+ DOCS: Update documentation for GCCCOMPAT_CXX_COMPILER_FOR_MSVC.
+
+commit 27c2d390036be5ea51e57c19b350e4d20c87debb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Dec 5 12:39:27 2023 -0700
+
+ MSVC: Attempt to automatically locate g++ or clang++ if GCCCOMPAT_CXX_COMPILER_FOR_MSVC is not given.
+
+commit b468f92abcc2087ca546c4104c256edf7a9fbc81
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Dec 5 00:04:19 2023 -0700
+
+ x86-64: Disable fpu precision setting for ARM+x64 systems.
+
+commit db074cd9748a26c891b4a702e0fde228974603c3
+Merge: e0e99d71 4f0b7939
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Dec 4 22:39:06 2023 -0700
+
+ Merge branch 'master' into msvc-support
+
+commit e0e99d71fbac590c72a7c2eacd1704d3e3815286
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Nov 26 00:03:06 2023 -0700
+
+ DOCS: Update instructions regarding VCPKG_ROOT environment variable.
+
+commit 04b53182bb3d8d4e47b683ab9511f04d95617f0e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 25 22:54:34 2023 -0700
+
+ ARRAY: Fix out-of-bounds seeking in setNonBridgingSlice.
+
+commit 8894763cbfd60cd94c8f5393000e71b8aad448eb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 24 13:05:35 2023 -0700
+
+ REPO: Exclude all vscode files from repo.
+
+commit 91abd30c7158f2a8bf6887e2547b9cd154fb04a2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 24 13:05:06 2023 -0700
+
+ VSCODE: Remove vscode-specific files.
+
+commit 3cd86de4e22e576b3303a0e4f67a9ec535b1b9f6
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 21:25:39 2023 -0700
+
+ GLRENDER: Specify static_cast directly to stop MSVC's warning.
+
+commit 81afc58b29be836117ced6c101698424dfdd1ad0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 13:43:05 2023 -0700
+
+ CMAKE: Modify asylang test names to use dots for prefixing.
+
+commit 6c46d336f145314bdcea0bc70c469a1498974689
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 13:21:38 2023 -0700
+
+ DOCS: Edit build instructions for msvc build support.
+
+commit ed988bb7e620cd01dd0500511bc8b808c66eb051
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 13:10:47 2023 -0700
+
+ CMAKE: Edit presets file to add msvc presets.
+
+commit f1bb27968bda245d3b3a3e8f0851401bdde4af1d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 13:05:40 2023 -0700
+
+ CMAKE: Fix win32 warnings on gcc-compat C++ compiler.
+
+commit c051134042e7b4a3a404a0315845d939553f7465
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 12:26:48 2023 -0700
+
+ CMAKE: Include BDWgc::gctba if under windows.
+
+commit 350672446d0bb7e63ee421b00a599642973db10d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 12:24:17 2023 -0700
+
+ WIN32: Include GC_throw_bad_alloc only for non-windows builds.
+
+commit 2e3a9b01a9ab3ab25be8184ca6e3fd4a52d1232a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 12:23:26 2023 -0700
+
+ WIN32: Rewrite getEntry to use win32 registry API directly.
+
+commit 20eec0dab82c31ae35b582ffc397018c5e692f3e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 12:22:57 2023 -0700
+
+ WINDOWS: Add win32-specific utilities functions.
+
+commit 5cc05276c24eee371f79d21fc2796e48d005cf41
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 12:17:29 2023 -0700
+
+ TYPES: Move OPEN to types.cc.
+
+commit 7e28ce31298e06ed3b9109283cc7316673f9d11e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 03:12:33 2023 -0700
+
+ W32: Add RegKeyWrapper and checkLStatus.
+
+commit 6cb34f16527514e82eaa0d25b2603e38cf830f28
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 23 02:31:31 2023 -0700
+
+ clang-format: Set column limit to 120.
+
+commit 929ebb5707af54c7e017c3bc30ae9147c0b60d3d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 20 12:01:42 2023 -0700
+
+ WIN32: Do not declare file mask if under windows.
+
+commit a60607176ce334eed5530aae22e64afa3fca6b22
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 20 11:46:41 2023 -0700
+
+ CMAKE: Link to shlwapi for windows builds.
+
+commit 335e876c63b614d872db1856394b88870ca0a420
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 20 11:46:15 2023 -0700
+
+ RUNFILE: Implement mkstemp for windows.
+
+commit 5db542896097e6eb349e0e24fad4f88be642391d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 20 11:45:45 2023 -0700
+
+ WIN32: Do not include linux-specific headers in windows builds.
+
+commit 79a6c5b4f0c66f1742fc47f0ca69f23ce0d195ca
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 20 11:13:00 2023 -0700
+
+ LOCATE: Use fileExists for locate.
+
+commit a10b919dc0fa1e9b018fa672f28a032ddc423fd5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 20 11:12:04 2023 -0700
+
+ UTIL: Add fileExists function for both windows and unix systems.
+
+commit c0b8cbb4cccd79fc54b21d022c66e67f09aad40a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 20 11:11:12 2023 -0700
+
+ GAMMA: Use std::tgamma for gamma function.
+
+commit 5d68a5a5e01c0af87182443a5fe5233102c3d884
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Nov 20 11:06:02 2023 -0700
+
+ WINFLEX: Add --wincompat option for flex args in cmake.
+
+commit f08622f522bb5c8027a78896d5b832570ebb77a7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 23:09:59 2023 -0700
+
+ CXX: Use #pragma message for MSVC compatibility.
+
+commit 638c69010d7ea190e2d26c79552bd09e0e7a0fb8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 23:05:28 2023 -0700
+
+ MSVC: Remove near/far keyword usage for msvc compatibility.
+
commit 4f0b79391800424a729ccd393f31d01cbb86bbb4
Author: John Bowman <bowman@ualberta.ca>
Date: Sat Nov 18 19:38:00 2023 -0800
@@ -1190,24 +6980,426 @@ Date: Sat Nov 18 16:21:56 2023 -0800
Fix warning message.
+commit 503e7e62a6bb71167f4d52fb8c90adca7b26af2d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 16:58:59 2023 -0700
+
+ MSVC: Add option to specify a gcc-compatible C++ compiler for preprocessing.
+
+commit 4cac9d295508188871c5fd76b9a3db90fefeca69
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 15:46:10 2023 -0700
+
+ TEST: Remove tests/makefile.
+
+commit 5a553ff0f51e04752745ee721e0af5036538e9f2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 15:29:25 2023 -0700
+
+ REPO: Add scratch directory for testing.
+
+commit 04cc52e6457719aeee1144ea17de03201d5c6605
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 15:17:48 2023 -0700
+
+ ASY: Add remaining tests to asylang tests.
+
+commit 1c85e9b02950b1d08eb81a9bfdfdcb2d4b616ca1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 14:22:19 2023 -0700
+
+ CMAKE: Disable gtest on clang64-win by default.
+
+commit e21bbd08b3432c298b4c49e272a860c86c7ee79a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 13:25:33 2023 -0700
+
+ SECONDS: Fix GetProcessTimes() function.
+
+commit 62649fe534a7629aac8ed84ba96e895d1921d295
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 13:16:52 2023 -0700
+
+ GTEST: Add C++ testing platform for asy.
+
commit 1007bd5d1e92e9d41577cf28f1d81fbd3de04fbf
Author: John Bowman <bowman@ualberta.ca>
Date: Sat Nov 18 12:29:00 2023 -0800
Remove unused include.
+commit 9167ce819797d6ba40d34a3c5466d3e41106fc51
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 12:10:25 2023 -0700
+
+ ENUMS: Move C++ comments to before enum value for editor assistance.
+
+commit 1b3840a6e30987d35c47b1c892b61671c531d30d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 12:05:11 2023 -0700
+
+ MAIN: Move exit handlers form main to exithandlers.
+
+commit 8ea1f89a77fed13639c628991b70909bf2d38c62
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 11:45:12 2023 -0700
+
+ PTHREAD: Fix gc_stack_base initialization in main.cc.
+
+commit f0142d7fc007990f46bdd60cb47e6ce9ca0caeb8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 11:44:49 2023 -0700
+
+ MEM: Move memory definitions to memory.cc.
+
+commit 27ebd855508279ee7e30d593fd4aa220fa8f84e7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 18 00:11:12 2023 -0700
+
+ runtime: Print #line macro correctly.
+
+commit 620fa0c2fbfdd648febc672544166960ccae091e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 17 23:55:40 2023 -0700
+
+ testing: Add asy asylang tests.
+
+commit 015d74583e1b70f4e3e548db02a512ad898d30a4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 17 23:11:52 2023 -0700
+
+ clang-format: Add ReferenceAlignment key.
+
+commit 8a7e79afce7639ede06fff6b139e6d759f9ef9a0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 16 12:32:10 2023 -0700
+
+ GC: Add include guard for windows build without gc for main.cc.
+
commit b6e9a2c4ab8d06720bd28930b0c12589d7da19d5
Author: John Bowman <bowman@ualberta.ca>
Date: Wed Nov 15 15:42:37 2023 -0800
Fix URL.
+commit 567525842001aa4dd40bf0a9e223251601f889c6
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Nov 14 00:20:50 2023 -0700
+
+ CMAKE: Split dependencies into multiple features.
+
+commit feaddf530400bf6d58e05d10726738813c055d80
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Nov 12 01:30:31 2023 -0700
+
+ PTHREAD: Register main thread explicitly if complied under windows.
+
+commit 81c0a0564281a4a2273af46bb1cad8cc0a416373
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Nov 12 01:21:30 2023 -0700
+
+ CMAKE: Explicitly set library building mode to static for windows.
+
+commit 7553e368fe1f7485f1fad450ff01fb31048b36ad
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 11 13:02:45 2023 -0700
+
+ DOCS: Add remarks about perl and python3.
+
+commit 0e4fbf427ba867c933c52833753e696ced87734b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 11 12:48:47 2023 -0700
+
+ DOCS: Change asy target in cmake build instructions.
+
+commit b4617b86868ea03422e980d5a9ac99fdcb187887
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 11 12:48:11 2023 -0700
+
+ DOCS: Add documentation for clang64-win build target.
+
+commit 7493e0054336847287429482513ffee294acec40
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 11 12:21:38 2023 -0700
+
+ CMAKE: Use NOMINMAX for all windows builds.
+
+commit f546992f5f1d858aa16155650d4577d78f96386d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 11 12:17:45 2023 -0700
+
+ PY3: Fix depfile cxx subprocess call.
+
+commit 2a0081a40f631fafdecfc8b5ef23f9eb9939137b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 11 01:06:33 2023 -0700
+
+ CMAKE: Add option for link-time optimization for release builds.
+
+commit d8d5c9f350d9f070a1ef7e3712c2b4e716b030d4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 11 01:06:15 2023 -0700
+
+ CMAKE: Add release build types for cmake.
+
+commit 9645ef9b0d61022a3124c581e723f422f3d9eb49
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 21:23:50 2023 -0700
+
+ CMAKE: Add clang64-win/release preset.
+
+commit 1eb0f4e075567f89822bd0ce2ae90795b6357f1f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 21:21:59 2023 -0700
+
+ tmp: Disable waiting and some signal functions to get windows compilation working.
+
+commit 573f17c2a1979a520f5fb996b6fa8f6afe0c4067
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 21:21:07 2023 -0700
+
+ CMAKE: Add options to enable debug mode for gc.
+
+commit 703f0443f7e9261f9ffd984191a792a5f0d8c4cd
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 20:31:20 2023 -0700
+
+ CMAKE: Remove tinyexr from external-libs (vcpkg).
+
+commit e658d6d1a518db94e1cb7ec89affeaf5e56b8e94
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 20:29:29 2023 -0700
+
+ TIME: Use std::this_thread::sleep_for instead of nanosleep.
+
+commit 52e37142d182b406b9a86929c2b253d5d2218f08
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 20:28:57 2023 -0700
+
+ CMAKE: Link tinyexr-impl library to asy.
+
+commit 642f1870e960f52054dd93b852afe8461924a158
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 20:28:27 2023 -0700
+
+ CMAKE: Move options to before project.
+
+commit 3b9d703de007e8fdfbf007681e6b3542407bdfa3
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 20:27:56 2023 -0700
+
+ TINYEXR: Remove tinyexr from vcpkg since it is breaking cmake.
+
+commit 29d2ac528a22fd3643b7982db106961454e6f29b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 12:26:50 2023 -0700
+
+ Change glrender function to using GLRenderArgs.
+
+commit d2868a128335b0d83a4e7c9d979575d0a8d5f1e0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 03:27:59 2023 -0700
+
+ CMAKE: Add more detail for ENABLE_GL_COMPUTE_SHADERS option.
+
+commit 28db622a2f6cedda7c4f38ea3a0b19f8498860bb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 03:27:41 2023 -0700
+
+ CMAKE: Enable usage of SSBO.
+
+commit 32706d03154422223a204b2dac274d0effd304ab
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 03:21:46 2023 -0700
+
+ CMAKE: Enable usage of fftw3.
+
+commit 1a5fefe10efa0b09b3dcea14bd746b9491f86f06
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 03:21:37 2023 -0700
+
+ VCPKG: Add libfftw3.
+
+commit ad9261574789feab0a33d7720d2a09fc3aee66e9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 02:47:31 2023 -0700
+
+ RUNSTRING: Make time functions work universally.
+
+commit 5b5849a9a75f1823e6aec65c52349b2384323571
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 01:56:18 2023 -0700
+
+ CMAKE: Add basefile targets for asy.
+
+commit 7a57508b7f235544e63880d2b63d8ee0a18b7110
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 01:37:50 2023 -0700
+
+ CMAKE: Add options for enabling XDR/RPC.
+
+commit c64e19b62f07338cf7589c65e25d9d0497bb0e32
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 01:37:35 2023 -0700
+
+ CMAKE: Add codegen for enum files from csv.
+
+commit ecc3e6e93ac2f2465cd320176fbcdce087b51fcd
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 01:37:14 2023 -0700
+
+ CMAKE: Add dependency to copy_base_file.
+
+commit abaf05361faa0d2317cb341be4620595ea6cd231
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 01:12:25 2023 -0700
+
+ CMAKE: Move FindPkgConfig to top of external-libs.
+
+commit 9e60dfbcdba22fc43a56285c2c67666f5680e1a8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 10 00:57:46 2023 -0700
+
+ PY3: Remove date information from generate_enums.
+
+commit a570b3653e9678090f3deb2e3889bf53e026239b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 9 19:37:02 2023 -0700
+
+ PY3: Make c++ compiler error messages visible in gen_preprocessed_depfile.
+
+commit e65a1e6b17fea5816047062d3fc2506799010a8e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 9 19:27:55 2023 -0700
+
+ CMAKE: Add presets for quick building.
+
+commit 7d4257f2853891621e44fa75621f4520dfacd366
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 9 19:27:46 2023 -0700
+
+ CMAKE: Enable usage of opengl in asymptote.
+
+commit 90c6d797a26d735267bc6fb0142b1b85fb0a27d8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 9 19:27:28 2023 -0700
+
+ DOCS: Add a quick readme on how to compile with cmake.
+
+commit e695e83fb807fbfe917669c37b927d39c726923a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Nov 9 19:20:14 2023 -0700
+
+ VCPKG: Add OpenGL libraries to vcpkg list.
+
+commit 978532be7422d7fa1ee41762ffcc1342de4b2c58
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 8 12:08:29 2023 -0700
+
+ CLANG64: Fix remaining compile issues on windows clang64.
+
+commit fa9359073cea1e0dffdc905645da5cc51c49aead
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 8 12:08:12 2023 -0700
+
+ CMAKE: Add options to disable libreadline.
+
+commit f978aca1b71d4d16ff337f8833bbf028bf2aac2d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 8 11:38:17 2023 -0700
+
+ REPO: Add ignore directory.
+
+commit ca6cbe48df1fa21492057810a355f7e52e2aeeb4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 8 11:36:44 2023 -0700
+
+ linux: Fix compile errors for linux.
+
+commit 534dedea2074c179442498051f52ecc5afcca336
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 8 11:18:58 2023 -0700
+
+ main: Make main.cc compilable with windows clang64.
+
+commit 6350cd87aa2d5f8a9fc6a4f7da5c718059663c12
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 8 11:17:59 2023 -0700
+
+ runtime: Make runtime work with windows clang64.
+
+commit bd59f050ec2ceebc21c9c2bd0a09ebd5a0663abb
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 8 11:17:00 2023 -0700
+
+ cmake: Split asy to asy and asycore.
+
+commit 2d3e98f55d621b6c4facaca18cc222652d17ab04
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 8 01:38:28 2023 -0700
+
+ pipestream: Add win32pipestream for windows as a pipestream re-implementation.
+
+commit e093b578c9f8fa409ce181c437f873eb086b6d51
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Nov 8 01:37:58 2023 -0700
+
+ WINCMD: Move buildWindowsCmd to win32helpers.
+
commit b706a4fd6718e1aa1b3ce06ca657b60fc54ea4c2
Author: John Bowman <bowman@ualberta.ca>
Date: Mon Nov 6 23:44:14 2023 -0800
Implement mapArray via mapArrayString.
+commit 41524fb58214247012fc99661613f2bf94a3d9e9
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 4 19:44:04 2023 -0600
+
+ lex/bison: Change eof to isEof to avoid symbol collision.
+
+commit ed166a41560ea09734668e8c98a293207a45fa8d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 4 19:23:34 2023 -0600
+
+ lex/bison: Change THIS to THIS_TOK to avoid macro collision.
+
+commit 515b9aef2358c5b89782797705fcdc822d1fa7fa
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 4 13:26:26 2023 -0600
+
+ PARSER: include curl.h before common.h to avoid Windows.h.
+
+commit ab9e0c73329f973e73b9c1dfae05e398acce751e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 4 13:21:48 2023 -0600
+
+ EOF: Rename eof to eofException.
+
+commit 9fb59b744ef66bd88abe54ab57c02e9892ee5983
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 4 13:10:23 2023 -0600
+
+ DRAWLABEL: Make draw() unix/windows compatible.
+
+commit 9939dd25a1ae669e01c1fb15a8c0bb6d39f93f2e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 4 12:55:53 2023 -0600
+
+ SETTINGS: Make settings compatible with windows.
+
+commit a4a42186fe35913035d6b5bcc08349bfbd828cfa
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 4 12:50:17 2023 -0600
+
+ GETOPT: Use vcpkg getopt instead of backports.
+
+commit 591e5c10a9bbc37f914d979b7bb298b6ab989f17
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sat Nov 4 12:45:51 2023 -0600
+
+ GLEW: Move all of glew into backports.
+
commit e991c19bbb4318201be9e6d8fa11e58ff93c1183
Author: John Bowman <bowman@ualberta.ca>
Date: Fri Nov 3 23:49:52 2023 -0700
@@ -1244,6 +7436,444 @@ Date: Fri Nov 3 23:42:04 2023 -0700
origin: "???"
commit: "???"
+commit cfa9a669968a22812b85529f9db9b924451450ec
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 3 14:35:23 2023 -0600
+
+ UTIL: Make util.cc win32 compatible.
+
+commit e0d4d79a3636f69cf9d978b75036f8e93084013a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Nov 3 14:34:14 2023 -0600
+
+ W32: Add win32helpers utility to asy.
+
+commit f9f7e11d69746c5a88b0d95d87a185132d32bdee
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 23:16:39 2023 -0600
+
+ MSVC: Add additional /Zc options for msvc compiler.
+
+commit 2356520099f62fd7b49ff442161064557547a075
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 23:16:06 2023 -0600
+
+ MSVC: Add ciso646 for and/or/not support.
+
+commit fb9f05c922a8f9a6c83566a1cf5e9c3b4ddbaf05
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 23:05:33 2023 -0600
+
+ CXX: Rename process.h to processutils.h to avoid name collision.
+
+commit 179fa49b7049de409730092d357a0bd8a79972c0
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 22:10:08 2023 -0600
+
+ GETOPT: Make getopt compatible with C99 and beyond.
+
+commit 64ead4713a8e8b4f8ee3254062d424e7b5a51cae
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 15:46:17 2023 -0600
+
+ !hack: Add explicitly runtime.h file for msvc codegen stage.
+
+commit 5d2ad06fdfcf9c686198a93ffec25f44a9f2a829
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 15:31:40 2023 -0600
+
+ REPO: Add visual studio files to ignore list.
+
+commit dc38e817f3d88eba5f8f6f68041fe02d6b133628
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 15:01:58 2023 -0600
+
+ REPO: Add CMakeUserPresets.json to ignore list.
+
+commit e3104efab7ff7a2f1c014b876b6857d3f12fa4aa
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 14:58:46 2023 -0600
+
+ CMAKE: Add __MSDOS__ build macro for windows builds.
+
+commit 3ee7085978bfd45779e83eb8ec119a4f0077f013
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 14:53:39 2023 -0600
+
+ PREPROC: Add python code to properly process msvc source outputs to depfiles and preprocessed files.
+
+commit 3f64b1b3513e884f0aa67854c7c44f8572a61b75
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 14:52:35 2023 -0600
+
+ MSVC: Exclude non-windows header files properly.
+
+commit 40b0234f343eed4268c7b88bad0b3f46fe157257
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 12:54:36 2023 -0600
+
+ PIPESTREAM: Use SSIZE_T for msvc compilation.
+
+commit 6e2f612089e6e6944a639bb08ce7ad937e22146d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 12:17:55 2023 -0600
+
+ MSVC: Enable NOMINMAX for windows compilation flags.
+
+commit 5c3b516087339d68f51b0e005629b95203a1ffcc
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 02:02:18 2023 -0600
+
+ MSVC: Work around strings.h for msvc builds.
+
+commit 75c394fedebffab5d9ab97b1b07f761496203f43
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 01:55:32 2023 -0600
+
+ CMAKE: Properly set __cplusplus variable for version checking.
+
+commit b9df13ec7b21e9b1dc97361af38faf42687ef3c1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 01:46:32 2023 -0600
+
+ CMAKE: Add handling for c++ standard in preprocessing script.
+
+commit 94955792af93477fb0d5a700ff395b53c1e98b31
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 00:53:53 2023 -0600
+
+ CMAKE: Use backports/getopt for windows builds.
+
+commit 9a294167efe0e40188d07a63d9b41e379f734352
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 00:53:30 2023 -0600
+
+ GETOPT: Add CMakeLists.txt for getopt.
+
+commit 02a66799b0e7c71753c9ecf5023d6e2a8777eda6
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 00:53:09 2023 -0600
+
+ REPO: Reorganize backports directory to better select which packages we need.
+
+commit c920ed6eab682aa7b335c838a4049c1289dbccf2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 00:27:52 2023 -0600
+
+ CMAKE: Enable usage of Pthreads4W on windows.
+
+commit 7b617c172848272d436f06657e75cb7297380d1f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 00:27:34 2023 -0600
+
+ CMAKE: Use the same readline configuration for both windows and unix systems.
+
+commit ceffa9e460adcdf6a55552ad1495dad141bb9dbf
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 00:27:04 2023 -0600
+
+ CMAKE: Enable usage of pdcurses on windows.
+
+commit d9117e43ec8a28500e5da3ce55ee4eb62dd463f2
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 00:26:41 2023 -0600
+
+ CMAKE: Download winflexbison if custom binary not given.
+
+commit 7ab138ebb4d5f92b25e9de0737b9c59e8553d53c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 00:26:09 2023 -0600
+
+ CMAKE: Add option for custom flex and bison binaries for windows.
+
+commit 7da5e12d8c36eb468e6b413c76ca05f790f43acd
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Oct 27 22:53:42 2023 -0600
+
+ VCPKG: Use pdcurses for windows build.
+
+commit 93f4208727e4db8eb2575f047d812506f6706f2c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 29 01:31:20 2023 -0600
+
+ CMAKE: Fix CMAKE_CXX_STANDARD_REQUIRED.
+
+commit 3d97b66fafc25a942ce7493e03a8a585d95c9196
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Oct 26 01:28:15 2023 -0600
+
+ CMAKE: Enable usage of eigen.
+
+commit ca13bbb32b2d49cafb6dc241b283d92c01627ef4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Oct 26 01:28:00 2023 -0600
+
+ VCPKG: Add eigen to package list.
+
+commit ef2e02a50770506be3577e228af8033aa135732c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Oct 26 01:09:57 2023 -0600
+
+ CMAKE: Enable usage of gsl.
+
+commit ce8350fa0be4f9f52409ef9d5f1b345680f2ae20
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Oct 26 01:09:26 2023 -0600
+
+ VCPKG: Add GSL to package list.
+
+commit 4f3b07b89f1a1fed6aec659e605ea0e3c2cd39b4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Oct 25 02:12:46 2023 -0600
+
+ CMAKE: Enable building with pthreads.
+
+commit 770b3ff9e1a70811165757fc5b4da58521488ada
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Oct 25 02:12:27 2023 -0600
+
+ VCPKG: Add pthreads to package list.
+
+commit 01c4240413b9627393559f153c13538ea2b89ea8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Oct 25 01:57:27 2023 -0600
+
+ CURL: Add check for LIBCURL_VERSION_NUM instead of CURLOPT_XFERINFODATA.
+
+commit cae3c911a2f889181b50adb2b6854c91bfc3abe8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Oct 25 01:57:04 2023 -0600
+
+ CMAKE: Enable using of libcurl.
+
+commit 24a59bfc6ee21e0618f1d1995aef49fc543e588b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Wed Oct 25 01:56:52 2023 -0600
+
+ VCPKG: Add libcurl to vcpkg.
+
+commit 32dbc1fa31f14e08b3b7ad7cbf269f4ef0554eac
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Oct 24 23:44:59 2023 -0600
+
+ CMAKE: Enable building for libreadline and curses.
+
+commit f4774afa33a107de47ebc140e4b0adb33798dff4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Oct 24 23:44:45 2023 -0600
+
+ VCPKG: Add curses and readline library.
+
+commit af9823a1318199dd4840506a8ee7761b74ab34a5
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Oct 24 23:12:44 2023 -0600
+
+ CMAKE: Enable linking of gc.
+
+commit 2b8681a390a216b6872af021dda6d70170affa77
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Tue Oct 24 23:12:32 2023 -0600
+
+ VCPKG: Add gc to package list.
+
+commit 2e696b8e67b4ef6b923c97057feabad3df05ffcc
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Oct 23 02:00:34 2023 -0600
+
+ CMAKE: Copy base files to build directory.
+
+commit 3f44dce96a1f30e7f551cc98cac6547b64a89592
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 18:55:23 2023 -0600
+
+ CMAKE: Move preprocessed file generation to a python script.
+
+commit dd3060306d4dea6196b20756e2ea3ffc14d7895f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 14:52:11 2023 -0600
+
+ CMAKE: Add codegen for revision.cc.
+
+commit a4d1ebe3a84e90fcca7c81ac6a6f15a78b175bea
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 14:51:59 2023 -0600
+
+ CMAKE: Add ASY_GL_VERSION.
+
+commit 3837e3965bc01ad679373b4ef5fbcbb43993f34a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 14:09:15 2023 -0600
+
+ PERL: Fix Fix warnings in perl.
+
+commit 82af38ab8d8e730c60c147d347d272dca1009823
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 13:55:57 2023 -0600
+
+ CMAKE: Add *.symbols.h to build target.
+
+commit b342518d5de29a16ab60baf7a61e04c872c24a84
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 12:35:25 2023 -0600
+
+ CMAKE: Add flex+bison files.
+
+commit c602f03f4fff1d16e4a402aaef041af9cdb7ddd7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 02:42:08 2023 -0600
+
+ CMAKE: Add HAVE_UNORDERED_MAP to compilation macro.
+
+commit 600c1b250c3ab6c935c7a4c705724a0c1a823c85
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 02:41:36 2023 -0600
+
+ CMAKE: Make include directories work properly in codegen.
+
+commit 22c709375c373072fb8e81762f057daa8946617e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 02:41:13 2023 -0600
+
+ ZLIB: Add zlib to cmake lists.
+
+commit 72d688bcd27252a01ade37099c724f088699367c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 02:40:20 2023 -0600
+
+ KEYWORDS: Add keywords.h to target.
+
+commit bc7f64d9582f12b9a28a72827a932166a095f89b
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 02:40:03 2023 -0600
+
+ KEYWORDS: Make keywords.pl work with cmake.
+
+commit daf4160a3dc675d06774740411001095ea5df365
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 02:39:40 2023 -0600
+
+ EXR: Remove tinyexr from compilation target.
+
+commit 7dfcf08a3c02e6466eea8b486f0e937a1e06f12c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 02:39:18 2023 -0600
+
+ VCPKG: Add vcpkg manifest file.
+
+commit 84260f414678805e63ce3206c8744ac09636f6b1
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 00:40:34 2023 -0600
+
+ CMAKE: Add common functions file.
+
+commit a33328d7191053bb51819bddf7f5741cfba29310
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 00:40:12 2023 -0600
+
+ CMAKE: Fix ASYMPTOTE_GENERATED_HEADERS.
+
+commit f5410edb8973e24ac78b6544d4c0ed94b0d6e61f
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 00:40:00 2023 -0600
+
+ CMAKE: Add codegen for allsymbols.h.
+
+commit 1fdbe6f201b0abb22eebbe94d4611f4dd4e6b622
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 00:39:26 2023 -0600
+
+ PERL: Make findsym work with strict mode.
+
+commit 611eab2e467dbc0d0abb1a5a481e129fd858f899
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 00:39:19 2023 -0600
+
+ PERL: Add arguments to opsymbols and runtime.
+
+commit edc37304fd3c28531397d5bfd8db0be7be5f1c37
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 22 00:33:03 2023 -0600
+
+ CC: Fix glrender.cc file.
+
+commit 68bb68bd88b19e0c7962203fe0ed451d59aecea4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Thu Oct 19 23:35:25 2023 -0600
+
+ CMAKE: Add brief skeleton for using cmake.
+
+commit 16afc037b93d603bd8ca5270bbbbb074bc0bbc0e
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Oct 16 00:50:51 2023 -0600
+
+ CMAKE: Add pkg-info.cmake for package information.
+
+commit ec021ce10d31d8732a96370f84da94f11ed0c939
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Oct 16 00:48:32 2023 -0600
+
+ GSL: Add config.h check to gsl.cc.
+
+commit 04d9db73670dd307063e2a5361363f5a5a1340a4
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Mon Oct 16 00:21:35 2023 -0600
+
+ PERL: Add use strict/warnings to all perl scripts.
+
+commit ec2bf90f1597a99869d03314f79f4bb343294325
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 15 03:12:42 2023 -0600
+
+ COMMON: Use cstdint uint64 for Int max and min.
+
+commit 7066d5bf4423af956b8b526fe22ebdc06e679524
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 15 02:58:36 2023 -0600
+
+ PRC: Add CMakeLists to PRC File.
+
+commit db6c98d2b8db271f7fad8eee8a42ab22d44ca2e8
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 15 02:58:26 2023 -0600
+
+ PRC: Reorganize structure of PRC library.
+
+commit 2878414db8e65036ec3e938a950bb1d58f68ff1c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Sun Oct 15 02:58:03 2023 -0600
+
+ PRC: Remove Makefile.
+
+commit 58343ae0e8297b94ec53227e2b0705ae5d50844a
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Oct 13 23:28:11 2023 -0600
+
+ TINYEXR: Remove tinyexr from subrepo.
+
+commit 593c5abf8e808c783d59c14d0b216dd53aaf876d
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Oct 13 23:01:17 2023 -0600
+
+ DIR: Move file structure around to clean up repository.
+
+commit 1f2f2e9399bcf98ddbae73417a0a4c5f8449c535
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Oct 13 22:43:27 2023 -0600
+
+ REPO: Add CMake files to ignore list.
+
+commit 420bcf146dacb0f0dc52d7b251c2a2be0ca43d1c
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Oct 13 22:41:29 2023 -0600
+
+ CMAKE: Add basic CMake build file.
+
+commit f13648ec70031173268fb34b54e097e30a7b21b7
+Author: Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>
+Date: Fri Oct 13 22:37:56 2023 -0600
+
+ MAKE: Remove Makefile and autotools files.
+
commit 2cb894653a74235788ce33575f9a1af1ea15796b
Author: John Bowman <bowman@ualberta.ca>
Date: Tue Oct 10 23:14:04 2023 -0700
@@ -19374,6 +26004,19 @@ Date: Sat Jan 7 19:16:44 2017 -0700
Add deepyellow synonym for olive color.
+commit 0b07b0db01be9e2bd24b1e3aeb182c7f9b57327c
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Mon Dec 26 18:19:02 2016 -0500
+
+ Document using keyword
+
+commit 96b017b1a26305700dffc52a80153c799d0f3b4e
+Merge: 9ab90951 1cc7f83d
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Mon Dec 26 17:17:13 2016 -0500
+
+ Merge branch 'master' into using_typedef
+
commit c71d3faf1bd0370b6ad3e464e2c0dbed934d15a6
Author: Charles Staats III <charles.staats.iii@gmail.com>
Date: Mon Dec 26 17:15:00 2016 -0500
@@ -19706,6 +26349,24 @@ Date: Fri May 6 16:49:41 2016 +0200
Makefile.in: replace 'test ! -e' => 'test ! -s'
for compatibility with older shell (on systems like Solaris)
+commit 9ab90951efb23c33f948738b24d40ee6ce14b76d
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Apr 19 21:08:01 2016 -0700
+
+ More formatting fixes.
+
+commit c017602769b807f2f9dbcc59d6e355c9f978fcec
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Apr 19 21:02:19 2016 -0700
+
+ Improve formatting of new lines in camp.y
+
+commit e939bc5faf36c1b6dc0d55f5ac63c1f5c235f9ab
+Author: Charles Staats III <charles.staats.iii@gmail.com>
+Date: Tue Apr 19 20:52:13 2016 -0700
+
+ Add using keyword as typedef alternative.
+
commit 656cf9764dc937aa12bd50fe8dc2e0354c7c5e64
Author: John Bowman <bowman@ualberta.ca>
Date: Fri Mar 18 16:42:22 2016 -0600
diff --git a/graphics/asymptote/EXRFiles.h b/graphics/asymptote/EXRFiles.h
index 36bd8b9b57..c498ca4ddc 100644
--- a/graphics/asymptote/EXRFiles.h
+++ b/graphics/asymptote/EXRFiles.h
@@ -4,7 +4,7 @@
#pragma once
#include "common.h"
-#include "cudareflect/tinyexr/tinyexr.h"
+#include <tinyexr.h>
namespace camp
{
diff --git a/graphics/asymptote/GUI/ContextWindow.py b/graphics/asymptote/GUI/ContextWindow.py
index 5304472680..1b0afd5213 100644
--- a/graphics/asymptote/GUI/ContextWindow.py
+++ b/graphics/asymptote/GUI/ContextWindow.py
@@ -3,25 +3,11 @@
import PyQt5.QtWidgets as Qw
import PyQt5.QtGui as Qg
import PyQt5.QtCore as Qc
-import xasyVersion
-import xasyUtils as xu
import xasy2asy as x2a
-import xasyFile as xf
-import xasyOptions as xo
-import UndoRedoStack as Urs
-import xasyArgs as xa
-import xasyBezierInterface as xbi
-from xasyTransform import xasyTransform as xT
-import xasyStrings as xs
-import PrimitiveShape
-import InplaceAddObj
+from xasyTransform import xasyTransform as xT
-import CustMatTransform
-import SetCustomAnchor
-import GuidesManager
-import time
class AnotherWindow(Qw.QWidget):
def __init__(self, shape, parent):
diff --git a/graphics/asymptote/GUI/CustMatTransform.py b/graphics/asymptote/GUI/CustMatTransform.py
index 0a66807d35..6a6223b6a0 100644
--- a/graphics/asymptote/GUI/CustMatTransform.py
+++ b/graphics/asymptote/GUI/CustMatTransform.py
@@ -5,7 +5,7 @@ import PyQt5.QtGui as QtGui
import PyQt5.QtCore as QtCore
import numpy as numpy
import xasy2asy as xasy2asy
-from pyUIClass.custMatTransform import Ui_Dialog
+from xasyqtui.custMatTransform import Ui_Dialog
class CustMatTransform(QtWidgets.QDialog):
diff --git a/graphics/asymptote/GUI/SetCustomAnchor.py b/graphics/asymptote/GUI/SetCustomAnchor.py
index e4414fecc4..647eedc49c 100644
--- a/graphics/asymptote/GUI/SetCustomAnchor.py
+++ b/graphics/asymptote/GUI/SetCustomAnchor.py
@@ -3,7 +3,7 @@
import PyQt5.QtWidgets as QtWidgets
import PyQt5.QtGui as QtGui
import PyQt5.QtCore as QtCore
-from pyUIClass.setCustomAnchor import Ui_Dialog
+from xasyqtui.setCustomAnchor import Ui_Dialog
class CustomAnchorDialog(QtWidgets.QDialog):
diff --git a/graphics/asymptote/GUI/Widg_addLabel.py b/graphics/asymptote/GUI/Widg_addLabel.py
index a5a6503503..121b84df4a 100644
--- a/graphics/asymptote/GUI/Widg_addLabel.py
+++ b/graphics/asymptote/GUI/Widg_addLabel.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-from pyUIClass.widg_addLabel import Ui_Form
+from xasyqtui.widg_addLabel import Ui_Form
import PyQt5.QtWidgets as QtWidgets
import PyQt5.QtGui as QtGui
diff --git a/graphics/asymptote/GUI/Widg_addPolyOpt.py b/graphics/asymptote/GUI/Widg_addPolyOpt.py
index 3d1e419d89..3a02f5ec04 100644
--- a/graphics/asymptote/GUI/Widg_addPolyOpt.py
+++ b/graphics/asymptote/GUI/Widg_addPolyOpt.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-from pyUIClass.widg_addPolyOpt import Ui_Form
+from xasyqtui.widg_addPolyOpt import Ui_Form
import PyQt5.QtWidgets as QtWidgets
import PyQt5.QtGui as QtGui
diff --git a/graphics/asymptote/GUI/Widg_editBezier.py b/graphics/asymptote/GUI/Widg_editBezier.py
index 161715e0fc..e45c2338e5 100644
--- a/graphics/asymptote/GUI/Widg_editBezier.py
+++ b/graphics/asymptote/GUI/Widg_editBezier.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-from pyUIClass.widg_editBezier import Ui_Form
+from xasyqtui.widg_editBezier import Ui_Form
import PyQt5.QtWidgets as QtWidgets
import PyQt5.QtCore as QtCore
diff --git a/graphics/asymptote/GUI/Window1.py b/graphics/asymptote/GUI/Window1.py
index 1e65b23597..dca5cae202 100644
--- a/graphics/asymptote/GUI/Window1.py
+++ b/graphics/asymptote/GUI/Window1.py
@@ -1,11 +1,11 @@
#!/usr/bin/env python3
-from pyUIClass.window1 import Ui_MainWindow
+from xasyqtui.window1 import Ui_MainWindow
import PyQt5.QtWidgets as Qw
import PyQt5.QtGui as Qg
import PyQt5.QtCore as Qc
-import xasyVersion
+from xasyversion.version import VERSION as xasyVersion
import numpy as np
import os
@@ -143,13 +143,14 @@ class MainWindow1(Qw.QMainWindow):
if self.settings['asyBaseLocation'] is not None:
os.environ['ASYMPTOTE_DIR'] = self.settings['asyBaseLocation']
- if self.args.asypath is not None:
- asyPath = self.args.asypath
- else:
- asyPath = self.settings['asyPath']
+ addrAsyArgsRaw: str = self.args.additionalAsyArgs or \
+ self.settings.get('additionalAsyArgs', "")
- self.asyPath = asyPath
- self.asyEngine = x2a.AsymptoteEngine(self.asyPath)
+ self.asyPath = self.args.asypath or self.settings.get('asyPath')
+ self.asyEngine = x2a.AsymptoteEngine(
+ self.asyPath,
+ None if not addrAsyArgsRaw else addrAsyArgsRaw.split(',')
+ )
try:
self.asyEngine.start()
@@ -936,7 +937,7 @@ class MainWindow1(Qw.QMainWindow):
webbrowser.open_new(asyManualURL)
def actionAbout(self):
- Qw.QMessageBox.about(self,"xasy","This is xasy "+xasyVersion.xasyVersion+"; a graphical front end to the Asymptote vector graphics language: https://asymptote.sourceforge.io/")
+ Qw.QMessageBox.about(self,"xasy","This is xasy "+xasyVersion+"; a graphical front end to the Asymptote vector graphics language: https://asymptote.sourceforge.io/")
def actionExport(self, pathToFile):
asyFile = io.open(os.path.realpath(pathToFile), 'w')
diff --git a/graphics/asymptote/GUI/buildtool.py b/graphics/asymptote/GUI/buildtool.py
new file mode 100644
index 0000000000..92d815e77a
--- /dev/null
+++ b/graphics/asymptote/GUI/buildtool.py
@@ -0,0 +1,122 @@
+#!/usr/bin/env python3
+import argparse
+import pathlib
+import sys
+import subprocess
+import shutil
+from typing import Optional
+
+from PyQt5.uic import compileUiDir
+import os
+
+BUILD_ROOT_DIRECTORY = pathlib.Path(os.path.dirname(os.path.abspath(__file__)))
+sys.path.append(str(BUILD_ROOT_DIRECTORY.parent))
+
+import determine_pkg_info
+
+XASY_ICONS_MODULE_NAME = "xasyicons"
+
+PY_UI_FILE_DIR = BUILD_ROOT_DIRECTORY / "xasyqtui"
+PY_ICONS_FILE_DIR = BUILD_ROOT_DIRECTORY / XASY_ICONS_MODULE_NAME
+PY_VERSION_MODULE_DIR = BUILD_ROOT_DIRECTORY / "xasyversion"
+
+
+def _map_ui_file(_: str, fileName: str):
+ return str(PY_UI_FILE_DIR), fileName
+
+
+def make_init_py_at_dir(dir_name: pathlib.Path):
+ (dir_name / "__init__.py").touch(exist_ok=True)
+
+
+def build_ui():
+ compileUiDir(
+ "windows",
+ map=_map_ui_file,
+ from_imports=True,
+ import_from=XASY_ICONS_MODULE_NAME,
+ )
+ make_init_py_at_dir(PY_UI_FILE_DIR)
+
+
+def build_icons():
+ PY_ICONS_FILE_DIR.mkdir(exist_ok=True)
+ make_init_py_at_dir(PY_ICONS_FILE_DIR)
+ subprocess.run(
+ [
+ "pyrcc5",
+ str(BUILD_ROOT_DIRECTORY / "res" / "icons.qrc"),
+ "-o",
+ str(PY_ICONS_FILE_DIR / "icons_rc.py"),
+ ]
+ )
+
+
+def determine_asy_version() -> str:
+ version_base = determine_pkg_info.determine_asy_pkg_info(
+ BUILD_ROOT_DIRECTORY.parent / "configure.ac"
+ ).get("version-base")
+ if not version_base:
+ return "0.0.0-SNAPSHOT"
+ return version_base
+
+
+def build_verison_module(version_override: Optional[str] = None):
+ PY_VERSION_MODULE_DIR.mkdir(exist_ok=True)
+ make_init_py_at_dir(PY_VERSION_MODULE_DIR)
+ if version_override is not None:
+ version = version_override
+ else:
+ version = determine_asy_version()
+ with open(PY_VERSION_MODULE_DIR / "version.py", "w", encoding="utf-8") as f:
+ f.write(f'VERSION="{version}"\n')
+
+
+def clean():
+ if PY_UI_FILE_DIR.exists():
+ shutil.rmtree(PY_UI_FILE_DIR)
+
+ if PY_ICONS_FILE_DIR.exists():
+ shutil.rmtree(PY_ICONS_FILE_DIR)
+
+ if PY_VERSION_MODULE_DIR.exists():
+ shutil.rmtree(PY_VERSION_MODULE_DIR)
+
+
+def parse_args():
+ parser = argparse.ArgumentParser()
+ subparsers = parser.add_subparsers(help="subcommands", dest="subcommand")
+ version_parser = subparsers.add_parser(
+ "buildversionmodule", help="build version module"
+ )
+ build_parser = subparsers.add_parser("build", help="build command")
+ for subparser in [build_parser, version_parser]:
+ subparser.add_argument("--version-override", required=False, type=str)
+
+ subparsers.add_parser("clean", help="clean command")
+ subparsers.add_parser("buildicons", help="build icons")
+ subparsers.add_parser("buildui", help="build ui files")
+
+ return parser.parse_args()
+
+
+def main():
+ args = parse_args()
+ if args.subcommand == "buildui":
+ build_ui()
+ elif args.subcommand == "buildicons":
+ build_icons()
+ elif args.subcommand == "buildversionmodule":
+ build_verison_module(args.version_override)
+ elif args.subcommand == "build":
+ build_ui()
+ build_icons()
+ build_verison_module(args.version_override)
+ elif args.subcommand == "clean":
+ clean()
+ else:
+ raise RuntimeError("Unknown subcommand")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/graphics/asymptote/GUI/configs/xasyconfig.cson b/graphics/asymptote/GUI/configs/xasyconfig.cson
index 5f0c1abc17..98998a802d 100644
--- a/graphics/asymptote/GUI/configs/xasyconfig.cson
+++ b/graphics/asymptote/GUI/configs/xasyconfig.cson
@@ -1,13 +1,13 @@
# Default Options for xasy
-# External editor. $asypath will be replaced by the current file.
+# External editor. $asypath will be replaced by the current file.
externalEditor: "vi"
externalEditorArgs: ["$asypath"]
# Path to Asymptote executable
asyPath: "asy"
-# Overwrites the ASYMPTOTE_DIR Environment variable if set. Otherwise, leaves asymptote to decide.
+# Overwrites the ASYMPTOTE_DIR Environment variable if set. Otherwise, leaves asymptote to decide.
asyBaseLocation: null
# Show Debugging Information
@@ -16,21 +16,21 @@ showDebug: false
# Default Pen Options
defaultPenOptions: ""
-# Default Pen Color
+# Default Pen Color
defaultPenColor: "#000000"
-#
+#
defaultPenWidth: 0.5
useLegacyDrawMode: false
enableImmediatePreview: true
useDegrees: false
groupObjDefault: false
-#
+#
terminalFont: "Courier"
terminalFontSize: 9
-#
+#
defaultShowAxes: true
defaultShowGrid: false
defaultGridSnap: false
@@ -52,6 +52,11 @@ renderDensity: 2
minimumMagnification: 0.01
maximumMagnification: 100
+# SVG options
+# If null, use "rsvg-convert".
+# otherwise use the converter in the path
+rsvgConverterPath: null
+
# Debug Mode
debugMode: true
diff --git a/graphics/asymptote/GUI/labelEditor.py b/graphics/asymptote/GUI/labelEditor.py
index 7da1c5f903..4bafd106ee 100644
--- a/graphics/asymptote/GUI/labelEditor.py
+++ b/graphics/asymptote/GUI/labelEditor.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-from pyUIClass.labelTextEditor import Ui_Dialog
+from xasyqtui.labelTextEditor import Ui_Dialog
import PyQt5.QtWidgets as QtWidgets
import PyQt5.QtSvg as QtSvg
import PyQt5.QtGui as QtGui
diff --git a/graphics/asymptote/GUI/requirements.dev.txt b/graphics/asymptote/GUI/requirements.dev.txt
new file mode 100644
index 0000000000..503ef71bd6
--- /dev/null
+++ b/graphics/asymptote/GUI/requirements.dev.txt
@@ -0,0 +1 @@
+setuptools~=70.0.0
diff --git a/graphics/asymptote/GUI/requirements.txt b/graphics/asymptote/GUI/requirements.txt
index 6e0a44196a..54b2478792 100644
--- a/graphics/asymptote/GUI/requirements.txt
+++ b/graphics/asymptote/GUI/requirements.txt
@@ -1,4 +1,3 @@
-numpy==1.22.0
-cson==0.7
-PyQt5==5.11
-rsvg-convert==2.42.3
+numpy~=1.26.4
+cson~=0.8
+PyQt5~=5.15.0
diff --git a/graphics/asymptote/GUI/setup.py b/graphics/asymptote/GUI/setup.py
index a1b25d809a..10491f12d8 100644
--- a/graphics/asymptote/GUI/setup.py
+++ b/graphics/asymptote/GUI/setup.py
@@ -1,11 +1,11 @@
#!/usr/bin/env python3
-import xasyVersion
+from xasyversion import version
from setuptools import setup
setup(
name="xasy",
- version=xasyVersion.xasyVersion,
+ version=version.VERSION,
author="Supakorn Rassameemasmuang, Orest Shardt, and John C. Bowman",
description="User interface for Asymptote, a vector graphics language",
url="https://asymptote.sourceforge.io",
diff --git a/graphics/asymptote/GUI/xasy.py b/graphics/asymptote/GUI/xasy.py
index a078690b68..84eaf689a8 100755
--- a/graphics/asymptote/GUI/xasy.py
+++ b/graphics/asymptote/GUI/xasy.py
@@ -1,6 +1,11 @@
#!/usr/bin/env python3
-import sys, signal, os
+import sys
+import pathlib
+
+sys.path.append(str(pathlib.Path(__file__).resolve().parent))
+
+import signal, os
import PyQt5.QtWidgets as QtWidgets
import PyQt5.QtCore as QtCore
from Window1 import MainWindow1
diff --git a/graphics/asymptote/GUI/xasy2asy.py b/graphics/asymptote/GUI/xasy2asy.py
index 25c75b2ecf..52403da38f 100644
--- a/graphics/asymptote/GUI/xasy2asy.py
+++ b/graphics/asymptote/GUI/xasy2asy.py
@@ -30,6 +30,8 @@ import queue
import io
import atexit
import DebugFlags
+import threading
+from typing import Optional
import xasyUtils as xu
import xasyArgs as xa
@@ -70,7 +72,14 @@ class AsymptoteEngine:
"""
xasy=chr(4)+'\n'
- def __init__(self, path=None, keepFiles=DebugFlags.keepFiles, keepDefaultArgs=True):
+ def __init__(
+ self,
+ path=None,
+ addrArgsParam: Optional[list[str]] = None,
+ keepFiles=DebugFlags.keepFiles,
+ keepDefaultArgs=True
+ ):
+ addrArgs = addrArgsParam or []
if path is None:
path = xa.getArgs().asypath
if path is None:
@@ -92,10 +101,7 @@ class AsymptoteEngine:
self.istream = os.fdopen(ra, 'r')
self.keepFiles = keepFiles
- if sys.platform[:3] == 'win':
- self.tmpdir = tempfile.mkdtemp(prefix='xasyData_',dir='./')+'/'
- else:
- self.tmpdir = tempfile.mkdtemp(prefix='xasyData_')+os.sep
+ self.tmpdir = tempfile.mkdtemp(prefix='xasyData_')+os.sep
if xa.getArgs().render:
renderDensity=xa.getArgs().render
@@ -106,7 +112,15 @@ class AsymptoteEngine:
renderDensity = 2
renderDensity=max(renderDensity,1)
- self.args=['-xasy', '-noV', '-q', '-outformat=', '-inpipe=' + str(rx), '-outpipe=' + str(wa), '-render='+str(renderDensity), '-o', self.tmpdir]
+ self.args=addrArgs + [
+ '-xasy',
+ '-noV',
+ '-q',
+ '-outformat=',
+ '-inpipe=' + str(rx),
+ '-outpipe=' + str(wa),
+ '-render='+str(renderDensity),
+ '-o', self.tmpdir]
self.asyPath = path
self.asyProcess = None
@@ -115,9 +129,11 @@ class AsymptoteEngine:
""" starts a subprocess (opens a pipe) """
try:
if sys.platform[:3] == 'win':
- self.asyProcess = subprocess.Popen([self.asyPath] + self.args,
- stdin=subprocess.PIPE, stderr=subprocess.PIPE,
- universal_newlines=True)
+ self.asyProcess = subprocess.Popen(
+ [self.asyPath] + self.args,
+ stdin=subprocess.PIPE, stderr=subprocess.PIPE,
+ text=True
+ )
self.ostream = self.asyProcess.stdin
self.istream = self.asyProcess.stderr
else:
@@ -584,23 +600,6 @@ class asyPath(asyObj):
return newObj
- @classmethod
- def fromBezierPoints(cls, pointList: list, engine=None):
- if not pointList:
- return None
- assert isinstance(pointList[0], BezierCurveEditor.BezierPoint)
- nodeList = []
- controlList = []
- for point in pointList:
- nodeList.append(BezierCurveEditor.QPoint2Tuple(point.point))
- if point.rCtrlPoint is not None: # first
- controlList.append([BezierCurveEditor.QPoint2Tuple(point.rCtrlPoint)])
- if point.lCtrlPoint is not None: # last
- controlList[-1].append(BezierCurveEditor.QPoint2Tuple(point.lCtrlPoint))
- newPath = asyPath(asyengine=engine)
- newPath.initFromControls(nodeList, controlList)
- return newPath
-
def setInfo(self, path):
self.nodeSet = copy.copy(path.nodeSet)
self.linkSet = copy.copy(path.linkSet)
@@ -1536,8 +1535,8 @@ class xasyScript(xasyItem):
def getObjectCode(self, asy2psmap=identity()):
numeric=r'([-+]?(?:(?:\d*\.\d+)|(?:\d+\.?)))'
- rSize=re.compile("size\(\("+numeric+","+numeric+","+numeric+","
- +numeric+","+numeric+","+numeric+"\)\); "+
+ rSize=re.compile(r"size\(\("+numeric+","+numeric+","+numeric+","
+ +numeric+","+numeric+","+numeric+r"\)\); "+
self.resizeComment)
newScript = self.getReplacedKeysCode(self.findNonIdKeys())
diff --git a/graphics/asymptote/GUI/xasyArgs.py b/graphics/asymptote/GUI/xasyArgs.py
index b9e1518f1e..30c8c17755 100644
--- a/graphics/asymptote/GUI/xasyArgs.py
+++ b/graphics/asymptote/GUI/xasyArgs.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
import argparse
-import xasyVersion
+from xasyversion.version import VERSION as xasyVersion
import PyQt5.QtCore as QtCore
# Add arguments here.
@@ -11,7 +11,7 @@ def parseArgs(args):
help='Custom path to asy executable')
parser.add_argument('-v', '-version', '--version',
help='Version number', action='version',
- version='xasy v{0}'.format(xasyVersion.xasyVersion))
+ version='xasy v{0}'.format(xasyVersion))
parser.add_argument('-l', '-language', '--language',
help='language')
parser.add_argument('-x', '-mag', '--mag',
@@ -20,6 +20,11 @@ def parseArgs(args):
parser.add_argument('-render', '--render',
help='Number of pixels per bp in 3D rendered bitmaps',
default=None, type=float)
+ parser.add_argument('-additional-asy-args', '--additional-asy-args',
+ help='Comma-separated values of additional arguments to pass'
+ 'to Asymptote',
+ dest='additionalAsyArgs',
+ type=str, default=None)
parser.add_argument(
'filename',
help='Filename to load (if omitted, initialize blank canvas)',
diff --git a/graphics/asymptote/GUI/xasyFile.py b/graphics/asymptote/GUI/xasyFile.py
index e980a3c183..6cf8be2c74 100644
--- a/graphics/asymptote/GUI/xasyFile.py
+++ b/graphics/asymptote/GUI/xasyFile.py
@@ -32,7 +32,7 @@ def extractTransform(line):
testMatch = re.match(
r'^{0:s}\s*\(\s*\"([^\"]+)\"\s*,\s*\(([-\d, .]+)\)\s*\)'.format(mapString), line.strip())
if testMatch is None:
- mapOnlyMatch = re.match(r'^{0:s}\s*\(\s *\"([^\"]+)\"\s*\)'.format(mapString), line.strip())
+ mapOnlyMatch = re.match(r'^{0:s}\s*\(\s*\"([^\"]+)\"\s*\)'.format(mapString), line.strip())
if mapOnlyMatch is None:
return None
else:
@@ -66,14 +66,18 @@ def extractTransformsFromFile(fileStr):
return final_str, transfDict
def xasy2asyCode(xasyItems, asy2psmap):
- asyCode = ''
- for item in xasyItems:
- asyCode += item.getTransformCode(asy2psmap)
- for item in xasyItems:
- asyCode += item.getObjectCode(asy2psmap)
-
- asyCode += 'size('+str(asy2psmap*xasy2asy.yflip())+'); '+ xasy2asy.xasyItem.resizeComment+'\n'
- return asyCode
+ with io.StringIO() as asyCode:
+ for item in xasyItems:
+ asyCode.write(item.getTransformCode(asy2psmap))
+ for item in xasyItems:
+ asyCode.write(item.getObjectCode(asy2psmap))
+
+ asyCode.write(
+ 'size('+str(asy2psmap*xasy2asy.yflip())+'); ' +
+ xasy2asy.xasyItem.resizeComment +
+ '\n'
+ )
+ return asyCode.getvalue()
def saveFile(file, xasyItems, asy2psmap):
"""Write a list of xasyItems to a file"""
diff --git a/graphics/asymptote/GUI/xasyOptions.py b/graphics/asymptote/GUI/xasyOptions.py
index 458dd9cb3c..c8ecc8581c 100644
--- a/graphics/asymptote/GUI/xasyOptions.py
+++ b/graphics/asymptote/GUI/xasyOptions.py
@@ -68,8 +68,16 @@ class xasyOptions:
self.options = self.defaultOptions()
self.load()
- def __getitem__(self, item):
- return self.options[item]
+ def __getitem__(self, key):
+ return self.options[key]
+
+ def __contains__(self, key):
+ return key in self.options
+
+ def get(self, key, default=None):
+ if key not in self.options:
+ return default
+ return self.options[key]
def __setitem__(self, key, value):
self.options[key] = value
@@ -91,9 +99,10 @@ class xasyOptions:
except (IOError, ModuleNotFoundError):
self.setDefaults()
else:
- for key in self.options.keys():
+ for key, val in self.options.items():
if key in newOptions:
- assert isinstance(newOptions[key], type(self.options[key]))
+ if val is not None:
+ assert isinstance(newOptions[key], type(val))
else:
newOptions[key] = self.options[key]
self.options = newOptions
diff --git a/graphics/asymptote/GUI/xasySvg.py b/graphics/asymptote/GUI/xasySvg.py
index 7261dc5b69..5abb642144 100644
--- a/graphics/asymptote/GUI/xasySvg.py
+++ b/graphics/asymptote/GUI/xasySvg.py
@@ -1,22 +1,38 @@
#!/usr/bin/env python3
-
import PyQt5.QtGui as QtGui
import PyQt5.QtWidgets as QtWidgets
-import io
import subprocess
import sys
+import xasyOptions as xo
+
-class SvgObject():
+class SvgObject:
def __init__(self, file: str):
- self.file=file
+ self.file = file
+
+ def _create_call_arguments(self, dpi: int):
+ settings = xo.BasicConfigs.defaultOpt
+ return [
+ settings.get("rsvgConverterPath") or "rsvg-convert",
+ f"--dpi-x={dpi}",
+ f"--dpi-y={dpi}",
+ "--format=png",
+ self.file,
+ ]
- def render(self, dpi:int) -> QtGui.QImage:
+ def render(self, dpi: int) -> QtGui.QImage:
+ callArgs = self._create_call_arguments(dpi)
try:
- rawDataProc = subprocess.Popen(['rsvg-convert', '--dpi-x', str(dpi),
- '--dpi-y', str(dpi), self.file],
- stdout=subprocess.PIPE)
- except:
- QtWidgets.QMessageBox.about(None,'rsvg-convert missing','Please install rsvg-convert version >= 2.40 in your path.')
+ rawDataProc = subprocess.run(
+ callArgs,
+ stdout=subprocess.PIPE,
+ )
+ except OSError:
+ QtWidgets.QMessageBox.about(
+ None,
+ "rsvg-convert missing",
+ "Please install rsvg-convert version >= 2.40.",
+ )
sys.exit(-1)
- return QtGui.QImage.fromData(rawDataProc.stdout.read(), 'PNG')
+ return QtGui.QImage.fromData(rawDataProc.stdout, "PNG")
diff --git a/graphics/asymptote/GUI/icons_rc.py b/graphics/asymptote/GUI/xasyicons/icons_rc.py
index 8fca5b33ee..02ea466dec 100644
--- a/graphics/asymptote/GUI/icons_rc.py
+++ b/graphics/asymptote/GUI/xasyicons/icons_rc.py
@@ -2,7 +2,7 @@
# Resource object code
#
-# Created by: The Resource Compiler for PyQt5 (Qt v5.15.14)
+# Created by: The Resource Compiler for PyQt5 (Qt v5.15.15)
#
# WARNING! All changes made in this file will be lost!
@@ -2797,93 +2797,93 @@ qt_resource_struct_v2 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x2c\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x2a\
\x00\x00\x00\x38\x00\x00\x00\x00\x00\x01\x00\x00\x07\x6f\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x00\x52\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x0f\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6d\
+\x00\x00\x01\x95\x12\xd0\x5e\x27\
\x00\x00\x00\x84\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x85\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x12\xa4\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x00\xee\x00\x01\x00\x00\x00\x01\x00\x00\x16\x90\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x01\x14\x00\x00\x00\x00\x00\x01\x00\x00\x18\xb3\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x01\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x1b\xe1\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x2a\
\x00\x00\x01\x54\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xfc\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x00\x24\xa3\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x01\x98\x00\x00\x00\x00\x00\x01\x00\x00\x29\x1a\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x01\xae\x00\x00\x00\x00\x00\x01\x00\x00\x2d\xba\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x01\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x30\x7f\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x2a\
\x00\x00\x02\x04\x00\x00\x00\x00\x00\x01\x00\x00\x35\x4d\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x02\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x3b\x0c\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x02\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x3e\xe9\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x02\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x43\x00\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x02\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x46\x4c\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x27\
\x00\x00\x02\xec\x00\x00\x00\x00\x00\x01\x00\x00\x48\xe8\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6d\
+\x00\x00\x01\x95\x12\xd0\x5e\x27\
\x00\x00\x03\x16\x00\x00\x00\x00\x00\x01\x00\x00\x4c\x02\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x03\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x50\x04\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x03\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x52\xf8\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x2a\
\x00\x00\x03\x90\x00\x00\x00\x00\x00\x01\x00\x00\x55\x93\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x27\
\x00\x00\x03\xb6\x00\x01\x00\x00\x00\x01\x00\x00\x58\x03\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x03\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x59\xe4\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x03\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x25\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x04\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x60\x10\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6d\
+\x00\x00\x01\x95\x12\xd0\x5e\x27\
\x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x00\x62\x86\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x04\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x65\xe4\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x04\x72\x00\x00\x00\x00\x00\x01\x00\x00\x69\x47\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x04\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x6c\x4e\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x2a\
\x00\x00\x04\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x70\x94\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x04\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x73\x0f\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x04\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x77\x67\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x05\x08\x00\x00\x00\x00\x00\x01\x00\x00\x7b\x45\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x05\x30\x00\x00\x00\x00\x00\x01\x00\x00\x7f\x6b\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6d\
+\x00\x00\x01\x95\x12\xd0\x5e\x27\
\x00\x00\x05\x58\x00\x00\x00\x00\x00\x01\x00\x00\x82\x1a\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x2a\
\x00\x00\x05\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x83\x3a\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x05\x82\x00\x00\x00\x00\x00\x01\x00\x00\x87\x1a\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x28\
\x00\x00\x05\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x8a\x5d\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6d\
+\x00\x00\x01\x95\x12\xd0\x5e\x27\
\x00\x00\x05\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x8b\xca\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x06\x06\x00\x00\x00\x00\x00\x01\x00\x00\x8f\x85\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x2a\
\x00\x00\x06\x36\x00\x00\x00\x00\x00\x01\x00\x00\x8f\xf5\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6f\
+\x00\x00\x01\x95\x12\xd0\x5e\x29\
\x00\x00\x06\x58\x00\x00\x00\x00\x00\x01\x00\x00\x92\xe7\
-\x00\x00\x01\x90\x3b\xe6\x5e\x6e\
+\x00\x00\x01\x95\x12\xd0\x5e\x27\
"
qt_version = [int(v) for v in QtCore.qVersion().split('.')]
diff --git a/graphics/asymptote/GUI/pyUIClass/custMatTransform.py b/graphics/asymptote/GUI/xasyqtui/custMatTransform.py
index 66b64ac9f3..077385434e 100644
--- a/graphics/asymptote/GUI/pyUIClass/custMatTransform.py
+++ b/graphics/asymptote/GUI/xasyqtui/custMatTransform.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file 'GUI/windows/custMatTransform.ui'
+# Form implementation generated from reading ui file 'windows/custMatTransform.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
@@ -172,4 +172,4 @@ class Ui_Dialog(object):
self.btnReset.setText(_translate("Dialog", "Reset"))
self.btnCancel.setText(_translate("Dialog", "Cancel"))
self.btnAccept.setText(_translate("Dialog", "Accept"))
-import icons_rc
+from xasyicons import icons_rc
diff --git a/graphics/asymptote/GUI/pyUIClass/labelTextEditor.py b/graphics/asymptote/GUI/xasyqtui/labelTextEditor.py
index 4ae0707ab3..f4cb3eccbb 100644
--- a/graphics/asymptote/GUI/pyUIClass/labelTextEditor.py
+++ b/graphics/asymptote/GUI/xasyqtui/labelTextEditor.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file 'GUI/windows/labelTextEditor.ui'
+# Form implementation generated from reading ui file 'windows/labelTextEditor.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
@@ -118,4 +118,4 @@ class Ui_Dialog(object):
self.cmbMathStyle.setItemText(1, _translate("Dialog", "Display Style"))
self.cmbMathStyle.setItemText(2, _translate("Dialog", "Script Style"))
self.label.setText(_translate("Dialog", "Preview"))
-import icons_rc
+from xasyicons import icons_rc
diff --git a/graphics/asymptote/GUI/pyUIClass/setCustomAnchor.py b/graphics/asymptote/GUI/xasyqtui/setCustomAnchor.py
index 9e6e4dfdf1..469683446e 100644
--- a/graphics/asymptote/GUI/pyUIClass/setCustomAnchor.py
+++ b/graphics/asymptote/GUI/xasyqtui/setCustomAnchor.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file 'GUI/windows/setCustomAnchor.ui'
+# Form implementation generated from reading ui file 'windows/setCustomAnchor.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
diff --git a/graphics/asymptote/GUI/pyUIClass/widg_addLabel.py b/graphics/asymptote/GUI/xasyqtui/widg_addLabel.py
index 560435b1b5..7af4011bb1 100644
--- a/graphics/asymptote/GUI/pyUIClass/widg_addLabel.py
+++ b/graphics/asymptote/GUI/xasyqtui/widg_addLabel.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file 'GUI/windows/widg_addLabel.ui'
+# Form implementation generated from reading ui file 'windows/widg_addLabel.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
@@ -139,4 +139,4 @@ class Ui_Form(object):
self.label_2.setText(_translate("Form", "Custom Align"))
self.txtShiftX.setPlaceholderText(_translate("Form", "Shift X"))
self.txtShiftY.setPlaceholderText(_translate("Form", "Shift Y"))
-import icons_rc
+from xasyicons import icons_rc
diff --git a/graphics/asymptote/GUI/pyUIClass/widg_addPolyOpt.py b/graphics/asymptote/GUI/xasyqtui/widg_addPolyOpt.py
index 4fa2072e85..d712802321 100644
--- a/graphics/asymptote/GUI/pyUIClass/widg_addPolyOpt.py
+++ b/graphics/asymptote/GUI/xasyqtui/widg_addPolyOpt.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file 'GUI/windows/widg_addPolyOpt.ui'
+# Form implementation generated from reading ui file 'windows/widg_addPolyOpt.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
diff --git a/graphics/asymptote/GUI/pyUIClass/widg_editBezier.py b/graphics/asymptote/GUI/xasyqtui/widg_editBezier.py
index c44962d300..bfd0b222ab 100644
--- a/graphics/asymptote/GUI/pyUIClass/widg_editBezier.py
+++ b/graphics/asymptote/GUI/xasyqtui/widg_editBezier.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file 'GUI/windows/widg_editBezier.ui'
+# Form implementation generated from reading ui file 'windows/widg_editBezier.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
@@ -93,4 +93,4 @@ class Ui_Form(object):
self.cmbLockMode.setItemText(2, _translate("Form", "Lock Angle & Scale"))
self.chkRecompute.setText(_translate("Form", "Recompute Path"))
self.btnForceRecompute.setText(_translate("Form", "Recompute Once"))
-import icons_rc
+from xasyicons import icons_rc
diff --git a/graphics/asymptote/GUI/pyUIClass/widgetPointEditor.py b/graphics/asymptote/GUI/xasyqtui/widgetPointEditor.py
index 25fa684aa9..62045ce59e 100644
--- a/graphics/asymptote/GUI/pyUIClass/widgetPointEditor.py
+++ b/graphics/asymptote/GUI/xasyqtui/widgetPointEditor.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file 'GUI/windows/widgetPointEditor.ui'
+# Form implementation generated from reading ui file 'windows/widgetPointEditor.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
@@ -95,4 +95,4 @@ class Ui_Form(object):
self.lineXorA.setPlaceholderText(_translate("Form", "X"))
self.lineYorM.setToolTip(_translate("Form", "X"))
self.lineYorM.setPlaceholderText(_translate("Form", "Y"))
-import icons_rc
+from xasyicons import icons_rc
diff --git a/graphics/asymptote/GUI/pyUIClass/window1.py b/graphics/asymptote/GUI/xasyqtui/window1.py
index 5ca2a134f5..d351732ae2 100644
--- a/graphics/asymptote/GUI/pyUIClass/window1.py
+++ b/graphics/asymptote/GUI/xasyqtui/window1.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file 'GUI/windows/window1.ui'
+# Form implementation generated from reading ui file 'windows/window1.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
@@ -1010,4 +1010,4 @@ class Ui_MainWindow(object):
self.actionNewFile.setText(_translate("MainWindow", "New File"))
self.actionExportToAsy.setText(_translate("MainWindow", "Export as Asy"))
self.actionKeymaps.setText(_translate("MainWindow", "&Keymaps"))
-import icons_rc
+from xasyicons import icons_rc
diff --git a/graphics/asymptote/GUI/xasyversion/version.py b/graphics/asymptote/GUI/xasyversion/version.py
new file mode 100644
index 0000000000..9ddac9a36f
--- /dev/null
+++ b/graphics/asymptote/GUI/xasyversion/version.py
@@ -0,0 +1 @@
+VERSION="3.00"
diff --git a/graphics/asymptote/INSTALL-VCPKG.md b/graphics/asymptote/INSTALL-VCPKG.md
new file mode 100644
index 0000000000..c3489f9edc
--- /dev/null
+++ b/graphics/asymptote/INSTALL-VCPKG.md
@@ -0,0 +1,118 @@
+# Building Asymptote with VCPKG and CMake
+
+## Dependency management
+
+The recommended way is to use [vcpkg](https://vcpkg.io/). Clone vcpkg to your system, run bootstrap script and ensure
+`VCPKG_ROOT` environment is exported as set as path to your vcpkg repository. For example,
+
+```bash
+cd ~/dev/
+git clone https://github.com/microsoft/vcpkg.git
+cd vcpkg && ./bootstrap-vcpkg.sh
+export VCPKG_ROOT=~/dev/vcpkg
+```
+# On Windows
+See INSTALL-WIN.md for windows-specific instructions.
+
+## Linux-specific dependency (Experimental)
+
+Make sure flex and bison is available in path, if not, install them manually first.
+
+```bash
+# This is specific to arch linux, other distributions might use a different name
+sudo pacman -S flex bison
+```
+
+For OpenGL, make sure all relevant dependencies for freeglut is installed. The relevant dependencies
+should be shown during vcpkg install
+
+## Using CMake
+
+### Quick start (Linux)
+
+Make sure `ninja` and `cmake`, `python3` and `perl` are installed, as well as `gcc`.
+Then run
+
+```bash
+mkdir -p cmake-build-linux/release
+cmake --preset linux/release
+cmake --build --preset linux/release --target asy-with-basefiles
+```
+
+The asymptote binary should be available in `cmake-build-linux/release` directory.
+
+### On Debug Builds
+
+One thing you may notice is that we do not provide a debug build preset. This is intentional
+since anyone developing might want to add configurations specific to their system
+(such as a particular clang they want to use for preprocessing), or for vendor-specific configurations
+(e.g. selecting a particular toolchain in CLion).
+
+Our recommendation is to create your own debug presets in `CMakeUserPresets.json` - for example,
+for my (Jamie's) setup:
+
+```json
+{
+ "version": 6,
+ "cmakeMinimumRequired": {
+ "major": 3,
+ "minor": 26,
+ "patch": 0
+ },
+
+ "configurePresets": [
+ {
+ "name": "msvc/debug-clion+vs",
+ "displayName": "[MSVC-x86/64] Debug (With preset environment vars)",
+ "binaryDir": "${sourceDir}/cmake-build-msvc/debug",
+ "inherits": ["base/buildBaseWithVcpkg", "base/debug", "base/gccCompatCacheVar", "base/windows-only"],
+ "environment": {
+ "GCCCOMPAT_CXX_COMPILER_FOR_MSVC": "C:\\msys64\\clang64\\bin\\clang++.exe"
+ },
+ "vendor": {
+ "jetbrains.com/clion": {
+ "toolchain": "MSVC"
+ }
+ }
+ },
+ {
+ "name": "linux/debug-clion+vs",
+ "displayName": "[linux-x86/64] Debug (With preset environment vars)",
+ "binaryDir": "${sourceDir}/cmake-build-linux/debug",
+ "inherits": [ "base/buildBaseWithVcpkg", "base/debug" ],
+ "environment": {
+ "VCPKG_ROOT": "$env{HOME}/dev/vcpkg"
+ },
+ "vendor": {
+ "jetbrains.com/clion": {
+ "toolchain": "WSL"
+ }
+ }
+ }
+ ]
+}
+```
+
+### Additional build information
+
+One can specify additional package string (this is useful for CI for denoting build revision).
+To do this, add a file called `asy-pkg-version-suffix.cmake` with a cmake command
+```cmake
+set(ASY_VERSION_SUFFIX "<custom version suffix>")
+```
+
+This suffix will get embedded into the final asymptote version. If this file is not specified, the default
+suffix is "+debug" for debug builds, or an empty string for all other builds, including release builds
+
+## Testing
+
+Asymptote unit testing is integerated into CMake's `CTest` framework.
+All Asymptote `.asy` based tests are named `asy.<test dirname>.<test file name>`
+excluding `*.asy` extension.
+
+These tests can be run by CTest. For example, after building on linux/release,
+
+```bash
+ctest --test-dir cmake-build-linux/release/ -R "asy.types.*"
+```
+
diff --git a/graphics/asymptote/INSTALL-WIN.md b/graphics/asymptote/INSTALL-WIN.md
new file mode 100644
index 0000000000..28e49980fd
--- /dev/null
+++ b/graphics/asymptote/INSTALL-WIN.md
@@ -0,0 +1,250 @@
+# Building Asymptote with CMake (On Windows)
+
+## Basic Requirements
+
+### Required Dependencies
+Ensure the following is installed:
+- Visual Studio 2022+ or Visual Studio 2022+ build tools.
+ - Both can be found at [here](https://visualstudio.microsoft.com/downloads/).
+- CMake
+ - (Recommended way) Visual Studio/Visual Studio Build Tools provides bundled CMake as a selectable component
+ - Otherwise, CMake can be found [here](https://cmake.org/)
+- Python 3+
+ - Available [here](https://www.python.org/downloads/windows/).
+- Perl on Windows
+ - (Recommended way) Strawberry Perl is available at [Strawberry Perl](https://strawberryperl.com/).
+ - (Not recommended due to license terms) ActiveState Perl is available [here](https://www.activestate.com/products/perl/).
+- Ninja
+ - (Recommended) Visual Studio/Visual Studio Build Tools provides bundled Ninja as part of CMake build tools
+ - Otherwise, Ninja can be installed using winget by running `winget install Ninja-build.Ninja`.
+ - If winget is not available, Ninja can be found [here](https://ninja-build.org/).
+ If installing this way, ensure `ninja` is accessible from `PATH`.
+ - (Untested) `ninja.exe` is bundled within a Strawberry Perl installation.
+
+### Optional, but highly recommended dependencies
+- A GCC-compatible C++ compiler (Optional, but highly recommended. See #installing-gcc-compatible-c++-compiler)
+ - (Recommended way) [here](https://releases.llvm.org/).
+ - (Untested) `g++.exe` is bundled within a Strawberry Perl installation.
+ - (Untested) Visual Studio also provides clang tools as an installable component.
+ If installing this way, ensure that `clang++.exe` is available.
+- Vcpkg (Optional, but highly recommended. See #notes-on-dependency-management)
+ - Can be found [here](https://vcpkg.io/).
+
+### Dependencies for documentation generation (Required only for building a setup file)
+
+Ensure [TeX Live](https://tug.org/texlive/windows.html) is available on the system.
+[MikTeX](https://miktex.org) is a possible substitute but is unsupported.
+
+Building `asymptote.pdf` requires a UNIX system.
+
+### Dependencies for building the setup file
+
+The following is required for building the setup file:
+- NSIS installer.
+ - NSIS installer can be found [here](https://nsis.sourceforge.io/Download).
+
+## For a quick start
+
+If you are getting started and want a quick configuration, run `./quick-start-win32.ps1`.
+This script automatically checks that you have vcpkg, and if not, clones and bootstraps vcpkg on your system.
+
+Additionally, this script automatically locates your Visual Studio installation and
+establishes all required environment variables.
+
+## Notes on Dependency management
+
+The recommended way is to use [vcpkg](https://vcpkg.io/).
+See `INSTALL.md` for more details.
+On windows, one may run
+
+```powershell
+git clone https://github.com/microsoft/vcpkg.git
+./vcpkg/bootstrap-vcpkg.bat
+```
+to initialize vcpkg.
+Make sure the environment `VCPKG_ROOT` points to where your vcpkg repository is at user or machine scope.
+
+### For User scope
+This can be done either by Start -> "Edit environment variables for your account" and then adding
+VCPKG_ROOT entry, or by PowerShell,
+
+```powershell
+[Environment]::SetEnvironmentVariable('VCPKG_ROOT', '<path to vcpkg>', 'User')
+```
+
+### For machine scope
+
+Otherwise, you can also set VCPKG_ROOT for everyone on your machine.
+
+## Using CMake
+
+### Installing GCC-compatible C++ compiler
+
+We (highly) suggest installing a GCC-compatible C++ compiler for preprocessing.
+Our recommendation is to use clang/LLVM tools, available [here](https://releases.llvm.org/).
+Once your compiler is installed, there are a few options.
+
+- (Recommended) Ensure `clang++.exe` is available in `PATH` and leave `GCCCOMPAT_CXX_COMPILER_FOR_MSVC` unset.
+ The build script will automatically try to locate `clang++.exe` or `g++.exe` in places
+ within `PATH`.
+ Be warned that the build script may select a different compiler depending
+ on if there are other compilers available in `PATH`.
+- (Only if you require a specific clang++ compiler) Set `GCCCOMPAT_CXX_COMPILER_FOR_MSVC` environment variable to
+ your GCC-compatible C++ compiler. For example
+ ```powershell
+ $env:GCCCOMPAT_CXX_COMPILER_FOR_MSVC="<LLVM install location>/bin/clang++.exe
+ ```
+ - If you want to make the environment variable permanent, run
+ ```powershell
+ [Environment]::SetEnvironmentVariable('GCCCOMPAT_CXX_COMPILER_FOR_MSVC', '<LLVM install location>/bin/clang++.exe', 'User
+ ```
+
+### Building steps
+
+#### Environment set up
+
+Ensure you have `cl.exe` in your path.
+The easiest way is to use Visual Studio Developer PowerShell, though be careful that by default
+VS Developer PowerShell selects 32-bit cl.exe.
+
+To explicitly select 64-bit Visual Studio Developer PowerShell, one can use Visual Studio locator
+alongside its developer shell script as
+
+```powershell
+$vsInfo = Get-CimInstance MSFT_VSInstance -Namespace root/cimv2/vs
+& "$($vsInfo.InstallLocation)\Common7\Tools\Launch-VsDevShell.ps1" -Arch amd64 -HostArch amd64 -SkipAutomaticLocation
+```
+
+This prompt should put you in to 64-bit Visual Studio Developer PowerShell.
+
+#### Configuring build files
+
+There are multiple CMake presets available for building, depending on what you intend to build
+- If you are building Asymptote for release with setup files, depending on how you would build `asymptote.pdf`,
+ use either (see #documentation-generation section)
+ - The `msvc/release` preset
+ - The `msvc/msvc/release/with-existing-asymptote-pdf`
+- If you are building only asymptote executable for release, or do not care about `asymptote.pdf`, use `msvc/release` preset
+- If you are building Asymptote for development or debug mode,
+ you are required to either create your own debug preset or configure cache variables manually.
+
+Ensure that you are in the Visual Studio 64-bit PowerShell (or have every tool available in `PATH`), and run
+```powershell
+cmake --preset <your selected preset>
+```
+
+#### Building Asymptote
+
+There are multiple key targets for building Asymptote.
+
+- For the `asy.exe` executable and `base/` files, the target to run is `asy-with-basefiles`
+- For documentation (depending on your configuration, including or excluding `asymptote.pdf`) - `docgen`
+- If you are generating an installer file, the target `asy-pre-nsis-targets` builds all required components,
+ excluding the GUI.
+ See #building-gui-files for instructions on how to build GUI files.
+
+The Asymptote binary is available
+at `cmake-build-msvc/release/asy.exe` if using `msvc/release` or `msvc/msvc/release/ci/with-external-asymptote-pdf`
+targets.
+Instructions for generating a setup file are in the next section
+
+##### Extra considerations for `asymptote.pdf`
+
+On Windows, `asymptote.pdf` is built using MikTeX's `texify` program, hence why TeX Live cannot be used here.
+Additionally, ensure that a replacement for `texindex` is available in the system.
+As of the moment, I have only tested using WSL's `texindex`.
+
+- If you have a WSL distribution with `texindex` installed,
+that may be used as a substitute for `texindex` on windows. In this case, ensure the cache variable
+`WIN32_TEXINDEX` is set to `WSL`. This is the default option.
+- If you have a replacement `texindex` program, ensure `WIN32_TEXINDEX` points to that file.
+
+## Building GUI files
+
+### Dependencies for GUI files
+
+All required dependencies for building GUI are present in `GUI/requirements.txt` and `GUI/requirements.dev.txt`.
+We recommend using a virtual environment, for example
+
+```powershell
+python.exe -m virtualenv asyguibuild
+./asyguibuild/Scripts/activate.ps1
+
+cd <asymptote-repo>/GUI
+pip install -r requirements.txt
+pip install -r requirements.dev.txt
+```
+
+However, against our recommendations, the dependencies can be also installed into the system interpreter.
+
+### Building the GUI files
+
+The python script `GUI/buildtool.py` is used for building required files. To do this, run
+
+```powershell
+cd <asymptote-repo>/GUI
+python.exe buildtool.py build
+```
+
+This should build all required GUI files.
+
+## Installation file generation
+
+#### Prerequisites for installation file generation
+
+Ensure that
+- Requirements for building asymptote executable
+- Requirements for building documentation (excluding `asymptote.pdf`)
+- At least one of the following:
+ - A pre-built `asymptote.pdf` file
+ - Requirements for building `asymptote.pdf` file
+- PowerShell. This should come pre-installed on windows.
+ - Ensure that the ability to execute unsigned scripts is enabled
+- Python 3 with relevant dependencies for building GUI files (This will be discussed in a separate section)
+
+are present in the system.
+
+#### If using a pre-built `asymptote.pdf`
+
+Place `asymptote.pdf` in the directory `<asymptote-repo>/asydoc/`.
+That is, the file `<asymptote-repo>/asydoc/asymptote.pdf` is present.
+After that, configure cmake with the preset `msvc/release/ci/with-external-asymptote-pdf` - that is,
+
+```powershell
+cmake --preset msvc/release/ci/with-external-asymptote-pdf
+```
+
+#### If generating `asymptote.pdf` as part of build process
+
+Use the `msvc/release` build preset for cmake.
+
+### Building Asymptote install files
+
+The cmake target `asy-pre-nsis-targets` should build everything on the `C++` side needed
+for asymptote installation.
+
+#### Generating the installer file
+
+After building `asy-pre-nsis-targets`, install using CMake.
+Note that this does not install into
+the program files directory, but rather, to a "local install root"
+at `<asymptote-repo>/cmake-install-w32-nsis-release/`.
+
+Due to how google test build files are written (as of currently), installing
+every component may result in an error (in particular, with `gmock.lib`).
+This can be remedied by installing only the component needed for installer generation: `asy-pre-nsis`
+To do this, run
+
+```powershell
+cmake --install cmake-build-msvc/release --component asy-pre-nsis
+```
+
+After building all the required dependencies,
+navigate to the directory `<asymptote-repo>/cmake-install-w32-nsis-release/`.
+There, a script called `build-asy-installer.ps1` script is present.
+Run that script.
+It will prompt for the location of `makensis.exe` from the NSIS.
+Specify the path to `makensis.exe`.
+
+After this, the script should generate the installer file with the name `asymptote-<version>-setup.exe`.
+This is the setup file ready for distribution.
diff --git a/graphics/asymptote/LspCpp/CMakeDoxyfile.in b/graphics/asymptote/LspCpp/CMakeDoxyfile.in
new file mode 100644
index 0000000000..93dab09a70
--- /dev/null
+++ b/graphics/asymptote/LspCpp/CMakeDoxyfile.in
@@ -0,0 +1,297 @@
+#
+# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE!
+#
+
+DOXYFILE_ENCODING = @DOXYGEN_DOXYFILE_ENCODING@
+PROJECT_NAME = @DOXYGEN_PROJECT_NAME@
+PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@
+PROJECT_BRIEF = @DOXYGEN_PROJECT_BRIEF@
+PROJECT_LOGO = @DOXYGEN_PROJECT_LOGO@
+PROJECT_ICON = @DOXYGEN_PROJECT_ICON@
+OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIRECTORY@
+CREATE_SUBDIRS = @DOXYGEN_CREATE_SUBDIRS@
+CREATE_SUBDIRS_LEVEL = @DOXYGEN_CREATE_SUBDIRS_LEVEL@
+ALLOW_UNICODE_NAMES = @DOXYGEN_ALLOW_UNICODE_NAMES@
+OUTPUT_LANGUAGE = @DOXYGEN_OUTPUT_LANGUAGE@
+BRIEF_MEMBER_DESC = @DOXYGEN_BRIEF_MEMBER_DESC@
+REPEAT_BRIEF = @DOXYGEN_REPEAT_BRIEF@
+ABBREVIATE_BRIEF = @DOXYGEN_ABBREVIATE_BRIEF@
+ALWAYS_DETAILED_SEC = @DOXYGEN_ALWAYS_DETAILED_SEC@
+INLINE_INHERITED_MEMB = @DOXYGEN_INLINE_INHERITED_MEMB@
+FULL_PATH_NAMES = @DOXYGEN_FULL_PATH_NAMES@
+STRIP_FROM_PATH = @DOXYGEN_STRIP_FROM_PATH@
+STRIP_FROM_INC_PATH = @DOXYGEN_STRIP_FROM_INC_PATH@
+SHORT_NAMES = @DOXYGEN_SHORT_NAMES@
+JAVADOC_AUTOBRIEF = @DOXYGEN_JAVADOC_AUTOBRIEF@
+JAVADOC_BANNER = @DOXYGEN_JAVADOC_BANNER@
+QT_AUTOBRIEF = @DOXYGEN_QT_AUTOBRIEF@
+MULTILINE_CPP_IS_BRIEF = @DOXYGEN_MULTILINE_CPP_IS_BRIEF@
+PYTHON_DOCSTRING = @DOXYGEN_PYTHON_DOCSTRING@
+INHERIT_DOCS = @DOXYGEN_INHERIT_DOCS@
+SEPARATE_MEMBER_PAGES = @DOXYGEN_SEPARATE_MEMBER_PAGES@
+TAB_SIZE = @DOXYGEN_TAB_SIZE@
+ALIASES = @DOXYGEN_ALIASES@
+OPTIMIZE_OUTPUT_FOR_C = @DOXYGEN_OPTIMIZE_OUTPUT_FOR_C@
+OPTIMIZE_OUTPUT_JAVA = @DOXYGEN_OPTIMIZE_OUTPUT_JAVA@
+OPTIMIZE_FOR_FORTRAN = @DOXYGEN_OPTIMIZE_FOR_FORTRAN@
+OPTIMIZE_OUTPUT_VHDL = @DOXYGEN_OPTIMIZE_OUTPUT_VHDL@
+OPTIMIZE_OUTPUT_SLICE = @DOXYGEN_OPTIMIZE_OUTPUT_SLICE@
+EXTENSION_MAPPING = @DOXYGEN_EXTENSION_MAPPING@
+MARKDOWN_SUPPORT = @DOXYGEN_MARKDOWN_SUPPORT@
+TOC_INCLUDE_HEADINGS = @DOXYGEN_TOC_INCLUDE_HEADINGS@
+MARKDOWN_ID_STYLE = @DOXYGEN_MARKDOWN_ID_STYLE@
+AUTOLINK_SUPPORT = @DOXYGEN_AUTOLINK_SUPPORT@
+BUILTIN_STL_SUPPORT = @DOXYGEN_BUILTIN_STL_SUPPORT@
+CPP_CLI_SUPPORT = @DOXYGEN_CPP_CLI_SUPPORT@
+SIP_SUPPORT = @DOXYGEN_SIP_SUPPORT@
+IDL_PROPERTY_SUPPORT = @DOXYGEN_IDL_PROPERTY_SUPPORT@
+DISTRIBUTE_GROUP_DOC = @DOXYGEN_DISTRIBUTE_GROUP_DOC@
+GROUP_NESTED_COMPOUNDS = @DOXYGEN_GROUP_NESTED_COMPOUNDS@
+SUBGROUPING = @DOXYGEN_SUBGROUPING@
+INLINE_GROUPED_CLASSES = @DOXYGEN_INLINE_GROUPED_CLASSES@
+INLINE_SIMPLE_STRUCTS = @DOXYGEN_INLINE_SIMPLE_STRUCTS@
+TYPEDEF_HIDES_STRUCT = @DOXYGEN_TYPEDEF_HIDES_STRUCT@
+LOOKUP_CACHE_SIZE = @DOXYGEN_LOOKUP_CACHE_SIZE@
+NUM_PROC_THREADS = @DOXYGEN_NUM_PROC_THREADS@
+TIMESTAMP = @DOXYGEN_TIMESTAMP@
+EXTRACT_ALL = @DOXYGEN_EXTRACT_ALL@
+EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@
+EXTRACT_PRIV_VIRTUAL = @DOXYGEN_EXTRACT_PRIV_VIRTUAL@
+EXTRACT_PACKAGE = @DOXYGEN_EXTRACT_PACKAGE@
+EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@
+EXTRACT_LOCAL_CLASSES = @DOXYGEN_EXTRACT_LOCAL_CLASSES@
+EXTRACT_LOCAL_METHODS = @DOXYGEN_EXTRACT_LOCAL_METHODS@
+EXTRACT_ANON_NSPACES = @DOXYGEN_EXTRACT_ANON_NSPACES@
+RESOLVE_UNNAMED_PARAMS = @DOXYGEN_RESOLVE_UNNAMED_PARAMS@
+HIDE_UNDOC_MEMBERS = @DOXYGEN_HIDE_UNDOC_MEMBERS@
+HIDE_UNDOC_CLASSES = @DOXYGEN_HIDE_UNDOC_CLASSES@
+HIDE_FRIEND_COMPOUNDS = @DOXYGEN_HIDE_FRIEND_COMPOUNDS@
+HIDE_IN_BODY_DOCS = @DOXYGEN_HIDE_IN_BODY_DOCS@
+INTERNAL_DOCS = @DOXYGEN_INTERNAL_DOCS@
+CASE_SENSE_NAMES = @DOXYGEN_CASE_SENSE_NAMES@
+HIDE_SCOPE_NAMES = @DOXYGEN_HIDE_SCOPE_NAMES@
+HIDE_COMPOUND_REFERENCE= @DOXYGEN_HIDE_COMPOUND_REFERENCE@
+SHOW_HEADERFILE = @DOXYGEN_SHOW_HEADERFILE@
+SHOW_INCLUDE_FILES = @DOXYGEN_SHOW_INCLUDE_FILES@
+SHOW_GROUPED_MEMB_INC = @DOXYGEN_SHOW_GROUPED_MEMB_INC@
+FORCE_LOCAL_INCLUDES = @DOXYGEN_FORCE_LOCAL_INCLUDES@
+INLINE_INFO = @DOXYGEN_INLINE_INFO@
+SORT_MEMBER_DOCS = @DOXYGEN_SORT_MEMBER_DOCS@
+SORT_BRIEF_DOCS = @DOXYGEN_SORT_BRIEF_DOCS@
+SORT_MEMBERS_CTORS_1ST = @DOXYGEN_SORT_MEMBERS_CTORS_1ST@
+SORT_GROUP_NAMES = @DOXYGEN_SORT_GROUP_NAMES@
+SORT_BY_SCOPE_NAME = @DOXYGEN_SORT_BY_SCOPE_NAME@
+STRICT_PROTO_MATCHING = @DOXYGEN_STRICT_PROTO_MATCHING@
+GENERATE_TODOLIST = @DOXYGEN_GENERATE_TODOLIST@
+GENERATE_TESTLIST = @DOXYGEN_GENERATE_TESTLIST@
+GENERATE_BUGLIST = @DOXYGEN_GENERATE_BUGLIST@
+GENERATE_DEPRECATEDLIST= @DOXYGEN_GENERATE_DEPRECATEDLIST@
+ENABLED_SECTIONS = @DOXYGEN_ENABLED_SECTIONS@
+MAX_INITIALIZER_LINES = @DOXYGEN_MAX_INITIALIZER_LINES@
+SHOW_USED_FILES = @DOXYGEN_SHOW_USED_FILES@
+SHOW_FILES = @DOXYGEN_SHOW_FILES@
+SHOW_NAMESPACES = @DOXYGEN_SHOW_NAMESPACES@
+FILE_VERSION_FILTER = @DOXYGEN_FILE_VERSION_FILTER@
+LAYOUT_FILE = @DOXYGEN_LAYOUT_FILE@
+CITE_BIB_FILES = @DOXYGEN_CITE_BIB_FILES@
+QUIET = @DOXYGEN_QUIET@
+WARNINGS = @DOXYGEN_WARNINGS@
+WARN_IF_UNDOCUMENTED = @DOXYGEN_WARN_IF_UNDOCUMENTED@
+WARN_IF_DOC_ERROR = @DOXYGEN_WARN_IF_DOC_ERROR@
+WARN_IF_INCOMPLETE_DOC = @DOXYGEN_WARN_IF_INCOMPLETE_DOC@
+WARN_NO_PARAMDOC = @DOXYGEN_WARN_NO_PARAMDOC@
+WARN_IF_UNDOC_ENUM_VAL = @DOXYGEN_WARN_IF_UNDOC_ENUM_VAL@
+WARN_AS_ERROR = @DOXYGEN_WARN_AS_ERROR@
+WARN_FORMAT = @DOXYGEN_WARN_FORMAT@
+WARN_LINE_FORMAT = @DOXYGEN_WARN_LINE_FORMAT@
+WARN_LOGFILE = @DOXYGEN_WARN_LOGFILE@
+INPUT = @DOXYGEN_INPUT@
+INPUT_ENCODING = @DOXYGEN_INPUT_ENCODING@
+INPUT_FILE_ENCODING = @DOXYGEN_INPUT_FILE_ENCODING@
+FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@
+RECURSIVE = @DOXYGEN_RECURSIVE@
+EXCLUDE = @DOXYGEN_EXCLUDE@
+EXCLUDE_SYMLINKS = @DOXYGEN_EXCLUDE_SYMLINKS@
+EXCLUDE_PATTERNS = @DOXYGEN_EXCLUDE_PATTERNS@
+EXCLUDE_SYMBOLS = @DOXYGEN_EXCLUDE_SYMBOLS@
+EXAMPLE_PATH = @DOXYGEN_EXAMPLE_PATH@
+EXAMPLE_PATTERNS = @DOXYGEN_EXAMPLE_PATTERNS@
+EXAMPLE_RECURSIVE = @DOXYGEN_EXAMPLE_RECURSIVE@
+IMAGE_PATH = @DOXYGEN_IMAGE_PATH@
+INPUT_FILTER = @DOXYGEN_INPUT_FILTER@
+FILTER_PATTERNS = @DOXYGEN_FILTER_PATTERNS@
+FILTER_SOURCE_FILES = @DOXYGEN_FILTER_SOURCE_FILES@
+FILTER_SOURCE_PATTERNS = @DOXYGEN_FILTER_SOURCE_PATTERNS@
+USE_MDFILE_AS_MAINPAGE = @DOXYGEN_USE_MDFILE_AS_MAINPAGE@
+FORTRAN_COMMENT_AFTER = @DOXYGEN_FORTRAN_COMMENT_AFTER@
+SOURCE_BROWSER = @DOXYGEN_SOURCE_BROWSER@
+INLINE_SOURCES = @DOXYGEN_INLINE_SOURCES@
+STRIP_CODE_COMMENTS = @DOXYGEN_STRIP_CODE_COMMENTS@
+REFERENCED_BY_RELATION = @DOXYGEN_REFERENCED_BY_RELATION@
+REFERENCES_RELATION = @DOXYGEN_REFERENCES_RELATION@
+REFERENCES_LINK_SOURCE = @DOXYGEN_REFERENCES_LINK_SOURCE@
+SOURCE_TOOLTIPS = @DOXYGEN_SOURCE_TOOLTIPS@
+USE_HTAGS = @DOXYGEN_USE_HTAGS@
+VERBATIM_HEADERS = @DOXYGEN_VERBATIM_HEADERS@
+ALPHABETICAL_INDEX = @DOXYGEN_ALPHABETICAL_INDEX@
+IGNORE_PREFIX = @DOXYGEN_IGNORE_PREFIX@
+GENERATE_HTML = @DOXYGEN_GENERATE_HTML@
+HTML_OUTPUT = @DOXYGEN_HTML_OUTPUT@
+HTML_FILE_EXTENSION = @DOXYGEN_HTML_FILE_EXTENSION@
+HTML_HEADER = @DOXYGEN_HTML_HEADER@
+HTML_FOOTER = @DOXYGEN_HTML_FOOTER@
+HTML_STYLESHEET = @DOXYGEN_HTML_STYLESHEET@
+HTML_EXTRA_STYLESHEET = @DOXYGEN_HTML_EXTRA_STYLESHEET@
+HTML_EXTRA_FILES = @DOXYGEN_HTML_EXTRA_FILES@
+HTML_COLORSTYLE = @DOXYGEN_HTML_COLORSTYLE@
+HTML_COLORSTYLE_HUE = @DOXYGEN_HTML_COLORSTYLE_HUE@
+HTML_COLORSTYLE_SAT = @DOXYGEN_HTML_COLORSTYLE_SAT@
+HTML_COLORSTYLE_GAMMA = @DOXYGEN_HTML_COLORSTYLE_GAMMA@
+HTML_DYNAMIC_MENUS = @DOXYGEN_HTML_DYNAMIC_MENUS@
+HTML_DYNAMIC_SECTIONS = @DOXYGEN_HTML_DYNAMIC_SECTIONS@
+HTML_CODE_FOLDING = @DOXYGEN_HTML_CODE_FOLDING@
+HTML_COPY_CLIPBOARD = @DOXYGEN_HTML_COPY_CLIPBOARD@
+HTML_PROJECT_COOKIE = @DOXYGEN_HTML_PROJECT_COOKIE@
+HTML_INDEX_NUM_ENTRIES = @DOXYGEN_HTML_INDEX_NUM_ENTRIES@
+GENERATE_DOCSET = @DOXYGEN_GENERATE_DOCSET@
+DOCSET_FEEDNAME = @DOXYGEN_DOCSET_FEEDNAME@
+DOCSET_FEEDURL = @DOXYGEN_DOCSET_FEEDURL@
+DOCSET_BUNDLE_ID = @DOXYGEN_DOCSET_BUNDLE_ID@
+DOCSET_PUBLISHER_ID = @DOXYGEN_DOCSET_PUBLISHER_ID@
+DOCSET_PUBLISHER_NAME = @DOXYGEN_DOCSET_PUBLISHER_NAME@
+GENERATE_HTMLHELP = @DOXYGEN_GENERATE_HTMLHELP@
+CHM_FILE = @DOXYGEN_CHM_FILE@
+HHC_LOCATION = @DOXYGEN_HHC_LOCATION@
+GENERATE_CHI = @DOXYGEN_GENERATE_CHI@
+CHM_INDEX_ENCODING = @DOXYGEN_CHM_INDEX_ENCODING@
+BINARY_TOC = @DOXYGEN_BINARY_TOC@
+TOC_EXPAND = @DOXYGEN_TOC_EXPAND@
+SITEMAP_URL = @DOXYGEN_SITEMAP_URL@
+GENERATE_QHP = @DOXYGEN_GENERATE_QHP@
+QCH_FILE = @DOXYGEN_QCH_FILE@
+QHP_NAMESPACE = @DOXYGEN_QHP_NAMESPACE@
+QHP_VIRTUAL_FOLDER = @DOXYGEN_QHP_VIRTUAL_FOLDER@
+QHP_CUST_FILTER_NAME = @DOXYGEN_QHP_CUST_FILTER_NAME@
+QHP_CUST_FILTER_ATTRS = @DOXYGEN_QHP_CUST_FILTER_ATTRS@
+QHP_SECT_FILTER_ATTRS = @DOXYGEN_QHP_SECT_FILTER_ATTRS@
+QHG_LOCATION = @DOXYGEN_QHG_LOCATION@
+GENERATE_ECLIPSEHELP = @DOXYGEN_GENERATE_ECLIPSEHELP@
+ECLIPSE_DOC_ID = @DOXYGEN_ECLIPSE_DOC_ID@
+DISABLE_INDEX = @DOXYGEN_DISABLE_INDEX@
+GENERATE_TREEVIEW = @DOXYGEN_GENERATE_TREEVIEW@
+FULL_SIDEBAR = @DOXYGEN_FULL_SIDEBAR@
+ENUM_VALUES_PER_LINE = @DOXYGEN_ENUM_VALUES_PER_LINE@
+TREEVIEW_WIDTH = @DOXYGEN_TREEVIEW_WIDTH@
+EXT_LINKS_IN_WINDOW = @DOXYGEN_EXT_LINKS_IN_WINDOW@
+OBFUSCATE_EMAILS = @DOXYGEN_OBFUSCATE_EMAILS@
+HTML_FORMULA_FORMAT = @DOXYGEN_HTML_FORMULA_FORMAT@
+FORMULA_FONTSIZE = @DOXYGEN_FORMULA_FONTSIZE@
+FORMULA_MACROFILE = @DOXYGEN_FORMULA_MACROFILE@
+USE_MATHJAX = @DOXYGEN_USE_MATHJAX@
+MATHJAX_VERSION = @DOXYGEN_MATHJAX_VERSION@
+MATHJAX_FORMAT = @DOXYGEN_MATHJAX_FORMAT@
+MATHJAX_RELPATH = @DOXYGEN_MATHJAX_RELPATH@
+MATHJAX_EXTENSIONS = @DOXYGEN_MATHJAX_EXTENSIONS@
+MATHJAX_CODEFILE = @DOXYGEN_MATHJAX_CODEFILE@
+SEARCHENGINE = @DOXYGEN_SEARCHENGINE@
+SERVER_BASED_SEARCH = @DOXYGEN_SERVER_BASED_SEARCH@
+EXTERNAL_SEARCH = @DOXYGEN_EXTERNAL_SEARCH@
+SEARCHENGINE_URL = @DOXYGEN_SEARCHENGINE_URL@
+SEARCHDATA_FILE = @DOXYGEN_SEARCHDATA_FILE@
+EXTERNAL_SEARCH_ID = @DOXYGEN_EXTERNAL_SEARCH_ID@
+EXTRA_SEARCH_MAPPINGS = @DOXYGEN_EXTRA_SEARCH_MAPPINGS@
+GENERATE_LATEX = @DOXYGEN_GENERATE_LATEX@
+LATEX_OUTPUT = @DOXYGEN_LATEX_OUTPUT@
+LATEX_CMD_NAME = @DOXYGEN_LATEX_CMD_NAME@
+MAKEINDEX_CMD_NAME = @DOXYGEN_MAKEINDEX_CMD_NAME@
+LATEX_MAKEINDEX_CMD = @DOXYGEN_LATEX_MAKEINDEX_CMD@
+COMPACT_LATEX = @DOXYGEN_COMPACT_LATEX@
+PAPER_TYPE = @DOXYGEN_PAPER_TYPE@
+EXTRA_PACKAGES = @DOXYGEN_EXTRA_PACKAGES@
+LATEX_HEADER = @DOXYGEN_LATEX_HEADER@
+LATEX_FOOTER = @DOXYGEN_LATEX_FOOTER@
+LATEX_EXTRA_STYLESHEET = @DOXYGEN_LATEX_EXTRA_STYLESHEET@
+LATEX_EXTRA_FILES = @DOXYGEN_LATEX_EXTRA_FILES@
+PDF_HYPERLINKS = @DOXYGEN_PDF_HYPERLINKS@
+USE_PDFLATEX = @DOXYGEN_USE_PDFLATEX@
+LATEX_BATCHMODE = @DOXYGEN_LATEX_BATCHMODE@
+LATEX_HIDE_INDICES = @DOXYGEN_LATEX_HIDE_INDICES@
+LATEX_BIB_STYLE = @DOXYGEN_LATEX_BIB_STYLE@
+LATEX_EMOJI_DIRECTORY = @DOXYGEN_LATEX_EMOJI_DIRECTORY@
+GENERATE_RTF = @DOXYGEN_GENERATE_RTF@
+RTF_OUTPUT = @DOXYGEN_RTF_OUTPUT@
+COMPACT_RTF = @DOXYGEN_COMPACT_RTF@
+RTF_HYPERLINKS = @DOXYGEN_RTF_HYPERLINKS@
+RTF_STYLESHEET_FILE = @DOXYGEN_RTF_STYLESHEET_FILE@
+RTF_EXTENSIONS_FILE = @DOXYGEN_RTF_EXTENSIONS_FILE@
+GENERATE_MAN = @DOXYGEN_GENERATE_MAN@
+MAN_OUTPUT = @DOXYGEN_MAN_OUTPUT@
+MAN_EXTENSION = @DOXYGEN_MAN_EXTENSION@
+MAN_SUBDIR = @DOXYGEN_MAN_SUBDIR@
+MAN_LINKS = @DOXYGEN_MAN_LINKS@
+GENERATE_XML = @DOXYGEN_GENERATE_XML@
+XML_OUTPUT = @DOXYGEN_XML_OUTPUT@
+XML_PROGRAMLISTING = @DOXYGEN_XML_PROGRAMLISTING@
+XML_NS_MEMB_FILE_SCOPE = @DOXYGEN_XML_NS_MEMB_FILE_SCOPE@
+GENERATE_DOCBOOK = @DOXYGEN_GENERATE_DOCBOOK@
+DOCBOOK_OUTPUT = @DOXYGEN_DOCBOOK_OUTPUT@
+GENERATE_AUTOGEN_DEF = @DOXYGEN_GENERATE_AUTOGEN_DEF@
+GENERATE_SQLITE3 = @DOXYGEN_GENERATE_SQLITE3@
+SQLITE3_OUTPUT = @DOXYGEN_SQLITE3_OUTPUT@
+SQLITE3_RECREATE_DB = @DOXYGEN_SQLITE3_RECREATE_DB@
+GENERATE_PERLMOD = @DOXYGEN_GENERATE_PERLMOD@
+PERLMOD_LATEX = @DOXYGEN_PERLMOD_LATEX@
+PERLMOD_PRETTY = @DOXYGEN_PERLMOD_PRETTY@
+PERLMOD_MAKEVAR_PREFIX = @DOXYGEN_PERLMOD_MAKEVAR_PREFIX@
+ENABLE_PREPROCESSING = @DOXYGEN_ENABLE_PREPROCESSING@
+MACRO_EXPANSION = @DOXYGEN_MACRO_EXPANSION@
+EXPAND_ONLY_PREDEF = @DOXYGEN_EXPAND_ONLY_PREDEF@
+SEARCH_INCLUDES = @DOXYGEN_SEARCH_INCLUDES@
+INCLUDE_PATH = @DOXYGEN_INCLUDE_PATH@
+INCLUDE_FILE_PATTERNS = @DOXYGEN_INCLUDE_FILE_PATTERNS@
+PREDEFINED = @DOXYGEN_PREDEFINED@
+EXPAND_AS_DEFINED = @DOXYGEN_EXPAND_AS_DEFINED@
+SKIP_FUNCTION_MACROS = @DOXYGEN_SKIP_FUNCTION_MACROS@
+TAGFILES = @DOXYGEN_TAGFILES@
+GENERATE_TAGFILE = @DOXYGEN_GENERATE_TAGFILE@
+ALLEXTERNALS = @DOXYGEN_ALLEXTERNALS@
+EXTERNAL_GROUPS = @DOXYGEN_EXTERNAL_GROUPS@
+EXTERNAL_PAGES = @DOXYGEN_EXTERNAL_PAGES@
+HIDE_UNDOC_RELATIONS = @DOXYGEN_HIDE_UNDOC_RELATIONS@
+HAVE_DOT = @DOXYGEN_HAVE_DOT@
+DOT_NUM_THREADS = @DOXYGEN_DOT_NUM_THREADS@
+DOT_COMMON_ATTR = @DOXYGEN_DOT_COMMON_ATTR@
+DOT_EDGE_ATTR = @DOXYGEN_DOT_EDGE_ATTR@
+DOT_NODE_ATTR = @DOXYGEN_DOT_NODE_ATTR@
+DOT_FONTPATH = @DOXYGEN_DOT_FONTPATH@
+CLASS_GRAPH = @DOXYGEN_CLASS_GRAPH@
+COLLABORATION_GRAPH = @DOXYGEN_COLLABORATION_GRAPH@
+GROUP_GRAPHS = @DOXYGEN_GROUP_GRAPHS@
+UML_LOOK = @DOXYGEN_UML_LOOK@
+UML_LIMIT_NUM_FIELDS = @DOXYGEN_UML_LIMIT_NUM_FIELDS@
+DOT_UML_DETAILS = @DOXYGEN_DOT_UML_DETAILS@
+DOT_WRAP_THRESHOLD = @DOXYGEN_DOT_WRAP_THRESHOLD@
+TEMPLATE_RELATIONS = @DOXYGEN_TEMPLATE_RELATIONS@
+INCLUDE_GRAPH = @DOXYGEN_INCLUDE_GRAPH@
+INCLUDED_BY_GRAPH = @DOXYGEN_INCLUDED_BY_GRAPH@
+CALL_GRAPH = @DOXYGEN_CALL_GRAPH@
+CALLER_GRAPH = @DOXYGEN_CALLER_GRAPH@
+GRAPHICAL_HIERARCHY = @DOXYGEN_GRAPHICAL_HIERARCHY@
+DIRECTORY_GRAPH = @DOXYGEN_DIRECTORY_GRAPH@
+DIR_GRAPH_MAX_DEPTH = @DOXYGEN_DIR_GRAPH_MAX_DEPTH@
+DOT_IMAGE_FORMAT = @DOXYGEN_DOT_IMAGE_FORMAT@
+INTERACTIVE_SVG = @DOXYGEN_INTERACTIVE_SVG@
+DOT_PATH = @DOXYGEN_DOT_PATH@
+DOTFILE_DIRS = @DOXYGEN_DOTFILE_DIRS@
+DIA_PATH = @DOXYGEN_DIA_PATH@
+DIAFILE_DIRS = @DOXYGEN_DIAFILE_DIRS@
+PLANTUML_JAR_PATH = @DOXYGEN_PLANTUML_JAR_PATH@
+PLANTUML_CFG_FILE = @DOXYGEN_PLANTUML_CFG_FILE@
+PLANTUML_INCLUDE_PATH = @DOXYGEN_PLANTUML_INCLUDE_PATH@
+DOT_GRAPH_MAX_NODES = @DOXYGEN_DOT_GRAPH_MAX_NODES@
+MAX_DOT_GRAPH_DEPTH = @DOXYGEN_MAX_DOT_GRAPH_DEPTH@
+DOT_MULTI_TARGETS = @DOXYGEN_DOT_MULTI_TARGETS@
+GENERATE_LEGEND = @DOXYGEN_GENERATE_LEGEND@
+DOT_CLEANUP = @DOXYGEN_DOT_CLEANUP@
+MSCGEN_TOOL = @DOXYGEN_MSCGEN_TOOL@
+MSCFILE_DIRS = @DOXYGEN_MSCFILE_DIRS@
diff --git a/graphics/asymptote/LspCpp/CMakeDoxygenDefaults.cmake b/graphics/asymptote/LspCpp/CMakeDoxygenDefaults.cmake
new file mode 100644
index 0000000000..c9def645b0
--- /dev/null
+++ b/graphics/asymptote/LspCpp/CMakeDoxygenDefaults.cmake
@@ -0,0 +1,715 @@
+#
+# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE!
+#
+
+if(NOT DEFINED DOXYGEN_DOXYFILE_ENCODING)
+ set(DOXYGEN_DOXYFILE_ENCODING UTF-8)
+endif()
+if(NOT DEFINED DOXYGEN_PROJECT_NAME)
+ set(DOXYGEN_PROJECT_NAME "My Project")
+endif()
+if(NOT DEFINED DOXYGEN_CREATE_SUBDIRS)
+ set(DOXYGEN_CREATE_SUBDIRS NO)
+endif()
+if(NOT DEFINED DOXYGEN_CREATE_SUBDIRS_LEVEL)
+ set(DOXYGEN_CREATE_SUBDIRS_LEVEL 8)
+endif()
+if(NOT DEFINED DOXYGEN_ALLOW_UNICODE_NAMES)
+ set(DOXYGEN_ALLOW_UNICODE_NAMES NO)
+endif()
+if(NOT DEFINED DOXYGEN_OUTPUT_LANGUAGE)
+ set(DOXYGEN_OUTPUT_LANGUAGE English)
+endif()
+if(NOT DEFINED DOXYGEN_BRIEF_MEMBER_DESC)
+ set(DOXYGEN_BRIEF_MEMBER_DESC YES)
+endif()
+if(NOT DEFINED DOXYGEN_REPEAT_BRIEF)
+ set(DOXYGEN_REPEAT_BRIEF YES)
+endif()
+if(NOT DEFINED DOXYGEN_ABBREVIATE_BRIEF)
+ set(DOXYGEN_ABBREVIATE_BRIEF "The $name class"
+ "The $name widget"
+ "The $name file"
+ is
+ provides
+ specifies
+ contains
+ represents
+ a
+ an
+ the)
+endif()
+if(NOT DEFINED DOXYGEN_ALWAYS_DETAILED_SEC)
+ set(DOXYGEN_ALWAYS_DETAILED_SEC NO)
+endif()
+if(NOT DEFINED DOXYGEN_INLINE_INHERITED_MEMB)
+ set(DOXYGEN_INLINE_INHERITED_MEMB NO)
+endif()
+if(NOT DEFINED DOXYGEN_FULL_PATH_NAMES)
+ set(DOXYGEN_FULL_PATH_NAMES YES)
+endif()
+if(NOT DEFINED DOXYGEN_SHORT_NAMES)
+ set(DOXYGEN_SHORT_NAMES NO)
+endif()
+if(NOT DEFINED DOXYGEN_JAVADOC_AUTOBRIEF)
+ set(DOXYGEN_JAVADOC_AUTOBRIEF NO)
+endif()
+if(NOT DEFINED DOXYGEN_JAVADOC_BANNER)
+ set(DOXYGEN_JAVADOC_BANNER NO)
+endif()
+if(NOT DEFINED DOXYGEN_QT_AUTOBRIEF)
+ set(DOXYGEN_QT_AUTOBRIEF NO)
+endif()
+if(NOT DEFINED DOXYGEN_MULTILINE_CPP_IS_BRIEF)
+ set(DOXYGEN_MULTILINE_CPP_IS_BRIEF NO)
+endif()
+if(NOT DEFINED DOXYGEN_PYTHON_DOCSTRING)
+ set(DOXYGEN_PYTHON_DOCSTRING YES)
+endif()
+if(NOT DEFINED DOXYGEN_INHERIT_DOCS)
+ set(DOXYGEN_INHERIT_DOCS YES)
+endif()
+if(NOT DEFINED DOXYGEN_SEPARATE_MEMBER_PAGES)
+ set(DOXYGEN_SEPARATE_MEMBER_PAGES NO)
+endif()
+if(NOT DEFINED DOXYGEN_TAB_SIZE)
+ set(DOXYGEN_TAB_SIZE 4)
+endif()
+if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_FOR_C)
+ set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C NO)
+endif()
+if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_JAVA)
+ set(DOXYGEN_OPTIMIZE_OUTPUT_JAVA NO)
+endif()
+if(NOT DEFINED DOXYGEN_OPTIMIZE_FOR_FORTRAN)
+ set(DOXYGEN_OPTIMIZE_FOR_FORTRAN NO)
+endif()
+if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_VHDL)
+ set(DOXYGEN_OPTIMIZE_OUTPUT_VHDL NO)
+endif()
+if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_SLICE)
+ set(DOXYGEN_OPTIMIZE_OUTPUT_SLICE NO)
+endif()
+if(NOT DEFINED DOXYGEN_MARKDOWN_SUPPORT)
+ set(DOXYGEN_MARKDOWN_SUPPORT YES)
+endif()
+if(NOT DEFINED DOXYGEN_TOC_INCLUDE_HEADINGS)
+ set(DOXYGEN_TOC_INCLUDE_HEADINGS 5)
+endif()
+if(NOT DEFINED DOXYGEN_MARKDOWN_ID_STYLE)
+ set(DOXYGEN_MARKDOWN_ID_STYLE DOXYGEN)
+endif()
+if(NOT DEFINED DOXYGEN_AUTOLINK_SUPPORT)
+ set(DOXYGEN_AUTOLINK_SUPPORT YES)
+endif()
+if(NOT DEFINED DOXYGEN_BUILTIN_STL_SUPPORT)
+ set(DOXYGEN_BUILTIN_STL_SUPPORT NO)
+endif()
+if(NOT DEFINED DOXYGEN_CPP_CLI_SUPPORT)
+ set(DOXYGEN_CPP_CLI_SUPPORT NO)
+endif()
+if(NOT DEFINED DOXYGEN_SIP_SUPPORT)
+ set(DOXYGEN_SIP_SUPPORT NO)
+endif()
+if(NOT DEFINED DOXYGEN_IDL_PROPERTY_SUPPORT)
+ set(DOXYGEN_IDL_PROPERTY_SUPPORT YES)
+endif()
+if(NOT DEFINED DOXYGEN_DISTRIBUTE_GROUP_DOC)
+ set(DOXYGEN_DISTRIBUTE_GROUP_DOC NO)
+endif()
+if(NOT DEFINED DOXYGEN_GROUP_NESTED_COMPOUNDS)
+ set(DOXYGEN_GROUP_NESTED_COMPOUNDS NO)
+endif()
+if(NOT DEFINED DOXYGEN_SUBGROUPING)
+ set(DOXYGEN_SUBGROUPING YES)
+endif()
+if(NOT DEFINED DOXYGEN_INLINE_GROUPED_CLASSES)
+ set(DOXYGEN_INLINE_GROUPED_CLASSES NO)
+endif()
+if(NOT DEFINED DOXYGEN_INLINE_SIMPLE_STRUCTS)
+ set(DOXYGEN_INLINE_SIMPLE_STRUCTS NO)
+endif()
+if(NOT DEFINED DOXYGEN_TYPEDEF_HIDES_STRUCT)
+ set(DOXYGEN_TYPEDEF_HIDES_STRUCT NO)
+endif()
+if(NOT DEFINED DOXYGEN_LOOKUP_CACHE_SIZE)
+ set(DOXYGEN_LOOKUP_CACHE_SIZE 0)
+endif()
+if(NOT DEFINED DOXYGEN_NUM_PROC_THREADS)
+ set(DOXYGEN_NUM_PROC_THREADS 1)
+endif()
+if(NOT DEFINED DOXYGEN_TIMESTAMP)
+ set(DOXYGEN_TIMESTAMP NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXTRACT_ALL)
+ set(DOXYGEN_EXTRACT_ALL NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXTRACT_PRIVATE)
+ set(DOXYGEN_EXTRACT_PRIVATE NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXTRACT_PRIV_VIRTUAL)
+ set(DOXYGEN_EXTRACT_PRIV_VIRTUAL NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXTRACT_PACKAGE)
+ set(DOXYGEN_EXTRACT_PACKAGE NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXTRACT_STATIC)
+ set(DOXYGEN_EXTRACT_STATIC NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXTRACT_LOCAL_CLASSES)
+ set(DOXYGEN_EXTRACT_LOCAL_CLASSES YES)
+endif()
+if(NOT DEFINED DOXYGEN_EXTRACT_LOCAL_METHODS)
+ set(DOXYGEN_EXTRACT_LOCAL_METHODS NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXTRACT_ANON_NSPACES)
+ set(DOXYGEN_EXTRACT_ANON_NSPACES NO)
+endif()
+if(NOT DEFINED DOXYGEN_RESOLVE_UNNAMED_PARAMS)
+ set(DOXYGEN_RESOLVE_UNNAMED_PARAMS YES)
+endif()
+if(NOT DEFINED DOXYGEN_HIDE_UNDOC_MEMBERS)
+ set(DOXYGEN_HIDE_UNDOC_MEMBERS NO)
+endif()
+if(NOT DEFINED DOXYGEN_HIDE_UNDOC_CLASSES)
+ set(DOXYGEN_HIDE_UNDOC_CLASSES NO)
+endif()
+if(NOT DEFINED DOXYGEN_HIDE_FRIEND_COMPOUNDS)
+ set(DOXYGEN_HIDE_FRIEND_COMPOUNDS NO)
+endif()
+if(NOT DEFINED DOXYGEN_HIDE_IN_BODY_DOCS)
+ set(DOXYGEN_HIDE_IN_BODY_DOCS NO)
+endif()
+if(NOT DEFINED DOXYGEN_INTERNAL_DOCS)
+ set(DOXYGEN_INTERNAL_DOCS NO)
+endif()
+if(NOT DEFINED DOXYGEN_CASE_SENSE_NAMES)
+ set(DOXYGEN_CASE_SENSE_NAMES SYSTEM)
+endif()
+if(NOT DEFINED DOXYGEN_HIDE_SCOPE_NAMES)
+ set(DOXYGEN_HIDE_SCOPE_NAMES NO)
+endif()
+if(NOT DEFINED DOXYGEN_HIDE_COMPOUND_REFERENCE)
+ set(DOXYGEN_HIDE_COMPOUND_REFERENCE NO)
+endif()
+if(NOT DEFINED DOXYGEN_SHOW_HEADERFILE)
+ set(DOXYGEN_SHOW_HEADERFILE YES)
+endif()
+if(NOT DEFINED DOXYGEN_SHOW_INCLUDE_FILES)
+ set(DOXYGEN_SHOW_INCLUDE_FILES YES)
+endif()
+if(NOT DEFINED DOXYGEN_SHOW_GROUPED_MEMB_INC)
+ set(DOXYGEN_SHOW_GROUPED_MEMB_INC NO)
+endif()
+if(NOT DEFINED DOXYGEN_FORCE_LOCAL_INCLUDES)
+ set(DOXYGEN_FORCE_LOCAL_INCLUDES NO)
+endif()
+if(NOT DEFINED DOXYGEN_INLINE_INFO)
+ set(DOXYGEN_INLINE_INFO YES)
+endif()
+if(NOT DEFINED DOXYGEN_SORT_MEMBER_DOCS)
+ set(DOXYGEN_SORT_MEMBER_DOCS YES)
+endif()
+if(NOT DEFINED DOXYGEN_SORT_BRIEF_DOCS)
+ set(DOXYGEN_SORT_BRIEF_DOCS NO)
+endif()
+if(NOT DEFINED DOXYGEN_SORT_MEMBERS_CTORS_1ST)
+ set(DOXYGEN_SORT_MEMBERS_CTORS_1ST NO)
+endif()
+if(NOT DEFINED DOXYGEN_SORT_GROUP_NAMES)
+ set(DOXYGEN_SORT_GROUP_NAMES NO)
+endif()
+if(NOT DEFINED DOXYGEN_SORT_BY_SCOPE_NAME)
+ set(DOXYGEN_SORT_BY_SCOPE_NAME NO)
+endif()
+if(NOT DEFINED DOXYGEN_STRICT_PROTO_MATCHING)
+ set(DOXYGEN_STRICT_PROTO_MATCHING NO)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_TODOLIST)
+ set(DOXYGEN_GENERATE_TODOLIST YES)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_TESTLIST)
+ set(DOXYGEN_GENERATE_TESTLIST YES)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_BUGLIST)
+ set(DOXYGEN_GENERATE_BUGLIST YES)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_DEPRECATEDLIST)
+ set(DOXYGEN_GENERATE_DEPRECATEDLIST YES)
+endif()
+if(NOT DEFINED DOXYGEN_MAX_INITIALIZER_LINES)
+ set(DOXYGEN_MAX_INITIALIZER_LINES 30)
+endif()
+if(NOT DEFINED DOXYGEN_SHOW_USED_FILES)
+ set(DOXYGEN_SHOW_USED_FILES YES)
+endif()
+if(NOT DEFINED DOXYGEN_SHOW_FILES)
+ set(DOXYGEN_SHOW_FILES YES)
+endif()
+if(NOT DEFINED DOXYGEN_SHOW_NAMESPACES)
+ set(DOXYGEN_SHOW_NAMESPACES YES)
+endif()
+if(NOT DEFINED DOXYGEN_QUIET)
+ set(DOXYGEN_QUIET NO)
+endif()
+if(NOT DEFINED DOXYGEN_WARNINGS)
+ set(DOXYGEN_WARNINGS YES)
+endif()
+if(NOT DEFINED DOXYGEN_WARN_IF_UNDOCUMENTED)
+ set(DOXYGEN_WARN_IF_UNDOCUMENTED YES)
+endif()
+if(NOT DEFINED DOXYGEN_WARN_IF_DOC_ERROR)
+ set(DOXYGEN_WARN_IF_DOC_ERROR YES)
+endif()
+if(NOT DEFINED DOXYGEN_WARN_IF_INCOMPLETE_DOC)
+ set(DOXYGEN_WARN_IF_INCOMPLETE_DOC YES)
+endif()
+if(NOT DEFINED DOXYGEN_WARN_NO_PARAMDOC)
+ set(DOXYGEN_WARN_NO_PARAMDOC NO)
+endif()
+if(NOT DEFINED DOXYGEN_WARN_IF_UNDOC_ENUM_VAL)
+ set(DOXYGEN_WARN_IF_UNDOC_ENUM_VAL NO)
+endif()
+if(NOT DEFINED DOXYGEN_WARN_AS_ERROR)
+ set(DOXYGEN_WARN_AS_ERROR NO)
+endif()
+if(NOT DEFINED DOXYGEN_WARN_FORMAT)
+ set(DOXYGEN_WARN_FORMAT "$file:$line: $text")
+endif()
+if(NOT DEFINED DOXYGEN_WARN_LINE_FORMAT)
+ set(DOXYGEN_WARN_LINE_FORMAT "at line $line of file $file")
+endif()
+if(NOT DEFINED DOXYGEN_INPUT_ENCODING)
+ set(DOXYGEN_INPUT_ENCODING UTF-8)
+endif()
+if(NOT DEFINED DOXYGEN_FILE_PATTERNS)
+ set(DOXYGEN_FILE_PATTERNS *.c
+ *.cc
+ *.cxx
+ *.cxxm
+ *.cpp
+ *.cppm
+ *.ccm
+ *.c++
+ *.c++m
+ *.java
+ *.ii
+ *.ixx
+ *.ipp
+ *.i++
+ *.inl
+ *.idl
+ *.ddl
+ *.odl
+ *.h
+ *.hh
+ *.hxx
+ *.hpp
+ *.h++
+ *.ixx
+ *.l
+ *.cs
+ *.d
+ *.php
+ *.php4
+ *.php5
+ *.phtml
+ *.inc
+ *.m
+ *.markdown
+ *.md
+ *.mm
+ *.dox
+ *.py
+ *.pyw
+ *.f90
+ *.f95
+ *.f03
+ *.f08
+ *.f18
+ *.f
+ *.for
+ *.vhd
+ *.vhdl
+ *.ucf
+ *.qsf
+ *.ice)
+endif()
+if(NOT DEFINED DOXYGEN_RECURSIVE)
+ set(DOXYGEN_RECURSIVE NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXCLUDE_SYMLINKS)
+ set(DOXYGEN_EXCLUDE_SYMLINKS NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXAMPLE_PATTERNS)
+ set(DOXYGEN_EXAMPLE_PATTERNS *)
+endif()
+if(NOT DEFINED DOXYGEN_EXAMPLE_RECURSIVE)
+ set(DOXYGEN_EXAMPLE_RECURSIVE NO)
+endif()
+if(NOT DEFINED DOXYGEN_FILTER_SOURCE_FILES)
+ set(DOXYGEN_FILTER_SOURCE_FILES NO)
+endif()
+if(NOT DEFINED DOXYGEN_FORTRAN_COMMENT_AFTER)
+ set(DOXYGEN_FORTRAN_COMMENT_AFTER 72)
+endif()
+if(NOT DEFINED DOXYGEN_SOURCE_BROWSER)
+ set(DOXYGEN_SOURCE_BROWSER NO)
+endif()
+if(NOT DEFINED DOXYGEN_INLINE_SOURCES)
+ set(DOXYGEN_INLINE_SOURCES NO)
+endif()
+if(NOT DEFINED DOXYGEN_STRIP_CODE_COMMENTS)
+ set(DOXYGEN_STRIP_CODE_COMMENTS YES)
+endif()
+if(NOT DEFINED DOXYGEN_REFERENCED_BY_RELATION)
+ set(DOXYGEN_REFERENCED_BY_RELATION NO)
+endif()
+if(NOT DEFINED DOXYGEN_REFERENCES_RELATION)
+ set(DOXYGEN_REFERENCES_RELATION NO)
+endif()
+if(NOT DEFINED DOXYGEN_REFERENCES_LINK_SOURCE)
+ set(DOXYGEN_REFERENCES_LINK_SOURCE YES)
+endif()
+if(NOT DEFINED DOXYGEN_SOURCE_TOOLTIPS)
+ set(DOXYGEN_SOURCE_TOOLTIPS YES)
+endif()
+if(NOT DEFINED DOXYGEN_USE_HTAGS)
+ set(DOXYGEN_USE_HTAGS NO)
+endif()
+if(NOT DEFINED DOXYGEN_VERBATIM_HEADERS)
+ set(DOXYGEN_VERBATIM_HEADERS YES)
+endif()
+if(NOT DEFINED DOXYGEN_ALPHABETICAL_INDEX)
+ set(DOXYGEN_ALPHABETICAL_INDEX YES)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_HTML)
+ set(DOXYGEN_GENERATE_HTML YES)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_OUTPUT)
+ set(DOXYGEN_HTML_OUTPUT html)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_FILE_EXTENSION)
+ set(DOXYGEN_HTML_FILE_EXTENSION .html)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE)
+ set(DOXYGEN_HTML_COLORSTYLE AUTO_LIGHT)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_HUE)
+ set(DOXYGEN_HTML_COLORSTYLE_HUE 220)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_SAT)
+ set(DOXYGEN_HTML_COLORSTYLE_SAT 100)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_GAMMA)
+ set(DOXYGEN_HTML_COLORSTYLE_GAMMA 80)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_DYNAMIC_MENUS)
+ set(DOXYGEN_HTML_DYNAMIC_MENUS YES)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_DYNAMIC_SECTIONS)
+ set(DOXYGEN_HTML_DYNAMIC_SECTIONS NO)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_CODE_FOLDING)
+ set(DOXYGEN_HTML_CODE_FOLDING YES)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_COPY_CLIPBOARD)
+ set(DOXYGEN_HTML_COPY_CLIPBOARD YES)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_INDEX_NUM_ENTRIES)
+ set(DOXYGEN_HTML_INDEX_NUM_ENTRIES 100)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_DOCSET)
+ set(DOXYGEN_GENERATE_DOCSET NO)
+endif()
+if(NOT DEFINED DOXYGEN_DOCSET_FEEDNAME)
+ set(DOXYGEN_DOCSET_FEEDNAME "Doxygen generated docs")
+endif()
+if(NOT DEFINED DOXYGEN_DOCSET_BUNDLE_ID)
+ set(DOXYGEN_DOCSET_BUNDLE_ID org.doxygen.Project)
+endif()
+if(NOT DEFINED DOXYGEN_DOCSET_PUBLISHER_ID)
+ set(DOXYGEN_DOCSET_PUBLISHER_ID org.doxygen.Publisher)
+endif()
+if(NOT DEFINED DOXYGEN_DOCSET_PUBLISHER_NAME)
+ set(DOXYGEN_DOCSET_PUBLISHER_NAME Publisher)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_HTMLHELP)
+ set(DOXYGEN_GENERATE_HTMLHELP NO)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_CHI)
+ set(DOXYGEN_GENERATE_CHI NO)
+endif()
+if(NOT DEFINED DOXYGEN_BINARY_TOC)
+ set(DOXYGEN_BINARY_TOC NO)
+endif()
+if(NOT DEFINED DOXYGEN_TOC_EXPAND)
+ set(DOXYGEN_TOC_EXPAND NO)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_QHP)
+ set(DOXYGEN_GENERATE_QHP NO)
+endif()
+if(NOT DEFINED DOXYGEN_QHP_NAMESPACE)
+ set(DOXYGEN_QHP_NAMESPACE org.doxygen.Project)
+endif()
+if(NOT DEFINED DOXYGEN_QHP_VIRTUAL_FOLDER)
+ set(DOXYGEN_QHP_VIRTUAL_FOLDER doc)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_ECLIPSEHELP)
+ set(DOXYGEN_GENERATE_ECLIPSEHELP NO)
+endif()
+if(NOT DEFINED DOXYGEN_ECLIPSE_DOC_ID)
+ set(DOXYGEN_ECLIPSE_DOC_ID org.doxygen.Project)
+endif()
+if(NOT DEFINED DOXYGEN_DISABLE_INDEX)
+ set(DOXYGEN_DISABLE_INDEX NO)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_TREEVIEW)
+ set(DOXYGEN_GENERATE_TREEVIEW NO)
+endif()
+if(NOT DEFINED DOXYGEN_FULL_SIDEBAR)
+ set(DOXYGEN_FULL_SIDEBAR NO)
+endif()
+if(NOT DEFINED DOXYGEN_ENUM_VALUES_PER_LINE)
+ set(DOXYGEN_ENUM_VALUES_PER_LINE 4)
+endif()
+if(NOT DEFINED DOXYGEN_TREEVIEW_WIDTH)
+ set(DOXYGEN_TREEVIEW_WIDTH 250)
+endif()
+if(NOT DEFINED DOXYGEN_EXT_LINKS_IN_WINDOW)
+ set(DOXYGEN_EXT_LINKS_IN_WINDOW NO)
+endif()
+if(NOT DEFINED DOXYGEN_OBFUSCATE_EMAILS)
+ set(DOXYGEN_OBFUSCATE_EMAILS YES)
+endif()
+if(NOT DEFINED DOXYGEN_HTML_FORMULA_FORMAT)
+ set(DOXYGEN_HTML_FORMULA_FORMAT png)
+endif()
+if(NOT DEFINED DOXYGEN_FORMULA_FONTSIZE)
+ set(DOXYGEN_FORMULA_FONTSIZE 10)
+endif()
+if(NOT DEFINED DOXYGEN_USE_MATHJAX)
+ set(DOXYGEN_USE_MATHJAX NO)
+endif()
+if(NOT DEFINED DOXYGEN_MATHJAX_VERSION)
+ set(DOXYGEN_MATHJAX_VERSION MathJax_2)
+endif()
+if(NOT DEFINED DOXYGEN_MATHJAX_FORMAT)
+ set(DOXYGEN_MATHJAX_FORMAT HTML-CSS)
+endif()
+if(NOT DEFINED DOXYGEN_SEARCHENGINE)
+ set(DOXYGEN_SEARCHENGINE YES)
+endif()
+if(NOT DEFINED DOXYGEN_SERVER_BASED_SEARCH)
+ set(DOXYGEN_SERVER_BASED_SEARCH NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXTERNAL_SEARCH)
+ set(DOXYGEN_EXTERNAL_SEARCH NO)
+endif()
+if(NOT DEFINED DOXYGEN_SEARCHDATA_FILE)
+ set(DOXYGEN_SEARCHDATA_FILE searchdata.xml)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_LATEX)
+ set(DOXYGEN_GENERATE_LATEX YES)
+endif()
+if(NOT DEFINED DOXYGEN_LATEX_OUTPUT)
+ set(DOXYGEN_LATEX_OUTPUT latex)
+endif()
+if(NOT DEFINED DOXYGEN_MAKEINDEX_CMD_NAME)
+ set(DOXYGEN_MAKEINDEX_CMD_NAME makeindex)
+endif()
+if(NOT DEFINED DOXYGEN_LATEX_MAKEINDEX_CMD)
+ set(DOXYGEN_LATEX_MAKEINDEX_CMD makeindex)
+endif()
+if(NOT DEFINED DOXYGEN_COMPACT_LATEX)
+ set(DOXYGEN_COMPACT_LATEX NO)
+endif()
+if(NOT DEFINED DOXYGEN_PAPER_TYPE)
+ set(DOXYGEN_PAPER_TYPE a4)
+endif()
+if(NOT DEFINED DOXYGEN_PDF_HYPERLINKS)
+ set(DOXYGEN_PDF_HYPERLINKS YES)
+endif()
+if(NOT DEFINED DOXYGEN_USE_PDFLATEX)
+ set(DOXYGEN_USE_PDFLATEX YES)
+endif()
+if(NOT DEFINED DOXYGEN_LATEX_BATCHMODE)
+ set(DOXYGEN_LATEX_BATCHMODE NO)
+endif()
+if(NOT DEFINED DOXYGEN_LATEX_HIDE_INDICES)
+ set(DOXYGEN_LATEX_HIDE_INDICES NO)
+endif()
+if(NOT DEFINED DOXYGEN_LATEX_BIB_STYLE)
+ set(DOXYGEN_LATEX_BIB_STYLE plain)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_RTF)
+ set(DOXYGEN_GENERATE_RTF NO)
+endif()
+if(NOT DEFINED DOXYGEN_RTF_OUTPUT)
+ set(DOXYGEN_RTF_OUTPUT rtf)
+endif()
+if(NOT DEFINED DOXYGEN_COMPACT_RTF)
+ set(DOXYGEN_COMPACT_RTF NO)
+endif()
+if(NOT DEFINED DOXYGEN_RTF_HYPERLINKS)
+ set(DOXYGEN_RTF_HYPERLINKS NO)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_MAN)
+ set(DOXYGEN_GENERATE_MAN NO)
+endif()
+if(NOT DEFINED DOXYGEN_MAN_OUTPUT)
+ set(DOXYGEN_MAN_OUTPUT man)
+endif()
+if(NOT DEFINED DOXYGEN_MAN_EXTENSION)
+ set(DOXYGEN_MAN_EXTENSION .3)
+endif()
+if(NOT DEFINED DOXYGEN_MAN_LINKS)
+ set(DOXYGEN_MAN_LINKS NO)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_XML)
+ set(DOXYGEN_GENERATE_XML NO)
+endif()
+if(NOT DEFINED DOXYGEN_XML_OUTPUT)
+ set(DOXYGEN_XML_OUTPUT xml)
+endif()
+if(NOT DEFINED DOXYGEN_XML_PROGRAMLISTING)
+ set(DOXYGEN_XML_PROGRAMLISTING YES)
+endif()
+if(NOT DEFINED DOXYGEN_XML_NS_MEMB_FILE_SCOPE)
+ set(DOXYGEN_XML_NS_MEMB_FILE_SCOPE NO)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_DOCBOOK)
+ set(DOXYGEN_GENERATE_DOCBOOK NO)
+endif()
+if(NOT DEFINED DOXYGEN_DOCBOOK_OUTPUT)
+ set(DOXYGEN_DOCBOOK_OUTPUT docbook)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_AUTOGEN_DEF)
+ set(DOXYGEN_GENERATE_AUTOGEN_DEF NO)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_SQLITE3)
+ set(DOXYGEN_GENERATE_SQLITE3 NO)
+endif()
+if(NOT DEFINED DOXYGEN_SQLITE3_OUTPUT)
+ set(DOXYGEN_SQLITE3_OUTPUT sqlite3)
+endif()
+if(NOT DEFINED DOXYGEN_SQLITE3_RECREATE_DB)
+ set(DOXYGEN_SQLITE3_RECREATE_DB YES)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_PERLMOD)
+ set(DOXYGEN_GENERATE_PERLMOD NO)
+endif()
+if(NOT DEFINED DOXYGEN_PERLMOD_LATEX)
+ set(DOXYGEN_PERLMOD_LATEX NO)
+endif()
+if(NOT DEFINED DOXYGEN_PERLMOD_PRETTY)
+ set(DOXYGEN_PERLMOD_PRETTY YES)
+endif()
+if(NOT DEFINED DOXYGEN_ENABLE_PREPROCESSING)
+ set(DOXYGEN_ENABLE_PREPROCESSING YES)
+endif()
+if(NOT DEFINED DOXYGEN_MACRO_EXPANSION)
+ set(DOXYGEN_MACRO_EXPANSION NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXPAND_ONLY_PREDEF)
+ set(DOXYGEN_EXPAND_ONLY_PREDEF NO)
+endif()
+if(NOT DEFINED DOXYGEN_SEARCH_INCLUDES)
+ set(DOXYGEN_SEARCH_INCLUDES YES)
+endif()
+if(NOT DEFINED DOXYGEN_SKIP_FUNCTION_MACROS)
+ set(DOXYGEN_SKIP_FUNCTION_MACROS YES)
+endif()
+if(NOT DEFINED DOXYGEN_ALLEXTERNALS)
+ set(DOXYGEN_ALLEXTERNALS NO)
+endif()
+if(NOT DEFINED DOXYGEN_EXTERNAL_GROUPS)
+ set(DOXYGEN_EXTERNAL_GROUPS YES)
+endif()
+if(NOT DEFINED DOXYGEN_EXTERNAL_PAGES)
+ set(DOXYGEN_EXTERNAL_PAGES YES)
+endif()
+if(NOT DEFINED DOXYGEN_HIDE_UNDOC_RELATIONS)
+ set(DOXYGEN_HIDE_UNDOC_RELATIONS YES)
+endif()
+if(NOT DEFINED DOXYGEN_HAVE_DOT)
+ set(DOXYGEN_HAVE_DOT NO)
+endif()
+if(NOT DEFINED DOXYGEN_DOT_NUM_THREADS)
+ set(DOXYGEN_DOT_NUM_THREADS 0)
+endif()
+if(NOT DEFINED DOXYGEN_DOT_COMMON_ATTR)
+ set(DOXYGEN_DOT_COMMON_ATTR "fontname=Helvetica,fontsize=10")
+endif()
+if(NOT DEFINED DOXYGEN_DOT_EDGE_ATTR)
+ set(DOXYGEN_DOT_EDGE_ATTR "labelfontname=Helvetica,labelfontsize=10")
+endif()
+if(NOT DEFINED DOXYGEN_DOT_NODE_ATTR)
+ set(DOXYGEN_DOT_NODE_ATTR "shape=box,height=0.2,width=0.4")
+endif()
+if(NOT DEFINED DOXYGEN_CLASS_GRAPH)
+ set(DOXYGEN_CLASS_GRAPH YES)
+endif()
+if(NOT DEFINED DOXYGEN_COLLABORATION_GRAPH)
+ set(DOXYGEN_COLLABORATION_GRAPH YES)
+endif()
+if(NOT DEFINED DOXYGEN_GROUP_GRAPHS)
+ set(DOXYGEN_GROUP_GRAPHS YES)
+endif()
+if(NOT DEFINED DOXYGEN_UML_LOOK)
+ set(DOXYGEN_UML_LOOK NO)
+endif()
+if(NOT DEFINED DOXYGEN_UML_LIMIT_NUM_FIELDS)
+ set(DOXYGEN_UML_LIMIT_NUM_FIELDS 10)
+endif()
+if(NOT DEFINED DOXYGEN_DOT_UML_DETAILS)
+ set(DOXYGEN_DOT_UML_DETAILS NO)
+endif()
+if(NOT DEFINED DOXYGEN_DOT_WRAP_THRESHOLD)
+ set(DOXYGEN_DOT_WRAP_THRESHOLD 17)
+endif()
+if(NOT DEFINED DOXYGEN_TEMPLATE_RELATIONS)
+ set(DOXYGEN_TEMPLATE_RELATIONS NO)
+endif()
+if(NOT DEFINED DOXYGEN_INCLUDE_GRAPH)
+ set(DOXYGEN_INCLUDE_GRAPH YES)
+endif()
+if(NOT DEFINED DOXYGEN_INCLUDED_BY_GRAPH)
+ set(DOXYGEN_INCLUDED_BY_GRAPH YES)
+endif()
+if(NOT DEFINED DOXYGEN_CALL_GRAPH)
+ set(DOXYGEN_CALL_GRAPH NO)
+endif()
+if(NOT DEFINED DOXYGEN_CALLER_GRAPH)
+ set(DOXYGEN_CALLER_GRAPH NO)
+endif()
+if(NOT DEFINED DOXYGEN_GRAPHICAL_HIERARCHY)
+ set(DOXYGEN_GRAPHICAL_HIERARCHY YES)
+endif()
+if(NOT DEFINED DOXYGEN_DIRECTORY_GRAPH)
+ set(DOXYGEN_DIRECTORY_GRAPH YES)
+endif()
+if(NOT DEFINED DOXYGEN_DIR_GRAPH_MAX_DEPTH)
+ set(DOXYGEN_DIR_GRAPH_MAX_DEPTH 1)
+endif()
+if(NOT DEFINED DOXYGEN_DOT_IMAGE_FORMAT)
+ set(DOXYGEN_DOT_IMAGE_FORMAT png)
+endif()
+if(NOT DEFINED DOXYGEN_INTERACTIVE_SVG)
+ set(DOXYGEN_INTERACTIVE_SVG NO)
+endif()
+if(NOT DEFINED DOXYGEN_DOT_GRAPH_MAX_NODES)
+ set(DOXYGEN_DOT_GRAPH_MAX_NODES 50)
+endif()
+if(NOT DEFINED DOXYGEN_MAX_DOT_GRAPH_DEPTH)
+ set(DOXYGEN_MAX_DOT_GRAPH_DEPTH 0)
+endif()
+if(NOT DEFINED DOXYGEN_DOT_MULTI_TARGETS)
+ set(DOXYGEN_DOT_MULTI_TARGETS NO)
+endif()
+if(NOT DEFINED DOXYGEN_GENERATE_LEGEND)
+ set(DOXYGEN_GENERATE_LEGEND YES)
+endif()
+if(NOT DEFINED DOXYGEN_DOT_CLEANUP)
+ set(DOXYGEN_DOT_CLEANUP YES)
+endif()
diff --git a/graphics/asymptote/LspCpp/CMakeLists.txt b/graphics/asymptote/LspCpp/CMakeLists.txt
index b04e08e733..6b12b045c1 100644
--- a/graphics/asymptote/LspCpp/CMakeLists.txt
+++ b/graphics/asymptote/LspCpp/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.8)
+cmake_minimum_required(VERSION 3.16)
if(POLICY CMP0025)
# detect Apple's Clang
@@ -11,7 +11,8 @@ endif()
set(LIB_MAJOR_VERSION "1")
set(LIB_MINOR_VERSION "0")
set(LIB_PATCH_VERSION "0")
-set(LIB_VERSION_STRING "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_PATCH_VERSION}")
+set(LIB_TWEAK_VERSION "0")
+set(LIB_VERSION_STRING "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_PATCH_VERSION}.${LIB_TWEAK_VERSION}")
# Without this, paths are not relative in the sources list
cmake_policy(SET CMP0076 NEW)
@@ -25,6 +26,39 @@ if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif()
+set(LSPCPP_DEBUG_POSTFIX d CACHE STRING "Debug library postfix.")
+# Set LSPCPP_LIB_NAME for pkg-config lspcpp.pc. We cannot use the OUTPUT_NAME target
+# property because it's not set by default.
+set(LSPCPP_LIB_NAME lspcpp)
+if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+ set(LSPCPP_LIB_NAME ${LSPCPP_LIB_NAME}${LSPCPP_DEBUG_POSTFIX})
+endif ()
+
+include(CMakeParseArguments)
+# Joins arguments and places the results in ${result_var}.
+function(join result_var)
+ set(result "")
+ foreach (arg ${ARGN})
+ set(result "${result}${arg}")
+ endforeach ()
+ set(${result_var} "${result}" PARENT_SCOPE)
+endfunction()
+# Sets a cache variable with a docstring joined from multiple arguments:
+# set(<variable> <value>... CACHE <type> <docstring>...)
+# This allows splitting a long docstring for readability.
+function(set_verbose)
+ # cmake_parse_arguments is broken in CMake 3.4 (cannot parse CACHE) so use
+ # list instead.
+ list(GET ARGN 0 var)
+ list(REMOVE_AT ARGN 0)
+ list(GET ARGN 0 val)
+ list(REMOVE_AT ARGN 0)
+ list(REMOVE_AT ARGN 0)
+ list(GET ARGN 0 type)
+ list(REMOVE_AT ARGN 0)
+ join(doc ${ARGN})
+ set(${var} ${val} CACHE ${type} ${doc})
+endfunction()
###########################################################
# Options
###########################################################
@@ -43,15 +77,37 @@ option_if_not_defined(LSPCPP_ASAN "Build lsp with address sanitizer" OFF)
option_if_not_defined(LSPCPP_MSAN "Build lsp with memory sanitizer" OFF)
option_if_not_defined(LSPCPP_TSAN "Build lsp with thread sanitizer" OFF)
option_if_not_defined(LSPCPP_INSTALL "Create lsp install target" OFF)
-option_if_not_defined(LSPCPP_SUPPORT_BOEHM_GC
- "Enable support for Boehm GC. Boehm GC must be available by find_package(BDWgc CONFIG REQUIRED)." OFF)
+option_if_not_defined(LSPCPP_SUPPORT_BOEHM_GC "\
+Enable support for Boehm GC. GC must be specified LSPCPP_GC_DOWNLOADED_ROOT, if downloaded or by
+find_package(BDWgc CONFIG REQUIRED) or pkg_config." OFF)
option_if_not_defined(LSPCPP_USE_CPP17 "Use C++17 for compilation. Setting this to off requires boost-optional." OFF)
+set(LSPCPP_GC_DOWNLOADED_ROOT "" CACHE STRING "\
+If using downloaded gc root from https://www.hboehm.info/gc/, extract its contents and set this setting to
+where the tar.gz file is extracted to. This directory must be an absolute path.
+If this setting is set, LspCpp will use downloaded GC regardless of whether GC from find_package or
+pkg_config is available or not.
+")
+option_if_not_defined(LSPCPP_GC_STATIC "Compiling with static gc library. Only used if a custom GC root is given" OFF)
+set(LSPCPP_WIN32_WINNT_VALUE "0x0A00" CACHE STRING
+ "Value to specify for _WIN32_WINNT macro when compiling on windows. See
+https://learn.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170"
+)
+###########################################################
# Boehm GC
+###########################################################
-if (LSPCPP_SUPPORT_BOEHM_GC)
- find_package(BDWgc CONFIG REQUIRED)
+if (LSPCPP_SUPPORT_BOEHM_GC AND NOT LSPCPP_GC_DOWNLOADED_ROOT)
+ message(STATUS "Attempting to find BDWgc by find_package")
+ find_package(BDWgc CONFIG)
+ if (NOT BDWgc_FOUND)
+ set(GC_USE_PKGCONFIG 1)
+ # fallback to pkg-config
+ message(STATUS "CMake config for BDWgc not found; falling back to pkg-config")
+ find_package(PkgConfig REQUIRED)
+ pkg_check_modules(gc REQUIRED IMPORTED_TARGET bdw-gc)
+ endif()
endif()
###########################################################
@@ -167,10 +223,37 @@ function(lspcpp_set_target_options target)
# endif()
if (LSPCPP_SUPPORT_BOEHM_GC)
- target_link_libraries(${target} PUBLIC BDWgc::gc)
+ if (LSPCPP_GC_DOWNLOADED_ROOT)
+ message(STATUS "Using manually downloaded GC")
+ target_include_directories(${target} PUBLIC ${LSPCPP_GC_DOWNLOADED_ROOT}/include)
+
+ if (LSPCPP_GC_STATIC)
+ target_compile_definitions(${target} PUBLIC GC_NOT_DLL)
+ endif()
+ else()
+ if (NOT GC_USE_PKGCONFIG)
+ message(STATUS "Using cmake config for locating gc")
+ target_link_libraries(${target} PUBLIC BDWgc::gc)
+ get_target_property(GC_INCLUDE_DIRS_BASE BDWgc::gc INTERFACE_INCLUDE_DIRECTORIES)
+ else()
+ message(STATUS "Using pkg-config for locating gc")
+ target_link_libraries(${target} PUBLIC PkgConfig::gc)
+ get_target_property(GC_INCLUDE_DIRS_BASE PkgConfig::gc INTERFACE_INCLUDE_DIRECTORIES)
+ endif()
+
+ if (NOT GC_INCLUDE_DIRS_BASE STREQUAL "GC_INCLUDE_DIRS_BASE-NOTFOUND")
+ list(TRANSFORM GC_INCLUDE_DIRS_BASE APPEND /gc)
+ target_include_directories(${target} PUBLIC ${GC_INCLUDE_DIRS_BASE})
+ else()
+ message(WARNING "Cannot find GC include directories; compilation may not work")
+ endif()
+ endif()
target_compile_definitions(${target} PUBLIC LSPCPP_USEGC)
endif()
+ if (WIN32)
+ target_compile_definitions(${target} PRIVATE _WIN32_WINNT=${LSPCPP_WIN32_WINNT_VALUE})
+ endif()
endfunction()
@@ -195,12 +278,14 @@ if (CMAKE_GENERATOR MATCHES "Visual Studio.*")
INSTALL_NUGET(boost_thread-vc141 1.76.0.0)
else()
- find_package(Boost COMPONENTS date_time chrono filesystem system thread program_options)
+ find_package(Boost CONFIG COMPONENTS date_time chrono filesystem system thread program_options)
if(NOT Boost_FOUND)
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
message(FATAL_ERROR "Can't find boost,lease build boost and install it or install boost with : brew install boost")
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
message(FATAL_ERROR "Can't find boost,please build boost and install it. or install boost with : sudo apt-get install libboost-dev")
+ else()
+ message(FATAL_ERROR "Boost not found. Please ensure boost is available for CMake.")
endif()
endif()
endif()
@@ -234,15 +319,17 @@ endif()
# lsp
add_library(lspcpp STATIC)
-
+set (LSP_INCLUDE_LIST ${LSPCPP_INCLUDE_DIR}
+ ${Boost_INCLUDE_DIRS}
+ ${RapidJSON_INCLUDE_DIRS}
+ ${Uri_SOURCE_DIR}/include)
### Includes
-target_include_directories(lspcpp
- PUBLIC
- ${LSPCPP_INCLUDE_DIR}
- ${Boost_INCLUDE_DIRS}
- ${RapidJSON_INCLUDE_DIRS}
- ${Uri_SOURCE_DIR}/include
- )
+
+if (LSPCPP_INSTALL)
+ target_include_directories(lspcpp PRIVATE ${LSP_INCLUDE_LIST})
+else()
+ target_include_directories(lspcpp PUBLIC ${LSP_INCLUDE_LIST})
+endif()
target_link_libraries(lspcpp PUBLIC network-uri ${Boost_LIBRARIES})
@@ -301,10 +388,67 @@ target_sources(lspcpp PRIVATE
lspcpp_set_target_options(lspcpp)
set_target_properties(lspcpp PROPERTIES POSITION_INDEPENDENT_CODE 1)
+set_target_properties(lspcpp PROPERTIES
+ DEBUG_POSTFIX "${LSPCPP_DEBUG_POSTFIX}"
+
+ # Workaround for Visual Studio 2017:
+ # Ensure the .pdb is created with the same name and in the same directory
+ # as the .lib. Newer VS versions already do this by default, but there is no
+ # harm in setting it for those too. Ignored by other generators.
+ COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
+ COMPILE_PDB_NAME "lspcpp"
+ COMPILE_PDB_NAME_DEBUG "lspcpp${LSPCPP_DEBUG_POSTFIX}")
# install
if(LSPCPP_INSTALL)
+ include(${CMAKE_CURRENT_SOURCE_DIR}/support/cmake/JoinPaths.cmake)
include(GNUInstallDirs)
+ include(CMakePackageConfigHelpers)
+ set(targets_export_name lspcpp-targets)
+ set(project_config ${PROJECT_BINARY_DIR}/lspcpp-config.cmake)
+ set(version_config ${PROJECT_BINARY_DIR}/lspcpp-config-version.cmake)
+ set(pkgconfig ${PROJECT_BINARY_DIR}/lspcpp.pc)
+
+ set_verbose(LSPCPP_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE STRING
+ "Installation directory for libraries, a relative path that "
+ "will be joined to ${CMAKE_INSTALL_PREFIX} or an absolute path.")
+
+ set_verbose(LSPCPP_PKGCONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig CACHE STRING
+ "Installation directory for pkgconfig (.pc) files, a relative "
+ "path that will be joined with ${CMAKE_INSTALL_PREFIX} or an "
+ "absolute path.")
+
+ set_verbose(LSPCPP_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/lspcpp CACHE STRING
+ "Installation directory for cmake files, a relative path that "
+ "will be joined with ${CMAKE_INSTALL_PREFIX} or an absolute "
+ "path.")
+
+ configure_package_config_file(
+ ${PROJECT_SOURCE_DIR}/support/cmake/lspcpp-config.cmake.in
+ ${project_config}
+ INSTALL_DESTINATION ${LSPCPP_CMAKE_DIR} )
+ write_basic_package_version_file(
+ ${version_config}
+ VERSION ${LIB_VERSION_STRING}
+ COMPATIBILITY SameMajorVersion
+ )
+ join_paths(libdir_for_pc_file "\${exec_prefix}" "${LSPCPP_LIB_DIR}")
+ join_paths(includedir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
+
+ configure_file(
+ "${PROJECT_SOURCE_DIR}/support/cmake/lspcpp.pc.in"
+ "${pkgconfig}"
+ @ONLY)
+
+ install(TARGETS network-uri
+ EXPORT NetworkURITargets
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib
+ RUNTIME DESTINATION bin
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+ install(EXPORT NetworkURITargets
+ FILE NetworkURITargets.cmake
+ DESTINATION lib/cmake/NetworkURI)
install(DIRECTORY ${LSPCPP_INCLUDE_DIR}/LibLsp
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
@@ -312,18 +456,22 @@ if(LSPCPP_INSTALL)
)
install(TARGETS lspcpp
- EXPORT lspcpp-targets
+ EXPORT ${targets_export_name}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
- install(EXPORT lspcpp-targets
- FILE lspcpp-config.cmake
+ install(EXPORT ${targets_export_name}
NAMESPACE lspcpp::
- DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/lspcpp
+ DESTINATION ${LSPCPP_CMAKE_DIR}
)
+ install(
+ FILES ${project_config} ${version_config}
+ DESTINATION ${LSPCPP_CMAKE_DIR}
+ )
+ install(FILES "${pkgconfig}" DESTINATION "${LSPCPP_PKGCONFIG_DIR}")
endif()
# examples
@@ -342,7 +490,7 @@ if(LSPCPP_BUILD_EXAMPLES)
function(build_example target)
add_executable(${target} "${CMAKE_CURRENT_SOURCE_DIR}/examples/${target}.cpp")
- target_include_directories(${target} PRIVATE ${Uri_SOURCE_DIR}/include)
+ target_include_directories(${target} PRIVATE ${LSP_INCLUDE_LIST})
set_target_properties(${target} PROPERTIES
FOLDER "Examples"
)
@@ -361,3 +509,6 @@ if(LSPCPP_BUILD_EXAMPLES)
build_example(${example})
endforeach()
endif()
+
+# Add a distclean target to the Makefile
+ADD_CUSTOM_TARGET(distclean COMMAND ${CMAKE_COMMAND} -P ${PROJECT_SOURCE_DIR}/support/cmake/distclean.cmake)
diff --git a/graphics/asymptote/LspCpp/CMakePresets.json b/graphics/asymptote/LspCpp/CMakePresets.json
new file mode 100644
index 0000000000..19764fb87e
--- /dev/null
+++ b/graphics/asymptote/LspCpp/CMakePresets.json
@@ -0,0 +1,30 @@
+{
+ "version": 6,
+ "cmakeMinimumRequired": {
+ "major": 3,
+ "minor": 25,
+ "patch": 0
+ },
+ "configurePresets": [
+ {
+ "name": "ci/default",
+ "description": "Default profile for CI to build. uses vcpkg, C++17 and vcpkg rapidjson",
+ "generator": "Ninja",
+ "cacheVariables": {
+ "CMAKE_BUILD_TYPE": "release",
+ "USE_SYSTEM_RAPIDJSON": "true",
+ "LSPCPP_USE_CPP17": "true",
+ "LSPCPP_SUPPORT_BOEHM_GC": "$env{LSPCPP_SUPPORT_BOEHM_GC}",
+ "VCPKG_MANIFEST_FEATURES": "$env{LSPCPP_CI_VCPKG_FEATURES}",
+ "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
+ },
+ "binaryDir": "${sourceDir}/cmake-build-ci"
+ }
+ ],
+ "buildPresets": [
+ {
+ "name": "ci/default",
+ "configurePreset": "ci/default"
+ }
+ ]
+}
diff --git a/graphics/asymptote/LspCpp/README.md b/graphics/asymptote/LspCpp/README.md
index afdd8814cf..6425aa64b8 100644
--- a/graphics/asymptote/LspCpp/README.md
+++ b/graphics/asymptote/LspCpp/README.md
@@ -38,8 +38,10 @@
Some code from :[cquery][1]
## Projects using LspCpp:
-* [JCIDE](https://www.javacardos.com/tools)
+* [JCIDE](https://www.javacardos.com/javacardforum/viewtopic.php?f=5&t=3569&sid=e01238adf55cd08696fbf495dfa6c8e5)
* [LPG-language-server](https://github.com/kuafuwang/LPG-language-server)
+* [Asymptote](https://github.com/vectorgraphics)
+* [chemical](https://github.com/chemicallang/chemical)
## License
MIT
@@ -47,7 +49,18 @@
[It's here](https://github.com/kuafuwang/LspCpp/tree/master/examples)
+## Development guide
+
+For any merges into the master branch, ensure the C++ code complies with the clang-format standard.
+As of currently, the latest clang-format version offered in ubuntu 24.04 (18) is used, but this
+may change in the future as newer versions of clang-format is available for Ubuntu.
+
+To check the current version of clang-format used, see the check-format-cpp workflow. It prints out
+the version used. Ensure the C++ code is compliant with that version of clang-format.
+
+`vcpkg.json` is optionally provided for convenience. It is not required for compiling LspCpp.
+
+
[1]: https://github.com/cquery-project/cquery "cquery:"
[2]: https://www.javacardos.com/tools "JcKit:"
[3]: https://docs.microsoft.com/en-us/nuget/consume-packages/package-restore "Package Restore"
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Cancellation.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Cancellation.h
index 496be29844..1fcd0a0097 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Cancellation.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Cancellation.h
@@ -6,18 +6,17 @@ using CancelMonitor = std::function<int()>;
namespace Cancellation
{
- struct Params {
- /**
+struct Params
+{
+ /**
* The request id to cancel.
*/
- lsRequestId id;
-
- MAKE_SWAP_METHOD(Cancellation::Params, id);
- };
+ lsRequestId id;
+ MAKE_SWAP_METHOD(Cancellation::Params, id);
};
-MAKE_REFLECT_STRUCT(Cancellation::Params, id);
-
-DEFINE_NOTIFICATION_TYPE(Notify_Cancellation, Cancellation::Params,"$/cancelRequest");
+}; // namespace Cancellation
+MAKE_REFLECT_STRUCT(Cancellation::Params, id);
+DEFINE_NOTIFICATION_TYPE(Notify_Cancellation, Cancellation::Params, "$/cancelRequest");
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Condition.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Condition.h
index 6a8cf7a2a6..074f78296c 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Condition.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Condition.h
@@ -1,48 +1,56 @@
#pragma once
#include <condition_variable>
-template <class T>
+template<class T>
class Condition
{
public:
-
- std::mutex m_mutex;
- std::condition_variable m_condition;
- ~Condition() {
- m_condition.notify_all();
+ std::mutex m_mutex;
+ std::condition_variable m_condition;
+ ~Condition()
+ {
+ m_condition.notify_all();
+ }
+ void notify(std::unique_ptr<T> data) noexcept
+ {
+ {
+ std::lock_guard<std::mutex> eventLock(m_mutex);
+ any.swap(data);
}
- void notify(std::unique_ptr<T> data) noexcept
+ // wake up one waiter
+ m_condition.notify_one();
+ };
+
+ std::unique_ptr<T> wait(unsigned timeout = 0)
+ {
+ std::unique_lock<std::mutex> ul(m_mutex);
+ if (!timeout)
{
+ m_condition.wait(
+ ul,
+ [&]()
{
- std::lock_guard<std::mutex> eventLock(m_mutex);
- any.swap(data);
+ if (!any)
+ {
+ return false;
+ }
+ return true;
}
- // wake up one waiter
- m_condition.notify_one();
- };
-
-
- std::unique_ptr<T> wait(unsigned timeout=0)
+ );
+ }
+ else
{
- std::unique_lock<std::mutex> ul(m_mutex);
- if (!timeout) {
- m_condition.wait(ul,[&]() {
- if (!any)
- return false;
- return true;
- });
- }
- else{
- if(!any){
- std::cv_status status = m_condition.wait_for(ul, std::chrono::milliseconds(timeout));
- if (status == std::cv_status::timeout)
- {
- return {};
- }
- }
+ if (!any)
+ {
+ std::cv_status status = m_condition.wait_for(ul, std::chrono::milliseconds(timeout));
+ if (status == std::cv_status::timeout)
+ {
+ return {};
}
- return std::unique_ptr<T>(any.release());
-
+ }
}
+ return std::unique_ptr<T>(any.release());
+ }
+
private:
- std::unique_ptr<T> any;
+ std::unique_ptr<T> any;
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Context.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Context.h
index 20edf71b1c..a562327b06 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Context.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Context.h
@@ -16,8 +16,8 @@
#include <memory>
#include <type_traits>
-namespace lsp {
-
+namespace lsp
+{
/// Values in a Context are indexed by typed keys.
/// Key<T> serves two purposes:
@@ -34,17 +34,18 @@ namespace lsp {
///
/// Keys are typically used across multiple functions, so most of the time you
/// would want to make them static class members or global variables.
-template <class Type> class Key {
+template<class Type>
+class Key
+{
public:
- static_assert(!std::is_reference<Type>::value,
- "Reference arguments to Key<> are not allowed");
+ static_assert(!std::is_reference<Type>::value, "Reference arguments to Key<> are not allowed");
- constexpr Key() = default;
+ constexpr Key() = default;
- Key(Key const &) = delete;
- Key &operator=(Key const &) = delete;
- Key(Key &&) = delete;
- Key &operator=(Key &&) = delete;
+ Key(Key const&) = delete;
+ Key& operator=(Key const&) = delete;
+ Key(Key&&) = delete;
+ Key& operator=(Key&&) = delete;
};
/// A context is an immutable container for per-request data that must be
@@ -63,154 +64,182 @@ public:
/// You can't add data to an existing context, instead you create a new
/// immutable context derived from it with extra data added. When you retrieve
/// data, the context will walk up the parent chain until the key is found.
-class Context {
+class Context
+{
public:
- /// Returns an empty root context that contains no data.
- static Context empty();
- /// Returns the context for the current thread, creating it if needed.
- static const Context &current();
- // Sets the current() context to Replacement, and returns the old context.
- // Prefer to use WithContext or WithContextValue to do this safely.
- static Context swapCurrent(Context Replacement);
+ /// Returns an empty root context that contains no data.
+ static Context empty();
+ /// Returns the context for the current thread, creating it if needed.
+ static Context const& current();
+ // Sets the current() context to Replacement, and returns the old context.
+ // Prefer to use WithContext or WithContextValue to do this safely.
+ static Context swapCurrent(Context Replacement);
private:
- struct Data;
- Context(std::shared_ptr<const Data> DataPtr);
+ struct Data;
+ Context(std::shared_ptr<Data const> DataPtr);
public:
- /// Same as Context::empty(), please use Context::empty() instead.
- Context() = default;
-
- /// Copy operations for this class are deleted, use an explicit clone() method
- /// when you need a copy of the context instead.
- Context(Context const &) = delete;
- Context &operator=(const Context &) = delete;
-
- Context(Context &&) = default;
- Context &operator=(Context &&) = default;
-
- /// Get data stored for a typed \p Key. If values are not found
- /// \returns Pointer to the data associated with \p Key. If no data is
- /// specified for \p Key, return null.
- template <class Type> const Type *get(const Key<Type> &Key) const {
- for (const Data *DataPtr = this->dataPtr.get(); DataPtr != nullptr;
- DataPtr = DataPtr->parent.get()) {
- if (DataPtr->KeyPtr == &Key)
- return static_cast<const Type *>(DataPtr->value->getValuePtr());
+ /// Same as Context::empty(), please use Context::empty() instead.
+ Context() = default;
+
+ /// Copy operations for this class are deleted, use an explicit clone() method
+ /// when you need a copy of the context instead.
+ Context(Context const&) = delete;
+ Context& operator=(Context const&) = delete;
+
+ Context(Context&&) = default;
+ Context& operator=(Context&&) = default;
+
+ /// Get data stored for a typed \p Key. If values are not found
+ /// \returns Pointer to the data associated with \p Key. If no data is
+ /// specified for \p Key, return null.
+ template<class Type>
+ Type const* get(Key<Type> const& Key) const
+ {
+ for (Data const* DataPtr = this->dataPtr.get(); DataPtr != nullptr; DataPtr = DataPtr->parent.get())
+ {
+ if (DataPtr->KeyPtr == &Key)
+ {
+ return static_cast<Type const*>(DataPtr->value->getValuePtr());
+ }
+ }
+ return nullptr;
+ }
+
+ /// A helper to get a reference to a \p Key that must exist in the map.
+ /// Must not be called for keys that are not in the map.
+ template<class Type>
+ Type const& getExisting(Key<Type> const& Key) const
+ {
+ auto Val = get(Key);
+ assert(Val && "Key does not exist");
+ return *Val;
+ }
+
+ /// Derives a child context
+ /// It is safe to move or destroy a parent context after calling derive().
+ /// The child will keep its parent alive, and its data remains accessible.
+ template<class Type>
+ Context derive(Key<Type> const& Key, typename std::decay<Type>::type Value) const&
+ {
+ return Context(std::make_shared<Data>(Data {
+ /*parent=*/dataPtr, &Key,
+ std::make_unique<TypedAnyStorage<typename std::decay<Type>::type>>(std::move(Value))
+ }));
+ }
+
+ template<class Type>
+ Context derive(Key<Type> const& Key, typename std::decay<Type>::type Value) && /* takes ownership */
+ {
+ return Context(std::make_shared<Data>(Data {
+ /*parent=*/std::move(dataPtr), &Key,
+ std::make_unique<TypedAnyStorage<typename std::decay<Type>::type>>(std::move(Value))
+ }));
+ }
+
+ /// Derives a child context, using an anonymous key.
+ /// Intended for objects stored only for their destructor's side-effect.
+ template<class Type>
+ Context derive(Type&& Value) const&
+ {
+ static Key<typename std::decay<Type>::type> Private;
+ return derive(Private, std::forward<Type>(Value));
}
- return nullptr;
- }
-
- /// A helper to get a reference to a \p Key that must exist in the map.
- /// Must not be called for keys that are not in the map.
- template <class Type> const Type &getExisting(const Key<Type> &Key) const {
- auto Val = get(Key);
- assert(Val && "Key does not exist");
- return *Val;
- }
-
- /// Derives a child context
- /// It is safe to move or destroy a parent context after calling derive().
- /// The child will keep its parent alive, and its data remains accessible.
- template <class Type>
- Context derive(const Key<Type> &Key,
- typename std::decay<Type>::type Value) const & {
- return Context(std::make_shared<Data>(
- Data{/*parent=*/dataPtr, &Key,
- std::make_unique<TypedAnyStorage<typename std::decay<Type>::type>>(
- std::move(Value))}));
- }
-
- template <class Type>
- Context
- derive(const Key<Type> &Key,
- typename std::decay<Type>::type Value) && /* takes ownership */ {
- return Context(std::make_shared<Data>(
- Data{/*parent=*/std::move(dataPtr), &Key,
- std::make_unique<TypedAnyStorage<typename std::decay<Type>::type>>(
- std::move(Value))}));
- }
-
- /// Derives a child context, using an anonymous key.
- /// Intended for objects stored only for their destructor's side-effect.
- template <class Type> Context derive(Type &&Value) const & {
- static Key<typename std::decay<Type>::type> Private;
- return derive(Private, std::forward<Type>(Value));
- }
-
- template <class Type> Context derive(Type &&Value) && {
- static Key<typename std::decay<Type>::type> Private;
- return std::move(*this).derive(Private, std::forward<Type>(Value));
- }
-
- /// Clone this context object.
- Context clone() const;
+
+ template<class Type>
+ Context derive(Type&& Value) &&
+ {
+ static Key<typename std::decay<Type>::type> Private;
+ return std::move(*this).derive(Private, std::forward<Type>(Value));
+ }
+
+ /// Clone this context object.
+ Context clone() const;
private:
- class AnyStorage {
- public:
- virtual ~AnyStorage() = default;
- virtual void *getValuePtr() = 0;
- };
-
- template <class T> class TypedAnyStorage : public Context::AnyStorage {
- static_assert(std::is_same<typename std::decay<T>::type, T>::value,
- "Argument to TypedAnyStorage must be decayed");
-
- public:
- TypedAnyStorage(T &&Value) : value(std::move(Value)) {}
-
- void *getValuePtr() override { return &value; }
-
- private:
- T value;
- };
-
- struct Data {
- // We need to make sure parent outlives the value, so the order of members
- // is important. We do that to allow classes stored in Context's child
- // layers to store references to the data in the parent layers.
- std::shared_ptr<const Data> parent;
- const void *KeyPtr;
- std::unique_ptr<AnyStorage> value;
- };
-
- std::shared_ptr<const Data> dataPtr;
+ class AnyStorage
+ {
+ public:
+ virtual ~AnyStorage() = default;
+ virtual void* getValuePtr() = 0;
+ };
+
+ template<class T>
+ class TypedAnyStorage : public Context::AnyStorage
+ {
+ static_assert(
+ std::is_same<typename std::decay<T>::type, T>::value, "Argument to TypedAnyStorage must be decayed"
+ );
+
+ public:
+ TypedAnyStorage(T&& Value) : value(std::move(Value))
+ {
+ }
+
+ void* getValuePtr() override
+ {
+ return &value;
+ }
+
+ private:
+ T value;
+ };
+
+ struct Data
+ {
+ // We need to make sure parent outlives the value, so the order of members
+ // is important. We do that to allow classes stored in Context's child
+ // layers to store references to the data in the parent layers.
+ std::shared_ptr<Data const> parent;
+ void const* KeyPtr;
+ std::unique_ptr<AnyStorage> value;
+ };
+
+ std::shared_ptr<Data const> dataPtr;
};
/// WithContext replaces Context::current() with a provided scope.
/// When the WithContext is destroyed, the original scope is restored.
/// For extending the current context with new value, prefer WithContextValue.
-class WithContext {
+class WithContext
+{
public:
- WithContext(Context C) : restore(Context::swapCurrent(std::move(C))) {}
- ~WithContext() { Context::swapCurrent(std::move(restore)); }
- WithContext(const WithContext &) = delete;
- WithContext &operator=(const WithContext &) = delete;
- WithContext(WithContext &&) = delete;
- WithContext &operator=(WithContext &&) = delete;
+ WithContext(Context C) : restore(Context::swapCurrent(std::move(C)))
+ {
+ }
+ ~WithContext()
+ {
+ Context::swapCurrent(std::move(restore));
+ }
+ WithContext(WithContext const&) = delete;
+ WithContext& operator=(WithContext const&) = delete;
+ WithContext(WithContext&&) = delete;
+ WithContext& operator=(WithContext&&) = delete;
private:
- Context restore;
+ Context restore;
};
/// WithContextValue extends Context::current() with a single value.
/// When the WithContextValue is destroyed, the original scope is restored.
-class WithContextValue {
+class WithContextValue
+{
public:
- template <typename T>
- WithContextValue(const Key<T> &K, typename std::decay<T>::type V)
- : restore(Context::current().derive(K, std::move(V))) {}
+ template<typename T>
+ WithContextValue(Key<T> const& K, typename std::decay<T>::type V)
+ : restore(Context::current().derive(K, std::move(V)))
+ {
+ }
- // Anonymous values can be used for the destructor side-effect.
- template <typename T>
- WithContextValue(T &&V)
- : restore(Context::current().derive(std::forward<T>(V))) {}
+ // Anonymous values can be used for the destructor side-effect.
+ template<typename T>
+ WithContextValue(T&& V) : restore(Context::current().derive(std::forward<T>(V)))
+ {
+ }
private:
- WithContext restore;
+ WithContext restore;
};
-
} // namespace lsp
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Endpoint.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Endpoint.h
index d752711a3a..6b3eadcf55 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Endpoint.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/Endpoint.h
@@ -6,48 +6,47 @@
struct LspMessage;
struct NotificationInMessage;
struct lsBaseOutMessage;
-struct RequestInMessage;
+struct RequestInMessage;
-using GenericResponseHandler = std::function< bool(std::unique_ptr<LspMessage>) >;
-using GenericRequestHandler = std::function< bool(std::unique_ptr<LspMessage>) >;
-using GenericNotificationHandler = std::function< bool(std::unique_ptr<LspMessage>) >;
+using GenericResponseHandler = std::function<bool(std::unique_ptr<LspMessage>)>;
+using GenericRequestHandler = std::function<bool(std::unique_ptr<LspMessage>)>;
+using GenericNotificationHandler = std::function<bool(std::unique_ptr<LspMessage>)>;
class Endpoint
{
public:
- virtual ~Endpoint() = default;
- virtual bool onRequest(std::unique_ptr<LspMessage>) = 0;
- virtual bool notify(std::unique_ptr<LspMessage>) = 0;
+ virtual ~Endpoint() = default;
+ virtual bool onRequest(std::unique_ptr<LspMessage>) = 0;
+ virtual bool notify(std::unique_ptr<LspMessage>) = 0;
- virtual bool onResponse(const std::string&, std::unique_ptr<LspMessage>) = 0;
- virtual void registerRequestHandler(const std::string&, GenericResponseHandler ) = 0;
- virtual void registerNotifyHandler(const std::string&, GenericNotificationHandler ) = 0;
+ virtual bool onResponse(std::string const&, std::unique_ptr<LspMessage>) = 0;
+ virtual void registerRequestHandler(std::string const&, GenericResponseHandler) = 0;
+ virtual void registerNotifyHandler(std::string const&, GenericNotificationHandler) = 0;
};
-class GenericEndpoint :public Endpoint
+class GenericEndpoint : public Endpoint
{
public:
- GenericEndpoint(lsp::Log& l):log(l){}
- bool notify(std::unique_ptr<LspMessage>) override;
- bool onResponse(const std::string&, std::unique_ptr<LspMessage>) override;
-
- bool onRequest(std::unique_ptr<LspMessage>) override;
- std::map< std::string, GenericRequestHandler > method2request;
- std::map< std::string, GenericResponseHandler > method2response;
- std::map< std::string, GenericNotificationHandler > method2notification;
-
- void registerRequestHandler(const std::string& method, GenericResponseHandler cb) override
- {
- method2request[method] = cb;
- }
-
- void registerNotifyHandler(const std::string& method, GenericNotificationHandler cb) override
- {
- method2notification[method] = cb;
- }
- lsp::Log& log;
-
-
-
+ GenericEndpoint(lsp::Log& l) : log(l)
+ {
+ }
+ bool notify(std::unique_ptr<LspMessage>) override;
+ bool onResponse(std::string const&, std::unique_ptr<LspMessage>) override;
+
+ bool onRequest(std::unique_ptr<LspMessage>) override;
+ std::map<std::string, GenericRequestHandler> method2request;
+ std::map<std::string, GenericResponseHandler> method2response;
+ std::map<std::string, GenericNotificationHandler> method2notification;
+
+ void registerRequestHandler(std::string const& method, GenericResponseHandler cb) override
+ {
+ method2request[method] = cb;
+ }
+
+ void registerNotifyHandler(std::string const& method, GenericNotificationHandler cb) override
+ {
+ method2notification[method] = cb;
+ }
+ lsp::Log& log;
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/GCThreadContext.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/GCThreadContext.h
index 6c9f9c1cbb..a7cf469592 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/GCThreadContext.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/GCThreadContext.h
@@ -15,5 +15,4 @@ private:
#if defined(LSPCPP_USEGC)
GC_stack_base gsb;
#endif
-
-}; \ No newline at end of file
+};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageIssue.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageIssue.h
index 6c29ee8f0e..8bf5c0a0f3 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageIssue.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageIssue.h
@@ -4,20 +4,20 @@
#include <vector>
namespace lsp
{
- class Log
- {
- public:
- virtual ~Log() = default;
-
- enum class Level
- {
- /**
+class Log
+{
+public:
+ virtual ~Log() = default;
+
+ enum class Level
+ {
+ /**
* OFF is a special level that can be used to turn off logging.
*/
- OFF = 1,
+ OFF = 0,
- /**
+ /**
* SEVERE is a message level indicating a serious failure.
* <p>
* In general SEVERE messages should describe events that are
@@ -26,9 +26,9 @@ namespace lsp
* to end users and to system administrators.
*/
- SEVERE = 2,
+ SEVERE = 1,
- /**
+ /**
* WARNING is a message level indicating a potential problem.
* <p>
* In general WARNING messages should describe events that will
@@ -37,8 +37,8 @@ namespace lsp
*
*/
- WARNING = 3,
- /**
+ WARNING = 2,
+ /**
* INFO is a message level for informational messages.
* <p>
* Typically INFO messages will be written to the console
@@ -47,8 +47,8 @@ namespace lsp
* make sense to end users and system administrators.
*/
- INFO = 3,
- /**
+ INFO = 3,
+ /**
* CONFIG is a message level for static configuration messages.
* <p>
* CONFIG messages are intended to provide a variety of static
@@ -59,11 +59,9 @@ namespace lsp
* This level is initialized to <CODE>4</CODE>.
*/
- CONFIG = 4,
+ CONFIG = 4,
-
-
- /**
+ /**
* FINE is a message level providing tracing information.
* <p>
* All of FINE, FINER, and FINEST are intended for relatively
@@ -82,101 +80,98 @@ namespace lsp
* are also worth logging as FINE.
* This level is initialized to <CODE>5</CODE>.
*/
- FINE = 5,
+ FINE = 5,
- /**
+ /**
* FINER indicates a fairly detailed tracing message.
* By default logging calls for entering, returning, or throwing
* an exception are traced at this level.
* This level is initialized to <CODE>400</CODE>.
*/
- FINER = 6,
+ FINER = 6,
- /**
+ /**
* FINEST indicates a highly detailed tracing message.
* This level is initialized to <CODE>300</CODE>.
*/
- FINEST = 7,
+ FINEST = 7,
- /**
+ /**
* ALL indicates that all messages should be logged.
* This level is initialized to <CODE>Integer.MIN_VALUE</CODE>.
*/
- ALL,
- };
- virtual void log(Level level, std::wstring&& msg) = 0;
- virtual void log(Level level, const std::wstring& msg) = 0;
- virtual void log(Level level, std::string&& msg) = 0;
- virtual void log(Level level, const std::string& msg) = 0;
-
- void info(const std::string& msg)
- {
- log(Level::INFO, msg);
- }
- void info(const std::wstring& msg)
- {
- log(Level::INFO, msg);
- }
- void error(const std::string& msg)
- {
- log(Level::SEVERE, msg);
- }
- void error(const std::wstring& msg)
- {
- log(Level::SEVERE, msg);
- }
- void warning(const std::string& msg)
- {
- log(Level::WARNING, msg);
- }
- void warning(const std::wstring& msg)
- {
- log(Level::WARNING, msg);
- }
- };
-}
-
-class MessageIssue {
-
-public:
- std::string text;
-
- lsp::Log::Level code;
-
- MessageIssue(const std::string& text, lsp::Log::Level code) :text(text), code(code)
- {
-
-
- }
- MessageIssue(std::string&& text, lsp::Log::Level code) :text(text), code(code)
- {
-
-
- }
-
-
- std::string getText() {
- return text;
- }
-
- lsp::Log::Level getIssueCode() {
- return code;
- }
-
+ ALL,
+ };
+ virtual void log(Level level, std::wstring&& msg) = 0;
+ virtual void log(Level level, std::wstring const& msg) = 0;
+ virtual void log(Level level, std::string&& msg) = 0;
+ virtual void log(Level level, std::string const& msg) = 0;
+
+ void info(std::string const& msg)
+ {
+ log(Level::INFO, msg);
+ }
+ void info(std::wstring const& msg)
+ {
+ log(Level::INFO, msg);
+ }
+ void error(std::string const& msg)
+ {
+ log(Level::SEVERE, msg);
+ }
+ void error(std::wstring const& msg)
+ {
+ log(Level::SEVERE, msg);
+ }
+ void warning(std::string const& msg)
+ {
+ log(Level::WARNING, msg);
+ }
+ void warning(std::wstring const& msg)
+ {
+ log(Level::WARNING, msg);
+ }
+};
+} // namespace lsp
- std::string toString() {
- return getText();
- }
+class MessageIssue
+{
+public:
+ std::string text;
+
+ lsp::Log::Level code;
+
+ MessageIssue(std::string const& text, lsp::Log::Level code) : text(text), code(code)
+ {
+ }
+ MessageIssue(std::string&& text, lsp::Log::Level code) : text(text), code(code)
+ {
+ }
+
+ std::string getText()
+ {
+ return text;
+ }
+
+ lsp::Log::Level getIssueCode()
+ {
+ return code;
+ }
+
+ std::string toString()
+ {
+ return getText();
+ }
};
-class MessageIssueHandler
+class MessageIssueHandler
{
public:
- /**
+ /**
* Handle issues found while parsing or validating a message. The list of issues must not be empty.
*/
- virtual ~MessageIssueHandler() = default;
+ virtual ~MessageIssueHandler() = default;
- virtual void handle(std::vector<MessageIssue>&&) = 0;
- virtual void handle( MessageIssue&&) = 0;
+ virtual void handle(std::vector<MessageIssue>&&) = 0;
+ virtual void handle(MessageIssue&&) = 0;
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageJsonHandler.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageJsonHandler.h
index f019fbf121..2c039a4313 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageJsonHandler.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageJsonHandler.h
@@ -5,57 +5,52 @@
#include <LibLsp/JsonRpc/message.h>
class Reader;
-
-using GenericRequestJsonHandler = std::function< std::unique_ptr<LspMessage>(Reader&) >;
-using GenericResponseJsonHandler = std::function< std::unique_ptr<LspMessage>(Reader&) >;
-using GenericNotificationJsonHandler = std::function< std::unique_ptr<LspMessage>(Reader&) >;
+using GenericRequestJsonHandler = std::function<std::unique_ptr<LspMessage>(Reader&)>;
+using GenericResponseJsonHandler = std::function<std::unique_ptr<LspMessage>(Reader&)>;
+using GenericNotificationJsonHandler = std::function<std::unique_ptr<LspMessage>(Reader&)>;
class MessageJsonHandler
{
public:
- std::map< std::string, GenericRequestJsonHandler > method2request;
- std::map< std::string, GenericResponseJsonHandler > method2response;
- std::map< std::string, GenericNotificationJsonHandler > method2notification;
-
-
- const GenericRequestJsonHandler* GetRequestJsonHandler(const char* methodInfo) const
- {
- const auto findIt = method2request.find(methodInfo);
- return findIt == method2request.end() ? nullptr : &findIt->second;
- }
-
- void SetRequestJsonHandler(const std::string& methodInfo, GenericRequestJsonHandler handler)
- {
- method2request[methodInfo] = handler;
- }
-
- const GenericResponseJsonHandler* GetResponseJsonHandler(const char* methodInfo) const
- {
- const auto findIt = method2response.find(methodInfo);
- return findIt == method2response.end() ? nullptr : &findIt->second;
- }
-
- void SetResponseJsonHandler(const std::string& methodInfo,GenericResponseJsonHandler handler)
- {
- method2response[methodInfo] = handler;
- }
-
- const GenericNotificationJsonHandler* GetNotificationJsonHandler(const char* methodInfo) const
- {
- const auto findIt = method2notification.find(methodInfo);
- return findIt == method2notification.end() ? nullptr : &findIt->second;
- }
-
- void SetNotificationJsonHandler(const std::string& methodInfo, GenericNotificationJsonHandler handler)
- {
- method2notification[methodInfo] = handler;
- }
-
-
-
- std::unique_ptr<LspMessage> parseResponseMessage(const std::string&, Reader&);
- std::unique_ptr<LspMessage> parseRequstMessage(const std::string&, Reader&);
- bool resovleResponseMessage(Reader&, std::pair<std::string, std::unique_ptr<LspMessage>>& result);
- std::unique_ptr<LspMessage> parseNotificationMessage(const std::string&, Reader&);
+ std::map<std::string, GenericRequestJsonHandler> method2request;
+ std::map<std::string, GenericResponseJsonHandler> method2response;
+ std::map<std::string, GenericNotificationJsonHandler> method2notification;
+
+ GenericRequestJsonHandler const* GetRequestJsonHandler(char const* methodInfo) const
+ {
+ auto const findIt = method2request.find(methodInfo);
+ return findIt == method2request.end() ? nullptr : &findIt->second;
+ }
+
+ void SetRequestJsonHandler(std::string const& methodInfo, GenericRequestJsonHandler handler)
+ {
+ method2request[methodInfo] = handler;
+ }
+
+ GenericResponseJsonHandler const* GetResponseJsonHandler(char const* methodInfo) const
+ {
+ auto const findIt = method2response.find(methodInfo);
+ return findIt == method2response.end() ? nullptr : &findIt->second;
+ }
+
+ void SetResponseJsonHandler(std::string const& methodInfo, GenericResponseJsonHandler handler)
+ {
+ method2response[methodInfo] = handler;
+ }
+
+ GenericNotificationJsonHandler const* GetNotificationJsonHandler(char const* methodInfo) const
+ {
+ auto const findIt = method2notification.find(methodInfo);
+ return findIt == method2notification.end() ? nullptr : &findIt->second;
+ }
+
+ void SetNotificationJsonHandler(std::string const& methodInfo, GenericNotificationJsonHandler handler)
+ {
+ method2notification[methodInfo] = handler;
+ }
+
+ std::unique_ptr<LspMessage> parseResponseMessage(std::string const&, Reader&);
+ std::unique_ptr<LspMessage> parseRequstMessage(std::string const&, Reader&);
+ bool resovleResponseMessage(Reader&, std::pair<std::string, std::unique_ptr<LspMessage>>& result);
+ std::unique_ptr<LspMessage> parseNotificationMessage(std::string const&, Reader&);
};
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageProducer.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageProducer.h
index 4f3799555a..211761abba 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageProducer.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/MessageProducer.h
@@ -2,19 +2,21 @@
#include <string>
#include <functional>
-namespace lsp {
- /// The encoding style of the JSON-RPC messages (both input and output).
- enum JSONStreamStyle {
- /// Encoding per the LSP specification, with mandatory Content-Length header.
- Standard,
- /// Messages are delimited by a '// -----' line. Comment lines start with //.
- Delimited
- };
-}
+namespace lsp
+{
+/// The encoding style of the JSON-RPC messages (both input and output).
+enum JSONStreamStyle
+{
+ /// Encoding per the LSP specification, with mandatory Content-Length header.
+ Standard,
+ /// Messages are delimited by a '// -----' line. Comment lines start with //.
+ Delimited
+};
+} // namespace lsp
class MessageProducer
{
public:
- typedef std::function< void(std::string&&) > MessageConsumer;
- virtual ~MessageProducer() = default;
- virtual void listen(MessageConsumer) = 0;
+ typedef std::function<void(std::string&&)> MessageConsumer;
+ virtual ~MessageProducer() = default;
+ virtual void listen(MessageConsumer) = 0;
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/NotificationInMessage.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/NotificationInMessage.h
index cdee9e572e..4b1a017c24 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/NotificationInMessage.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/NotificationInMessage.h
@@ -1,62 +1,66 @@
#pragma once
-
#include "lsRequestId.h"
#include "LibLsp/JsonRpc/message.h"
-
-
// NotificationInMessage does not have |id|.
-struct NotificationInMessage : public LspMessage {
-
- Kind GetKid() override
- {
- return NOTIFICATION_MESSAGE;
- }
- MethodType GetMethodType() const override
- {
- return method.c_str();
- }
- void SetMethodType(MethodType _t) override
- {
- method = _t;
- }
- std::string method;
+struct NotificationInMessage : public LspMessage
+{
+
+ Kind GetKid() override
+ {
+ return NOTIFICATION_MESSAGE;
+ }
+ MethodType GetMethodType() const override
+ {
+ return method.c_str();
+ }
+ void SetMethodType(MethodType _t) override
+ {
+ method = _t;
+ }
+ std::string method;
};
-template <class T, class TDerived >
-struct lsNotificationInMessage : NotificationInMessage {
-
- void ReflectWriter(Writer& writer) override {
- Reflect(writer, static_cast<TDerived&>(*this));
- }
- lsNotificationInMessage(MethodType _method)
- {
- method = _method;
- }
-
- static std::unique_ptr<LspMessage> ReflectReader(Reader& visitor) {
-
- TDerived* temp = new TDerived();
-
- std::unique_ptr<TDerived> message = std::unique_ptr<TDerived>(temp);
- // Reflect may throw and *message will be partially deserialized.
- Reflect(visitor, static_cast<TDerived&>(*temp));
- return message;
-
- }
- void swap(lsNotificationInMessage& arg) noexcept
- {
- method.swap(method);
- std::swap(params, arg.params);
- }
- T params;
+template<class T, class TDerived>
+struct lsNotificationInMessage : NotificationInMessage
+{
+
+ void ReflectWriter(Writer& writer) override
+ {
+ Reflect(writer, static_cast<TDerived&>(*this));
+ }
+ lsNotificationInMessage(MethodType _method)
+ {
+ method = _method;
+ }
+
+ static std::unique_ptr<LspMessage> ReflectReader(Reader& visitor)
+ {
+
+ TDerived* temp = new TDerived();
+
+ std::unique_ptr<TDerived> message = std::unique_ptr<TDerived>(temp);
+ // Reflect may throw and *message will be partially deserialized.
+ Reflect(visitor, static_cast<TDerived&>(*temp));
+ return message;
+ }
+ void swap(lsNotificationInMessage& arg) noexcept
+ {
+ method.swap(method);
+ std::swap(params, arg.params);
+ }
+ T params;
};
-#define DEFINE_NOTIFICATION_TYPE(MSG,paramType,methodInfo)\
-namespace MSG {\
- struct notify : public lsNotificationInMessage< paramType , notify >{\
- static constexpr MethodType kMethodInfo = methodInfo;\
- notify():lsNotificationInMessage(kMethodInfo){} \
- };\
-};\
-MAKE_REFLECT_STRUCT(MSG::notify, jsonrpc,method, params)
+#define DEFINE_NOTIFICATION_TYPE(MSG, paramType, methodInfo) \
+ namespace MSG \
+ { \
+ struct notify : public lsNotificationInMessage<paramType, notify> \
+ { \
+ static constexpr MethodType kMethodInfo = methodInfo; \
+ notify() : lsNotificationInMessage(kMethodInfo) \
+ { \
+ } \
+ }; \
+ }; \
+ MAKE_REFLECT_STRUCT(MSG::notify, jsonrpc, method, params)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/RemoteEndPoint.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/RemoteEndPoint.h
index 8d013bd889..3e57fa0bb5 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/RemoteEndPoint.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/RemoteEndPoint.h
@@ -15,274 +15,307 @@
#include "future.h"
#include "MessageProducer.h"
-
class MessageJsonHandler;
-class Endpoint;
+class Endpoint;
struct LspMessage;
class RemoteEndPoint;
-namespace lsp {
- class ostream;
- class istream;
-
- ////////////////////////////////////////////////////////////////////////////////
- // ResponseOrError<T>
- ////////////////////////////////////////////////////////////////////////////////
-
- // ResponseOrError holds either the response to a request or an error
- // message.
- template <typename T>
- struct ResponseOrError {
- using Request = T;
- ResponseOrError();
- ResponseOrError(const T& response);
- ResponseOrError(T&& response);
- ResponseOrError(const Rsp_Error& error);
- ResponseOrError(Rsp_Error&& error);
- ResponseOrError(const ResponseOrError& other);
- ResponseOrError(ResponseOrError&& other) noexcept;
-
- ResponseOrError& operator=(const ResponseOrError& other);
- ResponseOrError& operator=(ResponseOrError&& other) noexcept;
- bool IsError() const { return is_error; }
- std::string ToJson()
- {
- if (is_error) return error.ToJson();
- return response.ToJson();
- }
- T response;
- Rsp_Error error; // empty represents success.
- bool is_error;
- };
+namespace lsp
+{
+class ostream;
+class istream;
- template <typename T>
- ResponseOrError<T>::ResponseOrError(): is_error(false)
- {
- }
+////////////////////////////////////////////////////////////////////////////////
+// ResponseOrError<T>
+////////////////////////////////////////////////////////////////////////////////
- template <typename T>
- ResponseOrError<T>::ResponseOrError(const T& resp) : response(resp), is_error(false) {}
- template <typename T>
- ResponseOrError<T>::ResponseOrError(T&& resp) : response(std::move(resp)), is_error(false) {}
- template <typename T>
- ResponseOrError<T>::ResponseOrError(const Rsp_Error& err) : error(err), is_error(true) {}
- template <typename T>
- ResponseOrError<T>::ResponseOrError(Rsp_Error&& err) : error(std::move(err)), is_error(true) {}
- template <typename T>
- ResponseOrError<T>::ResponseOrError(const ResponseOrError& other)
- : response(other.response), error(other.error), is_error(other.is_error) {}
- template <typename T>
- ResponseOrError<T>::ResponseOrError(ResponseOrError&& other) noexcept
- : response(std::move(other.response)), error(std::move(other.error)), is_error(other.is_error) {}
- template <typename T>
- ResponseOrError<T>& ResponseOrError<T>::operator=(
- const ResponseOrError& other) {
- response = other.response;
- error = other.error;
- is_error = other.is_error;
- return *this;
- }
- template <typename T>
- ResponseOrError<T>& ResponseOrError<T>::operator=(ResponseOrError&& other) noexcept
+// ResponseOrError holds either the response to a request or an error
+// message.
+template<typename T>
+struct ResponseOrError
+{
+ using Request = T;
+ ResponseOrError();
+ ResponseOrError(T const& response);
+ ResponseOrError(T&& response);
+ ResponseOrError(Rsp_Error const& error);
+ ResponseOrError(Rsp_Error&& error);
+ ResponseOrError(ResponseOrError const& other);
+ ResponseOrError(ResponseOrError&& other) noexcept;
+
+ ResponseOrError& operator=(ResponseOrError const& other);
+ ResponseOrError& operator=(ResponseOrError&& other) noexcept;
+ bool IsError() const
+ {
+ return is_error;
+ }
+ std::string ToJson()
+ {
+ if (is_error)
{
- response = std::move(other.response);
- error = std::move(other.error);
- is_error = other.is_error;
- return *this;
+ return error.ToJson();
}
+ return response.ToJson();
+ }
+ T response;
+ Rsp_Error error; // empty represents success.
+ bool is_error;
+};
+template<typename T>
+ResponseOrError<T>::ResponseOrError() : is_error(false)
+{
}
-
-class RemoteEndPoint :MessageIssueHandler
+template<typename T>
+ResponseOrError<T>::ResponseOrError(T const& resp) : response(resp), is_error(false)
{
+}
+template<typename T>
+ResponseOrError<T>::ResponseOrError(T&& resp) : response(std::move(resp)), is_error(false)
+{
+}
+template<typename T>
+ResponseOrError<T>::ResponseOrError(Rsp_Error const& err) : error(err), is_error(true)
+{
+}
+template<typename T>
+ResponseOrError<T>::ResponseOrError(Rsp_Error&& err) : error(std::move(err)), is_error(true)
+{
+}
+template<typename T>
+ResponseOrError<T>::ResponseOrError(ResponseOrError const& other)
+ : response(other.response), error(other.error), is_error(other.is_error)
+{
+}
+template<typename T>
+ResponseOrError<T>::ResponseOrError(ResponseOrError&& other) noexcept
+ : response(std::move(other.response)), error(std::move(other.error)), is_error(other.is_error)
+{
+}
+template<typename T>
+ResponseOrError<T>& ResponseOrError<T>::operator=(ResponseOrError const& other)
+{
+ response = other.response;
+ error = other.error;
+ is_error = other.is_error;
+ return *this;
+}
+template<typename T>
+ResponseOrError<T>& ResponseOrError<T>::operator=(ResponseOrError&& other) noexcept
+{
+ response = std::move(other.response);
+ error = std::move(other.error);
+ is_error = other.is_error;
+ return *this;
+}
- template <typename F, int N>
- using ParamType = lsp::traits::ParameterType<F, N>;
-
- template <typename T>
- using IsRequest = lsp::traits::EnableIfIsType<RequestInMessage, T>;
-
- template <typename T>
- using IsResponse = lsp::traits::EnableIfIsType<ResponseInMessage, T>;
-
- template <typename T>
- using IsNotify = lsp::traits::EnableIfIsType<NotificationInMessage, T>;
+} // namespace lsp
+class RemoteEndPoint : MessageIssueHandler
+{
- template <typename F, typename ReturnType>
- using IsRequestHandler = lsp::traits::EnableIf<lsp::traits::CompatibleWith<
- F,
- std::function<ReturnType(const RequestInMessage&)>>::
- value>;
+ template<typename F, int N>
+ using ParamType = lsp::traits::ParameterType<F, N>;
- template <typename F, typename ReturnType>
- using IsRequestHandlerWithMonitor = lsp::traits::EnableIf<lsp::traits::CompatibleWith<
- F,
- std::function<ReturnType(const RequestInMessage&,const CancelMonitor&)>>::
- value>;
+ template<typename T>
+ using IsRequest = lsp::traits::EnableIfIsType<RequestInMessage, T>;
-public:
+ template<typename T>
+ using IsResponse = lsp::traits::EnableIfIsType<ResponseInMessage, T>;
+ template<typename T>
+ using IsNotify = lsp::traits::EnableIfIsType<NotificationInMessage, T>;
- RemoteEndPoint(const std::shared_ptr <MessageJsonHandler>& json_handler,
- const std::shared_ptr < Endpoint >& localEndPoint,
- lsp::Log& _log,
- lsp::JSONStreamStyle style = lsp::JSONStreamStyle::Standard,
- uint8_t max_workers = 2);
+ template<typename F, typename ReturnType>
+ using IsRequestHandler = lsp::traits::EnableIf<
+ lsp::traits::CompatibleWith<F, std::function<ReturnType(RequestInMessage const&)>>::value>;
- ~RemoteEndPoint() override;
- template <typename F, typename RequestType = ParamType<F, 0>, typename ResponseType = typename RequestType::Response>
- IsRequestHandler< F, lsp::ResponseOrError<ResponseType> > registerHandler(F&& handler)
- {
- processRequestJsonHandler(handler);
- local_endpoint->registerRequestHandler(RequestType::kMethodInfo, [=](std::unique_ptr<LspMessage> msg) {
- auto req = reinterpret_cast<const RequestType*>(msg.get());
- lsp::ResponseOrError<ResponseType> res(handler(*req));
- if (res.is_error) {
- res.error.id = req->id;
- send(res.error);
- }
- else
- {
- res.response.id = req->id;
- send(res.response);
- }
- return true;
- });
- }
- template <typename F, typename RequestType = ParamType<F, 0>, typename ResponseType = typename RequestType::Response>
- IsRequestHandlerWithMonitor< F, lsp::ResponseOrError<ResponseType> > registerHandler(F&& handler) {
- processRequestJsonHandler(handler);
- local_endpoint->registerRequestHandler(RequestType::kMethodInfo, [=](std::unique_ptr<LspMessage> msg) {
- auto req = static_cast<const RequestType*>(msg.get());
- lsp::ResponseOrError<ResponseType> res(handler(*req , getCancelMonitor(req->id)));
- if (res.is_error) {
- res.error.id = req->id;
- send(res.error);
- }
- else
- {
- res.response.id = req->id;
- send(res.response);
- }
- return true;
- });
- }
- using RequestErrorCallback = std::function<void(const Rsp_Error&)>;
+ template<typename F, typename ReturnType>
+ using IsRequestHandlerWithMonitor = lsp::traits::EnableIf<lsp::traits::CompatibleWith<
+ F, std::function<ReturnType(RequestInMessage const&, CancelMonitor const&)>>::value>;
- template <typename T, typename F, typename ResponseType = ParamType<F, 0> >
- void send(T& request, F&& handler, RequestErrorCallback onError)
- {
- processRequestJsonHandler(handler);
- auto cb = [=](std::unique_ptr<LspMessage> msg) {
- if (!msg)
- return true;
- const auto result = msg.get();
-
- if (static_cast<ResponseInMessage*>(result)->IsErrorType()) {
- const auto rsp_error = static_cast<const Rsp_Error*>(result);
- onError(*rsp_error);
- }
- else {
- handler(*static_cast<ResponseType*>(result));
- }
-
- return true;
- };
- internalSendRequest(request, cb);
- }
-
-
- template <typename F, typename NotifyType = ParamType<F, 0> >
- IsNotify<NotifyType> registerHandler(F&& handler) {
+public:
+ RemoteEndPoint(
+ std::shared_ptr<MessageJsonHandler> const& json_handler, std::shared_ptr<Endpoint> const& localEndPoint,
+ lsp::Log& _log, lsp::JSONStreamStyle style = lsp::JSONStreamStyle::Standard, uint8_t max_workers = 2
+ );
+
+ ~RemoteEndPoint() override;
+ template<typename F, typename RequestType = ParamType<F, 0>, typename ResponseType = typename RequestType::Response>
+ IsRequestHandler<F, lsp::ResponseOrError<ResponseType>> registerHandler(F&& handler)
+ {
+ processRequestJsonHandler(handler);
+ local_endpoint->registerRequestHandler(
+ RequestType::kMethodInfo,
+ [=](std::unique_ptr<LspMessage> msg)
+ {
+ auto req = reinterpret_cast<RequestType const*>(msg.get());
+ lsp::ResponseOrError<ResponseType> res(handler(*req));
+ if (res.is_error)
{
- std::lock_guard<std::mutex> lock(m_sendMutex);
- if (!jsonHandler->GetNotificationJsonHandler(NotifyType::kMethodInfo))
- {
- jsonHandler->SetNotificationJsonHandler(NotifyType::kMethodInfo,
- [](Reader& visitor)
- {
- return NotifyType::ReflectReader(visitor);
- });
- }
+ res.error.id = req->id;
+ send(res.error);
}
- local_endpoint->registerNotifyHandler(NotifyType::kMethodInfo, [=](std::unique_ptr<LspMessage> msg) {
- handler(*static_cast<NotifyType*>(msg.get()));
- return true;
- });
- }
-
- template <typename T, typename = IsRequest<T>>
- lsp::future< lsp::ResponseOrError<typename T::Response> > send(T& request) {
-
- processResponseJsonHandler(request);
- using Response = typename T::Response;
- auto promise = std::make_shared< lsp::promise<lsp::ResponseOrError<Response>>>();
- auto cb = [=](std::unique_ptr<LspMessage> msg) {
- if (!msg)
- return true;
- auto result = msg.get();
-
- if (reinterpret_cast<ResponseInMessage*>(result)->IsErrorType())
- {
- Rsp_Error* rsp_error = static_cast<Rsp_Error*>(result);
- Rsp_Error temp;
- std::swap(temp, *rsp_error);
- promise->set_value(std::move(lsp::ResponseOrError<Response>(std::move(temp))));
- }
- else
- {
- Response temp;
- std::swap(temp, *static_cast<Response*>(result));
- promise->set_value(std::move(lsp::ResponseOrError<Response>(std::move(temp))));
- }
- return true;
- };
- internalSendRequest(request, cb);
- return promise->get_future();
- }
-
- template <typename T, typename = IsRequest<T>>
- std::unique_ptr<lsp::ResponseOrError<typename T::Response>> waitResponse(T& request, const unsigned time_out = 0)
- {
- auto future_rsp = send(request);
- if (time_out == 0)
+ else
{
- future_rsp.wait();
+ res.response.id = req->id;
+ send(res.response);
+ }
+ return true;
+ }
+ );
+ }
+ template<typename F, typename RequestType = ParamType<F, 0>, typename ResponseType = typename RequestType::Response>
+ IsRequestHandlerWithMonitor<F, lsp::ResponseOrError<ResponseType>> registerHandler(F&& handler)
+ {
+ processRequestJsonHandler(handler);
+ local_endpoint->registerRequestHandler(
+ RequestType::kMethodInfo,
+ [=](std::unique_ptr<LspMessage> msg)
+ {
+ auto req = static_cast<RequestType const*>(msg.get());
+ lsp::ResponseOrError<ResponseType> res(handler(*req, getCancelMonitor(req->id)));
+ if (res.is_error)
+ {
+ res.error.id = req->id;
+ send(res.error);
}
else
{
- auto state = future_rsp.wait_for(std::chrono::milliseconds(time_out));
- if (lsp::future_status::timeout == state)
- {
- return {};
- }
+ res.response.id = req->id;
+ send(res.response);
}
+ return true;
+ }
+ );
+ }
+ using RequestErrorCallback = std::function<void(Rsp_Error const&)>;
- using Response = typename T::Response;
- return std::make_unique<lsp::ResponseOrError<Response>>(std::move(future_rsp.get()));
- }
+ template<typename T, typename F, typename ResponseType = ParamType<F, 0>>
+ void send(T& request, F&& handler, RequestErrorCallback onError)
+ {
+ processRequestJsonHandler(handler);
+ auto cb = [=](std::unique_ptr<LspMessage> msg)
+ {
+ if (!msg)
+ {
+ return true;
+ }
+ auto const result = msg.get();
+
+ if (static_cast<ResponseInMessage*>(result)->IsErrorType())
+ {
+ auto const rsp_error = static_cast<Rsp_Error const*>(result);
+ onError(*rsp_error);
+ }
+ else
+ {
+ handler(*static_cast<ResponseType*>(result));
+ }
+
+ return true;
+ };
+ internalSendRequest(request, cb);
+ }
- void send(NotificationInMessage& msg)
+ template<typename F, typename NotifyType = ParamType<F, 0>>
+ IsNotify<NotifyType> registerHandler(F&& handler)
+ {
{
- sendMsg(msg);
+ std::lock_guard<std::mutex> lock(m_sendMutex);
+ if (!jsonHandler->GetNotificationJsonHandler(NotifyType::kMethodInfo))
+ {
+ jsonHandler->SetNotificationJsonHandler(
+ NotifyType::kMethodInfo, [](Reader& visitor) { return NotifyType::ReflectReader(visitor); }
+ );
+ }
}
+ local_endpoint->registerNotifyHandler(
+ NotifyType::kMethodInfo,
+ [=](std::unique_ptr<LspMessage> msg)
+ {
+ handler(*static_cast<NotifyType*>(msg.get()));
+ return true;
+ }
+ );
+ }
+
+ template<typename T, typename = IsRequest<T>>
+ lsp::future<lsp::ResponseOrError<typename T::Response>> send(T& request)
+ {
- void send(ResponseInMessage& msg)
+ processResponseJsonHandler(request);
+ using Response = typename T::Response;
+ auto promise = std::make_shared<lsp::promise<lsp::ResponseOrError<Response>>>();
+ auto cb = [=](std::unique_ptr<LspMessage> msg)
{
- sendMsg(msg);
- }
+ if (!msg)
+ {
+ return true;
+ }
+ auto result = msg.get();
+
+ if (reinterpret_cast<ResponseInMessage*>(result)->IsErrorType())
+ {
+ Rsp_Error* rsp_error = static_cast<Rsp_Error*>(result);
+ Rsp_Error temp;
+ std::swap(temp, *rsp_error);
+ promise->set_value(std::move(lsp::ResponseOrError<Response>(std::move(temp))));
+ }
+ else
+ {
+ Response temp;
+ std::swap(temp, *static_cast<Response*>(result));
+ promise->set_value(std::move(lsp::ResponseOrError<Response>(std::move(temp))));
+ }
+ return true;
+ };
+ internalSendRequest(request, cb);
+ return promise->get_future();
+ }
- void sendNotification(NotificationInMessage& msg)
+ template<typename T, typename = IsRequest<T>>
+ std::unique_ptr<lsp::ResponseOrError<typename T::Response>> waitResponse(T& request, unsigned const time_out = 0)
+ {
+ auto future_rsp = send(request);
+ if (time_out == 0)
{
- send(msg);
+ future_rsp.wait();
}
- void sendResponse(ResponseInMessage& msg)
+ else
{
- send(msg);
+ auto state = future_rsp.wait_for(std::chrono::milliseconds(time_out));
+ if (lsp::future_status::timeout == state)
+ {
+ return {};
+ }
}
- template <typename T>
- T createRequest() {
+
+ using Response = typename T::Response;
+ return std::make_unique<lsp::ResponseOrError<Response>>(std::move(future_rsp.get()));
+ }
+
+ void send(NotificationInMessage& msg)
+ {
+ sendMsg(msg);
+ }
+
+ void send(ResponseInMessage& msg)
+ {
+ sendMsg(msg);
+ }
+
+ void sendNotification(NotificationInMessage& msg)
+ {
+ send(msg);
+ }
+ void sendResponse(ResponseInMessage& msg)
+ {
+ send(msg);
+ }
+ template<typename T>
+ T createRequest()
+ {
auto req = T();
req.id.set(getNextRequestId());
return req;
@@ -290,61 +323,66 @@ public:
int getNextRequestId();
- bool cancelRequest(const lsRequestId&);
+ bool cancelRequest(lsRequestId const&);
+
+ void startProcessingMessages(std::shared_ptr<lsp::istream> r, std::shared_ptr<lsp::ostream> w);
- void startProcessingMessages(std::shared_ptr<lsp::istream> r,
- std::shared_ptr<lsp::ostream> w);
+ bool isWorking() const;
+ void stop();
- bool isWorking() const;
- void stop();
+ std::unique_ptr<LspMessage> internalWaitResponse(RequestInMessage&, unsigned time_out = 0);
- std::unique_ptr<LspMessage> internalWaitResponse(RequestInMessage&, unsigned time_out = 0);
+ bool internalSendRequest(RequestInMessage& info, GenericResponseHandler handler);
- bool internalSendRequest(RequestInMessage &info, GenericResponseHandler handler);
+ void handle(std::vector<MessageIssue>&&) override;
+ void handle(MessageIssue&&) override;
- void handle(std::vector<MessageIssue>&&) override;
- void handle(MessageIssue&&) override;
private:
- CancelMonitor getCancelMonitor(const lsRequestId&);
- void sendMsg(LspMessage& msg);
- void mainLoop(std::unique_ptr<LspMessage>);
- bool dispatch(const std::string&);
- template <typename F, typename RequestType = ParamType<F, 0>>
- IsRequest<RequestType> processRequestJsonHandler(const F& handler) {
- std::lock_guard<std::mutex> lock(m_sendMutex);
- if (!jsonHandler->GetRequestJsonHandler(RequestType::kMethodInfo))
- {
- jsonHandler->SetRequestJsonHandler(RequestType::kMethodInfo,
- [](Reader& visitor)
- {
- return RequestType::ReflectReader(visitor);
- });
- }
+ CancelMonitor getCancelMonitor(lsRequestId const&);
+ void sendMsg(LspMessage& msg);
+ void mainLoop(std::unique_ptr<LspMessage>);
+ bool dispatch(std::string const&);
+ template<typename F, typename RequestType = ParamType<F, 0>>
+ IsRequest<RequestType> processRequestJsonHandler(F const& handler)
+ {
+ std::lock_guard<std::mutex> lock(m_sendMutex);
+ if (!jsonHandler->GetRequestJsonHandler(RequestType::kMethodInfo))
+ {
+ jsonHandler->SetRequestJsonHandler(
+ RequestType::kMethodInfo, [](Reader& visitor) { return RequestType::ReflectReader(visitor); }
+ );
}
- template <typename T, typename = IsRequest<T>>
- void processResponseJsonHandler(T& request)
+ }
+ template<typename T, typename = IsRequest<T>>
+ void processResponseJsonHandler(T& request)
+ {
+ using Response = typename T::Response;
+ std::lock_guard<std::mutex> lock(m_sendMutex);
+ if (!jsonHandler->GetResponseJsonHandler(T::kMethodInfo))
{
- using Response = typename T::Response;
- std::lock_guard<std::mutex> lock(m_sendMutex);
- if (!jsonHandler->GetResponseJsonHandler(T::kMethodInfo))
+ jsonHandler->SetResponseJsonHandler(
+ T::kMethodInfo,
+ [](Reader& visitor)
{
- jsonHandler->SetResponseJsonHandler(T::kMethodInfo, [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return Response::ReflectReader(visitor);
- });
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return Response::ReflectReader(visitor);
}
+ );
}
+ }
+
+ struct Data;
- struct Data;
+ Data* d_ptr;
- Data* d_ptr;
+ std::shared_ptr<MessageJsonHandler> jsonHandler;
+ std::mutex m_sendMutex;
- std::shared_ptr < MessageJsonHandler> jsonHandler;
- std::mutex m_sendMutex;
+ std::shared_ptr<Endpoint> local_endpoint;
- std::shared_ptr < Endpoint > local_endpoint;
public:
- std::shared_ptr < std::thread > message_producer_thread_;
+ std::shared_ptr<std::thread> message_producer_thread_;
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/RequestInMessage.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/RequestInMessage.h
index 0775b36dba..b445173cf0 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/RequestInMessage.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/RequestInMessage.h
@@ -1,6 +1,5 @@
#pragma once
-
#include "serializer.h"
#include <atomic>
#include <mutex>
@@ -9,62 +8,69 @@
#include "LibLsp/lsp/method_type.h"
#include "lsResponseMessage.h"
-struct RequestInMessage : public LspMessage {
- // number or string, actually no null
- lsRequestId id;
- std::string method;
- Kind GetKid() override
- {
- return REQUEST_MESSAGE;
- }
-
+struct RequestInMessage : public LspMessage
+{
+ // number or string, actually no null
+ lsRequestId id;
+ std::string method;
+ Kind GetKid() override
+ {
+ return REQUEST_MESSAGE;
+ }
};
-
-
-template <class T, class TDerived >
+template<class T, class TDerived>
struct lsRequest : public RequestInMessage
{
- lsRequest(MethodType _method)
- {
- method = _method;
- }
- MethodType GetMethodType() const override { return method.c_str(); }
- void SetMethodType(MethodType _method) override
- {
- method = _method;
- } \
- void ReflectWriter(Writer& writer) override {
- Reflect(writer, static_cast<TDerived&>(*this));
- }
+ lsRequest(MethodType _method)
+ {
+ method = _method;
+ }
+ MethodType GetMethodType() const override
+ {
+ return method.c_str();
+ }
+ void SetMethodType(MethodType _method) override
+ {
+ method = _method;
+ }
+ void ReflectWriter(Writer& writer) override
+ {
+ Reflect(writer, static_cast<TDerived&>(*this));
+ }
- static std::unique_ptr<LspMessage> ReflectReader(Reader& visitor) {
+ static std::unique_ptr<LspMessage> ReflectReader(Reader& visitor)
+ {
- TDerived* temp = new TDerived();
- std::unique_ptr<TDerived> message = std::unique_ptr<TDerived>(temp);
- // Reflect may throw and *message will be partially deserialized.
- Reflect(visitor, static_cast<TDerived&>(*temp));
- return message;
- }
- void swap(lsRequest& arg) noexcept
- {
- id.swap(arg.id);
- method.swap(method);
- std::swap(params, arg.params);
- }
- T params;
+ TDerived* temp = new TDerived();
+ std::unique_ptr<TDerived> message = std::unique_ptr<TDerived>(temp);
+ // Reflect may throw and *message will be partially deserialized.
+ Reflect(visitor, static_cast<TDerived&>(*temp));
+ return message;
+ }
+ void swap(lsRequest& arg) noexcept
+ {
+ id.swap(arg.id);
+ method.swap(method);
+ std::swap(params, arg.params);
+ }
+ T params;
};
-
-#define DEFINE_REQUEST_RESPONSE_TYPE(MSG,request_param,response_result,methodInfo)\
-namespace MSG {\
- struct response :public ResponseMessage< response_result, response> {}; \
- struct request : public lsRequest< request_param , request >{\
- static constexpr MethodType kMethodInfo = methodInfo;\
- request():lsRequest(kMethodInfo){} \
- using Response = response;\
- };\
-};\
-MAKE_REFLECT_STRUCT(MSG::request, jsonrpc, id, method, params);\
-MAKE_REFLECT_STRUCT(MSG::response, jsonrpc, id, result);
-
+#define DEFINE_REQUEST_RESPONSE_TYPE(MSG, request_param, response_result, methodInfo) \
+ namespace MSG \
+ { \
+ struct response : public ResponseMessage<response_result, response> \
+ { \
+ }; \
+ struct request : public lsRequest<request_param, request> \
+ { \
+ static constexpr MethodType kMethodInfo = methodInfo; \
+ request() : lsRequest(kMethodInfo) \
+ { \
+ } \
+ using Response = response; \
+ }; \
+ }; \
+ MAKE_REFLECT_STRUCT(MSG::request, jsonrpc, id, method, params); \
+ MAKE_REFLECT_STRUCT(MSG::response, jsonrpc, id, result);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/ScopeExit.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/ScopeExit.h
index 024b700b4a..9af5e17107 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/ScopeExit.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/ScopeExit.h
@@ -14,32 +14,44 @@
#include <type_traits>
#include <utility>
-namespace lsp {
-namespace detail {
+namespace lsp
+{
+namespace detail
+{
-template <typename Callable> class scope_exit {
- Callable ExitFunction;
- bool Engaged = true; // False once moved-from or release()d.
+ template<typename Callable>
+ class scope_exit
+ {
+ Callable ExitFunction;
+ bool Engaged = true; // False once moved-from or release()d.
-public:
- template <typename Fp>
- explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
+ public:
+ template<typename Fp>
+ explicit scope_exit(Fp&& F) : ExitFunction(std::forward<Fp>(F))
+ {
+ }
- scope_exit(scope_exit &&Rhs)
- : ExitFunction(std::move(Rhs.ExitFunction)), Engaged(Rhs.Engaged) {
- Rhs.release();
- }
- scope_exit(const scope_exit &) = delete;
- scope_exit &operator=(scope_exit &&) = delete;
- scope_exit &operator=(const scope_exit &) = delete;
+ scope_exit(scope_exit&& Rhs) : ExitFunction(std::move(Rhs.ExitFunction)), Engaged(Rhs.Engaged)
+ {
+ Rhs.release();
+ }
+ scope_exit(scope_exit const&) = delete;
+ scope_exit& operator=(scope_exit&&) = delete;
+ scope_exit& operator=(scope_exit const&) = delete;
- void release() { Engaged = false; }
+ void release()
+ {
+ Engaged = false;
+ }
- ~scope_exit() {
- if (Engaged)
- ExitFunction();
- }
-};
+ ~scope_exit()
+ {
+ if (Engaged)
+ {
+ ExitFunction();
+ }
+ }
+ };
} // end namespace detail
@@ -48,12 +60,10 @@ public:
// returned object is kept).
//
// Interface is specified by p0052r2.
-template <typename Callable>
- detail::scope_exit<typename std::decay<Callable>::type>
-make_scope_exit(Callable &&F) {
- return detail::scope_exit<typename std::decay<Callable>::type>(
- std::forward<Callable>(F));
+template<typename Callable>
+detail::scope_exit<typename std::decay<Callable>::type> make_scope_exit(Callable&& F)
+{
+ return detail::scope_exit<typename std::decay<Callable>::type>(std::forward<Callable>(F));
}
} // end namespace lsp
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/StreamMessageProducer.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/StreamMessageProducer.h
index 9cd6aef37f..a16f58762e 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/StreamMessageProducer.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/StreamMessageProducer.h
@@ -6,34 +6,29 @@
#include <memory>
#include "MessageIssue.h"
-namespace lsp {
- class istream;
+namespace lsp
+{
+class istream;
}
class StreamMessageProducer : public MessageProducer
{
public:
+ StreamMessageProducer(MessageIssueHandler& message_issue_handler, std::shared_ptr<lsp::istream> _input)
+ : issueHandler(message_issue_handler), input(_input)
+ {
+ }
+ StreamMessageProducer(MessageIssueHandler& message_issue_handler) : issueHandler(message_issue_handler)
+ {
+ }
- StreamMessageProducer(
- MessageIssueHandler& message_issue_handler, std::shared_ptr < lsp::istream> _input)
- : issueHandler(message_issue_handler),
- input(_input)
- {
- }
- StreamMessageProducer(
- MessageIssueHandler& message_issue_handler)
- : issueHandler(message_issue_handler)
- {
- }
-
- bool keepRunning = false;
+ bool keepRunning = false;
- virtual void bind(std::shared_ptr<lsp::istream>) = 0 ;
+ virtual void bind(std::shared_ptr<lsp::istream>) = 0;
protected:
- MessageIssueHandler& issueHandler;
- std::shared_ptr < lsp::istream> input;
-
+ MessageIssueHandler& issueHandler;
+ std::shared_ptr<lsp::istream> input;
};
class LSPStreamMessageProducer : public StreamMessageProducer
@@ -51,41 +46,30 @@ public:
};
bool handleMessage(Headers& headers, MessageConsumer callBack);
- LSPStreamMessageProducer(
- MessageIssueHandler& message_issue_handler, std::shared_ptr < lsp::istream> _input)
- : StreamMessageProducer(message_issue_handler,_input)
+ LSPStreamMessageProducer(MessageIssueHandler& message_issue_handler, std::shared_ptr<lsp::istream> _input)
+ : StreamMessageProducer(message_issue_handler, _input)
{
}
- LSPStreamMessageProducer(
- MessageIssueHandler& message_issue_handler)
- : StreamMessageProducer(message_issue_handler)
+ LSPStreamMessageProducer(MessageIssueHandler& message_issue_handler) : StreamMessageProducer(message_issue_handler)
{
}
-
void listen(MessageConsumer) override;
void bind(std::shared_ptr<lsp::istream>) override;
void parseHeader(std::string& line, Headers& headers);
-
-
};
class DelimitedStreamMessageProducer : public StreamMessageProducer
{
public:
-
- DelimitedStreamMessageProducer(
- MessageIssueHandler& message_issue_handler, std::shared_ptr <lsp::istream> _input)
- : StreamMessageProducer(message_issue_handler,_input)
+ DelimitedStreamMessageProducer(MessageIssueHandler& message_issue_handler, std::shared_ptr<lsp::istream> _input)
+ : StreamMessageProducer(message_issue_handler, _input)
{
}
- DelimitedStreamMessageProducer(
- MessageIssueHandler& message_issue_handler)
- : StreamMessageProducer(message_issue_handler)
+ DelimitedStreamMessageProducer(MessageIssueHandler& message_issue_handler)
+ : StreamMessageProducer(message_issue_handler)
{
}
-
void listen(MessageConsumer) override;
- void bind(std::shared_ptr < lsp::istream>) override;
-
-}; \ No newline at end of file
+ void bind(std::shared_ptr<lsp::istream>) override;
+};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/TcpServer.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/TcpServer.h
index a377be8c3e..9601eecd80 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/TcpServer.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/TcpServer.h
@@ -4,37 +4,39 @@
#include <string>
#include "RemoteEndPoint.h"
-namespace lsp {
- class Log;
+namespace lsp
+{
+class Log;
}
namespace lsp
{
- /// The top-level class of the HTTP server.
- class TcpServer
- {
- public:
- TcpServer(const TcpServer&) = delete;
- TcpServer& operator=(const TcpServer&) = delete;
- ~TcpServer();
- /// Construct the server to listen on the specified TCP address and port, and
- /// serve up files from the given directory.
- explicit TcpServer(const std::string& address, const std::string& port,
- std::shared_ptr < MessageJsonHandler> json_handler,
- std::shared_ptr < Endpoint> localEndPoint, lsp::Log& ,uint32_t _max_workers = 2);
+/// The top-level class of the HTTP server.
+class TcpServer
+{
+public:
+ TcpServer(TcpServer const&) = delete;
+ TcpServer& operator=(TcpServer const&) = delete;
+ ~TcpServer();
+ /// Construct the server to listen on the specified TCP address and port, and
+ /// serve up files from the given directory.
+ explicit TcpServer(
+ std::string const& address, std::string const& port, std::shared_ptr<MessageJsonHandler> json_handler,
+ std::shared_ptr<Endpoint> localEndPoint, lsp::Log&, uint32_t _max_workers = 2
+ );
- /// Run the server's io_context loop.
- void run();
- void stop();
+ /// Run the server's io_context loop.
+ void run();
+ void stop();
- RemoteEndPoint point;
- private:
- struct Data;
- /// Perform an asynchronous accept operation.
- void do_accept();
+ RemoteEndPoint point;
- /// Wait for a request to stop the server.
- void do_stop();
- Data* d_ptr = nullptr;
- };
-} // namespace
+private:
+ struct Data;
+ /// Perform an asynchronous accept operation.
+ void do_accept();
+ /// Wait for a request to stop the server.
+ void do_stop();
+ Data* d_ptr = nullptr;
+};
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/WebSocketServer.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/WebSocketServer.h
index 5206525ceb..63a48125bb 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/WebSocketServer.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/WebSocketServer.h
@@ -5,83 +5,80 @@
#include <boost/beast/core/tcp_stream.hpp>
#include <boost/beast/websocket/stream.hpp>
-
#include "RemoteEndPoint.h"
#include "stream.h"
#include "threaded_queue.h"
-namespace lsp {
- class Log;
+namespace lsp
+{
+class Log;
}
-
namespace lsp
{
+class websocket_stream_wrapper : public istream, public ostream
+{
+public:
+ websocket_stream_wrapper(boost::beast::websocket::stream<boost::beast::tcp_stream>& _w);
+ boost::beast::websocket::stream<boost::beast::tcp_stream>& ws_;
+ std::atomic<bool> quit {};
+ std::shared_ptr<MultiQueueWaiter> request_waiter;
+ ThreadedQueue<char> on_request;
+ std::string error_message;
+ bool fail() override;
- class websocket_stream_wrapper :public istream, public ostream
- {
- public:
-
- websocket_stream_wrapper(boost::beast::websocket::stream<boost::beast::tcp_stream>& _w);
-
- boost::beast::websocket::stream<boost::beast::tcp_stream>& ws_;
- std::atomic<bool> quit{};
- std::shared_ptr < MultiQueueWaiter> request_waiter;
- ThreadedQueue< char > on_request;
- std::string error_message;
- bool fail() override;
-
- bool eof() override;
-
- bool good() override;
-
- websocket_stream_wrapper& read(char* str, std::streamsize count) override;
-
- int get() override;
-
- bool bad() override;
-
- websocket_stream_wrapper& write(const std::string& c) override;
-
- websocket_stream_wrapper& write(std::streamsize _s) override;
+ bool eof() override;
- websocket_stream_wrapper& flush() override;
+ bool good() override;
- void clear() override;
+ websocket_stream_wrapper& read(char* str, std::streamsize count) override;
- std::string what() override;
- };
+ int get() override;
- /// The top-level class of the HTTP server.
- class WebSocketServer
- {
- public:
- WebSocketServer(const WebSocketServer&) = delete;
- WebSocketServer& operator=(const WebSocketServer&) = delete;
- ~WebSocketServer();
- /// Construct the server to listen on the specified TCP address and port, and
- /// serve up files from the given directory.
- explicit WebSocketServer(const std::string& user_agent, const std::string& address, const std::string& port,
- std::shared_ptr < MessageJsonHandler> json_handler,
- std::shared_ptr < Endpoint> localEndPoint, lsp::Log& ,uint32_t _max_workers = 2);
+ bool bad() override;
- /// Run the server's io_context loop.
- void run();
- void stop();
+ websocket_stream_wrapper& write(std::string const& c) override;
- RemoteEndPoint point;
- private:
- struct Data;
- /// Perform an asynchronous accept operation.
- void do_accept();
+ websocket_stream_wrapper& write(std::streamsize _s) override;
- /// Wait for a request to stop the server.
- void do_stop();
- Data* d_ptr = nullptr;
+ websocket_stream_wrapper& flush() override;
+ void clear() override;
- };
+ std::string what() override;
+};
- } // namespace
+/// The top-level class of the HTTP server.
+class WebSocketServer
+{
+public:
+ WebSocketServer(WebSocketServer const&) = delete;
+ WebSocketServer& operator=(WebSocketServer const&) = delete;
+ ~WebSocketServer();
+ /// Construct the server to listen on the specified TCP address and port, and
+ /// serve up files from the given directory.
+ explicit WebSocketServer(
+ std::string const& user_agent, std::string const& address, std::string const& port,
+ std::shared_ptr<MessageJsonHandler> json_handler, std::shared_ptr<Endpoint> localEndPoint, lsp::Log&,
+ uint32_t _max_workers = 2
+ );
+
+ /// Run the server's io_context loop.
+ void run();
+ void stop();
+
+ RemoteEndPoint point;
+
+private:
+ struct Data;
+ /// Perform an asynchronous accept operation.
+ void do_accept();
+
+ /// Wait for a request to stop the server.
+ void do_stop();
+ Data* d_ptr = nullptr;
+};
+
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/future.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/future.h
index 8e241d96e9..863c597ac3 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/future.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/future.h
@@ -18,161 +18,169 @@
#include <memory>
#include <mutex>
-namespace lsp {
+namespace lsp
+{
// internal functionality
-namespace detail {
-template <typename T>
-struct promise_state {
- T val;
- std::mutex mutex;
- std::condition_variable cv;
- bool hasVal = false;
-};
-} // namespace detail
+namespace detail
+{
+ template<typename T>
+ struct promise_state
+ {
+ T val;
+ std::mutex mutex;
+ std::condition_variable cv;
+ bool hasVal = false;
+ };
+} // namespace detail
// forward declaration
-template <typename T>
+template<typename T>
class promise;
// future_status is the enumeration returned by future::wait_for and
// future::wait_until.
-enum class future_status {
- ready,
- timeout,
+enum class future_status
+{
+ ready,
+ timeout,
};
// future is a minimal reimplementation of std::future, that does not suffer
// from TSAN false positives. See:
// https://gcc.gnu.org/bugzilla//show_bug.cgi?id=69204
-template <typename T>
-class future {
- public:
- using State = detail::promise_state<T>;
-
- // constructors
- inline future() = default;
- inline future(future&&) = default;
-
- // valid() returns true if the future has an internal state.
- bool valid() const;
-
- // get() blocks until the future has a valid result, and returns it.
- // The future must have a valid internal state to call this method.
- inline T get();
-
- // wait() blocks until the future has a valid result.
- // The future must have a valid internal state to call this method.
- void wait() const;
-
- // wait_for() blocks until the future has a valid result, or the timeout is
- // reached.
- // The future must have a valid internal state to call this method.
- template <class Rep, class Period>
- future_status wait_for(
- const std::chrono::duration<Rep, Period>& timeout) const;
-
- // wait_until() blocks until the future has a valid result, or the timeout is
- // reached.
- // The future must have a valid internal state to call this method.
- template <class Clock, class Duration>
- future_status wait_until(
- const std::chrono::time_point<Clock, Duration>& timeout) const;
-
- private:
- friend promise<T>;
- future(const future&) = delete;
- inline future(const std::shared_ptr<State>& state);
-
- std::shared_ptr<State> state = std::make_shared<State>();
+template<typename T>
+class future
+{
+public:
+ using State = detail::promise_state<T>;
+
+ // constructors
+ inline future() = default;
+ inline future(future&&) = default;
+
+ // valid() returns true if the future has an internal state.
+ bool valid() const;
+
+ // get() blocks until the future has a valid result, and returns it.
+ // The future must have a valid internal state to call this method.
+ inline T get();
+
+ // wait() blocks until the future has a valid result.
+ // The future must have a valid internal state to call this method.
+ void wait() const;
+
+ // wait_for() blocks until the future has a valid result, or the timeout is
+ // reached.
+ // The future must have a valid internal state to call this method.
+ template<class Rep, class Period>
+ future_status wait_for(std::chrono::duration<Rep, Period> const& timeout) const;
+
+ // wait_until() blocks until the future has a valid result, or the timeout is
+ // reached.
+ // The future must have a valid internal state to call this method.
+ template<class Clock, class Duration>
+ future_status wait_until(std::chrono::time_point<Clock, Duration> const& timeout) const;
+
+private:
+ friend promise<T>;
+ future(future const&) = delete;
+ inline future(std::shared_ptr<State> const& state);
+
+ std::shared_ptr<State> state = std::make_shared<State>();
};
-template <typename T>
-future<T>::future(const std::shared_ptr<State>& s) : state(s) {}
+template<typename T>
+future<T>::future(std::shared_ptr<State> const& s) : state(s)
+{
+}
-template <typename T>
-bool future<T>::valid() const {
- return static_cast<bool>(state);
+template<typename T>
+bool future<T>::valid() const
+{
+ return static_cast<bool>(state);
}
-template <typename T>
-T future<T>::get() {
- std::unique_lock<std::mutex> lock(state->mutex);
- state->cv.wait(lock, [&] { return state->hasVal; });
- return state->val;
+template<typename T>
+T future<T>::get()
+{
+ std::unique_lock<std::mutex> lock(state->mutex);
+ state->cv.wait(lock, [&] { return state->hasVal; });
+ return state->val;
}
-template <typename T>
-void future<T>::wait() const {
- std::unique_lock<std::mutex> lock(state->mutex);
- state->cv.wait(lock, [&] { return state->hasVal; });
+template<typename T>
+void future<T>::wait() const
+{
+ std::unique_lock<std::mutex> lock(state->mutex);
+ state->cv.wait(lock, [&] { return state->hasVal; });
}
-template <typename T>
-template <class Rep, class Period>
-future_status future<T>::wait_for(
- const std::chrono::duration<Rep, Period>& timeout) const {
- std::unique_lock<std::mutex> lock(state->mutex);
- return state->cv.wait_for(lock, timeout, [&] { return state->hasVal; })
- ? future_status::ready
- : future_status::timeout;
+template<typename T>
+template<class Rep, class Period>
+future_status future<T>::wait_for(std::chrono::duration<Rep, Period> const& timeout) const
+{
+ std::unique_lock<std::mutex> lock(state->mutex);
+ return state->cv.wait_for(lock, timeout, [&] { return state->hasVal; }) ? future_status::ready
+ : future_status::timeout;
}
-template <typename T>
-template <class Clock, class Duration>
-future_status future<T>::wait_until(
- const std::chrono::time_point<Clock, Duration>& timeout) const {
- std::unique_lock<std::mutex> lock(state->mutex);
- return state->cv.wait_until(lock, timeout, [&] { return state->hasVal; })
- ? future_status::ready
- : future_status::timeout;
+template<typename T>
+template<class Clock, class Duration>
+future_status future<T>::wait_until(std::chrono::time_point<Clock, Duration> const& timeout) const
+{
+ std::unique_lock<std::mutex> lock(state->mutex);
+ return state->cv.wait_until(lock, timeout, [&] { return state->hasVal; }) ? future_status::ready
+ : future_status::timeout;
}
// promise is a minimal reimplementation of std::promise, that does not suffer
// from TSAN false positives. See:
// https://gcc.gnu.org/bugzilla//show_bug.cgi?id=69204
-template <typename T>
-class promise {
- public:
- // constructors
- inline promise() = default;
- inline promise(promise&& other) = default;
- inline promise(const promise& other) = default;
-
- // set_value() stores value to the shared state.
- // set_value() must only be called once.
- inline void set_value(const T& value) const;
- inline void set_value(T&& value) const;
-
- // get_future() returns a future sharing this promise's state.
- future<T> get_future();
-
- private:
- using State = detail::promise_state<T>;
- std::shared_ptr<State> state = std::make_shared<State>();
+template<typename T>
+class promise
+{
+public:
+ // constructors
+ inline promise() = default;
+ inline promise(promise&& other) = default;
+ inline promise(promise const& other) = default;
+
+ // set_value() stores value to the shared state.
+ // set_value() must only be called once.
+ inline void set_value(T const& value) const;
+ inline void set_value(T&& value) const;
+
+ // get_future() returns a future sharing this promise's state.
+ future<T> get_future();
+
+private:
+ using State = detail::promise_state<T>;
+ std::shared_ptr<State> state = std::make_shared<State>();
};
-template <typename T>
-future<T> promise<T>::get_future() {
- return future<T>(state);
+template<typename T>
+future<T> promise<T>::get_future()
+{
+ return future<T>(state);
}
-template <typename T>
-void promise<T>::set_value(const T& value) const {
- std::unique_lock<std::mutex> lock(state->mutex);
- state->val = value;
- state->hasVal = true;
- state->cv.notify_all();
+template<typename T>
+void promise<T>::set_value(T const& value) const
+{
+ std::unique_lock<std::mutex> lock(state->mutex);
+ state->val = value;
+ state->hasVal = true;
+ state->cv.notify_all();
}
-template <typename T>
-void promise<T>::set_value(T&& value) const {
- std::unique_lock<std::mutex> lock(state->mutex);
- state->val = std::move(value);
- state->hasVal = true;
- state->cv.notify_all();
+template<typename T>
+void promise<T>::set_value(T&& value) const
+{
+ std::unique_lock<std::mutex> lock(state->mutex);
+ state->val = std::move(value);
+ state->hasVal = true;
+ state->cv.notify_all();
}
-} // namespace lsp
-
-
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/json.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/json.h
index 34e6232917..ff28200e59 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/json.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/json.h
@@ -5,77 +5,186 @@
#include <rapidjson/document.h>
#include <rapidjson/prettywriter.h>
-class JsonReader : public Reader {
-
- std::vector<const char*> path_;
-
- public:
- rapidjson::GenericValue<rapidjson::UTF8<>>* m_;
- JsonReader(rapidjson::GenericValue<rapidjson::UTF8<>>* m) : m_(m) {}
- SerializeFormat Format() const override { return SerializeFormat::Json; }
-
- bool IsBool() override { return m_->IsBool(); }
- bool IsNull() override { return m_->IsNull(); }
- bool IsArray() override { return m_->IsArray(); }
- bool IsInt() override { return m_->IsInt(); }
- bool IsInt64() override { return m_->IsInt64(); }
- bool IsUint64() override { return m_->IsUint64(); }
- bool IsDouble() override { return m_->IsDouble(); }
- bool IsNumber() override { return m_->IsNumber(); }
- bool IsString() override { return m_->IsString(); }
-
- void GetNull() override {}
- bool GetBool() override { return m_->GetBool(); }
- int GetInt() override { return m_->GetInt(); }
- uint32_t GetUint32() override { return uint32_t(m_->GetUint64()); }
- int64_t GetInt64() override { return m_->GetInt64(); }
- uint64_t GetUint64() override { return m_->GetUint64(); }
- double GetDouble() override { return m_->GetDouble(); }
- std::string GetString() override { return m_->GetString(); }
-
- bool HasMember(const char* x) override
- {
- if (m_->IsObject())
- return m_->HasMember(x);
- else
- return false;
- }
- std::unique_ptr<Reader> operator[](const char* x) override {
- auto& sub = (*m_)[x];
- return std::unique_ptr<JsonReader>(new JsonReader(&sub));
- }
-
- std::string ToString() const override;
-
- void IterMap(std::function<void(const char*, Reader&)> fn) override;
-
- void IterArray(std::function<void(Reader&)> fn) override;
-
- void DoMember(const char* name, std::function<void(Reader&)> fn) override;
-
- std::string GetPath() const;
+class JsonReader : public Reader
+{
+
+ std::vector<char const*> path_;
+
+public:
+ rapidjson::GenericValue<rapidjson::UTF8<>>* m_;
+ JsonReader(rapidjson::GenericValue<rapidjson::UTF8<>>* m) : m_(m)
+ {
+ }
+ SerializeFormat Format() const override
+ {
+ return SerializeFormat::Json;
+ }
+
+ bool IsBool() override
+ {
+ return m_->IsBool();
+ }
+ bool IsNull() override
+ {
+ return m_->IsNull();
+ }
+ bool IsArray() override
+ {
+ return m_->IsArray();
+ }
+ bool IsInt() override
+ {
+ return m_->IsInt();
+ }
+ bool IsInt64() override
+ {
+ return m_->IsInt64();
+ }
+ bool IsUint64() override
+ {
+ return m_->IsUint64();
+ }
+ bool IsDouble() override
+ {
+ return m_->IsDouble();
+ }
+ bool IsNumber() override
+ {
+ return m_->IsNumber();
+ }
+ bool IsString() override
+ {
+ return m_->IsString();
+ }
+
+ void GetNull() override
+ {
+ }
+ bool GetBool() override
+ {
+ return m_->GetBool();
+ }
+ int GetInt() override
+ {
+ return m_->GetInt();
+ }
+ uint32_t GetUint32() override
+ {
+ return uint32_t(m_->GetUint64());
+ }
+ int64_t GetInt64() override
+ {
+ return m_->GetInt64();
+ }
+ uint64_t GetUint64() override
+ {
+ return m_->GetUint64();
+ }
+ double GetDouble() override
+ {
+ return m_->GetDouble();
+ }
+ std::string GetString() override
+ {
+ return m_->GetString();
+ }
+
+ bool HasMember(char const* x) override
+ {
+ if (m_->IsObject())
+ {
+ return m_->HasMember(x);
+ }
+ else
+ {
+ return false;
+ }
+ }
+ std::unique_ptr<Reader> operator[](char const* x) override
+ {
+ auto& sub = (*m_)[x];
+ return std::unique_ptr<JsonReader>(new JsonReader(&sub));
+ }
+
+ std::string ToString() const override;
+
+ void IterMap(std::function<void(char const*, Reader&)> fn) override;
+
+ void IterArray(std::function<void(Reader&)> fn) override;
+
+ void DoMember(char const* name, std::function<void(Reader&)> fn) override;
+
+ std::string GetPath() const;
};
-class JsonWriter : public Writer {
-
- public:
- rapidjson::Writer<rapidjson::StringBuffer>* m_;
-
- JsonWriter(rapidjson::Writer<rapidjson::StringBuffer>* m) : m_(m) {}
- SerializeFormat Format() const override { return SerializeFormat::Json; }
-
- void Null() override { m_->Null(); }
- void Bool(bool x) override { m_->Bool(x); }
- void Int(int x) override { m_->Int(x); }
- void Uint32(uint32_t x) override { m_->Uint64(x); }
- void Int64(int64_t x) override { m_->Int64(x); }
- void Uint64(uint64_t x) override { m_->Uint64(x); }
- void Double(double x) override { m_->Double(x); }
- void String(const char* x) override { m_->String(x); }
- void String(const char* x, size_t len) override { m_->String(x, len); }
- void StartArray(size_t) override { m_->StartArray(); }
- void EndArray() override { m_->EndArray(); }
- void StartObject() override { m_->StartObject(); }
- void EndObject() override { m_->EndObject(); }
- void Key(const char* name) override { m_->Key(name); }
+class JsonWriter : public Writer
+{
+
+public:
+ rapidjson::Writer<rapidjson::StringBuffer>* m_;
+
+ JsonWriter(rapidjson::Writer<rapidjson::StringBuffer>* m) : m_(m)
+ {
+ }
+ SerializeFormat Format() const override
+ {
+ return SerializeFormat::Json;
+ }
+
+ void Null() override
+ {
+ m_->Null();
+ }
+ void Bool(bool x) override
+ {
+ m_->Bool(x);
+ }
+ void Int(int x) override
+ {
+ m_->Int(x);
+ }
+ void Uint32(uint32_t x) override
+ {
+ m_->Uint64(x);
+ }
+ void Int64(int64_t x) override
+ {
+ m_->Int64(x);
+ }
+ void Uint64(uint64_t x) override
+ {
+ m_->Uint64(x);
+ }
+ void Double(double x) override
+ {
+ m_->Double(x);
+ }
+ void String(char const* x) override
+ {
+ m_->String(x);
+ }
+ void String(char const* x, size_t len) override
+ {
+ m_->String(x, len);
+ }
+ void StartArray(size_t) override
+ {
+ m_->StartArray();
+ }
+ void EndArray() override
+ {
+ m_->EndArray();
+ }
+ void StartObject() override
+ {
+ m_->StartObject();
+ }
+ void EndObject() override
+ {
+ m_->EndObject();
+ }
+ void Key(char const* name) override
+ {
+ m_->Key(name);
+ }
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/lsRequestId.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/lsRequestId.h
index 2efc80b19a..0af5abc0c1 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/lsRequestId.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/lsRequestId.h
@@ -2,50 +2,69 @@
#include "LibLsp/JsonRpc/serializer.h"
-struct lsRequestId {
- // The client can send the request id as an int or a string. We should output
- // the same format we received.
- enum Type { kNone, kInt, kString };
- Type type = kNone;
+struct lsRequestId
+{
+ // The client can send the request id as an int or a string. We should output
+ // the same format we received.
+ enum Type
+ {
+ kNone,
+ kInt,
+ kString
+ };
+ Type type = kNone;
- int value = -1;
- std::string k_string;
- bool has_value() const { return type != kNone; }
- void swap(lsRequestId& arg) noexcept
+ int value = -1;
+ std::string k_string;
+ bool has_value() const
+ {
+ return type != kNone;
+ }
+ void swap(lsRequestId& arg) noexcept
+ {
+ std::swap(arg, *this);
+ }
+ void set(int v)
+ {
+ value = v;
+ type = kInt;
+ }
+ void set(std::string const& v)
+ {
+ k_string = v;
+ type = kString;
+ }
+ bool operator==(lsRequestId const& rhs) const
+ {
+ if (type != rhs.type)
{
- std::swap(arg, *this);
+ return false;
}
- void set(int v)
+ if (type == kInt)
{
- value = v;
- type = kInt;
+ return value == rhs.value;
}
- void set(const std::string& v)
+ return k_string == rhs.k_string;
+ }
+ bool operator!=(lsRequestId const& rhs) const
+ {
+ return !operator==(rhs);
+ }
+ bool operator<(lsRequestId const& rhs) const
+ {
+ if (type != rhs.type)
{
- k_string = v;
- type = kString;
+ return false;
}
- bool operator==(const lsRequestId& rhs) const
+ if (type == kInt)
{
- if (type != rhs.type) return false;
- if (type == kInt)
- return value == rhs.value;
- return k_string == rhs.k_string;
- }
- bool operator!=(const lsRequestId& rhs) const
- {
- return !operator==(rhs);
- }
- bool operator<(const lsRequestId& rhs) const
- {
- if (type != rhs.type) return false;
- if (type == kInt)
- return value < rhs.value;
- return k_string < rhs.k_string;
+ return value < rhs.value;
}
+ return k_string < rhs.k_string;
+ }
};
void Reflect(Reader& visitor, lsRequestId& value);
void Reflect(Writer& visitor, lsRequestId& value);
// Debug method to convert an id to a string.
-std::string ToString(const lsRequestId& id);
+std::string ToString(lsRequestId const& id);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/lsResponseMessage.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/lsResponseMessage.h
index 68ad502b0c..06d173c518 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/lsResponseMessage.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/lsResponseMessage.h
@@ -4,68 +4,74 @@
#include "LibLsp/JsonRpc/message.h"
#include "LibLsp/lsp/method_type.h"
+struct ResponseInMessage : public LspMessage
+{
-struct ResponseInMessage :public LspMessage {
+ lsRequestId id;
+ std::string m_methodType;
- lsRequestId id;
- std::string m_methodType;
+ virtual MethodType GetMethodType() const override
+ {
+ return m_methodType.data();
+ };
+ virtual void SetMethodType(MethodType _type) override
+ {
+ m_methodType = _type;
+ };
- virtual MethodType GetMethodType() const override
- {
- return m_methodType.data();
- };
- virtual void SetMethodType(MethodType _type) override
- {
- m_methodType = _type;
- };
-
- Kind GetKid() override
- {
- return RESPONCE_MESSAGE;
- }
- virtual bool IsErrorType()
- {
- return false;
- }
+ Kind GetKid() override
+ {
+ return RESPONCE_MESSAGE;
+ }
+ virtual bool IsErrorType()
+ {
+ return false;
+ }
};
-template <class TDerived >
-struct BaseResponseMessage : ResponseInMessage {
-
- void ReflectWriter(Writer& writer) override {
- Reflect(writer, static_cast<TDerived&>(*this));
- }
- static std::unique_ptr<LspMessage> ReflectReader(Reader& visitor) {
+template<class TDerived>
+struct BaseResponseMessage : ResponseInMessage
+{
- TDerived* temp = new TDerived();
- std::unique_ptr<TDerived> message = std::unique_ptr<TDerived>(temp);
- // Reflect may throw and *message will be partially deserialized.
- Reflect(visitor, static_cast<TDerived&>(*temp));
- return message;
- }
+ void ReflectWriter(Writer& writer) override
+ {
+ Reflect(writer, static_cast<TDerived&>(*this));
+ }
+ static std::unique_ptr<LspMessage> ReflectReader(Reader& visitor)
+ {
+ TDerived* temp = new TDerived();
+ std::unique_ptr<TDerived> message = std::unique_ptr<TDerived>(temp);
+ // Reflect may throw and *message will be partially deserialized.
+ Reflect(visitor, static_cast<TDerived&>(*temp));
+ return message;
+ }
};
-
-template <class T, class TDerived >
-struct ResponseMessage : BaseResponseMessage<TDerived> {
- T result;
- void swap(ResponseMessage<T, TDerived>& arg) noexcept
- {
- std::swap(result, arg.result);
- this->id.swap(arg.id);
- this->m_methodType.swap(arg.m_methodType);
- }
+template<class T, class TDerived>
+struct ResponseMessage : BaseResponseMessage<TDerived>
+{
+ T result;
+ void swap(ResponseMessage<T, TDerived>& arg) noexcept
+ {
+ std::swap(result, arg.result);
+ this->id.swap(arg.id);
+ this->m_methodType.swap(arg.m_methodType);
+ }
};
-template <class T, class TDerived >
-struct ResponseError : BaseResponseMessage<TDerived> {
- T error;
- bool IsErrorType() override { return true; }
- void swap(ResponseError<T, TDerived>& arg) noexcept
- {
+template<class T, class TDerived>
+struct ResponseError : BaseResponseMessage<TDerived>
+{
+ T error;
+ bool IsErrorType() override
+ {
+ return true;
+ }
+ void swap(ResponseError<T, TDerived>& arg) noexcept
+ {
- this->id.swap(arg.id);
- this->m_methodType.swap(arg.m_methodType);
- std::swap(error, arg.error);
- }
+ this->id.swap(arg.id);
+ this->m_methodType.swap(arg.m_methodType);
+ std::swap(error, arg.error);
+ }
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/macro_map.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/macro_map.h
index 19a9634286..7ce6d14875 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/macro_map.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/macro_map.h
@@ -35,100 +35,445 @@ DEALINGS IN THE SOFTWARE.
#pragma once
-static constexpr const int max_visitable_members = 69;
+static constexpr int const max_visitable_members = 69;
#define VISIT_STRUCT_EXPAND(x) x
#define VISIT_STRUCT_PP_ARG_N( \
- _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,\
- _11, _12, _13, _14, _15, _16, _17, _18, _19, _20,\
- _21, _22, _23, _24, _25, _26, _27, _28, _29, _30,\
- _31, _32, _33, _34, _35, _36, _37, _38, _39, _40,\
- _41, _42, _43, _44, _45, _46, _47, _48, _49, _50,\
- _51, _52, _53, _54, _55, _56, _57, _58, _59, _60,\
- _61, _62, _63, _64, _65, _66, _67, _68, _69, N, ...) N
-#define VISIT_STRUCT_PP_NARG(...) VISIT_STRUCT_EXPAND(VISIT_STRUCT_PP_ARG_N(__VA_ARGS__, \
- 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, \
- 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
- 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
- 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
- 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
- 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
- 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
+ _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66, _67, _68, _69, N, \
+ ... \
+) \
+ N
+#define VISIT_STRUCT_PP_NARG(...) \
+ VISIT_STRUCT_EXPAND(VISIT_STRUCT_PP_ARG_N( \
+ __VA_ARGS__, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, \
+ 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, \
+ 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 \
+ ))
/* need extra level to force extra eval */
-#define VISIT_STRUCT_CONCAT_(a,b) a ## b
-#define VISIT_STRUCT_CONCAT(a,b) VISIT_STRUCT_CONCAT_(a,b)
+#define VISIT_STRUCT_CONCAT_(a, b) a##b
+#define VISIT_STRUCT_CONCAT(a, b) VISIT_STRUCT_CONCAT_(a, b)
#define VISIT_STRUCT_APPLYF0(f)
-#define VISIT_STRUCT_APPLYF1(f,_1) f(_1)
-#define VISIT_STRUCT_APPLYF2(f,_1,_2) f(_1) f(_2)
-#define VISIT_STRUCT_APPLYF3(f,_1,_2,_3) f(_1) f(_2) f(_3)
-#define VISIT_STRUCT_APPLYF4(f,_1,_2,_3,_4) f(_1) f(_2) f(_3) f(_4)
-#define VISIT_STRUCT_APPLYF5(f,_1,_2,_3,_4,_5) f(_1) f(_2) f(_3) f(_4) f(_5)
-#define VISIT_STRUCT_APPLYF6(f,_1,_2,_3,_4,_5,_6) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6)
-#define VISIT_STRUCT_APPLYF7(f,_1,_2,_3,_4,_5,_6,_7) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7)
-#define VISIT_STRUCT_APPLYF8(f,_1,_2,_3,_4,_5,_6,_7,_8) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8)
-#define VISIT_STRUCT_APPLYF9(f,_1,_2,_3,_4,_5,_6,_7,_8,_9) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9)
-#define VISIT_STRUCT_APPLYF10(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10)
-#define VISIT_STRUCT_APPLYF11(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11)
-#define VISIT_STRUCT_APPLYF12(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12)
-#define VISIT_STRUCT_APPLYF13(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13)
-#define VISIT_STRUCT_APPLYF14(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14)
-#define VISIT_STRUCT_APPLYF15(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15)
-#define VISIT_STRUCT_APPLYF16(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16)
-#define VISIT_STRUCT_APPLYF17(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17)
-#define VISIT_STRUCT_APPLYF18(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18)
-#define VISIT_STRUCT_APPLYF19(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19)
-#define VISIT_STRUCT_APPLYF20(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20)
-#define VISIT_STRUCT_APPLYF21(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21)
-#define VISIT_STRUCT_APPLYF22(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22)
-#define VISIT_STRUCT_APPLYF23(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23)
-#define VISIT_STRUCT_APPLYF24(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24)
-#define VISIT_STRUCT_APPLYF25(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25)
-#define VISIT_STRUCT_APPLYF26(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26)
-#define VISIT_STRUCT_APPLYF27(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27)
-#define VISIT_STRUCT_APPLYF28(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28)
-#define VISIT_STRUCT_APPLYF29(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29)
-#define VISIT_STRUCT_APPLYF30(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30)
-#define VISIT_STRUCT_APPLYF31(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31)
-#define VISIT_STRUCT_APPLYF32(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32)
-#define VISIT_STRUCT_APPLYF33(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33)
-#define VISIT_STRUCT_APPLYF34(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34)
-#define VISIT_STRUCT_APPLYF35(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35)
-#define VISIT_STRUCT_APPLYF36(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36)
-#define VISIT_STRUCT_APPLYF37(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37)
-#define VISIT_STRUCT_APPLYF38(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38)
-#define VISIT_STRUCT_APPLYF39(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39)
-#define VISIT_STRUCT_APPLYF40(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40)
-#define VISIT_STRUCT_APPLYF41(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41)
-#define VISIT_STRUCT_APPLYF42(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42)
-#define VISIT_STRUCT_APPLYF43(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43)
-#define VISIT_STRUCT_APPLYF44(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44)
-#define VISIT_STRUCT_APPLYF45(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45)
-#define VISIT_STRUCT_APPLYF46(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46)
-#define VISIT_STRUCT_APPLYF47(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47)
-#define VISIT_STRUCT_APPLYF48(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48)
-#define VISIT_STRUCT_APPLYF49(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49)
-#define VISIT_STRUCT_APPLYF50(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50)
-#define VISIT_STRUCT_APPLYF51(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51)
-#define VISIT_STRUCT_APPLYF52(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52)
-#define VISIT_STRUCT_APPLYF53(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53)
-#define VISIT_STRUCT_APPLYF54(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54)
-#define VISIT_STRUCT_APPLYF55(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55)
-#define VISIT_STRUCT_APPLYF56(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56)
-#define VISIT_STRUCT_APPLYF57(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57)
-#define VISIT_STRUCT_APPLYF58(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58)
-#define VISIT_STRUCT_APPLYF59(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59)
-#define VISIT_STRUCT_APPLYF60(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60)
-#define VISIT_STRUCT_APPLYF61(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61)
-#define VISIT_STRUCT_APPLYF62(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62)
-#define VISIT_STRUCT_APPLYF63(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63)
-#define VISIT_STRUCT_APPLYF64(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64)
-#define VISIT_STRUCT_APPLYF65(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64) f(_65)
-#define VISIT_STRUCT_APPLYF66(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64) f(_65) f(_66)
-#define VISIT_STRUCT_APPLYF67(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64) f(_65) f(_66) f(_67)
-#define VISIT_STRUCT_APPLYF68(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64) f(_65) f(_66) f(_67) f(_68)
-#define VISIT_STRUCT_APPLYF69(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64) f(_65) f(_66) f(_67) f(_68) f(_69)
+#define VISIT_STRUCT_APPLYF1(f, _1) f(_1)
+#define VISIT_STRUCT_APPLYF2(f, _1, _2) f(_1) f(_2)
+#define VISIT_STRUCT_APPLYF3(f, _1, _2, _3) f(_1) f(_2) f(_3)
+#define VISIT_STRUCT_APPLYF4(f, _1, _2, _3, _4) f(_1) f(_2) f(_3) f(_4)
+#define VISIT_STRUCT_APPLYF5(f, _1, _2, _3, _4, _5) f(_1) f(_2) f(_3) f(_4) f(_5)
+#define VISIT_STRUCT_APPLYF6(f, _1, _2, _3, _4, _5, _6) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6)
+#define VISIT_STRUCT_APPLYF7(f, _1, _2, _3, _4, _5, _6, _7) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7)
+#define VISIT_STRUCT_APPLYF8(f, _1, _2, _3, _4, _5, _6, _7, _8) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8)
+#define VISIT_STRUCT_APPLYF9(f, _1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9)
+#define VISIT_STRUCT_APPLYF10(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10)
+#define VISIT_STRUCT_APPLYF11(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11)
+#define VISIT_STRUCT_APPLYF12(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12)
+#define VISIT_STRUCT_APPLYF13(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13)
+#define VISIT_STRUCT_APPLYF14(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14)
+#define VISIT_STRUCT_APPLYF15(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15)
+#define VISIT_STRUCT_APPLYF16(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16)
+#define VISIT_STRUCT_APPLYF17(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17)
+#define VISIT_STRUCT_APPLYF18(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18)
+#define VISIT_STRUCT_APPLYF19(f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19)
+#define VISIT_STRUCT_APPLYF20( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20)
+#define VISIT_STRUCT_APPLYF21( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21)
+#define VISIT_STRUCT_APPLYF22( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22)
+#define VISIT_STRUCT_APPLYF23( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23)
+#define VISIT_STRUCT_APPLYF24( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24)
+#define VISIT_STRUCT_APPLYF25( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25)
+#define VISIT_STRUCT_APPLYF26( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26)
+#define VISIT_STRUCT_APPLYF27( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27)
+#define VISIT_STRUCT_APPLYF28( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28)
+#define VISIT_STRUCT_APPLYF29( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29)
+#define VISIT_STRUCT_APPLYF30( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30)
+#define VISIT_STRUCT_APPLYF31( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31)
+#define VISIT_STRUCT_APPLYF32( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32)
+#define VISIT_STRUCT_APPLYF33( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17 \
+ ) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33)
+#define VISIT_STRUCT_APPLYF34( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34)
+#define VISIT_STRUCT_APPLYF35( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35)
+#define VISIT_STRUCT_APPLYF36( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36)
+#define VISIT_STRUCT_APPLYF37( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37)
+#define VISIT_STRUCT_APPLYF38( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38)
+#define VISIT_STRUCT_APPLYF39( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39)
+#define VISIT_STRUCT_APPLYF40( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40)
+#define VISIT_STRUCT_APPLYF41( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41)
+#define VISIT_STRUCT_APPLYF42( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42)
+#define VISIT_STRUCT_APPLYF43( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43)
+#define VISIT_STRUCT_APPLYF44( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44)
+#define VISIT_STRUCT_APPLYF45( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45)
+#define VISIT_STRUCT_APPLYF46( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46)
+#define VISIT_STRUCT_APPLYF47( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47)
+#define VISIT_STRUCT_APPLYF48( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48)
+#define VISIT_STRUCT_APPLYF49( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49)
+#define VISIT_STRUCT_APPLYF50( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50)
+#define VISIT_STRUCT_APPLYF51( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51)
+#define VISIT_STRUCT_APPLYF52( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52)
+#define VISIT_STRUCT_APPLYF53( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53)
+#define VISIT_STRUCT_APPLYF54( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54)
+#define VISIT_STRUCT_APPLYF55( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55)
+#define VISIT_STRUCT_APPLYF56( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56)
+#define VISIT_STRUCT_APPLYF57( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57)
+#define VISIT_STRUCT_APPLYF58( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58)
+#define VISIT_STRUCT_APPLYF59( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59)
+#define VISIT_STRUCT_APPLYF60( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60)
+#define VISIT_STRUCT_APPLYF61( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61)
+#define VISIT_STRUCT_APPLYF62( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \
+ f(_62)
+#define VISIT_STRUCT_APPLYF63( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \
+ f(_62) f(_63)
+#define VISIT_STRUCT_APPLYF64( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \
+ f(_62) f(_63) f(_64)
+#define VISIT_STRUCT_APPLYF65( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \
+ f(_62) f(_63) f(_64) f(_65)
+#define VISIT_STRUCT_APPLYF66( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \
+ f(_62) f(_63) f(_64) f(_65) f(_66)
+#define VISIT_STRUCT_APPLYF67( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66, _67 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \
+ f(_62) f(_63) f(_64) f(_65) f(_66) f(_67)
+#define VISIT_STRUCT_APPLYF68( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66, _67, _68 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \
+ f(_62) f(_63) f(_64) f(_65) f(_66) f(_67) f(_68)
+#define VISIT_STRUCT_APPLYF69( \
+ f, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \
+ _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, \
+ _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66, _67, _68, _69 \
+) \
+ f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) \
+ f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) \
+ f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) \
+ f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) \
+ f(_62) f(_63) f(_64) f(_65) f(_66) f(_67) f(_68) f(_69)
#define VISIT_STRUCT_APPLY_F_(M, ...) VISIT_STRUCT_EXPAND(M(__VA_ARGS__))
-#define MACRO_MAP(f, ...) VISIT_STRUCT_EXPAND(VISIT_STRUCT_APPLY_F_(VISIT_STRUCT_CONCAT(VISIT_STRUCT_APPLYF, VISIT_STRUCT_PP_NARG(__VA_ARGS__)), f, __VA_ARGS__))
+#define MACRO_MAP(f, ...) \
+ VISIT_STRUCT_EXPAND(VISIT_STRUCT_APPLY_F_( \
+ VISIT_STRUCT_CONCAT(VISIT_STRUCT_APPLYF, VISIT_STRUCT_PP_NARG(__VA_ARGS__)), f, __VA_ARGS__ \
+ ))
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/message.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/message.h
index 57f4932520..4a0c79922c 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/message.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/message.h
@@ -9,26 +9,23 @@
struct LspMessage
{
public:
- std::string jsonrpc = "2.0";
- virtual void ReflectWriter(Writer&) = 0;
+ std::string jsonrpc = "2.0";
+ virtual void ReflectWriter(Writer&) = 0;
- // Send the message to the language client by writing it to stdout.
- void Write(std::ostream& out);
+ // Send the message to the language client by writing it to stdout.
+ void Write(std::ostream& out);
+ virtual MethodType GetMethodType() const = 0;
+ virtual void SetMethodType(MethodType) = 0;
- virtual MethodType GetMethodType() const = 0;
- virtual void SetMethodType(MethodType) = 0;
-
- virtual ~LspMessage()=default;
- enum Kind
- {
- REQUEST_MESSAGE,
- RESPONCE_MESSAGE,
- NOTIFICATION_MESSAGE
- };
-
- virtual Kind GetKid() = 0;
- virtual std::string ToJson() ;
+ virtual ~LspMessage() = default;
+ enum Kind
+ {
+ REQUEST_MESSAGE,
+ RESPONCE_MESSAGE,
+ NOTIFICATION_MESSAGE
+ };
+ virtual Kind GetKid() = 0;
+ virtual std::string ToJson();
};
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/serializer.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/serializer.h
index 1763c84f5f..31d0b27640 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/serializer.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/serializer.h
@@ -15,129 +15,138 @@
struct AbsolutePath;
-enum class SerializeFormat { Json, MessagePack };
+enum class SerializeFormat
+{
+ Json,
+ MessagePack
+};
// A tag type that can be used to write `null` to json.
struct JsonNull
{
- void swap(JsonNull& arg) noexcept;
+ void swap(JsonNull& arg) noexcept;
};
-
-
-class Reader {
+class Reader
+{
public:
- virtual ~Reader() {}
- virtual SerializeFormat Format() const = 0;
-
- virtual bool IsBool() = 0;
- virtual bool IsNull() = 0;
- virtual bool IsArray() = 0;
- virtual bool IsInt() = 0;
- virtual bool IsInt64() = 0;
- virtual bool IsUint64() = 0;
- virtual bool IsDouble() = 0;
+ virtual ~Reader()
+ {
+ }
+ virtual SerializeFormat Format() const = 0;
+
+ virtual bool IsBool() = 0;
+ virtual bool IsNull() = 0;
+ virtual bool IsArray() = 0;
+ virtual bool IsInt() = 0;
+ virtual bool IsInt64() = 0;
+ virtual bool IsUint64() = 0;
+ virtual bool IsDouble() = 0;
virtual bool IsNumber() = 0;
virtual bool IsString() = 0;
- virtual void GetNull() = 0;
- virtual bool GetBool() = 0;
- virtual int GetInt() = 0;
- virtual uint32_t GetUint32() = 0;
- virtual int64_t GetInt64() = 0;
- virtual uint64_t GetUint64() = 0;
- virtual double GetDouble() = 0;
- virtual std::string GetString() = 0;
-
- virtual bool HasMember(const char* x) = 0;
- virtual std::unique_ptr<Reader> operator[](const char* x) = 0;
- virtual void IterMap( std::function<void(const char*, Reader&)> fn) = 0;
- virtual void IterArray(std::function<void(Reader&)> fn) = 0;
- virtual void DoMember(const char* name, std::function<void(Reader&)> fn) = 0;
- virtual std::string ToString() const = 0;
+ virtual void GetNull() = 0;
+ virtual bool GetBool() = 0;
+ virtual int GetInt() = 0;
+ virtual uint32_t GetUint32() = 0;
+ virtual int64_t GetInt64() = 0;
+ virtual uint64_t GetUint64() = 0;
+ virtual double GetDouble() = 0;
+ virtual std::string GetString() = 0;
+
+ virtual bool HasMember(char const* x) = 0;
+ virtual std::unique_ptr<Reader> operator[](char const* x) = 0;
+ virtual void IterMap(std::function<void(char const*, Reader&)> fn) = 0;
+ virtual void IterArray(std::function<void(Reader&)> fn) = 0;
+ virtual void DoMember(char const* name, std::function<void(Reader&)> fn) = 0;
+ virtual std::string ToString() const = 0;
};
-
-
-class Writer {
+class Writer
+{
public:
- virtual ~Writer() {}
- virtual SerializeFormat Format() const = 0;
-
- virtual void Null() = 0;
- virtual void Bool(bool x) = 0;
- virtual void Int(int x) = 0;
- virtual void Uint32(uint32_t x) = 0;
- virtual void Int64(int64_t x) = 0;
- virtual void Uint64(uint64_t x) = 0;
- virtual void Double(double x) = 0;
- virtual void String(const char* x) = 0;
- virtual void String(const char* x, size_t len) = 0;
- virtual void StartArray(size_t) = 0;
- virtual void EndArray() = 0;
- virtual void StartObject() = 0;
- virtual void EndObject() = 0;
- virtual void Key(const char* name) = 0;
+ virtual ~Writer()
+ {
+ }
+ virtual SerializeFormat Format() const = 0;
+
+ virtual void Null() = 0;
+ virtual void Bool(bool x) = 0;
+ virtual void Int(int x) = 0;
+ virtual void Uint32(uint32_t x) = 0;
+ virtual void Int64(int64_t x) = 0;
+ virtual void Uint64(uint64_t x) = 0;
+ virtual void Double(double x) = 0;
+ virtual void String(char const* x) = 0;
+ virtual void String(char const* x, size_t len) = 0;
+ virtual void StartArray(size_t) = 0;
+ virtual void EndArray() = 0;
+ virtual void StartObject() = 0;
+ virtual void EndObject() = 0;
+ virtual void Key(char const* name) = 0;
};
-
-
-struct optionals_mandatory_tag {};
+struct optionals_mandatory_tag
+{
+};
#define REFLECT_MEMBER_START() ReflectMemberStart(visitor, value)
#define REFLECT_MEMBER_END() ReflectMemberEnd(visitor, value);
#define REFLECT_MEMBER_END1(value) ReflectMemberEnd(visitor, value);
#define REFLECT_MEMBER(name) ReflectMember(visitor, #name, value.name)
-#define REFLECT_MEMBER_OPTIONALS(name) \
- ReflectMember(visitor, #name, value.name, optionals_mandatory_tag{})
+#define REFLECT_MEMBER_OPTIONALS(name) ReflectMember(visitor, #name, value.name, optionals_mandatory_tag {})
#define REFLECT_MEMBER2(name, value) ReflectMember(visitor, name, value)
-#define MAKE_REFLECT_TYPE_PROXY(type_name) \
- MAKE_REFLECT_TYPE_PROXY2(type_name, std::underlying_type<type_name>::type)
-#define MAKE_REFLECT_TYPE_PROXY2(type, as_type) \
- inline void Reflect(Reader& visitor, type& value) { \
- as_type value0; \
- ::Reflect(visitor, value0); \
- value = static_cast<type>(value0); \
- } \
- inline void Reflect(Writer& visitor, type& value) { \
- auto value0 = static_cast<as_type>(value); \
- ::Reflect(visitor, value0); \
- }
+#define MAKE_REFLECT_TYPE_PROXY(type_name) MAKE_REFLECT_TYPE_PROXY2(type_name, std::underlying_type<type_name>::type)
+#define MAKE_REFLECT_TYPE_PROXY2(type, as_type) \
+ inline void Reflect(Reader& visitor, type& value) \
+ { \
+ as_type value0; \
+ ::Reflect(visitor, value0); \
+ value = static_cast<type>(value0); \
+ } \
+ inline void Reflect(Writer& visitor, type& value) \
+ { \
+ auto value0 = static_cast<as_type>(value); \
+ ::Reflect(visitor, value0); \
+ }
#define _MAPPABLE_REFLECT_MEMBER(name) REFLECT_MEMBER(name);
#define _MAPPABLE_REFLECT_MEMBER_OPTIONALS(name) REFLECT_MEMBER_OPTIONALS(name);
-#define MAKE_REFLECT_EMPTY_STRUCT(type, ...) \
- template <typename TVisitor> \
- void Reflect(TVisitor& visitor, type& value) { \
- REFLECT_MEMBER_START(); \
- REFLECT_MEMBER_END(); \
- }
-
-#define MAKE_REFLECT_STRUCT(type, ...) \
- template <typename TVisitor> \
- void Reflect(TVisitor& visitor, type& value) { \
- REFLECT_MEMBER_START(); \
- MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \
- REFLECT_MEMBER_END(); \
- }
-
-
-#define _MAPPABLE_SWAP_MEMBER(name) std::swap(name,arg.name);
-
-#define MAKE_SWAP_METHOD(type, ...) \
-void swap(type& arg) noexcept{ \
+#define MAKE_REFLECT_EMPTY_STRUCT(type, ...) \
+ template<typename TVisitor> \
+ void Reflect(TVisitor& visitor, type& value) \
+ { \
+ REFLECT_MEMBER_START(); \
+ REFLECT_MEMBER_END(); \
+ }
+
+#define MAKE_REFLECT_STRUCT(type, ...) \
+ template<typename TVisitor> \
+ void Reflect(TVisitor& visitor, type& value) \
+ { \
+ REFLECT_MEMBER_START(); \
+ MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \
+ REFLECT_MEMBER_END(); \
+ }
+
+#define _MAPPABLE_SWAP_MEMBER(name) std::swap(name, arg.name);
+
+#define MAKE_SWAP_METHOD(type, ...) \
+ void swap(type& arg) noexcept \
+ { \
MACRO_MAP(_MAPPABLE_SWAP_MEMBER, __VA_ARGS__) \
-}
+ }
-#define MAKE_REFLECT_STRUCT_OPTIONALS_MANDATORY(type, ...) \
- template <typename TVisitor> \
- void Reflect(TVisitor& visitor, type& value) { \
- REFLECT_MEMBER_START(); \
- MACRO_MAP(_MAPPABLE_REFLECT_MEMBER_OPTIONALS, __VA_ARGS__) \
- REFLECT_MEMBER_END(); \
- }
+#define MAKE_REFLECT_STRUCT_OPTIONALS_MANDATORY(type, ...) \
+ template<typename TVisitor> \
+ void Reflect(TVisitor& visitor, type& value) \
+ { \
+ REFLECT_MEMBER_START(); \
+ MACRO_MAP(_MAPPABLE_REFLECT_MEMBER_OPTIONALS, __VA_ARGS__) \
+ REFLECT_MEMBER_END(); \
+ }
// clang-format off
// Config has many fields, we need to support at least its number of fields.
@@ -150,11 +159,12 @@ void swap(type& arg) noexcept{ \
// Reflects the struct so it is serialized as an array instead of an object.
// This currently only supports writers.
#define MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY(type, ...) \
- inline void Reflect(Writer& visitor, type& value) { \
- visitor.StartArray(NUM_VA_ARGS(__VA_ARGS__)); \
- MACRO_MAP(_MAPPABLE_REFLECT_ARRAY, __VA_ARGS__) \
- visitor.EndArray(); \
- }
+ inline void Reflect(Writer& visitor, type& value) \
+ { \
+ visitor.StartArray(NUM_VA_ARGS(__VA_ARGS__)); \
+ MACRO_MAP(_MAPPABLE_REFLECT_ARRAY, __VA_ARGS__) \
+ visitor.EndArray(); \
+ }
//// Elementary types
@@ -201,172 +211,193 @@ void Reflect(Reader& visitor, SerializeFormat& value);
void Reflect(Writer& visitor, SerializeFormat& value);
//// Type constructors
-template <typename T>
-void Reflect(Reader& visitor, optional<T>& value) {
- if (visitor.IsNull()) {
- visitor.GetNull();
- return;
- }
- T real_value;
- Reflect(visitor, real_value);
- value = std::move(real_value);
-}
-template <typename T>
-void Reflect(Writer& visitor, optional<T>& value) {
- if (value)
- Reflect(visitor, *value);
- else
- visitor.Null();
+template<typename T>
+void Reflect(Reader& visitor, optional<T>& value)
+{
+ if (visitor.IsNull())
+ {
+ visitor.GetNull();
+ return;
+ }
+ T real_value;
+ Reflect(visitor, real_value);
+ value = std::move(real_value);
}
-
-
-template <typename T>
-void ReflectMember(Writer& visitor, const char* name, optional<T>& value) {
- // For TypeScript optional property key?: value in the spec,
- // We omit both key and value if value is std::nullopt (null) for JsonWriter
- // to reduce output. But keep it for other serialization formats.
- if (value || visitor.Format() != SerializeFormat::Json) {
- visitor.Key(name);
- Reflect(visitor, value);
- }
+template<typename T>
+void Reflect(Writer& visitor, optional<T>& value)
+{
+ if (value)
+ {
+ Reflect(visitor, *value);
+ }
+ else
+ {
+ visitor.Null();
+ }
}
-
-template <typename T>
-void ReflectMember(Writer& visitor,
- const char* name,
- T& value,
- optionals_mandatory_tag) {
+template<typename T>
+void ReflectMember(Writer& visitor, char const* name, optional<T>& value)
+{
+ // For TypeScript optional property key?: value in the spec,
+ // We omit both key and value if value is std::nullopt (null) for JsonWriter
+ // to reduce output. But keep it for other serialization formats.
+ if (value || visitor.Format() != SerializeFormat::Json)
+ {
visitor.Key(name);
Reflect(visitor, value);
+ }
}
-template <typename T>
-void ReflectMember(Reader& visitor,
- const char* name,
- T& value,
- optionals_mandatory_tag) {
- Reflect(visitor, value);
+
+template<typename T>
+void ReflectMember(Writer& visitor, char const* name, T& value, optionals_mandatory_tag)
+{
+ visitor.Key(name);
+ Reflect(visitor, value);
+}
+template<typename T>
+void ReflectMember(Reader& visitor, char const* name, T& value, optionals_mandatory_tag)
+{
+ Reflect(visitor, value);
}
-template<class T >
+template<class T>
void Reflect(Reader& visitor, std::map<std::string, T>& value)
{
- visitor.IterMap([&](const char* name,Reader& entry) {
- T entry_value;
- Reflect(entry, entry_value);
- value[name]=(std::move(entry_value));
- });
+ visitor.IterMap(
+ [&](char const* name, Reader& entry)
+ {
+ T entry_value;
+ Reflect(entry, entry_value);
+ value[name] = (std::move(entry_value));
+ }
+ );
}
-template<class _Ty >
+template<class _Ty>
void Reflect(Writer& visitor, std::map<std::string, _Ty>& value)
{
- REFLECT_MEMBER_START();
- for (auto& it : value)
- {
- visitor.Key(it.first.c_str());
- Reflect(visitor, it.second);
- }
- REFLECT_MEMBER_END();
+ REFLECT_MEMBER_START();
+ for (auto& it : value)
+ {
+ visitor.Key(it.first.c_str());
+ Reflect(visitor, it.second);
+ }
+ REFLECT_MEMBER_END();
}
// std::vector
-template <typename T>
-void Reflect(Reader& visitor, std::vector<T>& values) {
- visitor.IterArray([&](Reader& entry) {
- T entry_value;
- Reflect(entry, entry_value);
- values.push_back(std::move(entry_value));
- });
+template<typename T>
+void Reflect(Reader& visitor, std::vector<T>& values)
+{
+ visitor.IterArray(
+ [&](Reader& entry)
+ {
+ T entry_value;
+ Reflect(entry, entry_value);
+ values.push_back(std::move(entry_value));
+ }
+ );
}
-
-template <typename T>
-void Reflect(Writer& visitor, std::vector<T>& values) {
- visitor.StartArray(values.size());
- for (auto& value : values)
- Reflect(visitor, value);
- visitor.EndArray();
+template<typename T>
+void Reflect(Writer& visitor, std::vector<T>& values)
+{
+ visitor.StartArray(values.size());
+ for (auto& value : values)
+ {
+ Reflect(visitor, value);
+ }
+ visitor.EndArray();
}
// ReflectMember
-inline void DefaultReflectMemberStart(Writer& visitor) {
- visitor.StartObject();
+inline void DefaultReflectMemberStart(Writer& visitor)
+{
+ visitor.StartObject();
+}
+inline void DefaultReflectMemberStart(Reader&)
+{
}
-inline void DefaultReflectMemberStart(Reader& visitor) {}
-template <typename T>
-bool ReflectMemberStart(Reader& visitor, T& value) {
- return false;
+template<typename T>
+bool ReflectMemberStart(Reader&, T&)
+{
+ return false;
}
-template <typename T>
-bool ReflectMemberStart(Writer& visitor, T& value) {
- visitor.StartObject();
- return true;
+template<typename T>
+bool ReflectMemberStart(Writer& visitor, T&)
+{
+ visitor.StartObject();
+ return true;
}
-template <typename T>
-void ReflectMemberEnd(Reader& visitor, T& value) {}
-template <typename T>
-void ReflectMemberEnd(Writer& visitor, T& value) {
- visitor.EndObject();
+template<typename T>
+void ReflectMemberEnd(Reader&, T&)
+{
+}
+template<typename T>
+void ReflectMemberEnd(Writer& visitor, T&)
+{
+ visitor.EndObject();
}
-template <typename T>
-void ReflectMember(Reader& visitor, const char* name, T& value) {
- visitor.DoMember(name, [&](Reader& child) { Reflect(child, value); });
+template<typename T>
+void ReflectMember(Reader& visitor, char const* name, T& value)
+{
+ visitor.DoMember(name, [&](Reader& child) { Reflect(child, value); });
}
-template <typename T>
-void ReflectMember(Writer& visitor, const char* name, T& value) {
- visitor.Key(name);
- Reflect(visitor, value);
+template<typename T>
+void ReflectMember(Writer& visitor, char const* name, T& value)
+{
+ visitor.Key(name);
+ Reflect(visitor, value);
}
template<class _Ty1, class _Ty2>
-void Reflect(Writer& visitor, std::pair< optional<_Ty1>, optional<_Ty2> >& value)
+void Reflect(Writer& visitor, std::pair<optional<_Ty1>, optional<_Ty2>>& value)
{
- if (value.first)
- {
- Reflect(visitor, value.first);
- }
- else
- {
- Reflect(visitor, value.second);
- }
+ if (value.first)
+ {
+ Reflect(visitor, value.first);
+ }
+ else
+ {
+ Reflect(visitor, value.second);
+ }
}
template<class _Ty2>
-void Reflect(Reader& visitor, std::pair< optional<bool>, optional<_Ty2> >& value)
+void Reflect(Reader& visitor, std::pair<optional<bool>, optional<_Ty2>>& value)
{
- if(visitor.IsBool())
- {
- Reflect(visitor, value.first);
- return;
- }
+ if (visitor.IsBool())
+ {
+ Reflect(visitor, value.first);
+ return;
+ }
- Reflect(visitor, value.second);
+ Reflect(visitor, value.second);
}
template<class _Ty2>
-void Reflect(Reader& visitor, std::pair< optional<std::string>, optional<_Ty2> >& value)
+void Reflect(Reader& visitor, std::pair<optional<std::string>, optional<_Ty2>>& value)
{
- if (visitor.IsString())
- {
- Reflect(visitor, value.first);
- return;
- }
+ if (visitor.IsString())
+ {
+ Reflect(visitor, value.first);
+ return;
+ }
- Reflect(visitor, value.second);
+ Reflect(visitor, value.second);
}
-
template<class _Ty1, class _Ty2>
-void Reflect(Reader& visitor, std::pair< optional<_Ty1>, optional<_Ty2> >& value)
+void Reflect(Reader& visitor, std::pair<optional<_Ty1>, optional<_Ty2>>& value)
{
- try
- {
- Reflect(visitor, value.second);
- }
- catch (...)
- {
- Reflect(visitor, value.first);
- }
+ try
+ {
+ Reflect(visitor, value.second);
+ }
+ catch (...)
+ {
+ Reflect(visitor, value.first);
+ }
}
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/stream.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/stream.h
index 3dd3def993..e702ea8547 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/stream.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/stream.h
@@ -3,194 +3,192 @@
#include <string>
namespace lsp
{
- class stream
- {
- public:
- virtual ~stream() = default;
- virtual bool fail() = 0;
- virtual bool bad() = 0;
- virtual bool eof() = 0;
- virtual bool good() = 0;
- virtual void clear() = 0;
- virtual std::string what() = 0;
- virtual bool need_to_clear_the_state()
- {
- return false;
- }
-
- bool operator!()
- {
- return bad();
- }
- };
- class istream : public stream
- {
- public:
- virtual int get() = 0;
- virtual ~istream() = default;
- virtual istream& read(char* str, std::streamsize count) = 0;
- };
- template <class T >
- class base_istream : public istream
- {
- public:
- explicit base_istream(T& _t) :_impl(_t)
- {
-
- }
-
- int get() override
- {
- return _impl.get();
- }
- bool fail() override
- {
- return _impl.fail();
- }
- bool bad() override
- {
- return _impl.bad();
- }
- bool eof() override
- {
- return _impl.eof();
- }
- bool good() override
- {
- return _impl.good();
- }
- istream& read(char* str, std::streamsize count) override
- {
- _impl.read(str, count);
- return *this;
- }
-
- void clear() override
- {
- _impl.clear();
- }
- T& _impl;
- };
- class ostream : public stream
- {
- public:
- virtual ~ostream() = default;
-
- virtual ostream& write(const std::string&) = 0;
- virtual ostream& write(std::streamsize) = 0;
- virtual ostream& flush() = 0;
-
- };
- template <class T >
- class base_ostream : public ostream
- {
- public:
- explicit base_ostream(T& _t) :_impl(_t)
- {
-
- }
-
- bool fail() override
- {
- return _impl.fail();
- }
- bool good() override
- {
- return _impl.good();
- }
- bool bad() override
- {
- return _impl.bad();
- }
- bool eof() override
- {
- return _impl.eof();
- }
-
- ostream& write(const std::string& c) override
- {
- _impl << c;
- return *this;
- }
-
- ostream& write(std::streamsize _s) override
- {
-
- _impl << std::to_string(_s);
- return *this;
- }
-
- ostream& flush() override
- {
- _impl.flush();
- return *this;
- }
-
- void clear() override
- {
- _impl.clear();
- }
- protected:
- T& _impl;
- };
-
- template <class T >
- class base_iostream : public istream, public ostream
- {
- public:
- explicit base_iostream(T& _t) :_impl(_t)
- {
-
- }
-
- int get() override
- {
- return _impl.get();
- }
- bool fail() override
- {
- return _impl.fail();
- }
- bool bad() override
- {
- return _impl.bad();
- }
- bool eof() override
- {
- return _impl.eof();
- }
- bool good() override
- {
- return _impl.good();
- }
- istream& read(char* str, std::streamsize count) override
- {
- _impl.read(str, count);
- return *this;
- }
- ostream& write(const std::string& c) override
- {
- _impl << c;
- return *this;
- }
-
- ostream& write(std::streamsize _s) override
- {
- _impl << std::to_string(_s);
- return *this;
- }
-
- ostream& flush() override
- {
- _impl.flush();
- return *this;
- }
-
- void clear() override
- {
- _impl.clear();
- }
- protected:
- T& _impl;
- };
-}
+class stream
+{
+public:
+ virtual ~stream() = default;
+ virtual bool fail() = 0;
+ virtual bool bad() = 0;
+ virtual bool eof() = 0;
+ virtual bool good() = 0;
+ virtual void clear() = 0;
+ virtual std::string what() = 0;
+ virtual bool need_to_clear_the_state()
+ {
+ return false;
+ }
+
+ bool operator!()
+ {
+ return bad();
+ }
+};
+class istream : public stream
+{
+public:
+ virtual int get() = 0;
+ virtual ~istream() = default;
+ virtual istream& read(char* str, std::streamsize count) = 0;
+};
+template<class T>
+class base_istream : public istream
+{
+public:
+ explicit base_istream(T& _t) : _impl(_t)
+ {
+ }
+
+ int get() override
+ {
+ return _impl.get();
+ }
+ bool fail() override
+ {
+ return _impl.fail();
+ }
+ bool bad() override
+ {
+ return _impl.bad();
+ }
+ bool eof() override
+ {
+ return _impl.eof();
+ }
+ bool good() override
+ {
+ return _impl.good();
+ }
+ istream& read(char* str, std::streamsize count) override
+ {
+ _impl.read(str, count);
+ return *this;
+ }
+
+ void clear() override
+ {
+ _impl.clear();
+ }
+ T& _impl;
+};
+class ostream : public stream
+{
+public:
+ virtual ~ostream() = default;
+
+ virtual ostream& write(std::string const&) = 0;
+ virtual ostream& write(std::streamsize) = 0;
+ virtual ostream& flush() = 0;
+};
+template<class T>
+class base_ostream : public ostream
+{
+public:
+ explicit base_ostream(T& _t) : _impl(_t)
+ {
+ }
+
+ bool fail() override
+ {
+ return _impl.fail();
+ }
+ bool good() override
+ {
+ return _impl.good();
+ }
+ bool bad() override
+ {
+ return _impl.bad();
+ }
+ bool eof() override
+ {
+ return _impl.eof();
+ }
+
+ ostream& write(std::string const& c) override
+ {
+ _impl << c;
+ return *this;
+ }
+
+ ostream& write(std::streamsize _s) override
+ {
+
+ _impl << std::to_string(_s);
+ return *this;
+ }
+
+ ostream& flush() override
+ {
+ _impl.flush();
+ return *this;
+ }
+
+ void clear() override
+ {
+ _impl.clear();
+ }
+
+protected:
+ T& _impl;
+};
+
+template<class T>
+class base_iostream : public istream, public ostream
+{
+public:
+ explicit base_iostream(T& _t) : _impl(_t)
+ {
+ }
+
+ int get() override
+ {
+ return _impl.get();
+ }
+ bool fail() override
+ {
+ return _impl.fail();
+ }
+ bool bad() override
+ {
+ return _impl.bad();
+ }
+ bool eof() override
+ {
+ return _impl.eof();
+ }
+ bool good() override
+ {
+ return _impl.good();
+ }
+ istream& read(char* str, std::streamsize count) override
+ {
+ _impl.read(str, count);
+ return *this;
+ }
+ ostream& write(std::string const& c) override
+ {
+ _impl << c;
+ return *this;
+ }
+
+ ostream& write(std::streamsize _s) override
+ {
+ _impl << std::to_string(_s);
+ return *this;
+ }
+
+ ostream& flush() override
+ {
+ _impl.flush();
+ return *this;
+ }
+
+ void clear() override
+ {
+ _impl.clear();
+ }
+
+protected:
+ T& _impl;
+};
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/threaded_queue.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/threaded_queue.h
index e8fc6d13ea..9680058370 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/threaded_queue.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/threaded_queue.h
@@ -15,236 +15,307 @@
struct MultiQueueWaiter;
-struct BaseThreadQueue {
- virtual ~BaseThreadQueue() = default;
+struct BaseThreadQueue
+{
+ virtual ~BaseThreadQueue() = default;
- virtual bool IsEmpty() = 0;
+ virtual bool IsEmpty() = 0;
- std::shared_ptr<MultiQueueWaiter> waiter;
+ std::shared_ptr<MultiQueueWaiter> waiter;
};
// std::lock accepts two or more arguments. We define an overload for one
// argument.
-namespace std {
-template <typename Lockable>
-void lock(Lockable& l) {
- l.lock();
+namespace std
+{
+template<typename Lockable>
+void lock(Lockable& l)
+{
+ l.lock();
}
-} // namespace std
-
-template <typename... Queue>
-struct MultiQueueLock {
- MultiQueueLock(Queue... lockable) : tuple_{lockable...} { lock(); }
- ~MultiQueueLock() { unlock(); }
- void lock() { lock_impl(typename std::index_sequence_for<Queue...>{}); }
- void unlock() { unlock_impl(typename std::index_sequence_for<Queue...>{}); }
-
- private:
- template <size_t... Is>
- void lock_impl(std::index_sequence<Is...>) {
- std::lock(std::get<Is>(tuple_)->mutex...);
- }
-
- template <size_t... Is>
- void unlock_impl(std::index_sequence<Is...>) {
- (void)std::initializer_list<int>{
- (std::get<Is>(tuple_)->mutex.unlock(), 0)...};
- }
-
- std::tuple<Queue...> tuple_;
+} // namespace std
+
+template<typename... Queue>
+struct MultiQueueLock
+{
+ MultiQueueLock(Queue... lockable) : tuple_ {lockable...}
+ {
+ lock();
+ }
+ ~MultiQueueLock()
+ {
+ unlock();
+ }
+ void lock()
+ {
+ lock_impl(typename std::index_sequence_for<Queue...> {});
+ }
+ void unlock()
+ {
+ unlock_impl(typename std::index_sequence_for<Queue...> {});
+ }
+
+private:
+ template<size_t... Is>
+ void lock_impl(std::index_sequence<Is...>)
+ {
+ std::lock(std::get<Is>(tuple_)->mutex...);
+ }
+
+ template<size_t... Is>
+ void unlock_impl(std::index_sequence<Is...>)
+ {
+ (void)std::initializer_list<int> {(std::get<Is>(tuple_)->mutex.unlock(), 0)...};
+ }
+
+ std::tuple<Queue...> tuple_;
};
-struct MultiQueueWaiter {
- static bool HasState(std::initializer_list<BaseThreadQueue*> queues);
-
- bool ValidateWaiter(std::initializer_list<BaseThreadQueue*> queues);
-
- template <typename... BaseThreadQueue>
- bool Wait(std::atomic<bool>& quit, BaseThreadQueue... queues) {
- MultiQueueLock<BaseThreadQueue...> l(queues...);
- while (!quit.load(std::memory_order_relaxed)) {
- if (HasState({ queues... }))
- return false;
- cv.wait(l);
- }
- return true;
- }
- template <typename... BaseThreadQueue>
- void WaitUntil(std::chrono::steady_clock::time_point t,
- BaseThreadQueue... queues) {
- MultiQueueLock<BaseThreadQueue...> l(queues...);
- if (!HasState({ queues... }))
- cv.wait_until(l, t);
- }
- template <typename... BaseThreadQueue>
- void Wait(BaseThreadQueue... queues) {
- assert(ValidateWaiter({queues...}));
-
- MultiQueueLock<BaseThreadQueue...> l(queues...);
- while (!HasState({queues...}))
- cv.wait(l);
- }
-
- std::condition_variable_any cv;
+struct MultiQueueWaiter
+{
+ static bool HasState(std::initializer_list<BaseThreadQueue*> queues);
+
+ bool ValidateWaiter(std::initializer_list<BaseThreadQueue*> queues);
+
+ template<typename... BaseThreadQueue>
+ bool Wait(std::atomic<bool>& quit, BaseThreadQueue... queues)
+ {
+ MultiQueueLock<BaseThreadQueue...> l(queues...);
+ while (!quit.load(std::memory_order_relaxed))
+ {
+ if (HasState({queues...}))
+ {
+ return false;
+ }
+ cv.wait(l);
+ }
+ return true;
+ }
+ template<typename... BaseThreadQueue>
+ void WaitUntil(std::chrono::steady_clock::time_point t, BaseThreadQueue... queues)
+ {
+ MultiQueueLock<BaseThreadQueue...> l(queues...);
+ if (!HasState({queues...}))
+ {
+ cv.wait_until(l, t);
+ }
+ }
+ template<typename... BaseThreadQueue>
+ void Wait(BaseThreadQueue... queues)
+ {
+ assert(ValidateWaiter({queues...}));
+
+ MultiQueueLock<BaseThreadQueue...> l(queues...);
+ while (!HasState({queues...}))
+ {
+ cv.wait(l);
+ }
+ }
+
+ std::condition_variable_any cv;
};
// A threadsafe-queue. http://stackoverflow.com/a/16075550
-template <class T>
-struct ThreadedQueue : public BaseThreadQueue {
- public:
- ThreadedQueue() : ThreadedQueue(std::make_shared<MultiQueueWaiter>()) {}
+template<class T>
+struct ThreadedQueue : public BaseThreadQueue
+{
+public:
+ ThreadedQueue() : ThreadedQueue(std::make_shared<MultiQueueWaiter>())
+ {
+ }
- explicit ThreadedQueue(std::shared_ptr<MultiQueueWaiter> waiter)
- : total_count_(0) {
- this->waiter = waiter;
- }
+ explicit ThreadedQueue(std::shared_ptr<MultiQueueWaiter> waiter) : total_count_(0)
+ {
+ this->waiter = waiter;
+ }
- // Returns the number of elements in the queue. This is lock-free.
- size_t Size() const { return total_count_; }
+ // Returns the number of elements in the queue. This is lock-free.
+ size_t Size() const
+ {
+ return total_count_;
+ }
- // Add an element to the queue.
- void Enqueue(T&& t, bool priority) {
+ // Add an element to the queue.
+ void Enqueue(T&& t, bool priority)
{
- std::lock_guard<std::mutex> lock(mutex);
- if (priority)
- priority_.push_back(std::move(t));
- else
- queue_.push_back(std::move(t));
- ++total_count_;
+ {
+ std::lock_guard<std::mutex> lock(mutex);
+ if (priority)
+ {
+ priority_.push_back(std::move(t));
+ }
+ else
+ {
+ queue_.push_back(std::move(t));
+ }
+ ++total_count_;
+ }
+ waiter->cv.notify_one();
}
- waiter->cv.notify_one();
- }
- // Add a set of elements to the queue.
- void EnqueueAll(std::vector<T>&& elements, bool priority) {
- if (elements.empty())
- return;
+ // Add a set of elements to the queue.
+ void EnqueueAll(std::vector<T>&& elements, bool priority)
+ {
+ if (elements.empty())
+ {
+ return;
+ }
+
+ {
+ std::lock_guard<std::mutex> lock(mutex);
+ total_count_ += elements.size();
+ for (T& element : elements)
+ {
+ if (priority)
+ {
+ priority_.push_back(std::move(element));
+ }
+ else
+ {
+ queue_.push_back(std::move(element));
+ }
+ }
+ elements.clear();
+ }
+
+ waiter->cv.notify_all();
+ }
+
+ // Returns true if the queue is empty. This is lock-free.
+ bool IsEmpty()
+ {
+ return total_count_ == 0;
+ }
+ // Get the first element from the queue. Blocks until one is available.
+ T Dequeue()
{
- std::lock_guard<std::mutex> lock(mutex);
- total_count_ += elements.size();
- for (T& element : elements) {
+ std::unique_lock<std::mutex> lock(mutex);
+ waiter->cv.wait(lock, [&]() { return !priority_.empty() || !queue_.empty(); });
+
+ auto execute = [&](std::deque<T>* q)
+ {
+ auto val = std::move(q->front());
+ q->pop_front();
+ --total_count_;
+ return std::move(val);
+ };
+ if (!priority_.empty())
+ {
+ return execute(&priority_);
+ }
+ return execute(&queue_);
+ }
+
+ // Get the first element from the queue without blocking. Returns a null
+ // value if the queue is empty.
+ optional<T> TryDequeue(bool priority)
+ {
+ std::lock_guard<std::mutex> lock(mutex);
+
+ auto pop = [&](std::deque<T>* q)
+ {
+ auto val = std::move(q->front());
+ q->pop_front();
+ --total_count_;
+ return std::move(val);
+ };
+
+ auto get_result = [&](std::deque<T>* first, std::deque<T>* second) -> optional<T>
+ {
+ if (!first->empty())
+ {
+ return pop(first);
+ }
+ if (!second->empty())
+ {
+ return pop(second);
+ }
+ return {};
+ };
+
if (priority)
- priority_.push_back(std::move(element));
- else
- queue_.push_back(std::move(element));
- }
- elements.clear();
- }
-
- waiter->cv.notify_all();
- }
-
- // Returns true if the queue is empty. This is lock-free.
- bool IsEmpty() { return total_count_ == 0; }
-
- // Get the first element from the queue. Blocks until one is available.
- T Dequeue() {
- std::unique_lock<std::mutex> lock(mutex);
- waiter->cv.wait(lock,
- [&]() { return !priority_.empty() || !queue_.empty(); });
-
- auto execute = [&](std::deque<T>* q) {
- auto val = std::move(q->front());
- q->pop_front();
- --total_count_;
- return std::move(val);
- };
- if (!priority_.empty())
- return execute(&priority_);
- return execute(&queue_);
- }
-
- // Get the first element from the queue without blocking. Returns a null
- // value if the queue is empty.
- optional<T> TryDequeue(bool priority) {
- std::lock_guard<std::mutex> lock(mutex);
-
- auto pop = [&](std::deque<T>* q) {
- auto val = std::move(q->front());
- q->pop_front();
- --total_count_;
- return std::move(val);
- };
-
- auto get_result = [&](std::deque<T>* first,
- std::deque<T>* second) -> optional<T> {
- if (!first->empty())
- return pop(first);
- if (!second->empty())
- return pop(second);
- return {};
- };
-
- if (priority)
- return get_result(&priority_, &queue_);
- return get_result(&queue_, &priority_);
- }
- // Return all elements in the queue.
- std::vector<T> DequeueAll() {
- std::lock_guard<std::mutex> lock(mutex);
-
- total_count_ = 0;
-
- std::vector<T> result;
- result.reserve(priority_.size() + queue_.size());
- while (!priority_.empty()) {
- result.emplace_back(std::move(priority_.front()));
- priority_.pop_front();
- }
- while (!queue_.empty()) {
- result.emplace_back(std::move(queue_.front()));
- queue_.pop_front();
- }
-
- return result;
- }
- std::vector<T> TryDequeueSome(size_t num) {
- std::lock_guard<std::mutex> lock(mutex);
-
- std::vector<T> result;
- num = std::min(num, priority_.size() + queue_.size());
- total_count_ -= num;
- result.reserve(num);
- while (num)
- {
- if(!priority_.empty()) {
- result.emplace_back(std::move(priority_.front()));
- priority_.pop_front();
- }
- else
- {
- break;
- }
- num -= 1;
- }
- while (num)
- {
- if (!queue_.empty()) {
- result.emplace_back(std::move(queue_.front()));
- queue_.pop_front();
- }
- else
- {
- break;
- }
- num -= 1;
- }
- return result;
- }
- template <typename Fn>
- void Iterate(Fn fn) {
- std::lock_guard<std::mutex> lock(mutex);
- for (auto& entry : priority_)
- fn(entry);
- for (auto& entry : queue_)
- fn(entry);
- }
-
- mutable std::mutex mutex;
-
- private:
- std::atomic<int> total_count_;
- std::deque<T> priority_;
- std::deque<T> queue_;
+ {
+ return get_result(&priority_, &queue_);
+ }
+ return get_result(&queue_, &priority_);
+ }
+ // Return all elements in the queue.
+ std::vector<T> DequeueAll()
+ {
+ std::lock_guard<std::mutex> lock(mutex);
+
+ total_count_ = 0;
+
+ std::vector<T> result;
+ result.reserve(priority_.size() + queue_.size());
+ while (!priority_.empty())
+ {
+ result.emplace_back(std::move(priority_.front()));
+ priority_.pop_front();
+ }
+ while (!queue_.empty())
+ {
+ result.emplace_back(std::move(queue_.front()));
+ queue_.pop_front();
+ }
+
+ return result;
+ }
+ std::vector<T> TryDequeueSome(size_t num)
+ {
+ std::lock_guard<std::mutex> lock(mutex);
+
+ std::vector<T> result;
+ num = std::min(num, priority_.size() + queue_.size());
+ total_count_ -= num;
+ result.reserve(num);
+ while (num)
+ {
+ if (!priority_.empty())
+ {
+ result.emplace_back(std::move(priority_.front()));
+ priority_.pop_front();
+ }
+ else
+ {
+ break;
+ }
+ num -= 1;
+ }
+ while (num)
+ {
+ if (!queue_.empty())
+ {
+ result.emplace_back(std::move(queue_.front()));
+ queue_.pop_front();
+ }
+ else
+ {
+ break;
+ }
+ num -= 1;
+ }
+ return result;
+ }
+ template<typename Fn>
+ void Iterate(Fn fn)
+ {
+ std::lock_guard<std::mutex> lock(mutex);
+ for (auto& entry : priority_)
+ {
+ fn(entry);
+ }
+ for (auto& entry : queue_)
+ {
+ fn(entry);
+ }
+ }
+
+ mutable std::mutex mutex;
+
+private:
+ std::atomic<int> total_count_;
+ std::deque<T> priority_;
+ std::deque<T> queue_;
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/traits.h b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/traits.h
index ce8905a840..32249af8c9 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/traits.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/traits.h
@@ -14,145 +14,145 @@
#pragma once
-
#include <tuple>
#include <type_traits>
-namespace lsp {
-namespace traits {
-
-// NthTypeOf returns the `N`th type in `Types`
-template <int N, typename... Types>
-using NthTypeOf = typename std::tuple_element<N, std::tuple<Types...>>::type;
-
-// `IsTypeOrDerived<BASE, T>::value` is true iff `T` is of type `BASE`, or
-// derives from `BASE`.
-template <typename BASE, typename T>
-using IsTypeOrDerived = std::integral_constant<
- bool,
- std::is_base_of<BASE, typename std::decay<T>::type>::value ||
- std::is_same<BASE, typename std::decay<T>::type>::value>;
-
-// `EachIsTypeOrDerived<N, BASES, TYPES>::value` is true iff all of the types in
-// the std::tuple `TYPES` is of, or derives from the corresponding indexed type
-// in the std::tuple `BASES`.
-// `N` must be equal to the number of types in both the std::tuple `BASES` and
-// `TYPES`.
-template <int N, typename BASES, typename TYPES>
-struct EachIsTypeOrDerived {
- using base = typename std::tuple_element<N - 1, BASES>::type;
- using type = typename std::tuple_element<N - 1, TYPES>::type;
- using last_matches = IsTypeOrDerived<base, type>;
- using others_match = EachIsTypeOrDerived<N - 1, BASES, TYPES>;
- static constexpr bool value = last_matches::value && others_match::value;
-};
-
-// EachIsTypeOrDerived specialization for N = 1
-template <typename BASES, typename TYPES>
-struct EachIsTypeOrDerived<1, BASES, TYPES> {
- using base = typename std::tuple_element<0, BASES>::type;
- using type = typename std::tuple_element<0, TYPES>::type;
- static constexpr bool value = IsTypeOrDerived<base, type>::value;
-};
-
-// EachIsTypeOrDerived specialization for N = 0
-template <typename BASES, typename TYPES>
-struct EachIsTypeOrDerived<0, BASES, TYPES> {
- static constexpr bool value = true;
-};
-
-// Signature describes the signature of a function.
-template <typename RETURN, typename... PARAMETERS>
-struct Signature {
- // The return type of the function signature
- using ret = RETURN;
- // The parameters of the function signature held in a std::tuple
- using parameters = std::tuple<PARAMETERS...>;
- // The type of the Nth parameter of function signature
- template <std::size_t N>
- using parameter = NthTypeOf<N, PARAMETERS...>;
- // The total number of parameters
- static constexpr std::size_t parameter_count = sizeof...(PARAMETERS);
-};
-
-// SignatureOf is a traits helper that infers the signature of the function,
-// method, static method, lambda, or function-like object `F`.
-template <typename F>
-struct SignatureOf {
- // The signature of the function-like object `F`
- using type = typename SignatureOf<decltype(&F::operator())>::type;
-};
-
-// SignatureOf specialization for a regular function or static method.
-template <typename R, typename... ARGS>
-struct SignatureOf<R (*)(ARGS...)> {
- // The signature of the function-like object `F`
- using type = Signature<typename std::decay<R>::type,
- typename std::decay<ARGS>::type...>;
-};
-
-// SignatureOf specialization for a non-static method.
-template <typename R, typename C, typename... ARGS>
-struct SignatureOf<R (C::*)(ARGS...)> {
- // The signature of the function-like object `F`
- using type = Signature<typename std::decay<R>::type,
- typename std::decay<ARGS>::type...>;
-};
-
-// SignatureOf specialization for a non-static, const method.
-template <typename R, typename C, typename... ARGS>
-struct SignatureOf<R (C::*)(ARGS...) const> {
- // The signature of the function-like object `F`
- using type = Signature<typename std::decay<R>::type,
- typename std::decay<ARGS>::type...>;
-};
-
-// SignatureOfT is an alias to `typename SignatureOf<F>::type`.
-template <typename F>
-using SignatureOfT = typename SignatureOf<F>::type;
-
-// ParameterType is an alias to `typename SignatureOf<F>::type::parameter<N>`.
-template <typename F, std::size_t N>
-using ParameterType = typename SignatureOfT<F>::template parameter<N>;
-
-// `HasSignature<F, S>::value` is true iff the function-like `F` has a matching
-// signature to the function-like `S`.
-template <typename F, typename S>
-using HasSignature = std::integral_constant<
- bool,
- std::is_same<SignatureOfT<F>, SignatureOfT<S>>::value>;
-
-// `Min<A, B>::value` resolves to the smaller value of A and B.
-template <std::size_t A, std::size_t B>
-using Min = std::integral_constant<std::size_t, (A < B ? A : B)>;
-
-// `CompatibleWith<F, S>::value` is true iff the function-like `F`
-// can be called with the argument types of the function-like `S`. Return type
-// of the two functions are not considered.
-template <typename F, typename S>
-using CompatibleWith = std::integral_constant<
- bool,
- (SignatureOfT<S>::parameter_count == SignatureOfT<F>::parameter_count) &&
- EachIsTypeOrDerived<Min<SignatureOfT<S>::parameter_count,
- SignatureOfT<F>::parameter_count>::value,
- typename SignatureOfT<S>::parameters,
- typename SignatureOfT<F>::parameters>::value>;
-
-// If `CONDITION` is true then EnableIf resolves to type T, otherwise an
-// invalid type.
-template <bool CONDITION, typename T = void>
-using EnableIf = typename std::enable_if<CONDITION, T>::type;
-
-// If `BASE` is a base of `T` then EnableIfIsType resolves to type `TRUE`,
-// otherwise an invalid type.
-template <typename BASE, typename T, typename TRUE_ = void>
-using EnableIfIsType = EnableIf<IsTypeOrDerived<BASE, T>::value, TRUE_>;
-
-// If the function-like `F` has a matching signature to the function-like `S`
-// then EnableIfHasSignature resolves to type `TRUE`, otherwise an invalid type.
-template <typename F, typename S, typename TRUE_ = void>
-using EnableIfHasSignature = EnableIf<HasSignature<F, S>::value, TRUE_>;
-
-} // namespace traits
-} // namespace lsp
-
+namespace lsp
+{
+namespace traits
+{
+
+ // NthTypeOf returns the `N`th type in `Types`
+ template<int N, typename... Types>
+ using NthTypeOf = typename std::tuple_element<N, std::tuple<Types...>>::type;
+
+ // `IsTypeOrDerived<BASE, T>::value` is true iff `T` is of type `BASE`, or
+ // derives from `BASE`.
+ template<typename BASE, typename T>
+ using IsTypeOrDerived = std::integral_constant<
+ bool, std::is_base_of<BASE, typename std::decay<T>::type>::value
+ || std::is_same<BASE, typename std::decay<T>::type>::value>;
+
+ // `EachIsTypeOrDerived<N, BASES, TYPES>::value` is true iff all of the types in
+ // the std::tuple `TYPES` is of, or derives from the corresponding indexed type
+ // in the std::tuple `BASES`.
+ // `N` must be equal to the number of types in both the std::tuple `BASES` and
+ // `TYPES`.
+ template<int N, typename BASES, typename TYPES>
+ struct EachIsTypeOrDerived
+ {
+ using base = typename std::tuple_element<N - 1, BASES>::type;
+ using type = typename std::tuple_element<N - 1, TYPES>::type;
+ using last_matches = IsTypeOrDerived<base, type>;
+ using others_match = EachIsTypeOrDerived<N - 1, BASES, TYPES>;
+ static constexpr bool value = last_matches::value && others_match::value;
+ };
+
+ // EachIsTypeOrDerived specialization for N = 1
+ template<typename BASES, typename TYPES>
+ struct EachIsTypeOrDerived<1, BASES, TYPES>
+ {
+ using base = typename std::tuple_element<0, BASES>::type;
+ using type = typename std::tuple_element<0, TYPES>::type;
+ static constexpr bool value = IsTypeOrDerived<base, type>::value;
+ };
+
+ // EachIsTypeOrDerived specialization for N = 0
+ template<typename BASES, typename TYPES>
+ struct EachIsTypeOrDerived<0, BASES, TYPES>
+ {
+ static constexpr bool value = true;
+ };
+
+ // Signature describes the signature of a function.
+ template<typename RETURN, typename... PARAMETERS>
+ struct Signature
+ {
+ // The return type of the function signature
+ using ret = RETURN;
+ // The parameters of the function signature held in a std::tuple
+ using parameters = std::tuple<PARAMETERS...>;
+ // The type of the Nth parameter of function signature
+ template<std::size_t N>
+ using parameter = NthTypeOf<N, PARAMETERS...>;
+ // The total number of parameters
+ static constexpr std::size_t parameter_count = sizeof...(PARAMETERS);
+ };
+
+ // SignatureOf is a traits helper that infers the signature of the function,
+ // method, static method, lambda, or function-like object `F`.
+ template<typename F>
+ struct SignatureOf
+ {
+ // The signature of the function-like object `F`
+ using type = typename SignatureOf<decltype(&F::operator())>::type;
+ };
+
+ // SignatureOf specialization for a regular function or static method.
+ template<typename R, typename... ARGS>
+ struct SignatureOf<R (*)(ARGS...)>
+ {
+ // The signature of the function-like object `F`
+ using type = Signature<typename std::decay<R>::type, typename std::decay<ARGS>::type...>;
+ };
+
+ // SignatureOf specialization for a non-static method.
+ template<typename R, typename C, typename... ARGS>
+ struct SignatureOf<R (C::*)(ARGS...)>
+ {
+ // The signature of the function-like object `F`
+ using type = Signature<typename std::decay<R>::type, typename std::decay<ARGS>::type...>;
+ };
+
+ // SignatureOf specialization for a non-static, const method.
+ template<typename R, typename C, typename... ARGS>
+ struct SignatureOf<R (C::*)(ARGS...) const>
+ {
+ // The signature of the function-like object `F`
+ using type = Signature<typename std::decay<R>::type, typename std::decay<ARGS>::type...>;
+ };
+
+ // SignatureOfT is an alias to `typename SignatureOf<F>::type`.
+ template<typename F>
+ using SignatureOfT = typename SignatureOf<F>::type;
+
+ // ParameterType is an alias to `typename SignatureOf<F>::type::parameter<N>`.
+ template<typename F, std::size_t N>
+ using ParameterType = typename SignatureOfT<F>::template parameter<N>;
+
+ // `HasSignature<F, S>::value` is true iff the function-like `F` has a matching
+ // signature to the function-like `S`.
+ template<typename F, typename S>
+ using HasSignature = std::integral_constant<bool, std::is_same<SignatureOfT<F>, SignatureOfT<S>>::value>;
+
+ // `Min<A, B>::value` resolves to the smaller value of A and B.
+ template<std::size_t A, std::size_t B>
+ using Min = std::integral_constant<std::size_t, (A < B ? A : B)>;
+
+ // `CompatibleWith<F, S>::value` is true iff the function-like `F`
+ // can be called with the argument types of the function-like `S`. Return type
+ // of the two functions are not considered.
+ template<typename F, typename S>
+ using CompatibleWith = std::integral_constant<
+ bool, (SignatureOfT<S>::parameter_count == SignatureOfT<F>::parameter_count)
+ && EachIsTypeOrDerived<
+ Min<SignatureOfT<S>::parameter_count, SignatureOfT<F>::parameter_count>::value,
+ typename SignatureOfT<S>::parameters, typename SignatureOfT<F>::parameters>::value>;
+
+ // If `CONDITION` is true then EnableIf resolves to type T, otherwise an
+ // invalid type.
+ template<bool CONDITION, typename T = void>
+ using EnableIf = typename std::enable_if<CONDITION, T>::type;
+
+ // If `BASE` is a base of `T` then EnableIfIsType resolves to type `TRUE`,
+ // otherwise an invalid type.
+ template<typename BASE, typename T, typename TRUE_ = void>
+ using EnableIfIsType = EnableIf<IsTypeOrDerived<BASE, T>::value, TRUE_>;
+
+ // If the function-like `F` has a matching signature to the function-like `S`
+ // then EnableIfHasSignature resolves to type `TRUE`, otherwise an invalid type.
+ template<typename F, typename S, typename TRUE_ = void>
+ using EnableIfHasSignature = EnableIf<HasSignature<F, S>::value, TRUE_>;
+
+} // namespace traits
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/AbsolutePath.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/AbsolutePath.h
index 4f9aae0851..e4a2842386 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/AbsolutePath.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/AbsolutePath.h
@@ -3,25 +3,24 @@
#include <LibLsp/JsonRpc/serializer.h>
#include <string>
-struct AbsolutePath {
- static AbsolutePath BuildDoNotUse(const std::string& path);
-
- // Try not to use this.
- AbsolutePath();
-
- // Provide implicit conversions to std::string for the time being.
- AbsolutePath(const std::string& path, bool validate = true);
- operator std::string() const;
-
- bool operator==(const AbsolutePath& rhs) const;
- bool operator!=(const AbsolutePath& rhs) const;
- bool operator<(const AbsolutePath& rhs) const;
- bool operator>(const AbsolutePath& rhs) const;
- std::string path;
- bool qualify = true;
+struct AbsolutePath
+{
+ static AbsolutePath BuildDoNotUse(std::string const& path);
+
+ // Try not to use this.
+ AbsolutePath();
+
+ // Provide implicit conversions to std::string for the time being.
+ AbsolutePath(std::string const& path, bool validate = true);
+ operator std::string() const;
+
+ bool operator==(AbsolutePath const& rhs) const;
+ bool operator!=(AbsolutePath const& rhs) const;
+ bool operator<(AbsolutePath const& rhs) const;
+ bool operator>(AbsolutePath const& rhs) const;
+ std::string path;
+ bool qualify = true;
};
-
void Reflect(Reader& visitor, AbsolutePath& value);
void Reflect(Writer& visitor, AbsolutePath& value);
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ClientPreferences.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ClientPreferences.h
index c8920e4492..4785c39173 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ClientPreferences.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ClientPreferences.h
@@ -8,303 +8,373 @@
class ClientPreferences
{
public:
+ std::shared_ptr<lsWorkspaceClientCapabilites> workspace;
+ lsTextDocumentClientCapabilities textDocument;
- std::shared_ptr<lsWorkspaceClientCapabilites> workspace;
- lsTextDocumentClientCapabilities textDocument ;
-
- ClientPreferences(const lsClientCapabilities& capabilities)
+ ClientPreferences(lsClientCapabilities const& capabilities)
+ {
+ v3supported = capabilities.textDocument.has_value();
+ if (v3supported)
{
- v3supported = capabilities.textDocument.has_value();
- if (v3supported)
- textDocument = capabilities.textDocument.value();
- if(capabilities.workspace)
- {
- workspace = std::make_shared<lsWorkspaceClientCapabilites>(capabilities.workspace.value());
- }
- }
-
- bool v3supported=false;
-
- bool isSignatureHelpSupported() {
-
- return v3supported && (textDocument.signatureHelp);
+ textDocument = capabilities.textDocument.value();
}
- bool isWorkspaceDidChangeConfigurationSupported() const
+ if (capabilities.workspace)
{
- return workspace && isDynamicRegistrationSupported(workspace->didChangeConfiguration);
+ workspace = std::make_shared<lsWorkspaceClientCapabilites>(capabilities.workspace.value());
+ }
+ }
+
+ bool v3supported = false;
+
+ bool isSignatureHelpSupported()
+ {
+
+ return v3supported && (textDocument.signatureHelp);
+ }
+ bool isWorkspaceDidChangeConfigurationSupported() const
+ {
+ return workspace && isDynamicRegistrationSupported(workspace->didChangeConfiguration);
+ }
+ bool isWorkspaceFoldersSupported()
+ {
+ return workspace != nullptr && isTrue(workspace->workspaceFolders);
+ }
+
+ bool isCompletionDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.completion);
+ }
+
+ bool isCompletionSnippetsSupported()
+ {
+ //@formatter:off
+ if (!v3supported || !textDocument.completion)
+ {
+ return false;
}
- bool isWorkspaceFoldersSupported() {
- return workspace != nullptr && isTrue(workspace->workspaceFolders);
+ auto const& completion = textDocument.completion.value();
+ if (completion.completionItem)
+ {
+ return isTrue(completion.completionItem.value().snippetSupport);
+ }
+ return false;
+ }
+
+ bool isV3Supported()
+ {
+ return v3supported;
+ }
+
+ bool isFormattingDynamicRegistrationSupported()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.formatting);
+ }
+
+ bool isRangeFormattingDynamicRegistrationSupported()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.rangeFormatting);
+ }
+
+ bool isOnTypeFormattingDynamicRegistrationSupported()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.onTypeFormatting);
+ }
+
+ bool isCodeLensDynamicRegistrationSupported()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.codeLens);
+ }
+
+ bool isSignatureHelpDynamicRegistrationSupported()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.signatureHelp);
+ }
+ template<typename T>
+ static bool isDynamicRegistrationSupported(optional<T>& capability)
+ {
+ if (capability)
+ {
+ return (capability.value().dynamicRegistration.value());
}
+ return false;
+ }
- bool isCompletionDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.completion);
+ bool isTrue(optional<bool> const& value)
+ {
+ if (value)
+ {
+ return *value;
}
-
- bool isCompletionSnippetsSupported() {
- //@formatter:off
- if(!v3supported || !textDocument.completion)
- {
- return false;
- }
- const auto& completion = textDocument.completion.value();
- if(completion.completionItem)
+ else
+ {
+ return false;
+ }
+ }
+
+ bool isRenameDynamicRegistrationSupported()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.rename);
+ }
+
+ bool isExecuteCommandDynamicRegistrationSupported()
+ {
+ return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->executeCommand);
+ }
+
+ bool isWorkspaceSymbolDynamicRegistered()
+ {
+ return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->symbol);
+ }
+
+ bool isWorkspaceChangeWatchedFilesDynamicRegistered()
+ {
+ return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->didChangeWatchedFiles);
+ }
+
+ bool isDocumentSymbolDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.documentSymbol);
+ }
+
+ bool isCodeActionDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.codeAction);
+ }
+
+ bool isDefinitionDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.definition);
+ }
+
+ bool isTypeDefinitionDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.typeDefinition);
+ }
+
+ bool isHoverDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.hover);
+ }
+
+ bool isReferencesDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.references);
+ }
+
+ bool isDocumentHighlightDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.documentHighlight);
+ }
+
+ bool isDocumentLinkDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.documentLink);
+ }
+
+ bool isFoldgingRangeDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.foldingRange);
+ }
+
+ bool isInlayHintDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.inlayHint);
+ }
+
+ bool isImplementationDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.implementation);
+ }
+
+ bool isSelectionRangeDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.selectionRange);
+ }
+
+ bool isWillSaveRegistered()
+ {
+ return v3supported && isTrue(textDocument.synchronization.willSave);
+ }
+
+ bool isWillSaveWaitUntilRegistered()
+ {
+ return v3supported && isTrue(textDocument.synchronization.willSaveWaitUntil);
+ }
+
+ bool isWorkspaceApplyEditSupported()
+ {
+ return workspace != nullptr && isTrue(workspace->applyEdit);
+ }
+
+ bool isSupportsCompletionDocumentationMarkdown()
+ {
+
+ if (!v3supported || !textDocument.completion)
+ {
+ return false;
+ }
+ auto const& completion = textDocument.completion.value();
+ if (completion.completionItem)
+ {
+ auto& documentationFormat = completion.completionItem.value().documentationFormat;
+ if (documentationFormat)
+ {
+ auto& data = documentationFormat.value();
+ for (auto& it : data)
{
- return isTrue(completion.completionItem.value().snippetSupport);
+ if (it == "markdown")
+ {
+ return true;
+ }
}
- return false;
- }
-
- bool isV3Supported() {
- return v3supported;
- }
-
- bool isFormattingDynamicRegistrationSupported() {
- return v3supported && isDynamicRegistrationSupported(textDocument.formatting);
- }
-
- bool isRangeFormattingDynamicRegistrationSupported() {
- return v3supported && isDynamicRegistrationSupported(textDocument.rangeFormatting);
- }
-
- bool isOnTypeFormattingDynamicRegistrationSupported() {
- return v3supported && isDynamicRegistrationSupported(textDocument.onTypeFormatting);
+ }
}
+ return false;
+ }
- bool isCodeLensDynamicRegistrationSupported() {
- return v3supported && isDynamicRegistrationSupported(textDocument.codeLens);
+ bool isWorkspaceEditResourceChangesSupported()
+ {
+ if (!workspace)
+ {
+ return false;
}
- bool isSignatureHelpDynamicRegistrationSupported() {
- return v3supported && isDynamicRegistrationSupported(textDocument.signatureHelp);
- }
- template<typename T>
- static bool isDynamicRegistrationSupported(optional<T>& capability)
+ if (workspace->workspaceEdit)
{
- if(capability)
- return (capability.value().dynamicRegistration.value());
- return false;
+ return isTrue(workspace->workspaceEdit.value().resourceChanges);
}
-
- bool isTrue(const optional<bool>& value)
+ return false;
+ }
+ static bool contains(std::vector<std::string> const& v, std::string const& target)
+ {
+ for (auto& it : v)
{
- if (value) {
- return *value;
- } else {
- return false;
+ if (it == target)
+ {
+ return true;
}
}
-
- bool isRenameDynamicRegistrationSupported() {
- return v3supported && isDynamicRegistrationSupported(textDocument.rename);
- }
-
- bool isExecuteCommandDynamicRegistrationSupported() {
- return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->executeCommand);
- }
-
- bool isWorkspaceSymbolDynamicRegistered() {
- return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->symbol);
- }
-
- bool isWorkspaceChangeWatchedFilesDynamicRegistered() {
- return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->didChangeWatchedFiles);
- }
-
- bool isDocumentSymbolDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.documentSymbol);
- }
-
- bool isCodeActionDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.codeAction);
- }
-
- bool isDefinitionDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.definition);
- }
-
- bool isTypeDefinitionDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.typeDefinition);
- }
-
- bool isHoverDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.hover);
- }
-
- bool isReferencesDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.references);
- }
-
- bool isDocumentHighlightDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.documentHighlight);
- }
-
- bool isFoldgingRangeDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.foldingRange);
- }
-
- bool isImplementationDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.implementation);
- }
-
- bool isSelectionRangeDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.selectionRange);
- }
-
- bool isWillSaveRegistered() {
- return v3supported && isTrue(textDocument.synchronization.willSave);
- }
-
- bool isWillSaveWaitUntilRegistered() {
- return v3supported && isTrue(textDocument.synchronization.willSaveWaitUntil);
- }
-
- bool isWorkspaceApplyEditSupported() {
- return workspace != nullptr && isTrue(workspace->applyEdit);
- }
-
- bool isSupportsCompletionDocumentationMarkdown() {
-
- if (!v3supported || !textDocument.completion)
- {
- return false;
- }
- const auto& completion = textDocument.completion.value();
- if (completion.completionItem)
- {
- auto& documentationFormat = completion.completionItem.value().documentationFormat;
- if(documentationFormat)
- {
- auto& data = documentationFormat.value();
- for(auto& it : data)
- {
- if(it == "markdown")
- {
- return true;
- }
- }
- }
- }
- return false;
-
- }
-
-
- bool isWorkspaceEditResourceChangesSupported() {
- if(!workspace) return false;
-
- if(workspace->workspaceEdit)
- {
- return isTrue(workspace->workspaceEdit.value().resourceChanges);
- }
- return false;
+ return false;
+ }
+ bool isResourceOperationSupported() const
+ {
+ if (!workspace)
+ {
+ return false;
}
- static bool contains(const std::vector<std::string>& v, const std::string& target)
+ if (!workspace->workspaceEdit)
{
- for(auto& it : v)
- {
- if(it == target) return true;
- }
- return false;
+ return false;
}
- bool isResourceOperationSupported() const
+ auto& it = (workspace->workspaceEdit.value());
+ if (!it.resourceOperations)
{
- if (!workspace) return false;
- if (!workspace->workspaceEdit)
- {
- return false;
- }
- auto& it = (workspace->workspaceEdit.value());
- if(!it.resourceOperations) return false;
- const auto& resourceOperations = it.resourceOperations.value();
- return contains(resourceOperations, "create") && contains(resourceOperations, "rename") && contains(resourceOperations, "delete");
-
+ return false;
}
+ auto const& resourceOperations = it.resourceOperations.value();
+ return contains(resourceOperations, "create") && contains(resourceOperations, "rename")
+ && contains(resourceOperations, "delete");
+ }
- /**
+ /**
* {@code true} if the client has explicitly set the
* {@code textDocument.documentSymbol.hierarchicalDocumentSymbolSupport} to
* {@code true} when initializing the LS. Otherwise, {@code false}.
*/
- bool isHierarchicalDocumentSymbolSupported() {
- if(!v3supported || !textDocument.documentSymbol) return false;
- return isTrue(textDocument.documentSymbol.value().hierarchicalDocumentSymbolSupport);
-
+ bool isHierarchicalDocumentSymbolSupported()
+ {
+ if (!v3supported || !textDocument.documentSymbol)
+ {
+ return false;
}
+ return isTrue(textDocument.documentSymbol.value().hierarchicalDocumentSymbolSupport);
+ }
- bool isSemanticHighlightingSupported() {
- //@formatter:off
- if (!v3supported || !textDocument.semanticHighlightingCapabilities) return false;
- return isTrue(textDocument.semanticHighlightingCapabilities.value().semanticHighlighting);
- //@formatter:on
+ bool isSemanticHighlightingSupported()
+ {
+ //@formatter:off
+ if (!v3supported || !textDocument.semanticHighlightingCapabilities)
+ {
+ return false;
}
+ return isTrue(textDocument.semanticHighlightingCapabilities.value().semanticHighlighting);
+ //@formatter:on
+ }
- /**
+ /**
* {@code true} if the client has explicitly set the
* {@code textDocument.codeAction.codeActionLiteralSupport.codeActionKind.valueSet}
* value. Otherwise, {@code false}.
*/
- bool isSupportedCodeActionKind(const std::string& kind) {
- if (!v3supported || !textDocument.codeAction) return false;
- //@formatter:off
- const auto& codeAction = textDocument.codeAction.value();
- if(codeAction.codeActionLiteralSupport)
+ bool isSupportedCodeActionKind(std::string const& kind)
+ {
+ if (!v3supported || !textDocument.codeAction)
+ {
+ return false;
+ }
+ //@formatter:off
+ auto const& codeAction = textDocument.codeAction.value();
+ if (codeAction.codeActionLiteralSupport)
+ {
+ auto const& codeActionKind = codeAction.codeActionLiteralSupport.value().codeActionKind;
+ if (codeActionKind)
+ {
+ auto const& valueSet = codeActionKind.value().valueSet;
+ if (valueSet)
{
- const auto& codeActionKind = codeAction.codeActionLiteralSupport.value().codeActionKind;
- if(codeActionKind)
+ for (auto& k : valueSet.value())
+ {
+ if (lsp::StartsWith(kind, k))
{
- const auto& valueSet = codeActionKind.value().valueSet;
- if(valueSet)
- {
- for(auto& k : valueSet.value())
- {
- if(lsp::StartsWith(kind,k))
- {
- return true;
- }
- }
- }
+ return true;
}
+ }
}
- return false;
-
- //@formatter:on
+ }
}
+ return false;
+
+ //@formatter:on
+ }
- /**
+ /**
* {@code true} if the client has explicitly set the
* {@code textDocument.publishDiagnostics.tagSupport} to
* {@code true} when initializing the LS. Otherwise, {@code false}.
*/
- bool isDiagnosticTagSupported() {
- if (!v3supported || !textDocument.publishDiagnostics) return false;
- const auto& publishDiagnostics = textDocument.publishDiagnostics.value();
- if(publishDiagnostics.tagSupport)
- {
- isTagSupported(publishDiagnostics.tagSupport);
- }
- return false;
+ bool isDiagnosticTagSupported()
+ {
+ if (!v3supported || !textDocument.publishDiagnostics)
+ {
+ return false;
}
-
- bool isTagSupported(const optional < std::pair<optional<bool>,
- optional<DiagnosticsTagSupport> > >& tagSupport) {
- if(tagSupport)
- {
- auto &v = tagSupport.value();
- if (v.first)
- {
- return v.first.value();
- }
- if (v.second) {
- return !v.second.value().valueSet.empty();
- }
- }
- return false;
+ auto const& publishDiagnostics = textDocument.publishDiagnostics.value();
+ if (publishDiagnostics.tagSupport)
+ {
+ isTagSupported(publishDiagnostics.tagSupport);
}
+ return false;
+ }
- bool isCallHierarchyDynamicRegistered() {
- return v3supported && isDynamicRegistrationSupported(textDocument.callHierarchy);
+ bool isTagSupported(optional<std::pair<optional<bool>, optional<DiagnosticsTagSupport>>> const& tagSupport)
+ {
+ if (tagSupport)
+ {
+ auto& v = tagSupport.value();
+ if (v.first)
+ {
+ return v.first.value();
+ }
+ if (v.second)
+ {
+ return !v.second.value().valueSet.empty();
+ }
}
+ return false;
+ }
+ bool isCallHierarchyDynamicRegistered()
+ {
+ return v3supported && isDynamicRegistrationSupported(textDocument.callHierarchy);
+ }
};
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/CodeActionParams.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/CodeActionParams.h
index 6c30ce82da..931747e4d3 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/CodeActionParams.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/CodeActionParams.h
@@ -5,22 +5,22 @@
#include "LibLsp/lsp/workspace/execute_command.h"
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
#include "LibLsp/lsp/lsCodeAction.h"
-namespace JDT
+namespace JDT
+{
+namespace CodeActionKind
{
- namespace CodeActionKind {
-
- /**
+ /**
* Base kind for quickfix actions: 'quickfix'
*/
- extern const char* QuickFix;
+ extern char const* QuickFix;
- /**
+ /**
* Base kind for refactoring actions: 'refactor'
*/
- extern const char* Refactor;
+ extern char const* Refactor;
- /**
+ /**
* Base kind for refactoring extraction actions: 'refactor.extract'
*
* Example extract actions:
@@ -28,18 +28,18 @@ namespace JDT
* - Extract method - Extract function - Extract variable - Extract interface
* from class - ...
*/
- extern const char* RefactorExtract;
+ extern char const* RefactorExtract;
- /**
+ /**
* Base kind for refactoring inline actions: 'refactor.inline'
*
* Example inline actions:
*
* - Inline function - Inline variable - Inline constant - ...
*/
- extern const char* RefactorInline;
+ extern char const* RefactorInline;
- /**
+ /**
* Base kind for refactoring rewrite actions: 'refactor.rewrite'
*
* Example rewrite actions:
@@ -47,29 +47,29 @@ namespace JDT
* - Convert JavaScript function to class - Add or remove parameter -
* Encapsulate field - Make method static - Move method to base class - ...
*/
- extern const char* RefactorRewrite;
+ extern char const* RefactorRewrite;
- /**
+ /**
* Base kind for source actions: `source`
*
* Source code actions apply to the entire file.
*/
- extern const char* Source ;
+ extern char const* Source;
- /**
+ /**
* Base kind for an organize imports source action: `source.organizeImports`
*/
- extern const char* SourceOrganizeImports;
+ extern char const* SourceOrganizeImports;
- extern const char* COMMAND_ID_APPLY_EDIT;
- };
+ extern char const* COMMAND_ID_APPLY_EDIT;
+}; // namespace CodeActionKind
-
-}
-struct lsCodeActionContext {
- // An array of diagnostics.
- std::vector<lsDiagnostic> diagnostics;
- /**
+} // namespace JDT
+struct lsCodeActionContext
+{
+ // An array of diagnostics.
+ std::vector<lsDiagnostic> diagnostics;
+ /**
* Requested kind of actions to return.
*
* Actions not of this kind are filtered out by the client before being shown. So servers
@@ -77,38 +77,22 @@ struct lsCodeActionContext {
*
* See {@link CodeActionKind} for allowed values.
*/
- optional<std::vector<std::string>> only;
+ optional<std::vector<std::string>> only;
- MAKE_SWAP_METHOD(lsCodeActionContext,
- diagnostics, only);
+ MAKE_SWAP_METHOD(lsCodeActionContext, diagnostics, only);
};
-MAKE_REFLECT_STRUCT(lsCodeActionContext,
- diagnostics, only);
-
+MAKE_REFLECT_STRUCT(lsCodeActionContext, diagnostics, only);
// Params for the CodeActionRequest
-struct lsCodeActionParams {
- // The document in which the command was invoked.
- lsTextDocumentIdentifier textDocument;
- // The range for which the command was invoked.
- lsRange range;
- // Context carrying additional information.
- lsCodeActionContext context;
-
- MAKE_SWAP_METHOD(lsCodeActionParams,
- textDocument,
- range,
- context);
+struct lsCodeActionParams
+{
+ // The document in which the command was invoked.
+ lsTextDocumentIdentifier textDocument;
+ // The range for which the command was invoked.
+ lsRange range;
+ // Context carrying additional information.
+ lsCodeActionContext context;
+
+ MAKE_SWAP_METHOD(lsCodeActionParams, textDocument, range, context);
};
-MAKE_REFLECT_STRUCT(lsCodeActionParams,
- textDocument,
- range,
- context);
-
-
-
-
-
-
-
-
+MAKE_REFLECT_STRUCT(lsCodeActionParams, textDocument, range, context);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/Directory.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/Directory.h
index 77b6cbb3e7..c1ab3fed03 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/Directory.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/Directory.h
@@ -3,11 +3,12 @@
struct AbsolutePath;
-struct Directory {
- explicit Directory(const AbsolutePath& path);
+struct Directory
+{
+ explicit Directory(AbsolutePath const& path);
- bool operator==(const Directory& rhs) const;
- bool operator!=(const Directory& rhs) const;
+ bool operator==(Directory const& rhs) const;
+ bool operator!=(Directory const& rhs) const;
- std::string path;
+ std::string path;
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ExecuteCommandParams.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ExecuteCommandParams.h
index bb73d8a46f..c2a4404278 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ExecuteCommandParams.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ExecuteCommandParams.h
@@ -1,20 +1,21 @@
#pragma once
#include "lsAny.h"
-struct ExecuteCommandParams {
- /**
+struct ExecuteCommandParams
+{
+ /**
* The identifier of the actual command handler.
*/
- std::string command;
+ std::string command;
- /**
+ /**
* Arguments that the command should be invoked with.
* The arguments are typically specified when a command is returned from the server to the client.
* Example requests that return a command are textDocument/codeAction or textDocument/codeLens.
*/
- optional<std::vector<lsp::Any>> arguments;
+ optional<std::vector<lsp::Any>> arguments;
- MAKE_SWAP_METHOD(ExecuteCommandParams, command, arguments);
+ MAKE_SWAP_METHOD(ExecuteCommandParams, command, arguments);
};
-MAKE_REFLECT_STRUCT(ExecuteCommandParams,command,arguments)
+MAKE_REFLECT_STRUCT(ExecuteCommandParams, command, arguments)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/IProgressMonitor.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/IProgressMonitor.h
index 369ebb2a6d..35ec7e46b8 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/IProgressMonitor.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/IProgressMonitor.h
@@ -1,8 +1,8 @@
#pragma once
-
#include <string>
-namespace lsp {
+namespace lsp
+{
/**
* The <code>IProgressMonitor</code> interface is implemented
* by objects that monitor the progress of an activity; the methods
@@ -36,18 +36,19 @@ namespace lsp {
* Clients may implement this interface.
* </p>
*/
- class IProgressMonitor {
- public:
- virtual ~IProgressMonitor()
- {
- }
+class IProgressMonitor
+{
+public:
+ virtual ~IProgressMonitor()
+ {
+ }
- /** Constant indicating an unknown amount of work.
+ /** Constant indicating an unknown amount of work.
*/
- const static int UNKNOWN = -1;
+ static int const UNKNOWN = -1;
- /**
+ /**
* Notifies that the main task is beginning. This must only be called once
* on a given progress monitor instance.
*
@@ -57,33 +58,30 @@ namespace lsp {
* the implemenation is free to indicate progress in a way which
* doesn't require the total number of work units in advance.
*/
- virtual void beginTask(void* , int totalWork)
- {
+ virtual void beginTask(void*, int totalWork) {
- };
- /**
+ };
+ /**
* Notifies that the work is done; that is, either the main task is completed
* or the user canceled it. This method may be called more than once
* (implementations should be prepared to handle this case).
*/
- virtual void endTask(void*, int totalWork)
- {
-
- }
+ virtual void endTask(void*, int totalWork)
+ {
+ }
- virtual void done(void*) = 0;
+ virtual void done(void*) = 0;
- /**
+ /**
* Internal method to handle scaling correctly. This method
* must not be called by a client. Clients should
* always use the method <code>worked(int)</code>.
*/
- virtual void internalWorked(double work)
- {
-
- }
- /**
+ virtual void internalWorked(double work)
+ {
+ }
+ /**
* Returns whether cancelation of current operation has been requested.
* Long-running operations should poll to see if cancelation
* has been requested.
@@ -92,8 +90,8 @@ namespace lsp {
* and <code>false</code> otherwise
* @see #setCanceled
*/
- virtual bool isCanceled() = 0;
- /**
+ virtual bool isCanceled() = 0;
+ /**
* Sets the cancel state to the given value.
*
* @param value <code>true</code> indicates that cancelation has
@@ -102,8 +100,8 @@ namespace lsp {
*
* @see #isCanceled
*/
- virtual void setCanceled(bool value) = 0;
- /**
+ virtual void setCanceled(bool value) = 0;
+ /**
* Sets the task name to the given value. This method is used to
* restore the task label after a nested operation was executed.
* Normally there is no need for clients to call this method.
@@ -111,21 +109,19 @@ namespace lsp {
* @param name the name (or description) of the main task
* @see #beginTask(java.lang.const wstring&, int)
*/
- virtual void setTaskName(void*)
- {
+ virtual void setTaskName(void*) {
- };
- /**
+ };
+ /**
* Notifies that a subtask of the main task is beginning.
* Subtasks are optional; the main task might not have subtasks.
*
* @param name the name (or description) of the subtask
*/
- virtual void subTask(void* )
- {
-
- }
- /**
+ virtual void subTask(void*)
+ {
+ }
+ /**
* Notifies that a given number of work unit of the main task
* has been completed. Note that this amount represents an
* installment, as opposed to a cumulative amount of work done
@@ -133,11 +129,10 @@ namespace lsp {
*
* @param work the number of work units just completed
*/
- virtual void worked(int work)
- {
+ virtual void worked(int work) {
- };
+ };
- virtual void catch_exception(void*) = 0;
- };
-}
+ virtual void catch_exception(void*) = 0;
+};
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/Markup/Markup.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/Markup/Markup.h
index 1618939c69..07fef15897 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/Markup/Markup.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/Markup/Markup.h
@@ -15,105 +15,116 @@ namespace lsp
/// Holds text and knows how to lay it out. Multiple blocks can be grouped to
/// form a document. Blocks include their own trailing newlines, std::string_ref
/// should trim them if need be.
-class Block {
+class Block
+{
public:
- virtual void renderMarkdown(std::ostringstream &OS) const = 0;
- virtual void renderPlainText(std::ostringstream &OS) const = 0;
- virtual std::unique_ptr<Block> clone() const = 0;
- std::string_ref asMarkdown() const;
- std::string_ref asPlainText() const;
-
- virtual bool isRuler() const { return false; }
- virtual ~Block() = default;
+ virtual void renderMarkdown(std::ostringstream& OS) const = 0;
+ virtual void renderPlainText(std::ostringstream& OS) const = 0;
+ virtual std::unique_ptr<Block> clone() const = 0;
+ std::string_ref asMarkdown() const;
+ std::string_ref asPlainText() const;
+
+ virtual bool isRuler() const
+ {
+ return false;
+ }
+ virtual ~Block() = default;
};
/// Represents parts of the markup that can contain strings, like inline code,
/// code block or plain text.
/// One must introduce different paragraphs to create separate blocks.
-class Paragraph : public Block {
+class Paragraph : public Block
+{
public:
- void renderMarkdown(std::ostringstream &OS) const override;
- void renderPlainText(std::ostringstream &OS) const override;
- std::unique_ptr<Block> clone() const override;
+ void renderMarkdown(std::ostringstream& OS) const override;
+ void renderPlainText(std::ostringstream& OS) const override;
+ std::unique_ptr<Block> clone() const override;
- /// Append plain text to the end of the string.
- Paragraph &appendText(const std::string_ref& Text);
+ /// Append plain text to the end of the string.
+ Paragraph& appendText(std::string_ref const& Text);
- /// Append inline code, this translates to the ` block in markdown.
- /// \p Preserve indicates the code span must be apparent even in plaintext.
- Paragraph &appendCode(const std::string_ref& Code, bool Preserve = false);
+ /// Append inline code, this translates to the ` block in markdown.
+ /// \p Preserve indicates the code span must be apparent even in plaintext.
+ Paragraph& appendCode(std::string_ref const& Code, bool Preserve = false);
- /// Ensure there is space between the surrounding chunks.
- /// Has no effect at the beginning or end of a paragraph.
- Paragraph &appendSpace();
+ /// Ensure there is space between the surrounding chunks.
+ /// Has no effect at the beginning or end of a paragraph.
+ Paragraph& appendSpace();
private:
- struct Chunk {
- enum {
- PlainText,
- InlineCode,
- } Kind = PlainText;
- // Preserve chunk markers in plaintext.
- bool Preserve = false;
- std::string_ref Contents;
- // Whether this chunk should be surrounded by whitespace.
- // Consecutive SpaceAfter and SpaceBefore will be collapsed into one space.
- // Code spans don't usually set this: their spaces belong "inside" the span.
- bool SpaceBefore = false;
- bool SpaceAfter = false;
- };
- std::vector<Chunk> Chunks;
+ struct Chunk
+ {
+ enum
+ {
+ PlainText,
+ InlineCode,
+ } Kind = PlainText;
+ // Preserve chunk markers in plaintext.
+ bool Preserve = false;
+ std::string_ref Contents;
+ // Whether this chunk should be surrounded by whitespace.
+ // Consecutive SpaceAfter and SpaceBefore will be collapsed into one space.
+ // Code spans don't usually set this: their spaces belong "inside" the span.
+ bool SpaceBefore = false;
+ bool SpaceAfter = false;
+ };
+ std::vector<Chunk> Chunks;
};
/// Represents a sequence of one or more documents. Knows how to print them in a
/// list like format, e.g. by prepending with "- " and indentation.
-class BulletList : public Block {
+class BulletList : public Block
+{
public:
- void renderMarkdown(std::ostringstream &OS) const override;
- void renderPlainText(std::ostringstream &OS) const override;
- std::unique_ptr<Block> clone() const override;
+ void renderMarkdown(std::ostringstream& OS) const override;
+ void renderPlainText(std::ostringstream& OS) const override;
+ std::unique_ptr<Block> clone() const override;
- class Document &addItem();
+ class Document& addItem();
private:
- std::vector<class Document> Items;
+ std::vector<class Document> Items;
};
/// A format-agnostic representation for structured text. Allows rendering into
/// markdown and plaintext.
-class Document {
+class Document
+{
public:
- Document() = default;
- Document(const Document &Other) { *this = Other; }
- Document &operator=(const Document &);
- Document(Document &&) = default;
- Document &operator=(Document &&) = default;
-
- void append(Document Other);
-
- /// Adds a semantical block that will be separate from others.
- Paragraph &addParagraph();
- /// Inserts a horizontal separator to the document.
- void addRuler();
- /// Adds a block of code. This translates to a ``` block in markdown. In plain
- /// text representation, the code block will be surrounded by newlines.
- void addCodeBlock( std::string_ref Code, std::string_ref Language = "cpp");
- /// Heading is a special type of paragraph that will be prepended with \p
- /// Level many '#'s in markdown.
- Paragraph &addHeading(size_t Level);
-
- BulletList &addBulletList();
-
- /// Doesn't contain any trailing newlines.
- /// We try to make the markdown human-readable, e.g. avoid extra escaping.
- /// At least one client (coc.nvim) displays the markdown verbatim!
- std::string_ref asMarkdown() const;
- /// Doesn't contain any trailing newlines.
- std::string_ref asPlainText() const;
+ Document() = default;
+ Document(Document const& Other)
+ {
+ *this = Other;
+ }
+ Document& operator=(Document const&);
+ Document(Document&&) = default;
+ Document& operator=(Document&&) = default;
+
+ void append(Document Other);
+
+ /// Adds a semantical block that will be separate from others.
+ Paragraph& addParagraph();
+ /// Inserts a horizontal separator to the document.
+ void addRuler();
+ /// Adds a block of code. This translates to a ``` block in markdown. In plain
+ /// text representation, the code block will be surrounded by newlines.
+ void addCodeBlock(std::string_ref Code, std::string_ref Language = "cpp");
+ /// Heading is a special type of paragraph that will be prepended with \p
+ /// Level many '#'s in markdown.
+ Paragraph& addHeading(size_t Level);
+
+ BulletList& addBulletList();
+
+ /// Doesn't contain any trailing newlines.
+ /// We try to make the markdown human-readable, e.g. avoid extra escaping.
+ /// At least one client (coc.nvim) displays the markdown verbatim!
+ std::string_ref asMarkdown() const;
+ /// Doesn't contain any trailing newlines.
+ std::string_ref asPlainText() const;
private:
- std::vector<std::unique_ptr<Block>> Children;
+ std::vector<std::unique_ptr<Block>> Children;
};
-
-}
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/Markup/string_ref.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/Markup/string_ref.h
index bac8fbbaf5..391cf7c290 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/Markup/string_ref.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/Markup/string_ref.h
@@ -4,7 +4,7 @@
#include <string>
#include <vector>
#include <stdarg.h>
-#include<functional>
+#include <functional>
#ifndef _WIN32
#include <cstring>
@@ -12,262 +12,274 @@
namespace std
{
- /**
+/**
* An extension of STL's string providing additional functionality that is often availiable in
* higher-level languages such as Python.
*/
- class string_ref : public string
- {
- public:
-
- //static unsigned GetAutoSenseRadix(string_ref& Str) {
- // if (Str.empty())
- // return 10;
-
- // if (Str.start_with("0x") || Str.start_with("0X")) {
- // Str = Str.substr(2);
- // return 16;
- // }
-
- // if (Str.start_with("0b") || Str.start_with("0B")) {
- // Str = Str.substr(2);
- // return 2;
- // }
-
- // if (Str.start_with("0o")) {
- // Str = Str.substr(2);
- // return 8;
- // }
-
- // if (Str[0] == '0' && Str.size() > 1 && std::isdigit(Str[1])) {
- // Str = Str.substr(1);
- // return 8;
- // }
-
- // return 10;
- //}
-
- //static bool consumeUnsignedInteger(string_ref& Str, unsigned Radix,
- // unsigned long long& Result) {
- // // Autosense radix if not specified.
- // if (Radix == 0)
- // Radix = GetAutoSenseRadix(Str);
-
- // // Empty strings (after the radix autosense) are invalid.
- // if (Str.empty()) return true;
-
- // // Parse all the bytes of the string given this radix. Watch for overflow.
- // string_ref Str2 = Str;
- // Result = 0;
- // while (!Str2.empty()) {
- // unsigned CharVal;
- // if (Str2[0] >= '0' && Str2[0] <= '9')
- // CharVal = Str2[0] - '0';
- // else if (Str2[0] >= 'a' && Str2[0] <= 'z')
- // CharVal = Str2[0] - 'a' + 10;
- // else if (Str2[0] >= 'A' && Str2[0] <= 'Z')
- // CharVal = Str2[0] - 'A' + 10;
- // else
- // break;
-
- // // If the parsed value is larger than the integer radix, we cannot
- // // consume any more characters.
- // if (CharVal >= Radix)
- // break;
-
- // // Add in this character.
- // unsigned long long PrevResult = Result;
- // Result = Result * Radix + CharVal;
-
- // // Check for overflow by shifting back and seeing if bits were lost.
- // if (Result / Radix < PrevResult)
- // return true;
-
- // Str2 = Str2.substr(1);
- // }
-
- // // We consider the operation a failure if no characters were consumed
- // // successfully.
- // if (Str.size() == Str2.size())
- // return true;
-
- // Str = Str2;
- // return false;
- //}
-
- //static bool consumeSignedInteger(string_ref& Str, unsigned Radix,
- // long long& Result) {
- // unsigned long long ULLVal;
-
- // // Handle positive strings first.
- // if (Str.empty() || Str.front() != '-') {
- // if (consumeUnsignedInteger(Str, Radix, ULLVal) ||
- // // Check for value so large it overflows a signed value.
- // (long long)ULLVal < 0)
- // return true;
- // Result = ULLVal;
- // return false;
- // }
-
- // // Get the positive part of the value.
- // string_ref Str2 = Str.drop_front(1);
- // if (consumeUnsignedInteger(Str2, Radix, ULLVal) ||
- // // Reject values so large they'd overflow as negative signed, but allow
- // // "-0". This negates the unsigned so that the negative isn't undefined
- // // on signed overflow.
- // (long long)-ULLVal > 0)
- // return true;
-
- // Str = Str2;
- // Result = -ULLVal;
- // return false;
- //}
-
- ///// GetAsUnsignedInteger - Workhorse method that converts a integer character
- ///// sequence of radix up to 36 to an unsigned long long value.
- //static bool getAsUnsignedInteger(string_ref Str, unsigned Radix,
- // unsigned long long& Result) {
- // if (consumeUnsignedInteger(Str, Radix, Result))
- // return true;
-
- // // For getAsUnsignedInteger, we require the whole string to be consumed or
- // // else we consider it a failure.
- // return !Str.empty();
- //}
-
- //static bool getAsSignedInteger(string_ref Str, unsigned Radix,
- // long long& Result) {
- // if (consumeSignedInteger(Str, Radix, Result))
- // return true;
-
- // // For getAsSignedInteger, we require the whole string to be consumed or else
- // // we consider it a failure.
- // return !Str.empty();
- //}
-
-
- ///// Parse the current string as an integer of the specified radix. If
- ///// \p Radix is specified as zero, this does radix autosensing using
- ///// extended C rules: 0 is octal, 0x is hex, 0b is binary.
- /////
- ///// If the string is invalid or if only a subset of the string is valid,
- ///// this returns true to signify the error. The string is considered
- ///// erroneous if empty or if it overflows T.
- //template <typename T>
- //std::enable_if_t<std::numeric_limits<T>::is_signed, bool>
- // getAsInteger(unsigned Radix, T& Result) const {
- // long long LLVal;
- // if (getAsSignedInteger(*this, Radix, LLVal) ||
- // static_cast<T>(LLVal) != LLVal)
- // return true;
- // Result = LLVal;
- // return false;
- //}
-
- //template <typename T>
- //std::enable_if_t<!std::numeric_limits<T>::is_signed, bool>
- // getAsInteger(unsigned Radix, T& Result) const {
- // unsigned long long ULLVal;
- // // The additional cast to unsigned long long is required to avoid the
- // // Visual C++ warning C4805: '!=' : unsafe mix of type 'bool' and type
- // // 'unsigned __int64' when instantiating getAsInteger with T = bool.
- // if (getAsUnsignedInteger(*this, Radix, ULLVal) ||
- // static_cast<unsigned long long>(static_cast<T>(ULLVal)) != ULLVal)
- // return true;
- // Result = ULLVal;
- // return false;
- //}
-
-
-
- /**`
+class string_ref : public string
+{
+public:
+ //static unsigned GetAutoSenseRadix(string_ref& Str) {
+ // if (Str.empty())
+ // return 10;
+
+ // if (Str.start_with("0x") || Str.start_with("0X")) {
+ // Str = Str.substr(2);
+ // return 16;
+ // }
+
+ // if (Str.start_with("0b") || Str.start_with("0B")) {
+ // Str = Str.substr(2);
+ // return 2;
+ // }
+
+ // if (Str.start_with("0o")) {
+ // Str = Str.substr(2);
+ // return 8;
+ // }
+
+ // if (Str[0] == '0' && Str.size() > 1 && std::isdigit(Str[1])) {
+ // Str = Str.substr(1);
+ // return 8;
+ // }
+
+ // return 10;
+ //}
+
+ //static bool consumeUnsignedInteger(string_ref& Str, unsigned Radix,
+ // unsigned long long& Result) {
+ // // Autosense radix if not specified.
+ // if (Radix == 0)
+ // Radix = GetAutoSenseRadix(Str);
+
+ // // Empty strings (after the radix autosense) are invalid.
+ // if (Str.empty()) return true;
+
+ // // Parse all the bytes of the string given this radix. Watch for overflow.
+ // string_ref Str2 = Str;
+ // Result = 0;
+ // while (!Str2.empty()) {
+ // unsigned CharVal;
+ // if (Str2[0] >= '0' && Str2[0] <= '9')
+ // CharVal = Str2[0] - '0';
+ // else if (Str2[0] >= 'a' && Str2[0] <= 'z')
+ // CharVal = Str2[0] - 'a' + 10;
+ // else if (Str2[0] >= 'A' && Str2[0] <= 'Z')
+ // CharVal = Str2[0] - 'A' + 10;
+ // else
+ // break;
+
+ // // If the parsed value is larger than the integer radix, we cannot
+ // // consume any more characters.
+ // if (CharVal >= Radix)
+ // break;
+
+ // // Add in this character.
+ // unsigned long long PrevResult = Result;
+ // Result = Result * Radix + CharVal;
+
+ // // Check for overflow by shifting back and seeing if bits were lost.
+ // if (Result / Radix < PrevResult)
+ // return true;
+
+ // Str2 = Str2.substr(1);
+ // }
+
+ // // We consider the operation a failure if no characters were consumed
+ // // successfully.
+ // if (Str.size() == Str2.size())
+ // return true;
+
+ // Str = Str2;
+ // return false;
+ //}
+
+ //static bool consumeSignedInteger(string_ref& Str, unsigned Radix,
+ // long long& Result) {
+ // unsigned long long ULLVal;
+
+ // // Handle positive strings first.
+ // if (Str.empty() || Str.front() != '-') {
+ // if (consumeUnsignedInteger(Str, Radix, ULLVal) ||
+ // // Check for value so large it overflows a signed value.
+ // (long long)ULLVal < 0)
+ // return true;
+ // Result = ULLVal;
+ // return false;
+ // }
+
+ // // Get the positive part of the value.
+ // string_ref Str2 = Str.drop_front(1);
+ // if (consumeUnsignedInteger(Str2, Radix, ULLVal) ||
+ // // Reject values so large they'd overflow as negative signed, but allow
+ // // "-0". This negates the unsigned so that the negative isn't undefined
+ // // on signed overflow.
+ // (long long)-ULLVal > 0)
+ // return true;
+
+ // Str = Str2;
+ // Result = -ULLVal;
+ // return false;
+ //}
+
+ ///// GetAsUnsignedInteger - Workhorse method that converts a integer character
+ ///// sequence of radix up to 36 to an unsigned long long value.
+ //static bool getAsUnsignedInteger(string_ref Str, unsigned Radix,
+ // unsigned long long& Result) {
+ // if (consumeUnsignedInteger(Str, Radix, Result))
+ // return true;
+
+ // // For getAsUnsignedInteger, we require the whole string to be consumed or
+ // // else we consider it a failure.
+ // return !Str.empty();
+ //}
+
+ //static bool getAsSignedInteger(string_ref Str, unsigned Radix,
+ // long long& Result) {
+ // if (consumeSignedInteger(Str, Radix, Result))
+ // return true;
+
+ // // For getAsSignedInteger, we require the whole string to be consumed or else
+ // // we consider it a failure.
+ // return !Str.empty();
+ //}
+
+ ///// Parse the current string as an integer of the specified radix. If
+ ///// \p Radix is specified as zero, this does radix autosensing using
+ ///// extended C rules: 0 is octal, 0x is hex, 0b is binary.
+ /////
+ ///// If the string is invalid or if only a subset of the string is valid,
+ ///// this returns true to signify the error. The string is considered
+ ///// erroneous if empty or if it overflows T.
+ //template <typename T>
+ //std::enable_if_t<std::numeric_limits<T>::is_signed, bool>
+ // getAsInteger(unsigned Radix, T& Result) const {
+ // long long LLVal;
+ // if (getAsSignedInteger(*this, Radix, LLVal) ||
+ // static_cast<T>(LLVal) != LLVal)
+ // return true;
+ // Result = LLVal;
+ // return false;
+ //}
+
+ //template <typename T>
+ //std::enable_if_t<!std::numeric_limits<T>::is_signed, bool>
+ // getAsInteger(unsigned Radix, T& Result) const {
+ // unsigned long long ULLVal;
+ // // The additional cast to unsigned long long is required to avoid the
+ // // Visual C++ warning C4805: '!=' : unsafe mix of type 'bool' and type
+ // // 'unsigned __int64' when instantiating getAsInteger with T = bool.
+ // if (getAsUnsignedInteger(*this, Radix, ULLVal) ||
+ // static_cast<unsigned long long>(static_cast<T>(ULLVal)) != ULLVal)
+ // return true;
+ // Result = ULLVal;
+ // return false;
+ //}
+
+ /**`
* Default constructor
*
* Constructs an empty string_ref ("")
*/
- string_ref() : string() { }
+ string_ref() : string()
+ {
+ }
- /**
+ /**
* Duplicate the STL string copy constructor
*
* @param[in] s The string to copy
* @param[in] pos The starting position in the string to copy from
* @param[in] n The number of characters to copy
*/
- string_ref(const string &s, size_type pos = 0, size_type n = npos) : string(s, pos, npos) { }
+ string_ref(string const& s, size_type pos = 0, size_type n = npos) : string(s, pos, n)
+ {
+ }
- /**
+ /**
* Construct an string_ref from a null-terminated character array
*
* @param[in] s The character array to copy into the new string
*/
- string_ref(const value_type *s) : string(s) { }
+ string_ref(value_type const* s) : string(s)
+ {
+ }
- /**
+ /**
* Construct an string_ref from a character array and a length
*
* @param[in] s The character array to copy into the new string
* @param[in] n The number of characters to copy
*/
- string_ref(const value_type *s, size_type n) : string(s, n) { }
+ string_ref(value_type const* s, size_type n) : string(s, n)
+ {
+ }
- /**
+ /**
* Create an string_ref with @p n copies of @p c
*
* @param[in] n The number of copies
* @param[in] c The character to copy @p n times
*/
- string_ref(size_type n, value_type c) : string(n, c) { }
+ string_ref(size_type n, value_type c) : string(n, c)
+ {
+ }
- /**
+ /**
* Create a string from a range
*
* @param[in] first The first element to copy in
* @param[in] last The last element to copy in
*/
- template <class InputIterator>
- string_ref(InputIterator first, InputIterator last) : string(first, last) { }
+ template<class InputIterator>
+ string_ref(InputIterator first, InputIterator last) : string(first, last)
+ {
+ }
- /**
+ /**
* The destructor
*/
- ~string_ref() { }
+ ~string_ref()
+ {
+ }
- /**
+ /**
* Split a string by whitespace
*
* @return A vector of strings, each of which is a substring of the string
*/
- vector<string_ref> split(size_type limit = npos) const
+ vector<string_ref> split(size_type limit = npos) const
+ {
+ vector<string_ref> v;
+
+ const_iterator i = begin(), last = i;
+ for (; i != end(); i++)
+ {
+ if (*i == ' ' || *i == '\n' || *i == '\t' || *i == '\r')
+ {
+ if (i + 1 != end() && (i[1] == ' ' || i[1] == '\n' || i[1] == '\t' || i[1] == '\r'))
+ {
+ continue;
+ }
+ v.push_back(string_ref(last, i));
+ last = i + 1;
+ if (v.size() >= limit - 1)
{
- vector<string_ref> v;
-
- const_iterator
- i = begin(),
- last = i;
- for (; i != end(); i++)
- {
- if (*i == ' ' || *i == '\n' || *i == '\t' || *i == '\r')
- {
- if (i + 1 != end() && (i[1] == ' ' || i[1] == '\n' || i[1] == '\t' || i[1] == '\r'))
- continue;
- v.push_back(string_ref(last, i));
- last = i + 1;
- if (v.size() >= limit - 1)
- {
- v.push_back(string_ref(last, end()));
- return v;
- }
- }
- }
-
- if (last != i)
- v.push_back(string_ref(last, i));
-
- return v;
+ v.push_back(string_ref(last, end()));
+ return v;
}
+ }
+ }
+
+ if (last != i)
+ {
+ v.push_back(string_ref(last, i));
+ }
+
+ return v;
+ }
- /**
+ /**
* Split a string by a character
*
* Returns a vector of ext_strings, each of which is a substring of the string formed by splitting
@@ -296,34 +308,34 @@ namespace std
* test.
* @endcode
*/
- vector<string_ref> split(value_type separator, size_type limit = npos) const
+ vector<string_ref> split(value_type separator, size_type limit = npos) const
+ {
+ vector<string_ref> v;
+
+ const_iterator i = begin(), last = i;
+ for (; i != end(); i++)
+ {
+ if (*i == separator)
+ {
+ v.push_back(string_ref(last, i));
+ last = i + 1;
+ if (v.size() >= limit - 1)
{
- vector<string_ref> v;
-
- const_iterator
- i = begin(),
- last = i;
- for (; i != end(); i++)
- {
- if (*i == separator)
- {
- v.push_back(string_ref(last, i));
- last = i + 1;
- if (v.size() >= limit - 1)
- {
- v.push_back(string_ref(last, end()));
- return v;
- }
- }
- }
-
- if (last != i)
- v.push_back(string_ref(last, i));
-
- return v;
+ v.push_back(string_ref(last, end()));
+ return v;
}
+ }
+ }
+
+ if (last != i)
+ {
+ v.push_back(string_ref(last, i));
+ }
+
+ return v;
+ }
- /**
+ /**
* Split a string by another string
*
* Returns a vector of ext_strings, each of which is a substring of the string formed by
@@ -342,35 +354,35 @@ namespace std
*
* @ref split_ex
*/
- vector<string_ref> split(const string &separator, size_type limit = npos) const
+ vector<string_ref> split(string const& separator, size_type limit = npos) const
+ {
+ vector<string_ref> v;
+
+ const_iterator i = begin(), last = i;
+ for (; i != end(); i++)
+ {
+ if (string(i, i + separator.length()) == separator)
+ {
+ v.push_back(string_ref(last, i));
+ last = i + separator.length();
+
+ if (v.size() >= limit - 1)
{
- vector<string_ref> v;
-
- const_iterator
- i = begin(),
- last = i;
- for (; i != end(); i++)
- {
- if (string(i, i + separator.length()) == separator)
- {
- v.push_back(string_ref(last, i));
- last = i + separator.length();
-
- if (v.size() >= limit - 1)
- {
- v.push_back(string_ref(last, end()));
- return v;
- }
- }
- }
-
- if (last != i)
- v.push_back(string_ref(last, i));
-
- return v;
+ v.push_back(string_ref(last, end()));
+ return v;
}
+ }
+ }
+
+ if (last != i)
+ {
+ v.push_back(string_ref(last, i));
+ }
+
+ return v;
+ }
- /**
+ /**
* Convert a string into an integer
*
* Convert the initial portion of a string into a signed integer. Once a non-numeric
@@ -380,39 +392,45 @@ namespace std
* @param s The string to convert
* @return The integer converted from @p string
*/
- static long int integer(const string &s)
+ static long int integer(string const& s)
+ {
+ long int retval = 0;
+ bool neg = false;
+
+ for (const_iterator i = s.begin(); i != s.end(); i++)
+ {
+ if (i == s.begin())
+ {
+ if (*i == '-')
+ {
+ neg = true;
+ continue;
+ }
+ else if (*i == '+')
{
- long int retval = 0;
- bool neg = false;
-
- for (const_iterator i = s.begin(); i != s.end(); i++)
- {
- if (i == s.begin())
- {
- if (*i == '-')
- {
- neg = true;
- continue;
- }
- else if (*i == '+')
- continue;
- }
- if (*i >= '0' && *i <= '9')
- {
- retval *= 10;
- retval += *i - '0';
- }
- else
- break;
- }
-
- if (neg)
- retval *= -1;
-
- return retval;
+ continue;
}
+ }
+ if (*i >= '0' && *i <= '9')
+ {
+ retval *= 10;
+ retval += *i - '0';
+ }
+ else
+ {
+ break;
+ }
+ }
- /**
+ if (neg)
+ {
+ retval *= -1;
+ }
+
+ return retval;
+ }
+
+ /**
* Convert the string to an integer
*
* Convert the initial portion of the string into a signed integer. Once a non-numeric
@@ -421,12 +439,12 @@ namespace std
*
* @return The integer converted from the string
*/
- long int integer() const
- {
- return integer(*this);
- }
+ long int integer() const
+ {
+ return integer(*this);
+ }
- /**
+ /**
* Split a string into chunks of size @p chunklen. Returns a vector of strings.
*
* Splits a string into chunks of the given size. The final chunk may not fill its
@@ -444,32 +462,32 @@ namespace std
* abc def ghi jk
* @endcode
*/
- vector<string_ref> chunk_split(size_type chunklen) const
- {
- vector<string_ref> retval;
- retval.reserve(size() / chunklen + 1);
-
- size_type count = 0;
- const_iterator
- i = begin(),
- last = i;
- for (; i != end(); i++, count++)
- {
- if (count == chunklen)
- {
- count = 0;
- retval.push_back(string_ref(last, i));
- last = i;
- }
- }
-
- if (last != i)
- retval.push_back(string_ref(last, i));
-
- return retval;
- }
+ vector<string_ref> chunk_split(size_type chunklen) const
+ {
+ vector<string_ref> retval;
+ retval.reserve(size() / chunklen + 1);
+
+ size_type count = 0;
+ const_iterator i = begin(), last = i;
+ for (; i != end(); i++, count++)
+ {
+ if (count == chunklen)
+ {
+ count = 0;
+ retval.push_back(string_ref(last, i));
+ last = i;
+ }
+ }
+
+ if (last != i)
+ {
+ retval.push_back(string_ref(last, i));
+ }
- /**
+ return retval;
+ }
+
+ /**
* Join a sequence of strings by some glue to create a new string
*
* Glue is not added to the end of the string.
@@ -495,43 +513,43 @@ namespace std
* This|is|a|test.
* @endcode
*/
- template <class InputIterator>
- static string_ref join(const string &glue, InputIterator first, InputIterator last)
- {
- string_ref retval;
-
- for (; first != last; ++first)
- {
- retval.append(*first);
- retval.append(glue);
- }
- retval.erase(retval.length() - glue.length());
-
- return retval;
- }
-
- /**
+ template<class InputIterator>
+ static string_ref join(string const& glue, InputIterator first, InputIterator last)
+ {
+ string_ref retval;
+
+ for (; first != last; ++first)
+ {
+ retval.append(*first);
+ retval.append(glue);
+ }
+ retval.erase(retval.length() - glue.length());
+
+ return retval;
+ }
+
+ /**
* Join a sequence of strings by some glue to create a new string
*
* @copydoc join
* @ref join_ex
*/
- template <class InputIterator>
- static string_ref join(value_type glue, InputIterator first, InputIterator last)
- {
- string_ref retval;
-
- for (; first != last; ++first)
- {
- retval.append(*first);
- retval.append(1, glue);
- }
- retval.erase(retval.length() - 1);
-
- return retval;
- }
-
- /**
+ template<class InputIterator>
+ static string_ref join(value_type glue, InputIterator first, InputIterator last)
+ {
+ string_ref retval;
+
+ for (; first != last; ++first)
+ {
+ retval.append(*first);
+ retval.append(1, glue);
+ }
+ retval.erase(retval.length() - 1);
+
+ return retval;
+ }
+
+ /**
* Search for any instances of @p needle and replace them with @p s
*
* @param[in] needle The string to replace
@@ -548,33 +566,29 @@ namespace std
* There ere a test.
* @endcode
*/
- string_ref &replace(const string &needle, const string &s)
- {
- size_type
- lastpos = 0,
- thispos;
-
- while ((thispos = find(needle, lastpos)) != npos)
- {
- string::replace(thispos, needle.length(), s);
- lastpos = thispos + 1;
- }
- return *this;
- }
- string_ref &replace_first(const string &needle, const string &s)
- {
- size_type
- lastpos = 0,
- thispos;
-
- if ((thispos = find(needle, lastpos)) != npos)
- {
- string::replace(thispos, needle.length(), s);
- lastpos = thispos + 1;
- }
- return *this;
- }
- /**
+ string_ref& replace(string const& needle, string const& s)
+ {
+ size_type lastpos = 0, thispos;
+
+ while ((thispos = find(needle, lastpos)) != npos)
+ {
+ string::replace(thispos, needle.length(), s);
+ lastpos = thispos + 1;
+ }
+ return *this;
+ }
+ string_ref& replace_first(string const& needle, string const& s)
+ {
+ size_type lastpos = 0, thispos;
+
+ if ((thispos = find(needle, lastpos)) != npos)
+ {
+ string::replace(thispos, needle.length(), s);
+ lastpos = thispos + 1;
+ }
+ return *this;
+ }
+ /**
* Search of any instances of @p needle and replace them with @p c
*
* @param[in] needle The character to replace
@@ -584,16 +598,20 @@ namespace std
*
* @ref replace-ex
*/
- string_ref &replace(value_type needle, value_type c)
- {
- for (iterator i = begin(); i != end(); i++)
- if (*i == needle)
- *i = c;
+ string_ref& replace(value_type needle, value_type c)
+ {
+ for (iterator i = begin(); i != end(); i++)
+ {
+ if (*i == needle)
+ {
+ *i = c;
+ }
+ }
- return *this;
- }
+ return *this;
+ }
- /**
+ /**
* Repeat a string @p n times
*
* @param[in] n The number of times to repeat the string
@@ -608,176 +626,221 @@ namespace std
* 123123123
* @endcode
*/
- string_ref operator*(size_type n)
- {
- string_ref retval;
- for (size_type i = 0; i < n; i++)
- retval.append(*this);
+ string_ref operator*(size_type n)
+ {
+ string_ref retval;
+ for (size_type i = 0; i < n; i++)
+ {
+ retval.append(*this);
+ }
- return retval;
- }
+ return retval;
+ }
- /**
+ /**
* Convert the string to lowercase
*
* @return *this
* @post The string is converted to lowercase
*/
- string_ref &tolower()
- {
- for (iterator i = begin(); i != end(); i++)
- if (*i >= 'A' && *i <= 'Z')
- *i = (*i) + ('a' - 'A');
- return *this;
- }
+ string_ref& tolower()
+ {
+ for (iterator i = begin(); i != end(); i++)
+ {
+ if (*i >= 'A' && *i <= 'Z')
+ {
+ *i = (*i) + ('a' - 'A');
+ }
+ }
+ return *this;
+ }
- /**
+ /**
* Convert the string to uppercase
*
* @return *this
* @post The string is converted to uppercase
*/
- string_ref &toupper()
- {
- for (iterator i = begin(); i != end(); i++)
- if (*i >= 'a' && *i <= 'z')
- *i = (*i) - ('a' - 'A');
- return *this;
- }
+ string_ref& toupper()
+ {
+ for (iterator i = begin(); i != end(); i++)
+ {
+ if (*i >= 'a' && *i <= 'z')
+ {
+ *i = (*i) - ('a' - 'A');
+ }
+ }
+ return *this;
+ }
- /**
+ /**
* Count the occurances of @p str in the string.
*
* @return The count of substrings @p str in the string
*/
- size_type count(const string &str) const
- {
- size_type
- count = 0,
- last = 0,
- cur = 0;
-
- while ((cur = find(str, last + 1)) != npos)
- {
- count++;
- last = cur;
- }
-
- return count;
- }
+ size_type count(string const& str) const
+ {
+ size_type count = 0, last = 0, cur = 0;
- /**
+ while ((cur = find(str, last + 1)) != npos)
+ {
+ count++;
+ last = cur;
+ }
+
+ return count;
+ }
+
+ /**
* Determine if the string is alphanumeric
*
* @return true if the string contains only characters between a-z, A-Z and 0-9 and
* contains at least one character, else false
*/
- bool is_alnum() const
+ bool is_alnum() const
+ {
+ if (length() == 0)
+ {
+ return false;
+ }
+
+ for (const_iterator i = begin(); i != end(); i++)
+ {
+ if (*i < 'A' || *i > 'Z')
+ {
+ if (*i < '0' || *i > '9')
{
- if (length() == 0)
- return false;
-
- for (const_iterator i = begin(); i != end(); i++)
- {
- if (*i < 'A' || *i > 'Z')
- if (*i < '0' || *i > '9')
- if (*i < 'a' || *i > 'z')
- return false;
- }
-
- return true;
+ if (*i < 'a' || *i > 'z')
+ {
+ return false;
+ }
}
+ }
+ }
+
+ return true;
+ }
- /**
+ /**
* Determine if the string is alphabetic only
*
* @return true of the string contains only characters between a-z and A-Z and contains at
* least one character, else false
*/
- bool is_alpha() const
- {
- if (length() == 0)
- return false;
+ bool is_alpha() const
+ {
+ if (length() == 0)
+ {
+ return false;
+ }
- for (const_iterator i = begin(); i != end(); i++)
- if (*i < 'A' || (*i > 'Z' && (*i < 'a' || *i > 'z')))
- return false;
+ for (const_iterator i = begin(); i != end(); i++)
+ {
+ if (*i < 'A' || (*i > 'Z' && (*i < 'a' || *i > 'z')))
+ {
+ return false;
+ }
+ }
- return true;
- }
+ return true;
+ }
- /**
+ /**
* Determine if the string is numeric only
*
* @return true if the string contains only characters between 0-9 and contains at least
* one character, else false
*/
- bool is_numeric() const
- {
- if (length() == 0)
- return false;
+ bool is_numeric() const
+ {
+ if (length() == 0)
+ {
+ return false;
+ }
- for (const_iterator i = begin(); i != end(); i++)
- if (*i < '0' || *i > '9')
- return false;
+ for (const_iterator i = begin(); i != end(); i++)
+ {
+ if (*i < '0' || *i > '9')
+ {
+ return false;
+ }
+ }
- return true;
- }
+ return true;
+ }
- /**
+ /**
* Determine if a string is all lower case
*
* @return true if there is at least one character, and all characters are lowercase
* letters, else false
*/
- bool is_lower() const
- {
- if (length() == 0)
- return false;
+ bool is_lower() const
+ {
+ if (length() == 0)
+ {
+ return false;
+ }
- for (const_iterator i = begin(); i != end(); i++)
- if (*i < 'a' || *i < 'z')
- return false;
+ for (const_iterator i = begin(); i != end(); i++)
+ {
+ if (*i < 'a' || *i < 'z')
+ {
+ return false;
+ }
+ }
- return true;
- }
+ return true;
+ }
- /**
+ /**
* Determine if a string is all upper case
*
* @return true if there is at least one character, and all characters are uppercase
* letters, else false
*/
- bool is_upper() const
- {
- if (length() == 0)
- return false;
+ bool is_upper() const
+ {
+ if (length() == 0)
+ {
+ return false;
+ }
- for (const_iterator i = begin(); i != end(); i++)
- if (*i < 'A' || *i > 'Z')
- return false;
+ for (const_iterator i = begin(); i != end(); i++)
+ {
+ if (*i < 'A' || *i > 'Z')
+ {
+ return false;
+ }
+ }
- return true;
- }
+ return true;
+ }
- /**
+ /**
* Swap the case of a string
*
* @post Converts all uppercase to lowercase, and all lowercase to uppercase in the string
* @return *this
*/
- string_ref &swapcase()
- {
- for (iterator i = begin(); i != end(); i++)
- if (*i >= 'A' && *i <= 'Z')
- *i += ('a' - 'A');
- else if (*i >= 'a' && *i <= 'z')
- *i -= ('a' - 'A');
+ string_ref& swapcase()
+ {
+ for (iterator i = begin(); i != end(); i++)
+ {
+ if (*i >= 'A' && *i <= 'Z')
+ {
+ *i += ('a' - 'A');
+ }
+ else if (*i >= 'a' && *i <= 'z')
+ {
+ *i -= ('a' - 'A');
+ }
+ }
- return *this;
- }
+ return *this;
+ }
- /*******************************************************************************
+ /*******************************************************************************
Function: std::string_ref::start_with
Access: public
Qualifier: const
@@ -786,73 +849,84 @@ namespace std
Purpose: is the string start with str
*******************************************************************************/
- bool start_with(const string& str) const
- {
- return ( this->find(str) == 0 );
- }
-
- /// Return a string_ref equal to 'this' but with only the last \p N
- /// elements remaining. If \p N is greater than the length of the
- /// string, the entire string is returned.
-
- string_ref take_back(size_t N = 1) const {
- if (N >= size())
- return *this;
- return drop_front(size() - N);
- }
- /// Return a string_ref equal to 'this' but with the first \p N elements
- /// dropped.
-
- string_ref drop_front(size_t N = 1) const {
- //assert(size() >= N && "Dropping more elements than exist");
- return substr(N);
- }
-
-
-
- /// Return a string_ref equal to 'this' but with the last \p N elements
- /// dropped.
-
- string_ref drop_back(size_t N = 1) const {
-
- return substr(0, size() - N);
- }
-
- /// Return a string_ref equal to 'this', but with all characters satisfying
- /// the given predicate dropped from the beginning of the string.
-
- string_ref drop_while(std::function<bool(char)> F) const {
- return substr(std::find_if_not(begin(),end(),F)-begin());
- }
-
- /// Return a string_ref equal to 'this', but with all characters not
- /// satisfying the given predicate dropped from the beginning of the string.
-
- string_ref drop_until(std::function<bool(char)> F) const {
- return substr(std::find_if(begin(), end(), F) - begin());
- }
-
- /// Returns true if this string_ref has the given prefix and removes that
- /// prefix.
- bool consume_front(string_ref Prefix) {
- if (!start_with(Prefix))
- return false;
-
- *this = drop_front(Prefix.size());
- return true;
- }
-
- /// Returns true if this string_ref has the given suffix and removes that
- /// suffix.
- bool consume_back(string_ref Suffix) {
- if (!end_with(Suffix))
- return false;
+ bool start_with(string const& str) const
+ {
+ return (this->find(str) == 0);
+ }
+
+ /// Return a string_ref equal to 'this' but with only the last \p N
+ /// elements remaining. If \p N is greater than the length of the
+ /// string, the entire string is returned.
+
+ string_ref take_back(size_t N = 1) const
+ {
+ if (N >= size())
+ {
+ return *this;
+ }
+ return drop_front(size() - N);
+ }
+ /// Return a string_ref equal to 'this' but with the first \p N elements
+ /// dropped.
+
+ string_ref drop_front(size_t N = 1) const
+ {
+ //assert(size() >= N && "Dropping more elements than exist");
+ return substr(N);
+ }
+
+ /// Return a string_ref equal to 'this' but with the last \p N elements
+ /// dropped.
+
+ string_ref drop_back(size_t N = 1) const
+ {
+
+ return substr(0, size() - N);
+ }
+
+ /// Return a string_ref equal to 'this', but with all characters satisfying
+ /// the given predicate dropped from the beginning of the string.
+
+ string_ref drop_while(std::function<bool(char)> F) const
+ {
+ return substr(std::find_if_not(begin(), end(), F) - begin());
+ }
+
+ /// Return a string_ref equal to 'this', but with all characters not
+ /// satisfying the given predicate dropped from the beginning of the string.
+
+ string_ref drop_until(std::function<bool(char)> F) const
+ {
+ return substr(std::find_if(begin(), end(), F) - begin());
+ }
+
+ /// Returns true if this string_ref has the given prefix and removes that
+ /// prefix.
+ bool consume_front(string_ref Prefix)
+ {
+ if (!start_with(Prefix))
+ {
+ return false;
+ }
+
+ *this = drop_front(Prefix.size());
+ return true;
+ }
+
+ /// Returns true if this string_ref has the given suffix and removes that
+ /// suffix.
+ bool consume_back(string_ref Suffix)
+ {
+ if (!end_with(Suffix))
+ {
+ return false;
+ }
- *this = drop_back(Suffix.size());
- return true;
- }
+ *this = drop_back(Suffix.size());
+ return true;
+ }
- /*******************************************************************************
+ /*******************************************************************************
Function: std::string_ref::end_with
Access: public
Qualifier: const
@@ -861,17 +935,17 @@ namespace std
Purpose: is the string end with str
*******************************************************************************/
- bool end_with(const string& str) const
- {
- if (str.length() > this->length())
- {
- return false;
- }
- size_type off = this->length() - str.length();
- return ( find(str, off) == off);
- }
+ bool end_with(string const& str) const
+ {
+ if (str.length() > this->length())
+ {
+ return false;
+ }
+ size_type off = this->length() - str.length();
+ return (find(str, off) == off);
+ }
- /*******************************************************************************
+ /*******************************************************************************
Function: hl_lib::string_ref::format
Access: public
Qualifier:
@@ -881,40 +955,40 @@ namespace std
Purpose: format the string
*******************************************************************************/
- string_ref& format(const char* format_string, ...)
- {
- if (format_string == 0)
- {
- return *this;
- }
+ string_ref& format(char const* format_string, ...)
+ {
+ if (format_string == 0)
+ {
+ return *this;
+ }
- va_list argList;
- va_start( argList, format_string );
+ va_list argList;
+ va_start(argList, format_string);
#ifdef _WIN32
- int len = _vscprintf( format_string, argList );
- char* pbuf = new char[len + 1];
- if (pbuf != 0)
- {
- vsprintf_s( pbuf, len + 1, format_string, argList );
- *this = pbuf;
- delete[] pbuf;
- }
+ int len = _vscprintf(format_string, argList);
+ char* pbuf = new char[len + 1];
+ if (pbuf != 0)
+ {
+ vsprintf_s(pbuf, len + 1, format_string, argList);
+ *this = pbuf;
+ delete[] pbuf;
+ }
#else
- const int INLINE_FORMAT_BUFFER_LEN =2048;
- char* buf = new char[INLINE_FORMAT_BUFFER_LEN + 1];
- if (buf != 0)
- {
- int len =vsnprintf(buf,INLINE_FORMAT_BUFFER_LEN, format_string, argList);
- assign(buf,buf+len);
- delete[] buf;
- }
+ int const INLINE_FORMAT_BUFFER_LEN = 2048;
+ char* buf = new char[INLINE_FORMAT_BUFFER_LEN + 1];
+ if (buf != 0)
+ {
+ int len = vsnprintf(buf, INLINE_FORMAT_BUFFER_LEN, format_string, argList);
+ assign(buf, buf + len);
+ delete[] buf;
+ }
#endif
- va_end( argList );
- return *this;
- }
+ va_end(argList);
+ return *this;
+ }
- /*******************************************************************************
+ /*******************************************************************************
Function: hl_lib::string_ref::trim_left
Access: public
Qualifier:
@@ -923,17 +997,17 @@ namespace std
Purpose: delete all char which is ch at the left of the string
*******************************************************************************/
- string_ref& trim_left(value_type ch = ' ')
- {
- size_type off = this->find_first_not_of(ch);
- if (off != string::npos)
- {
- this->erase(0, off);
- }
- return *this;
- }
+ string_ref& trim_left(value_type ch = ' ')
+ {
+ size_type off = this->find_first_not_of(ch);
+ if (off != string::npos)
+ {
+ this->erase(0, off);
+ }
+ return *this;
+ }
- /*******************************************************************************
+ /*******************************************************************************
Function: hl_lib::string_ref::trim_right
Access: public
Qualifier:
@@ -942,22 +1016,22 @@ namespace std
Purpose: delete all char which is ch at the right of the string
*******************************************************************************/
- string_ref& trim_right(value_type ch = ' ')
- {
- size_type off = this->find_last_not_of(ch);
- if (off == string::npos)
- {
- off = 0;
- }
- else
- {
- off++;
- }
- this->erase(off, length() - off);
- return *this;
- }
+ string_ref& trim_right(value_type ch = ' ')
+ {
+ size_type off = this->find_last_not_of(ch);
+ if (off == string::npos)
+ {
+ off = 0;
+ }
+ else
+ {
+ off++;
+ }
+ this->erase(off, length() - off);
+ return *this;
+ }
- /*******************************************************************************
+ /*******************************************************************************
Function: hl_lib::string_ref::trim
Access: public
Qualifier:
@@ -966,14 +1040,14 @@ namespace std
Purpose: delete all char which is ch at the left and right of the string
*******************************************************************************/
- string_ref& trim(value_type ch = ' ')
- {
- trim_left(ch);
- trim_right(ch);
- return *this;
- }
-
- /*******************************************************************************
+ string_ref& trim(value_type ch = ' ')
+ {
+ trim_left(ch);
+ trim_right(ch);
+ return *this;
+ }
+
+ /*******************************************************************************
Function: hl_lib::string_ref::float_num
Access: public static
Qualifier:
@@ -982,12 +1056,12 @@ namespace std
Purpose: parse str to a float number
*******************************************************************************/
- static double float_num(const string& str)
- {
- return atof(str.c_str());
- }
+ static double float_num(string const& str)
+ {
+ return atof(str.c_str());
+ }
- /*******************************************************************************
+ /*******************************************************************************
Function: hl_lib::string_ref::float_num
Access: public static
Qualifier:
@@ -995,12 +1069,12 @@ namespace std
Purpose: parse this to a float number
*******************************************************************************/
- double float_num() const
- {
- return float_num(*this);
- }
+ double float_num() const
+ {
+ return float_num(*this);
+ }
- /*******************************************************************************
+ /*******************************************************************************
Function: hl_lib::string_ref::compare_nocase
Access: public
Qualifier: const
@@ -1009,16 +1083,16 @@ namespace std
Purpose: compare string no case
*******************************************************************************/
- int compare_nocase(const string& str) const
- {
+ int compare_nocase(string const& str) const
+ {
#ifdef _WIN32
- return _stricmp(this->c_str(), str.c_str());
+ return _stricmp(this->c_str(), str.c_str());
#else
- return strcasecmp(this->c_str(), str.c_str());
+ return strcasecmp(this->c_str(), str.c_str());
#endif
- }
+ }
- /*******************************************************************************
+ /*******************************************************************************
Function: hl_lib::string_ref::compare_nocase
Access: public
Qualifier: const
@@ -1029,13 +1103,13 @@ namespace std
Purpose: compare substring no case
*******************************************************************************/
- int compare_nocase( size_type index, size_type length, const string &str ) const
- {
- string_ref temp = this->substr(index, length);
- return temp.compare_nocase(str);
- }
+ int compare_nocase(size_type index, size_type length, string const& str) const
+ {
+ string_ref temp = this->substr(index, length);
+ return temp.compare_nocase(str);
+ }
- /*******************************************************************************
+ /*******************************************************************************
Function: hl_lib::string_ref::compare_nocase
Access: public
Qualifier: const
@@ -1048,14 +1122,12 @@ namespace std
Purpose: compare two substring no case
*******************************************************************************/
- int compare_nocase( size_type index, size_type length, const string &str, size_type index2, size_type length2) const
- {
- string_ref temp1 = this->substr(index, length);
- string_ref temp2 = str.substr(index2, length2);
- return temp1.compare_nocase(temp2);
- }
-
- };
-
-}
-
+ int compare_nocase(size_type index, size_type length, string const& str, size_type index2, size_type length2) const
+ {
+ string_ref temp1 = this->substr(index, length);
+ string_ref temp2 = str.substr(index2, length2);
+ return temp1.compare_nocase(temp2);
+ }
+};
+
+} // namespace std
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ParentProcessWatcher.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ParentProcessWatcher.h
index 6d082d2d2a..96d6f67a3c 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ParentProcessWatcher.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ParentProcessWatcher.h
@@ -6,12 +6,11 @@
class ParentProcessWatcher
{
public:
- struct ParentProcessWatcherData;
+ struct ParentProcessWatcherData;
- ParentProcessWatcher(lsp::Log& log, int pid, const std::function<void()>&& callback, uint32_t poll_delay_secs = 10);
+ ParentProcessWatcher(lsp::Log& log, int pid, std::function<void()> const&& callback, uint32_t poll_delay_secs = 10);
- ~ParentProcessWatcher();
+ ~ParentProcessWatcher();
- std::shared_ptr<ParentProcessWatcherData> d_ptr;
+ std::shared_ptr<ParentProcessWatcherData> d_ptr;
};
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ProcessIoService.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ProcessIoService.h
index 5edecef0b2..6f7e216a40 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ProcessIoService.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ProcessIoService.h
@@ -4,45 +4,41 @@
namespace lsp
{
- class ProcessIoService
- {
- public:
- using IOService = boost::asio::io_service;
- using Work = boost::asio::io_service::work;
- using WorkPtr = std::unique_ptr<Work>;
-
- ProcessIoService() {
-
- work_ = std::unique_ptr<Work>(new Work(ioService_));
- auto temp_thread_ = new std::thread([this]
- {
- ioService_.run();
- });
- thread_ = std::unique_ptr<std::thread>(temp_thread_);
- }
+class ProcessIoService
+{
+public:
+ using IOService = boost::asio::io_context;
+ using Work = boost::asio::executor_work_guard<boost::asio::io_context::executor_type>;
+ using WorkPtr = std::unique_ptr<Work>;
- ProcessIoService(const ProcessIoService&) = delete;
- ProcessIoService& operator=(const ProcessIoService&) = delete;
+ ProcessIoService()
+ {
- boost::asio::io_service& getIOService()
- {
- return ioService_;
- }
+ work_ = std::unique_ptr<Work>(new Work(ioService_.get_executor()));
+ auto temp_thread_ = new std::thread([this] { ioService_.run(); });
+ thread_ = std::unique_ptr<std::thread>(temp_thread_);
+ }
- void stop()
- {
+ ProcessIoService(ProcessIoService const&) = delete;
+ ProcessIoService& operator=(ProcessIoService const&) = delete;
- work_.reset();
+ boost::asio::io_context& getIOService()
+ {
+ return ioService_;
+ }
- thread_->join();
+ void stop()
+ {
- }
+ work_.reset();
- private:
- IOService ioService_;
- WorkPtr work_;
- std::unique_ptr<std::thread> thread_;
+ thread_->join();
+ }
- };
+private:
+ IOService ioService_;
+ WorkPtr work_;
+ std::unique_ptr<std::thread> thread_;
+};
-}
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ProtocolJsonHandler.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ProtocolJsonHandler.h
index f6097fe172..11483e6c6b 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ProtocolJsonHandler.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ProtocolJsonHandler.h
@@ -1,11 +1,12 @@
#pragma once
#include "LibLsp/JsonRpc/MessageJsonHandler.h"
-namespace lsp {
- class ProtocolJsonHandler : public MessageJsonHandler
- {
- public:
- ProtocolJsonHandler();
- };
+namespace lsp
+{
+class ProtocolJsonHandler : public MessageJsonHandler
+{
+public:
+ ProtocolJsonHandler();
+};
-}
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ResourceOperation.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ResourceOperation.h
index 3d317a8153..0fe3c9f37b 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/ResourceOperation.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/ResourceOperation.h
@@ -5,117 +5,119 @@
#include "lsDocumentUri.h"
#include "LibLsp/lsp/lsAny.h"
#include "LibLsp/lsp/lsTextEdit.h"
-struct ResourceOperation {
- std::string kind;
- virtual ~ResourceOperation() = default;
+struct ResourceOperation
+{
+ std::string kind;
+ virtual ~ResourceOperation() = default;
- MAKE_SWAP_METHOD(ResourceOperation, kind);
+ MAKE_SWAP_METHOD(ResourceOperation, kind);
};
MAKE_REFLECT_STRUCT(ResourceOperation, kind);
extern void Reflect(Writer& visitor, ResourceOperation* value);
-struct CreateFileOptions{
+struct CreateFileOptions
+{
- /**
+ /**
* Overwrite existing file. Overwrite wins over `ignoreIfExists`
*/
- optional<bool> overwrite = false;
+ optional<bool> overwrite = false;
- /**
+ /**
* Ignore if exists.
*/
- optional< bool> ignoreIfExists =false;
+ optional<bool> ignoreIfExists = false;
- MAKE_SWAP_METHOD(CreateFileOptions, overwrite, ignoreIfExists)
+ MAKE_SWAP_METHOD(CreateFileOptions, overwrite, ignoreIfExists)
};
MAKE_REFLECT_STRUCT(CreateFileOptions, overwrite, ignoreIfExists)
-struct lsCreateFile :public ResourceOperation {
+struct lsCreateFile : public ResourceOperation
+{
- /**
+ /**
* The resource to create.
*/
- lsCreateFile();
- lsDocumentUri uri;
+ lsCreateFile();
+ lsDocumentUri uri;
- /**
+ /**
* Additional options
*/
- optional<CreateFileOptions> options;
+ optional<CreateFileOptions> options;
-
- /**
+ /**
* An optional annotation identifer describing the operation.
*
* @since 3.16.0
*/
- optional<lsChangeAnnotationIdentifier> annotationId;
+ optional<lsChangeAnnotationIdentifier> annotationId;
- MAKE_SWAP_METHOD(lsCreateFile, kind, uri, options, annotationId)
+ MAKE_SWAP_METHOD(lsCreateFile, kind, uri, options, annotationId)
};
-MAKE_REFLECT_STRUCT(lsCreateFile, kind, uri,options, annotationId)
-
+MAKE_REFLECT_STRUCT(lsCreateFile, kind, uri, options, annotationId)
-struct DeleteFileOptions {
- /**
+struct DeleteFileOptions
+{
+ /**
* Delete the content recursively if a folder is denoted.
*/
- optional<bool> recursive = false;
+ optional<bool> recursive = false;
- /**
+ /**
* Ignore the operation if the file doesn't exist.
*/
- optional<bool> ignoreIfNotExists = false;
+ optional<bool> ignoreIfNotExists = false;
-
- MAKE_SWAP_METHOD(DeleteFileOptions, recursive, ignoreIfNotExists);
+ MAKE_SWAP_METHOD(DeleteFileOptions, recursive, ignoreIfNotExists);
};
MAKE_REFLECT_STRUCT(DeleteFileOptions, recursive, ignoreIfNotExists)
-struct lsDeleteFile :public ResourceOperation {
- /**
+struct lsDeleteFile : public ResourceOperation
+{
+ /**
* The file to delete.
*/
- lsDeleteFile();
- lsDocumentUri uri;
+ lsDeleteFile();
+ lsDocumentUri uri;
- /**
+ /**
* Delete options.
*/
- optional<DeleteFileOptions> options;
+ optional<DeleteFileOptions> options;
- MAKE_SWAP_METHOD(lsDeleteFile, kind, uri, options);
+ MAKE_SWAP_METHOD(lsDeleteFile, kind, uri, options);
};
-MAKE_REFLECT_STRUCT(lsDeleteFile, kind, uri,options);
+MAKE_REFLECT_STRUCT(lsDeleteFile, kind, uri, options);
-typedef CreateFileOptions RenameFileOptions;
-struct lsRenameFile :public ResourceOperation {
- /**
+typedef CreateFileOptions RenameFileOptions;
+struct lsRenameFile : public ResourceOperation
+{
+ /**
* The old (existing) location.
*/
- lsRenameFile();
- lsDocumentUri oldUri;
+ lsRenameFile();
+ lsDocumentUri oldUri;
- /**
+ /**
* The new location.
*/
- lsDocumentUri newUri;
+ lsDocumentUri newUri;
- /**
+ /**
* Rename options.
*/
- optional<RenameFileOptions> options;
+ optional<RenameFileOptions> options;
- /**
+ /**
* An optional annotation identifer describing the operation.
*
* @since 3.16.0
*/
- optional<lsChangeAnnotationIdentifier> annotationId;
+ optional<lsChangeAnnotationIdentifier> annotationId;
- MAKE_SWAP_METHOD(lsRenameFile, kind, oldUri, newUri, options, annotationId)
+ MAKE_SWAP_METHOD(lsRenameFile, kind, oldUri, newUri, options, annotationId)
};
MAKE_REFLECT_STRUCT(lsRenameFile, kind, oldUri, newUri, options, annotationId);
-
-extern ResourceOperation* GetResourceOperation(lsp::Any& lspAny);
+extern ResourceOperation* GetResourceOperation(lsp::Any& lspAny);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/SimpleTimer.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/SimpleTimer.h
index 3178d25d69..7b8f7f4265 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/SimpleTimer.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/SimpleTimer.h
@@ -8,21 +8,22 @@ template<typename Duration = boost::posix_time::milliseconds>
class SimpleTimer
{
public:
- SimpleTimer(unsigned int duration,const std::function<void()>& _call_back)
- :is_running_(true), call_back(_call_back), _deadline_timer(_ios, Duration(duration))
+ SimpleTimer(unsigned int duration, std::function<void()> const& _call_back)
+ : is_running_(true), call_back(_call_back), _deadline_timer(_ios, Duration(duration))
{
- _deadline_timer.async_wait([&](const boost::system::error_code& e)
- {
- if (e.value() == boost::asio::error::operation_aborted)
- {
- return;
- }
- if(is_running_.load(std::memory_order_relaxed))
+ _deadline_timer.async_wait(
+ [&](boost::system::error_code const& e)
{
- call_back();
+ if (e.value() == boost::asio::error::operation_aborted)
+ {
+ return;
+ }
+ if (is_running_.load(std::memory_order_relaxed))
+ {
+ call_back();
+ }
}
-
- });
+ );
_thread = std::thread([this] { _ios.run(); });
}
~SimpleTimer()
@@ -38,12 +39,11 @@ public:
_thread.join();
}
}
+
private:
std::atomic_bool is_running_;
std::function<void()> call_back;
- boost::asio::io_service _ios;
+ boost::asio::io_context _ios;
boost::asio::deadline_timer _deadline_timer;
std::thread _thread;
-
-
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/client/registerCapability.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/client/registerCapability.h
index 60484db56a..f4431f0235 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/client/registerCapability.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/client/registerCapability.h
@@ -6,24 +6,24 @@
* General parameters to register for a capability.
*/
-struct Registration {
- static Registration Create(const std::string& method);
- /**
+struct Registration
+{
+ static Registration Create(std::string const& method);
+ /**
* The id used to register the request. The id can be used to deregister
* the request again.
*/
- std::string id;
+ std::string id;
- /**
+ /**
* The method / capability to register for.
*/
- std::string method;
+ std::string method;
- MAKE_SWAP_METHOD(Registration, id, method);
+ MAKE_SWAP_METHOD(Registration, id, method);
};
-
MAKE_REFLECT_STRUCT(Registration, id, method);
/**
@@ -35,8 +35,8 @@ MAKE_REFLECT_STRUCT(Registration, id, method);
*/
struct RegistrationParams
{
- std::vector<Registration> registrations;
- MAKE_SWAP_METHOD(RegistrationParams, registrations);
+ std::vector<Registration> registrations;
+ MAKE_SWAP_METHOD(RegistrationParams, registrations);
};
/**
* The client/registerCapability request is sent from the server to the client
@@ -46,4 +46,4 @@ struct RegistrationParams
*/
MAKE_REFLECT_STRUCT(RegistrationParams, registrations);
-DEFINE_REQUEST_RESPONSE_TYPE(Req_ClientRegisterCapability, RegistrationParams,JsonNull, "client/registerCapability");
+DEFINE_REQUEST_RESPONSE_TYPE(Req_ClientRegisterCapability, RegistrationParams, JsonNull, "client/registerCapability");
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/client/unregisterCapability.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/client/unregisterCapability.h
index 33bf9d1db6..f70dfd639c 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/client/unregisterCapability.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/client/unregisterCapability.h
@@ -9,21 +9,22 @@
* General parameters to unregister a capability.
*/
-struct Unregistration {
- /**
+struct Unregistration
+{
+ /**
* The id used to unregister the request or notification. Usually an id
* provided during the register request.
*/
- std::string id;
+ std::string id;
- /**
+ /**
* The method / capability to unregister for.
*/
- std::string method;
+ std::string method;
- MAKE_SWAP_METHOD(Unregistration, id, method);
+ MAKE_SWAP_METHOD(Unregistration, id, method);
};
MAKE_REFLECT_STRUCT(Unregistration, id, method);
/**
@@ -32,10 +33,12 @@ MAKE_REFLECT_STRUCT(Unregistration, id, method);
*/
struct UnregistrationParams
{
- std::vector<Unregistration> unregisterations;
- MAKE_SWAP_METHOD(UnregistrationParams, unregisterations);
+ std::vector<Unregistration> unregisterations;
+ MAKE_SWAP_METHOD(UnregistrationParams, unregisterations);
};
MAKE_REFLECT_STRUCT(UnregistrationParams, unregisterations);
-DEFINE_REQUEST_RESPONSE_TYPE(Req_ClientUnregisterCapability, UnregistrationParams,JsonNull, "client/unregisterCapability");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ Req_ClientUnregisterCapability, UnregistrationParams, JsonNull, "client/unregisterCapability"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/Move.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/Move.h
index c0beb625f2..af64f2ba2e 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/Move.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/Move.h
@@ -7,8 +7,4 @@
#include "getMoveDestinations.h"
#include "getRefactorEdit.h"
-
DEFINE_REQUEST_RESPONSE_TYPE(java_move, MoveParams, RefactorWorkspaceEdit, "java/move");
-
-
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/OverridableMethod.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/OverridableMethod.h
index dd0ada60cc..2e577d3915 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/OverridableMethod.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/OverridableMethod.h
@@ -4,31 +4,31 @@
#include <string>
struct OverridableMethod
{
- std::string bindingKey;
- std::string name;
- std::vector<std::string> parameters;
- bool unimplemented = false;
- std::string declaringClass;
- std::string declaringClassType;
+ std::string bindingKey;
+ std::string name;
+ std::vector<std::string> parameters;
+ bool unimplemented = false;
+ std::string declaringClass;
+ std::string declaringClassType;
- void swap(OverridableMethod& arg) noexcept
- {
- bindingKey.swap(arg.bindingKey);
- name.swap(arg.name);
- parameters.swap(arg.parameters);
- declaringClass.swap(arg.declaringClass);
- declaringClassType.swap(arg.declaringClassType);
- std::swap(unimplemented, arg.unimplemented);
- }
+ void swap(OverridableMethod& arg) noexcept
+ {
+ bindingKey.swap(arg.bindingKey);
+ name.swap(arg.name);
+ parameters.swap(arg.parameters);
+ declaringClass.swap(arg.declaringClass);
+ declaringClassType.swap(arg.declaringClassType);
+ std::swap(unimplemented, arg.unimplemented);
+ }
};
MAKE_REFLECT_STRUCT(OverridableMethod, bindingKey, name, parameters, unimplemented, declaringClass, declaringClassType);
-struct OverridableMethodsResponse
+struct OverridableMethodsResponse
{
- std::string type;
- std::vector<OverridableMethod> methods;
+ std::string type;
+ std::vector<OverridableMethod> methods;
- MAKE_SWAP_METHOD(OverridableMethodsResponse, type, methods)
+ MAKE_SWAP_METHOD(OverridableMethodsResponse, type, methods)
};
MAKE_REFLECT_STRUCT(OverridableMethodsResponse, type, methods)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h
index c8ddbe3c01..c49c8c72f6 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h
@@ -3,11 +3,9 @@
#include "LibLsp/JsonRpc/serializer.h"
#include <string>
-
-struct WorkspaceSymbolParams
+struct WorkspaceSymbolParams
{
- std::string query;
- MAKE_SWAP_METHOD(WorkspaceSymbolParams, query);
+ std::string query;
+ MAKE_SWAP_METHOD(WorkspaceSymbolParams, query);
};
MAKE_REFLECT_STRUCT(WorkspaceSymbolParams, query);
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/addOverridableMethods.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/addOverridableMethods.h
index 527b3b1827..2d8d90e2e1 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/addOverridableMethods.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/addOverridableMethods.h
@@ -5,15 +5,16 @@
#include "LibLsp/lsp/CodeActionParams.h"
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
-struct AddOverridableMethodParams {
- lsCodeActionParams context;
- std::vector<OverridableMethod> overridableMethods;
+struct AddOverridableMethodParams
+{
+ lsCodeActionParams context;
+ std::vector<OverridableMethod> overridableMethods;
- MAKE_SWAP_METHOD(AddOverridableMethodParams, context, overridableMethods);
+ MAKE_SWAP_METHOD(AddOverridableMethodParams, context, overridableMethods);
};
MAKE_REFLECT_STRUCT(AddOverridableMethodParams, context, overridableMethods);
-DEFINE_REQUEST_RESPONSE_TYPE(java_addOverridableMethods, AddOverridableMethodParams, lsWorkspaceEdit, "java/addOverridableMethods");
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_addOverridableMethods, AddOverridableMethodParams, lsWorkspaceEdit, "java/addOverridableMethods"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/buildWorkspace.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/buildWorkspace.h
index 4809e360bb..72d457e8d7 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/buildWorkspace.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/buildWorkspace.h
@@ -4,13 +4,13 @@
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
+enum class BuildWorkspaceStatus : uint8_t
+{
-
-
-
-enum class BuildWorkspaceStatus : uint8_t{
-
- FAILED, SUCCEED, WITH_ERROR, CANCELLED,
+ FAILED,
+ SUCCEED,
+ WITH_ERROR,
+ CANCELLED,
};
MAKE_REFLECT_TYPE_PROXY(BuildWorkspaceStatus)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h
index acb1e4caa6..aa34302ddd 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h
@@ -5,25 +5,24 @@
#include "LibLsp/lsp/CodeActionParams.h"
#include "checkHashCodeEqualsStatus.h"
-struct LspMethodBinding {
- std::string bindingKey;
- std::string name;
- std::vector< std::string> parameters;
+struct LspMethodBinding
+{
+ std::string bindingKey;
+ std::string name;
+ std::vector<std::string> parameters;
- MAKE_SWAP_METHOD(LspMethodBinding, bindingKey, name, parameters);
+ MAKE_SWAP_METHOD(LspMethodBinding, bindingKey, name, parameters);
};
MAKE_REFLECT_STRUCT(LspMethodBinding, bindingKey, name, parameters);
-
-struct CheckConstructorsResponse {
- std::vector<LspMethodBinding> constructors;
- std::vector<LspVariableBinding> fields;
- MAKE_SWAP_METHOD(CheckConstructorsResponse, constructors, fields)
+struct CheckConstructorsResponse
+{
+ std::vector<LspMethodBinding> constructors;
+ std::vector<LspVariableBinding> fields;
+ MAKE_SWAP_METHOD(CheckConstructorsResponse, constructors, fields)
};
-MAKE_REFLECT_STRUCT(CheckConstructorsResponse, constructors,fields)
-
-DEFINE_REQUEST_RESPONSE_TYPE(java_checkConstructorsStatus, lsCodeActionParams, CheckConstructorsResponse,"java/checkConstructorsStatus")
-
-
-
+MAKE_REFLECT_STRUCT(CheckConstructorsResponse, constructors, fields)
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_checkConstructorsStatus, lsCodeActionParams, CheckConstructorsResponse, "java/checkConstructorsStatus"
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h
index 68a7ed6606..0d9d3528d1 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h
@@ -7,23 +7,23 @@
#include "checkHashCodeEqualsStatus.h"
#include "checkConstructorsStatus.h"
-struct LspDelegateField {
- LspVariableBinding field;
- std::vector<LspMethodBinding> delegateMethods;
+struct LspDelegateField
+{
+ LspVariableBinding field;
+ std::vector<LspMethodBinding> delegateMethods;
- MAKE_SWAP_METHOD(LspDelegateField, field, delegateMethods);
+ MAKE_SWAP_METHOD(LspDelegateField, field, delegateMethods);
};
MAKE_REFLECT_STRUCT(LspDelegateField, field, delegateMethods);
+struct CheckDelegateMethodsResponse
+{
+ std::vector<LspDelegateField> delegateFields;
-struct CheckDelegateMethodsResponse {
- std::vector<LspDelegateField> delegateFields;
-
- MAKE_SWAP_METHOD(CheckDelegateMethodsResponse, delegateFields)
+ MAKE_SWAP_METHOD(CheckDelegateMethodsResponse, delegateFields)
};
MAKE_REFLECT_STRUCT(CheckDelegateMethodsResponse, delegateFields)
-DEFINE_REQUEST_RESPONSE_TYPE(java_checkDelegateMethodsStatus,
- lsCodeActionParams, CheckDelegateMethodsResponse, "java/checkDelegateMethodsStatus");
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_checkDelegateMethodsStatus, lsCodeActionParams, CheckDelegateMethodsResponse, "java/checkDelegateMethodsStatus"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h
index 88731c29b5..43b6cce924 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h
@@ -7,30 +7,31 @@
#include "LibLsp/lsp/CodeActionParams.h"
-struct LspVariableBinding {
- std::string bindingKey;
- std::string name;
- std::string type;
- bool isField;
- void swap(LspVariableBinding& arg) noexcept
- {
- bindingKey.swap(arg.bindingKey);
- name.swap(arg.name);
- type.swap(arg.type);
- std::swap(isField, arg.isField);
- }
+struct LspVariableBinding
+{
+ std::string bindingKey;
+ std::string name;
+ std::string type;
+ bool isField;
+ void swap(LspVariableBinding& arg) noexcept
+ {
+ bindingKey.swap(arg.bindingKey);
+ name.swap(arg.name);
+ type.swap(arg.type);
+ std::swap(isField, arg.isField);
+ }
};
MAKE_REFLECT_STRUCT(LspVariableBinding, bindingKey, name, type, isField)
-struct CheckHashCodeEqualsResponse {
- std::string type;
- std::vector<LspVariableBinding> fields;
- std::vector<std::string> existingMethods;
- MAKE_SWAP_METHOD(CheckHashCodeEqualsResponse, type, fields, type, existingMethods)
+struct CheckHashCodeEqualsResponse
+{
+ std::string type;
+ std::vector<LspVariableBinding> fields;
+ std::vector<std::string> existingMethods;
+ MAKE_SWAP_METHOD(CheckHashCodeEqualsResponse, type, fields, type, existingMethods)
};
MAKE_REFLECT_STRUCT(CheckHashCodeEqualsResponse, type, fields, type, existingMethods)
-DEFINE_REQUEST_RESPONSE_TYPE(java_checkHashCodeEqualsStatus,
- lsCodeActionParams, CheckHashCodeEqualsResponse, "java/checkHashCodeEqualsStatus")
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_checkHashCodeEqualsStatus, lsCodeActionParams, CheckHashCodeEqualsResponse, "java/checkHashCodeEqualsStatus"
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkToStringStatus.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkToStringStatus.h
index cadb5ba7dd..8af76126b5 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkToStringStatus.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkToStringStatus.h
@@ -5,20 +5,20 @@
#include "LibLsp/lsp/CodeActionParams.h"
#include "checkHashCodeEqualsStatus.h"
-struct CheckToStringResponse {
- std::string type;
- std::vector<LspVariableBinding> fields;
- bool exists;
- void swap(CheckToStringResponse& arg) noexcept
- {
- type.swap(arg.type);
- fields.swap(arg.fields);
- std::swap(exists, arg.exists);
- }
+struct CheckToStringResponse
+{
+ std::string type;
+ std::vector<LspVariableBinding> fields;
+ bool exists;
+ void swap(CheckToStringResponse& arg) noexcept
+ {
+ type.swap(arg.type);
+ fields.swap(arg.fields);
+ std::swap(exists, arg.exists);
+ }
};
-MAKE_REFLECT_STRUCT(CheckToStringResponse,type,fields,exists)
-
-DEFINE_REQUEST_RESPONSE_TYPE(java_checkToStringStatus,
- lsCodeActionParams, CheckToStringResponse ,"java/checkToStringStatus")
-
+MAKE_REFLECT_STRUCT(CheckToStringResponse, type, fields, exists)
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_checkToStringStatus, lsCodeActionParams, CheckToStringResponse, "java/checkToStringStatus"
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/classFileContents.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/classFileContents.h
index 70eb121b99..9c859433df 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/classFileContents.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/classFileContents.h
@@ -6,5 +6,4 @@
#include <string>
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
-DEFINE_REQUEST_RESPONSE_TYPE(java_classFileContents, lsTextDocumentIdentifier, std::string ,"java/classFileContents");
-
+DEFINE_REQUEST_RESPONSE_TYPE(java_classFileContents, lsTextDocumentIdentifier, std::string, "java/classFileContents");
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/codeActionResult.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/codeActionResult.h
index c0195908d0..668d477497 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/codeActionResult.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/codeActionResult.h
@@ -7,9 +7,10 @@
#include <set>
#include "LibLsp/lsp/textDocument/code_action.h"
-namespace SourceAssistProcessor {
+namespace SourceAssistProcessor
+{
- /*std::set<std::string> UNSUPPORTED_RESOURCES = { "module-info.java", "package-info.java"
+/*std::set<std::string> UNSUPPORTED_RESOURCES = { "module-info.java", "package-info.java"
};*/
// static const char* COMMAND_ID_ACTION_OVERRIDEMETHODSPROMPT = "java.action.overrideMethodsPrompt";
@@ -19,4 +20,4 @@ namespace SourceAssistProcessor {
// static const char* COMMAND_ID_ACTION_GENERATEACCESSORSPROMPT = "java.action.generateAccessorsPrompt";
// static const char* COMMAND_ID_ACTION_GENERATECONSTRUCTORSPROMPT = "java.action.generateConstructorsPrompt";
// static const char* COMMAND_ID_ACTION_GENERATEDELEGATEMETHODSPROMPT = "java.action.generateDelegateMethodsPrompt";
-};
+}; // namespace SourceAssistProcessor
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/executeCommand.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/executeCommand.h
index 19479adfaf..8585a1d091 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/executeCommand.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/executeCommand.h
@@ -4,7 +4,7 @@
#include <string>
#include "LibLsp/lsp/lsWorkspaceEdit.h"
#include "LibLsp/lsp/ExecuteCommandParams.h"
-namespace buildpath
+namespace buildpath
{
// static const char* EDIT_ORGNIZEIMPORTS = "java.edit.organizeImports";
// static const char* RESOLVE_SOURCE_ATTACHMENT = "java.project.resolveSourceAttachment";
@@ -16,14 +16,12 @@ namespace buildpath
// static const char* REMOVE_FROM_SOURCEPATH = "java.project.removeFromSourcePath";
// static const char* LIST_SOURCEPATHS = "java.project.listSourcePaths";
- struct Result {
- bool status;
- std::string message;
- };
-
-
-
-}
+struct Result
+{
+ bool status;
+ std::string message;
+};
+} // namespace buildpath
DEFINE_REQUEST_RESPONSE_TYPE(java_executeCommand, ExecuteCommandParams, lsWorkspaceEdit, "java/executeCommand");
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/findLinks.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/findLinks.h
index fd470b17c8..413fe1bded 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/findLinks.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/findLinks.h
@@ -7,16 +7,14 @@
#include "getRefactorEdit.h"
#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
-struct FindLinksParams {
- // Supported link types: superImplementation
- std::string type;
- lsTextDocumentPositionParams position;
+struct FindLinksParams
+{
+ // Supported link types: superImplementation
+ std::string type;
+ lsTextDocumentPositionParams position;
- MAKE_SWAP_METHOD(FindLinksParams, type, position)
+ MAKE_SWAP_METHOD(FindLinksParams, type, position)
};
-MAKE_REFLECT_STRUCT(FindLinksParams,type,position)
-
-DEFINE_REQUEST_RESPONSE_TYPE(java_findLinks, FindLinksParams,lsp::Any, "java/findLinks");
-
-
+MAKE_REFLECT_STRUCT(FindLinksParams, type, position)
+DEFINE_REQUEST_RESPONSE_TYPE(java_findLinks, FindLinksParams, lsp::Any, "java/findLinks");
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateAccessors.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateAccessors.h
index 82013096c7..e8b7d94c3c 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateAccessors.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateAccessors.h
@@ -6,14 +6,15 @@
#include "checkHashCodeEqualsStatus.h"
#include "resolveUnimplementedAccessors.h"
+struct GenerateAccessorsParams
+{
+ lsCodeActionParams context;
+ std::vector<AccessorField> accessors;
-struct GenerateAccessorsParams {
- lsCodeActionParams context;
- std::vector<AccessorField> accessors;
-
-
- MAKE_SWAP_METHOD(GenerateAccessorsParams, context, accessors)
+ MAKE_SWAP_METHOD(GenerateAccessorsParams, context, accessors)
};
MAKE_REFLECT_STRUCT(GenerateAccessorsParams, context, accessors)
-DEFINE_REQUEST_RESPONSE_TYPE(java_generateAccessors, GenerateAccessorsParams, lsWorkspaceEdit, "java/generateAccessors");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_generateAccessors, GenerateAccessorsParams, lsWorkspaceEdit, "java/generateAccessors"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateConstructors.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateConstructors.h
index 157fefed79..fe0266f026 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateConstructors.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateConstructors.h
@@ -6,14 +6,15 @@
#include "checkHashCodeEqualsStatus.h"
#include "checkConstructorsStatus.h"
-
-struct GenerateConstructorsParams {
- lsCodeActionParams context;
- std::vector<LspMethodBinding> constructors;
- std::vector< LspVariableBinding >fields;
- MAKE_SWAP_METHOD(GenerateConstructorsParams, context, fields)
+struct GenerateConstructorsParams
+{
+ lsCodeActionParams context;
+ std::vector<LspMethodBinding> constructors;
+ std::vector<LspVariableBinding> fields;
+ MAKE_SWAP_METHOD(GenerateConstructorsParams, context, fields)
};
MAKE_REFLECT_STRUCT(GenerateConstructorsParams, context, fields)
-DEFINE_REQUEST_RESPONSE_TYPE(java_generateConstructors, GenerateConstructorsParams, lsWorkspaceEdit, "java/generateConstructors");
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_generateConstructors, GenerateConstructorsParams, lsWorkspaceEdit, "java/generateConstructors"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h
index c6b4729378..240dd0cd41 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h
@@ -6,20 +6,22 @@
#include "checkHashCodeEqualsStatus.h"
#include "checkConstructorsStatus.h"
-struct LspDelegateEntry {
- LspVariableBinding field;
- LspMethodBinding delegateMethod;
- MAKE_SWAP_METHOD(LspDelegateEntry, field, delegateMethod);
+struct LspDelegateEntry
+{
+ LspVariableBinding field;
+ LspMethodBinding delegateMethod;
+ MAKE_SWAP_METHOD(LspDelegateEntry, field, delegateMethod);
};
MAKE_REFLECT_STRUCT(LspDelegateEntry, field, delegateMethod);
-
-struct GenerateDelegateMethodsParams {
- lsCodeActionParams context;
- std::vector<LspDelegateEntry> delegateEntries;
- MAKE_SWAP_METHOD(GenerateDelegateMethodsParams, context, delegateEntries)
+struct GenerateDelegateMethodsParams
+{
+ lsCodeActionParams context;
+ std::vector<LspDelegateEntry> delegateEntries;
+ MAKE_SWAP_METHOD(GenerateDelegateMethodsParams, context, delegateEntries)
};
MAKE_REFLECT_STRUCT(GenerateDelegateMethodsParams, context, delegateEntries)
-DEFINE_REQUEST_RESPONSE_TYPE(java_generateDelegateMethods, GenerateDelegateMethodsParams, lsWorkspaceEdit, "java/generateDelegateMethods");
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_generateDelegateMethods, GenerateDelegateMethodsParams, lsWorkspaceEdit, "java/generateDelegateMethods"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h
index 0881d305b1..f6622c5ee4 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h
@@ -7,19 +7,20 @@
#include "LibLsp/lsp/CodeActionParams.h"
#include "checkHashCodeEqualsStatus.h"
-struct GenerateHashCodeEqualsParams {
- lsCodeActionParams context;
- std::vector<LspVariableBinding> fields;
- bool regenerate= false;
- void swap(GenerateHashCodeEqualsParams& arg) noexcept
- {
- context.swap(arg.context);
- fields.swap(arg.fields);
- std::swap(regenerate, arg.regenerate);
- }
+struct GenerateHashCodeEqualsParams
+{
+ lsCodeActionParams context;
+ std::vector<LspVariableBinding> fields;
+ bool regenerate = false;
+ void swap(GenerateHashCodeEqualsParams& arg) noexcept
+ {
+ context.swap(arg.context);
+ fields.swap(arg.fields);
+ std::swap(regenerate, arg.regenerate);
+ }
};
MAKE_REFLECT_STRUCT(GenerateHashCodeEqualsParams, context, fields, regenerate);
-DEFINE_REQUEST_RESPONSE_TYPE(java_generateHashCodeEquals, GenerateHashCodeEqualsParams, lsWorkspaceEdit, "java/generateHashCodeEquals")
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_generateHashCodeEquals, GenerateHashCodeEqualsParams, lsWorkspaceEdit, "java/generateHashCodeEquals"
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateToString.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateToString.h
index 5e5324a59b..53747a8ca2 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateToString.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateToString.h
@@ -5,13 +5,12 @@
#include <string>
#include "checkHashCodeEqualsStatus.h"
+struct GenerateToStringParams
+{
+ lsCodeActionParams context;
+ std::vector<LspVariableBinding> fields;
-struct GenerateToStringParams {
- lsCodeActionParams context;
- std::vector< LspVariableBinding >fields;
-
- MAKE_SWAP_METHOD(GenerateToStringParams, context, fields)
-
+ MAKE_SWAP_METHOD(GenerateToStringParams, context, fields)
};
MAKE_REFLECT_STRUCT(GenerateToStringParams, context, fields)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/getMoveDestinations.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/getMoveDestinations.h
index 8fbe2caa8d..3232d22ba0 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/getMoveDestinations.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/getMoveDestinations.h
@@ -8,58 +8,59 @@
struct MoveKindInfo
{
- static std::string moveResource()
- {
- return "moveResource";
- }
- static std::string moveInstanceMethod()
- {
- return "moveInstanceMethod";
- }
- static std::string moveStaticMember()
- {
- return "moveStaticMember";
- }
+ static std::string moveResource()
+ {
+ return "moveResource";
+ }
+ static std::string moveInstanceMethod()
+ {
+ return "moveInstanceMethod";
+ }
+ static std::string moveStaticMember()
+ {
+ return "moveStaticMember";
+ }
};
-struct MoveParams {
- /**
+struct MoveParams
+{
+ /**
* The supported move kind: moveResource, moveInstanceMethod, moveStaticMember,
* moveTypeToNewFile.
*/
- std::string moveKind;
- /**
+ std::string moveKind;
+ /**
* The selected resource uris when the move operation is triggered.
*/
- std::vector<std::string> sourceUris;
- /**
+ std::vector<std::string> sourceUris;
+ /**
* The code action params when the move operation is triggered.
*/
- optional<lsCodeActionParams> params;
- /**
+ optional<lsCodeActionParams> params;
+ /**
* The possible destination: a folder/package, class, instanceDeclaration.
*/
- lsp::Any destination;
- bool updateReferences;
- void swap(MoveParams& arg) noexcept
- {
- moveKind.swap(arg.moveKind);
- sourceUris.swap(arg.sourceUris);
- params.swap(arg.params);
- destination.swap(arg.destination);
- std::swap(updateReferences, arg.updateReferences);
- }
+ lsp::Any destination;
+ bool updateReferences;
+ void swap(MoveParams& arg) noexcept
+ {
+ moveKind.swap(arg.moveKind);
+ sourceUris.swap(arg.sourceUris);
+ params.swap(arg.params);
+ destination.swap(arg.destination);
+ std::swap(updateReferences, arg.updateReferences);
+ }
};
MAKE_REFLECT_STRUCT(MoveParams, moveKind, sourceUris, params, destination, updateReferences);
-struct MoveDestinationsResponse {
- std::string errorMessage;
- std::vector<lsp::Any > destinations;
- MAKE_SWAP_METHOD(MoveDestinationsResponse, errorMessage, destinations);
+struct MoveDestinationsResponse
+{
+ std::string errorMessage;
+ std::vector<lsp::Any> destinations;
+ MAKE_SWAP_METHOD(MoveDestinationsResponse, errorMessage, destinations);
};
MAKE_REFLECT_STRUCT(MoveDestinationsResponse, errorMessage, destinations);
-DEFINE_REQUEST_RESPONSE_TYPE(java_getMoveDestinations, MoveParams, MoveDestinationsResponse, "java/getMoveDestinations");
-
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_getMoveDestinations, MoveParams, MoveDestinationsResponse, "java/getMoveDestinations"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/getRefactorEdit.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/getRefactorEdit.h
index 23549ecbcc..7d0021914f 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/getRefactorEdit.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/getRefactorEdit.h
@@ -3,8 +3,6 @@
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
-
-
#include <string>
#include <vector>
#include "WorkspaceSymbolParams.h"
@@ -12,66 +10,64 @@
#include "LibLsp/lsp/textDocument/code_action.h"
#include "LibLsp/lsp/lsFormattingOptions.h"
-namespace
-RefactorProposalUtility
+namespace RefactorProposalUtility
{
- extern const char* APPLY_REFACTORING_COMMAND_ID;
- extern const char* EXTRACT_VARIABLE_ALL_OCCURRENCE_COMMAND;
- extern const char* EXTRACT_VARIABLE_COMMAND;
- extern const char* EXTRACT_CONSTANT_COMMAND;
- extern const char* EXTRACT_METHOD_COMMAND;
- extern const char* EXTRACT_FIELD_COMMAND;
- extern const char* CONVERT_VARIABLE_TO_FIELD_COMMAND;
- extern const char* MOVE_FILE_COMMAND;
- extern const char* MOVE_INSTANCE_METHOD_COMMAND;
- extern const char* MOVE_STATIC_MEMBER_COMMAND;
- extern const char* MOVE_TYPE_COMMAND;
-};
-
-
-struct RenamePosition {
- lsDocumentUri uri;
- int offset = 0;
- int length = 0;
- void swap(RenamePosition& arg) noexcept
- {
- uri.swap(arg.uri);
- std::swap(offset, arg.offset);
- std::swap(length, arg.length);
- }
+extern char const* APPLY_REFACTORING_COMMAND_ID;
+extern char const* EXTRACT_VARIABLE_ALL_OCCURRENCE_COMMAND;
+extern char const* EXTRACT_VARIABLE_COMMAND;
+extern char const* EXTRACT_CONSTANT_COMMAND;
+extern char const* EXTRACT_METHOD_COMMAND;
+extern char const* EXTRACT_FIELD_COMMAND;
+extern char const* CONVERT_VARIABLE_TO_FIELD_COMMAND;
+extern char const* MOVE_FILE_COMMAND;
+extern char const* MOVE_INSTANCE_METHOD_COMMAND;
+extern char const* MOVE_STATIC_MEMBER_COMMAND;
+extern char const* MOVE_TYPE_COMMAND;
+}; // namespace RefactorProposalUtility
+
+struct RenamePosition
+{
+ lsDocumentUri uri;
+ int offset = 0;
+ int length = 0;
+ void swap(RenamePosition& arg) noexcept
+ {
+ uri.swap(arg.uri);
+ std::swap(offset, arg.offset);
+ std::swap(length, arg.length);
+ }
};
MAKE_REFLECT_STRUCT(RenamePosition, uri, offset, length);
struct GetRefactorEditParams
{
- std::string command;
- std::vector<lsp::Any> commandArguments;
- lsCodeActionParams context;
- optional<lsFormattingOptions> options;
- MAKE_SWAP_METHOD(GetRefactorEditParams, command, context, options);
+ std::string command;
+ std::vector<lsp::Any> commandArguments;
+ lsCodeActionParams context;
+ optional<lsFormattingOptions> options;
+ MAKE_SWAP_METHOD(GetRefactorEditParams, command, context, options);
};
MAKE_REFLECT_STRUCT(GetRefactorEditParams, command, context, options);
-
-
-
-struct RefactorWorkspaceEdit {
- /**
+struct RefactorWorkspaceEdit
+{
+ /**
* The workspace edit this code action performs.
*/
- lsWorkspaceEdit edit;
- /**
+ lsWorkspaceEdit edit;
+ /**
* A command this code action executes. If a code action provides a edit and a
* command, first the edit is executed and then the command.
*/
- optional<std::string> errorMessage;
+ optional<std::string> errorMessage;
- optional < lsCommandWithAny > command;
+ optional<lsCommandWithAny> command;
- MAKE_SWAP_METHOD(RefactorWorkspaceEdit, edit, command, errorMessage)
+ MAKE_SWAP_METHOD(RefactorWorkspaceEdit, edit, command, errorMessage)
};
-MAKE_REFLECT_STRUCT(RefactorWorkspaceEdit,edit,command,errorMessage)
-
-DEFINE_REQUEST_RESPONSE_TYPE(java_getRefactorEdit, GetRefactorEditParams, RefactorWorkspaceEdit, "java/getRefactorEdit");
+MAKE_REFLECT_STRUCT(RefactorWorkspaceEdit, edit, command, errorMessage)
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_getRefactorEdit, GetRefactorEditParams, RefactorWorkspaceEdit, "java/getRefactorEdit"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/listOverridableMethods.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/listOverridableMethods.h
index 13b73ce5c2..9c5205f359 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/listOverridableMethods.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/listOverridableMethods.h
@@ -6,12 +6,6 @@
#include "LibLsp/lsp/CodeActionParams.h"
#include "OverridableMethod.h"
-
-
-
-
-DEFINE_REQUEST_RESPONSE_TYPE(java_listOverridableMethods, lsCodeActionParams, OverridableMethodsResponse, "java/listOverridableMethods");
-
-
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_listOverridableMethods, lsCodeActionParams, OverridableMethodsResponse, "java/listOverridableMethods"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/organizeImports.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/organizeImports.h
index 817d52d32b..01c10f4452 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/organizeImports.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/organizeImports.h
@@ -5,8 +5,4 @@
#include "LibLsp/lsp/CodeActionParams.h"
-
-
DEFINE_REQUEST_RESPONSE_TYPE(java_organizeImports, lsCodeActionParams, lsWorkspaceEdit, "java/organizeImports");
-
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h
index 342d167093..724ea0f392 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h
@@ -2,7 +2,6 @@
#include "LibLsp/JsonRpc/NotificationInMessage.h"
-
#include <string>
#include <vector>
#include "WorkspaceSymbolParams.h"
@@ -10,4 +9,3 @@
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
DEFINE_NOTIFICATION_TYPE(java_projectConfigurationUpdate, lsTextDocumentIdentifier, "java/projectConfigurationUpdate");
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h
index f8bd8a4f7a..32ca213525 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h
@@ -5,20 +5,24 @@
#include <string>
#include "checkHashCodeEqualsStatus.h"
-
-struct AccessorField {
- std::string fieldName;
- bool isStatic =false;
- bool generateGetter = false;
- bool generateSetter = false;
- void swap(AccessorField& arg) noexcept{
- fieldName.swap(arg.fieldName);
- std::swap(isStatic, arg.isStatic);
- std::swap(generateGetter, arg.generateGetter);
- std::swap(generateSetter, arg.generateSetter);
- }
+struct AccessorField
+{
+ std::string fieldName;
+ bool isStatic = false;
+ bool generateGetter = false;
+ bool generateSetter = false;
+ void swap(AccessorField& arg) noexcept
+ {
+ fieldName.swap(arg.fieldName);
+ std::swap(isStatic, arg.isStatic);
+ std::swap(generateGetter, arg.generateGetter);
+ std::swap(generateSetter, arg.generateSetter);
+ }
};
-MAKE_REFLECT_STRUCT(AccessorField, fieldName,isStatic,generateGetter,generateSetter)
+MAKE_REFLECT_STRUCT(AccessorField, fieldName, isStatic, generateGetter, generateSetter)
-DEFINE_REQUEST_RESPONSE_TYPE(java_resolveUnimplementedAccessors, lsCodeActionParams, std::vector<AccessorField>, "java/resolveUnimplementedAccessors");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_resolveUnimplementedAccessors, lsCodeActionParams, std::vector<AccessorField>,
+ "java/resolveUnimplementedAccessors"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/searchSymbols.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/searchSymbols.h
index 6639ad2cf4..5f5796ec77 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/searchSymbols.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/searchSymbols.h
@@ -3,25 +3,21 @@
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
-
#include <string>
#include <vector>
#include "WorkspaceSymbolParams.h"
#include "LibLsp/lsp/method_type.h"
#include "LibLsp/lsp/symbol.h"
-
-struct SearchSymbolParams :public WorkspaceSymbolParams
+struct SearchSymbolParams : public WorkspaceSymbolParams
{
- optional<std::string> projectName;
- optional< bool >sourceOnly;
- optional< int> maxResults;
- MAKE_SWAP_METHOD(SearchSymbolParams, query, projectName, sourceOnly, maxResults);
+ optional<std::string> projectName;
+ optional<bool> sourceOnly;
+ optional<int> maxResults;
+ MAKE_SWAP_METHOD(SearchSymbolParams, query, projectName, sourceOnly, maxResults);
};
MAKE_REFLECT_STRUCT(SearchSymbolParams, query, projectName, sourceOnly, maxResults);
-
-DEFINE_REQUEST_RESPONSE_TYPE(java_searchSymbols, SearchSymbolParams, std::vector<lsSymbolInformation>, "java/searchSymbols");
-
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ java_searchSymbols, SearchSymbolParams, std::vector<lsSymbolInformation>, "java/searchSymbols"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/sonarlint/protocol.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/sonarlint/protocol.h
index 6752c40812..98f82608b8 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/sonarlint/protocol.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/sonarlint/protocol.h
@@ -9,168 +9,148 @@
struct LintRule
{
- std::string key;
- std::string name;
-
-
- std::string Display() const
- {
- return name + " (" + key + ")";
- }
- bool activeByDefault = true;
- optional<std::string> severity;
- optional<std::string> type;
- int icon_index = -1;
- MAKE_SWAP_METHOD(LintRule, key, name, activeByDefault, severity, type);
-
+ std::string key;
+ std::string name;
+
+ std::string Display() const
+ {
+ return name + " (" + key + ")";
+ }
+ bool activeByDefault = true;
+ optional<std::string> severity;
+ optional<std::string> type;
+ int icon_index = -1;
+ MAKE_SWAP_METHOD(LintRule, key, name, activeByDefault, severity, type);
};
MAKE_REFLECT_STRUCT(LintRule, key, name, activeByDefault, severity, type);
-
-struct RuleParameter {
- std::string name;
- optional<std::string> description;
- optional<std::string> defaultValue;
-
+struct RuleParameter
+{
+ std::string name;
+ optional<std::string> description;
+ optional<std::string> defaultValue;
};
MAKE_REFLECT_STRUCT(RuleParameter, name, description, defaultValue);
-struct ShowRuleDescriptionParams {
-
- optional<std::string> key;
-
- optional<std::string> name;
+struct ShowRuleDescriptionParams
+{
- optional<std::string> htmlDescription;
+ optional<std::string> key;
- optional<std::string> type;
+ optional<std::string> name;
- optional<std::string> severity;
+ optional<std::string> htmlDescription;
- optional< std::vector<RuleParameter> > parameters;
- MAKE_SWAP_METHOD(ShowRuleDescriptionParams, key, name, htmlDescription, type, severity, parameters)
+ optional<std::string> type;
+ optional<std::string> severity;
+ optional<std::vector<RuleParameter>> parameters;
+ MAKE_SWAP_METHOD(ShowRuleDescriptionParams, key, name, htmlDescription, type, severity, parameters)
};
MAKE_REFLECT_STRUCT(ShowRuleDescriptionParams, key, name, htmlDescription, type, severity, parameters);
-
-struct GetJavaConfigResponse {
- std::string projectRoot;
- std::string sourceLevel;
- std::vector<std::string> classpath;
- bool isTest;
- std::string vmLocation;
- MAKE_SWAP_METHOD(GetJavaConfigResponse, projectRoot, sourceLevel, classpath, isTest, vmLocation);
+struct GetJavaConfigResponse
+{
+ std::string projectRoot;
+ std::string sourceLevel;
+ std::vector<std::string> classpath;
+ bool isTest;
+ std::string vmLocation;
+ MAKE_SWAP_METHOD(GetJavaConfigResponse, projectRoot, sourceLevel, classpath, isTest, vmLocation);
};
MAKE_REFLECT_STRUCT(GetJavaConfigResponse, projectRoot, sourceLevel, classpath, isTest, vmLocation);
-struct SetTraceNotificationParams {
- lsInitializeParams::lsTrace value;
+struct SetTraceNotificationParams
+{
+ lsInitializeParams::lsTrace value;
};
MAKE_REFLECT_STRUCT(SetTraceNotificationParams, value);
+struct ServerConnectionSettings
+{
-struct ServerConnectionSettings {
-
- std::string SONARCLOUD_URL = "https://sonarcloud.io";
- std::vector<std::string>SONARCLOUD_ALIAS = { "https://sonarqube.com",
- "https://www.sonarqube.com",
- "https://www.sonarcloud.io",
- "https://sonarcloud.io" };
-
- std::string connectionId;
- std::string serverUrl;
- std::string token;
- optional<std::string> organizationKey;
- MAKE_SWAP_METHOD(ServerConnectionSettings, connectionId, serverUrl, token, organizationKey)
+ std::string SONARCLOUD_URL = "https://sonarcloud.io";
+ std::vector<std::string> SONARCLOUD_ALIAS = {
+ "https://sonarqube.com", "https://www.sonarqube.com", "https://www.sonarcloud.io", "https://sonarcloud.io"
+ };
+ std::string connectionId;
+ std::string serverUrl;
+ std::string token;
+ optional<std::string> organizationKey;
+ MAKE_SWAP_METHOD(ServerConnectionSettings, connectionId, serverUrl, token, organizationKey)
};
MAKE_REFLECT_STRUCT(ServerConnectionSettings, connectionId, serverUrl, token, organizationKey)
struct RuleSetting
{
- bool IsOn();
- std::string level = "on";
- RuleSetting(bool activate);
- RuleSetting() = default;
- void toggle();
- void on()
+ bool IsOn();
+ std::string level = "on";
+ RuleSetting(bool activate);
+ RuleSetting() = default;
+ void toggle();
+ void on()
+ {
+ level = "on";
+ }
+ void off()
+ {
+ level = "off";
+ }
+ void turn(bool activate)
+ {
+ if (activate)
{
- level = "on";
+ on();
}
- void off()
+ else
{
- level = "off";
+ off();
}
- void turn(bool activate)
- {
- if (activate)
- {
- on();
- }
- else
- {
- off();
- }
- }
- optional< std::map<std::string, std::string > > parameters;
+ }
+ optional<std::map<std::string, std::string>> parameters;
};
MAKE_REFLECT_STRUCT(RuleSetting, level, parameters)
struct ConsoleParams
{
- optional < bool >showAnalyzerLogs;
- optional < bool >showVerboseLogs;
- MAKE_SWAP_METHOD(ConsoleParams, showAnalyzerLogs, showVerboseLogs)
+ optional<bool> showAnalyzerLogs;
+ optional<bool> showVerboseLogs;
+ MAKE_SWAP_METHOD(ConsoleParams, showAnalyzerLogs, showVerboseLogs)
};
MAKE_REFLECT_STRUCT(ConsoleParams, showAnalyzerLogs, showVerboseLogs)
struct SonarLintWorkspaceSettings
{
- optional < bool > disableTelemetry;
- optional < std::map<std::string, ServerConnectionSettings> >connectedMode;
- optional<std::map<std::string, RuleSetting>> rules;
- optional<ConsoleParams> output;
-
- optional<std::string > pathToNodeExecutable;
-
- optional< std::map<std::string, std::string > > getConfigurationParameters(const std::string& ruleKey);
+ optional<bool> disableTelemetry;
+ optional<std::map<std::string, ServerConnectionSettings>> connectedMode;
+ optional<std::map<std::string, RuleSetting>> rules;
+ optional<ConsoleParams> output;
+ optional<std::string> pathToNodeExecutable;
+ optional<std::map<std::string, std::string>> getConfigurationParameters(std::string const& ruleKey);
};
-MAKE_REFLECT_STRUCT(SonarLintWorkspaceSettings, disableTelemetry, connectedMode,
- rules, output, pathToNodeExecutable)
-
-
-
- DEFINE_REQUEST_RESPONSE_TYPE(slls_listAllRules, JsonNull, lsp::Any, "sonarlint/listAllRules");
-
+MAKE_REFLECT_STRUCT(SonarLintWorkspaceSettings, disableTelemetry, connectedMode, rules, output, pathToNodeExecutable)
+DEFINE_REQUEST_RESPONSE_TYPE(slls_listAllRules, JsonNull, lsp::Any, "sonarlint/listAllRules");
DEFINE_NOTIFICATION_TYPE(Notify_didClasspathUpdate, lsDocumentUri, "sonarlint/didClasspathUpdate")
-
DEFINE_NOTIFICATION_TYPE(Notify_didJavaServerModeChange, std::string, "sonarlint/didJavaServerModeChange")
-
-
DEFINE_REQUEST_RESPONSE_TYPE(slls_showSonarLintOutput, JsonNull, JsonNull, "sonarlint/showSonarLintOutput");
-
-
DEFINE_REQUEST_RESPONSE_TYPE(slls_openJavaHomeSettings, JsonNull, JsonNull, "sonarlint/openJavaHomeSettings");
-
-
-
DEFINE_REQUEST_RESPONSE_TYPE(slls_openPathToNodeSettings, JsonNull, JsonNull, "sonarlint/openPathToNodeSettings");
-
-DEFINE_REQUEST_RESPONSE_TYPE(slls_showRuleDescription, ShowRuleDescriptionParams, JsonNull, "sonarlint/showRuleDescription");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ slls_showRuleDescription, ShowRuleDescriptionParams, JsonNull, "sonarlint/showRuleDescription"
+);
DEFINE_REQUEST_RESPONSE_TYPE(slls_getJavaConfig, lsDocumentUri, GetJavaConfigResponse, "sonarlint/getJavaConfig");
-
DEFINE_NOTIFICATION_TYPE(slls_setTraceNotification, SetTraceNotificationParams, "$/setTraceNotification")
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/InitializeParams.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/InitializeParams.h
index 145c63087f..a23f657a5e 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/InitializeParams.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/InitializeParams.h
@@ -5,28 +5,30 @@
#include "lsClientCapabilities.h"
#include "LibLsp/lsp/workspace/workspaceFolders.h"
-struct ClientInfo {
- std::string name;
- optional<std::string> version;
+struct ClientInfo
+{
+ std::string name;
+ optional<std::string> version;
- MAKE_SWAP_METHOD(ClientInfo,name,version);
+ MAKE_SWAP_METHOD(ClientInfo, name, version);
};
-MAKE_REFLECT_STRUCT(ClientInfo,name,version);
+MAKE_REFLECT_STRUCT(ClientInfo, name, version);
-struct lsInitializeParams {
- // The process Id of the parent process that started
- // the server. Is null if the process has not been started by another process.
- // If the parent process is not alive then the server should exit (see exit
- // notification) its process.
- optional<int> processId;
+struct lsInitializeParams
+{
+ // The process Id of the parent process that started
+ // the server. Is null if the process has not been started by another process.
+ // If the parent process is not alive then the server should exit (see exit
+ // notification) its process.
+ optional<int> processId;
- /**
+ /**
* Information about the client
*
* @since 3.15.0
*/
- optional<ClientInfo> clientInfo;
- /**
+ optional<ClientInfo> clientInfo;
+ /**
* The locale the client is currently showing the user interface
* in. This must not necessarily be the locale of the operating
* system.
@@ -36,48 +38,44 @@ struct lsInitializeParams {
*
* @since 3.16.0
*/
- optional<std::string> locale;
+ optional<std::string> locale;
- // The rootPath of the workspace. Is null
- // if no folder is open.
- //
- // @deprecated in favour of rootUri.
- optional<std::string> rootPath;
+ // The rootPath of the workspace. Is null
+ // if no folder is open.
+ //
+ // @deprecated in favour of rootUri.
+ optional<std::string> rootPath;
- // The rootUri of the workspace. Is null if no
- // folder is open. If both `rootPath` and `rootUri` are set
- // `rootUri` wins.
- optional<lsDocumentUri> rootUri;
+ // The rootUri of the workspace. Is null if no
+ // folder is open. If both `rootPath` and `rootUri` are set
+ // `rootUri` wins.
+ optional<lsDocumentUri> rootUri;
- // User provided initialization options.
- optional<lsp::Any> initializationOptions;
+ // User provided initialization options.
+ optional<lsp::Any> initializationOptions;
- // The capabilities provided by the client (editor or tool)
- lsClientCapabilities capabilities;
+ // The capabilities provided by the client (editor or tool)
+ lsClientCapabilities capabilities;
-
- /**
+ /**
* An optional extension to the protocol.
* To tell the server what client (editor) is talking to it.
*/
- // @Deprecated
- optional< std::string >clientName;
-
-
+ // @Deprecated
+ optional<std::string> clientName;
- enum class lsTrace {
- // NOTE: serialized as a string, one of 'off' | 'messages' | 'verbose';
- Off, // off
- Messages, // messages
- Verbose // verbose
+ enum class lsTrace
+ {
+ // NOTE: serialized as a string, one of 'off' | 'messages' | 'verbose';
+ Off, // off
+ Messages, // messages
+ Verbose // verbose
+ };
- };
+ // The initial trace setting. If omitted trace is disabled ('off').
+ lsTrace trace = lsTrace::Off;
- // The initial trace setting. If omitted trace is disabled ('off').
- lsTrace trace = lsTrace::Off;
-
-
- /**
+ /**
* The workspace folders configured in the client when the server starts.
* This property is only available if the client supports workspace folders.
* It can be `null` if the client supports workspace folders but none are
@@ -85,44 +83,34 @@ struct lsInitializeParams {
*
* Since 3.6.0
*/
- optional< std::vector<WorkspaceFolder> > workspaceFolders;
-
- MAKE_SWAP_METHOD(lsInitializeParams,
- processId,
- rootPath,
- rootUri,
- initializationOptions,
- capabilities, clientName, clientInfo,
- trace, workspaceFolders, locale)
+ optional<std::vector<WorkspaceFolder>> workspaceFolders;
+
+ MAKE_SWAP_METHOD(
+ lsInitializeParams, processId, rootPath, rootUri, initializationOptions, capabilities, clientName, clientInfo,
+ trace, workspaceFolders, locale
+ )
};
void Reflect(Reader& reader, lsInitializeParams::lsTrace& value);
-
void Reflect(Writer& writer, lsInitializeParams::lsTrace& value);
-
-MAKE_REFLECT_STRUCT(lsInitializeParams,
- processId,
- rootPath,
- rootUri,
- initializationOptions,
- capabilities, clientName, clientInfo,
- trace, workspaceFolders, locale)
-
-struct lsInitializeError {
- // Indicates whether the client should retry to send the
- // initilize request after showing the message provided
- // in the ResponseError.
- bool retry;
- void swap(lsInitializeError& arg) noexcept
- {
- auto tem = retry;
- retry = arg.retry;
- arg.retry = tem;
- }
+MAKE_REFLECT_STRUCT(
+ lsInitializeParams, processId, rootPath, rootUri, initializationOptions, capabilities, clientName, clientInfo,
+ trace, workspaceFolders, locale
+)
+
+struct lsInitializeError
+{
+ // Indicates whether the client should retry to send the
+ // initilize request after showing the message provided
+ // in the ResponseError.
+ bool retry;
+ void swap(lsInitializeError& arg) noexcept
+ {
+ auto tem = retry;
+ retry = arg.retry;
+ arg.retry = tem;
+ }
};
MAKE_REFLECT_STRUCT(lsInitializeError, retry);
-
-
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/initialize.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/initialize.h
index 2198b158bf..f63f0b5e59 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/initialize.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/initialize.h
@@ -5,22 +5,17 @@
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/JsonRpc/RequestInMessage.h"
-
-
-
-
-
/**
* The capabilities the language server provides.
*/
- struct InitializeResult {
+struct InitializeResult
+{
lsServerCapabilities capabilities;
- MAKE_SWAP_METHOD(InitializeResult, capabilities);
- };
+ MAKE_SWAP_METHOD(InitializeResult, capabilities);
+};
MAKE_REFLECT_STRUCT(InitializeResult, capabilities);
-
/**
* The initialize request is sent as the first request from the client to
* the server.
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/initialized.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/initialized.h
index bb6d12511c..f63a38b82f 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/initialized.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/initialized.h
@@ -1,6 +1,5 @@
#pragma once
-
#include "LibLsp/JsonRpc/NotificationInMessage.h"
/**
* The initialized notification is sent from the client to the server after
@@ -10,4 +9,3 @@
* register capabilities.
*/
DEFINE_NOTIFICATION_TYPE(Notify_InitializedNotification, JsonNull, "initialized");
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsClientCapabilities.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsClientCapabilities.h
index 4ec9744258..0a454fc773 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsClientCapabilities.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsClientCapabilities.h
@@ -9,40 +9,38 @@
*
* @since 3.16.0
*/
-struct MarkdownClientCapabilities {
- /**
+struct MarkdownClientCapabilities
+{
+ /**
* The name of the parser.
*/
- std::string parser;
+ std::string parser;
- /**
+ /**
* The version of the parser.
*/
- optional<std::string> version;
- MAKE_SWAP_METHOD(MarkdownClientCapabilities, parser, version)
-
+ optional<std::string> version;
+ MAKE_SWAP_METHOD(MarkdownClientCapabilities, parser, version)
};
MAKE_REFLECT_STRUCT(MarkdownClientCapabilities, parser, version)
-struct lsClientCapabilities {
- // Workspace specific client capabilities.
- optional<lsWorkspaceClientCapabilites> workspace;
+struct lsClientCapabilities
+{
+ // Workspace specific client capabilities.
+ optional<lsWorkspaceClientCapabilites> workspace;
- // Text document specific client capabilities.
- optional<lsTextDocumentClientCapabilities> textDocument;
+ // Text document specific client capabilities.
+ optional<lsTextDocumentClientCapabilities> textDocument;
- /**
+ /**
* Window specific client capabilities.
*/
- optional<lsp::Any> window;
- /**
+ optional<lsp::Any> window;
+ /**
* Experimental client capabilities.
*/
- optional<lsp::Any> experimental;
+ optional<lsp::Any> experimental;
- MAKE_SWAP_METHOD(lsClientCapabilities, workspace, textDocument, window, experimental)
+ MAKE_SWAP_METHOD(lsClientCapabilities, workspace, textDocument, window, experimental)
};
MAKE_REFLECT_STRUCT(lsClientCapabilities, workspace, textDocument, window, experimental)
-
-
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsServerCapabilities.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsServerCapabilities.h
index e8624681b3..a924ebbfb3 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsServerCapabilities.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsServerCapabilities.h
@@ -1,7 +1,6 @@
#pragma once
#include "LibLsp/lsp/method_type.h"
-
#include <stdexcept>
#include "LibLsp/JsonRpc/message.h"
#include "LibLsp/lsp/lsDocumentUri.h"
@@ -9,84 +8,83 @@
#include "InitializeParams.h"
#include "LibLsp/lsp/textDocument/SemanticTokens.h"
-
-extern void Reflect(Reader&, std::pair<optional<lsTextDocumentSyncKind>, optional<lsTextDocumentSyncOptions> >&);
+extern void Reflect(Reader&, std::pair<optional<lsTextDocumentSyncKind>, optional<lsTextDocumentSyncOptions>>&);
//
- // Code Action options.
- //
-struct CodeActionOptions : WorkDoneProgressOptions {
- //
- // CodeActionKinds that this server may return.
- //
- // The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server
- // may list out every specific kind they provide.
- //
- typedef std::string CodeActionKind;
- std::vector<CodeActionKind> codeActionKinds;
-
- MAKE_SWAP_METHOD(CodeActionOptions, workDoneProgress, codeActionKinds);
+// Code Action options.
+//
+struct CodeActionOptions : WorkDoneProgressOptions
+{
+ //
+ // CodeActionKinds that this server may return.
+ //
+ // The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server
+ // may list out every specific kind they provide.
+ //
+ typedef std::string CodeActionKind;
+ std::vector<CodeActionKind> codeActionKinds;
+
+ MAKE_SWAP_METHOD(CodeActionOptions, workDoneProgress, codeActionKinds);
};
MAKE_REFLECT_STRUCT(CodeActionOptions, workDoneProgress, codeActionKinds)
-struct CodeLensOptions : WorkDoneProgressOptions {
- //
- // Code lens has a resolve provider as well.
- //
- optional<bool> resolveProvider ;
- MAKE_SWAP_METHOD(CodeLensOptions, workDoneProgress, resolveProvider);
+struct CodeLensOptions : WorkDoneProgressOptions
+{
+ //
+ // Code lens has a resolve provider as well.
+ //
+ optional<bool> resolveProvider;
+ MAKE_SWAP_METHOD(CodeLensOptions, workDoneProgress, resolveProvider);
};
MAKE_REFLECT_STRUCT(CodeLensOptions, workDoneProgress, resolveProvider)
-
// Format document on type options
-struct lsDocumentOnTypeFormattingOptions :WorkDoneProgressOptions {
- // A character on which formatting should be triggered, like `}`.
- std::string firstTriggerCharacter;
-
- // More trigger characters.
- std::vector<std::string> moreTriggerCharacter;
- MAKE_SWAP_METHOD(lsDocumentOnTypeFormattingOptions, workDoneProgress,
- firstTriggerCharacter,
- moreTriggerCharacter);
+struct lsDocumentOnTypeFormattingOptions : WorkDoneProgressOptions
+{
+ // A character on which formatting should be triggered, like `}`.
+ std::string firstTriggerCharacter;
+
+ // More trigger characters.
+ std::vector<std::string> moreTriggerCharacter;
+ MAKE_SWAP_METHOD(lsDocumentOnTypeFormattingOptions, workDoneProgress, firstTriggerCharacter, moreTriggerCharacter);
};
-MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingOptions, workDoneProgress,
- firstTriggerCharacter,
- moreTriggerCharacter);
-struct RenameOptions : WorkDoneProgressOptions {
- //
- // Renames should be checked and tested before being executed.
- //
- optional<bool> prepareProvider;
- MAKE_SWAP_METHOD(RenameOptions, workDoneProgress, prepareProvider);
+MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingOptions, workDoneProgress, firstTriggerCharacter, moreTriggerCharacter);
+struct RenameOptions : WorkDoneProgressOptions
+{
+ //
+ // Renames should be checked and tested before being executed.
+ //
+ optional<bool> prepareProvider;
+ MAKE_SWAP_METHOD(RenameOptions, workDoneProgress, prepareProvider);
};
-MAKE_REFLECT_STRUCT(RenameOptions,workDoneProgress,prepareProvider)
+MAKE_REFLECT_STRUCT(RenameOptions, workDoneProgress, prepareProvider)
-struct DocumentFilter{
- //
- // A language id, like `typescript`.
- //
- optional<std::string> language;
- //
- // A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
- //
- optional<std::string>scheme;
- //
- // A glob pattern, like `*.{ts,js}`.
- //
- // Glob patterns can have the following syntax:
- // - `*` to match one or more characters in a path segment
- // - `?` to match on one character in a path segment
- // - `**` to match any number of path segments, including none
- // - `{}` to group sub patterns into an OR expression. (e.g. `**/*.{ts,js}
- // matches all TypeScript and JavaScript files)
- // - `[]` to declare a range of characters to match in a path segment
- // (e.g., `example.[0-9]` to match on `example.0`, `example.1`,...)
- // - `[!...]` to negate a range of characters to match in a path segment
- // (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
- // not `example.0`)
- //
- optional<std::string>pattern;
- MAKE_SWAP_METHOD(DocumentFilter, language, scheme, pattern)
+struct DocumentFilter
+{
+ //
+ // A language id, like `typescript`.
+ //
+ optional<std::string> language;
+ //
+ // A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
+ //
+ optional<std::string> scheme;
+ //
+ // A glob pattern, like `*.{ts,js}`.
+ //
+ // Glob patterns can have the following syntax:
+ // - `*` to match one or more characters in a path segment
+ // - `?` to match on one character in a path segment
+ // - `**` to match any number of path segments, including none
+ // - `{}` to group sub patterns into an OR expression. (e.g. `**/*.{ts,js}
+ // matches all TypeScript and JavaScript files)
+ // - `[]` to declare a range of characters to match in a path segment
+ // (e.g., `example.[0-9]` to match on `example.0`, `example.1`,...)
+ // - `[!...]` to negate a range of characters to match in a path segment
+ // (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
+ // not `example.0`)
+ //
+ optional<std::string> pattern;
+ MAKE_SWAP_METHOD(DocumentFilter, language, scheme, pattern)
};
MAKE_REFLECT_STRUCT(DocumentFilter, language, scheme, pattern)
@@ -94,496 +92,476 @@ MAKE_REFLECT_STRUCT(DocumentFilter, language, scheme, pattern)
using DocumentSelector = std::vector<DocumentFilter>;
// Document link options
-struct lsDocumentLinkOptions :WorkDoneProgressOptions {
- // Document links have a resolve provider as well.
- optional<bool> resolveProvider;
- MAKE_SWAP_METHOD(lsDocumentLinkOptions, workDoneProgress, resolveProvider);
+struct lsDocumentLinkOptions : WorkDoneProgressOptions
+{
+ // Document links have a resolve provider as well.
+ optional<bool> resolveProvider;
+ MAKE_SWAP_METHOD(lsDocumentLinkOptions, workDoneProgress, resolveProvider);
};
-MAKE_REFLECT_STRUCT(lsDocumentLinkOptions, workDoneProgress,resolveProvider);
+MAKE_REFLECT_STRUCT(lsDocumentLinkOptions, workDoneProgress, resolveProvider);
// Execute command options.
-struct lsExecuteCommandOptions : WorkDoneProgressOptions {
- // The commands to be executed on the server
- std::vector<std::string> commands;
- MAKE_SWAP_METHOD(lsExecuteCommandOptions, workDoneProgress, commands);
+struct lsExecuteCommandOptions : WorkDoneProgressOptions
+{
+ // The commands to be executed on the server
+ std::vector<std::string> commands;
+ MAKE_SWAP_METHOD(lsExecuteCommandOptions, workDoneProgress, commands);
};
MAKE_REFLECT_STRUCT(lsExecuteCommandOptions, workDoneProgress, commands);
-
struct TextDocumentRegistrationOptions
{
-//
- // A document selector to identify the scope of the registration. If set to null
- // the document selector provided on the client side will be used.
- //
- optional<DocumentSelector> documentSelector;
+ //
+ // A document selector to identify the scope of the registration. If set to null
+ // the document selector provided on the client side will be used.
+ //
+ optional<DocumentSelector> documentSelector;
- MAKE_SWAP_METHOD(TextDocumentRegistrationOptions, documentSelector);
+ MAKE_SWAP_METHOD(TextDocumentRegistrationOptions, documentSelector);
};
MAKE_REFLECT_STRUCT(TextDocumentRegistrationOptions, documentSelector);
//
- // Static registration options to be returned in the initialize request.
- //
-struct StaticRegistrationOptions :public TextDocumentRegistrationOptions
+// Static registration options to be returned in the initialize request.
+//
+struct StaticRegistrationOptions : public TextDocumentRegistrationOptions
{
- //
- // The id used to register the request. The id can be used to deregister
- // the request again. See also Registration#id.
- //
- optional<std::string> id;
- MAKE_SWAP_METHOD(StaticRegistrationOptions, documentSelector, id)
+ //
+ // The id used to register the request. The id can be used to deregister
+ // the request again. See also Registration#id.
+ //
+ optional<std::string> id;
+ MAKE_SWAP_METHOD(StaticRegistrationOptions, documentSelector, id)
};
-MAKE_REFLECT_STRUCT(StaticRegistrationOptions, documentSelector,id)
+MAKE_REFLECT_STRUCT(StaticRegistrationOptions, documentSelector, id)
//
- // The server supports workspace folder.
- //
- // Since 3.6.0
- //
-
-struct WorkspaceFoldersOptions {
- //
- // The server has support for workspace folders
- //
- optional<bool> supported;
+// The server supports workspace folder.
+//
+// Since 3.6.0
+//
- //
- // Whether the server wants to receive workspace folder
- // change notifications.
- //
- // If a string is provided, the string is treated as an ID
- // under which the notification is registered on the client
- // side. The ID can be used to unregister for these events
- // using the `client/unregisterCapability` request.
- //
- optional<std::pair< optional<std::string>, optional<bool> > > changeNotifications;
- MAKE_SWAP_METHOD(WorkspaceFoldersOptions, supported, changeNotifications);
+struct WorkspaceFoldersOptions
+{
+ //
+ // The server has support for workspace folders
+ //
+ optional<bool> supported;
+
+ //
+ // Whether the server wants to receive workspace folder
+ // change notifications.
+ //
+ // If a string is provided, the string is treated as an ID
+ // under which the notification is registered on the client
+ // side. The ID can be used to unregister for these events
+ // using the `client/unregisterCapability` request.
+ //
+ optional<std::pair<optional<std::string>, optional<bool>>> changeNotifications;
+ MAKE_SWAP_METHOD(WorkspaceFoldersOptions, supported, changeNotifications);
};
MAKE_REFLECT_STRUCT(WorkspaceFoldersOptions, supported, changeNotifications);
//
- // A pattern kind describing if a glob pattern matches a file a folder or
- // both.
- //
- // @since 3.16.0
- //
+// A pattern kind describing if a glob pattern matches a file a folder or
+// both.
+//
+// @since 3.16.0
+//
enum lsFileOperationPatternKind
{
- file,
- folder
+ file,
+ folder
};
MAKE_REFLECT_TYPE_PROXY(lsFileOperationPatternKind)
//
- // Matching options for the file operation pattern.
- //
- // @since 3.16.0
- //
-struct lsFileOperationPatternOptions {
+// Matching options for the file operation pattern.
+//
+// @since 3.16.0
+//
+struct lsFileOperationPatternOptions
+{
- //
- // The pattern should be matched ignoring casing.
- //
- optional<bool> ignoreCase;
- MAKE_SWAP_METHOD(lsFileOperationPatternOptions, ignoreCase)
+ //
+ // The pattern should be matched ignoring casing.
+ //
+ optional<bool> ignoreCase;
+ MAKE_SWAP_METHOD(lsFileOperationPatternOptions, ignoreCase)
};
MAKE_REFLECT_STRUCT(lsFileOperationPatternOptions, ignoreCase)
//
- // A pattern to describe in which file operation requests or notifications
- // the server is interested in.
- //
- // @since 3.16.0
- //
-struct lsFileOperationPattern {
- //
- // The glob pattern to match. Glob patterns can have the following syntax:
- // - `*` to match one or more characters in a path segment
- // - `?` to match on one character in a path segment
- // - `**` to match any number of path segments, including none
- // - `{}` to group sub patterns into an OR expression. (e.g. `**/*.{ts,js}`
- // matches all TypeScript and JavaScript files)
- // - `[]` to declare a range of characters to match in a path segment
- // (e.g., `example.[0-9]` to match on `example.0`, `example.1`,...)
- // - `[!...]` to negate a range of characters to match in a path segment
- // (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
- // not `example.0`)
- //
- std::string glob;
-
- //
- // Whether to match files or folders with this pattern.
- //
- // Matches both if undefined.
- //
- optional<lsFileOperationPatternKind> matches;
-
- //
- // Additional options used during matching.
- //
- optional<lsFileOperationPatternOptions> options ;
- MAKE_SWAP_METHOD(lsFileOperationPattern, glob, matches, options)
+// A pattern to describe in which file operation requests or notifications
+// the server is interested in.
+//
+// @since 3.16.0
+//
+struct lsFileOperationPattern
+{
+ //
+ // The glob pattern to match. Glob patterns can have the following syntax:
+ // - `*` to match one or more characters in a path segment
+ // - `?` to match on one character in a path segment
+ // - `**` to match any number of path segments, including none
+ // - `{}` to group sub patterns into an OR expression. (e.g. `**/*.{ts,js}`
+ // matches all TypeScript and JavaScript files)
+ // - `[]` to declare a range of characters to match in a path segment
+ // (e.g., `example.[0-9]` to match on `example.0`, `example.1`,...)
+ // - `[!...]` to negate a range of characters to match in a path segment
+ // (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
+ // not `example.0`)
+ //
+ std::string glob;
+
+ //
+ // Whether to match files or folders with this pattern.
+ //
+ // Matches both if undefined.
+ //
+ optional<lsFileOperationPatternKind> matches;
+
+ //
+ // Additional options used during matching.
+ //
+ optional<lsFileOperationPatternOptions> options;
+ MAKE_SWAP_METHOD(lsFileOperationPattern, glob, matches, options)
};
MAKE_REFLECT_STRUCT(lsFileOperationPattern, glob, matches, options)
//
- // A filter to describe in which file operation requests or notifications
- // the server is interested in.
- //
- // @since 3.16.0
- //
-struct lsFileOperationFilter {
+// A filter to describe in which file operation requests or notifications
+// the server is interested in.
+//
+// @since 3.16.0
+//
+struct lsFileOperationFilter
+{
- //
- // A Uri like `file` or `untitled`.
- //
- optional<std::string> scheme;
+ //
+ // A Uri like `file` or `untitled`.
+ //
+ optional<std::string> scheme;
- //
- // The actual file operation pattern.
- //
- optional<lsFileOperationPattern> pattern;
- MAKE_SWAP_METHOD(lsFileOperationFilter, scheme, pattern)
+ //
+ // The actual file operation pattern.
+ //
+ optional<lsFileOperationPattern> pattern;
+ MAKE_SWAP_METHOD(lsFileOperationFilter, scheme, pattern)
};
MAKE_REFLECT_STRUCT(lsFileOperationFilter, scheme, pattern)
//
- // The options to register for file operations.
- //
- // @since 3.16.0
- //
-struct lsFileOperationRegistrationOptions {
- //
- // The actual filters.
- //
- optional<std::vector<lsFileOperationFilter>> filters;
- MAKE_SWAP_METHOD(lsFileOperationRegistrationOptions, filters)
+// The options to register for file operations.
+//
+// @since 3.16.0
+//
+struct lsFileOperationRegistrationOptions
+{
+ //
+ // The actual filters.
+ //
+ optional<std::vector<lsFileOperationFilter>> filters;
+ MAKE_SWAP_METHOD(lsFileOperationRegistrationOptions, filters)
};
MAKE_REFLECT_STRUCT(lsFileOperationRegistrationOptions, filters)
-struct WorkspaceServerCapabilities {
- //
- // The server supports workspace folder.
- //
- // Since 3.6.0
- //
- WorkspaceFoldersOptions workspaceFolders;
-
+struct WorkspaceServerCapabilities
+{
+ //
+ // The server supports workspace folder.
+ //
+ // Since 3.6.0
+ //
+ WorkspaceFoldersOptions workspaceFolders;
+ //
+ // The server is interested in file notifications/requests.
+ //
+ // @since 3.16.0
+ //
+ struct lsFileOperations
+ {
//
- // The server is interested in file notifications/requests.
- //
- // @since 3.16.0
- //
- struct lsFileOperations
- {
- //
- // The server is interested in receiving didCreateFiles
- // notifications.
- //
- optional<lsFileOperationRegistrationOptions> didCreate;
-
- //
- // The server is interested in receiving willCreateFiles requests.
- //
- optional<lsFileOperationRegistrationOptions> willCreate;
-
- //
- // The server is interested in receiving didRenameFiles
- // notifications.
- //
- optional<lsFileOperationRegistrationOptions> didRename;
-
- //
- // The server is interested in receiving willRenameFiles requests.
- //
- optional<lsFileOperationRegistrationOptions> willRename;
-
- //
- // The server is interested in receiving didDeleteFiles file
- // notifications.
- //
- optional<lsFileOperationRegistrationOptions> didDelete;
-
- //
- // The server is interested in receiving willDeleteFiles file
- // requests.
- //
- optional<lsFileOperationRegistrationOptions> willDelete;
- MAKE_SWAP_METHOD(lsFileOperations, didCreate, willCreate, didRename, willRename, didDelete, willDelete)
- };
- optional<lsFileOperations>fileOperations;
-
-
- MAKE_SWAP_METHOD(WorkspaceServerCapabilities, workspaceFolders, fileOperations)
-};
-MAKE_REFLECT_STRUCT(WorkspaceServerCapabilities, workspaceFolders, fileOperations)
-MAKE_REFLECT_STRUCT(WorkspaceServerCapabilities::lsFileOperations, didCreate, willCreate, didRename, willRename, didDelete, willDelete)
-
-//
- // Semantic highlighting server capabilities.
- //
- // <p>
- // <b>Note:</b> the <a href=
- // "https://github.com/Microsoft/vscode-languageserver-node/pull/367">{@code textDocument/semanticHighlighting}
- // language feature</a> is not yet part of the official LSP specification.
- //
-
-struct SemanticHighlightingServerCapabilities {
+ // The server is interested in receiving didCreateFiles
+ // notifications.
//
- // A "lookup table" of semantic highlighting <a href="https://manual.macromates.com/en/language_grammars">TextMate scopes</a>
- // supported by the language server. If not defined or empty, then the server does not support the semantic highlighting
- // feature. Otherwise, clients should reuse this "lookup table" when receiving semantic highlighting notifications from
- // the server.
- //
- std::vector< std::vector<std::string> > scopes;
- MAKE_SWAP_METHOD(SemanticHighlightingServerCapabilities, scopes)
-};
-MAKE_REFLECT_STRUCT(SemanticHighlightingServerCapabilities, scopes)
+ optional<lsFileOperationRegistrationOptions> didCreate;
-struct SemanticTokensServerFull
-{
//
- // The server supports deltas for full documents.
+ // The server is interested in receiving willCreateFiles requests.
//
- bool delta =false;
- MAKE_SWAP_METHOD(SemanticTokensServerFull, delta)
-};
-MAKE_REFLECT_STRUCT(SemanticTokensServerFull, delta)
-struct SemanticTokensWithRegistrationOptions
-{
- SemanticTokensLegend legend;
+ optional<lsFileOperationRegistrationOptions> willCreate;
//
- // Server supports providing semantic tokens for a specific range
- // of a document.
- //
- optional< std::pair< optional<bool>, optional<lsp::Any> > > range;
-
+ // The server is interested in receiving didRenameFiles
+ // notifications.
//
- // Server supports providing semantic tokens for a full document.
- //
- optional< std::pair< optional<bool>,
- optional<SemanticTokensServerFull> > > full;
+ optional<lsFileOperationRegistrationOptions> didRename;
//
- // A document selector to identify the scope of the registration. If set to null
- // the document selector provided on the client side will be used.
- //
- optional < std::vector<DocumentFilter> > documentSelector;
+ // The server is interested in receiving willRenameFiles requests.
//
- // The id used to register the request. The id can be used to deregister
- // the request again. See also Registration#id.
- //
- optional<std::string> id;
- MAKE_SWAP_METHOD(SemanticTokensWithRegistrationOptions, legend, range, full, documentSelector, id)
-};
-MAKE_REFLECT_STRUCT(SemanticTokensWithRegistrationOptions, legend, range, full, documentSelector ,id)
-
-using DocumentColorOptions = WorkDoneProgressOptions;
-using FoldingRangeOptions = WorkDoneProgressOptions;
-struct lsServerCapabilities {
- // Defines how text documents are synced. Is either a detailed structure
- // defining each notification or for backwards compatibility the
-
- // TextDocumentSyncKind number.
- optional< std::pair<optional<lsTextDocumentSyncKind>,
- optional<lsTextDocumentSyncOptions> >> textDocumentSync;
+ optional<lsFileOperationRegistrationOptions> willRename;
- // The server provides hover support.
- optional<bool> hoverProvider;
-
- // The server provides completion support.
- optional < lsCompletionOptions > completionProvider;
-
- // The server provides signature help support.
- optional < lsSignatureHelpOptions > signatureHelpProvider;
-
- // The server provides goto definition support.
- optional< std::pair< optional<bool>, optional<WorkDoneProgressOptions> > > definitionProvider;
-
-
- //
- // The server provides Goto Type Definition support.
- //
- // Since 3.6.0
- //
- optional< std::pair< optional<bool>, optional<StaticRegistrationOptions> > > typeDefinitionProvider ;
-
- // The server provides implementation support.
- optional< std::pair< optional<bool>, optional<StaticRegistrationOptions> > > implementationProvider ;
-
- // The server provides find references support.
- optional< std::pair< optional<bool>, optional<WorkDoneProgressOptions> > > referencesProvider ;
-
- // The server provides document highlight support.
- optional< std::pair< optional<bool>, optional<WorkDoneProgressOptions> > > documentHighlightProvider ;
-
- // The server provides document symbol support.
- optional< std::pair< optional<bool>, optional<WorkDoneProgressOptions> > > documentSymbolProvider ;
-
- // The server provides workspace symbol support.
- optional< std::pair< optional<bool>, optional<WorkDoneProgressOptions> > > workspaceSymbolProvider ;
-
- // The server provides code actions.
- optional< std::pair< optional<bool>, optional<CodeActionOptions> > > codeActionProvider ;
-
- // The server provides code lens.
- optional<CodeLensOptions> codeLensProvider;
+ //
+ // The server is interested in receiving didDeleteFiles file
+ // notifications.
+ //
+ optional<lsFileOperationRegistrationOptions> didDelete;
- // The server provides document formatting.
- optional< std::pair< optional<bool>, optional<WorkDoneProgressOptions> > > documentFormattingProvider ;
+ //
+ // The server is interested in receiving willDeleteFiles file
+ // requests.
+ //
+ optional<lsFileOperationRegistrationOptions> willDelete;
+ MAKE_SWAP_METHOD(lsFileOperations, didCreate, willCreate, didRename, willRename, didDelete, willDelete)
+ };
+ optional<lsFileOperations> fileOperations;
- // The server provides document range formatting.
- optional< std::pair< optional<bool>, optional<WorkDoneProgressOptions> > > documentRangeFormattingProvider ;
+ MAKE_SWAP_METHOD(WorkspaceServerCapabilities, workspaceFolders, fileOperations)
+};
+MAKE_REFLECT_STRUCT(WorkspaceServerCapabilities, workspaceFolders, fileOperations)
+MAKE_REFLECT_STRUCT(
+ WorkspaceServerCapabilities::lsFileOperations, didCreate, willCreate, didRename, willRename, didDelete, willDelete
+)
- // The server provides document formatting on typing.
- optional<lsDocumentOnTypeFormattingOptions> documentOnTypeFormattingProvider;
+//
+// Semantic highlighting server capabilities.
+//
+// <p>
+// <b>Note:</b> the <a href=
+// "https://github.com/Microsoft/vscode-languageserver-node/pull/367">{@code textDocument/semanticHighlighting}
+// language feature</a> is not yet part of the official LSP specification.
+//
- // The server provides rename support.
- optional< std::pair< optional<bool>, optional<RenameOptions> > > renameProvider;
+struct SemanticHighlightingServerCapabilities
+{
+ //
+ // A "lookup table" of semantic highlighting <a href="https://manual.macromates.com/en/language_grammars">TextMate scopes</a>
+ // supported by the language server. If not defined or empty, then the server does not support the semantic highlighting
+ // feature. Otherwise, clients should reuse this "lookup table" when receiving semantic highlighting notifications from
+ // the server.
+ //
+ std::vector<std::vector<std::string>> scopes;
+ MAKE_SWAP_METHOD(SemanticHighlightingServerCapabilities, scopes)
+};
+MAKE_REFLECT_STRUCT(SemanticHighlightingServerCapabilities, scopes)
+struct SemanticTokensServerFull
+{
+ //
+ // The server supports deltas for full documents.
+ //
+ bool delta = false;
+ MAKE_SWAP_METHOD(SemanticTokensServerFull, delta)
+};
+MAKE_REFLECT_STRUCT(SemanticTokensServerFull, delta)
+struct SemanticTokensWithRegistrationOptions
+{
+ SemanticTokensLegend legend;
+
+ //
+ // Server supports providing semantic tokens for a specific range
+ // of a document.
+ //
+ optional<std::pair<optional<bool>, optional<lsp::Any>>> range;
+
+ //
+ // Server supports providing semantic tokens for a full document.
+ //
+ optional<std::pair<optional<bool>, optional<SemanticTokensServerFull>>> full;
+
+ //
+ // A document selector to identify the scope of the registration. If set to null
+ // the document selector provided on the client side will be used.
+ //
+ optional<std::vector<DocumentFilter>> documentSelector;
+ //
+ // The id used to register the request. The id can be used to deregister
+ // the request again. See also Registration#id.
+ //
+ optional<std::string> id;
+ MAKE_SWAP_METHOD(SemanticTokensWithRegistrationOptions, legend, range, full, documentSelector, id)
+};
+MAKE_REFLECT_STRUCT(SemanticTokensWithRegistrationOptions, legend, range, full, documentSelector, id)
- // The server provides document link support.
- optional<lsDocumentLinkOptions > documentLinkProvider;
+using DocumentColorOptions = WorkDoneProgressOptions;
+using FoldingRangeOptions = WorkDoneProgressOptions;
+struct InlayHintOptions : WorkDoneProgressOptions
+{
- //
- // The server provides color provider support.
- //
- // @since 3.6.0
- //
- optional< std::pair< optional<bool>, optional<DocumentColorOptions> > > colorProvider;
+ /**
+ * The server provides support to resolve additional
+ * information for an inlay hint item.
+ */
+ optional<bool> resolveProvider;
+ MAKE_SWAP_METHOD(InlayHintOptions, workDoneProgress, resolveProvider);
+};
- //
- // The server provides folding provider support.
- //
- // @since 3.10.0
- //
- optional < std::pair< optional<bool>, optional<FoldingRangeOptions> > > foldingRangeProvider;
+MAKE_REFLECT_STRUCT(InlayHintOptions, workDoneProgress, resolveProvider)
- // The server provides execute command support.
- optional < lsExecuteCommandOptions >executeCommandProvider;
+struct lsServerCapabilities
+{
+ // Defines how text documents are synced. Is either a detailed structure
+ // defining each notification or for backwards compatibility the
+ // TextDocumentSyncKind number.
+ optional<std::pair<optional<lsTextDocumentSyncKind>, optional<lsTextDocumentSyncOptions>>> textDocumentSync;
- //
- // Workspace specific server capabilities
- //
- optional< WorkspaceServerCapabilities > workspace;
+ // The server provides hover support.
+ optional<bool> hoverProvider;
- //
- // Semantic highlighting server capabilities.
- //
+ // The server provides completion support.
+ optional<lsCompletionOptions> completionProvider;
- optional< SemanticHighlightingServerCapabilities >semanticHighlighting;
+ // The server provides signature help support.
+ optional<lsSignatureHelpOptions> signatureHelpProvider;
- //
- // Server capability for calculating super- and subtype hierarchies.
- // The LS supports the type hierarchy language feature, if this capability is set to {@code true}.
- //
- // <p>
- // <b>Note:</b> the <a href=
- // "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
- // language feature</a> is not yet part of the official LSP specification.
- //
-
- optional< std::pair< optional<bool>,
- optional<StaticRegistrationOptions> > > typeHierarchyProvider;
+ // The server provides goto definition support.
+ optional<std::pair<optional<bool>, optional<WorkDoneProgressOptions>>> definitionProvider;
- //
- // The server provides Call Hierarchy support.
- //
+ //
+ // The server provides Goto Type Definition support.
+ //
+ // Since 3.6.0
+ //
+ optional<std::pair<optional<bool>, optional<StaticRegistrationOptions>>> typeDefinitionProvider;
- optional< std::pair< optional<bool>,
- optional<StaticRegistrationOptions> > > callHierarchyProvider;
+ // The server provides implementation support.
+ optional<std::pair<optional<bool>, optional<StaticRegistrationOptions>>> implementationProvider;
- //
- // The server provides selection range support.
- //
- // Since 3.15.0
- //
- optional< std::pair< optional<bool>,
- optional<StaticRegistrationOptions> > > selectionRangeProvider;
-
- //
- // The server provides linked editing range support.
- //
- // Since 3.16.0
- //
- optional< std::pair< optional<bool>,
- optional<StaticRegistrationOptions> > > linkedEditingRangeProvider;
-
-
- //
- // The server provides semantic tokens support.
- //
- // Since 3.16.0
- //
- optional < SemanticTokensWithRegistrationOptions> semanticTokensProvider;
-
- //
- // Whether server provides moniker support.
- //
- // Since 3.16.0
- //
- optional< std::pair< optional<bool>,
- optional<StaticRegistrationOptions> > > monikerProvider;
-
- optional<lsp::Any> experimental;
-
-
- MAKE_SWAP_METHOD(lsServerCapabilities,
- textDocumentSync,
- hoverProvider,
- completionProvider,
- signatureHelpProvider,
- definitionProvider,
- typeDefinitionProvider,
- implementationProvider,
- referencesProvider,
- documentHighlightProvider,
- documentSymbolProvider,
- workspaceSymbolProvider,
- codeActionProvider,
- codeLensProvider,
- documentFormattingProvider,
- documentRangeFormattingProvider,
- documentOnTypeFormattingProvider,
- renameProvider,
- documentLinkProvider,
- executeCommandProvider,
- workspace,
- semanticHighlighting,
- typeHierarchyProvider,
- callHierarchyProvider,
- selectionRangeProvider,
- experimental, colorProvider, foldingRangeProvider,
- linkedEditingRangeProvider, monikerProvider, semanticTokensProvider)
+ // The server provides find references support.
+ optional<std::pair<optional<bool>, optional<WorkDoneProgressOptions>>> referencesProvider;
+ // The server provides document highlight support.
+ optional<std::pair<optional<bool>, optional<WorkDoneProgressOptions>>> documentHighlightProvider;
+
+ // The server provides document symbol support.
+ optional<std::pair<optional<bool>, optional<WorkDoneProgressOptions>>> documentSymbolProvider;
+
+ // The server provides workspace symbol support.
+ optional<std::pair<optional<bool>, optional<WorkDoneProgressOptions>>> workspaceSymbolProvider;
+
+ // The server provides code actions.
+ optional<std::pair<optional<bool>, optional<CodeActionOptions>>> codeActionProvider;
+
+ // The server provides code lens.
+ optional<CodeLensOptions> codeLensProvider;
+
+ // The server provides document formatting.
+ optional<std::pair<optional<bool>, optional<WorkDoneProgressOptions>>> documentFormattingProvider;
+
+ // The server provides document range formatting.
+ optional<std::pair<optional<bool>, optional<WorkDoneProgressOptions>>> documentRangeFormattingProvider;
+
+ // The server provides document formatting on typing.
+ optional<lsDocumentOnTypeFormattingOptions> documentOnTypeFormattingProvider;
+
+ // The server provides rename support.
+ optional<std::pair<optional<bool>, optional<RenameOptions>>> renameProvider;
+
+ // The server provides document link support.
+ optional<lsDocumentLinkOptions> documentLinkProvider;
+
+ //
+ // The server provides color provider support.
+ //
+ // @since 3.6.0
+ //
+ optional<std::pair<optional<bool>, optional<DocumentColorOptions>>> colorProvider;
+
+ //
+ // The server provides folding provider support.
+ //
+ // @since 3.10.0
+ //
+ optional<std::pair<optional<bool>, optional<FoldingRangeOptions>>> foldingRangeProvider;
+
+ // The server provides execute command support.
+ optional<lsExecuteCommandOptions> executeCommandProvider;
+
+ //
+ // Workspace specific server capabilities
+ //
+ optional<WorkspaceServerCapabilities> workspace;
+
+ //
+ // Semantic highlighting server capabilities.
+ //
+
+ optional<SemanticHighlightingServerCapabilities> semanticHighlighting;
+
+ //
+ // Server capability for calculating super- and subtype hierarchies.
+ // The LS supports the type hierarchy language feature, if this capability is set to {@code true}.
+ //
+ // <p>
+ // <b>Note:</b> the <a href=
+ // "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+ // language feature</a> is not yet part of the official LSP specification.
+ //
+
+ optional<std::pair<optional<bool>, optional<StaticRegistrationOptions>>> typeHierarchyProvider;
+
+ //
+ // The server provides Call Hierarchy support.
+ //
+
+ optional<std::pair<optional<bool>, optional<StaticRegistrationOptions>>> callHierarchyProvider;
+
+ //
+ // The server provides selection range support.
+ //
+ // Since 3.15.0
+ //
+ optional<std::pair<optional<bool>, optional<StaticRegistrationOptions>>> selectionRangeProvider;
+
+ //
+ // The server provides linked editing range support.
+ //
+ // Since 3.16.0
+ //
+ optional<std::pair<optional<bool>, optional<StaticRegistrationOptions>>> linkedEditingRangeProvider;
+
+ //
+ // The server provides semantic tokens support.
+ //
+ // Since 3.16.0
+ //
+ optional<SemanticTokensWithRegistrationOptions> semanticTokensProvider;
+
+ //
+ // Whether server provides moniker support.
+ //
+ // Since 3.16.0
+ //
+ optional<std::pair<optional<bool>, optional<StaticRegistrationOptions>>> monikerProvider;
+
+ /**
+ * The server provides inlay hints.
+ *
+ * @since 3.17.0
+ */
+ optional<std::pair<optional<bool>, optional<InlayHintOptions>>> inlayHintProvider;
+
+ optional<lsp::Any> experimental;
+
+ MAKE_SWAP_METHOD(
+ lsServerCapabilities, textDocumentSync, hoverProvider, completionProvider, signatureHelpProvider,
+ definitionProvider, typeDefinitionProvider, implementationProvider, referencesProvider,
+ documentHighlightProvider, documentSymbolProvider, workspaceSymbolProvider, codeActionProvider,
+ codeLensProvider, documentFormattingProvider, documentRangeFormattingProvider, documentOnTypeFormattingProvider,
+ renameProvider, documentLinkProvider, executeCommandProvider, workspace, semanticHighlighting,
+ typeHierarchyProvider, callHierarchyProvider, selectionRangeProvider, experimental, colorProvider,
+ foldingRangeProvider, linkedEditingRangeProvider, monikerProvider, semanticTokensProvider
+ )
};
-MAKE_REFLECT_STRUCT(lsServerCapabilities,
- textDocumentSync,
- hoverProvider,
- completionProvider,
- signatureHelpProvider,
- definitionProvider,
- typeDefinitionProvider,
- implementationProvider,
- referencesProvider,
- documentHighlightProvider,
- documentSymbolProvider,
- workspaceSymbolProvider,
- codeActionProvider,
- codeLensProvider,
- documentFormattingProvider,
- documentRangeFormattingProvider,
- documentOnTypeFormattingProvider,
- renameProvider,
- documentLinkProvider,
- executeCommandProvider,
- workspace,
- semanticHighlighting,
- typeHierarchyProvider,
- callHierarchyProvider,
- selectionRangeProvider,
- experimental, colorProvider, foldingRangeProvider,
- linkedEditingRangeProvider, monikerProvider, semanticTokensProvider)
+MAKE_REFLECT_STRUCT(
+ lsServerCapabilities, textDocumentSync, hoverProvider, completionProvider, signatureHelpProvider,
+ definitionProvider, typeDefinitionProvider, implementationProvider, referencesProvider, documentHighlightProvider,
+ documentSymbolProvider, workspaceSymbolProvider, codeActionProvider, codeLensProvider, documentFormattingProvider,
+ documentRangeFormattingProvider, documentOnTypeFormattingProvider, renameProvider, documentLinkProvider,
+ executeCommandProvider, workspace, semanticHighlighting, typeHierarchyProvider, callHierarchyProvider,
+ selectionRangeProvider, experimental, colorProvider, foldingRangeProvider, linkedEditingRangeProvider,
+ monikerProvider, semanticTokensProvider
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h
index 1523254d63..ddedd3711f 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h
@@ -1,7 +1,6 @@
#pragma once
#include "LibLsp/lsp/method_type.h"
-
#include <stdexcept>
#include "LibLsp/JsonRpc/message.h"
#include "LibLsp/lsp/lsDocumentUri.h"
@@ -11,84 +10,84 @@
#include "LibLsp/lsp/lsp_completion.h"
#include "LibLsp/lsp/lsp_diagnostic.h"
-
-struct WorkDoneProgressOptions
+struct WorkDoneProgressOptions
{
- optional<bool>workDoneProgress;
- MAKE_SWAP_METHOD(WorkDoneProgressOptions, workDoneProgress);
+ optional<bool> workDoneProgress;
+ MAKE_SWAP_METHOD(WorkDoneProgressOptions, workDoneProgress);
};
MAKE_REFLECT_STRUCT(WorkDoneProgressOptions, workDoneProgress);
// Completion options.
-struct lsCompletionOptions:WorkDoneProgressOptions
+struct lsCompletionOptions : WorkDoneProgressOptions
{
- // The server provides support to resolve additional
- // information for a completion item.
- optional<bool> resolveProvider = false;
-
- //
- // Most tools trigger completion request automatically without explicitly requesting
- // it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user
- // starts to type an identifier. For example if the user types `c` in a JavaScript file
- // code complete will automatically pop up present `console` besides others as a
- // completion item. Characters that make up identifiers don't need to be listed here.
- //
- // If code complete should automatically be trigger on characters not being valid inside
- // an identifier (for example `.` in JavaScript) list them in `triggerCharacters`.
- //
- // https://github.com/Microsoft/language-server-protocol/issues/138.
- optional< std::vector<std::string> > triggerCharacters ;
-
- //
- // The list of all possible characters that commit a completion. This field can be used
- // if clients don't support individual commmit characters per completion item. See
- // `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`
- //
- optional< std::vector<std::string> > allCommitCharacters;
-
- MAKE_SWAP_METHOD(lsCompletionOptions, workDoneProgress, resolveProvider, triggerCharacters, allCommitCharacters);
+ // The server provides support to resolve additional
+ // information for a completion item.
+ optional<bool> resolveProvider = false;
+
+ //
+ // Most tools trigger completion request automatically without explicitly requesting
+ // it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user
+ // starts to type an identifier. For example if the user types `c` in a JavaScript file
+ // code complete will automatically pop up present `console` besides others as a
+ // completion item. Characters that make up identifiers don't need to be listed here.
+ //
+ // If code complete should automatically be trigger on characters not being valid inside
+ // an identifier (for example `.` in JavaScript) list them in `triggerCharacters`.
+ //
+ // https://github.com/Microsoft/language-server-protocol/issues/138.
+ optional<std::vector<std::string>> triggerCharacters;
+
+ //
+ // The list of all possible characters that commit a completion. This field can be used
+ // if clients don't support individual commmit characters per completion item. See
+ // `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`
+ //
+ optional<std::vector<std::string>> allCommitCharacters;
+
+ MAKE_SWAP_METHOD(lsCompletionOptions, workDoneProgress, resolveProvider, triggerCharacters, allCommitCharacters);
};
-MAKE_REFLECT_STRUCT(lsCompletionOptions, workDoneProgress, resolveProvider, triggerCharacters,allCommitCharacters);
-
-
+MAKE_REFLECT_STRUCT(lsCompletionOptions, workDoneProgress, resolveProvider, triggerCharacters, allCommitCharacters);
// Save options.
-struct lsSaveOptions {
- // The client is supposed to include the content on save.
- bool includeText = false;
- void swap(lsSaveOptions& arg)noexcept
- {
- auto temp = includeText;
- includeText = arg.includeText;
- arg.includeText = temp;
- }
+struct lsSaveOptions
+{
+ // The client is supposed to include the content on save.
+ bool includeText = false;
+ void swap(lsSaveOptions& arg) noexcept
+ {
+ auto temp = includeText;
+ includeText = arg.includeText;
+ arg.includeText = temp;
+ }
};
MAKE_REFLECT_STRUCT(lsSaveOptions, includeText);
// Signature help options.
-struct lsSignatureHelpOptions : WorkDoneProgressOptions {
- // The characters that trigger signature help automatically.
- // NOTE: If updating signature help tokens make sure to also update
- // WorkingFile::FindClosestCallNameInBuffer.
- std::vector<std::string> triggerCharacters;
- MAKE_SWAP_METHOD(lsSignatureHelpOptions, workDoneProgress, triggerCharacters);
+struct lsSignatureHelpOptions : WorkDoneProgressOptions
+{
+ // The characters that trigger signature help automatically.
+ // NOTE: If updating signature help tokens make sure to also update
+ // WorkingFile::FindClosestCallNameInBuffer.
+ std::vector<std::string> triggerCharacters;
+ MAKE_SWAP_METHOD(lsSignatureHelpOptions, workDoneProgress, triggerCharacters);
};
-MAKE_REFLECT_STRUCT(lsSignatureHelpOptions, workDoneProgress, triggerCharacters);
+MAKE_REFLECT_STRUCT(lsSignatureHelpOptions, workDoneProgress, triggerCharacters);
// Defines how the host (editor) should sync document changes to the language
// server.
-enum class lsTextDocumentSyncKind {
- // Documents should not be synced at all.
- None = 0,
-
- // Documents are synced by always sending the full content
- // of the document.
- Full = 1,
-
- // Documents are synced by sending the full content on open.
- // After that only incremental updates to the document are
- // send.
- Incremental = 2
+enum class lsTextDocumentSyncKind
+{
+ // Documents should not be synced at all.
+ None = 0,
+
+ // Documents are synced by always sending the full content
+ // of the document.
+ Full = 1,
+
+ // Documents are synced by sending the full content on open.
+ // After that only incremental updates to the document are
+ // send.
+ Incremental = 2
};
#if _WIN32
@@ -100,294 +99,274 @@ MAKE_REFLECT_TYPE_PROXY(lsTextDocumentSyncKind)
//#pragma clang diagnostic pop
#endif
-struct lsTextDocumentSyncOptions {
- // Open and close notifications are sent to the server.
- optional<bool> openClose ;
- // Change notificatins are sent to the server. See TextDocumentSyncKind.None,
- // TextDocumentSyncKind.Full and TextDocumentSyncKindIncremental.
- optional< lsTextDocumentSyncKind> change ;
- // Will save notifications are sent to the server.
- optional<bool> willSave;
- // Will save wait until requests are sent to the server.
- optional<bool> willSaveWaitUntil;
- // Save notifications are sent to the server.
- optional<lsSaveOptions> save;
-
- MAKE_SWAP_METHOD(lsTextDocumentSyncOptions,
- openClose,
- change,
- willSave,
- willSaveWaitUntil,
- save);
-};
-MAKE_REFLECT_STRUCT(lsTextDocumentSyncOptions,
- openClose,
- change,
- willSave,
- willSaveWaitUntil,
- save);
-
-struct SynchronizationCapabilities {
- // Whether text document synchronization supports dynamic registration.
- optional<bool> dynamicRegistration;
-
- // The client supports sending will save notifications.
- optional<bool> willSave;
-
- // The client supports sending a will save request and
- // waits for a response providing text edits which will
- // be applied to the document before it is saved.
- optional<bool> willSaveWaitUntil;
-
- // The client supports did save notifications.
- optional<bool> didSave;
-
- MAKE_SWAP_METHOD(SynchronizationCapabilities,
- dynamicRegistration,
- willSave,
- willSaveWaitUntil,
- didSave);
-};
-MAKE_REFLECT_STRUCT(SynchronizationCapabilities,
- dynamicRegistration,
- willSave,
- willSaveWaitUntil,
- didSave);
-
-struct CompletionItemKindCapabilities
+struct lsTextDocumentSyncOptions
{
- optional<std::vector<lsCompletionItemKind> >valueSet;
- MAKE_SWAP_METHOD(CompletionItemKindCapabilities, valueSet);
+ // Open and close notifications are sent to the server.
+ optional<bool> openClose;
+ // Change notificatins are sent to the server. See TextDocumentSyncKind.None,
+ // TextDocumentSyncKind.Full and TextDocumentSyncKindIncremental.
+ optional<lsTextDocumentSyncKind> change;
+ // Will save notifications are sent to the server.
+ optional<bool> willSave;
+ // Will save wait until requests are sent to the server.
+ optional<bool> willSaveWaitUntil;
+ // Save notifications are sent to the server.
+ optional<lsSaveOptions> save;
+
+ MAKE_SWAP_METHOD(lsTextDocumentSyncOptions, openClose, change, willSave, willSaveWaitUntil, save);
};
-MAKE_REFLECT_STRUCT(CompletionItemKindCapabilities, valueSet);
-
-struct CompletionItemCapabilities {
- // Client supports snippets as insert text.
- //
- // A snippet can define tab stops and placeholders with `$1`, `$2`
- // and `${3:foo}`. `$0` defines the final tab stop, it defaults to
- // the end of the snippet. Placeholders with equal identifiers are linked,
- // that is typing in one will update others too.
- optional<bool> snippetSupport;
-
- // Client supports commit characters on a completion item.
-
- optional<bool> commitCharactersSupport;
+MAKE_REFLECT_STRUCT(lsTextDocumentSyncOptions, openClose, change, willSave, willSaveWaitUntil, save);
+struct SynchronizationCapabilities
+{
+ // Whether text document synchronization supports dynamic registration.
+ optional<bool> dynamicRegistration;
- // Client supports the following content formats for the documentation
- // property. The order describes the preferred format of the client.
+ // The client supports sending will save notifications.
+ optional<bool> willSave;
- optional< std::vector<std::string> > documentationFormat;
+ // The client supports sending a will save request and
+ // waits for a response providing text edits which will
+ // be applied to the document before it is saved.
+ optional<bool> willSaveWaitUntil;
- // Client supports the deprecated property on a completion item.
+ // The client supports did save notifications.
+ optional<bool> didSave;
- optional<bool> deprecatedSupport;
+ MAKE_SWAP_METHOD(SynchronizationCapabilities, dynamicRegistration, willSave, willSaveWaitUntil, didSave);
+};
+MAKE_REFLECT_STRUCT(SynchronizationCapabilities, dynamicRegistration, willSave, willSaveWaitUntil, didSave);
- //
- // Client supports the preselect property on a completion item.
- //
- optional<bool> preselectSupport;
-
- MAKE_SWAP_METHOD(CompletionItemCapabilities,
- snippetSupport,
- commitCharactersSupport,
- documentationFormat,
- deprecatedSupport, preselectSupport);
+struct CompletionItemKindCapabilities
+{
+ optional<std::vector<lsCompletionItemKind>> valueSet;
+ MAKE_SWAP_METHOD(CompletionItemKindCapabilities, valueSet);
};
-MAKE_REFLECT_STRUCT(CompletionItemCapabilities,
- snippetSupport,
- commitCharactersSupport,
- documentationFormat,
- deprecatedSupport, preselectSupport);
+MAKE_REFLECT_STRUCT(CompletionItemKindCapabilities, valueSet);
+struct CompletionItemCapabilities
+{
+ // Client supports snippets as insert text.
+ //
+ // A snippet can define tab stops and placeholders with `$1`, `$2`
+ // and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+ // the end of the snippet. Placeholders with equal identifiers are linked,
+ // that is typing in one will update others too.
+ optional<bool> snippetSupport;
-//
- // Capabilities specific to the `textDocument/completion`
- //
-struct CompletionCapabilities {
- // Whether completion supports dynamic registration.
- optional<bool> dynamicRegistration;
+ // Client supports commit characters on a completion item.
+ optional<bool> commitCharactersSupport;
+ // Client supports the following content formats for the documentation
+ // property. The order describes the preferred format of the client.
- // The client supports the following `CompletionItem` specific
- // capabilities.
- optional<CompletionItemCapabilities> completionItem;
+ optional<std::vector<std::string>> documentationFormat;
- //
- // The client supports the following `CompletionItemKind` specific
- // capabilities.
- //
- optional<CompletionItemKindCapabilities> completionItemKind;
+ // Client supports the deprecated property on a completion item.
- //
- // The client supports sending additional context information for a
- // `textDocument/completion` request.
- //
- optional<bool> contextSupport;
+ optional<bool> deprecatedSupport;
+ //
+ // Client supports the preselect property on a completion item.
+ //
+ optional<bool> preselectSupport;
- MAKE_SWAP_METHOD(CompletionCapabilities,
- dynamicRegistration,
- completionItem, completionItemKind);
+ MAKE_SWAP_METHOD(
+ CompletionItemCapabilities, snippetSupport, commitCharactersSupport, documentationFormat, deprecatedSupport,
+ preselectSupport
+ );
};
+MAKE_REFLECT_STRUCT(
+ CompletionItemCapabilities, snippetSupport, commitCharactersSupport, documentationFormat, deprecatedSupport,
+ preselectSupport
+);
-MAKE_REFLECT_STRUCT(CompletionCapabilities,
- dynamicRegistration,
- completionItem , completionItemKind);
+//
+// Capabilities specific to the `textDocument/completion`
+//
+struct CompletionCapabilities
+{
+ // Whether completion supports dynamic registration.
+ optional<bool> dynamicRegistration;
+
+ // The client supports the following `CompletionItem` specific
+ // capabilities.
+ optional<CompletionItemCapabilities> completionItem;
+
+ //
+ // The client supports the following `CompletionItemKind` specific
+ // capabilities.
+ //
+ optional<CompletionItemKindCapabilities> completionItemKind;
+
+ //
+ // The client supports sending additional context information for a
+ // `textDocument/completion` request.
+ //
+ optional<bool> contextSupport;
+
+ MAKE_SWAP_METHOD(CompletionCapabilities, dynamicRegistration, completionItem, completionItemKind);
+};
+MAKE_REFLECT_STRUCT(CompletionCapabilities, dynamicRegistration, completionItem, completionItemKind);
-struct HoverCapabilities:public DynamicRegistrationCapabilities
+struct HoverCapabilities : public DynamicRegistrationCapabilities
{
- //
- // Client supports the following content formats for the content
- // property. The order describes the preferred format of the client.
- //
- // See {@link MarkupKind} for allowed values.
- //
- optional<std::vector<std::string>> contentFormat;
-
- MAKE_SWAP_METHOD(HoverCapabilities, dynamicRegistration, contentFormat);
+ //
+ // Client supports the following content formats for the content
+ // property. The order describes the preferred format of the client.
+ //
+ // See {@link MarkupKind} for allowed values.
+ //
+ optional<std::vector<std::string>> contentFormat;
+
+ MAKE_SWAP_METHOD(HoverCapabilities, dynamicRegistration, contentFormat);
};
MAKE_REFLECT_STRUCT(HoverCapabilities, dynamicRegistration, contentFormat);
//
- // Client capabilities specific to parameter information.
- //
-struct ParameterInformationCapabilities {
- //
- // The client supports processing label offsets instead of a
- // simple label string.
- //
- // Since 3.14.0
- //
- optional<bool> labelOffsetSupport;
-
- MAKE_SWAP_METHOD(ParameterInformationCapabilities, labelOffsetSupport);
+// Client capabilities specific to parameter information.
+//
+struct ParameterInformationCapabilities
+{
+ //
+ // The client supports processing label offsets instead of a
+ // simple label string.
+ //
+ // Since 3.14.0
+ //
+ optional<bool> labelOffsetSupport;
+
+ MAKE_SWAP_METHOD(ParameterInformationCapabilities, labelOffsetSupport);
};
MAKE_REFLECT_STRUCT(ParameterInformationCapabilities, labelOffsetSupport)
-
-struct SignatureInformationCapabilities {
- //
- // Client supports the following content formats for the documentation
- // property. The order describes the preferred format of the client.
- //
- // See {@link MarkupKind} for allowed values.
- //
- std::vector<std::string> documentationFormat;
-
- //
- // Client capabilities specific to parameter information.
- //
- ParameterInformationCapabilities parameterInformation;
-
- MAKE_SWAP_METHOD(SignatureInformationCapabilities, documentationFormat, parameterInformation)
+struct SignatureInformationCapabilities
+{
+ //
+ // Client supports the following content formats for the documentation
+ // property. The order describes the preferred format of the client.
+ //
+ // See {@link MarkupKind} for allowed values.
+ //
+ std::vector<std::string> documentationFormat;
+
+ //
+ // Client capabilities specific to parameter information.
+ //
+ ParameterInformationCapabilities parameterInformation;
+
+ MAKE_SWAP_METHOD(SignatureInformationCapabilities, documentationFormat, parameterInformation)
};
-MAKE_REFLECT_STRUCT(SignatureInformationCapabilities,documentationFormat, parameterInformation)
+MAKE_REFLECT_STRUCT(SignatureInformationCapabilities, documentationFormat, parameterInformation)
-struct SignatureHelpCapabilities :public DynamicRegistrationCapabilities
+struct SignatureHelpCapabilities : public DynamicRegistrationCapabilities
{
- //
- // The client supports the following `SignatureInformation`
- // specific properties.
- //
- optional< SignatureInformationCapabilities > signatureInformation;
+ //
+ // The client supports the following `SignatureInformation`
+ // specific properties.
+ //
+ optional<SignatureInformationCapabilities> signatureInformation;
- MAKE_SWAP_METHOD(SignatureHelpCapabilities, dynamicRegistration, signatureInformation)
+ MAKE_SWAP_METHOD(SignatureHelpCapabilities, dynamicRegistration, signatureInformation)
};
MAKE_REFLECT_STRUCT(SignatureHelpCapabilities, dynamicRegistration, signatureInformation)
-struct DocumentSymbolCapabilities :public DynamicRegistrationCapabilities {
- //
- // Specific capabilities for the `SymbolKind`.
- //
- optional<SymbolKindCapabilities> symbolKind;
+struct DocumentSymbolCapabilities : public DynamicRegistrationCapabilities
+{
+ //
+ // Specific capabilities for the `SymbolKind`.
+ //
+ optional<SymbolKindCapabilities> symbolKind;
- //
- // The client support hierarchical document symbols.
- //
- optional<bool> hierarchicalDocumentSymbolSupport;
+ //
+ // The client support hierarchical document symbols.
+ //
+ optional<bool> hierarchicalDocumentSymbolSupport;
- MAKE_SWAP_METHOD(DocumentSymbolCapabilities, dynamicRegistration, symbolKind, hierarchicalDocumentSymbolSupport)
+ MAKE_SWAP_METHOD(DocumentSymbolCapabilities, dynamicRegistration, symbolKind, hierarchicalDocumentSymbolSupport)
};
MAKE_REFLECT_STRUCT(DocumentSymbolCapabilities, dynamicRegistration, symbolKind, hierarchicalDocumentSymbolSupport)
-struct DeclarationCapabilities:public DynamicRegistrationCapabilities{
- //
- // The client supports additional metadata in the form of declaration links.
- //
- optional<bool>linkSupport;
+struct DeclarationCapabilities : public DynamicRegistrationCapabilities
+{
+ //
+ // The client supports additional metadata in the form of declaration links.
+ //
+ optional<bool> linkSupport;
- MAKE_SWAP_METHOD(DeclarationCapabilities, dynamicRegistration, linkSupport);
+ MAKE_SWAP_METHOD(DeclarationCapabilities, dynamicRegistration, linkSupport);
};
MAKE_REFLECT_STRUCT(DeclarationCapabilities, dynamicRegistration, linkSupport)
-
struct CodeActionKindCapabilities
{
- //
- // The code action kind values the client supports. When this
- // property exists the client also guarantees that it will
- // handle values outside its set gracefully and falls back
- // to a default value when unknown.
- //
- // See {@link CodeActionKind} for allowed values.
- //
- optional< std::vector< std::string> >valueSet;
-
- MAKE_SWAP_METHOD(CodeActionKindCapabilities, valueSet)
+ //
+ // The code action kind values the client supports. When this
+ // property exists the client also guarantees that it will
+ // handle values outside its set gracefully and falls back
+ // to a default value when unknown.
+ //
+ // See {@link CodeActionKind} for allowed values.
+ //
+ optional<std::vector<std::string>> valueSet;
+
+ MAKE_SWAP_METHOD(CodeActionKindCapabilities, valueSet)
};
-MAKE_REFLECT_STRUCT(CodeActionKindCapabilities,valueSet)
+MAKE_REFLECT_STRUCT(CodeActionKindCapabilities, valueSet)
struct CodeActionLiteralSupportCapabilities
{
- optional<CodeActionKindCapabilities> codeActionKind;
+ optional<CodeActionKindCapabilities> codeActionKind;
- MAKE_SWAP_METHOD(CodeActionLiteralSupportCapabilities, codeActionKind)
+ MAKE_SWAP_METHOD(CodeActionLiteralSupportCapabilities, codeActionKind)
};
MAKE_REFLECT_STRUCT(CodeActionLiteralSupportCapabilities, codeActionKind)
-struct CodeActionCapabilities:public DynamicRegistrationCapabilities{
- //
- // The client support code action literals as a valid
- // response of the `textDocument/codeAction` request.
- //
- optional<CodeActionLiteralSupportCapabilities> codeActionLiteralSupport;
+struct CodeActionCapabilities : public DynamicRegistrationCapabilities
+{
+ //
+ // The client support code action literals as a valid
+ // response of the `textDocument/codeAction` request.
+ //
+ optional<CodeActionLiteralSupportCapabilities> codeActionLiteralSupport;
- MAKE_SWAP_METHOD(CodeActionCapabilities, dynamicRegistration, codeActionLiteralSupport)
+ MAKE_SWAP_METHOD(CodeActionCapabilities, dynamicRegistration, codeActionLiteralSupport)
};
-MAKE_REFLECT_STRUCT(CodeActionCapabilities,dynamicRegistration,codeActionLiteralSupport)
+MAKE_REFLECT_STRUCT(CodeActionCapabilities, dynamicRegistration, codeActionLiteralSupport)
-struct RenameCapabilities :public DynamicRegistrationCapabilities {
- //
- // The client support code action literals as a valid
- // response of the `textDocument/codeAction` request.
- //
- optional<bool> prepareSupport;
+struct RenameCapabilities : public DynamicRegistrationCapabilities
+{
+ //
+ // The client support code action literals as a valid
+ // response of the `textDocument/codeAction` request.
+ //
+ optional<bool> prepareSupport;
- MAKE_SWAP_METHOD(RenameCapabilities, dynamicRegistration, prepareSupport)
+ MAKE_SWAP_METHOD(RenameCapabilities, dynamicRegistration, prepareSupport)
};
MAKE_REFLECT_STRUCT(RenameCapabilities, dynamicRegistration, prepareSupport)
-struct DiagnosticsTagSupport {
- /**
+struct DiagnosticsTagSupport
+{
+ /**
* The tags supported by the client.
*/
- std::vector<DiagnosticTag> valueSet;
- MAKE_SWAP_METHOD(DiagnosticsTagSupport, valueSet)
+ std::vector<DiagnosticTag> valueSet;
+ MAKE_SWAP_METHOD(DiagnosticsTagSupport, valueSet)
};
MAKE_REFLECT_STRUCT(DiagnosticsTagSupport, valueSet)
-struct PublishDiagnosticsClientCapabilities :public DynamicRegistrationCapabilities {
- /**
+struct PublishDiagnosticsClientCapabilities : public DynamicRegistrationCapabilities
+{
+ /**
* The client support code action literals as a valid
* response of the `textDocument/codeAction` request.
*/
- optional<bool> relatedInformation;
+ optional<bool> relatedInformation;
- /**
+ /**
* Client supports the tag property to provide meta data about a diagnostic.
* Clients supporting tags have to handle unknown tags gracefully.
*
@@ -398,316 +377,288 @@ struct PublishDiagnosticsClientCapabilities :public DynamicRegistrationCapabilit
*
* Since 3.15
*/
- optional < std::pair<optional<bool>, optional<DiagnosticsTagSupport> > > tagSupport;
+ optional<std::pair<optional<bool>, optional<DiagnosticsTagSupport>>> tagSupport;
- /**
+ /**
* Whether the client interprets the version property of the
* `textDocument/publishDiagnostics` notification's parameter.
*
* Since 3.15.0
*/
- optional<bool> versionSupport;
+ optional<bool> versionSupport;
- /**
+ /**
* Client supports a codeDescription property
*
* @since 3.16.0
*/
- optional<bool> codeDescriptionSupport ;
+ optional<bool> codeDescriptionSupport;
- /**
+ /**
* Whether code action supports the `data` property which is
* preserved between a `textDocument/publishDiagnostics` and
* `textDocument/codeAction` request.
*
* @since 3.16.0
*/
- optional<bool> dataSupport ;
-
+ optional<bool> dataSupport;
- MAKE_SWAP_METHOD(PublishDiagnosticsClientCapabilities, dynamicRegistration, relatedInformation, tagSupport,versionSupport,codeDescriptionSupport,dataSupport)
+ MAKE_SWAP_METHOD(
+ PublishDiagnosticsClientCapabilities, dynamicRegistration, relatedInformation, tagSupport, versionSupport,
+ codeDescriptionSupport, dataSupport
+ )
};
-MAKE_REFLECT_STRUCT(PublishDiagnosticsClientCapabilities, dynamicRegistration, relatedInformation, tagSupport, versionSupport, codeDescriptionSupport, dataSupport)
-
-
-struct FoldingRangeCapabilities :public DynamicRegistrationCapabilities {
- //
- // The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
- // hint, servers are free to follow the limit.
- //
- optional<int> rangeLimit;
+MAKE_REFLECT_STRUCT(
+ PublishDiagnosticsClientCapabilities, dynamicRegistration, relatedInformation, tagSupport, versionSupport,
+ codeDescriptionSupport, dataSupport
+)
- //
- // If set, the client signals that it only supports folding complete lines. If set, client will
- // ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange.
- //
- optional<bool> lineFoldingOnly;
- MAKE_SWAP_METHOD(FoldingRangeCapabilities, dynamicRegistration, rangeLimit, lineFoldingOnly)
+struct FoldingRangeCapabilities : public DynamicRegistrationCapabilities
+{
+ //
+ // The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
+ // hint, servers are free to follow the limit.
+ //
+ optional<int> rangeLimit;
+
+ //
+ // If set, the client signals that it only supports folding complete lines. If set, client will
+ // ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange.
+ //
+ optional<bool> lineFoldingOnly;
+ MAKE_SWAP_METHOD(FoldingRangeCapabilities, dynamicRegistration, rangeLimit, lineFoldingOnly)
};
-MAKE_REFLECT_STRUCT(FoldingRangeCapabilities, dynamicRegistration, rangeLimit,lineFoldingOnly)
+MAKE_REFLECT_STRUCT(FoldingRangeCapabilities, dynamicRegistration, rangeLimit, lineFoldingOnly)
+struct SemanticHighlightingCapabilities : public DynamicRegistrationCapabilities
+{
+ //
+ // The client support code action literals as a valid
+ // response of the `textDocument/codeAction` request.
+ //
+ optional<bool> semanticHighlighting;
-struct SemanticHighlightingCapabilities :public DynamicRegistrationCapabilities {
- //
- // The client support code action literals as a valid
- // response of the `textDocument/codeAction` request.
- //
- optional<bool> semanticHighlighting;
-
- MAKE_SWAP_METHOD(SemanticHighlightingCapabilities, dynamicRegistration, semanticHighlighting)
+ MAKE_SWAP_METHOD(SemanticHighlightingCapabilities, dynamicRegistration, semanticHighlighting)
};
MAKE_REFLECT_STRUCT(SemanticHighlightingCapabilities, dynamicRegistration, semanticHighlighting)
-struct SemanticTokensClientCapabilitiesRequestsFull {
+struct SemanticTokensClientCapabilitiesRequestsFull
+{
- //
- // The client will send the `textDocument/semanticTokens/full/delta` request if
- // the server provides a corresponding handler.
- //
- bool delta = false;
- MAKE_SWAP_METHOD(SemanticTokensClientCapabilitiesRequestsFull, delta)
+ //
+ // The client will send the `textDocument/semanticTokens/full/delta` request if
+ // the server provides a corresponding handler.
+ //
+ bool delta = false;
+ MAKE_SWAP_METHOD(SemanticTokensClientCapabilitiesRequestsFull, delta)
};
MAKE_REFLECT_STRUCT(SemanticTokensClientCapabilitiesRequestsFull, delta)
-struct SemanticTokensClientCapabilities : public DynamicRegistrationCapabilities
+struct SemanticTokensClientCapabilities : public DynamicRegistrationCapabilities
{
- //export TokenFormat = 'relative';
- struct lsRequests
- {
- //
- // The client will send the `textDocument/semanticTokens/range` request
- // if the server provides a corresponding handler.
- //
- optional<std::pair< optional<bool>,
- optional<SemanticTokensClientCapabilitiesRequestsFull>>> range;
- //
- // The client will send the `textDocument/semanticTokens/full` request
- // if the server provides a corresponding handler.
- //
- optional<std::pair< optional<bool>, optional<lsp::Any>>> full;
- MAKE_SWAP_METHOD(lsRequests, range, full)
- };
-
- lsRequests requests;
+ //export TokenFormat = 'relative';
+ struct lsRequests
+ {
//
- // The token types that the client supports.
- //
- std::vector<std::string> tokenTypes;
-
- //
- // The token modifiers that the client supports.
- //
- std::vector<std::string> tokenModifiers;
+ // The client will send the `textDocument/semanticTokens/range` request
+ // if the server provides a corresponding handler.
//
- // The formats the clients supports.
- //
- std::vector<std::string> formats;
+ optional<std::pair<optional<bool>, optional<SemanticTokensClientCapabilitiesRequestsFull>>> range;
//
- // Whether the client supports tokens that can overlap each other.
- //
- optional < bool >overlappingTokenSupport;
-
+ // The client will send the `textDocument/semanticTokens/full` request
+ // if the server provides a corresponding handler.
//
- // Whether the client supports tokens that can span multiple lines.
- //
- optional < bool > multilineTokenSupport;
-
- MAKE_SWAP_METHOD(SemanticTokensClientCapabilities, dynamicRegistration,requests, tokenTypes, tokenModifiers,
- formats, overlappingTokenSupport, multilineTokenSupport)
-
+ optional<std::pair<optional<bool>, optional<lsp::Any>>> full;
+ MAKE_SWAP_METHOD(lsRequests, range, full)
+ };
+
+ lsRequests requests;
+ //
+ // The token types that the client supports.
+ //
+ std::vector<std::string> tokenTypes;
+
+ //
+ // The token modifiers that the client supports.
+ //
+ std::vector<std::string> tokenModifiers;
+ //
+ // The formats the clients supports.
+ //
+ std::vector<std::string> formats;
+ //
+ // Whether the client supports tokens that can overlap each other.
+ //
+ optional<bool> overlappingTokenSupport;
+
+ //
+ // Whether the client supports tokens that can span multiple lines.
+ //
+ optional<bool> multilineTokenSupport;
+
+ MAKE_SWAP_METHOD(
+ SemanticTokensClientCapabilities, dynamicRegistration, requests, tokenTypes, tokenModifiers, formats,
+ overlappingTokenSupport, multilineTokenSupport
+ )
};
-MAKE_REFLECT_STRUCT(SemanticTokensClientCapabilities::lsRequests, range,full)
-MAKE_REFLECT_STRUCT(SemanticTokensClientCapabilities, dynamicRegistration, requests, tokenTypes, tokenModifiers,
- formats, overlappingTokenSupport, multilineTokenSupport)
+MAKE_REFLECT_STRUCT(SemanticTokensClientCapabilities::lsRequests, range, full)
+MAKE_REFLECT_STRUCT(
+ SemanticTokensClientCapabilities, dynamicRegistration, requests, tokenTypes, tokenModifiers, formats,
+ overlappingTokenSupport, multilineTokenSupport
+)
// Text document specific client capabilities.
-struct lsTextDocumentClientCapabilities {
-
- SynchronizationCapabilities synchronization;
-
-
- // Capabilities specific to the `textDocument/completion`
- optional<CompletionCapabilities> completion;
-
-
-
- // Capabilities specific to the `textDocument/hover`
- optional<HoverCapabilities> hover;
-
- // Capabilities specific to the `textDocument/signatureHelp`
- optional<SignatureHelpCapabilities> signatureHelp;
-
- // Capabilities specific to the `textDocument/references`
- optional<DynamicRegistrationCapabilities> references;
-
-
-
-
-
- // Capabilities specific to the `textDocument/documentHighlight`
- optional<DynamicRegistrationCapabilities> documentHighlight;
-
- // Capabilities specific to the `textDocument/documentSymbol`
- optional<DocumentSymbolCapabilities> documentSymbol;
-
- // Capabilities specific to the `textDocument/formatting`
- optional<DynamicRegistrationCapabilities> formatting;
-
- // Capabilities specific to the `textDocument/rangeFormatting`
- optional<DynamicRegistrationCapabilities> rangeFormatting;
-
- // Capabilities specific to the `textDocument/onTypeFormatting`
- optional<DynamicRegistrationCapabilities> onTypeFormatting;
-
-
- //
- // Capabilities specific to the `textDocument/declaration`
- //
- // Since 3.14.0
- //
- optional< DeclarationCapabilities> declaration;
-
-
- typedef DeclarationCapabilities DefinitionCapabilities;
- // Capabilities specific to the `textDocument/definition`
- optional<DefinitionCapabilities> definition;
-
-
-
- //
-// Capabilities specific to the `textDocument/typeDefinition`
-//
-// Since 3.6.0
-//
- typedef DeclarationCapabilities TypeDefinitionCapabilities;
- optional<TypeDefinitionCapabilities> typeDefinition;
-
-
- typedef DeclarationCapabilities ImplementationCapabilities;
- // Capabilities specific to the `textDocument/implementation`
- optional<ImplementationCapabilities> implementation;
-
-
- // Capabilities specific to the `textDocument/codeAction`
- optional<CodeActionCapabilities> codeAction;
-
-
- // Capabilities specific to the `textDocument/codeLens`
- optional<DynamicRegistrationCapabilities> codeLens;
-
- // Capabilities specific to the `textDocument/documentLink`
- optional<DynamicRegistrationCapabilities> documentLink;
-
- //
- // Capabilities specific to the `textDocument/documentColor` and the
- // `textDocument/colorPresentation` request.
- //
- // Since 3.6.0
- //
- optional<DynamicRegistrationCapabilities> colorProvider;
-
- // Capabilities specific to the `textDocument/rename`
- optional<RenameCapabilities> rename;
-
-//
-// Capabilities specific to `textDocument/publishDiagnostics`.
-//
- optional<PublishDiagnosticsClientCapabilities> publishDiagnostics;
-
- //
-// Capabilities specific to `textDocument/foldingRange` requests.
-//
-// Since 3.10.0
-//
- optional< FoldingRangeCapabilities > foldingRange;
-
-
- //
- // Capabilities specific to {@code textDocument/semanticHighlighting}.
- //
- optional< SemanticHighlightingCapabilities > semanticHighlightingCapabilities;
+struct lsTextDocumentClientCapabilities
+{
- //
- // Capabilities specific to {@code textDocument/typeHierarchy}.
- //
- optional< DynamicRegistrationCapabilities > typeHierarchyCapabilities;
+ SynchronizationCapabilities synchronization;
+ // Capabilities specific to the `textDocument/completion`
+ optional<CompletionCapabilities> completion;
+ // Capabilities specific to the `textDocument/hover`
+ optional<HoverCapabilities> hover;
- //
-// Capabilities specific to `textDocument/selectionRange` requests
-//
+ // Capabilities specific to the `textDocument/signatureHelp`
+ optional<SignatureHelpCapabilities> signatureHelp;
+
+ // Capabilities specific to the `textDocument/references`
+ optional<DynamicRegistrationCapabilities> references;
- optional< DynamicRegistrationCapabilities > selectionRange;
-
- //
- // Capabilities specific to the `textDocument/linkedEditingRange` request.
- //
- // @since 3.16.0
- //
- optional< DynamicRegistrationCapabilities > linkedEditingRange;
-
- //
- // Capabilities specific to the various call hierarchy requests.
- //
- // @since 3.16.0
- //
- optional< DynamicRegistrationCapabilities > callHierarchy;
-
- //
- // Capabilities specific to the various semantic token requests.
- //
- // @since 3.16.0
- //
- optional< SemanticTokensClientCapabilities > semanticTokens;
-
- //
- // Capabilities specific to the `textDocument/moniker` request.
- //
- // @since 3.16.0
- //
- optional< DynamicRegistrationCapabilities > moniker;
-
- MAKE_SWAP_METHOD(lsTextDocumentClientCapabilities,
- synchronization,
- completion,
- hover,
- signatureHelp,
- implementation,
- references,
- documentHighlight,
- documentSymbol,
- formatting,
- rangeFormatting,
- onTypeFormatting,
- declaration,
- definition, typeDefinition, implementation,
- codeAction,
- codeLens,
- documentLink, colorProvider,
- rename, publishDiagnostics, foldingRange,
- semanticHighlightingCapabilities, typeHierarchyCapabilities,
- callHierarchy, selectionRange , linkedEditingRange, semanticTokens, moniker)
+ // Capabilities specific to the `textDocument/documentHighlight`
+ optional<DynamicRegistrationCapabilities> documentHighlight;
+
+ // Capabilities specific to the `textDocument/documentSymbol`
+ optional<DocumentSymbolCapabilities> documentSymbol;
+
+ // Capabilities specific to the `textDocument/formatting`
+ optional<DynamicRegistrationCapabilities> formatting;
+
+ // Capabilities specific to the `textDocument/rangeFormatting`
+ optional<DynamicRegistrationCapabilities> rangeFormatting;
+
+ // Capabilities specific to the `textDocument/onTypeFormatting`
+ optional<DynamicRegistrationCapabilities> onTypeFormatting;
+
+ //
+ // Capabilities specific to the `textDocument/declaration`
+ //
+ // Since 3.14.0
+ //
+ optional<DeclarationCapabilities> declaration;
+
+ typedef DeclarationCapabilities DefinitionCapabilities;
+ // Capabilities specific to the `textDocument/definition`
+ optional<DefinitionCapabilities> definition;
+
+ //
+ // Capabilities specific to the `textDocument/typeDefinition`
+ //
+ // Since 3.6.0
+ //
+ typedef DeclarationCapabilities TypeDefinitionCapabilities;
+ optional<TypeDefinitionCapabilities> typeDefinition;
+
+ typedef DeclarationCapabilities ImplementationCapabilities;
+ // Capabilities specific to the `textDocument/implementation`
+ optional<ImplementationCapabilities> implementation;
+
+ // Capabilities specific to the `textDocument/codeAction`
+ optional<CodeActionCapabilities> codeAction;
+
+ // Capabilities specific to the `textDocument/codeLens`
+ optional<DynamicRegistrationCapabilities> codeLens;
+
+ // Capabilities specific to the `textDocument/documentLink`
+ optional<DynamicRegistrationCapabilities> documentLink;
+
+ //
+ // Capabilities specific to the `textDocument/documentColor` and the
+ // `textDocument/colorPresentation` request.
+ //
+ // Since 3.6.0
+ //
+ optional<DynamicRegistrationCapabilities> colorProvider;
+
+ // Capabilities specific to the `textDocument/rename`
+ optional<RenameCapabilities> rename;
+
+ //
+ // Capabilities specific to `textDocument/publishDiagnostics`.
+ //
+ optional<PublishDiagnosticsClientCapabilities> publishDiagnostics;
+
+ //
+ // Capabilities specific to `textDocument/foldingRange` requests.
+ //
+ // Since 3.10.0
+ //
+ optional<FoldingRangeCapabilities> foldingRange;
+
+ //
+ // Capabilities specific to {@code textDocument/semanticHighlighting}.
+ //
+ optional<SemanticHighlightingCapabilities> semanticHighlightingCapabilities;
+
+ //
+ // Capabilities specific to {@code textDocument/typeHierarchy}.
+ //
+ optional<DynamicRegistrationCapabilities> typeHierarchyCapabilities;
+
+ //
+ // Capabilities specific to `textDocument/selectionRange` requests
+ //
+
+ optional<DynamicRegistrationCapabilities> selectionRange;
+
+ //
+ // Capabilities specific to the `textDocument/linkedEditingRange` request.
+ //
+ // @since 3.16.0
+ //
+ optional<DynamicRegistrationCapabilities> linkedEditingRange;
+
+ //
+ // Capabilities specific to the various call hierarchy requests.
+ //
+ // @since 3.16.0
+ //
+ optional<DynamicRegistrationCapabilities> callHierarchy;
+
+ //
+ // Capabilities specific to the various semantic token requests.
+ //
+ // @since 3.16.0
+ //
+ optional<SemanticTokensClientCapabilities> semanticTokens;
+
+ //
+ // Capabilities specific to the `textDocument/moniker` request.
+ //
+ // @since 3.16.0
+ //
+ optional<DynamicRegistrationCapabilities> moniker;
+
+ //
+ // Capabilities specific to the `textDocument/inlayHint` request.
+ //
+ // @since 3.17.0
+ //
+ optional<InlayHintClientCapabilities> inlayHint;
+
+ MAKE_SWAP_METHOD(
+ lsTextDocumentClientCapabilities, synchronization, completion, hover, signatureHelp, implementation, references,
+ documentHighlight, documentSymbol, formatting, rangeFormatting, onTypeFormatting, declaration, definition,
+ typeDefinition, implementation, codeAction, codeLens, documentLink, colorProvider, rename, publishDiagnostics,
+ foldingRange, semanticHighlightingCapabilities, typeHierarchyCapabilities, callHierarchy, selectionRange,
+ linkedEditingRange, semanticTokens, moniker, inlayHint
+ )
};
-
-MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities,
- synchronization,
- completion,
- hover,
- signatureHelp,
- implementation,
- references,
- documentHighlight,
- documentSymbol,
- formatting,
- rangeFormatting,
- onTypeFormatting,
- declaration,
- definition, typeDefinition, implementation,
- codeAction,
- codeLens,
- documentLink, colorProvider,
- rename, publishDiagnostics, foldingRange,
- semanticHighlightingCapabilities, typeHierarchyCapabilities,
- callHierarchy, selectionRange, linkedEditingRange, semanticTokens, moniker)
+MAKE_REFLECT_STRUCT(
+ lsTextDocumentClientCapabilities, synchronization, completion, hover, signatureHelp, implementation, references,
+ documentHighlight, documentSymbol, formatting, rangeFormatting, onTypeFormatting, declaration, definition,
+ typeDefinition, implementation, codeAction, codeLens, documentLink, colorProvider, rename, publishDiagnostics,
+ foldingRange, semanticHighlightingCapabilities, typeHierarchyCapabilities, callHierarchy, selectionRange,
+ linkedEditingRange, semanticTokens, moniker, inlayHint
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h
index 4b48aec414..db3c4efd92 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h
@@ -1,7 +1,6 @@
#pragma once
#include "LibLsp/lsp/method_type.h"
-
#include <stdexcept>
#include "LibLsp/JsonRpc/message.h"
@@ -21,48 +20,49 @@
struct lschangeAnnotationSupport
{
- /**
+ /**
* Whether the client groups edits with equal labels into tree nodes,
* for instance all edits labelled with "Changes in Strings" would
* be a tree node.
*/
- optional<bool> groupsOnLabel;
- MAKE_SWAP_METHOD(lschangeAnnotationSupport, groupsOnLabel)
+ optional<bool> groupsOnLabel;
+ MAKE_SWAP_METHOD(lschangeAnnotationSupport, groupsOnLabel)
};
MAKE_REFLECT_STRUCT(lschangeAnnotationSupport, groupsOnLabel)
-struct WorkspaceEditCapabilities {
- /**
+struct WorkspaceEditCapabilities
+{
+ /**
* The client supports versioned document changes in `WorkspaceEdit`s
*/
- optional<bool> documentChanges;
+ optional<bool> documentChanges;
- /**
+ /**
* The client supports resource changes
* in `WorkspaceEdit`s.
*
* @deprecated Since LSP introduces resource operations, use {link #resourceOperations}
*/
- optional<bool> resourceChanges;
+ optional<bool> resourceChanges;
- /**
+ /**
* The resource operations the client supports. Clients should at least
* support 'create', 'rename' and 'delete' files and folders.
*
* @since 3.13.0
*/
- optional< std::vector<std::string> > resourceOperations;
+ optional<std::vector<std::string>> resourceOperations;
- /**
+ /**
* The failure handling strategy of a client if applying the workspace edit
* fails.
*
* See {@link FailureHandlingKind} for allowed values.
*/
- optional<std::string > failureHandling;
+ optional<std::string> failureHandling;
- /**
+ /**
* Whether the client normalizes line endings to the client specific
* setting.
* If set to `true` the client will normalize line ending characters
@@ -70,187 +70,189 @@ struct WorkspaceEditCapabilities {
*
* @since 3.16.0
*/
- optional<bool> normalizesLineEndings;;
+ optional<bool> normalizesLineEndings;
+ ;
- /**
+ /**
* Whether the client in general supports change annotations on text edits,
* create file, rename file and delete file changes.
*
* @since 3.16.0
*/
- optional<lschangeAnnotationSupport> changeAnnotationSupport;
+ optional<lschangeAnnotationSupport> changeAnnotationSupport;
+
+ MAKE_SWAP_METHOD(
+ WorkspaceEditCapabilities, documentChanges, resourceChanges, resourceOperations, failureHandling,
+ normalizesLineEndings, changeAnnotationSupport
+ )
+};
+MAKE_REFLECT_STRUCT(
+ WorkspaceEditCapabilities, documentChanges, resourceChanges, resourceOperations, failureHandling,
+ normalizesLineEndings, changeAnnotationSupport
+)
- MAKE_SWAP_METHOD(WorkspaceEditCapabilities, documentChanges, resourceChanges, resourceOperations, failureHandling, normalizesLineEndings, changeAnnotationSupport)
+struct DynamicRegistrationCapabilities
+{
+ // Did foo notification supports dynamic registration.
+ optional<bool> dynamicRegistration;
+ MAKE_SWAP_METHOD(DynamicRegistrationCapabilities, dynamicRegistration);
};
-MAKE_REFLECT_STRUCT(WorkspaceEditCapabilities,documentChanges, resourceChanges, resourceOperations, failureHandling, normalizesLineEndings, changeAnnotationSupport)
+MAKE_REFLECT_STRUCT(DynamicRegistrationCapabilities, dynamicRegistration);
-struct DynamicRegistrationCapabilities {
- // Did foo notification supports dynamic registration.
- optional<bool> dynamicRegistration;
+struct InlayHintLazyProperties
+{
+ optional<std::vector<std::string>> properties;
- MAKE_SWAP_METHOD(DynamicRegistrationCapabilities,
- dynamicRegistration);
+ MAKE_SWAP_METHOD(InlayHintLazyProperties, properties)
};
-MAKE_REFLECT_STRUCT(DynamicRegistrationCapabilities,
- dynamicRegistration);
+MAKE_REFLECT_STRUCT(InlayHintLazyProperties, properties)
+struct InlayHintClientCapabilities
+{
+ // Whether inlay hints support dynamic registration.
+ optional<bool> dynamicRegistration;
+ optional<InlayHintLazyProperties> resolveSupport;
+
+ MAKE_SWAP_METHOD(InlayHintClientCapabilities, dynamicRegistration, resolveSupport);
+};
+
+MAKE_REFLECT_STRUCT(InlayHintClientCapabilities, dynamicRegistration, resolveSupport)
// Workspace specific client capabilities.
struct SymbolKindCapabilities
{
- optional< std::vector<lsSymbolKind> > valueSet;
-
- MAKE_SWAP_METHOD(SymbolKindCapabilities, valueSet)
-
+ optional<std::vector<lsSymbolKind>> valueSet;
+ MAKE_SWAP_METHOD(SymbolKindCapabilities, valueSet)
};
MAKE_REFLECT_STRUCT(SymbolKindCapabilities, valueSet)
-
-
-
-struct SymbolCapabilities :public DynamicRegistrationCapabilities {
- /**
+struct SymbolCapabilities : public DynamicRegistrationCapabilities
+{
+ /**
* Specific capabilities for the `SymbolKind` in the `workspace/symbol` request.
*/
- optional<SymbolKindCapabilities> symbolKind;
+ optional<SymbolKindCapabilities> symbolKind;
- MAKE_SWAP_METHOD(SymbolCapabilities,
- symbolKind, dynamicRegistration)
+ MAKE_SWAP_METHOD(SymbolCapabilities, symbolKind, dynamicRegistration)
};
-MAKE_REFLECT_STRUCT(SymbolCapabilities,
- symbolKind, dynamicRegistration)
-
+MAKE_REFLECT_STRUCT(SymbolCapabilities, symbolKind, dynamicRegistration)
struct lsFileOperations
{
- /**
+ /**
* Whether the client supports dynamic registration for file
* requests/notifications.
*/
- optional<bool> dynamicRegistration ;
+ optional<bool> dynamicRegistration;
- /**
+ /**
* The client has support for sending didCreateFiles notifications.
*/
- optional<bool>didCreate ;
+ optional<bool> didCreate;
- /**
+ /**
* The client has support for sending willCreateFiles requests.
*/
- optional<bool>willCreate ;
+ optional<bool> willCreate;
- /**
+ /**
* The client has support for sending didRenameFiles notifications.
*/
- optional<bool>didRename ;
+ optional<bool> didRename;
- /**
+ /**
* The client has support for sending willRenameFiles requests.
*/
- optional<bool>willRename ;
+ optional<bool> willRename;
- /**
+ /**
* The client has support for sending didDeleteFiles notifications.
*/
- optional<bool>didDelete ;
+ optional<bool> didDelete;
- /**
+ /**
* The client has support for sending willDeleteFiles requests.
*/
- optional<bool> willDelete ;
- MAKE_SWAP_METHOD(lsFileOperations, dynamicRegistration, didCreate, willCreate,
- didRename, willRename, didDelete, willDelete)
+ optional<bool> willDelete;
+ MAKE_SWAP_METHOD(
+ lsFileOperations, dynamicRegistration, didCreate, willCreate, didRename, willRename, didDelete, willDelete
+ )
};
-MAKE_REFLECT_STRUCT(lsFileOperations, dynamicRegistration, didCreate, willCreate,
- didRename, willRename, didDelete, willDelete)
-
-struct lsWorkspaceClientCapabilites {
- // The client supports applying batch edits to the workspace.
- optional<bool> applyEdit;
-
-
-
- // Capabilities specific to `WorkspaceEdit`s
- optional<WorkspaceEditCapabilities> workspaceEdit;
-
+MAKE_REFLECT_STRUCT(
+ lsFileOperations, dynamicRegistration, didCreate, willCreate, didRename, willRename, didDelete, willDelete
+)
+struct lsWorkspaceClientCapabilites
+{
+ // The client supports applying batch edits to the workspace.
+ optional<bool> applyEdit;
- // Capabilities specific to the `workspace/didChangeConfiguration`
- // notification.
- optional<DynamicRegistrationCapabilities> didChangeConfiguration;
+ // Capabilities specific to `WorkspaceEdit`s
+ optional<WorkspaceEditCapabilities> workspaceEdit;
- // Capabilities specific to the `workspace/didChangeWatchedFiles`
- // notification.
- optional<DynamicRegistrationCapabilities> didChangeWatchedFiles;
+ // Capabilities specific to the `workspace/didChangeConfiguration`
+ // notification.
+ optional<DynamicRegistrationCapabilities> didChangeConfiguration;
- // Capabilities specific to the `workspace/symbol` request.
- optional<SymbolCapabilities> symbol;
+ // Capabilities specific to the `workspace/didChangeWatchedFiles`
+ // notification.
+ optional<DynamicRegistrationCapabilities> didChangeWatchedFiles;
- // Capabilities specific to the `workspace/executeCommand` request.
- optional<DynamicRegistrationCapabilities> executeCommand;
+ // Capabilities specific to the `workspace/symbol` request.
+ optional<SymbolCapabilities> symbol;
+ // Capabilities specific to the `workspace/executeCommand` request.
+ optional<DynamicRegistrationCapabilities> executeCommand;
- /**
+ /**
* The client has support for workspace folders.
*
* Since 3.6.0
*/
- optional<bool> workspaceFolders;
+ optional<bool> workspaceFolders;
- /**
+ /**
* The client supports `workspace/configuration` requests.
*
* Since 3.6.0
*/
- optional<bool> configuration;
-
+ optional<bool> configuration;
- /**
+ /**
* Capabilities specific to the semantic token requests scoped to the
* workspace.
*
* @since 3.16.0
*/
- optional<DynamicRegistrationCapabilities> semanticTokens ;
+ optional<DynamicRegistrationCapabilities> semanticTokens;
- /**
+ /**
* Capabilities specific to the code lens requests scoped to the
* workspace.
*
* @since 3.16.0
*/
- optional<DynamicRegistrationCapabilities> codeLens ;
+ optional<DynamicRegistrationCapabilities> codeLens;
- /**
+ /**
* The client has support for file requests/notifications.
*
* @since 3.16.0
*/
- optional<lsFileOperations> fileOperations;
-
- MAKE_SWAP_METHOD(lsWorkspaceClientCapabilites,
- applyEdit,
- workspaceEdit,
- didChangeConfiguration,
- didChangeWatchedFiles,
- symbol,executeCommand, workspaceFolders,
- configuration, semanticTokens, codeLens, fileOperations)
-};
-
-MAKE_REFLECT_STRUCT(lsWorkspaceClientCapabilites,
- applyEdit,
- workspaceEdit,
- didChangeConfiguration,
- didChangeWatchedFiles,
- symbol,
- executeCommand,workspaceFolders,
- configuration, semanticTokens, codeLens, fileOperations)
-
-
+ optional<lsFileOperations> fileOperations;
+ MAKE_SWAP_METHOD(
+ lsWorkspaceClientCapabilites, applyEdit, workspaceEdit, didChangeConfiguration, didChangeWatchedFiles, symbol,
+ executeCommand, workspaceFolders, configuration, semanticTokens, codeLens, fileOperations
+ )
+};
+MAKE_REFLECT_STRUCT(
+ lsWorkspaceClientCapabilites, applyEdit, workspaceEdit, didChangeConfiguration, didChangeWatchedFiles, symbol,
+ executeCommand, workspaceFolders, configuration, semanticTokens, codeLens, fileOperations
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/progress.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/progress.h
index d21cfc52f8..536401adef 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/progress.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/progress.h
@@ -6,11 +6,11 @@
//This mechanism can be used to report any kind of progress including work done
//progress(usually used to report progress in the user interface using a progress bar)
//and partial result progress to support streaming of results.
-struct ProgressParams
+struct ProgressParams
{
- std::pair<optional<std::string> , optional<int> > token;
- lsp::Any value;
- MAKE_SWAP_METHOD(ProgressParams, token, value)
+ std::pair<optional<std::string>, optional<int>> token;
+ lsp::Any value;
+ MAKE_SWAP_METHOD(ProgressParams, token, value)
};
MAKE_REFLECT_STRUCT(ProgressParams, token, value)
DEFINE_NOTIFICATION_TYPE(Notify_Progress, ProgressParams, "$/progress");
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/shutdown.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/shutdown.h
index 2571334503..fd8831ef39 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/shutdown.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/general/shutdown.h
@@ -1,6 +1,5 @@
#pragma once
-
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/JsonRpc/RequestInMessage.h"
@@ -12,4 +11,3 @@
*/
DEFINE_REQUEST_RESPONSE_TYPE(td_shutdown, optional<JsonNull>, optional<lsp::Any>, "shutdown");
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/language/language.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/language/language.h
index 96b4b61fa9..ebde0af4b9 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/language/language.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/language/language.h
@@ -10,28 +10,29 @@
#include <ppltasks.h>
#endif
-struct StatusReport {
-
- std::string ToString() const
- {
- std::string info;
- info += "type:" + type + "\n";
- info += "message:" + message + "\n";
- return info;
- }
- /**
+struct StatusReport
+{
+
+ std::string ToString() const
+ {
+ std::string info;
+ info += "type:" + type + "\n";
+ info += "message:" + message + "\n";
+ return info;
+ }
+ /**
* The message type. See {
*
*/
- std::string type;
- /**
+ std::string type;
+ /**
* The actual message
*
*/
- std::string message;
- MAKE_SWAP_METHOD(StatusReport, type, message);
+ std::string message;
+ MAKE_SWAP_METHOD(StatusReport, type, message);
};
MAKE_REFLECT_STRUCT(StatusReport, type, message);
@@ -41,69 +42,65 @@ MAKE_REFLECT_STRUCT(StatusReport, type, message);
*/
DEFINE_NOTIFICATION_TYPE(lang_status, StatusReport, "language/status");
+enum class MessageType
+{
-enum class MessageType {
-
- /**
+ /**
* An error message.
*/
- Error=(1),
+ Error = (1),
- /**
+ /**
* A warning message.
*/
- Warning=(2),
+ Warning = (2),
- /**
+ /**
* An information message.
*/
- Info=(3),
+ Info = (3),
- /**
+ /**
* A log message.
*/
- Log=(4)
+ Log = (4)
};
MAKE_REFLECT_TYPE_PROXY(MessageType);
+struct ActionableNotification
+{
-struct ActionableNotification {
-
-
-
- /**
+ /**
* The message type. See {
*
*/
- MessageType severity;
- /**
+ MessageType severity;
+ /**
* The actual message
*
*/
- std::string message;
+ std::string message;
- /**
+ /**
* Optional data
*
*/
- optional<lsp::Any> data;
+ optional<lsp::Any> data;
-
- /**
+ /**
* Optional commands
*
*/
- std::vector<lsCommandWithAny> commands;
+ std::vector<lsCommandWithAny> commands;
- MAKE_SWAP_METHOD(ActionableNotification, severity, message, data, commands)
+ MAKE_SWAP_METHOD(ActionableNotification, severity, message, data, commands)
};
MAKE_REFLECT_STRUCT(ActionableNotification, severity, message, data, commands)
-
/**
* The actionable notification is sent from a server to a client to ask the
* client to display a particular message in the user interface, and possible
@@ -111,33 +108,26 @@ MAKE_REFLECT_STRUCT(ActionableNotification, severity, message, data, commands)
*/
DEFINE_NOTIFICATION_TYPE(lang_actionableNotification, ActionableNotification, "language/actionableNotification");
+struct ProgressReport
+{
+ std::string ToString() const;
+ std::string id;
-struct ProgressReport {
- std::string ToString() const;
-
- std::string id;
-
-
- std::string task;
-
-
- std::string subTask;
-
-
- std::string status;
+ std::string task;
- int totalWork = 0;
+ std::string subTask;
+ std::string status;
- int workDone = 0;
+ int totalWork = 0;
+ int workDone = 0;
- bool complete = false;
- MAKE_SWAP_METHOD(ProgressReport, id, task, subTask, status, workDone, complete);
+ bool complete = false;
+ MAKE_SWAP_METHOD(ProgressReport, id, task, subTask, status, workDone, complete);
};
-
MAKE_REFLECT_STRUCT(ProgressReport, id, task, subTask, status, workDone, complete);
/**
@@ -146,24 +136,25 @@ MAKE_REFLECT_STRUCT(ProgressReport, id, task, subTask, status, workDone, complet
*/
DEFINE_NOTIFICATION_TYPE(lang_progressReport, ProgressReport, "language/progressReport");
-enum EventType {
- /**
+enum EventType
+{
+ /**
* classpath updated event.
*/
- ClasspathUpdated = (100),
+ ClasspathUpdated = (100),
- /**
+ /**
* projects imported event.
*/
- ProjectsImported = (200)
+ ProjectsImported = (200)
};
struct EventNotification
{
- int eventType;
- lsp::Any data;
- std::string ToString() const;
- MAKE_SWAP_METHOD(EventNotification, eventType, data)
+ int eventType;
+ lsp::Any data;
+ std::string ToString() const;
+ MAKE_SWAP_METHOD(EventNotification, eventType, data)
};
MAKE_REFLECT_STRUCT(EventNotification, eventType, data);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/location_type.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/location_type.h
index f1d8070bf5..d63b2e472e 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/location_type.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/location_type.h
@@ -3,61 +3,60 @@
#include "lsDocumentUri.h"
#include "lsRange.h"
//Represents a location inside a resource, such as a line inside a text file.
-struct lsLocation {
- lsLocation();
- lsLocation(lsDocumentUri uri, lsRange range);
+struct lsLocation
+{
+ lsLocation();
+ lsLocation(lsDocumentUri uri, lsRange range);
- bool operator==(const lsLocation& other) const;
- bool operator<(const lsLocation& o) const;
+ bool operator==(lsLocation const& other) const;
+ bool operator<(lsLocation const& o) const;
- lsDocumentUri uri;
- lsRange range;
- MAKE_SWAP_METHOD(lsLocation, uri, range)
+ lsDocumentUri uri;
+ lsRange range;
+ MAKE_SWAP_METHOD(lsLocation, uri, range)
};
MAKE_REFLECT_STRUCT(lsLocation, uri, range)
-
-
-struct LinkLocation :public lsLocation
+struct LinkLocation : public lsLocation
{
- std::string displayName;
- std::string kind;
- MAKE_REFLECT_STRUCT(LinkLocation, uri, range, displayName, kind)
+ std::string displayName;
+ std::string kind;
+ MAKE_REFLECT_STRUCT(LinkLocation, uri, range, displayName, kind)
};
-MAKE_REFLECT_STRUCT(LinkLocation, uri, range, displayName,kind)
+MAKE_REFLECT_STRUCT(LinkLocation, uri, range, displayName, kind)
//Represents a link between a sourceand a target location.
struct LocationLink
{
- /**
+ /**
* Span of the origin of this link.
*
* Used as the underlined span for mouse interaction. Defaults to the word range at
* the mouse position.
*/
- optional<lsRange> originSelectionRange;
+ optional<lsRange> originSelectionRange;
- /**
+ /**
* The target resource identifier of this link.
*/
- lsDocumentUri targetUri;
+ lsDocumentUri targetUri;
- /**
+ /**
* The full target range of this link. If the target for example is a symbol then target range is the
* range enclosing this symbol not including leading/trailing whitespace but everything else
* like comments. This information is typically used to highlight the range in the editor.
*/
- lsRange targetRange;
+ lsRange targetRange;
- /**
+ /**
* The range that should be selected and revealed when this link is being followed, e.g the name of a function.
* Must be contained by the the `targetRange`. See also `DocumentSymbol#range`
*/
- lsRange targetSelectionRange;
+ lsRange targetSelectionRange;
- MAKE_SWAP_METHOD(LocationLink, originSelectionRange, targetUri, targetRange, targetSelectionRange);
+ MAKE_SWAP_METHOD(LocationLink, originSelectionRange, targetUri, targetRange, targetSelectionRange);
};
MAKE_REFLECT_STRUCT(LocationLink, originSelectionRange, targetUri, targetRange, targetSelectionRange);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lru_cache.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lru_cache.h
index f33bc5627a..c9424918d7 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lru_cache.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lru_cache.h
@@ -8,144 +8,180 @@
// Cache that evicts old entries which have not been used recently. Implemented
// using array/linear search so this works well for small array sizes.
-template <typename TKey, typename TValue>
-struct LruCache {
- explicit LruCache(int max_entries);
-
- // Fetches an entry for |key|. If it does not exist, |allocator| will be
- // invoked to create one.
- template <typename TAllocator>
- TValue Get(const TKey& key, TAllocator allocator);
- // Returns true if there is an entry for |key|.
- bool Has(const TKey& key);
- // Fetches the entry for |filename| and updates it's usage so it is less
- // likely to be evicted.
- bool TryGet(const TKey& key, TValue* dest);
- // TryGetEntry, except the entry is removed from the cache.
- bool TryTake(const TKey& key, TValue* dest);
- // Inserts an entry. Evicts the oldest unused entry if there is no space.
- void Insert(const TKey& key, const TValue& value);
-
- // Call |func| on existing entries. If |func| returns false iteration
- // terminates early.
- template <typename TFunc>
- void IterateValues(TFunc func);
-
- // Empties the cache
- void Clear(void);
-
- private:
- // There is a global score counter, when we access an element we increase
- // its score to the current global value, so it has the highest overall
- // score. This means that the oldest/least recently accessed value has the
- // lowest score.
- //
- // There is a bit of special logic to handle score overlow.
- struct Entry {
- uint32_t score = 0;
- TKey key;
- TValue value;
- bool operator<(const Entry& other) const { return score < other.score; }
- };
-
- void IncrementScore();
-
- std::vector<Entry> entries_;
- int max_entries_ = 1;
- uint32_t next_score_ = 0;
+template<typename TKey, typename TValue>
+struct LruCache
+{
+ explicit LruCache(int max_entries);
+
+ // Fetches an entry for |key|. If it does not exist, |allocator| will be
+ // invoked to create one.
+ template<typename TAllocator>
+ TValue Get(TKey const& key, TAllocator allocator);
+ // Returns true if there is an entry for |key|.
+ bool Has(TKey const& key);
+ // Fetches the entry for |filename| and updates it's usage so it is less
+ // likely to be evicted.
+ bool TryGet(TKey const& key, TValue* dest);
+ // TryGetEntry, except the entry is removed from the cache.
+ bool TryTake(TKey const& key, TValue* dest);
+ // Inserts an entry. Evicts the oldest unused entry if there is no space.
+ void Insert(TKey const& key, TValue const& value);
+
+ // Call |func| on existing entries. If |func| returns false iteration
+ // terminates early.
+ template<typename TFunc>
+ void IterateValues(TFunc func);
+
+ // Empties the cache
+ void Clear(void);
+
+private:
+ // There is a global score counter, when we access an element we increase
+ // its score to the current global value, so it has the highest overall
+ // score. This means that the oldest/least recently accessed value has the
+ // lowest score.
+ //
+ // There is a bit of special logic to handle score overlow.
+ struct Entry
+ {
+ uint32_t score = 0;
+ TKey key;
+ TValue value;
+ bool operator<(Entry const& other) const
+ {
+ return score < other.score;
+ }
+ };
+
+ void IncrementScore();
+
+ std::vector<Entry> entries_;
+ int max_entries_ = 1;
+ uint32_t next_score_ = 0;
};
-template <typename TKey, typename TValue>
-LruCache<TKey, TValue>::LruCache(int max_entries) : max_entries_(max_entries) {
- assert(max_entries > 0);
+template<typename TKey, typename TValue>
+LruCache<TKey, TValue>::LruCache(int max_entries) : max_entries_(max_entries)
+{
+ assert(max_entries > 0);
}
-template <typename TKey, typename TValue>
-template <typename TAllocator>
-TValue LruCache<TKey, TValue>::Get(const TKey& key, TAllocator allocator) {
- for (Entry& entry : entries_) {
- if (entry.key == key)
- return entry.value;
- }
-
- auto result = allocator();
- Insert(key, result);
- return result;
+template<typename TKey, typename TValue>
+template<typename TAllocator>
+TValue LruCache<TKey, TValue>::Get(TKey const& key, TAllocator allocator)
+{
+ for (Entry& entry : entries_)
+ {
+ if (entry.key == key)
+ {
+ return entry.value;
+ }
+ }
+
+ auto result = allocator();
+ Insert(key, result);
+ return result;
}
-template <typename TKey, typename TValue>
-bool LruCache<TKey, TValue>::Has(const TKey& key) {
- for (Entry& entry : entries_) {
- if (entry.key == key)
- return true;
- }
- return false;
+template<typename TKey, typename TValue>
+bool LruCache<TKey, TValue>::Has(TKey const& key)
+{
+ for (Entry& entry : entries_)
+ {
+ if (entry.key == key)
+ {
+ return true;
+ }
+ }
+ return false;
}
-template <typename TKey, typename TValue>
-bool LruCache<TKey, TValue>::TryGet(const TKey& key, TValue* dest) {
- // Assign new score.
- for (Entry& entry : entries_) {
- if (entry.key == key) {
- entry.score = next_score_;
- IncrementScore();
- if (dest)
- *dest = entry.value;
- return true;
+template<typename TKey, typename TValue>
+bool LruCache<TKey, TValue>::TryGet(TKey const& key, TValue* dest)
+{
+ // Assign new score.
+ for (Entry& entry : entries_)
+ {
+ if (entry.key == key)
+ {
+ entry.score = next_score_;
+ IncrementScore();
+ if (dest)
+ {
+ *dest = entry.value;
+ }
+ return true;
+ }
}
- }
- return false;
+ return false;
}
-template <typename TKey, typename TValue>
-bool LruCache<TKey, TValue>::TryTake(const TKey& key, TValue* dest) {
- for (size_t i = 0; i < entries_.size(); ++i) {
- if (entries_[i].key == key) {
- if (dest)
- *dest = entries_[i].value;
- entries_.erase(entries_.begin() + i);
- return true;
+template<typename TKey, typename TValue>
+bool LruCache<TKey, TValue>::TryTake(TKey const& key, TValue* dest)
+{
+ for (size_t i = 0; i < entries_.size(); ++i)
+ {
+ if (entries_[i].key == key)
+ {
+ if (dest)
+ {
+ *dest = entries_[i].value;
+ }
+ entries_.erase(entries_.begin() + i);
+ return true;
+ }
}
- }
- return false;
+ return false;
}
-template <typename TKey, typename TValue>
-void LruCache<TKey, TValue>::Insert(const TKey& key, const TValue& value) {
- if ((int)entries_.size() >= max_entries_)
- entries_.erase(std::min_element(entries_.begin(), entries_.end()));
-
- Entry entry;
- entry.score = next_score_;
- IncrementScore();
- entry.key = key;
- entry.value = value;
- entries_.push_back(entry);
-}
+template<typename TKey, typename TValue>
+void LruCache<TKey, TValue>::Insert(TKey const& key, TValue const& value)
+{
+ if ((int)entries_.size() >= max_entries_)
+ {
+ entries_.erase(std::min_element(entries_.begin(), entries_.end()));
+ }
-template <typename TKey, typename TValue>
-template <typename TFunc>
-void LruCache<TKey, TValue>::IterateValues(TFunc func) {
- for (Entry& entry : entries_) {
- if (!func(entry.value))
- break;
- }
+ Entry entry;
+ entry.score = next_score_;
+ IncrementScore();
+ entry.key = key;
+ entry.value = value;
+ entries_.push_back(entry);
}
-template <typename TKey, typename TValue>
-void LruCache<TKey, TValue>::IncrementScore() {
- // Overflow.
- if (++next_score_ == 0) {
- std::sort(entries_.begin(), entries_.end());
+template<typename TKey, typename TValue>
+template<typename TFunc>
+void LruCache<TKey, TValue>::IterateValues(TFunc func)
+{
for (Entry& entry : entries_)
- entry.score = next_score_++;
- }
+ {
+ if (!func(entry.value))
+ {
+ break;
+ }
+ }
+}
+
+template<typename TKey, typename TValue>
+void LruCache<TKey, TValue>::IncrementScore()
+{
+ // Overflow.
+ if (++next_score_ == 0)
+ {
+ std::sort(entries_.begin(), entries_.end());
+ for (Entry& entry : entries_)
+ {
+ entry.score = next_score_++;
+ }
+ }
}
-template <typename TKey, typename TValue>
-void LruCache<TKey, TValue>::Clear(void) {
- entries_.clear();
- next_score_ = 0;
+template<typename TKey, typename TValue>
+void LruCache<TKey, TValue>::Clear(void)
+{
+ entries_.clear();
+ next_score_ = 0;
}
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsAny.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsAny.h
index 49a917e4f6..880bf7cb82 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsAny.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsAny.h
@@ -5,45 +5,44 @@
#include "LibLsp/JsonRpc/message.h"
namespace lsp
{
- struct Any
- {
- //! Type of JSON value
- enum Type {
- kUnKnown=-1,
- kNullType = 0, //!< null
- kFalseType = 1, //!< false
- kTrueType = 2, //!< true
- kObjectType = 3, //!< object
- kArrayType = 4, //!< array
- kStringType = 5, //!< string
- kNumberType = 6 //!< number
- };
-
-
+struct Any
+{
+ //! Type of JSON value
+ enum Type
+ {
+ kUnKnown = -1,
+ kNullType = 0, //!< null
+ kFalseType = 1, //!< false
+ kTrueType = 2, //!< true
+ kObjectType = 3, //!< object
+ kArrayType = 4, //!< array
+ kStringType = 5, //!< string
+ kNumberType = 6 //!< number
+ };
- template <typename T>
- bool Get(T& value);
+ template<typename T>
+ bool Get(T& value);
- template <typename T>
- void Set(T& value);
+ template<typename T>
+ void Set(T& value);
- int GuessType();
- int GetType();
+ int GuessType();
+ int GetType();
- void Set(std::unique_ptr<LspMessage> value);
+ void Set(std::unique_ptr<LspMessage> value);
- void SetJsonString(std::string&& _data, Type _type);
+ void SetJsonString(std::string&& _data, Type _type);
- void SetJsonString(const std::string& _data, Type _type);
+ void SetJsonString(std::string const& _data, Type _type);
- const std::string& Data()const
- {
- return data;
- }
+ std::string const& Data() const
+ {
+ return data;
+ }
- void swap(Any& arg) noexcept;
+ void swap(Any& arg) noexcept;
- /*
+ /*
*Example for GetFromMap
struct A{
std::string visitor;
@@ -57,103 +56,103 @@ namespace lsp
A a_object;
any.GetFromMap(a_object);
*/
- template <typename T>
- bool GetFromMap(T& value);
-
-
- template <typename T>
- bool GetForMapHelper(T& value);
- bool GetForMapHelper(std::string& value);
- bool GetForMapHelper(optional<std::string>& value);
- private:
- std::unique_ptr<Reader> GetReader();
- std::unique_ptr<Writer> GetWriter() const;
- void SetData(std::unique_ptr<Writer>&);
+ template<typename T>
+ bool GetFromMap(T& value);
- std::string data;
- int jsonType = kUnKnown;
+ template<typename T>
+ bool GetForMapHelper(T& value);
+ bool GetForMapHelper(std::string& value);
+ bool GetForMapHelper(optional<std::string>& value);
- };
+private:
+ std::unique_ptr<Reader> GetReader();
+ std::unique_ptr<Writer> GetWriter() const;
+ void SetData(std::unique_ptr<Writer>&);
+ std::string data;
+ int jsonType = kUnKnown;
};
+}; // namespace lsp
extern void Reflect(Reader& visitor, lsp::Any& value);
-extern void Reflect(Writer& visitor, lsp::Any& value);
+extern void Reflect(Writer& visitor, lsp::Any& value);
-template <typename T>
-void ReflectMember(std::map < std::string, lsp::Any>& visitor, const char* name, T& value) {
+template<typename T>
+void ReflectMember(std::map<std::string, lsp::Any>& visitor, char const* name, T& value)
+{
- auto it = visitor.find(name);
- if (it != visitor.end())
- {
- it->second.GetForMapHelper(value);
- }
-}
-template <typename T>
-void ReflectMember(std::map < std::string, std::string>& visitor, const char* name, T& value) {
-
- auto it = visitor.find(name);
- if (it != visitor.end())
- {
- lsp::Any any;
- any.SetJsonString(it->second, static_cast<lsp::Any::Type>(-1));
- any.Get(value);
- }
+ auto it = visitor.find(name);
+ if (it != visitor.end())
+ {
+ it->second.GetForMapHelper(value);
+ }
}
+template<typename T>
+void ReflectMember(std::map<std::string, std::string>& visitor, char const* name, T& value)
+{
-#define REFLECT_MAP_TO_STRUCT(type, ...) \
- template <typename TVisitor> \
- void ReflectMap(TVisitor& visitor, type& value) { \
- MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \
- }
+ auto it = visitor.find(name);
+ if (it != visitor.end())
+ {
+ lsp::Any any;
+ any.SetJsonString(it->second, static_cast<lsp::Any::Type>(-1));
+ any.Get(value);
+ }
+}
+#define REFLECT_MAP_TO_STRUCT(type, ...) \
+ template<typename TVisitor> \
+ void ReflectMap(TVisitor& visitor, type& value) \
+ { \
+ MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \
+ }
namespace lsp
{
- template <typename T>
- bool Any::Get(T& value)
- {
- const auto visitor = GetReader();
- Reflect(*visitor, value);
- return true;
- }
-
- template <typename T>
- void Any::Set(T& value)
- {
- auto visitor = GetWriter();
- Reflect(*visitor, value);
- SetData(visitor);
- }
-
- template <typename T>
- bool Any::GetFromMap(T& value)
- {
- const auto visitor = GetReader();
- std::map < std::string, lsp::Any> _temp;
- Reflect(*visitor, _temp);
- ReflectMap(_temp, value);
- return true;
- }
-
- template <typename T>
- bool Any::GetForMapHelper(T& value)
- {
- jsonType = GetType();
- if (jsonType == kStringType)
- {
- auto copy = data;
- copy.erase(copy.find_last_not_of('"') + 1);
- copy.erase(0, copy.find_first_not_of('"'));
- lsp::Any any;
- any.SetJsonString(copy, kUnKnown);
- any.Get(value);
- }
- else
- {
- Get(value);
- }
- return true;
- }
+template<typename T>
+bool Any::Get(T& value)
+{
+ auto const visitor = GetReader();
+ Reflect(*visitor, value);
+ return true;
+}
+
+template<typename T>
+void Any::Set(T& value)
+{
+ auto visitor = GetWriter();
+ Reflect(*visitor, value);
+ SetData(visitor);
+}
+
+template<typename T>
+bool Any::GetFromMap(T& value)
+{
+ auto const visitor = GetReader();
+ std::map<std::string, lsp::Any> _temp;
+ Reflect(*visitor, _temp);
+ ReflectMap(_temp, value);
+ return true;
+}
+
+template<typename T>
+bool Any::GetForMapHelper(T& value)
+{
+ jsonType = GetType();
+ if (jsonType == kStringType)
+ {
+ auto copy = data;
+ copy.erase(copy.find_last_not_of('"') + 1);
+ copy.erase(0, copy.find_first_not_of('"'));
+ lsp::Any any;
+ any.SetJsonString(copy, kUnKnown);
+ any.Get(value);
+ }
+ else
+ {
+ Get(value);
+ }
+ return true;
}
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsCodeAction.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsCodeAction.h
index 1b398cae2b..4ba18a6667 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsCodeAction.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsCodeAction.h
@@ -2,8 +2,6 @@
#include "LibLsp/JsonRpc/serializer.h"
-
-
#include <string>
#include <vector>
#include "lsPosition.h"
@@ -13,46 +11,44 @@
struct CodeAction
{
- /**
+ /**
* A short, human-readable, title for this code action.
*/
- std::string title;
+ std::string title;
- /**
+ /**
* The kind of the code action.
*
* Used to filter code actions.
*/
- optional < std::string> kind;
+ optional<std::string> kind;
- /**
+ /**
* The diagnostics that this code action resolves.
*/
- optional < std::vector<lsDiagnostic>> diagnostics;
+ optional<std::vector<lsDiagnostic>> diagnostics;
- /**
+ /**
* The workspace edit this code action performs.
*/
- optional < lsWorkspaceEdit >edit;
+ optional<lsWorkspaceEdit> edit;
- /**
+ /**
* A command this code action executes. If a code action
* provides a edit and a command, first the edit is
* executed and then the command.
*/
- optional< lsCommandWithAny > command;
+ optional<lsCommandWithAny> command;
- MAKE_SWAP_METHOD(CodeAction, title, kind, diagnostics, edit, command)
+ MAKE_SWAP_METHOD(CodeAction, title, kind, diagnostics, edit, command)
};
MAKE_REFLECT_STRUCT(CodeAction, title, kind, diagnostics, edit, command)
struct TextDocumentCodeAction
{
- typedef std::pair<optional<lsCommandWithAny>, optional<CodeAction> > Either;
-
+ typedef std::pair<optional<lsCommandWithAny>, optional<CodeAction>> Either;
};
-
-extern void Reflect(Reader& visitor, TextDocumentCodeAction::Either& value);
+extern void Reflect(Reader& visitor, TextDocumentCodeAction::Either& value);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsCommand.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsCommand.h
index 2d624c3d99..826c7abe44 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsCommand.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsCommand.h
@@ -2,8 +2,6 @@
#include "LibLsp/JsonRpc/serializer.h"
-
-
#include <string>
#include <vector>
#include "lsAny.h"
@@ -12,33 +10,34 @@
//Commands are identified by a string identifier.
//The recommended way to handle commands is to implement their execution on the server side
//if the clientand server provides the corresponding capabilities.Alternatively the tool
-//extension code could handle the command.The protocol currently doesn¡¯t specify a set of well - known commands.
-template <typename AnyArray>
-struct lsCommand {
- // Title of the command (ie, 'save')
- std::string title;
- // Actual command identifier.
- std::string command;
- // Arguments to run the command with.
- // **NOTE** This must be serialized as an array. Use
- // MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY.
- optional<AnyArray> arguments;
+//extension code could handle the command.The protocol currently doesn't specify a set of well - known commands.
+template<typename AnyArray>
+struct lsCommand
+{
+ // Title of the command (ie, 'save')
+ std::string title;
+ // Actual command identifier.
+ std::string command;
+ // Arguments to run the command with.
+ // **NOTE** This must be serialized as an array. Use
+ // MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY.
+ optional<AnyArray> arguments;
- void swap(lsCommand<AnyArray>& arg) noexcept
- {
- title.swap(arg.title);
- command.swap(arg.command);
- arguments.swap(arg.arguments);
- }
+ void swap(lsCommand<AnyArray>& arg) noexcept
+ {
+ title.swap(arg.title);
+ command.swap(arg.command);
+ arguments.swap(arg.arguments);
+ }
};
-template <typename TVisitor, typename T>
-void Reflect(TVisitor& visitor, lsCommand<T>& value) {
- REFLECT_MEMBER_START();
- REFLECT_MEMBER(title);
- REFLECT_MEMBER(command);
- REFLECT_MEMBER(arguments);
- REFLECT_MEMBER_END();
+template<typename TVisitor, typename T>
+void Reflect(TVisitor& visitor, lsCommand<T>& value)
+{
+ REFLECT_MEMBER_START();
+ REFLECT_MEMBER(title);
+ REFLECT_MEMBER(command);
+ REFLECT_MEMBER(arguments);
+ REFLECT_MEMBER_END();
}
-
-using lsCommandWithAny = lsCommand< std::vector<lsp::Any>>;
+using lsCommandWithAny = lsCommand<std::vector<lsp::Any>>;
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsDocumentUri.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsDocumentUri.h
index 255c4c39ba..d47e7ac2b3 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsDocumentUri.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsDocumentUri.h
@@ -1,26 +1,27 @@
#pragma once
#include "LibLsp/JsonRpc/serializer.h"
#include <string>
-struct lsDocumentUri {
- static lsDocumentUri FromPath(const AbsolutePath& path);
+struct lsDocumentUri
+{
+ static lsDocumentUri FromPath(AbsolutePath const& path);
- lsDocumentUri();
+ lsDocumentUri();
- lsDocumentUri(const AbsolutePath& path);
- lsDocumentUri(const lsDocumentUri& other);;
- bool operator==(const lsDocumentUri& other) const;
- bool operator==(const std::string& other) const;
- void SetPath(const AbsolutePath& path);
- std::string GetRawPath() const;
- AbsolutePath GetAbsolutePath() const;
+ lsDocumentUri(AbsolutePath const& path);
+ lsDocumentUri(lsDocumentUri const& other);
+ ;
+ bool operator==(lsDocumentUri const& other) const;
+ bool operator==(std::string const& other) const;
+ void SetPath(AbsolutePath const& path);
+ std::string GetRawPath() const;
+ AbsolutePath GetAbsolutePath() const;
-
- std::string raw_uri_;
- void swap(lsDocumentUri& arg) noexcept
- {
- raw_uri_.swap(arg.raw_uri_);
- }
+ std::string raw_uri_;
+ void swap(lsDocumentUri& arg) noexcept
+ {
+ raw_uri_.swap(arg.raw_uri_);
+ }
};
extern void Reflect(Writer& visitor, lsDocumentUri& value);
extern void Reflect(Reader& visitor, lsDocumentUri& value);
-extern std::string make_file_scheme_uri(const std::string& absolute_path);
+extern std::string make_file_scheme_uri(std::string const& absolute_path);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsFormattingOptions.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsFormattingOptions.h
index 0c3999896b..25ebd13e35 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsFormattingOptions.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsFormattingOptions.h
@@ -2,42 +2,48 @@
#include "LibLsp/JsonRpc/serializer.h"
-struct lsFormattingOptions {
- struct KeyData {
- optional<bool> _boolean;
- optional<int32_t> _integer;
- optional<std::string> _string;
- };
+struct lsFormattingOptions
+{
+ struct KeyData
+ {
+ optional<bool> _boolean;
+ optional<int32_t> _integer;
+ optional<std::string> _string;
+ };
- // Size of a tab in spaces.
- int tabSize =4;
- // Prefer spaces over tabs.
- bool insertSpaces = true;
+ // Size of a tab in spaces.
+ int tabSize = 4;
+ // Prefer spaces over tabs.
+ bool insertSpaces = true;
- /**
+ /**
* Trim trailing whitespace on a line.
*
* @since 3.15.0
*/
- optional<bool> trimTrailingWhitespace;
+ optional<bool> trimTrailingWhitespace;
- /**
+ /**
* Insert a newline character at the end of the file if one does not exist.
*
* @since 3.15.0
*/
- optional<bool> insertFinalNewline;
+ optional<bool> insertFinalNewline;
- /**
+ /**
* Trim all newlines after the final newline at the end of the file.
*
* @since 3.15.0
*/
- optional<bool> trimFinalNewlines;
- optional<KeyData> key;
- MAKE_SWAP_METHOD(lsFormattingOptions, tabSize, insertSpaces, trimTrailingWhitespace, insertFinalNewline, trimFinalNewlines, key)
+ optional<bool> trimFinalNewlines;
+ optional<KeyData> key;
+ MAKE_SWAP_METHOD(
+ lsFormattingOptions, tabSize, insertSpaces, trimTrailingWhitespace, insertFinalNewline, trimFinalNewlines, key
+ )
};
-MAKE_REFLECT_STRUCT(lsFormattingOptions, tabSize, insertSpaces, trimTrailingWhitespace, insertFinalNewline, trimFinalNewlines, key);
+MAKE_REFLECT_STRUCT(
+ lsFormattingOptions, tabSize, insertSpaces, trimTrailingWhitespace, insertFinalNewline, trimFinalNewlines, key
+);
extern void Reflect(Reader& visitor, lsFormattingOptions::KeyData& value);
-extern void Reflect(Writer& visitor, lsFormattingOptions::KeyData& value);
+extern void Reflect(Writer& visitor, lsFormattingOptions::KeyData& value);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsMarkedString.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsMarkedString.h
index 8478c055c5..45381e8e2d 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsMarkedString.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsMarkedString.h
@@ -5,7 +5,6 @@
#include <string>
#include <vector>
-
// MarkedString can be used to render human readable text. It is either a
// markdown string or a code-block that provides a language and a code snippet.
// The language identifier is sematically equal to the optional language
@@ -19,27 +18,29 @@
//
// Note that markdown strings will be sanitized - that means html will be
// escaped.
-struct lsMarkedString {
- optional<std::string> language;
- std::string value;
+struct lsMarkedString
+{
+ optional<std::string> language;
+ std::string value;
};
-struct MarkupContent {
- /**
+struct MarkupContent
+{
+ /**
* The type of the Markup.
*/
- std::string kind;
+ std::string kind;
- /**
+ /**
* The content itself.
*/
- std::string value;
+ std::string value;
- MAKE_SWAP_METHOD(MarkupContent, kind, value);
+ MAKE_SWAP_METHOD(MarkupContent, kind, value);
};
-MAKE_REFLECT_STRUCT(MarkupContent,kind,value);
+MAKE_REFLECT_STRUCT(MarkupContent, kind, value);
void Reflect(Writer& visitor, lsMarkedString& value);
void Reflect(Reader& visitor, lsMarkedString& value);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsPosition.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsPosition.h
index a14d75ed90..608ab01f15 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsPosition.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsPosition.h
@@ -2,29 +2,28 @@
#include "LibLsp/JsonRpc/serializer.h"
-
-
#include <string>
#include <vector>
//Position in a text document expressed as zero - based line and zero - based character offset.
-//A position is between two characters like an ¡®insert¡¯ cursor in a editor.Special values like
+//A position is between two characters like an insert cursor in a editor.Special values like
//for example - 1 to denote the end of a line are not supported.
-struct lsPosition {
- lsPosition();
- lsPosition(int line, int character);
+struct lsPosition
+{
+ lsPosition();
+ lsPosition(int line, int character);
- bool operator==(const lsPosition& other) const;
- bool operator<(const lsPosition& other) const;
+ bool operator==(lsPosition const& other) const;
+ bool operator<(lsPosition const& other) const;
- std::string ToString() const;
+ std::string ToString() const;
- /**
+ /**
* Line position in a document (zero-based).
*/
- // Note: these are 0-based.
- unsigned line = 0;
- /**
+ // Note: these are 0-based.
+ unsigned line = 0;
+ /**
* Character offset on a line in a document (zero-based). Assuming that
* the line is represented as a string, the `character` value represents
* the gap between the `character` and `character + 1`.
@@ -32,9 +31,9 @@ struct lsPosition {
* If the character value is greater than the line length it defaults back
* to the line length.
*/
- unsigned character = 0;
- static const lsPosition kZeroPosition;
+ unsigned character = 0;
+ static lsPosition const kZeroPosition;
- MAKE_SWAP_METHOD(lsPosition, line, character)
+ MAKE_SWAP_METHOD(lsPosition, line, character)
};
MAKE_REFLECT_STRUCT(lsPosition, line, character);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsRange.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsRange.h
index 97d78712d7..ff1715761b 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsRange.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsRange.h
@@ -2,8 +2,6 @@
#include "LibLsp/JsonRpc/serializer.h"
-
-
#include <string>
#include <vector>
#include "lsPosition.h"
@@ -11,22 +9,23 @@
//A range is comparable to a selection in an editor.Therefore the end position is exclusive.
//If you want to specify a range that contains a line including the line ending character(s)
//then use an end position denoting the start of the next line.
-struct lsRange {
- lsRange();
- lsRange(lsPosition start, lsPosition end);
+struct lsRange
+{
+ lsRange();
+ lsRange(lsPosition start, lsPosition end);
- bool operator==(const lsRange& other) const;
- bool operator<(const lsRange& other) const;
- /**
+ bool operator==(lsRange const& other) const;
+ bool operator<(lsRange const& other) const;
+ /**
* The range's start position.
*/
- lsPosition start;
- /**
+ lsPosition start;
+ /**
* The range's end position.
*/
- lsPosition end;
- std::string ToString()const;
- MAKE_SWAP_METHOD(lsRange, start, end)
+ lsPosition end;
+ std::string ToString() const;
+ MAKE_SWAP_METHOD(lsRange, start, end)
};
MAKE_REFLECT_STRUCT(lsRange, start, end)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsResponseError.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsResponseError.h
index 254e76f757..9ebe804cef 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsResponseError.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsResponseError.h
@@ -4,15 +4,16 @@
#include <sstream>
#include "LibLsp/lsp/lsAny.h"
-enum class lsErrorCodes:int32_t {
- // Defined by JSON RPC
- ParseError = -32700,
- InvalidRequest = -32600,
- MethodNotFound = -32601,
- InvalidParams = -32602,
- InternalError = -32603,
-
- /**
+enum class lsErrorCodes : int32_t
+{
+ // Defined by JSON RPC
+ ParseError = -32700,
+ InvalidRequest = -32600,
+ MethodNotFound = -32601,
+ InvalidParams = -32602,
+ InternalError = -32603,
+
+ /**
* This is the start range of JSON RPC reserved error codes.
* It doesn't denote a real error code. No LSP error codes should
* be defined between the start and end range. For backwards
@@ -21,45 +22,45 @@ enum class lsErrorCodes:int32_t {
*
* @since 3.16.0
*/
- jsonrpcReservedErrorRangeStart = -32099,
- /** @deprecated use jsonrpcReservedErrorRangeStart */
- serverErrorStart = jsonrpcReservedErrorRangeStart,
+ jsonrpcReservedErrorRangeStart = -32099,
+ /** @deprecated use jsonrpcReservedErrorRangeStart */
+ serverErrorStart = jsonrpcReservedErrorRangeStart,
- /**
+ /**
* This is the start range of JSON RPC reserved error codes.
* It doesn't denote a real error code.
*
* @since 3.16.0
*/
- jsonrpcReservedErrorRangeEnd = -32000,
- /** @deprecated use jsonrpcReservedErrorRangeEnd */
- serverErrorEnd = jsonrpcReservedErrorRangeEnd,
+ jsonrpcReservedErrorRangeEnd = -32000,
+ /** @deprecated use jsonrpcReservedErrorRangeEnd */
+ serverErrorEnd = jsonrpcReservedErrorRangeEnd,
- /**
+ /**
* Error code indicating that a server received a notification or
* request before the server has received the `initialize` request.
*/
- ServerNotInitialized = -32002,
- UnknownErrorCode = -32001,
+ ServerNotInitialized = -32002,
+ UnknownErrorCode = -32001,
- /**
+ /**
* This is the start range of LSP reserved error codes.
* It doesn't denote a real error code.
*
* @since 3.16.0
*/
- lspReservedErrorRangeStart= -32899,
+ lspReservedErrorRangeStart = -32899,
- /**
+ /**
* The server cancelled the request. This error code should
* only be used for requests that explicitly support being
* server cancellable.
*
* @since 3.17.0
*/
- ServerCancelled = -32802,
+ ServerCancelled = -32802,
- /**
+ /**
* The server detected that the content of a document got
* modified outside normal conditions. A server should
* NOT send this error code if it detects a content change
@@ -69,49 +70,47 @@ enum class lsErrorCodes:int32_t {
* If a client decides that a result is not of any use anymore
* the client should cancel the request.
*/
- ContentModified = -32801,
+ ContentModified = -32801,
- /**
+ /**
* The client has canceled a request and a server as detected
* the cancel.
*/
- RequestCancelled = -32800,
+ RequestCancelled = -32800,
- /**
+ /**
* This is the end range of LSP reserved error codes.
* It doesn't denote a real error code.
*
* @since 3.16.0
*/
- lspReservedErrorRangeEnd = -32800,
-
-
-
+ lspReservedErrorRangeEnd = -32800,
};
MAKE_REFLECT_TYPE_PROXY(lsErrorCodes);
-struct lsResponseError {
- lsResponseError(): code(lsErrorCodes::UnknownErrorCode)
- {
- }
+struct lsResponseError
+{
+ lsResponseError() : code(lsErrorCodes::UnknownErrorCode)
+ {
+ }
- /**
+ /**
* A number indicating the error type that occurred.
*/
- lsErrorCodes code;
- // Short description.
- /**
+ lsErrorCodes code;
+ // Short description.
+ /**
* A string providing a short description of the error.
*/
- std::string message;
+ std::string message;
- /**
+ /**
* A primitive or structured value that contains additional
* information about the error. Can be omitted.
*/
- optional<lsp::Any> data;
- std::string ToString();
- void Write(Writer& visitor);
+ optional<lsp::Any> data;
+ std::string ToString();
+ void Write(Writer& visitor);
- MAKE_SWAP_METHOD(lsResponseError, code, message, data)
+ MAKE_SWAP_METHOD(lsResponseError, code, message, data)
};
MAKE_REFLECT_STRUCT(lsResponseError, code, message, data)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentEdit.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentEdit.h
index bebbcd48c2..bf614e39fc 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentEdit.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentEdit.h
@@ -6,19 +6,19 @@
#include "lsVersionedTextDocumentIdentifier.h"
#include "lsTextEdit.h"
+struct lsTextDocumentEdit
+{
+ // The text document to change.
+ lsVersionedTextDocumentIdentifier textDocument;
-struct lsTextDocumentEdit {
- // The text document to change.
- lsVersionedTextDocumentIdentifier textDocument;
-
- /**
+ /**
* The edits to be applied.
*
* @since 3.16.0 - support for AnnotatedTextEdit. This is guarded by the
* client capability `workspace.workspaceEdit.changeAnnotationSupport`
*/
- // The edits to be applied.
- std::vector< lsAnnotatedTextEdit > edits;
- MAKE_SWAP_METHOD(lsTextDocumentEdit, textDocument, edits);
+ // The edits to be applied.
+ std::vector<lsAnnotatedTextEdit> edits;
+ MAKE_SWAP_METHOD(lsTextDocumentEdit, textDocument, edits);
};
MAKE_REFLECT_STRUCT(lsTextDocumentEdit, textDocument, edits);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentIdentifier.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentIdentifier.h
index 0129df9b99..09927478a9 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentIdentifier.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentIdentifier.h
@@ -4,11 +4,12 @@
#include "lsDocumentUri.h"
//Text documents are identified using a URI.On the protocol level,
//URIs are passed as strings.The corresponding JSON structure looks like this:
-struct lsTextDocumentIdentifier {
- /**
+struct lsTextDocumentIdentifier
+{
+ /**
* The text document's URI.
*/
- lsDocumentUri uri;
+ lsDocumentUri uri;
MAKE_SWAP_METHOD(lsTextDocumentIdentifier, uri)
};
MAKE_REFLECT_STRUCT(lsTextDocumentIdentifier, uri)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentItem.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentItem.h
index c5bc915132..365054c453 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentItem.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentItem.h
@@ -6,21 +6,22 @@
#include "lsDocumentUri.h"
//An item to transfer a text document from the client to the server.
-struct lsTextDocumentItem {
- // The text document's URI.
- lsDocumentUri uri;
+struct lsTextDocumentItem
+{
+ // The text document's URI.
+ lsDocumentUri uri;
- // The text document's language identifier.
- std::string languageId;
+ // The text document's language identifier.
+ std::string languageId;
- // The version number of this document (it will strictly increase after each
- // change, including undo/redo).
- int version = 0;
+ // The version number of this document (it will strictly increase after each
+ // change, including undo/redo).
+ int version = 0;
- // The content of the opened text document.
- std::string text;
+ // The content of the opened text document.
+ std::string text;
- MAKE_SWAP_METHOD(lsTextDocumentItem, uri, languageId, version, text)
+ MAKE_SWAP_METHOD(lsTextDocumentItem, uri, languageId, version, text)
};
MAKE_REFLECT_STRUCT(lsTextDocumentItem, uri, languageId, version, text)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentPositionParams.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentPositionParams.h
index a46fa22a9e..ce6b3495c8 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentPositionParams.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentPositionParams.h
@@ -8,19 +8,19 @@
/**
* A parameter literal used in requests to pass a text document and a position inside that document.
*/
-struct lsTextDocumentPositionParams {
- // The text document.
- lsTextDocumentIdentifier textDocument;
+struct lsTextDocumentPositionParams
+{
+ // The text document.
+ lsTextDocumentIdentifier textDocument;
- // The position inside the text document.
- lsPosition position;
+ // The position inside the text document.
+ lsPosition position;
- /**
+ /**
* Legacy property to support protocol version 1.0 requests.
*/
- optional<lsDocumentUri> uri;
-
- MAKE_SWAP_METHOD(lsTextDocumentPositionParams, textDocument, position, uri);
+ optional<lsDocumentUri> uri;
+ MAKE_SWAP_METHOD(lsTextDocumentPositionParams, textDocument, position, uri);
};
MAKE_REFLECT_STRUCT(lsTextDocumentPositionParams, textDocument, position, uri);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextEdit.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextEdit.h
index 29699c9c31..a6ec3e913f 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextEdit.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextEdit.h
@@ -2,12 +2,9 @@
#include "LibLsp/JsonRpc/serializer.h"
-
-
#include <string>
#include "lsRange.h"
-
//Since 3.16.0 there is also the concept of an annotated text edit which supports to add an annotation to a text edit.
//The annotation can add information describing the change to the text edit.
/**
@@ -17,28 +14,27 @@
*/
struct lsChangeAnnotation
{
- /**
+ /**
* A human-readable string describing the actual change. The string
* is rendered prominent in the user interface.
*/
- std::string label;
+ std::string label;
- /**
+ /**
* A flag which indicates that user confirmation is needed
* before applying the change.
*/
- optional<bool> needsConfirmation;
+ optional<bool> needsConfirmation;
- /**
+ /**
* A human-readable string which is rendered less prominent in
* the user interface.
*/
- optional < std::string > description;
- MAKE_REFLECT_STRUCT(lsChangeAnnotation, label, needsConfirmation, description)
+ optional<std::string> description;
+ MAKE_REFLECT_STRUCT(lsChangeAnnotation, label, needsConfirmation, description)
};
MAKE_REFLECT_STRUCT(lsChangeAnnotation, label, needsConfirmation, description)
-
//Usually clients provide options to group the changes along the annotations they are associated with.
//To support this in the protocol an edit or resource operation refers to a change annotation
//using an identifier and not the change annotation literal directly.This allows servers to use
@@ -46,8 +42,6 @@ MAKE_REFLECT_STRUCT(lsChangeAnnotation, label, needsConfirmation, description)
//to group the operations under that change annotation.The actual change annotations together with
//their identifers are managed by the workspace edit via the new property changeAnnotations.
-
-
/**
* An identifier referring to a change annotation managed by a workspace
* edit.
@@ -61,27 +55,26 @@ using lsChangeAnnotationIdentifier = std::string;
* @since 3.16.0.
*/
-
//A textual edit applicable to a text document.
-struct lsTextEdit {
- // The range of the text document to be manipulated. To insert
- // text into a document create a range where start === end.
- lsRange range;
+struct lsTextEdit
+{
+ // The range of the text document to be manipulated. To insert
+ // text into a document create a range where start === end.
+ lsRange range;
- // The string to be inserted. For delete operations use an
- // empty string.
- std::string newText;
+ // The string to be inserted. For delete operations use an
+ // empty string.
+ std::string newText;
- /**
+ /**
* The actual annotation identifier.
*/
- optional<lsChangeAnnotationIdentifier> annotationId;
-
+ optional<lsChangeAnnotationIdentifier> annotationId;
- bool operator==(const lsTextEdit& that);
- std::string ToString() const;
- MAKE_SWAP_METHOD(lsTextEdit, range, newText, annotationId)
+ bool operator==(lsTextEdit const& that);
+ std::string ToString() const;
+ MAKE_SWAP_METHOD(lsTextEdit, range, newText, annotationId)
};
MAKE_REFLECT_STRUCT(lsTextEdit, range, newText, annotationId)
-using lsAnnotatedTextEdit = lsTextEdit;
+using lsAnnotatedTextEdit = lsTextEdit;
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h
index 2b17a4fb0b..bf687f2cc7 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h
@@ -8,13 +8,13 @@
struct lsVersionedTextDocumentIdentifier
{
- lsDocumentUri uri;
- // The version number of this document. number | null
- optional<int> version;
+ lsDocumentUri uri;
+ // The version number of this document. number | null
+ optional<int> version;
- lsTextDocumentIdentifier AsTextDocumentIdentifier() const;
+ lsTextDocumentIdentifier AsTextDocumentIdentifier() const;
- MAKE_SWAP_METHOD(lsVersionedTextDocumentIdentifier, uri, version)
+ MAKE_SWAP_METHOD(lsVersionedTextDocumentIdentifier, uri, version)
};
MAKE_REFLECT_STRUCT(lsVersionedTextDocumentIdentifier, uri, version)
@@ -29,4 +29,4 @@ MAKE_REFLECT_STRUCT(lsVersionedTextDocumentIdentifier, uri, version)
* The version number of a document will increase after each change,
* including undo/redo. The number doesn't need to be consecutive.
*/
-using lsOptionalVersionedTextDocumentIdentifier = lsVersionedTextDocumentIdentifier;
+using lsOptionalVersionedTextDocumentIdentifier = lsVersionedTextDocumentIdentifier;
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsWorkspaceEdit.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsWorkspaceEdit.h
index 4caf296c28..83c077d9e5 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsWorkspaceEdit.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsWorkspaceEdit.h
@@ -16,28 +16,27 @@
//txt.An invalid sequence(e.g. (1) delete file a.txt and (2) insert text into file a.txt) will cause failure of the operation.
//How the client recovers from the failure is described by the client capability : workspace.workspaceEdit.failureHandling
-
-
struct lsChangeAnnotations
{
- lsChangeAnnotation id;
- MAKE_SWAP_METHOD(lsChangeAnnotations, id)
+ lsChangeAnnotation id;
+ MAKE_SWAP_METHOD(lsChangeAnnotations, id)
};
MAKE_REFLECT_STRUCT(lsChangeAnnotations, id)
-struct lsWorkspaceEdit {
- // Holds changes to existing resources.
- // changes ? : { [uri:string]: TextEdit[]; };
- // std::unordered_map<lsDocumentUri, std::vector<lsTextEdit>> changes;
-
- // An array of `TextDocumentEdit`s to express changes to specific a specific
- // version of a text document. Whether a client supports versioned document
- // edits is expressed via `WorkspaceClientCapabilites.versionedWorkspaceEdit`.
- //
- optional< std::map<std::string, std::vector<lsTextEdit> > > changes;
- typedef std::pair < optional<lsTextDocumentEdit>, optional<lsp::Any> > Either;
-
- optional < std::vector< Either > > documentChanges;
- /**
+struct lsWorkspaceEdit
+{
+ // Holds changes to existing resources.
+ // changes ? : { [uri:string]: TextEdit[]; };
+ // std::unordered_map<lsDocumentUri, std::vector<lsTextEdit>> changes;
+
+ // An array of `TextDocumentEdit`s to express changes to specific a specific
+ // version of a text document. Whether a client supports versioned document
+ // edits is expressed via `WorkspaceClientCapabilites.versionedWorkspaceEdit`.
+ //
+ optional<std::map<std::string, std::vector<lsTextEdit>>> changes;
+ typedef std::pair<optional<lsTextDocumentEdit>, optional<lsp::Any>> Either;
+
+ optional<std::vector<Either>> documentChanges;
+ /**
* A map of change annotations that can be referenced in
* `AnnotatedTextEdit`s or create, rename and delete file / folder
* operations.
@@ -47,11 +46,10 @@ struct lsWorkspaceEdit {
*
* @since 3.16.0
*/
- optional< lsChangeAnnotations > changeAnnotations;
+ optional<lsChangeAnnotations> changeAnnotations;
- MAKE_SWAP_METHOD(lsWorkspaceEdit, changes, documentChanges, changeAnnotations)
+ MAKE_SWAP_METHOD(lsWorkspaceEdit, changes, documentChanges, changeAnnotations)
};
MAKE_REFLECT_STRUCT(lsWorkspaceEdit, changes, documentChanges, changeAnnotations)
extern void Reflect(Reader& visitor, lsWorkspaceEdit::Either& value);
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_code_action.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_code_action.h
index 2d5c7111fb..5f4e143001 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_code_action.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_code_action.h
@@ -1,64 +1,77 @@
#pragma once
-
#include "location_type.h"
#include "lsDocumentUri.h"
#include "lsTextEdit.h"
#include "lsPosition.h"
// codeAction
-struct CommandArgs {
- lsDocumentUri textDocumentUri;
- std::vector<lsTextEdit> edits;
+struct CommandArgs
+{
+ lsDocumentUri textDocumentUri;
+ std::vector<lsTextEdit> edits;
};
MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY(CommandArgs, textDocumentUri, edits);
-inline void Reflect(Reader& visitor, CommandArgs& value) {
- int i = 0;
- visitor.IterArray([&](Reader& visitor) {
- switch (i++) {
- case 0:
- Reflect(visitor, value.textDocumentUri);
- break;
- case 1:
- Reflect(visitor, value.edits);
- break;
-
- }
- });
+inline void Reflect(Reader& visitor, CommandArgs& value)
+{
+ int i = 0;
+ visitor.IterArray(
+ [&](Reader& visitor)
+ {
+ switch (i++)
+ {
+ case 0:
+ Reflect(visitor, value.textDocumentUri);
+ break;
+ case 1:
+ Reflect(visitor, value.edits);
+ break;
+ }
+ }
+ );
}
// codeLens
-struct lsCodeLensUserData {};
+struct lsCodeLensUserData
+{
+};
MAKE_REFLECT_EMPTY_STRUCT(lsCodeLensUserData);
-struct lsCodeLensCommandArguments {
- lsDocumentUri uri;
- lsPosition position;
- std::vector<lsLocation> locations;
+struct lsCodeLensCommandArguments
+{
+ lsDocumentUri uri;
+ lsPosition position;
+ std::vector<lsLocation> locations;
};
// FIXME Don't use array in vscode-cquery
-inline void Reflect(Writer& visitor, lsCodeLensCommandArguments& value) {
- visitor.StartArray(3);
- Reflect(visitor, value.uri);
- Reflect(visitor, value.position);
- Reflect(visitor, value.locations);
- visitor.EndArray();
+inline void Reflect(Writer& visitor, lsCodeLensCommandArguments& value)
+{
+ visitor.StartArray(3);
+ Reflect(visitor, value.uri);
+ Reflect(visitor, value.position);
+ Reflect(visitor, value.locations);
+ visitor.EndArray();
}
-inline void Reflect(Reader& visitor, lsCodeLensCommandArguments& value) {
- int i = 0;
- visitor.IterArray([&](Reader& visitor) {
- switch (i++) {
- case 0:
- Reflect(visitor, value.uri);
- break;
- case 1:
- Reflect(visitor, value.position);
- break;
- case 2:
- Reflect(visitor, value.locations);
- break;
- }
- });
+inline void Reflect(Reader& visitor, lsCodeLensCommandArguments& value)
+{
+ int i = 0;
+ visitor.IterArray(
+ [&](Reader& visitor)
+ {
+ switch (i++)
+ {
+ case 0:
+ Reflect(visitor, value.uri);
+ break;
+ case 1:
+ Reflect(visitor, value.position);
+ break;
+ case 2:
+ Reflect(visitor, value.locations);
+ break;
+ }
+ }
+ );
}
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_completion.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_completion.h
index fca45e9cb7..0f54f173c5 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_completion.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_completion.h
@@ -3,150 +3,147 @@
#include "lsMarkedString.h"
#include "lsCommand.h"
-
// The kind of a completion entry.
-enum class lsCompletionItemKind {
- Text = 1,
- Method = 2,
- Function = 3,
- Constructor = 4,
- Field = 5,
- Variable = 6,
- Class = 7,
- Interface = 8,
- Module = 9,
- Property = 10,
- Unit = 11,
- Value = 12,
- Enum = 13,
- Keyword = 14,
- Snippet = 15,
- Color = 16,
- File = 17,
- Reference = 18,
- Folder = 19,
- EnumMember = 20,
- Constant = 21,
- Struct = 22,
- Event = 23,
- Operator = 24,
- TypeParameter = 25,
+enum class lsCompletionItemKind
+{
+ Text = 1,
+ Method = 2,
+ Function = 3,
+ Constructor = 4,
+ Field = 5,
+ Variable = 6,
+ Class = 7,
+ Interface = 8,
+ Module = 9,
+ Property = 10,
+ Unit = 11,
+ Value = 12,
+ Enum = 13,
+ Keyword = 14,
+ Snippet = 15,
+ Color = 16,
+ File = 17,
+ Reference = 18,
+ Folder = 19,
+ EnumMember = 20,
+ Constant = 21,
+ Struct = 22,
+ Event = 23,
+ Operator = 24,
+ TypeParameter = 25,
};
MAKE_REFLECT_TYPE_PROXY(lsCompletionItemKind);
-
-
// Defines whether the insert text in a completion item should be interpreted as
// plain text or a snippet.
-enum class lsInsertTextFormat {
- // The primary text to be inserted is treated as a plain string.
- PlainText = 1,
-
- // The primary text to be inserted is treated as a snippet.
- //
- // A snippet can define tab stops and placeholders with `$1`, `$2`
- // and `${3:foo}`. `$0` defines the final tab stop, it defaults to
- // the end of the snippet. Placeholders with equal identifiers are linked,
- // that is typing in one will update others too.
- //
- // See also:
- // https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md
- Snippet = 2
+enum class lsInsertTextFormat
+{
+ // The primary text to be inserted is treated as a plain string.
+ PlainText = 1,
+
+ // The primary text to be inserted is treated as a snippet.
+ //
+ // A snippet can define tab stops and placeholders with `$1`, `$2`
+ // and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+ // the end of the snippet. Placeholders with equal identifiers are linked,
+ // that is typing in one will update others too.
+ //
+ // See also:
+ // https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md
+ Snippet = 2
};
MAKE_REFLECT_TYPE_PROXY(lsInsertTextFormat);
namespace lsp
{
- std::string ToString(lsCompletionItemKind);
- std::string ToString(lsInsertTextFormat);
-}
+std::string ToString(lsCompletionItemKind);
+std::string ToString(lsInsertTextFormat);
+} // namespace lsp
/**
* The Completion request is sent from the client to the server to compute completion items at a given cursor position.
* Completion items are presented in the IntelliSense user class. If computing complete completion items is expensive
* servers can additional provide a handler for the resolve completion item request. This request is send when a
* completion item is selected in the user class.
*/
-struct lsCompletionItem {
-
- // The label of this completion item. By default
- // also the text that is inserted when selecting
- // this completion.
- std::string label;
+struct lsCompletionItem
+{
- // The kind of this completion item. Based of the kind
- // an icon is chosen by the editor.
- optional<lsCompletionItemKind> kind ;
+ // The label of this completion item. By default
+ // also the text that is inserted when selecting
+ // this completion.
+ std::string label;
- // A human-readable string with additional information
- // about this item, like type or symbol information.
- optional < std::string > detail;
+ // The kind of this completion item. Based of the kind
+ // an icon is chosen by the editor.
+ optional<lsCompletionItemKind> kind;
- // A human-readable string that represents a doc-comment.
- optional< std::pair<optional< std::string> , optional<MarkupContent> > > documentation;
+ // A human-readable string with additional information
+ // about this item, like type or symbol information.
+ optional<std::string> detail;
+ // A human-readable string that represents a doc-comment.
+ optional<std::pair<optional<std::string>, optional<MarkupContent>>> documentation;
- /**
+ /**
* Indicates if this item is deprecated.
*/
- optional< bool >deprecated;
+ optional<bool> deprecated;
-
- /**
+ /**
* Select this item when showing.
*
* *Note* that only one completion item can be selected and that the
* tool / client decides which item that is. The rule is that the *first
* item of those that match best is selected.
*/
- optional< bool > preselect;
-
-
- // Internal information to order candidates.
- int relevance = 0;
-
- // A string that shoud be used when comparing this item
- // with other items. When `falsy` the label is used.
- optional< std::string > sortText;
-
- // A string that should be used when filtering a set of
- // completion items. When `falsy` the label is used.
- optional<std::string> filterText;
-
- // A string that should be inserted a document when selecting
- // this completion. When `falsy` the label is used.
- optional<std::string> insertText;
-
- // The format of the insert text. The format applies to both the `insertText`
- // property and the `newText` property of a provided `textEdit`.
- optional< lsInsertTextFormat> insertTextFormat ;
-
- // An edit which is applied to a document when selecting this completion. When
- // an edit is provided the value of `insertText` is ignored.
- //
- // *Note:* The range of the edit must be a single line range and it must
- // contain the position at which completion has been requested.
- optional<lsTextEdit> textEdit;
-
- // An optional array of additional text edits that are applied when
- // selecting this completion. Edits must not overlap with the main edit
- // nor with themselves.
- // std::vector<TextEdit> additionalTextEdits;
-
- // An optional command that is executed *after* inserting this completion.
- // *Note* that additional modifications to the current document should be
- // described with the additionalTextEdits-property. Command command;
-
- // An data entry field that is preserved on a completion item between
- // a completion and a completion resolve request.
- // data ? : any
-
- // Use this helper to figure out what content the completion item will insert
- // into the document, as it could live in either |textEdit|, |insertText|, or
- // |label|.
- const std::string& InsertedContent() const;
-
- std::string DisplayText();
- /**
+ optional<bool> preselect;
+
+ // Internal information to order candidates.
+ int relevance = 0;
+
+ // A string that shoud be used when comparing this item
+ // with other items. When `falsy` the label is used.
+ optional<std::string> sortText;
+
+ // A string that should be used when filtering a set of
+ // completion items. When `falsy` the label is used.
+ optional<std::string> filterText;
+
+ // A string that should be inserted a document when selecting
+ // this completion. When `falsy` the label is used.
+ optional<std::string> insertText;
+
+ // The format of the insert text. The format applies to both the `insertText`
+ // property and the `newText` property of a provided `textEdit`.
+ optional<lsInsertTextFormat> insertTextFormat;
+
+ // An edit which is applied to a document when selecting this completion. When
+ // an edit is provided the value of `insertText` is ignored.
+ //
+ // *Note:* The range of the edit must be a single line range and it must
+ // contain the position at which completion has been requested.
+ optional<lsTextEdit> textEdit;
+
+ // An optional array of additional text edits that are applied when
+ // selecting this completion. Edits must not overlap with the main edit
+ // nor with themselves.
+ // std::vector<TextEdit> additionalTextEdits;
+
+ // An optional command that is executed *after* inserting this completion.
+ // *Note* that additional modifications to the current document should be
+ // described with the additionalTextEdits-property. Command command;
+
+ // An data entry field that is preserved on a completion item between
+ // a completion and a completion resolve request.
+ // data ? : any
+
+ // Use this helper to figure out what content the completion item will insert
+ // into the document, as it could live in either |textEdit|, |insertText|, or
+ // |label|.
+ std::string const& InsertedContent() const;
+
+ std::string DisplayText();
+ /**
* An optional array of additional text edits that are applied when
* selecting this completion. Edits must not overlap (including the same insert position)
* with the main edit nor with themselves.
@@ -155,70 +152,50 @@ struct lsCompletionItem {
* (for example adding an import statement at the top of the file if the completion item will
* insert an unqualified type).
*/
- optional<std::vector<lsTextEdit> >additionalTextEdits;
+ optional<std::vector<lsTextEdit>> additionalTextEdits;
- /**
+ /**
* An optional set of characters that when pressed while this completion is active will accept it first and
* then type that character. *Note* that all commit characters should have `length=1` and that superfluous
* characters will be ignored.
*/
- optional< std::vector<std::string> > commitCharacters;
+ optional<std::vector<std::string>> commitCharacters;
- /**
+ /**
* An optional command that is executed *after* inserting this completion. *Note* that
* additional modifications to the current document should be described with the
* additionalTextEdits-property.
*/
- optional<lsCommandWithAny> command;
+ optional<lsCommandWithAny> command;
- /**
+ /**
* An data entry field that is preserved on a completion item between a completion and a completion resolve request.
*/
- optional<lsp::Any> data;
- std::string ToString();
- MAKE_SWAP_METHOD(lsCompletionItem,
- label,
- kind,
- detail,
- documentation,
- sortText,
- insertText,
- filterText,
- insertTextFormat,
- textEdit,
- deprecated, preselect, additionalTextEdits, commitCharacters,
- command, data);
-
+ optional<lsp::Any> data;
+ std::string ToString();
+ MAKE_SWAP_METHOD(
+ lsCompletionItem, label, kind, detail, documentation, sortText, insertText, filterText, insertTextFormat,
+ textEdit, deprecated, preselect, additionalTextEdits, commitCharacters, command, data
+ );
};
+MAKE_REFLECT_STRUCT(
+ lsCompletionItem, label, kind, detail, documentation, sortText, insertText, filterText, insertTextFormat, textEdit,
+ deprecated, preselect, additionalTextEdits, commitCharacters, command, data
+);
-
-MAKE_REFLECT_STRUCT(lsCompletionItem,
- label,
- kind,
- detail,
- documentation,
- sortText,
- insertText,
- filterText,
- insertTextFormat,
- textEdit,
- deprecated, preselect, additionalTextEdits, commitCharacters,
- command, data);
-
-
-
-struct CompletionList {
- // This list it not complete. Further typing should result in recomputing
- // this list.
- bool isIncomplete = false;
- // The completion items.
- std::vector<lsCompletionItem> items;
-
- void swap(CompletionList& arg) noexcept
- {
- items.swap(arg.items);
- std::swap(isIncomplete, arg.isIncomplete);
- }
+struct CompletionList
+{
+ // This list it not complete. Further typing should result in recomputing
+ // this list.
+ bool isIncomplete = false;
+ // The completion items.
+ std::vector<lsCompletionItem> items;
+
+ void swap(CompletionList& arg) noexcept
+ {
+ items.swap(arg.items);
+ std::swap(isIncomplete, arg.isIncomplete);
+ }
};
MAKE_REFLECT_STRUCT(CompletionList, isIncomplete, items);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_diagnostic.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_diagnostic.h
index e05e816b69..5035e9e6c1 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_diagnostic.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_diagnostic.h
@@ -10,15 +10,16 @@
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
-enum class lsDiagnosticSeverity {
- // Reports an error.
- Error = 1,
- // Reports a warning.
- Warning = 2,
- // Reports an information.
- Information = 3,
- // Reports a hint.
- Hint = 4
+enum class lsDiagnosticSeverity
+{
+ // Reports an error.
+ Error = 1,
+ // Reports a warning.
+ Warning = 2,
+ // Reports an information.
+ Information = 3,
+ // Reports a hint.
+ Hint = 4
};
MAKE_REFLECT_TYPE_PROXY(lsDiagnosticSeverity);
@@ -27,27 +28,26 @@ MAKE_REFLECT_TYPE_PROXY(lsDiagnosticSeverity);
*
* @since 3.15.0
*/
-enum class DiagnosticTag :uint8_t {
+enum class DiagnosticTag : uint8_t
+{
- /**
+ /**
* Unused or unnecessary code.
*
* Clients are allowed to render diagnostics with this tag faded out instead of having
* an error squiggle.
*/
- Unnecessary=(1),
+ Unnecessary = (1),
- /**
+ /**
* Deprecated or obsolete code.
*
* Clients are allowed to rendered diagnostics with this tag strike through.
*/
- Deprecated=(2),
+ Deprecated = (2),
};
MAKE_REFLECT_TYPE_PROXY(DiagnosticTag);
-
-
/**
* Represents a related message and source code location for a diagnostic. This should be
* used to point to code locations that cause or related to a diagnostics, e.g when duplicating
@@ -56,20 +56,21 @@ MAKE_REFLECT_TYPE_PROXY(DiagnosticTag);
* Since 3.7.0
*/
-struct DiagnosticRelatedInformation {
- /**
+struct DiagnosticRelatedInformation
+{
+ /**
* The location of this related diagnostic information.
*/
lsLocation location;
- /**
+ /**
* The message of this related diagnostic information.
*/
- std::string message;
+ std::string message;
- MAKE_SWAP_METHOD(DiagnosticRelatedInformation, location, message)
+ MAKE_SWAP_METHOD(DiagnosticRelatedInformation, location, message)
};
MAKE_REFLECT_STRUCT(DiagnosticRelatedInformation, location, message)
/**
@@ -77,76 +78,73 @@ MAKE_REFLECT_STRUCT(DiagnosticRelatedInformation, location, message)
*
* @since 3.16.0
*/
-struct DiagnosticCodeDescription {
- /**
+struct DiagnosticCodeDescription
+{
+ /**
* An URI to open with more information about the diagnostic error.
*/
- std::string href;
- MAKE_SWAP_METHOD(DiagnosticCodeDescription, href)
+ std::string href;
+ MAKE_SWAP_METHOD(DiagnosticCodeDescription, href)
};
MAKE_REFLECT_STRUCT(DiagnosticCodeDescription, href)
//Represents a diagnostic, such as a compiler error or warning.Diagnostic objects are only valid in the scope of a resource.
-struct lsDiagnostic {
- // The range at which the message applies.
- lsRange range;
+struct lsDiagnostic
+{
+ // The range at which the message applies.
+ lsRange range;
- // The diagnostic's severity. Can be omitted. If omitted it is up to the
- // client to interpret diagnostics as error, warning, info or hint.
- optional<lsDiagnosticSeverity> severity;
+ // The diagnostic's severity. Can be omitted. If omitted it is up to the
+ // client to interpret diagnostics as error, warning, info or hint.
+ optional<lsDiagnosticSeverity> severity;
- // The diagnostic's code. Can be omitted.
- optional< std::pair<optional<std::string>, optional<int>> > code;
+ // The diagnostic's code. Can be omitted.
+ optional<std::pair<optional<std::string>, optional<int>>> code;
- optional<DiagnosticCodeDescription> codeDescription;
- // A human-readable string describing the source of this
- // diagnostic, e.g. 'typescript' or 'super lint'.
- optional < std::string >source ;
+ optional<DiagnosticCodeDescription> codeDescription;
+ // A human-readable string describing the source of this
+ // diagnostic, e.g. 'typescript' or 'super lint'.
+ optional<std::string> source;
- // The diagnostic's message.
- std::string message;
+ // The diagnostic's message.
+ std::string message;
- // Non-serialized set of fixits.
- std::vector<lsTextEdit> fixits_;
+ // Non-serialized set of fixits.
+ std::vector<lsTextEdit> fixits_;
- /**
+ /**
* Additional metadata about the diagnostic.
*
* @since 3.15.0
*/
- optional<std::vector<DiagnosticTag>> tags;
+ optional<std::vector<DiagnosticTag>> tags;
-
- /**
+ /**
* An array of related diagnostic information, e.g. when symbol-names within a scope collide
* all definitions can be marked via this property.
*
* Since 3.7.0
*/
- optional<std::vector<DiagnosticRelatedInformation>> relatedInformation;
+ optional<std::vector<DiagnosticRelatedInformation>> relatedInformation;
- /**
+ /**
* A data entry field that is preserved between a
* `textDocument/publishDiagnostics` notification and
* `textDocument/codeAction` request.
*
* @since 3.16.0
*/
- optional<lsp::Any> data;
- bool operator==(const lsDiagnostic& rhs) const;
- bool operator!=(const lsDiagnostic& rhs) const;
+ optional<lsp::Any> data;
+ bool operator==(lsDiagnostic const& rhs) const;
+ bool operator!=(lsDiagnostic const& rhs) const;
- MAKE_SWAP_METHOD(lsDiagnostic, range, severity, code, codeDescription, source, message, tags, data)
+ MAKE_SWAP_METHOD(lsDiagnostic, range, severity, code, codeDescription, source, message, tags, data)
};
MAKE_REFLECT_STRUCT(lsDiagnostic, range, severity, code, codeDescription, source, message, tags, data)
+struct Rsp_Error : ResponseError<lsResponseError, Rsp_Error>
+{
-
-struct Rsp_Error : ResponseError<lsResponseError, Rsp_Error> {
-
- MAKE_SWAP_METHOD(Rsp_Error, jsonrpc, id, error)
+ MAKE_SWAP_METHOD(Rsp_Error, jsonrpc, id, error)
};
MAKE_REFLECT_STRUCT(Rsp_Error, jsonrpc, id, error)
-
-
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/method_type.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/method_type.h
index dcbb4a851a..b141367e2a 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/method_type.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/method_type.h
@@ -1,7 +1,4 @@
#pragma once
#include <string>
-using MethodType = const char* const;
-
-
-
+using MethodType = char const* const;
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/out_list.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/out_list.h
index 8ede0b4a60..e10da8255b 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/out_list.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/out_list.h
@@ -1,22 +1,18 @@
#pragma once
-
#include "location_type.h"
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
-
-
//DEFINE_RESPONCE_TYPE(Rsp_FindLinkLocationList, std::vector<LinkLocation>);
//DEFINE_RESPONCE_TYPE(Rsp_LocationList, std::vector<lsLocation>);
+namespace LocationListEither
+{
-namespace LocationListEither{
-
- typedef std::pair< optional<std::vector<lsLocation>> , optional<std::vector<LocationLink> > > Either;
+typedef std::pair<optional<std::vector<lsLocation>>, optional<std::vector<LocationLink>>> Either;
};
-extern void Reflect(Reader& visitor, LocationListEither::Either& value);
+extern void Reflect(Reader& visitor, LocationListEither::Either& value);
//DEFINE_RESPONCE_TYPE(Rsp_LocationListEither, LocationListEither::Either);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/symbol.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/symbol.h
index 216c3f7d13..b66da101c9 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/symbol.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/symbol.h
@@ -1,92 +1,95 @@
#pragma once
#include "LibLsp/lsp/location_type.h"
-
-enum class lsSymbolKind : uint8_t {
- Unknown = 0,
-
- File = 1,
- Module = 2,
- Namespace = 3,
- Package = 4,
- Class = 5,
- Method = 6,
- Property = 7,
- Field = 8,
- Constructor = 9,
- Enum = 10,
- Interface = 11,
- Function = 12,
- Variable = 13,
- Constant = 14,
- String = 15,
- Number = 16,
- Boolean = 17,
- Array = 18,
- Object = 19,
- Key = 20,
- Null = 21,
- EnumMember = 22,
- Struct = 23,
- Event = 24,
- Operator = 25,
-
- // For C++, this is interpreted as "template parameter" (including
- // non-type template parameters).
- TypeParameter = 26,
-
- // cquery extensions
- // See also https://github.com/Microsoft/language-server-protocol/issues/344
- // for new SymbolKind clang/Index/IndexSymbol.h clang::index::SymbolKind
- TypeAlias = 252,
- Parameter = 253,
- StaticMethod = 254,
- Macro = 255,
+enum class lsSymbolKind : uint8_t
+{
+ Unknown = 0,
+
+ File = 1,
+ Module = 2,
+ Namespace = 3,
+ Package = 4,
+ Class = 5,
+ Method = 6,
+ Property = 7,
+ Field = 8,
+ Constructor = 9,
+ Enum = 10,
+ Interface = 11,
+ Function = 12,
+ Variable = 13,
+ Constant = 14,
+ String = 15,
+ Number = 16,
+ Boolean = 17,
+ Array = 18,
+ Object = 19,
+ Key = 20,
+ Null = 21,
+ EnumMember = 22,
+ Struct = 23,
+ Event = 24,
+ Operator = 25,
+
+ // For C++, this is interpreted as "template parameter" (including
+ // non-type template parameters).
+ TypeParameter = 26,
+
+ // cquery extensions
+ // See also https://github.com/Microsoft/language-server-protocol/issues/344
+ // for new SymbolKind clang/Index/IndexSymbol.h clang::index::SymbolKind
+ TypeAlias = 252,
+ Parameter = 253,
+ StaticMethod = 254,
+ Macro = 255,
};
MAKE_REFLECT_TYPE_PROXY(lsSymbolKind);
-typedef lsSymbolKind SymbolKind;
+typedef lsSymbolKind SymbolKind;
// A document highlight kind.
-enum class lsDocumentHighlightKind {
- // A textual occurrence.
- Text = 1,
- // Read-access of a symbol, like reading a variable.
- Read = 2,
- // Write-access of a symbol, like writing to a variable.
- Write = 3
+enum class lsDocumentHighlightKind
+{
+ // A textual occurrence.
+ Text = 1,
+ // Read-access of a symbol, like reading a variable.
+ Read = 2,
+ // Write-access of a symbol, like writing to a variable.
+ Write = 3
};
MAKE_REFLECT_TYPE_PROXY(lsDocumentHighlightKind);
// A document highlight is a range inside a text document which deserves
// special attention. Usually a document highlight is visualized by changing
// the background color of its range.
-struct lsDocumentHighlight {
- // The range this highlight applies to.
- lsRange range;
+struct lsDocumentHighlight
+{
+ // The range this highlight applies to.
+ lsRange range;
- // The highlight kind, default is DocumentHighlightKind.Text.
- optional<lsDocumentHighlightKind> kind ;
+ // The highlight kind, default is DocumentHighlightKind.Text.
+ optional<lsDocumentHighlightKind> kind;
- MAKE_SWAP_METHOD(lsDocumentHighlight, range, kind)
+ MAKE_SWAP_METHOD(lsDocumentHighlight, range, kind)
};
MAKE_REFLECT_STRUCT(lsDocumentHighlight, range, kind);
-struct lsSymbolInformation {
+struct lsSymbolInformation
+{
-/**
+ /**
* The name of this symbol.
*/
- std::string name;
- /**
+ std::string name;
+ /**
* The kind of this symbol.
*/
- lsSymbolKind kind;
- /**
+ lsSymbolKind kind;
+ /**
* Indicates if this symbol is deprecated.
*/
- optional<bool> deprecated;
- /**
+ optional<bool> deprecated;
+ /**
* The location of this symbol. The location's range is used by a tool
* to reveal the location in the editor. If the symbol is selected in the
* tool the range's start information is used to position the cursor. So
@@ -97,68 +100,67 @@ struct lsSymbolInformation {
* syntax tree. It can therefore not be used to re-construct a hierarchy of
* the symbols.
*/
- lsLocation location;
- /**
+ lsLocation location;
+ /**
* The name of the symbol containing this symbol. This information is for
* user interface purposes (e.g. to render a qualifier in the user interface
* if necessary). It can't be used to re-infer a hierarchy for the document
* symbols.
*/
- optional<std::string> containerName;
-
+ optional<std::string> containerName;
- MAKE_SWAP_METHOD(lsSymbolInformation, name, kind, deprecated, location, containerName);
+ MAKE_SWAP_METHOD(lsSymbolInformation, name, kind, deprecated, location, containerName);
};
MAKE_REFLECT_STRUCT(lsSymbolInformation, name, kind, deprecated, location, containerName);
-
-struct lsDocumentSymbol {
- /**
+struct lsDocumentSymbol
+{
+ /**
* The name of this symbol.
*/
- std::string name;
+ std::string name;
- /**
+ /**
* The kind of this symbol.
*/
- lsSymbolKind kind = lsSymbolKind::Unknown;
+ lsSymbolKind kind = lsSymbolKind::Unknown;
- /**
+ /**
* The range enclosing this symbol not including leading/trailing whitespace but everything else
* like comments. This information is typically used to determine if the clients cursor is
* inside the symbol to reveal in the symbol in the UI.
*/
- lsRange range;
+ lsRange range;
- /**
+ /**
* The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
* Must be contained by the `range`.
*/
- lsRange selectionRange;
+ lsRange selectionRange;
- /**
+ /**
* More detail for this symbol, e.g the signature of a function. If not provided the
* name is used.
*/
- optional< std::string > detail;
+ optional<std::string> detail;
- /**
+ /**
* Indicates if this symbol is deprecated.
*/
- optional< bool > deprecated;
+ optional<bool> deprecated;
- /**
+ /**
* Children of this symbol, e.g. properties of a class.
*/
- optional < std::vector<lsDocumentSymbol> > children;
+ optional<std::vector<lsDocumentSymbol>> children;
- //internal use
- int flags=0;
+ //internal use
+ int flags = 0;
- MAKE_SWAP_METHOD(lsDocumentSymbol, name, kind, range, selectionRange, detail, deprecated, children, flags);
+ MAKE_SWAP_METHOD(lsDocumentSymbol, name, kind, range, selectionRange, detail, deprecated, children, flags);
};
MAKE_REFLECT_STRUCT(lsDocumentSymbol, name, kind, range, selectionRange, detail, deprecated, children, flags);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/SemanticTokens.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/SemanticTokens.h
index 8a24ebdd45..e7ada015fd 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/SemanticTokens.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/SemanticTokens.h
@@ -3,139 +3,146 @@
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
#include "LibLsp/lsp/lsVersionedTextDocumentIdentifier.h"
#include "LibLsp/JsonRpc/RequestInMessage.h"
-enum class HighlightingKind_clangD {
- Variable = 0,
- LocalVariable,
- Parameter,
- Function,
- Method,
- StaticMethod,
- Field,
- StaticField,
- Class,
- Interface,
- Enum,
- EnumConstant,
- Typedef,
- Type,
- Unknown,
- Namespace,
- TemplateParameter,
- Concept,
- Primitive,
- Macro,
+enum class HighlightingKind_clangD
+{
+ Variable = 0,
+ LocalVariable,
+ Parameter,
+ Function,
+ Method,
+ StaticMethod,
+ Field,
+ StaticField,
+ Class,
+ Interface,
+ Enum,
+ EnumConstant,
+ Typedef,
+ Type,
+ Unknown,
+ Namespace,
+ TemplateParameter,
+ Concept,
+ Primitive,
+ Macro,
- // This one is different from the other kinds as it's a line style
- // rather than a token style.
- InactiveCode,
+ // This one is different from the other kinds as it's a line style
+ // rather than a token style.
+ InactiveCode,
- LastKind = InactiveCode
+ LastKind = InactiveCode
};
std::string toSemanticTokenType(HighlightingKind_clangD kind);
-enum class HighlightingModifier_clangD {
- Declaration,
- Deprecated,
- Deduced,
- Readonly,
- Static,
- Abstract,
- DependentName,
- DefaultLibrary,
+enum class HighlightingModifier_clangD
+{
+ Declaration,
+ Deprecated,
+ Deduced,
+ Readonly,
+ Static,
+ Abstract,
+ DependentName,
+ DefaultLibrary,
- FunctionScope,
- ClassScope,
- FileScope,
- GlobalScope,
+ FunctionScope,
+ ClassScope,
+ FileScope,
+ GlobalScope,
- LastModifier = GlobalScope
+ LastModifier = GlobalScope
};
std::string toSemanticTokenModifier(HighlightingModifier_clangD modifier);
-enum SemanticTokenType {
- ls_namespace=0,// 'namespace',
- /**
+enum SemanticTokenType
+{
+ ls_namespace = 0, // 'namespace',
+ /**
* Represents a generic type. Acts as a fallback for types which
* can't be mapped to a specific type like class or enum.
*/
- ls_type,// 'type',
- ls_class,// 'class',
- ls_enum,// 'enum',
- ls_interface,// 'interface',
- ls_struct,// 'struct',
- ls_typeParameter,// 'typeParameter',
- ls_parameter,// 'parameter',
- ls_variable,// 'variable',
- ls_property,// 'property',
- ls_enumMember,// 'enumMember',
- ls_event,// 'event',
- ls_function,// 'function',
- ls_method,// 'method',
- ls_macro,// 'macro',
- ls_keyword,// 'keyword',
- ls_modifier,// 'modifier',
- ls_comment,// 'comment',
- ls_string,// 'string',
- ls_number,// 'number',
- ls_regexp,// 'regexp',
- ls_operator,// 'operator'
- lastKind = ls_operator
+ ls_type, // 'type',
+ ls_class, // 'class',
+ ls_enum, // 'enum',
+ ls_interface, // 'interface',
+ ls_struct, // 'struct',
+ ls_typeParameter, // 'typeParameter',
+ ls_parameter, // 'parameter',
+ ls_variable, // 'variable',
+ ls_property, // 'property',
+ ls_enumMember, // 'enumMember',
+ ls_event, // 'event',
+ ls_function, // 'function',
+ ls_method, // 'method',
+ ls_macro, // 'macro',
+ ls_keyword, // 'keyword',
+ ls_modifier, // 'modifier',
+ ls_comment, // 'comment',
+ ls_string, // 'string',
+ ls_number, // 'number',
+ ls_regexp, // 'regexp',
+ ls_operator, // 'operator'
+ lastKind = ls_operator
};
std::string to_string(SemanticTokenType);
unsigned toSemanticTokenType(std::vector<SemanticTokenType>& modifiers);
-enum TokenType_JDT {
- PACKAGE_JDT=0,
- CLASS_JDT,
- INTERFACE_JDT,
- ENUM_JDT,
- ENUM_MEMBER_JDT,
- TYPE_JDT,
- TYPE_PARAMETER_JDT,
- ANNOTATION_JDT,
- ANNOTATION_MEMBER_JDT,
- METHOD_JDT,
- PROPERTY_JDT,
- VARIABLE_JDT,
- PARAMETER_JDT
+enum TokenType_JDT
+{
+ PACKAGE_JDT = 0,
+ CLASS_JDT,
+ INTERFACE_JDT,
+ ENUM_JDT,
+ ENUM_MEMBER_JDT,
+ TYPE_JDT,
+ TYPE_PARAMETER_JDT,
+ ANNOTATION_JDT,
+ ANNOTATION_MEMBER_JDT,
+ METHOD_JDT,
+ PROPERTY_JDT,
+ VARIABLE_JDT,
+ PARAMETER_JDT
};
std::string to_string(TokenType_JDT);
-enum SemanticTokenModifier {
- ls_declaration=0,// 'declaration',
- ls_definition,// 'definition',
- ls_readonly,// 'readonly',
- ls_static,// 'static',
- ls_deprecated,// 'deprecated',
- ls_abstract,// 'abstract',
- ls_async,// 'async',
- ls_modification,// 'modification',
- ls_documentation,// 'documentation',
- ls_defaultLibrary,// 'defaultLibrary'
- LastModifier = ls_defaultLibrary
+enum SemanticTokenModifier
+{
+ ls_declaration = 0, // 'declaration',
+ ls_definition, // 'definition',
+ ls_readonly, // 'readonly',
+ ls_static, // 'static',
+ ls_deprecated, // 'deprecated',
+ ls_abstract, // 'abstract',
+ ls_async, // 'async',
+ ls_modification, // 'modification',
+ ls_documentation, // 'documentation',
+ ls_defaultLibrary, // 'defaultLibrary'
+ LastModifier = ls_defaultLibrary
};
std::string to_string(SemanticTokenModifier);
-unsigned toSemanticTokenModifiers(std::vector<SemanticTokenModifier>&);
+unsigned toSemanticTokenModifiers(std::vector<SemanticTokenModifier>&);
/// Specifies a single semantic token in the document.
/// This struct is not part of LSP, which just encodes lists of tokens as
/// arrays of numbers directly.
-struct SemanticToken {
- /// token line number, relative to the previous token
- unsigned deltaLine = 0;
- /// token start character, relative to the previous token
- /// (relative to 0 or the previous token's start if they are on the same line)
- unsigned deltaStart = 0;
- /// the length of the token. A token cannot be multiline
- unsigned length = 0;
- /// will be looked up in `SemanticTokensLegend.tokenTypes`
- unsigned tokenType = 0;
- /// each set bit will be looked up in `SemanticTokensLegend.tokenModifiers`
- unsigned tokenModifiers = 0;
+struct SemanticToken
+{
+ /// token line number, relative to the previous token
+ unsigned deltaLine = 0;
+ /// token start character, relative to the previous token
+ /// (relative to 0 or the previous token's start if they are on the same line)
+ unsigned deltaStart = 0;
+ /// the length of the token. A token cannot be multiline
+ unsigned length = 0;
+ /// will be looked up in `SemanticTokensLegend.tokenTypes`
+ unsigned tokenType = 0;
+ /// each set bit will be looked up in `SemanticTokensLegend.tokenModifiers`
+ unsigned tokenModifiers = 0;
};
-bool operator==(const SemanticToken&, const SemanticToken&);
-struct SemanticTokens{
+bool operator==(SemanticToken const&, SemanticToken const&);
+struct SemanticTokens
+{
- /**
+ /**
* Tokens in a file are represented as an array of integers. The position of each token is expressed relative to
* the token before it, because most tokens remain stable relative to each other when edits are made in a file.
*
@@ -190,78 +197,85 @@ struct SemanticTokens{
* [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ]
* ```
*/
- std::vector<int32_t> data;
- static std::vector<int32_t> encodeTokens(std::vector<SemanticToken>& tokens);
+ std::vector<int32_t> data;
+ static std::vector<int32_t> encodeTokens(std::vector<SemanticToken>& tokens);
- /**
+ /**
* An optional result id. If provided and clients support delta updating
* the client will include the result id in the next semantic token request.
* A server can then instead of computing all semantic tokens again simply
* send a delta.
*/
- optional<std::string> resultId;
- MAKE_SWAP_METHOD(SemanticTokens, data, resultId)
+ optional<std::string> resultId;
+ MAKE_SWAP_METHOD(SemanticTokens, data, resultId)
};
MAKE_REFLECT_STRUCT(SemanticTokens, data, resultId)
/// Body of textDocument/semanticTokens/full request.
-struct SemanticTokensParams {
- /// The text document.
- lsTextDocumentIdentifier textDocument;
- MAKE_REFLECT_STRUCT(SemanticTokensParams, textDocument)
+struct SemanticTokensParams
+{
+ /// The text document.
+ lsTextDocumentIdentifier textDocument;
+ MAKE_REFLECT_STRUCT(SemanticTokensParams, textDocument)
};
MAKE_REFLECT_STRUCT(SemanticTokensParams, textDocument)
-
/// Body of textDocument/semanticTokens/full/delta request.
/// Requests the changes in semantic tokens since a previous response.
-struct SemanticTokensDeltaParams {
- /// The text document.
- lsTextDocumentIdentifier textDocument;
- /**
+struct SemanticTokensDeltaParams
+{
+ /// The text document.
+ lsTextDocumentIdentifier textDocument;
+ /**
* The result id of a previous response. The result Id can either point to
* a full response or a delta response depending on what was received last.
*/
- std::string previousResultId;
+ std::string previousResultId;
- MAKE_REFLECT_STRUCT(SemanticTokensDeltaParams, textDocument, previousResultId)
+ MAKE_REFLECT_STRUCT(SemanticTokensDeltaParams, textDocument, previousResultId)
};
MAKE_REFLECT_STRUCT(SemanticTokensDeltaParams, textDocument, previousResultId)
/// Describes a a replacement of a contiguous range of semanticTokens.
-struct SemanticTokensEdit {
- // LSP specifies `start` and `deleteCount` which are relative to the array
- // encoding of the previous tokens.
- // We use token counts instead, and translate when serializing this struct.
- unsigned startToken = 0;
- unsigned deleteTokens = 0;
- std::vector<int32_t> tokens; // encoded as a flat integer array
+struct SemanticTokensEdit
+{
+ // LSP specifies `start` and `deleteCount` which are relative to the array
+ // encoding of the previous tokens.
+ // We use token counts instead, and translate when serializing this struct.
+ unsigned startToken = 0;
+ unsigned deleteTokens = 0;
+ std::vector<int32_t> tokens; // encoded as a flat integer array
- MAKE_REFLECT_STRUCT(SemanticTokensEdit, startToken, deleteTokens, tokens)
+ MAKE_REFLECT_STRUCT(SemanticTokensEdit, startToken, deleteTokens, tokens)
};
MAKE_REFLECT_STRUCT(SemanticTokensEdit, startToken, deleteTokens, tokens)
-
/// This models LSP SemanticTokensDelta | SemanticTokens, which is the result of
/// textDocument/semanticTokens/full/delta.
-struct SemanticTokensOrDelta {
- optional<std::string > resultId;
- /// Set if we computed edits relative to a previous set of tokens.
- optional< std::vector<SemanticTokensEdit> > edits;
- /// Set if we computed a fresh set of tokens.
- /// Set if we computed edits relative to a previous set of tokens.
- optional<std::vector<int32_t>> tokens; // encoded as integer array
- MAKE_REFLECT_STRUCT(SemanticTokensOrDelta, resultId, edits, tokens)
+struct SemanticTokensOrDelta
+{
+ optional<std::string> resultId;
+ /// Set if we computed edits relative to a previous set of tokens.
+ optional<std::vector<SemanticTokensEdit>> edits;
+ /// Set if we computed a fresh set of tokens.
+ /// Set if we computed edits relative to a previous set of tokens.
+ optional<std::vector<int32_t>> tokens; // encoded as integer array
+ MAKE_REFLECT_STRUCT(SemanticTokensOrDelta, resultId, edits, tokens)
};
MAKE_REFLECT_STRUCT(SemanticTokensOrDelta, resultId, edits, tokens)
-
-struct SemanticTokensLegend {
- std::vector<std::string> tokenTypes;
- std::vector<std::string> tokenModifiers;
- MAKE_REFLECT_STRUCT(SemanticTokensLegend, tokenTypes, tokenModifiers)
+struct SemanticTokensLegend
+{
+ std::vector<std::string> tokenTypes;
+ std::vector<std::string> tokenModifiers;
+ MAKE_REFLECT_STRUCT(SemanticTokensLegend, tokenTypes, tokenModifiers)
};
MAKE_REFLECT_STRUCT(SemanticTokensLegend, tokenTypes, tokenModifiers)
-DEFINE_REQUEST_RESPONSE_TYPE(td_semanticTokens_full, SemanticTokensParams,optional<SemanticTokens >,"textDocument/semanticTokens/full")
-DEFINE_REQUEST_RESPONSE_TYPE(td_semanticTokens_full_delta, SemanticTokensDeltaParams, optional<SemanticTokensOrDelta >, "textDocument/semanticTokens/full/delta")
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_semanticTokens_full, SemanticTokensParams, optional<SemanticTokens>, "textDocument/semanticTokens/full"
+)
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_semanticTokens_full_delta, SemanticTokensDeltaParams, optional<SemanticTokensOrDelta>,
+ "textDocument/semanticTokens/full/delta"
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/callHierarchy.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/callHierarchy.h
index 408767d937..c9ca161422 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/callHierarchy.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/callHierarchy.h
@@ -7,115 +7,116 @@
#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
#include "LibLsp/lsp/lsRange.h"
-enum class SymbolTag { Deprecated = 1 };
+enum class SymbolTag
+{
+ Deprecated = 1
+};
MAKE_REFLECT_TYPE_PROXY(SymbolTag)
struct CallHierarchyPrepareParams
{
- lsTextDocumentIdentifier textDocument;
- lsPosition position;
+ lsTextDocumentIdentifier textDocument;
+ lsPosition position;
- MAKE_SWAP_METHOD(CallHierarchyPrepareParams,
- textDocument,
- position)
+ MAKE_SWAP_METHOD(CallHierarchyPrepareParams, textDocument, position)
};
-MAKE_REFLECT_STRUCT(CallHierarchyPrepareParams,
- textDocument,
- position)
-
+MAKE_REFLECT_STRUCT(CallHierarchyPrepareParams, textDocument, position)
+/// Represents programming constructs like functions or constructors
+/// in the context of call hierarchy.
+struct CallHierarchyItem
+{
+ /// The name of this item.
+ std::string name;
- /// Represents programming constructs like functions or constructors
- /// in the context of call hierarchy.
-struct CallHierarchyItem {
- /// The name of this item.
- std::string name;
-
- /// The kind of this item.
- SymbolKind kind;
+ /// The kind of this item.
+ SymbolKind kind;
- /// Tags for this item.
- optional<std::vector<SymbolTag>> tags;
+ /// Tags for this item.
+ optional<std::vector<SymbolTag>> tags;
- /// More detaill for this item, e.g. the signature of a function.
- optional<std::string> detail;
+ /// More detaill for this item, e.g. the signature of a function.
+ optional<std::string> detail;
- /// The resource identifier of this item.
- lsDocumentUri uri;
+ /// The resource identifier of this item.
+ lsDocumentUri uri;
- /**
+ /**
* The range enclosing this symbol not including leading/trailing whitespace
* but everything else, e.g. comments and code.
*/
- lsRange range;
+ lsRange range;
- /**
+ /**
* The range that should be selected and revealed when this symbol is being
* picked, e.g. the name of a function. Must be contained by the
* [`range`](#CallHierarchyItem.range).
*/
- lsRange selectionRange;
+ lsRange selectionRange;
- /**
+ /**
* A data entry field that is preserved between a call hierarchy prepare and
* incoming calls or outgoing calls requests.
*/
- optional<lsp::Any> data;
- MAKE_SWAP_METHOD(CallHierarchyItem, name, kind, tags, detail, uri, range, selectionRange, data)
+ optional<lsp::Any> data;
+ MAKE_SWAP_METHOD(CallHierarchyItem, name, kind, tags, detail, uri, range, selectionRange, data)
};
MAKE_REFLECT_STRUCT(CallHierarchyItem, name, kind, tags, detail, uri, range, selectionRange, data)
-
-
/// The parameter of a `callHierarchy/incomingCalls` request.
-struct CallHierarchyIncomingCallsParams {
- CallHierarchyItem item;
- MAKE_SWAP_METHOD(CallHierarchyIncomingCallsParams,item)
+struct CallHierarchyIncomingCallsParams
+{
+ CallHierarchyItem item;
+ MAKE_SWAP_METHOD(CallHierarchyIncomingCallsParams, item)
};
MAKE_REFLECT_STRUCT(CallHierarchyIncomingCallsParams, item)
-
/// Represents an incoming call, e.g. a caller of a method or constructor.
-struct CallHierarchyIncomingCall {
- /// The item that makes the call.
- CallHierarchyItem from;
-
- /// The range at which the calls appear.
- /// This is relative to the caller denoted by `From`.
- std::vector<lsRange> fromRanges;
- MAKE_SWAP_METHOD(CallHierarchyIncomingCall, from, fromRanges)
+struct CallHierarchyIncomingCall
+{
+ /// The item that makes the call.
+ CallHierarchyItem from;
+
+ /// The range at which the calls appear.
+ /// This is relative to the caller denoted by `From`.
+ std::vector<lsRange> fromRanges;
+ MAKE_SWAP_METHOD(CallHierarchyIncomingCall, from, fromRanges)
};
MAKE_REFLECT_STRUCT(CallHierarchyIncomingCall, from, fromRanges)
-
-
-
/// The parameter of a `callHierarchy/outgoingCalls` request.
-struct CallHierarchyOutgoingCallsParams {
- CallHierarchyItem item;
- MAKE_SWAP_METHOD(CallHierarchyOutgoingCallsParams, item)
+struct CallHierarchyOutgoingCallsParams
+{
+ CallHierarchyItem item;
+ MAKE_SWAP_METHOD(CallHierarchyOutgoingCallsParams, item)
};
MAKE_REFLECT_STRUCT(CallHierarchyOutgoingCallsParams, item)
/// Represents an outgoing call, e.g. calling a getter from a method or
/// a method from a constructor etc.
-struct CallHierarchyOutgoingCall {
- /// The item that is called.
- CallHierarchyItem to;
-
- /// The range at which this item is called.
- /// This is the range relative to the caller, and not `To`.
- std::vector<lsRange> fromRanges;
- MAKE_SWAP_METHOD(CallHierarchyOutgoingCall, to, fromRanges)
+struct CallHierarchyOutgoingCall
+{
+ /// The item that is called.
+ CallHierarchyItem to;
+
+ /// The range at which this item is called.
+ /// This is the range relative to the caller, and not `To`.
+ std::vector<lsRange> fromRanges;
+ MAKE_SWAP_METHOD(CallHierarchyOutgoingCall, to, fromRanges)
};
MAKE_REFLECT_STRUCT(CallHierarchyOutgoingCall, to, fromRanges)
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_prepareCallHierarchy, CallHierarchyPrepareParams, optional<std::vector<CallHierarchyItem>>,
+ "textDocument/prepareCallHierarchy"
+)
-DEFINE_REQUEST_RESPONSE_TYPE(td_prepareCallHierarchy, CallHierarchyPrepareParams,
- optional<std::vector<CallHierarchyItem>>, "textDocument/prepareCallHierarchy")
-
-DEFINE_REQUEST_RESPONSE_TYPE(td_incomingCalls, CallHierarchyIncomingCallsParams,
- optional<std::vector<CallHierarchyIncomingCall>>, "callHierarchy/incomingCalls")
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_incomingCalls, CallHierarchyIncomingCallsParams, optional<std::vector<CallHierarchyIncomingCall>>,
+ "callHierarchy/incomingCalls"
+)
-DEFINE_REQUEST_RESPONSE_TYPE(td_outgoingCalls, CallHierarchyOutgoingCallsParams,
- optional<std::vector<CallHierarchyOutgoingCall>>, "callHierarchy/CallHierarchyOutgoingCall")
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_outgoingCalls, CallHierarchyOutgoingCallsParams, optional<std::vector<CallHierarchyOutgoingCall>>,
+ "callHierarchy/CallHierarchyOutgoingCall"
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/code_action.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/code_action.h
index e72d83af90..693b98eff1 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/code_action.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/code_action.h
@@ -5,27 +5,35 @@
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
#include "LibLsp/lsp/CodeActionParams.h"
-namespace QuickAssistProcessor {
+namespace QuickAssistProcessor
+{
- extern const char* SPLIT_JOIN_VARIABLE_DECLARATION_ID;//$NON-NLS-1$
- extern const char* CONVERT_FOR_LOOP_ID;// ;// "org.eclipse.jdt.ls.correction.convertForLoop.assist"; //$NON-NLS-1$
- extern const char* ASSIGN_TO_LOCAL_ID ;// "org.eclipse.jdt.ls.correction.assignToLocal.assist"; //$NON-NLS-1$
- extern const char* ASSIGN_TO_FIELD_ID ;// "org.eclipse.jdt.ls.correction.assignToField.assist"; //$NON-NLS-1$
- extern const char* ASSIGN_PARAM_TO_FIELD_ID ;// "org.eclipse.jdt.ls.correction.assignParamToField.assist"; //$NON-NLS-1$
- extern const char* ASSIGN_ALL_PARAMS_TO_NEW_FIELDS_ID ;// "org.eclipse.jdt.ls.correction.assignAllParamsToNewFields.assist"; //$NON-NLS-1$
- extern const char* ADD_BLOCK_ID ;// "org.eclipse.jdt.ls.correction.addBlock.assist"; //$NON-NLS-1$
- extern const char* EXTRACT_LOCAL_ID ;// "org.eclipse.jdt.ls.correction.extractLocal.assist"; //$NON-NLS-1$
- extern const char* EXTRACT_LOCAL_NOT_REPLACE_ID ;// "org.eclipse.jdt.ls.correction.extractLocalNotReplaceOccurrences.assist"; //$NON-NLS-1$
- extern const char* EXTRACT_CONSTANT_ID ;// "org.eclipse.jdt.ls.correction.extractConstant.assist"; //$NON-NLS-1$
- extern const char* INLINE_LOCAL_ID ;// "org.eclipse.jdt.ls.correction.inlineLocal.assist"; //$NON-NLS-1$
- extern const char* CONVERT_LOCAL_TO_FIELD_ID ;// "org.eclipse.jdt.ls.correction.convertLocalToField.assist"; //$NON-NLS-1$
- extern const char* CONVERT_ANONYMOUS_TO_LOCAL_ID ;// "org.eclipse.jdt.ls.correction.convertAnonymousToLocal.assist"; //$NON-NLS-1$
- extern const char* CONVERT_TO_STRING_BUFFER_ID ;// "org.eclipse.jdt.ls.correction.convertToStringBuffer.assist"; //$NON-NLS-1$
- extern const char* CONVERT_TO_MESSAGE_FORMAT_ID ;// "org.eclipse.jdt.ls.correction.convertToMessageFormat.assist"; //$NON-NLS-1$;
- extern const char* EXTRACT_METHOD_INPLACE_ID ;// "org.eclipse.jdt.ls.correction.extractMethodInplace.assist"; //$NON-NLS-1$;
+extern char const* SPLIT_JOIN_VARIABLE_DECLARATION_ID; //$NON-NLS-1$
+extern char const* CONVERT_FOR_LOOP_ID; // ;// "org.eclipse.jdt.ls.correction.convertForLoop.assist"; //$NON-NLS-1$
+extern char const* ASSIGN_TO_LOCAL_ID; // "org.eclipse.jdt.ls.correction.assignToLocal.assist"; //$NON-NLS-1$
+extern char const* ASSIGN_TO_FIELD_ID; // "org.eclipse.jdt.ls.correction.assignToField.assist"; //$NON-NLS-1$
+extern char const* ASSIGN_PARAM_TO_FIELD_ID; // "org.eclipse.jdt.ls.correction.assignParamToField.assist"; //$NON-NLS-1$
+extern char const*
+ ASSIGN_ALL_PARAMS_TO_NEW_FIELDS_ID; // "org.eclipse.jdt.ls.correction.assignAllParamsToNewFields.assist"; //$NON-NLS-1$
+extern char const* ADD_BLOCK_ID; // "org.eclipse.jdt.ls.correction.addBlock.assist"; //$NON-NLS-1$
+extern char const* EXTRACT_LOCAL_ID; // "org.eclipse.jdt.ls.correction.extractLocal.assist"; //$NON-NLS-1$
+extern char const*
+ EXTRACT_LOCAL_NOT_REPLACE_ID; // "org.eclipse.jdt.ls.correction.extractLocalNotReplaceOccurrences.assist"; //$NON-NLS-1$
+extern char const* EXTRACT_CONSTANT_ID; // "org.eclipse.jdt.ls.correction.extractConstant.assist"; //$NON-NLS-1$
+extern char const* INLINE_LOCAL_ID; // "org.eclipse.jdt.ls.correction.inlineLocal.assist"; //$NON-NLS-1$
+extern char const*
+ CONVERT_LOCAL_TO_FIELD_ID; // "org.eclipse.jdt.ls.correction.convertLocalToField.assist"; //$NON-NLS-1$
+extern char const*
+ CONVERT_ANONYMOUS_TO_LOCAL_ID; // "org.eclipse.jdt.ls.correction.convertAnonymousToLocal.assist"; //$NON-NLS-1$
+extern char const*
+ CONVERT_TO_STRING_BUFFER_ID; // "org.eclipse.jdt.ls.correction.convertToStringBuffer.assist"; //$NON-NLS-1$
+extern char const*
+ CONVERT_TO_MESSAGE_FORMAT_ID; // "org.eclipse.jdt.ls.correction.convertToMessageFormat.assist"; //$NON-NLS-1$;
+extern char const*
+ EXTRACT_METHOD_INPLACE_ID; // "org.eclipse.jdt.ls.correction.extractMethodInplace.assist"; //$NON-NLS-1$;
- extern const char* CONVERT_ANONYMOUS_CLASS_TO_NESTED_COMMAND ;// "convertAnonymousClassToNestedCommand";
-};
+extern char const* CONVERT_ANONYMOUS_CLASS_TO_NESTED_COMMAND; // "convertAnonymousClassToNestedCommand";
+}; // namespace QuickAssistProcessor
/**
* The code action request is sent from the client to the server to compute
* commands for a given text document and range. These commands are
@@ -34,4 +42,6 @@ namespace QuickAssistProcessor {
* Registration Options: TextDocumentRegistrationOptions
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_codeAction, lsCodeActionParams, std::vector<lsCommandWithAny>, "textDocument/codeAction");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_codeAction, lsCodeActionParams, std::vector<lsCommandWithAny>, "textDocument/codeAction"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/code_lens.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/code_lens.h
index b9241de06b..3c18c6e41b 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/code_lens.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/code_lens.h
@@ -3,35 +3,32 @@
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
-struct lsDocumentCodeLensParams {
+struct lsDocumentCodeLensParams
+{
-/**
+ /**
* The document to request code lens for.
*/
- lsTextDocumentIdentifier textDocument;
+ lsTextDocumentIdentifier textDocument;
- MAKE_SWAP_METHOD(lsDocumentCodeLensParams, textDocument);
+ MAKE_SWAP_METHOD(lsDocumentCodeLensParams, textDocument);
};
MAKE_REFLECT_STRUCT(lsDocumentCodeLensParams, textDocument);
-
-
-
-struct lsCodeLens {
- // The range in which this code lens is valid. Should only span a single line.
- lsRange range;
- // The command this code lens represents.
- optional<lsCommandWithAny> command;
- // A data entry field that is preserved on a code lens item between
- // a code lens and a code lens resolve request.
- optional< lsp::Any> data;
-
- MAKE_SWAP_METHOD(lsCodeLens, range, command, data)
+struct lsCodeLens
+{
+ // The range in which this code lens is valid. Should only span a single line.
+ lsRange range;
+ // The command this code lens represents.
+ optional<lsCommandWithAny> command;
+ // A data entry field that is preserved on a code lens item between
+ // a code lens and a code lens resolve request.
+ optional<lsp::Any> data;
+
+ MAKE_SWAP_METHOD(lsCodeLens, range, command, data)
};
MAKE_REFLECT_STRUCT(lsCodeLens, range, command, data)
-
-
/**
* The code lens request is sent from the client to the server to compute
* code lenses for a given text document.
@@ -39,4 +36,3 @@ MAKE_REFLECT_STRUCT(lsCodeLens, range, command, data)
* Registration Options: CodeLensRegistrationOptions
*/
DEFINE_REQUEST_RESPONSE_TYPE(td_codeLens, lsDocumentCodeLensParams, std::vector<lsCodeLens>, "textDocument/codeLens")
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/colorPresentation.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/colorPresentation.h
index c70b6502d2..294d625fbe 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/colorPresentation.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/colorPresentation.h
@@ -1,6 +1,5 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
@@ -9,55 +8,54 @@
#include "documentColor.h"
#include "LibLsp/lsp/lsTextEdit.h"
+struct ColorPresentationParams
+{
-struct ColorPresentationParams {
-
- /**
+ /**
* The text document.
*/
- lsTextDocumentIdentifier textDocument;
+ lsTextDocumentIdentifier textDocument;
- /**
+ /**
* The range in the document where this color appers.
*/
- lsRange range;
+ lsRange range;
- /**
+ /**
* The actual color value for this color range.
*/
- TextDocument::Color color;
- MAKE_SWAP_METHOD(ColorPresentationParams, textDocument, range, color)
+ TextDocument::Color color;
+ MAKE_SWAP_METHOD(ColorPresentationParams, textDocument, range, color)
};
MAKE_REFLECT_STRUCT(ColorPresentationParams, textDocument, range, color)
-
-struct ColorPresentation {
- /**
+struct ColorPresentation
+{
+ /**
* The label of this color presentation. It will be shown on the color
* picker header. By default this is also the text that is inserted when selecting
* this color presentation.
*/
- std::string label;
+ std::string label;
- /**
+ /**
* An edit which is applied to a document when selecting
* this presentation for the color. When `null` the label is used.
*/
- lsTextEdit textEdit;
+ lsTextEdit textEdit;
- /**
+ /**
* An optional array of additional text edits that are applied when
* selecting this color presentation. Edits must not overlap with the main edit nor with themselves.
*/
- std::vector<lsTextEdit> additionalTextEdits;
- MAKE_SWAP_METHOD(ColorPresentation, label, textEdit, additionalTextEdits)
+ std::vector<lsTextEdit> additionalTextEdits;
+ MAKE_SWAP_METHOD(ColorPresentation, label, textEdit, additionalTextEdits)
};
MAKE_REFLECT_STRUCT(ColorPresentation, label, textEdit, additionalTextEdits)
-
-
-DEFINE_REQUEST_RESPONSE_TYPE(td_colorPresentation,
- ColorPresentationParams, std::vector<ColorPresentation>, "textDocument/colorPresentation")
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_colorPresentation, ColorPresentationParams, std::vector<ColorPresentation>, "textDocument/colorPresentation"
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/completion.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/completion.h
index edcf1e1724..50fd5bb4fa 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/completion.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/completion.h
@@ -1,6 +1,5 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
@@ -8,59 +7,52 @@
#include "LibLsp/lsp/lsp_completion.h"
#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
-
// How a completion was triggered
-enum class lsCompletionTriggerKind {
- // Completion was triggered by typing an identifier (24x7 code
- // complete), manual invocation (e.g Ctrl+Space) or via API.
- Invoked = 1,
-
- // Completion was triggered by a trigger character specified by
- // the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
- TriggerCharacter = 2
+enum class lsCompletionTriggerKind
+{
+ // Completion was triggered by typing an identifier (24x7 code
+ // complete), manual invocation (e.g Ctrl+Space) or via API.
+ Invoked = 1,
+
+ // Completion was triggered by a trigger character specified by
+ // the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
+ TriggerCharacter = 2
};
MAKE_REFLECT_TYPE_PROXY(lsCompletionTriggerKind);
-
// Contains additional information about the context in which a completion
// request is triggered.
-struct lsCompletionContext {
- // How the completion was triggered.
- lsCompletionTriggerKind triggerKind = lsCompletionTriggerKind::Invoked;
+struct lsCompletionContext
+{
+ // How the completion was triggered.
+ lsCompletionTriggerKind triggerKind = lsCompletionTriggerKind::Invoked;
- // The trigger character (a single character) that has trigger code complete.
- // Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
- optional<std::string> triggerCharacter;
+ // The trigger character (a single character) that has trigger code complete.
+ // Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
+ optional<std::string> triggerCharacter;
- MAKE_SWAP_METHOD(lsCompletionContext, triggerKind, triggerCharacter);
+ MAKE_SWAP_METHOD(lsCompletionContext, triggerKind, triggerCharacter);
};
MAKE_REFLECT_STRUCT(lsCompletionContext, triggerKind, triggerCharacter);
-struct lsCompletionParams : lsTextDocumentPositionParams {
- // The completion context. This is only available it the client specifies to
- // send this using
- // `ClientCapabilities.textDocument.completion.contextSupport === true`
- optional<lsCompletionContext> context;
-
- MAKE_SWAP_METHOD(lsCompletionParams, textDocument, position, context);
+struct lsCompletionParams : lsTextDocumentPositionParams
+{
+ // The completion context. This is only available it the client specifies to
+ // send this using
+ // `ClientCapabilities.textDocument.completion.contextSupport === true`
+ optional<lsCompletionContext> context;
+ MAKE_SWAP_METHOD(lsCompletionParams, textDocument, position, context);
};
MAKE_REFLECT_STRUCT(lsCompletionParams, textDocument, position, context);
+namespace TextDocumentComplete
+{
-
-
-
-
-
-
-
-namespace TextDocumentComplete{
-
- typedef std::pair< optional<std::vector<lsCompletionItem>>, optional<CompletionList> > Either;
+typedef std::pair<optional<std::vector<lsCompletionItem>>, optional<CompletionList>> Either;
};
-extern void Reflect(Reader& visitor, TextDocumentComplete::Either& value);
+extern void Reflect(Reader& visitor, TextDocumentComplete::Either& value);
/**
* The Completion request is sent from the client to the server to compute
@@ -72,11 +64,4 @@ extern void Reflect(Reader& visitor, TextDocumentComplete::Either& value);
*
* Registration Options: CompletionRegistrationOptions
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_completion, lsCompletionParams, CompletionList , "textDocument/completion")
-
-
-
-
-
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(td_completion, lsCompletionParams, CompletionList, "textDocument/completion")
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/declaration_definition.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/declaration_definition.h
index aa20fce046..c64e42ae18 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/declaration_definition.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/declaration_definition.h
@@ -1,13 +1,11 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
#include "LibLsp/lsp/out_list.h"
-
/**
* The go to declaration request is sent from the client to the server to resolve
* the declaration location of a symbol at a given text document position.
@@ -16,7 +14,9 @@
*
* Since version 3.14.0
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_declaration, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/declaration");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_declaration, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/declaration"
+);
/**
* The goto definition request is sent from the client to the server to resolve
@@ -24,6 +24,6 @@ DEFINE_REQUEST_RESPONSE_TYPE(td_declaration, lsTextDocumentPositionParams, Locat
*
* Registration Options: TextDocumentRegistrationOptions
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_definition, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/definition");
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_definition, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/definition"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/didRenameFiles.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/didRenameFiles.h
index d88d0e1307..93fc01b5db 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/didRenameFiles.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/didRenameFiles.h
@@ -6,39 +6,42 @@
#include "LibLsp/lsp/CodeActionParams.h"
#include "LibLsp/lsp/lsWorkspaceEdit.h"
-
-class FileRenameEvent {
+class FileRenameEvent
+{
public:
- std::string oldUri;
- std::string newUri;
-
- FileRenameEvent() {
- }
-
- FileRenameEvent(std::string oldUri, std::string newUri) {
- this->oldUri = oldUri;
- this->newUri = newUri;
- }
- MAKE_SWAP_METHOD(FileRenameEvent, oldUri, newUri);
+ std::string oldUri;
+ std::string newUri;
+
+ FileRenameEvent()
+ {
+ }
+
+ FileRenameEvent(std::string oldUri, std::string newUri)
+ {
+ this->oldUri = oldUri;
+ this->newUri = newUri;
+ }
+ MAKE_SWAP_METHOD(FileRenameEvent, oldUri, newUri);
};
MAKE_REFLECT_STRUCT(FileRenameEvent, oldUri, newUri);
-class FileRenameParams {
+class FileRenameParams
+{
public:
- std::vector <FileRenameEvent> files;
+ std::vector<FileRenameEvent> files;
- FileRenameParams() {
- }
+ FileRenameParams()
+ {
+ }
- FileRenameParams(std::vector<FileRenameEvent>& files) {
- this->files = files;
- }
- MAKE_SWAP_METHOD(FileRenameParams, files);
+ FileRenameParams(std::vector<FileRenameEvent>& files)
+ {
+ this->files = files;
+ }
+ MAKE_SWAP_METHOD(FileRenameParams, files);
};
MAKE_REFLECT_STRUCT(FileRenameParams, files);
-
DEFINE_REQUEST_RESPONSE_TYPE(td_didRenameFiles, FileRenameParams, optional<lsWorkspaceEdit>, "java/didRenameFiles");
-
DEFINE_REQUEST_RESPONSE_TYPE(td_willRenameFiles, FileRenameParams, optional<lsWorkspaceEdit>, "java/willRenameFiles");
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_change.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_change.h
index 8450bd343a..714dbe0255 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_change.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_change.h
@@ -1,45 +1,43 @@
#pragma once
-
#include "LibLsp/JsonRpc/NotificationInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/lsVersionedTextDocumentIdentifier.h"
#include "LibLsp/lsp/lsRange.h"
#include "LibLsp/lsp/lsDocumentUri.h"
-struct lsTextDocumentContentChangeEvent {
- // The range of the document that changed.
- optional<lsRange> range;
- // The length of the range that got replaced.
- optional<int> rangeLength;
- // The new text of the range/document.
- std::string text;
-
- MAKE_SWAP_METHOD(lsTextDocumentContentChangeEvent, range, rangeLength, text);
+struct lsTextDocumentContentChangeEvent
+{
+ // The range of the document that changed.
+ optional<lsRange> range;
+ // The length of the range that got replaced.
+ optional<int> rangeLength;
+ // The new text of the range/document.
+ std::string text;
+
+ MAKE_SWAP_METHOD(lsTextDocumentContentChangeEvent, range, rangeLength, text);
};
MAKE_REFLECT_STRUCT(lsTextDocumentContentChangeEvent, range, rangeLength, text);
+struct lsTextDocumentDidChangeParams
+{
+ lsVersionedTextDocumentIdentifier textDocument;
+ std::vector<lsTextDocumentContentChangeEvent> contentChanges;
-struct lsTextDocumentDidChangeParams {
- lsVersionedTextDocumentIdentifier textDocument;
- std::vector<lsTextDocumentContentChangeEvent> contentChanges;
-
- /**
+ /**
* Legacy property to support protocol version 1.0 requests.
*/
- optional<lsDocumentUri> uri;
+ optional<lsDocumentUri> uri;
- void swap(lsTextDocumentDidChangeParams& arg) noexcept
- {
- uri.swap(arg.uri);
- contentChanges.swap(arg.contentChanges);
- textDocument.swap(arg.textDocument);
- }
+ void swap(lsTextDocumentDidChangeParams& arg) noexcept
+ {
+ uri.swap(arg.uri);
+ contentChanges.swap(arg.contentChanges);
+ textDocument.swap(arg.textDocument);
+ }
};
-MAKE_REFLECT_STRUCT(lsTextDocumentDidChangeParams,
- textDocument,
- contentChanges, uri);
+MAKE_REFLECT_STRUCT(lsTextDocumentDidChangeParams, textDocument, contentChanges, uri);
/**
* The document change notification is sent from the client to the server to
@@ -48,4 +46,3 @@ MAKE_REFLECT_STRUCT(lsTextDocumentDidChangeParams,
* Registration Options: TextDocumentChangeRegistrationOptions
*/
DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidChange, lsTextDocumentDidChangeParams, "textDocument/didChange");
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_close.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_close.h
index d064819ae9..6d17223d3e 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_close.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_close.h
@@ -1,25 +1,21 @@
#pragma once
-
-
#include "LibLsp/JsonRpc/NotificationInMessage.h"
+namespace TextDocumentDidClose
+{
-
-
-namespace TextDocumentDidClose {
-
- struct Params {
+struct Params
+{
lsTextDocumentIdentifier textDocument;
- void swap(Params& arg) noexcept
- {
- textDocument.swap(arg.textDocument);
- }
-
- };
-
+ void swap(Params& arg) noexcept
+ {
+ textDocument.swap(arg.textDocument);
+ }
};
+}; // namespace TextDocumentDidClose
+
MAKE_REFLECT_STRUCT(TextDocumentDidClose::Params, textDocument);
/**
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_open.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_open.h
index 379f35989f..ba6bb30441 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_open.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_open.h
@@ -1,28 +1,26 @@
#pragma once
-
#include "LibLsp/JsonRpc/NotificationInMessage.h"
#include "LibLsp/lsp/lsTextDocumentItem.h"
// Open, view, change, close file
-namespace TextDocumentDidOpen {
+namespace TextDocumentDidOpen
+{
- struct Params {
+struct Params
+{
lsTextDocumentItem textDocument;
-
-
- /**
+ /**
* Legacy property to support protocol version 1.0 requests.
*/
optional<std::string> text;
- MAKE_SWAP_METHOD(TextDocumentDidOpen::Params, textDocument, text);
+ MAKE_SWAP_METHOD(TextDocumentDidOpen::Params, textDocument, text);
+};
- };
-
-}
+} // namespace TextDocumentDidOpen
MAKE_REFLECT_STRUCT(TextDocumentDidOpen::Params, textDocument, text);
/**
@@ -32,8 +30,7 @@ MAKE_REFLECT_STRUCT(TextDocumentDidOpen::Params, textDocument, text);
* using the document's uri.
*
* Registration Options: TextDocumentRegistrationOptions
- */;
-
+ */
+;
DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidOpen, TextDocumentDidOpen::Params, "textDocument/didOpen");
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_save.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_save.h
index 5d00af0c20..09e3311832 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_save.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/did_save.h
@@ -1,24 +1,23 @@
#pragma once
-
-
#include "LibLsp/JsonRpc/NotificationInMessage.h"
+namespace TextDocumentDidSave
+{
-namespace TextDocumentDidSave {
-
- struct Params {
+struct Params
+{
// The document that was saved.
lsTextDocumentIdentifier textDocument;
// Optional the content when saved. Depends on the includeText value
// when the save notifcation was requested.
- optional<std::string> text;
-
- MAKE_SWAP_METHOD(TextDocumentDidSave::Params, textDocument, text);
- };
+ optional<std::string> text;
+ MAKE_SWAP_METHOD(TextDocumentDidSave::Params, textDocument, text);
};
+
+}; // namespace TextDocumentDidSave
MAKE_REFLECT_STRUCT(TextDocumentDidSave::Params, textDocument, text);
/**
@@ -28,4 +27,3 @@ MAKE_REFLECT_STRUCT(TextDocumentDidSave::Params, textDocument, text);
* Registration Options: TextDocumentSaveRegistrationOptions
*/
DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidSave, TextDocumentDidSave::Params, "textDocument/didSave");
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/documentColor.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/documentColor.h
index 9aeeadba05..86c6274e93 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/documentColor.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/documentColor.h
@@ -6,13 +6,14 @@
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
#include "LibLsp/lsp/lsRange.h"
#include <vector>
-struct DocumentColorParams {
- /**
+struct DocumentColorParams
+{
+ /**
* The text document.
*/
- lsTextDocumentIdentifier textDocument;
- MAKE_SWAP_METHOD(DocumentColorParams, textDocument);
+ lsTextDocumentIdentifier textDocument;
+ MAKE_SWAP_METHOD(DocumentColorParams, textDocument);
};
MAKE_REFLECT_STRUCT(DocumentColorParams, textDocument);
@@ -27,47 +28,51 @@ MAKE_REFLECT_STRUCT(DocumentColorParams, textDocument);
* Since version 3.6.0
*/
-namespace TextDocument {
- struct Color {
- /**
+namespace TextDocument
+{
+struct Color
+{
+ /**
* The red component of this color in the range [0-1].
*/
- double red = 0;
+ double red = 0;
- /**
+ /**
* The green component of this color in the range [0-1].
*/
- double green = 0;
+ double green = 0;
- /**
+ /**
* The blue component of this color in the range [0-1].
*/
- double blue = 0;
+ double blue = 0;
- /**
+ /**
* The alpha component of this color in the range [0-1].
*/
- double alpha = 0;
- MAKE_SWAP_METHOD(TextDocument::Color, red, green, blue, alpha)
- };
-}
+ double alpha = 0;
+ MAKE_SWAP_METHOD(TextDocument::Color, red, green, blue, alpha)
+};
+} // namespace TextDocument
MAKE_REFLECT_STRUCT(TextDocument::Color, red, green, blue, alpha)
-
-struct ColorInformation {
- /**
+struct ColorInformation
+{
+ /**
* The range in the document where this color appers.
*/
- lsRange range;
+ lsRange range;
- /**
+ /**
* The actual color value for this color range.
*/
- TextDocument::Color color;
- MAKE_SWAP_METHOD(ColorInformation, range, color)
+ TextDocument::Color color;
+ MAKE_SWAP_METHOD(ColorInformation, range, color)
};
-MAKE_REFLECT_STRUCT(ColorInformation,range,color)
+MAKE_REFLECT_STRUCT(ColorInformation, range, color)
-DEFINE_REQUEST_RESPONSE_TYPE(td_documentColor, DocumentColorParams,std::vector<ColorInformation>, "textDocument/documentColor");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_documentColor, DocumentColorParams, std::vector<ColorInformation>, "textDocument/documentColor"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/document_link.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/document_link.h
index 92f02b24f1..52d35bc658 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/document_link.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/document_link.h
@@ -2,43 +2,43 @@
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+#include "LibLsp/lsp/lsRange.h"
+#include "LibLsp/lsp/lsAny.h"
+namespace TextDocumentDocumentLink
+{
-namespace TextDocumentDocumentLink {
-
- struct Params {
+struct Params
+{
// The document to provide document links for.
lsTextDocumentIdentifier textDocument;
- MAKE_SWAP_METHOD(Params, textDocument)
- };
-
+ MAKE_SWAP_METHOD(Params, textDocument)
};
-MAKE_REFLECT_STRUCT(TextDocumentDocumentLink::Params, textDocument);
-
-
+}; // namespace TextDocumentDocumentLink
+MAKE_REFLECT_STRUCT(TextDocumentDocumentLink::Params, textDocument);
// A document link is a range in a text document that links to an internal or
// external resource, like another text document or a web site.
-struct lsDocumentLink {
- // The range this link applies to.
- lsRange range;
- // The uri this link points to. If missing a resolve request is sent later.
- optional<lsDocumentUri> target;
-
- optional<lsp::Any> data;
+struct lsDocumentLink
+{
+ // The range this link applies to.
+ lsRange range;
+ // The uri this link points to. If missing a resolve request is sent later.
+ optional<lsDocumentUri> target;
- MAKE_SWAP_METHOD(lsDocumentLink, range, target, data)
+ optional<lsp::Any> data;
+ MAKE_SWAP_METHOD(lsDocumentLink, range, target, data)
};
-MAKE_REFLECT_STRUCT(lsDocumentLink, range, target,data);
-
-
-DEFINE_REQUEST_RESPONSE_TYPE(td_links, TextDocumentDocumentLink::Params, std::vector<lsDocumentLink>, "textDocument/documentLink");
+MAKE_REFLECT_STRUCT(lsDocumentLink, range, target, data);
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_links, TextDocumentDocumentLink::Params, std::vector<lsDocumentLink>, "textDocument/documentLink"
+);
/**
* The document link resolve request is sent from the client to the server to resolve the target of a given document link.
*/
DEFINE_REQUEST_RESPONSE_TYPE(td_linkResolve, lsDocumentLink, lsDocumentLink, "documentLink/resolve");
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/document_symbol.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/document_symbol.h
index b01ffe0dc7..400bed91df 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/document_symbol.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/document_symbol.h
@@ -1,29 +1,26 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/symbol.h"
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
- /**
+/**
* The document symbol request is sent from the client to the server to list all symbols found in a given text document.
*/
-struct lsDocumentSymbolParams {
- lsTextDocumentIdentifier textDocument;
- MAKE_SWAP_METHOD(lsDocumentSymbolParams, textDocument)
+struct lsDocumentSymbolParams
+{
+ lsTextDocumentIdentifier textDocument;
+ MAKE_SWAP_METHOD(lsDocumentSymbolParams, textDocument)
};
MAKE_REFLECT_STRUCT(lsDocumentSymbolParams, textDocument);
-
-
-struct TextDocumentDocumentSymbol{
- typedef std::pair< optional<lsSymbolInformation> , optional<lsDocumentSymbol> > Either;
+struct TextDocumentDocumentSymbol
+{
+ typedef std::pair<optional<lsSymbolInformation>, optional<lsDocumentSymbol>> Either;
};
void Reflect(Reader& visitor, TextDocumentDocumentSymbol::Either& value);
-
-
/**
* The document symbol request is sent from the client to the server to list all
* symbols found in a given text document.
@@ -47,9 +44,6 @@ void Reflect(Reader& visitor, TextDocumentDocumentSymbol::Either& value);
// std::vector<TextDocumentDocumentSymbol::Either> );
//
-DEFINE_REQUEST_RESPONSE_TYPE(td_symbol,
- lsDocumentSymbolParams,
- std::vector< lsDocumentSymbol >,"textDocument/documentSymbol" );
-
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_symbol, lsDocumentSymbolParams, std::vector<lsDocumentSymbol>, "textDocument/documentSymbol"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/foldingRange.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/foldingRange.h
index f863b4991d..fa6e5000a9 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/foldingRange.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/foldingRange.h
@@ -1,62 +1,61 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "document_symbol.h"
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
-
-struct FoldingRangeRequestParams {
- /**
+struct FoldingRangeRequestParams
+{
+ /**
* The text document.
*/
- lsTextDocumentIdentifier textDocument;
- MAKE_SWAP_METHOD(FoldingRangeRequestParams, textDocument)
+ lsTextDocumentIdentifier textDocument;
+ MAKE_SWAP_METHOD(FoldingRangeRequestParams, textDocument)
};
MAKE_REFLECT_STRUCT(FoldingRangeRequestParams, textDocument)
-
-struct FoldingRange {
- /**
+struct FoldingRange
+{
+ /**
* The zero-based line number from where the folded range starts.
*/
- int startLine;
+ int startLine;
- /**
+ /**
* The zero-based line number where the folded range ends.
*/
- int endLine;
+ int endLine;
- /**
+ /**
* The zero-based character offset from where the folded range starts. If not defined, defaults
* to the length of the start line.
*/
- int startCharacter;
+ int startCharacter;
- /**
+ /**
* The zero-based character offset before the folded range ends. If not defined, defaults to the
* length of the end line.
*/
- int endCharacter;
+ int endCharacter;
- /**
+ /**
* Describes the kind of the folding range such as `comment' or 'region'. The kind
* is used to categorize folding ranges and used by commands like 'Fold all comments'. See
* FoldingRangeKind for an enumeration of standardized kinds.
*/
- std::string kind;
+ std::string kind;
- MAKE_SWAP_METHOD(FoldingRange, startLine, endLine, startCharacter, endCharacter, kind)
+ MAKE_SWAP_METHOD(FoldingRange, startLine, endLine, startCharacter, endCharacter, kind)
};
-MAKE_REFLECT_STRUCT(FoldingRange,startLine,endLine,startCharacter,endCharacter,kind)
-
+MAKE_REFLECT_STRUCT(FoldingRange, startLine, endLine, startCharacter, endCharacter, kind)
/**
* The folding range request is sent from the client to the server to return all folding
* ranges found in a given text document.
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_foldingRange, FoldingRangeRequestParams, std::vector<FoldingRange>, "textDocument/foldingRange");
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_foldingRange, FoldingRangeRequestParams, std::vector<FoldingRange>, "textDocument/foldingRange"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/formatting.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/formatting.h
index 49b7883b5f..2b54716353 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/formatting.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/formatting.h
@@ -4,22 +4,23 @@
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
+namespace TextDocumentFormatting
+{
-namespace TextDocumentFormatting {
-
- struct Params {
- /**
+struct Params
+{
+ /**
* The document to format.
*/
lsTextDocumentIdentifier textDocument;
- /**
+ /**
* The format options.
*/
lsFormattingOptions options;
- MAKE_SWAP_METHOD(Params, textDocument, options);
- };
-
+ MAKE_SWAP_METHOD(Params, textDocument, options);
};
+
+}; // namespace TextDocumentFormatting
MAKE_REFLECT_STRUCT(TextDocumentFormatting::Params, textDocument, options);
/**
* The document formatting request is sent from the client to the server to
@@ -27,6 +28,6 @@ MAKE_REFLECT_STRUCT(TextDocumentFormatting::Params, textDocument, options);
*
* Registration Options: TextDocumentRegistrationOptions
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_formatting, TextDocumentFormatting::Params,
- std::vector<lsTextEdit>, "textDocument/formatting");
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_formatting, TextDocumentFormatting::Params, std::vector<lsTextEdit>, "textDocument/formatting"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/highlight.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/highlight.h
index 0e01416126..ed7db9a11b 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/highlight.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/highlight.h
@@ -13,6 +13,6 @@
* Registration Options: TextDocumentRegistrationOptions
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_highlight, lsTextDocumentPositionParams,
- std::vector<lsDocumentHighlight>, "textDocument/documentHighlight");
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_highlight, lsTextDocumentPositionParams, std::vector<lsDocumentHighlight>, "textDocument/documentHighlight"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/hover.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/hover.h
index f2c15c3c44..0724ac7933 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/hover.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/hover.h
@@ -1,6 +1,5 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
@@ -16,27 +15,27 @@
namespace TextDocumentHover
{
- typedef optional< std::vector< std::pair<optional<std::string>, optional<lsMarkedString>> > > Left;
- typedef std::pair< Left, optional<MarkupContent> > Either;
- struct Result {
- /**
+typedef optional<std::vector<std::pair<optional<std::string>, optional<lsMarkedString>>>> Left;
+typedef std::pair<Left, optional<MarkupContent>> Either;
+struct Result
+{
+ /**
* The hover's content as markdown
*/
- Either contents;
+ Either contents;
- /**
+ /**
* An optional range
*/
- optional<lsRange> range;
+ optional<lsRange> range;
- MAKE_SWAP_METHOD(Result, contents, range)
- };
-}
+ MAKE_SWAP_METHOD(Result, contents, range)
+};
+} // namespace TextDocumentHover
MAKE_REFLECT_STRUCT(TextDocumentHover::Result, contents, range);
-extern void Reflect(Reader& visitor, std::pair<optional<std::string>, optional<lsMarkedString>>& value);
-extern void Reflect(Reader& visitor, TextDocumentHover::Either& value);
-
+extern void Reflect(Reader& visitor, std::pair<optional<std::string>, optional<lsMarkedString>>& value);
+extern void Reflect(Reader& visitor, TextDocumentHover::Either& value);
DEFINE_REQUEST_RESPONSE_TYPE(td_hover, lsTextDocumentPositionParams, TextDocumentHover::Result, "textDocument/hover")
@@ -52,4 +51,3 @@ DEFINE_REQUEST_RESPONSE_TYPE(td_hover, lsTextDocumentPositionParams, TextDocumen
// jsonrpc,
// id,
// result);
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/implementation.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/implementation.h
index 0d7851cb81..f0b69646dd 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/implementation.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/implementation.h
@@ -1,10 +1,8 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/lsp/out_list.h"
-
/**
* The goto implementation request is sent from the client to the server to resolve
* the implementation location of a symbol at a given text document position.
@@ -13,4 +11,6 @@
*
* Since version 3.6.0
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_implementation, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/implementation"); \ No newline at end of file
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_implementation, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/implementation"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/inlayHint.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/inlayHint.h
new file mode 100644
index 0000000000..09e75337ab
--- /dev/null
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/inlayHint.h
@@ -0,0 +1,169 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+#include "LibLsp/lsp/lsRange.h"
+#include "LibLsp/lsp/location_type.h"
+#include "LibLsp/lsp/lsCommand.h"
+#include "LibLsp/lsp/lsTextEdit.h"
+#include "LibLsp/lsp/lsAny.h"
+
+namespace TextDocumentInlayHint
+{
+
+struct Params
+{
+ // The text document
+ lsTextDocumentIdentifier textDocument;
+ // The visible document range for which inlay hints should be computed.
+ lsRange range;
+
+ MAKE_SWAP_METHOD(Params, textDocument, range)
+};
+
+}; // namespace TextDocumentInlayHint
+MAKE_REFLECT_STRUCT(TextDocumentInlayHint::Params, textDocument, range);
+
+struct lsInlayHintLabelPart
+{
+
+ /**
+ * The value of this label part.
+ */
+ std::string value;
+
+ /**
+ * The tooltip text when you hover over this label part. Depending on
+ * the client capability `inlayHint.resolveSupport` clients might resolve
+ * this property late using the resolve request.
+ */
+ optional<std::string> tooltip;
+
+ /**
+ * An optional source code location that represents this
+ * label part.
+ *
+ * The editor will use this location for the hover and for code navigation
+ * features: This part will become a clickable link that resolves to the
+ * definition of the symbol at the given location (not necessarily the
+ * location itself), it shows the hover that shows at the given location,
+ * and it shows a context menu with further code navigation commands.
+ *
+ * Depending on the client capability `inlayHint.resolveSupport` clients
+ * might resolve this property late using the resolve request.
+ */
+ optional<lsLocation> location;
+
+ /**
+ * An optional command for this label part.
+ *
+ * Depending on the client capability `inlayHint.resolveSupport` clients
+ * might resolve this property late using the resolve request.
+ */
+ optional<lsCommand<lsp::Any>> command;
+
+ MAKE_SWAP_METHOD(lsInlayHintLabelPart, value, tooltip, location, command)
+};
+
+MAKE_REFLECT_STRUCT(lsInlayHintLabelPart, value, tooltip, location, command);
+
+enum class lsInlayHintKind
+{
+
+ // An inlay hint that for a type annotation.
+ Type = 1,
+
+ // An inlay hint that is for a parameter.
+ Parameter = 2
+};
+
+MAKE_REFLECT_TYPE_PROXY(lsInlayHintKind);
+
+/**
+ * a inlay hint is displayed in the editor right next to normal code, it is only readable text
+ * that acts like a hint, for example parameter names in function calls are displayed in editors
+ * as inlay hints
+ */
+struct lsInlayHint
+{
+
+ /**
+ * The position of this hint.
+ *
+ * If multiple hints have the same position, they will be shown in the order
+ * they appear in the response.
+ */
+ lsPosition position;
+
+ /**
+ * The label of this hint. A human readable string or an array of
+ * InlayHintLabelPart label parts.
+ *
+ * *Note* that neither the string nor the label part can be empty.
+ */
+ std::string label;
+
+ /**
+ * The kind of this hint. Can be omitted in which case the client
+ * should fall back to a reasonable default.
+ */
+ optional<lsInlayHintKind> kind;
+
+ /**
+ * Optional text edits that are performed when accepting this inlay hint.
+ *
+ * *Note* that edits are expected to change the document so that the inlay
+ * hint (or its nearest variant) is now part of the document and the inlay
+ * hint itself is now obsolete.
+ *
+ * Depending on the client capability `inlayHint.resolveSupport` clients
+ * might resolve this property late using the resolve request.
+ */
+ optional<std::vector<lsTextEdit>> textEdits;
+
+ /**
+ * The tooltip text when you hover over this item.
+ *
+ * Depending on the client capability `inlayHint.resolveSupport` clients
+ * might resolve this property late using the resolve request.
+ */
+ optional<std::string> tooltip;
+
+ /**
+ * Render padding before the hint.
+ *
+ * Note: Padding should use the editor's background color, not the
+ * background color of the hint itself. That means padding can be used
+ * to visually align/separate an inlay hint.
+ */
+ optional<bool> paddingLeft;
+
+ /**
+ * Render padding after the hint.
+ *
+ * Note: Padding should use the editor's background color, not the
+ * background color of the hint itself. That means padding can be used
+ * to visually align/separate an inlay hint.
+ */
+ optional<bool> paddingRight;
+
+ /**
+ * A data entry field that is preserved on an inlay hint between
+ * a `textDocument/inlayHint` and a `inlayHint/resolve` request.
+ */
+ optional<lsp::Any> data;
+
+ MAKE_SWAP_METHOD(lsInlayHint, position, label, kind, textEdits, tooltip, paddingLeft, paddingRight, data)
+};
+
+MAKE_REFLECT_STRUCT(lsInlayHint, position, label, kind, textEdits, tooltip, paddingLeft, paddingRight, data)
+
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_inlayHint, TextDocumentInlayHint::Params, std::vector<lsInlayHint>, "textDocument/inlayHint"
+);
+
+/**
+ * The document link resolve request is sent from the client to the server to resolve the target of a given document link.
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_inlayHintResolve, lsInlayHint, lsInlayHint, "inlayHint/resolve");
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/linkedEditingRange.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/linkedEditingRange.h
index dfac99d378..8b9b217ecb 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/linkedEditingRange.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/linkedEditingRange.h
@@ -1,6 +1,5 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/lsAny.h"
@@ -8,44 +7,35 @@
#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
#include "LibLsp/lsp/lsRange.h"
-
-
struct LinkedEditingRangeParams
{
- lsTextDocumentIdentifier textDocument;
- lsPosition position;
+ lsTextDocumentIdentifier textDocument;
+ lsPosition position;
- MAKE_SWAP_METHOD(LinkedEditingRangeParams,
- textDocument,
- position)
+ MAKE_SWAP_METHOD(LinkedEditingRangeParams, textDocument, position)
};
-MAKE_REFLECT_STRUCT(LinkedEditingRangeParams,
- textDocument,
- position)
-
+MAKE_REFLECT_STRUCT(LinkedEditingRangeParams, textDocument, position)
struct LinkedEditingRanges
{
- /**
+ /**
* A list of ranges that can be renamed together. The ranges must have
* identical length and contain identical text content. The ranges cannot overlap.
*/
- std::vector<lsRange> ranges;
+ std::vector<lsRange> ranges;
- /**
+ /**
* An optional word pattern (regular expression) that describes valid contents for
* the given ranges. If no pattern is provided, the client configuration's word
* pattern will be used.
*/
- optional<std::string> wordPattern;
- MAKE_SWAP_METHOD(LinkedEditingRanges,
- ranges,
- wordPattern)
+ optional<std::string> wordPattern;
+ MAKE_SWAP_METHOD(LinkedEditingRanges, ranges, wordPattern)
};
-MAKE_REFLECT_STRUCT(LinkedEditingRanges,
- ranges,
- wordPattern)
-DEFINE_REQUEST_RESPONSE_TYPE(td_linkedEditingRange, LinkedEditingRangeParams,
- optional<std::vector<LinkedEditingRanges >>,"textDocument/linkedEditingRange")
+MAKE_REFLECT_STRUCT(LinkedEditingRanges, ranges, wordPattern)
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_linkedEditingRange, LinkedEditingRangeParams, optional<std::vector<LinkedEditingRanges>>,
+ "textDocument/linkedEditingRange"
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/onTypeFormatting.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/onTypeFormatting.h
index ada2162d12..a4cff0264f 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/onTypeFormatting.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/onTypeFormatting.h
@@ -1,6 +1,5 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
@@ -9,29 +8,22 @@
#include "LibLsp/lsp/lsRange.h"
#include "LibLsp/lsp/lsTextEdit.h"
-
struct lsDocumentOnTypeFormattingParams
{
- lsTextDocumentIdentifier textDocument;
- lsFormattingOptions options;
+ lsTextDocumentIdentifier textDocument;
+ lsFormattingOptions options;
- lsPosition position;
+ lsPosition position;
- /**
+ /**
* The character that has been typed.
*/
- std::string ch;
+ std::string ch;
- MAKE_SWAP_METHOD(lsDocumentOnTypeFormattingParams,
- textDocument,
- position,
- options, ch);
+ MAKE_SWAP_METHOD(lsDocumentOnTypeFormattingParams, textDocument, position, options, ch);
};
-MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingParams,
- textDocument,
- position,
- options,ch);
+MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingParams, textDocument, position, options, ch);
/**
* The document range formatting request is sent from the client to the
@@ -39,6 +31,6 @@ MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingParams,
*
* Registration Options: TextDocumentRegistrationOptions
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_onTypeFormatting,
- lsDocumentOnTypeFormattingParams, std::vector<lsTextEdit>, "textDocument/onTypeFormatting");
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_onTypeFormatting, lsDocumentOnTypeFormattingParams, std::vector<lsTextEdit>, "textDocument/onTypeFormatting"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/prepareRename.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/prepareRename.h
index 1ffe5456f7..2564928d6d 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/prepareRename.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/prepareRename.h
@@ -12,29 +12,27 @@
*
* Registration Options: TextDocumentRegistrationOptions
*/
-struct PrepareRenameResult{
- /**
+struct PrepareRenameResult
+{
+ /**
* The range of the string to rename
*/
- lsRange range;
+ lsRange range;
-/**
+ /**
* A placeholder text of the string content to be renamed.
*/
- std::string placeholder;
-
- MAKE_SWAP_METHOD(PrepareRenameResult, range, placeholder)
+ std::string placeholder;
+ MAKE_SWAP_METHOD(PrepareRenameResult, range, placeholder)
};
-MAKE_REFLECT_STRUCT(PrepareRenameResult,range,placeholder)
-
-
-
-typedef std::pair< optional< lsRange>, optional<PrepareRenameResult>> TextDocumentPrepareRenameResult;
-extern void Reflect(Reader& visitor, TextDocumentPrepareRenameResult& value);
+MAKE_REFLECT_STRUCT(PrepareRenameResult, range, placeholder)
+typedef std::pair<optional<lsRange>, optional<PrepareRenameResult>> TextDocumentPrepareRenameResult;
+extern void Reflect(Reader& visitor, TextDocumentPrepareRenameResult& value);
-DEFINE_REQUEST_RESPONSE_TYPE(td_prepareRename,
- lsTextDocumentPositionParams, TextDocumentPrepareRenameResult, "textDocument/prepareRename");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_prepareRename, lsTextDocumentPositionParams, TextDocumentPrepareRenameResult, "textDocument/prepareRename"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/publishDiagnostics.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/publishDiagnostics.h
index 8272df10e8..7929e6ba0d 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/publishDiagnostics.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/publishDiagnostics.h
@@ -4,25 +4,25 @@
#include "LibLsp/lsp/lsp_diagnostic.h"
// Diagnostics
-namespace TextDocumentPublishDiagnostics{
- struct Params {
+namespace TextDocumentPublishDiagnostics
+{
+struct Params
+{
// The URI for which diagnostic information is reported.
lsDocumentUri uri;
// An array of diagnostic information items.
std::vector<lsDiagnostic> diagnostics;
- MAKE_SWAP_METHOD(Params,uri,diagnostics);
- };
-
-
+ MAKE_SWAP_METHOD(Params, uri, diagnostics);
};
-MAKE_REFLECT_STRUCT(TextDocumentPublishDiagnostics::Params,
- uri,
- diagnostics);
+
+}; // namespace TextDocumentPublishDiagnostics
+MAKE_REFLECT_STRUCT(TextDocumentPublishDiagnostics::Params, uri, diagnostics);
/**
* Diagnostics notifications are sent from the server to the client to
* signal results of validation runs.
*/
-DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentPublishDiagnostics, TextDocumentPublishDiagnostics::Params, "textDocument/publishDiagnostics");
-
+DEFINE_NOTIFICATION_TYPE(
+ Notify_TextDocumentPublishDiagnostics, TextDocumentPublishDiagnostics::Params, "textDocument/publishDiagnostics"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/range_formatting.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/range_formatting.h
index c3c5ff0d0b..174fa828bd 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/range_formatting.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/range_formatting.h
@@ -1,26 +1,19 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/lsFormattingOptions.h"
+struct lsTextDocumentRangeFormattingParams
+{
+ lsTextDocumentIdentifier textDocument;
+ lsRange range;
+ lsFormattingOptions options;
-struct lsTextDocumentRangeFormattingParams {
- lsTextDocumentIdentifier textDocument;
- lsRange range;
- lsFormattingOptions options;
-
- MAKE_SWAP_METHOD(lsTextDocumentRangeFormattingParams,
- textDocument,
- range,
- options)
+ MAKE_SWAP_METHOD(lsTextDocumentRangeFormattingParams, textDocument, range, options)
};
-MAKE_REFLECT_STRUCT(lsTextDocumentRangeFormattingParams,
- textDocument,
- range,
- options);
+MAKE_REFLECT_STRUCT(lsTextDocumentRangeFormattingParams, textDocument, range, options);
/**
* The document range formatting request is sent from the client to the
@@ -28,8 +21,6 @@ MAKE_REFLECT_STRUCT(lsTextDocumentRangeFormattingParams,
*
* Registration Options: TextDocumentRegistrationOptions
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_rangeFormatting, lsTextDocumentRangeFormattingParams, std::vector<lsTextEdit>,
- "textDocument/rangeFormatting");
-
-
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_rangeFormatting, lsTextDocumentRangeFormattingParams, std::vector<lsTextEdit>, "textDocument/rangeFormatting"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/references.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/references.h
index 46782c3d6d..4977bf8e53 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/references.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/references.h
@@ -1,41 +1,30 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/symbol.h"
+namespace TextDocumentReferences
+{
-namespace TextDocumentReferences {
-
- struct lsReferenceContext {
+struct lsReferenceContext
+{
// Include the declaration of the current symbol.
- optional<bool> includeDeclaration;
- MAKE_REFLECT_STRUCT(lsReferenceContext,
- includeDeclaration)
- };
- struct Params {
+ optional<bool> includeDeclaration;
+ MAKE_REFLECT_STRUCT(lsReferenceContext, includeDeclaration)
+};
+struct Params
+{
lsTextDocumentIdentifier textDocument;
lsPosition position;
lsReferenceContext context;
- MAKE_SWAP_METHOD(Params,
- textDocument,
- position,
- context)
-
- };
-
+ MAKE_SWAP_METHOD(Params, textDocument, position, context)
};
-MAKE_REFLECT_STRUCT(TextDocumentReferences::lsReferenceContext,
- includeDeclaration);
-MAKE_REFLECT_STRUCT(TextDocumentReferences::Params,
- textDocument,
- position,
- context);
-
-
+}; // namespace TextDocumentReferences
+MAKE_REFLECT_STRUCT(TextDocumentReferences::lsReferenceContext, includeDeclaration);
+MAKE_REFLECT_STRUCT(TextDocumentReferences::Params, textDocument, position, context);
/**
* The references request is sent from the client to the server to resolve
@@ -44,5 +33,6 @@ MAKE_REFLECT_STRUCT(TextDocumentReferences::Params,
*
* Registration Options: TextDocumentRegistrationOptions
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_references, TextDocumentReferences::Params,
- std::vector<lsLocation>, "textDocument/references");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_references, TextDocumentReferences::Params, std::vector<lsLocation>, "textDocument/references"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/rename.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/rename.h
index 8b6d085910..c928638509 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/rename.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/rename.h
@@ -1,15 +1,16 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/lsWorkspaceEdit.h"
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
-namespace TextDocumentRename {
+namespace TextDocumentRename
+{
- struct Params {
+struct Params
+{
// The document to format.
lsTextDocumentIdentifier textDocument;
@@ -20,17 +21,11 @@ namespace TextDocumentRename {
// request must return a [ResponseError](#ResponseError) with an
// appropriate message set.
std::string newName;
- MAKE_SWAP_METHOD(Params,
- textDocument,
- position,
- newName);
- };
-
+ MAKE_SWAP_METHOD(Params, textDocument, position, newName);
};
-MAKE_REFLECT_STRUCT(TextDocumentRename::Params,
- textDocument,
- position,
- newName);
+
+}; // namespace TextDocumentRename
+MAKE_REFLECT_STRUCT(TextDocumentRename::Params, textDocument, position, newName);
/**
* The rename request is sent from the client to the server to do a
* workspace wide rename of a symbol.
@@ -38,4 +33,3 @@ MAKE_REFLECT_STRUCT(TextDocumentRename::Params,
* Registration Options: TextDocumentRegistrationOptions
*/
DEFINE_REQUEST_RESPONSE_TYPE(td_rename, TextDocumentRename::Params, lsWorkspaceEdit, "textDocument/rename");
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCodeLens.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCodeLens.h
index 0723985160..d28be9ada2 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCodeLens.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCodeLens.h
@@ -1,10 +1,8 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "code_lens.h"
DEFINE_REQUEST_RESPONSE_TYPE(codeLens_resolve, lsCodeLens, lsCodeLens, "codeLens/resolve")
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCompletionItem.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCompletionItem.h
index f5576894ed..094bff25de 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCompletionItem.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCompletionItem.h
@@ -1,6 +1,5 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
@@ -14,8 +13,3 @@
* information for a given completion item.
*/
DEFINE_REQUEST_RESPONSE_TYPE(completionItem_resolve, lsCompletionItem, lsCompletionItem, "completionItem/resolve");
-
-
-
-
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveTypeHierarchy.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveTypeHierarchy.h
index 8b5f115af7..89d60ec0e1 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveTypeHierarchy.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveTypeHierarchy.h
@@ -1,31 +1,32 @@
#pragma once
-
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/symbol.h"
#include "typeHierarchy.h"
-struct ResolveTypeHierarchyItemParams {
- /**
+struct ResolveTypeHierarchyItemParams
+{
+ /**
* The hierarchy item to resolve.
*/
- TypeHierarchyItem item;
+ TypeHierarchyItem item;
- /**
+ /**
* The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level.
*/
- optional<int> resolve;
+ optional<int> resolve;
- /**
+ /**
* The direction of the type hierarchy resolution.
*/
- TypeHierarchyDirection direction;
- MAKE_SWAP_METHOD(ResolveTypeHierarchyItemParams, item, resolve, direction)
+ TypeHierarchyDirection direction;
+ MAKE_SWAP_METHOD(ResolveTypeHierarchyItemParams, item, resolve, direction)
};
-MAKE_REFLECT_STRUCT(ResolveTypeHierarchyItemParams,item,resolve,direction)
-DEFINE_REQUEST_RESPONSE_TYPE(typeHierarchy_resolve, ResolveTypeHierarchyItemParams, TypeHierarchyItem, "typeHierarchy/resolve")
+MAKE_REFLECT_STRUCT(ResolveTypeHierarchyItemParams, item, resolve, direction)
+DEFINE_REQUEST_RESPONSE_TYPE(
+ typeHierarchy_resolve, ResolveTypeHierarchyItemParams, TypeHierarchyItem, "typeHierarchy/resolve"
+)
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/selectionRange.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/selectionRange.h
index 2c908bd57f..f74307e4ba 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/selectionRange.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/selectionRange.h
@@ -1,52 +1,53 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/lsPosition.h"
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
-struct SelectionRangeParams {
- /**
+struct SelectionRangeParams
+{
+ /**
* The text document.
*/
- lsTextDocumentIdentifier textDocument;
+ lsTextDocumentIdentifier textDocument;
- /**
+ /**
* The positions inside the text document.
*/
- std::vector<lsPosition> positions;
-
- MAKE_SWAP_METHOD(SelectionRangeParams, textDocument, positions)
+ std::vector<lsPosition> positions;
+ MAKE_SWAP_METHOD(SelectionRangeParams, textDocument, positions)
};
MAKE_REFLECT_STRUCT(SelectionRangeParams, textDocument, positions)
-struct SelectionRange {
- /**
+struct SelectionRange
+{
+ /**
* The [range](#Range) of this selection range.
*/
- lsRange range;
+ lsRange range;
- /**
+ /**
* The parent selection range containing this range. Therefore `parent.range` must contain `this.range`.
*/
- optional<SelectionRange*> parent;
- MAKE_SWAP_METHOD(SelectionRange, range, parent)
+ optional<SelectionRange*> parent;
+ MAKE_SWAP_METHOD(SelectionRange, range, parent)
};
-extern void Reflect(Reader& visitor, optional<SelectionRange*>& value);
+extern void Reflect(Reader& visitor, optional<SelectionRange*>& value);
extern void Reflect(Writer& visitor, SelectionRange* value);
-MAKE_REFLECT_STRUCT(SelectionRange,range,parent)
+MAKE_REFLECT_STRUCT(SelectionRange, range, parent)
/**
* The {@code textDocument/selectionRange} request is sent from the client to the server to return
* suggested selection ranges at an array of given positions. A selection range is a range around
* the cursor position which the user might be interested in selecting.
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_selectionRange, SelectionRangeParams, std::vector<SelectionRange>, "textDocument/selectionRange");
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_selectionRange, SelectionRangeParams, std::vector<SelectionRange>, "textDocument/selectionRange"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/semanticHighlighting.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/semanticHighlighting.h
index bfb8619559..44bda39594 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/semanticHighlighting.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/semanticHighlighting.h
@@ -9,20 +9,21 @@
* Represents a semantic highlighting information that has to be applied on a specific line of the text document.
*/
-struct SemanticHighlightingInformation {
- /**
+struct SemanticHighlightingInformation
+{
+ /**
* The zero-based line position in the text document.
*/
- int line = 0;
+ int line = 0;
- /**
+ /**
* A base64 encoded string representing every single highlighted ranges in the line with its start position, length
* and the "lookup table" index of of the semantic highlighting <a href="https://manual.macromates.com/en/language_grammars">
* TextMate scopes</a>. If the {@code tokens} is empty or not defined, then no highlighted positions are available for the line.
*/
- std::string tokens;
+ std::string tokens;
- MAKE_SWAP_METHOD(SemanticHighlightingInformation, line, tokens)
+ MAKE_SWAP_METHOD(SemanticHighlightingInformation, line, tokens)
};
MAKE_REFLECT_STRUCT(SemanticHighlightingInformation, line, tokens);
@@ -31,21 +32,21 @@ MAKE_REFLECT_STRUCT(SemanticHighlightingInformation, line, tokens);
* Parameters for the semantic highlighting (server-side) push notification.
*/
-struct SemanticHighlightingParams {
- /**
+struct SemanticHighlightingParams
+{
+ /**
* The text document that has to be decorated with the semantic highlighting information.
*/
- lsVersionedTextDocumentIdentifier textDocument;
+ lsVersionedTextDocumentIdentifier textDocument;
- /**
+ /**
* An array of semantic highlighting information.
*/
- std::vector<SemanticHighlightingInformation> lines;
-
- MAKE_SWAP_METHOD(SemanticHighlightingParams, textDocument, lines)
+ std::vector<SemanticHighlightingInformation> lines;
+ MAKE_SWAP_METHOD(SemanticHighlightingParams, textDocument, lines)
};
MAKE_REFLECT_STRUCT(SemanticHighlightingParams, textDocument, lines);
/**
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/signature_help.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/signature_help.h
index bb5cd1dc52..51e33dec4f 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/signature_help.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/signature_help.h
@@ -1,87 +1,75 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/lsMarkedString.h"
#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
-extern void Reflect(Reader& visitor,
- std::pair<optional<std::string>, optional<MarkupContent>>& value);
-
-
-
// Represents a parameter of a callable-signature. A parameter can
// have a label and a doc-comment.
-struct lsParameterInformation {
- // The label of this parameter. Will be shown in
- // the UI.
- std::string label;
+struct lsParameterInformation
+{
+ // The label of this parameter. Will be shown in
+ // the UI.
+ std::string label;
- // The human-readable doc-comment of this parameter. Will be shown
- // in the UI but can be omitted.
- optional< std::pair< optional<std::string> , optional <MarkupContent> > > documentation;
+ // The human-readable doc-comment of this parameter. Will be shown
+ // in the UI but can be omitted.
+ optional<std::pair<optional<std::string>, optional<MarkupContent>>> documentation;
- MAKE_SWAP_METHOD(lsParameterInformation, label, documentation)
+ MAKE_SWAP_METHOD(lsParameterInformation, label, documentation)
};
MAKE_REFLECT_STRUCT(lsParameterInformation, label, documentation);
// Represents the signature of something callable. A signature
// can have a label, like a function-name, a doc-comment, and
// a set of parameters.
-struct lsSignatureInformation {
- // The label of this signature. Will be shown in
- // the UI.
- std::string label;
+struct lsSignatureInformation
+{
+ // The label of this signature. Will be shown in
+ // the UI.
+ std::string label;
- // The human-readable doc-comment of this signature. Will be shown
- // in the UI but can be omitted.
- optional< std::pair< optional<std::string>, optional <MarkupContent> > > documentation;
+ // The human-readable doc-comment of this signature. Will be shown
+ // in the UI but can be omitted.
+ optional<std::pair<optional<std::string>, optional<MarkupContent>>> documentation;
- // The parameters of this signature.
- std::vector<lsParameterInformation> parameters;
+ // The parameters of this signature.
+ std::vector<lsParameterInformation> parameters;
- MAKE_SWAP_METHOD(lsSignatureInformation, label, documentation, parameters)
+ MAKE_SWAP_METHOD(lsSignatureInformation, label, documentation, parameters)
};
MAKE_REFLECT_STRUCT(lsSignatureInformation, label, documentation, parameters);
// Signature help represents the signature of something
// callable. There can be multiple signature but only one
// active and only one active parameter.
-struct lsSignatureHelp {
- // One or more signatures.
- std::vector<lsSignatureInformation> signatures;
-
- // The active signature. If omitted or the value lies outside the
- // range of `signatures` the value defaults to zero or is ignored if
- // `signatures.length === 0`. Whenever possible implementors should
- // make an active decision about the active signature and shouldn't
- // rely on a default value.
- // In future version of the protocol this property might become
- // mandantory to better express this.
- optional<int> activeSignature;
-
- // The active parameter of the active signature. If omitted or the value
- // lies outside the range of `signatures[activeSignature].parameters`
- // defaults to 0 if the active signature has parameters. If
- // the active signature has no parameters it is ignored.
- // In future version of the protocol this property might become
- // mandantory to better express the active parameter if the
- // active signature does have any.
- optional<int> activeParameter;
-
-
- MAKE_SWAP_METHOD(lsSignatureHelp,
- signatures,
- activeSignature,
- activeParameter)
+struct lsSignatureHelp
+{
+ // One or more signatures.
+ std::vector<lsSignatureInformation> signatures;
+
+ // The active signature. If omitted or the value lies outside the
+ // range of `signatures` the value defaults to zero or is ignored if
+ // `signatures.length === 0`. Whenever possible implementors should
+ // make an active decision about the active signature and shouldn't
+ // rely on a default value.
+ // In future version of the protocol this property might become
+ // mandantory to better express this.
+ optional<int> activeSignature;
+
+ // The active parameter of the active signature. If omitted or the value
+ // lies outside the range of `signatures[activeSignature].parameters`
+ // defaults to 0 if the active signature has parameters. If
+ // the active signature has no parameters it is ignored.
+ // In future version of the protocol this property might become
+ // mandantory to better express the active parameter if the
+ // active signature does have any.
+ optional<int> activeParameter;
+
+ MAKE_SWAP_METHOD(lsSignatureHelp, signatures, activeSignature, activeParameter)
};
-MAKE_REFLECT_STRUCT(lsSignatureHelp,
- signatures,
- activeSignature,
- activeParameter);
-
-
+MAKE_REFLECT_STRUCT(lsSignatureHelp, signatures, activeSignature, activeParameter);
/**
* The signature help request is sent from the client to the server to
@@ -89,4 +77,6 @@ MAKE_REFLECT_STRUCT(lsSignatureHelp,
*
* Registration Options: SignatureHelpRegistrationOptions
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_signatureHelp, lsTextDocumentPositionParams, lsSignatureHelp, "textDocument/signatureHelp");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_signatureHelp, lsTextDocumentPositionParams, lsSignatureHelp, "textDocument/signatureHelp"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/typeHierarchy.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/typeHierarchy.h
index 8fe99edd87..fac696978a 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/typeHierarchy.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/typeHierarchy.h
@@ -18,77 +18,73 @@
* "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
* language feature</a> is not yet part of the official LSP specification.
*/
-enum class TypeHierarchyDirection : uint32_t{
+enum class TypeHierarchyDirection : uint32_t
+{
- /**
+ /**
* Flag for retrieving/resolving the subtypes. Value: {@code 0}.
*/
- Children = 0,
+ Children = 0,
- /**
+ /**
* Flag to use when retrieving/resolving the supertypes. Value: {@code 1}.
*/
- Parents =1,
+ Parents = 1,
- /**
+ /**
* Flag for resolving both the super- and subtypes. Value: {@code 2}.
*/
- Both=2
+ Both = 2
};
void Reflect(Reader& reader, TypeHierarchyDirection& value);
-
void Reflect(Writer& writer, TypeHierarchyDirection& value);
-struct TypeHierarchyParams :public lsTextDocumentPositionParams
+struct TypeHierarchyParams : public lsTextDocumentPositionParams
{
- optional<int> resolve;
- optional<TypeHierarchyDirection> direction ;
+ optional<int> resolve;
+ optional<TypeHierarchyDirection> direction;
- MAKE_SWAP_METHOD(TypeHierarchyParams, textDocument, position, resolve, direction)
+ MAKE_SWAP_METHOD(TypeHierarchyParams, textDocument, position, resolve, direction)
};
-MAKE_REFLECT_STRUCT(TypeHierarchyParams, textDocument, position, resolve, direction);
-
-
-
-
+MAKE_REFLECT_STRUCT(TypeHierarchyParams, textDocument, position, resolve, direction);
/**
* Representation of an item that carries type information (such as class, interface, enumeration, etc) with additional parentage details.
*/
-struct TypeHierarchyItem {
- /**
+struct TypeHierarchyItem
+{
+ /**
* The human readable name of the hierarchy item.
*/
- std::string name;
+ std::string name;
- /**
+ /**
* Optional detail for the hierarchy item. It can be, for instance, the signature of a function or method.
*/
- optional<std::string>
- detail;
+ optional<std::string> detail;
- /**
+ /**
* The kind of the hierarchy item. For instance, class or interface.
*/
- SymbolKind kind;
+ SymbolKind kind;
- /**
+ /**
* {@code true} if the hierarchy item is deprecated. Otherwise, {@code false}. It is {@code false} by default.
*/
- optional<bool> deprecated;
+ optional<bool> deprecated;
- /**
+ /**
* The URI of the text document where this type hierarchy item belongs to.
*/
- lsDocumentUri uri;
+ lsDocumentUri uri;
- /**
+ /**
* The range enclosing this type hierarchy item not including leading/trailing whitespace but everything else
* like comments. This information is typically used to determine if the clients cursor is inside the type
* hierarchy item to reveal in the symbol in the UI.
@@ -96,38 +92,40 @@ struct TypeHierarchyItem {
* @see TypeHierarchyItem#selectionRange
*/
- lsRange range;
+ lsRange range;
- /**
+ /**
* The range that should be selected and revealed when this type hierarchy item is being picked, e.g the name of a function.
* Must be contained by the the {@link TypeHierarchyItem#getRange range}.
*
* @see TypeHierarchyItem#range
*/
- lsRange selectionRange;
+ lsRange selectionRange;
- /**
+ /**
* If this type hierarchy item is resolved, it contains the direct parents. Could be empty if the item does not have any
* direct parents. If not defined, the parents have not been resolved yet.
*/
- optional< std::vector<TypeHierarchyItem> > parents;
+ optional<std::vector<TypeHierarchyItem>> parents;
- /**
+ /**
* If this type hierarchy item is resolved, it contains the direct children of the current item.
* Could be empty if the item does not have any descendants. If not defined, the children have not been resolved.
*/
- optional< std::vector<TypeHierarchyItem> > children;
+ optional<std::vector<TypeHierarchyItem>> children;
- /**
+ /**
* An optional data field can be used to identify a type hierarchy item in a resolve request.
*/
- optional<lsp::Any> data;
+ optional<lsp::Any> data;
- MAKE_SWAP_METHOD(TypeHierarchyItem, name, detail, kind, deprecated, uri, range, selectionRange, parents, children, data)
+ MAKE_SWAP_METHOD(
+ TypeHierarchyItem, name, detail, kind, deprecated, uri, range, selectionRange, parents, children, data
+ )
};
-MAKE_REFLECT_STRUCT(TypeHierarchyItem, name, detail, kind, deprecated, uri, range, selectionRange, parents, children, data);
-
-
+MAKE_REFLECT_STRUCT(
+ TypeHierarchyItem, name, detail, kind, deprecated, uri, range, selectionRange, parents, children, data
+);
DEFINE_REQUEST_RESPONSE_TYPE(td_typeHierarchy, TypeHierarchyParams, TypeHierarchyItem, "textDocument/typeHierarchy");
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/type_definition.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/type_definition.h
index 196a65c5d3..f8ee982144 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/type_definition.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/type_definition.h
@@ -1,6 +1,5 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/lsp/out_list.h"
@@ -12,5 +11,6 @@
*
* Since version 3.6.0
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_typeDefinition,
- lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/typeDefinition");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_typeDefinition, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/typeDefinition"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/willSave.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/willSave.h
index 4fe33d1dcc..511b14c64c 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/willSave.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/willSave.h
@@ -1,51 +1,53 @@
#pragma once
-
#include "LibLsp/JsonRpc/RequestInMessage.h"
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
-namespace WillSaveTextDocumentParams {
+namespace WillSaveTextDocumentParams
+{
- /**
+/**
* Represents reasons why a text document is saved.
*/
- enum class TextDocumentSaveReason {
+enum class TextDocumentSaveReason
+{
- /**
+ /**
* Manually triggered, e.g. by the user pressing save, by starting debugging,
* or by an API call.
*/
- Manual=(1),
+ Manual = (1),
- /**
+ /**
* Automatic after a delay.
*/
- AfterDelay=(2),
+ AfterDelay = (2),
- /**
+ /**
* When the editor lost focus.
*/
- FocusOut=(3)
- };
+ FocusOut = (3)
+};
- struct Params {
- /**
+struct Params
+{
+ /**
* The document that will be saved.
*/
lsTextDocumentIdentifier textDocument;
- /*
+ /*
* A reason why a text document is saved.
*/
- optional<TextDocumentSaveReason> reason;
-
- MAKE_SWAP_METHOD(Params, textDocument, reason);
- };
+ optional<TextDocumentSaveReason> reason;
+ MAKE_SWAP_METHOD(Params, textDocument, reason);
};
+
+}; // namespace WillSaveTextDocumentParams
MAKE_REFLECT_TYPE_PROXY(WillSaveTextDocumentParams::TextDocumentSaveReason);
MAKE_REFLECT_STRUCT(WillSaveTextDocumentParams::Params, textDocument, reason);
@@ -66,6 +68,6 @@ DEFINE_NOTIFICATION_TYPE(td_willSave, WillSaveTextDocumentParams::Params, "textD
*
* Registration Options: TextDocumentRegistrationOptions
*/
-DEFINE_REQUEST_RESPONSE_TYPE(td_willSaveWaitUntil,
- WillSaveTextDocumentParams::Params, std::vector<lsTextEdit>, "textDocument/willSaveWaitUntil");
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ td_willSaveWaitUntil, WillSaveTextDocumentParams::Params, std::vector<lsTextEdit>, "textDocument/willSaveWaitUntil"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/utils.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/utils.h
index 5f1769f80a..8fd6f8276c 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/utils.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/utils.h
@@ -12,64 +12,56 @@
#include "lsPosition.h"
-
namespace lsp
{
-
// Returns true if |value| starts/ends with |start| or |ending|.
bool StartsWith(std::string value, std::string start);
bool EndsWith(std::string value, std::string ending);
-bool AnyStartsWith(const std::vector<std::string>& values,
- const std::string& start);
-bool StartsWithAny(const std::string& value,
- const std::vector<std::string>& startings);
-bool EndsWithAny(const std::string& value,
- const std::vector<std::string>& endings);
-bool FindAnyPartial(const std::string& value,
- const std::vector<std::string>& values);
+bool AnyStartsWith(std::vector<std::string> const& values, std::string const& start);
+bool StartsWithAny(std::string const& value, std::vector<std::string> const& startings);
+bool EndsWithAny(std::string const& value, std::vector<std::string> const& endings);
+bool FindAnyPartial(std::string const& value, std::vector<std::string> const& values);
// Returns the dirname of |path|, i.e. "foo/bar.cc" => "foo/", "foo" => "./",
// "/foo" => "/". The result always ends in '/'.
std::string GetDirName(std::string path);
// Returns the basename of |path|, ie, "foo/bar.cc" => "bar.cc".
-std::string GetBaseName(const std::string& path);
+std::string GetBaseName(std::string const& path);
// Returns |path| without the filetype, ie, "foo/bar.cc" => "foo/bar".
-std::string StripFileType(const std::string& path);
-
-std::string ReplaceAll(const std::string& source,
- const std::string& from,
- const std::string& to);
-
-std::vector<std::string> SplitString(const std::string& str,
- const std::string& delimiter);
-
-template <typename TValues, typename TMap>
-std::string StringJoinMap(const TValues& values,
- const TMap& map,
- const std::string& sep = ", ") {
- std::string result;
- bool first = true;
- for (auto& entry : values) {
- if (!first)
- result += sep;
- first = false;
- result += map(entry);
- }
- return result;
-}
+std::string StripFileType(std::string const& path);
+
+std::string ReplaceAll(std::string const& source, std::string const& from, std::string const& to);
-template <typename TValues>
-std::string StringJoin(const TValues& values, const std::string& sep = ", ") {
- return StringJoinMap(values, [](const std::string& entry) { return entry; },
- sep);
+std::vector<std::string> SplitString(std::string const& str, std::string const& delimiter);
+
+template<typename TValues, typename TMap>
+std::string StringJoinMap(TValues const& values, TMap const& map, std::string const& sep = ", ")
+{
+ std::string result;
+ bool first = true;
+ for (auto& entry : values)
+ {
+ if (!first)
+ {
+ result += sep;
+ }
+ first = false;
+ result += map(entry);
+ }
+ return result;
}
-template <typename TCollection, typename TValue>
-bool ContainsValue(const TCollection& collection, const TValue& value) {
- return std::find(std::begin(collection), std::end(collection), value) !=
- std::end(collection);
+template<typename TValues>
+std::string StringJoin(TValues const& values, std::string const& sep = ", ")
+{
+ return StringJoinMap(values, [](std::string const& entry) { return entry; }, sep);
}
+template<typename TCollection, typename TValue>
+bool ContainsValue(TCollection const& collection, TValue const& value)
+{
+ return std::find(std::begin(collection), std::end(collection), value) != std::end(collection);
+}
// Ensures that |path| ends in a slash.
void EnsureEndsInSlash(std::string& path);
@@ -79,16 +71,16 @@ void EnsureEndsInSlash(std::string& path);
std::string EscapeFileName(std::string path);
// FIXME: Move ReadContent into ICacheManager?
-bool FileExists(const std::string& filename);
-optional<std::string> ReadContent(const AbsolutePath& filename);
-std::vector<std::string> ReadLinesWithEnding(const AbsolutePath& filename);
+bool FileExists(std::string const& filename);
+optional<std::string> ReadContent(AbsolutePath const& filename);
+std::vector<std::string> ReadLinesWithEnding(AbsolutePath const& filename);
-bool WriteToFile(const std::string& filename, const std::string& content);
+bool WriteToFile(std::string const& filename, std::string const& content);
-
-template <typename T, typename Fn>
-void RemoveIf(std::vector<T>* vec, Fn predicate) {
- vec->erase(std::remove_if(vec->begin(), vec->end(), predicate), vec->end());
+template<typename T, typename Fn>
+void RemoveIf(std::vector<T>* vec, Fn predicate)
+{
+ vec->erase(std::remove_if(vec->begin(), vec->end(), predicate), vec->end());
}
std::string FormatMicroseconds(long long microseconds);
@@ -97,45 +89,35 @@ std::string FormatMicroseconds(long long microseconds);
std::string UpdateToRnNewlines(std::string output);
// Utility methods to check if |path| is absolute.
-bool IsAbsolutePath(const std::string& path);
-bool IsUnixAbsolutePath(const std::string& path);
-bool IsWindowsAbsolutePath(const std::string& path);
+bool IsAbsolutePath(std::string const& path);
+bool IsUnixAbsolutePath(std::string const& path);
+bool IsWindowsAbsolutePath(std::string const& path);
-bool IsDirectory(const std::string& path);
+bool IsDirectory(std::string const& path);
// string <-> wstring conversion (UTF-16), e.g. for use with Window's wide APIs.
- std::string ws2s(std::wstring const& wstr);
- std::wstring s2ws(std::string const& str);
+std::string ws2s(std::wstring const& wstr);
+std::wstring s2ws(std::string const& str);
-AbsolutePath NormalizePath(const std::string& path,
- bool ensure_exists = true,
- bool force_lower_on_windows = true);
+AbsolutePath NormalizePath(std::string const& path, bool ensure_exists = true, bool force_lower_on_windows = true);
-
-int GetOffsetForPosition(lsPosition position, const std::string& content);
+int GetOffsetForPosition(lsPosition position, std::string const& content);
// Finds the position for an |offset| in |content|.
-lsPosition GetPositionForOffset(int offset, const std::string& content);
+lsPosition GetPositionForOffset(int offset, std::string const& content);
// Utility method to find a position for the given character.
-lsPosition CharPos(const std::string& search,
- char character,
- int character_offset = 0);
-
+lsPosition CharPos(std::string const& search, char character, int character_offset = 0);
- void scanDirsNoRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret);
+void scanDirsNoRecursive(std::wstring const& rootPath, std::vector<std::wstring>& ret);
- void scanFilesUseRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret,
- std::wstring strSuf = L"");
+void scanFilesUseRecursive(std::wstring const& rootPath, std::vector<std::wstring>& ret, std::wstring strSuf = L"");
- void scanFileNamesUseRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret,
- std::wstring strSuf = L"");
- void scanFileNamesUseRecursive(const std::string& rootPath, std::vector<std::string>& ret,
- std::string strSuf = "");
+void scanFileNamesUseRecursive(std::wstring const& rootPath, std::vector<std::wstring>& ret, std::wstring strSuf = L"");
+void scanFileNamesUseRecursive(std::string const& rootPath, std::vector<std::string>& ret, std::string strSuf = "");
- void scanFilesUseRecursive(const std::string& rootPath, std::vector<std::string>& ret,
- std::string strSuf = "");
+void scanFilesUseRecursive(std::string const& rootPath, std::vector<std::string>& ret, std::string strSuf = "");
- void scanDirsUseRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret);
+void scanDirsUseRecursive(std::wstring const& rootPath, std::vector<std::wstring>& ret);
-}
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/windows/MessageNotify.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/windows/MessageNotify.h
index 332fb7e2e7..567c061068 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/windows/MessageNotify.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/windows/MessageNotify.h
@@ -5,68 +5,73 @@
#include "LibLsp/JsonRpc/lsResponseMessage.h"
// Show a message to the user.
-enum class lsMessageType : int { Error = 1, Warning = 2, Info = 3, Log = 4 };
+enum class lsMessageType : int
+{
+ Error = 1,
+ Warning = 2,
+ Info = 3,
+ Log = 4
+};
MAKE_REFLECT_TYPE_PROXY(lsMessageType)
-struct MessageParams {
-/**
+struct MessageParams
+{
+ /**
* The message type.
*/
- lsMessageType type = lsMessageType::Error;
+ lsMessageType type = lsMessageType::Error;
-/**
+ /**
* The actual message.
*/
- std::string message;
-
- void swap(MessageParams& arg) noexcept {
- lsMessageType temp = type;
- type = arg.type;
- arg.type = temp;
- message.swap(arg.message);
- }
+ std::string message;
+
+ void swap(MessageParams& arg) noexcept
+ {
+ lsMessageType temp = type;
+ type = arg.type;
+ arg.type = temp;
+ message.swap(arg.message);
+ }
};
MAKE_REFLECT_STRUCT(MessageParams, type, message)
- /**
+/**
* The log message notification is send from the server to the client to ask
* the client to log a particular message.
*/
DEFINE_NOTIFICATION_TYPE(Notify_LogMessage, MessageParams, "window/logMessage")
-
/**
* The show message notification is sent from a server to a client to ask
* the client to display a particular message in the user interface.
*/
DEFINE_NOTIFICATION_TYPE(Notify_ShowMessage, MessageParams, "window/showMessage")
-
-
/**
* The show message request is sent from a server to a client to ask the client to display a particular message in the
* user class. In addition to the show message notification the request allows to pass actions and to wait for an
* answer from the client.
*/
-struct MessageActionItem {
- /**
+struct MessageActionItem
+{
+ /**
* A short title like 'Retry', 'Open Log' etc.
*/
- std::string title;
- MAKE_SWAP_METHOD(MessageActionItem, title)
+ std::string title;
+ MAKE_SWAP_METHOD(MessageActionItem, title)
};
MAKE_REFLECT_STRUCT(MessageActionItem, title);
-
-struct ShowMessageRequestParams :public MessageParams {
- /**
+struct ShowMessageRequestParams : public MessageParams
+{
+ /**
* The message action items to present.
*/
- std::vector<MessageActionItem> actions;
-
- MAKE_SWAP_METHOD(ShowMessageRequestParams, type, message, actions)
+ std::vector<MessageActionItem> actions;
+ MAKE_SWAP_METHOD(ShowMessageRequestParams, type, message, actions)
};
MAKE_REFLECT_STRUCT(ShowMessageRequestParams, type, message, actions)
@@ -78,6 +83,3 @@ MAKE_REFLECT_STRUCT(ShowMessageRequestParams, type, message, actions)
*/
DEFINE_REQUEST_RESPONSE_TYPE(WindowShowMessage, ShowMessageRequestParams, MessageActionItem, "window/showMessage")
-
-
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/working_files.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/working_files.h
index 916268f0fa..d4b872e5ce 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/working_files.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/working_files.h
@@ -12,61 +12,66 @@
struct WorkingFiles;
struct WorkingFilesData;
-struct WorkingFile {
+struct WorkingFile
+{
int version = 0;
AbsolutePath filename;
Directory directory;
WorkingFiles& parent;
std::atomic<long long> counter;
- WorkingFile(WorkingFiles& ,const AbsolutePath& filename, const std::string& buffer_content);
- WorkingFile(WorkingFiles&, const AbsolutePath& filename, std::string&& buffer_content);
- const std::string& GetContentNoLock() const
+ WorkingFile(WorkingFiles&, AbsolutePath const& filename, std::string const& buffer_content);
+ WorkingFile(WorkingFiles&, AbsolutePath const& filename, std::string&& buffer_content);
+ std::string const& GetContentNoLock() const
{
- return buffer_content;
+ return buffer_content;
}
+
protected:
friend struct WorkingFiles;
std::string buffer_content;
};
-struct WorkingFiles {
+struct WorkingFiles
+{
- WorkingFiles();
- ~WorkingFiles();
+ WorkingFiles();
+ ~WorkingFiles();
- void CloseFilesInDirectory(const std::vector<Directory>&);
- std::shared_ptr<WorkingFile> OnOpen(lsTextDocumentItem& open);
- std::shared_ptr<WorkingFile> OnChange(const lsTextDocumentDidChangeParams& change);
- bool OnClose(const lsTextDocumentIdentifier& close);
- std::shared_ptr<WorkingFile> OnSave(const lsTextDocumentIdentifier& _save);
+ void CloseFilesInDirectory(std::vector<Directory> const&);
+ std::shared_ptr<WorkingFile> OnOpen(lsTextDocumentItem& open);
+ std::shared_ptr<WorkingFile> OnChange(lsTextDocumentDidChangeParams const& change);
+ bool OnClose(lsTextDocumentIdentifier const& close);
+ std::shared_ptr<WorkingFile> OnSave(lsTextDocumentIdentifier const& _save);
- bool GetFileBufferContent(const AbsolutePath& filename, std::wstring& out)
- {
- auto file = GetFileByFilename(filename);
- if(!file)
- return false;
+ bool GetFileBufferContent(AbsolutePath const& filename, std::wstring& out)
+ {
+ auto file = GetFileByFilename(filename);
+ if (!file)
+ {
+ return false;
+ }
+ return GetFileBufferContent(file, out);
+ }
+ bool GetFileBufferContent(AbsolutePath const& filename, std::string& out)
+ {
+ auto file = GetFileByFilename(filename);
+ if (!file)
+ {
+ return false;
+ }
return GetFileBufferContent(file, out);
- }
- bool GetFileBufferContent(const AbsolutePath& filename,std::string& out)
- {
- auto file = GetFileByFilename(filename);
- if (!file)
- return false;
- return GetFileBufferContent(file, out);
- }
- bool GetFileBufferContent(std::shared_ptr<WorkingFile>&, std::string& out);
- bool GetFileBufferContent(std::shared_ptr<WorkingFile>&, std::wstring& out);
+ }
+ bool GetFileBufferContent(std::shared_ptr<WorkingFile>&, std::string& out);
+ bool GetFileBufferContent(std::shared_ptr<WorkingFile>&, std::wstring& out);
+ // Find the file with the given filename.
+ std::shared_ptr<WorkingFile> GetFileByFilename(AbsolutePath const& filename);
- // Find the file with the given filename.
- std::shared_ptr<WorkingFile> GetFileByFilename(const AbsolutePath& filename);
+ void Clear();
- void Clear();
private:
- std::shared_ptr<WorkingFile> GetFileByFilenameNoLock(const AbsolutePath& filename);
-
- WorkingFilesData* d_ptr;
-
+ std::shared_ptr<WorkingFile> GetFileByFilenameNoLock(AbsolutePath const& filename);
+ WorkingFilesData* d_ptr;
};
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/applyEdit.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/applyEdit.h
index eb1f250b2f..4ee08a2358 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/applyEdit.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/applyEdit.h
@@ -6,37 +6,36 @@
#include "LibLsp/lsp/lsDocumentUri.h"
#include "LibLsp/lsp/lsWorkspaceEdit.h"
-struct ApplyWorkspaceEditParams
+struct ApplyWorkspaceEditParams
{
- /**
+ /**
* The edits to apply.
*/
- lsWorkspaceEdit edit;
+ lsWorkspaceEdit edit;
- /**
+ /**
* An optional label of the workspace edit. This label is
* presented in the user interface for example on an undo
* stack to undo the workspace edit.
*/
- std::string label;
+ std::string label;
- MAKE_SWAP_METHOD(ApplyWorkspaceEditParams, edit, label)
+ MAKE_SWAP_METHOD(ApplyWorkspaceEditParams, edit, label)
};
/**
* The workspace/applyEdit request is sent from the server to the client to modify resource on the client side.
*/
MAKE_REFLECT_STRUCT(ApplyWorkspaceEditParams, edit, label);
-
-
-struct ApplyWorkspaceEditResponse
+struct ApplyWorkspaceEditResponse
{
- bool applied;
- optional<std::string> failureReason;
- MAKE_SWAP_METHOD(ApplyWorkspaceEditResponse, applied, failureReason)
+ bool applied;
+ optional<std::string> failureReason;
+ MAKE_SWAP_METHOD(ApplyWorkspaceEditResponse, applied, failureReason)
};
MAKE_REFLECT_STRUCT(ApplyWorkspaceEditResponse, applied, failureReason);
-
-DEFINE_REQUEST_RESPONSE_TYPE(WorkspaceApply, ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse, "workspace/applyEdit");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ WorkspaceApply, ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse, "workspace/applyEdit"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/configuration.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/configuration.h
index ad22bf0185..c545fb04ae 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/configuration.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/configuration.h
@@ -5,24 +5,24 @@
#include "LibLsp/lsp/lsDocumentUri.h"
-
-struct ConfigurationItem {
- /**
+struct ConfigurationItem
+{
+ /**
* The scope to get the configuration section for.
*/
- lsDocumentUri scopeUri;
+ lsDocumentUri scopeUri;
- /**
+ /**
* The configuration section asked for.
*/
- std::string section;
- MAKE_SWAP_METHOD(ConfigurationItem, scopeUri, section);
+ std::string section;
+ MAKE_SWAP_METHOD(ConfigurationItem, scopeUri, section);
};
MAKE_REFLECT_STRUCT(ConfigurationItem, scopeUri, section);
struct ConfigurationParams
{
- std::vector<ConfigurationItem> items;
- MAKE_SWAP_METHOD(ConfigurationParams, items)
+ std::vector<ConfigurationItem> items;
+ MAKE_SWAP_METHOD(ConfigurationParams, items)
};
MAKE_REFLECT_STRUCT(ConfigurationParams, items);
@@ -34,4 +34,6 @@ MAKE_REFLECT_STRUCT(ConfigurationParams, items);
* order of the passed ConfigurationItems (e.g. the first item in the response is the
* result for the first configuration item in the params).
*/
-DEFINE_REQUEST_RESPONSE_TYPE(WorkspaceConfiguration, ConfigurationParams,std::vector<lsp::Any>, "workspace/configuration");
+DEFINE_REQUEST_RESPONSE_TYPE(
+ WorkspaceConfiguration, ConfigurationParams, std::vector<lsp::Any>, "workspace/configuration"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/didChangeWorkspaceFolders.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/didChangeWorkspaceFolders.h
index 1c6cd83b62..ee1f9b10eb 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/didChangeWorkspaceFolders.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/didChangeWorkspaceFolders.h
@@ -4,35 +4,35 @@
/**
* The workspace folder change event.
*/
-struct WorkspaceFoldersChangeEvent {
- /**
+struct WorkspaceFoldersChangeEvent
+{
+ /**
* The array of added workspace folders
*/
- std::vector<WorkspaceFolder> added;
+ std::vector<WorkspaceFolder> added;
- /**
+ /**
* The array of the removed workspace folders
*/
- std::vector <WorkspaceFolder> removed;
- MAKE_SWAP_METHOD(WorkspaceFoldersChangeEvent, added, removed);
-
+ std::vector<WorkspaceFolder> removed;
+ MAKE_SWAP_METHOD(WorkspaceFoldersChangeEvent, added, removed);
};
MAKE_REFLECT_STRUCT(WorkspaceFoldersChangeEvent, added, removed);
-struct DidChangeWorkspaceFoldersParams {
- /**
+struct DidChangeWorkspaceFoldersParams
+{
+ /**
* The actual workspace folder change event.
*/
- WorkspaceFoldersChangeEvent event;
+ WorkspaceFoldersChangeEvent event;
- MAKE_SWAP_METHOD(DidChangeWorkspaceFoldersParams, event);
+ MAKE_SWAP_METHOD(DidChangeWorkspaceFoldersParams, event);
};
MAKE_REFLECT_STRUCT(DidChangeWorkspaceFoldersParams, event);
-
/**
* The workspace/didChangeWorkspaceFolders notification is sent from the client
* to the server to inform the server about workspace folder configuration changes.
@@ -40,9 +40,6 @@ MAKE_REFLECT_STRUCT(DidChangeWorkspaceFoldersParams, event);
* and ClientCapabilities/workspace/workspaceFolders are true; or if the server has
* registered to receive this notification it first.
*/
-DEFINE_NOTIFICATION_TYPE(Notify_WorkspaceDidChangeWorkspaceFolders,
- DidChangeWorkspaceFoldersParams, "workspace/didChangeWorkspaceFolders");
-
-
-
-
+DEFINE_NOTIFICATION_TYPE(
+ Notify_WorkspaceDidChangeWorkspaceFolders, DidChangeWorkspaceFoldersParams, "workspace/didChangeWorkspaceFolders"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/did_change_configuration.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/did_change_configuration.h
index 3e7ca6dded..c67da825da 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/did_change_configuration.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/did_change_configuration.h
@@ -2,18 +2,15 @@
#include "LibLsp/JsonRpc/NotificationInMessage.h"
-
#include "workspaceFolders.h"
-
-
-
-struct lsDidChangeConfigurationParams {
- /**
+struct lsDidChangeConfigurationParams
+{
+ /**
* The actual changed settings.
*/
- lsp::Any settings;
- MAKE_SWAP_METHOD(lsDidChangeConfigurationParams, settings);
+ lsp::Any settings;
+ MAKE_SWAP_METHOD(lsDidChangeConfigurationParams, settings);
};
MAKE_REFLECT_STRUCT(lsDidChangeConfigurationParams, settings);
@@ -22,4 +19,6 @@ MAKE_REFLECT_STRUCT(lsDidChangeConfigurationParams, settings);
* A notification sent from the client to the server to signal the change of
* configuration settings.
*/
-DEFINE_NOTIFICATION_TYPE(Notify_WorkspaceDidChangeConfiguration, lsDidChangeConfigurationParams, "workspace/didChangeConfiguration");
+DEFINE_NOTIFICATION_TYPE(
+ Notify_WorkspaceDidChangeConfiguration, lsDidChangeConfigurationParams, "workspace/didChangeConfiguration"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/did_change_watched_files.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/did_change_watched_files.h
index c14a7e0eda..33fa5ac55d 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/did_change_watched_files.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/did_change_watched_files.h
@@ -2,13 +2,14 @@
#include "LibLsp/JsonRpc/NotificationInMessage.h"
#include "LibLsp/lsp/lsDocumentUri.h"
-enum class lsFileChangeType {
- Created = 1,
- Changed = 2,
- Deleted = 3,
+enum class lsFileChangeType
+{
+ Created = 1,
+ Changed = 2,
+ Deleted = 3,
};
-#ifdef _WIN32
+#ifdef _WIN32
MAKE_REFLECT_TYPE_PROXY(lsFileChangeType);
#else
//#pragma clang diagnostic push
@@ -17,25 +18,26 @@ MAKE_REFLECT_TYPE_PROXY(lsFileChangeType);
//#pragma clang diagnostic pop
#endif
-
/**
* An event describing a file change.
*/
-struct lsFileEvent {
- lsDocumentUri uri;
- lsFileChangeType type;
+struct lsFileEvent
+{
+ lsDocumentUri uri;
+ lsFileChangeType type;
- MAKE_SWAP_METHOD(lsFileEvent, uri, type)
+ MAKE_SWAP_METHOD(lsFileEvent, uri, type)
};
MAKE_REFLECT_STRUCT(lsFileEvent, uri, type);
-struct lsDidChangeWatchedFilesParams {
- std::vector<lsFileEvent> changes;
- MAKE_SWAP_METHOD(lsDidChangeWatchedFilesParams, changes);
+struct lsDidChangeWatchedFilesParams
+{
+ std::vector<lsFileEvent> changes;
+ MAKE_SWAP_METHOD(lsDidChangeWatchedFilesParams, changes);
};
MAKE_REFLECT_STRUCT(lsDidChangeWatchedFilesParams, changes);
- /**
+/**
* The workspace/didChangeWorkspaceFolders notification is sent from the client
* to the server to inform the server about workspace folder configuration changes.
* The notification is sent by default if both ServerCapabilities/workspaceFolders
@@ -43,4 +45,6 @@ MAKE_REFLECT_STRUCT(lsDidChangeWatchedFilesParams, changes);
* registered to receive this notification it first.
*/
-DEFINE_NOTIFICATION_TYPE(Notify_WorkspaceDidChangeWatchedFiles, lsDidChangeWatchedFilesParams, "workspace/didChangeWatchedFiles");
+DEFINE_NOTIFICATION_TYPE(
+ Notify_WorkspaceDidChangeWatchedFiles, lsDidChangeWatchedFilesParams, "workspace/didChangeWatchedFiles"
+);
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/execute_command.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/execute_command.h
index c656ee5ef7..3132ce82d4 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/execute_command.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/execute_command.h
@@ -7,8 +7,6 @@
#include "LibLsp/JsonRpc/NotificationInMessage.h"
-
-
/**
* The workspace/executeCommand request is sent from the client to the
* server to trigger command execution on the server. In most cases the
@@ -20,5 +18,4 @@
*/
DEFINE_REQUEST_RESPONSE_TYPE(wp_executeCommand, ExecuteCommandParams, lsp::Any, "workspace/executeCommand");
-
-DEFINE_NOTIFICATION_TYPE(Notify_sendNotification, ExecuteCommandParams, "workspace/notify") \ No newline at end of file
+DEFINE_NOTIFICATION_TYPE(Notify_sendNotification, ExecuteCommandParams, "workspace/notify")
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/symbol.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/symbol.h
index 129fb5e822..0b64270329 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/symbol.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/symbol.h
@@ -13,4 +13,3 @@
*/
DEFINE_REQUEST_RESPONSE_TYPE(wp_symbol, WorkspaceSymbolParams, std::vector<lsSymbolInformation>, "workspace/symbol");
-
diff --git a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/workspaceFolders.h b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/workspaceFolders.h
index 136c1d777b..159a239eaf 100644
--- a/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/workspaceFolders.h
+++ b/graphics/asymptote/LspCpp/include/LibLsp/lsp/workspace/workspaceFolders.h
@@ -4,23 +4,23 @@
#include "LibLsp/JsonRpc/lsResponseMessage.h"
#include "LibLsp/lsp/lsDocumentUri.h"
-struct WorkspaceFolder {
- /**
+struct WorkspaceFolder
+{
+ /**
* The associated URI for this workspace folder.
*/
- lsDocumentUri uri;
+ lsDocumentUri uri;
- /**
+ /**
* The name of the workspace folder. Defaults to the uri's basename.
*/
- std::string name;
+ std::string name;
- MAKE_SWAP_METHOD(WorkspaceFolder, uri, name)
+ MAKE_SWAP_METHOD(WorkspaceFolder, uri, name)
};
MAKE_REFLECT_STRUCT(WorkspaceFolder, uri, name);
-
/**
* The workspace/workspaceFolders request is sent from the server to the client
* to fetch the current open list of workspace folders.
@@ -29,6 +29,6 @@ MAKE_REFLECT_STRUCT(WorkspaceFolder, uri, name);
* an empty array if a workspace is open but no folders are configured,
* the workspace folders otherwise.
*/
-DEFINE_REQUEST_RESPONSE_TYPE(WorkspaceFolders,
- optional<JsonNull>, optional<std::vector< WorkspaceFolder>>, "workspace/workspaceFolders");
-
+DEFINE_REQUEST_RESPONSE_TYPE(
+ WorkspaceFolders, optional<JsonNull>, optional<std::vector<WorkspaceFolder>>, "workspace/workspaceFolders"
+);
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/Context.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/Context.cpp
index 8d4094b41a..20c476f9be 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/Context.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/Context.cpp
@@ -9,27 +9,38 @@
#include "LibLsp/JsonRpc/Context.h"
#include <cassert>
-namespace lsp {
+namespace lsp
+{
+Context Context::empty()
+{
+ return Context(/*dataPtr=*/nullptr);
+}
-Context Context::empty() { return Context(/*dataPtr=*/nullptr); }
-
-Context::Context(std::shared_ptr<const Data> DataPtr)
- : dataPtr(std::move(DataPtr)) {}
-
-Context Context::clone() const { return Context(dataPtr); }
+Context::Context(std::shared_ptr<Data const> DataPtr) : dataPtr(std::move(DataPtr))
+{
+}
-static Context &currentContext() {
- static thread_local auto c = Context::empty();
- return c;
+Context Context::clone() const
+{
+ return Context(dataPtr);
}
-const Context &Context::current() { return currentContext(); }
+static Context& currentContext()
+{
+ static thread_local auto c = Context::empty();
+ return c;
+}
-Context Context::swapCurrent(Context Replacement) {
- std::swap(Replacement, currentContext());
- return Replacement;
+Context const& Context::current()
+{
+ return currentContext();
}
+Context Context::swapCurrent(Context Replacement)
+{
+ std::swap(Replacement, currentContext());
+ return Replacement;
+}
-} // lsp clang
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/Endpoint.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/Endpoint.cpp
index a66108d2e5..fe80eb7081 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/Endpoint.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/Endpoint.cpp
@@ -1,46 +1,43 @@
#include "LibLsp/JsonRpc/Endpoint.h"
#include "LibLsp/JsonRpc/message.h"
-
bool GenericEndpoint::notify(std::unique_ptr<LspMessage> msg)
{
- auto findIt = method2notification.find(msg->GetMethodType());
-
- if (findIt != method2notification.end())
- {
- return findIt->second(std::move(msg));
- }
- std::string info = "can't find method2notification for notification:\n" + msg->ToJson() + "\n";
- log.log(lsp::Log::Level::SEVERE, info);
- return false;
+ auto findIt = method2notification.find(msg->GetMethodType());
+
+ if (findIt != method2notification.end())
+ {
+ return findIt->second(std::move(msg));
+ }
+ std::string info = "can't find method2notification for notification:\n" + msg->ToJson() + "\n";
+ log.log(lsp::Log::Level::SEVERE, info);
+ return false;
}
-bool GenericEndpoint::onResponse(const std::string& method, std::unique_ptr<LspMessage>msg)
+bool GenericEndpoint::onResponse(std::string const& method, std::unique_ptr<LspMessage> msg)
{
- auto findIt = method2response.find(method);
+ auto findIt = method2response.find(method);
- if (findIt != method2response.end())
- {
- return findIt->second(std::move(msg));
- }
+ if (findIt != method2response.end())
+ {
+ return findIt->second(std::move(msg));
+ }
- std::string info = "can't find method2response for response:\n" + msg->ToJson() + "\n";
- log.log(lsp::Log::Level::SEVERE, info);
+ std::string info = "can't find method2response for response:\n" + msg->ToJson() + "\n";
+ log.log(lsp::Log::Level::SEVERE, info);
- return false;
+ return false;
}
-
-
bool GenericEndpoint::onRequest(std::unique_ptr<LspMessage> request)
{
- auto findIt = method2request.find(request->GetMethodType());
-
- if (findIt != method2request.end())
- {
- return findIt->second(std::move(request));
- }
- std::string info = "can't find method2request for request:\n" + request->ToJson() + "\n";
- log.log(lsp::Log::Level::SEVERE, info);
- return false;
+ auto findIt = method2request.find(request->GetMethodType());
+
+ if (findIt != method2request.end())
+ {
+ return findIt->second(std::move(request));
+ }
+ std::string info = "can't find method2request for request:\n" + request->ToJson() + "\n";
+ log.log(lsp::Log::Level::SEVERE, info);
+ return false;
}
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/GCThreadContext.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/GCThreadContext.cpp
index 8b68d329c9..8caf0c66e8 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/GCThreadContext.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/GCThreadContext.cpp
@@ -14,4 +14,4 @@ GCThreadContext::~GCThreadContext()
#ifdef LSPCPP_USEGC
GC_unregister_my_thread();
#endif
-} \ No newline at end of file
+}
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/MessageJsonHandler.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/MessageJsonHandler.cpp
index 78cf8950c2..e1413a987e 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/MessageJsonHandler.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/MessageJsonHandler.cpp
@@ -2,56 +2,53 @@
#include <string>
#include <rapidjson/document.h>
-
-
-std::unique_ptr<LspMessage> MessageJsonHandler::parseResponseMessage(const std::string& method, Reader& r)
+std::unique_ptr<LspMessage> MessageJsonHandler::parseResponseMessage(std::string const& method, Reader& r)
{
- auto findIt = method2response.find(method);
+ auto findIt = method2response.find(method);
- if( findIt != method2response.end())
- {
- return findIt->second(r);
- }
- return nullptr;
+ if (findIt != method2response.end())
+ {
+ return findIt->second(r);
+ }
+ return nullptr;
}
-std::unique_ptr<LspMessage> MessageJsonHandler::parseRequstMessage(const std::string& method, Reader&r)
+std::unique_ptr<LspMessage> MessageJsonHandler::parseRequstMessage(std::string const& method, Reader& r)
{
- auto findIt = method2request.find(method);
+ auto findIt = method2request.find(method);
- if (findIt != method2request.end())
- {
- return findIt->second(r);
- }
- return nullptr;
+ if (findIt != method2request.end())
+ {
+ return findIt->second(r);
+ }
+ return nullptr;
}
-bool MessageJsonHandler::resovleResponseMessage(Reader&r, std::pair<std::string, std::unique_ptr<LspMessage>>& result)
+bool MessageJsonHandler::resovleResponseMessage(Reader& r, std::pair<std::string, std::unique_ptr<LspMessage>>& result)
{
- for (auto& handler : method2response)
+ for (auto& handler : method2response)
+ {
+ try
+ {
+ auto msg = handler.second(r);
+ result.first = handler.first;
+ result.second = std::move(msg);
+ return true;
+ }
+ catch (...)
{
- try
- {
- auto msg = handler.second(r);
- result.first = handler.first;
- result.second = std::move(msg);
- return true;
- }
- catch (...)
- {
-
- }
}
- return false;
+ }
+ return false;
}
-std::unique_ptr<LspMessage> MessageJsonHandler::parseNotificationMessage(const std::string& method, Reader& r)
+std::unique_ptr<LspMessage> MessageJsonHandler::parseNotificationMessage(std::string const& method, Reader& r)
{
- auto findIt = method2notification.find(method);
+ auto findIt = method2notification.find(method);
- if (findIt != method2notification.end())
- {
- return findIt->second(r);
- }
- return nullptr;
+ if (findIt != method2notification.end())
+ {
+ return findIt->second(r);
+ }
+ return nullptr;
}
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/RemoteEndPoint.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/RemoteEndPoint.cpp
index f4bd83aae9..d705013352 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/RemoteEndPoint.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/RemoteEndPoint.cpp
@@ -20,7 +20,8 @@
#include "LibLsp/JsonRpc/GCThreadContext.h"
-namespace lsp {
+namespace lsp
+{
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -73,189 +74,211 @@ namespace lsp {
// ways that preserve the context. (Like runAsync() or TUScheduler).
//
- /// A canceller requests cancellation of a task, when called.
- /// Calling it again has no effect.
- using Canceler = std::function<void()>;
-
- // We don't want a cancelable scope to "shadow" an enclosing one.
- struct CancelState {
- std::shared_ptr<std::atomic<int>> cancelled;
- const CancelState* parent = nullptr;
- lsRequestId id;
- };
- static Key<CancelState> g_stateKey;
-
- /// Defines a new task whose cancellation may be requested.
- /// The returned Context defines the scope of the task.
- /// When the context is active, getCancelledMonitor() is 0 until the Canceler is
- /// invoked, and equal to Reason afterwards.
- /// Conventionally, Reason may be the LSP error code to return.
- std::pair<Context, Canceler> cancelableTask(const lsRequestId& id,int reason = 1){
- assert(reason != 0 && "Can't detect cancellation if Reason is zero");
- CancelState state;
- state.id = id;
- state.cancelled = std::make_shared<std::atomic<int>>();
- state.parent = Context::current().get(g_stateKey);
- return {
- Context::current().derive(g_stateKey, state),
- [reason, cancelled(state.cancelled)] { *cancelled = reason; },
- };
- }
- /// If the current context is within a cancelled task, returns the reason.
+/// A canceller requests cancellation of a task, when called.
+/// Calling it again has no effect.
+using Canceler = std::function<void()>;
+
+// We don't want a cancelable scope to "shadow" an enclosing one.
+struct CancelState
+{
+ std::shared_ptr<std::atomic<int>> cancelled;
+ CancelState const* parent = nullptr;
+ lsRequestId id;
+};
+static Key<CancelState> g_stateKey;
+
+/// Defines a new task whose cancellation may be requested.
+/// The returned Context defines the scope of the task.
+/// When the context is active, getCancelledMonitor() is 0 until the Canceler is
+/// invoked, and equal to Reason afterwards.
+/// Conventionally, Reason may be the LSP error code to return.
+std::pair<Context, Canceler> cancelableTask(lsRequestId const& id, int reason = 1)
+{
+ assert(reason != 0 && "Can't detect cancellation if Reason is zero");
+ CancelState state;
+ state.id = id;
+ state.cancelled = std::make_shared<std::atomic<int>>();
+ state.parent = Context::current().get(g_stateKey);
+ return {
+ Context::current().derive(g_stateKey, state),
+ [reason, cancelled(state.cancelled)] { *cancelled = reason; },
+ };
+}
+/// If the current context is within a cancelled task, returns the reason.
/// (If the context is within multiple nested tasks, true if any are cancelled).
/// Always zero if there is no active cancelable task.
/// This isn't free (context lookup) - don't call it in a tight loop.
- optional<CancelMonitor> getCancelledMonitor(const lsRequestId& id, const Context& ctx = Context::current()){
- for (const CancelState* state = ctx.get(g_stateKey); state != nullptr;
- state = state->parent)
- {
- if (id != state->id)continue;
- const std::shared_ptr<std::atomic<int> > cancelled = state->cancelled;
- std::function<int()> temp = [=]{
- return cancelled->load();
- };
- return std::move(temp);
- }
-
- return {};
+optional<CancelMonitor> getCancelledMonitor(lsRequestId const& id, Context const& ctx = Context::current())
+{
+ for (CancelState const* state = ctx.get(g_stateKey); state != nullptr; state = state->parent)
+ {
+ if (id != state->id)
+ {
+ continue;
}
+ std::shared_ptr<std::atomic<int>> const cancelled = state->cancelled;
+ std::function<int()> temp = [=] { return cancelled->load(); };
+ return std::move(temp);
+ }
+
+ return {};
+}
} // namespace lsp
-using namespace lsp;
+using namespace lsp;
class PendingRequestInfo
{
- using RequestCallBack = std::function< bool(std::unique_ptr<LspMessage>) >;
+ using RequestCallBack = std::function<bool(std::unique_ptr<LspMessage>)>;
+
public:
- PendingRequestInfo(const std::string& md,
- const RequestCallBack& callback);
- PendingRequestInfo(const std::string& md);
- PendingRequestInfo() {}
- std::string method;
- RequestCallBack futureInfo;
+ PendingRequestInfo(std::string const& md, RequestCallBack const& callback);
+ PendingRequestInfo(std::string const& md);
+ PendingRequestInfo()
+ {
+ }
+ std::string method;
+ RequestCallBack futureInfo;
};
-PendingRequestInfo::PendingRequestInfo(const std::string& _md,
- const RequestCallBack& callback) : method(_md),
- futureInfo(callback)
+PendingRequestInfo::PendingRequestInfo(std::string const& _md, RequestCallBack const& callback)
+ : method(_md), futureInfo(callback)
{
}
-PendingRequestInfo::PendingRequestInfo(const std::string& md) : method(md)
+PendingRequestInfo::PendingRequestInfo(std::string const& md) : method(md)
{
}
struct RemoteEndPoint::Data
{
- explicit Data(lsp::JSONStreamStyle style,uint8_t workers,lsp::Log& _log , RemoteEndPoint* owner)
- : max_workers(workers), m_id(0),next_request_cookie(0), log(_log)
+ explicit Data(lsp::JSONStreamStyle style, uint8_t workers, lsp::Log& _log, RemoteEndPoint* owner)
+ : max_workers(workers), m_id(0), next_request_cookie(0), log(_log)
+ {
+ if (style == lsp::JSONStreamStyle::Standard)
{
- if(style == lsp::JSONStreamStyle::Standard )
- message_producer = (new LSPStreamMessageProducer(*owner)) ;
- else{
- message_producer = (new DelimitedStreamMessageProducer(*owner)) ;
- }
+ message_producer = (new LSPStreamMessageProducer(*owner));
}
- ~Data()
+ else
{
- delete message_producer;
+ message_producer = (new DelimitedStreamMessageProducer(*owner));
}
+ }
+ ~Data()
+ {
+ delete message_producer;
+ }
uint8_t max_workers;
- std::atomic<int> m_id;
+ std::atomic<int> m_id;
std::shared_ptr<boost::asio::thread_pool> tp;
- // Method calls may be cancelled by ID, so keep track of their state.
- // This needs a mutex: handlers may finish on a different thread, and that's
- // when we clean up entries in the map.
- mutable std::mutex request_cancelers_mutex;
-
- std::map< lsRequestId, std::pair<Canceler, /*Cookie*/ unsigned> > requestCancelers;
-
- std::atomic<unsigned> next_request_cookie; // To disambiguate reused IDs, see below.
- void onCancel(Notify_Cancellation::notify* notify) {
- std::lock_guard<std::mutex> Lock(request_cancelers_mutex);
- const auto it = requestCancelers.find(notify->params.id);
- if (it != requestCancelers.end())
- it->second.first(); // Invoke the canceler.
+ // Method calls may be cancelled by ID, so keep track of their state.
+ // This needs a mutex: handlers may finish on a different thread, and that's
+ // when we clean up entries in the map.
+ mutable std::mutex request_cancelers_mutex;
+
+ std::map<lsRequestId, std::pair<Canceler, /*Cookie*/ unsigned>> requestCancelers;
+
+ std::atomic<unsigned> next_request_cookie; // To disambiguate reused IDs, see below.
+ void onCancel(Notify_Cancellation::notify* notify)
+ {
+ std::lock_guard<std::mutex> Lock(request_cancelers_mutex);
+ auto const it = requestCancelers.find(notify->params.id);
+ if (it != requestCancelers.end())
+ {
+ it->second.first(); // Invoke the canceler.
}
+ }
- // We run cancelable requests in a context that does two things:
- // - allows cancellation using requestCancelers[ID]
- // - cleans up the entry in requestCancelers when it's no longer needed
- // If a client reuses an ID, the last wins and the first cannot be canceled.
- Context cancelableRequestContext(lsRequestId id) {
- auto task = cancelableTask(id,
- /*Reason=*/static_cast<int>(lsErrorCodes::RequestCancelled));
- unsigned cookie;
+ // We run cancelable requests in a context that does two things:
+ // - allows cancellation using requestCancelers[ID]
+ // - cleans up the entry in requestCancelers when it's no longer needed
+ // If a client reuses an ID, the last wins and the first cannot be canceled.
+ Context cancelableRequestContext(lsRequestId id)
+ {
+ auto task = cancelableTask(
+ id,
+ /*Reason=*/static_cast<int>(lsErrorCodes::RequestCancelled)
+ );
+ unsigned cookie;
+ {
+ std::lock_guard<std::mutex> Lock(request_cancelers_mutex);
+ cookie = next_request_cookie.fetch_add(1, std::memory_order_relaxed);
+ requestCancelers[id] = {std::move(task.second), cookie};
+ }
+ // When the request ends, we can clean up the entry we just added.
+ // The cookie lets us check that it hasn't been overwritten due to ID
+ // reuse.
+ return task.first.derive(lsp::make_scope_exit(
+ [this, id, cookie]
+ {
+ std::lock_guard<std::mutex> lock(request_cancelers_mutex);
+ auto const& it = requestCancelers.find(id);
+ if (it != requestCancelers.end() && it->second.second == cookie)
{
- std::lock_guard<std::mutex> Lock(request_cancelers_mutex);
- cookie = next_request_cookie.fetch_add(1, std::memory_order_relaxed);
- requestCancelers[id] = { std::move(task.second), cookie };
+ requestCancelers.erase(it);
}
- // When the request ends, we can clean up the entry we just added.
- // The cookie lets us check that it hasn't been overwritten due to ID
- // reuse.
- return task.first.derive(lsp::make_scope_exit([this, id, cookie] {
- std::lock_guard<std::mutex> lock(request_cancelers_mutex);
- const auto& it = requestCancelers.find(id);
- if (it != requestCancelers.end() && it->second.second == cookie)
- requestCancelers.erase(it);
- }));
- }
+ }
+ ));
+ }
- std::map <lsRequestId, std::shared_ptr<PendingRequestInfo>> _client_request_futures;
- StreamMessageProducer* message_producer;
- std::atomic<bool> quit{};
- lsp::Log& log;
- std::shared_ptr<lsp::istream> input;
- std::shared_ptr<lsp::ostream> output;
+ std::map<lsRequestId, std::shared_ptr<PendingRequestInfo>> _client_request_futures;
+ StreamMessageProducer* message_producer;
+ std::atomic<bool> quit {};
+ lsp::Log& log;
+ std::shared_ptr<lsp::istream> input;
+ std::shared_ptr<lsp::ostream> output;
std::mutex m_requestInfo;
- bool pendingRequest(RequestInMessage& info, GenericResponseHandler&& handler)
- {
+ bool pendingRequest(RequestInMessage& info, GenericResponseHandler&& handler)
+ {
bool ret = true;
std::lock_guard<std::mutex> lock(m_requestInfo);
- if(!info.id.has_value()){
+ if (!info.id.has_value())
+ {
auto id = getNextRequestId();
info.id.set(id);
}
- else{
- if(_client_request_futures.find(info.id) != _client_request_futures.end()){
- ret = false;
+ else
+ {
+ if (_client_request_futures.find(info.id) != _client_request_futures.end())
+ {
+ ret = false;
}
}
_client_request_futures[info.id] = std::make_shared<PendingRequestInfo>(info.method, handler);
return ret;
- }
- const std::shared_ptr<const PendingRequestInfo> getRequestInfo(const lsRequestId& _id)
+ }
+ std::shared_ptr<PendingRequestInfo const> const getRequestInfo(lsRequestId const& _id)
+ {
+ std::lock_guard<std::mutex> lock(m_requestInfo);
+ auto findIt = _client_request_futures.find(_id);
+ if (findIt != _client_request_futures.end())
{
- std::lock_guard<std::mutex> lock(m_requestInfo);
- auto findIt = _client_request_futures.find(_id);
- if (findIt != _client_request_futures.end())
- {
- return findIt->second;
- }
- return nullptr;
+ return findIt->second;
}
+ return nullptr;
+ }
- void removeRequestInfo(const lsRequestId& _id)
+ void removeRequestInfo(lsRequestId const& _id)
+ {
+ std::lock_guard<std::mutex> lock(m_requestInfo);
+ auto findIt = _client_request_futures.find(_id);
+ if (findIt != _client_request_futures.end())
{
- std::lock_guard<std::mutex> lock(m_requestInfo);
- auto findIt = _client_request_futures.find(_id);
- if (findIt != _client_request_futures.end())
- {
- _client_request_futures.erase(findIt);
- }
+ _client_request_futures.erase(findIt);
}
- void clear()
+ }
+ void clear()
+ {
{
- {
- std::lock_guard<std::mutex> lock(m_requestInfo);
- _client_request_futures.clear();
- }
- if(tp){
- tp->stop();
+ std::lock_guard<std::mutex> lock(m_requestInfo);
+ _client_request_futures.clear();
}
- quit.store(true, std::memory_order_relaxed);
+ if (tp)
+ {
+ tp->stop();
}
+ quit.store(true, std::memory_order_relaxed);
+ }
int getNextRequestId()
{
@@ -265,248 +288,246 @@ struct RemoteEndPoint::Data
namespace
{
-void WriterMsg(std::shared_ptr<lsp::ostream>& output, LspMessage& msg)
+void WriterMsg(std::shared_ptr<lsp::ostream>& output, LspMessage& msg)
{
- const auto& s = msg.ToJson();
- const auto value =
- std::string("Content-Length: ") + std::to_string(s.size()) + "\r\n\r\n" + s;
- output->write(value);
- output->flush();
+ auto const& s = msg.ToJson();
+ auto const value = std::string("Content-Length: ") + std::to_string(s.size()) + "\r\n\r\n" + s;
+ output->write(value);
+ output->flush();
}
bool isResponseMessage(JsonReader& visitor)
{
- if (!visitor.HasMember("id"))
- {
- return false;
- }
+ if (!visitor.HasMember("id"))
+ {
+ return false;
+ }
- if (!visitor.HasMember("result") && !visitor.HasMember("error"))
- {
- return false;
- }
+ if (!visitor.HasMember("result") && !visitor.HasMember("error"))
+ {
+ return false;
+ }
- return true;
+ return true;
}
bool isRequestMessage(JsonReader& visitor)
{
- if (!visitor.HasMember("method"))
- {
- return false;
- }
- if (!visitor["method"]->IsString())
- {
- return false;
- }
- if (!visitor.HasMember("id"))
- {
- return false;
- }
- return true;
+ if (!visitor.HasMember("method"))
+ {
+ return false;
+ }
+ if (!visitor["method"]->IsString())
+ {
+ return false;
+ }
+ if (!visitor.HasMember("id"))
+ {
+ return false;
+ }
+ return true;
}
bool isNotificationMessage(JsonReader& visitor)
{
- if (!visitor.HasMember("method"))
- {
- return false;
- }
- if (!visitor["method"]->IsString())
- {
- return false;
- }
- if (visitor.HasMember("id"))
- {
- return false;
- }
- return true;
-}
+ if (!visitor.HasMember("method"))
+ {
+ return false;
+ }
+ if (!visitor["method"]->IsString())
+ {
+ return false;
+ }
+ if (visitor.HasMember("id"))
+ {
+ return false;
+ }
+ return true;
}
+} // namespace
-CancelMonitor RemoteEndPoint::getCancelMonitor(const lsRequestId& id)
+CancelMonitor RemoteEndPoint::getCancelMonitor(lsRequestId const& id)
{
- auto monitor = getCancelledMonitor(id);
- if(monitor.has_value())
- {
- return monitor.value();
- }
- return [] {
- return 0;
- };
-
+ auto monitor = getCancelledMonitor(id);
+ if (monitor.has_value())
+ {
+ return monitor.value();
+ }
+ return [] { return 0; };
}
RemoteEndPoint::RemoteEndPoint(
- const std::shared_ptr < MessageJsonHandler >& json_handler,const std::shared_ptr < Endpoint>& localEndPoint,
- lsp::Log& _log, lsp::JSONStreamStyle style, uint8_t max_workers):
- d_ptr(new Data(style,max_workers,_log,this)),jsonHandler(json_handler), local_endpoint(localEndPoint)
+ std::shared_ptr<MessageJsonHandler> const& json_handler, std::shared_ptr<Endpoint> const& localEndPoint,
+ lsp::Log& _log, lsp::JSONStreamStyle style, uint8_t max_workers
+)
+ : d_ptr(new Data(style, max_workers, _log, this)), jsonHandler(json_handler), local_endpoint(localEndPoint)
{
- jsonHandler->method2notification[Notify_Cancellation::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_Cancellation::notify::ReflectReader(visitor);
- };
+ jsonHandler->method2notification[Notify_Cancellation::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_Cancellation::notify::ReflectReader(visitor); };
- d_ptr->quit.store(false, std::memory_order_relaxed);
+ d_ptr->quit.store(false, std::memory_order_relaxed);
}
RemoteEndPoint::~RemoteEndPoint()
{
- delete d_ptr;
- d_ptr->quit.store(true, std::memory_order_relaxed);
+ delete d_ptr;
+ d_ptr->quit.store(true, std::memory_order_relaxed);
}
-bool RemoteEndPoint::dispatch(const std::string& content)
+bool RemoteEndPoint::dispatch(std::string const& content)
{
- rapidjson::Document document;
- document.Parse(content.c_str(), content.length());
- if (document.HasParseError())
- {
- std::string info ="lsp msg format error:";
- rapidjson::GetParseErrorFunc GetParseError = rapidjson::GetParseError_En; // or whatever
- info+= GetParseError(document.GetParseError());
- info += "\n";
- info += "ErrorContext offset:\n";
- info += content.substr(document.GetErrorOffset());
- d_ptr->log.log(Log::Level::SEVERE, info);
-
- return false;
- }
+ rapidjson::Document document;
+ document.Parse(content.c_str(), content.length());
+ if (document.HasParseError())
+ {
+ std::string info = "lsp msg format error:";
+ rapidjson::GetParseErrorFunc GetParseError = rapidjson::GetParseError_En; // or whatever
+ info += GetParseError(document.GetParseError());
+ info += "\n";
+ info += "ErrorContext offset:\n";
+ info += content.substr(document.GetErrorOffset());
+ d_ptr->log.log(Log::Level::SEVERE, info);
- JsonReader visitor{ &document };
- if (!visitor.HasMember("jsonrpc") ||
- std::string(visitor["jsonrpc"]->GetString()) != "2.0")
- {
- std::string reason;
- reason = "Reason:Bad or missing jsonrpc version\n";
- reason += "content:\n" + content;
- d_ptr->log.log(Log::Level::SEVERE, reason);
- return false;
+ return false;
+ }
- }
- LspMessage::Kind _kind = LspMessage::NOTIFICATION_MESSAGE;
- try {
- if (isRequestMessage(visitor))
- {
- _kind = LspMessage::REQUEST_MESSAGE;
- auto msg = jsonHandler->parseRequstMessage(visitor["method"]->GetString(), visitor);
- if (msg) {
- mainLoop(std::move(msg));
- }
- else {
- std::string info = "Unknown support request message when consumer message:\n";
- info += content;
- d_ptr->log.log(Log::Level::WARNING, info);
- return false;
- }
- }
- else if (isResponseMessage(visitor))
- {
- _kind = LspMessage::RESPONCE_MESSAGE;
- lsRequestId id;
- ReflectMember(visitor, "id", id);
+ JsonReader visitor {&document};
+ if (!visitor.HasMember("jsonrpc") || std::string(visitor["jsonrpc"]->GetString()) != "2.0")
+ {
+ std::string reason;
+ reason = "Reason:Bad or missing jsonrpc version\n";
+ reason += "content:\n" + content;
+ d_ptr->log.log(Log::Level::SEVERE, reason);
+ return false;
+ }
+ LspMessage::Kind _kind = LspMessage::NOTIFICATION_MESSAGE;
+ try
+ {
+ if (isRequestMessage(visitor))
+ {
+ _kind = LspMessage::REQUEST_MESSAGE;
+ auto msg = jsonHandler->parseRequstMessage(visitor["method"]->GetString(), visitor);
+ if (msg)
+ {
+ mainLoop(std::move(msg));
+ }
+ else
+ {
+ std::string info = "Unknown support request message when consumer message:\n";
+ info += content;
+ d_ptr->log.log(Log::Level::WARNING, info);
+ return false;
+ }
+ }
+ else if (isResponseMessage(visitor))
+ {
+ _kind = LspMessage::RESPONCE_MESSAGE;
+ lsRequestId id;
+ ReflectMember(visitor, "id", id);
+
+ auto msgInfo = d_ptr->getRequestInfo(id);
+ if (!msgInfo)
+ {
+ std::string info = "Unknown response message :\n";
+ info += content;
+ d_ptr->log.log(Log::Level::INFO, info);
+ }
+ else
+ {
- auto msgInfo = d_ptr->getRequestInfo(id);
- if (!msgInfo)
- {
+ auto msg = jsonHandler->parseResponseMessage(msgInfo->method, visitor);
+ if (msg)
+ {
+ mainLoop(std::move(msg));
+ }
+ else
+ {
std::string info = "Unknown response message :\n";
info += content;
- d_ptr->log.log(Log::Level::INFO, info);
- }
- else
- {
-
- auto msg = jsonHandler->parseResponseMessage(msgInfo->method, visitor);
- if (msg) {
- mainLoop(std::move(msg));
- }
- else
- {
- std::string info = "Unknown response message :\n";
- info += content;
- d_ptr->log.log(Log::Level::SEVERE, info);
- return false;
- }
-
- }
- }
- else if (isNotificationMessage(visitor))
- {
- auto msg = jsonHandler->parseNotificationMessage(visitor["method"]->GetString(), visitor);
- if (!msg)
- {
- std::string info = "Unknown notification message :\n";
- info += content;
- d_ptr->log.log(Log::Level::SEVERE, info);
- return false;
- }
- mainLoop(std::move(msg));
- }
- else
- {
- std::string info = "Unknown lsp message when consumer message:\n";
- info += content;
- d_ptr->log.log(Log::Level::WARNING, info);
- return false;
- }
+ d_ptr->log.log(Log::Level::SEVERE, info);
+ return false;
}
- catch (std::exception& e)
- {
+ }
+ }
+ else if (isNotificationMessage(visitor))
+ {
+ auto msg = jsonHandler->parseNotificationMessage(visitor["method"]->GetString(), visitor);
+ if (!msg)
+ {
+ std::string info = "Unknown notification message :\n";
+ info += content;
+ d_ptr->log.log(Log::Level::SEVERE, info);
+ return false;
+ }
+ mainLoop(std::move(msg));
+ }
+ else
+ {
+ std::string info = "Unknown lsp message when consumer message:\n";
+ info += content;
+ d_ptr->log.log(Log::Level::WARNING, info);
+ return false;
+ }
+ }
+ catch (std::exception& e)
+ {
- std::string info = "Exception when process ";
- if(_kind==LspMessage::REQUEST_MESSAGE)
- {
- info += "request";
- }
- if (_kind == LspMessage::RESPONCE_MESSAGE)
- {
- info += "response";
- }
- else
- {
- info += "notification";
- }
- info += " message:\n";
- info += e.what();
- std::string reason = "Reason:" + info + "\n";
- reason += "content:\n" + content;
- d_ptr->log.log(Log::Level::SEVERE, reason);
- return false;
- }
- return true;
+ std::string info = "Exception when process ";
+ if (_kind == LspMessage::REQUEST_MESSAGE)
+ {
+ info += "request";
+ }
+ if (_kind == LspMessage::RESPONCE_MESSAGE)
+ {
+ info += "response";
+ }
+ else
+ {
+ info += "notification";
+ }
+ info += " message:\n";
+ info += e.what();
+ std::string reason = "Reason:" + info + "\n";
+ reason += "content:\n" + content;
+ d_ptr->log.log(Log::Level::SEVERE, reason);
+ return false;
+ }
+ return true;
}
-
-
bool RemoteEndPoint::internalSendRequest(RequestInMessage& info, GenericResponseHandler handler)
{
- std::lock_guard<std::mutex> lock(m_sendMutex);
- if (!d_ptr->output || d_ptr->output->bad())
- {
- std::string desc = "Output isn't good any more:\n";
- d_ptr->log.log(Log::Level::WARNING, desc);
- return false;
- }
- if(!d_ptr->pendingRequest(info, std::move(handler)))
+ std::lock_guard<std::mutex> lock(m_sendMutex);
+ if (!d_ptr->output || d_ptr->output->bad())
+ {
+ std::string desc = "Output isn't good any more:\n";
+ d_ptr->log.log(Log::Level::WARNING, desc);
+ return false;
+ }
+ if (!d_ptr->pendingRequest(info, std::move(handler)))
{
std::string desc = "Duplicate id which of request:";
desc += info.ToJson();
desc += "\n";
d_ptr->log.log(Log::Level::WARNING, desc);
}
- WriterMsg(d_ptr->output, info);
+ WriterMsg(d_ptr->output, info);
return true;
}
-int RemoteEndPoint::getNextRequestId(){
- return d_ptr->getNextRequestId();
+int RemoteEndPoint::getNextRequestId()
+{
+ return d_ptr->getNextRequestId();
}
-bool RemoteEndPoint::cancelRequest(const lsRequestId& id){
- if(!isWorking()){
+bool RemoteEndPoint::cancelRequest(lsRequestId const& id)
+{
+ if (!isWorking())
+ {
return false;
}
auto msgInfo = d_ptr->getRequestInfo(id);
- if (msgInfo){
+ if (msgInfo)
+ {
Notify_Cancellation::notify cancel_notify;
cancel_notify.params.id = id;
send(cancel_notify);
@@ -516,140 +537,149 @@ bool RemoteEndPoint::cancelRequest(const lsRequestId& id){
}
std::unique_ptr<LspMessage> RemoteEndPoint::internalWaitResponse(RequestInMessage& request, unsigned time_out)
{
- auto eventFuture = std::make_shared< Condition< LspMessage > >();
- internalSendRequest(request, [=](std::unique_ptr<LspMessage> data)
+ auto eventFuture = std::make_shared<Condition<LspMessage>>();
+ internalSendRequest(
+ request,
+ [=](std::unique_ptr<LspMessage> data)
{
- eventFuture->notify(std::move(data));
- return true;
- });
- return eventFuture->wait(time_out);
+ eventFuture->notify(std::move(data));
+ return true;
+ }
+ );
+ return eventFuture->wait(time_out);
}
-void RemoteEndPoint::mainLoop(std::unique_ptr<LspMessage>msg)
+void RemoteEndPoint::mainLoop(std::unique_ptr<LspMessage> msg)
{
- if(d_ptr->quit.load(std::memory_order_relaxed))
- {
- return;
- }
- const auto _kind = msg->GetKid();
- if (_kind == LspMessage::REQUEST_MESSAGE)
+ if (d_ptr->quit.load(std::memory_order_relaxed))
+ {
+ return;
+ }
+ auto const _kind = msg->GetKid();
+ if (_kind == LspMessage::REQUEST_MESSAGE)
+ {
+ auto req = static_cast<RequestInMessage*>(msg.get());
+ // Calls can be canceled by the client. Add cancellation context.
+ WithContext WithCancel(d_ptr->cancelableRequestContext(req->id));
+ local_endpoint->onRequest(std::move(msg));
+ }
+
+ else if (_kind == LspMessage::RESPONCE_MESSAGE)
+ {
+ auto const id = static_cast<ResponseInMessage*>(msg.get())->id;
+ auto msgInfo = d_ptr->getRequestInfo(id);
+ if (!msgInfo)
{
- auto req = static_cast<RequestInMessage*>(msg.get());
- // Calls can be canceled by the client. Add cancellation context.
- WithContext WithCancel(d_ptr->cancelableRequestContext(req->id));
- local_endpoint->onRequest(std::move(msg));
+ auto const _method_desc = msg->GetMethodType();
+ local_endpoint->onResponse(_method_desc, std::move(msg));
}
-
- else if (_kind == LspMessage::RESPONCE_MESSAGE)
+ else
{
- const auto id = static_cast<ResponseInMessage*>(msg.get())->id;
- auto msgInfo = d_ptr->getRequestInfo(id);
- if (!msgInfo)
+ bool needLocal = true;
+ if (msgInfo->futureInfo)
+ {
+ if (msgInfo->futureInfo(std::move(msg)))
{
- const auto _method_desc = msg->GetMethodType();
- local_endpoint->onResponse(_method_desc, std::move(msg));
- }
- else
- {
- bool needLocal = true;
- if (msgInfo->futureInfo)
- {
- if (msgInfo->futureInfo(std::move(msg)))
- {
- needLocal = false;
- }
- }
- if (needLocal)
- {
- local_endpoint->onResponse(msgInfo->method, std::move(msg));
- }
- d_ptr->removeRequestInfo(id);
+ needLocal = false;
}
+ }
+ if (needLocal)
+ {
+ local_endpoint->onResponse(msgInfo->method, std::move(msg));
+ }
+ d_ptr->removeRequestInfo(id);
}
- else if (_kind == LspMessage::NOTIFICATION_MESSAGE)
+ }
+ else if (_kind == LspMessage::NOTIFICATION_MESSAGE)
+ {
+ if (strcmp(Notify_Cancellation::notify::kMethodInfo, msg->GetMethodType()) == 0)
{
- if (strcmp(Notify_Cancellation::notify::kMethodInfo, msg->GetMethodType())==0)
- {
- d_ptr->onCancel(static_cast<Notify_Cancellation::notify*>(msg.get()));
- }
- else
- {
- local_endpoint->notify(std::move(msg));
- }
-
+ d_ptr->onCancel(static_cast<Notify_Cancellation::notify*>(msg.get()));
}
else
{
- std::string info = "Unknown lsp message when process message in mainLoop:\n";
- d_ptr->log.log(Log::Level::WARNING, info);
+ local_endpoint->notify(std::move(msg));
}
+ }
+ else
+ {
+ std::string info = "Unknown lsp message when process message in mainLoop:\n";
+ d_ptr->log.log(Log::Level::WARNING, info);
+ }
}
void RemoteEndPoint::handle(std::vector<MessageIssue>&& issue)
{
- for(auto& it : issue)
- {
- d_ptr->log.log(it.code, it.text);
- }
+ for (auto& it : issue)
+ {
+ d_ptr->log.log(it.code, it.text);
+ }
}
void RemoteEndPoint::handle(MessageIssue&& issue)
{
- d_ptr->log.log(issue.code, issue.text);
+ d_ptr->log.log(issue.code, issue.text);
}
-
-void RemoteEndPoint::startProcessingMessages(std::shared_ptr<lsp::istream> r,
- std::shared_ptr<lsp::ostream> w)
+void RemoteEndPoint::startProcessingMessages(std::shared_ptr<lsp::istream> r, std::shared_ptr<lsp::ostream> w)
{
- d_ptr->quit.store(false, std::memory_order_relaxed);
- d_ptr->input = r;
- d_ptr->output = w;
- d_ptr->message_producer->bind(r);
+ d_ptr->quit.store(false, std::memory_order_relaxed);
+ d_ptr->input = r;
+ d_ptr->output = w;
+ d_ptr->message_producer->bind(r);
d_ptr->tp = std::make_shared<boost::asio::thread_pool>(d_ptr->max_workers);
- message_producer_thread_ = std::make_shared<std::thread>([&]()
- {
- d_ptr->message_producer->listen([&](std::string&& content){
- const auto temp = std::make_shared<std::string>(std::move(content));
- boost::asio::post(*d_ptr->tp,
- [this, temp]{
+ message_producer_thread_ = std::make_shared<std::thread>(
+ [&]()
+ {
+ d_ptr->message_producer->listen(
+ [&](std::string&& content)
+ {
+ auto const temp = std::make_shared<std::string>(std::move(content));
+ boost::asio::post(
+ *d_ptr->tp,
+ [this, temp]
+ {
#ifdef LSPCPP_USEGC
- GCThreadContext gcContext;
+ GCThreadContext gcContext;
#endif
- dispatch(*temp);
- });
- });
- });
+ dispatch(*temp);
+ }
+ );
+ }
+ );
+ }
+ );
}
void RemoteEndPoint::stop()
{
- if(message_producer_thread_ && message_producer_thread_->joinable())
- {
- message_producer_thread_->detach();
+ if (message_producer_thread_ && message_producer_thread_->joinable())
+ {
+ message_producer_thread_->detach();
message_producer_thread_ = nullptr;
- }
- d_ptr->clear();
-
+ }
+ d_ptr->clear();
}
-void RemoteEndPoint::sendMsg( LspMessage& msg)
+void RemoteEndPoint::sendMsg(LspMessage& msg)
{
- std::lock_guard<std::mutex> lock(m_sendMutex);
- if (!d_ptr->output || d_ptr->output->bad())
- {
- std::string info = "Output isn't good any more:\n";
- d_ptr->log.log(Log::Level::INFO, info);
- return;
- }
- WriterMsg(d_ptr->output, msg);
-
+ std::lock_guard<std::mutex> lock(m_sendMutex);
+ if (!d_ptr->output || d_ptr->output->bad())
+ {
+ std::string info = "Output isn't good any more:\n";
+ d_ptr->log.log(Log::Level::INFO, info);
+ return;
+ }
+ WriterMsg(d_ptr->output, msg);
}
-bool RemoteEndPoint::isWorking() const {
+bool RemoteEndPoint::isWorking() const
+{
if (message_producer_thread_ && message_producer_thread_->joinable())
+ {
return true;
- return false;
+ }
+ return false;
}
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/StreamMessageProducer.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/StreamMessageProducer.cpp
index 695c35fe1d..731a5541d6 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/StreamMessageProducer.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/StreamMessageProducer.cpp
@@ -5,193 +5,207 @@
#include "LibLsp/JsonRpc/stream.h"
#include "LibLsp/lsp/Markup/string_ref.h"
-
bool StartsWith(std::string value, std::string start);
-bool StartsWith(std::string value, std::string start) {
- if (start.size() > value.size())
- return false;
- return std::equal(start.begin(), start.end(), value.begin());
+bool StartsWith(std::string value, std::string start)
+{
+ if (start.size() > value.size())
+ {
+ return false;
+ }
+ return std::equal(start.begin(), start.end(), value.begin());
}
-using namespace std;
+using namespace std;
namespace
{
- string JSONRPC_VERSION = "2.0";
- string CONTENT_LENGTH_HEADER = "Content-Length";
- string CONTENT_TYPE_HEADER = "Content-Type";
- string JSON_MIME_TYPE = "application/json";
- string CRLF = "\r\n";
-
-}
+string JSONRPC_VERSION = "2.0";
+string CONTENT_LENGTH_HEADER = "Content-Length";
+string CONTENT_TYPE_HEADER = "Content-Type";
+string JSON_MIME_TYPE = "application/json";
+string CRLF = "\r\n";
- void LSPStreamMessageProducer::parseHeader(std::string& line, LSPStreamMessageProducer::Headers& headers)
- {
- int sepIndex = line.find(':');
- if (sepIndex >= 0) {
- auto key = line.substr(0, sepIndex);
- if(key == CONTENT_LENGTH_HEADER)
- {
- headers.contentLength = atoi(line.substr(sepIndex + 1).data());
- }
- else if(key == CONTENT_TYPE_HEADER)
- {
- int charsetIndex = line.find("charset=");
- if (charsetIndex >= 0)
- headers.charset = line.substr(charsetIndex + 8);
- }
- }
- }
+} // namespace
+void LSPStreamMessageProducer::parseHeader(std::string& line, LSPStreamMessageProducer::Headers& headers)
+{
+ int sepIndex = line.find(':');
+ if (sepIndex >= 0)
+ {
+ auto key = line.substr(0, sepIndex);
+ if (key == CONTENT_LENGTH_HEADER)
+ {
+ headers.contentLength = atoi(line.substr(sepIndex + 1).data());
+ }
+ else if (key == CONTENT_TYPE_HEADER)
+ {
+ int charsetIndex = line.find("charset=");
+ if (charsetIndex >= 0)
+ {
+ headers.charset = line.substr(charsetIndex + 8);
+ }
+ }
+ }
+}
void LSPStreamMessageProducer::listen(MessageConsumer callBack)
{
- if(!input)
- return;
+ if (!input)
+ {
+ return;
+ }
- keepRunning = true;
- bool newLine = false;
- Headers headers;
- string headerBuilder ;
- string debugBuilder ;
- // Read the content length. It is terminated by the "\r\n" sequence.
- while (keepRunning)
+ keepRunning = true;
+ bool newLine = false;
+ Headers headers;
+ string headerBuilder;
+ string debugBuilder;
+ // Read the content length. It is terminated by the "\r\n" sequence.
+ while (keepRunning)
+ {
+ if (input->bad())
{
- if(input->bad())
- {
- std::string info = "Input stream is bad.";
- auto what = input->what();
- if (what.size())
- {
- info += "Reason:";
- info += input->what();
- }
- MessageIssue issue(info, lsp::Log::Level::SEVERE);
- issueHandler.handle(std::move(issue));
- return;
- }
- if(input->fail())
+ std::string info = "Input stream is bad.";
+ auto what = input->what();
+ if (what.size())
+ {
+ info += "Reason:";
+ info += input->what();
+ }
+ MessageIssue issue(info, lsp::Log::Level::SEVERE);
+ issueHandler.handle(std::move(issue));
+ return;
+ }
+ if (input->fail())
+ {
+ std::string info = "Input fail.";
+ auto what = input->what();
+ if (what.size())
+ {
+ info += "Reason:";
+ info += input->what();
+ }
+ MessageIssue issue(info, lsp::Log::Level::WARNING);
+ issueHandler.handle(std::move(issue));
+ if (input->need_to_clear_the_state())
+ {
+ input->clear();
+ }
+ else
+ {
+ return;
+ }
+ }
+ int c = input->get();
+ if (c == EOF)
+ {
+ // End of input stream has been reached
+ keepRunning = false;
+ }
+ else
+ {
+
+ debugBuilder.push_back((char)c);
+ if (c == '\n')
+ {
+ if (newLine)
{
- std::string info = "Input fail.";
- auto what = input->what();
- if(what.size())
- {
- info += "Reason:";
- info += input->what();
- }
+ // Two consecutive newlines have been read, which signals the start of the message content
+ if (headers.contentLength <= 0)
+ {
+ string info = "Unexpected token:" + debugBuilder;
+ info = +" (expected Content-Length: sequence);";
MessageIssue issue(info, lsp::Log::Level::WARNING);
issueHandler.handle(std::move(issue));
- if(input->need_to_clear_the_state())
- input->clear();
- else
- {
- return;
- }
- }
- int c = input->get();
- if (c == EOF) {
- // End of input stream has been reached
- keepRunning = false;
- }
- else
- {
-
- debugBuilder.push_back((char)c);
- if (c == '\n')
+ }
+ else
{
- if (newLine) {
- // Two consecutive newlines have been read, which signals the start of the message content
- if (headers.contentLength <= 0)
- {
- string info = "Unexpected token:" + debugBuilder;
- info = +" (expected Content-Length: sequence);";
- MessageIssue issue(info, lsp::Log::Level::WARNING);
- issueHandler.handle(std::move(issue));
- }
- else {
- bool result = handleMessage(headers,callBack);
- if (!result)
- keepRunning = false;
- newLine = false;
- }
- headers.clear();
- debugBuilder.clear();
- }
- else if (!headerBuilder.empty()) {
- // A single newline ends a header line
- parseHeader(headerBuilder, headers);
- headerBuilder.clear();
+ bool result = handleMessage(headers, callBack);
+ if (!result)
+ {
+ keepRunning = false;
}
- newLine = true;
- }
- else if (c != '\r') {
- // Add the input to the current header line
-
- headerBuilder.push_back((char)c);
newLine = false;
}
+ headers.clear();
+ debugBuilder.clear();
}
- }
+ else if (!headerBuilder.empty())
+ {
+ // A single newline ends a header line
+ parseHeader(headerBuilder, headers);
+ headerBuilder.clear();
+ }
+ newLine = true;
+ }
+ else if (c != '\r')
+ {
+ // Add the input to the current header line
+ headerBuilder.push_back((char)c);
+ newLine = false;
+ }
+ }
+ }
}
-void LSPStreamMessageProducer::bind(std::shared_ptr<lsp::istream>_in)
+void LSPStreamMessageProducer::bind(std::shared_ptr<lsp::istream> _in)
{
- input = _in;
+ input = _in;
}
-bool LSPStreamMessageProducer::handleMessage(Headers& headers ,MessageConsumer callBack)
+bool LSPStreamMessageProducer::handleMessage(Headers& headers, MessageConsumer callBack)
{
- // Read content.
- auto content_length = headers.contentLength;
- std::string content(content_length,0);
- auto data = &content[0];
- input->read(data, content_length);
- if (input->bad())
- {
- std::string info = "Input stream is bad.";
- auto what = input->what();
- if (!what.empty())
- {
- info += "Reason:";
- info += input->what();
- }
- MessageIssue issue(info, lsp::Log::Level::SEVERE);
- issueHandler.handle(std::move(issue));
- return false;
- }
+ // Read content.
+ auto content_length = headers.contentLength;
+ std::string content(content_length, 0);
+ auto data = &content[0];
+ input->read(data, content_length);
+ if (input->bad())
+ {
+ std::string info = "Input stream is bad.";
+ auto what = input->what();
+ if (!what.empty())
+ {
+ info += "Reason:";
+ info += input->what();
+ }
+ MessageIssue issue(info, lsp::Log::Level::SEVERE);
+ issueHandler.handle(std::move(issue));
+ return false;
+ }
- if (input->eof())
- {
- MessageIssue issue("No more input when reading content body", lsp::Log::Level::INFO);
- issueHandler.handle(std::move(issue));
- return false;
- }
- if (input->fail())
- {
- std::string info = "Input fail.";
- auto what = input->what();
- if (!what.empty())
- {
- info += "Reason:";
- info += input->what();
- }
- MessageIssue issue(info, lsp::Log::Level::WARNING);
- issueHandler.handle(std::move(issue));
- if (input->need_to_clear_the_state())
- input->clear();
- else
- {
- return false;
- }
- }
+ if (input->eof())
+ {
+ MessageIssue issue("No more input when reading content body", lsp::Log::Level::INFO);
+ issueHandler.handle(std::move(issue));
+ return false;
+ }
+ if (input->fail())
+ {
+ std::string info = "Input fail.";
+ auto what = input->what();
+ if (!what.empty())
+ {
+ info += "Reason:";
+ info += input->what();
+ }
+ MessageIssue issue(info, lsp::Log::Level::WARNING);
+ issueHandler.handle(std::move(issue));
+ if (input->need_to_clear_the_state())
+ {
+ input->clear();
+ }
+ else
+ {
+ return false;
+ }
+ }
- callBack(std::move(content));
+ callBack(std::move(content));
- return true;
+ return true;
}
-
-
/// For lit tests we support a simplified syntax:
/// - messages are delimited by '// -----' on a line by itself
/// - lines starting with // are ignored.
@@ -199,15 +213,18 @@ bool LSPStreamMessageProducer::handleMessage(Headers& headers ,MessageConsumer c
void DelimitedStreamMessageProducer::listen(MessageConsumer callBack)
{
- if(!input)
+ if (!input)
+ {
return;
+ }
keepRunning = true;
- auto readLine = [&]( std::string_ref& lineBuilder) -> bool {
+ auto readLine = [&](std::string_ref& lineBuilder) -> bool
+ {
while (keepRunning)
{
- if(input->bad())
+ if (input->bad())
{
std::string info = "Input stream is bad.";
auto what = input->what();
@@ -220,26 +237,29 @@ void DelimitedStreamMessageProducer::listen(MessageConsumer callBack)
issueHandler.handle(std::move(issue));
return false;
}
- if(input->fail())
+ if (input->fail())
{
std::string info = "Input fail.";
auto what = input->what();
- if(what.size())
+ if (what.size())
{
info += "Reason:";
info += input->what();
}
MessageIssue issue(info, lsp::Log::Level::WARNING);
issueHandler.handle(std::move(issue));
- if(input->need_to_clear_the_state())
+ if (input->need_to_clear_the_state())
+ {
input->clear();
+ }
else
{
return false;
}
}
int c = input->get();
- if (c == EOF) {
+ if (c == EOF)
+ {
// End of input stream has been reached
keepRunning = false;
}
@@ -247,12 +267,14 @@ void DelimitedStreamMessageProducer::listen(MessageConsumer callBack)
{
if (c == '\n')
{
- if(!lineBuilder.empty()){
- lineBuilder.push_back(c);
+ if (!lineBuilder.empty())
+ {
+ lineBuilder.push_back(static_cast<char>(c));
return true;
}
}
- else if (c != '\r') {
+ else if (c != '\r')
+ {
// Add the input to the current header line
lineBuilder.push_back((char)c);
@@ -262,15 +284,18 @@ void DelimitedStreamMessageProducer::listen(MessageConsumer callBack)
return false;
};
- auto getMessage = [&](std::string& json) -> bool {
- std::string_ref lineBuilder ;
- while (readLine(lineBuilder)){
+ auto getMessage = [&](std::string& json) -> bool
+ {
+ std::string_ref lineBuilder;
+ while (readLine(lineBuilder))
+ {
lineBuilder.trim();
- if(lineBuilder.start_with("//")){
+ if (lineBuilder.start_with("//"))
+ {
// Found a delimiter for the message.
if (lineBuilder == "// -----")
{
- return true;
+ return true;
}
}
json += lineBuilder;
@@ -278,20 +303,21 @@ void DelimitedStreamMessageProducer::listen(MessageConsumer callBack)
return false;
};
-
- while (true) {
+ while (true)
+ {
std::string json;
- if (getMessage(json)) {
+ if (getMessage(json))
+ {
callBack(std::move(json));
- }else{
- return ;
+ }
+ else
+ {
+ return;
}
}
}
-void DelimitedStreamMessageProducer::bind(std::shared_ptr<lsp::istream>_in)
+void DelimitedStreamMessageProducer::bind(std::shared_ptr<lsp::istream> _in)
{
input = _in;
}
-
-
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/TcpServer.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/TcpServer.cpp
index 4b3a9aea35..3fcea5f8aa 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/TcpServer.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/TcpServer.cpp
@@ -9,111 +9,110 @@
#include "LibLsp/JsonRpc/MessageIssue.h"
#include "LibLsp/JsonRpc/stream.h"
+namespace lsp
+{
+struct tcp_connect_session;
+
+class tcp_stream_wrapper : public istream, public ostream
+{
+public:
+ tcp_stream_wrapper(tcp_connect_session& _w);
+
+ tcp_connect_session& session;
+ std::atomic<bool> quit {};
+ std::shared_ptr<MultiQueueWaiter> request_waiter;
+ ThreadedQueue<char> on_request;
+ std::string error_message;
+
+ bool fail() override
+ {
+ return bad();
+ }
-namespace lsp {
- struct tcp_connect_session;
-
-
- class tcp_stream_wrapper :public istream, public ostream
- {
- public:
- tcp_stream_wrapper(tcp_connect_session& _w);
-
- tcp_connect_session& session;
- std::atomic<bool> quit{};
- std::shared_ptr < MultiQueueWaiter> request_waiter;
- ThreadedQueue< char > on_request;
- std::string error_message;
-
-
- bool fail() override
- {
- return bad();
- }
-
-
-
- bool eof() override
- {
- return bad();
- }
- bool good() override
- {
- return !bad();
- }
- tcp_stream_wrapper& read(char* str, std::streamsize count)
- override
- {
- auto some = on_request.TryDequeueSome(static_cast<size_t>( count ));
- memcpy(str,some.data(),some.size());
- for (std::streamsize i = some.size(); i < count; ++i)
- {
- str[i] = static_cast<char>(get());
- }
-
- return *this;
- }
- int get() override
- {
- return on_request.Dequeue();
- }
+ bool eof() override
+ {
+ return bad();
+ }
+ bool good() override
+ {
+ return !bad();
+ }
+ tcp_stream_wrapper& read(char* str, std::streamsize count) override
+ {
+ auto some = on_request.TryDequeueSome(static_cast<size_t>(count));
+ memcpy(str, some.data(), some.size());
+ for (std::streamsize i = some.size(); i < count; ++i)
+ {
+ str[i] = static_cast<char>(get());
+ }
- bool bad() override;
+ return *this;
+ }
+ int get() override
+ {
+ return on_request.Dequeue();
+ }
- tcp_stream_wrapper& write(const std::string& c) override;
+ bool bad() override;
- tcp_stream_wrapper& write(std::streamsize _s) override;
+ tcp_stream_wrapper& write(std::string const& c) override;
- tcp_stream_wrapper& flush() override
- {
- return *this;
- }
- void reset_state()
- {
- return;
- }
+ tcp_stream_wrapper& write(std::streamsize _s) override;
- void clear() override
- {
+ tcp_stream_wrapper& flush() override
+ {
+ return *this;
+ }
+ void reset_state()
+ {
+ return;
+ }
- }
+ void clear() override
+ {
+ }
- std::string what() override;
- bool need_to_clear_the_state() override
- {
- return false;
- }
- };
- struct tcp_connect_session:std::enable_shared_from_this<tcp_connect_session>
- {
- /// Buffer for incoming data.
- std::array<unsigned char, 8192> buffer_;
- boost::asio::ip::tcp::socket socket_;
- /// Strand to ensure the connection's handlers are not called concurrently.
- boost::asio::io_context::strand strand_;
- std::shared_ptr<tcp_stream_wrapper> proxy_;
- explicit tcp_connect_session(boost::asio::io_context& io_context, boost::asio::ip::tcp::socket&& _socket)
- : socket_(std::move(_socket)), strand_(io_context), proxy_(new tcp_stream_wrapper(*this))
- {
- do_read();
- }
- void do_write(const char* data, size_t size)
- {
- socket_.async_write_some(boost::asio::buffer(data, size),
- boost::asio::bind_executor(strand_,[this](boost::system::error_code ec, std::size_t n)
- {
- if (!ec)
- {
- return;
- }
- proxy_->error_message = ec.message();
-
- }));
- }
- void do_read()
- {
- socket_.async_read_some(boost::asio::buffer(buffer_),
- boost::asio::bind_executor(strand_,
+ std::string what() override;
+ bool need_to_clear_the_state() override
+ {
+ return false;
+ }
+};
+struct tcp_connect_session : std::enable_shared_from_this<tcp_connect_session>
+{
+ /// Buffer for incoming data.
+ std::array<unsigned char, 8192> buffer_;
+ boost::asio::ip::tcp::socket socket_;
+ /// Strand to ensure the connection's handlers are not called concurrently.
+ boost::asio::io_context::strand strand_;
+ std::shared_ptr<tcp_stream_wrapper> proxy_;
+ explicit tcp_connect_session(boost::asio::io_context& io_context, boost::asio::ip::tcp::socket&& _socket)
+ : socket_(std::move(_socket)), strand_(io_context), proxy_(new tcp_stream_wrapper(*this))
+ {
+ do_read();
+ }
+ void do_write(char const* data, size_t size)
+ {
+ socket_.async_write_some(
+ boost::asio::buffer(data, size), boost::asio::bind_executor(
+ strand_,
+ [this](boost::system::error_code ec, std::size_t)
+ {
+ if (!ec)
+ {
+ return;
+ }
+ proxy_->error_message = ec.message();
+ }
+ )
+ );
+ }
+ void do_read()
+ {
+ socket_.async_read_some(
+ boost::asio::buffer(buffer_),
+ boost::asio::bind_executor(
+ strand_,
[this](boost::system::error_code ec, size_t bytes_transferred)
{
if (!ec)
@@ -124,183 +123,189 @@ namespace lsp {
return;
}
proxy_->error_message = ec.message();
+ }
+ )
+ );
+ }
+};
- }));
- }
- };
+tcp_stream_wrapper::tcp_stream_wrapper(tcp_connect_session& _w) : session(_w)
+{
+}
- tcp_stream_wrapper::tcp_stream_wrapper(tcp_connect_session& _w): session(_w)
- {
- }
+bool tcp_stream_wrapper::bad()
+{
+ return !session.socket_.is_open();
+}
- bool tcp_stream_wrapper::bad()
+tcp_stream_wrapper& tcp_stream_wrapper::write(std::string const& c)
+{
+ size_t off = 0;
+ for (; off < c.size();)
{
- return !session.socket_.is_open();
- }
-
- tcp_stream_wrapper& tcp_stream_wrapper::write(const std::string& c)
+ if (off + 1024 < c.size())
{
- size_t off = 0;
- for(;off < c.size();){
- if(off + 1024 < c.size()){
- session.do_write(c.data()+off,1024);
- off += 1024;
- }else{
- session.do_write(c.data()+off,c.size() - off);
- break;
- }
- }
- return *this;
+ session.do_write(c.data() + off, 1024);
+ off += 1024;
}
-
- tcp_stream_wrapper& tcp_stream_wrapper::write(std::streamsize _s)
+ else
+ {
+ session.do_write(c.data() + off, c.size() - off);
+ break;
+ }
+ }
+ return *this;
+}
+
+tcp_stream_wrapper& tcp_stream_wrapper::write(std::streamsize _s)
+{
+ auto s = std::to_string(_s);
+ session.do_write(s.data(), s.size());
+ return *this;
+}
+
+std::string tcp_stream_wrapper::what()
+{
+ if (error_message.size())
{
- auto s = std::to_string(_s);
- session.do_write(s.data(),s.size());
- return *this;
+ return error_message;
}
- std::string tcp_stream_wrapper::what()
- {
- if (error_message.size())
- return error_message;
-
- if(! session.socket_.is_open())
- {
- return "Socket is not open.";
- }
- return {};
- }
+ if (!session.socket_.is_open())
+ {
+ return "Socket is not open.";
+ }
+ return {};
+}
- struct TcpServer::Data
+struct TcpServer::Data
+{
+ Data(lsp::Log& log, uint32_t) : acceptor_(io_context_), _log(log)
{
- Data(
- lsp::Log& log, uint32_t _max_workers) :
- acceptor_(io_context_), _log(log)
- {
- }
+ }
- ~Data()
- {
+ ~Data()
+ {
+ }
+ /// The io_context used to perform asynchronous operations.
+ boost::asio::io_context io_context_;
- }
- /// The io_context used to perform asynchronous operations.
- boost::asio::io_context io_context_;
+ std::shared_ptr<boost::asio::executor_work_guard<boost::asio::io_context::executor_type>> work;
- std::shared_ptr<boost::asio::io_service::work> work;
+ std::shared_ptr<tcp_connect_session> _connect_session;
+ /// Acceptor used to listen for incoming connections.
+ boost::asio::ip::tcp::acceptor acceptor_;
- std::shared_ptr<tcp_connect_session> _connect_session;
- /// Acceptor used to listen for incoming connections.
- boost::asio::ip::tcp::acceptor acceptor_;
+ lsp::Log& _log;
+};
- lsp::Log& _log;
+TcpServer::~TcpServer()
+{
+ delete d_ptr;
+}
- };
+TcpServer::TcpServer(
+ std::string const& address, std::string const& port, std::shared_ptr<MessageJsonHandler> json_handler,
+ std::shared_ptr<Endpoint> localEndPoint, lsp::Log& log, uint32_t _max_workers
+)
+ : point(json_handler, localEndPoint, log, lsp::JSONStreamStyle::Standard, static_cast<uint8_t>(_max_workers)),
+ d_ptr(new Data(log, _max_workers))
- TcpServer::~TcpServer()
- {
- delete d_ptr;
- }
+{
- TcpServer::TcpServer(const std::string& address, const std::string& port,
- std::shared_ptr < MessageJsonHandler> json_handler,
- std::shared_ptr < Endpoint> localEndPoint, lsp::Log& log, uint32_t _max_workers)
- : point(json_handler, localEndPoint, log,lsp::JSONStreamStyle::Standard, _max_workers),d_ptr(new Data( log, _max_workers))
+ d_ptr->work = std::make_shared<boost::asio::executor_work_guard<boost::asio::io_context::executor_type>>(d_ptr->io_context_.get_executor());
+ // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
+ boost::asio::ip::tcp::resolver resolver(d_ptr->io_context_);
+ boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(address, port).begin();
+ d_ptr->acceptor_.open(endpoint.protocol());
+ d_ptr->acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
+ try
+ {
+ d_ptr->acceptor_.bind(endpoint);
+ }
+ catch (boost::system::system_error& e)
+ {
+ std::string temp = "Socket Server bind failed.";
+ d_ptr->_log.log(lsp::Log::Level::INFO, temp + e.what());
+ return;
+ }
+ d_ptr->acceptor_.listen();
+
+ do_accept();
+ std::string desc = "Socket TcpServer " + address + " " + port + " start.";
+ d_ptr->_log.log(lsp::Log::Level::INFO, desc);
+}
+
+void TcpServer::run()
+{
+ // The io_context::run() call will block until all asynchronous operations
+ // have finished. While the TcpServer is running, there is always at least one
+ // asynchronous operation outstanding: the asynchronous accept call waiting
+ // for new incoming connections.
+ d_ptr->io_context_.run();
+}
+
+void TcpServer::stop()
+{
+ try
+ {
+ if (d_ptr->work)
{
-
- d_ptr->work = std::make_shared<boost::asio::io_service::work>(d_ptr->io_context_);
-
- // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
- boost::asio::ip::tcp::resolver resolver(d_ptr->io_context_);
- boost::asio::ip::tcp::endpoint endpoint =
- *resolver.resolve(address, port).begin();
- d_ptr->acceptor_.open(endpoint.protocol());
- d_ptr->acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
- try
- {
- d_ptr->acceptor_.bind(endpoint);
- }
- catch (boost::system::system_error & e)
- {
- std::string temp = "Socket Server bind failed.";
- d_ptr->_log.log(lsp::Log::Level::INFO , temp + e.what());
- return;
- }
- d_ptr->acceptor_.listen();
-
- do_accept();
- std::string desc = "Socket TcpServer " + address + " " + port + " start.";
- d_ptr->_log.log(lsp::Log::Level::INFO, desc);
+ d_ptr->work.reset();
}
- void TcpServer::run()
- {
- // The io_context::run() call will block until all asynchronous operations
- // have finished. While the TcpServer is running, there is always at least one
- // asynchronous operation outstanding: the asynchronous accept call waiting
- // for new incoming connections.
- d_ptr->io_context_.run();
-
- }
+ do_stop();
+ }
+ catch (...)
+ {
+ }
+}
- void TcpServer::stop()
+void TcpServer::do_accept()
+{
+ d_ptr->acceptor_.async_accept(
+ [this](boost::system::error_code ec, boost::asio::ip::tcp::socket socket)
{
- try
- {
- if(d_ptr->work)
- d_ptr->work.reset();
-
- do_stop();
- }
- catch (...)
+ // Check whether the TcpServer was stopped by a signal before this
+ // completion handler had a chance to run.
+ if (!d_ptr->acceptor_.is_open())
{
+ return;
}
- }
- void TcpServer::do_accept()
- {
- d_ptr->acceptor_.async_accept(
- [this](boost::system::error_code ec, boost::asio::ip::tcp::socket socket)
+ if (!ec)
+ {
+ if (d_ptr->_connect_session)
{
- // Check whether the TcpServer was stopped by a signal before this
- // completion handler had a chance to run.
- if (!d_ptr->acceptor_.is_open())
- {
- return;
- }
-
- if (!ec)
+ if (d_ptr->_connect_session->socket_.is_open())
{
- if(d_ptr->_connect_session)
- {
- if(d_ptr->_connect_session->socket_.is_open())
- {
- std::string desc = "Disconnect previous client " + d_ptr->_connect_session->socket_.local_endpoint().address().to_string();
- d_ptr->_log.log(lsp::Log::Level::INFO, desc);
- d_ptr->_connect_session->socket_.close();
- }
-
- point.stop();
- }
- auto local_point = socket.local_endpoint();
-
- std::string desc = ("New client " + local_point.address().to_string() + " connect.");
+ std::string desc = "Disconnect previous client "
+ + d_ptr->_connect_session->socket_.local_endpoint().address().to_string();
d_ptr->_log.log(lsp::Log::Level::INFO, desc);
- d_ptr->_connect_session = std::make_shared<tcp_connect_session>(d_ptr->io_context_,std::move(socket));
-
- point.startProcessingMessages(d_ptr->_connect_session->proxy_, d_ptr->_connect_session->proxy_);
- do_accept();
+ d_ptr->_connect_session->socket_.close();
}
- });
- }
- void TcpServer::do_stop()
- {
- d_ptr->acceptor_.close();
+ point.stop();
+ }
+ auto local_point = socket.local_endpoint();
- point.stop();
+ std::string desc = ("New client " + local_point.address().to_string() + " connect.");
+ d_ptr->_log.log(lsp::Log::Level::INFO, desc);
+ d_ptr->_connect_session = std::make_shared<tcp_connect_session>(d_ptr->io_context_, std::move(socket));
+ point.startProcessingMessages(d_ptr->_connect_session->proxy_, d_ptr->_connect_session->proxy_);
+ do_accept();
+ }
}
+ );
+}
+
+void TcpServer::do_stop()
+{
+ d_ptr->acceptor_.close();
+
+ point.stop();
+}
- } // namespace
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/WebSocketServer.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/WebSocketServer.cpp
index 92a25e88db..7c4baeee01 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/WebSocketServer.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/WebSocketServer.cpp
@@ -7,331 +7,304 @@
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/asio/dispatch.hpp>
-namespace beast = boost::beast; // from <boost/beast.hpp>
-namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
-namespace net = boost::asio; // from <boost/asio.hpp>
-using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
-namespace lsp {
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+namespace lsp
+{
+
+// Echoes back all received WebSocket messages
+class server_session : public std::enable_shared_from_this<server_session>
+{
+ websocket::stream<beast::tcp_stream> ws_;
+
+ beast::flat_buffer buffer_;
+ std::string user_agent_;
+
+public:
+ std::shared_ptr<websocket_stream_wrapper> proxy_;
+ // Take ownership of the socket
+ explicit server_session(tcp::socket&& socket, std::string const& user_agent)
+ : ws_(std::move(socket)), user_agent_(user_agent)
+ {
+ proxy_ = std::make_shared<websocket_stream_wrapper>(ws_);
+ }
- // Echoes back all received WebSocket messages
- class server_session : public std::enable_shared_from_this<server_session>
+ // Get on the correct executor
+ void run()
{
- websocket::stream<beast::tcp_stream> ws_;
-
- beast::flat_buffer buffer_;
- std::string user_agent_;
- public:
- std::shared_ptr<websocket_stream_wrapper> proxy_;
- // Take ownership of the socket
- explicit
- server_session(tcp::socket&& socket,const std::string& user_agent)
- : ws_(std::move(socket)),user_agent_(user_agent)
- {
- proxy_ = std::make_shared<websocket_stream_wrapper>(ws_);
- }
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this server_session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(ws_.get_executor(), beast::bind_front_handler(&server_session::on_run, shared_from_this()));
+ }
- // Get on the correct executor
- void
- run()
- {
- // We need to be executing within a strand to perform async operations
- // on the I/O objects in this server_session. Although not strictly necessary
- // for single-threaded contexts, this example code is written to be
- // thread-safe by default.
- net::dispatch(ws_.get_executor(),
- beast::bind_front_handler(
- &server_session::on_run,
- shared_from_this()));
- }
+ // Start the asynchronous operation
+ void on_run()
+ {
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(websocket::stream_base::timeout::suggested(beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws_.set_option(websocket::stream_base::decorator([=](websocket::response_type& res)
+ { res.set(http::field::server, user_agent_.c_str()); }));
+ // Accept the websocket handshake
+ ws_.async_accept(beast::bind_front_handler(&server_session::on_accept, shared_from_this()));
+ }
- // Start the asynchronous operation
- void
- on_run()
+ void on_accept(beast::error_code ec)
+ {
+ if (ec)
{
- // Set suggested timeout settings for the websocket
- ws_.set_option(
- websocket::stream_base::timeout::suggested(
- beast::role_type::server));
-
- // Set a decorator to change the Server of the handshake
- ws_.set_option(websocket::stream_base::decorator(
- [=](websocket::response_type& res)
- {
- res.set(http::field::server, user_agent_.c_str());
- }));
- // Accept the websocket handshake
- ws_.async_accept(
- beast::bind_front_handler(
- &server_session::on_accept,
- shared_from_this()));
+ return;
}
- void
- on_accept(beast::error_code ec)
- {
- if (ec)
- return ;
+ // Read a message
+ // Read a message into our buffer
+ ws_.async_read(buffer_, beast::bind_front_handler(&server_session::on_read, shared_from_this()));
+ }
- // Read a message
- // Read a message into our buffer
- ws_.async_read(
- buffer_,
- beast::bind_front_handler(
- &server_session::on_read,
- shared_from_this()));
- }
+ void on_read(beast::error_code ec, std::size_t bytes_transferred)
+ {
+ if (!ec)
+ {
+ char* data = reinterpret_cast<char*>(buffer_.data().data());
+ std::vector<char> elements(data, data + bytes_transferred);
+ buffer_.clear();
+ proxy_->on_request.EnqueueAll(std::move(elements), false);
- void
- on_read(
- beast::error_code ec,
- std::size_t bytes_transferred)
+ // Read a message into our buffer
+ ws_.async_read(buffer_, beast::bind_front_handler(&server_session::on_read, shared_from_this()));
+ return;
+ }
+ if (ec)
{
-
- if(!ec)
- {
- char* data = reinterpret_cast<char*>(buffer_.data().data());
- std::vector<char> elements(data, data + bytes_transferred);
-
- buffer_.clear();
- proxy_->on_request.EnqueueAll(std::move(elements), false);
-
- // Read a message into our buffer
- ws_.async_read(
- buffer_,
- beast::bind_front_handler(
- &server_session::on_read,
- shared_from_this()));
- return;
- }
- if (ec){
- proxy_->error_message = ec.message();
- }
+ proxy_->error_message = ec.message();
}
+ }
-
-
- void close()
+ void close()
+ {
+ if (ws_.is_open())
{
- if(ws_.is_open())
- {
- boost::system::error_code ec;
- ws_.close(websocket::close_code::normal, ec);
- }
-
+ boost::system::error_code ec;
+ ws_.close(websocket::close_code::normal, ec);
}
- };
-
- //------------------------------------------------------------------------------
+ }
+};
- struct WebSocketServer::Data
- {
- Data(const std::string& user_agent, lsp::Log& log) :
- acceptor_(io_context_), user_agent_(user_agent), _log(log)
+//------------------------------------------------------------------------------
- {
- }
+struct WebSocketServer::Data
+{
+ Data(std::string const& user_agent, lsp::Log& log) : acceptor_(io_context_), user_agent_(user_agent), _log(log)
- ~Data()
- {
-
- }
- /// The io_context used to perform asynchronous operations.
- boost::asio::io_context io_context_;
+ {
+ }
- std::shared_ptr<boost::asio::io_service::work> work;
+ ~Data()
+ {
+ }
+ /// The io_context used to perform asynchronous operations.
+ boost::asio::io_context io_context_;
- /// Acceptor used to listen for incoming connections.
- boost::asio::ip::tcp::acceptor acceptor_;
+ std::shared_ptr<boost::asio::executor_work_guard<boost::asio::io_context::executor_type>> work;
- std::shared_ptr < server_session> _server_session;
+ /// Acceptor used to listen for incoming connections.
+ boost::asio::ip::tcp::acceptor acceptor_;
- std::string user_agent_;
- lsp::Log& _log;
+ std::shared_ptr<server_session> _server_session;
- };
+ std::string user_agent_;
+ lsp::Log& _log;
+};
- websocket_stream_wrapper::websocket_stream_wrapper(boost::beast::websocket::stream<boost::beast::tcp_stream>& _w):
- ws_(_w), request_waiter(new MultiQueueWaiter()),
- on_request(request_waiter)
- {
- }
+websocket_stream_wrapper::websocket_stream_wrapper(boost::beast::websocket::stream<boost::beast::tcp_stream>& _w)
+ : ws_(_w), request_waiter(new MultiQueueWaiter()), on_request(request_waiter)
+{
+}
- bool websocket_stream_wrapper::fail()
- {
- return bad();
- }
+bool websocket_stream_wrapper::fail()
+{
+ return bad();
+}
- bool websocket_stream_wrapper::eof()
- {
- return bad();
- }
+bool websocket_stream_wrapper::eof()
+{
+ return bad();
+}
- bool websocket_stream_wrapper::good()
- {
- return !bad();
- }
+bool websocket_stream_wrapper::good()
+{
+ return !bad();
+}
- websocket_stream_wrapper& websocket_stream_wrapper::read(char* str, std::streamsize count)
+websocket_stream_wrapper& websocket_stream_wrapper::read(char* str, std::streamsize count)
+{
+ auto some = on_request.TryDequeueSome(static_cast<size_t>(count));
+ memcpy(str, some.data(), some.size());
+ for (std::streamsize i = some.size(); i < count; ++i)
{
- auto some = on_request.TryDequeueSome(static_cast<size_t>(count));
- memcpy(str,some.data(),some.size());
- for (std::streamsize i = some.size(); i < count; ++i)
- {
- str[i] = static_cast<char>(get());
- }
- return *this;
+ str[i] = static_cast<char>(get());
}
-
- int websocket_stream_wrapper::get()
+ return *this;
+}
+
+int websocket_stream_wrapper::get()
+{
+ return on_request.Dequeue();
+}
+
+bool websocket_stream_wrapper::bad()
+{
+ return !ws_.next_layer().socket().is_open();
+}
+
+websocket_stream_wrapper& websocket_stream_wrapper::write(std::string const& c)
+{
+ ws_.write(boost::asio::buffer(std::string(c)));
+ return *this;
+}
+
+websocket_stream_wrapper& websocket_stream_wrapper::write(std::streamsize _s)
+{
+ std::ostringstream temp;
+ temp << _s;
+ ws_.write(boost::asio::buffer(temp.str()));
+ return *this;
+}
+
+websocket_stream_wrapper& websocket_stream_wrapper::flush()
+{
+ return *this;
+}
+
+void websocket_stream_wrapper::clear()
+{
+}
+
+std::string websocket_stream_wrapper::what()
+{
+ if (!error_message.empty())
{
- return on_request.Dequeue();
+ return error_message;
}
- bool websocket_stream_wrapper::bad()
+ if (!ws_.next_layer().socket().is_open())
{
- return !ws_.next_layer().socket().is_open();
+ return "Socket is not open.";
}
-
- websocket_stream_wrapper& websocket_stream_wrapper::write(const std::string& c)
+ return {};
+}
+
+WebSocketServer::~WebSocketServer()
+{
+ delete d_ptr;
+}
+
+WebSocketServer::WebSocketServer(
+ std::string const& user_agent, std::string const& address, std::string const& port,
+ std::shared_ptr<MessageJsonHandler> json_handler, std::shared_ptr<Endpoint> localEndPoint, lsp::Log& log,
+ uint32_t _max_workers
+)
+ : point(json_handler, localEndPoint, log, lsp::JSONStreamStyle::Standard, static_cast<uint8_t>(_max_workers)),
+ d_ptr(new Data(user_agent, log))
+
+{
+
+ d_ptr->work = std::make_shared<boost::asio::executor_work_guard<boost::asio::io_context::executor_type>>(d_ptr->io_context_.get_executor());
+
+ // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
+ boost::asio::ip::tcp::resolver resolver(d_ptr->io_context_);
+ boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(address, port).begin();
+ d_ptr->acceptor_.open(endpoint.protocol());
+ d_ptr->acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
+ try
{
- ws_.write(boost::asio::buffer(std::string(c)));
- return *this;
+ d_ptr->acceptor_.bind(endpoint);
}
-
-
- websocket_stream_wrapper& websocket_stream_wrapper::write(std::streamsize _s)
+ catch (boost::system::system_error& e)
{
- std::ostringstream temp;
- temp << _s;
- ws_.write(boost::asio::buffer(temp.str()));
- return *this;
+ std::string temp = "Socket Server blid faild.";
+ d_ptr->_log.log(lsp::Log::Level::INFO, temp + e.what());
+ return;
}
-
- websocket_stream_wrapper& websocket_stream_wrapper::flush()
+ d_ptr->acceptor_.listen();
+
+ do_accept();
+ std::string desc = "Socket WebSocketServer " + address + " " + port + " start.";
+ d_ptr->_log.log(lsp::Log::Level::INFO, desc);
+}
+
+void WebSocketServer::run()
+{
+ // The io_context::run() call will block until all asynchronous operations
+ // have finished. While the WebSocketServer is running, there is always at least one
+ // asynchronous operation outstanding: the asynchronous accept call waiting
+ // for new incoming connections.
+ d_ptr->io_context_.run();
+}
+
+void WebSocketServer::stop()
+{
+ try
{
- return *this;
- }
+ if (d_ptr->work)
+ {
+ d_ptr->work.reset();
+ }
- void websocket_stream_wrapper::clear()
- {
+ do_stop();
}
-
- std::string websocket_stream_wrapper::what()
+ catch (...)
{
- if (!error_message.empty())
- return error_message;
-
- if (!ws_.next_layer().socket().is_open())
- {
- return "Socket is not open.";
- }
- return {};
}
+}
- WebSocketServer::~WebSocketServer()
- {
- delete d_ptr;
- }
-
- WebSocketServer::WebSocketServer(const std::string& user_agent, const std::string& address, const std::string& port,
- std::shared_ptr < MessageJsonHandler> json_handler,
- std::shared_ptr < Endpoint> localEndPoint, lsp::Log& log, uint32_t _max_workers)
- : point(json_handler,localEndPoint,log,lsp::JSONStreamStyle::Standard, _max_workers),d_ptr(new Data(user_agent,log))
-
+void WebSocketServer::do_accept()
+{
+ d_ptr->acceptor_.async_accept(
+ [this](boost::system::error_code ec, boost::asio::ip::tcp::socket socket)
{
-
- d_ptr->work = std::make_shared<boost::asio::io_service::work>(d_ptr->io_context_);
-
- // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
- boost::asio::ip::tcp::resolver resolver(d_ptr->io_context_);
- boost::asio::ip::tcp::endpoint endpoint =
- *resolver.resolve(address, port).begin();
- d_ptr->acceptor_.open(endpoint.protocol());
- d_ptr->acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
- try
- {
- d_ptr->acceptor_.bind(endpoint);
- }
- catch (boost::system::system_error & e)
+ // Check whether the WebSocketServer was stopped by a signal before this
+ // completion handler had a chance to run.
+ if (!d_ptr->acceptor_.is_open())
{
- std::string temp = "Socket Server blid faild.";
- d_ptr->_log.log(lsp::Log::Level::INFO , temp + e.what());
return;
}
- d_ptr->acceptor_.listen();
-
- do_accept();
- std::string desc = "Socket WebSocketServer " + address + " " + port + " start.";
- d_ptr->_log.log(lsp::Log::Level::INFO, desc);
- }
-
- void WebSocketServer::run()
- {
- // The io_context::run() call will block until all asynchronous operations
- // have finished. While the WebSocketServer is running, there is always at least one
- // asynchronous operation outstanding: the asynchronous accept call waiting
- // for new incoming connections.
- d_ptr->io_context_.run();
-
- }
-
- void WebSocketServer::stop()
- {
- try
+ if (!ec)
{
- if(d_ptr->work)
- d_ptr->work.reset();
-
- do_stop();
- }
- catch (...)
- {
- }
- }
-
- void WebSocketServer::do_accept()
- {
- d_ptr->acceptor_.async_accept(
- [this](boost::system::error_code ec, boost::asio::ip::tcp::socket socket)
+ if (d_ptr->_server_session)
{
- // Check whether the WebSocketServer was stopped by a signal before this
- // completion handler had a chance to run.
- if (!d_ptr->acceptor_.is_open())
+ try
{
- return;
+ d_ptr->_server_session->close();
+ point.stop();
}
- if (!ec)
+ catch (...)
{
- if(d_ptr->_server_session)
- {
- try
- {
- d_ptr->_server_session->close();
- point.stop();
- }
- catch (...)
- {
- }
- }
- d_ptr->_server_session = std::make_shared<server_session>(std::move(socket), d_ptr->user_agent_);
- d_ptr->_server_session->run();
-
- point.startProcessingMessages(d_ptr->_server_session->proxy_, d_ptr->_server_session->proxy_);
- do_accept();
}
+ }
+ d_ptr->_server_session = std::make_shared<server_session>(std::move(socket), d_ptr->user_agent_);
+ d_ptr->_server_session->run();
- });
+ point.startProcessingMessages(d_ptr->_server_session->proxy_, d_ptr->_server_session->proxy_);
+ do_accept();
+ }
}
+ );
+}
- void WebSocketServer::do_stop()
- {
- d_ptr->acceptor_.close();
+void WebSocketServer::do_stop()
+{
+ d_ptr->acceptor_.close();
- point.stop();
-
- }
+ point.stop();
+}
- } // namespace
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/message.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/message.cpp
index a9e7736cd7..da04e8d10d 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/message.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/message.cpp
@@ -7,82 +7,92 @@
#include "LibLsp/JsonRpc/Condition.h"
#include "LibLsp/JsonRpc/json.h"
-void LspMessage::Write(std::ostream& out) {
- rapidjson::StringBuffer output;
- rapidjson::Writer<rapidjson::StringBuffer> writer(output);
- JsonWriter json_writer{ &writer };
- ReflectWriter(json_writer);
+void LspMessage::Write(std::ostream& out)
+{
+ rapidjson::StringBuffer output;
+ rapidjson::Writer<rapidjson::StringBuffer> writer(output);
+ JsonWriter json_writer {&writer};
+ ReflectWriter(json_writer);
- const auto value = std::string("Content-Length: ") + std::to_string(output.GetSize()) + "\r\n\r\n" + output.GetString();
- out << value;
- out.flush();
+ auto const value =
+ std::string("Content-Length: ") + std::to_string(output.GetSize()) + "\r\n\r\n" + output.GetString();
+ out << value;
+ out.flush();
}
-std::string LspMessage::ToJson() {
- rapidjson::StringBuffer output;
- rapidjson::Writer<rapidjson::StringBuffer> writer(output);
- JsonWriter json_writer{ &writer };
- this->ReflectWriter(json_writer);
- return output.GetString();
+std::string LspMessage::ToJson()
+{
+ rapidjson::StringBuffer output;
+ rapidjson::Writer<rapidjson::StringBuffer> writer(output);
+ JsonWriter json_writer {&writer};
+ this->ReflectWriter(json_writer);
+ return output.GetString();
}
-void Reflect(Reader& visitor, lsRequestId& value) {
- if (visitor.IsInt()) {
- value.type = lsRequestId::kInt;
- value.value = visitor.GetInt();
- }
- else if (visitor.IsInt64()) {
- value.type = lsRequestId::kInt;
- // `lsRequestId.value` is an `int`, so we're forced to truncate.
- value.value = static_cast<int>(visitor.GetInt64());
- }
- else if (visitor.IsString()) {
- value.type = lsRequestId::kString;
- value.k_string = visitor.GetString();
- value.value = atoi(value.k_string.c_str());
-
- }
- else {
- value.type = lsRequestId::kNone;
- value.value = -1;
- }
+void Reflect(Reader& visitor, lsRequestId& value)
+{
+ if (visitor.IsInt())
+ {
+ value.type = lsRequestId::kInt;
+ value.value = visitor.GetInt();
+ }
+ else if (visitor.IsInt64())
+ {
+ value.type = lsRequestId::kInt;
+ // `lsRequestId.value` is an `int`, so we're forced to truncate.
+ value.value = static_cast<int>(visitor.GetInt64());
+ }
+ else if (visitor.IsString())
+ {
+ value.type = lsRequestId::kString;
+ value.k_string = visitor.GetString();
+ value.value = atoi(value.k_string.c_str());
+ }
+ else
+ {
+ value.type = lsRequestId::kNone;
+ value.value = -1;
+ }
}
-void Reflect(Writer& visitor, lsRequestId& value) {
- switch (value.type) {
- case lsRequestId::kNone:
- visitor.Null();
- break;
- case lsRequestId::kInt:
- visitor.Int(value.value);
- break;
- case lsRequestId::kString:
+void Reflect(Writer& visitor, lsRequestId& value)
+{
+ switch (value.type)
+ {
+ case lsRequestId::kNone:
+ visitor.Null();
+ break;
+ case lsRequestId::kInt:
+ visitor.Int(value.value);
+ break;
+ case lsRequestId::kString:
- if(value.k_string.empty())
- {
- std::string str = std::to_string(value.value);
- visitor.String(str.c_str(), str.length());
- }
- else
- {
- visitor.String(value.k_string.c_str(), value.k_string.length());
- }
- break;
+ if (value.k_string.empty())
+ {
+ std::string str = std::to_string(value.value);
+ visitor.String(str.c_str(), str.length());
+ }
+ else
+ {
+ visitor.String(value.k_string.c_str(), value.k_string.length());
}
+ break;
+ }
}
-std::string ToString(const lsRequestId& id) {
- if (id.type != lsRequestId::kNone)
+std::string ToString(lsRequestId const& id)
+{
+ if (id.type != lsRequestId::kNone)
+ {
+ if (id.type == lsRequestId::kString)
{
- if(id.type == lsRequestId::kString)
- {
- if (!id.k_string.empty())
- return id.k_string;
- }
- return std::to_string(id.value);
+ if (!id.k_string.empty())
+ {
+ return id.k_string;
+ }
}
+ return std::to_string(id.value);
+ }
- return "";
+ return "";
}
-
-
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/serializer.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/serializer.cpp
index 8c5beba83e..259b900e72 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/serializer.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/serializer.cpp
@@ -3,212 +3,261 @@
#include <rapidjson/allocators.h>
#include "LibLsp/JsonRpc/json.h"
-
-
//// Elementary types
-void JsonNull::swap(JsonNull& arg) noexcept
+void JsonNull::swap(JsonNull&) noexcept
{
}
-
-void Reflect(Reader& visitor, uint8_t& value) {
- if (!visitor.IsInt())
- throw std::invalid_argument("uint8_t");
- value = (uint8_t)visitor.GetInt();
+void Reflect(Reader& visitor, uint8_t& value)
+{
+ if (!visitor.IsInt())
+ {
+ throw std::invalid_argument("uint8_t");
+ }
+ value = (uint8_t)visitor.GetInt();
}
-void Reflect(Writer& visitor, uint8_t& value) {
- visitor.Int(value);
+void Reflect(Writer& visitor, uint8_t& value)
+{
+ visitor.Int(value);
}
-void Reflect(Reader& visitor, short& value) {
- if (!visitor.IsInt())
- throw std::invalid_argument("short");
- value = (short)visitor.GetInt();
+void Reflect(Reader& visitor, short& value)
+{
+ if (!visitor.IsInt())
+ {
+ throw std::invalid_argument("short");
+ }
+ value = (short)visitor.GetInt();
}
-void Reflect(Writer& visitor, short& value) {
- visitor.Int(value);
+void Reflect(Writer& visitor, short& value)
+{
+ visitor.Int(value);
}
-void Reflect(Reader& visitor, unsigned short& value) {
- if (!visitor.IsInt())
- throw std::invalid_argument("unsigned short");
- value = (unsigned short)visitor.GetInt();
+void Reflect(Reader& visitor, unsigned short& value)
+{
+ if (!visitor.IsInt())
+ {
+ throw std::invalid_argument("unsigned short");
+ }
+ value = (unsigned short)visitor.GetInt();
}
-void Reflect(Writer& visitor, unsigned short& value) {
- visitor.Int(value);
+void Reflect(Writer& visitor, unsigned short& value)
+{
+ visitor.Int(value);
}
-void Reflect(Reader& visitor, int& value) {
- if (!visitor.IsInt())
- throw std::invalid_argument("int");
- value = visitor.GetInt();
+void Reflect(Reader& visitor, int& value)
+{
+ if (!visitor.IsInt())
+ {
+ throw std::invalid_argument("int");
+ }
+ value = visitor.GetInt();
}
-void Reflect(Writer& visitor, int& value) {
- visitor.Int(value);
+void Reflect(Writer& visitor, int& value)
+{
+ visitor.Int(value);
}
-void Reflect(Reader& visitor, unsigned& value) {
- if (!visitor.IsUint64())
- throw std::invalid_argument("unsigned");
- value = visitor.GetUint32();
+void Reflect(Reader& visitor, unsigned& value)
+{
+ if (!visitor.IsUint64())
+ {
+ throw std::invalid_argument("unsigned");
+ }
+ value = visitor.GetUint32();
}
-void Reflect(Writer& visitor, unsigned& value) {
- visitor.Uint32(value);
+void Reflect(Writer& visitor, unsigned& value)
+{
+ visitor.Uint32(value);
}
-void Reflect(Reader& visitor, long& value) {
- if (!visitor.IsInt64())
- throw std::invalid_argument("long");
- value = long(visitor.GetInt64());
+void Reflect(Reader& visitor, long& value)
+{
+ if (!visitor.IsInt64())
+ {
+ throw std::invalid_argument("long");
+ }
+ value = long(visitor.GetInt64());
}
-void Reflect(Writer& visitor, long& value) {
- visitor.Int64(value);
+void Reflect(Writer& visitor, long& value)
+{
+ visitor.Int64(value);
}
-void Reflect(Reader& visitor, unsigned long& value) {
- if (!visitor.IsUint64())
- throw std::invalid_argument("unsigned long");
- value = (unsigned long)visitor.GetUint64();
+void Reflect(Reader& visitor, unsigned long& value)
+{
+ if (!visitor.IsUint64())
+ {
+ throw std::invalid_argument("unsigned long");
+ }
+ value = (unsigned long)visitor.GetUint64();
}
-void Reflect(Writer& visitor, unsigned long& value) {
- visitor.Uint64(value);
+void Reflect(Writer& visitor, unsigned long& value)
+{
+ visitor.Uint64(value);
}
-void Reflect(Reader& visitor, long long& value) {
- if (!visitor.IsInt64())
- throw std::invalid_argument("long long");
- value = visitor.GetInt64();
+void Reflect(Reader& visitor, long long& value)
+{
+ if (!visitor.IsInt64())
+ {
+ throw std::invalid_argument("long long");
+ }
+ value = visitor.GetInt64();
}
-void Reflect(Writer& visitor, long long& value) {
- visitor.Int64(value);
+void Reflect(Writer& visitor, long long& value)
+{
+ visitor.Int64(value);
}
-void Reflect(Reader& visitor, unsigned long long& value) {
- if (!visitor.IsUint64())
- throw std::invalid_argument("unsigned long long");
- value = visitor.GetUint64();
+void Reflect(Reader& visitor, unsigned long long& value)
+{
+ if (!visitor.IsUint64())
+ {
+ throw std::invalid_argument("unsigned long long");
+ }
+ value = visitor.GetUint64();
}
-void Reflect(Writer& visitor, unsigned long long& value) {
- visitor.Uint64(value);
+void Reflect(Writer& visitor, unsigned long long& value)
+{
+ visitor.Uint64(value);
}
-void Reflect(Reader& visitor, double& value) {
- if (!visitor.IsNumber())
- throw std::invalid_argument("double");
- value = visitor.GetDouble();
+void Reflect(Reader& visitor, double& value)
+{
+ if (!visitor.IsNumber())
+ {
+ throw std::invalid_argument("double");
+ }
+ value = visitor.GetDouble();
}
-void Reflect(Writer& visitor, double& value) {
- visitor.Double(value);
+void Reflect(Writer& visitor, double& value)
+{
+ visitor.Double(value);
}
-void Reflect(Reader& visitor, bool& value) {
- if (!visitor.IsBool())
- throw std::invalid_argument("bool");
- value = visitor.GetBool();
+void Reflect(Reader& visitor, bool& value)
+{
+ if (!visitor.IsBool())
+ {
+ throw std::invalid_argument("bool");
+ }
+ value = visitor.GetBool();
}
-void Reflect(Writer& visitor, bool& value) {
- visitor.Bool(value);
+void Reflect(Writer& visitor, bool& value)
+{
+ visitor.Bool(value);
}
-void Reflect(Reader& visitor, std::string& value) {
- if (!visitor.IsString())
- throw std::invalid_argument("std::string");
- value = visitor.GetString();
+void Reflect(Reader& visitor, std::string& value)
+{
+ if (!visitor.IsString())
+ {
+ throw std::invalid_argument("std::string");
+ }
+ value = visitor.GetString();
}
-void Reflect(Writer& visitor, std::string& value) {
- visitor.String(value.c_str(), (rapidjson::SizeType)value.size());
+void Reflect(Writer& visitor, std::string& value)
+{
+ visitor.String(value.c_str(), (rapidjson::SizeType)value.size());
}
-void Reflect(Reader& visitor, JsonNull& value) {
- visitor.GetNull();
+void Reflect(Reader& visitor, JsonNull&)
+{
+ visitor.GetNull();
}
-void Reflect(Writer& visitor, JsonNull& value) {
- visitor.Null();
+void Reflect(Writer& visitor, JsonNull&)
+{
+ visitor.Null();
}
-
-void Reflect(Reader& visitor, SerializeFormat& value) {
- std::string fmt = visitor.GetString();
- value = fmt[0] == 'm' ? SerializeFormat::MessagePack : SerializeFormat::Json;
+void Reflect(Reader& visitor, SerializeFormat& value)
+{
+ std::string fmt = visitor.GetString();
+ value = fmt[0] == 'm' ? SerializeFormat::MessagePack : SerializeFormat::Json;
}
-void Reflect(Writer& visitor, SerializeFormat& value) {
- switch (value) {
+void Reflect(Writer& visitor, SerializeFormat& value)
+{
+ switch (value)
+ {
case SerializeFormat::Json:
- visitor.String("json");
- break;
+ visitor.String("json");
+ break;
case SerializeFormat::MessagePack:
- visitor.String("msgpack");
- break;
- }
+ visitor.String("msgpack");
+ break;
+ }
}
-
std::string JsonReader::ToString() const
{
- rapidjson::StringBuffer strBuf;
- strBuf.Clear();
- rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
- m_->Accept(writer);
- std::string strJson = strBuf.GetString();
- return strJson;
+ rapidjson::StringBuffer strBuf;
+ strBuf.Clear();
+ rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
+ m_->Accept(writer);
+ std::string strJson = strBuf.GetString();
+ return strJson;
}
-void JsonReader::IterMap(std::function<void(const char*, Reader&)> fn)
+void JsonReader::IterMap(std::function<void(char const*, Reader&)> fn)
{
- path_.push_back("0");
- for (auto& entry : m_->GetObject())
- {
- auto saved = m_;
- m_ = &(entry.value);
+ path_.push_back("0");
+ for (auto& entry : m_->GetObject())
+ {
+ auto saved = m_;
+ m_ = &(entry.value);
- fn(entry.name.GetString(), *this);
- m_ = saved;
- }
- path_.pop_back();
+ fn(entry.name.GetString(), *this);
+ m_ = saved;
+ }
+ path_.pop_back();
}
- void JsonReader::IterArray(std::function<void(Reader&)> fn)
+void JsonReader::IterArray(std::function<void(Reader&)> fn)
{
- if (!m_->IsArray())
- throw std::invalid_argument("array");
- // Use "0" to indicate any element for now.
- path_.push_back("0");
- for (auto& entry : m_->GetArray())
- {
- auto saved = m_;
- m_ = &entry;
- fn(*this);
- m_ = saved;
- }
- path_.pop_back();
+ if (!m_->IsArray())
+ {
+ throw std::invalid_argument("array");
+ }
+ // Use "0" to indicate any element for now.
+ path_.push_back("0");
+ for (auto& entry : m_->GetArray())
+ {
+ auto saved = m_;
+ m_ = &entry;
+ fn(*this);
+ m_ = saved;
+ }
+ path_.pop_back();
}
-void JsonReader::DoMember(const char* name, std::function<void(Reader&)> fn)
+void JsonReader::DoMember(char const* name, std::function<void(Reader&)> fn)
{
- path_.push_back(name);
- auto it = m_->FindMember(name);
- if (it != m_->MemberEnd())
- {
- auto saved = m_;
- m_ = &it->value;
- fn(*this);
- m_ = saved;
- }
- path_.pop_back();
+ path_.push_back(name);
+ auto it = m_->FindMember(name);
+ if (it != m_->MemberEnd())
+ {
+ auto saved = m_;
+ m_ = &it->value;
+ fn(*this);
+ m_ = saved;
+ }
+ path_.pop_back();
}
std::string JsonReader::GetPath() const
{
- std::string ret;
- for (auto& t : path_)
- {
- ret += '/';
- ret += t;
- }
- ret.pop_back();
- return ret;
+ std::string ret;
+ for (auto& t : path_)
+ {
+ ret += '/';
+ ret += t;
+ }
+ ret.pop_back();
+ return ret;
}
-
diff --git a/graphics/asymptote/LspCpp/src/jsonrpc/threaded_queue.cpp b/graphics/asymptote/LspCpp/src/jsonrpc/threaded_queue.cpp
index 1f9a02ac0d..615bcf9ceb 100644
--- a/graphics/asymptote/LspCpp/src/jsonrpc/threaded_queue.cpp
+++ b/graphics/asymptote/LspCpp/src/jsonrpc/threaded_queue.cpp
@@ -1,20 +1,26 @@
#include "LibLsp/JsonRpc/threaded_queue.h"
// static
-bool MultiQueueWaiter::HasState(
- std::initializer_list<BaseThreadQueue*> queues) {
- for (BaseThreadQueue* queue : queues) {
- if (!queue->IsEmpty())
- return true;
- }
- return false;
+bool MultiQueueWaiter::HasState(std::initializer_list<BaseThreadQueue*> queues)
+{
+ for (BaseThreadQueue* queue : queues)
+ {
+ if (!queue->IsEmpty())
+ {
+ return true;
+ }
+ }
+ return false;
}
-bool MultiQueueWaiter::ValidateWaiter(
- std::initializer_list<BaseThreadQueue*> queues) {
- for (BaseThreadQueue* queue : queues) {
- if (queue->waiter.get() != this)
- return false;
- }
- return true;
+bool MultiQueueWaiter::ValidateWaiter(std::initializer_list<BaseThreadQueue*> queues)
+{
+ for (BaseThreadQueue* queue : queues)
+ {
+ if (queue->waiter.get() != this)
+ {
+ return false;
+ }
+ }
+ return true;
}
diff --git a/graphics/asymptote/LspCpp/src/lsp/Markup.cpp b/graphics/asymptote/LspCpp/src/lsp/Markup.cpp
index f22baac95d..6907df4f76 100644
--- a/graphics/asymptote/LspCpp/src/lsp/Markup.cpp
+++ b/graphics/asymptote/LspCpp/src/lsp/Markup.cpp
@@ -16,443 +16,572 @@
#include <vector>
#include <boost/algorithm/string.hpp>
-namespace lsp {
-
- /// hexdigit - Return the hexadecimal character for the
- /// given number \p X (which should be less than 16).
- inline char hexdigit(unsigned X, bool LowerCase = false) {
- const char HexChar = LowerCase ? 'a' : 'A';
- return X < 10 ? '0' + X : HexChar + X - 10;
- }
-
- /// Given an array of c-style strings terminated by a null pointer, construct
- /// a vector of StringRefs representing the same strings without the terminating
- /// null string.
- inline std::vector< std::string_ref> toStringRefArray(const char* const* Strings) {
- std::vector< std::string_ref> Result;
- while (*Strings)
- Result.push_back(*Strings++);
- return Result;
+namespace lsp
+{
+
+/// hexdigit - Return the hexadecimal character for the
+/// given number \p X (which should be less than 16).
+inline char hexdigit(unsigned X, bool LowerCase = false)
+{
+ char const HexChar = LowerCase ? 'a' : 'A';
+ auto const castedX = static_cast<char>(X);
+ return X < 10 ? '0' + castedX : HexChar + castedX - 10;
+}
+
+/// Given an array of c-style strings terminated by a null pointer, construct
+/// a vector of StringRefs representing the same strings without the terminating
+/// null string.
+inline std::vector<std::string_ref> toStringRefArray(char const* const* Strings)
+{
+ std::vector<std::string_ref> Result;
+ while (*Strings)
+ {
+ Result.push_back(*Strings++);
}
+ return Result;
+}
+
+/// Construct a string ref from a boolean.
+inline std::string_ref toStringRef(bool B)
+{
+ return std::string_ref(B ? "true" : "false");
+}
+
+/// Construct a string ref from an array ref of unsigned chars.
+inline std::string_ref toStringRef(std::vector<uint8_t> const& Input)
+{
+ return std::string_ref(Input.begin(), Input.end());
+}
- /// Construct a string ref from a boolean.
- inline std::string_ref toStringRef(bool B) { return std::string_ref(B ? "true" : "false"); }
-
- /// Construct a string ref from an array ref of unsigned chars.
- inline std::string_ref toStringRef(const std::vector<uint8_t>& Input) {
- return std::string_ref(Input.begin(), Input.end());
- }
-
- /// Construct a string ref from an array ref of unsigned chars.
- inline std::vector<uint8_t> arrayRefFromStringRef(const std::string_ref& Input) {
- return { Input.begin(), Input.end() };
- }
-
- /// Interpret the given character \p C as a hexadecimal digit and return its
- /// value.
- ///
- /// If \p C is not a valid hex digit, -1U is returned.
- inline unsigned hexDigitValue(char C) {
- struct HexTable {
- unsigned LUT[255] = {};
- constexpr HexTable() {
- // Default initialize everything to invalid.
- for (int i = 0; i < 255; ++i)
- LUT[i] = ~0U;
- // Initialize `0`-`9`.
- for (int i = 0; i < 10; ++i)
- LUT['0' + i] = i;
- // Initialize `A`-`F` and `a`-`f`.
- for (int i = 0; i < 6; ++i)
- LUT['A' + i] = LUT['a' + i] = 10 + i;
+/// Construct a string ref from an array ref of unsigned chars.
+inline std::vector<uint8_t> arrayRefFromStringRef(std::string_ref const& Input)
+{
+ return {Input.begin(), Input.end()};
+}
+
+/// Interpret the given character \p C as a hexadecimal digit and return its
+/// value.
+///
+/// If \p C is not a valid hex digit, -1U is returned.
+inline unsigned hexDigitValue(char C)
+{
+ struct HexTable
+ {
+ unsigned LUT[255] = {};
+ constexpr HexTable()
+ {
+ // Default initialize everything to invalid.
+ for (int i = 0; i < 255; ++i)
+ {
+ LUT[i] = ~0U;
}
- };
- constexpr HexTable Table;
- return Table.LUT[static_cast<unsigned char>(C)];
- }
+ // Initialize `0`-`9`.
+ for (int i = 0; i < 10; ++i)
+ {
+ LUT['0' + i] = i;
+ }
+ // Initialize `A`-`F` and `a`-`f`.
+ for (int i = 0; i < 6; ++i)
+ {
+ LUT['A' + i] = LUT['a' + i] = 10 + i;
+ }
+ }
+ };
+ constexpr HexTable Table;
+ return Table.LUT[static_cast<unsigned char>(C)];
+}
- /// Checks if character \p C is one of the 10 decimal digits.
- inline bool isDigit(char C) { return C >= '0' && C <= '9'; }
+/// Checks if character \p C is one of the 10 decimal digits.
+inline bool isDigit(char C)
+{
+ return C >= '0' && C <= '9';
+}
- /// Checks if character \p C is a hexadecimal numeric character.
- inline bool isHexDigit(char C) { return hexDigitValue(C) != ~0U; }
+/// Checks if character \p C is a hexadecimal numeric character.
+inline bool isHexDigit(char C)
+{
+ return hexDigitValue(C) != ~0U;
+}
- /// Checks if character \p C is a valid letter as classified by "C" locale.
- inline bool isAlpha(char C) {
- return ('a' <= C && C <= 'z') || ('A' <= C && C <= 'Z');
- }
+/// Checks if character \p C is a valid letter as classified by "C" locale.
+inline bool isAlpha(char C)
+{
+ return ('a' <= C && C <= 'z') || ('A' <= C && C <= 'Z');
+}
- /// Checks whether character \p C is either a decimal digit or an uppercase or
- /// lowercase letter as classified by "C" locale.
- inline bool isAlnum(char C) { return isAlpha(C) || isDigit(C); }
+/// Checks whether character \p C is either a decimal digit or an uppercase or
+/// lowercase letter as classified by "C" locale.
+inline bool isAlnum(char C)
+{
+ return isAlpha(C) || isDigit(C);
+}
- /// Checks whether character \p C is valid ASCII (high bit is zero).
- inline bool isASCII(char C) { return static_cast<unsigned char>(C) <= 127; }
+/// Checks whether character \p C is valid ASCII (high bit is zero).
+inline bool isASCII(char C)
+{
+ return static_cast<unsigned char>(C) <= 127;
+}
- /// Checks whether all characters in S are ASCII.
- inline bool isASCII(std::string_ref S) {
- for (char C : S)
+/// Checks whether all characters in S are ASCII.
+inline bool isASCII(std::string_ref S)
+{
+ for (char C : S)
+ {
+ if (!isASCII(C))
{
- if(!isASCII(C))return true;
+ return true;
}
- return true;
}
+ return true;
+}
- /// Checks whether character \p C is printable.
- ///
- /// Locale-independent version of the C standard library isprint whose results
- /// may differ on different platforms.
- inline bool isPrint(char C) {
- unsigned char UC = static_cast<unsigned char>(C);
- return (0x20 <= UC) && (UC <= 0x7E);
- }
+/// Checks whether character \p C is printable.
+///
+/// Locale-independent version of the C standard library isprint whose results
+/// may differ on different platforms.
+inline bool isPrint(char C)
+{
+ unsigned char UC = static_cast<unsigned char>(C);
+ return (0x20 <= UC) && (UC <= 0x7E);
+}
+
+/// Checks whether character \p C is whitespace in the "C" locale.
+///
+/// Locale-independent version of the C standard library isspace.
+inline bool isSpace(char C)
+{
+ return C == ' ' || C == '\f' || C == '\n' || C == '\r' || C == '\t' || C == '\v';
+}
- /// Checks whether character \p C is whitespace in the "C" locale.
- ///
- /// Locale-independent version of the C standard library isspace.
- inline bool isSpace(char C) {
- return C == ' ' || C == '\f' || C == '\n' || C == '\r' || C == '\t' ||
- C == '\v';
+/// Returns the corresponding lowercase character if \p x is uppercase.
+inline char toLower(char x)
+{
+ if (x >= 'A' && x <= 'Z')
+ {
+ return x - 'A' + 'a';
}
+ return x;
+}
- /// Returns the corresponding lowercase character if \p x is uppercase.
- inline char toLower(char x) {
- if (x >= 'A' && x <= 'Z')
- return x - 'A' + 'a';
- return x;
+/// Returns the corresponding uppercase character if \p x is lowercase.
+inline char toUpper(char x)
+{
+ if (x >= 'a' && x <= 'z')
+ {
+ return x - 'a' + 'A';
}
+ return x;
+}
+
+inline std::string utohexstr(uint64_t X, bool LowerCase = false)
+{
+ char Buffer[17];
+ char* BufPtr = std::end(Buffer);
- /// Returns the corresponding uppercase character if \p x is lowercase.
- inline char toUpper(char x) {
- if (x >= 'a' && x <= 'z')
- return x - 'a' + 'A';
- return x;
+ if (X == 0)
+ {
+ *--BufPtr = '0';
}
- inline std::string utohexstr(uint64_t X, bool LowerCase = false) {
- char Buffer[17];
- char* BufPtr = std::end(Buffer);
+ while (X)
+ {
+ unsigned char Mod = static_cast<unsigned char>(X) & 15;
+ *--BufPtr = hexdigit(Mod, LowerCase);
+ X >>= 4;
+ }
- if (X == 0) *--BufPtr = '0';
+ return std::string(BufPtr, std::end(Buffer));
+}
- while (X) {
- unsigned char Mod = static_cast<unsigned char>(X) & 15;
- *--BufPtr = hexdigit(Mod, LowerCase);
- X >>= 4;
- }
+/// Convert buffer \p Input to its hexadecimal representation.
+/// The returned string is double the size of \p Input.
+inline std::string toHex(std::string_ref Input, bool LowerCase = false)
+{
+ static char const* const LUT = "0123456789ABCDEF";
+ uint8_t const Offset = LowerCase ? 32 : 0;
+ size_t Length = Input.size();
- return std::string(BufPtr, std::end(Buffer));
+ std::string Output;
+ Output.reserve(2 * Length);
+ for (size_t i = 0; i < Length; ++i)
+ {
+ unsigned char const c = Input[i];
+ Output.push_back(LUT[c >> 4] | Offset);
+ Output.push_back(LUT[c & 15] | Offset);
}
+ return Output;
+}
- /// Convert buffer \p Input to its hexadecimal representation.
- /// The returned string is double the size of \p Input.
- inline std::string toHex( std::string_ref Input, bool LowerCase = false) {
- static const char* const LUT = "0123456789ABCDEF";
- const uint8_t Offset = LowerCase ? 32 : 0;
- size_t Length = Input.size();
+inline std::string toHex(std::vector<uint8_t> Input, bool LowerCase = false)
+{
+ return toHex(toStringRef(Input), LowerCase);
+}
- std::string Output;
- Output.reserve(2 * Length);
- for (size_t i = 0; i < Length; ++i) {
- const unsigned char c = Input[i];
- Output.push_back(LUT[c >> 4] | Offset);
- Output.push_back(LUT[c & 15] | Offset);
- }
- return Output;
+/// Store the binary representation of the two provided values, \p MSB and
+/// \p LSB, that make up the nibbles of a hexadecimal digit. If \p MSB or \p LSB
+/// do not correspond to proper nibbles of a hexadecimal digit, this method
+/// returns false. Otherwise, returns true.
+inline bool tryGetHexFromNibbles(char MSB, char LSB, uint8_t& Hex)
+{
+ unsigned U1 = hexDigitValue(MSB);
+ unsigned U2 = hexDigitValue(LSB);
+ if (U1 == ~0U || U2 == ~0U)
+ {
+ return false;
}
- inline std::string toHex(std::vector<uint8_t> Input, bool LowerCase = false) {
- return toHex(toStringRef(Input), LowerCase);
- }
+ Hex = static_cast<uint8_t>((U1 << 4) | U2);
+ return true;
+}
- /// Store the binary representation of the two provided values, \p MSB and
- /// \p LSB, that make up the nibbles of a hexadecimal digit. If \p MSB or \p LSB
- /// do not correspond to proper nibbles of a hexadecimal digit, this method
- /// returns false. Otherwise, returns true.
- inline bool tryGetHexFromNibbles(char MSB, char LSB, uint8_t& Hex) {
- unsigned U1 = hexDigitValue(MSB);
- unsigned U2 = hexDigitValue(LSB);
- if (U1 == ~0U || U2 == ~0U)
- return false;
+/// Return the binary representation of the two provided values, \p MSB and
+/// \p LSB, that make up the nibbles of a hexadecimal digit.
+inline uint8_t hexFromNibbles(char MSB, char LSB)
+{
+ uint8_t Hex = 0;
+ bool GotHex = tryGetHexFromNibbles(MSB, LSB, Hex);
+ (void)GotHex;
+ assert(GotHex && "MSB and/or LSB do not correspond to hex digits");
+ return Hex;
+}
- Hex = static_cast<uint8_t>((U1 << 4) | U2);
+/// Convert hexadecimal string \p Input to its binary representation and store
+/// the result in \p Output. Returns true if the binary representation could be
+/// converted from the hexadecimal string. Returns false if \p Input contains
+/// non-hexadecimal digits. The output string is half the size of \p Input.
+inline bool tryGetFromHex(std::string_ref Input, std::string& Output)
+{
+ if (Input.empty())
+ {
return true;
}
- /// Return the binary representation of the two provided values, \p MSB and
- /// \p LSB, that make up the nibbles of a hexadecimal digit.
- inline uint8_t hexFromNibbles(char MSB, char LSB) {
+ Output.reserve((Input.size() + 1) / 2);
+ if (Input.size() % 2 == 1)
+ {
uint8_t Hex = 0;
- bool GotHex = tryGetHexFromNibbles(MSB, LSB, Hex);
- (void)GotHex;
- assert(GotHex && "MSB and/or LSB do not correspond to hex digits");
- return Hex;
- }
-
- /// Convert hexadecimal string \p Input to its binary representation and store
- /// the result in \p Output. Returns true if the binary representation could be
- /// converted from the hexadecimal string. Returns false if \p Input contains
- /// non-hexadecimal digits. The output string is half the size of \p Input.
- inline bool tryGetFromHex( std::string_ref Input, std::string& Output) {
- if (Input.empty())
- return true;
-
- Output.reserve((Input.size() + 1) / 2);
- if (Input.size() % 2 == 1) {
- uint8_t Hex = 0;
- if (!tryGetHexFromNibbles('0', Input.front(), Hex))
- return false;
-
- Output.push_back(Hex);
- Input = Input.drop_front();
+ if (!tryGetHexFromNibbles('0', Input.front(), Hex))
+ {
+ return false;
}
- assert(Input.size() % 2 == 0);
- while (!Input.empty()) {
- uint8_t Hex = 0;
- if (!tryGetHexFromNibbles(Input[0], Input[1], Hex))
- return false;
+ Output.push_back(Hex);
+ Input = Input.drop_front();
+ }
- Output.push_back(Hex);
- Input = Input.drop_front(2);
+ assert(Input.size() % 2 == 0);
+ while (!Input.empty())
+ {
+ uint8_t Hex = 0;
+ if (!tryGetHexFromNibbles(Input[0], Input[1], Hex))
+ {
+ return false;
}
- return true;
- }
- /// Convert hexadecimal string \p Input to its binary representation.
- /// The return string is half the size of \p Input.
- inline std::string fromHex( std::string_ref Input) {
- std::string Hex;
- bool GotHex = tryGetFromHex(Input, Hex);
- (void)GotHex;
- assert(GotHex && "Input contains non hex digits");
- return Hex;
+ Output.push_back(Hex);
+ Input = Input.drop_front(2);
}
+ return true;
+}
+/// Convert hexadecimal string \p Input to its binary representation.
+/// The return string is half the size of \p Input.
+inline std::string fromHex(std::string_ref Input)
+{
+ std::string Hex;
+ bool GotHex = tryGetFromHex(Input, Hex);
+ (void)GotHex;
+ assert(GotHex && "Input contains non hex digits");
+ return Hex;
+}
+inline std::string utostr(uint64_t X, bool isNeg = false)
+{
+ char Buffer[21];
+ char* BufPtr = std::end(Buffer);
- inline std::string utostr(uint64_t X, bool isNeg = false) {
- char Buffer[21];
- char* BufPtr = std::end(Buffer);
-
- if (X == 0) *--BufPtr = '0'; // Handle special case...
-
- while (X) {
- *--BufPtr = '0' + char(X % 10);
- X /= 10;
- }
-
- if (isNeg) *--BufPtr = '-'; // Add negative sign...
- return std::string(BufPtr, std::end(Buffer));
+ if (X == 0)
+ {
+ *--BufPtr = '0'; // Handle special case...
}
- inline std::string itostr(int64_t X) {
- if (X < 0)
- return utostr(static_cast<uint64_t>(1) + ~static_cast<uint64_t>(X), true);
- else
- return utostr(static_cast<uint64_t>(X));
+ while (X)
+ {
+ *--BufPtr = '0' + char(X % 10);
+ X /= 10;
}
- /// StrInStrNoCase - Portable version of strcasestr. Locates the first
- /// occurrence of string 's1' in string 's2', ignoring case. Returns
- /// the offset of s2 in s1 or npos if s2 cannot be found.
- std::string_ref::size_type StrInStrNoCase( std::string_ref s1, std::string_ref s2);
-
- /// getToken - This function extracts one token from source, ignoring any
- /// leading characters that appear in the Delimiters string, and ending the
- /// token at any of the characters that appear in the Delimiters string. If
- /// there are no tokens in the source string, an empty string is returned.
- /// The function returns a pair containing the extracted token and the
- /// remaining tail string.
- std::pair< std::string_ref, std::string_ref> getToken( std::string_ref Source,
- std::string_ref Delimiters = " \t\n\v\f\r");
-
+ if (isNeg)
+ {
+ *--BufPtr = '-'; // Add negative sign...
+ }
+ return std::string(BufPtr, std::end(Buffer));
+}
+inline std::string itostr(int64_t X)
+{
+ if (X < 0)
+ {
+ return utostr(static_cast<uint64_t>(1) + ~static_cast<uint64_t>(X), true);
+ }
+ else
+ {
+ return utostr(static_cast<uint64_t>(X));
+ }
+}
- /// Returns the English suffix for an ordinal integer (-st, -nd, -rd, -th).
- inline std::string_ref getOrdinalSuffix(unsigned Val) {
- // It is critically important that we do this perfectly for
- // user-written sequences with over 100 elements.
- switch (Val % 100) {
- case 11:
- case 12:
- case 13:
- return "th";
+/// StrInStrNoCase - Portable version of strcasestr. Locates the first
+/// occurrence of string 's1' in string 's2', ignoring case. Returns
+/// the offset of s2 in s1 or npos if s2 cannot be found.
+std::string_ref::size_type StrInStrNoCase(std::string_ref s1, std::string_ref s2);
+
+/// getToken - This function extracts one token from source, ignoring any
+/// leading characters that appear in the Delimiters string, and ending the
+/// token at any of the characters that appear in the Delimiters string. If
+/// there are no tokens in the source string, an empty string is returned.
+/// The function returns a pair containing the extracted token and the
+/// remaining tail string.
+std::pair<std::string_ref, std::string_ref> getToken(
+ std::string_ref Source, std::string_ref Delimiters = " \t\n\v\f\r"
+);
+
+/// Returns the English suffix for an ordinal integer (-st, -nd, -rd, -th).
+inline std::string_ref getOrdinalSuffix(unsigned Val)
+{
+ // It is critically important that we do this perfectly for
+ // user-written sequences with over 100 elements.
+ switch (Val % 100)
+ {
+ case 11:
+ case 12:
+ case 13:
+ return "th";
+ default:
+ switch (Val % 10)
+ {
+ case 1:
+ return "st";
+ case 2:
+ return "nd";
+ case 3:
+ return "rd";
default:
- switch (Val % 10) {
- case 1: return "st";
- case 2: return "nd";
- case 3: return "rd";
- default: return "th";
- }
+ return "th";
}
}
+}
- namespace detail {
+namespace detail
+{
- template <typename IteratorT>
- inline std::string join_impl(IteratorT Begin, IteratorT End,
- std::string_ref Separator, std::input_iterator_tag) {
- std::string S;
- if (Begin == End)
- return S;
+ template<typename IteratorT>
+ inline std::string join_impl(IteratorT Begin, IteratorT End, std::string_ref Separator, std::input_iterator_tag)
+ {
+ std::string S;
+ if (Begin == End)
+ {
+ return S;
+ }
+ S += (*Begin);
+ while (++Begin != End)
+ {
+ S += Separator;
S += (*Begin);
- while (++Begin != End) {
- S += Separator;
- S += (*Begin);
- }
+ }
+ return S;
+ }
+
+ template<typename IteratorT>
+ inline std::string join_impl(IteratorT Begin, IteratorT End, std::string_ref Separator, std::forward_iterator_tag)
+ {
+ std::string S;
+ if (Begin == End)
+ {
return S;
}
- template <typename IteratorT>
- inline std::string join_impl(IteratorT Begin, IteratorT End,
- std::string_ref Separator, std::forward_iterator_tag) {
- std::string S;
- if (Begin == End)
- return S;
-
- size_t Len = (std::distance(Begin, End) - 1) * Separator.size();
- for (IteratorT I = Begin; I != End; ++I)
- Len += (*I).size();
- S.reserve(Len);
- size_t PrevCapacity = S.capacity();
- (void)PrevCapacity;
+ size_t Len = (std::distance(Begin, End) - 1) * Separator.size();
+ for (IteratorT I = Begin; I != End; ++I)
+ {
+ Len += (*I).size();
+ }
+ S.reserve(Len);
+ size_t PrevCapacity = S.capacity();
+ (void)PrevCapacity;
+ S += (*Begin);
+ while (++Begin != End)
+ {
+ S += Separator;
S += (*Begin);
- while (++Begin != End) {
- S += Separator;
- S += (*Begin);
- }
- assert(PrevCapacity == S.capacity() && "String grew during building");
- return S;
}
+ assert(PrevCapacity == S.capacity() && "String grew during building");
+ return S;
+ }
- template <typename Sep>
- inline void join_items_impl(std::string& Result, Sep Separator) {}
+ template<typename Sep>
+ inline void join_items_impl(std::string& Result, Sep Separator)
+ {
+ }
- template <typename Sep, typename Arg>
- inline void join_items_impl(std::string& Result, Sep Separator,
- const Arg& Item) {
- Result += Item;
- }
+ template<typename Sep, typename Arg>
+ inline void join_items_impl(std::string& Result, Sep Separator, Arg const& Item)
+ {
+ Result += Item;
+ }
- template <typename Sep, typename Arg1, typename... Args>
- inline void join_items_impl(std::string& Result, Sep Separator, const Arg1& A1,
- Args &&... Items) {
- Result += A1;
- Result += Separator;
- join_items_impl(Result, Separator, std::forward<Args>(Items)...);
- }
+ template<typename Sep, typename Arg1, typename... Args>
+ inline void join_items_impl(std::string& Result, Sep Separator, Arg1 const& A1, Args&&... Items)
+ {
+ Result += A1;
+ Result += Separator;
+ join_items_impl(Result, Separator, std::forward<Args>(Items)...);
+ }
+
+ inline size_t join_one_item_size(char)
+ {
+ return 1;
+ }
+ inline size_t join_one_item_size(char const* S)
+ {
+ return S ? ::strlen(S) : 0;
+ }
- inline size_t join_one_item_size(char) { return 1; }
- inline size_t join_one_item_size(const char* S) { return S ? ::strlen(S) : 0; }
+ template<typename T>
+ inline size_t join_one_item_size(T const& Str)
+ {
+ return Str.size();
+ }
- template <typename T> inline size_t join_one_item_size(const T& Str) {
- return Str.size();
- }
+ inline size_t join_items_size()
+ {
+ return 0;
+ }
- inline size_t join_items_size() { return 0; }
+ template<typename A1>
+ inline size_t join_items_size(const A1& A)
+ {
+ return join_one_item_size(A);
+ }
+ template<typename A1, typename... Args>
+ inline size_t join_items_size(const A1& A, Args&&... Items)
+ {
+ return join_one_item_size(A) + join_items_size(std::forward<Args>(Items)...);
+ }
- template <typename A1> inline size_t join_items_size(const A1& A) {
- return join_one_item_size(A);
- }
- template <typename A1, typename... Args>
- inline size_t join_items_size(const A1& A, Args &&... Items) {
- return join_one_item_size(A) + join_items_size(std::forward<Args>(Items)...);
- }
+} // end namespace detail
- } // end namespace detail
-
- /// Joins the strings in the range [Begin, End), adding Separator between
- /// the elements.
- template <typename IteratorT>
- inline std::string join(IteratorT Begin, IteratorT End, std::string_ref Separator) {
- using tag = typename std::iterator_traits<IteratorT>::iterator_category;
- return detail::join_impl(Begin, End, Separator, tag());
- }
-
- /// Joins the strings in the range [R.begin(), R.end()), adding Separator
- /// between the elements.
- template <typename Range>
- inline std::string join(Range&& R, std::string_ref Separator) {
- return join(R.begin(), R.end(), Separator);
- }
-
- /// Joins the strings in the parameter pack \p Items, adding \p Separator
- /// between the elements. All arguments must be implicitly convertible to
- /// std::string, or there should be an overload of std::string::operator+=()
- /// that accepts the argument explicitly.
- template <typename Sep, typename... Args>
- inline std::string join_items(Sep Separator, Args &&... Items) {
- std::string Result;
- if (sizeof...(Items) == 0)
- return Result;
-
- size_t NS = detail::join_one_item_size(Separator);
- size_t NI = detail::join_items_size(std::forward<Args>(Items)...);
- Result.reserve(NI + (sizeof...(Items) - 1) * NS + 1);
- detail::join_items_impl(Result, Separator, std::forward<Args>(Items)...);
+/// Joins the strings in the range [Begin, End), adding Separator between
+/// the elements.
+template<typename IteratorT>
+inline std::string join(IteratorT Begin, IteratorT End, std::string_ref Separator)
+{
+ using tag = typename std::iterator_traits<IteratorT>::iterator_category;
+ return detail::join_impl(Begin, End, Separator, tag());
+}
+
+/// Joins the strings in the range [R.begin(), R.end()), adding Separator
+/// between the elements.
+template<typename Range>
+inline std::string join(Range&& R, std::string_ref Separator)
+{
+ return join(R.begin(), R.end(), Separator);
+}
+
+/// Joins the strings in the parameter pack \p Items, adding \p Separator
+/// between the elements. All arguments must be implicitly convertible to
+/// std::string, or there should be an overload of std::string::operator+=()
+/// that accepts the argument explicitly.
+template<typename Sep, typename... Args>
+inline std::string join_items(Sep Separator, Args&&... Items)
+{
+ std::string Result;
+ if (sizeof...(Items) == 0)
+ {
return Result;
}
- /// A helper class to return the specified delimiter string after the first
- /// invocation of operator std::string_ref(). Used to generate a comma-separated
- /// list from a loop like so:
- ///
- /// \code
- /// ListSeparator LS;
- /// for (auto &I : C)
- /// OS << LS << I.getName();
- /// \end
- class ListSeparator {
- bool First = true;
- std::string_ref Separator;
-
- public:
- ListSeparator( std::string_ref Separator = ", ") : Separator(Separator) {}
- operator std::string_ref() {
- if (First) {
- First = false;
- return {};
- }
- return Separator;
+ size_t NS = detail::join_one_item_size(Separator);
+ size_t NI = detail::join_items_size(std::forward<Args>(Items)...);
+ Result.reserve(NI + (sizeof...(Items) - 1) * NS + 1);
+ detail::join_items_impl(Result, Separator, std::forward<Args>(Items)...);
+ return Result;
+}
+
+/// A helper class to return the specified delimiter string after the first
+/// invocation of operator std::string_ref(). Used to generate a comma-separated
+/// list from a loop like so:
+///
+/// \code
+/// ListSeparator LS;
+/// for (auto &I : C)
+/// OS << LS << I.getName();
+/// \end
+class ListSeparator
+{
+ bool First = true;
+ std::string_ref Separator;
+
+public:
+ ListSeparator(std::string_ref Separator = ", ") : Separator(Separator)
+ {
+ }
+ operator std::string_ref()
+ {
+ if (First)
+ {
+ First = false;
+ return {};
}
- };
+ return Separator;
+ }
+};
} // end namespace lsp
-namespace lsp{
+namespace lsp
+{
// Is <contents a plausible start to an HTML tag?
// Contents may not be the rest of the line, but it's the rest of the plain
// text, so we expect to see at least the tag name.
-bool looksLikeTag(std::string_ref& Contents) {
- if (Contents.empty())
- return false;
- if (Contents.front() == '!' || Contents.front() == '?' ||
- Contents.front() == '/')
- return true;
- // Check the start of the tag name.
- if (!lsp::isAlpha(Contents.front()))
- return false;
- // Drop rest of the tag name, and following whitespace.
- Contents = Contents
- .drop_while([](char C) {
- return lsp::isAlnum(C) || C == '-' || C == '_' || C == ':';
- })
- .drop_while(lsp::isSpace);
- // The rest of the tag consists of attributes, which have restrictive names.
- // If we hit '=', all bets are off (attribute values can contain anything).
- for (; !Contents.empty(); Contents = Contents.drop_front()) {
- if (lsp::isAlnum(Contents.front()) || lsp::isSpace(Contents.front()))
- continue;
- if (Contents.front() == '>' || Contents.start_with("/>"))
- return true; // May close the tag.
- if (Contents.front() == '=')
- return true; // Don't try to parse attribute values.
- return false; // Random punctuation means this isn't a tag.
- }
- return true; // Potentially incomplete tag.
+bool looksLikeTag(std::string_ref& Contents)
+{
+ if (Contents.empty())
+ {
+ return false;
+ }
+ if (Contents.front() == '!' || Contents.front() == '?' || Contents.front() == '/')
+ {
+ return true;
+ }
+ // Check the start of the tag name.
+ if (!lsp::isAlpha(Contents.front()))
+ {
+ return false;
+ }
+ // Drop rest of the tag name, and following whitespace.
+ Contents = Contents.drop_while([](char C) { return lsp::isAlnum(C) || C == '-' || C == '_' || C == ':'; }
+ ).drop_while(lsp::isSpace);
+ // The rest of the tag consists of attributes, which have restrictive names.
+ // If we hit '=', all bets are off (attribute values can contain anything).
+ for (; !Contents.empty(); Contents = Contents.drop_front())
+ {
+ if (lsp::isAlnum(Contents.front()) || lsp::isSpace(Contents.front()))
+ {
+ continue;
+ }
+ if (Contents.front() == '>' || Contents.start_with("/>"))
+ {
+ return true; // May close the tag.
+ }
+ if (Contents.front() == '=')
+ {
+ return true; // Don't try to parse attribute values.
+ }
+ return false; // Random punctuation means this isn't a tag.
+ }
+ return true; // Potentially incomplete tag.
}
// Tests whether C should be backslash-escaped in markdown.
@@ -463,480 +592,556 @@ bool looksLikeTag(std::string_ref& Contents) {
// It's always safe to escape punctuation, but want minimal escaping.
// The strategy is to escape the first character of anything that might start
// a markdown grammar construct.
-bool needsLeadingEscape(char C, std::string_ref Before, std::string_ref After,
- bool StartsLine) {
-
- auto RulerLength = [&]() -> /*Length*/ unsigned {
- if (!StartsLine || !Before.empty())
- return false;
- std::string_ref A = After.trim_right();
- return std::all_of(A.begin(),A.end(), [C](char D) { return C == D; }) ? 1 + A.size() : 0;
- };
- auto IsBullet = [&]() {
- return StartsLine && Before.empty() &&
- (After.empty() || After.start_with(" "));
- };
- auto SpaceSurrounds = [&]() {
- return (After.empty() || std::isspace(After.front())) &&
- (Before.empty() || std::isspace(Before.back()));
- };
-
- auto WordSurrounds = [&]() {
- return (!After.empty() && std::isalnum(After.front())) &&
- (!Before.empty() && std::isalnum(Before.back()));
- };
-
- switch (C) {
- case '\\': // Escaped character.
- return true;
- case '`': // Code block or inline code
- // Any number of backticks can delimit an inline code block that can end
- // anywhere (including on another line). We must escape them all.
- return true;
- case '~': // Code block
- return StartsLine && Before.empty() && After.start_with("~~");
- case '#': { // ATX heading.
- if (!StartsLine || !Before.empty())
- return false;
- std::string_ref& Rest = After.trim_left(C);
- return Rest.empty() || Rest.start_with(" ");
- }
- case ']': // Link or link reference.
- // We escape ] rather than [ here, because it's more constrained:
- // ](...) is an in-line link
- // ]: is a link reference
- // The following are only links if the link reference exists:
- // ] by itself is a shortcut link
- // ][...] is an out-of-line link
- // Because we never emit link references, we don't need to handle these.
- return After.start_with(":") || After.start_with("(");
- case '=': // Setex heading.
- return RulerLength() > 0;
- case '_': // Horizontal ruler or matched delimiter.
- if (RulerLength() >= 3)
- return true;
- // Not a delimiter if surrounded by space, or inside a word.
- // (The rules at word boundaries are subtle).
- return !(SpaceSurrounds() || WordSurrounds());
- case '-': // Setex heading, horizontal ruler, or bullet.
- if (RulerLength() > 0)
- return true;
- return IsBullet();
- case '+': // Bullet list.
- return IsBullet();
- case '*': // Bullet list, horizontal ruler, or delimiter.
- return IsBullet() || RulerLength() >= 3 || !SpaceSurrounds();
- case '<': // HTML tag (or autolink, which we choose not to escape)
- return looksLikeTag(After);
- case '>': // Quote marker. Needs escaping at start of line.
- return StartsLine && Before.empty();
- case '&': { // HTML entity reference
- auto End = After.find(';');
- if (End == std::string_ref::npos)
- return false;
- std::string_ref Content = After.substr(0, End);
- if (Content.consume_front("#"))
- {
- if (Content.consume_front("x") || Content.consume_front("X"))
- {
- return std::all_of(Content.begin(),Content.end(), lsp::isHexDigit);
- }
-
- return std::all_of(Content.begin(), Content.end(), [](char c)
- {
- return lsp::isDigit(c);
- });
- }
- return std::all_of(Content.begin(), Content.end(), [](char c)
+bool needsLeadingEscape(char C, std::string_ref Before, std::string_ref After, bool StartsLine)
+{
+
+ auto RulerLength = [&]() -> /*Length*/ unsigned
+ {
+ if (!StartsLine || !Before.empty())
+ {
+ return false;
+ }
+ std::string_ref A = After.trim_right();
+ return std::all_of(A.begin(), A.end(), [C](char D) { return C == D; }) ? 1 + A.size() : 0;
+ };
+ auto IsBullet = [&]() { return StartsLine && Before.empty() && (After.empty() || After.start_with(" ")); };
+ auto SpaceSurrounds = [&]()
+ { return (After.empty() || std::isspace(After.front())) && (Before.empty() || std::isspace(Before.back())); };
+
+ auto WordSurrounds = [&]()
+ { return (!After.empty() && std::isalnum(After.front())) && (!Before.empty() && std::isalnum(Before.back())); };
+
+ switch (C)
+ {
+ case '\\': // Escaped character.
+ return true;
+ case '`': // Code block or inline code
+ // Any number of backticks can delimit an inline code block that can end
+ // anywhere (including on another line). We must escape them all.
+ return true;
+ case '~': // Code block
+ return StartsLine && Before.empty() && After.start_with("~~");
+ case '#':
+ { // ATX heading.
+ if (!StartsLine || !Before.empty())
{
- return lsp::isAlpha(c);
- });
- }
- case '.': // Numbered list indicator. Escape 12. -> 12\. at start of line.
- case ')':
- return StartsLine && !Before.empty() &&
- std::all_of(Before.begin(), Before.end(), [](char c)
- {
- return lsp::isDigit(c);
- }) && After.start_with(" ");
- default:
- return false;
- }
+ return false;
+ }
+ std::string_ref& Rest = After.trim_left(C);
+ return Rest.empty() || Rest.start_with(" ");
+ }
+ case ']': // Link or link reference.
+ // We escape ] rather than [ here, because it's more constrained:
+ // ](...) is an in-line link
+ // ]: is a link reference
+ // The following are only links if the link reference exists:
+ // ] by itself is a shortcut link
+ // ][...] is an out-of-line link
+ // Because we never emit link references, we don't need to handle these.
+ return After.start_with(":") || After.start_with("(");
+ case '=': // Setex heading.
+ return RulerLength() > 0;
+ case '_': // Horizontal ruler or matched delimiter.
+ if (RulerLength() >= 3)
+ {
+ return true;
+ }
+ // Not a delimiter if surrounded by space, or inside a word.
+ // (The rules at word boundaries are subtle).
+ return !(SpaceSurrounds() || WordSurrounds());
+ case '-': // Setex heading, horizontal ruler, or bullet.
+ if (RulerLength() > 0)
+ {
+ return true;
+ }
+ return IsBullet();
+ case '+': // Bullet list.
+ return IsBullet();
+ case '*': // Bullet list, horizontal ruler, or delimiter.
+ return IsBullet() || RulerLength() >= 3 || !SpaceSurrounds();
+ case '<': // HTML tag (or autolink, which we choose not to escape)
+ return looksLikeTag(After);
+ case '>': // Quote marker. Needs escaping at start of line.
+ return StartsLine && Before.empty();
+ case '&':
+ { // HTML entity reference
+ auto End = After.find(';');
+ if (End == std::string_ref::npos)
+ {
+ return false;
+ }
+ std::string_ref Content = After.substr(0, End);
+ if (Content.consume_front("#"))
+ {
+ if (Content.consume_front("x") || Content.consume_front("X"))
+ {
+ return std::all_of(Content.begin(), Content.end(), lsp::isHexDigit);
+ }
+
+ return std::all_of(Content.begin(), Content.end(), [](char c) { return lsp::isDigit(c); });
+ }
+ return std::all_of(Content.begin(), Content.end(), [](char c) { return lsp::isAlpha(c); });
+ }
+ case '.': // Numbered list indicator. Escape 12. -> 12\. at start of line.
+ case ')':
+ return StartsLine && !Before.empty()
+ && std::all_of(Before.begin(), Before.end(), [](char c) { return lsp::isDigit(c); })
+ && After.start_with(" ");
+ default:
+ return false;
+ }
}
/// Escape a markdown text block. Ensures the punctuation will not introduce
/// any of the markdown constructs.
- std::string_ref renderText(const std::string_ref& Input, bool StartsLine) {
- std::string_ref R;
- for (unsigned I = 0; I < Input.size(); ++I) {
- if (needsLeadingEscape(Input[I], Input.substr(0, I), Input.substr(I + 1),
- StartsLine))
- R.push_back('\\');
- R.push_back(Input[I]);
- }
- return R;
+std::string_ref renderText(std::string_ref const& Input, bool StartsLine)
+{
+ std::string_ref R;
+ for (unsigned I = 0; I < Input.size(); ++I)
+ {
+ if (needsLeadingEscape(Input[I], Input.substr(0, I), Input.substr(I + 1), StartsLine))
+ {
+ R.push_back('\\');
+ }
+ R.push_back(Input[I]);
+ }
+ return R;
}
/// Renders \p Input as an inline block of code in markdown. The returned value
/// is surrounded by backticks and the inner contents are properly escaped.
- std::string_ref renderInlineBlock(const std::string_ref& Input) {
- std::string_ref R;
- // Double all backticks to make sure we don't close the inline block early.
- for (size_t From = 0; From < Input.size();) {
- size_t Next = Input.find("`", From);
- R += Input.substr(From, Next - From);
- if (Next == std::string_ref::npos)
- break;
- R += "``"; // double the found backtick.
-
- From = Next + 1;
- }
- // If results starts with a backtick, add spaces on both sides. The spaces
- // are ignored by markdown renderers.
- if (std::string_ref(R).start_with("`") || std::string_ref(R).end_with("`"))
- return "` " + std::move(R) + " `";
- // Markdown render should ignore first and last space if both are there. We
- // add an extra pair of spaces in that case to make sure we render what the
- // user intended.
- if (std::string_ref(R).start_with(" ") && std::string_ref(R).end_with(" "))
- return "` " + std::move(R) + " `";
- return "`" + std::move(R) + "`";
+std::string_ref renderInlineBlock(std::string_ref const& Input)
+{
+ std::string_ref R;
+ // Double all backticks to make sure we don't close the inline block early.
+ for (size_t From = 0; From < Input.size();)
+ {
+ size_t Next = Input.find("`", From);
+ R += Input.substr(From, Next - From);
+ if (Next == std::string_ref::npos)
+ {
+ break;
+ }
+ R += "``"; // double the found backtick.
+
+ From = Next + 1;
+ }
+ // If results starts with a backtick, add spaces on both sides. The spaces
+ // are ignored by markdown renderers.
+ if (std::string_ref(R).start_with("`") || std::string_ref(R).end_with("`"))
+ {
+ return "` " + std::move(R) + " `";
+ }
+ // Markdown render should ignore first and last space if both are there. We
+ // add an extra pair of spaces in that case to make sure we render what the
+ // user intended.
+ if (std::string_ref(R).start_with(" ") && std::string_ref(R).end_with(" "))
+ {
+ return "` " + std::move(R) + " `";
+ }
+ return "`" + std::move(R) + "`";
}
/// Get marker required for \p Input to represent a markdown codeblock. It
/// consists of at least 3 backticks(`). Although markdown also allows to use
/// tilde(~) for code blocks, they are never used.
- std::string_ref getMarkerForCodeBlock(const std::string_ref& Input) {
- // Count the maximum number of consecutive backticks in \p Input. We need to
- // start and end the code block with more.
- unsigned MaxBackticks = 0;
- unsigned Backticks = 0;
- for (char C : Input) {
- if (C == '`') {
- ++Backticks;
- continue;
- }
- MaxBackticks = std::max(MaxBackticks, Backticks);
- Backticks = 0;
- }
- MaxBackticks = std::max(Backticks, MaxBackticks);
- // Use the corresponding number of backticks to start and end a code block.
- return std::string_ref(/*Repeat=*/std::max(3u, MaxBackticks + 1), '`');
-}
-
- /// SplitString - Split up the specified string according to the specified
-/// delimiters, appending the result fragments to the output list.
- void SplitString(const std::string& Source,
- std::vector<std::string_ref>& OutFragments,
- std::string Delimiters = " \t\n\v\f\r")
+std::string_ref getMarkerForCodeBlock(std::string_ref const& Input)
{
- boost::split(OutFragments, Source, boost::is_any_of(Delimiters));
+ // Count the maximum number of consecutive backticks in \p Input. We need to
+ // start and end the code block with more.
+ unsigned MaxBackticks = 0;
+ unsigned Backticks = 0;
+ for (char C : Input)
+ {
+ if (C == '`')
+ {
+ ++Backticks;
+ continue;
+ }
+ MaxBackticks = std::max(MaxBackticks, Backticks);
+ Backticks = 0;
+ }
+ MaxBackticks = std::max(Backticks, MaxBackticks);
+ // Use the corresponding number of backticks to start and end a code block.
+ return std::string_ref(/*Repeat=*/std::max(3u, MaxBackticks + 1), '`');
}
+/// SplitString - Split up the specified string according to the specified
+/// delimiters, appending the result fragments to the output list.
+void SplitString(
+ std::string const& Source, std::vector<std::string_ref>& OutFragments, std::string Delimiters = " \t\n\v\f\r"
+)
+{
+ boost::split(OutFragments, Source, boost::is_any_of(Delimiters));
+}
// Trims the input and concatenates whitespace blocks into a single ` `.
- std::string_ref canonicalizeSpaces(const std::string_ref& Input) {
- std::vector<std::string_ref> Words;
- SplitString(Input, Words);
-
- return lsp::join(Words, " ");
-}
-
-
- std::string_ref renderBlocks( std::vector<Block*>&& Children,
- void (Block::* RenderFunc)(std::ostringstream&) const) {
- std::string_ref R;
- std::ostringstream OS(R);
-
- std::vector<int> v{ 1, 2, 3 };
-
- // Trim rulers.
- Children.erase(std::remove_if(Children.begin(), Children.end(), [](const Block* C)
- {
- return C->isRuler();
- }), Children.end());
-
- bool LastBlockWasRuler = true;
- for (const auto& C : Children) {
- if (C->isRuler() && LastBlockWasRuler)
- continue;
- LastBlockWasRuler = C->isRuler();
- ((*C).*RenderFunc)(OS);
- }
-
- // Get rid of redundant empty lines introduced in plaintext while imitating
- // padding in markdown.
- std::string_ref AdjustedResult;
- std::string_ref TrimmedText(OS.str());
- TrimmedText = TrimmedText.trim();
-
- std::copy_if(TrimmedText.begin(), TrimmedText.end(),
- std::back_inserter(AdjustedResult),
- [&TrimmedText](const char& C) {
- return !std::string_ref(TrimmedText.data(),
- &C - TrimmedText.data() + 1)
- // We allow at most two newlines.
- .end_with("\n\n\n");
- });
-
- return AdjustedResult;
- };
- std::string_ref renderBlocks(const std::vector<std::unique_ptr<Block> >& children,
- void (Block::* renderFunc)(std::ostringstream&) const)
- {
- std::vector<Block*> temp(children.size(), nullptr);
- for(size_t i = 0 ; i < children.size() ; ++i)
+std::string_ref canonicalizeSpaces(std::string_ref const& Input)
+{
+ std::vector<std::string_ref> Words;
+ SplitString(Input, Words);
+
+ return lsp::join(Words, " ");
+}
+
+std::string_ref renderBlocks(std::vector<Block*>&& Children, void (Block::*RenderFunc)(std::ostringstream&) const)
+{
+ std::string_ref R;
+ std::ostringstream OS(R);
+
+ std::vector<int> v {1, 2, 3};
+
+ // Trim rulers.
+ Children.erase(
+ std::remove_if(Children.begin(), Children.end(), [](Block const* C) { return C->isRuler(); }), Children.end()
+ );
+
+ bool LastBlockWasRuler = true;
+ for (auto const& C : Children)
+ {
+ if (C->isRuler() && LastBlockWasRuler)
+ {
+ continue;
+ }
+ LastBlockWasRuler = C->isRuler();
+ ((*C).*RenderFunc)(OS);
+ }
+
+ // Get rid of redundant empty lines introduced in plaintext while imitating
+ // padding in markdown.
+ std::string_ref AdjustedResult;
+ std::string_ref TrimmedText(OS.str());
+ TrimmedText = TrimmedText.trim();
+
+ std::copy_if(
+ TrimmedText.begin(), TrimmedText.end(), std::back_inserter(AdjustedResult),
+ [&TrimmedText](char const& C)
{
- temp[i]=(children[i].get());
+ return !std::string_ref(TrimmedText.data(), &C - TrimmedText.data() + 1)
+ // We allow at most two newlines.
+ .end_with("\n\n\n");
}
+ );
+
+ return AdjustedResult;
+};
+std::string_ref renderBlocks(
+ std::vector<std::unique_ptr<Block>> const& children, void (Block::*renderFunc)(std::ostringstream&) const
+)
+{
+ std::vector<Block*> temp(children.size(), nullptr);
+ for (size_t i = 0; i < children.size(); ++i)
+ {
+ temp[i] = (children[i].get());
+ }
return renderBlocks(std::move(temp), renderFunc);
- }
+}
// Separates two blocks with extra spacing. Note that it might render strangely
// in vscode if the trailing block is a codeblock, see
// https://github.com/microsoft/vscode/issues/88416 for details.
-class Ruler : public Block {
+class Ruler : public Block
+{
public:
- void renderMarkdown(std::ostringstream &OS) const override {
- // Note that we need an extra new line before the ruler, otherwise we might
- // make previous block a title instead of introducing a ruler.
- OS << "\n---\n";
- }
- void renderPlainText(std::ostringstream &OS) const override { OS << '\n'; }
- std::unique_ptr<Block> clone() const override {
- return std::make_unique<Ruler>(*this);
- }
- bool isRuler() const override { return true; }
+ void renderMarkdown(std::ostringstream& OS) const override
+ {
+ // Note that we need an extra new line before the ruler, otherwise we might
+ // make previous block a title instead of introducing a ruler.
+ OS << "\n---\n";
+ }
+ void renderPlainText(std::ostringstream& OS) const override
+ {
+ OS << '\n';
+ }
+ std::unique_ptr<Block> clone() const override
+ {
+ return std::make_unique<Ruler>(*this);
+ }
+ bool isRuler() const override
+ {
+ return true;
+ }
};
-class CodeBlock : public Block {
+class CodeBlock : public Block
+{
public:
- void renderMarkdown(std::ostringstream &OS) const override {
- std::string_ref Marker = getMarkerForCodeBlock(Contents);
- // No need to pad from previous blocks, as they should end with a new line.
- OS << Marker << Language << '\n' << Contents << '\n' << Marker << '\n';
- }
+ void renderMarkdown(std::ostringstream& OS) const override
+ {
+ std::string_ref Marker = getMarkerForCodeBlock(Contents);
+ // No need to pad from previous blocks, as they should end with a new line.
+ OS << Marker << Language << '\n' << Contents << '\n' << Marker << '\n';
+ }
- void renderPlainText(std::ostringstream &OS) const override {
- // In plaintext we want one empty line before and after codeblocks.
- OS << '\n' << Contents << "\n\n";
- }
+ void renderPlainText(std::ostringstream& OS) const override
+ {
+ // In plaintext we want one empty line before and after codeblocks.
+ OS << '\n' << Contents << "\n\n";
+ }
- std::unique_ptr<Block> clone() const override {
- return std::make_unique<CodeBlock>(*this);
- }
+ std::unique_ptr<Block> clone() const override
+ {
+ return std::make_unique<CodeBlock>(*this);
+ }
- CodeBlock( std::string_ref Contents, std::string_ref Language)
- : Contents(std::move(Contents)), Language(std::move(Language)) {}
+ CodeBlock(std::string_ref Contents, std::string_ref Language)
+ : Contents(std::move(Contents)), Language(std::move(Language))
+ {
+ }
private:
-
- std::string_ref Contents;
- std::string_ref Language;
+ std::string_ref Contents;
+ std::string_ref Language;
};
// Inserts two spaces after each `\n` to indent each line. First line is not
// indented.
- std::string_ref indentLines(const std::string_ref& Input) {
- assert(!Input.end_with("\n") && "Input should've been trimmed.");
- std::string_ref IndentedR;
- // We'll add 2 spaces after each new line.
- IndentedR.reserve(Input.size() + Input.count("\n") * 2);
- for (char C : Input) {
- IndentedR += C;
- if (C == '\n')
- IndentedR.append(" ");
- }
- return IndentedR;
-}
-
-class Heading : public Paragraph {
+std::string_ref indentLines(std::string_ref const& Input)
+{
+ assert(!Input.end_with("\n") && "Input should've been trimmed.");
+ std::string_ref IndentedR;
+ // We'll add 2 spaces after each new line.
+ IndentedR.reserve(Input.size() + Input.count("\n") * 2);
+ for (char C : Input)
+ {
+ IndentedR += C;
+ if (C == '\n')
+ {
+ IndentedR.append(" ");
+ }
+ }
+ return IndentedR;
+}
+
+class Heading : public Paragraph
+{
public:
- Heading(size_t Level) : Level(Level) {}
- void renderMarkdown(std::ostringstream &OS) const override {
- OS << std::string_ref(Level, '#') << ' ';
- Paragraph::renderMarkdown(OS);
- }
+ Heading(size_t Level) : Level(Level)
+ {
+ }
+ void renderMarkdown(std::ostringstream& OS) const override
+ {
+ OS << std::string_ref(Level, '#') << ' ';
+ Paragraph::renderMarkdown(OS);
+ }
private:
- size_t Level;
+ size_t Level;
};
+std::string_ref Block::asMarkdown() const
+{
+ std::string_ref R;
+ std::ostringstream OS(R);
+ renderMarkdown(OS);
+ return std::string_ref(OS.str()).trim();
+}
+
+std::string_ref Block::asPlainText() const
+{
+ std::string_ref R;
+ std::ostringstream OS(R);
+ renderPlainText(OS);
+ return std::string_ref(OS.str()).trim().c_str();
+}
+
+void Paragraph::renderMarkdown(std::ostringstream& OS) const
+{
+ bool NeedsSpace = false;
+ bool HasChunks = false;
+ for (auto& C : Chunks)
+ {
+ if (C.SpaceBefore || NeedsSpace)
+ {
+ OS << " ";
+ }
+ switch (C.Kind)
+ {
+ case Chunk::PlainText:
+ OS << renderText(C.Contents, !HasChunks);
+ break;
+ case Chunk::InlineCode:
+ OS << renderInlineBlock(C.Contents);
+ break;
+ }
+ HasChunks = true;
+ NeedsSpace = C.SpaceAfter;
+ }
+ // Paragraphs are translated into markdown lines, not markdown paragraphs.
+ // Therefore it only has a single linebreak afterwards.
+ // VSCode requires two spaces at the end of line to start a new one.
+ OS << " \n";
+}
+
+std::unique_ptr<Block> Paragraph::clone() const
+{
+ return std::make_unique<Paragraph>(*this);
+}
+
+/// Choose a marker to delimit `Text` from a prioritized list of options.
+/// This is more readable than escaping for plain-text.
+std::string_ref chooseMarker(std::vector<std::string_ref> Options, std::string_ref const& Text)
+{
+ // Prefer a delimiter whose characters don't appear in the text.
+ for (std::string_ref& S : Options)
+ {
+ if (Text.find_first_of(S) == std::string_ref::npos)
+ {
+ return S;
+ }
+ }
+ return Options.front();
+}
+
+void Paragraph::renderPlainText(std::ostringstream& OS) const
+{
+ bool NeedsSpace = false;
+ for (auto& C : Chunks)
+ {
+ if (C.SpaceBefore || NeedsSpace)
+ {
+ OS << " ";
+ }
+ std::string_ref Marker = "";
+ if (C.Preserve && C.Kind == Chunk::InlineCode)
+ {
+ Marker = chooseMarker({"`", "'", "\""}, C.Contents);
+ }
+ OS << Marker << C.Contents << Marker;
+ NeedsSpace = C.SpaceAfter;
+ }
+ OS << '\n';
+}
+
+void BulletList::renderMarkdown(std::ostringstream& OS) const
+{
+ for (auto& D : Items)
+ {
+ // Instead of doing this we might prefer passing Indent to children to get
+ // rid of the copies, if it turns out to be a bottleneck.
+
+ OS << "- ";
+ OS << indentLines(D.asMarkdown()) << '\n';
+ }
+ // We need a new line after list to terminate it in markdown.
+ OS << '\n';
+}
+
+void BulletList::renderPlainText(std::ostringstream& OS) const
+{
+ for (auto& D : Items)
+ {
+ // Instead of doing this we might prefer passing Indent to children to get
+ // rid of the copies, if it turns out to be a bottleneck.
+ OS << "- " << indentLines(D.asPlainText()) << '\n';
+ }
+}
+
+Paragraph& Paragraph::appendSpace()
+{
+ if (!Chunks.empty())
+ {
+ Chunks.back().SpaceAfter = true;
+ }
+ return *this;
+}
+
+Paragraph& Paragraph::appendText(std::string_ref const& Text)
+{
+ std::string_ref Norm = canonicalizeSpaces(Text);
+ if (Norm.empty())
+ {
+ return *this;
+ }
+ Chunks.emplace_back();
+ Chunk& C = Chunks.back();
+ C.Contents = std::move(Norm);
+ C.Kind = Chunk::PlainText;
+
+ C.SpaceBefore = std::isspace(Text.front());
+ C.SpaceAfter = std::isspace(Text.back());
+ return *this;
+}
+
+Paragraph& Paragraph::appendCode(std::string_ref const& Code, bool Preserve)
+{
+ bool AdjacentCode = !Chunks.empty() && Chunks.back().Kind == Chunk::InlineCode;
+ std::string_ref Norm = canonicalizeSpaces(Code);
+ if (Norm.empty())
+ {
+ return *this;
+ }
+ Chunks.emplace_back();
+ Chunk& C = Chunks.back();
+ C.Contents = std::move(Norm);
+ C.Kind = Chunk::InlineCode;
+ C.Preserve = Preserve;
+ // Disallow adjacent code spans without spaces, markdown can't render them.
+ C.SpaceBefore = AdjacentCode;
+ return *this;
+}
+
+std::unique_ptr<Block> BulletList::clone() const
+{
+ return std::make_unique<BulletList>(*this);
+}
+
+class Document& BulletList::addItem()
+{
+ Items.emplace_back();
+ return Items.back();
+}
+Document& Document::operator=(Document const& Other)
+{
+ Children.clear();
+ for (auto const& C : Other.Children)
+ {
+ Children.push_back(C->clone());
+ }
+ return *this;
+}
+void Document::append(Document Other)
+{
+ std::move(Other.Children.begin(), Other.Children.end(), std::back_inserter(Children));
+}
+Paragraph& Document::addParagraph()
+{
+ Children.push_back(std::make_unique<Paragraph>());
+ return *static_cast<Paragraph*>(Children.back().get());
+}
+
+void Document::addRuler()
+{
+ Children.push_back(std::make_unique<Ruler>());
+}
- std::string_ref Block::asMarkdown() const {
- std::string_ref R;
- std::ostringstream OS(R);
- renderMarkdown(OS);
- return std::string_ref(OS.str()).trim();
-}
-
- std::string_ref Block::asPlainText() const {
- std::string_ref R;
- std::ostringstream OS(R);
- renderPlainText(OS);
- return std::string_ref(OS.str()).trim().c_str();
-}
-
- void Paragraph::renderMarkdown(std::ostringstream& OS) const {
- bool NeedsSpace = false;
- bool HasChunks = false;
- for (auto& C : Chunks) {
- if (C.SpaceBefore || NeedsSpace)
- OS << " ";
- switch (C.Kind) {
- case Chunk::PlainText:
- OS << renderText(C.Contents, !HasChunks);
- break;
- case Chunk::InlineCode:
- OS << renderInlineBlock(C.Contents);
- break;
- }
- HasChunks = true;
- NeedsSpace = C.SpaceAfter;
- }
- // Paragraphs are translated into markdown lines, not markdown paragraphs.
- // Therefore it only has a single linebreak afterwards.
- // VSCode requires two spaces at the end of line to start a new one.
- OS << " \n";
- }
-
- std::unique_ptr<Block> Paragraph::clone() const {
- return std::make_unique<Paragraph>(*this);
- }
-
- /// Choose a marker to delimit `Text` from a prioritized list of options.
- /// This is more readable than escaping for plain-text.
- std::string_ref chooseMarker(std::vector<std::string_ref> Options,
- const std::string_ref& Text)
- {
- // Prefer a delimiter whose characters don't appear in the text.
- for (std::string_ref& S : Options)
- if (Text.find_first_of(S) == std::string_ref::npos)
- return S;
- return Options.front();
- }
-
- void Paragraph::renderPlainText(std::ostringstream& OS) const {
- bool NeedsSpace = false;
- for (auto& C : Chunks) {
- if (C.SpaceBefore || NeedsSpace)
- OS << " ";
- std::string_ref Marker = "";
- if (C.Preserve && C.Kind == Chunk::InlineCode)
- Marker = chooseMarker({ "`", "'", "\"" }, C.Contents);
- OS << Marker << C.Contents << Marker;
- NeedsSpace = C.SpaceAfter;
- }
- OS << '\n';
- }
-
- void BulletList::renderMarkdown(std::ostringstream& OS) const {
- for (auto& D : Items) {
- // Instead of doing this we might prefer passing Indent to children to get
- // rid of the copies, if it turns out to be a bottleneck.
-
- OS << "- ";
- OS << indentLines(D.asMarkdown()) << '\n';
- }
- // We need a new line after list to terminate it in markdown.
- OS << '\n';
- }
-
- void BulletList::renderPlainText(std::ostringstream& OS) const {
- for (auto& D : Items) {
- // Instead of doing this we might prefer passing Indent to children to get
- // rid of the copies, if it turns out to be a bottleneck.
- OS << "- " << indentLines(D.asPlainText()) << '\n';
- }
- }
-
- Paragraph& Paragraph::appendSpace() {
- if (!Chunks.empty())
- Chunks.back().SpaceAfter = true;
- return *this;
- }
-
- Paragraph& Paragraph::appendText(const std::string_ref& Text) {
- std::string_ref Norm = canonicalizeSpaces(Text);
- if (Norm.empty())
- return *this;
- Chunks.emplace_back();
- Chunk& C = Chunks.back();
- C.Contents = std::move(Norm);
- C.Kind = Chunk::PlainText;
-
- C.SpaceBefore = std::isspace(Text.front());
- C.SpaceAfter = std::isspace(Text.back());
- return *this;
- }
-
- Paragraph& Paragraph::appendCode(const std::string_ref& Code, bool Preserve) {
- bool AdjacentCode =
- !Chunks.empty() && Chunks.back().Kind == Chunk::InlineCode;
- std::string_ref Norm = canonicalizeSpaces(Code);
- if (Norm.empty())
- return *this;
- Chunks.emplace_back();
- Chunk& C = Chunks.back();
- C.Contents = std::move(Norm);
- C.Kind = Chunk::InlineCode;
- C.Preserve = Preserve;
- // Disallow adjacent code spans without spaces, markdown can't render them.
- C.SpaceBefore = AdjacentCode;
- return *this;
- }
-
- std::unique_ptr<Block> BulletList::clone() const {
- return std::make_unique<BulletList>(*this);
- }
-
- class Document& BulletList::addItem() {
- Items.emplace_back();
- return Items.back();
- }
-
- Document& Document::operator=(const Document& Other) {
- Children.clear();
- for (const auto& C : Other.Children)
- Children.push_back(C->clone());
- return *this;
- }
-
- void Document::append(Document Other) {
- std::move(Other.Children.begin(), Other.Children.end(),
- std::back_inserter(Children));
- }
-
- Paragraph& Document::addParagraph() {
- Children.push_back(std::make_unique<Paragraph>());
- return *static_cast<Paragraph*>(Children.back().get());
- }
-
- void Document::addRuler() { Children.push_back(std::make_unique<Ruler>()); }
-
- void Document::addCodeBlock(std::string_ref Code, std::string_ref Language) {
- Children.emplace_back(
- std::make_unique<CodeBlock>(std::move(Code), std::move(Language)));
- }
-
- std::string_ref Document::asMarkdown() const {
- return renderBlocks(Children, &Block::renderMarkdown);
- }
-
- std::string_ref Document::asPlainText() const {
- return renderBlocks(Children, &Block::renderPlainText);
- }
-
- BulletList& Document::addBulletList() {
- Children.emplace_back(std::make_unique<BulletList>());
- return *static_cast<BulletList*>(Children.back().get());
- }
-
- Paragraph& Document::addHeading(size_t Level) {
- assert(Level > 0);
- Children.emplace_back(std::make_unique<Heading>(Level));
- return *static_cast<Paragraph*>(Children.back().get());
- }
- };
+void Document::addCodeBlock(std::string_ref Code, std::string_ref Language)
+{
+ Children.emplace_back(std::make_unique<CodeBlock>(std::move(Code), std::move(Language)));
+}
+
+std::string_ref Document::asMarkdown() const
+{
+ return renderBlocks(Children, &Block::renderMarkdown);
+}
+
+std::string_ref Document::asPlainText() const
+{
+ return renderBlocks(Children, &Block::renderPlainText);
+}
+
+BulletList& Document::addBulletList()
+{
+ Children.emplace_back(std::make_unique<BulletList>());
+ return *static_cast<BulletList*>(Children.back().get());
+}
+
+Paragraph& Document::addHeading(size_t Level)
+{
+ assert(Level > 0);
+ Children.emplace_back(std::make_unique<Heading>(Level));
+ return *static_cast<Paragraph*>(Children.back().get());
+}
+}; // namespace lsp
diff --git a/graphics/asymptote/LspCpp/src/lsp/ParentProcessWatcher.cpp b/graphics/asymptote/LspCpp/src/lsp/ParentProcessWatcher.cpp
index c698a3157e..ee4147b76b 100644
--- a/graphics/asymptote/LspCpp/src/lsp/ParentProcessWatcher.cpp
+++ b/graphics/asymptote/LspCpp/src/lsp/ParentProcessWatcher.cpp
@@ -3,7 +3,7 @@
#include <boost/process.hpp>
#ifdef _WIN32
-#include <boost/process/windows.hpp>
+#include <boost/process/v1/windows.hpp>
#endif
#include <boost/filesystem.hpp>
@@ -13,95 +13,103 @@
#include "LibLsp/lsp/ProcessIoService.h"
#include "LibLsp/lsp/SimpleTimer.h"
-
using namespace boost::asio::ip;
using namespace std;
struct ParentProcessWatcher::ParentProcessWatcherData : std::enable_shared_from_this<ParentProcessWatcherData>
{
- std::unique_ptr<SimpleTimer<boost::posix_time::seconds>> timer;
- lsp::Log& _log;
- std::function<void()> on_exit;
- lsp::ProcessIoService asio_io;
- std::shared_ptr < boost::process::opstream> write_to_service;
- std::shared_ptr< boost::process::ipstream > read_from_service;
- int pid;
- const int _poll_delay_secs /*= 10*/;
- std::string command;
- std::shared_ptr<boost::process::child> c;
+ std::unique_ptr<SimpleTimer<boost::posix_time::seconds>> timer;
+ lsp::Log& _log;
+ std::function<void()> on_exit;
+ lsp::ProcessIoService asio_io;
+ std::shared_ptr<boost::process::opstream> write_to_service;
+ std::shared_ptr<boost::process::ipstream> read_from_service;
+ int pid;
+ int const _poll_delay_secs /*= 10*/;
+ std::string command;
+ std::shared_ptr<boost::process::child> c;
- ParentProcessWatcherData(lsp::Log& log, int _pid,
- const std::function<void()>&& callback, uint32_t poll_delay_secs) :
- _log(log), on_exit(callback), pid(_pid), _poll_delay_secs(poll_delay_secs)
- {
+ ParentProcessWatcherData(lsp::Log& log, int _pid, std::function<void()> const&& callback, uint32_t poll_delay_secs)
+ : _log(log), on_exit(callback), pid(_pid), _poll_delay_secs(poll_delay_secs)
+ {
#ifdef _WIN32
- command = "cmd /c \"tasklist /FI \"PID eq " + std::to_string(pid) + "\" | findstr " +
- std::to_string(pid) + "\"";
+ command =
+ "cmd /c \"tasklist /FI \"PID eq " + std::to_string(pid) + "\" | findstr " + std::to_string(pid) + "\"";
#else
- command = "ps -p " + std::to_string(pid);
+ command = "ps -p " + std::to_string(pid);
#endif
+ }
- }
-
- void run()
- {
- write_to_service = std::make_shared<boost::process::opstream>();
- read_from_service = std::make_shared<boost::process::ipstream>();
+ void run()
+ {
+ write_to_service = std::make_shared<boost::process::opstream>();
+ read_from_service = std::make_shared<boost::process::ipstream>();
-// const uint32_t POLL_DELAY_SECS = _poll_delay_secs;
- auto self(shared_from_this());
- std::error_code ec;
- namespace bp = boost::process;
- c = std::make_shared<bp::child>(asio_io.getIOService(), command,
- ec,
+ // const uint32_t POLL_DELAY_SECS = _poll_delay_secs;
+ auto self(shared_from_this());
+ std::error_code ec;
+ namespace bp = boost::process;
+ c = std::make_shared<bp::child>(
+ asio_io.getIOService(), command, ec,
#ifdef _WIN32
- bp::windows::hide,
+ bp::windows::hide,
#endif
- bp::std_out > *read_from_service,
- bp::std_in < *write_to_service,
- bp::on_exit([self](int exit_code, const std::error_code& ec_in) {
- // the tasklist command should return 0 (parent process exists) or 1 (parent process doesn't exist)
- if (exit_code == 1)//
- {
- if (self->on_exit)
- {
+ bp::std_out > *read_from_service, bp::std_in < *write_to_service,
+ bp::on_exit(
+ [self](int exit_code, std::error_code const&)
+ {
+ // the tasklist command should return 0 (parent process exists) or 1 (parent process doesn't exist)
+ if (exit_code == 1) //
+ {
+ if (self->on_exit)
+ {
- std::thread([=]()
- {
- std::this_thread::sleep_for(std::chrono::seconds(3));
- self->on_exit();
- }).detach();
- }
- }
- else
+ std::thread(
+ [=]()
{
- if (exit_code > 1)
- {
- self->_log.log(lsp::Log::Level::WARNING, "The tasklist command: '" + self->command + "' returns " + std::to_string(exit_code));
- }
-
- self->timer = std::make_unique<SimpleTimer<boost::posix_time::seconds>>(self->_poll_delay_secs, [=]() {
- self->run();
- });
+ std::this_thread::sleep_for(std::chrono::seconds(3));
+ self->on_exit();
}
+ ).detach();
+ }
+ }
+ else
+ {
+ if (exit_code > 1)
+ {
+ self->_log.log(
+ lsp::Log::Level::WARNING,
+ "The tasklist command: '" + self->command + "' returns " + std::to_string(exit_code)
+ );
+ }
- }));
- if (ec)
- {
- // fail
- _log.log(lsp::Log::Level::SEVERE, "Start parent process watcher failed.");
+ self->timer = std::make_unique<SimpleTimer<boost::posix_time::seconds>>(
+ self->_poll_delay_secs, [=]() { self->run(); }
+ );
+ }
}
+ )
+ );
+ if (ec)
+ {
+ // fail
+ _log.log(lsp::Log::Level::SEVERE, "Start parent process watcher failed.");
}
+ }
};
-ParentProcessWatcher::ParentProcessWatcher(lsp::Log& log, int pid,
- const std::function<void()>&& callback, uint32_t poll_delay_secs) : d_ptr(new ParentProcessWatcherData(log, pid, std::move(callback), poll_delay_secs))
+ParentProcessWatcher::ParentProcessWatcher(
+ lsp::Log& log, int pid, std::function<void()> const&& callback, uint32_t poll_delay_secs
+)
+ : d_ptr(new ParentProcessWatcherData(log, pid, std::move(callback), poll_delay_secs))
{
- d_ptr->run();
+ d_ptr->run();
}
ParentProcessWatcher::~ParentProcessWatcher()
{
- if (d_ptr->timer)
- d_ptr->timer->Stop();
+ if (d_ptr->timer)
+ {
+ d_ptr->timer->Stop();
+ }
}
diff --git a/graphics/asymptote/LspCpp/src/lsp/ProtocolJsonHandler.cpp b/graphics/asymptote/LspCpp/src/lsp/ProtocolJsonHandler.cpp
index c860b555af..123a580c5c 100644
--- a/graphics/asymptote/LspCpp/src/lsp/ProtocolJsonHandler.cpp
+++ b/graphics/asymptote/LspCpp/src/lsp/ProtocolJsonHandler.cpp
@@ -5,7 +5,6 @@
#include "LibLsp/lsp/textDocument/code_lens.h"
#include "LibLsp/lsp/textDocument/completion.h"
-
#include "LibLsp/lsp/textDocument/did_close.h"
#include "LibLsp/lsp/textDocument/highlight.h"
@@ -70,647 +69,639 @@
#include "LibLsp/lsp/textDocument/semanticHighlighting.h"
#include "LibLsp/lsp/workspace/configuration.h"
-
void AddStadardResponseJsonRpcMethod(MessageJsonHandler& handler)
{
- handler.method2response[td_initialize::request::kMethodInfo] = [](Reader& visitor)
- {
- if(visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return td_initialize::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_shutdown::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_shutdown::response::ReflectReader(visitor);
- };
- handler.method2response[td_codeAction::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return td_codeAction::response::ReflectReader(visitor);
- };
- handler.method2response[td_codeLens::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_codeLens::response::ReflectReader(visitor);
- };
- handler.method2response[td_completion::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_completion::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_definition::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_definition::response::ReflectReader(visitor);
- };
- handler.method2response[td_declaration::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_declaration::response::ReflectReader(visitor);
- };
- handler.method2response[td_willSaveWaitUntil::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_willSaveWaitUntil::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_highlight::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_highlight::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_links::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_links::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_linkResolve::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_linkResolve::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_symbol::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_symbol::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_formatting::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_formatting::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_hover::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_hover::response::ReflectReader(visitor);
-
- };
-
- handler.method2response[td_implementation::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_implementation::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_rangeFormatting::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_rangeFormatting::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_references::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_references::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_rename::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_rename::response::ReflectReader(visitor);
- };
-
-
- handler.method2response[td_signatureHelp::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_signatureHelp::response::ReflectReader(visitor);
- };
-
- handler.method2response[td_typeDefinition::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_typeDefinition::response::ReflectReader(visitor);
- };
-
- handler.method2response[wp_executeCommand::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return wp_executeCommand::response::ReflectReader(visitor);
- };
-
- handler.method2response[wp_symbol::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return wp_symbol::response::ReflectReader(visitor);
- };
- handler.method2response[td_typeHierarchy::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_typeHierarchy::response::ReflectReader(visitor);
- };
- handler.method2response[completionItem_resolve::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return completionItem_resolve::response::ReflectReader(visitor);
- };
-
- handler.method2response[codeLens_resolve::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return codeLens_resolve::response::ReflectReader(visitor);
-
- };
-
- handler.method2response[td_colorPresentation::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return td_colorPresentation::response::ReflectReader(visitor);
-
- };
- handler.method2response[td_documentColor::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return td_documentColor::response::ReflectReader(visitor);
-
- };
- handler.method2response[td_foldingRange::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return td_foldingRange::response::ReflectReader(visitor);
-
- };
- handler.method2response[td_prepareRename::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return td_prepareRename::response::ReflectReader(visitor);
-
- };
- handler.method2response[typeHierarchy_resolve::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return typeHierarchy_resolve::response::ReflectReader(visitor);
-
- };
-
- handler.method2response[td_selectionRange::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return td_selectionRange::response::ReflectReader(visitor);
-
- };
- handler.method2response[td_didRenameFiles::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return td_didRenameFiles::response::ReflectReader(visitor);
-
- };
- handler.method2response[td_willRenameFiles::request::kMethodInfo] = [](Reader& visitor)
- {
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return td_willRenameFiles::response::ReflectReader(visitor);
-
- };
-
+ handler.method2response[td_initialize::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return td_initialize::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_shutdown::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_shutdown::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_codeAction::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return td_codeAction::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_codeLens::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_codeLens::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_completion::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_completion::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_definition::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_definition::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_declaration::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_declaration::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_willSaveWaitUntil::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_willSaveWaitUntil::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_highlight::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_highlight::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_links::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_links::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_linkResolve::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_linkResolve::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_symbol::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_symbol::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_formatting::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_formatting::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_hover::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_hover::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_implementation::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_implementation::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_rangeFormatting::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_rangeFormatting::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_references::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_references::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_rename::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_rename::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_signatureHelp::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_signatureHelp::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_typeDefinition::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_typeDefinition::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[wp_executeCommand::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return wp_executeCommand::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[wp_symbol::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return wp_symbol::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_typeHierarchy::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_typeHierarchy::response::ReflectReader(visitor);
+ };
+ handler.method2response[completionItem_resolve::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return completionItem_resolve::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[codeLens_resolve::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return codeLens_resolve::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_colorPresentation::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return td_colorPresentation::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_documentColor::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return td_documentColor::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_foldingRange::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return td_foldingRange::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_prepareRename::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return td_prepareRename::response::ReflectReader(visitor);
+ };
+ handler.method2response[typeHierarchy_resolve::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return typeHierarchy_resolve::response::ReflectReader(visitor);
+ };
+
+ handler.method2response[td_selectionRange::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return td_selectionRange::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_didRenameFiles::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return td_didRenameFiles::response::ReflectReader(visitor);
+ };
+ handler.method2response[td_willRenameFiles::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
+ {
+ return Rsp_Error::ReflectReader(visitor);
+ }
+
+ return td_willRenameFiles::response::ReflectReader(visitor);
+ };
}
-
void AddJavaExtentionResponseJsonRpcMethod(MessageJsonHandler& handler)
{
- handler.method2response[java_classFileContents::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_classFileContents::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_classFileContents::response::ReflectReader(visitor);
- };
- handler.method2response[java_buildWorkspace::request::kMethodInfo] = [](Reader& visitor)
+ return java_classFileContents::response::ReflectReader(visitor);
+ };
+ handler.method2response[java_buildWorkspace::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_buildWorkspace::response::ReflectReader(visitor);
- };
- handler.method2response[java_listOverridableMethods::request::kMethodInfo] = [](Reader& visitor)
+ return java_buildWorkspace::response::ReflectReader(visitor);
+ };
+ handler.method2response[java_listOverridableMethods::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_listOverridableMethods::response::ReflectReader(visitor);
- };
- handler.method2response[java_listOverridableMethods::request::kMethodInfo] = [](Reader& visitor)
+ return java_listOverridableMethods::response::ReflectReader(visitor);
+ };
+ handler.method2response[java_listOverridableMethods::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_listOverridableMethods::response::ReflectReader(visitor);
- };
+ return java_listOverridableMethods::response::ReflectReader(visitor);
+ };
- handler.method2response[java_checkHashCodeEqualsStatus::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_checkHashCodeEqualsStatus::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return java_checkHashCodeEqualsStatus::response::ReflectReader(visitor);
- };
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return java_checkHashCodeEqualsStatus::response::ReflectReader(visitor);
+ };
- handler.method2response[java_addOverridableMethods::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_addOverridableMethods::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_addOverridableMethods::response::ReflectReader(visitor);
- };
+ return java_addOverridableMethods::response::ReflectReader(visitor);
+ };
- handler.method2response[java_checkConstructorsStatus::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_checkConstructorsStatus::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_checkConstructorsStatus::response::ReflectReader(visitor);
- };
+ return java_checkConstructorsStatus::response::ReflectReader(visitor);
+ };
-
- handler.method2response[java_checkDelegateMethodsStatus::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_checkDelegateMethodsStatus::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_checkDelegateMethodsStatus::response::ReflectReader(visitor);
- };
- handler.method2response[java_checkToStringStatus::request::kMethodInfo] = [](Reader& visitor)
+ return java_checkDelegateMethodsStatus::response::ReflectReader(visitor);
+ };
+ handler.method2response[java_checkToStringStatus::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
-
- return java_checkToStringStatus::response::ReflectReader(visitor);
- };
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return java_checkToStringStatus::response::ReflectReader(visitor);
+ };
- handler.method2response[java_generateAccessors::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_generateAccessors::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_generateAccessors::response::ReflectReader(visitor);
- };
- handler.method2response[java_generateConstructors::request::kMethodInfo] = [](Reader& visitor)
+ return java_generateAccessors::response::ReflectReader(visitor);
+ };
+ handler.method2response[java_generateConstructors::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_generateConstructors::response::ReflectReader(visitor);
- };
- handler.method2response[java_generateDelegateMethods::request::kMethodInfo] = [](Reader& visitor)
+ return java_generateConstructors::response::ReflectReader(visitor);
+ };
+ handler.method2response[java_generateDelegateMethods::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_generateDelegateMethods::response::ReflectReader(visitor);
- };
+ return java_generateDelegateMethods::response::ReflectReader(visitor);
+ };
- handler.method2response[java_generateHashCodeEquals::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_generateHashCodeEquals::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_generateHashCodeEquals::response::ReflectReader(visitor);
- };
- handler.method2response[java_generateToString::request::kMethodInfo] = [](Reader& visitor)
+ return java_generateHashCodeEquals::response::ReflectReader(visitor);
+ };
+ handler.method2response[java_generateToString::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_generateToString::response::ReflectReader(visitor);
- };
+ return java_generateToString::response::ReflectReader(visitor);
+ };
- handler.method2response[java_generateToString::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_generateToString::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_generateToString::response::ReflectReader(visitor);
- };
+ return java_generateToString::response::ReflectReader(visitor);
+ };
- handler.method2response[java_getMoveDestinations::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_getMoveDestinations::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_getMoveDestinations::response::ReflectReader(visitor);
- };
+ return java_getMoveDestinations::response::ReflectReader(visitor);
+ };
- handler.method2response[java_getRefactorEdit::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_getRefactorEdit::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_getRefactorEdit::response::ReflectReader(visitor);
- };
+ return java_getRefactorEdit::response::ReflectReader(visitor);
+ };
- handler.method2response[java_move::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_move::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_move::response ::ReflectReader(visitor);
- };
+ return java_move::response ::ReflectReader(visitor);
+ };
- handler.method2response[java_organizeImports::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_organizeImports::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_organizeImports::response::ReflectReader(visitor);
- };
+ return java_organizeImports::response::ReflectReader(visitor);
+ };
- handler.method2response[java_resolveUnimplementedAccessors::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_resolveUnimplementedAccessors::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_resolveUnimplementedAccessors::response::ReflectReader(visitor);
- };
+ return java_resolveUnimplementedAccessors::response::ReflectReader(visitor);
+ };
- handler.method2response[java_searchSymbols::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2response[java_searchSymbols::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
+ return Rsp_Error::ReflectReader(visitor);
+ }
- return java_searchSymbols::response::ReflectReader(visitor);
- };
-
- handler.method2request[WorkspaceConfiguration::request::kMethodInfo] = [](Reader& visitor)
- {
- return WorkspaceConfiguration::request::ReflectReader(visitor);
- };
- handler.method2request[WorkspaceFolders::request::kMethodInfo] = [](Reader& visitor)
- {
- return WorkspaceFolders::request::ReflectReader(visitor);
- };
+ return java_searchSymbols::response::ReflectReader(visitor);
+ };
+ handler.method2request[WorkspaceConfiguration::request::kMethodInfo] = [](Reader& visitor)
+ { return WorkspaceConfiguration::request::ReflectReader(visitor); };
+ handler.method2request[WorkspaceFolders::request::kMethodInfo] = [](Reader& visitor)
+ { return WorkspaceFolders::request::ReflectReader(visitor); };
}
void AddNotifyJsonRpcMethod(MessageJsonHandler& handler)
{
- handler.method2notification[Notify_Exit::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_Exit::notify::ReflectReader(visitor);
- };
- handler.method2notification[Notify_InitializedNotification::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_InitializedNotification::notify::ReflectReader(visitor);
- };
-
- handler.method2notification[java_projectConfigurationUpdate::notify::kMethodInfo] = [](Reader& visitor)
- {
- return java_projectConfigurationUpdate::notify::ReflectReader(visitor);
- };
-
- handler.method2notification[Notify_TextDocumentDidChange::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_TextDocumentDidChange::notify::ReflectReader(visitor);
- };
-
- handler.method2notification[Notify_TextDocumentDidClose::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_TextDocumentDidClose::notify::ReflectReader(visitor);
- };
-
-
- handler.method2notification[Notify_TextDocumentDidOpen::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_TextDocumentDidOpen::notify::ReflectReader(visitor);
- };
-
- handler.method2notification[Notify_TextDocumentDidSave::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_TextDocumentDidSave::notify::ReflectReader(visitor);
- };
-
- handler.method2notification[Notify_TextDocumentPublishDiagnostics::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_TextDocumentPublishDiagnostics::notify::ReflectReader(visitor);
- };
- handler.method2notification[Notify_semanticHighlighting::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_semanticHighlighting::notify::ReflectReader(visitor);
- };
- handler.method2notification[td_willSave::notify::kMethodInfo] = [](Reader& visitor)
- {
- return td_willSave::notify::ReflectReader(visitor);
- };
-
- handler.method2notification[Notify_LogMessage::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_LogMessage::notify::ReflectReader(visitor);
- };
- handler.method2notification[Notify_ShowMessage::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_ShowMessage::notify::ReflectReader(visitor);
- };
- handler.method2notification[Notify_WorkspaceDidChangeWorkspaceFolders::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_WorkspaceDidChangeWorkspaceFolders::notify::ReflectReader(visitor);
- };
-
- handler.method2notification[Notify_WorkspaceDidChangeConfiguration::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_WorkspaceDidChangeConfiguration::notify::ReflectReader(visitor);
- };
-
-
- handler.method2notification[Notify_WorkspaceDidChangeWatchedFiles::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_WorkspaceDidChangeWatchedFiles::notify::ReflectReader(visitor);
- };
-
- handler.method2notification[Notify_sendNotification::notify::kMethodInfo] = [](Reader& visitor)
- {
- return Notify_sendNotification::notify::ReflectReader(visitor);
- };
- handler.method2notification[lang_status::notify::kMethodInfo] = [](Reader& visitor)
- {
- return lang_status::notify::ReflectReader(visitor);
- };
- handler.method2notification[lang_actionableNotification::notify::kMethodInfo] = [](Reader& visitor)
- {
- return lang_actionableNotification::notify::ReflectReader(visitor);
- };
- handler.method2notification[lang_progressReport::notify::kMethodInfo] = [](Reader& visitor)
- {
- return lang_progressReport::notify::ReflectReader(visitor);
- };
- handler.method2notification[lang_eventNotification::notify::kMethodInfo] = [](Reader& visitor)
- {
- return lang_eventNotification::notify::ReflectReader(visitor);
- };
+ handler.method2notification[Notify_Exit::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_Exit::notify::ReflectReader(visitor); };
+ handler.method2notification[Notify_InitializedNotification::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_InitializedNotification::notify::ReflectReader(visitor); };
+
+ handler.method2notification[java_projectConfigurationUpdate::notify::kMethodInfo] = [](Reader& visitor)
+ { return java_projectConfigurationUpdate::notify::ReflectReader(visitor); };
+
+ handler.method2notification[Notify_TextDocumentDidChange::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_TextDocumentDidChange::notify::ReflectReader(visitor); };
+
+ handler.method2notification[Notify_TextDocumentDidClose::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_TextDocumentDidClose::notify::ReflectReader(visitor); };
+
+ handler.method2notification[Notify_TextDocumentDidOpen::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_TextDocumentDidOpen::notify::ReflectReader(visitor); };
+
+ handler.method2notification[Notify_TextDocumentDidSave::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_TextDocumentDidSave::notify::ReflectReader(visitor); };
+
+ handler.method2notification[Notify_TextDocumentPublishDiagnostics::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_TextDocumentPublishDiagnostics::notify::ReflectReader(visitor); };
+ handler.method2notification[Notify_semanticHighlighting::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_semanticHighlighting::notify::ReflectReader(visitor); };
+ handler.method2notification[td_willSave::notify::kMethodInfo] = [](Reader& visitor)
+ { return td_willSave::notify::ReflectReader(visitor); };
+
+ handler.method2notification[Notify_LogMessage::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_LogMessage::notify::ReflectReader(visitor); };
+ handler.method2notification[Notify_ShowMessage::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_ShowMessage::notify::ReflectReader(visitor); };
+ handler.method2notification[Notify_WorkspaceDidChangeWorkspaceFolders::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_WorkspaceDidChangeWorkspaceFolders::notify::ReflectReader(visitor); };
+
+ handler.method2notification[Notify_WorkspaceDidChangeConfiguration::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_WorkspaceDidChangeConfiguration::notify::ReflectReader(visitor); };
+
+ handler.method2notification[Notify_WorkspaceDidChangeWatchedFiles::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_WorkspaceDidChangeWatchedFiles::notify::ReflectReader(visitor); };
+
+ handler.method2notification[Notify_sendNotification::notify::kMethodInfo] = [](Reader& visitor)
+ { return Notify_sendNotification::notify::ReflectReader(visitor); };
+ handler.method2notification[lang_status::notify::kMethodInfo] = [](Reader& visitor)
+ { return lang_status::notify::ReflectReader(visitor); };
+ handler.method2notification[lang_actionableNotification::notify::kMethodInfo] = [](Reader& visitor)
+ { return lang_actionableNotification::notify::ReflectReader(visitor); };
+ handler.method2notification[lang_progressReport::notify::kMethodInfo] = [](Reader& visitor)
+ { return lang_progressReport::notify::ReflectReader(visitor); };
+ handler.method2notification[lang_eventNotification::notify::kMethodInfo] = [](Reader& visitor)
+ { return lang_eventNotification::notify::ReflectReader(visitor); };
}
void AddRequstJsonRpcMethod(MessageJsonHandler& handler)
{
- handler.method2request[Req_ClientRegisterCapability::request::kMethodInfo]= [](Reader& visitor)
- {
-
- return Req_ClientRegisterCapability::request::ReflectReader(visitor);
- };
- handler.method2request[Req_ClientUnregisterCapability::request::kMethodInfo] = [](Reader& visitor)
- {
-
- return Req_ClientUnregisterCapability::request::ReflectReader(visitor);
- };
+ handler.method2request[Req_ClientRegisterCapability::request::kMethodInfo] = [](Reader& visitor)
+ { return Req_ClientRegisterCapability::request::ReflectReader(visitor); };
+ handler.method2request[Req_ClientUnregisterCapability::request::kMethodInfo] = [](Reader& visitor)
+ { return Req_ClientUnregisterCapability::request::ReflectReader(visitor); };
}
void AddStandardRequestJsonRpcMethod(MessageJsonHandler& handler)
{
- handler.method2request[td_initialize::request::kMethodInfo] = [](Reader& visitor)
- {
-
- return td_initialize::request::ReflectReader(visitor);
- };
- handler.method2request[td_shutdown::request::kMethodInfo] = [](Reader& visitor)
- {
-
- return td_shutdown::request::ReflectReader(visitor);
- };
- handler.method2request[td_codeAction::request::kMethodInfo] = [](Reader& visitor)
- {
-
-
- return td_codeAction::request::ReflectReader(visitor);
- };
- handler.method2request[td_codeLens::request::kMethodInfo] = [](Reader& visitor)
- {
-
- return td_codeLens::request::ReflectReader(visitor);
- };
- handler.method2request[td_completion::request::kMethodInfo] = [](Reader& visitor)
- {
-
- return td_completion::request::ReflectReader(visitor);
- };
-
- handler.method2request[td_definition::request::kMethodInfo] = [](Reader& visitor)
- {
-
- return td_definition::request::ReflectReader(visitor);
- };
- handler.method2request[td_declaration::request::kMethodInfo] = [](Reader& visitor)
- {
+ handler.method2request[td_initialize::request::kMethodInfo] = [](Reader& visitor)
+ { return td_initialize::request::ReflectReader(visitor); };
+ handler.method2request[td_shutdown::request::kMethodInfo] = [](Reader& visitor)
+ { return td_shutdown::request::ReflectReader(visitor); };
+ handler.method2request[td_codeAction::request::kMethodInfo] = [](Reader& visitor)
+ { return td_codeAction::request::ReflectReader(visitor); };
+ handler.method2request[td_codeLens::request::kMethodInfo] = [](Reader& visitor)
+ { return td_codeLens::request::ReflectReader(visitor); };
+ handler.method2request[td_completion::request::kMethodInfo] = [](Reader& visitor)
+ { return td_completion::request::ReflectReader(visitor); };
- return td_declaration::request::ReflectReader(visitor);
- };
- handler.method2request[td_willSaveWaitUntil::request::kMethodInfo] = [](Reader& visitor)
+ handler.method2request[td_definition::request::kMethodInfo] = [](Reader& visitor)
+ { return td_definition::request::ReflectReader(visitor); };
+ handler.method2request[td_declaration::request::kMethodInfo] = [](Reader& visitor)
+ { return td_declaration::request::ReflectReader(visitor); };
+ handler.method2request[td_willSaveWaitUntil::request::kMethodInfo] = [](Reader& visitor)
+ {
+ if (visitor.HasMember("error"))
{
- if (visitor.HasMember("error"))
- return Rsp_Error::ReflectReader(visitor);
- return td_willSaveWaitUntil::request::ReflectReader(visitor);
- };
-
- handler.method2request[td_highlight::request::kMethodInfo] = [](Reader& visitor)
- {
-
- return td_highlight::request::ReflectReader(visitor);
- };
+ return Rsp_Error::ReflectReader(visitor);
+ }
+ return td_willSaveWaitUntil::request::ReflectReader(visitor);
+ };
- handler.method2request[td_links::request::kMethodInfo] = [](Reader& visitor)
- {
+ handler.method2request[td_highlight::request::kMethodInfo] = [](Reader& visitor)
+ { return td_highlight::request::ReflectReader(visitor); };
- return td_links::request::ReflectReader(visitor);
- };
+ handler.method2request[td_links::request::kMethodInfo] = [](Reader& visitor)
+ { return td_links::request::ReflectReader(visitor); };
- handler.method2request[td_linkResolve::request::kMethodInfo] = [](Reader& visitor)
- {
+ handler.method2request[td_linkResolve::request::kMethodInfo] = [](Reader& visitor)
+ { return td_linkResolve::request::ReflectReader(visitor); };
- return td_linkResolve::request::ReflectReader(visitor);
- };
+ handler.method2request[td_symbol::request::kMethodInfo] = [](Reader& visitor)
+ { return td_symbol::request::ReflectReader(visitor); };
- handler.method2request[td_symbol::request::kMethodInfo] = [](Reader& visitor)
- {
+ handler.method2request[td_formatting::request::kMethodInfo] = [](Reader& visitor)
+ { return td_formatting::request::ReflectReader(visitor); };
- return td_symbol::request::ReflectReader(visitor);
- };
+ handler.method2request[td_hover::request::kMethodInfo] = [](Reader& visitor)
+ { return td_hover::request::ReflectReader(visitor); };
- handler.method2request[td_formatting::request::kMethodInfo] = [](Reader& visitor)
- {
+ handler.method2request[td_implementation::request::kMethodInfo] = [](Reader& visitor)
+ { return td_implementation::request::ReflectReader(visitor); };
- return td_formatting::request::ReflectReader(visitor);
- };
+ handler.method2request[td_didRenameFiles::request::kMethodInfo] = [](Reader& visitor)
+ { return td_didRenameFiles::request::ReflectReader(visitor); };
- handler.method2request[td_hover::request::kMethodInfo] = [](Reader& visitor)
- {
- return td_hover::request::ReflectReader(visitor);
- };
-
- handler.method2request[td_implementation::request::kMethodInfo] = [](Reader& visitor)
- {
-
- return td_implementation::request::ReflectReader(visitor);
- };
-
- handler.method2request[td_didRenameFiles::request::kMethodInfo] = [](Reader& visitor)
- {
-
- return td_didRenameFiles::request::ReflectReader(visitor);
- };
-
- handler.method2request[td_willRenameFiles::request::kMethodInfo] = [](Reader& visitor)
- {
- return td_willRenameFiles::request::ReflectReader(visitor);
- };
+ handler.method2request[td_willRenameFiles::request::kMethodInfo] = [](Reader& visitor)
+ { return td_willRenameFiles::request::ReflectReader(visitor); };
}
-
lsp::ProtocolJsonHandler::ProtocolJsonHandler()
{
- AddStadardResponseJsonRpcMethod(*this);
- AddJavaExtentionResponseJsonRpcMethod(*this);
- AddNotifyJsonRpcMethod(*this);
- AddStandardRequestJsonRpcMethod(*this);
- AddRequstJsonRpcMethod(*this);
+ AddStadardResponseJsonRpcMethod(*this);
+ AddJavaExtentionResponseJsonRpcMethod(*this);
+ AddNotifyJsonRpcMethod(*this);
+ AddStandardRequestJsonRpcMethod(*this);
+ AddRequstJsonRpcMethod(*this);
}
diff --git a/graphics/asymptote/LspCpp/src/lsp/initialize.cpp b/graphics/asymptote/LspCpp/src/lsp/initialize.cpp
index 504caa3e65..82f68701ca 100644
--- a/graphics/asymptote/LspCpp/src/lsp/initialize.cpp
+++ b/graphics/asymptote/LspCpp/src/lsp/initialize.cpp
@@ -3,43 +3,49 @@
void Reflect(Reader& reader, lsInitializeParams::lsTrace& value)
{
- if (!reader.IsString())
- {
- value = lsInitializeParams::lsTrace::Off;
- return;
- }
- std::string v = reader.GetString();
- if (v == "off")
- value = lsInitializeParams::lsTrace::Off;
- else if (v == "messages")
- value = lsInitializeParams::lsTrace::Messages;
- else if (v == "verbose")
- value = lsInitializeParams::lsTrace::Verbose;
+ if (!reader.IsString())
+ {
+ value = lsInitializeParams::lsTrace::Off;
+ return;
+ }
+ std::string v = reader.GetString();
+ if (v == "off")
+ {
+ value = lsInitializeParams::lsTrace::Off;
+ }
+ else if (v == "messages")
+ {
+ value = lsInitializeParams::lsTrace::Messages;
+ }
+ else if (v == "verbose")
+ {
+ value = lsInitializeParams::lsTrace::Verbose;
+ }
}
void Reflect(Writer& writer, lsInitializeParams::lsTrace& value)
{
- switch (value)
- {
- case lsInitializeParams::lsTrace::Off:
- writer.String("off");
- break;
- case lsInitializeParams::lsTrace::Messages:
- writer.String("messages");
- break;
- case lsInitializeParams::lsTrace::Verbose:
- writer.String("verbose");
- break;
- }
+ switch (value)
+ {
+ case lsInitializeParams::lsTrace::Off:
+ writer.String("off");
+ break;
+ case lsInitializeParams::lsTrace::Messages:
+ writer.String("messages");
+ break;
+ case lsInitializeParams::lsTrace::Verbose:
+ writer.String("verbose");
+ break;
+ }
}
- void Reflect(Reader& visitor, std::pair<optional<lsTextDocumentSyncKind>, optional<lsTextDocumentSyncOptions> >& value)
+void Reflect(Reader& visitor, std::pair<optional<lsTextDocumentSyncKind>, optional<lsTextDocumentSyncOptions>>& value)
{
- if(((JsonReader&)visitor).m_->IsObject())
- {
- Reflect(visitor, value.second);
- }
- else
- {
- Reflect(visitor, value.first);
- }
+ if (((JsonReader&)visitor).m_->IsObject())
+ {
+ Reflect(visitor, value.second);
+ }
+ else
+ {
+ Reflect(visitor, value.first);
+ }
}
diff --git a/graphics/asymptote/LspCpp/src/lsp/lsp.cpp b/graphics/asymptote/LspCpp/src/lsp/lsp.cpp
index d070f22be1..964d1ba8cd 100644
--- a/graphics/asymptote/LspCpp/src/lsp/lsp.cpp
+++ b/graphics/asymptote/LspCpp/src/lsp/lsp.cpp
@@ -2,10 +2,8 @@
#include "LibLsp/lsp/lru_cache.h"
-
#include <rapidjson/writer.h>
-
#include <stdio.h>
#include <iostream>
#include "LibLsp/lsp/location_type.h"
@@ -25,6 +23,9 @@
#include "LibLsp/lsp/AbsolutePath.h"
#ifdef _WIN32
+#ifndef NOMINMAX
+#define NOMINMAX
+#endif
#include <Windows.h>
#else
#include <climits>
@@ -46,399 +47,415 @@
#include <boost/uuid/uuid_generators.hpp>
// namespace
-
-
-lsTextDocumentIdentifier
-lsVersionedTextDocumentIdentifier::AsTextDocumentIdentifier() const {
- lsTextDocumentIdentifier result;
- result.uri = uri;
- return result;
+lsTextDocumentIdentifier lsVersionedTextDocumentIdentifier::AsTextDocumentIdentifier() const
+{
+ lsTextDocumentIdentifier result;
+ result.uri = uri;
+ return result;
}
+lsPosition::lsPosition()
+{
+}
+lsPosition::lsPosition(int line, int character) : line(line), character(character)
+{
+}
-lsPosition::lsPosition() {}
-lsPosition::lsPosition(int line, int character)
- : line(line), character(character) {}
-
-bool lsPosition::operator==(const lsPosition& other) const {
- return line == other.line && character == other.character;
+bool lsPosition::operator==(lsPosition const& other) const
+{
+ return line == other.line && character == other.character;
}
-bool lsPosition::operator<(const lsPosition& other) const {
- return line != other.line ? line < other.line : character < other.character;
+bool lsPosition::operator<(lsPosition const& other) const
+{
+ return line != other.line ? line < other.line : character < other.character;
}
-std::string lsPosition::ToString() const {
- return std::to_string(line) + ":" + std::to_string(character);
+std::string lsPosition::ToString() const
+{
+ return std::to_string(line) + ":" + std::to_string(character);
}
-const lsPosition lsPosition::kZeroPosition = lsPosition();
+lsPosition const lsPosition::kZeroPosition = lsPosition();
-lsRange::lsRange() {}
-lsRange::lsRange(lsPosition start, lsPosition end) : start(start), end(end) {}
+lsRange::lsRange()
+{
+}
+lsRange::lsRange(lsPosition start, lsPosition end) : start(start), end(end)
+{
+}
-bool lsRange::operator==(const lsRange& o) const {
- return start == o.start && end == o.end;
+bool lsRange::operator==(lsRange const& o) const
+{
+ return start == o.start && end == o.end;
}
-bool lsRange::operator<(const lsRange& o) const {
- return !(start == o.start) ? start < o.start : end < o.end;
+bool lsRange::operator<(lsRange const& o) const
+{
+ return !(start == o.start) ? start < o.start : end < o.end;
}
std::string lsRange::ToString() const
{
- std::stringstream ss;
- ss << "start:" << start.ToString() << std::endl;
- ss << "end" << end.ToString() << std::endl;
- return ss.str();
+ std::stringstream ss;
+ ss << "start:" << start.ToString() << std::endl;
+ ss << "end" << end.ToString() << std::endl;
+ return ss.str();
}
-lsLocation::lsLocation() {}
-lsLocation::lsLocation(lsDocumentUri uri, lsRange range)
- : uri(uri), range(range) {}
-
-bool lsLocation::operator==(const lsLocation& o) const {
- return uri == o.uri && range == o.range;
+lsLocation::lsLocation()
+{
+}
+lsLocation::lsLocation(lsDocumentUri uri, lsRange range) : uri(uri), range(range)
+{
}
-bool lsLocation::operator<(const lsLocation& o) const {
- return std::make_tuple(uri.raw_uri_, range) <
- std::make_tuple(o.uri.raw_uri_, o.range);
+bool lsLocation::operator==(lsLocation const& o) const
+{
+ return uri == o.uri && range == o.range;
}
-bool lsTextEdit::operator==(const lsTextEdit& that) {
- return range == that.range && newText == that.newText;
+bool lsLocation::operator<(lsLocation const& o) const
+{
+ return std::make_tuple(uri.raw_uri_, range) < std::make_tuple(o.uri.raw_uri_, o.range);
}
-std::string lsTextEdit::ToString() const
+bool lsTextEdit::operator==(lsTextEdit const& that)
{
- std::stringstream ss;
- ss << "Range:" << range.ToString() << std::endl;
- ss << "newText:" << newText << std::endl;
- return ss.str();
+ return range == that.range && newText == that.newText;
}
-void Reflect(Writer& visitor, lsMarkedString& value) {
- // If there is a language, emit a `{language:string, value:string}` object. If
- // not, emit a string.
- if (value.language) {
- REFLECT_MEMBER_START();
- REFLECT_MEMBER(language);
- REFLECT_MEMBER(value);
- REFLECT_MEMBER_END();
- } else {
- Reflect(visitor, value.value);
- }
+std::string lsTextEdit::ToString() const
+{
+ std::stringstream ss;
+ ss << "Range:" << range.ToString() << std::endl;
+ ss << "newText:" << newText << std::endl;
+ return ss.str();
}
-void Reflect(Reader& visitor, lsMarkedString& value)
+void Reflect(Writer& visitor, lsMarkedString& value)
{
+ // If there is a language, emit a `{language:string, value:string}` object. If
+ // not, emit a string.
+ if (value.language)
+ {
REFLECT_MEMBER_START();
REFLECT_MEMBER(language);
REFLECT_MEMBER(value);
REFLECT_MEMBER_END();
+ }
+ else
+ {
+ Reflect(visitor, value.value);
+ }
}
- void Reflect(Reader& visitor, LocationListEither::Either& value)
+void Reflect(Reader& visitor, lsMarkedString& value)
{
- if(!visitor.IsArray())
- {
- throw std::invalid_argument("Rsp_LocationListEither::Either& value is not array");
- }
- auto data = ((JsonReader&)visitor).m_->GetArray();
- if (data.Size() && data[0].HasMember("originSelectionRange"))
- {
- Reflect(visitor, value.second);
- }
- else {
- Reflect(visitor, value.first);
- }
-
+ REFLECT_MEMBER_START();
+ REFLECT_MEMBER(language);
+ REFLECT_MEMBER(value);
+ REFLECT_MEMBER_END();
}
- void Reflect(Writer& visitor, LocationListEither::Either& value)
+void Reflect(Reader& visitor, LocationListEither::Either& value)
{
- if (value.first)
- {
- Reflect(visitor, value.first.value());
- }
- else if (value.second)
- {
- Reflect(visitor, value.second.value());
- }
+ if (!visitor.IsArray())
+ {
+ throw std::invalid_argument("Rsp_LocationListEither::Either& value is not array");
+ }
+ auto data = ((JsonReader&)visitor).m_->GetArray();
+ if (data.Size() && data[0].HasMember("originSelectionRange"))
+ {
+ Reflect(visitor, value.second);
+ }
+ else
+ {
+ Reflect(visitor, value.first);
+ }
+}
+
+void Reflect(Writer& visitor, LocationListEither::Either& value)
+{
+ if (value.first)
+ {
+ Reflect(visitor, value.first.value());
+ }
+ else if (value.second)
+ {
+ Reflect(visitor, value.second.value());
+ }
}
-
void Reflect(Reader& visitor, TextDocumentCodeAction::Either& value)
{
-
- if(visitor.HasMember("command"))
+ if (visitor.HasMember("command"))
+ {
+ if (visitor["command"]->IsString())
{
- if(visitor["command"]->IsString())
- {
- Reflect(visitor, value.first);
- }
- else
- {
- Reflect(visitor, value.second);
- }
+ Reflect(visitor, value.first);
}
else
{
- if (visitor.HasMember("diagnostics") || visitor.HasMember("edit"))
- {
- Reflect(visitor, value.second);
- }
- else
- {
- Reflect(visitor, value.first);
- }
+ Reflect(visitor, value.second);
}
-
-}
-
-
-void Reflect(Reader& visitor, lsWorkspaceEdit::Either& value)
-{
-
-
- if(visitor.HasMember("textDocument"))
+ }
+ else
+ {
+ if (visitor.HasMember("diagnostics") || visitor.HasMember("edit"))
{
- Reflect(visitor, value.first);
+ Reflect(visitor, value.second);
}
else
{
- Reflect(visitor, value.second);
+ Reflect(visitor, value.first);
}
+ }
+}
+
+void Reflect(Reader& visitor, lsWorkspaceEdit::Either& value)
+{
+
+ if (visitor.HasMember("textDocument"))
+ {
+ Reflect(visitor, value.first);
+ }
+ else
+ {
+ Reflect(visitor, value.second);
+ }
}
ResourceOperation* GetResourceOperation(lsp::Any& lspAny)
{
- rapidjson::Document document;
- auto& data = lspAny.Data();
- document.Parse(data.c_str(), data.length());
- if (document.HasParseError()) {
- // ��ʾ
- return nullptr;
- }
- auto find = document.FindMember("kind");
+ rapidjson::Document document;
+ auto& data = lspAny.Data();
+ document.Parse(data.c_str(), data.length());
+ if (document.HasParseError())
+ {
+ // ��ʾ
+ return nullptr;
+ }
+ auto find = document.FindMember("kind");
- JsonReader visitor{ &document };
- try
+ JsonReader visitor {&document};
+ try
+ {
+ if (find->value == "create")
{
- if (find->value == "create")
- {
- auto ptr = std::make_unique<lsCreateFile>();
- auto temp = ptr.get();
- Reflect(visitor, *temp);
- return ptr.release();
- }
- else if (find->value == "rename")
- {
- auto ptr = std::make_unique<lsRenameFile>();
- auto temp = ptr.get();
- Reflect(visitor, *temp);
- return ptr.release();
- }
- else if (find->value == "delete")
- {
-
- auto ptr = std::make_unique<lsDeleteFile>();
- auto temp = ptr.get();
- Reflect(visitor, *temp);
- return ptr.release();
- }
+ auto ptr = std::make_unique<lsCreateFile>();
+ auto temp = ptr.get();
+ Reflect(visitor, *temp);
+ return ptr.release();
}
- catch (std::exception&)
+ else if (find->value == "rename")
+ {
+ auto ptr = std::make_unique<lsRenameFile>();
+ auto temp = ptr.get();
+ Reflect(visitor, *temp);
+ return ptr.release();
+ }
+ else if (find->value == "delete")
{
+ auto ptr = std::make_unique<lsDeleteFile>();
+ auto temp = ptr.get();
+ Reflect(visitor, *temp);
+ return ptr.release();
}
- return nullptr;
+ }
+ catch (std::exception&)
+ {
+ }
+ return nullptr;
}
- void Reflect(Writer& visitor, ResourceOperation* value)
+void Reflect(Writer& visitor, ResourceOperation* value)
{
- if(!value)
+ if (!value)
+ {
+ throw std::invalid_argument("ResourceOperation value is nullptr");
+ }
+ if (value->kind == "create")
+ {
+ auto temp = (lsCreateFile*)value;
+ Reflect(visitor, *temp);
+ }
+ else if (value->kind == "rename")
+ {
+ auto temp = (lsRenameFile*)value;
+ Reflect(visitor, *temp);
+ }
+ else if (value->kind == "delete")
+ {
+
+ auto temp = (lsDeleteFile*)value;
+ Reflect(visitor, *temp);
+ }
+}
+
+int lsp::Any::GuessType()
+{
+ if (!data.empty())
+ {
+ if (data == "null")
{
- throw std::invalid_argument("ResourceOperation value is nullptr");
+ jsonType = rapidjson::kNullType;
}
- if (value->kind == "create")
+ else if (data == "true")
{
- auto temp = (lsCreateFile*)value;
- Reflect(visitor, *temp);
+ jsonType = rapidjson::kTrueType;
}
- else if (value->kind == "rename")
+ else if (data == "false")
{
- auto temp = (lsRenameFile*)value;
- Reflect(visitor, *temp);
+ jsonType = rapidjson::kFalseType;
}
- else if (value->kind == "delete")
+ else if (data[0] == '{')
{
-
- auto temp = (lsDeleteFile*)value;
- Reflect(visitor, *temp);
+ jsonType = rapidjson::kObjectType;
}
-
-}
-
-int lsp::Any::GuessType()
-{
- if (!data.empty())
+ else if (data[0] == '[')
{
- if (data == "null")
- {
- jsonType = rapidjson::kNullType;
- }
- else if (data == "true")
- {
- jsonType = rapidjson::kTrueType;
- }
- else if(data == "false")
- {
- jsonType = rapidjson::kFalseType;
- }
- else if (data[0] == '{')
- {
- jsonType = rapidjson::kObjectType;
- }
- else if (data[0] == '[')
- {
- if (data.size() >= 2 && data[1] == '{')
- jsonType = rapidjson::kStringType;
- else
- jsonType = rapidjson::kArrayType;
- }
- else if (data[0] == '"')
- {
- jsonType = rapidjson::kStringType;
- }
- else
- {
- jsonType = rapidjson::kNumberType;
- }
+ if (data.size() >= 2 && data[1] == '{')
+ {
+ jsonType = rapidjson::kStringType;
+ }
+ else
+ {
+ jsonType = rapidjson::kArrayType;
+ }
+ }
+ else if (data[0] == '"')
+ {
+ jsonType = rapidjson::kStringType;
}
else
{
- if (jsonType != kUnKnown)
- return jsonType;
- jsonType = rapidjson::kNullType;
+ jsonType = rapidjson::kNumberType;
}
- return jsonType;
+ }
+ else
+ {
+ if (jsonType != kUnKnown)
+ {
+ return jsonType;
+ }
+ jsonType = rapidjson::kNullType;
+ }
+ return jsonType;
}
int lsp::Any::GetType()
{
- if (jsonType == Type::kUnKnown)
+ if (jsonType == Type::kUnKnown)
+ {
+ if (data.empty())
{
- if (data.empty())
- {
- jsonType = rapidjson::kNullType;
- return jsonType;
- }
- rapidjson::Document document;
- document.Parse(data.c_str(), data.length());
- if (document.HasParseError())
- {
- // ��ʾ
- return jsonType;
- }
- jsonType = document.GetType();
+ jsonType = rapidjson::kNullType;
+ return jsonType;
}
- return jsonType;
+ rapidjson::Document document;
+ document.Parse(data.c_str(), data.length());
+ if (document.HasParseError())
+ {
+ // ��ʾ
+ return jsonType;
+ }
+ jsonType = document.GetType();
+ }
+ return jsonType;
}
void lsp::Any::Set(std::unique_ptr<LspMessage> value)
{
- if (value)
- {
- jsonType = rapidjson::Type::kObjectType;
- data = value->ToJson();
- }
- else
- {
- assert(false);
- }
+ if (value)
+ {
+ jsonType = rapidjson::Type::kObjectType;
+ data = value->ToJson();
+ }
+ else
+ {
+ assert(false);
+ }
}
void lsp::Any::SetJsonString(std::string&& _data, Type _type)
{
- jsonType = _type;
- data.swap(_data);
- GetType();
+ jsonType = _type;
+ data.swap(_data);
+ GetType();
}
-void lsp::Any::SetJsonString(const std::string& _data, Type _type)
+void lsp::Any::SetJsonString(std::string const& _data, Type _type)
{
- jsonType = _type;
- data = (_data);
- GetType();
+ jsonType = _type;
+ data = (_data);
+ GetType();
}
void lsp::Any::swap(Any& arg) noexcept
{
- data.swap(arg.data);
- const int temp = jsonType;
- jsonType = arg.jsonType;
- arg.jsonType = temp;
+ data.swap(arg.data);
+ int const temp = jsonType;
+ jsonType = arg.jsonType;
+ arg.jsonType = temp;
}
-class JsonReaderForAny : public JsonReader
+class JsonReaderForAny : public JsonReader
{
public:
- JsonReaderForAny()
- : JsonReader(&document)
- {
- }
- rapidjson::Document document;
+ JsonReaderForAny() : JsonReader(&document)
+ {
+ }
+ rapidjson::Document document;
};
bool lsp::Any::GetForMapHelper(std::string& value)
{
- return Get(value);
+ return Get(value);
}
bool lsp::Any::GetForMapHelper(optional<std::string>& value)
{
- return Get(value);
+ return Get(value);
}
std::unique_ptr<Reader> lsp::Any::GetReader()
{
- auto reader = new JsonReaderForAny();
- std::unique_ptr<Reader> ret(reader);
- reader->document.Parse(data.c_str(), data.length());
- if (reader->document.HasParseError())
- {
- return {};
- }
- if (jsonType == kUnKnown)
- {
- jsonType = reader->document.GetType();
- }
- return (ret);
+ auto reader = new JsonReaderForAny();
+ std::unique_ptr<Reader> ret(reader);
+ reader->document.Parse(data.c_str(), data.length());
+ if (reader->document.HasParseError())
+ {
+ return {};
+ }
+ if (jsonType == kUnKnown)
+ {
+ jsonType = reader->document.GetType();
+ }
+ return (ret);
}
class JsonWriterForAny : public JsonWriter
{
public:
- rapidjson::StringBuffer output;
- rapidjson::Writer<rapidjson::StringBuffer> writer;
- JsonWriterForAny():JsonWriter(&writer), writer(output)
- {
-
- }
+ rapidjson::StringBuffer output;
+ rapidjson::Writer<rapidjson::StringBuffer> writer;
+ JsonWriterForAny() : JsonWriter(&writer), writer(output)
+ {
+ }
};
std::unique_ptr<Writer> lsp::Any::GetWriter() const
{
- return std::make_unique<JsonWriterForAny>();
+ return std::make_unique<JsonWriterForAny>();
}
void lsp::Any::SetData(std::unique_ptr<Writer>& writer)
{
- auto _temp = static_cast<JsonWriterForAny*>(writer.get());
- data = _temp->output.GetString();
- GuessType();
+ auto _temp = static_cast<JsonWriterForAny*>(writer.get());
+ data = _temp->output.GetString();
+ GuessType();
}
namespace
@@ -467,219 +484,222 @@ namespace
}
}
#endif
- lsp::Any::Type convert(rapidjson::Type type)
- {
- switch (type)
- {
- case rapidjson::Type::kNullType:
- return lsp::Any::Type::kNullType;
- case rapidjson::Type::kFalseType:
- return lsp::Any::Type::kFalseType;
- case rapidjson::Type::kTrueType:
- return lsp::Any::Type::kTrueType;
- case rapidjson::Type::kObjectType:
- return lsp::Any::Type::kObjectType;
- case rapidjson::Type::kArrayType:
- return lsp::Any::Type::kArrayType;
- case rapidjson::Type::kStringType:
- return lsp::Any::Type::kStringType;
- case rapidjson::Type::kNumberType:
- return lsp::Any::Type::kNumberType;
- default:
- return lsp::Any::Type::kNullType;
- }
- }
-}
+lsp::Any::Type convert(rapidjson::Type type)
+{
+ switch (type)
+ {
+ case rapidjson::Type::kNullType:
+ return lsp::Any::Type::kNullType;
+ case rapidjson::Type::kFalseType:
+ return lsp::Any::Type::kFalseType;
+ case rapidjson::Type::kTrueType:
+ return lsp::Any::Type::kTrueType;
+ case rapidjson::Type::kObjectType:
+ return lsp::Any::Type::kObjectType;
+ case rapidjson::Type::kArrayType:
+ return lsp::Any::Type::kArrayType;
+ case rapidjson::Type::kStringType:
+ return lsp::Any::Type::kStringType;
+ case rapidjson::Type::kNumberType:
+ return lsp::Any::Type::kNumberType;
+ default:
+ return lsp::Any::Type::kNullType;
+ }
+}
+} // namespace
void Reflect(Reader& visitor, lsp::Any& value)
{
- //if (visitor.IsNull()) {
- // visitor.GetNull();
- // value.SetJsonString("", rapidjson::Type::kNullType);
- // return;
- //}else
- //{
- //
- //}
- JsonReader& json_reader = reinterpret_cast<JsonReader&>(visitor);
- value.SetJsonString(visitor.ToString(), convert(json_reader.m_->GetType()));
-}
- void Reflect(Writer& visitor, lsp::Any& value)
- {
- JsonWriter& json_writer = reinterpret_cast<JsonWriter&>(visitor);
- json_writer.m_->RawValue( value.Data().data(),value.Data().size(),static_cast<rapidjson::Type>(value.GetType()));
-
- }
- void Reflect(Reader& visitor, lsFormattingOptions::KeyData& value)
-{
- if (visitor.IsBool())
- {
- Reflect(visitor, value._boolean);
- }
- else if (visitor.IsInt() || visitor.IsInt64() || visitor.IsUint64())
- {
- Reflect(visitor, value._integer);
- }
- else if(visitor.IsString())
- {
- Reflect(visitor, value._string);
- }
-}
- void Reflect(Writer& visitor, lsFormattingOptions::KeyData& value)
-{
- if (value._boolean.has_value())
- {
- Reflect(visitor, value._boolean);
- }
- else if (value._integer.has_value())
- {
- Reflect(visitor, value._integer);
- }
- else if (value._string.has_value())
- {
- Reflect(visitor, value._string);
- }
+ //if (visitor.IsNull()) {
+ // visitor.GetNull();
+ // value.SetJsonString("", rapidjson::Type::kNullType);
+ // return;
+ //}else
+ //{
+ //
+ //}
+ JsonReader& json_reader = reinterpret_cast<JsonReader&>(visitor);
+ value.SetJsonString(visitor.ToString(), convert(json_reader.m_->GetType()));
+}
+void Reflect(Writer& visitor, lsp::Any& value)
+{
+ JsonWriter& json_writer = reinterpret_cast<JsonWriter&>(visitor);
+ json_writer.m_->RawValue(value.Data().data(), value.Data().size(), static_cast<rapidjson::Type>(value.GetType()));
+}
+void Reflect(Reader& visitor, lsFormattingOptions::KeyData& value)
+{
+ if (visitor.IsBool())
+ {
+ Reflect(visitor, value._boolean);
+ }
+ else if (visitor.IsInt() || visitor.IsInt64() || visitor.IsUint64())
+ {
+ Reflect(visitor, value._integer);
+ }
+ else if (visitor.IsString())
+ {
+ Reflect(visitor, value._string);
+ }
+}
+void Reflect(Writer& visitor, lsFormattingOptions::KeyData& value)
+{
+ if (value._boolean.has_value())
+ {
+ Reflect(visitor, value._boolean);
+ }
+ else if (value._integer.has_value())
+ {
+ Reflect(visitor, value._integer);
+ }
+ else if (value._string.has_value())
+ {
+ Reflect(visitor, value._string);
+ }
}
lsCreateFile::lsCreateFile()
{
- kind = "create";
+ kind = "create";
}
lsDeleteFile::lsDeleteFile()
{
- kind = "delete";
+ kind = "delete";
}
lsRenameFile::lsRenameFile()
{
- kind = "rename";
+ kind = "rename";
}
-
-void Reflect(Reader& visitor, optional< SelectionRange* >& value)
+void Reflect(Reader& visitor, optional<SelectionRange*>& value)
{
- if (visitor.IsNull()) {
- visitor.GetNull();
- return;
- }
+ if (visitor.IsNull())
+ {
+ visitor.GetNull();
+ return;
+ }
- SelectionRange* entry_value = nullptr;
+ SelectionRange* entry_value = nullptr;
+ std::unique_ptr<SelectionRange> ptr = std::make_unique<SelectionRange>();
+ SelectionRange* temp = ptr.get();
+ Reflect(visitor, *temp);
- std::unique_ptr<SelectionRange> ptr = std::make_unique<SelectionRange>();
- SelectionRange* temp = ptr.get();
- Reflect(visitor, *temp);
-
- entry_value = ptr.release();
- value = (entry_value);
-
+ entry_value = ptr.release();
+ value = (entry_value);
}
void Reflect(Writer& visitor, SelectionRange* value)
{
- if (!value)
- {
- throw std::invalid_argument("ResourceOperation value is nullptr");
- }
-
- Reflect(visitor, *value);
-
+ if (!value)
+ {
+ throw std::invalid_argument("ResourceOperation value is nullptr");
+ }
+ Reflect(visitor, *value);
}
- std::string make_file_scheme_uri(const std::string& absolute_path)
+std::string make_file_scheme_uri(std::string const& absolute_path)
{
- network::uri_builder builder;
- builder.scheme("file");
- builder.host("");
- builder.path(absolute_path);
- return builder.uri().string();
- //// lsDocumentUri uri;
- //// uri.SetPath(absolute_path);
- /// return uri.raw_uri_;
+ network::uri_builder builder;
+ builder.scheme("file");
+ builder.host("");
+ builder.path(absolute_path);
+ return builder.uri().string();
+ //// lsDocumentUri uri;
+ //// uri.SetPath(absolute_path);
+ /// return uri.raw_uri_;
}
// static
-AbsolutePath AbsolutePath::BuildDoNotUse(const std::string& path) {
- AbsolutePath p;
- p.path = std::string(path);
- return p;
+AbsolutePath AbsolutePath::BuildDoNotUse(std::string const& path)
+{
+ AbsolutePath p;
+ p.path = std::string(path);
+ return p;
}
+AbsolutePath::AbsolutePath()
+{
+}
-AbsolutePath::AbsolutePath() {}
-
-
-
-AbsolutePath::operator std::string() const {
- return path;
+AbsolutePath::operator std::string() const
+{
+ return path;
}
-bool AbsolutePath::operator==(const AbsolutePath& rhs) const {
- return path == rhs.path;
+bool AbsolutePath::operator==(AbsolutePath const& rhs) const
+{
+ return path == rhs.path;
}
-bool AbsolutePath::operator!=(const AbsolutePath& rhs) const {
- return path != rhs.path;
+bool AbsolutePath::operator!=(AbsolutePath const& rhs) const
+{
+ return path != rhs.path;
}
-bool AbsolutePath::operator<(const AbsolutePath& rhs) const
+bool AbsolutePath::operator<(AbsolutePath const& rhs) const
{
- return path < rhs.path;
+ return path < rhs.path;
}
-bool AbsolutePath::operator>(const AbsolutePath& rhs) const
+bool AbsolutePath::operator>(AbsolutePath const& rhs) const
{
- return path > rhs.path;
+ return path > rhs.path;
}
-void Reflect(Reader& visitor, AbsolutePath& value) {
- value.path = visitor.GetString();
+void Reflect(Reader& visitor, AbsolutePath& value)
+{
+ value.path = visitor.GetString();
}
-void Reflect(Writer& visitor, AbsolutePath& value) {
- visitor.String(value.path.c_str(), value.path.length());
+void Reflect(Writer& visitor, AbsolutePath& value)
+{
+ visitor.String(value.path.c_str(), value.path.length());
}
-std::ostream& operator<<(std::ostream& out, const AbsolutePath& path) {
- out << path.path;
- return out;
+std::ostream& operator<<(std::ostream& out, AbsolutePath const& path)
+{
+ out << path.path;
+ return out;
}
-lsDocumentUri lsDocumentUri::FromPath(const AbsolutePath& path) {
- lsDocumentUri result;
- result.SetPath(path);
- return result;
+lsDocumentUri lsDocumentUri::FromPath(AbsolutePath const& path)
+{
+ lsDocumentUri result;
+ result.SetPath(path);
+ return result;
}
//void lsDocumentUri::SetPath(const AbsolutePath& path)
//{
// raw_uri_ = make_file_scheme_uri(path.path);
//}
//
-void lsDocumentUri::SetPath(const AbsolutePath& path) {
- // file:///c%3A/Users/jacob/Desktop/superindex/indexer/full_tests
- raw_uri_ = path;
-
- size_t index = raw_uri_.find(":");
- if (index == 1) { // widows drive letters must always be 1 char
- raw_uri_.replace(raw_uri_.begin() + index, raw_uri_.begin() + index + 1,
- "%3A");
- }
+void lsDocumentUri::SetPath(AbsolutePath const& path)
+{
+ // file:///c%3A/Users/jacob/Desktop/superindex/indexer/full_tests
+ raw_uri_ = path;
+
+ size_t index = raw_uri_.find(":");
+ if (index == 1)
+ { // widows drive letters must always be 1 char
+ raw_uri_.replace(raw_uri_.begin() + index, raw_uri_.begin() + index + 1, "%3A");
+ }
- // subset of reserved characters from the URI standard
- // http://www.ecma-international.org/ecma-262/6.0/#sec-uri-syntax-and-semantics
- std::string t;
- t.reserve(8 + raw_uri_.size());
+ // subset of reserved characters from the URI standard
+ // http://www.ecma-international.org/ecma-262/6.0/#sec-uri-syntax-and-semantics
+ std::string t;
+ t.reserve(8 + raw_uri_.size());
- // TODO: proper fix
+ // TODO: proper fix
#if defined(_WIN32)
- t += "file:///";
+ t += "file:///";
#else
- t += "file://";
+ t += "file://";
#endif
- // clang-format off
+ // clang-format off
for (char c : raw_uri_)
switch (c) {
case ' ': t += "%20"; break;
@@ -695,330 +715,379 @@ void lsDocumentUri::SetPath(const AbsolutePath& path) {
case '@': t += "%40"; break;
default: t += c; break;
}
- // clang-format on
- raw_uri_ = std::move(t);
+ // clang-format on
+ raw_uri_ = std::move(t);
}
-std::string lsDocumentUri::GetRawPath() const {
-
-
- if (raw_uri_.compare(0, 8, "file:///"))
- return raw_uri_;
+std::string lsDocumentUri::GetRawPath() const
+{
+ if (raw_uri_.compare(0, 8, "file:///"))
+ {
+ return raw_uri_;
+ }
- std::string ret;
+ std::string ret;
#if defined(_WIN32)
- size_t i = 8;
+ size_t i = 8;
#else
- size_t i = 7;
+ size_t i = 7;
#endif
- auto from_hex = [](unsigned char c) {
- return c - '0' < 10 ? c - '0' : (c | 32) - 'a' + 10;
- };
- for (; i < raw_uri_.size(); i++) {
- if (i + 3 <= raw_uri_.size() && raw_uri_[i] == '%') {
- ret.push_back(from_hex(raw_uri_[i + 1]) * 16 + from_hex(raw_uri_[i + 2]));
- i += 2;
- }
- else
- ret.push_back(raw_uri_[i] == '\\' ? '/' : raw_uri_[i]);
+ auto from_hex = [](unsigned char const& c) -> unsigned int
+ {
+ unsigned char c_from_zero_char = c - '0';
+ return c_from_zero_char < 10 ? c_from_zero_char : (c | 32) - 'a' + 10;
+ };
+ for (; i < raw_uri_.size(); i++)
+ {
+ if (i + 3 <= raw_uri_.size() && raw_uri_[i] == '%')
+ {
+ ret.push_back(static_cast<char>(from_hex(raw_uri_[i + 1]) * 16 + from_hex(raw_uri_[i + 2])));
+ i += 2;
+ }
+ else
+ {
+ ret.push_back(raw_uri_[i] == '\\' ? '/' : raw_uri_[i]);
}
- return ret;
+ }
+ return ret;
}
-lsDocumentUri::lsDocumentUri() {}
-
-
-lsDocumentUri::lsDocumentUri(const AbsolutePath& path)
+lsDocumentUri::lsDocumentUri()
{
- SetPath(path);
}
-lsDocumentUri::lsDocumentUri(const lsDocumentUri& other): raw_uri_(other.raw_uri_)
+lsDocumentUri::lsDocumentUri(AbsolutePath const& path)
{
+ SetPath(path);
}
-bool lsDocumentUri::operator==(const lsDocumentUri& other) const {
- return raw_uri_ == other.raw_uri_;
+lsDocumentUri::lsDocumentUri(lsDocumentUri const& other) : raw_uri_(other.raw_uri_)
+{
}
-bool lsDocumentUri::operator==(const std::string& other) const
+bool lsDocumentUri::operator==(lsDocumentUri const& other) const
{
- return raw_uri_ == other;
+ return raw_uri_ == other.raw_uri_;
}
+bool lsDocumentUri::operator==(std::string const& other) const
+{
+ return raw_uri_ == other;
+}
-AbsolutePath lsDocumentUri::GetAbsolutePath() const {
-
-
- if (raw_uri_.find("file://") != std::string::npos){
- try
- {
- return lsp::NormalizePath(GetRawPath(), false /*ensure_exists*/, false);
- }
- catch (std::exception&)
- {
- return AbsolutePath("", false);
- }
- }
+AbsolutePath lsDocumentUri::GetAbsolutePath() const
+{
- return AbsolutePath(raw_uri_,false);
+ if (raw_uri_.find("file://") != std::string::npos)
+ {
+ try
+ {
+ return lsp::NormalizePath(GetRawPath(), false /*ensure_exists*/, false);
+ }
+ catch (std::exception&)
+ {
+ return AbsolutePath("", false);
+ }
+ }
+ return AbsolutePath(raw_uri_, false);
}
-AbsolutePath::AbsolutePath(const std::string& path, bool validate)
- : path(path) {
- // TODO: enable validation after fixing tests.
- if (validate && !lsp::IsAbsolutePath(path)) {
- qualify = false;
- auto temp = lsp::NormalizePath(path,false);
- if(!temp.path.empty())
- {
- this->path = temp.path;
- }
+AbsolutePath::AbsolutePath(std::string const& path, bool validate) : path(path)
+{
+ // TODO: enable validation after fixing tests.
+ if (validate && !lsp::IsAbsolutePath(path))
+ {
+ qualify = false;
+ auto temp = lsp::NormalizePath(path, false);
+ if (!temp.path.empty())
+ {
+ this->path = temp.path;
}
+ }
}
-void Reflect(Writer& visitor, lsDocumentUri& value) {
- Reflect(visitor, value.raw_uri_);
+void Reflect(Writer& visitor, lsDocumentUri& value)
+{
+ Reflect(visitor, value.raw_uri_);
}
-void Reflect(Reader& visitor, lsDocumentUri& value) {
- Reflect(visitor, value.raw_uri_);
- // Only record the path when we deserialize a URI, since it most likely came
- // from the client.
-
+void Reflect(Reader& visitor, lsDocumentUri& value)
+{
+ Reflect(visitor, value.raw_uri_);
+ // Only record the path when we deserialize a URI, since it most likely came
+ // from the client.
}
- std::string ProgressReport::ToString() const
+std::string ProgressReport::ToString() const
{
- std::string info;
- info += "id:" + id + "\n";
- info += "task:" + task + "\n";
- info += "subTask:" + subTask + "\n";
- info += "status:" + status + "\n";
- {
- std::stringstream ss;
- ss << "totalWork:" << totalWork << std::endl;
- info += ss.str();
- }
- {
- std::stringstream ss;
- ss << "workDone:" << workDone << std::endl;
- info += ss.str();
- }
+ std::string info;
+ info += "id:" + id + "\n";
+ info += "task:" + task + "\n";
+ info += "subTask:" + subTask + "\n";
+ info += "status:" + status + "\n";
+ {
+ std::stringstream ss;
+ ss << "totalWork:" << totalWork << std::endl;
+ info += ss.str();
+ }
+ {
+ std::stringstream ss;
+ ss << "workDone:" << workDone << std::endl;
+ info += ss.str();
+ }
- {
- std::stringstream ss;
- ss << "complete:" << complete << std::endl;
- info += ss.str();
- }
+ {
+ std::stringstream ss;
+ ss << "complete:" << complete << std::endl;
+ info += ss.str();
+ }
- return info;
+ return info;
}
std::string EventNotification::ToString() const
{
- std::string info;
- if (ClasspathUpdated == eventType)
- {
- info += "eventType:ClasspathUpdated\n";
- }
- else if (ProjectsImported == eventType)
- {
- info += "eventType:ProjectsImported\n";
- }
- else
- {
- std::ostringstream oss;
- oss << std::hex << eventType << std::endl;
-
- info += "eventType:";
- info += oss.str();
- }
- info += "data:" + data.Data() + "\n";
- return info;
+ std::string info;
+ if (ClasspathUpdated == eventType)
+ {
+ info += "eventType:ClasspathUpdated\n";
+ }
+ else if (ProjectsImported == eventType)
+ {
+ info += "eventType:ProjectsImported\n";
+ }
+ else
+ {
+ std::ostringstream oss;
+ oss << std::hex << eventType << std::endl;
+
+ info += "eventType:";
+ info += oss.str();
+ }
+ info += "data:" + data.Data() + "\n";
+ return info;
}
std::string lsp::ToString(lsCompletionItemKind _kind)
{
- switch (_kind) {
- case lsCompletionItemKind::Text:
- return "Text";
- case lsCompletionItemKind::Method:
- return "Method";
- case lsCompletionItemKind::Function:
- return "";
- case lsCompletionItemKind::Constructor:
- return "Function";
- case lsCompletionItemKind::Field:
- return "Field";
- case lsCompletionItemKind::Variable:
- return "";
- case lsCompletionItemKind::Class:
- return "Variable";
- case lsCompletionItemKind::Interface:
- return "Interface";
- case lsCompletionItemKind::Module:
- return "Module";
- case lsCompletionItemKind::Property:
- return "Property";
- case lsCompletionItemKind::Unit:
- return "Unit";
- case lsCompletionItemKind::Value:
- return "Value";
- case lsCompletionItemKind::Enum:
- return "Enum";
- case lsCompletionItemKind::Keyword:
- return "Keyword";
- case lsCompletionItemKind::Snippet:
- return "Snippet";
- case lsCompletionItemKind::Color:
- return "Color";
- case lsCompletionItemKind::File:
- return "File";
- case lsCompletionItemKind::Reference:
- return "Reference";
- case lsCompletionItemKind::Folder:
- return "Folder";
- case lsCompletionItemKind::EnumMember:
- return "EnumMember";
- case lsCompletionItemKind::Constant:
- return "Constant";
- case lsCompletionItemKind::Struct:
- return "Struct";
- case lsCompletionItemKind::Event:
- return "Event";
- case lsCompletionItemKind::Operator:
- return "Operator";
- case lsCompletionItemKind::TypeParameter:
- return "TypeParameter";
- default:
- return "Unknown";
- }
+ switch (_kind)
+ {
+ case lsCompletionItemKind::Text:
+ return "Text";
+ case lsCompletionItemKind::Method:
+ return "Method";
+ case lsCompletionItemKind::Function:
+ return "";
+ case lsCompletionItemKind::Constructor:
+ return "Function";
+ case lsCompletionItemKind::Field:
+ return "Field";
+ case lsCompletionItemKind::Variable:
+ return "";
+ case lsCompletionItemKind::Class:
+ return "Variable";
+ case lsCompletionItemKind::Interface:
+ return "Interface";
+ case lsCompletionItemKind::Module:
+ return "Module";
+ case lsCompletionItemKind::Property:
+ return "Property";
+ case lsCompletionItemKind::Unit:
+ return "Unit";
+ case lsCompletionItemKind::Value:
+ return "Value";
+ case lsCompletionItemKind::Enum:
+ return "Enum";
+ case lsCompletionItemKind::Keyword:
+ return "Keyword";
+ case lsCompletionItemKind::Snippet:
+ return "Snippet";
+ case lsCompletionItemKind::Color:
+ return "Color";
+ case lsCompletionItemKind::File:
+ return "File";
+ case lsCompletionItemKind::Reference:
+ return "Reference";
+ case lsCompletionItemKind::Folder:
+ return "Folder";
+ case lsCompletionItemKind::EnumMember:
+ return "EnumMember";
+ case lsCompletionItemKind::Constant:
+ return "Constant";
+ case lsCompletionItemKind::Struct:
+ return "Struct";
+ case lsCompletionItemKind::Event:
+ return "Event";
+ case lsCompletionItemKind::Operator:
+ return "Operator";
+ case lsCompletionItemKind::TypeParameter:
+ return "TypeParameter";
+ default:
+ return "Unknown";
+ }
}
std::string lsp::ToString(lsInsertTextFormat _kind)
{
- if (_kind == lsInsertTextFormat::PlainText)
- {
- return "PlainText";
- }
- else if (_kind == lsInsertTextFormat::Snippet)
- {
- return "Snippet";
- }else
- {
- return "Unknown";
- }
-}
-
-const std::string& lsCompletionItem::InsertedContent() const
+ if (_kind == lsInsertTextFormat::PlainText)
+ {
+ return "PlainText";
+ }
+ else if (_kind == lsInsertTextFormat::Snippet)
+ {
+ return "Snippet";
+ }
+ else
+ {
+ return "Unknown";
+ }
+}
+
+std::string const& lsCompletionItem::InsertedContent() const
{
- if (textEdit)
- return textEdit->newText;
- if (insertText.has_value() && !insertText->empty())
- return insertText.value();
- return label;
+ if (textEdit)
+ {
+ return textEdit->newText;
+ }
+ if (insertText.has_value() && !insertText->empty())
+ {
+ return insertText.value();
+ }
+ return label;
}
std::string lsCompletionItem::DisplayText()
{
- if (detail)
- {
+ if (detail)
+ {
- return label + " in " + detail.value();
- }
- return label;
+ return label + " in " + detail.value();
+ }
+ return label;
}
std::string lsCompletionItem::ToString()
- {
- std::stringstream info;
- info << "label : " << label << std::endl;
- if(kind)
- info << "kind : " << lsp::ToString(kind.value()) << std::endl;
- else
- info << "kind : no exist." << std::endl;
-
- if (detail)
- info << "detail : " << detail.value() << std::endl;
- else
- info << "detail : no exist." << std::endl;
-
- if (documentation)
- {
- info << "documentation : " << std::endl;
- if(documentation.value().first)
- {
- info << documentation.value().first.value();
- }
- else if(documentation.value().second)
- {
- info << documentation.value().second.value().value;
- }
- }
- else
- info << "documentation : no exist." << std::endl;
-
- if (deprecated)
- info << "deprecated : " << deprecated.value() << std::endl;
- else
- info << "deprecated : no exist." << std::endl;
-
- if (preselect)
- info << "preselect : " << preselect.value() << std::endl;
- else
- info << "preselect : no exist." << std::endl;
-
- if (sortText)
- info << "sortText : " << sortText.value() << std::endl;
- else
- info << "sortText : no exist." << std::endl;
-
- if (filterText)
- info << "filterText : " << filterText.value() << std::endl;
- else
- info << "filterText : no exist." << std::endl;
-
-
- if (insertText)
- info << "insertText : " << insertText.value() << std::endl;
- else
- info << "insertText : no exist." << std::endl;
-
-
- if (insertTextFormat)
- info << "insertText : " << lsp::ToString(insertTextFormat.value()) << std::endl;
- else
- info << "insertTextFormat : no exist." << std::endl;
-
- if (textEdit)
- info << "textEdit : " << textEdit.value().ToString() << std::endl;
- else
- info << "textEdit : no exist." << std::endl;
-
-
-
- return info.str();
-
- }
-namespace JDT
-{
- namespace CodeActionKind {
-
-
- /**
+{
+ std::stringstream info;
+ info << "label : " << label << std::endl;
+ if (kind)
+ {
+ info << "kind : " << lsp::ToString(kind.value()) << std::endl;
+ }
+ else
+ {
+ info << "kind : no exist." << std::endl;
+ }
+
+ if (detail)
+ {
+ info << "detail : " << detail.value() << std::endl;
+ }
+ else
+ {
+ info << "detail : no exist." << std::endl;
+ }
+
+ if (documentation)
+ {
+ info << "documentation : " << std::endl;
+ if (documentation.value().first)
+ {
+ info << documentation.value().first.value();
+ }
+ else if (documentation.value().second)
+ {
+ info << documentation.value().second.value().value;
+ }
+ }
+ else
+ {
+ info << "documentation : no exist." << std::endl;
+ }
+
+ if (deprecated)
+ {
+ info << "deprecated : " << deprecated.value() << std::endl;
+ }
+ else
+ {
+ info << "deprecated : no exist." << std::endl;
+ }
+
+ if (preselect)
+ {
+ info << "preselect : " << preselect.value() << std::endl;
+ }
+ else
+ {
+ info << "preselect : no exist." << std::endl;
+ }
+
+ if (sortText)
+ {
+ info << "sortText : " << sortText.value() << std::endl;
+ }
+ else
+ {
+ info << "sortText : no exist." << std::endl;
+ }
+
+ if (filterText)
+ {
+ info << "filterText : " << filterText.value() << std::endl;
+ }
+ else
+ {
+ info << "filterText : no exist." << std::endl;
+ }
+
+ if (insertText)
+ {
+ info << "insertText : " << insertText.value() << std::endl;
+ }
+ else
+ {
+ info << "insertText : no exist." << std::endl;
+ }
+
+ if (insertTextFormat)
+ {
+ info << "insertText : " << lsp::ToString(insertTextFormat.value()) << std::endl;
+ }
+ else
+ {
+ info << "insertTextFormat : no exist." << std::endl;
+ }
+
+ if (textEdit)
+ {
+ info << "textEdit : " << textEdit.value().ToString() << std::endl;
+ }
+ else
+ {
+ info << "textEdit : no exist." << std::endl;
+ }
+
+ return info.str();
+}
+namespace JDT
+{
+namespace CodeActionKind
+{
+
+ /**
* Base kind for quickfix actions: 'quickfix'
*/
- const char* QuickFix = "quickfix";
+ char const* QuickFix = "quickfix";
- /**
+ /**
* Base kind for refactoring actions: 'refactor'
*/
- const char* Refactor = "refactor";
+ char const* Refactor = "refactor";
- /**
+ /**
* Base kind for refactoring extraction actions: 'refactor.extract'
*
* Example extract actions:
@@ -1026,18 +1095,18 @@ namespace JDT
* - Extract method - Extract function - Extract variable - Extract interface
* from class - ...
*/
- const char* RefactorExtract = "refactor.extract";
+ char const* RefactorExtract = "refactor.extract";
- /**
+ /**
* Base kind for refactoring inline actions: 'refactor.inline'
*
* Example inline actions:
*
* - Inline function - Inline variable - Inline constant - ...
*/
- const char* RefactorInline = "refactor.inline";
+ char const* RefactorInline = "refactor.inline";
- /**
+ /**
* Base kind for refactoring rewrite actions: 'refactor.rewrite'
*
* Example rewrite actions:
@@ -1045,45 +1114,45 @@ namespace JDT
* - Convert JavaScript function to class - Add or remove parameter -
* Encapsulate field - Make method static - Move method to base class - ...
*/
- const char* RefactorRewrite = "refactor.rewrite";
+ char const* RefactorRewrite = "refactor.rewrite";
- /**
+ /**
* Base kind for source actions: `source`
*
* Source code actions apply to the entire file.
*/
- const char* Source = "source";
+ char const* Source = "source";
- /**
+ /**
* Base kind for an organize imports source action: `source.organizeImports`
*/
- const char* SourceOrganizeImports = "source.organizeImports";
+ char const* SourceOrganizeImports = "source.organizeImports";
- const char* COMMAND_ID_APPLY_EDIT = "java.apply.workspaceEdit";
+ char const* COMMAND_ID_APPLY_EDIT = "java.apply.workspaceEdit";
- };
+}; // namespace CodeActionKind
-
-}
-Directory::Directory(const AbsolutePath& path) : path(path.path) {
- lsp::EnsureEndsInSlash(this->path);
+} // namespace JDT
+Directory::Directory(AbsolutePath const& path) : path(path.path)
+{
+ lsp::EnsureEndsInSlash(this->path);
}
-bool Directory::operator==(const Directory& rhs) const {
- return path == rhs.path;
+bool Directory::operator==(Directory const& rhs) const
+{
+ return path == rhs.path;
}
-bool Directory::operator!=(const Directory& rhs) const {
- return path != rhs.path;
+bool Directory::operator!=(Directory const& rhs) const
+{
+ return path != rhs.path;
}
-
-
- Registration Registration::Create(const std::string& method)
+Registration Registration::Create(std::string const& method)
{
- Registration reg;
- reg.method = method;
- const boost::uuids::uuid a_uuid = boost::uuids::random_generator()();
- reg.id = to_string(a_uuid);
- return reg;
+ Registration reg;
+ reg.method = method;
+ boost::uuids::uuid const a_uuid = boost::uuids::random_generator()();
+ reg.id = to_string(a_uuid);
+ return reg;
}
diff --git a/graphics/asymptote/LspCpp/src/lsp/lsp_diagnostic.cpp b/graphics/asymptote/LspCpp/src/lsp/lsp_diagnostic.cpp
index fba0edc30c..308388da37 100644
--- a/graphics/asymptote/LspCpp/src/lsp/lsp_diagnostic.cpp
+++ b/graphics/asymptote/LspCpp/src/lsp/lsp_diagnostic.cpp
@@ -1,75 +1,78 @@
#include "LibLsp/lsp/lsp_diagnostic.h"
-bool lsDiagnostic::operator==(const lsDiagnostic& rhs) const {
- // Just check the important fields.
- return range == rhs.range && message == rhs.message;
+bool lsDiagnostic::operator==(lsDiagnostic const& rhs) const
+{
+ // Just check the important fields.
+ return range == rhs.range && message == rhs.message;
}
-bool lsDiagnostic::operator!=(const lsDiagnostic& rhs) const {
- return !(*this == rhs);
+bool lsDiagnostic::operator!=(lsDiagnostic const& rhs) const
+{
+ return !(*this == rhs);
}
std::string lsResponseError::ToString()
{
- std::string info = "code:";
- switch (code)
- {
- case lsErrorCodes::ParseError:
- info += "ParseError\n";
- break;
- case lsErrorCodes::InvalidRequest:
- info += "InvalidRequest\n";
- break;
- case lsErrorCodes::MethodNotFound:
- info += "MethodNotFound\n";
- break;
- case lsErrorCodes::InvalidParams:
- info += "InvalidParams\n";
- break;
- case lsErrorCodes::InternalError:
- info += "InternalError\n";
- break;
- case lsErrorCodes::serverErrorStart:
- info += "serverErrorStart\n";
- break;
- case lsErrorCodes::serverErrorEnd:
- info += "serverErrorEnd\n";
- break;
- case lsErrorCodes::ServerNotInitialized:
- info += "ServerNotInitialized\n";
- break;
- case lsErrorCodes::UnknownErrorCode:
- info += "UnknownErrorCode\n";
- break;
- // Defined by the protocol.
- case lsErrorCodes::RequestCancelled:
- info += "RequestCancelled\n";
- break;
- default:
- {
- std::stringstream ss;
- ss << "unknown code:" << (int32_t)code << std::endl;
- info += ss.str();
- }
- break;
- }
- info += "message:" + message;
- info += "\n";
+ std::string info = "code:";
+ switch (code)
+ {
+ case lsErrorCodes::ParseError:
+ info += "ParseError\n";
+ break;
+ case lsErrorCodes::InvalidRequest:
+ info += "InvalidRequest\n";
+ break;
+ case lsErrorCodes::MethodNotFound:
+ info += "MethodNotFound\n";
+ break;
+ case lsErrorCodes::InvalidParams:
+ info += "InvalidParams\n";
+ break;
+ case lsErrorCodes::InternalError:
+ info += "InternalError\n";
+ break;
+ case lsErrorCodes::serverErrorStart:
+ info += "serverErrorStart\n";
+ break;
+ case lsErrorCodes::serverErrorEnd:
+ info += "serverErrorEnd\n";
+ break;
+ case lsErrorCodes::ServerNotInitialized:
+ info += "ServerNotInitialized\n";
+ break;
+ case lsErrorCodes::UnknownErrorCode:
+ info += "UnknownErrorCode\n";
+ break;
+ // Defined by the protocol.
+ case lsErrorCodes::RequestCancelled:
+ info += "RequestCancelled\n";
+ break;
+ default:
+ {
+ std::stringstream ss;
+ ss << "unknown code:" << (int32_t)code << std::endl;
+ info += ss.str();
+ }
+ break;
+ }
+ info += "message:" + message;
+ info += "\n";
- if(data.has_value())
- {
+ if (data.has_value())
+ {
- info += "data:" + data.value().Data();
- info += "\n";
- }
- return info;
+ info += "data:" + data.value().Data();
+ info += "\n";
+ }
+ return info;
}
-void lsResponseError::Write(Writer& visitor) {
- auto& value = *this;
- int code2 = static_cast<int>(this->code);
+void lsResponseError::Write(Writer& visitor)
+{
+ auto& value = *this;
+ int code2 = static_cast<int>(this->code);
- visitor.StartObject();
- REFLECT_MEMBER2("code", code2);
- REFLECT_MEMBER(message);
- visitor.EndObject();
+ visitor.StartObject();
+ REFLECT_MEMBER2("code", code2);
+ REFLECT_MEMBER(message);
+ visitor.EndObject();
}
diff --git a/graphics/asymptote/LspCpp/src/lsp/textDocument.cpp b/graphics/asymptote/LspCpp/src/lsp/textDocument.cpp
index c87a047d3f..1ff7a3af2d 100644
--- a/graphics/asymptote/LspCpp/src/lsp/textDocument.cpp
+++ b/graphics/asymptote/LspCpp/src/lsp/textDocument.cpp
@@ -9,341 +9,399 @@
#include "LibLsp/lsp/textDocument/SemanticTokens.h"
#include "LibLsp/JsonRpc/json.h"
-
constexpr unsigned SemanticTokenEncodingSize = 5;
std::string to_string(SemanticTokenType _type)
{
- switch (_type) {
+ switch (_type)
+ {
- case ls_namespace: return "namespace";
- /**
+ case ls_namespace:
+ return "namespace";
+ /**
* Represents a generic type. Acts as a fallback for types which
* can"t be mapped to a specific type like class or enum.
*/
- case ls_type: return "type";
- case ls_class: return "class";
- case ls_enum: return "enum";
- case ls_interface: return "interface";
- case ls_struct: return "struct";
- case ls_typeParameter: return "typeParameter";
- case ls_parameter: return "parameter";
- case ls_variable: return "variable";
- case ls_property: return "property";
- case ls_enumMember: return "enumMember";
- case ls_event: return "event";
- case ls_function: return "function";
- case ls_method: return "method";
- case ls_macro: return "macro";
- case ls_keyword: return "keyword";
- case ls_modifier: return "modifier";
- case ls_comment: return "comment";
- case ls_string: return "string";
- case ls_number: return "number";
- case ls_regexp: return "regexp";
- case ls_operator: return "operator";
- default:
- return "unknown";
- }
+ case ls_type:
+ return "type";
+ case ls_class:
+ return "class";
+ case ls_enum:
+ return "enum";
+ case ls_interface:
+ return "interface";
+ case ls_struct:
+ return "struct";
+ case ls_typeParameter:
+ return "typeParameter";
+ case ls_parameter:
+ return "parameter";
+ case ls_variable:
+ return "variable";
+ case ls_property:
+ return "property";
+ case ls_enumMember:
+ return "enumMember";
+ case ls_event:
+ return "event";
+ case ls_function:
+ return "function";
+ case ls_method:
+ return "method";
+ case ls_macro:
+ return "macro";
+ case ls_keyword:
+ return "keyword";
+ case ls_modifier:
+ return "modifier";
+ case ls_comment:
+ return "comment";
+ case ls_string:
+ return "string";
+ case ls_number:
+ return "number";
+ case ls_regexp:
+ return "regexp";
+ case ls_operator:
+ return "operator";
+ default:
+ return "unknown";
+ }
}
unsigned toSemanticTokenType(std::vector<SemanticTokenType>& modifiers)
{
- unsigned encode_type = 0;
- for (auto bit : modifiers) {
- encode_type = encode_type | (0b00000001 << bit);
- }
- return encode_type;
+ unsigned encode_type = 0;
+ for (auto bit : modifiers)
+ {
+ encode_type = encode_type | (0b00000001 << bit);
+ }
+ return encode_type;
}
std::string to_string(TokenType_JDT _type)
{
- switch (_type)
- {
- case PACKAGE_JDT:return "namespace";
- case CLASS_JDT:return "class";
- case INTERFACE_JDT:return "interface";
- case ENUM_JDT:return "enum";
- case ENUM_MEMBER_JDT:return "enumMember";
- case TYPE_JDT:return "type";
- case TYPE_PARAMETER_JDT:return "typeParameter";
- case ANNOTATION_JDT:return "annotation";
- case ANNOTATION_MEMBER_JDT:return "annotationMember";
- case METHOD_JDT:return "function";
- case PROPERTY_JDT:return "property";
- case VARIABLE_JDT:return "variable";
- case PARAMETER_JDT:return "parameter";
- }
- return "unknown";
+ switch (_type)
+ {
+ case PACKAGE_JDT:
+ return "namespace";
+ case CLASS_JDT:
+ return "class";
+ case INTERFACE_JDT:
+ return "interface";
+ case ENUM_JDT:
+ return "enum";
+ case ENUM_MEMBER_JDT:
+ return "enumMember";
+ case TYPE_JDT:
+ return "type";
+ case TYPE_PARAMETER_JDT:
+ return "typeParameter";
+ case ANNOTATION_JDT:
+ return "annotation";
+ case ANNOTATION_MEMBER_JDT:
+ return "annotationMember";
+ case METHOD_JDT:
+ return "function";
+ case PROPERTY_JDT:
+ return "property";
+ case VARIABLE_JDT:
+ return "variable";
+ case PARAMETER_JDT:
+ return "parameter";
+ }
+ return "unknown";
}
std::string to_string(SemanticTokenModifier modifier)
{
- switch (modifier) {
- case ls_declaration: return "declaration";
- case ls_definition: return "definition";
- case ls_readonly: return "readonly";
- case ls_static: return "static";
- case ls_deprecated: return "deprecated";
- case ls_abstract: return "abstract";
- case ls_async: return "async";
- case ls_modification: return "modification";
- case ls_documentation: return "documentation";
- case ls_defaultLibrary: return "defaultLibrary";
- default:
- return "unknown";
- }
+ switch (modifier)
+ {
+ case ls_declaration:
+ return "declaration";
+ case ls_definition:
+ return "definition";
+ case ls_readonly:
+ return "readonly";
+ case ls_static:
+ return "static";
+ case ls_deprecated:
+ return "deprecated";
+ case ls_abstract:
+ return "abstract";
+ case ls_async:
+ return "async";
+ case ls_modification:
+ return "modification";
+ case ls_documentation:
+ return "documentation";
+ case ls_defaultLibrary:
+ return "defaultLibrary";
+ default:
+ return "unknown";
+ }
}
unsigned toSemanticTokenModifiers(std::vector<SemanticTokenModifier>& modifiers)
{
- unsigned encodedModifiers = 0;
- for (auto bit : modifiers) {
- encodedModifiers = encodedModifiers | (0b00000001 << bit);
- }
- return encodedModifiers;
+ unsigned encodedModifiers = 0;
+ for (auto bit : modifiers)
+ {
+ encodedModifiers = encodedModifiers | (0b00000001 << bit);
+ }
+ return encodedModifiers;
}
-
-std::string toSemanticTokenType(HighlightingKind_clangD kind) {
- switch (kind) {
- case HighlightingKind_clangD::Variable:
- case HighlightingKind_clangD::LocalVariable:
- case HighlightingKind_clangD::StaticField:
- return "variable";
- case HighlightingKind_clangD::Parameter:
- return "parameter";
- case HighlightingKind_clangD::Function:
- return "function";
- case HighlightingKind_clangD::Method:
- return "method";
- case HighlightingKind_clangD::StaticMethod:
- // FIXME: better method with static modifier?
- return "function";
- case HighlightingKind_clangD::Field:
- return "property";
- case HighlightingKind_clangD::Class:
- return "class";
- case HighlightingKind_clangD::Interface:
- return "interface";
- case HighlightingKind_clangD::Enum:
- return "enum";
- case HighlightingKind_clangD::EnumConstant:
- return "enumMember";
- case HighlightingKind_clangD::Typedef:
- case HighlightingKind_clangD::Type:
- return "type";
- case HighlightingKind_clangD::Unknown:
- return "unknown"; // nonstandard
- case HighlightingKind_clangD::Namespace:
- return "namespace";
- case HighlightingKind_clangD::TemplateParameter:
- return "typeParameter";
- case HighlightingKind_clangD::Concept:
- return "concept"; // nonstandard
- case HighlightingKind_clangD::Primitive:
- return "type";
- case HighlightingKind_clangD::Macro:
- return "macro";
- case HighlightingKind_clangD::InactiveCode:
- return "comment";
- }
- return ("unhandled HighlightingKind_clangD");
+std::string toSemanticTokenType(HighlightingKind_clangD kind)
+{
+ switch (kind)
+ {
+ case HighlightingKind_clangD::Variable:
+ case HighlightingKind_clangD::LocalVariable:
+ case HighlightingKind_clangD::StaticField:
+ return "variable";
+ case HighlightingKind_clangD::Parameter:
+ return "parameter";
+ case HighlightingKind_clangD::Function:
+ return "function";
+ case HighlightingKind_clangD::Method:
+ return "method";
+ case HighlightingKind_clangD::StaticMethod:
+ // FIXME: better method with static modifier?
+ return "function";
+ case HighlightingKind_clangD::Field:
+ return "property";
+ case HighlightingKind_clangD::Class:
+ return "class";
+ case HighlightingKind_clangD::Interface:
+ return "interface";
+ case HighlightingKind_clangD::Enum:
+ return "enum";
+ case HighlightingKind_clangD::EnumConstant:
+ return "enumMember";
+ case HighlightingKind_clangD::Typedef:
+ case HighlightingKind_clangD::Type:
+ return "type";
+ case HighlightingKind_clangD::Unknown:
+ return "unknown"; // nonstandard
+ case HighlightingKind_clangD::Namespace:
+ return "namespace";
+ case HighlightingKind_clangD::TemplateParameter:
+ return "typeParameter";
+ case HighlightingKind_clangD::Concept:
+ return "concept"; // nonstandard
+ case HighlightingKind_clangD::Primitive:
+ return "type";
+ case HighlightingKind_clangD::Macro:
+ return "macro";
+ case HighlightingKind_clangD::InactiveCode:
+ return "comment";
+ }
+ return ("unhandled HighlightingKind_clangD");
}
-std::string toSemanticTokenModifier(HighlightingModifier_clangD modifier) {
- switch (modifier) {
- case HighlightingModifier_clangD::Declaration:
- return "declaration";
- case HighlightingModifier_clangD::Deprecated:
- return "deprecated";
- case HighlightingModifier_clangD::Readonly:
- return "readonly";
- case HighlightingModifier_clangD::Static:
- return "static";
- case HighlightingModifier_clangD::Deduced:
- return "deduced"; // nonstandard
- case HighlightingModifier_clangD::Abstract:
- return "abstract";
- case HighlightingModifier_clangD::DependentName:
- return "dependentName"; // nonstandard
- case HighlightingModifier_clangD::DefaultLibrary:
- return "defaultLibrary";
- case HighlightingModifier_clangD::FunctionScope:
- return "functionScope"; // nonstandard
- case HighlightingModifier_clangD::ClassScope:
- return "classScope"; // nonstandard
- case HighlightingModifier_clangD::FileScope:
- return "fileScope"; // nonstandard
- case HighlightingModifier_clangD::GlobalScope:
- return "globalScope"; // nonstandard
- }
- return ("unhandled HighlightingModifier_clangD");
+std::string toSemanticTokenModifier(HighlightingModifier_clangD modifier)
+{
+ switch (modifier)
+ {
+ case HighlightingModifier_clangD::Declaration:
+ return "declaration";
+ case HighlightingModifier_clangD::Deprecated:
+ return "deprecated";
+ case HighlightingModifier_clangD::Readonly:
+ return "readonly";
+ case HighlightingModifier_clangD::Static:
+ return "static";
+ case HighlightingModifier_clangD::Deduced:
+ return "deduced"; // nonstandard
+ case HighlightingModifier_clangD::Abstract:
+ return "abstract";
+ case HighlightingModifier_clangD::DependentName:
+ return "dependentName"; // nonstandard
+ case HighlightingModifier_clangD::DefaultLibrary:
+ return "defaultLibrary";
+ case HighlightingModifier_clangD::FunctionScope:
+ return "functionScope"; // nonstandard
+ case HighlightingModifier_clangD::ClassScope:
+ return "classScope"; // nonstandard
+ case HighlightingModifier_clangD::FileScope:
+ return "fileScope"; // nonstandard
+ case HighlightingModifier_clangD::GlobalScope:
+ return "globalScope"; // nonstandard
+ }
+ return ("unhandled HighlightingModifier_clangD");
}
-
-
-bool operator==(const SemanticToken& l, const SemanticToken& r) {
- return std::tie(l.deltaLine, l.deltaStart, l.length, l.tokenType,
- l.tokenModifiers) == std::tie(r.deltaLine, r.deltaStart,
- r.length, r.tokenType,
- r.tokenModifiers);
+bool operator==(SemanticToken const& l, SemanticToken const& r)
+{
+ return std::tie(l.deltaLine, l.deltaStart, l.length, l.tokenType, l.tokenModifiers)
+ == std::tie(r.deltaLine, r.deltaStart, r.length, r.tokenType, r.tokenModifiers);
}
std::vector<int32_t> SemanticTokens::encodeTokens(std::vector<SemanticToken>& tokens)
{
- std::vector<int32_t> result;
- result.reserve(SemanticTokenEncodingSize * tokens.size());
- for (const auto& tok : tokens)
- {
- result.push_back(tok.deltaLine);
- result.push_back(tok.deltaStart);
- result.push_back(tok.length);
- result.push_back(tok.tokenType);
- result.push_back(tok.tokenModifiers);
- }
- assert(result.size() == SemanticTokenEncodingSize * tokens.size());
- return result;
+ std::vector<int32_t> result;
+ result.reserve(SemanticTokenEncodingSize * tokens.size());
+ for (auto const& tok : tokens)
+ {
+ result.push_back(tok.deltaLine);
+ result.push_back(tok.deltaStart);
+ result.push_back(tok.length);
+ result.push_back(tok.tokenType);
+ result.push_back(tok.tokenModifiers);
+ }
+ assert(result.size() == SemanticTokenEncodingSize * tokens.size());
+ return result;
}
void Reflect(Reader& visitor, TextDocumentComplete::Either& value)
{
- if(visitor.IsArray())
- {
- Reflect(visitor, value.first);
- }
- else
- {
-
- Reflect(visitor, value.second);
- }
+ if (visitor.IsArray())
+ {
+ Reflect(visitor, value.first);
+ }
+ else
+ {
+ Reflect(visitor, value.second);
+ }
}
void Reflect(Reader& visitor, TextDocumentDocumentSymbol::Either& value)
{
- if (visitor.HasMember("location"))
- {
- Reflect(visitor, value.first);
- }
- else
- {
- Reflect(visitor, value.second);
- }
+ if (visitor.HasMember("location"))
+ {
+ Reflect(visitor, value.first);
+ }
+ else
+ {
+ Reflect(visitor, value.second);
+ }
}
void Reflect(Reader& visitor, std::pair<optional<std::string>, optional<lsMarkedString>>& value)
{
- if (!visitor.IsString())
- {
- Reflect(visitor, value.second);
- }
- else
- {
- Reflect(visitor, value.first);
- }
+ if (!visitor.IsString())
+ {
+ Reflect(visitor, value.second);
+ }
+ else
+ {
+ Reflect(visitor, value.first);
+ }
}
void Reflect(Reader& visitor, std::pair<optional<std::string>, optional<MarkupContent>>& value)
{
- if (!visitor.IsString())
- {
- Reflect(visitor, value.second);
- }
- else
- {
- Reflect(visitor, value.first);
- }
+ if (!visitor.IsString())
+ {
+ Reflect(visitor, value.second);
+ }
+ else
+ {
+ Reflect(visitor, value.first);
+ }
}
- void Reflect(Reader& visitor, TextDocumentHover::Either& value)
+void Reflect(Reader& visitor, TextDocumentHover::Either& value)
{
- JsonReader& reader = dynamic_cast<JsonReader&>(visitor);
- if (reader.IsArray())
- {
- Reflect(visitor, value.first);
- }
- else if(reader.m_->IsObject())
- {
- Reflect(visitor, value.second);
- }
+ JsonReader& reader = dynamic_cast<JsonReader&>(visitor);
+ if (reader.IsArray())
+ {
+ Reflect(visitor, value.first);
+ }
+ else if (reader.m_->IsObject())
+ {
+ Reflect(visitor, value.second);
+ }
}
- void Reflect(Reader& visitor, TextDocumentPrepareRenameResult& value)
+void Reflect(Reader& visitor, TextDocumentPrepareRenameResult& value)
{
- if (visitor.HasMember("placeholder"))
- {
- Reflect(visitor, value.second);
- }
- else
- {
- Reflect(visitor, value.first);
- }
+ if (visitor.HasMember("placeholder"))
+ {
+ Reflect(visitor, value.second);
+ }
+ else
+ {
+ Reflect(visitor, value.first);
+ }
}
- namespace
- RefactorProposalUtility
- {
- const char* APPLY_REFACTORING_COMMAND_ID = "java.action.applyRefactoringCommand";
- const char* EXTRACT_VARIABLE_ALL_OCCURRENCE_COMMAND = "extractVariableAllOccurrence";
- const char* EXTRACT_VARIABLE_COMMAND = "extractVariable";
- const char* EXTRACT_CONSTANT_COMMAND = "extractConstant";
- const char* EXTRACT_METHOD_COMMAND = "extractMethod";
- const char* EXTRACT_FIELD_COMMAND = "extractField";
- const char* CONVERT_VARIABLE_TO_FIELD_COMMAND = "convertVariableToField";
- const char* MOVE_FILE_COMMAND = "moveFile";
- const char* MOVE_INSTANCE_METHOD_COMMAND = "moveInstanceMethod";
- const char* MOVE_STATIC_MEMBER_COMMAND = "moveStaticMember";
- const char* MOVE_TYPE_COMMAND = "moveType";
- };
- namespace QuickAssistProcessor {
-
- const char* SPLIT_JOIN_VARIABLE_DECLARATION_ID = "org.eclipse.jdt.ls.correction.splitJoinVariableDeclaration.assist"; //$NON-NLS-1$
- const char* CONVERT_FOR_LOOP_ID = "org.eclipse.jdt.ls.correction.convertForLoop.assist"; //$NON-NLS-1$
- const char* ASSIGN_TO_LOCAL_ID = "org.eclipse.jdt.ls.correction.assignToLocal.assist"; //$NON-NLS-1$
- const char* ASSIGN_TO_FIELD_ID = "org.eclipse.jdt.ls.correction.assignToField.assist"; //$NON-NLS-1$
- const char* ASSIGN_PARAM_TO_FIELD_ID = "org.eclipse.jdt.ls.correction.assignParamToField.assist"; //$NON-NLS-1$
- const char* ASSIGN_ALL_PARAMS_TO_NEW_FIELDS_ID = "org.eclipse.jdt.ls.correction.assignAllParamsToNewFields.assist"; //$NON-NLS-1$
- const char* ADD_BLOCK_ID = "org.eclipse.jdt.ls.correction.addBlock.assist"; //$NON-NLS-1$
- const char* EXTRACT_LOCAL_ID = "org.eclipse.jdt.ls.correction.extractLocal.assist"; //$NON-NLS-1$
- const char* EXTRACT_LOCAL_NOT_REPLACE_ID = "org.eclipse.jdt.ls.correction.extractLocalNotReplaceOccurrences.assist"; //$NON-NLS-1$
- const char* EXTRACT_CONSTANT_ID = "org.eclipse.jdt.ls.correction.extractConstant.assist"; //$NON-NLS-1$
- const char* INLINE_LOCAL_ID = "org.eclipse.jdt.ls.correction.inlineLocal.assist"; //$NON-NLS-1$
- const char* CONVERT_LOCAL_TO_FIELD_ID = "org.eclipse.jdt.ls.correction.convertLocalToField.assist"; //$NON-NLS-1$
- const char* CONVERT_ANONYMOUS_TO_LOCAL_ID = "org.eclipse.jdt.ls.correction.convertAnonymousToLocal.assist"; //$NON-NLS-1$
- const char* CONVERT_TO_STRING_BUFFER_ID = "org.eclipse.jdt.ls.correction.convertToStringBuffer.assist"; //$NON-NLS-1$
- const char* CONVERT_TO_MESSAGE_FORMAT_ID = "org.eclipse.jdt.ls.correction.convertToMessageFormat.assist"; //$NON-NLS-1$;
- const char* EXTRACT_METHOD_INPLACE_ID = "org.eclipse.jdt.ls.correction.extractMethodInplace.assist"; //$NON-NLS-1$;
+namespace RefactorProposalUtility
+{
+char const* APPLY_REFACTORING_COMMAND_ID = "java.action.applyRefactoringCommand";
+char const* EXTRACT_VARIABLE_ALL_OCCURRENCE_COMMAND = "extractVariableAllOccurrence";
+char const* EXTRACT_VARIABLE_COMMAND = "extractVariable";
+char const* EXTRACT_CONSTANT_COMMAND = "extractConstant";
+char const* EXTRACT_METHOD_COMMAND = "extractMethod";
+char const* EXTRACT_FIELD_COMMAND = "extractField";
+char const* CONVERT_VARIABLE_TO_FIELD_COMMAND = "convertVariableToField";
+char const* MOVE_FILE_COMMAND = "moveFile";
+char const* MOVE_INSTANCE_METHOD_COMMAND = "moveInstanceMethod";
+char const* MOVE_STATIC_MEMBER_COMMAND = "moveStaticMember";
+char const* MOVE_TYPE_COMMAND = "moveType";
+}; // namespace RefactorProposalUtility
+namespace QuickAssistProcessor
+{
- const char* CONVERT_ANONYMOUS_CLASS_TO_NESTED_COMMAND = "convertAnonymousClassToNestedCommand";
- };
+char const* SPLIT_JOIN_VARIABLE_DECLARATION_ID =
+ "org.eclipse.jdt.ls.correction.splitJoinVariableDeclaration.assist"; //$NON-NLS-1$
+char const* CONVERT_FOR_LOOP_ID = "org.eclipse.jdt.ls.correction.convertForLoop.assist"; //$NON-NLS-1$
+char const* ASSIGN_TO_LOCAL_ID = "org.eclipse.jdt.ls.correction.assignToLocal.assist"; //$NON-NLS-1$
+char const* ASSIGN_TO_FIELD_ID = "org.eclipse.jdt.ls.correction.assignToField.assist"; //$NON-NLS-1$
+char const* ASSIGN_PARAM_TO_FIELD_ID = "org.eclipse.jdt.ls.correction.assignParamToField.assist"; //$NON-NLS-1$
+char const* ASSIGN_ALL_PARAMS_TO_NEW_FIELDS_ID =
+ "org.eclipse.jdt.ls.correction.assignAllParamsToNewFields.assist"; //$NON-NLS-1$
+char const* ADD_BLOCK_ID = "org.eclipse.jdt.ls.correction.addBlock.assist"; //$NON-NLS-1$
+char const* EXTRACT_LOCAL_ID = "org.eclipse.jdt.ls.correction.extractLocal.assist"; //$NON-NLS-1$
+char const* EXTRACT_LOCAL_NOT_REPLACE_ID =
+ "org.eclipse.jdt.ls.correction.extractLocalNotReplaceOccurrences.assist"; //$NON-NLS-1$
+char const* EXTRACT_CONSTANT_ID = "org.eclipse.jdt.ls.correction.extractConstant.assist"; //$NON-NLS-1$
+char const* INLINE_LOCAL_ID = "org.eclipse.jdt.ls.correction.inlineLocal.assist"; //$NON-NLS-1$
+char const* CONVERT_LOCAL_TO_FIELD_ID = "org.eclipse.jdt.ls.correction.convertLocalToField.assist"; //$NON-NLS-1$
+char const* CONVERT_ANONYMOUS_TO_LOCAL_ID =
+ "org.eclipse.jdt.ls.correction.convertAnonymousToLocal.assist"; //$NON-NLS-1$
+char const* CONVERT_TO_STRING_BUFFER_ID = "org.eclipse.jdt.ls.correction.convertToStringBuffer.assist"; //$NON-NLS-1$
+char const* CONVERT_TO_MESSAGE_FORMAT_ID = "org.eclipse.jdt.ls.correction.convertToMessageFormat.assist"; //$NON-NLS-1$;
+char const* EXTRACT_METHOD_INPLACE_ID = "org.eclipse.jdt.ls.correction.extractMethodInplace.assist"; //$NON-NLS-1$;
- void Reflect(Reader& reader, TypeHierarchyDirection& value) {
- if (!reader.IsString())
- {
- value = TypeHierarchyDirection::Both;
- return;
- }
- std::string v = reader.GetString();
- if (v == "Children")
- value = TypeHierarchyDirection::Both;
- else if (v == "Parents")
- value = TypeHierarchyDirection::Parents;
- else if (v == "Both")
- value = TypeHierarchyDirection::Both;
- }
+char const* CONVERT_ANONYMOUS_CLASS_TO_NESTED_COMMAND = "convertAnonymousClassToNestedCommand";
+}; // namespace QuickAssistProcessor
+void Reflect(Reader& reader, TypeHierarchyDirection& value)
+{
+ if (!reader.IsString())
+ {
+ value = TypeHierarchyDirection::Both;
+ return;
+ }
+ std::string v = reader.GetString();
+ if (v == "Children")
+ {
+ value = TypeHierarchyDirection::Both;
+ }
+ else if (v == "Parents")
+ {
+ value = TypeHierarchyDirection::Parents;
+ }
+ else if (v == "Both")
+ {
+ value = TypeHierarchyDirection::Both;
+ }
+}
- void Reflect(Writer& writer, TypeHierarchyDirection& value) {
- switch (value)
- {
- case TypeHierarchyDirection::Children:
- writer.String("Children");
- break;
- case TypeHierarchyDirection::Parents:
- writer.String("Parents");
- break;
- case TypeHierarchyDirection::Both:
- writer.String("Both");
- break;
- }
- }
+void Reflect(Writer& writer, TypeHierarchyDirection& value)
+{
+ switch (value)
+ {
+ case TypeHierarchyDirection::Children:
+ writer.String("Children");
+ break;
+ case TypeHierarchyDirection::Parents:
+ writer.String("Parents");
+ break;
+ case TypeHierarchyDirection::Both:
+ writer.String("Both");
+ break;
+ }
+}
diff --git a/graphics/asymptote/LspCpp/src/lsp/utils.cpp b/graphics/asymptote/LspCpp/src/lsp/utils.cpp
index 893cc94552..0ed5872fca 100644
--- a/graphics/asymptote/LspCpp/src/lsp/utils.cpp
+++ b/graphics/asymptote/LspCpp/src/lsp/utils.cpp
@@ -15,11 +15,10 @@
#include "LibLsp/lsp/lsPosition.h"
#include "utf8.h"
-#ifdef _WIN32
+#ifdef _WIN32
#include <Windows.h>
#endif
-
// DEFAULT_RESOURCE_DIRECTORY is passed with quotes for non-MSVC compilers, ie,
// foo vs "foo".
#if defined(_MSC_VER)
@@ -28,6 +27,7 @@
#else
#define ENSURE_STRING_MACRO_ARGUMENT(x) x
#endif
+#include <boost/utility.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/algorithm/string.hpp>
@@ -35,286 +35,336 @@
namespace lsp
{
-
// See http://stackoverflow.com/a/2072890
-bool EndsWith(std::string value, std::string ending) {
- if (ending.size() > value.size())
- return false;
- return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
+bool EndsWith(std::string value, std::string ending)
+{
+ if (ending.size() > value.size())
+ {
+ return false;
+ }
+ return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
}
-bool StartsWith(std::string value, std::string start) {
- if (start.size() > value.size())
- return false;
- return std::equal(start.begin(), start.end(), value.begin());
+bool StartsWith(std::string value, std::string start)
+{
+ if (start.size() > value.size())
+ {
+ return false;
+ }
+ return std::equal(start.begin(), start.end(), value.begin());
}
-bool AnyStartsWith(const std::vector<std::string>& values,
- const std::string& start) {
- return std::any_of(
- std::begin(values), std::end(values),
- [&start](const std::string& value) { return StartsWith(value, start); });
+bool AnyStartsWith(std::vector<std::string> const& values, std::string const& start)
+{
+ return std::any_of(
+ std::begin(values), std::end(values), [&start](std::string const& value) { return StartsWith(value, start); }
+ );
}
-bool StartsWithAny(const std::string& value,
- const std::vector<std::string>& startings) {
- return std::any_of(std::begin(startings), std::end(startings),
- [&value](const std::string& starting) {
- return StartsWith(value, starting);
- });
+bool StartsWithAny(std::string const& value, std::vector<std::string> const& startings)
+{
+ return std::any_of(
+ std::begin(startings), std::end(startings),
+ [&value](std::string const& starting) { return StartsWith(value, starting); }
+ );
}
-bool EndsWithAny(const std::string& value,
- const std::vector<std::string>& endings) {
- return std::any_of(
- std::begin(endings), std::end(endings),
- [&value](const std::string& ending) { return EndsWith(value, ending); });
+bool EndsWithAny(std::string const& value, std::vector<std::string> const& endings)
+{
+ return std::any_of(
+ std::begin(endings), std::end(endings), [&value](std::string const& ending) { return EndsWith(value, ending); }
+ );
}
-bool FindAnyPartial(const std::string& value,
- const std::vector<std::string>& values) {
- return std::any_of(std::begin(values), std::end(values),
- [&value](const std::string& v) {
- return value.find(v) != std::string::npos;
- });
+bool FindAnyPartial(std::string const& value, std::vector<std::string> const& values)
+{
+ return std::any_of(
+ std::begin(values), std::end(values),
+ [&value](std::string const& v) { return value.find(v) != std::string::npos; }
+ );
}
-std::string GetDirName(std::string path) {
+std::string GetDirName(std::string path)
+{
- ReplaceAll(path, "\\", "/");
- if (path.size() && path.back() == '/')
- path.pop_back();
- size_t last_slash = path.find_last_of('/');
- if (last_slash == std::string::npos)
- return "./";
- return path.substr(0, last_slash + 1);
+ ReplaceAll(path, "\\", "/");
+ if (path.size() && path.back() == '/')
+ {
+ path.pop_back();
+ }
+ size_t last_slash = path.find_last_of('/');
+ if (last_slash == std::string::npos)
+ {
+ return "./";
+ }
+ return path.substr(0, last_slash + 1);
}
-std::string GetBaseName(const std::string& path) {
- size_t last_slash = path.find_last_of('/');
- if (last_slash != std::string::npos && (last_slash + 1) < path.size())
- return path.substr(last_slash + 1);
- return path;
+std::string GetBaseName(std::string const& path)
+{
+ size_t last_slash = path.find_last_of('/');
+ if (last_slash != std::string::npos && (last_slash + 1) < path.size())
+ {
+ return path.substr(last_slash + 1);
+ }
+ return path;
}
-std::string StripFileType(const std::string& path) {
- size_t last_period = path.find_last_of('.');
- if (last_period != std::string::npos)
- return path.substr(0, last_period);
- return path;
+std::string StripFileType(std::string const& path)
+{
+ size_t last_period = path.find_last_of('.');
+ if (last_period != std::string::npos)
+ {
+ return path.substr(0, last_period);
+ }
+ return path;
}
// See http://stackoverflow.com/a/29752943
-std::string ReplaceAll(const std::string& source,
- const std::string& from,
- const std::string& to) {
- std::string result;
- result.reserve(source.length()); // avoids a few memory allocations
+std::string ReplaceAll(std::string const& source, std::string const& from, std::string const& to)
+{
+ std::string result;
+ result.reserve(source.length()); // avoids a few memory allocations
- std::string::size_type last_pos = 0;
- std::string::size_type find_pos;
+ std::string::size_type last_pos = 0;
+ std::string::size_type find_pos;
- while (std::string::npos != (find_pos = source.find(from, last_pos))) {
- result.append(source, last_pos, find_pos - last_pos);
- result += to;
- last_pos = find_pos + from.length();
- }
+ while (std::string::npos != (find_pos = source.find(from, last_pos)))
+ {
+ result.append(source, last_pos, find_pos - last_pos);
+ result += to;
+ last_pos = find_pos + from.length();
+ }
- // Care for the rest after last occurrence
- result += source.substr(last_pos);
+ // Care for the rest after last occurrence
+ result += source.substr(last_pos);
- return result;
+ return result;
}
-std::vector<std::string> SplitString(const std::string& str,
- const std::string& delimiter) {
- // http://stackoverflow.com/a/13172514
- std::vector<std::string> strings;
-
- std::string::size_type pos = 0;
- std::string::size_type prev = 0;
- while ((pos = str.find(delimiter, prev)) != std::string::npos) {
- strings.emplace_back(str.substr(prev, pos - prev));
- prev = pos + 1;
- }
+std::vector<std::string> SplitString(std::string const& str, std::string const& delimiter)
+{
+ // http://stackoverflow.com/a/13172514
+ std::vector<std::string> strings;
+
+ std::string::size_type pos = 0;
+ std::string::size_type prev = 0;
+ while ((pos = str.find(delimiter, prev)) != std::string::npos)
+ {
+ strings.emplace_back(str.substr(prev, pos - prev));
+ prev = pos + 1;
+ }
- // To get the last substring (or only, if delimiter is not found)
- strings.emplace_back(str.substr(prev));
+ // To get the last substring (or only, if delimiter is not found)
+ strings.emplace_back(str.substr(prev));
- return strings;
+ return strings;
}
-void EnsureEndsInSlash(std::string& path) {
- if (path.empty() || path[path.size() - 1] != '/')
- path += '/';
+void EnsureEndsInSlash(std::string& path)
+{
+ if (path.empty() || path[path.size() - 1] != '/')
+ {
+ path += '/';
+ }
}
-std::string EscapeFileName(std::string path) {
- if (path.size() && path.back() == '/')
- path.pop_back();
- std::replace(path.begin(), path.end(), '\\', '@');
- std::replace(path.begin(), path.end(), '/', '@');
- std::replace(path.begin(), path.end(), ':', '@');
- return path;
+std::string EscapeFileName(std::string path)
+{
+ if (path.size() && path.back() == '/')
+ {
+ path.pop_back();
+ }
+ std::replace(path.begin(), path.end(), '\\', '@');
+ std::replace(path.begin(), path.end(), '/', '@');
+ std::replace(path.begin(), path.end(), ':', '@');
+ return path;
}
// http://stackoverflow.com/a/6089413
-std::istream& SafeGetline(std::istream& is, std::string& t) {
- t.clear();
+std::istream& SafeGetline(std::istream& is, std::string& t)
+{
+ t.clear();
- // The characters in the stream are read one-by-one using a std::streambuf.
- // That is faster than reading them one-by-one using the std::istream. Code
- // that uses streambuf this way must be guarded by a sentry object. The sentry
- // object performs various tasks, such as thread synchronization and updating
- // the stream state.
+ // The characters in the stream are read one-by-one using a std::streambuf.
+ // That is faster than reading them one-by-one using the std::istream. Code
+ // that uses streambuf this way must be guarded by a sentry object. The sentry
+ // object performs various tasks, such as thread synchronization and updating
+ // the stream state.
- std::istream::sentry se(is, true);
- std::streambuf* sb = is.rdbuf();
+ std::istream::sentry se(is, true);
+ std::streambuf* sb = is.rdbuf();
- for (;;) {
- int c = sb->sbumpc();
- if (c == EOF) {
- // Also handle the case when the last line has no line ending
- if (t.empty())
- is.setstate(std::ios::eofbit);
- return is;
- }
+ for (;;)
+ {
+ int c = sb->sbumpc();
+ if (c == EOF)
+ {
+ // Also handle the case when the last line has no line ending
+ if (t.empty())
+ {
+ is.setstate(std::ios::eofbit);
+ }
+ return is;
+ }
- t += (char)c;
+ t += (char)c;
- if (c == '\n')
- return is;
- }
+ if (c == '\n')
+ {
+ return is;
+ }
+ }
}
-bool FileExists(const std::string& filename) {
- std::ifstream cache(filename);
- return cache.is_open();
+bool FileExists(std::string const& filename)
+{
+ std::ifstream cache(filename);
+ return cache.is_open();
}
-optional<std::string> ReadContent(const AbsolutePath& filename) {
+optional<std::string> ReadContent(AbsolutePath const& filename)
+{
- std::ifstream cache;
- cache.open(filename.path);
+ std::ifstream cache;
+ cache.open(filename.path);
- try {
- return std::string(std::istreambuf_iterator<char>(cache),
- std::istreambuf_iterator<char>());
- } catch (std::ios_base::failure&) {
- return {};
- }
+ try
+ {
+ return std::string(std::istreambuf_iterator<char>(cache), std::istreambuf_iterator<char>());
+ }
+ catch (std::ios_base::failure&)
+ {
+ return {};
+ }
}
-std::vector<std::string> ReadLinesWithEnding(const AbsolutePath& filename) {
- std::vector<std::string> result;
+std::vector<std::string> ReadLinesWithEnding(AbsolutePath const& filename)
+{
+ std::vector<std::string> result;
- std::ifstream input(filename.path);
- for (std::string line; SafeGetline(input, line);)
- result.emplace_back(line);
+ std::ifstream input(filename.path);
+ for (std::string line; SafeGetline(input, line);)
+ {
+ result.emplace_back(line);
+ }
- return result;
+ return result;
}
-bool WriteToFile(const std::string& filename, const std::string& content) {
- std::ofstream file(filename,
- std::ios::out | std::ios::trunc | std::ios::binary);
- if (!file.good()) {
+bool WriteToFile(std::string const& filename, std::string const& content)
+{
+ std::ofstream file(filename, std::ios::out | std::ios::trunc | std::ios::binary);
+ if (!file.good())
+ {
- return false;
- }
+ return false;
+ }
- file << content;
- return true;
+ file << content;
+ return true;
}
+std::string FormatMicroseconds(long long microseconds)
+{
+ long long milliseconds = microseconds / 1000;
+ long long remaining = microseconds - milliseconds;
-std::string FormatMicroseconds(long long microseconds) {
- long long milliseconds = microseconds / 1000;
- long long remaining = microseconds - milliseconds;
-
- // Only show two digits after the dot.
- while (remaining >= 100)
- remaining /= 10;
+ // Only show two digits after the dot.
+ while (remaining >= 100)
+ {
+ remaining /= 10;
+ }
- return std::to_string(milliseconds) + "." + std::to_string(remaining) + "ms";
+ return std::to_string(milliseconds) + "." + std::to_string(remaining) + "ms";
}
+std::string UpdateToRnNewlines(std::string output)
+{
+ size_t idx = 0;
+ while (true)
+ {
+ idx = output.find('\n', idx);
+ // No more matches.
+ if (idx == std::string::npos)
+ {
+ break;
+ }
-std::string UpdateToRnNewlines(std::string output) {
- size_t idx = 0;
- while (true) {
- idx = output.find('\n', idx);
-
- // No more matches.
- if (idx == std::string::npos)
- break;
+ // Skip an existing "\r\n" match.
+ if (idx > 0 && output[idx - 1] == '\r')
+ {
+ ++idx;
+ continue;
+ }
- // Skip an existing "\r\n" match.
- if (idx > 0 && output[idx - 1] == '\r') {
- ++idx;
- continue;
+ // Replace "\n" with "\r|n".
+ output.replace(output.begin() + idx, output.begin() + idx + 1, "\r\n");
}
- // Replace "\n" with "\r|n".
- output.replace(output.begin() + idx, output.begin() + idx + 1, "\r\n");
- }
-
- return output;
+ return output;
}
-
-
-bool IsAbsolutePath(const std::string& path) {
- return IsUnixAbsolutePath(path) || IsWindowsAbsolutePath(path);
+bool IsAbsolutePath(std::string const& path)
+{
+ return IsUnixAbsolutePath(path) || IsWindowsAbsolutePath(path);
}
-bool IsUnixAbsolutePath(const std::string& path) {
- return !path.empty() && path[0] == '/';
+bool IsUnixAbsolutePath(std::string const& path)
+{
+ return !path.empty() && path[0] == '/';
}
-bool IsWindowsAbsolutePath(const std::string& path) {
- auto is_drive_letter = [](char c) {
- return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
- };
+bool IsWindowsAbsolutePath(std::string const& path)
+{
+ auto is_drive_letter = [](char c) { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); };
- return path.size() > 3 && path[1] == ':' &&
- (path[2] == '/' || path[2] == '\\') && is_drive_letter(path[0]);
+ return path.size() > 3 && path[1] == ':' && (path[2] == '/' || path[2] == '\\') && is_drive_letter(path[0]);
}
-bool IsDirectory(const std::string& path) {
- struct stat path_stat;
+bool IsDirectory(std::string const& path)
+{
+ struct stat path_stat;
- if (stat(path.c_str(), &path_stat) != 0) {
- perror("cannot access path");
- return false;
- }
+ if (stat(path.c_str(), &path_stat) != 0)
+ {
+ perror("cannot access path");
+ return false;
+ }
- return path_stat.st_mode & S_IFDIR;
+ return path_stat.st_mode & S_IFDIR;
}
- std::string ws2s(std::wstring const& wstr) {
- if(sizeof(wchar_t) == 2){
- std::string narrow;
- utf8::utf16to8(wstr.begin(), wstr.end(), std::back_inserter(narrow));
- return narrow;
- }else{
- std::string narrow;
- utf8::utf32to8(wstr.begin(), wstr.end(), std::back_inserter(narrow));
- return narrow;
- }
-
+std::string ws2s(std::wstring const& wstr)
+{
+ BOOST_IF_CONSTEXPR(sizeof(wchar_t) == 2)
+ {
+ std::string narrow;
+ utf8::utf16to8(wstr.begin(), wstr.end(), std::back_inserter(narrow));
+ return narrow;
}
- std::wstring s2ws(const std::string& str) {
- std::wstring wide;
- if(sizeof(wchar_t) == 2){
- utf8::utf8to16(str.begin(), str.end(), std::back_inserter(wide));
- return wide;
- }else{
- utf8::utf8to32(str.begin(), str.end(), std::back_inserter(wide));
- return wide;
- }
+ else
+ {
+ std::string narrow;
+ utf8::utf32to8(wstr.begin(), wstr.end(), std::back_inserter(narrow));
+ return narrow;
+ }
+}
+std::wstring s2ws(std::string const& str)
+{
+ std::wstring wide;
+ BOOST_IF_CONSTEXPR(sizeof(wchar_t) == 2)
+ {
+ utf8::utf8to16(str.begin(), str.end(), std::back_inserter(wide));
+ return wide;
+ }
+ else
+ {
+ utf8::utf8to32(str.begin(), str.end(), std::back_inserter(wide));
+ return wide;
}
+}
#ifdef _WIN32
@@ -322,291 +372,348 @@ bool IsDirectory(const std::string& path) {
// Returns the canonicalized absolute pathname, without expanding symbolic
// links. This is a variant of realpath(2), C++ rewrite of
// https://github.com/freebsd/freebsd/blob/master/lib/libc/stdlib/realpath.c
-AbsolutePath RealPathNotExpandSymlink(std::string path,
- bool ensure_exists) {
- if (path.empty()) {
- errno = EINVAL;
- return {};
- }
- if (path[0] == '\0') {
- errno = ENOENT;
- return {};
+AbsolutePath RealPathNotExpandSymlink(std::string path, bool ensure_exists)
+{
+ if (path.empty())
+ {
+ errno = EINVAL;
+ return {};
+ }
+ if (path[0] == '\0')
+ {
+ errno = ENOENT;
+ return {};
+ }
+
+ // Do not use PATH_MAX because it is tricky on Linux.
+ // See https://eklitzke.org/path-max-is-tricky
+ char tmp[1024];
+ std::string resolved;
+ size_t i = 0;
+ struct stat sb;
+ if (path[0] == '/')
+ {
+ resolved = "/";
+ i = 1;
+ }
+ else
+ {
+ if (!getcwd(tmp, sizeof tmp) && ensure_exists)
+ {
+ return {};
}
+ resolved = tmp;
+ }
- // Do not use PATH_MAX because it is tricky on Linux.
- // See https://eklitzke.org/path-max-is-tricky
- char tmp[1024];
- std::string resolved;
- size_t i = 0;
- struct stat sb;
- if (path[0] == '/') {
- resolved = "/";
- i = 1;
+ while (i < path.size())
+ {
+ auto j = path.find('/', i);
+ if (j == std::string::npos)
+ {
+ j = path.size();
}
- else {
- if (!getcwd(tmp, sizeof tmp) && ensure_exists)
- return {};
- resolved = tmp;
+ auto next_token = path.substr(i, j - i);
+ i = j + 1;
+ if (resolved.back() != '/')
+ {
+ resolved += '/';
}
-
- while (i < path.size()) {
- auto j = path.find('/', i);
- if (j == std::string::npos)
- j = path.size();
- auto next_token = path.substr(i, j - i);
- i = j + 1;
- if (resolved.back() != '/')
- resolved += '/';
- if (next_token.empty() || next_token == ".") {
- // Handle consequential slashes and "."
- continue;
- }
- else if (next_token == "..") {
- // Strip the last path component except when it is single "/"
- if (resolved.size() > 1)
- resolved.resize(resolved.rfind('/', resolved.size() - 2) + 1);
- continue;
- }
- // Append the next path component.
- // Here we differ from realpath(3), we use stat(2) instead of
- // lstat(2) because we do not want to resolve symlinks.
- resolved += next_token;
- if (stat(resolved.c_str(), &sb) != 0 && ensure_exists)
- return {};
- if (!S_ISDIR(sb.st_mode) && j < path.size() && ensure_exists) {
- errno = ENOTDIR;
- return {};
- }
+ if (next_token.empty() || next_token == ".")
+ {
+ // Handle consequential slashes and "."
+ continue;
}
+ else if (next_token == "..")
+ {
+ // Strip the last path component except when it is single "/"
+ if (resolved.size() > 1)
+ {
+ resolved.resize(resolved.rfind('/', resolved.size() - 2) + 1);
+ }
+ continue;
+ }
+ // Append the next path component.
+ // Here we differ from realpath(3), we use stat(2) instead of
+ // lstat(2) because we do not want to resolve symlinks.
+ resolved += next_token;
+ if (stat(resolved.c_str(), &sb) != 0 && ensure_exists)
+ {
+ return {};
+ }
+ if (!S_ISDIR(sb.st_mode) && j < path.size() && ensure_exists)
+ {
+ errno = ENOTDIR;
+ return {};
+ }
+ }
- // Remove trailing slash except when a single "/".
- if (resolved.size() > 1 && resolved.back() == '/')
- resolved.pop_back();
- return AbsolutePath(resolved, true /*validate*/);
+ // Remove trailing slash except when a single "/".
+ if (resolved.size() > 1 && resolved.back() == '/')
+ {
+ resolved.pop_back();
+ }
+ return AbsolutePath(resolved, true /*validate*/);
}
#endif
-
-AbsolutePath NormalizePath(const std::string& path0,
- bool ensure_exists ,
- bool force_lower_on_windows) {
+AbsolutePath NormalizePath(std::string const& path0, bool ensure_exists, bool force_lower_on_windows)
+{
#ifdef _WIN32
- std::wstring path = lsp::s2ws(path0);
+ std::wstring path = lsp::s2ws(path0);
- wchar_t buffer[MAX_PATH] = (L"");
+ wchar_t buffer[MAX_PATH] = (L"");
- // Normalize the path name, ie, resolve `..`.
- unsigned long len = GetFullPathNameW(path.c_str(), MAX_PATH, buffer, nullptr);
+ // Normalize the path name, ie, resolve `..`.
+ unsigned long len = GetFullPathNameW(path.c_str(), MAX_PATH, buffer, nullptr);
+ if (!len)
+ {
+ return {};
+ }
+ path = std::wstring(buffer, len);
+
+ // Get the actual casing of the path, ie, if the file on disk is `C:\FooBar`
+ // and this function is called with `c:\fooBar` this will return `c:\FooBar`.
+ // (drive casing is lowercase).
+ if (ensure_exists)
+ {
+ len = GetLongPathNameW(path.c_str(), buffer, MAX_PATH);
if (!len)
- return {};
- path = std::wstring(buffer, len);
-
- // Get the actual casing of the path, ie, if the file on disk is `C:\FooBar`
- // and this function is called with `c:\fooBar` this will return `c:\FooBar`.
- // (drive casing is lowercase).
- if (ensure_exists) {
- len = GetLongPathNameW(path.c_str(), buffer, MAX_PATH);
- if (!len)
- return {};
- path = std::wstring(buffer, len);
+ {
+ return {};
}
+ path = std::wstring(buffer, len);
+ }
- // Empty paths have no meaning.
- if (path.empty())
- return {};
+ // Empty paths have no meaning.
+ if (path.empty())
+ {
+ return {};
+ }
- // We may need to normalize the drive name to upper-case; at the moment
- // vscode sends lower-case path names.
- /*
+ // We may need to normalize the drive name to upper-case; at the moment
+ // vscode sends lower-case path names.
+ /*
path[0] = toupper(path[0]);
*/
- // Make the path all lower-case, since windows is case-insensitive.
- if (force_lower_on_windows) {
- for (size_t i = 0; i < path.size(); ++i)
- path[i] = (wchar_t)tolower(path[i]);
+ // Make the path all lower-case, since windows is case-insensitive.
+ if (force_lower_on_windows)
+ {
+ for (size_t i = 0; i < path.size(); ++i)
+ {
+ path[i] = (wchar_t)tolower(path[i]);
}
+ }
- // cquery assumes forward-slashes.
- std::replace(path.begin(), path.end(), '\\', '/');
-
+ // cquery assumes forward-slashes.
+ std::replace(path.begin(), path.end(), '\\', '/');
- return AbsolutePath(lsp::ws2s(path), false /*validate*/);
+ return AbsolutePath(lsp::ws2s(path), false /*validate*/);
#else
- return RealPathNotExpandSymlink(path0, ensure_exists);
+ return RealPathNotExpandSymlink(path0, ensure_exists);
#endif
-
-
}
// VSCode (UTF-16) disagrees with Emacs lsp-mode (UTF-8) on how to represent
// text documents.
// We use a UTF-8 iterator to approximate UTF-16 in the specification (weird).
// This is good enough and fails only for UTF-16 surrogate pairs.
-int GetOffsetForPosition(lsPosition position, const std::string& content) {
- size_t i = 0;
- // Iterate lines until we have found the correct line.
- while (position.line > 0 && i < content.size()) {
- if (content[i] == '\n')
- position.line--;
- i++;
+int GetOffsetForPosition(lsPosition position, std::string const& content)
+{
+ size_t i = 0;
+ // Iterate lines until we have found the correct line.
+ while (position.line > 0 && i < content.size())
+ {
+ if (content[i] == '\n')
+ {
+ position.line--;
}
- // Iterate characters on the target line.
- while (position.character > 0 && i < content.size()) {
- if (uint8_t(content[i++]) >= 128) {
- // Skip 0b10xxxxxx
- while (i < content.size() && uint8_t(content[i]) >= 128 &&
- uint8_t(content[i]) < 192)
- i++;
- }
- position.character--;
+ i++;
+ }
+ // Iterate characters on the target line.
+ while (position.character > 0 && i < content.size())
+ {
+ if (uint8_t(content[i++]) >= 128)
+ {
+ // Skip 0b10xxxxxx
+ while (i < content.size() && uint8_t(content[i]) >= 128 && uint8_t(content[i]) < 192)
+ {
+ i++;
+ }
}
- return int(i);
+ position.character--;
+ }
+ return int(i);
}
+lsPosition GetPositionForOffset(size_t offset, std::string const& content)
+{
+ lsPosition result;
+ for (size_t i = 0; i < offset && i < content.length(); ++i)
+ {
+ if (content[i] == '\n')
+ {
+ result.line++;
+ result.character = 0;
+ }
+ else
+ {
+ result.character++;
+ }
+ }
+ return result;
+}
-lsPosition GetPositionForOffset(size_t offset,const std::string& content) {
- lsPosition result;
- for (size_t i = 0; i < offset && i < content.length(); ++i) {
- if (content[i] == '\n') {
- result.line++;
- result.character = 0;
- }
- else {
- result.character++;
- }
+lsPosition CharPos(std::string const& search, char character, int character_offset)
+{
+ lsPosition result;
+ size_t index = 0;
+ while (index < search.size())
+ {
+ char c = search[index];
+ if (c == character)
+ {
+ break;
}
- return result;
-}
-
-lsPosition CharPos(const std::string& search,
- char character,
- int character_offset) {
- lsPosition result;
- size_t index = 0;
- while (index < search.size()) {
- char c = search[index];
- if (c == character)
- break;
- if (c == '\n') {
- result.line += 1;
- result.character = 0;
- }
- else {
- result.character += 1;
- }
- ++index;
+ if (c == '\n')
+ {
+ result.line += 1;
+ result.character = 0;
}
- assert(index < search.size());
- result.character += character_offset;
- return result;
-}
-
-void scanDirsUseRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret)
-{
- namespace fs = boost::filesystem;
- fs::path fullpath(rootPath);
- if (!fs::exists(fullpath)) { return; }
- fs::recursive_directory_iterator end_iter;
- for (fs::recursive_directory_iterator iter(fullpath); iter != end_iter; iter++) {
- try {
- if (fs::is_directory(*iter)) {
- ret.push_back(iter->path().wstring());
- }
- }
- catch (const std::exception& ex) {
- continue;
- }
+ else
+ {
+ result.character += 1;
}
+ ++index;
+ }
+ assert(index < search.size());
+ result.character += character_offset;
+ return result;
}
-void scanDirsNoRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret)
+void scanDirsUseRecursive(std::wstring const& rootPath, std::vector<std::wstring>& ret)
{
- namespace fs = boost::filesystem;
- boost::filesystem::path myPath(rootPath);
- if (!fs::exists(rootPath)) { return; }
- boost::filesystem::directory_iterator endIter;
- for (boost::filesystem::directory_iterator iter(myPath); iter != endIter; iter++) {
- if (boost::filesystem::is_directory(*iter)) {
- ret.push_back(iter->path().wstring());
- }
+ namespace fs = boost::filesystem;
+ fs::path fullpath(rootPath);
+ if (!fs::exists(fullpath))
+ {
+ return;
+ }
+ fs::recursive_directory_iterator end_iter;
+ for (fs::recursive_directory_iterator iter(fullpath); iter != end_iter; iter++)
+ {
+ try
+ {
+ if (fs::is_directory(*iter))
+ {
+ ret.push_back(iter->path().wstring());
+ }
+ }
+ catch (std::exception const&)
+ {
+ continue;
}
+ }
}
-void scanFilesUseRecursive(
- const std::wstring& rootPath,
- std::vector<std::wstring>& ret,
- std::wstring suf) {
- namespace fs = boost::filesystem;
- boost::to_lower(suf);
-
- fs::path fullpath(rootPath);
- if (!fs::exists(fullpath)) { return; }
- fs::recursive_directory_iterator end_iter;
- for (fs::recursive_directory_iterator iter(fullpath); iter != end_iter; iter++) {
- try {
- if (!fs::is_directory(*iter) && fs::is_regular_file(*iter)) {
- auto temp_path = iter->path().wstring();
- auto size = suf.size();
- if (!size)
- {
- ret.push_back(std::move(temp_path));
- }
- else
- {
-
- if (temp_path.size() < size) continue;
- auto suf_temp = temp_path.substr(temp_path.size() - size);
- boost::to_lower(suf_temp);
- if (suf_temp == suf)
- {
- ret.push_back(std::move(temp_path));
- }
- }
- }
- }
- catch (const std::exception&) {
- continue;
- }
+void scanDirsNoRecursive(std::wstring const& rootPath, std::vector<std::wstring>& ret)
+{
+ namespace fs = boost::filesystem;
+ boost::filesystem::path myPath(rootPath);
+ if (!fs::exists(rootPath))
+ {
+ return;
+ }
+ boost::filesystem::directory_iterator endIter;
+ for (boost::filesystem::directory_iterator iter(myPath); iter != endIter; iter++)
+ {
+ if (boost::filesystem::is_directory(*iter))
+ {
+ ret.push_back(iter->path().wstring());
}
+ }
}
-void scanFileNamesUseRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret,
- std::wstring strSuf)
+void scanFilesUseRecursive(std::wstring const& rootPath, std::vector<std::wstring>& ret, std::wstring suf)
{
- scanFilesUseRecursive(rootPath, ret, strSuf);
- std::vector<std::wstring> names;
- for (auto& it : ret)
+ namespace fs = boost::filesystem;
+ boost::to_lower(suf);
+
+ fs::path fullpath(rootPath);
+ if (!fs::exists(fullpath))
+ {
+ return;
+ }
+ fs::recursive_directory_iterator end_iter;
+ for (fs::recursive_directory_iterator iter(fullpath); iter != end_iter; iter++)
+ {
+ try
{
- if (it.size() >= rootPath.size())
+ if (!fs::is_directory(*iter) && fs::is_regular_file(*iter))
+ {
+ auto temp_path = iter->path().wstring();
+ auto size = suf.size();
+ if (!size)
{
- names.push_back(it.substr(rootPath.size()));
+ ret.push_back(std::move(temp_path));
}
- }
- ret.swap(names);
-}
+ else
+ {
-void scanFileNamesUseRecursive(const std::string& rootPath, std::vector<std::string>& ret, std::string strSuf)
-{
- std::vector<std::wstring> out;
- scanFileNamesUseRecursive(s2ws(rootPath), out, s2ws(strSuf));
- for (auto& it : out)
+ if (temp_path.size() < size)
+ {
+ continue;
+ }
+ auto suf_temp = temp_path.substr(temp_path.size() - size);
+ boost::to_lower(suf_temp);
+ if (suf_temp == suf)
+ {
+ ret.push_back(std::move(temp_path));
+ }
+ }
+ }
+ }
+ catch (std::exception const&)
{
- ret.push_back(ws2s(it));
+ continue;
}
+ }
}
-void scanFilesUseRecursive(const std::string& rootPath, std::vector<std::string>& ret, std::string strSuf)
+void scanFileNamesUseRecursive(std::wstring const& rootPath, std::vector<std::wstring>& ret, std::wstring strSuf)
{
- std::vector<std::wstring> out;
- scanFilesUseRecursive(s2ws(rootPath), out, s2ws(strSuf));
- for (auto& it : out)
+ scanFilesUseRecursive(rootPath, ret, strSuf);
+ std::vector<std::wstring> names;
+ for (auto& it : ret)
+ {
+ if (it.size() >= rootPath.size())
{
- ret.push_back(ws2s(it));
+ names.push_back(it.substr(rootPath.size()));
}
+ }
+ ret.swap(names);
}
+void scanFileNamesUseRecursive(std::string const& rootPath, std::vector<std::string>& ret, std::string strSuf)
+{
+ std::vector<std::wstring> out;
+ scanFileNamesUseRecursive(s2ws(rootPath), out, s2ws(strSuf));
+ for (auto& it : out)
+ {
+ ret.push_back(ws2s(it));
+ }
+}
+void scanFilesUseRecursive(std::string const& rootPath, std::vector<std::string>& ret, std::string strSuf)
+{
+ std::vector<std::wstring> out;
+ scanFilesUseRecursive(s2ws(rootPath), out, s2ws(strSuf));
+ for (auto& it : out)
+ {
+ ret.push_back(ws2s(it));
+ }
}
+
+} // namespace lsp
diff --git a/graphics/asymptote/LspCpp/src/lsp/working_files.cpp b/graphics/asymptote/LspCpp/src/lsp/working_files.cpp
index 4eb4b29053..a77f763cda 100644
--- a/graphics/asymptote/LspCpp/src/lsp/working_files.cpp
+++ b/graphics/asymptote/LspCpp/src/lsp/working_files.cpp
@@ -8,167 +8,165 @@
using namespace lsp;
struct WorkingFilesData
{
- std::map<AbsolutePath, std::shared_ptr<WorkingFile> > files;
- std::mutex files_mutex; // Protects |d_ptr->files|.
+ std::map<AbsolutePath, std::shared_ptr<WorkingFile>> files;
+ std::mutex files_mutex; // Protects |d_ptr->files|.
};
-WorkingFile::WorkingFile(WorkingFiles& _parent, const AbsolutePath& filename,
- const std::string& buffer_content)
- : filename(filename), directory(filename), parent(_parent), counter(0), buffer_content(buffer_content)
+WorkingFile::WorkingFile(WorkingFiles& _parent, AbsolutePath const& filename, std::string const& buffer_content)
+ : filename(filename), directory(filename), parent(_parent), counter(0), buffer_content(buffer_content)
{
- directory = Directory(GetDirName(filename.path));
+ directory = Directory(GetDirName(filename.path));
}
-WorkingFile::WorkingFile(WorkingFiles& _parent, const AbsolutePath& filename,
- std::string&& buffer_content)
- : filename(filename), directory(filename), parent(_parent), counter(0), buffer_content(buffer_content)
+WorkingFile::WorkingFile(WorkingFiles& _parent, AbsolutePath const& filename, std::string&& buffer_content)
+ : filename(filename), directory(filename), parent(_parent), counter(0), buffer_content(buffer_content)
{
directory = Directory(GetDirName(filename.path));
}
-WorkingFiles::WorkingFiles():d_ptr(new WorkingFilesData())
+WorkingFiles::WorkingFiles() : d_ptr(new WorkingFilesData())
{
}
WorkingFiles::~WorkingFiles()
{
delete d_ptr;
-
}
-
-
-void WorkingFiles::CloseFilesInDirectory(const std::vector<Directory>& directories)
+void WorkingFiles::CloseFilesInDirectory(std::vector<Directory> const& directories)
{
std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
std::vector<AbsolutePath> files_to_be_delete;
- for(auto& it : d_ptr->files)
+ for (auto& it : d_ptr->files)
{
for (auto& dir : directories)
{
- if (it.second->directory == dir) {
+ if (it.second->directory == dir)
+ {
files_to_be_delete.emplace_back(it.first);
}
}
}
- for(auto& it : files_to_be_delete)
+ for (auto& it : files_to_be_delete)
{
d_ptr->files.erase(it);
}
}
-
-
-
-std::shared_ptr<WorkingFile> WorkingFiles::GetFileByFilename(const AbsolutePath& filename) {
- std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
- return GetFileByFilenameNoLock(filename);
+std::shared_ptr<WorkingFile> WorkingFiles::GetFileByFilename(AbsolutePath const& filename)
+{
+ std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+ return GetFileByFilenameNoLock(filename);
}
-std::shared_ptr<WorkingFile> WorkingFiles::GetFileByFilenameNoLock(
- const AbsolutePath& filename) {
- const auto findIt = d_ptr->files.find(filename);
- if ( findIt != d_ptr->files.end())
+std::shared_ptr<WorkingFile> WorkingFiles::GetFileByFilenameNoLock(AbsolutePath const& filename)
+{
+ auto const findIt = d_ptr->files.find(filename);
+ if (findIt != d_ptr->files.end())
{
return findIt->second;
}
- return nullptr;
+ return nullptr;
}
+std::shared_ptr<WorkingFile> WorkingFiles::OnOpen(lsTextDocumentItem& open)
+{
+ std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+ AbsolutePath filename = open.uri.GetAbsolutePath();
-std::shared_ptr<WorkingFile> WorkingFiles::OnOpen( lsTextDocumentItem& open) {
- std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
-
- AbsolutePath filename = open.uri.GetAbsolutePath();
-
- // The file may already be open.
- if (auto file = GetFileByFilenameNoLock(filename)) {
- file->version = open.version;
- file->buffer_content.swap(open.text);
+ // The file may already be open.
+ if (auto file = GetFileByFilenameNoLock(filename))
+ {
+ file->version = open.version;
+ file->buffer_content.swap(open.text);
- return file;
- }
+ return file;
+ }
- const auto& it = d_ptr->files.insert({ filename,std::make_shared<WorkingFile>(*this,filename, std::move(open.text)) });
- return it.first->second;
+ auto const& it =
+ d_ptr->files.insert({filename, std::make_shared<WorkingFile>(*this, filename, std::move(open.text))});
+ return it.first->second;
}
+std::shared_ptr<WorkingFile> WorkingFiles::OnChange(lsTextDocumentDidChangeParams const& change)
+{
+ std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
-std::shared_ptr<WorkingFile> WorkingFiles::OnChange(const lsTextDocumentDidChangeParams& change) {
- std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
-
- AbsolutePath filename = change.textDocument.uri.GetAbsolutePath();
- auto file = GetFileByFilenameNoLock(filename);
- if (!file) {
- return {};
- }
-
- if (change.textDocument.version)
- file->version = *change.textDocument.version;
- file->counter.fetch_add(1, std::memory_order_relaxed);
- for (const lsTextDocumentContentChangeEvent& diff : change.contentChanges) {
- // Per the spec replace everything if the rangeLength and range are not set.
- // See https://github.com/Microsoft/language-server-protocol/issues/9.
- if (!diff.range) {
- file->buffer_content = diff.text;
-
- } else {
- int start_offset =
- GetOffsetForPosition(diff.range->start, file->buffer_content);
- // Ignore TextDocumentContentChangeEvent.rangeLength which causes trouble
- // when UTF-16 surrogate pairs are used.
- int end_offset =
- GetOffsetForPosition(diff.range->end, file->buffer_content);
- file->buffer_content.replace(file->buffer_content.begin() + start_offset,
- file->buffer_content.begin() + end_offset,
- diff.text);
+ AbsolutePath filename = change.textDocument.uri.GetAbsolutePath();
+ auto file = GetFileByFilenameNoLock(filename);
+ if (!file)
+ {
+ return {};
+ }
+ if (change.textDocument.version)
+ {
+ file->version = *change.textDocument.version;
+ }
+ file->counter.fetch_add(1, std::memory_order_relaxed);
+ for (lsTextDocumentContentChangeEvent const& diff : change.contentChanges)
+ {
+ // Per the spec replace everything if the rangeLength and range are not set.
+ // See https://github.com/Microsoft/language-server-protocol/issues/9.
+ if (!diff.range)
+ {
+ file->buffer_content = diff.text;
+ }
+ else
+ {
+ int start_offset = GetOffsetForPosition(diff.range->start, file->buffer_content);
+ // Ignore TextDocumentContentChangeEvent.rangeLength which causes trouble
+ // when UTF-16 surrogate pairs are used.
+ int end_offset = GetOffsetForPosition(diff.range->end, file->buffer_content);
+ file->buffer_content.replace(
+ file->buffer_content.begin() + start_offset, file->buffer_content.begin() + end_offset, diff.text
+ );
+ }
}
- }
- return file;
+ return file;
}
-bool WorkingFiles::OnClose(const lsTextDocumentIdentifier& close) {
- std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
-
- AbsolutePath filename = close.uri.GetAbsolutePath();
- const auto findIt = d_ptr->files.find(filename);
- if( findIt != d_ptr->files.end())
- {
- d_ptr->files.erase(findIt);
- return true;
- }
- return false;
+bool WorkingFiles::OnClose(lsTextDocumentIdentifier const& close)
+{
+ std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+
+ AbsolutePath filename = close.uri.GetAbsolutePath();
+ auto const findIt = d_ptr->files.find(filename);
+ if (findIt != d_ptr->files.end())
+ {
+ d_ptr->files.erase(findIt);
+ return true;
+ }
+ return false;
}
-std::shared_ptr<WorkingFile> WorkingFiles::OnSave(const lsTextDocumentIdentifier& _save)
+std::shared_ptr<WorkingFile> WorkingFiles::OnSave(lsTextDocumentIdentifier const& _save)
{
std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
AbsolutePath filename = _save.uri.GetAbsolutePath();
- const auto findIt = d_ptr->files.find(filename);
+ auto const findIt = d_ptr->files.find(filename);
if (findIt != d_ptr->files.end())
{
std::shared_ptr<WorkingFile>& file = findIt->second;
lsp::WriteToFile(file->filename, file->GetContentNoLock());
return findIt->second;
}
- return {};
-
+ return {};
}
-bool WorkingFiles::GetFileBufferContent(std::shared_ptr<WorkingFile>&file, std::string& out)
+bool WorkingFiles::GetFileBufferContent(std::shared_ptr<WorkingFile>& file, std::string& out)
{
std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
if (file)
{
out = file->buffer_content;
- return true;
+ return true;
}
- return false;
+ return false;
}
bool WorkingFiles::GetFileBufferContent(std::shared_ptr<WorkingFile>& file, std::wstring& out)
{
@@ -176,11 +174,12 @@ bool WorkingFiles::GetFileBufferContent(std::shared_ptr<WorkingFile>& file, std:
if (file)
{
out = lsp::s2ws(file->buffer_content);
- return true;
+ return true;
}
- return false;
+ return false;
}
-void WorkingFiles::Clear() {
+void WorkingFiles::Clear()
+{
std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
d_ptr->files.clear();
}
diff --git a/graphics/asymptote/LspCpp/support/cmake/JoinPaths.cmake b/graphics/asymptote/LspCpp/support/cmake/JoinPaths.cmake
new file mode 100755
index 0000000000..32d6d6685c
--- /dev/null
+++ b/graphics/asymptote/LspCpp/support/cmake/JoinPaths.cmake
@@ -0,0 +1,26 @@
+# This module provides function for joining paths
+# known from from most languages
+#
+# Original license:
+# SPDX-License-Identifier: (MIT OR CC0-1.0)
+# Explicit permission given to distribute this module under
+# the terms of the project as described in /LICENSE.rst.
+# Copyright 2020 Jan Tojnar
+# https://github.com/jtojnar/cmake-snips
+#
+# Modelled after Python’s os.path.join
+# https://docs.python.org/3.7/library/os.path.html#os.path.join
+# Windows not supported
+function(join_paths joined_path first_path_segment)
+ set(temp_path "${first_path_segment}")
+ foreach(current_segment IN LISTS ARGN)
+ if(NOT ("${current_segment}" STREQUAL ""))
+ if(IS_ABSOLUTE "${current_segment}")
+ set(temp_path "${current_segment}")
+ else()
+ set(temp_path "${temp_path}/${current_segment}")
+ endif()
+ endif()
+ endforeach()
+ set(${joined_path} "${temp_path}" PARENT_SCOPE)
+endfunction()
diff --git a/graphics/asymptote/LspCpp/support/cmake/distclean.cmake b/graphics/asymptote/LspCpp/support/cmake/distclean.cmake
new file mode 100644
index 0000000000..8e814a170c
--- /dev/null
+++ b/graphics/asymptote/LspCpp/support/cmake/distclean.cmake
@@ -0,0 +1,80 @@
+# This CMake script will delete build directories and files to bring the
+# package back to it's distribution state
+
+# We want to start from the top of the source dir, so if we are in build
+# we want to start one directory up
+GET_FILENAME_COMPONENT(BASEDIR ${CMAKE_SOURCE_DIR} NAME)
+IF(${BASEDIR} STREQUAL "build")
+ SET(TOPDIR "${CMAKE_SOURCE_DIR}/..")
+ELSE()
+ SET(TOPDIR "${CMAKE_SOURCE_DIR}")
+ENDIF()
+
+MACRO(GET_PARENT_DIRECTORIES search_string return_list grandparents)
+ FILE(GLOB_RECURSE new_list ${search_string})
+ SET(dir_list "")
+ FOREACH(file_path ${new_list})
+ GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
+ # Remove an extra directory component to return grandparent
+ IF(${grandparents})
+ # Tack on a fake extension to trick CMake into removing a second
+ # path component
+ SET(dir_path "${dir_path}.tmp")
+ GET_FILENAME_COMPONENT(dir_path ${dir_path} PATH)
+ ENDIF(${grandparents})
+ SET(dir_list ${dir_list} ${dir_path})
+ ENDFOREACH()
+ LIST(REMOVE_DUPLICATES dir_list)
+ SET(${return_list} ${dir_list})
+ENDMACRO()
+
+# Find directories and files that we will want to remove
+FILE(GLOB EGGS "${TOPDIR}/*.egg-info" "${TOPDIR}/python/*.egg-info")
+FILE(GLOB PYCACHE "${TOPDIR}/python/npspec/tests/__pycache__")
+FILE(GLOB_RECURSE PYC "${TOPDIR}/*.pyc")
+FILE(GLOB_RECURSE CBP "${TOPDIR}/*.cbp")
+FILE(GLOB PYBUILDTEMP "${TOPDIR}/build/temp*")
+FILE(GLOB PYBUILDLIB "${TOPDIR}/build/lib*")
+FILE(GLOB PYBUILDBDIST "${TOPDIR}/build/bdist*")
+FILE(GLOB_RECURSE CMAKECACHE "${TOPDIR}/*CMakeCache.txt")
+FILE(GLOB_RECURSE CMAKEINSTALL "${TOPDIR}/*cmake_install.cmake")
+FILE(GLOB_RECURSE MAKEFILE "${TOPDIR}/*Makefile")
+FILE(GLOB_RECURSE CMAKETESTFILES "${TOPDIR}/*CTestTestfile.cmake")
+FILE(GLOB TOPDIRECTORIES "${TOPDIR}/lib"
+ "${TOPDIR}/dist"
+ "${TOPDIR}/test"
+)
+# CMake has trouble finding directories recursively, so locate these
+# files and then save the parent directory of the files
+GET_PARENT_DIRECTORIES(Makefile.cmake CMAKEFILES 0)
+GET_PARENT_DIRECTORIES(LastTest.log CMAKETESTING 1)
+
+# Place these files and directories into a list
+SET(DEL ${TOPDIRECTORIES}
+ ${EGGS}
+ ${PYCACHE}
+ ${PYC}
+ ${CBP}
+ ${PYBUILDTEMP}
+ ${PYBUILDLIB}
+ ${PYBUILDBDIST}
+ ${CMAKECACHE}
+ ${CMAKEINSTALL}
+ ${MAKEFILE}
+ ${CMAKEFILES}
+ ${CMAKETESTING}
+ ${CMAKETESTFILES}
+)
+
+# If we are not in the build dir, delete that as well
+IF(NOT (${BASEDIR} STREQUAL "build"))
+ FILE(GLOB BUILD "${TOPDIR}/build")
+ SET(DEL ${DEL} ${BUILD})
+ENDIF()
+
+# Loop over the directories and delete each one
+FOREACH(D ${DEL})
+ IF(EXISTS ${D})
+ FILE(REMOVE_RECURSE ${D})
+ ENDIF()
+ENDFOREACH()
diff --git a/graphics/asymptote/LspCpp/support/cmake/lspcpp-config.cmake.in b/graphics/asymptote/LspCpp/support/cmake/lspcpp-config.cmake.in
new file mode 100755
index 0000000000..2fbacadd52
--- /dev/null
+++ b/graphics/asymptote/LspCpp/support/cmake/lspcpp-config.cmake.in
@@ -0,0 +1,7 @@
+@PACKAGE_INIT@
+
+if (NOT TARGET lspcpp::lspcpp)
+ include(${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake)
+endif ()
+
+check_required_components(lspcpp)
diff --git a/graphics/asymptote/LspCpp/support/cmake/lspcpp.pc.in b/graphics/asymptote/LspCpp/support/cmake/lspcpp.pc.in
new file mode 100755
index 0000000000..9502de0860
--- /dev/null
+++ b/graphics/asymptote/LspCpp/support/cmake/lspcpp.pc.in
@@ -0,0 +1,11 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=@CMAKE_INSTALL_PREFIX@
+libdir=@libdir_for_pc_file@
+includedir=@includedir_for_pc_file@
+
+Name: lsp
+Description: A Language Server Protocol implementation in C++
+Version: @LIB_VERSION_STRING@
+Libs: -L${libdir} -l@LSPCPP_LIB_NAME@
+Cflags: -I${includedir}
+
diff --git a/graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/CMakeDirectoryInformation.cmake b/graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/CMakeDirectoryInformation.cmake
index 10947361b6..c1ed3dc503 100644
--- a/graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/CMakeDirectoryInformation.cmake
+++ b/graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/CMakeDirectoryInformation.cmake
@@ -1,9 +1,9 @@
# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 3.28
+# Generated by "Unix Makefiles" Generator, CMake Version 3.30
# Relative path conversion top directories.
-set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/usr/local/src/asymptote-2.90/LspCpp")
-set(CMAKE_RELATIVE_PATH_TOP_BINARY "/usr/local/src/asymptote-2.90/LspCpp")
+set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/usr/local/src/asymptote-3.00/LspCpp")
+set(CMAKE_RELATIVE_PATH_TOP_BINARY "/usr/local/src/asymptote-3.00/LspCpp")
# Force unix paths in dependencies.
set(CMAKE_FORCE_UNIX_PATHS 1)
diff --git a/graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/doc.dir/build.make b/graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/doc.dir/build.make
index cd14a44b53..9fd8216ed0 100644
--- a/graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/doc.dir/build.make
+++ b/graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/doc.dir/build.make
@@ -1,5 +1,5 @@
# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 3.28
+# Generated by "Unix Makefiles" Generator, CMake Version 3.30
# Delete rule output on recipe failure.
.DELETE_ON_ERROR:
@@ -56,10 +56,10 @@ RM = /usr/bin/cmake -E rm -f
EQUALS = =
# The top-level source directory on which CMake was run.
-CMAKE_SOURCE_DIR = /usr/local/src/asymptote-2.90/LspCpp
+CMAKE_SOURCE_DIR = /usr/local/src/asymptote-3.00/LspCpp
# The top-level build directory on which CMake was run.
-CMAKE_BINARY_DIR = /usr/local/src/asymptote-2.90/LspCpp
+CMAKE_BINARY_DIR = /usr/local/src/asymptote-3.00/LspCpp
# Utility rule file for doc.
@@ -70,8 +70,8 @@ include third_party/uri/CMakeFiles/doc.dir/compiler_depend.make
include third_party/uri/CMakeFiles/doc.dir/progress.make
third_party/uri/CMakeFiles/doc:
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/usr/local/src/asymptote-2.90/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generating API documentation with Doxygen"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri && /bin/doxygen /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/Doxyfile
+ @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/usr/local/src/asymptote-3.00/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generating API documentation with Doxygen"
+ cd /usr/local/src/asymptote-3.00/LspCpp/third_party/uri && /bin/doxygen /usr/local/src/asymptote-3.00/LspCpp/third_party/uri/Doxyfile
doc: third_party/uri/CMakeFiles/doc
doc: third_party/uri/CMakeFiles/doc.dir/build.make
@@ -82,10 +82,10 @@ third_party/uri/CMakeFiles/doc.dir/build: doc
.PHONY : third_party/uri/CMakeFiles/doc.dir/build
third_party/uri/CMakeFiles/doc.dir/clean:
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri && $(CMAKE_COMMAND) -P CMakeFiles/doc.dir/cmake_clean.cmake
+ cd /usr/local/src/asymptote-3.00/LspCpp/third_party/uri && $(CMAKE_COMMAND) -P CMakeFiles/doc.dir/cmake_clean.cmake
.PHONY : third_party/uri/CMakeFiles/doc.dir/clean
third_party/uri/CMakeFiles/doc.dir/depend:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /usr/local/src/asymptote-2.90/LspCpp /usr/local/src/asymptote-2.90/LspCpp/third_party/uri /usr/local/src/asymptote-2.90/LspCpp /usr/local/src/asymptote-2.90/LspCpp/third_party/uri /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/CMakeFiles/doc.dir/DependInfo.cmake "--color=$(COLOR)"
+ cd /usr/local/src/asymptote-3.00/LspCpp && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /usr/local/src/asymptote-3.00/LspCpp /usr/local/src/asymptote-3.00/LspCpp/third_party/uri /usr/local/src/asymptote-3.00/LspCpp /usr/local/src/asymptote-3.00/LspCpp/third_party/uri /usr/local/src/asymptote-3.00/LspCpp/third_party/uri/CMakeFiles/doc.dir/DependInfo.cmake "--color=$(COLOR)"
.PHONY : third_party/uri/CMakeFiles/doc.dir/depend
diff --git a/graphics/asymptote/LspCpp/third_party/uri/Doxyfile b/graphics/asymptote/LspCpp/third_party/uri/Doxyfile
index d5d97f4b56..e162ad4633 100644
--- a/graphics/asymptote/LspCpp/third_party/uri/Doxyfile
+++ b/graphics/asymptote/LspCpp/third_party/uri/Doxyfile
@@ -128,7 +128,7 @@ FULL_PATH_NAMES = YES
# If left blank the directory from which doxygen is run is used as the
# path to strip.
-STRIP_FROM_PATH = /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/
+STRIP_FROM_PATH = /usr/local/src/asymptote-3.00/LspCpp/third_party/uri/include/
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
# the path mentioned in the documentation of a class, which tells
@@ -626,7 +626,7 @@ WARN_LOGFILE =
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
-INPUT = /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include
+INPUT = /usr/local/src/asymptote-3.00/LspCpp/third_party/uri/include
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -658,7 +658,7 @@ RECURSIVE = YES
# Note that relative paths are relative to the directory from which doxygen is
# run.
-EXCLUDE = /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail
+EXCLUDE = /usr/local/src/asymptote-3.00/LspCpp/third_party/uri/include/network/uri/detail
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
@@ -821,7 +821,7 @@ COLS_IN_ALPHA_INDEX = 5
# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
# should be ignored while generating the index headers.
-IGNORE_PREFIX = /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/uri/src/
+IGNORE_PREFIX = /usr/local/src/asymptote-3.00/LspCpp/third_party/uri/uri/src/
#---------------------------------------------------------------------------
# configuration options related to the HTML output
diff --git a/graphics/asymptote/LspCpp/third_party/uri/Makefile b/graphics/asymptote/LspCpp/third_party/uri/Makefile
deleted file mode 100644
index 508a0f8b29..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/Makefile
+++ /dev/null
@@ -1,207 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 3.28
-
-# Default target executed when no arguments are given to make.
-default_target: all
-.PHONY : default_target
-
-# Allow only one "make -f Makefile2" at a time, but pass parallelism.
-.NOTPARALLEL:
-
-#=============================================================================
-# Special targets provided by cmake.
-
-# Disable implicit rules so canonical targets will work.
-.SUFFIXES:
-
-# Disable VCS-based implicit rules.
-% : %,v
-
-# Disable VCS-based implicit rules.
-% : RCS/%
-
-# Disable VCS-based implicit rules.
-% : RCS/%,v
-
-# Disable VCS-based implicit rules.
-% : SCCS/s.%
-
-# Disable VCS-based implicit rules.
-% : s.%
-
-.SUFFIXES: .hpux_make_needs_suffix_list
-
-# Produce verbose output by default.
-VERBOSE = 1
-
-# Command-line flag to silence nested $(MAKE).
-$(VERBOSE)MAKESILENT = -s
-
-#Suppress display of executed commands.
-$(VERBOSE).SILENT:
-
-# A target that is always out of date.
-cmake_force:
-.PHONY : cmake_force
-
-#=============================================================================
-# Set environment variables for the build.
-
-# The shell in which to execute make rules.
-SHELL = /bin/sh
-
-# The CMake executable.
-CMAKE_COMMAND = /usr/bin/cmake
-
-# The command to remove a file.
-RM = /usr/bin/cmake -E rm -f
-
-# Escaping for special characters.
-EQUALS = =
-
-# The top-level source directory on which CMake was run.
-CMAKE_SOURCE_DIR = /usr/local/src/asymptote-2.90/LspCpp
-
-# The top-level build directory on which CMake was run.
-CMAKE_BINARY_DIR = /usr/local/src/asymptote-2.90/LspCpp
-
-#=============================================================================
-# Targets provided globally by CMake.
-
-# Special rule for the target edit_cache
-edit_cache:
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..."
- /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
-.PHONY : edit_cache
-
-# Special rule for the target edit_cache
-edit_cache/fast: edit_cache
-.PHONY : edit_cache/fast
-
-# Special rule for the target rebuild_cache
-rebuild_cache:
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
- /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
-.PHONY : rebuild_cache
-
-# Special rule for the target rebuild_cache
-rebuild_cache/fast: rebuild_cache
-.PHONY : rebuild_cache/fast
-
-# Special rule for the target list_install_components
-list_install_components:
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Unspecified\""
-.PHONY : list_install_components
-
-# Special rule for the target list_install_components
-list_install_components/fast: list_install_components
-.PHONY : list_install_components/fast
-
-# Special rule for the target install
-install: preinstall
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."
- /usr/bin/cmake -P cmake_install.cmake
-.PHONY : install
-
-# Special rule for the target install
-install/fast: preinstall/fast
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."
- /usr/bin/cmake -P cmake_install.cmake
-.PHONY : install/fast
-
-# Special rule for the target install/local
-install/local: preinstall
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..."
- /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
-.PHONY : install/local
-
-# Special rule for the target install/local
-install/local/fast: preinstall/fast
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..."
- /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
-.PHONY : install/local/fast
-
-# Special rule for the target install/strip
-install/strip: preinstall
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..."
- /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
-.PHONY : install/strip
-
-# Special rule for the target install/strip
-install/strip/fast: preinstall/fast
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..."
- /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
-.PHONY : install/strip/fast
-
-# The main all target
-all: cmake_check_build_system
- cd /usr/local/src/asymptote-2.90/LspCpp && $(CMAKE_COMMAND) -E cmake_progress_start /usr/local/src/asymptote-2.90/LspCpp/CMakeFiles /usr/local/src/asymptote-2.90/LspCpp/third_party/uri//CMakeFiles/progress.marks
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 third_party/uri/all
- $(CMAKE_COMMAND) -E cmake_progress_start /usr/local/src/asymptote-2.90/LspCpp/CMakeFiles 0
-.PHONY : all
-
-# The main clean target
-clean:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 third_party/uri/clean
-.PHONY : clean
-
-# The main clean target
-clean/fast: clean
-.PHONY : clean/fast
-
-# Prepare targets for installation.
-preinstall: all
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 third_party/uri/preinstall
-.PHONY : preinstall
-
-# Prepare targets for installation.
-preinstall/fast:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 third_party/uri/preinstall
-.PHONY : preinstall/fast
-
-# clear depends
-depend:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
-.PHONY : depend
-
-# Convenience name for target.
-third_party/uri/CMakeFiles/doc.dir/rule:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 third_party/uri/CMakeFiles/doc.dir/rule
-.PHONY : third_party/uri/CMakeFiles/doc.dir/rule
-
-# Convenience name for target.
-doc: third_party/uri/CMakeFiles/doc.dir/rule
-.PHONY : doc
-
-# fast build rule for target.
-doc/fast:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/CMakeFiles/doc.dir/build.make third_party/uri/CMakeFiles/doc.dir/build
-.PHONY : doc/fast
-
-# Help Target
-help:
- @echo "The following are some of the valid targets for this Makefile:"
- @echo "... all (the default if no target is provided)"
- @echo "... clean"
- @echo "... depend"
- @echo "... edit_cache"
- @echo "... install"
- @echo "... install/local"
- @echo "... install/strip"
- @echo "... list_install_components"
- @echo "... rebuild_cache"
- @echo "... doc"
-.PHONY : help
-
-
-
-#=============================================================================
-# Special targets to cleanup operation of make.
-
-# Special rule to run CMake to check the build system integrity.
-# No rule that depends on this can have commands that come from listfiles
-# because they might be regenerated.
-cmake_check_build_system:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
-.PHONY : cmake_check_build_system
-
diff --git a/graphics/asymptote/LspCpp/third_party/uri/cmake_install.cmake b/graphics/asymptote/LspCpp/third_party/uri/cmake_install.cmake
deleted file mode 100644
index b0d4be5b79..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/cmake_install.cmake
+++ /dev/null
@@ -1,54 +0,0 @@
-# Install script for directory: /usr/local/src/asymptote-2.90/LspCpp/third_party/uri
-
-# Set the install prefix
-if(NOT DEFINED CMAKE_INSTALL_PREFIX)
- set(CMAKE_INSTALL_PREFIX "/usr/local")
-endif()
-string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
-
-# Set the install configuration name.
-if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
- if(BUILD_TYPE)
- string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
- CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
- else()
- set(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo")
- endif()
- message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
-endif()
-
-# Set the component getting installed.
-if(NOT CMAKE_INSTALL_COMPONENT)
- if(COMPONENT)
- message(STATUS "Install component: \"${COMPONENT}\"")
- set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
- else()
- set(CMAKE_INSTALL_COMPONENT)
- endif()
-endif()
-
-# Install shared libraries without execute permission?
-if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
- set(CMAKE_INSTALL_SO_NO_EXE "0")
-endif()
-
-# Is this installation the result of a crosscompile?
-if(NOT DEFINED CMAKE_CROSSCOMPILING)
- set(CMAKE_CROSSCOMPILING "FALSE")
-endif()
-
-# Set default install directory permissions.
-if(NOT DEFINED CMAKE_OBJDUMP)
- set(CMAKE_OBJDUMP "/bin/objdump")
-endif()
-
-if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT)
- file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/." TYPE DIRECTORY FILES "/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include")
-endif()
-
-if(NOT CMAKE_INSTALL_LOCAL_ONLY)
- # Include the install script for each subdirectory.
- include("/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/cmake_install.cmake")
-
-endif()
-
diff --git a/graphics/asymptote/LspCpp/third_party/uri/include/network/uri/detail/translate.hpp b/graphics/asymptote/LspCpp/third_party/uri/include/network/uri/detail/translate.hpp
index 7566c258e1..7e1949fe88 100644
--- a/graphics/asymptote/LspCpp/third_party/uri/include/network/uri/detail/translate.hpp
+++ b/graphics/asymptote/LspCpp/third_party/uri/include/network/uri/detail/translate.hpp
@@ -7,6 +7,7 @@
#define NETWORK_URI_DETAIL_TRANSLATE_INC
#include <string>
+#include <algorithm>
namespace network {
namespace detail {
@@ -41,7 +42,14 @@ struct translate_impl<const char[N]> {
template <>
struct translate_impl<std::wstring> {
std::string operator()(const std::wstring &source) const {
- return std::string(std::begin(source), std::end(source));
+ std::string ret(source.length(), 0);
+ std::transform(
+ source.begin(),
+ source.end(),
+ ret.begin(),
+ [](wchar_t ch) { return static_cast<char>(ch); }
+ );
+ return ret;
}
};
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/CMakeDirectoryInformation.cmake b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/CMakeDirectoryInformation.cmake
deleted file mode 100644
index 10947361b6..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/CMakeDirectoryInformation.cmake
+++ /dev/null
@@ -1,16 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 3.28
-
-# Relative path conversion top directories.
-set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/usr/local/src/asymptote-2.90/LspCpp")
-set(CMAKE_RELATIVE_PATH_TOP_BINARY "/usr/local/src/asymptote-2.90/LspCpp")
-
-# Force unix paths in dependencies.
-set(CMAKE_FORCE_UNIX_PATHS 1)
-
-
-# The C and CXX include file regular expressions for this directory.
-set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$")
-set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$")
-set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN})
-set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN})
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/DependInfo.cmake b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/DependInfo.cmake
deleted file mode 100644
index 594e10e458..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/DependInfo.cmake
+++ /dev/null
@@ -1,30 +0,0 @@
-
-# Consider dependencies only in project.
-set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF)
-
-# The set of languages for which implicit dependencies are needed:
-set(CMAKE_DEPENDS_LANGUAGES
- )
-
-# The set of dependency files which are needed:
-set(CMAKE_DEPENDS_DEPENDENCY_FILES
- "/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp" "third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o" "gcc" "third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o.d"
- "/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_normalize.cpp" "third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o" "gcc" "third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o.d"
- "/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse.cpp" "third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o" "gcc" "third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o.d"
- "/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse_authority.cpp" "third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o" "gcc" "third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o.d"
- "/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_resolve.cpp" "third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o" "gcc" "third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o.d"
- "/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri.cpp" "third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o" "gcc" "third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o.d"
- "/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri_builder.cpp" "third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o" "gcc" "third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o.d"
- "/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri_errors.cpp" "third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o" "gcc" "third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o.d"
- )
-
-# Targets to which this target links which contain Fortran sources.
-set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES
- )
-
-# Targets to which this target links which contain Fortran sources.
-set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES
- )
-
-# Fortran module output directory.
-set(CMAKE_Fortran_TARGET_MODULE_DIR "")
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/build.make b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/build.make
deleted file mode 100644
index feab93c641..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/build.make
+++ /dev/null
@@ -1,226 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 3.28
-
-# Delete rule output on recipe failure.
-.DELETE_ON_ERROR:
-
-#=============================================================================
-# Special targets provided by cmake.
-
-# Disable implicit rules so canonical targets will work.
-.SUFFIXES:
-
-# Disable VCS-based implicit rules.
-% : %,v
-
-# Disable VCS-based implicit rules.
-% : RCS/%
-
-# Disable VCS-based implicit rules.
-% : RCS/%,v
-
-# Disable VCS-based implicit rules.
-% : SCCS/s.%
-
-# Disable VCS-based implicit rules.
-% : s.%
-
-.SUFFIXES: .hpux_make_needs_suffix_list
-
-# Produce verbose output by default.
-VERBOSE = 1
-
-# Command-line flag to silence nested $(MAKE).
-$(VERBOSE)MAKESILENT = -s
-
-#Suppress display of executed commands.
-$(VERBOSE).SILENT:
-
-# A target that is always out of date.
-cmake_force:
-.PHONY : cmake_force
-
-#=============================================================================
-# Set environment variables for the build.
-
-# The shell in which to execute make rules.
-SHELL = /bin/sh
-
-# The CMake executable.
-CMAKE_COMMAND = /usr/bin/cmake
-
-# The command to remove a file.
-RM = /usr/bin/cmake -E rm -f
-
-# Escaping for special characters.
-EQUALS = =
-
-# The top-level source directory on which CMake was run.
-CMAKE_SOURCE_DIR = /usr/local/src/asymptote-2.90/LspCpp
-
-# The top-level build directory on which CMake was run.
-CMAKE_BINARY_DIR = /usr/local/src/asymptote-2.90/LspCpp
-
-# Include any dependencies generated for this target.
-include third_party/uri/src/CMakeFiles/network-uri.dir/depend.make
-# Include any dependencies generated by the compiler for this target.
-include third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.make
-
-# Include the progress variables for this target.
-include third_party/uri/src/CMakeFiles/network-uri.dir/progress.make
-
-# Include the compile flags for this target's objects.
-include third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
-third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o: third_party/uri/src/uri.cpp
-third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/usr/local/src/asymptote-2.90/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o -MF CMakeFiles/network-uri.dir/uri.cpp.o.d -o CMakeFiles/network-uri.dir/uri.cpp.o -c /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri.cpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.i: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/network-uri.dir/uri.cpp.i"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri.cpp > CMakeFiles/network-uri.dir/uri.cpp.i
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.s: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/network-uri.dir/uri.cpp.s"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri.cpp -o CMakeFiles/network-uri.dir/uri.cpp.s
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o: third_party/uri/src/uri_builder.cpp
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/usr/local/src/asymptote-2.90/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o -MF CMakeFiles/network-uri.dir/uri_builder.cpp.o.d -o CMakeFiles/network-uri.dir/uri_builder.cpp.o -c /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri_builder.cpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.i: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/network-uri.dir/uri_builder.cpp.i"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri_builder.cpp > CMakeFiles/network-uri.dir/uri_builder.cpp.i
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.s: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/network-uri.dir/uri_builder.cpp.s"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri_builder.cpp -o CMakeFiles/network-uri.dir/uri_builder.cpp.s
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o: third_party/uri/src/uri_errors.cpp
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/usr/local/src/asymptote-2.90/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o -MF CMakeFiles/network-uri.dir/uri_errors.cpp.o.d -o CMakeFiles/network-uri.dir/uri_errors.cpp.o -c /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri_errors.cpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.i: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/network-uri.dir/uri_errors.cpp.i"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri_errors.cpp > CMakeFiles/network-uri.dir/uri_errors.cpp.i
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.s: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/network-uri.dir/uri_errors.cpp.s"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri_errors.cpp -o CMakeFiles/network-uri.dir/uri_errors.cpp.s
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o: third_party/uri/src/detail/uri_parse.cpp
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/usr/local/src/asymptote-2.90/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o -MF CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o.d -o CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o -c /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse.cpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.i: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/network-uri.dir/detail/uri_parse.cpp.i"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse.cpp > CMakeFiles/network-uri.dir/detail/uri_parse.cpp.i
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.s: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/network-uri.dir/detail/uri_parse.cpp.s"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse.cpp -o CMakeFiles/network-uri.dir/detail/uri_parse.cpp.s
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o: third_party/uri/src/detail/uri_parse_authority.cpp
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/usr/local/src/asymptote-2.90/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o -MF CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o.d -o CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o -c /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse_authority.cpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.i: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.i"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse_authority.cpp > CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.i
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.s: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.s"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse_authority.cpp -o CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.s
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o: third_party/uri/src/detail/uri_advance_parts.cpp
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/usr/local/src/asymptote-2.90/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o -MF CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o.d -o CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o -c /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.i: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.i"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp > CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.i
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.s: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.s"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp -o CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.s
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o: third_party/uri/src/detail/uri_normalize.cpp
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/usr/local/src/asymptote-2.90/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o -MF CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o.d -o CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o -c /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_normalize.cpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.i: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.i"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_normalize.cpp > CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.i
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.s: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.s"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_normalize.cpp -o CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.s
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o: third_party/uri/src/detail/uri_resolve.cpp
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o: third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/usr/local/src/asymptote-2.90/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o -MF CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o.d -o CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o -c /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_resolve.cpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.i: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.i"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_resolve.cpp > CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.i
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.s: cmake_force
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.s"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && /bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_resolve.cpp -o CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.s
-
-# Object files for target network-uri
-network__uri_OBJECTS = \
-"CMakeFiles/network-uri.dir/uri.cpp.o" \
-"CMakeFiles/network-uri.dir/uri_builder.cpp.o" \
-"CMakeFiles/network-uri.dir/uri_errors.cpp.o" \
-"CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o" \
-"CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o" \
-"CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o" \
-"CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o" \
-"CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o"
-
-# External object files for target network-uri
-network__uri_EXTERNAL_OBJECTS =
-
-third_party/uri/src/libnetwork-uri.a: third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o
-third_party/uri/src/libnetwork-uri.a: third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o
-third_party/uri/src/libnetwork-uri.a: third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o
-third_party/uri/src/libnetwork-uri.a: third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o
-third_party/uri/src/libnetwork-uri.a: third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o
-third_party/uri/src/libnetwork-uri.a: third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o
-third_party/uri/src/libnetwork-uri.a: third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o
-third_party/uri/src/libnetwork-uri.a: third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o
-third_party/uri/src/libnetwork-uri.a: third_party/uri/src/CMakeFiles/network-uri.dir/build.make
-third_party/uri/src/libnetwork-uri.a: third_party/uri/src/CMakeFiles/network-uri.dir/link.txt
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/usr/local/src/asymptote-2.90/LspCpp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Linking CXX static library libnetwork-uri.a"
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && $(CMAKE_COMMAND) -P CMakeFiles/network-uri.dir/cmake_clean_target.cmake
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/network-uri.dir/link.txt --verbose=$(VERBOSE)
-
-# Rule to build all files generated by this target.
-third_party/uri/src/CMakeFiles/network-uri.dir/build: third_party/uri/src/libnetwork-uri.a
-.PHONY : third_party/uri/src/CMakeFiles/network-uri.dir/build
-
-third_party/uri/src/CMakeFiles/network-uri.dir/clean:
- cd /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src && $(CMAKE_COMMAND) -P CMakeFiles/network-uri.dir/cmake_clean.cmake
-.PHONY : third_party/uri/src/CMakeFiles/network-uri.dir/clean
-
-third_party/uri/src/CMakeFiles/network-uri.dir/depend:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /usr/local/src/asymptote-2.90/LspCpp /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src /usr/local/src/asymptote-2.90/LspCpp /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/DependInfo.cmake "--color=$(COLOR)"
-.PHONY : third_party/uri/src/CMakeFiles/network-uri.dir/depend
-
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/cmake_clean.cmake b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/cmake_clean.cmake
deleted file mode 100644
index 1d050bed3e..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/cmake_clean.cmake
+++ /dev/null
@@ -1,25 +0,0 @@
-file(REMOVE_RECURSE
- "CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o"
- "CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o.d"
- "CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o"
- "CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o.d"
- "CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o"
- "CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o.d"
- "CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o"
- "CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o.d"
- "CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o"
- "CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o.d"
- "CMakeFiles/network-uri.dir/uri.cpp.o"
- "CMakeFiles/network-uri.dir/uri.cpp.o.d"
- "CMakeFiles/network-uri.dir/uri_builder.cpp.o"
- "CMakeFiles/network-uri.dir/uri_builder.cpp.o.d"
- "CMakeFiles/network-uri.dir/uri_errors.cpp.o"
- "CMakeFiles/network-uri.dir/uri_errors.cpp.o.d"
- "libnetwork-uri.a"
- "libnetwork-uri.pdb"
-)
-
-# Per-language clean rules from dependency scanning.
-foreach(lang CXX)
- include(CMakeFiles/network-uri.dir/cmake_clean_${lang}.cmake OPTIONAL)
-endforeach()
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/cmake_clean_target.cmake b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/cmake_clean_target.cmake
deleted file mode 100644
index 0b9c366a69..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/cmake_clean_target.cmake
+++ /dev/null
@@ -1,3 +0,0 @@
-file(REMOVE_RECURSE
- "libnetwork-uri.a"
-)
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.internal b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.internal
deleted file mode 100644
index 3100d7c219..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.internal
+++ /dev/null
@@ -1,1739 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 3.28
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp
- /usr/include/alloca.h
- /usr/include/asm-generic/errno-base.h
- /usr/include/asm-generic/errno.h
- /usr/include/asm/errno.h
- /usr/include/assert.h
- /usr/include/bits/atomic_wide_counter.h
- /usr/include/bits/byteswap.h
- /usr/include/bits/cpu-set.h
- /usr/include/bits/endian.h
- /usr/include/bits/endianness.h
- /usr/include/bits/errno.h
- /usr/include/bits/floatn-common.h
- /usr/include/bits/floatn.h
- /usr/include/bits/libc-header-start.h
- /usr/include/bits/locale.h
- /usr/include/bits/long-double.h
- /usr/include/bits/pthread_stack_min-dynamic.h
- /usr/include/bits/pthreadtypes-arch.h
- /usr/include/bits/pthreadtypes.h
- /usr/include/bits/sched.h
- /usr/include/bits/select.h
- /usr/include/bits/setjmp.h
- /usr/include/bits/stdint-intn.h
- /usr/include/bits/stdint-least.h
- /usr/include/bits/stdint-uintn.h
- /usr/include/bits/stdio.h
- /usr/include/bits/stdio_lim.h
- /usr/include/bits/stdlib-bsearch.h
- /usr/include/bits/stdlib-float.h
- /usr/include/bits/struct_mutex.h
- /usr/include/bits/struct_rwlock.h
- /usr/include/bits/thread-shared-types.h
- /usr/include/bits/time.h
- /usr/include/bits/time64.h
- /usr/include/bits/timesize.h
- /usr/include/bits/timex.h
- /usr/include/bits/types.h
- /usr/include/bits/types/FILE.h
- /usr/include/bits/types/__FILE.h
- /usr/include/bits/types/__fpos64_t.h
- /usr/include/bits/types/__fpos_t.h
- /usr/include/bits/types/__locale_t.h
- /usr/include/bits/types/__mbstate_t.h
- /usr/include/bits/types/__sigset_t.h
- /usr/include/bits/types/clock_t.h
- /usr/include/bits/types/clockid_t.h
- /usr/include/bits/types/cookie_io_functions_t.h
- /usr/include/bits/types/error_t.h
- /usr/include/bits/types/locale_t.h
- /usr/include/bits/types/mbstate_t.h
- /usr/include/bits/types/sigset_t.h
- /usr/include/bits/types/struct_FILE.h
- /usr/include/bits/types/struct___jmp_buf_tag.h
- /usr/include/bits/types/struct_itimerspec.h
- /usr/include/bits/types/struct_sched_param.h
- /usr/include/bits/types/struct_timespec.h
- /usr/include/bits/types/struct_timeval.h
- /usr/include/bits/types/struct_tm.h
- /usr/include/bits/types/time_t.h
- /usr/include/bits/types/timer_t.h
- /usr/include/bits/types/wint_t.h
- /usr/include/bits/typesizes.h
- /usr/include/bits/uintn-identity.h
- /usr/include/bits/waitflags.h
- /usr/include/bits/waitstatus.h
- /usr/include/bits/wchar.h
- /usr/include/bits/wordsize.h
- /usr/include/c++/14/algorithm
- /usr/include/c++/14/backward/auto_ptr.h
- /usr/include/c++/14/backward/binders.h
- /usr/include/c++/14/bit
- /usr/include/c++/14/bits/algorithmfwd.h
- /usr/include/c++/14/bits/align.h
- /usr/include/c++/14/bits/alloc_traits.h
- /usr/include/c++/14/bits/allocated_ptr.h
- /usr/include/c++/14/bits/allocator.h
- /usr/include/c++/14/bits/atomic_base.h
- /usr/include/c++/14/bits/atomic_lockfree_defines.h
- /usr/include/c++/14/bits/basic_string.h
- /usr/include/c++/14/bits/basic_string.tcc
- /usr/include/c++/14/bits/char_traits.h
- /usr/include/c++/14/bits/charconv.h
- /usr/include/c++/14/bits/concept_check.h
- /usr/include/c++/14/bits/cpp_type_traits.h
- /usr/include/c++/14/bits/cxxabi_forced.h
- /usr/include/c++/14/bits/cxxabi_init_exception.h
- /usr/include/c++/14/bits/exception.h
- /usr/include/c++/14/bits/exception_defines.h
- /usr/include/c++/14/bits/exception_ptr.h
- /usr/include/c++/14/bits/functexcept.h
- /usr/include/c++/14/bits/functional_hash.h
- /usr/include/c++/14/bits/hash_bytes.h
- /usr/include/c++/14/bits/invoke.h
- /usr/include/c++/14/bits/ios_base.h
- /usr/include/c++/14/bits/locale_classes.h
- /usr/include/c++/14/bits/locale_classes.tcc
- /usr/include/c++/14/bits/localefwd.h
- /usr/include/c++/14/bits/memoryfwd.h
- /usr/include/c++/14/bits/move.h
- /usr/include/c++/14/bits/nested_exception.h
- /usr/include/c++/14/bits/new_allocator.h
- /usr/include/c++/14/bits/ostream_insert.h
- /usr/include/c++/14/bits/postypes.h
- /usr/include/c++/14/bits/predefined_ops.h
- /usr/include/c++/14/bits/ptr_traits.h
- /usr/include/c++/14/bits/range_access.h
- /usr/include/c++/14/bits/refwrap.h
- /usr/include/c++/14/bits/requires_hosted.h
- /usr/include/c++/14/bits/shared_ptr.h
- /usr/include/c++/14/bits/shared_ptr_atomic.h
- /usr/include/c++/14/bits/shared_ptr_base.h
- /usr/include/c++/14/bits/std_abs.h
- /usr/include/c++/14/bits/stl_algo.h
- /usr/include/c++/14/bits/stl_algobase.h
- /usr/include/c++/14/bits/stl_construct.h
- /usr/include/c++/14/bits/stl_function.h
- /usr/include/c++/14/bits/stl_heap.h
- /usr/include/c++/14/bits/stl_iterator.h
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h
- /usr/include/c++/14/bits/stl_iterator_base_types.h
- /usr/include/c++/14/bits/stl_pair.h
- /usr/include/c++/14/bits/stl_raw_storage_iter.h
- /usr/include/c++/14/bits/stl_relops.h
- /usr/include/c++/14/bits/stl_tempbuf.h
- /usr/include/c++/14/bits/stl_uninitialized.h
- /usr/include/c++/14/bits/stream_iterator.h
- /usr/include/c++/14/bits/streambuf.tcc
- /usr/include/c++/14/bits/streambuf_iterator.h
- /usr/include/c++/14/bits/stringfwd.h
- /usr/include/c++/14/bits/uniform_int_dist.h
- /usr/include/c++/14/bits/unique_ptr.h
- /usr/include/c++/14/bits/uses_allocator.h
- /usr/include/c++/14/bits/utility.h
- /usr/include/c++/14/bits/version.h
- /usr/include/c++/14/cassert
- /usr/include/c++/14/cctype
- /usr/include/c++/14/cerrno
- /usr/include/c++/14/clocale
- /usr/include/c++/14/cstdio
- /usr/include/c++/14/cstdlib
- /usr/include/c++/14/cwchar
- /usr/include/c++/14/debug/assertions.h
- /usr/include/c++/14/debug/debug.h
- /usr/include/c++/14/exception
- /usr/include/c++/14/ext/aligned_buffer.h
- /usr/include/c++/14/ext/alloc_traits.h
- /usr/include/c++/14/ext/atomicity.h
- /usr/include/c++/14/ext/concurrence.h
- /usr/include/c++/14/ext/numeric_traits.h
- /usr/include/c++/14/ext/string_conversions.h
- /usr/include/c++/14/ext/type_traits.h
- /usr/include/c++/14/initializer_list
- /usr/include/c++/14/iosfwd
- /usr/include/c++/14/iterator
- /usr/include/c++/14/limits
- /usr/include/c++/14/memory
- /usr/include/c++/14/new
- /usr/include/c++/14/stdexcept
- /usr/include/c++/14/streambuf
- /usr/include/c++/14/string
- /usr/include/c++/14/system_error
- /usr/include/c++/14/tuple
- /usr/include/c++/14/type_traits
- /usr/include/c++/14/typeinfo
- /usr/include/c++/14/utility
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h
- /usr/include/ctype.h
- /usr/include/endian.h
- /usr/include/errno.h
- /usr/include/features-time64.h
- /usr/include/features.h
- /usr/include/gnu/stubs-64.h
- /usr/include/gnu/stubs.h
- /usr/include/linux/errno.h
- /usr/include/locale.h
- /usr/include/pthread.h
- /usr/include/sched.h
- /usr/include/stdc-predef.h
- /usr/include/stdint.h
- /usr/include/stdio.h
- /usr/include/stdlib.h
- /usr/include/sys/cdefs.h
- /usr/include/sys/select.h
- /usr/include/sys/single_threaded.h
- /usr/include/sys/types.h
- /usr/include/time.h
- /usr/include/wchar.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/optional.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/string_view.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/uri_parts.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_advance_parts.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_normalize.cpp
- /usr/include/alloca.h
- /usr/include/asm-generic/errno-base.h
- /usr/include/asm-generic/errno.h
- /usr/include/asm/errno.h
- /usr/include/assert.h
- /usr/include/bits/atomic_wide_counter.h
- /usr/include/bits/byteswap.h
- /usr/include/bits/cpu-set.h
- /usr/include/bits/endian.h
- /usr/include/bits/endianness.h
- /usr/include/bits/errno.h
- /usr/include/bits/floatn-common.h
- /usr/include/bits/floatn.h
- /usr/include/bits/libc-header-start.h
- /usr/include/bits/locale.h
- /usr/include/bits/long-double.h
- /usr/include/bits/pthread_stack_min-dynamic.h
- /usr/include/bits/pthreadtypes-arch.h
- /usr/include/bits/pthreadtypes.h
- /usr/include/bits/sched.h
- /usr/include/bits/select.h
- /usr/include/bits/setjmp.h
- /usr/include/bits/stdint-intn.h
- /usr/include/bits/stdint-least.h
- /usr/include/bits/stdint-uintn.h
- /usr/include/bits/stdio.h
- /usr/include/bits/stdio_lim.h
- /usr/include/bits/stdlib-bsearch.h
- /usr/include/bits/stdlib-float.h
- /usr/include/bits/struct_mutex.h
- /usr/include/bits/struct_rwlock.h
- /usr/include/bits/thread-shared-types.h
- /usr/include/bits/time.h
- /usr/include/bits/time64.h
- /usr/include/bits/timesize.h
- /usr/include/bits/timex.h
- /usr/include/bits/types.h
- /usr/include/bits/types/FILE.h
- /usr/include/bits/types/__FILE.h
- /usr/include/bits/types/__fpos64_t.h
- /usr/include/bits/types/__fpos_t.h
- /usr/include/bits/types/__locale_t.h
- /usr/include/bits/types/__mbstate_t.h
- /usr/include/bits/types/__sigset_t.h
- /usr/include/bits/types/clock_t.h
- /usr/include/bits/types/clockid_t.h
- /usr/include/bits/types/cookie_io_functions_t.h
- /usr/include/bits/types/error_t.h
- /usr/include/bits/types/locale_t.h
- /usr/include/bits/types/mbstate_t.h
- /usr/include/bits/types/sigset_t.h
- /usr/include/bits/types/struct_FILE.h
- /usr/include/bits/types/struct___jmp_buf_tag.h
- /usr/include/bits/types/struct_itimerspec.h
- /usr/include/bits/types/struct_sched_param.h
- /usr/include/bits/types/struct_timespec.h
- /usr/include/bits/types/struct_timeval.h
- /usr/include/bits/types/struct_tm.h
- /usr/include/bits/types/time_t.h
- /usr/include/bits/types/timer_t.h
- /usr/include/bits/types/wint_t.h
- /usr/include/bits/typesizes.h
- /usr/include/bits/uintn-identity.h
- /usr/include/bits/waitflags.h
- /usr/include/bits/waitstatus.h
- /usr/include/bits/wchar.h
- /usr/include/bits/wctype-wchar.h
- /usr/include/bits/wordsize.h
- /usr/include/c++/14/algorithm
- /usr/include/c++/14/backward/auto_ptr.h
- /usr/include/c++/14/backward/binders.h
- /usr/include/c++/14/bit
- /usr/include/c++/14/bits/algorithmfwd.h
- /usr/include/c++/14/bits/align.h
- /usr/include/c++/14/bits/alloc_traits.h
- /usr/include/c++/14/bits/allocated_ptr.h
- /usr/include/c++/14/bits/allocator.h
- /usr/include/c++/14/bits/atomic_base.h
- /usr/include/c++/14/bits/atomic_lockfree_defines.h
- /usr/include/c++/14/bits/basic_string.h
- /usr/include/c++/14/bits/basic_string.tcc
- /usr/include/c++/14/bits/char_traits.h
- /usr/include/c++/14/bits/charconv.h
- /usr/include/c++/14/bits/codecvt.h
- /usr/include/c++/14/bits/concept_check.h
- /usr/include/c++/14/bits/cpp_type_traits.h
- /usr/include/c++/14/bits/cxxabi_forced.h
- /usr/include/c++/14/bits/cxxabi_init_exception.h
- /usr/include/c++/14/bits/exception.h
- /usr/include/c++/14/bits/exception_defines.h
- /usr/include/c++/14/bits/exception_ptr.h
- /usr/include/c++/14/bits/functexcept.h
- /usr/include/c++/14/bits/functional_hash.h
- /usr/include/c++/14/bits/hash_bytes.h
- /usr/include/c++/14/bits/invoke.h
- /usr/include/c++/14/bits/ios_base.h
- /usr/include/c++/14/bits/locale_classes.h
- /usr/include/c++/14/bits/locale_classes.tcc
- /usr/include/c++/14/bits/locale_conv.h
- /usr/include/c++/14/bits/locale_facets.h
- /usr/include/c++/14/bits/locale_facets.tcc
- /usr/include/c++/14/bits/locale_facets_nonio.h
- /usr/include/c++/14/bits/locale_facets_nonio.tcc
- /usr/include/c++/14/bits/localefwd.h
- /usr/include/c++/14/bits/memoryfwd.h
- /usr/include/c++/14/bits/move.h
- /usr/include/c++/14/bits/nested_exception.h
- /usr/include/c++/14/bits/new_allocator.h
- /usr/include/c++/14/bits/ostream_insert.h
- /usr/include/c++/14/bits/postypes.h
- /usr/include/c++/14/bits/predefined_ops.h
- /usr/include/c++/14/bits/ptr_traits.h
- /usr/include/c++/14/bits/range_access.h
- /usr/include/c++/14/bits/refwrap.h
- /usr/include/c++/14/bits/requires_hosted.h
- /usr/include/c++/14/bits/shared_ptr.h
- /usr/include/c++/14/bits/shared_ptr_atomic.h
- /usr/include/c++/14/bits/shared_ptr_base.h
- /usr/include/c++/14/bits/std_abs.h
- /usr/include/c++/14/bits/std_function.h
- /usr/include/c++/14/bits/stl_algo.h
- /usr/include/c++/14/bits/stl_algobase.h
- /usr/include/c++/14/bits/stl_bvector.h
- /usr/include/c++/14/bits/stl_construct.h
- /usr/include/c++/14/bits/stl_function.h
- /usr/include/c++/14/bits/stl_heap.h
- /usr/include/c++/14/bits/stl_iterator.h
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h
- /usr/include/c++/14/bits/stl_iterator_base_types.h
- /usr/include/c++/14/bits/stl_pair.h
- /usr/include/c++/14/bits/stl_raw_storage_iter.h
- /usr/include/c++/14/bits/stl_relops.h
- /usr/include/c++/14/bits/stl_tempbuf.h
- /usr/include/c++/14/bits/stl_uninitialized.h
- /usr/include/c++/14/bits/stl_vector.h
- /usr/include/c++/14/bits/stream_iterator.h
- /usr/include/c++/14/bits/streambuf.tcc
- /usr/include/c++/14/bits/streambuf_iterator.h
- /usr/include/c++/14/bits/stringfwd.h
- /usr/include/c++/14/bits/uniform_int_dist.h
- /usr/include/c++/14/bits/unique_ptr.h
- /usr/include/c++/14/bits/uses_allocator.h
- /usr/include/c++/14/bits/utility.h
- /usr/include/c++/14/bits/vector.tcc
- /usr/include/c++/14/bits/version.h
- /usr/include/c++/14/cassert
- /usr/include/c++/14/cctype
- /usr/include/c++/14/cerrno
- /usr/include/c++/14/clocale
- /usr/include/c++/14/cstdint
- /usr/include/c++/14/cstdio
- /usr/include/c++/14/cstdlib
- /usr/include/c++/14/cstring
- /usr/include/c++/14/ctime
- /usr/include/c++/14/cwchar
- /usr/include/c++/14/cwctype
- /usr/include/c++/14/debug/assertions.h
- /usr/include/c++/14/debug/debug.h
- /usr/include/c++/14/exception
- /usr/include/c++/14/ext/aligned_buffer.h
- /usr/include/c++/14/ext/alloc_traits.h
- /usr/include/c++/14/ext/atomicity.h
- /usr/include/c++/14/ext/concurrence.h
- /usr/include/c++/14/ext/numeric_traits.h
- /usr/include/c++/14/ext/string_conversions.h
- /usr/include/c++/14/ext/type_traits.h
- /usr/include/c++/14/functional
- /usr/include/c++/14/initializer_list
- /usr/include/c++/14/iosfwd
- /usr/include/c++/14/iterator
- /usr/include/c++/14/locale
- /usr/include/c++/14/memory
- /usr/include/c++/14/new
- /usr/include/c++/14/stdexcept
- /usr/include/c++/14/streambuf
- /usr/include/c++/14/string
- /usr/include/c++/14/system_error
- /usr/include/c++/14/tuple
- /usr/include/c++/14/type_traits
- /usr/include/c++/14/typeinfo
- /usr/include/c++/14/utility
- /usr/include/c++/14/vector
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h
- /usr/include/ctype.h
- /usr/include/endian.h
- /usr/include/errno.h
- /usr/include/features-time64.h
- /usr/include/features.h
- /usr/include/gnu/stubs-64.h
- /usr/include/gnu/stubs.h
- /usr/include/libintl.h
- /usr/include/linux/errno.h
- /usr/include/locale.h
- /usr/include/pthread.h
- /usr/include/sched.h
- /usr/include/stdc-predef.h
- /usr/include/stdint.h
- /usr/include/stdio.h
- /usr/include/stdlib.h
- /usr/include/string.h
- /usr/include/strings.h
- /usr/include/sys/cdefs.h
- /usr/include/sys/select.h
- /usr/include/sys/single_threaded.h
- /usr/include/sys/types.h
- /usr/include/time.h
- /usr/include/wchar.h
- /usr/include/wctype.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/optional.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/string_view.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/config.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/decode.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/encode.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/translate.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/uri_parts.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri_errors.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/algorithm.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/algorithm_split.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_normalize.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_percent_encode.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse.cpp
- /usr/include/alloca.h
- /usr/include/asm-generic/errno-base.h
- /usr/include/asm-generic/errno.h
- /usr/include/asm/errno.h
- /usr/include/assert.h
- /usr/include/bits/atomic_wide_counter.h
- /usr/include/bits/byteswap.h
- /usr/include/bits/cpu-set.h
- /usr/include/bits/endian.h
- /usr/include/bits/endianness.h
- /usr/include/bits/errno.h
- /usr/include/bits/floatn-common.h
- /usr/include/bits/floatn.h
- /usr/include/bits/libc-header-start.h
- /usr/include/bits/locale.h
- /usr/include/bits/long-double.h
- /usr/include/bits/pthread_stack_min-dynamic.h
- /usr/include/bits/pthreadtypes-arch.h
- /usr/include/bits/pthreadtypes.h
- /usr/include/bits/sched.h
- /usr/include/bits/select.h
- /usr/include/bits/setjmp.h
- /usr/include/bits/stdint-intn.h
- /usr/include/bits/stdint-least.h
- /usr/include/bits/stdint-uintn.h
- /usr/include/bits/stdio.h
- /usr/include/bits/stdio_lim.h
- /usr/include/bits/stdlib-bsearch.h
- /usr/include/bits/stdlib-float.h
- /usr/include/bits/struct_mutex.h
- /usr/include/bits/struct_rwlock.h
- /usr/include/bits/thread-shared-types.h
- /usr/include/bits/time.h
- /usr/include/bits/time64.h
- /usr/include/bits/timesize.h
- /usr/include/bits/timex.h
- /usr/include/bits/types.h
- /usr/include/bits/types/FILE.h
- /usr/include/bits/types/__FILE.h
- /usr/include/bits/types/__fpos64_t.h
- /usr/include/bits/types/__fpos_t.h
- /usr/include/bits/types/__locale_t.h
- /usr/include/bits/types/__mbstate_t.h
- /usr/include/bits/types/__sigset_t.h
- /usr/include/bits/types/clock_t.h
- /usr/include/bits/types/clockid_t.h
- /usr/include/bits/types/cookie_io_functions_t.h
- /usr/include/bits/types/error_t.h
- /usr/include/bits/types/locale_t.h
- /usr/include/bits/types/mbstate_t.h
- /usr/include/bits/types/sigset_t.h
- /usr/include/bits/types/struct_FILE.h
- /usr/include/bits/types/struct___jmp_buf_tag.h
- /usr/include/bits/types/struct_itimerspec.h
- /usr/include/bits/types/struct_sched_param.h
- /usr/include/bits/types/struct_timespec.h
- /usr/include/bits/types/struct_timeval.h
- /usr/include/bits/types/struct_tm.h
- /usr/include/bits/types/time_t.h
- /usr/include/bits/types/timer_t.h
- /usr/include/bits/types/wint_t.h
- /usr/include/bits/typesizes.h
- /usr/include/bits/uintn-identity.h
- /usr/include/bits/waitflags.h
- /usr/include/bits/waitstatus.h
- /usr/include/bits/wchar.h
- /usr/include/bits/wctype-wchar.h
- /usr/include/bits/wordsize.h
- /usr/include/c++/14/algorithm
- /usr/include/c++/14/backward/auto_ptr.h
- /usr/include/c++/14/backward/binders.h
- /usr/include/c++/14/bit
- /usr/include/c++/14/bits/algorithmfwd.h
- /usr/include/c++/14/bits/align.h
- /usr/include/c++/14/bits/alloc_traits.h
- /usr/include/c++/14/bits/allocated_ptr.h
- /usr/include/c++/14/bits/allocator.h
- /usr/include/c++/14/bits/atomic_base.h
- /usr/include/c++/14/bits/atomic_lockfree_defines.h
- /usr/include/c++/14/bits/basic_string.h
- /usr/include/c++/14/bits/basic_string.tcc
- /usr/include/c++/14/bits/char_traits.h
- /usr/include/c++/14/bits/charconv.h
- /usr/include/c++/14/bits/codecvt.h
- /usr/include/c++/14/bits/concept_check.h
- /usr/include/c++/14/bits/cpp_type_traits.h
- /usr/include/c++/14/bits/cxxabi_forced.h
- /usr/include/c++/14/bits/cxxabi_init_exception.h
- /usr/include/c++/14/bits/exception.h
- /usr/include/c++/14/bits/exception_defines.h
- /usr/include/c++/14/bits/exception_ptr.h
- /usr/include/c++/14/bits/functexcept.h
- /usr/include/c++/14/bits/functional_hash.h
- /usr/include/c++/14/bits/hash_bytes.h
- /usr/include/c++/14/bits/invoke.h
- /usr/include/c++/14/bits/ios_base.h
- /usr/include/c++/14/bits/locale_classes.h
- /usr/include/c++/14/bits/locale_classes.tcc
- /usr/include/c++/14/bits/locale_conv.h
- /usr/include/c++/14/bits/locale_facets.h
- /usr/include/c++/14/bits/locale_facets.tcc
- /usr/include/c++/14/bits/locale_facets_nonio.h
- /usr/include/c++/14/bits/locale_facets_nonio.tcc
- /usr/include/c++/14/bits/localefwd.h
- /usr/include/c++/14/bits/memoryfwd.h
- /usr/include/c++/14/bits/move.h
- /usr/include/c++/14/bits/nested_exception.h
- /usr/include/c++/14/bits/new_allocator.h
- /usr/include/c++/14/bits/ostream_insert.h
- /usr/include/c++/14/bits/postypes.h
- /usr/include/c++/14/bits/predefined_ops.h
- /usr/include/c++/14/bits/ptr_traits.h
- /usr/include/c++/14/bits/range_access.h
- /usr/include/c++/14/bits/refwrap.h
- /usr/include/c++/14/bits/requires_hosted.h
- /usr/include/c++/14/bits/shared_ptr.h
- /usr/include/c++/14/bits/shared_ptr_atomic.h
- /usr/include/c++/14/bits/shared_ptr_base.h
- /usr/include/c++/14/bits/std_abs.h
- /usr/include/c++/14/bits/stl_algo.h
- /usr/include/c++/14/bits/stl_algobase.h
- /usr/include/c++/14/bits/stl_construct.h
- /usr/include/c++/14/bits/stl_function.h
- /usr/include/c++/14/bits/stl_heap.h
- /usr/include/c++/14/bits/stl_iterator.h
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h
- /usr/include/c++/14/bits/stl_iterator_base_types.h
- /usr/include/c++/14/bits/stl_pair.h
- /usr/include/c++/14/bits/stl_raw_storage_iter.h
- /usr/include/c++/14/bits/stl_relops.h
- /usr/include/c++/14/bits/stl_tempbuf.h
- /usr/include/c++/14/bits/stl_uninitialized.h
- /usr/include/c++/14/bits/stream_iterator.h
- /usr/include/c++/14/bits/streambuf.tcc
- /usr/include/c++/14/bits/streambuf_iterator.h
- /usr/include/c++/14/bits/stringfwd.h
- /usr/include/c++/14/bits/uniform_int_dist.h
- /usr/include/c++/14/bits/unique_ptr.h
- /usr/include/c++/14/bits/uses_allocator.h
- /usr/include/c++/14/bits/utility.h
- /usr/include/c++/14/bits/version.h
- /usr/include/c++/14/cassert
- /usr/include/c++/14/cctype
- /usr/include/c++/14/cerrno
- /usr/include/c++/14/clocale
- /usr/include/c++/14/cstdio
- /usr/include/c++/14/cstdlib
- /usr/include/c++/14/cstring
- /usr/include/c++/14/ctime
- /usr/include/c++/14/cwchar
- /usr/include/c++/14/cwctype
- /usr/include/c++/14/debug/assertions.h
- /usr/include/c++/14/debug/debug.h
- /usr/include/c++/14/exception
- /usr/include/c++/14/ext/aligned_buffer.h
- /usr/include/c++/14/ext/alloc_traits.h
- /usr/include/c++/14/ext/atomicity.h
- /usr/include/c++/14/ext/concurrence.h
- /usr/include/c++/14/ext/numeric_traits.h
- /usr/include/c++/14/ext/string_conversions.h
- /usr/include/c++/14/ext/type_traits.h
- /usr/include/c++/14/initializer_list
- /usr/include/c++/14/iosfwd
- /usr/include/c++/14/iterator
- /usr/include/c++/14/limits
- /usr/include/c++/14/locale
- /usr/include/c++/14/memory
- /usr/include/c++/14/new
- /usr/include/c++/14/stdexcept
- /usr/include/c++/14/streambuf
- /usr/include/c++/14/string
- /usr/include/c++/14/system_error
- /usr/include/c++/14/tuple
- /usr/include/c++/14/type_traits
- /usr/include/c++/14/typeinfo
- /usr/include/c++/14/utility
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h
- /usr/include/ctype.h
- /usr/include/endian.h
- /usr/include/errno.h
- /usr/include/features-time64.h
- /usr/include/features.h
- /usr/include/gnu/stubs-64.h
- /usr/include/gnu/stubs.h
- /usr/include/libintl.h
- /usr/include/linux/errno.h
- /usr/include/locale.h
- /usr/include/pthread.h
- /usr/include/sched.h
- /usr/include/stdc-predef.h
- /usr/include/stdint.h
- /usr/include/stdio.h
- /usr/include/stdlib.h
- /usr/include/string.h
- /usr/include/strings.h
- /usr/include/sys/cdefs.h
- /usr/include/sys/select.h
- /usr/include/sys/single_threaded.h
- /usr/include/sys/types.h
- /usr/include/time.h
- /usr/include/wchar.h
- /usr/include/wctype.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/optional.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/string_view.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/uri_parts.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/grammar.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse_authority.cpp
- /usr/include/alloca.h
- /usr/include/asm-generic/errno-base.h
- /usr/include/asm-generic/errno.h
- /usr/include/asm/errno.h
- /usr/include/assert.h
- /usr/include/bits/atomic_wide_counter.h
- /usr/include/bits/byteswap.h
- /usr/include/bits/cpu-set.h
- /usr/include/bits/endian.h
- /usr/include/bits/endianness.h
- /usr/include/bits/errno.h
- /usr/include/bits/floatn-common.h
- /usr/include/bits/floatn.h
- /usr/include/bits/libc-header-start.h
- /usr/include/bits/locale.h
- /usr/include/bits/long-double.h
- /usr/include/bits/pthread_stack_min-dynamic.h
- /usr/include/bits/pthreadtypes-arch.h
- /usr/include/bits/pthreadtypes.h
- /usr/include/bits/sched.h
- /usr/include/bits/select.h
- /usr/include/bits/setjmp.h
- /usr/include/bits/stdint-intn.h
- /usr/include/bits/stdint-least.h
- /usr/include/bits/stdint-uintn.h
- /usr/include/bits/stdio.h
- /usr/include/bits/stdio_lim.h
- /usr/include/bits/stdlib-bsearch.h
- /usr/include/bits/stdlib-float.h
- /usr/include/bits/struct_mutex.h
- /usr/include/bits/struct_rwlock.h
- /usr/include/bits/thread-shared-types.h
- /usr/include/bits/time.h
- /usr/include/bits/time64.h
- /usr/include/bits/timesize.h
- /usr/include/bits/timex.h
- /usr/include/bits/types.h
- /usr/include/bits/types/FILE.h
- /usr/include/bits/types/__FILE.h
- /usr/include/bits/types/__fpos64_t.h
- /usr/include/bits/types/__fpos_t.h
- /usr/include/bits/types/__locale_t.h
- /usr/include/bits/types/__mbstate_t.h
- /usr/include/bits/types/__sigset_t.h
- /usr/include/bits/types/clock_t.h
- /usr/include/bits/types/clockid_t.h
- /usr/include/bits/types/cookie_io_functions_t.h
- /usr/include/bits/types/error_t.h
- /usr/include/bits/types/locale_t.h
- /usr/include/bits/types/mbstate_t.h
- /usr/include/bits/types/sigset_t.h
- /usr/include/bits/types/struct_FILE.h
- /usr/include/bits/types/struct___jmp_buf_tag.h
- /usr/include/bits/types/struct_itimerspec.h
- /usr/include/bits/types/struct_sched_param.h
- /usr/include/bits/types/struct_timespec.h
- /usr/include/bits/types/struct_timeval.h
- /usr/include/bits/types/struct_tm.h
- /usr/include/bits/types/time_t.h
- /usr/include/bits/types/timer_t.h
- /usr/include/bits/types/wint_t.h
- /usr/include/bits/typesizes.h
- /usr/include/bits/uintn-identity.h
- /usr/include/bits/waitflags.h
- /usr/include/bits/waitstatus.h
- /usr/include/bits/wchar.h
- /usr/include/bits/wctype-wchar.h
- /usr/include/bits/wordsize.h
- /usr/include/c++/14/algorithm
- /usr/include/c++/14/backward/auto_ptr.h
- /usr/include/c++/14/backward/binders.h
- /usr/include/c++/14/bit
- /usr/include/c++/14/bits/algorithmfwd.h
- /usr/include/c++/14/bits/align.h
- /usr/include/c++/14/bits/alloc_traits.h
- /usr/include/c++/14/bits/allocated_ptr.h
- /usr/include/c++/14/bits/allocator.h
- /usr/include/c++/14/bits/atomic_base.h
- /usr/include/c++/14/bits/atomic_lockfree_defines.h
- /usr/include/c++/14/bits/basic_string.h
- /usr/include/c++/14/bits/basic_string.tcc
- /usr/include/c++/14/bits/char_traits.h
- /usr/include/c++/14/bits/charconv.h
- /usr/include/c++/14/bits/codecvt.h
- /usr/include/c++/14/bits/concept_check.h
- /usr/include/c++/14/bits/cpp_type_traits.h
- /usr/include/c++/14/bits/cxxabi_forced.h
- /usr/include/c++/14/bits/cxxabi_init_exception.h
- /usr/include/c++/14/bits/exception.h
- /usr/include/c++/14/bits/exception_defines.h
- /usr/include/c++/14/bits/exception_ptr.h
- /usr/include/c++/14/bits/functexcept.h
- /usr/include/c++/14/bits/functional_hash.h
- /usr/include/c++/14/bits/hash_bytes.h
- /usr/include/c++/14/bits/invoke.h
- /usr/include/c++/14/bits/ios_base.h
- /usr/include/c++/14/bits/locale_classes.h
- /usr/include/c++/14/bits/locale_classes.tcc
- /usr/include/c++/14/bits/locale_conv.h
- /usr/include/c++/14/bits/locale_facets.h
- /usr/include/c++/14/bits/locale_facets.tcc
- /usr/include/c++/14/bits/locale_facets_nonio.h
- /usr/include/c++/14/bits/locale_facets_nonio.tcc
- /usr/include/c++/14/bits/localefwd.h
- /usr/include/c++/14/bits/memoryfwd.h
- /usr/include/c++/14/bits/move.h
- /usr/include/c++/14/bits/nested_exception.h
- /usr/include/c++/14/bits/new_allocator.h
- /usr/include/c++/14/bits/ostream_insert.h
- /usr/include/c++/14/bits/postypes.h
- /usr/include/c++/14/bits/predefined_ops.h
- /usr/include/c++/14/bits/ptr_traits.h
- /usr/include/c++/14/bits/range_access.h
- /usr/include/c++/14/bits/refwrap.h
- /usr/include/c++/14/bits/requires_hosted.h
- /usr/include/c++/14/bits/shared_ptr.h
- /usr/include/c++/14/bits/shared_ptr_atomic.h
- /usr/include/c++/14/bits/shared_ptr_base.h
- /usr/include/c++/14/bits/std_abs.h
- /usr/include/c++/14/bits/stl_algo.h
- /usr/include/c++/14/bits/stl_algobase.h
- /usr/include/c++/14/bits/stl_construct.h
- /usr/include/c++/14/bits/stl_function.h
- /usr/include/c++/14/bits/stl_heap.h
- /usr/include/c++/14/bits/stl_iterator.h
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h
- /usr/include/c++/14/bits/stl_iterator_base_types.h
- /usr/include/c++/14/bits/stl_pair.h
- /usr/include/c++/14/bits/stl_raw_storage_iter.h
- /usr/include/c++/14/bits/stl_relops.h
- /usr/include/c++/14/bits/stl_tempbuf.h
- /usr/include/c++/14/bits/stl_uninitialized.h
- /usr/include/c++/14/bits/stream_iterator.h
- /usr/include/c++/14/bits/streambuf.tcc
- /usr/include/c++/14/bits/streambuf_iterator.h
- /usr/include/c++/14/bits/stringfwd.h
- /usr/include/c++/14/bits/uniform_int_dist.h
- /usr/include/c++/14/bits/unique_ptr.h
- /usr/include/c++/14/bits/uses_allocator.h
- /usr/include/c++/14/bits/utility.h
- /usr/include/c++/14/bits/version.h
- /usr/include/c++/14/cassert
- /usr/include/c++/14/cctype
- /usr/include/c++/14/cerrno
- /usr/include/c++/14/clocale
- /usr/include/c++/14/cstdio
- /usr/include/c++/14/cstdlib
- /usr/include/c++/14/cstring
- /usr/include/c++/14/ctime
- /usr/include/c++/14/cwchar
- /usr/include/c++/14/cwctype
- /usr/include/c++/14/debug/assertions.h
- /usr/include/c++/14/debug/debug.h
- /usr/include/c++/14/exception
- /usr/include/c++/14/ext/aligned_buffer.h
- /usr/include/c++/14/ext/alloc_traits.h
- /usr/include/c++/14/ext/atomicity.h
- /usr/include/c++/14/ext/concurrence.h
- /usr/include/c++/14/ext/numeric_traits.h
- /usr/include/c++/14/ext/string_conversions.h
- /usr/include/c++/14/ext/type_traits.h
- /usr/include/c++/14/initializer_list
- /usr/include/c++/14/iosfwd
- /usr/include/c++/14/iterator
- /usr/include/c++/14/limits
- /usr/include/c++/14/locale
- /usr/include/c++/14/memory
- /usr/include/c++/14/new
- /usr/include/c++/14/stdexcept
- /usr/include/c++/14/streambuf
- /usr/include/c++/14/string
- /usr/include/c++/14/system_error
- /usr/include/c++/14/tuple
- /usr/include/c++/14/type_traits
- /usr/include/c++/14/typeinfo
- /usr/include/c++/14/utility
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h
- /usr/include/ctype.h
- /usr/include/endian.h
- /usr/include/errno.h
- /usr/include/features-time64.h
- /usr/include/features.h
- /usr/include/gnu/stubs-64.h
- /usr/include/gnu/stubs.h
- /usr/include/libintl.h
- /usr/include/linux/errno.h
- /usr/include/locale.h
- /usr/include/pthread.h
- /usr/include/sched.h
- /usr/include/stdc-predef.h
- /usr/include/stdint.h
- /usr/include/stdio.h
- /usr/include/stdlib.h
- /usr/include/string.h
- /usr/include/strings.h
- /usr/include/sys/cdefs.h
- /usr/include/sys/select.h
- /usr/include/sys/single_threaded.h
- /usr/include/sys/types.h
- /usr/include/time.h
- /usr/include/wchar.h
- /usr/include/wctype.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/optional.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/string_view.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/uri_parts.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/grammar.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse_authority.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_resolve.cpp
- /usr/include/alloca.h
- /usr/include/asm-generic/errno-base.h
- /usr/include/asm-generic/errno.h
- /usr/include/asm/errno.h
- /usr/include/assert.h
- /usr/include/bits/atomic_wide_counter.h
- /usr/include/bits/byteswap.h
- /usr/include/bits/cpu-set.h
- /usr/include/bits/endian.h
- /usr/include/bits/endianness.h
- /usr/include/bits/errno.h
- /usr/include/bits/floatn-common.h
- /usr/include/bits/floatn.h
- /usr/include/bits/libc-header-start.h
- /usr/include/bits/locale.h
- /usr/include/bits/long-double.h
- /usr/include/bits/pthread_stack_min-dynamic.h
- /usr/include/bits/pthreadtypes-arch.h
- /usr/include/bits/pthreadtypes.h
- /usr/include/bits/sched.h
- /usr/include/bits/select.h
- /usr/include/bits/setjmp.h
- /usr/include/bits/stdint-intn.h
- /usr/include/bits/stdint-least.h
- /usr/include/bits/stdint-uintn.h
- /usr/include/bits/stdio.h
- /usr/include/bits/stdio_lim.h
- /usr/include/bits/stdlib-bsearch.h
- /usr/include/bits/stdlib-float.h
- /usr/include/bits/struct_mutex.h
- /usr/include/bits/struct_rwlock.h
- /usr/include/bits/thread-shared-types.h
- /usr/include/bits/time.h
- /usr/include/bits/time64.h
- /usr/include/bits/timesize.h
- /usr/include/bits/timex.h
- /usr/include/bits/types.h
- /usr/include/bits/types/FILE.h
- /usr/include/bits/types/__FILE.h
- /usr/include/bits/types/__fpos64_t.h
- /usr/include/bits/types/__fpos_t.h
- /usr/include/bits/types/__locale_t.h
- /usr/include/bits/types/__mbstate_t.h
- /usr/include/bits/types/__sigset_t.h
- /usr/include/bits/types/clock_t.h
- /usr/include/bits/types/clockid_t.h
- /usr/include/bits/types/cookie_io_functions_t.h
- /usr/include/bits/types/error_t.h
- /usr/include/bits/types/locale_t.h
- /usr/include/bits/types/mbstate_t.h
- /usr/include/bits/types/sigset_t.h
- /usr/include/bits/types/struct_FILE.h
- /usr/include/bits/types/struct___jmp_buf_tag.h
- /usr/include/bits/types/struct_itimerspec.h
- /usr/include/bits/types/struct_sched_param.h
- /usr/include/bits/types/struct_timespec.h
- /usr/include/bits/types/struct_timeval.h
- /usr/include/bits/types/struct_tm.h
- /usr/include/bits/types/time_t.h
- /usr/include/bits/types/timer_t.h
- /usr/include/bits/types/wint_t.h
- /usr/include/bits/typesizes.h
- /usr/include/bits/uintn-identity.h
- /usr/include/bits/waitflags.h
- /usr/include/bits/waitstatus.h
- /usr/include/bits/wchar.h
- /usr/include/bits/wordsize.h
- /usr/include/c++/14/algorithm
- /usr/include/c++/14/backward/auto_ptr.h
- /usr/include/c++/14/backward/binders.h
- /usr/include/c++/14/bit
- /usr/include/c++/14/bits/algorithmfwd.h
- /usr/include/c++/14/bits/align.h
- /usr/include/c++/14/bits/alloc_traits.h
- /usr/include/c++/14/bits/allocated_ptr.h
- /usr/include/c++/14/bits/allocator.h
- /usr/include/c++/14/bits/atomic_base.h
- /usr/include/c++/14/bits/atomic_lockfree_defines.h
- /usr/include/c++/14/bits/basic_string.h
- /usr/include/c++/14/bits/basic_string.tcc
- /usr/include/c++/14/bits/char_traits.h
- /usr/include/c++/14/bits/charconv.h
- /usr/include/c++/14/bits/concept_check.h
- /usr/include/c++/14/bits/cpp_type_traits.h
- /usr/include/c++/14/bits/cxxabi_forced.h
- /usr/include/c++/14/bits/cxxabi_init_exception.h
- /usr/include/c++/14/bits/exception.h
- /usr/include/c++/14/bits/exception_defines.h
- /usr/include/c++/14/bits/exception_ptr.h
- /usr/include/c++/14/bits/functexcept.h
- /usr/include/c++/14/bits/functional_hash.h
- /usr/include/c++/14/bits/hash_bytes.h
- /usr/include/c++/14/bits/invoke.h
- /usr/include/c++/14/bits/ios_base.h
- /usr/include/c++/14/bits/locale_classes.h
- /usr/include/c++/14/bits/locale_classes.tcc
- /usr/include/c++/14/bits/localefwd.h
- /usr/include/c++/14/bits/memoryfwd.h
- /usr/include/c++/14/bits/move.h
- /usr/include/c++/14/bits/nested_exception.h
- /usr/include/c++/14/bits/new_allocator.h
- /usr/include/c++/14/bits/ostream_insert.h
- /usr/include/c++/14/bits/postypes.h
- /usr/include/c++/14/bits/predefined_ops.h
- /usr/include/c++/14/bits/ptr_traits.h
- /usr/include/c++/14/bits/range_access.h
- /usr/include/c++/14/bits/refwrap.h
- /usr/include/c++/14/bits/requires_hosted.h
- /usr/include/c++/14/bits/shared_ptr.h
- /usr/include/c++/14/bits/shared_ptr_atomic.h
- /usr/include/c++/14/bits/shared_ptr_base.h
- /usr/include/c++/14/bits/std_abs.h
- /usr/include/c++/14/bits/std_function.h
- /usr/include/c++/14/bits/stl_algo.h
- /usr/include/c++/14/bits/stl_algobase.h
- /usr/include/c++/14/bits/stl_construct.h
- /usr/include/c++/14/bits/stl_function.h
- /usr/include/c++/14/bits/stl_heap.h
- /usr/include/c++/14/bits/stl_iterator.h
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h
- /usr/include/c++/14/bits/stl_iterator_base_types.h
- /usr/include/c++/14/bits/stl_pair.h
- /usr/include/c++/14/bits/stl_raw_storage_iter.h
- /usr/include/c++/14/bits/stl_relops.h
- /usr/include/c++/14/bits/stl_tempbuf.h
- /usr/include/c++/14/bits/stl_uninitialized.h
- /usr/include/c++/14/bits/stream_iterator.h
- /usr/include/c++/14/bits/streambuf.tcc
- /usr/include/c++/14/bits/streambuf_iterator.h
- /usr/include/c++/14/bits/stringfwd.h
- /usr/include/c++/14/bits/uniform_int_dist.h
- /usr/include/c++/14/bits/unique_ptr.h
- /usr/include/c++/14/bits/uses_allocator.h
- /usr/include/c++/14/bits/utility.h
- /usr/include/c++/14/bits/version.h
- /usr/include/c++/14/cassert
- /usr/include/c++/14/cctype
- /usr/include/c++/14/cerrno
- /usr/include/c++/14/clocale
- /usr/include/c++/14/cstddef
- /usr/include/c++/14/cstdint
- /usr/include/c++/14/cstdio
- /usr/include/c++/14/cstdlib
- /usr/include/c++/14/cstring
- /usr/include/c++/14/cwchar
- /usr/include/c++/14/debug/assertions.h
- /usr/include/c++/14/debug/debug.h
- /usr/include/c++/14/exception
- /usr/include/c++/14/ext/aligned_buffer.h
- /usr/include/c++/14/ext/alloc_traits.h
- /usr/include/c++/14/ext/atomicity.h
- /usr/include/c++/14/ext/concurrence.h
- /usr/include/c++/14/ext/numeric_traits.h
- /usr/include/c++/14/ext/string_conversions.h
- /usr/include/c++/14/ext/type_traits.h
- /usr/include/c++/14/functional
- /usr/include/c++/14/initializer_list
- /usr/include/c++/14/iosfwd
- /usr/include/c++/14/iterator
- /usr/include/c++/14/memory
- /usr/include/c++/14/new
- /usr/include/c++/14/stdexcept
- /usr/include/c++/14/streambuf
- /usr/include/c++/14/string
- /usr/include/c++/14/system_error
- /usr/include/c++/14/tuple
- /usr/include/c++/14/type_traits
- /usr/include/c++/14/typeinfo
- /usr/include/c++/14/utility
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h
- /usr/include/ctype.h
- /usr/include/endian.h
- /usr/include/errno.h
- /usr/include/features-time64.h
- /usr/include/features.h
- /usr/include/gnu/stubs-64.h
- /usr/include/gnu/stubs.h
- /usr/include/linux/errno.h
- /usr/include/locale.h
- /usr/include/pthread.h
- /usr/include/sched.h
- /usr/include/stdc-predef.h
- /usr/include/stdint.h
- /usr/include/stdio.h
- /usr/include/stdlib.h
- /usr/include/string.h
- /usr/include/strings.h
- /usr/include/sys/cdefs.h
- /usr/include/sys/select.h
- /usr/include/sys/single_threaded.h
- /usr/include/sys/types.h
- /usr/include/time.h
- /usr/include/wchar.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/optional.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/string_view.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/config.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/decode.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/encode.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/translate.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/uri_parts.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri_errors.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/algorithm_find.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_resolve.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri.cpp
- /usr/include/alloca.h
- /usr/include/asm-generic/errno-base.h
- /usr/include/asm-generic/errno.h
- /usr/include/asm/errno.h
- /usr/include/assert.h
- /usr/include/bits/atomic_wide_counter.h
- /usr/include/bits/byteswap.h
- /usr/include/bits/cpu-set.h
- /usr/include/bits/endian.h
- /usr/include/bits/endianness.h
- /usr/include/bits/errno.h
- /usr/include/bits/floatn-common.h
- /usr/include/bits/floatn.h
- /usr/include/bits/libc-header-start.h
- /usr/include/bits/locale.h
- /usr/include/bits/long-double.h
- /usr/include/bits/pthread_stack_min-dynamic.h
- /usr/include/bits/pthreadtypes-arch.h
- /usr/include/bits/pthreadtypes.h
- /usr/include/bits/sched.h
- /usr/include/bits/select.h
- /usr/include/bits/setjmp.h
- /usr/include/bits/stdint-intn.h
- /usr/include/bits/stdint-least.h
- /usr/include/bits/stdint-uintn.h
- /usr/include/bits/stdio.h
- /usr/include/bits/stdio_lim.h
- /usr/include/bits/stdlib-bsearch.h
- /usr/include/bits/stdlib-float.h
- /usr/include/bits/struct_mutex.h
- /usr/include/bits/struct_rwlock.h
- /usr/include/bits/thread-shared-types.h
- /usr/include/bits/time.h
- /usr/include/bits/time64.h
- /usr/include/bits/timesize.h
- /usr/include/bits/timex.h
- /usr/include/bits/types.h
- /usr/include/bits/types/FILE.h
- /usr/include/bits/types/__FILE.h
- /usr/include/bits/types/__fpos64_t.h
- /usr/include/bits/types/__fpos_t.h
- /usr/include/bits/types/__locale_t.h
- /usr/include/bits/types/__mbstate_t.h
- /usr/include/bits/types/__sigset_t.h
- /usr/include/bits/types/clock_t.h
- /usr/include/bits/types/clockid_t.h
- /usr/include/bits/types/cookie_io_functions_t.h
- /usr/include/bits/types/error_t.h
- /usr/include/bits/types/locale_t.h
- /usr/include/bits/types/mbstate_t.h
- /usr/include/bits/types/sigset_t.h
- /usr/include/bits/types/struct_FILE.h
- /usr/include/bits/types/struct___jmp_buf_tag.h
- /usr/include/bits/types/struct_itimerspec.h
- /usr/include/bits/types/struct_sched_param.h
- /usr/include/bits/types/struct_timespec.h
- /usr/include/bits/types/struct_timeval.h
- /usr/include/bits/types/struct_tm.h
- /usr/include/bits/types/time_t.h
- /usr/include/bits/types/timer_t.h
- /usr/include/bits/types/wint_t.h
- /usr/include/bits/typesizes.h
- /usr/include/bits/uintn-identity.h
- /usr/include/bits/waitflags.h
- /usr/include/bits/waitstatus.h
- /usr/include/bits/wchar.h
- /usr/include/bits/wctype-wchar.h
- /usr/include/bits/wordsize.h
- /usr/include/c++/14/algorithm
- /usr/include/c++/14/backward/auto_ptr.h
- /usr/include/c++/14/backward/binders.h
- /usr/include/c++/14/bit
- /usr/include/c++/14/bits/algorithmfwd.h
- /usr/include/c++/14/bits/align.h
- /usr/include/c++/14/bits/alloc_traits.h
- /usr/include/c++/14/bits/allocated_ptr.h
- /usr/include/c++/14/bits/allocator.h
- /usr/include/c++/14/bits/atomic_base.h
- /usr/include/c++/14/bits/atomic_lockfree_defines.h
- /usr/include/c++/14/bits/basic_string.h
- /usr/include/c++/14/bits/basic_string.tcc
- /usr/include/c++/14/bits/char_traits.h
- /usr/include/c++/14/bits/charconv.h
- /usr/include/c++/14/bits/codecvt.h
- /usr/include/c++/14/bits/concept_check.h
- /usr/include/c++/14/bits/cpp_type_traits.h
- /usr/include/c++/14/bits/cxxabi_forced.h
- /usr/include/c++/14/bits/cxxabi_init_exception.h
- /usr/include/c++/14/bits/exception.h
- /usr/include/c++/14/bits/exception_defines.h
- /usr/include/c++/14/bits/exception_ptr.h
- /usr/include/c++/14/bits/functexcept.h
- /usr/include/c++/14/bits/functional_hash.h
- /usr/include/c++/14/bits/hash_bytes.h
- /usr/include/c++/14/bits/invoke.h
- /usr/include/c++/14/bits/ios_base.h
- /usr/include/c++/14/bits/locale_classes.h
- /usr/include/c++/14/bits/locale_classes.tcc
- /usr/include/c++/14/bits/locale_conv.h
- /usr/include/c++/14/bits/locale_facets.h
- /usr/include/c++/14/bits/locale_facets.tcc
- /usr/include/c++/14/bits/locale_facets_nonio.h
- /usr/include/c++/14/bits/locale_facets_nonio.tcc
- /usr/include/c++/14/bits/localefwd.h
- /usr/include/c++/14/bits/memoryfwd.h
- /usr/include/c++/14/bits/move.h
- /usr/include/c++/14/bits/nested_exception.h
- /usr/include/c++/14/bits/new_allocator.h
- /usr/include/c++/14/bits/ostream_insert.h
- /usr/include/c++/14/bits/postypes.h
- /usr/include/c++/14/bits/predefined_ops.h
- /usr/include/c++/14/bits/ptr_traits.h
- /usr/include/c++/14/bits/range_access.h
- /usr/include/c++/14/bits/refwrap.h
- /usr/include/c++/14/bits/requires_hosted.h
- /usr/include/c++/14/bits/shared_ptr.h
- /usr/include/c++/14/bits/shared_ptr_atomic.h
- /usr/include/c++/14/bits/shared_ptr_base.h
- /usr/include/c++/14/bits/std_abs.h
- /usr/include/c++/14/bits/std_function.h
- /usr/include/c++/14/bits/stl_algo.h
- /usr/include/c++/14/bits/stl_algobase.h
- /usr/include/c++/14/bits/stl_bvector.h
- /usr/include/c++/14/bits/stl_construct.h
- /usr/include/c++/14/bits/stl_function.h
- /usr/include/c++/14/bits/stl_heap.h
- /usr/include/c++/14/bits/stl_iterator.h
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h
- /usr/include/c++/14/bits/stl_iterator_base_types.h
- /usr/include/c++/14/bits/stl_pair.h
- /usr/include/c++/14/bits/stl_raw_storage_iter.h
- /usr/include/c++/14/bits/stl_relops.h
- /usr/include/c++/14/bits/stl_tempbuf.h
- /usr/include/c++/14/bits/stl_uninitialized.h
- /usr/include/c++/14/bits/stl_vector.h
- /usr/include/c++/14/bits/stream_iterator.h
- /usr/include/c++/14/bits/streambuf.tcc
- /usr/include/c++/14/bits/streambuf_iterator.h
- /usr/include/c++/14/bits/stringfwd.h
- /usr/include/c++/14/bits/uniform_int_dist.h
- /usr/include/c++/14/bits/unique_ptr.h
- /usr/include/c++/14/bits/uses_allocator.h
- /usr/include/c++/14/bits/utility.h
- /usr/include/c++/14/bits/vector.tcc
- /usr/include/c++/14/bits/version.h
- /usr/include/c++/14/cassert
- /usr/include/c++/14/cctype
- /usr/include/c++/14/cerrno
- /usr/include/c++/14/clocale
- /usr/include/c++/14/cstdint
- /usr/include/c++/14/cstdio
- /usr/include/c++/14/cstdlib
- /usr/include/c++/14/cstring
- /usr/include/c++/14/ctime
- /usr/include/c++/14/cwchar
- /usr/include/c++/14/cwctype
- /usr/include/c++/14/debug/assertions.h
- /usr/include/c++/14/debug/debug.h
- /usr/include/c++/14/exception
- /usr/include/c++/14/ext/aligned_buffer.h
- /usr/include/c++/14/ext/alloc_traits.h
- /usr/include/c++/14/ext/atomicity.h
- /usr/include/c++/14/ext/concurrence.h
- /usr/include/c++/14/ext/numeric_traits.h
- /usr/include/c++/14/ext/string_conversions.h
- /usr/include/c++/14/ext/type_traits.h
- /usr/include/c++/14/functional
- /usr/include/c++/14/initializer_list
- /usr/include/c++/14/iosfwd
- /usr/include/c++/14/iterator
- /usr/include/c++/14/locale
- /usr/include/c++/14/memory
- /usr/include/c++/14/new
- /usr/include/c++/14/stdexcept
- /usr/include/c++/14/streambuf
- /usr/include/c++/14/string
- /usr/include/c++/14/system_error
- /usr/include/c++/14/tuple
- /usr/include/c++/14/type_traits
- /usr/include/c++/14/typeinfo
- /usr/include/c++/14/utility
- /usr/include/c++/14/vector
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h
- /usr/include/ctype.h
- /usr/include/endian.h
- /usr/include/errno.h
- /usr/include/features-time64.h
- /usr/include/features.h
- /usr/include/gnu/stubs-64.h
- /usr/include/gnu/stubs.h
- /usr/include/libintl.h
- /usr/include/linux/errno.h
- /usr/include/locale.h
- /usr/include/pthread.h
- /usr/include/sched.h
- /usr/include/stdc-predef.h
- /usr/include/stdint.h
- /usr/include/stdio.h
- /usr/include/stdlib.h
- /usr/include/string.h
- /usr/include/strings.h
- /usr/include/sys/cdefs.h
- /usr/include/sys/select.h
- /usr/include/sys/single_threaded.h
- /usr/include/sys/types.h
- /usr/include/time.h
- /usr/include/wchar.h
- /usr/include/wctype.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/optional.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/string_view.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/config.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/decode.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/encode.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/translate.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/uri_parts.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri_errors.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/algorithm.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_advance_parts.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_normalize.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_percent_encode.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_resolve.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri_builder.cpp
- /usr/include/alloca.h
- /usr/include/asm-generic/errno-base.h
- /usr/include/asm-generic/errno.h
- /usr/include/asm/errno.h
- /usr/include/assert.h
- /usr/include/bits/atomic_wide_counter.h
- /usr/include/bits/byteswap.h
- /usr/include/bits/cpu-set.h
- /usr/include/bits/endian.h
- /usr/include/bits/endianness.h
- /usr/include/bits/errno.h
- /usr/include/bits/floatn-common.h
- /usr/include/bits/floatn.h
- /usr/include/bits/libc-header-start.h
- /usr/include/bits/locale.h
- /usr/include/bits/long-double.h
- /usr/include/bits/pthread_stack_min-dynamic.h
- /usr/include/bits/pthreadtypes-arch.h
- /usr/include/bits/pthreadtypes.h
- /usr/include/bits/sched.h
- /usr/include/bits/select.h
- /usr/include/bits/setjmp.h
- /usr/include/bits/stdint-intn.h
- /usr/include/bits/stdint-least.h
- /usr/include/bits/stdint-uintn.h
- /usr/include/bits/stdio.h
- /usr/include/bits/stdio_lim.h
- /usr/include/bits/stdlib-bsearch.h
- /usr/include/bits/stdlib-float.h
- /usr/include/bits/struct_mutex.h
- /usr/include/bits/struct_rwlock.h
- /usr/include/bits/thread-shared-types.h
- /usr/include/bits/time.h
- /usr/include/bits/time64.h
- /usr/include/bits/timesize.h
- /usr/include/bits/timex.h
- /usr/include/bits/types.h
- /usr/include/bits/types/FILE.h
- /usr/include/bits/types/__FILE.h
- /usr/include/bits/types/__fpos64_t.h
- /usr/include/bits/types/__fpos_t.h
- /usr/include/bits/types/__locale_t.h
- /usr/include/bits/types/__mbstate_t.h
- /usr/include/bits/types/__sigset_t.h
- /usr/include/bits/types/clock_t.h
- /usr/include/bits/types/clockid_t.h
- /usr/include/bits/types/cookie_io_functions_t.h
- /usr/include/bits/types/error_t.h
- /usr/include/bits/types/locale_t.h
- /usr/include/bits/types/mbstate_t.h
- /usr/include/bits/types/sigset_t.h
- /usr/include/bits/types/struct_FILE.h
- /usr/include/bits/types/struct___jmp_buf_tag.h
- /usr/include/bits/types/struct_itimerspec.h
- /usr/include/bits/types/struct_sched_param.h
- /usr/include/bits/types/struct_timespec.h
- /usr/include/bits/types/struct_timeval.h
- /usr/include/bits/types/struct_tm.h
- /usr/include/bits/types/time_t.h
- /usr/include/bits/types/timer_t.h
- /usr/include/bits/types/wint_t.h
- /usr/include/bits/typesizes.h
- /usr/include/bits/uintn-identity.h
- /usr/include/bits/waitflags.h
- /usr/include/bits/waitstatus.h
- /usr/include/bits/wchar.h
- /usr/include/bits/wctype-wchar.h
- /usr/include/bits/wordsize.h
- /usr/include/c++/14/algorithm
- /usr/include/c++/14/backward/auto_ptr.h
- /usr/include/c++/14/backward/binders.h
- /usr/include/c++/14/bit
- /usr/include/c++/14/bits/algorithmfwd.h
- /usr/include/c++/14/bits/align.h
- /usr/include/c++/14/bits/alloc_traits.h
- /usr/include/c++/14/bits/allocated_ptr.h
- /usr/include/c++/14/bits/allocator.h
- /usr/include/c++/14/bits/atomic_base.h
- /usr/include/c++/14/bits/atomic_lockfree_defines.h
- /usr/include/c++/14/bits/basic_string.h
- /usr/include/c++/14/bits/basic_string.tcc
- /usr/include/c++/14/bits/char_traits.h
- /usr/include/c++/14/bits/charconv.h
- /usr/include/c++/14/bits/codecvt.h
- /usr/include/c++/14/bits/concept_check.h
- /usr/include/c++/14/bits/cpp_type_traits.h
- /usr/include/c++/14/bits/cxxabi_forced.h
- /usr/include/c++/14/bits/cxxabi_init_exception.h
- /usr/include/c++/14/bits/exception.h
- /usr/include/c++/14/bits/exception_defines.h
- /usr/include/c++/14/bits/exception_ptr.h
- /usr/include/c++/14/bits/functexcept.h
- /usr/include/c++/14/bits/functional_hash.h
- /usr/include/c++/14/bits/hash_bytes.h
- /usr/include/c++/14/bits/invoke.h
- /usr/include/c++/14/bits/ios_base.h
- /usr/include/c++/14/bits/locale_classes.h
- /usr/include/c++/14/bits/locale_classes.tcc
- /usr/include/c++/14/bits/locale_conv.h
- /usr/include/c++/14/bits/locale_facets.h
- /usr/include/c++/14/bits/locale_facets.tcc
- /usr/include/c++/14/bits/locale_facets_nonio.h
- /usr/include/c++/14/bits/locale_facets_nonio.tcc
- /usr/include/c++/14/bits/localefwd.h
- /usr/include/c++/14/bits/memoryfwd.h
- /usr/include/c++/14/bits/move.h
- /usr/include/c++/14/bits/nested_exception.h
- /usr/include/c++/14/bits/new_allocator.h
- /usr/include/c++/14/bits/ostream_insert.h
- /usr/include/c++/14/bits/postypes.h
- /usr/include/c++/14/bits/predefined_ops.h
- /usr/include/c++/14/bits/ptr_traits.h
- /usr/include/c++/14/bits/range_access.h
- /usr/include/c++/14/bits/refwrap.h
- /usr/include/c++/14/bits/requires_hosted.h
- /usr/include/c++/14/bits/shared_ptr.h
- /usr/include/c++/14/bits/shared_ptr_atomic.h
- /usr/include/c++/14/bits/shared_ptr_base.h
- /usr/include/c++/14/bits/std_abs.h
- /usr/include/c++/14/bits/std_function.h
- /usr/include/c++/14/bits/stl_algo.h
- /usr/include/c++/14/bits/stl_algobase.h
- /usr/include/c++/14/bits/stl_construct.h
- /usr/include/c++/14/bits/stl_function.h
- /usr/include/c++/14/bits/stl_heap.h
- /usr/include/c++/14/bits/stl_iterator.h
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h
- /usr/include/c++/14/bits/stl_iterator_base_types.h
- /usr/include/c++/14/bits/stl_pair.h
- /usr/include/c++/14/bits/stl_raw_storage_iter.h
- /usr/include/c++/14/bits/stl_relops.h
- /usr/include/c++/14/bits/stl_tempbuf.h
- /usr/include/c++/14/bits/stl_uninitialized.h
- /usr/include/c++/14/bits/stream_iterator.h
- /usr/include/c++/14/bits/streambuf.tcc
- /usr/include/c++/14/bits/streambuf_iterator.h
- /usr/include/c++/14/bits/stringfwd.h
- /usr/include/c++/14/bits/uniform_int_dist.h
- /usr/include/c++/14/bits/unique_ptr.h
- /usr/include/c++/14/bits/uses_allocator.h
- /usr/include/c++/14/bits/utility.h
- /usr/include/c++/14/bits/version.h
- /usr/include/c++/14/cassert
- /usr/include/c++/14/cctype
- /usr/include/c++/14/cerrno
- /usr/include/c++/14/clocale
- /usr/include/c++/14/cstdint
- /usr/include/c++/14/cstdio
- /usr/include/c++/14/cstdlib
- /usr/include/c++/14/cstring
- /usr/include/c++/14/ctime
- /usr/include/c++/14/cwchar
- /usr/include/c++/14/cwctype
- /usr/include/c++/14/debug/assertions.h
- /usr/include/c++/14/debug/debug.h
- /usr/include/c++/14/exception
- /usr/include/c++/14/ext/aligned_buffer.h
- /usr/include/c++/14/ext/alloc_traits.h
- /usr/include/c++/14/ext/atomicity.h
- /usr/include/c++/14/ext/concurrence.h
- /usr/include/c++/14/ext/numeric_traits.h
- /usr/include/c++/14/ext/string_conversions.h
- /usr/include/c++/14/ext/type_traits.h
- /usr/include/c++/14/functional
- /usr/include/c++/14/initializer_list
- /usr/include/c++/14/iosfwd
- /usr/include/c++/14/iterator
- /usr/include/c++/14/locale
- /usr/include/c++/14/memory
- /usr/include/c++/14/new
- /usr/include/c++/14/stdexcept
- /usr/include/c++/14/streambuf
- /usr/include/c++/14/string
- /usr/include/c++/14/system_error
- /usr/include/c++/14/tuple
- /usr/include/c++/14/type_traits
- /usr/include/c++/14/typeinfo
- /usr/include/c++/14/utility
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h
- /usr/include/ctype.h
- /usr/include/endian.h
- /usr/include/errno.h
- /usr/include/features-time64.h
- /usr/include/features.h
- /usr/include/gnu/stubs-64.h
- /usr/include/gnu/stubs.h
- /usr/include/libintl.h
- /usr/include/linux/errno.h
- /usr/include/locale.h
- /usr/include/pthread.h
- /usr/include/sched.h
- /usr/include/stdc-predef.h
- /usr/include/stdint.h
- /usr/include/stdio.h
- /usr/include/stdlib.h
- /usr/include/string.h
- /usr/include/strings.h
- /usr/include/sys/cdefs.h
- /usr/include/sys/select.h
- /usr/include/sys/single_threaded.h
- /usr/include/sys/types.h
- /usr/include/time.h
- /usr/include/wchar.h
- /usr/include/wctype.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/optional.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/string_view.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/config.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/decode.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/encode.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/translate.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/detail/uri_parts.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri_errors.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/algorithm.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_normalize.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/detail/uri_parse_authority.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/uri_errors.cpp
- /usr/include/alloca.h
- /usr/include/asm-generic/errno-base.h
- /usr/include/asm-generic/errno.h
- /usr/include/asm/errno.h
- /usr/include/bits/atomic_wide_counter.h
- /usr/include/bits/byteswap.h
- /usr/include/bits/endian.h
- /usr/include/bits/endianness.h
- /usr/include/bits/errno.h
- /usr/include/bits/floatn-common.h
- /usr/include/bits/floatn.h
- /usr/include/bits/libc-header-start.h
- /usr/include/bits/locale.h
- /usr/include/bits/long-double.h
- /usr/include/bits/pthreadtypes-arch.h
- /usr/include/bits/pthreadtypes.h
- /usr/include/bits/select.h
- /usr/include/bits/stdint-intn.h
- /usr/include/bits/stdio.h
- /usr/include/bits/stdio_lim.h
- /usr/include/bits/stdlib-bsearch.h
- /usr/include/bits/stdlib-float.h
- /usr/include/bits/struct_mutex.h
- /usr/include/bits/struct_rwlock.h
- /usr/include/bits/thread-shared-types.h
- /usr/include/bits/time64.h
- /usr/include/bits/timesize.h
- /usr/include/bits/types.h
- /usr/include/bits/types/FILE.h
- /usr/include/bits/types/__FILE.h
- /usr/include/bits/types/__fpos64_t.h
- /usr/include/bits/types/__fpos_t.h
- /usr/include/bits/types/__locale_t.h
- /usr/include/bits/types/__mbstate_t.h
- /usr/include/bits/types/__sigset_t.h
- /usr/include/bits/types/clock_t.h
- /usr/include/bits/types/clockid_t.h
- /usr/include/bits/types/cookie_io_functions_t.h
- /usr/include/bits/types/error_t.h
- /usr/include/bits/types/locale_t.h
- /usr/include/bits/types/mbstate_t.h
- /usr/include/bits/types/sigset_t.h
- /usr/include/bits/types/struct_FILE.h
- /usr/include/bits/types/struct_timespec.h
- /usr/include/bits/types/struct_timeval.h
- /usr/include/bits/types/time_t.h
- /usr/include/bits/types/timer_t.h
- /usr/include/bits/types/wint_t.h
- /usr/include/bits/typesizes.h
- /usr/include/bits/uintn-identity.h
- /usr/include/bits/waitflags.h
- /usr/include/bits/waitstatus.h
- /usr/include/bits/wchar.h
- /usr/include/bits/wordsize.h
- /usr/include/c++/14/backward/binders.h
- /usr/include/c++/14/bits/alloc_traits.h
- /usr/include/c++/14/bits/allocator.h
- /usr/include/c++/14/bits/basic_string.h
- /usr/include/c++/14/bits/basic_string.tcc
- /usr/include/c++/14/bits/char_traits.h
- /usr/include/c++/14/bits/charconv.h
- /usr/include/c++/14/bits/concept_check.h
- /usr/include/c++/14/bits/cpp_type_traits.h
- /usr/include/c++/14/bits/cxxabi_forced.h
- /usr/include/c++/14/bits/cxxabi_init_exception.h
- /usr/include/c++/14/bits/exception.h
- /usr/include/c++/14/bits/exception_defines.h
- /usr/include/c++/14/bits/exception_ptr.h
- /usr/include/c++/14/bits/functexcept.h
- /usr/include/c++/14/bits/functional_hash.h
- /usr/include/c++/14/bits/hash_bytes.h
- /usr/include/c++/14/bits/invoke.h
- /usr/include/c++/14/bits/localefwd.h
- /usr/include/c++/14/bits/memoryfwd.h
- /usr/include/c++/14/bits/move.h
- /usr/include/c++/14/bits/nested_exception.h
- /usr/include/c++/14/bits/new_allocator.h
- /usr/include/c++/14/bits/ostream_insert.h
- /usr/include/c++/14/bits/postypes.h
- /usr/include/c++/14/bits/predefined_ops.h
- /usr/include/c++/14/bits/ptr_traits.h
- /usr/include/c++/14/bits/range_access.h
- /usr/include/c++/14/bits/refwrap.h
- /usr/include/c++/14/bits/requires_hosted.h
- /usr/include/c++/14/bits/std_abs.h
- /usr/include/c++/14/bits/stl_algobase.h
- /usr/include/c++/14/bits/stl_construct.h
- /usr/include/c++/14/bits/stl_function.h
- /usr/include/c++/14/bits/stl_iterator.h
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h
- /usr/include/c++/14/bits/stl_iterator_base_types.h
- /usr/include/c++/14/bits/stl_pair.h
- /usr/include/c++/14/bits/stringfwd.h
- /usr/include/c++/14/bits/utility.h
- /usr/include/c++/14/bits/version.h
- /usr/include/c++/14/cctype
- /usr/include/c++/14/cerrno
- /usr/include/c++/14/clocale
- /usr/include/c++/14/cstdio
- /usr/include/c++/14/cstdlib
- /usr/include/c++/14/cwchar
- /usr/include/c++/14/debug/assertions.h
- /usr/include/c++/14/debug/debug.h
- /usr/include/c++/14/exception
- /usr/include/c++/14/ext/alloc_traits.h
- /usr/include/c++/14/ext/numeric_traits.h
- /usr/include/c++/14/ext/string_conversions.h
- /usr/include/c++/14/ext/type_traits.h
- /usr/include/c++/14/initializer_list
- /usr/include/c++/14/iosfwd
- /usr/include/c++/14/new
- /usr/include/c++/14/stdexcept
- /usr/include/c++/14/string
- /usr/include/c++/14/system_error
- /usr/include/c++/14/type_traits
- /usr/include/c++/14/typeinfo
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h
- /usr/include/ctype.h
- /usr/include/endian.h
- /usr/include/errno.h
- /usr/include/features-time64.h
- /usr/include/features.h
- /usr/include/gnu/stubs-64.h
- /usr/include/gnu/stubs.h
- /usr/include/linux/errno.h
- /usr/include/locale.h
- /usr/include/stdc-predef.h
- /usr/include/stdio.h
- /usr/include/stdlib.h
- /usr/include/sys/cdefs.h
- /usr/include/sys/select.h
- /usr/include/sys/types.h
- /usr/include/wchar.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/config.hpp
- /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include/network/uri/uri_errors.hpp
-
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.make b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.make
deleted file mode 100644
index ba32393472..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.make
+++ /dev/null
@@ -1,2237 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 3.28
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o: third_party/uri/src/detail/uri_advance_parts.cpp \
- /usr/include/alloca.h \
- /usr/include/asm-generic/errno-base.h \
- /usr/include/asm-generic/errno.h \
- /usr/include/asm/errno.h \
- /usr/include/assert.h \
- /usr/include/bits/atomic_wide_counter.h \
- /usr/include/bits/byteswap.h \
- /usr/include/bits/cpu-set.h \
- /usr/include/bits/endian.h \
- /usr/include/bits/endianness.h \
- /usr/include/bits/errno.h \
- /usr/include/bits/floatn-common.h \
- /usr/include/bits/floatn.h \
- /usr/include/bits/libc-header-start.h \
- /usr/include/bits/locale.h \
- /usr/include/bits/long-double.h \
- /usr/include/bits/pthread_stack_min-dynamic.h \
- /usr/include/bits/pthreadtypes-arch.h \
- /usr/include/bits/pthreadtypes.h \
- /usr/include/bits/sched.h \
- /usr/include/bits/select.h \
- /usr/include/bits/setjmp.h \
- /usr/include/bits/stdint-intn.h \
- /usr/include/bits/stdint-least.h \
- /usr/include/bits/stdint-uintn.h \
- /usr/include/bits/stdio.h \
- /usr/include/bits/stdio_lim.h \
- /usr/include/bits/stdlib-bsearch.h \
- /usr/include/bits/stdlib-float.h \
- /usr/include/bits/struct_mutex.h \
- /usr/include/bits/struct_rwlock.h \
- /usr/include/bits/thread-shared-types.h \
- /usr/include/bits/time.h \
- /usr/include/bits/time64.h \
- /usr/include/bits/timesize.h \
- /usr/include/bits/timex.h \
- /usr/include/bits/types.h \
- /usr/include/bits/types/FILE.h \
- /usr/include/bits/types/__FILE.h \
- /usr/include/bits/types/__fpos64_t.h \
- /usr/include/bits/types/__fpos_t.h \
- /usr/include/bits/types/__locale_t.h \
- /usr/include/bits/types/__mbstate_t.h \
- /usr/include/bits/types/__sigset_t.h \
- /usr/include/bits/types/clock_t.h \
- /usr/include/bits/types/clockid_t.h \
- /usr/include/bits/types/cookie_io_functions_t.h \
- /usr/include/bits/types/error_t.h \
- /usr/include/bits/types/locale_t.h \
- /usr/include/bits/types/mbstate_t.h \
- /usr/include/bits/types/sigset_t.h \
- /usr/include/bits/types/struct_FILE.h \
- /usr/include/bits/types/struct___jmp_buf_tag.h \
- /usr/include/bits/types/struct_itimerspec.h \
- /usr/include/bits/types/struct_sched_param.h \
- /usr/include/bits/types/struct_timespec.h \
- /usr/include/bits/types/struct_timeval.h \
- /usr/include/bits/types/struct_tm.h \
- /usr/include/bits/types/time_t.h \
- /usr/include/bits/types/timer_t.h \
- /usr/include/bits/types/wint_t.h \
- /usr/include/bits/typesizes.h \
- /usr/include/bits/uintn-identity.h \
- /usr/include/bits/waitflags.h \
- /usr/include/bits/waitstatus.h \
- /usr/include/bits/wchar.h \
- /usr/include/bits/wordsize.h \
- /usr/include/c++/14/algorithm \
- /usr/include/c++/14/backward/auto_ptr.h \
- /usr/include/c++/14/backward/binders.h \
- /usr/include/c++/14/bit \
- /usr/include/c++/14/bits/algorithmfwd.h \
- /usr/include/c++/14/bits/align.h \
- /usr/include/c++/14/bits/alloc_traits.h \
- /usr/include/c++/14/bits/allocated_ptr.h \
- /usr/include/c++/14/bits/allocator.h \
- /usr/include/c++/14/bits/atomic_base.h \
- /usr/include/c++/14/bits/atomic_lockfree_defines.h \
- /usr/include/c++/14/bits/basic_string.h \
- /usr/include/c++/14/bits/basic_string.tcc \
- /usr/include/c++/14/bits/char_traits.h \
- /usr/include/c++/14/bits/charconv.h \
- /usr/include/c++/14/bits/concept_check.h \
- /usr/include/c++/14/bits/cpp_type_traits.h \
- /usr/include/c++/14/bits/cxxabi_forced.h \
- /usr/include/c++/14/bits/cxxabi_init_exception.h \
- /usr/include/c++/14/bits/exception.h \
- /usr/include/c++/14/bits/exception_defines.h \
- /usr/include/c++/14/bits/exception_ptr.h \
- /usr/include/c++/14/bits/functexcept.h \
- /usr/include/c++/14/bits/functional_hash.h \
- /usr/include/c++/14/bits/hash_bytes.h \
- /usr/include/c++/14/bits/invoke.h \
- /usr/include/c++/14/bits/ios_base.h \
- /usr/include/c++/14/bits/locale_classes.h \
- /usr/include/c++/14/bits/locale_classes.tcc \
- /usr/include/c++/14/bits/localefwd.h \
- /usr/include/c++/14/bits/memoryfwd.h \
- /usr/include/c++/14/bits/move.h \
- /usr/include/c++/14/bits/nested_exception.h \
- /usr/include/c++/14/bits/new_allocator.h \
- /usr/include/c++/14/bits/ostream_insert.h \
- /usr/include/c++/14/bits/postypes.h \
- /usr/include/c++/14/bits/predefined_ops.h \
- /usr/include/c++/14/bits/ptr_traits.h \
- /usr/include/c++/14/bits/range_access.h \
- /usr/include/c++/14/bits/refwrap.h \
- /usr/include/c++/14/bits/requires_hosted.h \
- /usr/include/c++/14/bits/shared_ptr.h \
- /usr/include/c++/14/bits/shared_ptr_atomic.h \
- /usr/include/c++/14/bits/shared_ptr_base.h \
- /usr/include/c++/14/bits/std_abs.h \
- /usr/include/c++/14/bits/stl_algo.h \
- /usr/include/c++/14/bits/stl_algobase.h \
- /usr/include/c++/14/bits/stl_construct.h \
- /usr/include/c++/14/bits/stl_function.h \
- /usr/include/c++/14/bits/stl_heap.h \
- /usr/include/c++/14/bits/stl_iterator.h \
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h \
- /usr/include/c++/14/bits/stl_iterator_base_types.h \
- /usr/include/c++/14/bits/stl_pair.h \
- /usr/include/c++/14/bits/stl_raw_storage_iter.h \
- /usr/include/c++/14/bits/stl_relops.h \
- /usr/include/c++/14/bits/stl_tempbuf.h \
- /usr/include/c++/14/bits/stl_uninitialized.h \
- /usr/include/c++/14/bits/stream_iterator.h \
- /usr/include/c++/14/bits/streambuf.tcc \
- /usr/include/c++/14/bits/streambuf_iterator.h \
- /usr/include/c++/14/bits/stringfwd.h \
- /usr/include/c++/14/bits/uniform_int_dist.h \
- /usr/include/c++/14/bits/unique_ptr.h \
- /usr/include/c++/14/bits/uses_allocator.h \
- /usr/include/c++/14/bits/utility.h \
- /usr/include/c++/14/bits/version.h \
- /usr/include/c++/14/cassert \
- /usr/include/c++/14/cctype \
- /usr/include/c++/14/cerrno \
- /usr/include/c++/14/clocale \
- /usr/include/c++/14/cstdio \
- /usr/include/c++/14/cstdlib \
- /usr/include/c++/14/cwchar \
- /usr/include/c++/14/debug/assertions.h \
- /usr/include/c++/14/debug/debug.h \
- /usr/include/c++/14/exception \
- /usr/include/c++/14/ext/aligned_buffer.h \
- /usr/include/c++/14/ext/alloc_traits.h \
- /usr/include/c++/14/ext/atomicity.h \
- /usr/include/c++/14/ext/concurrence.h \
- /usr/include/c++/14/ext/numeric_traits.h \
- /usr/include/c++/14/ext/string_conversions.h \
- /usr/include/c++/14/ext/type_traits.h \
- /usr/include/c++/14/initializer_list \
- /usr/include/c++/14/iosfwd \
- /usr/include/c++/14/iterator \
- /usr/include/c++/14/limits \
- /usr/include/c++/14/memory \
- /usr/include/c++/14/new \
- /usr/include/c++/14/stdexcept \
- /usr/include/c++/14/streambuf \
- /usr/include/c++/14/string \
- /usr/include/c++/14/system_error \
- /usr/include/c++/14/tuple \
- /usr/include/c++/14/type_traits \
- /usr/include/c++/14/typeinfo \
- /usr/include/c++/14/utility \
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h \
- /usr/include/ctype.h \
- /usr/include/endian.h \
- /usr/include/errno.h \
- /usr/include/features-time64.h \
- /usr/include/features.h \
- /usr/include/gnu/stubs-64.h \
- /usr/include/gnu/stubs.h \
- /usr/include/linux/errno.h \
- /usr/include/locale.h \
- /usr/include/pthread.h \
- /usr/include/sched.h \
- /usr/include/stdc-predef.h \
- /usr/include/stdint.h \
- /usr/include/stdio.h \
- /usr/include/stdlib.h \
- /usr/include/sys/cdefs.h \
- /usr/include/sys/select.h \
- /usr/include/sys/single_threaded.h \
- /usr/include/sys/types.h \
- /usr/include/time.h \
- /usr/include/wchar.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h \
- third_party/uri/include/network/optional.hpp \
- third_party/uri/include/network/string_view.hpp \
- third_party/uri/include/network/uri/detail/uri_parts.hpp \
- third_party/uri/src/detail/uri_advance_parts.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o: third_party/uri/src/detail/uri_normalize.cpp \
- /usr/include/alloca.h \
- /usr/include/asm-generic/errno-base.h \
- /usr/include/asm-generic/errno.h \
- /usr/include/asm/errno.h \
- /usr/include/assert.h \
- /usr/include/bits/atomic_wide_counter.h \
- /usr/include/bits/byteswap.h \
- /usr/include/bits/cpu-set.h \
- /usr/include/bits/endian.h \
- /usr/include/bits/endianness.h \
- /usr/include/bits/errno.h \
- /usr/include/bits/floatn-common.h \
- /usr/include/bits/floatn.h \
- /usr/include/bits/libc-header-start.h \
- /usr/include/bits/locale.h \
- /usr/include/bits/long-double.h \
- /usr/include/bits/pthread_stack_min-dynamic.h \
- /usr/include/bits/pthreadtypes-arch.h \
- /usr/include/bits/pthreadtypes.h \
- /usr/include/bits/sched.h \
- /usr/include/bits/select.h \
- /usr/include/bits/setjmp.h \
- /usr/include/bits/stdint-intn.h \
- /usr/include/bits/stdint-least.h \
- /usr/include/bits/stdint-uintn.h \
- /usr/include/bits/stdio.h \
- /usr/include/bits/stdio_lim.h \
- /usr/include/bits/stdlib-bsearch.h \
- /usr/include/bits/stdlib-float.h \
- /usr/include/bits/struct_mutex.h \
- /usr/include/bits/struct_rwlock.h \
- /usr/include/bits/thread-shared-types.h \
- /usr/include/bits/time.h \
- /usr/include/bits/time64.h \
- /usr/include/bits/timesize.h \
- /usr/include/bits/timex.h \
- /usr/include/bits/types.h \
- /usr/include/bits/types/FILE.h \
- /usr/include/bits/types/__FILE.h \
- /usr/include/bits/types/__fpos64_t.h \
- /usr/include/bits/types/__fpos_t.h \
- /usr/include/bits/types/__locale_t.h \
- /usr/include/bits/types/__mbstate_t.h \
- /usr/include/bits/types/__sigset_t.h \
- /usr/include/bits/types/clock_t.h \
- /usr/include/bits/types/clockid_t.h \
- /usr/include/bits/types/cookie_io_functions_t.h \
- /usr/include/bits/types/error_t.h \
- /usr/include/bits/types/locale_t.h \
- /usr/include/bits/types/mbstate_t.h \
- /usr/include/bits/types/sigset_t.h \
- /usr/include/bits/types/struct_FILE.h \
- /usr/include/bits/types/struct___jmp_buf_tag.h \
- /usr/include/bits/types/struct_itimerspec.h \
- /usr/include/bits/types/struct_sched_param.h \
- /usr/include/bits/types/struct_timespec.h \
- /usr/include/bits/types/struct_timeval.h \
- /usr/include/bits/types/struct_tm.h \
- /usr/include/bits/types/time_t.h \
- /usr/include/bits/types/timer_t.h \
- /usr/include/bits/types/wint_t.h \
- /usr/include/bits/typesizes.h \
- /usr/include/bits/uintn-identity.h \
- /usr/include/bits/waitflags.h \
- /usr/include/bits/waitstatus.h \
- /usr/include/bits/wchar.h \
- /usr/include/bits/wctype-wchar.h \
- /usr/include/bits/wordsize.h \
- /usr/include/c++/14/algorithm \
- /usr/include/c++/14/backward/auto_ptr.h \
- /usr/include/c++/14/backward/binders.h \
- /usr/include/c++/14/bit \
- /usr/include/c++/14/bits/algorithmfwd.h \
- /usr/include/c++/14/bits/align.h \
- /usr/include/c++/14/bits/alloc_traits.h \
- /usr/include/c++/14/bits/allocated_ptr.h \
- /usr/include/c++/14/bits/allocator.h \
- /usr/include/c++/14/bits/atomic_base.h \
- /usr/include/c++/14/bits/atomic_lockfree_defines.h \
- /usr/include/c++/14/bits/basic_string.h \
- /usr/include/c++/14/bits/basic_string.tcc \
- /usr/include/c++/14/bits/char_traits.h \
- /usr/include/c++/14/bits/charconv.h \
- /usr/include/c++/14/bits/codecvt.h \
- /usr/include/c++/14/bits/concept_check.h \
- /usr/include/c++/14/bits/cpp_type_traits.h \
- /usr/include/c++/14/bits/cxxabi_forced.h \
- /usr/include/c++/14/bits/cxxabi_init_exception.h \
- /usr/include/c++/14/bits/exception.h \
- /usr/include/c++/14/bits/exception_defines.h \
- /usr/include/c++/14/bits/exception_ptr.h \
- /usr/include/c++/14/bits/functexcept.h \
- /usr/include/c++/14/bits/functional_hash.h \
- /usr/include/c++/14/bits/hash_bytes.h \
- /usr/include/c++/14/bits/invoke.h \
- /usr/include/c++/14/bits/ios_base.h \
- /usr/include/c++/14/bits/locale_classes.h \
- /usr/include/c++/14/bits/locale_classes.tcc \
- /usr/include/c++/14/bits/locale_conv.h \
- /usr/include/c++/14/bits/locale_facets.h \
- /usr/include/c++/14/bits/locale_facets.tcc \
- /usr/include/c++/14/bits/locale_facets_nonio.h \
- /usr/include/c++/14/bits/locale_facets_nonio.tcc \
- /usr/include/c++/14/bits/localefwd.h \
- /usr/include/c++/14/bits/memoryfwd.h \
- /usr/include/c++/14/bits/move.h \
- /usr/include/c++/14/bits/nested_exception.h \
- /usr/include/c++/14/bits/new_allocator.h \
- /usr/include/c++/14/bits/ostream_insert.h \
- /usr/include/c++/14/bits/postypes.h \
- /usr/include/c++/14/bits/predefined_ops.h \
- /usr/include/c++/14/bits/ptr_traits.h \
- /usr/include/c++/14/bits/range_access.h \
- /usr/include/c++/14/bits/refwrap.h \
- /usr/include/c++/14/bits/requires_hosted.h \
- /usr/include/c++/14/bits/shared_ptr.h \
- /usr/include/c++/14/bits/shared_ptr_atomic.h \
- /usr/include/c++/14/bits/shared_ptr_base.h \
- /usr/include/c++/14/bits/std_abs.h \
- /usr/include/c++/14/bits/std_function.h \
- /usr/include/c++/14/bits/stl_algo.h \
- /usr/include/c++/14/bits/stl_algobase.h \
- /usr/include/c++/14/bits/stl_bvector.h \
- /usr/include/c++/14/bits/stl_construct.h \
- /usr/include/c++/14/bits/stl_function.h \
- /usr/include/c++/14/bits/stl_heap.h \
- /usr/include/c++/14/bits/stl_iterator.h \
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h \
- /usr/include/c++/14/bits/stl_iterator_base_types.h \
- /usr/include/c++/14/bits/stl_pair.h \
- /usr/include/c++/14/bits/stl_raw_storage_iter.h \
- /usr/include/c++/14/bits/stl_relops.h \
- /usr/include/c++/14/bits/stl_tempbuf.h \
- /usr/include/c++/14/bits/stl_uninitialized.h \
- /usr/include/c++/14/bits/stl_vector.h \
- /usr/include/c++/14/bits/stream_iterator.h \
- /usr/include/c++/14/bits/streambuf.tcc \
- /usr/include/c++/14/bits/streambuf_iterator.h \
- /usr/include/c++/14/bits/stringfwd.h \
- /usr/include/c++/14/bits/uniform_int_dist.h \
- /usr/include/c++/14/bits/unique_ptr.h \
- /usr/include/c++/14/bits/uses_allocator.h \
- /usr/include/c++/14/bits/utility.h \
- /usr/include/c++/14/bits/vector.tcc \
- /usr/include/c++/14/bits/version.h \
- /usr/include/c++/14/cassert \
- /usr/include/c++/14/cctype \
- /usr/include/c++/14/cerrno \
- /usr/include/c++/14/clocale \
- /usr/include/c++/14/cstdint \
- /usr/include/c++/14/cstdio \
- /usr/include/c++/14/cstdlib \
- /usr/include/c++/14/cstring \
- /usr/include/c++/14/ctime \
- /usr/include/c++/14/cwchar \
- /usr/include/c++/14/cwctype \
- /usr/include/c++/14/debug/assertions.h \
- /usr/include/c++/14/debug/debug.h \
- /usr/include/c++/14/exception \
- /usr/include/c++/14/ext/aligned_buffer.h \
- /usr/include/c++/14/ext/alloc_traits.h \
- /usr/include/c++/14/ext/atomicity.h \
- /usr/include/c++/14/ext/concurrence.h \
- /usr/include/c++/14/ext/numeric_traits.h \
- /usr/include/c++/14/ext/string_conversions.h \
- /usr/include/c++/14/ext/type_traits.h \
- /usr/include/c++/14/functional \
- /usr/include/c++/14/initializer_list \
- /usr/include/c++/14/iosfwd \
- /usr/include/c++/14/iterator \
- /usr/include/c++/14/locale \
- /usr/include/c++/14/memory \
- /usr/include/c++/14/new \
- /usr/include/c++/14/stdexcept \
- /usr/include/c++/14/streambuf \
- /usr/include/c++/14/string \
- /usr/include/c++/14/system_error \
- /usr/include/c++/14/tuple \
- /usr/include/c++/14/type_traits \
- /usr/include/c++/14/typeinfo \
- /usr/include/c++/14/utility \
- /usr/include/c++/14/vector \
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h \
- /usr/include/ctype.h \
- /usr/include/endian.h \
- /usr/include/errno.h \
- /usr/include/features-time64.h \
- /usr/include/features.h \
- /usr/include/gnu/stubs-64.h \
- /usr/include/gnu/stubs.h \
- /usr/include/libintl.h \
- /usr/include/linux/errno.h \
- /usr/include/locale.h \
- /usr/include/pthread.h \
- /usr/include/sched.h \
- /usr/include/stdc-predef.h \
- /usr/include/stdint.h \
- /usr/include/stdio.h \
- /usr/include/stdlib.h \
- /usr/include/string.h \
- /usr/include/strings.h \
- /usr/include/sys/cdefs.h \
- /usr/include/sys/select.h \
- /usr/include/sys/single_threaded.h \
- /usr/include/sys/types.h \
- /usr/include/time.h \
- /usr/include/wchar.h \
- /usr/include/wctype.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h \
- third_party/uri/include/network/optional.hpp \
- third_party/uri/include/network/string_view.hpp \
- third_party/uri/include/network/uri/config.hpp \
- third_party/uri/include/network/uri/detail/decode.hpp \
- third_party/uri/include/network/uri/detail/encode.hpp \
- third_party/uri/include/network/uri/detail/translate.hpp \
- third_party/uri/include/network/uri/detail/uri_parts.hpp \
- third_party/uri/include/network/uri/uri.hpp \
- third_party/uri/include/network/uri/uri_builder.hpp \
- third_party/uri/include/network/uri/uri_errors.hpp \
- third_party/uri/src/detail/algorithm.hpp \
- third_party/uri/src/detail/algorithm_split.hpp \
- third_party/uri/src/detail/uri_normalize.hpp \
- third_party/uri/src/detail/uri_percent_encode.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o: third_party/uri/src/detail/uri_parse.cpp \
- /usr/include/alloca.h \
- /usr/include/asm-generic/errno-base.h \
- /usr/include/asm-generic/errno.h \
- /usr/include/asm/errno.h \
- /usr/include/assert.h \
- /usr/include/bits/atomic_wide_counter.h \
- /usr/include/bits/byteswap.h \
- /usr/include/bits/cpu-set.h \
- /usr/include/bits/endian.h \
- /usr/include/bits/endianness.h \
- /usr/include/bits/errno.h \
- /usr/include/bits/floatn-common.h \
- /usr/include/bits/floatn.h \
- /usr/include/bits/libc-header-start.h \
- /usr/include/bits/locale.h \
- /usr/include/bits/long-double.h \
- /usr/include/bits/pthread_stack_min-dynamic.h \
- /usr/include/bits/pthreadtypes-arch.h \
- /usr/include/bits/pthreadtypes.h \
- /usr/include/bits/sched.h \
- /usr/include/bits/select.h \
- /usr/include/bits/setjmp.h \
- /usr/include/bits/stdint-intn.h \
- /usr/include/bits/stdint-least.h \
- /usr/include/bits/stdint-uintn.h \
- /usr/include/bits/stdio.h \
- /usr/include/bits/stdio_lim.h \
- /usr/include/bits/stdlib-bsearch.h \
- /usr/include/bits/stdlib-float.h \
- /usr/include/bits/struct_mutex.h \
- /usr/include/bits/struct_rwlock.h \
- /usr/include/bits/thread-shared-types.h \
- /usr/include/bits/time.h \
- /usr/include/bits/time64.h \
- /usr/include/bits/timesize.h \
- /usr/include/bits/timex.h \
- /usr/include/bits/types.h \
- /usr/include/bits/types/FILE.h \
- /usr/include/bits/types/__FILE.h \
- /usr/include/bits/types/__fpos64_t.h \
- /usr/include/bits/types/__fpos_t.h \
- /usr/include/bits/types/__locale_t.h \
- /usr/include/bits/types/__mbstate_t.h \
- /usr/include/bits/types/__sigset_t.h \
- /usr/include/bits/types/clock_t.h \
- /usr/include/bits/types/clockid_t.h \
- /usr/include/bits/types/cookie_io_functions_t.h \
- /usr/include/bits/types/error_t.h \
- /usr/include/bits/types/locale_t.h \
- /usr/include/bits/types/mbstate_t.h \
- /usr/include/bits/types/sigset_t.h \
- /usr/include/bits/types/struct_FILE.h \
- /usr/include/bits/types/struct___jmp_buf_tag.h \
- /usr/include/bits/types/struct_itimerspec.h \
- /usr/include/bits/types/struct_sched_param.h \
- /usr/include/bits/types/struct_timespec.h \
- /usr/include/bits/types/struct_timeval.h \
- /usr/include/bits/types/struct_tm.h \
- /usr/include/bits/types/time_t.h \
- /usr/include/bits/types/timer_t.h \
- /usr/include/bits/types/wint_t.h \
- /usr/include/bits/typesizes.h \
- /usr/include/bits/uintn-identity.h \
- /usr/include/bits/waitflags.h \
- /usr/include/bits/waitstatus.h \
- /usr/include/bits/wchar.h \
- /usr/include/bits/wctype-wchar.h \
- /usr/include/bits/wordsize.h \
- /usr/include/c++/14/algorithm \
- /usr/include/c++/14/backward/auto_ptr.h \
- /usr/include/c++/14/backward/binders.h \
- /usr/include/c++/14/bit \
- /usr/include/c++/14/bits/algorithmfwd.h \
- /usr/include/c++/14/bits/align.h \
- /usr/include/c++/14/bits/alloc_traits.h \
- /usr/include/c++/14/bits/allocated_ptr.h \
- /usr/include/c++/14/bits/allocator.h \
- /usr/include/c++/14/bits/atomic_base.h \
- /usr/include/c++/14/bits/atomic_lockfree_defines.h \
- /usr/include/c++/14/bits/basic_string.h \
- /usr/include/c++/14/bits/basic_string.tcc \
- /usr/include/c++/14/bits/char_traits.h \
- /usr/include/c++/14/bits/charconv.h \
- /usr/include/c++/14/bits/codecvt.h \
- /usr/include/c++/14/bits/concept_check.h \
- /usr/include/c++/14/bits/cpp_type_traits.h \
- /usr/include/c++/14/bits/cxxabi_forced.h \
- /usr/include/c++/14/bits/cxxabi_init_exception.h \
- /usr/include/c++/14/bits/exception.h \
- /usr/include/c++/14/bits/exception_defines.h \
- /usr/include/c++/14/bits/exception_ptr.h \
- /usr/include/c++/14/bits/functexcept.h \
- /usr/include/c++/14/bits/functional_hash.h \
- /usr/include/c++/14/bits/hash_bytes.h \
- /usr/include/c++/14/bits/invoke.h \
- /usr/include/c++/14/bits/ios_base.h \
- /usr/include/c++/14/bits/locale_classes.h \
- /usr/include/c++/14/bits/locale_classes.tcc \
- /usr/include/c++/14/bits/locale_conv.h \
- /usr/include/c++/14/bits/locale_facets.h \
- /usr/include/c++/14/bits/locale_facets.tcc \
- /usr/include/c++/14/bits/locale_facets_nonio.h \
- /usr/include/c++/14/bits/locale_facets_nonio.tcc \
- /usr/include/c++/14/bits/localefwd.h \
- /usr/include/c++/14/bits/memoryfwd.h \
- /usr/include/c++/14/bits/move.h \
- /usr/include/c++/14/bits/nested_exception.h \
- /usr/include/c++/14/bits/new_allocator.h \
- /usr/include/c++/14/bits/ostream_insert.h \
- /usr/include/c++/14/bits/postypes.h \
- /usr/include/c++/14/bits/predefined_ops.h \
- /usr/include/c++/14/bits/ptr_traits.h \
- /usr/include/c++/14/bits/range_access.h \
- /usr/include/c++/14/bits/refwrap.h \
- /usr/include/c++/14/bits/requires_hosted.h \
- /usr/include/c++/14/bits/shared_ptr.h \
- /usr/include/c++/14/bits/shared_ptr_atomic.h \
- /usr/include/c++/14/bits/shared_ptr_base.h \
- /usr/include/c++/14/bits/std_abs.h \
- /usr/include/c++/14/bits/stl_algo.h \
- /usr/include/c++/14/bits/stl_algobase.h \
- /usr/include/c++/14/bits/stl_construct.h \
- /usr/include/c++/14/bits/stl_function.h \
- /usr/include/c++/14/bits/stl_heap.h \
- /usr/include/c++/14/bits/stl_iterator.h \
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h \
- /usr/include/c++/14/bits/stl_iterator_base_types.h \
- /usr/include/c++/14/bits/stl_pair.h \
- /usr/include/c++/14/bits/stl_raw_storage_iter.h \
- /usr/include/c++/14/bits/stl_relops.h \
- /usr/include/c++/14/bits/stl_tempbuf.h \
- /usr/include/c++/14/bits/stl_uninitialized.h \
- /usr/include/c++/14/bits/stream_iterator.h \
- /usr/include/c++/14/bits/streambuf.tcc \
- /usr/include/c++/14/bits/streambuf_iterator.h \
- /usr/include/c++/14/bits/stringfwd.h \
- /usr/include/c++/14/bits/uniform_int_dist.h \
- /usr/include/c++/14/bits/unique_ptr.h \
- /usr/include/c++/14/bits/uses_allocator.h \
- /usr/include/c++/14/bits/utility.h \
- /usr/include/c++/14/bits/version.h \
- /usr/include/c++/14/cassert \
- /usr/include/c++/14/cctype \
- /usr/include/c++/14/cerrno \
- /usr/include/c++/14/clocale \
- /usr/include/c++/14/cstdio \
- /usr/include/c++/14/cstdlib \
- /usr/include/c++/14/cstring \
- /usr/include/c++/14/ctime \
- /usr/include/c++/14/cwchar \
- /usr/include/c++/14/cwctype \
- /usr/include/c++/14/debug/assertions.h \
- /usr/include/c++/14/debug/debug.h \
- /usr/include/c++/14/exception \
- /usr/include/c++/14/ext/aligned_buffer.h \
- /usr/include/c++/14/ext/alloc_traits.h \
- /usr/include/c++/14/ext/atomicity.h \
- /usr/include/c++/14/ext/concurrence.h \
- /usr/include/c++/14/ext/numeric_traits.h \
- /usr/include/c++/14/ext/string_conversions.h \
- /usr/include/c++/14/ext/type_traits.h \
- /usr/include/c++/14/initializer_list \
- /usr/include/c++/14/iosfwd \
- /usr/include/c++/14/iterator \
- /usr/include/c++/14/limits \
- /usr/include/c++/14/locale \
- /usr/include/c++/14/memory \
- /usr/include/c++/14/new \
- /usr/include/c++/14/stdexcept \
- /usr/include/c++/14/streambuf \
- /usr/include/c++/14/string \
- /usr/include/c++/14/system_error \
- /usr/include/c++/14/tuple \
- /usr/include/c++/14/type_traits \
- /usr/include/c++/14/typeinfo \
- /usr/include/c++/14/utility \
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h \
- /usr/include/ctype.h \
- /usr/include/endian.h \
- /usr/include/errno.h \
- /usr/include/features-time64.h \
- /usr/include/features.h \
- /usr/include/gnu/stubs-64.h \
- /usr/include/gnu/stubs.h \
- /usr/include/libintl.h \
- /usr/include/linux/errno.h \
- /usr/include/locale.h \
- /usr/include/pthread.h \
- /usr/include/sched.h \
- /usr/include/stdc-predef.h \
- /usr/include/stdint.h \
- /usr/include/stdio.h \
- /usr/include/stdlib.h \
- /usr/include/string.h \
- /usr/include/strings.h \
- /usr/include/sys/cdefs.h \
- /usr/include/sys/select.h \
- /usr/include/sys/single_threaded.h \
- /usr/include/sys/types.h \
- /usr/include/time.h \
- /usr/include/wchar.h \
- /usr/include/wctype.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h \
- third_party/uri/include/network/optional.hpp \
- third_party/uri/include/network/string_view.hpp \
- third_party/uri/include/network/uri/detail/uri_parts.hpp \
- third_party/uri/src/detail/grammar.hpp \
- third_party/uri/src/detail/uri_parse.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o: third_party/uri/src/detail/uri_parse_authority.cpp \
- /usr/include/alloca.h \
- /usr/include/asm-generic/errno-base.h \
- /usr/include/asm-generic/errno.h \
- /usr/include/asm/errno.h \
- /usr/include/assert.h \
- /usr/include/bits/atomic_wide_counter.h \
- /usr/include/bits/byteswap.h \
- /usr/include/bits/cpu-set.h \
- /usr/include/bits/endian.h \
- /usr/include/bits/endianness.h \
- /usr/include/bits/errno.h \
- /usr/include/bits/floatn-common.h \
- /usr/include/bits/floatn.h \
- /usr/include/bits/libc-header-start.h \
- /usr/include/bits/locale.h \
- /usr/include/bits/long-double.h \
- /usr/include/bits/pthread_stack_min-dynamic.h \
- /usr/include/bits/pthreadtypes-arch.h \
- /usr/include/bits/pthreadtypes.h \
- /usr/include/bits/sched.h \
- /usr/include/bits/select.h \
- /usr/include/bits/setjmp.h \
- /usr/include/bits/stdint-intn.h \
- /usr/include/bits/stdint-least.h \
- /usr/include/bits/stdint-uintn.h \
- /usr/include/bits/stdio.h \
- /usr/include/bits/stdio_lim.h \
- /usr/include/bits/stdlib-bsearch.h \
- /usr/include/bits/stdlib-float.h \
- /usr/include/bits/struct_mutex.h \
- /usr/include/bits/struct_rwlock.h \
- /usr/include/bits/thread-shared-types.h \
- /usr/include/bits/time.h \
- /usr/include/bits/time64.h \
- /usr/include/bits/timesize.h \
- /usr/include/bits/timex.h \
- /usr/include/bits/types.h \
- /usr/include/bits/types/FILE.h \
- /usr/include/bits/types/__FILE.h \
- /usr/include/bits/types/__fpos64_t.h \
- /usr/include/bits/types/__fpos_t.h \
- /usr/include/bits/types/__locale_t.h \
- /usr/include/bits/types/__mbstate_t.h \
- /usr/include/bits/types/__sigset_t.h \
- /usr/include/bits/types/clock_t.h \
- /usr/include/bits/types/clockid_t.h \
- /usr/include/bits/types/cookie_io_functions_t.h \
- /usr/include/bits/types/error_t.h \
- /usr/include/bits/types/locale_t.h \
- /usr/include/bits/types/mbstate_t.h \
- /usr/include/bits/types/sigset_t.h \
- /usr/include/bits/types/struct_FILE.h \
- /usr/include/bits/types/struct___jmp_buf_tag.h \
- /usr/include/bits/types/struct_itimerspec.h \
- /usr/include/bits/types/struct_sched_param.h \
- /usr/include/bits/types/struct_timespec.h \
- /usr/include/bits/types/struct_timeval.h \
- /usr/include/bits/types/struct_tm.h \
- /usr/include/bits/types/time_t.h \
- /usr/include/bits/types/timer_t.h \
- /usr/include/bits/types/wint_t.h \
- /usr/include/bits/typesizes.h \
- /usr/include/bits/uintn-identity.h \
- /usr/include/bits/waitflags.h \
- /usr/include/bits/waitstatus.h \
- /usr/include/bits/wchar.h \
- /usr/include/bits/wctype-wchar.h \
- /usr/include/bits/wordsize.h \
- /usr/include/c++/14/algorithm \
- /usr/include/c++/14/backward/auto_ptr.h \
- /usr/include/c++/14/backward/binders.h \
- /usr/include/c++/14/bit \
- /usr/include/c++/14/bits/algorithmfwd.h \
- /usr/include/c++/14/bits/align.h \
- /usr/include/c++/14/bits/alloc_traits.h \
- /usr/include/c++/14/bits/allocated_ptr.h \
- /usr/include/c++/14/bits/allocator.h \
- /usr/include/c++/14/bits/atomic_base.h \
- /usr/include/c++/14/bits/atomic_lockfree_defines.h \
- /usr/include/c++/14/bits/basic_string.h \
- /usr/include/c++/14/bits/basic_string.tcc \
- /usr/include/c++/14/bits/char_traits.h \
- /usr/include/c++/14/bits/charconv.h \
- /usr/include/c++/14/bits/codecvt.h \
- /usr/include/c++/14/bits/concept_check.h \
- /usr/include/c++/14/bits/cpp_type_traits.h \
- /usr/include/c++/14/bits/cxxabi_forced.h \
- /usr/include/c++/14/bits/cxxabi_init_exception.h \
- /usr/include/c++/14/bits/exception.h \
- /usr/include/c++/14/bits/exception_defines.h \
- /usr/include/c++/14/bits/exception_ptr.h \
- /usr/include/c++/14/bits/functexcept.h \
- /usr/include/c++/14/bits/functional_hash.h \
- /usr/include/c++/14/bits/hash_bytes.h \
- /usr/include/c++/14/bits/invoke.h \
- /usr/include/c++/14/bits/ios_base.h \
- /usr/include/c++/14/bits/locale_classes.h \
- /usr/include/c++/14/bits/locale_classes.tcc \
- /usr/include/c++/14/bits/locale_conv.h \
- /usr/include/c++/14/bits/locale_facets.h \
- /usr/include/c++/14/bits/locale_facets.tcc \
- /usr/include/c++/14/bits/locale_facets_nonio.h \
- /usr/include/c++/14/bits/locale_facets_nonio.tcc \
- /usr/include/c++/14/bits/localefwd.h \
- /usr/include/c++/14/bits/memoryfwd.h \
- /usr/include/c++/14/bits/move.h \
- /usr/include/c++/14/bits/nested_exception.h \
- /usr/include/c++/14/bits/new_allocator.h \
- /usr/include/c++/14/bits/ostream_insert.h \
- /usr/include/c++/14/bits/postypes.h \
- /usr/include/c++/14/bits/predefined_ops.h \
- /usr/include/c++/14/bits/ptr_traits.h \
- /usr/include/c++/14/bits/range_access.h \
- /usr/include/c++/14/bits/refwrap.h \
- /usr/include/c++/14/bits/requires_hosted.h \
- /usr/include/c++/14/bits/shared_ptr.h \
- /usr/include/c++/14/bits/shared_ptr_atomic.h \
- /usr/include/c++/14/bits/shared_ptr_base.h \
- /usr/include/c++/14/bits/std_abs.h \
- /usr/include/c++/14/bits/stl_algo.h \
- /usr/include/c++/14/bits/stl_algobase.h \
- /usr/include/c++/14/bits/stl_construct.h \
- /usr/include/c++/14/bits/stl_function.h \
- /usr/include/c++/14/bits/stl_heap.h \
- /usr/include/c++/14/bits/stl_iterator.h \
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h \
- /usr/include/c++/14/bits/stl_iterator_base_types.h \
- /usr/include/c++/14/bits/stl_pair.h \
- /usr/include/c++/14/bits/stl_raw_storage_iter.h \
- /usr/include/c++/14/bits/stl_relops.h \
- /usr/include/c++/14/bits/stl_tempbuf.h \
- /usr/include/c++/14/bits/stl_uninitialized.h \
- /usr/include/c++/14/bits/stream_iterator.h \
- /usr/include/c++/14/bits/streambuf.tcc \
- /usr/include/c++/14/bits/streambuf_iterator.h \
- /usr/include/c++/14/bits/stringfwd.h \
- /usr/include/c++/14/bits/uniform_int_dist.h \
- /usr/include/c++/14/bits/unique_ptr.h \
- /usr/include/c++/14/bits/uses_allocator.h \
- /usr/include/c++/14/bits/utility.h \
- /usr/include/c++/14/bits/version.h \
- /usr/include/c++/14/cassert \
- /usr/include/c++/14/cctype \
- /usr/include/c++/14/cerrno \
- /usr/include/c++/14/clocale \
- /usr/include/c++/14/cstdio \
- /usr/include/c++/14/cstdlib \
- /usr/include/c++/14/cstring \
- /usr/include/c++/14/ctime \
- /usr/include/c++/14/cwchar \
- /usr/include/c++/14/cwctype \
- /usr/include/c++/14/debug/assertions.h \
- /usr/include/c++/14/debug/debug.h \
- /usr/include/c++/14/exception \
- /usr/include/c++/14/ext/aligned_buffer.h \
- /usr/include/c++/14/ext/alloc_traits.h \
- /usr/include/c++/14/ext/atomicity.h \
- /usr/include/c++/14/ext/concurrence.h \
- /usr/include/c++/14/ext/numeric_traits.h \
- /usr/include/c++/14/ext/string_conversions.h \
- /usr/include/c++/14/ext/type_traits.h \
- /usr/include/c++/14/initializer_list \
- /usr/include/c++/14/iosfwd \
- /usr/include/c++/14/iterator \
- /usr/include/c++/14/limits \
- /usr/include/c++/14/locale \
- /usr/include/c++/14/memory \
- /usr/include/c++/14/new \
- /usr/include/c++/14/stdexcept \
- /usr/include/c++/14/streambuf \
- /usr/include/c++/14/string \
- /usr/include/c++/14/system_error \
- /usr/include/c++/14/tuple \
- /usr/include/c++/14/type_traits \
- /usr/include/c++/14/typeinfo \
- /usr/include/c++/14/utility \
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h \
- /usr/include/ctype.h \
- /usr/include/endian.h \
- /usr/include/errno.h \
- /usr/include/features-time64.h \
- /usr/include/features.h \
- /usr/include/gnu/stubs-64.h \
- /usr/include/gnu/stubs.h \
- /usr/include/libintl.h \
- /usr/include/linux/errno.h \
- /usr/include/locale.h \
- /usr/include/pthread.h \
- /usr/include/sched.h \
- /usr/include/stdc-predef.h \
- /usr/include/stdint.h \
- /usr/include/stdio.h \
- /usr/include/stdlib.h \
- /usr/include/string.h \
- /usr/include/strings.h \
- /usr/include/sys/cdefs.h \
- /usr/include/sys/select.h \
- /usr/include/sys/single_threaded.h \
- /usr/include/sys/types.h \
- /usr/include/time.h \
- /usr/include/wchar.h \
- /usr/include/wctype.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h \
- third_party/uri/include/network/optional.hpp \
- third_party/uri/include/network/string_view.hpp \
- third_party/uri/include/network/uri/detail/uri_parts.hpp \
- third_party/uri/src/detail/grammar.hpp \
- third_party/uri/src/detail/uri_parse_authority.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o: third_party/uri/src/detail/uri_resolve.cpp \
- /usr/include/alloca.h \
- /usr/include/asm-generic/errno-base.h \
- /usr/include/asm-generic/errno.h \
- /usr/include/asm/errno.h \
- /usr/include/assert.h \
- /usr/include/bits/atomic_wide_counter.h \
- /usr/include/bits/byteswap.h \
- /usr/include/bits/cpu-set.h \
- /usr/include/bits/endian.h \
- /usr/include/bits/endianness.h \
- /usr/include/bits/errno.h \
- /usr/include/bits/floatn-common.h \
- /usr/include/bits/floatn.h \
- /usr/include/bits/libc-header-start.h \
- /usr/include/bits/locale.h \
- /usr/include/bits/long-double.h \
- /usr/include/bits/pthread_stack_min-dynamic.h \
- /usr/include/bits/pthreadtypes-arch.h \
- /usr/include/bits/pthreadtypes.h \
- /usr/include/bits/sched.h \
- /usr/include/bits/select.h \
- /usr/include/bits/setjmp.h \
- /usr/include/bits/stdint-intn.h \
- /usr/include/bits/stdint-least.h \
- /usr/include/bits/stdint-uintn.h \
- /usr/include/bits/stdio.h \
- /usr/include/bits/stdio_lim.h \
- /usr/include/bits/stdlib-bsearch.h \
- /usr/include/bits/stdlib-float.h \
- /usr/include/bits/struct_mutex.h \
- /usr/include/bits/struct_rwlock.h \
- /usr/include/bits/thread-shared-types.h \
- /usr/include/bits/time.h \
- /usr/include/bits/time64.h \
- /usr/include/bits/timesize.h \
- /usr/include/bits/timex.h \
- /usr/include/bits/types.h \
- /usr/include/bits/types/FILE.h \
- /usr/include/bits/types/__FILE.h \
- /usr/include/bits/types/__fpos64_t.h \
- /usr/include/bits/types/__fpos_t.h \
- /usr/include/bits/types/__locale_t.h \
- /usr/include/bits/types/__mbstate_t.h \
- /usr/include/bits/types/__sigset_t.h \
- /usr/include/bits/types/clock_t.h \
- /usr/include/bits/types/clockid_t.h \
- /usr/include/bits/types/cookie_io_functions_t.h \
- /usr/include/bits/types/error_t.h \
- /usr/include/bits/types/locale_t.h \
- /usr/include/bits/types/mbstate_t.h \
- /usr/include/bits/types/sigset_t.h \
- /usr/include/bits/types/struct_FILE.h \
- /usr/include/bits/types/struct___jmp_buf_tag.h \
- /usr/include/bits/types/struct_itimerspec.h \
- /usr/include/bits/types/struct_sched_param.h \
- /usr/include/bits/types/struct_timespec.h \
- /usr/include/bits/types/struct_timeval.h \
- /usr/include/bits/types/struct_tm.h \
- /usr/include/bits/types/time_t.h \
- /usr/include/bits/types/timer_t.h \
- /usr/include/bits/types/wint_t.h \
- /usr/include/bits/typesizes.h \
- /usr/include/bits/uintn-identity.h \
- /usr/include/bits/waitflags.h \
- /usr/include/bits/waitstatus.h \
- /usr/include/bits/wchar.h \
- /usr/include/bits/wordsize.h \
- /usr/include/c++/14/algorithm \
- /usr/include/c++/14/backward/auto_ptr.h \
- /usr/include/c++/14/backward/binders.h \
- /usr/include/c++/14/bit \
- /usr/include/c++/14/bits/algorithmfwd.h \
- /usr/include/c++/14/bits/align.h \
- /usr/include/c++/14/bits/alloc_traits.h \
- /usr/include/c++/14/bits/allocated_ptr.h \
- /usr/include/c++/14/bits/allocator.h \
- /usr/include/c++/14/bits/atomic_base.h \
- /usr/include/c++/14/bits/atomic_lockfree_defines.h \
- /usr/include/c++/14/bits/basic_string.h \
- /usr/include/c++/14/bits/basic_string.tcc \
- /usr/include/c++/14/bits/char_traits.h \
- /usr/include/c++/14/bits/charconv.h \
- /usr/include/c++/14/bits/concept_check.h \
- /usr/include/c++/14/bits/cpp_type_traits.h \
- /usr/include/c++/14/bits/cxxabi_forced.h \
- /usr/include/c++/14/bits/cxxabi_init_exception.h \
- /usr/include/c++/14/bits/exception.h \
- /usr/include/c++/14/bits/exception_defines.h \
- /usr/include/c++/14/bits/exception_ptr.h \
- /usr/include/c++/14/bits/functexcept.h \
- /usr/include/c++/14/bits/functional_hash.h \
- /usr/include/c++/14/bits/hash_bytes.h \
- /usr/include/c++/14/bits/invoke.h \
- /usr/include/c++/14/bits/ios_base.h \
- /usr/include/c++/14/bits/locale_classes.h \
- /usr/include/c++/14/bits/locale_classes.tcc \
- /usr/include/c++/14/bits/localefwd.h \
- /usr/include/c++/14/bits/memoryfwd.h \
- /usr/include/c++/14/bits/move.h \
- /usr/include/c++/14/bits/nested_exception.h \
- /usr/include/c++/14/bits/new_allocator.h \
- /usr/include/c++/14/bits/ostream_insert.h \
- /usr/include/c++/14/bits/postypes.h \
- /usr/include/c++/14/bits/predefined_ops.h \
- /usr/include/c++/14/bits/ptr_traits.h \
- /usr/include/c++/14/bits/range_access.h \
- /usr/include/c++/14/bits/refwrap.h \
- /usr/include/c++/14/bits/requires_hosted.h \
- /usr/include/c++/14/bits/shared_ptr.h \
- /usr/include/c++/14/bits/shared_ptr_atomic.h \
- /usr/include/c++/14/bits/shared_ptr_base.h \
- /usr/include/c++/14/bits/std_abs.h \
- /usr/include/c++/14/bits/std_function.h \
- /usr/include/c++/14/bits/stl_algo.h \
- /usr/include/c++/14/bits/stl_algobase.h \
- /usr/include/c++/14/bits/stl_construct.h \
- /usr/include/c++/14/bits/stl_function.h \
- /usr/include/c++/14/bits/stl_heap.h \
- /usr/include/c++/14/bits/stl_iterator.h \
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h \
- /usr/include/c++/14/bits/stl_iterator_base_types.h \
- /usr/include/c++/14/bits/stl_pair.h \
- /usr/include/c++/14/bits/stl_raw_storage_iter.h \
- /usr/include/c++/14/bits/stl_relops.h \
- /usr/include/c++/14/bits/stl_tempbuf.h \
- /usr/include/c++/14/bits/stl_uninitialized.h \
- /usr/include/c++/14/bits/stream_iterator.h \
- /usr/include/c++/14/bits/streambuf.tcc \
- /usr/include/c++/14/bits/streambuf_iterator.h \
- /usr/include/c++/14/bits/stringfwd.h \
- /usr/include/c++/14/bits/uniform_int_dist.h \
- /usr/include/c++/14/bits/unique_ptr.h \
- /usr/include/c++/14/bits/uses_allocator.h \
- /usr/include/c++/14/bits/utility.h \
- /usr/include/c++/14/bits/version.h \
- /usr/include/c++/14/cassert \
- /usr/include/c++/14/cctype \
- /usr/include/c++/14/cerrno \
- /usr/include/c++/14/clocale \
- /usr/include/c++/14/cstddef \
- /usr/include/c++/14/cstdint \
- /usr/include/c++/14/cstdio \
- /usr/include/c++/14/cstdlib \
- /usr/include/c++/14/cstring \
- /usr/include/c++/14/cwchar \
- /usr/include/c++/14/debug/assertions.h \
- /usr/include/c++/14/debug/debug.h \
- /usr/include/c++/14/exception \
- /usr/include/c++/14/ext/aligned_buffer.h \
- /usr/include/c++/14/ext/alloc_traits.h \
- /usr/include/c++/14/ext/atomicity.h \
- /usr/include/c++/14/ext/concurrence.h \
- /usr/include/c++/14/ext/numeric_traits.h \
- /usr/include/c++/14/ext/string_conversions.h \
- /usr/include/c++/14/ext/type_traits.h \
- /usr/include/c++/14/functional \
- /usr/include/c++/14/initializer_list \
- /usr/include/c++/14/iosfwd \
- /usr/include/c++/14/iterator \
- /usr/include/c++/14/memory \
- /usr/include/c++/14/new \
- /usr/include/c++/14/stdexcept \
- /usr/include/c++/14/streambuf \
- /usr/include/c++/14/string \
- /usr/include/c++/14/system_error \
- /usr/include/c++/14/tuple \
- /usr/include/c++/14/type_traits \
- /usr/include/c++/14/typeinfo \
- /usr/include/c++/14/utility \
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h \
- /usr/include/ctype.h \
- /usr/include/endian.h \
- /usr/include/errno.h \
- /usr/include/features-time64.h \
- /usr/include/features.h \
- /usr/include/gnu/stubs-64.h \
- /usr/include/gnu/stubs.h \
- /usr/include/linux/errno.h \
- /usr/include/locale.h \
- /usr/include/pthread.h \
- /usr/include/sched.h \
- /usr/include/stdc-predef.h \
- /usr/include/stdint.h \
- /usr/include/stdio.h \
- /usr/include/stdlib.h \
- /usr/include/string.h \
- /usr/include/strings.h \
- /usr/include/sys/cdefs.h \
- /usr/include/sys/select.h \
- /usr/include/sys/single_threaded.h \
- /usr/include/sys/types.h \
- /usr/include/time.h \
- /usr/include/wchar.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h \
- third_party/uri/include/network/optional.hpp \
- third_party/uri/include/network/string_view.hpp \
- third_party/uri/include/network/uri/config.hpp \
- third_party/uri/include/network/uri/detail/decode.hpp \
- third_party/uri/include/network/uri/detail/encode.hpp \
- third_party/uri/include/network/uri/detail/translate.hpp \
- third_party/uri/include/network/uri/detail/uri_parts.hpp \
- third_party/uri/include/network/uri/uri.hpp \
- third_party/uri/include/network/uri/uri_builder.hpp \
- third_party/uri/include/network/uri/uri_errors.hpp \
- third_party/uri/src/detail/algorithm_find.hpp \
- third_party/uri/src/detail/uri_resolve.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o: third_party/uri/src/uri.cpp \
- /usr/include/alloca.h \
- /usr/include/asm-generic/errno-base.h \
- /usr/include/asm-generic/errno.h \
- /usr/include/asm/errno.h \
- /usr/include/assert.h \
- /usr/include/bits/atomic_wide_counter.h \
- /usr/include/bits/byteswap.h \
- /usr/include/bits/cpu-set.h \
- /usr/include/bits/endian.h \
- /usr/include/bits/endianness.h \
- /usr/include/bits/errno.h \
- /usr/include/bits/floatn-common.h \
- /usr/include/bits/floatn.h \
- /usr/include/bits/libc-header-start.h \
- /usr/include/bits/locale.h \
- /usr/include/bits/long-double.h \
- /usr/include/bits/pthread_stack_min-dynamic.h \
- /usr/include/bits/pthreadtypes-arch.h \
- /usr/include/bits/pthreadtypes.h \
- /usr/include/bits/sched.h \
- /usr/include/bits/select.h \
- /usr/include/bits/setjmp.h \
- /usr/include/bits/stdint-intn.h \
- /usr/include/bits/stdint-least.h \
- /usr/include/bits/stdint-uintn.h \
- /usr/include/bits/stdio.h \
- /usr/include/bits/stdio_lim.h \
- /usr/include/bits/stdlib-bsearch.h \
- /usr/include/bits/stdlib-float.h \
- /usr/include/bits/struct_mutex.h \
- /usr/include/bits/struct_rwlock.h \
- /usr/include/bits/thread-shared-types.h \
- /usr/include/bits/time.h \
- /usr/include/bits/time64.h \
- /usr/include/bits/timesize.h \
- /usr/include/bits/timex.h \
- /usr/include/bits/types.h \
- /usr/include/bits/types/FILE.h \
- /usr/include/bits/types/__FILE.h \
- /usr/include/bits/types/__fpos64_t.h \
- /usr/include/bits/types/__fpos_t.h \
- /usr/include/bits/types/__locale_t.h \
- /usr/include/bits/types/__mbstate_t.h \
- /usr/include/bits/types/__sigset_t.h \
- /usr/include/bits/types/clock_t.h \
- /usr/include/bits/types/clockid_t.h \
- /usr/include/bits/types/cookie_io_functions_t.h \
- /usr/include/bits/types/error_t.h \
- /usr/include/bits/types/locale_t.h \
- /usr/include/bits/types/mbstate_t.h \
- /usr/include/bits/types/sigset_t.h \
- /usr/include/bits/types/struct_FILE.h \
- /usr/include/bits/types/struct___jmp_buf_tag.h \
- /usr/include/bits/types/struct_itimerspec.h \
- /usr/include/bits/types/struct_sched_param.h \
- /usr/include/bits/types/struct_timespec.h \
- /usr/include/bits/types/struct_timeval.h \
- /usr/include/bits/types/struct_tm.h \
- /usr/include/bits/types/time_t.h \
- /usr/include/bits/types/timer_t.h \
- /usr/include/bits/types/wint_t.h \
- /usr/include/bits/typesizes.h \
- /usr/include/bits/uintn-identity.h \
- /usr/include/bits/waitflags.h \
- /usr/include/bits/waitstatus.h \
- /usr/include/bits/wchar.h \
- /usr/include/bits/wctype-wchar.h \
- /usr/include/bits/wordsize.h \
- /usr/include/c++/14/algorithm \
- /usr/include/c++/14/backward/auto_ptr.h \
- /usr/include/c++/14/backward/binders.h \
- /usr/include/c++/14/bit \
- /usr/include/c++/14/bits/algorithmfwd.h \
- /usr/include/c++/14/bits/align.h \
- /usr/include/c++/14/bits/alloc_traits.h \
- /usr/include/c++/14/bits/allocated_ptr.h \
- /usr/include/c++/14/bits/allocator.h \
- /usr/include/c++/14/bits/atomic_base.h \
- /usr/include/c++/14/bits/atomic_lockfree_defines.h \
- /usr/include/c++/14/bits/basic_string.h \
- /usr/include/c++/14/bits/basic_string.tcc \
- /usr/include/c++/14/bits/char_traits.h \
- /usr/include/c++/14/bits/charconv.h \
- /usr/include/c++/14/bits/codecvt.h \
- /usr/include/c++/14/bits/concept_check.h \
- /usr/include/c++/14/bits/cpp_type_traits.h \
- /usr/include/c++/14/bits/cxxabi_forced.h \
- /usr/include/c++/14/bits/cxxabi_init_exception.h \
- /usr/include/c++/14/bits/exception.h \
- /usr/include/c++/14/bits/exception_defines.h \
- /usr/include/c++/14/bits/exception_ptr.h \
- /usr/include/c++/14/bits/functexcept.h \
- /usr/include/c++/14/bits/functional_hash.h \
- /usr/include/c++/14/bits/hash_bytes.h \
- /usr/include/c++/14/bits/invoke.h \
- /usr/include/c++/14/bits/ios_base.h \
- /usr/include/c++/14/bits/locale_classes.h \
- /usr/include/c++/14/bits/locale_classes.tcc \
- /usr/include/c++/14/bits/locale_conv.h \
- /usr/include/c++/14/bits/locale_facets.h \
- /usr/include/c++/14/bits/locale_facets.tcc \
- /usr/include/c++/14/bits/locale_facets_nonio.h \
- /usr/include/c++/14/bits/locale_facets_nonio.tcc \
- /usr/include/c++/14/bits/localefwd.h \
- /usr/include/c++/14/bits/memoryfwd.h \
- /usr/include/c++/14/bits/move.h \
- /usr/include/c++/14/bits/nested_exception.h \
- /usr/include/c++/14/bits/new_allocator.h \
- /usr/include/c++/14/bits/ostream_insert.h \
- /usr/include/c++/14/bits/postypes.h \
- /usr/include/c++/14/bits/predefined_ops.h \
- /usr/include/c++/14/bits/ptr_traits.h \
- /usr/include/c++/14/bits/range_access.h \
- /usr/include/c++/14/bits/refwrap.h \
- /usr/include/c++/14/bits/requires_hosted.h \
- /usr/include/c++/14/bits/shared_ptr.h \
- /usr/include/c++/14/bits/shared_ptr_atomic.h \
- /usr/include/c++/14/bits/shared_ptr_base.h \
- /usr/include/c++/14/bits/std_abs.h \
- /usr/include/c++/14/bits/std_function.h \
- /usr/include/c++/14/bits/stl_algo.h \
- /usr/include/c++/14/bits/stl_algobase.h \
- /usr/include/c++/14/bits/stl_bvector.h \
- /usr/include/c++/14/bits/stl_construct.h \
- /usr/include/c++/14/bits/stl_function.h \
- /usr/include/c++/14/bits/stl_heap.h \
- /usr/include/c++/14/bits/stl_iterator.h \
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h \
- /usr/include/c++/14/bits/stl_iterator_base_types.h \
- /usr/include/c++/14/bits/stl_pair.h \
- /usr/include/c++/14/bits/stl_raw_storage_iter.h \
- /usr/include/c++/14/bits/stl_relops.h \
- /usr/include/c++/14/bits/stl_tempbuf.h \
- /usr/include/c++/14/bits/stl_uninitialized.h \
- /usr/include/c++/14/bits/stl_vector.h \
- /usr/include/c++/14/bits/stream_iterator.h \
- /usr/include/c++/14/bits/streambuf.tcc \
- /usr/include/c++/14/bits/streambuf_iterator.h \
- /usr/include/c++/14/bits/stringfwd.h \
- /usr/include/c++/14/bits/uniform_int_dist.h \
- /usr/include/c++/14/bits/unique_ptr.h \
- /usr/include/c++/14/bits/uses_allocator.h \
- /usr/include/c++/14/bits/utility.h \
- /usr/include/c++/14/bits/vector.tcc \
- /usr/include/c++/14/bits/version.h \
- /usr/include/c++/14/cassert \
- /usr/include/c++/14/cctype \
- /usr/include/c++/14/cerrno \
- /usr/include/c++/14/clocale \
- /usr/include/c++/14/cstdint \
- /usr/include/c++/14/cstdio \
- /usr/include/c++/14/cstdlib \
- /usr/include/c++/14/cstring \
- /usr/include/c++/14/ctime \
- /usr/include/c++/14/cwchar \
- /usr/include/c++/14/cwctype \
- /usr/include/c++/14/debug/assertions.h \
- /usr/include/c++/14/debug/debug.h \
- /usr/include/c++/14/exception \
- /usr/include/c++/14/ext/aligned_buffer.h \
- /usr/include/c++/14/ext/alloc_traits.h \
- /usr/include/c++/14/ext/atomicity.h \
- /usr/include/c++/14/ext/concurrence.h \
- /usr/include/c++/14/ext/numeric_traits.h \
- /usr/include/c++/14/ext/string_conversions.h \
- /usr/include/c++/14/ext/type_traits.h \
- /usr/include/c++/14/functional \
- /usr/include/c++/14/initializer_list \
- /usr/include/c++/14/iosfwd \
- /usr/include/c++/14/iterator \
- /usr/include/c++/14/locale \
- /usr/include/c++/14/memory \
- /usr/include/c++/14/new \
- /usr/include/c++/14/stdexcept \
- /usr/include/c++/14/streambuf \
- /usr/include/c++/14/string \
- /usr/include/c++/14/system_error \
- /usr/include/c++/14/tuple \
- /usr/include/c++/14/type_traits \
- /usr/include/c++/14/typeinfo \
- /usr/include/c++/14/utility \
- /usr/include/c++/14/vector \
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h \
- /usr/include/ctype.h \
- /usr/include/endian.h \
- /usr/include/errno.h \
- /usr/include/features-time64.h \
- /usr/include/features.h \
- /usr/include/gnu/stubs-64.h \
- /usr/include/gnu/stubs.h \
- /usr/include/libintl.h \
- /usr/include/linux/errno.h \
- /usr/include/locale.h \
- /usr/include/pthread.h \
- /usr/include/sched.h \
- /usr/include/stdc-predef.h \
- /usr/include/stdint.h \
- /usr/include/stdio.h \
- /usr/include/stdlib.h \
- /usr/include/string.h \
- /usr/include/strings.h \
- /usr/include/sys/cdefs.h \
- /usr/include/sys/select.h \
- /usr/include/sys/single_threaded.h \
- /usr/include/sys/types.h \
- /usr/include/time.h \
- /usr/include/wchar.h \
- /usr/include/wctype.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h \
- third_party/uri/include/network/optional.hpp \
- third_party/uri/include/network/string_view.hpp \
- third_party/uri/include/network/uri/config.hpp \
- third_party/uri/include/network/uri/detail/decode.hpp \
- third_party/uri/include/network/uri/detail/encode.hpp \
- third_party/uri/include/network/uri/detail/translate.hpp \
- third_party/uri/include/network/uri/detail/uri_parts.hpp \
- third_party/uri/include/network/uri/uri.hpp \
- third_party/uri/include/network/uri/uri_builder.hpp \
- third_party/uri/include/network/uri/uri_errors.hpp \
- third_party/uri/src/detail/algorithm.hpp \
- third_party/uri/src/detail/uri_advance_parts.hpp \
- third_party/uri/src/detail/uri_normalize.hpp \
- third_party/uri/src/detail/uri_parse.hpp \
- third_party/uri/src/detail/uri_percent_encode.hpp \
- third_party/uri/src/detail/uri_resolve.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o: third_party/uri/src/uri_builder.cpp \
- /usr/include/alloca.h \
- /usr/include/asm-generic/errno-base.h \
- /usr/include/asm-generic/errno.h \
- /usr/include/asm/errno.h \
- /usr/include/assert.h \
- /usr/include/bits/atomic_wide_counter.h \
- /usr/include/bits/byteswap.h \
- /usr/include/bits/cpu-set.h \
- /usr/include/bits/endian.h \
- /usr/include/bits/endianness.h \
- /usr/include/bits/errno.h \
- /usr/include/bits/floatn-common.h \
- /usr/include/bits/floatn.h \
- /usr/include/bits/libc-header-start.h \
- /usr/include/bits/locale.h \
- /usr/include/bits/long-double.h \
- /usr/include/bits/pthread_stack_min-dynamic.h \
- /usr/include/bits/pthreadtypes-arch.h \
- /usr/include/bits/pthreadtypes.h \
- /usr/include/bits/sched.h \
- /usr/include/bits/select.h \
- /usr/include/bits/setjmp.h \
- /usr/include/bits/stdint-intn.h \
- /usr/include/bits/stdint-least.h \
- /usr/include/bits/stdint-uintn.h \
- /usr/include/bits/stdio.h \
- /usr/include/bits/stdio_lim.h \
- /usr/include/bits/stdlib-bsearch.h \
- /usr/include/bits/stdlib-float.h \
- /usr/include/bits/struct_mutex.h \
- /usr/include/bits/struct_rwlock.h \
- /usr/include/bits/thread-shared-types.h \
- /usr/include/bits/time.h \
- /usr/include/bits/time64.h \
- /usr/include/bits/timesize.h \
- /usr/include/bits/timex.h \
- /usr/include/bits/types.h \
- /usr/include/bits/types/FILE.h \
- /usr/include/bits/types/__FILE.h \
- /usr/include/bits/types/__fpos64_t.h \
- /usr/include/bits/types/__fpos_t.h \
- /usr/include/bits/types/__locale_t.h \
- /usr/include/bits/types/__mbstate_t.h \
- /usr/include/bits/types/__sigset_t.h \
- /usr/include/bits/types/clock_t.h \
- /usr/include/bits/types/clockid_t.h \
- /usr/include/bits/types/cookie_io_functions_t.h \
- /usr/include/bits/types/error_t.h \
- /usr/include/bits/types/locale_t.h \
- /usr/include/bits/types/mbstate_t.h \
- /usr/include/bits/types/sigset_t.h \
- /usr/include/bits/types/struct_FILE.h \
- /usr/include/bits/types/struct___jmp_buf_tag.h \
- /usr/include/bits/types/struct_itimerspec.h \
- /usr/include/bits/types/struct_sched_param.h \
- /usr/include/bits/types/struct_timespec.h \
- /usr/include/bits/types/struct_timeval.h \
- /usr/include/bits/types/struct_tm.h \
- /usr/include/bits/types/time_t.h \
- /usr/include/bits/types/timer_t.h \
- /usr/include/bits/types/wint_t.h \
- /usr/include/bits/typesizes.h \
- /usr/include/bits/uintn-identity.h \
- /usr/include/bits/waitflags.h \
- /usr/include/bits/waitstatus.h \
- /usr/include/bits/wchar.h \
- /usr/include/bits/wctype-wchar.h \
- /usr/include/bits/wordsize.h \
- /usr/include/c++/14/algorithm \
- /usr/include/c++/14/backward/auto_ptr.h \
- /usr/include/c++/14/backward/binders.h \
- /usr/include/c++/14/bit \
- /usr/include/c++/14/bits/algorithmfwd.h \
- /usr/include/c++/14/bits/align.h \
- /usr/include/c++/14/bits/alloc_traits.h \
- /usr/include/c++/14/bits/allocated_ptr.h \
- /usr/include/c++/14/bits/allocator.h \
- /usr/include/c++/14/bits/atomic_base.h \
- /usr/include/c++/14/bits/atomic_lockfree_defines.h \
- /usr/include/c++/14/bits/basic_string.h \
- /usr/include/c++/14/bits/basic_string.tcc \
- /usr/include/c++/14/bits/char_traits.h \
- /usr/include/c++/14/bits/charconv.h \
- /usr/include/c++/14/bits/codecvt.h \
- /usr/include/c++/14/bits/concept_check.h \
- /usr/include/c++/14/bits/cpp_type_traits.h \
- /usr/include/c++/14/bits/cxxabi_forced.h \
- /usr/include/c++/14/bits/cxxabi_init_exception.h \
- /usr/include/c++/14/bits/exception.h \
- /usr/include/c++/14/bits/exception_defines.h \
- /usr/include/c++/14/bits/exception_ptr.h \
- /usr/include/c++/14/bits/functexcept.h \
- /usr/include/c++/14/bits/functional_hash.h \
- /usr/include/c++/14/bits/hash_bytes.h \
- /usr/include/c++/14/bits/invoke.h \
- /usr/include/c++/14/bits/ios_base.h \
- /usr/include/c++/14/bits/locale_classes.h \
- /usr/include/c++/14/bits/locale_classes.tcc \
- /usr/include/c++/14/bits/locale_conv.h \
- /usr/include/c++/14/bits/locale_facets.h \
- /usr/include/c++/14/bits/locale_facets.tcc \
- /usr/include/c++/14/bits/locale_facets_nonio.h \
- /usr/include/c++/14/bits/locale_facets_nonio.tcc \
- /usr/include/c++/14/bits/localefwd.h \
- /usr/include/c++/14/bits/memoryfwd.h \
- /usr/include/c++/14/bits/move.h \
- /usr/include/c++/14/bits/nested_exception.h \
- /usr/include/c++/14/bits/new_allocator.h \
- /usr/include/c++/14/bits/ostream_insert.h \
- /usr/include/c++/14/bits/postypes.h \
- /usr/include/c++/14/bits/predefined_ops.h \
- /usr/include/c++/14/bits/ptr_traits.h \
- /usr/include/c++/14/bits/range_access.h \
- /usr/include/c++/14/bits/refwrap.h \
- /usr/include/c++/14/bits/requires_hosted.h \
- /usr/include/c++/14/bits/shared_ptr.h \
- /usr/include/c++/14/bits/shared_ptr_atomic.h \
- /usr/include/c++/14/bits/shared_ptr_base.h \
- /usr/include/c++/14/bits/std_abs.h \
- /usr/include/c++/14/bits/std_function.h \
- /usr/include/c++/14/bits/stl_algo.h \
- /usr/include/c++/14/bits/stl_algobase.h \
- /usr/include/c++/14/bits/stl_construct.h \
- /usr/include/c++/14/bits/stl_function.h \
- /usr/include/c++/14/bits/stl_heap.h \
- /usr/include/c++/14/bits/stl_iterator.h \
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h \
- /usr/include/c++/14/bits/stl_iterator_base_types.h \
- /usr/include/c++/14/bits/stl_pair.h \
- /usr/include/c++/14/bits/stl_raw_storage_iter.h \
- /usr/include/c++/14/bits/stl_relops.h \
- /usr/include/c++/14/bits/stl_tempbuf.h \
- /usr/include/c++/14/bits/stl_uninitialized.h \
- /usr/include/c++/14/bits/stream_iterator.h \
- /usr/include/c++/14/bits/streambuf.tcc \
- /usr/include/c++/14/bits/streambuf_iterator.h \
- /usr/include/c++/14/bits/stringfwd.h \
- /usr/include/c++/14/bits/uniform_int_dist.h \
- /usr/include/c++/14/bits/unique_ptr.h \
- /usr/include/c++/14/bits/uses_allocator.h \
- /usr/include/c++/14/bits/utility.h \
- /usr/include/c++/14/bits/version.h \
- /usr/include/c++/14/cassert \
- /usr/include/c++/14/cctype \
- /usr/include/c++/14/cerrno \
- /usr/include/c++/14/clocale \
- /usr/include/c++/14/cstdint \
- /usr/include/c++/14/cstdio \
- /usr/include/c++/14/cstdlib \
- /usr/include/c++/14/cstring \
- /usr/include/c++/14/ctime \
- /usr/include/c++/14/cwchar \
- /usr/include/c++/14/cwctype \
- /usr/include/c++/14/debug/assertions.h \
- /usr/include/c++/14/debug/debug.h \
- /usr/include/c++/14/exception \
- /usr/include/c++/14/ext/aligned_buffer.h \
- /usr/include/c++/14/ext/alloc_traits.h \
- /usr/include/c++/14/ext/atomicity.h \
- /usr/include/c++/14/ext/concurrence.h \
- /usr/include/c++/14/ext/numeric_traits.h \
- /usr/include/c++/14/ext/string_conversions.h \
- /usr/include/c++/14/ext/type_traits.h \
- /usr/include/c++/14/functional \
- /usr/include/c++/14/initializer_list \
- /usr/include/c++/14/iosfwd \
- /usr/include/c++/14/iterator \
- /usr/include/c++/14/locale \
- /usr/include/c++/14/memory \
- /usr/include/c++/14/new \
- /usr/include/c++/14/stdexcept \
- /usr/include/c++/14/streambuf \
- /usr/include/c++/14/string \
- /usr/include/c++/14/system_error \
- /usr/include/c++/14/tuple \
- /usr/include/c++/14/type_traits \
- /usr/include/c++/14/typeinfo \
- /usr/include/c++/14/utility \
- /usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h \
- /usr/include/ctype.h \
- /usr/include/endian.h \
- /usr/include/errno.h \
- /usr/include/features-time64.h \
- /usr/include/features.h \
- /usr/include/gnu/stubs-64.h \
- /usr/include/gnu/stubs.h \
- /usr/include/libintl.h \
- /usr/include/linux/errno.h \
- /usr/include/locale.h \
- /usr/include/pthread.h \
- /usr/include/sched.h \
- /usr/include/stdc-predef.h \
- /usr/include/stdint.h \
- /usr/include/stdio.h \
- /usr/include/stdlib.h \
- /usr/include/string.h \
- /usr/include/strings.h \
- /usr/include/sys/cdefs.h \
- /usr/include/sys/select.h \
- /usr/include/sys/single_threaded.h \
- /usr/include/sys/types.h \
- /usr/include/time.h \
- /usr/include/wchar.h \
- /usr/include/wctype.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h \
- third_party/uri/include/network/optional.hpp \
- third_party/uri/include/network/string_view.hpp \
- third_party/uri/include/network/uri/config.hpp \
- third_party/uri/include/network/uri/detail/decode.hpp \
- third_party/uri/include/network/uri/detail/encode.hpp \
- third_party/uri/include/network/uri/detail/translate.hpp \
- third_party/uri/include/network/uri/detail/uri_parts.hpp \
- third_party/uri/include/network/uri/uri.hpp \
- third_party/uri/include/network/uri/uri_builder.hpp \
- third_party/uri/include/network/uri/uri_errors.hpp \
- third_party/uri/src/detail/algorithm.hpp \
- third_party/uri/src/detail/uri_normalize.hpp \
- third_party/uri/src/detail/uri_parse_authority.hpp
-
-third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o: third_party/uri/src/uri_errors.cpp \
- /usr/include/alloca.h \
- /usr/include/asm-generic/errno-base.h \
- /usr/include/asm-generic/errno.h \
- /usr/include/asm/errno.h \
- /usr/include/bits/atomic_wide_counter.h \
- /usr/include/bits/byteswap.h \
- /usr/include/bits/endian.h \
- /usr/include/bits/endianness.h \
- /usr/include/bits/errno.h \
- /usr/include/bits/floatn-common.h \
- /usr/include/bits/floatn.h \
- /usr/include/bits/libc-header-start.h \
- /usr/include/bits/locale.h \
- /usr/include/bits/long-double.h \
- /usr/include/bits/pthreadtypes-arch.h \
- /usr/include/bits/pthreadtypes.h \
- /usr/include/bits/select.h \
- /usr/include/bits/stdint-intn.h \
- /usr/include/bits/stdio.h \
- /usr/include/bits/stdio_lim.h \
- /usr/include/bits/stdlib-bsearch.h \
- /usr/include/bits/stdlib-float.h \
- /usr/include/bits/struct_mutex.h \
- /usr/include/bits/struct_rwlock.h \
- /usr/include/bits/thread-shared-types.h \
- /usr/include/bits/time64.h \
- /usr/include/bits/timesize.h \
- /usr/include/bits/types.h \
- /usr/include/bits/types/FILE.h \
- /usr/include/bits/types/__FILE.h \
- /usr/include/bits/types/__fpos64_t.h \
- /usr/include/bits/types/__fpos_t.h \
- /usr/include/bits/types/__locale_t.h \
- /usr/include/bits/types/__mbstate_t.h \
- /usr/include/bits/types/__sigset_t.h \
- /usr/include/bits/types/clock_t.h \
- /usr/include/bits/types/clockid_t.h \
- /usr/include/bits/types/cookie_io_functions_t.h \
- /usr/include/bits/types/error_t.h \
- /usr/include/bits/types/locale_t.h \
- /usr/include/bits/types/mbstate_t.h \
- /usr/include/bits/types/sigset_t.h \
- /usr/include/bits/types/struct_FILE.h \
- /usr/include/bits/types/struct_timespec.h \
- /usr/include/bits/types/struct_timeval.h \
- /usr/include/bits/types/time_t.h \
- /usr/include/bits/types/timer_t.h \
- /usr/include/bits/types/wint_t.h \
- /usr/include/bits/typesizes.h \
- /usr/include/bits/uintn-identity.h \
- /usr/include/bits/waitflags.h \
- /usr/include/bits/waitstatus.h \
- /usr/include/bits/wchar.h \
- /usr/include/bits/wordsize.h \
- /usr/include/c++/14/backward/binders.h \
- /usr/include/c++/14/bits/alloc_traits.h \
- /usr/include/c++/14/bits/allocator.h \
- /usr/include/c++/14/bits/basic_string.h \
- /usr/include/c++/14/bits/basic_string.tcc \
- /usr/include/c++/14/bits/char_traits.h \
- /usr/include/c++/14/bits/charconv.h \
- /usr/include/c++/14/bits/concept_check.h \
- /usr/include/c++/14/bits/cpp_type_traits.h \
- /usr/include/c++/14/bits/cxxabi_forced.h \
- /usr/include/c++/14/bits/cxxabi_init_exception.h \
- /usr/include/c++/14/bits/exception.h \
- /usr/include/c++/14/bits/exception_defines.h \
- /usr/include/c++/14/bits/exception_ptr.h \
- /usr/include/c++/14/bits/functexcept.h \
- /usr/include/c++/14/bits/functional_hash.h \
- /usr/include/c++/14/bits/hash_bytes.h \
- /usr/include/c++/14/bits/invoke.h \
- /usr/include/c++/14/bits/localefwd.h \
- /usr/include/c++/14/bits/memoryfwd.h \
- /usr/include/c++/14/bits/move.h \
- /usr/include/c++/14/bits/nested_exception.h \
- /usr/include/c++/14/bits/new_allocator.h \
- /usr/include/c++/14/bits/ostream_insert.h \
- /usr/include/c++/14/bits/postypes.h \
- /usr/include/c++/14/bits/predefined_ops.h \
- /usr/include/c++/14/bits/ptr_traits.h \
- /usr/include/c++/14/bits/range_access.h \
- /usr/include/c++/14/bits/refwrap.h \
- /usr/include/c++/14/bits/requires_hosted.h \
- /usr/include/c++/14/bits/std_abs.h \
- /usr/include/c++/14/bits/stl_algobase.h \
- /usr/include/c++/14/bits/stl_construct.h \
- /usr/include/c++/14/bits/stl_function.h \
- /usr/include/c++/14/bits/stl_iterator.h \
- /usr/include/c++/14/bits/stl_iterator_base_funcs.h \
- /usr/include/c++/14/bits/stl_iterator_base_types.h \
- /usr/include/c++/14/bits/stl_pair.h \
- /usr/include/c++/14/bits/stringfwd.h \
- /usr/include/c++/14/bits/utility.h \
- /usr/include/c++/14/bits/version.h \
- /usr/include/c++/14/cctype \
- /usr/include/c++/14/cerrno \
- /usr/include/c++/14/clocale \
- /usr/include/c++/14/cstdio \
- /usr/include/c++/14/cstdlib \
- /usr/include/c++/14/cwchar \
- /usr/include/c++/14/debug/assertions.h \
- /usr/include/c++/14/debug/debug.h \
- /usr/include/c++/14/exception \
- /usr/include/c++/14/ext/alloc_traits.h \
- /usr/include/c++/14/ext/numeric_traits.h \
- /usr/include/c++/14/ext/string_conversions.h \
- /usr/include/c++/14/ext/type_traits.h \
- /usr/include/c++/14/initializer_list \
- /usr/include/c++/14/iosfwd \
- /usr/include/c++/14/new \
- /usr/include/c++/14/stdexcept \
- /usr/include/c++/14/string \
- /usr/include/c++/14/system_error \
- /usr/include/c++/14/type_traits \
- /usr/include/c++/14/typeinfo \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h \
- /usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h \
- /usr/include/ctype.h \
- /usr/include/endian.h \
- /usr/include/errno.h \
- /usr/include/features-time64.h \
- /usr/include/features.h \
- /usr/include/gnu/stubs-64.h \
- /usr/include/gnu/stubs.h \
- /usr/include/linux/errno.h \
- /usr/include/locale.h \
- /usr/include/stdc-predef.h \
- /usr/include/stdio.h \
- /usr/include/stdlib.h \
- /usr/include/sys/cdefs.h \
- /usr/include/sys/select.h \
- /usr/include/sys/types.h \
- /usr/include/wchar.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h \
- /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h \
- third_party/uri/include/network/uri/config.hpp \
- third_party/uri/include/network/uri/uri_errors.hpp
-
-
-third_party/uri/src/uri_builder.cpp:
-
-third_party/uri/src/uri.cpp:
-
-third_party/uri/src/detail/uri_resolve.hpp:
-
-third_party/uri/src/detail/algorithm_find.hpp:
-
-third_party/uri/src/detail/uri_parse_authority.hpp:
-
-third_party/uri/src/detail/uri_parse.hpp:
-
-third_party/uri/src/detail/grammar.hpp:
-
-third_party/uri/src/detail/uri_parse.cpp:
-
-third_party/uri/src/detail/algorithm.hpp:
-
-third_party/uri/include/network/uri/uri_errors.hpp:
-
-third_party/uri/include/network/uri/uri_builder.hpp:
-
-third_party/uri/include/network/uri/uri.hpp:
-
-third_party/uri/include/network/uri/detail/encode.hpp:
-
-third_party/uri/include/network/uri/config.hpp:
-
-/usr/include/string.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/ctype_base.h:
-
-/usr/include/c++/14/locale:
-
-/usr/include/c++/14/cwctype:
-
-/usr/include/c++/14/ctime:
-
-/usr/include/c++/14/cstdint:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/messages_members.h:
-
-/usr/include/c++/14/bits/vector.tcc:
-
-third_party/uri/src/detail/uri_percent_encode.hpp:
-
-/usr/include/c++/14/bits/stl_vector.h:
-
-/usr/include/c++/14/bits/stl_bvector.h:
-
-/usr/include/c++/14/bits/std_function.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/time_members.h:
-
-/usr/include/c++/14/bits/locale_facets_nonio.tcc:
-
-/usr/include/c++/14/bits/codecvt.h:
-
-third_party/uri/include/network/uri/detail/uri_parts.hpp:
-
-third_party/uri/include/network/optional.hpp:
-
-/usr/include/wchar.h:
-
-/usr/include/time.h:
-
-/usr/include/sys/single_threaded.h:
-
-/usr/include/sys/cdefs.h:
-
-/usr/include/c++/14/bits/locale_facets.tcc:
-
-/usr/include/stdio.h:
-
-/usr/include/stdc-predef.h:
-
-/usr/include/sched.h:
-
-/usr/include/linux/errno.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/os_defines.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/gthr.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/error_constants.h:
-
-/usr/include/locale.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/c++config.h:
-
-/usr/include/sys/select.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/c++allocator.h:
-
-/usr/include/c++/14/typeinfo:
-
-/usr/include/c++/14/type_traits:
-
-/usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h:
-
-/usr/include/c++/14/tuple:
-
-/usr/include/c++/14/string:
-
-/usr/include/bits/wctype-wchar.h:
-
-/usr/include/sys/types.h:
-
-/usr/include/c++/14/memory:
-
-/usr/include/c++/14/bits/locale_conv.h:
-
-/usr/include/c++/14/iosfwd:
-
-/usr/include/c++/14/initializer_list:
-
-/usr/include/c++/14/ext/type_traits.h:
-
-/usr/include/c++/14/ext/string_conversions.h:
-
-/usr/lib/gcc/x86_64-redhat-linux/14/include/stdarg.h:
-
-/usr/include/c++/14/ext/atomicity.h:
-
-/usr/include/c++/14/ext/alloc_traits.h:
-
-/usr/include/c++/14/new:
-
-/usr/include/c++/14/ext/aligned_buffer.h:
-
-/usr/include/errno.h:
-
-/usr/include/c++/14/debug/debug.h:
-
-/usr/include/c++/14/debug/assertions.h:
-
-/usr/include/c++/14/cstdio:
-
-/usr/include/c++/14/cerrno:
-
-/usr/include/c++/14/bits/version.h:
-
-/usr/include/c++/14/bits/utility.h:
-
-third_party/uri/src/uri_errors.cpp:
-
-/usr/include/c++/14/bits/uses_allocator.h:
-
-/usr/include/c++/14/limits:
-
-/usr/include/c++/14/bits/unique_ptr.h:
-
-/usr/include/gnu/stubs-64.h:
-
-/usr/include/c++/14/bits/stringfwd.h:
-
-/usr/include/c++/14/bits/locale_facets.h:
-
-/usr/include/c++/14/bits/streambuf.tcc:
-
-/usr/include/c++/14/streambuf:
-
-/usr/include/bits/types/struct_tm.h:
-
-/usr/include/bits/wchar.h:
-
-/usr/include/c++/14/bits/stl_construct.h:
-
-/usr/include/bits/types/struct_timespec.h:
-
-/usr/include/bits/types/struct_sched_param.h:
-
-/usr/include/ctype.h:
-
-/usr/include/bits/waitflags.h:
-
-/usr/include/bits/types/struct_FILE.h:
-
-/usr/include/bits/types/cookie_io_functions_t.h:
-
-/usr/include/bits/sched.h:
-
-/usr/include/bits/types/clockid_t.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/gthr-default.h:
-
-/usr/include/bits/atomic_wide_counter.h:
-
-/usr/include/c++/14/bits/cxxabi_init_exception.h:
-
-/usr/include/c++/14/bits/streambuf_iterator.h:
-
-/usr/include/bits/types/__FILE.h:
-
-/usr/include/c++/14/bits/align.h:
-
-/usr/include/c++/14/utility:
-
-/usr/include/bits/types/FILE.h:
-
-/usr/include/c++/14/bits/exception_ptr.h:
-
-/usr/include/bits/types.h:
-
-/usr/include/endian.h:
-
-/usr/include/c++/14/bits/localefwd.h:
-
-/usr/include/bits/types/error_t.h:
-
-/usr/include/bits/stdint-intn.h:
-
-/usr/include/c++/14/system_error:
-
-/usr/include/c++/14/cstdlib:
-
-/usr/include/bits/endian.h:
-
-third_party/uri/include/network/uri/detail/translate.hpp:
-
-/usr/include/asm/errno.h:
-
-/usr/include/stdint.h:
-
-/usr/include/c++/14/bits/cxxabi_forced.h:
-
-/usr/include/bits/types/time_t.h:
-
-/usr/include/c++/14/bits/atomic_base.h:
-
-/usr/include/libintl.h:
-
-/usr/include/c++/14/bits/stl_uninitialized.h:
-
-/usr/include/bits/floatn-common.h:
-
-/usr/include/stdlib.h:
-
-/usr/include/c++/14/algorithm:
-
-/usr/include/bits/struct_mutex.h:
-
-/usr/include/c++/14/bits/locale_classes.h:
-
-/usr/include/c++/14/bits/new_allocator.h:
-
-/usr/include/c++/14/cstddef:
-
-/usr/include/bits/cpu-set.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/ctype_inline.h:
-
-/usr/include/c++/14/bits/nested_exception.h:
-
-/usr/include/bits/uintn-identity.h:
-
-/usr/include/c++/14/cctype:
-
-/usr/include/c++/14/bits/exception.h:
-
-/usr/include/bits/long-double.h:
-
-/usr/include/c++/14/bits/shared_ptr.h:
-
-/usr/include/bits/stdio_lim.h:
-
-/usr/include/bits/types/__mbstate_t.h:
-
-/usr/include/bits/time.h:
-
-/usr/include/c++/14/exception:
-
-/usr/include/bits/struct_rwlock.h:
-
-/usr/include/bits/types/struct_itimerspec.h:
-
-/usr/include/bits/types/__sigset_t.h:
-
-/usr/include/bits/locale.h:
-
-third_party/uri/src/detail/uri_parse_authority.cpp:
-
-/usr/include/bits/setjmp.h:
-
-/usr/include/bits/types/struct___jmp_buf_tag.h:
-
-/usr/include/bits/types/clock_t.h:
-
-/usr/include/bits/types/__fpos_t.h:
-
-/usr/include/c++/14/bits/predefined_ops.h:
-
-/usr/include/asm-generic/errno.h:
-
-/usr/include/c++/14/bits/stl_function.h:
-
-/usr/include/c++/14/cassert:
-
-/usr/include/assert.h:
-
-third_party/uri/src/detail/uri_normalize.hpp:
-
-/usr/include/c++/14/ext/concurrence.h:
-
-third_party/uri/src/detail/uri_advance_parts.cpp:
-
-/usr/include/bits/floatn.h:
-
-/usr/include/bits/libc-header-start.h:
-
-/usr/include/features-time64.h:
-
-/usr/include/c++/14/bits/stl_relops.h:
-
-/usr/include/wctype.h:
-
-/usr/include/bits/errno.h:
-
-/usr/include/bits/timex.h:
-
-/usr/include/c++/14/bits/locale_facets_nonio.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/c++locale.h:
-
-/usr/include/bits/pthread_stack_min-dynamic.h:
-
-/usr/include/bits/types/struct_timeval.h:
-
-/usr/include/c++/14/bits/stl_raw_storage_iter.h:
-
-third_party/uri/include/network/uri/detail/decode.hpp:
-
-/usr/lib/gcc/x86_64-redhat-linux/14/include/stdint.h:
-
-/usr/include/gnu/stubs.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/atomic_word.h:
-
-/usr/include/bits/pthreadtypes-arch.h:
-
-/usr/include/c++/14/bits/invoke.h:
-
-/usr/include/bits/types/__fpos64_t.h:
-
-/usr/include/bits/select.h:
-
-/usr/include/c++/14/cstring:
-
-/usr/include/c++/14/stdexcept:
-
-/usr/include/c++/14/cwchar:
-
-/usr/include/c++/14/bits/charconv.h:
-
-/usr/include/alloca.h:
-
-/usr/include/bits/types/locale_t.h:
-
-/usr/include/c++/14/bits/ptr_traits.h:
-
-/usr/include/bits/stdint-least.h:
-
-/usr/include/bits/stdlib-bsearch.h:
-
-/usr/include/bits/types/mbstate_t.h:
-
-/usr/include/c++/14/bits/shared_ptr_atomic.h:
-
-/usr/include/c++/14/bits/functional_hash.h:
-
-/usr/include/bits/types/timer_t.h:
-
-/usr/include/bits/thread-shared-types.h:
-
-/usr/include/c++/14/bits/stl_pair.h:
-
-/usr/include/bits/types/wint_t.h:
-
-/usr/include/c++/14/bits/range_access.h:
-
-/usr/include/bits/timesize.h:
-
-/usr/include/bits/waitstatus.h:
-
-/usr/include/c++/14/vector:
-
-/usr/include/c++/14/bits/uniform_int_dist.h:
-
-/usr/include/c++/14/bits/shared_ptr_base.h:
-
-/usr/include/bits/wordsize.h:
-
-/usr/include/c++/14/bits/allocator.h:
-
-/usr/include/bits/stdlib-float.h:
-
-/usr/include/bits/time64.h:
-
-/usr/include/c++/14/backward/binders.h:
-
-/usr/include/c++/14/bit:
-
-/usr/include/bits/typesizes.h:
-
-/usr/include/c++/14/bits/algorithmfwd.h:
-
-/usr/include/c++/14/bits/ostream_insert.h:
-
-/usr/include/c++/14/bits/alloc_traits.h:
-
-third_party/uri/src/detail/uri_advance_parts.hpp:
-
-/usr/include/bits/byteswap.h:
-
-/usr/include/c++/14/bits/allocated_ptr.h:
-
-/usr/include/c++/14/bits/stl_iterator.h:
-
-/usr/include/asm-generic/errno-base.h:
-
-/usr/include/c++/14/bits/stl_algobase.h:
-
-/usr/include/c++/14/x86_64-redhat-linux/bits/cpu_defines.h:
-
-/usr/include/c++/14/bits/atomic_lockfree_defines.h:
-
-/usr/include/bits/pthreadtypes.h:
-
-/usr/include/c++/14/bits/basic_string.h:
-
-/usr/include/c++/14/clocale:
-
-/usr/include/c++/14/bits/basic_string.tcc:
-
-/usr/include/pthread.h:
-
-/usr/include/c++/14/bits/functexcept.h:
-
-/usr/include/c++/14/bits/concept_check.h:
-
-/usr/include/c++/14/bits/cpp_type_traits.h:
-
-/usr/include/c++/14/bits/exception_defines.h:
-
-/usr/include/c++/14/bits/char_traits.h:
-
-/usr/include/c++/14/bits/hash_bytes.h:
-
-/usr/include/bits/types/__locale_t.h:
-
-/usr/include/c++/14/bits/ios_base.h:
-
-/usr/include/c++/14/bits/locale_classes.tcc:
-
-third_party/uri/include/network/string_view.hpp:
-
-/usr/include/c++/14/backward/auto_ptr.h:
-
-/usr/include/bits/types/sigset_t.h:
-
-/usr/include/c++/14/bits/move.h:
-
-third_party/uri/src/detail/uri_resolve.cpp:
-
-/usr/include/c++/14/bits/memoryfwd.h:
-
-/usr/include/c++/14/bits/postypes.h:
-
-third_party/uri/src/detail/algorithm_split.hpp:
-
-/usr/include/c++/14/bits/refwrap.h:
-
-/usr/include/strings.h:
-
-/usr/include/c++/14/bits/requires_hosted.h:
-
-third_party/uri/src/detail/uri_normalize.cpp:
-
-/usr/include/c++/14/bits/std_abs.h:
-
-/usr/include/c++/14/bits/stl_algo.h:
-
-/usr/include/c++/14/functional:
-
-/usr/include/features.h:
-
-/usr/include/c++/14/iterator:
-
-/usr/include/bits/endianness.h:
-
-/usr/include/c++/14/bits/stl_heap.h:
-
-/usr/include/c++/14/ext/numeric_traits.h:
-
-/usr/include/bits/stdint-uintn.h:
-
-/usr/include/c++/14/bits/stl_iterator_base_funcs.h:
-
-/usr/include/bits/stdio.h:
-
-/usr/include/c++/14/bits/stl_iterator_base_types.h:
-
-/usr/include/c++/14/bits/stl_tempbuf.h:
-
-/usr/include/c++/14/bits/stream_iterator.h:
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts
deleted file mode 100644
index ff025e0c9e..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/compiler_depend.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Timestamp file for compiler generated dependencies management for network-uri.
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/depend.make b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/depend.make
deleted file mode 100644
index 2b4283de4b..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/depend.make
+++ /dev/null
@@ -1,2 +0,0 @@
-# Empty dependencies file for network-uri.
-# This may be replaced when dependencies are built.
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/flags.make b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
deleted file mode 100644
index abe8aebb87..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/flags.make
+++ /dev/null
@@ -1,10 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 3.28
-
-# compile CXX with /bin/c++
-CXX_DEFINES =
-
-CXX_INCLUDES = -I/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src -I/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/include
-
-CXX_FLAGS = -fPIE -D_FILE_OFFSET_BIS=64 -DUSEGC -DLSPCPP_USEGC -I../gc-8.2.4/include -std=c++11 -Wall -Werror -Wno-parentheses -O2 -g -DNDEBUG
-
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/link.txt b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/link.txt
deleted file mode 100644
index f804330c4f..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/link.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/ar qc libnetwork-uri.a "CMakeFiles/network-uri.dir/uri.cpp.o" "CMakeFiles/network-uri.dir/uri_builder.cpp.o" "CMakeFiles/network-uri.dir/uri_errors.cpp.o" "CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o" "CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o" "CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o" "CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o" "CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o"
-/bin/ranlib libnetwork-uri.a
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/progress.make b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/progress.make
deleted file mode 100644
index 03848ccb80..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/network-uri.dir/progress.make
+++ /dev/null
@@ -1,10 +0,0 @@
-CMAKE_PROGRESS_1 = 23
-CMAKE_PROGRESS_2 = 24
-CMAKE_PROGRESS_3 = 25
-CMAKE_PROGRESS_4 = 26
-CMAKE_PROGRESS_5 = 27
-CMAKE_PROGRESS_6 = 28
-CMAKE_PROGRESS_7 = 29
-CMAKE_PROGRESS_8 = 30
-CMAKE_PROGRESS_9 = 31
-
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/progress.marks b/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/progress.marks
deleted file mode 100644
index ec635144f6..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/CMakeFiles/progress.marks
+++ /dev/null
@@ -1 +0,0 @@
-9
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/Makefile b/graphics/asymptote/LspCpp/third_party/uri/src/Makefile
deleted file mode 100644
index 7948b3894d..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/Makefile
+++ /dev/null
@@ -1,423 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 3.28
-
-# Default target executed when no arguments are given to make.
-default_target: all
-.PHONY : default_target
-
-# Allow only one "make -f Makefile2" at a time, but pass parallelism.
-.NOTPARALLEL:
-
-#=============================================================================
-# Special targets provided by cmake.
-
-# Disable implicit rules so canonical targets will work.
-.SUFFIXES:
-
-# Disable VCS-based implicit rules.
-% : %,v
-
-# Disable VCS-based implicit rules.
-% : RCS/%
-
-# Disable VCS-based implicit rules.
-% : RCS/%,v
-
-# Disable VCS-based implicit rules.
-% : SCCS/s.%
-
-# Disable VCS-based implicit rules.
-% : s.%
-
-.SUFFIXES: .hpux_make_needs_suffix_list
-
-# Produce verbose output by default.
-VERBOSE = 1
-
-# Command-line flag to silence nested $(MAKE).
-$(VERBOSE)MAKESILENT = -s
-
-#Suppress display of executed commands.
-$(VERBOSE).SILENT:
-
-# A target that is always out of date.
-cmake_force:
-.PHONY : cmake_force
-
-#=============================================================================
-# Set environment variables for the build.
-
-# The shell in which to execute make rules.
-SHELL = /bin/sh
-
-# The CMake executable.
-CMAKE_COMMAND = /usr/bin/cmake
-
-# The command to remove a file.
-RM = /usr/bin/cmake -E rm -f
-
-# Escaping for special characters.
-EQUALS = =
-
-# The top-level source directory on which CMake was run.
-CMAKE_SOURCE_DIR = /usr/local/src/asymptote-2.90/LspCpp
-
-# The top-level build directory on which CMake was run.
-CMAKE_BINARY_DIR = /usr/local/src/asymptote-2.90/LspCpp
-
-#=============================================================================
-# Targets provided globally by CMake.
-
-# Special rule for the target edit_cache
-edit_cache:
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..."
- /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
-.PHONY : edit_cache
-
-# Special rule for the target edit_cache
-edit_cache/fast: edit_cache
-.PHONY : edit_cache/fast
-
-# Special rule for the target rebuild_cache
-rebuild_cache:
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
- /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
-.PHONY : rebuild_cache
-
-# Special rule for the target rebuild_cache
-rebuild_cache/fast: rebuild_cache
-.PHONY : rebuild_cache/fast
-
-# Special rule for the target list_install_components
-list_install_components:
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Unspecified\""
-.PHONY : list_install_components
-
-# Special rule for the target list_install_components
-list_install_components/fast: list_install_components
-.PHONY : list_install_components/fast
-
-# Special rule for the target install
-install: preinstall
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."
- /usr/bin/cmake -P cmake_install.cmake
-.PHONY : install
-
-# Special rule for the target install
-install/fast: preinstall/fast
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."
- /usr/bin/cmake -P cmake_install.cmake
-.PHONY : install/fast
-
-# Special rule for the target install/local
-install/local: preinstall
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..."
- /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
-.PHONY : install/local
-
-# Special rule for the target install/local
-install/local/fast: preinstall/fast
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..."
- /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
-.PHONY : install/local/fast
-
-# Special rule for the target install/strip
-install/strip: preinstall
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..."
- /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
-.PHONY : install/strip
-
-# Special rule for the target install/strip
-install/strip/fast: preinstall/fast
- @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..."
- /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
-.PHONY : install/strip/fast
-
-# The main all target
-all: cmake_check_build_system
- cd /usr/local/src/asymptote-2.90/LspCpp && $(CMAKE_COMMAND) -E cmake_progress_start /usr/local/src/asymptote-2.90/LspCpp/CMakeFiles /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src//CMakeFiles/progress.marks
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 third_party/uri/src/all
- $(CMAKE_COMMAND) -E cmake_progress_start /usr/local/src/asymptote-2.90/LspCpp/CMakeFiles 0
-.PHONY : all
-
-# The main clean target
-clean:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 third_party/uri/src/clean
-.PHONY : clean
-
-# The main clean target
-clean/fast: clean
-.PHONY : clean/fast
-
-# Prepare targets for installation.
-preinstall: all
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 third_party/uri/src/preinstall
-.PHONY : preinstall
-
-# Prepare targets for installation.
-preinstall/fast:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 third_party/uri/src/preinstall
-.PHONY : preinstall/fast
-
-# clear depends
-depend:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
-.PHONY : depend
-
-# Convenience name for target.
-third_party/uri/src/CMakeFiles/network-uri.dir/rule:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 third_party/uri/src/CMakeFiles/network-uri.dir/rule
-.PHONY : third_party/uri/src/CMakeFiles/network-uri.dir/rule
-
-# Convenience name for target.
-network-uri: third_party/uri/src/CMakeFiles/network-uri.dir/rule
-.PHONY : network-uri
-
-# fast build rule for target.
-network-uri/fast:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/build
-.PHONY : network-uri/fast
-
-detail/uri_advance_parts.o: detail/uri_advance_parts.cpp.o
-.PHONY : detail/uri_advance_parts.o
-
-# target to build an object file
-detail/uri_advance_parts.cpp.o:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.o
-.PHONY : detail/uri_advance_parts.cpp.o
-
-detail/uri_advance_parts.i: detail/uri_advance_parts.cpp.i
-.PHONY : detail/uri_advance_parts.i
-
-# target to preprocess a source file
-detail/uri_advance_parts.cpp.i:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.i
-.PHONY : detail/uri_advance_parts.cpp.i
-
-detail/uri_advance_parts.s: detail/uri_advance_parts.cpp.s
-.PHONY : detail/uri_advance_parts.s
-
-# target to generate assembly for a file
-detail/uri_advance_parts.cpp.s:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_advance_parts.cpp.s
-.PHONY : detail/uri_advance_parts.cpp.s
-
-detail/uri_normalize.o: detail/uri_normalize.cpp.o
-.PHONY : detail/uri_normalize.o
-
-# target to build an object file
-detail/uri_normalize.cpp.o:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.o
-.PHONY : detail/uri_normalize.cpp.o
-
-detail/uri_normalize.i: detail/uri_normalize.cpp.i
-.PHONY : detail/uri_normalize.i
-
-# target to preprocess a source file
-detail/uri_normalize.cpp.i:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.i
-.PHONY : detail/uri_normalize.cpp.i
-
-detail/uri_normalize.s: detail/uri_normalize.cpp.s
-.PHONY : detail/uri_normalize.s
-
-# target to generate assembly for a file
-detail/uri_normalize.cpp.s:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_normalize.cpp.s
-.PHONY : detail/uri_normalize.cpp.s
-
-detail/uri_parse.o: detail/uri_parse.cpp.o
-.PHONY : detail/uri_parse.o
-
-# target to build an object file
-detail/uri_parse.cpp.o:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.o
-.PHONY : detail/uri_parse.cpp.o
-
-detail/uri_parse.i: detail/uri_parse.cpp.i
-.PHONY : detail/uri_parse.i
-
-# target to preprocess a source file
-detail/uri_parse.cpp.i:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.i
-.PHONY : detail/uri_parse.cpp.i
-
-detail/uri_parse.s: detail/uri_parse.cpp.s
-.PHONY : detail/uri_parse.s
-
-# target to generate assembly for a file
-detail/uri_parse.cpp.s:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse.cpp.s
-.PHONY : detail/uri_parse.cpp.s
-
-detail/uri_parse_authority.o: detail/uri_parse_authority.cpp.o
-.PHONY : detail/uri_parse_authority.o
-
-# target to build an object file
-detail/uri_parse_authority.cpp.o:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.o
-.PHONY : detail/uri_parse_authority.cpp.o
-
-detail/uri_parse_authority.i: detail/uri_parse_authority.cpp.i
-.PHONY : detail/uri_parse_authority.i
-
-# target to preprocess a source file
-detail/uri_parse_authority.cpp.i:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.i
-.PHONY : detail/uri_parse_authority.cpp.i
-
-detail/uri_parse_authority.s: detail/uri_parse_authority.cpp.s
-.PHONY : detail/uri_parse_authority.s
-
-# target to generate assembly for a file
-detail/uri_parse_authority.cpp.s:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_parse_authority.cpp.s
-.PHONY : detail/uri_parse_authority.cpp.s
-
-detail/uri_resolve.o: detail/uri_resolve.cpp.o
-.PHONY : detail/uri_resolve.o
-
-# target to build an object file
-detail/uri_resolve.cpp.o:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.o
-.PHONY : detail/uri_resolve.cpp.o
-
-detail/uri_resolve.i: detail/uri_resolve.cpp.i
-.PHONY : detail/uri_resolve.i
-
-# target to preprocess a source file
-detail/uri_resolve.cpp.i:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.i
-.PHONY : detail/uri_resolve.cpp.i
-
-detail/uri_resolve.s: detail/uri_resolve.cpp.s
-.PHONY : detail/uri_resolve.s
-
-# target to generate assembly for a file
-detail/uri_resolve.cpp.s:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/detail/uri_resolve.cpp.s
-.PHONY : detail/uri_resolve.cpp.s
-
-uri.o: uri.cpp.o
-.PHONY : uri.o
-
-# target to build an object file
-uri.cpp.o:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.o
-.PHONY : uri.cpp.o
-
-uri.i: uri.cpp.i
-.PHONY : uri.i
-
-# target to preprocess a source file
-uri.cpp.i:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.i
-.PHONY : uri.cpp.i
-
-uri.s: uri.cpp.s
-.PHONY : uri.s
-
-# target to generate assembly for a file
-uri.cpp.s:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/uri.cpp.s
-.PHONY : uri.cpp.s
-
-uri_builder.o: uri_builder.cpp.o
-.PHONY : uri_builder.o
-
-# target to build an object file
-uri_builder.cpp.o:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.o
-.PHONY : uri_builder.cpp.o
-
-uri_builder.i: uri_builder.cpp.i
-.PHONY : uri_builder.i
-
-# target to preprocess a source file
-uri_builder.cpp.i:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.i
-.PHONY : uri_builder.cpp.i
-
-uri_builder.s: uri_builder.cpp.s
-.PHONY : uri_builder.s
-
-# target to generate assembly for a file
-uri_builder.cpp.s:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/uri_builder.cpp.s
-.PHONY : uri_builder.cpp.s
-
-uri_errors.o: uri_errors.cpp.o
-.PHONY : uri_errors.o
-
-# target to build an object file
-uri_errors.cpp.o:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.o
-.PHONY : uri_errors.cpp.o
-
-uri_errors.i: uri_errors.cpp.i
-.PHONY : uri_errors.i
-
-# target to preprocess a source file
-uri_errors.cpp.i:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.i
-.PHONY : uri_errors.cpp.i
-
-uri_errors.s: uri_errors.cpp.s
-.PHONY : uri_errors.s
-
-# target to generate assembly for a file
-uri_errors.cpp.s:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(MAKE) $(MAKESILENT) -f third_party/uri/src/CMakeFiles/network-uri.dir/build.make third_party/uri/src/CMakeFiles/network-uri.dir/uri_errors.cpp.s
-.PHONY : uri_errors.cpp.s
-
-# Help Target
-help:
- @echo "The following are some of the valid targets for this Makefile:"
- @echo "... all (the default if no target is provided)"
- @echo "... clean"
- @echo "... depend"
- @echo "... edit_cache"
- @echo "... install"
- @echo "... install/local"
- @echo "... install/strip"
- @echo "... list_install_components"
- @echo "... rebuild_cache"
- @echo "... network-uri"
- @echo "... detail/uri_advance_parts.o"
- @echo "... detail/uri_advance_parts.i"
- @echo "... detail/uri_advance_parts.s"
- @echo "... detail/uri_normalize.o"
- @echo "... detail/uri_normalize.i"
- @echo "... detail/uri_normalize.s"
- @echo "... detail/uri_parse.o"
- @echo "... detail/uri_parse.i"
- @echo "... detail/uri_parse.s"
- @echo "... detail/uri_parse_authority.o"
- @echo "... detail/uri_parse_authority.i"
- @echo "... detail/uri_parse_authority.s"
- @echo "... detail/uri_resolve.o"
- @echo "... detail/uri_resolve.i"
- @echo "... detail/uri_resolve.s"
- @echo "... uri.o"
- @echo "... uri.i"
- @echo "... uri.s"
- @echo "... uri_builder.o"
- @echo "... uri_builder.i"
- @echo "... uri_builder.s"
- @echo "... uri_errors.o"
- @echo "... uri_errors.i"
- @echo "... uri_errors.s"
-.PHONY : help
-
-
-
-#=============================================================================
-# Special targets to cleanup operation of make.
-
-# Special rule to run CMake to check the build system integrity.
-# No rule that depends on this can have commands that come from listfiles
-# because they might be regenerated.
-cmake_check_build_system:
- cd /usr/local/src/asymptote-2.90/LspCpp && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
-.PHONY : cmake_check_build_system
-
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/cmake_install.cmake b/graphics/asymptote/LspCpp/third_party/uri/src/cmake_install.cmake
deleted file mode 100644
index fbf9b52637..0000000000
--- a/graphics/asymptote/LspCpp/third_party/uri/src/cmake_install.cmake
+++ /dev/null
@@ -1,48 +0,0 @@
-# Install script for directory: /usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src
-
-# Set the install prefix
-if(NOT DEFINED CMAKE_INSTALL_PREFIX)
- set(CMAKE_INSTALL_PREFIX "/usr/local")
-endif()
-string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
-
-# Set the install configuration name.
-if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
- if(BUILD_TYPE)
- string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
- CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
- else()
- set(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo")
- endif()
- message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
-endif()
-
-# Set the component getting installed.
-if(NOT CMAKE_INSTALL_COMPONENT)
- if(COMPONENT)
- message(STATUS "Install component: \"${COMPONENT}\"")
- set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
- else()
- set(CMAKE_INSTALL_COMPONENT)
- endif()
-endif()
-
-# Install shared libraries without execute permission?
-if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
- set(CMAKE_INSTALL_SO_NO_EXE "0")
-endif()
-
-# Is this installation the result of a crosscompile?
-if(NOT DEFINED CMAKE_CROSSCOMPILING)
- set(CMAKE_CROSSCOMPILING "FALSE")
-endif()
-
-# Set default install directory permissions.
-if(NOT DEFINED CMAKE_OBJDUMP)
- set(CMAKE_OBJDUMP "/bin/objdump")
-endif()
-
-if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT)
- file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/usr/local/src/asymptote-2.90/LspCpp/third_party/uri/src/libnetwork-uri.a")
-endif()
-
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/libnetwork-uri.a b/graphics/asymptote/LspCpp/third_party/uri/src/libnetwork-uri.a
new file mode 100644
index 0000000000..ac61309cf1
--- /dev/null
+++ b/graphics/asymptote/LspCpp/third_party/uri/src/libnetwork-uri.a
Binary files differ
diff --git a/graphics/asymptote/LspCpp/vcpkg.json b/graphics/asymptote/LspCpp/vcpkg.json
new file mode 100644
index 0000000000..9b7ae0c86f
--- /dev/null
+++ b/graphics/asymptote/LspCpp/vcpkg.json
@@ -0,0 +1,27 @@
+{
+ "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
+ "name": "lspcpp",
+ "builtin-baseline": "5e5d0e1cd7785623065e77eff011afdeec1a3574",
+ "version": "0.0-snapshot",
+ "dependencies": [
+ "rapidjson",
+ "boost-asio",
+ "boost-beast",
+ "boost-date-time",
+ "boost-chrono",
+ "boost-filesystem",
+ "boost-system",
+ "boost-uuid",
+ "boost-thread",
+ "boost-process",
+ "boost-program-options"
+ ],
+ "features": {
+ "bdwgc": {
+ "description": "Build with bdwgc support",
+ "dependencies": [
+ "bdwgc"
+ ]
+ }
+ }
+}
diff --git a/graphics/asymptote/Makefile.in b/graphics/asymptote/Makefile.in
index 1c7866fef1..7bcefe0db7 100644
--- a/graphics/asymptote/Makefile.in
+++ b/graphics/asymptote/Makefile.in
@@ -4,16 +4,17 @@ ARCH = unix
POLL = poll
ASYGLVERSION = @ASYGLVERSION@
-GCVERSION = @GCVERSION@
-GC = gc-$(GCVERSION)
-LIBATOMIC = libatomic_ops-@ATOMICVERSION@
+GC = gc
GCOPTIONS = @GCOPTIONS@
GCLIB = @GCLIB@
GCPPLIB = @GCPPLIB@
GCLIBS = $(GCPPLIB) $(GCLIB)
-LFLAGS = @LDFLAGS@ -LLspCpp -LLspCpp/third_party/uri/src
+LFLAGS = @LDFLAGS@
LIBS = $(LFLAGS) @PTHREAD_LIBS@ @GLEW@ @LIBS@ $(GCLIBS) @LSPLIBS@
+CXX_STANDARD = @CXX_STANDARD@
DOSLIBS = $(LIBS) -ltermcap -lwolfssl -lgdi32 -lwinmm -s -static
+LSP_BUILD_ROOT=@LSP_BUILD_ROOT@
+LSP_ROOT=@LSP_ROOT@
CMAKE ?= cmake
PERL ?= perl
@@ -27,6 +28,7 @@ PYUIC ?= pyuic5
SHAREDLIBS = $(filter-out -lglut -GL -pthread $(GCLIBS), $(LIBS))
vpath %.cc prc
+vpath %.cc thirdparty_impl/tinyexr_impl/src
vpath %.ui GUI/windows
vpath %.py GUI/pyUIClass
vpath %.py GUI
@@ -40,39 +42,44 @@ RUNTIME_FILES = runtime runbacktrace runpicture runlabel runhistory runarray \
runmath
# Files to be scanned for pre-translated symbols defined by SYM(name).
-SYMBOL_FILES = types builtin gsl $(RUNTIME_FILES)
+SYMBOL_FILES = $(RUNTIME_FILES) types builtin gsl
PRC = PRCbitStream oPRCFile PRCdouble writePRC
-COREFILES = $(CAMP) $(SYMBOL_FILES) env genv stm dec errormsg \
- callable name symbol entry exp newexp stack camp.tab lex.yy \
+TINYEXR_FILES = tinyexr_impl
+
+COREFILES = $(CAMP) $(SYMBOL_FILES) $(PRC) $(TINYEXR_FILES) \
+ env genv stm dec errormsg \
+ callable name symbol entry exp newexp stack exithandlers camp.tab lex.yy \
access virtualfieldaccess absyn record interact fileio \
- fftw++asy parallel simpson coder coenv impdatum \
- @getopt@ locate parser program application varinit fundec refaccess \
- envcompleter process constructor array Delaunay predicates \
- $(PRC) glrender tr shaders jsfile v3dfile tinyexr EXRFiles GLTextures \
- lspserv symbolmaps
+ fftw++asy parallel simpson coder coenv impdatum locate asyparser program application \
+ varinit fundec refaccess envcompleter asyprocess constructor array memory \
+ Delaunay predicates glrender tr shaders jsfile v3dfile \
+ EXRFiles GLTextures lspserv symbolmaps win32helpers win32pipestream \
+ win32xdr xstream \
+ lspdec lspexp lspfundec lspstm
FILES = $(COREFILES) main
SYMBOLSH = opsymbols.h allsymbols.h $(SYMBOL_FILES:=.symbols.h)
UIFILES = $(wildcard GUI/windows/*.ui)
-PYFILES = $(wildcard GUI/pyUIClass/*.py) GUI/icons_rc.py
+PYFILES = GUI/xasyqtui GUI/xasyicons GUI/xasyversion
GENERATEDENUMS=v3dtypes v3dheadertypes
ASYGENERATEDENUMS=$(addprefix base/,$(GENERATEDENUMS:=.asy))
PYGENERATEDENUMS=$(GENERATEDENUMS:=.py)
-DIST = camp.tab.h camp.tab.cc lex.yy.cc runtime.cc keywords.cc \
+DIST = camp.tab.h camp.tab.cc lex.yy.cc runtime.cc keywords.h \
asy-keywords.el $(RUNTIME_FILES:=.cc) asy.list \
- $(SYMBOLSH) $(PYFILES) $(GENERATEDENUMS:=.h) $(ASYGENERATEDENUMS)
+ $(SYMBOLSH) $(GENERATEDENUMS:=.h) $(ASYGENERATEDENUMS) $(PYFILES)
NAME = asy
XNAME = x$(NAME)
CLEAN = camp.output base/version.asy doc/version.texi \
- GUI/xasyVersion.py $(XNAME) doc/asy-latex.pdf $(SYMBOLSH)
+ GUI/xasyVersion.py $(XNAME) doc/asy-latex.pdf $(SYMBOLSH) \
+ version.txt
EXTRA = asy-mode.el asy-init.el asy.vim asy_filetype.vim asy-kate.sh \
- asymptote.py reload.js nopapersize.ps
+ asymptote.py reload.js nopapersize.ps
EXEXTRA = piicon.png 100d.pdb1 *.views *.dat *.bib
DOCEXTRA = *.asy *.csv *.dat latexusage.tex externalprc.tex pixel.pdf
KEYWORDS = base $(ASYMPTOTE_SITEDIR)
@@ -80,10 +87,11 @@ LATEXFILES = asymptote.sty asycolors.sty latexmkrc
CONTEXTFILES = colo-asy.tex
ASY = ./asy -dir base -config "" -render=0
-DEFS = @DEFS@ @OPTIONS@ @PTHREAD_CFLAGS@ -DFFTWPP_SINGLE_THREAD -Wall
+DEFS = @DEFS@ @OPTIONS@ @PTHREAD_CFLAGS@ -DFFTWPP_SINGLE_THREAD -Wall -I.
CFLAGS = @CFLAGS@
-OPTS = $(DEFS) @CPPFLAGS@ @CXXFLAGS@ $(CFLAGS) -ILspCpp/include
-
+OPTS = $(DEFS) @CPPFLAGS@ @CXXFLAGS@ $(CFLAGS) \
+ -Ibackports/optional/include \
+ -Iprc/include -I$(LSP_ROOT)/include
GLEWOPTS = $(DEFS) @CPPFLAGS@ $(CFLAGS) -DGLEW_NO_GLU -DGLEW_BUILD -O1 -fPIC
# Options for compiling the object files for the shared library.
@@ -126,75 +134,53 @@ endif
export prefix docdir exampledir mandir infodir INSTALL MAKE DESTDIR TEXI2DVI
-asy: version $(FILES:=.o) glew.o @LSPLIB@
- if test -n "$(MSDOS)"; then \
- $(CXX) $(OPTS) -o $(NAME) $(FILES:=.o) revision.o asy.o $(DOSLIBS); \
- else \
- ln -sf GUI/xasy.py $(XNAME); \
- $(CXX) $(OPTS) -o $(NAME) $(FILES:=.o) revision.o $(LIBS); \
+asy: base/version.asy $(FILES:=.o) $(XNAME) revision.o @LSPLIB@ @GLEW@
+ $(CXX) $(OPTS) -o $(NAME) $(FILES:=.o) revision.o $(LIBS)
+
+$(XNAME): $(PYFILES)
+ @ln -sf GUI/xasy.py $(XNAME)
+
+version.txt: FORCE
+ @if test ! -s $@ || test "$(revision)" != "$(last)"; then \
+ echo "$(revision)" > $@; \
fi
-version: $(GCLIB) $(notdir $(UIFILES:.ui=.py)) icons_rc.py $(ASYGENERATEDENUMS) $(PYGENERATEDENUMS)
- if test ! -s revision.cc || test "$(revision)" != "$(last)"; then \
- echo $(REVISION)\"$(revision)\"\; > revision.cc; \
- echo const char *AsyGLVersion=\"$(ASYGLVERSION)\"\; >> revision.cc; \
- if test ! -e base/webgl/asygl.js; then \
- cp base/webgl/asygl-$(ASYGLVERSION).js base/webgl/asygl.js; \
- fi \
+ @if test ! -e base/webgl/asygl.js; then \
+ cp base/webgl/asygl-$(ASYGLVERSION).js base/webgl/asygl.js; \
fi
- $(CXX) $(OPTS) -o revision.o -c revision.cc;
- echo string VERSION=\"$(revision)\"\; > base/version.asy
- echo @set VERSION $(revision) > doc/version.texi
- echo @set Datadir @datadir@ >> doc/version.texi
- echo @set Docdir @docdir@ >> doc/version.texi
+GUI/xasyversion: version.txt GUI/buildtool.py
+ -@cd GUI && $(PYTHON) buildtool.py buildversionmodule --version-override="$(shell cat $<)"
- echo "#!/usr/bin/env python3" > GUI/xasyVersion.py
- echo xasyVersion = \"$(revision)\" >> GUI/xasyVersion.py
+revision.cc: version.txt
+ echo $(REVISION)\"$(shell cat $<)\"\; > $@
+ echo const char *AsyGLVersion=\"$(ASYGLVERSION)\"\; >> $@;
- if test -n "$(MSDOS)"; then \
- cat asy.rc | sed -e "s/ASYMPTOTE_VERSION/$(revision)/" | \
- windres -o asy.o; \
- fi
+base/version.asy: version.txt
+ echo string VERSION=\"$(shell cat $<)\"\; > $@
+
+doc/version.texi: version.txt
+ echo @set VERSION $(shell cat $<) > $@
+ echo @set Datadir @datadir@ >> $@
+ echo @set Docdir @docdir@ >> $@
asymptote.so: $(COREFILES:=.pic.o) glew.o
$(CXX) $(OPTS) -shared -o asymptote.so revision.o $(COREFILES:=.pic.o) $(SHAREDLIBS)
-liblspcpp.a:
- cd LspCpp && $(CMAKE) -DCMAKE_CXX_FLAGS="-fPIE @OPTIONS@ -I../$(GC)/include" CMakeLists.txt && $(MAKE)
+$(LSP_BUILD_ROOT)/liblspcpp.a:
+ $(CMAKE) -B$(LSP_BUILD_ROOT) -S$(LSP_ROOT) -DCMAKE_CXX_FLAGS=\
+ "-fPIE @OPTIONS@ @LSP_CXX_BUILD_FLAGS@" \
+ @LSP_CMAKE_OPTIONS@
+ $(MAKE) -C $(LSP_BUILD_ROOT)
-all: asy sty man faq asy-keywords.el
+all: asy sty man faq asy-keywords.el
-$(GCLIB): $(GC).tar.gz
- gunzip -c $(GC).tar.gz > $(GC).tar
- tar -xf $(GC).tar
- rm -f $(GC).tar
- if test -r $(LIBATOMIC).tar.gz; then \
- gunzip -c $(LIBATOMIC).tar.gz > $(LIBATOMIC).tar; \
- tar -xf $(LIBATOMIC).tar; \
- rm -f $(LIBATOMIC).tar; \
- mv $(LIBATOMIC) $(GC)/libatomic_ops; \
- fi
- if test "$(GC)" = "gc-7.0"; then \
- cd $(GC)/include/private && \
- patch < ../../../patches/gc-7.0nomem.patch; \
- fi
- if test "$(GC)" = "gc-7.2b"; then \
- mv gc-7.2 gc-7.2b; \
- fi
- if test "$(GC)" = "gc-7.2c"; then \
- mv gc-7.2 gc-7.2c; \
- fi
- if test "$(GC)" = "gc-7.2d"; then \
- mv gc-7.2 gc-7.2d; \
- fi
- cd $(GC) && \
- ./configure CC="$(CC)" CXX="$(CXX)" $(GCOPTIONS); \
- $(MAKE) check
-
-$(GCPPLIB): $(GCLIB)
+$(GCLIB):
+ cd $(GC) && ln -sf ../libatomic_ops . && \
+ ./configure CC="$(CC)" CXX="$(CXX)" $(GCOPTIONS)
+ $(MAKE) -C $(GC) check
-sty:
+sty: doc/version.texi
cd doc && $(MAKE) asy-latex.pdf
dvi: asy sty
@@ -210,47 +196,83 @@ faq: asy sty
cd doc && $(MAKE) faq
$(RUNTIME_FILES:=.cc): %.cc: runtime.pl opsymbols.h runtimebase.in %.in
- $(PERL) ./runtime.pl $(@:.cc=)
-
-$(SYMBOL_FILES:=.symbols.h): %.symbols.h: findsym.pl %.cc
- $(CXX) -E -DNOSYM $(OPTS) $(@:.symbols.h=.cc) | \
- $(PERL) ./findsym.pl $@ -
+ $(PERL) ./runtime.pl --prefix $(@:.cc=) --opsym-file opsymbols.h \
+ --runtime-base-file runtimebase.in \
+ --src-template-dir . \
+ --header-out-dir . \
+ --src-out-dir .
+
+# symbol files
+
+GEN_PREOROCESSED_DEPFILE_BASE_ARGS = \
+ $(PYTHON) gen_preprocessed_depfile.py \
+ --cxx-compiler="$(CXX)" \
+ --additional-raw-arguments="$(OPTS)" \
+ --cxx-standard=$(subst gnu,,$(subst c++,,$(CXX_STANDARD)))
+
+$(SYMBOL_FILES:=.raw.i): %.raw.i: %.cc gen_preprocessed_depfile.py
+ @echo Generating $@ from $<
+ @$(GEN_PREOROCESSED_DEPFILE_BASE_ARGS) \
+ --out-i-file=$@ \
+ --in-src-file=$<
+
+$(SYMBOL_FILES:=.d): %.d: %.cc gen_preprocessed_depfile.py
+ @echo Generating $@ from $<
+ @$(GEN_PREOROCESSED_DEPFILE_BASE_ARGS) \
+ --out-dep-file=$@ \
+ --dep-file-only \
+ --out-i-file=$*.raw.i \
+ --in-src-file=$<
+
+$(SYMBOL_FILES:=.symbols.h): %.symbols.h: %.raw.i findsym.py
+ $(PYTHON) findsym.py $@ $<
$(SYMBOL_FILES:=.o): %.o: %.symbols.h
-allsymbols.h: findsym.pl $(SYMBOL_FILES:=.cc)
- $(CXX) -E -DNOSYM $(OPTS) $(SYMBOL_FILES:=.cc) | \
- $(PERL) ./findsym.pl $@ -
+allsymbols.h: $(SYMBOL_FILES:=.raw.i) findsym.py
+ $(PYTHON) ./findsym.py $@ $(filter-out findsym.py,$^)
symbol.o: $(SYMBOLSH)
icons_rc.py: GUI/res/icons.qrc
-$(PYRCC) GUI/res/icons.qrc -o GUI/icons_rc.py
+GUI/xasyicons: GUI/res/icons.qrc GUI/buildtool.py
+ -cd GUI && $(PYTHON) buildtool.py buildicons
+
+GUI/xasyqtui: $(UIFILES) GUI/buildtool.py
+ -cd GUI && $(PYTHON) buildtool.py buildui
+
camp.tab.cc: camp.y
- $(BISON) -dvt -b camp camp.y && mv camp.tab.c camp.tab.cc
+ $(BISON) -t --header=camp.tab.h -o $@ $<
camp.tab.h: camp.tab.cc
+ @test -f $@ || rm -f $<
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $<
lex.yy.cc: camp.l
$(LEX) -d -olex.yy.cc camp.l
lex.yy.d: $(GCLIB) lex.yy.cc camp.tab.h
-keywords.cc: keywords.pl camp.l process.cc
- $(PERL) ./keywords.pl
+keywords.h: camp.l keywords.py asyprocess.cc
+ $(PYTHON) ./keywords.py --camplfile $< --output $@ --process-file asyprocess.cc
-opsymbols.h: opsymbols.pl camp.l
- $(PERL) ./opsymbols.pl
+opsymbols.h: camp.l opsymbols.py
+ $(PYTHON) ./opsymbols.py --campfile $< --output $@
-envcompleter.d: keywords.cc
+envcompleter.d: keywords.h
-asy-keywords.el: asy
+asy-keywords.el: asy base/v3dtypes.asy base/v3dheadertypes.asy
@echo Creating $@;
$(ASY) -l > asy.list
- ls $(addsuffix /*.asy,$(KEYWORDS)) | grep -v plain\* | \
- grep -v three_\* | grep -v map | xargs $(ASY) -l >> asy.list
- $(PERL) ./asy-list.pl asy.list $(revision)
+ for dir in $(KEYWORDS); do \
+ cd $$dir && /bin/ls *.asy | \
+ grep -v ^plain.asy$ | grep -v ^plain_ | grep -v ^three_ | \
+ xargs ../$(ASY) -l >> ../asy.list; \
+ done
+ revision=`cat version.txt`
+ $(PYTHON) ./asy-list.py --asy-list-file asy.list --revision $(revision) --output-file $@
install-notexhash: asy-keywords.el install-asy install-man
@@ -263,29 +285,32 @@ install-texhash: install-asy
texhash; \
fi
-install-asy: asy sty
+install-asy: asy sty $(PYFILES)
${INSTALL} -d $(bindir) $(asydir) $(exampledir) $(animationsdir)
- ${INSTALL} -d $(GUIdir) $(GUIdir)/pyUIClass $(GUIdir)/configs \
- $(GUIdir)/res $(GUIdir)/res/icons $(shaderdir) \
- $(webgldir)
+ ${INSTALL} -d $(shaderdir) $(webgldir) \
+ $(GUIdir) $(GUIdir)/configs \
+ $(GUIdir)/res $(GUIdir)/res/icons \
+ $(GUIdir)/xasyicons $(GUIdir)/xasyqtui $(GUIdir)/xasyversion
-${INSTALL} -d $(latexdir)
-${INSTALL} -d $(contextdir)
${INSTALL} -p -m 755 $(NAME) $(bindir)
${INSTALL} -p -m 644 base/*.asy $(addprefix base/,$(EXTRA)) \
asy-keywords.el $(asydir)
- ${INSTALL} -p -m 755 GUI/*.py $(GUIdir)
${INSTALL} -p -m 644 base/shaders/*.glsl $(shaderdir)
${INSTALL} -p -m 644 base/webgl/asygl.js \
$(webgldir)
- -${INSTALL} -p -m 644 GUI/pyUIClass/*.py $(GUIdir)/pyUIClass
+ ${INSTALL} -p -m 644 GUI/*.py $(GUIdir)
+ ${INSTALL} -p -m 755 GUI/xasy.py $(GUIdir)
+ -${INSTALL} -p -m 644 GUI/xasyicons/*.py $(GUIdir)/xasyicons
+ -${INSTALL} -p -m 644 GUI/xasyqtui/*.py $(GUIdir)/xasyqtui
+ -${INSTALL} -p -m 644 GUI/xasyversion/*.py $(GUIdir)/xasyversion
${INSTALL} -p -m 644 GUI/configs/*.cson $(GUIdir)/configs
- -${INSTALL} -p -m 644 GUI/icons_rc.py $(GUIdir)
${INSTALL} -p -m 644 GUI/res/icons/*.svg $(GUIdir)/res/icons
ln -sf @datadir@/asymptote/GUI/xasy.py $(bindir)/$(XNAME)
${INSTALL} -p -m 644 examples/*.asy $(addprefix examples/,$(EXEXTRA)) \
doc/extra/*.asy $(addprefix doc/,$(DOCEXTRA)) $(exampledir)
${INSTALL} -p -m 644 examples/animations/*.asy \
- examples/animations/inlinemovie.tex \
+ examples/animations/inlinemovie.tex \
examples/animations/inlinemovie3.tex $(animationsdir)
-${INSTALL} -p -m 644 $(addprefix doc/,$(LATEXFILES)) $(latexdir)
-${INSTALL} -p -m 644 $(addprefix doc/,$(CONTEXTFILES)) $(contextdir)
@@ -309,8 +334,12 @@ uninstall-asy:
-cd $(exampledir) && rm -f $(EXEXTRA) $(DOCEXTRA)
-rmdir $(exampledir)
-cd $(GUIdir) && rm -f *.py
- -cd $(GUIdir)/pyUIClass && rm -f *.py
- -rmdir $(GUIdir)/pyUIClass
+ -cd $(GUIdir)/xasyicons && rm -f *.py
+ -rmdir $(GUIdir)/xasyicons
+ -cd $(GUIdir)/xasyqtui && rm -f *.py
+ -rmdir $(GUIdir)/xasyqtui
+ -cd $(GUIdir)/xasyversion && rm -f *.py
+ -rmdir $(GUIdir)/xasyversion
-cd $(GUIdir)/configs && rm -f *.cson
-rmdir $(GUIdir)/configs
-cd $(GUIdir)/res/icons && rm -f *.svg
@@ -336,35 +365,42 @@ uninstall-man:
uninstall-docdir:
-rmdir $(docdir)
-clean: FORCE
- -rm -f asy asymptote.so *.pic.o *.o *.d *mon.out $(CLEAN)
- -cd LspCpp && $(MAKE) clean
+clean: FORCE
+ -rm -f asy asymptote.so *.pic.o *.o *.d *.raw.i *mon.out $(CLEAN)
+ -cd LspCpp && $(MAKE) distclean
+ -cd LspCpp && rm -rf liblspcpp.a Makefile CMakeFiles third_party/uri/src/CMakeFiles
+ -cd tinyexr && $(MAKE) clean
gc-clean: FORCE clean
- -if test -d $(GC); then \
- $(MAKE) -C $(GC) clean; \
- fi
+ -$(MAKE) -C $(GC) clean
cleaner: FORCE clean
- -if test -d $(GC); then \
- rm -rf $(GC); \
- fi
+ -rm -rf __pycache__
+ -rm -rf GUI/__pycache__
+ -rm -rf GUI/pyUIClass/__pycache__
+ -rm -rf GUI/configs/__pycache__
+ -$(MAKE) -C $(GC) distclean
+ -$(MAKE) -C libatomic_ops distclean
+ -cd $(GC) && rm -rf libatomic_ops .deps cord/.deps cord/tests/.deps extra/.deps tests/.deps
+
-rm -f Makefile config.h config.log config.status errors.temp
+ -rm -rf LspCpp/CMakeCache.txt
cd doc && $(MAKE) clean
cd tests && $(MAKE) distclean
distclean: FORCE cleaner
cd doc && $(MAKE) distclean
- cd LspCpp && rm -rf CMakeCache.txt CMakeDoxyfile.in \
- CMakeDoxygenDefaults.cmake CMakeFiles Makefile cmake_install.cmake \
- third_party/uri/src/CMakeFiles/network-uri.dir/detail
-
cleanest: FORCE maintainer-clean
maintainer-clean: FORCE distclean
- -rm -f configure config.h.in $(DIST)
- -rm -rf autom4te.cache
- -rm -rf GUI/pyUIClass
+ -rm -f configure config.h.in
+ -rm -f ltmain.sh compile missing depcomp test-driver
+ -cd $(GC) && -rm -rf ltmain.sh compile missing depcomp test-driver \
+ configure autom4te.cache m4/l*.m4
+ -cd libatomic_ops && rm -rf autom4te.cache configure m4/l*.m4
+ -cd GUI && $(PYTHON) buildtool.py clean
+ -rm -rf autom4te.cache $(DIST)
+ -rm -rf vcpkg_installed
test: asy FORCE
./wce
@@ -376,8 +412,8 @@ check-all: asy FORCE
./wce
$(MAKE) -C tests all
-glew.o: glew.c GL/glew.h GL/glew.c config.h
- $(CC) -I. $(GLEWOPTS) -o glew.o -c glew.c
+glew.o: glew.c config.h
+ $(CC) $(GLEWOPTS) -o $@ -c $<
.SUFFIXES: .c .cc .o .d .ui .py
%.o: %.cc $(GENERATEDENUMS:=.h) $(RUNTIME_FILES:=.cc)
diff --git a/graphics/asymptote/README b/graphics/asymptote/README
index 686eb44150..8986462fa2 100644
--- a/graphics/asymptote/README
+++ b/graphics/asymptote/README
@@ -1,5 +1,5 @@
ASYMPTOTE
- Copyright 2004-24 Andy Hammerlindl, John Bowman, and Tom Prince
+ Copyright 2004-25 Andy Hammerlindl, John Bowman, and Tom Prince
Asymptote is a powerful descriptive vector graphics language for technical
drawing, inspired by MetaPost but with an improved C++-like
@@ -44,15 +44,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
Note that the MSWindows executable version of Asymptote can only be
released under the GNU General Public License (GPL) as it is linked against
the GNU Scientific Library, GNU Readline library, and other GPL
-libraries. This version of Asymptote also ships with the cygwin1.dll libraries
-noted below.
+libraries.
========================================================================
-Source code for the x86_64 and i386 3.5.1 cygwin1.dll libraries is
-available under the GPL license:
-https://www.cygwin.com/git.html
-
Source for various icons is available under the MIT license from
https://github.com/driftyco/ionicons/archive/v2.0.1.zip
https://github.com/iconic/open-iconic/archive/master.zip
diff --git a/graphics/asymptote/ReleaseNotes b/graphics/asymptote/ReleaseNotes
index 3afa9be03a..136cbce002 100644
--- a/graphics/asymptote/ReleaseNotes
+++ b/graphics/asymptote/ReleaseNotes
@@ -1,4 +1,69 @@
+Release Notes for Version 3.00
+
+Configuration issues were addressed.
+
+Release Notes for Version 2.99
+
+The libtool dependence of configure was removed.
+Dependencies of gc builds are no longer tracked.
+The latest boost library is supported.
+Further build issues were fixed.
+
+Release Notes for Version 2.98
+
+Prebuilt Xasy support files are distributed again.
+
+Release Notes for Version 2.97
+
+Build issues were fixed.
+
+Release Notes for Version 2.96
+
+New keywords autounravel and using were added.
+Issues with templated imports were fixed.
+Asymptote now ships with the Boehm garbage collector.
+Portability fixes were implemented.
+
+Release Notes for Version 2.95
+
+Portability fixes were implemented.
+
+Release Notes for Version 2.94
+
+Portability fixes were implemented for compiling under MacOS.
+
+Release Notes for Version 2.93
+
+A portability issue with a recent version of Ubuntu was addressed.
+The windows binary is now built natively using CMake.
+
+Release Notes for Version 2.92
+
+A bug in unravelling static fields was fixed.
+ImageMagick arguments were reordered.
+An Xasy regex bug was fixed. The bytecode interpreter was optimized.
+The code to ignore duplicate implicit shipouts now accounts for the format.
+The slide paperwidth and paperheight are now properly updated.
+
+Release Notes for Version 2.91
+
+By default, orthographic projections now use center=true;
+the camera and target are automatically centered within the scene.
+The surface constructor for triangles was fixed.
+A bug in the WebGL flatness test was fixed.
+Triangle group bugs were fixed and now produce compact HTML output.
+Triangle groups are used for indexed surfaces drawn with the render option
+tessellate=true.
+GLSL error reporting was restored.
+The reported camera up vector was fixed.
+The map module was fixed.
+A syntax warning in Xasy was fixed.
+Improvements were made to the slide module.
+A bug was fixed in the experimental settings.render=0 mode.
+The debug option now outputs a traceback.
+
Release Notes for Version 2.90
+
A bug in the approximate transparency rendering code for GPUs
without SSBO support was fixed.
Support was added for templated accesses involving imported types,
@@ -6,7 +71,7 @@ top-level structure types, and static fields.
ImageMagick magick convert is now used instead of convert.
The add(picture dest, picture src, pair position) function now respects
size specifications (backwards incompatible; the previous behaviour can
-be obtained with add(dest,src.fit(identity()),position).
+be obtained with add(dest,src.fit(identity),position).
The terminal is now reset upon exit. The erase command was fixed.
Picture scalings in different dimensions are decoupled again.
Flycheck syntax checking support for Emacs was added.
diff --git a/graphics/asymptote/array.cc b/graphics/asymptote/array.cc
index c70f5e22f3..3643bb0e1e 100644
--- a/graphics/asymptote/array.cc
+++ b/graphics/asymptote/array.cc
@@ -78,24 +78,26 @@ void array::setNonBridgingSlice(size_t l, size_t r, mem::vector<item> *a)
{
assert(0 <= l);
assert(l <= r);
+
+ size_t const sliceLength=r-l;
size_t asize=a->size();
- if (asize == r-l) {
+ if (asize == sliceLength) {
// In place
std::copy(a->begin(), a->end(), this->begin()+l);
}
- else if (asize < r-l) {
+ else if (asize < sliceLength) {
// Shrinking
std::copy(a->begin(), a->end(), this->begin()+l);
- this->erase(this->begin()+l+a->size(), this->begin()+r);
+ this->erase(this->begin()+(l+a->size()), this->begin()+r);
}
else {
// Expanding
// NOTE: As a speed optimization, we could check capacity() to see if the
// array can fit the new entries, and build the new array from scratch
// (using swap()) if a new allocation is necessary.
- std::copy(a->begin(), a->begin()+r-l, this->begin()+l);
- this->insert(this->begin()+r, a->begin()+r-l, a->end());
+ std::copy(a->begin(), a->begin()+sliceLength, this->begin()+l);
+ this->insert(this->begin()+r, a->begin()+sliceLength, a->end());
}
}
diff --git a/graphics/asymptote/asy-keywords.el b/graphics/asymptote/asy-keywords.el
index 071b63017f..4b1431ae21 100644
--- a/graphics/asymptote/asy-keywords.el
+++ b/graphics/asymptote/asy-keywords.el
@@ -1,17 +1,17 @@
;;
-;; This file is automatically generated by asy-list.pl.
+;; This file is automatically generated by asy-list.py.
;; Changes will be overwritten.
;;
-(defvar asy-keywords-version "2.90")
+(defvar asy-keywords-version "3.00")
(defvar asy-keyword-name '(
-and controls tension atleast curl if else while for do return break continue struct typedef new access import unravel from include quote static public private restricted this explicit true false null cycle newframe operator ))
+and controls tension atleast curl if else while for do return break continue struct typedef using new access import unravel from include quote static autounravel public private restricted this explicit true false null cycle newframe operator ))
(defvar asy-type-name '(
-Braid FitResult Label Legend Solution TreeNode abscissa arc arrowhead binarytree binarytreeNode block bool bool3 bounds bqe circle conic coord coordsys cputime ellipse evaluatedpoint file filltype frame grid3 guide horner hsv hyperbola int inversion key light line linefit marginT marker mass node object pair parabola patch path path3 pen picture point position positionedvector projection rational real realschur revolution scaleT schur scientific segment side slice solution splitface string surface tensionSpecifier ticklocate ticksgridT tickvalues transform transformation tree triangle trilinear triple vector vertex void ))
+Braid FitResult Label Legend Solution TreeNode abscissa arc arrowhead arrowhead3 binarytree binarytreeNode block bool bool3 bounds bqe circle conic coord coordsys cputime ellipse evaluatedpoint file filltype frame grid3 guide horner hsv hyperbola int interaction inversion key light line linefit marginT marginT3 marker mass material node object pair parabola patch path path3 pen picture point position positionedvector projection rational real realschur revolution rmf scaleT schur scientific segment side slice solution splitface string surface tensionSpecifier ticklocate ticksgridT tickvalues transform transformation tree triangle trilinear triple vector vertex void ))
(defvar asy-function-name '(
-AND Align Arc ArcArrow ArcArrows Arrow Arrows AtA Automatic AvantGarde B03 B13 B23 B33 BBox BWRainbow BWRainbow2 Bar Bars BeginArcArrow BeginArrow BeginBar BeginDotMargin BeginMargin BeginPenMargin Blank Bookman Bottom BottomTop Bounds Break Broken BrokenLog CLZ CTZ Ceil Circle CircleBarIntervalMarker Cos Courier CrossIntervalMarker DOSendl DOSnewl DefaultFormat DefaultLogFormat Degrees Dir DotMargin DotMargins Dotted Draw Drawline Embed EndArcArrow EndArrow EndBar EndDotMargin EndMargin EndPenMargin Fill FillDraw Finite Floor Format Full Gaussian Gaussrand Gaussrandpair Gradient Grayscale Helvetica Hermite HookHead InOutTicks InTicks Jn Label Landscape Left LeftRight LeftTicks Legend Linear Log LogFormat Margin Margins Mark MidArcArrow MidArrow NOT NewCenturySchoolBook NoBox NoMargin NoModifier NoTicks NoTicks3 NoZero NoZeroFormat None OR OmitFormat OmitTick OmitTickInterval OmitTickIntervals OutTicks Ox Oy Palatino PaletteTicks Pen PenMargin PenMargins Pentype Portrait RGB RadialShade RadialShadeDraw Rainbow Range Relative Right RightTicks Rotate Round SQR Scale ScaleX ScaleY ScaleZ Seascape Shift Sin Slant Spline StickIntervalMarker Straight Symbol Tan TeXify Ticks Ticks3 TildeIntervalMarker TimesRoman Top TrueMargin UnFill UpsideDown Wheel X XEquals XOR XY XYEquals XYZero XYgrid XZEquals XZZero XZero XZgrid Y YEquals YXgrid YZ YZEquals YZZero YZero YZgrid Yn Z ZX ZXgrid ZYgrid ZapfChancery ZapfDingbats _begingroup3 _cputime _draw _eval _findroot _image _labelpath _projection _schur _shipout _strokepath _texpath aCos aSin aTan abort abs abs2 accel acos acosh acot acsc activatequote add addArrow addMargins addSaveFunction addpenarc addpenline addseg adjust alias align all altitude angabscissa angle angledegrees angpoint animate annotate anticomplementary antipedal apply approximate arc arcarrowsize arccircle arcdir arcfromcenter arcfromfocus arclength arcnodesnumber arcpoint arcsubtended arcsubtendedcenter arctime arctopath array arrow arrow2 arrowbase arrowbasepoints arrowsize ascii asec asin asinh ask assert asy asycode asydir asyfigure asyfilecode asyinclude asywrite atan atan2 atanh atbreakpoint atexit attach attract atupdate autoformat autoscale autoscale3 axes axes3 axialshade axis axiscoverage azimuth babel background bangles bar barmarksize barsize basealign baseline bbox beep begin beginclip begingroup beginpoint between bevel bezier bezierP bezierPP bezierPPP bezulate bibliography bibliographystyle binarytree binarytreeNode binomial bins bisector bisectorpoint bispline bispline0 bitreverse blend blockconnector box bqe brace breakpoint breakpoints brick buildRestoreDefaults buildRestoreThunk buildcycle bulletcolor byte byteinv calculateScaling canonical canonicalcartesiansystem cartesiansystem case1 case2 case3 cbrt cd ceil center centerToFocus centroid cevian change2 changecoordsys checkSegment check_fpt_zero checkconditionlength checker checkincreasing checklengths checkposition checkpt checkptincube checktriangle choose circle circlebarframe circlemarkradius circlenodesnumber circumcenter circumcircle clamped clear clip clipdraw close cmyk code colatitude collect collinear color colorless colors colorspace comma compassmark complement complementary concat concurrent cone conic conicnodesnumber conictype conj connect containmentTree contains contour contour3 controlSpecifier convert coordinates coordsys copy copyPairOrTriple cos cosh cot countIntersections cputime crop cropcode cross crossframe crosshatch crossmarksize csc cubicroots curabscissa curlSpecifier curpoint currentarrow currentexitfunction currentmomarrow currentpolarconicroutine curve cut cutafter cutbefore cyclic cylinder deactivatequote debugger deconstruct defaultdir defaultformat defaultpen defined degenerate degrees delete deletepreamble determinant diagonal diamond diffdiv dir dirSpecifier dirtime display distance divisors do_overpaint dot dotframe dotsize downcase draw drawAll drawCylinder drawDisk drawDoubleLine drawFermion drawGhost drawGluon drawMomArrow drawPhoton drawScalar drawSphere drawTube drawVertex drawVertexBox drawVertexBoxO drawVertexBoxX drawVertexO drawVertexOX drawVertexTriangle drawVertexTriangleO drawVertexX drawarrow drawarrow2 drawbeziertriangle drawline drawpixel drawstrokepath drawtick duplicate elle ellipse ellipsenodesnumber embed embed3 embedplayer empty enclose end endclip endgroup endgroup3 endl endpoint endpoints eof eol equation equations erase erasestep erf erfc error errorbar errorbars eval excenter excircle exit exitfunction exp expfactors expi expm1 exradius extend extension extouch fabs factorial fermat fft fhorner figure file filecode fill fillbox filldraw filloutside fillrule filltype find findall findroot finite finiteDifferenceJacobian firstcut firstframe fit fit2 fixedscaling floor flush fmdefaults fmod focusToCenter font fontcommand fontsize foot format frac frequency fromCenter fromFocus fspline functionshade gamma gcd generate_random_backtrace generateticks gergonne getc getint getpair getreal getstring gettriple gluon gouraudshade graph graphic graphicscale graphwithderiv gray grestore grid grid3 gsave halfbox hatch hdiffdiv hermite hex histogram history hline hprojection hsv hyperbola hyperbolanodesnumber hyperlink hypot identity image implicitsurface importv3d incenter incentral incircle increasing incrementposition indexedfigure initdefaults initialized input inradius insert inside insphere integrate interactive interior interp interpolate intersect intersection intersectionpoint intersectionpoints intersections intouch inverse inversion invisible is3D isDuplicate isnan isogonal isogonalconjugate isometry isotomic isotomicconjugate isparabola italic item jobname key kurtosis kurtosisexcess label labelaxis labelmargin labelpath labels labeltick labelx labelx3 labely labely3 labelz labelz3 lastcut latex latitude latticeshade layer layout lcm ldexp leastsquares legend legenditem length lexorder lift light limits line linear linecap lineinversion linejoin linemargin lineskip linetype linewidth link list lm_enorm lm_evaluate_default lm_lmdif lm_lmpar lm_minimize lm_print_default lm_print_quiet lm_qrfac lm_qrsolv locale locate locatefile location log log10 log1p logaxiscoverage longitude lookup make3dgrid makeNode makecircle makedraw makepen maketriangle map mapArray mapArrayString margin markangle markangleradius markanglespace markarc marker markinterval marknodes markrightangle markthin markuniform mass masscenter massformat math max max3 maxAfterTransform maxbezier maxbound maxcoords maxlength maxratio maxtimes mean medial median midpoint min min3 minAfterTransform minbezier minbound minipage minratio mintimes miterlimit mktemp momArrowPath momarrowsize monotonic multifigure nGrad nativeformat natural newl newpage newslide newton newtree nextframe nextnormal nextpage nib nodabscissa node none norm normalout normalvideo notaknot nowarn numberpage nurb object offset onpath opacity opposite orient orientation origin orthic orthocenter orthocentercenter outdirectory outformat outline outname outprefix output overloadedMessage overwrite pack pad pairs palette parabola parabolanodesnumber parallel parallelogram partialsum patchwithnormals path path3 pathbetween pathinface pattern pause pdf pedal periodic perp perpendicular perpendicularmark phantom phi1 phi2 phi3 phi4 photon piecewisestraight point polar polarconicroutine polargraph polygon popcount postcontrol postscript pow10 ppoint prc prc0 prconly precision precontrol prepend primitive printBytecode print_random_addresses progress project projection projecttospan projecttospan_findcoeffs purge pwhermite quadpatches quadrant quadraticroots quantize quarticroots quotient radialshade radians radicalcenter radicalline radius rand randompath rationalidentity rd readline realmult realquarticroots rectangle rectangular rectify reflect relabscissa relative relativedistance reldir relpoint reltime remainder remark removeDuplicates rename render replace report resetdefaultpen restore restoredefaults reverse reversevideo rf rfind rgb rgba rgbint rms rotate rotateO rotation round roundbox roundedpath roundrectangle samecoordsys sameside sample save savedefaults saveline scale scale3 scaleO scaleT scaleless schur scientific search searchtree sec secondaryX secondaryY seconds section sector seek seekeof segment segmentlimits sequence setpens sgn sgnd sharpangle sharpdegrees shift shiftless shipout shipout3 show simeq simplexInit simplexPhase1 simplexPhase2 simplexTableau simplexWrite simpson sin sinh size size3 skewness skip slant sleep slice slope slopefield solve solveBVP sort sourceline sphere split sqrt square srand standardizecoordsys stdev step stickframe stickmarksize stickmarkspace stop straight straightness string stripdirectory stripextension stripfile stripsuffix strokepath subdivide subitem subpath substr sum surface symmedial symmedian system tab tableau tan tangent tangential tangents tanh tell tensionSpecifier tensorshade tex texcolor texify texpath texpreamble texreset texshipout texsize texstring textpath thick thin tick tickMax tickMax3 tickMin tickMin3 ticklabelshift ticklocate tildeframe tildemarksize tile tiling time times title titlepage topbox transform transformation transpose trembleFuzz triangle triangleAbc triangleabc triangletoquads trianglewithnormals triangulate tricoef tridiagonal trilinear trim truepoint tube uncycle unfill uniform unique unit unitrand unitsize unityroot unstraighten upcase updatefunction uperiodic upscale uptodate usepackage usersetting usetypescript usleep value variance variancebiased vbox vector vectorfield verbatim view vline vperiodic vprojection warn warning windingnumber write xasyKEY xaxis xaxis3 xaxis3At xaxisAt xequals xlimits xmap xpart xscale xscaleO xtick xtick3 xtrans yaxis yaxis3 yaxis3At yaxisAt yequals ylimits ypart yscale yscaleO ytick ytick3 ytrans zaxis3 zaxis3At zero zlimits zpart ztick ztick3 ztrans ))
+AND Align Arc ArcArrow ArcArrow3 ArcArrows ArcArrows3 Arrow Arrow3 Arrows Arrows3 AtA Automatic AvantGarde B03 B13 B23 B33 BBox BWRainbow BWRainbow2 Bar Bar3 Bars Bars3 BeginArcArrow BeginArcArrow3 BeginArrow BeginArrow3 BeginBar BeginBar3 BeginDotMargin BeginDotMargin3 BeginMargin BeginMargin3 BeginPenMargin BeginPenMargin2 BeginPenMargin3 Blank Bookman Bottom BottomTop Bounds Break Broken BrokenLog CLZ CTZ Ceil Circle CircleBarIntervalMarker Cos Courier CrossIntervalMarker DOSendl DOSnewl DefaultFormat DefaultHead2 DefaultLogFormat Degrees Dir DotMargin DotMargin3 DotMargins DotMargins3 Dotted DoubleLineMidArrow Draw Drawline Embed EndArcArrow EndArcArrow3 EndArrow EndArrow3 EndBar EndBar3 EndDotMargin EndDotMargin3 EndMargin EndMargin3 EndPenMargin EndPenMargin2 EndPenMargin3 Fill FillDraw Finite Floor Format Full Gaussian Gaussrand Gaussrandpair Gradient Grayscale Helvetica Hermite HookHead HookHead2 HookHead3 InOutTicks InTicks Jn Label LabelInteraction Landscape Left LeftRight LeftTicks Legend Linear Log LogFormat Margin Margin3 Margins Margins3 Mark MidArcArrow MidArcArrow3 MidArrow MidArrow3 NOT NewCenturySchoolBook NoBox NoMargin NoMargin3 NoModifier NoTicks NoTicks3 NoZero NoZeroFormat None OR OmitFormat OmitTick OmitTickInterval OmitTickIntervals OutTicks Ox Oy Palatino PaletteTicks Pen PenMargin PenMargin2 PenMargin3 PenMargins PenMargins2 PenMargins3 Pentype Portrait RGB RadialShade RadialShadeDraw Rainbow Range Relative Right RightTicks Rotate Round SQR Scale ScaleX ScaleY ScaleZ Seascape Shift Sin Slant Spline StickIntervalMarker Straight Symbol Tan TeXHead2 TeXify Ticks Ticks3 TildeIntervalMarker TimesRoman Top TrueMargin TrueMargin3 UnFill UpsideDown Wheel X XEquals XOR XY XYEquals XYZero XYgrid XYplane XZ XZEquals XZZero XZero XZgrid Y YEquals YX YXgrid YZ YZEquals YZZero YZero YZgrid YZplane Yn Z ZX ZXgrid ZXplane ZY ZYgrid ZapfChancery ZapfDingbats _begingroup3 _cputime _draw _eval _findroot _image _labelpath _projection _schur _shipout _strokepath _texpath aCos aSin aTan abort abs abs2 absorthographic absperspective accel acos acos1 acosh acot acsc activatequote add add2 addArrow addMargins addPath addSaveFunction addStereoViews addViews addpenarc addpenline addseg adjust adjustedIndex aim alias align alignshift aligntransform all altitude angabscissa angle angledegrees angpoint animate annotate anticomplementary antipedal apply approach approximate arc arcarrowsize arccircle arcdir arcfromcenter arcfromfocus arclength arcnodesnumber arcpoint arcsubtended arcsubtendedcenter arctime arctopath array arrow arrow2 arrowbase arrowbasepoints arrowsize ascii asec asin asin1 asinh ask assert asy asycode asydir asyfigure asyfilecode asyinclude asywrite atan atan2 atanh atbreakpoint atexit attach attract atupdate autoformat autoscale autoscale3 axes axes3 axialshade axis axiscoverage azimuth babel background bangles bar barmarksize barsize basealign baseline bbox beep begin beginclip begingroup begingroup3 beginpoint bend between bevel bezier bezierP bezierPP bezierPPP bezulate bibliography bibliographystyle binarytree binarytreeNode binomial bins bisector bisectorpoint bispline bispline0 bitreverse blend blockconnector box bqe brace breakpoint breakpoints brick buildRestoreDefaults buildRestoreThunk buildcycle bulletcolor byte byteinv calculateScaling camera canonical canonicalcartesiansystem cartesiansystem case1 case2 case3 cbrt cd ceil center centerToFocus centered centroid cevian change2 changecoordsys checkEmpty checkSegment check_fpt_zero checkconditionlength checker checkincreasing checklengths checkposition checkpt checkptincube checktriangle choose circle circlebarframe circlemarkradius circlenodesnumber circumcenter circumcircle clamped clear clip clipdraw close cmyk code colatitude collect collinear color colorless colors colorspace comma compassmark complement complementary computeNormals concat concurrent cone conic conicnodesnumber conictype conj connect containmentTree contains contour contour3 controlSpecifier convert coons coons3 coordinates coordsys copy copyPairOrTriple cos cosh cot countIntersections cputime crop cropcode cross crossframe crosshatch crossmarksize csc cubicroots curabscissa curlSpecifier curpoint currentarrow currentexitfunction currentmomarrow currentpolarconicroutine curve cut cutafter cutbefore cyclic cylinder deactivatequote debugger deconstruct defaultdir defaultformat defaultpen defined degenerate degrees delete deletepreamble determinant diagonal diamond diffdiv dir dirSpecifier dirtime display distance distort divisors do_overpaint dot dotframe dotsize downcase draw draw3D drawAll drawCylinder drawDisk drawDoubleLine drawFermion drawGhost drawGluon drawMomArrow drawPhoton drawScalar drawSphere drawTessellation drawTube drawVertex drawVertexBox drawVertexBoxO drawVertexBoxX drawVertexO drawVertexOX drawVertexTriangle drawVertexTriangleO drawVertexX drawarrow drawarrow2 drawbeziertriangle drawline drawpixel drawstrokepath drawtick duplicate elle ellipse ellipsenodesnumber embed embed3 embed3D embedder embedplayer emissive empty enclose end endclip endgroup endgroup3 endl endpoint endpoints eof eol equation equations erase erasestep erf erfc error errorbar errorbars eval excenter excircle exit exitfunction exp expfactors expi expm1 exradius extend extension extouch extrude fabs factorial fermat fft fhorner figure file filecode fill fillbox filldraw filloutside fillrule filltype find findall findroot finite finiteDifferenceJacobian firstcut firstframe fit fit2 fit3 fixedscaling flip floor flush fmdefaults fmod focusToCenter font fontcommand fontsize foot format frac frequency fromCenter fromFocus fspline functionshade gamma gcd generate_random_backtrace generateticks gergonne getc getint getpair getreal getstring gettriple gluon gouraudshade graph graphic graphicscale graphwithderiv gray grestore grid grid3 gsave halfbox hatch hdiffdiv hermite hex histogram history hline hprojection hsplit hsv hyperbola hyperbolanodesnumber hyperlink hypot identity image implicitsurface importv3d incenter incentral incircle increasing incrementposition indexedfigure initdefaults initialized input inradius insert inside insphere integrate interactive interior interp interpolate intersect intersection intersectionpoint intersectionpoints intersections intouch inverse inversion invert invisible is3D isDuplicate isnan isogonal isogonalconjugate isometry isotomic isotomicconjugate isparabola italic item jobname join3 key kurtosis kurtosisexcess label labelaxis labelmargin labelpath labels labeltick labelx labelx3 labely labely3 labelz labelz3 lastcut latex latitude latticeshade layer layout lcm ldexp leastsquares legend legenditem length lexorder lift light limits line linear linecap lineinversion linejoin linemargin lineskip linetype linewidth link list lm_enorm lm_evaluate_default lm_lmdif lm_lmpar lm_minimize lm_print_default lm_print_quiet lm_qrfac lm_qrsolv locale locate locatefile location log log10 log1p logaxiscoverage longitude look lookup make3dgrid makeMappingArray makeNode makecircle makedraw makepen maketriangle map mapArray mapArrayString margin markangle markangleradius markanglespace markarc marker markinterval marknodes markrightangle markthin markuniform mass masscenter massformat material math max max3 maxAfterTransform maxbezier maxbound maxcoords maxlength maxratio maxtimes mean medial median meshname midpoint min min3 minAfterTransform minbezier minbound minipage minratio mintimes miterlimit mktemp momArrowPath momarrowsize monotonic multifigure nGrad nativeformat natural newl newpage newslide newton newtree nextframe nextnormal nextpage nib nodabscissa node none norm normal normalout normalvideo notaknot nowarn nullpath3 numberpage nurb object oblique obliqueX obliqueY obliqueZ octant1 offset onpath opacity opposite orient orientation origin orthic orthocenter orthocentercenter orthographic outdirectory outformat outline outname outprefix output overlap overloadedMessage overwrite pack pad pairs palette parabola parabolanodesnumber parallel parallelogram partialsum partname patchwithnormals path path3 pathbetween pathinface pattern pause pdf pedal periodic perp perpendicular perpendicularmark perspective phantom phi1 phi2 phi3 phi4 photon piecewisestraight pixel plane planeproject point polar polarconicroutine polargraph polygon popcount position postcontrol postscript pow10 ppoint prc prc0 prconly precision precontrol prepend primitive printBytecode print_random_addresses progress project projection projecttospan projecttospan_findcoeffs purge pwhermite quadpatches quadrant quadraticroots quantize quarticroots quotient radialshade radians radicalcenter radicalline radius rand randompath randompath3 rationalidentity rd readline realmult realquarticroots rectangle rectangular rectify reference reflect regularize relabscissa relative relativedistance reldir relpoint reltime remainder remark removeDuplicates rename render replace report resetdefaultpen restore restoredefaults reverse reversevideo rf rfind rgb rgba rgbint rmf rms rotate rotateO rotation round roundbox roundedpath roundrectangle samecoordsys sameside sample save savedefaults saveline scale scale3 scaleO scaleT scaleless schur scientific search searchtree sec secondaryX secondaryY seconds section sector seek seekeof segment segmentlimits sequence setpens sgn sgnd sharpangle sharpdegrees shift shiftless shipout shipout3 show simeq simplexInit simplexPhase1 simplexPhase2 simplexTableau simplexWrite simpson sin sinh size size3 skewness skip slant sleep slice slope slopefield solve solveBVP sort sourceline sphere split sqrt square srand standardizecoordsys stdev step stickframe stickmarksize stickmarkspace stop straight straightness string stripdirectory stripextension stripfile stripsuffix strokepath subdivide subitem subpatch subpatchbegin subpatchend subpath substr sum surface symmedial symmedian system tab tableau tan tangent tangential tangents tanh tell tensionSpecifier tensor tensorshade tex texcolor texify texpath texpreamble texreset texshipout texsize texstring textpath theta thick thin tick tickMax tickMax3 tickMin tickMin3 ticklabelshift ticklocate tildeframe tildemarksize tile tiling time times title titlepage topbox transform transform3 transformation transpose trembleFuzz triangle triangleAbc triangleabc triangletoquads trianglewithnormals triangulate tricoef tridiagonal trilinear trim triples truepoint tube uncycle unfill uniform unique unit unitcylinderDraw unitfrustum unitfrustum1 unitrand unitsize unityroot unscaled unstraighten upcase updatefunction uperiodic upscale uptodate usepackage usersetting usetypescript usleep value variance variancebiased vbox vector vectorfield verbatim view viewportmargin vline vperiodic vprojection vsplit warn warning windingnumber write xasyKEY xaxis xaxis3 xaxis3At xaxisAt xequals xlimits xmap xpart xscale xscale3 xscaleO xtick xtick3 xtrans xypart yaxis yaxis3 yaxis3At yaxisAt yequals ylimits ypart yscale yscale3 yscaleO ytick ytick3 ytrans zaxis3 zaxis3At zero zlimits zpart zscale3 ztick ztick3 ztrans ))
(defvar asy-variable-name '(
-AliceBlue Align Allow AntiqueWhite Apricot Aqua Aquamarine Aspect Azure BeginPoint Beige Bisque Bittersweet Black BlanchedAlmond Blue BlueGreen BlueViolet Both Break BrickRed Brown BurlyWood BurntOrange CCW CW CadetBlue CarnationPink Center Centered Cerulean Chartreuse Chocolate Coeff Coral CornflowerBlue Cornsilk Crimson Crop Cyan Dandelion DarkBlue DarkCyan DarkGoldenrod DarkGray DarkGreen DarkKhaki DarkMagenta DarkOliveGreen DarkOrange DarkOrchid DarkRed DarkSalmon DarkSeaGreen DarkSlateBlue DarkSlateGray DarkTurquoise DarkViolet DeepPink DeepSkyBlue DefaultHead DimGray DodgerBlue Dotted Down Draw E ENE EPS ESE E_Euler E_PC E_RK2 E_RK3BS Emerald EndPoint Euler Fill FillDraw FireBrick FloralWhite ForestGreen Fuchsia Gainsboro GhostWhite Gold Goldenrod Gray Green GreenYellow Honeydew HookHead Horizontal HotPink I IgnoreAspect IndianRed Indigo Infinity Ivory JOIN_IN JOIN_OUT JungleGreen Khaki LM_DWARF LM_MACHEP LM_SQRT_DWARF LM_SQRT_GIANT LM_USERTOL Label Lavender LavenderBlush LawnGreen Left LeftJustified LeftSide LemonChiffon LightBlue LightCoral LightCyan LightGoldenrodYellow LightGreen LightGrey LightPink LightSalmon LightSeaGreen LightSkyBlue LightSlateGray LightSteelBlue LightYellow Lime LimeGreen Linear Linen Log Logarithmic Magenta Mahogany Mark MarkFill MarkFillable MarkPath Maroon Max MediumAquamarine MediumBlue MediumOrchid MediumPurple MediumSeaGreen MediumSlateBlue MediumSpringGreen MediumTurquoise MediumVioletRed Melon MidPoint MidnightBlue Min MintCream MistyRose Moccasin Move MoveQuiet Mulberry N NE NNE NNW NULL_VERTEX NW NavajoWhite Navy NavyBlue NoAlign NoCrop NoFill NoSide OldLace Olive OliveDrab OliveGreen Orange OrangeRed Orchid Ox Oy PC PaleGoldenrod PaleGreen PaleTurquoise PaleVioletRed PapayaWhip Peach PeachPuff Periwinkle Peru PineGreen Pink Plum PowderBlue ProcessBlue Purple RELEASE RK2 RK3 RK3BS RK4 RK5 RK5DP RK5F RawSienna Red RedOrange RedViolet Rhodamine Right RightJustified RightSide RosyBrown RoyalBlue RoyalPurple RubineRed S SE SSE SSW SW SaddleBrown Salmon SandyBrown SeaGreen Seashell Sepia Sienna Silver SimpleHead SkyBlue SlateBlue SlateGray Snow SpringGreen SteelBlue Suppress SuppressQuiet Tan TeXHead Teal TealBlue Thistle Ticksize Tomato Turquoise UnFill Up VERSION Value Vertical Violet VioletRed W WNW WSW Wheat White WhiteSmoke WildStrawberry XHIGH XLOW XYAlign YAlign YHIGH YLOW Yellow YellowGreen YellowOrange ZHIGH ZLOW _outpipe aboveequationskip addpenarc addpenline align allowstepping angularsystem animationdelay appendsuffix arcarrowangle arcarrowfactor arrow2sizelimit arrowangle arrowbarb arrowdir arrowfactor arrowhookfactor arrowlength arrowsizelimit arrowtexfactor artificialColumn authorpen axis axiscoverage axislabelfactor background backgroundcolor backgroundpen barfactor barmarksizefactor basealign baselinetemplate bernstein beveljoin bigvertexpen bigvertexsize black blue bm bottom bp bracedefaultratio braceinnerangle bracemidangle braceouterangle brown bullet byfoci byvertices camerafactor chartreuse circlemarkradiusfactor circlenodesnumberfactor circleprecision circlescale cm codefile codepen codeskip colorPen coloredNodes coloredSegments conditionlength conicnodesfactor count cputimeformat crossmarksizefactor currentcoordsys currentlight currentpatterns currentpen currentpicture currentposition currentprojection curvilinearsystem cuttings cyan darkblue darkbrown darkcyan darkgray darkgreen darkgrey darkmagenta darkolive darkred dashdotted dashed datepen dateskip debuggerlines debugging deepblue deepcyan deepgray deepgreen deepgrey deepmagenta deepred deepyellow default defaultControl defaultS defaultbackpen defaultcoordsys defaultexcursion defaultfilename defaultformat defaultmassformat defaultpen defaultseparator diamond differentlengths dot dotfactor dotfilltype dotframe dotted doublelinepen doublelinespacing down duplicateFuzz ellipsenodesnumberfactor eps epsgeo epsilon evenodd expansionfactor extendcap fermionpen figureborder figuremattpen file3 firstnode firststep foregroundcolor fuchsia fuzz gapfactor ghostpen gluonamplitude gluonpen gluonratio gray green grey hatchepsilon havepagenumber heavyblue heavycyan heavygray heavygreen heavygrey heavymagenta heavyred hline hwratio hyperbolanodesnumberfactor identity identity4 ignore implicitshipout inch inches includegraphicscommand inf infinity institutionpen intMax intMin invert invisible itempen itemskip itemstep labelmargin landscape lastnode left legendhskip legendlinelength legendmargin legendmarkersize legendmaxrelativewidth legendvskip lightblue lightcyan lightgray lightgreen lightgrey lightmagenta lightolive lightred lightyellow linemargin lm_infmsg lm_shortmsg longdashdotted longdashed magenta magneticRadius mantissaBits markangleradius markangleradiusfactor markanglespace markanglespacefactor maxDenominator maxrefinements mediumblue mediumcyan mediumgray mediumgreen mediumgrey mediummagenta mediumred mediumyellow middle minDistDefault minblockheight minblockwidth mincirclediameter minipagemargin minipagewidth minvertexangle miterjoin mm momarrowfactor momarrowlength momarrowmargin momarrowoffset momarrowpen monoPen morepoints nCircle nan newbulletcolor ngraph nil nmesh nobasealign nodeMarginDefault nodesystem nomarker nopoint noprimary nullpath nullpen numarray ocgindex oldbulletcolor olive optimizeTableau orange origin overpaint page pageheight pagemargin pagenumberalign pagenumberpen pagenumberposition pagewidth paleblue palecyan palegray palegreen palegrey palemagenta palered paleyellow parabolanodesnumberfactor perpfactor phi photonamplitude photonpen photonratio pi pink plain plain_bounds plus preamblenodes pt purple r3 r4a r4b randMax realDigits realEpsilon realMax realMin red relativesystem reverse right roundcap roundjoin royalblue salmon saveFunctions scalarpen sequencereal settings signedtrailingzero solid spinner springgreen sqrtEpsilon squarecap squarepen startposition stdin stdout stepfactor stepfraction steppagenumberpen stepping stickframe stickmarksizefactor stickmarkspacefactor swap textpen ticksize tildeframe tildemarksizefactor tinv titlealign titlepagepen titlepageposition titlepen titleskip top trailingzero treeLevelStep treeMinNodeWidth treeNodeStep trembleAngle trembleFrequency trembleRandom tubegranularity undefined unitcircle unitsquare up urlpen urlskip v3dheadertypes v3dtypes version vertexpen vertexsize viewportmargin viewportsize vline white wye yellow ylabelwidth zeroTransform zerotickfuzz zerowinding ))
+Accent AliceBlue Align Allow AntiqueWhite Apricot Aqua Aquamarine Aspect Azure BackView BeginPoint Beige Billboard Bisque Bittersweet Black BlanchedAlmond Blue BlueGreen BlueViolet Blues Both BottomView BrBG Break BrickRed Brown BuGn BuPu BurlyWood BurntOrange CCW CMRmap CW CadetBlue CarnationPink Center Centered Cerulean Chartreuse Chocolate Coeff Coral CornflowerBlue Cornsilk Crimson Crop Cyan Dandelion Dark2 DarkBlue DarkCyan DarkGoldenrod DarkGray DarkGreen DarkKhaki DarkMagenta DarkOliveGreen DarkOrange DarkOrchid DarkRed DarkSalmon DarkSeaGreen DarkSlateBlue DarkSlateGray DarkTurquoise DarkViolet DeepPink DeepSkyBlue DefaultHead DefaultHead2 DefaultHead3 DimGray DodgerBlue Dotted Down Draw E ENE EPS ESE E_Euler E_PC E_RK2 E_RK3BS Embedded Emerald EndPoint Euler Fill FillDraw FireBrick FloralWhite ForestGreen FrontView Fuchsia Fuzz Gainsboro GhostWhite GnBu Gold Goldenrod Gray Green GreenYellow Greens Greys Headlamp High Honeydew HookHead HookHead2 HookHead3 Horizontal HotPink I IgnoreAspect IndianRed Indigo Infinity Ivory JOIN_IN JOIN_OUT JungleGreen Khaki LM_DWARF LM_MACHEP LM_SQRT_DWARF LM_SQRT_GIANT LM_USERTOL Label Lavender LavenderBlush LawnGreen Left LeftJustified LeftSide LeftView LemonChiffon LightBlue LightCoral LightCyan LightGoldenrodYellow LightGreen LightGrey LightPink LightSalmon LightSeaGreen LightSkyBlue LightSlateGray LightSteelBlue LightYellow Lime LimeGreen Linear Linen Log Logarithmic Low Magenta Mahogany Mark MarkFill MarkFillable MarkPath Maroon Max Medium MediumAquamarine MediumBlue MediumOrchid MediumPurple MediumSeaGreen MediumSlateBlue MediumSpringGreen MediumTurquoise MediumVioletRed Melon MidPoint MidnightBlue Min MintCream MistyRose Moccasin Move MoveQuiet Mulberry N NE NNE NNW NULL_VERTEX NURBSsphere NW NavajoWhite Navy NavyBlue NoAlign NoCrop NoFill NoSide O OldLace Olive OliveDrab OliveGreen OrRd Orange OrangeRed Oranges Orchid Ox Oy PC PRCsphere PRGn Paired PaleGoldenrod PaleGreen PaleTurquoise PaleVioletRed PapayaWhip Pastel1 Pastel2 Peach PeachPuff Periwinkle Peru PiYG PineGreen Pink Plum PowderBlue ProcessBlue PuBu PuBuGn PuOr PuRd Purple Purples RELEASE RK2 RK3 RK3BS RK4 RK5 RK5DP RK5F RawSienna RdBu RdGy RdPu RdYlBu RdYlGn Red RedOrange RedViolet Reds Rhodamine Right RightJustified RightSide RightView RosyBrown RoyalBlue RoyalPurple RubineRed S SE SSE SSW SW SaddleBrown Salmon SandyBrown SeaGreen Seashell Sepia Set1 Set2 Set3 Sienna Silver SimpleHead Single SixViews SixViewsFR SixViewsUS SkyBlue SlateBlue SlateGray Snow Spectral SpringGreen SteelBlue Suppress SuppressQuiet Tan TeXHead TeXHead2 TeXHead3 Teal TealBlue Thistle ThreeViews ThreeViewsFR ThreeViewsUS Ticksize Tomato TopView Turquoise UnFill Up VERSION Value Vertical Viewport Violet VioletRed W WNW WSW Wheat White WhiteSmoke WildStrawberry X XHIGH XLOW XY XYAlign XZ Y YAlign YHIGH YLOW YX YZ Yellow YellowGreen YellowOrange YlGn YlGnBu YlOrBr YlOrRd Z ZHIGH ZLOW ZX ZY Zero _outpipe a aboveequationskip addpenarc addpenline align allowstepping angleprecision angularsystem animationdelay appendsuffix arcarrowangle arcarrowfactor arrow2sizelimit arrowangle arrowbarb arrowdir arrowfactor arrowhookfactor arrowlength arrowsizelimit arrowtexfactor artificialColumn authorpen autumn axis axiscoverage axislabelfactor background backgroundcolor backgroundpen barfactor barmarksizefactor basealign baselinetemplate bernstein beveljoin bigvertexpen bigvertexsize binary black blue bm bone bottom bp bracedefaultratio braceinnerangle bracemidangle braceouterangle brg brown bullet bwr byfoci byvertices camerafactor chartreuse circlemarkradiusfactor circlenodesnumberfactor circleprecision circlescale cividis cm codefile codepen codeskip colorPen coloredNodes coloredSegments conditionlength conicnodesfactor cool coolwarm copper count cputimeformat crossmarksizefactor currentcoordsys currentlight currentpatterns currentpen currentpicture currentposition currentprojection curvilinearsystem cuttings cyan darkblue darkbrown darkcyan darkgray darkgreen darkgrey darkmagenta darkolive darkred dashdotted dashed datepen dateskip debuggerlines debugging deepblue deepcyan deepgray deepgreen deepgrey deepmagenta deepred deepyellow default defaultControl defaultS defaultbackpen defaultcoordsys defaultembed3Doptions defaultembed3Dscript defaultexcursion defaulteyetoview defaultfilename defaultformat defaultfresnel0 defaultmassformat defaultmetallic defaultpen defaultrender defaultseparator defaultshininess diamond differentlengths dot dotfactor dotfilltype dotframe dotted doublelinepen doublelinespacing down duplicateFuzz ellipsenodesnumberfactor eps epsgeo epsilon evenodd expansionfactor extendcap fermionpen figureborder figuremattpen file3 firstnode firststep foregroundcolor fuchsia fuzz gapfactor ghostpen gist_earth gist_ncar gist_stern gluonamplitude gluonpen gluonratio gray green grey hatchepsilon havepagenumber heavyblue heavycyan heavygray heavygreen heavygrey heavymagenta heavyred hline hot hsv hwratio hyperbolanodesnumberfactor i identity identity4 ignore implicitshipout inch inches includegraphicscommand inf inferno infinity institutionpen intMax intMin invert invisible itempen itemskip itemstep jet labelmargin landscape lastnode left legendhskip legendlinelength legendmargin legendmarkersize legendmaxrelativewidth legendvskip lightblue lightcyan lightgray lightgreen lightgrey lightmagenta lightolive lightred lightyellow linemargin lm_infmsg lm_shortmsg longdashdotted longdashed magenta magma magneticRadius mantissaBits markangleradius markangleradiusfactor markanglespace markanglespacefactor maxDenominator maxangleiterations maxrefinements mediumblue mediumcyan mediumgray mediumgreen mediumgrey mediummagenta mediumred mediumyellow middle minDistDefault minblockheight minblockwidth mincirclediameter minipagemargin minipagewidth minvertexangle miterjoin mm momarrowfactor momarrowlength momarrowmargin momarrowoffset momarrowpen monoPen morepoints nCircle nan newbulletcolor ngraph nil nineth nipy_spectral nmesh noTension nobasealign nocontrol nodeMarginDefault nodesystem nolight nomarker nopoint noprimary nslice nullpath nullpen nullpens nullsurface numarray oblique obliqueX obliqueY obliqueZ ocgindex octant1 octant1x oldbulletcolor olive optimizeTableau orange origin overpaint page pageheight pagemargin pagenumberalign pagenumberpen pagenumberposition pagewidth paleblue palecyan palegray palegreen palegrey palemagenta palered paleyellow parabolanodesnumberfactor perpfactor phi photonamplitude photonpen photonratio pi pink plain plain_bounds plasma plus preamblenodes pt purple r3 r4a r4b randMax realDigits realEpsilon realMax realMin red relativesystem reverse right roundcap roundjoin royalblue salmon saveFunctions scalarpen seismic sequencereal settings signedtrailingzero solid spinner spring springgreen sqrtEpsilon squarecap squarepen startposition stdin stdout stepfactor stepfraction steppagenumberpen stepping stickframe stickmarksizefactor stickmarkspacefactor summer swap t1 t2 t3 tab10 tab20 tab20b tab20c textpen ticksize tildeframe tildemarksizefactor tinv titlealign titlepagepen titlepageposition titlepen titleskip top trailingzero treeLevelStep treeMinNodeWidth treeNodeStep trembleAngle trembleFrequency trembleRandom tubegranularity tubethreshold twilight twilight_shifted undefined unitbox unitcircle unitcircle3 unitcone unitcube unitcylinder unitcylinder1 unitdisk unithemisphere unitplane unitsolidcone unitsphere unitsquare unitsquare3 up urlpen urlskip v3dheadertypes v3dtypes version vertexpen vertexsize viewportmargin viewportsize viridis vline white winter wistia wye yellow ylabelwidth zeroTransform zerotickfuzz zerowinding ))
diff --git a/graphics/asymptote/asy-list.pl b/graphics/asymptote/asy-list.pl
deleted file mode 100755
index 4206adc480..0000000000
--- a/graphics/asymptote/asy-list.pl
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/usr/bin/env perl
-#####
-# asy-list.pl
-#
-# Build asy-keywords.el from list of asy global functions and variables
-#
-#####
-
-open(keywords, "> asy-keywords.el") ||
- die("Couldn't open asy-keywords.el for writing.");
-
-print keywords <<END;
-;;
-;; This file is automatically generated by asy-list.pl.
-;; Changes will be overwritten.
-;;
-(defvar asy-keywords-version "$ARGV[1]")
-
-END
-
-sub add {
- print keywords $_[0]." ";
-}
-
-sub openlist {
- open(asylist, $ARGV[0]) || die("Couldn't open $ARGV[0]");
-}
-
-print keywords <<END;
-(defvar asy-keyword-name '(
-END
-
-open(camp, "camp.l") || die("Couldn't open camp.l");
-
-# Search for the %% separator, after which the definitions start.
-while (<camp>) {
- if (/^%%\s*$/) {
- last; # Break out of the loop.
- }
-}
-
-while (<camp>) {
- if (/^%%\s*$/) {
- last; # A second %% indicates the end of definitions.
- }
- if (/^(\w+)\s*\{/) {
- add($1);
- }
-}
-
-openlist();
-
-while (<asylist>) {
- if (/^(\w*)[^ ]* (\w*)\(.*/) {
- push @types, $1;
- push @functions, $2;
- }
- if (/^([^ ]*) (\w*);/) {
- push @variables, $2;
- }
-}
-
-@saw{@types} = ();
-@types = sort keys %saw;
-undef %saw;
-
-@saw{@functions} = ();
-@functions = sort keys %saw;
-undef %saw;
-
-@saw{@variables} = ();
-@variables = sort keys %saw;
-undef %saw;
-
-print keywords <<END;
-))
-
-(defvar asy-type-name '(
-END
-
-foreach(@types) {
- print keywords $_ . " ";
-}
-
-print keywords <<END;
-))
-
-(defvar asy-function-name '(
-END
-
-foreach(@functions) {
- print keywords $_ . " ";
-}
-
-print keywords <<END;
-))
-
-(defvar asy-variable-name '(
-END
-
-foreach(@variables) {
- print keywords $_ . " ";
-}
-
-print keywords "))\n";
-
diff --git a/graphics/asymptote/asy-list.py b/graphics/asymptote/asy-list.py
new file mode 100644
index 0000000000..7668af4d8b
--- /dev/null
+++ b/graphics/asymptote/asy-list.py
@@ -0,0 +1,145 @@
+#!/usr/bin/env python3
+#####
+# asy-list.py
+#
+# Build asy-keywords.el from a list of Asymptote global functions and
+# variables. This script reads definitions from 'camp.l' and writes Emacs Lisp
+# code to 'asy-keywords.el'.
+#
+#####
+
+import argparse
+import re
+import textwrap
+
+parser = argparse.ArgumentParser()
+parser.add_argument(
+ "--asy-list-file", type=str, required=True, help="Path to the asy list file"
+)
+parser.add_argument("--revision", type=str, required=True, help="Revision identifier")
+parser.add_argument(
+ "--output-file", type=str, required=True, help="Path to output file"
+)
+args = parser.parse_args()
+
+# Open the file 'asy-keywords.el' for writing.
+with open(args.output_file, "w", encoding="utf-8") as keywords:
+
+ # Write header information to 'asy-keywords.el'.
+ # This includes comments and the definition of 'asy-keywords-version' using a
+ # command-line argument.
+ keywords.write(
+ textwrap.dedent(
+ f"""\
+ ;;
+ ;; This file is automatically generated by asy-list.py.
+ ;; Changes will be overwritten.
+ ;;
+ (defvar asy-keywords-version "{args.revision}")
+
+ """
+ )
+ )
+
+ # Define a function 'add' that adds a keyword to the output file.
+ def add(keyword):
+ keywords.write(keyword + " ")
+
+ # Write the beginning of the Emacs Lisp definition for 'asy-keyword-name'.
+ keywords.write("(defvar asy-keyword-name '(\n")
+
+ # Open the file 'camp.l' for reading.
+ with open("camp.l", "r", encoding="utf-8") as camp:
+
+ # Read lines from 'camp.l' until reaching a line that contains only '%%'.
+ for line in camp:
+ if re.search(r"^%%\s*$", line):
+ break
+
+ # Continue reading lines from 'camp.l' after the '%%' line.
+ for line in camp:
+ if re.search(r"^%%\s*$", line):
+ # Exit the loop when a second '%%' line is found, indicating the end of
+ # the section.
+ break
+ # Match lines that start with a word (the keyword) followed by optional
+ # whitespace and a '{'.
+ match = re.search(r"^(\w+)\s*\{", line)
+ if match:
+ # Write the keyword followed by a space.
+ keywords.write(match.group(1) + " ")
+
+ # Open an input file specified in the command-line arguments.
+ with open(args.asy_list_file, "r", encoding="utf-8") as asylist:
+
+ # Lists to store types, functions, and variables found in the file.
+ types = [] # List to hold data types.
+ functions = [] # List to hold function names.
+ variables = [] # List to hold variable names.
+
+ # Read each line from the file handle asylist.
+ for line in asylist:
+ # Match lines that define functions.
+ # The pattern looks for:
+ # - An optional word (\w*) representing the return type.
+ # - Any number of non-space characters ([^ ]*), which may include
+ # modifiers.
+ # - A space character.
+ # - Capture the function name (\w*).
+ # - An opening parenthesis '(', indicating the start of the parameter
+ # list.
+ matchFun = re.search(r"^(\w*)[^ ]* (\w*)\(", line)
+ if matchFun:
+ types.append(matchFun.group(1))
+ functions.append(matchFun.group(2))
+ # Match lines that declare variables.
+ # The pattern looks for:
+ # - Any non-space characters before a space ([^ ]*), representing the
+ # type.
+ # - A space character.
+ # - Capture the variable name (\w*).
+ # - A semicolon ';', indicating the end of the declaration.
+ matchVarDec = re.search(r"^([^ ]*) (\w*);", line)
+ if matchVarDec:
+ variables.append(matchVarDec.group(2))
+
+ # Remove duplicates and sort the lists.
+ types = sorted(set(types))
+ functions = sorted(set(functions))
+ variables = sorted(set(variables))
+
+ # Write the closing parentheses for the 'asy-keyword-name' definition in the
+ # output file.
+ keywords.write("))\n\n")
+
+ # Write the beginning of the 'asy-type-name' definition to the output file.
+ keywords.write("(defvar asy-type-name '(\n")
+
+ # Write each type from types to the output file.
+ for t in types:
+ keywords.write(t + " ") # Write the type followed by a space.
+
+ # Write the closing parentheses for the 'asy-type-name' definition.
+ keywords.write("))\n\n")
+
+ # Write the beginning of the 'asy-function-name' definition to the output
+ # file.
+ keywords.write("(defvar asy-function-name '(\n")
+
+ # Write each function name from functions to the output file.
+ for f in functions:
+ keywords.write(f + " ") # Write the function name followed by a space.
+
+ # Write the closing parentheses for the 'asy-function-name' definition.
+ keywords.write("))\n\n")
+
+ # Write the beginning of the 'asy-variable-name' definition to the output
+ # file.
+ keywords.write("(defvar asy-variable-name '(\n")
+
+ # Write each variable name from variables to the output file.
+ for v in variables:
+ keywords.write(v + " ") # Write the variable name followed by a space.
+
+ # Write the closing parentheses for the 'asy-variable-name' definition.
+ keywords.write("))\n")
diff --git a/graphics/asymptote/asy.list b/graphics/asymptote/asy.list
index 096577c741..583aae3a42 100644
--- a/graphics/asymptote/asy.list
+++ b/graphics/asymptote/asy.list
@@ -1,321 +1,1313 @@
-string stripfile(string s);
-string stripsuffix(string f, string suffix=<default>);
-real cbrt(real x);
-real[] cbrt(real[] a);
-pen RGB(int r, int g, int b);
+real legendlinelength;
+string outdirectory();
+bool prc(string format=<default>);
+light currentlight;
+pen royalblue;
+real arrowdir;
+filltype filltype(int type=<default>, pen fillpen=<default>, pen drawpen=<default>, void fill2(frame f, path[] g, pen fillpen));
+string file(string s);
+int Suppress;
+align NoAlign;
+filltype RadialShade(pen penc, pen penr);
+real[] arrowbasepoints(path base, path left, path right, real default=<default>);
+real bp;
+pen mean(pen[] p, real opacity(real[])=<default>);
+pen[] mean(pen[][] palette, real opacity(real[])=<default>);
+bool None(picture, path, pen, marginT(path, pen));
+real legendmargin;
+string[] split(string s, string delimiter=<default>);
+path plus;
+frame enclose(string prefix=<default>, object F, string format=<default>);
cputime cputime();
-string stripdirectory(string s);
-real sqrtEpsilon;
-string stripextension(string s);
-version version;
-void texpreamble(string s);
-pen beveljoin;
-string cputimeformat;
-real Cos(real deg);
-string insert(string s, int pos, string t);
-marginT EndDotMargin(path, pen);
-pen heavyred;
-pen black;
-pen heavyblue;
-filltype dotfilltype;
-pen heavygreen;
-pen heavycyan;
-marginT PenMargin(path, pen)(real begin, real end=<default>);
-marginT PenMargin(path, pen);
-int realDigits;
-pen heavymagenta;
-marginT PenMargins(path, pen);
-void newl(file file);
-void seek(file f, int pos);
+real inches;
+pair SW;
+real inch;
+marginT EndMargin(path, pen);
+pen mediumgrey;
+pen darkcyan;
+real legendhskip;
+void addSaveFunction(void s()());
+pen olive;
+pen zerowinding;
+pen deepmagenta;
+path[] margin(path[] g, real xmargin, real ymargin);
+marker markthin(path g, pen p=<default>, real thin(real fraction)=<default>, filltype filltype=<default>);
+pen mediumyellow;
+slice lastcut(path p, path knife);
+pen darkgreen;
string verbatim(string s);
pen heavygray;
+pen darkred;
+pair E;
+plain_bounds plain_bounds;
+pen darkgray;
+path ellipse(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path ellipse(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path ellipse(pair c, real a, real b);
+frame orientation(frame);
+picture arrow2(arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>);
+pen salmon;
+pen mediummagenta;
+pair arcdir(path p, real L);
+pen mediumcyan;
+pen Pentype(int n);
+triple gettriple(string name=<default>, triple default=<default>, string prompt=<default>, bool store=<default>);
+pen Yellow;
+void begin(picture pic=<default>, string name, string id=<default>, bool visible=<default>);
+void fillbox(frame dest, path g, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+real cm;
+bool BeginArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+bool BeginArcArrow(picture, path, pen, marginT(path, pen));
+pen mediumgreen;
+pen heavygreen;
+pen dashdotted;
+pen deepblue;
+string graphicscale(real x);
+pen mediumblue;
+transform invert;
+pair NNW;
+pair SE;
+string ask(string prompt);
+frame[] fit2(picture[] pictures, picture all);
+pen thick(pen p=<default>);
+pen mediumred;
+marginT EndDotMargin(path, pen);
+marginT BeginDotMargin(path, pen);
+marker[] Mark;
+marker Mark(int n);
+pen darkolive;
+pen Dotted;
+pen Dotted(pen p=<default>);
+string math(string s);
+coord[] maxcoords(coord[] in, bool operator <=(coord, coord));
+void drawarrow(frame f, arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, bool forwards=<default>, marginT margin(path, pen)=<default>, bool center=<default>);
+transform fixedscaling(picture pic=<default>, pair min, pair max, pen p=<default>, bool warn=<default>);
+pen Symbol(string series=<default>, string shape=<default>);
+int count;
+bool BeginArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+bool BeginArrow(picture, path, pen, marginT(path, pen));
+path circle(pair c, real r);
+pen beveljoin;
+pen orange;
+pen green;
+void copyPairOrTriple(pairOrTriple dest, pairOrTriple src);
+file stdin;
+void addArrow(picture pic, arrowhead arrowhead, path g, pen p, real size, real angle, filltype filltype, real position);
+pair relative(picture pic=<default>, pair z);
+path unitcircle;
+arrowhead DefaultHead;
+pen white;
+position EndPoint;
+transform Rotate(transform)(pair z);
+transform Rotate(transform t);
+Legend Legend(string label, pen plabel=<default>, pen p=<default>, frame mark=<default>, bool above=<default>);
+void exitfunction();
+projection centered(projection P, picture pic=<default>);
+string cputimeformat;
+pair arcpoint(path p, real L);
+bool interior(int windingnumber, pen fillrule);
+pen fuchsia;
+pen brown;
+frame dotframe;
+frame dotframe(pen p=<default>, filltype filltype=<default>);
+pen deepcyan;
+pen dotted;
+void drawstrokepath(picture pic=<default>, path g, pen strokepen, pen p=<default>);
+pair reldir(path p, real l);
+pen pink;
+pen TimesRoman(string series=<default>, string shape=<default>);
+pen palemagenta;
+projection projection(triple camera, triple up=<default>, triple target=<default>, triple normal=<default>, real zoom=<default>, real angle=<default>, pair viewportshift=<default>, bool showtarget=<default>, bool autoadjust=<default>, bool center=<default>, transformation projector(triple camera, triple up, triple target));
+int mantissaBits;
+pen lightolive;
+path arrowbase(path r, pair y, real t, real size);
+pen[] monoPen;
+bool CW;
+pen Cyan;
+marginT EndPenMargin(path, pen);
+pair NNE;
+string outprefix(string prefix=<default>);
+object object(Label L);
+object object(frame f);
+object object(Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+bool Bars(picture, path, pen, marginT(path, pen))(real size=<default>);
+bool Bars(picture, path, pen, marginT(path, pen));
+pen roundjoin;
+pen lightgray;
+position MidPoint;
+void drawarrow2(frame f, arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>);
+string Embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>);
+bool ArcArrows(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
+bool ArcArrows(picture, path, pen, marginT(path, pen));
+pen deepgrey;
+pen lightyellow;
+marginT Margin(path, pen)(real begin, real end=<default>);
+marginT Margin(path, pen);
+side NoSide;
+file stdout;
+void mapArray(string From, string To);
+frame Seascape(frame f);
+pair up;
+pen ZapfChancery(string series=<default>, string shape=<default>);
+pair left;
+bool prconly(string format=<default>);
+pen deepgreen;
+marker marker(path[] g, void markroutine(picture pic=<default>, frame f, path g)=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+marker marker(frame f=<default>, void markroutine(picture pic=<default>, frame f, path g)=<default>, bool above=<default>);
+pen lightmagenta;
+real bracedefaultratio;
+transform Scale(transform t);
+string getstring(string name=<default>, string default=<default>, string prompt=<default>, bool store=<default>);
+marginT DotMargins(path, pen);
+path[] MarkPath;
+pen deepgray;
+string defaultformat(int n, string trailingzero=<default>, bool fixed=<default>, bool signed=<default>);
+string defaultformat;
+pen lightcyan;
+pen paleblue;
+frame align(frame f, pair align);
+path[] align(path[] g, transform t=<default>, pair position, pair align, pen p=<default>);
+object align(object F, pair align);
+transform scaleless(transform t);
+pen RGB(int r, int g, int b);
+pen thin();
+real arcarrowangle;
+void restoredefaults();
+pen longdashdotted;
+void usepackage(string s, string options=<default>);
+pen dashed;
+string TeXify(string s);
+string graphic(string name, string options=<default>);
+frame Portrait(frame f);
+real braceinnerangle;
+guide operator ---(... guide[]);
+int debuggerlines;
+frame bbox(picture pic=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
+int JOIN_IN;
+real barfactor;
+pen lightgreen;
+bool EndBar(picture, path, pen, marginT(path, pen));
+bool EndBar(picture, path, pen, marginT(path, pen))(real size=<default>);
+transform zeroTransform;
+void endl(file file);
+void usersetting();
+bool prc0(string format=<default>);
+frame pack(pair align=<default> ... object[] inset);
+pair rectify(pair dir);
+arrowhead TeXHead;
+void beep();
+real labelmargin;
+real labelmargin(pen p=<default>);
+pen lightblue;
+real bracemidangle;
+path unitsquare;
+pen cyan;
+pen grey;
+transform rotation(transform t);
+pair W;
+pen magenta;
+pair WSW;
+pen nobasealign;
+frame Landscape(frame f);
+real camerafactor;
+pen lightred;
+path trim(path g, real begin, real end=<default>);
+marginT DotMargin(path, pen)(real begin, real end=<default>);
+marginT DotMargin(path, pen);
+pen squarepen;
+pen deepyellow;
+real barsize(pen p=<default>);
+object embed3(string, frame, string, string, string, light, projection);
+bool ArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+bool ArcArrow(picture, path, pen, marginT(path, pen));
+pen AvantGarde(string series=<default>, string shape=<default>);
+real circleprecision;
+pen Black;
+bool debugging;
+void shipout(string prefix=<default>, frame f, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>, transform t=<default>);
+void shipout(string prefix=<default>, picture pic=<default>, frame orientation(frame)=<default>, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>);
+pen Pen(int n);
+pair ENE;
+pen Courier(string series=<default>, string shape=<default>);
+void makedraw(frame f, path g, pen p, int depth=<default>);
+pair down;
+path arc(pair c, real r, real angle1, real angle2);
+path arc(pair c, explicit pair z1, explicit pair z2, bool direction=<default>);
+path arc(pair c, real r, real angle1, real angle2, bool direction);
+pair right;
+string outformat(string format=<default>);
+filltype Fill;
+filltype Fill(real xmargin=<default>, real ymargin=<default>, pen p=<default>);
+pen Palatino(string series=<default>, string shape=<default>);
+pair[] intersectionpoints(path p, path q, real fuzz=<default>);
+pair[] intersectionpoints(explicit path[] p, explicit path[] q, real fuzz=<default>);
+real expansionfactor;
+void filloutside(picture pic=<default>, path[] g, pen p=<default>, bool copy=<default>);
+void filloutside(frame f, path[] g, pen p=<default>, bool copy=<default>);
+position BeginPoint;
+path box(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path box(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path box(pair a, pair b);
+pen Bookman(string series=<default>, string shape=<default>);
+frame[] fit(string prefix=<default>, picture[] pictures, string format=<default>, bool view=<default>, string options=<default>, string script=<default>, projection P=<default>);
+real arrowhookfactor;
+bool finite(real x);
+bool finite(pair z);
+bool finite(triple v);
+filltype UnFill(real xmargin=<default>, real ymargin=<default>);
+filltype UnFill;
+pair I;
+pair SSW;
+transform Slant(transform t);
+pair intersectionpoint(path p, path q, real fuzz=<default>);
+real getreal(string name=<default>, real default=<default>, string prompt=<default>, bool store=<default>);
+pen darkbrown;
+int sourceline(string file, string text);
+real RELEASE;
+void updatefunction();
+bool implicitshipout;
+void buildRestoreDefaults()();
+path[] operator ^^(path p, path q);
+path[] operator ^^(explicit path[] p, path q);
+path[] operator ^^(path p, explicit path[] q);
+path[] operator ^^(explicit path[] p, explicit path[] q);
+real arrow2sizelimit;
+filltype FillDraw;
+filltype FillDraw(real xmargin=<default>, real ymargin=<default>, pen fillpen=<default>, pen drawpen=<default>);
+void pause(string w=<default>);
+int ocgindex;
+pen springgreen;
pen heavygrey;
void markuniform(picture pic=<default>, frame f, path g)(pair z(real t), real a, real b, int n);
void markuniform(picture pic=<default>, frame f, path g)(bool centered=<default>, int n, bool rotated=<default>);
-real[] mintimes(path p);
-real[] mintimes(path3 p);
-bool straight(path p, int t);
-bool straight(path3 p, int t);
-pen makepen(path p);
+real circlescale;
+bool ignore;
+pen darkblue;
+int JOIN_OUT;
+projection currentprojection;
+real arrowsizelimit;
+pair endpoint(path p);
+arrowhead HookHead;
+arrowhead HookHead(real dir=<default>, real barb=<default>);
+real[] concat(... real[][]);
+marker[] concat(... marker[][]);
+Label[] concat(... Label[][]);
+bool3[] concat(... bool3[][]);
+pair[] concat(... pair[][]);
+pen[] concat(... pen[][]);
+Legend[] concat(... Legend[][]);
+picture[] concat(... picture[][]);
+path[] concat(... path[][]);
+int[] concat(... int[][]);
+coord[] concat(... coord[][]);
+object[] concat(... object[][]);
+void()()[] concat(... void()()[][]);
+string[] concat(... string[][]);
+triple[] concat(... triple[][]);
+frame[] concat(... frame[][]);
+guide[] concat(... guide[][]);
+bool[] concat(... bool[][]);
+slice firstcut(path p, path knife);
+frame UpsideDown(frame f);
+pair viewportmargin;
+pen nullpen;
+void progress(bool3 init=<default>);
+void save()();
+real dotfactor;
+pen palecyan;
+node node(void d(frame f, transform t, transform T, pair lb, pair rt), string key=<default>);
+marginT BeginMargin(path, pen);
+path buildcycle(... path[] p);
+real arcarrowsize(pen p=<default>);
+real calculateScaling(string dir, coord[] m, coord[] M, real size, bool warn=<default>);
+real calculateScaling(string dir, coord[] coords, real size, bool warn=<default>);
+void activatequote(picture pic=<default>);
+int undefined;
+pen roundcap;
+void buildRestoreThunk()();
+void overloadedMessage(file file);
+frame currentpatterns;
+real arrowfactor;
+pen heavyred;
+pen black;
+void Draw(picture pic=<default>, path g, pen p=<default>);
+void Draw(picture pic=<default>, explicit path[] g, pen p=<default>);
+filltype Draw;
+filltype Draw(real xmargin=<default>, real ymargin=<default>, pen p=<default>);
+void tab(file file);
+bool CCW;
+void usetypescript(string s, string encoding=<default>);
+path randompath(int n, bool cumulate=<default>, guide join(... guide[])=<default>);
+void()()[] array(int n, void value()(), int depth=<default>);
+bool[] array(int n, bool value, int depth=<default>);
+string[] array(int n, string value, int depth=<default>);
+pair[][] array(int n, pair[] value, int depth=<default>);
+marker[] array(int n, marker value, int depth=<default>);
+Label[] array(int n, Label value, int depth=<default>);
+real[][] array(int n, real[] value, int depth=<default>);
+Legend[] array(int n, Legend value, int depth=<default>);
+picture[] array(int n, picture value, int depth=<default>);
+real[] array(int n, real value, int depth=<default>);
+triple[] array(int n, triple value, int depth=<default>);
+path[] array(int n, path value, int depth=<default>);
+frame[] array(int n, frame value, int depth=<default>);
+pen[][] array(int n, pen[] value, int depth=<default>);
+int[] array(int n, int value, int depth=<default>);
+string[][] array(int n, string[] value, int depth=<default>);
+pair[] array(int n, pair value, int depth=<default>);
+bool3[] array(int n, bool3 value, int depth=<default>);
+guide[] array(int n, guide value, int depth=<default>);
+coord[] array(int n, coord value, int depth=<default>);
+object[] array(int n, object value, int depth=<default>);
+pen[] array(int n, pen value, int depth=<default>);
+string[] array(string s);
+real[] uniform(real a, real b, int n);
+pair viewportsize;
+picture currentpicture;
+pen palegreen;
+hsv hsv(real h, real s, real v);
+hsv hsv(pen p);
+Label Label(string s, string size=<default>, pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
+Label Label(Label L, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
+Label Label(Label L, pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
+Label Label(string s, string size=<default>, explicit position position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
+Label Label;
+Label Label(Label L, explicit position position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
+Label Label(explicit pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
+Label Label(string s=<default>, string size=<default>, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
+pair N;
+picture legenditem(Legend legenditem, real linelength);
real dotsize(pen p=<default>);
-real[] curlSpecifier(guide g, int t);
-real straightness(triple z0, triple c0, triple c1, triple z1);
-real straightness(path3 p, int t);
-real log10(real x);
-real[] log10(real[] a);
-pen paleblue;
-bool prc0(string format=<default>);
-string xasyKEY();
-void xasyKEY(string s);
-int CTZ(int a);
-void _shipout(string prefix=<default>, frame f, frame preamble=<default>, string format=<default>, bool wait=<default>, bool view=<default>, transform t=<default>);
-real barfactor;
-pen Magenta;
-real cos(real x);
-real[] cos(real[] a);
-pair cos(explicit pair z);
-int intMax;
-bool cyclic(guide g);
-bool cyclic(path p);
-bool cyclic(path3 p);
-void printBytecode(<open>);
-transform Rotate(transform)(pair z);
-transform Rotate(transform t);
-path subpath(path p, int a, int b);
-path subpath(path p, real a, real b);
-path3 subpath(path3 p, int a, int b);
-path3 subpath(path3 p, real a, real b);
-bool isnan(real x);
-string jobname(string name);
-void print_random_addresses(int n=<default>);
+real pt;
+settings settings;
+int MoveQuiet;
+void savedefaults()();
+bool MidArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
+bool MidArrow(picture, path, pen, marginT(path, pen));
+pair WNW;
+pen palegray;
+pen miterjoin;
+arrowhead SimpleHead;
+real arrowangle;
+bool EndArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+bool EndArrow(picture, path, pen, marginT(path, pen));
+void unitsize(picture pic=<default>, real x, real y=<default>, real z=<default>);
+picture arrow(arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, bool forwards=<default>, marginT margin(path, pen)=<default>, bool center=<default>);
+void arrow(picture pic=<default>, Label L=<default>, pair b, pair dir, real length=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
+path diamond;
+real reltime(path p, real l);
+void marknodes(picture pic=<default>, frame f, path g);
+real arcarrowfactor;
+real mm;
+void bar(picture pic, pair a, pair d, pen p=<default>);
+picture bar(pair a, pair d, pen p=<default>);
+pen heavyblue;
+filltype dotfilltype;
+plain plain;
+int getint(string name=<default>, int default=<default>, string prompt=<default>, bool store=<default>);
+int bitreverse(int a, int bits);
+int popcount(int a);
+int CLZ(int a);
+int NOT(int a);
+int XOR(int a, int b);
+int OR(int a, int b);
+real[][] scale3(real s);
+int AND(int a, int b);
+real[] cubicroots(real a, real b, real c, real d);
void attach(picture dest=<default>, frame src, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
void attach(picture dest=<default>, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
real[] quadraticroots(real a, real b, real c);
pair[] quadraticroots(explicit pair a, explicit pair b, explicit pair c);
-pen darkcyan;
+path[] strokepath(path g, pen p=<default>);
+real erf(real x);
+real Yn(int n, real x);
+real Jn(int n, real x);
+light light(explicit light light);
+light light(pen diffuse=<default>, pen specular=<default>, pen background=<default>, real x, real y, real z);
+light light(pen diffuse=<default>, pen specular=<default>, pen background=<default>, real specularfactor=<default> ... triple[] position);
+light light(pen[] diffuse, pen[] specular=<default>, pen background=<default>, real specularfactor=<default>, triple[] position);
+real remainder(real x, real y);
+int choose(int n, int k);
+real hypot(real x, real y);
+int Round(real x);
+int Ceil(real x);
+marginT BeginPenMargin(path, pen);
+int round(real x);
+int floor(real x);
+pen extendcap;
+int ceil(real x);
+int rand();
+int sgn(real x);
+int quotient(int x, int y);
+path3 path3(triple[] pre, triple[] point, triple[] post, bool[] straight, bool cyclic);
+real incircle(pair a, pair b, pair c, pair d);
+real atan2(real y, real x);
+bool inside(explicit path[] g, pair z, pen fillrule=<default>);
+bool inside(path g, pair z, pen fillrule=<default>);
+int inside(path p, path q, pen fillrule=<default>);
+pair inside(path p, pen fillrule=<default>);
+real erfc(real x);
+int windingnumber(path[] p, pair z);
+real relativedistance(real theta, real phi, real t, bool atleast);
string[] file3;
real[] maxtimes(path p);
real[] maxtimes(path3 p);
-filltype FillDraw;
-filltype FillDraw(real xmargin=<default>, real ymargin=<default>, pen fillpen=<default>, pen drawpen=<default>);
-void initdefaults();
-void erase(frame f);
-string erase(string s, int pos, int n);
-void erase(picture pic=<default>);
-pair E;
-int Ceil(real x);
-pair I;
-pair SSW;
-pen magenta;
-pair WSW;
-pair N;
-bool view();
-void usersetting();
+real[] mintimes(path p);
+real[] mintimes(path3 p);
+pair maxAfterTransform(transform t, path[] p);
+pair minAfterTransform(transform t, path[] p);
+pair extension(pair p, pair q, pair p, pair q);
+string mapArrayString(string From, string To);
+real[][] intersections(path p, path q, real fuzz=<default>);
+real[] intersections(path p, explicit pair a, explicit pair b, real fuzz=<default>);
+real[][] intersections(path3 p, path3 q, real fuzz=<default>);
+real[][] intersections(path3 p, triple[][] p, real fuzz=<default>);
+real[] intersect(path p, path q, real fuzz=<default>);
+real[] intersect(path3 p, path3 q, real fuzz=<default>);
+real[] intersect(path3 p, triple[][] p, real fuzz=<default>);
+real dirtime(path p, pair z);
+real arctime(path p, real l);
+real arctime(path3 p, real dval);
+pair truepoint(picture pic=<default>, pair dir, bool user=<default>);
+position Relative(real position);
+side Relative(explicit pair align);
+marginT Margins(path, pen);
+real arclength(path p);
+real arclength(pair z0, pair c0, pair c1, pair z1);
+real arclength(path3 p);
+real arclength(triple z0, triple c0, triple c1, triple z1);
+bool piecewisestraight(path p);
+bool piecewisestraight(path3 p);
+path nurb(pair z0, pair z1, pair z2, pair z3, real w0, real w1, real w2, real w3, int m);
+path subpath(path p, int a, int b);
+path subpath(path p, real a, real b);
+path3 subpath(path3 p, int a, int b);
+path3 subpath(path3 p, real a, real b);
+real radius(path p, real t);
+real radius(path3 p, real t);
+real radius(triple z0, triple c0, triple c1, triple z1, real t);
+pair accel(path p, int t, int sign=<default>);
+pair accel(path p, real t);
+triple accel(path3 p, int t, int sign=<default>);
+triple accel(path3 p, real t);
+pair precontrol(path p, int t);
+pair precontrol(path p, real t);
+triple precontrol(path3 p, int t);
+triple precontrol(path3 p, real t);
+string defaultfilename;
+real longitude(triple v, bool warn=<default>);
+filltype NoFill;
+real colatitude(triple v, bool warn=<default>);
+marker nomarker;
+pair beginpoint(path p);
+real azimuth(triple v, bool warn=<default>);
+real polar(triple v, bool warn=<default>);
+real zpart(triple v);
+pair bezierPPP(pair a, pair b, pair c, pair d);
+triple bezierPPP(triple a, triple b, triple c, triple d);
+pair SSE;
+pair bezierP(pair a, pair b, pair c, pair d, real t);
+triple bezierP(triple a, triple b, triple c, triple d, real t);
+pair realmult(pair z, pair w);
+triple realmult(triple u, triple v);
+int Floor(real x);
+pair gamma(explicit pair z);
+real gamma(real x);
+pair expi(real angle);
+triple expi(real polar, real azimuth);
+pair dir(real degrees);
+pair dir(explicit pair z);
+triple dir(explicit triple z);
+triple dir(real colatitude, real longitude);
+pair dir(path p, int t, int sign=<default>, bool normalize=<default>);
+pair dir(path p, real t, bool normalize=<default>);
+triple dir(path3 p, int t, int sign=<default>, bool normalize=<default>);
+triple dir(path3 p, real t, bool normalize=<default>);
+pair dir(path p);
+pair dir(path p, path q);
+real aTan(real x);
+real aCos(real x);
+real aSin(real x);
+real arrowsize(pen p=<default>);
+real Tan(real deg);
+real Cos(real deg);
+frame legend(picture pic=<default>, int perline=<default>, real xmargin=<default>, real ymargin=<default>, real linelength=<default>, real hskip=<default>, real vskip=<default>, real maxwidth=<default>, real maxheight=<default>, bool hstretch=<default>, bool vstretch=<default>, pen p=<default>);
+picture legend(Legend[] Legend, int perline=<default>, real linelength, real hskip, real vskip, real maxwidth=<default>, real maxheight=<default>, bool hstretch=<default>, bool vstretch=<default>);
+real Degrees(real radians);
+frame pad(picture pic=<default>, real xsize=<default>, real ysize=<default>, filltype filltype=<default>);
+real radians(real degrees);
+real angle(pair z, bool warn=<default>);
+real angle(transform t);
+side Center;
+real ypart(pair z);
+real ypart(triple v);
+real xpart(pair z);
+real xpart(triple v);
+int seconds(string t=<default>, string format=<default>);
+pen rgba(real[] a);
+real[] rgba(pen p);
+string time(string format=<default>);
+string time(int seconds, string format=<default>);
+string string(int x);
+string string(real x, int digits=<default>);
+int ascii(string s);
+side RightSide;
+string replace(string s, string[][] translate);
+string replace(string s, string before, string after);
+pen lightgrey;
+string upcase(string s);
+pen mediumgray;
+string downcase(string s);
+string substr(string s, int pos, int n=<default>);
+string insert(string s, int pos, string t);
+int rfind(string s, string t, int pos=<default>);
+void purge(int divisor=<default>);
+int animate(string args=<default>, string file=<default>, string format=<default>);
+int convert(string args=<default>, string file=<default>, string format=<default>);
+real sqrtEpsilon;
+string stripextension(string s);
+string stripfile(string s);
+string stripdirectory(string s);
+void warning(string s, string t, bool position=<default>);
pair S;
real abs2(pair z);
real abs2(triple v);
void nowarn(string s);
-transform rotate(real angle, pair z=<default>);
-int quotient(int x, int y);
-transform rotation(transform t);
-pair W;
-int rand();
-pen ZapfChancery(string series=<default>, string shape=<default>);
-int XOR(int a, int b);
+void warn(string s);
+void breakpoints();
+string locatefile(string file, bool full=<default>);
+void breakpoint(code s=<default>);
+void atbreakpoint(string f(string, int, int, code));
+string phantom(string s);
+void atexit(void f());
+void atexit()();
void atupdate(void f());
void atupdate()();
+string outname();
+string mktemp(string s);
+int rename(string from, string to);
+real arrowbarb;
+pen yellow;
+int delete(string s);
+void seekeof(file f);
+pen heavymagenta;
+marginT PenMargins(path, pen);
+void newl(file file);
+void seek(file f, int pos);
+bool Arrows(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
+bool Arrows(picture, path, pen, marginT(path, pen));
+int tell(file f);
+void DOSendl(file file);
+string debugger(string file, int line, int column, code s=<default>);
+string getc(file f);
+void flush(file f);
+pen blue;
+pen evenodd;
+int precision(file f=<default>, int digits=<default>);
+void close(file f);
+void clear(file f);
+void clear(string file, int line);
+void clear();
+void clear(string file, string text);
void unfill(frame f, path[] g, bool copy=<default>);
void unfill(picture pic=<default>, path[] g, bool copy=<default>);
-bool Bar(picture, path, pen, marginT(path, pen));
bool Bar(picture, path, pen, marginT(path, pen))(real size=<default>);
+bool Bar(picture, path, pen, marginT(path, pen));
bool eol(file f);
-pen zerowinding;
-void atbreakpoint(string f(string, int, int, code));
-void savedefaults()();
-bool MidArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
-bool MidArrow(picture, path, pen, marginT(path, pen));
-bool MidArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
-bool MidArcArrow(picture, path, pen, marginT(path, pen));
-void grestore(frame f);
-pair extension(pair p, pair q, pair p, pair q);
-pen extendcap;
-int ceil(real x);
-pen thick(pen p=<default>);
-pair left;
-int Suppress;
+bool eof(file f);
+pen paleyellow;
+file output(string name=<default>, bool update=<default>, string comment=<default>, string mode=<default>);
file input(string name=<default>, bool check=<default>, string comment=<default>, string mode=<default>);
+pair bezierPP(pair a, pair b, pair c, pair d, real t);
+triple bezierPP(triple a, triple b, triple c, triple d, real t);
+real[] _projection();
+triple maxbezier(triple[][] p, triple b);
+triple minbezier(triple[][] p, triple b);
+real legendvskip;
+pen darkmagenta;
+real change2(triple[][] a);
+pair NW;
+real norm(real[] a);
+real norm(real[][] a);
+real norm(triple[][] a);
+int[][] triangulate(pair[] z);
+pair[] fft(pair[] a, int sign=<default>);
+pair[][] fft(pair[][] a, int sign=<default>);
+pair[][][] fft(pair[][][] a, int sign=<default>);
+real simpson(real f(real), real a, real b, real acc=<default>, real dxmax=<default>);
+pen[] colorPen;
+real _findroot(real f(real), real a, real b, real tolerance, real fa, real fb);
+real newton(int iterations=<default>, real f(real), real fprime(real), real x, bool verbose=<default>);
+real newton(int iterations=<default>, real f(real), real fprime(real), real x1, real x2, bool verbose=<default>);
+real[] tridiagonal(real[] a, real[] b, real[] c, real[] f);
+void filldraw(picture pic=<default>, path[] g, pen fillpen=<default>, pen drawpen=<default>);
+void filldraw(frame f, path[] g, pen fillpen=<default>, pen drawpen=<default>);
+real dot(real[] a, real[] b);
+pair dot(pair[] a, pair[] b);
+real dot(explicit pair z, explicit pair w);
+real dot(triple u, triple v);
+void dot(picture pic=<default>, Label L, pair z, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
+void dot(frame f, pair z, pen p=<default>, filltype filltype=<default>);
+void dot(picture pic=<default>, Label[] L=<default>, explicit path g, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
+void dot(picture pic=<default>, pair z, pen p=<default>, filltype filltype=<default>);
+marker dot;
+void dot(picture pic=<default>, Label L, pen p=<default>, filltype filltype=<default>);
+void dot(picture pic=<default>, Label[] L=<default>, pair[] z, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
+void dot(picture pic=<default>, path[] g, pen p=<default>, filltype filltype=<default>);
+marker dot(pen p=<default>, filltype filltype=<default>);
+pair ESE;
+pair project(triple v, real[][] t);
+real[][] AtA(real[][] a);
+real[] solve(real[][] a, real[] b, bool warn=<default>);
+real[][] solve(real[][] a, real[][] b, bool warn=<default>);
+scaleT scaleT(real T(real), real Tinv(real), bool logarithmic=<default>, bool automin=<default>, bool automax=<default>);
+string baseline(string s, string template=<default>);
+int[] findall(bool[] a);
+bool BeginBar(picture, path, pen, marginT(path, pen))(real size=<default>);
+bool BeginBar(picture, path, pen, marginT(path, pen));
+triple perp(triple v, triple u);
+int find(bool[] a, int n=<default>);
+int find(string s, string t, int pos=<default>);
+real degrees(pair z, bool warn=<default>);
+real degrees(real radians);
+bool[] operator !(bool[] a);
+bool operator !(bool b);
+int[] sequence(int n);
+pen[][] sequence(pen[] f(int), int n);
+int[] sequence(int f(int), int n);
+string[][] sequence(string[] f(int), int n);
+pair[] sequence(pair f(int), int n);
+bool3[] sequence(bool3 f(int), int n);
+int[] sequence(int n, int m, int skip);
+guide[] sequence(guide f(int), int n);
+coord[] sequence(coord f(int), int n);
+object[] sequence(object f(int), int n);
+pen[] sequence(pen f(int), int n);
+void()()[] sequence(void f()()(int), int n);
+bool[] sequence(bool f(int), int n);
+string[] sequence(string f(int), int n);
+pair[][] sequence(pair[] f(int), int n);
+marker[] sequence(marker f(int), int n);
+Label[] sequence(Label f(int), int n);
+real[][] sequence(real[] f(int), int n);
+Legend[] sequence(Legend f(int), int n);
+picture[] sequence(picture f(int), int n);
+real[] sequence(real f(int), int n);
+int[] sequence(int n, int m);
+triple[] sequence(triple f(int), int n);
+path[] sequence(path f(int), int n);
+frame[] sequence(frame f(int), int n);
+int[] complement(int[] a, int n);
+path[] complement(frame f, path[] g);
+void saveline(string name, string value, bool store=<default>);
+string readline(string prompt=<default>, string name=<default>, bool tabcompletion=<default>);
+real unitrand();
+string[] history(string name, int n=<default>);
+string[] history(int n=<default>);
+path[] _strokepath(path g, pen p=<default>);
+path[][] textpath(string[] s, pen[] p);
+marginT NoMargin(path, pen);
+marginT NoMargin(path, pen)();
+path[][] _texpath(string[] s, pen[] p);
int SuppressQuiet;
real[] texsize(string s, pen p=<default>);
+bool labels(frame f);
+slice cut(path p, path knife, int n);
+bool is3D(frame f);
+bool is3D(string format=<default>);
+transformation transformation(real[][] modelview);
+transformation transformation(real[][] modelview, real[][] projection);
+pair maxratio(frame f);
+pair maxratio(triple[][] p, pair b);
+pair maxratio(path3 g);
+pair minratio(frame f);
+pair minratio(triple[][] p, pair b);
+pair minratio(path3 g);
+triple size3(frame f);
+void size3(picture pic=<default>, real x, real y=<default>, real z=<default>, bool keepAspect=<default>);
+triple max3(frame f);
+triple max3(pen p);
+int[] MarkFillable;
+pair unit(pair z);
+triple unit(triple v);
+triple min3(frame f);
+triple min3(pen p);
+void drawpixel(frame f, triple v, pen p, real width=<default>);
+pair[] pairs(real[] x, real[] y);
+void eval(code s, bool embedded=<default>);
+void eval(string s, bool embedded=<default>);
+bool Arrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+bool Arrow(picture, path, pen, marginT(path, pen));
+void drawTube(frame f, triple[] g, real width, pen[] p, real opacity, real shininess, real metallic, real fresnel0, triple min, triple max, bool core=<default>);
+void drawDisk(frame f, real[][] t, pen[] p, real opacity, real shininess, real metallic, real fresnel0);
+void stop(string file, int line, code s=<default>);
+void stop(string file, string text, code s=<default>);
+void drawCylinder(frame f, real[][] t, pen[] p, real opacity, real shininess, real metallic, real fresnel0, bool core=<default>);
+real insphere(triple a, triple b, triple c, triple d, triple e);
+void drawSphere(frame f, real[][] t, bool half=<default>, pen[] p, real opacity, real shininess, real metallic, real fresnel0, int type);
+string[] spinner;
+real[] times(path p, real x, real fuzz=<default>);
+real[] times(path p, explicit pair z, real fuzz=<default>);
+void drawbeziertriangle(frame f, triple[][] p, triple center, bool straight, pen[] p, real opacity, real shininess, real metallic, real fresnel0, pen[] colors, int interaction, int digits, bool primitive=<default>);
+void draw(frame f, triple[][] p, triple center, bool straight, pen[] p, real opacity, real shininess, real metallic, real fresnel0, pen[] colors, int interaction, int digits, bool primitive=<default>);
+void draw(frame f, triple[] p, real[] knot, real[] weights=<default>, pen p);
+void draw(frame f, triple[][] p, real[] uknot, real[] vknot, real[][] weights=<default>, pen[] p, real opacity, real shininess, real metallic, real fresnel0, pen[] colors);
+void draw(frame f, triple[] v, int[][] vi, triple center=<default>, triple[] n, int[][] ni, pen[] p, real opacity, real shininess, real metallic, real fresnel0, pen[] c=<default>, int[][] ci=<default>, int interaction);
+void draw(frame f, path g, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen)));
+void draw(frame f, explicit path[] g, pen p=<default>);
+object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), pair position, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+void draw(picture pic=<default>, guide[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
+void draw(pair origin, picture pic=<default>, guide[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
+void draw(picture pic=<default>, explicit path[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
+void draw(pair origin, picture pic=<default>, explicit path[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
+void draw(picture pic=<default>, path[] g, pen fillrule=<default>, pen[] p);
+void draw(picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void draw(pair origin, picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void draw(frame f, guide[] g, pen p=<default>);
+object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+void draw(frame f, path g, pen p=<default>);
+void deconstruct(frame f, frame preamble=<default>, transform t=<default>);
+void deconstruct(picture pic=<default>);
+void shipout3(string prefix, frame f, string format=<default>, real width, real height, real angle, real zoom, triple m, triple m, pair shift, pair margin, real[][] t, real[][] tup, real[] background, triple[] lights, real[][] diffuse, real[][] specular, bool view=<default>);
+void shipout3(string prefix, frame f, string format=<default>);
+int CTZ(int a);
+void _shipout(string prefix=<default>, frame f, frame preamble=<default>, string format=<default>, bool wait=<default>, bool view=<default>, transform t=<default>);
+void asy(string format, bool overwrite=<default> ... string[] s);
+bool latex();
string nativeformat();
-bool invisible(pen p);
-pen invisible();
-pen invisible;
-bool CCW;
-void usetypescript(string s, string encoding=<default>);
-path randompath(int n, bool cumulate=<default>, guide join(... guide[])=<default>);
+path unstraighten(path p);
+path3 unstraighten(path3 p);
+void _image(frame f, real[][] data, pair initial, pair final, pen[] palette=<default>, transform t=<default>, bool copy=<default>, bool antialias=<default>);
+void _image(frame f, pen[][] data, pair initial, pair final, transform t=<default>, bool copy=<default>, bool antialias=<default>);
+void _image(frame f, pen f(int, int), int width, int height, pair initial, pair final, transform t=<default>, bool antialias=<default>);
+void layer(frame f);
+void layer(picture pic=<default>);
+void texreset();
+void _labelpath(frame f, string s, string size, path g, string justify, pair offset, pen p);
+real arrowtexfactor;
+void comma(file file);
+void deletepreamble();
+version version;
+void texpreamble(string s);
+real braceouterangle;
+void tex(frame f, string s);
+void tex(frame f, string s, pair min, pair max);
+void tex(picture pic=<default>, string s);
+void tex(picture pic=<default>, string s, pair min, pair max);
+void prepend(frame dest, frame src);
+void add(frame dest, frame src);
+void add(picture src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture dest=<default>, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(frame dest, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture pic=<default>, void d(picture, transform), bool exact=<default>);
+void add(frame f, transform t=<default>, Label L);
+void add(picture dest, picture src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture dest=<default>, object F, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture pic=<default>, Label L);
+void add(picture src, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(frame dest, frame src, filltype filltype, bool above=<default>);
+void add(frame dest, frame src, bool group, filltype filltype=<default>, bool above=<default>);
+void add(frame dest, frame src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture dest=<default>, frame src, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture dest, picture src, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture pic=<default>, void d(picture, real[][]), bool exact=<default>);
+void add(picture pic=<default>, void d(frame f, transform t), bool exact=<default>);
+void add(picture pic=<default>, void d(frame f, real[][] t, picture pic, projection P), bool exact=<default>);
+void endgroup3(frame f);
+void _begingroup3(frame f, string name, real compression, real granularity, bool closed, bool tessellate, bool dobreak, bool nobreak, triple center, int interaction);
+void endgroup(frame f);
+void endgroup(picture pic=<default>);
+void begingroup(frame f);
+void begingroup(picture pic=<default>);
+bool MidArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
+bool MidArcArrow(picture, path, pen, marginT(path, pen));
+void grestore(frame f);
+void beginclip(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
+void beginclip(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
+pen palegrey;
+void clip(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
+void clip(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
+int Allow;
+real determinant(real[][] a);
+void functionshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, string shader=<default>, bool copy=<default>);
+void functionshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, string shader, bool copy=<default>);
+bool EndArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+bool EndArcArrow(picture, path, pen, marginT(path, pen));
+void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, path[] b=<default>, pair[][] z=<default>, bool copy=<default>);
+void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, path[] b=<default>, pair[][] z=<default>, bool copy=<default>);
+void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>, pair[] z=<default>);
+void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>, pair[] z=<default>);
+file _outpipe;
+void gouraudshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, pair[] z, int[] edges, bool copy=<default>);
+void gouraudshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, int[] edges, bool copy=<default>);
+void gouraudshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, pair[] z, int[] edges, bool copy=<default>);
+void gouraudshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, int[] edges, bool copy=<default>);
+pair getpair(string name=<default>, pair default=<default>, string prompt=<default>, bool store=<default>);
+void axialshade(frame f, path[] g, bool stroke=<default>, pen pena, pair a, bool extenda=<default>, pen penb, pair b, bool extendb=<default>, bool copy=<default>);
+void axialshade(picture pic=<default>, path[] g, bool stroke=<default>, pen pena, pair a, bool extenda=<default>, pen penb, pair b, bool extendb=<default>, bool copy=<default>);
+pen chartreuse;
+void latticeshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, transform t=<default>, bool copy=<default>);
+void latticeshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, bool copy=<default>);
+void fill(frame f, path[] g, pen p=<default>, bool copy=<default>);
+path fill(frame dest, frame src, filltype filltype=<default>, real xmargin=<default>, real ymargin=<default>);
+void fill(pair origin, picture pic=<default>, path[] g, pen p=<default>);
+void fill(picture pic=<default>, path[] g, pen p=<default>, bool copy=<default>);
+void _draw(frame f, path g, pen p);
+void _draw(frame f, path3 g, triple center=<default>, pen[] p, real opacity, real shininess, real metallic, real fresnel0, int interaction=<default>);
+void _draw(picture pic, path g, pen p, marginT margin(path, pen));
+void initdefaults();
+void erase(frame f);
+string erase(string s, int pos, int n);
+void erase(picture pic=<default>);
+string jobname(string name);
+void print_random_addresses(int n=<default>);
+void generate_random_backtrace();
+marginT TrueMargin(path, pen)(real begin, real end=<default>);
+real bezier(real a, real b, real c, real d, real t);
+pair bezier(pair a, pair b, pair c, pair d, real t);
+triple bezier(triple a, triple b, triple c, triple d, real t);
+pen squarecap;
+bool isometry(transform t);
+guide operator ::(... guide[]);
+pen Helvetica(string series=<default>, string shape=<default>);
+transform reflect(pair a, pair b);
+transform rotate(real angle, pair z=<default>);
+bool IgnoreAspect;
+void postscript(frame f, string s);
+void postscript(frame f, string s, pair min, pair max);
+void postscript(picture pic=<default>, string s);
+void postscript(picture pic=<default>, string s, pair min, pair max);
+transform slant(real s);
+transform yscale(real y);
+transform inverse(transform t);
+real[][] inverse(real[][] a);
+pen darkgrey;
+transform xscale(real x);
+transform shiftless(transform t);
+real[][] shiftless(real[][] t);
+real[] _cputime();
+guide reverse(guide g);
+string reverse(string s);
+path reverse(path p);
+path3 reverse(path3 p);
+triple[] reverse(triple[] a);
+int[] reverse(int[] a);
+real[] reverse(real[] a);
+int[] reverse(int n);
+string[] reverse(string[] a);
+pair[] reverse(pair[] a);
+bool[] reverse(bool[] a);
+real[] curlSpecifier(guide g, int t);
+bool Blank(picture, path, pen, marginT(path, pen));
+tensionSpecifier tensionSpecifier(guide g, int t);
+bool3 default;
+pair[] controlSpecifier(guide g, int t);
+pen red;
+pair[] dirSpecifier(guide g, int t);
+pen longdashed;
+pair point(guide g, int t);
+pair point(path p, int t);
+pair point(path p, real t);
+triple point(path3 p, int t);
+triple point(path3 p, real t);
+pair point(picture pic=<default>, pair dir, bool user=<default>);
+pair point(frame f, pair dir);
+pair point(object F, pair dir, transform t=<default>);
+int length(guide g);
+int length(string s);
+real length(pair z);
+real length(triple v);
+int length(path p);
+int length(path3 p);
+int size(guide g);
+pair size(frame f);
+int size(path p);
+int size(path[] p);
+int size(path3 p);
+void size(picture pic=<default>, real x, real y=<default>, bool keepAspect=<default>);
+void size(picture dest, picture src);
+pair size(picture pic, bool user=<default>);
+void size(picture pic=<default>, transform t);
+void size(picture pic=<default>, real xsize, real ysize, pair min, pair max);
+string texify(string s);
+guide operator controls(pair zout, pair zin);
+guide operator controls(pair z);
+bool empty(frame f);
+tensionSpecifier operator tension(real tout, real tin, bool atleast);
+tensionSpecifier operator tension(real t, bool atLeast);
+void end(picture pic=<default>);
+curlSpecifier operator curl(real gamma, int p);
+guide operator spec(pair z, int p);
+void list(string s, bool imports=<default>);
+string cd(string s=<default>);
+int Move;
+string location();
+string xasyKEY();
+void xasyKEY(string s);
+bool pdf();
+void _eval(string s, bool embedded, bool interactivewrite=<default>);
+void _eval(code s, bool embedded);
+void usleep(int microseconds);
+void sleep(int seconds);
+real Sin(real deg);
+void assert(bool b, string s=<default>);
+pair Align;
+void exit();
+void abort(string s=<default>);
+string locale(string s=<default>);
+string defaultseparator;
+string asydir();
+bool view();
int system(string[] s);
int system(string s);
-void bar(picture pic, pair a, pair d, pen p=<default>);
-picture bar(pair a, pair d, pen p=<default>);
-side NoSide;
-file stdout;
+bool interactive();
+pen colorless(pen p);
+bool straight(path p, int t);
+bool straight(path3 p, int t);
+pen makepen(path p);
+realschur schur(real[][] a);
+schur schur(pair[][] a);
+path nib(pen p);
+transform transform(pen p);
+pair relpoint(path p, real l);
+pair[][] transpose(pair[][] a);
+pen[][] transpose(pen[][] a);
+string[][] transpose(string[][] a);
+real[][] transpose(real[][] a);
+pen overwrite(int n);
+int overwrite(pen p=<default>);
+real lineskip(pen p=<default>);
+pen fontsize(real size, real lineskip);
+real fontsize(pen p=<default>);
+pen fontsize(real size);
+string font(pen p=<default>);
+pen font(string name, string options=<default>);
+pen font(string encoding, string family, string series, string shape);
+pen font(string name, real size, string options=<default>);
+void newpage(frame f);
+void newpage(picture pic=<default>);
+pen fontcommand(string s);
+pen linewidth(real x);
+real linewidth(pen p=<default>);
+real arrowlength;
+pen miterlimit(real x);
+real miterlimit(pen p=<default>);
+pen linecap(int n);
+int linecap(pen p=<default>);
+bool adjust(pen p);
+pen adjust(pen p, real arclength, bool cyclic);
+bool scale(pen p);
+transform scale(real x);
+transform scale(real x, real y);
+real[][] scale(real x, real y, real z);
transform Shift(transform t);
real fmod(real x, real y);
real offset(pen p);
-pen rgb(pen p);
-pen rgb(real r, real g, real b);
-pen rgb(real[] a);
-pen rgb(string s);
-real inch;
-bool ArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool ArcArrow(picture, path, pen, marginT(path, pen));
-bool ArcArrows(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
-bool ArcArrows(picture, path, pen, marginT(path, pen));
-pen currentpen;
-pair precontrol(path p, int t);
-pair precontrol(path p, real t);
-triple precontrol(path3 p, int t);
-triple precontrol(path3 p, real t);
-light currentlight;
-pen royalblue;
-picture currentpicture;
-frame currentpatterns;
-int JOIN_IN;
-int JOIN_OUT;
-projection currentprojection;
real orient(pair a, pair b, pair c);
real orient(triple a, triple b, triple c, triple d);
pen linetype(real[] pattern, real offset=<default>, bool scale=<default>, bool adjust=<default>);
real[] linetype(pen p=<default>);
pen linetype(string pattern, real offset=<default>, bool scale=<default>, bool adjust=<default>);
-real xpart(pair z);
-real xpart(triple v);
-side Center;
-real ypart(pair z);
-real ypart(triple v);
-real zpart(triple v);
-frame orientation(frame);
-pen Courier(string series=<default>, string shape=<default>);
-real simpson(real f(real), real a, real b, real acc=<default>, real dxmax=<default>);
+string blend(pen p);
+void endclip(frame f);
+void endclip(picture pic=<default>);
+pen opacity(real opacity=<default>, string blend=<default>);
+real opacity(pen p);
+pen fillrule(int n);
+int fillrule(pen p);
+real[][] identity4;
+marker[] MarkFill;
+pen pattern(string s);
+string pattern(pen p);
+pen solid;
+string colorspace(pen p);
+real byteinv(int x);
+int byte(real x);
+bool Aspect;
+string hex(pen p);
+int hex(string s);
+real[] colors(pen p);
+void DOSnewl(file file);
+pen cmyk(pen p);
+pen cmyk(real c, real m, real y, real k);
+pen rgb(pen p);
+pen rgb(real r, real g, real b);
+pen rgb(real[] a);
+pen rgb(string s);
+pen gray(pen p);
+pen gray(real gray);
+pen gray;
+bool invisible(pen p);
+pen invisible();
+pen invisible;
+void defaultpen(pen p);
+pen defaultpen();
+pen defaultpen;
+void defaultpen(real w);
+void resetdefaultpen();
+bool isnan(real x);
+bool cyclic(guide g);
+bool cyclic(path p);
+bool cyclic(path3 p);
+void printBytecode(<open>);
+pen currentpen;
+string VERSION;
+bool alias(pair[][] a, pair[][] b);
+bool alias(guide[] a, guide[] b);
+bool alias(pair[] a, pair[] b);
+bool alias(int[] a, int[] b);
+bool alias(string[][] a, string[][] b);
+bool alias(bool3 a, bool3 b);
+bool alias(marginT a, marginT b);
+bool alias(transformation a, transformation b);
+bool alias(projection a, projection b);
+bool alias(coords3 a, coords3 b);
+bool alias(align a, align b);
+bool alias(cputime a, cputime b);
+bool alias(real[][] a, real[][] b);
+bool alias(bounds a, bounds b);
+bool alias(light a, light b);
+bool alias(autoscaleT a, autoscaleT b);
+bool alias(ScaleT a, ScaleT b);
+bool alias(side a, side b);
+bool alias(position a, position b);
+bool alias(realschur a, realschur b);
+bool alias(string[] a, string[] b);
+bool alias(frame[] a, frame[] b);
+bool alias(bool[] a, bool[] b);
+bool alias(slice a, slice b);
+bool alias(filltype a, filltype b);
+bool alias(Legend a, Legend b);
+bool alias(picture a, picture b);
+bool alias(schur a, schur b);
+bool alias(void()()[] a, void()()[] b);
+bool alias(pen[][] a, pen[][] b);
+bool alias(path[] a, path[] b);
+bool alias(scaling a, scaling b);
+bool alias(pairOrTriple a, pairOrTriple b);
+bool alias(arrowhead a, arrowhead b);
+bool alias(triple[] a, triple[] b);
+bool alias(hsv a, hsv b);
+bool alias(coord a, coord b);
+bool alias(scaleT a, scaleT b);
+bool alias(object a, object b);
+bool alias(processtime a, processtime b);
+bool alias(real[] a, real[] b);
+bool alias(bool3[] a, bool3[] b);
+bool alias(pen[] a, pen[] b);
+bool alias(Legend[] a, Legend[] b);
+bool alias(picture[] a, picture[] b);
+bool alias(coord[] a, coord[] b);
+bool alias(object[] a, object[] b);
+bool alias(coords2 a, coords2 b);
+bool alias(node a, node b);
+bool alias(Label a, Label b);
+bool alias(marker a, marker b);
+bool alias(marker[] a, marker[] b);
+bool alias(Label[] a, Label[] b);
+real pi;
+int randMax;
+pen heavycyan;
+marginT PenMargin(path, pen)(real begin, real end=<default>);
+marginT PenMargin(path, pen);
+int realDigits;
+real realEpsilon;
+pair NE;
+real realMin;
+real realMax;
+real nan;
+real infinity;
+void xmap(string key, transform t=<default>);
+real inf;
+int intMin;
+int intMax;
+pen palered;
+real[] map(real f(pair), pair[] a);
+int[] map(int f(real), real[] a);
+frame[] map(frame f(frame), frame[] a);
+pen[][] map(pen[] f(pen[]), pen[][] a);
+triple[] map(triple f(triple), triple[] a);
+pen[] map(pen f(pen), pen[] a);
+bool3[] map(bool3 f(bool3), bool3[] a);
+pair[] map(pair f(pair), pair[] a);
+string[] map(string f(string), string[] a);
+marker[] map(marker f(marker), marker[] a);
+Label[] map(Label f(Label), Label[] a);
+void()()[] map(void f()()(void()()), void()()[] a);
+pair[][] map(pair[] f(pair[]), pair[][] a);
+real[] map(real f(real), real[] a);
+coord[] map(coord f(coord), coord[] a);
+object[] map(object f(object), object[] a);
+int[] map(int f(int), int[] a);
+string[][] map(string[] f(string[]), string[][] a);
+bool[] map(bool f(bool), bool[] a);
+path[] map(path f(path), path[] a);
+real[][] map(real[] f(real[]), real[][] a);
+Legend[] map(Legend f(Legend), Legend[] a);
+picture[] map(picture f(picture), picture[] a);
+guide[] map(guide f(guide), guide[] a);
+real identity(real x);
+real[] identity(real[] a);
+transform identity();
+real[][] identity(int n);
+transform identity;
+real pow10(real x);
+real[] pow10(real[] a);
+pen linejoin(int n);
+int linejoin(pen p=<default>);
+real ldexp(real x, int e);
+real log1p(real x);
+real[] log1p(real[] a);
+path brace(pair a, pair b, real amplitude=<default>);
+void deactivatequote(picture pic=<default>);
+string format(string format, int x, string locale=<default>);
+string format(string format, bool forcemath=<default>, string separator, real x, string locale=<default>);
+string format(string format=<default>, bool forcemath=<default>, real x, string locale=<default>);
+real[][][] _schur(real[][] a);
+pair[][][] _schur(pair[][] a);
+real expm1(real x);
+real[] expm1(real[] a);
+void label(frame f, string s, string size, transform t, pair position, pair align, pen p);
+void label(picture pic=<default>, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(pair origin, picture pic=<default>, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(frame f, Label L, pair position, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label L, pair position, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(frame f, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label L, explicit guide g, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label L, explicit path g, align align=<default>, pen p=<default>, filltype filltype=<default>);
+real fabs(real x);
+real[] fabs(real[] a);
+string stripsuffix(string f, string suffix=<default>);
+real cbrt(real x);
+real[] cbrt(real[] a);
+real sqrt(real x);
+real[] sqrt(real[] a);
+pair sqrt(explicit pair z);
+bool all(bool[] a);
+real atanh(real x);
+real[] atanh(real[] a);
+real acosh(real x);
+real[] acosh(real[] a);
transform shift(transform t);
transform shift(pair z);
transform shift(real x, real y);
transform shift(frame f, pair align);
real asinh(real x);
real[] asinh(real[] a);
-pen orange;
-pen darkgray;
-slice lastcut(path p, path knife);
-pen darkgreen;
-pen darkgrey;
-transform xscale(real x);
-transform shiftless(transform t);
-real[][] shiftless(real[][] t);
-transform yscale(real y);
-void usleep(int microseconds);
+pen ZapfDingbats(string series=<default>, string shape=<default>);
+real tanh(real x);
+real[] tanh(real[] a);
real cosh(real x);
real[] cosh(real[] a);
-position MidPoint;
-real Sin(real deg);
-void assert(bool b, string s=<default>);
-pen Palatino(string series=<default>, string shape=<default>);
-real incircle(pair a, pair b, pair c, pair d);
-frame Landscape(frame f);
+real sinh(real x);
+real[] sinh(real[] a);
+real straightness(triple z0, triple c0, triple c1, triple z1);
+real straightness(path3 p, int t);
+real log10(real x);
+real[] log10(real[] a);
+pair midpoint(path p);
+real exp(real x);
+real[] exp(real[] a);
+pair exp(explicit pair z);
pen purple;
string italic(string s);
real atan(real x);
real[] atan(real[] a);
real acos(real x);
real[] acos(real[] a);
-int popcount(int a);
-pair minbound(pair a, pair b);
-triple minbound(triple a, triple b);
-pair minbound(pair[] a);
-pair minbound(pair[][] a);
-pair minbound(pair[][][] a);
-triple minbound(triple[] a);
-triple minbound(triple[][] a);
-triple minbound(triple[][][] a);
-void restore();
-pen basealign(int n);
-int basealign(pen p=<default>);
-pen basealign;
-int min(int a, int b);
-int[] min(int a, int[] b);
-int[] min(int[] a, int b);
-int[] min(int[] a, int[] b);
-int min(int[] a);
-int min(int[][] a);
-int min(int[][][] a);
-real min(real a, real b);
-real[] min(real a, real[] b);
-real[] min(real[] a, real b);
-real[] min(real[] a, real[] b);
-real min(real[] a);
-real min(real[][] a);
-real min(real[][][] a);
-string min(string a, string b);
-string[] min(string a, string[] b);
-string[] min(string[] a, string b);
-string[] min(string[] a, string[] b);
-string min(string[] a);
-string min(string[][] a);
-string min(string[][][] a);
-pair min(pen p);
-pair min(frame f);
-pair min(explicit path p);
-pair min(path[] p);
-triple min(path3 p);
-pair min(picture pic, bool user=<default>);
-real min(... real[] a);
-real min(real m, scaling s, coord[] c);
-int min(... int[] a);
-filltype RadialShade(pen penc, pen penr);
+path roundbox(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path roundbox(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+real asin(real x);
+real[] asin(real[] a);
+real tan(real x);
+real[] tan(real[] a);
+pen Magenta;
+real cos(real x);
+real[] cos(real[] a);
+pair cos(explicit pair z);
+filltype RadialShadeDraw(real xmargin=<default>, real ymargin=<default>, pen penc, pen penr, pen drawpen=<default>);
+real sin(real x);
+real[] sin(real[] a);
+pair sin(explicit pair z);
+path polygon(int n);
+guide operator --(... guide[]);
+void none(file file);
+int factorial(int n);
+real log(real x);
+real[] log(real[] a);
+pair log(explicit pair z);
+guide operator ..(... guide[]);
+guide operator ..(... guide[])(tensionSpecifier t);
+pair operator tuple(real x, real y);
+triple operator tuple(real x, real y, real z);
+transform operator tuple(real x, real y, real xx, real xy, real yx, real yy);
+int[][] diagonal(... int[]);
+real[][] diagonal(... real[]);
+pair[][] diagonal(... pair[]);
+path[] texpath(string s, pen p, bool tex=<default>, bool bbox=<default>);
+path[] texpath(Label L, bool tex=<default>, bool bbox=<default>);
+bool uptodate();
+int operator #(int a, int b);
+int[] operator #(int a, int[] b);
+int[] operator #(int[] a, int b);
+int[] operator #(int[] a, int[] b);
+int operator %(int a, int b);
+int[] operator %(int a, int[] b);
+int[] operator %(int[] a, int b);
+int[] operator %(int[] a, int[] b);
+real operator %(real a, real b);
+real[] operator %(real a, real[] b);
+real[] operator %(real[] a, real b);
+real[] operator %(real[] a, real[] b);
int search(int[] a, int key);
int search(real[] a, real key);
int search(string[] a, string key);
int search(void()()[] a, void key()(), bool less(void()(), void()()));
+int search(marker[] a, marker key, bool less(marker, marker));
+int search(Label[] a, Label key, bool less(Label, Label));
int search(real[] a, real key, bool less(real, real));
+int search(Legend[] a, Legend key, bool less(Legend, Legend));
+int search(picture[] a, picture key, bool less(picture, picture));
int search(guide[] a, guide key, bool less(guide, guide));
-int search(marker[] a, marker key, bool less(marker, marker));
int search(pair[] a, pair key, bool less(pair, pair));
-int search(picture[] a, picture key, bool less(picture, picture));
int search(frame[] a, frame key, bool less(frame, frame));
int search(coord[] a, coord key, bool less(coord, coord));
int search(object[] a, object key, bool less(object, object));
int search(int[] a, int key, bool less(int, int));
-int search(bool3[] a, bool3 key, bool less(bool3, bool3));
-int search(Label[] a, Label key, bool less(Label, Label));
-int search(Legend[] a, Legend key, bool less(Legend, Legend));
int search(string[] a, string key, bool less(string, string));
int search(path[] a, path key, bool less(path, path));
int search(pen[] a, pen key, bool less(pen, pen));
+int search(bool3[] a, bool3 key, bool less(bool3, bool3));
int search(bool[] a, bool key, bool less(bool, bool));
int search(triple[] a, triple key, bool less(triple, triple));
-filltype RadialShadeDraw(real xmargin=<default>, real ymargin=<default>, pen penc, pen penr, pen drawpen=<default>);
-real sin(real x);
-real[] sin(real[] a);
-pair sin(explicit pair z);
-pen deepcyan;
-void restoredefaults();
-path plus;
-pair expi(real angle);
-triple expi(real polar, real azimuth);
-void endclip(frame f);
-void endclip(picture pic=<default>);
-pen opacity(real opacity=<default>, string blend=<default>);
-real opacity(pen p);
-real[] solve(real[][] a, real[] b, bool warn=<default>);
-real[][] solve(real[][] a, real[][] b, bool warn=<default>);
-int rename(string from, string to);
-void DOSendl(file file);
-string debugger(string file, int line, int column, code s=<default>);
-string getc(file f);
-bool debugging;
-void shipout(string prefix=<default>, picture pic=<default>, frame orientation(frame)=<default>, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>);
-void shipout(string prefix=<default>, frame f, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>, transform t=<default>);
-void shipout3(string prefix, frame f, string format=<default>, real width, real height, real angle, real zoom, triple m, triple m, pair shift, pair margin, real[][] t, real[] background, triple[] lights, real[][] diffuse, real[][] specular, bool view=<default>);
-void shipout3(string prefix, frame f, string format=<default>);
-string getstring(string name=<default>, string default=<default>, string prompt=<default>, bool store=<default>);
-int debuggerlines;
-frame bbox(picture pic=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
-frame pad(picture pic=<default>, real xsize=<default>, real ysize=<default>, filltype filltype=<default>);
-real radians(real degrees);
-bool pdf();
-void _eval(string s, bool embedded, bool interactivewrite=<default>);
-void _eval(code s, bool embedded);
-path[][] textpath(string[] s, pen[] p);
-void radialshade(frame f, path[] g, bool stroke=<default>, pen pena, pair a, real ra, bool extenda=<default>, pen penb, pair b, real rb, bool extendb=<default>, bool copy=<default>);
-void radialshade(picture pic=<default>, path[] g, bool stroke=<default>, pen pena, pair a, real ra, bool extenda=<default>, pen penb, pair b, real rb, bool extendb=<default>, bool copy=<default>);
-pair maxbound(pair a, pair b);
-triple maxbound(triple a, triple b);
-pair maxbound(pair[] a);
-pair maxbound(pair[][] a);
-pair maxbound(pair[][][] a);
-triple maxbound(triple[] a);
-triple maxbound(triple[][] a);
-triple maxbound(triple[][][] a);
-string Embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>);
+int[] sort(int[] a);
+int[][] sort(int[][] a);
+real[] sort(real[] a);
+real[][] sort(real[][] a);
+string[] sort(string[] a);
+string[][] sort(string[][] a);
+path[] sort(path[] a, bool less(path, path), bool stable=<default>);
+pen[][] sort(pen[][] a, bool less(pen[], pen[]), bool stable=<default>);
+Legend[] sort(Legend[] a, bool less(Legend, Legend), bool stable=<default>);
+picture[] sort(picture[] a, bool less(picture, picture), bool stable=<default>);
+pair[][] sort(pair[][] a, bool less(pair[], pair[]), bool stable=<default>);
+pen[] sort(pen[] a, bool less(pen, pen), bool stable=<default>);
+bool[] sort(bool[] a, bool less(bool, bool), bool stable=<default>);
+void()()[] sort(void()()[] a, bool less(void()(), void()()), bool stable=<default>);
+frame[] sort(frame[] a, bool less(frame, frame), bool stable=<default>);
+marker[] sort(marker[] a, bool less(marker, marker), bool stable=<default>);
+Label[] sort(Label[] a, bool less(Label, Label), bool stable=<default>);
+int[] sort(int[] a, bool less(int, int), bool stable=<default>);
+string[][] sort(string[][] a, bool less(string[], string[]), bool stable=<default>);
+bool3[] sort(bool3[] a, bool less(bool3, bool3), bool stable=<default>);
+real[] sort(real[] a, bool less(real, real), bool stable=<default>);
+string[] sort(string[] a, bool less(string, string), bool stable=<default>);
+coord[] sort(coord[] a, bool less(coord, coord), bool stable=<default>);
+object[] sort(object[] a, bool less(object, object), bool stable=<default>);
+pair[] sort(pair[] a, bool less(pair, pair), bool stable=<default>);
+real[][] sort(real[][] a, bool less(real[], real[]), bool stable=<default>);
+triple[] sort(triple[] a, bool less(triple, triple), bool stable=<default>);
+guide[] sort(guide[] a, bool less(guide, guide), bool stable=<default>);
pair postcontrol(path p, int t);
pair postcontrol(path p, real t);
triple postcontrol(path3 p, int t);
@@ -348,197 +1340,119 @@ pair max(path[] p);
triple max(path3 p);
real max(real M, scaling s, coord[] c);
int max(... int[] a);
-pair max(picture pic, bool user=<default>);
real max(... real[] a);
-Label Label(string s, string size=<default>, explicit position position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
-Label Label(Label L, explicit position position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
-Label Label(explicit pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
-Label Label(string s=<default>, string size=<default>, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
-Label Label;
-Label Label(string s, string size=<default>, pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
-Label Label(Label L, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
-Label Label(Label L, pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
-string font(pen p=<default>);
-pen font(string name, string options=<default>);
-pen font(string encoding, string family, string series, string shape);
-pen font(string name, real size, string options=<default>);
-string outdirectory();
-marker markthin(path g, pen p=<default>, real thin(real fraction)=<default>, filltype filltype=<default>);
-int intMin;
-pen white;
-side RightSide;
-string replace(string s, string[][] translate);
-string replace(string s, string before, string after);
-transform fixedscaling(picture pic=<default>, pair min, pair max, pen p=<default>, bool warn=<default>);
-pen Symbol(string series=<default>, string shape=<default>);
-slice firstcut(path p, path knife);
-pen squarecap;
-bool isometry(transform t);
-pen squarepen;
-pen deepyellow;
-real barsize(pen p=<default>);
-bool EndArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool EndArrow(picture, path, pen, marginT(path, pen));
-bool EndArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool EndArcArrow(picture, path, pen, marginT(path, pen));
-void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, path[] b=<default>, pair[][] z=<default>, bool copy=<default>);
-void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, path[] b=<default>, pair[][] z=<default>, bool copy=<default>);
-void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>, pair[] z=<default>);
-void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>, pair[] z=<default>);
-string[] split(string s, string delimiter=<default>);
-void addSaveFunction(void s()());
-object embed3(string, frame, string, string, string, light, projection);
-filltype NoFill;
-real colatitude(triple v, bool warn=<default>);
-void drawDisk(frame f, real[][] t, pen[] p, real opacity, real shininess, real metallic, real fresnel0);
-void label(frame f, string s, string size, transform t, pair position, pair align, pen p);
-void label(picture pic=<default>, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(pair origin, picture pic=<default>, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(frame f, Label L, pair position, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label L, pair position, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(frame f, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label L, explicit guide g, align align=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label L, explicit path g, align align=<default>, pen p=<default>, filltype filltype=<default>);
-real fabs(real x);
-real[] fabs(real[] a);
-bool labels(frame f);
-light light(pen diffuse=<default>, pen specular=<default>, pen background=<default>, real x, real y, real z);
-light light(pen diffuse=<default>, pen specular=<default>, pen background=<default>, real specularfactor=<default> ... triple[] position);
-light light(explicit light light);
-light light(pen[] diffuse, pen[] specular=<default>, pen background=<default>, real specularfactor=<default>, triple[] position);
-real remainder(real x, real y);
-int byte(real x);
-real camerafactor;
-pen lightred;
-real labelmargin;
-real labelmargin(pen p=<default>);
-pen lightblue;
-pen lightgreen;
-pair right;
-string outformat(string format=<default>);
-pen lightcyan;
-pen lightmagenta;
-pen lightyellow;
-pen lightgray;
-pen lightolive;
-pen lightgrey;
-string upcase(string s);
-pen darkblue;
-pen darkbrown;
-path[] strokepath(path g, pen p=<default>);
-real erf(real x);
-void saveline(string name, string value, bool store=<default>);
-pen fuchsia;
-filltype filltype(int type=<default>, pen fillpen=<default>, pen drawpen=<default>, void fill2(frame f, path[] g, pen fillpen));
-path box(pair a, pair b);
-path box(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-path box(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-frame[] fit(string prefix=<default>, picture[] pictures, string format=<default>, bool view=<default>, string options=<default>, string script=<default>, projection P=<default>);
-pen Bookman(string series=<default>, string shape=<default>);
-void seekeof(file f);
-path unitcircle;
+pair max(picture pic, bool user=<default>);
+void restore();
+pen basealign(int n);
+int basealign(pen p=<default>);
+pen basealign;
+int min(int a, int b);
+int[] min(int a, int[] b);
+int[] min(int[] a, int b);
+int[] min(int[] a, int[] b);
+int min(int[] a);
+int min(int[][] a);
+int min(int[][][] a);
+real min(real a, real b);
+real[] min(real a, real[] b);
+real[] min(real[] a, real b);
+real[] min(real[] a, real[] b);
+real min(real[] a);
+real min(real[][] a);
+real min(real[][][] a);
+string min(string a, string b);
+string[] min(string a, string[] b);
+string[] min(string[] a, string b);
+string[] min(string[] a, string[] b);
+string min(string[] a);
+string min(string[][] a);
+string min(string[][][] a);
+pair min(pen p);
+pair min(frame f);
+pair min(explicit path p);
+pair min(path[] p);
+triple min(path3 p);
+real min(... real[] a);
+pair min(picture pic, bool user=<default>);
+real min(real m, scaling s, coord[] c);
+int min(... int[] a);
+void srand(int seed);
+bool operator >(int a, int b);
+bool[] operator >(int a, int[] b);
+bool[] operator >(int[] a, int b);
+bool[] operator >(int[] a, int[] b);
+bool operator >(real a, real b);
+bool[] operator >(real a, real[] b);
+bool[] operator >(real[] a, real b);
+bool[] operator >(real[] a, real[] b);
+bool operator >(string a, string b);
+bool[] operator >(string a, string[] b);
+bool[] operator >(string[] a, string b);
+bool[] operator >(string[] a, string[] b);
+bool operator >=(int a, int b);
+bool[] operator >=(int a, int[] b);
+bool[] operator >=(int[] a, int b);
+bool[] operator >=(int[] a, int[] b);
+bool operator >=(real a, real b);
+bool[] operator >=(real a, real[] b);
+bool[] operator >=(real[] a, real b);
+bool[] operator >=(real[] a, real[] b);
+bool operator >=(string a, string b);
+bool[] operator >=(string a, string[] b);
+bool[] operator >=(string[] a, string b);
+bool[] operator >=(string[] a, string[] b);
+bool operator >=(coord a, coord b);
+bool operator <=(int a, int b);
+bool[] operator <=(int a, int[] b);
+bool[] operator <=(int[] a, int b);
+bool[] operator <=(int[] a, int[] b);
+bool operator <=(real a, real b);
+bool[] operator <=(real a, real[] b);
+bool[] operator <=(real[] a, real b);
+bool[] operator <=(real[] a, real[] b);
+bool operator <=(string a, string b);
+bool[] operator <=(string a, string[] b);
+bool[] operator <=(string[] a, string b);
+bool[] operator <=(string[] a, string[] b);
+bool operator <=(coord a, coord b);
+bool operator <(int a, int b);
+bool[] operator <(int a, int[] b);
+bool[] operator <(int[] a, int b);
+bool[] operator <(int[] a, int[] b);
+bool operator <(real a, real b);
+bool[] operator <(real a, real[] b);
+bool[] operator <(real[] a, real b);
+bool[] operator <(real[] a, real[] b);
+bool operator <(string a, string b);
+bool[] operator <(string a, string[] b);
+bool[] operator <(string[] a, string b);
+bool[] operator <(string[] a, string[] b);
pair[] conj(pair[] a);
pair[][] conj(pair[][] a);
pair conj(pair z);
-pen deepgray;
-pen deepgreen;
-pen deepgrey;
-marker[] Mark;
-marker Mark(int n);
-real aTan(real x);
-void _begingroup3(frame f, string name, real compression, real granularity, bool closed, bool tessellate, bool dobreak, bool nobreak, triple center, int interaction);
-path[] MarkPath;
-string graphic(string name, string options=<default>);
-real aCos(real x);
-void texreset();
-string graphicscale(real x);
-int[] complement(int[] a, int n);
-path[] complement(frame f, path[] g);
-pen Cyan;
-marginT NoMargin(path, pen);
-marginT NoMargin(path, pen)();
-path[][] _texpath(string[] s, pen[] p);
-real sinh(real x);
-real[] sinh(real[] a);
-real[] _cputime();
-position EndPoint;
-hsv hsv(real h, real s, real v);
-hsv hsv(pen p);
-void deconstruct(frame f, frame preamble=<default>, transform t=<default>);
-void deconstruct(picture pic=<default>);
-int sgn(real x);
-node node(void d(frame f, transform t, transform T, pair lb, pair rt), string key=<default>);
-pair minAfterTransform(transform t, path[] p);
-void fillbox(frame dest, path g, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-int seconds(string t=<default>, string format=<default>);
-pen cyan;
-pen grey;
-real cm;
-filltype Fill;
-filltype Fill(real xmargin=<default>, real ymargin=<default>, pen p=<default>);
-pen olive;
-pen darkolive;
-int ascii(string s);
-real arcarrowangle;
-real arcarrowfactor;
-real mm;
-real arcarrowsize(pen p=<default>);
-real calculateScaling(string dir, coord[] coords, real size, bool warn=<default>);
-real calculateScaling(string dir, coord[] m, coord[] M, real size, bool warn=<default>);
-triple gettriple(string name=<default>, triple default=<default>, string prompt=<default>, bool store=<default>);
-void drawpixel(frame f, triple v, pen p, real width=<default>);
-pen fontsize(real size, real lineskip);
-real fontsize(pen p=<default>);
-pen fontsize(real size);
-void close(file f);
-real lineskip(pen p=<default>);
-pen dashed;
-pair maxAfterTransform(transform t, path[] p);
-int[][] triangulate(pair[] z);
-void fill(frame f, path[] g, pen p=<default>, bool copy=<default>);
-path fill(frame dest, frame src, filltype filltype=<default>, real xmargin=<default>, real ymargin=<default>);
-void fill(picture pic=<default>, path[] g, pen p=<default>, bool copy=<default>);
-void fill(pair origin, picture pic=<default>, path[] g, pen p=<default>);
-pair midpoint(path p);
-real exp(real x);
-real[] exp(real[] a);
-pair exp(explicit pair z);
-pen linejoin(int n);
-int linejoin(pen p=<default>);
-real ldexp(real x, int e);
-pen rgba(real[] a);
-real[] rgba(pen p);
-string time(string format=<default>);
-string time(int seconds, string format=<default>);
-void prepend(frame dest, frame src);
-real pt;
-settings settings;
-int MoveQuiet;
-marginT EndMargin(path, pen);
-pen nullpen;
side LeftSide;
path nullpath;
guide[] copy(guide[] a, int depth=<default>);
real[] copy(real[] a, int depth=<default>);
triple[] copy(triple[] a, int depth=<default>);
+Legend[] copy(Legend[] a, int depth=<default>);
+picture[] copy(picture[] a, int depth=<default>);
bool[] copy(bool[] a, int depth=<default>);
real[][] copy(real[][] a, int depth=<default>);
pen[] copy(pen[] a, int depth=<default>);
-coord[] copy(coord[] a, int depth=<default>);
-object[] copy(object[] a, int depth=<default>);
-marker[] copy(marker[] a, int depth=<default>);
-Legend[] copy(Legend[] a, int depth=<default>);
pen[][] copy(pen[][] a, int depth=<default>);
path[] copy(path[] a, int depth=<default>);
string[] copy(string[] a, int depth=<default>);
void()()[] copy(void()()[] a, int depth=<default>);
int[] copy(int[] a, int depth=<default>);
string[][] copy(string[][] a, int depth=<default>);
+coord[] copy(coord[] a, int depth=<default>);
+object[] copy(object[] a, int depth=<default>);
frame[] copy(frame[] a, int depth=<default>);
-pair[] copy(pair[] a, int depth=<default>);
bool3[] copy(bool3[] a, int depth=<default>);
+pair[] copy(pair[] a, int depth=<default>);
+marker[] copy(marker[] a, int depth=<default>);
Label[] copy(Label[] a, int depth=<default>);
-picture[] copy(picture[] a, int depth=<default>);
pair[][] copy(pair[][] a, int depth=<default>);
real[] abs(pair[] a);
real[] abs(triple[] a);
@@ -547,305 +1461,135 @@ real[] abs(real[] a);
real abs(pair z);
real abs(triple v);
int abs(int x);
-pen pink;
-real inches;
-path ellipse(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-path ellipse(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-path ellipse(pair c, real a, real b);
-pair getpair(string name=<default>, pair default=<default>, string prompt=<default>, bool store=<default>);
-void axialshade(frame f, path[] g, bool stroke=<default>, pen pena, pair a, bool extenda=<default>, pen penb, pair b, bool extendb=<default>, bool copy=<default>);
-void axialshade(picture pic=<default>, path[] g, bool stroke=<default>, pen pena, pair a, bool extenda=<default>, pen penb, pair b, bool extendb=<default>, bool copy=<default>);
-string locale(string s=<default>);
-real dirtime(path p, pair z);
-void copyPairOrTriple(pairOrTriple dest, pairOrTriple src);
-real[] colors(pen p);
-void filloutside(picture pic=<default>, path[] g, pen p=<default>, bool copy=<default>);
-void filloutside(frame f, path[] g, pen p=<default>, bool copy=<default>);
-pen[] colorPen;
-real _findroot(real f(real), real a, real b, real tolerance, real fa, real fb);
-pen colorless(pen p);
-pen solid;
-string colorspace(pen p);
-void warn(string s);
-pen deepblue;
-pen palered;
-real[] map(real f(pair), pair[] a);
-int[] map(int f(real), real[] a);
-bool3[] map(bool3 f(bool3), bool3[] a);
-Label[] map(Label f(Label), Label[] a);
-frame[] map(frame f(frame), frame[] a);
-coord[] map(coord f(coord), coord[] a);
-object[] map(object f(object), object[] a);
-pen[][] map(pen[] f(pen[]), pen[][] a);
-triple[] map(triple f(triple), triple[] a);
-pen[] map(pen f(pen), pen[] a);
-picture[] map(picture f(picture), picture[] a);
-pair[] map(pair f(pair), pair[] a);
-marker[] map(marker f(marker), marker[] a);
-string[] map(string f(string), string[] a);
-void()()[] map(void f()()(void()()), void()()[] a);
-pair[][] map(pair[] f(pair[]), pair[][] a);
-real[] map(real f(real), real[] a);
-int[] map(int f(int), int[] a);
-string[][] map(string[] f(string[]), string[][] a);
-bool[] map(bool f(bool), bool[] a);
-path[] map(path f(path), path[] a);
-real[][] map(real[] f(real[]), real[][] a);
-Legend[] map(Legend f(Legend), Legend[] a);
-guide[] map(guide f(guide), guide[] a);
-path unstraighten(path p);
-path3 unstraighten(path3 p);
-void _image(frame f, real[][] data, pair initial, pair final, pen[] palette=<default>, transform t=<default>, bool copy=<default>, bool antialias=<default>);
-void _image(frame f, pen[][] data, pair initial, pair final, transform t=<default>, bool copy=<default>, bool antialias=<default>);
-void _image(frame f, pen f(int, int), int width, int height, pair initial, pair final, transform t=<default>, bool antialias=<default>);
-pair arcpoint(path p, real L);
-pen Pen(int n);
-int rfind(string s, string t, int pos=<default>);
-pair minratio(frame f);
-pair minratio(triple[][] p, pair b);
-pair minratio(path3 g);
-int[] sequence(int n);
-pen[][] sequence(pen[] f(int), int n);
-coord[] sequence(coord f(int), int n);
-object[] sequence(object f(int), int n);
-marker[] sequence(marker f(int), int n);
-Legend[] sequence(Legend f(int), int n);
-int[] sequence(int f(int), int n);
-string[][] sequence(string[] f(int), int n);
-pair[] sequence(pair f(int), int n);
-int[] sequence(int n, int m, int skip);
-guide[] sequence(guide f(int), int n);
-pen[] sequence(pen f(int), int n);
-void()()[] sequence(void f()()(int), int n);
-bool[] sequence(bool f(int), int n);
-string[] sequence(string f(int), int n);
-pair[][] sequence(pair[] f(int), int n);
-bool3[] sequence(bool3 f(int), int n);
-Label[] sequence(Label f(int), int n);
-picture[] sequence(picture f(int), int n);
-real[][] sequence(real[] f(int), int n);
-real[] sequence(real f(int), int n);
-int[] sequence(int n, int m);
-triple[] sequence(triple f(int), int n);
-path[] sequence(path f(int), int n);
-frame[] sequence(frame f(int), int n);
-triple minbezier(triple[][] p, triple b);
-path trim(path g, real begin, real end=<default>);
-marginT DotMargin(path, pen)(real begin, real end=<default>);
-marginT DotMargin(path, pen);
-marginT DotMargins(path, pen);
-string string(int x);
-string string(real x, int digits=<default>);
-string cd(string s=<default>);
-int size(guide g);
-pair size(frame f);
-int size(path p);
-int size(path[] p);
-int size(path3 p);
-void size(picture dest, picture src);
-pair size(picture pic, bool user=<default>);
-void size(picture pic=<default>, transform t);
-void size(picture pic=<default>, real x, real y=<default>, bool keepAspect=<default>);
-void size(picture pic=<default>, real xsize, real ysize, pair min, pair max);
-void clear(file f);
-void clear(string file, int line);
-void clear();
-void clear(string file, string text);
-pen mediumred;
-pen mediumblue;
-pen mediumgreen;
-pen mediumcyan;
-pen mediummagenta;
-pair arcdir(path p, real L);
-pen mediumyellow;
-pen mediumgray;
-string downcase(string s);
-pen mediumgrey;
-transform transform(pen p);
-string readline(string prompt=<default>, string name=<default>, bool tabcompletion=<default>);
-void beep();
-pair relpoint(path p, real l);
-pair[][] transpose(pair[][] a);
-pen[][] transpose(pen[][] a);
-string[][] transpose(string[][] a);
-real[][] transpose(real[][] a);
-pen overwrite(int n);
-int overwrite(pen p=<default>);
-pen linewidth(real x);
-real linewidth(pen p=<default>);
-transformation transformation(real[][] modelview);
-transformation transformation(real[][] modelview, real[][] projection);
-pair maxratio(frame f);
-pair maxratio(triple[][] p, pair b);
-pair maxratio(path3 g);
-triple maxbezier(triple[][] p, triple b);
-void layer(frame f);
-void layer(picture pic=<default>);
-void DOSnewl(file file);
-pen cmyk(pen p);
-pen cmyk(real c, real m, real y, real k);
-pen blue;
-pen evenodd;
-int precision(file f=<default>, int digits=<default>);
-path3 path3(triple[] pre, triple[] point, triple[] post, bool[] straight, bool cyclic);
-bool piecewisestraight(path p);
-bool piecewisestraight(path3 p);
-void stop(string file, int line, code s=<default>);
-void stop(string file, string text, code s=<default>);
-void drawCylinder(frame f, real[][] t, pen[] p, real opacity, real shininess, real metallic, real fresnel0, bool core=<default>);
-pair reldir(path p, real l);
-pen TimesRoman(string series=<default>, string shape=<default>);
-slice cut(path p, path knife, int n);
-bool is3D(frame f);
-bool is3D(string format=<default>);
-void add(frame dest, frame src);
-void add(frame f, transform t=<default>, Label L);
-void add(picture pic=<default>, void d(frame f, transform t), bool exact=<default>);
-void add(frame dest, frame src, filltype filltype, bool above=<default>);
-void add(frame dest, frame src, bool group, filltype filltype=<default>, bool above=<default>);
-void add(picture pic=<default>, void d(picture, real[][]), bool exact=<default>);
-void add(frame dest, frame src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture dest=<default>, frame src, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture dest=<default>, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(frame dest, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture src, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture pic=<default>, void d(frame f, real[][] t, picture pic, projection P), bool exact=<default>);
-void add(picture pic=<default>, void d(picture, transform), bool exact=<default>);
-void add(picture dest, picture src, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture dest, picture src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture dest=<default>, object F, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture pic=<default>, Label L);
-plain plain;
-void purge(int divisor=<default>);
-int Round(real x);
-real sqrt(real x);
-real[] sqrt(real[] a);
-pair sqrt(explicit pair z);
-string[] spinner;
-real[] times(path p, real x, real fuzz=<default>);
-real[] times(path p, explicit pair z, real fuzz=<default>);
-void drawbeziertriangle(frame f, triple[][] p, triple center, bool straight, pen[] p, real opacity, real shininess, real metallic, real fresnel0, pen[] colors, int interaction, int digits, bool primitive=<default>);
-void Draw(picture pic=<default>, path g, pen p=<default>);
-filltype Draw;
-void Draw(picture pic=<default>, explicit path[] g, pen p=<default>);
-filltype Draw(real xmargin=<default>, real ymargin=<default>, pen p=<default>);
-void tab(file file);
-plain_bounds plain_bounds;
-string file(string s);
-string outprefix(string prefix=<default>);
-object object(frame f);
-object object(Label L);
-object object(Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-file stdin;
-void()()[] array(int n, void value()(), int depth=<default>);
-bool[] array(int n, bool value, int depth=<default>);
-string[] array(int n, string value, int depth=<default>);
-pair[][] array(int n, pair[] value, int depth=<default>);
-bool3[] array(int n, bool3 value, int depth=<default>);
-Label[] array(int n, Label value, int depth=<default>);
-picture[] array(int n, picture value, int depth=<default>);
-real[][] array(int n, real[] value, int depth=<default>);
-real[] array(int n, real value, int depth=<default>);
-triple[] array(int n, triple value, int depth=<default>);
-path[] array(int n, path value, int depth=<default>);
-frame[] array(int n, frame value, int depth=<default>);
-pen[][] array(int n, pen[] value, int depth=<default>);
-coord[] array(int n, coord value, int depth=<default>);
-object[] array(int n, object value, int depth=<default>);
-marker[] array(int n, marker value, int depth=<default>);
-Legend[] array(int n, Legend value, int depth=<default>);
-int[] array(int n, int value, int depth=<default>);
-string[][] array(int n, string[] value, int depth=<default>);
-pair[] array(int n, pair value, int depth=<default>);
-guide[] array(int n, guide value, int depth=<default>);
-pen[] array(int n, pen value, int depth=<default>);
-string[] array(string s);
-bool BeginBar(picture, path, pen, marginT(path, pen));
-bool BeginBar(picture, path, pen, marginT(path, pen))(real size=<default>);
-triple perp(triple v, triple u);
-int find(bool[] a, int n=<default>);
-int find(string s, string t, int pos=<default>);
-position BeginPoint;
-marginT BeginMargin(path, pen);
-path buildcycle(... path[] p);
-bool BeginArrow(picture, path, pen, marginT(path, pen));
-bool BeginArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-marginT BeginPenMargin(path, pen);
-int round(real x);
-marginT BeginDotMargin(path, pen);
-bool BeginArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool BeginArcArrow(picture, path, pen, marginT(path, pen));
-pen roundcap;
-void buildRestoreThunk()();
-pen roundjoin;
-int sourceline(string file, string text);
-void buildRestoreDefaults()();
-path roundbox(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-path roundbox(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-real asin(real x);
-real[] asin(real[] a);
-pair endpoint(path p);
+void radialshade(frame f, path[] g, bool stroke=<default>, pen pena, pair a, real ra, bool extenda=<default>, pen penb, pair b, real rb, bool extendb=<default>, bool copy=<default>);
+void radialshade(picture pic=<default>, path[] g, bool stroke=<default>, pen pena, pair a, real ra, bool extenda=<default>, pen penb, pair b, real rb, bool extendb=<default>, bool copy=<default>);
+pair maxbound(pair a, pair b);
+triple maxbound(triple a, triple b);
+pair maxbound(pair[] a);
+pair maxbound(pair[][] a);
+pair maxbound(pair[][][] a);
+triple maxbound(triple[] a);
+triple maxbound(triple[][] a);
+triple maxbound(triple[][][] a);
+pair minbound(pair a, pair b);
+triple minbound(triple a, triple b);
+pair minbound(pair[] a);
+pair minbound(pair[][] a);
+pair minbound(pair[][][] a);
+triple minbound(triple[] a);
+triple minbound(triple[][] a);
+triple minbound(triple[][][] a);
+real operator /(real a, real b);
+real[] operator /(real a, real[] b);
+real[] operator /(real[] a, real b);
+real[] operator /(real[] a, real[] b);
+real[][] operator /(real[][] a, real b);
+pair operator /(pair a, pair b);
+pair[] operator /(pair a, pair[] b);
+pair[] operator /(pair[] a, pair b);
+pair[] operator /(pair[] a, pair[] b);
+pair[][] operator /(pair[][] a, pair b);
+triple[] operator /(triple[] a, real b);
+real operator /(int a, int b);
+real[] operator /(int[] a, int b);
+real[] operator /(int a, int[] b);
+real[] operator /(int[] a, int[] b);
+triple operator /(triple v, real x);
+real interp(real a, real b, real t);
+pair interp(explicit pair a, explicit pair b, real t);
+triple interp(triple a, triple b, real t);
+pen interp(pen a, pen b, real t);
+bool primitive();
+int operator *(int a, int b);
+int[] operator *(int a, int[] b);
+int[] operator *(int[] a, int b);
+int[] operator *(int[] a, int[] b);
+int[][] operator *(int a, int[][] b);
+int[][] operator *(int[][] a, int b);
+real operator *(real a, real b);
+real[] operator *(real a, real[] b);
+real[] operator *(real[] a, real b);
+real[] operator *(real[] a, real[] b);
+real[][] operator *(real a, real[][] b);
+real[][] operator *(real[][] a, real b);
+pair operator *(pair a, pair b);
+pair[] operator *(pair a, pair[] b);
+pair[] operator *(pair[] a, pair b);
+pair[] operator *(pair[] a, pair[] b);
+pair[][] operator *(pair a, pair[][] b);
+pair[][] operator *(pair[][] a, pair b);
+triple[] operator *(real a, triple[] b);
+triple[][] operator *(real a, triple[][] b);
+triple[] operator *(triple[] a, real b);
+triple[][] operator *(triple[][] a, real b);
+pen operator *(real a, pen b);
+pen operator *(pen a, real b);
+transform operator *(transform a, transform b);
+pair operator *(transform t, pair z);
+path operator *(transform t, path g);
+pen operator *(transform t, pen p);
+frame operator *(transform t, frame f);
+frame operator *(real[][] t, frame f);
+real[] operator *(real[][] a, real[] b);
+real[] operator *(real[] a, real[][] b);
+int[][] operator *(int[][] a, int[][] b);
+real[][] operator *(real[][] a, real[][] b);
+pair[][] operator *(pair[][] a, pair[][] b);
+triple operator *(real[][] t, triple v);
+triple operator *(real x, triple v);
+triple operator *(triple v, real x);
+path3 operator *(real[][] t, path3 g);
+side operator *(real x, side s);
+Label operator *(transform t, Label L);
+picture operator *(real[][] t, picture orig);
+object operator *(transform t, explicit object F);
+path[] operator *(transform t, explicit path[] p);
+pair[] operator *(transform t, pair[] z);
+picture operator *(transform t, picture orig);
+Label operator *(real[][] t, Label L);
+bounds operator *(transform t, bounds b);
real latitude(triple v, bool warn=<default>);
int sum(int[] a);
real sum(real[] a);
pair sum(pair[] a);
triple sum(triple[] a);
int sum(bool[] a);
-void xmap(string key, transform t=<default>);
-real inf;
-real arctime(path p, real l);
-real arctime(path3 p, real dval);
-pen palemagenta;
-void draw(frame f, triple[][] p, triple center, bool straight, pen[] p, real opacity, real shininess, real metallic, real fresnel0, pen[] colors, int interaction, int digits, bool primitive=<default>);
-void draw(frame f, triple[] p, real[] knot, real[] weights=<default>, pen p);
-void draw(frame f, triple[][] p, real[] uknot, real[] vknot, real[][] weights=<default>, pen[] p, real opacity, real shininess, real metallic, real fresnel0, pen[] colors);
-void draw(frame f, triple[] v, int[][] vi, triple center=<default>, triple[] n, int[][] ni, pen[] p, real opacity, real shininess, real metallic, real fresnel0, pen[] c=<default>, int[][] ci=<default>, int interaction);
-void draw(picture pic=<default>, path[] g, pen fillrule=<default>, pen[] p);
-object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-void draw(frame f, explicit path[] g, pen p=<default>);
-void draw(frame f, path g, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen)));
-void draw(picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
-void draw(pair origin, picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
-void draw(picture pic=<default>, guide[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
-void draw(pair origin, picture pic=<default>, guide[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
-object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), pair position, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-void draw(picture pic=<default>, explicit path[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
-void draw(pair origin, picture pic=<default>, explicit path[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
-void draw(frame f, guide[] g, pen p=<default>);
-void draw(frame f, path g, pen p=<default>);
-int mantissaBits;
-real identity(real x);
-real[] identity(real[] a);
-transform identity();
-real[][] identity(int n);
-transform identity;
-real[][] identity4;
-marker[] MarkFill;
-pen pattern(string s);
-string pattern(pen p);
-transform invert;
-transform inverse(transform t);
-real[][] inverse(real[][] a);
-int[] MarkFillable;
-pair unit(pair z);
-triple unit(triple v);
-triple min3(frame f);
-triple min3(pen p);
-void begin(picture pic=<default>, string name, string id=<default>, bool visible=<default>);
-int CLZ(int a);
-arrowhead DefaultHead;
-void beginclip(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
-void beginclip(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
-void begingroup(frame f);
-void begingroup(picture pic=<default>);
-marker nomarker;
-pair beginpoint(path p);
-real azimuth(triple v, bool warn=<default>);
-real angle(pair z, bool warn=<default>);
-real angle(transform t);
-pair ENE;
-frame pack(pair align=<default> ... object[] inset);
+bool initialized(int a);
+bool initialized(real a);
+bool initialized(pair a);
+bool initialized(triple a);
+int operator -(int a, int b);
+int[] operator -(int a, int[] b);
+int[] operator -(int[] a, int b);
+int[] operator -(int[] a, int[] b);
+int[][] operator -(int[][] a, int[][] b);
+int operator -(int a);
+int[] operator -(int[] a);
+int[][] operator -(int[][] a);
+real operator -(real a, real b);
+real[] operator -(real a, real[] b);
+real[] operator -(real[] a, real b);
+real[] operator -(real[] a, real[] b);
+real[][] operator -(real[][] a, real[][] b);
+real operator -(real a);
+real[] operator -(real[] a);
+real[][] operator -(real[][] a);
+pair operator -(pair a, pair b);
+pair[] operator -(pair a, pair[] b);
+pair[] operator -(pair[] a, pair b);
+pair[] operator -(pair[] a, pair[] b);
+pair[][] operator -(pair[][] a, pair[][] b);
+pair operator -(pair a);
+pair[] operator -(pair[] a);
+pair[][] operator -(pair[][] a);
+triple operator -(triple a, triple b);
+triple[] operator -(triple a, triple[] b);
+triple[] operator -(triple[] a, triple b);
+triple[] operator -(triple[] a, triple[] b);
+triple[][] operator -(triple[][] a, triple[][] b);
+triple operator -(triple a);
+triple[] operator -(triple[] a);
+triple[][] operator -(triple[][] a);
void gsave(frame f);
void write(file file=<default>, string s=<default>, bool x, void suffix(file)=<default> ... bool[]);
void write(file file=<default>, string s=<default>, explicit bool[] a ... bool[][]);
@@ -881,368 +1625,184 @@ void write(string s=<default>, explicit path[] x, void suffix(file)=<default>);
void write(file file, void suffix(file)=<default>);
void write(file file=<default>, string s=<default>, pen[] p);
void write(void suffix(file)=<default>);
+void write(string s=<default>, bool3 b, void suffix(file)=<default>);
void write(file file, string s=<default>, explicit path[] x, void suffix(file)=<default>);
+void write(file file, string s=<default>, bool3 b, void suffix(file)=<default>);
void write(file file=<default>, align align, void suffix(file)=<default>);
void write(file file, string s=<default>, cputime c, string format=<default>, void suffix(file)=<default>);
void write(pairOrTriple a);
-void write(string s=<default>, bool3 b, void suffix(file)=<default>);
-void write(file file, string s=<default>, bool3 b, void suffix(file)=<default>);
void write(string s=<default>, explicit guide[] x, void suffix(file)=<default>);
void write(file file=<default>, Label L, void suffix(file)=<default>);
-void save()();
-marginT EndPenMargin(path, pen);
-pair NNE;
-real[] tridiagonal(real[] a, real[] b, real[] c, real[] f);
-pen Dotted;
-pen Dotted(pen p=<default>);
-pair dir(real degrees);
-pair dir(explicit pair z);
-triple dir(explicit triple z);
-triple dir(real colatitude, real longitude);
-pair dir(path p, int t, int sign=<default>, bool normalize=<default>);
-pair dir(path p, real t, bool normalize=<default>);
-triple dir(path3 p, int t, int sign=<default>, bool normalize=<default>);
-triple dir(path3 p, real t, bool normalize=<default>);
-pair dir(path p);
-pair dir(path p, path q);
-int[][] diagonal(... int[]);
-real[][] diagonal(... real[]);
-pair[][] diagonal(... pair[]);
-real reltime(path p, real l);
-void marknodes(picture pic=<default>, frame f, path g);
-real newton(int iterations=<default>, real f(real), real fprime(real), real x, bool verbose=<default>);
-real newton(int iterations=<default>, real f(real), real fprime(real), real x1, real x2, bool verbose=<default>);
-string TeXify(string s);
-bool3 default;
-pair[] controlSpecifier(guide g, int t);
-void defaultpen(pen p);
-pen defaultpen();
-pen defaultpen;
-void defaultpen(real w);
-transform Slant(transform t);
-triple max3(frame f);
-triple max3(pen p);
-string defaultformat(int n, string trailingzero=<default>, bool fixed=<default>, bool signed=<default>);
-string defaultformat;
-pen dashdotted;
-string defaultseparator;
-string asydir();
-string defaultfilename;
-real longitude(triple v, bool warn=<default>);
-bool Blank(picture, path, pen, marginT(path, pen));
-tensionSpecifier tensionSpecifier(guide g, int t);
-marker marker(frame f=<default>, void markroutine(picture pic=<default>, frame f, path g)=<default>, bool above=<default>);
-marker marker(path[] g, void markroutine(picture pic=<default>, frame f, path g)=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-int Move;
-string location();
-string locatefile(string file, bool full=<default>);
-pen dotted;
-string blend(pen p);
-arrowhead HookHead;
-arrowhead HookHead(real dir=<default>, real barb=<default>);
-real[] concat(... real[][]);
-pair[] concat(... pair[][]);
-marker[] concat(... marker[][]);
-pen[] concat(... pen[][]);
-picture[] concat(... picture[][]);
-path[] concat(... path[][]);
-coord[] concat(... coord[][]);
-object[] concat(... object[][]);
-int[] concat(... int[][]);
-void()()[] concat(... void()()[][]);
-bool3[] concat(... bool3[][]);
-Label[] concat(... Label[][]);
-string[] concat(... string[][]);
-Legend[] concat(... Legend[][]);
-triple[] concat(... triple[][]);
-frame[] concat(... frame[][]);
-guide[] concat(... guide[][]);
-bool[] concat(... bool[][]);
-int OR(int a, int b);
-real log1p(real x);
-real[] log1p(real[] a);
-real infinity;
-bool alias(pair[][] a, pair[][] b);
-bool alias(guide[] a, guide[] b);
-bool alias(filltype a, filltype b);
-bool alias(coord[] a, coord[] b);
-bool alias(Legend a, Legend b);
-bool alias(position a, position b);
-bool alias(object[] a, object[] b);
-bool alias(schur a, schur b);
-bool alias(pair[] a, pair[] b);
-bool alias(scaling a, scaling b);
-bool alias(light a, light b);
-bool alias(picture a, picture b);
-bool alias(int[] a, int[] b);
-bool alias(string[][] a, string[][] b);
-bool alias(slice a, slice b);
-bool alias(autoscaleT a, autoscaleT b);
-bool alias(align a, align b);
-bool alias(marker[] a, marker[] b);
-bool alias(cputime a, cputime b);
-bool alias(real[][] a, real[][] b);
-bool alias(bool3 a, bool3 b);
-bool alias(bool3[] a, bool3[] b);
-bool alias(freezableBounds a, freezableBounds b);
-bool alias(transformation a, transformation b);
-bool alias(node a, node b);
-bool alias(Label a, Label b);
-bool alias(Label[] a, Label[] b);
-bool alias(processtime a, processtime b);
-bool alias(string[] a, string[] b);
-bool alias(frame[] a, frame[] b);
-bool alias(coords2 a, coords2 b);
-bool alias(coords3 a, coords3 b);
-bool alias(marker a, marker b);
-bool alias(bool[] a, bool[] b);
-bool alias(void()()[] a, void()()[] b);
-bool alias(pen[][] a, pen[][] b);
-bool alias(marginT a, marginT b);
-bool alias(ScaleT a, ScaleT b);
-bool alias(side a, side b);
-bool alias(picture[] a, picture[] b);
-bool alias(realschur a, realschur b);
-bool alias(path[] a, path[] b);
-bool alias(triple[] a, triple[] b);
-bool alias(coord a, coord b);
-bool alias(projection a, projection b);
-bool alias(pairOrTriple a, pairOrTriple b);
-bool alias(object a, object b);
-bool alias(Legend[] a, Legend[] b);
-bool alias(real[] a, real[] b);
-bool alias(pen[] a, pen[] b);
-bool alias(hsv a, hsv b);
-bool alias(bounds a, bounds b);
-bool alias(scaleT a, scaleT b);
-bool alias(arrowhead a, arrowhead b);
-real pi;
-int getint(string name=<default>, int default=<default>, string prompt=<default>, bool store=<default>);
-int bitreverse(int a, int bits);
-bool IgnoreAspect;
-void postscript(frame f, string s);
-void postscript(frame f, string s, pair min, pair max);
-void postscript(picture pic=<default>, string s);
-void postscript(picture pic=<default>, string s, pair min, pair max);
-transform slant(real s);
-void breakpoint(code s=<default>);
-void breakpoints();
-void endgroup(frame f);
-void endgroup(picture pic=<default>);
-void endgroup3(frame f);
-int Floor(real x);
-pair gamma(explicit pair z);
-real gamma(real x);
-real pow10(real x);
-real[] pow10(real[] a);
-real[][] AtA(real[][] a);
-real byteinv(int x);
-real bp;
-int[] sort(int[] a);
-int[][] sort(int[][] a);
-real[] sort(real[] a);
-real[][] sort(real[][] a);
-string[] sort(string[] a);
-string[][] sort(string[][] a);
-coord[] sort(coord[] a, bool less(coord, coord), bool stable=<default>);
-object[] sort(object[] a, bool less(object, object), bool stable=<default>);
-marker[] sort(marker[] a, bool less(marker, marker), bool stable=<default>);
-Legend[] sort(Legend[] a, bool less(Legend, Legend), bool stable=<default>);
-path[] sort(path[] a, bool less(path, path), bool stable=<default>);
-pen[][] sort(pen[][] a, bool less(pen[], pen[]), bool stable=<default>);
-pair[][] sort(pair[][] a, bool less(pair[], pair[]), bool stable=<default>);
-pen[] sort(pen[] a, bool less(pen, pen), bool stable=<default>);
-bool[] sort(bool[] a, bool less(bool, bool), bool stable=<default>);
-void()()[] sort(void()()[] a, bool less(void()(), void()()), bool stable=<default>);
-frame[] sort(frame[] a, bool less(frame, frame), bool stable=<default>);
-bool3[] sort(bool3[] a, bool less(bool3, bool3), bool stable=<default>);
-Label[] sort(Label[] a, bool less(Label, Label), bool stable=<default>);
-picture[] sort(picture[] a, bool less(picture, picture), bool stable=<default>);
-int[] sort(int[] a, bool less(int, int), bool stable=<default>);
-string[][] sort(string[][] a, bool less(string[], string[]), bool stable=<default>);
-real[] sort(real[] a, bool less(real, real), bool stable=<default>);
-string[] sort(string[] a, bool less(string, string), bool stable=<default>);
-pair[] sort(pair[] a, bool less(pair, pair), bool stable=<default>);
-real[][] sort(real[][] a, bool less(real[], real[]), bool stable=<default>);
-triple[] sort(triple[] a, bool less(triple, triple), bool stable=<default>);
-guide[] sort(guide[] a, bool less(guide, guide), bool stable=<default>);
-pen salmon;
-bool ignore;
-pen Pentype(int n);
-pen chartreuse;
-void latticeshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, transform t=<default>, bool copy=<default>);
-void latticeshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[][] p, bool copy=<default>);
-pair[] pairs(real[] x, real[] y);
-void eval(code s, bool embedded=<default>);
-void eval(string s, bool embedded=<default>);
-bool Arrow(picture, path, pen, marginT(path, pen));
-bool Arrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-void drawTube(frame f, triple[] g, real width, pen[] p, real opacity, real shininess, real metallic, real fresnel0, triple min, triple max, bool core=<default>);
-bool Arrows(picture, path, pen, marginT(path, pen));
-bool Arrows(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
-int tell(file f);
-pen Yellow;
-pair up;
-guide reverse(guide g);
-string reverse(string s);
-path reverse(path p);
-path3 reverse(path3 p);
-triple[] reverse(triple[] a);
-int[] reverse(int[] a);
-real[] reverse(real[] a);
-int[] reverse(int n);
-string[] reverse(string[] a);
-pair[] reverse(pair[] a);
-bool[] reverse(bool[] a);
-void _labelpath(frame f, string s, string size, path g, string justify, pair offset, pen p);
-int floor(real x);
-void resetdefaultpen();
-real aSin(real x);
-pen darkred;
-transform Scale(transform t);
-pen mean(pen[] p, real opacity(real[])=<default>);
-pen[] mean(pen[][] palette, real opacity(real[])=<default>);
-string mktemp(string s);
-void sleep(int seconds);
-void drawstrokepath(picture pic=<default>, path g, pen strokepen, pen p=<default>);
-void unitsize(picture pic=<default>, real x, real y=<default>, real z=<default>);
-void arrow(picture pic=<default>, Label L=<default>, pair b, pair dir, real length=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
-picture arrow(arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, bool forwards=<default>, marginT margin(path, pen)=<default>, bool center=<default>);
-picture arrow2(arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>);
-path unitsquare;
-real arrowdir;
-real arrowbarb;
-pen yellow;
-int delete(string s);
-pen miterjoin;
-arrowhead SimpleHead;
-real arrowangle;
-real arrowlength;
-pen miterlimit(real x);
-real miterlimit(pen p=<default>);
-real arrowfactor;
-real arrowsize(pen p=<default>);
-real Tan(real deg);
-real arrowsizelimit;
-real arrow2sizelimit;
-real arrowhookfactor;
-real arrowtexfactor;
-void comma(file file);
-void deletepreamble();
-real[] arrowbasepoints(path base, path left, path right, real default=<default>);
-path arrowbase(path r, pair y, real t, real size);
-int choose(int n, int k);
-real hypot(real x, real y);
-path[] _strokepath(path g, pen p=<default>);
-void pause(string w=<default>);
-int ocgindex;
-pen springgreen;
-pen brown;
-bool scale(pen p);
-transform scale(real x);
-transform scale(real x, real y);
-real[][] scale(real x, real y, real z);
-scaleT scaleT(real T(real x), real Tinv(real x), bool logarithmic=<default>, bool automin=<default>, bool automax=<default>);
-string baseline(string s, string template=<default>);
-int[] findall(bool[] a);
-real[][] scale3(real s);
-int AND(int a, int b);
-real polar(triple v, bool warn=<default>);
-real radius(path p, real t);
-real radius(path3 p, real t);
-real radius(triple z0, triple c0, triple c1, triple z1, real t);
-transform scaleless(transform t);
-void makedraw(frame f, path g, pen p, int depth=<default>);
-real nan;
-pair down;
-path arc(pair c, real r, real angle1, real angle2);
-path arc(pair c, explicit pair z1, explicit pair z2, bool direction=<default>);
-path arc(pair c, real r, real angle1, real angle2, bool direction);
-real[] cubicroots(real a, real b, real c, real d);
-pen green;
-real tan(real x);
-real[] tan(real[] a);
-pen longdashed;
-pair point(guide g, int t);
-pair point(path p, int t);
-pair point(path p, real t);
-triple point(path3 p, int t);
-triple point(path3 p, real t);
-pair point(picture pic=<default>, pair dir, bool user=<default>);
-pair point(object F, pair dir, transform t=<default>);
-pair point(frame f, pair dir);
-void progress(bool3 init=<default>);
-pen longdashdotted;
-void usepackage(string s, string options=<default>);
-void drawarrow(frame f, arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, bool forwards=<default>, marginT margin(path, pen)=<default>, bool center=<default>);
-void drawarrow2(frame f, arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>);
-pen fillrule(int n);
-int fillrule(pen p);
-pair ESE;
-pair project(triple v, real[][] t);
-bool prc(string format=<default>);
-projection projection(triple camera, triple up=<default>, triple target=<default>, triple normal=<default>, real zoom=<default>, real angle=<default>, pair viewportshift=<default>, bool showtarget=<default>, bool autoadjust=<default>, bool center=<default>, transformation projector(triple camera, triple up, triple target));
-void endl(file file);
-path diamond;
-marginT TrueMargin(path, pen)(real begin, real end=<default>);
-real bezier(real a, real b, real c, real d, real t);
-pair bezier(pair a, pair b, pair c, pair d, real t);
-triple bezier(triple a, triple b, triple c, triple d, real t);
-pair SSE;
-pair bezierP(pair a, pair b, pair c, pair d, real t);
-triple bezierP(triple a, triple b, triple c, triple d, real t);
-pair bezierPP(pair a, pair b, pair c, pair d, real t);
-triple bezierPP(triple a, triple b, triple c, triple d, real t);
-real[] _projection();
-pair bezierPPP(pair a, pair b, pair c, pair d);
-triple bezierPPP(triple a, triple b, triple c, triple d);
-real Jn(int n, real x);
-int randMax;
-path nurb(pair z0, pair z1, pair z2, pair z3, real w0, real w1, real w2, real w3, int m);
-align NoAlign;
-bool EndBar(picture, path, pen, marginT(path, pen));
-bool EndBar(picture, path, pen, marginT(path, pen))(real size=<default>);
-Legend Legend(string label, pen plabel=<default>, pen p=<default>, frame mark=<default>, bool above=<default>);
-real Yn(int n, real x);
-int NOT(int a);
-pen[] monoPen;
-bool CW;
-bool all(bool[] a);
-real atanh(real x);
-real[] atanh(real[] a);
-frame UpsideDown(frame f);
-pair realmult(pair z, pair w);
-triple realmult(triple u, triple v);
-real acosh(real x);
-real[] acosh(real[] a);
-real realEpsilon;
-pair NW;
-real norm(real[] a);
-real norm(real[][] a);
-real norm(triple[][] a);
-int length(guide g);
-int length(string s);
-real length(pair z);
-real length(triple v);
-int length(path p);
-int length(path3 p);
-pair SW;
-void flush(file f);
-pen thin();
-pen palecyan;
-void warning(string s, string t, bool position=<default>);
-frame legend(picture pic=<default>, int perline=<default>, real xmargin=<default>, real ymargin=<default>, real linelength=<default>, real hskip=<default>, real vskip=<default>, real maxwidth=<default>, real maxheight=<default>, bool hstretch=<default>, bool vstretch=<default>, pen p=<default>);
-picture legend(Legend[] Legend, int perline=<default>, real linelength, real hskip, real vskip, real maxwidth=<default>, real maxheight=<default>, bool hstretch=<default>, bool vstretch=<default>);
-real Degrees(real radians);
-picture legenditem(Legend legenditem, real linelength);
-real legendhskip;
-real legendvskip;
-pen darkmagenta;
-real change2(triple[][] a);
-real legendmargin;
-bool None(picture, path, pen, marginT(path, pen));
-real dotfactor;
-real legendlinelength;
+bool operator !=(bool a, bool b);
+bool[] operator !=(bool a, bool[] b);
+bool[] operator !=(bool[] a, bool b);
+bool[] operator !=(bool[] a, bool[] b);
+bool operator !=(bool[][] a, bool[][] b);
+bool operator !=(int a, int b);
+bool[] operator !=(int a, int[] b);
+bool[] operator !=(int[] a, int b);
+bool[] operator !=(int[] a, int[] b);
+bool operator !=(int[][] a, int[][] b);
+bool operator !=(real a, real b);
+bool[] operator !=(real a, real[] b);
+bool[] operator !=(real[] a, real b);
+bool[] operator !=(real[] a, real[] b);
+bool operator !=(real[][] a, real[][] b);
+bool operator !=(pair a, pair b);
+bool[] operator !=(pair a, pair[] b);
+bool[] operator !=(pair[] a, pair b);
+bool[] operator !=(pair[] a, pair[] b);
+bool operator !=(pair[][] a, pair[][] b);
+bool operator !=(triple a, triple b);
+bool[] operator !=(triple a, triple[] b);
+bool[] operator !=(triple[] a, triple b);
+bool[] operator !=(triple[] a, triple[] b);
+bool operator !=(triple[][] a, triple[][] b);
+bool operator !=(string a, string b);
+bool[] operator !=(string a, string[] b);
+bool[] operator !=(string[] a, string b);
+bool[] operator !=(string[] a, string[] b);
+bool operator !=(string[][] a, string[][] b);
+bool[] operator !=(pen[] a, pen[] b);
+bool operator !=(pen a, pen b);
+bool operator !=(transform a, transform b);
+bool operator !=(file a, file b);
+bool operator !=(path a, path b);
+bool operator !=(path3 a, path3 b);
+bool operator !=(bool3 a, bool3 b);
+bool operator !=(marginT a, marginT b);
+bool operator !=(transformation a, transformation b);
+bool operator !=(projection a, projection b);
+bool operator !=(coords3 a, coords3 b);
+bool operator !=(align a, align b);
+bool operator !=(cputime a, cputime b);
+bool operator !=(bounds a, bounds b);
+bool operator !=(light a, light b);
+bool operator !=(autoscaleT a, autoscaleT b);
+bool operator !=(ScaleT a, ScaleT b);
+bool operator !=(side a, side b);
+bool operator !=(position a, position b);
+bool operator !=(realschur a, realschur b);
+bool operator !=(bool3 a, bool b);
+bool operator !=(slice a, slice b);
+bool operator !=(filltype a, filltype b);
+bool operator !=(Legend a, Legend b);
+bool operator !=(picture a, picture b);
+bool operator !=(schur a, schur b);
+bool operator !=(bool a, bool3 b);
+bool operator !=(scaling a, scaling b);
+bool operator !=(pairOrTriple a, pairOrTriple b);
+bool operator !=(arrowhead a, arrowhead b);
+bool operator !=(hsv a, hsv b);
+bool operator !=(coord a, coord b);
+bool operator !=(scaleT a, scaleT b);
+bool operator !=(object a, object b);
+bool operator !=(processtime a, processtime b);
+bool operator !=(coords2 a, coords2 b);
+bool operator !=(node a, node b);
+bool operator !=(Label a, Label b);
+bool operator !=(marker a, marker b);
+bool operator ==(bool a, bool b);
+bool[] operator ==(bool a, bool[] b);
+bool[] operator ==(bool[] a, bool b);
+bool[] operator ==(bool[] a, bool[] b);
+bool operator ==(bool[][] a, bool[][] b);
+bool operator ==(int a, int b);
+bool[] operator ==(int a, int[] b);
+bool[] operator ==(int[] a, int b);
+bool[] operator ==(int[] a, int[] b);
+bool operator ==(int[][] a, int[][] b);
+bool operator ==(real a, real b);
+bool[] operator ==(real a, real[] b);
+bool[] operator ==(real[] a, real b);
+bool[] operator ==(real[] a, real[] b);
+bool operator ==(real[][] a, real[][] b);
+bool operator ==(pair a, pair b);
+bool[] operator ==(pair a, pair[] b);
+bool[] operator ==(pair[] a, pair b);
+bool[] operator ==(pair[] a, pair[] b);
+bool operator ==(pair[][] a, pair[][] b);
+bool operator ==(triple a, triple b);
+bool[] operator ==(triple a, triple[] b);
+bool[] operator ==(triple[] a, triple b);
+bool[] operator ==(triple[] a, triple[] b);
+bool operator ==(triple[][] a, triple[][] b);
+bool operator ==(string a, string b);
+bool[] operator ==(string a, string[] b);
+bool[] operator ==(string[] a, string b);
+bool[] operator ==(string[] a, string[] b);
+bool operator ==(string[][] a, string[][] b);
+bool[] operator ==(pen[] a, pen[] b);
+bool operator ==(pen a, pen b);
+bool operator ==(transform a, transform b);
+bool operator ==(file a, file b);
+bool operator ==(path a, path b);
+bool operator ==(path3 a, path3 b);
+bool operator ==(bounds a, bounds b);
+bool operator ==(light a, light b);
+bool operator ==(autoscaleT a, autoscaleT b);
+bool operator ==(ScaleT a, ScaleT b);
+bool operator ==(side a, side b);
+bool operator ==(position a, position b);
+bool operator ==(realschur a, realschur b);
+bool operator ==(bool3 a, bool b);
+bool operator ==(slice a, slice b);
+bool operator ==(filltype a, filltype b);
+bool operator ==(Legend a, Legend b);
+bool operator ==(picture a, picture b);
+bool operator ==(schur a, schur b);
+bool operator ==(bool a, bool3 b);
+bool operator ==(scaling a, scaling b);
+bool operator ==(pairOrTriple a, pairOrTriple b);
+bool operator ==(arrowhead a, arrowhead b);
+bool operator ==(hsv a, hsv b);
+bool operator ==(coord a, coord b);
+bool operator ==(scaleT a, scaleT b);
+bool operator ==(object a, object b);
+bool operator ==(processtime a, processtime b);
+bool operator ==(coords2 a, coords2 b);
+bool operator ==(node a, node b);
+bool operator ==(Label a, Label b);
+bool operator ==(marker a, marker b);
+bool operator ==(bool3 a, bool3 b);
+bool operator ==(marginT a, marginT b);
+bool operator ==(transformation a, transformation b);
+bool operator ==(projection a, projection b);
+bool operator ==(coords3 a, coords3 b);
+bool operator ==(align a, align b);
+bool operator ==(cputime a, cputime b);
+bool operator ^(bool a, bool b);
+bool[] operator ^(bool a, bool[] b);
+bool[] operator ^(bool[] a, bool b);
+bool[] operator ^(bool[] a, bool[] b);
+int operator ^(int a, int b);
+int[] operator ^(int a, int[] b);
+int[] operator ^(int[] a, int b);
+int[] operator ^(int[] a, int[] b);
+real operator ^(real a, real b);
+real[] operator ^(real a, real[] b);
+real[] operator ^(real[] a, real b);
+real[] operator ^(real[] a, real[] b);
+pair operator ^(pair a, pair b);
+pair[] operator ^(pair a, pair[] b);
+pair[] operator ^(pair[] a, pair b);
+pair[] operator ^(pair[] a, pair[] b);
+transform operator ^(transform t, int n);
+real operator ^(real x, int y);
+pair operator ^(pair z, int y);
+bool operator |(bool a, bool b);
+bool[] operator |(bool a, bool[] b);
+bool[] operator |(bool[] a, bool b);
+bool[] operator |(bool[] a, bool[] b);
+pen NewCenturySchoolBook(string series=<default>, string shape=<default>);
+void()()[] saveFunctions;
+bool operator &(bool a, bool b);
+bool[] operator &(bool a, bool[] b);
+bool[] operator &(bool[] a, bool b);
+bool[] operator &(bool[] a, bool[] b);
+path operator &(path p, path q);
+path3 operator &(path3 p, path3 q);
+path operator &(path p, cycleToken tok);
string minipage(string s, real width=<default>);
real legendmaxrelativewidth;
real cross(explicit pair z, explicit pair w);
@@ -1285,131 +1845,6 @@ pen[] operator +(pen a, pen[] b);
pen operator +(real w, pen p);
string operator +(... string[] a);
pen[] operator +(pen[] a, pen b);
-int operator -(int a, int b);
-int[] operator -(int a, int[] b);
-int[] operator -(int[] a, int b);
-int[] operator -(int[] a, int[] b);
-int[][] operator -(int[][] a, int[][] b);
-int operator -(int a);
-int[] operator -(int[] a);
-int[][] operator -(int[][] a);
-real operator -(real a, real b);
-real[] operator -(real a, real[] b);
-real[] operator -(real[] a, real b);
-real[] operator -(real[] a, real[] b);
-real[][] operator -(real[][] a, real[][] b);
-real operator -(real a);
-real[] operator -(real[] a);
-real[][] operator -(real[][] a);
-pair operator -(pair a, pair b);
-pair[] operator -(pair a, pair[] b);
-pair[] operator -(pair[] a, pair b);
-pair[] operator -(pair[] a, pair[] b);
-pair[][] operator -(pair[][] a, pair[][] b);
-pair operator -(pair a);
-pair[] operator -(pair[] a);
-pair[][] operator -(pair[][] a);
-triple operator -(triple a, triple b);
-triple[] operator -(triple a, triple[] b);
-triple[] operator -(triple[] a, triple b);
-triple[] operator -(triple[] a, triple[] b);
-triple[][] operator -(triple[][] a, triple[][] b);
-triple operator -(triple a);
-triple[] operator -(triple[] a);
-triple[][] operator -(triple[][] a);
-bool primitive();
-int operator *(int a, int b);
-int[] operator *(int a, int[] b);
-int[] operator *(int[] a, int b);
-int[] operator *(int[] a, int[] b);
-int[][] operator *(int a, int[][] b);
-int[][] operator *(int[][] a, int b);
-real operator *(real a, real b);
-real[] operator *(real a, real[] b);
-real[] operator *(real[] a, real b);
-real[] operator *(real[] a, real[] b);
-real[][] operator *(real a, real[][] b);
-real[][] operator *(real[][] a, real b);
-pair operator *(pair a, pair b);
-pair[] operator *(pair a, pair[] b);
-pair[] operator *(pair[] a, pair b);
-pair[] operator *(pair[] a, pair[] b);
-pair[][] operator *(pair a, pair[][] b);
-pair[][] operator *(pair[][] a, pair b);
-triple[] operator *(real a, triple[] b);
-triple[][] operator *(real a, triple[][] b);
-triple[] operator *(triple[] a, real b);
-triple[][] operator *(triple[][] a, real b);
-pen operator *(real a, pen b);
-pen operator *(pen a, real b);
-transform operator *(transform a, transform b);
-pair operator *(transform t, pair z);
-path operator *(transform t, path g);
-pen operator *(transform t, pen p);
-frame operator *(transform t, frame f);
-frame operator *(real[][] t, frame f);
-real[] operator *(real[][] a, real[] b);
-real[] operator *(real[] a, real[][] b);
-int[][] operator *(int[][] a, int[][] b);
-real[][] operator *(real[][] a, real[][] b);
-pair[][] operator *(pair[][] a, pair[][] b);
-triple operator *(real[][] t, triple v);
-triple operator *(real x, triple v);
-triple operator *(triple v, real x);
-path3 operator *(real[][] t, path3 g);
-picture operator *(real[][] t, picture orig);
-bounds operator *(transform t, bounds b);
-side operator *(real x, side s);
-Label operator *(real[][] t, Label L);
-path[] operator *(transform t, explicit path[] p);
-picture operator *(transform t, picture orig);
-pair[] operator *(transform t, pair[] z);
-object operator *(transform t, explicit object F);
-Label operator *(transform t, Label L);
-bool operator init();
-int operator init();
-real operator init();
-string operator init();
-pair operator init();
-triple operator init();
-transform operator init();
-guide operator init();
-path operator init();
-path3 operator init();
-pen operator init();
-frame operator init();
-file operator init();
-filltype operator init();
-Legend operator init();
-position operator init();
-schur operator init();
-marginT operator init();
-ScaleT operator init();
-side operator init();
-realschur operator init();
-slice operator init();
-autoscaleT operator init();
-align operator init();
-cputime operator init();
-hsv operator init();
-bounds operator init();
-scaleT operator init();
-arrowhead operator init();
-coords2 operator init();
-coords3 operator init();
-marker operator init();
-scaling operator init();
-light operator init();
-picture operator init();
-coord operator init();
-projection operator init();
-pairOrTriple operator init();
-object operator init();
-bool3 operator init();
-transformation operator init();
-node operator init();
-Label operator init();
-processtime operator init();
real operator cast(int);
pair operator cast(int);
pair operator cast(real);
@@ -1452,32 +1887,32 @@ guide operator cast(cycleToken tok);
guide operator cast(curlSpecifier spec);
guide operator cast(tensionSpecifier t);
guide[] operator cast(path[] g);
+object operator cast(Label L);
+pair operator cast(position P);
position operator cast(int x);
-hsv operator cast(pen p);
-object operator cast(string s);
-bool3[] operator cast(bool[] b);
+bool operator cast(bool3 b);
+bool3 operator cast(bool b);
position operator cast(real x);
-Label operator cast(string s);
-pair operator cast(pairOrTriple a);
-triple operator cast(pairOrTriple a);
-frame operator cast(object F);
+hsv operator cast(pen p);
guide[] operator cast(pair[] z);
path[] operator cast(guide[] g);
-bool operator cast(bool3 b);
-position operator cast(pair x);
-path[] operator cast(guide g);
-align operator cast(side side);
-pair operator cast(position P);
object operator cast(frame f);
+path[] operator cast(guide g);
+position operator cast(pair x);
path[] operator cast(pair[] z);
path[] operator cast(path p);
-bool[] operator cast(bool3[] b);
align operator cast(pair dir);
-object operator cast(Label L);
-Label operator cast(object F);
-bool3 operator cast(bool b);
+Label operator cast(string s);
+bool3[] operator cast(bool[] b);
align operator cast(triple dir);
+bool[] operator cast(bool3[] b);
+object operator cast(string s);
+align operator cast(side side);
+Label operator cast(object F);
pen operator cast(hsv hsv);
+frame operator cast(object F);
+pair operator cast(pairOrTriple a);
+triple operator cast(pairOrTriple a);
pen deepred;
bool error(file f);
string operator ecast(int);
@@ -1492,743 +1927,360 @@ int operator ecast(real);
int[] operator ecast(real[]);
real[] operator ecast(string[] a);
int[] operator ecast(string[] a);
-pair operator tuple(real x, real y);
-triple operator tuple(real x, real y, real z);
-transform operator tuple(real x, real y, real xx, real xy, real yx, real yy);
-real operator /(real a, real b);
-real[] operator /(real a, real[] b);
-real[] operator /(real[] a, real b);
-real[] operator /(real[] a, real[] b);
-real[][] operator /(real[][] a, real b);
-pair operator /(pair a, pair b);
-pair[] operator /(pair a, pair[] b);
-pair[] operator /(pair[] a, pair b);
-pair[] operator /(pair[] a, pair[] b);
-pair[][] operator /(pair[][] a, pair b);
-triple[] operator /(triple[] a, real b);
-real operator /(int a, int b);
-real[] operator /(int[] a, int b);
-real[] operator /(int a, int[] b);
-real[] operator /(int[] a, int[] b);
-triple operator /(triple v, real x);
-path[] texpath(string s, pen p, bool tex=<default>, bool bbox=<default>);
-path[] texpath(Label L, bool tex=<default>, bool bbox=<default>);
-bool uptodate();
-int operator #(int a, int b);
-int[] operator #(int a, int[] b);
-int[] operator #(int[] a, int b);
-int[] operator #(int[] a, int[] b);
-int operator %(int a, int b);
-int[] operator %(int a, int[] b);
-int[] operator %(int[] a, int b);
-int[] operator %(int[] a, int[] b);
-real operator %(real a, real b);
-real[] operator %(real a, real[] b);
-real[] operator %(real[] a, real b);
-real[] operator %(real[] a, real[] b);
-bool operator ^(bool a, bool b);
-bool[] operator ^(bool a, bool[] b);
-bool[] operator ^(bool[] a, bool b);
-bool[] operator ^(bool[] a, bool[] b);
-int operator ^(int a, int b);
-int[] operator ^(int a, int[] b);
-int[] operator ^(int[] a, int b);
-int[] operator ^(int[] a, int[] b);
-real operator ^(real a, real b);
-real[] operator ^(real a, real[] b);
-real[] operator ^(real[] a, real b);
-real[] operator ^(real[] a, real[] b);
-pair operator ^(pair a, pair b);
-pair[] operator ^(pair a, pair[] b);
-pair[] operator ^(pair[] a, pair b);
-pair[] operator ^(pair[] a, pair[] b);
-transform operator ^(transform t, int n);
-real operator ^(real x, int y);
-pair operator ^(pair z, int y);
-bool operator ==(bool a, bool b);
-bool[] operator ==(bool a, bool[] b);
-bool[] operator ==(bool[] a, bool b);
-bool[] operator ==(bool[] a, bool[] b);
-bool operator ==(bool[][] a, bool[][] b);
-bool operator ==(int a, int b);
-bool[] operator ==(int a, int[] b);
-bool[] operator ==(int[] a, int b);
-bool[] operator ==(int[] a, int[] b);
-bool operator ==(int[][] a, int[][] b);
-bool operator ==(real a, real b);
-bool[] operator ==(real a, real[] b);
-bool[] operator ==(real[] a, real b);
-bool[] operator ==(real[] a, real[] b);
-bool operator ==(real[][] a, real[][] b);
-bool operator ==(pair a, pair b);
-bool[] operator ==(pair a, pair[] b);
-bool[] operator ==(pair[] a, pair b);
-bool[] operator ==(pair[] a, pair[] b);
-bool operator ==(pair[][] a, pair[][] b);
-bool operator ==(triple a, triple b);
-bool[] operator ==(triple a, triple[] b);
-bool[] operator ==(triple[] a, triple b);
-bool[] operator ==(triple[] a, triple[] b);
-bool operator ==(triple[][] a, triple[][] b);
-bool operator ==(string a, string b);
-bool[] operator ==(string a, string[] b);
-bool[] operator ==(string[] a, string b);
-bool[] operator ==(string[] a, string[] b);
-bool operator ==(string[][] a, string[][] b);
-bool[] operator ==(pen[] a, pen[] b);
-bool operator ==(pen a, pen b);
-bool operator ==(transform a, transform b);
-bool operator ==(file a, file b);
-bool operator ==(path a, path b);
-bool operator ==(path3 a, path3 b);
-bool operator ==(bool3 a, bool3 b);
-bool operator ==(freezableBounds a, freezableBounds b);
-bool operator ==(transformation a, transformation b);
-bool operator ==(node a, node b);
-bool operator ==(Label a, Label b);
-bool operator ==(processtime a, processtime b);
-bool operator ==(coords2 a, coords2 b);
-bool operator ==(coords3 a, coords3 b);
-bool operator ==(marker a, marker b);
-bool operator ==(marginT a, marginT b);
-bool operator ==(ScaleT a, ScaleT b);
-bool operator ==(side a, side b);
-bool operator ==(realschur a, realschur b);
-bool operator ==(coord a, coord b);
-bool operator ==(projection a, projection b);
-bool operator ==(pairOrTriple a, pairOrTriple b);
-bool operator ==(object a, object b);
-bool operator ==(hsv a, hsv b);
-bool operator ==(bounds a, bounds b);
-bool operator ==(scaleT a, scaleT b);
-bool operator ==(arrowhead a, arrowhead b);
-bool operator ==(bool3 a, bool b);
-bool operator ==(filltype a, filltype b);
-bool operator ==(Legend a, Legend b);
-bool operator ==(position a, position b);
-bool operator ==(schur a, schur b);
-bool operator ==(scaling a, scaling b);
-bool operator ==(light a, light b);
-bool operator ==(picture a, picture b);
-bool operator ==(bool a, bool3 b);
-bool operator ==(slice a, slice b);
-bool operator ==(autoscaleT a, autoscaleT b);
-bool operator ==(align a, align b);
-bool operator ==(cputime a, cputime b);
-bool operator !=(bool a, bool b);
-bool[] operator !=(bool a, bool[] b);
-bool[] operator !=(bool[] a, bool b);
-bool[] operator !=(bool[] a, bool[] b);
-bool operator !=(bool[][] a, bool[][] b);
-bool operator !=(int a, int b);
-bool[] operator !=(int a, int[] b);
-bool[] operator !=(int[] a, int b);
-bool[] operator !=(int[] a, int[] b);
-bool operator !=(int[][] a, int[][] b);
-bool operator !=(real a, real b);
-bool[] operator !=(real a, real[] b);
-bool[] operator !=(real[] a, real b);
-bool[] operator !=(real[] a, real[] b);
-bool operator !=(real[][] a, real[][] b);
-bool operator !=(pair a, pair b);
-bool[] operator !=(pair a, pair[] b);
-bool[] operator !=(pair[] a, pair b);
-bool[] operator !=(pair[] a, pair[] b);
-bool operator !=(pair[][] a, pair[][] b);
-bool operator !=(triple a, triple b);
-bool[] operator !=(triple a, triple[] b);
-bool[] operator !=(triple[] a, triple b);
-bool[] operator !=(triple[] a, triple[] b);
-bool operator !=(triple[][] a, triple[][] b);
-bool operator !=(string a, string b);
-bool[] operator !=(string a, string[] b);
-bool[] operator !=(string[] a, string b);
-bool[] operator !=(string[] a, string[] b);
-bool operator !=(string[][] a, string[][] b);
-bool[] operator !=(pen[] a, pen[] b);
-bool operator !=(pen a, pen b);
-bool operator !=(transform a, transform b);
-bool operator !=(file a, file b);
-bool operator !=(path a, path b);
-bool operator !=(path3 a, path3 b);
-bool operator !=(bool3 a, bool3 b);
-bool operator !=(freezableBounds a, freezableBounds b);
-bool operator !=(transformation a, transformation b);
-bool operator !=(node a, node b);
-bool operator !=(Label a, Label b);
-bool operator !=(processtime a, processtime b);
-bool operator !=(coords2 a, coords2 b);
-bool operator !=(coords3 a, coords3 b);
-bool operator !=(marker a, marker b);
-bool operator !=(marginT a, marginT b);
-bool operator !=(ScaleT a, ScaleT b);
-bool operator !=(side a, side b);
-bool operator !=(realschur a, realschur b);
-bool operator !=(coord a, coord b);
-bool operator !=(projection a, projection b);
-bool operator !=(pairOrTriple a, pairOrTriple b);
-bool operator !=(object a, object b);
-bool operator !=(hsv a, hsv b);
-bool operator !=(bounds a, bounds b);
-bool operator !=(scaleT a, scaleT b);
-bool operator !=(arrowhead a, arrowhead b);
-bool operator !=(bool3 a, bool b);
-bool operator !=(filltype a, filltype b);
-bool operator !=(Legend a, Legend b);
-bool operator !=(position a, position b);
-bool operator !=(schur a, schur b);
-bool operator !=(scaling a, scaling b);
-bool operator !=(light a, light b);
-bool operator !=(picture a, picture b);
-bool operator !=(bool a, bool3 b);
-bool operator !=(slice a, slice b);
-bool operator !=(autoscaleT a, autoscaleT b);
-bool operator !=(align a, align b);
-bool operator !=(cputime a, cputime b);
-bool operator <(int a, int b);
-bool[] operator <(int a, int[] b);
-bool[] operator <(int[] a, int b);
-bool[] operator <(int[] a, int[] b);
-bool operator <(real a, real b);
-bool[] operator <(real a, real[] b);
-bool[] operator <(real[] a, real b);
-bool[] operator <(real[] a, real[] b);
-bool operator <(string a, string b);
-bool[] operator <(string a, string[] b);
-bool[] operator <(string[] a, string b);
-bool[] operator <(string[] a, string[] b);
-bool operator <=(int a, int b);
-bool[] operator <=(int a, int[] b);
-bool[] operator <=(int[] a, int b);
-bool[] operator <=(int[] a, int[] b);
-bool operator <=(real a, real b);
-bool[] operator <=(real a, real[] b);
-bool[] operator <=(real[] a, real b);
-bool[] operator <=(real[] a, real[] b);
-bool operator <=(string a, string b);
-bool[] operator <=(string a, string[] b);
-bool[] operator <=(string[] a, string b);
-bool[] operator <=(string[] a, string[] b);
-bool operator <=(coord a, coord b);
-void srand(int seed);
-bool operator >(int a, int b);
-bool[] operator >(int a, int[] b);
-bool[] operator >(int[] a, int b);
-bool[] operator >(int[] a, int[] b);
-bool operator >(real a, real b);
-bool[] operator >(real a, real[] b);
-bool[] operator >(real[] a, real b);
-bool[] operator >(real[] a, real[] b);
-bool operator >(string a, string b);
-bool[] operator >(string a, string[] b);
-bool[] operator >(string[] a, string b);
-bool[] operator >(string[] a, string[] b);
-bool operator >=(int a, int b);
-bool[] operator >=(int a, int[] b);
-bool[] operator >=(int[] a, int b);
-bool[] operator >=(int[] a, int[] b);
-bool operator >=(real a, real b);
-bool[] operator >=(real a, real[] b);
-bool[] operator >=(real[] a, real b);
-bool[] operator >=(real[] a, real[] b);
-bool operator >=(string a, string b);
-bool[] operator >=(string a, string[] b);
-bool[] operator >=(string[] a, string b);
-bool[] operator >=(string[] a, string[] b);
-bool operator >=(coord a, coord b);
-filltype UnFill(real xmargin=<default>, real ymargin=<default>);
-filltype UnFill;
-real degrees(pair z, bool warn=<default>);
-real degrees(real radians);
-bool[] operator !(bool[] a);
-bool operator !(bool b);
-path[] operator ^^(path p, path q);
-path[] operator ^^(explicit path[] p, path q);
-path[] operator ^^(path p, explicit path[] q);
-path[] operator ^^(explicit path[] p, explicit path[] q);
-guide operator ::(... guide[]);
-pen Helvetica(string series=<default>, string shape=<default>);
-transform reflect(pair a, pair b);
-bool Bars(picture, path, pen, marginT(path, pen));
-bool Bars(picture, path, pen, marginT(path, pen))(real size=<default>);
-void none(file file);
-int factorial(int n);
-real log(real x);
-real[] log(real[] a);
-pair log(explicit pair z);
-guide operator ..(... guide[]);
-guide operator ..(... guide[])(tensionSpecifier t);
-path polygon(int n);
-guide operator --(... guide[]);
-guide operator ---(... guide[]);
-pen NewCenturySchoolBook(string series=<default>, string shape=<default>);
-void()()[] saveFunctions;
-bool operator &(bool a, bool b);
-bool[] operator &(bool a, bool[] b);
-bool[] operator &(bool[] a, bool b);
-bool[] operator &(bool[] a, bool[] b);
-path operator &(path p, path q);
-path3 operator &(path3 p, path3 q);
-path operator &(path p, cycleToken tok);
-bool operator |(bool a, bool b);
-bool[] operator |(bool a, bool[] b);
-bool[] operator |(bool[] a, bool b);
-bool[] operator |(bool[] a, bool[] b);
-string texify(string s);
-guide operator controls(pair zout, pair zin);
-guide operator controls(pair z);
-bool empty(frame f);
-tensionSpecifier operator tension(real tout, real tin, bool atleast);
-tensionSpecifier operator tension(real t, bool atLeast);
-void end(picture pic=<default>);
-curlSpecifier operator curl(real gamma, int p);
-guide operator spec(pair z, int p);
-string substr(string s, int pos, int n=<default>);
-pen paleyellow;
-file output(string name=<default>, bool update=<default>, string comment=<default>, string mode=<default>);
-pen ZapfDingbats(string series=<default>, string shape=<default>);
-real tanh(real x);
-real[] tanh(real[] a);
-real interp(real a, real b, real t);
-pair interp(explicit pair a, explicit pair b, real t);
-triple interp(triple a, triple b, real t);
-pen interp(pen a, pen b, real t);
-void mapArray(string From, string To);
-frame Seascape(frame f);
-bool interior(int windingnumber, pen fillrule);
-real[] intersect(path p, path q, real fuzz=<default>);
-real[] intersect(path3 p, path3 q, real fuzz=<default>);
-real[] intersect(path3 p, triple[][] p, real fuzz=<default>);
-bool interactive();
-string mapArrayString(string From, string To);
-real[][] intersections(path p, path q, real fuzz=<default>);
-real[] intersections(path p, explicit pair a, explicit pair b, real fuzz=<default>);
-real[][] intersections(path3 p, path3 q, real fuzz=<default>);
-real[][] intersections(path3 p, triple[][] p, real fuzz=<default>);
-int animate(string args=<default>, string file=<default>, string format=<default>);
-void generate_random_backtrace();
-real RELEASE;
-pair intersectionpoint(path p, path q, real fuzz=<default>);
-pair[] intersectionpoints(path p, path q, real fuzz=<default>);
-pair[] intersectionpoints(explicit path[] p, explicit path[] q, real fuzz=<default>);
-void asy(string format, bool overwrite=<default> ... string[] s);
-bool latex();
-bool adjust(pen p);
-pen adjust(pen p, real arclength, bool cyclic);
-pair Align;
-void exit();
-real[] uniform(real a, real b, int n);
-pair viewportsize;
-pair viewportmargin;
-string VERSION;
-real insphere(triple a, triple b, triple c, triple d, triple e);
-void drawSphere(frame f, real[][] t, bool half=<default>, pen[] p, real opacity, real shininess, real metallic, real fresnel0, int type);
-void filldraw(picture pic=<default>, path[] g, pen fillpen=<default>, pen drawpen=<default>);
-void filldraw(frame f, path[] g, pen fillpen=<default>, pen drawpen=<default>);
-real dot(real[] a, real[] b);
-pair dot(pair[] a, pair[] b);
-real dot(explicit pair z, explicit pair w);
-real dot(triple u, triple v);
-marker dot(pen p=<default>, filltype filltype=<default>);
-void dot(picture pic=<default>, pair z, pen p=<default>, filltype filltype=<default>);
-void dot(frame f, pair z, pen p=<default>, filltype filltype=<default>);
-void dot(picture pic=<default>, Label L, pen p=<default>, filltype filltype=<default>);
-void dot(picture pic=<default>, Label[] L=<default>, pair[] z, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
-void dot(picture pic=<default>, path[] g, pen p=<default>, filltype filltype=<default>);
-marker dot;
-void dot(picture pic=<default>, Label L, pair z, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
-void dot(picture pic=<default>, Label[] L=<default>, explicit path g, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
-void list(string s, bool imports=<default>);
-pair NNW;
-string phantom(string s);
-void atexit(void f());
-void atexit()();
-real getreal(string name=<default>, real default=<default>, string prompt=<default>, bool store=<default>);
-int convert(string args=<default>, string file=<default>, string format=<default>);
-pair WNW;
-pen palegray;
-pen palegreen;
-pen palegrey;
-void clip(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
-void clip(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
-marginT Margin(path, pen)(real begin, real end=<default>);
-marginT Margin(path, pen);
-position Relative(real position);
-side Relative(explicit pair align);
-marginT Margins(path, pen);
-pair truepoint(picture pic=<default>, pair dir, bool user=<default>);
-real arclength(path p);
-real arclength(pair z0, pair c0, pair c1, pair z1);
-real arclength(path3 p);
-real arclength(triple z0, triple c0, triple c1, triple z1);
-bool finite(real x);
-bool finite(pair z);
-bool finite(triple v);
-void updatefunction();
-bool implicitshipout;
-void _draw(frame f, path g, pen p);
-void _draw(frame f, path3 g, triple center=<default>, pen[] p, real opacity, real shininess, real metallic, real fresnel0, int interaction=<default>);
-void _draw(picture pic, path g, pen p, marginT margin(path, pen));
-frame align(frame f, pair align);
-object align(object F, pair align);
-path[] align(path[] g, transform t=<default>, pair position, pair align, pen p=<default>);
-real unitrand();
-string[] history(string name, int n=<default>);
-string[] history(int n=<default>);
-coord[] maxcoords(coord[] in, bool operator <=(coord, coord));
-pen AvantGarde(string series=<default>, string shape=<default>);
-frame enclose(string prefix=<default>, object F, string format=<default>);
-int count;
-real atan2(real y, real x);
-bool inside(explicit path[] g, pair z, pen fillrule=<default>);
-bool inside(path g, pair z, pen fillrule=<default>);
-int inside(path p, path q, pen fillrule=<default>);
-pair inside(path p, pen fillrule=<default>);
-pair rectify(pair dir);
-arrowhead TeXHead;
-bool initialized(int a);
-bool initialized(real a);
-bool initialized(pair a);
-bool initialized(triple a);
-path[] margin(path[] g, real xmargin, real ymargin);
-pair relative(picture pic=<default>, pair z);
-real erfc(real x);
-int windingnumber(path[] p, pair z);
-real expansionfactor;
-void addArrow(picture pic, arrowhead arrowhead, path g, pen p, real size, real angle, filltype filltype, real position);
-void exitfunction();
-pen gray(pen p);
-pen gray(real gray);
-pen gray;
-real relativedistance(real theta, real phi, real t, bool atleast);
-path circle(pair c, real r);
-void overloadedMessage(file file);
-pen deepmagenta;
-real circlescale;
-string math(string s);
-real circleprecision;
-int Allow;
-real determinant(real[][] a);
-void functionshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, string shader=<default>, bool copy=<default>);
-void functionshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, string shader, bool copy=<default>);
-pen red;
-pair[] dirSpecifier(guide g, int t);
-void abort(string s=<default>);
-bool Aspect;
-string hex(pen p);
-int hex(string s);
-void deactivatequote(picture pic=<default>);
-path brace(pair a, pair b, real amplitude=<default>);
-string format(string format, int x, string locale=<default>);
-string format(string format, bool forcemath=<default>, string separator, real x, string locale=<default>);
-string format(string format=<default>, bool forcemath=<default>, real x, string locale=<default>);
-real[][][] _schur(real[][] a);
-pair[][][] _schur(pair[][] a);
-real expm1(real x);
-real[] expm1(real[] a);
-void activatequote(picture pic=<default>);
-int undefined;
-transform zeroTransform;
-string ask(string prompt);
-frame[] fit2(picture[] pictures, picture all);
-pen linecap(int n);
-int linecap(pen p=<default>);
-string outname();
-void newpage(frame f);
-void newpage(picture pic=<default>);
-pen fontcommand(string s);
-real bracemidangle;
-pair accel(path p, int t, int sign=<default>);
-pair accel(path p, real t);
-triple accel(path3 p, int t, int sign=<default>);
-triple accel(path3 p, real t);
-frame Portrait(frame f);
-real braceinnerangle;
-real braceouterangle;
-void tex(frame f, string s);
-void tex(frame f, string s, pair min, pair max);
-void tex(picture pic=<default>, string s);
-void tex(picture pic=<default>, string s, pair min, pair max);
-real bracedefaultratio;
-bool prconly(string format=<default>);
-pen Black;
-triple size3(frame f);
-void size3(picture pic=<default>, real x, real y=<default>, real z=<default>, bool keepAspect=<default>);
-bool eof(file f);
-frame dotframe;
-frame dotframe(pen p=<default>, filltype filltype=<default>);
-real realMax;
-pair NE;
-real realMin;
-realschur schur(real[][] a);
-schur schur(pair[][] a);
-path nib(pen p);
-file _outpipe;
-void gouraudshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, pair[] z, int[] edges, bool copy=<default>);
-void gouraudshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, int[] edges, bool copy=<default>);
-void gouraudshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, pair[] z, int[] edges, bool copy=<default>);
-void gouraudshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, int[] edges, bool copy=<default>);
-pair[] fft(pair[] a, int sign=<default>);
-pair[][] fft(pair[][] a, int sign=<default>);
-pair[][][] fft(pair[][][] a, int sign=<default>);
-pair SE;
-pen nobasealign;
+bool operator init();
+int operator init();
+real operator init();
+string operator init();
+pair operator init();
+triple operator init();
+transform operator init();
+guide operator init();
+path operator init();
+path3 operator init();
+pen operator init();
+frame operator init();
+file operator init();
+bounds operator init();
+light operator init();
+autoscaleT operator init();
+ScaleT operator init();
+side operator init();
+position operator init();
+realschur operator init();
+bool3 operator init();
+marginT operator init();
+transformation operator init();
+projection operator init();
+coords3 operator init();
+align operator init();
+cputime operator init();
+coords2 operator init();
+node operator init();
+Label operator init();
+marker operator init();
+hsv operator init();
+coord operator init();
+scaleT operator init();
+object operator init();
+processtime operator init();
+scaling operator init();
+pairOrTriple operator init();
+arrowhead operator init();
+slice operator init();
+filltype operator init();
+Legend operator init();
+picture operator init();
+schur operator init();
real animationdelay;
-animation operator init();
frame NoBox(frame f);
+animation operator init();
frame BBox(frame)(real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
void annotate(picture pic=<default>, string title, string text, pair position);
void babel(string s);
-path removeDuplicates(path p);
-path uncycle(path p, real t);
-path[] bezulate(path[] p);
+bool isDuplicate(pair a, pair b, real relSize);
+real maxrefinements;
real[][] intersections(pair a, pair b, path p);
+path[] bezulate(path[] p);
+path[][] containmentTree(path[] paths);
+path section(path p, real t1, real t2, bool loop=<default>);
+path removeDuplicates(path p);
void connect(path[] paths, path[] result, path[] patch);
-int countIntersections(path[] p, pair start, pair end);
real duplicateFuzz;
-path subdivide(path p);
-bool isDuplicate(pair a, pair b, real relSize);
+int countIntersections(path[] p, pair start, pair end);
bool checkSegment(path g, pair p, pair q);
-path section(path p, real t1, real t2, bool loop=<default>);
+path uncycle(path p, real t);
+path subdivide(path p);
real fuzz;
-real maxrefinements;
-path[][] containmentTree(path[] paths);
-binarytree searchtree(... int[] keys);
-object draw(picture pic=<default>, binarytreeNode node, pair pos, int height, real minDist, real levelDist, real nodeDiameter, pen p=<default>, bool condensed=<default>);
-void draw(picture pic=<default>, binarytree tree, real minDist=<default>, real nodeMargin=<default>, pen p=<default>, bool condensed=<default>);
-real nodeMarginDefault;
-key key(int n, bool active=<default>);
-binarytree binarytree(... key[] keys);
-binarytreeNode binarytreeNode(int key);
key nil;
real minDistDefault;
-binarytreeNode operator init();
-key operator init();
-binarytree operator init();
+binarytreeNode binarytreeNode(int key);
+real nodeMarginDefault;
key operator cast(int n);
int operator cast(key k);
int[] operator cast(key[] k);
-line intersection(face a, face b);
+binarytree binarytree(... key[] keys);
+key key(int n, bool active=<default>);
+binarytree searchtree(... int[] keys);
+object draw(picture pic=<default>, binarytreeNode node, pair pos, int height, real minDist, real levelDist, real nodeDiameter, pen p=<default>, bool condensed=<default>);
+void draw(picture pic=<default>, binarytree tree, real minDist=<default>, real nodeMargin=<default>, pen p=<default>, bool condensed=<default>);
+binarytreeNode operator init();
real epsilon;
splitface split(face a, face cut, projection P);
-face operator init();
-line operator init();
-half operator init();
-splitface operator init();
-bsp operator init();
+void add(picture pic=<default>, face[] faces, projection P=<default>);
+line intersection(face a, face b);
picture operator cast(face f);
face operator cast(path3 p);
-void add(picture pic=<default>, face[] faces, projection P=<default>);
-sCAD operator init();
-surface surface(vertex[][] g);
-weighted operator init();
-bucket operator init();
-vertex operator init();
-object operator init();
+list_data viridis;
+list_data twilight;
+seg_data wistia;
+seg_data winter;
+list_data tab20c;
+list_data seismic;
+seg_data nipy_spectral;
+seg_data hot;
+seg_data gist_stern;
+seg_data gist_ncar;
+seg_data gist_earth;
+seg_data copper;
+seg_data cool;
+list_data bwr;
+list_data brg;
+seg_data binary;
+list_data YlOrRd;
+list_data YlGn;
+list_data Set2;
+list_data Reds;
+list_data cividis;
+list_data Purples;
+list_data inferno;
+list_data RdPu;
+seg_data bone;
+list_data tab20;
+seg_data summer;
+seg_data gray;
+list_data twilight_shifted;
+list_data plasma;
+seg_data spring;
+seg_data autumn;
+seg_data hsv;
+list_data RdBu;
+list_data tab20b;
+list_data Greys;
+list_data Spectral;
+list_data tab10;
+list_data Pastel1;
+seg_data coolwarm;
+real[] makeMappingArray(int N, triple[] data, real gamma=<default>);
+list_data Paired;
+list_data Set1;
+list_data Set3;
+seg_data pink;
+list_data magma;
+list_data YlGnBu;
+list_data BrBG;
+list_data OrRd;
+list_data PuRd;
+list_data PuBuGn;
+list_data RdGy;
+list_data YlOrBr;
+list_data Greens;
+list_data Pastel2;
+seg_data jet;
+list_data Accent;
+list_data Blues;
+list_data BuGn;
+list_data BuPu;
+seg_data CMRmap;
+list_data Dark2;
+list_data GnBu;
+list_data Oranges;
+list_data PRGn;
+list_data PiYG;
+list_data PuBu;
+list_data PuOr;
+list_data RdYlBu;
+list_data RdYlGn;
+real eps;
vertex[][] contour3(triple[][][] v, real[][][] f, real[][][] midpoint=<default>, projection P=<default>);
vertex[][] contour3(real[][][] f, real[][][] midpoint=<default>, triple a, triple b, projection P=<default>);
vertex[][] contour3(real f(real, real, real), triple a, triple b, int nx=<default>, int ny=<default>, int nz=<default>, projection P=<default>);
-real eps;
+surface surface(vertex[][] g);
+segment case3(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=<default>);
segment case1(pair p0, pair p1, int edge);
-void draw(picture pic=<default>, Label[] L=<default>, guide[][] g, pen[] p);
-void draw(picture pic=<default>, Label[] L=<default>, guide[][] g, pen p=<default>);
-pen[][] interior(picture pic=<default>, guide[][] g, pen[] palette);
-pen[] extend(pen[] palette, pen below, pen above);
-guide[][] connect(picture pic, pair[][][] points, real[] c, guide join(... guide[]));
+real eps;
segment case2(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge);
-void collect(pair[][][] points, real[] c);
-segment case3(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=<default>);
+pen[][] interior(picture pic=<default>, guide[][] g, pen[] palette);
segment checktriangle(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=<default>);
-segment operator init();
-void addseg(pair[][] gds, segment seg);
-void fill(picture pic=<default>, guide[][] g, pen[][] palette);
guide[][] contour(picture pic=<default>, pair[][] z, real[][] f, real[][] midpoint=<default>, real[] c, guide join(... guide[])=<default>);
guide[][] contour(picture pic=<default>, real[][] f, real[][] midpoint=<default>, pair a, pair b, real[] c, guide join(... guide[])=<default>);
guide[][] contour(picture pic=<default>, real f(real, real), pair a, pair b, real[] c, int nx=<default>, int ny=<default>, guide join(... guide[])=<default>);
guide[][] contour(picture pic=<default>, real f(pair), pair a, pair b, real[] c, int nx=<default>, int ny=<default>, guide join(... guide[])=<default>);
guide[][] contour(picture pic=<default>, pair[] z, real[] f, real[] c, guide join(... guide[])=<default>);
-real eps;
-void draw(TreeNode root, pair pos);
-real treeNodeStep;
+guide[][] connect(picture pic, pair[][][] points, real[] c, guide join(... guide[]));
+void addseg(pair[][] gds, segment seg);
+void draw(picture pic=<default>, Label[] L=<default>, guide[][] g, pen[] p);
+void draw(picture pic=<default>, Label[] L=<default>, guide[][] g, pen p=<default>);
+void collect(pair[][][] points, real[] c);
+void fill(picture pic=<default>, guide[][] g, pen[][] palette);
+pen[] extend(pen[] palette, pen below, pen above);
void drawAll(TreeNode node, frame f);
real layout(int level, TreeNode node);
-TreeNode operator init();
-void add(TreeNode child, TreeNode parent);
-real treeLevelStep;
real treeMinNodeWidth;
+real treeLevelStep;
TreeNode makeNode(TreeNode parent=<default>, frame f);
TreeNode makeNode(TreeNode parent=<default>, Label label);
-string link(string label, string text=<default>);
+void add(TreeNode child, TreeNode parent);
+void draw(TreeNode root, pair pos);
+real treeNodeStep;
string embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>);
string embedplayer(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>);
string link(string label, string text=<default>);
-string embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>, string image=<default>);
string hyperlink(string url, string text);
-real gluonratio;
-real gluonamplitude;
-void drawGluon(picture pic=<default>, path p, real amp=<default>, real width=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
-void drawGhost(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
-void drawVertex(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
-void drawVertexO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
+string embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>, string image=<default>);
+string link(string label, string text=<default>);
+void texshipout(string stem, picture pic=<default>, bool xalign=<default>);
+bool XYAlign;
+void fmdefaults();
+void drawMomArrow(picture pic=<default>, path p, align align, position pos=<default>, real offset=<default>, real length=<default>, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real margin=<default>);
+void drawVertexOX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
void drawVertexX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
-void drawVertexBox(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
void drawVertexBoxO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
-void drawVertexOX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
-void drawVertexTriangle(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
+void drawVertexBox(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
void drawVertexTriangleO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
+void drawVertexTriangle(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
+void drawVertexO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
+void drawVertex(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
+bool DoubleLineMidArrow(picture, path, pen, marginT(path, pen));
+void drawGhost(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
+void drawFermion(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
+void drawPhoton(picture pic=<default>, path p, real amp=<default>, real width=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
+void drawGluon(picture pic=<default>, path p, real amp=<default>, real width=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
+path momArrowPath(path p, align align, position pos, real offset=<default>, real length=<default>);
+path photon(path p, real amp=<default>, real width=<default>);
void drawVertexBoxX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
-pen doublelinepen;
-real doublelinespacing;
-void do_overpaint(picture pic, path p, pen bgpen, real halfwidth, real vertexangle);
-void texshipout(string stem, picture pic=<default>, bool xalign=<default>);
-bool XYAlign;
-void drawDoubleLine(picture pic=<default>, path p, pen fgpen=<default>, real dlspacing=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
-void drawScalar(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
+path gluon(path p, real amp=<default>, real width=<default>);
+real linemargin;
bool overpaint;
-path photon(path p, real amp=<default>, real width=<default>);
-pen photonpen;
-real photonratio;
-real photonamplitude;
-string includegraphicscommand;
-pen momarrowpen;
-real momarrowsize(pen p=<default>);
-real momarrowlength;
+bool currentarrow(picture, path, pen, marginT(path, pen));
real momarrowoffset;
-real momarrowmargin;
-real momarrowfactor;
+real doublelinespacing;
+bool currentmomarrow(picture, path, pen, marginT(path, pen));
+real momarrowsize(pen p=<default>);
+real gluonratio;
pen vertexpen;
+void drawDoubleLine(picture pic=<default>, path p, pen fgpen=<default>, real dlspacing=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
+pen photonpen;
+pen ghostpen;
+real bigvertexsize;
+void do_overpaint(picture pic, path p, pen bgpen, real halfwidth, real vertexangle);
real vertexsize;
-path momArrowPath(path p, align align, position pos, real offset=<default>, real length=<default>);
-void drawPhoton(picture pic=<default>, path p, real amp=<default>, real width=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
bool YAlign;
+pen momarrowpen;
+pen bigvertexpen;
+string includegraphicscommand;
+real gluonamplitude;
+real photonratio;
+real photonamplitude;
pen backgroundpen;
-pen scalarpen;
+void drawScalar(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
+pen gluonpen;
pen fermionpen;
-pen bigvertexpen;
-real bigvertexsize;
+pen scalarpen;
+pen doublelinepen;
real minvertexangle;
-pen ghostpen;
-void drawMomArrow(picture pic=<default>, path p, align align, position pos=<default>, real offset=<default>, real length=<default>, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real margin=<default>);
-void fmdefaults();
-real linemargin;
-void drawFermion(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
-bool currentarrow(picture, path, pen, marginT(path, pen));
-bool currentmomarrow(picture, path, pen, marginT(path, pen));
+real momarrowlength;
+real momarrowmargin;
+real momarrowfactor;
bool appendsuffix;
-path gluon(path p, real amp=<default>, real width=<default>);
-pen gluonpen;
+Dir Down;
+Dir Up;
Dir Left;
+Dir Right;
+block blockconnector(block, block)(picture pic, transform t, pen p=<default>, marginT margin(path, pen)=<default>);
+path path(pair[] point ... flowdir[] dir);
+block bevel(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dh=<default>, real dw=<default>, real minwidth=<default>, real minheight=<default>);
block roundrectangle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real ds=<default>, real dw=<default>, real minwidth=<default>, real minheight=<default>);
-block diamond(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real ds=<default>, real dw=<default>, real height=<default>, real minwidth=<default>, real minheight=<default>);
-void draw(picture pic=<default>, block block, pen p=<default>);
-real minblockwidth;
-real minblockheight;
+block parallelogram(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dx=<default>, real slope=<default>, real minwidth=<default>, real minheight=<default>);
real defaultexcursion;
-path path(pair[] point ... flowdir[] dir);
-Dir Up;
+real minblockheight;
+real minblockwidth;
+flowdir Horizontal;
+block operator --(block b1, Label label);
+block operator --(block b1, Dir dir);
+block operator --(block b, bool arrowbar(picture, path, pen, marginT(path, pen)));
+void draw(picture pic=<default>, block block, pen p=<default>);
real mincirclediameter;
flowdir Vertical;
+block circle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dr=<default>, real mindiameter=<default>);
+block diamond(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real ds=<default>, real dw=<default>, real height=<default>, real minwidth=<default>, real minheight=<default>);
block rectangle(object header, object body, pair center=<default>, pen headerpen=<default>, pen bodypen=<default>, pen drawpen=<default>, real dx=<default>, real minheaderwidth=<default>, real minheaderheight=<default>, real minbodywidth=<default>, real minbodyheight=<default>);
block rectangle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dx=<default>, real minwidth=<default>, real minheight=<default>);
-block parallelogram(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dx=<default>, real slope=<default>, real minwidth=<default>, real minheight=<default>);
-block blockconnector(block, block)(picture pic, transform t, pen p=<default>, marginT margin(path, pen)=<default>);
-block circle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dr=<default>, real mindiameter=<default>);
-flowdir operator init();
-block operator init();
-Dir operator init();
-block operator --(block b1, Label label);
-block operator --(block b1, Dir dir);
-block operator --(block b, bool arrowbar(picture, path, pen, marginT(path, pen)));
-flowdir Horizontal;
-block bevel(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dh=<default>, real dw=<default>, real minwidth=<default>, real minheight=<default>);
-Dir Right;
-Dir Down;
-int[] numarray;
-point midpoint(segment s);
-point midpoint(side side);
-point isotomicconjugate(triangle t, point M);
-bool Finite(explicit point z);
-real rd(real x, real y, real z);
-point circumcenter(point A, point B, point C);
-point circumcenter(triangle t);
-circle circumcircle(point A, point B, point C);
-circle circumcircle(triangle t);
-line altitude(vertex V);
-line altitude(side side);
-point isogonalconjugate(triangle t, point M);
+line tangent(circle c, abscissa x);
+line tangent(circle c, point M);
+line tangent(circle c, explicit vector v);
+line tangent(ellipse el, abscissa x);
+line tangent(parabola p, abscissa x);
+line tangent(hyperbola h, abscissa x);
+line tangent(explicit arc a, abscissa x);
+line tangent(explicit arc a, point M);
+point radicalcenter(circle c1, circle c2);
+point radicalcenter(circle c1, circle c2, circle c3);
+inversion inversion(circle c1, circle c2, real sgn=<default>);
+inversion inversion(circle c1, circle c2, circle c3);
+inversion inversion(circle c);
+triangle anticomplementary(triangle t);
+triangle symmedial(triangle t);
+triangle orthic(triangle t);
+line median(vertex V);
+line median(side side);
+point intouch(side side);
+triangle intouch(triangle t);
+triangle incentral(triangle t);
+triangle antipedal(triangle t, point M);
point isogonal(side side, point M);
line isogonal(vertex V, point M);
triangle isogonal(triangle t, point M);
-point point(coordsys R, pair p, real m=<default>);
-point point(explicit pair p, real m);
-point point(coordsys R, explicit point M, real m=<default>);
-point point(explicit vector u);
-point point(circle c, abscissa l);
-point point(ellipse el, abscissa l);
-point point(parabola p, abscissa l);
-point point(hyperbola h, abscissa l);
-point point(explicit conic co, abscissa l);
-point point(line l, abscissa x);
-point point(line l, explicit real x);
-point point(line l, explicit int x);
-point point(explicit circle c, explicit real x);
-point point(explicit circle c, explicit int x);
-point point(explicit ellipse el, explicit real x);
-point point(explicit ellipse el, explicit int x);
-point point(explicit parabola p, explicit real x);
-point point(explicit parabola p, explicit int x);
-point point(explicit hyperbola h, explicit real x);
-point point(explicit hyperbola h, explicit int x);
-point point(explicit conic co, explicit real x);
-point point(explicit conic co, explicit int x);
-point point(arc a, abscissa l);
-point point(arc a, real x);
-pair point(explicit arc a, int x);
-point point(explicit mass m);
-point point(explicit vertex V);
-point point(trilinear tri);
-point point(circle c, point M);
-point point(circle c, explicit vector v);
-bool finite(explicit point p);
-void dot(picture pic=<default>, Label L, explicit point Z, align align=<default>, string format=<default>, pen p=<default>);
-real dot(point A, point B);
-real dot(point A, explicit pair B);
-real dot(explicit pair A, point B);
-void dot(picture pic=<default>, Label L, explicit mass M, align align=<default>, string format=<default>, pen p=<default>);
-void dot(picture pic=<default>, triangle t, pen p=<default>);
-real[] realquarticroots(real a, real b, real c, real d, real e);
-point origin;
-point origin(coordsys R=<default>);
-void draw(picture pic=<default>, Label L=<default>, line l, bool dirA=<default>, bool dirB=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
-void draw(picture pic=<default>, Label[] L=<default>, line[] l, align align=<default>, pen[] p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label[] legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
-void draw(picture pic=<default>, Label[] L=<default>, line[] l, align align=<default>, pen p, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label[] legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
-void draw(picture pic=<default>, Label L=<default>, circle c, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
-void draw(picture pic=<default>, Label L=<default>, ellipse el, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
-void draw(picture pic=<default>, Label L=<default>, parabola parabola, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
-void draw(picture pic=<default>, Label L=<default>, hyperbola h, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
-void draw(picture pic=<default>, Label L=<default>, explicit conic co, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
-void draw(picture pic=<default>, Label L=<default>, arc a, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
-void draw(picture pic=<default>, triangle t, pen p=<default>, marker marker=<default>);
-void draw(picture pic=<default>, triangle[] ts, pen p=<default>, marker marker=<default>);
-coordsys defaultcoordsys;
-string defaultmassformat;
-line radicalline(circle c1, circle c2);
-point radicalcenter(circle c1, circle c2);
-point radicalcenter(circle c1, circle c2, circle c3);
-ellipse ellipse(point F1, point F2, real a);
-ellipse ellipse(point F1, point F2, point M);
-ellipse ellipse(point C, real a, real b, real angle=<default>);
-ellipse ellipse(bqe bqe);
-ellipse ellipse(point M1, point M2, point M3, point M4, point M5);
-path arctopath(arc a, int n);
-bool inside(ellipse el, point M);
-bool inside(parabola p, point M);
-int ellipsenodesnumber(real a, real b);
-int ellipsenodesnumber(real a, real b, real angle1, real angle2, bool dir);
-int ellipsenodesnumberfactor;
-bool byfoci;
-transform reflect(line l);
-transform reflect(line l1, line l2, bool safe=<default>);
+point isogonalconjugate(triangle t, point M);
+point[] fermat(triangle t);
+point gergonne(triangle t);
+triangle cevian(triangle t, point P);
+point cevian(side side, point P);
+line cevian(vertex V, point P);
+point symmedian(triangle t);
+point symmedian(side side);
+line symmedian(vertex V);
+trilinear trilinear(triangle t, real a, real b, real c);
+trilinear trilinear(triangle t, point M);
+trilinear trilinear(triangle t, real f(real, real, real), real a=<default>, real b=<default>, real c=<default>);
+line altitude(vertex V);
+line altitude(side side);
+point foot(vertex V);
+point foot(side side);
+triangle triangleabc(real a, real b, real c, real angle=<default>, point A=<default>);
+circle excircle(point A, point B, point C);
+circle excircle(side side);
+real exradius(point A, point B, point C);
+real exradius(side side);
+point excenter(point A, point B, point C);
+point excenter(side side);
+circle incircle(point A, point B, point C);
+circle incircle(triangle t);
+real inradius(point A, point B, point C);
+real inradius(triangle t);
+point orthocenter(point A, point B, point C);
+point orthocenter(triangle t);
+mass masscenter(... mass[] M);
+int arcnodesnumber(explicit arc a);
+point curpoint(line l, real x);
+point curpoint(explicit circle c, real x);
+point curpoint(explicit ellipse el, real x);
+point curpoint(explicit parabola p, real x);
+point curpoint(conic co, real x);
+point curpoint(arc a, real x);
+abscissa nodabscissa(real x);
+abscissa nodabscissa(int x);
+abscissa nodabscissa(line l, point M);
+abscissa nodabscissa(circle c, point M);
+abscissa nodabscissa(ellipse el, point M);
+abscissa nodabscissa(parabola p, point M);
+abscissa nodabscissa(conic co, point M);
+abscissa nodabscissa(arc a, point M);
+abscissa angabscissa(real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+abscissa angabscissa(int x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+abscissa angabscissa(circle c, point M);
+abscissa angabscissa(ellipse el, point M, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+abscissa angabscissa(hyperbola h, point M, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+abscissa angabscissa(parabola p, point M);
+abscissa angabscissa(explicit conic co, point M);
+abscissa angabscissa(arc a, point M);
+abscissa curabscissa(real x);
+abscissa curabscissa(int x);
+abscissa curabscissa(line l, point M);
+abscissa curabscissa(circle c, point M);
+abscissa curabscissa(ellipse el, point M);
+abscissa curabscissa(parabola p, point M);
+abscissa curabscissa(conic co, point M);
+abscissa curabscissa(arc a, point M);
abscissa relabscissa(real x);
abscissa relabscissa(int x);
abscissa relabscissa(line l, point M);
@@ -2236,46 +2288,217 @@ abscissa relabscissa(circle c, point M);
abscissa relabscissa(ellipse el, point M);
abscissa relabscissa(conic co, point M);
abscissa relabscissa(arc a, point M);
-circle incircle(point A, point B, point C);
-circle incircle(triangle t);
-mass masscenter(... mass[] M);
-vector unit(point M);
-vector unit(vector u);
-line Ox(coordsys R=<default>);
-line Ox;
-conic conic(point F, line l, real e);
-conic conic(point M1, point M2, point M3, point M4, point M5);
-conic conic(bqe bqe);
-bool defined(point P);
-string conictype(bqe bqe);
-triangle antipedal(triangle t, point M);
-void clipdraw(picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, real xmargin=<default>, real ymargin=<default>, Label legend=<default>, marker marker=<default>);
-real perpfactor;
-int conicnodesfactor;
-int conicnodesnumber(conic co, real angle1, real angle2, bool dir=<default>);
-line hline(coordsys R=<default>);
-line hline;
-int[] tricoef(side side);
-path arcfromfocus(conic co, real angle1, real angle2, int n=<default>, bool direction=<default>);
-line sector(int n=<default>, int p=<default>, line l1, line l2, real angle=<default>, bool sharp=<default>);
+int relativesystem;
+bqe canonical(bqe bqe);
+real[] bangles(picture pic=<default>, parabola p);
+real[][] bangles(picture pic=<default>, hyperbola h);
+path fromFocus(conic co, real angle1, real angle2, int n, bool direction);
+real operator ^(point M, explicit circle c);
+point circumcenter(point A, point B, point C);
+point circumcenter(triangle t);
+parabola parabola(point F, line l);
+parabola parabola(point F, point vertex);
+parabola parabola(point F, real a, real angle);
+parabola parabola(bqe bqe);
+parabola parabola(point M1, point M2, point M3, line l);
+parabola parabola(point M1, point M2, point M3, point M4, point M5);
+real focusToCenter(ellipse el, real a);
path arcfromcenter(ellipse el, real angle1, real angle2, bool direction=<default>, int n=<default>);
path arcfromcenter(hyperbola h, real angle1, real angle2, int n=<default>, bool direction=<default>);
path arcfromcenter(explicit conic co, real angle1, real angle2, int n, bool direction=<default>);
+hyperbola hyperbola(point P1, point P2, real ae, bool byfoci=<default>);
+hyperbola hyperbola(point F1, point F2, point M);
+hyperbola hyperbola(point C, real a, real b, real angle=<default>);
+hyperbola hyperbola(bqe bqe);
+hyperbola hyperbola(point M1, point M2, point M3, point M4, point M5);
+coordsys canonicalcartesiansystem(ellipse el);
+coordsys canonicalcartesiansystem(parabola p);
+coordsys canonicalcartesiansystem(hyperbola h);
+coordsys canonicalcartesiansystem(explicit conic co);
+point angpoint(conic co, real angle);
+point angpoint(explicit circle c, real x);
+point angpoint(explicit ellipse el, real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+point angpoint(explicit parabola p, real x);
+point angpoint(explicit hyperbola h, real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+point angpoint(arc a, real angle);
+path currentpolarconicroutine(conic co, real angle1, real angle2, int n, bool direction);
+int hyperbolanodesnumber(hyperbola h, real angle1, real angle2);
+int parabolanodesnumber(parabola p, real angle1, real angle2);
+int parabolanodesnumberfactor;
+real centerToFocus(ellipse el, real a);
+int ellipsenodesnumberfactor;
+int circlenodesnumberfactor;
+line sector(int n=<default>, int p=<default>, line l1, line l2, real angle=<default>, bool sharp=<default>);
+real sharpangle(line l1, line l2);
+line perpendicular(point M, line l);
+line perpendicular(point M, explicit vector normal);
+line perpendicular(point M, explicit pair normal);
+bool perpendicular(line l1, line l2);
+void perpendicular(picture pic=<default>, pair z, pair align, pair dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+void perpendicular(picture pic=<default>, pair z, pair align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+transform hprojection(line l, bool safe=<default>);
+line parallel(point M, line l);
+line parallel(point M, explicit vector dir);
+line parallel(point M, explicit pair dir);
+bool parallel(line l1, line l2, bool strictly=<default>);
+transform reflect(line l);
+transform reflect(line l1, line l2, bool safe=<default>);
+line hline(coordsys R=<default>);
+line hline;
line vline(coordsys R=<default>);
line vline;
+line Oy(coordsys R=<default>);
+line Oy;
+line Ox(coordsys R=<default>);
+line Ox;
+line extend(line l);
+coordsys coordsys(line l);
+coordsys coordsys(conic co);
+coordsys coordsys(ellipse el);
+bool operator @(point m, line l);
+bool operator @(point M, conic co);
+bool operator @(point M, explicit circle c);
+bool operator @(point M, arc a);
+line line(point A, bool extendA=<default>, point B, bool extendB=<default>);
+line line(segment s);
+line line(real a, point A=<default>);
+line line(point A=<default>, real a);
+line line(int a, point A=<default>);
+line line(coordsys R=<default>, real slope, real origin);
+line line(coordsys R=<default>, real a, real b, real c);
+line line(circle c);
+line line(explicit side side);
+void distance(picture pic=<default>, Label L=<default>, point A, point B, bool rotated=<default>, real offset=<default>, pen p=<default>, pen joinpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
+real distance(point M, line l);
+real distance(line l, point M);
+void clipdraw(picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, real xmargin=<default>, real ymargin=<default>, Label legend=<default>, marker marker=<default>);
+void Drawline(picture pic=<default>, Label L=<default>, pair P, bool dirP=<default>, pair Q, bool dirQ=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
+bool defined(point P);
+pen addpenarc;
+pen addpenarc(pen p);
+point origin;
+point origin(coordsys R=<default>);
+vector unit(point M);
+vector unit(vector u);
+real perpfactor;
+bool collinear(vector u, vector v);
vector vector(coordsys R=<default>, pair v);
vector vector(point M);
-real[] intersect(path g, explicit pair p, real fuzz=<default>);
-real[] intersect(path g, explicit point P, real fuzz=<default>);
-int sgnd(real x);
-int sgnd(int x);
-circle excircle(point A, point B, point C);
-circle excircle(side side);
-point orthocenter(point A, point B, point C);
-point orthocenter(triangle t);
-line extend(line l);
-point intersectionpoint(line l1, line l2);
-point[] standardizecoordsys(coordsys R=<default>, bool warn=<default> ... point[] M);
+transform scaleO(real x);
+transform yscale(real k, point M);
+transform rotateO(real a);
+bool Finite(explicit point z);
+point conj(explicit point M);
+vector conj(explicit vector u);
+hyperbola conj(hyperbola h);
+real abs(coordsys R, pair m);
+real abs(explicit point M);
+point operator -(explicit point P);
+point operator -(explicit point P1, explicit point P2);
+point operator -(explicit point P1, explicit pair p2);
+point operator -(explicit pair p1, explicit point P2);
+point operator -(point M, explicit vector v);
+vector operator -(explicit vector v);
+point operator -(explicit pair m, explicit vector v);
+vector operator -(explicit vector v1, explicit vector v2);
+line operator -(line l, vector u);
+conic operator -(conic c, explicit point M);
+conic operator -(conic c, explicit pair m);
+conic operator -(conic c, vector v);
+circle operator -(explicit circle c, explicit point M);
+circle operator -(explicit circle c, pair m);
+circle operator -(explicit circle c, vector m);
+abscissa operator -(explicit abscissa a);
+abscissa operator -(real x, explicit abscissa a);
+abscissa operator -(explicit abscissa a, real x);
+abscissa operator -(int x, explicit abscissa a);
+arc operator -(explicit arc a, point M);
+arc operator -(explicit arc a, vector v);
+mass operator -(mass M1, mass M2);
+mass operator -(explicit mass M, real x);
+mass operator -(explicit mass M, int x);
+pair locate(point P);
+point locate(pair p);
+pair locate(explicit vector v);
+coordsys currentcoordsys;
+coordsys defaultcoordsys;
+real EPS;
+real binomial(real n, real k);
+real Infinity;
+void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, explicit line l1, explicit line l2, explicit pair align=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
+void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, explicit line l1, explicit line l2, explicit vector align, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
+pair coordinates(point M);
+real linemargin;
+real linemargin();
+bool isparabola(bqe bqe);
+int angularsystem;
+string massformat(string format=<default>, string s, mass M);
+conic conic(point F, line l, real e);
+conic conic(point M1, point M2, point M3, point M4, point M5);
+conic conic(bqe bqe);
+transform scale(real k, point M);
+transform scale(real k, point A, point B, point C, point D, bool safe=<default>);
+transform scale(real k, line l1, line l2, bool safe=<default>);
+point changecoordsys(coordsys R, point M);
+vector changecoordsys(coordsys R, vector v);
+line changecoordsys(coordsys R, line l);
+bqe changecoordsys(coordsys R, bqe bqe);
+conic changecoordsys(coordsys R, conic co);
+int conicnodesfactor;
+line radicalline(circle c1, circle c2);
+point isotomicconjugate(triangle t, point M);
+point operator +(explicit point P1, explicit point P2);
+point operator +(explicit point P1, explicit pair p2);
+point operator +(explicit pair p1, explicit point p2);
+point operator +(point M, explicit vector v);
+point operator +(explicit pair m, explicit vector v);
+vector operator +(explicit vector v1, explicit vector v2);
+line operator +(line l, vector u);
+conic operator +(conic c, explicit point M);
+conic operator +(conic c, explicit pair m);
+conic operator +(conic c, vector v);
+circle operator +(explicit circle c, explicit point M);
+circle operator +(explicit circle c, pair m);
+circle operator +(explicit circle c, vector m);
+abscissa operator +(real x, explicit abscissa a);
+abscissa operator +(explicit abscissa a, real x);
+abscissa operator +(int x, explicit abscissa a);
+arc operator +(explicit arc a, point M);
+arc operator +(explicit arc a, vector v);
+mass operator +(mass M1, mass M2);
+mass operator +(explicit mass M, real x);
+mass operator +(explicit mass M, int x);
+triangle tangential(triangle t);
+point arcsubtendedcenter(point A, point B, real angle);
+real rd(real x, real y, real z);
+bqe equation(ellipse el);
+bqe equation(parabola p);
+bqe equation(hyperbola h);
+bqe equation(explicit conic co);
+vector dir(vertex V);
+coordsys cartesiansystem(pair O=<default>, pair i, pair j);
+line bisector(line l1, line l2, real angle=<default>, bool sharp=<default>);
+line bisector(point A, point B, point C, point D, real angle=<default>, bool sharp=<default>);
+line bisector(segment s, real angle=<default>);
+line bisector(point A, point B, real angle=<default>);
+line bisector(vertex V, real angle=<default>);
+line bisector(side side);
+triangle pedal(triangle t, point M);
+line pedal(side side, point M);
+real length(explicit point M);
+real length(segment s);
+arc arc(ellipse el, real angle1, real angle2, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>, bool direction=<default>);
+arc arc(ellipse el, explicit abscissa x1, explicit abscissa x2, bool direction=<default>);
+arc arc(ellipse el, point M, point N, bool direction=<default>);
+arc arc(explicit arc a, abscissa x1, abscissa x2);
+arc arc(explicit arc a, point M, point N);
+path arc(explicit pair B, explicit pair A, explicit pair C, real r);
+point inverse(inversion i, point P);
+circle inverse(inversion i, line l);
+circle inverse(inversion i, circle c);
+arc inverse(inversion i, segment s);
+point midpoint(segment s);
+point midpoint(side side);
pair[] intersectionpoints(pair A, pair B, real a, real b, real c, real d, real f, real g);
pair[] intersectionpoints(pair A, pair B, real[] equation);
point[] intersectionpoints(line l, path g);
@@ -2316,104 +2539,45 @@ point[] intersectionpoints(arc a, conic co);
point[] intersectionpoints(arc a1, arc a2);
point[] intersectionpoints(line l, arc a);
point[] intersectionpoints(arc a, line l);
-point orthocentercenter(point A, point B, point C);
-point orthocentercenter(triangle t);
-point intouch(side side);
-triangle intouch(triangle t);
-real rf(real x, real y, real z);
-bool concurrent(... line[] l);
-real inradius(point A, point B, point C);
-real inradius(triangle t);
-pen addpenline;
-pen addpenline(pen p);
-pen addpenarc;
-pen addpenarc(pen p);
-void label(picture pic=<default>, Label L, explicit mass M, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label L, vertex V, pair align=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label LA=<default>, Label LB=<default>, Label LC=<default>, triangle t, real alignAngle=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
-real abs(coordsys R, pair m);
-real abs(explicit point M);
-point curpoint(line l, real x);
-point curpoint(explicit circle c, real x);
-point curpoint(explicit ellipse el, real x);
-point curpoint(explicit parabola p, real x);
-point curpoint(conic co, real x);
-point curpoint(arc a, real x);
-line bisector(line l1, line l2, real angle=<default>, bool sharp=<default>);
-line bisector(point A, point B, point C, point D, real angle=<default>, bool sharp=<default>);
-line bisector(segment s, real angle=<default>);
-line bisector(point A, point B, real angle=<default>);
-line bisector(vertex V, real angle=<default>);
-line bisector(side side);
-bqe canonical(bqe bqe);
-point bisectorpoint(side side);
-abscissa angabscissa(real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-abscissa angabscissa(int x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-abscissa angabscissa(circle c, point M);
-abscissa angabscissa(ellipse el, point M, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-abscissa angabscissa(hyperbola h, point M, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-abscissa angabscissa(parabola p, point M);
-abscissa angabscissa(explicit conic co, point M);
-abscissa angabscissa(arc a, point M);
-pair locate(point P);
-point locate(pair p);
-pair locate(explicit vector v);
-bool samecoordsys(bool warn=<default> ... point[] M);
-bool samecoordsys(bool warn=<default> ... bqe[] bqes);
-triangle extouch(triangle t);
-triangle extouch(side side);
-coordsys canonicalcartesiansystem(ellipse el);
-coordsys canonicalcartesiansystem(parabola p);
-coordsys canonicalcartesiansystem(hyperbola h);
-coordsys canonicalcartesiansystem(explicit conic co);
-arc arc(ellipse el, real angle1, real angle2, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>, bool direction=<default>);
-arc arc(ellipse el, explicit abscissa x1, explicit abscissa x2, bool direction=<default>);
-arc arc(ellipse el, point M, point N, bool direction=<default>);
-arc arc(explicit arc a, abscissa x1, abscissa x2);
-arc arc(explicit arc a, point M, point N);
-path arc(explicit pair B, explicit pair A, explicit pair C, real r);
-void markrightangle(picture pic=<default>, point A, point O, point B, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+transform yscaleO(real x);
+pair attract(pair m, path g, real fuzz=<default>);
+point attract(point M, path g, real fuzz=<default>);
+void addMargins(picture pic=<default>, real lmargin=<default>, real bmargin=<default>, real rmargin=<default>, real tmargin=<default>, bool rigid=<default>, bool allObject=<default>);
real epsgeo;
-real sharpangle(line l1, line l2);
-bool isparabola(bqe bqe);
-real sharpdegrees(line l1, line l2);
-real exradius(point A, point B, point C);
-real exradius(side side);
-abscissa nodabscissa(real x);
-abscissa nodabscissa(int x);
-abscissa nodabscissa(line l, point M);
-abscissa nodabscissa(circle c, point M);
-abscissa nodabscissa(ellipse el, point M);
-abscissa nodabscissa(parabola p, point M);
-abscissa nodabscissa(conic co, point M);
-abscissa nodabscissa(arc a, point M);
-coordsys coordsys(line l);
-coordsys coordsys(conic co);
-coordsys coordsys(ellipse el);
-pair coordinates(point M);
-real length(explicit point M);
-real length(segment s);
-int arcnodesnumber(explicit arc a);
-int nodesystem;
-bool collinear(vector u, vector v);
-point centroid(point A, point B, point C);
-point centroid(triangle t);
-bool between(point M, point O, point N);
-int angularsystem;
+bool degenerate(conic c);
+bool degenerate(circle c);
+bool degenerate(ellipse el);
path square(pair z1, pair z2);
-void filldraw(picture pic=<default>, circle c, pen fillpen=<default>, pen drawpen=<default>);
-void filldraw(picture pic=<default>, ellipse el, pen fillpen=<default>, pen drawpen=<default>);
-void filldraw(picture pic=<default>, triangle t, pen fillpen=<default>, pen drawpen=<default>);
-void filldraw(picture pic=<default>, triangle[] ts, pen fillpen=<default>, pen drawpen=<default>);
-point symmedian(triangle t);
-point symmedian(side side);
-line symmedian(vertex V);
-triangle symmedial(triangle t);
-int curvilinearsystem;
+int sgnd(real x);
+int sgnd(int x);
+bool byfoci;
+real[] realquarticroots(real a, real b, real c, real d, real e);
+line isotomic(vertex V, point M);
+point isotomic(side side, point M);
+triangle isotomic(triangle t, point M);
+int hyperbolanodesnumberfactor;
+int ellipsenodesnumber(real a, real b);
+int ellipsenodesnumber(real a, real b, real angle1, real angle2, bool dir);
+bool simeq(point A, point B, real fuzz=<default>);
+bool simeq(point a, real b, real fuzz=<default>);
+line reverse(line l);
+arc reverse(arc a);
+triangle triangle(line l1, line l2, line l3);
+void draw(picture pic=<default>, Label L=<default>, line l, bool dirA=<default>, bool dirB=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
+void draw(picture pic=<default>, Label[] L=<default>, line[] l, align align=<default>, pen[] p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label[] legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
+void draw(picture pic=<default>, Label[] L=<default>, line[] l, align align=<default>, pen p, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label[] legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
+void draw(picture pic=<default>, Label L=<default>, circle c, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void draw(picture pic=<default>, Label L=<default>, ellipse el, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void draw(picture pic=<default>, Label L=<default>, parabola parabola, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void draw(picture pic=<default>, Label L=<default>, hyperbola h, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void draw(picture pic=<default>, Label L=<default>, explicit conic co, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void draw(picture pic=<default>, Label L=<default>, arc a, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void draw(picture pic=<default>, triangle t, pen p=<default>, marker marker=<default>);
+void draw(picture pic=<default>, triangle[] ts, pen p=<default>, marker marker=<default>);
+path arcfromfocus(conic co, real angle1, real angle2, int n=<default>, bool direction=<default>);
bqe bqe(coordsys R=<default>, real a, real b, real c, real d, real e, real f);
bqe bqe(point M1, point M2, point M3, point M4, point M5);
-arc arccircle(point A, point M, point B);
-arc arccircle(point A, point B, real angle, bool direction=<default>);
+int[] numarray;
point relpoint(line l, real x);
point relpoint(explicit circle c, real x);
point relpoint(explicit ellipse el, real x);
@@ -2422,205 +2586,36 @@ point relpoint(explicit hyperbola h, real x);
point relpoint(explicit conic co, explicit real x);
point relpoint(explicit conic co, explicit int x);
point relpoint(arc a, real x);
-point changecoordsys(coordsys R, point M);
-vector changecoordsys(coordsys R, vector v);
-line changecoordsys(coordsys R, line l);
-bqe changecoordsys(coordsys R, bqe bqe);
-conic changecoordsys(coordsys R, conic co);
-real angle(explicit point M, coordsys R=<default>, bool warn=<default>);
-real angle(explicit vector v, coordsys R=<default>, bool warn=<default>);
-real angle(line l, coordsys R=<default>);
-real angle(line l1, line l2);
-real angle(arc a);
-point[] fermat(triangle t);
-real arclength(circle c);
-real arclength(ellipse el);
-real arclength(ellipse el, real angle1, real angle2, bool direction=<default>, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-real arclength(parabola p, real angle);
-real arclength(parabola p, real angle1, real angle2);
-real arclength(parabola p);
-real arclength(arc a);
-line reverse(line l);
-arc reverse(arc a);
-point gergonne(triangle t);
-real focusToCenter(ellipse el, real a);
-hyperbola hyperbola(point P1, point P2, real ae, bool byfoci=<default>);
-hyperbola hyperbola(point F1, point F2, point M);
-hyperbola hyperbola(point C, real a, real b, real angle=<default>);
-hyperbola hyperbola(bqe bqe);
-hyperbola hyperbola(point M1, point M2, point M3, point M4, point M5);
-side opposite(vertex V);
-vertex opposite(side side);
-int hyperbolanodesnumber(hyperbola h, real angle1, real angle2);
-path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)(conic co);
-int hyperbolanodesnumberfactor;
-line parallel(point M, line l);
-line parallel(point M, explicit vector dir);
-line parallel(point M, explicit pair dir);
-bool parallel(line l1, line l2, bool strictly=<default>);
-transform projection(point A, point B);
-transform projection(point A, point B, point C, point D, bool safe=<default>);
-transform projection(line l);
-transform projection(line l1, line l2, bool safe=<default>);
-bool degenerate(conic c);
-bool degenerate(circle c);
-bool degenerate(ellipse el);
-line line(point A, bool extendA=<default>, point B, bool extendB=<default>);
-line line(segment s);
-line line(real a, point A=<default>);
-line line(point A=<default>, real a);
-line line(int a, point A=<default>);
-line line(coordsys R=<default>, real slope, real origin);
-line line(coordsys R=<default>, real a, real b, real c);
-line line(circle c);
-line line(explicit side side);
-line complementary(explicit line l);
-line[] complementary(explicit segment s);
-arc complementary(arc a);
-point ppoint(arc a, real x);
-path fromFocus(conic co, real angle1, real angle2, int n, bool direction);
+arc arcsubtended(point A, point B, real angle);
+line[] operator ^^(line l1, line l2);
+line[] operator ^^(line l1, line[] l2);
+line[] operator ^^(line[] l2, line l1);
+line[] operator ^^(line[] l1, line[] l2);
+triangle[] operator ^^(triangle[] t1, triangle t2);
+triangle[] operator ^^(... triangle[] t);
+string conictype(bqe bqe);
+void fill(picture pic=<default>, circle c, pen p=<default>);
+void fill(picture pic=<default>, ellipse el, pen p=<default>);
+void fill(picture pic=<default>, triangle t, pen p=<default>);
+void fill(picture pic=<default>, triangle[] ts, pen p=<default>);
segment segment(point A, point B);
segment segment(line l);
segment segment(explicit side side);
+void dot(picture pic=<default>, Label L, explicit point Z, align align=<default>, string format=<default>, pen p=<default>);
+real dot(point A, point B);
+real dot(point A, explicit pair B);
+real dot(explicit pair A, point B);
+void dot(picture pic=<default>, Label L, explicit mass M, align align=<default>, string format=<default>, pen p=<default>);
+void dot(picture pic=<default>, triangle t, pen p=<default>);
+real sharpdegrees(line l1, line l2);
+int circlenodesnumber(real r);
+int circlenodesnumber(real r, real angle1, real angle2);
bool sameside(point M, point N, point O);
bool sameside(point M, point P, line l);
point[] sameside(point M, line l1, line l2);
-arc arcsubtended(point A, point B, real angle);
-void distance(picture pic=<default>, Label L=<default>, point A, point B, bool rotated=<default>, real offset=<default>, pen p=<default>, pen joinpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
-real distance(point M, line l);
-real distance(line l, point M);
-point incenter(point A, point B, point C);
-point incenter(triangle t);
void write(explicit line l);
void write(explicit segment s);
void write(trilinear tri);
-triangle incentral(triangle t);
-point arcsubtendedcenter(point A, point B, real angle);
-real Infinity;
-circle circle(explicit point C, real r);
-circle circle(point A, point B);
-circle circle(segment s);
-circle circle(point A, point B, point C);
-circle circle(triangle t);
-circle circle(inversion i);
-point angpoint(conic co, real angle);
-point angpoint(explicit circle c, real x);
-point angpoint(explicit ellipse el, real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-point angpoint(explicit parabola p, real x);
-point angpoint(explicit hyperbola h, real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
-point angpoint(arc a, real angle);
-triangle orthic(triangle t);
-int circlenodesnumber(real r);
-int circlenodesnumber(real r, real angle1, real angle2);
-path compassmark(pair O, pair A, real position, real angle=<default>);
-bool byvertices;
-int circlenodesnumberfactor;
-transform xscale(real k, point M);
-transform yscale(real k, point M);
-transform scale(real k, point M);
-transform scale(real k, point A, point B, point C, point D, bool safe=<default>);
-transform scale(real k, line l1, line l2, bool safe=<default>);
-point operator +(explicit point P1, explicit point P2);
-point operator +(explicit point P1, explicit pair p2);
-point operator +(explicit pair p1, explicit point p2);
-point operator +(point M, explicit vector v);
-point operator +(explicit pair m, explicit vector v);
-vector operator +(explicit vector v1, explicit vector v2);
-line operator +(line l, vector u);
-conic operator +(conic c, explicit point M);
-conic operator +(conic c, explicit pair m);
-conic operator +(conic c, vector v);
-circle operator +(explicit circle c, explicit point M);
-circle operator +(explicit circle c, pair m);
-circle operator +(explicit circle c, vector m);
-abscissa operator +(real x, explicit abscissa a);
-abscissa operator +(explicit abscissa a, real x);
-abscissa operator +(int x, explicit abscissa a);
-arc operator +(explicit arc a, point M);
-arc operator +(explicit arc a, vector v);
-mass operator +(mass M1, mass M2);
-mass operator +(explicit mass M, real x);
-mass operator +(explicit mass M, int x);
-point operator -(explicit point P);
-point operator -(explicit point P1, explicit point P2);
-point operator -(explicit point P1, explicit pair p2);
-point operator -(explicit pair p1, explicit point P2);
-point operator -(point M, explicit vector v);
-vector operator -(explicit vector v);
-point operator -(explicit pair m, explicit vector v);
-vector operator -(explicit vector v1, explicit vector v2);
-line operator -(line l, vector u);
-conic operator -(conic c, explicit point M);
-conic operator -(conic c, explicit pair m);
-conic operator -(conic c, vector v);
-circle operator -(explicit circle c, explicit point M);
-circle operator -(explicit circle c, pair m);
-circle operator -(explicit circle c, vector m);
-abscissa operator -(explicit abscissa a);
-abscissa operator -(real x, explicit abscissa a);
-abscissa operator -(explicit abscissa a, real x);
-abscissa operator -(int x, explicit abscissa a);
-arc operator -(explicit arc a, point M);
-arc operator -(explicit arc a, vector v);
-mass operator -(mass M1, mass M2);
-mass operator -(explicit mass M, real x);
-mass operator -(explicit mass M, int x);
-transform xscaleO(real x);
-pair operator *(coordsys R, pair p);
-path operator *(coordsys R, path g);
-coordsys operator *(transform t, coordsys R);
-point operator *(real x, explicit point P);
-point operator *(transform t, explicit point P);
-point operator *(explicit point P1, explicit point P2);
-point operator *(explicit point P1, explicit pair p2);
-point operator *(explicit pair p1, explicit point p2);
-vector operator *(real x, explicit vector v);
-vector operator *(transform t, explicit vector v);
-vector operator *(explicit point M, explicit vector v);
-line operator *(transform t, line l);
-line operator *(real x, line l);
-line operator *(int x, line l);
-line operator *(point M, line l);
-circle operator *(real x, explicit circle c);
-circle operator *(int x, explicit circle c);
-ellipse operator *(transform t, ellipse el);
-parabola operator *(transform t, parabola p);
-ellipse operator *(transform t, circle c);
-hyperbola operator *(transform t, hyperbola h);
-conic operator *(transform t, conic co);
-ellipse operator *(real x, ellipse el);
-abscissa operator *(real x, explicit abscissa a);
-abscissa operator *(explicit abscissa a, real x);
-arc operator *(transform t, explicit arc a);
-arc operator *(real x, explicit arc a);
-arc operator *(int x, explicit arc a);
-mass operator *(real x, explicit mass M);
-mass operator *(int x, explicit mass M);
-mass operator *(transform t, mass M);
-triangle operator *(transform T, triangle t);
-point operator *(inversion i, point P);
-circle operator *(inversion i, line l);
-circle operator *(inversion i, circle c);
-arc operator *(inversion i, segment s);
-path operator *(inversion i, triangle t);
-transform yscaleO(real x);
-coordsys operator init();
-point operator init();
-vector operator init();
-line operator init();
-segment operator init();
-bqe operator init();
-conic operator init();
-circle operator init();
-ellipse operator init();
-parabola operator init();
-hyperbola operator init();
-abscissa operator init();
-arc operator init();
-mass operator init();
-triangle operator init();
-trilinear operator init();
-inversion operator init();
pair operator cast(point P);
pair[] operator cast(point[] P);
point operator cast(pair p);
@@ -2662,13 +2657,26 @@ point operator cast(vertex V);
point operator cast(trilinear tri);
circle operator cast(inversion i);
inversion operator cast(circle c);
-path operator ecast(segment s);
-circle operator ecast(ellipse el);
-ellipse operator ecast(conic co);
-parabola operator ecast(conic co);
-hyperbola operator ecast(conic co);
-circle operator ecast(conic c);
-void lineinversion();
+real arclength(circle c);
+real arclength(ellipse el);
+real arclength(ellipse el, real angle1, real angle2, bool direction=<default>, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
+real arclength(parabola p, real angle);
+real arclength(parabola p, real angle1, real angle2);
+real arclength(parabola p);
+real arclength(arc a);
+void show(picture pic=<default>, Label lo=<default>, Label li=<default>, Label lj=<default>, coordsys R, pen dotpen=<default>, pen xpen=<default>, pen ypen=<default>, pen ipen=<default>, pen jpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
+void show(Label L, vector v, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
+void show(picture pic=<default>, line l, pen p=<default>);
+void show(picture pic=<default>, Label LA=<default>, Label LB=<default>, Label LC=<default>, Label La=<default>, Label Lb=<default>, Label Lc=<default>, triangle t, pen p=<default>, filltype filltype=<default>);
+triangle medial(triangle t);
+line complementary(explicit line l);
+line[] complementary(explicit segment s);
+arc complementary(arc a);
+point intersectionpoint(line l1, line l2);
+bool samecoordsys(bool warn=<default> ... point[] M);
+bool samecoordsys(bool warn=<default> ... bqe[] bqes);
+bool finite(explicit point p);
+transform vprojection(line l, bool safe=<default>);
pair operator /(pair p, coordsys R);
point operator /(explicit point P, real x);
point operator /(real x, explicit point P);
@@ -2684,155 +2692,250 @@ abscissa operator /(int x, explicit abscissa a);
arc operator /(explicit arc a, real x);
mass operator /(explicit mass M, real x);
mass operator /(explicit mass M, int x);
-transform scaleO(real x);
-real operator ^(point M, explicit circle c);
-bool operator ==(coordsys c1, coordsys c2);
-bool operator ==(explicit point M, explicit point N);
-bool operator ==(explicit vector u, explicit vector v);
-bool operator ==(line l1, line l2);
-bool operator !=(explicit point M, explicit point N);
-bool operator !=(line l1, line l2);
-line[] operator ^^(line l1, line l2);
-line[] operator ^^(line l1, line[] l2);
-line[] operator ^^(line[] l2, line l1);
-line[] operator ^^(line[] l1, line[] l2);
-triangle[] operator ^^(triangle[] t1, triangle t2);
-triangle[] operator ^^(... triangle[] t);
+void perpendicularmark(picture pic=<default>, point z, explicit pair align, explicit pair dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+void perpendicularmark(picture pic=<default>, point z, vector align, vector dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+void perpendicularmark(picture pic=<default>, point z, explicit pair align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+void perpendicularmark(picture pic=<default>, point z, vector align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+void perpendicularmark(picture pic=<default>, line l1, line l2, real size=<default>, pen p=<default>, int quarter=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+string defaultmassformat;
+int curvilinearsystem;
real elle(real phi, real k);
-point excenter(point A, point B, point C);
-point excenter(side side);
-mass mass(point M, real m);
-mass mass(explicit point P);
-mass mass(coordsys R, explicit pair p, real m);
-bool operator @(point m, line l);
-bool operator @(point M, conic co);
-bool operator @(point M, explicit circle c);
-bool operator @(point M, arc a);
-void fill(picture pic=<default>, circle c, pen p=<default>);
-void fill(picture pic=<default>, ellipse el, pen p=<default>);
-void fill(picture pic=<default>, triangle t, pen p=<default>);
-void fill(picture pic=<default>, triangle[] ts, pen p=<default>);
-triangle triangle(line l1, line l2, line l3);
-trilinear trilinear(triangle t, real a, real b, real c);
-trilinear trilinear(triangle t, point M);
-trilinear trilinear(triangle t, real f(real, real, real), real a=<default>, real b=<default>, real c=<default>);
-triangle triangleAbc(real alpha, real b, real c, real angle=<default>, point A=<default>);
-triangle triangleabc(real a, real b, real c, real angle=<default>, point A=<default>);
-triangle anticomplementary(triangle t);
-vector dir(vertex V);
+void label(picture pic=<default>, Label L, explicit mass M, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label L, vertex V, pair align=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label LA=<default>, Label LB=<default>, Label LC=<default>, triangle t, real alignAngle=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
+bool onpath(picture pic=<default>, path g, point M, pen p=<default>);
+pair operator *(coordsys R, pair p);
+path operator *(coordsys R, path g);
+coordsys operator *(transform t, coordsys R);
+point operator *(real x, explicit point P);
+point operator *(transform t, explicit point P);
+point operator *(explicit point P1, explicit point P2);
+point operator *(explicit point P1, explicit pair p2);
+point operator *(explicit pair p1, explicit point p2);
+vector operator *(real x, explicit vector v);
+vector operator *(transform t, explicit vector v);
+vector operator *(explicit point M, explicit vector v);
+line operator *(transform t, line l);
+line operator *(real x, line l);
+line operator *(int x, line l);
+line operator *(point M, line l);
+circle operator *(real x, explicit circle c);
+circle operator *(int x, explicit circle c);
+ellipse operator *(transform t, ellipse el);
+parabola operator *(transform t, parabola p);
+ellipse operator *(transform t, circle c);
+hyperbola operator *(transform t, hyperbola h);
+conic operator *(transform t, conic co);
+ellipse operator *(real x, ellipse el);
+abscissa operator *(real x, explicit abscissa a);
+abscissa operator *(explicit abscissa a, real x);
+arc operator *(transform t, explicit arc a);
+arc operator *(real x, explicit arc a);
+arc operator *(int x, explicit arc a);
+mass operator *(real x, explicit mass M);
+mass operator *(int x, explicit mass M);
+mass operator *(transform t, mass M);
+triangle operator *(transform T, triangle t);
+point operator *(inversion i, point P);
+circle operator *(inversion i, line l);
+circle operator *(inversion i, circle c);
+arc operator *(inversion i, segment s);
+path operator *(inversion i, triangle t);
+void markrightangle(picture pic=<default>, point A, point O, point B, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
+arc arccircle(point A, point M, point B);
+arc arccircle(point A, point B, real angle, bool direction=<default>);
+int nodesystem;
+transform rotate(explicit pair dir);
+transform rotate(explicit vector dir);
+transform rotate(explicit point dir);
+transform xscaleO(real x);
real degrees(explicit point M, coordsys R=<default>, bool warn=<default>);
real degrees(vector v, coordsys R=<default>, bool warn=<default>);
real degrees(line l, coordsys R=<default>);
real degrees(line l1, line l2);
real degrees(arc a);
-real linemargin;
-real linemargin();
-line Oy(coordsys R=<default>);
-line Oy;
-path fromCenter(conic co, real angle1, real angle2, int n, bool direction);
-void markarc(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, arc a, pen sectorpen=<default>, pen markpen=<default>, marginT margin(path, pen)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marker marker=<default>);
+path operator ecast(segment s);
+circle operator ecast(ellipse el);
+ellipse operator ecast(conic co);
+parabola operator ecast(conic co);
+hyperbola operator ecast(conic co);
+circle operator ecast(conic c);
real approximate(real t);
real[] approximate(real[] T);
-void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, explicit line l1, explicit line l2, explicit pair align=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
-void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, explicit line l1, explicit line l2, explicit vector align, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
-triangle cevian(triangle t, point P);
-point cevian(side side, point P);
-line cevian(vertex V, point P);
-transform hprojection(line l, bool safe=<default>);
-point conj(explicit point M);
-vector conj(explicit vector u);
-hyperbola conj(hyperbola h);
-transform vprojection(line l, bool safe=<default>);
-parabola parabola(point F, line l);
-parabola parabola(point F, point vertex);
-parabola parabola(point F, real a, real angle);
-parabola parabola(bqe bqe);
-parabola parabola(point M1, point M2, point M3, line l);
-parabola parabola(point M1, point M2, point M3, point M4, point M5);
-bool onpath(picture pic=<default>, path g, point M, pen p=<default>);
-int parabolanodesnumber(parabola p, real angle1, real angle2);
-int parabolanodesnumberfactor;
-path NoModifier(path);
-coordsys currentcoordsys;
-point foot(vertex V);
-point foot(side side);
-path currentpolarconicroutine(conic co, real angle1, real angle2, int n, bool direction);
-transform rotate(explicit pair dir);
-transform rotate(explicit vector dir);
-transform rotate(explicit point dir);
-real EPS;
-transform rotateO(real a);
-pair attract(pair m, path g, real fuzz=<default>);
-point attract(point M, path g, real fuzz=<default>);
-line perpendicular(point M, line l);
-line perpendicular(point M, explicit vector normal);
-line perpendicular(point M, explicit pair normal);
-bool perpendicular(line l1, line l2);
-void perpendicular(picture pic=<default>, pair z, pair align, pair dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-void perpendicular(picture pic=<default>, pair z, pair align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-real binomial(real n, real k);
-void perpendicularmark(picture pic=<default>, point z, explicit pair align, explicit pair dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-void perpendicularmark(picture pic=<default>, point z, vector align, vector dir=<default>, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-void perpendicularmark(picture pic=<default>, point z, explicit pair align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-void perpendicularmark(picture pic=<default>, point z, vector align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-void perpendicularmark(picture pic=<default>, line l1, line l2, real size=<default>, pen p=<default>, int quarter=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-void Drawline(picture pic=<default>, Label L=<default>, pair P, bool dirP=<default>, pair Q, bool dirQ=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
-bool simeq(point A, point B, real fuzz=<default>);
-bool simeq(point a, real b, real fuzz=<default>);
-point inverse(inversion i, point P);
-circle inverse(inversion i, line l);
-circle inverse(inversion i, circle c);
-arc inverse(inversion i, segment s);
-inversion inversion(circle c1, circle c2, real sgn=<default>);
-inversion inversion(circle c1, circle c2, circle c3);
-inversion inversion(circle c);
-coordsys cartesiansystem(pair O=<default>, pair i, pair j);
-line tangent(circle c, abscissa x);
-line tangent(circle c, point M);
-line tangent(circle c, explicit vector v);
-line tangent(ellipse el, abscissa x);
-line tangent(parabola p, abscissa x);
-line tangent(hyperbola h, abscissa x);
-line tangent(explicit arc a, abscissa x);
-line tangent(explicit arc a, point M);
line[] tangents(circle c, point M);
line[] tangents(ellipse el, point M);
line[] tangents(parabola p, point M);
line[] tangents(hyperbola h, point M);
-real centerToFocus(ellipse el, real a);
-bqe equation(ellipse el);
-bqe equation(parabola p);
-bqe equation(hyperbola h);
-bqe equation(explicit conic co);
-triangle tangential(triangle t);
-triangle pedal(triangle t, point M);
-line pedal(side side, point M);
-string massformat(string format=<default>, string s, mass M);
-int relativesystem;
+path compassmark(pair O, pair A, real position, real angle=<default>);
+circle circumcircle(point A, point B, point C);
+circle circumcircle(triangle t);
+triangle triangleAbc(real alpha, real b, real c, real angle=<default>, point A=<default>);
+bool between(point M, point O, point N);
+point centroid(point A, point B, point C);
+point centroid(triangle t);
+void markarc(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, arc a, pen sectorpen=<default>, pen markpen=<default>, marginT margin(path, pen)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marker marker=<default>);
void drawline(picture pic=<default>, triangle t, pen p=<default>);
-void addMargins(picture pic=<default>, real lmargin=<default>, real bmargin=<default>, real rmargin=<default>, real tmargin=<default>, bool rigid=<default>, bool allObject=<default>);
-real[] bangles(picture pic=<default>, parabola p);
-real[][] bangles(picture pic=<default>, hyperbola h);
-triangle medial(triangle t);
-line median(vertex V);
-line median(side side);
-void show(picture pic=<default>, Label lo=<default>, Label li=<default>, Label lj=<default>, coordsys R, pen dotpen=<default>, pen xpen=<default>, pen ypen=<default>, pen ipen=<default>, pen jpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
-void show(Label L, vector v, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
-void show(picture pic=<default>, line l, pen p=<default>);
-void show(picture pic=<default>, Label LA=<default>, Label LB=<default>, Label LC=<default>, Label La=<default>, Label Lb=<default>, Label Lc=<default>, triangle t, pen p=<default>, filltype filltype=<default>);
-line isotomic(vertex V, point M);
-point isotomic(side side, point M);
-triangle isotomic(triangle t, point M);
-abscissa curabscissa(real x);
-abscissa curabscissa(int x);
-abscissa curabscissa(line l, point M);
-abscissa curabscissa(circle c, point M);
-abscissa curabscissa(ellipse el, point M);
-abscissa curabscissa(parabola p, point M);
-abscissa curabscissa(conic co, point M);
-abscissa curabscissa(arc a, point M);
-locateT operator init();
+path NoModifier(path);
+path arctopath(arc a, int n);
+point[] standardizecoordsys(coordsys R=<default>, bool warn=<default> ... point[] M);
+ellipse ellipse(point F1, point F2, real a);
+ellipse ellipse(point F1, point F2, point M);
+ellipse ellipse(point C, real a, real b, real angle=<default>);
+ellipse ellipse(bqe bqe);
+ellipse ellipse(point M1, point M2, point M3, point M4, point M5);
+side opposite(vertex V);
+vertex opposite(side side);
+void filldraw(picture pic=<default>, circle c, pen fillpen=<default>, pen drawpen=<default>);
+void filldraw(picture pic=<default>, ellipse el, pen fillpen=<default>, pen drawpen=<default>);
+void filldraw(picture pic=<default>, triangle t, pen fillpen=<default>, pen drawpen=<default>);
+void filldraw(picture pic=<default>, triangle[] ts, pen fillpen=<default>, pen drawpen=<default>);
+point point(coordsys R, pair p, real m=<default>);
+point point(explicit pair p, real m);
+point point(coordsys R, explicit point M, real m=<default>);
+point point(explicit vector u);
+point point(circle c, abscissa l);
+point point(ellipse el, abscissa l);
+point point(parabola p, abscissa l);
+point point(hyperbola h, abscissa l);
+point point(explicit conic co, abscissa l);
+point point(line l, abscissa x);
+point point(line l, explicit real x);
+point point(line l, explicit int x);
+point point(explicit circle c, explicit real x);
+point point(explicit circle c, explicit int x);
+point point(explicit ellipse el, explicit real x);
+point point(explicit ellipse el, explicit int x);
+point point(explicit parabola p, explicit real x);
+point point(explicit parabola p, explicit int x);
+point point(explicit hyperbola h, explicit real x);
+point point(explicit hyperbola h, explicit int x);
+point point(explicit conic co, explicit real x);
+point point(explicit conic co, explicit int x);
+point point(arc a, abscissa l);
+point point(arc a, real x);
+pair point(explicit arc a, int x);
+point point(explicit mass m);
+point point(explicit vertex V);
+point point(trilinear tri);
+point point(circle c, point M);
+point point(circle c, explicit vector v);
+transform xscale(real k, point M);
+real rf(real x, real y, real z);
+mass mass(point M, real m);
+mass mass(explicit point P);
+mass mass(coordsys R, explicit pair p, real m);
+void lineinversion();
+pen addpenline;
+pen addpenline(pen p);
+point orthocentercenter(point A, point B, point C);
+point orthocentercenter(triangle t);
+bool concurrent(... line[] l);
+int conicnodesnumber(conic co, real angle1, real angle2, bool dir=<default>);
+path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)(conic co);
+circle circle(explicit point C, real r);
+circle circle(point A, point B);
+circle circle(segment s);
+circle circle(point A, point B, point C);
+circle circle(triangle t);
+circle circle(inversion i);
+point incenter(point A, point B, point C);
+point incenter(triangle t);
+transform projection(point A, point B);
+transform projection(point A, point B, point C, point D, bool safe=<default>);
+transform projection(line l);
+transform projection(line l1, line l2, bool safe=<default>);
+point ppoint(arc a, real x);
+bool inside(ellipse el, point M);
+bool inside(parabola p, point M);
+path fromCenter(conic co, real angle1, real angle2, int n, bool direction);
+point bisectorpoint(side side);
+bool byvertices;
+int[] tricoef(side side);
+real angle(explicit point M, coordsys R=<default>, bool warn=<default>);
+real angle(explicit vector v, coordsys R=<default>, bool warn=<default>);
+real angle(line l, coordsys R=<default>);
+real angle(line l1, line l2);
+real angle(arc a);
+real[] intersect(path g, explicit pair p, real fuzz=<default>);
+real[] intersect(path g, explicit point P, real fuzz=<default>);
+bool operator !=(explicit point M, explicit point N);
+bool operator !=(line l1, line l2);
+triangle extouch(triangle t);
+triangle extouch(side side);
+bool operator ==(coordsys c1, coordsys c2);
+bool operator ==(explicit point M, explicit point N);
+bool operator ==(explicit vector u, explicit vector v);
+bool operator ==(line l1, line l2);
+surface bispline(real[][] z, real[][] p, real[][] q, real[][] r, real[] x, real[] y, bool[][] cond=<default>);
+real[][][] bispline(real[][] f, real[] x, real[] y, real[] xsplinetype(real[], real[])=<default>, real[] ysplinetype(real[], real[])=<default>, bool[][] cond=<default>);
+bool vperiodic(real[][] a);
+bool vperiodic(triple[][] a);
+bool uperiodic(real[][] a);
+bool uperiodic(triple[][] a);
+void labelz3(picture pic=<default>, Label L=<default>, real z, align align=<default>, string format=<default>, pen p=<default>);
+void labelz(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
+void ztick3(picture pic=<default>, real z, triple dir=<default>, real size=<default>, pen p=<default>);
+void ztick3(picture pic=<default>, Label L, real z, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+real ScaleZ(picture pic=<default>, real z);
+real[][] ScaleZ(picture pic=<default>, real[][] P);
+void axes3(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, Label zlabel=<default>, bool extend=<default>, triple min=<default>, triple max=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, projection P=<default>);
+void zlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
+void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, projection P=<default>);
+void autoscale3(picture pic=<default>, void axis(picture, axisT));
+void zaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>, projection P=<default>);
+void xaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>, projection P=<default>);
+triple defaultdir(triple X, triple Y, triple Z, bool opposite=<default>, projection P);
+real ztrans(real[][] t, real z);
+void XYZero(picture, axisT)(triple align=<default>, bool extend=<default>);
+void XYZero(picture, axisT);
+real[][][] bispline0(real[][] z, real[][] p, real[][] q, real[][] r, real[] x, real[] y, bool[][] cond=<default>);
+void XYEquals(picture, axisT)(real x, real y, triple align=<default>, bool extend=<default>);
+void XZEquals(picture, axisT)(real x, real z, triple align=<default>, bool extend=<default>);
+void YZEquals(picture, axisT)(real y, real z, triple align=<default>, bool extend=<default>);
+void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P);
+void Ticks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks=<default>, real[] ticks=<default>, int N=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void Ticks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+triple Dir(real)(triple dir);
+void XZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
+void XZZero(picture, axisT);
+void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, projection P=<default>);
+void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P);
+void Bounds(picture, axisT)(int type=<default>, int type2=<default>, triple align=<default>, bool extend=<default>);
+void Bounds(picture, axisT);
+real ScaleX(picture pic=<default>, real x);
+void labely(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
+ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, triple dir(real));
+real maxlength(triple f(pair z), pair a, pair b, int nu, int nv);
+void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P);
+path3 Circle(triple c, real r, triple normal=<default>, int n=<default>);
+void labelx(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
+real ytrans(real[][] t, real y);
+real xtrans(real[][] t, real x);
+void axis(picture pic=<default>, Label L=<default>, path3 g, path3 g2=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P), ticklocate locate, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, int[] divisor=<default>, bool above=<default>, bool opposite=<default>);
+void limits(picture pic=<default>, triple min, triple max);
void Straight(flatguide3)(... void(flatguide3)[]);
+void NoTicks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)();
+void NoTicks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P);
+void polargraph(flatguide3)(real r(real, real), real theta(real), real phi(real), int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void labeltick(picture pic, real[][] T, path3 g, ticklocate locate, real val, int sign, real Size, string ticklabel(real), Label F, real norm=<default>);
+void Spline(flatguide3)(... void(flatguide3)[]);
+void drawtick(picture pic, real[][] T, path3 g, path3 g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
+void xtick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
+void xtick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void labelaxis(picture pic, real[][] T, Label L, path3 g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
+void ytick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
+void ytick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+path3 Arc(triple c, triple v1, triple v2, triple normal=<default>, bool direction=<default>, int n=<default>);
+path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, bool direction, int n=<default>);
+path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, int n=<default>);
+path3[] segment(triple[] v, bool[] cond, void join(flatguide3)(... void(flatguide3)[])=<default>);
+triple polar(real r, real theta, real phi);
void graph(flatguide3)(triple F(real), real, real, int)(void join(flatguide3)(... void(flatguide3)[]));
void(flatguide3)[] graph(triple F(real), real, real, int)(void join(flatguide3)(... void(flatguide3)[]), bool3 cond(real));
void graph(flatguide3)(picture pic=<default>, real x(real), real y(real), real z(real), real a, real b, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
@@ -2847,30 +2950,33 @@ void graph(flatguide3)(triple F(path, real), path p, int n=<default>, void join(
void graph(flatguide3)(triple F(pair), path p, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
void graph(flatguide3)(picture pic=<default>, real f(pair), path p, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
void graph(flatguide3)(real f(pair), path p, int n=<default>, real T(pair), void join(flatguide3)(... void(flatguide3)[])=<default>);
+void tick(picture pic=<default>, triple v, triple dir, real size=<default>, pen p=<default>);
+void tick(picture pic=<default>, Label L, real value, triple v, triple dir, string format=<default>, real size=<default>, pen p=<default>);
+void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, projection P=<default>);
+void labelx3(picture pic=<default>, Label L=<default>, real x, align align=<default>, string format=<default>, pen p=<default>);
+void xtick3(picture pic=<default>, real x, triple dir=<default>, real size=<default>, pen p=<default>);
+void xtick3(picture pic=<default>, Label L, real x, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void draw(picture pic=<default>, Label[] L=<default>, void(flatguide3)[][] g, pen[] p, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
+void draw(picture pic=<default>, Label[] L=<default>, void(flatguide3)[][] g, pen p=<default>, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
+triple Scale(picture pic=<default>, triple v);
+triple[][] Scale(picture pic=<default>, triple[][] P);
+void ztick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
+void ztick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void yaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>, projection P)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>, projection P=<default>);
+void label(picture pic, Label L, triple v, real x, align align, string format, pen p);
+picture vectorfield(path3 vector(pair v), triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, bool truesize=<default>, real maxlength=<default>, bool cond(pair z)=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, string name=<default>, render render=<default>);
+real[] uniform(real T(real x), real Tinv(real x), real a, real b, int n);
void(flatguide3)[][] lift(real f(real x, real y), guide[][] g, void join(flatguide3)(... void(flatguide3)[])=<default>);
void(flatguide3)[][] lift(real f(pair z), guide[][] g, void join(flatguide3)(... void(flatguide3)[])=<default>);
-triple polar(real r, real theta, real phi);
-void polargraph(flatguide3)(real r(real, real), real theta(real), real phi(real), int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void xaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
-void yaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
-void zaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
-void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
-void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
-void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
-bool uperiodic(real[][] a);
-bool uperiodic(triple[][] a);
-bool vperiodic(real[][] a);
-bool vperiodic(triple[][] a);
-void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
-void axis(picture pic=<default>, Label L=<default>, path3 g, path3 g2=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>), ticklocate locate, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, int[] divisor=<default>, bool above=<default>, bool opposite=<default>);
-void Bounds(picture, axisT)(int type=<default>, int type2=<default>, triple align=<default>, bool extend=<default>);
-void Bounds(picture, axisT);
-void XZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
-void XZZero(picture, axisT);
void YZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
void YZZero(picture, axisT);
+void labely3(picture pic=<default>, Label L=<default>, real y, align align=<default>, string format=<default>, pen p=<default>);
+real ScaleY(picture pic=<default>, real y);
+void ytick3(picture pic=<default>, real y, triple dir=<default>, real size=<default>, pen p=<default>);
+void ytick3(picture pic=<default>, Label L, real y, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+triple ticklabelshift(triple align, pen p=<default>);
+triple tickMax3(picture pic);
+triple tickMin3(picture pic);
surface surface(picture pic=<default>, triple[][] f, bool[][] cond=<default>);
surface surface(picture pic=<default>, real[][] f, real[] x, real[] y, real[] xsplinetype(real[], real[])=<default>, real[] ysplinetype(real[], real[])=<default>, bool[][] cond=<default>);
surface surface(picture pic=<default>, real[][] f, pair a, pair b, real[] xsplinetype(real[], real[]), real[] ysplinetype(real[], real[])=<default>, bool[][] cond=<default>);
@@ -2880,482 +2986,403 @@ surface surface(picture pic=<default>, triple f(pair z), real[] u, real[] v, rea
surface surface(picture pic=<default>, triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, real[](real[], real[])[] usplinetype, real[](real[], real[])[] vsplinetype=<default>, bool cond(pair z)=<default>);
surface surface(picture pic=<default>, real f(pair z), pair a, pair b, int nx=<default>, int ny=<default>, bool cond(pair z)=<default>);
surface surface(picture pic=<default>, real f(pair z), pair a, pair b, int nx=<default>, int ny=<default>, real[] xsplinetype(real[], real[]), real[] ysplinetype(real[], real[])=<default>, bool cond(pair z)=<default>);
-void XYEquals(picture, axisT)(real x, real y, triple align=<default>, bool extend=<default>);
-triple Dir(real)(triple dir);
-void draw(picture pic=<default>, Label[] L=<default>, void(flatguide3)[][] g, pen[] p, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
-void draw(picture pic=<default>, Label[] L=<default>, void(flatguide3)[][] g, pen p=<default>, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
-void Ticks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks=<default>, real[] ticks=<default>, int N=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void Ticks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-real maxlength(triple f(pair z), pair a, pair b, int nu, int nv);
-void drawtick(picture pic, real[][] T, path3 g, path3 g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
-triple tickMin3(picture pic);
-triple tickMax3(picture pic);
-triple Scale(picture pic=<default>, triple v);
-triple[][] Scale(picture pic=<default>, triple[][] P);
-real ScaleX(picture pic=<default>, real x);
-real ScaleY(picture pic=<default>, real y);
-real ScaleZ(picture pic=<default>, real z);
-real[][] ScaleZ(picture pic=<default>, real[][] P);
-picture vectorfield(path3 vector(pair v), triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, bool truesize=<default>, real maxlength=<default>, bool cond(pair z)=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, string name=<default>, render render=<default>);
-path3 Circle(triple c, real r, triple normal=<default>, int n=<default>);
-void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
-void Spline(flatguide3)(... void(flatguide3)[]);
-void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
-void axes3(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, Label zlabel=<default>, bool extend=<default>, triple min=<default>, triple max=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>);
-void label(picture pic, Label L, triple v, real x, align align, string format, pen p);
-void labelx(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
-void labelx3(picture pic=<default>, Label L=<default>, real x, align align=<default>, string format=<default>, pen p=<default>);
-void labeltick(picture pic, real[][] T, path3 g, ticklocate locate, real val, int sign, real Size, string ticklabel(real), Label F, real norm=<default>);
-void labelaxis(picture pic, real[][] T, Label L, path3 g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
-void labely(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
-void labely3(picture pic=<default>, Label L=<default>, real y, align align=<default>, string format=<default>, pen p=<default>);
-void labelz(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
-void labelz3(picture pic=<default>, Label L=<default>, real z, align align=<default>, string format=<default>, pen p=<default>);
-void autoscale3(picture pic=<default>, void axis(picture, axisT));
-void xtick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
-void xtick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void xtick3(picture pic=<default>, real x, triple dir=<default>, real size=<default>, pen p=<default>);
-void xtick3(picture pic=<default>, Label L, real x, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void ytick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
-void ytick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void ytick3(picture pic=<default>, real y, triple dir=<default>, real size=<default>, pen p=<default>);
-void ytick3(picture pic=<default>, Label L, real y, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void ztick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
-void ztick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void ztick3(picture pic=<default>, real z, triple dir=<default>, real size=<default>, pen p=<default>);
-void ztick3(picture pic=<default>, Label L, real z, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-triple defaultdir(triple X, triple Y, triple Z, bool opposite=<default>, projection P);
-real xtrans(real[][] t, real x);
-real ytrans(real[][] t, real y);
-real ztrans(real[][] t, real z);
-ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, triple dir(real));
-triple ticklabelshift(triple align, pen p=<default>);
-path3 Arc(triple c, triple v1, triple v2, triple normal=<default>, bool direction=<default>, int n=<default>);
-path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, bool direction, int n=<default>);
-path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, int n=<default>);
-void limits(picture pic=<default>, triple min, triple max);
-void XZEquals(picture, axisT)(real x, real z, triple align=<default>, bool extend=<default>);
-void YZEquals(picture, axisT)(real y, real z, triple align=<default>, bool extend=<default>);
-void XYZero(picture, axisT)(triple align=<default>, bool extend=<default>);
-void XYZero(picture, axisT);
-void zlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
-void tick(picture pic=<default>, triple v, triple dir, real size=<default>, pen p=<default>);
-void tick(picture pic=<default>, Label L, real value, triple v, triple dir, string format=<default>, real size=<default>, pen p=<default>);
-surface bispline(real[][] z, real[][] p, real[][] q, real[][] r, real[] x, real[] y, bool[][] cond=<default>);
-real[][][] bispline(real[][] f, real[] x, real[] y, real[] xsplinetype(real[], real[])=<default>, real[] ysplinetype(real[], real[])=<default>, bool[][] cond=<default>);
-real[][][] bispline0(real[][] z, real[][] p, real[][] q, real[][] r, real[] x, real[] y, bool[][] cond=<default>);
-path3[] segment(triple[] v, bool[] cond, void join(flatguide3)(... void(flatguide3)[])=<default>);
-real[] uniform(real T(real x), real Tinv(real x), real a, real b, int n);
-void NoTicks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)();
-void NoTicks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
-string DefaultFormat(real);
-string DefaultLogFormat(real)(int base);
-string DefaultLogFormat(real);
-guide graph(pair f(real), real, real, int)(guide join(... guide[]));
-guide[] graph(pair f(real), real, real, int)(guide join(... guide[]), bool3 cond(real));
-guide graph(picture pic=<default>, real f(real), real a, real b, int n=<default>, real T(real)=<default>, guide join(... guide[])=<default>);
-guide[] graph(picture pic=<default>, real f(real), real a, real b, int n=<default>, real T(real)=<default>, bool3 cond(real), guide join(... guide[])=<default>);
-guide graph(picture pic=<default>, real x(real), real y(real), real a, real b, int n=<default>, real T(real)=<default>, guide join(... guide[])=<default>);
-guide[] graph(picture pic=<default>, real x(real), real y(real), real a, real b, int n=<default>, real T(real)=<default>, bool3 cond(real), guide join(... guide[])=<default>);
-guide graph(picture pic=<default>, pair z(real), real a, real b, int n=<default>, real T(real)=<default>, guide join(... guide[])=<default>);
-guide[] graph(picture pic=<default>, pair z(real), real a, real b, int n=<default>, real T(real)=<default>, bool3 cond(real), guide join(... guide[])=<default>);
-guide graph(picture pic=<default>, pair[] z, guide join(... guide[])=<default>);
-guide[] graph(picture pic=<default>, pair[] z, bool3[] cond, guide join(... guide[])=<default>);
-guide graph(picture pic=<default>, real[] x, real[] y, guide join(... guide[])=<default>);
-guide[] graph(picture pic=<default>, real[] x, real[] y, bool3[] cond, guide join(... guide[])=<default>);
-guide graphwithderiv(pair f(real), pair fprime(real), real a, real b, int n=<default>);
-scientific scientific(real x);
-void Left(picture, axisT)(bool extend=<default>);
-void Left(picture, axisT);
-autoscaleT defaultS;
-void XEquals(picture, axisT)(real x, bool extend=<default>);
-void YEquals(picture, axisT)(real y, bool extend=<default>);
-string LogFormat(real)(int base);
-string LogFormat(real);
-axisT axis;
-void axis(picture pic=<default>, Label L=<default>, path g, path g2=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>), ticklocate locate, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, int[] divisor=<default>, bool above=<default>, bool opposite=<default>);
-void drawtick(frame f, transform T, path g, path g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
-void errorbar(picture pic, pair z, pair dp, pair dm, pen p=<default>, real size=<default>);
-void errorbars(picture pic=<default>, pair[] z, pair[] dp, pair[] dm=<default>, bool[] cond=<default>, pen p=<default>, real size=<default>);
-void errorbars(picture pic=<default>, real[] x, real[] y, real[] dpx, real[] dpy, real[] dmx=<default>, real[] dmy=<default>, bool[] cond=<default>, pen p=<default>, real size=<default>);
-void errorbars(picture pic=<default>, real[] x, real[] y, real[] dpy, bool[] cond=<default>, pen p=<default>, real size=<default>);
-void xlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
-string conditionlength;
-void ylimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
-tickvalues None(tickvalues v);
-scaleT Logarithmic;
-void limits(picture pic=<default>, pair min, pair max, bool crop=<default>);
-void crop(picture pic=<default>);
-picture vectorfield(path vector(real), path g, int n, bool truesize=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
-picture vectorfield(path vector(pair), pair a, pair b, int nx=<default>, int ny=<default>, bool truesize=<default>, bool cond(pair z)=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
-string OmitFormat(real)(string s=<default> ... real[] x);
-guide Straight(... guide[]);
-int Min;
-string trailingzero;
-void label(picture pic, Label L, pair z, real x, align align, string format, pen p);
-void labelx(picture pic=<default>, Label L=<default>, explicit pair z, align align=<default>, string format=<default>, pen p=<default>);
-void labelx(picture pic=<default>, Label L=<default>, real x, align align=<default>, string format=<default>, pen p=<default>);
-void labelx(picture pic=<default>, Label L, string format=<default>, explicit pen p=<default>);
+path Circle(pair c, real r, int n=<default>);
path Arc(pair c, real r, real angle1, real angle2, bool direction, int n=<default>);
path Arc(pair c, real r, real angle1, real angle2, int n=<default>);
path Arc(pair c, explicit pair z1, explicit pair z2, bool direction=<default>, int n=<default>);
-pair labeltick(frame d, transform T, path g, ticklocate locate, real val, pair side, int sign, real Size, string ticklabel(real), Label F, real norm=<default>);
-void labelaxis(frame f, transform T, Label L, path g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
+guide polargraph(picture pic=<default>, real r(real), real a, real b, int n=<default>, guide join(... guide[])=<default>);
+guide polargraph(picture pic=<default>, real[] r, real[] theta, guide join(... guide[])=<default>);
+void checkconditionlength(int x, int y);
+guide Hermite(... guide[])(real[] splinetype(real[], real[]));
+guide Hermite(... guide[]);
+guide Straight(... guide[]);
+picture secondaryY(picture primary=<default>, void f(picture));
+picture secondaryX(picture primary=<default>, void f(picture));
+string noprimary;
void labely(picture pic=<default>, Label L=<default>, explicit pair z, align align=<default>, string format=<default>, pen p=<default>);
void labely(picture pic=<default>, Label L=<default>, real y, align align=<default>, string format=<default>, pen p=<default>);
void labely(picture pic=<default>, Label L, string format=<default>, explicit pen p=<default>);
-tickvalues OmitTickIntervals(tickvalues)(real[] a, real[] b);
-tickvalues OmitTickInterval(tickvalues)(real a, real b);
-tickvalues OmitTick(tickvalues)(... real[] x);
-void xtick(picture pic=<default>, explicit pair z, pair dir=<default>, real size=<default>, pen p=<default>);
-void xtick(picture pic=<default>, real x, pair dir=<default>, real size=<default>, pen p=<default>);
-void xtick(picture pic=<default>, Label L, explicit pair z, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void xtick(picture pic=<default>, Label L, real x, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void labelx(picture pic=<default>, Label L=<default>, explicit pair z, align align=<default>, string format=<default>, pen p=<default>);
+void labelx(picture pic=<default>, Label L=<default>, real x, align align=<default>, string format=<default>, pen p=<default>);
+void labelx(picture pic=<default>, Label L, string format=<default>, explicit pen p=<default>);
void ytick(picture pic=<default>, explicit pair z, pair dir=<default>, real size=<default>, pen p=<default>);
void ytick(picture pic=<default>, real y, pair dir=<default>, real size=<default>, pen p=<default>);
void ytick(picture pic=<default>, Label L, explicit pair z, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
void ytick(picture pic=<default>, Label L, real y, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-picture secondaryX(picture primary=<default>, void f(picture));
-picture secondaryY(picture primary=<default>, void f(picture));
-Label Break;
-tickvalues Break(tickvalues)(real, real);
-scaleT Linear;
-scaleT Linear(bool automin=<default>, bool automax=<default>, real s=<default>, real intercept=<default>);
-pair tickMin(picture pic);
-pair tickMax(picture pic);
-string autoformat(string format=<default>, real norm ... real[] a);
-real linear(real)(real S(real x)=<default>, real Min, real Max);
-pair polar(real r, real theta);
-string Format(real)(string s=<default>);
-guide polargraph(picture pic=<default>, real r(real), real a, real b, int n=<default>, guide join(... guide[])=<default>);
-guide polargraph(picture pic=<default>, real[] r, real[] theta, guide join(... guide[])=<default>);
-void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
-tickvalues NoZero(tickvalues);
-string NoZeroFormat(real);
-guide Hermite(... guide[])(real[] splinetype(real[], real[]));
-guide Hermite(... guide[]);
-path Circle(pair c, real r, int n=<default>);
-void xaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
-void yaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
+void xtick(picture pic=<default>, explicit pair z, pair dir=<default>, real size=<default>, pen p=<default>);
+void xtick(picture pic=<default>, real x, pair dir=<default>, real size=<default>, pen p=<default>);
+void xtick(picture pic=<default>, Label L, explicit pair z, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void xtick(picture pic=<default>, Label L, real x, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+real ScaleX(picture pic=<default>, real x);
void xaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
-void yaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool autorotate=<default>);
-bool axiscoverage(int N, transform T, path g, ticklocate locate, real Step, pair side, int sign, real Size, Label F, string ticklabel(real), real norm, real limit);
-scaleT Broken(real a, real b, bool automin=<default>, bool automax=<default>);
-scaleT BrokenLog(real a, real b, bool automin=<default>, bool automax=<default>);
+void limits(picture pic=<default>, pair min, pair max, bool crop=<default>);
+void crop(picture pic=<default>);
+void ylimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
+real ytrans(transform t, real y);
+real xtrans(transform t, real x);
+void YEquals(picture, axisT)(real y, bool extend=<default>);
+void LeftRight(picture, axisT)(bool extend=<default>);
+void LeftRight(picture, axisT);
+void Right(picture, axisT)(bool extend=<default>);
+void Right(picture, axisT);
+void Left(picture, axisT)(bool extend=<default>);
+void Left(picture, axisT);
+axisT axis;
+void axis(picture pic=<default>, Label L=<default>, path g, path g2=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>), ticklocate locate, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, int[] divisor=<default>, bool above=<default>, bool opposite=<default>);
+int Both;
+int Max;
+int Min;
+guide graphwithderiv(pair f(real), pair fprime(real), real a, real b, int n=<default>);
+pair tickMax(picture pic);
+void RightTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void RightTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void RightTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
+tickvalues OmitTickIntervals(tickvalues)(real[] a, real[] b);
void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks=<default>, real[] ticks=<default>, int N=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
-string noprimary;
-path[] segment(pair[] z, bool[] cond, guide join(... guide[])=<default>);
-void xequals(picture pic=<default>, Label L=<default>, real x, bool extend=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
-void yequals(picture pic=<default>, Label L=<default>, real y, bool extend=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
-pair Scale(picture pic=<default>, pair z);
-real ScaleX(picture pic=<default>, real x);
-real ScaleY(picture pic=<default>, real y);
tickvalues generateticks(int sign, Label F=<default>, string ticklabel(real)=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, real Size=<default>, real size=<default>, transform T, pair side, path g, real limit, pen p, ticklocate locate, int[] divisor, bool opposite);
-void checkconditionlength(int x, int y);
-real xtrans(transform t, real x);
+string autoformat(string format=<default>, real norm ... real[] a);
+void labelaxis(frame f, transform T, Label L, path g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
+void axes(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, bool extend=<default>, pair min=<default>, pair max=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
+pair labeltick(frame d, transform T, path g, ticklocate locate, real val, pair side, int sign, real Size, string ticklabel(real), Label F, real norm=<default>);
+void drawtick(frame f, transform T, path g, path g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
+ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, pair dir(real)=<default>);
+autoscaleT defaultS;
+string LogFormat(real)(int base);
+string LogFormat(real);
+string DefaultLogFormat(real)(int base);
+string DefaultLogFormat(real);
+string DefaultFormat(real);
+string signedtrailingzero;
+string Format(real)(string s=<default>);
+bounds autoscale(real Min, real Max, scaleT scale=<default>);
+void autoscale(picture pic=<default>, void axis(picture, axisT));
+real upscale(real b, real a);
+int[] divisors(int a, int b);
+scaleT BrokenLog(real a, real b, bool automin=<default>, bool automax=<default>);
+scaleT Broken(real a, real b, bool automin=<default>, bool automax=<default>);
+string baselinetemplate;
+scaleT Logarithmic;
+scaleT Log;
+scaleT Log(bool automin=<default>, bool automax=<default>);
+guide Spline(... guide[]);
+void errorbar(picture pic, pair z, pair dp, pair dm, pen p=<default>, real size=<default>);
+void tick(picture pic=<default>, pair z, pair dir, real size=<default>, pen p=<default>);
+void tick(picture pic=<default>, Label L, real value, explicit pair z, pair dir, string format=<default>, real size=<default>, pen p=<default>);
+void YZero(picture, axisT)(bool extend=<default>);
+void YZero(picture, axisT);
void Top(picture, axisT)(bool extend=<default>);
void Top(picture, axisT);
-real ytrans(transform t, real y);
+tickvalues None(tickvalues v);
+void yaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
+string conditionlength;
+pair polar(real r, real theta);
void scale(picture pic=<default>, scaleT x, scaleT y=<default>, scaleT z=<default>);
void scale(picture pic=<default>, bool xautoscale=<default>, bool yautoscale=<default>, bool zautoscale=<default>);
-int[] divisors(int a, int b);
-scientific operator init();
-bounds operator init();
-ticklocate operator init();
-locateT operator init();
-tickvalues operator init();
-axisT operator init();
-int Both;
-void axes(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, bool extend=<default>, pair min=<default>, pair max=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
-string signedtrailingzero;
-ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, pair dir(real)=<default>);
-pair ticklabelshift(pair align, pen p=<default>);
+guide graph(pair f(real), real, real, int)(guide join(... guide[]));
+guide[] graph(pair f(real), real, real, int)(guide join(... guide[]), bool3 cond(real));
+guide graph(picture pic=<default>, real f(real), real a, real b, int n=<default>, real T(real)=<default>, guide join(... guide[])=<default>);
+guide[] graph(picture pic=<default>, real f(real), real a, real b, int n=<default>, real T(real)=<default>, bool3 cond(real), guide join(... guide[])=<default>);
+guide graph(picture pic=<default>, real x(real), real y(real), real a, real b, int n=<default>, real T(real)=<default>, guide join(... guide[])=<default>);
+guide[] graph(picture pic=<default>, real x(real), real y(real), real a, real b, int n=<default>, real T(real)=<default>, bool3 cond(real), guide join(... guide[])=<default>);
+guide graph(picture pic=<default>, pair z(real), real a, real b, int n=<default>, real T(real)=<default>, guide join(... guide[])=<default>);
+guide[] graph(picture pic=<default>, pair z(real), real a, real b, int n=<default>, real T(real)=<default>, bool3 cond(real), guide join(... guide[])=<default>);
+guide graph(picture pic=<default>, pair[] z, guide join(... guide[])=<default>);
+guide[] graph(picture pic=<default>, pair[] z, bool3[] cond, guide join(... guide[])=<default>);
+guide graph(picture pic=<default>, real[] x, real[] y, guide join(... guide[])=<default>);
+guide[] graph(picture pic=<default>, real[] x, real[] y, bool3[] cond, guide join(... guide[])=<default>);
+void XZero(picture, axisT)(bool extend=<default>);
+void XZero(picture, axisT);
pair zero(real);
+path[] segment(pair[] z, bool[] cond, guide join(... guide[])=<default>);
+string trailingzero;
+void xlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
+void yaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool autorotate=<default>);
+void XEquals(picture, axisT)(real x, bool extend=<default>);
+void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)();
+void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
+scaleT Linear;
+scaleT Linear(bool automin=<default>, bool automax=<default>, real s=<default>, real intercept=<default>);
+string OmitFormat(real)(string s=<default> ... real[] x);
+bool logaxiscoverage(int N, transform T, path g, ticklocate locate, pair side, int sign, real Size, Label F, string ticklabel(real), real limit, int first, int last);
+tickvalues OmitTick(tickvalues)(... real[] x);
+picture vectorfield(path vector(real), path g, int n, bool truesize=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
+picture vectorfield(path vector(pair), pair a, pair b, int nx=<default>, int ny=<default>, bool truesize=<default>, bool cond(pair z)=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
+pair Scale(picture pic=<default>, pair z);
+void label(picture pic, Label L, pair z, real x, align align, string format, pen p);
void Bottom(picture, axisT)(bool extend=<default>);
void Bottom(picture, axisT);
+real linear(real)(real S(real)=<default>, real Min, real Max);
+void xaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
+int Value;
+void xequals(picture pic=<default>, Label L=<default>, real x, bool extend=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
+void yequals(picture pic=<default>, Label L=<default>, real y, bool extend=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
+tickvalues OmitTickInterval(tickvalues)(real a, real b);
+tickvalues NoZero(tickvalues);
void BottomTop(picture, axisT)(bool extend=<default>);
void BottomTop(picture, axisT);
+pair tickMin(picture pic);
+scientific scientific(real x);
+void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
+Label Break;
+tickvalues Break(tickvalues)(real, real);
real zerotickfuzz;
-real upscale(real b, real a);
-bool logaxiscoverage(int N, transform T, path g, ticklocate locate, pair side, int sign, real Size, Label F, string ticklabel(real), real limit, int first, int last);
-string baselinetemplate;
-void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)();
-void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
-void tick(picture pic=<default>, pair z, pair dir, real size=<default>, pen p=<default>);
-void tick(picture pic=<default>, Label L, real value, explicit pair z, pair dir, string format=<default>, real size=<default>, pen p=<default>);
-int Value;
-scaleT Log;
-scaleT Log(bool automin=<default>, bool automax=<default>);
-void Right(picture, axisT)(bool extend=<default>);
-void Right(picture, axisT);
-void RightTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void RightTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void RightTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
-int Max;
-void XZero(picture, axisT)(bool extend=<default>);
-void XZero(picture, axisT);
-void YZero(picture, axisT)(bool extend=<default>);
-void YZero(picture, axisT);
-bounds autoscale(real Min, real Max, scaleT scale=<default>);
-void autoscale(picture pic=<default>, void axis(picture, axisT));
-guide Spline(... guide[]);
-void LeftRight(picture, axisT)(bool extend=<default>);
-void LeftRight(picture, axisT);
-bool Crop;
-int ngraph;
-real epsilon;
+real ScaleY(picture pic=<default>, real y);
+bool axiscoverage(int N, transform T, path g, ticklocate locate, real Step, pair side, int sign, real Size, Label F, string ticklabel(real), real norm, real limit);
+string NoZeroFormat(real);
+pair ticklabelshift(pair align, pen p=<default>);
+void errorbars(picture pic=<default>, pair[] z, pair[] dp, pair[] dm=<default>, bool[] cond=<default>, pen p=<default>, real size=<default>);
+void errorbars(picture pic=<default>, real[] x, real[] y, real[] dpx, real[] dpy, real[] dmx=<default>, real[] dmy=<default>, bool[] cond=<default>, pen p=<default>, real size=<default>);
+void errorbars(picture pic=<default>, real[] x, real[] y, real[] dpy, bool[] cond=<default>, pen p=<default>, real size=<default>);
real axiscoverage;
+int nmesh;
+bool Crop;
real Ticksize;
-bool NoCrop;
-real ticksize;
int nCircle;
-int nmesh;
-real ylabelwidth;
real axislabelfactor;
+bool NoCrop;
+real epsilon;
+int ngraph;
+real ylabelwidth;
+real ticksize;
+guide hermite(real[] x, real[] y, real[] splinetype(real[], real[])=<default>);
+real[] monotonic(real[] x, real[] y);
real[] clamped(real[], real[])(real slopea, real slopeb);
real[] natural(real[] x, real[] y);
-real[] monotonic(real[] x, real[] y);
+real[] periodic(real[] x, real[] y);
real[] notaknot(real[] x, real[] y);
-real[] linear(real[] x, real[] y);
-string morepoints;
-guide hermite(real[] x, real[] y, real[] splinetype(real[], real[])=<default>);
-void checklengths(int x, int y, string text=<default>);
void checkincreasing(real[] x);
-real[] periodic(real[] x, real[] y);
+void checklengths(int x, int y, string text=<default>);
string differentlengths;
+string morepoints;
real[] Spline(real[] x, real[] y);
real[](real[], real[])[] Spline;
-grid3(picture pic)[] YXYgrid(position pos=<default>);
-grid3(picture pic)[] YXYgrid;
-grid3 operator init();
-ticksgridT operator init();
-grid3(picture pic)[] operator cast(grid3 gridroutine(picture pic));
-grid3(picture pic)[][] operator cast(grid3(picture pic)[] gridroutine);
-grid3(picture pic)[][] operator cast(grid3 gridroutine(picture pic));
-triple X(picture pic);
-triple Y(picture pic);
-triple Z(picture pic);
-position middle;
-grid3(picture pic)[] XYXgrid(position pos=<default>);
-grid3(picture pic)[] XYXgrid;
-grid3(picture pic)[] XY_XZgrid(position posa=<default>, position posb=<default>);
-grid3(picture pic)[] XY_XZgrid;
+real[] linear(real[] x, real[] y);
+void grid3(picture pic=<default>, grid3(picture pic)[][] gridroutine=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, pen pGrid=<default>, pen pgrid=<default>, bool above=<default>);
+void grid3(picture pic=<default>, grid3(picture pic)[][] gridroutine, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, pen[] pGrid, pen[] pgrid, bool above=<default>);
+grid3(picture pic)[][] XYZgrid(position pos=<default>);
+grid3(picture pic)[][] XYZgrid;
grid3(picture pic)[] ZX_ZYgrid(position posa=<default>, position posb=<default>);
grid3(picture pic)[] ZX_ZYgrid;
-grid3 XYgrid(picture pic)(position pos=<default>);
-grid3 XYgrid(picture pic);
+grid3(picture pic)[] XY_XZgrid(position posa=<default>, position posb=<default>);
+grid3(picture pic)[] XY_XZgrid;
+grid3(picture pic)[] YZYgrid(position pos=<default>);
+grid3(picture pic)[] YZYgrid;
+grid3(picture pic)[] ZYZgrid(position pos=<default>);
+grid3(picture pic)[] ZYZgrid;
grid3 ZYgrid(picture pic)(position pos=<default>);
grid3 ZYgrid(picture pic);
-void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
-void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
-void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
-void grid3(picture pic=<default>, grid3(picture pic)[][] gridroutine=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, pen pGrid=<default>, pen pgrid=<default>, bool above=<default>);
-void grid3(picture pic=<default>, grid3(picture pic)[][] gridroutine, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, pen[] pGrid, pen[] pgrid, bool above=<default>);
+grid3 ZXgrid(picture pic)(position pos=<default>);
+grid3 ZXgrid(picture pic);
+grid3 XYgrid(picture pic)(position pos=<default>);
+grid3 XYgrid(picture pic);
+grid3(picture pic)[] XYXgrid(position pos=<default>);
+grid3(picture pic)[] XYXgrid;
ticksgridT OutTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
-triple YZ(picture pic);
-triple ZX(picture pic);
+void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
+void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
+ticksgridT InTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
+position bottom;
grid3(picture pic)[] ZXZgrid(position pos=<default>);
grid3(picture pic)[] ZXZgrid;
-grid3(picture pic)[] XZXgrid(position pos=<default>);
-grid3(picture pic)[] XZXgrid;
-position top;
-ticksgridT InTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
-ticksgridT InOutTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
grid3(picture pic)[] YX_YZgrid(position posa=<default>, position posb=<default>);
grid3(picture pic)[] YX_YZgrid;
-position bottom;
+grid3(picture pic)[] YXYgrid(position pos=<default>);
+grid3(picture pic)[] YXYgrid;
+triple X(picture pic);
+triple YZ(picture pic);
+triple Z(picture pic);
+ticksgridT InOutTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
+triple XY(picture pic);
+triple ZX(picture pic);
+triple Y(picture pic);
+void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
+position top;
grid3 YXgrid(picture pic)(position pos=<default>);
grid3 YXgrid(picture pic);
-grid3 ZXgrid(picture pic)(position pos=<default>);
-grid3 ZXgrid(picture pic);
-triple XY(picture pic);
-grid3(picture pic)[][] XYZgrid(position pos=<default>);
-grid3(picture pic)[][] XYZgrid;
-grid3(picture pic)[] ZYZgrid(position pos=<default>);
-grid3(picture pic)[] ZYZgrid;
+grid3(picture pic)[] operator cast(grid3 gridroutine(picture pic));
+grid3(picture pic)[][] operator cast(grid3(picture pic)[] gridroutine);
+grid3(picture pic)[][] operator cast(grid3 gridroutine(picture pic));
+position middle;
grid3 XZgrid(picture pic)(position pos=<default>);
grid3 XZgrid(picture pic);
+grid3(picture pic)[] XZXgrid(position pos=<default>);
+grid3(picture pic)[] XZXgrid;
grid3 YZgrid(picture pic)(position pos=<default>);
grid3 YZgrid(picture pic);
-grid3(picture pic)[] YZYgrid(position pos=<default>);
-grid3(picture pic)[] YZYgrid;
real fspline(real)(real[] x, real[] y, real[] splinetype(real[], real[])=<default>);
real pwhermite(real)(real[] x, real[] y, real[] dy);
horner diffdiv(real[] x, real[] y);
-horner hdiffdiv(real[] x, real[] y, real[] dy);
-horner operator init();
real fhorner(real)(horner sh);
+horner hdiffdiv(real[] x, real[] y, real[] dy);
surface labelpath(string s, path3 p, real angle=<default>, triple optional=<default>);
-triple[] firstframe(path3 p, triple optional=<default>);
-triple[] nextframe(path3 p, real reltimestart, triple[] start, real reltimeend, int subdiv=<default>);
-real eps;
triple nextnormal(triple p, triple q);
-void labelpath(frame f, Label L, path g, string justify=<default>, pen p=<default>);
-void labelpath(picture pic=<default>, Label L, path g, string justify=<default>, pen p=<default>);
+real eps;
+triple[] nextframe(path3 p, real reltimestart, triple[] start, real reltimeend, int subdiv=<default>);
+triple[] firstframe(path3 p, triple optional=<default>);
+string RightJustified;
string LeftJustified;
string Centered;
-string RightJustified;
+void labelpath(frame f, Label L, path g, string justify=<default>, pen p=<default>);
+void labelpath(picture pic=<default>, Label L, path g, string justify=<default>, pen p=<default>);
+void lm_minimize(int m_dat, int n_par, real[] par, void evaluate(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info), void printout(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev), lm_data_type data, lm_control_type control);
+void lm_lmdif(int m, int n, real[] x, real[] fvec, real ftol, real xtol, real gtol, int maxfev, real epsfcn, real[] diag, int mode, real factor, lm_int_type info, lm_int_type nfev, real[] fjac, int[] ipvt, real[] qtf, real[] wa1, real[] wa2, real[] wa3, real[] wa4, void evaluate(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info), void printout(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev), lm_data_type data);
+void lm_print_quiet(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev);
+void lm_evaluate_default(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info);
string[] lm_infmsg;
-void lm_qrfac(int m, int n, real[] a, bool pivot, int[] ipvt, real[] rdiag, real[] acnorm, real[] wa);
-void lm_qrsolv(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real[] x, real[] sdiag, real[] wa);
-FitControl defaultControl;
-real LM_MACHEP;
real LM_SQRT_DWARF;
+real LM_DWARF;
+void lm_qrsolv(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real[] x, real[] sdiag, real[] wa);
+real LM_USERTOL;
real LM_SQRT_GIANT;
-void lm_lmpar(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real delta, lm_real_type par, real[] x, real[] sdiag, real[] wa1, real[] wa2);
-void lm_lmdif(int m, int n, real[] x, real[] fvec, real ftol, real xtol, real gtol, int maxfev, real epsfcn, real[] diag, int mode, real factor, lm_int_type info, lm_int_type nfev, real[] fjac, int[] ipvt, real[] qtf, real[] wa1, real[] wa2, real[] wa3, real[] wa4, void evaluate(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info), void printout(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev), lm_data_type data);
-void lm_minimize(int m_dat, int n_par, real[] par, void evaluate(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info), void printout(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev), lm_data_type data, lm_control_type control);
-FitResult fit(real[] xdata, real[] ydata, real[] errors, real function(real[], real), real[] parameters, FitControl control=<default>);
-FitResult fit(real[] xdata, real[] ydata, real function(real[], real), real[] parameters, FitControl control=<default>);
-real lm_enorm(int n, real[] x, int offset=<default>);
-lm_data_type operator init();
-lm_int_type operator init();
-lm_real_type operator init();
-lm_control_type operator init();
-FitControl operator init();
-FitResult operator init();
-real SQR(real x);
-string[] lm_shortmsg;
-void lm_evaluate_default(real[] par, int m_dat, real[] fvec, lm_data_type data, lm_int_type info);
string pad(string str, int count, string pad=<default>);
string pad(int num, int digits, string pad=<default>);
string pad(real num, int digits, string pad=<default>);
-real LM_USERTOL;
-real LM_DWARF;
-void lm_print_quiet(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev);
+real lm_enorm(int n, real[] x, int offset=<default>);
+string[] lm_shortmsg;
+void lm_lmpar(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real delta, lm_real_type par, real[] x, real[] sdiag, real[] wa1, real[] wa2);
+real SQR(real x);
+FitControl defaultControl;
+real LM_MACHEP;
void lm_print_default(int n_par, real[] par, int m_dat, real[] fvec, lm_data_type data, int iflag, int iter, int nfev);
-real barmarksize(pen p=<default>);
-real barmarksizefactor;
+FitResult fit(real[] xdata, real[] ydata, real[] errors, real function(real[], real), real[] parameters, FitControl control=<default>);
+FitResult fit(real[] xdata, real[] ydata, real function(real[], real), real[] parameters, FitControl control=<default>);
+FitControl operator init();
+void lm_qrfac(int m, int n, real[] a, bool pivot, int[] ipvt, real[] rdiag, real[] acnorm, real[] wa);
+marker TildeIntervalMarker(int i=<default>, int n=<default>, real size=<default>, real space=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, frame uniform=<default>, bool above=<default>);
marker CrossIntervalMarker(int i=<default>, int n=<default>, real size=<default>, real space=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, frame uniform=<default>, bool above=<default>);
-marker StickIntervalMarker(int i=<default>, int n=<default>, real size=<default>, real space=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, frame uniform=<default>, bool above=<default>);
-frame crossframe(int n=<default>, real size=<default>, pair space=<default>, real angle=<default>, pair offset=<default>, pen p=<default>);
-real crossmarksize(pen p=<default>);
-real crossmarksizefactor;
-frame stickframe(int n=<default>, real size=<default>, pair space=<default>, real angle=<default>, pair offset=<default>, pen p=<default>);
-frame stickframe;
-real stickmarksize(pen p=<default>);
-real stickmarkspace(pen p=<default>);
+real markanglespace(pen p=<default>);
+real markanglespace;
+real barmarksizefactor;
real stickmarksizefactor;
-real stickmarkspacefactor;
-frame duplicate(path g, int n=<default>, pair space=<default>, pen p=<default>);
-marker CircleBarIntervalMarker(int i=<default>, int n=<default>, real barsize=<default>, real radius=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, filltype filltype=<default>, bool circleabove=<default>, frame uniform=<default>, bool above=<default>);
-frame circlebarframe(int n=<default>, real barsize=<default>, real radius=<default>, real angle=<default>, pair offset=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-real circlemarkradius(pen p=<default>);
-real circlemarkradiusfactor;
-marker operator *(transform T, marker m);
-marker TildeIntervalMarker(int i=<default>, int n=<default>, real size=<default>, real space=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, frame uniform=<default>, bool above=<default>);
frame tildeframe(int n=<default>, real size=<default>, pair space=<default>, real angle=<default>, pair offset=<default>, pen p=<default>);
frame tildeframe;
real tildemarksize(pen p=<default>);
real tildemarksizefactor;
+frame stickframe(int n=<default>, real size=<default>, pair space=<default>, real angle=<default>, pair offset=<default>, pen p=<default>);
+frame stickframe;
+frame circlebarframe(int n=<default>, real barsize=<default>, real radius=<default>, real angle=<default>, pair offset=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+real stickmarkspace(pen p=<default>);
+real barmarksize(pen p=<default>);
+real markangleradiusfactor;
+real markanglespacefactor;
+marker StickIntervalMarker(int i=<default>, int n=<default>, real size=<default>, real space=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, frame uniform=<default>, bool above=<default>);
void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, pair A, pair O, pair B, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
-real markanglespace(pen p=<default>);
-real markanglespace;
+real circlemarkradiusfactor;
+real crossmarksize(pen p=<default>);
+marker operator *(transform T, marker m);
real markangleradius(pen p=<default>);
real markangleradius;
-real markanglespacefactor;
-real markangleradiusfactor;
+frame duplicate(path g, int n=<default>, pair space=<default>, pen p=<default>);
+real stickmarkspacefactor;
+real circlemarkradius(pen p=<default>);
+real stickmarksize(pen p=<default>);
+frame crossframe(int n=<default>, real size=<default>, pair space=<default>, real angle=<default>, pair offset=<default>, pen p=<default>);
+marker CircleBarIntervalMarker(int i=<default>, int n=<default>, real barsize=<default>, real radius=<default>, real angle=<default>, pair offset=<default>, bool rotated=<default>, pen p=<default>, filltype filltype=<default>, bool circleabove=<default>, frame uniform=<default>, bool above=<default>);
+real crossmarksizefactor;
void markinterval(picture pic=<default>, frame f, path g)(int n=<default>, frame f, bool rotated=<default>);
-real[] partialsum(real[] a);
-real[] partialsum(real[] a, real[] dx);
-int[] partialsum(int[] a);
-int[] partialsum(int[] a, int[] dx);
-real cot(real x);
-int unique(real[] a, real x);
-int unique(string[] a, string x);
-int quadrant(real degrees);
-pair exp(explicit pair z);
-string nopoint;
-real intersect(pair p, pair q, pair z);
-real intersect(triple P, triple Q, triple n, triple Z);
+real findroot(real f(real), real a, real b, real tolerance=<default>, real fa=<default>, real fb=<default>);
+real[] leastsquares(real[][] A, real[] b, bool warn=<default>);
+real[] zero(int n);
+real[][] zero(int n, int m);
+int[][] segment(bool[] b);
+real asec(real x);
+bool polygon(path p);
real interpolate(real[] x, real[] y, real x0, int i);
real interpolate(real[] x, real[] y, real x0);
triple intersectionpoint(triple n0, triple P0, triple n1, triple P1);
-pair[] quarticroots(real a, real b, real c, real d, real e);
+bool increasing(real[] a, bool strict=<default>);
bool lexorder(pair a, pair b);
bool lexorder(triple a, triple b);
-bool square(real[][] m);
-real sec(real x);
+pair[][] fft(pair[][] a, int sign=<default>);
+real csc(real x);
+real slope(path g, real x, int n=<default>, real fuzz=<default>);
+real slope(path g, explicit pair z, int n=<default>, real fuzz=<default>);
bool rectangular(real[][] m);
bool rectangular(pair[][] m);
bool rectangular(triple[][] m);
-bool polygon(path p);
-pair unityroot(int n, int k=<default>);
+void drawline(picture pic=<default>, pair P, pair Q, pen p=<default>);
+int unique(real[] a, real x);
+int unique(string[] a, string x);
+real intersect(pair p, pair q, pair z);
+real intersect(triple P, triple Q, triple n, triple Z);
real acot(real x);
-int[][] segmentlimits(bool[] b);
-int[][] segment(bool[] b);
-pair[][] fft(pair[][] a, int sign=<default>);
-real slope(path g, real x, int n=<default>, real fuzz=<default>);
-real slope(path g, explicit pair z, int n=<default>, real fuzz=<default>);
-picture grid(int Nx, int Ny, pen p=<default>);
-rootfinder_settings operator init();
+int quadrant(real degrees);
+pair unityroot(int n, int k=<default>);
+real sec(real x);
+real cot(real x);
+real acsc(real x);
real frac(real x);
-real asec(real x);
+pair log(explicit pair z);
+pair exp(explicit pair z);
+picture grid(int Nx, int Ny, pen p=<default>);
+real[] partialsum(real[] a);
+real[] partialsum(real[] a, real[] dx);
+int[] partialsum(int[] a);
+int[] partialsum(int[] a, int[] dx);
+int[][] segmentlimits(bool[] b);
+bool square(real[][] m);
+string nopoint;
real time(path g, real x, int n=<default>, real fuzz=<default>);
real time(path g, explicit pair z, int n=<default>, real fuzz=<default>);
-real[] leastsquares(real[][] A, real[] b, bool warn=<default>);
-bool increasing(real[] a, bool strict=<default>);
-real[] zero(int n);
-real[][] zero(int n, int m);
-real findroot(real f(real), real a, real b, real tolerance=<default>, real fa=<default>, real fb=<default>);
-real acsc(real x);
real value(path g, real x, int n=<default>, real fuzz=<default>);
real value(path g, explicit pair z, int n=<default>, real fuzz=<default>);
-real csc(real x);
-pair log(explicit pair z);
-void drawline(picture pic=<default>, pair P, pair Q, pen p=<default>);
+pair[] quarticroots(real a, real b, real c, real d, real e);
path cutbefore(path p, path q);
-path cutafter(path p, path q);
path cuttings;
+path cutafter(path p, path q);
void draw(picture pic=<default>, obj o, light light=<default>);
obj operator *(real[][] T, obj o);
-obj operator init();
-real[][] finiteDifferenceJacobian(real[] f(real[]), real[] t, real[] h=<default>);
-RKTableau E_Euler;
+real[] solveBVP(real[] f(real, real[]), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>, real[] initial(real[]), real[] discrepancy(real[]), real[] guess, int iterations=<default>);
real error(real error, real initial, real lowOrder, real norm, real diff);
-RKTableau RK5;
-real stepfactor;
-solution integrate(real y, real c=<default>, real f(real t, real y), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>);
-Solution integrate(real[] y, real[] f(real t, real[] y), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>);
+RKTableau RK5DP;
+RKTableau RK5F;
RKTableau RK4;
-real[] newton(int iterations=<default>, real[] f(real[]), real[][] jacobian(real[]), real[] t);
-real phi1(real x);
-RKTableau RK3;
-void expfactors(real x, coefficients a);
-real phi2(real x);
-void report(real old, real h, real t);
-real[] solveBVP(real[] f(real, real[]), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>, real[] initial(real[]), real[] discrepancy(real[]), real[] guess, int iterations=<default>);
-RKTableau Euler;
RKTableau E_PC;
+RKTableau PC;
+RKTableau E_RK2;
RKTableau RK2;
+RKTableau RK3BS;
+real stepfactor;
+RKTableau RK3;
+RKTableau Euler;
+void expfactors(real x, coefficients a);
real phi3(real x);
+void report(real old, real h, real t);
+real[] Coeff;
+RKTableau E_Euler;
+RKTableau E_RK3BS;
void write(solution S);
void write(Solution S);
-coefficients operator init();
-RKTableau operator init();
-solution operator init();
-Solution operator init();
-RKTableau E_RK2;
-RKTableau RK3BS;
-RKTableau RK5F;
-real phi4(real x);
+real[] newton(int iterations=<default>, real[] f(real[]), real[][] jacobian(real[]), real[] t);
real adjust(real h, real error, real tolmin, real tolmax, RKTableau tableau);
-RKTableau RK5DP;
-real[] Coeff;
-RKTableau PC;
-RKTableau E_RK3BS;
-pen[] Grayscale(int NColors=<default>);
+real phi4(real x);
+real phi2(real x);
+RKTableau RK5;
+real phi1(real x);
+real[][] finiteDifferenceJacobian(real[] f(real[]), real[] t, real[] h=<default>);
+solution integrate(real y, real c=<default>, real f(real t, real y), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>);
+Solution integrate(real[] y, real[] f(real t, real[] y), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>);
+pen[] BWRainbow2(int NColors=<default>);
+pen[] quantize(pen[] Palette, int n);
+pen[] BWRainbow(int NColors, bool two);
+pen[] BWRainbow(int NColors=<default>);
pen[] Wheel(int NColors=<default>);
+void PaletteTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, pen pTick=<default>, pen ptick=<default>);
+void PaletteTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>);
+pen[] palette(real[] f, pen[] palette);
+pen[][] palette(real[][] f, pen[] palette);
+void palette(picture pic=<default>, Label L=<default>, bounds bounds, pair initial, pair final, void axis(picture, axisT)=<default>, pen[] palette, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>)=<default>, bool copy=<default>, bool antialias=<default>);
+bounds Full(picture pic, real min, real max);
+bounds Automatic(picture pic, real min, real max);
+pen[] Rainbow(int NColors=<default>);
+pen[] Grayscale(int NColors=<default>);
+bounds Range(picture pic, real min, real max)(bool automin=<default>, real min=<default>, bool automax=<default>, real max=<default>);
void image(frame f, real[][] data, pair initial, pair final, pen[] palette, bool transpose=<default>, transform t=<default>, bool copy=<default>, bool antialias=<default>);
void image(frame f, pen[][] data, pair initial, pair final, bool transpose=<default>, transform t=<default>, bool copy=<default>, bool antialias=<default>);
bounds image(picture pic=<default>, real[][] f, bounds range(picture pic, real min, real max)=<default>, pair initial, pair final, pen[] palette, int divs=<default>, bool transpose=<default>, bool copy=<default>, bool antialias=<default>);
@@ -3364,537 +3391,949 @@ void image(picture pic=<default>, pen[][] data, pair initial, pair final, bool t
void image(picture pic=<default>, pen f(int, int), int width, int height, pair initial, pair final, bool transpose=<default>, bool antialias=<default>);
bounds image(picture pic=<default>, pair[] z, real[] f, bounds range(picture pic, real min, real max)=<default>, pen[] palette);
bounds image(picture pic=<default>, real[] x, real[] y, real[] f, bounds range(picture pic, real min, real max)=<default>, pen[] palette);
+pen[] adjust(picture pic, real min, real max, real rmin, real rmax, pen[] palette);
pen[] cmyk(pen[] Palette);
-pen[] BWRainbow(int NColors, bool two);
-pen[] BWRainbow(int NColors=<default>);
-pen[] BWRainbow2(int NColors=<default>);
+void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>);
transform swap;
-bounds Automatic(picture pic, real min, real max);
real[] sequencereal;
-pen[] Rainbow(int NColors=<default>);
-pen[] adjust(picture pic, real min, real max, real rmin, real rmax, pen[] palette);
pen[] Gradient(int NColors=<default> ... pen[] p);
-pen[] quantize(pen[] Palette, int n);
-void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>);
-bounds Range(picture pic, real min, real max)(bool automin=<default>, real min=<default>, bool automax=<default>, real max=<default>);
-bounds Full(picture pic, real min, real max);
-void PaletteTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, pen pTick=<default>, pen ptick=<default>);
-void PaletteTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>);
-pen[] palette(real[] f, pen[] palette);
-pen[][] palette(real[][] f, pen[] palette);
-void palette(picture pic=<default>, Label L=<default>, bounds bounds, pair initial, pair final, void axis(picture, axisT)=<default>, pen[] palette, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>)=<default>, bool copy=<default>, bool antialias=<default>);
-picture brick(real Hx=<default>, real Hy=<default>, pen p=<default>);
+picture tile(real Hx=<default>, real Hy=<default>, pen p=<default>, filltype filltype=<default>);
+frame tiling(string name, picture pic, pair lb=<default>, pair rt=<default>);
picture crosshatch(real H=<default>, pen p=<default>);
-picture hatch(real H=<default>, pair dir=<default>, pen p=<default>);
real hatchepsilon;
-picture checker(real Hx=<default>, real Hy=<default>, pen p=<default>);
+picture brick(real Hx=<default>, real Hy=<default>, pen p=<default>);
void add(string name, picture pic, pair lb=<default>, pair rt=<default>);
-frame tiling(string name, picture pic, pair lb=<default>, pair rt=<default>);
-picture tile(real Hx=<default>, real Hy=<default>, pen p=<default>, filltype filltype=<default>);
-void grestore(picture pic=<default>);
-pen textpen;
+picture hatch(real H=<default>, pair dir=<default>, pen p=<default>);
+picture checker(real Hx=<default>, real Hy=<default>, pen p=<default>);
void gsave(picture pic=<default>);
+pen textpen;
+void grestore(picture pic=<default>);
pair align;
-rational[][] rationalidentity(int n);
-int gcd(int m, int n);
+rational sum(rational[] a);
+string texstring(rational r);
+string string(rational r);
+rational[] operator -(rational[] r, rational[] s);
+rational[] operator -(rational[] r);
+int lcm(int m, int n);
int maxDenominator;
-rational min(rational a, rational b);
+bool[] operator <(rational[] r, rational s);
+bool[] operator >(rational[] r, rational s);
rational abs(rational r);
-string texstring(rational r);
bool rectangular(rational[][] m);
-string string(rational r);
+bool[] operator >=(rational[] r, rational s);
+bool[] operator <=(rational[] r, rational s);
+rational[] operator *(rational[] r, rational[] s);
+rational[][] rationalidentity(int n);
+rational max(rational a, rational b);
+rational max(rational[] a);
void write(file fout, string s=<default>, rational r, void suffix(file)=<default>);
void write(string s=<default>, rational r, void suffix(file)=<default>);
void write(file fout=<default>, string s=<default>, rational[] a, void suffix(file)=<default>);
void write(file fout=<default>, string s=<default>, rational[][] a, void suffix(file)=<default>);
-rational operator +(rational r, rational s);
-rational operator -(rational r);
-rational operator -(rational r, rational s);
-rational[] operator -(rational[] r);
-rational operator *(rational r, rational s);
-rational operator init();
-rational operator cast(int p);
-rational[] operator cast(int[] a);
-rational[][] operator cast(int[][] a);
-real operator ecast(rational r);
-rational operator ecast(real x);
-rational operator /(rational r, rational s);
-bool operator ==(rational r, rational s);
+int gcd(int m, int n);
bool[] operator ==(rational[] r, rational s);
bool operator ==(rational[] r, rational[] s);
bool operator ==(rational[][] r, rational[][] s);
-bool operator !=(rational r, rational s);
-bool operator <(rational r, rational s);
-bool[] operator <(rational[] r, rational s);
-bool operator <=(rational r, rational s);
-bool[] operator <=(rational[] r, rational s);
-bool operator >(rational r, rational s);
-bool[] operator >(rational[] r, rational s);
-bool operator >=(rational r, rational s);
-bool[] operator >=(rational[] r, rational s);
-rational sum(rational[] a);
-int lcm(int m, int n);
-rational max(rational a, rational b);
-rational max(rational[] a);
-bool optimizeTableau;
-simplex operator init();
-void simplexInit(rational[] c, rational[][] A, int[] s=<default>, rational[] b, int count);
+rational min(rational a, rational b);
+rational[] operator /(rational[] r, rational[] s);
+rational[] operator +(rational[] r, rational[] s);
+void simplexPhase2();
void simplexPhase1(rational[] c, rational[][] A, rational[] b, int[] Bindices);
void simplexTableau(rational[][] E, int[] Bindices, int I=<default>, int J=<default>, int n=<default>);
-void simplexPhase2();
+bool optimizeTableau;
int[] artificialColumn;
void simplexWrite(rational[][] E, int[] Bindices, int, int);
+void simplexInit(rational[] c, rational[][] A, int[] s=<default>, rational[] b, int count);
path roundedpath(path A, real R, real S=<default>);
-problem operator init();
-simplex operator init();
-void nextpage(pen p=<default>);
+void currentexitfunction();
+void bibliographystyle(string name);
+void subitem(string s, pen p=<default>);
+string asywrite(string s, string preamble=<default>);
+void filecode(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
+void code(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
+void asyinclude(string s, real xsize=<default>, real ysize=<default>);
+void indexedfigure(string prefix, int first, int last, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
+void multifigure(string[] slist, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
void display(frame[] f, real margin=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
void display(frame f, real margin=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
void display(string[] s, real margin=<default>, string[] captions=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
void display(string s, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
-void filecode(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
-void multifigure(string[] slist, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
-void subitem(string s, pen p=<default>);
-pen pagenumberpen;
-pair pagenumberalign;
-pair pagenumberposition;
-void indexedfigure(string prefix, int first, int last, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
+void skip(real n=<default>);
+void vbox(string s, pen p=<default>);
+void center(string s, pen p=<default>);
+void outline(string s=<default>, pair position=<default>, pair align=<default>, pen p=<default>);
+void title(string s, pair position=<default>, pair align=<default>, pen p=<default>, bool newslide=<default>);
+void incrementposition(pair z);
+bool checkposition();
+void nextpage(pen p=<default>);
+void numberpage(pen p=<default>);
+void normalvideo();
string texcolor(pen p);
-void color(string name, string color);
-pen foregroundcolor;
-void bibliography(string name);
-void bibliographystyle(string name);
+bool empty();
+bool havepagenumber;
+int page;
int[] lastnode;
-real aboveequationskip;
-void asyfigure(string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, filltype filltype=<default>, bool newslide=<default>);
-void asyfilecode(bool center=<default>, string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>, bool newslide=<default>);
-bool itemstep;
-real itemskip;
-void remark(bool center=<default>, string s, pair align=<default>, pen p=<default>, real indent=<default>, bool minipage=<default>, real skip=<default>, filltype filltype=<default>, bool step=<default>);
-void usersetting();
-void item(string s, pen p=<default>, bool step=<default>);
-bool landscape;
-pen authorpen;
-real codeskip;
+int[] firstnode;
+pen backgroundcolor;
+pen steppagenumberpen;
+real figureborder;
+pen pagenumberpen;
+string oldbulletcolor;
+pair startposition;
+void step();
string cropcode(string s);
-void newslide(bool stepping=<default>);
+void figure(string[] s, string options=<default>, real margin=<default>, string[] captions=<default>, string caption=<default>, string[] url=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
+void figure(string s, string options=<default>, string caption=<default>, string url=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
+pen foregroundcolor;
+void reversevideo();
+void equation(string s, pen p=<default>);
+string bulletcolor(string color);
+string[] codefile;
bool allowstepping;
-pair currentposition;
-pen itempen;
+bool landscape;
+void erasestep(int erasenode);
+bool firststep;
bool reverse;
-void reversevideo();
-void vbox(string s, pen p=<default>);
+void item(string s, pen p=<default>, bool step=<default>);
+void color(string name, string color);
+pen itempen;
+pen institutionpen;
+transform tinv;
+void usersetting();
+void setpens(pen red=<default>, pen blue=<default>, pen steppen=<default>);
+int preamblenodes;
+pair titlealign;
+pair dateskip;
+void titlepage(string title, string author, string institution=<default>, string date=<default>, string url=<default>, bool newslide=<default>);
void asycode(bool center=<default>, string s, string options=<default>, string caption=<default>, string preamble=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>, bool newslide=<default>);
+real pagemargin;
+void asyfigure(string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, filltype filltype=<default>, bool newslide=<default>);
+void remark(bool center=<default>, string s, pair align=<default>, pen p=<default>, real indent=<default>, bool minipage=<default>, real skip=<default>, filltype filltype=<default>, bool step=<default>);
void exitfunction();
-bool havepagenumber;
-real pageheight;
+void bibliography(string name);
+pair titlepageposition;
+void equations(string s, pen p=<default>);
+pen figuremattpen;
+pen urlpen;
+void asyfilecode(bool center=<default>, string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>, bool newslide=<default>);
+real titleskip;
+pen codepen;
+void newslide(bool stepping=<default>);
+pair currentposition;
+pair pagenumberalign;
+pair pagenumberposition;
+real minipagemargin;
+bool stepping;
+bool itemstep;
real pagewidth;
+real pageheight;
picture background;
void background();
-pen backgroundcolor;
-void normalvideo();
-void title(string s, pair position=<default>, pair align=<default>, pen p=<default>, bool newslide=<default>);
-pen titlepen;
-real titleskip;
-pair dateskip;
-pair titlealign;
+real minipagewidth;
pen titlepagepen;
-void titlepage(string title, string author, string institution=<default>, string date=<default>, string url=<default>, bool newslide=<default>);
-pair titlepageposition;
-pen codepen;
-void erasestep(int erasenode);
-bool checkposition();
-void setpens(pen red=<default>, pen blue=<default>, pen steppen=<default>);
-void code(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
-transform tinv;
+pen authorpen;
+pen datepen;
+real itemskip;
+real codeskip;
+real aboveequationskip;
pair urlskip;
-void numberpage(pen p=<default>);
-pen urlpen;
-int[] firstnode;
-bool firststep;
-string asywrite(string s, string preamble=<default>);
-pair startposition;
-string oldbulletcolor;
+pen titlepen;
string newbulletcolor;
-pen datepen;
-void incrementposition(pair z);
-pen institutionpen;
-void skip(real n=<default>);
-bool stepping;
-real pagemargin;
-pen steppagenumberpen;
-int page;
-bool empty();
-void currentexitfunction();
-void step();
-string[] codefile;
-void outline(string s=<default>, pair position=<default>, pair align=<default>, pen p=<default>);
-void center(string s, pen p=<default>);
-void equation(string s, pen p=<default>);
-void equations(string s, pen p=<default>);
-void asyinclude(string s, real xsize=<default>, real ysize=<default>);
-void figure(string[] s, string options=<default>, real margin=<default>, string[] captions=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
-void figure(string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool final=<default>);
-real figureborder;
-pen figuremattpen;
string bullet;
-int preamblenodes;
-string bulletcolor(string color);
-real minipagewidth;
-real minipagemargin;
-real stepfraction;
path curve(pair c, real f(real, real), pair a, pair b);
path curve(pair c, real f(real), pair a, pair b);
+real stepfraction;
picture slopefield(real f(real, real), pair a, pair b, int nx=<default>, int ny=<default>, real tickfactor=<default>, pen p=<default>);
picture slopefield(real f(real), pair a, pair b, int nx=<default>, int ny=<default>, pen p=<default>);
+surface implicitsurface(real f(triple)=<default>, real ff(real, real, real)=<default>, triple a, triple b, int n=<default>, bool keyword overlapedges=<default>, int keyword nx=<default>, int keyword ny=<default>, int keyword nz=<default>, int keyword maxdepth=<default>, bool keyword usetriangles=<default>);
+evaluatedpoint[][][] make3dgrid(triple a, triple b, int nx, int ny, int nz, real f(triple), bool allowzero=<default>);
+bool checkptincube(triple pt, triple a, triple b);
+bool check_fpt_zero(triple testpoint, real f(triple), triple grad(triple));
patch[] maketriangle(path3 external, real f(triple), triple grad(triple), bool allowsubdivide=<default>);
-real B23(real t);
+triple normalout(int face);
path3 pathinface(positionedvector v1, positionedvector v2, triple facenorm, triple edge1normout, triple edge2normout);
path3 pathinface(positionedvector v1, positionedvector v2, int face, int edge1face, int edge2face);
-path3 bisector(path3 edgecycle, int[] savevertices);
-int XHIGH;
-int YHIGH;
-int ZHIGH;
-real(real)[] bernstein;
+triple projecttospan(triple toproject, triple v1, triple v2, real mincoeff=<default>);
+real[] projecttospan_findcoeffs(triple toproject, triple v1, triple v2, bool warn=<default>);
path3 pathbetween(positionedvector v1, positionedvector v2);
path3 pathbetween(path3 edgecycle, int vertex1, int vertex2);
+int[] makecircle(edge[] edges);
+int YLOW;
+int YHIGH;
+int XLOW;
+patch trianglewithnormals(path3 external, triple n1, triple n2, triple n3);
patch patchwithnormals(path3 external, triple[] u0normals, triple[] u1normals, triple[] v0normals, triple[] v1normals);
patch patchwithnormals(path3 external, triple normalat(triple));
-real angledegrees(triple a, triple b);
-triple projecttospan(triple toproject, triple v1, triple v2, real mincoeff=<default>);
-real[] projecttospan_findcoeffs(triple toproject, triple v1, triple v2, bool warn=<default>);
+patch[] triangletoquads(path3 external, real f(triple), triple grad(triple), triple a, triple b);
+real B23(real t);
+evaluatedpoint[][] slice(evaluatedpoint[][] a, int start1, int end1, int start2, int end2);
+evaluatedpoint[][][] slice(evaluatedpoint[][][] a, int start1, int end1, int start2, int end2, int start3, int end3);
+positionedvector[][] slice(positionedvector[][] a, int start1, int end1, int start2, int end2);
+positionedvector[][][] slice(positionedvector[][][] a, int start1, int end1, int start2, int end2, int start3, int end3);
+real B03(real t);
triple nGrad(triple)(real f(triple));
-triple normalout(int face);
-patch[] quadpatches(path3 edgecycle, positionedvector[] corners, real f(triple), triple grad(triple), triple a, triple b, bool usetriangles);
-int[] makecircle(edge[] edges);
-real B13(real t);
-bool check_fpt_zero(triple testpoint, real f(triple), triple grad(triple));
-bool checkptincube(triple pt, triple a, triple b);
-bool checkpt(triple testpt, real f(triple), triple grad(triple), triple a, triple b);
-int XLOW;
-int YLOW;
+real angledegrees(triple a, triple b);
+path3 bisector(path3 edgecycle, int[] savevertices);
int ZLOW;
-pathwithnormals_settings operator init();
-intset operator init();
-int_to_intset operator init();
-edge operator init();
-positionedvector operator init();
-evaluatedpoint operator init();
-gridwithzeros operator init();
+real(real)[] bernstein;
+bool checkpt(triple testpt, real f(triple), triple grad(triple), triple a, triple b);
+int XHIGH;
+int ZHIGH;
string operator cast(edge e);
string operator cast(edge[] edges);
string operator cast(positionedvector vv);
triple operator cast(evaluatedpoint p);
-surface implicitsurface(real f(triple)=<default>, real ff(real, real, real)=<default>, triple a, triple b, int n=<default>, bool keyword overlapedges=<default>, int keyword nx=<default>, int keyword ny=<default>, int keyword nz=<default>, int keyword maxdepth=<default>, bool keyword usetriangles=<default>);
-bool operator ==(edge a, edge b);
-patch[] triangletoquads(path3 external, real f(triple), triple grad(triple), triple a, triple b);
-patch trianglewithnormals(path3 external, triple n1, triple n2, triple n3);
+patch[] quadpatches(path3 edgecycle, positionedvector[] corners, real f(triple), triple grad(triple), triple a, triple b, bool usetriangles);
int NULL_VERTEX;
-evaluatedpoint[][][] make3dgrid(triple a, triple b, int nx, int ny, int nz, real f(triple), bool allowzero=<default>);
real B33(real t);
-real B03(real t);
-evaluatedpoint[][] slice(evaluatedpoint[][] a, int start1, int end1, int start2, int end2);
-evaluatedpoint[][][] slice(evaluatedpoint[][][] a, int start1, int end1, int start2, int end2, int start3, int end3);
-positionedvector[][] slice(positionedvector[][] a, int start1, int end1, int start2, int end2);
-positionedvector[][][] slice(positionedvector[][][] a, int start1, int end1, int start2, int end2, int start3, int end3);
-revolution operator *(real[][] t, revolution r);
-skeleton operator init();
-revolution operator init();
+real B13(real t);
+bool operator ==(edge a, edge b);
revolution sphere(triple c=<default>, real r, int n=<default>);
path line(path p, path q, real[] t);
-surface surface(revolution r, int n=<default>, pen color(int i, real j)=<default>);
-void draw(picture pic=<default>, revolution r, int m=<default>, int n=<default>, pen frontpen=<default>, pen backpen=<default>, pen longitudinalpen=<default>, pen longitudinalbackpen=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
-real[] tangent(path p, path q, bool side);
pen defaultbackpen;
+real[] tangent(path p, path q, bool side);
+void draw(picture pic=<default>, revolution r, int m=<default>, int n=<default>, pen frontpen=<default>, pen backpen=<default>, pen longitudinalpen=<default>, pen longitudinalbackpen=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
+surface surface(revolution r, int n=<default>, pen color(int i, real j)=<default>);
+revolution operator *(real[][] t, revolution r);
path[] cylinder(path3 base, real h, triple axis=<default>, projection P);
revolution cylinder(triple c=<default>, real r, real h, triple axis=<default>);
revolution cone(triple c=<default>, real r, real h, triple axis=<default>, int n=<default>);
-real rms(real[] A);
+linefit leastsquares(real[] x, real[] y);
+linefit leastsquares(real[] x, real[] y, real[] w);
+int bins(real[] data, int max=<default>);
+path topbox(pair a, pair b);
+path halfbox(pair a, pair b);
int[] frequency(real[] data, real[] bins);
int[] frequency(real[] data, real a, real b, int n);
int[][] frequency(real[] x, real[] y, real[] xbins, real[] ybins);
int[][] frequency(real[] x, real[] y, pair a, pair b, int nx, int ny=<default>);
int[][] frequency(pair[] z, pair a, pair b, int nx, int ny=<default>);
+real kurtosisexcess(real[] A);
+real kurtosis(real[] A);
+real skewness(real[] A);
+real rms(real[] A);
+real variance(real[] A);
+void histogram(picture pic=<default>, real[] bins, real[] count, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
+void histogram(picture pic=<default>, real[] data, real a, real b, int n, bool normalize=<default>, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
+real legendmarkersize;
+real Gaussrand();
+pair Gaussrandpair();
real mean(real[] A);
+real variancebiased(real[] A);
real stdev(real[] A);
-int bins(real[] data, int max=<default>);
-path topbox(pair a, pair b);
-path halfbox(pair a, pair b);
real Gaussian(real x, real sigma);
real Gaussian(real x);
-pair Gaussrandpair();
-real Gaussrand();
-real variance(real[] A);
-real legendmarkersize;
-real variancebiased(real[] A);
-linefit operator init();
-real skewness(real[] A);
-linefit leastsquares(real[] x, real[] y);
-linefit leastsquares(real[] x, real[] y, real[] w);
-real kurtosis(real[] A);
-real kurtosisexcess(real[] A);
-void histogram(picture pic=<default>, real[] bins, real[] count, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
-void histogram(picture pic=<default>, real[] data, real a, real b, int n, bool normalize=<default>, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
-pair[] endpoints(guide[] a);
-Relation r3;
-picture tableau(frame[] cards, bool number=<default>);
-pair min(pair[] z);
+Relation operator -(Relation r);
+Component bm;
Component bp;
-Braid apply(Relation r, Braid b, int step, int place);
-Component phi;
real gapfactor;
-Component bm;
-Component wye;
-Relation operator -(Relation r);
-Component operator init();
-Braid operator init();
-Relation operator init();
-Syzygy operator init();
-real hwratio;
+Relation r3;
+pair[] endpoints(guide[] a);
Relation r4b;
+Braid apply(Relation r, Braid b, int step, int place);
Relation r4a;
+Component wye;
+picture tableau(frame[] cards, bool number=<default>);
+pair min(pair[] z);
+real hwratio;
pair max(pair[] z);
-pen Orchid;
-pen Magenta;
-pen BrickRed;
-pen CadetBlue;
-pen CarnationPink;
-pen SpringGreen;
-pen MidnightBlue;
+Component phi;
+pen Brown;
+pen Sepia;
pen OliveGreen;
-pen Apricot;
+pen SpringGreen;
+pen YellowGreen;
+pen LimeGreen;
+pen PineGreen;
+pen Green;
+pen JungleGreen;
pen Aquamarine;
-pen Lavender;
-pen Cyan;
-pen Red;
-pen RawSienna;
-pen Mahogany;
-pen Gray;
+pen SkyBlue;
+pen ProcessBlue;
+pen Blue;
+pen NavyBlue;
+pen MidnightBlue;
+pen Periwinkle;
+pen BlueViolet;
+pen Violet;
pen Plum;
+pen Lavender;
+pen Black;
pen BlueGreen;
pen Cerulean;
-pen Blue;
-pen BlueViolet;
-pen RedOrange;
-pen Goldenrod;
-pen ForestGreen;
-pen BurntOrange;
-pen YellowOrange;
-pen Maroon;
-pen Tan;
-pen YellowGreen;
-pen Brown;
-pen RubineRed;
-pen TealBlue;
-pen White;
-pen Purple;
-pen Bittersweet;
-pen Sepia;
+pen Apricot;
+pen RawSienna;
+pen Red;
pen Orange;
-pen OrangeRed;
-pen Fuchsia;
-pen Peach;
-pen PineGreen;
-pen Dandelion;
-pen VioletRed;
-pen Black;
-pen Violet;
-pen NavyBlue;
-pen Rhodamine;
-pen ProcessBlue;
-pen Thistle;
-pen LimeGreen;
-pen Green;
+pen Gray;
pen GreenYellow;
+pen YellowOrange;
+pen ForestGreen;
+pen BurntOrange;
pen DarkOrchid;
+pen RedOrange;
+pen Turquoise;
+pen Rhodamine;
+pen CadetBlue;
+pen RoyalPurple;
+pen Dandelion;
+pen White;
pen Emerald;
-pen Mulberry;
-pen WildStrawberry;
-pen RedViolet;
-pen SkyBlue;
-pen SeaGreen;
-pen Periwinkle;
+pen Cyan;
+pen Bittersweet;
+pen Orchid;
+pen BrickRed;
+pen CornflowerBlue;
pen Yellow;
+pen Melon;
+pen Tan;
pen Salmon;
-pen JungleGreen;
-pen CornflowerBlue;
+pen TealBlue;
+pen Magenta;
pen RoyalBlue;
-pen Melon;
-pen RoyalPurple;
-pen Turquoise;
+pen Mulberry;
+pen Goldenrod;
+pen Thistle;
+pen SeaGreen;
+pen Maroon;
+pen CarnationPink;
+pen Peach;
+pen Mahogany;
+pen OrangeRed;
+pen RubineRed;
+pen WildStrawberry;
+pen VioletRed;
+pen RedViolet;
+pen Fuchsia;
+pen Purple;
+void currentexitfunction();
+frame[] fit3(string prefix=<default>, picture[] pictures, picture all, string format=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>);
+projection[][] SixViews;
+projection[][] ThreeViewsFR;
+frame embedder(object embedder(string prefix, string format), string prefix, string format, bool view, light light);
+frame embedder(string prefix, frame f, string format, real width, real height, bool view, string options, string script, light light, projection P);
+object embed(string prefix=<default>, string label=<default>, string text=<default>, scene S, string format=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>);
+object embed(string prefix=<default>, string label=<default>, string text=<default>, picture pic, string format=<default>, real xsize=<default>, real ysize=<default>, bool keepAspect=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>);
+object embed(string prefix=<default>, string label=<default>, string text=<default>, frame f, string format=<default>, real width=<default>, real height=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>);
+string embed3D(string prefix, string label=<default>, string text=<default>, frame f, string format=<default>, real width=<default>, real height=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>, real viewplanesize=<default>);
+string Format(real x);
+string Format(triple v, string sep=<default>);
+string Format(real[] c);
+string Format(real[][] t, string sep=<default>);
+projection absperspective(triple camera=<default>, triple target=<default>, real roll=<default>, real angle=<default>);
+projection absorthographic(triple camera=<default>, triple target=<default>, real roll=<default>);
+bool Bar3(picture, path3, material, marginT3(path3, pen), light, light)(real size=<default>, triple dir=<default>);
+bool Bar3(picture, path3, material, marginT3(path3, pen), light, light);
+bool BeginBar3(picture, path3, material, marginT3(path3, pen), light, light)(real size=<default>, triple dir=<default>);
+bool BeginBar3(picture, path3, material, marginT3(path3, pen), light, light);
+bool EndArcArrow3(picture, path3, material, marginT3(path3, pen), light, light)(arrowhead3 arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, material arrowheadpen=<default>);
+bool EndArcArrow3(picture, path3, material, marginT3(path3, pen), light, light);
+bool BeginArcArrow3(picture, path3, material, marginT3(path3, pen), light, light)(arrowhead3 arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, material arrowheadpen=<default>);
+bool BeginArcArrow3(picture, path3, material, marginT3(path3, pen), light, light);
+bool BeginArrow3(picture, path3, material, marginT3(path3, pen), light, light)(arrowhead3 arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, material arrowheadpen=<default>);
+bool BeginArrow3(picture, path3, material, marginT3(path3, pen), light, light);
+arrowhead3 DefaultHead2(triple normal=<default>);
+arrowhead3 DefaultHead2;
+arrowhead3 TeXHead3;
+arrowhead3 DefaultHead3;
+real tubethreshold;
+surface tube(triple z0, triple c0, triple c1, triple z1, real w);
+rmf[] rmf(path3 g, real[] t, triple perp=<default>);
+rmf[] rmf(triple z0, triple c0, triple c1, triple z1, real[] t, triple perp=<default>);
+marginT3 DotMargins3(path3, pen);
+bool Bars3(picture, path3, material, marginT3(path3, pen), light, light)(real size=<default>, triple dir=<default>);
+bool Bars3(picture, path3, material, marginT3(path3, pen), light, light);
+marginT3 BeginDotMargin3(path3, pen);
+marginT3 PenMargins3(path3, pen);
+marginT3 EndPenMargin2(path3, pen);
+marginT3 EndPenMargin3(path3, pen);
+marginT3 PenMargin2(path3, pen);
+marginT3 BeginPenMargin2(path3, pen);
+marginT3 Margins3(path3, pen);
+marginT3 EndMargin3(path3, pen);
+marginT3 DotMargin3(path3, pen)(real begin, real end);
+marginT3 DotMargin3(path3, pen);
+marginT3 PenMargin3(path3, pen)(real begin, real end);
+marginT3 PenMargin3(path3, pen);
+marginT3 Margin3(path3, pen)(real begin, real end);
+marginT3 Margin3(path3, pen);
+marginT3 NoMargin3(path3, pen)();
+marginT3 NoMargin3(path3, pen);
+pair maxbound(triple[] A, projection P);
+pair maxbound(triple[][] A, projection P);
+surface unitcylinder;
+patch unitcylinder1;
+surface unitfrustum(real ta, real tb);
+surface octant1(real transition);
+surface octant1;
+patch octant1x;
+real[][] i;
+real[][] t3;
+real[][] t1;
+real[][] aligntransform(path3[] g, real[][] t=<default>, triple position, triple align, pen p=<default>);
+real[][] aligntransform(surface s, real[][] t=<default>, triple position, triple align, pen p=<default>);
+bool EndArrow3(picture, path3, material, marginT3(path3, pen), light, light)(arrowhead3 arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, material arrowheadpen=<default>);
+bool EndArrow3(picture, path3, material, marginT3(path3, pen), light, light);
+real[][] alignshift(path3[] g, real[][] t=<default>, triple position, triple align);
+real[][] alignshift(surface s, real[][] t=<default>, triple position, triple align);
+surface unithemisphere;
+interaction LabelInteraction();
+bool overlap(triple[][] p, triple[][] q, real fuzz=<default>);
+triple[][] subpatch(triple[][] P, pair a, pair b);
+patch subpatch(patch s, pair a, pair b);
+marginT3 BeginMargin3(path3, pen);
+triple[][] subpatchbegin(triple[][] P, real u, real v);
+triple[][][] vsplit(triple[][] P, real u=<default>);
+bool unscaled(real[][] t, triple v, triple w);
+path[] regularize(path p, bool checkboundary=<default>);
+pair[][] coons(path p);
+patch tensor(patch s);
+pair[][] tensor(path p, pair[] internal);
+surface unitsolidcone;
+real nineth;
+string meshname(string name);
+bool Arrows3(picture, path3, material, marginT3(path3, pen), light, light)(arrowhead3 arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, material arrowheadpen=<default>);
+bool Arrows3(picture, path3, material, marginT3(path3, pen), light, light);
+int nslice;
+projection[][] ThreeViewsUS;
+void addPath(picture pic, path3 g, pen p);
+void endgroup3(picture pic=<default>);
+light nolight;
+light Headlamp;
+real epsilon;
+path3 unitsquare3;
+path3 unitcircle3;
+real a;
+path3[] unitbox;
+path3 randompath3(int n, bool cumulate=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
+triple[] triples(real[] x, real[] y, real[] z);
+surface unitplane;
+tensionSpecifier tensionSpecifier(void g(flatguide3), int t);
+triple[] controlSpecifier(void g(flatguide3), int t);
+triple[] dirSpecifier(void g(flatguide3), int t);
+transform transform(triple u, triple v, triple O=<default>, projection P=<default>);
+real[][] planeproject(triple n, triple O=<default>, triple dir=<default>);
+real[][] planeproject(path3 p, triple dir=<default>);
+real[][] XZ;
+real[][] XZ(projection P=<default>);
+real[][] ZX;
+real[][] ZX(projection P=<default>);
+real[][] ZY;
+real[][] ZY(projection P=<default>);
+real[][] YZ;
+real[][] YZ(projection P=<default>);
+real[][] XY;
+real[][] XY(projection P=<default>);
+triple normal(path3 p);
+triple normal(triple[] p);
+path nurb(path3 p, projection P, int ninterpolate=<default>);
+path3 solve(flatguide3 g);
+path path(path3 p, pair P(triple)=<default>);
+path[] path(Label L, pair z=<default>, projection P);
+path3 path3(triple v);
+path3 path3(path p, triple plane(pair)=<default>);
+path3[] path3(explicit path[] g, triple plane(pair)=<default>);
+bool cyclic(void g(flatguide3));
+triple ZXplane(pair z);
+triple YZplane(pair z);
+triple XYplane(pair z);
+real Fuzz;
+triple reference(triple[] v, int n, triple d0, triple d1);
+real[] theta(triple[] v, real[] alpha, real[] beta, triple dir0, triple dirn, real g0, real gn, triple reference);
+void join3(flatguide3)(... void(flatguide3)[])(tensionSpecifier t);
+void operator spec(flatguide3)(triple v, int side);
+void checkEmpty(int n);
+Tension noTension;
+projection TopView;
+triple coons3(path3 external);
+projection BottomView;
+projection FrontView;
+projection RightView;
+projection obliqueY(real angle=<default>);
+projection obliqueY;
+projection obliqueX(real angle=<default>);
+projection obliqueX;
+projection oblique(real angle=<default>);
+projection oblique;
+triple camera(real alpha, real beta);
+projection orthographic(triple camera, triple up=<default>, triple target=<default>, real zoom=<default>, pair viewportshift=<default>, bool showtarget=<default>, bool center=<default>);
+projection orthographic(real x, real y, real z, triple up=<default>, triple target=<default>, real zoom=<default>, pair viewportshift=<default>, bool showtarget=<default>, bool center=<default>);
+real[][] distort(triple v);
+real[][] look(triple eye, triple up=<default>, triple target=<default>);
+triple perp(triple v);
+triple project(triple u, triple v);
+pair project(triple v, projection P=<default>);
+path project(path3 p, projection P=<default>, int ninterpolate=<default>);
+pair[] project(triple[] v, projection P=<default>);
+path[] project(explicit path3[] g, projection P=<default>);
+Label project(Label L, triple u, triple v, triple O=<default>, projection P=<default>);
+real[][] reflect(triple u, triple v, triple w);
+triple Z;
+triple X;
+triple O;
+real defaulteyetoview;
+int maxangleiterations;
+real defaultfresnel0;
+real defaultmetallic;
+render defaultrender;
+surface unitcone;
+interaction Embedded;
+int PRCsphere;
+real Single;
+real Zero;
+bool ArcArrow3(picture, path3, material, marginT3(path3, pen), light, light)(arrowhead3 arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, material arrowheadpen=<default>);
+bool ArcArrow3(picture, path3, material, marginT3(path3, pen), light, light);
+real asin1(real x);
+pair minbound(triple[] A, projection P);
+pair minbound(triple[][] A, projection P);
+triple[][] subpatchend(triple[][] P, real u, real v);
+void addStereoViews(picture dest, picture src, bool group=<default>, filltype filltype=<default>, real eyetoview=<default>, bool leftright=<default>, projection P=<default>);
+void addStereoViews(picture src, bool group=<default>, filltype filltype=<default>, real eyetoview=<default>, bool leftright=<default>, projection P=<default>);
+real[][] shift(triple v);
+real[][] shift(real x, real y, real z);
+real[][] shift(real[][] t);
+triple truepoint(picture pic=<default>, triple dir, bool user=<default>, projection P=<default>);
+picture arrow(arrowhead3 arrowhead=<default>, path3 g, material p=<default>, material arrowheadpen=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, bool forwards=<default>, marginT3 margin(path3, pen)=<default>, bool center=<default>, light light=<default>, light arrowheadlight=<default>);
+void arrow(picture pic=<default>, Label L=<default>, triple b, triple dir, real length=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, light light=<default>, light arrowheadlight=<default>, string name=<default>, render render=<default>);
+void arrow(picture pic=<default>, Label L=<default>, triple b, pair dir, real length=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, light light=<default>, light arrowheadlight=<default>, string name=<default>, render render=<default>, projection P=<default>);
+pair xypart(triple v);
+real[][] yscale3(real y);
+real Medium;
+bool None(picture, path3, material, marginT3(path3, pen), light, light);
+real[][] intersections(path3 p, patch s, real fuzz=<default>);
+real[][] intersections(path3 p, surface s, real fuzz=<default>);
+triple arcdir(path3 p, real L);
+void nullpath3(flatguide3);
+path3 interp(path3 a, path3 b, real t);
+marginT3 operator +(path3, pen)(marginT3 ma(path3, pen), marginT3 mb(path3, pen));
+path3 trim(path3 g, real begin, real end);
+surface extrude(path3 p, path3 q);
+surface extrude(path3 p, triple axis=<default>);
+surface extrude(path p, triple plane(pair)=<default>, triple axis=<default>);
+surface extrude(explicit path[] p, triple axis=<default>);
+surface extrude(Label L, triple axis=<default>);
+marginT3 EndDotMargin3(path3, pen);
+path3 operator &(path3 p, cycleToken tok);
+void tensorshade(transform t=<default>, frame f, patch s, material m, light light=<default>, projection P);
+real Low;
+bool Blank(picture, path3, material, marginT3(path3, pen), light, light);
+real angleprecision;
+void operator ::(flatguide3)(... void(flatguide3)[]);
+triple[][][] hsplit(triple[][] P, real v=<default>);
+pair dir(triple v, triple dir, projection P);
+triple dir(real theta, triple d0, triple d1, triple reference);
+triple dir(path3 p);
+triple dir(path3 p, path3 h);
+void operator --(flatguide3)(... void(flatguide3)[] g);
+triple endpoint(path3 p);
+marginT3 TrueMargin3(path3, pen)(real begin, real end);
+int length(void g(flatguide3));
+path3 arc(triple c, triple v1, triple v2, triple normal=<default>, bool direction=<default>);
+path3 arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, bool direction);
+path3 arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>);
+projection[][] SixViewsFR;
+void drawTube(frame f, real[][] t=<default>, material[] m, light light=<default>, render render=<default>)(triple[] g, real w, triple min, triple max);
+triple midpoint(path3 p);
+projection[][] SixViewsUS;
+triple[] intersectionpoints(path3 p, path3 q, real fuzz=<default>);
+triple[] intersectionpoints(explicit path3[] p, explicit path3[] q, real fuzz=<default>);
+triple[] intersectionpoints(path3 p, patch s, real fuzz=<default>);
+triple[] intersectionpoints(path3 p, surface s, real fuzz=<default>);
+void unitcylinderDraw(frame f, real[][] t=<default>, material[] m, light light=<default>, render render=<default>)(bool core);
+triple beginpoint(path3 p);
+triple[][] degenerate(triple[][] P);
+triple[] split(triple z0, triple c0, triple c1, triple z1, real t=<default>);
+triple[][][][] split(triple[][] P, real u=<default>, real v=<default>);
+bool Arrow3(picture, path3, material, marginT3(path3, pen), light, light)(arrowhead3 arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, material arrowheadpen=<default>);
+bool Arrow3(picture, path3, material, marginT3(path3, pen), light, light);
+int NURBSsphere;
+real[][] transform3(triple u, triple v, triple w=<default>);
+real[][] transform3(projection P=<default>);
+marginT3 BeginPenMargin3(path3, pen);
+void drawTessellation(frame f, surface s, material surfacepen=<default>, pen meshpen=<default>, light light=<default>, light meshlight=<default>, string name=<default>, render render=<default>);
+void drawTessellation(picture pic=<default>, surface s, material surfacepen=<default>, pen meshpen=<default>, light light=<default>, light meshlight=<default>, string name=<default>, render render=<default>);
+void operator ..(flatguide3)(... void(flatguide3)[] g);
+pen[] nullpens;
+triple max3(picture pic, projection P=<default>);
+string partname(int i, render render=<default>);
+void reverse(flatguide3)(void g(flatguide3));
+patch reverse(patch s);
+triple size3(picture pic, bool user=<default>, projection P=<default>);
+surface unitdisk;
+triple invert(pair z, triple normal, triple point, projection P=<default>);
+triple invert(pair z, projection P=<default>);
+triple invert(pair dir, triple v, projection P=<default>);
+path3 invert(path p, triple normal, triple point, projection P=<default>);
+path3 invert(path p, triple point, projection P=<default>);
+path3 invert(path p, projection P=<default>);
+projection LeftView;
+real relative(Label L, path3 g);
+bool EndBar3(picture, path3, material, marginT3(path3, pen), light, light)(real size=<default>, triple dir=<default>);
+bool EndBar3(picture, path3, material, marginT3(path3, pen), light, light);
+void draw(frame f, path3 g, material p=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
+void draw(frame f, triple[] v, int[][] vi, triple[] n=<default>, int[][] ni=<default>, material m=<default>, pen[] p=<default>, int[][] pi=<default>, light light=<default>, render render=<default>);
+void draw(picture pic=<default>, triple[] v, int[][] vi, triple[] n=<default>, int[][] ni=<default>, material m=<default>, pen[] p=<default>, int[][] pi=<default>, light light=<default>, render render=<default>);
+void draw(transform t=<default>, frame f, surface s, int nu=<default>, int nv=<default>, material[] surfacepen, pen[] meshpen=<default>, light light=<default>, light meshlight=<default>, string name=<default>, render render=<default>, projection P=<default>);
+void draw(transform t=<default>, frame f, surface s, int nu=<default>, int nv=<default>, material surfacepen=<default>, pen meshpen=<default>, light light=<default>, light meshlight=<default>, string name=<default>, render render=<default>, projection P=<default>);
+void draw(picture pic=<default>, surface s, int nu=<default>, int nv=<default>, material[] surfacepen, pen[] meshpen=<default>, light light=<default>, light meshlight=<default>, string name=<default>, render render=<default>);
+void draw(picture pic=<default>, surface s, int nu=<default>, int nv=<default>, material surfacepen=<default>, pen meshpen=<default>, light light=<default>, light meshlight=<default>, string name=<default>, render render=<default>);
+void draw(picture pic=<default>, surface s, int nu=<default>, int nv=<default>, material[] surfacepen, pen meshpen, light light=<default>, light meshlight=<default>, string name=<default>, render render=<default>);
+void draw(picture pic=<default>, triple[] P, real[] knot, real[] weights=<default>, pen p=<default>, string name=<default>, render render=<default>);
+void draw(picture pic=<default>, triple[][] P, real[] uknot, real[] vknot, real[][] weights=<default>, material m=<default>, pen[] colors=<default>, light light=<default>, string name=<default>, render render=<default>);
+void draw(picture pic=<default>, Label L=<default>, path3 g, align align=<default>, material p=<default>, marginT3 margin(path3, pen)=<default>, light light=<default>, string name=<default>, render render=<default>);
+void draw(frame f, explicit path3[] g, material p=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
+void draw(picture pic=<default>, explicit path3[] g, material p=<default>, marginT3 margin(path3, pen)=<default>, light light=<default>, string name=<default>, render render=<default>);
+void draw(picture pic=<default>, Label L=<default>, path3 g, align align=<default>, material p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light), bool bar(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, light light=<default>, light arrowheadlight=<default>, string name=<default>, render render=<default>);
+void draw(frame f, path3 g, material p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light), light light=<default>, light arrowheadlight=<default>, string name=<default>, render render=<default>, projection P=<default>);
+real[][] align(triple u);
+Label align(Label L, triple dir);
+path3[] align(path3[] g, real[][] t=<default>, triple position, triple align, pen p=<default>);
+surface align(surface s, real[][] t=<default>, triple position, triple align, pen p=<default>);
+projection[][] ThreeViews;
+projection obliqueZ(real angle=<default>);
+projection obliqueZ;
+void label(frame f, Label L, triple position, align align=<default>, pen p=<default>, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>, projection P=<default>);
+void label(picture pic=<default>, Label L, triple position, align align=<default>, pen p=<default>, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
+void label(picture pic=<default>, Label L, path3 g, align align=<default>, pen p=<default>, light light=<default>, string name=<default>, interaction interaction=<default>);
+path3[] operator ^^(path3 p, path3 q);
+path3[] operator ^^(path3 p, explicit path3[] q);
+path3[] operator ^^(explicit path3[] p, path3 q);
+path3[] operator ^^(explicit path3[] p, explicit path3[] q);
+triple relpoint(path3 p, real l);
+void add2(picture pic, arrowhead3 arrowhead, real size, real angle, filltype filltype, material arrowheadpen, path3 g, material p, marginT3 margin(path3, pen), light light, light arrowheadlight);
+triple cross(triple d0, triple d1, triple reference);
+material material(material m, light light, bool colors=<default>);
+arrowhead3 HookHead3(real dir=<default>, real barb=<default>);
+arrowhead3 HookHead3;
+surface unitsphere;
+pen color(triple normal, material m, light light, real[][] T=<default>);
+triple min3(picture pic, projection P=<default>);
+light White;
+void addArrow(picture pic, arrowhead3 arrowhead, path3 g, pen p, real size, real angle, filltype filltype, real position);
+real[] curlSpecifier(void g(flatguide3), int t);
+void write(file file, control c);
+void write(file file, Tension t);
+void write(file file, dir d);
+void write(file file, string s=<default>, explicit flatguide3 x, void suffix(file)=<default>);
+void write(string s=<default>, flatguide3 x, void suffix(file)=<default>);
+void write(file file, string s=<default>, explicit path3 x, void suffix(file)=<default>);
+void write(string s=<default>, explicit path3 x, void suffix(file)=<default>);
+void write(file file, string s=<default>, explicit path3[] x, void suffix(file)=<default>);
+void write(string s=<default>, explicit path3[] x, void suffix(file)=<default>);
+void write(file file, string s=<default>, explicit void(flatguide3)[] x, void suffix(file)=<default>);
+void write(string s=<default>, explicit void(flatguide3)[] x, void suffix(file)=<default>);
+void write(file file, string s=<default>, material x, void suffix(file)=<default>);
+void write(string s=<default>, material x, void suffix(file)=<default>);
+triple min(explicit path3[] p);
+triple min(surface s);
+pair min(surface s, projection P);
+pair min(path3 p, projection P);
+pair min(frame f, projection P);
+material emissive(material m, bool colors=<default>);
+bool MidArrow3(picture, path3, material, marginT3(path3, pen), light, light)(arrowhead3 arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, material arrowheadpen=<default>);
+bool MidArrow3(picture, path3, material, marginT3(path3, pen), light, light);
+void operator cast(flatguide3)(triple v);
+void operator cast(flatguide3)(cycleToken);
+void operator cast(flatguide3)(tensionSpecifier t);
+void operator cast(flatguide3)(curlSpecifier spec);
+flatguide3 operator cast(void g(flatguide3));
+flatguide3[] operator cast(void(flatguide3)[] g);
+void operator cast(flatguide3)(path3 p);
+path3 operator cast(void g(flatguide3));
+path3 operator cast(triple v);
+void(flatguide3)[] operator cast(triple[] v);
+path3[] operator cast(triple[] v);
+path3[] operator cast(void(flatguide3)[] g);
+void(flatguide3)[] operator cast(path3[] g);
+path3[] operator cast(path3 p);
+path3[] operator cast(void g(flatguide3));
+material operator cast(pen p);
+material[] operator cast(pen[] p);
+light operator cast(triple v);
+surface operator cast(surface[] s);
+triple max(explicit path3[] p);
+triple max(surface s);
+pair max(surface s, projection P);
+pair max(path3 p, projection P);
+pair max(frame f, projection P);
+void draw3D(frame f, patch s, material m, light light=<default>, render render=<default>, bool primitive=<default>);
+triple arcpoint(path3 p, real L);
+control nocontrol;
+triple intersectionpoint(path3 p, path3 q, real fuzz=<default>);
+real defaultshininess;
+pair viewportmargin(pair lambda);
+real[][] scale(triple v, real s);
+real High;
+path3 plane(triple u, triple v, triple O=<default>);
+bool MidArcArrow3(picture, path3, material, marginT3(path3, pen), light, light)(arrowhead3 arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, material arrowheadpen=<default>);
+bool MidArcArrow3(picture, path3, material, marginT3(path3, pen), light, light);
+triple[][] operator /(triple[][] a, real[][] b);
+triple Y;
+interaction Billboard;
+real reltime(path3 p, real l);
+arrowhead3 HookHead2(real dir=<default>, real barb=<default>, triple normal=<default>);
+arrowhead3 HookHead2;
+marginT3 PenMargins2(path3, pen);
+void dot(frame f, triple v, material p=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
+void dot(frame f, triple[] v, material p=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
+void dot(frame f, path3 g, material p=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
+void dot(frame f, path3[] g, material p=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
+void dot(picture pic=<default>, triple v, material p=<default>, light light=<default>, string name=<default>, render render=<default>);
+void dot(picture pic=<default>, triple[] v, material p=<default>, light light=<default>, string name=<default>, render render=<default>);
+void dot(picture pic=<default>, explicit path3 g, material p=<default>, light light=<default>, string name=<default>, render render=<default>);
+void dot(picture pic=<default>, path3[] g, material p=<default>, light light=<default>, string name=<default>, render render=<default>);
+void dot(picture pic=<default>, Label L, triple v, align align=<default>, string format=<default>, material p=<default>, light light=<default>, string name=<default>, render render=<default>);
+projection BackView;
+string format(triple v, string sep=<default>);
+void drawarrow2(picture pic, arrowhead3 arrowhead=<default>, path3 g, material p=<default>, material arrowheadpen=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT3 margin(path3, pen)=<default>, light light=<default>, light arrowheadlight=<default>, projection P=<default>);
+void add(picture pic=<default>, void d(picture, real[][]), bool exact=<default>);
+void add(picture pic, arrowhead3 arrowhead, real size, real angle, filltype filltype, position position, material arrowheadpen, path3 g, material p, bool forwards=<default>, marginT3 margin(path3, pen), bool center=<default>, light light, light arrowheadlight);
+void add(picture dest, picture src, triple position, bool group=<default>, bool above=<default>);
+void add(picture src, triple position, bool group=<default>, bool above=<default>);
+void add(picture dest=<default>, object src, pair position=<default>, pair align=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
+void add(picture dest=<default>, frame src, triple position);
+projection perspective(triple camera, triple up=<default>, triple target=<default>, real zoom=<default>, real angle=<default>, pair viewportshift=<default>, bool showtarget=<default>, bool autoadjust=<default>, bool center=<default>);
+projection perspective(real x, real y, real z, triple up=<default>, triple target=<default>, real zoom=<default>, real angle=<default>, pair viewportshift=<default>, bool showtarget=<default>, bool autoadjust=<default>, bool center=<default>);
+projection perspective(string s);
+projection operator *(real[][] t, projection P);
+control operator *(real[][] t, control c);
+dir operator *(real[][] t, dir d);
+path3[] operator *(real[][] t, explicit path3[] p);
+triple[] operator *(real[][] t, triple[] v);
+triple[][] operator *(real[][] t, triple[][] v);
+light operator *(real[][] t, light light);
+patch operator *(real[][] t, patch s);
+surface operator *(real[][] t, surface s);
+pen operator ecast(material m);
+real acos1(real x);
+void exitfunction();
+real[][] xscale3(real x);
+real[][] rotate(real angle, triple v);
+real[][] rotate(real angle, triple u, triple v);
+real[][] zscale3(real z);
+void operator ---(flatguide3)(... void(flatguide3)[]);
+path3 approach(path3 p, int n, real radix=<default>);
+void operator controls(flatguide3)(triple post, triple pre);
+void operator controls(flatguide3)(triple v);
+picture arrow2(arrowhead3 arrowhead=<default>, path3 g, material p=<default>, material arrowheadpen=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT3 margin(path3, pen)=<default>, light light=<default>, light arrowheadlight=<default>);
+bool ArcArrows3(picture, path3, material, marginT3(path3, pen), light, light)(arrowhead3 arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, material arrowheadpen=<default>);
+bool ArcArrows3(picture, path3, material, marginT3(path3, pen), light, light);
+void bar(picture pic, triple a, triple d, triple perp=<default>, material p=<default>, light light=<default>);
+picture bar(triple a, triple dir, triple perp=<default>, material p=<default>);
+path3 arrowbase(path3 r, triple y, real t, real size);
+triple reldir(path3 p, real l);
+void aim(flatguide3 g, int N);
+void aim(flatguide3 g, int i, int n);
+triple point(explicit void g(flatguide3), int t);
+triple point(patch s, real u, real v);
+triple point(frame f, triple dir);
+triple point(picture pic=<default>, triple dir, bool user=<default>, projection P=<default>);
+int adjustedIndex(int i, int n, bool cycles);
+void drawarrow(picture pic, arrowhead3 arrowhead=<default>, path3 g, material p=<default>, material arrowheadpen=<default>, real size=<default>, real angle=<default>, position position=<default>, filltype filltype=<default>, bool forwards=<default>, marginT3 margin(path3, pen)=<default>, bool center=<default>, light light=<default>, light arrowheadlight=<default>, projection P=<default>);
+int computeNormals(triple[] v, int[][] vi, triple[] n, int[][] ni);
+real[][] YX;
+real[][] YX(projection P=<default>);
+void addViews(picture dest, picture src, projection[][] views=<default>, bool group=<default>, filltype filltype=<default>);
+void addViews(picture src, projection[][] views=<default>, bool group=<default>, filltype filltype=<default>);
+path3 circle(triple c, real r, triple normal=<default>);
+void _draw(frame f, path3 g, triple center=<default>, material m, light light=<default>, interaction interaction=<default>);
+surface unitcube;
+surface cone(path3 base, triple vertex);
+patch unitfrustum1(real ta, real tb);
+projection projection();
+int size(void g(flatguide3));
+string defaultembed3Doptions;
+real camerafactor;
+render operator init();
+Tension operator init();
+void operator init(flatguide3)();
+material operator init();
+real[][] bend(path3 g, real t);
+triple bend(triple p, path3 g, real scale);
+void bend(surface s, path3 g, real L);
+surface nullsurface;
+path3[] box(triple v1, triple v2);
+light Viewport;
+real[][] t2;
+real position(position position, real size, path3 g, bool center);
+real angle(triple d0, triple d1, triple reference);
+real[] intersect(path3 p, patch s, real fuzz=<default>);
+real[] intersect(path3 p, surface s, real fuzz=<default>);
+void pixel(picture pic=<default>, triple v, pen p=<default>, real width=<default>);
+real[][] flip(real[][] t, triple X, triple Y, triple Z, projection P);
+arrowhead3 TeXHead2(triple normal=<default>);
+arrowhead3 TeXHead2;
+bool operator ==(material m, material n);
+triple rectify(triple dir);
+string defaultembed3Dscript;
+surface surface(Label L, triple position=<default>, bool bbox=<default>);
+surface surface(Label L, surface s, real uoffset, real voffset, real height=<default>, bool bottom=<default>, bool top=<default>);
+void begingroup3(frame f, string name=<default>, render render=<default>);
+void begingroup3(picture pic=<default>, string name=<default>, render render=<default>);
int lookup(tree t, int key);
+bool contains(tree t, int key);
tree newtree();
-void write(file out=<default>, tree t);
-tree operator init();
tree add(tree t, int key, int value);
-bool contains(tree t, int key);
-real trembleFuzz();
-real trembleAngle;
-real trembleRandom;
+void write(file out=<default>, tree t);
real trembleFrequency;
-tremble operator init();
+real trembleRandom;
real magneticRadius;
-void render(path3 s, real r, void f(path3, real));
-real[] sample(path3 g, real r, real relstep=<default>);
+real trembleAngle;
+real trembleFuzz();
+int coloredNodes;
path3 roundedpath(path3 A, real r);
+surface tube(path3 g, coloredpath section, transform T(real)=<default>, real corner=<default>, real relstep=<default>);
real tubegranularity;
-int coloredNodes;
int coloredSegments;
-surface surface(rmf[] R, real[] t, coloredpath cp, transform T(real), bool cyclic);
-surface tube(path3 g, coloredpath section, transform T(real)=<default>, real corner=<default>, real relstep=<default>);
-coloredpath operator init();
coloredpath operator cast(path p);
coloredpath operator cast(guide p);
+surface surface(rmf[] R, real[] t, coloredpath cp, transform T(real), bool cyclic);
real degrees(rmf a, rmf b);
+real[] sample(path3 g, real r, real relstep=<default>);
+void render(path3 s, real r, void f(path3, real));
void importv3d(string name);
-triangleGroup operator init();
-pixel operator init();
-CameraInformation operator init();
-v3dfile operator init();
real[][] Align(real polar, real azimuth);
v3dheadertypes v3dheadertypes;
-v3dheadertypes operator init();
v3dtypes v3dtypes;
-v3dtypes operator init();
string VERSION;
-pen Orchid;
-pen Indigo;
-pen Beige;
-pen SlateBlue;
-pen SlateGray;
-pen Cornsilk;
-pen Magenta;
-pen CadetBlue;
-pen DeepPink;
+pen YellowGreen;
+pen WhiteSmoke;
+pen Violet;
+pen Tomato;
+pen Thistle;
+pen SteelBlue;
pen SpringGreen;
-pen MidnightBlue;
-pen Olive;
-pen OliveDrab;
+pen Snow;
+pen SkyBlue;
+pen Silver;
pen Seashell;
-pen Aquamarine;
-pen GhostWhite;
-pen Lavender;
-pen Chocolate;
-pen Cyan;
-pen Gainsboro;
-pen Ivory;
-pen PapayaWhip;
-pen Red;
-pen Pink;
-pen MintCream;
-pen DarkTurquoise;
-pen Gray;
-pen LavenderBlush;
-pen MediumBlue;
-pen MediumOrchid;
-pen MediumPurple;
-pen MediumSeaGreen;
-pen MediumSlateBlue;
-pen MediumAquamarine;
-pen MediumSpringGreen;
-pen MediumTurquoise;
-pen Wheat;
-pen MediumVioletRed;
+pen SaddleBrown;
+pen RosyBrown;
+pen Purple;
+pen PowderBlue;
pen Plum;
+pen Pink;
pen PeachPuff;
-pen Blue;
-pen Gold;
-pen BlueViolet;
-pen Goldenrod;
-pen ForestGreen;
-pen Chartreuse;
-pen NavajoWhite;
-pen Maroon;
-pen Lime;
-pen SteelBlue;
-pen YellowGreen;
-pen Tan;
-pen DarkMagenta;
-pen AntiqueWhite;
+pen PapayaWhip;
+pen PaleVioletRed;
pen PaleTurquoise;
-pen IndianRed;
-pen Crimson;
-pen Azure;
-pen LawnGreen;
-pen Brown;
-pen BurlyWood;
-pen Moccasin;
-pen DarkBlue;
-pen Peru;
-pen White;
-pen Purple;
-pen WhiteSmoke;
-pen LemonChiffon;
-pen DimGray;
-pen Orange;
+pen PaleGoldenrod;
pen OrangeRed;
-pen Fuchsia;
-pen Aqua;
-pen Bisque;
-pen Honeydew;
-pen RosyBrown;
-pen Black;
-pen Violet;
-pen Khaki;
-pen FireBrick;
-pen Snow;
-pen Thistle;
-pen LimeGreen;
-pen Sienna;
+pen Orange;
+pen Olive;
pen OldLace;
-pen Green;
+pen NavajoWhite;
+pen Moccasin;
+pen MintCream;
+pen MidnightBlue;
+pen MediumTurquoise;
+pen MediumSpringGreen;
+pen MediumSlateBlue;
+pen MediumPurple;
+pen Linen;
+pen LimeGreen;
+pen LightSlateGray;
+pen LightSkyBlue;
+pen LightSalmon;
+pen LightGoldenrodYellow;
+pen LightCyan;
+pen LightCoral;
+pen LightBlue;
+pen LawnGreen;
+pen LavenderBlush;
+pen Lavender;
+pen Khaki;
+pen IndianRed;
+pen HotPink;
pen GreenYellow;
-pen DarkOrchid;
-pen DarkCyan;
+pen Green;
+pen Goldenrod;
+pen Gold;
+pen Gainsboro;
+pen Fuchsia;
pen FloralWhite;
-pen DarkRed;
-pen BlanchedAlmond;
-pen PowderBlue;
-pen DarkGray;
-pen DarkGreen;
-pen DarkGoldenrod;
-pen DarkOliveGreen;
-pen SkyBlue;
-pen DarkOrange;
-pen SeaGreen;
+pen DodgerBlue;
+pen DeepSkyBlue;
pen DarkViolet;
+pen DarkSlateGray;
+pen DarkSlateBlue;
+pen DarkSeaGreen;
+pen DarkSalmon;
+pen Aquamarine;
+pen FireBrick;
+pen White;
+pen Lime;
+pen Black;
+pen DeepPink;
+pen LightPink;
+pen Navy;
+pen SlateGray;
+pen LightGrey;
+pen LemonChiffon;
+pen Wheat;
+pen Cyan;
+pen DarkOrange;
+pen Peru;
+pen Sienna;
+pen Salmon;
+pen DimGray;
+pen AntiqueWhite;
+pen ForestGreen;
+pen SlateBlue;
pen Teal;
+pen Gray;
+pen DarkCyan;
+pen CadetBlue;
+pen LightYellow;
+pen Ivory;
+pen BlueViolet;
pen AliceBlue;
-pen HotPink;
-pen DodgerBlue;
-pen Silver;
-pen SaddleBrown;
-pen Tomato;
-pen DarkKhaki;
-pen LightBlue;
-pen LightCoral;
-pen LightCyan;
-pen Yellow;
+pen Coral;
+pen Turquoise;
+pen Brown;
+pen LightSteelBlue;
+pen MediumAquamarine;
+pen Red;
+pen Azure;
+pen DarkGray;
+pen LightSeaGreen;
+pen MediumBlue;
+pen MediumOrchid;
pen LightGreen;
-pen SandyBrown;
-pen Salmon;
+pen Blue;
+pen MediumSeaGreen;
+pen Orchid;
pen PaleGreen;
-pen Linen;
-pen LightGoldenrodYellow;
-pen LightGrey;
-pen LightPink;
-pen PaleGoldenrod;
-pen LightSalmon;
-pen LightSeaGreen;
-pen LightSkyBlue;
-pen LightSlateGray;
-pen Navy;
-pen PaleVioletRed;
pen CornflowerBlue;
-pen LightSteelBlue;
-pen LightYellow;
-pen rgbint(int r, int g, int b);
-pen Coral;
-pen DeepSkyBlue;
-pen MistyRose;
-pen DarkSalmon;
-pen DarkSeaGreen;
+pen GhostWhite;
+pen Yellow;
+pen SandyBrown;
+pen Chocolate;
+pen DarkRed;
+pen Crimson;
+pen Indigo;
+pen DarkOrchid;
+pen Aqua;
+pen Tan;
+pen MediumVioletRed;
+pen Maroon;
+pen DarkBlue;
+pen OliveDrab;
+pen Magenta;
pen RoyalBlue;
-pen DarkSlateBlue;
-pen DarkSlateGray;
-pen Turquoise;
+pen MistyRose;
+pen Honeydew;
+pen Chartreuse;
+pen DarkOliveGreen;
+pen SeaGreen;
+pen DarkTurquoise;
+pen Cornsilk;
+pen rgbint(int r, int g, int b);
+pen Beige;
+pen Bisque;
+pen BlanchedAlmond;
+pen BurlyWood;
+pen DarkGoldenrod;
+pen DarkGreen;
+pen DarkKhaki;
+pen DarkMagenta;
diff --git a/graphics/asymptote/asymptote.spec b/graphics/asymptote/asymptote.spec
index c1bf0606aa..f631963710 100644
--- a/graphics/asymptote/asymptote.spec
+++ b/graphics/asymptote/asymptote.spec
@@ -3,7 +3,7 @@
%global __python %{__python3}
Name: asymptote
-Version: 2.90
+Version: 3.00
Release: 1%{?dist}
Summary: Descriptive vector graphics language
@@ -17,7 +17,6 @@ BuildRequires: gcc-c++
BuildRequires: ncurses-devel
BuildRequires: readline-devel
BuildRequires: fftw-devel >= 3.0
-BuildRequires: gc-devel >= 6.7
BuildRequires: gsl-devel
BuildRequires: glm-devel
BuildRequires: tetex-latex
diff --git a/graphics/asymptote/parser.cc b/graphics/asymptote/asyparser.cc
index cdda1f9a28..35bca84d90 100644
--- a/graphics/asymptote/parser.cc
+++ b/graphics/asymptote/asyparser.cc
@@ -12,18 +12,20 @@
#include "common.h"
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
#ifdef HAVE_LIBCURL
#include <curl/curl.h>
#endif
+#include "exithandlers.h"
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
#include "interact.h"
#include "locate.h"
#include "errormsg.h"
-#include "parser.h"
+#include "asyparser.h"
#include "util.h"
// The lexical analysis and parsing functions used by parseFile.
@@ -33,7 +35,6 @@ extern int yydebug;
extern int yy_flex_debug;
extern bool lexerEOF();
extern void reportEOF();
-extern bool hangup;
namespace parser {
@@ -59,7 +60,7 @@ void error(const string& filename)
{
em.sync();
em << "error: could not load module '" << filename << "'\n";
- em.sync();
+ em.sync(true);
throw handled_error();
}
}
diff --git a/graphics/asymptote/parser.h b/graphics/asymptote/asyparser.h
index 903ef2d5fa..2ffd1988d6 100644
--- a/graphics/asymptote/parser.h
+++ b/graphics/asymptote/asyparser.h
@@ -1,11 +1,10 @@
/*****
- * parser.h
+ * asyparser.h
* Tom Prince 2004/01/10
*
*****/
-#ifndef PARSER_H
-#define PARSER_H
+#pragma once
#include "common.h"
#include "absyn.h"
@@ -34,5 +33,3 @@ bool isURL(const string& filename);
bool readURL(stringstream& buf, const string& filename);
} // namespace parser
-
-#endif // PARSER_H
diff --git a/graphics/asymptote/process.cc b/graphics/asymptote/asyprocess.cc
index 9c3d2d313f..06fcaf13c8 100644
--- a/graphics/asymptote/process.cc
+++ b/graphics/asymptote/asyprocess.cc
@@ -10,6 +10,7 @@
#include "types.h"
#include "errormsg.h"
#include "genv.h"
+#include "coenv.h"
#include "stm.h"
#include "settings.h"
#include "vm.h"
@@ -23,7 +24,7 @@
#include "runtime.h"
#include "texfile.h"
-#include "process.h"
+#include "asyprocess.h"
namespace camp {
pen& defaultpen() {
@@ -101,6 +102,7 @@ public:
penv() : _ge(0), _pd() {
// Push the processData first, as it needs to be on the stack before genv
// is initialized.
+ _pd.topPos = nullPos;
processDataStack.push(&_pd);
_ge = new genv;
}
@@ -279,7 +281,8 @@ void itree::doList() {
if (tree) {
penv pe;
record *r=tree->transAsFile(pe.ge(), symbol::trans(getName()));
- r->e.list(r);
+ if(r)
+ r->e.list(r);
}
}
@@ -289,7 +292,7 @@ void itree::run(coenv &e, istack &s, transMode tm) {
for(mem::list<runnable *>::iterator r=tree->stms.begin();
r != tree->stms.end(); ++r) {
processData().fileName=(*r)->getPos().filename();
- if(!em.errors() || getSetting<bool>("debug"))
+ if(!em.errors() || debug)
runRunnable(*r,e,s,tm);
}
}
@@ -303,7 +306,7 @@ void itree::doExec(transMode tm) {
void printGreeting(bool interactive) {
if(!getSetting<bool>("quiet")) {
- cout << "Welcome to " << PROGRAM << " version " << REVISION;
+ cout << "Welcome to " << PACKAGE_NAME << " version " << REVISION;
if(interactive)
cout << " (to view the manual, type help)";
cout << endl;
@@ -649,7 +652,7 @@ class iprompt : public icore {
#define ADDCOMMAND(name, func) \
commands[#name]=&iprompt::func
- // keywords.pl looks for ADDCOMMAND to identify special commands in the
+ // keywords.py looks for ADDCOMMAND to identify special commands in the
// auto-completion.
ADDCOMMAND(quit,exit);
ADDCOMMAND(q,q);
@@ -701,7 +704,7 @@ class iprompt : public icore {
// detecting it in multiline mode).
string getline(bool continuation) {
string prompt;
- if(!getSetting<bool>("xasy"))
+ if(!settings::xasy)
prompt=getSetting<string>(continuation ? "prompt2" : "prompt");
string line=interact::simpleline(prompt);
@@ -730,11 +733,7 @@ class iprompt : public icore {
// Continue taking input until a termination command is received from xasy.
block *parseXasyLine(string line) {
-#ifdef __MSDOS__
- const string EOT="\x04\r\n";
-#else
const string EOT="\x04\n";
-#endif
string s;
while((s=getline(true)) != EOT)
line += s;
@@ -748,7 +747,7 @@ class iprompt : public icore {
icode i(code);
i.run(e,s,TRANS_INTERACTIVE);
- } else if(getSetting<bool>("xasy")) {
+ } else if(settings::xasy) {
block *code=parseXasyLine(line);
icode i(code);
@@ -830,7 +829,7 @@ public:
} catch(interrupted&) {
em.Interrupt(false);
restart=true;
- } catch(eof&) {
+ } catch(EofException&) {
restart=false;
}
} while(restart);
diff --git a/graphics/asymptote/process.h b/graphics/asymptote/asyprocess.h
index 031111bd9b..2f80416ebf 100644
--- a/graphics/asymptote/process.h
+++ b/graphics/asymptote/asyprocess.h
@@ -7,9 +7,7 @@
* running it.
*****/
-#ifndef PROCESS_H
-#define PROCESS_H
-
+#pragma once
#include "common.h"
#include "stm.h"
@@ -19,7 +17,7 @@
#include "pen.h"
#include "dec.h"
#include "transform.h"
-#include "parser.h"
+#include "asyparser.h"
#ifdef HAVE_LIBTIRPC
#include "xstream.h"
@@ -208,5 +206,3 @@ public:
};
processDataStruct &processData();
-
-#endif
diff --git a/graphics/asymptote/autogen.sh b/graphics/asymptote/autogen.sh
index 5ec2b3585b..127bdeba65 100755
--- a/graphics/asymptote/autogen.sh
+++ b/graphics/asymptote/autogen.sh
@@ -1,3 +1,17 @@
#!/bin/sh
+command -v libtoolize >/dev/null 2>&1
+if [ $? -ne 0 ]; then
+ command -v libtool >/dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ echo "autogen.sh: error: could not find libtool. libtool is required to run autogen.sh." 1>&2
+ exit 1
+ fi
+fi
+
autoheader && autoconf
+
+cd gc
+autoreconf -if
+automake --add-missing
+cd ..
diff --git a/graphics/asymptote/ax_pthread.m4 b/graphics/asymptote/ax_pthread.m4
index d90de34d14..9f35d13914 100644
--- a/graphics/asymptote/ax_pthread.m4
+++ b/graphics/asymptote/ax_pthread.m4
@@ -1,5 +1,5 @@
# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# https://www.gnu.org/software/autoconf-archive/ax_pthread.html
# ===========================================================================
#
# SYNOPSIS
@@ -14,24 +14,28 @@
# flags that are needed. (The user can also force certain compiler
# flags/libs to be tested by setting these environment variables.)
#
-# Also sets PTHREAD_CC to any special C compiler that is needed for
-# multi-threaded programs (defaults to the value of CC otherwise). (This
-# is necessary on AIX to use the special cc_r compiler alias.)
+# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is
+# needed for multi-threaded programs (defaults to the value of CC
+# respectively CXX otherwise). (This is necessary on e.g. AIX to use the
+# special cc_r/CC_r compiler alias.)
#
# NOTE: You are assumed to not only compile your program with these flags,
-# but also link it with them as well. e.g. you should link with
+# but also to link with them as well. For example, you might link with
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
#
-# If you are only building threads programs, you may wish to use these
+# If you are only building threaded programs, you may wish to use these
# variables in your default LIBS, CFLAGS, and CC:
#
# LIBS="$PTHREAD_LIBS $LIBS"
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS"
# CC="$PTHREAD_CC"
+# CXX="$PTHREAD_CXX"
#
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
-# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
-# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
+# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
#
# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
@@ -55,6 +59,7 @@
#
# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+# Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
#
# 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 the
@@ -67,7 +72,7 @@
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
+# with this program. If not, see <https://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
@@ -82,35 +87,41 @@
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
-#serial 18
+#serial 31
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
AC_DEFUN([AX_PTHREAD], [
AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_SED])
AC_LANG_PUSH([C])
ax_pthread_ok=no
# We used to check for pthread.h first, but this fails if pthread.h
-# requires special compiler flags (e.g. on True64 or Sequent).
+# requires special compiler flags (e.g. on Tru64 or Sequent).
# It gets checked for in the link test anyway.
# First of all, check if the user has set any of the PTHREAD_LIBS,
# etcetera environment variables, and if threads linking works using
# them:
-if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
- save_CFLAGS="$CFLAGS"
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+ ax_pthread_save_CC="$CC"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
+ AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"])
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- save_LIBS="$LIBS"
LIBS="$PTHREAD_LIBS $LIBS"
- AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
- AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes)
- AC_MSG_RESULT($ax_pthread_ok)
- if test x"$ax_pthread_ok" = xno; then
+ AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
+ AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
+ AC_MSG_RESULT([$ax_pthread_ok])
+ if test "x$ax_pthread_ok" = "xno"; then
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CC="$ax_pthread_save_CC"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
fi
# We must check for the threads library under a number of different
@@ -118,12 +129,14 @@ fi
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
# libraries is broken (non-POSIX).
-# Create a list of thread flags to try. Items starting with a "-" are
-# C compiler flags, and other items are library names, except for "none"
-# which indicates that we try without any flags at all, and "pthread-config"
-# which is a program returning the flags for the Pth emulation library.
+# Create a list of thread flags to try. Items with a "," contain both
+# C compiler flags (before ",") and linker flags (after ","). Other items
+# starting with a "-" are C compiler flags, and remaining items are
+# library names, except for "none" which indicates that we try without
+# any flags at all, and "pthread-config" which is a program returning
+# the flags for the Pth emulation library.
-ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
# The ordering *is* (sometimes) important. Some notes on the
# individual items follow:
@@ -132,68 +145,163 @@ ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt
# none: in case threads are in libc; should be tried before -Kthread and
# other compiler flags to prevent continual compiler warnings
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
-# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
-# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
-# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
-# -pthreads: Solaris/gcc
-# -mthreads: Mingw32/gcc, Lynx/gcc
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+# (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
-# doesn't hurt to check since this sometimes defines pthreads too;
-# also defines -D_REENTRANT)
-# ... -mt is also the pthreads flag for HP/aCC
+# doesn't hurt to check since this sometimes defines pthreads and
+# -D_REENTRANT too), HP C (must be checked before -lpthread, which
+# is present but should not be used directly; and before -mthreads,
+# because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
# pthread: Linux, etcetera
# --thread-safe: KAI C++
# pthread-config: use pthread-config program (for GNU Pth library)
-case ${host_os} in
+case $host_os in
+
+ freebsd*)
+
+ # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+ # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+ ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+ ;;
+
+ hpux*)
+
+ # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+ # multi-threading and also sets -lpthread."
+
+ ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+ ;;
+
+ openedition*)
+
+ # IBM z/OS requires a feature-test macro to be defined in order to
+ # enable POSIX threads at all, so give the user a hint if this is
+ # not set. (We don't define these ourselves, as they can affect
+ # other portions of the system API in unpredictable ways.)
+
+ AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
+ [
+# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+ AX_PTHREAD_ZOS_MISSING
+# endif
+ ],
+ [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
+ ;;
+
solaris*)
# On Solaris (at least, for some versions), libc contains stubbed
# (non-functional) versions of the pthreads routines, so link-based
- # tests will erroneously succeed. (We need to link with -pthreads/-mt/
- # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
- # a function called by this macro, so we could check for that, but
- # who knows whether they'll stub that too in a future libc.) So,
- # we'll just look for -pthreads and -lpthread first:
+ # tests will erroneously succeed. (N.B.: The stubs are missing
+ # pthread_cleanup_push, or rather a function called by this macro,
+ # so we could check for that, but who knows whether they'll stub
+ # that too in a future libc.) So we'll check first for the
+ # standard Solaris way of linking pthreads (-mt -lpthread).
- ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
+ ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
;;
+esac
- darwin*)
- ax_pthread_flags="-pthread $ax_pthread_flags"
+# Are we compiling with Clang?
+
+AC_CACHE_CHECK([whether $CC is Clang],
+ [ax_cv_PTHREAD_CLANG],
+ [ax_cv_PTHREAD_CLANG=no
+ # Note that Autoconf sets GCC=yes for Clang as well as GCC
+ if test "x$GCC" = "xyes"; then
+ AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
+ [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+# if defined(__clang__) && defined(__llvm__)
+ AX_PTHREAD_CC_IS_CLANG
+# endif
+ ],
+ [ax_cv_PTHREAD_CLANG=yes])
+ fi
+ ])
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+
+# Note that for GCC and Clang -pthread generally implies -lpthread,
+# except when -nostdlib is passed.
+# This is problematic using libtool to build C++ shared libraries with pthread:
+# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
+# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
+# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
+# To solve this, first try -pthread together with -lpthread for GCC
+
+AS_IF([test "x$GCC" = "xyes"],
+ [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"])
+
+# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
+
+AS_IF([test "x$ax_pthread_clang" = "xyes"],
+ [ax_pthread_flags="-pthread,-lpthread -pthread"])
+
+
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
+
+case $host_os in
+ darwin* | hpux* | linux* | osf* | solaris*)
+ ax_pthread_check_macro="_REENTRANT"
+ ;;
+
+ aix*)
+ ax_pthread_check_macro="_THREAD_SAFE"
+ ;;
+
+ *)
+ ax_pthread_check_macro="--"
;;
esac
+AS_IF([test "x$ax_pthread_check_macro" = "x--"],
+ [ax_pthread_check_cond=0],
+ [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
+
-if test x"$ax_pthread_ok" = xno; then
-for flag in $ax_pthread_flags; do
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
- case $flag in
+ case $ax_pthread_try_flag in
none)
AC_MSG_CHECKING([whether pthreads work without any flags])
;;
+ *,*)
+ PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
+ PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
+ AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"])
+ ;;
+
-*)
- AC_MSG_CHECKING([whether pthreads work with $flag])
- PTHREAD_CFLAGS="$flag"
+ AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
+ PTHREAD_CFLAGS="$ax_pthread_try_flag"
;;
pthread-config)
- AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no)
- if test x"$ax_pthread_config" = xno; then continue; fi
+ AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
+ AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
PTHREAD_CFLAGS="`pthread-config --cflags`"
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
;;
*)
- AC_MSG_CHECKING([for the pthreads library -l$flag])
- PTHREAD_LIBS="-l$flag"
+ AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
+ PTHREAD_LIBS="-l$ax_pthread_try_flag"
;;
esac
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
- LIBS="$PTHREAD_LIBS $LIBS"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
# Check for various functions. We must include pthread.h,
# since some functions may be macros. (On the Sequent, we
@@ -204,8 +312,18 @@ for flag in $ax_pthread_flags; do
# pthread_cleanup_push because it is one of the few pthread
# functions on Solaris that doesn't have a non-functional libc stub.
# We try pthread_create on general principles.
+
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
- static void routine(void *a) { a = 0; }
+# if $ax_pthread_check_cond
+# error "$ax_pthread_check_macro must be defined"
+# endif
+ static void *some_global = NULL;
+ static void routine(void *a)
+ {
+ /* To avoid any unused-parameter or
+ unused-but-set-parameter warning. */
+ some_global = a;
+ }
static void *start_routine(void *a) { return a; }],
[pthread_t th; pthread_attr_t attr;
pthread_create(&th, 0, start_routine, 0);
@@ -213,93 +331,188 @@ for flag in $ax_pthread_flags; do
pthread_attr_init(&attr);
pthread_cleanup_push(routine, 0);
pthread_cleanup_pop(0) /* ; */])],
- [ax_pthread_ok=yes],
- [])
+ [ax_pthread_ok=yes],
+ [])
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
- AC_MSG_RESULT($ax_pthread_ok)
- if test "x$ax_pthread_ok" = xyes; then
- break;
- fi
+ AC_MSG_RESULT([$ax_pthread_ok])
+ AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
done
fi
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+ # Clang takes -pthread; it has never supported any other flag
+
+ # (Note 1: This will need to be revisited if a system that Clang
+ # supports has POSIX threads in a separate library. This tends not
+ # to be the way of modern systems, but it's conceivable.)
+
+ # (Note 2: On some systems, notably Darwin, -pthread is not needed
+ # to get POSIX threads support; the API is always present and
+ # active. We could reasonably leave PTHREAD_CFLAGS empty. But
+ # -pthread does define _REENTRANT, and while the Darwin headers
+ # ignore this macro, third-party headers might not.)
+
+ # However, older versions of Clang make a point of warning the user
+ # that, in an invocation where only linking and no compilation is
+ # taking place, the -pthread option has no effect ("argument unused
+ # during compilation"). They expect -pthread to be passed in only
+ # when source code is being compiled.
+ #
+ # Problem is, this is at odds with the way Automake and most other
+ # C build frameworks function, which is that the same flags used in
+ # compilation (CFLAGS) are also used in linking. Many systems
+ # supported by AX_PTHREAD require exactly this for POSIX threads
+ # support, and in fact it is often not straightforward to specify a
+ # flag that is used only in the compilation phase and not in
+ # linking. Such a scenario is extremely rare in practice.
+ #
+ # Even though use of the -pthread flag in linking would only print
+ # a warning, this can be a nuisance for well-run software projects
+ # that build with -Werror. So if the active version of Clang has
+ # this misfeature, we search for an option to squash it.
+
+ AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
+ [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
+ [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+ # Create an alternate version of $ac_link that compiles and
+ # links in two steps (.c -> .o, .o -> exe) instead of one
+ # (.c -> exe), because the warning occurs only in the second
+ # step
+ ax_pthread_save_ac_link="$ac_link"
+ ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+ ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"`
+ ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+ AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
+ CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+ ac_link="$ax_pthread_save_ac_link"
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+ [ac_link="$ax_pthread_2step_ac_link"
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+ [break])
+ ])
+ done
+ ac_link="$ax_pthread_save_ac_link"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
+ ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+ ])
+
+ case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+ no | unknown) ;;
+ *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+ esac
+
+fi # $ax_pthread_clang = yes
+
+
+
# Various other checks:
-if test "x$ax_pthread_ok" = xyes; then
- save_LIBS="$LIBS"
- LIBS="$PTHREAD_LIBS $LIBS"
- save_CFLAGS="$CFLAGS"
+if test "x$ax_pthread_ok" = "xyes"; then
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
- AC_MSG_CHECKING([for joinable pthread attribute])
- attr_name=unknown
- for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
- AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
- [int attr = $attr; return attr /* ; */])],
- [attr_name=$attr; break],
- [])
- done
- AC_MSG_RESULT($attr_name)
- if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
- AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
- [Define to necessary symbol if this constant
- uses a non-standard name on your system.])
- fi
+ AC_CACHE_CHECK([for joinable pthread attribute],
+ [ax_cv_PTHREAD_JOINABLE_ATTR],
+ [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+ for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
+ [int attr = $ax_pthread_attr; return attr /* ; */])],
+ [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
+ [])
+ done
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+ test "x$ax_pthread_joinable_attr_defined" != "xyes"],
+ [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
+ [$ax_cv_PTHREAD_JOINABLE_ATTR],
+ [Define to necessary symbol if this constant
+ uses a non-standard name on your system.])
+ ax_pthread_joinable_attr_defined=yes
+ ])
- AC_MSG_CHECKING([if more special flags are required for pthreads])
- flag=no
- case ${host_os} in
- aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
- osf* | hpux*) flag="-D_REENTRANT";;
- solaris*)
- if test "$GCC" = "yes"; then
- flag="-D_REENTRANT"
- else
- flag="-mt -D_REENTRANT"
- fi
- ;;
- esac
- AC_MSG_RESULT(${flag})
- if test "x$flag" != xno; then
- PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
- fi
+ AC_CACHE_CHECK([whether more special flags are required for pthreads],
+ [ax_cv_PTHREAD_SPECIAL_FLAGS],
+ [ax_cv_PTHREAD_SPECIAL_FLAGS=no
+ case $host_os in
+ solaris*)
+ ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+ ;;
+ esac
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+ test "x$ax_pthread_special_flags_added" != "xyes"],
+ [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+ ax_pthread_special_flags_added=yes])
AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
- ax_cv_PTHREAD_PRIO_INHERIT, [
- AC_LINK_IFELSE([
- AC_LANG_PROGRAM([[#include <pthread.h>]], [[int i = PTHREAD_PRIO_INHERIT;]])],
- [ax_cv_PTHREAD_PRIO_INHERIT=yes],
- [ax_cv_PTHREAD_PRIO_INHERIT=no])
+ [ax_cv_PTHREAD_PRIO_INHERIT],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
+ [[int i = PTHREAD_PRIO_INHERIT;
+ return i;]])],
+ [ax_cv_PTHREAD_PRIO_INHERIT=yes],
+ [ax_cv_PTHREAD_PRIO_INHERIT=no])
])
- AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"],
- AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.]))
+ AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+ test "x$ax_pthread_prio_inherit_defined" != "xyes"],
+ [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
+ ax_pthread_prio_inherit_defined=yes
+ ])
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
- # More AIX lossage: must compile with xlc_r or cc_r
- if test x"$GCC" != xyes; then
- AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
- else
- PTHREAD_CC=$CC
+ # More AIX lossage: compile with *_r variant
+ if test "x$GCC" != "xyes"; then
+ case $host_os in
+ aix*)
+ AS_CASE(["x/$CC"],
+ [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
+ [#handle absolute path differently from PATH based program lookup
+ AS_CASE(["x$CC"],
+ [x/*],
+ [
+ AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])
+ AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])])
+ ],
+ [
+ AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])
+ AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])])
+ ]
+ )
+ ])
+ ;;
+ esac
fi
-else
- PTHREAD_CC="$CC"
fi
-AC_SUBST(PTHREAD_LIBS)
-AC_SUBST(PTHREAD_CFLAGS)
-AC_SUBST(PTHREAD_CC)
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
+
+AC_SUBST([PTHREAD_LIBS])
+AC_SUBST([PTHREAD_CFLAGS])
+AC_SUBST([PTHREAD_CC])
+AC_SUBST([PTHREAD_CXX])
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
-if test x"$ax_pthread_ok" = xyes; then
- ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
+if test "x$ax_pthread_ok" = "xyes"; then
+ ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
:
else
ax_pthread_ok=no
diff --git a/graphics/asymptote/backports/getopt/CMakeLists.txt b/graphics/asymptote/backports/getopt/CMakeLists.txt
new file mode 100644
index 0000000000..0691562cc3
--- /dev/null
+++ b/graphics/asymptote/backports/getopt/CMakeLists.txt
@@ -0,0 +1,27 @@
+cmake_minimum_required(VERSION 3.27)
+
+project(getopt)
+
+add_library(
+ getopt
+ ${CMAKE_CURRENT_LIST_DIR}/src/getopt.c
+ ${CMAKE_CURRENT_LIST_DIR}/src/getopt1.c
+)
+
+target_include_directories(
+ getopt
+ PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include)
+
+
+# we are requring string.h here
+
+include(CheckIncludeFile)
+
+check_include_file("string.h" HAVE_STRING_HEADER_FILE)
+
+if (HAVE_STRING_HEADER_FILE)
+ target_compile_definitions(
+ getopt
+ PRIVATE HAVE_STRING_H=1
+ )
+endif()
diff --git a/graphics/asymptote/getopt.h b/graphics/asymptote/backports/getopt/include/getopt.h
index 0648548081..0648548081 100644
--- a/graphics/asymptote/getopt.h
+++ b/graphics/asymptote/backports/getopt/include/getopt.h
diff --git a/graphics/asymptote/getopt.c b/graphics/asymptote/backports/getopt/src/getopt.c
index 9bafa453c6..9bafa453c6 100644
--- a/graphics/asymptote/getopt.c
+++ b/graphics/asymptote/backports/getopt/src/getopt.c
diff --git a/graphics/asymptote/getopt1.c b/graphics/asymptote/backports/getopt/src/getopt1.c
index 22a7efbdd1..de4dedbb25 100644
--- a/graphics/asymptote/getopt1.c
+++ b/graphics/asymptote/backports/getopt/src/getopt1.c
@@ -64,12 +64,7 @@
#endif
int
-getopt_long (argc, argv, options, long_options, opt_index)
- int argc;
- char *const *argv;
- const char *options;
- const struct option *long_options;
- int *opt_index;
+getopt_long (int argc, char* const* argv, const char* options, const struct option* long_options, int* opt_index)
{
return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
}
@@ -80,12 +75,7 @@ getopt_long (argc, argv, options, long_options, opt_index)
instead. */
int
-getopt_long_only (argc, argv, options, long_options, opt_index)
- int argc;
- char *const *argv;
- const char *options;
- const struct option *long_options;
- int *opt_index;
+getopt_long_only (int argc, char* const* argv, const char* options, const struct option* long_options, int* opt_index)
{
return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
}
diff --git a/graphics/asymptote/backports/glew/CMakeLists.txt b/graphics/asymptote/backports/glew/CMakeLists.txt
new file mode 100644
index 0000000000..6a54a0dd12
--- /dev/null
+++ b/graphics/asymptote/backports/glew/CMakeLists.txt
@@ -0,0 +1,10 @@
+cmake_minimum_required(VERSION 3.27)
+
+project(GLEW)
+
+add_library(GLEW STATIC ${CMAKE_CURRENT_LIST_DIR}/src/glew.c)
+target_include_directories(GLEW PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include)
+
+if (WIN32)
+ target_compile_definitions(GLEW PUBLIC GLEW_STATIC)
+endif()
diff --git a/graphics/asymptote/GL/glew.h b/graphics/asymptote/backports/glew/include/GL/glew.h
index b5b6987fc7..b5b6987fc7 100644
--- a/graphics/asymptote/GL/glew.h
+++ b/graphics/asymptote/backports/glew/include/GL/glew.h
diff --git a/graphics/asymptote/GL/glxew.h b/graphics/asymptote/backports/glew/include/GL/glxew.h
index 7e39c2fd98..7e39c2fd98 100644
--- a/graphics/asymptote/GL/glxew.h
+++ b/graphics/asymptote/backports/glew/include/GL/glxew.h
diff --git a/graphics/asymptote/GL/wglew.h b/graphics/asymptote/backports/glew/include/GL/wglew.h
index 2097c0f033..2097c0f033 100644
--- a/graphics/asymptote/GL/wglew.h
+++ b/graphics/asymptote/backports/glew/include/GL/wglew.h
diff --git a/graphics/asymptote/GL/glew.c b/graphics/asymptote/backports/glew/src/glew.c
index 62cc2f563b..62cc2f563b 100644
--- a/graphics/asymptote/GL/glew.c
+++ b/graphics/asymptote/backports/glew/src/glew.c
diff --git a/graphics/asymptote/backports/optional/CMakeLists.txt b/graphics/asymptote/backports/optional/CMakeLists.txt
new file mode 100644
index 0000000000..f99e8177d0
--- /dev/null
+++ b/graphics/asymptote/backports/optional/CMakeLists.txt
@@ -0,0 +1,6 @@
+cmake_minimum_required(VERSION 3.27)
+
+project(OptionalBackport)
+
+add_library(OptionalBackport INTERFACE)
+target_include_directories(OptionalBackport INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include/)
diff --git a/graphics/asymptote/optional.hpp b/graphics/asymptote/backports/optional/include/optional.hpp
index 86e3b407c6..86e3b407c6 100644
--- a/graphics/asymptote/optional.hpp
+++ b/graphics/asymptote/backports/optional/include/optional.hpp
diff --git a/graphics/asymptote/base/animation.asy b/graphics/asymptote/base/animation.asy
index 1ce89c60e6..02794ea9b4 100644
--- a/graphics/asymptote/base/animation.asy
+++ b/graphics/asymptote/base/animation.asy
@@ -74,10 +74,10 @@ struct animation {
int merge(int loops=0, real delay=animationdelay, string format="gif",
string options="", bool keep=settings.keep) {
- string args="-loop " +(string) loops+" -delay "+(string)(delay/10)+
- " -alpha Off -dispose Background "+options;
+ string args="-loop " +(string) loops+" -delay "+(string)(delay/10);
for(int i=0; i < files.length; ++i)
- args += " " +files[i];
+ args += " "+files[i];
+ args += " -alpha Off -dispose Background "+options;
int rc=convert(args,prefix+"."+format,format=format);
this.purge(keep);
if(rc == 0) animate(file=prefix+"."+format,format=format);
diff --git a/graphics/asymptote/base/feynman.asy b/graphics/asymptote/base/feynman.asy
index 4182d98928..1fdc846cdb 100644
--- a/graphics/asymptote/base/feynman.asy
+++ b/graphics/asymptote/base/feynman.asy
@@ -342,17 +342,20 @@ void drawGhost(picture pic = currentpicture,
draw(pic, p, fgpen, arrow);
}
-// draw a double line on picture pic, along path p with pen fgpen, an inner
-// spacing of dlspacint and an arrowhead arrow. If erasebg is true, bgpen is
-// used to erase the background at a margin margin around the line. The
-// background is not erased at a certain distance to the endpoints, which is
+arrowbar DoubleLineMidArrow=MidArrow(Fill(doublelinepen));
+
+// draw a double line on picture pic, along path p with pen fgpen and
+// an inner spacing of dlspacint. An optional arrowhead DoubleLineMidArrow
+// can be specified. If erasebg is true, bgpen is used to erase the
+// background at a margin margin around the line. The background is
+// not erased at a certain distance to the endpoints, which is
// determined by vertexangle (see comments to the default parameter
// minvertexangle).
void drawDoubleLine(picture pic = currentpicture,
path p,
pen fgpen = doublelinepen,
real dlspacing = doublelinespacing,
- arrowbar arrow = currentarrow,
+ arrowbar arrow = None,
bool erasebg = overpaint,
pen bgpen = backgroundpen,
real vertexangle = minvertexangle,
@@ -618,5 +621,3 @@ void texshipout(string stem,
close(tf);
shipout(stem+suffix, pic);
}
-
-
diff --git a/graphics/asymptote/base/graph3.asy b/graphics/asymptote/base/graph3.asy
index b9b872f451..7a55ef863d 100644
--- a/graphics/asymptote/base/graph3.asy
+++ b/graphics/asymptote/base/graph3.asy
@@ -68,7 +68,7 @@ triple ticklabelshift(triple align, pen p=currentpen)
// Signature of routines that draw labelled paths with ticks and tick labels.
typedef void ticks3(picture, transform3, Label, path3, path3, pen,
arrowbar3, margin3, ticklocate, int[], bool opposite=false,
- bool primary=true);
+ bool primary=true, projection P);
// Label a tick on a frame.
void labeltick(picture pic, transform3 T, path3 g,
@@ -164,7 +164,8 @@ ticks3 Ticks3(int sign, Label F="", ticklabel ticklabel=null,
{
return new void(picture pic, transform3 t, Label L, path3 g, path3 g2, pen p,
arrowbar3 arrow, margin3 margin, ticklocate locate,
- int[] divisor, bool opposite, bool primary) {
+ int[] divisor, bool opposite, bool primary,
+ projection P=currentprojection) {
// Use local copy of context variables:
int Sign=opposite ? -1 : 1;
int sign=Sign*sign;
@@ -261,17 +262,18 @@ ticks3 Ticks3(int sign, Label F="", ticklabel ticklabel=null,
return new void(picture pic, transform3 T, Label L,
path3 g, path3 g2, pen p,
arrowbar3 arrow, margin3 margin=NoMargin3, ticklocate locate,
- int[] divisor, bool opposite, bool primary) {
+ int[] divisor, bool opposite, bool primary,
+ projection P=currentprojection) {
path3 G=T*g;
real limit=Step == 0 ? axiscoverage*arclength(G) : 0;
tickvalues values=modify(generateticks(sign,F,ticklabel,N,n,Step,step,
Size,size,identity(),1,
- project(G,currentprojection),
+ project(G,P),
limit,p,locate,divisor,
opposite));
Ticks3(sign,F,ticklabel,beginlabel,endlabel,values.major,values.minor,
values.N,begin,end,Size,size,extend,pTick,ptick)
- (pic,T,L,g,g2,p,arrow,margin,locate,divisor,opposite,primary);
+ (pic,T,L,g,g2,p,arrow,margin,locate,divisor,opposite,primary,P);
};
}
@@ -279,7 +281,8 @@ ticks3 NoTicks3()
{
return new void(picture pic, transform3 T, Label L, path3 g,
path3, pen p, arrowbar3 arrow, margin3 margin,
- ticklocate, int[], bool opposite, bool primary) {
+ ticklocate, int[], bool opposite, bool primary,
+ projection P=currentprojection) {
path3 G=T*g;
if(primary) draw(pic,margin(G,p).g,p,arrow,margin);
else draw(pic,G,p);
@@ -478,9 +481,10 @@ void axis(picture pic=currentpicture, Label L="", path3 g, path3 g2=nullpath3,
divisor=copy(divisor);
locate=locate.copy();
- pic.add(new void (picture f, transform3 t, transform3 T, triple, triple) {
+ pic.add(new void (picture f, transform3 t, transform3 T,
+ projection P, triple, triple) {
picture d;
- ticks(d,t,L,g,g2,p,arrow,margin,locate,divisor,opposite,true);
+ ticks(d,t,L,g,g2,p,arrow,margin,locate,divisor,opposite,true,P);
add(f,t*T*inverse(t)*d);
},above=above);
@@ -522,12 +526,13 @@ void xaxis3At(picture pic=currentpicture, Label L="", axis axis,
real xmin=-infinity, real xmax=infinity, pen p=currentpen,
ticks3 ticks=NoTicks3,
arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=true,
- bool opposite=false, bool opposite2=false, bool primary=true)
+ bool opposite=false, bool opposite2=false, bool primary=true,
+ projection P=currentprojection)
{
int type=axis.type;
int type2=axis.type2;
triple dir=axis.align.dir3 == O ?
- defaultdir(Y,Z,X,opposite^opposite2,currentprojection) : axis.align.dir3;
+ defaultdir(Y,Z,X,opposite^opposite2,P) : axis.align.dir3;
Label L=L.copy();
if(L.align.dir3 == O && L.align.dir == 0) L.align(opposite ? -dir : dir);
@@ -536,8 +541,8 @@ void xaxis3At(picture pic=currentpicture, Label L="", axis axis,
real y2,z2;
int[] divisor=copy(axis.xdivisor);
- pic.add(new void(picture f, transform3 t, transform3 T, triple lb,
- triple rt) {
+ pic.add(new void(picture f, transform3 t, transform3 T, projection P,
+ triple lb, triple rt) {
transform3 tinv=inverse(t);
triple a=xmin == -infinity ? tinv*(lb.x-min3(p).x,ytrans(t,y),
ztrans(t,z)) : (xmin,y,z);
@@ -573,7 +578,7 @@ void xaxis3At(picture pic=currentpicture, Label L="", axis axis,
ticks(d,t,L,a--b,finite(y0) && finite(z0) ? a2--b2 : nullpath3,
p,arrow,margin,
ticklocate(a.x,b.x,pic.scale.x,Dir(dir)),divisor,
- opposite,primary);
+ opposite,primary,P);
add(f,t*T*tinv*d);
},above=above);
@@ -621,7 +626,7 @@ void xaxis3At(picture pic=currentpicture, Label L="", axis axis,
ticks(d,pic.scaling3(warn=false),L,
(a.x,0,0)--(b.x,0,0),(a2.x,0,0)--(b2.x,0,0),p,arrow,margin,
ticklocate(a.x,b.x,pic.scale.x,Dir(dir)),divisor,
- opposite,primary);
+ opposite,primary,P);
frame f;
if(L.s != "") {
Label L0=L.copy();
@@ -655,12 +660,13 @@ void yaxis3At(picture pic=currentpicture, Label L="", axis axis,
real ymin=-infinity, real ymax=infinity, pen p=currentpen,
ticks3 ticks=NoTicks3,
arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=true,
- bool opposite=false, bool opposite2=false, bool primary=true)
+ bool opposite=false, bool opposite2=false, bool primary=true,
+ projection P=currentprojection)
{
int type=axis.type;
int type2=axis.type2;
triple dir=axis.align.dir3 == O ?
- defaultdir(X,Z,Y,opposite^opposite2,currentprojection) : axis.align.dir3;
+ defaultdir(X,Z,Y,opposite^opposite2,P) : axis.align.dir3;
Label L=L.copy();
if(L.align.dir3 == O && L.align.dir == 0) L.align(opposite ? -dir : dir);
@@ -669,8 +675,8 @@ void yaxis3At(picture pic=currentpicture, Label L="", axis axis,
real x2,z2;
int[] divisor=copy(axis.ydivisor);
- pic.add(new void(picture f, transform3 t, transform3 T, triple lb,
- triple rt) {
+ pic.add(new void(picture f, transform3 t, transform3 T, projection P,
+ triple lb, triple rt) {
transform3 tinv=inverse(t);
triple a=ymin == -infinity ? tinv*(xtrans(t,x),lb.y-min3(p).y,
ztrans(t,z)) : (x,ymin,z);
@@ -706,7 +712,7 @@ void yaxis3At(picture pic=currentpicture, Label L="", axis axis,
ticks(d,t,L,a--b,finite(x0) && finite(z0) ? a2--b2 : nullpath3,
p,arrow,margin,
ticklocate(a.y,b.y,pic.scale.y,Dir(dir)),divisor,
- opposite,primary);
+ opposite,primary,P);
add(f,t*T*tinv*d);
},above=above);
@@ -754,7 +760,7 @@ void yaxis3At(picture pic=currentpicture, Label L="", axis axis,
ticks(d,pic.scaling3(warn=false),L,
(0,a.y,0)--(0,b.y,0),(0,a2.y,0)--(0,a2.y,0),p,arrow,margin,
ticklocate(a.y,b.y,pic.scale.y,Dir(dir)),divisor,
- opposite,primary);
+ opposite,primary,P);
frame f;
if(L.s != "") {
Label L0=L.copy();
@@ -788,12 +794,13 @@ void zaxis3At(picture pic=currentpicture, Label L="", axis axis,
real zmin=-infinity, real zmax=infinity, pen p=currentpen,
ticks3 ticks=NoTicks3,
arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=true,
- bool opposite=false, bool opposite2=false, bool primary=true)
+ bool opposite=false, bool opposite2=false, bool primary=true,
+ projection P=currentprojection)
{
int type=axis.type;
int type2=axis.type2;
triple dir=axis.align.dir3 == O ?
- defaultdir(X,Y,Z,opposite^opposite2,currentprojection) : axis.align.dir3;
+ defaultdir(X,Y,Z,opposite^opposite2,P) : axis.align.dir3;
Label L=L.copy();
if(L.align.dir3 == O && L.align.dir == 0) L.align(opposite ? -dir : dir);
@@ -802,8 +809,8 @@ void zaxis3At(picture pic=currentpicture, Label L="", axis axis,
real x2,y2;
int[] divisor=copy(axis.zdivisor);
- pic.add(new void(picture f, transform3 t, transform3 T, triple lb,
- triple rt) {
+ pic.add(new void(picture f, transform3 t, transform3 T, projection P,
+ triple lb, triple rt) {
transform3 tinv=inverse(t);
triple a=zmin == -infinity ? tinv*(xtrans(t,x),ytrans(t,y),
lb.z-min3(p).z) : (x,y,zmin);
@@ -839,7 +846,7 @@ void zaxis3At(picture pic=currentpicture, Label L="", axis axis,
ticks(d,t,L,a--b,finite(x0) && finite(y0) ? a2--b2 : nullpath3,
p,arrow,margin,
ticklocate(a.z,b.z,pic.scale.z,Dir(dir)),divisor,
- opposite,primary);
+ opposite,primary,P);
add(f,t*T*tinv*d);
},above=above);
@@ -887,7 +894,7 @@ void zaxis3At(picture pic=currentpicture, Label L="", axis axis,
ticks(d,pic.scaling3(warn=false),L,
(0,0,a.z)--(0,0,b.z),(0,0,a2.z)--(0,0,a2.z),p,arrow,margin,
ticklocate(a.z,b.z,pic.scale.z,Dir(dir)),divisor,
- opposite,primary);
+ opposite,primary,P);
frame f;
if(L.s != "") {
Label L0=L.copy();
@@ -945,7 +952,8 @@ void autoscale3(picture pic=currentpicture, axis axis)
void xaxis3(picture pic=currentpicture, Label L="", axis axis=YZZero,
real xmin=-infinity, real xmax=infinity, pen p=currentpen,
ticks3 ticks=NoTicks3,
- arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false)
+ arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false,
+ projection P=currentprojection)
{
if(xmin > xmax) return;
@@ -1001,7 +1009,8 @@ void xaxis3(picture pic=currentpicture, Label L="", axis axis=YZZero,
bool back=false;
if(axis.type == Both) {
- triple v=currentprojection.normal;
+ projection P=centered(P,pic);
+ triple v=P.normal;
back=dot((0,pic.userMax().y-pic.userMin().y,0),v)*sgn(v.z) > 0;
}
@@ -1019,7 +1028,8 @@ void xaxis3(picture pic=currentpicture, Label L="", axis axis=YZZero,
void yaxis3(picture pic=currentpicture, Label L="", axis axis=XZZero,
real ymin=-infinity, real ymax=infinity, pen p=currentpen,
ticks3 ticks=NoTicks3,
- arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false)
+ arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false,
+ projection P=currentprojection)
{
if(ymin > ymax) return;
@@ -1076,7 +1086,8 @@ void yaxis3(picture pic=currentpicture, Label L="", axis axis=XZZero,
bool back=false;
if(axis.type == Both) {
- triple v=currentprojection.normal;
+ projection P=centered(P,pic);
+ triple v=P.normal;
back=dot((pic.userMax().x-pic.userMin().x,0,0),v)*sgn(v.z) > 0;
}
@@ -1094,7 +1105,8 @@ void yaxis3(picture pic=currentpicture, Label L="", axis axis=XZZero,
void zaxis3(picture pic=currentpicture, Label L="", axis axis=XYZero,
real zmin=-infinity, real zmax=infinity, pen p=currentpen,
ticks3 ticks=NoTicks3,
- arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false)
+ arrowbar3 arrow=None, margin3 margin=NoMargin3, bool above=false,
+ projection P=currentprojection)
{
if(zmin > zmax) return;
@@ -1150,7 +1162,8 @@ void zaxis3(picture pic=currentpicture, Label L="", axis axis=XYZero,
bool back=false;
if(axis.type == Both) {
- triple v=currentprojection.vector();
+ projection P=centered(P,pic);
+ triple v=P.vector();
back=dot((pic.userMax().x-pic.userMin().x,0,0),v)*sgn(v.y) > 0;
}
@@ -1200,11 +1213,12 @@ void axes3(picture pic=currentpicture,
bool extend=false,
triple min=(-infinity,-infinity,-infinity),
triple max=(infinity,infinity,infinity),
- pen p=currentpen, arrowbar3 arrow=None, margin3 margin=NoMargin3)
+ pen p=currentpen, arrowbar3 arrow=None, margin3 margin=NoMargin3,
+ projection P=currentprojection)
{
- xaxis3(pic,xlabel,YZZero(extend),min.x,max.x,p,arrow,margin);
- yaxis3(pic,ylabel,XZZero(extend),min.y,max.y,p,arrow,margin);
- zaxis3(pic,zlabel,XYZero(extend),min.z,max.z,p,arrow,margin);
+ xaxis3(pic,xlabel,YZZero(extend),min.x,max.x,p,arrow,margin,P);
+ yaxis3(pic,ylabel,XZZero(extend),min.y,max.y,p,arrow,margin,P);
+ zaxis3(pic,zlabel,XYZero(extend),min.z,max.z,p,arrow,margin,P);
}
triple Scale(picture pic=currentpicture, triple v)
@@ -1659,7 +1673,7 @@ surface surface(picture pic=currentpicture, triple[][] f, bool[][] cond={})
surface s=surface(count);
s.index=new int[nx][ny];
- int k=-1;
+ int k=0;
for(int i=0; i < nx; ++i) {
bool[] condi,condp;
if(!all) {
@@ -1670,13 +1684,15 @@ surface surface(picture pic=currentpicture, triple[][] f, bool[][] cond={})
triple[] fp=f[i+1];
int[] indexi=s.index[i];
for(int j=0; j < ny; ++j) {
- if(all || (condi[j] && condi[j+1] && condp[j] && condp[j+1]))
- s.s[++k]=patch(new triple[] {
+ if(all || (condi[j] && condi[j+1] && condp[j] && condp[j+1])) {
+ s.s[k]=patch(new triple[] {
Scale(pic,fi[j]),
Scale(pic,fp[j]),
Scale(pic,fp[j+1]),
Scale(pic,fi[j+1])});
- indexi[j]=k;
+ indexi[j]=k;
+ ++k;
+ }
}
}
@@ -2062,11 +2078,13 @@ surface surface(picture pic=currentpicture, triple f(pair z),
surface s=surface(sx.length);
s.index=new int[nu][nv];
- int k=-1;
+ int k=0;
for(int i=0; i < nu; ++i) {
int[] indexi=s.index[i];
- for(int j=0; j < nv; ++j)
- indexi[j]=++k;
+ for(int j=0; j < nv; ++j) {
+ indexi[j]=k;
+ ++k;
+ }
}
for(int k=0; k < sx.length; ++k) {
diff --git a/graphics/asymptote/base/grid3.asy b/graphics/asymptote/base/grid3.asy
index 62807847ae..412992f6c4 100644
--- a/graphics/asymptote/base/grid3.asy
+++ b/graphics/asymptote/base/grid3.asy
@@ -193,7 +193,8 @@ void grid3(picture pic=currentpicture,
grid3routines gridroutinej=gridroutine[j];
for(int i=0; i < gridroutinej.length; ++i) {
grid3 gt=gridroutinej[i](pic);
- pic.add(new void(picture f, transform3 t, transform3 T, triple, triple) {
+ pic.add(new void(picture f, transform3 t, transform3 T,
+ projection P, triple, triple) {
picture d;
ticks3 ticks=Ticks3(1,F="%",ticklabel=null,
beginlabel=false,endlabel=false,
@@ -202,7 +203,7 @@ void grid3(picture pic=currentpicture,
Size=0,size=0,extend=true,
pTick=pGrid,ptick=pgrid);
ticks(d,t,"",gt.axea,gt.axeb,nullpen,None,NoMargin3,gt.locate,
- gt.bds.divisor,opposite=true,primary=false);
+ gt.bds.divisor,opposite=true,primary=false,P);
add(f,t*T*inverse(t)*d);
},above=above);
addPath(pic,gt.axea,pGrid);
diff --git a/graphics/asymptote/base/map.asy b/graphics/asymptote/base/map.asy
index 2b2277b956..4bcf8beffd 100644
--- a/graphics/asymptote/base/map.asy
+++ b/graphics/asymptote/base/map.asy
@@ -1,40 +1,36 @@
-// Create a struct <name> parameterized by types <key> and <value>,
-// that maps keys to values, defaulting to the value in <default>.
-void mapTemplate(string name, string key, string value, string default)
-{
- type(key,"Key");
- type(value,"Value");
- eval("Value default="+default,true);
+typedef import(Key, Value);
- eval("
- struct keyValue {
- Key key;
- Value T;
- void operator init(Key key) {
- this.key=key;
- }
- void operator init(Key key, Value T) {
- this.key=key;
- this.T=T;
- }
+struct keyValue {
+ Key key;
+ Value value;
+ void operator init(Key key) {
+ this.key=key;
}
+ void operator init(Key key, Value value) {
+ this.key=key;
+ this.value=value;
+ }
+}
- struct map {
- keyValue[] M;
- bool operator < (keyValue a, keyValue b) {return a.key < b.key;}
+// Map keys to values, defaulting to the value default.
- void add(Key key, Value T) {
- keyValue m=keyValue(key,T);
- M.insert(search(M,m,operator <)+1,m);
- }
- Value lookup(Key key) {
- int i=search(M,keyValue(key),operator <);
- if(i >= 0 && M[i].key == key) return M[i].T;
- return default;
- }
+struct map {
+ keyValue[] M;
+ Value Default;
+
+ void operator init(Value Default) {
+ this.Default=Default;
}
-",true);
- type("map",name);
-}
+ bool operator < (keyValue a, keyValue b) {return a.key < b.key;}
+ void add(Key key, Value value) {
+ keyValue m=keyValue(key,value);
+ M.insert(search(M,m,operator <)+1,m);
+ }
+ Value lookup(Key key) {
+ int i=search(M,keyValue(key),operator <);
+ if(i >= 0 && M[i].key == key) return M[i].value;
+ return Default;
+ }
+}
diff --git a/graphics/asymptote/base/mapArray.asy b/graphics/asymptote/base/mapArray.asy
index 5a499b8c68..d6d75e9861 100644
--- a/graphics/asymptote/base/mapArray.asy
+++ b/graphics/asymptote/base/mapArray.asy
@@ -6,4 +6,4 @@ Dst[] map(MapType f, Src[] a) {
return sequence(
new Dst(int i) {return f(a[i]);},
a.length);
-} \ No newline at end of file
+}
diff --git a/graphics/asymptote/base/plain.asy b/graphics/asymptote/base/plain.asy
index 4d555e6e66..5736e79c4c 100644
--- a/graphics/asymptote/base/plain.asy
+++ b/graphics/asymptote/base/plain.asy
@@ -1,8 +1,8 @@
/*****
- * plain.asy
- * Andy Hammerlindl and John Bowman 2004/08/19
+ *plain.asy
+ *Andy Hammerlindl and John Bowman 2004/08/19
*
- * A package for general purpose drawing, with automatic sizing of pictures.
+ *A package for general purpose drawing, with automatic sizing of pictures.
*
*****/
@@ -41,7 +41,7 @@ include plain_debugger;
real RELEASE=(real) split(VERSION,"-")[0];
-typedef void exitfcn();
+using exitfcn=void();
void updatefunction()
{
@@ -63,8 +63,8 @@ atexit(exitfunction);
// A restore thunk is a function, that when called, restores the graphics state
// to what it was when the restore thunk was created.
-typedef void restoreThunk();
-typedef restoreThunk saveFunction();
+using restoreThunk=void();
+using saveFunction=restoreThunk();
saveFunction[] saveFunctions={};
// When save is called, this will be redefined to do the corresponding restore.
@@ -82,18 +82,18 @@ restoreThunk buildRestoreThunk()
{
// Call the save functions in reverse order, storing their restore thunks.
restoreThunk[] thunks={};
- for (int i=saveFunctions.length-1; i >= 0; --i)
+ for(int i=saveFunctions.length-1; i >= 0; --i)
thunks.push(saveFunctions[i]());
return new void() {
// Call the restore thunks in an order matching the saves.
- for (int i=thunks.length-1; i >= 0; --i)
+ for(int i=thunks.length-1; i >= 0; --i)
thunks[i]();
};
}
// Add the default save function.
-addSaveFunction(new restoreThunk () {
+addSaveFunction(new restoreThunk() {
pen defaultpen=defaultpen();
pen p=currentpen;
picture pic=currentpicture.copy();
@@ -243,8 +243,8 @@ void asy(string format, bool overwrite=false ... string[] s)
settings.outformat=outformat;
settings.interactiveView=interactiveView;
settings.batchView=batchView;
- }
- }
+ }
+ }
}
void beep()
diff --git a/graphics/asymptote/base/plain_Label.asy b/graphics/asymptote/base/plain_Label.asy
index 0a2c270d68..f0d36727ea 100644
--- a/graphics/asymptote/base/plain_Label.asy
+++ b/graphics/asymptote/base/plain_Label.asy
@@ -201,7 +201,7 @@ position operator cast(int x) {return (pair) x;}
pair operator cast(position P) {return P.position;}
-typedef transform embed(transform);
+using embed=transform(transform);
transform Shift(transform t) {return identity();}
transform Rotate(transform t) {return rotation(t);}
transform Slant(transform t) {return scaleless(t);}
diff --git a/graphics/asymptote/base/plain_arrows.asy b/graphics/asymptote/base/plain_arrows.asy
index d9c08636fc..1c8586a43e 100644
--- a/graphics/asymptote/base/plain_arrows.asy
+++ b/graphics/asymptote/base/plain_arrows.asy
@@ -299,7 +299,7 @@ picture bar(pair a, pair d, pen p=currentpen)
return pic;
}
-typedef bool arrowbar(picture, path, pen, margin);
+using arrowbar=bool(picture, path, pen, margin);
bool Blank(picture, path, pen, margin)
{
diff --git a/graphics/asymptote/base/plain_bounds.asy b/graphics/asymptote/base/plain_bounds.asy
index c4e2472177..3eefae46fd 100644
--- a/graphics/asymptote/base/plain_bounds.asy
+++ b/graphics/asymptote/base/plain_bounds.asy
@@ -28,9 +28,9 @@ private void addIfMaximal(coord[] coords, real user, real truesize) {
// The coordinate is not dominated by any existing extreme, so it is
// maximal and will be added, but first remove any coords it now dominates.
- int i = 0;
+ int i=0;
while (i < coords.length) {
- coord c = coords[i];
+ coord c=coords[i];
if (c.user <= user && c.truesize <= truesize)
coords.delete(i);
else
@@ -54,9 +54,9 @@ private void addIfMinimal(coord[] coords, real user, real truesize) {
if (user >= c.user && truesize >= c.truesize)
return;
- int i = 0;
+ int i=0;
while (i < coords.length) {
- coord c = coords[i];
+ coord c=coords[i];
if (c.user >= user && c.truesize >= truesize)
coords.delete(i);
else
@@ -76,9 +76,9 @@ private void addIfMinimal(coord[] dest, coord[] src)
// frozen, then it cannot be modified further, and therefore can be safely
// passed by reference and stored in the sizing data for multiple pictures.
private struct freezableBounds {
- restricted bool frozen = false;
+ restricted bool frozen=false;
void freeze() {
- frozen = true;
+ frozen=true;
}
// Optional links to further (frozen) sizing data.
@@ -105,7 +105,7 @@ private struct freezableBounds {
void operator init(path g, pen p) {
this.g.push(g);
- this.p = p;
+ this.p=p;
}
}
private static pathpen operator *(transform t, pathpen pp) {
@@ -113,7 +113,7 @@ private struct freezableBounds {
pathpen newpp;
for (path g : pp.g)
newpp.g.push(t*g);
- newpp.p = pp.p;
+ newpp.p=pp.p;
return newpp;
}
@@ -129,10 +129,10 @@ private struct freezableBounds {
void operator init(coord[] left, coord[] bottom,
coord[] right, coord[] top) {
- this.left = left;
- this.bottom = bottom;
- this.right = right;
- this.top = top;
+ this.left=left;
+ this.bottom=bottom;
+ this.right=right;
+ this.top=top;
}
}
@@ -153,13 +153,13 @@ private struct freezableBounds {
addIfMinimal(e.bottom, coords.y);
}
- private extremes cachedExtremes = null;
+ private extremes cachedExtremes=null;
// Once frozen, getMutable returns a new object based on this one, which can
// be modified.
freezableBounds getMutable() {
assert(frozen);
- var f = new freezableBounds;
+ var f=new freezableBounds;
f.links.push(this);
return f;
}
@@ -168,11 +168,11 @@ private struct freezableBounds {
// Freeze these bounds, as we are storing a reference to them.
freeze();
- var tlink = new transformedBounds;
- tlink.t = t;
- tlink.link = this;
+ var tlink=new transformedBounds;
+ tlink.t=t;
+ tlink.link=this;
- var b = new freezableBounds;
+ var b=new freezableBounds;
b.tlinks.push(tlink);
return b;
@@ -220,7 +220,7 @@ private struct freezableBounds {
private void addPathToNonEmptyArray(path g, pen p) {
//assert(!frozen);
//assert(!pathpenBounds.empty());
- var pp = pathpenBounds[0];
+ var pp=pathpenBounds[0];
// Test if the pens are equal or have the same bounds.
if (pp.p == p || (min(pp.p) == min(p) && max(pp.p) == max(p))) {
@@ -231,7 +231,7 @@ private struct freezableBounds {
else {
// A different pen. Start a new bound and put it on the front. Put
// the old bound at the end of the array.
- pathpenBounds[0] = pathpen(g,p);
+ pathpenBounds[0]=pathpen(g,p);
pathpenBounds.push(pp);
}
}
@@ -240,11 +240,11 @@ private struct freezableBounds {
//assert(pathpenBounds.empty());
pathpenBounds.push(pathpen(g,p));
- addPath = addPathToNonEmptyArray;
+ addPath=addPathToNonEmptyArray;
}
// Initial setting for addPath.
- addPath = addPathToEmptyArray;
+ addPath=addPathToEmptyArray;
// Transform the sizing info by t then add the result to the coords
// structure.
@@ -258,15 +258,15 @@ private struct freezableBounds {
addTransformedCoords(coords, t, this.point, this.min, this.max);
for (var g : pathBounds) {
- g = t*g;
+ g=t*g;
coords.push(min(g), (0,0));
coords.push(max(g), (0,0));
}
for (var pp: pathpenBounds) {
- pair pm = min(pp.p), pM = max(pp.p);
+ pair pm=min(pp.p), pM=max(pp.p);
for (var g : pp.g) {
- g = t*g;
+ g=t*g;
coords.push(min(g), pm);
coords.push(max(g), pM);
}
@@ -291,7 +291,7 @@ private struct freezableBounds {
}
for (var pp: pathpenBounds) {
- pair pm = min(pp.p), pM = max(pp.p);
+ pair pm=min(pp.p), pM=max(pp.p);
for (var g : pp.g) {
coords.push(min(g), pm);
coords.push(max(g), pM);
@@ -390,7 +390,7 @@ private struct freezableBounds {
extremes e;
addToExtremes(e);
- cachedExtremes = e;
+ cachedExtremes=e;
}
return cachedExtremes;
@@ -421,7 +421,7 @@ private struct freezableBounds {
void push(transform t, userbounds b) {
if (b.areSet) {
- pair[] box = { t*(b.min.x,b.max.y), t*b.max,
+ pair[] box={ t*(b.min.x,b.max.y), t*b.max,
t*b.min, t*(b.max.x,b.min.y) };
for (var z : box)
push(z,z);
@@ -429,12 +429,12 @@ private struct freezableBounds {
}
void pushUserCoords(coords2 min, coords2 max) {
- int n = min.x.length;
+ int n=min.x.length;
assert(min.y.length == n);
assert(max.x.length == n);
assert(max.y.length == n);
- for (int i = 0; i < n; ++i)
+ for (int i=0; i < n; ++i)
push((min.x[i].user, min.y[i].user),
(max.x[i].user, max.y[i].user));
}
@@ -442,19 +442,19 @@ private struct freezableBounds {
userbounds collapse() {
userbounds b;
if (mins.length > 0) {
- b.areSet = true;
- b.min = minbound(mins);
- b.max = maxbound(maxs);
+ b.areSet=true;
+ b.min=minbound(mins);
+ b.max=maxbound(maxs);
}
else {
- b.areSet = false;
+ b.areSet=false;
}
return b;
}
}
// The user bounds already calculated for this data.
- private userbounds storedUserBounds = null;
+ private userbounds storedUserBounds=null;
private void accumulateUserBounds(boundsAccumulator acc)
{
@@ -485,7 +485,7 @@ private struct freezableBounds {
freeze();
boundsAccumulator acc;
accumulateUserBounds(acc);
- storedUserBounds = acc.collapse();
+ storedUserBounds=acc.collapse();
}
private userbounds userBounds() {
@@ -523,16 +523,16 @@ private struct freezableBounds {
computeUserBounds();
assert(frozen);
- var b = storedUserBounds;
+ var b=storedUserBounds;
if (which == "minx")
- b.min = (val, b.min.y);
+ b.min=(val, b.min.y);
else if (which == "miny")
- b.min = (b.min.x, val);
+ b.min=(b.min.x, val);
else if (which == "maxx")
- b.max = (val, b.max.y);
+ b.max=(val, b.max.y);
else {
assert(which == "maxy");
- b.max = (b.max.x, val);
+ b.max=(b.max.x, val);
}
}
@@ -546,7 +546,7 @@ private struct freezableBounds {
computeUserBounds();
// Calculate all coordinates.
- coords2 coords = allCoords();
+ coords2 coords=allCoords();
// Erase all the old data.
point.erase();
@@ -554,12 +554,12 @@ private struct freezableBounds {
max.erase();
pathBounds.delete();
pathpenBounds.delete();
- addPath = addPathToEmptyArray;
+ addPath=addPathToEmptyArray;
links.delete();
tlinks.delete();
// Put all of the coordinates into point.
- point = coords;
+ point=coords;
}
void xclip(real Min, real Max) {
@@ -570,9 +570,9 @@ private struct freezableBounds {
max.xclip(Min,Max);
// Cap the userBounds.
- userbounds b = storedUserBounds;
- b.min = (max(Min, b.min.x), b.min.y);
- b.max = (min(Max, b.max.x), b.max.y);
+ userbounds b=storedUserBounds;
+ b.min=(max(Min, b.min.x), b.min.y);
+ b.max=(min(Max, b.max.x), b.max.y);
}
void yclip(real Min, real Max) {
@@ -583,14 +583,14 @@ private struct freezableBounds {
max.yclip(Min,Max);
// Cap the userBounds.
- userbounds b = storedUserBounds;
- b.min = (b.min.x, max(Min, b.min.y));
- b.max = (b.max.x, min(Max, b.max.y));
+ userbounds b=storedUserBounds;
+ b.min=(b.min.x, max(Min, b.min.y));
+ b.max=(b.max.x, min(Max, b.max.y));
}
// Calculate the min for the final frame, given the coordinate transform.
pair min(transform t) {
- extremes e = extremes();
+ extremes e=extremes();
if (e.left.length == 0)
return 0;
@@ -603,7 +603,7 @@ private struct freezableBounds {
// Calculate the max for the final frame, given the coordinate transform.
pair max(transform t) {
- extremes e = extremes();
+ extremes e=extremes();
if (e.right.length == 0)
return 0;
@@ -622,7 +622,7 @@ private struct freezableBounds {
return identity();
// Get the extremal coordinates.
- extremes e = extremes();
+ extremes e=extremes();
real sx;
if(xunitsize == 0) {
@@ -630,7 +630,7 @@ private struct freezableBounds {
} else sx=xunitsize;
/* Possible alternative code :
- real sx = xunitsize != 0 ? xunitsize :
+ real sx=xunitsize != 0 ? xunitsize :
xsize != 0 ? calculateScaling("x", Coords.x, xsize, warn) :
0; */
@@ -654,10 +654,10 @@ private struct freezableBounds {
}
struct bounds {
- private var base = new freezableBounds;
+ private var base=new freezableBounds;
// We should probably put this back into picture.
- bool exact = true;
+ bool exact=true;
// Called just before modifying the sizing data. It ensures base is
// non-frozen.
@@ -665,13 +665,13 @@ struct bounds {
// called methods below.
private void makeMutable() {
if (base.frozen)
- base = base.getMutable();
+ base=base.getMutable();
//assert(!base.frozen); // Disabled for speed reasons.
}
void erase() {
// Just discard the old bounds.
- base = new freezableBounds;
+ base=new freezableBounds;
// We don't reset the 'exact' field, for backward compatibility.
}
@@ -680,16 +680,16 @@ struct bounds {
// Freeze the underlying bounds and make a shallow copy.
base.freeze();
- var b = new bounds;
- b.base = this.base;
- b.exact = this.exact;
+ var b=new bounds;
+ b.base=this.base;
+ b.exact=this.exact;
return b;
}
bounds transformed(transform t) {
- var b = new bounds;
- b.base = base.transformed(t);
- b.exact = this.exact;
+ var b=new bounds;
+ b.base=base.transformed(t);
+ b.exact=this.exact;
return b;
}
@@ -719,21 +719,21 @@ struct bounds {
void addPath(path g) {
//makeMutable(); // Manually inlined here for speed reasons.
if (base.frozen)
- base = base.getMutable();
+ base=base.getMutable();
base.addPath(g);
}
void addPath(path[] g) {
//makeMutable(); // Manually inlined here for speed reasons.
if (base.frozen)
- base = base.getMutable();
+ base=base.getMutable();
base.addPath(g);
}
void addPath(path g, pen p) {
//makeMutable(); // Manually inlined here for speed reasons.
if (base.frozen)
- base = base.getMutable();
+ base=base.getMutable();
base.addPath(g, p);
}
diff --git a/graphics/asymptote/base/plain_boxes.asy b/graphics/asymptote/base/plain_boxes.asy
index 0b6746736a..0084dfae82 100644
--- a/graphics/asymptote/base/plain_boxes.asy
+++ b/graphics/asymptote/base/plain_boxes.asy
@@ -72,7 +72,7 @@ path ellipse(frame f, Label L, real xmargin=0, real ymargin=xmargin,
return ellipse(f,xmargin,ymargin,p,filltype,above);
}
-typedef path envelope(frame dest, frame src=dest, real xmargin=0,
+using envelope=path(frame dest, frame src=dest, real xmargin=0,
real ymargin=xmargin, pen p=currentpen,
filltype filltype=NoFill, bool above=true);
diff --git a/graphics/asymptote/base/plain_constants.asy b/graphics/asymptote/base/plain_constants.asy
index 6cca1406cf..e32fab3377 100644
--- a/graphics/asymptote/base/plain_constants.asy
+++ b/graphics/asymptote/base/plain_constants.asy
@@ -70,7 +70,7 @@ void DOSendl(file file) {write(file,'\r\n',flush);}
void DOSnewl(file file) {write(file,'\r\n');}
void tab(file file) {write(file,'\t');}
void comma(file file) {write(file,',');}
-typedef void suffix(file);
+using suffix=void(file);
// Used by interactive write to warn that the outputted type is the resolution
// of an overloaded name.
diff --git a/graphics/asymptote/base/plain_filldraw.asy b/graphics/asymptote/base/plain_filldraw.asy
index eaf1257169..0e6284a078 100644
--- a/graphics/asymptote/base/plain_filldraw.asy
+++ b/graphics/asymptote/base/plain_filldraw.asy
@@ -90,7 +90,7 @@ void filloutside(frame f, path[] g, pen p=currentpen, bool copy=true)
struct filltype
{
- typedef void fill2(frame f, path[] g, pen fillpen);
+ using fill2=void(frame f, path[] g, pen fillpen);
fill2 fill2;
pen fillpen;
pen drawpen;
diff --git a/graphics/asymptote/base/plain_margins.asy b/graphics/asymptote/base/plain_margins.asy
index c03b3a2b52..3d5ceff6d7 100644
--- a/graphics/asymptote/base/plain_margins.asy
+++ b/graphics/asymptote/base/plain_margins.asy
@@ -3,7 +3,7 @@ struct marginT {
real begin,end;
};
-typedef marginT margin(path, pen);
+using margin=marginT(path, pen);
path trim(path g, real begin, real end=begin) {
real a=arctime(g,begin);
diff --git a/graphics/asymptote/base/plain_markers.asy b/graphics/asymptote/base/plain_markers.asy
index c6109d4e6c..bcbe8a57be 100644
--- a/graphics/asymptote/base/plain_markers.asy
+++ b/graphics/asymptote/base/plain_markers.asy
@@ -44,7 +44,7 @@ path cross(int n, bool round=true, real r=0)
path plus=rotate(45)*cross(4);
path diamond=rotate(45)*polygon(4);
-typedef void markroutine(picture pic=currentpicture, frame f, path g);
+using markroutine=void(picture pic=currentpicture, frame f, path g);
// On picture pic, add frame f about every node of path g.
void marknodes(picture pic=currentpicture, frame f, path g) {
@@ -309,7 +309,7 @@ pair[] pairs(real[] x, real[] y)
return sequence(new pair(int i) {return (x[i],y[i]);},x.length);
}
-filltype dotfilltype = Fill;
+filltype dotfilltype=Fill;
void dot(frame f, pair z, pen p=currentpen, filltype filltype=dotfilltype)
{
diff --git a/graphics/asymptote/base/plain_paths.asy b/graphics/asymptote/base/plain_paths.asy
index 49d2f4ac0b..df568cca36 100644
--- a/graphics/asymptote/base/plain_paths.asy
+++ b/graphics/asymptote/base/plain_paths.asy
@@ -1,6 +1,6 @@
path nullpath;
-typedef guide interpolate(... guide[]);
+using interpolate=guide(... guide[]);
// These numbers identify the side of a specifier in an operator spec or
// operator curl expression:
diff --git a/graphics/asymptote/base/plain_picture.asy b/graphics/asymptote/base/plain_picture.asy
index 9df0e5753e..652f1b74b5 100644
--- a/graphics/asymptote/base/plain_picture.asy
+++ b/graphics/asymptote/base/plain_picture.asy
@@ -60,7 +60,7 @@ struct coords3 {
}
// scaleT and Legend <<<
-typedef real scalefcn(real x);
+using scalefcn=real(real);
struct scaleT {
scalefcn T,Tinv;
@@ -86,7 +86,7 @@ scaleT operator init()
return S;
}
-typedef void boundRoutine();
+using boundRoutine=void();
struct autoscaleT {
scaleT scale;
@@ -162,11 +162,11 @@ triple max3(pen p)
// A function that draws an object to frame pic, given that the transform
// from user coordinates to true-size coordinates is t.
-typedef void drawer(frame f, transform t);
+using drawer=void(frame f, transform t);
// A generalization of drawer that includes the final frame's bounds.
// TODO: Add documentation as to what T is.
-typedef void drawerBound(frame f, transform t, transform T, pair lb, pair rt);
+using drawerBound=void(frame f, transform t, transform T, pair lb, pair rt);
struct node {
drawerBound d;
@@ -182,13 +182,13 @@ struct node {
// pair and a triple depending on the context.
struct pairOrTriple {
real x,y,z;
- void init() { x = y = z = 0; }
+ void init() { x=y=z=0; }
};
void copyPairOrTriple(pairOrTriple dest, pairOrTriple src)
{
- dest.x = src.x;
- dest.y = src.y;
- dest.z = src.z;
+ dest.x=src.x;
+ dest.y=src.y;
+ dest.z=src.z;
}
pair operator cast (pairOrTriple a) {
return (a.x, a.y);
@@ -203,8 +203,8 @@ void write(pairOrTriple a) {
struct picture { // <<<1
// Nodes <<<2
// Three-dimensional version of drawer and drawerBound:
- typedef void drawer3(frame f, transform3 t, picture pic, projection P);
- typedef void drawerBound3(frame f, transform3 t, transform3 T,
+ using drawer3=void(frame f, transform3 t, picture pic, projection P);
+ using drawerBound3=void(frame f, transform3 t, transform3 T,
picture pic, projection P, triple lb, triple rt);
struct node3 {
@@ -288,7 +288,8 @@ struct picture { // <<<1
// Erase the current picture, retaining bounds.
void clear() {
queueErase=nodes.length > 0;
- queueErase3=nodes3.length > 0;
+ if(settings.render != 0)
+ queueErase3=nodes3.length > 0;
nodes.delete();
nodes3.delete();
legend.delete();
@@ -331,7 +332,7 @@ struct picture { // <<<1
bool userSety3() { return usety; }
bool userSetz3() { return usetz; }
- private typedef real binop(real, real);
+ private using binop=real(real, real);
// Helper functions for finding the minimum/maximum of two data, one of
// which may not be defined.
@@ -341,20 +342,20 @@ struct picture { // <<<1
}
private pairOrTriple userExtreme(pair u2(), triple u3(), binop m)
{
- bool setx2 = userSetx2();
- bool sety2 = userSety2();
- bool setx3 = userSetx3();
- bool sety3 = userSety3();
+ bool setx2=userSetx2();
+ bool sety2=userSety2();
+ bool setx3=userSetx3();
+ bool sety3=userSety3();
pair p;
if (setx2 || sety2)
- p = u2();
- triple t = u3();
+ p=u2();
+ triple t=u3();
pairOrTriple r;
- r.x = merge(p.x, setx2, t.x, setx3, m);
- r.y = merge(p.y, sety2, t.y, sety3, m);
- r.z = t.z;
+ r.x=merge(p.x, setx2, t.x, setx3, m);
+ r.y=merge(p.y, sety2, t.y, sety3, m);
+ r.z=t.z;
return r;
}
@@ -369,7 +370,7 @@ struct picture { // <<<1
bool userSetx() { return userSetx2() || userSetx3(); }
bool userSety() { return userSety2() || userSety3(); }
- bool userSetz() = userSetz3;
+ bool userSetz()=userSetz3;
// Functions for setting the user bounds.
void userMinx3(real x) {
@@ -410,17 +411,17 @@ struct picture { // <<<1
void userMaxx(real x) { userMaxx2(x); userMaxx3(x); }
void userMaxy2(real y) { bounds.alterUserBound("maxy", y); }
void userMaxy(real y) { userMaxy2(y); userMaxy3(y); }
- void userMinz(real z) = userMinz3;
- void userMaxz(real z) = userMaxz3;
+ void userMinz(real z)=userMinz3;
+ void userMaxz(real z)=userMaxz3;
void userCorners3(triple c000, triple c001, triple c010, triple c011,
triple c100, triple c101, triple c110, triple c111) {
- umin.x = min(c000.x,c001.x,c010.x,c011.x,c100.x,c101.x,c110.x,c111.x);
- umin.y = min(c000.y,c001.y,c010.y,c011.y,c100.y,c101.y,c110.y,c111.y);
- umin.z = min(c000.z,c001.z,c010.z,c011.z,c100.z,c101.z,c110.z,c111.z);
- umax.x = max(c000.x,c001.x,c010.x,c011.x,c100.x,c101.x,c110.x,c111.x);
- umax.y = max(c000.y,c001.y,c010.y,c011.y,c100.y,c101.y,c110.y,c111.y);
- umax.z = max(c000.z,c001.z,c010.z,c011.z,c100.z,c101.z,c110.z,c111.z);
+ umin.x=min(c000.x,c001.x,c010.x,c011.x,c100.x,c101.x,c110.x,c111.x);
+ umin.y=min(c000.y,c001.y,c010.y,c011.y,c100.y,c101.y,c110.y,c111.y);
+ umin.z=min(c000.z,c001.z,c010.z,c011.z,c100.z,c101.z,c110.z,c111.z);
+ umax.x=max(c000.x,c001.x,c010.x,c011.x,c100.x,c101.x,c110.x,c111.x);
+ umax.y=max(c000.y,c001.y,c010.y,c011.y,c100.y,c101.y,c110.y,c111.y);
+ umax.z=max(c000.z,c001.z,c010.z,c011.z,c100.z,c101.z,c110.z,c111.z);
}
// Cache the current user-space bounding box x coodinates
@@ -646,7 +647,7 @@ struct picture { // <<<1
// Returns the transform for turning user-space pairs into true-space pairs.
transform scaling(real xsize, real ysize, bool keepAspect=true,
bool warn=true) {
- bounds b = (T == identity()) ? this.bounds : T * this.bounds;
+ bounds b=(T == identity()) ? this.bounds : T * this.bounds;
return b.scaling(xsize, ysize, xunitsize, yunitsize, keepAspect, warn);
}
@@ -733,7 +734,7 @@ struct picture { // <<<1
add(new void(frame f, transform t) {
picture opic=new picture;
d(opic,t);
- add(f,opic.fit(identity()));
+ add(f,opic.fit(identity));
},exact);
}
@@ -745,12 +746,12 @@ struct picture { // <<<1
},exact,above);
}
- void add(void d(picture, transform3, transform3, triple, triple),
+ void add(void d(picture, transform3, transform3, projection, triple, triple),
bool exact=false, bool above=true) {
add(new void(frame f, transform3 t, transform3 T, picture pic2,
projection P, triple lb, triple rt) {
picture opic=new picture;
- d(opic,t,T,lb,rt);
+ d(opic,t,T,P,lb,rt);
add(f,opic.fit3(identity4,pic2,P));
},exact,above);
}
@@ -974,15 +975,15 @@ struct picture { // <<<1
picture dest=drawcopy();
// Replace nodes with a single drawer that realizes the transform.
- node[] oldnodes = dest.nodes;
+ node[] oldnodes=dest.nodes;
void drawAll(frame f, transform tt, transform T, pair lb, pair rt) {
- transform Tt = T*t;
+ transform Tt=T*t;
for (node n : oldnodes) {
xasyKEY(n.key);
n.d(f,tt,Tt,lb,rt);
}
}
- dest.nodes = new node[] {node(drawAll)};
+ dest.nodes=new node[] {node(drawAll)};
dest.uptodate=uptodate;
dest.bounds=bounds.transformed(t);
@@ -1134,6 +1135,26 @@ pair size(picture pic, bool user=false)
return t*M-t*m;
}
+// Return a projection adjusted to view center of pic from specified direction.
+projection centered(projection P, picture pic=currentpicture) {
+ projection P=P.copy();
+ if(P.autoadjust && P.center) {
+ triple min=pic.userMin3();
+ triple max=pic.userMax3();
+ if(min != max) {
+ triple target=0.5*(max+min);
+ if(pic.keepAspect)
+ P.camera=target+P.vector();
+ else
+ P.camera=target+realmult(unit(P.vector()),max-min);
+ P.target=target;
+ P.normal=P.vector();
+ P.calculate();
+ }
+ }
+ return P;
+}
+
// Frame Alignment <<<
pair rectify(pair dir)
{
@@ -1178,8 +1199,8 @@ frame align(frame f, pair align)
pair point(picture pic=currentpicture, pair dir, bool user=true)
{
- pair umin = pic.userMin2();
- pair umax = pic.userMax2();
+ pair umin=pic.userMin2();
+ pair umax=pic.userMax2();
pair z=umin+realmult(rectify(dir),umax-umin);
return user ? z : pic.calculateTransform()*z;
@@ -1205,7 +1226,7 @@ void add(picture pic=currentpicture, drawer d, bool exact=false)
pic.add(d,exact);
}
-typedef void drawer3(frame f, transform3 t, picture pic, projection P);
+using drawer3=void(frame f, transform3 t, picture pic, projection P);
void add(picture pic=currentpicture, drawer3 d, bool exact=false)
{
pic.add(d,exact);
@@ -1469,16 +1490,16 @@ void endclip(picture pic=currentpicture)
pair min,max;
if (pic.clipmin.length > 0 && pic.clipmax.length > 0)
{
- min = pic.clipmin.pop();
- max = pic.clipmax.pop();
+ min=pic.clipmin.pop();
+ max=pic.clipmax.pop();
}
else
{
// We should probably abort here, since the PostScript output will be
// garbage.
warning("endclip", "endclip without beginclip");
- min = pic.userMin2();
- max = pic.userMax2();
+ min=pic.userMin2();
+ max=pic.userMax2();
}
pic.clip(min, max,
@@ -1608,7 +1629,7 @@ void fill(pair origin, picture pic=currentpicture, path[] g, pen p=currentpen)
{
picture opic;
fill(opic,g,p);
- add(pic,opic,origin);
+ add(pic,opic.fit(identity),origin);
}
void postscript(picture pic=currentpicture, string s)
diff --git a/graphics/asymptote/base/plain_prethree.asy b/graphics/asymptote/base/plain_prethree.asy
index 8866396255..de4f5703f9 100644
--- a/graphics/asymptote/base/plain_prethree.asy
+++ b/graphics/asymptote/base/plain_prethree.asy
@@ -2,7 +2,7 @@
pair viewportmargin=settings.viewportmargin;
-typedef real[][] transform3;
+using transform3=real[][];
restricted transform3 identity4=identity(4);
// A uniform 3D scaling.
@@ -70,7 +70,7 @@ struct projection {
real zoom=1; // Zoom factor.
real angle; // Lens angle (for perspective projection).
bool showtarget=true; // Expand bounding volume to include target?
- typedef transformation projector(triple camera, triple up, triple target);
+ using projector=transformation(triple camera, triple up, triple target);
projector projector;
bool autoadjust=true; // Adjust camera to lie outside bounding volume?
bool center=false; // Center target within bounding volume?
@@ -140,10 +140,10 @@ struct projection {
// This is redefined here to make projection as self-contained as possible.
- static private real sqrtEpsilon = sqrt(realEpsilon);
+ static private real sqrtEpsilon=sqrt(realEpsilon);
// Move the camera so that the box(m,M) rotated about target will always
- // lie in front of the clipping plane.
+ // lie in front of the far clipping plane.
bool adjust(triple m, triple M) {
triple v=camera-target;
real d=distance(m,M);
@@ -161,7 +161,7 @@ projection currentprojection;
struct light {
real[][] diffuse;
- real[][] specular; // For PRC only
+ real[][] specular;
pen background=nullpen; // Background color of the 3D canvas.
real specularfactor;
triple[] position; // Only directional lights are currently implemented.
diff --git a/graphics/asymptote/base/plain_shipout.asy b/graphics/asymptote/base/plain_shipout.asy
index c784c5f462..6f261fd8d1 100644
--- a/graphics/asymptote/base/plain_shipout.asy
+++ b/graphics/asymptote/base/plain_shipout.asy
@@ -24,7 +24,7 @@ frame Portrait(frame f) {return f;};
frame Landscape(frame f) {return rotate(90)*f;};
frame UpsideDown(frame f) {return rotate(180)*f;};
frame Seascape(frame f) {return rotate(-90)*f;};
-typedef frame orientation(frame);
+using orientation=frame(frame);
orientation orientation=Portrait;
// Forward references to functions defined in module three.
@@ -98,7 +98,8 @@ void shipout(string prefix=defaultfilename, frame f,
}
}
- bool defaultprefix=prefix==defaultfilename;
+ bool defaultprefix=prefix == defaultfilename &&
+ outformat(format) == outformat("");
if(settings.xasy || (!implicitshipout && defaultprefix)) {
if(defaultprefix) {
@@ -122,6 +123,8 @@ void shipout(string prefix=defaultfilename, picture pic=currentpicture,
string options="", string script="",
light light=currentlight, projection P=currentprojection)
{
+ projection P=centered(P,pic);
+
if(!uptodate()) {
bool inlinetex=settings.inlinetex;
bool prc=prc(format) || settings.v3d;
diff --git a/graphics/asymptote/base/rational.asy b/graphics/asymptote/base/rational.asy
index 068376fece..5517aaa127 100644
--- a/graphics/asymptote/base/rational.asy
+++ b/graphics/asymptote/base/rational.asy
@@ -41,107 +41,108 @@ struct rational {
this.q=q;
if(reduce) reduce();
}
-}
-rational operator cast(int p)
-{
- return rational(p,false);
-}
+ autounravel rational operator cast(int p)
+ {
+ return rational(p,false);
+ }
-rational[] operator cast(int[] a)
-{
- return sequence(new rational(int i) {return a[i];},a.length);
-}
+ autounravel rational[] operator cast(int[] a)
+ {
+ return sequence(new rational(int i) {return a[i];},a.length);
+ }
-rational[][] operator cast(int[][] a)
-{
- return sequence(new rational[](int i) {return a[i];},a.length);
-}
+ autounravel rational[][] operator cast(int[][] a)
+ {
+ return sequence(new rational[](int i) {return a[i];},a.length);
+ }
-real operator ecast(rational r)
-{
- return r.p/r.q;
-}
+ real operator ecast(rational r)
+ {
+ return r.p/r.q;
+ }
-rational operator ecast(real x)
-{
- int sign=x >= 0.0 ? 1 : -1;
- x=abs(x);
- int a=floor(x); int b=1;
- int c=a+1; int d=1;
-
- while(true) {
- int e=a+c;
- int f=b+d;
- if(f > maxDenominator) break;
- if(e/f == x)
- return rational(sign*e,f);
- else {
- if(e/f < x) {
- a=e;
- b=f;
- } else {
- c=e;
- d=f;
+ autounravel rational operator ecast(real x)
+ {
+ int sign=x >= 0.0 ? 1 : -1;
+ x=abs(x);
+ int a=floor(x); int b=1;
+ int c=a+1; int d=1;
+
+ while(true) {
+ int e=a+c;
+ int f=b+d;
+ if(f > maxDenominator) break;
+ if(e/f == x)
+ return rational(sign*e,f);
+ else {
+ if(e/f < x) {
+ a=e;
+ b=f;
+ } else {
+ c=e;
+ d=f;
+ }
}
}
+ return abs(a/b-x) < abs(c/d-x) ? rational(sign*a,b) : rational(sign*c,d);
}
- return abs(a/b-x) < abs(c/d-x) ? rational(sign*a,b) : rational(sign*c,d);
-}
-rational operator -(rational r)
-{
- return rational(-r.p,r.q,false);
-}
+ autounravel rational operator -(rational r)
+ {
+ return rational(-r.p,r.q,false);
+ }
-rational operator +(rational r, rational s)
-{
- return rational(r.p*s.q+s.p*r.q,r.q*s.q);
-}
+ autounravel rational operator +(rational r, rational s)
+ {
+ return rational(r.p*s.q+s.p*r.q,r.q*s.q);
+ }
-rational operator -(rational r, rational s)
-{
- return rational(r.p*s.q-s.p*r.q,r.q*s.q);
-}
+ autounravel rational operator -(rational r, rational s)
+ {
+ return rational(r.p*s.q-s.p*r.q,r.q*s.q);
+ }
-rational operator *(rational r, rational s)
-{
- return rational(r.p*s.p,r.q*s.q);
-}
+ autounravel rational operator *(rational r, rational s)
+ {
+ return rational(r.p*s.p,r.q*s.q);
+ }
-rational operator /(rational r, rational s)
-{
- return rational(r.p*s.q,r.q*s.p);
-}
+ autounravel rational operator /(rational r, rational s)
+ {
+ return rational(r.p*s.q,r.q*s.p);
+ }
-bool operator ==(rational r, rational s)
-{
- return r.p == s.p && r.q == s.q;
-}
+ autounravel bool operator ==(rational r, rational s)
+ {
+ return r.p == s.p && r.q == s.q;
+ }
-bool operator !=(rational r, rational s)
-{
- return r.p != s.p || r.q != s.q;
-}
+ autounravel bool operator !=(rational r, rational s)
+ {
+ return r.p != s.p || r.q != s.q;
+ }
-bool operator <(rational r, rational s)
-{
- return r.p*s.q-s.p*r.q < 0;
-}
+ autounravel bool operator <(rational r, rational s)
+ {
+ return r.p*s.q-s.p*r.q < 0;
+ }
-bool operator >(rational r, rational s)
-{
- return r.p*s.q-s.p*r.q > 0;
-}
+ autounravel bool operator >(rational r, rational s)
+ {
+ return r.p*s.q-s.p*r.q > 0;
+ }
-bool operator <=(rational r, rational s)
-{
- return r.p*s.q-s.p*r.q <= 0;
-}
+ autounravel bool operator <=(rational r, rational s)
+ {
+ return r.p*s.q-s.p*r.q <= 0;
+ }
+
+ autounravel bool operator >=(rational r, rational s)
+ {
+ return r.p*s.q-s.p*r.q >= 0;
+ }
-bool operator >=(rational r, rational s)
-{
- return r.p*s.q-s.p*r.q >= 0;
}
bool[] operator ==(rational[] r, rational s)
@@ -165,6 +166,30 @@ bool operator ==(rational[][] r, rational[][] s)
return all(sequence(new bool(int i) {return r[i] == s[i];},r.length));
}
+rational[] operator +(rational[] r, rational[] s)
+{
+ assert(r.length == s.length);
+ return sequence(new rational(int i) {return r[i]+s[i];},r.length);
+}
+
+rational[] operator -(rational[] r, rational[] s)
+{
+ assert(r.length == s.length);
+ return sequence(new rational(int i) {return r[i]-s[i];},r.length);
+}
+
+rational[] operator *(rational[] r, rational[] s)
+{
+ assert(r.length == s.length);
+ return sequence(new rational(int i) {return r[i]*s[i];},r.length);
+}
+
+rational[] operator /(rational[] r, rational[] s)
+{
+ assert(r.length == s.length);
+ return sequence(new rational(int i) {return r[i]/s[i];},r.length);
+}
+
bool[] operator <(rational[] r, rational s)
{
return sequence(new bool(int i) {return r[i] < s;},r.length);
diff --git a/graphics/asymptote/base/rationalSimplex.asy b/graphics/asymptote/base/rationalSimplex.asy
index b6ce98c4ae..97ebffe0d3 100644
--- a/graphics/asymptote/base/rationalSimplex.asy
+++ b/graphics/asymptote/base/rationalSimplex.asy
@@ -272,8 +272,6 @@ struct simplex {
rational[] cB=phase1 ? new rational[m] : c[n-m:n];
rational[][] D=phase1 ? new rational[m+1][n+1] : E;
if(phase1) {
- write("n=",n);
- write(Bindices);
// Drive artificial variables out of basis.
for(int i=0; i < m; ++i) {
if(Bindices[i] > n) {
diff --git a/graphics/asymptote/base/slide.asy b/graphics/asymptote/base/slide.asy
index a695953768..6f72321c5f 100644
--- a/graphics/asymptote/base/slide.asy
+++ b/graphics/asymptote/base/slide.asy
@@ -25,6 +25,9 @@ if(landscape) {
pageheight += settings.paperheight;
}
+texpreamble("\paperwidth="+string(pagewidth)+"bp");
+texpreamble("\paperheight"+string(pageheight)+"bp");
+
size(pagewidth,pageheight,IgnoreAspect);
picture background;
@@ -401,21 +404,26 @@ void display(string s, string caption="", pair align=S, pen p=itempen,
void figure(string[] s, string options="", real margin=0,
string[] captions=new string[], string caption="",
+ string[] url=new string[],
pair align=S, pen p=itempen, pen figuremattpen=figuremattpen,
bool final=true)
{
string[] S;
for(int i=0; i < s.length; ++i) {
S[i]=graphic(s[i],options);
+ if(i < url.length && url[i] != "")
+ S[i]="\href{"+url[i]+"/"+s[i]+".html}{"+S[i]+"}";
}
display(S,margin,captions,caption,align,itempen,figuremattpen,final);
}
-void figure(string s, string options="", string caption="", pair align=S,
+void figure(string s, string options="", string caption="",
+ string url="", pair align=S,
pen p=itempen, pen figuremattpen=figuremattpen, bool final=true)
{
- figure(new string[] {s},options,caption,align,p,figuremattpen,final);
+ figure(new string[] {s},options,caption,new string[] {url},align,p,
+ figuremattpen,final);
}
void multifigure(string[] slist, string options="", string caption="",
@@ -581,7 +589,7 @@ void bibliography(string name)
real hmargin,vmargin;
if(pdf()) {
hmargin=1;
- vmargin=0;
+ vmargin=0.5;
} else {
hmargin=1.5;
vmargin=1;
diff --git a/graphics/asymptote/base/three.asy b/graphics/asymptote/base/three.asy
index b93833f666..343ca72067 100644
--- a/graphics/asymptote/base/three.asy
+++ b/graphics/asymptote/base/three.asy
@@ -46,21 +46,21 @@ restricted interaction Billboard=interaction(1);
struct render
{
- // PRC parameters:
- real compression; // lossy compression parameter (0=no compression)
+ real compression; // lossy PRC compression parameter (0=no compression)
real granularity; // PRC rendering granularity
- bool closed; // use one-sided rendering?
- bool tessellate; // use tessellated mesh to store straight patches?
+ bool closed; // use one-sided PRC rendering?
- bool3 merge; // merge nodes before rendering, for faster but
- // lower quality PRC rendering (the value default means
+ bool tessellate; // use tessellated mesh to store straight patches
+
+ bool3 merge; // merge PRC nodes before rendering, for faster but
+ // lower quality rendering (the value default means
// merge opaque patches only).
int sphere; // PRC sphere type (PRCsphere or NURBSsphere).
// General parameters:
- real margin; // shrink amount for rendered openGL viewport, in bp.
+ real margin; // shrink amount for rendered OpenGL viewport, in bp.
bool partnames; // assign part name indices to compound objects
bool defaultnames; // assign default names to unnamed objects
interaction interaction; // billboard interaction mode
@@ -346,7 +346,7 @@ projection perspective(real x, real y, real z, triple up=Z, triple target=O,
projection orthographic(triple camera, triple up=Z, triple target=O,
real zoom=1, pair viewportshift=0,
- bool showtarget=true, bool center=false)
+ bool showtarget=true, bool center=true)
{
return projection(camera,up,target,zoom,viewportshift,showtarget,
center=center,new transformation(triple camera, triple up,
@@ -356,7 +356,7 @@ projection orthographic(triple camera, triple up=Z, triple target=O,
projection orthographic(real x, real y, real z, triple up=Z,
triple target=O, real zoom=1, pair viewportshift=0,
- bool showtarget=true, bool center=false)
+ bool showtarget=true, bool center=true)
{
return orthographic((x,y,z),up,target,zoom,viewportshift,showtarget,
center=center);
@@ -2679,10 +2679,10 @@ struct scene
warn=false;
}
- if(P.absolute)
- this.P=P.copy();
- else if(P.showtarget && !pic.empty3())
- draw(pic,P.target,nullpen);
+ this.P=P.copy();
+
+ if(!P.absolute && P.showtarget && !pic.empty3())
+ draw(pic,this.P.target,nullpen);
t=pic.scaling(xsize3,ysize3,zsize3,keepAspect,warn);
adjusted=false;
@@ -2690,14 +2690,9 @@ struct scene
triple M=pic.max(t);
if(!P.absolute) {
- this.P=t*P;
+ this.P=t*this.P;
if(this.P.autoadjust || this.P.infinity)
adjusted=adjusted | this.P.adjust(m,M);
- if(this.P.center && settings.render != 0) {
- triple target=0.5*(m+M);
- this.P.target=target;
- this.P.calculate();
- }
}
bool scale=xsize != 0 || ysize != 0;
@@ -2898,11 +2893,13 @@ object embed(string prefix=outprefix(), string label=prefix,
if(primitive())
format=settings.v3d ? "v3d" : settings.outformat;
+ transform3 s=inv*shift(0,0,zcenter);
+
shipout3(prefix,f,preview ? nativeformat() : format,
S.width-defaultrender.margin,S.height-defaultrender.margin,
P.infinity ? 0 : 2aTan(Tan(0.5*P.angle)*P.zoom),
P.zoom,m,M,P.viewportshift,S.viewportmargin,
- tinv*inv*shift(0,0,zcenter),Light.background(),Light.position,
+ tinv*s,s,Light.background(),Light.position,
Light.diffuse,Light.specular,
view && !preview);
if(settings.v3d) {
@@ -3040,13 +3037,13 @@ currentpicture.fitter=new frame(string prefix, picture pic, string format,
bool empty3=pic.empty3();
if(!empty3 || pic.queueErase3) {
f=embedder(new object(string prefix, string format) {
- return embed(prefix=prefix,pic,format,xsize,ysize,keepAspect,view,
- options,script,light,P);
- },prefix,format,view,light);
+ return embed(prefix=prefix,pic,format,xsize,ysize,keepAspect,view,
+ options,script,light,P);
+ },prefix,format,view,light);
pic.queueErase3=false;
}
- if(is3D(format) || pic.queueErase)
+ if(is3D(format) || pic.queueErase || settings.render == 0)
add(f,pic.fit2(xsize,ysize,keepAspect));
return f;
};
diff --git a/graphics/asymptote/base/three_surface.asy b/graphics/asymptote/base/three_surface.asy
index c54b0cc490..d5e9ac47a6 100644
--- a/graphics/asymptote/base/three_surface.asy
+++ b/graphics/asymptote/base/three_surface.asy
@@ -409,14 +409,15 @@ struct patch {
// A constructor for a triangle or convex quadrilateral.
void operator init(triple[] external, triple[] internal=new triple[],
pen[] colors=new pen[], bool3 planar=default) {
- init();
-
straight=true;
if(colors.length != 0)
this.colors=copy(colors);
if(external.length == 3) {
+ triangular=true;
+ this.planar=true;
+ init();
P=new triple[][] {
{external[0]},
{interp(external[0],external[1],1/3),
@@ -426,9 +427,8 @@ struct patch {
{external[1],interp(external[1],external[2],1/3),
interp(external[1],external[2],2/3),external[2]}
};
- planar=true;
- triangular=true;
} else {
+ init();
if(internal.length == 0 && planar == default)
this.planar=normal(external) != O;
else this.planar=planar;
@@ -788,10 +788,11 @@ struct surface {
}
void operator init(triple[][][] P, pen[][] colors=new pen[][],
+ bool3 straight=false,
bool3 planar=default, bool triangular=false) {
s=sequence(new patch(int i) {
- return patch(P[i],colors.length == 0 ? new pen[] : colors[i],planar,
- triangular);
+ return patch(P[i],colors.length == 0 ? new pen[] : colors[i],
+ straight,planar,triangular);
},P.length);
}
@@ -1420,6 +1421,7 @@ void _draw(frame f, path3 g, triple center=O, material m,
int computeNormals(triple[] v, int[][] vi, triple[] n, int[][] ni)
{
triple lastnormal=O;
+ n.delete();
for(int i=0; i < vi.length; ++i) {
int[] vii=vi[i];
int[] nii=ni[i];
@@ -1433,7 +1435,7 @@ int computeNormals(triple[] v, int[][] vi, triple[] n, int[][] ni)
return ni.length;
}
-// Draw triangles on a frame.
+// Draw a triangle group on a frame.
void draw(frame f, triple[] v, int[][] vi,
triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={},
int[][] pi={}, light light=currentlight, render render=defaultrender)
@@ -1480,21 +1482,25 @@ void draw(frame f, triple[] v, int[][] vi,
render.interaction.type);
}
-// Draw triangles on a picture.
+// Draw a triangle group on a picture.
void draw(picture pic=currentpicture, triple[] v, int[][] vi,
triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={},
int[][] pi={}, light light=currentlight, render render=defaultrender)
{
- bool normals=ni.length > 0;
- if(!normals) {
- ni=new int[vi.length][3];
- normals=computeNormals(v,vi,n,ni) > 0;
- }
bool colors=pi.length > 0;
+ // TODO: copy inputs
+
pic.add(new void(frame f, transform3 t, picture pic, projection P) {
triple[] v=t*v;
- triple[] n=t*n;
+ bool normals=ni.length > 0;
+ if(normals) {
+ transform3 T=transpose(inverse(shiftless(t)));
+ n=sequence(new triple(int i) {return unit(T*n[i]);},n.length) ;
+ } else {
+ ni=new int[vi.length][3];
+ normals=computeNormals(v,vi,n,ni) > 0;
+ }
if(is3D()) {
render Render=render(render,interaction(render.interaction,
@@ -1539,9 +1545,11 @@ void draw(picture pic=currentpicture, triple[] v, int[][] vi,
}
},true);
- for(int[] vii : vi)
- for(int viij : vii)
- pic.addPoint(v[viij]);
+ for(int[] vii : vi) {
+ pic.addPoint(v[vii[0]]);
+ pic.addPoint(v[vii[1]]);
+ pic.addPoint(v[vii[2]]);
+ }
}
void tensorshade(transform t=identity(), frame f, patch s,
@@ -1684,6 +1692,112 @@ void draw(transform t=identity(), frame f, surface s, int nu=1, int nv=1,
draw(t,f,s,nu,nv,surfacepen,meshpen,light,meshlight,name,render,P);
}
+// draw a triangle group on a frame for the tessellation of a surface
+// containing indexed patches.
+void drawTessellation(frame f, surface s,
+ material surfacepen=currentpen, pen meshpen=nullpen,
+ light light=currentlight, light meshlight=nolight,
+ string name="", render render=defaultrender)
+{
+ int nU=s.index.length;
+ if(nU == 0) return;
+ int nV=s.index[0].length;
+ if(nV == 0) return;
+
+ int N=(nU+1)*(nV+1);
+ triple[] v=new triple[N];
+ triple[] n=new triple[N];
+
+ bool colors=s.s[0].colors.length > 0;
+ pen[] p;
+ if(colors)
+ p=new pen[N];
+
+ int index(int i,int j) {return (nV+1)*i+j;}
+
+ int k=0;
+ for(int U=0; U < nU; ++U) {
+ for(int V=0; V < nV; ++V) {
+ patch q=s.s[s.index[U][V]];
+ v[k]=q.P[0][0];
+ n[k]=unit(q.normal00());
+ if(colors)
+ p[k]=q.colors[0];
+ ++k;
+ }
+ patch q=s.s[s.index[U][nV-1]];
+ v[k]=q.P[0][3];
+ n[k]=unit(q.normal01());
+ if(colors)
+ p[k]=q.colors[3];
+ ++k;
+ }
+
+ for(int V=0; V < nV; ++V) {
+ patch q=s.s[s.index[nU-1][V]];
+ v[k]=q.P[3][0];
+ n[k]=unit(q.normal10());
+ if(colors)
+ p[k]=q.colors[1];
+ ++k;
+ }
+ patch q=s.s[s.index[nU-1][nV-1]];
+ v[k]=q.P[3][3];
+ n[k]=unit(q.normal11());
+ if(colors)
+ p[k]=q.colors[2];
+ ++k;
+
+ int[][] vi=new int[nU*nV][];
+ int k=0;
+ for(int i=0; i < nU; ++i) {
+ for(int j=0; j < nV; ++j) {
+ vi[k]=new int[] {index(i,j),index(i+1,j),index(i+1,j+1)};
+ ++k;
+ vi[k]=new int[] {index(i,j),index(i+1,j+1),index(i,j+1)};
+ ++k;
+ }
+ }
+
+ draw(f,v,vi,n,vi,surfacepen,p,colors ? vi : new int[][],light);
+
+ if(!invisible(meshpen)) {
+ if(is3D()) meshpen=thin()+squarecap+meshpen;
+ bool group=name != "" || render.defaultnames;
+ for(int k=0; k < s.s.length; ++k) {
+ patch q=s.s[k];
+ if(group)
+ begingroup3(f,meshname(name),render);
+ draw(f,q.P[0][0]--q.P[3][0]--q.P[3][3]--q.P[0][3]--cycle,
+ meshpen,meshlight,partname(k,render),render);
+ if(group)
+ endgroup3(f);
+ }
+ }
+}
+
+// draw a triangle group on a picture for the tessellation of a surface
+// containing indexed patches.
+void drawTessellation(picture pic=currentpicture, surface s,
+ material surfacepen=currentpen, pen meshpen=nullpen,
+ light light=currentlight, light meshlight=nolight,
+ string name="", render render=defaultrender)
+{
+ pic.add(new void(frame f, transform3 t, picture, projection) {
+ drawTessellation(f,t*s,surfacepen,meshpen,light,meshlight,name,render);
+ },true);
+
+ pic.addPoint(min(s));
+ pic.addPoint(max(s));
+
+ if(!invisible(meshpen)) {
+ for(int k=0; k < s.s.length; ++k) {
+ patch q=s.s[k];
+ addPath(pic,q.P[0][0]--q.P[3][0]--q.P[3][3]--q.P[0][3]--cycle,meshpen);
+ }
+ }
+}
+
void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1,
material[] surfacepen, pen[] meshpen=nullpens,
light light=currentlight, light meshlight=nolight, string name="",
@@ -1691,12 +1805,8 @@ void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1,
{
if(s.empty()) return;
- bool cyclic=surfacepen.cyclic;
surfacepen=copy(surfacepen);
- surfacepen.cyclic=cyclic;
- cyclic=meshpen.cyclic;
meshpen=copy(meshpen);
- meshpen.cyclic=cyclic;
pic.add(new void(frame f, transform3 t, picture pic, projection P) {
surface S=t*s;
@@ -1738,11 +1848,15 @@ void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1,
light light=currentlight, light meshlight=nolight, string name="",
render render=defaultrender)
{
- material[] surfacepen={surfacepen};
- pen[] meshpen={meshpen};
- surfacepen.cyclic=true;
- meshpen.cyclic=true;
- draw(pic,s,nu,nv,surfacepen,meshpen,light,meshlight,name,render);
+ if(render.tessellate && s.index.length > 0 && settings.render != 0) {
+ drawTessellation(pic,s,surfacepen,meshpen,light,meshlight,name,render);
+ } else {
+ material[] surfacepen={surfacepen};
+ surfacepen.cyclic=true;
+ pen[] meshpen={meshpen};
+ meshpen.cyclic=true;
+ draw(pic,s,nu,nv,surfacepen,meshpen,light,meshlight,name,render);
+ }
}
void draw(picture pic=currentpicture, surface s, int nu=1, int nv=1,
diff --git a/graphics/asymptote/base/v3dheadertypes.asy b/graphics/asymptote/base/v3dheadertypes.asy
index aff3ebd34d..3cc4d3ae17 100644
--- a/graphics/asymptote/base/v3dheadertypes.asy
+++ b/graphics/asymptote/base/v3dheadertypes.asy
@@ -1,7 +1,5 @@
// Enum class for v3dheadertypes
// AUTO-GENERATED from v3dheadertypes.csv
-// Generated at 2024-06-21 17:45:18+00:00
-
struct v3dheadertypes
{
int canvasWidth=1;
diff --git a/graphics/asymptote/base/v3dtypes.asy b/graphics/asymptote/base/v3dtypes.asy
index 97517ebae2..e2251544ab 100644
--- a/graphics/asymptote/base/v3dtypes.asy
+++ b/graphics/asymptote/base/v3dtypes.asy
@@ -1,7 +1,5 @@
// Enum class for v3dtypes
// AUTO-GENERATED from v3dtypes.csv
-// Generated at 2024-06-21 17:45:18+00:00
-
struct v3dtypes
{
int material=1;
diff --git a/graphics/asymptote/base/webgl/asygl.js b/graphics/asymptote/base/webgl/asygl.js
index b5f77299a6..5b9fbfa649 100644
--- a/graphics/asymptote/base/webgl/asygl.js
+++ b/graphics/asymptote/base/webgl/asygl.js
@@ -1,6 +1,6 @@
/*@license
AsyGL: Render Bezier patches and triangles via subdivision with WebGL.
- Copyright 2019-2022: John C. Bowman and Supakorn "Jamie" Rassameemasmuang
+ Copyright 2019-2024: John C. Bowman and Supakorn "Jamie" Rassameemasmuang
University of Alberta
This program is free software; you can redistribute it and/or modify
@@ -36,4 +36,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
-let vertex="\n#ifdef WEBGL2\n#define IN in\n#define OUT out\n#else\n#define IN attribute\n#define OUT varying\n#endif\n\nIN vec3 position;\n#ifdef WIDTH\nIN float width;\n#endif\n#ifdef NORMAL\nIN vec3 normal;\n#endif\n\nIN float materialIndex;\n\n#ifdef WEBGL2\nflat out int MaterialIndex;\n#ifdef COLOR\nOUT vec4 Color;\n#endif\n\n#else\nOUT vec4 diffuse;\nOUT vec3 specular;\nOUT float roughness,metallic,fresnel0;\nOUT vec4 emissive;\n\nstruct Material {\n vec4 diffuse,emissive,specular;\n vec4 parameters;\n};\n\nuniform Material Materials[Nmaterials];\n#endif\n\n#ifdef COLOR\nIN vec4 color;\n#endif\n\nuniform mat3 normMat;\nuniform mat4 viewMat;\nuniform mat4 projViewMat;\n\n#ifdef NORMAL\n#ifndef ORTHOGRAPHIC\nOUT vec3 ViewPosition;\n#endif\nOUT vec3 Normal;\n#endif\n\nvoid main(void)\n{\n vec4 v=vec4(position,1.0);\n gl_Position=projViewMat*v;\n\n#ifdef NORMAL\n#ifndef ORTHOGRAPHIC\n ViewPosition=(viewMat*v).xyz;\n#endif\n Normal=normalize(normal*normMat);\n#endif\n\n#ifdef WEBGL2\n MaterialIndex=int(materialIndex);\n#ifdef COLOR\n Color=color;\n#endif\n#else\n#ifdef NORMAL\n Material m;\n#ifdef TRANSPARENT\n m=Materials[int(abs(materialIndex))-1];\n emissive=m.emissive;\n if(materialIndex >= 0.0)\n diffuse=m.diffuse;\n else {\n diffuse=color;\n#if nlights == 0\n emissive += color;\n#endif\n }\n#else\n m=Materials[int(materialIndex)];\n emissive=m.emissive;\n#ifdef COLOR\n diffuse=color;\n#if nlights == 0\n emissive += color;\n#endif\n#else\n diffuse=m.diffuse;\n#endif // COLOR\n#endif // TRANSPARENT\n specular=m.specular.rgb;\n vec4 parameters=m.parameters;\n roughness=1.0-parameters[0];\n metallic=parameters[1];\n fresnel0=parameters[2];\n#else\n emissive=Materials[int(materialIndex)].emissive;\n#endif // NORMAL\n#endif // WEBGL2\n\n#ifdef WIDTH\n gl_PointSize=width;\n#endif\n}\n",fragment="\n#ifdef WEBGL2\n#define IN in\nout vec4 outValue;\n#define OUTVALUE outValue\n#else\n#define IN varying\n#define OUTVALUE gl_FragColor\n#endif\n\n#ifdef WEBGL2\nflat in int MaterialIndex;\n\nstruct Material {\n vec4 diffuse,emissive,specular;\n vec4 parameters;\n};\n\nuniform Material Materials[Nmaterials];\n\nvec4 diffuse;\nvec3 specular;\nfloat roughness,metallic,fresnel0;\nvec4 emissive;\n\n#ifdef COLOR\nin vec4 Color;\n#endif\n\n#else\nIN vec4 diffuse;\nIN vec3 specular;\nIN float roughness,metallic,fresnel0;\nIN vec4 emissive;\n#endif\n\n#ifdef NORMAL\n\n#ifndef ORTHOGRAPHIC\nIN vec3 ViewPosition;\n#endif\nIN vec3 Normal;\n\nvec3 normal;\n\nstruct Light {\n vec3 direction;\n vec3 color;\n};\n\nuniform Light Lights[Nlights];\n\n#ifdef USE_IBL\nuniform sampler2D reflBRDFSampler;\nuniform sampler2D diffuseSampler;\nuniform sampler2D reflImgSampler;\n\nconst float pi=acos(-1.0);\nconst float piInv=1.0/pi;\nconst float twopi=2.0*pi;\nconst float twopiInv=1.0/twopi;\n\n// (x,y,z) -> (r,theta,phi);\n// theta -> [0,pi]: colatitude\n// phi -> [-pi,pi]: longitude\nvec3 cart2sphere(vec3 cart)\n{\n float x=cart.x;\n float y=cart.z;\n float z=cart.y;\n\n float r=length(cart);\n float theta=r > 0.0 ? acos(z/r) : 0.0;\n float phi=atan(y,x);\n\n return vec3(r,theta,phi);\n}\n\nvec2 normalizedAngle(vec3 cartVec)\n{\n vec3 sphericalVec=cart2sphere(cartVec);\n sphericalVec.y=sphericalVec.y*piInv;\n sphericalVec.z=0.75-sphericalVec.z*twopiInv;\n return sphericalVec.zy;\n}\n\nvec3 IBLColor(vec3 viewDir)\n{\n vec3 IBLDiffuse=diffuse.rgb*texture(diffuseSampler,normalizedAngle(normal)).rgb;\n vec3 reflectVec=normalize(reflect(-viewDir,normal));\n vec2 reflCoord=normalizedAngle(reflectVec);\n vec3 IBLRefl=textureLod(reflImgSampler,reflCoord,roughness*ROUGHNESS_STEP_COUNT).rgb;\n vec2 IBLbrdf=texture(reflBRDFSampler,vec2(dot(normal,viewDir),roughness)).rg;\n float specularMultiplier=fresnel0*IBLbrdf.x+IBLbrdf.y;\n vec3 dielectric=IBLDiffuse+specularMultiplier*IBLRefl;\n vec3 metal=diffuse.rgb*IBLRefl;\n return mix(dielectric,metal,metallic);\n}\n#else\nfloat Roughness2;\nfloat NDF_TRG(vec3 h)\n{\n float ndoth=max(dot(normal,h),0.0);\n float alpha2=Roughness2*Roughness2;\n float denom=ndoth*ndoth*(alpha2-1.0)+1.0;\n return denom != 0.0 ? alpha2/(denom*denom) : 0.0;\n}\n\nfloat GGX_Geom(vec3 v)\n{\n float ndotv=max(dot(v,normal),0.0);\n float ap=1.0+Roughness2;\n float k=0.125*ap*ap;\n return ndotv/((ndotv*(1.0-k))+k);\n}\n\nfloat Geom(vec3 v, vec3 l)\n{\n return GGX_Geom(v)*GGX_Geom(l);\n}\n\nfloat Fresnel(vec3 h, vec3 v, float fresnel0)\n{\n float a=1.0-max(dot(h,v),0.0);\n float b=a*a;\n return fresnel0+(1.0-fresnel0)*b*b*a;\n}\n\n// physical based shading using UE4 model.\nvec3 BRDF(vec3 viewDirection, vec3 lightDirection)\n{\n vec3 lambertian=diffuse.rgb;\n vec3 h=normalize(lightDirection+viewDirection);\n\n float omegain=max(dot(viewDirection,normal),0.0);\n float omegaln=max(dot(lightDirection,normal),0.0);\n\n float D=NDF_TRG(h);\n float G=Geom(viewDirection,lightDirection);\n float F=Fresnel(h,viewDirection,fresnel0);\n\n float denom=4.0*omegain*omegaln;\n float rawReflectance=denom > 0.0 ? (D*G)/denom : 0.0;\n\n vec3 dielectric=mix(lambertian,rawReflectance*specular,F);\n vec3 metal=rawReflectance*diffuse.rgb;\n\n return mix(dielectric,metal,metallic);\n}\n#endif\n\n#endif\n\nvoid main(void)\n{\n#ifdef WEBGL2\n#ifdef NORMAL\n Material m;\n#ifdef TRANSPARENT\n m=Materials[abs(MaterialIndex)-1];\n emissive=m.emissive;\n if(MaterialIndex >= 0)\n diffuse=m.diffuse;\n else {\n diffuse=Color;\n#if nlights == 0\n emissive += Color;\n#endif\n }\n#else\n m=Materials[MaterialIndex];\n emissive=m.emissive;\n#ifdef COLOR\n diffuse=Color;\n#if nlights == 0\n emissive += Color;\n#endif\n#else\n diffuse=m.diffuse;\n#endif // COLOR\n#endif // TRANSPARENT\n specular=m.specular.rgb;\n vec4 parameters=m.parameters;\n roughness=1.0-parameters[0];\n metallic=parameters[1];\n fresnel0=parameters[2];\n#else\n emissive=Materials[MaterialIndex].emissive;\n#endif // NORMAL\n#endif // WEBGL2\n\n#if defined(NORMAL) && nlights > 0\n normal=normalize(Normal);\n normal=gl_FrontFacing ? normal : -normal;\n#ifdef ORTHOGRAPHIC\n vec3 viewDir=vec3(0.0,0.0,1.0);\n#else\n vec3 viewDir=-normalize(ViewPosition);\n#endif\n\nvec3 color;\n#ifdef USE_IBL\n color=IBLColor(viewDir);\n#else\n Roughness2=roughness*roughness;\n color=emissive.rgb;\n for(int i=0; i < nlights; ++i) {\n Light Li=Lights[i];\n vec3 L=Li.direction;\n float cosTheta=max(dot(normal,L),0.0);\n vec3 radiance=cosTheta*Li.color;\n color += BRDF(viewDir,L)*radiance;\n }\n#endif\n OUTVALUE=vec4(color,diffuse.a);\n#else\n OUTVALUE=emissive;\n#endif\n}\n";!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i=e();for(var n in i)("object"==typeof exports?exports:t)[n]=i[n]}}("undefined"!=typeof self?self:this,(function(){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=1)}([function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setMatrixArrayType=function(t){e.ARRAY_TYPE=t},e.toRadian=function(t){return t*r},e.equals=function(t,e){return Math.abs(t-e)<=n*Math.max(1,Math.abs(t),Math.abs(e))};var n=e.EPSILON=1e-6;e.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,e.RANDOM=Math.random;var r=Math.PI/180},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mat4=e.mat3=void 0;var n=s(i(2)),r=s(i(3));function s(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}e.mat3=n,e.mat4=r},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=function(){var t=new n.ARRAY_TYPE(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromMat4=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[4],t[4]=e[5],t[5]=e[6],t[6]=e[8],t[7]=e[9],t[8]=e[10],t},e.invert=function(t,e){var i=e[0],n=e[1],r=e[2],s=e[3],a=e[4],o=e[5],h=e[6],l=e[7],c=e[8],d=c*a-o*l,m=-c*s+o*h,f=l*s-a*h,u=i*d+n*m+r*f;if(!u)return null;return u=1/u,t[0]=d*u,t[1]=(-c*n+r*l)*u,t[2]=(o*n-r*a)*u,t[3]=m*u,t[4]=(c*i-r*h)*u,t[5]=(-o*i+r*s)*u,t[6]=f*u,t[7]=(-l*i+n*h)*u,t[8]=(a*i-n*s)*u,t};var n=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(i(0))},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=function(){var t=new n.ARRAY_TYPE(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.invert=function(t,e){var i=e[0],n=e[1],r=e[2],s=e[3],a=e[4],o=e[5],h=e[6],l=e[7],c=e[8],d=e[9],m=e[10],f=e[11],u=e[12],p=e[13],v=e[14],x=e[15],g=i*o-n*a,w=i*h-r*a,M=i*l-s*a,b=n*h-r*o,R=n*l-s*o,T=r*l-s*h,y=c*p-d*u,A=c*v-m*u,E=c*x-f*u,I=d*v-m*p,L=d*x-f*p,N=m*x-f*v,O=g*N-w*L+M*I+b*E-R*A+T*y;if(!O)return null;return O=1/O,t[0]=(o*N-h*L+l*I)*O,t[1]=(r*L-n*N-s*I)*O,t[2]=(p*T-v*R+x*b)*O,t[3]=(m*R-d*T-f*b)*O,t[4]=(h*E-a*N-l*A)*O,t[5]=(i*N-r*E+s*A)*O,t[6]=(v*M-u*T-x*w)*O,t[7]=(c*T-m*M+f*w)*O,t[8]=(a*L-o*E+l*y)*O,t[9]=(n*E-i*L-s*y)*O,t[10]=(u*R-p*M+x*g)*O,t[11]=(d*M-c*R-f*g)*O,t[12]=(o*A-a*I-h*y)*O,t[13]=(i*I-n*A+r*y)*O,t[14]=(p*w-u*b-v*g)*O,t[15]=(c*b-d*w+m*g)*O,t},e.multiply=r,e.translate=function(t,e,i){var n=i[0],r=i[1],s=i[2],a=void 0,o=void 0,h=void 0,l=void 0,c=void 0,d=void 0,m=void 0,f=void 0,u=void 0,p=void 0,v=void 0,x=void 0;e===t?(t[12]=e[0]*n+e[4]*r+e[8]*s+e[12],t[13]=e[1]*n+e[5]*r+e[9]*s+e[13],t[14]=e[2]*n+e[6]*r+e[10]*s+e[14],t[15]=e[3]*n+e[7]*r+e[11]*s+e[15]):(a=e[0],o=e[1],h=e[2],l=e[3],c=e[4],d=e[5],m=e[6],f=e[7],u=e[8],p=e[9],v=e[10],x=e[11],t[0]=a,t[1]=o,t[2]=h,t[3]=l,t[4]=c,t[5]=d,t[6]=m,t[7]=f,t[8]=u,t[9]=p,t[10]=v,t[11]=x,t[12]=a*n+c*r+u*s+e[12],t[13]=o*n+d*r+p*s+e[13],t[14]=h*n+m*r+v*s+e[14],t[15]=l*n+f*r+x*s+e[15]);return t},e.rotate=function(t,e,i,r){var s,a,o,h,l,c,d,m,f,u,p,v,x,g,w,M,b,R,T,y,A,E,I,L,N=r[0],O=r[1],_=r[2],P=Math.sqrt(N*N+O*O+_*_);if(Math.abs(P)<n.EPSILON)return null;N*=P=1/P,O*=P,_*=P,s=Math.sin(i),a=Math.cos(i),o=1-a,h=e[0],l=e[1],c=e[2],d=e[3],m=e[4],f=e[5],u=e[6],p=e[7],v=e[8],x=e[9],g=e[10],w=e[11],M=N*N*o+a,b=O*N*o+_*s,R=_*N*o-O*s,T=N*O*o-_*s,y=O*O*o+a,A=_*O*o+N*s,E=N*_*o+O*s,I=O*_*o-N*s,L=_*_*o+a,t[0]=h*M+m*b+v*R,t[1]=l*M+f*b+x*R,t[2]=c*M+u*b+g*R,t[3]=d*M+p*b+w*R,t[4]=h*T+m*y+v*A,t[5]=l*T+f*y+x*A,t[6]=c*T+u*y+g*A,t[7]=d*T+p*y+w*A,t[8]=h*E+m*I+v*L,t[9]=l*E+f*I+x*L,t[10]=c*E+u*I+g*L,t[11]=d*E+p*I+w*L,e!==t&&(t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]);return t},e.fromTranslation=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=e[0],t[13]=e[1],t[14]=e[2],t[15]=1,t},e.fromRotation=function(t,e,i){var r,s,a,o=i[0],h=i[1],l=i[2],c=Math.sqrt(o*o+h*h+l*l);if(Math.abs(c)<n.EPSILON)return null;return o*=c=1/c,h*=c,l*=c,r=Math.sin(e),s=Math.cos(e),a=1-s,t[0]=o*o*a+s,t[1]=h*o*a+l*r,t[2]=l*o*a-h*r,t[3]=0,t[4]=o*h*a-l*r,t[5]=h*h*a+s,t[6]=l*h*a+o*r,t[7]=0,t[8]=o*l*a+h*r,t[9]=h*l*a-o*r,t[10]=l*l*a+s,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.frustum=function(t,e,i,n,r,s,a){var o=1/(i-e),h=1/(r-n),l=1/(s-a);return t[0]=2*s*o,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*s*h,t[6]=0,t[7]=0,t[8]=(i+e)*o,t[9]=(r+n)*h,t[10]=(a+s)*l,t[11]=-1,t[12]=0,t[13]=0,t[14]=a*s*2*l,t[15]=0,t},e.ortho=function(t,e,i,n,r,s,a){var o=1/(e-i),h=1/(n-r),l=1/(s-a);return t[0]=-2*o,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*h,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*l,t[11]=0,t[12]=(e+i)*o,t[13]=(r+n)*h,t[14]=(a+s)*l,t[15]=1,t};var n=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(i(0));function r(t,e,i){var n=e[0],r=e[1],s=e[2],a=e[3],o=e[4],h=e[5],l=e[6],c=e[7],d=e[8],m=e[9],f=e[10],u=e[11],p=e[12],v=e[13],x=e[14],g=e[15],w=i[0],M=i[1],b=i[2],R=i[3];return t[0]=w*n+M*o+b*d+R*p,t[1]=w*r+M*h+b*m+R*v,t[2]=w*s+M*l+b*f+R*x,t[3]=w*a+M*c+b*u+R*g,w=i[4],M=i[5],b=i[6],R=i[7],t[4]=w*n+M*o+b*d+R*p,t[5]=w*r+M*h+b*m+R*v,t[6]=w*s+M*l+b*f+R*x,t[7]=w*a+M*c+b*u+R*g,w=i[8],M=i[9],b=i[10],R=i[11],t[8]=w*n+M*o+b*d+R*p,t[9]=w*r+M*h+b*m+R*v,t[10]=w*s+M*l+b*f+R*x,t[11]=w*a+M*c+b*u+R*g,w=i[12],M=i[13],b=i[14],R=i[15],t[12]=w*n+M*o+b*d+R*p,t[13]=w*r+M*h+b*m+R*v,t[14]=w*s+M*l+b*f+R*x,t[15]=w*a+M*c+b*u+R*g,t}}])})),function(){document.asy={canvasWidth:0,canvasHeight:0,absolute:!1,minBound:[0,0,0],maxBound:[0,0,0],orthographic:!1,angleOfView:0,initialZoom:0,viewportShift:[0,0],viewportMargin:[0,0],background:[],zoomFactor:0,zoomPinchFactor:0,zoomPinchCap:0,zoomStep:0,shiftHoldDistance:0,shiftWaitTime:0,vibrateTime:0,ibl:!1,webgl2:!1,imageURL:"",image:"",Transform:[],Centers:[]};let t,e,i,n,r,s,a,o=document.asy,h=[],l=[],c=[],d=0,m=2;const f=Math.acos(-1),u=f/180,p=Math.ceil(1-Math.log2(Number.EPSILON));let v,x,g,w,M,b,R,T=mat4.create(),y=mat4.create(),A=mat4.create(),E=mat4.create(),I=mat3.create(),L=mat3.create(),N=mat4.create(),O=mat4.create(),_={x:0,y:0,z:0},P={x:0,y:0},S={xmin:0,xmax:0,ymin:0,ymax:0,zmin:0,zmax:0},U=!0,V=0,B=!1,D=null,C=null,F=[],z=[],H=[],X=[],G=null,W=null,j=null;function k(){o.embedded||st(),rt(o.ibl)}class Y{constructor(t,e,i,n,r,s){this.diffuse=t,this.emissive=e,this.specular=i,this.shininess=n,this.metallic=r,this.fresnel0=s}setUniform(e,i){let n=n=>t.getUniformLocation(e,"Materials["+i+"]."+n);t.uniform4fv(n("diffuse"),new Float32Array(this.diffuse)),t.uniform4fv(n("emissive"),new Float32Array(this.emissive)),t.uniform4fv(n("specular"),new Float32Array(this.specular)),t.uniform4f(n("parameters"),this.shininess,this.metallic,this.fresnel0,0)}}let $,q,K,Z,Q,J,tt,et,it;class nt{constructor(t,e){this.direction=t,this.color=e}setUniform(e,i){let n=n=>t.getUniformLocation(e,"Lights["+i+"]."+n);t.uniform3fv(n("direction"),new Float32Array(this.direction)),t.uniform3fv(n("color"),new Float32Array(this.color))}}function rt(e=!1){let i=t.getParameter(t.MAX_VERTEX_UNIFORM_VECTORS);r=Math.floor((i-14)/4),m=Math.min(Math.max(m,c.length),r),pixelOpt=["WIDTH"],materialOpt=["NORMAL"],colorOpt=["NORMAL","COLOR"],transparentOpt=["NORMAL","COLOR","TRANSPARENT"],e&&(materialOpt.push("USE_IBL"),transparentOpt.push("USE_IBL")),xe=Lt(pixelOpt),ge=Lt(materialOpt),we=Lt(colorOpt),Me=Lt(transparentOpt)}function st(){t.deleteProgram(Me),t.deleteProgram(we),t.deleteProgram(ge),t.deleteProgram(xe)}function at(){let i=o.webgl2?window.top.document.asygl2[e]:window.top.document.asygl[e];i.gl=t,i.nlights=l.length,i.Nmaterials=m,i.maxMaterials=r,i.pixelShader=xe,i.materialShader=ge,i.colorShader=we,i.transparentShader=Me}function ot(t,e){let i;return o.webgl2&&(i=t.getContext("webgl2",{alpha:e}),o.embedded&&!i)?(o.webgl2=!1,o.ibl=!1,ht(!1),null):(i||(o.webgl2=!1,o.ibl=!1,i=t.getContext("webgl",{alpha:e})),i||alert("Could not initialize WebGL"),i)}function ht(s=!0){if(o.ibl&&(o.webgl2=!0),e=o.background[3]<1,o.embedded){let a=window.top.document;if(s&&(n=o.canvas.getContext("2d")),i=o.webgl2?a.offscreen2:a.offscreen,i||(i=a.createElement("canvas"),o.webgl2?a.offscreen2=i:a.offscreen=i),o.webgl2?a.asygl2||(a.asygl2=Array(2)):a.asygl||(a.asygl=Array(2)),asygl=o.webgl2?a.asygl2:a.asygl,asygl[e]&&asygl[e].gl)!function(){let i=o.webgl2?window.top.document.asygl2[e]:window.top.document.asygl[e];t=i.gl,d=i.nlights,m=i.Nmaterials,r=i.maxMaterials,xe=i.pixelShader,ge=i.materialShader,we=i.colorShader,Me=i.transparentShader}(),(l.length!=d||Math.min(c.length,r)>m)&&(rt(),at());else{if(rc=ot(i,e),!rc)return;t=rc,rt(),o.webgl2?a.asygl2[e]={}:a.asygl[e]={},at()}}else t=ot(o.canvas,e),rt();$=t.getExtension("OES_element_index_uint"),q=t.TRIANGLES,K=new mt(t.POINTS),Z=new mt(t.LINES),Q=new mt,J=new mt,tt=new mt,et=new mt}function lt(t,e,i,n=[]){let r=o.webgl2?"300 es":"100",s=Array(...n),a=[["nlights",0==V?l.length:0],["Nmaterials",m]],h=[["int","Nlights",Math.max(l.length,1)]];o.webgl2&&s.push("WEBGL2"),o.ibl&&a.push(["ROUGHNESS_STEP_COUNT",8..toFixed(2)]),o.orthographic&&s.push("ORTHOGRAPHIC"),macros_str=a.map(t=>`#define ${t[0]} ${t[1]}`).join("\n"),define_str=s.map(t=>"#define "+t).join("\n"),const_str=h.map(t=>`const ${t[0]} ${t[1]}=${t[2]};`).join("\n"),ext_str=[].map(t=>`#extension ${t}: enable`).join("\n"),shaderSrc=`#version ${r}\n${ext_str}\n${define_str}\n${const_str}\n${macros_str}\n\n\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n \n${e}\n `;let c=t.createShader(i);return t.shaderSource(c,shaderSrc),t.compileShader(c),t.getShaderParameter(c,t.COMPILE_STATUS)?c:(alert(t.getShaderInfoLog(c)),null)}function ct(e,i,n,r=t.ARRAY_BUFFER){return e.length>0&&(0==i&&(i=t.createBuffer(),n=!0),t.bindBuffer(r,i),n&&t.bufferData(r,e,t.STATIC_DRAW)),i}function dt(e,i,n=e.indices){if(0==e.indices.length)return;let r=i!=xe;!function(e,i){let n=i==xe;t.useProgram(i),t.enableVertexAttribArray(Tt),n&&t.enableVertexAttribArray(It);let r=!n&&l.length>0;r&&t.enableVertexAttribArray(yt);t.enableVertexAttribArray(At),i.projViewMatUniform=t.getUniformLocation(i,"projViewMat"),i.viewMatUniform=t.getUniformLocation(i,"viewMat"),i.normMatUniform=t.getUniformLocation(i,"normMat"),(i==we||i==Me)&&t.enableVertexAttribArray(Et);if(r)for(let t=0;t<l.length;++t)l[t].setUniform(i,t);for(let t=0;t<e.materials.length;++t)e.materials[t].setUniform(i,t);t.uniformMatrix4fv(i.projViewMatUniform,!1,E),t.uniformMatrix4fv(i.viewMatUniform,!1,A),t.uniformMatrix3fv(i.normMatUniform,!1,I)}(e,i),null!=W&&(t.activeTexture(t.TEXTURE0),t.bindTexture(t.TEXTURE_2D,j),t.uniform1i(t.getUniformLocation(i,"reflBRDFSampler"),0),t.activeTexture(t.TEXTURE1),t.bindTexture(t.TEXTURE_2D,W),t.uniform1i(t.getUniformLocation(i,"diffuseSampler"),1),t.activeTexture(t.TEXTURE2),t.bindTexture(t.TEXTURE_2D,G),t.uniform1i(t.getUniformLocation(i,"reflImgSampler"),2));let s=U||e.partial||!e.rendered;e.verticesBuffer=ct(new Float32Array(e.vertices),e.verticesBuffer,s),t.vertexAttribPointer(Tt,3,t.FLOAT,!1,r?24:16,0),r?l.length>0&&t.vertexAttribPointer(yt,3,t.FLOAT,!1,24,12):t.vertexAttribPointer(It,1,t.FLOAT,!1,16,12),e.materialsBuffer=ct(new Int16Array(e.materialIndices),e.materialsBuffer,s),t.vertexAttribPointer(At,1,t.SHORT,!1,2,0),i!=we&&i!=Me||(e.colorsBuffer=ct(new Float32Array(e.colors),e.colorsBuffer,s),t.vertexAttribPointer(Et,4,t.FLOAT,!0,0,0)),e.indicesBuffer=ct($?new Uint32Array(n):new Uint16Array(n),e.indicesBuffer,s,t.ELEMENT_ARRAY_BUFFER),e.rendered=!0,t.drawElements(r?V?t.LINES:e.type:t.POINTS,n.length,$?t.UNSIGNED_INT:t.UNSIGNED_SHORT,0)}class mt{constructor(t){this.type=t||q,this.verticesBuffer=0,this.materialsBuffer=0,this.colorsBuffer=0,this.indicesBuffer=0,this.rendered=!1,this.partial=!1,this.clear()}clear(){this.vertices=[],this.materialIndices=[],this.colors=[],this.indices=[],this.nvertices=0,this.materials=[],this.materialTable=[]}vertex(t,e){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.materialIndices.push(it),this.nvertices++}Vertex(t,e,i=[0,0,0,0]){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.materialIndices.push(it),this.colors.push(i[0]),this.colors.push(i[1]),this.colors.push(i[2]),this.colors.push(i[3]),this.nvertices++}vertex0(t,e){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e),this.materialIndices.push(it),this.nvertices++}iVertex(t,e,i,n=[0,0,0,0]){let r=6*t;this.vertices[r]=e[0],this.vertices[r+1]=e[1],this.vertices[r+2]=e[2],this.vertices[r+3]=i[0],this.vertices[r+4]=i[1],this.vertices[r+5]=i[2],this.materialIndices[t]=it;let s=4*t;this.colors[s]=n[0],this.colors[s+1]=n[1],this.colors[s+2]=n[2],this.colors[s+3]=n[3],this.indices.push(t)}append(t){ft(this.vertices,t.vertices),ft(this.materialIndices,t.materialIndices),ft(this.colors,t.colors),function(t,e,i){let n=t.length,r=e.length;t.length+=e.length;for(let s=0;s<r;++s)t[n+s]=e[s]+i}(this.indices,t.indices,this.nvertices),this.nvertices+=t.nvertices}}function ft(t,e){let i=t.length,n=e.length;t.length+=n;for(let r=0;r<n;++r)t[i+r]=e[r]}class ut{constructor(){this.data=new mt,this.Onscreen=!1,this.m=[]}offscreen(t){let e=E,i=t[0],n=i[0],r=i[1],s=i[2],a=1/(e[3]*n+e[7]*r+e[11]*s+e[15]);this.x=this.X=(e[0]*n+e[4]*r+e[8]*s+e[12])*a,this.y=this.Y=(e[1]*n+e[5]*r+e[9]*s+e[13])*a;for(let i=1,n=t.length;i<n;++i){let n=t[i],r=n[0],s=n[1],a=n[2],o=1/(e[3]*r+e[7]*s+e[11]*a+e[15]),h=(e[0]*r+e[4]*s+e[8]*a+e[12])*o,l=(e[1]*r+e[5]*s+e[9]*a+e[13])*o;h<this.x?this.x=h:h>this.X&&(this.X=h),l<this.y?this.y=l:l>this.Y&&(this.Y=l)}return(this.X<-1.01||this.x>1.01||this.Y<-1.01||this.y>1.01)&&(this.Onscreen=!1,!0)}T(t){let e=this.c[0],i=this.c[1],n=this.c[2],r=t[0]-e,s=t[1]-i,a=t[2]-n;return[r*I[0]+s*I[3]+a*I[6]+e,r*I[1]+s*I[4]+a*I[7]+i,r*I[2]+s*I[5]+a*I[8]+n]}Tcorners(t,e){return[this.T(t),this.T([t[0],t[1],e[2]]),this.T([t[0],e[1],t[2]]),this.T([t[0],e[1],e[2]]),this.T([e[0],t[1],t[2]]),this.T([e[0],t[1],e[2]]),this.T([e[0],e[1],t[2]]),this.T(e)]}setMaterial(t,e){null==t.materialTable[this.MaterialIndex]&&(t.materials.length>=m&&(t.partial=!0,e()),t.materialTable[this.MaterialIndex]=t.materials.length,t.materials.push(c[this.MaterialIndex])),it=t.materialTable[this.MaterialIndex]}render(){let t;var e,i;if(this.setMaterialIndex(),0==this.CenterIndex?(e=this.Min,i=this.Max,t=[e,[e[0],e[1],i[2]],[e[0],i[1],e[2]],[e[0],i[1],i[2]],[i[0],e[1],e[2]],[i[0],e[1],i[2]],[i[0],i[1],e[2]],i]):(this.c=o.Centers[this.CenterIndex-1],t=this.Tcorners(this.Min,this.Max)),this.offscreen(t))return this.data.clear(),void this.notRendered();let n,r=this.controlpoints;if(0==this.CenterIndex){if(!U&&this.Onscreen)return void this.append();n=r}else{let t=r.length;n=Array(t);for(let e=0;e<t;++e)n[e]=this.T(r[e])}let s=o.orthographic?1:this.Min[2]/o.maxBound[2],a=.75*Math.hypot(s*(S.xmax-S.xmin),s*(S.ymax-S.ymin))/b;this.res2=a*a,this.Epsilon=.1*a,this.data.clear(),this.notRendered(),this.Onscreen=!0,this.process(n)}}function pt(t,e){let i=t[0],n=t.length;for(let r=1;r<n;++r)i=e(i,t[r]);return i}class vt extends ut{constructor(t,e,i,n,r,s){super(),this.controlpoints=t,this.CenterIndex=e,this.MaterialIndex=i,this.color=n;let a=t.length;if(n){let t=n[0][3]+n[1][3]+n[2][3];this.transparent=16==a||4==a?t+n[3][3]<1020:t<765}else this.transparent=c[i].diffuse[3]<1;this.vertex=this.transparent?this.data.Vertex.bind(this.data):this.data.vertex.bind(this.data);let o=this.L2norm2(this.controlpoints),h=Math.sqrt(1e3*Number.EPSILON*o);this.epsilon=o*Number.EPSILON,this.Min=r||this.Bounds(this.controlpoints,Math.min,h),this.Max=s||this.Bounds(this.controlpoints,Math.max,h)}setMaterialIndex(){this.transparent?this.setMaterial(tt,Ie):this.color?this.setMaterial(J,Ae):this.setMaterial(Q,ye)}cornerbound(t,e){let i=e(t[0],t[3]);return i=e(i,t[12]),e(i,t[15])}controlbound(t,e){let i=e(t[1],t[2]);return i=e(i,t[4]),i=e(i,t[5]),i=e(i,t[6]),i=e(i,t[7]),i=e(i,t[8]),i=e(i,t[9]),i=e(i,t[10]),i=e(i,t[11]),i=e(i,t[13]),e(i,t[14])}bound(t,e,i,n,r){if(i=e(i,this.cornerbound(t,e)),e(-1,1)*(i-this.controlbound(t,e))>=-n||0==r)return i;--r,n*=2;let s=new Nt(t[0],t[1],t[2],t[3]),a=new Nt(t[4],t[5],t[6],t[7]),o=new Nt(t[8],t[9],t[10],t[11]),h=new Nt(t[12],t[13],t[14],t[15]),l=new Nt(t[0],t[4],t[8],t[12]),c=new Nt(s.m0,a.m0,o.m0,h.m0),d=new Nt(s.m3,a.m3,o.m3,h.m3),m=new Nt(s.m5,a.m5,o.m5,h.m5),f=new Nt(s.m4,a.m4,o.m4,h.m4),u=new Nt(s.m2,a.m2,o.m2,h.m2),p=new Nt(t[3],t[7],t[11],t[15]),v=[t[0],s.m0,s.m3,s.m5,l.m0,c.m0,d.m0,m.m0,l.m3,c.m3,d.m3,m.m3,l.m5,c.m5,d.m5,m.m5];i=this.bound(v,e,i,n,r);let x=[l.m5,c.m5,d.m5,m.m5,l.m4,c.m4,d.m4,m.m4,l.m2,c.m2,d.m2,m.m2,t[12],h.m0,h.m3,h.m5];i=this.bound(x,e,i,n,r);let g=[m.m5,f.m5,u.m5,p.m5,m.m4,f.m4,u.m4,p.m4,m.m2,f.m2,u.m2,p.m2,h.m5,h.m4,h.m2,t[15]];i=this.bound(g,e,i,n,r);let w=[s.m5,s.m4,s.m2,t[3],m.m0,f.m0,u.m0,p.m0,m.m3,f.m3,u.m3,p.m3,m.m5,f.m5,u.m5,p.m5];return this.bound(w,e,i,n,r)}cornerboundtri(t,e){let i=e(t[0],t[6]);return e(i,t[9])}controlboundtri(t,e){let i=e(t[1],t[2]);return i=e(i,t[3]),i=e(i,t[4]),i=e(i,t[5]),i=e(i,t[7]),e(i,t[8])}boundtri(t,e,i,n,r){if(i=e(i,this.cornerboundtri(t,e)),e(-1,1)*(i-this.controlboundtri(t,e))>=-n||0==r)return i;--r,n*=2;let s=new _t(t),a=[s.l003,s.l102,s.l012,s.l201,s.l111,s.l021,s.l300,s.l210,s.l120,s.l030];i=this.boundtri(a,e,i,n,r);let o=[s.l300,s.r102,s.r012,s.r201,s.r111,s.r021,s.r300,s.r210,s.r120,s.r030];i=this.boundtri(o,e,i,n,r);let h=[s.l030,s.u102,s.u012,s.u201,s.u111,s.u021,s.r030,s.u210,s.u120,s.u030];i=this.boundtri(h,e,i,n,r);let l=[s.r030,s.u201,s.r021,s.u102,s.c111,s.r012,s.l030,s.l120,s.l210,s.l300];return this.boundtri(l,e,i,n,r)}Bounds(t,e,i){let n=Array(3),r=t.length,s=Array(r);for(let a=0;a<3;++a){for(let e=0;e<r;++e)s[e]=t[e][a];n[a]=16==r?this.bound(s,e,s[0],i,p):10==r?this.boundtri(s,e,s[0],i,p):pt(s,e)}return[n[0],n[1],n[2]]}L2norm2(t){let e=t[0],i=0,n=t.length;for(let r=1;r<n;++r)i=Math.max(i,St([t[r][0]-e[0],t[r][1]-e[1],t[r][2]-e[2]]));return i}processTriangle(t){let e=t[0],i=t[1],n=t[2],r=Pt(Vt([i[0]-e[0],i[1]-e[1],i[2]-e[2]],[n[0]-e[0],n[1]-e[1],n[2]-e[2]]));if(!this.offscreen([e,i,n])){let t,s,a;this.color?(t=this.data.Vertex(e,r,this.color[0]),s=this.data.Vertex(i,r,this.color[1]),a=this.data.Vertex(n,r,this.color[2])):(t=this.vertex(e,r),s=this.vertex(i,r),a=this.vertex(n,r)),0==V?(this.data.indices.push(t),this.data.indices.push(s),this.data.indices.push(a)):(this.data.indices.push(t),this.data.indices.push(s),this.data.indices.push(s),this.data.indices.push(a),this.data.indices.push(a),this.data.indices.push(t)),this.append()}}processQuad(t){let e=t[0],i=t[1],n=t[2],r=t[3],s=Vt([i[0]-e[0],i[1]-e[1],i[2]-e[2]],[n[0]-i[0],n[1]-i[1],n[2]-i[2]]),a=Vt([n[0]-r[0],n[1]-r[1],n[2]-r[2]],[r[0]-e[0],r[1]-e[1],r[2]-e[2]]),o=Pt([s[0]+a[0],s[1]+a[1],s[2]+a[2]]);if(!this.offscreen([e,i,n,r])){let t,s,a,h;this.color?(t=this.data.Vertex(e,o,this.color[0]),s=this.data.Vertex(i,o,this.color[1]),a=this.data.Vertex(n,o,this.color[2]),h=this.data.Vertex(r,o,this.color[3])):(t=this.vertex(e,o),s=this.vertex(i,o),a=this.vertex(n,o),h=this.vertex(r,o)),0==V?(this.data.indices.push(t),this.data.indices.push(s),this.data.indices.push(a),this.data.indices.push(t),this.data.indices.push(a),this.data.indices.push(h)):(this.data.indices.push(t),this.data.indices.push(s),this.data.indices.push(s),this.data.indices.push(a),this.data.indices.push(a),this.data.indices.push(h),this.data.indices.push(h),this.data.indices.push(t)),this.append()}}curve(t,e,i,n,r){new wt([t[e],t[i],t[n],t[r]],0,it,this.Min,this.Max).render()}process(t){if(this.transparent&&1!=V&&(it=this.color?-1-it:1+it),10==t.length)return this.process3(t);if(3==t.length)return this.processTriangle(t);if(4==t.length)return this.processQuad(t);if(1==V)return this.curve(t,0,4,8,12),this.curve(t,12,13,14,15),this.curve(t,15,11,7,3),void this.curve(t,3,2,1,0);let e=t[0],i=t[3],n=t[12],r=t[15],s=this.normal(i,t[2],t[1],e,t[4],t[8],n);St(s)<this.epsilon&&(s=this.normal(i,t[2],t[1],e,t[13],t[14],r),St(s)<this.epsilon&&(s=this.normal(r,t[11],t[7],i,t[4],t[8],n)));let a=this.normal(e,t[4],t[8],n,t[13],t[14],r);St(a)<this.epsilon&&(a=this.normal(e,t[4],t[8],n,t[11],t[7],i),St(a)<this.epsilon&&(a=this.normal(i,t[2],t[1],e,t[13],t[14],r)));let o=this.normal(n,t[13],t[14],r,t[11],t[7],i);St(o)<this.epsilon&&(o=this.normal(n,t[13],t[14],r,t[2],t[1],e),St(o)<this.epsilon&&(o=this.normal(e,t[4],t[8],n,t[11],t[7],i)));let h=this.normal(r,t[11],t[7],i,t[2],t[1],e);if(St(h)<this.epsilon&&(h=this.normal(r,t[11],t[7],i,t[4],t[8],n),St(h)<this.epsilon&&(h=this.normal(n,t[13],t[14],r,t[2],t[1],e))),this.color){let l=this.color[0],c=this.color[1],d=this.color[2],m=this.color[3],f=this.data.Vertex(e,s,l),u=this.data.Vertex(n,a,c),p=this.data.Vertex(r,o,d),v=this.data.Vertex(i,h,m);this.Render(t,f,u,p,v,e,n,r,i,!1,!1,!1,!1,l,c,d,m)}else{let l=this.vertex(e,s),c=this.vertex(n,a),d=this.vertex(r,o),m=this.vertex(i,h);this.Render(t,l,c,d,m,e,n,r,i,!1,!1,!1,!1)}this.data.indices.length>0&&this.append()}append(){this.transparent?tt.append(this.data):this.color?J.append(this.data):Q.append(this.data)}notRendered(){this.transparent?tt.rendered=!1:this.color?J.rendered=!1:Q.rendered=!1}Render(t,e,i,n,r,s,a,o,h,l,c,d,m,f,u,p,v){let x=this.Distance(t);if(x[0]<this.res2&&x[1]<this.res2)this.offscreen([s,a,o])||(0==V?(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(n)):(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(i),this.data.indices.push(n))),this.offscreen([s,o,h])||(0==V?(this.data.indices.push(e),this.data.indices.push(n),this.data.indices.push(r)):(this.data.indices.push(n),this.data.indices.push(r),this.data.indices.push(r),this.data.indices.push(e)));else{if(this.offscreen(t))return;let g=t[0],w=t[3],M=t[12],b=t[15];if(x[0]<this.res2){let x=new Ot(g,t[1],t[2],w),R=new Ot(t[4],t[5],t[6],t[7]),T=new Ot(t[8],t[9],t[10],t[11]),y=new Ot(M,t[13],t[14],b),A=[g,x.m0,x.m3,x.m5,t[4],R.m0,R.m3,R.m5,t[8],T.m0,T.m3,T.m5,M,y.m0,y.m3,y.m5],E=[x.m5,x.m4,x.m2,w,R.m5,R.m4,R.m2,t[7],T.m5,T.m4,T.m2,t[11],y.m5,y.m4,y.m2,b],I=this.normal(A[12],A[13],A[14],A[15],A[11],A[7],A[3]);St(I)<=this.epsilon&&(I=this.normal(A[12],A[13],A[14],A[15],A[2],A[1],A[0]),St(I)<=this.epsilon&&(I=this.normal(A[0],A[4],A[8],A[12],A[11],A[7],A[3])));let L=this.normal(E[3],E[2],E[1],E[0],E[4],E[8],E[12]);St(L)<=this.epsilon&&(L=this.normal(E[3],E[2],E[1],E[0],E[13],E[14],E[15]),St(L)<=this.epsilon&&(L=this.normal(E[15],E[11],E[7],E[3],E[4],E[8],E[12])));let N=this.Epsilon,O=[.5*(a[0]+o[0]),.5*(a[1]+o[1]),.5*(a[2]+o[2])];if(!c)if(c=zt(M,t[13],t[14],b)<this.res2){let t=Pt(this.differential(E[12],E[8],E[4],E[0]));O=[O[0]-N*t[0],O[1]-N*t[1],O[2]-N*t[2]]}else O=A[15];let _=[.5*(h[0]+s[0]),.5*(h[1]+s[1]),.5*(h[2]+s[2])];if(!m)if(m=zt(g,t[1],t[2],w)<this.res2){let t=Pt(this.differential(A[3],A[7],A[11],A[15]));_=[_[0]-N*t[0],_[1]-N*t[1],_[2]-N*t[2]]}else _=E[0];if(f){let t=Array(4),x=Array(4);for(let e=0;e<4;++e)t[e]=.5*(u[e]+p[e]),x[e]=.5*(v[e]+f[e]);let g=this.data.Vertex(O,I,t),w=this.data.Vertex(_,L,x);this.Render(A,e,i,g,w,s,a,O,_,l,c,!1,m,f,u,t,x),this.Render(E,w,g,n,r,_,O,o,h,!1,c,d,m,x,t,p,v)}else{let t=this.vertex(O,I),f=this.vertex(_,L);this.Render(A,e,i,t,f,s,a,O,_,l,c,!1,m),this.Render(E,f,t,n,r,_,O,o,h,!1,c,d,m)}return}if(x[1]<this.res2){let x=new Ot(g,t[4],t[8],M),R=new Ot(t[1],t[5],t[9],t[13]),T=new Ot(t[2],t[6],t[10],t[14]),y=new Ot(w,t[7],t[11],b),A=[g,t[1],t[2],w,x.m0,R.m0,T.m0,y.m0,x.m3,R.m3,T.m3,y.m3,x.m5,R.m5,T.m5,y.m5],E=[x.m5,R.m5,T.m5,y.m5,x.m4,R.m4,T.m4,y.m4,x.m2,R.m2,T.m2,y.m2,M,t[13],t[14],b],I=this.normal(A[0],A[4],A[8],A[12],A[13],A[14],A[15]);St(I)<=this.epsilon&&(I=this.normal(A[0],A[4],A[8],A[12],A[11],A[7],A[3]),St(I)<=this.epsilon&&(I=this.normal(A[3],A[2],A[1],A[0],A[13],A[14],A[15])));let L=this.normal(E[15],E[11],E[7],E[3],E[2],E[1],E[0]);St(L)<=this.epsilon&&(L=this.normal(E[15],E[11],E[7],E[3],E[4],E[8],E[12]),St(L)<=this.epsilon&&(L=this.normal(E[12],E[13],E[14],E[15],E[2],E[1],E[0])));let N=this.Epsilon,O=[.5*(s[0]+a[0]),.5*(s[1]+a[1]),.5*(s[2]+a[2])];if(!l)if(l=zt(g,t[4],t[8],M)<this.res2){let t=Pt(this.differential(E[0],E[1],E[2],E[3]));O=[O[0]-N*t[0],O[1]-N*t[1],O[2]-N*t[2]]}else O=A[12];let _=[.5*(o[0]+h[0]),.5*(o[1]+h[1]),.5*(o[2]+h[2])];if(!d)if(d=zt(b,t[11],t[7],w)<this.res2){let t=Pt(this.differential(A[15],A[14],A[13],A[12]));_=[_[0]-N*t[0],_[1]-N*t[1],_[2]-N*t[2]]}else _=E[3];if(f){let t=Array(4),x=Array(4);for(let e=0;e<4;++e)t[e]=.5*(f[e]+u[e]),x[e]=.5*(p[e]+v[e]);let g=this.data.Vertex(O,I,t),w=this.data.Vertex(_,L,x);this.Render(A,e,g,w,r,s,O,_,h,l,!1,d,m,f,t,x,v),this.Render(E,g,i,n,w,O,a,o,_,l,c,d,!1,t,u,p,x)}else{let t=this.vertex(O,I),f=this.vertex(_,L);this.Render(A,e,t,f,r,s,O,_,h,l,!1,d,m),this.Render(E,t,i,n,f,O,a,o,_,l,c,d,!1)}return}let R=new Ot(g,t[1],t[2],w),T=new Ot(t[4],t[5],t[6],t[7]),y=new Ot(t[8],t[9],t[10],t[11]),A=new Ot(M,t[13],t[14],b),E=new Ot(g,t[4],t[8],M),I=new Ot(R.m0,T.m0,y.m0,A.m0),L=new Ot(R.m3,T.m3,y.m3,A.m3),N=new Ot(R.m5,T.m5,y.m5,A.m5),O=new Ot(R.m4,T.m4,y.m4,A.m4),_=new Ot(R.m2,T.m2,y.m2,A.m2),P=new Ot(w,t[7],t[11],b),S=[g,R.m0,R.m3,R.m5,E.m0,I.m0,L.m0,N.m0,E.m3,I.m3,L.m3,N.m3,E.m5,I.m5,L.m5,N.m5],U=[E.m5,I.m5,L.m5,N.m5,E.m4,I.m4,L.m4,N.m4,E.m2,I.m2,L.m2,N.m2,M,A.m0,A.m3,A.m5],V=[N.m5,O.m5,_.m5,P.m5,N.m4,O.m4,_.m4,P.m4,N.m2,O.m2,_.m2,P.m2,A.m5,A.m4,A.m2,b],B=[R.m5,R.m4,R.m2,w,N.m0,O.m0,_.m0,P.m0,N.m3,O.m3,_.m3,P.m3,N.m5,O.m5,_.m5,P.m5],D=S[15],C=this.normal(S[0],S[4],S[8],S[12],S[13],S[14],S[15]);St(C)<this.epsilon&&(C=this.normal(S[0],S[4],S[8],S[12],S[11],S[7],S[3]),St(C)<this.epsilon&&(C=this.normal(S[3],S[2],S[1],S[0],S[13],S[14],S[15])));let F=this.normal(U[12],U[13],U[14],U[15],U[11],U[7],U[3]);St(F)<this.epsilon&&(F=this.normal(U[12],U[13],U[14],U[15],U[2],U[1],U[0]),St(F)<this.epsilon&&(F=this.normal(U[0],U[4],U[8],U[12],U[11],U[7],U[3])));let z=this.normal(V[15],V[11],V[7],V[3],V[2],V[1],V[0]);St(z)<this.epsilon&&(z=this.normal(V[15],V[11],V[7],V[3],V[4],V[8],V[12]),St(z)<this.epsilon&&(z=this.normal(V[12],V[13],V[14],V[15],V[2],V[1],V[0])));let H=this.normal(B[3],B[2],B[1],B[0],B[4],B[8],B[12]);St(H)<this.epsilon&&(H=this.normal(B[3],B[2],B[1],B[0],B[13],B[14],B[15]),St(H)<this.epsilon&&(H=this.normal(B[15],B[11],B[7],B[3],B[4],B[8],B[12])));let X=this.normal(V[3],V[2],V[1],D,V[4],V[8],V[12]),G=this.Epsilon,W=[.5*(s[0]+a[0]),.5*(s[1]+a[1]),.5*(s[2]+a[2])];if(!l)if(l=zt(g,t[4],t[8],M)<this.res2){let t=Pt(this.differential(U[0],U[1],U[2],U[3]));W=[W[0]-G*t[0],W[1]-G*t[1],W[2]-G*t[2]]}else W=S[12];let j=[.5*(a[0]+o[0]),.5*(a[1]+o[1]),.5*(a[2]+o[2])];if(!c)if(c=zt(M,t[13],t[14],b)<this.res2){let t=Pt(this.differential(V[12],V[8],V[4],V[0]));j=[j[0]-G*t[0],j[1]-G*t[1],j[2]-G*t[2]]}else j=U[15];let k=[.5*(o[0]+h[0]),.5*(o[1]+h[1]),.5*(o[2]+h[2])];if(!d)if(d=zt(b,t[11],t[7],w)<this.res2){let t=Pt(this.differential(B[15],B[14],B[13],B[12]));k=[k[0]-G*t[0],k[1]-G*t[1],k[2]-G*t[2]]}else k=V[3];let Y=[.5*(h[0]+s[0]),.5*(h[1]+s[1]),.5*(h[2]+s[2])];if(!m)if(m=zt(g,t[1],t[2],w)<this.res2){let t=Pt(this.differential(S[3],S[7],S[11],S[15]));Y=[Y[0]-G*t[0],Y[1]-G*t[1],Y[2]-G*t[2]]}else Y=B[0];if(f){let t=Array(4),x=Array(4),g=Array(4),w=Array(4),M=Array(4);for(let e=0;e<4;++e)t[e]=.5*(f[e]+u[e]),x[e]=.5*(u[e]+p[e]),g[e]=.5*(p[e]+v[e]),w[e]=.5*(v[e]+f[e]),M[e]=.5*(t[e]+g[e]);let b=this.data.Vertex(W,C,t),R=this.data.Vertex(j,F,x),T=this.data.Vertex(k,z,g),y=this.data.Vertex(Y,H,w),A=this.data.Vertex(D,X,M);this.Render(S,e,b,A,y,s,W,D,Y,l,!1,!1,m,f,t,M,w),this.Render(U,b,i,R,A,W,a,j,D,l,c,!1,!1,t,u,x,M),this.Render(V,A,R,n,T,D,j,o,k,!1,c,d,!1,M,x,p,g),this.Render(B,y,A,T,r,Y,D,k,h,!1,!1,d,m,w,M,g,v)}else{let t=this.vertex(W,C),f=this.vertex(j,F),u=this.vertex(k,z),p=this.vertex(Y,H),v=this.vertex(D,X);this.Render(S,e,t,v,p,s,W,D,Y,l,!1,!1,m),this.Render(U,t,i,f,v,W,a,j,D,l,c,!1,!1),this.Render(V,v,f,n,u,D,j,o,k,!1,c,d,!1),this.Render(B,p,v,u,r,Y,D,k,h,!1,!1,d,m)}}}process3(t){if(1==V)return this.curve(t,0,1,3,6),this.curve(t,6,7,8,9),void this.curve(t,9,5,2,0);let e=t[0],i=t[6],n=t[9],r=this.normal(n,t[5],t[2],e,t[1],t[3],i),s=this.normal(e,t[1],t[3],i,t[7],t[8],n),a=this.normal(i,t[7],t[8],n,t[5],t[2],e);if(this.color){let o=this.color[0],h=this.color[1],l=this.color[2],c=this.data.Vertex(e,r,o),d=this.data.Vertex(i,s,h),m=this.data.Vertex(n,a,l);this.Render3(t,c,d,m,e,i,n,!1,!1,!1,o,h,l)}else{let o=this.vertex(e,r),h=this.vertex(i,s),l=this.vertex(n,a);this.Render3(t,o,h,l,e,i,n,!1,!1,!1)}this.data.indices.length>0&&this.append()}Render3(t,e,i,n,r,s,a,o,h,l,c,d,m){if(this.Distance3(t)<this.res2)this.offscreen([r,s,a])||(0==V?(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(n)):(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(i),this.data.indices.push(n),this.data.indices.push(n),this.data.indices.push(e)));else{if(this.offscreen(t))return;let f=t[0],u=t[1],p=t[2],v=t[3],x=t[4],g=t[5],w=t[6],M=t[7],b=t[8],R=t[9],T=[.5*(R[0]+g[0]),.5*(R[1]+g[1]),.5*(R[2]+g[2])],y=[.5*(R[0]+b[0]),.5*(R[1]+b[1]),.5*(R[2]+b[2])],A=[.5*(g[0]+p[0]),.5*(g[1]+p[1]),.5*(g[2]+p[2])],E=[.5*(b[0]+x[0]),.5*(b[1]+x[1]),.5*(b[2]+x[2])],I=[.5*(b[0]+M[0]),.5*(b[1]+M[1]),.5*(b[2]+M[2])],L=[.5*(p[0]+x[0]),.5*(p[1]+x[1]),.5*(p[2]+x[2])],N=[.5*(p[0]+f[0]),.5*(p[1]+f[1]),.5*(p[2]+f[2])],O=[.5*(x[0]+v[0]),.5*(x[1]+v[1]),.5*(x[2]+v[2])],_=[.5*(M[0]+w[0]),.5*(M[1]+w[1]),.5*(M[2]+w[2])],P=[.5*(f[0]+u[0]),.5*(f[1]+u[1]),.5*(f[2]+u[2])],S=[.5*(u[0]+v[0]),.5*(u[1]+v[1]),.5*(u[2]+v[2])],U=[.5*(v[0]+w[0]),.5*(v[1]+w[1]),.5*(v[2]+w[2])],V=[.5*(T[0]+A[0]),.5*(T[1]+A[1]),.5*(T[2]+A[2])],B=[.5*(y[0]+I[0]),.5*(y[1]+I[1]),.5*(y[2]+I[2])],D=[.5*(A[0]+N[0]),.5*(A[1]+N[1]),.5*(A[2]+N[2])],C=[.5*E[0]+.25*(x[0]+u[0]),.5*E[1]+.25*(x[1]+u[1]),.5*E[2]+.25*(x[2]+u[2])],F=[.5*(I[0]+_[0]),.5*(I[1]+_[1]),.5*(I[2]+_[2])],z=[.5*L[0]+.25*(x[0]+M[0]),.5*L[1]+.25*(x[1]+M[1]),.5*L[2]+.25*(x[2]+M[2])],H=[.25*(g[0]+x[0])+.5*O[0],.25*(g[1]+x[1])+.5*O[1],.25*(g[2]+x[2])+.5*O[2]],X=[.5*(P[0]+S[0]),.5*(P[1]+S[1]),.5*(P[2]+S[2])],G=[.5*(S[0]+U[0]),.5*(S[1]+U[1]),.5*(S[2]+U[2])],W=[.5*(z[0]+X[0]),.5*(z[1]+X[1]),.5*(z[2]+X[2])],j=[.5*(z[0]+G[0]),.5*(z[1]+G[1]),.5*(z[2]+G[2])],k=[.5*(X[0]+G[0]),.5*(X[1]+G[1]),.5*(X[2]+G[2])],Y=[.5*(H[0]+F[0]),.5*(H[1]+F[1]),.5*(H[2]+F[2])],$=[.5*(B[0]+H[0]),.5*(B[1]+H[1]),.5*(B[2]+H[2])],q=[.5*(B[0]+F[0]),.5*(B[1]+F[1]),.5*(B[2]+F[2])],K=[.5*(V[0]+C[0]),.5*(V[1]+C[1]),.5*(V[2]+C[2])],Z=[.5*(D[0]+C[0]),.5*(D[1]+C[1]),.5*(D[2]+C[2])],Q=[.5*(V[0]+D[0]),.5*(V[1]+D[1]),.5*(V[2]+D[2])],J=[f,P,N,X,[.5*(L[0]+P[0]),.5*(L[1]+P[1]),.5*(L[2]+P[2])],D,k,W,Z,Q],tt=[k,G,j,U,[.5*(O[0]+_[0]),.5*(O[1]+_[1]),.5*(O[2]+_[2])],Y,w,_,F,q],et=[Q,K,V,$,[.5*(T[0]+E[0]),.5*(T[1]+E[1]),.5*(T[2]+E[2])],T,q,B,y,R],it=[q,$,Y,K,[.25*(A[0]+I[0]+S[0]+x[0]),.25*(A[1]+I[1]+S[1]+x[1]),.25*(A[2]+I[2]+S[2]+x[2])],j,Q,Z,W,k],nt=this.normal(k,j,Y,q,$,K,Q),rt=this.normal(q,$,K,Q,Z,W,k),st=this.normal(Q,Z,W,k,j,Y,q),at=this.Epsilon,ot=[.5*(s[0]+a[0]),.5*(s[1]+a[1]),.5*(s[2]+a[2])];if(!o)if(o=zt(w,M,b,R)<this.res2){let t=Pt(this.sumdifferential(it[0],it[2],it[5],it[9],it[1],it[3],it[6]));ot=[ot[0]-at*t[0],ot[1]-at*t[1],ot[2]-at*t[2]]}else ot=q;let ht=[.5*(a[0]+r[0]),.5*(a[1]+r[1]),.5*(a[2]+r[2])];if(!h)if(h=zt(f,p,g,R)<this.res2){let t=Pt(this.sumdifferential(it[6],it[3],it[1],it[0],it[7],it[8],it[9]));ht=[ht[0]-at*t[0],ht[1]-at*t[1],ht[2]-at*t[2]]}else ht=Q;let lt=[.5*(r[0]+s[0]),.5*(r[1]+s[1]),.5*(r[2]+s[2])];if(!l)if(l=zt(f,u,v,w)<this.res2){let t=Pt(this.sumdifferential(it[9],it[8],it[7],it[6],it[5],it[2],it[0]));lt=[lt[0]-at*t[0],lt[1]-at*t[1],lt[2]-at*t[2]]}else lt=k;if(c){let t=Array(4),f=Array(4),u=Array(4);for(let e=0;e<4;++e)t[e]=.5*(d[e]+m[e]),f[e]=.5*(m[e]+c[e]),u[e]=.5*(c[e]+d[e]);let p=this.data.Vertex(ot,nt,t),v=this.data.Vertex(ht,rt,f),x=this.data.Vertex(lt,st,u);this.Render3(J,e,x,v,r,lt,ht,!1,h,l,c,u,f),this.Render3(tt,x,i,p,lt,s,ot,o,!1,l,u,d,t),this.Render3(et,v,p,n,ht,ot,a,o,h,!1,f,t,m),this.Render3(it,p,v,x,ot,ht,lt,!1,!1,!1,t,f,u)}else{let t=this.vertex(ot,nt),c=this.vertex(ht,rt),d=this.vertex(lt,st);this.Render3(J,e,d,c,r,lt,ht,!1,h,l),this.Render3(tt,d,i,t,lt,s,ot,o,!1,l),this.Render3(et,c,t,n,ht,ot,a,o,h,!1),this.Render3(it,t,c,d,ot,ht,lt,!1,!1,!1)}}}Distance(t){let e=t[0],i=t[3],n=t[12],r=t[15],s=Ht(e,n,i,r);s=Math.max(zt(e,t[4],t[8],n)),s=Math.max(s,zt(t[1],t[5],t[9],t[13])),s=Math.max(s,zt(i,t[7],t[11],r)),s=Math.max(s,zt(t[2],t[6],t[10],t[14]));let a=Ht(e,i,n,r);return a=Math.max(a,zt(e,t[1],t[2],i)),a=Math.max(a,zt(t[4],t[5],t[6],t[7])),a=Math.max(a,zt(t[8],t[9],t[10],t[11])),a=Math.max(a,zt(n,t[13],t[14],r)),[s,a]}Distance3(t){let e=t[0],i=t[4],n=t[6],r=t[9],s=St([(e[0]+n[0]+r[0])*(1/3)-i[0],(e[1]+n[1]+r[1])*(1/3)-i[1],(e[2]+n[2]+r[2])*(1/3)-i[2]]);return s=Math.max(s,zt(e,t[1],t[3],n)),s=Math.max(s,zt(e,t[2],t[5],r)),Math.max(s,zt(n,t[7],t[8],r))}differential(t,e,i,n){let r=[3*(e[0]-t[0]),3*(e[1]-t[1]),3*(e[2]-t[2])];return St(r)>this.epsilon?r:(r=Ct(t,e,i),St(r)>this.epsilon?r:Ft(t,e,i,n))}sumdifferential(t,e,i,n,r,s,a){let o=this.differential(t,e,i,n),h=this.differential(t,r,s,a);return[o[0]+h[0],o[1]+h[1],o[2]+h[2]]}normal(t,e,i,n,r,s,a){let o=3*(r[0]-n[0]),h=3*(r[1]-n[1]),l=3*(r[2]-n[2]),c=3*(i[0]-n[0]),d=3*(i[1]-n[1]),m=3*(i[2]-n[2]),f=[h*m-l*d,l*c-o*m,o*d-h*c];if(St(f)>this.epsilon)return f;let u=[c,d,m],p=[o,h,l],v=Ct(n,i,e),x=Ct(n,r,s),g=Vt(x,u),w=Vt(p,v);if(f=[g[0]+w[0],g[1]+w[1],g[2]+w[2]],St(f)>this.epsilon)return f;let M=Ft(n,i,e,t),b=Ft(n,r,s,a);g=Vt(p,M),w=Vt(b,u);let R=Vt(x,v);return f=[g[0]+w[0]+R[0],g[1]+w[1]+R[1],g[2]+w[2]+R[2]],St(f)>this.epsilon?f:(g=Vt(b,v),w=Vt(x,M),f=[g[0]+w[0],g[1]+w[1],g[2]+w[2]],St(f)>this.epsilon?f:Vt(b,M))}}function xt(t){return 0<=t&&t<=1}class gt{constructor(t,e,i){const n=1e3*Number.EPSILON,r=n*n;if(Math.abs(t)<=n*Math.abs(e)+r*Math.abs(i))Math.abs(e)>n*Math.abs(i)?(this.roots=1,this.t1=-i/e):0==i?(this.roots=1,this.t1=0):this.roots=0;else{let r=.5*e/t,s=e*r;if(Math.abs(s)<=n*Math.abs(i)){let e=-i/t;e>=0?(this.roots=2,this.t2=Math.sqrt(e),this.t1=-this.t2):this.roots=0}else{let t=-2*i/s;if(t>-1){this.roots=2;let e=r*function(t){return t/(Math.sqrt(1+t)+1)}(t),i=-e-2*r;i<=e?(this.t1=i,this.t2=e):(this.t1=e,this.t2=i)}else-1==t?(this.roots=1,this.t1=this.t2=-r):this.roots=0}}}}class wt extends ut{constructor(t,e,i,n,r){if(super(),this.controlpoints=t,this.CenterIndex=e,this.MaterialIndex=i,n&&r)this.Min=n,this.Max=r;else{let t=this.Bounds(this.controlpoints);this.Min=t[0],this.Max=t[1]}}Bounds(t){let e=Array(3),i=Array(3),n=t.length,r=Array(n);for(let h=0;h<3;++h){for(let e=0;e<n;++e)r[e]=t[e][h];let l,c;if(l=c=r[0],4==n){l=Math.min(l,r[3]),c=Math.max(c,r[3]);let t=(s=r[0],a=r[1],o=r[2],[r[3]-s+3*(a-o),2*(s+o)-4*a,a-s]),e=new gt(t[0],t[1],t[2]);if(0!=e.roots&&xt(e.t1)){let t=Bt(r[0],r[1],r[2],r[3],e.t1);l=Math.min(l,t),c=Math.max(c,t)}if(2==e.roots&&xt(e.t2)){let t=Bt(r[0],r[1],r[2],r[3],e.t2);l=Math.min(l,t),c=Math.max(c,t)}}else{let t=r[1];l=Math.min(l,t),c=Math.max(c,t)}e[h]=l,i[h]=c}var s,a,o;return[[e[0],e[1],e[2]],[i[0],i[1],i[2]]]}setMaterialIndex(){this.setMaterial(Z,Te)}processLine(t){let e=t[0],i=t[1];if(!this.offscreen([e,i])){let t=[0,0,1];this.data.indices.push(this.data.vertex(e,t)),this.data.indices.push(this.data.vertex(i,t)),this.append()}}process(t){if(2==t.length)return this.processLine(t);let e=t[0],i=t[1],n=t[2],r=t[3],s=this.normal(Dt(e,i),Ct(e,i,n)),a=this.normal(Dt(n,r),Ct(r,n,i)),o=this.data.vertex(e,s),h=this.data.vertex(r,a);this.Render(t,o,h),this.data.indices.length>0&&this.append()}append(){Z.append(this.data)}notRendered(){Z.rendered=!1}Render(t,e,i){let n=t[0],r=t[1],s=t[2],a=t[3];if(zt(n,r,s,a)<this.res2)this.offscreen([n,a])||(this.data.indices.push(e),this.data.indices.push(i));else{if(this.offscreen(t))return;let o=[.5*(n[0]+r[0]),.5*(n[1]+r[1]),.5*(n[2]+r[2])],h=[.5*(r[0]+s[0]),.5*(r[1]+s[1]),.5*(r[2]+s[2])],l=[.5*(s[0]+a[0]),.5*(s[1]+a[1]),.5*(s[2]+a[2])],c=[.5*(o[0]+h[0]),.5*(o[1]+h[1]),.5*(o[2]+h[2])],d=[.5*(h[0]+l[0]),.5*(h[1]+l[1]),.5*(h[2]+l[2])],m=[.5*(c[0]+d[0]),.5*(c[1]+d[1]),.5*(c[2]+d[2])],f=[n,o,c,m],u=[m,d,l,a],p=this.normal(function(t,e,i,n){return[i[0]+n[0]-t[0]-e[0],i[1]+n[1]-t[1]-e[1],i[2]+n[2]-t[2]-e[2]]}(n,r,s,a),function(t,e,i,n){return[3*t[0]-5*e[0]+i[0]+n[0],3*t[1]-5*e[1]+i[1]+n[1],3*t[2]-5*e[2]+i[2]+n[2]]}(n,r,s,a)),v=this.data.vertex(m,p);this.Render(f,e,v),this.Render(u,v,i)}}normal(t,e){let i=Ut(t,t),n=Ut(t,e);return[i*e[0]-n*t[0],i*e[1]-n*t[1],i*e[2]-n*t[2]]}}class Mt extends ut{constructor(t,e,i){super(),this.controlpoint=t,this.width=e,this.CenterIndex=0,this.MaterialIndex=i,this.Min=t,this.Max=t}setMaterialIndex(){this.setMaterial(K,Re)}process(t){this.data.indices.push(this.data.vertex0(this.controlpoint,this.width)),this.append()}append(){K.append(this.data)}notRendered(){K.rendered=!1}}class bt extends ut{constructor(t,e){super(),this.CenterIndex=t,this.MaterialIndex=e,this.Min=this.Bounds(F,Math.min),this.Max=this.Bounds(F,Math.max),this.controlpoints=F,this.Normals=z,this.Colors=H,this.Indices=X,this.transparent=c[this.MaterialIndex].diffuse[3]<1}Bounds(t,e){let i=Array(3),n=t.length,r=Array(n);for(let s=0;s<3;++s){for(let e=0;e<n;++e)r[e]=t[e][s];i[s]=pt(r,e)}return[i[0],i[1],i[2]]}setMaterialIndex(){this.transparent?this.setMaterial(tt,Ie):this.setMaterial(et,Ee)}process(t){this.data.vertices=new Array(6*t.length),it=this.Colors.length>0?-1-it:1+it;for(let e=0,i=this.Indices.length;e<i;++e){let i=this.Indices[e],n=i[0],r=t[n[0]],s=t[n[1]],a=t[n[2]];if(!this.offscreen([r,s,a])){let t=i.length>1?i[1]:n;if(t&&0!=t.length||(t=n),this.Colors.length>0){let e=i.length>2?i[2]:n;e&&0!=e.length||(e=n);let o=this.Colors[e[0]],h=this.Colors[e[1]],l=this.Colors[e[2]];this.transparent|=o[3]+h[3]+l[3]<765,0==V?(this.data.iVertex(n[0],r,this.Normals[t[0]],o),this.data.iVertex(n[1],s,this.Normals[t[1]],h),this.data.iVertex(n[2],a,this.Normals[t[2]],l)):(this.data.iVertex(n[0],r,this.Normals[t[0]],o),this.data.iVertex(n[1],s,this.Normals[t[1]],h),this.data.iVertex(n[1],s,this.Normals[t[1]],h),this.data.iVertex(n[2],a,this.Normals[t[2]],l),this.data.iVertex(n[2],a,this.Normals[t[2]],l),this.data.iVertex(n[0],r,this.Normals[t[0]],o))}else 0==V?(this.data.iVertex(n[0],r,this.Normals[t[0]]),this.data.iVertex(n[1],s,this.Normals[t[1]]),this.data.iVertex(n[2],a,this.Normals[t[2]])):(this.data.iVertex(n[0],r,this.Normals[t[0]]),this.data.iVertex(n[1],s,this.Normals[t[1]]),this.data.iVertex(n[1],s,this.Normals[t[1]]),this.data.iVertex(n[2],a,this.Normals[t[2]]),this.data.iVertex(n[2],a,this.Normals[t[2]]),this.data.iVertex(n[0],r,this.Normals[t[0]]))}}this.data.nvertices=t.length,this.data.indices.length>0&&this.append()}append(){this.transparent?tt.append(this.data):et.append(this.data)}notRendered(){this.transparent?tt.rendered=!1:et.rendered=!1}}function Rt(){M=-Math.tan(.5*o.angleOfView)*o.maxBound[2],_.x=_.y=0,_.z=.5*(o.minBound[2]+o.maxBound[2]),x=v=o.zoom0,S.zmin=o.minBound[2],S.zmax=o.maxBound[2],P.x=P.y=0,Oe(),U=!0,Ne()}let Tt=0,yt=1,At=2,Et=3,It=4;function Lt(e=[]){let i=lt(t,vertex,t.VERTEX_SHADER,e),n=lt(t,fragment,t.FRAGMENT_SHADER,e),r=t.createProgram();return t.attachShader(r,i),t.attachShader(r,n),t.bindAttribLocation(r,Tt,"position"),t.bindAttribLocation(r,yt,"normal"),t.bindAttribLocation(r,At,"materialIndex"),t.bindAttribLocation(r,Et,"color"),t.bindAttribLocation(r,It,"width"),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialize shaders"),r}class Nt{constructor(t,e,i,n){this.m0=.5*(t+e);let r=.5*(e+i);this.m2=.5*(i+n),this.m3=.5*(this.m0+r),this.m4=.5*(r+this.m2),this.m5=.5*(this.m3+this.m4)}}class Ot{constructor(t,e,i,n){this.m0=[.5*(t[0]+e[0]),.5*(t[1]+e[1]),.5*(t[2]+e[2])];let r=.5*(e[0]+i[0]),s=.5*(e[1]+i[1]),a=.5*(e[2]+i[2]);this.m2=[.5*(i[0]+n[0]),.5*(i[1]+n[1]),.5*(i[2]+n[2])],this.m3=[.5*(this.m0[0]+r),.5*(this.m0[1]+s),.5*(this.m0[2]+a)],this.m4=[.5*(r+this.m2[0]),.5*(s+this.m2[1]),.5*(a+this.m2[2])],this.m5=[.5*(this.m3[0]+this.m4[0]),.5*(this.m3[1]+this.m4[1]),.5*(this.m3[2]+this.m4[2])]}}class _t{constructor(t){this.l003=t[0];let e=t[1],i=t[2],n=t[3],r=t[4],s=t[5];this.r300=t[6];let a=t[7],o=t[8];this.u030=t[9],this.u021=.5*(this.u030+s),this.u120=.5*(this.u030+o);let h=.5*(s+i),l=.5*(o+r),c=.5*(o+a),d=.5*(i+r);this.l012=.5*(i+this.l003);let m=.5*(r+n);this.r210=.5*(a+this.r300),this.l102=.5*(this.l003+e);let f=.5*(e+n);this.r201=.5*(n+this.r300),this.u012=.5*(this.u021+h),this.u210=.5*(this.u120+c),this.l021=.5*(h+this.l012);let u=.5*l+.25*(r+e);this.r120=.5*(c+this.r210);let p=.5*d+.25*(r+a),v=.25*(s+r)+.5*m;this.l201=.5*(this.l102+f),this.r102=.5*(f+this.r201),this.l210=.5*(p+this.l201),this.r012=.5*(p+this.r102),this.l300=.5*(this.l201+this.r102),this.r021=.5*(v+this.r120),this.u201=.5*(this.u210+v),this.r030=.5*(this.u210+this.r120),this.u102=.5*(this.u012+u),this.l120=.5*(this.l021+u),this.l030=.5*(this.u012+this.l021),this.l111=.5*(d+this.l102),this.r111=.5*(m+this.r210),this.u111=.5*(this.u021+l),this.c111=.25*(h+c+f+r)}}function Pt(t){let e=1/(Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2])||1);return[t[0]*e,t[1]*e,t[2]*e]}function St(t){return t[0]*t[0]+t[1]*t[1]+t[2]*t[2]}function Ut(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function Vt(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function Bt(t,e,i,n,r){let s=1-r,a=s*s;return a*s*t+r*(3*(a*e+r*s*i)+r*r*n)}function Dt(t,e){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function Ct(t,e,i){return[3*(t[0]+i[0])-6*e[0],3*(t[1]+i[1])-6*e[1],3*(t[2]+i[2])-6*e[2]]}function Ft(t,e,i,n){return[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])]}function zt(t,e,i,n){let r=[1/3*(n[0]-t[0]),1/3*(n[1]-t[1]),1/3*(n[2]-t[2])];return Math.max(St([e[0]-r[0]-t[0],e[1]-r[1]-t[1],e[2]-r[2]-t[2]]),St([n[0]-r[0]-i[0],n[1]-r[1]-i[1],n[2]-r[2]-i[2]]))}function Ht(t,e,i,n){let r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],s=[n[0]-i[0],n[1]-i[1],n[2]-i[2]];return Math.max(St(Vt(r,Pt(s))),St(Vt(s,Pt(r))))/9}function Xt(t){return[Math.min(t[0][0],t[1][0],t[2][0],t[3][0],t[4][0],t[5][0],t[6][0],t[7][0]),Math.min(t[0][1],t[1][1],t[2][1],t[3][1],t[4][1],t[5][1],t[6][1],t[7][1]),Math.min(t[0][2],t[1][2],t[2][2],t[3][2],t[4][2],t[5][2],t[6][2],t[7][2])]}function Gt(t){return[Math.max(t[0][0],t[1][0],t[2][0],t[3][0],t[4][0],t[5][0],t[6][0],t[7][0]),Math.max(t[0][1],t[1][1],t[2][1],t[3][1],t[4][1],t[5][1],t[6][1],t[7][1]),Math.max(t[0][2],t[1][2],t[2][2],t[3][2],t[4][2],t[5][2],t[6][2],t[7][2])]}function Wt(t){ae||oe(),B=!0,D=t.clientX,C=t.clientY}let jt,kt,Yt=!1;function $t(t){return Math.hypot(t[0].pageX-t[1].pageX,t[0].pageY-t[1].pageY)}function qt(t){t.preventDefault(),ae||oe();let e=t.targetTouches;ue=pe=Yt=!1,fe||(1!=e.length||B||(kt=(new Date).getTime(),touchId=e[0].identifier,D=e[0].pageX,C=e[0].pageY),2!=e.length||B||(touchId=e[0].identifier,jt=$t(e),Yt=!0))}function Kt(t){B=!1}function Zt(t,e,i,n,r){if(t==i&&e==n)return;let[s,a]=function(t,e){let i=ne(t),n=ne(e),r=Ut(i,n);return[r>1?0:r<-1?f:Math.acos(r),Pt(Vt(i,n))]}([t,-e],[i,-n]);mat4.fromRotation(O,2*r*R*s/v,a),mat4.multiply(T,O,T)}function Qt(t,e,i,n){let r=1/v;P.x+=(i-t)*r*s,P.y-=(n-e)*r*a}function Jt(t,e,i,n){o.orthographic?Qt(t,e,i,n):(_.x+=(i-t)*(S.xmax-S.xmin),_.y-=(n-e)*(S.ymax-S.ymin))}function te(){var t,e;t=A,e=T,mat4.fromTranslation(O,[_.x,_.y,_.z]),mat4.invert(N,O),mat4.multiply(t,e,N),mat4.multiply(t,O,t),mat4.translate(A,A,[_.x,_.y,0]),mat3.fromMat4(L,A),mat3.invert(I,L),mat4.multiply(E,y,A)}function ee(){let t=Math.sqrt(Number.MAX_VALUE),e=1/t;v<=e&&(v=e),v>=t&&(v=t),(1.5*v<x||v>1.5*x)&&(U=!0,x=v)}function ie(t){let e=o.zoomStep*a*t;const i=Math.log(.1*Number.MAX_VALUE)/Math.log(o.zoomFactor);Math.abs(e)<i&&(v*=o.zoomFactor**e,ee())}function ne(t){let e=t[0],i=t[1],n=Math.hypot(e,i);return n>1&&(denom=1/n,e*=denom,i*=denom),[e,i,Math.sqrt(Math.max(1-i*i-e*e,0))]}function re(t,e,i,n){ie(e-n)}function se(t,e,i,n=1){let r;switch(i){case 1:r=Zt;break;case 2:r=Qt;break;case 3:r=re;break;case 4:r=Jt;break;default:r=(t,e,i,n)=>{}}r((D-s)/s,(C-a)/a,(t-s)/s,(e-a)/a,n),D=t,C=e,Oe(),Ne()}let ae=0;function oe(){ae=1,o.canvas.addEventListener("wheel",de,!1)}function he(){let t,e,i;[t,e,i]=function(){let t=Array(3),e=Array(3),i=Array(3),n=_.x,r=_.y,s=.5*(S.zmin+S.zmax);for(let a=0;a<3;++a){let h=0,l=0,c=0,d=4*a;for(let t=0;t<4;++t){let e=4*t,i=T[e],a=T[e+1],m=T[e+2],f=T[e+3],u=o.Transform[d+t];h+=u*(f-n*i-r*a-s*m),c+=u*a,l+=u*(f-n*i-r*a)}t[a]=h,e[a]=c,i[a]=l}return[t,e,i]}();let n=o.orthographic?" orthographic(":" perspective(",r="".padStart(n.length),s="currentprojection=\n"+n+"camera=("+t+"),\n"+r+"up=("+e+"),\n"+r+"target=("+i+"),\n"+r+"zoom="+v*o.initialZoom/o.zoom0;return o.orthographic||(s+=",\n"+r+"angle="+2*Math.atan(Math.tan(.5*o.angleOfView)/v)/u),0==g&&0==w||(s+=",\n"+r+"viewportshift=("+g+","+w+")"),o.orthographic||(s+=",\n"+r+"autoadjust=false"),s+=");\n",window.parent.asyProjection=!0,s}function le(t){if(ae||oe(),o.embedded&&ae&&27==t.keyCode)return ae=0,void o.canvas.removeEventListener("wheel",de,!1);let e=[];switch(t.key){case"x":e=[1,0,0];break;case"y":e=[0,1,0];break;case"z":e=[0,0,1];break;case"h":mat4.identity(T),Rt(),window.top.asyWebApplication&&window.top.asyWebApplication.setProjection(""),window.parent.asyProjection=!1;break;case"m":++V,3==V&&(V=0),2!=V&&(o.embedded||st(),rt(o.ibl)),U=!0,Ne();break;case"+":case"=":case">":v*=o.zoomFactor,ce();break;case"-":case"_":case"<":v/=o.zoomFactor,ce();break;case"c":window.top.asyWebApplication||prompt("Ctrl+c Enter to copy currentprojection to clipboard; then append to asy file:",he())}e.length>0&&(mat4.rotate(T,T,.1,e),te(),Ne())}function ce(){ee(),Oe(),Ne()}function de(t){t.preventDefault(),t.deltaY<0?v*=o.zoomFactor:v/=o.zoomFactor,ce()}function me(t){if(!B)return;let e,i=t.clientX,n=t.clientY;e=t.getModifierState("Control")?2:t.getModifierState("Shift")?3:t.getModifierState("Alt")?4:1,se(i,n,e)}let fe=!1,ue=!1,pe=!1;function ve(t){if(t.preventDefault(),fe)return;let e=t.targetTouches;if(!Yt&&1==e.length&&touchId==e[0].identifier){let t=e[0].pageX,i=e[0].pageY,n=t-D,r=i-C,s=n*n+r*r<=o.shiftHoldDistance*o.shiftHoldDistance;if(s&&!ue&&!pe&&(new Date).getTime()-kt>o.shiftWaitTime&&(navigator.vibrate&&window.navigator.vibrate(o.vibrateTime),ue=!0),ue)se(t,i,2);else if(!s){pe=!0,se(e[0].pageX,e[0].pageY,1,.5)}}if(Yt&&!ue&&2==e.length&&touchId==e[0].identifier){let t=$t(e),i=t-jt;fe=!0,i*=o.zoomPinchFactor,i>o.zoomPinchCap&&(i=o.zoomPinchCap),i<-o.zoomPinchCap&&(i=-o.zoomPinchCap),ie(i/b),jt=t,ue=pe=fe=!1,Oe(),Ne()}}let xe,ge,we,Me,be=[];function Re(){dt(K,xe),K.clear()}function Te(){dt(Z,ge),Z.clear()}function ye(){dt(Q,ge),Q.clear()}function Ae(){dt(J,we),J.clear()}function Ee(){dt(et,Me),et.rendered=!1,et.clear()}function Ie(){let e=tt.indices;if(V>0)return dt(tt,Me,e),void tt.clear();if(e.length>0){!function(t){let e=A[2],i=A[6],n=A[10];be.length=t.length;for(let r=0;r<t.length;++r){let s=6*r;be[r]=e*t[s]+i*t[s+1]+n*t[s+2]}}(tt.vertices);let i=e.length/3,n=Array(i).fill().map((t,e)=>e);n.sort((function(t,i){let n=3*t;Ia=e[n],Ib=e[n+1],Ic=e[n+2];let r=3*i;return IA=e[r],IB=e[r+1],IC=e[r+2],be[Ia]+be[Ib]+be[Ic]<be[IA]+be[IB]+be[IC]?-1:1}));let r=Array(e.length);for(let t=0;t<i;++t){let i=3*n[t];r[3*t]=e[i],r[3*t+1]=e[i+1],r[3*t+2]=e[i+2]}t.depthMask(!1),dt(tt,Me,r),tt.rendered=!1,t.depthMask(!0)}tt.clear()}function Le(){Re(),Te(),ye(),Ae(),Ee(),Ie(),requestAnimationFrame(Le)}function Ne(){o.embedded&&(i.width=o.canvasWidth,i.height=o.canvasHeight,_e()),t.clearColor(o.background[0],o.background[1],o.background[2],o.background[3]),t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT);for(const t of h)t.render();Le(),o.embedded&&(n.clearRect(0,0,o.canvasWidth,o.canvasHeight),n.drawImage(i,0,0)),0==V&&(U=!1)}function Oe(){!function(t,e,i,n){let r=t/e;g=(i/t+o.viewportShift[0])*v,w=(n/e+o.viewportShift[1])*v;let s=1/v;if(o.orthographic){let t=o.maxBound[0]-o.minBound[0],e=o.maxBound[1]-o.minBound[1];if(t<e*r){let t=.5*e*r*s,i=2*t*g,n=e*s*w;S.xmin=-t-i,S.xmax=t-i,S.ymin=o.minBound[1]*s-n,S.ymax=o.maxBound[1]*s-n}else{let e=.5*t*s/r,i=t*s*g,n=2*e*w;S.xmin=o.minBound[0]*s-i,S.xmax=o.maxBound[0]*s-i,S.ymin=-e-n,S.ymax=e-n}}else{let t=M*s,e=t*r,i=2*e*g,n=2*t*w;S.xmin=-e-i,S.xmax=e-i,S.ymin=-t-n,S.ymax=t-n}}(o.canvasWidth,o.canvasHeight,P.x,P.y),(o.orthographic?mat4.ortho:mat4.frustum)(y,S.xmin,S.xmax,S.ymin,S.ymax,-S.zmax,-S.zmin),te(),window.top.asyWebApplication&&window.top.asyWebApplication.setProjection(he())}function _e(){t.viewportWidth=o.canvasWidth,t.viewportHeight=o.canvasHeight,t.viewport(.5*(o.canvas.width-o.canvasWidth),.5*(o.canvas.height-o.canvasHeight),o.canvasWidth,o.canvasHeight),t.scissor(0,0,o.canvas.width,o.canvas.height)}function Pe(t,e){t>void 0&&(t=void 0),e>void 0&&(e=void 0),P.x*=t/o.canvasWidth,P.y*=e/o.canvasHeight,o.canvasWidth=t,o.canvasHeight=e,o.embedded&&(o.canvas.width=i.width=o.canvasWidth,o.canvas.height=i.height=o.canvasHeight),b=Math.hypot(o.canvasWidth,o.canvasHeight),s=.5*o.canvas.width,a=.5*o.canvas.height,R=1+8*Math.hypot(o.viewportMargin[0],o.viewportMargin[1])/b,_e(),Oe(),U=!0}function Se(){if(o.zoom0=o.initialZoom,window.top.asyWebApplication&&""==window.top.asyWebApplication.getProjection()&&(window.parent.asyProjection=!1),o.absolute&&!o.embedded)o.canvasWidth=o.canvasWith0*window.devicePixelRatio,o.canvasHeight=o.canvasHeight0*window.devicePixelRatio;else{let t=o.canvasWith0/o.canvasHeight0;o.canvasWidth=Math.max(window.innerWidth-10,10),o.canvasHeight=Math.max(window.innerHeight-10,10),!o.orthographic&&!window.parent.asyProjection&&o.canvasWidth<o.canvasHeight*t&&(o.zoom0*=o.canvasWidth/(o.canvasHeight*t))}o.canvas.width=o.canvasWidth,o.canvas.height=o.canvasHeight;window.innerWidth,window.innerHeight;let t=1/o.zoom0;o.viewportShift[0]*=t,o.viewportShift[1]*=t,Pe(o.canvasWidth,o.canvasHeight),Rt()}class Ue{constructor(t,e){if(this.center=t,e){let t=e[0],i=e[1];this.ct=Math.cos(t),this.st=Math.sin(t),this.cp=Math.cos(i),this.sp=Math.sin(i)}}T0(t){return[t[0]+this.center[0],t[1]+this.center[1],t[2]+this.center[2]]}T(t){let e=t[0],i=t[1],n=t[2],r=e*this.ct+n*this.st;return[r*this.cp-i*this.sp+this.center[0],r*this.sp+i*this.cp+this.center[1],-e*this.st+n*this.ct+this.center[2]]}}function Ve(t,e,i){let n=[t(e),t([e[0],e[1],i[2]]),t([e[0],i[1],e[2]]),t([e[0],i[1],i[2]]),t([i[0],e[1],e[2]]),t([i[0],e[1],i[2]]),t([i[0],i[1],e[2]]),t(i)];return[Xt(n),Gt(n)]}let Be=4/3*(Math.sqrt(2)-1);async function De(t){return(await fetch(t)).arrayBuffer()}function Ce(t){return t.getBytes().filter((t,e)=>e%4!=3)}function Fe(e,i,n=t.RGB16F){let r=e.width(),s=e.height(),a=t.createTexture();return t.activeTexture(t.TEXTURE0+i),t.bindTexture(t.TEXTURE_2D,a),t.pixelStorei(t.UNPACK_ALIGNMENT,1),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texImage2D(t.TEXTURE_2D,0,n,r,s,0,t.RGB,t.FLOAT,Ce(e)),a}window.webGLStart=function(){o.canvas=document.getElementById("Asymptote"),o.embedded=window.top.document!=document,ht(),t.enable(t.BLEND),t.blendFunc(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA),t.enable(t.DEPTH_TEST),t.enable(t.SCISSOR_TEST),o.canvas.onmousedown=Wt,document.onmouseup=Kt,document.onmousemove=me,o.canvas.onkeydown=le,o.embedded||oe(),o.canvas.addEventListener("touchstart",qt,!1),o.canvas.addEventListener("touchend",Kt,!1),o.canvas.addEventListener("touchcancel",Kt,!1),o.canvas.addEventListener("touchleave",Kt,!1),o.canvas.addEventListener("touchmove",ve,!1),document.addEventListener("keydown",le,!1),o.canvasWith0=o.canvasWidth,o.canvasHeight0=o.canvasHeight,mat4.identity(T),0!=window.innerWidth&&0!=window.innerHeight&&Se(),window.addEventListener("resize",Se,!1),o.ibl&&async function(){let e=o.imageURL+o.image+"/";function i(t){return new Promise(e=>setTimeout(e,t))}for(;!Module.EXRLoader;)await i(0);promises=[De(o.imageURL+"refl.exr").then(t=>{let e=new Module.EXRLoader(t);j=Fe(e,0)}),De(e+"diffuse.exr").then(t=>{let e=new Module.EXRLoader(t);W=Fe(e,1)})],refl_promise=[],refl_promise.push(De(e+"refl0.exr"));for(let t=1;t<=8;++t)refl_promise.push(De(e+"refl"+t+"w.exr"));finished_promise=Promise.all(refl_promise).then(e=>{let i=t.createTexture();t.activeTexture(t.TEXTURE0+2),t.pixelStorei(t.UNPACK_ALIGNMENT,1),t.bindTexture(t.TEXTURE_2D,i),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAX_LEVEL,e.length-1),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR_MIPMAP_LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameterf(t.TEXTURE_2D,t.TEXTURE_MIN_LOD,0),t.texParameterf(t.TEXTURE_2D,t.TEXTURE_MAX_LOD,8);for(let i=0;i<e.length;++i){let n=new Module.EXRLoader(e[i]);t.texImage2D(t.TEXTURE_2D,i,t.RGB16F,n.width(),n.height(),0,t.RGB,t.FLOAT,Ce(n))}G=i}),promises.push(finished_promise),await Promise.all(promises)}().then(k).then(Rt)},window.light=function(t,e){l.push(new nt(t,e))},window.material=function(t,e,i,n,r,s){c.push(new Y(t,e,i,n,r,s))},window.patch=function(t,e,i,n){h.push(new vt(t,e,i,n))},window.curve=function(t,e,i){h.push(new wt(t,e,i))},window.pixel=function(t,e,i){h.push(new Mt(t,e,i))},window.triangles=function(t,e){h.push(new bt(t,e)),window.Positions=F=[],window.Normals=z=[],window.Colors=H=[],window.Indices=X=[]},window.sphere=function(t,e,i,n,r){let s,a,o,l,c,d,m=.524670512339254,f=.595936986722291,u=.954967051233925,p=.0820155480083437,v=.996685028842544,x=.0549670512339254,g=.998880711874577,w=.0405017186586849,M=[[[1,0,0],[1,0,m],[f,0,u],[p,0,v],[1,Be,0],[1,Be,m],[f,Be*f,u],[p,Be*p,v],[Be,1,0],[Be,1,m],[Be*f,f,u],[Be*p,p,v],[0,1,0],[0,1,m],[0,f,u],[0,p,v]],[[p,0,v],[p,Be*p,v],[x,0,g],[Be*p,p,v],[w,w,1],[.05*Be,0,1],[0,p,v],[0,x,g],[0,.05*Be,1],[0,0,1]]],b=new Ue(t,r);function R(t){let e=Array(t.length);for(let i=0;i<t.length;++i){let n=t[i];e[i]=c([s*n[0],a*n[1],o*n[2]])}return e}r?(l=1,d=0,c=b.T.bind(b)):(l=-1,d=-e,c=b.T0.bind(b));let T=Ve(c,[-e,-e,d],[e,e,e]),y=T[0],A=T[1];for(let t=-1;t<=1;t+=2){s=t*e;for(let t=-1;t<=1;t+=2){a=t*e;for(let t=l;t<=1;t+=2){o=t*e;for(let t=0;t<2;++t)h.push(new vt(R(M[t]),i,n,null,y,A))}}}},window.disk=function(t,e,i,n,r){let s=1-2*Be/3,a=[[1,0,0],[1,-Be,0],[Be,-1,0],[0,-1,0],[1,Be,0],[s,0,0],[0,-s,0],[-Be,-1,0],[Be,1,0],[0,s,0],[-s,0,0],[-1,-Be,0],[0,1,0],[-Be,1,0],[-1,Be,0],[-1,0,0]],o=new Ue(t,r),l=Ve(o.T.bind(o),[-e,-e,0],[e,e,0]);h.push(new vt(function(t){let i=Array(t.length);for(let n=0;n<t.length;++n){let r=t[n];i[n]=o.T([e*r[0],e*r[1],0])}return i}(a),i,n,null,l[0],l[1]))},window.cylinder=function(t,e,i,n,r,s,a){let o,l,c=[[1,0,0],[1,0,1/3],[1,0,2/3],[1,0,1],[1,Be,0],[1,Be,1/3],[1,Be,2/3],[1,Be,1],[Be,1,0],[Be,1,1/3],[Be,1,2/3],[Be,1,1],[0,1,0],[0,1,1/3],[0,1,2/3],[0,1,1]],d=new Ue(t,s);function m(t){let e=Array(t.length);for(let n=0;n<t.length;++n){let r=t[n];e[n]=d.T([o*r[0],l*r[1],i*r[2]])}return e}let f=Ve(d.T.bind(d),[-e,-e,0],[e,e,i]),u=f[0],p=f[1];for(let t=-1;t<=1;t+=2){o=t*e;for(let t=-1;t<=1;t+=2)l=t*e,h.push(new vt(m(c),n,r,null,u,p))}if(a){let e=d.T([0,0,i]);h.push(new wt([t,e],n,r,t,e))}},window.tube=function(t,e,i,n,r){let s=function(t,e,i,n,r){class s{constructor(t,e,i){this.p=t,this.r=e,this.t=i,this.s=Vt(i,e)}}let a=Number.EPSILON*Math.max(St(t),St(e),St(i),St(n));function o(r){if(1==r){let r=[n[0]-i[0],n[1]-i[1],n[2]-i[2]];return St(r)>a?Pt(r):(r=[2*i[0]-e[0]-n[0],2*i[1]-e[1]-n[1],2*i[2]-e[2]-n[2]],St(r)>a?Pt(r):[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])])}let s=[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])],o=[2*(t[0]+i[0])-4*e[0],2*(t[1]+i[1])-4*e[1],2*(t[2]+i[2])-4*e[2]],h=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],l=r*r,c=[s[0]*l+o[0]*r+h[0],s[1]*l+o[1]*r+h[1],s[2]*l+o[2]*r+h[2]];return St(c)>a?Pt(c):(l=2*r,c=[s[0]*l+o[0],s[1]*l+o[1],s[2]*l+o[2]],St(c)>a?Pt(c):Pt(s))}let h=Array(r.length),l=[e[0]-t[0],e[1]-t[1],e[2]-t[2]];St(l)<a&&(l=[t[0]-2*e[0]+i[0],t[1]-2*e[1]+i[1],t[2]-2*e[2]+i[2]],St(l)<a&&(l=[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])])),l=Pt(l);let c=function(t){let e=Vt(t,[0,1,0]),i=Number.EPSILON*St(t);return St(e)>i?Pt(e):(e=Vt(t,[0,0,1]),St(e)>i?Pt(e):[1,0,0])}(l);h[0]=new s(t,c,l);for(let a=1;a<r.length;++a){let l=h[a-1],c=r[a],d=1-c,m=d*d,f=m*d,u=3*c;m*=u,d*=u*c;let p=c*c*c,v=[f*t[0]+m*e[0]+d*i[0]+p*n[0],f*t[1]+m*e[1]+d*i[1]+p*n[1],f*t[2]+m*e[2]+d*i[2]+p*n[2]],x=[v[0]-l.p[0],v[1]-l.p[1],v[2]-l.p[2]];if(0!=x[0]||0!=x[1]||0!=x[2]){let t=l.r,e=Pt(x),i=l.t,n=Ut(e,i),r=[i[0]-2*n*e[0],i[1]-2*n*e[1],i[2]-2*n*e[2]];i=o(c);let d=2*Ut(e,t),m=[t[0]-d*e[0],t[1]-d*e[1],t[2]-d*e[2]],f=Pt([i[0]-r[0],i[1]-r[1],i[2]-r[2]]),u=2*Ut(f,m);m=[m[0]-u*f[0],m[1]-u*f[1],m[2]-u*f[2]],h[a]=new s(v,Pt(m),Pt(i))}else h[a]=h[a-1]}return h}(t[0],t[1],t[2],t[3],[0,1/3,2/3,1]),a=Be*e,o=[[e,0],[e,a],[a,e],[0,e]];function l(e,r,a,l){let c=Array(16);for(let i=0;i<4;++i){let n=s[i],h=n.r[0],d=n.s[0],m=h*e+d*r,f=h*a+d*l;h=n.r[1],d=n.s[1];let u=h*e+d*r,p=h*a+d*l;h=n.r[2],d=n.s[2];let v=h*e+d*r,x=h*a+d*l,g=t[i],w=g[0];w1=g[1],w2=g[2];for(let t=0;t<4;++t){let e=o[t],n=e[0],r=e[1];c[4*i+t]=[m*n+f*r+w,u*n+p*r+w1,v*n+x*r+w2]}}h.push(new vt(c,i,n))}l(1,0,0,1),l(0,-1,1,0),l(-1,0,0,-1),l(0,1,-1,0),r&&h.push(new wt(t,i,n))},window.Positions=F,window.Normals=z,window.Colors=H,window.Indices=X}();
+let vertex="\n#ifdef WEBGL2\n#define IN in\n#define OUT out\n#else\n#define IN attribute\n#define OUT varying\n#endif\n\nIN vec3 position;\n#ifdef WIDTH\nIN float width;\n#endif\n#ifdef NORMAL\nIN vec3 normal;\n#endif\n\nIN float materialIndex;\n\n#ifdef WEBGL2\nflat out int MaterialIndex;\n#ifdef COLOR\nOUT vec4 Color;\n#endif\n\n#else\nOUT vec4 diffuse;\nOUT vec3 specular;\nOUT float roughness,metallic,fresnel0;\nOUT vec4 emissive;\n\nstruct Material {\n vec4 diffuse,emissive,specular;\n vec4 parameters;\n};\n\nuniform Material Materials[Nmaterials];\n#endif\n\n#ifdef COLOR\nIN vec4 color;\n#endif\n\nuniform mat3 normMat;\nuniform mat4 viewMat;\nuniform mat4 projViewMat;\n\n#ifdef NORMAL\n#ifndef ORTHOGRAPHIC\nOUT vec3 ViewPosition;\n#endif\nOUT vec3 Normal;\n#endif\n\nvoid main(void)\n{\n vec4 v=vec4(position,1.0);\n gl_Position=projViewMat*v;\n\n#ifdef NORMAL\n#ifndef ORTHOGRAPHIC\n ViewPosition=(viewMat*v).xyz;\n#endif\n Normal=normalize(normal*normMat);\n#endif\n\n#ifdef WEBGL2\n MaterialIndex=int(materialIndex);\n#ifdef COLOR\n Color=color;\n#endif\n#else\n#ifdef NORMAL\n Material m;\n#ifdef TRANSPARENT\n m=Materials[int(abs(materialIndex))-1];\n emissive=m.emissive;\n if(materialIndex >= 0.0)\n diffuse=m.diffuse;\n else {\n diffuse=color;\n#if nlights == 0\n emissive += color;\n#endif\n }\n#else\n m=Materials[int(materialIndex)];\n emissive=m.emissive;\n#ifdef COLOR\n diffuse=color;\n#if nlights == 0\n emissive += color;\n#endif\n#else\n diffuse=m.diffuse;\n#endif // COLOR\n#endif // TRANSPARENT\n specular=m.specular.rgb;\n vec4 parameters=m.parameters;\n roughness=1.0-parameters[0];\n metallic=parameters[1];\n fresnel0=parameters[2];\n#else\n emissive=Materials[int(materialIndex)].emissive;\n#endif // NORMAL\n#endif // WEBGL2\n\n#ifdef WIDTH\n gl_PointSize=width;\n#endif\n}\n",fragment="\n#ifdef WEBGL2\n#define IN in\nout vec4 outValue;\n#define OUTVALUE outValue\n#else\n#define IN varying\n#define OUTVALUE gl_FragColor\n#endif\n\n#ifdef WEBGL2\nflat in int MaterialIndex;\n\nstruct Material {\n vec4 diffuse,emissive,specular;\n vec4 parameters;\n};\n\nuniform Material Materials[Nmaterials];\n\nvec4 diffuse;\nvec3 specular;\nfloat roughness,metallic,fresnel0;\nvec4 emissive;\n\n#ifdef COLOR\nin vec4 Color;\n#endif\n\n#else\nIN vec4 diffuse;\nIN vec3 specular;\nIN float roughness,metallic,fresnel0;\nIN vec4 emissive;\n#endif\n\n#ifdef NORMAL\n\n#ifndef ORTHOGRAPHIC\nIN vec3 ViewPosition;\n#endif\nIN vec3 Normal;\n\nvec3 normal;\n\nstruct Light {\n vec3 direction;\n vec3 color;\n};\n\nuniform Light Lights[Nlights];\n\n#ifdef USE_IBL\nuniform sampler2D reflBRDFSampler;\nuniform sampler2D diffuseSampler;\nuniform sampler2D reflImgSampler;\n\nconst float pi=acos(-1.0);\nconst float piInv=1.0/pi;\nconst float twopi=2.0*pi;\nconst float twopiInv=1.0/twopi;\n\n// (x,y,z) -> (r,theta,phi);\n// theta -> [0,pi]: colatitude\n// phi -> [-pi,pi]: longitude\nvec3 cart2sphere(vec3 cart)\n{\n float x=cart.x;\n float y=cart.z;\n float z=cart.y;\n\n float r=length(cart);\n float theta=r > 0.0 ? acos(z/r) : 0.0;\n float phi=atan(y,x);\n\n return vec3(r,theta,phi);\n}\n\nvec2 normalizedAngle(vec3 cartVec)\n{\n vec3 sphericalVec=cart2sphere(cartVec);\n sphericalVec.y=sphericalVec.y*piInv;\n sphericalVec.z=0.75-sphericalVec.z*twopiInv;\n return sphericalVec.zy;\n}\n\nvec3 IBLColor(vec3 viewDir)\n{\n vec3 IBLDiffuse=diffuse.rgb*texture(diffuseSampler,normalizedAngle(normal)).rgb;\n vec3 reflectVec=normalize(reflect(-viewDir,normal));\n vec2 reflCoord=normalizedAngle(reflectVec);\n vec3 IBLRefl=textureLod(reflImgSampler,reflCoord,roughness*ROUGHNESS_STEP_COUNT).rgb;\n vec2 IBLbrdf=texture(reflBRDFSampler,vec2(dot(normal,viewDir),roughness)).rg;\n float specularMultiplier=fresnel0*IBLbrdf.x+IBLbrdf.y;\n vec3 dielectric=IBLDiffuse+specularMultiplier*IBLRefl;\n vec3 metal=diffuse.rgb*IBLRefl;\n return mix(dielectric,metal,metallic);\n}\n#else\nfloat Roughness2;\nfloat NDF_TRG(vec3 h)\n{\n float ndoth=max(dot(normal,h),0.0);\n float alpha2=Roughness2*Roughness2;\n float denom=ndoth*ndoth*(alpha2-1.0)+1.0;\n return denom != 0.0 ? alpha2/(denom*denom) : 0.0;\n}\n\nfloat GGX_Geom(vec3 v)\n{\n float ndotv=max(dot(v,normal),0.0);\n float ap=1.0+Roughness2;\n float k=0.125*ap*ap;\n return ndotv/((ndotv*(1.0-k))+k);\n}\n\nfloat Geom(vec3 v, vec3 l)\n{\n return GGX_Geom(v)*GGX_Geom(l);\n}\n\nfloat Fresnel(vec3 h, vec3 v, float fresnel0)\n{\n float a=1.0-max(dot(h,v),0.0);\n float b=a*a;\n return fresnel0+(1.0-fresnel0)*b*b*a;\n}\n\n// physical based shading using UE4 model.\nvec3 BRDF(vec3 viewDirection, vec3 lightDirection)\n{\n vec3 lambertian=diffuse.rgb;\n vec3 h=normalize(lightDirection+viewDirection);\n\n float omegain=max(dot(viewDirection,normal),0.0);\n float omegaln=max(dot(lightDirection,normal),0.0);\n\n float D=NDF_TRG(h);\n float G=Geom(viewDirection,lightDirection);\n float F=Fresnel(h,viewDirection,fresnel0);\n\n float denom=4.0*omegain*omegaln;\n float rawReflectance=denom > 0.0 ? (D*G)/denom : 0.0;\n\n vec3 dielectric=mix(lambertian,rawReflectance*specular,F);\n vec3 metal=rawReflectance*diffuse.rgb;\n\n return mix(dielectric,metal,metallic);\n}\n#endif\n\n#endif\n\nvoid main(void)\n{\n#ifdef WEBGL2\n#ifdef NORMAL\n Material m;\n#ifdef TRANSPARENT\n m=Materials[abs(MaterialIndex)-1];\n emissive=m.emissive;\n if(MaterialIndex >= 0)\n diffuse=m.diffuse;\n else {\n diffuse=Color;\n#if nlights == 0\n emissive += Color;\n#endif\n }\n#else\n m=Materials[MaterialIndex];\n emissive=m.emissive;\n#ifdef COLOR\n diffuse=Color;\n#if nlights == 0\n emissive += Color;\n#endif\n#else\n diffuse=m.diffuse;\n#endif // COLOR\n#endif // TRANSPARENT\n specular=m.specular.rgb;\n vec4 parameters=m.parameters;\n roughness=1.0-parameters[0];\n metallic=parameters[1];\n fresnel0=parameters[2];\n#else\n emissive=Materials[MaterialIndex].emissive;\n#endif // NORMAL\n#endif // WEBGL2\n\n#if defined(NORMAL) && nlights > 0\n normal=normalize(Normal);\n normal=gl_FrontFacing ? normal : -normal;\n#ifdef ORTHOGRAPHIC\n vec3 viewDir=vec3(0.0,0.0,1.0);\n#else\n vec3 viewDir=-normalize(ViewPosition);\n#endif\n\nvec3 color;\n#ifdef USE_IBL\n color=IBLColor(viewDir);\n#else\n Roughness2=roughness*roughness;\n color=emissive.rgb;\n for(int i=0; i < nlights; ++i) {\n Light Li=Lights[i];\n vec3 L=Li.direction;\n float cosTheta=max(dot(normal,L),0.0);\n vec3 radiance=cosTheta*Li.color;\n color += BRDF(viewDir,L)*radiance;\n }\n#endif\n OUTVALUE=vec4(color,diffuse.a);\n#else\n OUTVALUE=emissive;\n#endif\n}\n";!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i=e();for(var n in i)("object"==typeof exports?exports:t)[n]=i[n]}}("undefined"!=typeof self?self:this,(function(){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=1)}([function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setMatrixArrayType=function(t){e.ARRAY_TYPE=t},e.toRadian=function(t){return t*r},e.equals=function(t,e){return Math.abs(t-e)<=n*Math.max(1,Math.abs(t),Math.abs(e))};var n=e.EPSILON=1e-6;e.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,e.RANDOM=Math.random;var r=Math.PI/180},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mat4=e.mat3=void 0;var n=s(i(2)),r=s(i(3));function s(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}e.mat3=n,e.mat4=r},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=function(){var t=new n.ARRAY_TYPE(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromMat4=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[4],t[4]=e[5],t[5]=e[6],t[6]=e[8],t[7]=e[9],t[8]=e[10],t},e.invert=function(t,e){var i=e[0],n=e[1],r=e[2],s=e[3],a=e[4],o=e[5],h=e[6],l=e[7],c=e[8],d=c*a-o*l,m=-c*s+o*h,f=l*s-a*h,u=i*d+n*m+r*f;if(!u)return null;return u=1/u,t[0]=d*u,t[1]=(-c*n+r*l)*u,t[2]=(o*n-r*a)*u,t[3]=m*u,t[4]=(c*i-r*h)*u,t[5]=(-o*i+r*s)*u,t[6]=f*u,t[7]=(-l*i+n*h)*u,t[8]=(a*i-n*s)*u,t};var n=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(i(0))},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=function(){var t=new n.ARRAY_TYPE(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.invert=function(t,e){var i=e[0],n=e[1],r=e[2],s=e[3],a=e[4],o=e[5],h=e[6],l=e[7],c=e[8],d=e[9],m=e[10],f=e[11],u=e[12],p=e[13],v=e[14],x=e[15],g=i*o-n*a,w=i*h-r*a,M=i*l-s*a,b=n*h-r*o,R=n*l-s*o,T=r*l-s*h,y=c*p-d*u,A=c*v-m*u,E=c*x-f*u,I=d*v-m*p,L=d*x-f*p,N=m*x-f*v,O=g*N-w*L+M*I+b*E-R*A+T*y;if(!O)return null;return O=1/O,t[0]=(o*N-h*L+l*I)*O,t[1]=(r*L-n*N-s*I)*O,t[2]=(p*T-v*R+x*b)*O,t[3]=(m*R-d*T-f*b)*O,t[4]=(h*E-a*N-l*A)*O,t[5]=(i*N-r*E+s*A)*O,t[6]=(v*M-u*T-x*w)*O,t[7]=(c*T-m*M+f*w)*O,t[8]=(a*L-o*E+l*y)*O,t[9]=(n*E-i*L-s*y)*O,t[10]=(u*R-p*M+x*g)*O,t[11]=(d*M-c*R-f*g)*O,t[12]=(o*A-a*I-h*y)*O,t[13]=(i*I-n*A+r*y)*O,t[14]=(p*w-u*b-v*g)*O,t[15]=(c*b-d*w+m*g)*O,t},e.multiply=r,e.translate=function(t,e,i){var n=i[0],r=i[1],s=i[2],a=void 0,o=void 0,h=void 0,l=void 0,c=void 0,d=void 0,m=void 0,f=void 0,u=void 0,p=void 0,v=void 0,x=void 0;e===t?(t[12]=e[0]*n+e[4]*r+e[8]*s+e[12],t[13]=e[1]*n+e[5]*r+e[9]*s+e[13],t[14]=e[2]*n+e[6]*r+e[10]*s+e[14],t[15]=e[3]*n+e[7]*r+e[11]*s+e[15]):(a=e[0],o=e[1],h=e[2],l=e[3],c=e[4],d=e[5],m=e[6],f=e[7],u=e[8],p=e[9],v=e[10],x=e[11],t[0]=a,t[1]=o,t[2]=h,t[3]=l,t[4]=c,t[5]=d,t[6]=m,t[7]=f,t[8]=u,t[9]=p,t[10]=v,t[11]=x,t[12]=a*n+c*r+u*s+e[12],t[13]=o*n+d*r+p*s+e[13],t[14]=h*n+m*r+v*s+e[14],t[15]=l*n+f*r+x*s+e[15]);return t},e.rotate=function(t,e,i,r){var s,a,o,h,l,c,d,m,f,u,p,v,x,g,w,M,b,R,T,y,A,E,I,L,N=r[0],O=r[1],_=r[2],P=Math.sqrt(N*N+O*O+_*_);if(Math.abs(P)<n.EPSILON)return null;N*=P=1/P,O*=P,_*=P,s=Math.sin(i),a=Math.cos(i),o=1-a,h=e[0],l=e[1],c=e[2],d=e[3],m=e[4],f=e[5],u=e[6],p=e[7],v=e[8],x=e[9],g=e[10],w=e[11],M=N*N*o+a,b=O*N*o+_*s,R=_*N*o-O*s,T=N*O*o-_*s,y=O*O*o+a,A=_*O*o+N*s,E=N*_*o+O*s,I=O*_*o-N*s,L=_*_*o+a,t[0]=h*M+m*b+v*R,t[1]=l*M+f*b+x*R,t[2]=c*M+u*b+g*R,t[3]=d*M+p*b+w*R,t[4]=h*T+m*y+v*A,t[5]=l*T+f*y+x*A,t[6]=c*T+u*y+g*A,t[7]=d*T+p*y+w*A,t[8]=h*E+m*I+v*L,t[9]=l*E+f*I+x*L,t[10]=c*E+u*I+g*L,t[11]=d*E+p*I+w*L,e!==t&&(t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]);return t},e.fromTranslation=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=e[0],t[13]=e[1],t[14]=e[2],t[15]=1,t},e.fromRotation=function(t,e,i){var r,s,a,o=i[0],h=i[1],l=i[2],c=Math.sqrt(o*o+h*h+l*l);if(Math.abs(c)<n.EPSILON)return null;return o*=c=1/c,h*=c,l*=c,r=Math.sin(e),s=Math.cos(e),a=1-s,t[0]=o*o*a+s,t[1]=h*o*a+l*r,t[2]=l*o*a-h*r,t[3]=0,t[4]=o*h*a-l*r,t[5]=h*h*a+s,t[6]=l*h*a+o*r,t[7]=0,t[8]=o*l*a+h*r,t[9]=h*l*a-o*r,t[10]=l*l*a+s,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.frustum=function(t,e,i,n,r,s,a){var o=1/(i-e),h=1/(r-n),l=1/(s-a);return t[0]=2*s*o,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*s*h,t[6]=0,t[7]=0,t[8]=(i+e)*o,t[9]=(r+n)*h,t[10]=(a+s)*l,t[11]=-1,t[12]=0,t[13]=0,t[14]=a*s*2*l,t[15]=0,t},e.ortho=function(t,e,i,n,r,s,a){var o=1/(e-i),h=1/(n-r),l=1/(s-a);return t[0]=-2*o,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*h,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*l,t[11]=0,t[12]=(e+i)*o,t[13]=(r+n)*h,t[14]=(a+s)*l,t[15]=1,t};var n=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(i(0));function r(t,e,i){var n=e[0],r=e[1],s=e[2],a=e[3],o=e[4],h=e[5],l=e[6],c=e[7],d=e[8],m=e[9],f=e[10],u=e[11],p=e[12],v=e[13],x=e[14],g=e[15],w=i[0],M=i[1],b=i[2],R=i[3];return t[0]=w*n+M*o+b*d+R*p,t[1]=w*r+M*h+b*m+R*v,t[2]=w*s+M*l+b*f+R*x,t[3]=w*a+M*c+b*u+R*g,w=i[4],M=i[5],b=i[6],R=i[7],t[4]=w*n+M*o+b*d+R*p,t[5]=w*r+M*h+b*m+R*v,t[6]=w*s+M*l+b*f+R*x,t[7]=w*a+M*c+b*u+R*g,w=i[8],M=i[9],b=i[10],R=i[11],t[8]=w*n+M*o+b*d+R*p,t[9]=w*r+M*h+b*m+R*v,t[10]=w*s+M*l+b*f+R*x,t[11]=w*a+M*c+b*u+R*g,w=i[12],M=i[13],b=i[14],R=i[15],t[12]=w*n+M*o+b*d+R*p,t[13]=w*r+M*h+b*m+R*v,t[14]=w*s+M*l+b*f+R*x,t[15]=w*a+M*c+b*u+R*g,t}}])})),function(){document.asy={canvasWidth:0,canvasHeight:0,absolute:!1,minBound:[0,0,0],maxBound:[0,0,0],orthographic:!1,angleOfView:0,initialZoom:0,viewportShift:[0,0],viewportMargin:[0,0],background:[],zoomFactor:0,zoomPinchFactor:0,zoomPinchCap:0,zoomStep:0,shiftHoldDistance:0,shiftWaitTime:0,vibrateTime:0,ibl:!1,webgl2:!1,imageURL:"",image:"",Transform:[],Centers:[]};let t,e,i,n,r,s,a,o=document.asy,h=[],l=[],c=[],d=0,m=2;const f=Math.acos(-1),u=f/180,p=Math.ceil(1-Math.log2(Number.EPSILON));let v,x,g,w,M,b,R,T=mat4.create(),y=mat4.create(),A=mat4.create(),E=mat4.create(),I=mat3.create(),L=mat3.create(),N=mat4.create(),O=mat4.create(),_={x:0,y:0,z:0},P={x:0,y:0},S={xmin:0,xmax:0,ymin:0,ymax:0,zmin:0,zmax:0},U=!0,V=0,B=!1,C=null,D=null,F=[],z=[],H=[],X=[],G=null,W=null,j=null;function k(){o.embedded||st(),rt(o.ibl)}class Y{constructor(t,e,i,n,r,s){this.diffuse=t,this.emissive=e,this.specular=i,this.shininess=n,this.metallic=r,this.fresnel0=s}setUniform(e,i){let n=n=>t.getUniformLocation(e,"Materials["+i+"]."+n);t.uniform4fv(n("diffuse"),new Float32Array(this.diffuse)),t.uniform4fv(n("emissive"),new Float32Array(this.emissive)),t.uniform4fv(n("specular"),new Float32Array(this.specular)),t.uniform4f(n("parameters"),this.shininess,this.metallic,this.fresnel0,0)}}let $,q,K,Z,Q,J,tt,et,it;class nt{constructor(t,e){this.direction=t,this.color=e}setUniform(e,i){let n=n=>t.getUniformLocation(e,"Lights["+i+"]."+n);t.uniform3fv(n("direction"),new Float32Array(this.direction)),t.uniform3fv(n("color"),new Float32Array(this.color))}}function rt(e=!1){let i=t.getParameter(t.MAX_VERTEX_UNIFORM_VECTORS);r=Math.floor((i-14)/4),m=Math.min(Math.max(m,c.length),r),pixelOpt=["WIDTH"],materialOpt=["NORMAL"],colorOpt=["NORMAL","COLOR"],transparentOpt=["NORMAL","COLOR","TRANSPARENT"],e&&(materialOpt.push("USE_IBL"),transparentOpt.push("USE_IBL")),ge=Nt(pixelOpt),we=Nt(materialOpt),Me=Nt(colorOpt),be=Nt(transparentOpt)}function st(){t.deleteProgram(be),t.deleteProgram(Me),t.deleteProgram(we),t.deleteProgram(ge)}function at(){let i=o.webgl2?window.top.document.asygl2[e]:window.top.document.asygl[e];i.gl=t,i.nlights=l.length,i.Nmaterials=m,i.maxMaterials=r,i.pixelShader=ge,i.materialShader=we,i.colorShader=Me,i.transparentShader=be}function ot(t,e){let i;return o.webgl2&&(i=t.getContext("webgl2",{alpha:e}),o.embedded&&!i)?(o.webgl2=!1,o.ibl=!1,ht(!1),null):(i||(o.webgl2=!1,o.ibl=!1,i=t.getContext("webgl",{alpha:e})),i||alert("Could not initialize WebGL"),i)}function ht(s=!0){if(o.ibl&&(o.webgl2=!0),e=o.background[3]<1,o.embedded){let a=window.top.document;if(s&&(n=o.canvas.getContext("2d")),i=o.webgl2?a.offscreen2:a.offscreen,i||(i=a.createElement("canvas"),o.webgl2?a.offscreen2=i:a.offscreen=i),o.webgl2?a.asygl2||(a.asygl2=Array(2)):a.asygl||(a.asygl=Array(2)),asygl=o.webgl2?a.asygl2:a.asygl,asygl[e]&&asygl[e].gl)!function(){let i=o.webgl2?window.top.document.asygl2[e]:window.top.document.asygl[e];t=i.gl,d=i.nlights,m=i.Nmaterials,r=i.maxMaterials,ge=i.pixelShader,we=i.materialShader,Me=i.colorShader,be=i.transparentShader}(),(l.length!=d||Math.min(c.length,r)>m)&&(rt(),at());else{if(rc=ot(i,e),!rc)return;t=rc,rt(),o.webgl2?a.asygl2[e]={}:a.asygl[e]={},at()}}else t=ot(o.canvas,e),rt();$=t.getExtension("OES_element_index_uint"),q=t.TRIANGLES,K=new mt(t.POINTS),Z=new mt(t.LINES),Q=new mt,J=new mt,tt=new mt,et=new mt}function lt(t,e,i,n=[]){let r=o.webgl2?"300 es":"100",s=Array(...n),a=[["nlights",0==V?l.length:0],["Nmaterials",m]],h=[["int","Nlights",Math.max(l.length,1)]];o.webgl2&&s.push("WEBGL2"),o.ibl&&a.push(["ROUGHNESS_STEP_COUNT",8..toFixed(2)]),o.orthographic&&s.push("ORTHOGRAPHIC"),macros_str=a.map(t=>`#define ${t[0]} ${t[1]}`).join("\n"),define_str=s.map(t=>"#define "+t).join("\n"),const_str=h.map(t=>`const ${t[0]} ${t[1]}=${t[2]};`).join("\n"),ext_str=[].map(t=>`#extension ${t}: enable`).join("\n"),shaderSrc=`#version ${r}\n${ext_str}\n${define_str}\n${const_str}\n${macros_str}\n\n\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n \n${e}\n `;let c=t.createShader(i);return t.shaderSource(c,shaderSrc),t.compileShader(c),t.getShaderParameter(c,t.COMPILE_STATUS)?c:(alert(t.getShaderInfoLog(c)),null)}function ct(e,i,n,r=t.ARRAY_BUFFER){return e.length>0&&(0==i&&(i=t.createBuffer(),n=!0),t.bindBuffer(r,i),n&&t.bufferData(r,e,t.STATIC_DRAW)),i}function dt(e,i,n=e.indices){if(0==e.indices.length)return;let r=i!=ge;!function(e,i){let n=i==ge;t.useProgram(i),t.enableVertexAttribArray(yt),n&&t.enableVertexAttribArray(Lt);let r=!n&&l.length>0;r&&t.enableVertexAttribArray(At);t.enableVertexAttribArray(Et),i.projViewMatUniform=t.getUniformLocation(i,"projViewMat"),i.viewMatUniform=t.getUniformLocation(i,"viewMat"),i.normMatUniform=t.getUniformLocation(i,"normMat"),(i==Me||i==be)&&t.enableVertexAttribArray(It);if(r)for(let t=0;t<l.length;++t)l[t].setUniform(i,t);for(let t=0;t<e.materials.length;++t)e.materials[t].setUniform(i,t);t.uniformMatrix4fv(i.projViewMatUniform,!1,E),t.uniformMatrix4fv(i.viewMatUniform,!1,A),t.uniformMatrix3fv(i.normMatUniform,!1,I)}(e,i),null!=W&&(t.activeTexture(t.TEXTURE0),t.bindTexture(t.TEXTURE_2D,j),t.uniform1i(t.getUniformLocation(i,"reflBRDFSampler"),0),t.activeTexture(t.TEXTURE1),t.bindTexture(t.TEXTURE_2D,W),t.uniform1i(t.getUniformLocation(i,"diffuseSampler"),1),t.activeTexture(t.TEXTURE2),t.bindTexture(t.TEXTURE_2D,G),t.uniform1i(t.getUniformLocation(i,"reflImgSampler"),2));let s=U||e.partial||!e.rendered;e.verticesBuffer=ct(new Float32Array(e.vertices),e.verticesBuffer,s),t.vertexAttribPointer(yt,3,t.FLOAT,!1,r?24:16,0),r?l.length>0&&t.vertexAttribPointer(At,3,t.FLOAT,!1,24,12):t.vertexAttribPointer(Lt,1,t.FLOAT,!1,16,12),e.materialsBuffer=ct(new Int16Array(e.materialIndices),e.materialsBuffer,s),t.vertexAttribPointer(Et,1,t.SHORT,!1,2,0),i!=Me&&i!=be||(e.colorsBuffer=ct(new Float32Array(e.colors),e.colorsBuffer,s),t.vertexAttribPointer(It,4,t.FLOAT,!0,0,0)),e.indicesBuffer=ct($?new Uint32Array(n):new Uint16Array(n),e.indicesBuffer,s,t.ELEMENT_ARRAY_BUFFER),e.rendered=!0,t.drawElements(r?V?t.LINES:e.type:t.POINTS,n.length,$?t.UNSIGNED_INT:t.UNSIGNED_SHORT,0)}class mt{constructor(t){this.type=t||q,this.verticesBuffer=0,this.materialsBuffer=0,this.colorsBuffer=0,this.indicesBuffer=0,this.rendered=!1,this.partial=!1,this.clear()}clear(){this.vertices=[],this.materialIndices=[],this.colors=[],this.indices=[],this.nvertices=0,this.materials=[],this.materialTable=[]}vertex(t,e){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.materialIndices.push(it),this.nvertices++}Vertex(t,e,i=[0,0,0,0]){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e[0]),this.vertices.push(e[1]),this.vertices.push(e[2]),this.materialIndices.push(it),this.colors.push(i[0]),this.colors.push(i[1]),this.colors.push(i[2]),this.colors.push(i[3]),this.nvertices++}vertex0(t,e){return this.vertices.push(t[0]),this.vertices.push(t[1]),this.vertices.push(t[2]),this.vertices.push(e),this.materialIndices.push(it),this.nvertices++}iVertex(t,e,i,n,r=[0,0,0,0]){let s=6*t;this.vertices[s]=e[0],this.vertices[s+1]=e[1],this.vertices[s+2]=e[2],this.vertices[s+3]=i[0],this.vertices[s+4]=i[1],this.vertices[s+5]=i[2],this.materialIndices[t]=it;let a=4*t;this.colors[a]=r[0],this.colors[a+1]=r[1],this.colors[a+2]=r[2],this.colors[a+3]=r[3],n&&this.indices.push(t)}append(t){ft(this.vertices,t.vertices),ft(this.materialIndices,t.materialIndices),ft(this.colors,t.colors),function(t,e,i){let n=t.length,r=e.length;t.length+=e.length;for(let s=0;s<r;++s)t[n+s]=e[s]+i}(this.indices,t.indices,this.nvertices),this.nvertices+=t.nvertices}}function ft(t,e){let i=t.length,n=e.length;t.length+=n;for(let r=0;r<n;++r)t[i+r]=e[r]}class ut{constructor(){this.data=new mt,this.Onscreen=!1,this.m=[]}offscreen(t){let e=E,i=t[0],n=i[0],r=i[1],s=i[2],a=1/(e[3]*n+e[7]*r+e[11]*s+e[15]);this.x=this.X=(e[0]*n+e[4]*r+e[8]*s+e[12])*a,this.y=this.Y=(e[1]*n+e[5]*r+e[9]*s+e[13])*a;for(let i=1,n=t.length;i<n;++i){let n=t[i],r=n[0],s=n[1],a=n[2],o=1/(e[3]*r+e[7]*s+e[11]*a+e[15]),h=(e[0]*r+e[4]*s+e[8]*a+e[12])*o,l=(e[1]*r+e[5]*s+e[9]*a+e[13])*o;h<this.x?this.x=h:h>this.X&&(this.X=h),l<this.y?this.y=l:l>this.Y&&(this.Y=l)}return(this.X<-1.01||this.x>1.01||this.Y<-1.01||this.y>1.01)&&(this.Onscreen=!1,!0)}T(t){let e=this.c[0],i=this.c[1],n=this.c[2],r=t[0]-e,s=t[1]-i,a=t[2]-n;return[r*I[0]+s*I[3]+a*I[6]+e,r*I[1]+s*I[4]+a*I[7]+i,r*I[2]+s*I[5]+a*I[8]+n]}Tcorners(t,e){return[this.T(t),this.T([t[0],t[1],e[2]]),this.T([t[0],e[1],t[2]]),this.T([t[0],e[1],e[2]]),this.T([e[0],t[1],t[2]]),this.T([e[0],t[1],e[2]]),this.T([e[0],e[1],t[2]]),this.T(e)]}setMaterial(t,e){null==t.materialTable[this.MaterialIndex]&&(t.materials.length>=m&&(t.partial=!0,e()),t.materialTable[this.MaterialIndex]=t.materials.length,t.materials.push(c[this.MaterialIndex])),it=t.materialTable[this.MaterialIndex]}render(){let t;var e,i;if(this.setMaterialIndex(),0==this.CenterIndex?(e=this.Min,i=this.Max,t=[e,[e[0],e[1],i[2]],[e[0],i[1],e[2]],[e[0],i[1],i[2]],[i[0],e[1],e[2]],[i[0],e[1],i[2]],[i[0],i[1],e[2]],i]):(this.c=o.Centers[this.CenterIndex-1],t=this.Tcorners(this.Min,this.Max)),this.offscreen(t))return this.data.clear(),void this.notRendered();let n,r=this.controlpoints;if(0==this.CenterIndex){if(!U&&this.Onscreen)return void this.append();n=r}else{let t=r.length;n=Array(t);for(let e=0;e<t;++e)n[e]=this.T(r[e])}let s=o.orthographic?1:this.Min[2]/o.maxBound[2],a=.75*Math.hypot(s*(S.xmax-S.xmin),s*(S.ymax-S.ymin))/b;this.res2=a*a,this.Epsilon=.1*a,this.data.clear(),this.notRendered(),this.Onscreen=!0,this.process(n)}}function pt(t,e){let i=t[0],n=t.length;for(let r=1;r<n;++r)i=e(i,t[r]);return i}class vt extends ut{constructor(t,e,i,n,r,s){super(),this.controlpoints=t,this.CenterIndex=e,this.MaterialIndex=i,this.color=n;let a=t.length;if(n){let t=n[0][3]+n[1][3]+n[2][3];this.transparent=16==a||4==a?t+n[3][3]<4:t<3}else this.transparent=c[i].diffuse[3]<1;this.vertex=this.transparent?this.data.Vertex.bind(this.data):this.data.vertex.bind(this.data);let o=this.L2norm2(this.controlpoints),h=Math.sqrt(1e3*Number.EPSILON*o);this.epsilon=o*Number.EPSILON,this.Min=r||this.Bounds(this.controlpoints,Math.min,h),this.Max=s||this.Bounds(this.controlpoints,Math.max,h)}setMaterialIndex(){this.transparent?this.setMaterial(tt,Le):this.color?this.setMaterial(J,Ee):this.setMaterial(Q,Ae)}cornerbound(t,e){let i=e(t[0],t[3]);return i=e(i,t[12]),e(i,t[15])}controlbound(t,e){let i=e(t[1],t[2]);return i=e(i,t[4]),i=e(i,t[5]),i=e(i,t[6]),i=e(i,t[7]),i=e(i,t[8]),i=e(i,t[9]),i=e(i,t[10]),i=e(i,t[11]),i=e(i,t[13]),e(i,t[14])}bound(t,e,i,n,r){if(i=e(i,this.cornerbound(t,e)),e(-1,1)*(i-this.controlbound(t,e))>=-n||0==r)return i;--r,n*=2;let s=new Ot(t[0],t[1],t[2],t[3]),a=new Ot(t[4],t[5],t[6],t[7]),o=new Ot(t[8],t[9],t[10],t[11]),h=new Ot(t[12],t[13],t[14],t[15]),l=new Ot(t[0],t[4],t[8],t[12]),c=new Ot(s.m0,a.m0,o.m0,h.m0),d=new Ot(s.m3,a.m3,o.m3,h.m3),m=new Ot(s.m5,a.m5,o.m5,h.m5),f=new Ot(s.m4,a.m4,o.m4,h.m4),u=new Ot(s.m2,a.m2,o.m2,h.m2),p=new Ot(t[3],t[7],t[11],t[15]),v=[t[0],s.m0,s.m3,s.m5,l.m0,c.m0,d.m0,m.m0,l.m3,c.m3,d.m3,m.m3,l.m5,c.m5,d.m5,m.m5];i=this.bound(v,e,i,n,r);let x=[l.m5,c.m5,d.m5,m.m5,l.m4,c.m4,d.m4,m.m4,l.m2,c.m2,d.m2,m.m2,t[12],h.m0,h.m3,h.m5];i=this.bound(x,e,i,n,r);let g=[m.m5,f.m5,u.m5,p.m5,m.m4,f.m4,u.m4,p.m4,m.m2,f.m2,u.m2,p.m2,h.m5,h.m4,h.m2,t[15]];i=this.bound(g,e,i,n,r);let w=[s.m5,s.m4,s.m2,t[3],m.m0,f.m0,u.m0,p.m0,m.m3,f.m3,u.m3,p.m3,m.m5,f.m5,u.m5,p.m5];return this.bound(w,e,i,n,r)}cornerboundtri(t,e){let i=e(t[0],t[6]);return e(i,t[9])}controlboundtri(t,e){let i=e(t[1],t[2]);return i=e(i,t[3]),i=e(i,t[4]),i=e(i,t[5]),i=e(i,t[7]),e(i,t[8])}boundtri(t,e,i,n,r){if(i=e(i,this.cornerboundtri(t,e)),e(-1,1)*(i-this.controlboundtri(t,e))>=-n||0==r)return i;--r,n*=2;let s=new Pt(t),a=[s.l003,s.l102,s.l012,s.l201,s.l111,s.l021,s.l300,s.l210,s.l120,s.l030];i=this.boundtri(a,e,i,n,r);let o=[s.l300,s.r102,s.r012,s.r201,s.r111,s.r021,s.r300,s.r210,s.r120,s.r030];i=this.boundtri(o,e,i,n,r);let h=[s.l030,s.u102,s.u012,s.u201,s.u111,s.u021,s.r030,s.u210,s.u120,s.u030];i=this.boundtri(h,e,i,n,r);let l=[s.r030,s.u201,s.r021,s.u102,s.c111,s.r012,s.l030,s.l120,s.l210,s.l300];return this.boundtri(l,e,i,n,r)}Bounds(t,e,i){let n=Array(3),r=t.length,s=Array(r);for(let a=0;a<3;++a){for(let e=0;e<r;++e)s[e]=t[e][a];n[a]=16==r?this.bound(s,e,s[0],i,p):10==r?this.boundtri(s,e,s[0],i,p):pt(s,e)}return[n[0],n[1],n[2]]}L2norm2(t){let e=t[0],i=0,n=t.length;for(let r=1;r<n;++r)i=Math.max(i,Ut([t[r][0]-e[0],t[r][1]-e[1],t[r][2]-e[2]]));return i}processTriangle(t){let e=t[0],i=t[1],n=t[2],r=St(Bt([i[0]-e[0],i[1]-e[1],i[2]-e[2]],[n[0]-e[0],n[1]-e[1],n[2]-e[2]]));if(!this.offscreen([e,i,n])){let t,s,a;this.color?(t=this.data.Vertex(e,r,this.color[0]),s=this.data.Vertex(i,r,this.color[1]),a=this.data.Vertex(n,r,this.color[2])):(t=this.vertex(e,r),s=this.vertex(i,r),a=this.vertex(n,r)),0==V?(this.data.indices.push(t),this.data.indices.push(s),this.data.indices.push(a)):(this.data.indices.push(t),this.data.indices.push(s),this.data.indices.push(s),this.data.indices.push(a),this.data.indices.push(a),this.data.indices.push(t)),this.append()}}processQuad(t){let e=t[0],i=t[1],n=t[2],r=t[3],s=Bt([i[0]-e[0],i[1]-e[1],i[2]-e[2]],[n[0]-i[0],n[1]-i[1],n[2]-i[2]]),a=Bt([n[0]-r[0],n[1]-r[1],n[2]-r[2]],[r[0]-e[0],r[1]-e[1],r[2]-e[2]]),o=St([s[0]+a[0],s[1]+a[1],s[2]+a[2]]);if(!this.offscreen([e,i,n,r])){let t,s,a,h;this.color?(t=this.data.Vertex(e,o,this.color[0]),s=this.data.Vertex(i,o,this.color[1]),a=this.data.Vertex(n,o,this.color[2]),h=this.data.Vertex(r,o,this.color[3])):(t=this.vertex(e,o),s=this.vertex(i,o),a=this.vertex(n,o),h=this.vertex(r,o)),0==V?(this.data.indices.push(t),this.data.indices.push(s),this.data.indices.push(a),this.data.indices.push(t),this.data.indices.push(a),this.data.indices.push(h)):(this.data.indices.push(t),this.data.indices.push(s),this.data.indices.push(s),this.data.indices.push(a),this.data.indices.push(a),this.data.indices.push(h),this.data.indices.push(h),this.data.indices.push(t)),this.append()}}curve(t,e,i,n,r){new wt([t[e],t[i],t[n],t[r]],0,it,this.Min,this.Max).render()}process(t){if(this.transparent&&1!=V&&(it=this.color?-1-it:1+it),10==t.length)return this.process3(t);if(3==t.length)return this.processTriangle(t);if(4==t.length)return this.processQuad(t);if(1==V)return this.curve(t,0,4,8,12),this.curve(t,12,13,14,15),this.curve(t,15,11,7,3),void this.curve(t,3,2,1,0);let e=t[0],i=t[3],n=t[12],r=t[15],s=this.normal(i,t[2],t[1],e,t[4],t[8],n);Ut(s)<this.epsilon&&(s=this.normal(i,t[2],t[1],e,t[13],t[14],r),Ut(s)<this.epsilon&&(s=this.normal(r,t[11],t[7],i,t[4],t[8],n)));let a=this.normal(e,t[4],t[8],n,t[13],t[14],r);Ut(a)<this.epsilon&&(a=this.normal(e,t[4],t[8],n,t[11],t[7],i),Ut(a)<this.epsilon&&(a=this.normal(i,t[2],t[1],e,t[13],t[14],r)));let o=this.normal(n,t[13],t[14],r,t[11],t[7],i);Ut(o)<this.epsilon&&(o=this.normal(n,t[13],t[14],r,t[2],t[1],e),Ut(o)<this.epsilon&&(o=this.normal(e,t[4],t[8],n,t[11],t[7],i)));let h=this.normal(r,t[11],t[7],i,t[2],t[1],e);if(Ut(h)<this.epsilon&&(h=this.normal(r,t[11],t[7],i,t[4],t[8],n),Ut(h)<this.epsilon&&(h=this.normal(n,t[13],t[14],r,t[2],t[1],e))),this.color){let l=this.color[0],c=this.color[1],d=this.color[2],m=this.color[3],f=this.data.Vertex(e,s,l),u=this.data.Vertex(n,a,c),p=this.data.Vertex(r,o,d),v=this.data.Vertex(i,h,m);this.Render(t,f,u,p,v,e,n,r,i,!1,!1,!1,!1,l,c,d,m)}else{let l=this.vertex(e,s),c=this.vertex(n,a),d=this.vertex(r,o),m=this.vertex(i,h);this.Render(t,l,c,d,m,e,n,r,i,!1,!1,!1,!1)}this.data.indices.length>0&&this.append()}append(){this.transparent?tt.append(this.data):this.color?J.append(this.data):Q.append(this.data)}notRendered(){this.transparent?tt.rendered=!1:this.color?J.rendered=!1:Q.rendered=!1}Render(t,e,i,n,r,s,a,o,h,l,c,d,m,f,u,p,v){let x=this.Distance(t);if(x[0]<this.res2&&x[1]<this.res2)this.offscreen([s,a,o])||(0==V?(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(n)):(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(i),this.data.indices.push(n))),this.offscreen([s,o,h])||(0==V?(this.data.indices.push(e),this.data.indices.push(n),this.data.indices.push(r)):(this.data.indices.push(n),this.data.indices.push(r),this.data.indices.push(r),this.data.indices.push(e)));else{if(this.offscreen(t))return;let g=t[0],w=t[3],M=t[12],b=t[15];if(x[0]<this.res2){let x=new _t(g,t[1],t[2],w),R=new _t(t[4],t[5],t[6],t[7]),T=new _t(t[8],t[9],t[10],t[11]),y=new _t(M,t[13],t[14],b),A=[g,x.m0,x.m3,x.m5,t[4],R.m0,R.m3,R.m5,t[8],T.m0,T.m3,T.m5,M,y.m0,y.m3,y.m5],E=[x.m5,x.m4,x.m2,w,R.m5,R.m4,R.m2,t[7],T.m5,T.m4,T.m2,t[11],y.m5,y.m4,y.m2,b],I=this.normal(A[12],A[13],A[14],A[15],A[11],A[7],A[3]);Ut(I)<=this.epsilon&&(I=this.normal(A[12],A[13],A[14],A[15],A[2],A[1],A[0]),Ut(I)<=this.epsilon&&(I=this.normal(A[0],A[4],A[8],A[12],A[11],A[7],A[3])));let L=this.normal(E[3],E[2],E[1],E[0],E[4],E[8],E[12]);Ut(L)<=this.epsilon&&(L=this.normal(E[3],E[2],E[1],E[0],E[13],E[14],E[15]),Ut(L)<=this.epsilon&&(L=this.normal(E[15],E[11],E[7],E[3],E[4],E[8],E[12])));let N=this.Epsilon,O=[.5*(a[0]+o[0]),.5*(a[1]+o[1]),.5*(a[2]+o[2])];if(!c)if(c=Ht(M,t[13],t[14],b)<this.res2){let t=St(this.differential(E[12],E[8],E[4],E[0]));O=[O[0]-N*t[0],O[1]-N*t[1],O[2]-N*t[2]]}else O=A[15];let _=[.5*(h[0]+s[0]),.5*(h[1]+s[1]),.5*(h[2]+s[2])];if(!m)if(m=Ht(g,t[1],t[2],w)<this.res2){let t=St(this.differential(A[3],A[7],A[11],A[15]));_=[_[0]-N*t[0],_[1]-N*t[1],_[2]-N*t[2]]}else _=E[0];if(f){let t=Array(4),x=Array(4);for(let e=0;e<4;++e)t[e]=.5*(u[e]+p[e]),x[e]=.5*(v[e]+f[e]);let g=this.data.Vertex(O,I,t),w=this.data.Vertex(_,L,x);this.Render(A,e,i,g,w,s,a,O,_,l,c,!1,m,f,u,t,x),this.Render(E,w,g,n,r,_,O,o,h,!1,c,d,m,x,t,p,v)}else{let t=this.vertex(O,I),f=this.vertex(_,L);this.Render(A,e,i,t,f,s,a,O,_,l,c,!1,m),this.Render(E,f,t,n,r,_,O,o,h,!1,c,d,m)}return}if(x[1]<this.res2){let x=new _t(g,t[4],t[8],M),R=new _t(t[1],t[5],t[9],t[13]),T=new _t(t[2],t[6],t[10],t[14]),y=new _t(w,t[7],t[11],b),A=[g,t[1],t[2],w,x.m0,R.m0,T.m0,y.m0,x.m3,R.m3,T.m3,y.m3,x.m5,R.m5,T.m5,y.m5],E=[x.m5,R.m5,T.m5,y.m5,x.m4,R.m4,T.m4,y.m4,x.m2,R.m2,T.m2,y.m2,M,t[13],t[14],b],I=this.normal(A[0],A[4],A[8],A[12],A[13],A[14],A[15]);Ut(I)<=this.epsilon&&(I=this.normal(A[0],A[4],A[8],A[12],A[11],A[7],A[3]),Ut(I)<=this.epsilon&&(I=this.normal(A[3],A[2],A[1],A[0],A[13],A[14],A[15])));let L=this.normal(E[15],E[11],E[7],E[3],E[2],E[1],E[0]);Ut(L)<=this.epsilon&&(L=this.normal(E[15],E[11],E[7],E[3],E[4],E[8],E[12]),Ut(L)<=this.epsilon&&(L=this.normal(E[12],E[13],E[14],E[15],E[2],E[1],E[0])));let N=this.Epsilon,O=[.5*(s[0]+a[0]),.5*(s[1]+a[1]),.5*(s[2]+a[2])];if(!l)if(l=Ht(g,t[4],t[8],M)<this.res2){let t=St(this.differential(E[0],E[1],E[2],E[3]));O=[O[0]-N*t[0],O[1]-N*t[1],O[2]-N*t[2]]}else O=A[12];let _=[.5*(o[0]+h[0]),.5*(o[1]+h[1]),.5*(o[2]+h[2])];if(!d)if(d=Ht(b,t[11],t[7],w)<this.res2){let t=St(this.differential(A[15],A[14],A[13],A[12]));_=[_[0]-N*t[0],_[1]-N*t[1],_[2]-N*t[2]]}else _=E[3];if(f){let t=Array(4),x=Array(4);for(let e=0;e<4;++e)t[e]=.5*(f[e]+u[e]),x[e]=.5*(p[e]+v[e]);let g=this.data.Vertex(O,I,t),w=this.data.Vertex(_,L,x);this.Render(A,e,g,w,r,s,O,_,h,l,!1,d,m,f,t,x,v),this.Render(E,g,i,n,w,O,a,o,_,l,c,d,!1,t,u,p,x)}else{let t=this.vertex(O,I),f=this.vertex(_,L);this.Render(A,e,t,f,r,s,O,_,h,l,!1,d,m),this.Render(E,t,i,n,f,O,a,o,_,l,c,d,!1)}return}let R=new _t(g,t[1],t[2],w),T=new _t(t[4],t[5],t[6],t[7]),y=new _t(t[8],t[9],t[10],t[11]),A=new _t(M,t[13],t[14],b),E=new _t(g,t[4],t[8],M),I=new _t(R.m0,T.m0,y.m0,A.m0),L=new _t(R.m3,T.m3,y.m3,A.m3),N=new _t(R.m5,T.m5,y.m5,A.m5),O=new _t(R.m4,T.m4,y.m4,A.m4),_=new _t(R.m2,T.m2,y.m2,A.m2),P=new _t(w,t[7],t[11],b),S=[g,R.m0,R.m3,R.m5,E.m0,I.m0,L.m0,N.m0,E.m3,I.m3,L.m3,N.m3,E.m5,I.m5,L.m5,N.m5],U=[E.m5,I.m5,L.m5,N.m5,E.m4,I.m4,L.m4,N.m4,E.m2,I.m2,L.m2,N.m2,M,A.m0,A.m3,A.m5],V=[N.m5,O.m5,_.m5,P.m5,N.m4,O.m4,_.m4,P.m4,N.m2,O.m2,_.m2,P.m2,A.m5,A.m4,A.m2,b],B=[R.m5,R.m4,R.m2,w,N.m0,O.m0,_.m0,P.m0,N.m3,O.m3,_.m3,P.m3,N.m5,O.m5,_.m5,P.m5],C=S[15],D=this.normal(S[0],S[4],S[8],S[12],S[13],S[14],S[15]);Ut(D)<this.epsilon&&(D=this.normal(S[0],S[4],S[8],S[12],S[11],S[7],S[3]),Ut(D)<this.epsilon&&(D=this.normal(S[3],S[2],S[1],S[0],S[13],S[14],S[15])));let F=this.normal(U[12],U[13],U[14],U[15],U[11],U[7],U[3]);Ut(F)<this.epsilon&&(F=this.normal(U[12],U[13],U[14],U[15],U[2],U[1],U[0]),Ut(F)<this.epsilon&&(F=this.normal(U[0],U[4],U[8],U[12],U[11],U[7],U[3])));let z=this.normal(V[15],V[11],V[7],V[3],V[2],V[1],V[0]);Ut(z)<this.epsilon&&(z=this.normal(V[15],V[11],V[7],V[3],V[4],V[8],V[12]),Ut(z)<this.epsilon&&(z=this.normal(V[12],V[13],V[14],V[15],V[2],V[1],V[0])));let H=this.normal(B[3],B[2],B[1],B[0],B[4],B[8],B[12]);Ut(H)<this.epsilon&&(H=this.normal(B[3],B[2],B[1],B[0],B[13],B[14],B[15]),Ut(H)<this.epsilon&&(H=this.normal(B[15],B[11],B[7],B[3],B[4],B[8],B[12])));let X=this.normal(V[3],V[2],V[1],C,V[4],V[8],V[12]),G=this.Epsilon,W=[.5*(s[0]+a[0]),.5*(s[1]+a[1]),.5*(s[2]+a[2])];if(!l)if(l=Ht(g,t[4],t[8],M)<this.res2){let t=St(this.differential(U[0],U[1],U[2],U[3]));W=[W[0]-G*t[0],W[1]-G*t[1],W[2]-G*t[2]]}else W=S[12];let j=[.5*(a[0]+o[0]),.5*(a[1]+o[1]),.5*(a[2]+o[2])];if(!c)if(c=Ht(M,t[13],t[14],b)<this.res2){let t=St(this.differential(V[12],V[8],V[4],V[0]));j=[j[0]-G*t[0],j[1]-G*t[1],j[2]-G*t[2]]}else j=U[15];let k=[.5*(o[0]+h[0]),.5*(o[1]+h[1]),.5*(o[2]+h[2])];if(!d)if(d=Ht(b,t[11],t[7],w)<this.res2){let t=St(this.differential(B[15],B[14],B[13],B[12]));k=[k[0]-G*t[0],k[1]-G*t[1],k[2]-G*t[2]]}else k=V[3];let Y=[.5*(h[0]+s[0]),.5*(h[1]+s[1]),.5*(h[2]+s[2])];if(!m)if(m=Ht(g,t[1],t[2],w)<this.res2){let t=St(this.differential(S[3],S[7],S[11],S[15]));Y=[Y[0]-G*t[0],Y[1]-G*t[1],Y[2]-G*t[2]]}else Y=B[0];if(f){let t=Array(4),x=Array(4),g=Array(4),w=Array(4),M=Array(4);for(let e=0;e<4;++e)t[e]=.5*(f[e]+u[e]),x[e]=.5*(u[e]+p[e]),g[e]=.5*(p[e]+v[e]),w[e]=.5*(v[e]+f[e]),M[e]=.5*(t[e]+g[e]);let b=this.data.Vertex(W,D,t),R=this.data.Vertex(j,F,x),T=this.data.Vertex(k,z,g),y=this.data.Vertex(Y,H,w),A=this.data.Vertex(C,X,M);this.Render(S,e,b,A,y,s,W,C,Y,l,!1,!1,m,f,t,M,w),this.Render(U,b,i,R,A,W,a,j,C,l,c,!1,!1,t,u,x,M),this.Render(V,A,R,n,T,C,j,o,k,!1,c,d,!1,M,x,p,g),this.Render(B,y,A,T,r,Y,C,k,h,!1,!1,d,m,w,M,g,v)}else{let t=this.vertex(W,D),f=this.vertex(j,F),u=this.vertex(k,z),p=this.vertex(Y,H),v=this.vertex(C,X);this.Render(S,e,t,v,p,s,W,C,Y,l,!1,!1,m),this.Render(U,t,i,f,v,W,a,j,C,l,c,!1,!1),this.Render(V,v,f,n,u,C,j,o,k,!1,c,d,!1),this.Render(B,p,v,u,r,Y,C,k,h,!1,!1,d,m)}}}process3(t){if(1==V)return this.curve(t,0,1,3,6),this.curve(t,6,7,8,9),void this.curve(t,9,5,2,0);let e=t[0],i=t[6],n=t[9],r=this.normal(n,t[5],t[2],e,t[1],t[3],i),s=this.normal(e,t[1],t[3],i,t[7],t[8],n),a=this.normal(i,t[7],t[8],n,t[5],t[2],e);if(this.color){let o=this.color[0],h=this.color[1],l=this.color[2],c=this.data.Vertex(e,r,o),d=this.data.Vertex(i,s,h),m=this.data.Vertex(n,a,l);this.Render3(t,c,d,m,e,i,n,!1,!1,!1,o,h,l)}else{let o=this.vertex(e,r),h=this.vertex(i,s),l=this.vertex(n,a);this.Render3(t,o,h,l,e,i,n,!1,!1,!1)}this.data.indices.length>0&&this.append()}Render3(t,e,i,n,r,s,a,o,h,l,c,d,m){if(this.Distance3(t)<this.res2)this.offscreen([r,s,a])||(0==V?(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(n)):(this.data.indices.push(e),this.data.indices.push(i),this.data.indices.push(i),this.data.indices.push(n),this.data.indices.push(n),this.data.indices.push(e)));else{if(this.offscreen(t))return;let f=t[0],u=t[1],p=t[2],v=t[3],x=t[4],g=t[5],w=t[6],M=t[7],b=t[8],R=t[9],T=[.5*(R[0]+g[0]),.5*(R[1]+g[1]),.5*(R[2]+g[2])],y=[.5*(R[0]+b[0]),.5*(R[1]+b[1]),.5*(R[2]+b[2])],A=[.5*(g[0]+p[0]),.5*(g[1]+p[1]),.5*(g[2]+p[2])],E=[.5*(b[0]+x[0]),.5*(b[1]+x[1]),.5*(b[2]+x[2])],I=[.5*(b[0]+M[0]),.5*(b[1]+M[1]),.5*(b[2]+M[2])],L=[.5*(p[0]+x[0]),.5*(p[1]+x[1]),.5*(p[2]+x[2])],N=[.5*(p[0]+f[0]),.5*(p[1]+f[1]),.5*(p[2]+f[2])],O=[.5*(x[0]+v[0]),.5*(x[1]+v[1]),.5*(x[2]+v[2])],_=[.5*(M[0]+w[0]),.5*(M[1]+w[1]),.5*(M[2]+w[2])],P=[.5*(f[0]+u[0]),.5*(f[1]+u[1]),.5*(f[2]+u[2])],S=[.5*(u[0]+v[0]),.5*(u[1]+v[1]),.5*(u[2]+v[2])],U=[.5*(v[0]+w[0]),.5*(v[1]+w[1]),.5*(v[2]+w[2])],V=[.5*(T[0]+A[0]),.5*(T[1]+A[1]),.5*(T[2]+A[2])],B=[.5*(y[0]+I[0]),.5*(y[1]+I[1]),.5*(y[2]+I[2])],C=[.5*(A[0]+N[0]),.5*(A[1]+N[1]),.5*(A[2]+N[2])],D=[.5*E[0]+.25*(x[0]+u[0]),.5*E[1]+.25*(x[1]+u[1]),.5*E[2]+.25*(x[2]+u[2])],F=[.5*(I[0]+_[0]),.5*(I[1]+_[1]),.5*(I[2]+_[2])],z=[.5*L[0]+.25*(x[0]+M[0]),.5*L[1]+.25*(x[1]+M[1]),.5*L[2]+.25*(x[2]+M[2])],H=[.25*(g[0]+x[0])+.5*O[0],.25*(g[1]+x[1])+.5*O[1],.25*(g[2]+x[2])+.5*O[2]],X=[.5*(P[0]+S[0]),.5*(P[1]+S[1]),.5*(P[2]+S[2])],G=[.5*(S[0]+U[0]),.5*(S[1]+U[1]),.5*(S[2]+U[2])],W=[.5*(z[0]+X[0]),.5*(z[1]+X[1]),.5*(z[2]+X[2])],j=[.5*(z[0]+G[0]),.5*(z[1]+G[1]),.5*(z[2]+G[2])],k=[.5*(X[0]+G[0]),.5*(X[1]+G[1]),.5*(X[2]+G[2])],Y=[.5*(H[0]+F[0]),.5*(H[1]+F[1]),.5*(H[2]+F[2])],$=[.5*(B[0]+H[0]),.5*(B[1]+H[1]),.5*(B[2]+H[2])],q=[.5*(B[0]+F[0]),.5*(B[1]+F[1]),.5*(B[2]+F[2])],K=[.5*(V[0]+D[0]),.5*(V[1]+D[1]),.5*(V[2]+D[2])],Z=[.5*(C[0]+D[0]),.5*(C[1]+D[1]),.5*(C[2]+D[2])],Q=[.5*(V[0]+C[0]),.5*(V[1]+C[1]),.5*(V[2]+C[2])],J=[f,P,N,X,[.5*(L[0]+P[0]),.5*(L[1]+P[1]),.5*(L[2]+P[2])],C,k,W,Z,Q],tt=[k,G,j,U,[.5*(O[0]+_[0]),.5*(O[1]+_[1]),.5*(O[2]+_[2])],Y,w,_,F,q],et=[Q,K,V,$,[.5*(T[0]+E[0]),.5*(T[1]+E[1]),.5*(T[2]+E[2])],T,q,B,y,R],it=[q,$,Y,K,[.25*(A[0]+I[0]+S[0]+x[0]),.25*(A[1]+I[1]+S[1]+x[1]),.25*(A[2]+I[2]+S[2]+x[2])],j,Q,Z,W,k],nt=this.normal(k,j,Y,q,$,K,Q),rt=this.normal(q,$,K,Q,Z,W,k),st=this.normal(Q,Z,W,k,j,Y,q),at=this.Epsilon,ot=[.5*(s[0]+a[0]),.5*(s[1]+a[1]),.5*(s[2]+a[2])];if(!o)if(o=Ht(w,M,b,R)<this.res2){let t=St(this.sumdifferential(it[0],it[2],it[5],it[9],it[1],it[3],it[6]));ot=[ot[0]-at*t[0],ot[1]-at*t[1],ot[2]-at*t[2]]}else ot=q;let ht=[.5*(a[0]+r[0]),.5*(a[1]+r[1]),.5*(a[2]+r[2])];if(!h)if(h=Ht(f,p,g,R)<this.res2){let t=St(this.sumdifferential(it[6],it[3],it[1],it[0],it[7],it[8],it[9]));ht=[ht[0]-at*t[0],ht[1]-at*t[1],ht[2]-at*t[2]]}else ht=Q;let lt=[.5*(r[0]+s[0]),.5*(r[1]+s[1]),.5*(r[2]+s[2])];if(!l)if(l=Ht(f,u,v,w)<this.res2){let t=St(this.sumdifferential(it[9],it[8],it[7],it[6],it[5],it[2],it[0]));lt=[lt[0]-at*t[0],lt[1]-at*t[1],lt[2]-at*t[2]]}else lt=k;if(c){let t=Array(4),f=Array(4),u=Array(4);for(let e=0;e<4;++e)t[e]=.5*(d[e]+m[e]),f[e]=.5*(m[e]+c[e]),u[e]=.5*(c[e]+d[e]);let p=this.data.Vertex(ot,nt,t),v=this.data.Vertex(ht,rt,f),x=this.data.Vertex(lt,st,u);this.Render3(J,e,x,v,r,lt,ht,!1,h,l,c,u,f),this.Render3(tt,x,i,p,lt,s,ot,o,!1,l,u,d,t),this.Render3(et,v,p,n,ht,ot,a,o,h,!1,f,t,m),this.Render3(it,p,v,x,ot,ht,lt,!1,!1,!1,t,f,u)}else{let t=this.vertex(ot,nt),c=this.vertex(ht,rt),d=this.vertex(lt,st);this.Render3(J,e,d,c,r,lt,ht,!1,h,l),this.Render3(tt,d,i,t,lt,s,ot,o,!1,l),this.Render3(et,c,t,n,ht,ot,a,o,h,!1),this.Render3(it,t,c,d,ot,ht,lt,!1,!1,!1)}}}Distance(t){let e=t[0],i=t[3],n=t[12],r=t[15],s=Xt(e,n,i,r);s=Math.max(s,Ht(e,t[4],t[8],n)),s=Math.max(s,Ht(t[1],t[5],t[9],t[13])),s=Math.max(s,Ht(i,t[7],t[11],r)),s=Math.max(s,Ht(t[2],t[6],t[10],t[14]));let a=Xt(e,i,n,r);return a=Math.max(a,Ht(e,t[1],t[2],i)),a=Math.max(a,Ht(t[4],t[5],t[6],t[7])),a=Math.max(a,Ht(t[8],t[9],t[10],t[11])),a=Math.max(a,Ht(n,t[13],t[14],r)),[s,a]}Distance3(t){let e=t[0],i=t[4],n=t[6],r=t[9],s=Ut([(e[0]+n[0]+r[0])*(1/3)-i[0],(e[1]+n[1]+r[1])*(1/3)-i[1],(e[2]+n[2]+r[2])*(1/3)-i[2]]);return s=Math.max(s,Ht(e,t[1],t[3],n)),s=Math.max(s,Ht(e,t[2],t[5],r)),Math.max(s,Ht(n,t[7],t[8],r))}differential(t,e,i,n){let r=[3*(e[0]-t[0]),3*(e[1]-t[1]),3*(e[2]-t[2])];return Ut(r)>this.epsilon?r:(r=Ft(t,e,i),Ut(r)>this.epsilon?r:zt(t,e,i,n))}sumdifferential(t,e,i,n,r,s,a){let o=this.differential(t,e,i,n),h=this.differential(t,r,s,a);return[o[0]+h[0],o[1]+h[1],o[2]+h[2]]}normal(t,e,i,n,r,s,a){let o=3*(r[0]-n[0]),h=3*(r[1]-n[1]),l=3*(r[2]-n[2]),c=3*(i[0]-n[0]),d=3*(i[1]-n[1]),m=3*(i[2]-n[2]),f=[h*m-l*d,l*c-o*m,o*d-h*c];if(Ut(f)>this.epsilon)return f;let u=[c,d,m],p=[o,h,l],v=Ft(n,i,e),x=Ft(n,r,s),g=Bt(x,u),w=Bt(p,v);if(f=[g[0]+w[0],g[1]+w[1],g[2]+w[2]],Ut(f)>this.epsilon)return f;let M=zt(n,i,e,t),b=zt(n,r,s,a);g=Bt(p,M),w=Bt(b,u);let R=Bt(x,v);return f=[g[0]+w[0]+R[0],g[1]+w[1]+R[1],g[2]+w[2]+R[2]],Ut(f)>this.epsilon?f:(g=Bt(b,v),w=Bt(x,M),f=[g[0]+w[0],g[1]+w[1],g[2]+w[2]],Ut(f)>this.epsilon?f:Bt(b,M))}}function xt(t){return 0<=t&&t<=1}class gt{constructor(t,e,i){const n=1e3*Number.EPSILON,r=n*n;if(Math.abs(t)<=n*Math.abs(e)+r*Math.abs(i))Math.abs(e)>n*Math.abs(i)?(this.roots=1,this.t1=-i/e):0==i?(this.roots=1,this.t1=0):this.roots=0;else{let r=.5*e/t,s=e*r;if(Math.abs(s)<=n*Math.abs(i)){let e=-i/t;e>=0?(this.roots=2,this.t2=Math.sqrt(e),this.t1=-this.t2):this.roots=0}else{let t=-2*i/s;if(t>-1){this.roots=2;let e=r*function(t){return t/(Math.sqrt(1+t)+1)}(t),i=-e-2*r;i<=e?(this.t1=i,this.t2=e):(this.t1=e,this.t2=i)}else-1==t?(this.roots=1,this.t1=this.t2=-r):this.roots=0}}}}class wt extends ut{constructor(t,e,i,n,r){if(super(),this.controlpoints=t,this.CenterIndex=e,this.MaterialIndex=i,n&&r)this.Min=n,this.Max=r;else{let t=this.Bounds(this.controlpoints);this.Min=t[0],this.Max=t[1]}}Bounds(t){let e=Array(3),i=Array(3),n=t.length,r=Array(n);for(let h=0;h<3;++h){for(let e=0;e<n;++e)r[e]=t[e][h];let l,c;if(l=c=r[0],4==n){l=Math.min(l,r[3]),c=Math.max(c,r[3]);let t=(s=r[0],a=r[1],o=r[2],[r[3]-s+3*(a-o),2*(s+o)-4*a,a-s]),e=new gt(t[0],t[1],t[2]);if(0!=e.roots&&xt(e.t1)){let t=Ct(r[0],r[1],r[2],r[3],e.t1);l=Math.min(l,t),c=Math.max(c,t)}if(2==e.roots&&xt(e.t2)){let t=Ct(r[0],r[1],r[2],r[3],e.t2);l=Math.min(l,t),c=Math.max(c,t)}}else{let t=r[1];l=Math.min(l,t),c=Math.max(c,t)}e[h]=l,i[h]=c}var s,a,o;return[[e[0],e[1],e[2]],[i[0],i[1],i[2]]]}setMaterialIndex(){this.setMaterial(Z,ye)}processLine(t){let e=t[0],i=t[1];if(!this.offscreen([e,i])){let t=[0,0,1];this.data.indices.push(this.data.vertex(e,t)),this.data.indices.push(this.data.vertex(i,t)),this.append()}}process(t){if(2==t.length)return this.processLine(t);let e=t[0],i=t[1],n=t[2],r=t[3],s=this.normal(Dt(e,i),Ft(e,i,n)),a=this.normal(Dt(n,r),Ft(r,n,i)),o=this.data.vertex(e,s),h=this.data.vertex(r,a);this.Render(t,o,h),this.data.indices.length>0&&this.append()}append(){Z.append(this.data)}notRendered(){Z.rendered=!1}Render(t,e,i){let n=t[0],r=t[1],s=t[2],a=t[3];if(Ht(n,r,s,a)<this.res2)this.offscreen([n,a])||(this.data.indices.push(e),this.data.indices.push(i));else{if(this.offscreen(t))return;let o=[.5*(n[0]+r[0]),.5*(n[1]+r[1]),.5*(n[2]+r[2])],h=[.5*(r[0]+s[0]),.5*(r[1]+s[1]),.5*(r[2]+s[2])],l=[.5*(s[0]+a[0]),.5*(s[1]+a[1]),.5*(s[2]+a[2])],c=[.5*(o[0]+h[0]),.5*(o[1]+h[1]),.5*(o[2]+h[2])],d=[.5*(h[0]+l[0]),.5*(h[1]+l[1]),.5*(h[2]+l[2])],m=[.5*(c[0]+d[0]),.5*(c[1]+d[1]),.5*(c[2]+d[2])],f=[n,o,c,m],u=[m,d,l,a],p=this.normal(function(t,e,i,n){return[i[0]+n[0]-t[0]-e[0],i[1]+n[1]-t[1]-e[1],i[2]+n[2]-t[2]-e[2]]}(n,r,s,a),function(t,e,i,n){return[3*t[0]-5*e[0]+i[0]+n[0],3*t[1]-5*e[1]+i[1]+n[1],3*t[2]-5*e[2]+i[2]+n[2]]}(n,r,s,a)),v=this.data.vertex(m,p);this.Render(f,e,v),this.Render(u,v,i)}}normal(t,e){let i=Vt(t,t),n=Vt(t,e);return[i*e[0]-n*t[0],i*e[1]-n*t[1],i*e[2]-n*t[2]]}}class Mt extends ut{constructor(t,e,i){super(),this.controlpoint=t,this.width=e,this.CenterIndex=0,this.MaterialIndex=i,this.Min=t,this.Max=t}setMaterialIndex(){this.setMaterial(K,Te)}process(t){this.data.indices.push(this.data.vertex0(this.controlpoint,this.width)),this.append()}append(){K.append(this.data)}notRendered(){K.rendered=!1}}class bt extends ut{constructor(t,e){super(),this.CenterIndex=t,this.MaterialIndex=e,this.controlpoints=window.Positions,this.Normals=window.Normals,this.Colors=window.Colors,this.Indices=window.Indices,this.transparent=c[this.MaterialIndex].diffuse[3]<1,this.Min=this.Bounds(this.controlpoints,Math.min),this.Max=this.Bounds(this.controlpoints,Math.max)}Bounds(t,e){let i=Array(3),n=t.length,r=Array(n);for(let s=0;s<3;++s){for(let e=0;e<n;++e)r[e]=t[e][s];i[s]=pt(r,e)}return[i[0],i[1],i[2]]}setMaterialIndex(){this.transparent?this.setMaterial(tt,Le):this.setMaterial(et,Ie)}process(t){this.data.vertices=new Array(6*t.length),it=this.Colors.length>0?-1-it:1+it;for(let e=0,i=this.Indices.length;e<i;++e){let i=this.Indices[e],n=i[0],r=t[n[0]],s=t[n[1]],a=t[n[2]],o=!this.offscreen([r,s,a]),h=i.length>1?i[1]:n;if(h&&0!=h.length||(h=n),this.Colors.length>0){let t=i.length>2?i[2]:n;t&&0!=t.length||(t=n);let e=this.Colors[t[0]],l=this.Colors[t[1]],c=this.Colors[t[2]];this.transparent|=e[3]+l[3]+c[3]<3,0==V?(this.data.iVertex(n[0],r,this.Normals[h[0]],o,e),this.data.iVertex(n[1],s,this.Normals[h[1]],o,l),this.data.iVertex(n[2],a,this.Normals[h[2]],o,c)):(this.data.iVertex(n[0],r,this.Normals[h[0]],o,e),this.data.iVertex(n[1],s,this.Normals[h[1]],o,l),this.data.iVertex(n[1],s,this.Normals[h[1]],o,l),this.data.iVertex(n[2],a,this.Normals[h[2]],o,c),this.data.iVertex(n[2],a,this.Normals[h[2]],o,c),this.data.iVertex(n[0],r,this.Normals[h[0]],o,e))}else 0==V?(this.data.iVertex(n[0],r,this.Normals[h[0]],o),this.data.iVertex(n[1],s,this.Normals[h[1]],o),this.data.iVertex(n[2],a,this.Normals[h[2]],o)):(this.data.iVertex(n[0],r,this.Normals[h[0]],o),this.data.iVertex(n[1],s,this.Normals[h[1]],o),this.data.iVertex(n[1],s,this.Normals[h[1]],o),this.data.iVertex(n[2],a,this.Normals[h[2]],o),this.data.iVertex(n[2],a,this.Normals[h[2]],o),this.data.iVertex(n[0],r,this.Normals[h[0]],o))}this.data.nvertices=t.length,this.data.indices.length>0&&this.append()}append(){this.transparent?tt.append(this.data):et.append(this.data)}notRendered(){this.transparent?tt.rendered=!1:et.rendered=!1}}function Rt(){M=-Math.tan(.5*o.angleOfView)*o.maxBound[2],_.x=_.y=0,_.z=.5*(o.minBound[2]+o.maxBound[2]),x=v=o.zoom0,S.zmin=o.minBound[2],S.zmax=o.maxBound[2],P.x=P.y=0,_e(),U=!0,Oe()}function Tt(){mat4.identity(T),Rt(),window.top.asyWebApplication&&window.top.asyWebApplication.setProjection(""),window.parent.asyProjection=!1}let yt=0,At=1,Et=2,It=3,Lt=4;function Nt(e=[]){let i=lt(t,vertex,t.VERTEX_SHADER,e),n=lt(t,fragment,t.FRAGMENT_SHADER,e),r=t.createProgram();return t.attachShader(r,i),t.attachShader(r,n),t.bindAttribLocation(r,yt,"position"),t.bindAttribLocation(r,At,"normal"),t.bindAttribLocation(r,Et,"materialIndex"),t.bindAttribLocation(r,It,"color"),t.bindAttribLocation(r,Lt,"width"),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialize shaders"),r}class Ot{constructor(t,e,i,n){this.m0=.5*(t+e);let r=.5*(e+i);this.m2=.5*(i+n),this.m3=.5*(this.m0+r),this.m4=.5*(r+this.m2),this.m5=.5*(this.m3+this.m4)}}class _t{constructor(t,e,i,n){this.m0=[.5*(t[0]+e[0]),.5*(t[1]+e[1]),.5*(t[2]+e[2])];let r=.5*(e[0]+i[0]),s=.5*(e[1]+i[1]),a=.5*(e[2]+i[2]);this.m2=[.5*(i[0]+n[0]),.5*(i[1]+n[1]),.5*(i[2]+n[2])],this.m3=[.5*(this.m0[0]+r),.5*(this.m0[1]+s),.5*(this.m0[2]+a)],this.m4=[.5*(r+this.m2[0]),.5*(s+this.m2[1]),.5*(a+this.m2[2])],this.m5=[.5*(this.m3[0]+this.m4[0]),.5*(this.m3[1]+this.m4[1]),.5*(this.m3[2]+this.m4[2])]}}class Pt{constructor(t){this.l003=t[0];let e=t[1],i=t[2],n=t[3],r=t[4],s=t[5];this.r300=t[6];let a=t[7],o=t[8];this.u030=t[9],this.u021=.5*(this.u030+s),this.u120=.5*(this.u030+o);let h=.5*(s+i),l=.5*(o+r),c=.5*(o+a),d=.5*(i+r);this.l012=.5*(i+this.l003);let m=.5*(r+n);this.r210=.5*(a+this.r300),this.l102=.5*(this.l003+e);let f=.5*(e+n);this.r201=.5*(n+this.r300),this.u012=.5*(this.u021+h),this.u210=.5*(this.u120+c),this.l021=.5*(h+this.l012);let u=.5*l+.25*(r+e);this.r120=.5*(c+this.r210);let p=.5*d+.25*(r+a),v=.25*(s+r)+.5*m;this.l201=.5*(this.l102+f),this.r102=.5*(f+this.r201),this.l210=.5*(p+this.l201),this.r012=.5*(p+this.r102),this.l300=.5*(this.l201+this.r102),this.r021=.5*(v+this.r120),this.u201=.5*(this.u210+v),this.r030=.5*(this.u210+this.r120),this.u102=.5*(this.u012+u),this.l120=.5*(this.l021+u),this.l030=.5*(this.u012+this.l021),this.l111=.5*(d+this.l102),this.r111=.5*(m+this.r210),this.u111=.5*(this.u021+l),this.c111=.25*(h+c+f+r)}}function St(t){let e=1/(Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2])||1);return[t[0]*e,t[1]*e,t[2]*e]}function Ut(t){return t[0]*t[0]+t[1]*t[1]+t[2]*t[2]}function Vt(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function Bt(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function Ct(t,e,i,n,r){let s=1-r,a=s*s;return a*s*t+r*(3*(a*e+r*s*i)+r*r*n)}function Dt(t,e){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function Ft(t,e,i){return[3*(t[0]+i[0])-6*e[0],3*(t[1]+i[1])-6*e[1],3*(t[2]+i[2])-6*e[2]]}function zt(t,e,i,n){return[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])]}function Ht(t,e,i,n){let r=[1/3*(n[0]-t[0]),1/3*(n[1]-t[1]),1/3*(n[2]-t[2])];return Math.max(Ut([e[0]-r[0]-t[0],e[1]-r[1]-t[1],e[2]-r[2]-t[2]]),Ut([n[0]-r[0]-i[0],n[1]-r[1]-i[1],n[2]-r[2]-i[2]]))}function Xt(t,e,i,n){let r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],s=[n[0]-i[0],n[1]-i[1],n[2]-i[2]];return Math.max(Ut(Bt(r,St(s))),Ut(Bt(s,St(r))))/9}function Gt(t){return[Math.min(t[0][0],t[1][0],t[2][0],t[3][0],t[4][0],t[5][0],t[6][0],t[7][0]),Math.min(t[0][1],t[1][1],t[2][1],t[3][1],t[4][1],t[5][1],t[6][1],t[7][1]),Math.min(t[0][2],t[1][2],t[2][2],t[3][2],t[4][2],t[5][2],t[6][2],t[7][2])]}function Wt(t){return[Math.max(t[0][0],t[1][0],t[2][0],t[3][0],t[4][0],t[5][0],t[6][0],t[7][0]),Math.max(t[0][1],t[1][1],t[2][1],t[3][1],t[4][1],t[5][1],t[6][1],t[7][1]),Math.max(t[0][2],t[1][2],t[2][2],t[3][2],t[4][2],t[5][2],t[6][2],t[7][2])]}function jt(t){oe||he(),B=!0,C=t.clientX,D=t.clientY}let kt,Yt,$t=!1;function qt(t){return Math.hypot(t[0].pageX-t[1].pageX,t[0].pageY-t[1].pageY)}function Kt(t){t.preventDefault(),oe||he();let e=t.targetTouches;pe=ve=$t=!1,ue||(1!=e.length||B||(Yt=(new Date).getTime(),touchId=e[0].identifier,C=e[0].pageX,D=e[0].pageY),2!=e.length||B||(touchId=e[0].identifier,kt=qt(e),$t=!0))}function Zt(t){B=!1}function Qt(t,e,i,n,r){if(t==i&&e==n)return;let[s,a]=function(t,e){let i=re(t),n=re(e),r=Vt(i,n);return[r>1?0:r<-1?f:Math.acos(r),St(Bt(i,n))]}([t,-e],[i,-n]);mat4.fromRotation(O,2*r*R*s/v,a),mat4.multiply(T,O,T)}function Jt(t,e,i,n){let r=1/v;P.x+=(i-t)*r*s,P.y-=(n-e)*r*a}function te(t,e,i,n){o.orthographic?Jt(t,e,i,n):(_.x+=(i-t)*(S.xmax-S.xmin),_.y-=(n-e)*(S.ymax-S.ymin))}function ee(){var t,e;t=A,e=T,mat4.fromTranslation(O,[_.x,_.y,_.z]),mat4.invert(N,O),mat4.multiply(t,e,N),mat4.multiply(t,O,t),mat4.translate(A,A,[_.x,_.y,0]),mat3.fromMat4(L,A),mat3.invert(I,L),mat4.multiply(E,y,A)}function ie(){let t=Math.sqrt(Number.MAX_VALUE),e=1/t;v<=e&&(v=e),v>=t&&(v=t),(1.5*v<x||v>1.5*x)&&(U=!0,x=v)}function ne(t){let e=o.zoomStep*a*t;const i=Math.log(.1*Number.MAX_VALUE)/Math.log(o.zoomFactor);Math.abs(e)<i&&(v*=o.zoomFactor**e,ie())}function re(t){let e=t[0],i=t[1],n=Math.hypot(e,i);return n>1&&(denom=1/n,e*=denom,i*=denom),[e,i,Math.sqrt(Math.max(1-i*i-e*e,0))]}function se(t,e,i,n){ne(e-n)}function ae(t,e,i,n=1){let r;switch(i){case 1:r=Qt;break;case 2:r=Jt;break;case 3:r=se;break;case 4:r=te;break;default:r=(t,e,i,n)=>{}}r((C-s)/s,(D-a)/a,(t-s)/s,(e-a)/a,n),C=t,D=e,_e(),Oe()}let oe=0;function he(){oe=1,o.canvas.addEventListener("wheel",me,!1)}function le(){let t,e,i;[t,e,i]=function(){let t=Array(3),e=Array(3),i=Array(3),n=_.x,r=_.y,s=.5*(S.zmin+S.zmax);for(let a=0;a<3;++a){let h=0,l=0,c=0,d=4*a;for(let t=0;t<4;++t){let e=4*t,i=T[e],a=T[e+1],m=T[e+2],f=T[e+3],u=o.Transform[d+t];h+=u*(f-n*i-r*a-s*m),c+=u*a,l+=u*(f-n*i-r*a)}t[a]=h,e[a]=c,i[a]=l}return[t,e,i]}();let n=o.orthographic?" orthographic(":" perspective(",r="".padStart(n.length),s="currentprojection=\n"+n+"camera=("+t+"),\n"+r+"up=("+e+"),\n"+r+"target=("+i+"),\n"+r+"zoom="+v*o.initialZoom/o.zoom0;return o.orthographic||(s+=",\n"+r+"angle="+2*Math.atan(Math.tan(.5*o.angleOfView)/v)/u),0==g&&0==w||(s+=",\n"+r+"viewportshift=("+g+","+w+")"),o.orthographic||(s+=",\n"+r+"autoadjust=false"),s+=");\n",window.parent.asyProjection=!0,s}function ce(t){if(oe||he(),o.embedded&&oe&&27==t.keyCode)return oe=0,void o.canvas.removeEventListener("wheel",me,!1);let e=[];switch(t.key){case"x":e=[1,0,0];break;case"y":e=[0,1,0];break;case"z":e=[0,0,1];break;case"h":Tt();break;case"m":++V,3==V&&(V=0),2!=V&&(o.embedded||st(),rt(o.ibl)),U=!0,Oe();break;case"+":case"=":case">":v*=o.zoomFactor,de();break;case"-":case"_":case"<":v/=o.zoomFactor,de();break;case"c":window.top.asyWebApplication||prompt("Ctrl+c Enter to copy currentprojection to clipboard; then append to asy file:",le())}e.length>0&&(mat4.rotate(T,T,.1,e),ee(),Oe())}function de(){ie(),_e(),Oe()}function me(t){t.preventDefault(),t.deltaY<0?v*=o.zoomFactor:v/=o.zoomFactor,de()}function fe(t){if(!B)return;let e,i=t.clientX,n=t.clientY;e=t.getModifierState("Control")?2:t.getModifierState("Shift")?3:t.getModifierState("Alt")?4:1,ae(i,n,e)}let ue=!1,pe=!1,ve=!1;function xe(t){if(t.preventDefault(),ue)return;let e=t.targetTouches;if(!$t&&1==e.length&&touchId==e[0].identifier){let t=e[0].pageX,i=e[0].pageY,n=t-C,r=i-D,s=n*n+r*r<=o.shiftHoldDistance*o.shiftHoldDistance;if(s&&!pe&&!ve&&(new Date).getTime()-Yt>o.shiftWaitTime&&(navigator.vibrate&&window.navigator.vibrate(o.vibrateTime),pe=!0),pe)ae(t,i,2);else if(!s){ve=!0,ae(e[0].pageX,e[0].pageY,1,.5)}}if($t&&!pe&&2==e.length&&touchId==e[0].identifier){let t=qt(e),i=t-kt;ue=!0,i*=o.zoomPinchFactor,i>o.zoomPinchCap&&(i=o.zoomPinchCap),i<-o.zoomPinchCap&&(i=-o.zoomPinchCap),ne(i/b),kt=t,pe=ve=ue=!1,_e(),Oe()}}let ge,we,Me,be,Re=[];function Te(){dt(K,ge),K.clear()}function ye(){dt(Z,we),Z.clear()}function Ae(){dt(Q,we),Q.clear()}function Ee(){dt(J,Me),J.clear()}function Ie(){dt(et,be),et.rendered=!1,et.clear()}function Le(){let e=tt.indices;if(V>0)return dt(tt,be,e),void tt.clear();if(e.length>0){!function(t){let e=A[2],i=A[6],n=A[10];Re.length=t.length;for(let r=0;r<t.length;++r){let s=6*r;Re[r]=e*t[s]+i*t[s+1]+n*t[s+2]}}(tt.vertices);let i=e.length/3,n=Array(i).fill().map((t,e)=>e);n.sort((function(t,i){let n=3*t;Ia=e[n],Ib=e[n+1],Ic=e[n+2];let r=3*i;return IA=e[r],IB=e[r+1],IC=e[r+2],Re[Ia]+Re[Ib]+Re[Ic]<Re[IA]+Re[IB]+Re[IC]?-1:1}));let r=Array(e.length);for(let t=0;t<i;++t){let i=3*n[t];r[3*t]=e[i],r[3*t+1]=e[i+1],r[3*t+2]=e[i+2]}t.depthMask(!1),dt(tt,be,r),tt.rendered=!1,t.depthMask(!0)}tt.clear()}function Ne(){Te(),ye(),Ae(),Ee(),Ie(),Le(),requestAnimationFrame(Ne)}function Oe(){o.embedded&&(i.width=o.canvasWidth,i.height=o.canvasHeight,Pe()),t.clearColor(o.background[0],o.background[1],o.background[2],o.background[3]),t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT);for(const t of h)t.render();Ne(),o.embedded&&(n.clearRect(0,0,o.canvasWidth,o.canvasHeight),n.drawImage(i,0,0)),0==V&&(U=!1)}function _e(){!function(t,e,i,n){let r=t/e;g=(i/t+o.viewportShift[0])*v,w=(n/e+o.viewportShift[1])*v;let s=1/v;if(o.orthographic){let t=o.maxBound[0]-o.minBound[0],e=o.maxBound[1]-o.minBound[1];if(t<e*r){let t=.5*e*r*s,i=2*t*g,n=e*s*w;S.xmin=-t-i,S.xmax=t-i,S.ymin=o.minBound[1]*s-n,S.ymax=o.maxBound[1]*s-n}else{let e=.5*t*s/r,i=t*s*g,n=2*e*w;S.xmin=o.minBound[0]*s-i,S.xmax=o.maxBound[0]*s-i,S.ymin=-e-n,S.ymax=e-n}}else{let t=M*s,e=t*r,i=2*e*g,n=2*t*w;S.xmin=-e-i,S.xmax=e-i,S.ymin=-t-n,S.ymax=t-n}}(o.canvasWidth,o.canvasHeight,P.x,P.y),(o.orthographic?mat4.ortho:mat4.frustum)(y,S.xmin,S.xmax,S.ymin,S.ymax,-S.zmax,-S.zmin),ee(),window.top.asyWebApplication&&window.top.asyWebApplication.setProjection(le())}function Pe(){t.viewportWidth=o.canvasWidth,t.viewportHeight=o.canvasHeight,t.viewport(.5*(o.canvas.width-o.canvasWidth),.5*(o.canvas.height-o.canvasHeight),o.canvasWidth,o.canvasHeight),t.scissor(0,0,o.canvas.width,o.canvas.height)}function Se(t,e){t>void 0&&(t=void 0),e>void 0&&(e=void 0),P.x*=t/o.canvasWidth,P.y*=e/o.canvasHeight,o.canvasWidth=t,o.canvasHeight=e,o.embedded&&(o.canvas.width=i.width=o.canvasWidth,o.canvas.height=i.height=o.canvasHeight),b=Math.hypot(o.canvasWidth,o.canvasHeight),s=.5*o.canvas.width,a=.5*o.canvas.height,R=1+8*Math.hypot(o.viewportMargin[0],o.viewportMargin[1])/b,Pe(),_e(),U=!0}function Ue(){if(o.zoom0=o.initialZoom,window.top.asyWebApplication&&""==window.top.asyWebApplication.getProjection()&&(window.parent.asyProjection=!1),o.absolute&&!o.embedded)o.canvasWidth=o.canvasWidth0*window.devicePixelRatio,o.canvasHeight=o.canvasHeight0*window.devicePixelRatio;else{let t=o.canvasWidth0/o.canvasHeight0;o.canvasWidth=Math.max(window.innerWidth-10,10),o.canvasHeight=Math.max(window.innerHeight-10,10),!o.orthographic&&!window.parent.asyProjection&&o.canvasWidth<o.canvasHeight*t&&(o.zoom0*=o.canvasWidth/(o.canvasHeight*t))}o.canvas.width=o.canvasWidth,o.canvas.height=o.canvasHeight;window.innerWidth,window.innerHeight;let t=1/o.zoom0;o.viewportShift[0]*=t,o.viewportShift[1]*=t,Se(o.canvasWidth,o.canvasHeight),Rt()}class Ve{constructor(t,e){if(this.center=t,e){let t=e[0],i=e[1];this.ct=Math.cos(t),this.st=Math.sin(t),this.cp=Math.cos(i),this.sp=Math.sin(i)}}T0(t){return[t[0]+this.center[0],t[1]+this.center[1],t[2]+this.center[2]]}T(t){let e=t[0],i=t[1],n=t[2],r=e*this.ct+n*this.st;return[r*this.cp-i*this.sp+this.center[0],r*this.sp+i*this.cp+this.center[1],-e*this.st+n*this.ct+this.center[2]]}}function Be(t,e,i){let n=[t(e),t([e[0],e[1],i[2]]),t([e[0],i[1],e[2]]),t([e[0],i[1],i[2]]),t([i[0],e[1],e[2]]),t([i[0],e[1],i[2]]),t([i[0],i[1],e[2]]),t(i)];return[Gt(n),Wt(n)]}let Ce=4/3*(Math.sqrt(2)-1);async function De(t){return(await fetch(t)).arrayBuffer()}function Fe(t){return t.getBytes().filter((t,e)=>e%4!=3)}function ze(e,i,n=t.RGB16F){let r=e.width(),s=e.height(),a=t.createTexture();return t.activeTexture(t.TEXTURE0+i),t.bindTexture(t.TEXTURE_2D,a),t.pixelStorei(t.UNPACK_ALIGNMENT,1),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texImage2D(t.TEXTURE_2D,0,n,r,s,0,t.RGB,t.FLOAT,Fe(e)),a}window.webGLStart=function(){o.canvas=document.getElementById("Asymptote"),o.embedded=window.top.document!=document,ht(),t.enable(t.BLEND),t.blendFunc(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA),t.enable(t.DEPTH_TEST),t.enable(t.SCISSOR_TEST),o.canvas.onmousedown=jt,document.onmouseup=Zt,document.onmousemove=fe,o.canvas.onkeydown=ce,o.embedded||he(),o.canvas.addEventListener("touchstart",Kt,!1),o.canvas.addEventListener("touchend",Zt,!1),o.canvas.addEventListener("touchcancel",Zt,!1),o.canvas.addEventListener("touchleave",Zt,!1),o.canvas.addEventListener("touchmove",xe,!1),document.addEventListener("keydown",ce,!1),o.canvasWidth0=o.canvasWidth,o.canvasHeight0=o.canvasHeight,mat4.identity(T),0!=window.innerWidth&&0!=window.innerHeight&&Ue(),window.addEventListener("resize",Ue,!1),o.ibl&&async function(){let e=o.imageURL+o.image+"/";function i(t){return new Promise(e=>setTimeout(e,t))}for(;!Module.EXRLoader;)await i(0);promises=[De(o.imageURL+"refl.exr").then(t=>{let e=new Module.EXRLoader(t);j=ze(e,0)}),De(e+"diffuse.exr").then(t=>{let e=new Module.EXRLoader(t);W=ze(e,1)})],refl_promise=[],refl_promise.push(De(e+"refl0.exr"));for(let t=1;t<=8;++t)refl_promise.push(De(e+"refl"+t+"w.exr"));finished_promise=Promise.all(refl_promise).then(e=>{let i=t.createTexture();t.activeTexture(t.TEXTURE0+2),t.pixelStorei(t.UNPACK_ALIGNMENT,1),t.bindTexture(t.TEXTURE_2D,i),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAX_LEVEL,e.length-1),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR_MIPMAP_LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameterf(t.TEXTURE_2D,t.TEXTURE_MIN_LOD,0),t.texParameterf(t.TEXTURE_2D,t.TEXTURE_MAX_LOD,8);for(let i=0;i<e.length;++i){let n=new Module.EXRLoader(e[i]);t.texImage2D(t.TEXTURE_2D,i,t.RGB16F,n.width(),n.height(),0,t.RGB,t.FLOAT,Fe(n))}G=i}),promises.push(finished_promise),await Promise.all(promises)}().then(k).then(Rt),Tt()},window.light=function(t,e){l.push(new nt(t,e))},window.material=function(t,e,i,n,r,s){c.push(new Y(t,e,i,n,r,s))},window.patch=function(t,e,i,n){h.push(new vt(t,e,i,n))},window.curve=function(t,e,i){h.push(new wt(t,e,i))},window.pixel=function(t,e,i){h.push(new Mt(t,e,i))},window.triangles=function(t,e){h.push(new bt(t,e)),window.Positions=F=[],window.Normals=z=[],window.Colors=H=[],window.Indices=X=[]},window.sphere=function(t,e,i,n,r){let s,a,o,l,c,d,m=.524670512339254,f=.595936986722291,u=.954967051233925,p=.0820155480083437,v=.996685028842544,x=.0549670512339254,g=.998880711874577,w=.0405017186586849,M=[[[1,0,0],[1,0,m],[f,0,u],[p,0,v],[1,Ce,0],[1,Ce,m],[f,Ce*f,u],[p,Ce*p,v],[Ce,1,0],[Ce,1,m],[Ce*f,f,u],[Ce*p,p,v],[0,1,0],[0,1,m],[0,f,u],[0,p,v]],[[p,0,v],[p,Ce*p,v],[x,0,g],[Ce*p,p,v],[w,w,1],[.05*Ce,0,1],[0,p,v],[0,x,g],[0,.05*Ce,1],[0,0,1]]],b=new Ve(t,r);function R(t){let e=Array(t.length);for(let i=0;i<t.length;++i){let n=t[i];e[i]=c([s*n[0],a*n[1],o*n[2]])}return e}r?(l=1,d=0,c=b.T.bind(b)):(l=-1,d=-e,c=b.T0.bind(b));let T=Be(c,[-e,-e,d],[e,e,e]),y=T[0],A=T[1];for(let t=-1;t<=1;t+=2){s=t*e;for(let t=-1;t<=1;t+=2){a=t*e;for(let t=l;t<=1;t+=2){o=t*e;for(let t=0;t<2;++t)h.push(new vt(R(M[t]),i,n,null,y,A))}}}},window.disk=function(t,e,i,n,r){let s=1-2*Ce/3,a=[[1,0,0],[1,-Ce,0],[Ce,-1,0],[0,-1,0],[1,Ce,0],[s,0,0],[0,-s,0],[-Ce,-1,0],[Ce,1,0],[0,s,0],[-s,0,0],[-1,-Ce,0],[0,1,0],[-Ce,1,0],[-1,Ce,0],[-1,0,0]],o=new Ve(t,r),l=Be(o.T.bind(o),[-e,-e,0],[e,e,0]);h.push(new vt(function(t){let i=Array(t.length);for(let n=0;n<t.length;++n){let r=t[n];i[n]=o.T([e*r[0],e*r[1],0])}return i}(a),i,n,null,l[0],l[1]))},window.cylinder=function(t,e,i,n,r,s,a){let o,l,c=[[1,0,0],[1,0,1/3],[1,0,2/3],[1,0,1],[1,Ce,0],[1,Ce,1/3],[1,Ce,2/3],[1,Ce,1],[Ce,1,0],[Ce,1,1/3],[Ce,1,2/3],[Ce,1,1],[0,1,0],[0,1,1/3],[0,1,2/3],[0,1,1]],d=new Ve(t,s);function m(t){let e=Array(t.length);for(let n=0;n<t.length;++n){let r=t[n];e[n]=d.T([o*r[0],l*r[1],i*r[2]])}return e}let f=Be(d.T.bind(d),[-e,-e,0],[e,e,i]),u=f[0],p=f[1];for(let t=-1;t<=1;t+=2){o=t*e;for(let t=-1;t<=1;t+=2)l=t*e,h.push(new vt(m(c),n,r,null,u,p))}if(a){let e=d.T([0,0,i]);h.push(new wt([t,e],n,r,t,e))}},window.tube=function(t,e,i,n,r){let s=function(t,e,i,n,r){class s{constructor(t,e,i){this.p=t,this.r=e,this.t=i,this.s=Bt(i,e)}}let a=Number.EPSILON*Math.max(Ut(t),Ut(e),Ut(i),Ut(n));function o(r){if(1==r){let r=[n[0]-i[0],n[1]-i[1],n[2]-i[2]];return Ut(r)>a?St(r):(r=[2*i[0]-e[0]-n[0],2*i[1]-e[1]-n[1],2*i[2]-e[2]-n[2]],Ut(r)>a?St(r):[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])])}let s=[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])],o=[2*(t[0]+i[0])-4*e[0],2*(t[1]+i[1])-4*e[1],2*(t[2]+i[2])-4*e[2]],h=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],l=r*r,c=[s[0]*l+o[0]*r+h[0],s[1]*l+o[1]*r+h[1],s[2]*l+o[2]*r+h[2]];return Ut(c)>a?St(c):(l=2*r,c=[s[0]*l+o[0],s[1]*l+o[1],s[2]*l+o[2]],Ut(c)>a?St(c):St(s))}let h=Array(r.length),l=[e[0]-t[0],e[1]-t[1],e[2]-t[2]];Ut(l)<a&&(l=[t[0]-2*e[0]+i[0],t[1]-2*e[1]+i[1],t[2]-2*e[2]+i[2]],Ut(l)<a&&(l=[n[0]-t[0]+3*(e[0]-i[0]),n[1]-t[1]+3*(e[1]-i[1]),n[2]-t[2]+3*(e[2]-i[2])])),l=St(l);let c=function(t){let e=Bt(t,[0,1,0]),i=Number.EPSILON*Ut(t);return Ut(e)>i?St(e):(e=Bt(t,[0,0,1]),Ut(e)>i?St(e):[1,0,0])}(l);h[0]=new s(t,c,l);for(let a=1;a<r.length;++a){let l=h[a-1],c=r[a],d=1-c,m=d*d,f=m*d,u=3*c;m*=u,d*=u*c;let p=c*c*c,v=[f*t[0]+m*e[0]+d*i[0]+p*n[0],f*t[1]+m*e[1]+d*i[1]+p*n[1],f*t[2]+m*e[2]+d*i[2]+p*n[2]],x=[v[0]-l.p[0],v[1]-l.p[1],v[2]-l.p[2]];if(0!=x[0]||0!=x[1]||0!=x[2]){let t=l.r,e=St(x),i=l.t,n=Vt(e,i),r=[i[0]-2*n*e[0],i[1]-2*n*e[1],i[2]-2*n*e[2]];i=o(c);let d=2*Vt(e,t),m=[t[0]-d*e[0],t[1]-d*e[1],t[2]-d*e[2]],f=St([i[0]-r[0],i[1]-r[1],i[2]-r[2]]),u=2*Vt(f,m);m=[m[0]-u*f[0],m[1]-u*f[1],m[2]-u*f[2]],h[a]=new s(v,St(m),St(i))}else h[a]=h[a-1]}return h}(t[0],t[1],t[2],t[3],[0,1/3,2/3,1]),a=Ce*e,o=[[e,0],[e,a],[a,e],[0,e]];function l(e,r,a,l){let c=Array(16);for(let i=0;i<4;++i){let n=s[i],h=n.r[0],d=n.s[0],m=h*e+d*r,f=h*a+d*l;h=n.r[1],d=n.s[1];let u=h*e+d*r,p=h*a+d*l;h=n.r[2],d=n.s[2];let v=h*e+d*r,x=h*a+d*l,g=t[i],w=g[0];w1=g[1],w2=g[2];for(let t=0;t<4;++t){let e=o[t],n=e[0],r=e[1];c[4*i+t]=[m*n+f*r+w,u*n+p*r+w1,v*n+x*r+w2]}}h.push(new vt(c,i,n))}l(1,0,0,1),l(0,-1,1,0),l(-1,0,0,-1),l(0,1,-1,0),r&&h.push(new wt(t,i,n))},window.Positions=F,window.Normals=z,window.Colors=H,window.Indices=X}();
diff --git a/graphics/asymptote/bbox3.h b/graphics/asymptote/bbox3.h
index e2428f8c00..1011ec83a4 100644
--- a/graphics/asymptote/bbox3.h
+++ b/graphics/asymptote/bbox3.h
@@ -10,54 +10,50 @@
#include "triple.h"
-// For CYGWIN
-#undef near
-#undef far
-
namespace camp {
// The box that encloses a path
struct bbox3 {
bool empty;
- double left;
- double bottom;
- double near;
- double right;
- double top;
- double far;
+ double leftBound;
+ double bottomBound;
+ double nearBound;
+ double rightBound;
+ double topBound;
+ double farBound;
// Start bbox3 about the origin
bbox3()
- : empty(true), left(0.0), bottom(0.0), near(0.0),
- right(0.0), top(0.0), far(0.0)
+ : empty(true), leftBound(0.0), bottomBound(0.0), nearBound(0.0),
+ rightBound(0.0), topBound(0.0), farBound(0.0)
{
}
bbox3(double left, double bottom, double near,
double right, double top, double far)
- : empty(false), left(left), bottom(bottom), near(near),
- right(right), top(top), far(far)
+ : empty(false), leftBound(left), bottomBound(bottom), nearBound(near),
+ rightBound(right), topBound(top), farBound(far)
{
}
// Start a bbox3 with a point
bbox3(double x, double y, double z)
- : empty(false), left(x), bottom(y), near(z), right(x), top(y), far(z)
+ : empty(false), leftBound(x), bottomBound(y), nearBound(z), rightBound(x), topBound(y), farBound(z)
{
}
// Start a bbox3 with a point
bbox3(const triple& v)
- : empty(false), left(v.getx()), bottom(v.gety()), near(v.getz()),
- right(v.getx()), top(v.gety()), far(v.getz())
+ : empty(false), leftBound(v.getx()), bottomBound(v.gety()), nearBound(v.getz()),
+ rightBound(v.getx()), topBound(v.gety()), farBound(v.getz())
{
}
// Start a bbox3 with 2 points
bbox3(const triple& m, const triple& M)
: empty(false),
- left(m.getx()), bottom(m.gety()), near(m.getz()),
- right(M.getx()), top(M.gety()), far(M.getz())
+ leftBound(m.getx()), bottomBound(m.gety()), nearBound(m.getz()),
+ rightBound(M.getx()), topBound(M.gety()), farBound(M.getz())
{
}
@@ -70,57 +66,57 @@ struct bbox3 {
void add(double x, double y, double z)
{
if (empty) {
- left = right = x;
- top = bottom = y;
- near = far = z;
+ leftBound= rightBound= x;
+ topBound= bottomBound= y;
+ nearBound= farBound= z;
empty = false;
}
else {
- if(x < left)
- left = x;
- else if(x > right)
- right = x;
- if(y < bottom)
- bottom = y;
- else if(y > top)
- top = y;
- if(z < near)
- near = z;
- else if(z > far)
- far = z;
+ if(x < leftBound)
+ leftBound= x;
+ else if(x > rightBound)
+ rightBound= x;
+ if(y < bottomBound)
+ bottomBound= y;
+ else if(y > topBound)
+ topBound= y;
+ if(z < nearBound)
+ nearBound= z;
+ else if(z > farBound)
+ farBound= z;
}
}
// Add a point to a nonempty bbox3
void addnonempty(double x, double y, double z)
{
- if(x < left)
- left = x;
- else if(x > right)
- right = x;
- if(y < bottom)
- bottom = y;
- else if(y > top)
- top = y;
- if(z < near)
- near = z;
- else if(z > far)
- far = z;
+ if(x < leftBound)
+ leftBound= x;
+ else if(x > rightBound)
+ rightBound= x;
+ if(y < bottomBound)
+ bottomBound= y;
+ else if(y > topBound)
+ topBound= y;
+ if(z < nearBound)
+ nearBound= z;
+ else if(z > farBound)
+ farBound= z;
}
// Add (x,y) pair to a nonempty bbox3
void addnonempty(pair v)
{
double x=v.getx();
- if(x < left)
- left = x;
- else if(x > right)
- right = x;
+ if(x < leftBound)
+ leftBound= x;
+ else if(x > rightBound)
+ rightBound= x;
double y=v.gety();
- if(y < bottom)
- bottom = y;
- else if(y > top)
- top = y;
+ if(y < bottomBound)
+ bottomBound= y;
+ else if(y > topBound)
+ topBound= y;
}
// Add a point to a nonempty bbox3
@@ -134,29 +130,29 @@ struct bbox3 {
{
double x = v.getx(), y = v.gety(), z = v.getz();
- if(x < left) {
- left = x;
- times.left = t;
+ if(x < leftBound) {
+ leftBound= x;
+ times.leftBound= t;
}
- else if(x > right) {
- right = x;
- times.right = t;
+ else if(x > rightBound) {
+ rightBound= x;
+ times.rightBound= t;
}
- if(y < bottom) {
- bottom = y;
- times.bottom = t;
+ if(y < bottomBound) {
+ bottomBound= y;
+ times.bottomBound= t;
}
- else if(y > top) {
- top = y;
- times.top = t;
+ else if(y > topBound) {
+ topBound= y;
+ times.topBound= t;
}
- if(z < near) {
- near = z;
- times.near=t;
+ if(z < nearBound) {
+ nearBound= z;
+ times.nearBound=t;
}
- else if(z > far) {
- far = z;
- times.far=t;
+ else if(z > farBound) {
+ farBound= z;
+ times.farBound=t;
}
}
@@ -167,19 +163,19 @@ struct bbox3 {
}
triple Min() const {
- return triple(left,bottom,near);
+ return triple(leftBound, bottomBound, nearBound);
}
triple Max() const {
- return triple(right,top,far);
+ return triple(rightBound, topBound, farBound);
}
pair Min2() const {
- return pair(left,bottom);
+ return pair(leftBound, bottomBound);
}
pair Max2() const {
- return pair(right,top);
+ return pair(rightBound, topBound);
}
friend ostream& operator << (ostream& out, const bbox3& b)
diff --git a/graphics/asymptote/bezierpatch.cc b/graphics/asymptote/bezierpatch.cc
index 775c282e0c..29ef5c28c5 100644
--- a/graphics/asymptote/bezierpatch.cc
+++ b/graphics/asymptote/bezierpatch.cc
@@ -800,7 +800,6 @@ void Triangles::queue(size_t nP, const triple* P, size_t nN, const triple* N,
notRendered();
data.Vertices.resize(nP);
- data.indices.resize(3*nI);
MaterialIndex=nC ? -1-materialIndex : 1+materialIndex;
@@ -824,7 +823,7 @@ void Triangles::queue(size_t nP, const triple* P, size_t nN, const triple* N,
(GLfloat) C1.A};
GLfloat c2[]={(GLfloat) C2.R,(GLfloat) C2.G,(GLfloat) C2.B,
(GLfloat) C2.A};
- transparent |= c0[3]+c1[3]+c2[3] < 765;
+ transparent |= c0[3]+c1[3]+c2[3] < 3.0;
data.Vertices[PI0]=VertexData(P0,N[NI[0]],c0);
data.Vertices[PI1]=VertexData(P1,N[NI[1]],c1);
data.Vertices[PI2]=VertexData(P2,N[NI[2]],c2);
@@ -834,11 +833,11 @@ void Triangles::queue(size_t nP, const triple* P, size_t nN, const triple* N,
data.Vertices[PI2]=VertexData(P2,N[NI[2]]);
}
triple Q[]={P0,P1,P2};
+ std::vector<GLuint> &q=data.indices;
if(!offscreen(3,Q)) {
- size_t i3=3*i;
- data.indices[i3]=PI0;
- data.indices[i3+1]=PI1;
- data.indices[i3+2]=PI2;
+ q.push_back(PI0);
+ q.push_back(PI1);
+ q.push_back(PI2);
}
}
append();
diff --git a/graphics/asymptote/binaries/i386-windows/README b/graphics/asymptote/binaries/i386-windows/README
deleted file mode 100644
index 686eb44150..0000000000
--- a/graphics/asymptote/binaries/i386-windows/README
+++ /dev/null
@@ -1,62 +0,0 @@
- ASYMPTOTE
- Copyright 2004-24 Andy Hammerlindl, John Bowman, and Tom Prince
-
-Asymptote is a powerful descriptive vector graphics language for technical
-drawing, inspired by MetaPost but with an improved C++-like
-syntax. Asymptote provides for figures the same high-quality level of
-typesetting that LaTeX does for scientific text.
-
-Installation instructions, documentation, binaries, and source code are
-available at:
-
-https://asymptote.sourceforge.io
-
-Bugs/Patches/Feature Requests can be submitted to
-
-https://github.com/vectorgraphics/asymptote/issues
-
-Questions and comments should be sent to the Asymptote Forum:
-
-https://sourceforge.net/p/asymptote/discussion/409349
-
-All source files in the Asymptote project, unless explicitly noted otherwise,
-are released under version 3 (or later) of the GNU Lesser General Public
-License (see the files LICENSE.LESSER and LICENSE in the top-level source
-directory).
-
-========================================================================
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-========================================================================
-
-Note that the MSWindows executable version of Asymptote can only be
-released under the GNU General Public License (GPL) as it is linked against
-the GNU Scientific Library, GNU Readline library, and other GPL
-libraries. This version of Asymptote also ships with the cygwin1.dll libraries
-noted below.
-
-========================================================================
-
-Source code for the x86_64 and i386 3.5.1 cygwin1.dll libraries is
-available under the GPL license:
-https://www.cygwin.com/git.html
-
-Source for various icons is available under the MIT license from
-https://github.com/driftyco/ionicons/archive/v2.0.1.zip
-https://github.com/iconic/open-iconic/archive/master.zip
-under the CC-BY-SA 4.0 license:
-http://www.entypo.com/
-and under a CC license:
-http://www.zondicons.com/zondicons.zip
diff --git a/graphics/asymptote/binaries/i386-windows/cygwin1.dll b/graphics/asymptote/binaries/i386-windows/cygwin1.dll
deleted file mode 100755
index 73a20b93be..0000000000
--- a/graphics/asymptote/binaries/i386-windows/cygwin1.dll
+++ /dev/null
Binary files differ
diff --git a/graphics/asymptote/binaries/i386-windows/texlive/README b/graphics/asymptote/binaries/i386-windows/texlive/README
deleted file mode 100644
index 41576b36f4..0000000000
--- a/graphics/asymptote/binaries/i386-windows/texlive/README
+++ /dev/null
@@ -1,5 +0,0 @@
-The Asymptote executable for MSWindows can only be released under the GNU
-General Public License (GPL) as it is linked against the GNU Scientific
-Library, GNU Readline library, WolfSSL, and other GPL libraries. The Asymptote
-source itself is released under the GNU Lesser General Public License.
-
diff --git a/graphics/asymptote/binaries/x86_64-windows/README b/graphics/asymptote/binaries/x86_64-windows/README
index 686eb44150..8986462fa2 100644
--- a/graphics/asymptote/binaries/x86_64-windows/README
+++ b/graphics/asymptote/binaries/x86_64-windows/README
@@ -1,5 +1,5 @@
ASYMPTOTE
- Copyright 2004-24 Andy Hammerlindl, John Bowman, and Tom Prince
+ Copyright 2004-25 Andy Hammerlindl, John Bowman, and Tom Prince
Asymptote is a powerful descriptive vector graphics language for technical
drawing, inspired by MetaPost but with an improved C++-like
@@ -44,15 +44,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
Note that the MSWindows executable version of Asymptote can only be
released under the GNU General Public License (GPL) as it is linked against
the GNU Scientific Library, GNU Readline library, and other GPL
-libraries. This version of Asymptote also ships with the cygwin1.dll libraries
-noted below.
+libraries.
========================================================================
-Source code for the x86_64 and i386 3.5.1 cygwin1.dll libraries is
-available under the GPL license:
-https://www.cygwin.com/git.html
-
Source for various icons is available under the MIT license from
https://github.com/driftyco/ionicons/archive/v2.0.1.zip
https://github.com/iconic/open-iconic/archive/master.zip
diff --git a/graphics/asymptote/binaries/x86_64-windows/cygwin1.dll b/graphics/asymptote/binaries/x86_64-windows/cygwin1.dll
deleted file mode 100644
index 756d4ee3a1..0000000000
--- a/graphics/asymptote/binaries/x86_64-windows/cygwin1.dll
+++ /dev/null
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/fftw3.dll b/graphics/asymptote/binaries/x86_64-windows/fftw3.dll
new file mode 100644
index 0000000000..46215893c5
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/fftw3.dll
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/freeglut.dll b/graphics/asymptote/binaries/x86_64-windows/freeglut.dll
new file mode 100644
index 0000000000..b69d152ae1
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/freeglut.dll
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/gc.dll b/graphics/asymptote/binaries/x86_64-windows/gc.dll
new file mode 100644
index 0000000000..d783bce519
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/gc.dll
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/gccpp.dll b/graphics/asymptote/binaries/x86_64-windows/gccpp.dll
new file mode 100644
index 0000000000..37a40e937a
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/gccpp.dll
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/getopt.dll b/graphics/asymptote/binaries/x86_64-windows/getopt.dll
new file mode 100644
index 0000000000..068c9c0262
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/getopt.dll
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/gsl.dll b/graphics/asymptote/binaries/x86_64-windows/gsl.dll
new file mode 100644
index 0000000000..65d690d273
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/gsl.dll
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/gslcblas.dll b/graphics/asymptote/binaries/x86_64-windows/gslcblas.dll
new file mode 100644
index 0000000000..f27e6a4945
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/gslcblas.dll
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/libcurl.dll b/graphics/asymptote/binaries/x86_64-windows/libcurl.dll
new file mode 100644
index 0000000000..a36eb8986b
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/libcurl.dll
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/pthreadvc3.dll b/graphics/asymptote/binaries/x86_64-windows/pthreadvc3.dll
new file mode 100644
index 0000000000..a9200d3aea
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/pthreadvc3.dll
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/readline.dll b/graphics/asymptote/binaries/x86_64-windows/readline.dll
new file mode 100644
index 0000000000..61c9633e0f
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/readline.dll
Binary files differ
diff --git a/graphics/asymptote/binaries/x86_64-windows/zlib1.dll b/graphics/asymptote/binaries/x86_64-windows/zlib1.dll
new file mode 100644
index 0000000000..23f92ab7c9
--- /dev/null
+++ b/graphics/asymptote/binaries/x86_64-windows/zlib1.dll
Binary files differ
diff --git a/graphics/asymptote/build-scripts/HOWTO-MSWindows b/graphics/asymptote/build-scripts/HOWTO-MSWindows
index 684a3888bf..43559e3e0e 100644
--- a/graphics/asymptote/build-scripts/HOWTO-MSWindows
+++ b/graphics/asymptote/build-scripts/HOWTO-MSWindows
@@ -1,76 +1,27 @@
- Compiling MSWindows binary of Asymptote under CYGWIN-x86_64
+ Compiling MSWindows binary of Asymptote under MSVC
-First run build-asymptote on Linux. This will build the documentation
-and source tar ball and copy them to a directory ~/shared which needs to be
-shared via virtualbox to the cygwin build environment.
+First ensure that the asymptote documentation files and asymptote.sty are built under Linux.
+Copy these to the Z:\asy\asydoc directory.
-Install TeXLive and required Cygwin packages:
+Ensure git is available
+Ensure Powershell execution policy is at least unrestricted (the default for Powershell 7):
+Set-ExecutionPolicy -Scope CurrentUser unrestricted
-setup-x86_64.exe -q -P git,wget,make,patch,gcc-g++,autoconf2.5,bison,flex,w32api-headers,w32api-runtime,zlib-devel,glm-devel,automake1.15,libtool
+# TODO: Does unrestricted execution policy work by default?
+Install powershell community extensions by "Install-Module Pscx -Scope CurrentUser" (https://github.com/Pscx/Pscx)
+Install VSSetup extension for powershell by "Install-Module VSSetup -Scope CurrentUser"
-setup-x86_64.exe -q -I -P libtirpc-devel,libreadline-devel,libfftw3-devel,libgsl-devel,libcurl-devel
+Install Visual Studio Build Tools (Select CMake build tools as part of installation)
+Install python3 (https://www.python.org/)
+Install perl (https://strawberryperl.com/)
+Install LLVM (https://github.com/llvm/llvm-project/releases)
-Download wolfssl GPLV3 source code from www.wolfssl.com
+Install virtualenv:
+pip3 install virtualenv
-Build and install static libraries from /usr/src:
+Download NSIS 3+ ZIP from https://sourceforge.net/projects/nsis/ and extract to tools-cache/nsis
+(Make sure tools-cache/nsis/makensis.exe is available)
-gsl-devel:
-./configure --prefix=/usr
-make install
+# TODO: check if NSIS puts makensis in PATH or not for default installation
-readline-devel:
-./configure --prefix=/usr --disable-shared
-make install LOCAL_CFLAGS=-DNEED_EXTERN_PC
-
-fftw3-devel:
-./configure --prefix=/usr --disable-shared
-make install
-
-tirpc-devel:
-./configure --prefix=/usr --disable-gssapi
-make install
-rm -rf /usr/include/rpc
-ln -s /usr/include/tirpc/rpc /usr/include/rpc
-ln -sf /usr/include/tirpc/netconfig.h /usr/include/netconfig.h
-ln -sf /usr/lib/libtirpc.a /usr/lib/librpc.a
-
-termcap-1.3.1:
-./configure --prefix=/usr
-make install
-
-wolfssl-4.4.0-gplv3-fips-ready:
-./configure --prefix=/usr --enable-static
-make install
-
-curl-7.71.1:
-./configure --prefix=/usr --disable-shared --without-brotli --without-ssl --with-wolfssl
-make install
-
-git clone http://github.com/vectorgraphics/asymptote
-
-freeglut-3.0.0:
-patch -p1 < ~/asymptote/patches/cygwin_freeglut-3.0.0.patch
-cmake CMakeLists.txt
-make
-cp lib/libfreeglut_static.a /usr/lib/libfreeglut.a
-cp -a include/GL/*.h /usr/include/w32api/GL/
-
-mkdir -p ~/dll/cygwin
-cp /usr/bin/cygwin1.dll ~/dll/cygwin
-
-mkdir ~/CTAN
-cp -a ~/asymptote/build-scripts/README-binaries ~/CTAN
-
-cd ~/
-GCVERSION=7.6.2
-ATOMICVERSION=7.6.10
-wget http://hboehm.info/gc/gc_source/gc-$GCVERSION.tar.gz
-wget https://github.com/ivmai/libatomic_ops/releases/download/v$ATOMICVERSION/libatomic_ops-$ATOMICVERSION.tar.gz
-tar -zxf gc-$GCVERSION.tar.gz
-tar -zxf libatomic_ops-$ATOMICVERSION.tar.gz
-mv libatomic_ops-$ATOMICVERSION gc-$GCVERSION/libatomic_ops
-cd gc-$GCVERSION
-./configure --disable-shared
-make check
-
-~/asymptote/build-scripts/build-asymptote.dos <VERSION>
+./build-asymptote.ps1 <VERSION>
diff --git a/graphics/asymptote/build-scripts/build-asymptote b/graphics/asymptote/build-scripts/build-asymptote
index a7c4513675..1ceb1e90fc 100755
--- a/graphics/asymptote/build-scripts/build-asymptote
+++ b/graphics/asymptote/build-scripts/build-asymptote
@@ -1,16 +1,13 @@
#!/bin/sh -x
-HOME=~bowman
+HOME=/home/$USER
SHARED=$HOME/shared/asy
-
-GCVERSION=8.2.4
-ATOMICVERSION=7.6.12
-GC=gc-$GCVERSION
+ASYMPTOTE=$HOME/asymptote
+BUILD=/usr/local/src
MAKEFLAGS=-j8
export MAKEFLAGS
-ASYMPTOTE=$HOME/asymptote
-BUILD=/usr/local/src
+
BINDIR=usr
test /usr -ef $BUILD/$BINDIR && exit
LATEXDIR=$BUILD/$BINDIR/share/texmf/tex/latex/asymptote
@@ -30,10 +27,6 @@ cd $BUILD
rm -rf asymptote-$VERSION
rm -rf $BUILD/$BINDIR
mv asymptote asymptote-$VERSION
-wget https://github.com/ivmai/bdwgc/releases/download/v$GCVERSION/gc-$GCVERSION.tar.gz
-wget https://github.com/ivmai/libatomic_ops/releases/download/v$ATOMICVERSION/libatomic_ops-$ATOMICVERSION.tar.gz
-cp /usr/local/src/$GC.tar.gz asymptote-$VERSION
-cp /usr/local/src/libatomic_ops-$ATOMICVERSION.tar.gz asymptote-$VERSION
chown -R root:root asymptote-$VERSION
cd asymptote-$VERSION
find . -name ".[^.]*" -exec rm -rf {} \;
@@ -53,23 +46,24 @@ make $MAKEFLAGS asy
rm base/webgl/asygl-*.js
make -j1 all
make -j1 install
-#rm asy
-#make LFLAGS=-static
strip asy
make DESTDIR="$BUILD/" latexdir=$LATEXDIR install
-#rm $GC.tar.gz
rm $BUILD/$BINDIR/local/info/dir
cp -a $BUILD/asymptote-$VERSION/ChangeLog .
cp -a $ASYMPTOTE/ReleaseNotes .
-make distclean
-rm -rf autom4te.cache
-cd /usr/local/share/doc/asymptote
rm -rf $SHARED/asydoc
mkdir -p $SHARED/asydoc/png
mkdir -p $SHARED/asydoc/FAQ
-cp -a *.pdf ../../man/man1/asy.1 $SHARED/asydoc
+cp -a $BUILD/asymptote-$VERSION/doc/asymptote.sty $SHARED/asydoc
+make distclean
+rm -rf autom4te.cache
+cd /usr/local/share/doc/asymptote
+cp -a *.pdf ../../man/man1/asy.1 ../../asymptote/asy-keywords.el $SHARED/asydoc
+cp -a *.pdf ../../man/man1/asy.1 $BUILD/asymptote-$VERSION/doc
cp -a /usr/local/share/info/asymptote/asymptote.info $SHARED/asydoc/png
+cp -a /usr/local/share/info/asymptote/asymptote.info $BUILD/asymptote-$VERSION/doc/png
cp -a /usr/local/share/info/asy-faq.info $SHARED/asydoc/FAQ
+cp -a /usr/local/share/info/asy-faq.info $BUILD/asymptote-$VERSION/doc/FAQ
cd $BUILD
tar cfz $SRC asymptote-$VERSION
tar cfz asymptote-$VERSION.x86_64.tgz $BINDIR
diff --git a/graphics/asymptote/build-scripts/build-asymptote-CTAN b/graphics/asymptote/build-scripts/build-asymptote-CTAN
new file mode 100755
index 0000000000..56cff8cc21
--- /dev/null
+++ b/graphics/asymptote/build-scripts/build-asymptote-CTAN
@@ -0,0 +1,34 @@
+#!/bin/sh -x
+GC=7.6.2
+
+MACHINE=`uname -m`
+BINDIR=x86_64-windows
+HOME=/home/$USER
+SHARED=$HOME/shared/asy
+ASYMPTOTE=$HOME/asymptote
+
+MAKEFLAGS=-j8
+export MAKEFLAGS
+
+cd $ASYMPTOTE
+VERSION=`grep AC_INIT configure.ac | cut -s -d[ -f3 | cut -s -d] -f1 | sed -e 's/git//'`
+
+cd /tmp
+echo Building asymptote-$VERSION-CTAN
+SRC=/usr/local/src/asymptote-$VERSION.src.tgz
+rm -rf asymptote-$VERSION
+tar -zxf $SRC
+cd asymptote-$VERSION
+find . -name ".[^.]*" -exec rm -rf {} \;
+rm -rf libatomic_ops/m4
+mkdir -p binaries/$BINDIR/texlive
+cd binaries/$BINDIR
+cp $SHARED/CTAN/asy.exe texlive
+cp $SHARED/CTAN/dll/*.dll .
+cp -a ../../README .
+cp -a ../../build-scripts/README-binaries texlive/README
+cd ../../..
+rm -rf asymptote
+mv asymptote-$VERSION asymptote
+tar cfz asymptote-$VERSION-CTAN.tgz asymptote
+cp asymptote-$VERSION-CTAN.tgz $SHARED
diff --git a/graphics/asymptote/build-scripts/build-asymptote.dos b/graphics/asymptote/build-scripts/build-asymptote.dos
deleted file mode 100755
index 154d8a295f..0000000000
--- a/graphics/asymptote/build-scripts/build-asymptote.dos
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/bin/sh -x
-GC=7.6.2
-
-MACHINE=`uname -m`
-if [ $MACHINE == i686 ]; then
-BINDIR=i386-windows
-HEAPSIZE=2048
-else
-BINDIR=x86_64-windows
-HEAPSIZE=4096
-fi
-SHARED=~/shared/asy
-MAKEFLAGS=-j8
-export MAKEFLAGS
-VERSION=$1
-if [ -z $VERSION ]; then
-VERSION=`grep AC_INIT configure.ac | cut -s -d[ -f3 | cut -s -d] -f1`
-if [ -z $VERSION ]; then
-echo Usage: $0 VERSION
-exit
-fi
-else
-echo Building asymptote-$VERSION
-cd ~/
-rm -rf asymptote-$VERSION
-mkdir -p CTAN
-rm -rf CTAN/asymptote
-cd CTAN
-tar -vzxf $SHARED/asymptote-$VERSION.src.tgz | grep "/\." | xargs rm -rf
-mv asymptote-$VERSION asymptote
-cd ..
-tar -zxf $SHARED/asymptote-$VERSION.src.tgz
-mkdir -p CTAN/asymptote/binaries/$BINDIR/texlive
-cd asymptote-$VERSION
-fi
-BUILD=build-$VERSION
-ln -sf ../gc-$GC.tar.gz .
-ln -sf ../gc-$GC .
-make -n MSDOS=1 >& /dev/null || ./configure OSTYPE=msdos --enable-gc=$GC --disable-lsp --with-latex=/usr/local/share --with-context=/usr/local/share
-rm -rf $BUILD
-mkdir -p $BUILD
-cp -a $HOME/dll/cygwin/*.dll $BUILD
-cp /etc/pki/tls/certs/ca-bundle.crt $BUILD
-chmod 0644 $BUILD/*.dll
-cp -a $BUILD/*.dll ~/CTAN/asymptote/binaries/$BINDIR/
-make MSDOS=1 DESTDIR="$BUILD/" docdir="$BUILD/"
-test -f asy.list || make MSDOS=1 keywords DESTDIR="$BUILD/" docdir="$BUILD/"
-make MSDOS=1 install-asy DESTDIR="$BUILD/" docdir="$BUILD/"
-peflags --cygwin-heap=$HEAPSIZE asy.exe
-cp asy.ico README LICENSE* $BUILD
-pushd $BUILD
-mv usr/local/bin/* .
-mv usr/local/share/asymptote/GUI .
-rm -rf usr/local/share/asymptote/GUI
-mv usr/local/share/asymptote/* .
-cp $SHARED/asydoc/*.pdf .
-rm -rf bin share doc usr
-popd
-echo \!define PRODUCT_VERSION \"$VERSION\" > AsymptoteInstallInfo.nsi
-# generate uninstallation commands
-ls -p1 $BUILD \
- | awk '{ if(index($0,"/")==length($0)) print "RMDir /r $INSTDIR\\" substr($0,0,length($0)-1); else print "Delete $INSTDIR\\" $0 }' \
- > AsymptoteUninstallList.nsi
-
-rm $BUILD/xasy
-if [ $MACHINE == i686 ]; then
-sed asymptote.nsi -e 's/$PROGRAMFILES64/$PROGRAMFILES/g' > asymptote32.nsi
-/cygdrive/c/Program\ Files\ \(x86\)/NSIS/makensis.exe asymptote32.nsi
-SUFFIX=-i386_32
-else
-/cygdrive/c/Program\ Files\ \(x86\)/NSIS/makensis.exe asymptote.nsi
-SUFFIX=
-fi
-cp -a --no-preserve=mode asymptote-$VERSION-setup.exe $SHARED/asymptote-$VERSION-setup$SUFFIX.exe
-mv asymptote-$VERSION-setup.exe ~/asymptote-$VERSION-setup$SUFFIX.exe
-
-cd ~/
-rm -rf asymptote-${VERSION}TL || exit
-cp -a asymptote-$VERSION asymptote-${VERSION}TL
-sed asymptote-$VERSION/config.h -e 's/ASYMPTOTE_SYSDIR ".*"/ASYMPTOTE_SYSDIR ""/g' > asymptote-${VERSION}TL/config.h
-#sed asymptote-$VERSION/configure.ac -e 's/\-std=c++11//g' > asymptote-${VERSION}TL/configure.ac
-touch -r asymptote-$VERSION/config.h asymptote-${VERSION}TL/config.h
-touch -r asymptote-$VERSION/configure.ac asymptote-${VERSION}TL/configure.ac
-cd asymptote-${VERSION}TL
-rm settings.o
-rm -f doc/*.aux doc/*.log doc/*.dvi
-make MSDOS=1 DESTDIR="$BUILD/"
-peflags --cygwin-heap=4096 asy.exe
-make MSDOS=1 install-asy DESTDIR="$BUILD/"
-mv $BUILD/usr/local/bin/asy.exe $BUILD
-cp $BUILD/asy.exe ~/CTAN/asymptote/binaries/$BINDIR/texlive
-cp -a configure.ac ~/CTAN/asymptote/
-cp -a $SHARED/asydoc/* ~/CTAN/asymptote/doc
-cd ~/CTAN/asymptote/binaries/$BINDIR
-cp -a ../../README .
-cd ~/CTAN
-cp -a ~/asymptote/build-scripts/README-binaries asymptote/binaries/$BINDIR/texlive/README
-SHAREDBIN=$SHARED/CTAN/asymptote
-if [ $MACHINE == i686 ]; then
-mkdir -p $SHAREDBIN
-cp -a asymptote/binaries/$BINDIR $SHAREDBIN
-else
-cp -a $SHAREDBIN/i386-windows ~/CTAN/asymptote/binaries
-fi
-tar cfz asymptote-$VERSION-CTAN.tgz asymptote
-cp -a --no-preserve=mode asymptote-$VERSION-CTAN.tgz $SHARED
diff --git a/graphics/asymptote/build-scripts/build-asymptote.ps1 b/graphics/asymptote/build-scripts/build-asymptote.ps1
new file mode 100644
index 0000000000..27b6c4332f
--- /dev/null
+++ b/graphics/asymptote/build-scripts/build-asymptote.ps1
@@ -0,0 +1,317 @@
+#!/usr/bin/env pwsh
+<#
+.SYNOPSIS
+ Script to build asymptote
+.DESCRIPTION
+ Builds asymptote installer file.
+ This script uses asymptote source directory. If building fails, try removing cmake-build-msvc/release directory
+.PARAMETER Version
+ Specifies Asymptote version to build. If not given, will automatically determine version from configure.ac.
+#>
+param(
+ [AllowEmptyString()]
+ [Parameter()]
+ [string]$Version
+)
+$ErrorActionPreference = "Stop"
+$PSNativeCommandUseErrorActionPreference = $true
+
+$usageString="Usage: $PSCommandPath -Version <version>"
+
+$asymptoteRoot="$(Split-Path -Parent $PSCommandPath)/.."
+
+if (-Not (Test-Path -PathType container $asymptoteRoot))
+{
+ Write-Error "No asymptote root found. Exiting."
+ Break
+}
+
+# ----------------------------------------------------
+# checking documentation files
+
+if ($env:ASYMPTOTE_BUILD_SHARED_DIRECTORY)
+{
+ $extfilesRoot="$env:ASYMPTOTE_BUILD_SHARED_DIRECTORY/asydoc"
+}
+else
+{
+ $extfilesRoot = "asydoc"
+}
+
+$requiredDocumentationFiles=@(
+ "asymptote.sty"
+ "asymptote.pdf"
+ "asy-latex.pdf"
+ "CAD.pdf"
+ "TeXShopAndAsymptote.pdf"
+ "asyRefCard.pdf"
+ "asy-keywords.el"
+)
+
+$hasDocFiles=$true
+foreach ($requiredDocFile in $requiredDocumentationFiles) {
+ if (-Not (Test-Path -PathType leaf "$extfilesRoot/$requiredDocFile")) {
+ $hasDocFiles=$false
+ Write-Error "$requiredDocFile not found.
+Please ensure $requiredDocFile is available in $extfilesRoot directory"
+ }
+}
+
+if (-Not $hasDocFiles) {
+ Write-Error "Documentation file(s) are not present in $extFilesRoot directory. Will not build asymptote."
+ Break
+}
+
+# ----------------------------------------------------
+# copy documentation files to asymptote directory
+$localAsyDocRoot="$asymptoteRoot/asydoc"
+
+if (-Not (Test-Path -Type Container $localAsyDocRoot))
+{
+ New-Item -ItemType Directory -Path $localAsyDocRoot -Force
+}
+
+foreach ($requiredDocFile in $requiredDocumentationFiles)
+{
+ $sourceDocFile="$extfilesRoot/$requiredDocFile"
+ $destDocFile="$localAsyDocRoot/$requiredDocFile"
+
+ $docFileHash=Get-FileHash -Algorithm SHA256 -Path $sourceDocFile
+ if (Test-Path -Type Leaf "$destDocFile")
+ {
+ $asyDocFilehash=Get-FileHash -Algorithm SHA256 -Path $destDocFile
+ if ($docFileHash.Hash -eq $asyDocFilehash.Hash)
+ {
+ Write-Host "File $requiredDocFile exists in asydoc directory; not copying"
+ continue
+ }
+ }
+
+ Write-Host "Copying $sourceDocFile to $destDocFile"
+ Copy-Item -Force $sourceDocFile -Destination $destDocFile
+}
+
+# ----------------------------------------------------
+# tools cache
+$toolscacheRoot="tools-cache"
+New-Item -ItemType Directory -Path $toolscacheRoot -Force
+
+$useToolsCacheVcpkg=$false
+
+# tools cache variables
+$vcpkgSha256="5e5d0e1cd7785623065e77eff011afdeec1a3574"
+
+# vcpkg
+if (-Not $env:VCPKG_ROOT)
+{
+ $vcpkgToolsCacheLoc = "$toolscacheRoot/vcpkg"
+ Write-Host "VCPKG_ROOT Not found, checking for $vcpkgToolsCacheLoc"
+ if (-Not (Test-Path -PathType Container $vcpkgToolsCacheLoc))
+ {
+ git clone https://github.com/microsoft/vcpkg.git "$vcpkgToolsCacheLoc"
+ }
+ else
+ {
+ Write-Host "vcpkg directory found"
+ }
+ git -C $vcpkgToolsCacheLoc fetch
+ git -C $vcpkgToolsCacheLoc reset --hard $vcpkgSha256
+
+ if (-Not (Test-Path $vcpkgToolsCacheLoc/vcpkg.exe))
+ {
+ Push-Location $vcpkgToolsCacheLoc
+ & ./bootstrap-vcpkg.bat
+ Pop-Location
+ }
+
+ $useToolsCacheVcpkg=true
+}
+else
+{
+ Write-Host "Using VCPKG_ROOT at $($env:VCPKG_ROOT)"
+}
+
+# ------------------------------------------------------
+# checking for NSIS
+$makeNsisLoc=$null
+
+# checking for downloaded nsis
+if ($null -eq $makeNsisLoc)
+{
+ $nsisToolsCacheRoot="$toolscacheRoot/nsis"
+ $downloadedNsis = "$nsisToolsCacheRoot/makensis.exe"
+ if (Test-Path -PathType leaf $downloadedNsis)
+ {
+ Write-Host "Found downloaded NSIS at $downloadedNsis"
+ $makeNsisLoc=$downloadedNsis
+ }
+}
+
+# checking registry & install location
+if ($null -eq $makeNsisLoc)
+{
+ $nsisInstallEntry = Get-ItemProperty `
+ -Path HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\NSIS `
+ -Name InstallLocation `
+ -ErrorAction SilentlyContinue
+
+ if ($null -ne $nsisInstallEntry)
+ {
+ # entry found for registry
+ $nsisTestPath = "$( $nsisInstallEntry.InstallLocation )/makensis.exe"
+ if (Test-Path -PathType leaf $nsisTestPath)
+ {
+ Write-Host "Found installed NSIS. Using NSIS at $nsisTestPath"
+ $makeNsisLoc = $nsisTestPath
+ }
+ }
+}
+
+# check in tools-cache/nsis
+if ($null -Eq $makeNsisLoc)
+{
+ $nsisPathExec = Get-Command makensis -ErrorAction ignore
+ if ($null -Ne $nsisPathExec)
+ {
+ Write-Host "Found NSIS in PATH at $($makeNsisLoc.Path)".
+ $makeNsisLoc=$nsisPathExec.Path
+ }
+}
+
+# nsis not found
+if ($null -eq $makeNsisLoc)
+{
+ Write-Error "Cannot find NSIS. Please either
+(1, Recommended) Install NSIS from https://sourceforge.net/projects/nsis/
+(2) Download NSIS ZIP and extract the files to $toolscacheRoot so that $nsisToolsCacheRoot/makensis.exe
+ is available
+"
+ Break
+}
+
+# ------------------------------------------------
+# python
+$pyVenvLocation="$toolscacheRoot/pyxasy"
+$pyXasyActivateScript="$pyVenvLocation/Scripts/activate.ps1"
+if (-Not (Test-Path -PathType leaf $pyXasyActivateScript))
+{
+ python -m virtualenv -p C:\\Users\\jamievl\\AppData\\Local\\Programs\\Python\\Python39\\python.exe $pyVenvLocation
+}
+
+# ----------------------------------------------------
+# determine version, if not given in arguments
+
+if (0 -eq $Version.Length) {
+ Write-Host "Version not given; will try to determine version"
+ Push-Location $asymptoteRoot
+ $Version=python generate_asy_ver_info.py --version-for-release
+ if (0 -ne $LASTEXITCODE) {
+ Write-Error $usageString
+ Write-Error "Cannot automatically determine release asymptote version. Please specify the version manually"
+ Pop-Location
+ Break
+ }
+ Pop-Location
+ Write-Host "Asymptote version is $Version"
+}
+
+# ----------------------------------------------------
+# build GUI
+& $pyXasyActivateScript
+Push-Location $asymptoteRoot/GUI
+& python -m pip install -r requirements.txt -r requirements.dev.txt
+& python buildtool.py build --version-override=$Version
+Pop-Location
+
+
+# ----------------------------------------------------
+
+function buildAsy($preset, $cfgDir) {
+ # build C++ side
+ Import-VisualStudioVars -Architecture x64
+ Push-EnvironmentBlock
+ $env:ASY_VERSION_OVERRIDE = $Version
+ if ($useToolsCacheVcpkg)
+ {
+ $env:VCPKG_ROOT = $vcpkgToolsCacheLoc
+ }
+
+ # ------------------------------------
+ # clear CMakeCache.txt
+ if (Test-Path -Type Leaf "$asymptoteRoot/$cfgDir/CMakeCache.txt")
+ {
+ Remove-Item -Force "$asymptoteRoot/$cfgDir/CMakeCache.txt"
+ }
+
+ # ------------------------------------
+ # configure
+ Push-Location $asymptoteRoot
+ cmake --preset $preset
+ Pop-Location
+
+ # ------------------------------------
+ # build
+ cmake --build $asymptoteRoot/$cfgDir --target asy-pre-nsis-targets -j
+ Pop-EnvironmentBlock # ASY_VERSION_OVERRIDE, VCPKG_ROOT
+ Pop-EnvironmentBlock # Visual studio vars
+ # install to pre-installation root
+}
+
+buildAsy msvc/release/with-external-doc-files cmake-build-msvc/release
+cmake --install $asymptoteRoot/cmake-build-msvc/release --component asy-pre-nsis
+
+# ------------------------------------------------------
+# Generate NSIS installer file
+& $asymptoteRoot/cmake-install-w32-nsis-release/build-asy-installer.ps1 "$makeNsisLoc"
+
+$asySetupName="asymptote-$Version-setup.exe"
+$asySetupFile="$asymptoteRoot/cmake-install-w32-nsis-release/$asySetupName"
+
+if (Test-Path -PathType leaf "$asySetupName")
+{
+ Write-Host "Found old setup file. Will delete the file."
+ Remove-Item -Force "asymptote-$Version-setup.exe"
+}
+
+if (Test-Path -PathType leaf $asySetupFile)
+{
+ # ---------------------------------------
+ # copy setup file to shared directory, if given
+ if ($env:ASYMPTOTE_BUILD_SHARED_DIRECTORY)
+ {
+ Write-Host "Copying setup file to shared directory."
+ Copy-Item -Force $asySetupFile "$env:ASYMPTOTE_BUILD_SHARED_DIRECTORY/$asySetupName"
+ }
+
+ Move-Item $asySetupFile . -Force
+}
+else
+{
+ Write-Error "Asymptote setup file not built."
+ Break
+}
+
+# ------------------------------------------------------
+# building for CTAN
+
+buildAsy msvc/release/with-external-doc-files/with-ctan cmake-build-msvc/release
+
+if ($env:ASYMPTOTE_BUILD_SHARED_DIRECTORY)
+{
+ Write-Output "Using shared build directory at $ASYMPTOTE_BUILD_SHARED_DIRECTORY for CTAN output"
+ $ctanOutputDir = "$env:ASYMPTOTE_BUILD_SHARED_DIRECTORY/CTAN"
+}
+else
+{
+ Write-Output "No shared directory specified. Using CTAN directory at top-level"
+ $ctanOutputDir = "CTAN"
+}
+
+New-Item -ItemType Directory -Path "$ctanOutputDir" -Force
+New-Item -ItemType Directory -Path "$ctanOutputDir/dll" -Force
+Get-ChildItem "$asymptoteRoot/cmake-install-w32-nsis-release/build-$Version/" `
+ -Filter "*.dll" | Copy-Item -Force -Destination "$ctanOutputDir/dll"
+Copy-Item $asymptoteRoot/cmake-build-msvc/release/asy.exe -Force -Destination "$ctanOutputDir/asy.exe"
+
+Pop-Location # asymptote
+deactivate # pyxasy build environment
diff --git a/graphics/asymptote/builtin.cc b/graphics/asymptote/builtin.cc
index bb706f99a8..2bf68d9b1a 100644
--- a/graphics/asymptote/builtin.cc
+++ b/graphics/asymptote/builtin.cc
@@ -81,7 +81,7 @@ void gen_rungsl_venv(venv &ve);
void addType(tenv &te, symbol name, ty *t)
{
- te.enter(name, new tyEntry(t,0,0,position()));
+ te.enter(name, new tyEntry(t,0,0,nullPos));
}
// The base environments for built-in types and functions
@@ -127,7 +127,7 @@ function *functionFromFormals(ty *result,
return fun;
}
-void addFunc(venv &ve, access *a, ty *result, symbol id,
+varEntry *addFunc(venv &ve, access *a, ty *result, symbol id,
formal f1=noformal, formal f2=noformal, formal f3=noformal,
formal f4=noformal, formal f5=noformal, formal f6=noformal,
formal f7=noformal, formal f8=noformal, formal f9=noformal,
@@ -140,13 +140,14 @@ void addFunc(venv &ve, access *a, ty *result, symbol id,
// NOTE: If the function is a field, we should encode the defining record in
// the entry
- varEntry *ent = new varEntry(fun, a, 0, position());
+ varEntry *ent = new varEntry(fun, a, 0, nullPos);
ve.enter(id, ent);
+ return ent;
}
// Add a function with one or more default arguments.
-void addFunc(venv &ve, bltin f, ty *result, symbol name,
+varEntry *addFunc(venv &ve, bltin f, ty *result, symbol name,
formal f1, formal f2, formal f3, formal f4, formal f5, formal f6,
formal f7, formal f8, formal f9, formal fA, formal fB, formal fC,
formal fD, formal fE, formal fF, formal fG, formal fH, formal fI)
@@ -171,8 +172,8 @@ void addFunc(venv &ve, bltin f, ty *result, symbol name,
#endif
access *a = new bltinAccess(f);
- addFunc(ve,a,result,name,f1,f2,f3,f4,f5,f6,f7,f8,f9,
- fA,fB,fC,fD,fE,fF,fG,fH,fI);
+ return addFunc(ve,a,result,name,f1,f2,f3,f4,f5,f6,f7,f8,f9,
+ fA,fB,fC,fD,fE,fF,fG,fH,fI);
}
void addOpenFunc(venv &ve, bltin f, ty *result, symbol name)
@@ -182,7 +183,7 @@ void addOpenFunc(venv &ve, bltin f, ty *result, symbol name)
REGISTER_BLTIN(f, name);
access *a= new bltinAccess(f);
- varEntry *ent = new varEntry(fun, a, 0, position());
+ varEntry *ent = new varEntry(fun, a, 0, nullPos);
ve.enter(name, ent);
}
@@ -210,7 +211,7 @@ void addRestFunc(venv &ve, bltin f, ty *result, symbol name, formal frest,
if (frest.t) fun->addRest(frest);
- varEntry *ent = new varEntry(fun, a, 0, position());
+ varEntry *ent = new varEntry(fun, a, 0, nullPos);
ve.enter(name, ent);
}
@@ -301,7 +302,7 @@ template<class T>
void addVariable(venv &ve, T *ref, ty *t, symbol name,
record *module=settings::getSettingsModule()) {
access *a = new refAccess<T>(ref);
- varEntry *ent = new varEntry(t, a, PUBLIC, module, 0, position());
+ varEntry *ent = new varEntry(t, a, PUBLIC, module, 0, nullPos);
ve.enter(name, ent);
}
@@ -312,7 +313,7 @@ void addVariable(venv &ve, T value, ty *t, symbol name,
item* ref=new item;
*ref=value;
access *a = new itemRefAccess(ref);
- varEntry *ent = new varEntry(t, a, perm, module, 0, position());
+ varEntry *ent = new varEntry(t, a, perm, module, 0, nullPos);
ve.enter(name, ent);
}
@@ -659,22 +660,26 @@ void addArrayOps(venv &ve, types::array *t)
}
}
-void addRecordOps(venv &ve, record *r)
+void addRecordOps(record* r)
{
- addFunc(ve, run::boolMemEq, primBoolean(), SYM(alias), formal(r, SYM(a)),
- formal(r, SYM(b)));
- addFunc(ve, run::boolMemEq, primBoolean(), SYM_EQ, formal(r, SYM(a)),
- formal(r, SYM(b)));
- addFunc(ve, run::boolMemNeq, primBoolean(), SYM_NEQ, formal(r, SYM(a)),
- formal(r, SYM(b)));
+ assert(r);
+ trans::venv &ve = r->e.ve;
+ auto addOp= [&ve](vm::bltin f, ty* result, symbol name, auto&&... formals) {
+ varEntry* fVar=
+ addFunc(ve, f, result, name, std::forward<formal>(formals)...);
+ ve.registerAutoUnravel(name, fVar, AutounravelPriority::OFFER);
+ };
+ // alias
+ addOp(run::boolMemEq, primBoolean(), SYM(alias), formal(r, SYM(a)),
+ formal(r, SYM(b)));
+ // operator==
+ addOp(run::boolMemEq, primBoolean(), SYM_EQ, formal(r, SYM(a)),
+ formal(r, SYM(b)));
+ // operator!=
+ addOp(run::boolMemNeq, primBoolean(), SYM_NEQ, formal(r, SYM(a)),
+ formal(r, SYM(b)));
}
-void addFunctionOps(venv &ve, function *f)
-{
- // No function ops.
-}
-
-
void addOperators(venv &ve)
{
addSimpleOperator(ve,binaryOp<string,plus>,primString(),SYM_PLUS);
@@ -755,7 +760,7 @@ dummyRecord *createDummyRecord(venv &ve, symbol name)
dummyRecord *r=new dummyRecord(name);
vm::vmFrame *f = make_dummyframe(name);
addConstant(ve, f, r, name);
- addRecordOps(ve, r);
+ addRecordOps(r);
return r;
}
diff --git a/graphics/asymptote/builtin.h b/graphics/asymptote/builtin.h
index d59c5aa8c8..cdbcea2afc 100644
--- a/graphics/asymptote/builtin.h
+++ b/graphics/asymptote/builtin.h
@@ -23,21 +23,20 @@ void base_venv(venv &);
extern const types::formal noformal;
// Add a function with one or more default arguments.
-void addFunc(venv &ve, vm::bltin f, types::ty *result, symbol name,
- types::formal f1=noformal, types::formal f2=noformal,
- types::formal f3=noformal, types::formal f4=noformal,
- types::formal f5=noformal, types::formal f6=noformal,
- types::formal f7=noformal, types::formal f8=noformal,
- types::formal f9=noformal, types::formal fA=noformal,
- types::formal fB=noformal, types::formal fC=noformal,
- types::formal fD=noformal, types::formal fE=noformal,
- types::formal fF=noformal, types::formal fG=noformal,
- types::formal fH=noformal, types::formal fI=noformal);
+varEntry *addFunc(venv &ve, vm::bltin f, types::ty *result, symbol name,
+ types::formal f1=noformal, types::formal f2=noformal,
+ types::formal f3=noformal, types::formal f4=noformal,
+ types::formal f5=noformal, types::formal f6=noformal,
+ types::formal f7=noformal, types::formal f8=noformal,
+ types::formal f9=noformal, types::formal fA=noformal,
+ types::formal fB=noformal, types::formal fC=noformal,
+ types::formal fD=noformal, types::formal fE=noformal,
+ types::formal fF=noformal, types::formal fG=noformal,
+ types::formal fH=noformal, types::formal fI=noformal);
// Adds standard functions for a newly added types.
void addArrayOps(venv &ve, types::array *t);
-void addRecordOps(venv &ve, types::record *r);
-void addFunctionOps(venv &ve, types::function *f);
+void addRecordOps(types::record *r);
#ifdef HAVE_LIBGSL
types::record *getGSLModule();
diff --git a/graphics/asymptote/camp.l b/graphics/asymptote/camp.l
index b62de16f5c..d6b456606b 100644
--- a/graphics/asymptote/camp.l
+++ b/graphics/asymptote/camp.l
@@ -39,7 +39,7 @@ Int tokPos;
Int charPos;
//int commentDepth = 0;
-bool eof;
+bool isEof;
string eofMessage;
extern errorstream em;
@@ -62,7 +62,7 @@ void setlexer(input_f input, string filename)
yy_input = input;
tokPos = charPos = 1;
- eof=false;
+ isEof=false;
eofMessage="<no eof>";
}
@@ -101,7 +101,7 @@ void savesymbol(symbol name)
* etc. Following the Don't Repeat Yourself principle, the mapping from
* strings to names is defined only here in camp.l (because we can't produce
* lex rules from a C style macro).
- * The script opsymbols.pl reads this file scanning for rules using DEFSYMBOL
+ * The script opsymbols.py reads this file scanning for rules using DEFSYMBOL
* and creates opsymbols.h which defines the names for use in C++ code.
*/
#define DEFSYMBOL(name) \
@@ -151,7 +151,7 @@ void error(void)
// the error message that should be reported, and may differ if, say the input
// ends in the middle of a string or comment.
void setEOF(string message) {
- eof=true;
+ isEof=true;
eofMessage=message;
}
@@ -159,16 +159,16 @@ void setEOF(string message) {
// running out of input.
bool lexerEOF()
{
- return eof;
+ return isEof;
}
// Called by code outside of the lexer when it wants to report the unexpected
// eof as an error (instead of looking for more input).
void reportEOF() {
- assert(eof);
+ assert(isEof);
error();
em << eofMessage;
- em.sync();
+ em.sync(true);
}
position stringpos; // The position of the start of the string.
@@ -363,6 +363,7 @@ break {adjust(); return BREAK; }
continue {adjust(); return CONTINUE; }
struct {adjust(); return STRUCT; }
typedef {adjust(); return TYPEDEF; }
+using {adjust(); return USING; }
new {adjust(); return NEW; }
access {adjust(); return ACCESS; }
import {adjust(); return IMPORT; }
@@ -372,10 +373,12 @@ include {adjust(); return INCLUDE; }
quote {adjust(); return QUOTE; }
static {adjust(); makemod(trans::EXPLICIT_STATIC);
return MODIFIER; }
+autounravel {adjust(); makemod(trans::AUTOUNRAVEL);
+ return MODIFIER; }
public {adjust(); makeperm(trans::PUBLIC); return PERM; }
private {adjust(); makeperm(trans::PRIVATE); return PERM; }
restricted {adjust(); makeperm(trans::RESTRICTED); return PERM; }
-this {adjust(); return THIS; }
+this {adjust(); return THIS_TOK; }
explicit {adjust(); return EXPLICIT; }
diff --git a/graphics/asymptote/camp.tab.cc b/graphics/asymptote/camp.tab.cc
index d6f4602701..02f816ab3d 100644
--- a/graphics/asymptote/camp.tab.cc
+++ b/graphics/asymptote/camp.tab.cc
@@ -126,7 +126,7 @@ using namespace absyntax;
using sym::symbol;
using mem::string;
-#line 130 "camp.tab.c"
+#line 130 "camp.tab.cc"
# ifndef YY_CAST
# ifdef __cplusplus
@@ -212,78 +212,79 @@ enum yysymbol_kind_t
YYSYMBOL_QUOTE = 55, /* QUOTE */
YYSYMBOL_STRUCT = 56, /* STRUCT */
YYSYMBOL_TYPEDEF = 57, /* TYPEDEF */
- YYSYMBOL_NEW = 58, /* NEW */
- YYSYMBOL_IF = 59, /* IF */
- YYSYMBOL_ELSE = 60, /* ELSE */
- YYSYMBOL_WHILE = 61, /* WHILE */
- YYSYMBOL_DO = 62, /* DO */
- YYSYMBOL_FOR = 63, /* FOR */
- YYSYMBOL_BREAK = 64, /* BREAK */
- YYSYMBOL_CONTINUE = 65, /* CONTINUE */
- YYSYMBOL_RETURN_ = 66, /* RETURN_ */
- YYSYMBOL_THIS = 67, /* THIS */
- YYSYMBOL_EXPLICIT = 68, /* EXPLICIT */
- YYSYMBOL_GARBAGE = 69, /* GARBAGE */
- YYSYMBOL_LIT = 70, /* LIT */
- YYSYMBOL_STRING = 71, /* STRING */
- YYSYMBOL_PERM = 72, /* PERM */
- YYSYMBOL_MODIFIER = 73, /* MODIFIER */
- YYSYMBOL_UNARY = 74, /* UNARY */
- YYSYMBOL_EXP_IN_PARENS_RULE = 75, /* EXP_IN_PARENS_RULE */
- YYSYMBOL_YYACCEPT = 76, /* $accept */
- YYSYMBOL_file = 77, /* file */
- YYSYMBOL_fileblock = 78, /* fileblock */
- YYSYMBOL_bareblock = 79, /* bareblock */
- YYSYMBOL_name = 80, /* name */
- YYSYMBOL_runnable = 81, /* runnable */
- YYSYMBOL_modifiers = 82, /* modifiers */
- YYSYMBOL_dec = 83, /* dec */
- YYSYMBOL_decdec = 84, /* decdec */
- YYSYMBOL_decdeclist = 85, /* decdeclist */
- YYSYMBOL_typeparam = 86, /* typeparam */
- YYSYMBOL_typeparamlist = 87, /* typeparamlist */
- YYSYMBOL_idpair = 88, /* idpair */
- YYSYMBOL_idpairlist = 89, /* idpairlist */
- YYSYMBOL_strid = 90, /* strid */
- YYSYMBOL_stridpair = 91, /* stridpair */
- YYSYMBOL_stridpairlist = 92, /* stridpairlist */
- YYSYMBOL_vardec = 93, /* vardec */
- YYSYMBOL_barevardec = 94, /* barevardec */
- YYSYMBOL_type = 95, /* type */
- YYSYMBOL_celltype = 96, /* celltype */
- YYSYMBOL_dims = 97, /* dims */
- YYSYMBOL_dimexps = 98, /* dimexps */
- YYSYMBOL_decidlist = 99, /* decidlist */
- YYSYMBOL_decid = 100, /* decid */
- YYSYMBOL_decidstart = 101, /* decidstart */
- YYSYMBOL_varinit = 102, /* varinit */
- YYSYMBOL_block = 103, /* block */
- YYSYMBOL_arrayinit = 104, /* arrayinit */
- YYSYMBOL_basearrayinit = 105, /* basearrayinit */
- YYSYMBOL_varinits = 106, /* varinits */
- YYSYMBOL_formals = 107, /* formals */
- YYSYMBOL_explicitornot = 108, /* explicitornot */
- YYSYMBOL_formal = 109, /* formal */
- YYSYMBOL_fundec = 110, /* fundec */
- YYSYMBOL_typedec = 111, /* typedec */
- YYSYMBOL_slice = 112, /* slice */
- YYSYMBOL_value = 113, /* value */
- YYSYMBOL_argument = 114, /* argument */
- YYSYMBOL_arglist = 115, /* arglist */
- YYSYMBOL_tuple = 116, /* tuple */
- YYSYMBOL_exp = 117, /* exp */
- YYSYMBOL_join = 118, /* join */
- YYSYMBOL_dir = 119, /* dir */
- YYSYMBOL_basicjoin = 120, /* basicjoin */
- YYSYMBOL_tension = 121, /* tension */
- YYSYMBOL_controls = 122, /* controls */
- YYSYMBOL_stm = 123, /* stm */
- YYSYMBOL_stmexp = 124, /* stmexp */
- YYSYMBOL_blockstm = 125, /* blockstm */
- YYSYMBOL_forinit = 126, /* forinit */
- YYSYMBOL_fortest = 127, /* fortest */
- YYSYMBOL_forupdate = 128, /* forupdate */
- YYSYMBOL_stmexplist = 129 /* stmexplist */
+ YYSYMBOL_USING = 58, /* USING */
+ YYSYMBOL_NEW = 59, /* NEW */
+ YYSYMBOL_IF = 60, /* IF */
+ YYSYMBOL_ELSE = 61, /* ELSE */
+ YYSYMBOL_WHILE = 62, /* WHILE */
+ YYSYMBOL_DO = 63, /* DO */
+ YYSYMBOL_FOR = 64, /* FOR */
+ YYSYMBOL_BREAK = 65, /* BREAK */
+ YYSYMBOL_CONTINUE = 66, /* CONTINUE */
+ YYSYMBOL_RETURN_ = 67, /* RETURN_ */
+ YYSYMBOL_THIS_TOK = 68, /* THIS_TOK */
+ YYSYMBOL_EXPLICIT = 69, /* EXPLICIT */
+ YYSYMBOL_GARBAGE = 70, /* GARBAGE */
+ YYSYMBOL_LIT = 71, /* LIT */
+ YYSYMBOL_STRING = 72, /* STRING */
+ YYSYMBOL_PERM = 73, /* PERM */
+ YYSYMBOL_MODIFIER = 74, /* MODIFIER */
+ YYSYMBOL_UNARY = 75, /* UNARY */
+ YYSYMBOL_EXP_IN_PARENS_RULE = 76, /* EXP_IN_PARENS_RULE */
+ YYSYMBOL_YYACCEPT = 77, /* $accept */
+ YYSYMBOL_file = 78, /* file */
+ YYSYMBOL_fileblock = 79, /* fileblock */
+ YYSYMBOL_bareblock = 80, /* bareblock */
+ YYSYMBOL_name = 81, /* name */
+ YYSYMBOL_runnable = 82, /* runnable */
+ YYSYMBOL_modifiers = 83, /* modifiers */
+ YYSYMBOL_dec = 84, /* dec */
+ YYSYMBOL_decdec = 85, /* decdec */
+ YYSYMBOL_decdeclist = 86, /* decdeclist */
+ YYSYMBOL_typeparam = 87, /* typeparam */
+ YYSYMBOL_typeparamlist = 88, /* typeparamlist */
+ YYSYMBOL_idpair = 89, /* idpair */
+ YYSYMBOL_idpairlist = 90, /* idpairlist */
+ YYSYMBOL_strid = 91, /* strid */
+ YYSYMBOL_stridpair = 92, /* stridpair */
+ YYSYMBOL_stridpairlist = 93, /* stridpairlist */
+ YYSYMBOL_vardec = 94, /* vardec */
+ YYSYMBOL_barevardec = 95, /* barevardec */
+ YYSYMBOL_type = 96, /* type */
+ YYSYMBOL_celltype = 97, /* celltype */
+ YYSYMBOL_dims = 98, /* dims */
+ YYSYMBOL_dimexps = 99, /* dimexps */
+ YYSYMBOL_decidlist = 100, /* decidlist */
+ YYSYMBOL_decid = 101, /* decid */
+ YYSYMBOL_decidstart = 102, /* decidstart */
+ YYSYMBOL_varinit = 103, /* varinit */
+ YYSYMBOL_block = 104, /* block */
+ YYSYMBOL_arrayinit = 105, /* arrayinit */
+ YYSYMBOL_basearrayinit = 106, /* basearrayinit */
+ YYSYMBOL_varinits = 107, /* varinits */
+ YYSYMBOL_formals = 108, /* formals */
+ YYSYMBOL_explicitornot = 109, /* explicitornot */
+ YYSYMBOL_formal = 110, /* formal */
+ YYSYMBOL_fundec = 111, /* fundec */
+ YYSYMBOL_typedec = 112, /* typedec */
+ YYSYMBOL_slice = 113, /* slice */
+ YYSYMBOL_value = 114, /* value */
+ YYSYMBOL_argument = 115, /* argument */
+ YYSYMBOL_arglist = 116, /* arglist */
+ YYSYMBOL_tuple = 117, /* tuple */
+ YYSYMBOL_exp = 118, /* exp */
+ YYSYMBOL_join = 119, /* join */
+ YYSYMBOL_dir = 120, /* dir */
+ YYSYMBOL_basicjoin = 121, /* basicjoin */
+ YYSYMBOL_tension = 122, /* tension */
+ YYSYMBOL_controls = 123, /* controls */
+ YYSYMBOL_stm = 124, /* stm */
+ YYSYMBOL_stmexp = 125, /* stmexp */
+ YYSYMBOL_blockstm = 126, /* blockstm */
+ YYSYMBOL_forinit = 127, /* forinit */
+ YYSYMBOL_fortest = 128, /* fortest */
+ YYSYMBOL_forupdate = 129, /* forupdate */
+ YYSYMBOL_stmexplist = 130 /* stmexplist */
};
typedef enum yysymbol_kind_t yysymbol_kind_t;
@@ -611,19 +612,19 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 3
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 1994
+#define YYLAST 1984
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 76
+#define YYNTOKENS 77
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS 54
/* YYNRULES -- Number of rules. */
-#define YYNRULES 213
+#define YYNRULES 216
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 416
+#define YYNSTATES 427
/* YYMAXUTOK -- Last valid token kind. */
-#define YYMAXUTOK 312
+#define YYMAXUTOK 313
/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -668,7 +669,7 @@ static const yytype_int8 yytranslate[] =
32, 33, 34, 37, 38, 39, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
- 73, 74, 75
+ 73, 74, 75, 76
};
#if YYDEBUG
@@ -684,19 +685,19 @@ static const yytype_int16 yyrline[] =
360, 361, 366, 367, 372, 373, 378, 379, 380, 382,
387, 388, 392, 397, 398, 400, 402, 407, 408, 409,
413, 415, 420, 421, 422, 424, 429, 430, 434, 436,
- 438, 441, 444, 450, 452, 457, 458, 462, 463, 464,
- 465, 469, 470, 472, 473, 475, 476, 479, 483, 484,
- 486, 488, 490, 494, 495, 499, 500, 502, 504, 510,
- 511, 515, 516, 517, 518, 520, 521, 523, 525, 527,
- 529, 530, 531, 532, 533, 534, 535, 536, 537, 538,
- 539, 540, 541, 542, 543, 544, 545, 546, 547, 548,
- 549, 550, 552, 554, 556, 558, 560, 562, 567, 569,
- 574, 576, 577, 578, 580, 586, 588, 591, 593, 594,
- 601, 602, 604, 607, 610, 616, 617, 618, 621, 627,
- 628, 630, 632, 633, 637, 639, 642, 645, 651, 652,
- 657, 658, 659, 660, 662, 664, 666, 668, 670, 672,
- 673, 674, 675, 679, 683, 687, 688, 689, 693, 694,
- 698, 699, 703, 704
+ 438, 441, 444, 450, 452, 457, 458, 463, 466, 470,
+ 476, 477, 478, 479, 483, 484, 486, 487, 489, 490,
+ 493, 497, 498, 500, 502, 504, 508, 509, 513, 514,
+ 516, 518, 524, 525, 529, 530, 531, 532, 534, 535,
+ 537, 539, 541, 543, 544, 545, 546, 547, 548, 549,
+ 550, 551, 552, 553, 554, 555, 556, 557, 558, 559,
+ 560, 561, 562, 563, 564, 566, 568, 570, 572, 574,
+ 576, 581, 583, 588, 590, 591, 592, 594, 600, 602,
+ 605, 607, 608, 615, 616, 618, 621, 624, 630, 631,
+ 632, 635, 641, 642, 644, 646, 647, 651, 653, 656,
+ 659, 665, 666, 671, 672, 673, 674, 676, 678, 680,
+ 682, 684, 686, 687, 688, 689, 693, 697, 701, 702,
+ 703, 707, 708, 712, 713, 717, 718
};
#endif
@@ -719,10 +720,10 @@ static const char *const yytname[] =
"OPERATOR", "LOOSE", "ASSIGN", "'?'", "':'", "DIRTAG", "JOIN_PREC",
"AND", "'{'", "'}'", "'('", "')'", "'.'", "','", "'['", "']'", "';'",
"ELLIPSIS", "ACCESS", "UNRAVEL", "IMPORT", "INCLUDE", "FROM", "QUOTE",
- "STRUCT", "TYPEDEF", "NEW", "IF", "ELSE", "WHILE", "DO", "FOR", "BREAK",
- "CONTINUE", "RETURN_", "THIS", "EXPLICIT", "GARBAGE", "LIT", "STRING",
- "PERM", "MODIFIER", "UNARY", "EXP_IN_PARENS_RULE", "$accept", "file",
- "fileblock", "bareblock", "name", "runnable", "modifiers", "dec",
+ "STRUCT", "TYPEDEF", "USING", "NEW", "IF", "ELSE", "WHILE", "DO", "FOR",
+ "BREAK", "CONTINUE", "RETURN_", "THIS_TOK", "EXPLICIT", "GARBAGE", "LIT",
+ "STRING", "PERM", "MODIFIER", "UNARY", "EXP_IN_PARENS_RULE", "$accept",
+ "file", "fileblock", "bareblock", "name", "runnable", "modifiers", "dec",
"decdec", "decdeclist", "typeparam", "typeparamlist", "idpair",
"idpairlist", "strid", "stridpair", "stridpairlist", "vardec",
"barevardec", "type", "celltype", "dims", "dimexps", "decidlist",
@@ -740,7 +741,7 @@ yysymbol_name (yysymbol_kind_t yysymbol)
}
#endif
-#define YYPACT_NINF (-292)
+#define YYPACT_NINF (-312)
#define yypact_value_is_default(Yyn) \
((Yyn) == YYPACT_NINF)
@@ -754,48 +755,49 @@ yysymbol_name (yysymbol_kind_t yysymbol)
STATE-NUM. */
static const yytype_int16 yypact[] =
{
- -292, 43, 500, -292, -292, 881, 881, 881, 881, -292,
- 881, -292, 881, -292, 20, 31, 15, 24, 17, 21,
- 68, 11, 31, 50, 57, 176, 64, 143, 156, 282,
- -292, 27, -292, -292, -292, 129, -292, 571, -292, -292,
- 185, 165, -292, -292, -292, -292, 111, 1560, -292, 197,
- -292, 175, 183, 183, 183, 183, 1946, 358, 222, 124,
- 1161, 45, -292, 26, -292, 60, 132, 210, 34, 233,
- 238, 245, -1, 4, 12, -292, 221, 268, -2, -292,
- 293, 273, 202, 881, 881, 262, 881, -292, -292, -292,
- 976, 183, 642, 316, 669, 281, -292, -292, -292, -292,
- -292, 213, 283, -292, 297, 700, 329, 727, 881, 217,
- -292, -292, 27, -292, 881, 881, 881, 881, 881, 881,
- 881, 881, 881, 881, 881, 881, 881, 881, 881, 881,
- 881, 881, 881, 881, 881, 770, 881, -292, 294, -292,
- 727, -292, -292, 27, 160, -292, 881, -292, 881, 330,
- 35, 20, -292, -292, 336, 35, -292, -292, -292, 131,
- 35, 147, 429, -292, 336, 307, 216, 2, 784, 146,
- 309, 1287, 1327, 315, -292, 353, -292, 310, 317, -292,
- 325, -292, 908, -292, 144, 1560, -292, 881, -292, 320,
- 1013, 321, 7, 281, 293, 827, -292, 151, -292, 322,
- 1050, 1560, 881, 854, 359, 365, 348, 1778, 1806, 1834,
- 1862, 1890, 1890, 1918, 1918, 1918, 1918, 1954, 314, 314,
- 183, 183, 183, 183, 183, 1946, 1560, 1523, 881, 1203,
- 348, 294, -292, -292, 881, 1560, 1560, -292, 347, -292,
- 239, -292, 360, -292, -292, -292, 249, 254, 383, 344,
- -292, 225, 258, 345, 231, -292, 270, 9, 221, 326,
- -292, 166, 31, -292, 1087, 280, 16, -292, 784, 281,
- 176, 176, 881, 120, 881, 881, 881, -292, -292, 908,
- 908, 1560, -292, 881, -292, -292, 221, 177, -292, -292,
- -292, 1560, -292, -292, -292, 1595, 881, 1632, -292, -292,
- 881, 1447, -292, 881, -292, -292, 31, 18, 35, 349,
- 336, 354, 392, -292, 393, -292, 351, -292, -292, 356,
- -292, 187, -292, -292, 221, 326, 326, 402, -292, -292,
- -292, 827, -292, 110, 362, 221, 208, 1124, 366, -292,
- 1367, 881, 1560, 370, -292, 1560, -292, -292, 1560, -292,
- 221, 881, 1669, 881, 1742, -292, 1245, -292, 424, -292,
- -292, -292, -292, -292, -292, -292, 393, -292, -292, -292,
- -292, -292, 139, 399, 394, -292, 827, 827, -292, 221,
- -292, 176, 386, 1407, 881, -292, 1706, 881, 1706, -292,
- 881, 390, 232, 405, 827, -292, 400, -292, -292, -292,
- -292, 176, 397, 317, 1706, 1485, -292, -292, 827, -292,
- -292, -292, 176, -292, -292, -292
+ -312, 65, 450, -312, -312, 903, 903, 903, 903, -312,
+ 903, -312, 903, -312, 34, 32, 14, 38, 18, 134,
+ 199, 15, 200, 32, 137, 171, 594, 172, 180, 181,
+ 721, -312, 217, -312, -312, -312, 30, -312, 522, -312,
+ -312, 196, 258, -312, -312, -312, -312, 150, 1558, -312,
+ 246, -312, 224, 274, 274, 274, 274, 1944, 183, 314,
+ 12, 1159, 94, -312, 21, -312, 139, 127, 266, 36,
+ 261, 283, 287, -2, 1, 50, -312, 294, 301, 39,
+ -312, 344, 316, 307, 153, 903, 903, 293, 903, -312,
+ -312, -312, 974, 274, 596, 345, 666, 315, -312, -312,
+ -312, -312, -312, 216, 317, -312, 330, 668, 362, 723,
+ 903, 147, -312, -312, 217, -312, 903, 903, 903, 903,
+ 903, 903, 903, 903, 903, 903, 903, 903, 903, 903,
+ 903, 903, 903, 903, 903, 903, 903, 793, 903, -312,
+ 326, -312, 723, -312, -312, 217, 184, -312, 903, -312,
+ 903, 365, 35, 34, -312, -312, 366, 35, -312, -312,
+ -312, 57, 35, 67, 378, -312, 366, 323, 250, 32,
+ 19, 795, 136, 325, 1285, 1325, 331, -312, 371, -312,
+ 329, 333, -312, 348, -312, 905, -312, 161, 1558, -312,
+ 903, -312, 336, 1011, 337, 95, 315, 344, 848, -312,
+ 162, -312, 340, 1048, 1558, 903, 850, 383, 386, 297,
+ 1776, 1804, 1832, 1860, 1888, 1888, 1916, 1916, 1916, 1916,
+ 803, 286, 286, 274, 274, 274, 274, 274, 1944, 1558,
+ 1521, 903, 1201, 297, 326, -312, -312, 903, 1558, 1558,
+ -312, 358, -312, 52, -312, 391, -312, -312, -312, 176,
+ 276, 392, 349, -312, 232, 295, 350, 253, -312, 296,
+ 104, 141, 294, 327, -312, 173, 32, -312, 1085, 304,
+ 112, -312, 795, 315, 594, 594, 903, 7, 903, 903,
+ 903, -312, -312, 905, 905, 1558, -312, 903, -312, -312,
+ 294, 220, -312, -312, -312, 1558, -312, -312, -312, 1593,
+ 903, 1630, -312, -312, 903, 1445, -312, 903, -312, -312,
+ 32, 29, 35, 352, 366, 354, 402, -312, 403, -312,
+ 359, -312, -312, 360, -312, 238, 119, -312, -312, -312,
+ 294, 327, 327, 408, -312, -312, -312, 848, -312, 9,
+ 367, 294, 241, 1122, 355, -312, 1365, 903, 1558, 369,
+ -312, 1558, -312, -312, 1558, -312, 294, 903, 1667, 903,
+ 1740, -312, 1243, -312, 410, -312, -312, -312, -312, -312,
+ -312, -312, 403, -312, -312, 373, 248, -312, -312, -312,
+ 33, 381, 382, -312, 848, 848, -312, 294, -312, 594,
+ 374, 1405, 903, -312, 1704, 903, 1704, -312, 903, 376,
+ 255, -312, 377, 393, 848, -312, 398, -312, -312, -312,
+ -312, 594, 404, 333, 1704, 1483, -312, -312, -312, 848,
+ -312, -312, -312, 594, -312, -312, -312
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -804,69 +806,70 @@ static const yytype_int16 yypact[] =
static const yytype_uint8 yydefact[] =
{
3, 0, 2, 1, 7, 0, 0, 0, 0, 9,
- 0, 5, 0, 190, 0, 0, 0, 0, 0, 0,
+ 0, 5, 0, 193, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 112, 123, 124, 15, 14, 121, 4, 0, 10, 18,
- 0, 0, 55, 204, 19, 20, 122, 203, 11, 0,
- 191, 121, 166, 165, 128, 129, 130, 0, 121, 0,
- 0, 47, 48, 0, 51, 0, 0, 0, 0, 0,
- 0, 0, 7, 0, 0, 3, 0, 0, 57, 96,
- 0, 57, 151, 0, 0, 0, 205, 199, 200, 201,
- 0, 125, 0, 0, 0, 56, 17, 16, 12, 13,
- 53, 66, 54, 62, 64, 0, 0, 0, 0, 179,
- 182, 170, 167, 183, 0, 0, 0, 0, 0, 0,
+ 0, 115, 126, 127, 15, 14, 124, 4, 0, 10,
+ 18, 0, 0, 55, 207, 19, 20, 125, 206, 11,
+ 0, 194, 124, 169, 168, 131, 132, 133, 0, 124,
+ 0, 0, 47, 48, 0, 51, 0, 0, 0, 0,
+ 0, 0, 0, 7, 0, 0, 3, 0, 0, 57,
+ 96, 0, 0, 57, 154, 0, 0, 0, 208, 202,
+ 203, 204, 0, 128, 0, 0, 0, 56, 17, 16,
+ 12, 13, 53, 66, 54, 62, 64, 0, 0, 0,
+ 0, 182, 185, 173, 170, 186, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 164, 171, 192,
- 0, 72, 6, 111, 0, 162, 0, 110, 0, 0,
- 0, 0, 21, 24, 0, 0, 27, 28, 29, 0,
- 0, 0, 0, 95, 0, 0, 66, 87, 0, 154,
- 152, 0, 0, 0, 207, 0, 212, 0, 206, 202,
- 7, 106, 0, 115, 0, 113, 8, 97, 58, 0,
- 0, 0, 87, 67, 0, 0, 108, 0, 101, 0,
- 0, 168, 0, 0, 0, 0, 150, 145, 144, 148,
- 147, 142, 143, 138, 139, 140, 141, 146, 131, 132,
- 133, 134, 135, 136, 137, 149, 161, 0, 0, 0,
- 163, 172, 173, 126, 0, 120, 119, 50, 7, 38,
- 0, 37, 0, 52, 40, 41, 0, 0, 43, 0,
- 45, 0, 0, 0, 0, 169, 0, 87, 0, 87,
- 86, 0, 0, 82, 0, 0, 87, 155, 0, 153,
- 0, 0, 0, 66, 208, 0, 0, 116, 107, 0,
- 0, 99, 104, 98, 102, 59, 68, 0, 63, 65,
- 71, 70, 109, 105, 103, 188, 0, 184, 180, 181,
- 0, 0, 176, 0, 174, 127, 0, 0, 0, 0,
- 0, 0, 0, 23, 0, 22, 0, 26, 25, 0,
- 68, 0, 156, 83, 0, 87, 87, 88, 60, 73,
- 77, 0, 80, 0, 78, 0, 0, 0, 193, 195,
- 0, 0, 209, 0, 213, 114, 117, 118, 100, 93,
- 69, 0, 186, 0, 160, 175, 0, 36, 0, 33,
- 39, 31, 42, 34, 44, 46, 0, 30, 69, 158,
- 84, 85, 66, 89, 0, 75, 0, 79, 157, 0,
- 61, 0, 0, 0, 210, 94, 189, 0, 185, 177,
- 0, 0, 0, 91, 0, 74, 0, 81, 159, 194,
- 196, 0, 0, 211, 187, 0, 32, 35, 0, 90,
- 76, 198, 0, 178, 92, 197
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 167,
+ 174, 195, 0, 72, 6, 114, 0, 165, 0, 113,
+ 0, 0, 0, 0, 21, 24, 0, 0, 27, 28,
+ 29, 0, 0, 0, 0, 95, 0, 0, 66, 0,
+ 87, 0, 157, 155, 0, 0, 0, 210, 0, 215,
+ 0, 209, 205, 7, 109, 0, 118, 0, 116, 8,
+ 100, 58, 0, 0, 0, 87, 67, 0, 0, 111,
+ 0, 104, 0, 0, 171, 0, 0, 0, 0, 153,
+ 148, 147, 151, 150, 145, 146, 141, 142, 143, 144,
+ 149, 134, 135, 136, 137, 138, 139, 140, 152, 164,
+ 0, 0, 0, 166, 175, 176, 129, 0, 123, 122,
+ 50, 7, 38, 0, 37, 0, 52, 40, 41, 0,
+ 0, 43, 0, 45, 0, 0, 0, 0, 172, 0,
+ 87, 0, 0, 87, 86, 0, 0, 82, 0, 0,
+ 87, 158, 0, 156, 0, 0, 0, 66, 211, 0,
+ 0, 119, 110, 0, 0, 102, 107, 101, 105, 59,
+ 68, 0, 63, 65, 71, 70, 112, 108, 106, 191,
+ 0, 187, 183, 184, 0, 0, 179, 0, 177, 130,
+ 0, 0, 0, 0, 0, 0, 0, 23, 0, 22,
+ 0, 26, 25, 0, 68, 0, 87, 97, 159, 83,
+ 0, 87, 87, 88, 60, 73, 77, 0, 80, 0,
+ 78, 0, 0, 0, 196, 198, 0, 0, 212, 0,
+ 216, 117, 120, 121, 103, 93, 69, 0, 189, 0,
+ 163, 178, 0, 36, 0, 33, 39, 31, 42, 34,
+ 44, 46, 0, 30, 69, 0, 0, 161, 84, 85,
+ 66, 89, 0, 75, 0, 79, 160, 0, 61, 0,
+ 0, 0, 213, 94, 192, 0, 188, 180, 0, 0,
+ 0, 98, 0, 91, 0, 74, 0, 81, 162, 197,
+ 199, 0, 0, 214, 190, 0, 32, 35, 99, 0,
+ 90, 76, 201, 0, 181, 92, 200
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -292, -292, 367, -292, 10, 387, -292, 406, 137, 52,
- 136, 284, 133, -153, 1, -3, -292, 428, 364, -6,
- 430, -25, -292, -292, 257, -291, -230, 377, 287, -292,
- -292, -183, -292, -186, -292, -292, 350, -292, -143, 355,
- -292, -5, -292, -127, 327, -292, -292, -21, -80, -125,
- -292, -292, -292, 75
+ -312, -312, 372, -312, 8, 396, -312, 417, 144, -106,
+ 145, 298, 142, -155, -4, -3, -312, 440, 375, -6,
+ 439, -25, -312, -312, 268, -311, -250, 389, 299, -312,
+ -312, -167, -312, -233, -312, -312, 361, -312, -176, 370,
+ -312, -5, -312, -98, 328, -312, -312, -22, -82, -189,
+ -312, -312, -312, 76
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- 0, 1, 2, 57, 51, 36, 37, 38, 239, 240,
- 245, 246, 250, 251, 63, 64, 65, 39, 40, 41,
- 42, 193, 170, 102, 103, 104, 289, 43, 290, 333,
- 334, 261, 262, 263, 44, 45, 189, 46, 183, 184,
- 59, 47, 136, 137, 138, 204, 205, 48, 49, 50,
- 177, 343, 402, 178
+ 0, 1, 2, 58, 52, 37, 38, 39, 242, 243,
+ 248, 249, 253, 254, 64, 65, 66, 40, 41, 42,
+ 43, 196, 173, 104, 105, 106, 293, 44, 294, 339,
+ 340, 265, 266, 267, 45, 46, 192, 47, 186, 187,
+ 60, 48, 138, 139, 140, 207, 208, 49, 50, 51,
+ 180, 349, 412, 181
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@@ -874,331 +877,334 @@ static const yytype_int16 yydefgoto[] =
number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_int16 yytable[] =
{
- 52, 53, 54, 55, 85, 56, 176, 60, 254, 287,
- 95, 232, 35, 69, 4, 80, 99, 68, 61, 74,
- 72, 358, 58, 61, 90, 66, 91, 70, 73, 149,
- 4, 78, 81, 144, 4, 332, 373, 149, 238, 277,
- 9, -47, 93, 3, 165, 258, 9, 35, 93, -47,
- 286, 259, 320, 95, 160, 159, 259, 169, 259, 335,
- 9, 75, 161, 77, 9, 259, 359, 35, 150, 12,
- 260, 76, 67, 323, 321, 260, 155, 260, 171, 172,
- 175, 393, 19, 336, 260, 22, 62, 185, 62, 190,
- -49, 62, 83, -49, 30, 71, 35, 31, 32, 84,
- 185, 374, 200, 201, 304, 151, 86, 206, 152, 207,
- 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
- 218, 219, 220, 221, 222, 223, 224, 225, 226, 227,
- 229, 230, -57, 322, 248, 190, 346, 347, 233, 370,
- 371, 235, 166, 236, 241, 269, 396, 397, 243, 241,
- 248, 375, 242, 105, 241, 106, 341, 107, 249, 376,
- 78, 349, 257, 264, 409, 78, 165, 145, 101, 146,
- 78, 92, 35, 93, 253, 94, 93, 185, 414, 4,
- 153, 257, 281, 5, 6, 165, 265, 278, 266, 279,
- 291, 87, 191, 280, 292, 344, 279, 295, 297, 369,
- 280, 7, 8, 234, 88, 9, 191, 247, 10, 324,
- 378, 325, 252, 392, 131, 326, 11, 92, 12, 93,
- 350, 140, 325, 301, 13, 385, 326, 202, 203, 305,
- 368, 19, 325, 100, 22, 23, 326, 24, 25, 26,
- 27, 28, 29, 30, 167, 139, 31, 32, 168, 338,
- 339, 379, 154, 325, 398, 192, 327, 326, 257, 165,
- 291, 11, 165, 337, 92, 143, 93, 340, 94, 342,
- 314, 345, 78, 315, 185, 185, 314, 314, 348, 318,
- 407, 156, 307, 4, 308, 4, 157, 5, 6, 5,
- 6, 352, 309, 158, 310, 354, 166, 311, 356, 308,
- 357, 316, 241, 308, 176, 7, 8, 7, 8, 9,
- 164, 9, 10, 319, 10, 310, 78, 93, 78, 186,
- 265, 329, 12, 173, 12, 330, 291, 191, 194, 331,
- 89, 195, 198, 237, 135, 19, 383, 19, 22, 244,
- 22, 127, 128, 129, 130, 131, 386, 30, 388, 30,
- 31, 32, 31, 32, 188, 268, 273, 272, 274, 276,
- 399, 4, 275, 149, 298, 5, 6, 282, 285, 293,
- 299, 291, 291, 125, 126, 127, 128, 129, 130, 131,
- 411, 306, 404, 7, 8, 405, 312, 9, 135, 291,
- 10, 415, 313, 317, 260, 364, 248, 361, 11, 141,
- 12, 366, 363, 291, 367, 372, 13, 377, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 23, 384, 24,
- 25, 26, 27, 28, 29, 30, 381, 391, 31, 32,
- 33, 34, 4, 394, 400, 395, 5, 6, 406, 408,
- 412, 410, 162, 98, 142, 360, 362, 365, 256, 79,
- 174, 288, 82, 163, 7, 8, 267, 199, 9, 403,
- 197, 10, 0, 0, 231, 0, 0, 0, 0, 11,
- 255, 12, 0, 0, 0, 0, 0, 13, 0, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 0,
- 24, 25, 26, 27, 28, 29, 30, 0, 0, 31,
- 32, 33, 34, 4, 0, 0, 0, 5, 6, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 8, 0, 0, 9,
+ 53, 54, 55, 56, 87, 57, 179, 61, 257, 281,
+ 36, 97, 69, 70, 75, 81, 101, 62, 4, 338,
+ 59, 73, 381, 67, 151, 92, 74, 93, 291, 79,
+ 329, 83, 364, -57, 146, 4, 168, 62, 241, 151,
+ -47, 71, 235, 347, 9, 95, 36, 9, -47, 260,
+ 383, 250, 161, 167, 97, 147, 255, 148, 384, 172,
+ 251, 9, 262, 152, 9, 3, 36, 78, 263, 403,
+ 251, 68, 94, 328, 95, 260, 96, 365, 157, 167,
+ 174, 175, 178, 95, 252, 167, 63, 382, 264, 188,
+ 63, 193, 162, 325, 256, 311, 36, 312, 378, 379,
+ 163, 355, 188, 342, 203, 204, 63, 352, 353, 209,
+ 72, 210, 211, 212, 213, 214, 215, 216, 217, 218,
+ 219, 220, 221, 222, 223, 224, 225, 226, 227, 228,
+ 229, 230, 232, 233, 406, 407, 308, 193, 290, -49,
+ 236, 377, -49, 238, 263, 239, 244, 324, 273, 245,
+ 246, 244, 386, 263, 420, 341, 244, 205, 206, 376,
+ 79, 263, 375, 261, 264, 79, 268, 393, 263, 425,
+ 79, 95, 36, 264, 76, 155, 269, 79, 270, 85,
+ 188, 264, 194, 326, 153, 285, 4, 154, 264, 327,
+ 5, 6, 107, 295, 108, 170, 109, 350, 408, 171,
+ 299, 301, 77, 82, 282, 296, 283, 283, 7, 8,
+ 284, 284, 9, 86, 88, 10, 330, 400, 331, 313,
+ 4, 314, 332, 11, 143, 12, 305, 237, 89, 90,
+ 194, 13, 309, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 102, 25, 26, 27, 28, 29,
+ 30, 31, 344, 345, 32, 33, 34, 35, 195, 12,
+ 333, 103, 167, 356, 295, 331, 94, 343, 95, 332,
+ 142, 346, 19, 348, 79, 351, 23, 318, 188, 188,
+ 319, 374, 354, 331, 387, 31, 331, 332, 32, 33,
+ 332, 402, 260, 331, 141, 358, 167, 332, 318, 360,
+ 318, 322, 362, 417, 363, 133, 244, 4, 156, 158,
+ 179, 5, 6, 129, 130, 131, 132, 133, 79, 315,
+ 79, 312, 127, 128, 129, 130, 131, 132, 133, 7,
+ 8, 159, 295, 9, 11, 160, 10, 137, 320, 323,
+ 312, 314, 391, 166, 269, 335, 12, 168, 189, 336,
+ 169, 95, 394, 337, 396, 176, 94, 145, 95, 19,
+ 96, 194, 197, 23, 198, 201, 137, 409, 240, 247,
+ 191, 272, 31, 276, 277, 32, 33, 278, 279, 295,
+ 295, 4, 280, 286, 289, 5, 6, 297, 302, 422,
+ 414, 303, 310, 415, 151, 316, 264, 317, 321, 295,
+ 367, 426, 369, 7, 8, 370, 251, 9, 373, 372,
+ 10, 380, 385, 399, 295, 404, 389, 392, 11, 258,
+ 12, 401, 410, 405, 416, 418, 13, 419, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 421,
+ 25, 26, 27, 28, 29, 30, 31, 423, 164, 32,
+ 33, 34, 35, 4, 144, 100, 366, 5, 6, 368,
+ 371, 80, 84, 177, 259, 292, 165, 234, 413, 0,
+ 202, 271, 0, 0, 0, 7, 8, 200, 0, 9,
0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
11, 0, 12, 0, 0, 0, 0, 0, 13, 0,
14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 0, 24, 25, 26, 27, 28, 29, 30, 0, 0,
- 31, 32, 33, 34, 4, 0, 0, 0, 5, 6,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 7, 8, 0, 0,
- 9, 0, 0, 10, 0, 0, 0, 0, 0, 0,
- 0, 11, 0, 12, 0, 0, 0, 0, 0, 13,
- 0, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 0, 24, 25, 26, 27, 28, 29, 30, 0,
- 0, 31, 32, 96, 97, 180, 0, 0, 0, 5,
+ 24, 0, 25, 26, 27, 28, 29, 30, 31, 0,
+ 0, 32, 33, 34, 35, 4, 0, 0, 0, 5,
6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 7, 8, 0,
- 0, 9, 4, 0, 10, 0, 5, 6, 0, 0,
- 0, 0, 0, 0, 12, 181, 0, 0, 0, 0,
- 0, 182, 0, 0, 7, 8, 0, 19, 9, 0,
- 22, 10, 0, 180, 0, 187, 0, 5, 6, 30,
- 0, 12, 31, 32, 0, 0, 188, 0, 0, 0,
- 0, 0, 0, 0, 19, 7, 8, 22, 0, 9,
- 4, 0, 10, 0, 5, 6, 30, 0, 0, 31,
- 32, 0, 12, 196, 0, 0, 0, 0, 0, 182,
- 0, 0, 7, 8, 0, 19, 9, 0, 22, 10,
- 0, 0, 0, 187, 0, 0, 0, 30, 0, 12,
- 31, 32, 0, 4, 0, 0, 0, 5, 6, 0,
- 0, 0, 19, 228, 0, 22, 0, 4, 0, 0,
- 0, 5, 6, 0, 30, 7, 8, 31, 32, 9,
- 0, 0, 10, 0, 0, 0, 0, 0, 0, 7,
- 8, 0, 12, 9, 0, 0, 10, 0, 0, 0,
- 0, 0, 0, 0, 0, 19, 12, 0, 22, 0,
- 4, 188, 0, 0, 5, 6, 0, 30, 0, 19,
- 31, 32, 22, 0, 0, 0, 0, 0, 0, 0,
- 0, 30, 7, 8, 31, 32, 9, 4, 0, 10,
- 0, 5, 6, 0, 0, 0, 296, 265, 0, 12,
+ 0, 9, 0, 0, 10, 0, 0, 0, 0, 0,
+ 0, 0, 11, 0, 12, 0, 0, 0, 0, 0,
+ 13, 0, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 0, 25, 26, 27, 28, 29, 30,
+ 31, 0, 0, 32, 33, 98, 99, 4, 0, 183,
+ 0, 5, 6, 5, 6, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
- 8, 0, 19, 9, 4, 22, 10, 0, 5, 6,
- 0, 0, 0, 0, 30, 0, 12, 31, 32, 0,
- 0, 0, 0, 0, 0, 0, 7, 8, 0, 19,
- 9, 180, 22, 10, 0, 5, 6, 0, 0, 0,
- 0, 30, 0, 12, 31, 32, 0, 0, 0, 0,
- 0, 0, 0, 7, 8, 0, 19, 9, 0, 22,
- 10, 0, 0, 0, 0, 0, 0, 0, 30, 0,
- 12, 31, 32, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 19, 0, 0, 22, 0, 0, 0,
- 0, 0, 0, 0, 0, 30, 0, 0, 31, 32,
- 108, 109, 110, 111, 112, 113, 0, 0, 0, 0,
- 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
- 124, 125, 126, 127, 128, 129, 130, 131, 132, 0,
- 133, 134, 0, 0, 0, 0, 135, 108, 109, 110,
- 111, 112, 113, 0, 179, 0, 0, 114, 115, 116,
+ 8, 7, 8, 9, 0, 9, 10, 0, 10, 0,
+ 0, 0, 0, 0, 11, 0, 12, 0, 12, 184,
+ 0, 0, 13, 0, 0, 185, 0, 0, 0, 19,
+ 0, 19, 0, 23, 24, 23, 25, 26, 27, 28,
+ 29, 30, 31, 0, 31, 32, 33, 32, 33, 4,
+ 0, 183, 0, 5, 6, 5, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 8, 7, 8, 9, 0, 9, 10, 0,
+ 10, 0, 190, 0, 0, 0, 0, 0, 12, 0,
+ 12, 199, 0, 191, 0, 0, 0, 185, 0, 0,
+ 0, 19, 0, 19, 4, 23, 4, 23, 5, 6,
+ 5, 6, 0, 0, 31, 0, 31, 32, 33, 32,
+ 33, 0, 0, 0, 0, 0, 7, 8, 7, 8,
+ 9, 0, 9, 10, 0, 10, 0, 0, 0, 190,
+ 0, 0, 0, 12, 0, 12, 0, 0, 0, 91,
+ 0, 0, 0, 0, 0, 0, 19, 0, 19, 0,
+ 23, 0, 23, 0, 0, 0, 0, 0, 0, 31,
+ 0, 31, 32, 33, 32, 33, 4, 0, 4, 0,
+ 5, 6, 5, 6, 0, 0, 231, 0, 111, 112,
+ 113, 114, 115, 0, 0, 0, 0, 0, 7, 8,
+ 7, 8, 9, 0, 9, 10, 0, 10, 127, 128,
+ 129, 130, 131, 132, 133, 12, 0, 12, 0, 0,
+ 0, 0, 191, 137, 0, 0, 0, 0, 19, 0,
+ 19, 4, 23, 4, 23, 5, 6, 5, 6, 0,
+ 0, 31, 300, 31, 32, 33, 32, 33, 0, 0,
+ 0, 0, 0, 7, 8, 7, 8, 9, 0, 9,
+ 10, 0, 10, 0, 0, 0, 0, 0, 269, 0,
+ 12, 0, 12, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 19, 0, 19, 4, 23, 183, 23,
+ 5, 6, 5, 6, 0, 0, 31, 0, 31, 32,
+ 33, 32, 33, 0, 0, 0, 0, 0, 7, 8,
+ 7, 8, 9, 0, 9, 10, 0, 10, 0, 0,
+ 0, 0, 0, 0, 0, 12, 0, 12, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,
+ 19, 0, 23, 0, 23, 0, 0, 0, 0, 0,
+ 0, 31, 0, 31, 32, 33, 32, 33, 110, 111,
+ 112, 113, 114, 115, 0, 0, 0, 0, 116, 117,
+ 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, 134, 0, 135, 136,
+ 0, 0, 0, 0, 137, 110, 111, 112, 113, 114,
+ 115, 0, 182, 0, 0, 116, 117, 118, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
+ 131, 132, 133, 134, 0, 135, 136, 287, 0, 0,
+ 0, 137, 110, 111, 112, 113, 114, 115, 288, 0,
+ 0, 0, 116, 117, 118, 119, 120, 121, 122, 123,
+ 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
+ 134, 0, 135, 136, 287, 0, 0, 0, 137, 110,
+ 111, 112, 113, 114, 115, 298, 0, 0, 0, 116,
117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
- 127, 128, 129, 130, 131, 132, 0, 133, 134, 283,
- 0, 0, 0, 135, 108, 109, 110, 111, 112, 113,
- 284, 0, 0, 0, 114, 115, 116, 117, 118, 119,
+ 127, 128, 129, 130, 131, 132, 133, 134, 0, 135,
+ 136, 0, 0, 0, 0, 137, 110, 111, 112, 113,
+ 114, 115, 334, 0, 0, 0, 116, 117, 118, 119,
120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 0, 133, 134, 283, 0, 0, 0,
- 135, 108, 109, 110, 111, 112, 113, 294, 0, 0,
- 0, 114, 115, 116, 117, 118, 119, 120, 121, 122,
+ 130, 131, 132, 133, 134, 0, 135, 136, 0, 0,
+ 0, 0, 137, 110, 111, 112, 113, 114, 115, 388,
+ 0, 0, 0, 116, 117, 118, 119, 120, 121, 122,
123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
- 0, 133, 134, 0, 0, 0, 0, 135, 108, 109,
- 110, 111, 112, 113, 328, 0, 0, 0, 114, 115,
- 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
- 126, 127, 128, 129, 130, 131, 132, 0, 133, 134,
- 0, 0, 0, 0, 135, 108, 109, 110, 111, 112,
- 113, 380, 0, 0, 0, 114, 115, 116, 117, 118,
+ 133, 134, 0, 135, 136, 0, 0, 0, 0, 137,
+ 0, 0, 149, 0, 150, 110, 111, 112, 113, 114,
+ 115, 0, 0, 0, 0, 116, 117, 118, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
+ 131, 132, 133, 134, 0, 135, 136, 0, 0, 0,
+ 0, 137, 306, 0, 0, 0, 307, 110, 111, 112,
+ 113, 114, 115, 0, 0, 0, 0, 116, 117, 118,
119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
- 129, 130, 131, 132, 0, 133, 134, 0, 0, 0,
- 0, 135, 0, 0, 147, 0, 148, 108, 109, 110,
- 111, 112, 113, 0, 0, 0, 0, 114, 115, 116,
+ 129, 130, 131, 132, 133, 134, 0, 135, 136, 0,
+ 0, 0, 0, 137, 397, 0, 0, 0, 398, 110,
+ 111, 112, 113, 114, 115, 0, 0, 0, 0, 116,
117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
- 127, 128, 129, 130, 131, 132, 0, 133, 134, 0,
- 0, 0, 0, 135, 302, 0, 0, 0, 303, 108,
- 109, 110, 111, 112, 113, 0, 0, 0, 0, 114,
- 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
- 125, 126, 127, 128, 129, 130, 131, 132, 0, 133,
- 134, 0, 0, 0, 0, 135, 389, 0, 0, 0,
- 390, 108, 109, 110, 111, 112, 113, 0, 0, 0,
- 0, 114, 115, 116, 117, 118, 119, 120, 121, 122,
- 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
- 0, 133, 134, 0, 0, 0, 0, 135, 0, 0,
- 270, 108, 109, 110, 111, 112, 113, 0, 0, 0,
- 0, 114, 115, 116, 117, 118, 119, 120, 121, 122,
- 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
- 0, 133, 134, 0, 0, 0, 0, 135, 0, 0,
- 271, 108, 109, 110, 111, 112, 113, 0, 0, 0,
- 0, 114, 115, 116, 117, 118, 119, 120, 121, 122,
- 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
- 0, 133, 134, 0, 0, 0, 0, 135, 0, 0,
- 382, 108, 109, 110, 111, 112, 113, 0, 0, 0,
- 0, 114, 115, 116, 117, 118, 119, 120, 121, 122,
- 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
- 0, 133, 134, 0, 0, 0, 0, 135, 0, 0,
- 401, 108, 109, 110, 111, 112, 113, 0, 0, 0,
- 0, 114, 115, 116, 117, 118, 119, 120, 121, 122,
- 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
- 0, 133, 134, 0, 0, 0, 0, 135, 355, 108,
- 109, 110, 111, 112, 113, 0, 0, 0, 0, 114,
- 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
- 125, 126, 127, 128, 129, 130, 131, 132, 0, 133,
- 134, 0, 0, 0, 0, 135, 413, 108, 109, 110,
- 111, 112, 113, 0, 0, 0, 0, 114, 115, 116,
+ 127, 128, 129, 130, 131, 132, 133, 134, 0, 135,
+ 136, 0, 0, 0, 0, 137, 0, 0, 274, 110,
+ 111, 112, 113, 114, 115, 0, 0, 0, 0, 116,
117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
- 127, 128, 129, 130, 131, 132, 0, 133, 134, 300,
- 0, 0, 0, 135, 108, 109, 110, 111, 112, 113,
- 0, 0, 0, 0, 114, 115, 116, 117, 118, 119,
- 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 0, 133, 134, 0, 0, 0, 108,
- 135, 110, 111, 112, 113, 0, 0, 0, 0, 114,
- 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
- 125, 126, 127, 128, 129, 130, 131, 132, 0, 133,
- 134, 0, 0, 0, 351, 135, 108, 0, 110, 111,
- 112, 113, 0, 0, 0, 0, 114, 115, 116, 117,
- 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
- 128, 129, 130, 131, 132, 0, 133, 134, 0, 0,
- 0, 353, 135, 108, 0, 110, 111, 112, 113, 0,
- 0, 0, 0, 114, 115, 116, 117, 118, 119, 120,
+ 127, 128, 129, 130, 131, 132, 133, 134, 0, 135,
+ 136, 0, 0, 0, 0, 137, 0, 0, 275, 110,
+ 111, 112, 113, 114, 115, 0, 0, 0, 0, 116,
+ 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+ 127, 128, 129, 130, 131, 132, 133, 134, 0, 135,
+ 136, 0, 0, 0, 0, 137, 0, 0, 390, 110,
+ 111, 112, 113, 114, 115, 0, 0, 0, 0, 116,
+ 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+ 127, 128, 129, 130, 131, 132, 133, 134, 0, 135,
+ 136, 0, 0, 0, 0, 137, 0, 0, 411, 110,
+ 111, 112, 113, 114, 115, 0, 0, 0, 0, 116,
+ 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+ 127, 128, 129, 130, 131, 132, 133, 134, 0, 135,
+ 136, 0, 0, 0, 0, 137, 361, 110, 111, 112,
+ 113, 114, 115, 0, 0, 0, 0, 116, 117, 118,
+ 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, 134, 0, 135, 136, 0,
+ 0, 0, 0, 137, 424, 110, 111, 112, 113, 114,
+ 115, 0, 0, 0, 0, 116, 117, 118, 119, 120,
121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
- 131, 132, 0, 133, 134, 0, 0, 0, 387, 135,
- 108, 0, 110, 111, 112, 113, 0, 0, 0, 0,
- 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
- 124, 125, 126, 127, 128, 129, 130, 131, 132, 0,
- 133, 134, 0, 0, 0, 0, 135, 109, 110, 111,
- 112, 113, 0, 0, 0, 0, 114, 115, 116, 117,
+ 131, 132, 133, 134, 0, 135, 136, 304, 0, 0,
+ 0, 137, 110, 111, 112, 113, 114, 115, 0, 0,
+ 0, 0, 116, 117, 118, 119, 120, 121, 122, 123,
+ 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
+ 134, 0, 135, 136, 0, 0, 0, 110, 137, 112,
+ 113, 114, 115, 0, 0, 0, 0, 116, 117, 118,
+ 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, 134, 0, 135, 136, 0,
+ 0, 0, 357, 137, 110, 0, 112, 113, 114, 115,
+ 0, 0, 0, 0, 116, 117, 118, 119, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
+ 132, 133, 134, 0, 135, 136, 0, 0, 0, 359,
+ 137, 110, 0, 112, 113, 114, 115, 0, 0, 0,
+ 0, 116, 117, 118, 119, 120, 121, 122, 123, 124,
+ 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
+ 0, 135, 136, 0, 0, 0, 395, 137, 110, 0,
+ 112, 113, 114, 115, 0, 0, 0, 0, 116, 117,
118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
- 128, 129, 130, 131, 132, 0, 0, 134, 0, 0,
- 0, 0, 135, 109, 110, 111, 112, 113, 0, 0,
- 0, 0, 0, 115, 116, 117, 118, 119, 120, 121,
+ 128, 129, 130, 131, 132, 133, 134, 0, 135, 136,
+ 0, 0, 0, 0, 137, 111, 112, 113, 114, 115,
+ 0, 0, 0, 0, 116, 117, 118, 119, 120, 121,
122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
- 132, 109, 110, 111, 112, 113, 0, 0, 135, 0,
- 0, 0, 116, 117, 118, 119, 120, 121, 122, 123,
- 124, 125, 126, 127, 128, 129, 130, 131, 132, 109,
- 110, 111, 112, 113, 0, 0, 135, 0, 0, 0,
+ 132, 133, 134, 0, 0, 136, 0, 0, 0, 0,
+ 137, 111, 112, 113, 114, 115, 0, 0, 0, 0,
0, 117, 118, 119, 120, 121, 122, 123, 124, 125,
- 126, 127, 128, 129, 130, 131, 132, 109, 110, 111,
- 112, 113, 0, 0, 135, 0, 0, 0, 0, 0,
+ 126, 127, 128, 129, 130, 131, 132, 133, 134, 111,
+ 112, 113, 114, 115, 0, 0, 137, 0, 0, 0,
118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
- 128, 129, 130, 131, 132, 109, 110, 111, 112, 113,
- 0, 0, 135, 0, 0, 0, 0, 0, 0, 0,
+ 128, 129, 130, 131, 132, 133, 134, 111, 112, 113,
+ 114, 115, 0, 0, 137, 0, 0, 0, 0, 119,
120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 109, 110, 111, 112, 113, 0, 0,
- 135, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 124, 125, 126, 127, 128, 129, 130, 131,
- 132, 109, 110, 111, 112, 113, 0, 0, 135, 109,
- 110, 111, 112, 113, 0, 0, 0, 0, 0, 0,
- 124, 125, 126, 127, 128, 129, 130, 131, 0, 125,
- 126, 127, 128, 129, 130, 131, 135, 0, 0, 0,
- 0, 0, 0, 0, 135
+ 130, 131, 132, 133, 134, 111, 112, 113, 114, 115,
+ 0, 0, 137, 0, 0, 0, 0, 0, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
+ 132, 133, 134, 111, 112, 113, 114, 115, 0, 0,
+ 137, 0, 0, 0, 0, 0, 0, 0, 122, 123,
+ 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
+ 134, 111, 112, 113, 114, 115, 0, 0, 137, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 126, 127, 128, 129, 130, 131, 132, 133, 134, 111,
+ 112, 113, 114, 115, 0, 0, 137, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 126, 127,
+ 128, 129, 130, 131, 132, 133, 0, 0, 0, 0,
+ 0, 0, 0, 0, 137
};
static const yytype_int16 yycheck[] =
{
- 5, 6, 7, 8, 25, 10, 86, 12, 161, 192,
- 35, 138, 2, 16, 3, 21, 37, 16, 3, 18,
- 3, 3, 12, 3, 29, 15, 31, 3, 18, 3,
- 3, 21, 22, 58, 3, 265, 327, 3, 3, 182,
- 29, 42, 44, 0, 46, 43, 29, 37, 44, 50,
- 43, 49, 43, 78, 42, 51, 49, 82, 49, 43,
- 29, 40, 50, 52, 29, 49, 48, 57, 42, 42,
- 68, 3, 57, 259, 257, 68, 42, 68, 83, 84,
- 86, 372, 55, 266, 68, 58, 71, 92, 71, 94,
- 45, 71, 42, 48, 67, 71, 86, 70, 71, 42,
- 105, 331, 107, 108, 231, 45, 42, 112, 48, 114,
- 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
+ 5, 6, 7, 8, 26, 10, 88, 12, 163, 185,
+ 2, 36, 16, 16, 18, 21, 38, 3, 3, 269,
+ 12, 3, 333, 15, 3, 30, 18, 32, 195, 21,
+ 263, 23, 3, 3, 59, 3, 3, 3, 3, 3,
+ 42, 3, 140, 36, 29, 44, 38, 29, 50, 42,
+ 41, 157, 51, 46, 79, 43, 162, 45, 49, 84,
+ 3, 29, 43, 42, 29, 0, 58, 52, 49, 380,
+ 3, 57, 42, 262, 44, 42, 46, 48, 42, 46,
+ 85, 86, 88, 44, 27, 46, 72, 337, 69, 94,
+ 72, 96, 42, 260, 27, 43, 88, 45, 331, 332,
+ 50, 290, 107, 270, 109, 110, 72, 283, 284, 114,
+ 72, 116, 117, 118, 119, 120, 121, 122, 123, 124,
125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
- 135, 136, 3, 258, 3, 140, 279, 280, 143, 325,
- 326, 146, 3, 148, 150, 170, 376, 377, 151, 155,
- 3, 41, 151, 42, 160, 44, 36, 46, 27, 49,
- 150, 286, 42, 168, 394, 155, 46, 43, 3, 45,
- 160, 42, 162, 44, 27, 46, 44, 182, 408, 3,
- 48, 42, 187, 7, 8, 46, 40, 43, 42, 45,
- 195, 48, 46, 49, 43, 275, 45, 202, 203, 324,
- 49, 25, 26, 43, 48, 29, 46, 155, 32, 43,
- 335, 45, 160, 366, 31, 49, 40, 42, 42, 44,
- 43, 46, 45, 228, 48, 350, 49, 10, 11, 234,
- 43, 55, 45, 48, 58, 59, 49, 61, 62, 63,
- 64, 65, 66, 67, 42, 48, 70, 71, 46, 270,
- 271, 43, 42, 45, 379, 42, 262, 49, 42, 46,
- 265, 40, 46, 268, 42, 43, 44, 272, 46, 274,
- 45, 276, 262, 48, 279, 280, 45, 45, 283, 48,
- 48, 48, 43, 3, 45, 3, 48, 7, 8, 7,
- 8, 296, 43, 48, 45, 300, 3, 43, 303, 45,
- 306, 43, 308, 45, 384, 25, 26, 25, 26, 29,
- 42, 29, 32, 43, 32, 45, 306, 44, 308, 3,
- 40, 41, 42, 61, 42, 45, 331, 46, 45, 49,
- 48, 34, 3, 3, 40, 55, 341, 55, 58, 3,
- 58, 27, 28, 29, 30, 31, 351, 67, 353, 67,
- 70, 71, 70, 71, 47, 46, 3, 42, 48, 34,
- 381, 3, 45, 3, 5, 7, 8, 47, 47, 47,
- 5, 376, 377, 25, 26, 27, 28, 29, 30, 31,
- 401, 34, 387, 25, 26, 390, 3, 29, 40, 394,
- 32, 412, 48, 48, 68, 3, 3, 48, 40, 41,
- 42, 50, 48, 408, 48, 3, 48, 45, 50, 51,
- 52, 53, 54, 55, 56, 57, 58, 59, 48, 61,
- 62, 63, 64, 65, 66, 67, 60, 3, 70, 71,
- 72, 73, 3, 34, 48, 41, 7, 8, 48, 34,
- 43, 41, 75, 37, 57, 308, 310, 314, 164, 21,
- 86, 194, 22, 76, 25, 26, 169, 107, 29, 384,
- 105, 32, -1, -1, 137, -1, -1, -1, -1, 40,
- 41, 42, -1, -1, -1, -1, -1, 48, -1, 50,
- 51, 52, 53, 54, 55, 56, 57, 58, 59, -1,
- 61, 62, 63, 64, 65, 66, 67, -1, -1, 70,
- 71, 72, 73, 3, -1, -1, -1, 7, 8, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 25, 26, -1, -1, 29,
+ 135, 136, 137, 138, 384, 385, 234, 142, 43, 45,
+ 145, 330, 48, 148, 49, 150, 152, 43, 173, 153,
+ 153, 157, 341, 49, 404, 43, 162, 10, 11, 326,
+ 152, 49, 43, 169, 69, 157, 171, 356, 49, 419,
+ 162, 44, 164, 69, 40, 48, 40, 169, 42, 42,
+ 185, 69, 46, 42, 45, 190, 3, 48, 69, 48,
+ 7, 8, 42, 198, 44, 42, 46, 279, 387, 46,
+ 205, 206, 3, 3, 43, 43, 45, 45, 25, 26,
+ 49, 49, 29, 42, 42, 32, 43, 372, 45, 43,
+ 3, 45, 49, 40, 41, 42, 231, 43, 48, 48,
+ 46, 48, 237, 50, 51, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, 48, 62, 63, 64, 65, 66,
+ 67, 68, 274, 275, 71, 72, 73, 74, 42, 42,
+ 266, 3, 46, 43, 269, 45, 42, 272, 44, 49,
+ 46, 276, 55, 278, 266, 280, 59, 45, 283, 284,
+ 48, 43, 287, 45, 43, 68, 45, 49, 71, 72,
+ 49, 43, 42, 45, 48, 300, 46, 49, 45, 304,
+ 45, 48, 307, 48, 310, 31, 312, 3, 42, 48,
+ 392, 7, 8, 27, 28, 29, 30, 31, 310, 43,
+ 312, 45, 25, 26, 27, 28, 29, 30, 31, 25,
+ 26, 48, 337, 29, 40, 48, 32, 40, 43, 43,
+ 45, 45, 347, 42, 40, 41, 42, 3, 3, 45,
+ 34, 44, 357, 49, 359, 62, 42, 43, 44, 55,
+ 46, 46, 45, 59, 34, 3, 40, 389, 3, 3,
+ 47, 46, 68, 42, 3, 71, 72, 48, 45, 384,
+ 385, 3, 34, 47, 47, 7, 8, 47, 5, 411,
+ 395, 5, 34, 398, 3, 3, 69, 48, 48, 404,
+ 48, 423, 48, 25, 26, 3, 3, 29, 48, 50,
+ 32, 3, 45, 3, 419, 34, 61, 48, 40, 41,
+ 42, 48, 48, 41, 48, 48, 48, 34, 50, 51,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 41,
+ 62, 63, 64, 65, 66, 67, 68, 43, 76, 71,
+ 72, 73, 74, 3, 58, 38, 312, 7, 8, 314,
+ 318, 21, 23, 88, 166, 197, 77, 139, 392, -1,
+ 109, 172, -1, -1, -1, 25, 26, 107, -1, 29,
-1, -1, 32, -1, -1, -1, -1, -1, -1, -1,
40, -1, 42, -1, -1, -1, -1, -1, 48, -1,
50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
- -1, 61, 62, 63, 64, 65, 66, 67, -1, -1,
- 70, 71, 72, 73, 3, -1, -1, -1, 7, 8,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 25, 26, -1, -1,
- 29, -1, -1, 32, -1, -1, -1, -1, -1, -1,
- -1, 40, -1, 42, -1, -1, -1, -1, -1, 48,
- -1, 50, 51, 52, 53, 54, 55, 56, 57, 58,
- 59, -1, 61, 62, 63, 64, 65, 66, 67, -1,
- -1, 70, 71, 72, 73, 3, -1, -1, -1, 7,
+ 60, -1, 62, 63, 64, 65, 66, 67, 68, -1,
+ -1, 71, 72, 73, 74, 3, -1, -1, -1, 7,
8, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 25, 26, -1,
- -1, 29, 3, -1, 32, -1, 7, 8, -1, -1,
- -1, -1, -1, -1, 42, 43, -1, -1, -1, -1,
- -1, 49, -1, -1, 25, 26, -1, 55, 29, -1,
- 58, 32, -1, 3, -1, 36, -1, 7, 8, 67,
- -1, 42, 70, 71, -1, -1, 47, -1, -1, -1,
- -1, -1, -1, -1, 55, 25, 26, 58, -1, 29,
- 3, -1, 32, -1, 7, 8, 67, -1, -1, 70,
- 71, -1, 42, 43, -1, -1, -1, -1, -1, 49,
- -1, -1, 25, 26, -1, 55, 29, -1, 58, 32,
- -1, -1, -1, 36, -1, -1, -1, 67, -1, 42,
- 70, 71, -1, 3, -1, -1, -1, 7, 8, -1,
- -1, -1, 55, 13, -1, 58, -1, 3, -1, -1,
- -1, 7, 8, -1, 67, 25, 26, 70, 71, 29,
- -1, -1, 32, -1, -1, -1, -1, -1, -1, 25,
- 26, -1, 42, 29, -1, -1, 32, -1, -1, -1,
- -1, -1, -1, -1, -1, 55, 42, -1, 58, -1,
- 3, 47, -1, -1, 7, 8, -1, 67, -1, 55,
- 70, 71, 58, -1, -1, -1, -1, -1, -1, -1,
- -1, 67, 25, 26, 70, 71, 29, 3, -1, 32,
- -1, 7, 8, -1, -1, -1, 12, 40, -1, 42,
+ -1, 29, -1, -1, 32, -1, -1, -1, -1, -1,
+ -1, -1, 40, -1, 42, -1, -1, -1, -1, -1,
+ 48, -1, 50, 51, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, -1, 62, 63, 64, 65, 66, 67,
+ 68, -1, -1, 71, 72, 73, 74, 3, -1, 3,
+ -1, 7, 8, 7, 8, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 25,
- 26, -1, 55, 29, 3, 58, 32, -1, 7, 8,
- -1, -1, -1, -1, 67, -1, 42, 70, 71, -1,
- -1, -1, -1, -1, -1, -1, 25, 26, -1, 55,
- 29, 3, 58, 32, -1, 7, 8, -1, -1, -1,
- -1, 67, -1, 42, 70, 71, -1, -1, -1, -1,
- -1, -1, -1, 25, 26, -1, 55, 29, -1, 58,
- 32, -1, -1, -1, -1, -1, -1, -1, 67, -1,
- 42, 70, 71, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 55, -1, -1, 58, -1, -1, -1,
- -1, -1, -1, -1, -1, 67, -1, -1, 70, 71,
- 4, 5, 6, 7, 8, 9, -1, -1, -1, -1,
- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30, 31, 32, -1,
- 34, 35, -1, -1, -1, -1, 40, 4, 5, 6,
- 7, 8, 9, -1, 48, -1, -1, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
- 27, 28, 29, 30, 31, 32, -1, 34, 35, 36,
- -1, -1, -1, 40, 4, 5, 6, 7, 8, 9,
- 47, -1, -1, -1, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, -1, 34, 35, 36, -1, -1, -1,
- 40, 4, 5, 6, 7, 8, 9, 47, -1, -1,
- -1, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
- -1, 34, 35, -1, -1, -1, -1, 40, 4, 5,
- 6, 7, 8, 9, 47, -1, -1, -1, 14, 15,
+ 26, 25, 26, 29, -1, 29, 32, -1, 32, -1,
+ -1, -1, -1, -1, 40, -1, 42, -1, 42, 43,
+ -1, -1, 48, -1, -1, 49, -1, -1, -1, 55,
+ -1, 55, -1, 59, 60, 59, 62, 63, 64, 65,
+ 66, 67, 68, -1, 68, 71, 72, 71, 72, 3,
+ -1, 3, -1, 7, 8, 7, 8, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 25, 26, 25, 26, 29, -1, 29, 32, -1,
+ 32, -1, 36, -1, -1, -1, -1, -1, 42, -1,
+ 42, 43, -1, 47, -1, -1, -1, 49, -1, -1,
+ -1, 55, -1, 55, 3, 59, 3, 59, 7, 8,
+ 7, 8, -1, -1, 68, -1, 68, 71, 72, 71,
+ 72, -1, -1, -1, -1, -1, 25, 26, 25, 26,
+ 29, -1, 29, 32, -1, 32, -1, -1, -1, 36,
+ -1, -1, -1, 42, -1, 42, -1, -1, -1, 48,
+ -1, -1, -1, -1, -1, -1, 55, -1, 55, -1,
+ 59, -1, 59, -1, -1, -1, -1, -1, -1, 68,
+ -1, 68, 71, 72, 71, 72, 3, -1, 3, -1,
+ 7, 8, 7, 8, -1, -1, 13, -1, 5, 6,
+ 7, 8, 9, -1, -1, -1, -1, -1, 25, 26,
+ 25, 26, 29, -1, 29, 32, -1, 32, 25, 26,
+ 27, 28, 29, 30, 31, 42, -1, 42, -1, -1,
+ -1, -1, 47, 40, -1, -1, -1, -1, 55, -1,
+ 55, 3, 59, 3, 59, 7, 8, 7, 8, -1,
+ -1, 68, 12, 68, 71, 72, 71, 72, -1, -1,
+ -1, -1, -1, 25, 26, 25, 26, 29, -1, 29,
+ 32, -1, 32, -1, -1, -1, -1, -1, 40, -1,
+ 42, -1, 42, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 55, -1, 55, 3, 59, 3, 59,
+ 7, 8, 7, 8, -1, -1, 68, -1, 68, 71,
+ 72, 71, 72, -1, -1, -1, -1, -1, 25, 26,
+ 25, 26, 29, -1, 29, 32, -1, 32, -1, -1,
+ -1, -1, -1, -1, -1, 42, -1, 42, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 55, -1,
+ 55, -1, 59, -1, 59, -1, -1, -1, -1, -1,
+ -1, 68, -1, 68, 71, 72, 71, 72, 4, 5,
+ 6, 7, 8, 9, -1, -1, -1, -1, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, -1, 34, 35,
-1, -1, -1, -1, 40, 4, 5, 6, 7, 8,
- 9, 47, -1, -1, -1, 14, 15, 16, 17, 18,
+ 9, -1, 48, -1, -1, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32, -1, 34, 35, 36, -1, -1,
+ -1, 40, 4, 5, 6, 7, 8, 9, 47, -1,
+ -1, -1, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, -1, 34, 35, 36, -1, -1, -1, 40, 4,
+ 5, 6, 7, 8, 9, 47, -1, -1, -1, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, -1, 34,
+ 35, -1, -1, -1, -1, 40, 4, 5, 6, 7,
+ 8, 9, 47, -1, -1, -1, 14, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
+ 28, 29, 30, 31, 32, -1, 34, 35, -1, -1,
+ -1, -1, 40, 4, 5, 6, 7, 8, 9, 47,
+ -1, -1, -1, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 31, 32, -1, 34, 35, -1, -1, -1, -1, 40,
+ -1, -1, 43, -1, 45, 4, 5, 6, 7, 8,
+ 9, -1, -1, -1, -1, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
29, 30, 31, 32, -1, 34, 35, -1, -1, -1,
- -1, 40, -1, -1, 43, -1, 45, 4, 5, 6,
+ -1, 40, 41, -1, -1, -1, 45, 4, 5, 6,
7, 8, 9, -1, -1, -1, -1, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31, 32, -1, 34, 35, -1,
@@ -1206,77 +1212,72 @@ static const yytype_int16 yycheck[] =
5, 6, 7, 8, 9, -1, -1, -1, -1, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, -1, 34,
- 35, -1, -1, -1, -1, 40, 41, -1, -1, -1,
- 45, 4, 5, 6, 7, 8, 9, -1, -1, -1,
- -1, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
- -1, 34, 35, -1, -1, -1, -1, 40, -1, -1,
- 43, 4, 5, 6, 7, 8, 9, -1, -1, -1,
- -1, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
- -1, 34, 35, -1, -1, -1, -1, 40, -1, -1,
- 43, 4, 5, 6, 7, 8, 9, -1, -1, -1,
- -1, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
- -1, 34, 35, -1, -1, -1, -1, 40, -1, -1,
- 43, 4, 5, 6, 7, 8, 9, -1, -1, -1,
- -1, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
- -1, 34, 35, -1, -1, -1, -1, 40, -1, -1,
- 43, 4, 5, 6, 7, 8, 9, -1, -1, -1,
- -1, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
- -1, 34, 35, -1, -1, -1, -1, 40, 41, 4,
+ 35, -1, -1, -1, -1, 40, -1, -1, 43, 4,
+ 5, 6, 7, 8, 9, -1, -1, -1, -1, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, -1, 34,
+ 35, -1, -1, -1, -1, 40, -1, -1, 43, 4,
+ 5, 6, 7, 8, 9, -1, -1, -1, -1, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, -1, 34,
+ 35, -1, -1, -1, -1, 40, -1, -1, 43, 4,
+ 5, 6, 7, 8, 9, -1, -1, -1, -1, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, -1, 34,
+ 35, -1, -1, -1, -1, 40, -1, -1, 43, 4,
5, 6, 7, 8, 9, -1, -1, -1, -1, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, -1, 34,
35, -1, -1, -1, -1, 40, 41, 4, 5, 6,
7, 8, 9, -1, -1, -1, -1, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
- 27, 28, 29, 30, 31, 32, -1, 34, 35, 36,
- -1, -1, -1, 40, 4, 5, 6, 7, 8, 9,
+ 27, 28, 29, 30, 31, 32, -1, 34, 35, -1,
+ -1, -1, -1, 40, 41, 4, 5, 6, 7, 8,
+ 9, -1, -1, -1, -1, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32, -1, 34, 35, 36, -1, -1,
+ -1, 40, 4, 5, 6, 7, 8, 9, -1, -1,
+ -1, -1, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, -1, 34, 35, -1, -1, -1, 4, 40, 6,
+ 7, 8, 9, -1, -1, -1, -1, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, 31, 32, -1, 34, 35, -1,
+ -1, -1, 39, 40, 4, -1, 6, 7, 8, 9,
-1, -1, -1, -1, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, -1, 34, 35, -1, -1, -1, 4,
- 40, 6, 7, 8, 9, -1, -1, -1, -1, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, -1, 34,
- 35, -1, -1, -1, 39, 40, 4, -1, 6, 7,
- 8, 9, -1, -1, -1, -1, 14, 15, 16, 17,
- 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
- 28, 29, 30, 31, 32, -1, 34, 35, -1, -1,
- -1, 39, 40, 4, -1, 6, 7, 8, 9, -1,
- -1, -1, -1, 14, 15, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
- 31, 32, -1, 34, 35, -1, -1, -1, 39, 40,
- 4, -1, 6, 7, 8, 9, -1, -1, -1, -1,
- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30, 31, 32, -1,
- 34, 35, -1, -1, -1, -1, 40, 5, 6, 7,
- 8, 9, -1, -1, -1, -1, 14, 15, 16, 17,
- 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
- 28, 29, 30, 31, 32, -1, -1, 35, -1, -1,
- -1, -1, 40, 5, 6, 7, 8, 9, -1, -1,
- -1, -1, -1, 15, 16, 17, 18, 19, 20, 21,
- 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 5, 6, 7, 8, 9, -1, -1, 40, -1,
- -1, -1, 16, 17, 18, 19, 20, 21, 22, 23,
+ 30, 31, 32, -1, 34, 35, -1, -1, -1, 39,
+ 40, 4, -1, 6, 7, 8, 9, -1, -1, -1,
+ -1, 14, 15, 16, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ -1, 34, 35, -1, -1, -1, 39, 40, 4, -1,
+ 6, 7, 8, 9, -1, -1, -1, -1, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 26, 27, 28, 29, 30, 31, 32, -1, 34, 35,
+ -1, -1, -1, -1, 40, 5, 6, 7, 8, 9,
+ -1, -1, -1, -1, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, -1, -1, 35, -1, -1, -1, -1,
+ 40, 5, 6, 7, 8, 9, -1, -1, -1, -1,
+ -1, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 5,
6, 7, 8, 9, -1, -1, 40, -1, -1, -1,
- -1, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 5, 6, 7,
- 8, 9, -1, -1, 40, -1, -1, -1, -1, -1,
+ 8, 9, -1, -1, 40, -1, -1, -1, -1, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 32, 5, 6, 7, 8, 9,
- -1, -1, 40, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 40, -1, -1, -1, -1, -1, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 5, 6, 7, 8, 9, -1, -1,
- 40, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 5, 6, 7, 8, 9, -1, -1, 40, 5,
- 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
- 24, 25, 26, 27, 28, 29, 30, 31, -1, 25,
- 26, 27, 28, 29, 30, 31, 40, -1, -1, -1,
+ 40, -1, -1, -1, -1, -1, -1, -1, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 5, 6, 7, 8, 9, -1, -1, 40, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 24, 25, 26, 27, 28, 29, 30, 31, 32, 5,
+ 6, 7, 8, 9, -1, -1, 40, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 24, 25,
+ 26, 27, 28, 29, 30, 31, -1, -1, -1, -1,
-1, -1, -1, -1, 40
};
@@ -1284,75 +1285,76 @@ static const yytype_int16 yycheck[] =
state STATE-NUM. */
static const yytype_uint8 yystos[] =
{
- 0, 77, 78, 0, 3, 7, 8, 25, 26, 29,
+ 0, 78, 79, 0, 3, 7, 8, 25, 26, 29,
32, 40, 42, 48, 50, 51, 52, 53, 54, 55,
- 56, 57, 58, 59, 61, 62, 63, 64, 65, 66,
- 67, 70, 71, 72, 73, 80, 81, 82, 83, 93,
- 94, 95, 96, 103, 110, 111, 113, 117, 123, 124,
- 125, 80, 117, 117, 117, 117, 117, 79, 80, 116,
- 117, 3, 71, 90, 91, 92, 80, 57, 90, 91,
- 3, 71, 3, 80, 90, 40, 3, 52, 80, 93,
- 95, 80, 96, 42, 42, 123, 42, 48, 48, 48,
- 117, 117, 42, 44, 46, 97, 72, 73, 83, 123,
- 48, 3, 99, 100, 101, 42, 44, 46, 4, 5,
- 6, 7, 8, 9, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, 34, 35, 40, 118, 119, 120, 48,
- 46, 41, 81, 43, 97, 43, 45, 43, 45, 3,
- 42, 45, 48, 48, 42, 42, 48, 48, 48, 51,
- 42, 50, 78, 103, 42, 46, 3, 42, 46, 97,
- 98, 117, 117, 61, 94, 95, 124, 126, 129, 48,
- 3, 43, 49, 114, 115, 117, 3, 36, 47, 112,
- 117, 46, 42, 97, 45, 34, 43, 115, 3, 112,
- 117, 117, 10, 11, 121, 122, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 13, 117,
- 117, 120, 119, 117, 43, 117, 117, 3, 3, 84,
- 85, 95, 90, 91, 3, 86, 87, 85, 3, 27,
- 88, 89, 85, 27, 89, 41, 87, 42, 43, 49,
- 68, 107, 108, 109, 117, 40, 42, 104, 46, 97,
- 43, 43, 42, 3, 48, 45, 34, 114, 43, 45,
- 49, 117, 47, 36, 47, 47, 43, 107, 100, 102,
- 104, 117, 43, 47, 47, 117, 12, 117, 5, 5,
- 36, 117, 41, 45, 119, 117, 34, 43, 45, 43,
- 45, 43, 3, 48, 45, 48, 43, 48, 48, 43,
- 43, 107, 125, 109, 43, 45, 49, 95, 47, 41,
- 45, 49, 102, 105, 106, 43, 107, 117, 123, 123,
- 117, 36, 117, 127, 124, 117, 114, 114, 117, 125,
- 43, 39, 117, 39, 117, 41, 117, 95, 3, 48,
- 84, 48, 86, 48, 3, 88, 50, 48, 43, 125,
- 109, 109, 3, 101, 102, 41, 49, 45, 125, 43,
- 47, 60, 43, 117, 48, 125, 117, 39, 117, 41,
- 45, 3, 89, 101, 34, 41, 102, 102, 125, 123,
- 48, 43, 128, 129, 117, 117, 48, 48, 34, 102,
- 41, 123, 43, 41, 102, 123
+ 56, 57, 58, 59, 60, 62, 63, 64, 65, 66,
+ 67, 68, 71, 72, 73, 74, 81, 82, 83, 84,
+ 94, 95, 96, 97, 104, 111, 112, 114, 118, 124,
+ 125, 126, 81, 118, 118, 118, 118, 118, 80, 81,
+ 117, 118, 3, 72, 91, 92, 93, 81, 57, 91,
+ 92, 3, 72, 3, 81, 91, 40, 3, 52, 81,
+ 94, 96, 3, 81, 97, 42, 42, 124, 42, 48,
+ 48, 48, 118, 118, 42, 44, 46, 98, 73, 74,
+ 84, 124, 48, 3, 100, 101, 102, 42, 44, 46,
+ 4, 5, 6, 7, 8, 9, 14, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
+ 28, 29, 30, 31, 32, 34, 35, 40, 119, 120,
+ 121, 48, 46, 41, 82, 43, 98, 43, 45, 43,
+ 45, 3, 42, 45, 48, 48, 42, 42, 48, 48,
+ 48, 51, 42, 50, 79, 104, 42, 46, 3, 34,
+ 42, 46, 98, 99, 118, 118, 62, 95, 96, 125,
+ 127, 130, 48, 3, 43, 49, 115, 116, 118, 3,
+ 36, 47, 113, 118, 46, 42, 98, 45, 34, 43,
+ 116, 3, 113, 118, 118, 10, 11, 122, 123, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 13, 118, 118, 121, 120, 118, 43, 118, 118,
+ 3, 3, 85, 86, 96, 91, 92, 3, 87, 88,
+ 86, 3, 27, 89, 90, 86, 27, 90, 41, 88,
+ 42, 96, 43, 49, 69, 108, 109, 110, 118, 40,
+ 42, 105, 46, 98, 43, 43, 42, 3, 48, 45,
+ 34, 115, 43, 45, 49, 118, 47, 36, 47, 47,
+ 43, 108, 101, 103, 105, 118, 43, 47, 47, 118,
+ 12, 118, 5, 5, 36, 118, 41, 45, 120, 118,
+ 34, 43, 45, 43, 45, 43, 3, 48, 45, 48,
+ 43, 48, 48, 43, 43, 108, 42, 48, 126, 110,
+ 43, 45, 49, 96, 47, 41, 45, 49, 103, 106,
+ 107, 43, 108, 118, 124, 124, 118, 36, 118, 128,
+ 125, 118, 115, 115, 118, 126, 43, 39, 118, 39,
+ 118, 41, 118, 96, 3, 48, 85, 48, 87, 48,
+ 3, 89, 50, 48, 43, 43, 108, 126, 110, 110,
+ 3, 102, 103, 41, 49, 45, 126, 43, 47, 61,
+ 43, 118, 48, 126, 118, 39, 118, 41, 45, 3,
+ 90, 48, 43, 102, 34, 41, 103, 103, 126, 124,
+ 48, 43, 129, 130, 118, 118, 48, 48, 48, 34,
+ 103, 41, 124, 43, 41, 103, 124
};
/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */
static const yytype_uint8 yyr1[] =
{
- 0, 76, 77, 78, 78, 79, 79, 80, 80, 80,
- 81, 81, 81, 81, 82, 82, 82, 82, 83, 83,
- 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
- 83, 83, 83, 83, 83, 83, 84, 84, 85, 85,
- 86, 87, 87, 88, 88, 89, 89, 90, 90, 91,
- 91, 92, 92, 93, 94, 95, 95, 96, 97, 97,
- 98, 98, 99, 99, 100, 100, 101, 101, 101, 101,
- 102, 102, 103, 104, 104, 104, 104, 105, 105, 105,
- 106, 106, 107, 107, 107, 107, 108, 108, 109, 109,
- 109, 109, 109, 110, 110, 111, 111, 112, 112, 112,
- 112, 113, 113, 113, 113, 113, 113, 113, 113, 113,
- 113, 113, 113, 114, 114, 115, 115, 115, 115, 116,
- 116, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 118, 118, 118, 118, 118, 119, 119, 119, 119, 120,
- 120, 120, 120, 120, 121, 121, 121, 121, 122, 122,
- 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
- 123, 123, 123, 124, 125, 126, 126, 126, 127, 127,
- 128, 128, 129, 129
+ 0, 77, 78, 79, 79, 80, 80, 81, 81, 81,
+ 82, 82, 82, 82, 83, 83, 83, 83, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 85, 85, 86, 86,
+ 87, 88, 88, 89, 89, 90, 90, 91, 91, 92,
+ 92, 93, 93, 94, 95, 96, 96, 97, 98, 98,
+ 99, 99, 100, 100, 101, 101, 102, 102, 102, 102,
+ 103, 103, 104, 105, 105, 105, 105, 106, 106, 106,
+ 107, 107, 108, 108, 108, 108, 109, 109, 110, 110,
+ 110, 110, 110, 111, 111, 112, 112, 112, 112, 112,
+ 113, 113, 113, 113, 114, 114, 114, 114, 114, 114,
+ 114, 114, 114, 114, 114, 114, 115, 115, 116, 116,
+ 116, 116, 117, 117, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 119, 119, 119, 119, 119, 120, 120,
+ 120, 120, 121, 121, 121, 121, 121, 122, 122, 122,
+ 122, 123, 123, 124, 124, 124, 124, 124, 124, 124,
+ 124, 124, 124, 124, 124, 124, 125, 126, 127, 127,
+ 127, 128, 128, 129, 129, 130, 130
};
/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */
@@ -1367,19 +1369,19 @@ static const yytype_int8 yyr2[] =
3, 4, 1, 3, 1, 3, 1, 2, 3, 4,
1, 1, 3, 2, 4, 3, 5, 1, 1, 2,
1, 3, 1, 2, 3, 3, 1, 0, 2, 3,
- 5, 4, 6, 5, 6, 3, 2, 1, 2, 2,
- 3, 3, 4, 4, 4, 4, 3, 4, 3, 4,
- 3, 3, 1, 1, 3, 1, 2, 3, 3, 3,
- 3, 1, 1, 1, 1, 2, 4, 5, 2, 2,
- 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 5, 4, 6, 5, 6, 3, 2, 5, 7, 8,
+ 1, 2, 2, 3, 3, 4, 4, 4, 4, 3,
+ 4, 3, 4, 3, 3, 1, 1, 3, 1, 2,
+ 3, 3, 3, 3, 1, 1, 1, 1, 2, 4,
+ 5, 2, 2, 2, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 2, 3, 4, 3, 4, 5, 6, 6, 7,
- 5, 3, 3, 3, 2, 2, 2, 2, 3, 4,
- 1, 1, 2, 2, 3, 4, 3, 5, 7, 1,
- 3, 3, 1, 1, 2, 4, 3, 5, 2, 4,
- 1, 1, 2, 5, 7, 5, 7, 9, 8, 2,
- 2, 2, 3, 1, 1, 0, 1, 1, 0, 1,
- 0, 1, 1, 3
+ 3, 3, 3, 3, 2, 3, 4, 3, 4, 5,
+ 6, 6, 7, 5, 3, 3, 3, 2, 2, 2,
+ 2, 3, 4, 1, 1, 2, 2, 3, 4, 3,
+ 5, 7, 1, 3, 3, 1, 1, 2, 4, 3,
+ 5, 2, 4, 1, 1, 2, 5, 7, 5, 7,
+ 9, 8, 2, 2, 2, 3, 1, 1, 0, 1,
+ 1, 0, 1, 0, 1, 1, 3
};
@@ -1845,176 +1847,176 @@ yyreduce:
case 2: /* file: fileblock */
#line 195 "camp.y"
{ absyntax::root = (yyvsp[0].b); }
-#line 1849 "camp.tab.c"
+#line 1851 "camp.tab.cc"
break;
case 3: /* fileblock: %empty */
#line 199 "camp.y"
{ (yyval.b) = new file(lexerPos(), false); }
-#line 1855 "camp.tab.c"
+#line 1857 "camp.tab.cc"
break;
case 4: /* fileblock: fileblock runnable */
#line 201 "camp.y"
{ (yyval.b) = (yyvsp[-1].b); (yyval.b)->add((yyvsp[0].run)); }
-#line 1861 "camp.tab.c"
+#line 1863 "camp.tab.cc"
break;
case 5: /* bareblock: %empty */
#line 205 "camp.y"
{ (yyval.b) = new block(lexerPos(), true); }
-#line 1867 "camp.tab.c"
+#line 1869 "camp.tab.cc"
break;
case 6: /* bareblock: bareblock runnable */
#line 207 "camp.y"
{ (yyval.b) = (yyvsp[-1].b); (yyval.b)->add((yyvsp[0].run)); }
-#line 1873 "camp.tab.c"
+#line 1875 "camp.tab.cc"
break;
case 7: /* name: ID */
#line 211 "camp.y"
{ (yyval.n) = new simpleName((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 1879 "camp.tab.c"
+#line 1881 "camp.tab.cc"
break;
case 8: /* name: name '.' ID */
#line 212 "camp.y"
{ (yyval.n) = new qualifiedName((yyvsp[-1].pos), (yyvsp[-2].n), (yyvsp[0].ps).sym); }
-#line 1885 "camp.tab.c"
+#line 1887 "camp.tab.cc"
break;
case 9: /* name: '%' */
#line 213 "camp.y"
{ (yyval.n) = new simpleName((yyvsp[0].ps).pos,
symbol::trans("operator answer")); }
-#line 1892 "camp.tab.c"
+#line 1894 "camp.tab.cc"
break;
case 10: /* runnable: dec */
#line 218 "camp.y"
{ (yyval.run) = (yyvsp[0].d); }
-#line 1898 "camp.tab.c"
+#line 1900 "camp.tab.cc"
break;
case 11: /* runnable: stm */
#line 219 "camp.y"
{ (yyval.run) = (yyvsp[0].s); }
-#line 1904 "camp.tab.c"
+#line 1906 "camp.tab.cc"
break;
case 12: /* runnable: modifiers dec */
#line 221 "camp.y"
{ (yyval.run) = new modifiedRunnable((yyvsp[-1].ml)->getPos(), (yyvsp[-1].ml), (yyvsp[0].d)); }
-#line 1910 "camp.tab.c"
+#line 1912 "camp.tab.cc"
break;
case 13: /* runnable: modifiers stm */
#line 223 "camp.y"
{ (yyval.run) = new modifiedRunnable((yyvsp[-1].ml)->getPos(), (yyvsp[-1].ml), (yyvsp[0].s)); }
-#line 1916 "camp.tab.c"
+#line 1918 "camp.tab.cc"
break;
case 14: /* modifiers: MODIFIER */
#line 227 "camp.y"
{ (yyval.ml) = new modifierList((yyvsp[0].mod).pos); (yyval.ml)->add((yyvsp[0].mod).val); }
-#line 1922 "camp.tab.c"
+#line 1924 "camp.tab.cc"
break;
case 15: /* modifiers: PERM */
#line 228 "camp.y"
{ (yyval.ml) = new modifierList((yyvsp[0].perm).pos); (yyval.ml)->add((yyvsp[0].perm).val); }
-#line 1928 "camp.tab.c"
+#line 1930 "camp.tab.cc"
break;
case 16: /* modifiers: modifiers MODIFIER */
#line 230 "camp.y"
{ (yyval.ml) = (yyvsp[-1].ml); (yyval.ml)->add((yyvsp[0].mod).val); }
-#line 1934 "camp.tab.c"
+#line 1936 "camp.tab.cc"
break;
case 17: /* modifiers: modifiers PERM */
#line 232 "camp.y"
{ (yyval.ml) = (yyvsp[-1].ml); (yyval.ml)->add((yyvsp[0].perm).val); }
-#line 1940 "camp.tab.c"
+#line 1942 "camp.tab.cc"
break;
case 18: /* dec: vardec */
#line 236 "camp.y"
{ (yyval.d) = (yyvsp[0].vd); }
-#line 1946 "camp.tab.c"
+#line 1948 "camp.tab.cc"
break;
case 19: /* dec: fundec */
#line 237 "camp.y"
{ (yyval.d) = (yyvsp[0].d); }
-#line 1952 "camp.tab.c"
+#line 1954 "camp.tab.cc"
break;
case 20: /* dec: typedec */
#line 238 "camp.y"
{ (yyval.d) = (yyvsp[0].d); }
-#line 1958 "camp.tab.c"
+#line 1960 "camp.tab.cc"
break;
case 21: /* dec: ACCESS stridpairlist ';' */
#line 240 "camp.y"
{ (yyval.d) = new accessdec((yyvsp[-2].pos), (yyvsp[-1].ipl)); }
-#line 1964 "camp.tab.c"
+#line 1966 "camp.tab.cc"
break;
case 22: /* dec: FROM name UNRAVEL idpairlist ';' */
#line 242 "camp.y"
{ (yyval.d) = new unraveldec((yyvsp[-4].pos), (yyvsp[-3].n), (yyvsp[-1].ipl)); }
-#line 1970 "camp.tab.c"
+#line 1972 "camp.tab.cc"
break;
case 23: /* dec: FROM name UNRAVEL '*' ';' */
#line 244 "camp.y"
{ (yyval.d) = new unraveldec((yyvsp[-4].pos), (yyvsp[-3].n), WILDCARD); }
-#line 1976 "camp.tab.c"
+#line 1978 "camp.tab.cc"
break;
case 24: /* dec: UNRAVEL name ';' */
#line 245 "camp.y"
{ (yyval.d) = new unraveldec((yyvsp[-2].pos), (yyvsp[-1].n), WILDCARD); }
-#line 1982 "camp.tab.c"
+#line 1984 "camp.tab.cc"
break;
case 25: /* dec: FROM strid ACCESS idpairlist ';' */
#line 247 "camp.y"
{ (yyval.d) = new fromaccessdec((yyvsp[-4].pos), (yyvsp[-3].ps).sym, (yyvsp[-1].ipl)); }
-#line 1988 "camp.tab.c"
+#line 1990 "camp.tab.cc"
break;
case 26: /* dec: FROM strid ACCESS '*' ';' */
#line 249 "camp.y"
{ (yyval.d) = new fromaccessdec((yyvsp[-4].pos), (yyvsp[-3].ps).sym, WILDCARD); }
-#line 1994 "camp.tab.c"
+#line 1996 "camp.tab.cc"
break;
case 27: /* dec: IMPORT stridpair ';' */
#line 251 "camp.y"
{ (yyval.d) = new importdec((yyvsp[-2].pos), (yyvsp[-1].ip)); }
-#line 2000 "camp.tab.c"
+#line 2002 "camp.tab.cc"
break;
case 28: /* dec: INCLUDE ID ';' */
#line 252 "camp.y"
{ (yyval.d) = new includedec((yyvsp[-2].pos), (yyvsp[-1].ps).sym); }
-#line 2006 "camp.tab.c"
+#line 2008 "camp.tab.cc"
break;
case 29: /* dec: INCLUDE STRING ';' */
#line 254 "camp.y"
{ (yyval.d) = new includedec((yyvsp[-2].pos), (yyvsp[-1].stre)->getString()); }
-#line 2012 "camp.tab.c"
+#line 2014 "camp.tab.cc"
break;
case 30: /* dec: TYPEDEF IMPORT '(' typeparamlist ')' ';' */
#line 258 "camp.y"
{ (yyval.d) = new receiveTypedefDec((yyvsp[-5].pos), (yyvsp[-2].tps)); }
-#line 2018 "camp.tab.c"
+#line 2020 "camp.tab.cc"
break;
case 31: /* dec: IMPORT TYPEDEF '(' typeparamlist ')' ';' */
@@ -2022,7 +2024,7 @@ yyreduce:
{ (yyval.d) = new badDec((yyvsp[-5].pos), (yyvsp[-5].pos),
"Expected 'typedef import(<types>);'");
}
-#line 2026 "camp.tab.c"
+#line 2028 "camp.tab.cc"
break;
case 32: /* dec: ACCESS strid '(' decdeclist ')' ID ID ';' */
@@ -2030,13 +2032,13 @@ yyreduce:
{ (yyval.d) = new templateAccessDec(
(yyvsp[-7].pos), (yyvsp[-6].ps).sym, (yyvsp[-4].fls), (yyvsp[-2].ps).sym, (yyvsp[-1].ps).sym, (yyvsp[-2].ps).pos
); }
-#line 2034 "camp.tab.c"
+#line 2036 "camp.tab.cc"
break;
case 33: /* dec: ACCESS strid '(' decdeclist ')' ';' */
#line 269 "camp.y"
{ (yyval.d) = new badDec((yyvsp[-5].pos), (yyvsp[0].pos), "expected 'as'"); }
-#line 2040 "camp.tab.c"
+#line 2042 "camp.tab.cc"
break;
case 34: /* dec: IMPORT strid '(' decdeclist ')' ';' */
@@ -2046,13 +2048,13 @@ yyreduce:
"conflicts. Try "
"'access <module>(<type parameters>) as <newname>;'."
); }
-#line 2050 "camp.tab.c"
+#line 2052 "camp.tab.cc"
break;
case 35: /* dec: FROM strid '(' decdeclist ')' ACCESS idpairlist ';' */
#line 277 "camp.y"
{ (yyval.d) = new fromaccessdec((yyvsp[-7].pos), (yyvsp[-6].ps).sym, (yyvsp[-1].ipl), (yyvsp[-4].fls)); }
-#line 2056 "camp.tab.c"
+#line 2058 "camp.tab.cc"
break;
case 36: /* decdec: ID ASSIGN type */
@@ -2060,1103 +2062,1125 @@ yyreduce:
{ (yyval.fl) = new formal(
(yyvsp[-2].ps).pos, (yyvsp[0].t), new decidstart((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym)
); }
-#line 2064 "camp.tab.c"
+#line 2066 "camp.tab.cc"
break;
case 37: /* decdec: type */
#line 286 "camp.y"
{ (yyval.fl) = new formal((yyvsp[0].t)->getPos(), (yyvsp[0].t), nullptr); }
-#line 2070 "camp.tab.c"
+#line 2072 "camp.tab.cc"
break;
case 38: /* decdeclist: decdec */
#line 291 "camp.y"
{ (yyval.fls) = new formals((yyvsp[0].fl)->getPos()); (yyval.fls)->add((yyvsp[0].fl)); }
-#line 2076 "camp.tab.c"
+#line 2078 "camp.tab.cc"
break;
case 39: /* decdeclist: decdeclist ',' decdec */
#line 293 "camp.y"
{ (yyval.fls) = (yyvsp[-2].fls); (yyval.fls)->add((yyvsp[0].fl)); }
-#line 2082 "camp.tab.c"
+#line 2084 "camp.tab.cc"
break;
case 40: /* typeparam: ID */
#line 297 "camp.y"
{ (yyval.tp) = new typeParam((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2088 "camp.tab.c"
+#line 2090 "camp.tab.cc"
break;
case 41: /* typeparamlist: typeparam */
#line 302 "camp.y"
{ (yyval.tps) = new typeParamList((yyvsp[0].tp)->getPos()); (yyval.tps)->add((yyvsp[0].tp)); }
-#line 2094 "camp.tab.c"
+#line 2096 "camp.tab.cc"
break;
case 42: /* typeparamlist: typeparamlist ',' typeparam */
#line 304 "camp.y"
{ (yyval.tps) = (yyvsp[-2].tps); (yyval.tps)->add((yyvsp[0].tp)); }
-#line 2100 "camp.tab.c"
+#line 2102 "camp.tab.cc"
break;
case 43: /* idpair: ID */
#line 308 "camp.y"
{ (yyval.ip) = new idpair((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2106 "camp.tab.c"
+#line 2108 "camp.tab.cc"
break;
case 44: /* idpair: ID ID ID */
#line 310 "camp.y"
{ (yyval.ip) = new idpair((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, (yyvsp[-1].ps).sym , (yyvsp[0].ps).sym); }
-#line 2112 "camp.tab.c"
+#line 2114 "camp.tab.cc"
break;
case 45: /* idpairlist: idpair */
#line 314 "camp.y"
{ (yyval.ipl) = new idpairlist(); (yyval.ipl)->add((yyvsp[0].ip)); }
-#line 2118 "camp.tab.c"
+#line 2120 "camp.tab.cc"
break;
case 46: /* idpairlist: idpairlist ',' idpair */
#line 316 "camp.y"
{ (yyval.ipl) = (yyvsp[-2].ipl); (yyval.ipl)->add((yyvsp[0].ip)); }
-#line 2124 "camp.tab.c"
+#line 2126 "camp.tab.cc"
break;
case 47: /* strid: ID */
#line 320 "camp.y"
{ (yyval.ps) = (yyvsp[0].ps); }
-#line 2130 "camp.tab.c"
+#line 2132 "camp.tab.cc"
break;
case 48: /* strid: STRING */
#line 321 "camp.y"
{ (yyval.ps).pos = (yyvsp[0].stre)->getPos();
(yyval.ps).sym = symbol::literalTrans((yyvsp[0].stre)->getString()); }
-#line 2137 "camp.tab.c"
+#line 2139 "camp.tab.cc"
break;
case 49: /* stridpair: ID */
#line 326 "camp.y"
{ (yyval.ip) = new idpair((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2143 "camp.tab.c"
+#line 2145 "camp.tab.cc"
break;
case 50: /* stridpair: strid ID ID */
#line 328 "camp.y"
{ (yyval.ip) = new idpair((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, (yyvsp[-1].ps).sym , (yyvsp[0].ps).sym); }
-#line 2149 "camp.tab.c"
+#line 2151 "camp.tab.cc"
break;
case 51: /* stridpairlist: stridpair */
#line 332 "camp.y"
{ (yyval.ipl) = new idpairlist(); (yyval.ipl)->add((yyvsp[0].ip)); }
-#line 2155 "camp.tab.c"
+#line 2157 "camp.tab.cc"
break;
case 52: /* stridpairlist: stridpairlist ',' stridpair */
#line 334 "camp.y"
{ (yyval.ipl) = (yyvsp[-2].ipl); (yyval.ipl)->add((yyvsp[0].ip)); }
-#line 2161 "camp.tab.c"
+#line 2163 "camp.tab.cc"
break;
case 53: /* vardec: barevardec ';' */
#line 338 "camp.y"
{ (yyval.vd) = (yyvsp[-1].vd); }
-#line 2167 "camp.tab.c"
+#line 2169 "camp.tab.cc"
break;
case 54: /* barevardec: type decidlist */
#line 342 "camp.y"
{ (yyval.vd) = new vardec((yyvsp[-1].t)->getPos(), (yyvsp[-1].t), (yyvsp[0].dil)); }
-#line 2173 "camp.tab.c"
+#line 2175 "camp.tab.cc"
break;
case 55: /* type: celltype */
#line 346 "camp.y"
{ (yyval.t) = (yyvsp[0].t); }
-#line 2179 "camp.tab.c"
+#line 2181 "camp.tab.cc"
break;
case 56: /* type: name dims */
#line 347 "camp.y"
{ (yyval.t) = new arrayTy((yyvsp[-1].n), (yyvsp[0].dim)); }
-#line 2185 "camp.tab.c"
+#line 2187 "camp.tab.cc"
break;
case 57: /* celltype: name */
#line 351 "camp.y"
{ (yyval.t) = new nameTy((yyvsp[0].n)); }
-#line 2191 "camp.tab.c"
+#line 2193 "camp.tab.cc"
break;
case 58: /* dims: '[' ']' */
#line 355 "camp.y"
{ (yyval.dim) = new dimensions((yyvsp[-1].pos)); }
-#line 2197 "camp.tab.c"
+#line 2199 "camp.tab.cc"
break;
case 59: /* dims: dims '[' ']' */
#line 356 "camp.y"
{ (yyval.dim) = (yyvsp[-2].dim); (yyval.dim)->increase(); }
-#line 2203 "camp.tab.c"
+#line 2205 "camp.tab.cc"
break;
case 60: /* dimexps: '[' exp ']' */
#line 360 "camp.y"
{ (yyval.elist) = new explist((yyvsp[-2].pos)); (yyval.elist)->add((yyvsp[-1].e)); }
-#line 2209 "camp.tab.c"
+#line 2211 "camp.tab.cc"
break;
case 61: /* dimexps: dimexps '[' exp ']' */
#line 362 "camp.y"
{ (yyval.elist) = (yyvsp[-3].elist); (yyval.elist)->add((yyvsp[-1].e)); }
-#line 2215 "camp.tab.c"
+#line 2217 "camp.tab.cc"
break;
case 62: /* decidlist: decid */
#line 366 "camp.y"
{ (yyval.dil) = new decidlist((yyvsp[0].di)->getPos()); (yyval.dil)->add((yyvsp[0].di)); }
-#line 2221 "camp.tab.c"
+#line 2223 "camp.tab.cc"
break;
case 63: /* decidlist: decidlist ',' decid */
#line 368 "camp.y"
{ (yyval.dil) = (yyvsp[-2].dil); (yyval.dil)->add((yyvsp[0].di)); }
-#line 2227 "camp.tab.c"
+#line 2229 "camp.tab.cc"
break;
case 64: /* decid: decidstart */
#line 372 "camp.y"
{ (yyval.di) = new decid((yyvsp[0].dis)->getPos(), (yyvsp[0].dis)); }
-#line 2233 "camp.tab.c"
+#line 2235 "camp.tab.cc"
break;
case 65: /* decid: decidstart ASSIGN varinit */
#line 374 "camp.y"
{ (yyval.di) = new decid((yyvsp[-2].dis)->getPos(), (yyvsp[-2].dis), (yyvsp[0].vi)); }
-#line 2239 "camp.tab.c"
+#line 2241 "camp.tab.cc"
break;
case 66: /* decidstart: ID */
#line 378 "camp.y"
{ (yyval.dis) = new decidstart((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2245 "camp.tab.c"
+#line 2247 "camp.tab.cc"
break;
case 67: /* decidstart: ID dims */
#line 379 "camp.y"
{ (yyval.dis) = new decidstart((yyvsp[-1].ps).pos, (yyvsp[-1].ps).sym, (yyvsp[0].dim)); }
-#line 2251 "camp.tab.c"
+#line 2253 "camp.tab.cc"
break;
case 68: /* decidstart: ID '(' ')' */
#line 380 "camp.y"
{ (yyval.dis) = new fundecidstart((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, 0,
new formals((yyvsp[-1].pos))); }
-#line 2258 "camp.tab.c"
+#line 2260 "camp.tab.cc"
break;
case 69: /* decidstart: ID '(' formals ')' */
#line 383 "camp.y"
{ (yyval.dis) = new fundecidstart((yyvsp[-3].ps).pos, (yyvsp[-3].ps).sym, 0, (yyvsp[-1].fls)); }
-#line 2264 "camp.tab.c"
+#line 2266 "camp.tab.cc"
break;
case 70: /* varinit: exp */
#line 387 "camp.y"
{ (yyval.vi) = (yyvsp[0].e); }
-#line 2270 "camp.tab.c"
+#line 2272 "camp.tab.cc"
break;
case 71: /* varinit: arrayinit */
#line 388 "camp.y"
{ (yyval.vi) = (yyvsp[0].ai); }
-#line 2276 "camp.tab.c"
+#line 2278 "camp.tab.cc"
break;
case 72: /* block: '{' bareblock '}' */
#line 393 "camp.y"
{ (yyval.b) = (yyvsp[-1].b); }
-#line 2282 "camp.tab.c"
+#line 2284 "camp.tab.cc"
break;
case 73: /* arrayinit: '{' '}' */
#line 397 "camp.y"
{ (yyval.ai) = new arrayinit((yyvsp[-1].pos)); }
-#line 2288 "camp.tab.c"
+#line 2290 "camp.tab.cc"
break;
case 74: /* arrayinit: '{' ELLIPSIS varinit '}' */
#line 399 "camp.y"
{ (yyval.ai) = new arrayinit((yyvsp[-3].pos)); (yyval.ai)->addRest((yyvsp[-1].vi)); }
-#line 2294 "camp.tab.c"
+#line 2296 "camp.tab.cc"
break;
case 75: /* arrayinit: '{' basearrayinit '}' */
#line 401 "camp.y"
{ (yyval.ai) = (yyvsp[-1].ai); }
-#line 2300 "camp.tab.c"
+#line 2302 "camp.tab.cc"
break;
case 76: /* arrayinit: '{' basearrayinit ELLIPSIS varinit '}' */
#line 403 "camp.y"
{ (yyval.ai) = (yyvsp[-3].ai); (yyval.ai)->addRest((yyvsp[-1].vi)); }
-#line 2306 "camp.tab.c"
+#line 2308 "camp.tab.cc"
break;
case 77: /* basearrayinit: ',' */
#line 407 "camp.y"
{ (yyval.ai) = new arrayinit((yyvsp[0].pos)); }
-#line 2312 "camp.tab.c"
+#line 2314 "camp.tab.cc"
break;
case 78: /* basearrayinit: varinits */
#line 408 "camp.y"
{ (yyval.ai) = (yyvsp[0].ai); }
-#line 2318 "camp.tab.c"
+#line 2320 "camp.tab.cc"
break;
case 79: /* basearrayinit: varinits ',' */
#line 409 "camp.y"
{ (yyval.ai) = (yyvsp[-1].ai); }
-#line 2324 "camp.tab.c"
+#line 2326 "camp.tab.cc"
break;
case 80: /* varinits: varinit */
#line 413 "camp.y"
{ (yyval.ai) = new arrayinit((yyvsp[0].vi)->getPos());
(yyval.ai)->add((yyvsp[0].vi));}
-#line 2331 "camp.tab.c"
+#line 2333 "camp.tab.cc"
break;
case 81: /* varinits: varinits ',' varinit */
#line 416 "camp.y"
{ (yyval.ai) = (yyvsp[-2].ai); (yyval.ai)->add((yyvsp[0].vi)); }
-#line 2337 "camp.tab.c"
+#line 2339 "camp.tab.cc"
break;
case 82: /* formals: formal */
#line 420 "camp.y"
{ (yyval.fls) = new formals((yyvsp[0].fl)->getPos()); (yyval.fls)->add((yyvsp[0].fl)); }
-#line 2343 "camp.tab.c"
+#line 2345 "camp.tab.cc"
break;
case 83: /* formals: ELLIPSIS formal */
#line 421 "camp.y"
{ (yyval.fls) = new formals((yyvsp[-1].pos)); (yyval.fls)->addRest((yyvsp[0].fl)); }
-#line 2349 "camp.tab.c"
+#line 2351 "camp.tab.cc"
break;
case 84: /* formals: formals ',' formal */
#line 423 "camp.y"
{ (yyval.fls) = (yyvsp[-2].fls); (yyval.fls)->add((yyvsp[0].fl)); }
-#line 2355 "camp.tab.c"
+#line 2357 "camp.tab.cc"
break;
case 85: /* formals: formals ELLIPSIS formal */
#line 425 "camp.y"
{ (yyval.fls) = (yyvsp[-2].fls); (yyval.fls)->addRest((yyvsp[0].fl)); }
-#line 2361 "camp.tab.c"
+#line 2363 "camp.tab.cc"
break;
case 86: /* explicitornot: EXPLICIT */
#line 429 "camp.y"
{ (yyval.boo) = true; }
-#line 2367 "camp.tab.c"
+#line 2369 "camp.tab.cc"
break;
case 87: /* explicitornot: %empty */
#line 430 "camp.y"
{ (yyval.boo) = false; }
-#line 2373 "camp.tab.c"
+#line 2375 "camp.tab.cc"
break;
case 88: /* formal: explicitornot type */
#line 435 "camp.y"
{ (yyval.fl) = new formal((yyvsp[0].t)->getPos(), (yyvsp[0].t), 0, 0, (yyvsp[-1].boo), 0); }
-#line 2379 "camp.tab.c"
+#line 2381 "camp.tab.cc"
break;
case 89: /* formal: explicitornot type decidstart */
#line 437 "camp.y"
{ (yyval.fl) = new formal((yyvsp[-1].t)->getPos(), (yyvsp[-1].t), (yyvsp[0].dis), 0, (yyvsp[-2].boo), 0); }
-#line 2385 "camp.tab.c"
+#line 2387 "camp.tab.cc"
break;
case 90: /* formal: explicitornot type decidstart ASSIGN varinit */
#line 439 "camp.y"
{ (yyval.fl) = new formal((yyvsp[-3].t)->getPos(), (yyvsp[-3].t), (yyvsp[-2].dis), (yyvsp[0].vi), (yyvsp[-4].boo), 0); }
-#line 2391 "camp.tab.c"
+#line 2393 "camp.tab.cc"
break;
case 91: /* formal: explicitornot type ID decidstart */
#line 442 "camp.y"
{ bool k = checkKeyword((yyvsp[-1].ps).pos, (yyvsp[-1].ps).sym);
(yyval.fl) = new formal((yyvsp[-2].t)->getPos(), (yyvsp[-2].t), (yyvsp[0].dis), 0, (yyvsp[-3].boo), k); }
-#line 2398 "camp.tab.c"
+#line 2400 "camp.tab.cc"
break;
case 92: /* formal: explicitornot type ID decidstart ASSIGN varinit */
#line 445 "camp.y"
{ bool k = checkKeyword((yyvsp[-3].ps).pos, (yyvsp[-3].ps).sym);
(yyval.fl) = new formal((yyvsp[-4].t)->getPos(), (yyvsp[-4].t), (yyvsp[-2].dis), (yyvsp[0].vi), (yyvsp[-5].boo), k); }
-#line 2405 "camp.tab.c"
+#line 2407 "camp.tab.cc"
break;
case 93: /* fundec: type ID '(' ')' blockstm */
#line 451 "camp.y"
{ (yyval.d) = new fundec((yyvsp[-2].pos), (yyvsp[-4].t), (yyvsp[-3].ps).sym, new formals((yyvsp[-2].pos)), (yyvsp[0].s)); }
-#line 2411 "camp.tab.c"
+#line 2413 "camp.tab.cc"
break;
case 94: /* fundec: type ID '(' formals ')' blockstm */
#line 453 "camp.y"
{ (yyval.d) = new fundec((yyvsp[-3].pos), (yyvsp[-5].t), (yyvsp[-4].ps).sym, (yyvsp[-2].fls), (yyvsp[0].s)); }
-#line 2417 "camp.tab.c"
+#line 2419 "camp.tab.cc"
break;
case 95: /* typedec: STRUCT ID block */
#line 457 "camp.y"
{ (yyval.d) = new recorddec((yyvsp[-2].pos), (yyvsp[-1].ps).sym, (yyvsp[0].b)); }
-#line 2423 "camp.tab.c"
+#line 2425 "camp.tab.cc"
break;
case 96: /* typedec: TYPEDEF vardec */
#line 458 "camp.y"
{ (yyval.d) = new typedec((yyvsp[-1].pos), (yyvsp[0].vd)); }
-#line 2429 "camp.tab.c"
+#line 2431 "camp.tab.cc"
+ break;
+
+ case 97: /* typedec: USING ID ASSIGN type ';' */
+#line 464 "camp.y"
+ { decidstart *dis = new decidstart((yyvsp[-3].ps).pos, (yyvsp[-3].ps).sym);
+ (yyval.d) = new typedec((yyvsp[-4].pos), dis, (yyvsp[-1].t)); }
+#line 2438 "camp.tab.cc"
+ break;
+
+ case 98: /* typedec: USING ID ASSIGN type '(' ')' ';' */
+#line 467 "camp.y"
+ { decidstart *dis = new fundecidstart((yyvsp[-5].ps).pos, (yyvsp[-5].ps).sym,
+ 0, new formals((yyvsp[-2].pos)));
+ (yyval.d) = new typedec((yyvsp[-6].pos), dis, (yyvsp[-3].t)); }
+#line 2446 "camp.tab.cc"
break;
- case 97: /* slice: ':' */
-#line 462 "camp.y"
+ case 99: /* typedec: USING ID ASSIGN type '(' formals ')' ';' */
+#line 471 "camp.y"
+ { decidstart *dis = new fundecidstart((yyvsp[-6].ps).pos, (yyvsp[-6].ps).sym, 0, (yyvsp[-2].fls));
+ (yyval.d) = new typedec((yyvsp[-7].pos), dis, (yyvsp[-4].t)); }
+#line 2453 "camp.tab.cc"
+ break;
+
+ case 100: /* slice: ':' */
+#line 476 "camp.y"
{ (yyval.slice) = new slice((yyvsp[0].pos), 0, 0); }
-#line 2435 "camp.tab.c"
+#line 2459 "camp.tab.cc"
break;
- case 98: /* slice: exp ':' */
-#line 463 "camp.y"
+ case 101: /* slice: exp ':' */
+#line 477 "camp.y"
{ (yyval.slice) = new slice((yyvsp[0].pos), (yyvsp[-1].e), 0); }
-#line 2441 "camp.tab.c"
+#line 2465 "camp.tab.cc"
break;
- case 99: /* slice: ':' exp */
-#line 464 "camp.y"
+ case 102: /* slice: ':' exp */
+#line 478 "camp.y"
{ (yyval.slice) = new slice((yyvsp[-1].pos), 0, (yyvsp[0].e)); }
-#line 2447 "camp.tab.c"
+#line 2471 "camp.tab.cc"
break;
- case 100: /* slice: exp ':' exp */
-#line 465 "camp.y"
+ case 103: /* slice: exp ':' exp */
+#line 479 "camp.y"
{ (yyval.slice) = new slice((yyvsp[-1].pos), (yyvsp[-2].e), (yyvsp[0].e)); }
-#line 2453 "camp.tab.c"
+#line 2477 "camp.tab.cc"
break;
- case 101: /* value: value '.' ID */
-#line 469 "camp.y"
+ case 104: /* value: value '.' ID */
+#line 483 "camp.y"
{ (yyval.e) = new fieldExp((yyvsp[-1].pos), (yyvsp[-2].e), (yyvsp[0].ps).sym); }
-#line 2459 "camp.tab.c"
+#line 2483 "camp.tab.cc"
break;
- case 102: /* value: name '[' exp ']' */
-#line 470 "camp.y"
+ case 105: /* value: name '[' exp ']' */
+#line 484 "camp.y"
{ (yyval.e) = new subscriptExp((yyvsp[-2].pos),
new nameExp((yyvsp[-3].n)->getPos(), (yyvsp[-3].n)), (yyvsp[-1].e)); }
-#line 2466 "camp.tab.c"
+#line 2490 "camp.tab.cc"
break;
- case 103: /* value: value '[' exp ']' */
-#line 472 "camp.y"
+ case 106: /* value: value '[' exp ']' */
+#line 486 "camp.y"
{ (yyval.e) = new subscriptExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].e)); }
-#line 2472 "camp.tab.c"
+#line 2496 "camp.tab.cc"
break;
- case 104: /* value: name '[' slice ']' */
-#line 473 "camp.y"
+ case 107: /* value: name '[' slice ']' */
+#line 487 "camp.y"
{ (yyval.e) = new sliceExp((yyvsp[-2].pos),
new nameExp((yyvsp[-3].n)->getPos(), (yyvsp[-3].n)), (yyvsp[-1].slice)); }
-#line 2479 "camp.tab.c"
+#line 2503 "camp.tab.cc"
break;
- case 105: /* value: value '[' slice ']' */
-#line 475 "camp.y"
+ case 108: /* value: value '[' slice ']' */
+#line 489 "camp.y"
{ (yyval.e) = new sliceExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].slice)); }
-#line 2485 "camp.tab.c"
+#line 2509 "camp.tab.cc"
break;
- case 106: /* value: name '(' ')' */
-#line 476 "camp.y"
+ case 109: /* value: name '(' ')' */
+#line 490 "camp.y"
{ (yyval.e) = new callExp((yyvsp[-1].pos),
new nameExp((yyvsp[-2].n)->getPos(), (yyvsp[-2].n)),
new arglist()); }
-#line 2493 "camp.tab.c"
+#line 2517 "camp.tab.cc"
break;
- case 107: /* value: name '(' arglist ')' */
-#line 480 "camp.y"
+ case 110: /* value: name '(' arglist ')' */
+#line 494 "camp.y"
{ (yyval.e) = new callExp((yyvsp[-2].pos),
new nameExp((yyvsp[-3].n)->getPos(), (yyvsp[-3].n)),
(yyvsp[-1].alist)); }
-#line 2501 "camp.tab.c"
+#line 2525 "camp.tab.cc"
break;
- case 108: /* value: value '(' ')' */
-#line 483 "camp.y"
+ case 111: /* value: value '(' ')' */
+#line 497 "camp.y"
{ (yyval.e) = new callExp((yyvsp[-1].pos), (yyvsp[-2].e), new arglist()); }
-#line 2507 "camp.tab.c"
+#line 2531 "camp.tab.cc"
break;
- case 109: /* value: value '(' arglist ')' */
-#line 485 "camp.y"
+ case 112: /* value: value '(' arglist ')' */
+#line 499 "camp.y"
{ (yyval.e) = new callExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].alist)); }
-#line 2513 "camp.tab.c"
+#line 2537 "camp.tab.cc"
break;
- case 110: /* value: '(' exp ')' */
-#line 487 "camp.y"
+ case 113: /* value: '(' exp ')' */
+#line 501 "camp.y"
{ (yyval.e) = (yyvsp[-1].e); }
-#line 2519 "camp.tab.c"
+#line 2543 "camp.tab.cc"
break;
- case 111: /* value: '(' name ')' */
-#line 489 "camp.y"
+ case 114: /* value: '(' name ')' */
+#line 503 "camp.y"
{ (yyval.e) = new nameExp((yyvsp[-1].n)->getPos(), (yyvsp[-1].n)); }
-#line 2525 "camp.tab.c"
+#line 2549 "camp.tab.cc"
break;
- case 112: /* value: THIS */
-#line 490 "camp.y"
+ case 115: /* value: THIS_TOK */
+#line 504 "camp.y"
{ (yyval.e) = new thisExp((yyvsp[0].pos)); }
-#line 2531 "camp.tab.c"
+#line 2555 "camp.tab.cc"
break;
- case 113: /* argument: exp */
-#line 494 "camp.y"
+ case 116: /* argument: exp */
+#line 508 "camp.y"
{ (yyval.arg).name = symbol::nullsym; (yyval.arg).val=(yyvsp[0].e); }
-#line 2537 "camp.tab.c"
+#line 2561 "camp.tab.cc"
break;
- case 114: /* argument: ID ASSIGN exp */
-#line 495 "camp.y"
+ case 117: /* argument: ID ASSIGN exp */
+#line 509 "camp.y"
{ (yyval.arg).name = (yyvsp[-2].ps).sym; (yyval.arg).val=(yyvsp[0].e); }
-#line 2543 "camp.tab.c"
+#line 2567 "camp.tab.cc"
break;
- case 115: /* arglist: argument */
-#line 499 "camp.y"
+ case 118: /* arglist: argument */
+#line 513 "camp.y"
{ (yyval.alist) = new arglist(); (yyval.alist)->add((yyvsp[0].arg)); }
-#line 2549 "camp.tab.c"
+#line 2573 "camp.tab.cc"
break;
- case 116: /* arglist: ELLIPSIS argument */
-#line 501 "camp.y"
+ case 119: /* arglist: ELLIPSIS argument */
+#line 515 "camp.y"
{ (yyval.alist) = new arglist(); (yyval.alist)->addRest((yyvsp[0].arg)); }
-#line 2555 "camp.tab.c"
+#line 2579 "camp.tab.cc"
break;
- case 117: /* arglist: arglist ',' argument */
-#line 503 "camp.y"
+ case 120: /* arglist: arglist ',' argument */
+#line 517 "camp.y"
{ (yyval.alist) = (yyvsp[-2].alist); (yyval.alist)->add((yyvsp[0].arg)); }
-#line 2561 "camp.tab.c"
+#line 2585 "camp.tab.cc"
break;
- case 118: /* arglist: arglist ELLIPSIS argument */
-#line 505 "camp.y"
+ case 121: /* arglist: arglist ELLIPSIS argument */
+#line 519 "camp.y"
{ (yyval.alist) = (yyvsp[-2].alist); (yyval.alist)->addRest((yyvsp[0].arg)); }
-#line 2567 "camp.tab.c"
+#line 2591 "camp.tab.cc"
break;
- case 119: /* tuple: exp ',' exp */
-#line 510 "camp.y"
+ case 122: /* tuple: exp ',' exp */
+#line 524 "camp.y"
{ (yyval.alist) = new arglist(); (yyval.alist)->add((yyvsp[-2].e)); (yyval.alist)->add((yyvsp[0].e)); }
-#line 2573 "camp.tab.c"
+#line 2597 "camp.tab.cc"
break;
- case 120: /* tuple: tuple ',' exp */
-#line 511 "camp.y"
+ case 123: /* tuple: tuple ',' exp */
+#line 525 "camp.y"
{ (yyval.alist) = (yyvsp[-2].alist); (yyval.alist)->add((yyvsp[0].e)); }
-#line 2579 "camp.tab.c"
+#line 2603 "camp.tab.cc"
break;
- case 121: /* exp: name */
-#line 515 "camp.y"
+ case 124: /* exp: name */
+#line 529 "camp.y"
{ (yyval.e) = new nameExp((yyvsp[0].n)->getPos(), (yyvsp[0].n)); }
-#line 2585 "camp.tab.c"
+#line 2609 "camp.tab.cc"
break;
- case 122: /* exp: value */
-#line 516 "camp.y"
+ case 125: /* exp: value */
+#line 530 "camp.y"
{ (yyval.e) = (yyvsp[0].e); }
-#line 2591 "camp.tab.c"
+#line 2615 "camp.tab.cc"
break;
- case 123: /* exp: LIT */
-#line 517 "camp.y"
+ case 126: /* exp: LIT */
+#line 531 "camp.y"
{ (yyval.e) = (yyvsp[0].e); }
-#line 2597 "camp.tab.c"
+#line 2621 "camp.tab.cc"
break;
- case 124: /* exp: STRING */
-#line 518 "camp.y"
+ case 127: /* exp: STRING */
+#line 532 "camp.y"
{ (yyval.e) = (yyvsp[0].stre); }
-#line 2603 "camp.tab.c"
+#line 2627 "camp.tab.cc"
break;
- case 125: /* exp: LIT exp */
-#line 520 "camp.y"
+ case 128: /* exp: LIT exp */
+#line 534 "camp.y"
{ (yyval.e) = new scaleExp((yyvsp[-1].e)->getPos(), (yyvsp[-1].e), (yyvsp[0].e)); }
-#line 2609 "camp.tab.c"
+#line 2633 "camp.tab.cc"
break;
- case 126: /* exp: '(' name ')' exp */
-#line 522 "camp.y"
+ case 129: /* exp: '(' name ')' exp */
+#line 536 "camp.y"
{ (yyval.e) = new castExp((yyvsp[-2].n)->getPos(), new nameTy((yyvsp[-2].n)), (yyvsp[0].e)); }
-#line 2615 "camp.tab.c"
+#line 2639 "camp.tab.cc"
break;
- case 127: /* exp: '(' name dims ')' exp */
-#line 524 "camp.y"
+ case 130: /* exp: '(' name dims ')' exp */
+#line 538 "camp.y"
{ (yyval.e) = new castExp((yyvsp[-3].n)->getPos(), new arrayTy((yyvsp[-3].n), (yyvsp[-2].dim)), (yyvsp[0].e)); }
-#line 2621 "camp.tab.c"
+#line 2645 "camp.tab.cc"
break;
- case 128: /* exp: '+' exp */
-#line 526 "camp.y"
+ case 131: /* exp: '+' exp */
+#line 540 "camp.y"
{ (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); }
-#line 2627 "camp.tab.c"
+#line 2651 "camp.tab.cc"
break;
- case 129: /* exp: '-' exp */
-#line 528 "camp.y"
+ case 132: /* exp: '-' exp */
+#line 542 "camp.y"
{ (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); }
-#line 2633 "camp.tab.c"
+#line 2657 "camp.tab.cc"
break;
- case 130: /* exp: OPERATOR exp */
-#line 529 "camp.y"
+ case 133: /* exp: OPERATOR exp */
+#line 543 "camp.y"
{ (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); }
-#line 2639 "camp.tab.c"
+#line 2663 "camp.tab.cc"
break;
- case 131: /* exp: exp '+' exp */
-#line 530 "camp.y"
+ case 134: /* exp: exp '+' exp */
+#line 544 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2645 "camp.tab.c"
+#line 2669 "camp.tab.cc"
break;
- case 132: /* exp: exp '-' exp */
-#line 531 "camp.y"
+ case 135: /* exp: exp '-' exp */
+#line 545 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2651 "camp.tab.c"
+#line 2675 "camp.tab.cc"
break;
- case 133: /* exp: exp '*' exp */
-#line 532 "camp.y"
+ case 136: /* exp: exp '*' exp */
+#line 546 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2657 "camp.tab.c"
+#line 2681 "camp.tab.cc"
break;
- case 134: /* exp: exp '/' exp */
-#line 533 "camp.y"
+ case 137: /* exp: exp '/' exp */
+#line 547 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2663 "camp.tab.c"
+#line 2687 "camp.tab.cc"
break;
- case 135: /* exp: exp '%' exp */
-#line 534 "camp.y"
+ case 138: /* exp: exp '%' exp */
+#line 548 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2669 "camp.tab.c"
+#line 2693 "camp.tab.cc"
break;
- case 136: /* exp: exp '#' exp */
-#line 535 "camp.y"
+ case 139: /* exp: exp '#' exp */
+#line 549 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2675 "camp.tab.c"
+#line 2699 "camp.tab.cc"
break;
- case 137: /* exp: exp '^' exp */
-#line 536 "camp.y"
+ case 140: /* exp: exp '^' exp */
+#line 550 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2681 "camp.tab.c"
+#line 2705 "camp.tab.cc"
break;
- case 138: /* exp: exp LT exp */
-#line 537 "camp.y"
+ case 141: /* exp: exp LT exp */
+#line 551 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2687 "camp.tab.c"
+#line 2711 "camp.tab.cc"
break;
- case 139: /* exp: exp LE exp */
-#line 538 "camp.y"
+ case 142: /* exp: exp LE exp */
+#line 552 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2693 "camp.tab.c"
+#line 2717 "camp.tab.cc"
break;
- case 140: /* exp: exp GT exp */
-#line 539 "camp.y"
+ case 143: /* exp: exp GT exp */
+#line 553 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2699 "camp.tab.c"
+#line 2723 "camp.tab.cc"
break;
- case 141: /* exp: exp GE exp */
-#line 540 "camp.y"
+ case 144: /* exp: exp GE exp */
+#line 554 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2705 "camp.tab.c"
+#line 2729 "camp.tab.cc"
break;
- case 142: /* exp: exp EQ exp */
-#line 541 "camp.y"
+ case 145: /* exp: exp EQ exp */
+#line 555 "camp.y"
{ (yyval.e) = new equalityExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2711 "camp.tab.c"
+#line 2735 "camp.tab.cc"
break;
- case 143: /* exp: exp NEQ exp */
-#line 542 "camp.y"
+ case 146: /* exp: exp NEQ exp */
+#line 556 "camp.y"
{ (yyval.e) = new equalityExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2717 "camp.tab.c"
+#line 2741 "camp.tab.cc"
break;
- case 144: /* exp: exp CAND exp */
-#line 543 "camp.y"
+ case 147: /* exp: exp CAND exp */
+#line 557 "camp.y"
{ (yyval.e) = new andExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2723 "camp.tab.c"
+#line 2747 "camp.tab.cc"
break;
- case 145: /* exp: exp COR exp */
-#line 544 "camp.y"
+ case 148: /* exp: exp COR exp */
+#line 558 "camp.y"
{ (yyval.e) = new orExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2729 "camp.tab.c"
+#line 2753 "camp.tab.cc"
break;
- case 146: /* exp: exp CARETS exp */
-#line 545 "camp.y"
+ case 149: /* exp: exp CARETS exp */
+#line 559 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2735 "camp.tab.c"
+#line 2759 "camp.tab.cc"
break;
- case 147: /* exp: exp AMPERSAND exp */
-#line 546 "camp.y"
+ case 150: /* exp: exp AMPERSAND exp */
+#line 560 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2741 "camp.tab.c"
+#line 2765 "camp.tab.cc"
break;
- case 148: /* exp: exp BAR exp */
-#line 547 "camp.y"
+ case 151: /* exp: exp BAR exp */
+#line 561 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2747 "camp.tab.c"
+#line 2771 "camp.tab.cc"
break;
- case 149: /* exp: exp OPERATOR exp */
-#line 548 "camp.y"
+ case 152: /* exp: exp OPERATOR exp */
+#line 562 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2753 "camp.tab.c"
+#line 2777 "camp.tab.cc"
break;
- case 150: /* exp: exp INCR exp */
-#line 549 "camp.y"
+ case 153: /* exp: exp INCR exp */
+#line 563 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2759 "camp.tab.c"
+#line 2783 "camp.tab.cc"
break;
- case 151: /* exp: NEW celltype */
-#line 551 "camp.y"
+ case 154: /* exp: NEW celltype */
+#line 565 "camp.y"
{ (yyval.e) = new newRecordExp((yyvsp[-1].pos), (yyvsp[0].t)); }
-#line 2765 "camp.tab.c"
+#line 2789 "camp.tab.cc"
break;
- case 152: /* exp: NEW celltype dimexps */
-#line 553 "camp.y"
+ case 155: /* exp: NEW celltype dimexps */
+#line 567 "camp.y"
{ (yyval.e) = new newArrayExp((yyvsp[-2].pos), (yyvsp[-1].t), (yyvsp[0].elist), 0, 0); }
-#line 2771 "camp.tab.c"
+#line 2795 "camp.tab.cc"
break;
- case 153: /* exp: NEW celltype dimexps dims */
-#line 555 "camp.y"
+ case 156: /* exp: NEW celltype dimexps dims */
+#line 569 "camp.y"
{ (yyval.e) = new newArrayExp((yyvsp[-3].pos), (yyvsp[-2].t), (yyvsp[-1].elist), (yyvsp[0].dim), 0); }
-#line 2777 "camp.tab.c"
+#line 2801 "camp.tab.cc"
break;
- case 154: /* exp: NEW celltype dims */
-#line 557 "camp.y"
+ case 157: /* exp: NEW celltype dims */
+#line 571 "camp.y"
{ (yyval.e) = new newArrayExp((yyvsp[-2].pos), (yyvsp[-1].t), 0, (yyvsp[0].dim), 0); }
-#line 2783 "camp.tab.c"
+#line 2807 "camp.tab.cc"
break;
- case 155: /* exp: NEW celltype dims arrayinit */
-#line 559 "camp.y"
+ case 158: /* exp: NEW celltype dims arrayinit */
+#line 573 "camp.y"
{ (yyval.e) = new newArrayExp((yyvsp[-3].pos), (yyvsp[-2].t), 0, (yyvsp[-1].dim), (yyvsp[0].ai)); }
-#line 2789 "camp.tab.c"
+#line 2813 "camp.tab.cc"
break;
- case 156: /* exp: NEW celltype '(' ')' blockstm */
-#line 561 "camp.y"
+ case 159: /* exp: NEW celltype '(' ')' blockstm */
+#line 575 "camp.y"
{ (yyval.e) = new newFunctionExp((yyvsp[-4].pos), (yyvsp[-3].t), new formals((yyvsp[-2].pos)), (yyvsp[0].s)); }
-#line 2795 "camp.tab.c"
+#line 2819 "camp.tab.cc"
break;
- case 157: /* exp: NEW celltype dims '(' ')' blockstm */
-#line 563 "camp.y"
+ case 160: /* exp: NEW celltype dims '(' ')' blockstm */
+#line 577 "camp.y"
{ (yyval.e) = new newFunctionExp((yyvsp[-5].pos),
new arrayTy((yyvsp[-4].t)->getPos(), (yyvsp[-4].t), (yyvsp[-3].dim)),
new formals((yyvsp[-2].pos)),
(yyvsp[0].s)); }
-#line 2804 "camp.tab.c"
+#line 2828 "camp.tab.cc"
break;
- case 158: /* exp: NEW celltype '(' formals ')' blockstm */
-#line 568 "camp.y"
+ case 161: /* exp: NEW celltype '(' formals ')' blockstm */
+#line 582 "camp.y"
{ (yyval.e) = new newFunctionExp((yyvsp[-5].pos), (yyvsp[-4].t), (yyvsp[-2].fls), (yyvsp[0].s)); }
-#line 2810 "camp.tab.c"
+#line 2834 "camp.tab.cc"
break;
- case 159: /* exp: NEW celltype dims '(' formals ')' blockstm */
-#line 570 "camp.y"
+ case 162: /* exp: NEW celltype dims '(' formals ')' blockstm */
+#line 584 "camp.y"
{ (yyval.e) = new newFunctionExp((yyvsp[-6].pos),
new arrayTy((yyvsp[-5].t)->getPos(), (yyvsp[-5].t), (yyvsp[-4].dim)),
(yyvsp[-2].fls),
(yyvsp[0].s)); }
-#line 2819 "camp.tab.c"
+#line 2843 "camp.tab.cc"
break;
- case 160: /* exp: exp '?' exp ':' exp */
-#line 575 "camp.y"
+ case 163: /* exp: exp '?' exp ':' exp */
+#line 589 "camp.y"
{ (yyval.e) = new conditionalExp((yyvsp[-3].pos), (yyvsp[-4].e), (yyvsp[-2].e), (yyvsp[0].e)); }
-#line 2825 "camp.tab.c"
+#line 2849 "camp.tab.cc"
break;
- case 161: /* exp: exp ASSIGN exp */
-#line 576 "camp.y"
+ case 164: /* exp: exp ASSIGN exp */
+#line 590 "camp.y"
{ (yyval.e) = new assignExp((yyvsp[-1].pos), (yyvsp[-2].e), (yyvsp[0].e)); }
-#line 2831 "camp.tab.c"
+#line 2855 "camp.tab.cc"
break;
- case 162: /* exp: '(' tuple ')' */
-#line 577 "camp.y"
+ case 165: /* exp: '(' tuple ')' */
+#line 591 "camp.y"
{ (yyval.e) = new callExp((yyvsp[-2].pos), new nameExp((yyvsp[-2].pos), SYM_TUPLE), (yyvsp[-1].alist)); }
-#line 2837 "camp.tab.c"
+#line 2861 "camp.tab.cc"
break;
- case 163: /* exp: exp join exp */
-#line 579 "camp.y"
+ case 166: /* exp: exp join exp */
+#line 593 "camp.y"
{ (yyvsp[-1].j)->pushFront((yyvsp[-2].e)); (yyvsp[-1].j)->pushBack((yyvsp[0].e)); (yyval.e) = (yyvsp[-1].j); }
-#line 2843 "camp.tab.c"
+#line 2867 "camp.tab.cc"
break;
- case 164: /* exp: exp dir */
-#line 581 "camp.y"
+ case 167: /* exp: exp dir */
+#line 595 "camp.y"
{ (yyvsp[0].se)->setSide(camp::OUT);
joinExp *jexp =
new joinExp((yyvsp[0].se)->getPos(), SYM_DOTS);
(yyval.e)=jexp;
jexp->pushBack((yyvsp[-1].e)); jexp->pushBack((yyvsp[0].se)); }
-#line 2853 "camp.tab.c"
+#line 2877 "camp.tab.cc"
break;
- case 165: /* exp: INCR exp */
-#line 587 "camp.y"
+ case 168: /* exp: INCR exp */
+#line 601 "camp.y"
{ (yyval.e) = new prefixExp((yyvsp[-1].ps).pos, (yyvsp[0].e), SYM_PLUS); }
-#line 2859 "camp.tab.c"
+#line 2883 "camp.tab.cc"
break;
- case 166: /* exp: DASHES exp */
-#line 589 "camp.y"
+ case 169: /* exp: DASHES exp */
+#line 603 "camp.y"
{ (yyval.e) = new prefixExp((yyvsp[-1].ps).pos, (yyvsp[0].e), SYM_MINUS); }
-#line 2865 "camp.tab.c"
+#line 2889 "camp.tab.cc"
break;
- case 167: /* exp: exp INCR */
-#line 592 "camp.y"
+ case 170: /* exp: exp INCR */
+#line 606 "camp.y"
{ (yyval.e) = new postfixExp((yyvsp[0].ps).pos, (yyvsp[-1].e), SYM_PLUS); }
-#line 2871 "camp.tab.c"
+#line 2895 "camp.tab.cc"
break;
- case 168: /* exp: exp SELFOP exp */
-#line 593 "camp.y"
+ case 171: /* exp: exp SELFOP exp */
+#line 607 "camp.y"
{ (yyval.e) = new selfExp((yyvsp[-1].ps).pos, (yyvsp[-2].e), (yyvsp[-1].ps).sym, (yyvsp[0].e)); }
-#line 2877 "camp.tab.c"
+#line 2901 "camp.tab.cc"
break;
- case 169: /* exp: QUOTE '{' fileblock '}' */
-#line 595 "camp.y"
+ case 172: /* exp: QUOTE '{' fileblock '}' */
+#line 609 "camp.y"
{ (yyval.e) = new quoteExp((yyvsp[-3].pos), (yyvsp[-1].b)); }
-#line 2883 "camp.tab.c"
+#line 2907 "camp.tab.cc"
break;
- case 170: /* join: DASHES */
-#line 601 "camp.y"
+ case 173: /* join: DASHES */
+#line 615 "camp.y"
{ (yyval.j) = new joinExp((yyvsp[0].ps).pos,(yyvsp[0].ps).sym); }
-#line 2889 "camp.tab.c"
+#line 2913 "camp.tab.cc"
break;
- case 171: /* join: basicjoin */
-#line 603 "camp.y"
+ case 174: /* join: basicjoin */
+#line 617 "camp.y"
{ (yyval.j) = (yyvsp[0].j); }
-#line 2895 "camp.tab.c"
+#line 2919 "camp.tab.cc"
break;
- case 172: /* join: dir basicjoin */
-#line 605 "camp.y"
+ case 175: /* join: dir basicjoin */
+#line 619 "camp.y"
{ (yyvsp[-1].se)->setSide(camp::OUT);
(yyval.j) = (yyvsp[0].j); (yyval.j)->pushFront((yyvsp[-1].se)); }
-#line 2902 "camp.tab.c"
+#line 2926 "camp.tab.cc"
break;
- case 173: /* join: basicjoin dir */
-#line 608 "camp.y"
+ case 176: /* join: basicjoin dir */
+#line 622 "camp.y"
{ (yyvsp[0].se)->setSide(camp::IN);
(yyval.j) = (yyvsp[-1].j); (yyval.j)->pushBack((yyvsp[0].se)); }
-#line 2909 "camp.tab.c"
+#line 2933 "camp.tab.cc"
break;
- case 174: /* join: dir basicjoin dir */
-#line 611 "camp.y"
+ case 177: /* join: dir basicjoin dir */
+#line 625 "camp.y"
{ (yyvsp[-2].se)->setSide(camp::OUT); (yyvsp[0].se)->setSide(camp::IN);
(yyval.j) = (yyvsp[-1].j); (yyval.j)->pushFront((yyvsp[-2].se)); (yyval.j)->pushBack((yyvsp[0].se)); }
-#line 2916 "camp.tab.c"
+#line 2940 "camp.tab.cc"
break;
- case 175: /* dir: '{' CURL exp '}' */
-#line 616 "camp.y"
+ case 178: /* dir: '{' CURL exp '}' */
+#line 630 "camp.y"
{ (yyval.se) = new specExp((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym, (yyvsp[-1].e)); }
-#line 2922 "camp.tab.c"
+#line 2946 "camp.tab.cc"
break;
- case 176: /* dir: '{' exp '}' */
-#line 617 "camp.y"
+ case 179: /* dir: '{' exp '}' */
+#line 631 "camp.y"
{ (yyval.se) = new specExp((yyvsp[-2].pos), symbol::opTrans("spec"), (yyvsp[-1].e)); }
-#line 2928 "camp.tab.c"
+#line 2952 "camp.tab.cc"
break;
- case 177: /* dir: '{' exp ',' exp '}' */
-#line 619 "camp.y"
+ case 180: /* dir: '{' exp ',' exp '}' */
+#line 633 "camp.y"
{ (yyval.se) = new specExp((yyvsp[-4].pos), symbol::opTrans("spec"),
new pairExp((yyvsp[-2].pos), (yyvsp[-3].e), (yyvsp[-1].e))); }
-#line 2935 "camp.tab.c"
+#line 2959 "camp.tab.cc"
break;
- case 178: /* dir: '{' exp ',' exp ',' exp '}' */
-#line 622 "camp.y"
+ case 181: /* dir: '{' exp ',' exp ',' exp '}' */
+#line 636 "camp.y"
{ (yyval.se) = new specExp((yyvsp[-6].pos), symbol::opTrans("spec"),
new tripleExp((yyvsp[-4].pos), (yyvsp[-5].e), (yyvsp[-3].e), (yyvsp[-1].e))); }
-#line 2942 "camp.tab.c"
+#line 2966 "camp.tab.cc"
break;
- case 179: /* basicjoin: DOTS */
-#line 627 "camp.y"
+ case 182: /* basicjoin: DOTS */
+#line 641 "camp.y"
{ (yyval.j) = new joinExp((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2948 "camp.tab.c"
+#line 2972 "camp.tab.cc"
break;
- case 180: /* basicjoin: DOTS tension DOTS */
-#line 629 "camp.y"
+ case 183: /* basicjoin: DOTS tension DOTS */
+#line 643 "camp.y"
{ (yyval.j) = new joinExp((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym); (yyval.j)->pushBack((yyvsp[-1].e)); }
-#line 2954 "camp.tab.c"
+#line 2978 "camp.tab.cc"
break;
- case 181: /* basicjoin: DOTS controls DOTS */
-#line 631 "camp.y"
+ case 184: /* basicjoin: DOTS controls DOTS */
+#line 645 "camp.y"
{ (yyval.j) = new joinExp((yyvsp[-2].ps).pos, (yyvsp[-2].ps).sym); (yyval.j)->pushBack((yyvsp[-1].e)); }
-#line 2960 "camp.tab.c"
+#line 2984 "camp.tab.cc"
break;
- case 182: /* basicjoin: COLONS */
-#line 632 "camp.y"
+ case 185: /* basicjoin: COLONS */
+#line 646 "camp.y"
{ (yyval.j) = new joinExp((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2966 "camp.tab.c"
+#line 2990 "camp.tab.cc"
break;
- case 183: /* basicjoin: LONGDASH */
-#line 633 "camp.y"
+ case 186: /* basicjoin: LONGDASH */
+#line 647 "camp.y"
{ (yyval.j) = new joinExp((yyvsp[0].ps).pos, (yyvsp[0].ps).sym); }
-#line 2972 "camp.tab.c"
+#line 2996 "camp.tab.cc"
break;
- case 184: /* tension: TENSION exp */
-#line 637 "camp.y"
+ case 187: /* tension: TENSION exp */
+#line 651 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym,
new booleanExp((yyvsp[-1].ps).pos, false)); }
-#line 2979 "camp.tab.c"
+#line 3003 "camp.tab.cc"
break;
- case 185: /* tension: TENSION exp AND exp */
-#line 640 "camp.y"
+ case 188: /* tension: TENSION exp AND exp */
+#line 654 "camp.y"
{ (yyval.e) = new ternaryExp((yyvsp[-3].ps).pos, (yyvsp[-2].e), (yyvsp[-3].ps).sym, (yyvsp[0].e),
new booleanExp((yyvsp[-3].ps).pos, false)); }
-#line 2986 "camp.tab.c"
+#line 3010 "camp.tab.cc"
break;
- case 186: /* tension: TENSION ATLEAST exp */
-#line 643 "camp.y"
+ case 189: /* tension: TENSION ATLEAST exp */
+#line 657 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-2].ps).pos, (yyvsp[0].e), (yyvsp[-2].ps).sym,
new booleanExp((yyvsp[-1].ps).pos, true)); }
-#line 2993 "camp.tab.c"
+#line 3017 "camp.tab.cc"
break;
- case 187: /* tension: TENSION ATLEAST exp AND exp */
-#line 646 "camp.y"
+ case 190: /* tension: TENSION ATLEAST exp AND exp */
+#line 660 "camp.y"
{ (yyval.e) = new ternaryExp((yyvsp[-4].ps).pos, (yyvsp[-2].e), (yyvsp[-4].ps).sym, (yyvsp[0].e),
new booleanExp((yyvsp[-3].ps).pos, true)); }
-#line 3000 "camp.tab.c"
+#line 3024 "camp.tab.cc"
break;
- case 188: /* controls: CONTROLS exp */
-#line 651 "camp.y"
+ case 191: /* controls: CONTROLS exp */
+#line 665 "camp.y"
{ (yyval.e) = new unaryExp((yyvsp[-1].ps).pos, (yyvsp[0].e), (yyvsp[-1].ps).sym); }
-#line 3006 "camp.tab.c"
+#line 3030 "camp.tab.cc"
break;
- case 189: /* controls: CONTROLS exp AND exp */
-#line 653 "camp.y"
+ case 192: /* controls: CONTROLS exp AND exp */
+#line 667 "camp.y"
{ (yyval.e) = new binaryExp((yyvsp[-3].ps).pos, (yyvsp[-2].e), (yyvsp[-3].ps).sym, (yyvsp[0].e)); }
-#line 3012 "camp.tab.c"
+#line 3036 "camp.tab.cc"
break;
- case 190: /* stm: ';' */
-#line 657 "camp.y"
+ case 193: /* stm: ';' */
+#line 671 "camp.y"
{ (yyval.s) = new emptyStm((yyvsp[0].pos)); }
-#line 3018 "camp.tab.c"
+#line 3042 "camp.tab.cc"
break;
- case 191: /* stm: blockstm */
-#line 658 "camp.y"
+ case 194: /* stm: blockstm */
+#line 672 "camp.y"
{ (yyval.s) = (yyvsp[0].s); }
-#line 3024 "camp.tab.c"
+#line 3048 "camp.tab.cc"
break;
- case 192: /* stm: stmexp ';' */
-#line 659 "camp.y"
+ case 195: /* stm: stmexp ';' */
+#line 673 "camp.y"
{ (yyval.s) = (yyvsp[-1].s); }
-#line 3030 "camp.tab.c"
+#line 3054 "camp.tab.cc"
break;
- case 193: /* stm: IF '(' exp ')' stm */
-#line 661 "camp.y"
+ case 196: /* stm: IF '(' exp ')' stm */
+#line 675 "camp.y"
{ (yyval.s) = new ifStm((yyvsp[-4].pos), (yyvsp[-2].e), (yyvsp[0].s)); }
-#line 3036 "camp.tab.c"
+#line 3060 "camp.tab.cc"
break;
- case 194: /* stm: IF '(' exp ')' stm ELSE stm */
-#line 663 "camp.y"
+ case 197: /* stm: IF '(' exp ')' stm ELSE stm */
+#line 677 "camp.y"
{ (yyval.s) = new ifStm((yyvsp[-6].pos), (yyvsp[-4].e), (yyvsp[-2].s), (yyvsp[0].s)); }
-#line 3042 "camp.tab.c"
+#line 3066 "camp.tab.cc"
break;
- case 195: /* stm: WHILE '(' exp ')' stm */
-#line 665 "camp.y"
+ case 198: /* stm: WHILE '(' exp ')' stm */
+#line 679 "camp.y"
{ (yyval.s) = new whileStm((yyvsp[-4].pos), (yyvsp[-2].e), (yyvsp[0].s)); }
-#line 3048 "camp.tab.c"
+#line 3072 "camp.tab.cc"
break;
- case 196: /* stm: DO stm WHILE '(' exp ')' ';' */
-#line 667 "camp.y"
+ case 199: /* stm: DO stm WHILE '(' exp ')' ';' */
+#line 681 "camp.y"
{ (yyval.s) = new doStm((yyvsp[-6].pos), (yyvsp[-5].s), (yyvsp[-2].e)); }
-#line 3054 "camp.tab.c"
+#line 3078 "camp.tab.cc"
break;
- case 197: /* stm: FOR '(' forinit ';' fortest ';' forupdate ')' stm */
-#line 669 "camp.y"
+ case 200: /* stm: FOR '(' forinit ';' fortest ';' forupdate ')' stm */
+#line 683 "camp.y"
{ (yyval.s) = new forStm((yyvsp[-8].pos), (yyvsp[-6].run), (yyvsp[-4].e), (yyvsp[-2].sel), (yyvsp[0].s)); }
-#line 3060 "camp.tab.c"
+#line 3084 "camp.tab.cc"
break;
- case 198: /* stm: FOR '(' type ID ':' exp ')' stm */
-#line 671 "camp.y"
+ case 201: /* stm: FOR '(' type ID ':' exp ')' stm */
+#line 685 "camp.y"
{ (yyval.s) = new extendedForStm((yyvsp[-7].pos), (yyvsp[-5].t), (yyvsp[-4].ps).sym, (yyvsp[-2].e), (yyvsp[0].s)); }
-#line 3066 "camp.tab.c"
+#line 3090 "camp.tab.cc"
break;
- case 199: /* stm: BREAK ';' */
-#line 672 "camp.y"
+ case 202: /* stm: BREAK ';' */
+#line 686 "camp.y"
{ (yyval.s) = new breakStm((yyvsp[-1].pos)); }
-#line 3072 "camp.tab.c"
+#line 3096 "camp.tab.cc"
break;
- case 200: /* stm: CONTINUE ';' */
-#line 673 "camp.y"
+ case 203: /* stm: CONTINUE ';' */
+#line 687 "camp.y"
{ (yyval.s) = new continueStm((yyvsp[-1].pos)); }
-#line 3078 "camp.tab.c"
+#line 3102 "camp.tab.cc"
break;
- case 201: /* stm: RETURN_ ';' */
-#line 674 "camp.y"
+ case 204: /* stm: RETURN_ ';' */
+#line 688 "camp.y"
{ (yyval.s) = new returnStm((yyvsp[-1].pos)); }
-#line 3084 "camp.tab.c"
+#line 3108 "camp.tab.cc"
break;
- case 202: /* stm: RETURN_ exp ';' */
-#line 675 "camp.y"
+ case 205: /* stm: RETURN_ exp ';' */
+#line 689 "camp.y"
{ (yyval.s) = new returnStm((yyvsp[-2].pos), (yyvsp[-1].e)); }
-#line 3090 "camp.tab.c"
+#line 3114 "camp.tab.cc"
break;
- case 203: /* stmexp: exp */
-#line 679 "camp.y"
+ case 206: /* stmexp: exp */
+#line 693 "camp.y"
{ (yyval.s) = new expStm((yyvsp[0].e)->getPos(), (yyvsp[0].e)); }
-#line 3096 "camp.tab.c"
+#line 3120 "camp.tab.cc"
break;
- case 204: /* blockstm: block */
-#line 683 "camp.y"
+ case 207: /* blockstm: block */
+#line 697 "camp.y"
{ (yyval.s) = new blockStm((yyvsp[0].b)->getPos(), (yyvsp[0].b)); }
-#line 3102 "camp.tab.c"
+#line 3126 "camp.tab.cc"
break;
- case 205: /* forinit: %empty */
-#line 687 "camp.y"
+ case 208: /* forinit: %empty */
+#line 701 "camp.y"
{ (yyval.run) = 0; }
-#line 3108 "camp.tab.c"
+#line 3132 "camp.tab.cc"
break;
- case 206: /* forinit: stmexplist */
-#line 688 "camp.y"
+ case 209: /* forinit: stmexplist */
+#line 702 "camp.y"
{ (yyval.run) = (yyvsp[0].sel); }
-#line 3114 "camp.tab.c"
+#line 3138 "camp.tab.cc"
break;
- case 207: /* forinit: barevardec */
-#line 689 "camp.y"
+ case 210: /* forinit: barevardec */
+#line 703 "camp.y"
{ (yyval.run) = (yyvsp[0].vd); }
-#line 3120 "camp.tab.c"
+#line 3144 "camp.tab.cc"
break;
- case 208: /* fortest: %empty */
-#line 693 "camp.y"
+ case 211: /* fortest: %empty */
+#line 707 "camp.y"
{ (yyval.e) = 0; }
-#line 3126 "camp.tab.c"
+#line 3150 "camp.tab.cc"
break;
- case 209: /* fortest: exp */
-#line 694 "camp.y"
+ case 212: /* fortest: exp */
+#line 708 "camp.y"
{ (yyval.e) = (yyvsp[0].e); }
-#line 3132 "camp.tab.c"
+#line 3156 "camp.tab.cc"
break;
- case 210: /* forupdate: %empty */
-#line 698 "camp.y"
+ case 213: /* forupdate: %empty */
+#line 712 "camp.y"
{ (yyval.sel) = 0; }
-#line 3138 "camp.tab.c"
+#line 3162 "camp.tab.cc"
break;
- case 211: /* forupdate: stmexplist */
-#line 699 "camp.y"
+ case 214: /* forupdate: stmexplist */
+#line 713 "camp.y"
{ (yyval.sel) = (yyvsp[0].sel); }
-#line 3144 "camp.tab.c"
+#line 3168 "camp.tab.cc"
break;
- case 212: /* stmexplist: stmexp */
-#line 703 "camp.y"
+ case 215: /* stmexplist: stmexp */
+#line 717 "camp.y"
{ (yyval.sel) = new stmExpList((yyvsp[0].s)->getPos()); (yyval.sel)->add((yyvsp[0].s)); }
-#line 3150 "camp.tab.c"
+#line 3174 "camp.tab.cc"
break;
- case 213: /* stmexplist: stmexplist ',' stmexp */
-#line 705 "camp.y"
+ case 216: /* stmexplist: stmexplist ',' stmexp */
+#line 719 "camp.y"
{ (yyval.sel) = (yyvsp[-2].sel); (yyval.sel)->add((yyvsp[0].s)); }
-#line 3156 "camp.tab.c"
+#line 3180 "camp.tab.cc"
break;
-#line 3160 "camp.tab.c"
+#line 3184 "camp.tab.cc"
default: break;
}
diff --git a/graphics/asymptote/camp.tab.h b/graphics/asymptote/camp.tab.h
index d6b8090e69..2696b0c942 100644
--- a/graphics/asymptote/camp.tab.h
+++ b/graphics/asymptote/camp.tab.h
@@ -91,24 +91,25 @@ extern int yydebug;
QUOTE = 292, /* QUOTE */
STRUCT = 293, /* STRUCT */
TYPEDEF = 294, /* TYPEDEF */
- NEW = 295, /* NEW */
- IF = 296, /* IF */
- ELSE = 297, /* ELSE */
- WHILE = 298, /* WHILE */
- DO = 299, /* DO */
- FOR = 300, /* FOR */
- BREAK = 301, /* BREAK */
- CONTINUE = 302, /* CONTINUE */
- RETURN_ = 303, /* RETURN_ */
- THIS = 304, /* THIS */
- EXPLICIT = 305, /* EXPLICIT */
- GARBAGE = 306, /* GARBAGE */
- LIT = 307, /* LIT */
- STRING = 308, /* STRING */
- PERM = 309, /* PERM */
- MODIFIER = 310, /* MODIFIER */
- UNARY = 311, /* UNARY */
- EXP_IN_PARENS_RULE = 312 /* EXP_IN_PARENS_RULE */
+ USING = 295, /* USING */
+ NEW = 296, /* NEW */
+ IF = 297, /* IF */
+ ELSE = 298, /* ELSE */
+ WHILE = 299, /* WHILE */
+ DO = 300, /* DO */
+ FOR = 301, /* FOR */
+ BREAK = 302, /* BREAK */
+ CONTINUE = 303, /* CONTINUE */
+ RETURN_ = 304, /* RETURN_ */
+ THIS_TOK = 305, /* THIS_TOK */
+ EXPLICIT = 306, /* EXPLICIT */
+ GARBAGE = 307, /* GARBAGE */
+ LIT = 308, /* LIT */
+ STRING = 309, /* STRING */
+ PERM = 310, /* PERM */
+ MODIFIER = 311, /* MODIFIER */
+ UNARY = 312, /* UNARY */
+ EXP_IN_PARENS_RULE = 313 /* EXP_IN_PARENS_RULE */
};
typedef enum yytokentype yytoken_kind_t;
#endif
@@ -166,7 +167,7 @@ union YYSTYPE
absyntax::typeParam *tp;
absyntax::typeParamList *tps;
-#line 170 "camp.tab.h"
+#line 171 "camp.tab.h"
};
typedef union YYSTYPE YYSTYPE;
diff --git a/graphics/asymptote/camp.y b/graphics/asymptote/camp.y
index bfa6734651..b8831bc9fa 100644
--- a/graphics/asymptote/camp.y
+++ b/graphics/asymptote/camp.y
@@ -114,9 +114,9 @@ using mem::string;
%token <pos> LOOSE ASSIGN '?' ':'
DIRTAG JOIN_PREC AND
'{' '}' '(' ')' '.' ',' '[' ']' ';' ELLIPSIS
- ACCESS UNRAVEL IMPORT INCLUDE FROM QUOTE STRUCT TYPEDEF NEW
+ ACCESS UNRAVEL IMPORT INCLUDE FROM QUOTE STRUCT TYPEDEF USING NEW
IF ELSE WHILE DO FOR BREAK CONTINUE RETURN_
- THIS EXPLICIT
+ THIS_TOK EXPLICIT
GARBAGE
%token <e> LIT
%token <stre> STRING
@@ -456,6 +456,20 @@ fundec:
typedec:
STRUCT ID block { $$ = new recorddec($1, $2.sym, $3); }
| TYPEDEF vardec { $$ = new typedec($1, $2); }
+// See definition for decidstart. Following C++, "The syntax of the type-id
+// that names type T is exactly the syntax of a declaration of a variable or
+// function of type T, with the identifier omitted."
+// http://en.cppreference.com/w/cpp/language/type#Type_naming
+| USING ID ASSIGN type ';'
+ { decidstart *dis = new decidstart($2.pos, $2.sym);
+ $$ = new typedec($1, dis, $4); }
+| USING ID ASSIGN type '(' ')' ';'
+ { decidstart *dis = new fundecidstart($2.pos, $2.sym,
+ 0, new formals($5));
+ $$ = new typedec($1, dis, $4); }
+| USING ID ASSIGN type '(' formals ')' ';'
+ { decidstart *dis = new fundecidstart($2.pos, $2.sym, 0, $6);
+ $$ = new typedec($1, dis, $4); }
;
slice:
@@ -487,7 +501,7 @@ value:
{ $$ = $2; }
| '(' name ')' %prec EXP_IN_PARENS_RULE
{ $$ = new nameExp($2->getPos(), $2); }
-| THIS { $$ = new thisExp($1); }
+| THIS_TOK { $$ = new thisExp($1); }
;
argument:
diff --git a/graphics/asymptote/camperror.cc b/graphics/asymptote/camperror.cc
index f124e85d78..945b3ede5e 100644
--- a/graphics/asymptote/camperror.cc
+++ b/graphics/asymptote/camperror.cc
@@ -22,7 +22,7 @@ void reportError(const string& desc)
{
em.runtime(vm::getPos());
em << desc;
- em.sync();
+ em.sync(true);
throw handled_error();
}
@@ -31,14 +31,14 @@ void reportWarning(const string& desc)
{
em.warning(vm::getPos());
em << desc;
- em.sync();
+ em.sync(true);
}
void reportFatal(const string& desc)
{
em.fatal(vm::getPos());
em << desc;
- em.sync();
+ em.sync(true);
em.statusError();
try {
throw quit();
diff --git a/graphics/asymptote/cmake-preset-files/base-presets.json b/graphics/asymptote/cmake-preset-files/base-presets.json
new file mode 100644
index 0000000000..5b3c74b3ef
--- /dev/null
+++ b/graphics/asymptote/cmake-preset-files/base-presets.json
@@ -0,0 +1,130 @@
+{
+ "version": 6,
+ "configurePresets": [
+ {
+ "name": "base",
+ "generator": "Ninja",
+ "architecture": {
+ "strategy": "external",
+ "value": "x64"
+ },
+ "hidden": true
+ },
+ {
+ "name": "base/ensure-cl-compiler",
+ "cacheVariables": {
+ "CMAKE_C_COMPILER": "cl",
+ "CMAKE_CXX_COMPILER": "cl"
+ },
+ "hidden": true
+ },
+ {
+ "name": "base/vcpkg",
+ "toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
+ "hidden": true
+ },
+ {
+ "name": "base/release",
+ "cacheVariables": {
+ "CMAKE_BUILD_TYPE": "Release"
+ },
+ "hidden": true
+ },
+ {
+ "name": "base/debug",
+ "cacheVariables": {
+ "CMAKE_BUILD_TYPE": "Debug"
+ },
+ "hidden": true
+ },
+ {
+ "name": "base/relWithDebInfo",
+ "cacheVariables": {
+ "CMAKE_BUILD_TYPE": "RelWithDebInfo"
+ },
+ "hidden": true
+ },
+ {
+ "name": "base/linuxCcache",
+ "cacheVariables": {
+ "CMAKE_C_COMPILER_LAUNCHER": "ccache",
+ "CMAKE_CXX_COMPILER_LAUNCHER": "ccache"
+ },
+ "hidden": true
+ },
+ {
+ "name": "base/gccCompatCacheVar",
+ "cacheVariables": {
+ "GCCCOMPAT_CXX_COMPILER_FOR_MSVC": "$env{GCCCOMPAT_CXX_COMPILER_FOR_MSVC}"
+ },
+ "hidden": true
+ },
+ {
+ "name": "base/buildBaseWithVcpkg",
+ "inherits": [
+ "base",
+ "base/vcpkg"
+ ],
+ "hidden": true
+ },
+ {
+ "name": "base/windows-only",
+ "hidden": true,
+ "condition": {
+ "type": "equals",
+ "lhs": "${hostSystemName}",
+ "rhs": "Windows"
+ }
+ },
+ {
+ "name": "base/linux-only",
+ "hidden": true,
+ "condition": {
+ "type": "equals",
+ "lhs": "${hostSystemName}",
+ "rhs": "Linux"
+ }
+ },
+ {
+ "name": "base/allow_version_override_from_env",
+ "hidden": true,
+ "cacheVariables": {
+ "ASY_VERSION_OVERRIDE": "$env{ASY_VERSION_OVERRIDE}"
+ }
+ },
+ {
+ "name": "base/ctan",
+ "hidden": true,
+ "cacheVariables": {
+ "CTAN_BUILD": "true"
+ }
+ },
+ {
+ "name": "base/compact-zero-mode",
+ "hidden": true,
+ "cacheVariables": {
+ "ENABLE_COMPACT_ZERO_BUILD": "true"
+ }
+ }
+ ],
+ "buildPresets": [
+ {
+ "name": "build-base/windows-only",
+ "hidden": true,
+ "condition": {
+ "type": "equals",
+ "lhs": "${hostSystemName}",
+ "rhs": "Windows"
+ }
+ },
+ {
+ "name": "build-base/linux-only",
+ "hidden": true,
+ "condition": {
+ "type": "equals",
+ "lhs": "${hostSystemName}",
+ "rhs": "Linux"
+ }
+ }
+ ]
+}
diff --git a/graphics/asymptote/cmake-scripts/asy-base-files.cmake b/graphics/asymptote/cmake-scripts/asy-base-files.cmake
new file mode 100644
index 0000000000..0622c21cb4
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/asy-base-files.cmake
@@ -0,0 +1,78 @@
+set(ASY_STATIC_BASE_FILES
+ animate animation annotate babel bezulate binarytree bsp CAD colormap
+ contour3 contour drawtree embed external feynman flowchart fontsize
+ geometry graph3 graph graph_settings graph_splinetype grid3 interpolate
+ labelpath3 labelpath lmfit map mapArray markers math metapost obj ode palette patterns
+ plain_arcs plain_arrows plain plain_bounds plain_boxes plain_constants plain_debugger
+ plain_filldraw plain_Label plain_margins plain_markers plain_paths plain_pens
+ plain_picture plain_prethree plain_scaling plain_shipout plain_strings pstoedit rational rationalSimplex
+ roundedpath simplex size10 size11 slide slopefield smoothcontour3 solids stats syzygy simplex2
+ texcolors three_arrows three three_light three_margins three_surface three_tube tree
+ trembling tube v3d x11colors
+)
+
+set(ASY_STATIC_SHADER_FILES
+ blend compress count fragment screen sum1 sum2 sum2fast
+ sum3 vertex zero
+)
+
+set(OTHER_STATIC_BASE_FILES nopapersize.ps)
+
+# base dir
+set(ASY_SOURCE_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/base)
+set(ASY_BUILD_BASE_DIR ${CMAKE_CURRENT_BINARY_DIR}/base)
+
+file(MAKE_DIRECTORY ${ASY_BUILD_BASE_DIR})
+
+# version.asy
+configure_file(${ASY_RESOURCE_DIR}/versionTemplate.asy.in ${ASY_BUILD_BASE_DIR}/version.asy)
+list(APPEND ASY_OUTPUT_BASE_FILES ${ASY_BUILD_BASE_DIR}/version.asy)
+
+# copy base files to build dir
+macro (copy_base_file_with_custom_output_name base_file_name output_file_name)
+ add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${ASY_SOURCE_BASE_DIR}/${base_file_name}
+ ${ASY_BUILD_BASE_DIR}/${output_file_name}
+ OUTPUT ${ASY_BUILD_BASE_DIR}/${output_file_name}
+ MAIN_DEPENDENCY ${ASY_SOURCE_BASE_DIR}/${base_file_name}
+ )
+
+ list(APPEND ASY_OUTPUT_BASE_FILES ${ASY_BUILD_BASE_DIR}/${output_file_name})
+endmacro()
+
+macro (copy_base_file base_file_name)
+ copy_base_file_with_custom_output_name(${base_file_name} ${base_file_name})
+endmacro()
+
+foreach(ASY_STATIC_BASE_FILE ${ASY_STATIC_BASE_FILES})
+ copy_base_file(${ASY_STATIC_BASE_FILE}.asy)
+endforeach ()
+
+foreach(OTHER_STATIC_BASE_FILE ${OTHER_STATIC_BASE_FILES})
+ copy_base_file(${OTHER_STATIC_BASE_FILE})
+endforeach ()
+
+file(MAKE_DIRECTORY ${ASY_BUILD_BASE_DIR}/shaders)
+foreach(ASY_STATIC_SHADER_FILE ${ASY_STATIC_SHADER_FILES})
+ copy_base_file(shaders/${ASY_STATIC_SHADER_FILE}.glsl)
+endforeach ()
+
+# generated csv files
+foreach(csv_enum_file ${ASY_CSV_ENUM_FILES})
+ add_custom_command(
+ OUTPUT ${ASY_BUILD_BASE_DIR}/${csv_enum_file}.asy
+ COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/generate_enums.py
+ --language asy
+ --name ${csv_enum_file}
+ --input ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv
+ --output ${ASY_BUILD_BASE_DIR}/${csv_enum_file}.asy
+ MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv
+ )
+
+ list(APPEND ASY_OUTPUT_BASE_FILES ${ASY_BUILD_BASE_DIR}/${csv_enum_file}.asy)
+endforeach ()
+
+# asygl
+file(MAKE_DIRECTORY ${ASY_BUILD_BASE_DIR}/webgl)
+copy_base_file_with_custom_output_name(webgl/asygl-${ASY_GL_VERSION}.js webgl/asygl.js)
diff --git a/graphics/asymptote/cmake-scripts/asy-files.cmake b/graphics/asymptote/cmake-scripts/asy-files.cmake
new file mode 100644
index 0000000000..efd15e46df
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/asy-files.cmake
@@ -0,0 +1,34 @@
+set(ASYMPTOTE_INCLUDES ${ASY_INCLUDE_DIR})
+set(CAMP_BUILD_FILES
+ camperror path drawpath drawlabel picture psfile texfile util settings
+ guide flatguide knot drawfill path3 drawpath3 drawsurface
+ beziercurve bezierpatch pen pipestream
+)
+
+set(RUNTIME_BUILD_FILES
+ runtime runbacktrace runpicture runlabel runhistory runarray
+ runfile runsystem runpair runtriple runpath runpath3d runstring
+ runmath
+)
+
+set(SYMBOL_STATIC_BUILD_FILES types builtin gsl)
+set(SYMBOL_BUILD_FILES ${RUNTIME_BUILD_FILES} ${SYMBOL_STATIC_BUILD_FILES})
+
+set(GENERATED_SOURCE_BUILD_FILES
+ ${SYMBOL_BUILD_FILES} camp.tab lex.yy
+)
+
+set(CORE_BUILD_FILES
+ ${CAMP_BUILD_FILES} ${SYMBOL_STATIC_BUILD_FILES}
+ env genv stm dec errormsg
+ callable name symbol entry exp newexp stack exithandlers
+ access virtualfieldaccess absyn record interact fileio
+ fftw++asy parallel simpson coder coenv impdatum locate asyparser program application
+ varinit fundec refaccess envcompleter asyprocess constructor array memory
+ Delaunay predicates glrender tr shaders jsfile v3dfile
+ EXRFiles GLTextures lspserv symbolmaps win32helpers win32pipestream
+ win32xdr xstream
+ lspdec lspexp lspfundec lspstm
+)
+
+set(ASY_CSV_ENUM_FILES v3dtypes v3dheadertypes)
diff --git a/graphics/asymptote/cmake-scripts/asy-macro.cmake b/graphics/asymptote/cmake-scripts/asy-macro.cmake
new file mode 100644
index 0000000000..59580d1069
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/asy-macro.cmake
@@ -0,0 +1,50 @@
+if (NOT ASY_VERSION_OVERRIDE)
+if (ASY_ADDR_VERSION_SUFFIX_FILE STREQUAL "NOTFOUND")
+ if (CMAKE_BUILD_TYPE IN_LIST cmake_debug_build_types)
+ set(ASY_VERSION_SUFFIX "+debug")
+ endif()
+endif()
+
+set(ASY_VERSION "${ASY_VERSION_BASE}${ASY_VERSION_SUFFIX}")
+else()
+ message(STATUS "Override version specified")
+ set(ASY_VERSION ${ASY_VERSION_OVERRIDE})
+endif()
+
+message(STATUS "Asymptote version: ${ASY_VERSION}")
+
+
+list(APPEND ASY_MACROS
+ PACKAGE_NAME="${ASY_PACKAGE_NAME}"
+ PACKAGE_VERSION="${ASY_VERSION}"
+ PACKAGE_BUGREPORT="${ASY_BUGREPORT}"
+ PACKAGE_STRING="${ASY_PACKAGE_NAME} ${ASY_VERSION}"
+)
+
+# Since we require C++11 and up, some macros are automatically included
+list(APPEND ASY_MACROS
+ HAVE_UNORDERED_MAP
+ HAVE_STRFTIME
+ _USE_MATH_DEFINES
+)
+
+if (DEBUG_GC_ENABLE)
+ list(APPEND ASY_MACROS GC_DEBUG)
+endif()
+
+if (DEBUG_GC_BACKTRACE_ENABLE)
+ list(APPEND ASY_MACROS GC_BACKTRACE)
+endif()
+
+if (CMAKE_BUILD_TYPE IN_LIST cmake_debug_build_types)
+ list(APPEND ASY_MACROS DEBUG)
+endif()
+
+if (CTAN_BUILD)
+ list(APPEND ASY_MACROS CTAN_BUILD)
+endif()
+
+if (ENABLE_COMPACT_ZERO_BUILD)
+ message(STATUS "Setting COMPACT=0. Ensure this is not a production build.")
+ list(APPEND ASY_MACROS COMPACT=0)
+endif()
diff --git a/graphics/asymptote/cmake-scripts/asy-misc-files.cmake b/graphics/asymptote/cmake-scripts/asy-misc-files.cmake
new file mode 100644
index 0000000000..fb6fd8ded6
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/asy-misc-files.cmake
@@ -0,0 +1,35 @@
+# Non-documentation, Non-core files for Asymptote
+# This file is intended for any files that are generated by asy.
+
+# Additionally, ensure this file is included after asy target & base files target has been defined in
+# CMakeLists.txt.
+
+set(ASY_MISC_FILES_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/misc-output)
+file(MAKE_DIRECTORY ${ASY_MISC_FILES_OUT_DIR})
+
+# asy.list
+add_custom_command(
+ OUTPUT ${ASY_MISC_FILES_OUT_DIR}/asy.list
+ COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/generate_asy_list_file.py
+ --asy-executable $<TARGET_FILE:asy>
+ --asy-base-dir=${ASY_BUILD_BASE_DIR}
+ --output-file ${ASY_MISC_FILES_OUT_DIR}/asy.list
+ DEPENDS asy ${ASY_OUTPUT_BASE_FILES} ${ASY_SCRIPTS_DIR}/generate_asy_list_file.py
+)
+
+
+# asy-keywords.el
+add_custom_command(
+ OUTPUT ${ASY_MISC_FILES_OUT_DIR}/asy-keywords.el
+ COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/asy-list.py
+ --asy-list-file ${ASY_MISC_FILES_OUT_DIR}/asy.list
+ --revision ${ASY_VERSION}
+ --output-file ${ASY_MISC_FILES_OUT_DIR}/asy-keywords.el
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS ${ASY_MISC_FILES_OUT_DIR}/asy.list ${CMAKE_CURRENT_SOURCE_DIR}/camp.l ${ASY_SCRIPTS_DIR}/asy-list.py
+)
+
+set(ASY_OUTPUT_DIST_MISC_FILES
+ ${ASY_MISC_FILES_OUT_DIR}/asy-keywords.el
+)
+add_custom_target(asy-dist-misc-files DEPENDS ${ASY_OUTPUT_DIST_MISC_FILES})
diff --git a/graphics/asymptote/cmake-scripts/backport-libs.cmake b/graphics/asymptote/cmake-scripts/backport-libs.cmake
new file mode 100644
index 0000000000..416f9cc3a0
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/backport-libs.cmake
@@ -0,0 +1,11 @@
+add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backports/optional)
+
+list(APPEND ASY_STATIC_LIBARIES OptionalBackport)
+
+if (ENABLE_OPENGL)
+ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backports/glew)
+ # using glew within the repo
+ list(APPEND ASY_STATIC_LIBARIES GLEW)
+
+ list(APPEND ASYMPTOTE_INCLUDES $<TARGET_PROPERTY:GLEW,INCLUDE_DIRECTORIES>)
+endif()
diff --git a/graphics/asymptote/cmake-scripts/basic-parameters.cmake b/graphics/asymptote/cmake-scripts/basic-parameters.cmake
new file mode 100644
index 0000000000..e6e84e9386
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/basic-parameters.cmake
@@ -0,0 +1,7 @@
+set(ASY_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ASY_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ASY_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ASY_SRC_TEMPLATES_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ASY_SCRIPTS_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ASY_DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/doc)
+set(ASY_MISC_CMAKE_SCRIPTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cmake-scripts/scripts)
diff --git a/graphics/asymptote/cmake-scripts/buildfiles-to-src.cmake b/graphics/asymptote/cmake-scripts/buildfiles-to-src.cmake
new file mode 100644
index 0000000000..de9d412292
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/buildfiles-to-src.cmake
@@ -0,0 +1,4 @@
+macro(build_files_to_src in_var out_var)
+ list(TRANSFORM ${in_var} PREPEND ${ASY_SRC_DIR}/ OUTPUT_VARIABLE ${out_var})
+ list(TRANSFORM ${out_var} APPEND .cc)
+endmacro()
diff --git a/graphics/asymptote/cmake-scripts/common.cmake b/graphics/asymptote/cmake-scripts/common.cmake
new file mode 100644
index 0000000000..8316f7182d
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/common.cmake
@@ -0,0 +1,6 @@
+macro(TODO_NOTIMPL message)
+ message(FATAL_ERROR "TODO: ${message}")
+endmacro()
+
+set(cmake_release_build_types Release RelWithDebInfo MinSizeRel)
+set(cmake_debug_build_types Debug)
diff --git a/graphics/asymptote/cmake-scripts/compiler-config.cmake b/graphics/asymptote/cmake-scripts/compiler-config.cmake
new file mode 100644
index 0000000000..852f0a50b5
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/compiler-config.cmake
@@ -0,0 +1,15 @@
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
+
+if (OPTIMIZE_LINK_TIME)
+ include(CheckIPOSupported)
+
+ check_ipo_supported(RESULT ipo_supported_result LANGUAGES C CXX)
+
+ if (ipo_supported_result)
+ set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
+ message(STATUS "Using link-time optimization")
+ else()
+ message(FATAL_ERROR "Compiler does not support link-time optimization")
+ endif()
+endif()
diff --git a/graphics/asymptote/cmake-scripts/docgen.cmake b/graphics/asymptote/cmake-scripts/docgen.cmake
new file mode 100644
index 0000000000..24e4b6454d
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/docgen.cmake
@@ -0,0 +1,328 @@
+if (NOT ENABLE_DOCGEN)
+ message(FATAL_ERROR "Documentation generation is disabled")
+endif()
+
+set(ASY_TEX_BUILD_ROOT ${CMAKE_CURRENT_BINARY_DIR}/docbuild)
+file(MAKE_DIRECTORY ${ASY_TEX_BUILD_ROOT})
+configure_file(${ASY_RESOURCE_DIR}/version.texi.in ${ASY_TEX_BUILD_ROOT}/version.texi)
+
+set(LATEX_ARTIFRACT_EXTENSIONS aux hd idx ins log out toc)
+
+set(PDFLATEX_BASE_ARGUMENTS ${PDFLATEX_COMPILER}
+ -output-directory=${ASY_TEX_BUILD_ROOT}
+)
+
+find_package(LATEX COMPONENTS PDFLATEX REQUIRED)
+list(
+ TRANSFORM LATEX_ARTIFRACT_EXTENSIONS
+ PREPEND ${ASY_TEX_BUILD_ROOT}/asy-latex.
+ OUTPUT_VARIABLE ASY_LATEX_DTX_ARTIFACTS
+)
+
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/asy-latex.pdf ${ASY_TEX_BUILD_ROOT}/asymptote.sty
+ DEPENDS ${ASY_DOC_DIR}/asy-latex.dtx
+ COMMAND ${PDFLATEX_BASE_ARGUMENTS} ${ASY_DOC_DIR}/asy-latex.dtx
+ WORKING_DIRECTORY ${ASY_DOC_DIR}
+ BYPRODUCTS ${ASY_LATEX_DTX_ARTIFACTS}
+)
+
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/latexusage.pdf
+ DEPENDS
+ ${ASY_DOC_DIR}/latexusage.tex
+ ${ASY_TEX_BUILD_ROOT}/asymptote.sty
+ asy ${ASY_OUTPUT_BASE_FILES}
+ COMMAND ${PY3_INTERPRETER} ${ASY_DOC_DIR}/build-latexusage-pdf.py
+ --build-dir=${ASY_TEX_BUILD_ROOT}
+ --latexusage-source-dir=${ASY_DOC_DIR}
+ --pdflatex-executable=${PDFLATEX_COMPILER}
+ --asy-executable=$<TARGET_FILE:asy>
+ --asy-base-dir=${ASY_BUILD_BASE_DIR}
+ WORKING_DIRECTORY ${ASY_DOC_DIR}
+ BYPRODUCTS ${ASY_TEX_BUILD_ROOT}/latexusage.log
+)
+
+set(CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS ${CMAKE_COMMAND} -E copy -t ${ASY_TEX_BUILD_ROOT})
+set(CMAKE_RM_BASE_ARGUMENTS ${CMAKE_COMMAND} -E rm)
+set(ASY_BASE_ARGUMENTS asy -dir ${ASY_BUILD_BASE_DIR} -config '' -render=0 -noprc -noV)
+
+macro(add_additional_pdf_outputs filename_base num_times_to_call_pdflatex compiler)
+ # ARGN can be used to specify additional dependencies
+ foreach (DUMMY_VAR RANGE 1 ${num_times_to_call_pdflatex})
+ list(APPEND COMMAND_ARGS COMMAND ${compiler} ${ASY_DOC_DIR}/${filename_base}.tex)
+ endforeach()
+
+ set(PDFLATEX_OUTPUT_PREFIX ${ASY_TEX_BUILD_ROOT}/${filename_base})
+
+ # there are unfortunately still some issues with out-of-source builds
+ # with pdflatex, hence we have to copy the files to the build root first
+ add_custom_command(
+ OUTPUT ${PDFLATEX_OUTPUT_PREFIX}.tex
+ DEPENDS ${ASY_DOC_DIR}/${filename_base}.tex
+ COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${filename_base}.tex
+ )
+
+ add_custom_command(
+ OUTPUT ${PDFLATEX_OUTPUT_PREFIX}.pdf
+ DEPENDS ${PDFLATEX_OUTPUT_PREFIX}.tex
+ ${ARGN}
+ ${COMMAND_ARGS}
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f ${PDFLATEX_OUTPUT_PREFIX}.dvi
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ BYPRODUCTS
+ ${PDFLATEX_OUTPUT_PREFIX}.aux
+ ${PDFLATEX_OUTPUT_PREFIX}.log
+ ${PDFLATEX_OUTPUT_PREFIX}.toc
+ )
+endmacro()
+
+# asy -> pdf file generation
+
+set(ASY_DOC_PDF_FILES "")
+
+macro(add_asy_pdf_dependency_basic asyfile)
+ set(ASY_DOC_FILE_OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.pdf)
+ # asymptote has some problems (currently as writing this) with asy files involving tex
+ # and output directory not matching, so a workaround is to copy to the doc build root
+ add_custom_command(
+ OUTPUT ${ASY_DOC_FILE_OUTPUT}
+ DEPENDS ${ASY_DOC_DIR}/${asyfile}.asy asy ${ASY_OUTPUT_BASE_FILES}
+ # copy <docroot>/file.asy -> <buildroot>/file.asy
+ COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${asyfile}.asy
+ COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${asyfile}.asy
+ # cleanup <buildroot>/file.asy
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS}
+ ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy
+ # cleanup tex artifacts, if exist
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f
+ ${ASY_TEX_BUILD_ROOT}/${asyfile}_.tex
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ )
+ list(APPEND ASY_DOC_PDF_FILES ${ASY_DOC_FILE_OUTPUT})
+endmacro()
+
+# CAD1 is here because it is needed for CAD.pdf.
+add_asy_pdf_dependency_basic(CAD1)
+
+# additional asymptote file outputs
+add_additional_pdf_outputs(asyRefCard 1 ${PDFTEX_EXEC})
+add_additional_pdf_outputs(TeXShopAndAsymptote 2 ${PDFLATEX_COMPILER})
+add_additional_pdf_outputs(
+ CAD
+ 3
+ ${PDFLATEX_COMPILER}
+ DEPENDS ${ASY_TEX_BUILD_ROOT}/CAD1.pdf
+)
+
+set(
+ BASE_ASYMPTOTE_DOC_AND_TEX_FILES
+ ${ASY_TEX_BUILD_ROOT}/asymptote.sty
+ ${ASY_TEX_BUILD_ROOT}/asy-latex.pdf
+ ${ASY_TEX_BUILD_ROOT}/CAD.pdf
+ ${ASY_TEX_BUILD_ROOT}/TeXShopAndAsymptote.pdf
+ ${ASY_TEX_BUILD_ROOT}/asyRefCard.pdf
+)
+
+add_custom_target(docgen DEPENDS ${BASE_ASYMPTOTE_DOC_AND_TEX_FILES})
+
+
+# the following files are only used with docgen, hence they are not added if
+# ENABLE_ASYMPTOTE_PDF_DOCGEN is not used
+if (ENABLE_ASYMPTOTE_PDF_DOCGEN)
+# asy files
+set(ASY_DOC_FILE_PREFIXES
+ axis3 basealign bezier bigdiagonal binarytreetest Bode brokenaxis
+ colons colors cube cylinderskeleton datagraph diagonal dots
+ eetomumu elliptic errorbars exp fillcontour flow flowchartdemo
+ GaussianSurface generalaxis generalaxis3 graphmarkers graphwithderiv grid3xyz
+ hatch helix HermiteSpline histogram Hobbycontrol Hobbydir icon image imagecontour
+ irregularcontour join join3 knots labelsquare legend lineargraph lineargraph0
+ linetype log2graph loggraph loggrid logimage logticks makepen markers1 markers2 mexicanhat
+ monthaxis multicontour onecontour parametricgraph penfunctionimage penimage planes quartercircle
+ saddle scaledgraph shadedtiling slopefield1 square subpictures superpath tile
+ triangulate unitcircle3 vectorfield
+)
+
+# independent asymptote files that can be generated with any other files
+foreach(ASY_DOC_FILE_PREFIX ${ASY_DOC_FILE_PREFIXES})
+ add_asy_pdf_dependency_basic(${ASY_DOC_FILE_PREFIX})
+endforeach()
+
+macro(add_asy_file_with_extension asy_file extra_ext)
+ set(ASY_DOC_FILE_OUTPUT ${ASY_TEX_BUILD_ROOT}/${asy_file}.pdf)
+ set(ASY_AUX_FILE_NAME ${asy_file}.${extra_ext})
+ # asymptote has some problems (currently as writing this) with asy files involving tex
+ # and output directory not matching, so a workaround is to copy to the doc build root
+ add_custom_command(
+ OUTPUT ${ASY_DOC_FILE_OUTPUT}
+ DEPENDS
+ ${ASY_DOC_DIR}/${asy_file}.asy
+ ${ASY_DOC_DIR}/${ASY_AUX_FILE_NAME}
+ asy ${ASY_OUTPUT_BASE_FILES}
+ COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS}
+ ${ASY_DOC_DIR}/${asy_file}.asy
+ ${ASY_DOC_DIR}/${ASY_AUX_FILE_NAME}
+ COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${ASY_DOC_FILE_PREFIX}.asy
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS}
+ ${ASY_TEX_BUILD_ROOT}/${asy_file}.asy
+ ${ASY_TEX_BUILD_ROOT}/${ASY_AUX_FILE_NAME}
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f
+ ${ASY_TEX_BUILD_ROOT}/${asy_file}_.tex
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ )
+ list(APPEND ASY_DOC_PDF_FILES ${ASY_DOC_FILE_OUTPUT})
+endmacro()
+
+# asy + csv Files
+foreach(ASY_DOC_FILE_PREFIX diatom secondaryaxis westnile)
+ add_asy_file_with_extension(${ASY_DOC_FILE_PREFIX} csv)
+endforeach()
+
+# asy + dat files
+foreach(ASY_DOC_FILE_PREFIX filegraph leastsquares)
+ add_asy_file_with_extension(${ASY_DOC_FILE_PREFIX} dat)
+endforeach()
+
+
+# handle CDlabel and logo separately
+macro(copy_doc_asy_file_to_docbuild_root asyfile)
+ add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy
+ COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS}
+ ${ASY_DOC_DIR}/${asyfile}.asy
+ DEPENDS ${ASY_DOC_DIR}/${asyfile}.asy
+ )
+endmacro()
+
+function(add_asy_file_with_asy_dependency asyfile) # <asydep1> [asydep2] ...
+ list(
+ TRANSFORM ARGN
+ PREPEND ${ASY_TEX_BUILD_ROOT}/
+ OUTPUT_VARIABLE ASY_REQUIRED_DEPS
+ )
+ list(
+ TRANSFORM ASY_REQUIRED_DEPS
+ APPEND .asy
+ )
+
+ add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.pdf
+ DEPENDS ${ASY_DOC_DIR}/${asyfile}.asy asy ${ASY_OUTPUT_BASE_FILES} ${ASY_REQUIRED_DEPS}
+ # copy <docroot>/file.asy -> <buildroot>/file.asy
+ COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${asyfile}.asy
+ COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${asyfile}.asy
+ # cleanup <buildroot>/file.asy
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS} ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy
+ # cleanup tex artifacts, if exist
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f ${ASY_TEX_BUILD_ROOT}/${asyfile}_.tex
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ )
+endfunction()
+
+macro(add_asy_file_from_docbuild_root asyfile)
+ # does not copy from doc root to docbuild root; have to do manually
+ add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.pdf
+ COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${asyfile}.asy
+ DEPENDS ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy
+ BYPRODUCTS ${ASY_TEX_BUILD_ROOT}/${asyfile}_.tex ${ASY_TEX_BUILD_ROOT}/${asyfile}_.eps
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ )
+endmacro()
+
+# CDlabel + logo
+copy_doc_asy_file_to_docbuild_root(logo)
+add_asy_file_from_docbuild_root(logo)
+add_asy_file_with_asy_dependency(CDlabel logo)
+
+# bezier2 & beziercurve
+copy_doc_asy_file_to_docbuild_root(beziercurve)
+add_asy_file_from_docbuild_root(beziercurve)
+add_asy_file_with_asy_dependency(bezier2 beziercurve)
+
+list(APPEND ASY_DOC_PDF_FILES
+ ${ASY_TEX_BUILD_ROOT}/logo.pdf
+ ${ASY_TEX_BUILD_ROOT}/CDlabel.pdf
+ ${ASY_TEX_BUILD_ROOT}/beziercurve.pdf
+ ${ASY_TEX_BUILD_ROOT}/bezier2.pdf
+)
+
+# options file
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/options
+ DEPENDS asy ${ASY_DOC_DIR}/gen-asy-options-file.py
+ COMMAND ${PY3_INTERPRETER} ${ASY_DOC_DIR}/gen-asy-options-file.py
+ --asy-executable=$<TARGET_FILE:asy>
+ --output-file=${ASY_TEX_BUILD_ROOT}/options
+)
+
+# asymptote.pdf
+
+set(TEXI_ARTIFACT_EXTENSIONS log tmp cp toc cps aux)
+list(
+ TRANSFORM TEXI_ARTIFACT_EXTENSIONS
+ PREPEND ${ASY_TEX_BUILD_ROOT}/asymptote.
+ OUTPUT_VARIABLE ASYMPTOTE_PDF_EXTRA_ARTIFACTS
+ )
+
+if (WIN32)
+if (WIN32_TEXINDEX STREQUAL WSL)
+ set(TEXINDEX_WRAPPER ${CMAKE_CURRENT_SOURCE_DIR}/windows/texindex-wsl.cmd)
+else()
+ set(TEXINDEX_WRAPPER ${WIN32_TEXINDEX})
+endif()
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/asymptote.pdf
+ DEPENDS
+ ${ASY_TEX_BUILD_ROOT}/options
+ ${ASY_TEX_BUILD_ROOT}/latexusage.pdf
+ ${ASY_DOC_DIR}/asymptote.texi
+ ${ASY_DOC_PDF_FILES}
+ COMMAND ${PY3_INTERPRETER}
+ ${ASY_DOC_DIR}/build-asymptote-pdf-win.py
+ --texify-loc=${TEXIFY}
+ --texindex-loc=${TEXINDEX_WRAPPER}
+ --texi-file=${ASY_DOC_DIR}/asymptote.texi
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ BYPRODUCTS ${ASYMPTOTE_PDF_EXTRA_ARTIFACTS}
+)
+else()
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/asymptote.pdf
+ DEPENDS
+ ${ASY_TEX_BUILD_ROOT}/options
+ ${ASY_TEX_BUILD_ROOT}/latexusage.pdf
+ ${ASY_DOC_DIR}/asymptote.texi
+ ${ASY_DOC_PDF_FILES}
+ COMMAND ${TEXI2DVI} --pdf ${ASY_DOC_DIR}/asymptote.texi
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ BYPRODUCTS ${ASYMPTOTE_PDF_EXTRA_ARTIFACTS}
+)
+endif()
+add_custom_target(asymptote_pdf_file DEPENDS ${ASY_TEX_BUILD_ROOT}/asymptote.pdf)
+add_dependencies(docgen asymptote_pdf_file)
+
+# manual page
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/asy.1
+ DEPENDS
+ ${ASY_DOC_DIR}/asy.1.begin
+ ${ASY_DOC_DIR}/asy.1.end
+ ${ASY_TEX_BUILD_ROOT}/options
+ ${ASY_DOC_DIR}/build-asy-1-file.py
+ COMMAND ${PY3_INTERPRETER} ${ASY_DOC_DIR}/build-asy-1-file.py
+ --options-file=${ASY_TEX_BUILD_ROOT}/options
+ --asy-1-begin-file=${ASY_DOC_DIR}/asy.1.begin
+ --asy-1-end-file=${ASY_DOC_DIR}/asy.1.end
+ --out-file=${ASY_TEX_BUILD_ROOT}/asy.1
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+)
+
+ add_custom_target(manpage DEPENDS ${ASY_TEX_BUILD_ROOT}/asy.1)
+
+if (UNIX)
+ add_dependencies(docgen manpage)
+endif()
+
+endif() # ENABLE_ASYMPTOTE_PDF_DOCGEN
diff --git a/graphics/asymptote/cmake-scripts/external-libs.cmake b/graphics/asymptote/cmake-scripts/external-libs.cmake
new file mode 100644
index 0000000000..4d64b58fa4
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/external-libs.cmake
@@ -0,0 +1,268 @@
+include(FindPkgConfig)
+include(FetchContent)
+
+# zlib
+find_package(ZLIB REQUIRED)
+list(APPEND ASY_STATIC_LIBARIES ZLIB::ZLIB)
+
+# flex + bison
+if (UNIX)
+ include(FindFLEX)
+ include(FindBISON)
+
+ if (NOT FLEX_FOUND)
+ message(FATAL_ERROR "FLEX is required for building")
+ endif()
+
+ if (NOT BISON_FOUND)
+ message(FATAL_ERROR "Bison is required for building")
+ endif()
+elseif(WIN32)
+ if ((NOT WIN32_FLEX_BINARY) OR (NOT WIN32_BISON_BINARY))
+ # downlod winflexbison
+ message(STATUS "Flex or bison not given; downloading winflexbison.")
+
+
+ FetchContent_Declare(
+ winflexbison
+ URL https://github.com/lexxmark/winflexbison/releases/download/v2.5.25/win_flex_bison-2.5.25.zip
+ URL_HASH SHA256=8D324B62BE33604B2C45AD1DD34AB93D722534448F55A16CA7292DE32B6AC135
+ )
+ FetchContent_MakeAvailable(winflexbison)
+ message(STATUS "Downloaded winflexbison")
+
+ if (NOT WIN32_FLEX_BINARY)
+ set(FLEX_EXECUTABLE ${winflexbison_SOURCE_DIR}/win_flex.exe)
+ endif()
+
+ if (NOT WIN32_BISON_BINARY)
+ set(BISON_EXECUTABLE ${winflexbison_SOURCE_DIR}/win_bison.exe)
+ endif()
+ else()
+ set(FLEX_EXECUTABLE ${WIN32_FLEX_BINARY})
+ set(BISON_EXECUTABLE ${WIN32_BISON_BINARY})
+ endif()
+endif()
+
+# getopt (win32 only)
+
+if (WIN32)
+ find_package(unofficial-getopt-win32 REQUIRED)
+ list(APPEND ASY_STATIC_LIBARIES unofficial::getopt-win32::getopt)
+endif()
+
+# glm; mandatory for all builds
+find_package(glm CONFIG)
+if (glm_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES glm::glm)
+ list(APPEND ASY_MACROS HAVE_LIBGLM)
+else()
+ message(FATAL_ERROR "glm not found; will not use glm")
+endif()
+
+if (ENABLE_READLINE)
+# curses
+ if (UNIX)
+ # we know ncurses work on unix systems, however
+ # not always supported on windows (esp. msvc)
+ set(CURSES_NEED_NCURSES TRUE)
+
+ find_package(Curses)
+ if (Curses_FOUND)
+ list(APPEND ASYMPTOTE_INCLUDES ${CURSES_INCLUDE_DIRS})
+ list(APPEND ASY_COMPILE_OPTS ${CURSES_CFLAGS})
+ list(APPEND ASY_STATIC_LIBRARIES ${CURSES_LIBRARIES})
+
+ list(APPEND ASY_MACROS HAVE_NCURSES_CURSES_H HAVE_LIBCURSES)
+ else()
+ message(FATAL_ERROR "curses not found; will compile without curses")
+ endif()
+
+ pkg_check_modules(readline IMPORTED_TARGET readline)
+
+ if (readline_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES PkgConfig::readline)
+ list(APPEND ASY_MACROS HAVE_LIBREADLINE)
+ else ()
+ message(FATAL_ERROR "readline not found; will compile without libreadline")
+ endif()
+ elseif(WIN32)
+ find_package(unofficial-pdcurses CONFIG)
+ if (unofficial-pdcurses_FOUND)
+ list(APPEND ASY_STATIC_LIBRARIES unofficial::pdcurses::pdcurses)
+ list(APPEND ASY_MACROS HAVE_CURSES_H HAVE_LIBCURSES)
+ else()
+ message(FATAL_ERROR "curses not found; will compile without curses")
+ endif()
+
+ find_package(unofficial-readline-win32 CONFIG)
+ if (unofficial-readline-win32_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES unofficial::readline-win32::readline)
+ list(APPEND ASY_MACROS HAVE_LIBREADLINE)
+ else ()
+ message(FATAL_ERROR "readline not found; will compile without libreadline")
+ endif()
+ else()
+ message(FATAL_ERROR "Only supported on Unix or Win32 systems")
+ endif()
+else()
+ message(STATUS "libreadline disabled; will not use libreadline")
+endif()
+
+# libcurl
+if (ENABLE_CURL)
+ find_package(CURL)
+ if (CURL_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES CURL::libcurl)
+ list(APPEND ASY_MACROS HAVE_LIBCURL)
+ else()
+ message(FATAL_ERROR "curl not found")
+ endif()
+else()
+ message(STATUS "Disabling curl support")
+endif()
+
+# pthreads
+if (ENABLE_THREADING)
+ if (UNIX)
+ set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
+ set(THREADS_PREFER_PTHREAD_FLAG TRUE)
+ include(FindThreads)
+
+ if(CMAKE_USE_PTHREADS_INIT)
+ list(APPEND ASY_STATIC_LIBARIES Threads::Threads)
+ list(APPEND ASY_MACROS HAVE_PTHREAD=1)
+ else()
+ message(FATAL_ERROR "No thread library specified")
+ endif()
+ elseif(WIN32)
+ find_package(PThreads4W)
+
+ if(PThreads4W_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES PThreads4W::PThreads4W)
+ list(APPEND ASY_MACROS HAVE_PTHREAD=1)
+ else()
+ message(FATAL_ERROR "No thread library specified")
+ endif()
+ else()
+ message(FATAL_ERROR "Only supported on Unix or Win32 systems")
+ endif()
+else()
+ message(STATUS "Disabling threading support")
+endif()
+
+# gsl
+if (ENABLE_GSL)
+ find_package(GSL)
+ if (GSL_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES GSL::gsl)
+ list(APPEND ASY_MACROS HAVE_LIBGSL)
+ else()
+ message(FATAL_ERROR "GSL not found")
+ endif()
+else()
+ message(STATUS "Disabling gsl support")
+endif()
+
+
+# eigen
+if (ENABLE_EIGEN3)
+find_package(Eigen3 CONFIG)
+ if (Eigen3_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES Eigen3::Eigen)
+ list(APPEND ASY_MACROS HAVE_EIGEN_DENSE)
+ else()
+ message(FATAL_ERROR "eigen3 not found")
+ endif()
+else()
+ message(STATUS "Disabling eigen3 support")
+endif()
+
+# OpenGL stuff
+if (ENABLE_OPENGL)
+ # fatal error here, since OpenGL is optional
+ find_package(OpenGL REQUIRED)
+ if (OPENGL_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES OpenGL::GL)
+ else()
+ message(WARNING "gl libraries not found")
+ endif()
+
+ if (OPENGL_GLU_FOUND)
+ list(APPEND ASY_MACROS HAVE_LIBGL)
+ else()
+ message(FATAL_ERROR "GL components incomplete; will not use OpenGL")
+ endif()
+
+ find_package(FreeGLUT CONFIG)
+ if (FreeGLUT_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES
+ $<IF:$<TARGET_EXISTS:FreeGLUT::freeglut>,FreeGLUT::freeglut,FreeGLUT::freeglut_static>)
+ list(APPEND ASY_MACROS FREEGLUT HAVE_LIBGLUT)
+ else()
+ message(FATAL_ERROR "freeglut not found; will not use freeglut")
+ endif()
+
+ if (ENABLE_GL_COMPUTE_SHADERS)
+ list(APPEND ASY_MACROS HAVE_COMPUTE_SHADER)
+ else()
+ message(WARNING "Compute shader disabled")
+ endif()
+
+ if (ENABLE_GL_SSBO)
+ list(APPEND ASY_MACROS HAVE_SSBO)
+ else()
+ message(WARNING "SSBO disabled")
+ endif()
+else()
+ message(STATUS "Disabling opengl support")
+endif()
+
+
+if (ENABLE_RPC_FEATURES)
+ if(UNIX)
+ pkg_check_modules(TIRPC REQUIRED IMPORTED_TARGET libtirpc)
+ list(APPEND ASY_STATIC_LIBARIES PkgConfig::TIRPC)
+ endif()
+
+ if (WIN32)
+ # win32 does not have native open_memstream support
+ set(OLD_BUILD_TESTING ${BUILD_TESTING})
+ set(BUILD_TESTING OFF CACHE INTERNAL "build testing")
+ FetchContent_Declare(
+ fmem
+ GIT_REPOSITORY https://github.com/Kreijstal/fmem.git
+ GIT_TAG 5f79fef3606be5dac54d62c7d0e2123363afabd7
+ )
+ FetchContent_MakeAvailable(fmem)
+ set(BUILD_TESTING ${OLD_BUILD_TESTING} CACHE INTERNAL "build testing")
+
+ list(APPEND ASY_STATIC_LIBARIES fmem)
+ list(APPEND ASYMPTOTE_INCLUDES $<TARGET_PROPERTY:fmem,INCLUDE_DIRECTORIES>)
+ endif()
+ list(APPEND ASY_MACROS HAVE_LIBTIRPC)
+
+
+else()
+ message(STATUS "Disabling rpc and xdr/v3d support")
+endif()
+
+# fftw3
+
+if (ENABLE_FFTW3)
+ set(FFTW3_USABLE TRUE)
+ find_package(FFTW3 CONFIG)
+ if (NOT FFTW3_FOUND)
+ message(WARNING "libfftw3 not found; will not use fftw3")
+ set(FFTW3_USABLE FALSE)
+ endif()
+
+ if (FFTW3_USABLE)
+ list(APPEND ASY_STATIC_LIBARIES FFTW3::fftw3)
+ list(APPEND ASY_MACROS HAVE_LIBFFTW3 FFTWPP_SINGLE_THREAD)
+ else()
+ message(FATAL_ERROR "environment lacks needed fftw3 features")
+ endif()
+else()
+ message(STATUS "Disabling fftw3 support")
+endif()
diff --git a/graphics/asymptote/cmake-scripts/generated-files.cmake b/graphics/asymptote/cmake-scripts/generated-files.cmake
new file mode 100644
index 0000000000..64dec32e54
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/generated-files.cmake
@@ -0,0 +1,224 @@
+# generated include directories
+set(GENERATED_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/include")
+file(MAKE_DIRECTORY ${GENERATED_INCLUDE_DIR})
+
+# directory for auxilliary files
+set(GENERATED_AUX_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/auxiliary")
+file(MAKE_DIRECTORY ${GENERATED_AUX_DIR})
+
+# generated sources
+set(GENERATED_SRC_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/src")
+file(MAKE_DIRECTORY ${GENERATED_SRC_DIR})
+
+
+# opsymbols.h
+add_custom_command(
+ OUTPUT ${GENERATED_INCLUDE_DIR}/opsymbols.h
+ COMMAND ${PY3_INTERPRETER}
+ ${ASY_SCRIPTS_DIR}/opsymbols.py
+ --campfile ${ASY_RESOURCE_DIR}/camp.l
+ --output ${GENERATED_INCLUDE_DIR}/opsymbols.h
+ MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/camp.l
+ DEPENDS ${ASY_SCRIPTS_DIR}/opsymbols.py
+)
+
+list(APPEND ASYMPTOTE_INCLUDES ${GENERATED_INCLUDE_DIR})
+list(APPEND ASYMPTOTE_GENERATED_HEADERS ${GENERATED_INCLUDE_DIR}/opsymbols.h)
+list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${GENERATED_INCLUDE_DIR}/opsymbols.h)
+
+# run-* files
+function(_int_add_runtime_file runtime_file)
+ set(RUNTIME_FILE_IN_BASE ${ASY_SRC_TEMPLATES_DIR}/${runtime_file})
+ set(RUNTIME_FILES_OUT ${GENERATED_SRC_DIR}/${runtime_file}.cc ${GENERATED_INCLUDE_DIR}/${runtime_file}.h)
+ set(RUNTIME_SCRIPT ${ASY_SCRIPTS_DIR}/runtime.pl)
+ set(OPSYM_FILE ${GENERATED_INCLUDE_DIR}/opsymbols.h)
+ set(RUNTIME_BASE_FILE ${ASY_SRC_TEMPLATES_DIR}/runtimebase.in)
+ add_custom_command(
+ OUTPUT ${RUNTIME_FILES_OUT}
+ COMMAND ${PERL_INTERPRETER} ${RUNTIME_SCRIPT}
+ --opsym-file ${OPSYM_FILE}
+ --runtime-base-file ${RUNTIME_BASE_FILE}
+ --src-template-dir ${ASY_SRC_TEMPLATES_DIR}
+ --prefix ${runtime_file}
+ --header-out-dir ${GENERATED_INCLUDE_DIR}
+ --src-out-dir ${GENERATED_SRC_DIR}
+ MAIN_DEPENDENCY ${RUNTIME_FILE_IN_BASE}.in
+ DEPENDS ${RUNTIME_SCRIPT} ${OPSYM_FILE} ${RUNTIME_BASE_FILE} ${RUNTIME_FILE_DEP}
+ )
+endfunction()
+
+macro(add_runtime_file runtime_file)
+ _int_add_runtime_file(${runtime_file})
+ list(APPEND ASY_GENERATED_BUILD_SOURCES
+ ${GENERATED_SRC_DIR}/${runtime_file}.cc
+ )
+ set(_ASY_GENERATED_HEADER_NAME ${GENERATED_INCLUDE_DIR}/${runtime_file}.h)
+ list(APPEND ASYMPTOTE_GENERATED_HEADERS ${_ASY_GENERATED_HEADER_NAME})
+ list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${_ASY_GENERATED_HEADER_NAME})
+endmacro()
+
+foreach(RUNTIME_FILE ${RUNTIME_BUILD_FILES})
+ add_runtime_file(${RUNTIME_FILE})
+endforeach()
+
+# keywords.h
+set(KEYWORDS_HEADER_OUT ${GENERATED_INCLUDE_DIR}/keywords.h)
+add_custom_command(
+ OUTPUT ${KEYWORDS_HEADER_OUT}
+ COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/keywords.py
+ --camplfile ${ASY_RESOURCE_DIR}/camp.l
+ --output ${GENERATED_INCLUDE_DIR}/keywords.h
+ --process-file ${ASY_SRC_DIR}/asyprocess.cc
+ MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/camp.l
+ DEPENDS ${ASY_SCRIPTS_DIR}/keywords.py ${ASY_SRC_DIR}/asyprocess.cc
+)
+
+list(APPEND ASYMPTOTE_GENERATED_HEADERS ${KEYWORDS_HEADER_OUT})
+list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${KEYWORDS_HEADER_OUT})
+
+set(camp_lex_output ${GENERATED_SRC_DIR}/lex.yy.cc)
+set(camp_l_file ${ASY_RESOURCE_DIR}/camp.l)
+
+if (WIN32)
+ list(APPEND FLEX_ARGS --wincompat)
+endif()
+
+# flex + bison
+
+# flex
+add_custom_command(
+ OUTPUT ${camp_lex_output}
+ COMMAND ${FLEX_EXECUTABLE} ${FLEX_ARGS} -o ${camp_lex_output} ${camp_l_file}
+ MAIN_DEPENDENCY ${camp_l_file}
+)
+
+list(APPEND ASY_GENERATED_BUILD_SOURCES ${camp_lex_output})
+
+# bison
+set(bison_output ${GENERATED_SRC_DIR}/camp.tab.cc)
+set(bison_header ${GENERATED_INCLUDE_DIR}/camp.tab.h)
+set(bison_input ${ASY_RESOURCE_DIR}/camp.y)
+add_custom_command(
+ OUTPUT ${bison_output} ${bison_header}
+ COMMAND ${BISON_EXECUTABLE} -t --header=${bison_header} -o ${bison_output} ${bison_input}
+ MAIN_DEPENDENCY ${bison_input}
+)
+
+list(APPEND ASY_GENERATED_BUILD_SOURCES ${bison_output})
+list(APPEND ASYMPTOTE_GENERATED_HEADERS ${bison_header})
+list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${bison_header})
+
+# generate enums from csv
+foreach(csv_enum_file ${ASY_CSV_ENUM_FILES})
+ set(generated_header_file ${GENERATED_INCLUDE_DIR}/${csv_enum_file}.h)
+
+ add_custom_command(
+ OUTPUT ${generated_header_file}
+ COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/generate_enums.py
+ --language cpp
+ --name ${csv_enum_file}
+ --input ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv
+ --output ${generated_header_file}
+ --xopt namespace=camp
+ MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv
+ DEPENDS ${ASY_SCRIPTS_DIR}/generate_enums.py
+ )
+
+ list(APPEND ASYMPTOTE_GENERATED_HEADERS ${generated_header_file})
+ list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${generated_header_file})
+endforeach ()
+
+# raw.i files
+# generating preprocessed files
+set(FINDSYM_FILE ${ASY_SCRIPTS_DIR}/findsym.py)
+# combine all files into allsymbols.h
+function(symfile_preprocess src_dir symfile symfile_raw_output_varname header_output_varname)
+ set(symfile_raw_output_var ${symfile_raw_output_varname})
+ set(processed_output_file ${GENERATED_AUX_DIR}/${symfile}.raw.i)
+ set(${symfile_raw_output_var} ${processed_output_file} PARENT_SCOPE)
+
+ set(cxx_preprocessor ${CMAKE_CXX_COMPILER})
+
+ if (MSVC)
+ if (GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
+ set(cxx_preprocessor ${GCCCOMPAT_CXX_COMPILER_FOR_MSVC})
+ else()
+ set(msvc_flag --msvc)
+ endif()
+ endif()
+
+ set(asy_includes_list "$<TARGET_PROPERTY:asy,INCLUDE_DIRECTORIES>")
+ set(asy_macros_list "$<TARGET_PROPERTY:asy,COMPILE_DEFINITIONS>")
+ set(asy_cxx_std "$<TARGET_PROPERTY:asy,CXX_STANDARD>")
+
+ if (UNIX)
+ # for unix systems, need verbatim flag because
+ # the arguments contains semicolon, though somehow
+ # verbatim option causes problems for windows
+ set(ADDITIONAL_ADD_CUSTOM_CMD_ARGS VERBATIM)
+ endif()
+
+ add_custom_command(
+ OUTPUT ${processed_output_file}
+ COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/gen_preprocessed_depfile.py
+ --cxx-compiler=${cxx_preprocessor}
+ "$<$<BOOL:${asy_includes_list}>:--include-dirs=$<REMOVE_DUPLICATES:${asy_includes_list}>>"
+ "$<$<BOOL:${asy_cxx_std}>:--cxx-standard=${asy_cxx_std}>"
+ "$<$<BOOL:${asy_macros_list}>:--macro-defs=$<REMOVE_DUPLICATES:${asy_macros_list}>>"
+ --out-dep-file=${GENERATED_AUX_DIR}/${symfile}.d
+ --out-i-file=${processed_output_file}
+ --in-src-file=${src_dir}/${symfile}.cc
+ ${msvc_flag}
+ DEPFILE ${GENERATED_AUX_DIR}/${symfile}.d
+ BYPRODUCTS ${GENERATED_AUX_DIR}/${symfile}.d
+ DEPENDS ${src_dir}/${symfile}.cc
+ ${ASY_SCRIPTS_DIR}/gen_preprocessed_depfile.py
+ ${ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS}
+ ${ADDITIONAL_ADD_CUSTOM_CMD_ARGS}
+ )
+ # *.symbols.h file
+ set(symfile_raw_output_var ${header_output_varname})
+ set(sym_header_file ${GENERATED_INCLUDE_DIR}/${symfile}.symbols.h)
+ set(${symfile_raw_output_var} ${sym_header_file} PARENT_SCOPE)
+ add_custom_command(
+ OUTPUT ${sym_header_file}
+ COMMAND ${PY3_INTERPRETER} ${FINDSYM_FILE}
+ ${sym_header_file}
+ ${processed_output_file}
+ MAIN_DEPENDENCY ${processed_output_file}
+ )
+endfunction()
+
+# preprocess each individual symbol files
+foreach(SYM_FILE ${SYMBOL_STATIC_BUILD_FILES})
+ symfile_preprocess(${ASY_SRC_DIR} ${SYM_FILE} SYMFILE_OUT HEADER_OUT)
+ list(APPEND SYMFILE_OUT_LIST ${SYMFILE_OUT})
+ list(APPEND ASYMPTOTE_GENERATED_HEADERS ${HEADER_OUT})
+endforeach()
+
+foreach(SYM_FILE ${RUNTIME_BUILD_FILES})
+ symfile_preprocess(${GENERATED_SRC_DIR} ${SYM_FILE} SYMFILE_OUT HEADER_OUT)
+ list(APPEND SYMFILE_OUT_LIST ${SYMFILE_OUT})
+ list(APPEND ASYMPTOTE_GENERATED_HEADERS ${HEADER_OUT})
+endforeach ()
+
+# allsymbols.h
+add_custom_command(
+ OUTPUT ${GENERATED_INCLUDE_DIR}/allsymbols.h
+ COMMAND ${PY3_INTERPRETER} ${FINDSYM_FILE}
+ ${GENERATED_INCLUDE_DIR}/allsymbols.h
+ ${SYMFILE_OUT_LIST}
+ DEPENDS ${FINDSYM_FILE} ${SYMFILE_OUT_LIST}
+)
+
+list(APPEND ASYMPTOTE_GENERATED_HEADERS ${GENERATED_INCLUDE_DIR}/allsymbols.h)
+
+# macro files
+message(STATUS "Generating revision.cc file")
+set(revision_cc_file ${GENERATED_SRC_DIR}/revision.cc)
+configure_file(${ASY_RESOURCE_DIR}/template_rev.cc.in ${revision_cc_file})
+list(APPEND ASY_GENERATED_BUILD_SOURCES ${revision_cc_file})
+
+add_custom_target(asy_gen_headers
+ DEPENDS ${ASYMPTOTE_GENERATED_HEADERS}
+)
diff --git a/graphics/asymptote/cmake-scripts/gnu-install-macros.cmake b/graphics/asymptote/cmake-scripts/gnu-install-macros.cmake
new file mode 100644
index 0000000000..af678bc682
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/gnu-install-macros.cmake
@@ -0,0 +1,18 @@
+# Only run on unix-like systems, windows does not use gnu docpath/syspath locations
+
+if (UNIX)
+ include(GNUInstallDirs)
+
+if (CTAN_BUILD)
+ set(ASYMPTOTE_SYSDIR_VALUE "")
+else()
+ set(ASYMPTOTE_SYSDIR_VALUE ${CMAKE_INSTALL_FULL_DATADIR}/asymptote)
+endif()
+
+ set(ASYMPTOTE_DOCDIR_VALUE ${CMAKE_INSTALL_FULL_DATADIR}/doc/asymptote)
+
+ list(APPEND ASY_MACROS
+ ASYMPTOTE_SYSDIR="${ASYMPTOTE_SYSDIR_VALUE}"
+ ASYMPTOTE_DOCDIR="${ASYMPTOTE_DOCDIR_VALUE}"
+ )
+endif()
diff --git a/graphics/asymptote/cmake-scripts/linux-install.cmake b/graphics/asymptote/cmake-scripts/linux-install.cmake
new file mode 100644
index 0000000000..70a8a22577
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/linux-install.cmake
@@ -0,0 +1,142 @@
+if (NOT LINUX)
+ if (UNIX)
+ message(WARNING "This file has not been tested on non-linux unix systems. It may not work!")
+ # TODO: Do more testing on non-linux UNIX systems.
+ else()
+ message(FATAL_ERROR "This file is only for use with unix systems")
+ endif()
+endif()
+
+if (CTAN_BUILD)
+ message(FATAL_ERROR "system install is not supported for CTAN builds.")
+endif()
+
+# Requires gnu-install-macros to be ran already
+
+
+set(PERMISSION_755_LIST
+ OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ GROUP_READ GROUP_EXECUTE
+ WORLD_READ WORLD_EXECUTE
+)
+
+set(PERMISSION_644_LIST
+ OWNER_READ OWNER_WRITE
+ GROUP_READ
+ WORLD_READ
+)
+
+set(ASY_BASE_EXTRA_FILES_NAME
+ asy-mode.el asy-init.el asy.vim
+ asy_filetype.vim asy-kate.sh asymptote.py
+ reload.js nopapersize.ps)
+
+list(
+ TRANSFORM ASY_BASE_EXTRA_FILES_NAME
+ PREPEND ${ASY_SOURCE_BASE_DIR}/
+ OUTPUT_VARIABLE ASY_BASE_EXTRA_FILES
+)
+
+
+set(ASY_INSTALL_SYSDIR_VALUE ${CMAKE_INSTALL_DATADIR}/asymptote)
+set(ASY_BASE_INSTALL_COMPONENT asy)
+# installing files
+
+#region base files
+install(
+ TARGETS asy
+ PERMISSIONS ${PERMISSION_755_LIST}
+ COMPONENT ${ASY_BASE_INSTALL_COMPONENT}
+ DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
+
+# base/* -> <sysdir>/
+install(
+ DIRECTORY ${ASY_BUILD_BASE_DIR}/
+ DESTINATION ${ASY_INSTALL_SYSDIR_VALUE}
+ COMPONENT ${ASY_BASE_INSTALL_COMPONENT}
+ FILE_PERMISSIONS ${PERMISSION_644_LIST}
+)
+
+# extra base files -> <sysdir>/
+install(
+ FILES ${ASY_MISC_FILES_OUT_DIR}/asy-keywords.el ${ASY_BASE_EXTRA_FILES}
+ DESTINATION ${ASY_INSTALL_SYSDIR_VALUE}
+ COMPONENT ${ASY_BASE_INSTALL_COMPONENT}
+ PERMISSIONS ${PERMISSION_644_LIST}
+)
+#endregion
+
+#region example files
+set(ASYMPTOTE_EXAMPLESDIR_VALUE ${ASY_INSTALL_SYSDIR_VALUE}/examples)
+
+# example files
+install(
+ DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/examples/
+ DESTINATION ${ASYMPTOTE_EXAMPLESDIR_VALUE}
+ COMPONENT ${ASY_BASE_INSTALL_COMPONENT}
+ FILE_PERMISSIONS ${PERMISSION_644_LIST}
+)
+
+# extra examples from docs -> examples
+install(
+ DIRECTORY ${ASY_DOC_DIR}/extra/
+ DESTINATION ${ASYMPTOTE_EXAMPLESDIR_VALUE}
+ COMPONENT ${ASY_BASE_INSTALL_COMPONENT}
+ FILES_MATCHING PATTERN "*.asy"
+ PERMISSIONS ${PERMISSION_644_LIST}
+)
+
+# DOCEXTRA files -> examples
+install(
+ DIRECTORY ${ASY_DOC_DIR}/
+ DESTINATION ${ASYMPTOTE_EXAMPLESDIR_VALUE}
+ COMPONENT ${ASY_BASE_INSTALL_COMPONENT}
+ FILES_MATCHING
+ PATTERN "*.asy"
+ PATTERN "*.csv"
+ PATTERN "*.dat"
+ PERMISSIONS ${PERMISSION_644_LIST}
+)
+
+set(ASY_DOCEXTRA_FILE_NAMES latexusage.tex externalprc.tex pixel.pdf)
+list(
+ TRANSFORM ASY_DOCEXTRA_FILE_NAMES
+ PREPEND ${ASY_DOC_DIR}/
+ OUTPUT_VARIABLE ASY_DOCEXTRA_FILES
+)
+
+install(
+ FILES ${ASY_DOCEXTRA_FILES}
+ DESTINATION ${ASYMPTOTE_EXAMPLESDIR_VALUE}
+ COMPONENT ${ASY_BASE_INSTALL_COMPONENT}
+ PERMISSIONS ${PERMISSION_644_LIST}
+)
+#endregion
+
+#region documentation files
+if (ENABLE_DOCGEN)
+ set(ASY_DOCS_INSTALL_COMPONENT asy-docs)
+ set(ASY_INSTALL_DOCDIR_VALUE ${CMAKE_INSTALL_DATADIR}/asymptote/doc)
+
+ set(ASY_DOCFILE_PDF_FILES ${BASE_ASYMPTOTE_DOC_AND_TEX_FILES})
+ list(FILTER ASY_DOCFILE_PDF_FILES INCLUDE REGEX "^.*\.pdf$")
+ list(APPEND ASY_DOCFILE_PDF_FILES ${ASY_TEX_BUILD_ROOT}/asymptote.pdf)
+
+ # pdf files
+ install(
+ FILES ${ASY_DOCFILE_PDF_FILES}
+ COMPONENT ${ASY_DOCS_INSTALL_COMPONENT}
+ DESTINATION ${ASY_INSTALL_DOCDIR_VALUE}
+ PERMISSIONS ${PERMISSION_644_LIST}
+ )
+
+ # manpage
+ install(
+ FILES ${ASY_TEX_BUILD_ROOT}/asy.1
+ COMPONENT ${ASY_DOCS_INSTALL_COMPONENT}
+ DESTINATION ${CMAKE_INSTALL_MANDIR}/man1
+ PERMISSIONS ${PERMISSION_644_LIST}
+ )
+endif()
+#endregion
diff --git a/graphics/asymptote/cmake-scripts/options.cmake b/graphics/asymptote/cmake-scripts/options.cmake
new file mode 100644
index 0000000000..4f257964bb
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/options.cmake
@@ -0,0 +1,293 @@
+include(CMakeDependentOption)
+
+# version override
+
+set(
+ ASY_VERSION_OVERRIDE "" CACHE STRING
+ "Overriding asymptote version. If left blank, version is determined from configure.ac."
+)
+
+# Perl
+
+set(PERL_INTERPRETER "" CACHE STRING "Perl interpreter. If left empty, will try to determine interpreter automatically")
+
+if(NOT PERL_INTERPRETER)
+ message(STATUS "No Perl interpreter specified, attempting to find perl")
+ find_program(
+ PERL_INTERPRETER_FOUND
+ perl
+ REQUIRED
+ )
+ message(STATUS "Found perl at ${PERL_INTERPRETER_FOUND}")
+ set(PERL_INTERPRETER ${PERL_INTERPRETER_FOUND} CACHE STRING "" FORCE)
+endif()
+
+execute_process(COMMAND ${PERL_INTERPRETER} -e "print \"$]\"" OUTPUT_VARIABLE PERL_VERSION)
+message(STATUS "Perl version: ${PERL_VERSION}")
+
+# Python
+
+set(PY3_INTERPRETER "" CACHE STRING "Python 3 interpreter. If left empty, will try to determine Python automatically")
+
+function(verify_py3_interpreter_is_py3 validator_result_var py_interpreter)
+ execute_process(
+ COMMAND ${py_interpreter} -c "import sys; print(int(sys.version[0])>=3,end='')"
+ OUTPUT_VARIABLE PY3_INTERPRETER_VERSION_RESULT)
+ if (NOT PY3_INTERPRETER_VERSION_RESULT STREQUAL "True")
+ set(${validator_result_var} FALSE PARENT_SCOPE)
+ endif()
+endfunction()
+
+if(NOT PY3_INTERPRETER)
+ message(STATUS "No Python3 interpreter specified, attempting to find python")
+ find_program(
+ PY3_INTERPRETER_FOUND
+ NAMES python3 python
+ VALIDATOR verify_py3_interpreter_is_py3
+ REQUIRED
+ )
+ message(STATUS "Found python3 at ${PY3_INTERPRETER_FOUND}")
+ set(PY3_INTERPRETER ${PY3_INTERPRETER_FOUND} CACHE STRING "" FORCE)
+else()
+ set(PY_INTERPRETER_IS_PY3 TRUE)
+ set(VARIABLE_RESULT_VAR PY_INTERPRETER_IS_PY3)
+ verify_py3_interpreter_is_py3(VARIABLE_RESULT_VAR ${PY3_INTERPRETER})
+
+ if (NOT PY_INTERPRETER_IS_PY3)
+ message(FATAL_ERROR "Specified python interpreter cannot be used as python3 interpreter!")
+ endif()
+endif()
+
+execute_process(COMMAND ${PY3_INTERPRETER} --version OUTPUT_VARIABLE PY3_VERSION)
+message(STATUS "Version: ${PY3_VERSION}")
+
+# windows flex + bison
+set(
+ WIN32_FLEX_BINARY "" CACHE STRING
+ "Flex binary for windows. If not specified, downloads from winflexibson. This option is inert on UNIX systems"
+)
+set(
+ WIN32_BISON_BINARY "" CACHE STRING
+ "Bison binary for windows. If not specified, downloads from winflexbison. This option is inert on UNIX systems"
+)
+
+# feature libraries
+
+option(ENABLE_GC "enable boehm gc support" true)
+option(ENABLE_CURL "enable curl support" true)
+option(ENABLE_READLINE "libreadline" true)
+option(ENABLE_THREADING "enable threading support" true)
+option(ENABLE_GSL "Enable GSL support" true)
+option(ENABLE_EIGEN3 "Enable eigen3 support" true)
+option(ENABLE_FFTW3 "Enable fftw3 support" true)
+option(ENABLE_OPENGL "Whether to enable opengl or not." true)
+cmake_dependent_option(ENABLE_GL_COMPUTE_SHADERS
+ "Whether to enable compute shaders for OpenGL. Requires OpenGL >= 4.3 and GL_ARB_compute_shader"
+ true "ENABLE_OPENGL" false)
+cmake_dependent_option(ENABLE_GL_SSBO
+ "Whether to enable compute SSBO. Requires OpenGL >= 4.3 and GL_ARB_shader_storage_buffer_object"
+ true "ENABLE_OPENGL" false)
+
+option(
+ ENABLE_RPC_FEATURES
+ "Whether to enable XDR/RPC features. Also enables V3D. If compiling on UNIX systems, requires libtirpc to be installed."
+ true)
+
+# Additional options
+
+option(DEBUG_GC_ENABLE "Enable debug mode for gc" false)
+option(DEBUG_GC_BACKTRACE_ENABLE "Enable backtrace for gc" false)
+option(CTAN_BUILD "Build for CTAN." false)
+
+option(
+ ENABLE_COMPACT_ZERO_BUILD "\
+Set COMPACT flag to 0. \
+Unless if building for debugging/testing with an explicit need for additional type verification, \
+this option should be turned off."
+ false)
+
+# additional optimization options
+
+if (CMAKE_BUILD_TYPE IN_LIST cmake_release_build_types)
+ set(default_lto true)
+else()
+ set(default_lto false)
+endif()
+
+option(OPTIMIZE_LINK_TIME "Enable link-time optimization. Enabled by default in release build types" ${default_lto})
+
+# testing
+option(ENABLE_ASY_CXXTEST "Enable C++-side testing. This option is inert for final asy libraries and binaries" true)
+option(
+ DOWNLOAD_GTEST_FROM_SRC "Download google test from googletest's github repo. Otherwise use system libraries."
+ true)
+
+# msvc-specific
+# The only reason this option is here is because msvc compiler (cl.exe) does not partial preprocessing
+# (e.g. ignore missing headers and treat them as generated files or depfile generation with missing headers)
+# We use MSVC compiler for all C++ compilation/linking
+set(GCCCOMPAT_CXX_COMPILER_FOR_MSVC
+ "" CACHE STRING
+ "gcc-compatible C++ compiler for preprocessing with MSVC toolchain. This option is inert if not using MSVC.
+This option is only used for preprocessing, it is not used for compilation."
+)
+
+# CUDA + asy cuda reflect
+include(CheckLanguage)
+check_language(CUDA)
+
+if (CMAKE_CUDA_COMPILER)
+ set(CAN_COMPILE_CUDA_REFLECT true)
+endif()
+
+cmake_dependent_option(
+ ENABLE_CUDA_ASY_REFLECT
+ "Enable target for reflect excutable for generating IBL lighting data.
+Requires CUDA installed and a CUDA-compatible NVIDIA Graphics card"
+ true "CAN_COMPILE_CUDA_REFLECT" false
+)
+
+# Language server protocol
+option(
+ ENABLE_LSP
+ "Enable Language Server Protocol support."
+ true
+)
+
+# documentation
+set(WIN32_TEXINDEX "WSL" CACHE STRING
+ "Location to texindex for windows, or WSL to use internal WSL wrapper.
+Inert for non-windows systems.")
+
+function(determine_asymptote_pdf_gen_possible_win32)
+ # windows doesn't have an up-to-date
+ # texi2dvi release in multiple years, so
+ # we are using MikTeX's texify
+ find_program(TEXIFY texify)
+ if (NOT TEXIFY)
+ message(STATUS "texify not found; will not enable docgen by default")
+ set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false PARENT_SCOPE)
+ return()
+ endif()
+
+ if (NOT WIN32_TEXINDEX)
+ message(STATUS "texindex for windows not given; will not enable docgen by default")
+ set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false PARENT_SCOPE)
+ return()
+ endif()
+
+ # another issue is that
+ if (WIN32_TEXINDEX STREQUAL WSL)
+ execute_process(
+ COMMAND wsl sh -c "which texindex >/dev/null 2>/dev/null && echo OK"
+ OUTPUT_VARIABLE TEXINDEX_RESULT
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ if (NOT TEXINDEX_RESULT STREQUAL "OK")
+ message(STATUS "Cannot execute texindex on wsl; will not enable docgen by default")
+ set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false PARENT_SCOPE)
+ return()
+ endif()
+ endif()
+ set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE true PARENT_SCOPE)
+endfunction()
+
+set(ENABLE_BASE_DOCGEN_POSSIBLE false)
+set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false)
+
+# finding latex and other programs needed
+# pdflatex
+find_package(LATEX COMPONENTS PDFLATEX)
+
+# pdftex
+set(PDFTEX_EXEC "" CACHE STRING "pdftex. If left empty, will try to determine interpreter automatically")
+if (NOT PDFTEX)
+ message(STATUS "No pdftex specified, attempting to find pdftex")
+ find_program(
+ PDFTEX_EXEC_FOUND
+ pdftex
+ )
+ if (PDFTEX_EXEC_FOUND)
+ message(STATUS "Found pdftex at ${PDFTEX_EXEC_FOUND}")
+ set(PDFTEX_EXEC ${PDFTEX_EXEC_FOUND} CACHE STRING "" FORCE)
+ endif()
+endif()
+
+if (LATEX_PDFLATEX_FOUND AND PDFTEX_EXEC)
+ set(ENABLE_BASE_DOCGEN_POSSIBLE true)
+
+ if (WIN32)
+ determine_asymptote_pdf_gen_possible_win32()
+ elseif(UNIX)
+ find_program(TEXI2DVI texi2dvi)
+ if (TEXI2DVI)
+ set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE true)
+ endif()
+ endif()
+endif()
+
+set(
+ EXTERNAL_DOCUMENTATION_DIR "" CACHE STRING
+ "If specified, installation will use files from this directory as documentation.
+In particular,
+
+- if ENABLE_DOCGEN and ENABLE_ASYMPTOTE_PDF_DOCGEN is enabled and the system has the capability to build
+all documentation files, this option is inert.
+- if ENABLE_DOCGEN is enabled but ENABLE_ASYMPTOTE_PDF_DOCGEN is disabled or if the system cannot produce asymptote.pdf,
+only asymptote.pdf will be copied from this directory.
+- if ENABLE_DOCGEN is disabled, every documentation file will be copied from this directory.
+"
+)
+
+cmake_dependent_option(
+ ENABLE_DOCGEN
+ "Enable basic document generation. Requires pdflatex"
+ true
+ "ENABLE_BASE_DOCGEN_POSSIBLE"
+ false
+)
+
+cmake_dependent_option(
+ ENABLE_ASYMPTOTE_PDF_DOCGEN
+ "Enable asymptote.pdf document generation. Requires texinfo, and additionally WSL + texindex on windows."
+ true
+ "ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE;ENABLE_DOCGEN"
+ false
+)
+
+# misc files
+option(
+ ENABLE_MISCFILES_GEN
+ "Enable generation of non-essential, non-documentation asymptote files (e.g. asy.list, asy-keywords.el) "
+ true
+)
+
+# warnings if external docs dir is not given
+if (NOT EXTERNAL_DOCUMENTATION_DIR)
+ if (NOT ENABLE_DOCGEN)
+ message(STATUS "Build is not generating documentation.
+If you are planning on generating installation files, please make sure you have access to
+documentation files in a directory and specify this directory in EXTERNAL_DOCUMENTATION_DIR cache variable.
+")
+ elseif(NOT ENABLE_ASYMPTOTE_PDF_DOCGEN)
+ message(STATUS "Build is not generating asymptote.pdf.
+If you are planning on generating installation files, please make sure you have access to asymptote.pdf
+in a directory and specify this directory in EXTERNAL_DOCUMENTATION_DIR cache variable.
+")
+ endif()
+
+ if (NOT ENABLE_MISCFILES_GEN)
+ message(STATUS "Build is not generating non-essential, non-documentation asymptote files.
+If you are planning on generating installation files, please make sure you have access to asy-keywords.el
+in a directory and specify this directory in EXTERNAL_DOCUMENTATION_DIR cache variable.
+")
+ endif()
+endif()
+
+# windows-specific installation
+option(
+ ALLOW_PARTIAL_INSTALLATION
+ "Allow installation to go through, even if not every component is buildable.
+ CMake will produce a warning instead of a fatal error."
+ false
+)
diff --git a/graphics/asymptote/cmake-scripts/scripts/wce.script.cmake b/graphics/asymptote/cmake-scripts/scripts/wce.script.cmake
new file mode 100644
index 0000000000..b5dea2ddbd
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/scripts/wce.script.cmake
@@ -0,0 +1,15 @@
+# testing for wce. Equivalent to ./wce script
+
+execute_process(
+ COMMAND ${ASY_EXEC} -q -sysdir ${ASY_BASE_DIR} -noautoplain -debug errortest
+ WORKING_DIRECTORY ${SOURCE_ROOT}
+ ERROR_VARIABLE ASY_STDERR_OUTPUT
+)
+
+file(READ ${SOURCE_ROOT}/errors EXPECTED_ERROR_OUTPUT)
+
+if (NOT ASY_STDERR_OUTPUT STREQUAL EXPECTED_ERROR_OUTPUT)
+ message(FATAL_ERROR "Asymptote error test fails.")
+else()
+ message(STATUS "Asymptote error messages equal expected. Test passes")
+endif()
diff --git a/graphics/asymptote/cmake-scripts/subrepo-projects.cmake b/graphics/asymptote/cmake-scripts/subrepo-projects.cmake
new file mode 100644
index 0000000000..a93c0367f4
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/subrepo-projects.cmake
@@ -0,0 +1,74 @@
+set(ASY_SUBREPO_CLONE_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
+
+set(LSP_REPO_ROOT ${ASY_SUBREPO_CLONE_ROOT}/LspCpp)
+set(TINYEXR_SUBREPO_ROOT ${ASY_SUBREPO_CLONE_ROOT}/tinyexr)
+set(BOEHM_GC_ROOT ${ASY_SUBREPO_CLONE_ROOT}/gc)
+set(LIBATOMIC_OPS_ROOT ${ASY_SUBREPO_CLONE_ROOT}/libatomic_ops)
+
+# boehm gc
+if (ENABLE_GC)
+ set(enable_gpl OFF CACHE INTERNAL "libatomicops gpl libs option")
+ add_subdirectory(${LIBATOMIC_OPS_ROOT})
+
+ set(OLD_CFLAG_EXTRA ${CFLAG_EXTRA})
+ set(CFLAGS_EXTRA -I${LIBATOMIC_OPS_ROOT}/src) # for bdwgc
+
+ set(OLD_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
+ set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "bdwgc shared libs flag")
+ set(enable_cplusplus ON CACHE INTERNAL "bdwgc enable C++")
+ set(without_libatomic_ops ON CACHE INTERNAL "bdwgc use libatomic ops")
+ add_subdirectory(${BOEHM_GC_ROOT})
+
+ set(CFLAG_EXTRA ${OLD_CFLAG_EXTRA})
+ unset(BUILD_SHARED_LIBS CACHE)
+ set(BUILD_SHARED_LIBS ${OLD_BUILD_SHARED_LIBS})
+
+ list(APPEND ASY_STATIC_LIBARIES gc gccpp atomic_ops)
+
+ if (WIN32)
+ list(APPEND ASY_MACROS GC_NOT_DLL)
+ endif()
+ # We use #include <gc.h> as opposed to <gc/gc.h> (and also for other gc include files) to allow
+ # linking directly to the compiled source for testing different GC versions.
+
+ # In GC tarballs downloaded from https://www.hboehm.info/gc/, the header files are in include/gc.h, and not
+ # include/gc/gc.h, hence we need a way to allow inclusion of "gc.h". In vcpkg gc distributions, the include
+ # files are provided in include/gc/gc.h (and other files). Hence we append "/gc" to the include directories.
+
+ if (WIN32)
+ list(APPEND ASY_STATIC_LIBARIES gctba)
+ endif()
+ list(APPEND ASY_MACROS USEGC)
+else()
+ message(STATUS "Disabling gc support")
+endif()
+
+if (ENABLE_LSP)
+ message(STATUS "LSP Enabled.")
+ # disable New Boost version warning
+ set(Boost_NO_WARN_NEW_VERSIONS 1)
+ set(USE_SYSTEM_RAPIDJSON ON CACHE INTERNAL "Use system rapidjson")
+ set(LSPCPP_USE_CPP17 ON CACHE INTERNAL "C++17 mode")
+ # For transitive URI dependency
+ set(Uri_BUILD_DOCS OFF CACHE INTERNAL "build docs for uri")
+ set(Uri_BUILD_TESTS OFF CACHE INTERNAL "build tests for uri")
+
+ if (WIN32)
+ set(LSPCPP_WIN32_WINNT_VALUE ${ASY_WIN32_WINVER_VERSION} CACHE INTERNAL "lsp win32 winver value")
+ endif()
+
+ if (ENABLE_GC)
+ set(LSPCPP_SUPPORT_BOEHM_GC ON CACHE INTERNAL "Use boehm GC")
+ set(LSPCPP_GC_DOWNLOADED_ROOT ${BOEHM_GC_ROOT} CACHE INTERNAL "gc root for lsp")
+ set(LSPCPP_GC_STATIC ON CACHE INTERNAL "lsp use static gc")
+ endif()
+
+ add_subdirectory(${LSP_REPO_ROOT})
+
+ list(APPEND ASY_STATIC_LIBARIES lspcpp)
+ list(APPEND ASY_MACROS HAVE_LSP=1)
+else()
+ # only include lsp libraries
+ message(STATUS "LSP Disabled. Will not have language server protocol support.")
+ list(APPEND ASYMPTOTE_INCLUDES ${LSP_REPO_ROOT}/include)
+endif()
diff --git a/graphics/asymptote/cmake-scripts/tests-asy.cmake b/graphics/asymptote/cmake-scripts/tests-asy.cmake
new file mode 100644
index 0000000000..7e990cfec1
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/tests-asy.cmake
@@ -0,0 +1,126 @@
+# ---- asy tests ------
+
+set(ASY_ASYLANG_TEST_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/tests)
+set(ASY_ASYLANG_TEST_SCRATCH_DIR ${ASY_ASYLANG_TEST_ROOT}/out/)
+
+function(add_individual_asy_tests)
+ set(fn_opts)
+ set(fn_oneval_args DIR FILE ADDR_ASY_ARGS)
+ set(fn_multival_args TEST_LABELS)
+ cmake_parse_arguments(
+ ASY_TEST "${fn_opts}" "${fn_oneval_args}" "${fn_multival_args}" ${ARGN}
+ )
+
+ set(TEST_PATH ${ASY_ASYLANG_TEST_ROOT}/${ASY_TEST_DIR}/${ASY_TEST_FILE}.asy)
+ set(TEST_NAME "asy.${ASY_TEST_DIR}.${ASY_TEST_FILE}")
+ add_test(
+ NAME ${TEST_NAME}
+ COMMAND asy
+ -dir ${ASY_BUILD_BASE_DIR} ${TEST_PATH}
+ -noV
+ -o out
+ -globalwrite
+ ${ASY_TEST_ADDR_ASY_ARGS}
+ WORKING_DIRECTORY ${ASY_ASYLANG_TEST_ROOT}
+ )
+
+ if (ASY_TEST_TEST_LABELS)
+ set_property(
+ TEST ${TEST_NAME}
+ PROPERTY LABELS ${ASY_TEST_TEST_LABELS}
+ )
+ endif()
+
+endfunction()
+
+macro(add_asy_tests)
+ set(macro_opts TEST_NOT_PART_OF_CHECK_TEST)
+ set(macro_oneval_args TEST_DIR ADDR_ASY_ARGS)
+ set(macro_multival_args TESTS TEST_ARTIFACTS)
+ cmake_parse_arguments(
+ ASY_TESTING "${macro_opts}" "${macro_oneval_args}" "${macro_multival_args}" ${ARGN}
+ )
+ foreach(testfile ${ASY_TESTING_TESTS})
+
+ if (ASY_TESTING_TEST_NOT_PART_OF_CHECK_TEST)
+ set(TEST_LABEL asy-extended-tests)
+ else()
+ set(TEST_LABEL asy-check-tests)
+ endif()
+
+
+ add_individual_asy_tests(
+ DIR ${ASY_TESTING_TEST_DIR}
+ FILE ${testfile}
+ ADDR_ASY_ARGS ${ASY_TESTING_ADDR_ASY_ARGS}
+ TEST_LABELS ${TEST_LABEL}
+ )
+ endforeach()
+
+ foreach(artifact ${ASY_TESTING_TEST_ARTIFACTS})
+ set_property(
+ TARGET asy
+ APPEND
+ PROPERTY ADDITIONAL_CLEAN_FILES ${ASY_ASYLANG_TEST_SCRATCH_DIR}/${artifact}
+ )
+ endforeach()
+endmacro()
+
+# ------ tests ----------
+
+add_asy_tests(
+ TEST_DIR arith
+ TESTS integer pair random real roots transform triple
+)
+add_asy_tests(
+ TEST_DIR array
+ TESTS array delete determinant fields slice solve sort transpose
+)
+add_asy_tests(
+ TEST_DIR frames
+ TESTS loop stat stat2
+)
+
+if (ENABLE_GC)
+ add_asy_tests(
+ TEST_DIR gc
+ TESTS array funcall guide label path shipout string struct transform
+ TEST_ARTIFACTS .eps
+ TEST_NOT_PART_OF_CHECK_TEST true
+ )
+endif()
+
+if (ENABLE_GSL)
+ add_asy_tests(
+ TEST_DIR gsl
+ TESTS random
+ )
+endif()
+
+add_asy_tests(TEST_DIR imp TESTS unravel)
+add_asy_tests(TEST_DIR io TESTS csv)
+add_asy_tests(TEST_DIR output TESTS circle line TEST_ARTIFACTS circle.eps line.eps)
+add_asy_tests(TEST_DIR pic TESTS trans)
+add_asy_tests(
+ TEST_DIR string
+ TESTS erase find insert length rfind substr
+)
+add_asy_tests(
+ TEST_DIR types
+ TESTS
+ autounravel builtinOps cast constructor ecast guide
+ init keyword order resolve shadow spec var
+)
+
+add_asy_tests(
+ TEST_DIR template
+ TESTS
+ initTest functionTest mapArrayTest multiImport nestedImport
+ singletype sortedsetTest splaytreeTest structTest
+)
+
+add_asy_tests(
+ TEST_DIR gs
+ TESTS ghostscript
+ TEST_NOT_PART_OF_CHECK_TEST true
+)
diff --git a/graphics/asymptote/cmake-scripts/tests-wce.cmake b/graphics/asymptote/cmake-scripts/tests-wce.cmake
new file mode 100644
index 0000000000..749eeaafea
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/tests-wce.cmake
@@ -0,0 +1,14 @@
+add_test(
+ NAME "wce"
+ COMMAND ${CMAKE_COMMAND}
+ -DASY_EXEC=$<TARGET_FILE:asy>
+ -DASY_BASE_DIR=${ASY_BUILD_BASE_DIR}
+ -DSOURCE_ROOT=${CMAKE_CURRENT_SOURCE_DIR}
+ -P ${ASY_MISC_CMAKE_SCRIPTS_DIR}/wce.script.cmake
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+set_property(
+ TEST wce
+ PROPERTY LABELS asy-check-tests
+)
diff --git a/graphics/asymptote/cmake-scripts/thirdparty-impl.cmake b/graphics/asymptote/cmake-scripts/thirdparty-impl.cmake
new file mode 100644
index 0000000000..e98e70fda1
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/thirdparty-impl.cmake
@@ -0,0 +1,7 @@
+# tinyexr
+
+set(TINYEXR_REPO_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/tinyexr CACHE INTERNAL "tinyexr repo location")
+add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty_impl/tinyexr_impl/)
+
+list(APPEND ASY_STATIC_LIBARIES tinyexr-impl)
+list(APPEND ASYMPTOTE_INCLUDES $<TARGET_PROPERTY:tinyexr-impl,INCLUDE_DIRECTORIES>)
diff --git a/graphics/asymptote/cmake-scripts/vcpkg-features.cmake b/graphics/asymptote/cmake-scripts/vcpkg-features.cmake
new file mode 100644
index 0000000000..a0aa725983
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/vcpkg-features.cmake
@@ -0,0 +1,35 @@
+if (ENABLE_READLINE)
+ list(APPEND VCPKG_MANIFEST_FEATURES readline)
+endif()
+
+if (ENABLE_CURL)
+ list(APPEND VCPKG_MANIFEST_FEATURES curl)
+endif()
+
+if (ENABLE_GSL)
+ list(APPEND VCPKG_MANIFEST_FEATURES gsl)
+endif()
+
+if (ENABLE_EIGEN3)
+ list(APPEND VCPKG_MANIFEST_FEATURES eigen3)
+endif()
+
+if (ENABLE_FFTW3)
+ list(APPEND VCPKG_MANIFEST_FEATURES fftw3)
+endif()
+
+if (ENABLE_OPENGL)
+ list(APPEND VCPKG_MANIFEST_FEATURES opengl)
+endif()
+
+if (ENABLE_THREADING)
+ list(APPEND VCPKG_MANIFEST_FEATURES threading)
+endif()
+
+if (ENABLE_ASY_CXXTEST)
+ list(APPEND VCPKG_MANIFEST_FEATURES build-cxx-testing)
+endif()
+
+if (ENABLE_LSP)
+ list(APPEND VCPKG_MANIFEST_FEATURES lsp)
+endif()
diff --git a/graphics/asymptote/cmake-scripts/win32-pre-nsis-installer.cmake b/graphics/asymptote/cmake-scripts/win32-pre-nsis-installer.cmake
new file mode 100644
index 0000000000..3e5b8ccd33
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/win32-pre-nsis-installer.cmake
@@ -0,0 +1,206 @@
+if (NOT WIN32)
+ message(FATAL_ERROR "Pre-NSIS installation is intended for windows only!")
+endif()
+
+if (NOT ASY_WIN_RESOURCE_DIR)
+ message(FATAL_ERROR "ASY_WIN_RESOURCE_DIR is not defined.
+Please ensure win32-specific.cmake is included before this file!")
+endif()
+
+if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set_property(CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_CURRENT_SOURCE_DIR}/cmake-install-win32")
+endif()
+
+# helper target for files needed
+add_custom_target(asy-pre-nsis-targets DEPENDS asy asy-basefiles)
+
+# check done, start configuration
+set(ASYMPTOTE_NSI_CONFIGURATION_DIR ${CMAKE_CURRENT_BINARY_DIR}/nsifiles)
+file(MAKE_DIRECTORY ${ASYMPTOTE_NSI_CONFIGURATION_DIR})
+
+configure_file(
+ ${ASY_WIN_RESOURCE_DIR}/AsymptoteInstallInfo.nsi.in
+ ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/AsymptoteInstallInfo.nsi
+)
+
+set(ASY_INSTALL_DIRECTORY build-${ASY_VERSION})
+
+set(BUILD_ASY_INSTALLER_SCRIPT ${ASY_WIN_RESOURCE_DIR}/build-asymptote-installer.py)
+configure_file(
+ ${ASY_WIN_RESOURCE_DIR}/build-asy-installer.ps1.in
+ ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/build-asy-installer.ps1
+)
+
+set(ASY_PRE_NSIS_COMPONENT_NAME asy-pre-nsis)
+set(ASY_NSIS_INSTALL_ARGUMENT
+ COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME}
+ DESTINATION ${ASY_INSTALL_DIRECTORY}
+)
+
+set(ASY_NSIS_TARGET_EXAMPLES_INSTALL_ARGUMENT
+ COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME}
+ DESTINATION ${ASY_INSTALL_DIRECTORY}/examples
+)
+
+
+set(ASY_NSIS_INSTALL_RESOURCES_ARGUMENT
+ COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME}
+ DESTINATION .
+)
+
+# <build-root>/asy.exe -> <install-root>/asy.exe
+install(TARGETS asy
+ RUNTIME_DEPENDENCIES
+ PRE_EXCLUDE_REGEXES "api-ms-" "ext-ms-"
+ POST_EXCLUDE_REGEXES ".*system32/.*\\.dll"
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+)
+
+# <build-root>/base/*, <build-root>/examples -> <install-root>/
+install(
+ DIRECTORY ${ASY_BUILD_BASE_DIR}/ ${CMAKE_CURRENT_SOURCE_DIR}/examples
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+)
+
+# <build-root>/base/asy-{init,mode}.el -> <install-root>/
+install(
+ FILES
+ ${ASY_SOURCE_BASE_DIR}/asy-init.el
+ ${ASY_SOURCE_BASE_DIR}/asy-mode.el
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+)
+
+# misc files -> <install-root>/
+install(
+ FILES ${ASY_OUTPUT_MISC_FILES}
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+)
+
+# extra doc files
+install(
+ FILES
+ ${ASY_DOC_DIR}/latexusage.tex
+ ${ASY_DOC_DIR}/externalprc.tex
+ ${ASY_NSIS_TARGET_EXAMPLES_INSTALL_ARGUMENT}
+)
+
+install(
+ DIRECTORY ${ASY_DOC_DIR}/
+ ${ASY_NSIS_TARGET_EXAMPLES_INSTALL_ARGUMENT}
+ FILES_MATCHING
+ PATTERN "*.asy"
+ PATTERN "*.csv"
+ PATTERN "*.dat"
+)
+
+# resources files for installer + nsi files
+
+install(
+ FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE
+ ${ASY_WIN_RESOURCE_DIR}/asy.ico
+ ${ASY_WIN_RESOURCE_DIR}/asymptote.nsi
+ ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/AsymptoteInstallInfo.nsi
+ ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/build-asy-installer.ps1
+ ${ASY_NSIS_INSTALL_RESOURCES_ARGUMENT}
+)
+
+install(
+ DIRECTORY ${ASY_WIN_RESOURCE_DIR}/
+ ${ASY_NSIS_INSTALL_RESOURCES_ARGUMENT}
+ FILES_MATCHING PATTERN "*.nsh"
+)
+
+# if a component is not buildable
+macro(action_if_component_not_buildable message)
+ message(WARNING "Please ensure this issue is resolved before installing. Message: ${message}")
+ if (ALLOW_PARTIAL_INSTALLATION)
+ install(CODE "message(WARNING \"${message}\")" COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME})
+ else()
+ install(CODE "message(FATAL_ERROR \"${message}\")" COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME})
+ endif()
+endmacro()
+
+# unfortuantely, we have to first call the "docgen" target manually
+# this can also be called from asy-pre-nsis-targets, which includes asy-with-basefiles alongside docgen.
+# this is a limitation of cmake currently (https://discourse.cmake.org/t/install-file-with-custom-target/2984/2)
+
+if (ASY_TEX_BUILD_ROOT)
+ add_dependencies(asy-pre-nsis-targets docgen)
+endif()
+
+if (ENABLE_MISCFILES_GEN)
+ add_dependencies(asy-pre-nsis-targets asy-dist-misc-files)
+endif()
+
+
+macro(install_from_external_documentation_dir docfile_name)
+ set(DOCFILE_LOCATION ${EXTERNAL_DOCUMENTATION_DIR}/${docfile_name})
+ message(STATUS "Using external documentation file at ${DOCFILE_LOCATION}")
+
+ if (NOT EXISTS ${DOCFILE_LOCATION})
+ message(WARNING "${DOCFILE_LOCATION} not found.
+Please ensure this file exists before running \"cmake --install\"."
+ )
+ endif()
+
+ install(FILES ${DOCFILE_LOCATION} ${ASY_NSIS_INSTALL_ARGUMENT})
+endmacro()
+
+
+if (ASY_TEX_BUILD_ROOT) # basic docgen possible
+ install(
+ FILES ${BASE_ASYMPTOTE_DOC_AND_TEX_FILES}
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+ )
+elseif(EXTERNAL_DOCUMENTATION_DIR)
+ set(
+ ASY_DOC_FILES_TO_COPY
+ asymptote.sty
+ asy-latex.pdf
+ CAD.pdf
+ TeXShopAndAsymptote.pdf
+ asyRefCard.pdf
+ )
+ foreach(ASY_DOC_FILE ${ASY_DOC_FILES_TO_COPY})
+ install_from_external_documentation_dir(${ASY_DOC_FILE})
+ endforeach()
+else()
+ action_if_component_not_buildable("base asymptote documentation cannot be found and is not buildable")
+endif()
+
+
+# asymptote.pdf
+if(ENABLE_ASYMPTOTE_PDF_DOCGEN)
+ message(STATUS "Using asymptote.pdf from ${ASY_TEX_BUILD_ROOT}/asymptote.pdf")
+ install(
+ FILES ${ASY_TEX_BUILD_ROOT}/asymptote.pdf
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+ )
+elseif (EXTERNAL_DOCUMENTATION_DIR)
+ install_from_external_documentation_dir(asymptote.pdf)
+else()
+ action_if_component_not_buildable("asymptote.pdf cannot be found and is not buildable")
+endif()
+
+# asy-keywords.el (and potentially other misc files)
+if (ENABLE_MISCFILES_GEN)
+ install(
+ FILES ${ASY_OUTPUT_DIST_MISC_FILES}
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+ )
+elseif(EXTERNAL_DOCUMENTATION_DIR)
+ install_from_external_documentation_dir(asy-keywords.el)
+else()
+ action_if_component_not_buildable("Non-essential, non-documentation asymptote files cannot be found")
+endif()
+
+
+# README files
+install(
+ FILES
+ ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE
+ ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.LESSER
+ ${CMAKE_CURRENT_SOURCE_DIR}/README
+ ${ASY_WIN_RESOURCE_DIR}/asy.ico
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+)
diff --git a/graphics/asymptote/cmake-scripts/win32-specific.cmake b/graphics/asymptote/cmake-scripts/win32-specific.cmake
new file mode 100644
index 0000000000..ef14bc68cd
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/win32-specific.cmake
@@ -0,0 +1,102 @@
+if (NOT WIN32)
+ message(FATAL_ERROR "This file is only for use with windows.")
+endif()
+
+# msvc compile options
+if (MSVC)
+ list(APPEND ASY_COMPILE_OPTS
+ /Zc:__cplusplus /Zc:__STDC__
+ /Zc:externC /Zc:preprocessor
+ /Zc:hiddenFriend)
+endif()
+
+# alot of asymptote sources use __MSDOS__ macro for checking windows
+list(APPEND ASY_MACROS WIN32_LEAN_AND_MEAN NOMINMAX __MSDOS__=1)
+
+
+# set ASYMPTOTE_SYSDIR to empty string
+if (CTAN_BUILD)
+ list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="")
+else()
+ # because of how ASYMPTOTE_SYSDIR is calculated on windows,
+ # this value is replaced by the what is in the registry when we launch
+ # asymptote, given if ASYMPTOTE_SYSDIR is not empty
+ # (empty indicates a CTAN build which uses kpsewhich for determining path)
+
+ # hence, we can leave this value to anything non-empty.
+ list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="NUL")
+endif()
+
+
+set(BUILD_SHARED_LIBS OFF)
+
+# gcc/clang++ compatible validators
+
+function(validate_gcc_compat_cxx validator_result_var gcccompat_compiler)
+ execute_process(
+ COMMAND ${gcccompat_compiler} "--version"
+ OUTPUT_VARIABLE COMPILER_RESULT)
+
+ if (NOT COMPILER_RESULT MATCHES
+ "(clang version )|(g\\+\\+\\.exe \\(MinGW\\))|(g\\+\\+ \\(GCC\\))")
+ set(${validator_result_var} FALSE PARENT_SCOPE)
+ endif()
+endfunction()
+
+
+macro(find_compatible_gcc_compilers)
+ find_program(
+ GCCCOMPAT_CXX_COMPILER_FOUND
+ NAMES clang++ g++
+ VALIDATOR validate_gcc_compat_cxx
+ )
+
+ if (GCCCOMPAT_CXX_COMPILER_FOUND)
+ message(STATUS "Found clang++/g++ at ${GCCCOMPAT_CXX_COMPILER_FOUND}")
+ set(GCCCOMPAT_CXX_COMPILER_FOR_MSVC ${GCCCOMPAT_CXX_COMPILER_FOUND})
+ endif()
+endmacro()
+
+# attempting to find gcc-compatible C++ compiler
+
+if (MSVC)
+ if (NOT GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
+ message(STATUS "GCCCOMPAT_CXX_COMPILER_FOR_MSVC not given, will attempt to find g++.exe or clang++.exe")
+ find_compatible_gcc_compilers()
+ endif()
+
+ if (GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
+ message(STATUS "Using GCC-compatible C++ compiler at \
+${GCCCOMPAT_CXX_COMPILER_FOR_MSVC} for preprocessing.")
+ endif()
+
+ if (NOT GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
+ message(WARNING "\
+GCC-compatible C++ compiler not specified, target dependency resolution for generated files may \
+not work properly. If you are looking for a GCC-compatible C++ compiler on windows for preprocessing, \
+we recommend the LLVM toolchain. You can find LLVM at \
+\
+https://releases.llvm.org/download.html \
+\
+or through msys2. After that, re-run cmake with either \
+-DGCCCOMPAT_CXX_COMPILER_FOR_MSVC=<path to clang++.exe> \
+or if running msvc/* presets, with GCCCOMPAT_CXX_COMPILER_FOR_MSVC \
+environment variable set to the path \
+to clang++.exe.")
+ endif()
+endif()
+
+
+# additional win32 api libraries
+list(APPEND ASY_STATIC_LIBARIES Shlwapi Shell32 Ws2_32)
+
+# RC file
+set(ASY_WIN_RESOURCE_DIR ${ASY_RESOURCE_DIR}/windows)
+list(APPEND ASY_WIN_RC_FILE ${ASY_WIN_RESOURCE_DIR}/asy.rc)
+
+# Minimum Windows version - for now, pinning on windows 10,
+# since that is currently the minimum supported version by Microsoft
+# See https://learn.microsoft.com/en-us/windows/win32/winprog/using-the-windows-headers
+
+set(ASY_WIN32_WINVER_VERSION 0x0A00)
+list(APPEND ASY_MACROS _WIN32_WINNT=${ASY_WIN32_WINVER_VERSION})
diff --git a/graphics/asymptote/coder.cc b/graphics/asymptote/coder.cc
index ee90354239..40fa61d753 100644
--- a/graphics/asymptote/coder.cc
+++ b/graphics/asymptote/coder.cc
@@ -372,5 +372,43 @@ function *bootuptype()
}
} // private
+bool coder::encodeParent(position pos, trans::tyEntry *ent) {
+ record *r = dynamic_cast<record *>(ent->t);
+ if (!r) {
+ em.compiler(pos);
+ em << "type '" << *ent->t << "' is not a structure";
+ return false;
+ }
+ assert(r);
+
+ // The level needed on which to allocate the record.
+ frame *level = r->getLevel()->getParent();
+
+ if (ent->v) {
+ // Put the record on the stack. For instance, in code like
+ // access imp;
+ // new imp.t;
+ // we are putting the instance of imp on the stack, so we can use it to
+ // allocate an instance of imp.t.
+ ent->v->encode(trans::READ, pos, *this);
+
+ // Adjust to the right frame. For instance, in the last new in
+ // struct A {
+ // struct B {
+ // static struct C {}
+ // }
+ // B b=new B;
+ // }
+ // A a=new A;
+ // new a.b.C;
+ // we push a.b onto the stack, but need a as the enclosing frame for
+ // allocating an instance of C.
+ record* q= dynamic_cast<record*>(ent->v->getType());
+ assert(q);
+ return encode(level, q->getLevel());
+ } else
+ return encode(level);
+}
+
} // namespace trans
diff --git a/graphics/asymptote/coder.h b/graphics/asymptote/coder.h
index 0d50e8c752..76c730551c 100644
--- a/graphics/asymptote/coder.h
+++ b/graphics/asymptote/coder.h
@@ -2,7 +2,7 @@
* coder.h
* Andy Hammerlindl 2004/11/06
*
- * Handles encoding of syntax into programs. It's methods are called by
+ * Handles encoding of syntax into programs. Its methods are called by
* abstract syntax objects during translation to construct the virtual machine
* code.
*****/
@@ -149,8 +149,13 @@ public:
assert(s != DEFAULT_STATIC && s != DEFAULT_DYNAMIC);
/* Non-default static overrules. */
- if (sord != EXPLICIT_STATIC)
+ if (s == AUTOUNRAVEL || sord == AUTOUNRAVEL) {
+ sord = AUTOUNRAVEL;
+ } else if (s == EXPLICIT_STATIC || sord == EXPLICIT_STATIC) {
+ sord = EXPLICIT_STATIC;
+ } else {
sord = s;
+ }
sord_stack.push(sord);
}
@@ -161,6 +166,7 @@ public:
switch(sord) {
case DEFAULT_STATIC:
case EXPLICIT_STATIC:
+ case AUTOUNRAVEL:
return true;
case DEFAULT_DYNAMIC:
case EXPLICIT_DYNAMIC:
@@ -171,6 +177,11 @@ public:
}
}
+ bool isAutoUnravel()
+ {
+ return sord == AUTOUNRAVEL;
+ }
+
/* Remove a modifier. */
void popModifier()
@@ -311,6 +322,10 @@ public:
return encode(recordLevel);
}
+ // Puts the frame corresponding to the parent of 'ent' on the stack. Triggers
+ // an error if 'ent' does not correspond to a record (a.k.a. asy struct) type.
+ bool encodeParent(position pos, trans::tyEntry *ent);
+
// An access that encodes the frame corresponding to "this".
access *thisLocation()
{
@@ -391,7 +406,6 @@ public:
// Turn a no-op into a jump to bypass incorrect code.
void encodePatch(label from, label to);
-public:
void encodePushFrame() {
pushframeLabels.push(program->end());
encode(inst::pushframe, (Int)0);
diff --git a/graphics/asymptote/common.h b/graphics/asymptote/common.h
index 7f582e70ff..d968d51beb 100644
--- a/graphics/asymptote/common.h
+++ b/graphics/asymptote/common.h
@@ -9,36 +9,49 @@
#undef NDEBUG
+#if defined(_WIN32)
+#include <Winsock2.h>
+#endif
+
#include <iostream>
#include <memory>
#include <climits>
+#include <cstdint>
+
+#if defined(_MSC_VER)
+// for and/or/not operators. not supported natively on MSVC
+#include <BaseTsd.h>
+#include <ciso646>
+typedef SSIZE_T ssize_t;
+#define STDOUT_FILENO 1
+#define STDIN_FILENO 0
+#define STDERR_FILENO 2
+#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#if __cplusplus < 201703L
+#ifdef DEBUG_CSTACKTRACE
+// To output a stacktrace when you are compiling with
+// CFLAGS="-g -O0 -DDEBUG_CSTACKTRACE", insert code like the following:
+// cerr << boost::stacktrace::stacktrace();
+// at the appropriate place.
+// NOTE: This gives useful information on MacOS, but seems to give only
+// hex addresses (rather than function names) on Linux. Possible remedies
+// may be found at https://stackoverflow.com/q/52583544/2318074 and linked
+// pages.
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+# endif
+
+# include <boost/stacktrace.hpp>
+#endif
-#ifdef HAVE_LSP
-#include <boost/optional.hpp>
-#include <boost/none.hpp>
-using boost::optional;
-#define nullopt boost::none
-using boost::make_optional;
-#else
-#include "optional.hpp"
-#define boost nonstd
+#include <optional.hpp>
using nonstd::optional;
using nonstd::nullopt;
using nonstd::make_optional;
-#endif
-
-#else
-#include <optional>
-using std::optional;
-using std::nullopt;
-using std::make_optional;
-#endif
using std::make_pair;
@@ -58,26 +71,10 @@ using std::make_pair;
#include "memory.h"
-#if defined(HAVE_LONG_LONG) && defined(LLONG_MAX) && defined(LLONG_MIN)
-#define Int_MAX2 LLONG_MAX
-#define Int_MIN LLONG_MIN
-typedef long long Int;
-typedef unsigned long long unsignedInt;
-#else
-#undef HAVE_LONG_LONG
-#ifdef HAVE_LONG
-#define Int_MAX2 LONG_MAX
-#define Int_MIN LONG_MIN
-typedef long Int;
-typedef unsigned long unsignedInt;
-#else
-#define Int_MAX2 INT_MAX
-#define Int_MIN INT_MIN
-#define intIsInt
-typedef int Int;
-typedef unsigned int unsignedInt;
-#endif
-#endif
+#define Int_MAX2 INT64_MAX
+#define Int_MIN INT64_MIN
+typedef int64_t Int;
+typedef uint64_t unsignedInt;
#ifndef COMPACT
#if Int_MAX2 >= 0x7fffffffffffffffLL
diff --git a/graphics/asymptote/compile b/graphics/asymptote/compile
new file mode 100755
index 0000000000..df363c8fbf
--- /dev/null
+++ b/graphics/asymptote/compile
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# 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
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" "" $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+ file=$1
+ case $file in
+ / | /[!/]*) # absolute file, and not a UNC file
+ if test -z "$file_conv"; then
+ # lazily determine how to convert abs files
+ case `uname -s` in
+ MINGW*)
+ file_conv=mingw
+ ;;
+ CYGWIN* | MSYS*)
+ file_conv=cygwin
+ ;;
+ *)
+ file_conv=wine
+ ;;
+ esac
+ fi
+ case $file_conv/,$2, in
+ *,$file_conv,*)
+ ;;
+ mingw/*)
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+ ;;
+ cygwin/* | msys/*)
+ file=`cygpath -m "$file" || echo "$file"`
+ ;;
+ wine/*)
+ file=`winepath -w "$file" || echo "$file"`
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+ func_file_conv "$1"
+ if test -z "$lib_path"; then
+ lib_path=$file
+ else
+ lib_path="$lib_path;$file"
+ fi
+ linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+ lib=$1
+ found=no
+ save_IFS=$IFS
+ IFS=';'
+ for dir in $lib_path $LIB
+ do
+ IFS=$save_IFS
+ if $shared && test -f "$dir/$lib.dll.lib"; then
+ found=yes
+ lib=$dir/$lib.dll.lib
+ break
+ fi
+ if test -f "$dir/$lib.lib"; then
+ found=yes
+ lib=$dir/$lib.lib
+ break
+ fi
+ if test -f "$dir/lib$lib.a"; then
+ found=yes
+ lib=$dir/lib$lib.a
+ break
+ fi
+ done
+ IFS=$save_IFS
+
+ if test "$found" != yes; then
+ lib=$lib.lib
+ fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+ # Assume a capable shell
+ lib_path=
+ shared=:
+ linker_opts=
+ for arg
+ do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ eat=1
+ case $2 in
+ *.o | *.[oO][bB][jJ])
+ func_file_conv "$2"
+ set x "$@" -Fo"$file"
+ shift
+ ;;
+ *)
+ func_file_conv "$2"
+ set x "$@" -Fe"$file"
+ shift
+ ;;
+ esac
+ ;;
+ -I)
+ eat=1
+ func_file_conv "$2" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -I*)
+ func_file_conv "${1#-I}" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -l)
+ eat=1
+ func_cl_dashl "$2"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -l*)
+ func_cl_dashl "${1#-l}"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -L)
+ eat=1
+ func_cl_dashL "$2"
+ ;;
+ -L*)
+ func_cl_dashL "${1#-L}"
+ ;;
+ -static)
+ shared=false
+ ;;
+ -Wl,*)
+ arg=${1#-Wl,}
+ save_ifs="$IFS"; IFS=','
+ for flag in $arg; do
+ IFS="$save_ifs"
+ linker_opts="$linker_opts $flag"
+ done
+ IFS="$save_ifs"
+ ;;
+ -Xlinker)
+ eat=1
+ linker_opts="$linker_opts $2"
+ ;;
+ -*)
+ set x "$@" "$1"
+ shift
+ ;;
+ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+ func_file_conv "$1"
+ set x "$@" -Tp"$file"
+ shift
+ ;;
+ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+ func_file_conv "$1" mingw
+ set x "$@" "$file"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+ done
+ if test -n "$linker_opts"; then
+ linker_opts="-link$linker_opts"
+ fi
+ exec "$@" $linker_opts
+ exit 1
+}
+
+eat=
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+ func_cl_wrapper "$@" # Doesn't return...
+ ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ # So we strip '-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no '-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # '.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/graphics/asymptote/config.guess b/graphics/asymptote/config.guess
index c7f17e8fb9..e7a6fe3e6d 100755
--- a/graphics/asymptote/config.guess
+++ b/graphics/asymptote/config.guess
@@ -1,10 +1,10 @@
#!/usr/bin/sh
# Attempt to guess a canonical system name.
-# Copyright 1992-2022 Free Software Foundation, Inc.
+# Copyright 1992-2023 Free Software Foundation, Inc.
# shellcheck disable=SC2006,SC2268 # see below for rationale
-timestamp='2022-05-25'
+timestamp='2023-06-23'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -47,7 +47,7 @@ me=`echo "$0" | sed -e 's,.*/,,'`
usage="\
Usage: $0 [OPTION]
-Output the configuration name of the system \`$me' is run on.
+Output the configuration name of the system '$me' is run on.
Options:
-h, --help print this help, then exit
@@ -60,13 +60,13 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright 1992-2022 Free Software Foundation, Inc.
+Copyright 1992-2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
help="
-Try \`$me --help' for more information."
+Try '$me --help' for more information."
# Parse command line
while test $# -gt 0 ; do
@@ -102,8 +102,8 @@ GUESS=
# temporary files to be created and, as you can see below, it is a
# headache to deal with in a portable fashion.
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
+# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still
+# use 'HOST_CC' if defined, but it is deprecated.
# Portable tmp directory creation inspired by the Autoconf team.
@@ -459,7 +459,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
UNAME_RELEASE=`uname -v`
;;
esac
- # Japanese Language versions have a version number like `4.1.3-JL'.
+ # Japanese Language versions have a version number like '4.1.3-JL'.
SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
GUESS=sparc-sun-sunos$SUN_REL
;;
@@ -966,6 +966,12 @@ EOF
GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
;;
+ x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*)
+ GUESS="$UNAME_MACHINE-pc-managarm-mlibc"
+ ;;
+ *:[Mm]anagarm:*:*)
+ GUESS="$UNAME_MACHINE-unknown-managarm-mlibc"
+ ;;
*:Minix:*:*)
GUESS=$UNAME_MACHINE-unknown-minix
;;
@@ -1036,7 +1042,7 @@ EOF
k1om:Linux:*:*)
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
;;
- loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
+ loongarch32:Linux:*:* | loongarch64:Linux:*:*)
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
;;
m32r*:Linux:*:*)
@@ -1191,7 +1197,7 @@ EOF
GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
;;
i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
+ # If we were able to find 'uname', then EMX Unix compatibility
# is probably installed.
GUESS=$UNAME_MACHINE-pc-os2-emx
;;
@@ -1332,7 +1338,7 @@ EOF
GUESS=ns32k-sni-sysv
fi
;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort
# says <Richard.M.Bartel@ccMail.Census.GOV>
GUESS=i586-unisys-sysv4
;;
diff --git a/graphics/asymptote/config.h.in b/graphics/asymptote/config.h.in
index 33a57ce14d..3a2d50b4e9 100644
--- a/graphics/asymptote/config.h.in
+++ b/graphics/asymptote/config.h.in
@@ -1,7 +1,6 @@
/* config.h.in. Generated from configure.ac by autoheader. */
-/* Define if building universal (internal helper macro) */
-#undef AC_APPLE_UNIVERSAL_BUILD
+#pragma once
/* Directory for documentation */
#undef ASYMPTOTE_DOCDIR
@@ -9,7 +8,16 @@
/* System directory for global .asy files */
#undef ASYMPTOTE_SYSDIR
-/* Define to 1 if you have GLSL compute shaders. */
+/* Freeglut is enabled */
+#undef FREEGLUT
+
+/* GC backtrace is enabled */
+#undef GC_BACKTRACE
+
+/* GC Debug is enabled */
+#undef GC_DEBUG
+
+/* Define to 1 if you have `GLSL compute shaders`. */
#undef HAVE_COMPUTE_SHADER
/* Define to 1 if you have the <curses.h> header file. */
@@ -42,52 +50,46 @@
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
#undef HAVE_FSEEKO
-/* Define to 1 if you have GNU <getopt.h>. */
-#undef HAVE_GNU_GETOPT_H
-
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if you have the `lgamma' function. */
#undef HAVE_LGAMMA
-/* Define to 1 if you have the `curl' library (-lcurl). */
+/* Define to 1 if you have the `curl` library (-lcurl). */
#undef HAVE_LIBCURL
-/* Define to 1 if you have the `ncurses' library (-lncurses). */
+/* Define to 1 if you have the `ncurses` library (-lncurses). */
#undef HAVE_LIBCURSES
/* Define to 1 if you have the `edit' library (-ledit). */
#undef HAVE_LIBEDIT
-/* Define to 1 if you have the `fftw3' library (-lfftw3). */
+/* Define to 1 if you have the `fftw3` library (-lfftw3). */
#undef HAVE_LIBFFTW3
/* Define to 1 if you have the `gccpp' library (-lgccpp). */
#undef HAVE_LIBGCCPP
-/* Define to 1 if you have the `GL' library (-lGL). */
+/* Define to 1 if you have the `GL` library (-lGL). */
#undef HAVE_LIBGL
-/* Define to 1 if you have the <glm/glm.hpp> header. */
+/* Define to 1 if you have `the <glm/glm.hpp> header`. */
#undef HAVE_LIBGLM
/* Define to 1 if you have the `glut' library (-lglut). */
#undef HAVE_LIBGLUT
-/* Define to 1 if you have the `gsl' library (-lgsl). */
+/* Define to 1 if you have the `gsl` library (-lgsl). */
#undef HAVE_LIBGSL
/* Define to 1 if you have the <libintl.h> header file. */
#undef HAVE_LIBINTL_H
-/* Define to 1 if you have the `OpenImageIO' library (-lOpenImageIO). */
-#undef HAVE_LIBOPENIMAGEIO
-
/* Define to 1 if you have the `OSMesa' library (-lOSMesa). */
#undef HAVE_LIBOSMESA
-/* Define to 1 if you have the `readline' library (-lreadline). */
+/* Define to 1 if you have the `readline` library (-lreadline). */
#undef HAVE_LIBREADLINE
/* Define to 1 if you have the `rt' library (-lrt). */
@@ -96,10 +98,10 @@
/* Define to 1 if you have the `sigsegv' library (-lsigsegv). */
#undef HAVE_LIBSIGSEGV
-/* Define to 1 if you have the `tinfo' library (-ltinfo). */
+/* Define to 1 if you have the `tinfo` library (-ltinfo). */
#undef HAVE_LIBTINFO
-/* Define to 1 if you have the `tirpc' library (-ltirpc). */
+/* Define to 1 if you have the `tirpc` library (-ltirpc). */
#undef HAVE_LIBTIRPC
/* Define to 1 if you have the `z' library (-lz). */
@@ -111,7 +113,7 @@
/* Define to 1 if the system has the type `long long'. */
#undef HAVE_LONG_LONG
-/* Define to 1 if you have Language server protocol. */
+/* Define to 1 if you have `Language server protocol`. */
#undef HAVE_LSP
/* Define to 1 if you have the `memrchr' function. */
@@ -138,7 +140,7 @@
/* Define to 1 if the system has the type `ptrdiff_t'. */
#undef HAVE_PTRDIFF_T
-/* Define to 1 if you have GLSL shader storage buffer objects. */
+/* Define to 1 if you have `GLSL shader storage buffer objects`. */
#undef HAVE_SSBO
/* Define to 1 if you have the <stddef.h> header file. */
@@ -183,13 +185,10 @@
/* Define to 1 if you have the `tgamma' function. */
#undef HAVE_TGAMMA
-/* Define to 1 if you have <tr1/unordered_map>. */
-#undef HAVE_TR1_UNORDERED_MAP
-
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
-/* Define to 1 if you have <unordered_map>. */
+/* Unordered map is present */
#undef HAVE_UNORDERED_MAP
/* Define to 1 if you have the `vfork' function. */
@@ -204,6 +203,9 @@
/* Define to 1 if `vfork' works. */
#undef HAVE_WORKING_VFORK
+/* ZLib library present */
+#undef HAVE_ZLIB
+
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
@@ -231,17 +233,14 @@
backward compatibility; new code need not use it. */
#undef STDC_HEADERS
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
- significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-# define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-# undef WORDS_BIGENDIAN
-# endif
-#endif
+/* Endianness is determined at compile time */
+#undef UNIVERSAL_ENDIAN_BUILD
+
+/* GC Enabled */
+#undef USEGC
+
+/* Build is big endian */
+#undef WORDS_BIGENDIAN
/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
`char[]'. */
diff --git a/graphics/asymptote/config.sub b/graphics/asymptote/config.sub
index f02d43ad50..a6d99a0f15 100644..100755
--- a/graphics/asymptote/config.sub
+++ b/graphics/asymptote/config.sub
@@ -1,12 +1,14 @@
-#! /bin/sh
+#!/usr/bin/sh
# Configuration validation subroutine script.
-# Copyright 1992-2020 Free Software Foundation, Inc.
+# Copyright 1992-2023 Free Software Foundation, Inc.
-timestamp='2020-01-01'
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2023-06-23'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
+# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
@@ -33,7 +35,7 @@ timestamp='2020-01-01'
# Otherwise, we print the canonical config type on stdout and succeed.
# You can get the latest version of this script from:
-# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
# This file is supposed to be the same for all GNU packages
# and recognize all the CPU types, system types and aliases
@@ -50,6 +52,13 @@ timestamp='2020-01-01'
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
# It is wrong to echo any other type of specification.
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
me=`echo "$0" | sed -e 's,.*/,,'`
usage="\
@@ -67,13 +76,13 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
-Copyright 1992-2020 Free Software Foundation, Inc.
+Copyright 1992-2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
help="
-Try \`$me --help' for more information."
+Try '$me --help' for more information."
# Parse command line
while test $# -gt 0 ; do
@@ -112,40 +121,41 @@ esac
# Split fields of configuration type
# shellcheck disable=SC2162
+saved_IFS=$IFS
IFS="-" read field1 field2 field3 field4 <<EOF
$1
EOF
+IFS=$saved_IFS
# Separate into logical components for further validation
case $1 in
*-*-*-*-*)
- echo Invalid configuration \`"$1"\': more than four components >&2
+ echo "Invalid configuration '$1': more than four components" >&2
exit 1
;;
*-*-*-*)
basic_machine=$field1-$field2
- os=$field3-$field4
+ basic_os=$field3-$field4
;;
*-*-*)
# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
# parts
maybe_os=$field2-$field3
case $maybe_os in
- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \
- | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \
+ nto-qnx* | linux-* | uclinux-uclibc* \
| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
- | storm-chaos* | os2-emx* | rtmk-nova*)
+ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-*)
basic_machine=$field1
- os=$maybe_os
+ basic_os=$maybe_os
;;
android-linux)
basic_machine=$field1-unknown
- os=linux-android
+ basic_os=linux-android
;;
*)
basic_machine=$field1-$field2
- os=$field3
+ basic_os=$field3
;;
esac
;;
@@ -154,7 +164,7 @@ case $1 in
case $field1-$field2 in
decstation-3100)
basic_machine=mips-dec
- os=
+ basic_os=
;;
*-*)
# Second component is usually, but not always the OS
@@ -162,7 +172,11 @@ case $1 in
# Prevent following clause from handling this valid os
sun*os*)
basic_machine=$field1
- os=$field2
+ basic_os=$field2
+ ;;
+ zephyr*)
+ basic_machine=$field1-unknown
+ basic_os=$field2
;;
# Manufacturers
dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
@@ -175,11 +189,11 @@ case $1 in
| microblaze* | sim | cisco \
| oki | wec | wrs | winbond)
basic_machine=$field1-$field2
- os=
+ basic_os=
;;
*)
basic_machine=$field1
- os=$field2
+ basic_os=$field2
;;
esac
;;
@@ -191,447 +205,451 @@ case $1 in
case $field1 in
386bsd)
basic_machine=i386-pc
- os=bsd
+ basic_os=bsd
;;
a29khif)
basic_machine=a29k-amd
- os=udi
+ basic_os=udi
;;
adobe68k)
basic_machine=m68010-adobe
- os=scout
+ basic_os=scout
;;
alliant)
basic_machine=fx80-alliant
- os=
+ basic_os=
;;
altos | altos3068)
basic_machine=m68k-altos
- os=
+ basic_os=
;;
am29k)
basic_machine=a29k-none
- os=bsd
+ basic_os=bsd
;;
amdahl)
basic_machine=580-amdahl
- os=sysv
+ basic_os=sysv
;;
amiga)
basic_machine=m68k-unknown
- os=
+ basic_os=
;;
amigaos | amigados)
basic_machine=m68k-unknown
- os=amigaos
+ basic_os=amigaos
;;
amigaunix | amix)
basic_machine=m68k-unknown
- os=sysv4
+ basic_os=sysv4
;;
apollo68)
basic_machine=m68k-apollo
- os=sysv
+ basic_os=sysv
;;
apollo68bsd)
basic_machine=m68k-apollo
- os=bsd
+ basic_os=bsd
;;
aros)
basic_machine=i386-pc
- os=aros
+ basic_os=aros
;;
aux)
basic_machine=m68k-apple
- os=aux
+ basic_os=aux
;;
balance)
basic_machine=ns32k-sequent
- os=dynix
+ basic_os=dynix
;;
blackfin)
basic_machine=bfin-unknown
- os=linux
+ basic_os=linux
;;
cegcc)
basic_machine=arm-unknown
- os=cegcc
+ basic_os=cegcc
;;
convex-c1)
basic_machine=c1-convex
- os=bsd
+ basic_os=bsd
;;
convex-c2)
basic_machine=c2-convex
- os=bsd
+ basic_os=bsd
;;
convex-c32)
basic_machine=c32-convex
- os=bsd
+ basic_os=bsd
;;
convex-c34)
basic_machine=c34-convex
- os=bsd
+ basic_os=bsd
;;
convex-c38)
basic_machine=c38-convex
- os=bsd
+ basic_os=bsd
;;
cray)
basic_machine=j90-cray
- os=unicos
+ basic_os=unicos
;;
crds | unos)
basic_machine=m68k-crds
- os=
+ basic_os=
;;
da30)
basic_machine=m68k-da30
- os=
+ basic_os=
;;
decstation | pmax | pmin | dec3100 | decstatn)
basic_machine=mips-dec
- os=
+ basic_os=
;;
delta88)
basic_machine=m88k-motorola
- os=sysv3
+ basic_os=sysv3
;;
dicos)
basic_machine=i686-pc
- os=dicos
+ basic_os=dicos
;;
djgpp)
basic_machine=i586-pc
- os=msdosdjgpp
+ basic_os=msdosdjgpp
;;
ebmon29k)
basic_machine=a29k-amd
- os=ebmon
+ basic_os=ebmon
;;
es1800 | OSE68k | ose68k | ose | OSE)
basic_machine=m68k-ericsson
- os=ose
+ basic_os=ose
;;
gmicro)
basic_machine=tron-gmicro
- os=sysv
+ basic_os=sysv
;;
go32)
basic_machine=i386-pc
- os=go32
+ basic_os=go32
;;
h8300hms)
basic_machine=h8300-hitachi
- os=hms
+ basic_os=hms
;;
h8300xray)
basic_machine=h8300-hitachi
- os=xray
+ basic_os=xray
;;
h8500hms)
basic_machine=h8500-hitachi
- os=hms
+ basic_os=hms
;;
harris)
basic_machine=m88k-harris
- os=sysv3
+ basic_os=sysv3
;;
hp300 | hp300hpux)
basic_machine=m68k-hp
- os=hpux
+ basic_os=hpux
;;
hp300bsd)
basic_machine=m68k-hp
- os=bsd
+ basic_os=bsd
;;
hppaosf)
basic_machine=hppa1.1-hp
- os=osf
+ basic_os=osf
;;
hppro)
basic_machine=hppa1.1-hp
- os=proelf
+ basic_os=proelf
;;
i386mach)
basic_machine=i386-mach
- os=mach
+ basic_os=mach
;;
isi68 | isi)
basic_machine=m68k-isi
- os=sysv
+ basic_os=sysv
;;
m68knommu)
basic_machine=m68k-unknown
- os=linux
+ basic_os=linux
;;
magnum | m3230)
basic_machine=mips-mips
- os=sysv
+ basic_os=sysv
;;
merlin)
basic_machine=ns32k-utek
- os=sysv
+ basic_os=sysv
;;
mingw64)
basic_machine=x86_64-pc
- os=mingw64
+ basic_os=mingw64
;;
mingw32)
basic_machine=i686-pc
- os=mingw32
+ basic_os=mingw32
;;
mingw32ce)
basic_machine=arm-unknown
- os=mingw32ce
+ basic_os=mingw32ce
;;
monitor)
basic_machine=m68k-rom68k
- os=coff
+ basic_os=coff
;;
morphos)
basic_machine=powerpc-unknown
- os=morphos
+ basic_os=morphos
;;
moxiebox)
basic_machine=moxie-unknown
- os=moxiebox
+ basic_os=moxiebox
;;
msdos)
basic_machine=i386-pc
- os=msdos
+ basic_os=msdos
;;
msys)
basic_machine=i686-pc
- os=msys
+ basic_os=msys
;;
mvs)
basic_machine=i370-ibm
- os=mvs
+ basic_os=mvs
;;
nacl)
basic_machine=le32-unknown
- os=nacl
+ basic_os=nacl
;;
ncr3000)
basic_machine=i486-ncr
- os=sysv4
+ basic_os=sysv4
;;
netbsd386)
basic_machine=i386-pc
- os=netbsd
+ basic_os=netbsd
;;
netwinder)
basic_machine=armv4l-rebel
- os=linux
+ basic_os=linux
;;
news | news700 | news800 | news900)
basic_machine=m68k-sony
- os=newsos
+ basic_os=newsos
;;
news1000)
basic_machine=m68030-sony
- os=newsos
+ basic_os=newsos
;;
necv70)
basic_machine=v70-nec
- os=sysv
+ basic_os=sysv
;;
nh3000)
basic_machine=m68k-harris
- os=cxux
+ basic_os=cxux
;;
nh[45]000)
basic_machine=m88k-harris
- os=cxux
+ basic_os=cxux
;;
nindy960)
basic_machine=i960-intel
- os=nindy
+ basic_os=nindy
;;
mon960)
basic_machine=i960-intel
- os=mon960
+ basic_os=mon960
;;
nonstopux)
basic_machine=mips-compaq
- os=nonstopux
+ basic_os=nonstopux
;;
os400)
basic_machine=powerpc-ibm
- os=os400
+ basic_os=os400
;;
OSE68000 | ose68000)
basic_machine=m68000-ericsson
- os=ose
+ basic_os=ose
;;
os68k)
basic_machine=m68k-none
- os=os68k
+ basic_os=os68k
;;
paragon)
basic_machine=i860-intel
- os=osf
+ basic_os=osf
;;
parisc)
basic_machine=hppa-unknown
- os=linux
+ basic_os=linux
+ ;;
+ psp)
+ basic_machine=mipsallegrexel-sony
+ basic_os=psp
;;
pw32)
basic_machine=i586-unknown
- os=pw32
+ basic_os=pw32
;;
rdos | rdos64)
basic_machine=x86_64-pc
- os=rdos
+ basic_os=rdos
;;
rdos32)
basic_machine=i386-pc
- os=rdos
+ basic_os=rdos
;;
rom68k)
basic_machine=m68k-rom68k
- os=coff
+ basic_os=coff
;;
sa29200)
basic_machine=a29k-amd
- os=udi
+ basic_os=udi
;;
sei)
basic_machine=mips-sei
- os=seiux
+ basic_os=seiux
;;
sequent)
basic_machine=i386-sequent
- os=
+ basic_os=
;;
sps7)
basic_machine=m68k-bull
- os=sysv2
+ basic_os=sysv2
;;
st2000)
basic_machine=m68k-tandem
- os=
+ basic_os=
;;
stratus)
basic_machine=i860-stratus
- os=sysv4
+ basic_os=sysv4
;;
sun2)
basic_machine=m68000-sun
- os=
+ basic_os=
;;
sun2os3)
basic_machine=m68000-sun
- os=sunos3
+ basic_os=sunos3
;;
sun2os4)
basic_machine=m68000-sun
- os=sunos4
+ basic_os=sunos4
;;
sun3)
basic_machine=m68k-sun
- os=
+ basic_os=
;;
sun3os3)
basic_machine=m68k-sun
- os=sunos3
+ basic_os=sunos3
;;
sun3os4)
basic_machine=m68k-sun
- os=sunos4
+ basic_os=sunos4
;;
sun4)
basic_machine=sparc-sun
- os=
+ basic_os=
;;
sun4os3)
basic_machine=sparc-sun
- os=sunos3
+ basic_os=sunos3
;;
sun4os4)
basic_machine=sparc-sun
- os=sunos4
+ basic_os=sunos4
;;
sun4sol2)
basic_machine=sparc-sun
- os=solaris2
+ basic_os=solaris2
;;
sun386 | sun386i | roadrunner)
basic_machine=i386-sun
- os=
+ basic_os=
;;
sv1)
basic_machine=sv1-cray
- os=unicos
+ basic_os=unicos
;;
symmetry)
basic_machine=i386-sequent
- os=dynix
+ basic_os=dynix
;;
t3e)
basic_machine=alphaev5-cray
- os=unicos
+ basic_os=unicos
;;
t90)
basic_machine=t90-cray
- os=unicos
+ basic_os=unicos
;;
toad1)
basic_machine=pdp10-xkl
- os=tops20
+ basic_os=tops20
;;
tpf)
basic_machine=s390x-ibm
- os=tpf
+ basic_os=tpf
;;
udi29k)
basic_machine=a29k-amd
- os=udi
+ basic_os=udi
;;
ultra3)
basic_machine=a29k-nyu
- os=sym1
+ basic_os=sym1
;;
v810 | necv810)
basic_machine=v810-nec
- os=none
+ basic_os=none
;;
vaxv)
basic_machine=vax-dec
- os=sysv
+ basic_os=sysv
;;
vms)
basic_machine=vax-dec
- os=vms
+ basic_os=vms
;;
vsta)
basic_machine=i386-pc
- os=vsta
+ basic_os=vsta
;;
vxworks960)
basic_machine=i960-wrs
- os=vxworks
+ basic_os=vxworks
;;
vxworks68)
basic_machine=m68k-wrs
- os=vxworks
+ basic_os=vxworks
;;
vxworks29k)
basic_machine=a29k-wrs
- os=vxworks
+ basic_os=vxworks
;;
xbox)
basic_machine=i686-pc
- os=mingw32
+ basic_os=mingw32
;;
ymp)
basic_machine=ymp-cray
- os=unicos
+ basic_os=unicos
;;
*)
basic_machine=$1
- os=
+ basic_os=
;;
esac
;;
@@ -683,17 +701,17 @@ case $basic_machine in
bluegene*)
cpu=powerpc
vendor=ibm
- os=cnk
+ basic_os=cnk
;;
decsystem10* | dec10*)
cpu=pdp10
vendor=dec
- os=tops10
+ basic_os=tops10
;;
decsystem20* | dec20*)
cpu=pdp10
vendor=dec
- os=tops20
+ basic_os=tops20
;;
delta | 3300 | motorola-3300 | motorola-delta \
| 3300-motorola | delta-motorola)
@@ -703,7 +721,7 @@ case $basic_machine in
dpx2*)
cpu=m68k
vendor=bull
- os=sysv3
+ basic_os=sysv3
;;
encore | umax | mmax)
cpu=ns32k
@@ -712,7 +730,7 @@ case $basic_machine in
elxsi)
cpu=elxsi
vendor=elxsi
- os=${os:-bsd}
+ basic_os=${basic_os:-bsd}
;;
fx2800)
cpu=i860
@@ -725,7 +743,7 @@ case $basic_machine in
h3050r* | hiux*)
cpu=hppa1.1
vendor=hitachi
- os=hiuxwe2
+ basic_os=hiuxwe2
;;
hp3k9[0-9][0-9] | hp9[0-9][0-9])
cpu=hppa1.0
@@ -768,36 +786,36 @@ case $basic_machine in
i*86v32)
cpu=`echo "$1" | sed -e 's/86.*/86/'`
vendor=pc
- os=sysv32
+ basic_os=sysv32
;;
i*86v4*)
cpu=`echo "$1" | sed -e 's/86.*/86/'`
vendor=pc
- os=sysv4
+ basic_os=sysv4
;;
i*86v)
cpu=`echo "$1" | sed -e 's/86.*/86/'`
vendor=pc
- os=sysv
+ basic_os=sysv
;;
i*86sol2)
cpu=`echo "$1" | sed -e 's/86.*/86/'`
vendor=pc
- os=solaris2
+ basic_os=solaris2
;;
j90 | j90-cray)
cpu=j90
vendor=cray
- os=${os:-unicos}
+ basic_os=${basic_os:-unicos}
;;
iris | iris4d)
cpu=mips
vendor=sgi
- case $os in
+ case $basic_os in
irix*)
;;
*)
- os=irix4
+ basic_os=irix4
;;
esac
;;
@@ -808,26 +826,26 @@ case $basic_machine in
*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
cpu=m68k
vendor=atari
- os=mint
+ basic_os=mint
;;
news-3600 | risc-news)
cpu=mips
vendor=sony
- os=newsos
+ basic_os=newsos
;;
next | m*-next)
cpu=m68k
vendor=next
- case $os in
+ case $basic_os in
openstep*)
;;
nextstep*)
;;
ns2*)
- os=nextstep2
+ basic_os=nextstep2
;;
*)
- os=nextstep3
+ basic_os=nextstep3
;;
esac
;;
@@ -838,12 +856,12 @@ case $basic_machine in
op50n-* | op60c-*)
cpu=hppa1.1
vendor=oki
- os=proelf
+ basic_os=proelf
;;
pa-hitachi)
cpu=hppa1.1
vendor=hitachi
- os=hiuxwe2
+ basic_os=hiuxwe2
;;
pbd)
cpu=sparc
@@ -880,12 +898,12 @@ case $basic_machine in
sde)
cpu=mipsisa32
vendor=sde
- os=${os:-elf}
+ basic_os=${basic_os:-elf}
;;
simso-wrs)
cpu=sparclite
vendor=wrs
- os=vxworks
+ basic_os=vxworks
;;
tower | tower-32)
cpu=m68k
@@ -902,7 +920,7 @@ case $basic_machine in
w89k-*)
cpu=hppa1.1
vendor=winbond
- os=proelf
+ basic_os=proelf
;;
none)
cpu=none
@@ -919,11 +937,13 @@ case $basic_machine in
*-*)
# shellcheck disable=SC2162
+ saved_IFS=$IFS
IFS="-" read cpu vendor <<EOF
$basic_machine
EOF
+ IFS=$saved_IFS
;;
- # We use `pc' rather than `unknown'
+ # We use 'pc' rather than 'unknown'
# because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users.
i*86 | x86_64)
@@ -955,11 +975,11 @@ case $cpu-$vendor in
# some cases the only manufacturer, in others, it is the most popular.
craynv-unknown)
vendor=cray
- os=${os:-unicosmp}
+ basic_os=${basic_os:-unicosmp}
;;
c90-unknown | c90-cray)
vendor=cray
- os=${os:-unicos}
+ basic_os=${Basic_os:-unicos}
;;
fx80-unknown)
vendor=alliant
@@ -1000,10 +1020,15 @@ case $cpu-$vendor in
;;
# Here we normalize CPU types with a missing or matching vendor
+ armh-unknown | armh-alt)
+ cpu=armv7l
+ vendor=alt
+ basic_os=${basic_os:-linux-gnueabihf}
+ ;;
dpx20-unknown | dpx20-bull)
cpu=rs6000
vendor=bull
- os=${os:-bosx}
+ basic_os=${basic_os:-bosx}
;;
# Here we normalize CPU types irrespective of the vendor
@@ -1012,7 +1037,7 @@ case $cpu-$vendor in
;;
blackfin-*)
cpu=bfin
- os=linux
+ basic_os=linux
;;
c54x-*)
cpu=tic54x
@@ -1025,7 +1050,7 @@ case $cpu-$vendor in
;;
e500v[12]-*)
cpu=powerpc
- os=$os"spe"
+ basic_os=${basic_os}"spe"
;;
mips3*-*)
cpu=mips64
@@ -1035,7 +1060,7 @@ case $cpu-$vendor in
;;
m68knommu-*)
cpu=m68k
- os=linux
+ basic_os=linux
;;
m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
cpu=s12z
@@ -1045,12 +1070,12 @@ case $cpu-$vendor in
;;
parisc-*)
cpu=hppa
- os=linux
+ basic_os=linux
;;
pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
cpu=i586
;;
- pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+ pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*)
cpu=i686
;;
pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
@@ -1101,11 +1126,14 @@ case $cpu-$vendor in
xscale-* | xscalee[bl]-*)
cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
;;
+ arm64-* | aarch64le-*)
+ cpu=aarch64
+ ;;
# Recognize the canonical CPU Types that limit and/or modify the
# company names they are paired with.
cr16-*)
- os=${os:-elf}
+ basic_os=${basic_os:-elf}
;;
crisv32-* | etraxfs*-*)
cpu=crisv32
@@ -1116,7 +1144,7 @@ case $cpu-$vendor in
vendor=axis
;;
crx-*)
- os=${os:-elf}
+ basic_os=${basic_os:-elf}
;;
neo-tandem)
cpu=neo
@@ -1138,16 +1166,12 @@ case $cpu-$vendor in
cpu=nsx
vendor=tandem
;;
- s390-*)
- cpu=s390
- vendor=ibm
- ;;
- s390x-*)
- cpu=s390x
- vendor=ibm
+ mipsallegrexel-sony)
+ cpu=mipsallegrexel
+ vendor=sony
;;
tile*-*)
- os=${os:-linux-gnu}
+ basic_os=${basic_os:-linux-gnu}
;;
*)
@@ -1163,8 +1187,8 @@ case $cpu-$vendor in
| alphapca5[67] | alpha64pca5[67] \
| am33_2.0 \
| amdgcn \
- | arc | arceb \
- | arm | arm[lb]e | arme[lb] | armv* \
+ | arc | arceb | arc32 | arc64 \
+ | arm | arm[lb]e | arme[lb] | armv* \
| avr | avr32 \
| asmjs \
| ba \
@@ -1183,6 +1207,7 @@ case $cpu-$vendor in
| k1om \
| le32 | le64 \
| lm32 \
+ | loongarch32 | loongarch64 \
| m32c | m32r | m32rle \
| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
@@ -1201,9 +1226,13 @@ case $cpu-$vendor in
| mips64vr5900 | mips64vr5900el \
| mipsisa32 | mipsisa32el \
| mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r3 | mipsisa32r3el \
+ | mipsisa32r5 | mipsisa32r5el \
| mipsisa32r6 | mipsisa32r6el \
| mipsisa64 | mipsisa64el \
| mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r3 | mipsisa64r3el \
+ | mipsisa64r5 | mipsisa64r5el \
| mipsisa64r6 | mipsisa64r6el \
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
@@ -1227,8 +1256,9 @@ case $cpu-$vendor in
| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
| pru \
| pyramid \
- | riscv | riscv32 | riscv64 \
+ | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
| rl78 | romp | rs6000 | rx \
+ | s390 | s390x \
| score \
| sh | shl \
| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
@@ -1238,6 +1268,7 @@ case $cpu-$vendor in
| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
| spu \
| tahoe \
+ | thumbv7* \
| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
| tron \
| ubicom32 \
@@ -1254,7 +1285,7 @@ case $cpu-$vendor in
;;
*)
- echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+ echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2
exit 1
;;
esac
@@ -1275,8 +1306,53 @@ esac
# Decode manufacturer-specific aliases for certain operating systems.
-if [ x$os != x ]
+if test x$basic_os != x
then
+
+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+ gnu/linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+ ;;
+ os2-emx)
+ kernel=os2
+ os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+ ;;
+ nto-qnx*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+ ;;
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+ IFS=$saved_IFS
+ ;;
+ # Default OS when just kernel was specified
+ nto*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+ ;;
+ linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+ ;;
+ managarm*)
+ kernel=managarm
+ os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'`
+ ;;
+ *)
+ kernel=
+ os=$basic_os
+ ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
case $os in
# First match some system type aliases that might get confused
# with valid system types.
@@ -1288,7 +1364,7 @@ case $os in
os=cnk
;;
solaris1 | solaris1.*)
- os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
;;
solaris)
os=solaris2
@@ -1296,9 +1372,6 @@ case $os in
unixware*)
os=sysv4.2uw
;;
- gnu/linux*)
- os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
- ;;
# es1800 is here to avoid being matched by es* (a different OS)
es1800*)
os=ose
@@ -1320,12 +1393,9 @@ case $os in
os=sco3.2v4
;;
sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
- ;;
- sco3.2v[4-9]* | sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
+ os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
;;
- scout)
+ sco*v* | scout)
# Don't match below
;;
sco*)
@@ -1334,78 +1404,25 @@ case $os in
psos*)
os=psos
;;
- # Now accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST end in a * to match a version number.
- # sysv* is not here because it comes later, after sysvr4.
- gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
- | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\
- | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
- | sym* | kopensolaris* | plan9* \
- | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
- | aos* | aros* | cloudabi* | sortix* | twizzler* \
- | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
- | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
- | knetbsd* | mirbsd* | netbsd* \
- | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
- | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \
- | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
- | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
- | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \
- | chorusrdb* | cegcc* | glidix* \
- | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
- | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \
- | linux-newlib* | linux-musl* | linux-uclibc* \
- | uxpv* | beos* | mpeix* | udk* | moxiebox* \
- | interix* | uwin* | mks* | rhapsody* | darwin* \
- | openstep* | oskit* | conix* | pw32* | nonstopux* \
- | storm-chaos* | tops10* | tenex* | tops20* | its* \
- | os2* | vos* | palmos* | uclinux* | nucleus* \
- | morphos* | superux* | rtmk* | windiss* \
- | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
- | skyos* | haiku* | rdos* | toppers* | drops* | es* \
- | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
- | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
- | nsk* | powerunix)
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
qnx*)
- case $cpu in
- x86 | i*86)
- ;;
- *)
- os=nto-$os
- ;;
- esac
+ os=qnx
;;
hiux*)
os=hiuxwe2
;;
- nto-qnx*)
- ;;
- nto*)
- os=`echo $os | sed -e 's|nto|nto-qnx|'`
- ;;
- sim | xray | os68k* | v88r* \
- | windows* | osx | abug | netware* | os9* \
- | macos* | mpw* | magic* | mmixware* | mon960* | lnews*)
- ;;
- linux-dietlibc)
- os=linux-dietlibc
- ;;
- linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
- ;;
lynx*178)
os=lynxos178
;;
lynx*5)
os=lynxos5
;;
+ lynxos*)
+ # don't get caught up in next wildcard
+ ;;
lynx*)
os=lynxos
;;
- mac*)
+ mac[0-9]*)
os=`echo "$os" | sed -e 's|mac|macos|'`
;;
opened*)
@@ -1452,7 +1469,7 @@ case $os in
;;
# Preserve the version number of sinix5.
sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
+ os=`echo "$os" | sed -e 's|sinix|sysv|'`
;;
sinix*)
os=sysv4
@@ -1475,18 +1492,12 @@ case $os in
sysvr4)
os=sysv4
;;
- # This must come after sysvr4.
- sysv*)
- ;;
ose*)
os=ose
;;
*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
os=mint
;;
- zvmoe)
- os=zvmoe
- ;;
dicos*)
os=dicos
;;
@@ -1503,19 +1514,11 @@ case $os in
;;
esac
;;
- nacl*)
- ;;
- ios)
- ;;
- none)
- ;;
- *-eabi)
- ;;
*)
- echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
- exit 1
+ # No normalization, but not necessarily accepted, that comes below.
;;
esac
+
else
# Here we handle the default operating systems that come with various machines.
@@ -1528,6 +1531,7 @@ else
# will signal an error saying that MANUFACTURER isn't an operating
# system, and we'll never get to this point.
+kernel=
case $cpu-$vendor in
score-*)
os=elf
@@ -1539,7 +1543,8 @@ case $cpu-$vendor in
os=riscix1.2
;;
arm*-rebel)
- os=linux
+ kernel=linux
+ os=gnu
;;
arm*-semi)
os=aout
@@ -1705,84 +1710,193 @@ case $cpu-$vendor in
os=none
;;
esac
+
fi
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+ # Sometimes we do "kernel-libc", so those need to count as OSes.
+ musl* | newlib* | relibc* | uclibc*)
+ ;;
+ # Likewise for "kernel-abi"
+ eabi* | gnueabi*)
+ ;;
+ # VxWorks passes extra cpu info in the 4th filed.
+ simlinux | simwindows | spe)
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+ | os9* | macos* | osx* | ios* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* | serenity* \
+ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+ | openstep* | oskit* | conix* | pw32* | nonstopux* \
+ | storm-chaos* | tops10* | tenex* | tops20* | its* \
+ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
+ | fiwix* | mlibc* )
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
+ none)
+ ;;
+ kernel* )
+ # Restricted further below
+ ;;
+ *)
+ echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2
+ exit 1
+ ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+ | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* )
+ ;;
+ uclinux-uclibc* )
+ ;;
+ managarm-mlibc* | managarm-kernel* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+ echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ -kernel* )
+ echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ *-kernel* )
+ echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2
+ exit 1
+ ;;
+ kfreebsd*-gnu* | kopensolaris*-gnu*)
+ ;;
+ vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+ ;;
+ nto-qnx*)
+ ;;
+ os2-emx)
+ ;;
+ *-eabi* | *-gnueabi*)
+ ;;
+ -*)
+ # Blank kernel with real OS is always fine.
+ ;;
+ *-*)
+ echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2
+ exit 1
+ ;;
+esac
+
# Here we handle the case where we know the os, and the CPU type, but not the
# manufacturer. We pick the logical manufacturer.
case $vendor in
unknown)
- case $os in
- riscix*)
+ case $cpu-$os in
+ *-riscix*)
vendor=acorn
;;
- sunos*)
+ *-sunos*)
vendor=sun
;;
- cnk*|-aix*)
+ *-cnk* | *-aix*)
vendor=ibm
;;
- beos*)
+ *-beos*)
vendor=be
;;
- hpux*)
+ *-hpux*)
vendor=hp
;;
- mpeix*)
+ *-mpeix*)
vendor=hp
;;
- hiux*)
+ *-hiux*)
vendor=hitachi
;;
- unos*)
+ *-unos*)
vendor=crds
;;
- dgux*)
+ *-dgux*)
vendor=dg
;;
- luna*)
+ *-luna*)
vendor=omron
;;
- genix*)
+ *-genix*)
vendor=ns
;;
- clix*)
+ *-clix*)
vendor=intergraph
;;
- mvs* | opened*)
+ *-mvs* | *-opened*)
+ vendor=ibm
+ ;;
+ *-os400*)
vendor=ibm
;;
- os400*)
+ s390-* | s390x-*)
vendor=ibm
;;
- ptx*)
+ *-ptx*)
vendor=sequent
;;
- tpf*)
+ *-tpf*)
vendor=ibm
;;
- vxsim* | vxworks* | windiss*)
+ *-vxsim* | *-vxworks* | *-windiss*)
vendor=wrs
;;
- aux*)
+ *-aux*)
vendor=apple
;;
- hms*)
+ *-hms*)
vendor=hitachi
;;
- mpw* | macos*)
+ *-mpw* | *-macos*)
vendor=apple
;;
- *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
vendor=atari
;;
- vos*)
+ *-vos*)
vendor=stratus
;;
esac
;;
esac
-echo "$cpu-$vendor-$os"
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
exit
# Local variables:
diff --git a/graphics/asymptote/configure b/graphics/asymptote/configure
index 38dd93bbb9..ec00085b11 100755
--- a/graphics/asymptote/configure
+++ b/graphics/asymptote/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for Asymptote 2.90.
+# Generated by GNU Autoconf 2.71 for Asymptote 3.00.
#
# Report bugs to <https://github.com/vectorgraphics/asymptote/issues>.
#
@@ -182,7 +182,8 @@ test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
- test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
if (eval "$as_required") 2>/dev/null
then :
as_have_required=yes
@@ -611,8 +612,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='Asymptote'
PACKAGE_TARNAME='asymptote'
-PACKAGE_VERSION='2.90'
-PACKAGE_STRING='Asymptote 2.90'
+PACKAGE_VERSION='3.00'
+PACKAGE_STRING='Asymptote 3.00'
PACKAGE_BUGREPORT='https://github.com/vectorgraphics/asymptote/issues'
PACKAGE_URL=''
@@ -653,22 +654,31 @@ ac_header_cxx_list=
ac_func_cxx_list=
ac_subst_vars='LTLIBOBJS
LIBOBJS
-PTHREAD_CFLAGS
-PTHREAD_LIBS
-PTHREAD_CC
-ax_pthread_config
GLEW
OPTIONS
+CXX_STANDARD
INCL
LSPLIBS
LSPLIB
GCPPLIB
GCLIB
GCOPTIONS
-ATOMICVERSION
ASYGLVERSION
-GCVERSION
getopt
+TINYEXR_ROOT
+LSP_BUILD_ROOT
+LSP_CMAKE_OPTIONS
+LSP_CXX_BUILD_FLAGS
+LSP_ROOT
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CXX
+PTHREAD_CC
+ax_pthread_config
+EGREP
+GREP
+CPP
+SED
FLEX
BISON
SET_MAKE
@@ -685,7 +695,19 @@ contextdir
latexdir
TEXI2DVI
kpsewhich
+has_vcpkg
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
Datadir
+target_os
+target_vendor
+target_cpu
+target
host_os
host_vendor
host_cpu
@@ -694,13 +716,6 @@ build_os
build_vendor
build_cpu
build
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
VERSION
target_alias
host_alias
@@ -745,25 +760,27 @@ ac_subst_files=''
ac_user_opts='
enable_option_checking
enable_lsp
+with_vcpkg
with_latex
with_context
with_docdir
enable_texlive_build
-enable_gc
-enable_gc_debug
-enable_gc_full_debug
+with_vcpkg_target_triplet
+with_vcpkg_host_triplet
enable_threads
enable_sigsegv
enable_readline
enable_static
+enable_gc
+enable_gc_debug
+enable_gc_full_debug
enable_curl
enable_fftw
enable_eigen
-enable_xdr
enable_gsl
enable_gl
enable_offscreen
-enable_OpenImageIO
+enable_xdr
'
ac_precious_vars='build_alias
host_alias
@@ -777,7 +794,8 @@ CXX
CXXFLAGS
CCC
BISON
-FLEX'
+FLEX
+CPP'
# Initialize some variables set by options.
@@ -1326,7 +1344,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures Asymptote 2.90 to adapt to many kinds of systems.
+\`configure' configures Asymptote 3.00 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1387,12 +1405,13 @@ _ACEOF
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of Asymptote 2.90:";;
+ short | recursive ) echo "Configuration of Asymptote 3.00:";;
esac
cat <<\_ACEOF
@@ -1402,31 +1421,40 @@ Optional Features:
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-lsp[=yes] enable Language Server Protocol
--enable-texlive-build automatically determine sysdir from kpsewhich
- --enable-gc[=system] enable system Boehm garbage collector
- [=VERSION] enable local VERSION of Boehm garbage collector
- [=PREFIX] use Boehm garbage collector installed in PREFIX
- --enable-gc-debug enable (slow) garbage collector debugging
- --enable-gc-full-debug enable (very slow) garbage collector backtrace
--enable-threads[=yes] enable POSIX threads
+
--enable-sigsegv[=yes] enable GNU Stack Overflow Handler
--enable-readline[=yes] enable GNU Readline Library
--enable-static[=no] link against static libraries
+ --enable-gc[=yes] enable local $GCNAME
+ --enable-gc-debug enable (slow) garbage collector debugging
+ --enable-gc-full-debug enable (very slow) garbage collector backtrace
--enable-curl[=yes] enable libcurl and compile with optional URL support
--enable-fftw[=yes] enable FFTW Library
--enable-eigen[=yes] enable Eigen Library
- --enable-xdr[=yes] enable XDR/V3D support
--enable-gsl[=yes] enable GNU Scientific Library
--enable-gl[=yes] enable OpenGL Library
--enable-offscreen[=no] use OSMesa library to implement offscreen rendering
- --enable-openimageio[=no]
- enable experimental OpenImageIO Library
+ --enable-xdr[=yes] enable XDR/V3D support
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-vcpkg=[no] Use vcpkg. If VCPKG_ROOT environment variable is
+ set, will use that vcpkg. Otherwise searches in
+ PATH.
+
--with-latex=PATH specify path to LaTeX installation
--with-context=PATH specify path to ConTeXt installation
--with-docdir=PATH alternate documentation installation directory
+ --with-vcpkg-target-triplet=<target-triplet>
+ specify custom vcpkg triplet. This option is only
+ relevant if vcpkg is used. If left blank, will try
+ to determine the triplet
+ --with-vcpkg-host-triplet=<host-triplet>
+ specify custom vcpkg host triplet. This option is
+ only relevant if vcpkg is ued. If left blank, will
+ try to determine the triplet
Some influential environment variables:
CC C compiler command
@@ -1440,6 +1468,7 @@ Some influential environment variables:
CXXFLAGS C++ compiler flags
BISON bison command
FLEX flex command
+ CPP C preprocessor
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
@@ -1508,7 +1537,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-Asymptote configure 2.90
+Asymptote configure 3.00
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1723,6 +1752,91 @@ fi
} # ac_fn_cxx_try_link
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
# ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES
# ---------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
@@ -1818,53 +1932,6 @@ printf "%s\n" "$ac_res" >&6; }
} # ac_fn_cxx_check_func
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-printf "%s\n" "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- test -x conftest$ac_exeext
- }
-then :
- ac_retval=0
-else $as_nop
- printf "%s\n" "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES
# ---------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
@@ -1988,7 +2055,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by Asymptote $as_me 2.90, which was
+It was created by Asymptote $as_me 3.00, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@@ -2965,7 +3032,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
VERSION=$PACKAGE_VERSION
# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# https://www.gnu.org/software/autoconf-archive/ax_pthread.html
# ===========================================================================
#
# SYNOPSIS
@@ -2980,24 +3047,28 @@ VERSION=$PACKAGE_VERSION
# flags that are needed. (The user can also force certain compiler
# flags/libs to be tested by setting these environment variables.)
#
-# Also sets PTHREAD_CC to any special C compiler that is needed for
-# multi-threaded programs (defaults to the value of CC otherwise). (This
-# is necessary on AIX to use the special cc_r compiler alias.)
+# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is
+# needed for multi-threaded programs (defaults to the value of CC
+# respectively CXX otherwise). (This is necessary on e.g. AIX to use the
+# special cc_r/CC_r compiler alias.)
#
# NOTE: You are assumed to not only compile your program with these flags,
-# but also link it with them as well. e.g. you should link with
+# but also to link with them as well. For example, you might link with
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
#
-# If you are only building threads programs, you may wish to use these
+# If you are only building threaded programs, you may wish to use these
# variables in your default LIBS, CFLAGS, and CC:
#
# LIBS="$PTHREAD_LIBS $LIBS"
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS"
# CC="$PTHREAD_CC"
+# CXX="$PTHREAD_CXX"
#
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
-# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
-# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
+# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
#
# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
@@ -3021,6 +3092,7 @@ VERSION=$PACKAGE_VERSION
#
# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+# Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
#
# 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 the
@@ -3033,7 +3105,7 @@ VERSION=$PACKAGE_VERSION
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
+# with this program. If not, see <https://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
@@ -3048,7 +3120,7 @@ VERSION=$PACKAGE_VERSION
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
-#serial 18
+#serial 31
# This is what autoupdate's m4 run will expand. It fires the warning
# (with _au_warn_XXX), outputs it into the updated configure.ac (with
@@ -3101,6 +3173,143 @@ VERSION=$PACKAGE_VERSION
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
+else
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+test "$prefix" = NONE && prefix=/usr/local
+Datadir=$datadir
+test "$Datadir" = '${datarootdir}' && Datadir=$datarootdir
+test "$Datadir" = '${prefix}/share' && Datadir=$prefix/share
+
+
+# Check whether --enable-lsp was given.
+if test ${enable_lsp+y}
+then :
+ enableval=$enable_lsp;
+fi
+
+cxxstd="c++17"
+
+CXXFLAGS=$CXXFLAGS" -std=$cxxstd"
+
+test "$CFLAGS" || CFLAGS="-g -O3"
+
+
+
+
+
+
@@ -4340,13 +4549,15 @@ fi
printf "%s\n" "$ac_cv_c_bigendian" >&6; }
case $ac_cv_c_bigendian in #(
yes)
- printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h
+
+printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h
;; #(
no)
;; #(
universal)
-printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+printf "%s\n" "#define UNIVERSAL_ENDIAN_BUILD 1" >>confdefs.h
+
;; #(
*)
@@ -4355,106 +4566,114 @@ printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
esac
+echo Compiling with $CXXFLAGS $CFLAGS
+# --------------- external refs ---------------------------
- # Make sure we can run config.sub.
-$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+# we need LSP regardless
+EXTERNAL_CODE_ROOT=.
+EXTERNAL_BUILD_ROOT=.
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-printf %s "checking build system type... " >&6; }
-if test ${ac_cv_build+y}
+# --------------- begin vcpkg option/check ---------------------
+# result:
+# with_vcpkg is yes/no, depending if user wants to use vcpkg or not
+# vcpkg_exec is the executable of vcpkg. this is only given if use_vcpkg is yes.
+
+
+# Check whether --with-vcpkg was given.
+if test ${with_vcpkg+y}
+then :
+ withval=$with_vcpkg;
+ if test "x$VCPKG_ROOT" = "x"; then # vcpkg root not given
+ echo "VCPKG_ROOT is not given; searching vcpkg in path"
+ # Extract the first word of "vcpkg", so it can be a program name with args.
+set dummy vcpkg; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_has_vcpkg+y}
then :
printf %s "(cached) " >&6
else $as_nop
- ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
-test "x$ac_build_alias" = x &&
- as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+ if test -n "$has_vcpkg"; then
+ ac_cv_prog_has_vcpkg="$has_vcpkg" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_has_vcpkg="true"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-printf "%s\n" "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+fi
+has_vcpkg=$ac_cv_prog_has_vcpkg
+if test -n "$has_vcpkg"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $has_vcpkg" >&5
+printf "%s\n" "$has_vcpkg" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-printf %s "checking host system type... " >&6; }
-if test ${ac_cv_host+y}
+ if test "x$has_vcpkg" = "xtrue"; then
+ vcpkg_exec=vcpkg
+ fi
+ else
+ echo "VCPKG_ROOT is given; is using VCPKG_ROOT"
+ as_ac_File=`printf "%s\n" "ac_cv_file_$VCPKG_ROOT/vcpkg" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $VCPKG_ROOT/vcpkg" >&5
+printf %s "checking for $VCPKG_ROOT/vcpkg... " >&6; }
+if eval test \${$as_ac_File+y}
then :
printf %s "(cached) " >&6
else $as_nop
- if test "x$host_alias" = x; then
- ac_cv_host=$ac_cv_build
+ test "$cross_compiling" = yes &&
+ as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
+if test -r "$VCPKG_ROOT/vcpkg"; then
+ eval "$as_ac_File=yes"
else
- ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
- as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+ eval "$as_ac_File=no"
fi
-
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-printf "%s\n" "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+eval ac_res=\$$as_ac_File
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_File"\" = x"yes"
+then :
+ vcpkg_exec=$VCPKG_ROOT/vcpkg
+fi
-test "$prefix" = NONE && prefix=/usr/local
-Datadir=$datadir
-test "$Datadir" = '${datarootdir}' && Datadir=$datarootdir
-test "$Datadir" = '${prefix}/share' && Datadir=$prefix/share
+ fi
+ # ensure vcpkg is specified
+ if test "x$vcpkg_exec" = "x"; then
+ as_fn_error $? "Please ensure vcpkg is available through VCPKG_ROOT or in PATH" "$LINENO" 5
+ fi
+ echo "Using vcpkg executable $vcpkg_exec"
-# Check whether --enable-lsp was given.
-if test ${enable_lsp+y}
-then :
- enableval=$enable_lsp;
-fi
+else $as_nop
+
+with_vcpkg=no
-if test "x$enable_lsp" != "xno"; then
-cxxstd="c++14"
-else
-cxxstd="c++11"
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Language Server Protocol disabled by configure flag ***" >&5
-printf "%s\n" "$as_me: *** Language Server Protocol disabled by configure flag ***" >&6;}
fi
-test "$CXXFLAGS" || CXXFLAGS="-std=$cxxstd"
-echo Compiling with $CXXFLAGS
-test "$CFLAGS" || CFLAGS="-g -O3"
+#----------------- end vcpkg option check --------------------
# Check whether --with-latex was given.
@@ -6671,306 +6890,522 @@ fi
-ac_fn_cxx_check_header_compile "$LINENO" "tr1/unordered_map" "ac_cv_header_tr1_unordered_map" "$ac_includes_default"
-if test "x$ac_cv_header_tr1_unordered_map" = xyes
-then :
+ASYGLVERSION=1.02
-fi
+DEFS=""
+OPTIONS=$OPTIONS"-D_FILE_OFFSET_BITS=64 "
+INCL=""
+OPTIONS=""
+LIBS=""
+CPPFLAGS=$CPPFLAGS" -I. "
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <tr1/unordered_map>
- std::tr1::unordered_map<int,int> map;
+# ------------- vcpkg initialization ---------------
+# vcpkg_triplet
-int
-main (void)
-{
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"
+# Check whether --with-vcpkg-target-triplet was given.
+if test ${with_vcpkg_target_triplet+y}
then :
-
-printf "%s\n" "#define HAVE_TR1_UNORDERED_MAP 1" >>confdefs.h
+ withval=$with_vcpkg_target_triplet; # given
+ if test "x$with_vcpkg" != "xno" -a "x$withval" != "xno"; then
+ vcpkg_triplet=$withval
+ fi
else $as_nop
+ # not given
+ if test "x$with_vcpkg" != "xno"; then
+ case $target_cpu in
+ x86_64)
+ triplet_arch=x64
+ ;;
+ aarch64)
+ triplet_arch=arm64
+ ;;
+ i*86)
+ triplet_arch=x86
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Cannot determine architecture, will leave triplet blank" >&5
+printf "%s\n" "$as_me: Cannot determine architecture, will leave triplet blank" >&6;}
+ ;;
+ esac
- ac_fn_cxx_check_header_compile "$LINENO" "unordered_map" "ac_cv_header_unordered_map" "$ac_includes_default"
-if test "x$ac_cv_header_unordered_map" = xyes
-then :
+ case "$OSTYPE" in
+ darwin*)
+ triplet_os=osx
+ ;;
+ *)
+ triplet_os=linux
+ ;;
+ esac
-printf "%s\n" "#define HAVE_UNORDERED_MAP 1" >>confdefs.h
+ if test "x$triplet_arch" != "x" -a "x$triplet_os" != "x"; then
+ vcpkg_triplet="${triplet_arch}-${triplet_os}"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Determined vcpkg triplet as $vcpkg_triplet" >&5
+printf "%s\n" "$as_me: Determined vcpkg triplet as $vcpkg_triplet" >&6;}
+ else
+ as_fn_error $? "Cannot determine vcpkg triplet for usage" "$LINENO" 5
+ fi
+ fi
-else $as_nop
- ac_fn_cxx_check_header_compile "$LINENO" "ext/hash_map" "ac_cv_header_ext_hash_map" "$ac_includes_default"
-if test "x$ac_cv_header_ext_hash_map" = xyes
-then :
-else $as_nop
- OPTIONS=$OPTIONS"-DNOHASH "
fi
-fi
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-ASYGLVERSION=1.02
+if test "x$with_vcpkg" != "xno"; then
+ VCPKG_INSTALL_ARGUMENTS="--triplet=$vcpkg_triplet "
+ VCPKG_PKG_CONFIG_LOC="vcpkg_installed/$vcpkg_triplet/lib/pkgconfig"
+ INCL=$INCL" -Ivcpkg_installed/$vcpkg_triplet/include"
+ LIBS=$LIBS"-Lvcpkg_installed/$vcpkg_triplet/lib "
-GCVERSION=8.2.4
-ATOMICVERSION=7.6.12
+ VCPKG_LIBS_TO_USE_PKG_CONFIG=""
-GCFILE=gc-$GCVERSION
-ac_cv_use_gc="system"
-as_ac_File=`printf "%s\n" "ac_cv_file_$GCFILE.tar.gz" | $as_tr_sh`
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $GCFILE.tar.gz" >&5
-printf %s "checking for $GCFILE.tar.gz... " >&6; }
-if eval test \${$as_ac_File+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- test "$cross_compiling" = yes &&
- as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
-if test -r "$GCFILE.tar.gz"; then
- eval "$as_ac_File=yes"
-else
- eval "$as_ac_File=no"
-fi
-fi
-eval ac_res=\$$as_ac_File
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-printf "%s\n" "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_File"\" = x"yes"
-then :
- ac_cv_use_gc=$GCVERSION
fi
-# Check whether --enable-gc was given.
-if test ${enable_gc+y}
+
+
+# Check whether --with-vcpkg-host-triplet was given.
+if test ${with_vcpkg_host_triplet+y}
then :
- enableval=$enable_gc;
- if test "x$enableval" != "xyes" ; then
- ac_cv_use_gc=$enableval
- fi
+ withval=$with_vcpkg_host_triplet; # given
+ if test "x$with_vcpkg" != "xno" -a "x$withval" != "xno"; then
+ VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--host-triplet=$withval "
+ fi
fi
-OPTIONS="-D_FILE_OFFSET_BIS=64 "
-GCLIB=
-GCPPLIB=
-INCL="-I."
-GCNAME="Boehm Garbage Collector"
-if test "x$ac_cv_use_gc" != "xno" ; then
- OPTIONS=$OPTIONS"-DUSEGC -DLSPCPP_USEGC "
- case _$ac_cv_use_gc in
- _|_system|_*[\\/]*)
- if test "x$ac_cv_use_gc" = "xsystem" ; then
- INCL="-I. -I$prefix/include/gc -I/usr/include/gc"
- LIBS=$LIBS"-L$prefix/lib "
- else
- INCL="-I$ac_cv_use_gc/include/gc"
- LIBS=$LIBS"-L$ac_cv_use_gc/lib "
- fi
- CPPFLAGS_SAVE=$CPPFLAGS
- CPPFLAGS=$CPPFLAGS" $INCL"
- ac_fn_cxx_check_header_compile "$LINENO" "gc.h" "ac_cv_header_gc_h" "$ac_includes_default"
-if test "x$ac_cv_header_gc_h" = xyes
-then :
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GC_malloc in -lgc" >&5
-printf %s "checking for GC_malloc in -lgc... " >&6; }
-if test ${ac_cv_lib_gc_GC_malloc+y}
+
+
+# Checks for libraries.
+#AC_SEARCH_LIBS([lgamma],[m c],,
+#AC_MSG_ERROR([*** Please install libm on your system ***]))
+
+# ----------------- zlib ----------------------------
+if test "x$with_vcpkg" != "xno"; then
+ VCPKG_LIBS_TO_USE_PKG_CONFIG=$VCPKG_LIBS_TO_USE_PKG_CONFIG"zlib "
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for deflate in -lz" >&5
+printf %s "checking for deflate in -lz... " >&6; }
+if test ${ac_cv_lib_z_deflate+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgc $LIBS"
+LIBS="-lz $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
namespace conftest {
- extern "C" int GC_malloc ();
+ extern "C" int deflate ();
}
int
main (void)
{
-return conftest::GC_malloc ();
+return conftest::deflate ();
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"
then :
- ac_cv_lib_gc_GC_malloc=yes
+ ac_cv_lib_z_deflate=yes
else $as_nop
- ac_cv_lib_gc_GC_malloc=no
+ ac_cv_lib_z_deflate=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gc_GC_malloc" >&5
-printf "%s\n" "$ac_cv_lib_gc_GC_malloc" >&6; }
-if test "x$ac_cv_lib_gc_GC_malloc" = xyes
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflate" >&5
+printf "%s\n" "$ac_cv_lib_z_deflate" >&6; }
+if test "x$ac_cv_lib_z_deflate" = xyes
then :
+ printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h
+
+ LIBS="-lz $LIBS"
- LIBS=$LIBS"-lgc "
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: enabling system $GCNAME" >&5
-printf "%s\n" "$as_me: enabling system $GCNAME" >&6;}
else $as_nop
+ as_fn_error $? "*** Please install libz or zlib-devel on your system ***" "$LINENO" 5
- GCDIR=$GCFILE
- INCL="-I. -I\$(GC)/include"
- GCLIB="\$(GC)/.libs/libgc.a"
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $GCNAME library not found" >&5
-printf "%s\n" "$as_me: $GCNAME library not found" >&6;}
fi
-else $as_nop
- GCDIR=$GCFILE
- GCLIB="\$(GC)/.libs/libgc.a"
- INCL="-I. -I\$(GC)/include"
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $GCNAME header file not found" >&5
-printf "%s\n" "$as_me: $GCNAME header file not found" >&6;}
fi
- CPPFLAGS=$CPPFLAGS_SAVE
- ;;
- *)
- GCVERSION=$ac_cv_use_gc
- GCFILE=gc-$GCVERSION
- GCDIR=$GCFILE
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: enabling local $GCNAME $GCDIR" >&5
-printf "%s\n" "$as_me: enabling local $GCNAME $GCDIR" >&6;}
- GCLIB="\$(GC)/.libs/libgc.a"
- INCL="-I. -I\$(GC)/include"
- ;;
- esac
-else
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: disabling the $GCNAME" >&5
-printf "%s\n" "$as_me: disabling the $GCNAME" >&6;}
-fi
+printf "%s\n" "#define HAVE_ZLIB 1" >>confdefs.h
+
+
+# -------------- threads -------------------
-# Check whether --enable-gc-debug was given.
-if test ${enable_gc_debug+y}
-then :
- enableval=$enable_gc_debug; if test "x$ac_cv_use_gc" != "xno" ; then
- if test "x$enableval" = "xyes" ; then
- OPTIONS=$OPTIONS"-DGC_DEBUG "
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Enabling GC debugging: remember to make clean ***" >&5
-printf "%s\n" "$as_me: *** Enabling GC debugging: remember to make clean ***" >&6;}
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Set the environment variable GC_FIND_LEAK at runtime ***" >&5
-printf "%s\n" "$as_me: *** Set the environment variable GC_FIND_LEAK at runtime ***" >&6;}
- fi
- fi
+GCOPTIONS="--disable-shared --disable-dependency-tracking"
+# Check whether --enable-threads was given.
+if test ${enable_threads+y}
+then :
+ enableval=$enable_threads;
fi
-# Check whether --enable-gc-full-debug was given.
-if test ${enable_gc_full_debug+y}
+if test "x$enable_threads" != "xno"; then
+ if test "x$with_vcpkg" != "xno"; then
+ VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--x-feature=threading "
+ printf "%s\n" "#define HAVE_PTHREAD 1" >>confdefs.h
+
+ OPTIONS=$OPTIONS" -pthread"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
then :
- enableval=$enable_gc_full_debug; if test "x$ac_cv_use_gc" != "xno" ; then
- if test "x$enableval" = "xyes" ; then
- OPTIONS=$OPTIONS"-DGC_DEBUG -DGC_BACKTRACE "
- GCOPTIONS=$GCOPTIONS"--enable-gc-debug "
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Enabling GC backtrace debugging; remember to make gc-clean ***" >&5
-printf "%s\n" "$as_me: *** Enabling GC backtrace debugging; remember to make gc-clean ***" >&6;}
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in sed gsed
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
fi
- fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
fi
-
-if test "$OSTYPE" = "msdos"; then
-CPPFLAGS=$CPPFLAGS" -D__MSDOS__ -I/usr/include/w32api -I/usr/include -DCALLBACK=__stdcall $INCL"
-else
-CPPFLAGS=$CPPFLAGS" $INCL"
fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
-ac_fn_cxx_check_func "$LINENO" "getopt_long_only" "ac_cv_func_getopt_long_only"
-if test "x$ac_cv_func_getopt_long_only" = xyes
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test ${ac_cv_prog_CPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CC needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
then :
-printf "%s\n" "#define HAVE_GNU_GETOPT_H 1" >>confdefs.h
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
else $as_nop
- getopt="getopt getopt1"
+ # Passes both tests.
+ac_preproc_ok=:
+break
fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+ done
+ ac_cv_prog_CPP=$CPP
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
-# Checks for libraries.
-#AC_SEARCH_LIBS([lgamma],[m c],,
-#AC_MSG_ERROR([*** Please install libm on your system ***]))
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for deflate in -lz" >&5
-printf %s "checking for deflate in -lz... " >&6; }
-if test ${ac_cv_lib_z_deflate+y}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
then :
printf %s "(cached) " >&6
else $as_nop
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lz $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
-namespace conftest {
- extern "C" int deflate ();
-}
-int
-main (void)
-{
-return conftest::deflate ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"
-then :
- ac_cv_lib_z_deflate=yes
-else $as_nop
- ac_cv_lib_z_deflate=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflate" >&5
-printf "%s\n" "$ac_cv_lib_z_deflate" >&6; }
-if test "x$ac_cv_lib_z_deflate" = xyes
-then :
- printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h
- LIBS="-lz $LIBS"
-
-else $as_nop
- as_fn_error $? "*** Please install libz or zlib-devel on your system ***" "$LINENO" 5
+ fi
fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
-GCOPTIONS="--disable-shared "
-# Check whether --enable-threads was given.
-if test ${enable_threads+y}
-then :
- enableval=$enable_threads;
-fi
-if test "x$enable_threads" != "xno"; then
ac_ext=c
@@ -6982,19 +7417,28 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
ax_pthread_ok=no
# We used to check for pthread.h first, but this fails if pthread.h
-# requires special compiler flags (e.g. on True64 or Sequent).
+# requires special compiler flags (e.g. on Tru64 or Sequent).
# It gets checked for in the link test anyway.
# First of all, check if the user has set any of the PTHREAD_LIBS,
# etcetera environment variables, and if threads linking works using
# them:
-if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
- save_CFLAGS="$CFLAGS"
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+ ax_pthread_save_CC="$CC"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ if test "x$PTHREAD_CC" != "x"
+then :
+ CC="$PTHREAD_CC"
+fi
+ if test "x$PTHREAD_CXX" != "x"
+then :
+ CXX="$PTHREAD_CXX"
+fi
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- save_LIBS="$LIBS"
LIBS="$PTHREAD_LIBS $LIBS"
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
-printf %s "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5
+printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -7018,12 +7462,13 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
printf "%s\n" "$ax_pthread_ok" >&6; }
- if test x"$ax_pthread_ok" = xno; then
+ if test "x$ax_pthread_ok" = "xno"; then
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CC="$ax_pthread_save_CC"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
fi
# We must check for the threads library under a number of different
@@ -7031,12 +7476,14 @@ fi
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
# libraries is broken (non-POSIX).
-# Create a list of thread flags to try. Items starting with a "-" are
-# C compiler flags, and other items are library names, except for "none"
-# which indicates that we try without any flags at all, and "pthread-config"
-# which is a program returning the flags for the Pth emulation library.
+# Create a list of thread flags to try. Items with a "," contain both
+# C compiler flags (before ",") and linker flags (after ","). Other items
+# starting with a "-" are C compiler flags, and remaining items are
+# library names, except for "none" which indicates that we try without
+# any flags at all, and "pthread-config" which is a program returning
+# the flags for the Pth emulation library.
-ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
# The ordering *is* (sometimes) important. Some notes on the
# individual items follow:
@@ -7045,51 +7492,178 @@ ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt
# none: in case threads are in libc; should be tried before -Kthread and
# other compiler flags to prevent continual compiler warnings
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
-# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
-# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
-# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
-# -pthreads: Solaris/gcc
-# -mthreads: Mingw32/gcc, Lynx/gcc
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+# (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
-# doesn't hurt to check since this sometimes defines pthreads too;
-# also defines -D_REENTRANT)
-# ... -mt is also the pthreads flag for HP/aCC
+# doesn't hurt to check since this sometimes defines pthreads and
+# -D_REENTRANT too), HP C (must be checked before -lpthread, which
+# is present but should not be used directly; and before -mthreads,
+# because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
# pthread: Linux, etcetera
# --thread-safe: KAI C++
# pthread-config: use pthread-config program (for GNU Pth library)
-case ${host_os} in
+case $host_os in
+
+ freebsd*)
+
+ # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+ # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+ ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+ ;;
+
+ hpux*)
+
+ # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+ # multi-threading and also sets -lpthread."
+
+ ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+ ;;
+
+ openedition*)
+
+ # IBM z/OS requires a feature-test macro to be defined in order to
+ # enable POSIX threads at all, so give the user a hint if this is
+ # not set. (We don't define these ourselves, as they can affect
+ # other portions of the system API in unpredictable ways.)
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+ AX_PTHREAD_ZOS_MISSING
+# endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5
+printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;}
+fi
+rm -rf conftest*
+
+ ;;
+
solaris*)
# On Solaris (at least, for some versions), libc contains stubbed
# (non-functional) versions of the pthreads routines, so link-based
- # tests will erroneously succeed. (We need to link with -pthreads/-mt/
- # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
- # a function called by this macro, so we could check for that, but
- # who knows whether they'll stub that too in a future libc.) So,
- # we'll just look for -pthreads and -lpthread first:
+ # tests will erroneously succeed. (N.B.: The stubs are missing
+ # pthread_cleanup_push, or rather a function called by this macro,
+ # so we could check for that, but who knows whether they'll stub
+ # that too in a future libc.) So we'll check first for the
+ # standard Solaris way of linking pthreads (-mt -lpthread).
+
+ ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
+ ;;
+esac
+
+# Are we compiling with Clang?
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5
+printf %s "checking whether $CC is Clang... " >&6; }
+if test ${ax_cv_PTHREAD_CLANG+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ax_cv_PTHREAD_CLANG=no
+ # Note that Autoconf sets GCC=yes for Clang as well as GCC
+ if test "x$GCC" = "xyes"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+# if defined(__clang__) && defined(__llvm__)
+ AX_PTHREAD_CC_IS_CLANG
+# endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1
+then :
+ ax_cv_PTHREAD_CLANG=yes
+fi
+rm -rf conftest*
+
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5
+printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; }
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+
+# Note that for GCC and Clang -pthread generally implies -lpthread,
+# except when -nostdlib is passed.
+# This is problematic using libtool to build C++ shared libraries with pthread:
+# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
+# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
+# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
+# To solve this, first try -pthread together with -lpthread for GCC
+
+if test "x$GCC" = "xyes"
+then :
+ ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"
+fi
+
+# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
+
+if test "x$ax_pthread_clang" = "xyes"
+then :
+ ax_pthread_flags="-pthread,-lpthread -pthread"
+fi
+
+
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
+
+case $host_os in
+ darwin* | hpux* | linux* | osf* | solaris*)
+ ax_pthread_check_macro="_REENTRANT"
+ ;;
- ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
+ aix*)
+ ax_pthread_check_macro="_THREAD_SAFE"
;;
- darwin*)
- ax_pthread_flags="-pthread $ax_pthread_flags"
+ *)
+ ax_pthread_check_macro="--"
;;
esac
+if test "x$ax_pthread_check_macro" = "x--"
+then :
+ ax_pthread_check_cond=0
+else $as_nop
+ ax_pthread_check_cond="!defined($ax_pthread_check_macro)"
+fi
+
-if test x"$ax_pthread_ok" = xno; then
-for flag in $ax_pthread_flags; do
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
- case $flag in
+ case $ax_pthread_try_flag in
none)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
printf %s "checking whether pthreads work without any flags... " >&6; }
;;
+ *,*)
+ PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
+ PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5
+printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; }
+ ;;
+
-*)
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
-printf %s "checking whether pthreads work with $flag... " >&6; }
- PTHREAD_CFLAGS="$flag"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5
+printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; }
+ PTHREAD_CFLAGS="$ax_pthread_try_flag"
;;
pthread-config)
@@ -7136,22 +7710,25 @@ printf "%s\n" "no" >&6; }
fi
- if test x"$ax_pthread_config" = xno; then continue; fi
+ if test "x$ax_pthread_config" = "xno"
+then :
+ continue
+fi
PTHREAD_CFLAGS="`pthread-config --cflags`"
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
;;
*)
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
-printf %s "checking for the pthreads library -l$flag... " >&6; }
- PTHREAD_LIBS="-l$flag"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5
+printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; }
+ PTHREAD_LIBS="-l$ax_pthread_try_flag"
;;
esac
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
- LIBS="$PTHREAD_LIBS $LIBS"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
# Check for various functions. We must include pthread.h,
# since some functions may be macros. (On the Sequent, we
@@ -7162,10 +7739,20 @@ printf %s "checking for the pthreads library -l$flag... " >&6; }
# pthread_cleanup_push because it is one of the few pthread
# functions on Solaris that doesn't have a non-functional libc stub.
# We try pthread_create on general principles.
+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
- static void routine(void *a) { a = 0; }
+# if $ax_pthread_check_cond
+# error "$ax_pthread_check_macro must be defined"
+# endif
+ static void *some_global = NULL;
+ static void routine(void *a)
+ {
+ /* To avoid any unused-parameter or
+ unused-but-set-parameter warning. */
+ some_global = a;
+ }
static void *start_routine(void *a) { return a; }
int
main (void)
@@ -7187,77 +7774,195 @@ fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
printf "%s\n" "$ax_pthread_ok" >&6; }
- if test "x$ax_pthread_ok" = xyes; then
- break;
- fi
+ if test "x$ax_pthread_ok" = "xyes"
+then :
+ break
+fi
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
done
fi
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+ # Clang takes -pthread; it has never supported any other flag
+
+ # (Note 1: This will need to be revisited if a system that Clang
+ # supports has POSIX threads in a separate library. This tends not
+ # to be the way of modern systems, but it's conceivable.)
+
+ # (Note 2: On some systems, notably Darwin, -pthread is not needed
+ # to get POSIX threads support; the API is always present and
+ # active. We could reasonably leave PTHREAD_CFLAGS empty. But
+ # -pthread does define _REENTRANT, and while the Darwin headers
+ # ignore this macro, third-party headers might not.)
+
+ # However, older versions of Clang make a point of warning the user
+ # that, in an invocation where only linking and no compilation is
+ # taking place, the -pthread option has no effect ("argument unused
+ # during compilation"). They expect -pthread to be passed in only
+ # when source code is being compiled.
+ #
+ # Problem is, this is at odds with the way Automake and most other
+ # C build frameworks function, which is that the same flags used in
+ # compilation (CFLAGS) are also used in linking. Many systems
+ # supported by AX_PTHREAD require exactly this for POSIX threads
+ # support, and in fact it is often not straightforward to specify a
+ # flag that is used only in the compilation phase and not in
+ # linking. Such a scenario is extremely rare in practice.
+ #
+ # Even though use of the -pthread flag in linking would only print
+ # a warning, this can be a nuisance for well-run software projects
+ # that build with -Werror. So if the active version of Clang has
+ # this misfeature, we search for an option to squash it.
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5
+printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; }
+if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+ # Create an alternate version of $ac_link that compiles and
+ # links in two steps (.c -> .o, .o -> exe) instead of one
+ # (.c -> exe), because the warning occurs only in the second
+ # step
+ ax_pthread_save_ac_link="$ac_link"
+ ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+ ax_pthread_link_step=`printf "%s\n" "$ac_link" | sed "$ax_pthread_sed"`
+ ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+ if test "x$ax_pthread_try" = "xunknown"
+then :
+ break
+fi
+ CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+ ac_link="$ax_pthread_save_ac_link"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int main(void){return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_link="$ax_pthread_2step_ac_link"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int main(void){return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ done
+ ac_link="$ax_pthread_save_ac_link"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ if test "x$ax_pthread_try" = "x"
+then :
+ ax_pthread_try=no
+fi
+ ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5
+printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; }
+
+ case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+ no | unknown) ;;
+ *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+ esac
+
+fi # $ax_pthread_clang = yes
+
+
+
# Various other checks:
-if test "x$ax_pthread_ok" = xyes; then
- save_LIBS="$LIBS"
- LIBS="$PTHREAD_LIBS $LIBS"
- save_CFLAGS="$CFLAGS"
+if test "x$ax_pthread_ok" = "xyes"; then
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
printf %s "checking for joinable pthread attribute... " >&6; }
- attr_name=unknown
- for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+ for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
main (void)
{
-int attr = $attr; return attr /* ; */
+int attr = $ax_pthread_attr; return attr /* ; */
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
- attr_name=$attr; break
+ ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
- done
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
-printf "%s\n" "$attr_name" >&6; }
- if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+ done
-printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $attr_name" >>confdefs.h
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5
+printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; }
+ if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+ test "x$ax_pthread_joinable_attr_defined" != "xyes"
+then :
- fi
+printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
-printf %s "checking if more special flags are required for pthreads... " >&6; }
- flag=no
- case ${host_os} in
- aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
- osf* | hpux*) flag="-D_REENTRANT";;
- solaris*)
- if test "$GCC" = "yes"; then
- flag="-D_REENTRANT"
- else
- flag="-mt -D_REENTRANT"
- fi
- ;;
- esac
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5
-printf "%s\n" "${flag}" >&6; }
- if test "x$flag" != xno; then
- PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
- fi
+ ax_pthread_joinable_attr_defined=yes
+
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5
+printf %s "checking whether more special flags are required for pthreads... " >&6; }
+if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ax_cv_PTHREAD_SPECIAL_FLAGS=no
+ case $host_os in
+ solaris*)
+ ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5
+printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; }
+ if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+ test "x$ax_pthread_special_flags_added" != "xyes"
+then :
+ PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+ ax_pthread_special_flags_added=yes
+fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; }
@@ -7265,15 +7970,14 @@ if test ${ax_cv_PTHREAD_PRIO_INHERIT+y}
then :
printf %s "(cached) " >&6
else $as_nop
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-
- #include <pthread.h>
+#include <pthread.h>
int
main (void)
{
int i = PTHREAD_PRIO_INHERIT;
+ return i;
;
return 0;
}
@@ -7290,19 +7994,44 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
- if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"
+ if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+ test "x$ax_pthread_prio_inherit_defined" != "xyes"
then :
printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h
+ ax_pthread_prio_inherit_defined=yes
+
fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
+
+ # More AIX lossage: compile with *_r variant
+ if test "x$GCC" != "xyes"; then
+ case $host_os in
+ aix*)
+ case "x/$CC" in #(
+ x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) :
+ #handle absolute path differently from PATH based program lookup
+ case "x$CC" in #(
+ x/*) :
+
+ if as_fn_executable_p ${CC}_r
+then :
+ PTHREAD_CC="${CC}_r"
+fi
+ if test "x${CXX}" != "x"
+then :
+ if as_fn_executable_p ${CXX}_r
+then :
+ PTHREAD_CXX="${CXX}_r"
+fi
+fi
+ ;; #(
+ *) :
- # More AIX lossage: must compile with xlc_r or cc_r
- if test x"$GCC" != xyes; then
- for ac_prog in xlc_r cc_r
+ for ac_prog in ${CC}_r
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
@@ -7348,21 +8077,81 @@ fi
test -n "$PTHREAD_CC" && break
done
-test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}"
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
- else
- PTHREAD_CC=$CC
- fi
+ if test "x${CXX}" != "x"
+then :
+ for ac_prog in ${CXX}_r
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_PTHREAD_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$PTHREAD_CXX"; then
+ ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test.
else
- PTHREAD_CC="$CC"
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PTHREAD_CXX="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX
+if test -n "$PTHREAD_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5
+printf "%s\n" "$PTHREAD_CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
+ test -n "$PTHREAD_CXX" && break
+done
+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
+
+fi
+
+ ;;
+esac
+ ;; #(
+ *) :
+ ;;
+esac
+ ;;
+ esac
+ fi
+fi
+
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
+
+
+
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
-if test x"$ax_pthread_ok" = xyes; then
+if test "x$ax_pthread_ok" = "xyes"; then
printf "%s\n" "#define HAVE_PTHREAD 1" >>confdefs.h
@@ -7378,19 +8167,23 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ fi
else
GCOPTIONS=$GCOPTIONS"--disable-threads "
fi
-# Check whether --enable-sigsegv was given.
+# --------------- sigsegv ------------------------------
+
+if test "x$with_vcpkg" = "xno"; then
+ # Check whether --enable-sigsegv was given.
if test ${enable_sigsegv+y}
then :
enableval=$enable_sigsegv;
fi
-if test "x$enable_sigsegv" != "xno"; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stackoverflow_install_handler in -lsigsegv" >&5
+ if test "x$enable_sigsegv" != "xno"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stackoverflow_install_handler in -lsigsegv" >&5
printf %s "checking for stackoverflow_install_handler in -lsigsegv... " >&6; }
if test ${ac_cv_lib_sigsegv_stackoverflow_install_handler+y}
then :
@@ -7432,9 +8225,9 @@ then :
fi
-fi
+ fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
printf %s "checking for sched_yield in -lrt... " >&6; }
if test ${ac_cv_lib_rt_sched_yield+y}
then :
@@ -7476,6 +8269,12 @@ then :
fi
+fi
+
+# ----------------- lsp -------------------------------
+
+LSP_ROOT=LspCpp
+
LSPLIBS=
LSPLIB=
@@ -7553,10 +8352,35 @@ printf "%s\n" "$ac_cv_lib_boost_thread_pthread_attr_getdetachstate" >&6; }
if test "x$ac_cv_lib_boost_thread_pthread_attr_getdetachstate" = xyes
then :
+ LSP_BUILD_ROOT=$EXTERNAL_BUILD_ROOT/$LSP_ROOT
+ ROOT_DIR_RELATIVE_TO_SRC=$(realpath -s --relative-to $LSP_ROOT .)
+ LSPLIB=$LSP_BUILD_ROOT/liblspcpp.a
+ LSPLIBS=$LSPLIBS" -L$LSP_BUILD_ROOT -L$LSP_BUILD_ROOT/third_party/uri/src -llspcpp -lnetwork-uri -lboost_filesystem -lboost_thread"
+ LSP_CMAKE_OPTIONS="-DLSPCPP_USE_CPP17=ON "
+
+ if test "x$enable_gc" != "xno"; then
+ LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DLSPCPP_SUPPORT_BOEHM_GC=ON "
+ if test "x$with_vcpkg" = "xno"; then
+ LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DLSPCPP_GC_DOWNLOADED_ROOT=$ROOT_DIR_RELATIVE_TO_SRC/\$(GC) "
+ fi
+ else
+ LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DLSPCPP_SUPPORT_BOEHM_GC=OFF "
+ fi
+
+
+ if test "x$with_vcpkg" != "xno"; then
+ VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--x-feature=lsp "
+ RELATIVE_LSP_VCPKG_ROOT=$(realpath -s --relative-to=$LSP_BUILD_ROOT vcpkg_installed/$vcpkg_triplet)
+ LSP_CXX_BUILD_FLAGS=$LSP_BUILD_FLAGS"-I$RELATIVE_LSP_VCPKG_ROOT/include -L$RELATIVE_LSP_VCPKG_ROOT/lib "
+ LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DUSE_SYSTEM_RAPIDJSON=True -DCMAKE_PREFIX_PATH=\"$RELATIVE_LSP_VCPKG_ROOT\" "
+ fi
+
+
+
+
printf "%s\n" "#define HAVE_LSP 1" >>confdefs.h
- LSPLIBS="-llspcpp -lnetwork-uri -lboost_filesystem -lboost_thread "
- LSPLIB=liblspcpp.a
+
else $as_nop
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libboost_thread: will compile without optional Language Server Protocol. ***" >&5
printf "%s\n" "$as_me: *** Could not find libboost_thread: will compile without optional Language Server Protocol. ***" >&6;}
@@ -7583,6 +8407,8 @@ then :
fi
+
+
STATIC=""
DYNAMIC=""
if test "x$enable_static" = "xyes"; then
@@ -7592,30 +8418,37 @@ fi
+if test "x$enable_readline" != "xno"; then
+if test "x$with_vcpkg" != "xno"; then # vcpkg
+ VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--x-feature=readline "
+ printf "%s\n" "#define HAVE_NCURSES_CURSES_H 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_LIBCURSES 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_LIBREADLINE 1" >>confdefs.h
+ VCPKG_LIBS_TO_USE_PKG_CONFIG=$VCPKG_LIBS_TO_USE_PKG_CONFIG"readline "
+ VCPKG_LIBS_TO_USE_PKG_CONFIG=$VCPKG_LIBS_TO_USE_PKG_CONFIG"ncurses "
+else # managed by the system
-if test "x$enable_readline" != "xno"; then
-
-CPPFLAGS="$CPPFLAGS "`pkg-config --silence-errors --cflags readline || echo`
+CPPFLAGS="$CPPFLAGS "$(pkg-config --silence-errors --cflags readline || echo)
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdio.h>
-#include <unistd.h>
-#include <readline/readline.h>
+ #include <stdio.h>
+ #include <unistd.h>
+ #include <readline/readline.h>
int
main (void)
{
-#ifndef RL_READLINE_VERSION
-abort
-#endif
+ #ifndef RL_READLINE_VERSION
+ abort
+ #endif
;
return 0;
@@ -7625,22 +8458,25 @@ if ac_fn_cxx_try_compile "$LINENO"
then :
-PKG_FLAGS=" "`pkg-config --silence-errors --libs readline || echo`
+PKG_FLAGS=" "$(pkg-config --silence-errors --libs readline || echo)
-if test "x$PKG_FLAGS" == "x "; then
-PKG_FLAGS=-l"readline"
-echo will try linking with $PKG_FLAGS
-fi
-LDFLAGS_SAVE=$LDFLAGS
-LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for history_list in -lreadline" >&5
+ if test "x$PKG_FLAGS" == "x "; then
+ PKG_FLAGS=-l"readline"
+ echo will try linking with $PKG_FLAGS
+ fi
+ LDFLAGS_SAVE=$LDFLAGS
+ LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Checking readline for function history_list... PKG_FLAGS:$PKG_FLAGS" >&5
+printf "%s\n" "$as_me: Checking readline for function history_list... PKG_FLAGS:$PKG_FLAGS" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for history_list in -lreadline" >&5
printf %s "checking for history_list in -lreadline... " >&6; }
if test ${ac_cv_lib_readline_history_list+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lreadline $PKG_FLAGS $LIBS"
+LIBS="-lreadline $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -7675,17 +8511,19 @@ printf "%s\n" "#define HAVE_LIBREADLINE 1" >>confdefs.h
else $as_nop
if test "x$enable_static" = "xyes"; then
-echo "Static library not found; will check for dynamic version"
-LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
-{ ac_cv_lib_readline_history_list=; unset ac_cv_lib_readline_history_list;}
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for history_list in -lreadline" >&5
+ echo "Static library not found; will check for dynamic version"
+ LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
+ { ac_cv_lib_readline_history_list=; unset ac_cv_lib_readline_history_list;}
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for history_list in -lreadline" >&5
printf %s "checking for history_list in -lreadline... " >&6; }
if test ${ac_cv_lib_readline_history_list+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lreadline $PKG_FLAGS $LIBS"
+LIBS="-lreadline $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -7719,131 +8557,30 @@ printf "%s\n" "#define HAVE_LIBREADLINE 1" >>confdefs.h
else $as_nop
-LDFLAGS=$LDFLAGS_SAVE
+ LDFLAGS=$LDFLAGS_SAVE
+ readline="no"
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find GNU readline 4.3 or later: will compile without readline support ***" >&5
-printf "%s\n" "$as_me: *** Could not find GNU readline 4.3 or later: will compile without readline support ***" >&6;}
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -ledit" >&5
-printf %s "checking for readline in -ledit... " >&6; }
-if test ${ac_cv_lib_edit_readline+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ledit $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-namespace conftest {
- extern "C" int readline ();
-}
-int
-main (void)
-{
-return conftest::readline ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"
-then :
- ac_cv_lib_edit_readline=yes
-else $as_nop
- ac_cv_lib_edit_readline=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_edit_readline" >&5
-printf "%s\n" "$ac_cv_lib_edit_readline" >&6; }
-if test "x$ac_cv_lib_edit_readline" = xyes
-then :
- printf "%s\n" "#define HAVE_LIBEDIT 1" >>confdefs.h
-
- LIBS="-ledit $LIBS"
-fi
-
-ac_fn_cxx_check_header_compile "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default"
-if test "x$ac_cv_header_editline_readline_h" = xyes
-then :
- printf "%s\n" "#define HAVE_EDITLINE_READLINE_H 1" >>confdefs.h
-
-fi
+ else
+ LDFLAGS=$LDFLAGS_SAVE
+ readline="no"
+ fi
fi
-else
-
-LDFLAGS=$LDFLAGS_SAVE
-
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find GNU readline 4.3 or later: will compile without readline support ***" >&5
-printf "%s\n" "$as_me: *** Could not find GNU readline 4.3 or later: will compile without readline support ***" >&6;}
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -ledit" >&5
-printf %s "checking for readline in -ledit... " >&6; }
-if test ${ac_cv_lib_edit_readline+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ledit $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-namespace conftest {
- extern "C" int readline ();
-}
-int
-main (void)
-{
-return conftest::readline ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"
-then :
- ac_cv_lib_edit_readline=yes
else $as_nop
- ac_cv_lib_edit_readline=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+ readline="no"
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_edit_readline" >&5
-printf "%s\n" "$ac_cv_lib_edit_readline" >&6; }
-if test "x$ac_cv_lib_edit_readline" = xyes
-then :
- printf "%s\n" "#define HAVE_LIBEDIT 1" >>confdefs.h
-
- LIBS="-ledit $LIBS"
-
-fi
-
-ac_fn_cxx_check_header_compile "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default"
-if test "x$ac_cv_header_editline_readline_h" = xyes
-then :
- printf "%s\n" "#define HAVE_EDITLINE_READLINE_H 1" >>confdefs.h
-
-fi
-
-
-
-fi
-
-fi
-
-
-else $as_nop
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find GNU readline 4.3 or later: will compile without readline support ***" >&5
+ if test "x$readline" == "xno"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find GNU readline 4.3 or later: will compile without readline support ***" >&5
printf "%s\n" "$as_me: *** Could not find GNU readline 4.3 or later: will compile without readline support ***" >&6;}
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -ledit" >&5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -ledit" >&5
printf %s "checking for readline in -ledit... " >&6; }
if test ${ac_cv_lib_edit_readline+y}
then :
@@ -7885,38 +8622,39 @@ then :
fi
-ac_fn_cxx_check_header_compile "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default"
+ ac_fn_cxx_check_header_compile "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default"
if test "x$ac_cv_header_editline_readline_h" = xyes
then :
printf "%s\n" "#define HAVE_EDITLINE_READLINE_H 1" >>confdefs.h
fi
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
-CPPFLAGS="$CPPFLAGS "`pkg-config --silence-errors --cflags tinfo || echo`
+CPPFLAGS="$CPPFLAGS "$(pkg-config --silence-errors --cflags tinfo || echo)
-PKG_FLAGS=" "`pkg-config --silence-errors --libs tinfo || echo`
+PKG_FLAGS=" "$(pkg-config --silence-errors --libs tinfo || echo)
-if test "x$PKG_FLAGS" == "x "; then
-PKG_FLAGS=-l"tinfo"
-echo will try linking with $PKG_FLAGS
-fi
-LDFLAGS_SAVE=$LDFLAGS
-LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltinfo" >&5
+ if test "x$PKG_FLAGS" == "x "; then
+ PKG_FLAGS=-l"tinfo"
+ echo will try linking with $PKG_FLAGS
+ fi
+ LDFLAGS_SAVE=$LDFLAGS
+ LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Checking tinfo for function tgetent... PKG_FLAGS:$PKG_FLAGS" >&5
+printf "%s\n" "$as_me: Checking tinfo for function tgetent... PKG_FLAGS:$PKG_FLAGS" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltinfo" >&5
printf %s "checking for tgetent in -ltinfo... " >&6; }
if test ${ac_cv_lib_tinfo_tgetent+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-ltinfo $PKG_FLAGS $LIBS"
+LIBS="-ltinfo $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -7951,17 +8689,19 @@ printf "%s\n" "#define HAVE_LIBTINFO 1" >>confdefs.h
else $as_nop
if test "x$enable_static" = "xyes"; then
-echo "Static library not found; will check for dynamic version"
-LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
-{ ac_cv_lib_tinfo_tgetent=; unset ac_cv_lib_tinfo_tgetent;}
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltinfo" >&5
+ echo "Static library not found; will check for dynamic version"
+ LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
+ { ac_cv_lib_tinfo_tgetent=; unset ac_cv_lib_tinfo_tgetent;}
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltinfo" >&5
printf %s "checking for tgetent in -ltinfo... " >&6; }
if test ${ac_cv_lib_tinfo_tgetent+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-ltinfo $PKG_FLAGS $LIBS"
+LIBS="-ltinfo $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -7995,29 +8735,28 @@ printf "%s\n" "#define HAVE_LIBTINFO 1" >>confdefs.h
else $as_nop
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: perhaps tgetent is in -lncurses" >&5
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: perhaps tgetent is in -lncurses" >&5
printf "%s\n" "$as_me: perhaps tgetent is in -lncurses" >&6;}
fi
-else
+ else
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: perhaps tgetent is in -lncurses" >&5
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: perhaps tgetent is in -lncurses" >&5
printf "%s\n" "$as_me: perhaps tgetent is in -lncurses" >&6;}
-fi
-
+ fi
fi
-CPPFLAGS="$CPPFLAGS "`pkg-config --silence-errors --cflags ncurses || echo`
+CPPFLAGS="$CPPFLAGS "$(pkg-config --silence-errors --cflags ncurses || echo)
- for ac_header in ncurses/curses.h ncurses.h curses.h
+ for ac_header in ncurses/curses.h ncurses.h curses.h
do :
as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -8032,22 +8771,25 @@ fi
done
-PKG_FLAGS=" "`pkg-config --silence-errors --libs ncurses || echo`
+PKG_FLAGS=" "$(pkg-config --silence-errors --libs ncurses || echo)
-if test "x$PKG_FLAGS" == "x "; then
-PKG_FLAGS=-l"ncurses"
-echo will try linking with $PKG_FLAGS
-fi
-LDFLAGS_SAVE=$LDFLAGS
-LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setupterm in -lncurses" >&5
+ if test "x$PKG_FLAGS" == "x "; then
+ PKG_FLAGS=-l"ncurses"
+ echo will try linking with $PKG_FLAGS
+ fi
+ LDFLAGS_SAVE=$LDFLAGS
+ LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Checking ncurses for function setupterm... PKG_FLAGS:$PKG_FLAGS" >&5
+printf "%s\n" "$as_me: Checking ncurses for function setupterm... PKG_FLAGS:$PKG_FLAGS" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setupterm in -lncurses" >&5
printf %s "checking for setupterm in -lncurses... " >&6; }
if test ${ac_cv_lib_ncurses_setupterm+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lncurses $PKG_FLAGS $LIBS"
+LIBS="-lncurses $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -8082,17 +8824,19 @@ printf "%s\n" "#define HAVE_LIBCURSES 1" >>confdefs.h
else $as_nop
if test "x$enable_static" = "xyes"; then
-echo "Static library not found; will check for dynamic version"
-LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
-{ ac_cv_lib_ncurses_setupterm=; unset ac_cv_lib_ncurses_setupterm;}
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setupterm in -lncurses" >&5
+ echo "Static library not found; will check for dynamic version"
+ LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
+ { ac_cv_lib_ncurses_setupterm=; unset ac_cv_lib_ncurses_setupterm;}
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setupterm in -lncurses" >&5
printf %s "checking for setupterm in -lncurses... " >&6; }
if test ${ac_cv_lib_ncurses_setupterm+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lncurses $PKG_FLAGS $LIBS"
+LIBS="-lncurses $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -8126,8 +8870,8 @@ printf "%s\n" "#define HAVE_LIBCURSES 1" >>confdefs.h
else $as_nop
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setupterm in -lcurses" >&5
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setupterm in -lcurses" >&5
printf %s "checking for setupterm in -lcurses... " >&6; }
if test ${ac_cv_lib_curses_setupterm+y}
then :
@@ -8173,10 +8917,10 @@ fi
fi
-else
+ else
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setupterm in -lcurses" >&5
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setupterm in -lcurses" >&5
printf %s "checking for setupterm in -lcurses... " >&6; }
if test ${ac_cv_lib_curses_setupterm+y}
then :
@@ -8219,13 +8963,79 @@ then :
fi
+ fi
+fi
+
+
+fi
+fi
+
+# --------------- gc -------------------------------
+
+GCNAME="Boehm Garbage Collector"
+
+# Check whether --enable-gc was given.
+if test ${enable_gc+y}
+then :
+ enableval=$enable_gc;
fi
+
+if test "x$enable_gc" != "xno" ; then
+ if test "x$with_vcpkg" == "xno"; then
+
+printf "%s\n" "#define USEGC 1" >>confdefs.h
+
+ GCLIB="\$(GC)/.libs/libgc.a"
+ INCL=$INCL" -I\$(GC)/include"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $GCNAME is enabled" >&5
+printf "%s\n" "$as_me: $GCNAME is enabled" >&6;}
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** $GCNAME disabled by configure flag: will compile without garbage collection. ***" >&5
+printf "%s\n" "$as_me: *** $GCNAME disabled by configure flag: will compile without garbage collection. ***" >&6;}
+fi
+
+# Check whether --enable-gc-debug was given.
+if test ${enable_gc_debug+y}
+then :
+ enableval=$enable_gc_debug; if test "x$enable_gc" != "xno" ; then
+ if test "x$enableval" = "xyes" ; then
+
+printf "%s\n" "#define GC_DEBUG 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Enabling GC debugging: remember to make clean ***" >&5
+printf "%s\n" "$as_me: *** Enabling GC debugging: remember to make clean ***" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Set the environment variable GC_FIND_LEAK at runtime ***" >&5
+printf "%s\n" "$as_me: *** Set the environment variable GC_FIND_LEAK at runtime ***" >&6;}
+ fi
+ fi
+
fi
+# Check whether --enable-gc-full-debug was given.
+if test ${enable_gc_full_debug+y}
+then :
+ enableval=$enable_gc_full_debug; if test "x$enable_gc" != "xno" ; then
+ if test "x$enableval" = "xyes" ; then
+
+printf "%s\n" "#define GC_DEBUG 1" >>confdefs.h
+
+
+printf "%s\n" "#define GC_BACKTRACE 1" >>confdefs.h
+
+ GCOPTIONS=$GCOPTIONS"--enable-gc-debug "
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Enabling GC backtrace debugging; remember to make gc-clean ***" >&5
+printf "%s\n" "$as_me: *** Enabling GC backtrace debugging; remember to make gc-clean ***" >&6;}
+ fi
+ fi
+
fi
+
+# ---------------- curl ------------------------
+
# Check whether --enable-curl was given.
if test ${enable_curl+y}
then :
@@ -8233,30 +9043,39 @@ then :
fi
if test "x$enable_curl" != "xno"; then
+if test "x$with_vcpkg" != "xno"; then
+ VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--x-feature=curl "
+ printf "%s\n" "#define HAVE_LIBCURL 1" >>confdefs.h
+
+ VCPKG_LIBS_TO_USE_PKG_CONFIG=$VCPKG_LIBS_TO_USE_PKG_CONFIG"libcurl "
+else
-CPPFLAGS="$CPPFLAGS "`pkg-config --silence-errors --cflags curl || echo`
+CPPFLAGS="$CPPFLAGS "$(pkg-config --silence-errors --cflags curl || echo)
ac_fn_cxx_check_header_compile "$LINENO" "curl/curl.h" "ac_cv_header_curl_curl_h" "$ac_includes_default"
if test "x$ac_cv_header_curl_curl_h" = xyes
then :
-PKG_FLAGS=" "`pkg-config --silence-errors --libs libcurl || echo`
+PKG_FLAGS=" "$(pkg-config --silence-errors --libs libcurl || echo)
-if test "x$PKG_FLAGS" == "x "; then
-PKG_FLAGS=-l"curl"
-echo will try linking with $PKG_FLAGS
-fi
-LDFLAGS_SAVE=$LDFLAGS
-LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curl_easy_init in -lcurl" >&5
+ if test "x$PKG_FLAGS" == "x "; then
+ PKG_FLAGS=-l"curl"
+ echo will try linking with $PKG_FLAGS
+ fi
+ LDFLAGS_SAVE=$LDFLAGS
+ LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Checking curl for function curl_easy_init... PKG_FLAGS:$PKG_FLAGS" >&5
+printf "%s\n" "$as_me: Checking curl for function curl_easy_init... PKG_FLAGS:$PKG_FLAGS" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curl_easy_init in -lcurl" >&5
printf %s "checking for curl_easy_init in -lcurl... " >&6; }
if test ${ac_cv_lib_curl_curl_easy_init+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lcurl $PKG_FLAGS $LIBS"
+LIBS="-lcurl $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -8291,17 +9110,19 @@ printf "%s\n" "#define HAVE_LIBCURL 1" >>confdefs.h
else $as_nop
if test "x$enable_static" = "xyes"; then
-echo "Static library not found; will check for dynamic version"
-LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
-{ ac_cv_lib_curl_curl_easy_init=; unset ac_cv_lib_curl_curl_easy_init;}
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curl_easy_init in -lcurl" >&5
+ echo "Static library not found; will check for dynamic version"
+ LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
+ { ac_cv_lib_curl_curl_easy_init=; unset ac_cv_lib_curl_curl_easy_init;}
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curl_easy_init in -lcurl" >&5
printf %s "checking for curl_easy_init in -lcurl... " >&6; }
if test ${ac_cv_lib_curl_curl_easy_init+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lcurl $PKG_FLAGS $LIBS"
+LIBS="-lcurl $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -8335,21 +9156,20 @@ printf "%s\n" "#define HAVE_LIBCURL 1" >>confdefs.h
else $as_nop
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libcurl: will compile without optional URL support. ***" >&5
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libcurl: will compile without optional URL support. ***" >&5
printf "%s\n" "$as_me: *** Could not find libcurl: will compile without optional URL support. ***" >&6;}
fi
-else
+ else
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libcurl: will compile without optional URL support. ***" >&5
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libcurl: will compile without optional URL support. ***" >&5
printf "%s\n" "$as_me: *** Could not find libcurl: will compile without optional URL support. ***" >&6;}
-fi
-
+ fi
fi
@@ -8358,11 +9178,14 @@ else $as_nop
printf "%s\n" "$as_me: *** Header file curl.h not found: will compile without optional URL support. ***" >&6;}
fi
+fi
else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** libcurl support disabled by configure flag: will compile without optional URL support. ***" >&5
printf "%s\n" "$as_me: *** libcurl support disabled by configure flag: will compile without optional URL support. ***" >&6;}
fi
+# --------------------- fftw -------------------------
+
# Check whether --enable-fftw was given.
if test ${enable_fftw+y}
then :
@@ -8371,30 +9194,39 @@ fi
if test "x$enable_fftw" != "xno"; then
+if test "x$with_vcpkg" != "xno"; then # vcpkg
+VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--x-feature=fftw3 "
+printf "%s\n" "#define HAVE_LIBFFTW3 1" >>confdefs.h
+
+VCPKG_LIBS_TO_USE_PKG_CONFIG=$VCPKG_LIBS_TO_USE_PKG_CONFIG"fftw3 "
+else # system managed
-CPPFLAGS="$CPPFLAGS "`pkg-config --silence-errors --cflags fftw3 || echo`
+CPPFLAGS="$CPPFLAGS "$(pkg-config --silence-errors --cflags fftw3 || echo)
ac_fn_cxx_check_header_compile "$LINENO" "fftw3.h" "ac_cv_header_fftw3_h" "$ac_includes_default"
if test "x$ac_cv_header_fftw3_h" = xyes
then :
-PKG_FLAGS=" "`pkg-config --silence-errors --libs fftw3 || echo`
+PKG_FLAGS=" "$(pkg-config --silence-errors --libs fftw3 || echo)
-if test "x$PKG_FLAGS" == "x "; then
-PKG_FLAGS=-l"fftw3"
-echo will try linking with $PKG_FLAGS
-fi
-LDFLAGS_SAVE=$LDFLAGS
-LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fftw_execute in -lfftw3" >&5
+ if test "x$PKG_FLAGS" == "x "; then
+ PKG_FLAGS=-l"fftw3"
+ echo will try linking with $PKG_FLAGS
+ fi
+ LDFLAGS_SAVE=$LDFLAGS
+ LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Checking fftw3 for function fftw_execute... PKG_FLAGS:$PKG_FLAGS" >&5
+printf "%s\n" "$as_me: Checking fftw3 for function fftw_execute... PKG_FLAGS:$PKG_FLAGS" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fftw_execute in -lfftw3" >&5
printf %s "checking for fftw_execute in -lfftw3... " >&6; }
if test ${ac_cv_lib_fftw3_fftw_execute+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lfftw3 $PKG_FLAGS $LIBS"
+LIBS="-lfftw3 $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -8429,17 +9261,19 @@ printf "%s\n" "#define HAVE_LIBFFTW3 1" >>confdefs.h
else $as_nop
if test "x$enable_static" = "xyes"; then
-echo "Static library not found; will check for dynamic version"
-LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
-{ ac_cv_lib_fftw3_fftw_execute=; unset ac_cv_lib_fftw3_fftw_execute;}
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fftw_execute in -lfftw3" >&5
+ echo "Static library not found; will check for dynamic version"
+ LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
+ { ac_cv_lib_fftw3_fftw_execute=; unset ac_cv_lib_fftw3_fftw_execute;}
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fftw_execute in -lfftw3" >&5
printf %s "checking for fftw_execute in -lfftw3... " >&6; }
if test ${ac_cv_lib_fftw3_fftw_execute+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lfftw3 $PKG_FLAGS $LIBS"
+LIBS="-lfftw3 $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -8473,21 +9307,20 @@ printf "%s\n" "#define HAVE_LIBFFTW3 1" >>confdefs.h
else $as_nop
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libfftw3: will compile without optional fast Fourier transforms. ***" >&5
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libfftw3: will compile without optional fast Fourier transforms. ***" >&5
printf "%s\n" "$as_me: *** Could not find libfftw3: will compile without optional fast Fourier transforms. ***" >&6;}
fi
-else
+ else
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libfftw3: will compile without optional fast Fourier transforms. ***" >&5
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libfftw3: will compile without optional fast Fourier transforms. ***" >&5
printf "%s\n" "$as_me: *** Could not find libfftw3: will compile without optional fast Fourier transforms. ***" >&6;}
-fi
-
+ fi
fi
@@ -8497,6 +9330,9 @@ printf "%s\n" "$as_me: *** Header file fftw3.h not found: will compile without o
fi
fi
+fi
+
+# ------------------- eigen -------------------------
# Check whether --enable-eigen was given.
if test ${enable_eigen+y}
@@ -8506,8 +9342,14 @@ fi
if test "x$enable_eigen" != "xno"; then
+if test "x$with_vcpkg" != "xno"; then
+VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--x-feature=eigen3 "
+printf "%s\n" "#define HAVE_EIGEN_DENSE 1" >>confdefs.h
+
+VCPKG_LIBS_TO_USE_PKG_CONFIG=$VCPKG_LIBS_TO_USE_PKG_CONFIG"eigen3 "
+else
-CPPFLAGS="$CPPFLAGS "`pkg-config --silence-errors --cflags eigen3 || echo`
+CPPFLAGS="$CPPFLAGS "$(pkg-config --silence-errors --cflags eigen3 || echo)
ac_fn_cxx_check_header_compile "$LINENO" "Eigen/Dense" "ac_cv_header_Eigen_Dense" "$ac_includes_default"
if test "x$ac_cv_header_Eigen_Dense" = xyes
@@ -8517,6 +9359,7 @@ then :
fi
fi
+fi
# Checks for header files.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
@@ -8596,158 +9439,7 @@ then :
fi
-# Check whether --enable-xdr was given.
-if test ${enable_xdr+y}
-then :
- enableval=$enable_xdr;
-fi
-
-if test "x$enable_xdr" != "xno"; then
-case "$OSTYPE" in
- darwin*)
-
-printf "%s\n" "#define HAVE_LIBTIRPC 1" >>confdefs.h
-
- ;;
- *)
-
-CPPFLAGS="$CPPFLAGS "`pkg-config --silence-errors --cflags libtirpc || echo`
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include "xstream.h"
-int
-main (void)
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"
-then :
-
-
-PKG_FLAGS=" "`pkg-config --silence-errors --libs libtirpc || echo`
-
-if test "x$PKG_FLAGS" == "x "; then
-PKG_FLAGS=-l"tirpc"
-echo will try linking with $PKG_FLAGS
-fi
-LDFLAGS_SAVE=$LDFLAGS
-LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xdrstdio_create in -ltirpc" >&5
-printf %s "checking for xdrstdio_create in -ltirpc... " >&6; }
-if test ${ac_cv_lib_tirpc_xdrstdio_create+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ltirpc $PKG_FLAGS $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-namespace conftest {
- extern "C" int xdrstdio_create ();
-}
-int
-main (void)
-{
-return conftest::xdrstdio_create ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"
-then :
- ac_cv_lib_tirpc_xdrstdio_create=yes
-else $as_nop
- ac_cv_lib_tirpc_xdrstdio_create=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tirpc_xdrstdio_create" >&5
-printf "%s\n" "$ac_cv_lib_tirpc_xdrstdio_create" >&6; }
-if test "x$ac_cv_lib_tirpc_xdrstdio_create" = xyes
-then :
-
-printf "%s\n" "#define HAVE_LIBTIRPC 1" >>confdefs.h
-
-else $as_nop
- if test "x$enable_static" = "xyes"; then
-
-echo "Static library not found; will check for dynamic version"
-LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
-{ ac_cv_lib_tirpc_xdrstdio_create=; unset ac_cv_lib_tirpc_xdrstdio_create;}
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xdrstdio_create in -ltirpc" >&5
-printf %s "checking for xdrstdio_create in -ltirpc... " >&6; }
-if test ${ac_cv_lib_tirpc_xdrstdio_create+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ltirpc $PKG_FLAGS $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-namespace conftest {
- extern "C" int xdrstdio_create ();
-}
-int
-main (void)
-{
-return conftest::xdrstdio_create ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"
-then :
- ac_cv_lib_tirpc_xdrstdio_create=yes
-else $as_nop
- ac_cv_lib_tirpc_xdrstdio_create=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tirpc_xdrstdio_create" >&5
-printf "%s\n" "$ac_cv_lib_tirpc_xdrstdio_create" >&6; }
-if test "x$ac_cv_lib_tirpc_xdrstdio_create" = xyes
-then :
-
-printf "%s\n" "#define HAVE_LIBTIRPC 1" >>confdefs.h
-
-else $as_nop
-
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libtirpc; XDR/V3D support disabled ***" >&5
-printf "%s\n" "$as_me: *** Could not find libtirpc; XDR/V3D support disabled ***" >&6;}
-
-fi
-
-
-else
-
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libtirpc; XDR/V3D support disabled ***" >&5
-printf "%s\n" "$as_me: *** Could not find libtirpc; XDR/V3D support disabled ***" >&6;}
-
-fi
-
-fi
-
-
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Broken rpc headers; XDR/V3D support disabled ***" >&5
-printf "%s\n" "$as_me: *** Broken rpc headers; XDR/V3D support disabled ***" >&6;}
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
- ;;
-esac
-fi
+# ------------------- GSL --------------------
# Check whether --enable-gsl was given.
if test ${enable_gsl+y}
@@ -8757,33 +9449,43 @@ fi
if test "x$enable_gsl" != "xno"; then
+if test "x$with_vcpkg" != "xno"; then # vcpkg
+ VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--x-feature=gsl "
+ printf "%s\n" "#define HAVE_LIBGSL 1" >>confdefs.h
+
+ LIBS=$LIBS"-lgsl " # gsl's pkg-config file is incomplete
+ VCPKG_LIBS_TO_USE_PKG_CONFIG=$VCPKG_LIBS_TO_USE_PKG_CONFIG"gsl "
+else
-CPPFLAGS="$CPPFLAGS "`pkg-config --silence-errors --cflags gsl || echo`
+CPPFLAGS="$CPPFLAGS "$(pkg-config --silence-errors --cflags gsl || echo)
-LDFLAGS="$LDFLAGS "`pkg-config --silence-errors --libs gsl || echo`
+LDFLAGS="$LDFLAGS "$(pkg-config --silence-errors --libs gsl || echo)
ac_fn_cxx_check_header_compile "$LINENO" "gsl/gsl_sf.h" "ac_cv_header_gsl_gsl_sf_h" "$ac_includes_default"
if test "x$ac_cv_header_gsl_gsl_sf_h" = xyes
then :
-PKG_FLAGS=" "`pkg-config --silence-errors --libs gsl || echo`
+PKG_FLAGS=" "$(pkg-config --silence-errors --libs gsl || echo)
-if test "x$PKG_FLAGS" == "x "; then
-PKG_FLAGS=-l"gsl"
-echo will try linking with $PKG_FLAGS
-fi
-LDFLAGS_SAVE=$LDFLAGS
-LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gsl_sf_debye_6 in -lgsl" >&5
+ if test "x$PKG_FLAGS" == "x "; then
+ PKG_FLAGS=-l"gsl"
+ echo will try linking with $PKG_FLAGS
+ fi
+ LDFLAGS_SAVE=$LDFLAGS
+ LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Checking gsl for function gsl_sf_debye_6... PKG_FLAGS:$PKG_FLAGS" >&5
+printf "%s\n" "$as_me: Checking gsl for function gsl_sf_debye_6... PKG_FLAGS:$PKG_FLAGS" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gsl_sf_debye_6 in -lgsl" >&5
printf %s "checking for gsl_sf_debye_6 in -lgsl... " >&6; }
if test ${ac_cv_lib_gsl_gsl_sf_debye_6+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgsl $PKG_FLAGS $LIBS"
+LIBS="-lgsl $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -8818,17 +9520,19 @@ printf "%s\n" "#define HAVE_LIBGSL 1" >>confdefs.h
else $as_nop
if test "x$enable_static" = "xyes"; then
-echo "Static library not found; will check for dynamic version"
-LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
-{ ac_cv_lib_gsl_gsl_sf_debye_6=; unset ac_cv_lib_gsl_gsl_sf_debye_6;}
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gsl_sf_debye_6 in -lgsl" >&5
+ echo "Static library not found; will check for dynamic version"
+ LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
+ { ac_cv_lib_gsl_gsl_sf_debye_6=; unset ac_cv_lib_gsl_gsl_sf_debye_6;}
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gsl_sf_debye_6 in -lgsl" >&5
printf %s "checking for gsl_sf_debye_6 in -lgsl... " >&6; }
if test ${ac_cv_lib_gsl_gsl_sf_debye_6+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgsl $PKG_FLAGS $LIBS"
+LIBS="-lgsl $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -8862,21 +9566,20 @@ printf "%s\n" "#define HAVE_LIBGSL 1" >>confdefs.h
else $as_nop
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libgsl: will compile without optional special functions. ***" >&5
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libgsl: will compile without optional special functions. ***" >&5
printf "%s\n" "$as_me: *** Could not find libgsl: will compile without optional special functions. ***" >&6;}
fi
-else
+ else
-LDFLAGS=$LDFLAGS_SAVE
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libgsl: will compile without optional special functions. ***" >&5
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libgsl: will compile without optional special functions. ***" >&5
printf "%s\n" "$as_me: *** Could not find libgsl: will compile without optional special functions. ***" >&6;}
-fi
-
+ fi
fi
@@ -8886,6 +9589,9 @@ printf "%s\n" "$as_me: *** Header file gsl_sf.h not found: will compile without
fi
fi
+fi
+
+# ----------------- OpenGL -----------------
# Check whether --enable-gl was given.
if test ${enable_gl+y}
@@ -8894,12 +9600,18 @@ then :
fi
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+if test "x$with_vcpkg" != "xno"; then
+ printf "%s\n" "#define HAVE_SSBO 1" >>confdefs.h
+ # SSBO/Compute shader check should be done at runtime, not at compilation
+ printf "%s\n" "#define HAVE_COMPUTE_SHADER 1" >>confdefs.h
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <GL/gl.h>
- #if !defined(GL_VERSION_4_3) && !defined(GL_ARB_shader_storage_buffer_object)
- #error
- #endif
+ #if !defined(GL_VERSION_4_3) && !defined(GL_ARB_shader_storage_buffer_object)
+ #error
+ #endif
int
main (void)
@@ -8917,12 +9629,12 @@ printf "%s\n" "#define HAVE_SSBO 1" >>confdefs.h
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <GL/gl.h>
- #if !defined(GL_VERSION_4_3) && !defined(GL_ARB_compute_shader)
- #error
- #endif
+ #if !defined(GL_VERSION_4_3) && !defined(GL_ARB_compute_shader)
+ #error
+ #endif
int
main (void)
@@ -8939,6 +9651,9 @@ printf "%s\n" "#define HAVE_COMPUTE_SHADER 1" >>confdefs.h
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+# -------------- offscreen rendering
# Check whether --enable-offscreen was given.
if test ${enable_offscreen+y}
@@ -8947,27 +9662,49 @@ then :
fi
-# Check whether --enable-OpenImageIO was given.
-if test ${enable_OpenImageIO+y}
-then :
- enableval=$enable_OpenImageIO;
-fi
-
+# ----------- glm
+if test "x$with_vcpkg" != "xno"; then
+ printf "%s\n" "#define HAVE_LIBGLM 1" >>confdefs.h
- ac_fn_cxx_check_header_compile "$LINENO" "glm/glm.hpp" "ac_cv_header_glm_glm_hpp" "$ac_includes_default"
+ LIBS=$LIBS"-lglm "
+else
+ # glm is header only and is already on the include path
+ ac_fn_cxx_check_header_compile "$LINENO" "glm/glm.hpp" "ac_cv_header_glm_glm_hpp" "$ac_includes_default"
if test "x$ac_cv_header_glm_glm_hpp" = xyes
then :
printf "%s\n" "#define HAVE_LIBGLM 1" >>confdefs.h
+
else $as_nop
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find glm header files: will compile without WebGL or OpenGL support ***" >&5
printf "%s\n" "$as_me: *** Could not find glm header files: will compile without WebGL or OpenGL support ***" >&6;}
+
+fi
+
fi
+TINYEXR_ROOT=tinyexr
+INCL=$INCL" -I$TINYEXR_ROOT"
+
if test "x$enable_gl" != "xno"; then
- for ac_header in ncurses/curses.h ncurses.h curses.h
+if test "x$with_vcpkg" != "xno"; then # managed by vcpkg
+ VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--x-feature=opengl "
+
+printf "%s\n" "#define HAVE_LIBGL 1" >>confdefs.h
+
+
+printf "%s\n" "#define FREEGLUT 1" >>confdefs.h
+
+
+printf "%s\n" "#define HAVE_LIBGLUT 1" >>confdefs.h
+
+ INCL=$INCL" -Ibackports/glew/include"
+ GLEW="glew.o "
+ VCPKG_LIBS_TO_USE_PKG_CONFIG=$VCPKG_LIBS_TO_USE_PKG_CONFIG"glut "
+else # managed by the system
+ for ac_header in ncurses/curses.h ncurses.h curses.h
do :
as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -8980,63 +9717,9 @@ _ACEOF
fi
done
-if test "x$enable_openimageio" = "xyes"; then
- ac_fn_cxx_check_header_compile "$LINENO" "OpenEXR/ImathVec.h" "ac_cv_header_OpenEXR_ImathVec_h" "$ac_includes_default"
-if test "x$ac_cv_header_OpenEXR_ImathVec_h" = xyes
-then :
- ac_fn_cxx_check_header_compile "$LINENO" "OpenImageIO/imageio.h" "ac_cv_header_OpenImageIO_imageio_h" "$ac_includes_default"
-if test "x$ac_cv_header_OpenImageIO_imageio_h" = xyes
-then :
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for open in -lOpenImageIO" >&5
-printf %s "checking for open in -lOpenImageIO... " >&6; }
-if test ${ac_cv_lib_OpenImageIO_open+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lOpenImageIO $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-namespace conftest {
- extern "C" int open ();
-}
-int
-main (void)
-{
-return conftest::open ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"
-then :
- ac_cv_lib_OpenImageIO_open=yes
-else $as_nop
- ac_cv_lib_OpenImageIO_open=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OpenImageIO_open" >&5
-printf "%s\n" "$ac_cv_lib_OpenImageIO_open" >&6; }
-if test "x$ac_cv_lib_OpenImageIO_open" = xyes
-then :
- printf "%s\n" "#define HAVE_LIBOPENIMAGEIO 1" >>confdefs.h
-
- LIBS="-lOpenImageIO $LIBS"
-
-fi
-
-fi
-
-fi
-
-fi
case "$OSTYPE" in
- msdos)
+ darwin*)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GC_throw_bad_alloc in -lgccpp" >&5
printf %s "checking for GC_throw_bad_alloc in -lgccpp... " >&6; }
if test ${ac_cv_lib_gccpp_GC_throw_bad_alloc+y}
@@ -9079,320 +9762,369 @@ then :
fi
- ac_fn_cxx_check_header_compile "$LINENO" "GL/glut.h" "ac_cv_header_GL_glut_h" "$ac_includes_default"
-if test "x$ac_cv_header_GL_glut_h" = xyes
+ ac_fn_cxx_check_header_compile "$LINENO" "OpenGL/gl.h" "ac_cv_header_OpenGL_gl_h" "$ac_includes_default"
+if test "x$ac_cv_header_OpenGL_gl_h" = xyes
then :
-printf "%s\n" "#define HAVE_LIBGLUT 1" >>confdefs.h
+printf "%s\n" "#define HAVE_LIBGL 1" >>confdefs.h
- LIBS=$LIBS"-lfreeglut "
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libfreeglut: will compile without OpenGL support ***" >&5
-printf "%s\n" "$as_me: *** Could not find libfreeglut: will compile without OpenGL support ***" >&6;}
fi
- ac_fn_cxx_check_header_compile "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
-if test "x$ac_cv_header_GL_gl_h" = xyes
+ ac_fn_cxx_check_header_compile "$LINENO" "GLUT/glut.h" "ac_cv_header_GLUT_glut_h" "$ac_includes_default"
+if test "x$ac_cv_header_GLUT_glut_h" = xyes
then :
-printf "%s\n" "#define HAVE_LIBGL 1" >>confdefs.h
+printf "%s\n" "#define HAVE_LIBGLUT 1" >>confdefs.h
- LIBS=$LIBS"-lopengl32 "
- GLEW="glew.o "
+ LIBS=$LIBS"-framework GLUT -framework OpenGL -framework Cocoa "
+ INCL=$INCL" -Ibackports/glew/include"
+ GLEW="glew.o "
else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libopengl32: will compile without OpenGL support ***" >&5
-printf "%s\n" "$as_me: *** Could not find libopengl32: will compile without OpenGL support ***" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find GLUT: will compile without OpenGLLUT support ***" >&5
+printf "%s\n" "$as_me: *** Could not find GLUT: will compile without OpenGLLUT support ***" >&6;}
fi
;;
- darwin*)
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GC_throw_bad_alloc in -lgccpp" >&5
-printf %s "checking for GC_throw_bad_alloc in -lgccpp... " >&6; }
-if test ${ac_cv_lib_gccpp_GC_throw_bad_alloc+y}
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glutMainLoop in -lglut" >&5
+printf %s "checking for glutMainLoop in -lglut... " >&6; }
+if test ${ac_cv_lib_glut_glutMainLoop+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgccpp $LIBS"
+LIBS="-lglut $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
namespace conftest {
- extern "C" int GC_throw_bad_alloc ();
+ extern "C" int glutMainLoop ();
}
int
main (void)
{
-return conftest::GC_throw_bad_alloc ();
+return conftest::glutMainLoop ();
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"
then :
- ac_cv_lib_gccpp_GC_throw_bad_alloc=yes
+ ac_cv_lib_glut_glutMainLoop=yes
else $as_nop
- ac_cv_lib_gccpp_GC_throw_bad_alloc=no
+ ac_cv_lib_glut_glutMainLoop=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gccpp_GC_throw_bad_alloc" >&5
-printf "%s\n" "$ac_cv_lib_gccpp_GC_throw_bad_alloc" >&6; }
-if test "x$ac_cv_lib_gccpp_GC_throw_bad_alloc" = xyes
-then :
- printf "%s\n" "#define HAVE_LIBGCCPP 1" >>confdefs.h
-
- LIBS="-lgccpp $LIBS"
-
-fi
-
- ac_fn_cxx_check_header_compile "$LINENO" "OpenGL/gl.h" "ac_cv_header_OpenGL_gl_h" "$ac_includes_default"
-if test "x$ac_cv_header_OpenGL_gl_h" = xyes
-then :
-
-printf "%s\n" "#define HAVE_LIBGL 1" >>confdefs.h
-
-fi
-
- ac_fn_cxx_check_header_compile "$LINENO" "GLUT/glut.h" "ac_cv_header_GLUT_glut_h" "$ac_includes_default"
-if test "x$ac_cv_header_GLUT_glut_h" = xyes
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_glut_glutMainLoop" >&5
+printf "%s\n" "$ac_cv_lib_glut_glutMainLoop" >&6; }
+if test "x$ac_cv_lib_glut_glutMainLoop" = xyes
then :
+ printf "%s\n" "#define HAVE_LIBGLUT 1" >>confdefs.h
-printf "%s\n" "#define HAVE_LIBGLUT 1" >>confdefs.h
+ LIBS="-lglut $LIBS"
- LIBS=$LIBS"-framework GLUT -framework OpenGL -framework Cocoa "
- GLEW="glew.o "
else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find GLUT: will compile without OpenGLLUT support ***" >&5
-printf "%s\n" "$as_me: *** Could not find GLUT: will compile without OpenGLLUT support ***" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libglut: will compile without OpenGL support ***" >&5
+printf "%s\n" "$as_me: *** Could not find libglut: will compile without OpenGL support ***" >&6;}
fi
- ;;
- *)
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GC_throw_bad_alloc in -lgccpp" >&5
-printf %s "checking for GC_throw_bad_alloc in -lgccpp... " >&6; }
-if test ${ac_cv_lib_gccpp_GC_throw_bad_alloc+y}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glDepthMask in -lGL" >&5
+printf %s "checking for glDepthMask in -lGL... " >&6; }
+if test ${ac_cv_lib_GL_glDepthMask+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgccpp $LIBS"
+LIBS="-lGL $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
namespace conftest {
- extern "C" int GC_throw_bad_alloc ();
+ extern "C" int glDepthMask ();
}
int
main (void)
{
-return conftest::GC_throw_bad_alloc ();
+return conftest::glDepthMask ();
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"
then :
- ac_cv_lib_gccpp_GC_throw_bad_alloc=yes
+ ac_cv_lib_GL_glDepthMask=yes
else $as_nop
- ac_cv_lib_gccpp_GC_throw_bad_alloc=no
+ ac_cv_lib_GL_glDepthMask=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gccpp_GC_throw_bad_alloc" >&5
-printf "%s\n" "$ac_cv_lib_gccpp_GC_throw_bad_alloc" >&6; }
-if test "x$ac_cv_lib_gccpp_GC_throw_bad_alloc" = xyes
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glDepthMask" >&5
+printf "%s\n" "$ac_cv_lib_GL_glDepthMask" >&6; }
+if test "x$ac_cv_lib_GL_glDepthMask" = xyes
then :
- printf "%s\n" "#define HAVE_LIBGCCPP 1" >>confdefs.h
- LIBS="-lgccpp $LIBS"
+printf "%s\n" "#define HAVE_LIBGL 1" >>confdefs.h
+ LIBS=$LIBS"-lGL "
+ GLEW="glew.o "
+ INCL=$INCL" -Ibackports/glew/include"
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libGL: will compile without OpenGL support ***" >&5
+printf "%s\n" "$as_me: *** Could not find libGL: will compile without OpenGL support ***" >&6;}
fi
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glutMainLoop in -lglut" >&5
-printf %s "checking for glutMainLoop in -lglut... " >&6; }
-if test ${ac_cv_lib_glut_glutMainLoop+y}
+esac
+ if test "x$enable_offscreen" = "xyes"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OSMesaCreateContext in -lOSMesa" >&5
+printf %s "checking for OSMesaCreateContext in -lOSMesa... " >&6; }
+if test ${ac_cv_lib_OSMesa_OSMesaCreateContext+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lglut $LIBS"
+LIBS="-lOSMesa $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
namespace conftest {
- extern "C" int glutMainLoop ();
+ extern "C" int OSMesaCreateContext ();
}
int
main (void)
{
-return conftest::glutMainLoop ();
+return conftest::OSMesaCreateContext ();
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"
then :
- ac_cv_lib_glut_glutMainLoop=yes
+ ac_cv_lib_OSMesa_OSMesaCreateContext=yes
else $as_nop
- ac_cv_lib_glut_glutMainLoop=no
+ ac_cv_lib_OSMesa_OSMesaCreateContext=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_glut_glutMainLoop" >&5
-printf "%s\n" "$ac_cv_lib_glut_glutMainLoop" >&6; }
-if test "x$ac_cv_lib_glut_glutMainLoop" = xyes
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OSMesa_OSMesaCreateContext" >&5
+printf "%s\n" "$ac_cv_lib_OSMesa_OSMesaCreateContext" >&6; }
+if test "x$ac_cv_lib_OSMesa_OSMesaCreateContext" = xyes
then :
- printf "%s\n" "#define HAVE_LIBGLUT 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_LIBOSMESA 1" >>confdefs.h
- LIBS="-lglut $LIBS"
+ LIBS="-lOSMesa $LIBS"
else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libglut: will compile without OpenGL support ***" >&5
-printf "%s\n" "$as_me: *** Could not find libglut: will compile without OpenGL support ***" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libOSMesa: will compile without offscreen rendering support ***" >&5
+printf "%s\n" "$as_me: *** Could not find libOSMesa: will compile without offscreen rendering support ***" >&6;}
fi
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glDepthMask in -lGL" >&5
-printf %s "checking for glDepthMask in -lGL... " >&6; }
-if test ${ac_cv_lib_GL_glDepthMask+y}
+ fi
+fi
+fi
+
+# ------------------- VCPKG INSTALL
+
+if test "x$with_vcpkg" != "xno"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Running vcpkg install" >&5
+printf "%s\n" "$as_me: Running vcpkg install" >&6;}
+$vcpkg_exec install $VCPKG_INSTALL_ARGUMENTS
+
+LIBS=$LIBS"$(PKG_CONFIG_PATH=$VCPKG_PKG_CONFIG_LOC pkg-config --libs $VCPKG_LIBS_TO_USE_PKG_CONFIG) "
+CFLAGS=$CFLAGS" $(PKG_CONFIG_PATH=$VCPKG_PKG_CONFIG_LOC pkg-config --cflags-only-other $VCPKG_LIBS_TO_USE_PKG_CONFIG)"
+INCL=$INCL" $(PKG_CONFIG_PATH=$VCPKG_PKG_CONFIG_LOC pkg-config --cflags-only-I $VCPKG_LIBS_TO_USE_PKG_CONFIG)"
+fi
+
+# ----------------- xdr ------------------------
+# managed by the system here, unlike other packages
+
+# Check whether --enable-xdr was given.
+if test ${enable_xdr+y}
then :
- printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lGL $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
+ enableval=$enable_xdr;
+fi
-namespace conftest {
- extern "C" int glDepthMask ();
-}
+if test "x$enable_xdr" != "xno"; then
+case "$OSTYPE" in
+ darwin* | FreeBSD)
+
+printf "%s\n" "#define HAVE_LIBTIRPC 1" >>confdefs.h
+
+ ;;
+ *)
+
+CPPFLAGS="$CPPFLAGS "$(pkg-config --silence-errors --cflags libtirpc || echo)
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "xstream.h"
int
main (void)
{
-return conftest::glDepthMask ();
+
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_link "$LINENO"
-then :
- ac_cv_lib_GL_glDepthMask=yes
-else $as_nop
- ac_cv_lib_GL_glDepthMask=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glDepthMask" >&5
-printf "%s\n" "$ac_cv_lib_GL_glDepthMask" >&6; }
-if test "x$ac_cv_lib_GL_glDepthMask" = xyes
+if ac_fn_cxx_try_compile "$LINENO"
then :
-printf "%s\n" "#define HAVE_LIBGL 1" >>confdefs.h
- LIBS=$LIBS"-lGL "
- GLEW="glew.o "
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glXGetProcAddressARB in -lGLX" >&5
-printf %s "checking for glXGetProcAddressARB in -lGLX... " >&6; }
-if test ${ac_cv_lib_GLX_glXGetProcAddressARB+y}
+PKG_FLAGS=" "$(pkg-config --silence-errors --libs libtirpc || echo)
+
+ if test "x$PKG_FLAGS" == "x "; then
+ PKG_FLAGS=-l"tirpc"
+ echo will try linking with $PKG_FLAGS
+ fi
+ LDFLAGS_SAVE=$LDFLAGS
+ LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Checking tirpc for function xdrstdio_create... PKG_FLAGS:$PKG_FLAGS" >&5
+printf "%s\n" "$as_me: Checking tirpc for function xdrstdio_create... PKG_FLAGS:$PKG_FLAGS" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xdrstdio_create in -ltirpc" >&5
+printf %s "checking for xdrstdio_create in -ltirpc... " >&6; }
+if test ${ac_cv_lib_tirpc_xdrstdio_create+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lGLX $LIBS"
+LIBS="-ltirpc $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
namespace conftest {
- extern "C" int glXGetProcAddressARB ();
+ extern "C" int xdrstdio_create ();
}
int
main (void)
{
-return conftest::glXGetProcAddressARB ();
+return conftest::xdrstdio_create ();
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"
then :
- ac_cv_lib_GLX_glXGetProcAddressARB=yes
+ ac_cv_lib_tirpc_xdrstdio_create=yes
else $as_nop
- ac_cv_lib_GLX_glXGetProcAddressARB=no
+ ac_cv_lib_tirpc_xdrstdio_create=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLX_glXGetProcAddressARB" >&5
-printf "%s\n" "$ac_cv_lib_GLX_glXGetProcAddressARB" >&6; }
-if test "x$ac_cv_lib_GLX_glXGetProcAddressARB" = xyes
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tirpc_xdrstdio_create" >&5
+printf "%s\n" "$ac_cv_lib_tirpc_xdrstdio_create" >&6; }
+if test "x$ac_cv_lib_tirpc_xdrstdio_create" = xyes
then :
- GLEW=$GLEW"-lGLX "
-fi
+
+printf "%s\n" "#define HAVE_LIBTIRPC 1" >>confdefs.h
else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libGL: will compile without OpenGL support ***" >&5
-printf "%s\n" "$as_me: *** Could not find libGL: will compile without OpenGL support ***" >&6;}
-fi
+ if test "x$enable_static" = "xyes"; then
-esac
- if test "x$enable_offscreen" = "xyes"; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OSMesaCreateContext in -lOSMesa" >&5
-printf %s "checking for OSMesaCreateContext in -lOSMesa... " >&6; }
-if test ${ac_cv_lib_OSMesa_OSMesaCreateContext+y}
+ echo "Static library not found; will check for dynamic version"
+ LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
+ { ac_cv_lib_tirpc_xdrstdio_create=; unset ac_cv_lib_tirpc_xdrstdio_create;}
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xdrstdio_create in -ltirpc" >&5
+printf %s "checking for xdrstdio_create in -ltirpc... " >&6; }
+if test ${ac_cv_lib_tirpc_xdrstdio_create+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lOSMesa $LIBS"
+LIBS="-ltirpc $PKG_FLAGS
+ $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
namespace conftest {
- extern "C" int OSMesaCreateContext ();
+ extern "C" int xdrstdio_create ();
}
int
main (void)
{
-return conftest::OSMesaCreateContext ();
+return conftest::xdrstdio_create ();
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"
then :
- ac_cv_lib_OSMesa_OSMesaCreateContext=yes
+ ac_cv_lib_tirpc_xdrstdio_create=yes
else $as_nop
- ac_cv_lib_OSMesa_OSMesaCreateContext=no
+ ac_cv_lib_tirpc_xdrstdio_create=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OSMesa_OSMesaCreateContext" >&5
-printf "%s\n" "$ac_cv_lib_OSMesa_OSMesaCreateContext" >&6; }
-if test "x$ac_cv_lib_OSMesa_OSMesaCreateContext" = xyes
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tirpc_xdrstdio_create" >&5
+printf "%s\n" "$ac_cv_lib_tirpc_xdrstdio_create" >&6; }
+if test "x$ac_cv_lib_tirpc_xdrstdio_create" = xyes
then :
- printf "%s\n" "#define HAVE_LIBOSMESA 1" >>confdefs.h
- LIBS="-lOSMesa $LIBS"
+printf "%s\n" "#define HAVE_LIBTIRPC 1" >>confdefs.h
else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libOSMesa: will compile without offscreen rendering support ***" >&5
-printf "%s\n" "$as_me: *** Could not find libOSMesa: will compile without offscreen rendering support ***" >&6;}
+
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libtirpc; XDR/V3D support disabled ***" >&5
+printf "%s\n" "$as_me: *** Could not find libtirpc; XDR/V3D support disabled ***" >&6;}
+
+
fi
- fi
+
+ else
+
+ LDFLAGS=$LDFLAGS_SAVE
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Could not find libtirpc; XDR/V3D support disabled ***" >&5
+printf "%s\n" "$as_me: *** Could not find libtirpc; XDR/V3D support disabled ***" >&6;}
+
+
+ fi
fi
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: *** Broken rpc headers; XDR/V3D support disabled ***" >&5
+printf "%s\n" "$as_me: *** Broken rpc headers; XDR/V3D support disabled ***" >&6;}
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+esac
+fi
+
+CPPFLAGS=$CPPFLAGS" $INCL"
+CXX_STANDARD=$cxxstd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# we are on C++ >= 11, so unordered map is a guarantee
+
+printf "%s\n" "#define HAVE_UNORDERED_MAP 1" >>confdefs.h
+
+
# Checks for typedefs, structures, and compiler characteristics.
ac_fn_cxx_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default
@@ -10064,11 +10796,10 @@ then :
fi
-ac_config_headers="$ac_config_headers config.h"
-
-
ac_config_files="$ac_config_files Makefile doc/Makefile doc/png/Makefile"
+ac_config_headers="$ac_config_headers config.h"
+
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
@@ -10179,7 +10910,6 @@ LTLIBOBJS=$ac_ltlibobjs
-
: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
@@ -10569,7 +11299,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by Asymptote $as_me 2.90, which was
+This file was extended by Asymptote $as_me 3.00, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -10633,7 +11363,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-Asymptote config.status 2.90
+Asymptote config.status 3.00
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
@@ -10755,10 +11485,10 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
for ac_config_target in $ac_config_targets
do
case $ac_config_target in
- "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
"doc/png/Makefile") CONFIG_FILES="$CONFIG_FILES doc/png/Makefile" ;;
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
esac
@@ -11346,41 +12076,3 @@ printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2
fi
-if test "x$GCDIR" != "x" ; then
- as_ac_File=`printf "%s\n" "ac_cv_file_$GCDIR.tar.gz" | $as_tr_sh`
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $GCDIR.tar.gz" >&5
-printf %s "checking for $GCDIR.tar.gz... " >&6; }
-if eval test \${$as_ac_File+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- test "$cross_compiling" = yes &&
- as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
-if test -r "$GCDIR.tar.gz"; then
- eval "$as_ac_File=yes"
-else
- eval "$as_ac_File=no"
-fi
-fi
-eval ac_res=\$$as_ac_File
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-printf "%s\n" "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_File"\" = x"yes"
-then :
-
-else $as_nop
-
- echo
- echo Please put the Boehm garbage collector tar.gz files in the asymptote directory.
- echo FOR EXAMPLE, USE THE COMMANDS:
- echo
- echo wget https://github.com/ivmai/bdwgc/releases/download/v$GCVERSION/$GCFILE.tar.gz
- echo wget https://github.com/ivmai/libatomic_ops/releases/download/v$ATOMICVERSION/libatomic_ops-$ATOMICVERSION.tar.gz
-
- echo
- exit 1
-
-fi
-
-fi
-
diff --git a/graphics/asymptote/configure.ac b/graphics/asymptote/configure.ac
index 7e6dd1aaa1..fe19bc5449 100644
--- a/graphics/asymptote/configure.ac
+++ b/graphics/asymptote/configure.ac
@@ -2,15 +2,17 @@
# Run autoheader and autoconf to produce a header and configure script from
# this file.
-AC_PREREQ(2)
-AC_INIT([Asymptote],[2.90],[https://github.com/vectorgraphics/asymptote/issues])
+AC_PREREQ([2.71])
+AC_INIT([Asymptote],[3.00],[https://github.com/vectorgraphics/asymptote/issues])
VERSION=$PACKAGE_VERSION
AC_SUBST(VERSION)
m4_include([ax_pthread.m4])
m4_include([pkg.m4])
-AC_C_BIGENDIAN
+AH_TOP([#pragma once])
+
AC_CANONICAL_HOST
+AC_CANONICAL_TARGET
test "$prefix" = NONE && prefix=/usr/local
Datadir=$datadir
@@ -20,18 +22,61 @@ AC_SUBST(Datadir)
AC_ARG_ENABLE(lsp,
[AS_HELP_STRING(--enable-lsp[[[=yes]]],enable Language Server Protocol)])
-if test "x$enable_lsp" != "xno"; then
-cxxstd="c++14"
-else
-cxxstd="c++11"
-AC_MSG_NOTICE([*** Language Server Protocol disabled by configure flag ***])
-fi
+cxxstd="c++17"
-test "$CXXFLAGS" || CXXFLAGS="-std=$cxxstd"
-echo Compiling with $CXXFLAGS
+CXXFLAGS=$CXXFLAGS" -std=$cxxstd"
test "$CFLAGS" || CFLAGS="-g -O3"
+AC_C_BIGENDIAN(
+ [AC_DEFINE(WORDS_BIGENDIAN,1,[Build is big endian])],
+ [],
+ [],
+ [AC_DEFINE(UNIVERSAL_ENDIAN_BUILD,1,[Endianness is determined at compile time])]
+)
+
+echo Compiling with $CXXFLAGS $CFLAGS
+
+# --------------- external refs ---------------------------
+
+# we need LSP regardless
+EXTERNAL_CODE_ROOT=.
+EXTERNAL_BUILD_ROOT=.
+
+# --------------- begin vcpkg option/check ---------------------
+# result:
+# with_vcpkg is yes/no, depending if user wants to use vcpkg or not
+# vcpkg_exec is the executable of vcpkg. this is only given if use_vcpkg is yes.
+
+AC_ARG_WITH(vcpkg,
+ [AS_HELP_STRING(--with-vcpkg=[[[no]]],
+ [Use vcpkg. If VCPKG_ROOT environment variable is set, will use that vcpkg. Otherwise searches in PATH.]
+ )
+],[
+ if test "x$VCPKG_ROOT" = "x"; then # vcpkg root not given
+ echo "VCPKG_ROOT is not given; searching vcpkg in path"
+ AC_CHECK_PROG(has_vcpkg,vcpkg,true)
+ if test "x$has_vcpkg" = "xtrue"; then
+ vcpkg_exec=vcpkg
+ fi
+ else
+ echo "VCPKG_ROOT is given; is using VCPKG_ROOT"
+ AC_CHECK_FILE($VCPKG_ROOT/vcpkg,[
+ vcpkg_exec=$VCPKG_ROOT/vcpkg
+ ])
+ fi
+
+ # ensure vcpkg is specified
+ if test "x$vcpkg_exec" = "x"; then
+ AC_MSG_ERROR([Please ensure vcpkg is available through VCPKG_ROOT or in PATH])
+ fi
+ echo "Using vcpkg executable $vcpkg_exec"
+],[
+with_vcpkg=no
+])
+
+#----------------- end vcpkg option check --------------------
+
AC_ARG_WITH(latex,
[AS_HELP_STRING(--with-latex=PATH,
specify path to LaTeX installation)],
@@ -137,170 +182,190 @@ if test "$GXX" = yes ; then
fi
AC_DEFUN([DEFINE],[
-Define to 1 if you have $1.
+Define to 1 if you have `$1`.
])
AC_DEFUN([DEFINE_LIB],[
-Define to 1 if you have the `$1' library (-l$1).
+Define to 1 if you have the `$1` library (-l$1).
])
-AC_CHECK_HEADER(tr1/unordered_map)
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
- [#include <tr1/unordered_map>]
- [std::tr1::unordered_map<int,int> map;]
- )],
- AC_DEFINE(HAVE_TR1_UNORDERED_MAP,1,
- DEFINE([<tr1/unordered_map>])),
- [
- AC_CHECK_HEADER(unordered_map,AC_DEFINE(HAVE_UNORDERED_MAP,1,
- DEFINE([<unordered_map>])),
- [AC_CHECK_HEADER(ext/hash_map,,OPTIONS=$OPTIONS"-DNOHASH ")])])
-
ASYGLVERSION=1.02
-GCVERSION=8.2.4
-ATOMICVERSION=7.6.12
-
-GCFILE=gc-$GCVERSION
-ac_cv_use_gc="system"
-
-AC_CHECK_FILE($GCFILE.tar.gz,
-ac_cv_use_gc=$GCVERSION)
-AC_ARG_ENABLE(gc,
- [AS_HELP_STRING(--enable-gc[[[=system]]],
-enable system Boehm garbage collector)]
- [ [[=VERSION]] enable local VERSION of Boehm garbage collector]
- [ [[=PREFIX]] use Boehm garbage collector installed in PREFIX],
- [
- if test "x$enableval" != "xyes" ; then
- ac_cv_use_gc=$enableval
- fi
- ])
-
-OPTIONS="-D_FILE_OFFSET_BIS=64 "
-GCLIB=
-GCPPLIB=
-INCL="-I."
-GCNAME="Boehm Garbage Collector"
-if test "x$ac_cv_use_gc" != "xno" ; then
- OPTIONS=$OPTIONS"-DUSEGC -DLSPCPP_USEGC "
- case _$ac_cv_use_gc in
- _|_system|_*[[\\/]]*)
- if test "x$ac_cv_use_gc" = "xsystem" ; then
- INCL="-I. -I$prefix/include/gc -I/usr/include/gc"
- LIBS=$LIBS"-L$prefix/lib "
+DEFS=""
+OPTIONS=$OPTIONS"-D_FILE_OFFSET_BITS=64 "
+INCL=""
+OPTIONS=""
+LIBS=""
+CPPFLAGS=$CPPFLAGS" -I. "
+
+# ------------- vcpkg initialization ---------------
+# vcpkg_triplet
+
+AC_ARG_WITH(vcpkg-target-triplet,
+ AS_HELP_STRING(--with-vcpkg-target-triplet[[[=<target-triplet>]]],
+ [
+ specify custom vcpkg triplet. This option is only relevant if vcpkg is used.
+ If left blank, will try to determine the triplet
+ ]
+ ), [ # given
+ if test "x$with_vcpkg" != "xno" -a "x$withval" != "xno"; then
+ vcpkg_triplet=$withval
+ fi
+ ],[ # not given
+ if test "x$with_vcpkg" != "xno"; then
+ case $target_cpu in
+ x86_64)
+ triplet_arch=x64
+ ;;
+ aarch64)
+ triplet_arch=arm64
+ ;;
+ i*86)
+ triplet_arch=x86
+ ;;
+ *)
+ AC_MSG_NOTICE([Cannot determine architecture, will leave triplet blank])
+ ;;
+ esac
+
+ case "$OSTYPE" in
+ darwin*)
+ triplet_os=osx
+ ;;
+ *)
+ triplet_os=linux
+ ;;
+ esac
+
+ if test "x$triplet_arch" != "x" -a "x$triplet_os" != "x"; then
+ vcpkg_triplet="${triplet_arch}-${triplet_os}"
+ AC_MSG_NOTICE([Determined vcpkg triplet as $vcpkg_triplet])
else
- INCL="-I$ac_cv_use_gc/include/gc"
- LIBS=$LIBS"-L$ac_cv_use_gc/lib "
+ AC_MSG_ERROR([Cannot determine vcpkg triplet for usage])
fi
- CPPFLAGS_SAVE=$CPPFLAGS
- CPPFLAGS=$CPPFLAGS" $INCL"
- AC_CHECK_HEADER(gc.h,
- AC_CHECK_LIB([gc],[GC_malloc],[
- LIBS=$LIBS"-lgc "
- AC_MSG_NOTICE([enabling system $GCNAME])],[
- GCDIR=$GCFILE
- INCL="-I. -I\$(GC)/include"
- GCLIB="\$(GC)/.libs/libgc.a"
- AC_MSG_NOTICE($GCNAME library not found)]),
- GCDIR=$GCFILE
- GCLIB="\$(GC)/.libs/libgc.a"
- INCL="-I. -I\$(GC)/include"
- AC_MSG_NOTICE($GCNAME header file not found))
- CPPFLAGS=$CPPFLAGS_SAVE
- ;;
- *)
- GCVERSION=$ac_cv_use_gc
- GCFILE=gc-$GCVERSION
- GCDIR=$GCFILE
- AC_MSG_NOTICE([enabling local $GCNAME $GCDIR])
- GCLIB="\$(GC)/.libs/libgc.a"
- INCL="-I. -I\$(GC)/include"
- ;;
- esac
-else
- AC_MSG_NOTICE([disabling the $GCNAME])
+ fi
+ ]
+)
+
+if test "x$with_vcpkg" != "xno"; then
+ VCPKG_INSTALL_ARGUMENTS="--triplet=$vcpkg_triplet "
+ VCPKG_PKG_CONFIG_LOC="vcpkg_installed/$vcpkg_triplet/lib/pkgconfig"
+ INCL=$INCL" -Ivcpkg_installed/$vcpkg_triplet/include"
+ LIBS=$LIBS"-Lvcpkg_installed/$vcpkg_triplet/lib "
+
+ VCPKG_LIBS_TO_USE_PKG_CONFIG=""
+ AC_DEFUN([ADD_VCPKG_LIB_FOR_PKGCONFIG],[VCPKG_LIBS_TO_USE_PKG_CONFIG=$VCPKG_LIBS_TO_USE_PKG_CONFIG"$1 "])
+ AC_DEFUN([ADD_VCPKG_FEATURE],[VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--x-feature=$1 "])
fi
-AC_ARG_ENABLE(gc-debug,
-[AS_HELP_STRING(--enable-gc-debug,enable (slow) garbage collector debugging)],
-[ if test "x$ac_cv_use_gc" != "xno" ; then
- if test "x$enableval" = "xyes" ; then
- OPTIONS=$OPTIONS"-DGC_DEBUG "
- AC_MSG_NOTICE([*** Enabling GC debugging: remember to make clean ***])
- AC_MSG_NOTICE([*** Set the environment variable GC_FIND_LEAK at runtime ***])
- fi
- fi
-])
-AC_ARG_ENABLE(gc-full-debug,
-[AS_HELP_STRING(--enable-gc-full-debug,enable (very slow) garbage collector backtrace)],
-[ if test "x$ac_cv_use_gc" != "xno" ; then
- if test "x$enableval" = "xyes" ; then
- OPTIONS=$OPTIONS"-DGC_DEBUG -DGC_BACKTRACE "
- GCOPTIONS=$GCOPTIONS"--enable-gc-debug "
- AC_MSG_NOTICE([*** Enabling GC backtrace debugging; remember to make gc-clean ***])
- fi
- fi
-])
+AC_ARG_WITH(vcpkg-host-triplet,
+ AS_HELP_STRING(--with-vcpkg-host-triplet[[[=<host-triplet>]]],
+ [
+ specify custom vcpkg host triplet. This option is only relevant if vcpkg is ued.
+ If left blank, will try to determine the triplet
+ ]
+ ), [ # given
+ if test "x$with_vcpkg" != "xno" -a "x$withval" != "xno"; then
+ VCPKG_INSTALL_ARGUMENTS=$VCPKG_INSTALL_ARGUMENTS"--host-triplet=$withval "
+ fi
+ ],
+)
-if test "$OSTYPE" = "msdos"; then
-CPPFLAGS=$CPPFLAGS" -D__MSDOS__ -I/usr/include/w32api -I/usr/include -DCALLBACK=__stdcall $INCL"
-else
-CPPFLAGS=$CPPFLAGS" $INCL"
-fi
-AC_CHECK_FUNC(getopt_long_only, AC_DEFINE(HAVE_GNU_GETOPT_H, 1,
- DEFINE([GNU <getopt.h>])),
- getopt="getopt getopt1",)
-AC_SUBST(getopt)
-AC_SUBST(GCVERSION)
-AC_SUBST(ASYGLVERSION)
-AC_SUBST(ATOMICVERSION)
-AC_SUBST(GCOPTIONS)
-AC_SUBST(GCLIB)
-AC_SUBST(GCPPLIB)
-AC_SUBST(LSPLIB)
-AC_SUBST(LSPLIBS)
-AC_SUBST(INCL)
-AC_SUBST(OPTIONS)
-AC_SUBST(GLEW)
# Checks for libraries.
#AC_SEARCH_LIBS([lgamma],[m c],,
#AC_MSG_ERROR([*** Please install libm on your system ***]))
-AC_CHECK_LIB([z], [deflate],,
-AC_MSG_ERROR([*** Please install libz or zlib-devel on your system ***]))
-GCOPTIONS="--disable-shared "
-AC_ARG_ENABLE(threads,
-[AS_HELP_STRING(--enable-threads[[[=yes]]],enable POSIX threads)])
+# ----------------- zlib ----------------------------
+if test "x$with_vcpkg" != "xno"; then
+ ADD_VCPKG_LIB_FOR_PKGCONFIG(zlib)
+else
+ AC_CHECK_LIB(
+ [z],
+ [deflate],
+ ,
+ AC_MSG_ERROR([*** Please install libz or zlib-devel on your system ***])
+ )
+fi
+AC_DEFINE(HAVE_ZLIB,1,[ZLib library present])
+
+# -------------- threads -------------------
+
+
+GCOPTIONS="--disable-shared --disable-dependency-tracking"
+AC_ARG_ENABLE(
+ threads,
+ [AS_HELP_STRING(--enable-threads[[[=yes]]],enable POSIX threads)]
+)
if test "x$enable_threads" != "xno"; then
- AX_PTHREAD
+ if test "x$with_vcpkg" != "xno"; then
+ ADD_VCPKG_FEATURE(threading)
+ AC_DEFINE(HAVE_PTHREAD,1)
+ OPTIONS=$OPTIONS" -pthread"
+ else
+ AX_PTHREAD
+ fi
else
GCOPTIONS=$GCOPTIONS"--disable-threads "
fi
-AC_ARG_ENABLE(sigsegv,
-[AS_HELP_STRING(--enable-sigsegv[[[=yes]]],enable GNU Stack Overflow Handler)])
+# --------------- sigsegv ------------------------------
+
+if test "x$with_vcpkg" = "xno"; then
+ AC_ARG_ENABLE(sigsegv,
+ [AS_HELP_STRING(--enable-sigsegv[[[=yes]]],enable GNU Stack Overflow Handler)])
-if test "x$enable_sigsegv" != "xno"; then
- AC_CHECK_LIB([sigsegv], [stackoverflow_install_handler])
+ if test "x$enable_sigsegv" != "xno"; then
+ AC_CHECK_LIB([sigsegv], [stackoverflow_install_handler])
+ fi
+
+ AC_CHECK_LIB([rt], [sched_yield])
fi
-AC_CHECK_LIB([rt], [sched_yield])
+# ----------------- lsp -------------------------------
+
+LSP_ROOT=LspCpp
+AC_SUBST(LSP_ROOT)
LSPLIBS=
LSPLIB=
if test "x$enable_lsp" != "xno" -a "x$enable_threads" != "xno"; then
AC_CHECK_LIB([boost_filesystem],[opendir],
[AC_CHECK_LIB([boost_thread],[pthread_attr_getdetachstate],
- [AC_DEFINE(HAVE_LSP,1,DEFINE([Language server protocol]))
- LSPLIBS="-llspcpp -lnetwork-uri -lboost_filesystem -lboost_thread "
- LSPLIB=liblspcpp.a],
- AC_MSG_NOTICE([*** Could not find libboost_thread: will compile without optional Language Server Protocol. ***]))],
- AC_MSG_NOTICE([*** Could not find libboost_filesystem: will compile without optional Language Server Protocol. ***]))
+ [
+ LSP_BUILD_ROOT=$EXTERNAL_BUILD_ROOT/$LSP_ROOT
+ ROOT_DIR_RELATIVE_TO_SRC=$(realpath -s --relative-to $LSP_ROOT .)
+ LSPLIB=$LSP_BUILD_ROOT/liblspcpp.a
+ LSPLIBS=$LSPLIBS" -L$LSP_BUILD_ROOT -L$LSP_BUILD_ROOT/third_party/uri/src -llspcpp -lnetwork-uri -lboost_filesystem -lboost_thread"
+ LSP_CMAKE_OPTIONS="-DLSPCPP_USE_CPP17=ON "
+
+ if test "x$enable_gc" != "xno"; then
+ LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DLSPCPP_SUPPORT_BOEHM_GC=ON "
+ if test "x$with_vcpkg" = "xno"; then
+ LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DLSPCPP_GC_DOWNLOADED_ROOT=$ROOT_DIR_RELATIVE_TO_SRC/\$(GC) "
+ fi
+ else
+ LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DLSPCPP_SUPPORT_BOEHM_GC=OFF "
+ fi
+
+ AC_DEFUN([ENABLE_LSP_MACRO],
+ AC_SUBST(LSP_CXX_BUILD_FLAGS)
+ AC_SUBST(LSP_CMAKE_OPTIONS)
+ AC_SUBST(LSP_BUILD_ROOT)
+ AC_DEFINE(HAVE_LSP,1,DEFINE([Language server protocol]))
+ )
+ if test "x$with_vcpkg" != "xno"; then
+ ADD_VCPKG_FEATURE(lsp)
+ RELATIVE_LSP_VCPKG_ROOT=$(realpath -s --relative-to=$LSP_BUILD_ROOT vcpkg_installed/$vcpkg_triplet)
+ LSP_CXX_BUILD_FLAGS=$LSP_BUILD_FLAGS"-I$RELATIVE_LSP_VCPKG_ROOT/include -L$RELATIVE_LSP_VCPKG_ROOT/lib "
+ LSP_CMAKE_OPTIONS=$LSP_CMAKE_OPTIONS"-DUSE_SYSTEM_RAPIDJSON=True -DCMAKE_PREFIX_PATH=\"$RELATIVE_LSP_VCPKG_ROOT\" "
+ fi
+ ENABLE_LSP_MACRO],
+ AC_MSG_NOTICE([*** Could not find libboost_thread: will compile without optional Language Server Protocol. ***]))],
+ AC_MSG_NOTICE([*** Could not find libboost_filesystem: will compile without optional Language Server Protocol. ***]))
fi
AC_ARG_ENABLE(readline,
@@ -309,6 +374,14 @@ AC_ARG_ENABLE(readline,
AC_ARG_ENABLE(static,
[AS_HELP_STRING(--enable-static[[[=no]]],link against static libraries)])
+AC_DEFUN([PKG_CONFIG],[
+ifdef(
+ [PKG_CHECK_MODULES],
+ $1="$2 "$(pkg-config --silence-errors $3 $4 || echo),
+ $1="$2 "
+)
+])
+
STATIC=""
DYNAMIC=""
if test "x$enable_static" = "xyes"; then
@@ -316,100 +389,179 @@ if test "x$enable_static" = "xyes"; then
DYNAMIC="-Wl,-Bdynamic "
fi
-AC_DEFUN([READLINE],[
-AC_MSG_NOTICE([*** Could not find GNU readline 4.3 or later: will compile without readline support ***])
-AC_CHECK_LIB([edit],[readline])
-AC_CHECK_HEADERS(editline/readline.h)
+AC_DEFUN([CHECK_LIB_STATIC],[
+ PKG_CONFIG(PKG_FLAGS,,--libs,$1)
+ if test "x$PKG_FLAGS" == "x "; then
+ PKG_FLAGS=-l"$2"
+ echo will try linking with $PKG_FLAGS
+ fi
+ LDFLAGS_SAVE=$LDFLAGS
+ LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
+ AC_MSG_NOTICE([Checking $2 for function $3... PKG_FLAGS:$PKG_FLAGS])
+ AC_CHECK_LIB(
+ $2,$3,
+ AC_DEFINE($4,1,DEFINE_LIB($2)),
+ if test "x$enable_static" = "xyes"; then
+ [
+ echo "Static library not found; will check for dynamic version"
+ LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
+ AS_UNSET([ac_cv_lib_$2_$3])
+
+ AC_CHECK_LIB(
+ $2,$3,
+ AC_DEFINE($4,1,DEFINE_LIB($2)),
+ [
+ LDFLAGS=$LDFLAGS_SAVE
+ $5
+ ],
+ $PKG_FLAGS
+ )
+ ]
+ else
+ [
+ LDFLAGS=$LDFLAGS_SAVE
+ $5
+ ]
+ fi,
+ $PKG_FLAGS
+ )
])
-AC_DEFUN([PKG_CONFIG],[
-ifdef([PKG_CHECK_MODULES],$1="$2 "`pkg-config --silence-errors $3 $4 || echo`,$1="$2 ")
-])
+if test "x$enable_readline" != "xno"; then
+if test "x$with_vcpkg" != "xno"; then # vcpkg
+ ADD_VCPKG_FEATURE(readline)
+ AC_DEFINE(HAVE_NCURSES_CURSES_H)
+ AC_DEFINE(HAVE_LIBCURSES)
+ AC_DEFINE(HAVE_LIBREADLINE)
+ ADD_VCPKG_LIB_FOR_PKGCONFIG(readline)
+ ADD_VCPKG_LIB_FOR_PKGCONFIG(ncurses)
+else # managed by the system
+ PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,readline)
+
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([
+ #include <stdio.h>
+ #include <unistd.h>
+ #include <readline/readline.h>
+ ],[
+ #ifndef RL_READLINE_VERSION
+ abort
+ #endif
+ ])],
+ CHECK_LIB_STATIC(readline,readline,history_list,HAVE_LIBREADLINE,
+ readline="no"),readline="no")
+
+ if test "x$readline" == "xno"; then
+ AC_MSG_NOTICE([*** Could not find GNU readline 4.3 or later: will compile without readline support ***])
+ AC_CHECK_LIB([edit],[readline])
+ AC_CHECK_HEADERS(editline/readline.h)
+ fi
-AC_DEFUN([CHECK_LIB_STATIC],[
-PKG_CONFIG(PKG_FLAGS,,--libs,$1)
-if test "x$PKG_FLAGS" == "x "; then
-PKG_FLAGS=-l"$2"
-echo will try linking with $PKG_FLAGS
+ PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,tinfo)
+ CHECK_LIB_STATIC(tinfo,tinfo,tgetent,HAVE_LIBTINFO,AC_MSG_NOTICE([perhaps tgetent is in -lncurses]))
+
+ PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,ncurses)
+ AC_CHECK_HEADERS([ncurses/curses.h ncurses.h curses.h],[break])
+ CHECK_LIB_STATIC(ncurses,ncurses,setupterm,HAVE_LIBCURSES,
+ AC_CHECK_LIB(curses,setupterm))
fi
-LDFLAGS_SAVE=$LDFLAGS
-LDFLAGS="$LDFLAGS "$STATIC"$PKG_FLAGS "$DYNAMIC
-AC_CHECK_LIB($2,$3,AC_DEFINE($4,1,DEFINE_LIB($2)),
-if test "x$enable_static" = "xyes"; then
-[
-echo "Static library not found; will check for dynamic version"
-LDFLAGS="$LDFLAGS_SAVE ""$PKG_FLAGS "
-AS_UNSET([ac_cv_lib_$2_$3])
-AC_CHECK_LIB($2,$3,AC_DEFINE($4,1,DEFINE_LIB($2)),
-[
-LDFLAGS=$LDFLAGS_SAVE
-$5
-],$PKG_FLAGS)
-]
-else
-[
-LDFLAGS=$LDFLAGS_SAVE
-$5
-]
fi
-,$PKG_FLAGS)]
-)
-if test "x$enable_readline" != "xno"; then
-PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,readline)
+# --------------- gc -------------------------------
-AC_COMPILE_IFELSE([
-AC_LANG_PROGRAM([
-#include <stdio.h>
-#include <unistd.h>
-#include <readline/readline.h>
-],[
-#ifndef RL_READLINE_VERSION
-abort
-#endif
-])],
-CHECK_LIB_STATIC(readline,readline,history_list,HAVE_LIBREADLINE,READLINE),
-READLINE)
-
-PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,tinfo)
-CHECK_LIB_STATIC(tinfo,tinfo,tgetent,HAVE_LIBTINFO,AC_MSG_NOTICE([perhaps tgetent is in -lncurses]))
-
-PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,ncurses)
-AC_CHECK_HEADERS([ncurses/curses.h ncurses.h curses.h],[break])
-CHECK_LIB_STATIC(ncurses,ncurses,setupterm,HAVE_LIBCURSES,
- AC_CHECK_LIB(curses,setupterm))
+GCNAME="Boehm Garbage Collector"
+
+AC_ARG_ENABLE(gc,
+[AS_HELP_STRING(--enable-gc[[[=yes]]],enable local $GCNAME)])
+
+if test "x$enable_gc" != "xno" ; then
+ if test "x$with_vcpkg" == "xno"; then
+ AC_DEFINE(USEGC,1,[GC Enabled])
+ GCLIB="\$(GC)/.libs/libgc.a"
+ INCL=$INCL" -I\$(GC)/include"
+ AC_MSG_NOTICE([$GCNAME is enabled])
+ fi
+else
+ AC_MSG_NOTICE([*** $GCNAME disabled by configure flag: will compile without garbage collection. ***])
fi
+AC_ARG_ENABLE(gc-debug,
+[AS_HELP_STRING(--enable-gc-debug,enable (slow) garbage collector debugging)],
+[ if test "x$enable_gc" != "xno" ; then
+ if test "x$enableval" = "xyes" ; then
+ AC_DEFINE(GC_DEBUG,1,[GC Debug is enabled])
+ AC_MSG_NOTICE([*** Enabling GC debugging: remember to make clean ***])
+ AC_MSG_NOTICE([*** Set the environment variable GC_FIND_LEAK at runtime ***])
+ fi
+ fi
+])
+
+AC_ARG_ENABLE(gc-full-debug,
+[AS_HELP_STRING(--enable-gc-full-debug,enable (very slow) garbage collector backtrace)],
+[ if test "x$enable_gc" != "xno" ; then
+ if test "x$enableval" = "xyes" ; then
+ AC_DEFINE(GC_DEBUG,1,[GC Debug is enabled])
+ AC_DEFINE(GC_BACKTRACE,1,[GC backtrace is enabled])
+ GCOPTIONS=$GCOPTIONS"--enable-gc-debug "
+ AC_MSG_NOTICE([*** Enabling GC backtrace debugging; remember to make gc-clean ***])
+ fi
+ fi
+])
+
+# ---------------- curl ------------------------
+
AC_ARG_ENABLE(curl,
[AS_HELP_STRING(--enable-curl[[[=yes]]],enable libcurl and compile with optional URL support)])
if test "x$enable_curl" != "xno"; then
+if test "x$with_vcpkg" != "xno"; then
+ ADD_VCPKG_FEATURE(curl)
+ AC_DEFINE(HAVE_LIBCURL)
+ ADD_VCPKG_LIB_FOR_PKGCONFIG(libcurl)
+else
PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,curl)
AC_CHECK_HEADER(curl/curl.h,
CHECK_LIB_STATIC(libcurl,curl,curl_easy_init,HAVE_LIBCURL,
AC_MSG_NOTICE([*** Could not find libcurl: will compile without optional URL support. ***])),
AC_MSG_NOTICE([*** Header file curl.h not found: will compile without optional URL support. ***]))
+fi
else
AC_MSG_NOTICE([*** libcurl support disabled by configure flag: will compile without optional URL support. ***])
fi
+# --------------------- fftw -------------------------
+
AC_ARG_ENABLE(fftw,
[AS_HELP_STRING(--enable-fftw[[[=yes]]],enable FFTW Library)])
if test "x$enable_fftw" != "xno"; then
+if test "x$with_vcpkg" != "xno"; then # vcpkg
+ADD_VCPKG_FEATURE(fftw3)
+AC_DEFINE(HAVE_LIBFFTW3)
+ADD_VCPKG_LIB_FOR_PKGCONFIG(fftw3)
+else # system managed
PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,fftw3)
AC_CHECK_HEADER(fftw3.h,
CHECK_LIB_STATIC(fftw3,fftw3,fftw_execute,HAVE_LIBFFTW3,
AC_MSG_NOTICE([*** Could not find libfftw3: will compile without optional fast Fourier transforms. ***])),
AC_MSG_NOTICE([*** Header file fftw3.h not found: will compile without optional fast Fourier transforms. ***]))
fi
+fi
+
+# ------------------- eigen -------------------------
AC_ARG_ENABLE(eigen,
[AS_HELP_STRING(--enable-eigen[[[=yes]]],enable Eigen Library)])
if test "x$enable_eigen" != "xno"; then
+if test "x$with_vcpkg" != "xno"; then
+ADD_VCPKG_FEATURE(eigen3)
+AC_DEFINE(HAVE_EIGEN_DENSE)
+ADD_VCPKG_LIB_FOR_PKGCONFIG(eigen3)
+else
PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,eigen3)
AC_CHECK_HEADERS(Eigen/Dense)
fi
+fi
# Checks for header files.
AC_HEADER_SYS_WAIT
@@ -417,27 +569,18 @@ AC_CHECK_HEADERS([fenv.h stddef.h libintl.h])
AC_CHECK_HEADERS(fpu_control.h)
AC_CHECK_FUNCS([feenableexcept])
-AC_ARG_ENABLE(xdr,
-[AS_HELP_STRING(--enable-xdr[[[=yes]]],enable XDR/V3D support)])
-if test "x$enable_xdr" != "xno"; then
-case "$OSTYPE" in
- darwin*)
- AC_DEFINE(HAVE_LIBTIRPC,1,DEFINE_LIB([tirpc]))
- ;;
- *)
- PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,libtirpc)
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include "xstream.h"])],
- CHECK_LIB_STATIC(libtirpc,tirpc,xdrstdio_create,
- HAVE_LIBTIRPC,AC_MSG_NOTICE([*** Could not find libtirpc; XDR/V3D support disabled ***])),
-AC_MSG_NOTICE([*** Broken rpc headers; XDR/V3D support disabled ***]))
- ;;
-esac
-fi
+# ------------------- GSL --------------------
AC_ARG_ENABLE(gsl,
[AS_HELP_STRING(--enable-gsl[[[=yes]]],enable GNU Scientific Library)])
if test "x$enable_gsl" != "xno"; then
+if test "x$with_vcpkg" != "xno"; then # vcpkg
+ ADD_VCPKG_FEATURE(gsl)
+ AC_DEFINE(HAVE_LIBGSL)
+ LIBS=$LIBS"-lgsl " # gsl's pkg-config file is incomplete
+ ADD_VCPKG_LIB_FOR_PKGCONFIG(gsl)
+else
PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,gsl)
PKG_CONFIG(LDFLAGS,$LDFLAGS,--libs,gsl)
AC_CHECK_HEADER(gsl/gsl_sf.h,
@@ -445,59 +588,72 @@ if test "x$enable_gsl" != "xno"; then
AC_MSG_NOTICE([*** Could not find libgsl: will compile without optional special functions. ***])),
AC_MSG_NOTICE([*** Header file gsl_sf.h not found: will compile without optional special functions. ***]))
fi
+fi
+
+# ----------------- OpenGL -----------------
AC_ARG_ENABLE(gl,
[AS_HELP_STRING(--enable-gl[[[=yes]]],enable OpenGL Library)])
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
- [#include <GL/gl.h>]
- [#if !defined(GL_VERSION_4_3) && !defined(GL_ARB_shader_storage_buffer_object)]
- [#error]
- [#endif ]
- )],
- AC_DEFINE(HAVE_SSBO,1,DEFINE([GLSL shader storage buffer objects])))
-
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
- [#include <GL/gl.h>]
- [#if !defined(GL_VERSION_4_3) && !defined(GL_ARB_compute_shader)]
- [#error]
- [#endif ]
- )],
- AC_DEFINE(HAVE_COMPUTE_SHADER,1,DEFINE([GLSL compute shaders])))
+if test "x$with_vcpkg" != "xno"; then
+ AC_DEFINE(HAVE_SSBO,1) # SSBO/Compute shader check should be done at runtime, not at compilation
+ AC_DEFINE(HAVE_COMPUTE_SHADER,1)
+else
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [#include <GL/gl.h>]
+ [#if !defined(GL_VERSION_4_3) && !defined(GL_ARB_shader_storage_buffer_object)]
+ [#error]
+ [#endif ]
+ )],
+ AC_DEFINE(HAVE_SSBO,1,DEFINE([GLSL shader storage buffer objects])))
+
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [#include <GL/gl.h>]
+ [#if !defined(GL_VERSION_4_3) && !defined(GL_ARB_compute_shader)]
+ [#error]
+ [#endif ]
+ )],
+ AC_DEFINE(HAVE_COMPUTE_SHADER,1,DEFINE([GLSL compute shaders])))
+fi
+
+# -------------- offscreen rendering
AC_ARG_ENABLE(offscreen,
[AS_HELP_STRING(--enable-offscreen[[[=no]]],use OSMesa library to implement offscreen rendering)])
-AC_ARG_ENABLE(OpenImageIO,
-[AS_HELP_STRING(--enable-openimageio[[[=no]]],enable experimental OpenImageIO Library)])
+# ----------- glm
+if test "x$with_vcpkg" != "xno"; then
+ AC_DEFINE(HAVE_LIBGLM,1)
+ LIBS=$LIBS"-lglm "
+else
+ # glm is header only and is already on the include path
+ AC_CHECK_HEADER(
+ glm/glm.hpp,
+ [AC_DEFINE(
+ HAVE_LIBGLM,1,
+ DEFINE([the <glm/glm.hpp> header]))
+ ],
+ AC_MSG_NOTICE([*** Could not find glm header files: will compile without WebGL or OpenGL support ***])
+ )
+fi
- AC_CHECK_HEADER(glm/glm.hpp,
- [AC_DEFINE(HAVE_LIBGLM,1,
- DEFINE([the <glm/glm.hpp> header]))],AC_MSG_NOTICE([*** Could not find glm header files: will compile without WebGL or OpenGL support ***]))
+TINYEXR_ROOT=tinyexr
+INCL=$INCL" -I$TINYEXR_ROOT"
+AC_SUBST(TINYEXR_ROOT)
if test "x$enable_gl" != "xno"; then
- AC_CHECK_HEADERS([ncurses/curses.h ncurses.h curses.h],[break])
-if test "x$enable_openimageio" = "xyes"; then
- AC_CHECK_HEADER([OpenEXR/ImathVec.h],
- AC_CHECK_HEADER([OpenImageIO/imageio.h],
- AC_CHECK_LIB([OpenImageIO],[open])))
-fi
+if test "x$with_vcpkg" != "xno"; then # managed by vcpkg
+ ADD_VCPKG_FEATURE(opengl)
+ AC_DEFINE(HAVE_LIBGL,1,[libgl is enabled])
+ AC_DEFINE(FREEGLUT,1,[Freeglut is enabled])
+ AC_DEFINE(HAVE_LIBGLUT,1,[Freeglut library is available])
+ INCL=$INCL" -Ibackports/glew/include"
+ GLEW="glew.o "
+ ADD_VCPKG_LIB_FOR_PKGCONFIG(glut)
+else # managed by the system
+ AC_CHECK_HEADERS([ncurses/curses.h ncurses.h curses.h],[break])
case "$OSTYPE" in
- msdos)
- AC_CHECK_LIB([gccpp],[GC_throw_bad_alloc])
- AC_CHECK_HEADER(GL/glut.h,
- [AC_DEFINE(HAVE_LIBGLUT,1,
- DEFINE_LIB[freeglut])
- LIBS=$LIBS"-lfreeglut "],
- AC_MSG_NOTICE([*** Could not find libfreeglut: will compile without OpenGL support ***]))
- AC_CHECK_HEADER(GL/gl.h,
- [AC_DEFINE(HAVE_LIBGL,1,
- DEFINE_LIB[opengl32])
- LIBS=$LIBS"-lopengl32 "
- GLEW="glew.o "],
- AC_MSG_NOTICE([*** Could not find libopengl32: will compile without OpenGL support ***]))
- ;;
darwin*)
AC_CHECK_LIB([gccpp],[GC_throw_bad_alloc])
AC_CHECK_HEADER(OpenGL/gl.h,
@@ -506,20 +662,19 @@ case "$OSTYPE" in
AC_CHECK_HEADER(GLUT/glut.h, [AC_DEFINE(HAVE_LIBGLUT,1,
DEFINE_LIB[GLUT])
LIBS=$LIBS"-framework GLUT -framework OpenGL -framework Cocoa "
+ INCL=$INCL" -Ibackports/glew/include"
GLEW="glew.o "],
AC_MSG_NOTICE([*** Could not find GLUT: will compile without OpenGLLUT support ***]))
;;
*)
- AC_CHECK_LIB([gccpp],[GC_throw_bad_alloc])
- AC_CHECK_LIB([glut], [glutMainLoop],,
+ AC_CHECK_LIB([glut], [glutMainLoop],,
AC_MSG_NOTICE([*** Could not find libglut: will compile without OpenGL support ***]))
AC_CHECK_LIB([GL], [glDepthMask],
[AC_DEFINE(HAVE_LIBGL,1,
DEFINE_LIB([GL]))
LIBS=$LIBS"-lGL "
GLEW="glew.o "
- AC_CHECK_LIB([GLX],[glXGetProcAddressARB],
- GLEW=$GLEW"-lGLX ")],
+ INCL=$INCL" -Ibackports/glew/include"],
AC_MSG_NOTICE([*** Could not find libGL: will compile without OpenGL support ***]))
esac
if test "x$enable_offscreen" = "xyes"; then
@@ -527,6 +682,61 @@ esac
AC_MSG_NOTICE([*** Could not find libOSMesa: will compile without offscreen rendering support ***]))
fi
fi
+fi
+
+# ------------------- VCPKG INSTALL
+
+if test "x$with_vcpkg" != "xno"; then
+AC_MSG_NOTICE([Running vcpkg install])
+$vcpkg_exec install $VCPKG_INSTALL_ARGUMENTS
+
+LIBS=$LIBS"$(PKG_CONFIG_PATH=$VCPKG_PKG_CONFIG_LOC pkg-config --libs $VCPKG_LIBS_TO_USE_PKG_CONFIG) "
+CFLAGS=$CFLAGS" $(PKG_CONFIG_PATH=$VCPKG_PKG_CONFIG_LOC pkg-config --cflags-only-other $VCPKG_LIBS_TO_USE_PKG_CONFIG)"
+INCL=$INCL" $(PKG_CONFIG_PATH=$VCPKG_PKG_CONFIG_LOC pkg-config --cflags-only-I $VCPKG_LIBS_TO_USE_PKG_CONFIG)"
+fi
+
+# ----------------- xdr ------------------------
+# managed by the system here, unlike other packages
+
+AC_ARG_ENABLE(xdr,
+[AS_HELP_STRING(--enable-xdr[[[=yes]]],enable XDR/V3D support)])
+if test "x$enable_xdr" != "xno"; then
+case "$OSTYPE" in
+ darwin* | FreeBSD)
+ AC_DEFINE(HAVE_LIBTIRPC,1,DEFINE_LIB([tirpc]))
+ ;;
+ *)
+ PKG_CONFIG(CPPFLAGS,$CPPFLAGS,--cflags,libtirpc)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([#include "xstream.h"])],
+ CHECK_LIB_STATIC(libtirpc,tirpc,xdrstdio_create,
+ HAVE_LIBTIRPC,
+ AC_MSG_NOTICE([*** Could not find libtirpc; XDR/V3D support disabled ***])
+ ),
+ AC_MSG_NOTICE([*** Broken rpc headers; XDR/V3D support disabled ***])
+ )
+ ;;
+esac
+fi
+
+CPPFLAGS=$CPPFLAGS" $INCL"
+CXX_STANDARD=$cxxstd
+
+AC_SUBST(getopt)
+AC_SUBST(ASYGLVERSION)
+AC_SUBST(GCOPTIONS)
+AC_SUBST(GCLIB)
+AC_SUBST(GCPPLIB)
+AC_SUBST(LSPLIB)
+AC_SUBST(LSPLIBS)
+AC_SUBST(INCL)
+AC_SUBST(CXX_STANDARD)
+AC_SUBST(DEFS)
+AC_SUBST(OPTIONS)
+AC_SUBST(GLEW)
+
+# we are on C++ >= 11, so unordered map is a guarantee
+AC_DEFINE(HAVE_UNORDERED_MAP,1,[Unordered map is present])
# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_PID_T
@@ -547,21 +757,6 @@ AC_FUNC_FSEEKO
AC_CHECK_FUNCS(strptime)
AC_CHECK_FUNCS(strnlen)
-AC_CONFIG_HEADERS(config.h)
-
AC_CONFIG_FILES([Makefile doc/Makefile doc/png/Makefile])
+AC_CONFIG_HEADERS([config.h])
AC_OUTPUT
-
-if test "x$GCDIR" != "x" ; then
- AC_CHECK_FILE($GCDIR.tar.gz,,[
- echo
- echo Please put the Boehm garbage collector tar.gz files in the asymptote directory.
- echo FOR EXAMPLE, USE THE COMMANDS:
- echo
- echo wget https://github.com/ivmai/bdwgc/releases/download/v$GCVERSION/$GCFILE.tar.gz
- echo wget https://github.com/ivmai/libatomic_ops/releases/download/v$ATOMICVERSION/libatomic_ops-$ATOMICVERSION.tar.gz
-
- echo
- exit 1
- ])
-fi
diff --git a/graphics/asymptote/constructor.cc b/graphics/asymptote/constructor.cc
index b7ab7e1478..684399bbd1 100644
--- a/graphics/asymptote/constructor.cc
+++ b/graphics/asymptote/constructor.cc
@@ -61,7 +61,7 @@ void transConstructorBody(position pos, coenv &e, record *r, varEntry *init)
varEntry *v=makeVarEntry(pos, e, 0 /* not a field */, r);
// Initialize the object. a=new Foo;
- newRecordExp::transFromTyEntry(pos, e, new tyEntry(r, 0, 0, position()));
+ newRecordExp::transFromTyEntry(pos, e, new tyEntry(r, 0, 0, nullPos));
v->encode(WRITE, pos, e.c);
e.c.encodePop();
diff --git a/graphics/asymptote/cudareflect/CMakeLists.txt b/graphics/asymptote/cudareflect/CMakeLists.txt
new file mode 100644
index 0000000000..6115d2eb29
--- /dev/null
+++ b/graphics/asymptote/cudareflect/CMakeLists.txt
@@ -0,0 +1,29 @@
+cmake_minimum_required(VERSION 3.27)
+
+project(asy-cudareflect CXX CUDA)
+
+add_executable(
+ reflect
+ main.cc
+ EXRFiles.cc
+ kernel.cu ReflectanceMapper.cu
+)
+
+# C++17 standard is derived from CMakeLists.txt.
+set(CMAKE_CUDA_STANDARD 17)
+set(CMAKE_CUDA_STANDARD_REQUIRED ON)
+
+include(FindCUDAToolkit REQUIRED)
+
+target_include_directories(reflect PRIVATE ${CMAKE_CURRENT_LIST_DIR})
+
+set(ASY_REFLECT_LIBRARIES tinyexr-impl glm::glm CUDA::cudart)
+
+if (WIN32)
+ list(APPEND ASY_REFLECT_LIBRARIES unofficial::getopt-win32::getopt)
+endif()
+
+target_link_libraries(
+ reflect
+ PRIVATE ${ASY_REFLECT_LIBRARIES}
+)
diff --git a/graphics/asymptote/cudareflect/IrradianceGenerator.sln b/graphics/asymptote/cudareflect/IrradianceGenerator.sln
deleted file mode 100644
index eee523873a..0000000000
--- a/graphics/asymptote/cudareflect/IrradianceGenerator.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.31613.86
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IrradianceGenerator", "IrradianceGenerator.vcxproj", "{0043AE31-F6A1-47CB-8A80-1DA6E2C049DF}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|x64 = Debug|x64
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {0043AE31-F6A1-47CB-8A80-1DA6E2C049DF}.Debug|x64.ActiveCfg = Debug|x64
- {0043AE31-F6A1-47CB-8A80-1DA6E2C049DF}.Debug|x64.Build.0 = Debug|x64
- {0043AE31-F6A1-47CB-8A80-1DA6E2C049DF}.Release|x64.ActiveCfg = Release|x64
- {0043AE31-F6A1-47CB-8A80-1DA6E2C049DF}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {849A0D9E-0CAB-48D8-954B-D97F29D1C539}
- EndGlobalSection
-EndGlobal
diff --git a/graphics/asymptote/cudareflect/IrradianceGenerator.vcxproj b/graphics/asymptote/cudareflect/IrradianceGenerator.vcxproj
deleted file mode 100644
index 08c8855e0e..0000000000
--- a/graphics/asymptote/cudareflect/IrradianceGenerator.vcxproj
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <ItemGroup>
- <CudaCompile Include="kernel.cu" />
- <CudaCompile Include="ReflectanceMapper.cu" />
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="EXRFiles.cc" />
- <ClCompile Include="main.cc" />
- <ClCompile Include="tinyexr.cc" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="common.h" />
- <ClInclude Include="EXRFiles.h" />
- <ClInclude Include="helper.cuh" />
- <ClInclude Include="include\tinyexr\tinyexr.h">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DeploymentContent>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DeploymentContent>
- </ClInclude>
- <ClInclude Include="kernel.h" />
- <ClInclude Include="ReflectanceMapper.cuh" />
- <ClInclude Include="simpson.cuh" />
- <ClInclude Include="utils.cuh" />
- </ItemGroup>
- <ItemGroup>
- <None Include=".gitignore" />
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{0043AE31-F6A1-47CB-8A80-1DA6E2C049DF}</ProjectGuid>
- <RootNamespace>IrradianceGenerator</RootNamespace>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v142</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v142</PlatformToolset>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- <Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 11.4.props" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <LanguageStandard>stdcpp17</LanguageStandard>
- <PreprocessorDefinitions>DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- <Link>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <AdditionalDependencies>cudart_static.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- <CudaCompile>
- <TargetMachinePlatform>64</TargetMachinePlatform>
- <CudaRuntime>Shared</CudaRuntime>
- <GenerateRelocatableDeviceCode>false</GenerateRelocatableDeviceCode>
- </CudaCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <LanguageStandard>stdcpp17</LanguageStandard>
- <PreprocessorDefinitions>DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- </ClCompile>
- <Link>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <SubSystem>Console</SubSystem>
- <AdditionalDependencies>cudart_static.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- <CudaCompile>
- <TargetMachinePlatform>64</TargetMachinePlatform>
- <GPUDebugInfo>true</GPUDebugInfo>
- <CudaRuntime>Shared</CudaRuntime>
- <GenerateRelocatableDeviceCode>false</GenerateRelocatableDeviceCode>
- </CudaCompile>
- </ItemDefinitionGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- <Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 11.4.targets" />
- </ImportGroup>
- <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
- </Target>
-</Project> \ No newline at end of file
diff --git a/graphics/asymptote/cudareflect/Makefile b/graphics/asymptote/cudareflect/Makefile
index ebb7833ffd..328b1ca308 100644
--- a/graphics/asymptote/cudareflect/Makefile
+++ b/graphics/asymptote/cudareflect/Makefile
@@ -6,15 +6,13 @@ NVCC = nvcc
INCL=-I/usr/local/cuda/include
NVCCFLAGS = -O3 -Xcudafe --diag_suppress=esa_on_defaulted_function_ignored
-FILES = main tinyexr EXRFiles
+FILES = main EXRFiles
CUDA_FILES = kernel ReflectanceMapper
CUDA_LIBS = -lcudart -lz
all: $(FILES:=.o) $(CUDA_FILES:=.o)
$(NVCC) $(NVCCFLAGS) -o reflect $(FILES:=.o) $(CUDA_FILES:=.o) $(CUDA_LIBS)
-tinyexr.o: tinyexr/tinyexr.h
-
.SUFFIXES: .c .cc .cu .o .d
.cc.o:
$(CXX) $(CFLAGS) $(INCL) -o $@ -c $<
diff --git a/graphics/asymptote/cudareflect/common.h b/graphics/asymptote/cudareflect/common.h
index 9758e7ac40..9494a719d1 100644
--- a/graphics/asymptote/cudareflect/common.h
+++ b/graphics/asymptote/cudareflect/common.h
@@ -11,4 +11,4 @@
#include <sstream>
#define TINYEXR_USE_THREAD 1
-#include "tinyexr/tinyexr.h" \ No newline at end of file
+#include <tinyexr.h> \ No newline at end of file
diff --git a/graphics/asymptote/cudareflect/tinyexr.cc b/graphics/asymptote/cudareflect/tinyexr.cc
deleted file mode 100644
index 37d45de42d..0000000000
--- a/graphics/asymptote/cudareflect/tinyexr.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
-* @file tinyexr.cc
-* @brief An implementation object file for tinyexr mandated by the repository.
-*
-* On Windows, use vcpkg to install zlib instead of nuget. On Linux, this should work naturally
-*/
-
-#include <zlib.h>
-
-#define TINYEXR_IMPLEMENTATION
-#define TINYEXR_USE_MINIZ 0
-#define TINYEXR_USE_THREAD 1
-#define TINYEXR_USE_PIZ 1
-
-#include "tinyexr/tinyexr.h" \ No newline at end of file
diff --git a/graphics/asymptote/cudareflect/tinyexr/Makefile b/graphics/asymptote/cudareflect/tinyexr/Makefile
deleted file mode 100644
index 8e54d7ede2..0000000000
--- a/graphics/asymptote/cudareflect/tinyexr/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-#CXX ?= clang++
-#CXXFLAGS ?= -fsanitize=address -Werror -Wall -Wextra -g -O0 -DTINYEXR_USE_MINIZ=0 -DTINYEXR_USE_PIZ=0
-#LDFLAGS ?= -lz
-
-# ZFP
-#CXXFLAGS += -DTINYEXR_USE_ZFP=1 -I./deps/ZFP/inc
-#LDFLAGS += -L./deps/ZFP/lib -lzfp
-
-CFLAGS += -I./deps/miniz
-CXXFLAGS += -I./deps/miniz
-
-.PHONY: test clean
-
-all: miniz.o
- $(CXX) $(CXXFLAGS) -o test_tinyexr test_tinyexr.cc miniz.o $(LDFLAGS)
-
-miniz.o:
- $(CC) $(CFLAGS) -c ./deps/miniz/miniz.c
-
-test:
- ./test_tinyexr asakusa.exr
-
-clean:
- rm -rf test_tinyexr miniz.o
-
diff --git a/graphics/asymptote/cudareflect/tinyexr/experimental/js/compile_to_js.sh b/graphics/asymptote/cudareflect/tinyexr/experimental/js/compile_to_js.sh
deleted file mode 100755
index dc750844bf..0000000000
--- a/graphics/asymptote/cudareflect/tinyexr/experimental/js/compile_to_js.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-EMCC=em++
-MINIZ='-I../../deps/miniz/ ../../deps/miniz/miniz.c'
-
-# Export EXR loader/saver function to JS.
-# TODO: export more functions
-# DEMANGLE_SUPPORT=1
-#${EMCC} -std=c++11 --bind -O2 -I../../ binding.cc ${MINIZ} --memory-init-file 0 -s TOTAL_MEMORY=67108864 -s DEMANGLE_SUPPORT=1 -s EXPORTED_FUNCTIONS="['_ParseEXRHeaderFromMemory', '_LoadEXRFromMemory']" -o tinyexr.js
-${EMCC} --bind -Os -I../../ binding.cc ${MINIZ} --memory-init-file 0 -s TOTAL_MEMORY=67108864 -o tinyexr.js
diff --git a/graphics/asymptote/cudareflect/tinyexr/experimental/js/test.js b/graphics/asymptote/cudareflect/tinyexr/experimental/js/test.js
deleted file mode 100644
index f91d4592ca..0000000000
--- a/graphics/asymptote/cudareflect/tinyexr/experimental/js/test.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var fs = require('fs');
-var tinyexr = require('./tinyexr.js')
-
-var data = new Uint8Array(fs.readFileSync("../../asakusa.exr"))
-console.log(data.length)
-
-var instance = new tinyexr.EXRLoader(data);
-
-console.log(instance.ok())
-console.log(instance.width())
-console.log(instance.height())
-
-var image = instance.getBytes()
-console.log(image[0])
-console.log(image[1])
-console.log(image[2])
-console.log(image[3])
-console.log(image[4])
-console.log(image[5])
-console.log(image[6])
-console.log(image[7])
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/Makefile b/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/Makefile
deleted file mode 100644
index e17a9517f6..0000000000
--- a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-ISSUE_63_FLAGS=-O1 -g -fsanitize=address,bool,float-cast-overflow,integer-divide-by-zero,return,returns-nonnull-attribute,shift-exponent,signed-integer-overflow,unreachable,vla-bound -fno-sanitize-recover=all -funsigned-char
-
-all: miniz
- clang++ -std=c++11 -o fuzz_62 -I../../ -I../../deps/miniz -g -fsanitize=address fuzz.cc /usr/lib/llvm-5.0/lib/libFuzzer.a libminiz.a
- clang++ -std=c++11 -o fuzz_63 -I../../ -I../../deps/miniz ${ISSUE_63_FLAGS} fuzz.cc /usr/lib/llvm-5.0/lib/libFuzzer.a libminiz.a
-
-miniz:
- clang -c -I../../deps/miniz -g ../../deps/miniz/miniz.c
- llvm-ar rc libminiz.a miniz.o
-
-t:
- ./fuzz_62 issue-62-tinyexr_memcpy_heap-buffer-overflow
- ./fuzz_63 issue-63-tinyexr_signed-integer-overflow
diff --git a/graphics/asymptote/cxxtests/CMakeLists.txt b/graphics/asymptote/cxxtests/CMakeLists.txt
new file mode 100644
index 0000000000..a8316cb134
--- /dev/null
+++ b/graphics/asymptote/cxxtests/CMakeLists.txt
@@ -0,0 +1,21 @@
+if (NOT ENABLE_ASY_CXXTEST)
+ message(FATAL_ERROR "cxxtests require asy-cxxtest enabled")
+endif()
+
+set(TEST_CXX_SRC_ROOT ${CMAKE_CURRENT_LIST_DIR})
+
+include(${TEST_CXX_SRC_ROOT}/cmake-scripts/external-libs.cmake)
+include(${TEST_CXX_SRC_ROOT}/cmake-scripts/tests.cmake)
+
+# test target
+
+add_executable(asyCxxTests ${ASY_TEST_SOURCES} ${TEST_CXX_SRC_ROOT}/src/testMain.cc)
+target_include_directories(
+ asyCxxTests
+ PRIVATE ${TEST_CXX_SRC_ROOT}/include
+)
+target_link_libraries(asyCxxTests
+ PRIVATE asycore GTest::gtest GTest::gmock)
+
+include(GoogleTest)
+gtest_discover_tests(asyCxxTests TEST_PREFIX cxxtests.)
diff --git a/graphics/asymptote/cxxtests/cmake-scripts/external-libs.cmake b/graphics/asymptote/cxxtests/cmake-scripts/external-libs.cmake
new file mode 100644
index 0000000000..070d06a868
--- /dev/null
+++ b/graphics/asymptote/cxxtests/cmake-scripts/external-libs.cmake
@@ -0,0 +1,19 @@
+# Use directly downloaded library because vcpkg's version has some
+# linking issues with windows + clang64-msys2
+
+if (DOWNLOAD_GTEST_FROM_SRC)
+ include(FetchContent)
+ FetchContent_Declare(
+ googletest
+ GIT_REPOSITORY https://github.com/google/googletest
+ GIT_TAG v1.14.0
+ )
+
+ if (WIN32)
+ set(gtest_force_shared_crt ON CACHE INTERNAL "Force shared CRT")
+ endif()
+
+ FetchContent_MakeAvailable(googletest)
+else()
+ find_package(GTest REQUIRED)
+endif()
diff --git a/graphics/asymptote/cxxtests/cmake-scripts/tests.cmake b/graphics/asymptote/cxxtests/cmake-scripts/tests.cmake
new file mode 100644
index 0000000000..d76bcf7f3c
--- /dev/null
+++ b/graphics/asymptote/cxxtests/cmake-scripts/tests.cmake
@@ -0,0 +1,12 @@
+# add tests here
+
+set(ASY_CXX_TESTS
+ placeholder
+)
+
+# ----- transform tests --------
+list(TRANSFORM ASY_CXX_TESTS APPEND .cc)
+list(TRANSFORM ASY_CXX_TESTS
+ PREPEND ${TEST_CXX_SRC_ROOT}/tests/
+ OUTPUT_VARIABLE ASY_TEST_SOURCES
+)
diff --git a/graphics/asymptote/cxxtests/include/asycxxtests/common.h b/graphics/asymptote/cxxtests/include/asycxxtests/common.h
new file mode 100644
index 0000000000..6a0640d082
--- /dev/null
+++ b/graphics/asymptote/cxxtests/include/asycxxtests/common.h
@@ -0,0 +1,9 @@
+/**
+ * @param asycxxtests/common.h
+ * @brief Common header file for all asymptote C++-side testing
+ */
+
+#pragma once
+
+#include <gtest/gtest.h>
+#include <gmock/gmock.h>
diff --git a/graphics/asymptote/cxxtests/src/testMain.cc b/graphics/asymptote/cxxtests/src/testMain.cc
new file mode 100644
index 0000000000..596daa3ce9
--- /dev/null
+++ b/graphics/asymptote/cxxtests/src/testMain.cc
@@ -0,0 +1,14 @@
+#include <gtest/gtest.h>
+#include <gmock/gmock.h>
+#include "common.h"
+
+int main(int argc, char* argv[])
+{
+#if defined(USEGC)
+ GC_init();
+#endif
+
+ ::testing::InitGoogleTest(&argc,argv);
+ ::testing::InitGoogleMock(&argc,argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/graphics/asymptote/cxxtests/tests/placeholder.cc b/graphics/asymptote/cxxtests/tests/placeholder.cc
new file mode 100644
index 0000000000..938775294b
--- /dev/null
+++ b/graphics/asymptote/cxxtests/tests/placeholder.cc
@@ -0,0 +1,8 @@
+#include "asycxxtests/common.h"
+
+#define TESTING_FILE_NAME placeholder
+
+TEST(TESTING_FILE_NAME, alwaysTrue)
+{
+ ASSERT_TRUE(1==1);
+}
diff --git a/graphics/asymptote/dec.cc b/graphics/asymptote/dec.cc
index d969ac5f02..f8673f9c83 100644
--- a/graphics/asymptote/dec.cc
+++ b/graphics/asymptote/dec.cc
@@ -17,8 +17,8 @@
#include "modifier.h"
#include "runtime.h"
#include "locate.h"
-#include "parser.h"
-// #include "builtin.h" // for trans::addRecordOps
+#include "asyparser.h"
+#include "builtin.h" // for trans::addRecordOps
namespace absyntax {
@@ -27,9 +27,53 @@ using namespace types;
using mem::list;
+symbol intSymbol() {
+ const static symbol* intSymbol = new symbol(symbol::literalTrans("int"));
+ return *intSymbol;
+}
+
+bool usableInTemplate(ty *t) {
+ assert(t);
+ if (t->primitive()) return true;
+ assert(t->kind != ty_null);
+ assert(t->kind != ty_overloaded);
+
+ if (t->kind == ty_record) {
+ record* r= dynamic_cast<record*>(t);
+ assert(r);
+ assert(r->getLevel());
+ if (!r->getLevel()->getParent()) return false;// r is actually a module
+ if (!r->getLevel()->getParent()->getParent()) {
+ return true;// r is a top-level record, or all nestings are static
+ }
+ return false; // r is nested non-statically
+ }
+ if (t->kind == ty_function) {
+ function* f= dynamic_cast<function*>(t);
+ assert(f);
+ // Check the types of the result and all the parameters.
+ if (!usableInTemplate(f->result)) return false;
+ const signature& sig= *f->getSignature();
+ for (const types::formal& f : sig.formals) {
+ if (!usableInTemplate(f.t)) return false;
+ }
+ if (sig.hasRest() && !usableInTemplate(sig.getRest().t)) return false;
+ return true;
+ }
+ if (t->kind == ty_array) {
+ array* a= dynamic_cast<array*>(t);
+ assert(a);
+ return usableInTemplate(a->celltype);
+ }
+ // We should have already handled all the cases.
+ assert(false);
+ return false;
+}
+
+
trans::tyEntry *astType::transAsTyEntry(coenv &e, record *where)
{
- return new trans::tyEntry(trans(e, false), 0, where, getPos());
+ return new trans::tyEntry(trans(e, false), nullptr, where, getPos());
}
@@ -40,6 +84,45 @@ void nameTy::prettyprint(ostream &out, Int indent)
id->prettyprint(out, indent+1);
}
+void addNameOps(coenv &e, record *r, record *qt, varEntry *qv, position pos) {
+ for (auto au : qt->e.ve.getAutoUnravels()) {
+ symbol auName = au.first;
+ varEntry *v = au.second;
+ if (!v->checkPerm(READ, e.c)) {
+ em.error(pos);
+ em << "cannot access '" << auName << "' in current scope";
+ continue;
+ }
+ if (r && e.c.getPermission() != PUBLIC) {
+ // Add an additional restriction to v based on c.getPermission().
+ v = new varEntry(*v, e.c.getPermission(), r);
+ }
+ varEntry *qqv = qualifyVarEntry(qv, v);
+ auto enter= [&](trans::venv& ve) {
+ // Add op only if it does not already exist.
+ if (!ve.lookByType(auName, qqv->getType())) {
+ ve.enter(auName, qqv);
+ }
+ };
+ if (r) {
+ enter(r->e.ve);
+ }
+ enter(e.e.ve);
+ }
+}
+
+void nameTy::addOps(coenv &e, record *r, AutounravelOption opt)
+{
+ if (opt == AutounravelOption::Apply)
+ {
+ if (record* qt= dynamic_cast<record*>(id->getType(e, true)); qt)
+ {
+ varEntry* qv= id->getVarEntry(e);
+ addNameOps(e, r, qt, qv, getPos());
+ }
+ }
+}
+
types::ty *nameTy::trans(coenv &e, bool tacit)
{
return id->typeTrans(e, tacit);
@@ -87,7 +170,7 @@ void arrayTy::prettyprint(ostream &out, Int indent)
}
// NOTE: Can this be merged with trans somehow?
-void arrayTy::addOps(coenv &e, record *r)
+void arrayTy::addOps(coenv &e, record *r, AutounravelOption)
{
types::ty *t=trans(e, true);
@@ -127,10 +210,9 @@ arrayTy::operator string() const
return ss.str();
}
-tyEntryTy::tyEntryTy(position pos, types::ty *t)
- : astType(pos), ent(new trans::tyEntry(t, 0, 0, position()))
-{
-}
+tyEntryTy::tyEntryTy(position pos, types::ty* t)
+ : astType(pos), ent(new trans::tyEntry(t, nullptr, nullptr, nullPos))
+{}
void tyEntryTy::prettyprint(ostream &out, Int indent)
{
@@ -194,33 +276,30 @@ void block::transAsField(coenv &e, record *r)
Scope scopeHolder(e, scope);
for (list<runnable *>::iterator p = stms.begin(); p != stms.end(); ++p) {
(*p)->markTransAsField(e, r);
- if (em.errors() && !settings::getSetting<bool>("debug"))
+ if (em.errors() && !settings::debug)
break;
}
}
bool block::transAsTemplatedField(
- coenv &e, record *r, mem::vector<absyntax::namedTyEntry*>* args,
- frame *caller
+ coenv &e, record *r, mem::vector<absyntax::namedTy*>* args
) {
Scope scopeHolder(e, scope);
- auto p = stms.begin();
- if (p == stms.end()) {
- return true; // empty file
- }
- receiveTypedefDec *dec = dynamic_cast<receiveTypedefDec *>(*p);
- if (!dec) {
+ receiveTypedefDec *dec = getTypedefDec();
+ if (dec == nullptr) {
em.error(getPos());
em << "expected 'typedef import(<types>);'";
- em.sync();
+ em.sync(true);
return false;
}
- if(!dec->transAsParamMatcher(e, r, args, caller))
+ if(!dec->transAsParamMatcher(e, r, args/*, caller*/))
return false;
+ auto p = stms.begin();
+ // Start with second statement since the first was a receiveTypedefDec.
while (++p != stms.end()) {
(*p)->markTransAsField(e, r);
- if (em.errors() && !settings::getSetting<bool>("debug")) {
+ if (em.errors() && !settings::debug) {
return false;
}
}
@@ -228,19 +307,14 @@ bool block::transAsTemplatedField(
return true;
}
-void block::transAsRecordBody(coenv &e, record *r)
+receiveTypedefDec* block::getTypedefDec()
{
- transAsField(e, r);
- e.c.closeRecord();
-}
+ auto p= stms.begin();
-bool block::transAsTemplatedRecordBody(
- coenv &e, record *r, mem::vector<absyntax::namedTyEntry*> *args,
- frame *caller
-) {
- bool succeeded = transAsTemplatedField(e, r, args, caller);
- e.c.closeRecord();
- return succeeded;
+ // Check for an empty file
+ if (p == stms.end()) return nullptr;
+
+ return dynamic_cast<receiveTypedefDec*>(*p);
}
record *block::transAsFile(genv& ge, symbol id)
@@ -254,38 +328,36 @@ record *block::transAsFile(genv& ge, symbol id)
env e(ge);
coenv ce(c, e);
- // Translate the abstract syntax.
if (settings::getSetting<bool>("autoplain")) {
autoplainRunnable()->transAsField(ce, r);
}
- transAsRecordBody(ce, r);
+ // If the file starts with a template declaration and it was accessed
+ // or imported without template arguments, further translation is
+ // likely futile.
+ if (getTypedefDec() != nullptr) {
+ if(!settings::getSetting<bool>("listvariables")) {
+ em.error(getPos());
+ em << "templated module access requires template parameters";
+ em.sync();
+ }
+ return r;
+ }
+
+ // Translate the abstract syntax.
+ transAsField(ce, r);
+ ce.c.closeRecord();
+
em.sync();
if (em.errors()) return nullptr;
return r;
}
-record *block::transAsTemplatedFile(
- genv& ge,
- symbol id,
- mem::vector<absyntax::namedTyEntry*>* args,
- coenv& cE
-) {
+record* block::transAsTemplatedFile(
+ genv& ge, symbol id, mem::vector<absyntax::namedTy*>* args
+)
+{
- for (auto p = args->rbegin(); p != args->rend(); ++p) {
- namedTyEntry *arg = *p;
- tyEntry *ent = arg->ent;
- if(ent->t->kind == types::ty_record) {
- varEntry *v = ent->v;
- if (v) {
- // Push the value of v to the stack.
- v->getLocation()->encode(READ, arg->pos, cE.c);
- } else {
- // Push the appropriate frame to the stack.
- newRecordExp::encodeLevel(arg->pos,cE,ent);
- }
- }
- }
// Create the new module.
record *r = new record(id, new frame(id, 0, 0));
@@ -296,12 +368,15 @@ record *block::transAsTemplatedFile(
env e(ge);
coenv ce(c, e);
- // Translate the abstract syntax.
+ // Import `plain` before even translating "typedef import" since the latter
+ // might change the meanings of symbols provided by `plain`.
if (settings::getSetting<bool>("autoplain")) {
autoplainRunnable()->transAsField(ce, r);
}
- bool succeeded = transAsTemplatedRecordBody(ce, r, args, cE.c.getFrame());
+ // Translate the abstract syntax.
+ bool succeeded = transAsTemplatedField(ce, r, args);
+ ce.c.closeRecord();
if (!succeeded) {
return nullptr;
}
@@ -342,14 +417,7 @@ vardec *block::asVardec()
return var;
}
-void block::createSymMap(AsymptoteLsp::SymbolContext* symContext) {
-#ifdef HAVE_LSP
- for (auto const& p : stms)
- {
- p->createSymMap(symContext);
- }
-#endif
-}
+
void dec::prettyprint(ostream &out, Int indent)
{
@@ -404,13 +472,36 @@ bool modifierList::staticSet()
modifier modifierList::getModifier()
{
- if (mods.size() > 1) {
+ assert(staticSet());
+ int numAutounravel = 0;
+ int numStatic = 0;
+ for (modifier m : mods) {
+ switch (m) {
+ case AUTOUNRAVEL:
+ ++numAutounravel;
+ break;
+ case EXPLICIT_STATIC:
+ case DEFAULT_STATIC:
+ ++numStatic;
+ break;
+ default:
+ em.compiler(getPos());
+ em << "invalid modifier";
+ }
+ }
+ if (numAutounravel > 1) {
em.error(getPos());
- em << "too many modifiers";
+ em << "too many autounravel modifiers";
+ }
+ if (numStatic > 1) {
+ em.error(getPos());
+ em << "too many static modifiers";
+ }
+ if (numAutounravel) {
+ return AUTOUNRAVEL;
+ } else {
+ return mods.front();
}
-
- assert(staticSet());
- return mods.front();
}
permission modifierList::getPermission()
@@ -435,11 +526,18 @@ void modifiedRunnable::prettyprint(ostream &out, Int indent)
void modifiedRunnable::transAsField(coenv &e, record *r)
{
if (mods->staticSet()) {
+ modifier mod = mods->getModifier();
if (e.c.isTopLevel()) {
- em.warning(getPos());
- em << "static modifier is meaningless at top level";
+ if (mod == AUTOUNRAVEL) {
+ em.error(getPos());
+ em << "top-level fields cannot be autounraveled";
+ return;
+ } else {
+ em.warning(getPos());
+ em << "static modifier is meaningless at top level";
+ }
}
- e.c.pushModifier(mods->getModifier());
+ e.c.pushModifier(mod);
}
permission p = mods->getPermission();
@@ -476,9 +574,10 @@ types::ty *decidstart::getType(types::ty *base, coenv &, bool)
trans::tyEntry *decidstart::getTyEntry(trans::tyEntry *base, coenv &e,
record *where)
{
- return dims ? new trans::tyEntry(getType(base->t,e,false), 0,
- where, getPos()) :
- base;
+ return dims ? new trans::tyEntry(
+ getType(base->t, e, false), nullptr, where, getPos()
+ )
+ : base;
}
void decidstart::addOps(types::ty *base, coenv &e, record *r)
@@ -491,56 +590,7 @@ void decidstart::addOps(types::ty *base, coenv &e, record *r)
}
}
-void decidstart::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- std::string name(static_cast<std::string>(getName()));
- AsymptoteLsp::posInFile pos(getPos().LineColumn());
- if (auto decCtx=dynamic_cast<AsymptoteLsp::AddDeclContexts*>(symContext))
- {
- decCtx->additionalDecs.emplace(std::piecewise_construct,
- std::forward_as_tuple(name), std::forward_as_tuple(name, pos));
- }
- else
- {
- symContext->symMap.varDec[name] = AsymptoteLsp::SymbolInfo(name, pos);
- }
-#endif
-}
-void decidstart::createSymMapWType(
- AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base
-) {
-#ifdef HAVE_LSP
- std::string name(static_cast<std::string>(getName()));
- AsymptoteLsp::posInFile pos(getPos().LineColumn());
- if (auto decCtx=dynamic_cast<AsymptoteLsp::AddDeclContexts*>(symContext))
- {
- if (base == nullptr)
- {
- decCtx->additionalDecs.emplace(std::piecewise_construct,
- std::forward_as_tuple(name),
- std::forward_as_tuple(name, pos));
- }
- else
- {
- decCtx->additionalDecs.emplace(
- std::piecewise_construct,
- std::forward_as_tuple(name),
- std::forward_as_tuple(name, static_cast<std::string>(*base), pos)
- );
- }
- }
- else
- {
- symContext->symMap.varDec[name] = base == nullptr ?
- AsymptoteLsp::SymbolInfo(name, pos) :
- AsymptoteLsp::SymbolInfo(name,
- static_cast<std::string>(*base),
- pos);
- }
-#endif
-}
void fundecidstart::prettyprint(ostream &out, Int indent)
@@ -570,7 +620,7 @@ types::ty *fundecidstart::getType(types::ty *base, coenv &e, bool tacit)
trans::tyEntry *fundecidstart::getTyEntry(trans::tyEntry *base, coenv &e,
record *where)
{
- return new trans::tyEntry(getType(base->t,e,false), 0, where, getPos());
+ return new trans::tyEntry(getType(base->t,e,false), nullptr, where, getPos());
}
void fundecidstart::addOps(types::ty *base, coenv &e, record *r)
@@ -582,9 +632,6 @@ void fundecidstart::addOps(types::ty *base, coenv &e, record *r)
types::function *ft=dynamic_cast<types::function *>(getType(base, e, true));
assert(ft);
- e.e.addFunctionOps(ft);
- if (r)
- r->e.addFunctionOps(ft);
}
@@ -622,13 +669,17 @@ void addVar(coenv &e, record *r, varEntry *v, symbol id)
{
// Test for 'operator init' definitions that implicitly define constructors:
if (definesImplicitConstructor(e, r, v, id))
- addConstructorFromInitializer(position(), e, r, v);
+ addConstructorFromInitializer(nullPos, e, r, v);
// Add to the record so it can be accessed when qualified; add to the
// environment so it can be accessed unqualified in the scope of the
// record definition.
- if (r)
+ if (r) {
r->e.addVar(id, v);
+ if (e.c.isAutoUnravel()) {
+ r->e.ve.registerAutoUnravel(id, v);
+ }
+ }
e.e.addVar(id, v);
}
@@ -739,28 +790,7 @@ void decid::transAsTypedefField(coenv &e, trans::tyEntry *base, record *r)
addTypeWithPermission(e, r, ent, start->getName());
}
-void decid::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- start->createSymMap(symContext);
- if (init)
- {
- init->createSymMap(symContext);
- }
-#endif
-}
-void decid::createSymMapWType(
- AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base
-) {
-#ifdef HAVE_LSP
- start->createSymMapWType(symContext, base);
- if (init)
- {
- init->createSymMap(symContext);
- }
-#endif
-}
void decidlist::prettyprint(ostream &out, Int indent)
@@ -783,26 +813,6 @@ void decidlist::transAsTypedefField(coenv &e, trans::tyEntry *base, record *r)
(*p)->transAsTypedefField(e, base, r);
}
-void decidlist::createSymMap(AsymptoteLsp::SymbolContext* symContext) {
-#ifdef HAVE_LSP
- for (auto const& p : decs)
- {
- p->createSymMap(symContext);
- }
-#endif
-}
-
-void decidlist::createSymMapWType(
- AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base
-) {
-#ifdef HAVE_LSP
- for (auto const& p : decs)
- {
- p->createSymMapWType(symContext, base);
- }
-#endif
-}
-
void vardec::prettyprint(ostream &out, Int indent)
{
@@ -834,12 +844,7 @@ types::ty *vardec::singleGetType(coenv &e)
return did->getStart()->getType(base->trans(e), e);
}
-void vardec::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- decs->createSymMapWType(symContext, base);
-#endif
-}
+
// Helper class for imports. This essentially evaluates to the run::loadModule
@@ -851,8 +856,10 @@ class loadModuleExp : public exp {
function *ft;
public:
- loadModuleExp(position pos, record *imp)
- : exp(pos) {ft=new function(imp,primString());}
+ loadModuleExp(position pos, record* imp) : exp(pos)
+ {
+ ft= new function(imp, primString(), primInt());
+ }
void prettyprint(ostream &out, Int indent) {
prettyname(out, "loadModuleExp", indent, getPos());
@@ -884,18 +891,23 @@ public:
varEntry *accessModule(position pos, coenv &e, record *r, symbol id)
{
string filename=(string) id;
+ bool tainted=settings::debug && em.errors();
record *imp=e.e.getModule(id, filename);
if (!imp) {
- em.error(pos);
- em << "could not load module '" << filename << "'";
- em.sync();
+ if(!tainted) {
+ em.error(pos);
+ em << "could not load module '" << filename << "'";
+ em.sync(true);
+ }
return 0;
}
else {
// Create a varinit that evaluates to the module.
- // This is effectively the expression 'loadModule(filename)'.
- callExp init(pos, new loadModuleExp(pos, imp),
- new stringExp(pos, filename));
+ // This is effectively the expression 'loadModule(filename, 0)'.
+ callExp init(
+ pos, new loadModuleExp(pos, imp), new stringExp(pos, filename),
+ new intExp(pos, 0)
+ );
// The varEntry should have whereDefined()==0 as it is not defined inside
// the record r.
@@ -905,50 +917,91 @@ varEntry *accessModule(position pos, coenv &e, record *r, symbol id)
}
}
+
+
+// Returns the number of items that will be added to the stack once the
+// translation has been run (always either 0 or 1).
+Int transPushParent(formal *f, coenv &e) {
+ if (f->getType(e)->kind != types::ty_record) {
+ return 0;
+ }
+ astType *astT = f->getAbsyntaxType();
+ tyEntry *ent = astT->transAsTyEntry(e, nullptr);
+ bool succeeded = e.c.encodeParent(f->getPos(), ent);
+ if (!succeeded) {
+ em.compiler(f->getPos());
+ em << "failed to encode parent level";
+ em.sync(true);
+ }
+
+ return 1;
+}
+
+// Translates formals into namedTys.
+mem::vector<namedTy*> *computeTemplateArgs(formals *args, coenv &e) {
+ auto *computedArgs = new mem::vector<namedTy*>();
+ for (formal *f : *args) {
+ symbol theName = f->getName();
+ position sourcePos = f->getPos();
+ if (theName == symbol::nullsym) {
+ em.error(sourcePos);
+ em << "expected typename=";
+ em.sync(true);
+ return nullptr;
+ }
+ types::ty *t = f->getType(e);
+ if (!usableInTemplate(t)) {
+ em.error(f->getAbsyntaxType()->getPos());
+ em << "non-statically nested types cannot be used in templates";
+ em.sync(true);
+ return nullptr;
+ }
+ computedArgs->push_back(new namedTy(sourcePos, theName, t));
+ }
+ return computedArgs;
+}
+
// Creates a local variable to hold the import and translate the accessing of
// the import, but doesn't add the import to the environment.
varEntry *accessTemplatedModule(position pos, coenv &e, record *r, symbol id,
formals *args)
{
- string filename=(string) id;
- stringstream buf;
- buf << id << '/' << args->getSignature(e)->handle() << '/';
- symbol index=symbol::literalTrans(buf.str());
-
- auto *computedArgs = new mem::vector<namedTyEntry*>();
- mem::vector<tySymbolPair> *fields = args->getFields();
- for (auto p = fields->begin(); p != fields->end(); ++p) {
- astType* theType = p->ty;
- symbol theName = p->sym;
- if (theName == symbol::nullsym) {
- em.error(theType->getPos());
- em << "expected typename=";
- em.sync();
- return nullptr;
- }
- computedArgs->push_back(new namedTyEntry(
- theType->getPos(), theName, theType->transAsTyEntry(e, r)
- ));
+ string moduleName=(string) id;
+
+ mem::vector<namedTy*> *computedArgs = computeTemplateArgs(args, e);
+ if (!computedArgs) {
+ return nullptr;
}
- record *imp=e.e.getTemplatedModule(index,filename,computedArgs,e);
+ record *imp=e.e.getTemplatedModule(moduleName,computedArgs);
if (!imp) {
em.error(pos);
em << "could not load module '" << id << "'";
- em.sync();
+ em.sync(true);
return nullptr;
}
- else {
- // Create a varinit that evaluates to the module.
- // This is effectively the expression 'loadModule(index)'.
- callExp init(pos, new loadModuleExp(pos, imp), new stringExp(pos, index));
-
- // The varEntry should have whereDefined()==0 as it is not defined inside
- // the record r.
- varEntry *v=makeVarEntryWhere(e, r, imp, 0, pos);
- initializeVar(pos, e, v, &init);
- return v;
+ // Encode action: Push parents to the stack.
+ Int numParents = 0;
+ // We push parents in reverse order so that we can later pop them in
+ // order, meaning that if more than one parameter has an error, the first
+ // error will be reported rather than the last.
+ for (auto p = args->rbegin(); p != args->rend(); ++p) {
+ numParents += transPushParent(*p, e);
}
+
+ // Create a varinit that evaluates to the module.
+ // This is effectively the expression 'loadModule(index, numParents)'.
+ callExp init(
+ pos, new loadModuleExp(pos, imp),
+ new stringExp(pos, imp->getTemplateIndex()),
+ new intExp(pos, numParents)
+ );
+
+ // The varEntry should have whereDefined()==nullptr as it is not defined
+ // inside the record r.
+ varEntry *v=makeVarEntryWhere(e, r, imp, nullptr, pos);
+ initializeVar(pos, e, v, &init);
+ return v;
}
@@ -967,47 +1020,25 @@ void idpair::transAsAccess(coenv &e, record *r)
addVar(e, r, v, dest);
}
-void idpair::transAsUnravel(coenv &e, record *r,
- protoenv &source, varEntry *qualifier)
+tyEntry *idpair::transAsUnravel(coenv &e, record *r,
+ protoenv &source, varEntry *qualifier)
{
checkValidity();
- if (r)
- r->e.add(src, dest, source, qualifier, e.c);
- if (!e.e.add(src, dest, source, qualifier, e.c)) {
- em.error(getPos());
- em << "no matching types or fields of name '" << src << "'";
- }
-}
-
-void idpair::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- if (valid)
- {
- string fullSrc(settings::locateFile(src, true));
- if (not AsymptoteLsp::isVirtualFile((std::string)(fullSrc.c_str())))
- {
- if (not fullSrc.empty())
- {
- symContext->addEmptyExtRef((std::string)(fullSrc.c_str()));
+ if (r) {
+ auto fieldsAdded = r->e.add(src, dest, source, qualifier, e.c)->varsAdded;
+ if (e.c.isAutoUnravel()) {
+ for (varEntry *v : fieldsAdded) {
+ r->e.ve.registerAutoUnravel(dest, v);
}
-
- // add (dest, source) to reference map.
- auto s = symContext->extRefs.fileIdPair.emplace(
- dest, (std::string) fullSrc.c_str()
- );
- auto it=std::get<0>(s);
- auto success=std::get<1>(s);
- if (not success)
- {
- it->second = (std::string)(fullSrc.c_str());
- }
-
- symContext->extRefs.addAccessVal(static_cast<std::string>(dest));
}
}
-#endif
+ protoenv::Added *added = e.e.add(src, dest, source, qualifier, e.c);
+ if (added->empty()) {
+ em.error(getPos());
+ em << "no matching types or fields of name '" << src << "'";
+ }
+ return added->typeAdded;
}
@@ -1027,26 +1058,19 @@ void idpairlist::transAsAccess(coenv &e, record *r)
(*p)->transAsAccess(e,r);
}
-void idpairlist::transAsUnravel(coenv &e, record *r,
- protoenv &source, varEntry *qualifier)
-{
- for (list<idpair *>::iterator p=base.begin();
- p != base.end();
- ++p)
- (*p)->transAsUnravel(e,r,source,qualifier);
-}
-
-void idpairlist::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- for (auto& idp : base)
+mem::vector<tyEntry*> idpairlist::transAsUnravel(
+ coenv &e, record *r, protoenv &source, varEntry *qualifier
+) {
+ mem::vector<tyEntry*> result;
+ for (idpair *p : base)
{
- idp->createSymMap(symContext);
+ tyEntry *typeAdded = p->transAsUnravel(e,r,source,qualifier);
+ result.push_back(typeAdded);
}
-#endif
+ return result;
}
- idpairlist * const WILDCARD = 0;
+idpairlist * const WILDCARD = 0;
void accessdec::prettyprint(ostream &out, Int indent)
{
@@ -1054,13 +1078,6 @@ void accessdec::prettyprint(ostream &out, Int indent)
base->prettyprint(out, indent+1);
}
-void accessdec::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- base->createSymMap(symContext);
-#endif
-}
-
void templateAccessDec::transAsField(coenv& e, record* r) {
if (!this->checkValidity()) return;
@@ -1076,82 +1093,94 @@ void typeParam::prettyprint(ostream &out, Int indent) {
out << "typeParam (" << paramSym << ")\n";
}
-void recordInitializer(coenv &e, symbol id, record *parent, position here)
+void recordInitializer(coenv &e, symbol id, record *r, position here)
{
- // This is equivalent to the code
- // A operator init() { return new A; }
- // where A is the name of the record.
+ // This is almost equivalent to the code
+ // autounravel A operator init() { return new A; }
+ // where A is the name of the record. The "almost" is because the code below
+ // does not add the operator init to the environment, since in practice it
+ // would be added to the outer environment, not the record's environment.
+ // Since it is always added *after* any code in the record, we lose nothing
+ // by not adding it to the environment.
+ // Additionally, the "autounravel" is made low-priority (will not override
+ // user-defined operator init) which is possible only for built-in functions.
formals formals(here);
simpleName recordName(here, id);
nameTy result(here, &recordName);
newRecordExp exp(here, &result);
returnStm stm(here, &exp);
- fundec init(here, &result, symbol::opTrans("init"), &formals, &stm);
- init.transAsField(e, parent);
+ fundef fun(here, &result, &formals, &stm);
+ assert(r);
+ {
+ e.c.pushModifier(AUTOUNRAVEL);
+ function *ft = fun.transType(e, false);
+ assert(ft);
+
+ symbol initSym=symbol::opTrans("init");
+ varinit *init=fun.makeVarInit(ft);
+
+ assert(ft->kind != types::ty_inferred);
+
+ varEntry *v=makeVarEntry(here, e, r, ft);
+ r->e.addVar(initSym, v);
+ r->e.ve.registerAutoUnravel(initSym, v, trans::AutounravelPriority::OFFER);
+ initializeVar(here, e, v, init);
+ e.c.popModifier();
+ }
}
-bool typeParam::transAsParamMatcher(coenv &e, record *r, namedTyEntry* arg) {
- position pos=arg->pos;
- if (arg->dest != paramSym) {
+bool typeParam::transAsParamMatcher(coenv &e, record *module, namedTy* arg) {
+ symbol name = arg->dest;
+ ty *t = arg->t;
+ if (name != paramSym) {
em.error(arg->pos);
em << "template argument name does not match module: passed "
- << arg->dest
+ << name
<< ", expected "
<< paramSym;
return false;
}
+ if (t->kind != types::ty_record) {
+ tyEntry *ent = new tyEntry(t, nullptr, module, getPos());
+ addTypeWithPermission(e, module, ent, name);
+ return true;
+ }
- if(arg->ent->t->kind == types::ty_record) {
- record *module = dynamic_cast<record *>(arg->ent->v->getType());
- symbol Module=symbol::literalTrans(module->getName());
- record *imp=e.e.getLoadedModule(Module);
-
- tyEntry *entry;
- if(imp) {
- callExp init(pos, new loadModuleExp(pos, imp),
- new stringExp(pos, module->getName()));
- varEntry *v=makeVarEntryWhere(e, r, imp, 0, pos);
- initializeVar(pos, e, v, &init);
- if (v)
- addVar(e, r, v, Module);
-
- record *src = dynamic_cast<record *>(arg->ent->t);
- qualifiedName *qn=new qualifiedName(
- pos,
- new simpleName(pos,module->getName()),
- src->getName()
- );
-
- entry=nameTy(pos,qn).transAsTyEntry(e, r);
- } else {
- entry=arg->ent;
- }
- addTypeWithPermission(e, r, entry, paramSym);
- recordInitializer(e,paramSym,r,pos);
- } else
- addTypeWithPermission(e, r, arg->ent, paramSym);
-
- //e.e.addType(paramSym, arg->ent);
- // The code below would add e.g. operator== to the context, but potentially
- // ignore overrides of operator==:
+ // We can now assume t is a record (i.e., asy struct).
+ record *r = dynamic_cast<record *>(t);
+ assert(r);
//
- // types::astType *t = arg.ent->t;
- // if (t->kind == types::ty_record) {
- // record *r = dynamic_cast<record *>(t);
- // if (r) {
- // trans::addRecordOps(e.e.ve, r);
- // }
- // } else if (t->kind == types::ty_array) {
- // array *a = dynamic_cast<array *>(t);
- // if (a) {
- // trans::addArrayOps(e.e.ve, a);
- // }
- // } else if (t->kind == types::ty_function) {
- // function *f = dynamic_cast<function *>(t);
- // if (f) {
- // trans::addFunctionOps(e.e.ve, f);
- // }
- // }
+ // Build a varEntry v for the parent level and encode the bytecode
+ // to pop the parent off the stack into v. The varEntry needs a type,
+ // but the only thing we use from the type is the level, so make a
+ // new fake record.
+ string fakeParentName;
+# ifdef DEBUG_FRAME
+ {
+ ostringstream oss;
+ oss << "<fake parent of " << name << " holding ";
+ print(oss, r->getLevel()->getParent());
+ oss << ">";
+ fakeParentName = oss.str();
+ }
+# else
+ fakeParentName = "<fake parent of " + static_cast<string>(name) + ">";
+# endif
+ record* fakeParent = new record(
+ symbol::literalTrans(fakeParentName), r->getLevel()->getParent()
+ );
+ varEntry *v = makeVarEntryWhere(e, module, fakeParent, nullptr, getPos());
+ // Encode bytecode to pop the parent off the stack into v.
+ v->encode(WRITE, getPos(), e.c);
+ e.c.encodePop();
+ //
+ // Build tyEntry, using v as ent->v.
+ tyEntry *ent = new tyEntry(t, v, module, getPos());
+ addTypeWithPermission(e, module, ent, name);
+
+ // Add any autounravel fields.
+ addNameOps(e, module, r, v, getPos());
+
return true;
}
@@ -1165,9 +1194,25 @@ void typeParamList::add(typeParam *tp) {
params.push_back(tp);
}
+// RAII class to set the permission of a coder to a new value, and then reset it
+// to the old value when the object goes out of scope.
+class PermissionSetter {
+ coder &c;
+ permission oldPerm;
+public:
+ PermissionSetter(coder &c, permission newPerm) : c(c), oldPerm(c.getPermission()) {
+ c.setPermission(newPerm);
+ }
+ ~PermissionSetter() {
+ c.setPermission(oldPerm);
+ }
+};
+
bool typeParamList::transAsParamMatcher(
- coenv &e, record *r, mem::vector<namedTyEntry*> *args, frame *caller
+ coenv &e, record *r, mem::vector<namedTy*> *args
) {
+
+ // Check that the number of arguments passed matches the number of parameters.
if (args->size() != params.size()) {
position pos = getPos();
if (args->size() >= 1) {
@@ -1183,69 +1228,28 @@ bool typeParamList::transAsParamMatcher(
}
return false;
}
- mem::vector<namedTyEntry*> *qualifiedArgs = new mem::vector<namedTyEntry*>();
-
- const string callerContextName="callerContext/";
- const static symbol *id0=new symbol(symbol::literalTrans(callerContextName));
- record *callerContext = new record(*id0, caller);
- for (namedTyEntry *arg : *args) {
- if (arg->ent->t->kind == types::ty_record) {
- varEntry *v = arg->ent->v;
- varEntry *newV = makeVarEntryWhere(e, r, v ? v->getType() : callerContext, nullptr,
- arg->pos);
- newV->getLocation()->encode(WRITE, arg->pos, e.c);
- e.c.encodePop();
-
- tyEntry *newEnt = qualifyTyEntry(newV, arg->ent);
- qualifiedArgs->push_back(
- new namedTyEntry(arg->pos, arg->dest, newEnt)
- );
- } else {
- qualifiedArgs->push_back(arg);
- }
- }
+ // Set the permission to PRIVATE while translating type parameters.
+ PermissionSetter ps(e.c, PRIVATE);
+ // Pop the parents off the stack. They were pushed in reverse order.
+ // With this approach, the first error will be reported, rather than the last.
for (size_t i = 0; i < params.size(); ++i) {
- bool succeeded = params[i]->transAsParamMatcher(e, r, (*qualifiedArgs)[i]);
+ bool succeeded = params[i]->transAsParamMatcher(e, r, (*args)[i]);
if (!succeeded) return false;
}
return true;
}
-symbol intSymbol() {
- const static symbol* intSymbol = new symbol(symbol::literalTrans("int"));
- return *intSymbol;
-}
-
-symbol templatedSymbol() {
- const static symbol* templatedSymbol =
- new symbol(symbol::literalTrans("/templated"));
- return *templatedSymbol;
-}
-
bool receiveTypedefDec::transAsParamMatcher(
- coenv& e, record *r, mem::vector<namedTyEntry*> *args, frame *caller
+ coenv& e, record *r, mem::vector<namedTy*> *args
) {
- bool succeeded = params->transAsParamMatcher(e, r, args, caller);
-
- types::ty *intTy = e.e.lookupType(intSymbol());
- assert(intTy);
- e.e.addVar(templatedSymbol(),
- makeVarEntryWhere(e, nullptr, intTy, r, getPos())
- );
-
+ bool succeeded = params->transAsParamMatcher(e, r, args);
return succeeded;
}
void receiveTypedefDec::transAsField(coenv& e, record *r) {
em.error(getPos());
- types::ty *intTy = e.e.lookupType(intSymbol());
- assert(intTy);
- if (e.e.lookupVarByType(templatedSymbol(), intTy)) {
- em << "'typedef import(<types>)' must precede any other code";
- } else {
- em << "templated module access requires template parameters";
- }
+ em << "unexpected 'typedef import'";
em.sync();
}
@@ -1264,9 +1268,18 @@ void fromdec::transAsField(coenv &e, record *r)
if (r)
r->e.add(q.t->e, q.v, e.c);
e.e.add(q.t->e, q.v, e.c);
+ } else {
+ auto typesAdded = fields->transAsUnravel(e, r, q.t->e, q.v);
+ for (tyEntry *te : typesAdded) {
+ if (te) {
+ record *t = dynamic_cast<record*>(te->t);
+ if (t) {
+ addNameOps(e, r, t, te->v, getPos());
+ }
+ }
+ }
+
}
- else
- fields->transAsUnravel(e, r, q.t->e, q.v);
}
}
@@ -1291,17 +1304,6 @@ fromdec::qualifier unraveldec::getQualifier(coenv &e, record *)
return qualifier(qt,id->getVarEntry(e));
}
-void unraveldec::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- std::string fileName = static_cast<std::string>(id->getName());
- if (not AsymptoteLsp::isVirtualFile(fileName))
- {
- symContext->extRefs.addUnravelVal(fileName);
- }
-#endif
-}
-
void fromaccessdec::prettyprint(ostream &out, Int indent)
{
prettyindent(out, indent);
@@ -1330,27 +1332,7 @@ fromdec::qualifier fromaccessdec::getQualifier(coenv &e, record *r)
return qualifier(0,0);
}
-void fromaccessdec::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- // filename is id;
- std::string idStr(id);
- symContext->extRefs.addEmptyExtRef(idStr);
- auto* f=this->fields;
- if (f)
- {
- // add [dest] -> [src, filename] to fromAccessDecls;
- f->processListFn(
- [&symContext, &idStr](symbol const& src, symbol const& dest)
- {
- std::string srcId(src);
- std::string destId(dest);
- symContext->extRefs.addFromAccessVal(idStr, srcId, destId);
- });
- }
-#endif
-}
void importdec::prettyprint(ostream &out, Int indent)
{
@@ -1358,12 +1340,7 @@ void importdec::prettyprint(ostream &out, Int indent)
base.prettyprint(out, indent+1);
}
-void importdec::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- base.createSymMap(symContext);
-#endif
-}
+
void includedec::prettyprint(ostream &out, Int indent)
{
@@ -1375,7 +1352,7 @@ void includedec::loadFailed(coenv &)
{
em.warning(getPos());
em << "could not parse file of name '" << filename << "'";
- em.sync();
+ em.sync(true);
}
void includedec::transAsField(coenv &e, record *r)
@@ -1388,19 +1365,7 @@ void includedec::transAsField(coenv &e, record *r)
ast->transAsField(e, r);
}
-void includedec::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- std::string fullname(
- (std::string) settings::locateFile(filename, true).c_str()
- );
- if (not AsymptoteLsp::isVirtualFile(fullname))
- {
- symContext->addEmptyExtRef(fullname);
- symContext->extRefs.includeVals.emplace(fullname);
- }
-#endif
-}
+
void typedec::prettyprint(ostream &out, Int indent)
@@ -1428,58 +1393,67 @@ void recorddec::addPostRecordEnvironment(coenv &e, record *r, record *parent) {
if (parent)
parent->e.add(r->postdefenv, 0, e.c);
e.e.add(r->postdefenv, 0, e.c);
+ // Add the autounravel fields also.
+ addNameOps(e, parent, r, nullptr, getPos());
}
void recorddec::transAsField(coenv &e, record *parent)
{
+ if (e.c.isAutoUnravel()) {
+ em.error(getPos());
+ em << "types cannot be autounraveled";
+ }
record *r = parent ? parent->newRecord(id, e.c.isStatic()) :
e.c.newRecord(id);
- addTypeWithPermission(e, parent, new trans::tyEntry(r,0,parent,getPos()),
- id);
- e.e.addRecordOps(r);
- if (parent)
- parent->e.addRecordOps(r);
+ addTypeWithPermission(
+ e, parent, new trans::tyEntry(r, nullptr, parent, getPos()), id
+ );
+ trans::addRecordOps(r);
// Start translating the initializer.
coder c=e.c.newRecordInit(getPos(), r);
coenv re(c,e.e);
- body->transAsRecordBody(re, r);
-
+ {
+ // Make sure the autounraveled fields are limited to the record's scope.
+ // If the scope is too broad, then user-provide autounravel overrides will
+ // defer to already-defined ops when they should not.
+ bool useScope = body->scope;
+ // RAII: Close the scope when scopeHolder runs its destructor.
+ Scope scopeHolder(re, useScope);
+ // Autounravel the record ops into the record's environment.
+ addNameOps(re, nullptr, r, nullptr, getPos());
+ // We've already handled the scope ourselves, so tell `body` not to add an
+ // additional scope when running `transAsField`.
+ body->scope = false;
+ // Translate the main body of the record.
+ body->transAsField(re, r);
+ // Restore the original value of the `scope` boolean. This probably makes no
+ // difference but is included out of an abundance of caution.
+ body->scope = useScope;
+ } // Close the scope.
// After the record is translated, add a default initializer so that a
// variable of the type of the record is initialized to a new instance by
// default.
- transRecordInitializer(e, parent);
+ transRecordInitializer(re, r);
+
+ // This would normally be done right after transAsField, but we needed to add
+ // the default initializer first.
+ re.c.closeRecord();
+
// Add types and variables defined during the record that should be added to
// the enclosing environment. These are the implicit constructors defined by
- // "operator init".
+ // "operator init", as well as the autounravel fields (both builtin and user
+ // defined).
addPostRecordEnvironment(e, r, parent);
}
-void recorddec::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- auto* newCtx = symContext->newContext(getPos().LineColumn());
- auto* structTyInfo = symContext->newTypeDec<AsymptoteLsp::StructDecs>(
- static_cast<std::string>(id), getPos().LineColumn());
- if (structTyInfo != nullptr)
- {
- structTyInfo->ctx = newCtx;
- body->createSymMap(newCtx);
- }
- else
- {
- cerr << "Cannot create new struct context" << endl;
- }
-#endif
-}
-
runnable *autoplainRunnable() {
// Abstract syntax for the code:
// private import plain;
- position pos=position();
+ position pos=nullPos;
static importdec ap(pos, new idpair(pos, symbol::literalTrans("plain")));
static modifiedRunnable mr(pos, trans::PRIVATE, &ap);
diff --git a/graphics/asymptote/dec.h b/graphics/asymptote/dec.h
index 53fee4bfe0..95b1aef83d 100644
--- a/graphics/asymptote/dec.h
+++ b/graphics/asymptote/dec.h
@@ -2,7 +2,7 @@
* dec.h
* Andy Hammerlindl 2002/8/29
*
- * Represents the abstract syntax tree for declatations in the language.
+ * Represents the abstract syntax tree for declarations in the language.
* Also included is abstract syntax for types as they are most often
* used with declarations.
*****/
@@ -45,6 +45,11 @@ using sym::symbol;
class vardec;
+enum class AutounravelOption {
+ Apply,
+ DoNotApply,
+};
+
class astType : public absyn {
public:
astType(position pos)
@@ -54,7 +59,9 @@ public:
// If we introduced a new type, automatically add corresponding functions for
// that type.
- virtual void addOps(coenv &, record *) {}
+ virtual void
+ addOps(coenv&, record*, AutounravelOption opt= AutounravelOption::Apply)
+ {}
// Returns the internal representation of the type. This method can
// be called by exp::getType which does not report errors, so tacit is
@@ -83,6 +90,9 @@ public:
void prettyprint(ostream &out, Int indent) override;
+ void
+ addOps(coenv& e, record* r,
+ AutounravelOption opt= AutounravelOption::Apply) override;
types::ty *trans(coenv &e, bool tacit = false) override;
trans::tyEntry *transAsTyEntry(coenv &e, record *where) override;
@@ -120,7 +130,9 @@ public:
void prettyprint(ostream &out, Int indent) override;
- void addOps(coenv &e, record *r) override;
+ void
+ addOps(coenv& e, record* r,
+ AutounravelOption opt= AutounravelOption::Apply) override;
types::ty *trans(coenv &e, bool tacit = false) override;
@@ -193,7 +205,7 @@ public:
virtual bool returns()
{ return false; }
- // Returns true if it is syntatically allowable to modify this
+ // Returns true if it is syntactically allowable to modify this
// runnable by a PUBLIC or PRIVATE modifier.
virtual bool allowPermissions()
{ return false; }
@@ -202,15 +214,16 @@ public:
// Forward declaration.
class formals;
-class namedTyEntry : public gc {
+class namedTy : public gc {
public:
symbol dest;
- trans::tyEntry *ent;
+ types::ty *t;
position pos;
- namedTyEntry(position pos, symbol dest, trans::tyEntry *ent)
- : dest(dest), ent(ent), pos(pos) {}
+ namedTy(position pos, symbol dest, types::ty *t)
+ : dest(dest), t(t), pos(pos) {}
};
+class receiveTypedefDec;
class block : public runnable {
public:
@@ -222,6 +235,11 @@ public:
protected:
void prettystms(ostream &out, Int indent);
+private:
+ // If the first runnable exists and is a receiveTypedefDec*, return it;
+ // otherwise return nullptr.
+ receiveTypedefDec* getTypedefDec();
+
public:
block(position pos, bool scope=true)
: runnable(pos), scope(scope) {}
@@ -240,14 +258,7 @@ public:
void transAsField(coenv &e, record *r) override;
bool transAsTemplatedField(
- coenv &e, record *r, mem::vector<absyntax::namedTyEntry*>* args,
- trans::frame *caller
- );
-
- void transAsRecordBody(coenv &e, record *r);
- bool transAsTemplatedRecordBody(
- coenv &e, record *r, mem::vector<absyntax::namedTyEntry*> *args,
- trans::frame *caller
+ coenv &e, record *r, mem::vector<absyntax::namedTy*>* args
);
types::record *transAsFile(genv& ge, symbol id);
@@ -255,8 +266,7 @@ public:
types::record *transAsTemplatedFile(
genv& ge,
symbol id,
- mem::vector<absyntax::namedTyEntry*> *args,
- coenv &e
+ mem::vector<absyntax::namedTy*> *args
);
// If the block can be interpreted as a single vardec, return that vardec
@@ -479,7 +489,7 @@ public:
void transAsField(coenv &e, record *r) override
{
- base->addOps(e, r);
+ base->addOps(e, r, AutounravelOption::DoNotApply);
decs->transAsField(e, r, base->trans(e));
}
@@ -526,8 +536,8 @@ struct idpair : public absyn {
// Translates as: from _ unravel src as dest;
// where _ is the qualifier record with source as its fields and types.
- void transAsUnravel(coenv &e, record *r,
- protoenv &source, varEntry *qualifier);
+ trans::tyEntry *transAsUnravel(coenv &e, record *r,
+ protoenv &source, varEntry *qualifier);
void createSymMap(AsymptoteLsp::SymbolContext* symContext) override;
};
@@ -543,8 +553,9 @@ struct idpairlist : public gc {
void transAsAccess(coenv &e, record *r);
- void transAsUnravel(coenv &e, record *r,
- protoenv &source, varEntry *qualifier);
+ mem::vector<trans::tyEntry*> transAsUnravel(
+ coenv &e, record *r, protoenv &source, varEntry *qualifier
+ );
void createSymMap(AsymptoteLsp::SymbolContext* symContext);
@@ -623,7 +634,7 @@ public:
typeParam(position pos, symbol paramSym)
: absyn(pos), paramSym(paramSym) {}
- bool transAsParamMatcher(coenv &e, record *r, namedTyEntry *arg);
+ bool transAsParamMatcher(coenv &e, record *r, namedTy *arg);
void prettyprint(ostream &out, Int indent);
};
@@ -637,7 +648,7 @@ public:
void add(typeParam *tp);
bool transAsParamMatcher(coenv &e, record *r,
- mem::vector<namedTyEntry*> *args, trans::frame *caller);
+ mem::vector<namedTy*> *args);
void prettyprint(ostream &out, Int indent);
};
@@ -652,7 +663,7 @@ public:
void transAsField(coenv& e, record *r) override;
bool transAsParamMatcher(
- coenv& e, record *r, mem::vector<namedTyEntry*> *args, trans::frame *caller
+ coenv& e, record *r, mem::vector<namedTy*> *args
);
};
@@ -777,7 +788,7 @@ public:
void createSymMap(AsymptoteLsp::SymbolContext* symContext) override;
};
-// Types defined from others in typedef.
+// Types defined from others in `typedef` or `using` statement.
class typedec : public dec {
vardec *body;
@@ -785,6 +796,13 @@ public:
typedec(position pos, vardec *body)
: dec(pos), body(body) {}
+ typedec(position pos, decidstart *id_with_signature, astType *return_type)
+ : dec(pos)
+ {
+ decid *di = new decid(id_with_signature->getPos(), id_with_signature);
+ body = new vardec(return_type->getPos(), return_type, di);
+ }
+
void prettyprint(ostream &out, Int indent);
void transAsField(coenv &e, record *r) {
diff --git a/graphics/asymptote/depcomp b/graphics/asymptote/depcomp
new file mode 100755
index 0000000000..715e34311e
--- /dev/null
+++ b/graphics/asymptote/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+
+# 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
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by 'PROGRAMS ARGS'.
+ object Object file output by 'PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputting dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'. Note that this directory component will
+# be either empty or ending with a '/' character. This is deliberate.
+set_dir_from ()
+{
+ case $1 in
+ */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+ *) dir=;;
+ esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+ base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+ echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+ # If the compiler actually managed to produce a dependency file,
+ # post-process it.
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form 'foo.o: dependency.h'.
+ # Do two passes, one to just change these to
+ # $object: dependency.h
+ # and one to simply output
+ # dependency.h:
+ # which is needed to avoid the deleted-header problem.
+ { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+ sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+ } > "$depfile"
+ rm -f "$tmpdepfile"
+ else
+ make_dummy_depfile
+ fi
+}
+
+# A tabulation character.
+tab=' '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+ # This is just like msvisualcpp but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+ # This is just like msvc7 but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+ # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+ gccflag=-qmakedep=gcc,-MF
+ depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am. Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+ for arg
+ do
+ case $arg in
+ -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+ *) set fnord "$@" "$arg" ;;
+ esac
+ shift # fnord
+ shift # $arg
+ done
+ "$@"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say). Also, it might not be
+## supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The second -e expression handles DOS-style file names with drive
+ # letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'. On the theory
+## that the space means something, we add a space to the output as
+## well. hp depmode also adds that space, but also prefixes the VPATH
+## to the object. Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like '#:fec' to the end of the
+ # dependency line.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+ | tr "$nl" ' ' >> "$depfile"
+ echo >> "$depfile"
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+xlc)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts '$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ set_dir_from "$object"
+ set_base_from "$object"
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$base.u
+ tmpdepfile3=$dir.libs/$base.u
+ "$@" -Wc,-M
+ else
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$dir$base.u
+ tmpdepfile3=$dir$base.u
+ "$@" -M
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ aix_post_process_depfile
+ ;;
+
+tcc)
+ # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+ # FIXME: That version still under development at the moment of writing.
+ # Make that this statement remains true also for stable, released
+ # versions.
+ # It will wrap lines (doesn't matter whether long or short) with a
+ # trailing '\', as in:
+ #
+ # foo.o : \
+ # foo.c \
+ # foo.h \
+ #
+ # It will put a trailing '\' even on the last line, and will use leading
+ # spaces rather than leading tabs (at least since its commit 0394caf7
+ # "Emit spaces for -MD").
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+ # We have to change lines of the first kind to '$object: \'.
+ sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+ # And for each line of the second kind, we have to emit a 'dep.h:'
+ # dummy dependency, to avoid the deleted-header problem.
+ sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file. A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+ # Portland's C compiler understands '-MD'.
+ # Will always output deps to 'file.d' where file is the root name of the
+ # source file under compilation, even if file resides in a subdirectory.
+ # The object file name does not affect the name of the '.d' file.
+ # pgcc 10.2 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using '\' :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+ set_dir_from "$object"
+ # Use the source, not the object, to determine the base name, since
+ # that's sadly what pgcc will do too.
+ set_base_from "$source"
+ tmpdepfile=$base.d
+
+ # For projects that build the same source file twice into different object
+ # files, the pgcc approach of using the *source* file root name can cause
+ # problems in parallel builds. Use a locking strategy to avoid stomping on
+ # the same $tmpdepfile.
+ lockdir=$base.d-lock
+ trap "
+ echo '$0: caught signal, cleaning up...' >&2
+ rmdir '$lockdir'
+ exit 1
+ " 1 2 13 15
+ numtries=100
+ i=$numtries
+ while test $i -gt 0; do
+ # mkdir is a portable test-and-set.
+ if mkdir "$lockdir" 2>/dev/null; then
+ # This process acquired the lock.
+ "$@" -MD
+ stat=$?
+ # Release the lock.
+ rmdir "$lockdir"
+ break
+ else
+ # If the lock is being held by a different process, wait
+ # until the winning process is done or we timeout.
+ while test -d "$lockdir" && test $i -gt 0; do
+ sleep 1
+ i=`expr $i - 1`
+ done
+ fi
+ i=`expr $i - 1`
+ done
+ trap - 1 2 13 15
+ if test $i -le 0; then
+ echo "$0: failed to acquire lock after $numtries attempts" >&2
+ echo "$0: check lockdir '$lockdir'" >&2
+ exit 1
+ fi
+
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp2)
+ # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+ # compilers, which have integrated preprocessors. The correct option
+ # to use with these is +Maked; it writes dependencies to a file named
+ # 'foo.d', which lands next to the object file, wherever that
+ # happens to be.
+ # Much of this is similar to the tru64 case; see comments there.
+ set_dir_from "$object"
+ set_base_from "$object"
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir.libs/$base.d
+ "$@" -Wc,+Maked
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ "$@" +Maked
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add 'dependent.h:' lines.
+ sed -ne '2,${
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile" "$tmpdepfile2"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in 'foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ set_dir_from "$object"
+ set_base_from "$object"
+
+ if test "$libtool" = yes; then
+ # Libtool generates 2 separate objects for the 2 libraries. These
+ # two compilations output dependencies in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir$base.o.d # libtool 1.5
+ tmpdepfile2=$dir.libs/$base.o.d # Likewise.
+ tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ # Same post-processing that is required for AIX mode.
+ aix_post_process_depfile
+ ;;
+
+msvc7)
+ if test "$libtool" = yes; then
+ showIncludes=-Wc,-showIncludes
+ else
+ showIncludes=-showIncludes
+ fi
+ "$@" $showIncludes > "$tmpdepfile"
+ stat=$?
+ grep -v '^Note: including file: ' "$tmpdepfile"
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The first sed program below extracts the file names and escapes
+ # backslashes for cygpath. The second sed program outputs the file
+ # name when reading, but also accumulates all include files in the
+ # hold buffer in order to output them again at the end. This only
+ # works with sed implementations that can handle large buffers.
+ sed < "$tmpdepfile" -n '
+/^Note: including file: *\(.*\)/ {
+ s//\1/
+ s/\\/\\\\/g
+ p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+ s/.*/'"$tab"'/
+ G
+ p
+}' >> "$depfile"
+ echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+ rm -f "$tmpdepfile"
+ ;;
+
+msvc7msys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove '-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for ':'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+ "$@" $dashmflag |
+ sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this sed invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no eat=no
+ for arg
+ do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ if test $eat = yes; then
+ eat=no
+ continue
+ fi
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -arch)
+ eat=yes ;;
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix=`echo "$object" | sed 's/^.*\././'`
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ # makedepend may prepend the VPATH from the source file name to the object.
+ # No need to regex-escape $object, excess matching of '.' is harmless.
+ sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process the last invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed '1,2d' "$tmpdepfile" \
+ | tr ' ' "$nl" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove '-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E \
+ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ | sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E 2>/dev/null |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+ echo "$tab" >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvcmsys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/graphics/asymptote/determine_pkg_info.py b/graphics/asymptote/determine_pkg_info.py
new file mode 100755
index 0000000000..ed092e9aef
--- /dev/null
+++ b/graphics/asymptote/determine_pkg_info.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+__doc__ = """
+Determine package version information from configure.ac file for Asymptote
+"""
+__author__ = "Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>"
+
+import pathlib
+import re
+
+REGEXES = {
+ "base": re.compile(
+ r"AC_INIT\(\s*\[\s*(.+)\s*]\s*," # pkg name
+ + r"\s*\[\s*(.+)\s*]\s*," # pkg version
+ + r"\s*\[\s*(.+)\s*]\s*\)" # issue url
+ ),
+ "asygl": re.compile(r"ASYGLVERSION\s*=\s*(.+)"),
+}
+
+
+def process_configure_ac_file(f):
+ """
+ Returns a dictionary containing version information, if found
+ from the configure.ac file object
+ """
+ regexes_to_search = dict(REGEXES)
+ result = {}
+ for line in f:
+ if not regexes_to_search:
+ return result # done now, can return
+ regex_result = {key: val.match(line) for key, val in regexes_to_search.items()}
+ regex_result_not_none: dict[str, re.Match[str]] = {
+ key: val for key, val in regex_result.items() if val is not None
+ }
+ for key, match_obj in regex_result_not_none.items():
+ regexes_to_search.pop(key)
+ if key == "base":
+ result.update(
+ {
+ "name": match_obj.group(1),
+ "version-base": match_obj.group(2),
+ "issue-url": match_obj.group(3),
+ }
+ )
+ if key == "asygl":
+ result["asygl-version"] = match_obj.group(1)
+ return result
+
+
+def determine_asy_pkg_info(ac_file="configure.ac"):
+ """
+ Returns a dictionary containing version information, if found
+ from the ac_file specified
+ """
+ with open(
+ ac_file,
+ "r",
+ encoding="utf-8",
+ ) as f:
+ return process_configure_ac_file(f)
+
+
+def main():
+ pkg_version_info = determine_asy_pkg_info(
+ pathlib.Path(__file__).parent / "configure.ac"
+ )
+ version_tuple = (
+ pkg_version_info.get("name", "NAME-UNKNOWN"),
+ pkg_version_info.get("version-base", "VERSION-UNKNOWN"),
+ pkg_version_info.get("issue-url", "ISSUE-URL-UNKNOWN"),
+ pkg_version_info.get("asygl-version", "ASYGL-UNKNOWN"),
+ )
+ print(";".join(version_tuple), end="")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/graphics/asymptote/doc/CAD.pdf b/graphics/asymptote/doc/CAD.pdf
index 819509abff..d5c1937a3a 100644
--- a/graphics/asymptote/doc/CAD.pdf
+++ b/graphics/asymptote/doc/CAD.pdf
Binary files differ
diff --git a/graphics/asymptote/doc/FAQ/asy-faq.info b/graphics/asymptote/doc/FAQ/asy-faq.info
index e66a938dae..bf9145c4c7 100644
--- a/graphics/asymptote/doc/FAQ/asy-faq.info
+++ b/graphics/asymptote/doc/FAQ/asy-faq.info
@@ -10,7 +10,7 @@ END-INFO-DIR-ENTRY
File: asy-faq.info, Node: Top, Next: Question 1.1, Up: (dir)
ASYMPTOTE FREQUENTLY ASKED QUESTIONS
- 2024-06-21
+ 2025-02-17
This is the list of Frequently Asked Questions about Asymptote (asy).
diff --git a/graphics/asymptote/doc/TeXShopAndAsymptote.pdf b/graphics/asymptote/doc/TeXShopAndAsymptote.pdf
index de1fb5b2da..d428714e28 100644
--- a/graphics/asymptote/doc/TeXShopAndAsymptote.pdf
+++ b/graphics/asymptote/doc/TeXShopAndAsymptote.pdf
Binary files differ
diff --git a/graphics/asymptote/doc/asy-latex.pdf b/graphics/asymptote/doc/asy-latex.pdf
index e09c0b928e..a6ba10d8c7 100644
--- a/graphics/asymptote/doc/asy-latex.pdf
+++ b/graphics/asymptote/doc/asy-latex.pdf
Binary files differ
diff --git a/graphics/asymptote/doc/asy.1 b/graphics/asymptote/doc/asy.1
index d2686af927..74f427bc7d 100644
--- a/graphics/asymptote/doc/asy.1
+++ b/graphics/asymptote/doc/asy.1
@@ -109,7 +109,7 @@ Compress images in PDF output [true].
-convertOptions str []
.TP
.B \-d,\-debug
-Enable debugging messages [false].
+Enable debugging messages and traceback false.
.TP
.B \-devicepixelratio n
Ratio of physical to logical pixels [1].
@@ -374,7 +374,7 @@ Show where listed variables are declared [false].
Run asy under the Windows Subsystem for Linux [false].
.TP
.B \-xasy
-Interactive mode for xasy [false].
+Interactive mode for xasy false.
.TP
.B \-zoomPinchCap limit
WebGL maximum zoom pinch [100].
diff --git a/graphics/asymptote/doc/asyRefCard.pdf b/graphics/asymptote/doc/asyRefCard.pdf
index dcfb6417e4..8599e0f366 100644
--- a/graphics/asymptote/doc/asyRefCard.pdf
+++ b/graphics/asymptote/doc/asyRefCard.pdf
Binary files differ
diff --git a/graphics/asymptote/doc/asymptote.pdf b/graphics/asymptote/doc/asymptote.pdf
index a5de59f7c4..91cab65cd6 100644
--- a/graphics/asymptote/doc/asymptote.pdf
+++ b/graphics/asymptote/doc/asymptote.pdf
Binary files differ
diff --git a/graphics/asymptote/doc/asymptote.texi b/graphics/asymptote/doc/asymptote.texi
index f37789114f..91cf375058 100644
--- a/graphics/asymptote/doc/asymptote.texi
+++ b/graphics/asymptote/doc/asymptote.texi
@@ -11,7 +11,7 @@ This file documents @code{Asymptote}, version @value{VERSION}.
@url{https://asymptote.sourceforge.io}
-Copyright @copyright{} 2004-24 Andy Hammerlindl, John Bowman, and Tom Prince.
+Copyright @copyright{} 2004-25 Andy Hammerlindl, John Bowman, and Tom Prince.
@quotation
Permission is granted to copy, distribute and/or modify this document
@@ -42,7 +42,7 @@ file LICENSE in the top-level source directory).
@contents
@ifnottex
-@node Top, Description, (dir), (dir)
+@node Top
@top Asymptote
@insertcopying
@@ -112,7 +112,7 @@ Programming
* Structures:: Organize your data
* Operators:: Arithmetic and logical operators
* Implicit scaling:: Avoiding those ugly *s
-* Functions:: Traditional and high-order functions
+* Functions:: Traditional and higher-order functions
* Arrays:: Dynamic vectors
* Casts:: Implicit and explicit casts
* Import:: Importing external @code{Asymptote} modules
@@ -190,7 +190,7 @@ Graphical User Interface
@end detailmenu
@end menu
-@node Description, Installation, Top, Top
+@node Description
@chapter Description
@cindex description
@@ -201,7 +201,7 @@ Labels and equations are typeset with @code{LaTeX}, for overall document
consistency, yielding the same high-quality level of typesetting that
@code{LaTeX} provides for scientific text. By default it produces
@code{PostScript} output, but it can also generate @code{OpenGL}, @code{PDF},
-@code{SVG}, @code{WebGL}, @code{V3D}, and @code{PRC} vector graphics,
+@code{SVG}, @code{WebGL}, @code{V3D}, and legacy @code{PRC} vector graphics,
along with any format that the @code{ImageMagick} package can
produce. You can even try it out in your Web browser without
installing it, using the @code{Asymptote Web Application}
@@ -298,7 +298,7 @@ A quick reference card for @code{Asymptote} is available at
@url{https://asymptote.sourceforge.io/asyRefCard.pdf}
@end quotation
-@node Installation, Tutorial, Description, Top
+@node Installation
@chapter Installation
@cindex installation
@@ -330,7 +330,7 @@ Users may also wish to monitor the @code{Asymptote} forum:
@end quotation
@noindent
-@node UNIX binary distributions, MacOS X binary distributions, Installation, Installation
+@node UNIX binary distributions
@section UNIX binary distributions
@cindex UNIX binary distributions
@@ -367,7 +367,7 @@ prebuilt @code{Asymptote} binaries from
@url{http://ftp.debian.org/debian/pool/main/a/asymptote}
@end quotation
-@node MacOS X binary distributions, Microsoft Windows, UNIX binary distributions, Installation
+@node MacOS X binary distributions
@section MacOS X binary distributions
@cindex @code{MacOS X} binary distributions
@code{MacOS X} users can either compile the @code{UNIX} source code
@@ -386,7 +386,7 @@ Note that many @code{MacOS X} (and FreeBSD) systems lack the
functionality, @acronym{GNU} @code{readline} version 4.3 or later must
be installed.
-@node Microsoft Windows, Configuring, MacOS X binary distributions, Installation
+@node Microsoft Windows
@section Microsoft Windows
@cindex Microsoft Windows
Users of the @code{Microsoft Windows} operating system can install the
@@ -417,7 +417,7 @@ Example code will be installed by default in the @code{examples}
subdirectory of the installation directory (by default,
@code{C:\Program Files\Asymptote}).
-@node Configuring, Search paths, Microsoft Windows, Installation
+@node Configuring
@section Configuring
@cindex configuring
@cindex @code{-V}
@@ -572,7 +572,7 @@ under @code{Microsoft Windows XP}:
@item Click the @code{Environment Variables} button.
@end enumerate
-@node Search paths, Compiling from UNIX source, Configuring, Installation
+@node Search paths
@section Search paths
@cindex search paths
@@ -603,7 +603,7 @@ The @code{Asymptote} examples directory (by default,
@code{C:\Program Files\Asymptote\examples} under @code{MSDOS}).
@end enumerate
-@node Compiling from UNIX source, Editing modes, Search paths, Installation
+@node Compiling from UNIX source
@section Compiling from UNIX source
@cindex Compiling from UNIX source
@@ -700,7 +700,7 @@ your path and set the configuration variable @code{dir} to point
to the directory @code{base} (in the top level directory of the
@code{Asymptote} source code).
-@node Editing modes, Git, Compiling from UNIX source, Installation
+@node Editing modes
@section Editing modes
@cindex Editing modes
@cindex @code{emacs}
@@ -772,7 +772,7 @@ can be enabled by running @code{asy-kate.sh} in the
@code{@value{Datadir}/asymptote} directory and putting the generated
@code{asymptote.xml} file in @code{~/.local/share/org.kde.syntax-highlighting/syntax/}.
-@node Git, Uninstall, Editing modes, Installation
+@node Git
@section Git
@cindex git
@@ -789,7 +789,7 @@ make install
@end verbatim
@noindent
-To compile without optimization, use the command @code{make CFLAGS=-g}.
+To compile without optimization
On @code{Ubuntu} systems, you may need to first install the required
dependencies:
@verbatim
@@ -812,11 +812,11 @@ executing @code{make} from @code{doc} folder first.
The @code{asy} executable is required for compiling the diagrams
in the documentation.
-@node Uninstall, , Git, Installation
+@node Uninstall
@section Uninstall
@cindex uninstall
-To uninstall a @code{Linux x86_64} binary distribution, use the commands
+To uninstall a @code{Linux x86_64} binary distribution
@verbatim
tar -zxvf asymptote-x.xx.x86_64.tgz | xargs --replace=% rm /%
texhash
@@ -829,7 +829,7 @@ distribution, use the command
make uninstall
@end verbatim
-@node Tutorial, Drawing commands, Installation, Top
+@node Tutorial
@chapter Tutorial
@cindex tutorial
@@ -852,7 +852,7 @@ with images rendered by an online Asymptote engine:
@url{https://www.artofproblemsolving.com/wiki/?title=Asymptote_(Vector_Graphics_Language)}
-@node Drawing in batch mode, Drawing in interactive mode, Tutorial, Tutorial
+@node Drawing in batch mode
@section Drawing in batch mode
@cindex batch mode
To draw a line from coordinate (0,0) to coordinate (100,100),
@@ -886,7 +886,7 @@ can immediately view the result:
Here, the @code{--} connector joins the two points @code{(0,0)} and
@code{(100,100)} with a line segment.
-@node Drawing in interactive mode, Figure size, Drawing in batch mode, Tutorial
+@node Drawing in interactive mode
@section Drawing in interactive mode
@cindex interactive mode
Another method is @emph{interactive mode}, where @code{Asymptote} reads
@@ -917,7 +917,7 @@ The tab key will automatically complete unambiguous words;
otherwise, hitting tab again will show the possible choices. Further
commands specific to interactive mode are described in @ref{Interactive mode}.
-@node Figure size, Labels, Drawing in interactive mode, Tutorial
+@node Figure size
@section Figure size
@cindex @code{size}
@cindex @code{pair}
@@ -972,7 +972,7 @@ draw(unitsquare);
@end verbatim
@noindent
-@node Labels, Paths, Figure size, Tutorial
+@node Labels
@section Labels
@cindex @code{label}
Adding labels is easy in @code{Asymptote}; one specifies the
@@ -995,7 +995,7 @@ module @code{plain} (a user who has a local variable named @code{E}
may access the compass direction @code{E} by prefixing it with the name
of the module where it is defined: @code{plain.E}).
-@node Paths, , Labels, Tutorial
+@node Paths
@section Paths
@cindex @code{path}
This example draws a path that approximates a quarter circle,
@@ -1067,7 +1067,7 @@ further examples, including two-dimensional and interactive
three-dimensional scientific graphs. Additional examples have been
posted by Philippe Ivaldi at @url{https://web.archive.org/web/20201130113133/http://www.piprime.fr/asymptote}.
-@node Drawing commands, Bezier curves, Tutorial, Top
+@node Drawing commands
@chapter Drawing commands
@cindex drawing commands
@@ -1118,7 +1118,7 @@ currentpicture).
* label:: Label a point on a picture
@end menu
-@node draw, fill, Drawing commands, Drawing commands
+@node draw
@section draw
@cindex @code{draw}
@verbatim
@@ -1350,7 +1350,7 @@ void draw(pair origin, picture pic=currentpicture, Label L="", path g,
@end verbatim
@cindex @code{fill}
-@node fill, clip, draw, Drawing commands
+@node fill
@section fill
@cindex @code{fill}
@verbatim
@@ -1460,9 +1460,10 @@ In the second form, the elements of @code{z} are taken to be successive
nodes of path @code{g}. The pens in @code{p} must belong to the same
color space. Illustrations of Gouraud shading are provided in the example file
@code{@uref{https://asymptote.sourceforge.io/gallery/PDFs/Gouraud.pdf,,Gouraud}@uref{https://asymptote.sourceforge.io/gallery/PDFs/Gouraud.asy,,.asy}}.
-The edge flags used in Gouraud shading are documented here:
+The edge flags used in Gouraud shading are documented on pages 270--274
+of the PostScript Language Reference (3rd edition):
@quotation
-@url{https://www.adobe.com/content/dam/acom/en/devnet/postscript/pdfs/TN5600.SmoothShading.pdf}
+@url{https://www.adobe.com/jp/print/postscript/pdfs/PLRM.pdf}
@end quotation
@cindex Coons shading
@@ -1524,7 +1525,7 @@ The following routine uses @code{evenodd} clipping together with the
void unfill(picture pic=currentpicture, path g);
@end verbatim
-@node clip, label, fill, Drawing commands
+@node clip
@section clip
@cindex @code{clip}
@cindex @code{stroke}
@@ -1542,7 +1543,7 @@ of depth (it transcends layers and even pages), one can localize clipping
to a temporary picture, which can then be added to @code{pic}.
For an illustration of picture clipping, see the first example in @ref{LaTeX usage}.
-@node label, , clip, Drawing commands
+@node label
@section label
@cindex @code{label}
@cindex @code{labelmargin}
@@ -1731,7 +1732,7 @@ produce a CD label:
@center @image{./CDlabel}
@verbatiminclude CDlabel.asy
-@node Bezier curves, Programming, Drawing commands, Top
+@node Bezier curves
@chapter Bezier curves
@cindex Bezier curves
@cindex direction specifier
@@ -1798,7 +1799,7 @@ it approximates a straight line.
@cindex @code{and}
@cindex @code{atleast}
One can change the spline tension from its default value of 1 to any
-real value greater than or equal to 0.75 (cf. John D. Hobby, Discrete and
+real value greater than or equal to 0.75 (see John D. Hobby, Discrete and
Computational Geometry 1, 1986):
@verbatim
draw((100,0)..tension 2 ..(100,100)..(0,100));
@@ -1841,7 +1842,7 @@ infinity..} and the @code{&} connector concatenates two paths, after
first stripping off the last node of the first path (which normally
should coincide with the first node of the second path).
-@node Programming, LaTeX usage, Bezier curves, Top
+@node Programming
@chapter Programming
@cindex programming
@@ -1857,11 +1858,12 @@ should coincide with the first node of the second path).
* Structures:: Organize your data
* Operators:: Arithmetic and logical operators
* Implicit scaling:: Avoiding those ugly *s
-* Functions:: Traditional and high-order functions
+* Functions:: Traditional and higher-order functions
* Arrays:: Dynamic vectors
* Casts:: Implicit and explicit casts
* Import:: Importing external @code{Asymptote} modules
* Static:: Where to allocate your variable?
+* Autounravel:: Adding associated libraries to structures
@end menu
Here is a short introductory example to the @code{Asymptote} programming
@@ -1918,7 +1920,7 @@ for(int k : array) {
In addition, it supports many features beyond the ones found in those
languages.
-@node Data types, Paths and guides, Programming, Programming
+@node Data types
@section Data types
@cindex data types
@code{Asymptote} supports the following data types (in addition to
@@ -2419,13 +2421,25 @@ produces a beep on the console;
@end table
@cindex @code{typedef}
+@cindex @code{using}
@end table
As in C/C++, complicated types may be abbreviated with @code{typedef}
+or @code{using}. For instance, the line
+@verbatim
+using multipath = path[];
+@end verbatim
+will make @code{multipath} a type equivalent @code{path[]}, as will
+the equivalent line
+@verbatim
+typedef path[] multipath;
+@end verbatim
+For the most part such type aliasing is a convenience. However, it is required
+when declaring a function whose return type is a function
(see the example in @ref{Functions}).
-@node Paths and guides, Pens, Data types, Programming
+@node Paths and guides
@section Paths and guides
@table @code
@@ -2904,7 +2918,7 @@ e{down}..nullpath..{up}f;
@end table
-@node Pens, Transforms, Paths and guides, Programming
+@node Pens
@section Pens
@cindex @code{pen}
@@ -3306,8 +3320,8 @@ following foreground--background blending operations:
"HardLight","ColorDodge","ColorBurn","Darken","Lighten","Difference",
"Exclusion","Hue","Saturation","Color","Luminosity",
@end verbatim
-as described in
-@url{https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf}.
+as described in Tables 136 and 137 of
+@url{https://opensource.adobe.com/dc-acrobat-sdk-docs/standards/pdfstandards/pdf/PDF32000_2008.pdf}.
Since @code{PostScript} does not support transparency, this feature is
only effective with the @code{-f pdf} output format option; other
formats can be produced from the resulting @acronym{PDF} file with the
@@ -3419,7 +3433,7 @@ The routine @code{defaultpen()} returns the current default pen attributes.
Calling the routine @code{resetdefaultpen()} resets all pen default
attributes to their initial values.
-@node Transforms, Frames and pictures, Pens, Programming
+@node Transforms
@section Transforms
@cindex @code{transform}
@@ -3504,7 +3518,7 @@ is an isometry (preserves distance).
@cindex @code{max}
Frames are canvases for drawing in @code{PostScript} coordinates. While working
with frames directly is occasionally necessary for constructing deferred
-drawing routines, pictures are usually more convenient to work with.
+drawing routines
The implicit initializer for frames is @code{newframe}. The function
@code{bool empty(frame f)} returns @code{true} only if the frame @code{f}
is empty. A frame may be erased with the @code{erase(frame)} routine.
@@ -3621,6 +3635,8 @@ are only relevant for 3D pictures. If @code{defaultfilename} is an
empty string, the prefix @code{outprefix()} will be used.
A @code{shipout()} command is added implicitly at file exit.
+Explicit @code{shipout()} commands to the same file as the final implicit
+shipout are ignored.
@cindex @code{orientation}
@cindex @code{Portrait}
@cindex @code{Landscape}
@@ -3913,8 +3929,10 @@ that can be used for importing @code{LaTeX} packages.
@end table
+@anchor{deferred drawing}
@node Deferred drawing
@section Deferred drawing
+@cindex deferred drawing
It is sometimes desirable to have elements of a fixed absolute size,
independent of the picture scaling from user to
@code{PostScript} coordinates.
@@ -4026,7 +4044,7 @@ binary files.
@cindex @code{input}
An input file can be opened with
@verbatim
-input(string name="", bool check=true, string comment="#", string mode="");
+input(string name=""
@end verbatim
reading is then done by assignment:
@cindex open
@@ -4133,7 +4151,7 @@ comma). Here are some simple examples of data output:
@verbatim
file fout=output("test.txt");
write(fout,1); // Writes "1"
-write(fout); // Writes a new line
+write(fout, endl); // Writes a new line
write(fout,"List: ",1,2,3); // Writes "List: 1 2 3"
@end verbatim
@noindent
@@ -4291,7 +4309,7 @@ from the strings @code{file} and @code{format}.
@cindex @code{operator init}
@cindex initializers
-A variable can be assigned a value when it is declared, as in
+A variable can be assigned a value when it is declared
@code{int x=3;} where the variable @code{x} is assigned the value @code{3}.
As well as literal constants such as @code{3}, arbitary expressions can be used
as initializers, as in @code{real x=2*sin(pi/2);}.
@@ -4373,7 +4391,7 @@ for (var x : a)
write(x);
@end verbatim
-@node Structures, Operators, Variable initializers, Programming
+@node Structures
@section Structures
@cindex @code{struct}
@cindex structures
@@ -4562,7 +4580,7 @@ write(c.y); // Outputs 3;
For further examples of structures, see @code{Legend} and @code{picture} in
the @code{Asymptote} base module @code{plain}.
-@node Operators, Implicit scaling, Structures, Programming
+@node Operators
@section Operators
@cindex operators
@@ -4572,7 +4590,7 @@ the @code{Asymptote} base module @code{plain}.
* User-defined operators:: Overloading operators
@end menu
-@node Arithmetic & logical, Self & prefix operators, Operators, Operators
+@node Arithmetic & logical
@subsection Arithmetic & logical operators
@cindex arithmetic operators
@cindex binary operators
@@ -4689,7 +4707,7 @@ for nonintegral built-in arithmetic types @code{T}. If @code{a} and
@code{int bitreverse(int a, int bits)} (reverse bits within a word of
length bits).
-@node Self & prefix operators, User-defined operators, Arithmetic & logical, Operators
+@node Self & prefix operators
@subsection Self & prefix operators
@cindex self operators
@cindex prefix operators
@@ -4728,7 +4746,7 @@ path-joining operator). In the rare instances where @code{i++}
and @code{i--} are really needed, one can substitute the expressions
@code{(++i-1)} and @code{(--i+1)}, respectively.
-@node User-defined operators, , Self & prefix operators, Operators
+@node User-defined operators
@subsection User-defined operators
@cindex user-defined operators
@cindex @code{operator}
@@ -4765,6 +4783,8 @@ guide g=(0,0){up}..{SW}(100,100){NE}..{curl 3}(50,50)..(10,10);
write("g=",g);
@end verbatim
+@xref{Autounravel}, for an example overloading the @code{+} operator.
+
@node Implicit scaling, Functions, Operators, Programming
@section Implicit scaling
@cindex implicit scaling
@@ -4804,7 +4824,7 @@ This produces the output
283.464008929116
@end verbatim
-@node Functions, Arrays, Implicit scaling, Programming
+@node Functions
@section Functions
@cindex functions
@@ -4855,16 +4875,21 @@ int c();
c=a; // Valid: only one possible assignment.
@end verbatim
-@item Anonymous (so-called "high-order") functions are also allowed:
+@item ``Higher-order'' functions, in other words functions that return
+functions, are allowed.
+The return type must be given a signature-free alias with
+@code{using} or @code{typedef}:
+@cindex @code{using}
@cindex @code{typedef}
@verbatim
-typedef int intop(int);
+using intop = int(int);
+// typedef int intop(int); // Equivalent to previous line
intop adder(int m)
{
return new int(int n) {return m+n;};
}
intop addby7=adder(7);
-write(addby7(1)); // Writes 8.
+write(addby7(1)); // Writes 8.
@end verbatim
@item
@@ -4932,7 +4957,7 @@ segmentation fault, unless a fully working version of the @acronym{GNU}
library @code{libsigsegv} (e.g.@ 2.4 or later) is installed at
configuration time).
-@node Default arguments, Named arguments, Functions, Functions
+@node Default arguments
@subsection Default arguments
@cindex default arguments
@cindex arguments
@@ -4953,7 +4978,7 @@ The value of a default argument is determined by evaluating the
given @code{Asymptote} expression in the scope where the called
function is defined.
-@node Named arguments, Rest arguments, Default arguments, Functions
+@node Named arguments
@subsection Named arguments
@cindex keywords
@cindex named arguments
@@ -5034,7 +5059,7 @@ int f(int x=3, int x()) {
then @code{f(x=seven)} would be illegal, even though @code{f(seven)}
obviously would be allowed.
-@node Rest arguments, Mathematical functions, Named arguments, Functions
+@node Rest arguments
@subsection Rest arguments
@cindex rest arguments
@@ -5137,7 +5162,7 @@ i(3,4); // ambiguous; the first candidate is better for the first argument,
// but the second candidate is better for the second one
@end verbatim
-@node Mathematical functions, , Rest arguments, Functions
+@node Mathematical functions
@subsection Mathematical functions
@cindex mathematical functions
@cindex functions
@@ -5234,7 +5259,9 @@ function (equivalent to @code{fabs(real)}), an @code{abs(pair)} function
@cindex @code{histogram}
@cindex @code{factorial}
@cindex @code{choose}
-Random numbers can be seeded with @code{srand(int)} and generated with
+Random numbers can be seeded with @code{srand(int)}
+(for example, with @code{srand(round((cputime().parent.clock%1)*1e9))})
+and generated with
the @code{int rand()} function, which returns a random integer between 0
and the integer @code{randMax}. The @code{unitrand()} function returns
a random number uniformly distributed in the interval [0,1].
@@ -5383,7 +5410,7 @@ the total system cputime followed by ``S''.
@end table
-@node Arrays, Casts, Functions, Programming
+@node Arrays
@section Arrays
@cindex arrays
@@ -5590,15 +5617,16 @@ returns the indices of all @code{true} values in the boolean array @code{a};
@cindex @code{search}
@item int search(T[] a, T key)
For built-in ordered types @code{T}, searches a sorted array
-@code{a} of @code{n} elements for k, returning the index @code{i}
+@code{a} of @code{n} elements for @code{key}, returning the index @code{i}
if @code{a[i] <= key < a[i+1]}, @code{-1} if @code{key} is
less than all elements of @code{a}, or @code{n-1} if @code{key} is
greater than or equal to the last element of @code{a};
@cindex @code{search}
@item int search(T[] a, T key, bool less(T i, T j))
-searches an array @code{a} sorted in ascending order such that element
-@code{i} precedes element @code{j} if @code{less(i,j)} is true;
+searches an array @code{a} for @code{key} sorted in ascending order
+such that element @code{i} precedes element @code{j} if
+@code{less(i,j)} is true;
@cindex @code{copy}
@item T[] copy(T[] a)
@@ -5924,7 +5952,7 @@ One, two, and three-dimensional arrays of the basic data types can be
output with the functions @code{write(file,T[])},
@code{write(file,T[][])}, @code{write(file,T[][][])}, respectively.
-@node Slices, , Arrays, Arrays
+@node Slices
@subsection Slices
@cindex slices
@@ -6012,7 +6040,7 @@ so assigning to this slice will insert values at the start of the array.
It is illegal to assign to a slice of a cyclic array that repeats any of the
cells.
-@node Casts, Import, Arrays, Programming
+@node Casts
@section Casts
@cindex casts
@cindex implicit casts
@@ -6097,7 +6125,7 @@ real operator cast(int x)=convert;
@cindex @code{operator ecast}
Explicit casts are implemented similarly, with @code{operator ecast}.
-@node Import, Static, Casts, Programming
+@node Import
@section Import
@cindex @code{access}
While @code{Asymptote} provides many features by default,
@@ -6305,8 +6333,8 @@ Imported global functions and variables are also listed if
@strong{Warning:} This feature is experimental: it has known issues and its behavior may change in the future.
-In Asymptote, it is possible to create modules that must have one or more
-types specified when they are imported. The first executable line of any such
+In Asymptote
+types are specified when they are imported. The first executable line of any such
module must be of the form @code{typedef import(<types>)}, where
@code{<types>} is a list of required type parameters. For instance,
@verbatim
@@ -6349,7 +6377,7 @@ Issues: Certain expected operators (such as
@code{operator ==}) may only be available for type arguments that are
builtin or defined in module @code{plain}.
-@node Static, , Import, Programming
+@node Static
@section Static
@cindex @code{static}
@@ -6476,7 +6504,95 @@ It is the convention in Asymptote that, if there is a non-function variable with
the same name as the qualifier, the qualifier refers to that variable, and not
to the type. This is regardless of what fields the variable actually possesses.
-@node LaTeX usage, Base modules, Programming, Top
+@node Autounravel
+@section Autounravel
+@cindex @code{autounravel}
+
+The @code{autounravel} modifier can be used to automatically unravel a field.
+This is useful when building an associated library of functions
+that operate on a structure. For instance, consider a simple
+implementation of the @code{rational} structure defined in @code{rational.asy}:
+
+@verbatim
+struct rational {
+ int p=0, q=1;
+ void operator init(int p, int q) {
+ this.p=p;
+ this.q=q;
+ }
+}
+rational operator +(rational a, rational b) {
+ return rational(a.p*b.q+b.p*a.q, a.q*b.q);
+}
+@end verbatim
+
+To allow @code{rational} to be used as a type parameter for a templated import
+that adds instances of @code{rational}, we should move @code{operator +}
+into the body of the @code{rational} structure and add the
+@code{autounravel} modifier:
+
+@verbatim
+struct rational {
+ int p=0, q=1;
+ void operator init(int p, int q) {
+ this.p=p;
+ this.q=q;
+ }
+ autounravel rational operator +(rational a, rational b) {
+ return rational(a.p*b.q+b.p*a.q, a.q*b.q);
+ }
+}
+@end verbatim
+
+This is almost equivalent to the previous code, but now the @code{+} operator
+will be accessible wherever the @code{rational} structure is.
+
+@strong{Currently, types cannot be autounraveled.}
+Users who encounter a case where this might be useful can submit a
+feature request at @uref{https://github.com/vectorgraphics/asymptote/issues}.
+
+@node When fields are autounraveled
+@subsection When fields are autounraveled
+
+If a @code{struct} contains fields (including functions) that are declared with
+@code{autounravel}, these fields will be unraveled from the @code{struct} at:
+
+@itemize
+@item
+the end of the @code{struct} definition;
+@item
+a @code{typedef import} statement, if the @code{struct} is the argument for one of
+the type parameters;
+@item
+an @code{unravel} or @code{access} statement that unravels the @code{struct} from
+a module or outer @code{struct} (for instance,
+@code{from rational access rational;} would make the @code{+} operator available
+from the @code{struct} @code{rational} defined in @code{rational.asy});
+
+@item
+A @code{typedef} statement like @code{typedef rational.rational rat;}
+that renames a @code{struct}.
+@end itemize
+
+@node Where autounravel is legal
+@subsection Where @code{autounravel} is legal
+
+The @code{autounravel} modifier implies @code{static} and can be used
+in many of the same places as @code{static}. However, specifying
+@code{autounravel} at the top level of a module (i.e.,
+outside of any structure or function) is an error, whereas @code{static}
+gives only a warning. @footnote{If top-level @code{autounravel} were allowed,
+a user might incorrectly assume that the field would be unraveled
+whenever the module is @code{access}ed. The @code{static} modifier
+is allowed at the top level because, while it does nothing, it does
+not mislead the user.}
+In front of a @code{struct} definition or @code{typedef} statement,
+@code{autounravel} is forbidden because types cannot be autounraveled.
+While @code{static static} results in an error,
+@code{static autounravel} and @code{autounravel static} are both legal
+and have exactly the same effect as @code{autounravel} alone.
+
+@node LaTeX usage
@chapter @code{LaTeX} usage
@cindex @code{LaTeX} usage
@cindex @code{asymptote.sty}
@@ -6582,7 +6698,7 @@ Here now is @code{latexusage.tex}:
@page
@image{./latexusage,,25cm}
-@node Base modules, Options, LaTeX usage, Top
+@node Base modules
@chapter Base modules
@cindex base modules
@@ -6631,11 +6747,11 @@ Here now is @code{latexusage.tex}:
* ode:: Ordinary differential equations
@end menu
-@node plain, simplex, Base modules, Base modules
+@node plain
@section @code{plain}
@cindex @code{plain}
-This is the default @code{Asymptote} base file, which defines key parts of the
+This is the default @code{Asymptote} base file
drawing language (such as the @code{picture} structure).
By default, an implicit @code{private import plain;} occurs before
@@ -6646,21 +6762,21 @@ the types and functions defined in @code{plain} are accessible in
almost all @code{Asymptote} code. Use the @code{-noautoplain} command-line
option to disable this feature.
-@node simplex, math, plain, Base modules
+@node simplex
@section @code{simplex}
@cindex @code{simplex}
-@cindex @code{deferred drawing}
This module solves the general linear programming problem using the
simplex method.
-@node simplex2, math, plain, Base modules
+@node simplex2
@section @code{simplex2}
@cindex @code{simplex2}
@cindex @code{deferred drawing}
This module solves a special case of the two-variable linear programming
-problem used by the module @code{plain} for automatic sizing of pictures.
+problem used by the module @code{plain} for automatic sizing of
+pictures (@pxref{deferred drawing}).
-@node math, interpolate, simplex, Base modules
+@node math
@section @code{math}
@cindex @code{math}
This module extends @code{Asymptote}'s mathematical capabilities with
@@ -6669,7 +6785,7 @@ useful functions such as
@table @code
@cindex @code{drawline}
-@item void drawline(picture pic=currentpicture, pair P, pair Q, pen p=currentpen);
+@item void drawline(picture pic=currentpicture
draw the visible portion of the (infinite) line going through
@code{P} and @code{Q}, without altering the size of picture @code{pic},
using pen @code{p}.
@@ -6749,14 +6865,14 @@ returns the strict lexicographical partial order of @code{a} and @code{b}.
returns the strict lexicographical partial order of @code{a} and @code{b}.
@end table
-@node interpolate, geometry, math, Base modules
+@node interpolate
@section @code{interpolate}
@cindex @code{interpolate}
This module implements Lagrange, Hermite, and standard cubic spline
interpolation in @code{Asymptote}, as illustrated in the example
@code{interpolate1.asy}.
-@node geometry, trembling, interpolate, Base modules
+@node geometry
@section @code{geometry}
@cindex @code{geometry}
@cindex @code{triangle}
@@ -6772,14 +6888,14 @@ including an extensive set of examples,
@url{https://web.archive.org/web/20201130113133/http://www.piprime.fr/files/asymptote/geometry/modules/geometry.asy.index.type.html}
@end quotation
-@node trembling, stats, geometry, Base modules
+@node trembling
@section @code{trembling}
@cindex @code{trembling}
This module, written by Philippe Ivaldi and illustrated in the example
@code{@uref{https://asymptote.sourceforge.io/gallery/floatingdisk.svg,,floatingdisk}@uref{https://asymptote.sourceforge.io/gallery/floatingdisk.asy,,.asy}}, allows one to draw wavy lines, as if drawn by
hand.
-@node stats, patterns, trembling, Base modules
+@node stats
@section @code{stats}
@cindex @code{stats}
@cindex @code{leastsquares}
@@ -6787,13 +6903,13 @@ This module implements a Gaussian random number generator
and a collection of statistics routines, including @code{histogram}
and @code{leastsquares}.
-@node patterns, markers, stats, Base modules
+@node patterns
@section @code{patterns}
@cindex @code{patterns}
This module implements @code{PostScript} tiling patterns and includes
several convenient pattern generation routines.
-@node markers, map, patterns, Base modules
+@node markers
@section @code{markers}
@cindex @code{markers}
This module implements specialized routines for marking paths and angles.
@@ -6856,18 +6972,16 @@ as illustrated in the example @code{@uref{https://asymptote.sourceforge.io/galle
@sp 1
@center @image{./markers2}
-@node map, tree, markers, Base modules
+@node map
@section @code{map}
@cindex @code{map}
This module creates a struct parameterized by the types specified in
strings @code{key} and @code{value}, mapping keys to values with a
specified default:
@verbatim
-import map;
+from map(Key=string, Value=int) access map;
-mapTemplate(name="map",key="string",value="int",default="-1");
-
-map M;
+map M=map(Default=-1);
M.add("z",2);
M.add("a",3);
@@ -6876,12 +6990,12 @@ write(M.lookup("a"));
write(M.lookup("y"));
@end verbatim
-@node tree, binarytree, map, Base modules
+@node tree
@section @code{tree}
@cindex @code{tree}
This module implements an example of a dynamic binary search tree.
-@node binarytree, drawtree, tree, Base modules
+@node binarytree
@section @code{binarytree}
@cindex @code{binarytree}
This module can be used to draw an arbitrary binary tree and includes an
@@ -6891,32 +7005,32 @@ illustrated in the example @code{@uref{https://asymptote.sourceforge.io/gallery/
@sp 1
@center @image{./binarytreetest}
-@node drawtree, syzygy, binarytree, Base modules
+@node drawtree
@section @code{drawtree}
@cindex @code{drawtree}
This is a simple tree drawing module used by the example @code{@uref{https://asymptote.sourceforge.io/gallery/treetest.svg,,treetest}@uref{https://asymptote.sourceforge.io/gallery/treetest.asy,,.asy}}.
-@node syzygy, feynman, drawtree, Base modules
+@node syzygy
@section @code{syzygy}
@cindex @code{syzygy}
This module automates the drawing of braids, relations, and syzygies,
along with the corresponding equations, as illustrated in the example
@code{@uref{https://asymptote.sourceforge.io/gallery/knots.svg,,knots}@uref{https://asymptote.sourceforge.io/gallery/knots.asy,,.asy}}.
-@node feynman, roundedpath, syzygy, Base modules
+@node feynman
@section @code{feynman}
@cindex @code{feynman}
This module, contributed by Martin Wiebusch, is useful for drawing
Feynman diagrams, as illustrated by the examples @code{@uref{https://asymptote.sourceforge.io/gallery/eetomumu.svg,,eetomumu}@uref{https://asymptote.sourceforge.io/gallery/eetomumu.asy,,.asy}}
and @code{@uref{https://asymptote.sourceforge.io/gallery/fermi.svg,,fermi}@uref{https://asymptote.sourceforge.io/gallery/fermi.asy,,.asy}}.
-@node roundedpath, animation, feynman, Base modules
+@node roundedpath
@section @code{roundedpath}
@cindex @code{roundedpath}
This module, contributed by Stefan Knorr, is useful for rounding the
sharp corners of paths, as illustrated in the example file @code{@uref{https://asymptote.sourceforge.io/gallery/roundpath.svg,,roundpath}@uref{https://asymptote.sourceforge.io/gallery/roundpath.asy,,.asy}}.
-@node animation, embed, roundedpath, Base modules
+@node animation
@section @code{animation}
@cindex @code{animation}
@cindex @code{magick}
@@ -6961,7 +7075,7 @@ as described here:
@url{http://mirror.ctan.org/macros/latex/contrib/animate/doc/animate.pdf}
@end quotation
-@node embed, slide, animation, Base modules
+@node embed
@section @code{embed}
@cindex @code{embed}
This module provides an interface to the @code{LaTeX} package
@@ -6990,7 +7104,7 @@ For a higher quality embedded movie generated directly by
An example of embedding @code{U3D} code is provided in the file
@code{embeddedu3d}.
-@node slide, MetaPost, embed, Base modules
+@node slide
@section @code{slide}
@cindex @code{slide}
This module provides a simple yet high-quality facility for making
@@ -6998,7 +7112,7 @@ presentation slides, including portable embedded @acronym{PDF} animations (see
the file @code{@uref{https://asymptote.sourceforge.io/gallery/animations/slidemovies.pdf,,slidemovies}@uref{https://asymptote.sourceforge.io/gallery/animations/slidemovies.asy,,.asy}}). A simple example is provided in
@code{slidedemo.asy}.
-@node MetaPost, babel, slide, Base modules
+@node MetaPost
@section @code{MetaPost}
@cindex @code{MetaPost}
This module provides some useful routines to help @code{MetaPost} users
@@ -7016,7 +7130,7 @@ intersection point of the lines through @code{P}, @code{Q} and
@code{p}, @code{q}. For less common occurrences of @code{whatever}, one
can use the built-in explicit linear equation solver @code{solve} instead.
-@node babel, labelpath, MetaPost, Base modules
+@node babel
@section @code{babel}
@cindex @code{babel}
This module implements the @code{LaTeX} @code{babel} package in
@@ -7026,7 +7140,7 @@ import babel;
babel("german");
@end verbatim
-@node labelpath, labelpath3, babel, Base modules
+@node labelpath
@section @code{labelpath}
@cindex @code{labelpath}
This module uses the @code{PSTricks} @code{pstextpath} macro to fit labels
@@ -7045,14 +7159,14 @@ All other Label transforms are ignored. This module requires the
@code{latex} tex engine and inherits the limitations of the
@code{PSTricks} @code{\pstextpath} macro.
-@node labelpath3, annotate, labelpath, Base modules
+@node labelpath3
@section @code{labelpath3}
@cindex @code{labelpath3}
This module, contributed by Jens Schwaiger, implements a 3D version of
@code{labelpath} that does not require the @code{PSTricks} package.
An example is provided in @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/curvedlabel3.html,,curvedlabel3}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/curvedlabel3.asy,,.asy}}.
-@node annotate, CAD, labelpath3, Base modules
+@node annotate
@section @code{annotate}
@cindex @code{annotate}
This module supports @acronym{PDF} annotations for viewing with
@@ -7066,7 +7180,7 @@ Annotations are illustrated in the example file @code{@uref{https://asymptote.so
Currently, annotations are only implemented for the @code{latex}
(default) and @code{tex} @TeX{} engines.
-@node CAD, graph, annotate, Base modules
+@node CAD
@section @code{CAD}
@cindex @code{CAD}
This module, contributed by Mark Henning, provides basic pen
@@ -7074,7 +7188,7 @@ definitions and measurement functions for simple 2D CAD drawings
according to DIN 15. It is documented separately, in the file
@code{CAD.pdf}.
-@node graph, palette, CAD, Base modules
+@node graph
@section @code{graph}
@cindex @code{graph}
@cindex 2D graphs
@@ -7896,7 +8010,7 @@ data in @code{@uref{https://asymptote.sourceforge.io/gallery/2Dgraphs/diatom.csv
@end enumerate
@page
-@node palette, three, graph, Base modules
+@node palette
@section @code{palette}
@anchor{images}
@cindex images
@@ -8070,7 +8184,7 @@ pen[] palette(real[] f, pen[] palette);
pen[][] palette(real[][] f, pen[] palette);
@end verbatim
-@node three, obj, palette, Base modules
+@node three
@section @code{three}
@cindex @code{three}
@cindex @code{guide3}
@@ -8087,7 +8201,7 @@ dimensions except that triples @code{(x,y,z)} are used in place of pairs
generalization of John Hobby's spline algorithm is shape-invariant under
three-dimensional rotation, scaling, and shifting, and reduces in the
planar case to the two-dimensional algorithm used in @code{Asymptote},
-@code{MetaPost}, and @code{MetaFont} [cf.@ J. C. Bowman, Proceedings in
+@code{MetaPost}, and @code{MetaFont} [see J. C. Bowman, Proceedings in
Applied Mathematics and Mechanics, 7:1, 2010021-2010022 (2007)].
For example, a unit circle in the @math{XY} plane may be filled and
@@ -8204,6 +8318,21 @@ other formats. One can request a completely transparent background for
3D @code{WebGL} images with
@code{currentlight.background=black+opacity(0.0);}
+@code{render}
+
+A function @code{render()} may be assigned to the optional
+@code{render} parameter allows one to pass specialized rendering
+options to the surface drawing routines, via arguments such as:
+@verbatim
+ bool tessellate; // use tessellated mesh to store straight patches
+ real margin; // shrink amount for rendered OpenGL viewport, in bp.
+ bool partnames; // assign part name indices to compound objects
+ bool defaultnames; // assign default names to unnamed objects
+ interaction interaction; // billboard interaction mode
+@end verbatim
+along with the rendering parameters for the legacy @acronym{PRC} format
+described in @code{three.asy}.
+
@cindex image-based lighting
@cindex @code{surface}
@cindex @code{ibl}
@@ -8235,7 +8364,7 @@ The examples @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/vertex
vertex-dependent colors, which are supported by
@code{Asymptote}'s native @code{OpenGL}/@code{WebGL} renderers
and the two-dimensional vector output format (@code{settings.render=0}). Since
-the @acronym{PRC} output format does not currently support vertex
+the legacy @acronym{PRC} output format does not support vertex
shading of Bezier surfaces, @acronym{PRC} patches are shaded with the mean of the four vertex colors.
@cindex @code{surface}
@@ -8449,7 +8578,7 @@ with the setting @code{iconify=true}.
@cindex @code{prc}
@cindex @code{views}
-@item Embed the 3D @acronym{PRC} format in a @acronym{PDF} file
+@item Embed the 3D legacy @acronym{PRC} format in a @acronym{PDF} file
and view the resulting @acronym{PDF} file with
version @code{9.0} or later of @code{Adobe Reader}.
This requires @code{settings.outformat="pdf"} and @code{settings.prc=true},
@@ -8510,7 +8639,7 @@ this approach (@pxref{PostScript3D}).
@end enumerate
-@cindex @code{double deferred drawing}
+@cindex double deferred drawing
Automatic picture sizing in three dimensions is accomplished with double
deferred drawing. The maximal desired dimensions of the scene in each of
the three dimensions can optionally be specified with the routine
@@ -8644,7 +8773,7 @@ positive @math{y} axis is drawn at this angle in degrees.
@cindex @code{target}
@cindex @code{showtarget}
@cindex @code{center}
-@item orthographic(triple camera, triple up=Z, triple target=O, @*@ @ @ @ @ @ @ @ @ @ @ @ @ real zoom=1, pair viewportshift=0, bool showtarget=true, @*@ @ @ @ @ @ @ @ @ @ @ @ @ bool center=false)
+@item orthographic(triple camera, triple up=Z, triple target=O, @*@ @ @ @ @ @ @ @ @ @ @ @ @ real zoom=1, pair viewportshift=0, bool showtarget=true, @*@ @ @ @ @ @ @ @ @ @ @ @ @ bool center=true)
This projects from three to two dimensions using the view as seen at a point
infinitely far away in the direction @code{unit(camera)}, orienting the camera
so that, if possible, the vector @code{up} points upwards. Parallel
@@ -8653,7 +8782,7 @@ to include @code{target} if @code{showtarget=true}.
If @code{center=true}, the target will be adjusted to the center of the
bounding volume.
-@item orthographic(real x, real y, real z, triple up=Z, triple target=O, @*@ @ @ @ @ @ @ @ @ @ @ @ @ real zoom=1, pair viewportshift=0, bool showtarget=true, @*@ @ @ @ @ @ @ @ @ @ @ @ @ bool center=false)
+@item orthographic(real x, real y, real z, triple up=Z, triple target=O, @*@ @ @ @ @ @ @ @ @ @ @ @ @ real zoom=1, pair viewportshift=0, bool showtarget=true, @*@ @ @ @ @ @ @ @ @ @ @ @ @ bool center=true)
This is equivalent to
@verbatim
orthographic((x,y,z),up,target,zoom,viewportshift,showtarget,center)
@@ -8671,7 +8800,6 @@ at angle @code{beta}, and the @math{z} axis up.
@cindex @code{autoadjust}
@item perspective(triple camera, triple up=Z, triple target=O, @*@ @ @ @ @ @ @ @ @ @ @ @ real zoom=1, real angle=0, pair viewportshift=0, @*@ @ @ @ @ @ @ @ @ @ @ @ bool showtarget=true, bool autoadjust=true, @*@ @ @ @ @ @ @ @ @ @ @ @ bool center=autoadjust)
@cindex @code{perspective}
-@cindex @code{NURBS}
This projects from three to two dimensions, taking account of
perspective, as seen from the location @code{camera} looking at @code{target},
orienting the camera so that, if possible, the vector @code{up} points upwards.
@@ -9088,14 +9216,14 @@ intersecting planes:
@sp 1
@center @image{./planes}
-@node obj, graph3, three, Base modules
+@node obj
@section @code{obj}
@cindex @code{obj}
This module allows one to construct surfaces from simple obj files,
as illustrated in the example files @code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/galleon.html,,galleon}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/galleon.asy,,.asy}} and
@code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/triceratops.html,,triceratops}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/triceratops.asy,,.asy}}.
-@node graph3, grid3, obj, Base modules
+@node graph3
@section @code{graph3}
@cindex @code{graph3}
@cindex 3D graphs
@@ -9108,7 +9236,9 @@ To draw an @math{x} axis in three dimensions, use the routine
@verbatim
void xaxis3(picture pic=currentpicture, Label L="", axis axis=YZZero,
real xmin=-infinity, real xmax=infinity, pen p=currentpen,
- ticks3 ticks=NoTicks3, arrowbar3 arrow=None, bool above=false);
+ ticks3 ticks=NoTicks3, arrowbar3 arrow=None,
+ margin3 margin=NoMargin3, bool above=false,
+ projection P=currentprojection);
@end verbatim
@noindent
Analogous routines @code{yaxis} and @code{zaxis} can be used to draw
@@ -9120,7 +9250,8 @@ void axes3(picture pic=currentpicture,
bool extend=false,
triple min=(-infinity,-infinity,-infinity),
triple max=(infinity,infinity,infinity),
- pen p=currentpen, arrowbar3 arrow=None);
+ pen p=currentpen, arrowbar3 arrow=None,
+ margin3 margin=NoMargin3, projection P=currentprojection);
@end verbatim
@cindex @code{YZEquals}
@@ -9252,7 +9383,7 @@ picture vectorfield(path3 vector(pair v), triple f(pair z), pair a, pair b,
as illustrated in the examples @code{@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/vectorfield3.html,,vectorfield3}@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/vectorfield3.asy,,.asy}} and
@code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/vectorfieldsphere.html,,vectorfieldsphere}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/vectorfieldsphere.asy,,.asy}}.
-@node grid3, solids, graph3, Base modules
+@node grid3
@section @code{grid3}
@cindex @code{grid3}
@cindex 3D grids
@@ -9264,7 +9395,7 @@ This module, contributed by Philippe Ivaldi, can be used for drawing
@sp 1
@center @image{./grid3xyz}
-@node solids, tube, grid3, Base modules
+@node solids
@section @code{solids}
@cindex @code{solids}
This solid geometry module defines a structure @code{revolution} that
@@ -9293,7 +9424,7 @@ struct skeleton {
}
@end verbatim
-@node tube, flowchart, solids, Base modules
+@node tube
@section @code{tube}
@cindex @code{tube}
This module extends the @code{tube} surfaces constructed in
@@ -9354,7 +9485,7 @@ An example of @code{tube} is provided in the file
@code{@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/trefoilknot.html,,trefoilknot}@uref{https://asymptote.sourceforge.io/gallery/3Dwebgl/trefoilknot.asy,,.asy}}. Further examples can be found at
@url{https://web.archive.org/web/20201130113133/http://www.piprime.fr/files/asymptote/tube}.
-@node flowchart, contour, tube, Base modules
+@node flowchart
@section @code{flowchart}
@cindex @code{flowchart}
This module provides routines for drawing flowcharts. The primary
@@ -9489,7 +9620,7 @@ Here is a simple flowchart example (see also the example
@sp 1
@center @image{./flowchartdemo}
-@node contour, contour3, flowchart, Base modules
+@node contour
@section @code{contour}
@cindex @code{contour}
This module draws contour lines.
@@ -9588,14 +9719,14 @@ density images over such irregular triangular meshes.
algorithm based on the public-domain exact arithmetic predicates written by
Jonathan Shewchuk.
-@node contour3, smoothcontour3, contour, Base modules
+@node contour3
@section @code{contour3}
@cindex @code{contour3}
This module draws surfaces described as the null space of real-valued
functions of @math{(x,y,z)} or @code{real[][][]} matrices.
Its usage is illustrated in the example file @code{@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/magnetic.html,,magnetic}@uref{https://asymptote.sourceforge.io/gallery/3Dgraphs/magnetic.asy,,.asy}}.
-@node smoothcontour3, slopefield, contour3, Base modules
+@node smoothcontour3
@section @code{smoothcontour3}
@cindex @code{smoothcontour3}
This module, written by Charles Staats, draws implicitly defined surfaces
@@ -9633,7 +9764,7 @@ Additional examples, together with a more in-depth explanation of
the module's usage and pitfalls, are available at
@url{https://github.com/charlesstaats/smoothcontour3}.
-@node slopefield, ode, smoothcontour3, Base modules
+@node slopefield
@section @code{slopefield}
@cindex @code{slopefield}
To draw a slope field for the differential equation @math{dy/dx=f(x,y)} (or
@@ -9672,14 +9803,14 @@ Both @code{slopefield} and @code{curve} alternatively accept a function
@sp 1
@center @image{./slopefield1}
-@node ode, , slopefield, Base modules
+@node ode
@section @code{ode}
@cindex @code{ode}
The @code{ode} module, illustrated in the example @code{@uref{https://raw.githubusercontent.com/vectorgraphics/asymptote/HEAD/examples/odetest.asy,,odetest.asy}},
implements a number of explicit numerical integration schemes for
ordinary differential equations.
-@node Options, Interactive mode, Base modules, Top
+@node Options
@chapter Command-line options
@cindex options
@cindex command-line options
@@ -9877,7 +10008,7 @@ Also output knot guide solver diagnostics.
Also output @code{Asymptote} traceback diagnostics.
@end table
-@node Interactive mode, GUI, Options, Top
+@node Interactive mode
@chapter Interactive mode
@cindex interactive mode
Interactive mode is entered by executing the command @code{asy} with
@@ -9982,7 +10113,7 @@ g.clip("unitcircle")
g.label("\"$O$\", (0,0), SW")
@end verbatim
-@node GUI, Command-Line Interface, Interactive mode, Top
+@node GUI
@chapter Graphical User Interface
@cindex graphical user interface
@cindex @acronym{GUI}
@@ -10002,7 +10133,7 @@ preliminary Graphical User Interface (@acronym{GUI}) @code{xasy} included with
@code{Asymptote} allows you to move graphical objects and draw new ones.
The modified figure can then be saved as a normal @code{Asymptote} file.
-@node GUI installation, GUI usage, GUI, GUI
+@node GUI installation
@section GUI installation
@cindex GUI installation
@@ -10024,13 +10155,17 @@ and the @code{librsvg} package on @code{MacOS X}; under
@url{https://sourceforge.net/projects/tumagcc/files/rsvg-convert-2.40.20.7z}
+Ensure that @code{rsvg-convert} is available in @code{PATH}, or
+specify the location of @code{rsvg-convert} in @code{rsvgConverterPath}
+option within @code{xasy}'s settings.
+
@cindex @code{dvisvgmMultipleFiles}
Deconstruction of a picture into its components is fastest when using
the @code{LaTeX} TeX engine. The default setting
@code{dvisvgmMultipleFiles=true} speeds up deconstruction
under @acronym{PDF} TeX engines.
-@node GUI usage, , GUI installation, GUI
+@node GUI usage
@section GUI usage
@cindex GUI usage
@cindex arrow keys
@@ -10055,13 +10190,13 @@ together on adding them to a picture. However, the elements of a frame
added to another frame are not grouped together by default: their
elements will be individually deconstructed (@pxref{add}).
-@node Command-Line Interface, PostScript to Asymptote, GUI, Top
+@node Command-Line Interface
@chapter Command-Line Interface
@cindex command-line interface
@code{Asymptote} code may be sent to the
@url{http://asymptote.ualberta.ca} server directly from the command
-line, specifying any options directly in the @acronym{URL}:
+line
@itemize @bullet
@@ -10098,7 +10233,7 @@ line, specifying any options directly in the @acronym{URL}:
The source code for the command-line interface is available at
@url{https://github.com/vectorgraphics/asymptote-http-server}.
-@node Language server protocol, PostScript to Asymptote, Command-Line Interface, Top
+@node Language server protocol
@chapter Language server protocol
@cindex @acronym{LSP}
@cindex language server protocol
@@ -10150,7 +10285,7 @@ M-x lsp
@end itemize
-@node PostScript to Asymptote, Help, Command-Line Interface, Top
+@node PostScript to Asymptote
@chapter @code{PostScript} to @code{Asymptote}
@cindex @code{pstoedit}
The excellent @code{PostScript} editor @code{pstoedit} (version 3.50 or later;
@@ -10172,7 +10307,7 @@ If the line widths aren't quite correct, try giving @code{pstoedit} the
If the fonts aren't typeset correctly, try giving @code{pstoedit} the
@code{-dt} option.
-@node Help, Debugger, PostScript to Asymptote, Top
+@node Help
@chapter Help
@cindex help
@cindex forum
@@ -10232,7 +10367,7 @@ from true segmentation faults (due to internal C++ programming errors;
please submit the @code{Asymptote} code that generates such segmentation
faults along with your bug report).
-@node Debugger, Credits, Help, Top
+@node Debugger
@chapter Debugger
@cindex debugger
Asymptote now includes a line-based (as opposed to code-based)
@@ -10329,7 +10464,7 @@ The debugging prompt may be entered manually with the call
void breakpoint(code s=quote{});
@end verbatim
-@node Credits, Index, Debugger, Top
+@node Credits
@chapter Acknowledgments
@cindex acknowledgments
@@ -10355,7 +10490,7 @@ developed the @code{Asymptote Web Application} hosted at
@url{https://github.com/vectorgraphics/asymptoteWebApplication}
-@node Index, , Credits, Top
+@node Index
@unnumbered Index
@printindex cp
@@ -10480,7 +10615,7 @@ developed the @code{Asymptote Web Application} hosted at
@c LocalWords: NoZero NoZeroFormat abbrevation gsOptions namespace redeclared
@c LocalWords: atLeast intMin globalwrite quarticroots deconsruct substrings
@c LocalWords: usleep currentpatterns trailingzero Orest Shardt DefaultHead
-@c LocalWords: SimpleHead HookHead TeXHead multipage NURBS inlinemovie dxmax
+@c LocalWords: SimpleHead HookHead TeXHead multipage inlinemovie dxmax
@c LocalWords: simpson NoBox truesize autoscale shadestroke recurses mintimes
@c LocalWords: nonoverlapping texengine maxtimes maxheight pdb TEXMFCONFIG Jn
@c LocalWords: piecewisestraight unitrand graphmarkers antialias nolight newl
@@ -10588,7 +10723,7 @@ developed the @code{Asymptote Web Application} hosted at
@c LocalWords: Ai Ai Ai 5a 5E 5cm 2N 2E devicepixelratio 48kB 2n 5z
@c LocalWords: 100d 5y 5unit 144x144 2004-23 2004-24 top-level 3D
@c LocalWords: 1filll Command-line Command-Line command-line 2D 15
-@c LocalWords: high-order User-defined Python-style Templated V3D
+@c LocalWords: higher-order User-defined Python-style Templated V3D
@c LocalWords: coordinate-based high-quality high-level de-facto 56
@c LocalWords: command-driven graphical-user-interface full-fledged
@c LocalWords: script-generated script-based fixed-sized ASYMPTOTE_
@@ -10643,13 +10778,22 @@ developed the @code{Asymptote Web Application} hosted at
@c LocalWords: O--1 5unit three_arrows diamond-shaped right-angled
@c LocalWords: 2-y public-domain in-depth field-defining 144x144 'e
@c LocalWords: ASYMPTOTE_CONFIG non-writable 200 semi-colon ctrl-C
-@c LocalWords: asy_history auto-completion Button-1 Button-2 LSP
+@c LocalWords: asy_history auto-completion Button-1 Button-2 LSP 's
@c LocalWords: rsvg-convert librsvg2-tools dvisvgmMultipleFiles lsp
@c LocalWords: data-binary 'import lsp-mode 'package melpa 'asyls
@c LocalWords: 'package-archives package-initialize package-install
@c LocalWords: package-refresh-contents 'lsp-mode make-lsp-client
@c LocalWords: 'lsp-language-id-configuration lsp-register-client
-@c LocalWords: new-connection lsp-stdio-connection activation-fn
+@c LocalWords: new-connection lsp-stdio-connection activation-fn 3D
@c LocalWords: lsp-activate-on major-modes server-id user-generated
-@c LocalWords: line-based code-based plain_debugger Guib Skitsko
-@c LocalWords: Chaumont Cheng
+@c LocalWords: line-based code-based plain_debugger Guib Skitsko 2D
+@c LocalWords: Chaumont Cheng using 0pt 1filll Witholding simplex2
+@c LocalWords: magick 'load 'asy 'lasy 'auto 5bp 1cm 3mm 4g abcdefg
+@c LocalWords: 2S 100pt 3t multipath nondegenerate 12pt 5mm 25cm 3x
+@c LocalWords: 5cm 5pt 3cm 2pt addPoint 10cm trueMin trueMax addBox
+@c LocalWords: userMin userMax 5x 3y 602e 2x 2y 3sin 204e 10x 1e9
+@c LocalWords: 5a 5E partnames defaultnames 2N 2E 48kB 2n 100d 5z
+@c LocalWords: includemedia noplaybutton 200pt Javascript 5y 5unit
+@c LocalWords: 144x144 rsvgConverterPath 'import MSWindows 'package
+@c LocalWords: 'lsp fn 'asyls 'e
+
diff --git a/graphics/asymptote/doc/axis3.asy b/graphics/asymptote/doc/axis3.asy
index 90cbdc6ad0..c7c90ae79d 100644
--- a/graphics/asymptote/doc/axis3.asy
+++ b/graphics/asymptote/doc/axis3.asy
@@ -3,7 +3,7 @@ import graph3;
size(0,200);
size3(200,IgnoreAspect);
-currentprojection=perspective(5,2,2);
+currentprojection=perspective(dir(75,20));
scale(Linear,Linear,Log);
diff --git a/graphics/asymptote/doc/build-asy-1-file.py b/graphics/asymptote/doc/build-asy-1-file.py
new file mode 100644
index 0000000000..771e94a019
--- /dev/null
+++ b/graphics/asymptote/doc/build-asy-1-file.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python3
+import io
+import re
+from argparse import ArgumentParser
+
+
+def parse_args():
+ parser = ArgumentParser()
+ parser.add_argument("--options-file", type=str, required=True)
+ parser.add_argument("--asy-1-begin-file", type=str, required=True)
+ parser.add_argument("--asy-1-end-file", type=str, required=True)
+ parser.add_argument("--out-file", type=str, required=True)
+ return parser.parse_args()
+
+
+def main():
+ args = parse_args()
+ with open(args.options_file, "r", encoding="utf-8") as optfile:
+ options = [
+ line.strip() for line in optfile.readlines() if line.strip().startswith("-")
+ ]
+
+ args_description_extract_regex = re.compile(r"-(.*?) {2}\s*([a-zA-Z0-9].*)")
+ arg_matches = [args_description_extract_regex.match(line) for line in options]
+ escaped_args_with_descs = [
+ (match.group(1).replace("-", r"\-"), match.group(2))
+ for match in arg_matches
+ if match is not None
+ ]
+ transformed_args = [
+ rf""".TP
+.B \-{arg}
+{desc}."""
+ for arg, desc in escaped_args_with_descs
+ ]
+
+ output = None
+ try:
+ output = io.StringIO()
+ with open(args.asy_1_begin_file, "r", encoding="utf-8") as f:
+ output.write(f.read())
+
+ output.write("\n".join(transformed_args))
+
+ with open(args.asy_1_end_file, "r", encoding="utf-8") as f:
+ output.write(f.read())
+
+ with open(args.out_file, "w", encoding="utf-8") as out_file:
+ out_file.write(output.getvalue())
+ finally:
+ if output is not None:
+ output.close()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/graphics/asymptote/doc/build-asymptote-pdf-win.py b/graphics/asymptote/doc/build-asymptote-pdf-win.py
new file mode 100644
index 0000000000..63a7089716
--- /dev/null
+++ b/graphics/asymptote/doc/build-asymptote-pdf-win.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+import argparse
+import os
+import subprocess
+
+
+def parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--texify-loc", required=True)
+ parser.add_argument("--texindex-loc", required=True)
+ parser.add_argument("--texi-file", required=True)
+ return parser.parse_args()
+
+
+def main():
+ args = parse_args()
+ env = os.environ.copy()
+ env["TEXINDEX"] = args.texindex_loc
+ subprocess.run(
+ [args.texify_loc, "--pdf", args.texi_file],
+ env=env,
+ check=True,
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/graphics/asymptote/doc/build-latexusage-pdf.py b/graphics/asymptote/doc/build-latexusage-pdf.py
new file mode 100644
index 0000000000..6d5e6b02ee
--- /dev/null
+++ b/graphics/asymptote/doc/build-latexusage-pdf.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+
+import argparse
+import contextlib
+import os
+import pathlib
+import shutil
+import subprocess as sp
+import sys
+
+
+def parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--build-dir", type=str, default=".")
+ parser.add_argument("--latexusage-name", type=str, default="latexusage")
+ parser.add_argument("--latexusage-source-dir", type=str, required=True)
+ parser.add_argument("--pdflatex-executable", type=str, default="pdflatex")
+ parser.add_argument("--asy-executable", type=str, default="asy")
+ parser.add_argument("--asy-base-dir", type=str, required=True)
+ return parser.parse_args()
+
+
+def print_called_process_error(e: sp.CalledProcessError):
+ if e.stderr is not None:
+ sys.stderr.write("Process stderr:\n")
+ sys.stderr.write(e.stderr)
+
+ if e.stdout is not None:
+ sys.stderr.write("Process output:\n")
+ sys.stderr.write(e.stdout)
+ sys.stderr.flush()
+
+
+def clean_artifacts(buildroot_path: pathlib.Path, latexusage_file_prefix: str):
+ if (buildroot_path / (latexusage_file_prefix + ".tex")).is_file():
+ os.remove((buildroot_path / (latexusage_file_prefix + ".tex")))
+ for asyartifacts in buildroot_path.glob("latexusage-*"):
+ os.remove(asyartifacts)
+ for exts in ["pre", "aux", "out"]:
+ with contextlib.suppress(FileNotFoundError):
+ os.remove(buildroot_path / (latexusage_file_prefix + "." + exts))
+
+
+def run_pdflatex(
+ pdflatex_exec: str, buildroot_path: pathlib.Path, latexusage_name: str
+):
+ sp.run(
+ [pdflatex_exec, latexusage_name + ".tex"],
+ text=True,
+ cwd=buildroot_path,
+ check=True,
+ )
+
+
+def main():
+ args = parse_args()
+ buildroot_path = pathlib.Path(args.build_dir)
+ clean_artifacts(buildroot_path, args.latexusage_name)
+
+ # copy latexusage.pdf to build root, since TeX Live has some issues with
+ # out of source builds
+
+ shutil.copy2(
+ pathlib.Path(args.latexusage_source_dir) / (args.latexusage_name + ".tex"),
+ buildroot_path / (args.latexusage_name + ".tex"),
+ )
+
+ asy_base_dir = pathlib.Path(args.asy_base_dir)
+ asy_base_args = [
+ args.asy_executable,
+ "-dir",
+ str(asy_base_dir),
+ "-noprc",
+ "-config",
+ '""',
+ "-render=0",
+ "-noV",
+ ]
+
+ try:
+ # first pdflatex run
+ run_pdflatex(args.pdflatex_executable, buildroot_path, args.latexusage_name)
+ # asy run
+ for asyfile in buildroot_path.glob("latexusage-*.asy"):
+ sp.run(
+ asy_base_args + [str(asyfile.name)],
+ check=True,
+ text=True,
+ cwd=str(buildroot_path),
+ )
+
+ # second pdflatex run
+ run_pdflatex(args.pdflatex_executable, buildroot_path, args.latexusage_name)
+ except sp.CalledProcessError as e:
+ print_called_process_error(e)
+ raise
+ finally:
+ # clean up any latexusage-* files
+ clean_artifacts(buildroot_path, args.latexusage_name)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/graphics/asymptote/doc/extra/intro.asy b/graphics/asymptote/doc/extra/intro.asy
index 8fe021e0ec..bb23c87f16 100644
--- a/graphics/asymptote/doc/extra/intro.asy
+++ b/graphics/asymptote/doc/extra/intro.asy
@@ -1,7 +1,7 @@
-orientation=Landscape;
-
settings.tex="pdflatex";
+orientation=Landscape;
+
import slide;
import three;
import animate;
@@ -10,14 +10,15 @@ bool long=true;
usepackage("mflogo");
-usersetting();
-
viewportsize=pagewidth-2pagemargin;
-// To generate bibliographic references:
+usersetting();
+
+// Commands to generate optional bibtex citations:
// asy -k intro
-// bibtex intro_
+// bibtex intro_
// asy -k intro
+
bibliographystyle("alpha");
itempen=fontsize(22pt);
@@ -30,7 +31,7 @@ titlepage(long ? "Asymptote: The Vector Graphics Language" :
"Department of Mathematical and Statistical Sciences\\
University of Alberta\\
%and Instituto Nacional de Matem\'atica Pura e Aplicada (IMPA)
-\medskip\Green{Collaborators: Orest Shardt, Michail Vidiassov}",
+\smallskip\Green{Collaborators: Orest Shardt, Michail Vidiassov}",
"June 30, 2010",
"https://asymptote.sourceforge.io/intro.pdf");
@@ -196,6 +197,7 @@ draw(g--cycle,dashed);
add(output, currentpicture.fit(), (+0.5inch, 0), E);
restore();
+erase(); // Suppress implicit shipout of currentpicture.
shipout(output);
"));
@@ -350,7 +352,7 @@ item("The resulting shape may be adjusted by modifying optional {\it tension\/}
title("Hobby's 2D Control Point Algorithm");
item("Having prescribed outgoing and incoming path directions $e^{i\theta}$
at node~$z_0$ and $e^{i\phi}$ at node $z_1$ relative to the
-vector $z_1-z_0$, the control points are determined as:");
+vector $z_1-z_0$, the control points are determined as:");
equations("u&=&z_0+e^{i\theta}(z_1-z_0)f(\theta,-\phi),\nonumber\\
v&=&z_1-e^{i\phi}(z_1-z_0)f(-\phi,\theta),");
@@ -390,7 +392,7 @@ item("Must reduce to 2D algorithm in planar case.");
item("Determine directions by applying Hobby's algorithm in the plane containing $z_{k-1}$, $z_k$, $z_{k+1}$.");
// Reformulate Hobby's equations in terms of the angle $\psi_k=$
-item("The only ambiguity that can arise is the overall sign of the angles, which relates to viewing each 2D plane from opposing normal directions.");
+item("The only ambiguity that can arise is the overall sign of the angles, which relates to viewing each 2D plane from opposing normal directions.");
item("A reference vector based on the mean unit normal of successive segments can be used to resolve such ambiguities \cite{Bowman07,Bowman09}");
@@ -436,65 +438,15 @@ title("Smooth 3D surfaces");
asyinclude("../examples/sinc",25cm);
title("Curved 3D Arrows");
-asyinclude("../examples/arrows3",20cm);
+asyinclude("../examples/arrows3",16cm);
title("Slide Presentations");
item("Asymptote has a module for preparing slides.");
-item("It even supports embedded high-resolution PDF movies.");
code('
title("Slide Presentations");
item("Asymptote has a module for preparing slides.");
-item("It even supports embedded high-resolution PDF movies.");
');
-remark("\quad\ldots");
-
-import graph;
-
-pen p=linewidth(1);
-pen dotpen=linewidth(5);
-
-pair wheelpoint(real t) {return (t+cos(t),-sin(t));}
-
-guide wheel(guide g=nullpath, real a, real b, int n)
-{
- real width=(b-a)/n;
- for(int i=0; i <= n; ++i) {
- real t=a+width*i;
- g=g--wheelpoint(t);
- }
- return g;
-}
-
-real t1=0;
-real t2=t1+2*pi;
-
-picture base;
-draw(base,circle((0,0),1),p);
-draw(base,wheel(t1,t2,100),p+linetype("0 2"));
-yequals(base,Label("$y=-1$",1.0),-1,extend=true,p+linetype("4 4"));
-xaxis(base,Label("$x$",align=3SW),0,p);
-yaxis(base,"$y$",0,1.3,p);
-pair z1=wheelpoint(t1);
-pair z2=wheelpoint(t2);
-dot(base,z1,dotpen);
-dot(base,z2,dotpen);
-
-animation a;
-
-int n=25;
-real dt=(t2-t1)/n;
-for(int i=0; i <= n; ++i) {
- picture pic;
- size(pic,24cm);
- real t=t1+dt*i;
- add(pic,base);
- draw(pic,circle((t,0),1),p+red);
- dot(pic,wheelpoint(t),dotpen);
- a.add(pic);
-}
-
-display(a.pdf(delay=150,"controls"));
title("Automatic Sizing");
item("Figures can be specified in user coordinates, then
@@ -584,6 +536,7 @@ pen p=fontsize(30pt);
frame f;
label(f, \"$E=mc^2$\", p);
draw(f, box(min(f),max(f)));
+erase(); // Suppress implicit shipout of currentpicture.
shipout(f);
"));
@@ -681,7 +634,7 @@ item("Rest arguments allow one to write a function that takes an arbitrary
number of arguments:");
code("
int sum(... int[] nums) {
- int total=0;
+ int total=0;
for(int i=0; i < nums.length; ++i)
total += nums[i];
return total;
diff --git a/graphics/asymptote/doc/fillcontour.asy b/graphics/asymptote/doc/fillcontour.asy
index b92b65ef46..aeca5635db 100644
--- a/graphics/asymptote/doc/fillcontour.asy
+++ b/graphics/asymptote/doc/fillcontour.asy
@@ -21,9 +21,6 @@ pen[] Palette=quantize(BWRainbow(),n);
bounds range=image(f,Automatic,a,b,3N,Palette,n);
-real[] Cvals=uniform(range.min,range.max,Divs);
-draw(contour(f,a,b,Cvals,N,operator --),Tickpen+squarecap+beveljoin);
-
// Major contours
real[] Cvals=uniform(range.min,range.max,Divs);
draw(contour(f,a,b,Cvals,N,operator --),Tickpen+squarecap+beveljoin);
diff --git a/graphics/asymptote/doc/gen-asy-options-file.py b/graphics/asymptote/doc/gen-asy-options-file.py
new file mode 100644
index 0000000000..1f9c01e158
--- /dev/null
+++ b/graphics/asymptote/doc/gen-asy-options-file.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python3
+import argparse
+import subprocess as sp
+
+
+def parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--asy-executable", type=str, default="asy")
+ parser.add_argument("--output-file", type=str, required=True)
+ return parser.parse_args()
+
+
+def main():
+ args = parse_args()
+ asy_output = sp.run(
+ [args.asy_executable, "-h"],
+ check=True,
+ stderr=sp.STDOUT,
+ stdout=sp.PIPE,
+ text=True,
+ )
+
+ with open(args.output_file, "w", encoding="utf-8") as f:
+ for line in asy_output.stdout.splitlines():
+ stripped_lines = line.strip()
+ if (
+ stripped_lines.startswith("Asymptote")
+ or stripped_lines.startswith("http")
+ or stripped_lines.startswith("Usage:")
+ ):
+ continue
+ f.write(line)
+ f.write("\n")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/graphics/asymptote/doc/png/asymptote.info b/graphics/asymptote/doc/png/asymptote.info
index 672c1369bd..96ba0cec71 100644
--- a/graphics/asymptote/doc/png/asymptote.info
+++ b/graphics/asymptote/doc/png/asymptote.info
@@ -1,11 +1,11 @@
This is asymptote.info, produced by makeinfo version 7.1 from
asymptote.texi.
-This file documents ‘Asymptote’, version 2.90.
+This file documents ‘Asymptote’, version 3.00.
<https://asymptote.sourceforge.io>
- Copyright © 2004-24 Andy Hammerlindl, John Bowman, and Tom Prince.
+ Copyright © 2004-25 Andy Hammerlindl, John Bowman, and Tom Prince.
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Lesser General Public License
@@ -17,16 +17,16 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

-File: asymptote.info, Node: Top, Next: Description, Prev: (dir), Up: (dir)
+File: asymptote.info, Node: Top, Next: Description, Up: (dir)
Asymptote
*********
-This file documents ‘Asymptote’, version 2.90.
+This file documents ‘Asymptote’, version 3.00.
<https://asymptote.sourceforge.io>
- Copyright © 2004-24 Andy Hammerlindl, John Bowman, and Tom Prince.
+ Copyright © 2004-25 Andy Hammerlindl, John Bowman, and Tom Prince.
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Lesser General Public License
@@ -96,7 +96,7 @@ Programming
* Structures:: Organize your data
* Operators:: Arithmetic and logical operators
* Implicit scaling:: Avoiding those ugly *s
-* Functions:: Traditional and high-order functions
+* Functions:: Traditional and higher-order functions
* Arrays:: Dynamic vectors
* Casts:: Implicit and explicit casts
* Import:: Importing external ‘Asymptote’ modules
@@ -184,9 +184,9 @@ drawing. Labels and equations are typeset with ‘LaTeX’, for overall
document consistency, yielding the same high-quality level of
typesetting that ‘LaTeX’ provides for scientific text. By default it
produces ‘PostScript’ output, but it can also generate ‘OpenGL’, ‘PDF’,
-‘SVG’, ‘WebGL’, ‘V3D’, and ‘PRC’ vector graphics, along with any format
-that the ‘ImageMagick’ package can produce. You can even try it out in
-your Web browser without installing it, using the ‘Asymptote Web
+‘SVG’, ‘WebGL’, ‘V3D’, and legacy ‘PRC’ vector graphics, along with any
+format that the ‘ImageMagick’ package can produce. You can even try it
+out in your Web browser without installing it, using the ‘Asymptote Web
Application’
<http://asymptote.ualberta.ca>
@@ -295,7 +295,7 @@ Users may also wish to monitor the ‘Asymptote’ forum:
<https://sourceforge.net/p/asymptote/discussion/409349>

-File: asymptote.info, Node: UNIX binary distributions, Next: MacOS X binary distributions, Prev: Installation, Up: Installation
+File: asymptote.info, Node: UNIX binary distributions, Next: MacOS X binary distributions, Up: Installation
2.1 UNIX binary distributions
=============================
@@ -622,7 +622,7 @@ and putting the generated ‘asymptote.xml’ file in
‘~/.local/share/org.kde.syntax-highlighting/syntax/’.

-File: asymptote.info, Node: Git, Next: Uninstall, Prev: Editing modes, Up: Installation
+File: asymptote.info, Node: Git, Next: Building the documentation, Prev: Editing modes, Up: Installation
2.8 Git
=======
@@ -637,9 +637,8 @@ cd asymptote
make all
make install
-To compile without optimization, use the command ‘make CFLAGS=-g’. On
-‘Ubuntu’ systems, you may need to first install the required
-dependencies:
+To compile without optimization On ‘Ubuntu’ systems, you may need to
+first install the required dependencies:
apt-get build-dep asymptote

@@ -660,12 +659,12 @@ from ‘doc’ folder first.
documentation.

-File: asymptote.info, Node: Uninstall, Prev: Git, Up: Installation
+File: asymptote.info, Node: Uninstall, Prev: Building the documentation, Up: Installation
2.10 Uninstall
==============
-To uninstall a ‘Linux x86_64’ binary distribution, use the commands
+To uninstall a ‘Linux x86_64’ binary distribution
tar -zxvf asymptote-x.xx.x86_64.tgz | xargs --replace=% rm /%
texhash
@@ -699,7 +698,7 @@ rendered by an online Asymptote engine:
<https://www.artofproblemsolving.com/wiki/?title=Asymptote_(Vector_Graphics_Language)>

-File: asymptote.info, Node: Drawing in batch mode, Next: Drawing in interactive mode, Prev: Tutorial, Up: Tutorial
+File: asymptote.info, Node: Drawing in batch mode, Next: Drawing in interactive mode, Up: Tutorial
3.1 Drawing in batch mode
=========================
@@ -929,7 +928,7 @@ currentpicture).
* label:: Label a point on a picture

-File: asymptote.info, Node: draw, Next: fill, Prev: Drawing commands, Up: Drawing commands
+File: asymptote.info, Node: draw, Next: fill, Up: Drawing commands
4.1 draw
========
@@ -1155,9 +1154,9 @@ void gouraudshade(picture pic=currentpicture, path g, bool stroke=false,
In the second form, the elements of ‘z’ are taken to be successive nodes
of path ‘g’. The pens in ‘p’ must belong to the same color space.
Illustrations of Gouraud shading are provided in the example file
-‘Gouraud.asy’. The edge flags used in Gouraud shading are documented
-here:
- <https://www.adobe.com/content/dam/acom/en/devnet/postscript/pdfs/TN5600.SmoothShading.pdf>
+‘Gouraud.asy’. The edge flags used in Gouraud shading are documented on
+pages 270-274 of the PostScript Language Reference (3rd edition):
+ <https://www.adobe.com/jp/print/postscript/pdfs/PLRM.pdf>
Tensor product shading using clipping path ‘g’, fill rule ‘fillrule’
on patches bounded by the n cyclic paths of length 4 in path array ‘b’,
@@ -1419,7 +1418,7 @@ specifying direction, tension, and curl values.
The higher the tension, the straighter the curve is, and the more it
approximates a straight line. One can change the spline tension from
its default value of 1 to any real value greater than or equal to 0.75
-(cf. John D. Hobby, Discrete and Computational Geometry 1, 1986):
+(see John D. Hobby, Discrete and Computational Geometry 1, 1986):
draw((100,0)..tension 2 ..(100,100)..(0,100));
draw((100,0)..tension 3 and 2 ..(100,100)..(0,100));
draw((100,0)..tension atleast 2 ..(100,100)..(0,100));
@@ -1469,11 +1468,12 @@ File: asymptote.info, Node: Programming, Next: LaTeX usage, Prev: Bezier curv
* Structures:: Organize your data
* Operators:: Arithmetic and logical operators
* Implicit scaling:: Avoiding those ugly *s
-* Functions:: Traditional and high-order functions
+* Functions:: Traditional and higher-order functions
* Arrays:: Dynamic vectors
* Casts:: Implicit and explicit casts
* Import:: Importing external ‘Asymptote’ modules
* Static:: Where to allocate your variable?
+* Autounravel:: Adding associated libraries to structures
Here is a short introductory example to the ‘Asymptote’ programming
language that highlights the similarity of its control structures with
@@ -1512,7 +1512,7 @@ In addition, it supports many features beyond the ones found in those
languages.

-File: asymptote.info, Node: Data types, Next: Paths and guides, Prev: Programming, Up: Programming
+File: asymptote.info, Node: Data types, Next: Paths and guides, Up: Programming
6.1 Data types
==============
@@ -1896,8 +1896,15 @@ user-defined types):
‘void beep()’
produces a beep on the console;
- As in C/C++, complicated types may be abbreviated with ‘typedef’ (see
-the example in *note Functions::).
+ As in C/C++, complicated types may be abbreviated with ‘typedef’ or
+‘using’. For instance, the line
+using multipath = path[];
+ will make ‘multipath’ a type equivalent ‘path[]’, as will the
+equivalent line
+typedef path[] multipath;
+ For the most part such type aliasing is a convenience. However, it
+is required when declaring a function whose return type is a function
+(see the example in *note Functions::).

File: asymptote.info, Node: Paths and guides, Next: Pens, Prev: Data types, Up: Programming
@@ -2638,8 +2645,8 @@ with one or more color components equal to 1.
"Compatible","Normal","Multiply","Screen","Overlay","SoftLight",
"HardLight","ColorDodge","ColorBurn","Darken","Lighten","Difference",
"Exclusion","Hue","Saturation","Color","Luminosity",
- as described in
- <https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf>.
+ as described in Tables 136 and 137 of
+ <https://opensource.adobe.com/dc-acrobat-sdk-docs/standards/pdfstandards/pdf/PDF32000_2008.pdf>.
Since ‘PostScript’ does not support transparency, this feature is
only effective with the ‘-f pdf’ output format option; other
formats can be produced from the resulting PDF file with the
@@ -2828,14 +2835,13 @@ File: asymptote.info, Node: Frames and pictures, Next: Deferred drawing, Prev
‘frame’
Frames are canvases for drawing in ‘PostScript’ coordinates. While
working with frames directly is occasionally necessary for
- constructing deferred drawing routines, pictures are usually more
- convenient to work with. The implicit initializer for frames is
- ‘newframe’. The function ‘bool empty(frame f)’ returns ‘true’ only
- if the frame ‘f’ is empty. A frame may be erased with the
- ‘erase(frame)’ routine. The functions ‘pair min(frame)’ and ‘pair
- max(frame)’ return the (left,bottom) and (right,top) coordinates of
- the frame bounding box, respectively. The contents of frame ‘src’
- may be appended to frame ‘dest’ with the command
+ constructing deferred drawing routines The implicit initializer for
+ frames is ‘newframe’. The function ‘bool empty(frame f)’ returns
+ ‘true’ only if the frame ‘f’ is empty. A frame may be erased with
+ the ‘erase(frame)’ routine. The functions ‘pair min(frame)’ and
+ ‘pair max(frame)’ return the (left,bottom) and (right,top)
+ coordinates of the frame bounding box, respectively. The contents
+ of frame ‘src’ may be appended to frame ‘dest’ with the command
void add(frame dest, frame src);
or prepended with
void prepend(frame dest, frame src);
@@ -2909,11 +2915,12 @@ File: asymptote.info, Node: Frames and pictures, Next: Deferred drawing, Prev
‘defaultfilename’ is an empty string, the prefix ‘outprefix()’ will
be used.
- A ‘shipout()’ command is added implicitly at file exit. The
- default page orientation is ‘Portrait’; this may be modified by
- changing the variable ‘orientation’. To output in landscape mode,
- simply set the variable ‘orientation=Landscape’ or issue the
- command
+ A ‘shipout()’ command is added implicitly at file exit. Explicit
+ ‘shipout()’ commands to the same file as the final implicit shipout
+ are ignored. The default page orientation is ‘Portrait’; this may
+ be modified by changing the variable ‘orientation’. To output in
+ landscape mode, simply set the variable ‘orientation=Landscape’ or
+ issue the command
shipout(Landscape);
To rotate the page by -90 degrees, use the orientation ‘Seascape’.
@@ -3221,7 +3228,7 @@ value) files and portable XDR (External Data Representation) binary
files.
An input file can be opened with
-input(string name="", bool check=true, string comment="#", string mode="");
+input(string name=""
reading is then done by assignment:
file fin=input("test.txt");
real a=fin;
@@ -3287,7 +3294,7 @@ newline and flush), ‘DOSnewl’ (terminate with a DOS newline), ‘tab’
some simple examples of data output:
file fout=output("test.txt");
write(fout,1); // Writes "1"
-write(fout); // Writes a new line
+write(fout, endl); // Writes a new line
write(fout,"List: ",1,2,3); // Writes "List: 1 2 3"
A file may be opened with ‘mode="xdr"’, to read or write double
@@ -3382,8 +3389,8 @@ File: asymptote.info, Node: Variable initializers, Next: Structures, Prev: Fi
6.8 Variable initializers
=========================
-A variable can be assigned a value when it is declared, as in ‘int x=3;’
-where the variable ‘x’ is assigned the value ‘3’. As well as literal
+A variable can be assigned a value when it is declared ‘int x=3;’ where
+the variable ‘x’ is assigned the value ‘3’. As well as literal
constants such as ‘3’, arbitary expressions can be used as initializers,
as in ‘real x=2*sin(pi/2);’.
@@ -3622,7 +3629,7 @@ File: asymptote.info, Node: Operators, Next: Implicit scaling, Prev: Structur
* User-defined operators:: Overloading operators

-File: asymptote.info, Node: Arithmetic & logical, Next: Self & prefix operators, Prev: Operators, Up: Operators
+File: asymptote.info, Node: Arithmetic & logical, Next: Self & prefix operators, Up: Operators
6.10.1 Arithmetic & logical operators
-------------------------------------
@@ -3754,6 +3761,8 @@ guide operator ..(... guide[] g) {
guide g=(0,0){up}..{SW}(100,100){NE}..{curl 3}(50,50)..(10,10);
write("g=",g);
+ *Note Autounravel::, for an example overloading the ‘+’ operator.
+

File: asymptote.info, Node: Implicit scaling, Next: Functions, Prev: Operators, Up: Programming
@@ -3837,14 +3846,17 @@ reference, simply enclose it in a structure (*note Structures::).
int c();
c=a; // Valid: only one possible assignment.
- 4. Anonymous (so-called "high-order") functions are also allowed:
- typedef int intop(int);
+ 4. "Higher-order" functions, in other words functions that return
+ functions, are allowed. The return type must be given a
+ signature-free alias with ‘using’ or ‘typedef’:
+ using intop = int(int);
+ // typedef int intop(int); // Equivalent to previous line
intop adder(int m)
{
return new int(int n) {return m+n;};
}
intop addby7=adder(7);
- write(addby7(1)); // Writes 8.
+ write(addby7(1)); // Writes 8.
5. One may redefine a function ‘f’, even for calls to ‘f’ in
previously declared functions, by assigning another (anonymous or
@@ -3897,7 +3909,7 @@ segmentation fault, unless a fully working version of the GNU library
‘libsigsegv’ (e.g. 2.4 or later) is installed at configuration time).

-File: asymptote.info, Node: Default arguments, Next: Named arguments, Prev: Functions, Up: Functions
+File: asymptote.info, Node: Default arguments, Next: Named arguments, Up: Functions
6.12.1 Default arguments
------------------------
@@ -4104,7 +4116,8 @@ its real argument as an integer (-1, 0, or 1).
(equivalent to ‘fabs(real)’), an ‘abs(pair)’ function (equivalent to
‘length(pair)’).
- Random numbers can be seeded with ‘srand(int)’ and generated with the
+ Random numbers can be seeded with ‘srand(int)’ (for example, with
+‘srand(round((cputime().parent.clock%1)*1e9))’) and generated with the
‘int rand()’ function, which returns a random integer between 0 and the
integer ‘randMax’. The ‘unitrand()’ function returns a random number
uniformly distributed in the interval [0,1]. A Gaussian random number
@@ -4356,13 +4369,13 @@ of type ‘T[]’.
‘int search(T[] a, T key)’
For built-in ordered types ‘T’, searches a sorted array ‘a’ of ‘n’
- elements for k, returning the index ‘i’ if ‘a[i] <= key < a[i+1]’,
- ‘-1’ if ‘key’ is less than all elements of ‘a’, or ‘n-1’ if ‘key’
- is greater than or equal to the last element of ‘a’;
+ elements for ‘key’, returning the index ‘i’ if ‘a[i] <= key <
+ a[i+1]’, ‘-1’ if ‘key’ is less than all elements of ‘a’, or ‘n-1’
+ if ‘key’ is greater than or equal to the last element of ‘a’;
‘int search(T[] a, T key, bool less(T i, T j))’
- searches an array ‘a’ sorted in ascending order such that element
- ‘i’ precedes element ‘j’ if ‘less(i,j)’ is true;
+ searches an array ‘a’ for ‘key’ sorted in ascending order such that
+ element ‘i’ precedes element ‘j’ if ‘less(i,j)’ is true;
‘T[] copy(T[] a)’
returns a deep copy of the array ‘a’;
@@ -4606,7 +4619,7 @@ output with the functions ‘write(file,T[])’, ‘write(file,T[][])’,
‘write(file,T[][][])’, respectively.

-File: asymptote.info, Node: Slices, Prev: Arrays, Up: Arrays
+File: asymptote.info, Node: Slices, Up: Arrays
6.13.1 Slices
-------------
@@ -4913,10 +4926,10 @@ File: asymptote.info, Node: Templated imports, Up: Import
*Warning:* This feature is experimental: it has known issues and its
behavior may change in the future.
- In Asymptote, it is possible to create modules that must have one or
-more types specified when they are imported. The first executable line
-of any such module must be of the form ‘typedef import(<types>)’, where
-‘<types>’ is a list of required type parameters. For instance,
+ In Asymptote types are specified when they are imported. The first
+executable line of any such module must be of the form ‘typedef
+import(<types>)’, where ‘<types>’ is a list of required type parameters.
+For instance,
typedef import(T, S, Number);
could be the first line of a module that requires three type parameters.
The remaining code in the module can then use ‘T’, ‘S’, and ‘Number’ as
@@ -4948,7 +4961,7 @@ be available for type arguments that are builtin or defined in module
‘plain’.

-File: asymptote.info, Node: Static, Prev: Import, Up: Programming
+File: asymptote.info, Node: Static, Next: Autounravel, Prev: Import, Up: Programming
6.16 Static
===========
@@ -5059,6 +5072,98 @@ that variable, and not to the type. This is regardless of what fields
the variable actually possesses.

+File: asymptote.info, Node: Autounravel, Prev: Static, Up: Programming
+
+6.17 Autounravel
+================
+
+The ‘autounravel’ modifier can be used to automatically unravel a field.
+This is useful when building an associated library of functions that
+operate on a structure. For instance, consider a simple implementation
+of the ‘rational’ structure defined in ‘rational.asy’:
+
+struct rational {
+ int p=0, q=1;
+ void operator init(int p, int q) {
+ this.p=p;
+ this.q=q;
+ }
+}
+rational operator +(rational a, rational b) {
+ return rational(a.p*b.q+b.p*a.q, a.q*b.q);
+}
+
+ To allow ‘rational’ to be used as a type parameter for a templated
+import that adds instances of ‘rational’, we should move ‘operator +’
+into the body of the ‘rational’ structure and add the ‘autounravel’
+modifier:
+
+struct rational {
+ int p=0, q=1;
+ void operator init(int p, int q) {
+ this.p=p;
+ this.q=q;
+ }
+ autounravel rational operator +(rational a, rational b) {
+ return rational(a.p*b.q+b.p*a.q, a.q*b.q);
+ }
+}
+
+ This is almost equivalent to the previous code, but now the ‘+’
+operator will be accessible wherever the ‘rational’ structure is.
+
+ *Currently, types cannot be autounraveled.* Users who encounter a
+case where this might be useful can submit a feature request at
+<https://github.com/vectorgraphics/asymptote/issues>.
+
+* Menu:
+
+* When fields are autounraveled::
+* Where autounravel is legal::
+
+
+File: asymptote.info, Node: When fields are autounraveled, Next: Where autounravel is legal, Up: Autounravel
+
+6.17.1 When fields are autounraveled
+------------------------------------
+
+If a ‘struct’ contains fields (including functions) that are declared
+with ‘autounravel’, these fields will be unraveled from the ‘struct’ at:
+
+ • the end of the ‘struct’ definition;
+ • a ‘typedef import’ statement, if the ‘struct’ is the argument for
+ one of the type parameters;
+ • an ‘unravel’ or ‘access’ statement that unravels the ‘struct’ from
+ a module or outer ‘struct’ (for instance, ‘from rational access
+ rational;’ would make the ‘+’ operator available from the ‘struct’
+ ‘rational’ defined in ‘rational.asy’);
+
+ • A ‘typedef’ statement like ‘typedef rational.rational rat;’ that
+ renames a ‘struct’.
+
+
+File: asymptote.info, Node: Where autounravel is legal, Prev: When fields are autounraveled, Up: Autounravel
+
+6.17.2 Where ‘autounravel’ is legal
+-----------------------------------
+
+The ‘autounravel’ modifier implies ‘static’ and can be used in many of
+the same places as ‘static’. However, specifying ‘autounravel’ at the
+top level of a module (i.e., outside of any structure or function) is an
+error, whereas ‘static’ gives only a warning. (1) In front of a
+‘struct’ definition or ‘typedef’ statement, ‘autounravel’ is forbidden
+because types cannot be autounraveled. While ‘static static’ results in
+an error, ‘static autounravel’ and ‘autounravel static’ are both legal
+and have exactly the same effect as ‘autounravel’ alone.
+
+ ---------- Footnotes ----------
+
+ (1) If top-level ‘autounravel’ were allowed, a user might incorrectly
+assume that the field would be unraveled whenever the module is
+‘access’ed. The ‘static’ modifier is allowed at the top level because,
+while it does nothing, it does not mislead the user.
+
+
File: asymptote.info, Node: LaTeX usage, Next: Base modules, Prev: Programming, Up: Top
7 ‘LaTeX’ usage
@@ -5300,13 +5405,13 @@ File: asymptote.info, Node: Base modules, Next: Options, Prev: LaTeX usage,
* ode:: Ordinary differential equations

-File: asymptote.info, Node: plain, Next: simplex, Prev: Base modules, Up: Base modules
+File: asymptote.info, Node: plain, Next: simplex, Up: Base modules
8.1 ‘plain’
===========
-This is the default ‘Asymptote’ base file, which defines key parts of
-the drawing language (such as the ‘picture’ structure).
+This is the default ‘Asymptote’ base file drawing language (such as the
+‘picture’ structure).
By default, an implicit ‘private import plain;’ occurs before
translating a file and before the first command given in interactive
@@ -5317,7 +5422,7 @@ and functions defined in ‘plain’ are accessible in almost all
this feature.

-File: asymptote.info, Node: simplex, Next: math, Prev: plain, Up: Base modules
+File: asymptote.info, Node: simplex, Next: simplex2, Prev: plain, Up: Base modules
8.2 ‘simplex’
=============
@@ -5326,16 +5431,17 @@ This module solves the general linear programming problem using the
simplex method.

-File: asymptote.info, Node: simplex2, Next: math, Prev: plain, Up: Base modules
+File: asymptote.info, Node: simplex2, Next: math, Prev: simplex, Up: Base modules
8.3 ‘simplex2’
==============
This module solves a special case of the two-variable linear programming
-problem used by the module ‘plain’ for automatic sizing of pictures.
+problem used by the module ‘plain’ for automatic sizing of pictures
+(*note deferred drawing::).

-File: asymptote.info, Node: math, Next: interpolate, Prev: simplex, Up: Base modules
+File: asymptote.info, Node: math, Next: interpolate, Prev: simplex2, Up: Base modules
8.4 ‘math’
==========
@@ -5343,7 +5449,7 @@ File: asymptote.info, Node: math, Next: interpolate, Prev: simplex, Up: Base
This module extends ‘Asymptote’'s mathematical capabilities with useful
functions such as
-‘void drawline(picture pic=currentpicture, pair P, pair Q, pen p=currentpen);’
+‘void drawline(picture pic=currentpicture’
draw the visible portion of the (infinite) line going through ‘P’
and ‘Q’, without altering the size of picture ‘pic’, using pen ‘p’.
@@ -5511,11 +5617,9 @@ File: asymptote.info, Node: map, Next: tree, Prev: markers, Up: Base modules
This module creates a struct parameterized by the types specified in
strings ‘key’ and ‘value’, mapping keys to values with a specified
default:
-import map;
-
-mapTemplate(name="map",key="string",value="int",default="-1");
+from map(Key=string, Value=int) access map;
-map M;
+map M=map(Default=-1);
M.add("z",2);
M.add("a",3);
@@ -7061,7 +7165,7 @@ pairs ‘(x,y)’ for the nodes and direction specifiers. This
generalization of John Hobby's spline algorithm is shape-invariant under
three-dimensional rotation, scaling, and shifting, and reduces in the
planar case to the two-dimensional algorithm used in ‘Asymptote’,
-‘MetaPost’, and ‘MetaFont’ [cf. J. C. Bowman, Proceedings in Applied
+‘MetaPost’, and ‘MetaFont’ [see J. C. Bowman, Proceedings in Applied
Mathematics and Mechanics, 7:1, 2010021-2010022 (2007)].
For example, a unit circle in the XY plane may be filled and drawn
@@ -7151,6 +7255,19 @@ transparent for all other formats. One can request a completely
transparent background for 3D ‘WebGL’ images with
‘currentlight.background=black+opacity(0.0);’
+ ‘render’
+
+ A function ‘render()’ may be assigned to the optional ‘render’
+parameter allows one to pass specialized rendering options to the
+surface drawing routines, via arguments such as:
+ bool tessellate; // use tessellated mesh to store straight patches
+ real margin; // shrink amount for rendered OpenGL viewport, in bp.
+ bool partnames; // assign part name indices to compound objects
+ bool defaultnames; // assign default names to unnamed objects
+ interaction interaction; // billboard interaction mode
+ along with the rendering parameters for the legacy PRC format
+described in ‘three.asy’.
+
Asymptote also supports image-based lighting with the setting
‘settings.ibl=true’. This uses pre-rendered EXR images from the
directory specified by ‘-imageDir’ (which defaults to ‘ibl’) or, for
@@ -7171,7 +7288,7 @@ how to draw a surface with patch-dependent colors. The examples
‘vertexshading.asy’ and ‘smoothelevation.asy’ illustrate
vertex-dependent colors, which are supported by ‘Asymptote’'s native
‘OpenGL’/‘WebGL’ renderers and the two-dimensional vector output format
-(‘settings.render=0’). Since the PRC output format does not currently
+(‘settings.render=0’). Since the legacy PRC output format does not
support vertex shading of Bezier surfaces, PRC patches are shaded with
the mean of the four vertex colors.
@@ -7326,18 +7443,18 @@ There are six choices for viewing 3D ‘Asymptote’ output:
batch mode (‘-noV’) rendering in an iconified window; this can be
enabled with the setting ‘iconify=true’.
- 4. Embed the 3D PRC format in a PDF file and view the resulting PDF
- file with version ‘9.0’ or later of ‘Adobe Reader’. This requires
- ‘settings.outformat="pdf"’ and ‘settings.prc=true’, which can be
- specified by the command-line options ‘-f pdf’ and ‘-f prc’, put in
- the ‘Asymptote’ configuration file (*note configuration file::), or
- specified in the script before module ‘three’ (or ‘graph3’) is
- imported. The ‘media9’ LaTeX package is also required (*note
- embed::). The example ‘100d.asy’ illustrates how one can generate
- a list of predefined views (see ‘100d.views’). A stationary
- preview image with a resolution of ‘n’ pixels per ‘bp’ can be
- embedded with the setting ‘render=n’; this allows the file to be
- viewed with other ‘PDF’ viewers. Alternatively, the file
+ 4. Embed the 3D legacy PRC format in a PDF file and view the resulting
+ PDF file with version ‘9.0’ or later of ‘Adobe Reader’. This
+ requires ‘settings.outformat="pdf"’ and ‘settings.prc=true’, which
+ can be specified by the command-line options ‘-f pdf’ and ‘-f prc’,
+ put in the ‘Asymptote’ configuration file (*note configuration
+ file::), or specified in the script before module ‘three’ (or
+ ‘graph3’) is imported. The ‘media9’ LaTeX package is also required
+ (*note embed::). The example ‘100d.asy’ illustrates how one can
+ generate a list of predefined views (see ‘100d.views’). A
+ stationary preview image with a resolution of ‘n’ pixels per ‘bp’
+ can be embedded with the setting ‘render=n’; this allows the file
+ to be viewed with other ‘PDF’ viewers. Alternatively, the file
‘externalprc.tex’ illustrates how the resulting PRC and rendered
image files can be extracted and processed in a separate ‘LaTeX’
file. However, see *note LaTeX usage:: for an easier way to embed
@@ -7454,7 +7571,7 @@ These projections to two dimensions are predefined:
‘orthographic(triple camera, triple up=Z, triple target=O,
real zoom=1, pair viewportshift=0, bool showtarget=true,
- bool center=false)’
+ bool center=true)’
This projects from three to two dimensions using the view as seen
at a point infinitely far away in the direction ‘unit(camera)’,
orienting the camera so that, if possible, the vector ‘up’ points
@@ -7465,7 +7582,7 @@ These projections to two dimensions are predefined:
‘orthographic(real x, real y, real z, triple up=Z, triple target=O,
real zoom=1, pair viewportshift=0, bool showtarget=true,
- bool center=false)’
+ bool center=true)’
This is equivalent to
orthographic((x,y,z),up,target,zoom,viewportshift,showtarget,center)
@@ -7776,7 +7893,9 @@ This module implements three-dimensional versions of the functions in
‘graph.asy’. To draw an x axis in three dimensions, use the routine
void xaxis3(picture pic=currentpicture, Label L="", axis axis=YZZero,
real xmin=-infinity, real xmax=infinity, pen p=currentpen,
- ticks3 ticks=NoTicks3, arrowbar3 arrow=None, bool above=false);
+ ticks3 ticks=NoTicks3, arrowbar3 arrow=None,
+ margin3 margin=NoMargin3, bool above=false,
+ projection P=currentprojection);
Analogous routines ‘yaxis’ and ‘zaxis’ can be used to draw y and z axes
in three dimensions. There is also a routine for drawing all three
axis:
@@ -7785,7 +7904,8 @@ void axes3(picture pic=currentpicture,
bool extend=false,
triple min=(-infinity,-infinity,-infinity),
triple max=(infinity,infinity,infinity),
- pen p=currentpen, arrowbar3 arrow=None);
+ pen p=currentpen, arrowbar3 arrow=None,
+ margin3 margin=NoMargin3, projection P=currentprojection);
The predefined three-dimensional axis types are
axis YZEquals(real y, real z, triple align=O, bool extend=false);
@@ -7838,7 +7958,7 @@ import graph3;
size(0,200);
size3(200,IgnoreAspect);
-currentprojection=perspective(5,2,2);
+currentprojection=perspective(dir(75,20));
scale(Linear,Linear,Log);
@@ -8275,9 +8395,6 @@ pen[] Palette=quantize(BWRainbow(),n);
bounds range=image(f,Automatic,a,b,3N,Palette,n);
-real[] Cvals=uniform(range.min,range.max,Divs);
-draw(contour(f,a,b,Cvals,N,operator --),Tickpen+squarecap+beveljoin);
-
// Major contours
real[] Cvals=uniform(range.min,range.max,Divs);
draw(contour(f,a,b,Cvals,N,operator --),Tickpen+squarecap+beveljoin);
@@ -8531,7 +8648,7 @@ Options (negate boolean options by replacing - with -no):
-compact Conserve memory at the expense of speed false
-compress Compress images in PDF output [true]
-convertOptions str []
--d,-debug Enable debugging messages [false]
+-d,-debug Enable debugging messages and traceback false
-devicepixelratio n Ratio of physical to logical pixels [1]
-digits n Default output file precision [7]
-divisor n Garbage collect using purge(divisor=n) [2]
@@ -8627,7 +8744,7 @@ Options (negate boolean options by replacing - with -no):
-webgl2 Use webgl2 if available [false]
-where Show where listed variables are declared [false]
-wsl Run asy under the Windows Subsystem for Linux [false]
--xasy Interactive mode for xasy [false]
+-xasy Interactive mode for xasy false
-zoomPinchCap limit WebGL maximum zoom pinch [100]
-zoomPinchFactor n WebGL zoom pinch sensitivity [10]
-zoomfactor factor Zoom step factor [1.05]
@@ -8853,7 +8970,7 @@ preliminary Graphical User Interface (GUI) ‘xasy’ included with
modified figure can then be saved as a normal ‘Asymptote’ file.

-File: asymptote.info, Node: GUI installation, Next: GUI usage, Prev: GUI, Up: GUI
+File: asymptote.info, Node: GUI installation, Next: GUI usage, Up: GUI
11.1 GUI installation
=====================
@@ -8872,6 +8989,10 @@ available as
<https://sourceforge.net/projects/tumagcc/files/rsvg-convert-2.40.20.7z>
+ Ensure that ‘rsvg-convert’ is available in ‘PATH’, or specify the
+location of ‘rsvg-convert’ in ‘rsvgConverterPath’ option within ‘xasy’'s
+settings.
+
Deconstruction of a picture into its components is fastest when using
the ‘LaTeX’ TeX engine. The default setting ‘dvisvgmMultipleFiles=true’
speeds up deconstruction under PDF TeX engines.
@@ -8901,14 +9022,13 @@ added to another frame are not grouped together by default: their
elements will be individually deconstructed (*note add::).

-File: asymptote.info, Node: Command-Line Interface, Next: PostScript to Asymptote, Prev: GUI, Up: Top
+File: asymptote.info, Node: Command-Line Interface, Next: Language server protocol, Prev: GUI, Up: Top
12 Command-Line Interface
*************************
‘Asymptote’ code may be sent to the <http://asymptote.ualberta.ca>
-server directly from the command line, specifying any options directly
-in the URL:
+server directly from the command line
• SVG output:
@@ -8991,7 +9111,7 @@ installing ‘lsp-mode’ using the following procedure:
M-x lsp

-File: asymptote.info, Node: PostScript to Asymptote, Next: Help, Prev: Command-Line Interface, Up: Top
+File: asymptote.info, Node: PostScript to Asymptote, Next: Help, Prev: Language server protocol, Up: Top
14 ‘PostScript’ to ‘Asymptote’
******************************
@@ -9227,7 +9347,7 @@ Index
* 2D graphs: graph. (line 6)
* 3D graphs: graph3. (line 6)
* 3D grids: grid3. (line 6)
-* 3D PostScript: three. (line 665)
+* 3D PostScript: three. (line 678)
* a4: Configuring. (line 63)
* abort: Data types. (line 364)
* abs: Data types. (line 65)
@@ -9237,10 +9357,10 @@ Index
* abs2: Data types. (line 65)
* abs2 <1>: Data types. (line 144)
* absolute: Configuring. (line 38)
-* absolute <1>: three. (line 241)
+* absolute <1>: three. (line 254)
* accel: Paths and guides. (line 126)
* accel <1>: Paths and guides. (line 132)
-* accel <2>: three. (line 566)
+* accel <2>: three. (line 579)
* access: Import. (line 6)
* access <1>: Import. (line 45)
* acknowledgments: Credits. (line 6)
@@ -9254,15 +9374,15 @@ Index
(line 204)
* add <1>: Frames and pictures.
(line 218)
-* add <2>: three. (line 342)
-* addViews: three. (line 459)
+* add <2>: three. (line 355)
+* addViews: three. (line 472)
* adjust: Pens. (line 123)
* Ai: Mathematical functions.
- (line 48)
+ (line 49)
* Ai_deriv: Mathematical functions.
- (line 48)
+ (line 49)
* Airy: Mathematical functions.
- (line 48)
+ (line 49)
* alias: Structures. (line 62)
* alias <1>: Arrays. (line 183)
* Align: label. (line 20)
@@ -9279,28 +9399,28 @@ Index
* animation: animation. (line 6)
* animation <1>: animation. (line 6)
* annotate: annotate. (line 6)
-* antialias: three. (line 261)
+* antialias: three. (line 274)
* antialias <1>: Options. (line 188)
* append: Files. (line 38)
* append <1>: Arrays. (line 39)
* arc: Paths and guides. (line 24)
* Arc: Paths and guides. (line 37)
-* arc <1>: three. (line 353)
+* arc <1>: three. (line 366)
* ArcArrow: draw. (line 30)
-* ArcArrow3: three. (line 632)
+* ArcArrow3: three. (line 645)
* ArcArrows: draw. (line 30)
-* ArcArrows3: three. (line 632)
+* ArcArrows3: three. (line 645)
* arclength: Paths and guides. (line 153)
-* arclength <1>: three. (line 566)
+* arclength <1>: three. (line 579)
* arcpoint: Paths and guides. (line 163)
* arctime: Paths and guides. (line 157)
-* arctime <1>: three. (line 566)
+* arctime <1>: three. (line 579)
* arguments: Default arguments. (line 6)
* arithmetic operators: Arithmetic & logical.
(line 6)
* array: Data types. (line 284)
* array <1>: Arrays. (line 112)
-* array iteration: Programming. (line 53)
+* array iteration: Programming. (line 54)
* arrays: Arrays. (line 6)
* arrow: Drawing commands. (line 34)
* Arrow: draw. (line 26)
@@ -9308,12 +9428,12 @@ Index
* arrow keys: Drawing in interactive mode.
(line 11)
* arrow keys <1>: GUI usage. (line 6)
-* Arrow3: three. (line 632)
+* Arrow3: three. (line 645)
* arrowbar: draw. (line 26)
* arrowhead: draw. (line 50)
* arrows: draw. (line 26)
* Arrows: draw. (line 26)
-* Arrows3: three. (line 632)
+* Arrows3: three. (line 645)
* as: Import. (line 67)
* ascii: Data types. (line 309)
* ascii <1>: Data types. (line 309)
@@ -9324,9 +9444,9 @@ Index
* asinh: Mathematical functions.
(line 6)
* Aspect: Frames and pictures.
- (line 46)
+ (line 45)
* assert: Data types. (line 369)
-* assignment: Programming. (line 27)
+* assignment: Programming. (line 28)
* asy: Data types. (line 359)
* asy <1>: Import. (line 106)
* asy-mode: Editing modes. (line 6)
@@ -9350,26 +9470,27 @@ Index
(line 263)
* attach <1>: LaTeX usage. (line 47)
* attach <2>: graph. (line 407)
-* autoadjust: three. (line 428)
+* autoadjust: three. (line 441)
* autoimport: Options. (line 155)
* automatic scaling: graph. (line 711)
* automatic scaling <1>: graph. (line 711)
+* autounravel: Autounravel. (line 6)
* axialshade: fill. (line 43)
* axis: graph. (line 925)
* axis <1>: graph. (line 1007)
-* axis <2>: graph3. (line 66)
-* axis <3>: graph3. (line 82)
+* axis <2>: graph3. (line 69)
+* axis <3>: graph3. (line 85)
* azimuth: Data types. (line 154)
* babel: babel. (line 6)
* background: three. (line 76)
* background <1>: three. (line 97)
* background color: Frames and pictures.
(line 167)
-* BackView: three. (line 452)
+* BackView: three. (line 465)
* Bar: draw. (line 19)
-* Bar3: three. (line 632)
+* Bar3: three. (line 645)
* Bars: draw. (line 19)
-* Bars3: three. (line 632)
+* Bars3: three. (line 645)
* barsize: draw. (line 19)
* base modules: Base modules. (line 6)
* basealign: Pens. (line 181)
@@ -9378,38 +9499,38 @@ Index
(line 6)
* beep: Data types. (line 382)
* BeginArcArrow: draw. (line 30)
-* BeginArcArrow3: three. (line 632)
+* BeginArcArrow3: three. (line 645)
* BeginArrow: draw. (line 26)
-* BeginArrow3: three. (line 632)
+* BeginArrow3: three. (line 645)
* BeginBar: draw. (line 19)
-* BeginBar3: three. (line 632)
+* BeginBar3: three. (line 645)
* BeginDotMargin: draw. (line 87)
-* BeginDotMargin3: three. (line 648)
+* BeginDotMargin3: three. (line 661)
* BeginMargin: draw. (line 68)
-* BeginMargin3: three. (line 648)
+* BeginMargin3: three. (line 661)
* BeginPenMargin: draw. (line 76)
-* BeginPenMargin2: three. (line 648)
-* BeginPenMargin3: three. (line 648)
+* BeginPenMargin2: three. (line 661)
+* BeginPenMargin3: three. (line 661)
* BeginPoint: label. (line 62)
* Bessel: Mathematical functions.
- (line 48)
+ (line 49)
* bevel: flowchart. (line 72)
* beveljoin: Pens. (line 149)
* Bezier curves: Bezier curves. (line 6)
-* Bezier patch: three. (line 128)
-* Bezier triangle: three. (line 128)
-* bezulate: three. (line 146)
+* Bezier patch: three. (line 141)
+* Bezier triangle: three. (line 141)
+* bezulate: three. (line 159)
* Bi: Mathematical functions.
- (line 48)
+ (line 49)
* Bi_deriv: Mathematical functions.
- (line 48)
-* Billboard: three. (line 536)
+ (line 49)
+* Billboard: three. (line 549)
* binary: Files. (line 80)
* binary format: Files. (line 80)
* binary operators: Arithmetic & logical.
(line 6)
* binarytree: binarytree. (line 6)
-* black stripes: three. (line 261)
+* black stripes: three. (line 274)
* Blank: draw. (line 26)
* block.bottom: flowchart. (line 19)
* block.bottomleft: flowchart. (line 19)
@@ -9428,19 +9549,19 @@ Index
(line 6)
* Bottom: graph. (line 133)
* BottomTop: graph. (line 139)
-* BottomView: three. (line 452)
+* BottomView: three. (line 465)
* bounding box: Frames and pictures.
(line 167)
* bounds: palette. (line 43)
-* Bounds: graph3. (line 21)
+* Bounds: graph3. (line 24)
* box: Frames and pictures.
(line 117)
-* box <1>: three. (line 375)
-* box <2>: three. (line 377)
+* box <1>: three. (line 388)
+* box <2>: three. (line 390)
* bp: Drawing in batch mode.
(line 23)
* brace: Paths and guides. (line 51)
-* break: Programming. (line 49)
+* break: Programming. (line 50)
* breakpoints: Debugger. (line 21)
* brick: Pens. (line 338)
* broken axis: graph. (line 822)
@@ -9452,7 +9573,7 @@ Index
* BWRainbow2: palette. (line 18)
* C string: Data types. (line 217)
* CAD: CAD. (line 6)
-* camera: three. (line 422)
+* camera: three. (line 435)
* casts: Casts. (line 6)
* cbrt: Mathematical functions.
(line 6)
@@ -9460,16 +9581,16 @@ Index
* ceil: Mathematical functions.
(line 26)
* Center: label. (line 67)
-* center: three. (line 405)
+* center: three. (line 418)
* checker: Pens. (line 338)
* Chinese: Pens. (line 297)
* choose: Mathematical functions.
(line 39)
* Ci: Mathematical functions.
- (line 48)
+ (line 49)
* circle: Paths and guides. (line 10)
* Circle: Paths and guides. (line 18)
-* circle <1>: three. (line 349)
+* circle <1>: three. (line 362)
* circle <2>: flowchart. (line 61)
* circlebarframe: markers. (line 18)
* CJK: Pens. (line 297)
@@ -9486,7 +9607,7 @@ Index
* cmyk: Pens. (line 38)
* colatitude: Data types. (line 159)
* color: Pens. (line 23)
-* color <1>: graph3. (line 133)
+* color <1>: graph3. (line 136)
* coloredNodes: tube. (line 25)
* coloredpath: tube. (line 18)
* coloredSegments: tube. (line 25)
@@ -9504,7 +9625,7 @@ Index
(line 6)
* complement: Arrays. (line 149)
* concat: Arrays. (line 179)
-* conditional: Programming. (line 27)
+* conditional: Programming. (line 28)
* conditional <1>: Arithmetic & logical.
(line 61)
* config: Configuring. (line 69)
@@ -9515,7 +9636,7 @@ Index
* conj: Data types. (line 62)
* constructors: Structures. (line 91)
* context: Options. (line 188)
-* continue: Programming. (line 49)
+* continue: Programming. (line 50)
* continue <1>: Debugger. (line 31)
* contour: contour. (line 6)
* contour3: contour3. (line 6)
@@ -9533,7 +9654,7 @@ Index
* cosh: Mathematical functions.
(line 6)
* cputime: Mathematical functions.
- (line 109)
+ (line 110)
* crop: graph. (line 640)
* cropping graphs: graph. (line 640)
* cross: Data types. (line 106)
@@ -9550,7 +9671,7 @@ Index
* curlSpecifier: Paths and guides. (line 409)
* currentlight: three. (line 76)
* currentpen: Pens. (line 6)
-* currentprojection: three. (line 449)
+* currentprojection: three. (line 462)
* curve: slopefield. (line 20)
* custom axis types: graph. (line 142)
* custom mark routine: graph. (line 578)
@@ -9562,7 +9683,7 @@ Index
* cyclic: Paths and guides. (line 85)
* cyclic <1>: Paths and guides. (line 377)
* cyclic <2>: Arrays. (line 39)
-* cyclic <3>: three. (line 566)
+* cyclic <3>: three. (line 579)
* Cyrillic: Pens. (line 291)
* dashdotted: Pens. (line 102)
* dashed: Pens. (line 102)
@@ -9571,12 +9692,12 @@ Index
* Debian: UNIX binary distributions.
(line 19)
* debugger: Debugger. (line 6)
-* declaration: Programming. (line 27)
+* declaration: Programming. (line 28)
* deconstruct: GUI usage. (line 6)
* default arguments: Default arguments. (line 6)
* defaultformat: graph. (line 176)
* DefaultHead: draw. (line 50)
-* DefaultHead3: three. (line 632)
+* DefaultHead3: three. (line 645)
* defaultpen: Pens. (line 49)
* defaultpen <1>: Pens. (line 122)
* defaultpen <2>: Pens. (line 127)
@@ -9585,7 +9706,7 @@ Index
* defaultpen <5>: Pens. (line 416)
* defaultpen <6>: Pens. (line 440)
* defaultrender: three. (line 46)
-* deferred drawing: simplex. (line 6)
+* deferred drawing: Deferred drawing. (line 6)
* deferred drawing <1>: simplex2. (line 6)
* degrees: Data types. (line 78)
* degrees <1>: Mathematical functions.
@@ -9595,7 +9716,7 @@ Index
* delete: Files. (line 154)
* delete <1>: Arrays. (line 39)
* description: Description. (line 6)
-* devicepixelratio: three. (line 184)
+* devicepixelratio: three. (line 197)
* diagonal: Arrays. (line 324)
* diamond: flowchart. (line 54)
* diffuse: three. (line 76)
@@ -9605,13 +9726,13 @@ Index
* dir <1>: Data types. (line 90)
* dir <2>: Data types. (line 181)
* dir <3>: Paths and guides. (line 109)
-* dir <4>: three. (line 566)
+* dir <4>: three. (line 579)
* direction specifier: Bezier curves. (line 6)
* directory: Files. (line 26)
* dirSpecifier: Paths and guides. (line 391)
* dirtime: Paths and guides. (line 166)
* display: Configuring. (line 15)
-* do: Programming. (line 49)
+* do: Programming. (line 50)
* DOSendl: Files. (line 65)
* DOSnewl: Files. (line 65)
* dot: draw. (line 117)
@@ -9620,18 +9741,18 @@ Index
* dot <3>: Arrays. (line 279)
* dot <4>: Arrays. (line 282)
* DotMargin: draw. (line 83)
-* DotMargin3: three. (line 648)
+* DotMargin3: three. (line 661)
* DotMargins: draw. (line 89)
-* DotMargins3: three. (line 648)
+* DotMargins3: three. (line 661)
* dotted: Pens. (line 102)
-* double deferred drawing: three. (line 327)
+* double deferred drawing: three. (line 340)
* double precision: Files. (line 80)
* draw: Drawing commands. (line 34)
* draw <1>: draw. (line 6)
* draw <2>: draw. (line 147)
* Draw: Frames and pictures.
(line 147)
-* draw <3>: three. (line 154)
+* draw <3>: three. (line 167)
* drawer: Deferred drawing. (line 31)
* drawing commands: Drawing commands. (line 6)
* drawline: math. (line 9)
@@ -9640,38 +9761,38 @@ Index
* dvipsOptions: Options. (line 174)
* dvisvgm: Configuring. (line 69)
* dvisvgm <1>: Options. (line 193)
-* dvisvgmMultipleFiles: GUI installation. (line 20)
+* dvisvgmMultipleFiles: GUI installation. (line 24)
* dvisvgmOptions: Options. (line 174)
* E: Labels. (line 18)
* E <1>: Mathematical functions.
- (line 48)
+ (line 49)
* Editing modes: Editing modes. (line 6)
* Ei: Mathematical functions.
- (line 48)
+ (line 49)
* ellipse: Paths and guides. (line 45)
* elliptic functions: Mathematical functions.
- (line 48)
-* else: Programming. (line 27)
+ (line 49)
+* else: Programming. (line 28)
* emacs: Editing modes. (line 6)
* embed: embed. (line 6)
-* Embedded: three. (line 536)
+* Embedded: three. (line 549)
* emissivepen: three. (line 66)
* empty: Frames and pictures.
(line 7)
* EndArcArrow: draw. (line 30)
-* EndArcArrow3: three. (line 632)
+* EndArcArrow3: three. (line 645)
* EndArrow: draw. (line 26)
-* EndArrow3: three. (line 632)
+* EndArrow3: three. (line 645)
* EndBar: draw. (line 19)
-* EndBar3: three. (line 632)
+* EndBar3: three. (line 645)
* EndDotMargin: draw. (line 89)
-* EndDotMargin3: three. (line 648)
+* EndDotMargin3: three. (line 661)
* endl: Files. (line 65)
* EndMargin: draw. (line 69)
-* EndMargin3: three. (line 648)
+* EndMargin3: three. (line 661)
* EndPenMargin: draw. (line 78)
-* EndPenMargin2: three. (line 648)
-* EndPenMargin3: three. (line 648)
+* EndPenMargin2: three. (line 661)
+* EndPenMargin3: three. (line 661)
* EndPoint: label. (line 62)
* envelope: label. (line 111)
* environment variables: Configuring. (line 90)
@@ -9712,17 +9833,17 @@ Index
* expm1: Mathematical functions.
(line 6)
* exponential integral: Mathematical functions.
- (line 48)
+ (line 49)
* extendcap: Pens. (line 139)
* extension: Paths and guides. (line 246)
* extension <1>: MetaPost. (line 10)
* external: embed. (line 11)
-* extrude: three. (line 560)
+* extrude: three. (line 573)
* F: Mathematical functions.
- (line 48)
+ (line 49)
* fabs: Mathematical functions.
(line 6)
-* face: three. (line 672)
+* face: three. (line 685)
* factorial: Mathematical functions.
(line 39)
* Fedora: UNIX binary distributions.
@@ -9751,9 +9872,9 @@ Index
* find <1>: Arrays. (line 158)
* findall: Arrays. (line 163)
* firstcut: Paths and guides. (line 262)
-* fit3: three. (line 340)
+* fit3: three. (line 353)
* fixedscaling: Frames and pictures.
- (line 68)
+ (line 67)
* floor: Mathematical functions.
(line 26)
* flowchart: flowchart. (line 6)
@@ -9767,7 +9888,7 @@ Index
* font encoding: Pens. (line 288)
* fontcommand: Pens. (line 272)
* fontsize: Pens. (line 245)
-* for: Programming. (line 27)
+* for: Programming. (line 28)
* format: Data types. (line 290)
* format <1>: Options. (line 188)
* forum: Help. (line 6)
@@ -9775,8 +9896,8 @@ Index
(line 7)
* freshnel0: three. (line 66)
* from: Import. (line 16)
-* FrontView: three. (line 452)
-* function declarations: Functions. (line 79)
+* FrontView: three. (line 465)
+* function declarations: Functions. (line 82)
* Function shading: fill. (line 100)
* function shading: fill. (line 100)
* functions: Functions. (line 6)
@@ -9797,10 +9918,10 @@ Index
* git: Git. (line 6)
* globalwrite: Files. (line 40)
* globalwrite <1>: Files. (line 154)
-* glOptions: three. (line 261)
+* glOptions: three. (line 274)
* glOptions <1>: Options. (line 174)
* GNU Scientific Library: Mathematical functions.
- (line 48)
+ (line 49)
* gouraudshade: fill. (line 63)
* Gradient: palette. (line 25)
* gradient shading: fill. (line 32)
@@ -9820,7 +9941,7 @@ Index
* GSL: Compiling from UNIX source.
(line 62)
* gsl: Mathematical functions.
- (line 48)
+ (line 49)
* gsOptions: Options. (line 174)
* GUI: GUI. (line 6)
* GUI installation: GUI installation. (line 6)
@@ -9839,16 +9960,16 @@ Index
* hex <1>: Pens. (line 64)
* hexadecimal: Data types. (line 306)
* hexadecimal <1>: Pens. (line 62)
-* hidden surface removal: three. (line 672)
+* hidden surface removal: three. (line 685)
* histogram: Mathematical functions.
(line 39)
* history: Files. (line 147)
* history <1>: Interactive mode. (line 54)
* historylines: Interactive mode. (line 58)
* HookHead: draw. (line 50)
-* HookHead3: three. (line 632)
+* HookHead3: three. (line 645)
* Horizontal: flowchart. (line 77)
-* HTML5: three. (line 233)
+* HTML5: three. (line 246)
* htmlviewer: Configuring. (line 15)
* htmlviewer <1>: Configuring. (line 38)
* htmlviewerOptions: Options. (line 174)
@@ -9856,22 +9977,22 @@ Index
* hypot: Mathematical functions.
(line 6)
* I: Mathematical functions.
- (line 48)
+ (line 49)
* i_scaled: Mathematical functions.
- (line 48)
-* ibl: three. (line 104)
-* iconify: three. (line 261)
+ (line 49)
+* ibl: three. (line 117)
+* iconify: three. (line 274)
* identity: Transforms. (line 24)
* identity <1>: Mathematical functions.
(line 6)
* identity <2>: Arrays. (line 321)
-* identity4: three. (line 504)
-* if: Programming. (line 27)
+* identity4: three. (line 517)
+* if: Programming. (line 28)
* IgnoreAspect: Frames and pictures.
- (line 50)
+ (line 49)
* image: palette. (line 33)
* image <1>: palette. (line 61)
-* image-based lighting: three. (line 104)
+* image-based lighting: three. (line 117)
* ImageMagick: Configuring. (line 69)
* ImageMagick <1>: animation. (line 6)
* ImageMagick <2>: Options. (line 188)
@@ -9881,7 +10002,7 @@ Index
* implicit scaling: Implicit scaling. (line 6)
* implicitsurface: smoothcontour3. (line 16)
* import: Import. (line 45)
-* importv3d: three. (line 318)
+* importv3d: three. (line 331)
* inches: Figure size. (line 18)
* incircle: Data types. (line 120)
* include: Import. (line 131)
@@ -9893,7 +10014,7 @@ Index
* initializers: Variable initializers.
(line 6)
* inline: LaTeX usage. (line 47)
-* InOutTicks: graph3. (line 35)
+* InOutTicks: graph3. (line 38)
* input: Files. (line 10)
* input <1>: Files. (line 12)
* input <2>: Interactive mode. (line 45)
@@ -9904,16 +10025,16 @@ Index
* inside: Paths and guides. (line 294)
* inside <1>: Paths and guides. (line 299)
* inside <2>: Paths and guides. (line 305)
-* insphere: three. (line 595)
+* insphere: three. (line 608)
* inst: Debugger. (line 35)
* installation: Installation. (line 6)
* int: Data types. (line 30)
* integer division: Arithmetic & logical.
(line 20)
* integral: Mathematical functions.
- (line 82)
+ (line 83)
* integrate: Mathematical functions.
- (line 82)
+ (line 83)
* interactive mode: Drawing in interactive mode.
(line 6)
* interactive mode <1>: Interactive mode. (line 6)
@@ -9923,42 +10044,42 @@ Index
* interpolate: interpolate. (line 6)
* intersect: Paths and guides. (line 195)
* intersect <1>: math. (line 13)
-* intersect <2>: three. (line 566)
+* intersect <2>: three. (line 579)
* intersectionpoint: Paths and guides. (line 238)
* intersectionpoint <1>: math. (line 17)
-* intersectionpoint <2>: three. (line 566)
+* intersectionpoint <2>: three. (line 579)
* intersectionpoints: Paths and guides. (line 242)
-* intersectionpoints <1>: three. (line 566)
-* intersectionpoints <2>: three. (line 579)
+* intersectionpoints <1>: three. (line 579)
+* intersectionpoints <2>: three. (line 592)
* intersections: Paths and guides. (line 206)
* intersections <1>: Paths and guides. (line 213)
-* intersections <2>: three. (line 566)
-* intersections <3>: three. (line 572)
-* InTicks: graph3. (line 35)
+* intersections <2>: three. (line 579)
+* intersections <3>: three. (line 585)
+* InTicks: graph3. (line 38)
* intMax: Data types. (line 30)
* intMin: Data types. (line 30)
* inverse: Transforms. (line 16)
* inverse <1>: Arrays. (line 327)
-* invert: three. (line 494)
+* invert: three. (line 507)
* invisible: Pens. (line 43)
* isnan: Data types. (line 35)
* J: Mathematical functions.
(line 6)
* J <1>: Mathematical functions.
- (line 48)
+ (line 49)
* Japanese: Pens. (line 297)
* K: Mathematical functions.
- (line 48)
+ (line 49)
* k_scaled: Mathematical functions.
- (line 48)
+ (line 49)
* Kate: Editing modes. (line 48)
* KDE editor: Editing modes. (line 48)
* keepAspect: Frames and pictures.
- (line 46)
+ (line 45)
* keepAspect <1>: Frames and pictures.
- (line 50)
+ (line 49)
* keepAspect <2>: LaTeX usage. (line 47)
-* keyboard bindings:: three. (line 211)
+* keyboard bindings:: three. (line 224)
* keys: Arrays. (line 39)
* keyword: Named arguments. (line 37)
* keyword-only: Named arguments. (line 37)
@@ -9969,14 +10090,14 @@ Index
* label <1>: label. (line 6)
* Label <1>: label. (line 21)
* Label <2>: graph. (line 331)
-* label <2>: three. (line 530)
+* label <2>: three. (line 543)
* labelmargin: label. (line 6)
* labelpath: labelpath. (line 6)
* labelpath3: labelpath3. (line 6)
* labelx: graph. (line 331)
* labely: graph. (line 331)
* Landscape: Frames and pictures.
- (line 90)
+ (line 91)
* language context: Pens. (line 288)
* language server protocol: Language server protocol.
(line 6)
@@ -9996,26 +10117,26 @@ Index
* LeftSide: label. (line 67)
* LeftTicks: graph. (line 161)
* LeftTicks <1>: graph. (line 234)
-* LeftView: three. (line 452)
+* LeftView: three. (line 465)
* legend: Drawing commands. (line 34)
* legend <1>: draw. (line 99)
* legend <2>: graph. (line 425)
* Legendre: Mathematical functions.
- (line 48)
+ (line 49)
* length: Data types. (line 65)
* length <1>: Data types. (line 144)
* length <2>: Data types. (line 239)
* length <3>: Paths and guides. (line 76)
* length <4>: Paths and guides. (line 374)
* length <5>: Arrays. (line 39)
-* length <6>: three. (line 566)
+* length <6>: three. (line 579)
* letter: Configuring. (line 63)
* lexorder: math. (line 63)
* lexorder <1>: math. (line 66)
* libcurl: Import. (line 94)
* libm routines: Mathematical functions.
(line 6)
-* libsigsegv: Functions. (line 100)
+* libsigsegv: Functions. (line 103)
* libsigsegv <1>: Help. (line 27)
* light: three. (line 76)
* limits: graph. (line 640)
@@ -10045,7 +10166,7 @@ Index
* longdashdotted: Pens. (line 102)
* longdashed: Pens. (line 102)
* longitude: Data types. (line 169)
-* loop: Programming. (line 27)
+* loop: Programming. (line 28)
* LSP: Language server protocol.
(line 6)
* lualatex: Options. (line 188)
@@ -10063,11 +10184,11 @@ Index
* map <1>: Arrays. (line 140)
* map <2>: map. (line 6)
* Margin: draw. (line 69)
-* Margin3: three. (line 648)
-* Margin3 <1>: three. (line 648)
+* Margin3: three. (line 661)
+* Margin3 <1>: three. (line 661)
* Margins: draw. (line 70)
-* margins: three. (line 333)
-* Margins3: three. (line 648)
+* margins: three. (line 346)
+* Margins3: three. (line 661)
* mark: graph. (line 481)
* markangle: markers. (line 35)
* marker: graph. (line 481)
@@ -10084,12 +10205,12 @@ Index
(line 7)
* max <2>: Arrays. (line 230)
* max <3>: Arrays. (line 240)
-* max <4>: three. (line 566)
+* max <4>: three. (line 579)
* maxbound: Data types. (line 134)
* maxbound <1>: Data types. (line 205)
-* maxtile: three. (line 261)
+* maxtile: three. (line 274)
* maxtimes: Paths and guides. (line 233)
-* maxviewport: three. (line 261)
+* maxviewport: three. (line 274)
* metallic: three. (line 66)
* MetaPost: MetaPost. (line 6)
* MetaPost ... : Bezier curves. (line 70)
@@ -10099,9 +10220,9 @@ Index
* MetaPost whatever: MetaPost. (line 10)
* Microsoft Windows: Microsoft Windows. (line 6)
* MidArcArrow: draw. (line 30)
-* MidArcArrow3: three. (line 632)
+* MidArcArrow3: three. (line 645)
* MidArrow: draw. (line 26)
-* MidArrow3: three. (line 632)
+* MidArrow3: three. (line 645)
* MidPoint: label. (line 62)
* midpoint: Paths and guides. (line 180)
* min: Paths and guides. (line 275)
@@ -10109,7 +10230,7 @@ Index
(line 7)
* min <2>: Arrays. (line 225)
* min <3>: Arrays. (line 235)
-* min <4>: three. (line 566)
+* min <4>: three. (line 579)
* minbound: Data types. (line 131)
* minbound <1>: Data types. (line 202)
* minipage: label. (line 125)
@@ -10118,16 +10239,16 @@ Index
* miterlimit: Pens. (line 159)
* mktemp: Files. (line 48)
* mm: Figure size. (line 18)
-* mobile browser: three. (line 233)
+* mobile browser: three. (line 246)
* mode: Files. (line 80)
* mode <1>: Files. (line 93)
* monotonic: graph. (line 36)
* mouse: GUI. (line 6)
-* mouse bindings: three. (line 192)
+* mouse bindings: three. (line 205)
* mouse wheel: GUI usage. (line 6)
* Move: Pens. (line 428)
* MoveQuiet: Pens. (line 434)
-* multisample: three. (line 184)
+* multisample: three. (line 197)
* N: Labels. (line 18)
* name: Files. (line 93)
* named arguments: Named arguments. (line 6)
@@ -10141,9 +10262,9 @@ Index
* newl: Files. (line 65)
* newpage: Drawing commands. (line 27)
* newton: Mathematical functions.
- (line 66)
+ (line 67)
* newton <1>: Mathematical functions.
- (line 73)
+ (line 74)
* next: Debugger. (line 41)
* nobasealign: Pens. (line 181)
* NoFill: Frames and pictures.
@@ -10152,31 +10273,30 @@ Index
* noglobalread <1>: Files. (line 40)
* nolight: three. (line 76)
* NoMargin: draw. (line 67)
-* NoMargin3: three. (line 648)
+* NoMargin3: three. (line 661)
* None: draw. (line 19)
* None <1>: draw. (line 26)
* none: Files. (line 65)
-* normal: three. (line 552)
+* normal: three. (line 565)
* nosafe: Options. (line 209)
* NOT: Arithmetic & logical.
(line 68)
* notaknot: graph. (line 36)
* NoTicks: graph. (line 161)
-* NoTicks3: graph3. (line 35)
+* NoTicks3: graph3. (line 38)
* null: Structures. (line 6)
* nullpen: label. (line 21)
* nullpen <1>: Frames and pictures.
(line 127)
* nullpen <2>: Frames and pictures.
(line 136)
-* NURBS: three. (line 432)
-* O: three. (line 345)
+* O: three. (line 358)
* obj: obj. (line 6)
* object: label. (line 111)
-* oblique: three. (line 388)
-* obliqueX: three. (line 395)
-* obliqueY: three. (line 401)
-* obliqueZ: three. (line 388)
+* oblique: three. (line 401)
+* obliqueX: three. (line 408)
+* obliqueY: three. (line 414)
+* obliqueZ: three. (line 401)
* ode: ode. (line 6)
* offset: Pens. (line 123)
* offset <1>: Options. (line 214)
@@ -10186,7 +10306,7 @@ Index
* opacity: Pens. (line 307)
* opacity <1>: three. (line 66)
* open: Files. (line 12)
-* OpenGL: three. (line 184)
+* OpenGL: three. (line 197)
* operator: User-defined operators.
(line 6)
* operator --: graph. (line 30)
@@ -10203,20 +10323,20 @@ Index
* OR: Arithmetic & logical.
(line 68)
* orient: Data types. (line 108)
-* orient <1>: three. (line 583)
+* orient <1>: three. (line 596)
* orientation: Frames and pictures.
- (line 90)
-* orthographic: three. (line 405)
-* outformat: three. (line 184)
+ (line 91)
+* orthographic: three. (line 418)
+* outformat: three. (line 197)
* outprefix: Frames and pictures.
- (line 78)
+ (line 77)
* output: Files. (line 38)
* output <1>: Options. (line 188)
-* OutTicks: graph3. (line 35)
-* overloading functions: Functions. (line 55)
+* OutTicks: graph3. (line 38)
+* overloading functions: Functions. (line 58)
* overwrite: Pens. (line 413)
* P: Mathematical functions.
- (line 48)
+ (line 49)
* pack: label. (line 109)
* packing: Rest arguments. (line 30)
* pad: Frames and pictures.
@@ -10228,11 +10348,11 @@ Index
* papertype: Configuring. (line 63)
* paperwidth: Configuring. (line 63)
* parallelogram: flowchart. (line 47)
-* parametric surface: graph3. (line 99)
+* parametric surface: graph3. (line 102)
* parametrized curve: graph. (line 640)
* partialsum: math. (line 49)
* partialsum <1>: math. (line 52)
-* patch-dependent colors: three. (line 119)
+* patch-dependent colors: three. (line 132)
* path: Paths. (line 6)
* path <1>: Paths and guides. (line 7)
* path <2>: three. (line 42)
@@ -10251,18 +10371,18 @@ Index
* pdfviewerOptions: Options. (line 174)
* pen: Pens. (line 6)
* PenMargin: draw. (line 78)
-* PenMargin2: three. (line 648)
-* PenMargin3: three. (line 648)
+* PenMargin2: three. (line 661)
+* PenMargin3: three. (line 661)
* PenMargins: draw. (line 79)
-* PenMargins2: three. (line 648)
-* PenMargins3: three. (line 648)
+* PenMargins2: three. (line 661)
+* PenMargins3: three. (line 661)
* periodic: graph. (line 36)
* perl: LaTeX usage. (line 30)
* perpendicular: geometry. (line 6)
-* perspective: three. (line 432)
+* perspective: three. (line 445)
* physically based rendering: three. (line 74)
* picture: Frames and pictures.
- (line 26)
+ (line 25)
* picture alignment: Frames and pictures.
(line 218)
* picture.add: Deferred drawing. (line 31)
@@ -10274,26 +10394,26 @@ Index
* picture.scale: Frames and pictures.
(line 110)
* piecewisestraight: Paths and guides. (line 92)
-* pixel: three. (line 655)
+* pixel: three. (line 668)
* Pl: Mathematical functions.
- (line 48)
+ (line 49)
* plain: plain. (line 6)
-* planar: three. (line 128)
-* plane: three. (line 371)
-* planeproject: three. (line 549)
+* planar: three. (line 141)
+* plane: three. (line 384)
+* planeproject: three. (line 562)
* point: Paths and guides. (line 95)
* point <1>: Paths and guides. (line 380)
-* point <2>: three. (line 566)
+* point <2>: three. (line 579)
* polar: Data types. (line 149)
* polargraph: graph. (line 89)
* polygon: graph. (line 481)
* pop: Arrays. (line 39)
* Portrait: Frames and pictures.
- (line 90)
+ (line 91)
* position: three. (line 76)
-* position <1>: three. (line 184)
+* position <1>: three. (line 197)
* postcontrol: Paths and guides. (line 146)
-* postcontrol <1>: three. (line 566)
+* postcontrol <1>: three. (line 579)
* postfix operators: Self & prefix operators.
(line 19)
* postscript: Frames and pictures.
@@ -10302,10 +10422,10 @@ Index
* PostScript subpath: Paths. (line 23)
* pow10: Mathematical functions.
(line 6)
-* prc: three. (line 279)
+* prc: three. (line 292)
* precision: Files. (line 97)
* precontrol: Paths and guides. (line 139)
-* precontrol <1>: three. (line 566)
+* precontrol <1>: three. (line 579)
* prefix operators: Self & prefix operators.
(line 6)
* private: Structures. (line 6)
@@ -10337,7 +10457,7 @@ Index
* radians: Mathematical functions.
(line 17)
* radius: Paths and guides. (line 135)
-* radius <1>: three. (line 566)
+* radius <1>: three. (line 579)
* Rainbow: palette. (line 12)
* rand: Mathematical functions.
(line 39)
@@ -10355,7 +10475,7 @@ Index
* realmult: Data types. (line 100)
* realschur: Arrays. (line 271)
* rectangle: flowchart. (line 34)
-* recursion: Functions. (line 100)
+* recursion: Functions. (line 103)
* reference: Description. (line 92)
* reflect: Transforms. (line 42)
* Relative: label. (line 57)
@@ -10366,7 +10486,7 @@ Index
(line 6)
* rename: Files. (line 156)
* render: three. (line 46)
-* render <1>: three. (line 184)
+* render <1>: three. (line 197)
* render <2>: Options. (line 188)
* replace: Data types. (line 270)
* resetdefaultpen: Pens. (line 440)
@@ -10379,21 +10499,21 @@ Index
* reverse <1>: Paths and guides. (line 183)
* reverse <2>: Paths and guides. (line 383)
* reverse <3>: Arrays. (line 145)
-* reverse <4>: three. (line 566)
+* reverse <4>: three. (line 579)
* rewind: Files. (line 97)
* rfind: Data types. (line 247)
* rgb: Pens. (line 30)
* rgb <1>: Pens. (line 34)
* rgb <2>: Pens. (line 62)
* Riemann zeta function: Mathematical functions.
- (line 48)
+ (line 49)
* Right: graph. (line 273)
* RightSide: label. (line 67)
* RightTicks: graph. (line 161)
* RightTicks <1>: graph. (line 234)
-* RightView: three. (line 452)
+* RightView: three. (line 465)
* Rotate: label. (line 43)
-* rotate: three. (line 520)
+* rotate: three. (line 533)
* Rotate(pair z): label. (line 46)
* round: Mathematical functions.
(line 26)
@@ -10416,8 +10536,8 @@ Index
* scale <2>: Transforms. (line 36)
* scale <3>: graph. (line 711)
* Scale <1>: graph. (line 728)
-* scale <4>: three. (line 519)
-* scale3: three. (line 517)
+* scale <4>: three. (line 532)
+* scale3: three. (line 530)
* scaled graph: graph. (line 691)
* schur: Arrays. (line 271)
* schur <1>: Arrays. (line 275)
@@ -10448,21 +10568,21 @@ Index
* shift: Transforms. (line 26)
* shift <1>: Transforms. (line 28)
* shift <2>: Transforms. (line 46)
-* shift <3>: three. (line 509)
+* shift <3>: three. (line 522)
* shiftless: Transforms. (line 46)
* shininess: three. (line 66)
* shipout: Frames and pictures.
- (line 78)
-* showtarget: three. (line 405)
+ (line 77)
+* showtarget: three. (line 418)
* Si: Mathematical functions.
- (line 48)
+ (line 49)
* signedint: Files. (line 80)
* signedint <1>: Files. (line 93)
* SimpleHead: draw. (line 50)
* simplex: simplex. (line 6)
* simplex2: simplex2. (line 6)
* simpson: Mathematical functions.
- (line 82)
+ (line 83)
* sin: Mathematical functions.
(line 6)
* Sin: Mathematical functions.
@@ -10474,19 +10594,19 @@ Index
* singlereal <1>: Files. (line 93)
* sinh: Mathematical functions.
(line 6)
-* SixViews: three. (line 467)
-* SixViewsFR: three. (line 467)
-* SixViewsUS: three. (line 467)
+* SixViews: three. (line 480)
+* SixViewsFR: three. (line 480)
+* SixViewsUS: three. (line 480)
* size: Figure size. (line 6)
* size <1>: Paths and guides. (line 81)
* size <2>: Paths and guides. (line 371)
* size <3>: Frames and pictures.
- (line 35)
+ (line 34)
* size <4>: Frames and pictures.
- (line 61)
-* size <5>: three. (line 566)
+ (line 60)
+* size <5>: three. (line 579)
* size <6>: Options. (line 188)
-* size3: three. (line 330)
+* size3: three. (line 343)
* Slant: label. (line 49)
* slant: Transforms. (line 38)
* sleep: Data types. (line 376)
@@ -10499,7 +10619,7 @@ Index
* slopefield: slopefield. (line 6)
* smoothcontour3: smoothcontour3. (line 6)
* sncndn: Mathematical functions.
- (line 48)
+ (line 49)
* solid: Pens. (line 102)
* solids: solids. (line 6)
* solve: Arrays. (line 299)
@@ -10511,15 +10631,15 @@ Index
* specularfactor: three. (line 76)
* specularpen: three. (line 66)
* Spline: graph. (line 33)
-* Spline <1>: graph3. (line 99)
+* Spline <1>: graph3. (line 102)
* split: Data types. (line 279)
* sqrt: Mathematical functions.
(line 6)
* squarecap: Pens. (line 139)
* srand: Mathematical functions.
(line 39)
-* stack overflow: Functions. (line 100)
-* stack overflow <1>: Functions. (line 100)
+* stack overflow: Functions. (line 103)
+* stack overflow <1>: Functions. (line 103)
* stack overflow <2>: Help. (line 27)
* static: Static. (line 6)
* stats: stats. (line 6)
@@ -10530,7 +10650,7 @@ Index
* stop: Debugger. (line 10)
* straight: Paths and guides. (line 88)
* Straight: graph. (line 30)
-* straight <1>: three. (line 566)
+* straight <1>: three. (line 579)
* strftime: Data types. (line 321)
* strftime <1>: Data types. (line 346)
* string: Data types. (line 208)
@@ -10542,7 +10662,7 @@ Index
* struct: Structures. (line 6)
* structures: Structures. (line 6)
* subpath: Paths and guides. (line 186)
-* subpath <1>: three. (line 566)
+* subpath <1>: three. (line 579)
* subpictures: Frames and pictures.
(line 100)
* substr: Data types. (line 262)
@@ -10551,11 +10671,11 @@ Index
* Suppress: Pens. (line 420)
* SuppressQuiet: Pens. (line 424)
* surface: three. (line 46)
-* surface <1>: three. (line 104)
-* surface <2>: three. (line 128)
-* surface <3>: three. (line 142)
-* surface <4>: graph3. (line 99)
-* surface <5>: graph3. (line 128)
+* surface <1>: three. (line 117)
+* surface <2>: three. (line 141)
+* surface <3>: three. (line 155)
+* surface <4>: graph3. (line 102)
+* surface <5>: graph3. (line 131)
* SVG: Options. (line 193)
* system: Data types. (line 354)
* system <1>: Options. (line 209)
@@ -10569,7 +10689,7 @@ Index
(line 20)
* tanh: Mathematical functions.
(line 6)
-* target: three. (line 405)
+* target: three. (line 418)
* tell: Files. (line 97)
* template: Templated imports. (line 6)
* tension: Bezier curves. (line 56)
@@ -10577,7 +10697,7 @@ Index
* tensionSpecifier: Paths and guides. (line 403)
* tensor product shading: fill. (line 78)
* tensorshade: fill. (line 78)
-* tessellation: three. (line 154)
+* tessellation: three. (line 167)
* tex: Frames and pictures.
(line 292)
* tex <1>: Options. (line 188)
@@ -10585,7 +10705,7 @@ Index
* TeX string: Data types. (line 208)
* texcommand: Configuring. (line 69)
* TeXHead: draw. (line 50)
-* TeXHead3: three. (line 632)
+* TeXHead3: three. (line 645)
* texpath: Configuring. (line 69)
* texpath <1>: label. (line 122)
* texpreamble: Frames and pictures.
@@ -10595,13 +10715,13 @@ Index
* textbook graph: graph. (line 361)
* tgz: UNIX binary distributions.
(line 6)
-* thick: three. (line 166)
-* thin: three. (line 166)
+* thick: three. (line 179)
+* thin: three. (line 179)
* this: Structures. (line 6)
* three: three. (line 6)
-* ThreeViews: three. (line 467)
-* ThreeViewsFR: three. (line 467)
-* ThreeViewsUS: three. (line 467)
+* ThreeViews: three. (line 480)
+* ThreeViewsFR: three. (line 480)
+* ThreeViewsUS: three. (line 480)
* tick: graph. (line 331)
* ticks: graph. (line 161)
* Ticks: graph. (line 161)
@@ -10616,12 +10736,12 @@ Index
* times: Paths and guides. (line 220)
* times <1>: Paths and guides. (line 224)
* Top: graph. (line 136)
-* TopView: three. (line 452)
+* TopView: three. (line 465)
* trace: Debugger. (line 50)
* trailingzero: graph. (line 176)
* transform: Transforms. (line 6)
-* transform <1>: three. (line 541)
-* transform3: three. (line 504)
+* transform <1>: three. (line 554)
+* transform3: three. (line 517)
* transparency: Pens. (line 307)
* transparent: three. (line 97)
* transpose: Arrays. (line 212)
@@ -10629,20 +10749,20 @@ Index
* tree: tree. (line 6)
* trembling: trembling. (line 6)
* triangle: geometry. (line 6)
-* triangles: three. (line 154)
-* triangulate: contour. (line 192)
+* triangles: three. (line 167)
+* triangulate: contour. (line 189)
* tridiagonal: Arrays. (line 286)
* trigonometric integrals: Mathematical functions.
- (line 48)
+ (line 49)
* triple: Data types. (line 137)
* TrueMargin: draw. (line 90)
-* TrueMargin3: three. (line 648)
-* tube: three. (line 166)
+* TrueMargin3: three. (line 661)
+* tube: three. (line 179)
* tube <1>: tube. (line 6)
* tutorial: Tutorial. (line 6)
* type1cm: Pens. (line 245)
* typedef: Data types. (line 385)
-* typedef <1>: Functions. (line 46)
+* typedef <1>: Functions. (line 48)
* U3D: embed. (line 22)
* undefined: Paths and guides. (line 283)
* unfill: fill. (line 110)
@@ -10656,23 +10776,23 @@ Index
* unit: Data types. (line 83)
* unit <1>: Data types. (line 174)
* unitbox: Paths. (line 44)
-* unitbox <1>: three. (line 377)
+* unitbox <1>: three. (line 390)
* unitcircle: Paths. (line 17)
* unitcircle <1>: Paths. (line 17)
-* unitcircle <2>: three. (line 345)
+* unitcircle <2>: three. (line 358)
* unitrand: Mathematical functions.
(line 39)
* unitsize: Figure size. (line 39)
* unitsize <1>: Frames and pictures.
- (line 56)
+ (line 55)
* UNIX binary distributions: UNIX binary distributions.
(line 6)
* unpacking: Rest arguments. (line 39)
* unravel: Import. (line 29)
-* up: three. (line 405)
+* up: three. (line 418)
* update: Files. (line 38)
* UpsideDown: Frames and pictures.
- (line 90)
+ (line 91)
* UpsideDown <1>: Frames and pictures.
(line 98)
* URL: Import. (line 94)
@@ -10681,8 +10801,10 @@ Index
* user coordinates: Figure size. (line 39)
* user-defined operators: User-defined operators.
(line 6)
+* using: Data types. (line 385)
+* using <1>: Functions. (line 48)
* usleep: Data types. (line 379)
-* v3d: three. (line 300)
+* v3d: three. (line 313)
* value: math. (line 34)
* value <1>: math. (line 37)
* var: Variable initializers.
@@ -10691,28 +10813,28 @@ Index
(line 6)
* vectorfield: graph. (line 1023)
* vectorfield <1>: graph. (line 1062)
-* vectorfield3: graph3. (line 167)
+* vectorfield3: graph3. (line 170)
* vectorization: Arrays. (line 343)
* verbatim: Frames and pictures.
(line 284)
-* vertex-dependent colors: three. (line 119)
+* vertex-dependent colors: three. (line 132)
* Vertical: flowchart. (line 77)
* Viewport: three. (line 76)
* viewportheight: LaTeX usage. (line 47)
-* viewportmargin: three. (line 333)
-* viewportsize: three. (line 333)
+* viewportmargin: three. (line 346)
+* viewportsize: three. (line 346)
* viewportwidth: LaTeX usage. (line 47)
-* views: three. (line 279)
+* views: three. (line 292)
* vim: Editing modes. (line 32)
* virtual functions: Structures. (line 124)
* void: Data types. (line 10)
* W: Labels. (line 18)
* warn: Configuring. (line 79)
-* WebGL: three. (line 233)
+* WebGL: three. (line 246)
* whatever: Paths and guides. (line 246)
* Wheel: palette. (line 22)
* wheel mouse: GUI. (line 6)
-* while: Programming. (line 49)
+* while: Programming. (line 50)
* White: three. (line 76)
* white-space string delimiter mode: Arrays. (line 374)
* width: LaTeX usage. (line 47)
@@ -10720,7 +10842,7 @@ Index
* word: Arrays. (line 374)
* write: Files. (line 57)
* write <1>: Arrays. (line 413)
-* X: three. (line 345)
+* X: three. (line 358)
* xasy: GUI. (line 6)
* xaxis3: graph3. (line 7)
* xdr: Files. (line 80)
@@ -10733,20 +10855,20 @@ Index
* xpart: Data types. (line 94)
* xpart <1>: Data types. (line 185)
* xscale: Transforms. (line 30)
-* xscale3: three. (line 511)
+* xscale3: three. (line 524)
* xtick: graph. (line 331)
-* XY: three. (line 526)
-* XY <1>: three. (line 541)
-* XYEquals: graph3. (line 21)
-* XYZero: graph3. (line 21)
-* XZEquals: graph3. (line 21)
+* XY: three. (line 539)
+* XY <1>: three. (line 554)
+* XYEquals: graph3. (line 24)
+* XYZero: graph3. (line 24)
+* XZEquals: graph3. (line 24)
* XZero: graph. (line 261)
-* XZZero: graph3. (line 21)
+* XZZero: graph3. (line 24)
* Y: Mathematical functions.
(line 6)
* Y <1>: Mathematical functions.
- (line 48)
-* Y <2>: three. (line 345)
+ (line 49)
+* Y <2>: three. (line 358)
* yaxis3: graph3. (line 7)
* YEquals: graph. (line 129)
* yequals: graph. (line 279)
@@ -10754,190 +10876,195 @@ Index
* ypart: Data types. (line 97)
* ypart <1>: Data types. (line 188)
* yscale: Transforms. (line 32)
-* yscale3: three. (line 513)
+* yscale3: three. (line 526)
* ytick: graph. (line 331)
-* YX: three. (line 541)
-* YZ: three. (line 541)
-* YZEquals: graph3. (line 21)
+* YX: three. (line 554)
+* YZ: three. (line 554)
+* YZEquals: graph3. (line 24)
* YZero: graph. (line 124)
-* YZZero: graph3. (line 21)
-* Z: three. (line 345)
+* YZZero: graph3. (line 24)
+* Z: three. (line 358)
* zaxis3: graph3. (line 7)
* zero_Ai: Mathematical functions.
- (line 48)
+ (line 49)
* zero_Ai_deriv: Mathematical functions.
- (line 48)
+ (line 49)
* zero_Bi: Mathematical functions.
- (line 48)
+ (line 49)
* zero_Bi_deriv: Mathematical functions.
- (line 48)
+ (line 49)
* zero_J: Mathematical functions.
- (line 48)
+ (line 49)
* zeroTransform: Transforms. (line 44)
* zerowinding: Pens. (line 164)
* zeta: Mathematical functions.
- (line 48)
+ (line 49)
* zpart: Data types. (line 191)
-* zscale3: three. (line 515)
-* ZX: three. (line 541)
-* ZX <1>: three. (line 541)
-* ZY: three. (line 541)
+* zscale3: three. (line 528)
+* ZX: three. (line 554)
+* ZX <1>: three. (line 554)
+* ZY: three. (line 554)

Tag Table:
Node: Top573
-Node: Description7668
-Node: Installation12075
-Node: UNIX binary distributions13220
-Node: MacOS X binary distributions14395
-Node: Microsoft Windows15007
-Node: Configuring16247
-Node: Search paths20762
-Node: Compiling from UNIX source21854
-Node: Editing modes25157
-Node: Git27735
-Node: Building the documentation28258
-Node: Uninstall28824
-Node: Tutorial29180
-Node: Drawing in batch mode30051
-Node: Drawing in interactive mode30975
-Node: Figure size32046
-Node: Labels33733
-Node: Paths34625
-Ref: unitcircle35265
-Node: Drawing commands37258
-Node: draw39126
-Ref: arrows40402
-Node: fill46708
-Ref: gradient shading47790
-Node: clip52636
-Node: label53413
-Ref: Label54327
-Ref: baseline58241
-Ref: envelope58977
-Node: Bezier curves60529
-Node: Programming64497
-Ref: array iteration66357
-Node: Data types66524
-Ref: format78182
-Node: Paths and guides82850
-Ref: circle83112
-Ref: extension93464
-Node: Pens100657
-Ref: fillrule108796
-Ref: basealign109754
-Ref: transparency115119
-Ref: makepen118840
-Ref: overwrite119746
-Node: Transforms121005
-Node: Frames and pictures123100
-Ref: size124772
-Ref: unitsize125839
-Ref: shipout126968
-Ref: filltype129354
-Ref: add132983
-Ref: add about133956
-Ref: tex137074
-Node: Deferred drawing137985
-Node: Files141276
-Ref: cd142366
-Ref: scroll147512
-Node: Variable initializers150621
-Node: Structures153502
-Node: Operators158816
-Node: Arithmetic & logical159132
-Node: Self & prefix operators161688
-Node: User-defined operators162548
-Node: Implicit scaling163487
-Node: Functions164050
-Ref: stack overflow167195
-Node: Default arguments167481
-Node: Named arguments168253
-Node: Rest arguments170903
-Node: Mathematical functions174060
-Node: Arrays180924
-Ref: sort189022
-Ref: tridiagonal192580
-Ref: solve193895
-Node: Slices198215
-Node: Casts202235
-Node: Import204649
-Node: Templated imports210291
-Node: Static212185
-Node: LaTeX usage215143
-Node: Base modules221744
-Node: plain224309
-Node: simplex225015
-Node: simplex2225219
-Node: math225488
-Node: interpolate228419
-Node: geometry228710
-Node: trembling229406
-Node: stats229683
-Node: patterns229954
-Node: markers230197
-Node: map232097
-Node: tree232533
-Node: binarytree232717
-Node: drawtree233392
-Node: syzygy233601
-Node: feynman233883
-Node: roundedpath234169
-Node: animation234459
-Ref: animate234907
-Node: embed236083
-Node: slide237093
-Node: MetaPost237436
-Node: babel238212
-Node: labelpath238460
-Node: labelpath3239324
-Node: annotate239651
-Node: CAD240141
-Node: graph240459
-Ref: ticks248075
-Ref: pathmarkers262263
-Ref: marker262737
-Ref: markuniform263103
-Ref: errorbars265010
-Ref: automatic scaling270187
-Node: palette282007
-Ref: images282129
-Ref: image286593
-Ref: logimage287114
-Ref: penimage288224
-Ref: penfunctionimage288487
-Node: three289263
-Ref: PostScript3D321652
-Node: obj323446
-Node: graph3323707
-Ref: GaussianSurface329578
-Node: grid3330756
-Node: solids331592
-Node: tube332616
-Node: flowchart334999
-Node: contour339718
-Node: contour3346318
-Node: smoothcontour3346642
-Node: slopefield348409
-Node: ode349954
-Node: Options350223
-Ref: configuration file358661
-Ref: settings358661
-Ref: texengines360009
-Ref: magick360009
-Node: Interactive mode363404
-Ref: history365633
-Node: GUI367004
-Node: GUI installation367574
-Node: GUI usage368570
-Node: Command-Line Interface369637
-Node: Language server protocol371125
-Node: PostScript to Asymptote372606
-Node: Help373433
-Node: Debugger375163
-Node: Credits377011
-Node: Index378268
+Node: Description7656
+Node: Installation12070
+Node: UNIX binary distributions13215
+Node: MacOS X binary distributions14369
+Node: Microsoft Windows14981
+Node: Configuring16221
+Node: Search paths20736
+Node: Compiling from UNIX source21828
+Node: Editing modes25131
+Node: Git27709
+Node: Building the documentation28209
+Node: Uninstall28775
+Node: Tutorial29136
+Node: Drawing in batch mode30007
+Node: Drawing in interactive mode30914
+Node: Figure size31985
+Node: Labels33672
+Node: Paths34564
+Ref: unitcircle35204
+Node: Drawing commands37197
+Node: draw39065
+Ref: arrows40316
+Node: fill46622
+Ref: gradient shading47704
+Node: clip52579
+Node: label53356
+Ref: Label54270
+Ref: baseline58184
+Ref: envelope58920
+Node: Bezier curves60472
+Node: Programming64439
+Ref: array iteration66375
+Node: Data types66542
+Ref: format78180
+Node: Paths and guides83170
+Ref: circle83432
+Ref: extension93784
+Node: Pens100977
+Ref: fillrule109116
+Ref: basealign110074
+Ref: transparency115439
+Ref: makepen119200
+Ref: overwrite120106
+Node: Transforms121365
+Node: Frames and pictures123460
+Ref: size125074
+Ref: unitsize126141
+Ref: shipout127270
+Ref: filltype129756
+Ref: add133385
+Ref: add about134358
+Ref: tex137476
+Ref: deferred drawing138387
+Node: Deferred drawing138387
+Node: Files141678
+Ref: cd142713
+Ref: scroll147859
+Node: Variable initializers150968
+Node: Structures153842
+Node: Operators159156
+Node: Arithmetic & logical159472
+Node: Self & prefix operators162010
+Node: User-defined operators162870
+Node: Implicit scaling163883
+Node: Functions164446
+Ref: stack overflow167781
+Node: Default arguments168067
+Node: Named arguments168821
+Node: Rest arguments171471
+Node: Mathematical functions174628
+Node: Arrays181563
+Ref: sort189683
+Ref: tridiagonal193241
+Ref: solve194556
+Node: Slices198876
+Node: Casts202881
+Node: Import205295
+Node: Templated imports210937
+Node: Static212773
+Node: Autounravel215751
+Node: When fields are autounraveled217206
+Node: Where autounravel is legal218119
+Ref: Where autounravel is legal-Footnote-1218949
+Node: LaTeX usage219224
+Node: Base modules225825
+Node: plain228390
+Node: simplex229043
+Node: simplex2229251
+Node: math229549
+Node: interpolate232445
+Node: geometry232736
+Node: trembling233432
+Node: stats233709
+Node: patterns233980
+Node: markers234223
+Node: map236123
+Node: tree236543
+Node: binarytree236727
+Node: drawtree237402
+Node: syzygy237611
+Node: feynman237893
+Node: roundedpath238179
+Node: animation238469
+Ref: animate238917
+Node: embed240093
+Node: slide241103
+Node: MetaPost241446
+Node: babel242222
+Node: labelpath242470
+Node: labelpath3243334
+Node: annotate243661
+Node: CAD244151
+Node: graph244469
+Ref: ticks252085
+Ref: pathmarkers266273
+Ref: marker266747
+Ref: markuniform267113
+Ref: errorbars269020
+Ref: automatic scaling274197
+Node: palette286017
+Ref: images286139
+Ref: image290603
+Ref: logimage291124
+Ref: penimage292234
+Ref: penfunctionimage292497
+Node: three293273
+Ref: PostScript3D326302
+Node: obj328096
+Node: graph3328357
+Ref: GaussianSurface334384
+Node: grid3335562
+Node: solids336398
+Node: tube337422
+Node: flowchart339805
+Node: contour344524
+Node: contour3351005
+Node: smoothcontour3351329
+Node: slopefield353096
+Node: ode354641
+Node: Options354910
+Ref: configuration file363358
+Ref: settings363358
+Ref: texengines364706
+Ref: magick364706
+Node: Interactive mode368101
+Ref: history370330
+Node: GUI371701
+Node: GUI installation372271
+Node: GUI usage373428
+Node: Command-Line Interface374495
+Node: Language server protocol375939
+Node: PostScript to Asymptote377420
+Node: Help378249
+Node: Debugger379979
+Node: Credits381827
+Node: Index383084

End Tag Table
diff --git a/graphics/asymptote/drawfill.h b/graphics/asymptote/drawfill.h
index 360959d08f..5bdc8489ec 100644
--- a/graphics/asymptote/drawfill.h
+++ b/graphics/asymptote/drawfill.h
@@ -184,7 +184,7 @@ public:
: drawElement(key), drawShade(src,stroke,pentype,key), pens(pens),
vertices(vertices), edges(edges) {}
- bool svgpng() {return settings::getSetting<bool>("xasy") || !settings::getSetting<bool>("svgemulation") || pdf();}
+ bool svgpng() {return settings::xasy || !settings::getSetting<bool>("svgemulation") || pdf();}
void palette(psfile *out) {
out->gsave();
diff --git a/graphics/asymptote/drawlabel.cc b/graphics/asymptote/drawlabel.cc
index 491ec4f8d0..3d3b370975 100644
--- a/graphics/asymptote/drawlabel.cc
+++ b/graphics/asymptote/drawlabel.cc
@@ -6,6 +6,8 @@
*****/
#include <sstream>
+#include <random>
+#include <chrono>
#include "drawlabel.h"
#include "settings.h"
@@ -66,8 +68,10 @@ void texbounds(double& width, double& height, double& depth,
inline double urand()
{
- static const double factor=2.0/RANDOM_MAX;
- return random()*factor-1.0;
+ auto seed = std::chrono::system_clock::now().time_since_epoch().count();
+ std::minstd_rand engine(seed);
+ std::uniform_real_distribution<double> dist(-1.0, 1.0);
+ return dist(engine);
}
void setpen(iopipestream& tex, const string& texengine, const pen& pentype)
diff --git a/graphics/asymptote/drawsurface.cc b/graphics/asymptote/drawsurface.cc
index 104b545668..ef330a07b7 100644
--- a/graphics/asymptote/drawsurface.cc
+++ b/graphics/asymptote/drawsurface.cc
@@ -497,9 +497,9 @@ bool drawBezierTriangle::write(abs3Doutfile *out)
} else {
double prerender=renderResolution();
if(prerender) {
- GLfloat c[16];
+ GLfloat c[12];
if(colors)
- for(size_t i=0; i < 4; ++i)
+ for(size_t i=0; i < 3; ++i)
storecolor(c,4*i,colors[i]);
S.init(prerender,colors ? c : NULL);
S.render(controls,straight,c);
diff --git a/graphics/asymptote/drawsurface.h b/graphics/asymptote/drawsurface.h
index d68f179759..80d9d9415f 100644
--- a/graphics/asymptote/drawsurface.h
+++ b/graphics/asymptote/drawsurface.h
@@ -642,9 +642,9 @@ public:
for(size_t i=0; i < nN; i++)
N[i]=s->N[i];
} else {
- double T[]={t[0],t[1],t[2],
- t[4],t[5],t[6],
- t[8],t[9],t[10]};
+ double T[]={t[0],t[4],t[8],
+ t[1],t[5],t[9],
+ t[2],t[6],t[10]};
run::inverse(T,3);
for(size_t i=0; i < nN; i++)
N[i]=unit(Transform3(s->N[i],T));
diff --git a/graphics/asymptote/entry.cc b/graphics/asymptote/entry.cc
index e6e3a031a0..bb53cd6844 100644
--- a/graphics/asymptote/entry.cc
+++ b/graphics/asymptote/entry.cc
@@ -95,17 +95,24 @@ varEntry *qualifyVarEntry(varEntry *qv, varEntry *v)
}
-bool tenv::add(symbol dest,
+tyEntry *tenv::add(symbol dest,
names_t::value_type &x, varEntry *qualifier, coder &c)
{
- if (!x.second.empty()) {
- tyEntry *ent=x.second.front();
- if (ent->checkPerm(READ, c)) {
- enter(dest, qualifyTyEntry(qualifier, ent));
- return true;
- }
+ mem::list<tyEntry *>& ents=x.second;
+ if (ents.empty()) {
+ return nullptr;
+ }
+ tyEntry *ent=ents.front();
+ if (!ent->checkPerm(READ, c)) {
+ return nullptr;
+ }
+ if (permission perm = c.getPermission(); perm != PUBLIC) {
+ // Add an additional restriction to ent based on c.getPermission().
+ ent = new tyEntry(ent, perm, c.thisType());
}
- return false;
+ tyEntry *qEnt = qualifyTyEntry(qualifier, ent);
+ enter(dest, qEnt);
+ return qEnt;
}
void tenv::add(tenv& source, varEntry *qualifier, coder &c) {
@@ -114,13 +121,13 @@ void tenv::add(tenv& source, varEntry *qualifier, coder &c) {
add(p->first, *p, qualifier, c);
}
-bool tenv::add(symbol src, symbol dest,
+tyEntry *tenv::add(symbol src, symbol dest,
tenv& source, varEntry *qualifier, coder &c) {
names_t::iterator p = source.names.find(src);
if (p != source.names.end())
return add(dest, *p, qualifier, c);
else
- return false;
+ return nullptr;
}
// To avoid writing qualifiers everywhere.
@@ -265,6 +272,14 @@ size_t specialHash(symbol name, const ty *t) {
DEBUG_CACHE_ASSERT(t);
return name.hash() * 107 + t->hash();
}
+size_t hash(symbol name, const ty *t) {
+ if (name.special()) {
+ return specialHash(name, t);
+ } else {
+ return nonSpecialHash(name, t);
+ }
+}
+
varEntry *core_venv::storeNonSpecial(symbol name, varEntry *ent) {
DEBUG_CACHE_ASSERT(name.notSpecial());
@@ -406,6 +421,26 @@ size_t numFormals(ty *t) {
return sig ? sig->getNumFormals() : 0;
}
+size_t SigHash::operator()(const mem::pair<symbol, ty*>& p) const {
+ return hash(p.first, p.second);
+}
+
+bool SigEquiv::operator()(const mem::pair<symbol, ty*>& p1,
+ const mem::pair<symbol, ty*>& p2) const {
+ symbol name1 = p1.first, name2 = p2.first;
+ if (name1 != name2)
+ return false;
+ ty *t1 = p1.second, *t2 = p2.second;
+ DEBUG_CACHE_ASSERT(t1);
+ DEBUG_CACHE_ASSERT(t2);
+ if (name1.special()) {
+ return equivalent(t1, t2);
+ } else {
+ return equivalent(t1->getSignature(), t2->getSignature());
+ }
+}
+
+
void venv::checkName(symbol name)
{
#if 0
@@ -696,21 +731,29 @@ varEntry *venv::lookBySignature(symbol name, signature *sig) {
void venv::add(venv& source, varEntry *qualifier, coder &c)
{
- core_venv::const_iterator end = source.core.end();
- for (core_venv::const_iterator p = source.core.begin(); p != end; ++p)
- {
- DEBUG_CACHE_ASSERT(p->filled());
+ const bool isAutoUnravel = c.isAutoUnravel();
+ for (const cell& p : source.core) {
+ DEBUG_CACHE_ASSERT(p.filled());
- varEntry *v=p->ent;
- if (v->checkPerm(READ, c)) {
- enter(p->name, qualifyVarEntry(qualifier, v));
+ varEntry *v=p.ent;
+ if (v->checkPerm(READ, c)) {
+ if (permission perm = c.getPermission(); perm != PUBLIC) {
+ // Add an additional restriction to v based on c.getPermission().
+ v = new varEntry(*v, perm, c.thisType());
+ }
+ varEntry *qve=qualifyVarEntry(qualifier, v);
+ enter(p.name, qve);
+ if (isAutoUnravel) {
+ registerAutoUnravel(p.name, qve);
}
}
+ }
}
-bool venv::add(symbol src, symbol dest,
- venv& source, varEntry *qualifier, coder &c)
-{
+bool venv::add(
+ symbol src, symbol dest, venv& source, varEntry *qualifier, coder &c,
+ mem::vector<varEntry*> *addedVec
+) {
ty *t=source.getType(src);
if (!t)
@@ -722,7 +765,15 @@ bool venv::add(symbol src, symbol dest,
{
varEntry *v=source.lookByType(src, *i);
if (v->checkPerm(READ, c)) {
- enter(dest, qualifyVarEntry(qualifier, v));
+ if (permission perm = c.getPermission(); perm != PUBLIC) {
+ // Add an additional restriction to v based on c.getPermission().
+ v = new varEntry(*v, perm, c.thisType());
+ }
+ varEntry *qve=qualifyVarEntry(qualifier, v);
+ enter(dest, qve);
+ if (addedVec != nullptr) {
+ addedVec->push_back(qve);
+ }
added=true;
}
}
@@ -730,11 +781,19 @@ bool venv::add(symbol src, symbol dest,
}
else {
varEntry *v=source.lookByType(src, t);
- if (v->checkPerm(READ, c)) {
- enter(dest, qualifyVarEntry(qualifier, v));
- return true;
+ if (!v->checkPerm(READ, c)) {
+ return false;
}
- return false;
+ if (permission perm = c.getPermission(); perm != PUBLIC) {
+ // Add an additional restriction to v based on c.getPermission().
+ v = new varEntry(*v, perm, c.thisType());
+ }
+ varEntry *qve=qualifyVarEntry(qualifier, v);
+ enter(dest, qve);
+ if (addedVec != nullptr) {
+ addedVec->push_back(qve);
+ }
+ return true;
}
}
@@ -784,4 +843,22 @@ void venv::completions(mem::list<symbol >& l, string start)
l.push_back(N->first);
}
+void venv::registerAutoUnravel(symbol name, varEntry *v,
+ AutounravelPriority priority)
+{
+ mem::pair<symbol, ty*> p = {name, v->getType()};
+ if (nonShadowableAutoUnravels.find(p) != nonShadowableAutoUnravels.end()) {
+ if (priority == AutounravelPriority::FORCE) {
+ em.error(v->getPos());
+ em << "cannot shadow autounravel " << name;
+ }
+ return;
+ }
+ autoUnravels.emplace_front(name, v);
+ if (priority == AutounravelPriority::FORCE) {
+ // The value doesn't matter, we just need to know that the key exists.
+ nonShadowableAutoUnravels[p] = nullptr;
+ }
+}
+
} // namespace trans
diff --git a/graphics/asymptote/entry.h b/graphics/asymptote/entry.h
index 03cdcef4e2..3adf68f3a1 100644
--- a/graphics/asymptote/entry.h
+++ b/graphics/asymptote/entry.h
@@ -104,6 +104,10 @@ public:
// (Non-destructively) merges two varEntries, creating a qualified varEntry.
varEntry(varEntry &qv, varEntry &v);
+ // Copies the original varEntry and adds a new permission constraint.
+ varEntry(varEntry &base, permission perm, record *r)
+ : entry(base, perm, r), t(base.t), location(base.location) {}
+
ty *getType()
{ return t; }
@@ -165,8 +169,8 @@ inline tyEntry *qualifyTyEntry(varEntry *qv, tyEntry *ent) {
// The type environment.
class tenv : public sym::table<tyEntry *> {
- bool add(symbol dest, names_t::value_type &x, varEntry *qualifier,
- coder &c);
+ tyEntry *add(symbol dest, names_t::value_type &x, varEntry *qualifier,
+ coder &c);
public:
// Add the entries in one environment to another, if qualifier is
// non-null, it is a record and the source environment is its types. The
@@ -175,16 +179,18 @@ public:
// Adds entries of the name src in source as the name dest, returning true if
// any were added.
- bool add(symbol src, symbol dest,
- tenv& source, varEntry *qualifier, coder &c);
+ tyEntry *add(symbol src, symbol dest,
+ tenv& source, varEntry *qualifier, coder &c);
};
// For speed reasons, many asserts are only tested when DEBUG_CACHE is set.
-#ifdef DEBUG_CACHE
-#define DEBUG_CACHE_ASSERT(x) assert(x)
-#else
-#define DEBUG_CACHE_ASSERT(x) (void)(x)
+#ifndef DEBUG_CACHE_ASSERT
+# ifdef DEBUG_CACHE
+# define DEBUG_CACHE_ASSERT(x) assert(x)
+# else
+# define DEBUG_CACHE_ASSERT(x) (void)(x)
+# endif
#endif
// The hash table which is at the core of the variable environment venv.
@@ -348,6 +354,19 @@ public:
}
};
+struct SigHash {
+ size_t operator()(const mem::pair<symbol, ty *>& p) const;
+};
+
+struct SigEquiv {
+ bool operator()(const mem::pair<symbol, ty *>& p1,
+ const mem::pair<symbol, ty *>& p2) const;
+};
+
+enum class AutounravelPriority {
+ OFFER,
+ FORCE,
+};
// venv implemented with a hash table.
class venv {
@@ -367,6 +386,14 @@ class venv {
typedef mem::stack<addition> addstack;
addstack additions;
+ // A list of variables that need to be unraveled whenever the containing
+ // record (if any) becomes available.
+ mem::list<mem::pair<symbol, varEntry *>> autoUnravels;
+ mem::unordered_map<mem::pair<symbol, ty*>,
+ std::nullptr_t,
+ SigHash,
+ SigEquiv> nonShadowableAutoUnravels;
+
// A scope can be recorded by the size of the addition stack at the time the
// scope began.
typedef mem::stack<size_t> scopestack;
@@ -457,7 +484,8 @@ public:
// Add all unshadowed variables from source of the name src as variables
// named dest. Returns true if at least one was added.
bool add(symbol src, symbol dest,
- venv& source, varEntry *qualifier, coder &c);
+ venv& source, varEntry *qualifier, coder &c,
+ mem::vector<varEntry *> *addedVec=nullptr);
// Look for a function that exactly matches the type given.
varEntry *lookByType(symbol name, ty *t) {
@@ -493,6 +521,16 @@ public:
// Adds to l, all names prefixed by start.
void completions(mem::list<symbol>& l, string start);
+
+ void registerAutoUnravel(
+ symbol name,
+ varEntry *v,
+ AutounravelPriority priority=AutounravelPriority::FORCE
+ );
+
+ const mem::list<mem::pair<symbol, varEntry *>>& getAutoUnravels() {
+ return autoUnravels;
+ }
};
} // namespace trans
diff --git a/graphics/asymptote/env.cc b/graphics/asymptote/env.cc
index fc8c4c3899..d2e9669378 100644
--- a/graphics/asymptote/env.cc
+++ b/graphics/asymptote/env.cc
@@ -188,12 +188,7 @@ void protoenv::addArrayOps(array *a)
void protoenv::addRecordOps(record *r)
{
- trans::addRecordOps(ve, r);
-}
-
-void protoenv::addFunctionOps(function *f)
-{
- trans::addFunctionOps(ve, f);
+ trans::addRecordOps(r);
}
env::env(genv &ge)
@@ -214,12 +209,10 @@ record *env::getModule(symbol id, string filename)
return ge.getModule(id, filename);
}
-record *env::getTemplatedModule(symbol index,
- string filename,
- mem::vector<absyntax::namedTyEntry*>* args,
- coenv& e)
+record *env::getTemplatedModule(string filename,
+ mem::vector<absyntax::namedTy*>* args)
{
- return ge.getTemplatedModule(index, filename, args, e);
+ return ge.getTemplatedModule(filename, args);
}
record *env::getLoadedModule(symbol id)
diff --git a/graphics/asymptote/env.h b/graphics/asymptote/env.h
index 1cf628f095..3916facd5e 100644
--- a/graphics/asymptote/env.h
+++ b/graphics/asymptote/env.h
@@ -19,7 +19,7 @@ class record;
}
namespace absyntax {
-class namedTyEntry;
+class namedTy;
}
namespace trans {
@@ -140,20 +140,27 @@ public:
ve.add(source.ve, qualifier, c);
}
+ struct Added : public gc {
+ tyEntry *typeAdded;
+ mem::vector<varEntry*> varsAdded;
+ bool empty() { return !typeAdded && varsAdded.empty(); }
+ };
+
// Add variables and types of name src from another environment under the
// name dest in this environment.
- bool add(symbol src, symbol dest,
+ Added *add(symbol src, symbol dest,
protoenv &source, varEntry *qualifier, coder &c)
{
- bool teAdd=te.add(src, dest, source.te, qualifier, c);
- bool veAdd=ve.add(src, dest, source.ve, qualifier, c);
- return teAdd || veAdd;
+ Added *retv = new Added();
+ retv->typeAdded=te.add(src, dest, source.te, qualifier, c);
+ bool varAdded=ve.add(src, dest, source.ve, qualifier, c, &retv->varsAdded);
+ assert(varAdded == (retv->varsAdded.size() > 0));
+ return retv;
}
// Add the standard functions for a new type.
void addArrayOps(types::array *t);
void addRecordOps(types::record *r);
- void addFunctionOps(types::function *f);
void list(record *r=0)
{
@@ -186,10 +193,8 @@ public:
~env();
record *getModule(symbol id, string filename);
- record *getTemplatedModule(symbol index,
- string filename,
- mem::vector<absyntax::namedTyEntry*> *args,
- coenv& e);
+ record *getTemplatedModule(string filename,
+ mem::vector<absyntax::namedTy*> *args);
record *getLoadedModule(symbol id);
};
diff --git a/graphics/asymptote/envcompleter.cc b/graphics/asymptote/envcompleter.cc
index 9477a77f3c..0462d8aad0 100644
--- a/graphics/asymptote/envcompleter.cc
+++ b/graphics/asymptote/envcompleter.cc
@@ -20,7 +20,7 @@ static void loadBasicList() {
assert(basicListLoaded==false);
#define ADD(word) basicList.push_back(symbol::literalTrans(#word))
-#include "keywords.cc"
+#include "keywords.h"
#undef ADD
basicListLoaded=true;
diff --git a/graphics/asymptote/errormsg.cc b/graphics/asymptote/errormsg.cc
index c9248a6299..61992d9636 100644
--- a/graphics/asymptote/errormsg.cc
+++ b/graphics/asymptote/errormsg.cc
@@ -20,6 +20,8 @@ static nullPosInitializer nullPosInit;
bool errorstream::interrupt=false;
+using camp::newl;
+
ostream& operator<< (ostream& out, const position& pos)
{
if (!pos)
@@ -34,7 +36,7 @@ ostream& operator<< (ostream& out, const position& pos)
while(count > 0 && getline(fin,s)) {
count--;
}
- s=std::regex_replace(s,std::regex("\t")," ");
+ s=std::regex_replace(s,std::regex("\t")," ");
out << s << endl;
for(size_t i=1; i < pos.column; ++i)
out << " ";
@@ -42,9 +44,9 @@ ostream& operator<< (ostream& out, const position& pos)
}
out << filename << ": ";
- out << pos.line << "." << pos.column << ": ";
+ out << pos.line << "." << pos.column;
- if(settings::getSetting<bool>("xasy")) {
+ if(settings::xasy) {
camp::openpipeout();
fprintf(camp::pipeout,"Error\n");
fflush(camp::pipeout);
@@ -62,7 +64,7 @@ void errorstream::clear()
void errorstream::message(position pos, const string& s)
{
if (floating) out << endl;
- out << pos << s;
+ out << pos << ": " << s;
floating = true;
}
@@ -122,9 +124,24 @@ void errorstream::cont()
floating = false;
}
-void errorstream::sync()
+void errorstream::sync(bool reportTraceback)
{
if (floating) out << endl;
+
+ if(reportTraceback && traceback.size()) {
+ bool first=true;
+ for(auto p=this->traceback.rbegin(); p != this->traceback.rend(); ++p) {
+ if(p->filename() != "-") {
+ if(first) {
+ out << newl << "TRACEBACK:";
+ first=false;
+ }
+ cout << newl << (*p) << endl;
+ }
+ }
+ traceback.clear();
+ }
+
floating = false;
}
diff --git a/graphics/asymptote/errormsg.h b/graphics/asymptote/errormsg.h
index eb03faa5cb..df6398a2c2 100644
--- a/graphics/asymptote/errormsg.h
+++ b/graphics/asymptote/errormsg.h
@@ -19,7 +19,7 @@ using std::ostream;
struct handled_error : std::exception {}; // Exception to process next file.
struct interrupted : std::exception {}; // Exception to interrupt execution.
struct quit : std::exception {}; // Exception to quit current operation.
-struct eof : std::exception {}; // Exception to exit interactive mode.
+struct EofException : std::exception {}; // Exception to exit interactive mode.
class fileinfo : public gc {
string filename;
@@ -174,6 +174,9 @@ class errorstream {
public:
static bool interrupt; // Is there a pending interrupt?
+ using traceback_t = mem::list<position> ;
+ traceback_t traceback;
+
errorstream(ostream& out = cerr)
: out(out), anyErrors(false), anyWarnings(false), floating(false),
anyStatusErrors(false) {}
@@ -222,7 +225,7 @@ public:
// Reporting errors to the stream may be incomplete. This draws the
// appropriate newlines or file excerpts that may be needed at the end.
- void sync();
+ void sync(bool reportTraceback=false);
void cont();
diff --git a/graphics/asymptote/errors b/graphics/asymptote/errors
index 1b0570bfbb..a679ea016a 100644
--- a/graphics/asymptote/errors
+++ b/graphics/asymptote/errors
@@ -155,16 +155,52 @@ errortest.asy: 452.16: expression is not an array of inferable type
errortest.asy: 457.16: expression is not an array of inferable type
errortest.asy: 463.16: expression is not an array of inferable type
errortest.asy: 470.7: array expression cannot be used as an address
-errortest.asy: 518.29: expected 'as'
-errortest.asy: 519.30: expected 'as'
-errortest.asy: 520.23: expected typename=
-errortest.asy: 521.3: Parametrized imports disallowed to reduce naming conflicts. Try 'access <module>(<type parameters>) as <newname>;'.
-errortest.asy: 524.3: templated module access requires template parameters
-errortest.asy: 525.3: Expected 'typedef import(<types>);'
-errortest.asy: 529.30: too few types passed: got 2, expected 3
-errortest.asy: 529.3: could not load module 'errortestTemplate'
-errortest.asy: 531.47: template argument name does not match module: passed T, expected C
-errortest.asy: 531.3: could not load module 'errortestTemplate'
-errortest.asy: 533.37: template argument name does not match module: passed C, expected B
-errortest.asy: 533.3: could not load module 'errortestTemplate'
-errortestTemplate.asy: 5.1: 'typedef import(<types>)' must precede any other code
+errortest.asy: 519.29: expected 'as'
+errortest.asy: 521.30: expected 'as'
+errortest.asy: 523.23: expected typename=
+errortest.asy: 525.3: Parametrized imports disallowed to reduce naming conflicts. Try 'access <module>(<type parameters>) as <newname>;'.
+errortestNonTemplate.asy: 1.1: expected 'typedef import(<types>);'
+errortest.asy: 527.3: could not load module 'errortestNonTemplate'
+errortest.asy: 530.3: unexpected 'typedef import'
+errortest.asy: 531.3: Expected 'typedef import(<types>);'
+errortest.asy: 535.34: too few types passed: got 2, expected 3
+errortest.asy: 535.3: could not load module 'errortestBrokenTemplate'
+errortest.asy: 537.51: template argument name does not match module: passed T, expected C
+errortest.asy: 537.3: could not load module 'errortestBrokenTemplate'
+errortest.asy: 539.41: template argument name does not match module: passed C, expected B
+errortest.asy: 539.3: could not load module 'errortestBrokenTemplate'
+errortestBrokenTemplate.asy: 5.1: unexpected 'typedef import'
+errortestBrokenTemplate.asy: 1.1: templated module access requires template parameters
+errortest.asy: 549.5: too many static modifiers
+errortest.asy: 552.5: too many autounravel modifiers
+errortest.asy: 553.5: too many autounravel modifiers
+errortest.asy: 554.5: too many static modifiers
+errortest.asy: 555.17: types cannot be autounraveled
+errortest.asy: 559.3: top-level fields cannot be autounraveled
+errortest.asy: 564.21: cannot shadow autounravel qaz
+errortest.asy: 572.22: cannot shadow autounravel alias
+errortest.asy: 581.27: non-statically nested types cannot be used in templates
+errortest.asy: 584.26: non-statically nested types cannot be used in templates
+errortest.asy: 585.26: non-statically nested types cannot be used in templates
+errortest.asy: 591.28: template argument name does not match module: passed B, expected A
+errortest.asy: 591.3: could not load module 'errortestTemplate'
+errortest.asy: 593.28: template argument name does not match module: passed C, expected A
+errortest.asy: 593.3: could not load module 'errortestTemplate'
+errortest.asy: 595.35: template argument name does not match module: passed D, expected B
+errortest.asy: 595.3: could not load module 'errortestTemplate'
+errortest.asy: 597.28: template argument name does not match module: passed C, expected A
+errortest.asy: 597.3: could not load module 'errortestTemplate'
+errortest.asy: 599.28: too few types passed: got 1, expected 2
+errortest.asy: 599.3: could not load module 'errortestTemplate'
+errortest.asy: 601.28: too many types passed: got 3, expected 2
+errortest.asy: 601.3: could not load module 'errortestTemplate'
+errortestTemplate.asy: 1.1: unexpected 'typedef import'
+errortest.asy: 618.4: accessing private field outside of structure
+errortest.asy: 619.9: accessing private field outside of structure
+errortest.asy: 620.4: accessing private field outside of structure
+errortest.asy: 621.4: accessing private field outside of structure
+errortest.asy: 625.4: accessing private field outside of structure
+errortest.asy: 626.9: accessing private field outside of structure
+errortest.asy: 627.4: accessing private field outside of structure
+errortest.asy: 628.4: accessing private field outside of structure
+errortest.asy: 639.4: accessing private field outside of structure
diff --git a/graphics/asymptote/errortest.asy b/graphics/asymptote/errortest.asy
index ac704d35d1..e5ffbb59be 100644
--- a/graphics/asymptote/errortest.asy
+++ b/graphics/asymptote/errortest.asy
@@ -515,22 +515,126 @@
// template import errors
{
- access somefilename(T=int); // Need to specify new name.
- access somefilename(T=int) notas somefilename_int; // "as" misspelled
- access somefilename(int) as somefilename_int; // missing keyword
- import somefilename(T=int); // Templated import not defined.
+ // Need to specify new name.
+ access somefilename(T=int);
+ // "as" misspelled
+ access somefilename(T=int) notas somefilename_int;
+ // missing keyword
+ access somefilename(int) as somefilename_int;
+ // Templated import unsupported
+ import somefilename(T=int);
+ // unexpected template parameters
+ access errortestNonTemplate(T=int) as version;
}
{
typedef import(T); // this file isn't accessed as a template
import typedef(T); // should be "typedef import"
}
{
- // wrong number of params
- access errortestTemplate(A=int, B=string) as ett_a;
+ // wrong number of parameters
+ access errortestBrokenTemplate(A=int, B=string) as ett_a;
// third param incorrectly named
- access errortestTemplate(A=int, B=string, T=real) as ett_b;
+ access errortestBrokenTemplate(A=int, B=string, T=real) as ett_b;
// keywords in wrong order
- access errortestTemplate(A=int, C=real, B=string) as ett_c;
- // errortestTemplate.asy has extra "typedef import"
- access errortestTemplate(A=int, B=string, C=real) as ett_d;
-} \ No newline at end of file
+ access errortestBrokenTemplate(A=int, C=real, B=string) as ett_c;
+ // errortestBrokenTemplate.asy has extra "typedef import"
+ access errortestBrokenTemplate(A=int, B=string, C=real) as ett_d;
+ // expected template parameters
+ access errortestBrokenTemplate as ett_e;
+}
+
+// autounravel errors
+{
+ struct A {
+ static static int x; // too many static modifiers
+ autounravel static int y; // no error
+ static autounravel int z; // no error
+ autounravel autounravel int w; // too many autounravel modifiers
+ autounravel static autounravel int v; // too many autounravel modifiers
+ static autounravel static int u; // too many static modifiers
+ autounravel struct B {} // types cannot be autounraveled
+ }
+}
+{
+ autounravel int x; // top-level fields cannot be autounraveled
+}
+{
+ struct A {
+ autounravel int qaz;
+ autounravel int qaz; // cannot shadow autounravel qaz
+ }
+}
+{
+ // Even if the first (implicitly defined) instance of a function is allowed
+ // to be shadowed, the (explicit) shadower cannot itself be shadowed.
+ struct A {
+ autounravel bool alias(A, A); // no error
+ autounravel bool alias(A, A); // cannot shadow autounravel alias
+ }
+}
+{
+ // Non-statically nested types cannot be used as template parameters.
+ struct A {
+ struct B {
+ autounravel int x;
+ }
+ access somefilename(T=B) as somefilename_B;
+ }
+ A a;
+ access somefilename(T=a.B) as somefilename_B;
+ access somefilename(T=A.B) as somefilename_B;
+}
+{
+ // no error
+ access errortestTemplate(A=int, B=string) as eft;
+ // wrongly ordered names after correct load
+ access errortestTemplate(B=int, A=string) as eft;
+ // completely wrong names after correct load
+ access errortestTemplate(C=int, D=string) as eft;
+ // first name correct, second name wrong
+ access errortestTemplate(A=int, D=string) as eft;
+ // first name wrong, second name correct
+ access errortestTemplate(C=int, B=string) as eft;
+ // too few parameters
+ access errortestTemplate(A=int) as eft;
+ // too many parameters
+ access errortestTemplate(A=int, B=string, C=real) as eft;
+ // templated imports cannot be run directly
+ include errortestTemplate;
+}
+// Test more permissions.
+{
+ struct A {
+ static int x;
+ static int f;
+ static void f();
+ static struct R {}
+ }
+ struct T {
+ private static from A unravel x;
+ private static from A unravel f;
+ private static from A unravel R;
+ }
+ T.x; // incorrectly accessing private field
+ (int)T.f; // incorrectly accessing overloaded private field
+ T.f(); // incorrectly accessing overloaded private field
+ T.R r; // correctly accessing private type
+ struct U {
+ private static unravel A;
+ }
+ U.x; // incorrectly accessing private field
+ (int)U.f; // incorrectly accessing overloaded private field
+ U.f(); // incorrectly accessing overloaded private field
+ U.R r; // correctly accessing private type
+}
+{
+ struct A {
+ static struct B {
+ autounravel int x;
+ }
+ }
+ struct T {
+ private from A unravel B; // x is autounraveled from B
+ }
+ T.x; // incorrectly accessing private field
+}
diff --git a/graphics/asymptote/errortestBrokenTemplate.asy b/graphics/asymptote/errortestBrokenTemplate.asy
new file mode 100644
index 0000000000..f160b42282
--- /dev/null
+++ b/graphics/asymptote/errortestBrokenTemplate.asy
@@ -0,0 +1,5 @@
+// File to be incorrectly imported from errortest.asy.
+typedef import(A, B, C);
+assert(false);
+// typedef import gives an error if not the first line
+typedef import(A, B, C);
diff --git a/graphics/asymptote/errortestNonTemplate.asy b/graphics/asymptote/errortestNonTemplate.asy
new file mode 100644
index 0000000000..ac0d3af259
--- /dev/null
+++ b/graphics/asymptote/errortestNonTemplate.asy
@@ -0,0 +1 @@
+string value="hello world";
diff --git a/graphics/asymptote/errortestTemplate.asy b/graphics/asymptote/errortestTemplate.asy
index f160b42282..1085162661 100644
--- a/graphics/asymptote/errortestTemplate.asy
+++ b/graphics/asymptote/errortestTemplate.asy
@@ -1,5 +1 @@
-// File to be incorrectly imported from errortest.asy.
-typedef import(A, B, C);
-assert(false);
-// typedef import gives an error if not the first line
-typedef import(A, B, C);
+typedef import(A, B); \ No newline at end of file
diff --git a/graphics/asymptote/examples/AiryDisk.asy b/graphics/asymptote/examples/AiryDisk.asy
index 855abfaa95..03c50ecd55 100644
--- a/graphics/asymptote/examples/AiryDisk.asy
+++ b/graphics/asymptote/examples/AiryDisk.asy
@@ -2,7 +2,7 @@ import graph3;
import gsl;
size(10cm,15cm,IgnoreAspect);
-currentprojection=orthographic(150,50,1);
+currentprojection=orthographic(dir(70,60));
real f(pair z) {real r=abs(z); return r == 0 ? 1 : (2.0*J(1,r)/r)^2;}
diff --git a/graphics/asymptote/examples/RiemannSphere.asy b/graphics/asymptote/examples/RiemannSphere.asy
index 40f9d065a3..3fd08cded9 100644
--- a/graphics/asymptote/examples/RiemannSphere.asy
+++ b/graphics/asymptote/examples/RiemannSphere.asy
@@ -2,7 +2,6 @@ import graph3;
import solids;
currentlight=White;
-defaultrender.merge=true;
size(10cm,0);
diff --git a/graphics/asymptote/examples/RiemannSurface.asy b/graphics/asymptote/examples/RiemannSurface.asy
index 92f94bdc72..2a4ba5e4db 100644
--- a/graphics/asymptote/examples/RiemannSurface.asy
+++ b/graphics/asymptote/examples/RiemannSurface.asy
@@ -4,7 +4,7 @@ import palette;
size(200,300,keepAspect=false);
//settings.nothin=true;
-currentprojection=orthographic(10,10,30);
+currentprojection=orthographic(dir(70,60));
currentlight=(10,10,5);
triple f(pair t) {return (exp(t.x)*cos(t.y),exp(t.x)*sin(t.y),t.y);}
diff --git a/graphics/asymptote/examples/RiemannSurfaceRoot.asy b/graphics/asymptote/examples/RiemannSurfaceRoot.asy
index 65098ac935..a824629e05 100644
--- a/graphics/asymptote/examples/RiemannSurfaceRoot.asy
+++ b/graphics/asymptote/examples/RiemannSurfaceRoot.asy
@@ -6,7 +6,7 @@ int n=3;
size(200,300,keepAspect=false);
-currentprojection=orthographic(10,10,30);
+currentprojection=orthographic(dir(60,60));
currentlight=(10,10,5);
triple f(pair t) {return (t.x*cos(t.y),t.x*sin(t.y),t.x^(1/n)*sin(t.y/n));}
diff --git a/graphics/asymptote/examples/arrows3.asy b/graphics/asymptote/examples/arrows3.asy
index b71c08406a..b3b72166cd 100644
--- a/graphics/asymptote/examples/arrows3.asy
+++ b/graphics/asymptote/examples/arrows3.asy
@@ -2,8 +2,6 @@ import three;
size(15cm);
-defaultrender.merge=true;
-
currentprojection=perspective(24,14,13);
currentlight=light(gray(0.5),specularfactor=3,
(0.5,-0.5,-0.25),(0.5,0.5,0.25),(0.5,0.5,1),(-0.5,-0.5,-1));
diff --git a/graphics/asymptote/examples/clockarray.asy b/graphics/asymptote/examples/clockarray.asy
index be7fd899a0..3e4387d388 100644
--- a/graphics/asymptote/examples/clockarray.asy
+++ b/graphics/asymptote/examples/clockarray.asy
@@ -3,8 +3,6 @@ int ny=4;
real xmargin=1cm;
real ymargin=xmargin;
-size(settings.paperwidth,settings.paperheight);
-
picture pic;
real width=settings.paperwidth/nx-xmargin;
real height=settings.paperheight/ny-ymargin;
@@ -36,4 +34,3 @@ pair size=size(f)+(xmargin,ymargin);
for(int i=0; i < nx; ++i)
for(int j=0; j < ny; ++j)
add(shift(realmult(size,(i,j)))*f);
-
diff --git a/graphics/asymptote/examples/cyclohexane.asy b/graphics/asymptote/examples/cyclohexane.asy
index 11b01551c8..fb29287040 100644
--- a/graphics/asymptote/examples/cyclohexane.asy
+++ b/graphics/asymptote/examples/cyclohexane.asy
@@ -36,8 +36,6 @@ triple h12=rotate(120,c6,c5)*h11;
pen Black=gray(0.4);
-defaultrender=render(compression=Zero,merge=true);
-
draw(shift(c1)*carbon,Black);
draw(shift(c2)*carbon,Black);
draw(shift(c3)*carbon,Black);
@@ -45,7 +43,6 @@ draw(shift(c4)*carbon,Black);
draw(shift(c5)*carbon,Black);
draw(shift(c6)*carbon,Black);
-
material White=material(diffusepen=gray(0.4),emissivepen=gray(0.6));
draw(shift(h1)*hydrogen,White);
@@ -61,7 +58,6 @@ draw(shift(h10)*hydrogen,White);
draw(shift(h11)*hydrogen,White);
draw(shift(h12)*hydrogen,White);
-
pen thick=linewidth(10);
draw(c1--c2--c3--c4--c5--c6--cycle,thick);
diff --git a/graphics/asymptote/examples/elevation.asy b/graphics/asymptote/examples/elevation.asy
index 32dbde86c0..e7495c1320 100644
--- a/graphics/asymptote/examples/elevation.asy
+++ b/graphics/asymptote/examples/elevation.asy
@@ -6,8 +6,6 @@ currentprojection=orthographic(0.8,1,1);
size(400,300,IgnoreAspect);
-defaultrender.merge=true;
-
real f(pair z) {return cos(2*pi*z.x)*sin(2*pi*z.y);}
surface s=surface(f,(-1/2,-1/2),(1/2,1/2),50,Spline);
diff --git a/graphics/asymptote/examples/extrudedcontour.asy b/graphics/asymptote/examples/extrudedcontour.asy
index 29b12b5c38..75edda6f67 100644
--- a/graphics/asymptote/examples/extrudedcontour.asy
+++ b/graphics/asymptote/examples/extrudedcontour.asy
@@ -2,9 +2,7 @@ import contour;
import palette;
import graph3;
-defaultrender.merge=true;
-
-currentprojection=orthographic(25,10,10);
+currentprojection=orthographic(dir(60,25));
size(0,12cm);
real a=3;
real b=4;
@@ -22,4 +20,3 @@ surface s=surface(f,(0,0),(10,10),20,Spline);
s.colors(palette(s.map(zpart),Rainbow()+opacity(0.5)));
draw(s);
axes3("$x$","$y$","$z$",Arrow3);
-
diff --git a/graphics/asymptote/examples/filesurface.asy b/graphics/asymptote/examples/filesurface.asy
index bfa500ebf5..f51b0cd3e6 100644
--- a/graphics/asymptote/examples/filesurface.asy
+++ b/graphics/asymptote/examples/filesurface.asy
@@ -3,34 +3,21 @@ import palette;
size3(200,IgnoreAspect);
+currentprojection=perspective(dir(68,225));
+
file in=input("filesurface.dat").line();
real[] x=in;
real[] y=in;
real[][] z=in;
-surface s=surface(z,x,y,linear,linear);
-real[] level=uniform(min(z)*(1-sqrtEpsilon),max(z)*(1+sqrtEpsilon),4);
+surface s=surface(z,x,y);
+real[] level=uniform(min(z)*(1-sqrtEpsilon),max(z)*(1+sqrtEpsilon),256);
s.colors(palette(s.map(new real(triple v) {return find(level >= v.z);}),
Rainbow()));
-draw(s,meshpen=thick(),render(merge=true));
-
-triple m=currentpicture.userMin();
-triple M=currentpicture.userMax();
-triple target=0.5*(m+M);
+draw(s,meshpen=thick(),render(tessellate=true));
xaxis3("$x$",Bounds,InTicks);
yaxis3("$y$",Bounds,InTicks(Step=1,step=0.1));
zaxis3("$z$",Bounds,InTicks);
-
-/*
- picture palette;
- size3(palette,1cm);
- draw(palette,unitcube,red);
- frame F=palette.fit3();
- add(F,(M.x,m.y,m.z));
-*/
-
-currentprojection=perspective(camera=target+realmult(dir(68,225),M-m),
- target=target);
diff --git a/graphics/asymptote/examples/gamma3.asy b/graphics/asymptote/examples/gamma3.asy
index 6fc56065cb..87ec463de9 100644
--- a/graphics/asymptote/examples/gamma3.asy
+++ b/graphics/asymptote/examples/gamma3.asy
@@ -2,7 +2,7 @@ import graph3;
import palette;
size(12cm,IgnoreAspect);
-currentprojection=orthographic(1,-2,1);
+currentprojection=orthographic(dir(80,290));
real X=4.5;
real M=abs(gamma((X,0)));
@@ -22,7 +22,7 @@ real Arg(triple v)
}
s.colors(palette(s.map(Arg),Wheel()));
-draw(s,render(compression=Low,merge=true));
+draw(s,render(tessellate=false));
real xmin=point((-1,-1,-1)).x;
real xmax=point((1,1,1)).x;
diff --git a/graphics/asymptote/examples/pdb.asy b/graphics/asymptote/examples/pdb.asy
index 68cec9e367..ff773beea2 100644
--- a/graphics/asymptote/examples/pdb.asy
+++ b/graphics/asymptote/examples/pdb.asy
@@ -7,8 +7,9 @@ import cpkcolors;
currentlight=White;
//currentlight=nolight;
-defaultrender.merge=true; // Fast low-quality rendering
-//defaultrender.merge=false; // Slow high-quality rendering
+//defaultrender.merge=true; // Fast low-quality PRC rendering
+//defaultrender.merge=false; // Slow high-quality PRC rendering
+
bool pixel=false; // Set to true to draw dots as pixels.
real width=6;
diff --git a/graphics/asymptote/examples/projectelevation.asy b/graphics/asymptote/examples/projectelevation.asy
index 6ffe512663..6e6bc2bed3 100644
--- a/graphics/asymptote/examples/projectelevation.asy
+++ b/graphics/asymptote/examples/projectelevation.asy
@@ -2,9 +2,10 @@ import graph3;
import grid3;
import palette;
-currentprojection=orthographic(0.8,1,2);
size(400,300,IgnoreAspect);
+currentprojection=orthographic(dir(50,50));
+
real f(pair z) {return cos(2*pi*z.x)*sin(2*pi*z.y);}
surface s=surface(f,(-1/2,-1/2),(1/2,1/2),50,Spline);
@@ -12,6 +13,6 @@ surface s=surface(f,(-1/2,-1/2),(1/2,1/2),50,Spline);
surface S=planeproject(unitsquare3)*s;
S.colors(palette(s.map(zpart),Rainbow()));
draw(S,nolight);
-draw(s,lightgray+opacity(0.7));
+draw(s,lightgray+opacity(0.7),render(tessellate=false));
grid3(XYZgrid);
diff --git a/graphics/asymptote/examples/slidedemo.asy b/graphics/asymptote/examples/slidedemo.asy
index 107564601f..99833e0ee6 100644
--- a/graphics/asymptote/examples/slidedemo.asy
+++ b/graphics/asymptote/examples/slidedemo.asy
@@ -1,3 +1,5 @@
+settings.tex="pdflatex";
+
// Slide demo.
// Command-line options to enable stepping and/or reverse video:
// asy [-u stepping=true] [-u reverse=true] [-u itemstep=true] slidedemo
diff --git a/graphics/asymptote/examples/smoothelevation.asy b/graphics/asymptote/examples/smoothelevation.asy
index a7995b7079..310e2c201d 100644
--- a/graphics/asymptote/examples/smoothelevation.asy
+++ b/graphics/asymptote/examples/smoothelevation.asy
@@ -6,7 +6,7 @@ currentlight=Viewport;
if(settings.render <= 0) settings.prc=false;
-currentprojection=orthographic(1,2,13);
+currentprojection=orthographic(dir(40,60));
size(400,300,IgnoreAspect);
@@ -15,7 +15,7 @@ real f(pair z) {return cos(2*pi*z.x)*sin(2*pi*z.y);}
surface s=surface(f,(-1/2,-1/2),(1/2,1/2),20,Spline);
s.colors(palette(s.map(zpart),Rainbow()));
-draw(s);
+draw(s,render(tessellate=false));
scale(true);
diff --git a/graphics/asymptote/examples/soccerball.asy b/graphics/asymptote/examples/soccerball.asy
index 68a95edbdc..b83245b10f 100644
--- a/graphics/asymptote/examples/soccerball.asy
+++ b/graphics/asymptote/examples/soccerball.asy
@@ -3,8 +3,6 @@ size(400);
currentlight.background=palegreen;
settings.digits=15;
-defaultrender=render(compression=Zero,merge=true);
-
real c=(1+sqrt(5))/2;
triple[] z={(c,1,0),(-c,1,0),(-c,-1,0),(c,-1,0)};
diff --git a/graphics/asymptote/examples/splitpatch.asy b/graphics/asymptote/examples/splitpatch.asy
index 1fa9325f4c..ff870c7b85 100644
--- a/graphics/asymptote/examples/splitpatch.asy
+++ b/graphics/asymptote/examples/splitpatch.asy
@@ -80,8 +80,6 @@ triple[][] B=
split S=split(B,A);
-defaultrender.merge=true;
-
for(int i=0; i < S.S[0].s.length; ++i)
draw(surface(S.S[0].s[i]),Pen(i));
diff --git a/graphics/asymptote/examples/teapot.asy b/graphics/asymptote/examples/teapot.asy
index 7a12cc3a66..26a2b129af 100644
--- a/graphics/asymptote/examples/teapot.asy
+++ b/graphics/asymptote/examples/teapot.asy
@@ -203,21 +203,21 @@ triple[][][] Q0={
};
-surface regularize(triple[][] P, real fraction=0.02)
+surface regularize(triple[][] P, real fraction=0.002)
{
triple[][][] B=hsplit(P,fraction);
triple[][] T=B[0];
- surface s=surface(T[0][0]..controls T[0][1] and T[0][2]..
- T[0][3]..controls T[1][3] and T[2][3]..
- T[3][3]..controls T[3][2] and T[3][1]..cycle);
+ surface s=surface(T[0][0]..controls T[3][1] and T[3][2]..
+ T[3][3]..controls T[2][3] and T[1][3]..
+ T[0][3]..controls T[0][2] and T[0][1]..cycle);
s.append(surface(patch(B[1])));
return s;
}
surface S=surface(Q);
for(triple[][] q : Q0)
- // S.append(regularize(q));
- S.append(surface(patch(q)));
+ S.append(regularize(q));
+// S.append(surface(patch(q)));
pen color;
real metallic;
diff --git a/graphics/asymptote/examples/truncatedIcosahedron.asy b/graphics/asymptote/examples/truncatedIcosahedron.asy
index 092f96a4e6..d69cec9382 100644
--- a/graphics/asymptote/examples/truncatedIcosahedron.asy
+++ b/graphics/asymptote/examples/truncatedIcosahedron.asy
@@ -2,8 +2,6 @@ import graph3;
size(200);
-defaultrender.merge=true;
-
real c=(1+sqrt(5))/2;
triple[] z={(c,1,0),(-c,1,0),(-c,-1,0),(c,-1,0)};
@@ -64,6 +62,3 @@ for(int i=0; i < P.length; ++i) {
draw(surface(reverse(operator--(...fiveout)--cycle)^^
operator--(...fivein)--cycle,planar=true),cyan);
}
-
-
-
diff --git a/graphics/asymptote/examples/twistedtubes.asy b/graphics/asymptote/examples/twistedtubes.asy
index ee25cd0bd3..316b875cca 100644
--- a/graphics/asymptote/examples/twistedtubes.asy
+++ b/graphics/asymptote/examples/twistedtubes.asy
@@ -22,8 +22,6 @@ s2.colors(palette(s2.map(f),Rainbow));
s3.colors(palette(s3.map(f),Rainbow));
s4.colors(palette(s4.map(f),Rainbow));
-defaultrender.merge=true;
-
draw(s1);
draw(s2);
draw(s3);
diff --git a/graphics/asymptote/examples/venn.asy b/graphics/asymptote/examples/venn.asy
index 33100a72e8..82e783fdb7 100644
--- a/graphics/asymptote/examples/venn.asy
+++ b/graphics/asymptote/examples/venn.asy
@@ -31,6 +31,6 @@ margin BigMargin=Margin(0,m*dot(unit(z1-z),unit(z0-z)));
draw(Label("$A\cap B$",0),conj(z)--z0,Arrow,BigMargin);
draw(Label("$A\cup B$",0),z--z0,Arrow,BigMargin);
draw(z--z1,Arrow,Margin(0,m));
-draw(z--z2,Arrow,Margin(0,m));
+draw(KEY="34.5",z--z2,Arrow,Margin(0,m));
shipout(bbox(0.25cm));
diff --git a/graphics/asymptote/exithandlers.cc b/graphics/asymptote/exithandlers.cc
new file mode 100644
index 0000000000..3c6e2fee88
--- /dev/null
+++ b/graphics/asymptote/exithandlers.cc
@@ -0,0 +1,57 @@
+/**
+ * @file exithandlers.cc
+ * @brief Definitions for exit handlers
+ */
+
+#include "exithandlers.h"
+
+#include <csignal>
+
+#include "common.h"
+#include "util.h"
+#include "interact.h"
+#include "errormsg.h"
+#include "vm.h"
+
+#ifdef HAVE_LIBFFTW3
+#include "fftw++.h"
+#endif
+
+void interruptHandler(int)
+{
+#ifdef HAVE_LIBFFTW3
+ fftwpp::saveWisdom();
+#endif
+ em.Interrupt(true);
+}
+
+bool hangup=false;
+
+int returnCode()
+{
+ return em.processStatus() || interact::interactive ? 0 : 1;
+}
+
+void exitHandler(int)
+{
+#if defined(HAVE_READLINE) && defined(HAVE_LIBCURSES)
+ rl_cleanup_after_signal();
+#endif
+ exit(returnCode());
+}
+
+void signalHandler(int)
+{
+ // Print the position and trust the shell to print an error message.
+ em.runtime(vm::getPos());
+
+#if !defined(_WIN32)
+ Signal(SIGBUS,SIG_DFL);
+#endif
+ Signal(SIGFPE,SIG_DFL);
+}
+
+void hangup_handler(int sig)
+{
+ hangup=true;
+}
diff --git a/graphics/asymptote/exithandlers.h b/graphics/asymptote/exithandlers.h
new file mode 100644
index 0000000000..efc3931fe5
--- /dev/null
+++ b/graphics/asymptote/exithandlers.h
@@ -0,0 +1,15 @@
+/**
+ * @file exithandlers.h
+ * @brief Declarations for exit handlers
+ */
+
+#pragma once
+
+int returnCode();
+
+extern bool hangup;
+
+void interruptHandler(int);
+void exitHandler(int);
+void signalHandler(int);
+void hangup_handler(int sig);
diff --git a/graphics/asymptote/exp.cc b/graphics/asymptote/exp.cc
index 8f8ebae097..28f16c477b 100644
--- a/graphics/asymptote/exp.cc
+++ b/graphics/asymptote/exp.cc
@@ -22,7 +22,7 @@
#include "stm.h"
#include "inst.h"
#include "opsymbols.h"
-#include "process.h"
+#include "asyprocess.h"
//void runCode(absyntax::block *code);
@@ -103,7 +103,7 @@ void exp::testCachedType(coenv &e) {
em.compiler(getPos());
em << "cached type '" << *ct
<< "' doesn't match actual type '" << *t << "'";
- em.sync();
+ em.sync(true);
}
}
}
@@ -143,9 +143,9 @@ types::ty *tempExp::trans(coenv &e) {
varEntryExp::varEntryExp(position pos, types::ty *t, access *a)
- : exp(pos), v(new trans::varEntry(t, a, 0, position())) {}
+ : exp(pos), v(new trans::varEntry(t, a, 0, nullPos)) {}
varEntryExp::varEntryExp(position pos, types::ty *t, vm::bltin f)
- : exp(pos), v(new trans::varEntry(t, new bltinAccess(f), 0, position())) {}
+ : exp(pos), v(new trans::varEntry(t, new bltinAccess(f), 0, nullPos)) {}
void varEntryExp::prettyprint(ostream &out, Int indent) {
prettyname(out, "varEntryExp", indent, getPos());
@@ -187,31 +187,6 @@ void nameExp::prettyprint(ostream &out, Int indent)
value->prettyprint(out, indent+1);
}
-void nameExp::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- AsymptoteLsp::SymbolLit accessedName(value->getLit());
- position basePos = getPos();
- AsymptoteLsp::filePos castedPos = dynamic_cast<qualifiedName*>(value) ?
- std::make_pair(stdString(basePos.filename()),
- std::make_pair(basePos.Line(), basePos.Column() + 1)) :
- static_cast<AsymptoteLsp::filePos>(basePos);
-
- auto varUsageIt = symContext->symMap.varUsage.find(accessedName);
- if (varUsageIt == symContext->symMap.varUsage.end())
- {
- symContext->symMap.varUsage.emplace(accessedName, castedPos);
- }
- else
- {
- varUsageIt->second.add(castedPos);
- }
-
- symContext->symMap.usageByLines.emplace_back(castedPos.second, accessedName);
-#endif
-}
-
-
void fieldExp::pseudoName::prettyprint(ostream &out, Int indent)
{
// This should never be called.
@@ -740,12 +715,7 @@ void argument::prettyprint(ostream &out, Int indent)
val->prettyprint(out, indent+1);
}
-void argument::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- val->createSymMap(symContext);
-#endif
-}
+
void arglist::prettyprint(ostream &out, Int indent)
{
@@ -755,15 +725,7 @@ void arglist::prettyprint(ostream &out, Int indent)
p->prettyprint(out, indent+1);
}
-void arglist::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- for (auto& p: args)
- {
- p.createSymMap(symContext);
- }
-#endif
-}
+
void callExp::prettyprint(ostream &out, Int indent)
{
@@ -1083,80 +1045,6 @@ bool callExp::resolved(coenv &e) {
return cachedApp || cachedVarEntry;
}
-void callExp::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- callee->createSymMap(symContext);
- args->createSymMap(symContext);
-
- if (auto col=getColorInformation())
- {
- auto const& v=col.value();
- auto const& colVal=std::get<0>(v);
- auto const& alpha=std::get<1>(v);
- auto const& beginArgPos=std::get<2>(v);
- auto const& lastArgPos=std::get<3>(v);
- if (alpha.has_value())
- {
-
- auto const& red=std::get<0>(colVal);
- auto const& green=std::get<1>(colVal);
- auto const& blue=std::get<2>(colVal);
- std::tuple<double, double, double, double> rgba(red, green, blue, alpha.value());
-
- symContext->addRGBAColor(rgba, beginArgPos, lastArgPos);
- }
- else
- {
- symContext->addRGBColor(colVal, beginArgPos, lastArgPos);
- }
- }
-#endif
-}
-
-
-optional<std::tuple<callExp::colorInfo, optional<double>, AsymptoteLsp::posInFile, AsymptoteLsp::posInFile>>
-callExp::getColorInformation()
-{
-#ifdef HAVE_LSP
- if (auto* namedCallee = dynamic_cast<nameExp*>(callee))
- {
- std::string calleeName = static_cast<std::string>(namedCallee->getName());
- std::vector<double> colors;
-
- auto getLineColumn = [&argsval = args->args](int const& idx)
- {
- return argsval[idx].val->getPos().LineColumn();
- };
-
- if (calleeName == "rgb" || calleeName == "rgba")
- {
- for (auto const& expVec : args->args)
- {
- if (auto* valExp=dynamic_cast<realExp*>(expVec.val))
- {
- colors.push_back(valExp->getValue<double>());
- } else if (auto* valExpI=dynamic_cast<intExp*>(expVec.val))
- {
- colors.push_back(valExpI->getValue<double>());
- }
- }
- }
- if (calleeName == "rgb" && colors.size() == 3)
- {
- callExp::colorInfo col(colors[0], colors[1], colors[2]);
- return std::make_tuple(col, optional<double>(), callee->getPos().LineColumn(), getLineColumn(2));
- }
- else if (calleeName == "rgba" && colors.size() == 4)
- {
- callExp::colorInfo col(colors[0], colors[1], colors[2]);
- return std::make_tuple(col, optional<double>(colors[3]), callee->getPos().LineColumn(), getLineColumn(3));
- }
- }
-#endif
- return nullopt;
-}
-
void pairExp::prettyprint(ostream &out, Int indent)
{
prettyname(out, "pairExp",indent, getPos());
@@ -1272,12 +1160,6 @@ types::ty *castExp::getType(coenv &e)
return target->trans(e, true);
}
-void castExp::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- castee->createSymMap(symContext);
-#endif
-}
void conditionalExp::prettyprint(ostream &out, Int indent)
@@ -1558,14 +1440,6 @@ types::ty *assignExp::getType(coenv &e)
return t ? t : primError();
}
-void assignExp::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- dest->createSymMap(symContext);
- value->createSymMap(symContext);
-#endif
-}
-
void selfExp::prettyprint(ostream &out, Int indent)
{
diff --git a/graphics/asymptote/fileio.cc b/graphics/asymptote/fileio.cc
index b28269b2b1..2b7025b13f 100644
--- a/graphics/asymptote/fileio.cc
+++ b/graphics/asymptote/fileio.cc
@@ -8,6 +8,10 @@
#include "fileio.h"
#include "settings.h"
+#if !defined(_WIN32)
+#define _fdopen fdopen
+#endif
+
namespace camp {
FILE *pipeout=NULL;
@@ -18,6 +22,93 @@ string newline="\n";
ofile Stdout("");
file nullfile("",false,NOMODE,false,true);
+void openpipeout()
+{
+ int fd=intcast(settings::getSetting<Int>("outpipe"));
+ if(!pipeout && fd >= 0) pipeout=_fdopen(fd,"w");
+ if(!pipeout) {
+ cerr << "Cannot open outpipe " << fd << endl;
+ exit(-1);
+ }
+}
+
+string locatefile(string name)
+{
+ string s=settings::locateFile(name,false,"");
+ return s.empty() ? name : s;
+}
+
+bool file::Standard()
+{
+ return standard;
+}
+
+void file::standardEOF()
+{
+#if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES)
+ cout << endl;
+#endif
+}
+
+void file::purgeStandard(string&)
+{
+ if(cin.eof())
+ standardEOF();
+}
+
+void file::dimension(Int Nx, Int Ny, Int Nz)
+{
+ if(Nx < -2 || Ny < -2 || Nz < -2) {
+ ostringstream buf;
+ buf << "Invalid array dimensions: " << Nx << ", " << Ny << ", " << Nz;
+ reportError(buf);
+ }
+
+ nx=Nx; ny=Ny; nz=Nz;
+}
+
+file::file(string const& name, bool check, Mode type, bool binary, bool closed) :
+ name(name), check(check), type(type), linemode(false), csvmode(false),
+ wordmode(false), singlereal(false), singleint(true), signedint(true),
+ closed(closed), standard(name.empty()), binary(binary), nullfield(false)
+{
+ whitespace="";
+ dimension();
+}
+
+void file::Check()
+{
+ if(error()) {
+ ostringstream buf;
+ buf << "Cannot open file \"" << name << "\"";
+ reportError(buf);
+ }
+}
+
+file::~file()
+{
+
+}
+
+bool file::isOpen()
+{
+ if(closed) {
+ ostringstream buf;
+ buf << "I/O operation attempted on ";
+ if(name != "") buf << "closed file \'" << name << "\'";
+ else buf << "null file";
+ reportError(buf);
+ }
+ return true;
+}
+void file::unsupported(char const* rw, char const* type)
+{
+ ostringstream buf;
+ buf << rw << " of type " << type << " not supported in " << FileMode()
+ << " mode";
+ reportError(buf);
+}
+
void ifile::open()
{
if(standard) {
@@ -253,4 +344,111 @@ void ofile::writeline()
if(errorstream::interrupt) {interact::lines=0; throw interrupted();}
}
+void ofile::open()
+{
+ if(standard) {
+ if(mode & std::ios::binary)
+ reportError("Cannot open standard output in binary mode");
+ stream=&cout;
+ } else {
+ name=outpath(name);
+ stream=fstream=new std::ofstream(name.c_str(),mode | std::ios::trunc);
+ stream->precision(settings::getSetting<Int>("digits"));
+ index=processData().ofile.add(fstream);
+ Check();
+ }
+}
+
+void ofile::close()
+{
+ if(!standard && fstream) {
+ fstream->close();
+ closed=true;
+ delete fstream;
+ fstream=NULL;
+ processData().ofile.remove(index);
+ }
+}
+
+Int ofile::precision(Int p)
+{
+ return p == 0 ? stream->precision(settings::getSetting<Int>("digits")) :
+ stream->precision(p);
+}
+
+void ofile::seek(Int pos, bool begin)
+{
+ if(!standard && fstream) {
+ clear();
+ fstream->seekp(pos,begin ? std::ios::beg : std::ios::end);
+ }
+}
+size_t ofile::tell()
+{
+ if(fstream)
+ return fstream->tellp();
+ else
+ return 0;
+}
+
+bool ofile::enabled()
+{
+ return !standard || settings::verbose > 1 ||
+ interact::interactive || !settings::getSetting<bool>("quiet");
+}
+
+void opipe::write(const string& val) {
+ if (fprintf(pipeout,"%s",val.c_str()) < 0)
+ {
+ reportError("Write failed to pipe");
+ }
+}
+
+void opipe::flush()
+{
+ if(pipeout)
+ {
+ if (fflush(pipeout) == EOF)
+ {
+ reportError("Flushing pipe failed");
+ }
+ }
+}
+
+void iofile::writeline()
+{
+ *fstream << newline;
+ if(errorstream::interrupt) throw interrupted();
+}
+
+#ifdef HAVE_LIBTIRPC
+
+void igzxfile::open()
+{
+ name=locatefile(inpath(name));
+ gzfile=gzopen(name.c_str(),"rb");
+ Check();
+
+ while(!gzeof(gzfile)) {
+ std::vector<char> tmpBuf(readSize);
+ auto filSz = gzread(gzfile,tmpBuf.data(),readSize);
+ std::copy(tmpBuf.begin(),tmpBuf.begin()+filSz,std::back_inserter(readData));
+ }
+ gzclose(gzfile);
+
+ fstream=new xdr::memixstream(readData);
+ index=processData().ixfile.add(fstream);
+}
+
+void igzxfile::closeFile()
+{
+ if(fstream) {
+ fstream->close();
+ closed=true;
+ delete fstream;
+ processData().ixfile.remove(index);
+ }
+}
+#endif
+
} // namespace camp
diff --git a/graphics/asymptote/fileio.h b/graphics/asymptote/fileio.h
index e23bf343f6..607b7ef567 100644
--- a/graphics/asymptote/fileio.h
+++ b/graphics/asymptote/fileio.h
@@ -28,9 +28,9 @@
#include "interact.h"
#include "errormsg.h"
#include "util.h"
-#include "process.h"
+#include "asyprocess.h"
#include "locate.h"
-#include "parser.h"
+#include "asyparser.h"
namespace vm {
extern bool indebugger;
@@ -51,20 +51,8 @@ static const string FileModes[]=
extern FILE *pipeout;
-inline void openpipeout()
-{
- int fd=intcast(settings::getSetting<Int>("outpipe"));
- if(!pipeout && fd >= 0) pipeout=fdopen(fd,"w");
- if(!pipeout) {
- cerr << "Cannot open outpipe " << fd << endl;
- exit(-1);
- }
-}
-
-inline string locatefile(string name) {
- string s=settings::locateFile(name,false,"");
- return s.empty() ? name : s;
-}
+void openpipeout();
+string locatefile(string name);
class file : public gc {
protected:
@@ -90,16 +78,11 @@ protected:
public:
- bool Standard() {return standard;}
-
+ bool Standard();
bool enabled() {return !standard || settings::verbose > 1 ||
interact::interactive || !settings::getSetting<bool>("quiet");}
- void standardEOF() {
-#if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES)
- cout << endl;
-#endif
- }
+ void standardEOF();
template<class T>
void purgeStandard(T&) {
@@ -117,50 +100,20 @@ public:
}
}
- void purgeStandard(string&) {
- if(cin.eof())
- standardEOF();
- }
+ void purgeStandard(string&);
- void dimension(Int Nx=-1, Int Ny=-1, Int Nz=-1) {
- if(Nx < -2 || Ny < -2 || Nz < -2) {
- ostringstream buf;
- buf << "Invalid array dimensions: " << Nx << ", " << Ny << ", " << Nz;
- reportError(buf);
- }
-
- nx=Nx; ny=Ny; nz=Nz;
- }
+ void dimension(Int Nx=-1, Int Ny=-1, Int Nz=-1);
file(const string& name, bool check=true, Mode type=NOMODE,
- bool binary=false, bool closed=false) :
- name(name), check(check), type(type), linemode(false), csvmode(false),
- wordmode(false), singlereal(false), singleint(true), signedint(true),
- closed(closed), standard(name.empty()), binary(binary), nullfield(false),
- whitespace("") {dimension();}
+ bool binary=false, bool closed=false);
virtual void open() {}
- void Check() {
- if(error()) {
- ostringstream buf;
- buf << "Cannot open file \"" << name << "\"";
- reportError(buf);
- }
- }
+ void Check();
- virtual ~file() {}
+ virtual ~file();
- bool isOpen() {
- if(closed) {
- ostringstream buf;
- buf << "I/O operation attempted on ";
- if(name != "") buf << "closed file \'" << name << "\'";
- else buf << "null file";
- reportError(buf);
- }
- return true;
- }
+ bool isOpen();
string filename() {return name;}
virtual bool eol() {return false;}
@@ -177,12 +130,7 @@ public:
string FileMode() {return FileModes[type];}
- void unsupported(const char *rw, const char *type) {
- ostringstream buf;
- buf << rw << " of type " << type << " not supported in " << FileMode()
- << " mode";
- reportError(buf);
- }
+ void unsupported(const char *rw, const char *type);
void noread(const char *type) {unsupported("Read",type);}
void nowrite(const char *type) {unsupported("Write",type);}
@@ -286,7 +234,7 @@ public:
bool eof() {return pipeout ? feof(pipeout) : true;}
bool error() {return pipeout ? ferror(pipeout) : true;}
void clear() {if(pipeout) clearerr(pipeout);}
- void flush() {if(pipeout) fflush(pipeout);}
+ void flush();
void seek(Int pos, bool begin=true) {
if(!standard && pipeout) {
@@ -299,9 +247,7 @@ public:
return pipeout ? ftell(pipeout) : 0;
}
- void write(const string& val) {
- fprintf(pipeout,"%s",val.c_str());
- }
+ void write(const string& val);
void write(bool val) {
ostringstream s;
@@ -447,10 +393,7 @@ public:
void write(guide *val) {*fstream << *val;}
void write(const transform& val) {*fstream << val;}
- void writeline() {
- *fstream << newline;
- if(errorstream::interrupt) throw interrupted();
- }
+ void writeline();
};
class ofile : public file {
@@ -465,53 +408,22 @@ public:
~ofile() {close();}
- void open() {
- if(standard) {
- if(mode & std::ios::binary)
- reportError("Cannot open standard output in binary mode");
- stream=&cout;
- } else {
- name=outpath(name);
- stream=fstream=new std::ofstream(name.c_str(),mode | std::ios::trunc);
- stream->precision(settings::getSetting<Int>("digits"));
- index=processData().ofile.add(fstream);
- Check();
- }
- }
+ void open();
bool text() {return true;}
bool eof() {return stream->eof();}
bool error() {return stream->fail();}
- void close() {
- if(!standard && fstream) {
- fstream->close();
- closed=true;
- delete fstream;
- fstream=NULL;
- processData().ofile.remove(index);
- }
- }
+ void close();
void clear() {stream->clear();}
- Int precision(Int p) {
- return p == 0 ? stream->precision(settings::getSetting<Int>("digits")) :
- stream->precision(p);
- }
+ Int precision(Int p);
void flush() {stream->flush();}
- void seek(Int pos, bool begin=true) {
- if(!standard && fstream) {
- clear();
- fstream->seekp(pos,begin ? std::ios::beg : std::ios::end);
- }
- }
+ void seek(Int pos, bool begin=true);
- size_t tell() {
- if(fstream)
- return fstream->tellp();
- else
- return 0;
- }
+ size_t tell();
+
+ bool enabled();
void write(bool val) {*stream << (val ? "true " : "false ");}
void write(Int val) {*stream << val;}
@@ -734,21 +646,7 @@ public:
bool error() override {return !gzfile;}
- void open() override {
- name=locatefile(inpath(name));
- gzfile=gzopen(name.c_str(),"rb");
- Check();
-
- while(!gzeof(gzfile)) {
- std::vector<char> tmpBuf(readSize);
- auto filSz = gzread(gzfile,tmpBuf.data(),readSize);
- std::copy(tmpBuf.begin(),tmpBuf.begin()+filSz,std::back_inserter(readData));
- }
- gzclose(gzfile);
-
- fstream=new xdr::memixstream(readData);
- index=processData().ixfile.add(fstream);
- }
+ void open() override;
void close() override {
closeFile();
@@ -758,15 +656,7 @@ public:
protected:
- void closeFile()
- {
- if(fstream) {
- fstream->close();
- closed=true;
- delete fstream;
- processData().ixfile.remove(index);
- }
- }
+ void closeFile();
};
class ioxfile : public ixfile {
diff --git a/graphics/asymptote/findsym.pl b/graphics/asymptote/findsym.pl
deleted file mode 100755
index 9cfe6c131b..0000000000
--- a/graphics/asymptote/findsym.pl
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env perl
-#####
-# findsym.pl
-# Andy Hammerlindl 2010/06/01
-#
-# Extract static symbols used in builtin.cc and write code so that they are
-# translated only once when creating the symbol table.
-#####
-
-$outname = shift(@ARGV);
-if (not $outname) {
- print STDERR "usage ./findsym.pl out_symbols.h file1.cc file2.cc ...\n";
- exit(1);
-}
-
-open(header, ">$outname") ||
- die("Couldn't open $outname for writing");
-
-print header <<END;
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-END
-
-sub add {
- print header "ADDSYMBOL(".$_[0].");\n";
-}
-
-my %symbols = ();
-
-foreach my $inname (@ARGV) {
- open(infile, $inname) ||
- die("Couldn't open $inname");
- while (<infile>) {
- while (m/SYM\(([_A-Za-z][_A-Za-z0-9]*)\)/gx) {
- $symbols{ $1 } = 1;
- }
- }
-}
-
-foreach my $s (sort keys %symbols) {
- add($s);
-}
diff --git a/graphics/asymptote/findsym.py b/graphics/asymptote/findsym.py
new file mode 100644
index 0000000000..5682fcc53a
--- /dev/null
+++ b/graphics/asymptote/findsym.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python3
+#####
+# findsym2.py
+# Translated from findsym.pl
+#
+# This script scans through multiple C++ source files to find all occurrences
+# of the SYM(symbol_name) macro. It collects these unique symbol names and
+# generates a header file containing declarations for these symbols. The purpose
+# is to ensure that each symbol is translated only once when creating the
+# symbol table.
+#####
+
+import re
+import sys
+import textwrap
+
+# Retrieve the first command-line argument, which should be the name of the
+# output header file.
+if len(sys.argv) < 2:
+ print(
+ "usage: ./findsym2.py out_symbols.h file1.cc file2.cc ...",
+ file=sys.stderr,
+ )
+ sys.exit(1)
+
+_, outname, *innames = sys.argv
+
+# Attempt to open the output file in write mode.
+with open(outname, "w", encoding="utf-8") as header:
+
+ # Write a predefined header comment block to the output file.
+ header.write(
+ textwrap.dedent(
+ """\
+ /*****
+ * This file is automatically generated by findsym.py
+ * Changes will be overwritten.
+ *****/
+
+ // If the ADDSYMBOL macro is not already defined, define it with the default
+ // purpose of referring to an external pre-translated symbol, such that
+ // SYM(name) also refers to that symbol.
+ #ifndef ADDSYMBOL
+ #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
+ #define SYM(name) PRETRANSLATED_SYMBOL_##name
+ #endif
+
+ """
+ )
+ )
+
+ # Initialize an empty set to store unique symbols.
+ symbols = set()
+
+ # Iterate over each remaining command-line argument, which should be the names
+ # of C++ source files to process.
+ for inname in innames:
+ # Attempt to open the current input file in read mode.
+ with open(inname, "r", encoding="utf-8") as infile:
+ # Read the input file line by line.
+ for line in infile:
+ # Use a regular expression to find all occurrences of the SYM macro
+ # with a valid symbol name inside parentheses.
+ matches = re.findall(r"SYM\(([_A-Za-z][_A-Za-z0-9]*)\)", line)
+ for match in matches:
+ # Add each matched symbol name to the symbols set.
+ symbols.add(match)
+
+ # After collecting all unique symbols, iterate over the sorted list of symbol
+ # names.
+ for symbol in sorted(symbols):
+ # Concatenate the ADDSYMBOL macro with the provided symbol name and a
+ # newline character, then write it to the header file.
+ header.write(f"ADDSYMBOL({symbol});\n")
diff --git a/graphics/asymptote/fundec.cc b/graphics/asymptote/fundec.cc
index 997161f882..99e8f436c1 100644
--- a/graphics/asymptote/fundec.cc
+++ b/graphics/asymptote/fundec.cc
@@ -189,27 +189,6 @@ void formal::transAsVar(coenv &e, Int index) {
}
}
-void formal::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- if (start)
- {
- start->createSymMap(symContext);
- }
-#endif
-}
-
-#ifdef HAVE_LSP
-std::pair<std::string, optional<std::string>> formal::fnInfo() const
-{
- std::string typeName(static_cast<std::string>(*base));
- return start != nullptr ?
- std::make_pair(typeName,
- make_optional(static_cast<std::string>(start->getName()))
- ) :
- std::make_pair(typeName, nullopt);
-}
-#endif
void formals::trans(coenv &e)
{
@@ -226,37 +205,6 @@ void formals::trans(coenv &e)
}
}
-void formals::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- for (auto& field: fields)
- {
- field->createSymMap(symContext);
- }
-
- if (rest)
- {
- rest->createSymMap(symContext);
- }
-#endif
-}
-
-void formals::addArgumentsToFnInfo(AsymptoteLsp::FunctionInfo& fnInfo)
-{
-#ifdef HAVE_LSP
- for (auto const& field: fields)
- {
- fnInfo.arguments.emplace_back(field->fnInfo());
- }
-
- if (rest)
- {
- fnInfo.restArgs=rest->fnInfo();
- }
- // handle rest case as well
-#endif
-}
-
void fundef::prettyprint(ostream &out, Int indent)
{
result->prettyprint(out, indent+1);
@@ -274,21 +222,11 @@ function *fundef::transTypeAndAddOps(coenv &e, record *r, bool tacit) {
params->addOps(e,r);
function *ft=transType(e, tacit);
- e.e.addFunctionOps(ft);
- if (r)
- r->e.addFunctionOps(ft);
+ // No function ops to add.
return ft;
}
-void fundef::addArgumentsToFnInfo(AsymptoteLsp::FunctionInfo& fnInfo)
-{
-#ifdef HAVE_LSP
- params->addArgumentsToFnInfo(fnInfo);
- // handle rest case as well
-#endif
-}
-
varinit *fundef::makeVarInit(function *ft) {
struct initializer : public varinit {
fundef *f;
@@ -341,18 +279,7 @@ void fundef::baseTrans(coenv &e, types::function *ft)
}
types::ty *fundef::trans(coenv &e) {
- // I don't see how addFunctionOps can be useful here.
- // For instance, in
- //
- // new void() {} == null
- //
- // callExp has to search for == before translating either argument, and the
- // operator cannot be added before translation. (getType() is not allowed to
- // manipulate the environment.)
- // A new function expression is assigned to a variable, given as a return
- // value, or used as an argument to a function. In any of these
- //
- // We must still addOps though, for the return type and formals. ex:
+ // We must addOps for the return type and formals. ex:
//
// new guide[] (guide f(int)) {
// return sequence(f, 10);
@@ -365,17 +292,6 @@ types::ty *fundef::trans(coenv &e) {
return ft;
}
-void fundef::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- auto* declCtx(symContext->newContext<AsymptoteLsp::AddDeclContexts>(
- getPos().LineColumn()
- ));
- params->createSymMap(declCtx);
- body->createSymMap(declCtx);
-#endif
-}
-
void fundec::prettyprint(ostream &out, Int indent)
{
prettyindent(out, indent);
@@ -397,17 +313,6 @@ void fundec::transAsField(coenv &e, record *r)
createVar(getPos(), e, r, id, ft, fun.makeVarInit(ft));
}
-void fundec::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- AsymptoteLsp::FunctionInfo& fnInfo=
- symContext->symMap.addFunDef(static_cast<std::string>(id),
- getPos().LineColumn(),
- static_cast<std::string>(*fun.result)
- );
- fun.addArgumentsToFnInfo(fnInfo);
- fun.createSymMap(symContext);
-#endif
-}
+
} // namespace absyntax
diff --git a/graphics/asymptote/fundec.h b/graphics/asymptote/fundec.h
index 8ecf086f58..f90d2c3f28 100644
--- a/graphics/asymptote/fundec.h
+++ b/graphics/asymptote/fundec.h
@@ -70,8 +70,14 @@ struct tySymbolPair : public gc {
class formals : public absyn {
//friend class funheader;
-
mem::list<formal *> fields;
+public:
+ // NOTE: Iterators do NOT include the rest parameter.
+ auto begin() { return fields.begin(); }
+ auto end() { return fields.end(); }
+ auto rbegin() { return fields.rbegin(); }
+ auto rend() { return fields.rend(); }
+private:
formal *rest;
// If the list of formals contains at least one keyword-only formal.
diff --git a/graphics/asymptote/gc/AUTHORS b/graphics/asymptote/gc/AUTHORS
new file mode 100644
index 0000000000..f5dbbaa2b2
--- /dev/null
+++ b/graphics/asymptote/gc/AUTHORS
@@ -0,0 +1,470 @@
+This is an attempt to acknowledge contributions to the garbage collector.
+Early contributions also mentioned (duplicated) in ChangeLog file; details of
+later ones should be in "git log".
+
+Currently maintained by Ivan Maidanski.
+
+HISTORY -
+
+ Early versions of this collector were developed as a part of research
+projects supported in part by the National Science Foundation
+and the Defense Advance Research Projects Agency.
+
+The garbage collector originated as part of the run-time system for
+the Russell programming language implementation. The first version of the
+garbage collector was written primarily by Alan Demers. It was then refined
+and mostly rewritten, primarily by Hans-J. Boehm, at Cornell U.,
+the University of Washington, Rice University (where it was first used for
+C and assembly code), Xerox PARC, SGI, and HP Labs. However, significant
+contributions have also been made by many others.
+
+Other contributors (my apologies for any omissions):
+
+Adam Megacz <adam@megac.com>
+Adnan Ali
+Adrian Bunk <bunk@fs.tum.de>
+Adrian Pop <adrian.pop@liu.se>
+Akira Tagoh <tagoh@redhat.com>
+Alain Novak <alain.novak@hermes.si>
+Alan Dosser <dosser@src.dec.com>
+Alan J. Demers <ademers@cs.cornell.edu>
+Alaskan Emily <emily@alaskanemily.net>
+Aleksey Demakov <ademakov@gmail.com>
+Alessandro Bruni <alessandro.bruni@gmail.com>
+Alex Ronne Petersen <alexrp@xamarin.com>
+Alexander Belchenko <bialix@ukr.net>
+Alexander Gavrilov <angavrilov@gmail.com>
+Alexander Herz <alexander.herz@mytum.de>
+Alexandr Petrosian <paf@design.ru>
+Alexandr Shadchin <ShadchinAV@mail.ru>
+Alexandre Oliva <aoliva@redhat.com>
+Alexis Laferriere <alexis.laf@xymus.net>
+Alistair G. Crooks <agc@uts.amdahl.com>
+Allan Hsu <allan@counterpop.net>
+Amaury Sechet <deadalnix@gmail.com>
+Andre Leiradella <andre@leiradella.com>
+Andreas Jaeger <aj@suse.de>
+Andreas Tobler <andreastt@gmail.com>
+Andrei Polushin <polushin@gmail.com>
+Andrej Cedilnik <acedil1@csee.umbc.edu>
+Andrew Begel <abegel@eecs.berkeley.edu>
+Andrew Buss <abuss@ucsd.edu>
+Andrew Gray <andrew.gray@anu.edu.au>
+Andrew Haley <aph@redhat.com>
+Andrew Horton <andrew.j.horton@gmail.com>
+Andrew McKinlay <mckinlay@axonsoft.com>
+Andrew Pinski <pinskia@physics.uc.edu>
+Andrew Stitcher <astitcher@redhat.com>
+Andrew Stone <andrew@stone.com>
+Andrew Whatson <whatson@gmail.com>
+Andy Li <andy@onthewings.net>
+Andy Wingo <wingo@pobox.com>
+Anselm Baird-Smith <Anselm.BairdSmith@inria.fr>
+Anthony Green <green@redhat.com>
+Antoine de Maricourt
+Ari Huttunen <Ari.Huttunen@hut.fi>
+Arrigo Triulzi <arrigo@ic.ac.uk>
+Ashley Bone <ashley.bone@nvl.army.mil>
+Assar Westerlund <assar@sics.se>
+Aurelien Larcher <aurelien.larcher@gmail.com>
+Barry DeFreese <bdefreese@debian.org>
+Baruch Siach <baruch@tkos.co.il>
+Ben A. Mesander <ben@piglet.cr.usgs.gov>
+Ben Cottrell <tamino@wolfhut.org>
+Ben Hutchings <ben@decadentplace.org.uk>
+Ben Maurer <benm@mono-cvs.ximian.com>
+Benjamin Lerman <Benjamin.Lerman@ambre.net>
+Bernd Edlinger <bernd.edlinger@hotmail.de>
+Bernd Kuhls <bernd.kuhls@t-online.de>
+Bernie Solomon <bernard@mono-cvs.ximian.com>
+Bill Janssen <janssen@parc.xerox.com>
+Bo Thorsen <bo@berlioz.suse.de>
+Bradley D. LaRonde <brad@ltc.com>
+Bradley Smith <brad@brad-smith.co.uk>
+Brent Benson <brent@jade.ssd.csd.harris.com>
+Brian Alliet <brian@brianweb.net>
+Brian Beuning <bbeuning@corecard.com>
+Brian Burton <bburton@users.sourceforge.net>
+Brian D. Carlstrom <bdc@clark.lcs.mit.edu>
+Brian F. Dennis <xjam@cork.cs.berkeley.edu>
+Brian J. Cardiff <bcardiff@gmail.com>
+Brian Lewis <btlewis@eng.sun.com>
+Bruce A Henderson <woollybah@gmail.com>
+Bruce Hoult <bruce@hoult.org>
+Bruce Mitchener <bruce.mitchener@gmail.com>
+Bruno Haible <bruno@clisp.org>
+Bryce McKinlay <mckinlay@redhat.com>
+Burkhard Linke <blinke@cebitec.uni-bielefeld.de>
+Calvin Buckley <calvin@openmailbox.org>
+Carlos J. Puga Medina <cpm@fbsd.es>
+Cesar Eduardo Barros <cesarb@nitnet.com.br>
+Charles Fiterman <cef@geode.geodesic.com>
+Charles Mills <boson@cyberspace.org>
+Chris Dodd <chrisd@reservoir.com>
+Chris Lingard <chris@highludworth.freeserve.co.uk>
+Chris Metcalf <cmetcalf@mellanox.com>
+Christian Joensson <christian.joensson@gmail.com>
+Christian Limpach <chris@pin.lu>
+Christian Thalinger <twisti@complang.tuwien.ac.at>
+Christian Weisgerber <naddy@openbsd.org>
+Christoffe Raffali <christophe.raffalli@univ-savoie.fr>
+Clay Spence <cds@peanut.sarnoff.com>
+Clement Chigot <clement.chigot@atos.net>
+Colin LeMahieu <clemahieu@gmail.com>
+Craig McDaniel <kreg7@bellsouth.net>
+Dai Sato <satodai@dog.intcul.tohoku.ac.jp>
+Dan Bonachea <bonachea@cs.berkeley.edu>
+Dan Fandrich <dan@coneharvesters.com>
+Dan Sullivan <sullivan@epa.gov>
+Daniel R. Grayson <dan@math.uiuc.edu>
+Danny Smith <danny_r_smith_2001@yahoo.co.nz>
+Darrell Schiebel <drs@nrao.edu>
+Dave Barrett <barrett@asgard.cs.colorado.edu>
+Dave Barton <dbarton@mathscribe.com>
+Dave Detlefs <detlefs@src.dec.com>
+Dave Korn <dave.korn.cygwin@googlemail.com>
+Dave Love <d.love@dl.ac.uk>
+David A. Holland <dholland@netbsd.org>
+David Ayers <d.ayers@inode.at>
+David Brownlee <abs@absd.org>
+David Butenhof <david.butenhof@hp.com>
+David Chase <dr2chase@mac.com>
+David Daney <ddaney@avtrex.com>
+David Grove <groved@us.ibm.com>
+David Leonard <leonard@users.sourceforge.net>
+David Miller <davem@davemloft.net>
+David Mosberger <davidm@hpl.hp.com>
+David Peroutka <djp@volny.cz>
+David Pickens <dsp@rci.rutgers.edu>
+David Stes <stes@d5e02b1d.kabel.telenet.be>
+David Terei <d@davidterei.com>
+David Van Horn <dvanhorn@ccs.neu.edu>
+Davide Angelocola <davide.angelocola@tiscali.it>
+Davide Beatrici <git@davidebeatrici.dev>
+Demyan Kimitsa <demyan.kimitsa@gmail.com>
+Dick Porter <dick@acm.org>
+Dietmar Planitzer <dave.pl@ping.at>
+Dima Pasechnik <dimpase@gmail.com>
+Dimitris Apostolou <dimitris.apostolou@icloud.com>
+Dimitris Vyzovitis <vyzo@media.mit.edu>
+Dimitry Andric <dim@freebsd.org>
+Djamel Magri <djamel.magri@googlemail.com>
+Doug Kaufman <dkaufman@rahul.net>
+Doug Moen <doug@moens.org>
+Douglas Steel <doug@wg.icl.co.uk>
+Eli Barzilay <eli@racket-lang.org>
+Elijah Taylor <elijahtaylor@google.com>
+Elvenlord Elrond <elrond@samba-tng.org>
+Emmanual Stumpf
+Eric Benson <eb@kaleida.com>
+Eric Holk <eric.holk@gmail.com>
+Erik M. Bray <erik.bray@lri.fr>
+Fabian Ruffy <contact@ruffy.eu>
+Fabian Thylman
+Fabrice Fontaine <fontaine.fabrice@gmail.com>
+Fergus Henderson <fjh@cs.mu.oz.au>
+Franklin Chen <chen@adi.com>
+Fred Gilham <gilham@csl.sri.com>
+Fred Stearns
+Friedrich Dominicus <friedrichdominicus@googlemail.com>
+Gabor Drescher <gabor.drescher@cs.fau.de>
+Gary Leavens <leavens@eecs.ucf.edu>
+Geoff Norton <grompf@sublimeintervention.com>
+George Koehler <kernigh@gmail.com>
+George Talbot <Gtalbot@ansarisbio.com>
+Gerard A Allan
+Glauco Masotti <glauco.masotti@libero.it>
+Grzegorz Jakacki <jakacki@acm.org>
+Gustavo Giraldez <ggiraldez@manas.com.ar>
+Gustavo Rodriguez-Rivera <grr@cs.purdue.edu>
+H.J. Lu <hjl.tools@gmail.com>
+Hamayama <hamay1010@gmail.com>
+Hannes Mehnert <hannes@mehnert.org>
+Hanno Boeck <hanno@gentoo.org>
+Hans Boehm <boehm@acm.org>
+Hans-Peter Nilsson <hp@axis.com>
+Henning Makholm <Henning@octoshape.com>
+Henrik Theiling <theiling@absint.com>
+Hironori Sakamoto <hsaka@mth.biglobe.ne.jp>
+Hiroshi Kawashima <kei@arch.sony.co.jp>
+Hiroshi Yokota <yokota@netlab.cs.tsukuba.ac.jp>
+Hubert Garavel <Hubert.Garavel@imag.fr>
+Iain Sandoe <developer@sandoe-acoustics.co.uk>
+Ian Piumarta <piumarta@prof.inria.fr>
+Ian Searle <ians@eskimo.com>
+Igor Khavkine <i_khavki@alcor.concordia.ca>
+Ilya Kurdyukov <ilyakurdyukov@altlinux.org>
+Ivan Demakov <ivan@tgrad.nsk.su>
+Ivan Maidanski <ivmai@mail.ru>
+Ivan R <iarspider@gmail.com>
+Jaap Boender <jaapb@netbsd.org>
+Jack Andrews <effbiae@gmail.com>
+Jacob Navia <jacob.navia@jacob.remcomp.fr>
+Jakub Jelinek <jakub@redhat.com>
+Jakub Wojciech <jakub-w@riseup.net>
+James Clark <jjc@jclark.com>
+James Dominy
+James Moran <jamesmo@unity3d.com>
+Jan Alexander Steffens <jan.steffens@gmail.com>
+Jan Wielemaker <J.Wielemaker@cs.vu.nl>
+Jani Kajala <jani@sumea.com>
+Jared McNeill <jmcneill@NetBSD.org>
+Jasper Lievisse Adriaanse <jasper@openbsd.org>
+Jay Krell <jaykrell@microsoft.com>
+Jean-Baptiste Nivois
+Jean-Claude Beaudoin <jean.claude.beaudoin@gmail.com>
+Jean-Daniel Fekete <fekete@cs.umd.edu>
+Jeaye Wilkerson <contact@jeaye.com>
+Jeff Sturm <jsturm@one-point.com>
+Jeffrey Hsu <hsu@soda.berkeley.edu>
+Jeffrey Mark Siskind
+Jeremy Fitzhardinge <jeremy@goop.org>
+Jesper Peterson <jep@mtiame.mtia.oz.au>
+Jesse Hull <jhull@parc.xerox.com>
+Jesse Jones <jesjones@mindspring.com>
+Jesse Rosenstock <jmr@ugcs.caltech.edu>
+Ji-Yong Chung
+Jie Liu <lj8175@gmail.com>
+Jim Marshall <jim.marshall@wbemsolutions.com>
+Jim Meyering <jim@meyering.net>
+Joao Abecasis <joao@abecasis.name>
+Joerg Sonnenberger <joerg@britannica.bec.de>
+Johannes Schmidt <jschmidt@avtrex.com>
+Johannes Totz <jtotz@ic.ac.uk>
+John Bowman <bowman@ualberta.ca>
+John Clements <clements@brinkerhoff.org>
+John David Anglin <dave.anglin@bell.net>
+John Ellis <ellis@parc.xerox.com>
+John Ericson <git@JohnEricson.me>
+John Merryweather Cooper <jmerry@mono-cvs.ximian.com>
+Jon Moore <jonm@apache.org>
+Jonas Echterhoff <jonas@unity3d.com>
+Jonas Hahnfeld <hahnjo@hahnjo.de>
+Jonathan Bachrach <jonathan@harlequin.com>
+Jonathan Chambers <jonathan@unity3d.com>
+Jonathan Clark
+Jonathan Pryor <jpryor@novell.com>
+Josh Peterson <petersonjm1@gmail.com>
+Joshua Richardson <jric@chegg.com>
+Juan Jose Garcia-Ripoll <juanjose.garciaripoll@googlemail.com>
+Jukka Jylanki <jujjyl@gmail.com>
+Kai Tietz <ktietz70@googlemail.com>
+Kaz Kojima <kkojima@rr.iij4u.or.jp>
+Kazu Hirata <kazu@codesourcery.com>
+Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+Keith Seitz <keiths@redhat.com>
+Kenjiro Taura <tau@eidos.ic.i.u-tokyo.ac.jp>
+Kenneth Schalk <schalk@cadtls.hlo.dec.com>
+Kevin Kenny <kenny@m.cs.uiuc.edu>
+Kevin Tew <tewk@racket-lang.org>
+Kevin Warne <kevinw@direct.ca>
+Kimura Wataru <kimuraw@i.nifty.jp>
+Kjetil Matheussen <k.s.matheussen@notam02.no>
+Klaus Treichel <ktreichel@web.de>
+Klemens Zwischenbrugger <ka7@la-evento.com>
+Knut Tvedten <knuttv@ifi.uio.no>
+Krister Walfridsson <cato@df.lth.se>
+Kristian Kristensen <kk@cs.aau.dk>
+Kristian Larsson <kristian@spritelink.net>
+Kumar Srikantan
+Kurt Miller <kurt@intricatesoftware.com>
+Lars Farm <lars.farm@ite.mh.se>
+Laurent Morichetti <l_m@pacbell.net>
+Leonardo Taccari <iamleot@gmail.com>
+Linas Vepstas <linasvepstas@gmail.com>
+Loren J. Rittle <rittle@latour.labs.mot.com>
+Louis Zhuang <louis.zhuang@acm.org>
+Lucas Holt <luke@foolishgames.com>
+Lucas Meijer <lucas@unity3d.com>
+Ludovic Courtes <ludo@gnu.org>
+Maarten Thibaut <mthibaut@cisco.com>
+Mahder Gebremedhin <mahder.gebremedhin@liu.se>
+Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com>
+Manuel Serrano <serrano@cornas.inria.fr>
+Marc Recht <recht@netbsd.org>
+Marco Maggi <marco.maggi-ipsu@poste.it>
+Marcos Dione <Marcos_David.Dione@sophia.inria.fr>
+Marcus Herbert
+Marek Vasut <marex@denx.de>
+Margaret Fleck <mfleck@illinois.edu>
+Marius Gerbershagen <marius.gerbershagen@gmail.com>
+Mark Boulter <mboulter@vnet.ibm.com>
+Mark Mitchell <mark@codesourcery.com>
+Mark Reichert <markr@sirs.com>
+Mark Sibly
+Mark Weiser <weiser@ubiq.com>
+Martin Hirzel <hirzel@cs.colorado.edu>
+Martin Koeppe <mkoeppe@gmx.de>
+Martin Tauchmann <martintauchmann@bigfoot.com>
+Massimiliano Gubinelli <m.gubinelli@gmail.com>
+Matheus Rambo <mrambo@grupodimed.com.br>
+Matt Austern <austern@google.com>
+Matthew Flatt <mflatt@plt-scheme.org>
+Matthias Andree <matthias.andree@gmx.de>
+Matthias Drochner <M.Drochner@fz-juelich.de>
+Matthieu Herrb <matthieu@openbsd.org>
+Maurizio Vairani <maurizio.vairani@cloverinformatica.it>
+Max Mouratov <mmouratov@gmail.com>
+Maximilian Downey Twiss <creatorsmithmdt@gmail.com>
+Maya Rashish <coypu@sdf.org>
+Melissa O'Neill <oneill@cs.sfu.ca>
+Michael Arnoldus <chime@proinf.dk>
+Michael DeRoy <deroymichael@gmail.com>
+Michael Fox <mfox@cavium.com>
+Michael Herring <khakionion@gmail.com>
+Michael Smith <msmith@spinnakernet.com>
+Michael Spertus <mps@geodesic.com>
+Michel Schinz <schinz@alphanet.ch>
+Miguel de Icaza <miguel@gnome.org>
+Mikael Djurfeldt <mikael@djurfeldt.com>
+Mike Frysinger <vapier@gentoo.org>
+Mike Gran <spk121@yahoo.com>
+Mike McGaughey <mmcg@cs.monash.edu.au>
+Mike Stump <mrs@windriver.com>
+Mitch Harris <maharri@uiuc.edu>
+Mohan Embar <gnustuff@thisiscool.com>
+Naoyuki Sawa <sawa_naoyuki-1@yahoo.co.jp>
+Nathanael Nerode <neroden@twcny.rr.com>
+Neale Ferguson <neale@mono-cvs.ximian.com>
+Neil Sharman <neil@cs.mu.oz.au>
+Nguyen Thai Ngoc Duy <pclouds@gmail.com>
+Nicolas Cannasse <ncannasse@motion-twin.com>
+Niibe Yutaka <gniibe@fsij.org>
+Nikita Ermakov <coffe92@gmail.com>
+Niklas Therning <niklas@therning.org>
+Noah Lavine <noah.b.lavine@gmail.com>
+Nobuyuki Hikichi <hikichi@sra.co.jp>
+Oliver Kurth <oliver.kurth@innominate.com>
+Ondrej Bilka <neleai@seznam.cz>
+Paolo Molaro <lupus@ximian.com>
+Parag Patel <parag@netcom.com>
+Patrick Bridges <bridges@cs.arizona.edu>
+Patrick C. Beard <beard@netscape.com>
+Patrick Doyle <doylep@eecg.toronto.edu>
+Paul Bone <paul@bone.id.au>
+Paul Brook <paul@codesourcery.com>
+Paul Graham
+Paul Nash <paulnash@wildseed.com>
+Per Bothner <per@bothner.com>
+Peter Bigot <bigotp@acm.org>
+Peter Budai <peterbudai@hotmail.com>
+Peter Chubb <peterc@sour.sw.oz.au>
+Peter Colson <pcolson@connexus.net.au>
+Peter Housel <housel@acm.org>
+Peter Monks <pmonks@iname.com>
+Peter Ross <pro@missioncriticalit.com>
+Peter Seebach <seebs@taniemarie.solon.com>
+Peter Wang <novalazy@gmail.com>
+Petr Krajca <krajcap@inf.upol.cz>
+Petr Salinger <Petr.Salinger@seznam.cz>
+Petter Urkedal <paurkedal@gmail.com>
+Philip Brown <phil@opencsw.org>
+Philipp Tomsich <phil@complang.tuwien.ac.at>
+Philippe Queinnec <queinnec@enseeiht.fr>
+Phillip Musumeci <p.musumeci@ieee.org>
+Phong Vo <kpv@research.att.com>
+Pierre de Rop
+Pontus Rydin <P.Rydin@astea.se>
+Qing Guo <delguoqing@hotmail.com>
+Radek Polak <psonek2@seznam.cz>
+Rainer Orth <ro@cebitec.uni-bielefeld.de>
+Ranjit Mathew <rmathew@gcc.gnu.org>
+Rauli Ruohonen <rruohone@cc.hut.fi>
+Regis Cridlig <Regis.Cridlig@cl.cam.ac.uk>
+Reimer Behrends <behrends@gmail.com>
+Renaud Blanch <renaud.blanch@lri.fr>
+Rene Girard
+Rex Dieter <rdieter@math.unl.edu>
+Reza Shahidi
+Richard Earnshaw <rearnsha@arm.com>
+Richard Henderson <rth@redhat.com>
+Richard Sandiford <rsandifo@nildram.co.uk>
+Richard Zidlicky <Richard.Zidlicky@stud.informatik.uni-erlangen.de>
+Rob Haack <rhaack@polaris.unm.edu>
+Robert Brazile <brazile@diamond.bbn.com>
+Robert Hensing <robert@roberthensing.nl>
+Rodrigo Kumpera <kumpera@gmail.com>
+Roger Sayle <roger@eyesopen.com>
+Roland McGrath <roland@redhat.com>
+Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+Romain Naour <romain.naour@gmail.com>
+Romano Paolo Tenca <rotenca@telvia.it>
+Rutger Ovidius <ovidr@users.sourceforge.net>
+Ryan Gonzalez <rymg19@gmail.com>
+Ryan Murray <rmurray@debian.org>
+Salvador Eduardo Tropea <salvador@inti.gov.ar>
+Sam James <sam@gentoo.org>
+Samuel Martin <s.martin49@gmail.com>
+Samuel Thibault <samuel.thibault@gnu.org>
+Scott Ananian <cananian@lesser-magoo.lcs.mit.edu>
+Scott Ferguson <scott.ferguson@unity3d.com>
+Scott Schwartz <schwartz@groucho.cse.psu.edu>
+Seonghyun Kim <sh8281.kim@samsung.com>
+Shawn Wagner <shawnw@speakeasy.org>
+Shea Levy <shea@shealevy.com>
+Shiro Kawai <shiro@lava.net>
+Simon Gornall <simon@gornall.net>
+Simon Kainz <simon@familiekainz.at>
+Simon Posnjak <simon.posnjak@siol.net>
+Slava Sysoltsev <Viatcheslav.Sysoltsev@h-d-gmbh.de>
+Sorawee Porncharoenwase <sorawee.pwase@gmail.com>
+ssrlive <ssrlivebox@gmail.com>
+Stefan Ring <stefanrin@gmail.com>
+Stefano Rivera <stefano@rivera.za.net>
+Steve Youngs <steve@sxemacs.org>
+Sugioka Toshinobu <sugioka@itonet.co.jp>
+Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Sven Hartrumpf <Sven.Hartrumpf@fernuni-hagen.de>
+Sven Verdoolaege <skimo@kotnet.org>
+Takis Psarogiannakopoulos <takis@xfree86.org>
+Tatsuya Bizenn <bizenn@visha.org>
+Tautvydas Zilys <tautvydas.zilys@gmail.com>
+Terrell Russell <terrellrussell@gmail.com>
+Thiemo Seufer <ths@networkno.de>
+Thomas Funke <thf@zelator.in-berlin.de>
+Thomas Klausner <tk@giga.or.at>
+Thomas Linder Puls <thomas_linder_puls@hotmail.com>
+Thomas Maier <Thomas.Maier@uni-kassel.de>
+Thomas Schwinge <thomas@codesourcery.com>
+Thomas Thiriez <thomas@twistedwave.com>
+Thorsten Glaser <tg@debian.org>
+Tilman Vogel <Tilman.Vogel@web.de>
+Tim Bingham <tjb@zko.dec.com>
+Tim Cannell <timcannell@unity3d.com>
+Tim Gates <tim.gates@iress.com>
+Timothy N. Newsham <newsham@wiliki.eng.hawaii.edu>
+Tom Tromey <tromey@cygnus.com>
+Tommaso Tagliapietra <tommaso.tagliapietra@enel.it>
+Toralf Foerster <toralf.foerster@gmx.de>
+Toshio Endo <endo@is.titech.ac.jp>
+Tsugutomo Enami <tsugutomo.enami@jp.sony.com>
+Tum Nguyen <tum@veridicus.com>
+Tyson Dowd <trd@cs.mu.oz.au>
+Uchiyama Yasushi <uch@netbsd.org>
+Ulrich Drepper <drepper@redhat.com>
+Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+Uros Bizjak <ubizjak@gmail.com>
+Vernon Lee <scorpion@rice.edu>
+Victor Ivrii <ivrii@math.toronto.edu>
+Victor Romero <romerosanchezv@gmail.com>
+Vineet Gupta <vgupta@synopsys.com>
+Vitaly Magerya <vmagerya@gmail.com>
+Vladimir Tsichevski <wowa@jet.msk.su>
+Walter Bright <walter@walterbright.com>
+Walter Underwood <wunder@hp-ses.sde.hp.com>
+Wilson Ho <how@ivy.ucdavis.edu>
+Wink Saville <wink@saville.com>
+Wookey <wookey@wookware.org>
+Xi Wang <xi.wang@gmail.com>
+Xiaokun Zhu <xiaokun@aero.gla.ac.uk>
+Yann Dirson <dirson@debian.org>
+Yannis Bres <Yannis@bres.name>
+Yasuhiro Kimura <yasu@utahime.org>
+Yuki Okumura <mjt@cltn.org>
+Yusuke Suzuki <utatane.tea@gmail.com>
+Yvan Roux <yvan.roux@linaro.org>
+Zach Saw <zach.saw@gmail.com>
+Zhang Na <zhangna@loongson.cn>
+Zhiying Chen
+Zhong Shao <zhong.shao@yale.edu>
+Zoltan Varga <vargaz@gmail.com>
diff --git a/graphics/asymptote/gc/CMakeLists.txt b/graphics/asymptote/gc/CMakeLists.txt
new file mode 100644
index 0000000000..faca593e42
--- /dev/null
+++ b/graphics/asymptote/gc/CMakeLists.txt
@@ -0,0 +1,882 @@
+#
+# Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+# Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+# Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+# Copyright (c) 2000-2010 by Hewlett-Packard Company. All rights reserved.
+# Copyright (c) 2010-2021 Ivan Maidanski
+##
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+##
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+##
+
+#
+# get cmake and run:
+# cmake -G "Visual Studio 8 2005"
+# in the same dir as this file
+# this will generate gc.sln
+#
+
+cmake_minimum_required(VERSION 3.5)
+
+set(PACKAGE_VERSION 8.2.8)
+# Version must match that in AC_INIT of configure.ac and that in README.
+# Version must conform to: [0-9]+[.][0-9]+[.][0-9]+
+
+# Info (current:revision:age) for the Libtool versioning system.
+# These values should match those in cord/cord.am and Makefile.am.
+set(LIBCORD_VER_INFO 6:1:5)
+set(LIBGC_VER_INFO 6:4:5)
+set(LIBGCCPP_VER_INFO 6:0:5)
+
+option(enable_cplusplus "C++ support" OFF)
+if (enable_cplusplus)
+ project(gc)
+else()
+ project(gc C)
+endif()
+
+if (POLICY CMP0057)
+ # Required for CheckLinkerFlag, at least.
+ cmake_policy(SET CMP0057 NEW)
+endif()
+
+include(CheckCCompilerFlag)
+include(CheckCSourceCompiles)
+include(CheckFunctionExists)
+include(CheckIncludeFile)
+include(CheckSymbolExists)
+include(CMakePackageConfigHelpers)
+include(CTest)
+include(GNUInstallDirs)
+
+if (NOT (${CMAKE_VERSION} VERSION_LESS "3.18.0"))
+ include(CheckLinkerFlag)
+endif()
+
+# Customize the build by passing "-D<option_name>=ON|OFF" in the command line.
+option(BUILD_SHARED_LIBS "Build shared libraries" ON)
+option(build_cord "Build cord library" ON)
+option(build_tests "Build tests" OFF)
+option(enable_docs "Build and install documentation" ON)
+option(enable_threads "Support threads" ON)
+option(enable_parallel_mark "Parallelize marking and free list construction" ON)
+option(enable_thread_local_alloc "Turn on thread-local allocation optimization" ON)
+option(enable_threads_discovery "Enable threads discovery in GC" ON)
+option(enable_throw_bad_alloc_library "Turn on C++ gctba library build" ON)
+option(enable_gcj_support "Support for gcj" ON)
+option(enable_sigrt_signals "Use SIGRTMIN-based signals for thread suspend/resume" OFF)
+option(enable_gc_debug "Support for pointer back-tracing" OFF)
+option(disable_gc_debug "Disable debugging like GC_dump and its callees" OFF)
+option(enable_java_finalization "Support for java finalization" ON)
+option(enable_atomic_uncollectable "Support for atomic uncollectible allocation" ON)
+option(enable_redirect_malloc "Redirect malloc and friends to GC routines" OFF)
+option(enable_disclaim "Support alternative finalization interface" ON)
+option(enable_large_config "Optimize for large heap or root set" OFF)
+option(enable_gc_assertions "Enable collector-internal assertion checking" OFF)
+option(enable_mmap "Use mmap instead of sbrk to expand the heap" OFF)
+option(enable_munmap "Return page to the OS if empty for N collections" ON)
+option(enable_dynamic_loading "Enable tracing of dynamic library data roots" ON)
+option(enable_register_main_static_data "Perform the initial guess of data root sets" ON)
+option(enable_checksums "Report erroneously cleared dirty bits" OFF)
+option(enable_werror "Pass -Werror to the C compiler (treat warnings as errors)" OFF)
+option(enable_single_obj_compilation "Compile all libgc source files into single .o" OFF)
+option(enable_handle_fork "Attempt to ensure a usable collector after fork()" ON)
+option(disable_handle_fork "Prohibit installation of pthread_atfork() handlers" OFF)
+option(enable_emscripten_asyncify "Use Emscripten asyncify feature" OFF)
+option(install_headers "Install header and pkg-config metadata files" ON)
+option(without_libatomic_ops "Use atomic_ops.h in libatomic_ops/src" OFF)
+
+# Override the default build type to RelWithDebInfo (this instructs cmake to
+# pass -O2 -g -DNDEBUG options to the compiler by default).
+if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE
+ STRING "Choose the type of build." FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
+ STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel")
+endif()
+
+# Convert VER_INFO values to [SO]VERSION ones.
+if (BUILD_SHARED_LIBS)
+ # cord:
+ string(REGEX REPLACE "(.+):.+:.+" "\\1" cord_cur ${LIBCORD_VER_INFO})
+ string(REGEX REPLACE ".+:(.+):.+" "\\1" cord_rev ${LIBCORD_VER_INFO})
+ string(REGEX REPLACE ".+:.+:(.+)$" "\\1" cord_age ${LIBCORD_VER_INFO})
+ math(EXPR CORD_SOVERSION "${cord_cur} - ${cord_age}")
+ set(CORD_VERSION_PROP "${CORD_SOVERSION}.${cord_age}.${cord_rev}")
+ message(STATUS "CORD_VERSION_PROP = ${CORD_VERSION_PROP}")
+ # gc:
+ string(REGEX REPLACE "(.+):.+:.+" "\\1" gc_cur ${LIBGC_VER_INFO})
+ string(REGEX REPLACE ".+:(.+):.+" "\\1" gc_rev ${LIBGC_VER_INFO})
+ string(REGEX REPLACE ".+:.+:(.+)$" "\\1" gc_age ${LIBGC_VER_INFO})
+ math(EXPR GC_SOVERSION "${gc_cur} - ${gc_age}")
+ set(GC_VERSION_PROP "${GC_SOVERSION}.${gc_age}.${gc_rev}")
+ message(STATUS "GC_VERSION_PROP = ${GC_VERSION_PROP}")
+ # gccpp and gctba:
+ string(REGEX REPLACE "(.+):.+:.+" "\\1" gccpp_cur ${LIBGCCPP_VER_INFO})
+ string(REGEX REPLACE ".+:(.+):.+" "\\1" gccpp_rev ${LIBGCCPP_VER_INFO})
+ string(REGEX REPLACE ".+:.+:(.+)$" "\\1" gccpp_age ${LIBGCCPP_VER_INFO})
+ math(EXPR GCCPP_SOVERSION "${gccpp_cur} - ${gccpp_age}")
+ set(GCCPP_VERSION_PROP "${GCCPP_SOVERSION}.${gccpp_age}.${gccpp_rev}")
+ message(STATUS "GCCPP_VERSION_PROP = ${GCCPP_VERSION_PROP}")
+endif(BUILD_SHARED_LIBS)
+
+add_definitions("-DALL_INTERIOR_POINTERS -DNO_EXECUTE_PERMISSION")
+
+# Set struct packing alignment to word (instead of 1-byte).
+if (BORLAND)
+ add_compile_options(/a4)
+elseif (WATCOM)
+ add_compile_options(/zp4)
+endif()
+
+# Output all warnings.
+if (BORLAND)
+ # All warnings except for particular ones.
+ add_compile_options(/w /w-pro /w-aus /w-par /w-ccc /w-inl /w-rch)
+elseif (MSVC)
+ # All warnings but ignoring "unreferenced formal parameter" and
+ # "conditional expression is constant" ones.
+ add_compile_options(/W4 /wd4100 /wd4127)
+elseif (WATCOM)
+ add_compile_options(/wx)
+ if (NOT enable_threads)
+ # Suppress "unreachable code" warning in GC_ASSERT(I_HOLD_LOCK()).
+ add_compile_options(/wcd=201)
+ endif()
+else()
+ # TODO add -[W]pedantic -Wno-long-long
+ add_compile_options(-Wall -Wextra)
+endif()
+
+if (WIN32)
+ # Disable MS crt security warnings reported e.g. for getenv, strcpy.
+ add_definitions("-D_CRT_SECURE_NO_DEPRECATE")
+endif()
+
+include_directories(include)
+
+set(SRC alloc.c reclaim.c allchblk.c misc.c mach_dep.c os_dep.c
+ mark_rts.c headers.c mark.c obj_map.c blacklst.c finalize.c
+ new_hblk.c dbg_mlc.c malloc.c dyn_load.c typd_mlc.c ptr_chck.c
+ mallocx.c)
+set(THREADDLLIBS_LIST)
+set(NEED_LIB_RT)
+
+set(_HOST ${CMAKE_SYSTEM_PROCESSOR}-unknown-${CMAKE_SYSTEM})
+string(TOLOWER ${_HOST} HOST)
+message(STATUS "TARGET = ${HOST}")
+
+if (enable_threads)
+ find_package(Threads REQUIRED)
+ message(STATUS "Thread library: ${CMAKE_THREAD_LIBS_INIT}")
+ if (without_libatomic_ops OR BORLAND OR MSVC OR WATCOM)
+ include_directories(libatomic_ops/src)
+ # Note: alternatively, use CFLAGS_EXTRA to pass -I<...>/libatomic_ops/src.
+ else()
+ # Assume the compiler supports GCC atomic intrinsics.
+ add_definitions("-DGC_BUILTIN_ATOMIC")
+ endif()
+ include_directories(${Threads_INCLUDE_DIR})
+ set(THREADDLLIBS_LIST ${CMAKE_THREAD_LIBS_INIT})
+ if (${CMAKE_DL_LIBS} MATCHES ^[^-].*)
+ # Some cmake versions have a broken non-empty CMAKE_DL_LIBS omitting "-l".
+ # Assume CMAKE_DL_LIBS contains just one library.
+ set(THREADDLLIBS_LIST ${THREADDLLIBS_LIST} -l${CMAKE_DL_LIBS})
+ else()
+ set(THREADDLLIBS_LIST ${THREADDLLIBS_LIST} ${CMAKE_DL_LIBS})
+ endif()
+endif(enable_threads)
+
+set(ATOMIC_OPS_LIBS "") # TODO: Assume libatomic_ops library is not needed.
+
+# Thread support detection.
+if (CMAKE_USE_PTHREADS_INIT)
+ set(SRC ${SRC} gc_dlopen.c)
+ if (CYGWIN OR WIN32)
+ set(SRC ${SRC} win32_threads.c)
+ else()
+ set(SRC ${SRC} pthread_start.c pthread_stop_world.c pthread_support.c)
+ endif()
+ if (APPLE)
+ set(SRC ${SRC} darwin_stop_world.c)
+ endif()
+ if (HOST MATCHES .*-.*-hpux10.*)
+ message(FATAL_ERROR "HP/UX 10 POSIX threads are not supported.")
+ endif()
+ # Common defines for POSIX platforms.
+ add_definitions("-DGC_THREADS -D_REENTRANT")
+ if (enable_parallel_mark)
+ add_definitions("-DPARALLEL_MARK")
+ endif()
+ if (enable_thread_local_alloc)
+ add_definitions("-DTHREAD_LOCAL_ALLOC")
+ set(SRC ${SRC} specific.c thread_local_alloc.c)
+ endif()
+ message("Explicit GC_INIT() calls may be required.")
+ if (HOST MATCHES .*-.*-hpux11.*)
+ message("Only HP/UX 11 POSIX threads are supported.")
+ add_definitions("-D_POSIX_C_SOURCE=199506L")
+ set(NEED_LIB_RT ON)
+ elseif (HOST MATCHES .*-.*-netbsd.*)
+ message("Only on NetBSD 2.0 or later.")
+ add_definitions("-D_PTHREADS")
+ set(NEED_LIB_RT ON)
+ endif()
+ if (WIN32) # AND NOT CYGWIN
+ # Does not provide process fork functionality.
+ elseif (enable_handle_fork AND NOT disable_handle_fork)
+ add_definitions("-DHANDLE_FORK")
+ endif()
+ if (enable_sigrt_signals)
+ add_definitions("-DGC_USESIGRT_SIGNALS")
+ endif()
+elseif (CMAKE_USE_WIN32_THREADS_INIT)
+ add_definitions("-DGC_THREADS")
+ if (enable_parallel_mark)
+ add_definitions("-DPARALLEL_MARK")
+ endif()
+ if (enable_thread_local_alloc AND (enable_parallel_mark OR NOT BUILD_SHARED_LIBS))
+ # Imply THREAD_LOCAL_ALLOC unless GC_DLL.
+ add_definitions("-DTHREAD_LOCAL_ALLOC")
+ set(SRC ${SRC} thread_local_alloc.c)
+ endif()
+ add_definitions("-DEMPTY_GETENV_RESULTS")
+ set(SRC ${SRC} win32_threads.c)
+elseif (CMAKE_HP_PTHREADS_INIT OR CMAKE_USE_SPROC_INIT)
+ message(FATAL_ERROR "Unsupported thread package")
+endif()
+
+# Check whether -lrt linker option is needed to use clock_gettime.
+if (NOT NEED_LIB_RT)
+ check_function_exists(clock_gettime HAVE_CLOCK_GETTIME_DIRECTLY)
+ if (NOT HAVE_CLOCK_GETTIME_DIRECTLY)
+ # Use of clock_gettime() probably requires linking with "rt" library.
+ set(NEED_LIB_RT ON)
+ endif()
+endif()
+
+# Locate and use "rt" library if needed (and the library is available).
+if (NEED_LIB_RT)
+ find_library(LIBRT rt)
+ if (LIBRT)
+ set(THREADDLLIBS_LIST ${THREADDLLIBS_LIST} ${LIBRT})
+ endif()
+endif(NEED_LIB_RT)
+
+if (disable_handle_fork)
+ add_definitions("-DNO_HANDLE_FORK")
+endif()
+
+if (enable_gcj_support)
+ add_definitions("-DGC_GCJ_SUPPORT")
+ if (enable_threads AND NOT (enable_thread_local_alloc AND HOST MATCHES .*-.*-kfreebsd.*-gnu))
+ # FIXME: For a reason, gctest hangs up on kFreeBSD if both of
+ # THREAD_LOCAL_ALLOC and GC_ENABLE_SUSPEND_THREAD are defined.
+ add_definitions("-DGC_ENABLE_SUSPEND_THREAD")
+ endif()
+ set(SRC ${SRC} gcj_mlc.c)
+endif(enable_gcj_support)
+
+if (enable_disclaim)
+ add_definitions("-DENABLE_DISCLAIM")
+ set(SRC ${SRC} fnlz_mlc.c)
+endif()
+
+if (enable_java_finalization)
+ add_definitions("-DJAVA_FINALIZATION")
+endif()
+
+if (enable_atomic_uncollectable)
+ add_definitions("-DGC_ATOMIC_UNCOLLECTABLE")
+endif()
+
+if (enable_gc_debug)
+ add_definitions("-DDBG_HDRS_ALL -DKEEP_BACK_PTRS")
+ if (HOST MATCHES i.86-.*-dgux.*|ia64-.*-linux.*|i586-.*-linux.*|i686-.*-linux.*|x86-.*-linux.*|x86_64-.*-linux.*)
+ add_definitions("-DMAKE_BACK_GRAPH")
+ if (HOST MATCHES .*-.*-.*linux.*)
+ add_definitions("-DSAVE_CALL_COUNT=8")
+ endif()
+ set(SRC ${SRC} backgraph.c)
+ endif()
+endif(enable_gc_debug)
+
+if (disable_gc_debug)
+ add_definitions("-DNO_DEBUGGING")
+elseif (WINCE)
+ # Read environment variables from "<program>.gc.env" file.
+ add_definitions("-DGC_READ_ENV_FILE")
+endif()
+
+if (enable_redirect_malloc)
+ if (enable_gc_debug)
+ add_definitions("-DREDIRECT_MALLOC=GC_debug_malloc_replacement")
+ add_definitions("-DREDIRECT_REALLOC=GC_debug_realloc_replacement")
+ add_definitions("-DREDIRECT_FREE=GC_debug_free")
+ else()
+ add_definitions("-DREDIRECT_MALLOC=GC_malloc")
+ endif()
+ if (WIN32)
+ add_definitions("-DREDIRECT_MALLOC_IN_HEADER")
+ else()
+ add_definitions("-DGC_USE_DLOPEN_WRAP")
+ endif()
+endif(enable_redirect_malloc)
+
+if (enable_munmap)
+ add_definitions("-DUSE_MMAP -DUSE_MUNMAP")
+elseif (enable_mmap)
+ add_definitions("-DUSE_MMAP")
+endif()
+
+if (NOT enable_dynamic_loading)
+ add_definitions("-DIGNORE_DYNAMIC_LOADING")
+endif()
+
+if (NOT enable_register_main_static_data)
+ add_definitions("-DGC_DONT_REGISTER_MAIN_STATIC_DATA")
+endif()
+
+if (enable_large_config)
+ add_definitions("-DLARGE_CONFIG")
+endif()
+
+if (enable_gc_assertions)
+ add_definitions("-DGC_ASSERTIONS")
+endif()
+
+if (NOT enable_threads_discovery)
+ add_definitions("-DGC_NO_THREADS_DISCOVERY")
+endif()
+
+if (enable_checksums)
+ if (enable_munmap OR enable_threads)
+ message(FATAL_ERROR "CHECKSUMS not compatible with USE_MUNMAP or threads")
+ endif()
+ add_definitions("-DCHECKSUMS")
+ set(SRC ${SRC} checksums.c)
+endif(enable_checksums)
+
+if (enable_werror)
+ if (BORLAND)
+ add_compile_options(/w!)
+ if (enable_threads)
+ # Workaround "function should return a value" warning for several
+ # asm functions in atomic_ops/sysdeps/msftc/x86.h.
+ add_compile_options(/w-rvl)
+ endif(enable_threads)
+ elseif (MSVC)
+ add_compile_options(/WX)
+ # Workaround "typedef ignored on left of ..." warning reported in
+ # imagehlp.h of e.g. Windows Kit 8.1.
+ add_compile_options(/wd4091)
+ elseif (WATCOM)
+ add_compile_options(/we)
+ else()
+ add_compile_options(-Werror)
+ if (APPLE)
+ # _dyld_bind_fully_image_containing_address is deprecated in OS X 10.5+
+ add_compile_options(-Wno-deprecated-declarations)
+ endif()
+ endif()
+endif(enable_werror)
+
+if (enable_single_obj_compilation OR BUILD_SHARED_LIBS)
+ set(SRC extra/gc.c) # override SRC
+ if (CMAKE_USE_PTHREADS_INIT AND NOT (CYGWIN OR WIN32))
+ add_definitions("-DGC_PTHREAD_START_STANDALONE")
+ set(SRC ${SRC} pthread_start.c)
+ endif()
+elseif (BORLAND)
+ # Suppress "GC_push_contents_hdr() is declared but never used" warning.
+ add_compile_options(/w-use)
+endif()
+
+# Add implementation of backtrace() and backtrace_symbols().
+if (MSVC)
+ set(SRC ${SRC} extra/msvc_dbg.c)
+endif()
+
+# Declare that the libraries do not refer to external symbols.
+if (BUILD_SHARED_LIBS AND NOT (APPLE OR ${CMAKE_SYSTEM_NAME} MATCHES "BSD"))
+ # Note: performed before CMAKE_REQUIRED_FLAGS is updated with "-c".
+ if (${CMAKE_VERSION} VERSION_LESS "3.18.0")
+ set(WL_NO_UNDEFINED_OPT "-Wl,--no-undefined")
+ check_c_compiler_flag(${WL_NO_UNDEFINED_OPT} HAVE_FLAG_WL_NO_UNDEFINED)
+ else()
+ set(WL_NO_UNDEFINED_OPT "LINKER:--no-undefined")
+ check_linker_flag(C "${WL_NO_UNDEFINED_OPT}" HAVE_FLAG_WL_NO_UNDEFINED)
+ endif()
+endif()
+
+# Instruct check_c_source_compiles to skip linking.
+# Alternatively, we could set CMAKE_REQUIRED_LIBRARIES properly.
+SET(CMAKE_REQUIRED_FLAGS "-c")
+
+# Instruct check_c_source_compiles and similar CMake checks not to ignore
+# compiler warnings (like "implicit declaration of function").
+if (NOT BORLAND AND NOT MSVC AND NOT WATCOM)
+ check_c_compiler_flag(-Werror HAVE_FLAG_WERROR)
+ if (HAVE_FLAG_WERROR)
+ check_c_compiler_flag(-Wno-unused-command-line-argument
+ HAVE_FLAG_WNO_UNUSED_CMDLINE_ARG)
+ SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror")
+ # Prevent "linker input unused" error in further check_c_compiler_flag.
+ if (HAVE_FLAG_WNO_UNUSED_CMDLINE_ARG)
+ SET(CMAKE_REQUIRED_FLAGS
+ "${CMAKE_REQUIRED_FLAGS} -Wno-unused-command-line-argument")
+ endif()
+ endif(HAVE_FLAG_WERROR)
+endif()
+
+if (BUILD_SHARED_LIBS)
+ add_definitions("-DGC_DLL")
+ # Pass -fvisibility=hidden option if supported.
+ check_c_compiler_flag(-fvisibility=hidden HAVE_FLAG_F_VISIBILITY_HIDDEN)
+ if (HAVE_FLAG_F_VISIBILITY_HIDDEN)
+ add_definitions("-DGC_VISIBILITY_HIDDEN_SET")
+ add_compile_options(-fvisibility=hidden)
+ else()
+ add_definitions("-DGC_NO_VISIBILITY")
+ endif()
+else()
+ add_definitions("-DGC_NOT_DLL")
+ if (WIN32)
+ # Do not require the clients to link with "user32" system library.
+ add_definitions("-DDONT_USE_USER32_DLL")
+ endif(WIN32)
+endif()
+
+# Disable strict aliasing optimizations.
+# It could re-enabled back by a flag passed in CFLAGS_EXTRA.
+check_c_compiler_flag(-fno-strict-aliasing HAVE_FLAG_F_NO_STRICT_ALIASING)
+if (HAVE_FLAG_F_NO_STRICT_ALIASING)
+ add_compile_options(-fno-strict-aliasing)
+endif()
+
+# Prevent "__builtin_return_address with a nonzero argument is unsafe" warning.
+if (NOT BORLAND AND NOT MSVC AND NOT WATCOM)
+ check_c_compiler_flag(-Wno-frame-address HAVE_FLAG_WNO_FRAME_ADDRESS)
+ if (HAVE_FLAG_WNO_FRAME_ADDRESS)
+ add_compile_options(-Wno-frame-address)
+ endif(HAVE_FLAG_WNO_FRAME_ADDRESS)
+endif()
+
+# Extra user-defined flags to pass both to C and C++ compilers.
+if (DEFINED CFLAGS_EXTRA)
+ separate_arguments(CFLAGS_EXTRA_LIST UNIX_COMMAND "${CFLAGS_EXTRA}")
+ add_compile_options(${CFLAGS_EXTRA_LIST})
+endif()
+
+# Check whether execinfo.h header file is present.
+check_include_file(execinfo.h HAVE_EXECINFO_H)
+if (NOT HAVE_EXECINFO_H)
+ add_definitions("-DGC_MISSING_EXECINFO_H")
+endif()
+
+# Check for getcontext (uClibc can be configured without it, for example).
+check_function_exists(getcontext HAVE_GETCONTEXT)
+if (HAVE_GETCONTEXT AND NOT APPLE)
+ # Double check getcontext() is available (needed at least on OpenBSD 7.3).
+ # Note: OS X is excluded here because the header filename differs.
+ check_c_source_compiles("
+#include <ucontext.h>\n
+int main(void) { ucontext_t ctxt; (void)getcontext(&ctxt); return 0; }"
+ HAVE_GETCONTEXT_FUNC)
+ if (NOT HAVE_GETCONTEXT_FUNC)
+ set(HAVE_GETCONTEXT OFF)
+ endif()
+endif()
+if (NOT HAVE_GETCONTEXT)
+ add_definitions("-DNO_GETCONTEXT")
+endif()
+
+# Check whether dl_iterate_phdr exists (as a strong symbol).
+check_function_exists(dl_iterate_phdr HAVE_DL_ITERATE_PHDR)
+if (HAVE_DL_ITERATE_PHDR)
+ add_definitions("-DHAVE_DL_ITERATE_PHDR")
+endif()
+
+check_symbol_exists(sigsetjmp setjmp.h HAVE_SIGSETJMP)
+if (NOT HAVE_SIGSETJMP)
+ add_definitions("-DGC_NO_SIGSETJMP")
+endif()
+
+# pthread_setname_np, if available, may have 1, 2 or 3 arguments.
+if (CMAKE_USE_PTHREADS_INIT)
+ check_c_source_compiles("
+#define _GNU_SOURCE 1\n
+#include <pthread.h>\n
+int main(void) { (void)pthread_setname_np(\"thread-name\"); return 0; }"
+ HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID)
+ if (HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID)
+ # Define to use 'pthread_setname_np(const char*)' function.
+ add_definitions("-DHAVE_PTHREAD_SETNAME_NP_WITHOUT_TID")
+ else()
+ check_c_source_compiles("
+#define _GNU_SOURCE 1\n
+#include <pthread.h>\n
+int main(void) {\n
+ (void)pthread_setname_np(pthread_self(), \"thread-name-%u\", 0); return 0; }"
+ HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG)
+ if (HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG)
+ # Define to use 'pthread_setname_np(pthread_t, const char*, void *)'.
+ add_definitions("-DHAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG")
+ else()
+ check_c_source_compiles("
+#define _GNU_SOURCE 1\n
+#include <pthread.h>\n
+int main(void) {\n
+ (void)pthread_setname_np(pthread_self(), \"thread-name\"); return 0; }"
+ HAVE_PTHREAD_SETNAME_NP_WITH_TID)
+ if (HAVE_PTHREAD_SETNAME_NP_WITH_TID)
+ # Define to use 'pthread_setname_np(pthread_t, const char*)' function.
+ add_definitions("-DHAVE_PTHREAD_SETNAME_NP_WITH_TID")
+ endif()
+ endif(HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG)
+ endif(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID)
+endif()
+
+# Check for dladdr (used for debugging).
+check_c_source_compiles("
+#define _GNU_SOURCE 1\n
+#include <dlfcn.h>\n
+int main(void) { Dl_info info; (void)dladdr(\"\", &info); return 0; }"
+ HAVE_DLADDR)
+if (HAVE_DLADDR)
+ # Define to use 'dladdr' function.
+ add_definitions("-DHAVE_DLADDR")
+endif()
+
+# Check for emscripten; use asyncify feature if requested.
+check_c_source_compiles("
+#ifndef __EMSCRIPTEN__\n
+# error This is not Emscripten\n
+#endif\n
+int main(void) { return 0; }"
+ EMSCRIPTEN)
+if (EMSCRIPTEN AND enable_emscripten_asyncify)
+ # Use this option if your program is targeting -sASYNCIFY. The latter is
+ # required to scan the stack, ASYNCIFY_STACK_SIZE is probably needed for
+ # gctest only.
+ add_definitions("-DEMSCRIPTEN_ASYNCIFY")
+ set(CMAKE_EXE_LINKER_FLAGS
+ "${CMAKE_EXE_LINKER_FLAGS} -sASYNCIFY -sASYNCIFY_STACK_SIZE=128000")
+endif()
+
+add_library(gc ${SRC})
+target_link_libraries(gc PRIVATE ${THREADDLLIBS_LIST} ${ATOMIC_OPS_LIBS})
+target_include_directories(gc INTERFACE
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
+ "$<INSTALL_INTERFACE:include>")
+
+if (enable_cplusplus)
+ add_library(gccpp gc_badalc.cc gc_cpp.cc)
+ target_link_libraries(gccpp PRIVATE gc)
+ target_include_directories(gccpp INTERFACE
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
+ "$<INSTALL_INTERFACE:include>")
+ if (enable_throw_bad_alloc_library)
+ # The same as gccpp but contains only gc_badalc.
+ add_library(gctba gc_badalc.cc)
+ target_link_libraries(gctba PRIVATE gc)
+ target_include_directories(gctba INTERFACE
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
+ "$<INSTALL_INTERFACE:include>")
+ endif(enable_throw_bad_alloc_library)
+endif()
+
+if (build_cord)
+ set(CORD_SRC cord/cordbscs.c cord/cordprnt.c cord/cordxtra.c)
+ add_library(cord ${CORD_SRC})
+ target_link_libraries(cord PRIVATE gc)
+ target_include_directories(cord INTERFACE
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
+ "$<INSTALL_INTERFACE:include>")
+ if (BUILD_SHARED_LIBS)
+ set_property(TARGET cord PROPERTY VERSION ${CORD_VERSION_PROP})
+ set_property(TARGET cord PROPERTY SOVERSION ${CORD_SOVERSION})
+ endif()
+ install(TARGETS cord EXPORT BDWgcTargets
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+endif(build_cord)
+
+if (BUILD_SHARED_LIBS AND HAVE_FLAG_WL_NO_UNDEFINED)
+ # Declare that the libraries do not refer to external symbols.
+ if (${CMAKE_VERSION} VERSION_LESS "3.13.0")
+ target_link_libraries(gc PRIVATE ${WL_NO_UNDEFINED_OPT})
+ if (enable_cplusplus)
+ target_link_libraries(gccpp PRIVATE ${WL_NO_UNDEFINED_OPT})
+ if (enable_throw_bad_alloc_library)
+ target_link_libraries(gctba PRIVATE ${WL_NO_UNDEFINED_OPT})
+ endif(enable_throw_bad_alloc_library)
+ endif(enable_cplusplus)
+ if (build_cord)
+ target_link_libraries(cord PRIVATE ${WL_NO_UNDEFINED_OPT})
+ endif(build_cord)
+ else()
+ target_link_options(gc PRIVATE ${WL_NO_UNDEFINED_OPT})
+ if (enable_cplusplus)
+ target_link_options(gccpp PRIVATE ${WL_NO_UNDEFINED_OPT})
+ if (enable_throw_bad_alloc_library)
+ target_link_options(gctba PRIVATE ${WL_NO_UNDEFINED_OPT})
+ endif(enable_throw_bad_alloc_library)
+ endif(enable_cplusplus)
+ if (build_cord)
+ target_link_options(cord PRIVATE ${WL_NO_UNDEFINED_OPT})
+ endif(build_cord)
+ endif()
+endif()
+
+if (BUILD_SHARED_LIBS)
+ set_property(TARGET gc PROPERTY VERSION ${GC_VERSION_PROP})
+ set_property(TARGET gc PROPERTY SOVERSION ${GC_SOVERSION})
+endif()
+install(TARGETS gc EXPORT BDWgcTargets
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+
+if (enable_cplusplus)
+ if (BUILD_SHARED_LIBS)
+ set_property(TARGET gccpp PROPERTY VERSION ${GCCPP_VERSION_PROP})
+ set_property(TARGET gccpp PROPERTY SOVERSION ${GCCPP_SOVERSION})
+ endif()
+ install(TARGETS gccpp EXPORT BDWgcTargets
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+ if (enable_throw_bad_alloc_library)
+ if (BUILD_SHARED_LIBS)
+ set_property(TARGET gctba PROPERTY VERSION ${GCCPP_VERSION_PROP})
+ set_property(TARGET gctba PROPERTY SOVERSION ${GCCPP_SOVERSION})
+ endif()
+ install(TARGETS gctba EXPORT BDWgcTargets
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+ endif(enable_throw_bad_alloc_library)
+endif(enable_cplusplus)
+
+if (install_headers)
+ install(FILES include/gc.h
+ include/gc_backptr.h
+ include/gc_config_macros.h
+ include/gc_inline.h
+ include/gc_mark.h
+ include/gc_tiny_fl.h
+ include/gc_typed.h
+ include/gc_version.h
+ include/javaxfc.h
+ include/leak_detector.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/gc")
+ install(FILES include/extra/gc.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+ if (enable_cplusplus)
+ install(FILES include/gc_allocator.h
+ include/gc_cpp.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/gc")
+ install(FILES include/extra/gc_cpp.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+ endif()
+ if (enable_disclaim)
+ install(FILES include/gc_disclaim.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/gc")
+ endif()
+ if (enable_gcj_support)
+ install(FILES include/gc_gcj.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/gc")
+ endif()
+ if (enable_threads AND CMAKE_USE_PTHREADS_INIT)
+ install(FILES include/gc_pthread_redirects.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/gc")
+ endif()
+ if (build_cord)
+ install(FILES include/cord.h
+ include/cord_pos.h
+ include/ec.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/gc")
+ endif()
+
+ # Provide pkg-config metadata.
+ set(prefix "${CMAKE_INSTALL_PREFIX}")
+ set(exec_prefix \${prefix})
+ set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
+ set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
+ string(REPLACE ";" " " THREADDLLIBS "${THREADDLLIBS_LIST}")
+ # ATOMIC_OPS_LIBS, PACKAGE_VERSION are defined above.
+ configure_file(bdw-gc.pc.in bdw-gc.pc @ONLY)
+ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/bdw-gc.pc"
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+endif(install_headers)
+
+if (build_tests)
+ if (build_cord)
+ add_executable(cordtest cord/tests/cordtest.c)
+ target_link_libraries(cordtest PRIVATE cord gc)
+ add_test(NAME cordtest COMMAND cordtest)
+
+ if (WIN32 AND NOT CYGWIN)
+ if (NOT (CMAKE_C_COMPILER_ID STREQUAL "Clang"))
+ # Workaround MS Clang failure to compile a resource file.
+ set(DE_WIN_RC cord/tests/de_win.rc)
+ endif()
+ add_executable(de cord/tests/de.c cord/tests/de_win.c
+ ${DE_WIN_RC})
+ set_target_properties(de PROPERTIES WIN32_EXECUTABLE TRUE)
+ target_link_libraries(de PRIVATE cord gc gdi32)
+ endif()
+ endif(build_cord)
+
+ # Compile some tests as C++ to test extern "C" in header files.
+ if (enable_cplusplus)
+ set_source_files_properties(tests/leak_test.c PROPERTIES LANGUAGE CXX)
+ if (NOT MSVC)
+ # WinMain-based test hangs at startup if compiled by VC as C++ code.
+ set_source_files_properties(tests/test.c PROPERTIES LANGUAGE CXX)
+ endif()
+ # To avoid "treating 'c' input as 'c++' when in C++ mode" Clang warning.
+ if (NOT (BORLAND OR MSVC OR WATCOM))
+ add_compile_options(-x c++)
+ endif()
+ endif(enable_cplusplus)
+
+ add_executable(gctest WIN32 tests/test.c)
+ target_link_libraries(gctest PRIVATE gc ${THREADDLLIBS_LIST})
+ add_test(NAME gctest COMMAND gctest)
+ if (WATCOM)
+ # Suppress "conditional expression in if statement is always true/false"
+ # and "unreachable code" warnings in GC_MALLOC_[ATOMIC_]WORDS.
+ target_compile_options(gctest PRIVATE
+ /wcd=13 /wcd=201 /wcd=367 /wcd=368 /wcd=726)
+ endif()
+
+ add_executable(hugetest tests/huge_test.c)
+ target_link_libraries(hugetest PRIVATE gc)
+ add_test(NAME hugetest COMMAND hugetest)
+
+ add_executable(leaktest tests/leak_test.c)
+ target_link_libraries(leaktest PRIVATE gc)
+ add_test(NAME leaktest COMMAND leaktest)
+
+ add_executable(middletest tests/middle.c)
+ target_link_libraries(middletest PRIVATE gc)
+ add_test(NAME middletest COMMAND middletest)
+
+ add_executable(realloc_test tests/realloc_test.c)
+ target_link_libraries(realloc_test PRIVATE gc)
+ add_test(NAME realloc_test COMMAND realloc_test)
+
+ add_executable(smashtest tests/smash_test.c)
+ target_link_libraries(smashtest PRIVATE gc)
+ add_test(NAME smashtest COMMAND smashtest)
+
+ if (NOT (BUILD_SHARED_LIBS AND WIN32))
+ add_library(staticrootslib_test tests/staticrootslib.c)
+ target_link_libraries(staticrootslib_test PRIVATE gc)
+ add_library(staticrootslib2_test tests/staticrootslib.c)
+ target_compile_options(staticrootslib2_test PRIVATE "-DSTATICROOTSLIB2")
+ target_link_libraries(staticrootslib2_test PRIVATE gc)
+ add_executable(staticrootstest tests/staticrootstest.c)
+ target_compile_options(staticrootstest PRIVATE "-DSTATICROOTSLIB2")
+ target_link_libraries(staticrootstest PRIVATE
+ gc staticrootslib_test staticrootslib2_test)
+ add_test(NAME staticrootstest COMMAND staticrootstest)
+ endif()
+
+ if (enable_gc_debug)
+ add_executable(tracetest tests/trace_test.c)
+ target_link_libraries(tracetest PRIVATE gc)
+ add_test(NAME tracetest COMMAND tracetest)
+ endif()
+
+ if (enable_threads)
+ add_executable(test_atomic_ops tests/test_atomic_ops.c)
+ target_link_libraries(test_atomic_ops PRIVATE gc)
+ add_test(NAME test_atomic_ops COMMAND test_atomic_ops)
+
+ add_executable(threadleaktest tests/thread_leak_test.c)
+ target_link_libraries(threadleaktest PRIVATE gc ${THREADDLLIBS_LIST})
+ add_test(NAME threadleaktest COMMAND threadleaktest)
+
+ if (NOT WIN32)
+ add_executable(threadkey_test tests/threadkey_test.c)
+ target_link_libraries(threadkey_test PRIVATE gc ${THREADDLLIBS_LIST})
+ add_test(NAME threadkey_test COMMAND threadkey_test)
+ endif()
+
+ add_executable(subthreadcreate_test tests/subthread_create.c)
+ target_link_libraries(subthreadcreate_test PRIVATE gc ${THREADDLLIBS_LIST})
+ add_test(NAME subthreadcreate_test COMMAND subthreadcreate_test)
+
+ add_executable(initsecondarythread_test tests/initsecondarythread.c)
+ target_link_libraries(initsecondarythread_test
+ PRIVATE gc ${THREADDLLIBS_LIST})
+ add_test(NAME initsecondarythread_test COMMAND initsecondarythread_test)
+ endif(enable_threads)
+
+ if (enable_cplusplus)
+ add_executable(test_cpp WIN32 tests/test_cpp.cc)
+ target_link_libraries(test_cpp PRIVATE gc gccpp)
+ add_test(NAME test_cpp COMMAND test_cpp)
+ endif()
+
+ if (enable_disclaim)
+ add_executable(disclaim_bench tests/disclaim_bench.c)
+ target_link_libraries(disclaim_bench PRIVATE gc)
+ add_test(NAME disclaim_bench COMMAND disclaim_bench)
+
+ add_executable(disclaim_test tests/disclaim_test.c)
+ target_link_libraries(disclaim_test PRIVATE gc ${THREADDLLIBS_LIST})
+ add_test(NAME disclaim_test COMMAND disclaim_test)
+
+ add_executable(disclaim_weakmap_test tests/disclaim_weakmap_test.c)
+ target_link_libraries(disclaim_weakmap_test
+ PRIVATE gc ${THREADDLLIBS_LIST})
+ add_test(NAME disclaim_weakmap_test COMMAND disclaim_weakmap_test)
+ endif()
+endif(build_tests)
+
+if (enable_docs)
+ # Note: documentation which is not installed: README.QUICK
+ install(FILES AUTHORS README.md
+ DESTINATION "${CMAKE_INSTALL_DOCDIR}")
+ install(DIRECTORY doc/ DESTINATION "${CMAKE_INSTALL_DOCDIR}"
+ FILES_MATCHING
+ PATTERN "README.*"
+ PATTERN "*.md")
+
+ install(FILES doc/gc.man DESTINATION "${CMAKE_INSTALL_MANDIR}/man3"
+ RENAME gc.3)
+endif(enable_docs)
+
+# CMake config/targets files.
+install(EXPORT BDWgcTargets FILE BDWgcTargets.cmake
+ NAMESPACE BDWgc:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/bdwgc")
+
+configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/BDWgcConfig.cmake"
+ INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/bdwgc"
+ NO_SET_AND_CHECK_MACRO)
+
+write_basic_package_version_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/BDWgcConfigVersion.cmake"
+ VERSION "${PACKAGE_VERSION}" COMPATIBILITY AnyNewerVersion)
+
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/BDWgcConfig.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/BDWgcConfigVersion.cmake"
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/bdwgc")
+
+export(EXPORT BDWgcTargets
+ FILE "${CMAKE_CURRENT_BINARY_DIR}/BDWgcTargets.cmake")
diff --git a/graphics/asymptote/gc/ChangeLog b/graphics/asymptote/gc/ChangeLog
new file mode 100644
index 0000000000..bc381d0d72
--- /dev/null
+++ b/graphics/asymptote/gc/ChangeLog
@@ -0,0 +1,11012 @@
+
+== [8.2.8] 2024-09-08 ==
+
+* Allow GC_size() argument to be null
+* Disable backtrace saving at garbage collections if DONT_SAVE_TO_LAST_STACK
+* Eliminate 'cast signed to bigger unsigned' CSA warnings in GC_find_limit
+* Eliminate 'x might be clobbered by longjmp' gcc warning in setjmp_t.c
+* Fix 'un-mprotect vdb failed' abort with out-of-memory reason on Linux
+* Fix ADD_CALL_CHAIN() placement to follow GC_store_debug_info_inner call
+* Fix GC_debug_realloc to support custom kind
+* Fix GC_is_visible for case of arg pointing exactly to object upper bound
+* Fix GC_print_trace_inner to print the last element of the circular buffer
+* Fix cordtst2.tmp file deletion in cordtest on Windows
+* Fix double lock in GC_malloc called from backtrace()
+* Fix handling of page-unaligned boundaries in soft_set_grungy_pages
+* Fix heap blocks size computation by GC_get_memory_use
+* Fix indent of a closing curly braces in GC_apply_to_all_blocks
+* Fix infinite resend lost signals if a thread is restarted by SIGQUIT
+* Fix null pointer dereference in GC_is_visible if type_descr is null
+* Fix per_object_helper() after changing hb_sz units
+* Fix pointer relational comparison in GC_do_enumerate_reachable_objects
+* Fix poor thread-local allocation performance because of double EXTRA_BYTES
+* Fix potential GC_add_roots_inner call with an overflowed pointer (Win32)
+* Fix potential address overflow in GC_add_to_heap
+* Fix potential buffer overrun during read in GC_text_mapping
+* Fix various typos in comments
+* Prevent GC_noop_sink from scanning by the collector
+* Prevent redirected malloc call from a garbage collection routine
+* Redirect malloc_usable_size() in leak_detector.h
+* Remove redundant dirty/reachable_here calls in GC_malloc_explicitly_typed
+* Update and fix diagrams describing the tree structure for pointer lookups
+* Use atomic store to set GC_first_nonempty in GC_do_parallel_mark
+* Use atomic store to set entry id and update cache_ptr in slow_getspecific
+* Workaround '.obj file not found' error reported by watcom wlib
+
+
+== [8.2.6] 2024-02-04 ==
+
+* Avoid unexpected heap growth in gctest for the case of VERY_SMALL_CONFIG
+* Change gc.man to include gc/gc.h
+* Check for out-of-memory on every memory allocation in tests
+* Do not compile pthread_start.c on Cygwin even if build shared libs (CMake)
+* Eliminate 'alloc_small declared but unused' gcc warning in gctest
+* Eliminate 'make_key is defined but unused' gcc warning in threadkeytest
+* Eliminate 'old_segv_handler is defined but unused' gcc warning on OpenBSD
+* Eliminate 'rand() may return deterministic values' warning
+* Eliminate 'unused parameter' compiler warnings reported by MS clang
+* Eliminate 'unused parameter' gcc warning in free() if IGNORE_FREE
+* Eliminate 'unused value' gcc warnings in init_global_static_roots (Symbian)
+* Eliminate GCC warning of unsafe __builtin_return_address(1) in Cmake script
+* Eliminate compiler warning of missing cast in LONG_MULT after shift
+* Eliminate warning of unused expression result in GC_FreeBSDGetDataStart
+* Ensure _GNU_SOURCE is defined if HAVE_DLADDR is defined by configure
+* Fix 'g++ not found' error on OpenBSD (Makefile.direct)
+* Fix 'implicit declaration of function pthread_atfork' gcc error on MinGW
+* Fix 'implicit declaration of function sbrk' gcc error on Symbian
+* Fix 'implicit declaration of iscntrl()' warning in cord/de_win (MinGW)
+* Fix 'info' buffer potential overrun in GC_save_callers
+* Fix 'l-value specifies const object' MSVC error in GC_push_many_regs
+* Fix 'linker input unused' error inside check_c_compiler_flag (CMake)
+* Fix 'missing binary operator before token' gcc error in gcconfig.h
+* Fix 'missing sysconf() prototype' gcc error in setjmp_t tool (OpenBSD)
+* Fix 'sigset_t undeclared' MS VC error if pthreads-w32 is used
+* Fix 'undefined reference' linker errors if shared build on OpenBSD (CMake)
+* Fix 'unused GC_set_and_save_fault_handler' warning on OS X
+* Fix GC_push_stack_for() to push also Xmm registers on Windows/x64
+* Fix GC_set_handle_fork(1) on Darwin when MPROTECT_VDB but no threads
+* Fix MACH_TYPE macro redefinition on Symbian/arm
+* Fix SVR4 macro definition order
+* Fix asm constraint in LONG_MULT for gcc/x86
+* Fix assertion violation in GC_get_maps on Linux if malloc redirection
+* Fix back graph and checksums support in WCC_MAKEFILE
+* Fix bitwise negation and rounding direction in setjmp_t tool
+* Fix checksums GC_record_fault invocation on Darwin
+* Fix closing bracket placement for case statement in configure
+* Fix deprecation warning about support of CMake older than v3.5
+* Fix extra 'extern C' for include signal.h in gcconfig.h
+* Fix getcontext() detection by CMake on OpenBSD
+* Fix handling of GC_gc_no counter wrap in GC_clear_stack
+* Fix handling of GC_gc_no counter wrap in GC_notify_or_invoke_finalizers
+* Fix indent of a closing curly brace in GC_forward_exception
+* Fix lock assertion violation in GC_try_to_collect_inner on OS X
+* Fix missing GC_pthread_sigmask on FreeBSD and NetBSD
+* Fix missing _setjmp() on djgpp
+* Fix missing atomic barriers in CORD_from_file_lazy
+* Fix missing outermost parentheses in CORD_pos_cur_char_addr and hugetest
+* Fix missing redirect and implementation of pthread_sigmask() on OpenBSD
+* Fix missing type widening before left shift in GC_MAKE_PROC
+* Fix misspelled GC_HEADERS_H macro in gc_priv.h
+* Fix null dereference in check_finalizer_nested if redirect malloc on Linux
+* Fix posix_memalign() to overwrite pointer storage only on success
+* Fix race in init_lib_bounds on Linux with glibc v2.34+ if redirect malloc
+* Fix skipped removal of page protection in case of address hash collision
+* Fix typos in comments
+* Fix undefined GC_real_pthread_sigmask if redirect malloc on OS X
+* Fix update of last_back_trace_gc_no if KEEP_BACK_PTRS is not defined
+* Handle GC_gc_no counter overflow properly in GC_print_trace
+* Include Darwin CoreFoundation.h only if 32-bit ARM
+* Make gc_allocator<void> members public
+* Re-enable incremental mode on OS X (arm64)
+* Remove .log and cordtest .tmp files by 'make clean' (Makefile.direct)
+* Remove a redundant check of HOST_ANDROID in gcconfig.h
+* Remove duplication of random numbers generator formula
+* Specify constexpr in GC allocators if C++20 or later
+* Support NetBSD/riscv64
+* Support non-msys MinGW build by CMake
+* Turn on handle fork by default on Darwin (multi-threaded only)
+* Use AO primitives in GC_RAND_NEXT instead of no_sanitize attribute
+* Workaround 'malloc inconsistent dll linkage' MS VC error in CMake script
+* Workaround MS Clang failure to compile de_win.rc
+* Workaround mark stack overflow in GC_push_finalizer_structures on MinGW
+
+
+== [8.2.4] 2023-05-26 ==
+
+* Abort with appropriate message if first call of mmap fails with EPERM
+* Adjust CORD_ec comment placement in ec.h
+* Adjust WoW64 workaround to work on UWP/WinRT
+* Adjust naming of Win32/64 and x86/64 words in comments and documentation
+* Avoid potential race between realloc and GC_block_was_dirty
+* Do not double-clear first two words of object in GC_generic_malloc
+* Do not mention FASTLOCK in comment
+* Do not mix debug and non-debug allocations in disclaim tests
+* Do not prohibit threaded builds with malloc redirection on non-Linux
+* Do not prohibit zero proc argument in GC_register_disclaim_proc
+* Eliminate '&array may not produce intended result' wcc warnings
+* Eliminate 'GC_unmap_end declared but unused' bcc warning in disclaim_bench
+* Eliminate 'ISO C++17 does not allow register specifier' gcc warning
+* Eliminate 'cast signed to bigger unsigned' CSA warning in WARNs, new_thread
+* Eliminate 'n obtained from untrusted source' code defect FP in test_cpp
+* Eliminate 'skipping config since MAXSIG/_NSIG is unknown' cppcheck FP
+* Eliminate data race FP between remove_protection and write_fault_handler
+* Eliminate data race FP reported in need_unreachable_finalization by TSan
+* Ensure 'new' system header is included by gc_cpp.h if GC_INCLUDE_NEW
+* Ensure GC_NO_PTHREAD_SIGMASK defined if no GC_pthread_sigmask prototype
+* Fix 'EMSCRIPTEN macro redefined' compile error
+* Fix 'ISO C90 forbids mixed decl and code' warning in SOFT_VDB dirty_init
+* Fix 'call to undeclared pthread_setname_np' errors in configure and cmake
+* Fix 'failed to create new win32 semaphore' Cygwin fatal error at fork
+* Fix 'operator new is missing throw(bad_alloc)' clang warning in gc_cpp.h
+* Fix 'overflow in conversion from word' g++ warning in GC_init
+* Fix 'unknown option --no-undefined' linker error in cmake script (OS X)
+* Fix 'unresolved _end' linker error when targeting Android bitcode
+* Fix CORD_next() indent inside loop in test_basics() of cordtest
+* Fix DCL_LOCK_STATE placement in GC_set_oom_fn
+* Fix GC_excl_table overrun on overflow in GC_exclude_static_roots
+* Fix GC_thread_is_registered for finished threads
+* Fix GC_unreachable_finalize_mark_proc to ensure its unique address
+* Fix GC_unregister_my_thread call before GC functions usage in gctest
+* Fix IRIX5 defined wrongly on FreeBSD/mips, WinCE/mips, Tandem S-Series
+* Fix allocated objects count increment in alloc8bytes of gctest
+* Fix alt-stack handling in GC_push_all_stacks if stack grows up
+* Fix comparisons to heap boundary in GC_get_back_ptr_info and GC_mark_from
+* Fix data race in GC_heapsize_at_forced_unmap variable
+* Fix description of client promise for IGNORE_OFF_PAGE allocated objects
+* Fix disabling of automatic dynamic libraries registration
+* Fix double initialization of main thread local free lists on Win32
+* Fix gccpp and gctba library names in gcinterface.md
+* Fix infinite loop in disable_gc_for_dlopen and GC_wait_for_gc_completion
+* Fix infinite wait in pthread_join/detach if thread already finished (Win32)
+* Fix joinable threads shutdown on NaCl
+* Fix loop condition over dll_thread_table in GC_lookup_pthread (Win32)
+* Fix missing GC_CALLBACK for GC_waitForSingleObjectInfinite
+* Fix missing extern C for __asan_default_options
+* Fix missing libalphagc.so dependency in Makefile.direct
+* Fix missing lock while updating GC_in_thread_creation in GC_exit_check
+* Fix missing recovery from faults in GC_mark_some on Win64 if MinGW
+* Fix missing result check of pthread_attr_getdetachstate in pthread_create
+* Fix mistyped function name in documentation of REDIRECT_REALLOC
+* Fix negative heap size values reported in WARN
+* Fix null pointer dereference in TRACE_TARGET
+* Fix of GC_bytes_allocd increment in GC_generic_malloc_inner
+* Fix overlapping region assertion in mark_some if malloc redirect on Linux
+* Fix potential SIGSEGV on out-of-memory in gctest
+* Fix signals delivery fail in find-leak mode if init from non-main thread
+* Fix stack top/bottom print order in GC_push_all_stacks if stack grows up
+* Fix store-and-dirty call in GC_CONS
+* Fix unregistering of thread created by intercepted pthread_create on NaCl
+* Fix unused GC_parse_version if no SOFT_VDB and no parallel mark on Linux
+* Fix use of unset errno after pthread_create/sigmask calls
+* Fix various typos in comments and documentation
+* Increment allocated objects count after GC_GCJ_MALLOC() in gctest
+* Invoke GC_oom_fn if GC_make_array_descriptor failed because of no memory
+* Make Emscripten Asyncify feature optional
+* Mention gctba library in README.cmake
+* Prevent 'function should return a value' BCC error in CMake script
+* Provide meaningful error message in case of Emscripten threaded build
+* Reduce local variable scope in resend_lost_signals_retry for cppcheck
+* Remove disable-warning options from WCC_MAKEFILE unrecognized by wcc v2.0
+* Remove false warning of missing libpthread.so on Linux
+* Remove redundant 'ifdef THREADS' around LOCK/UNLOCK in call_with_alloc_lock
+* Remove redundant GC_ATTR_UNUSED for GC_mark_and_push
+* Remove unused GC_old_sig_mask from gc_locks.h
+* Replace WARN in GC_mark_some wrapper back to GC_COND_LOG_PRINTF
+* Specify throw and noexcept for operator new/delete in gc_cpp.h for MS VC
+* Support Hurd/x86_64
+* Support client-defined stack pointer adjustment before thread stack push
+* Suppress 'unreachable code' wcc warning in I_HOLD_LOCK assertion (CMake)
+* Update autotools for release preparation (ac-2.71, am-1.16.5, m4-1.14.19)
+* Update dump function name in GC_DUMP_REGULARLY variable documentation
+* Use emscripten_stack_get_base instead of emscripten_scan_stack
+* Use sbrk() to get OS memory on Emscripten
+* Workaround 'writing into region of size 0' gcc warning in suspend_handler
+* Workaround CSA null pointer dereference FP in invalidate_map of cord/de
+* Workaround a malfunction of soft-dirty bits clearing on Power9
+
+
+== [8.2.2] 2022-08-26 ==
+
+* Abort if no progress with thread suspend/resume signals resending
+* Add CMake option to force libatomic_ops headers usage
+* Add _PROP suffix to CORD/GC[CPP]_VERSION variables in CMake script
+* Allow not to bypass pthread_cancel hardening in pthread_start
+* Allow to start marker threads in child of single-threaded client
+* Avoid potential race in GC_init_real_syms after GC_allow_register_threads
+* Avoid potential signal loss before sigsuspend in suspend_handler if TSan
+* Define SUNOS5SIGS macro for kFreeBSD
+* Distribute gc_gcj.h and some other headers in single-obj-compilation
+* Do not assert that GC is initialized at DLL_THREAD_DETACH (Win32)
+* Do not call SET_HDR() to remove forwarding counts if none exists in hblk
+* Do not call mprotect/mmap to GC_unmap/remap (Linux)
+* Do not count unmapped regions if GC_unmap is madvise-based (Linux)
+* Do not define NEED_FIND_LIMIT in case of OpenBSD user threads
+* Do not fail tests if pthread_create returns resource unavailable error
+* Do not name GCC intrinsics as C11 ones
+* Do not probe to find main data root start if dl_iterate_phdr exists
+* Do not send signal to thread which is suspended manually
+* Do not use usleep between signals resend if ThreadSanitizer
+* Eliminate '-pedantic is not option that controls warnings' GCC-6.3 message
+* Eliminate '/GS can not protect parameters' MS VC warning in msvc_dbg
+* Eliminate 'R_AARCH64_ABS64 used with TLS symbol' linker warning (clang)
+* Eliminate 'buffer overflow detected' FP error in realloc_test
+* Eliminate 'extension used' clang warning in sparc_mach_dep.S (configure)
+* Eliminate 'function/data pointer conversion in expression' MSVC warning
+* Eliminate 'implicit decl of _setjmp' gcc warning if -std=c11 on Cygwin
+* Eliminate 'layout of aggregates has changed in GCC 5' warning in test_cpp
+* Eliminate 'new_l may be used uninitialized' gcc warning in os_dep (Cygwin)
+* Eliminate 'old_gc_no is initialized but not referenced' MS VC false warning
+* Eliminate 'possible loss of data' compiler warning in GC_envfile_getenv
+* Eliminate 'potentially uninitialized local variable tc' warning (MSVC)
+* Eliminate 'skipping config since MAX_HEAP_SECTS is unknown' cppcheck FP
+* Eliminate 'unused but set variable' gcc warnings in cpptest
+* Eliminate 'value exceeds maximum size' warnings in debug_malloc, huge_test
+* Eliminate 'writing into region of size 0' gcc FP warning in realloc
+* Eliminate ASan stack-buffer-underflow FP in GC_mark_and_push_stack (E2K)
+* Eliminate code defect about incorrect size of allocated object (leaktest)
+* Eliminate data race reported by TSan in GC_have_errors
+* Eliminate division-by-zero FP warning in GC_ASSERT in reclaim_block
+* Eliminate stringop-overflow gcc-12 warning in CORD__next
+* Ensure typed objects descriptor is never located in the first word
+* Fix 'GC_greatest_stack_base_below is defined but not used' warning (IA64)
+* Fix 'GC_text_mapping not used' GCC warning if redirect malloc w/o threads
+* Fix 'ISO C forbids conversion of function pointer to object' warning
+* Fix 'undeclared getpagesize' compiler warning on AIX and OSF1
+* Fix 'undefined reference to __data_start' linker error on Linux/aarch64
+* Fix 'unresolved __imp__wsprintfA' linker error in msvc_dbg.c (MSVC)
+* Fix 'unresolved symbol GetModuleHandle' error in win32_threads.c (UWP)
+* Fix (workaround) stack overflow in gctest on Alpine Linux/s390x
+* Fix GC_ATTR_NO_SANITIZE_THREAD definition for GCC
+* Fix GC_allocate_ml incorrect cleanup in GC_deinit if pthreads (MinGW)
+* Fix GC_dirty() argument in GC_malloc_explicitly_typed_ignore_off_page
+* Fix GC_make_descriptor for zero length argument
+* Fix GC_suspend_thread if called before thread destructor
+* Fix GC_unmapped_bytes update in GC_unmap for Sony PS/3
+* Fix SIGSEGV caused by dropped stack access from child process in gctest
+* Fix SUNOS5SIGS documentation to match macro definition in gcconfig.h
+* Fix abort in Win32 DllMain if PARALLEL_MARK
+* Fix abort when GC_repeat_read returns zero
+* Fix assertion about built-in AO_test_and_set_acquire on sparc64 (gcc-12)
+* Fix assertion violation in GC_allow_register_threads on Windows
+* Fix assertion violation of GC_thread_key alignment if pthread-based TLS
+* Fix comment in GC_init regarding GC_init_parallel call
+* Fix context saving when GC_suspend_thread(self)
+* Fix data race in fail_proc1 of gctest
+* Fix hang in GC_free if GC_PREFER_MPROTECT_VDB (Mingw64)
+* Fix hang in select() called from suspend signal handler if TSan
+* Fix hang on sem_wait in GC_suspend_thread if thread was resumed recently
+* Fix hb_obj_kind type in documentation (ASCII diagram) describing hblkhdr
+* Fix incremental mode enabling in gctest if TEST_MANUAL_VDB
+* Fix linking of tests in case of finalization is off
+* Fix lock assertion violation in GC_find_limit if always multi-threaded
+* Fix memory return to OS in GC_unmap
+* Fix missing lock when GC_generate_random_valid_address is called
+* Fix missing write() declaration if CONSOLE_LOG (Watcom)
+* Fix nodist_libgc_la_SOURCES value in Makefile.am for Solaris/sparc
+* Fix oldProc initialization in gc_cleanup and eliminate related warnings
+* Fix parallel_initialized assertion violation in initsecondarythread (Win32)
+* Fix potential race if start_mark_threads called from threads in child
+* Fix propagation of out-of-memory occurred in GC_make_sequence_descriptor
+* Fix pthread_setname_np and dladdr detection by CMake
+* Fix race between calloc_explicitly_typed and push_complex_descriptor
+* Fix typos in comments and debugging.md
+* Fix undefined __stack_base__ on UWP/arm64 (llvm-mingw)
+* Force GC_with_callee_saves_pushed in suspend_handler if NO_SA_SIGACTION
+* Link with rt library to get clock_gettime where necessary
+* Make finalizer_closure pointer read/write atomic in malloc and callback
+* Move platform-specific sleep call to GC_usleep (refactoring)
+* Pass -lrt linker option in CMake script on HP/UX, NetBSD
+* Prevent (fix) parallel custom mark procs run in single-threaded clients
+* Prevent changing of GC_markers_m1 value while collection in progress
+* Refer to Makefile.direct instead of deleted Makefile file in README
+* Relax assertion of hb_n_marks in reclaim_block if more than two markers
+* Remove IF_IA64 macro in pthread_stop_world (refactoring)
+* Remove checking of RS6000 completely
+* Remove duplicate check of MSWIN_XBOX1 in os_dep.c
+* Remove duplicate include gc_tiny_fl.h in gc_priv.h
+* Remove non-working check of M68K in gctest
+* Remove useless TSan W/A about read of mark_lock_holder for Windows
+* Replace RAISE_SIGNAL macro with a static function (refactoring)
+* Replace SSH cloning with HTTPS one in README
+* Retry pthread_kill if EAGAIN (Linux)
+* Revert "Check real-symbols are already initialized in pthread_join/detach"
+* Revert "Remove nested always-false ifdef for HPUX and FREEBSD"
+* Revert addition of msvc_dbg.h in include.am
+* Set default build type to RelWithDebInfo (CMake)
+* Start configure help messages with a lower case letter
+* Support 'z' format modifier by CORD_vsprintf
+* Support Elbrus 2000 (Linux/e2k)
+* Support GCC MCF thread model (mcfgthreads) in configure (MinGW)
+* Support GC_remove_roots on Win32
+* Support OpenBSD/riscv64
+* Support build using Makefile.direct on Linux/sparc
+* Support space-separated flags in CFLAGS_EXTRA passed to CMake
+* Update README.win32 about default build configuration (configure, cmake)
+* Update documentation of GC_RATE and MAX_PRIOR_ATTEMPTS
+* Use SIGRTMIN+6 as suspend signal if sigrt-signals on OpenBSD
+* Use SIGUSR1/2 on FreeBSD/arm64
+* Use compiler TLS on NetBSD only if at least gcc-4.4 or clang-3.9
+* Workaround 'info is not assigned' cppcheck FP if assertions on (OS X)
+* Workaround SIG_SUSPEND delivery to thread inside mutex_lock fail if TSan
+* Workaround TSan FP about race between generic_malloc and array_mark_proc
+* Workaround TSan FP in acquire_mark_lock called from fork_prepare_proc
+* Workaround TSan FP warning in finalized_malloc, push_unconditionally
+* Workaround TSan FP warning in fork_prepare_proc
+* Workaround TSan FP warning in push_marked1/2/4, ptr_store_and_dirty
+* Workaround Thread Sanitizer (TSan) FP warning in is_valid_displacement
+* Workaround call stack size exceeded in gctest (Wasm)
+* Workaround crash in FreeBSD rand() by avoiding its concurrent usage
+* Workaround gctest hang if test compiled as C++ code by MSVC (CMake)
+* Workaround msvc_dbg.c build failure on arm[64] (MSVC)
+
+
+== [8.2.0] 2021-09-29 ==
+
+* Add API for accessing incremental GC time limit with nanosecond precision
+* Add API function to force start of incremental collection
+* Add GC_ prefix to scan_ptr and some other static variables (refactoring)
+* Add GC_get/set_disable_automatic_collection API
+* Add I_HOLD_LOCK assertion to expand_hp_inner and related functions
+* Add assertion on free-list argument and result of GC_new_kind
+* Add assertion that GC is initialized to base incremental_protection_needs
+* Add assertions that GC_page_size is initialized
+* Add cordtest, staticrootstest, test_cpp, tracetest, disclaim tests (CMake)
+* Add debug messages on thread suspend/resume (Win32)
+* Add dummy testing of GC_incr_bytes_allocd/freed
+* Add table of contents in gcdescr.md
+* Add testing of GC_CALLOC/MALLOC_EXPLICITLY_TYPED (gctest)
+* Adjust formatting of numbered lists in README.md to match other .md files
+* Adjust highlighting of API prototypes in gcinterface.md
+* Adjust macro def/usage for AVR32, CRIS, NETBSD, OPENBSD, SH4 in gcconfig.h
+* Adjust printf calls in gctest check_heap_stats so that each has new-line
+* Allow incremental GC on Cygwin
+* Allow memory unmapping in case of MPROTECT_VDB
+* Allow to disable GWW or mprotect-based VDB at build
+* Allow to disable Glibc FPU exception mask and TSX workarounds (Linux)
+* Allow to disable __builtin_return_address(1) usage (x86 and x64)
+* Allow to specify custom value of LOG_PHT_ENTRIES
+* Always abort on failure to access /proc/self/maps (Linux)
+* Always define default_push_other_roots (code refactoring)
+* Avoid gcc stringop-overflow warning for intended overflow in smashtest
+* Avoid initial 3ms pause on world stop/start with GC_retry_signals (Linux)
+* Build cord.lib by Makefile.direct, NT_MAKEFILE, OS2_MAKEFILE, WCC_MAKEFILE
+* Build gc as a shared multi-threaded library by default (CMake)
+* Build gccpp library by Makefile.direct, NT_MAKEFILE and WCC_MAKEFILE
+* Build gctba library
+* Build shared libraries by default (WCC_MAKEFILE)
+* Change CLOCK_TYPE to timespec for Nintendo Switch (code refactoring)
+* Change EMSCRIPTEN macro for internal use to no-underscore format
+* Change log_size fields of finalizer to unsigned type (code refactoring)
+* Change type of toggleref_array_size/capacity to size_t (code refactoring)
+* Check leak of objects allocated by CRT malloc in gctest (MS VC)
+* Check real-symbols are already initialized in pthread_join/detach
+* Collapse multiple includes of windows.h (code refactoring)
+* Comments reformatting in mark.c to properly delimit sentences
+* Compile de test GUI app with resources (CMake)
+* Compile gc.c unless building static libraries (NT_MAKEFILE, WCC_MAKEFILE)
+* Compile msvc_dbg.c by CMake script (MS VC)
+* Declare API function and print amount of memory obtained from OS
+* Define GC_win32_free_heap API function for all Windows targets
+* Define STATIC macro to static by default
+* Depend number of fork_a_thread calls on NTHREADS (gctest)
+* Detect dladdr() presence in CMake script
+* Detect presence of execinfo.h system header in CMake script
+* Detect presence of getcontext and dl_iterate_phdr in CMake script
+* Detect sigsetjmp() availability in CMake script
+* Disable Clang/GCC aliasing optimization in CMake script by default
+* Do not build tests by default (Makefile.direct and other Makefiles)
+* Do not build the tests by default (CMake)
+* Do not call GC_push_conditional unless PROC_VDB
+* Do not call add_to_our_memory with null pointer (refactoring)
+* Do not compile pthread_*.c files in Cygwin or MSYS (CMake)
+* Do not define GC_write_cs for Xbox One target
+* Do not define HAVE_NO_FORK for all Unix-like systems
+* Do not hard-code CMAKE_DL_LIBS value and install paths (CMake)
+* Do not hard-code finalizable objects limit which triggers GC
+* Do not update scratch_last_end_ptr unless used by reg dynamic libraries
+* Document GC_incr_bytes_allocd/freed API function
+* Eliminate '(long)size<=0 is always false' cppcheck FP
+* Eliminate 'Consecutive return is unnecessary' cppcheck style warning
+* Eliminate 'accessing GC_dont_gc without lock' in GC_init code defect FP
+* Eliminate 'bytes_freed access w/o lock in incr_bytes_free' code defect FP
+* Eliminate 'checking if unsigned i < 0' cppcheck FP in is_heap_base
+* Eliminate 'hash_val value is never used' cppcheck false positive
+* Eliminate 'passing tainted var maps_buf to tainted sink' code defect FP
+* Eliminate 'retry_cnt is assigned value but never used' cppcheck FP
+* Eliminate 'stop variable is always 0' compiler warning in print_callers
+* Eliminate 'struct member os_callback is never used' cppcheck warning
+* Eliminate 't->flags not atomically updated' code defect FP
+* Eliminate 'tmpl might be accessed at non-zero index' cppcheck error
+* Eliminate GCC warning of unsafe __builtin_return_address(1)
+* Eliminate code duplication in reclaim_clear and disclaim_and_reclaim
+* Eliminate double lock code defect false positive in generic_lock
+* Eliminate memory leak reported in add_current_malloc_heap at exit (Win32)
+* Emscripten single-threaded support (detect stack base, push registers)
+* Enable CMake-based build for Borland and Watcom compilers
+* Enable compilation without C runtime (Win32)
+* Enable fork testing in single-thread builds (Unix-like)
+* Enable mprotect-based incremental GC for Linux/arm and Linux/aarch64
+* Enable true incremental collection even if parallel marker is on
+* Enable use of __builtin_unwind_init() if clang-8 or later
+* Ensure ELFSIZE is defined in dyn_load.c for OpenBSD (code refactoring)
+* Ensure add_to_heap_inner arguments are valid (refactoring)
+* Ensure all getters and setters are run at least once by gctest (pthreads)
+* Export CMake targets with namespace BDWgc
+* Fix 'const obj must be initialized if not extern' error in gc_alloc_ptrs.h
+* Fix ./libgc.la dependency on FreeBSD (Automake)
+* Fix HOST determination in CMake script
+* Fix copyright message in de_win.rc, gc_cpp.cc, ec.h and specific.h
+* Fix missing OS_TYPE definition for some targets
+* Fix mmap(PROT_NONE) failure if RLIMIT_AS value is low (Linux)
+* Generate cordtest and de executable files in GC base folder
+* Generate pkg-config metadata file (CMake)
+* Get rid of some non-ELF ifdefs (code refactoring)
+* Handle potential incomplete buffer read in GC_linux_main_stack_base
+* Implement GET_TIME for Nintendo Switch
+* Increase NTHREADS value in tests if code coverage analysis
+* Install docs and man page if enable_docs (CMake)
+* Install gc_gcj.h and gc_pthread_redirects.h only if appropriate
+* Log abort message details even if not print_stats (unless SMALL_CONFIG)
+* Mark buffer returned by get_maps as const (code refactoring)
+* Move C++ GC_ATTR_EXPLICIT and GC_NOEXCEPT definition to gc_config_macros.h
+* Move GC state non-pointer variables into GC_arrays (code refactoring)
+* Move GC state pointer variables into GC_arrays
+* Move GC_scratch_recycle_inner() to alloc.c (refactoring)
+* Move GC_throw_bad_alloc definition to new C++ file
+* Move QNX and Emscripten macro definitions to proper place in gcconfig.h
+* Move definition of GC_n_mark_procs and GC_n_kinds from mark.c to misc.c
+* New API (GC_set_markers_count) to control number of parallel markers
+* New API function to clear GC exclusion table
+* New API function to get size of object debug header
+* New API standalone functions to acquire and release the allocator lock
+* New CMake option (disable_gc_debug) to remove debugging code
+* New CMake option (disable_handle_fork) to disable fork handling completely
+* New macro (CONSOLE_LOG) to enable logging to console on Win32
+* New macro (GCTEST_PRINT_VERBOSE) to enable verbose logging in test.c only
+* New macro (NO_MSGBOX_ON_ERROR) to avoid message box on GC abort (Win32)
+* OpenBSD does not use ELF_CLASS (code refactoring)
+* Pass -D GC_DLL -fvisibility=hidden if default configure build is requested
+* Pass -no-undefined linker flag if building shared libraries (CMake)
+* Print pid of child processes if verbose logging (gctest)
+* Read environment variables from a file on WinCE (CMake script)
+* Reduce stack-allocated buffer in get_nprocs from 4KB to 1.7KB
+* Refine flags field comment in pthread_support.h
+* Reflect result of VDB selection at runtime in incremental_protection_needs
+* Reformat code of GC_push_roots
+* Reformat gc.man (wrap long lines)
+* Reformatting and code refactoring of CMake script
+* Remove 'current users' section from overview.md
+* Remove 'distributed ports', 'scalable versions' sections from overview.md
+* Remove AC_MSG_RESULT for THREADDLLIBS (dgux386)
+* Remove Borland-specific Makefile and gc.mak script
+* Remove GC_eobjfreelist variable in typd_mlc.c (code refactoring)
+* Remove GC_gcj_malloc_initialized variable (code refactoring)
+* Remove Linux-specific commands for building cord/de from Makefile.direct
+* Remove Win32 main_thread static variable if threads discovery is disabled
+* Remove code duplication between GC_unmap and GC_unmap_gap (refactoring)
+* Remove code duplication between PROTECT and UNPROTECT macros (refactoring)
+* Remove commented out assignment of gc_use_mmap in configure (refactoring)
+* Remove dash characters comprising prefix of some verbose logs (gctest)
+* Remove dependency on user32.dll import library from static libgc (Win32)
+* Remove documentation specific to particular old BDWGC releases
+* Remove duplicate Linux-related macro definitions in gcconfig.h
+* Remove duplicate macro definitions in gcconfig.h except for Linux
+* Remove gcmt-dll generation, rename libgc-lib.a to libgc.a (CMake)
+* Remove goto statement in print_callers (code refactoring)
+* Remove limit on number of heap sections
+* Remove new_gc_alloc.h file
+* Remove redundant GC_with_callee_saves_pushed call in multi-threaded builds
+* Remove redundant check of GC_free argument in register_finalizer
+* Remove redundant type casts in backgraph HEIGHT_UNKNOWN/IN_PROGRESS
+* Remove unused GC_prev_heap_addr (refactoring)
+* Remove unused STACK_GRAN macro definitions (code refactoring)
+* Remove unused sparc_sunos4_mach_dep.s file
+* Remove useless empty statements after block ones (refactoring)
+* Remove weakobj_free_list variable in disclaim_weakmap_test (refactoring)
+* Rename READ to PROC_READ in os_dep.c (code refactoring)
+* Rename cord/cord test executable to de (CMake)
+* Rename ext_descr to typed_ext_descr_t (code refactoring)
+* Rename gc64.dll to gc.dll and gc[64]_dll.lib to gc.lib in NT_MAKEFILE
+* Rename gc68060.lib to gc.lib, cord/cord68060.lib to cord.lib in SMakefile
+* Rename make_as_lib option to enable_static in NT_MAKEFILE and WCC_MAKEFILE
+* Rename nothreads option to disable_threads in NT_MAKEFILE
+* Repeat run_one_test NTHREADS times by gctest if single-threaded
+* Replace "msecs" with "ms" in all comments and messages
+* Replace 'stack base' with 'stack bottom' in the documentation
+* Replace SN_TARGET_ORBIS to PLATFORM_* and GC_NO_* macros
+* Replace _M_AMD64 macro with _M_X64 (code refactoring)
+* Replace find_limit_openbsd to find_limit_with_bound (OpenBSD 5.2+)
+* Replace obsolete AC_HELP_STRING with AS_HELP_STRING (refactoring)
+* Replace push_one calls with push_many_regs one for Win32 thread context
+* Report memory region bounds and errno on GC_unmap/remap failure
+* Report presence of process fork testing (gctest)
+* Report time with a nanosecond precision where available
+* Retry suspend/resume signals on all platforms by default
+* Run tree and typed tests in child process (gctest)
+* Set GC_collecting hint for GC_collect_a_little_inner calls (pthreads)
+* Set name of GC marker threads
+* Set so-version for installed shared libraries (CMake)
+* Simplify logged message in scratch_recycle
+* Simplify loops of collect_a_little/stopped_mark invoking mark_some
+* Support -fvisibility=hidden option in CMake script
+* Support CFLAGS_EXTRA to pass extra user-defined compiler flags (CMake)
+* Support FreeBSD/RISC-V, Linux/arc, LoongArch, OpenBSD/powerpc64
+* Support header files installation (CMake)
+* Support most configure options in CMake script
+* Suppress warnings in test_tinyfl() of gctest reported by Watcom C complier
+* Take nanoseconds into account when updating full_gc_total_time
+* Turn off C++ API by default, export it in gccpp library (CMake)
+* Turn on automatic fork() handling by default on Android
+* Update README.cmake regarding Unix, C++ and tests
+* Update libgc.so version info to differentiate against v8.0.x
+* Update the ASCII diagrams describing the tree structure for pointer lookups
+* Update the documentation to match the current GC implementation
+* Upgrade cmake_minimum_required(version) to 3.1
+* Use CreateThread without GC_ prefix in gctest (code refactoring)
+* Use KB/MB/GB abbreviations uniformly across entire documentation
+* Use USE_MMAP_ANON when USE_MMAP is configured on OpenBSD
+* Use a specific Emscripten allocator for Tiny
+* Use atomic primitives for Sony PlayStation Portable 2 and PS4
+* Use better precision Windows timers
+* Use clock_gettime() instead of clock() on Cygwin and Linux
+* Use compiler TLS on FreeBSD and NetBSD
+* Use mprotect-based VDB on PowerPC and S390 (Linux)
+* Use soft dirty bits on Linux (x86, powerpc, s390, x64)
+* Workaround 'condition result<=0 is always false' cppcheck FP in get_maps
+* Workaround 'push_regs configured incorrectly' error (GCC-11)
+* Workaround 'same value in both branches of ternary operator' cppcheck FP
+* Workaround various cppcheck false positives
+
+
+== [8.0.14] 2024-09-07 ==
+
+* Disable backtrace saving at garbage collections if DONT_SAVE_TO_LAST_STACK
+* Fix infinite resend lost signals if a thread is restarted by SIGQUIT
+
+Also, includes 7.6.22 changes
+
+
+== [8.0.12] 2024-02-04 ==
+
+* Eliminate 'make_key is defined but unused' gcc warning in threadkeytest
+* Ensure _GNU_SOURCE is defined if HAVE_DLADDR is defined by configure
+* Fix 'implicit declaration of function pthread_atfork' gcc error on MinGW
+* Fix 'missing binary operator before token' gcc error in gcconfig.h
+* Fix GC_set_handle_fork(1) on Darwin when MPROTECT_VDB but no threads
+* Fix checksums GC_record_fault invocation on Darwin
+* Fix extra 'extern C' for include signal.h in gcconfig.h
+
+Also, includes 7.6.20 changes
+
+
+== [8.0.10] 2023-05-26 ==
+
+* Abort with appropriate message if first call of mmap fails with EPERM
+* Avoid potential race between realloc and GC_block_was_dirty
+* Do not prohibit zero proc argument in GC_register_disclaim_proc
+* Eliminate '&array may not produce intended result' wcc warnings
+* Eliminate 'cast signed to bigger unsigned' CSA warning in GC_new_thread
+* Ensure 'new' system header is included by gc_cpp.h if GC_INCLUDE_NEW
+* Fix 'overflow in conversion from word' g++ warning in GC_init
+* Fix description of client promise for IGNORE_OFF_PAGE allocated objects
+* Fix infinite loop in disable_gc_for_dlopen and GC_wait_for_gc_completion
+* Fix missing extern C for __asan_default_options
+* Fix store-and-dirty call in GC_CONS
+* Fix typo in comment of GC_Thread_Rep.dummy
+* Fix use of unset errno after pthread_sigmask calls
+* Increment allocated objects count after GC_GCJ_MALLOC() in gctest
+* Remove redundant GC_ATTR_UNUSED for GC_mark_and_push
+* Workaround CSA null pointer dereference FP in invalidate_map of cord/de
+
+Also, includes 7.6.18 changes
+
+
+== [8.0.8] 2022-08-26 ==
+
+* Avoid potential race in GC_init_real_syms after GC_allow_register_threads
+* Define SUNOS5SIGS macro for kFreeBSD
+* Distribute gc_disclaim.h in single-obj-compilation
+* Do not assert that GC is initialized at DLL_THREAD_DETACH (Win32)
+* Do not name GCC intrinsics as C11 ones
+* Do not send signal to thread which is suspended manually
+* Eliminate 'buffer overflow detected' FP error in realloc_test
+* Eliminate 'extension used' clang warning in sparc_mach_dep.S (configure)
+* Eliminate 'function/data pointer conversion in expression' MSVC warning
+* Eliminate 'implicit decl of _setjmp' gcc warning if -std=c11 on Cygwin
+* Eliminate 'new_l may be used uninitialized' gcc warning in os_dep (Cygwin)
+* Eliminate 'old_gc_no is initialized but not referenced' MS VC false warning
+* Eliminate 'possible loss of data' compiler warning in GC_envfile_getenv
+* Eliminate 'value exceeds maximum size' warnings in debug_malloc, huge_test
+* Eliminate 'writing into region of size 0' gcc FP warning in realloc
+* Eliminate division-by-zero FP warning in GC_ASSERT in reclaim_block
+* Eliminate stringop-overflow gcc-12 warning in CORD__next
+* Ensure typed objects descriptor is never located in the first word
+* Fix 'GC_greatest_stack_base_below is defined but not used' warning (IA64)
+* Fix 'GC_text_mapping not used' GCC warning if redirect malloc w/o threads
+* Fix 'ISO C forbids conversion of function pointer to object' warning
+* Fix 'undeclared getpagesize' compiler warning on AIX and OSF1
+* Fix 'undefined reference to __data_start' linker error on Linux/aarch64
+* Fix GC_allocate_ml incorrect cleanup in GC_deinit if pthreads (MinGW)
+* Fix GC_dirty() argument in GC_malloc_explicitly_typed_ignore_off_page
+* Fix GC_make_descriptor for zero length argument
+* Fix GC_suspend_thread if called before thread destructor
+* Fix GC_unmapped_bytes update in GC_unmap for Sony PS/3
+* Fix SIGSEGV caused by dropped stack access from child process in gctest
+* Fix SUNOS5SIGS documentation to match macro definition in gcconfig.h
+* Fix abort in Win32 DllMain if PARALLEL_MARK
+* Fix assertion about built-in AO_test_and_set_acquire on sparc64 (gcc-12)
+* Fix assertion violation in GC_allow_register_threads on Windows
+* Fix assertion violation of GC_thread_key alignment if pthread-based TLS
+* Fix context saving when GC_suspend_thread(self)
+* Fix data race in fail_proc1 of gctest
+* Fix get_maps failure when GC_repeat_read returns zero
+* Fix hang in GC_free if GC_PREFER_MPROTECT_VDB (Mingw64)
+* Fix hang in select() called from suspend signal handler if TSan
+* Fix hang on sem_wait in GC_suspend_thread if thread was resumed recently
+* Fix hb_obj_kind type in documentation (ASCII diagram) describing hblkhdr
+* Fix incremental mode enabling in gctest if TEST_MANUAL_VDB
+* Fix lock assertion violation in GC_find_limit if always multi-threaded
+* Fix missing lock when GC_generate_random_valid_address is called
+* Fix nodist_libgc_la_SOURCES value in Makefile.am for Solaris/sparc
+* Fix oldProc initialization in gc_cleanup and eliminate related warnings
+* Fix parallel_initialized assertion violation in initsecondarythread (Win32)
+* Fix potential race if start_mark_threads called from threads in child
+* Fix propagation of out-of-memory occurred in GC_make_sequence_descriptor
+* Fix race between calloc_explicitly_typed and push_complex_descriptor
+* Fix stack overflow in gctest on Alpine Linux/s390x
+* Fix typo in debugging.html
+* Fix typos in comments of .c files and gc.h
+* Fix undefined __stack_base__ on UWP/arm64 (llvm-mingw)
+* Make finalizer_closure pointer read/write atomic in malloc and callback
+* Prevent (fix) parallel custom mark procs run in single-threaded clients
+* Prevent changing of GC_markers_m1 value while collection in progress
+* Refer to Makefile.direct instead of deleted Makefile file in README
+* Relax assertion of hb_n_marks in reclaim_block if more than two markers
+* Remove checking of RS6000 completely
+* Remove duplicate check of MSWIN_XBOX1 in os_dep.c
+* Remove non-working check of M68K in gctest
+* Remove useless TSan W/A about read of mark_lock_holder for Windows
+* Replace SSH cloning with HTTPS one in README
+* Revert "Remove nested always-false ifdef for HPUX and FREEBSD"
+* Revert addition of msvc_dbg.h in include.am
+* Support 'z' format modifier by CORD_vsprintf
+* Update documentation of GC_RATE and MAX_PRIOR_ATTEMPTS
+* Use SIGRTMIN+6 as suspend signal if sigrt-signals on OpenBSD
+* Workaround TSan FP about race between generic_malloc and array_mark_proc
+* Workaround TSan FP warning in finalized_malloc, push_unconditionally
+* Workaround TSan FP warning in push_marked1/2/4, ptr_store_and_dirty
+* Workaround Thread Sanitizer (TSan) FP warning in is_valid_displacement
+* Workaround crash in FreeBSD rand() by avoiding its concurrent usage (tests)
+
+
+== [8.0.6] 2021-09-28 ==
+
+* Add loop to handle abort error like in suspend logic on Darwin
+* Add support of OpenBSD/aarch64
+* Add threading libraries to bdw-gc.pc
+* Allocate start_info struct on the stack in GC_pthread_create
+* Allow GC_PAUSE_TIME_TARGET environment variable values smaller than 5 ms
+* Avoid compiler warning about unused d in GC_CALLOC/MALLOC_EXPLICITLY_TYPED
+* Avoid gcc stringop-overflow warning for intended overflow in smashtest
+* Check _MSVC_LANG macro in addition to __cplusplus (MS VC)
+* Compile C++ code with exception handling enabled in NT_MAKEFILE
+* Define OS_TYPE and DATAEND for UWP targets
+* Disable mprotect-based incremental GC if /proc roots are used (Linux)
+* Do not report 'Incremental GC incompatible' warning more than once
+* Do not use Manual VDB mode if C malloc is redirected
+* Do not use iOS private symbols
+* Eliminate 'GC_non_gc_bytes is deprecated' warning in new_gc_alloc.h
+* Eliminate 'GC_old_bus_handler defined but not used' compiler warning
+* Eliminate 'cast between incompatible func types' warnings for FARPROC vars
+* Eliminate 'comparing signed and unsigned values' BCC warning in cordtest
+* Eliminate 'gc_pthread_redirects.h should contain header guard' code defect
+* Eliminate 'implicit declaration of sbrk' gcc warning if -std=c11 on Cygwin
+* Eliminate 'possible loss of data' BCC and MS VC warnings
+* Eliminate 'static GC_sysinfo definition has incomplete type' Clang warning
+* Eliminate 'unused function' compiler warnings (GC_add_map_entry, GC_lock)
+* Eliminate 'while clause does not guard' GCC warning in GC_parse_map_entry
+* Enable sbrk-to-mmap fallback on major supported Unix-like platforms
+* Ensure process is running on one CPU core if AO ops are emulated with locks
+* Explicitly zero-initialize trace_buf (fix trace_buf initialization)
+* Fix 'ACCESS_VIOLATION in marker' GC warning on Win32 async thread start
+* Fix 'GC_generic_malloc must be available' GCC error in new_gc_alloc.h
+* Fix 'ISO C++17 does not allow dynamic exception spec' clang-8 error
+* Fix 'Wrong __data_start/_end pair' if -Bsymbolic-functions used (Linux)
+* Fix 'condition pred!=NULL is always true' compiler warning
+* Fix 'external linkage required for var because of dllimport' error on MinGW
+* Fix 'ulong undefined' compilation error on AIX
+* Fix 'undefined reference to __data_start' linker error on RISC-V
+* Fix 'use of undeclared BUS_PAGE_FAULT' compilation error on FreeBSD 12
+* Fix 'write to GC log failed' error (Cygwin)
+* Fix 'wrong finalization data' gctest failure on Windows
+* Fix CMake build on macOS Catalina
+* Fix GC_OPENBSD_THREADS definition (OpenBSD/hppa)
+* Fix GC_proc_fd value in child process at fork (Solaris)
+* Fix GC_with_callee_saves_pushed for Android NDK r23 (clang-12)
+* Fix MPROTECT_VDB definition for single-threaded GC builds
+* Fix OS_TYPE and USE_MMAP_ANON definitions for Cygwin/x64
+* Fix STACKBOTTOM on 32-bit HP/UX 11.11
+* Fix abort in GC_printf when gctest is built as WinMain executable (Cygwin)
+* Fix assertion violation in register_dynlib_callback on Android
+* Fix build for OS X (CMake)
+* Fix building of shared library with C++ support on MinGW
+* Fix compiling by Makefile.direct on OpenBSD/UltraSparc
+* Fix configure message about 'AIX gcc optimization fix'
+* Fix cordtest build in SMakefile.amiga
+* Fix data race regarding *rlh value in generic_malloc_many
+* Fix first_thread stack_base initialization if custom GC_stackbottom (Win32)
+* Fix gc_allocator.h compilation by Clang
+* Fix gc_cflags variable name in configure (HP/UX)
+* Fix handling of areas smaller than page size in GC_scratch_recycle
+* Fix incorrect markup formatting in documentation
+* Fix misaligned tlfs passed to AO_load on m68k
+* Fix missing GC_quiet declaration in pcr_interface.c
+* Fix missing gc_dlopen.c and specific.c in CMake script
+* Fix missing scratch_last_end_ptr update (Irix)
+* Fix mmap() failures on AIX, HP/UX and Haiku
+* Fix overflow of scratch_free_ptr value
+* Fix page_was_[ever_]dirty() for static roots (Solaris)
+* Fix printf format specifier in simple_example.md
+* Fix save_callers for multi-threaded case if built-in backtrace unavailable
+* Fix subexpression widening in memhash() of disclaim_weakmap_test
+* Fix test_cpp failure caused by arbitrary link order (Win32)
+* Fix test_cpp failure when gc_cpp resides in a dll (Borland, Watcom)
+* Fix various typos mostly in documentation files
+* Fix word size, data start and alignment for OpenBSD/mips64(el)
+* Include <alloca.h> when using alloca on AIX
+* Limit number of unmapped regions (Linux and DragonFly)
+* New macro to avoid system-wide new/delete inlining in gc_cpp.h (Win32)
+* Prevent GetThreadContext failure (Windows)
+* Prevent WARN of incompatible incremental GC if default or manual VDB
+* Reduce a time period between GetExitCodeThread and SuspendThread (Win32)
+* Refactoring of WoW64 workaround (Win32)
+* Refine GC_INIT documentation about its multiple invocation
+* Refine GC_parallel documentation in gc.h
+* Refine do_blocking() documentation in gc.h
+* Remove a misleading comment about Solaris in gc.h
+* Remove cord .h files from list of non-installed headers (Automake)
+* Remove dead part of condition to define NEED_FIND_LIMIT in gc_priv.h
+* Remove gcmt-lib generation by CMake
+* Support MSYS builds by CMake and configure
+* Update documentation about the incremental collector support
+* Use HEURISTIC2 on OpenBSD when single-threaded
+* Use pstat_getprocvm to determine main stack bottom on HP-UX
+* Workaround 'expression is only useful for its side effects' WCC warning
+* Workaround clang-3.8/s390x bug when processing __builtin_frame_address
+* Workaround fread fail after enable_incremental if malloc redirected (Linux)
+
+
+== [8.0.4] 2019-03-02 ==
+
+* Avoid a full GC when growing finalizer tables if in incremental mode
+* Avoid potential race in hb_sz access between realloc and reclaim_block
+* Avoid test.o rebuild on tests folder timestamp change (Makefile.direct)
+* Avoid unexpected heap growth in gctest caused by GC_disable
+* Ensure result of every variant of MS_TIME_DIFF has unsigned long type
+* Fix 'duplicate symbol' error for tests using multiple static libs (OS X)
+* Fix 'undefined reference to __data_start' linker error (Android/aarch64)
+* Fix 'unexpected mark stack overflow' abort in push_all_stack
+* Fix 'wrong __data_start/_end pair' error on Android
+* Fix BSD_TIME variant of MS_TIME_DIFF for the case of a.tv_usec < b.tv_usec
+* Fix GetThreadContext stale register values use if WoW64 (Win32)
+* Fix invalid initializer of CLOCK_TYPE variables if BSD_TIME
+* Fix thread_info() count argument value (OS X)
+* Support de_win.c compilation by Makefile.direct (cord/de)
+
+
+== [8.0.2] 2018-12-23 ==
+
+* Abort with appropriate message if executable pages cannot be allocated
+* Add initial testing of GC_enable/disable, MALLOC[_ATOMIC]_IGNORE_OFF_PAGE
+* Add paths to filenames mentioned in the copyright section in README
+* Add test using disclaim notifiers to implement a weak map
+* Adjust #error messages format
+* Allow to force executable pages allocation in gctest
+* Avoid potential 'macro redefinition' errors for config.h macros
+* Call real pthread_sigmask instead of its wrapper in start_mark_threads
+* Check result of pthread_mutex_unlock in specific.c
+* Default to a single-threaded build for Nintendo, Orbis, Sony PSP targets
+* Default to non-executable memory allocation across all make scripts
+* Define GC_ATOMIC_UNCOLLECTABLE and JAVA_FINALIZATION in all make scripts
+* Do not prevent GC from looking at environment variables (BCC_MAKEFILE)
+* Do not use 'ifndef AO_CLEAR' in mark, pthread_support and gctest
+* Do not use spin locks if AO test-and-set is emulated (pthreads)
+* Document HANDLE_FORK macro optional usage in Makefile.direct
+* Document assertion in the setters that used to return old value
+* Eliminate 'assigned value never used' compiler warning in test_cpp WinMain
+* Eliminate 'casting signed to bigger unsigned int' CSA warning
+* Eliminate 'different const qualifiers' MS VC warnings in cordbscs
+* Eliminate 'function is never used' cppcheck warning for calloc/realloc
+* Eliminate 'non-virtual destructor for class with inheritors' CSA warning
+* Eliminate 'pointer targets differ in signedness' compiler warning (Win32)
+* Eliminate 'struct member is never used' cppcheck warnings in os_dep
+* Eliminate 'uninitialized var' cppcheck false positive in mach_dep, os_dep
+* Eliminate 'unreferenced formal parameter' compiler warning in msvc_dbg
+* Eliminate redundant check in backwards_height
+* Fix 'USE_MUNMAP macro redefinition' error for NaCl
+* Fix 'collecting from unknown thread' abort in leak-finding mode for Win32
+* Fix 'mprotect remapping failed' abort on NetBSD with PaX enabled
+* Fix 'too wide non-owner permissions are set for resource' code defect
+* Fix GC_VSNPRINTF in cordprnt for DJGPP and MS VC for WinCE
+* Fix GC_register_disclaim_proc for leak-finding mode
+* Fix a deadlock in write_fault_handler if AO_or is emulated
+* Fix comment typo in CMakeLists.txt
+* Fix concurrent bitmap update in GC_dirty
+* Fix deadlocks in write and suspend handlers if AO test-and-set is emulated
+* Fix executable memory allocation in GC_unix_get_mem
+* Fix hbp overflow in GC_install_counts
+* Fix linkage with a system libatomic_ops shared library
+* Fix lock assertion violation in get_index if GC_ALWAYS_MULTITHREADED
+* Fix marking of finalizer closure object
+* Fix marks and hb_n_marks consistency when disclaim returns true
+* Fix memory allocation on GCF (Linux/x64)
+* Fix missing curses.h in cord/de when compiling manually (MS VC, MinGW)
+* Fix test_cpp assertion violation in find-leak mode
+* Fix tests linkage with internal atomic_ops.o
+* Fix unneeded end_stubborn_change/ptr_store_and_dirty in disclaim_test
+* Guard against potential buffer overflow in CORD_next and CORD_pos_fetch
+* New macro to suppress printing of leaked objects
+* Pass -Wall -Wextra -Wpedantic to g++ if supported (configure)
+* Prefix internal durango_get_mem symbol with 'GC_'
+* Prevent double inclusion of javaxfc.h and private/specific.h
+* Print relevant message in tests not appropriate for leak detection mode
+* Reduce scope of local variables in GC_remove_all_threads_but_me
+* Refine HIDE_POINTER documentation for the case of the leak-finding mode
+* Refine documentation in gc_disclaim.h
+* Remove extra USE_MMAP definition for Interix
+* Remove redundant header double-inclusion checks in the private headers
+* Remove strlen calls with a constant string argument in msvc_dbg
+* Specify register_disclaim_proc and finalized_malloc argument as non-null
+* Support UWP/arm64 target
+* Test marking of finalizer closure object in disclaim_test
+* Turn off leak detection mode explicitly in cord/de
+* Turn off parallel marker, thread-local allocation if used AO ops emulated
+* Turn on gcj functionality in BCC, DMC, NT, OS/2, WCC makefiles
+* Turn on memory unmapping in BCC/DMC/NT/WCC makefiles and Makefile.direct
+* Update NO_EXECUTE_PERMISSION documentation
+* Update documentation about arm64 ABI in gcconfig.h
+* Use AO_or in async_set_pht_entry_from_index if available
+* Use GC_WORD_MAX macro across all C source files
+* Use macro to operate on a flag residing in GC_stop_count
+* Use standalone private macro to guard against ptr_t redefinition
+* Workaround '#error' cppcheck messages in backgraph and private headers
+* Workaround 'AST broken' syntax error reported by cppcheck in GC_mark_some
+* Workaround 'GC_dump function is never used' cppcheck warning
+* Workaround 'local address assignment to a global variable' CSA warning
+* Workaround 'local variable end shadows outer symbol' cppcheck warnings
+* Workaround 'local variable obj_displ shadows outer symbol' cppcheck warning
+* Workaround 'nonlocal var will use ptr to local var' cppcheck false positive
+* Workaround 'pointer addition with NULL pointer' cppcheck error in msvc_dbg
+* Workaround 'potential non-terminated string' false positive in cordbscs
+* Workaround 'value of _MAX_PATH is unknown' cppcheck warning
+* Workaround cppcheck warnings regarding CLOCKS_PER_SEC, REDIRECT_REALLOC
+
+
+== [8.0.0] 2018-09-05 ==
+
+* Accept Android platform by both CMake and configure
+* Access finalize_now atomically to avoid TSan warning without no-sanitize
+* Acknowledge thread restart from suspend_handler (NetBSD)
+* Add a sanity check that load_acquire and store_release are available
+* Add AO primitives implementation to GC based on GCC atomic intrinsic
+* Add assertion for suspend_ack_sem in start_world
+* Add assertion to allocobj that live unmarked object cannot be reclaimed
+* Add assertions about held lock when accessing all_bottom_indices
+* Add assertions to ensure ADD_CALL_CHAIN is called holding the lock
+* Add assertions to finalize and threads support for MANUAL_VDB needs
+* Add basic calculation of the total full-collection time
+* Add check that gc_cpp operator delete is called (test_cpp)
+* Add debug logging to new_thread about GC_threads hash table collisions
+* Add GC prefix to _MSVC_DBG_H macro
+* Add initial RISC-V support
+* Add Makefile target to run all tests without test-driver
+* Add test_atomic_ops to perform minimal testing of used atomic primitives
+* Add two-argument alloc_size attribute to calloc_explicitly_typed (GCC)
+* Align IRIX/OSF1_THREADS definition in gc_config_macros.h with gcconfig.h
+* Allocate non-executable memory by default (CMake)
+* Allow compilation of PROC_VDB code on Linux host (GC_NO_SYS_FAULT_H)
+* Allow configure --with-libatomic-ops=none to use GCC atomic intrinsics
+* Allow custom N_LOCAL_ITERS and ENTRIES_TO_GET values
+* Allow disabling of dynamic loading in CMake script and configure
+* Allow disabling of main static data registration in CMake and configure
+* Allow disabling of threads discovery in CMake script and configure
+* Allow gc_assertions enabling in CMake script
+* Allow gc_debug, redirect_malloc, large_config options in CMake script
+* Allow GC_NETBSD_THREADS_WORKAROUND macro manual definition
+* Allow mmap enabling in CMake script and configure
+* Allow passing -D DEFAULT_VDB to CFLAGS
+* Allow subthreadcreate_test to be compiled with zero NTHREADS
+* Allow to turn on spin locking even if thread-local allocations are used
+* Always include gc_atomic_ops.h unless threads are disabled
+* Avoid 'Unexpected heap growth' in 64-bit multi-threaded gctest if n_tests=1
+* Avoid duplication of code handling pthreads case in configure
+* Avoid potential data race during apply_to_each_object(reset_back_edge)
+* Avoid potential data race during GC_dump execution
+* Avoid potential race between malloc_kind and mark_thread_local_fls_for
+* Avoid potential race between realloc and clear_hdr_marks/reclaim_generic
+* Avoid potential race in print_static_roots called by dyld_image_add/remove
+* Avoid potential race in SET_MARK_BIT_EXIT_IF_SET if parallel marking
+* Avoid potential race when accessing size_map table
+* Avoid potential race when storing oh_back_ptr during parallel marking
+* Avoid SIGSEGV during GC_INIT on some Android devices
+* Build only shared libraries by default (configure)
+* Change pointer arguments of push_all[_eager]/conditional API to void* type
+* Change type of hb_sz field (of hblkhdr) from size_t to word
+* Check consistency of descr, adjust, clear arguments of GC_new_kind
+* Check that GC_WIN32_PTHREADS is not specified for Cygwin
+* Check thread_local is initialized before accessing thread_key
+* Collapse multiple BCOPY_EXISTS macro definitions
+* Collapse multiple NT_*_MAKEFILE scripts into a single NT_MAKEFILE
+* Collapse multiple page_was_dirty, remove_protection, read_dirty definitions
+* Compile checksums.c only if --enable-checksums is given (configure)
+* Consistently define WIN32_LEAN_AND_MEAN/NOSERVICE before include windows.h
+* Convert .html files to Markdown format
+* Convert code of .c files to valid C++ code
+* Decide between memory unmapping and mprotect-based dirty bits at runtime
+* Declare t local variable in the block where the variable is used
+* Define ABORT() using _CrtDbgBreak (if available) on Windows host
+* Define CLANG/GNUC_PREREQ macros to check gcc/clang minimum version
+* Define DYNAMIC_LOADING for Darwin unless IGNORE_DYNAMIC_LOADING
+* Define GC_ASSERT(x) as C assert(x) for external clients of gc_inline.h
+* Define GC_PREFETCH_FOR_WRITE to __builtin_prefetch in gc_inline.h (GCC)
+* Define GC_THREADS instead of GC_x_THREADS in Makefiles
+* Define macro to specify the environment file name extension (Win32/WinCE)
+* Define static resend_lost_signals(), restart_all() in pthread_stop_world
+* Detect sigsetjmp() availability by configure
+* Determine whether to use compiler TLS for kFreeBSD at compile time
+* Do not call BCOPY and BZERO if size is zero
+* Do not call sem_getvalue in stop_world if one thread exists
+* Do not call set_handle_fork(1) in gctest if pthread_atfork not supported
+* Do not compile pcr_interface.c and real_malloc.c except by PCR-Makefile
+* Do not declare dl_iterate_phdr as weak for kFreeBSD
+* Do not include windows.h when compiling gc_cpp.cc
+* Do not install gc_allocator.h, gc_disclaim.h unless the features enabled
+* Do not merge dynamic root with the existing static one in add_roots_inner
+* Do not print n_rescuing_pages value if incremental collections disabled
+* Do not push cpsr and frame pointer on Darwin/arm and Darwin/arm64
+* Do not rebuild_root_index unless remove_root_at_pos is called
+* Do not specify version info for test libraries (Automake)
+* Do not use alternate thread library on Solaris
+* Do not use asm in GC_pause
+* Do not use PKG_CHECK_MODULES in configure
+* Do not use system clock consistently if NO_CLOCK
+* Do not use x86 asm in PUSH_CONTENTS_HDR for NaCl
+* Document GC_BUILTIN_ATOMIC macro (and gc_atomic_ops private header file)
+* Document STACK_NOT_SCANNED macro in gcconfig.h (Emscripten)
+* Eliminate 'comparison is always false' code defect in get_maps
+* Eliminate 'GC_DEBUG redefined' compiler warning in smashtest
+* Eliminate 'potential unsafe sign check of a bitwise operation' code defect
+* Enable alternative finalization interface (DISCLAIM) in all makefiles
+* Enable compilation for Cygwin with MPROTECT_VDB
+* Enable handle-fork and memory unmapping by default
+* Enable mprotect-based incremental GC for Win64 (GCC)
+* Expose API to control rate and max prior attempts of collect_a_little
+* Expose API to control the minimum bytes allocated before a GC occurs
+* Fix 'comparison of 255 with expr of type bool' error in gc_atomic_ops.h
+* Fix 'doc' files installation folder
+* Fix build of cord tests as C++ files (Makefile.direct)
+* Fix comment typos in backgraph.c, de.c, gcconfig.h
+* Fix delete operator redirection if gc_cpp is built as .dll (Cygwin, MinGW)
+* Fix start_world not resuming all threads on Darwin
+* Fix test_cpp failure in case GC_DEBUG is defined
+* Group common defines for POSIX platforms in configure and CMake scripts
+* Guard against USE_PTHREAD_LOCKS and USE_SPIN_LOCK are both defined
+* Handle pthread restart signals loss if retry_signals
+* Hide value stored to thread-specific entries for a test purpose
+* Implement FindTopOfStack(0) for ARM and AArch64 (Darwin)
+* Implement memory unmapping for Sony PS/3
+* Imply configure --single-obj-compilation if --disable-static
+* Include malloc.c in extra/gc.c after include gc_inline.h
+* Increase MAX_HEAP_SECTS (10 times) for large-config
+* Initial single-threaded support of Interix subsystem
+* Initial support of Nintendo, Orbis, Sony PSP2, WinRT, Xbox One
+* Initial support of TIZEN platform
+* Install gc.3 man page instead of copying gc.man to doc folder (configure)
+* Make extend_size_map() static (code refactoring)
+* Make subthreadcreate test compilable even without libatomic_ops
+* Match GC_FAST_MALLOC_GRANS formal and actual arguments where possible
+* Move de_win compiled resource files to cord/tests
+* Move pcr_interface.c, real_malloc.c to 'extra' folder
+* New API function (GC_dump_named) to produce named dumps
+* New API function (GC_is_incremental_mode)
+* New API function (get_expl_freed_bytes_since_gc)
+* New API function (get_size_map_at) to get content of size_map table
+* New API to stop and start the GC world externally
+* New API to turn on manual VDB at runtime
+* New field (expl_freed_bytes_since_gc) in public prof_stats_s
+* New macro ALWAYS_SMALL_CLEAR_STACK to avoid clearing large stack sections
+* New public API (PTR_STORE_AND_DIRTY) to simplify store-and-dirty operation
+* Pass CFLAGS_FOR_PIC value to CFLAGS in Makefile.direct
+* Print time passed since GC initialization in GC_dump
+* Public API (GC_deinit) to allow Win32 critical sections deletion
+* Reduce probability of collision in threads hashtable for 64-bit targets
+* Reduce the default MUNMAP_THRESHOLD value to 2 for Sony PS/3
+* Refactoring of USE_MMAP/USE_MMAP_ANON pairs definition in gcconfig.h
+* Reformat code and comments in gc_allocator.h
+* Remove 'dist' target from Makefile.direct
+* Remove a redundant check of __cplusplus in Symbian-specific .cpp files
+* Remove Android-specific code in gcconfig.h for M68K
+* Remove C++ WeakPointer and CleanUp API which lacks implementation
+* Remove DGUX_THREADS macro which duplicates GC_DGUX386_THREADS (configure)
+* Remove done_init static variable from fnlz_mlc.c
+* Remove duplicate definition of ALIGNMENT macro for OpenBSD/arm
+* Remove duplicated sample code in leak.md
+* Remove EMX_MAKEFILE (add EMX support to Makefile.direct)
+* Remove GC code fragment (which already merged) from README.Mac
+* Remove GC_GNU_THREADS macro (HURD)
+* Remove GENERAL_MALLOC internal macro
+* Remove HIGH_BIT macro duplicating SIGNB
+* Remove lint-specific code
+* Remove Makefile KandRtest target (that supported K&R C compiler)
+* Remove MIN_WORDS macro from gc_priv.h
+* Remove multi-line macros (FOR_EACH_PRED, ITERATE_DL_HASHTBL_*, PUSH_OBJ)
+* Remove name of optional arguments of operator new and new[] in gc_cpp.h
+* Remove notes that K&R C compiler is unsupported
+* Remove PUSH_CONTENTS_HDR multi-line macro
+* Remove redundant check that clear_fl_marks argument is non-null
+* Remove redundant THREADS macro checks in alloc.c and gc_priv.h
+* Remove stubborn objects allocation code completely, remove stubborn.c
+* Remove unnecessary argument casts in add_roots_inner calls
+* Remove unnecessary type casts in n_set_marks
+* Remove unused USE_GENERIC macro definition and description
+* Remove version info in 'de' cord test application
+* Replace GC_MALLOC(sizeof T) with GC_NEW(T) in tests
+* Replace GC_NO_RETRY_SIGNALS environment variable with GC_RETRY_SIGNALS=0
+* Replace some FIXME items with TODO ones
+* Run command passed to if_not_there directly from Makefile.direct
+* Same type casts for GC_PTR_STORE arguments regardless of GC_DEBUG
+* Skip grungy_pages update when mark state invalid to speedup read_dirty
+* Skip typed_test in gctest if NO_TYPED_TEST macro is defined
+* Support configure --disable-thread-local-alloc option (similar for CMake)
+* Support enable_checksums option in CMake script
+* Support Haiku multi-threaded build by CMake
+* Support threads for DragonFly in configure
+* Turn on 'atomic uncollectable' functionality by default (CMake)
+* Turn on GC assertions in NT_MAKEFILE for debug builds
+* Turn on gcj, disclaim and java finalization by default (CMake)
+* Turn on incremental collection in gctest also if DEFAULT_VDB or MANUAL_VDB
+* Turn on incremental mode in cordtest and cord/de
+* Turn on incremental mode in disclaim_test, test_cpp and staticroots test
+* Turn on parallel marker by default for all multi-threaded builds
+* Update GC compilation and usage notes for Win32
+* Update shared libraries version info to differentiate against v7.6
+* Update top_index entry pointer only when the entry is constructed fully
+* Use __builtin_expect in SIZET_SAT_ADD macro
+* Use __declspec(allocator) for malloc-like prototypes (MS VS 2015+)
+* Use __int64 instead of 'long long' in LONG_MULT if appropriate
+* Use __thread keyword for Android NDK r12b+ Clang (arm)
+* Use atomic allocation for leafs in reverse_test (gctest)
+* Use atomic load/store for the concurrently accessed variables in GC_lock
+* Use C11 static_assert if available
+* Use compiler atomic intrinsics by default if available (configure)
+* Use EXPECT FALSE for mark_from code documented as executed rarely
+* Use heap-allocated memory for local mark stack of non-marker thread
+* Use HOST_ANDROID define instead of PLATFORM_ANDROID
+* Use include gc.h with the angle brackets in the man page synopsis
+* Use longjmp in fault_handler_openbsd if siglongjmp unavailable (OpenBSD)
+* Use MARK_BIT_PER_GRANULE instead of MARK_BIT_PER_OBJ where appropriate
+* Use noexcept specifier in gc_allocator and gc_cpp if C++11
+* Use same macro (NTHREADS) across all tests to specify number of threads
+* Use sigsetjmp() in setjmp_t tool if available
+* Use thread-local allocations for all multi-threaded builds
+* Use THREAD_EQUAL consistently to compare pthread_t values
+* Workaround 'bad pointer arithmetic' false waring in check_annotated_obj
+* Workaround Clang optimizer bug crashing clear_stack_inner on OS X 10.8
+* Workaround Thread Sanitizer (TSan) false positive warnings
+
+
+== [7.6.22] 2024-09-07 ==
+
+* Eliminate 'cast signed to bigger unsigned' CSA warnings in GC_find_limit
+* Fix GC_debug_realloc to support custom kind
+* Fix heap blocks size computation by GC_get_memory_use
+* Fix pointer relational comparison in GC_do_enumerate_reachable_objects
+* Prevent GC_noop_sink from scanning by the collector
+
+Also, includes 7.4.28 changes
+
+
+== [7.6.20] 2024-02-03 ==
+
+* Eliminate compiler warning of missing cast in LONG_MULT after shift
+* Fix 'sigset_t undeclared' MS VC error if pthreads-w32 is used
+* Fix lock assertion violation in GC_try_to_collect_inner on OS X
+* Fix missing outermost parentheses in macro definitions in huge test
+* Fix undefined GC_real_pthread_sigmask if redirect malloc on OS X
+
+Also, includes 7.4.26 changes
+
+
+== [7.6.18] 2023-05-26 ==
+
+* Fix IRIX5 defined wrongly on FreeBSD/mips
+* Fix alt-stack handling in GC_push_all_stacks if stack grows up
+* Fix data race in GC_heapsize_at_forced_unmap variable
+
+Also, includes 7.4.24 changes
+
+
+== [7.6.16] 2022-08-26 ==
+
+* Do not send signal to thread which is suspended manually
+* Eliminate 'old_gc_no is initialized but not referenced' MS VC false warning
+* Fix 'GC_greatest_stack_base_below is defined but not used' warning (IA64)
+* Fix context saving when GC_suspend_thread(self)
+* Fix data race in fail_proc1 of gctest
+* Fix GC_suspend_thread if called before thread destructor
+* Fix hang on sem_wait in GC_suspend_thread if thread was resumed recently
+* Fix lock assertion violation in GC_find_limit if always multi-threaded
+* Fix potential race if start_mark_threads called from threads in child
+* Make finalizer_closure pointer read/write atomic in malloc and callback
+* Prevent changing of GC_markers_m1 value while collection in progress
+* Replace SSH cloning with HTTPS one in README
+* Workaround Thread Sanitizer (TSan) FP warning in is_valid_displacement
+
+Also, includes 7.4.22 changes
+
+
+== [7.6.14] 2021-09-28 ==
+
+* Add loop to handle abort error like in suspend logic on Darwin
+* Add support of OpenBSD/aarch64
+* Add threading libraries to bdw-gc.pc
+* Disable mprotect-based incremental GC if /proc roots are used (Linux)
+* Do not use iOS private symbols
+* Eliminate 'GC_old_bus_handler defined but not used' compiler warning
+* Eliminate 'comparing signed and unsigned values' BCC warning in cordtest
+* Eliminate 'possible loss of data' BCC and MS VC warnings
+* Eliminate 'static GC_sysinfo definition has incomplete type' Clang warning
+* Eliminate 'unused function GC_add_map_entry' compiler warning
+* Eliminate 'while clause does not guard' GCC warning in GC_parse_map_entry
+* Explicitly zero-initialize trace_buf (fix trace_buf initialization)
+* Fix 'ACCESS_VIOLATION in marker' GC warning on Win32 async thread start
+* Fix 'GC_generic_malloc must be available' GCC error in new_gc_alloc.h
+* Fix 'ulong undefined' compilation error on AIX
+* Fix 'undefined reference to __data_start' linker error on RISC-V
+* Fix 'write to GC log failed' error
+* Fix GC_proc_fd value in child process at fork (Solaris)
+* Fix MPROTECT_VDB definition for single-threaded GC builds
+* Fix OS_TYPE and USE_MMAP_ANON definitions for Cygwin/x64
+* Fix STACKBOTTOM on 32-bit HP/UX 11.11
+* Fix abort in GC_printf when gctest is built as WinMain executable (Cygwin)
+* Fix assertion violation in register_dynlib_callback on Android
+* Fix compiling by Makefile.direct on OpenBSD/UltraSparc
+* Fix configure message about 'AIX gcc optimization fix'
+* Fix cordtest build in SMakefile.amiga
+* Fix data race regarding *rlh value in generic_malloc_many
+* Fix first_thread stack_base initialization if custom GC_stackbottom (Win32)
+* Fix gc_allocator.h compilation by Clang
+* Fix gc_cflags variable name in configure (HP/UX)
+* Fix handling of areas smaller than page size in GC_scratch_recycle
+* Fix incorrect define GC_OPENBSD_THREADS on sparc64
+* Fix misaligned tlfs passed to AO_load on m68k
+* Fix missing GC_quiet declaration in pcr_interface.c
+* Fix missing gc_dlopen.c in CMake script
+* Fix missing scratch_last_end_ptr update (Irix)
+* Fix overflow of scratch_free_ptr value
+* Fix page_was_[ever_]dirty() for static roots (Solaris)
+* Fix printf format specifier in simple_example.html
+* Fix save_callers for multi-threaded case if built-in backtrace unavailable
+* Fix test_cpp failure caused by arbitrary link order (Win32)
+* Fix test_cpp failure when gc_cpp resides in a dll (Borland, Watcom)
+* Fix various typos mostly in documentation files
+* Fix word size, data start and alignment for OpenBSD/mips64(el)
+* Prevent GetThreadContext failure (Windows)
+* Prevent WARN of incompatible incremental GC if default or manual VDB
+* Reduce a time period between GetExitCodeThread and SuspendThread (Win32)
+* Refactoring of WoW64 workaround (Win32)
+* Remove a misleading comment about Solaris in gc.h
+* Workaround 'expression is only useful for its side effects' WCC warning
+* Workaround fread fail after enable_incremental if malloc redirected (Linux)
+
+
+== [7.6.12] 2019-03-01 ==
+
+* Eliminate 'assigned value never used' compiler warning in test_cpp WinMain
+* Fix 'mprotect remapping failed' abort on NetBSD with PaX enabled
+* Fix 'undefined reference to __data_start' linker error (Android/aarch64)
+* Fix 'unexpected mark stack overflow' abort in push_all_stack
+* Fix 'wrong __data_start/_end pair' error on Android
+* Fix BSD_TIME variant of MS_TIME_DIFF for the case of a.tv_usec < b.tv_usec
+* Fix GetThreadContext stale register values use if WoW64 (Win32)
+* Fix executable memory allocation in GC_unix_get_mem
+* Fix invalid initializer of CLOCK_TYPE variables if BSD_TIME
+* Fix thread_info() count argument value (OS X)
+* Update NO_EXECUTE_PERMISSION documentation
+
+
+== [7.6.10] 2018-12-13 ==
+
+* Add paths to filenames mentioned in the copyright section in README
+* Call real pthread_sigmask instead of its wrapper in start_mark_threads
+* Eliminate 'casting signed to bigger unsigned int' CSA warning
+* Eliminate 'non-virtual destructor for class with inheritors' CSA warning
+* Fix 'collecting from unknown thread' abort in leak-finding mode for Win32
+* Fix 'too wide non-owner permissions are set for resource' code defect
+* Fix 'undefined reference to GC_incremental' linker error in pthread_start
+* Fix GC_VSNPRINTF in cordprnt for DJGPP and MS VC for WinCE
+* Fix GC_register_disclaim_proc for leak-finding mode
+* Fix a deadlock in write_fault_handler if AO_or is emulated
+* Fix comment typos in CMakeLists.txt, backgraph.c, de.c, gcconfig.h
+* Fix concurrent bitmap update in GC_dirty
+* Fix delete operator redirection if gc_cpp is built as .dll (Cygwin, MinGW)
+* Fix hbp overflow in GC_install_counts
+* Fix linkage with a system libatomic_ops shared library
+* Fix lock assertion violation in get_index if GC_ALWAYS_MULTITHREADED
+* Fix marking of finalizer closure object
+* Fix marks and hb_n_marks consistency when disclaim returns true
+* Fix memory allocation on GCF (Linux/x64)
+* Fix missing curses.h in cord/de when compiling manually (MS VC, MinGW)
+* Fix start_world not resuming all threads on Darwin
+* Fix test_cpp assertion violation in find-leak mode
+* Fix tests linkage with internal atomic_ops.o
+* Fix unneeded end_stubborn_change in disclaim_test
+* Guard against potential buffer overflow in CORD_next and CORD_pos_fetch
+* New macro to suppress printing of leaked objects
+* Prevent double inclusion of javaxfc.h and private/specific.h
+* Reduce scope of local variables in GC_remove_all_threads_but_me
+* Refine HIDE_POINTER documentation for the case of the leak-finding mode
+* Refine documentation in gc_disclaim.h
+* Test marking of finalizer closure object in disclaim_test
+* Update documentation about arm64 ABI in gcconfig.h
+* Use AO_or in async_set_pht_entry_from_index if available
+* Use include gc.h with the angle brackets in the man page synopsis
+
+
+== [7.6.8] 2018-08-12 ==
+
+* Add cpu, make_as_lib, nothreads options to NT_MAKEFILE
+* Add NetBSD/aarch64 and initial RISC-V support
+* Adjust formatting of configure help messages and config.h comments
+* Avoid multiple 'getcontext failed' warnings if getcontext is broken
+* Cleanup BCC Makefile (remove absolute GC paths, fix del cmd, update clean)
+* Collapse multiple NT_*_MAKEFILE scripts into a single NT_MAKEFILE
+* Do not call GC_dirty_inner unless GC_incremental
+* Do not use NULL in gc_inline.h
+* Eliminate 'cast between incompatible function types' compiler warning
+* Eliminate 'comparing signed and unsigned values' compiler warnings (bcc)
+* Eliminate 'condition is always true' cppcheck warning in init_gcj_malloc
+* Eliminate 'declaration of var hides global declaration' compiler warning
+* Eliminate 'language extension used' Clang warning in gc.h
+* Eliminate 'possibly incorrect assignment in CORD_vsprintf' compiler warning
+* Eliminate 'ptr arithmetic with NULL' cppcheck warning in alloc_mark_stack
+* Eliminate 'scope of var can be reduced' cppcheck warning in pthread_join
+* Eliminate 'switch statement contains no case label' compiler warning
+* Eliminate 'variable might be uninitialized' warning in win32_start_inner
+* Eliminate duplicate clear_mark_bit call when removing disappearing link
+* Fast fail on invalid CPU parameter passed to NT_MAKEFILE
+* Fix 'collecting from unknown thread' abort in leak-finding mode
+* Fix 'pointer arithmetic with NULL' code defect in print_callers
+* Fix Borland version in documentation to match that in BCC_MAKEFILE
+* Fix comment about inv_sz computation in setup_header
+* Fix comments style in configure.ac and Makefile.am
+* Fix compilation by digimars.mak (DMC)
+* Fix compilation by WCC makefile
+* Fix compilation of darwin_stop_world for iOS 8+
+* Fix cords for MANUAL_VDB
+* Fix dependency on gc_cpp source in BCC_MAKEFILE and NT_MAKEFILE
+* Fix GC_is_valid_displacement and GC_is_visible for non-small objects
+* Fix gctest in leak-finding mode
+* Fix infinite restarting of mark_some when a static root disappeared (Linux)
+* Fix large object base computation in PUSH_CONTENTS() if MARK_BIT_PER_OBJ
+* Fix mark stack overflow checking in push_selected
+* Fix missing GC_dirty calls for GC-allocated objects used internally
+* Fix missing GC_dirty invocation from debug_end_stubborn_change
+* Fix MSWIN32 macro redefinition (WCC)
+* Fix multi-threaded gctest for the case of NTHREADS is set to zero
+* Fix new and delete operators definition for DigitalMars compiler
+* Fix NT_MAKEFILE for VS 2017
+* Fix potential null dereference in GC_CONS
+* Fix register_dynamic_libraries on Windows 10
+* Fix result computation in n_set_marks
+* Fix return type in GC_set_warn_proc API documentation
+* Fix tests for GC compiled with MANUAL_VDB
+* Fix the build for Emscripten
+* Fix typo in comment for CORD_ec_flush_buf prototype
+* Fix typos in ChangeLog and generic_malloc
+* Fix UNTESTED for multi-threaded API functions in gctest
+* Fix VirtualQuery call in case of malloc failure (Win32)
+* Install gc.3 man page instead of copying gc.man to doc folder (configure)
+* Keep pointer to the start of previous entry in remove_specific_after_fork
+* Move de_win compiled resource files to cord/tests
+* Never return null by C++ GC allocators and gc_cpp operator new
+* Perform thread_suspend in loop as it may be interrupted (Darwin)
+* Really abort if failed to read /proc for library registration (Linux)
+* Remove code duplication in gcj_malloc and malloc_explicitly_typed
+* Remove duplicate local variable in reclaim_block
+* Remove information how to send bugs from README.cords file
+* Remove libatomic_ops license information
+* Remove unused USE_GENERIC macro definition and description
+* Suppress 'functions containing switch are not expanded inline' bcc warning
+* Suppress 'non-member operator new/delete may not be inline' VC++ warning
+* Turn on incremental collection in gctest also if MANUAL_VDB
+* Update copyright information in alloc.c, gc.c/h and the documentation
+* Update EXTRA_DIST in Makefile, Win32/64 docs after NT_*_MAKEFILE removal
+* Update NT_MAKEFILE usage information in README files for Win32 and Win64
+* Workaround 'class C does not have a copy constructor' cppcheck warning
+* Workaround 'function nested_sp is never used' cppcheck style warning
+* Workaround 'opposite expression on both sides of &' cppcheck style warning
+* Workaround 'template-id not supported in this context' compiler error (WCC)
+
+
+== [7.6.6] 2018-04-20 ==
+
+* Define GC_FREEBSD_THREADS and GC_ADD_CALLER macros for kFreeBSD
+* Eliminate 'boolean result used in bitwise operation' cppcheck warning
+* Eliminate 'there is pointer arithmetic with NULL' cppcheck warning
+* Explicitly unblock GC signals on GC initialization
+* Fix 'scope of var can be reduced' cppcheck err in enqueue_all_finalizers
+* Fix 'undefined reference to __builtin_unwind_init' linker error (ArmCC)
+* Fix arguments delimiter in pcr_interface.c (PCR)
+* Fix assertion violation in DllMain of win32_threads
+* Fix comment for debug_generic_malloc_inner[_ignore_off_page]
+* Fix data race during apply_to_each_object(reset_back_edge)
+* Fix dbg_mlc.c/o file name in documentation
+* Fix gctest with musl libc on s390x
+* Fix include gc_gcj.h in thread_local_alloc.c
+* Fix man section number (3)
+* Fix missing GC_generic_malloc_words_small implementation in new_gc_alloc.h
+* Fix missing new-line in ABORT_ARG<n> definition
+* Fix missing SIGBUS handler setup for kFreeBSD
+* Fix null dereference in print_callers on backtrace_symbols failure
+* Fix null pointer dereference in get_private_path_and_zero_file (Symbian)
+* Fix the collector hang when it is configured with --enable-gc-debug
+* Fix thread_suspend fail for threads registered from key destructor (OS X)
+* Fix type of local variables receiving result of PHT_HASH
+* Fix typo in AIX macro name
+* Fix typo in comment in specific.h
+* Fix unbounded heap growth in case of intensive disappearing links usage
+* Remove API symbols renaming in WCC_MAKEFILE
+* Support Haiku/x64 and Haiku/x86 hosts
+* Support threads for DragonFly in configure
+* Workaround 'address of auto-variable returned' cppcheck error
+* Workaround gctest hang on kFreeBSD (if thread-local allocations are on)
+
+
+== [7.6.4] 2018-01-26 ==
+
+* Add note of set_free_space_divisor, set_warn_proc ABI change after gc-7.1
+* Change compiler invocation example in gc.man to use dynamic libgc
+* Delete dont_ar_* build intermediate files on make clean (Makefile.direct)
+* Do not declare dl_iterate_phdr as weak for DragonFly
+* Fix 'cords' parallel build in Makefile.direct
+* Fix 'undeclared identifier USRSTACK' compiler error on OpenBSD-6.2
+* Fix error code in abort message if sem_wait failed in start_world (NetBSD)
+* Fix GC allocation mutex in child after a fork
+* Fix global operator delete definition for C++14 in gc_cpp
+* Fix last_reclaimed..gc_no interval comparison to threshold in unmap_old
+* Fix libgc version which was changed in linkage breaking way
+* Fix missing EOLn output in threadlibs tool
+* Fix threadlibs tool to output '-lpthread' for DragonFly
+* Prevent DATASTART redefinition for NaCl
+* Remove obsolete advice about linking with _DYNAMIC=0 (Linux)
+
+
+== [7.6.2] 2017-12-23 ==
+
+* Add assertion that no hb_n_marks underflow occurs
+* Add minimal testing of GC_MALLOC_[ATOMIC_]WORDS and GC_CONS (gctest)
+* Add minimal testing of GC_set_bit (gctest)
+* Add more cases to huge_test to cover sizes close to word-type maximum
+* Add testing of new[]/delete[] (test_cpp)
+* Adjust AO_HAVE_x check to match AO_fetch_and_add primitive variant used
+* Adjust code indentation of calloc_explicitly_typed
+* Align local_mark_stack in help_marker explicitly
+* Allow custom TRACE_ENTRIES value
+* Allow gctest and thread_leak_test with zero NTHREADS
+* Avoid data race in finalized_count (gctest)
+* Code refactoring of divide-by-HBLKSIZE occurrences
+* Code refactoring of huge_test
+* Code refactoring of tests/subthread_create regarding AO add primitive
+* Compile thread_local_alloc only if multi-threaded build (Makefile.am)
+* Delete preprocessor output on make clean (Makefile.direct)
+* Disable implicit multi-threaded mode for Win32 to avoid LOCK crash
+* Do not disable parallel mark for WRAP_MARK_SOME
+* Do not enable mprotect-based incremental mode if unmapping is on (gctest)
+* Do not install documentation if configure --disable-docs (new option)
+* Do not use tkill (Android)
+* Document base and size of objects allocated by finalized_malloc
+* Document configure 'syntax error' issue in README
+* Eliminate 'address of local variable returned' static analyzer warning
+* Eliminate 'array vs singleton' code defect in typed_test (gctest)
+* Eliminate 'assigned value never used' CSA warning in min_bytes_allocd
+* Eliminate 'boolean result used in bitwise op' cppcheck false warning
+* Eliminate 'C-style pointer casting' cppcheck style warnings in test
+* Eliminate 'checking if unsigned variable is <0' cppcheck style warning
+* Eliminate 'class member var with name also defined in parent' warning
+* Eliminate 'comparison is always false' static analyzer warning in finalize
+* Eliminate 'Condition 0==datastart always false' cppcheck warning (dyn_load)
+* Eliminate 'condition is always true' cppcheck style warning
+* Eliminate 'constructor with 1 argument is not explicit' cppcheck warning
+* Eliminate 'CORD_*printf is never used' cppcheck style warnings (cordtest)
+* Eliminate 'dereference of null' CSA false warning in array_mark_proc
+* Eliminate 'function result not used' code defect in GC_mark_local
+* Eliminate 'GC_collecting is set but never used' code defect (Win32)
+* Eliminate 'GC_record_fault is never used' cppcheck style warning
+* Eliminate 'integer shift by a negative amount' code defect in finalize
+* Eliminate 'label not used' cppcheck false warnings in GC_mark_X
+* Eliminate 'memory leak' code defect for scratch-allocated memory
+* Eliminate 'memory leak' code defect in remove_specific
+* Eliminate 'non-null arg compared to null' warning in toggleref_add (GCC)
+* Eliminate 'non-reentrant function strtok called' cppcheck warning (POSIX)
+* Eliminate 'possible integer underflow' code defect (cord-de)
+* Eliminate 'potential overflow' static analyzer warning in test
+* Eliminate 'printf format specifies type void*' GCC pedantic warnings
+* Eliminate 'scope of variable can be reduced' cppcheck warnings
+* Eliminate 'suspicious pointer subtraction' cppcheck warning (gc_cpp)
+* Eliminate 'this statement may fall through' GCC warnings
+* Eliminate 'unnecessary comparison of static strings' cppcheck warning
+* Eliminate 'unsafe vsprintf is deprecated' compiler warning
+* Eliminate 'unused formal parameter' compiler warnings in C++ code (MS VC)
+* Eliminate 'unused variable' compiler warning in remove_all_threads_but_me
+* Eliminate 'use of vulnerable sprintf' code defect in de_win test (cord)
+* Eliminate 'value exceeds maximum object size' GCC warning in huge_test
+* Eliminate 'value of CLOCK_TYPE unknown' cppcheck info message
+* Eliminate 'value of DATASTART2 unknown' cppcheck info messages
+* Eliminate 'value of GC_PTHREAD_EXIT_ATTRIBUTE unknown' cppcheck messages
+* Eliminate 'value of GC_RETURN_ADDR_PARENT unknown' cppcheck info messages
+* Eliminate 'value of NEED_FIXUP_POINTER unknown' cppcheck info messages
+* Eliminate 'write to memory that was const-qualified' code analyzer warning
+* Eliminate all 'scope of variable can be reduced' cppcheck style warnings
+* Eliminate CSA warning about incorrect cast applied to HBLK_OBJS
+* Eliminate CSA warning about narrowing cast in CleanUp of test_cpp
+* Eliminate CSA warning of non-virtual destructor in test_cpp base class
+* Eliminate CSA warning of staticroot that can be a local variable (tests)
+* Eliminate CSA warning of unmodified non-const static var (disclaim_test)
+* Eliminate redundant local variable in register_finalizer
+* Eliminate TSan (Thread Sanitizer) warnings in gctest
+* Eliminate UBSan warning of overflow during descr subtraction in mark_from
+* Eliminate unreachable PROC/DEFAULT_VDB GC_printf calls in gctest main()
+* Eliminate unsigned fl_builder_count underflow in mark_thread
+* Enable GC_is_tmp_root for all platforms
+* Execute more single-threaded GC tests by CMake
+* Expand tabs to spaces in de_win.rc (tests)
+* Export GC_dump_finalization/regions()
+* Export GC_is_tmp_root() and GC_print_trace[_inner]()
+* Export GC_print_free_list()
+* Fix '32-bit value shift followed by expansion to 64-bit' code defect
+* Fix 'GC_written_pages never read' code defect (GWW_VDB)
+* Fix 'label cannot be reached' static analyzer warning in disclaim_test
+* Fix 'size of tv is unknown' error in brief_async_signal_safe_sleep (musl)
+* Fix 'syntax error' reported by cppcheck for mach_dep
+* Fix 'unknown type name GC_INNER' compilation error (FreeBSD)
+* Fix 'variable assigned a value that is never used' cppcheck style warnings
+* Fix 'void pointers in calculations: behavior undefined' cppcheck warning
+* Fix assertion violation about disabled cancel in try_to_collect_inner
+* Fix atomic_ops build in Makefile.direct for Solaris
+* Fix Clang static analyzer warning about not found gc_priv.h in extra files
+* Fix compilation error in get_main_stack_base (Emscripten)
+* Fix compilation for winpthreads if HANDLE_FORK
+* Fix compilation if configured with --enable-werror on OS X
+* Fix cord/de build in Makefile.direct (Linux)
+* Fix data race in a list referenced by A.aa (gctest)
+* Fix data race in collectable_count (gctest)
+* Fix data race in do_local_mark when comparing active_count to helper_count
+* Fix data race in GC_suspend/resume_thread
+* Fix data race in last_stop_count access (suspend_handler_inner)
+* Fix data race in make_descriptor when setting explicit_typing_initialized
+* Fix data race in mark_thread when updating mark_no
+* Fix data race when getting object size in explicitly-typed allocators
+* Fix deadlock in GC_suspend_thread
+* Fix gctest failure for Darwin if CPPCHECK is defined
+* Fix lack of barriers to synchronize memory for suspend_handler
+* Fix marking of disclaim-reachable objects in the incremental mode
+* Fix message of VDB implementation used if MPROTECT_VDB+GWW_VDB (gctest)
+* Fix missing started_thread_while_stopped call from mark_some if GCC/Clang
+* Fix null dereference in GC_stack_range_for if not DARWIN_DONT_PARSE_STACK
+* Fix page calculation in checksums
+* Fix parallel build in Makefile.direct
+* Fix test_cpp and c++ parallel build in Makefile.direct
+* Fix typo in comment of GC_mark_some
+* Fix typos in cdescr.html and README.sgi
+* Make GC_INIT optional for clients even if thread-local allocations enabled
+* Match uclinux pattern in configure
+* Move conditional GC_need_to_lock setting to gc_locks.h (refactoring)
+* Move README.QUICK from DOC_FILES to OTHER_FILES in Makefile.direct
+* New API function (GC_is_init_called) to check if BDWGC is initialized
+* New target (check-cpp) in Makefile.direct
+* Prevent abort in register_data_segments for Symbian and Emscripten
+* Prevent multiple 'Caught ACCESS_VIOLATION in marker' per collection
+* Print realloc_count value in gctest
+* Put invariant name in quotes to make mark_state comments clearer
+* Refine configure messages when checking for compiler option support
+* Remove extraneous semicolons after AC_MSG_WARN (configure)
+* Remove page_was_dirty and remove_protection duplicate definitions
+* Remove unnecessary type casts of printf arguments to unsigned long
+* Remove unused ALIGN_DOUBLE, USE_GENERIC_PUSH_REGS macros (TILE-Gx/Pro)
+* Rename 'test' to 'check' target in Makefile.direct
+* Replace deprecated rewind to fseek in cordxtra
+* Report gcc/clang pedantic warnings (configure)
+* Skip thread suspend/resume API testing for Tru64 (OSF1)
+* Support AddressSanitizer (Clang/GCC) and MemorySanitizer (Clang)
+* Support GC_init (and get_stack_base) from non-main thread on FreeBSD/NetBSD
+* Suppress 'tainted string passed to vulnerable operation' false defects
+* Suppress 'taking address of label non-standard' GCC/Clang pedantic warning
+* Test GC initialization from non-main thread on FreeBSD and NetBSD
+* Test GCJ object creation with length-based descriptor (gctest)
+* Update comment in finalized_disclaim to match FINALIZER_CLOSURE_FLAG
+* Update README regarding make cords with Makefile.direct
+* Update README to use autogen.sh on build from the source repository
+* Update shared libraries version info to differentiate against v7.4
+* Use mprotect instead of mmap in GC_unmap() on Cygwin
+* Use same style of include gc.h in documentation
+* Workaround '!GC_page_size is always false' cppcheck style warning
+* Workaround '#error' cppcheck error messages
+* Workaround '32-bit value shift by >31 bits is undefined' cppcheck warnings
+* Workaround 'array compared to 0', 'untrusted loop bound' false defects
+* Workaround 'bad address arithmetic' static analysis tool false positive
+* Workaround 'checking if unsigned value is negative' cppcheck warning
+* Workaround 'checking unsigned value is negative' code defect in mark_from
+* Workaround 'comparison of identical expressions' false code defects
+* Workaround 'Condition 0!=GETENV() is always false' cppcheck style warnings
+* Workaround 'condition is always false' cppcheck warning in get_next_stack
+* Workaround 'condition is always true' cppcheck style warnings in GC_init
+* Workaround 'function is never used' cppcheck style warnings
+* Workaround 'insecure libc pseudo-random number generator used' code defect
+* Workaround 'int shift by negative amount' false code defect in finalize
+* Workaround 'local variable size too big' static analyzer warning
+* Workaround 'memory leak: result' cppcheck false error (POSIX)
+* Workaround 'null pointer dereference' false positive in push_next_marked
+* Workaround 'obsolescent bcopy, bzero called' cppcheck warnings (POSIX)
+* Workaround 'obsolescent usleep called' cppcheck warning (POSIX)
+* Workaround 'obsolete function alloca() called' cppcheck warnings
+* Workaround 'passing untyped NULL to variadic function' cppcheck warning
+* Workaround 'pointer used before comparison to null' code defect (pthread)
+* Workaround 'possible null pointer dereference' cppcheck warnings
+* Workaround 'potential multiplication overflow' code defect in de_win (cord)
+* Workaround 'redundant assignment of *result to itself' cppcheck warning
+* Workaround 'resource leak' false positives in alloc_MS, bl/envfile_init
+* Workaround 'same expression on both sides of ==' cppcheck style warning
+* Workaround 'same expression on both sides of OR' cppcheck style warning
+* Workaround 'struct member is never used' cppcheck style warnings
+* Workaround 'tainted int used as loop bound' static analysis tool warning
+* Workaround 'Uninitialized variable' cppcheck errors
+* Workaround 'unused variable' cppcheck style warnings
+* Workaround 'va_list used before va_start' cppcheck error in cord
+* Workaround 'value of macro unknown' cppcheck info messages
+* Workaround 'value of REDIRECT_MALLOC/FREE unknown' cppcheck info messages
+* Workaround 'value of SIGBUS unknown' cppcheck info messages
+* Workaround 'value of WINAPI unknown' cppcheck info messages
+* Workaround 'variable hides enumerator with same name' cppcheck warnings
+* Workaround 'variable reassigned before old value used' cppcheck warnings
+* Workaround 'waiting while holding lock' code defect in stop_world (Unix)
+* Workaround false 'uninitialized var use' code defect (initsecondarythread)
+
+Also, includes 7.4.6 changes
+
+
+== [7.6.0] 2016-08-02 ==
+
+* ABORT_ARGn log details at INFO level (Android)
+* Add 'pragma message' to gc.h to detect inconsistent WIN64/_WIN64 (MS VC)
+* Add API function to calculate total memory in use by all GC blocks
+* Add API function to set/modify GC log file descriptor (Unix)
+* Add alloc_size attribute to GC_generic_malloc
+* Add alt-stack registration support
+* Add assertion for GC_new_kind boolean arguments
+* Add assertion on lock status to GC_alloc_large and its callers
+* Add build scripts for VC 9 (Win32/64)
+* Add build system plumbing for building with -Werror
+* Add incremental GC support for Darwin/arm64
+* Add profiling callback events to indicate start/end of reclaim phase
+* Add support for enumerating the reachable objects in the heap
+* Add toggle-ref support (following Mono GC API)
+* Added instructions to README.md for building from git
+* Adjust code indentation of malloc/calloc/str[n]dup
+* Allow fork() automatic handling on Android with API level 21+
+* Allow specific TLS attributes for GC_thread_key
+* Allow thread local allocations from within pthread TLS destructors
+* Allow to force GC_dump_regularly set on at compilation
+* Altera NIOS2 support
+* Change 'cord' no-argument functions declaration style to ANSI C
+* Check DATASTART is less than DATAEND even assertions off
+* Check for execinfo.h by configure
+* Code refactoring of GC_push_finalizer/thread/typed_structures
+* Code refactoring regarding 'data start' definition for FreeBSD
+* Consistently set type of DATASTART/END to ptr_t (code refactoring)
+* Consistently use int[] type for '_end' symbol (code refactoring)
+* Consistently use outermost parentheses for DATASTART/END, STACKBOTTOM
+* Define GC_LINUX_THREADS, NO_EXECUTE_PERMISSION in configure for NaCl
+* Define ROUNDUP_PAGESIZE, ROUNDUP_GRANULE_SIZE macros (code refactoring)
+* Define public GC_GENERIC_OR_SPECIAL_MALLOC and GC_get_kind_and_size
+* Do no declare kernel_id field of GC_Thread_Rep for 64-bit Android
+* Do not allow SHORT_DBG_HDRS if KEEP_BACK_PTRS or MAKE_BACK_GRAPH
+* Do not warn of missing PT_GNU_RELRO segment when custom DSO filter used
+* Document GC_register_my_thread returned value
+* Dump the block information in CSV format
+* Eliminate redundant *flh check for null in GC_allocobj
+* Enable atomic-uncollectable in operator new in gc_cpp.h
+* Enable build with musl libc
+* Enable gc.h inclusion by client without implicit include windows.h (Win32)
+* Enable huge_test for Win64 (and LLP64 target)
+* Enable thread-local storage for Android Clang
+* Enable thread-local storage usage for GC_malloc/calloc_explicitly_typed
+* Export GC_push_all_eager, GC_push_finalizer_structures
+* Fix 'arg parameter might be clobbered by setjmp' compiler warning
+* Fix assertion in GC_mark_from for non-heap regions
+* Fix compilation for Android clang/arm with bfd linker
+* Fix integer shift undefined behavior in GC_init_explicit_typing
+* Fix missing new-line and redundant trailing dot in WARN messages
+* Fix STACKBOTTOM for Solaris 11/x86
+* Fix tag collision between ENABLE_DISCLAIM and KEEP_BACK_PTRS
+* Fix unchecked fork() result in gctest (Unix, Cygwin)
+* Fix user-defined signals drop by marker threads
+* Fix various typos in comments and documentation
+* FreeBSD/arm support improvement
+* GC_make_descriptor code refactoring (eliminate two local variables)
+* GC_malloc[_atomic] global and thread-local generalization with kind
+* GC_malloc_[atomic_]uncollectable generalization
+* GC_scratch_alloc code refactoring (and WARN message improvement)
+* Group all compact fields of GC_arrays to fit in single page
+* Handle load_segs overflow in register_dynlib_callback gracefully
+* Harmonize OSX/iOS configuration; enable compiling for iPhone simulator
+* Implement event callbacks for profiling (following Mono GC API)
+* Implement the finalization extension API
+* Implement thread suspend/resume API (Linux threads only)
+* Improve documentation for disappearing links in gc.h
+* Make heap growth more conservative after GC_gcollect_and_unmap call
+* Mark fo_head, finalize_now with a single GC_push_all call (refactoring)
+* Move MessageBox invocation code from GC_abort to a separate routine (Win32)
+* NaCl/arm initial support; NaCl runtime fixes for other CPUs
+* New macro (GC_ALWAYS_MULTITHREADED) to set multi-threaded mode implicitly
+* New macro (NO_WINMAIN_ENTRY) to prefer main() instead of WinMain in test
+* New macro (REDIRECT_MALLOC_IN_HEADER) to enable source-level redirection
+* Process all PT_LOAD segments before PT_GNU_RELRO segments (Glibc)
+* Re-implement GC_finalized_malloc using GC_malloc_kind
+* Refactoring of android_thread_kill/pthread_kill calls
+* Refactoring of GC_Xobjfreelist (use single array to keep free lists)
+* Refactoring of thread-local *_freelists (use single array of free lists)
+* Refine description in README how to build from source repository
+* Refine GC_free_space_divisor comment regarding its initial value
+* Reformat code of gc_cpp.cc/h
+* Remove 'opp' local variable in GC_malloc_X
+* Remove 'sig' argument of GC_suspend_handler_inner (code refactoring)
+* Remove code commented out by 'ifdef UNDEFINED'
+* Remove hb_large_block field (use 1 extra bit of hb_flags instead)
+* Remove obsolete BACKING_STORE_ALIGNMENT/DISPLACEMENT macros for Linux/IA64
+* Remove redundant casts in GC_generic_or_special_malloc and similar
+* Remove unsupported FreeBSD/ia64 case from gcconfig.h file
+* Remove unused GC_gcjdebugobjfreelist
+* Rename ATOMIC_UNCOLLECTABLE to GC_ATOMIC_UNCOLLECTABLE
+* Replace non-API occurrences of GC_word to word (code refactoring)
+* Return GC_UNIMPLEMENTED instead of abort in GC_get_stack_base (OS/2)
+* Show WoW64 warning message if running 32-bit on Win64 (enabled by macro)
+* Standalone profiling callback for threads suspend/resume
+* Support (add machine description for) TILE-Gx and TILEPro targets
+* Support build for Android 64-bit (arm64, mips64, x64)
+* Support FreeBSD/aarch64, FreeBSD/mips
+* Support iOS7 64-bit (AArch64) and iOS8+ 32/64-bit (Darwin)
+* Support MinGW build in scripts
+* Turn off sigsetjmp workaround for Android/x86 starting from NDK r8e
+* Use magic header on objects to improve disclaim_test
+* Workaround 'sa_sigaction member missing' compiler error (Android/x32)
+* Workaround 'unresolved __tls_get_addr' error for Android NDK Clang
+* Workaround a bug in winpthreads causing parallel marks deadlock (MinGW)
+
+Also, includes 7.4.4 changes
+
+
+== [7.4.28] 2024-09-07 ==
+
+* Avoid gcc stringop-overflow warning for intended overflow in smashtest
+* Fix ADD_CALL_CHAIN() placement to follow GC_store_debug_info_inner call
+* Fix GC_is_visible for case of arg pointing exactly to object upper bound
+* Fix GC_print_trace_inner to print the last element of the circular buffer
+* Fix cordtst2.tmp file deletion in cordtest on Windows
+* Fix double lock in GC_malloc called from backtrace()
+* Fix indent of a closing curly braces in GC_apply_to_all_blocks
+* Fix null pointer dereference in GC_is_visible if type_descr is null
+* Fix per_object_helper() after changing hb_sz units
+* Fix poor thread-local allocation performance because of double EXTRA_BYTES
+* Fix potential GC_add_roots_inner call with an overflowed pointer (Win32)
+* Fix potential address overflow in GC_add_to_heap
+* Fix potential buffer overrun during read in GC_text_mapping
+* Fix typos in comments
+* Prevent redirected malloc call from a garbage collection routine
+* Remove redundant dirty/reachable_here calls in GC_malloc_explicitly_typed
+* Update and fix diagrams describing the tree structure for pointer lookups
+
+
+== [7.4.26] 2024-02-03 ==
+
+* Eliminate 'unused parameter' gcc warning in free() if IGNORE_FREE
+* Eliminate 'unused value' gcc warnings in init_global_static_roots (Symbian)
+* Fix 'implicit declaration of function sbrk' gcc error on Symbian
+* Fix 'unused GC_set_and_save_fault_handler' warning on OS X
+* Fix GC_push_stack_for() to push also Xmm registers on Windows/x64
+* Fix MACH_TYPE macro redefinition on Symbian/arm
+* Fix missing GC_pthread_sigmask on FreeBSD and NetBSD
+* Fix missing redirect and implementation of pthread_sigmask() on OpenBSD
+
+Also, includes 7.2r changes.
+
+
+== [7.4.24] 2023-05-25 ==
+
+* Adjust CORD_ec comment placement in ec.h
+* Do not mix debug and non-debug allocations in disclaim tests
+* Eliminate 'cast signed to bigger unsigned' CSA warning in WARN calls
+* Ensure GC_NO_PTHREAD_SIGMASK defined if no GC_pthread_sigmask prototype
+* Fix GC_thread_is_registered for finished threads
+* Fix GC_unregister_my_thread call before GC functions usage in gctest
+* Fix missing lock while updating GC_in_thread_creation in GC_exit_check
+* Fix null pointer dereference in TRACE_TARGET
+* Fix of GC_bytes_allocd increment in GC_generic_malloc_inner
+* Remove redundant 'ifdef THREADS' around LOCK/UNLOCK in call_with_alloc_lock
+
+Also, includes 7.2q changes.
+
+
+== [7.4.22] 2022-08-26 ==
+
+* Eliminate 'new_l may be used uninitialized' gcc warning in os_dep (Cygwin)
+* Eliminate 'possible loss of data' compiler warning in GC_envfile_getenv
+* Fix 'undeclared getpagesize' compiler warning on AIX and OSF1
+* Fix GC_dirty() argument in GC_malloc_explicitly_typed_ignore_off_page
+* Fix SIGSEGV caused by dropped stack access from child process in gctest
+* Fix abort in Win32 DllMain if PARALLEL_MARK
+* Fix assertion violation of GC_thread_key alignment if pthread-based TLS
+* Fix comment in GC_init regarding GC_init_parallel call
+* Fix stack overflow in gctest on Alpine Linux/s390x
+* Revert "Remove nested always-false ifdef for HPUX and FREEBSD"
+* Use SIGRTMIN+6 as suspend signal if sigrt-signals on OpenBSD
+* Workaround crash in FreeBSD rand() by avoiding its concurrent usage
+
+Also, includes 7.2p changes.
+
+
+== [7.4.20] 2021-09-28 ==
+
+* Do not hold GC_fault_handler_lock when in Sleep (Windows)
+* Eliminate 'static GC_sysinfo definition has incomplete type' Clang warning
+* Eliminate 'unused function GC_add_map_entry' compiler warning
+* Eliminate 'while clause does not guard' GCC warning in GC_parse_map_entry
+* Fix OS_TYPE and USE_MMAP_ANON definitions for Cygwin/x64
+* Fix abort in GC_printf when gctest is built as WinMain executable (Cygwin)
+* Fix configure message about 'AIX gcc optimization fix'
+* Fix cordtest build in SMakefile.amiga
+* Prevent GetThreadContext failure (Windows)
+* Refactoring of WoW64 workaround (Win32)
+
+Also, includes 7.2o changes
+
+
+== [7.4.18] 2019-03-01 ==
+
+* Fix 'wrong __data_start/_end pair' error on Android
+* Fix thread_info() count argument value (OS X)
+
+Also, includes 7.2n changes
+
+
+== [7.4.16] 2018-12-13 ==
+
+* Fix 'collecting from unknown thread' abort in leak-finding mode for Win32
+* Fix 'undefined reference to GC_incremental' linker error in pthread_start
+* Fix GC_register_disclaim_proc for leak-finding mode
+* Fix concurrent bitmap update in GC_dirty
+* Fix marking of finalizer closure object
+* Fix marks and hb_n_marks consistency when disclaim returns true
+* Fix missing curses.h in cord/de when compiling manually (MS VC, MinGW)
+* Refine documentation in gc_disclaim.h
+
+Also, includes 7.2m changes
+
+
+== [7.4.14] 2018-08-11 ==
+
+* Cleanup BCC Makefile (remove absolute GC paths, fix del cmd, update clean)
+* Do not call GC_dirty_inner unless GC_incremental
+* Eliminate 'cast between incompatible function types' compiler warning
+* Eliminate 'comparing signed and unsigned values' compiler warnings (bcc)
+* Eliminate 'language extension used' Clang warning in gc.h
+* Eliminate 'possibly incorrect assignment in CORD_vsprintf' compiler warning
+* Eliminate 'switch statement contains no case label' compiler warning
+* Eliminate 'variable might be uninitialized' warning in win32_start_inner
+* Eliminate duplicate clear_mark_bit call when removing disappearing link
+* Fix 'collecting from unknown thread' abort in leak-finding mode
+* Fix compilation by digimars.mak (DMC) and by WCC makefile
+* Fix cords for MANUAL_VDB
+* Fix dependency on gc_cpp source in BCC_MAKEFILE and NT_MAKEFILE
+* Fix gctest in leak-finding mode
+* Fix missing GC_dirty calls for GC-allocated objects used internally
+* Fix missing GC_dirty invocation from debug_end_stubborn_change
+* Fix multi-threaded gctest for the case of NTHREADS is set to zero
+* Fix typos in ChangeLog and generic_malloc
+* Keep pointer to the start of previous entry in remove_specific_after_fork
+* New API function (GC_is_init_called) to check if BDWGC is initialized
+* Remove code duplication in gcj_malloc and malloc_explicitly_typed
+* Remove duplicate local variable in reclaim_block
+* Remove libatomic_ops license information from README
+* Workaround 'dynamic exception specifications deprecated in C++11' warning
+
+Also, includes 7.2l changes
+
+
+== [7.4.12] 2018-04-19 ==
+
+* Define GC_FREEBSD_THREADS and GC_ADD_CALLER macros for kFreeBSD
+* Fix comment for debug_generic_malloc_inner[_ignore_off_page]
+* Fix gctest with musl libc on s390x
+* Fix missing new-line in ABORT_ARG<n> definition
+* Fix null pointer dereference in get_private_path_and_zero_file (Symbian)
+* Fix type of local variables receiving result of PHT_HASH
+* Remove API symbols renaming in WCC_MAKEFILE
+
+Also, includes 7.2k changes
+
+
+== [7.4.10] 2018-01-22 ==
+
+* Fix error code in abort message if sem_wait failed in start_world (NetBSD)
+Also, includes 7.2j changes
+
+
+== [7.4.8] 2017-12-22 ==
+
+* Eliminate 'this statement may fall through' GCC warnings
+* Eliminate 'value exceeds maximum object size' GCC warning in huge_test
+* Fix data race in make_descriptor when setting explicit_typing_initialized
+* Fix marking of disclaim-reachable objects in the incremental mode
+* Update comment in finalized_disclaim to match FINALIZER_CLOSURE_FLAG
+Also, includes 7.2i changes
+
+
+== [7.4.6] 2017-10-26 ==
+
+* Add configure --enable-gcov option (enable code coverage analysis)
+* Add configure check whether to define NO_GETCONTEXT
+* Adjust GC_memalign comment
+* Allow HAVE_DL_ITERATE_PHDR to be defined by client (musl)
+* Allow PKG_CHECK_MODULES in configure.ac to be commented out easily
+* Avoid busy waiting in mark_thread while GC_parallel is false
+* Better document minimum value of size argument for typed allocations
+* Change type of THREAD_TABLE_INDEX result to int in win32_threads.c
+* Consistently use 'msec' instead of 'ms' in comments in pthread_support
+* Do not define amiga_get_mem, MacTemporaryNewPtr unless really used (extra)
+* Do not produce .tar.bz2 distribution file (configure)
+* Do not require libatomic_ops for single-threaded builds (configure)
+* Do not warn of missing PT_GNU_RELRO segment when custom DSO filter used
+* Document GWW_VDB in gcdescr.html
+* Eliminate 'cast to void* from int' compiler warnings (Darwin/x64)
+* Eliminate 'conditional expression is always true' code defect in GC_init
+* Eliminate 'FP divide-by-zero' static analyzer warning
+* Eliminate 'incompatible function pointer' warning in mark_some (MinGW/x86)
+* Eliminate 'ISO C forbids an empty translation unit' GCC pedantic warning
+* Eliminate 'ISO C forbids object to function pointer conversion' warning
+* Eliminate 'locally defined symbol imported' MS linker warnings (cord)
+* Eliminate 'null dereference' code defect warning in register_finalizer
+* Eliminate 'possible loss of data' compiler warnings (MS VC)
+* Eliminate 'printf format specifier mismatch' compiler warning (tools)
+* Eliminate 'type defaults to int in declaration' warning (REDIRECT_MALLOC)
+* Eliminate 'value stored is never read' warning of Clang static analyzer
+* Eliminate duplicate log messages in GC_mark_from
+* Eliminate most of collisions in GC_threads on Linux/x64
+* Ensure GC initialized when atfork_prepare is called by client
+* Fix 'arg parameter might be clobbered by setjmp' compiler warning
+* Fix 'bogus LR' detection in FindTopOfStack (Darwin)
+* Fix 'execvp argument incompatible pointer type' compiler warning (tools)
+* Fix 'GetVersion deprecated' compiler warning in os_dep (MS VC)
+* Fix 'incompatible pointer' compiler warning in GC_init_dyld (OS X 64-bit)
+* Fix 'incompatible ptr-to-int conversion' compiler warning in push_all_stack
+* Fix 'ISO C90 does not support %lf, %lg gnu_printf formats' GCC warnings
+* Fix 'ISO C90 forbids mixed declarations and code' compiler warning
+* Fix 'missing libc-version.h' build error (uClibc/x86[_64])
+* Fix 'replacement operator delete cannot be inline' GCC warning (Cygwin)
+* Fix 'variable unused' compiler warning in FirstDLOpenedLinkMap
+* Fix 'zero-size array is extension' Clang warning in os_dep (Linux/x86)
+* Fix (adjust) GC_scratch_alloc actual argument type
+* Fix deadlock in GC_help_marker caused by use of mark_cv of parent process
+* Fix finalize.c compilation in 'strict ANSI' mode
+* Fix GC shared library tests failure related to dl_iterate_phdr (musl)
+* Fix gc.h compliance to strict ANSI (pthreads)
+* Fix GC_bytes_allocd incrementation in case of allocation failure
+* Fix GC_jmp_buf multiple definition
+* Fix GC_noop6 definition to avoid its calls to be optimized away
+* Fix gctest failure if PARALLEL_MARK (musl)
+* Fix gctest thread stack overflow (musl-gcc)
+* Fix initsecondarythread_test runtime failure if GC compiled w/o threads
+* Fix lack of 2 trailing zeros in _MSC_VER numbers
+* Fix local variable declarations in disclaim_bench
+* Fix missing #error pragma
+* Fix missing .exe for disclaim test filenames in Makefile (MinGW)
+* Fix missing atomic/[un]collectable/realloc_count increments in gctest
+* Fix missing new-line and redundant trailing dot in WARN messages
+* Fix missing new-line at format strings end in subthread_create test
+* Fix mixed include of GC public header and gc_priv.h in disclaim bench/test
+* Fix potential overflow in decrement when computing GC_markers_m1
+* Fix printf format specifiers in extra files (cppcheck warnings)
+* Fix pthread_start compilation if single-obj-compilation (Linux)
+* Fix register_finalizer call in disclaim_bench for GC_DEBUG
+* Fix static assertion violation in LONG_MULT for 64-bit targets
+* Fix tag collision between ENABLE_DISCLAIM and KEEP_BACK_PTRS
+* Fix thread id leaks in subthread_create and threadkey_test
+* Fix threaded tests runtime crash if GC_NO_THREAD_REDIRECTS supplied
+* Fix tools/setjmp_t to prevent nested_sp inlining
+* Fix typo in CHECK_GCLIB_VERSION name (test)
+* Fix typos in comments/documentation (ews4800, extend_size_map, push_roots)
+* Fix unchecked fork() result in gctest (Unix, Cygwin)
+* Improve detection of internal libatomic_ops (configure)
+* Move libraries version info to the beginning of Makefile.am
+* Prevent abort in register_data_segments for Symbian
+* Process all PT_LOAD segments before PT_GNU_RELRO segments (Glibc)
+* Refine Makefile.direct comment about multi-threaded GC build
+* Refine README about library source downloading
+* Refine should_invoke_finalizers documentation
+* Remove all generated files by NT_X64_THREADS_MAKEFILE 'clean' target
+* Remove non-existent configure option in simple_example.html
+* Replace C++ style comments to C ones, remove commented out code (extra)
+* Support CFLAGS_EXTRA to pass extra user-defined compiler flags (configure)
+* Support CFLAGS_EXTRA when checking for inline and dladdr (configure)
+* Suppress 'tainted string passed to vulnerable operation' false defects
+* Suppress MS VC warnings about unused param, const condition (NT_MAKEFILE)
+* Update bdwgc mailing list online archive link in documentation
+* Update shared libraries version info to differentiate against v7.2
+* Use AC_DEFINE for defining NO_GETCONTEXT in configure
+* Workaround 'index out of bounds' UBSan false warning in push_marked
+* Workaround 'mmap() resource handle leak' static analyzer warning
+* Workaround 'redundant assignment of *result to itself' cppcheck warning
+* Workaround 'resource leak' error reported by cppcheck (tools, test)
+Also, includes 7.2h changes
+
+
+== [7.4.4] 2016-05-25 ==
+
+* Allow GC_FAST_MALLOC_GRANS() multiple use in a function
+* Also enable the TSX workaround for Linux/x86
+* Avoid unstructured procfs on Solaris
+* Change cord/de main() declaration style from K-R to ANSI C
+* Change no-argument functions declaration style to ANSI C (cord)
+* Do not include sigcontext.h and asm/sigcontext.h
+* Eliminate 'divide by zero' compiler warning in cordtest
+* Eliminate warning about 64-bit pointer-to-int cast (Win64/pthreads-w32)
+* Eliminate warnings detected by Cppcheck in cord de[_win]
+* Fix 'comparison of non-null parameter is always false' warning (Clang)
+* Fix 'CORD_iter5 unused result' code defect in cordxtra
+* Fix 'GC_generic_malloc_inner_ignore_off_page not used' compiler warning
+* Fix 'implicit declaration of vsnprintf' GCC warning (if strict ANSI mode)
+* Fix 'signed-to-bigger-unsigned value assignment' in GC_init_size_map
+* Fix 'signed-to-bigger-unsigned value assignment' warning for hb_map
+* Fix 'signed-to-bigger-unsigned value assignment' warning in GC_setpagesize
+* Fix 'statement unreachable' compiler warning in GC_mark_from
+* Fix 'statement unreachable' compiler warning in memalign
+* Fix 'unused label' compiler warning in cord/de
+* Fix 'value truncated' compiler warning in CORD_cat (MS VC)
+* Fix 'variable unused' warning in GC_save_callers
+* Fix 'visibility attribute not supported' GCC warning (IBM AIX)
+* Fix CMake warning about CMP0054 by unquoting instances of HOST
+* Fix Cygwin64 build
+* Fix GC_REALLOC to call GC_FREE if new size is zero and pointer is non-NULL
+* Fix Makefile.direct for Cygwin
+* Fix __alloc_size__ availability detection (Clang)
+* Fix abort message in GC_move_long_link
+* Fix and code refactoring of lock elision workaround (Linux/x64)
+* Fix assertion on mark_lock_holder for non-unique NUMERIC_THREAD_ID
+* Fix data race in GC_init_explicit_typing
+* Fix gc.mak regarding msvc_dbg and test (MSVC)
+* Fix missing error handling of pthread_attr_init/getstacksize
+* Fix missing error handling of pthreads_mutex_init and cond_wait
+* Fix missing numeric casts in cord
+* Fix potential left shift overflows in finalize.c (64-bit targets)
+* Fix pthreads-win32 name in comments and documentation
+* Fix setup_mark_lock missing prototype
+* Fix unchecked fcntl() result
+* Fix unchecked pointer dereference in check_ints (gctest)
+* Fix unchecked pthread_join() result in threadkey_test
+* Fix unchecked sigdelset() result in pthread_support
+* Fix undefined PTRFREE/NORMAL in gc_inline.h
+* Prefix PREFETCH_FOR_WRITE with GC_ as used in gc_inline.h public header
+* Relax mark_mutex attribute needed to disable elision (Linux/x64)
+* Remove (deprecate) TODO file
+* Remove code duplication in GC_realloc
+* Remove duplicate new-line in OUT_OF_MEMORY message (cord)
+* Remove references to missing linux_threads.c from documentation
+* Revert "Move asm machine-dependent files to 'src' folder" (partly)
+* Support Android API level 21
+* Update compiler options in gc.mak (Win32)
+* Use mmap instead of sbrk (Hurd)
+* Workaround 'comparison is always false' GCC warning in GC_FAST_MALLOC_GRANS
+* Workaround 'identical expr on both sides of bitwise op' warning
+* Workaround Linux NTPL lock elision bug
+* Workaround false warning about unreachable code path
+* Workaround invalid '_end' symbol on Android clang 3.5+
+Also, includes 7.2g changes
+
+
+== [7.4.2] 2014-06-03 ==
+
+* Add config option to use STGRTMIN-based signals for thread suspend/resume
+* Allow parallel mark to be enabled on powerpc-linux systems
+* Check for Fujitsu compiler in builtin_unwind logic (enable FX10/K-Computer)
+* Fix 'Array subscript is above array bounds' GCC warning in GC_new_kind/proc
+* Fix 'attribute declaration must precede definition' warning (clang-3.1)
+* Fix (enable) Cygwin-64 build
+* Fix GC_finalized_malloc failure on disclaim_test
+* Fix GC_sig_suspend initialization when non-constant SIGRTMIN used
+* Fix MS VC redefinition warning for functions declared with GC_ATTR_MALLOC
+* Fix TEXT() usage for concatenated strings in GC_CreateLogFile (Win32)
+* Fix data roots registration for Android/x86 and NDK ARM 'gold' linker
+* Fix find stackbottom on BlueGene P/Q systems
+* Fix machdep .lo files path in configure (SPARC, IA-64)
+* Fix ok_init assignment (missing cast) in GC_new_kind_inner
+* Fix typos in names in AUTHORS and ChangeLog files
+* Remove barrett_diagram file duplicated by tree.html
+* Remove non-existing DISCARD_WORDS from GC data structure ASCII diagram
+* Restore contribution information for ancient releases in ChangeLog
+Also, includes 7.2f changes
+
+
+== [7.4.0] 2013-11-17 ==
+
+* Add 'bytes reclaimed' counters to public GC_prof_stats_s
+* Add AArch64 (64-bit ARM) target support
+* Add GC_LONG_REFS_NOT_NEEDED ifdefs to exclude long link functionality
+* Add GC_get_prof_stats[_unsafe]() to GC public API
+* Add GC_push_all/conditional() to GC public API
+* Add assertion on number_of_objs to GC_extend_size_map
+* Add assertion to GC_enable() ensuring no counter underflow
+* Add assertion to LOCK definition that lock is not already held
+* Add assertion to LONG_MULT and remove useless assert in PUSH_CONTENTS_HDR
+* Add double-lock assertion to GC_acquire_mark_lock
+* Add manual POSIX fork handling support (Android)
+* Add note about 'pkg-config' solving problem with autoconf 2.68 or older
+* Add public GC_set/get_abort_func to replace default GC_on_abort
+* Add public GC_start_mark_threads() to allow parallel marker in fork child
+* Add public setter and getter for GC_push_other_roots
+* Add support of Android logger
+* Add tests for GC_register/move/unregister_long_link
+* Add thread suspend/resume signals public setters (POSIX threads)
+* Added long weakref support
+* Adjust GC_dont_expand/gc/precollect and GC_print_stats type to match gc.h
+* Adjust README.md title and references to doc .html files in it
+* Adjust build scripts to enable additional test library in staticrootstest
+* Adjust logged messages in start_mark_threads and GC_thr_init
+* Adjust printf format specifiers in GC_print_trace
+* Allow not to rely on __data_start value (Linux)
+* Allow pthread_kill error code logging in GC_suspend/resume (debugging)
+* Allow to compile GC_inner_start_routine aside from extra/gc.c
+* Allow to omit libc atexit() call
+* Avoid LOCK/UNLOCK hard-coding in gc_locks.h for PS3 target
+* Better document GC_warn_proc in gc.h
+* Call GC_on_abort (with NULL argument) on exit(1)
+* Call GC_stats/verbose_log_printf instead of GC_log_printf if print_stats
+* Change policy regarding version numbers ("micro" part instead of "alpha")
+* Changed C99-style designated init of GC_dl_hashtbl struct to use C89-style
+* Check GC_base result in GC_print_all_smashed_proc
+* Check that SIG_SUSPEND and SIG_THR_RESTART are different (Pthreads)
+* Check traceable_allocator.allocate result before dereference in test_cpp
+* Code refactoring of GC_x_printf (move shared code to macro)
+* Convert readme to markdown
+* Default to use libc_stack_end in single-threaded GC on glibc targets
+* Define GC_VSNPRINTF internal macro in misc.c (code refactoring)
+* Define functions in darwin_semaphore.h as inline instead of static
+* Define old_bus_handler static variable only if used (Unix)
+* Detect dladdr() presence by configure
+* Disable find-leak GC_gcollect on GC abnormal EXIT
+* Do not define _setjmp/_longjmp macros in mach_dep.c
+* Do not duplicate android_log_write output to GC log file (Android)
+* Do not include sigcontext.h if NO_SIGCONTEXT_H (Linux)
+* Do not set GC_lock_holder by call_with_alloc_lock if assertions disabled
+* Do not use pthread_getattr_np if NO_PTHREAD_GETATTR_NP specified
+* Elaborate comment on dependencies in autogen.sh
+* Eliminate 'cast from int to pointer' warning in GC_exclude_static_roots
+* Eliminate 'missing exception specification' warning in gc_cpp.cc (Clang)
+* Eliminate 'uninitialized variable use' warning in test_printf (cord)
+* Eliminate 'unused result' compiler warning in main() of test_cpp
+* Eliminate 'unused value' compiler warning in GC_stop_world (Pthreads)
+* Eliminate 'unused variable' compiler warning in start_mark_threads (HP/UX)
+* Eliminate Clang warning for GC_pthread_exit attribute
+* Eliminate GCC warning about uninitialized 'hhdr' in GC_allochblk_nth
+* Eliminate GCC warning in GC_get_main_stack_base (OpenBSD)
+* Eliminate GCC warnings in setjmp_t.c, test_cpp and cord 'de' app
+* Eliminate GC_first_nonempty atomic value reload in GC_mark_local assertion
+* Eliminate SIGBUS-related dead code in GC_write_fault_handler (Linux)
+* Eliminate warning and simplify expression in GC_init_explicit_typing
+* Enable 'force GC at every GC_malloc' debug-related functionality
+* Enable on-demand debug logging in GC_FindTopOfStack (Darwin)
+* Enable prefetch operations by default (GCC 3.0+)
+* Enable staticrootstest for the case of GC shared library build
+* Enable thread-local allocation support for Clang on Cygwin
+* Explicitly specify that Darwin, Linux and Solaris platforms have dladdr
+* Fix ABORT definition for mingw32ce (WinCE)
+* Fix AM_CONFIG_HEADER in configure for autoconf-2.69-1
+* Fix GC_CreateThread and GC_beginthreadex definition for Cygwin
+* Fix GC_INIT_CONF_ROOTS in gc.h for Android
+* Fix GC_INLINE definition to comply with ISO C90 standard (GCC)
+* Fix GC_remove_all_threads_but_me for Android (fork support)
+* Fix debug_register_displacement calls from GC_debug_generic_malloc_inner
+* Fix dyn_load.c compilation for Android 4.3
+* Fix make disclaim_test to link with new GNU ld linking rules
+* Improve GC error printing atomicity in GC_debug_X and GC_print_obj
+* Improve GC output atomicity in GC_print_obj, GC_print_all_errors
+* Improve debug-only messages of add/remove_roots and init_linux_data_start
+* Improve fork test logging in gctest
+* Improve logged messages about heap size and usage
+* Improve logging for Android differentiating messages by log level
+* Improve staticrootstest (add global data to library, add lib w/o GC_INIT)
+* Improve staticrootstest checks (tests)
+* Include "config.h" instead of "private/config.h" on HAVE_CONFIG_H
+* Include proper header file in 'tools' for configuration macros
+* Include pthread_np.h from pthread_stop_world.c on OpenBSD
+* Log error messages to stderr instead of stdout in tests
+* Make GC_generic_malloc_ignore_off_page() public
+* Make GC_mark_lock_holder variable static
+* Make GC_print_trace always thread-safe and remove 'lock' argument
+* Mark GC_started_thread_while_stopped() as GC_INNER
+* Minimize code duplication in GC_mark_and_push
+* Move 'include setjmp.h' from mach_dep.c to gc_priv.h
+* Move GC_OPENBSD_UTHREADS definition to private/gcconfig.h (OpenBSD)
+* Move GC_get_suspend/thr_restart_signal to misc.c for NaCl and OpenBSD
+* Move LOCK/UNLOCK from GC_unregister_disappearing_link_inner outer
+* Port BDWGC to Android/x86
+* Postpone the suspend signal in GC_dirty_init only if used to stop world
+* Prepend '#' symbol to GC number in logged messages
+* Prevent POSIX fork if mprotect_thread is started (Darwin)
+* Prevent abort on GC_err/warn_printf write failure
+* Prevent misleading AC_MSG_ERROR/AS_IF errors reported in configure.ac
+* Put gc_cpp symbols into 'boehmgc' namespace if GC_NAMESPACE defined
+* Recognize GC_DONT_GC macro in gc.h (causes GC_INIT to turn off GC)
+* Recognize GC_SIG_SUSPEND and GC_SIG_THR_RESTART tuning macros in gc.h
+* Redirect WRITE to __android_log_write if GC_ANDROID_LOG (Android)
+* Refine comment of GC_is_heap_ptr and GC_thread_is_registered in gc.h
+* Register dynamic libraries via dl_iterate_phdr on Android and OpenBSD
+* Remove DebugBreak on WriteFile failure (Win32)
+* Remove GC_BUILD definition from build scripts
+* Remove abort on open log failure from GC_write (Win32)
+* Remove configure.ac outdated revision number
+* Remove nested EXPECT in GC_core_finalized_malloc
+* Remove nested always-false ifdef for HPUX and FREEBSD
+* Remove redundant GC_err_printf before abort
+* Remove unused UTHREAD_SP_OFFSET macro (OpenBSD)
+* Rename subthread_create to subthreadcreate_test (Makefile)
+* Replace GC_COND_LOG_PRINTF calls with WARN for allocation failure messages
+* Replace GC_log/err_printf() followed by ABORT with ABORT_ARGn()
+* Replace GC_stats_log_printf with GC_DBG/INFOLOG_PRINTF
+* Replace SIG_SUSPEND/THR_RESTART macros to variables in pthread_stop_world
+* Replace Win32 GC_delete_gc_thread with GC_delete_gc_thread_no_free
+* Replace conditional GC_log_printf calls with GC_COND/VERBOSE_LOG_PRINTF
+* Replace sprintf with defensive snprintf
+* Replace var-args GC_noop with GC_noop6 (to eliminate Clang warning)
+* Simplify LOCK/UNLOCK macro definition for static code analysis tools
+* Specify GC_malloc result is unused in some tests
+* Specify GC_pthread_join result is unused in threadkey_test
+* Specify LT_INIT in configure.ac
+* Start of port to QNX
+* Support rthreads introduced in OpenBSD 5.2+
+* Suppress 'GC_dont_gc deprecated' warning in gc.h if GC_DONT_GC
+* Tag GC malloc routines with alloc_size attribute for Clang 3.2+
+* Test NO_WRAP_MARK_SOME macro to suppress WRAP_MARK_SOME-specific code
+* Turn off GC_LOOP_ON_ABORT functionality if GC compiled with NO_DEBUGGING
+* Turn on world-stop delay logging at debug level by default for Android
+* Use EXPECT in GC_COND/VERBOSE_LOG_PRINTF
+* Use GC_log_printf for logging instead of GC_[err_]printf
+* Use compiler TLS for Android NDK gcc/arm
+* Use memcpy (BCOPY) instead of strcpy (to suppress GCC warning)
+* Use pthread API to operate thread-local data on Linux if no compiler TLS
+* Workaround 'ELF_DATA/EM_ALPHA redefined' warning in Android linker.h
+* Workaround 'unresolved __tls_get_addr' error for Android NDK Clang
+Also, includes 7.2e, 7.2d, 7.2c, 7.2b changes
+
+
+== [7.3alpha2] 2012-05-11 ==
+
+* Add 'const' qualifier to pointer argument of some API functions
+* Add GC_UNDERSCORE_STDCALL, UNICODE macro templates to configure (Win32)
+* Add GC_get_thr_restart_signal, GC_thread_is_registered to GC API
+* Add GC_is_heap_ptr, GC_move_disappearing_link to GC API
+* Add SHORT_DBG_HDRS macro template to configure
+* Add Symbian port to mainline (porting done by Djamel Magri)
+* Add TODO file
+* Add assertion ensuring proper alignment of 'pushed' GC symbols
+* Add assertion in GC_getspecific on qtid
+* Add assertion to GC_incremental_protection_needs, refine documentation
+* Add assertion to check GC_large_free_bytes by GC_finish_collection
+* Add configure option to compile all library .c files into single gc.o
+* Add cordtest to make check
+* Add disclaim callbacks for efficient finalization (ENABLE_DISCLAIM)
+* Add finalization.html to 'doc' folder
+* Add javaxfc.h to the installation set of GC header files (configure)
+* Add on-heap-resize event notification to API
+* Adjust GC_log_printf format specifiers (regarding signed/unsigned long)
+* Adjust GC_requested_heapsize on GC_init if GC_INITIAL_HEAP_SIZE given
+* Allow GC_exclude_static_roots() region start to be unaligned
+* Allow Win32 DllMain chaining on the client side
+* Allow to exclude finalization support by GC_NO_FINALIZATION macro
+* Allow to get memory via Win32 VirtualAlloc (USE_WINALLOC) on Cygwin
+* Avoid unnecessary GC_find_limit invocation if GC_no_dls
+* Avoid use of deprecated GC_dont_gc and GC_stackbottom in gctest
+* Cast pointers to word (instead of unsigned long) in specific.h
+* Changed the order in autogen.sh so ltmain exists in time for automake
+* Declare privately and use handy GC_base_C() for constant object pointers
+* Define GC_DLL if DLL_EXPORT at GC build (for Cygwin/MinGW)
+* Define GC_READ_ENV_FILE in configure for WinCE unless gc-debug is off
+* Do not compile backgraph.c unless configure '--enable-gc-debug'
+* Do not compile pthread_stop_world.c for Cygwin/Darwin (configure)
+* Do not install ancient new_gc_alloc.h broken for modern STL (configure)
+* Enable GC_MIN_MARKERS to set minimal number of pthread-based markers
+* Enable PARALLEL_MARK and THREAD_LOCAL_ALLOC for FreeBSD in configure
+* Enable parallel mark by default in configure (Darwin/Linux/Solaris/Win32)
+* Export GC_is_marked, GC_clear/set_mark_bit (for mark-bit manipulation)
+* Extend thread-related debug messages
+* Fix 'configure --enable-cplusplus' for Cygwin/MinGW
+* Fix DATASTART (and other minor improvements) for NaCl target
+* Fix GC_setspecific to prevent garbage collection inside
+* Fix compiler warning in cordtest
+* Fix minor warnings reported by GCC with '-pedantic' option
+* Fix static data roots registration on Android (if GC is shared)
+* Implement GC_get_stack_base for Darwin for single-threaded mode
+* Improve GC_allochblk algorithm of block splitting when unmapping enabled
+* Improve GC_collect_or_expand algorithm for many finalizers registered case
+* In tests, print a message in case a test is a no-op
+* Instruct configure to hide internal libgc.so symbols if supported by GCC
+* Log amount of unmapped memory (if enabled) on marking-for-collection
+* Make __data_start a weak symbol to allow loading modules on mips
+* Move "cord" library tests to "cord/tests" folder
+* Move asm machine-dependent files to "src" folder
+* Move build tools sources to "tools" folder
+* Move cord_pos.h to public headers folder
+* Open log file in APPEND mode on Win32 (similar that on Unix/Cygwin)
+* Optimize some functions by moving pthread_self calls out of LOCK section
+* Place only major per-release changes description to ChangeLog (this file)
+* Prevent compiler warnings in GC_FindTopOfStack and GC_ports (Darwin)
+* Recognize GC_LOG_TO_FILE_ALWAYS macro to log to 'gc.log' by default
+* Remove all auto-generated files from the repo
+* Remove binary icon file for de_win
+* Remove cordtest from "cord" library
+* Remove duplicate MacOS_Test_config.h file
+* Remove gc_amiga_redirects.h (included internally) from public headers
+* Remove obsolete Makefile.DLL (superseded by Cygwin/MinGW configure)
+* Remove obsolete unused asm files for ALPHA, HPUX, SGI, RS6000, ULTRIX
+* Remove unsupported MMAP_STACKS (specific to Solaris threads)
+* Remove unused ancient SILENT, __STDC__, NO_SIGNALS macros
+* Replace ARGSUSED comment-based annotation with GCC 'unused' attribute
+* Replace GC_ms_entry declaration with opaque definition for public API
+* Replace long GC_markers global variable with int GC_markers_m1
+* Replace pointer relational comparisons with non-pointer ones
+* Replace printf PRIxMAX specifier with '%p' for thread id debug output
+* Require autoconf 2.61 instead of v2.64
+* Simplify autogen.sh (use autoreconf)
+* Split GC_abort with GC_on_abort and abort() invoked from ABORT
+* Support GC_ATTR_MALLOC for MS VisualStudio
+* Tag auxiliary malloc-like API functions with 'malloc' attribute
+* Tag deprecated variables in GC API
+* Tag must-be-non-null arguments of GC API functions
+* Turn on "extra" GCC warnings
+* Turn on unused-parameter checking for GCC
+* Update AUTHORS file
+* Use EXPECT for checking various 'initialized' boolean variables
+* Use USE_COMPILER_TLS on Cygwin
+* Use pthread_key for thread-local storage on FreeBSD
+* Use union of AO_t and word to favor strict-aliasing compiler optimization
+Also, includes 7.2 changes
+
+
+== [7.2s] 2024-09-06 ==
+
+* Avoid gcc stringop-overflow warning for intended overflow in smashtest
+* Eliminate 'type defaults to int in declaration' warning (REDIRECT_MALLOC)
+* Eliminate 'value exceeds maximum object size' GCC warning in huge_test
+* Eliminate warning and simplify expression in GC_init_explicit_typing
+* Fix 'GetVersion deprecated' compiler warning in os_dep (MS VC)
+* Fix 'value truncated' compiler warning in CORD_cat (MS VC)
+* Fix ADD_CALL_CHAIN() placement to follow GC_store_debug_info_inner call
+* Fix GC_is_visible for case of arg pointing exactly to object upper bound
+* Fix GC_jmp_buf multiple definition
+* Fix GC_print_trace_inner to print the last element of the circular buffer
+* Fix double lock in GC_malloc called from backtrace()
+* Fix indent of a closing curly braces in GC_apply_to_all_blocks
+* Fix null pointer dereference in GC_is_visible if type_descr is null
+* Fix per_object_helper() after changing hb_sz units
+* Fix poor thread-local allocation performance because of double EXTRA_BYTES
+* Fix potential GC_add_roots_inner call with an overflowed pointer (Win32)
+* Fix potential address overflow in GC_add_to_heap
+* Fix potential buffer overrun during read in GC_text_mapping
+* Fix typos in comments
+* Prevent compiler warnings regarding unused argument and printf in extra
+* Prevent redirected malloc call from a garbage collection routine
+* Remove barrett_diagram file duplicated by tree.html
+* Remove non-existing DISCARD_WORDS from GC data structure ASCII diagram
+* Resolve GCC warning in setjmp_t.c
+* Update and fix diagrams describing the tree structure for pointer lookups
+
+
+== [7.2r] 2024-02-03 ==
+
+* Fix 'g++ not found' error on OpenBSD (Makefile.direct)
+* Fix 'implicit declaration of iscntrl()' warning in cord/de_win (MinGW)
+* Fix 'info' buffer potential overrun in GC_save_callers
+* Fix 'missing sysconf() prototype' gcc error in setjmp_t tool (OpenBSD)
+* Fix SVR4 macro definition order
+* Fix asm constraint in LONG_MULT for gcc/x86
+* Fix assertion violation in GC_get_maps on Linux if malloc redirection
+* Fix bitwise negation and rounding direction in setjmp_t tool
+* Fix closing bracket placement for case statement in configure
+* Fix indent of a closing curly brace in GC_forward_exception
+* Fix missing outermost parentheses in CORD_pos_cur_char_addr
+* Fix missing type widening before left shift in GC_MAKE_PROC
+* Fix misspelled GC_HEADERS_H macro in gc_priv.h
+* Fix null dereference in check_finalizer_nested if redirect malloc on Linux
+* Fix posix_memalign() to overwrite pointer storage only on success
+* Fix skipped removal of page protection in case of address hash collision
+* Fix typos in comments
+* Fix update of last_back_trace_gc_no if KEEP_BACK_PTRS is not defined
+
+
+== [7.2q] 2023-05-25 ==
+
+* Fix CORD_next() indent inside loop in test_basics() of cordtest
+* Fix DCL_LOCK_STATE placement in GC_set_oom_fn
+* Fix GC_excl_table overrun on overflow in GC_exclude_static_roots
+* Fix IRIX5 defined wrongly on Tandem S-Series and WinCE/mips
+* Fix comparisons to heap boundary in GC_get_back_ptr_info and GC_mark_from
+* Fix disabling of automatic dynamic libraries registration
+* Fix double initialization of main thread local free lists on Win32
+* Fix joinable threads shutdown on NaCl
+* Fix loop condition over dll_thread_table in GC_lookup_pthread (Win32)
+* Fix missing GC_CALLBACK for GC_waitForSingleObjectInfinite
+* Fix missing libalphagc.so dependency in Makefile.direct
+* Fix missing result check of pthread_attr_getdetachstate in pthread_create
+* Fix overlapping region assertion in mark_some if malloc redirect on Linux
+* Fix potential SIGSEGV on out-of-memory in gctest
+* Fix typos in comments and documentation
+* Fix unregistering of thread created by intercepted pthread_create on NaCl
+* Fix use of unset errno after pthread_create call
+* Invoke GC_oom_fn if GC_make_array_descriptor failed because of no memory
+
+
+== [7.2p] 2022-08-25 ==
+
+* Avoid potential race in GC_init_real_syms after GC_allow_register_threads
+* Define SUNOS5SIGS macro for kFreeBSD
+* Do not assert that GC is initialized at DLL_THREAD_DETACH (Win32)
+* Ensure typed objects descriptor is never located in the first word
+* Fix GC_make_descriptor for zero length argument
+* Fix SUNOS5SIGS documentation to match macro definition in gcconfig.h
+* Fix assertion violation in GC_allow_register_threads on Windows
+* Fix get_maps failure when GC_repeat_read returns zero
+* Fix hb_obj_kind type in documentation (ASCII diagram) describing hblkhdr
+* Fix missing lock when GC_generate_random_valid_address is called
+* Fix nodist_libgc_la_SOURCES value in Makefile.am for Solaris/sparc
+* Fix oldProc initialization in gc_cleanup and eliminate related warnings
+* Fix parallel_initialized assertion violation in initsecondarythread (Win32)
+* Fix propagation of out-of-memory occurred in GC_make_sequence_descriptor
+* Fix race between calloc_explicitly_typed and push_complex_descriptor
+* Fix typos in comments of .c files, gc.h and a typo in debugging.html
+* Refer to Makefile.direct instead of deleted Makefile file in README
+* Remove checking of RS6000 completely
+* Remove non-working check of M68K in gctest
+* Revert addition of msvc_dbg.h in include.am
+
+
+== [7.2o] 2021-09-28 ==
+
+* Add loop to handle abort error like in suspend logic on Darwin
+* Disable mprotect-based incremental GC if /proc roots are used (Linux)
+* Explicitly zero-initialize trace_buf (fix trace_buf initialization)
+* Fix 'ACCESS_VIOLATION in marker' GC warning on Win32 async thread start
+* Fix 'GC_generic_malloc must be available' GCC error in new_gc_alloc.h
+* Fix 'expected function body after declarator' clang error in gc_cpp.cc
+* Fix 'write to GC log failed' error
+* Fix GC_proc_fd value in child process at fork (Solaris)
+* Fix assertion violation in register_dynlib_callback on Android
+* Fix configure message about 'AIX gcc optimization fix'
+* Fix data race regarding *rlh value in generic_malloc_many
+* Fix first_thread stack_base initialization if custom GC_stackbottom (Win32)
+* Fix fread failure after enable_incremental if malloc is redirected (Linux)
+* Fix gc_cflags variable name in configure (HP/UX)
+* Fix handling of areas smaller than page size on recycle scratch area
+* Fix incorrect define GC_OPENBSD_THREADS on sparc64
+* Fix misaligned tlfs passed to AO_load on m68k
+* Fix missing GC_quiet declaration in pcr_interface.c
+* Fix missing gc_dlopen.c in CMake script
+* Fix missing scratch_last_end_ptr update (Irix)
+* Fix overflow of scratch_free_ptr value
+* Fix page_was_[ever_]dirty() for static roots (Solaris)
+* Fix printf format specifier in simple_example.html
+* Fix save_callers for multi-threaded case if built-in backtrace unavailable
+* Fix various typos in comments and documentation files
+* Fix word size, data start and alignment for OpenBSD/mips64(el)
+* Prevent WARN of incompatible incremental GC if default or manual VDB
+* Reduce a time period between GetExitCodeThread and SuspendThread (Win32)
+* Remove a misleading comment about Solaris in gc.h
+
+
+== [7.2n] 2019-03-01 ==
+
+* Fix 'mprotect remapping failed' abort on NetBSD with PaX enabled
+* Fix 'unexpected mark stack overflow' abort in push_all_stack
+* Fix BSD_TIME variant of MS_TIME_DIFF for the case of a.tv_usec < b.tv_usec
+* Fix GetThreadContext stale register values use if WoW64 (Win32)
+* Fix executable memory allocation in GC_unix_get_mem
+* Fix invalid initializer of CLOCK_TYPE variables if BSD_TIME
+
+
+== [7.2m] 2018-12-11 ==
+
+* Fix comment typos in CMakeLists.txt, backgraph.c, de.c, gcconfig.h
+* Fix hbp overflow in GC_install_counts
+* Fix start_world not resuming all threads on Darwin
+* Guard against potential buffer overflow in CORD_next and CORD_pos_fetch
+
+
+== [7.2l] 2018-08-10 ==
+
+* Fix 'pointer arithmetic with NULL' code defect in print_callers
+* Fix Borland version in documentation to match that in BCC_MAKEFILE
+* Fix comment about inv_sz computation in setup_header
+* Fix comments style in configure.ac and Makefile.am
+* Fix GC_is_valid_displacement and GC_is_visible for non-small objects
+* Fix global operator delete definition for C++14 in gc_cpp
+* Fix infinite restarting of mark_some when a static root disappeared (Linux)
+* Fix large object base computation in PUSH_CONTENTS() if MARK_BIT_PER_OBJ
+* Fix mark stack overflow checking in push_selected
+* Fix MSWIN32 macro redefinition (WCC)
+* Fix potential null dereference in GC_CONS
+* Fix register_dynamic_libraries on Windows 10
+* Fix result computation in n_set_marks
+* Fix return type in GC_set_warn_proc API documentation
+* Fix typo in comment for CORD_ec_flush_buf prototype
+* Fix typos in ChangeLog
+* Fix VirtualQuery call in case of malloc failure (Win32)
+* Install gc.3 man page instead of copying gc.man to doc folder (configure)
+* Perform thread_suspend in loop as it may be interrupted (Darwin)
+* Workaround 'template-id not supported in this context' compiler error (WCC)
+
+
+== [7.2k] 2018-04-19 ==
+
+* Fix arguments delimiter in pcr_interface.c (PCR)
+* Fix assertion violation in DllMain of win32_threads
+* Fix data race during apply_to_each_object(reset_back_edge)
+* Fix dbg_mlc.c/o file name in documentation
+* Fix include gc_gcj.h in thread_local_alloc.c
+* Fix man section number (3)
+* Fix missing GC_generic_malloc_words_small implementation in new_gc_alloc.h
+* Fix missing SIGBUS handler setup for kFreeBSD
+* Fix null dereference in print_callers on backtrace_symbols failure
+* Fix the collector hang when it is configured with --enable-gc-debug
+* Fix thread_suspend fail for threads registered from key destructor (OS X)
+* Fix typo in AIX macro name
+* Fix typo in comment in specific.h
+
+
+== [7.2j] 2018-01-21 ==
+
+* Fix GC allocation mutex in child after a fork
+* Fix last_reclaimed..gc_no interval comparison to threshold in unmap_old
+* Fix libgc version which was changed in linkage breaking way
+* Fix missing EOLn output in threadlibs tool
+
+
+== [7.2i] 2017-12-21 ==
+
+* Avoid data race in finalized_count (gctest)
+* Fix assertion violation about disabled cancel in try_to_collect_inner
+* Fix data race in a list referenced by A.aa (gctest)
+* Fix data race in do_local_mark when comparing active_count to helper_count
+* Fix data race in GC_init_explicit_typing
+* Fix data race in last_stop_count access (suspend_handler_inner)
+* Fix data race in mark_thread when updating mark_no
+* Fix data race when getting object size in explicitly-typed allocators
+* Fix lack of barriers to synchronize memory for suspend_handler
+* Fix typos in cdescr.html, extend_size_map and ews4800 doc, README.sgi
+* Prevent 'Unexpected heap growth' in single-threaded gctest (Linux/x64)
+
+
+== [7.2h] 2017-10-12 ==
+
+* Add gctest as a test (CMake)
+* Change no-argument functions declaration style to ANSI C (extra files)
+* Do not allow SHORT_DBG_HDRS if KEEP_BACK_PTRS or MAKE_BACK_GRAPH
+* Ensure oom_fn callback executed on out-of-memory in calloc
+* Fix '~' operator application to unsigned values shorter than word
+* Fix 'context local variable might be clobbered by setjmp' compiler warning
+* Fix 'doc' files installation folder
+* Fix 'shift count >= width of type' compiler warning in GC_SQRT_SIZE_MAX
+* Fix ALL_INTERIOR_POINTERS name in comments and documentation
+* Fix AO_SRC_DIR target name in NT_*_MAKEFILE
+* Fix assertion in GC_mark_from for non-heap regions
+* Fix assertion in GC_steal_mark_stack for non-heap regions
+* Fix assertion violation in GC_repeat_read if --enable-redirect-malloc
+* Fix assertion violation in GC_wait_builder called from start_mark_threads
+* Fix assertion violation in mark_local checking GC_mark_stack_top
+* Fix assertion violation in return_single_freelist in child process
+* Fix bm_huge initialization for 64-bit targets (gctest)
+* Fix broken external links in documentation
+* Fix bytes count passed to add_to_our_memory in backgraph new_back_edges
+* Fix calloc_explicitly_typed in case of lb*n overflow
+* Fix CMake warning about CMP0054 by unquoting instances of HOST
+* Fix conditional expression in pos_fetch, next non-macro definitions (cord)
+* Fix configure --disable-munmap handling
+* Fix CORD_substr_closure for the case when CORD_from_fn returns C string
+* Fix crash in FirstDLOpenedLinkMap if app linked statically (Alpine Linux)
+* Fix double lock in pthread_detach (Cygwin, winpthreads)
+* Fix double multiplication of lb by n in calloc_explicitly_typed
+* Fix enable_parallel_mark condition in CMake script
+* Fix external libatomic_ops pkg-config-based detection
+* Fix gc_allocator.h file name in new_gc_alloc.h comment
+* Fix gc_backptr.h, gc_mark.h, GC_DS_TAGS names in documentation
+* Fix gc_cleanup destructor for non-heap objects (gc_cpp)
+* Fix GC_collect_or_expand to prevent allocation size value wrap-around
+* Fix GC_incremental declaration/definition type mismatch
+* Fix GC_mark_stack_top assertion violation properly in mark_local
+* Fix GC_remove_specific invocation from remove_all_threads_but_me
+* Fix GC_requested_heapsize increment in GC_init
+* Fix GC_setspecific to prevent garbage collection inside
+* Fix GC_SIZE_MAX definition (Linux/musl-gcc)
+* Fix GCJ support in CMake build script
+* Fix gctest crash if configure --enable-handle-fork on Darwin
+* Fix get_maps on proc maps file asynchronous growth
+* Fix hb_n_marks underflow in clear_fl_marks if MARK_BIT_PER_OBJ
+* Fix header filename in gcconfig.h comment
+* Fix infinite mark_some calls after memory mapping disappeared (Glibc)
+* Fix integer shift undefined behavior in GC_init_explicit_typing
+* Fix leak_test crash in print_callers if free() is redirected
+* Fix Makefile.direct recursive invocation
+* Fix malloc routines to prevent size value wrap-around (fix CVE-2016-9427)
+* Fix missing win32_threads.c compilation for Cygwin (CMake)
+* Fix MS VC warning about compiling unused checksums and thread_local_alloc
+* Fix name typos in GC_FAST_MALLOC_GRANS comment
+* Fix null dereference in reclaim_block if DONT_ADD_BYTE_AT_END
+* Fix OSF1 host pattern in CMakeLists.txt
+* Fix PCR-Makefile by removing compilation of a missing file
+* Fix potential data race in GC_SysVGetDataStart (SPARC)
+* Fix potential integer overflow in GC_find_limit_* functions
+* Fix printf arguments type in print_callers
+* Fix pthread_detach for threads not yet registered (Cygwin, winpthreads)
+* Fix pthread_join to avoid thread removal on failure (Cygwin, winpthreads)
+* Fix pthread_join when thread is registered in thread key destructor
+* Fix push_complex_descriptor to avoid unlimited global mark stack growth
+* Fix removal of dead threads in a child process
+* Fix SIGSEGV in GC_is_marked when gc_cleanup is used in leak-finding mode
+* Fix SIGSEGV in mark_from called from do_local_mark if WRAP_MARK_SOME
+* Fix Solaris/sparc detection in case of strict C compliance is enforced
+* Fix STACKBOTTOM for Solaris 11/x86
+* Fix storage class of local variable in register_dynamic_libraries (Irix)
+* Fix tools/setjmp_t hang (OS X)
+* Fix typed_test to prevent fails in malloc_explicitly_typed (64-bit)
+* Fix undefined HEAP_START in register_dynamic_libraries
+* Fix USE_CUSTOM_SPECIFIC mode (if manually enabled) for Win32
+* Fix USE_GET_STACKBASE_FOR_MAIN definition in gcconfig.h
+* Fix various typos in comments, documentation and printed messages
+* Handle load_segs overflow in register_dynlib_callback gracefully
+* Prevent misleading AC_MSG_ERROR/AS_IF errors reported in configure.ac
+* Replace (fix) 'objs' acronym in comments with 'objects' word
+* Revert "Skip GC_DS_PER_OBJECT objs with negative descriptor in GC_mark_from"
+* Update documentation about bugs reporting and new releases notification
+* Update Download information in GC overview document
+* Update shared libraries version info (v7.2)
+* Workaround a bug in winpthreads causing parallel marks deadlock (MinGW)
+* Workaround missing getcontext() in Docker osrf/ubuntu_32bit
+
+
+== [7.2g] 2016-05-23 ==
+
+* Fix 'illegal option -xassembler-with-cpp' error (Oracle SunCC)
+* Fix 'implicit declaration of function' compiler warnings in cord/de
+* Fix CFLAGS in configure regarding -O flag passing to SunCC compiler
+* Fix FirstDLOpenedLinkMap for case libgc not 1st dynamically linked (NetBSD)
+* Fix GC initialization in cord de_win for Cygwin
+* Fix GC_get_stack_base if called before GC_init (Win32)
+* Fix OSX issue with pthread_attr_setstacksize failure
+* Fix Unicode Win32 API calls in cord de_win
+* Fix USE_COMPILER_TLS macro duplicate description in README
+* Fix cord de_win WndProc prototype parameters for 64-bit (Win64)
+* Fix file descriptor resource leak in GC_register_data_segments (OS/2)
+* Fix filename printing in cordtest
+* Fix missing cord_pos.h, ec.h among installed headers (Automake)
+* Fix missing GC_get_stack_base for Amiga
+* Fix missing msvc_dbg.h in dist_noinst_HEADERS (Automake)
+* Fix mistyped ARM_THREAD_STATE macro (Darwin/arm)
+* Fix null-pointer dereferences on out-of-memory in cord and tests
+* Fix potential multiplication overflow in check_heap_stats (gctest)
+* Fix race (and potential deadlock) at marker threads initialization
+* Fix signedness of char values passed to isspace, iscntrl, isxdigit
+* Fix typo (items numbering) in GC_finalize_all documentation
+* Fix typos in ERROR_FL, GC_malloc_uncollectable comments
+* Fix typos in gc_priv.h, in README for ews4800
+* Fix unresolved vsnprintf in misc.c and snprintf in cordtest (DJGPP, VC)
+* Fix various spelling errors
+* Fix vsprintf_args initialization/cleanup in CORD_vsprintf for EMX
+* Regenerate configure files using official libtool release (v2.4.2)
+* Remove documentation about obsolete GC_REDIRECT_TO_LOCAL
+* Skip GC_DS_PER_OBJECT objects with negative descriptor in GC_mark_from
+* windows-untested: Fix paths to msvc_dbg.c/h
+
+
+== [7.2f] 2014-06-03 ==
+
+* Fix 'Bad signal in suspend_handler' abort on FreeBSD-9.2
+* Fix 'source file in a subdirectory' Automake warnings
+* Fix ABORT message in GC_restart_handler
+* Fix ADD_DEFINITION in CMakeLists.txt for kFreeBSD
+* Fix CMakeLists.txt: do not override CMAKE_OSX_ARCHITECTURES
+* Fix GC_alloc_large by bumping GC_collect_at_heapsize in GC_add_to_heap
+* Fix GC_scratch_last_end_ptr update on GC_scratch_alloc failure
+* Fix GET_MEM argument rounding in GC_scratch_alloc and similar
+* Fix PARALLEL_MARK for Windows 7+
+* Fix build (broken by fenv.h inclusion) on Linux/x64 under uClibc
+* Fix crash when using GC_malloc_many() as first allocation call
+* Fix mark stack excessive growth during parallel mark
+* Fix or remove broken URLs in documentation
+* Fix out-of-memory case in new_back_edges, push_in_progress (backgraph)
+* Fix typo in GC_collect_or_expand comment
+* Fix typos in GC overview file, gc_config_macros.h, gc_cpp.h, README.changes
+* Regenerate configure files by automake 1.14.1, libtool 2.4.2.418
+* Update emails/links due to project site and ML transition
+
+
+== [7.2e] 2013-11-10 ==
+
+* Add weak attribute to avoid __data_start undefined messages (s390x)
+* Add weak stubs for pthread_cancel API
+* Adjust 'pthread_[un]register_cancel undefined ref' workaround (Pthreads)
+* Append _test suffix to 'initsecondarythread' binary file names
+* Enable PARALLEL_MARK and THREAD_LOCAL_ALLOC for FreeBSD in configure
+* Fix 'stack section' pointer passed to push_all_stack_sections (Pthreads)
+* Fix GC_CreateThread 'dwStackSize' argument type for Win64
+* Fix GC_PTHREAD_PTRVAL definition for GC_PTHREADS_PARAMARK (Win32)
+* Fix GC_clear_stack by declaring 'dummy' local array as volatile
+* Fix GC_get_stack_base assembly code (Cygwin/Clang)
+* Fix GC_malloc_explicitly_typed_ignore_off_page for large allocations
+* Fix GC_marker_Id elements initialization (WinCE)
+* Fix GC_print_trace missing unlock
+* Fix GC_unix_mmap_get_mem for open of /dev/zero failure
+* Fix GC_win32_free_heap compilation error for Cygwin
+* Fix GC_win32_free_heap to prevent memory leak if USE_GLOBAL_ALLOC
+* Fix Win32 GC_write preventing potential infinite recursion at abort
+* Fix assertion violation in GC_mark_from prefetch loop
+* Fix collection of objects referenced only from GC_mark_stack_X variables
+* Fix dwSize argument of VirtualFree call in detect_GetWriteWatch (Win32)
+* Fix heap sections overflow for Win32/Cygwin with enabled parallel marker
+* Fix min_bytes_allocd preventing potential infinite loop in GC_allocobj
+* Fix missing tabs in SMakefile.amiga file
+* Fix null-pointer dereference in CORD_substr_closure
+* Fix old_segv/bus_act variables initialization for FreeBSD
+* Fix potential double fclose in test_extras (cordtest)
+* Fix pthread_attr_t resource leak in pthread_create
+* Fix race in GC_print_all_errors regarding GC_leaked
+* Fix sizeof in GC_push_thread_structures
+* Fix stackbottom/stack_end assignment in GC_call_with_gc_active
+* Fix tests makefile to link with new GNU ld linking rules
+* Fix typos in comments and documentation
+* Fix unportable '==' test operators in configure
+* Fix vsprintf_args cleanup in CORD_vsprintf
+* Merge FreeBSD New ports collection for boehm-gc v7.2d
+* Replace GC_DBG_RA with GC_DBG_EXTRAS macro
+* Replace deprecated [CXX]INCLUDES to AM_C[PP]FLAGS in configure.ac file
+* Use __builtin_extract_return_addr in GC_RETURN_ADDR_PARENT (gcc/x86)
+
+
+== [7.2d] 2012-08-09 ==
+
+* Fix GC_call_with_stack_base to prevent its tail-call optimization
+* Fix all address-of-dummy operations by using GC_approx_sp() instead
+* Fix stop_info.stack_ptr assignment in GC_suspend_all for OpenBSD
+* Fix test_cpp (ensure the collector recognizes pointers to interiors)
+* Fix thread-related tests for pthreads-w32
+* test_cpp: Fix WinMain to prevent SEGV if zero arguments passed (MinGW)
+
+
+== [7.2c] 2012-06-11 ==
+
+* Fix CORD_cat_char_star to prevent SEGV in case of out-of-memory
+* Fix GC_FirstDLOpenedLinkMap() for NetBSD 6 release
+* Fix GC_scratch_alloc and GC_get_maps invocations to prevent SEGV
+* Fix visibility of GC_clear/set_mark_bit (unhide symbols)
+* Fix visibility of GC_push_all/conditional, GC_push_other_roots symbols
+
+
+== [7.2b] 2012-05-23 ==
+
+* Fix assertion in GC_malloc_[atomic_]uncollectable (THREADS case only)
+
+
+== [7.2] 2012-05-11 ==
+
+* Abort in GC_thr_init on pthread_atfork failure (POSIX threads)
+* Add GC_WIN32_PTHREADS target in configure
+* Add GC_is_disabled new function to GC API
+* Add info that getcontext() resets FPE mask no longer on Linux/x64
+* Add public GC_set_handle_fork to control forked child handling support
+* Add realloc_test.c test
+* Add support for Hexagon target
+* Add thread-safe GC_get_heap_usage_safe to GC API
+* Change GC_check_fl_marks prototype and implementation
+* Check pthread_create/join result in test
+* Define GC_DLL (in configure) if building only dynamic libraries
+* Define NO_DEBUGGING (in configure) if "--disable-gc-debug" is set
+* Disable incremental mode on Darwin if fork handling requested
+* Enable parallel marker in configure for Solaris
+* Fix "comparison of signed and unsigned values" compiler warnings
+* Fix 'volatile' keyword placement in GC_SysVGetDataStart
+* Fix ALIGNMENT, CPP_WORDSZ, GC_GRANULE_BYTES/WORDS for x32 target
+* Fix GC_READ_ENV_FILE code for Cygwin
+* Fix GC_add_roots_inner for Mac OS X (align segment start)
+* Fix GC_check_fl_marks regarding concurrent access
+* Fix GC_finalizer_nested size to workaround alignment problem in Watcom
+* Fix GC_find_limit_with_bound to always reset fault handler on return
+* Fix GC_init static assertion for clang/x64 (Darwin)
+* Fix GC_init[_lib_bounds] and GC_get_main_stack_base for malloc redirection
+* Fix GC_push_all/selected boundaries check
+* Fix GC_register_my_thread marking thread as detached (Cygwin/pthreads-w32)
+* Fix GC_remove_all_threads_but_me to cleanup thread-specific data storage
+* Fix GC_restart_handler to preserve errno if needed
+* Fix GC_root_size update in GC_add_roots_inner (Win32)
+* Fix GC_unregister_my_thread to ensure no ongoing incremental GC (Win32)
+* Fix GC_with_callee_saves_pushed for clang (disable __builtin_unwind_init)
+* Fix calloc, GC_generic_malloc to check for allocation size overflows
+* Fix compiler warning in GC_dyld_image_add/remove (Darwin)
+* Fix configure --enable-cplusplus make install
+* Fix configure to disable GCC aliasing optimization unless forced to
+* Fix duplicate definitions in gcconfig.h for NetBSD
+* Fix fork() support on Cygwin and Darwin targets
+* Fix gc.h compatibility regression regarding GC_PTR, GC_I_HIDE_POINTERS
+* Fix gc_cpp.cc for Cygwin (remove duplicate function definition)
+* Fix gcconfig.h to define USE_GET_STACKBASE_FOR_MAIN for Android
+* Fix gcconfig.h to handle mips64-linux target
+* Fix gctest (for Win32) to avoid GC_print_stats internal variable usage
+* Fix mach_dep.c to include sys/ucontext.h on Mac OS X 10.6
+* Fix tests to check GC_malloc result for NULL (out-of-memory)
+* Fix thread model in configure for MinGW ("win32" instead of "posix")
+* Fix various warnings reported by LINT-like tools
+* Fix visibility of some GC internal symbols used by GNU GCJ currently
+* Port some thread tests to Win32
+* Refine API GC setters and getter comments regarding locking
+* Refine GC_stackbottom description in gc.h
+* Remove duplicate calls in GC_register_dynamic_libraries
+* Remove locking in API GC_get_bytes_since_gc and friends
+* Remove newly-added GC_get_heap_size/free_bytes_inner from API
+* Remove some local variables that are unused
+* Support multi-threading for RTEMS target
+* Use global GC_noop_sink variable in GC_noop1 to suppress compiler warning
+* Use pkg-config to pick up libatomic_ops, etc
+* Workaround some Linux/arm kernels bug to get correct GC_nprocs value
+
+
+== [7.2alpha6] 2011-06-14 ==
+
+* configure_atomic_ops.sh: Remove.
+* Makefile.direct (dist gc.tar): Remove configure_atomic_ops.sh.
+* Makefile.am (EXTRA_DIST): Add autogen.sh.
+
+* NT_STATIC_THREADS_MAKEFILE (.cpp.obj): Remove duplicate .cpp
+filename passed.
+* NT_X64_THREADS_MAKEFILE (.cpp.obj): Use lowercase file
+extension.
+* NT_X64_STATIC_THREADS_MAKEFILE (.cpp.obj): Likewise.
+* NT_MAKEFILE (.cpp.obj): Likewise.
+
+* alloc.c (GC_add_current_malloc_heap, GC_build_back_graph,
+GC_traverse_back_graph): Move prototype to gc_priv.h.
+* checksums.c (GC_page_was_ever_dirty): Likewise.
+* dbg_mlc.c (GC_default_print_heap_obj_proc): Likewise.
+* dyn_load.c (GC_parse_map_entry, GC_get_maps,
+GC_segment_is_thread_stack, GC_roots_present, GC_is_heap_base,
+GC_get_next_stack): Likewise.
+* finalize.c (GC_reset_finalizer_nested,
+GC_check_finalizer_nested): Likewise.
+* gcj_mlc.c (GC_start_debugging, GC_store_debug_info): Likewise.
+* malloc.c (GC_extend_size_map, GC_text_mapping): Likewise.
+* mark_rts.c (GC_mark_thread_local_free_lists): Likewise.
+* misc.c (GC_register_main_static_data, GC_init_win32,
+GC_setpagesize, GC_init_linux_data_start,
+GC_set_and_save_fault_handler, GC_init_dyld, GC_init_netbsd_elf,
+GC_initialize_offsets, GC_bl_init, GC_do_blocking_inner,
+GC_bl_init_no_interiors): Likewise.
+* os_dep.c (GC_greatest_stack_base_below, GC_push_all_stacks):
+Likewise.
+* reclaim.c (GC_check_leaked): Likewise.
+* win32_threads.c (GC_gww_dirty_init): Likewise.
+* darwin_stop_world.c (GC_is_mach_marker, GC_mprotect_stop,
+GC_mprotect_resume): Move prototype to darwin_stop_world.h.
+* pthread_support.c (GC_FindTopOfStack): Likewise.
+* dyn_load.c (GC_cond_add_roots): Merge adjacent definitions.
+* mark.c (GC_page_was_ever_dirty): Remove (as already declared).
+* mark_rts.c (GC_roots_present): Change return type to void
+pointer (to match the prototype); return NULL instead of FALSE.
+* mark_rts.c (GC_add_roots_inner): Cast GC_roots_present() result.
+* os_dep.c (NEED_PROC_MAPS): Move definition to gcconfig.h.
+* os_dep.c (GC_write_fault_handler): Make STATIC.
+* os_dep.c (GC_set_write_fault_handler): New function (only if
+GC_WIN32_THREADS).
+* pthread_start.c (GC_start_rtn_prepare_thread,
+GC_thread_exit_proc): Move prototype to pthread_support.h.
+* pthread_support.c (GC_nacl_initialize_gc_thread,
+GC_nacl_shutdown_gc_thread, GC_unblock_gc_signals):
+Likewise.
+* pthread_support.c (GC_stop_init): Move prototype to
+pthread_stop_world.h.
+* win32_threads.c (GC_write_fault_handler): Remove prototype.
+* win32_threads.c (GC_register_my_thread_inner): Call
+GC_set_write_fault_handler instead of SetUnhandledExceptionFilter
+(only if MPROTECT_VDB).
+* doc/README.win32: Add information about DMC.
+* include/private/gc_priv.h (GC_set_write_fault_handler): New
+prototype (only if GC_WIN32_THREADS and MPROTECT_VDB).
+
+* misc.c (vsnprintf): Redirect to vsprintf() if NO_VSNPRINTF.
+
+* win32_threads.c (GC_unregister_my_thread): Use KNOWN_FINISHED()
+instead of FINISHED macro.
+* tests/test.c (check_heap_stats): Round up max_heap_sz value for
+Win32 (same as for USE_MMAP).
+
+* tests/test.c (check_heap_stats): Adjust printf format specifier
+for max_heap_sz; cast max_heap_sz accordingly.
+
+* doc/README.solaris2: Add note.
+
+* configure.ac (SOLARIS25_PROC_VDB_BUG_FIXED): Don't define for
+Solaris/x86 2.10+.
+
+* tests/threadkey_test.c (SKIP_THREADKEY_TEST): Skip the test if
+defined; explicitly define for some targets.
+
+* mark.c (GC_dirty): Add prototype (only if MANUAL_VDB).
+* stubborn.c (GC_dirty): Likewise.
+* include/private/gcconfig.h (GWW_VDB, MPROTECT_VDB, PCR_VDB,
+PROC_VDB): Undefine if MANUAL_VDB.
+* include/private/gcconfig.h (DEFAULT_VDB): Don't define if
+MANUAL_VDB.
+* os_dep.c (async_set_pht_entry_from_index): Define for
+MANUAL_VDB.
+* os_dep.c (GC_read_dirty): Set GC_dirty_maintained only if
+success; if ioctl() failed then just print warning instead of
+aborting.
+
+* include/private/gc_priv.h (GC_ASSERT): Use "%d" (instead of %ld)
+for line number printing.
+
+* os_dep.c (GC_read_dirty): Add debug logging if DEBUG_DIRTY_BITS
+(for PROC_VDB only); print errors via GC_err_printf; rename "ps"
+and "np" local variables to npages and pagesize, respectively;
+remove "current_addr" local variable.
+
+* os_dep.c (GC_get_main_stack_base): Convert to GC_get_stack_base
+for BeOS and OS/2; define HAVE_GET_STACK_BASE.
+* os_dep.c (GET_MAIN_STACKBASE_SPECIAL): Define when a specific
+GC_get_main_stack_base implementation is defined.
+* os_dep.c (GC_get_main_stack_base): Define that based on
+GC_get_stack_base() in a single place (only if
+GET_MAIN_STACKBASE_SPECIAL is unset); check GC_get_stack_base()
+result.
+
+* mark.c (GC_push_selected): Remove "push_fn" argument (use
+GC_push_all directly); update the documentation.
+* mark.c (GC_push_conditional): Simplify the code (for better
+readability).
+
+* mark.c (alloc_mark_stack): Use FALSE/TRUE (instead of 0/1) for
+boolean local variables.
+* doc/README.macros (GC_PREFER_MPROTECT_VDB): Update.
+* os_dep.c (GC_page_was_dirty, GC_page_was_ever_dirty,
+GC_remove_protection): Define for GWW_VDB and PROC_VDB in a single
+place.
+* os_dep.c (GC_page_was_dirty, GC_page_was_ever_dirty): Compute
+PHT_HASH(h) only once (store result to a local variable).
+
+* doc/README.solaris2: Update.
+
+* include/private/gcconfig.h (end, InitStackBottom): Declare
+extern variable for RTEMS.
+* include/private/gcconfig.h (DATASTART, DATAEND, STACKBOTTOM):
+Update (for RTEMS).
+* include/private/gcconfig.h (DATAEND): Fix a typo in the macro
+name (for RTEMS).
+* tests/test.c (CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER):
+Replace with CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER (for RTEMS).
+
+* include/private/gcconfig.h (MPROTECT_VDB): Enable for Solaris in
+single-threaded environment.
+
+* include/private/gcconfig.h (MPROTECT_VDB): Undefine if PROC_VDB.
+* tests/test.c (NUMBER_ROUND_UP): New macro.
+* tests/test.c (check_heap_stats): Round up total expected heap
+size to the nearest 4 MiB bound.
+* tests/test.c (check_heap_stats): Print the current and expected
+heap sizes in case of failure.
+
+* checksums.c (GC_check_blocks, GC_check_dirty): Do log printing
+only if GC_print_stats; print errors using GC_err_printf.
+* checksums.c (GC_check_blocks): Join adjacent printf() calls into
+a single one.
+
+* pthread_support.c (pthread_join): Add assertion (check thread is
+finished).
+* pthread_support.c (GC_register_my_thread): Don't detach the
+thread if invoked from the thread destructor.
+* win32_threads.c (GC_register_my_thread): Likewise.
+* win32_threads.c (GC_unregister_my_thread): Don't delete the
+thread (just set FINISHED) if the thread is not detached (only if
+GC_PTHREADS); add assertion (check the thread is not finished).
+* tests/threadkey_test.c (main): Join some created threads.
+
+* pthread_support.c (GC_delete_gc_thread): Rename "gc_id" local
+variable to "t".
+* win32_threads.c (GC_delete_gc_thread): Likewise.
+* pthread_support.c (pthread_join, pthread_detach,
+pthread_cancel): Rename "thread_gc_id" local variable to "t".
+* win32_threads.c (GC_pthread_detach): Likewise.
+* win32_threads.c (GC_delete_gc_thread): Remove "gc_nvid" local
+variable.
+* win32_threads.c (GC_pthread_join): Rename "joinee" local
+variable to "t".
+
+* pthread_stop_world.c (pthread_sigmask): Undefine even if not
+DEBUG_THREADS.
+* pthread_stop_world.c (GC_unblock_gc_signals): New function (only
+if GC_EXPLICIT_SIGNALS_UNBLOCK).
+* pthread_support.c (GC_unblock_gc_signals): New prototype.
+* pthread_support.c (GC_register_my_thread_inner,
+GC_register_my_thread): Call GC_unblock_gc_signals (only if
+GC_EXPLICIT_SIGNALS_UNBLOCK); add comment.
+* include/private/gcconfig.h (GC_EXPLICIT_SIGNALS_UNBLOCK): New
+macro.
+
+* pthread_stop_world.c (GC_suspend_handler_inner): Remove "dummy",
+"sig" local variables; rename my_thread local variable to "self".
+
+* tests/threadkey_test.c (LIMIT): Use smaller value (don't create
+more than 30 in parallel by default).
+
+* tests/threadkey_test.c (key_once, main): Work around for Solaris
+PTHREAD_ONCE_INIT.
+* tests/threadkey_test.c (LIMIT): Use smaller value for Solaris.
+
+* dyn_load.c (GC_FirstDLOpenedLinkMap): Remove unused "r" local
+variable.
+* pthread_support.c (GC_unregister_my_thread_inner): Revert back
+GC_remove_specific invocation; add a comment.
+* include/private/thread_local_alloc.h (GC_remove_specific):
+Revert back.
+* specific.c (slow_getspecific): Cast qtid to AO_t.
+* include/private/specific.h (key_create, setspecific,
+remove_specific): Remove "extern" keyword.
+* include/private/specific.h (getspecific): Change type of "qtid"
+local variable to unsigned long.
+
+* pthread_support.c (GC_check_tls): Fix "#endif" comment.
+* include/gc.h (GC_REDIRECT_TO_LOCAL): Remove deprecated comment.
+* include/private/thread_local_alloc.h (THREAD_LOCAL_ALLOC):
+Remove redundant test of the macro.
+
+* backgraph.c (add_edge): Recognize DEBUG_PRINT_BIG_N_EDGES macro.
+* os_dep.c (GC_set_and_save_fault_handler): Recognize
+SIGACTION_FLAGS_NODEFER_HACK macro.
+* pthread_support.c (mark_mutex): Recognize GLIBC_2_1_MUTEX_HACK
+macro.
+* pthread_support.c (GC_acquire_mark_lock): Remove commented out
+code.
+* include/private/gc_priv.h (SUNOS5SIGS): Don't include
+sys/siginfo.h on Linux.
+* include/private/gcconfig.h (FORCE_WRITE_PREFETCH): New macro
+recognized, force PREFETCH_FOR_WRITE to be defined on x86.
+* include/private/gcconfig.h (USE_HPUX_FIXED_STACKBOTTOM): New
+macro recognized (for HP/UX).
+
+* os_dep.c (GC_gww_page_was_ever_dirty): Fix comment (for
+GWW_VDB).
+* os_dep.c (GC_dirty_init): Use memset() for GC_written_pages
+resetting (for PROC_VDB).
+
+* tests/threadkey_test.c: New file.
+* tests/tests.am (TESTS, check_PROGRAMS): Add 'threadkey_test'.
+* tests/tests.am (threadkey_test_SOURCES, threadkey_test_LDADD):
+New variable.
+
+* pthread_support.c (GC_unregister_my_thread_inner): Don't call
+GC_remove_specific.
+* include/private/thread_local_alloc.h (GC_remove_specific):
+Remove (since it is empty for all targets).
+* pthread_support.c (GC_record_stack_base): New inline function.
+* win32_threads.c (GC_record_stack_base): Likewise.
+* pthread_support.c (GC_register_my_thread_inner): Invoke
+GC_record_stack_base.
+* win32_threads.c (GC_register_my_thread_inner): Likewise.
+* pthread_support.c (GC_register_my_thread): If thread is FINISHED
+then call GC_record_stack_base, clear FINISHED, initialize
+thread-local list and return success.
+* win32_threads.c (GC_register_my_thread): Likewise.
+* include/gc.h (GC_register_my_thread): Update documentation.
+* include/private/thread_local_alloc.h (GC_thread_key): Likewise.
+
+* thread_local_alloc.c (GC_malloc, GC_malloc_atomic): Join
+adjacent "#ifdef".
+* thread_local_alloc.c (GC_malloc_atomic): Call
+GC_core_malloc_atomic (instead of GC_core_malloc).
+
+* pthread_start.c (GC_start_rtn_prepare_thread): Change return
+type to GC_thread.
+* pthread_start.c (GC_inner_start_routine): Pass the current
+thread descriptor to pthread_cleanup_push (same as in
+win32_threads.c).
+* pthread_stop_world.c (GC_push_all_stacks): Rename "me" local
+variable to "self".
+* win32_threads.c (GC_push_all_stacks): Likewise.
+* pthread_stop_world.c (GC_suspend_all, GC_start_world): Rename
+"my_thread" local variable to "self".
+* pthread_support.c (GC_unregister_my_thread_inner): New static
+function.
+* pthread_support.c (GC_unregister_my_thread,
+GC_thread_exit_proc): Use GC_unregister_my_thread_inner.
+* win32_threads.c (GC_register_my_thread, GC_unregister_my_thread,
+GC_do_blocking_inner): Rename "t" local variable to "thread_id".
+* win32_threads.c (GC_wait_marker, GC_notify_all_marker): Rename
+"id" local variable to "thread_id".
+
+* pthread_support.c (GC_unregister_my_thread): Call pthread_self
+only once.
+* win32_threads.c (GC_pthread_start_inner): Likewise.
+* pthread_support.c (GC_unregister_my_thread): Add debug output.
+* win32_threads.c (GC_unregister_my_thread): Likewise.
+* pthread_support.c (GC_register_my_thread,
+GC_start_rtn_prepare_thread): Rename "my_pthread" local variable
+to "self".
+
+* include/gc.h (GC_HIDE_POINTER, GC_REVEAL_POINTER): Define
+unconditionally (do not test GC_I_HIDE_POINTERS); update the
+comment.
+* include/gc.h (HIDE_POINTER, REVEAL_POINTER): Define as alias to
+GC_HIDE/REVEAL_POINTER, respectively.
+* include/private/gc_pmark.h (GC_I_HIDE_POINTERS): Do not define.
+* include/private/gc_priv.h (GC_I_HIDE_POINTERS): Likewise.
+
+* include/gc.h (GC_register_my_thread): Refine the comment.
+
+* include/gc_inline.h (GC_MALLOC_WORDS, GC_CONS): Add missing
+parentheses.
+* include/gc_typed.h (GC_get_bit, GC_set_bit,
+GC_CALLOC_EXPLICITLY_TYPED): Likewise.
+
+* include/private/gcconfig.h (NO_GETCONTEXT): Add missing ')'.
+
+* include/private/gcconfig.h (NO_GETCONTEXT): Do not use
+getcontext(2) on m68k because it is not implemented there.
+
+* alloc.c (GC_clear_a_few_frames): Use BZERO().
+* mark_rts.c (GC_clear_roots, GC_rebuild_root_index): Likewise.
+* reclaim.c (GC_start_reclaim): Likewise.
+* blacklst.c (total_stack_black_listed): Remove "len" local
+variable.
+* dbg_mlc.c (GC_generate_random_valid_address): Replace "for"
+statement with "do-while" one.
+* dyn_load.c (GC_register_dynamic_libraries,
+GC_register_dynlib_callback): Remove redundant parentheses.
+
+* cord/cordxtra.c (CORD_from_file_lazy_inner): Suppress
+"unused result" compiler warning for fread().
+
+* os_dep.c (GC_write_fault_handler): Break when in_allocd_block
+is set to true.
+
+* dbg_mlc.c (GC_has_other_debug_info): Change return type to int;
+return -1 if the object has (or had) debugging info but was
+marked deallocated.
+* include/private/dbg_mlc.h (GC_has_other_debug_info): Likewise.
+* dbg_mlc.c (GC_has_other_debug_info): Update documentation;
+remove "ohdr" local variable.
+* dbg_mlc.c (GC_debug_free): Don't call GC_free if the object has
+probably been deallocated.
+* dbg_mlc.c (GC_debug_free): Don't actually free the object even
+in the leak-finding mode if GC_findleak_delay_free.
+* dbg_mlc.c (GC_check_leaked): New function (only unless
+SHORT_DBG_HDRS).
+* doc/README.environment (GC_FINDLEAK_DELAY_FREE): Document.
+* doc/README.macros (GC_FINDLEAK_DELAY_FREE): Likewise.
+* include/private/dbg_mlc.h (START_FLAG, END_FLAG): Use GC_WORD_C
+on 64-bit architectures.
+* include/private/dbg_mlc.h (NOT_MARKED): Remove redundant
+parentheses.
+* include/private/dbg_mlc.h (GC_HAS_DEBUG_INFO): Update (due to
+GC_has_other_debug_info change).
+* include/private/gc_priv.h (GC_findleak_delay_free): New global
+variable declaration (unless SHORT_DBG_HDRS).
+* misc.c (GC_findleak_delay_free): New global variable; recognize
+GC_FINDLEAK_DELAY_FREE.
+* misc.c (GC_init): Recognize GC_FINDLEAK_DELAY_FREE environment
+variable (unless SHORT_DBG_HDRS).
+* reclaim.c (GC_check_leaked): Declare (unless SHORT_DBG_HDRS).
+* reclaim.c (GC_add_leaked): Don't add the object to leaked list
+if marked as deallocated.
+
+* dbg_mlc.c (GC_has_other_debug_info): Fix punctuation in the
+comment.
+* dbg_mlc.c (GC_FREED_MEM_MARKER): New macro.
+* dbg_mlc.c (GC_debug_free): Use GC_FREED_MEM_MARKER.
+* dbg_mlc.c (GC_smashed): Refine documentation.
+* mark.c (GC_push_selected): Change dirty_fn return type to
+GC_bool.
+* os_dep.c (GC_page_was_ever_dirty): Make GC_INNER.
+* reclaim.c (GC_reclaim_small_nonempty_block): Remove "kind"
+local variable.
+* reclaim.c (GC_reclaim_block): Pass true constant to
+GC_reclaim_small_nonempty_block (instead of report_if_found).
+* doc/README.autoconf: Update; fix a typo.
+* include/private/gcconfig.h (GC_WORD_C): New macro.
+
+* dbg_mlc.c (GC_store_debug_info_inner): Cast "linenum".
+* dbg_mlc.c (GC_check_annotated_obj): Fix punctuation in the
+comment.
+* dbg_mlc.c (GC_print_smashed_obj): Add (and print) "msg"
+argument.
+* dbg_mlc.c (GC_debug_free, GC_print_all_smashed_proc): Pass
+message to GC_print_smashed_obj.
+* dbg_mlc.c (GC_debug_free): Call GC_size once.
+* dbg_mlc.c (GC_debug_realloc): Calculate old_sz only if
+allocation succeeded; remove unnecessary check for object is
+smashed (since this is done in GC_debug_free); remove "clobbered"
+local variable.
+
+* dbg_mlc.c (GC_store_debug_info_inner, GC_store_debug_info):
+Rename "integer" argument to "linenum"; change the type of the
+argument to int.
+* gcj_mlc.c (GC_store_debug_info): Likewise.
+* dbg_mlc.c (GET_OH_LINENUM): New macro.
+* dbg_mlc.c (GC_print_obj, GC_print_smashed_obj): Use
+GET_OH_LINENUM; adjust print format specifier.
+* dbg_mlc.c (GC_debug_malloc, GC_debug_malloc_ignore_off_page,
+GC_debug_malloc_atomic_ignore_off_page,
+GC_debug_generic_malloc_inner,
+GC_debug_generic_malloc_inner_ignore_off_page,
+GC_debug_malloc_stubborn, GC_debug_malloc_atomic,
+GC_debug_malloc_uncollectable,
+GC_debug_malloc_atomic_uncollectable): Remove unnecessary cast of
+"i".
+* gcj_mlc.c (GC_debug_gcj_malloc): Likewise.
+
+* os_dep.c (GC_linux_stack_base): Rename to
+GC_linux_main_stack_base.
+* os_dep.c (GC_freebsd_stack_base): Rename to
+GC_freebsd_main_stack_base; adjust error message.
+* pthread_stop_world.c (GC_stop_init): Use GC_SEM_INIT_PSHARED
+as an argument for sem_init().
+* pthread_support.c (pthread_create): Likewise.
+* pthread_support.c (pthread_create): Abort in case sem_init()
+fails.
+* include/private/gc_priv.h (GC_SEM_INIT_PSHARED): Define.
+* tests/initsecondarythread.c: Include gcconfig.h; call GC_INIT
+from main() if it should be done from the primordial thread only.
+
+* alloc.c: Don't include sys/types.h for ArmCC.
+* dyn_load.c: Likewise.
+* os_dep.c: Likewise.
+* mach_dep.c (_setjmp, _longjmp): Redirect to setjmp/longjmp for
+ArmCC.
+* mark.c (GC_noop): Define specially for ArmCC.
+* include/private/gc_priv.h (GC_noop): Likewise.
+* misc.c (GC_init): Don't test pointers comparison for ArmCC.
+* misc.c: Don't include unistd.h for ArmCC.
+* os_dep.c (pages_executable): Rename to GC_pages_executable;
+make STATIC.
+* os_dep.c (GC_unix_mmap_get_mem): Don't define for ArmCC.
+* ptr_chck.c (GC_is_visible): Explicitly cast
+(GC_DS_PER_OBJECT-GC_INDIR_PER_OBJ_BIAS) to word (to suppress
+a compiler warning).
+* include/private/gcconfig.h: Recognize __arm.
+* include/private/gcconfig.h (HBLKPTR): Define for ArmCC.
+* include/private/gcconfig.h (HBLKPTR): Add parentheses for
+"bytes" argument.
+
+* pthread_support.c (GC_get_nprocs): Don't define for Android.
+* pthread_support.c (GC_dummy_thread_local): Don't test
+GC_LINUX_THREADS.
+* include/gc_config_macros.h (GC_ADD_CALLER, GC_RETURN_ADDR):
+Define for Android.
+
+* mach_dep.c (NO_GETCONTEXT): Move to gcconfig.h.
+* os_dep.c (GC_write_fault_handler): Don't include ucontext.h if
+NO_GETCONTEXT.
+* include/private/gcconfig.h (GETPAGESIZE): Define as a sysconf
+call for Android.
+
+* include/private/gc_locks.h (WIN32_LEAN_AND_MEAN, NOSERVICE):
+Define before including windows.h.
+* include/private/gc_priv.h (WIN32_LEAN_AND_MEAN, NOSERVICE):
+Likewise.
+* include/private/thread_local_alloc.h (WIN32_LEAN_AND_MEAN,
+NOSERVICE): Likewise.
+* include/private/gc_priv.h (MS_TIME_DIFF): Avoid floating-point
+arithmetics; add a comment.
+
+* mark.c (GC_clear_hdr_marks): Don't test USE_MARK_BYTES.
+* extra/setjmp_t.c (main): Don't test USE_MARK_BITS.
+* include/private/gc_pmark.h (SET_MARK_BIT_EXIT_IF_SET): Likewise.
+* include/private/gc_pmark.h (SET_MARK_BIT_EXIT_IF_SET): Remove
+"mark_byte" local variable.
+* include/private/gc_pmark.h (OR_WORD_EXIT_IF_SET): Add a comment
+about that AO_or() is not used by GC unless USE_MARK_BITS
+explicitly set.
+* include/private/gc_priv.h (OR_WORD): Likewise.
+* include/private/gc_pmark.h (INCR_MARKS): Remove trailing ';',
+add parentheses.
+* include/private/gc_priv.h (ONES): Define before use by
+MAKE_COOLER.
+* include/private/gc_priv.h (MARK_BITS_SZ): Define where used.
+* include/private/gc_priv.h (OR_WORD): Don't define if
+USE_MARK_BYTES.
+* include/private/gcconfig.h (USE_MARK_BYTES); Remove duplicate
+definition; simplify expression.
+
+* os_dep.c (GC_get_maps): Always close the file.
+* pthread_support.c (GC_get_nprocs): Likewise.
+* os_dep.c (READ): Define similarly across the file (without
+parameters).
+* pthread_support.c (GC_get_nprocs): Use signed int type for "i"
+and "len" local variables (since read() may return -1).
+* include/private/gc_pmark.h (LONG_MULT): Add prefix/suffix
+double underscore; add "volatile" for asm.
+* include/private/gc_pmark.h (LONG_MULT): Add missing
+parentheses.
+* include/private/gc_priv.h (OR_WORD): Likewise.
+* include/private/gc_priv.h (OR_WORD): Remove unnecessary brackets
+and ';' symbol.
+
+* os_dep.c (GC_get_stack_base): Implement for Android (same as
+for Linux).
+* pthread_support.c (GC_get_nprocs): Return 1 (instead of -1) if
+failed to open "stat" file (not to issue a warning twice); update
+the comment.
+* pthread_support.c (GC_thr_init): Call sysconf() on Android to
+get the number of CPUs.
+
+* include/private/gc_priv.h (_GNU_SOURCE): Revert one of the
+recent patches regarding this macro as the macro should be set
+(to 1) before including any other system header.
+
+* doc/README.environment (GC_INITIAL_HEAP_SIZE,
+GC_MAXIMUM_HEAP_SIZE): Update.
+
+* misc.c (GC_parse_mem_size_arg): Allow 'k', 'M', 'G' suffixes in
+heap size specifier; return 0 if not a valid one.
+* include/gc_cpp.h: Explicitly define inline one-argument delete
+operator for Cygwin (as a workaround).
+* tests/test_cpp.cc (main): Suppress compiler warnings about
+"assigned value is unused".
+
+* misc.c (GC_parse_mem_size_arg): New function.
+* misc.c (GC_init): Use GC_parse_mem_size_arg().
+* pthread_stop_world.c (tkill): Declare for Android.
+
+* include/private/gc_priv.h (_GNU_SOURCE): Include features.h
+first (except for NaCl) and then define the macro to 1 if not yet.
+
+* tests/tests.am (TESTS, check_PROGRAMS): Add
+'initsecondarythread'.
+* tests/tests.am (initsecondarythread_SOURCES,
+initsecondarythread_LDADD): New variable.
+
+* dbg_mlc.c (GC_store_debug_info_inner): Always define; add
+"const" to its string argument.
+* dbg_mlc.c (GC_store_debug_info): Call GC_store_debug_info_inner.
+* dbg_mlc.c (GC_debug_free): Set GC_have_errors in case of
+smashed or previously deallocated found.
+* dbg_mlc.c (GC_check_heap_block): Replace while loop with a for
+one.
+* reclaim.c (GC_reclaim_check): Likewise.
+* dbg_mlc.c (GC_check_heap_proc): Remove redundant cast to word.
+* os_dep.c (GC_get_stack_base): Don't initialize
+stackbase_main_self/ss_sp on Solaris if thr_main() is zero (thus
+calling GC_INIT() from a non-primordial thread is possible now).
+* reclaim.c (GC_add_leaked): Turn into an inline one.
+* reclaim.c (GC_reclaim_small_nonempty_block):
+Change report_if_found type from int/word to boolean.
+* include/private/gc_priv.h (GC_start_reclaim): Likewise.
+* include/private/gc_priv.h (set_mark_bit_from_hdr,
+clear_mark_bit_from_hdr): Place closing parenthesis properly.
+
+* os_dep.c (GC_get_main_stack_base): Try to use
+pthread_attr_getstack first for Linux if THREADS.
+* doc/README.macros (USE_GET_STACKBASE_FOR_MAIN): Adjust text
+alignment.
+
+* dbg_mlc.c (GC_generate_random_backtrace_no_gc): Fix a message
+typo.
+* dbg_mlc.c (GC_debug_malloc): Add a comment (about zero size).
+* dbg_mlc.c (GC_strdup): Call GC_err_printf instead of WARN (in
+case of NULL argument).
+* dbg_mlc.c (GC_free): In case of NULL argument, just return
+(without any warning printed); eliminate "uncollectable" local
+variable.
+
+* configure.ac (THREADDLLIBS): Use alternate thread library on
+Solaris 8.
+* configure.ac (need_atomic_ops_asm): Set to true only for SPARC
+Solaris.
+* configure.ac: Don't use libdl on mips-sgi-irix6.
+
+* mach_dep.c (NO_GETCONTEXT); Define for RTEMS.
+* mach_dep.c (GC_with_callee_saves_pushed): Don't call
+__builtin_unwind_init() for RTEMS; use setjmp() without the
+leading underscore (for RTEMS).
+* tests/test.c (BIG): Use smaller value for RTEMS.
+* tests/test.c (main): Customize for RTEMS.
+
+* configure.host: Remove doubled words in comments.
+* os_dep.c: Likewise.
+* doc/README: Likewise.
+* extra/setjmp_t.c: Likewise.
+* tests/huge_test.c: Likewise.
+* extra/setjmp_t.c (getpagesize, nested_sp, main, g): Replace the
+K&R-style function definition with the ANSI C one.
+* extra/setjmp_t.c (nested_sp): Implement in the same way as
+GC_approx_sp.
+
+* dyn_load.c (GC_dyld_sections): Add more sections.
+* dyn_load.c (GC_dyld_add_sect_fmts): New static variable.
+* dyn_load.c (L2_MAX_OFILE_ALIGNMENT): New macro.
+* dyn_load.c (GC_dyld_image_add, GC_dyld_image_remove): Improve
+logging; add support for on-demand sections.
+
+* gcj_mlc.c (GC_gcj_malloc_initialized): Use STATIC unless
+GC_ASSERTIONS.
+* include/private/gc_priv.h (GC_gcj_malloc_initialized): Don't
+declare (as external) unless GC_ASSERTIONS.
+* os_dep.c (GC_win32_free_heap): Clear GC_heap_bases[] also for
+Cygwin; add FIXME.
+* include/private/gcconfig.h: Include <sys/unistd.h> for RTEMS.
+* include/private/gcconfig.h: Add "#error" for every "-->" mark.
+* include/private/gcconfig.h (CLEAR_DOUBLE): Turn the code into
+an expression.
+* include/private/pthread_support.h (SUSPENDED_EXT): Add new flag
+(which existed previously as SUSPENDED and still exists in GCJ).
+* include/private/pthread_support.h (DISABLED_GC): Change the
+value (as it is already used by SUSPENDED_EXT).
+
+* tests/test.c (reverse_test): Modify count (BIG) for
+ppc64-darwin.
+
+* reclaim.c (GC_print_all_errors): Recognize new GC_ABORT_ON_LEAK
+macro and environment variable; abort if any error has been
+printed provided the environment variable (or macro) is set.
+* doc/README.environment (GC_ABORT_ON_LEAK): Document.
+* doc/README.macros (GC_ABORT_ON_LEAK): Likewise.
+
+* os_dep.c (GC_unix_sbrk_get_mem, GC_unix_get_mem): Don't define
+for RTEMS.
+* include/private/gcconfig.h (RTEMS): Add support for.
+* include/private/gcconfig.h (GET_MEM): Use calloc() for RTEMS.
+
+* mallocx.c (GC_malloc_uncollectable): Move to malloc.c (since
+it is used internally in some places).
+
+* dbg_mlc.c (GC_register_finalizer_no_order): Remove redundant
+declaration.
+* dbg_mlc.c (GC_debug_malloc_replacement,
+GC_debug_realloc_replacement): Rename RA to GC_DBG_RA.
+* malloc.c (GC_debug_malloc_replacement): Likewise.
+* mallocx.c (GC_debug_realloc_replacement): Likewise.
+* dbg_mlc.c (GC_store_debug_info): Move proto from dbg_mlc.h.
+* malloc.c (GC_strdup, GC_strndup, GC_wcsdup): Move to mallocx.c.
+* malloc.c: Include errno.h only REDIRECT_MALLOC; remove redundant
+includes of string.h.
+* mallocx.c: Include string.h (for GC_strdup).
+* include/private/dbg_mlc.h (GC_store_debug_info): Move declaration
+to dbg_mlc.c.
+* include/private/gc_locks.h (UNCOND_LOCK, UNCOND_UNLOCK): Remove
+redundant trailing ';'.
+* include/private/gc_priv.h (START_WORLD, COND_DUMP): Likewise.
+* include/private/gc_locks.h (LOCK, UNLOCK): Place opening '{'
+properly.
+* include/private/gc_priv.h (GC_DBG_RA): Move from dbg_mlc.c,
+malloc.c, mallocx.c.
+
+* alloc.c (GC_check_heap, GC_print_all_smashed): Move the
+definition from misc.c.
+* dbg_mlc.c (GC_debug_malloc_atomic_uncollectable): Define as
+public.
+* include/gc.h (GC_debug_malloc_atomic_uncollectable): Declare.
+* include/gc.h (GC_MALLOC_ATOMIC_UNCOLLECTABLE): Define new public
+macro.
+* dbg_mlc.c (MAX_SMASHED): Don't define if already set.
+* reclaim.c (MAX_LEAKED): Likewise.
+* dbg_mlc.c (GC_add_smashed): Add FIXME about the concurrent
+access to the global array.
+* reclaim.c (GC_add_leaked): Likewise.
+* misc.c (GC_print_back_height): Set on if GC_PRINT_BACK_HEIGHT
+(new macro) is defined.
+* doc/README.macros (GC_PRINT_BACK_HEIGHT): Document.
+* misc.c (GC_dump_regularly, GC_init): Replace 0/1 for
+GC_dump_regularly and GC_print_back_height variables with
+FALSE/TRUE.
+* reclaim.c (GC_print_all_errors): Refine the comment.
+
+* tests/test.c (reverse_test_inner): Undo one of the previous
+patches which shifts "c" and "d" pointers only if
+ALL_INTERIOR_POINTERS (since interior pointers are always
+recognized in stacks).
+
+* misc.c (GC_stdout, GC_stderr): Move the definition to the place
+where GC_log is defined (Unix only).
+* misc.c (GC_init): Recognize "GC_ONLY_LOG_TO_FILE" environment
+variable and the similar macro; redirect GC_stdout and GC_stderr
+to GC_log if "GC_LOG_FILE" environment variable is set unless
+prohibited by GC_ONLY_LOG_TO_FILE (Unix only).
+* doc/README.environment (GC_ONLY_LOG_TO_FILE): Document.
+* doc/README.macros (GC_ONLY_LOG_TO_FILE): Likewise.
+
+* misc.c (GC_stdout, GC_write): Rename GC_stdout to GC_log (Win32
+only).
+* misc.c (GC_write): Add for MacOS (and OS/2); change WRITE()
+accordingly.
+* misc.c (GC_printf): Check GC_quiet before va_start().
+
+* allchblk.c (GC_freehblk): Use GC_log_printf instead of GC_printf
+inside "if (GC_print_stats)" branch.
+* alloc.c (GC_collect_or_expand): Likewise.
+* dyn_load.c (GC_register_dynamic_libraries): Likewise.
+* headers.c (GC_scratch_alloc): Likewise.
+* os_dep.c (GC_get_maps, GC_remap, PROTECT,
+GC_write_fault_handler, GC_dirty_init, GC_mprotect_thread): Likewise.
+* alloc.c (min_bytes_allocd): Use GC_log_printf instead of
+GC_printf for DEBUG_THREADS output.
+* darwin_stop_world.c (GC_stack_range_for, GC_suspend_thread_list,
+GC_stop_world, GC_thread_resume, GC_start_world): Likewise.
+* pthread_start.c (GC_inner_start_routine): Likewise.
+* pthread_stop_world.c (GC_suspend_handler, GC_restart_handler,
+GC_push_all_stacks, GC_suspend_all, GC_stop_world,
+GC_start_world): Likewise.
+* pthread_support.c (GC_mark_thread, GC_get_nprocs,
+GC_start_rtn_prepare_thread, pthread_create): Likewise.
+* checksums.c (GC_update_check_page): Use GC_printf() instead of
+GC_err_printf() for error printing.
+* checksums.c (GC_check_blocks, GC_check_dirty): Use GC_log_printf
+instead of GC_printf for logging purposes.
+* dyn_load.c (sys_errlist, sys_nerr, errno): Move declaration of
+external variable outside from GC_register_dynamic_libraries.
+* dyn_load.c (GC_register_dynamic_libraries): Don't use
+sys_errlist value if errno equals to sys_nerr.
+* dyn_load.c (GC_register_dynamic_libraries): Use GC_log_printf
+instead of GC_printf for DL_VERBOSE output.
+* dyn_load.c (GC_dyld_image_add, GC_dyld_image_remove,
+GC_init_dyld): Use GC_log_printf instead of GC_printf for
+DARWIN_DEBUG output.
+* os_dep.c (catch_exception_raise): Use GC_log_printf
+instead of GC_printf for DEBUG_EXCEPTION_HANDLING output.
+* reclaim.c (GC_print_free_list): Move "n" increment out of
+GC_printf() call.
+
+* win32_threads.c (DEBUG_CYGWIN_THREADS, DEBUG_WIN32_PTHREADS,
+DEBUG_WIN32_THREADS): Remove.
+* win32_threads.c (GC_register_my_thread_inner,
+GC_win32_start_inner): Use GC_log_printf instead of GC_printf
+inside "if (GC_print_stats)" branch.
+* win32_threads.c (GC_PTHREAD_PTRVAL): New macro (defined only if
+GC_PTHREADS).
+* win32_threads.c (GC_delete_gc_thread, NUMERIC_THREAD_ID,
+GC_pthread_join, GC_pthread_create): Use GC_PTHREAD_PTRVAL
+macro.
+* win32_threads.c (GC_push_stack_for, GC_mark_thread,
+GC_CreateThread, GC_beginthreadex, GC_pthread_join,
+GC_pthread_create, GC_pthread_start_inner, GC_thread_exit_proc,
+GC_mark_thread_local_free_lists): Use GC_log_printf instead of
+GC_printf for DEBUG_THREADS output.
+* win32_threads.c (GC_win32_start_inner, GC_CreateThread,
+GC_beginthreadex, GC_pthread_join, GC_pthread_create,
+GC_pthread_start_inner, GC_thread_exit_proc): Cast
+GetCurrentThreadId result to long; don't cast value of pthread_t
+type to int; adjust printf format specifiers.
+* doc/README.win32 (DEBUG_WIN32_PTHREADS): Remove obsolete
+information.
+
+* tests/test.c (cons, small_cons, gcj_cons, check_ints,
+check_uncollectable_ints, print_int_list, check_marks_int_list,
+fork_a_thread, finalizer, mktree, chktree, alloc8bytes,
+alloc_small, tree_test, typed_test, check_heap_stats, WinMain,
+test, main): Remove unnecessary casts of GC_printf calls to void.
+
+* allchblk.c (GC_print_hblkfreelist): Adjust (make uniform across
+BDWGC) printed message (adjust letters case, terminating dot and
+new line symbols).
+* alloc.c (GC_check_fl_marks): Likewise.
+* backgraph.c (new_back_edges): Likewise.
+* checksums.c (GC_check_dirty): Likewise.
+* darwin_stop_world.c (GC_push_all_stacks,
+GC_suspend_thread_list): Likewise.
+* dbg_mlc.c (GC_print_type, GC_debug_free, GC_debug_realloc,
+store_old): Likewise.
+* dyn_load.c (GC_register_dynamic_libraries): Likewise.
+* mark.c (GC_initiate_gc, GC_mark_some, GC_mark_from, GC_push_all,
+GC_push_selected, GC_push_next_marked_dirty): Likewise.
+* mark_rts.c (GC_exclude_static_roots_inner): Likewise.
+* os_dep.c (GC_remap, GC_default_push_other_roots,
+GC_push_thread_structures, GC_dirty_init, GC_read_dirty,
+catch_exception_raise_state, catch_exception_raise_state_identity,
+GC_mprotect_thread_notify, GC_mprotect_thread,
+catch_exception_raise): Likewise.
+* pthread_stop_world.c (GC_print_sig_mask, GC_push_all_stacks,
+GC_stop_world, GC_stop_init): Likewise.
+* pthread_support.c (GC_thr_init, GC_register_my_thread_inner,
+GC_start_routine): Likewise.
+* win32_threads.c (GC_register_my_thread_inner,
+GC_push_all_stacks, GC_win32_start_inner, GC_pthread_join,
+GC_pthread_start_inner): Likewise.
+* alloc.c (GC_expand_hp_inner): Realign the code.
+* mark.c (GC_mark_from, GC_mark_local, GC_do_parallel_mark):
+Likewise.
+* misc.c (GC_init): Likewise.
+* os_dep.c (GC_dirty_init, GC_read_dirty): Likewise.
+* include/private/gc_pmark.h (PUSH_CONTENTS_HDR): Likewise.
+* tests/test.c (run_one_test): Likewise.
+* misc.c (GC_err_puts): Document.
+* misc.c (GC_err_write): Remove.
+* os_dep.c (dump_maps): Likewise.
+* include/private/gc_priv.h (GC_err_write): Likewise.
+* os_dep.c (GC_print_address_map): Call GC_err_puts() instead of
+dump_maps() and GC_err_write().
+* os_dep.c (GC_read_dirty): Remove redundant brackets.
+
+* tests/test.c (reverse_test_inner): Test interior pointer
+recognition only if ALL_INTERIOR_POINTERS.
+* tests/test.c (run_one_test): Replace GC_all_interior_pointers
+with GC_get_all_interior_pointers(); simplify the expression.
+* tests/test.c (check_heap_stats): Replace GC_bytes_allocd and
+GC_bytes_allocd_before_gc with GC_get_total_bytes().
+* tests/test.c (main): Replace GC_gc_no with GC_get_gc_no().
+
+* dbg_mlc.c (GC_debug_strdup, GC_debug_free): Output a portability
+warning if the argument is NULL and GC is in leaks detection mode.
+* dbg_mlc.c (GC_debug_strndup, GC_debug_wcsdup): New public
+function definition.
+* malloc.c (GC_strndup, GC_wcsdup, strndup): Likewise.
+* mallocx.c (GC_posix_memalign): Likewise.
+* malloc.c (strdup): Fix string size value; rename "len" to "lb".
+* mallocx.c: Include errno.h unless WinCE (otherwise include
+windows.h for Win32 error constants).
+* win32_threads.c: Define WIN32_LEAN_AND_MEAN and NOSERVICE before
+windows.h inclusion.
+* misc.c (GC_init): Register at-exit callback if GC_find_leak
+(even if GC_FIND_LEAK macro is unset).
+* pthread_stop_world.c (NACL_STORE_REGS,
+__nacl_suspend_thread_if_needed, GC_nacl_initialize_gc_thread):
+Use BCOPY() instead of memcpy().
+* pthread_support.c (GC_init_real_syms): Likewise.
+* doc/README.macros (GC_DEBUG_REPLACEMENT, GC_REQUIRE_WCSDUP):
+Document new macro.
+* doc/README.macros (REDIRECT_MALLOC): Update documentation.
+* include/gc.h (GC_strndup, GC_posix_memalign, GC_debug_strndup):
+New API function prototype.
+* include/gc.h (GC_MALLOC, GC_REALLOC): Redirect to
+GC_debug_malloc/realloc_replacement() if GC_DEBUG_REPLACEMENT.
+* include/gc.h (GC_STRDUP): Remove redundant parentheses.
+* include/leak_detector.h (realloc, strdup): Likewise.
+* include/gc.h (GC_STRNDUP): New API macro.
+* include/gc.h (GC_NEW, GC_NEW_ATOMIC, GC_NEW_STUBBORN,
+GC_NEW_UNCOLLECTABLE): Add missing parentheses.
+* include/gc.h (GC_wcsdup, GC_debug_wcsdup): New API function
+prototype (only if GC_REQUIRE_WCSDUP).
+* include/gc.h (GC_WCSDUP): New API macro (only if
+GC_REQUIRE_WCSDUP).
+* include/leak_detector.h: Include stdlib.h and string.h after gc.h (unless
+GC_DONT_INCLUDE_STDLIB).
+* include/leak_detector.h (malloc, calloc, free, realloc):
+Undefine symbol before its redefinition.
+* include/leak_detector.h (strndup, memalign, posix_memalign):
+Redefine to the corresponding GC function.
+* include/leak_detector.h (wcsdup): Redefine to GC_WCSDUP (only
+if GC_REQUIRE_WCSDUP).
+* include/leak_detector.h (CHECK_LEAKS): Add comment; don't define
+the macro if already defined.
+
+* misc.c (GC_abort): Use _exit() (instead of DebugBreak) on Win32
+when doing code static analysis (to inform the tool that the
+function is a no-return one).
+* os_dep.c (GC_linux_stack_base): Remove a duplicate validation
+of the length of "stat" file; use signed int type for "i",
+"buf_offset" and "len" local variables (since read() may
+return -1).
+
+* blacklst.c (GC_bl_init_no_interiors): New function (the code
+moved from GC_bl_init).
+* blacklst.c (GC_bl_init): Invoke GC_bl_init_no_interiors unless
+GC_all_interior_pointers mode; remove unnecessarily parameter cast
+for GC_scratch_alloc call.
+* include/private/gc_priv.h (GC_bl_init): Move the function
+declaration to misc.c file.
+* misc.c (GC_bl_init_no_interiors): Add a prototype.
+* misc.c (GC_set_all_interior_pointers): Allow values other than 0
+and 1; allow altering GC_set_all_interior_pointers value even
+after GC initialization.
+* obj_map.c (GC_initialize_offsets): Clear GC_valid_offsets and
+GC_modws_valid_offsets if GC_all_interior_pointers is off.
+* misc.c (GC_init): Don't call GC_initialize_offsets() unless
+GC_all_interior_pointers mode.
+
+* alloc.c (GC_finish_collection): Remove redundant brackets;
+adjust code indentation.
+* blacklst.c (GC_add_to_black_list_normal): Simplify expression
+(to improve code readability).
+* blacklst.c (GC_is_black_listed): Join nested "if" (into a single
+conditional expression); initialize "nblocks" just before the loop
+beginning.
+* misc.c (GC_init): Don't compute initial_heap_sz if GC is already
+initialized.
+* include/private/gc_priv.h (GC_initialize_offsets): Move the
+function declaration to misc.c file.
+* obj_map.c (GC_initialize_offsets): Remove offsets_initialized
+static variable since the function is called only once.
+* tests/middle.c (main): Use setter for GC_all_interior_pointers;
+adjust printf format specifier (and cast the value passed to).
+
+* doc/README.macros (SMALL_CONFIG, LARGE_CONFIG): Refine the
+documentation.
+* include/private/gc_hdrs.h (LOG_BOTTOM_SZ): Ignore SMALL_CONFIG
+if LARGE_CONFIG is defined.
+* include/private/gc_priv.h (CPP_LOG_HBLKSIZE): Likewise.
+
+* alloc.c (GC_finish_collection): Replace "#else #ifdef" with
+"#elif".
+* include/private/gc_priv.h (CPP_LOG_HBLKSIZE, LOG_PHT_ENTRIES,
+MAX_ROOT_SETS, MAX_HEAP_SECTS): Likewise.
+* alloc.c (GC_expand_hp_inner): Check for GC_collect_at_heapsize
+overflow even if not LARGE_CONFIG.
+* dbg_mlc.c (GC_check_heap_proc): Check "oh" size even if
+SMALL_CONFIG.
+* finalize.c (GC_print_finalization_stats): Fix "#endif" comment.
+* doc/README.environment (GC_LOG_FILE, GC_PRINT_VERBOSE_STATS,
+GC_FULL_FREQUENCY): Refine the documentation.
+
+* extra/msvc_dbg.c: Test _MSC_VER macro; include "gc.h" (for
+GC_word).
+* extra/msvc_dbg.c (ULONG_PTR): Replace with GC_ULONG_PTR; define
+as word.
+
+* dbg_mlc.c (GC_get_back_ptr_info, GC_print_obj,
+GC_print_smashed_obj, GC_debug_free_inner): Add a code for a
+LINT-like tool to instruct it that the function is invoked only
+with valid parameters (otherwise a SEGV is ok); recognize LINT2
+new macro.
+* misc.c (GC_abort): Instruct a LINT-like tool that the function
+never returns in fact.
+* os_dep.c (GC_linux_stack_base): Check for read buffer overflow;
+close the file immediately after read; use STRTOULL() instead of
+decoding the address number manually.
+* include/private/gc_priv.h (EXPECT): Don't specify outcome for a
+LINT-like tool.
+* include/private/gc_priv.h (GC_all_interior_pointers): Instruct a
+LINT-like tool that the value is restricted to zero and one only
+(required since the variable is global and its value is used as a
+part of array index expression is some places).
+
+* dbg_mlc.c (GC_make_closure): Fix SEGV in case GC_malloc returns
+NULL.
+* dbg_mlc.c (GC_debug_register_finalizer,
+GC_debug_register_finalizer_no_order,
+GC_debug_register_finalizer_unreachable,
+GC_debug_register_finalizer_ignore_self): Handle out of memory
+case properly (similar to GC_register_finalizer_inner).
+* headers.c (GC_install_header): Handle the case when alloc_hdr()
+returns NULL.
+* os_dep.c (GC_get_maps_len): Defend against missing "maps" file.
+* pthread_support.c (GC_mark_thread): Place a dummy return
+statement (which uses "id" argument) before the actual use of "id"
+as an array index (to suppress a warning produced by some static
+code analysis tools).
+* win32_threads.c (GC_mark_thread): Likewise.
+* pthread_support.c (GC_thr_init): Abort (with the appropriate
+message) if out of memory.
+
+* finalize.c (GC_register_finalizer_inner): Fix a typo in a
+comment.
+*include/private/gcconfig.h (STACKBOTTOM): Likewise.
+* gcj_mlc.c (GC_core_gcj_malloc): Replace 0/1 with TRUE/FALSE in
+EXPECT (the 2nd argument).
+* malloc.c (GC_core_malloc_atomic, GC_core_malloc, GC_free):
+Likewise.
+* mark.c (GC_mark_and_push, GC_mark_and_push_stack): Likewise.
+* thread_local_alloc.c (GC_malloc, GC_malloc_atomic): Likewise.
+* include/private/gc_hdrs.h (HC_GET_HDR): Likewise.
+* include/private/gc_priv.h (SMALL_OBJ): Likewise.
+* include/private/specific.h (getspecific): Likewise.
+* pthread_support.c (LOCK_STATS): Add a comment.
+
+* include/gc_pthread_redirects.h (GC_NO_DLOPEN,
+GC_NO_PTHREAD_SIGMASK, GC_PTHREAD_CREATE_CONST,
+GC_PTHREAD_EXIT_ATTRIBUTE, GC_NO_PTHREAD_CANCEL): Move the
+definition to gc_config_macros.
+
+* pthread_support.c (pthread_cancel, GC_pthread_cancel_t,
+GC_pthread_cancel): Test GC_NO_PTHREAD_CANCEL (instead of NACL and
+GC_PTHREAD_EXIT_ATTRIBUTE).
+* include/gc_pthread_redirects.h (GC_pthread_cancel,
+pthread_cancel): Likewise.
+* pthread_support.c (GC_pthread_create, GC_pthread_sigmask,
+GC_pthread_join, GC_pthread_detach, GC_pthread_cancel): Realign
+code.
+* include/gc_pthread_redirects.h (GC_PTHREAD_EXIT_ATTRIBUTE):
+Define as empty for NaCl.
+* include/gc_pthread_redirects.h (GC_NO_PTHREAD_CANCEL): New macro
+defined.
+
+* dyn_load.c (GC_init_dyld): Do not invoke
+_dyld_bind_fully_image_containing_address() if GC_no_dls (as it is
+not required to register the main data segment in that case).
+* include/gc.h (GC_no_dls): Adjust the comment.
+
+* dyn_load.c (GC_MUST_RESTORE_REDEFINED_DLOPEN): Test
+GC_NO_DLOPEN.
+* gc_dlopen.c: Likewise.
+* include/gc_pthread_redirects.h (GC_dlopen, dlopen): Likewise.
+* gc_dlopen.c: Don't include dlfcn.h (as it is included in
+gc_pthread_redirects.h).
+* pthread_support.c (pthread_sigmask, GC_pthread_sigmask_t,
+GC_pthread_sigmask): Test GC_NO_PTHREAD_SIGMASK (instead of
+GC_DARWIN_THREADS, GC_OPENBSD_THREADS and NACL).
+* include/gc_pthread_redirects.h (GC_pthread_sigmask,
+pthread_sigmask): Likewise.
+* win32_threads.c (pthread_sigmask, GC_pthread_sigmask): Test
+GC_NO_PTHREAD_SIGMASK (instead of GC_WIN32_PTHREADS).
+* pthread_support.c (pthread_create, GC_pthread_create_t,
+GC_pthread_create): Rename GC_PTHREAD_CONST to
+GC_PTHREAD_CREATE_CONST.
+* win32_threads.c (GC_pthread_create): Likewise.
+* include/gc_pthread_redirects.h: Likewise.
+* include/gc_pthread_redirects.h (GC_NO_DLOPEN,
+GC_NO_PTHREAD_SIGMASK): New macro defined.
+* include/gc_pthread_redirects.h (GC_PTHREAD_CREATE_CONST): Set to
+empty for NaCl.
+* include/gc_pthread_redirects.h (GC_PTHREAD_EXIT_ATTRIBUTE): Do
+not define for Android (as CANCEL_SAFE is not defined).
+
+* include/gc.h (GC_ADD_CALLER, GC_RETURN_ADDR,
+GC_HAVE_BUILTIN_BACKTRACE, GC_CAN_SAVE_CALL_STACKS): Move
+definition to gc_config_macros.h file.
+* include/gc_config_macros.h: Check the file is included from gc.h
+file.
+* include/gc_version.h: Likewise.
+
+* gc_dlopen.c: Empty unit for NaCl.
+* os_dep.c: Include fcntl.h for NaCl.
+* os_dep.c (GC_get_main_stack_base): Ignore
+USE_GET_STACKBASE_FOR_MAIN macro for NaCl.
+* os_dep.c (GC_get_stack_base): Return GC_UNIMPLEMENTED for NaCl.
+* os_dep.c (GC_remap): Use mmap (instead of mprotect) for NaCl.
+* pthread_start.c (GC_inner_start_routine): Don't invoke
+pthread_cleanup_push/pop for NaCl.
+* pthread_stop_world.c (GC_nacl_num_gc_threads,
+GC_nacl_thread_idx, GC_nacl_park_threads_now,
+GC_nacl_thread_parker, GC_nacl_gc_thread_self,
+GC_nacl_thread_parked, GC_nacl_thread_used,
+GC_nacl_thread_parking_inited, GC_nacl_thread_alloc_lock): New
+variable (fo NaCl only).
+* pthread_stop_world.c (GC_remove_allowed_signals,
+suspend_handler_mask, GC_stop_count, GC_world_is_stopped,
+GC_retry_signals, SIG_THR_RESTART, GC_suspend_ack_sem,
+GC_restart_ack_sem, GC_suspend_handler_inner, GC_suspend_handler,
+GC_restart_handler): Don't define for NaCl.
+* pthread_support.c (GC_get_nprocs): Likewise.
+* include/private/gc_priv.h (SIG_SUSPEND): Likewise.
+* include/private/gcconfig.h (LINUX): Likewise.
+* pthread_stop_world.c (GC_push_all_stacks): Push register storage
+for NaCl.
+* pthread_stop_world.c (GC_suspend_all, GC_stop_world,
+GC_start_world): Implement for NaCl.
+* pthread_stop_world.c (GC_stop_world): Don't define unused "i"
+local variable for OpenBSD (and NaCl).
+* pthread_stop_world.c (NACL_STORE_REGS): New macro definition for
+NaCl.
+* pthread_stop_world.c (nacl_pre_syscall_hook,
+__nacl_suspend_thread_if_needed, nacl_post_syscall_hook,
+GC_nacl_initialize_gc_thread, GC_nacl_shutdown_gc_thread): New
+function (for NaCl only).
+* pthread_stop_world.c (GC_stop_init): Empty for NaCl.
+* pthread_support.c (pthread_cancel, pthread_sigmask): Don't
+redirect for NaCl.
+* include/gc_pthread_redirects.h (pthread_cancel,
+pthread_sigmask): Likewise.
+* pthread_support.c (GC_nacl_initialize_gc_thread,
+GC_nacl_shutdown_gc_thread): New internal prototype (NaCl only).
+* pthread_support.c (GC_new_thread, GC_delete_thread): Initialize
+and shutdown thread for NaCl.
+* pthread_support.c (GC_thr_init): Call sysconf for NaCl.
+* pthread_support.c (GC_pthread_exit): Call GC_thread_exit_proc
+for NaCl.
+* include/gc.h: Don't include features.h for NaCl.
+* include/gc_pthread_redirects.h (GC_PTHREAD_CONST): New macro.
+* include/gc_pthread_redirects.h (GC_pthread_create): Use
+GC_PTHREAD_CONST instead of const.
+* win32_threads.c (GC_pthread_create): Likewise.
+* pthread_support.c (GC_pthread_create_t, GC_pthread_create,
+pthread_create): Likewise.
+* include/private/gcconfig.h (NACL): Recognize NaCl.
+* include/private/gcconfig.h (GC_LINUX_THREADS): Valid for NaCl.
+* include/private/pthread_stop_world.h (thread_stop_info): Add
+reg_storage member; define NACL_GC_REG_STORAGE_SIZE macro (for
+NaCl only).
+* include/private/pthread_support.h (GC_nacl_gc_thread_self):
+Declare internal variable (for NaCl only).
+
+* mach_dep.c (GC_with_callee_saves_pushed): Fix FE_ALL_EXCEPT
+macro.
+
+* mark.c (GC_mark_some): Prefix and suffix "asm" and "volatile"
+keywords with double underscore.
+* os_dep.c (catch_exception_raise, catch_exception_raise_state,
+catch_exception_raise_state_identity): Add GC_API_OSCALL to
+function definition.
+* os_dep.c (catch_exception_raise_state,
+catch_exception_raise_state_identity): Move definition to be
+before GC_ports.
+* os_dep.c (catch_exception_raise): Declare to have the symbol
+defined before GC_ports.
+* os_dep.c (GC_ports): Store references to catch_exception_raise,
+catch_exception_raise_state, catch_exception_raise_state_identity
+(to prevent stripping these symbols as dead).
+* os_dep.c (catch_exception_raise, catch_exception_raise_state,
+catch_exception_raise_state_identity): Mark these symbols as
+"referenced dynamically" via an assembler directive (unless
+NO_DESC_CATCH_EXCEPTION_RAISE).
+* include/private/gc_priv.h (GC_API_OSCALL): New macro (defined
+similar to GC_API but as if GC_DLL is always defined).
+
+* os_dep.c: Don't include signal.h for GC_write_fault_handler on
+Win32.
+* os_dep.c (SIG_OK): Don't return true unless SIGSEGV or SIGBUS on
+FreeBSD.
+* os_dep.c (CODE_OK): Use SEGV_ACCERR on FreeBSD (define
+SEGV_ACCERR for older FreeBSD releases).
+
+* dyn_load.c (GC_register_map_entries,
+GC_register_dynamic_libraries_dl_iterate_phdr): Calculate
+DATASTART only once if DATASTART_IS_FUNC.
+* dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr):
+Calculate DATAEND only once if DATAEND_IS_FUNC.
+* dyn_load.c: Add comment to some endif; realign some code.
+* dyn_load.c (GC_init_dyld): Don't use
+_dyld_bind_fully_image_containing_address if
+NO_DYLD_BIND_FULLY_IMAGE defined; add FIXME.
+* include/private/gcconfig.h (GC_data_start, GC_find_limit):
+Declare if used by DATASTART/DATAEND, respectively.
+* include/private/gcconfig.h (DATASTART_IS_FUNC, DATAEND_IS_FUNC):
+Define if DATASTART/DATAEND is a function, respectively.
+* include/private/gcconfig.h (GETPAGESIZE, NO_PTHREAD_TRYLOCK,
+NO_DYLD_BIND_FULLY_IMAGE): Define for Darwin/arm as well; include
+unistd.h.
+
+* os_dep.c (GC_setpagesize, GC_task_self, PROTECT, UNPROTECT):
+Reorder to remove redundant ifdef for Win32.
+* os_dep.c: Add comment to some endif.
+* os_dep.c: Include pthread.h (for Linux even if single-threaded)
+if USE_GET_STACKBASE_FOR_MAIN; also include it for Darwin.
+* os_dep.c (STACKBOTTOM): Redefine for Darwin (unless prohibited
+for some reason).
+* os_dep.c (GC_get_main_stack_base): Allow
+USE_GET_STACKBASE_FOR_MAIN for Linux even if single-threaded; add
+assertion for the returned result.
+* os_dep.c (GC_get_stack_base): Define for Darwin if
+multi-threaded.
+* os_dep.c (SIG_OK, CODE_OK): Add comment (for FreeBSD).
+* os_dep.c (ID_STOP, ID_RESUME): Define only if threads.
+* os_dep.c (catch_exception_raise): Remove redundant parentheses;
+refine the documentation.
+
+* NT_MAKEFILE: Define _CRT_SECURE_NO_DEPRECATE for C++ files as
+well.
+* NT_STATIC_THREADS_MAKEFILE: Likewise.
+* doc/README.macros (USE_GET_STACKBASE_FOR_MAIN): Refine.
+* include/gc.h (GC_INIT): Document.
+* include/private/gc_priv.h (GC_MACH_HEADER, GC_MACH_SECTION,
+GC_GETSECTBYNAME): Define depending only on the word size (i.e.,
+define these macros also for ARM).
+* tests/test.c (check_heap_stats): Print main thread stack bottom
+as well (only if verbose mode is on).
+
+* mach_dep.c (GC_with_callee_saves_pushed): Fix and improve code
+introduced by the previous patch (if GETCONTEXT_FPU_EXCMASK_BUG
+and X86_64).
+
+* darwin_stop_world.c (GC_FindTopOfStack): Prefix and suffix
+"volatile" keyword with double underscore.
+* mach_dep.c (GETCONTEXT_FPU_EXCMASK_BUG): Recognize new macro and
+include fenv.h if defined (unless NO_GETCONTEXT or HAVE_PUSH_REGS).
+* mach_dep.c (GC_with_callee_saves_pushed): Restore FPU exception
+mask corrupted by getcontext if GETCONTEXT_FPU_EXCMASK_BUG.
+* include/private/gcconfig.h (GETCONTEXT_FPU_EXCMASK_BUG): Define
+for Linux/x64 (since its GLibc getcontext currently has the bug).
+
+* allchblk.c (GC_use_entire_heap): Change type to int (as declared
+in gc.h); set the default value depending on new GC_USE_ENTIRE_HEAP
+macro.
+* misc.c (GC_init): Test GC_USE_ENTIRE_HEAP environment variable to
+alter the default value of GC_use_entire_heap.
+* doc/README.environment (GC_USE_ENTIRE_HEAP): Document.
+* doc/README.macros (GC_USE_ENTIRE_HEAP): Likewise.
+
+* include/private/gcconfig.h (PARALLEL_MARK): Do not make it cause
+MPROTECT_VDB undefining.
+
+* include/private/gcconfig.h (DYNAMIC_LOADING): Fix filename in
+the comment.
+
+* include/private/gc_priv.h (_GC_arrays): Move the conditional
+macro definitions (shortcuts for GC_arrays members) into the
+structure body.
+
+* darwin_stop_world.c (GC_mach_handler_thread,
+GC_use_mach_handler_thread,
+GC_darwin_register_mach_handler_thread): Define only if
+MPROTECT_VDB.
+* darwin_stop_world.c (GC_suspend_thread_list): Use
+GC_mach_handler_thread and GC_use_mach_handler_thread only if
+MPROTECT_VDB.
+* darwin_stop_world.c (GC_stop_world): Reset GC_mach_threads_count
+only if defined (i.e. unless GC_NO_THREADS_DISCOVERY).
+* misc.c (GC_init): Fix comment for GWW_VDB.
+* os_dep.c (DARWIN_EXC_STATE, DARWIN_EXC_STATE_COUNT,
+DARWIN_EXC_STATE_T, DARWIN_EXC_STATE_DAR): New macros.
+* os_dep.c (catch_exception_raise): Use DARWIN_EXC_STATE,
+DARWIN_EXC_STATE_COUNT, DARWIN_EXC_STATE_T, DARWIN_EXC_STATE_DAR.
+* pthread_support.c (GC_thr_init): Define "dummy" local variable
+only unless GC_DARWIN_THREADS.
+* include/private/gcconfig.h (MPROTECT_VDB): Define for Darwin
+even in the single-threaded mode; define for iPhone/iPad.
+* include/private/gcconfig.h (IA64): Remove unnecessary "ifdef"
+around "undef".
+* include/private/gcconfig.h (HEURISTIC1): Remove unused for
+Cygwin.
+* include/private/gcconfig.h (STACKBOTTOM): Use fixed address for
+Darwin/arm (instead of HEURISTIC1).
+
+* misc.c (GC_write): Replace multiple "ifdef/endif" with "elif"
+(for ECOS and NOSYS).
+* os_dep.c (GC_get_main_stack_base): Likewise.
+* os_dep.c (GC_get_main_stack_base): Check
+USE_GET_STACKBASE_FOR_MAIN macro before checking STACKBOTTOM one;
+remove "dummy" variable (use result one instead).
+* doc/README.macros (SN_TARGET_PS3): Document.
+* extra/threadlibs.c (main): Don't output "-lpthread" (and "-ldl")
+for Android.
+* include/private/pthread_support.h: Fix comment for "endif".
+
+* misc.c (GC_allocate_ml): Define global variable if SN_TARGET_PS3.
+* misc.c (GC_init): Initialize GC_allocate_ml if SN_TARGET_PS3.
+* os_dep.c (SIGSEGV): Define to dummy zero if SN_TARGET_PS3.
+* os_dep.c (GC_unix_mmap_get_mem): Don't define if SN_TARGET_PS3.
+* os_dep.c (GC_default_push_other_roots,
+GC_push_thread_structures): Define for SN_TARGET_PS3.
+* include/private/gc_locks.h (GC_allocate_ml, LOCK, UNLOCK): Define
+for SN_TARGET_PS3.
+* include/private/gcconfig.h (SN_TARGET_PS3): Recognize new macro
+(Sony PS/3 target).
+* include/private/gcconfig.h (THREADS): Define unconditionally if
+SN_TARGET_PS3.
+* include/private/gcconfig.h (GET_MEM): Define for SN_TARGET_PS3.
+
+* alloc.c (GC_collect_or_expand): Replace NIL with NULL in message.
+* dbg_mlc.c (GC_debug_malloc, GC_debug_malloc_ignore_off_page,
+GC_debug_malloc_atomic_ignore_off_page,
+GC_debug_generic_malloc_inner,
+GC_generic_malloc_inner_ignore_off_page, GC_debug_malloc_stubborn,
+GC_debug_malloc_atomic, GC_debug_malloc_uncollectable,
+GC_debug_malloc_atomic_uncollectable): Likewise.
+* gcj_mlc.c (GC_debug_gcj_malloc): Likewise.
+* dbg_mlc.c (GC_check_annotated_obj): Replace NIL with NULL in a
+comment.
+* dyn_load.c (GC_FirstDLOpenedLinkMap): Likewise.
+* mark_rts.c (GC_roots_present): Likewise.
+* doc/README: Likewise.
+* include/private/gc_hdrs.h (IS_FORWARDING_ADDR_OR_NIL): Likewise.
+* include/private/gc_priv.h (_GC_arrays): Likewise.
+
+* configure.ac: Use AC_CHECK_LIB() to check for pthread instead of
+just blindly linking to -lpthread, as Android includes pthread
+support within libc and does not provide a separate libpthread.
+* dyn_load.c (GC_register_dynamic_libraries): Skip current link map
+entry if l_addr is NULL (Android/bionic only).
+* pthread_stop_world.c (android_thread_kill): New internal function
+(Android only).
+* pthread_stop_world.c (GC_suspend_all, GC_start_world): Call
+android_thread_kill (based on tkill) instead of pthread_kill on
+Android (since pthread_kill cannot be used safely on the platform).
+* pthread_support.c (GC_new_thread): Store thread Id (obtained from
+gettid) for use by android_thread_kill (Android only).
+* include/private/pthread_support.h (GC_Thread_Rep): Add kernel_id
+structure member (Android only).
+* include/private/gcconfig.h: Recognize __x86_64 macro as a synonym
+of __x86_64__ (Darwin); define __environ macro (Android on M68K).
+
+* allchblk.c (GC_freehblk): Print extended error message (done via
+GC_printf() before aborting with a short message) only if
+GC_print_stats.
+* dyn_load.c (GC_register_dynamic_libraries): Likewise.
+* os_dep.c (GC_get_maps, GC_register_data_segments, GC_remap,
+PROTECT, GC_write_fault_handler, GC_mprotect_thread): Likewise.
+* pthread_stop_world.c (GC_start_world): Likewise.
+* win32_threads.c (GC_register_my_thread_inner): Likewise.
+* os_dep.c (GC_get_main_stack_base, GC_register_data_segments,
+GC_dirty_init): Remove redundant print of an error message before
+aborting with the same message.
+* os_dep.c (GC_register_data_segments): Remove format specifier
+from the string passed to GC_err_puts(); use ABORT instead of EXIT
+(if invalid executable type).
+* os_dep.c (GC_remap): Adjust printf format specifier (for long
+type).
+* os_dep.c (GC_dirty_init): Print a message about SIG_IGN detected
+(for SIGSEGV/BUS) only if GC_print_stats.
+* os_dep.c (catch_exception_raise): Join 2 adjacent GC_err_printf
+calls.
+
+* tests/test.c (main): Print the relevant message if GWW_VDB.
+* include/private/gcconfig.h: Don't define MPROTECT_VDB for Win32
+on x64 if compiled by GCC.
+
+* tests/staticrootstest.c: Include string.h for memset() prototype.
+* tests/thread_leak_test.c (main): Fix printf() format specifiers.
+
+* CMakeLists.txt: Check enable_parallel_mark on Darwin.
+* configure.ac: Likewise.
+* darwin_stop_world.c (DARWIN_SUSPEND_GC_THREADS,
+DARWIN_QUERY_TASK_THREADS): Rename to GC_NO_THREADS_DISCOVERY and
+GC_DISCOVER_TASK_THREADS, respectively.
+* os_dep.c (DARWIN_SUSPEND_GC_THREADS): Likewise.
+* pthread_support.c (DARWIN_SUSPEND_GC_THREADS): Likewise.
+* darwin_stop_world.c (DARWIN_QUERY_TASK_THREADS): Don't define
+(and remove FIXME).
+* darwin_stop_world.c (GC_use_threads_discovery): Add GC_API;
+comment; remove FIXME.
+* win32_threads.c (GC_NO_DLLMAIN): Rename to
+GC_NO_THREADS_DISCOVERY.
+* tests/test.c (GC_NO_DLLMAIN): Likewise.
+* doc/README.macros (GC_NO_DLLMAIN): Likewise.
+* doc/README.win32 (GC_NO_DLLMAIN): Likewise.
+* doc/README.macros (GC_NO_THREADS_DISCOVERY): Update the comment.
+* win32_threads.c (GC_win32_dll_threads): Define as macro to true
+if GC_DISCOVER_TASK_THREADS (and not GC_NO_THREADS_DISCOVERY);
+update the comment.
+* win32_threads.c (GC_use_DllMain): Rename to
+GC_use_threads_discovery; do not set GC_win32_dll_threads if
+GC_DISCOVER_TASK_THREADS.
+* win32_threads.c (GC_started_thread_while_stopped,
+GC_lookup_thread_inner, UNPROTECT_THREAD, GC_lookup_pthread,
+GC_thr_init, GC_pthread_create, DllMain): Rewrite some expressions
+which use GC_win32_dll_threads to minimize the possibility of
+an "unreachable code" compiler warning when GC_win32_dll_threads
+is defined as a macro.
+* win32_threads.c (GC_unregister_my_thread): Don't call
+GC_delete_thread() if GC_win32_dll_threads and THREAD_LOCAL_ALLOC
+(since can't happen); use "t" local variable only if not
+GC_win32_dll_threads.
+* doc/README.macros (GC_DISCOVER_TASK_THREADS): Document.
+* include/gc.h (GC_use_DllMain): Rename to
+GC_use_threads_discovery but keep old name as a macro definition.
+* include/gc.h (GC_use_threads_discovery): Declare also for
+Darwin; update the comment.
+* tests/test.c (main): Call GC_use_threads_discovery for Darwin
+(to test the mode if possible).
+
+* darwin_stop_world.c (DARWIN_SUSPEND_GC_THREADS,
+DARWIN_QUERY_TASK_THREADS): New macro recognized.
+* darwin_stop_world.c (GC_query_task_threads): add STATIC;
+initialize to false; define as macro if DARWIN_SUSPEND_GC_THREADS
+or DARWIN_QUERY_TASK_THREADS; remove FIXME.
+* darwin_stop_world.c (GC_use_threads_discovery): New function
+(for setting GC_query_task_threads value).
+* darwin_stop_world.c (GC_mach_handler_thread,
+GC_use_mach_handler_thread, GC_mach_thread, GC_MAX_MACH_THREADS,
+GC_mach_threads, GC_mach_threads_count, GC_suspend_thread_list,
+GC_darwin_register_mach_handler_thread): Define only if not
+DARWIN_SUSPEND_GC_THREADS.
+* darwin_stop_world.c (GC_stop_world, GC_start_world): Exclude
+the code for GC_query_task_threads case from compilation unless
+DARWIN_SUSPEND_GC_THREADS.
+* os_dep.c (GC_darwin_register_mach_handler_thread): Declared only
+if Darwin threads and not DARWIN_SUSPEND_GC_THREADS.
+* os_dep.c (GC_mprotect_thread): Call
+GC_darwin_register_mach_handler_thread only if THREADS and not
+DARWIN_SUSPEND_GC_THREADS.
+* pthread_support.c (marker_mach_threads): Don't define if
+DARWIN_SUSPEND_GC_THREADS.
+* pthread_support.c (GC_mark_thread): Don't fill in
+marker_mach_threads if DARWIN_SUSPEND_GC_THREADS.
+* include/private/gc_locks.h (GC_need_to_lock): Always declare for
+THREADS case.
+
+* darwin_stop_world.c (GC_query_task_threads): Don't define to
+false for DARWIN_DONT_PARSE_STACK case; unconditionally initialize
+the variable to false (for now).
+* darwin_stop_world.c (GC_push_all_stacks): Call task_threads()
+only if not DARWIN_DONT_PARSE_STACK.
+* darwin_stop_world.c (GC_stop_world, GC_start_world): Use the
+approach based on task_threads() only if GC_query_task_threads
+else use GC_threads table.
+
+* darwin_stop_world.c (GC_mach_threads): Remove static qualifier.
+* darwin_stop_world.c (GC_stop_init): Remove (as we do not need to
+really clear GC_mach_threads[]).
+* darwin_stop_world.c (GC_stop_world): Reset GC_mach_threads_count
+(instead of calling GC_stop_init).
+* include/private/pthread_support.h (GC_stop_init): Remove proto.
+* pthread_support.c (GC_stop_init): Add proto (unless Darwin).
+* pthread_support.c (GC_thr_init): Don't call GC_stop_init() if
+GC_DARWIN_THREADS.
+
+* darwin_stop_world.c (GC_stack_range_for): New static function
+(move the code from GC_push_all_stacks).
+* darwin_stop_world.c (GC_push_all_stacks): Call
+GC_stack_range_for(); rename kern_return local variable to
+kern_result.
+* darwin_stop_world.c (GC_is_mach_marker): Change argument type
+from mach_port_t to thread_act_t.
+* pthread_support.c (GC_is_mach_marker): Likewise.
+
+* darwin_stop_world.c (GC_push_all_stacks): Fix "my_task" local
+variable initialization (always call current_task()).
+* pthread_support.c (GC_thr_init, GC_register_my_thread_inner):
+Don't set thread's stop_info.stack_ptr value for Darwin.
+* include/private/darwin_stop_world.h (thread_stop_info): Update
+the comment for stack_ptr.
+
+* darwin_stop_world.c (GC_push_all_stacks): Rename "r", "me" local
+variables to "kern_return" and "my_thread" ones, respectively;
+call mach_port_deallocate() unconditionally.
+* darwin_stop_world.c (GC_stop_world): Don't call mach_thread_self
+if DEBUG_THREADS.
+
+* darwin_stop_world.c (GC_mach_thread): Move from
+darwin_stop_world.h.
+* include/private/darwin_stop_world.h (GC_mach_thread): Remove.
+* win32_threads.c (GC_start_world): Define "thread_id" local
+variable only if GC_ASSERTIONS; decide whether to resume a thread
+based on its "suspended" field value; assert that suspended thread
+stack_base is non-zero and the thread is not our one.
+
+* darwin_stop_world.c (GC_thread_resume): New inline function
+(move code from GC_thread_resume).
+* darwin_stop_world.c (GC_start_world): Check result of
+task_threads(); call GC_thread_resume().
+* os_dep.c (GC_malloc_heap_l, GC_is_malloc_heap_base): Define
+only if not CYGWIN32.
+* os_dep.c (GC_is_heap_base): Call GC_is_malloc_heap_base() only
+if not CYGWIN32.
+
+* darwin_stop_world.c (FindTopOfStack): Change return type to
+ptr_t (from long); make GC_INNER; add GC_ prefix.
+* darwin_stop_world.c (GC_push_all_stacks): Add thread_blocked
+local variable (initialized from the corresponding GC_thread
+field unless GC_query_task_threads); add assertion that our
+thread is not blocked; prefix FindTopOfStack with GC_ and remove
+no longer needed cast to ptr_t of the result; handle thread
+blocked case (and remove FIXME); use GC_push_all_stack_sections
+unless GC_query_task_threads (and remove FIXME).
+* pthread_support.c (GC_FindTopOfStack): Declare (if needed).
+* pthread_support.c (GC_do_blocking_inner): Call
+GC_save_regs_in_stack (if needed) before acquiring the lock.
+* win32_threads.c (GC_do_blocking_inner): Likewise.
+* pthread_support.c (GC_do_blocking_inner): Set/clear topOfStack
+field of GC_thread (Darwin only).
+* include/private/pthread_support.h (GC_thread): Add topOfStack
+field for Darwin (unless DARWIN_DONT_PARSE_STACK).
+
+* finalize.c (GC_check_finalizer_nested): Change return type to
+char pointer (instead of int pointer); use explicit cast for
+GC_finalizer_nested assignment.
+* pthread_support.c (GC_check_finalizer_nested): Likewise.
+* win32_threads.c (GC_check_finalizer_nested): Likewise.
+* finalize.c (GC_finalizer_nested): Change type to unsigned char.
+* finalize.c (GC_notify_or_invoke_finalizers): Change type of
+"pnested" local variable to char pointer.
+* pthread_support.c (GC_do_blocking_inner,
+GC_call_with_gc_active): Use explicit cast for "thread_blocked"
+field assignment.
+* win32_threads.c (GC_lookup_pthread): Use explicit cast for
+"suspended" field assignment.
+* win32_threads.c (GC_Thread_Rep): Use short type for
+finalizer_skipped; use char type for finalizer_nested and flags
+fields and reorder some fields (to minimize GC_Thread_Rep
+structure size).
+* include/private/pthread_support.h (GC_Thread_Rep): Likewise.
+* win32_threads.c (GC_Thread_Rep): Use char type for suspended
+field (instead of GC_bool).
+* include/private/pthread_support.h (GC_Thread_Rep): Use char type
+for thread_blocked field (instead of short).
+
+* darwin_stop_world.c (GC_query_task_threads): New variable (or
+macro).
+* darwin_stop_world.c (GC_push_all_stacks): Use
+GC_query_task_threads (to choose between algorithms based on
+kernel task_threads and based on GC_threads table); update FIXME;
+remove commented out GC_push_one statements.
+* pthread_support.c (GC_thr_init, GC_do_blocking_inner,
+GC_call_with_gc_active, GC_register_my_thread_inner): Initialize
+stack_ptr field for all platforms.
+* pthread_support.c (GC_call_with_gc_active): Initialize
+saved_stack_ptr field for all platforms.
+* include/private/darwin_stop_world.h (thread_stop_info): Add
+stack_ptr field; change type of already_suspended from int to
+GC_bool.
+
+* darwin_stop_world.c (GC_MAX_MACH_THREADS): New macro.
+* darwin_stop_world.c (GC_mach_threads, GC_stop_init): Use
+GC_MAX_MACH_THREADS instead of THREAD_TABLE_SZ.
+* darwin_stop_world.c (GC_mach_threads): Add FIXME.
+* darwin_stop_world.c (GC_stop_init, GC_suspend_thread_list,
+GC_stop_world): Use FALSE and TRUE for already_suspended field and
+"changed", "found" variables.
+* darwin_stop_world.c (GC_is_mach_marker): New prototype (only if
+PARALLEL_MARK).
+* darwin_stop_world.c (GC_suspend_thread_list): Change return type
+to GC_bool; change type of "changed", "found" to GC_bool; make
+"my_thread" as an argument (instead of acquiring/deallocating it
+locally); do not add my_thread, GC_mach_handler_thread and marker
+threads to GC_mach_threads table; check for overflow of
+GC_mach_threads table; increase GC_mach_threads_count if "found"
+is true and info.suspend_count is non-zero.
+* darwin_stop_world.c (GC_suspend_thread_list, GC_start_world):
+Adjust "thread" format specifiers for GC_printf(); search thread
+in "old_list" starting from the previous found one.
+* darwin_stop_world.c (GC_stop_world): Rename "changes" to
+"changed" local variable; remove "result" variable; adjust
+GC_printf debugging message.
+* darwin_stop_world.c (GC_start_world): Do not check for
+my_thread and GC_use_mach_handler_thread (since they are not added
+to GC_mach_threads table); call thread_info() only if
+DEBUG_THREADS or GC_ASSERTIONS.
+* pthread_support.c (marker_mach_threads): New static variable (if
+Darwin).
+* pthread_support.c (GC_is_mach_marker): New function (if Darwin).
+* pthread_support.c (GC_mark_thread): Fill in marker_mach_threads
+table (if Darwin).
+
+* alloc.c (GC_parallel): Define only if THREADS.
+* misc.c (GC_get_parallel): Likewise.
+* include/gc.h (GC_parallel, GC_get_parallel,
+GC_get_suspend_signal, GC_allow_register_threads,
+GC_register_my_thread, GC_unregister_my_thread): Define only if
+GC_THREADS.
+* include/gc.h (GC_get_heap_size): Fix a typo in a comment.
+
+* configure.ac: Use `AC_C_INLINE'.
+* include/private/gc_priv.h (GC_INLINE): Use "inline" keyword
+(determined by configure AC_C_INLINE) if HAVE_CONFIG_H is defined.
+
+* dyn_load.c (DL_ITERATE_PHDR_STRONG): New macro (define for
+FreeBSD).
+* dyn_load.c (GC_register_main_static_data): Move the definition
+above GC_register_dynamic_libraries_dl_iterate_phdr one (FreeBSD
+case); unconditionally return FALSE if DL_ITERATE_PHDR_STRONG.
+* dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr): Test
+GC_register_main_static_data() result (instead of direct testing
+of dl_iterate_phdr (to prevent a compiler warning).
+* os_dep.c (CODE_OK): Test si_code also for the value of 2
+(FreeBSD case; required for FreeBSD v7+).
+* os_dep.c (CODE_OK): Properly use parentheses (HPUX case).
+* include/private/gcconfig.h (DATASTART): Cast etext argument in
+GC_FreeBSDGetDataStart() call; remove unnecessary "&" (FreeBSD
+case).
+
+* include/private/specific.h (quick_thread_id): Define thru
+GC_approx_sp(); define as a macro.
+* include/private/specific.h (getspecific): Use GC_INLINE instead
+of __inline__ (to work around Sun CC which does not recognize
+inline keyword surrounded with underscores).
+
+* darwin_stop_world.c (FindTopOfStack): Simplify condition
+expressions.
+* darwin_stop_world.c (GC_push_all_stacks): Merge two variants
+of this function (DARWIN_DONT_PARSE_STACK).
+* darwin_stop_world.c (GC_push_all_stacks): Add a check for our
+thread is found (same as in pthread_stop_world.c).
+* darwin_stop_world.c (GC_push_all_stacks): Print the number of
+scanned threads if verbose (same as in pthread_stop_world.c).
+
+* darwin_stop_world.c (GC_push_all_stacks): Reset
+thread_state_count value before every thread_get_state call;
+refine the comment for thread_state_count.
+* darwin_stop_world.c (GC_push_all_stacks): Ignore rsp, rip/eip,
+rflags, cs, fs, gs, ss, ds, es, __pc registers; uncomment ebp
+register pushing.
+* darwin_stop_world.c (GC_push_all_stacks): Set outCount to
+GC_MACH_THREAD_STATE_COUNT (instead of THREAD_STATE_MAX).
+* darwin_stop_world.c (GC_push_all_stacks): Remove FIXME and WARN
+for x86.
+
+* doc/README.macros (DARWIN_DONT_PARSE_STACK): Fix a typo.
+* darwin_stop_world.c (GC_use_mach_handler_thread): Change type
+to GC_bool.
+* darwin_stop_world.c (GC_suspend_thread_list, GC_start_world):
+Simplify the expressions involving GC_use_mach_handler_thread.
+* darwin_stop_world.c (GC_darwin_register_mach_handler_thread):
+Initialize GC_use_mach_handler_thread to TRUE (instead of 1).
+
+* include/gc_pthread_redirects.h (GC_pthread_sigmask, GC_dlopen,
+pthread_sigmask, dlopen): Don't define for pthreads-win32 (and
+don't include signal.h and dlfcn.h).
+
+* dyn_load.c (GC_register_dynlib_callback): Add FIXME.
+
+* include/private/gcconfig.h: Add support for FreeBSD on ppc64.
+
+* os_dep.c (PROTECT, UNPROTECT): Correct VM_PROT_EXEC to
+VM_PROT_EXECUTE.
+
+* os_dep.c (os2_alloc): Don't set PAG_EXECUTE unless
+pages_executable is on.
+* os_dep.c (os2_alloc): Add FIXME (for recursion).
+* os_dep.c (UNPROTECT): Abort with a more informative message if
+pages_executable is on ("mprotect" case).
+* os_dep.c (PROTECT, UNPROTECT): Set VM_PROT_EXEC if
+pages_executable is on (Darwin case).
+* pthread_support.c (GC_init_real_syms): Abort with an informative
+message if libgc is linked after libpthread.
+
+* dyn_load.c (GC_register_dynlib_callback): Adjust "start" pointer
+for 64-bit targets.
+* pthread_support.c (start_mark_threads): Expand PTHREAD_CREATE
+macro.
+* pthread_support.c (start_mark_threads): Call INIT_REAL_SYMS()
+since REAL(pthread_create) is used.
+* pthread_support.c (PTHREAD_CREATE): Remove unused.
+
+* extra/threadlibs.c (main): Remove --wrap for "read" (since not
+wrapped anymore).
+* doc/README.linux (GC_USE_LD_WRAP): Likewise.
+* os_dep.c (__wrap_read): Likewise.
+
+* include/gc_pthread_redirects.h: Test GC_PTHREADS and GC_H at the
+beginning of the file.
+* include/gc_pthread_redirects.h (GC_PTHREAD_EXIT_ATTRIBUTE): New
+macro (defined only for Linux and Solaris).
+* include/gc_pthread_redirects.h (GC_pthread_cancel,
+GC_pthread_exit): Declare new API function (only if
+GC_PTHREAD_EXIT_ATTRIBUTE).
+* include/gc_pthread_redirects.h (pthread_cancel, pthread_exit):
+Redirect (if GC_PTHREAD_EXIT_ATTRIBUTE).
+* include/private/pthread_support.h (DISABLED_GC): New macro.
+* pthread_support.c (pthread_cancel, pthread_exit): Restore
+original definition or declare "real" function (if needed and
+GC_PTHREAD_EXIT_ATTRIBUTE).
+* pthread_support.c (GC_pthread_cancel_t, GC_pthread_exit_t):
+Declare new types if needed.
+* pthread_support.c (GC_pthread_cancel, GC_pthread_exit): New
+function definition (only if GC_PTHREAD_EXIT_ATTRIBUTE).
+* pthread_support.c (GC_init_real_syms): Initialize pointers to
+the "real" pthread_cancel and pthread_exit (only if
+GC_PTHREAD_EXIT_ATTRIBUTE).
+* pthread_support.c (GC_unregister_my_thread): Enable collections
+if DISABLED_GC was set (only if GC_PTHREAD_EXIT_ATTRIBUTE).
+* pthread_support.c (pthread_cancel, pthread_exit): New wrapped
+function definition (only if GC_PTHREAD_EXIT_ATTRIBUTE defined).
+* pthread_support.c (GC_start_routine): Refine the comment.
+* extra/threadlibs.c (main): Adjust --wrap (add "read",
+"pthread_exit", "pthread_cancel" but remove "sleep").
+* doc/README.linux (GC_USE_LD_WRAP): Likewise.
+
+* include/gc.h (GC_MALLOC_STUBBORN): Remove trailing ';' in the
+macro definition.
+* include/gc.h (GC_reachable_here): Likewise.
+* include/gc.h (GC_reachable_here): Prefix and postfix "volatile"
+with double '_'.
+
+* pthread_start.c: New file.
+* CMakeLists.txt (SRC): Add pthread_start.c.
+* Makefile.am (libgc_la_SOURCES): Likewise.
+* Makefile.direct (CSRCS): Likewise.
+* Makefile.direct (OBJS): Add pthread_start.obj.
+* extra/gc.c: Add a comment; include pthread_start.c.
+* pthread_support.c (start_info): Move the struct definition down
+closer to its usage.
+* pthread_support.c (GC_thread_exit_proc): Replace STATIC with
+GC_INNER.
+* pthread_support.c (GC_inner_start_routine): Move to the
+definition to pthread_start.c; leave only the prototype; remove
+STATIC.
+* pthread_support.c (GC_start_rtn_prepare_thread): New function
+(contains parts of the original GC_inner_start_routine).
+
+* configure.ac (NO_EXECUTE_PERMISSION): Add comment.
+* doc/README.macros (NO_EXECUTE_PERMISSION): Update the
+documentation.
+* include/gc.h (GC_set_pages_executable, GC_get_pages_executable):
+New API function declaration.
+* os_dep.c (OPT_PROT_EXEC): Remove (superseded by
+pages_executable).
+* os_dep.c (pages_executable): New static variable.
+* os_dep.c (IGNORE_PAGES_EXECUTABLE): New macro (used by
+GC_get_pages_executable only).
+* os_dep.c (GC_unix_mmap_get_mem, GC_remap, PROTECT, UNPROTECT):
+Replace OPT_PROT_EXEC with pages_executable.
+* os_dep.c (GC_unix_mmap_get_mem, GC_remap, GC_win32_get_mem,
+GC_wince_get_mem, UNPROTECT): Undefine IGNORE_PAGES_EXECUTABLE.
+* os_dep.c (GC_win32_get_mem, GC_wince_get_mem, GC_remap, PROTECT,
+UNPROTECT): Use PAGE_EXECUTE_... only if pages_executable is on.
+* os_dep.c (GC_set_pages_executable, GC_get_pages_executable): New
+API function definition.
+
+* tests/test.c (check_heap_stats): Increase max_heap_sz by 20% for
+64-bit CPUs (to prevent "Unexpected heap growth" failure on Win64,
+at least).
+
+* tests/test.c (check_heap_stats): Increase max_heap_sz by 25% for
+32-bit CPUs (to prevent "Unexpected heap growth" failure).
+
+* gc_dlopen.c (dlopen): Prototype REAL_DLFUNC if GC_USE_LD_WRAP.
+* pthread_support.c (pthread_create, pthread_join, pthread_detach,
+pthread_sigmask): Likewise.
+* gc_dlopen.c (dlopen): Remove cast (redundant since the prototype
+is added).
+* gc_dlopen.c (GC_dlopen): Fix return type.
+* pthread_support.c (GC_init_real_syms): Don't define
+LIBPTHREAD_NAME, LIBPTHREAD_NAME_LEN, len, namebuf and
+libpthread_name if RTLD_NEXT.
+
+* gc_dlopen.c (disable_gc_for_dlopen): Update the comment.
+* gc_dlopen.c (dlopen): Likewise.
+* include/gc.h (GC_enable_incremental): Refine the comment.
+* include/gc.h (DECLSPEC_NORETURN): Define macro as empty if
+missing (only for Win32).
+* include/gc.h (GC_ExitThread): Use DECLSPEC_NORETURN.
+* win32_threads.c (GC_ExitThread): Likewise.
+* include/gc.h (GC_endthreadex): Add a comment.
+
+* include/cord.h: Fix typos.
+
+* Makefile.am (EXTRA_DIST): Add "CMakeLists.txt" and
+"tests/CMakeLists.txt".
+* doc/doc.am (dist_pkgdata_DATA): Add "doc/README.cmake".
+
+* mach_dep.c (NO_GETCONTEXT): Also define if AVR32.
+* include/private/gcconfig.h (AVR32): New macro (also define the
+supplementary macros for the target).
+* include/private/thread_local_alloc (USE_COMPILER_TLS): Don't
+define for AVR32.
+
+* tests/leak_test.c (main): Explicitly define as returning int
+(to prevent a spurious test failure on some Linux/alpha targets).
+* tests/thread_leak_test.c (main): Likewise.
+* tests/thread_leak_test.c: Initialize GC_find_leak in the main
+thread (before GC_INIT) only.
+* tests/leak_test.c (main): Use GC_set_find_leak() instead of
+accessing GC_find_leak directly.
+* tests/thread_leak_test.c (main): Likewise.
+
+* include/gc.h (GC_find_leak, GC_finalize_on_demand,
+GC_java_finalization, GC_dont_expand, GC_no_dls,
+GC_dont_precollect): Simplify the comment (remove the information
+about data races since the value is boolean).
+
+* os_dep.c (GC_get_stack_base, GC_get_main_stack_base): New
+Solaris-specific implementation (based on thr_stksegment).
+* os_dep.c (stackbase_main_self, stackbase_main_ss_sp): New static
+variable used by the Solaris-specific GC_get_stack_base().
+
+* pthread_support.c (GC_mark_thread_local_free_lists,
+GC_check_tls): Mark (and check) only for live threads (in case of
+GC_destroy_thread_local() is called already but GC_delete_thread()
+is not yet).
+* win32_threads.c (GC_mark_thread_local_free_lists, GC_check_tls):
+Likewise.
+
+* NT_MAKEFILE: Remove the comment about DLL and win32s.
+* NT_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_MAKEFILE: Add ".SUFFIXES" directive (to handle gc_cpp.cc
+properly on VS 2005+).
+* NT_MAKEFILE: Update GC log file name in comments.
+* NT_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_THREADS_MAKEFILE: Likewise.
+* doc/README.win32: Likewise.
+* NT_MAKEFILE: Remove ":full" for "-debug" option (since no
+longer supported by VS).
+* NT_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_MAKEFILE: Commented out copying of gc_cpp.cc to gc_cpp.cpp.
+* NT_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_THREADS_MAKEFILE: Likewise.
+* NT_STATIC_THREADS_MAKEFILE: Add -D PARALLEL_MARK option.
+* NT_STATIC_THREADS_MAKEFILE: Increase stack size for gctest.exe.
+* NT_X64_STATIC_THREADS_MAKEFILE: Remove "-stack" option (use the
+default stack size limit).
+* NT_X64_THREADS_MAKEFILE: Rename "gc64_dll.dll" to "gc64.dll".
+* win32_threads.c (GC_get_next_stack): Always define (since it is
+also used for Cygwin now).
+
+* alloc.c (GC_maybe_gc): Move GC_notify_full_gc() call upper to
+be just before GC_clear_marks() call.
+* include/gc_mark.h (GC_start_callback_proc): Refine the comment.
+
+* Makefile.am (check_LTLIBRARIES): Initialize to empty.
+* tests/tests.am (TESTS, check_PROGRAMS): Add staticrootstest.
+* tests/tests.am (staticrootstest_SOURCES, staticrootstest_LDADD,
+libstaticrootslib_la_SOURCES, libstaticrootslib_la_LIBADD,
+libstaticrootslib_la_LDFLAGS, libstaticrootslib_la_DEPENDENCIES):
+Define.
+* tests/tests.am (check_LTLIBRARIES): Add libstaticrootslib.la.
+
+* tests/staticrootstest.c: New file.
+* tests/staticrootslib.c: Likewise.
+
+* dyn_load.c (GC_get_next_stack, GC_cond_add_roots): Define for
+Cygwin as well as other win32 targets.
+* dyn_load.c (GC_wnt): Define to constant true.
+* dyn_load.c (GC_register_dynamic_libraries): Define for Cygwin as
+well as other win32 targets.
+* mark_rts.c (rt_hash, GC_roots_present, add_roots_to_index):
+Don't define for Cygwin, as on other win32.
+* mark_rts.c (GC_add_roots_inner, GC_clear_roots): Handle on
+Cygwin as for other win32 targets.
+* mark_rts.c (GC_rebuild_root_index): Don't declare on Cygwin, as
+other win32.
+* mark_rts.c (GC_remove_tmp_roots): Do declare on Cygwin as on
+other win32.
+* mark_rts.c (GC_remove_roots, GC_remove_roots_inner): Don't
+declare on Cygwin as on other win32.
+* mark_rts.c (GC_is_tmp_root): Do declare on Cygwin when
+!NO_DEBUGGING, as on other win32 targets.
+* mark_rts.c (GC_cond_register_dynamic_libraries): Handle on
+Cygwin as for other win32 targets.
+* os_dep.c (GC_setpagesize): Handle on Cygwin as on other win32.
+* os_dep.c (GC_get_main_stack_base): Don't declare on Cygwin, as
+other win32.
+* os_dep.c (GC_sysinfo): Declare on Cygwin, as other win32.
+* os_dep.c (GC_win32_get_mem): Declare on Cygwin, as on other
+Win32, but call GC_unix_get_mem instead of GlobalAlloc.
+* os_dep.c (GC_win32_free_heap): Declare on Cygwin (as empty).
+* ptr_chck.c (GC_is_visible): Register dynamic libraries on Cygwin
+as on other win32 platforms.
+* win32_threads.c (GC_get_next_stack): Define on Cygwin as well as
+for dynamic loading targets.
+* include/private/gc_priv.h (GC_INNER): Don't try to use
+visibility on Cygwin which does not support it.
+* include/private/gc_priv.h (struct roots): Don't declare r_next
+member on Cygwin as on other windows hosts.
+* include/private/gc_priv.h (LOG_RT_SIZE, RT_SIZE): Don't define
+likewise.
+* include/private/gc_priv.h (struct _GC_arrays): Do declare
+_heap_bases[] member and don't declare _root_index likewise.
+* include/private/gc_priv.h (GC_heap_bases): Do define likewise.
+* include/private/gc_priv.h (_SYSTEM_INFO): Do forward-declare
+likewise.
+* include/private/gc_priv.h (GC_sysinfo): Do declare extern
+likewise.
+* include/private/gcconfig.h (GC_win32_get_mem, GET_MEM): Do
+prototype on Cygwin as other win32 platforms.
+
+* os_dep.c (GC_get_main_stack_base): Use pthread_getattr_np() and
+pthread_attr_getstack() instead of GC_get_stack_base() (and check
+returned stackaddr for NULL); output a warning on failure.
+
+* alloc.c (GC_start_call_back): Replace the definition type to
+GC_start_callback_proc.
+* alloc.c (GC_set_start_callback, GC_get_start_callback): New
+setter/getter function.
+* alloc.c (GC_try_to_collect_inner): Call GC_notify_full_gc()
+unconditionally (because GC_try_to_collect_inner always does full
+GC).
+* include/gc_mark.h (GC_start_callback_proc): New type.
+* include/gc_mark.h (GC_set_start_callback,
+GC_get_start_callback): New API function declaration.
+
+* doc/README.macros (USE_GET_STACKBASE_FOR_MAIN): Document.
+* os_dep.c (GC_get_main_stack_base): Recognize
+USE_GET_STACKBASE_FOR_MAIN (only if THREADS and LINUX_STACKBOTTOM)
+and use GC_get_stack_base() in this case.
+
+* os_dep.c (GC_get_stack_base): Add LOCK/UNLOCK() (since
+GC_find_limit_with_bound() should be called with the lock held).
+* backgraph.c (FOR_EACH_PRED): Fix a typo.
+
+* alloc.c (GC_set_stop_func, GC_get_stop_func): Add
+DCL_LOCK_STATE.
+* finalize.c (GC_notify_or_invoke_finalizers): Likewise.
+* gc_dlopen.c (disable_gc_for_dlopen): Likewise.
+* gcj_mlc.c (maybe_finalize, GC_debug_gcj_malloc): Likewise.
+* mark.c (GC_print_trace): Likewise.
+* misc.c (GC_set_warn_proc, GC_get_warn_proc, GC_enable,
+GC_disable, GC_new_free_list, GC_new_kind, GC_new_proc,
+GC_set_oom_fn, GC_get_oom_fn, GC_set_finalizer_notifier,
+GC_get_finalizer_notifier): Likewise.
+* os_dep.c (GC_get_stack_base, GC_print_callers): Likewise.
+* pthread_support.c (GC_is_thread_tsd_valid,
+GC_wait_for_gc_completion, GC_init_parallel, GC_do_blocking_inner,
+GC_call_with_gc_active, GC_unregister_my_thread, pthread_join,
+pthread_detach, GC_register_my_thread, GC_inner_start_routine,
+pthread_create): Likewise.
+* reclaim.c (GC_print_all_errors): Likewise.
+* win32_threads.c (GC_is_thread_tsd_valid, GC_register_my_thread,
+GC_unregister_my_thread, GC_do_blocking_inner,
+GC_call_with_gc_active, GC_lookup_pthread, GC_pthread_join,
+GC_pthread_start_inner, GC_thread_exit_proc, GC_pthread_detach,
+GC_init_parallel): Likewise.
+
+* doc/README.darwin: Update.
+
+* CMakeLists.txt: Adjust INCLUDE_DIRECTORIES and SRC (to make it
+usable on Mac OS X).
+* doc/README.cmake: Update.
+
+* CMakeLists.txt: New file (adding CMake support).
+* tests/CMakeLists.txt: Likewise.
+* doc/README.cmake: Likewise.
+
+* configure.ac (darwin): Don't define HAS_PPC_THREAD_STATE...
+macros.
+* include/private/gc_priv.h (THREAD_FLD): Recognize
+__DARWIN_UNIX03 instead of HAS_PPC_THREAD_STATE... macros.
+
+* pthread_support.c: Include <sys/param.h> and <sys/sysctl.h> for
+OpenBSD.
+* pthread_support.c (get_ncpu): Define also for Darwin, NetBSD and
+OpenBSD.
+* pthread_support.c (GC_thr_init): Use get_ncpu() for Darwin,
+NetBSD and OpenBSD.
+
+* mallocx.c (GC_generic_malloc_many, GC_malloc_many): Define even
+if THREADS is undefined.
+* include/gc.h (GC_malloc_many): Update the comment.
+
+* include/gc_cpp.h (GC_PLACEMENT_DELETE): Define for Embarcadero
+(formerly known as Borland) C++ compiler v6.21+.
+* include/gc_cpp.h (GC_NO_OPERATOR_NEW_ARRAY): Define for ancient
+VC++ compilers.
+
+* win32_threads.c (GC_register_my_thread_inner,
+GC_pthread_start_inner): Undo the previous commit changes for
+the thread flags and DETACHED state (since the state is only
+tested in GC_thread_exit_proc).
+
+* include/gc.h (GC_unregister_my_thread): Fix a typo; update the
+comment.
+* pthread_support.c (GC_delete_thread): Allow to delete the main
+thread (don't call GC_INTERNAL_FREE for it); update the comment.
+* win32_threads.c (GC_delete_thread): Likewise.
+* pthread_support.c (GC_unregister_my_thread): Add an assertion
+for FINISHED flag is unset.
+* tests/test.c (check_heap_stats): Test the main thread
+unregistering (only if THREADS).
+* win32_threads.c (GC_register_my_thread_inner): Set flags to
+DETACHED (only if GC_PTHREADS).
+* win32_threads.c (GC_unregister_my_thread): Add FIXME (for
+GC_wait_for_gc_completion).
+* win32_threads.c (GC_pthread_start_inner): Clear flags detached
+state if needed; set pthread_id and flags while holding the lock.
+
+* include/private/gc_priv.h (SIG_SUSPEND): Don't define for
+OpenBSD and Darwin.
+
+* include/gc.h: Recognize _M_X64 (as an alias for _AMD64_).
+
+* test.c (main, WinMain): Consistently don't invoke
+GC_enable_incremental() if MAKE_BACKGRAPH is defined, but
+do invoke it even if parallel marking is enabled.
+
+* tests/test.c (reverse_test): Comment out a check for MSWIN32
+(when determining BIG value) assuming outdated win32s.
+* tests/test.c (reverse_test): Rename to reverse_test_inner;
+change the declaration (to be of GC_fn_type); call itself thru
+GC_call_with_gc_active() if the argument is zero.
+* tests/test.c (reverse_test): New function added calling
+reverse_test_inner thru GC_do_blocking (to test GC_do_blocking and
+GC_call_with_gc_active).
+
+* doc/README.macros (IGNORE_DYNAMIC_LOADING, PLATFORM_ANDROID):
+Document.
+* dyn_load.c: Don't include <elf.h> if PLATFORM_ANDROID.
+* dyn_load.c: Include bionic <linker.h> (instead of <link.h>) if
+PLATFORM_ANDROID.
+* include/private/gcconfig.h (LINUX): Define also if
+PLATFORM_ANDROID (for the windows-based toolkit).
+* include/private/gcconfig.h (SEARCH_FOR_DATA_START): Explicitly
+define for Android/x86 platform.
+* include/private/gcconfig.h (IGNORE_DYNAMIC_LOADING): Recognize
+new macro (undefine DYNAMIC_LOADING in this case).
+* include/private/gcconfig.h (CANCEL_SAFE): Don't define if
+PLATFORM_ANDROID.
+* include/private/gcconfig.h (IF_CANCEL): Fix definition for the
+explicitly defined CANCEL_SAFE.
+
+* allchblk.c (GC_allochblk_nth): Don't call GC_remove_protection()
+if GC_DISABLE_INCREMENTAL.
+* reclaim.c (GC_reclaim_generic): Likewise.
+* checksums.c (GC_page_was_ever_dirty): Add prototype.
+* include/private/gc_locks.h (GC_mark_lock_holder): Don't declare
+unless PARALLEL_MARK.
+* include/private/gc_priv.h (GC_dirty_maintained,
+GC_page_was_dirty, GC_remove_protection, GC_dirty_init): Don't
+declare if GC_DISABLE_INCREMENTAL.
+* include/private/gc_priv.h (GC_print_finalization_stats): Don't
+declare if SMALL_CONFIG.
+* include/private/gcconfig.h (CHECKSUMS): Explicitly undefine if
+GC_DISABLE_INCREMENTAL (since nothing to check).
+* include/private/gcconfig.h (DEFAULT_VDB): Don't define if
+GC_DISABLE_INCREMENTAL.
+* os_dep.c (GC_dirty_maintained): Likewise.
+* mark.c (GC_initiate_gc): Don't call GC_read_dirty() if
+GC_DISABLE_INCREMENTAL.
+* os_dep.c (GC_gww_page_was_ever_dirty, GC_page_was_ever_dirty):
+Uncomment; define only if CHECKSUMS.
+
+* darwin_stop_world.c (GC_push_all_stacks): Fix a bug (call
+GC_push_all_stack() instead of GC_push_all_stack_frames()).
+* include/private/gc_priv.h (GC_push_all_stack_frames,
+GC_push_all_register_frames): Rename to
+GC_push_all_stack_sections and GC_push_all_register_sections,
+respectively.
+* mark_rts.c (GC_push_all_stack_frames,
+GC_push_all_register_frames, GC_push_all_stack_part_eager_frames,
+GC_push_current_stack): Likewise.
+* pthread_stop_world.c (GC_push_all_stacks): Likewise.
+* win32_threads.c (GC_push_stack_for): Likewise.
+* misc.c (GC_call_with_gc_active): Rename "frame" local variable
+to "stacksect".
+* pthread_support.c (GC_call_with_gc_active): Likewise.
+* win32_threads.c (GC_call_with_gc_active): Likewise.
+* pthread_support.c (GC_call_with_gc_active): Update FIXME for
+Darwin.
+* win32_threads.c (GC_Thread_Rep): Update the comment for
+traced_stack_sect.
+
+* darwin_stop_world.c (GC_push_all_stacks): Rename
+activation_frame to traced_stack_sect.
+* include/private/gc_priv.h (GC_push_all_stack_frames,
+GC_push_all_register_frames): Likewise.
+* include/private/pthread_support.h (GC_Thread_Rep): Likewise.
+* mark_rts.c (GC_push_all_register_frames,
+GC_push_all_stack_frames, GC_push_all_stack_part_eager_frames,
+GC_push_current_stack): Likewise.
+* pthread_stop_world.c (GC_push_all_stacks): Likewise.
+* pthread_support.c (GC_call_with_gc_active): Likewise.
+* win32_threads.c (GC_Thread_Rep, GC_call_with_gc_active,
+GC_push_stack_for): Likewise.
+* include/private/gc_priv.h (GC_activation_frame_s): Rename to
+GC_traced_stack_sect_s.
+* include/private/gc_priv.h (GC_activation_frame): Rename to
+GC_traced_stack_sect.
+* misc.c (GC_activation_frame, GC_call_with_gc_active): Likewise.
+* doc/README.macros (UNICODE): Document.
+
+* doc/README.macros (GC_READ_ENV_FILE): Document (new macro).
+* include/private/gc_priv.h (GETENV): Recognize GC_READ_ENV_FILE;
+declare and use GC_envfile_getenv().
+* misc.c (GC_envfile_content, GC_envfile_length): New static
+variable (only if GC_READ_ENV_FILE).
+* misc.c (GC_ENVFILE_MAXLEN): New macro (used in GC_envfile_init).
+* misc.c (GC_envfile_init, GC_envfile_getenv): New function (only
+if GC_READ_ENV_FILE).
+* misc.c (GC_init): Call GC_envfile_init() (before using GETENV)
+if GC_READ_ENV_FILE.
+* misc.c (GC_init): Move GC_setpagesize() and GC_init_win32()
+calls to be just before GC_envfile_init() one (since the latter
+uses GET_MEM).
+* misc.c (GC_abort): use ExitProcess() (instead of DebugBreak) for
+WinCE if NO_DEBUGGING; add a comment for DebugBreak() (for WinCE).
+* mark_rts.c (GC_add_roots_inner): Remove redundant trailing '\n'
+from the ABORT message.
+* misc.c (GC_init): Likewise.
+* os_dep.c (GC_get_main_stack_base, GC_register_data_segments):
+Likewise.
+* pthread_stop_world.c (GC_push_all_stacks): Likewise.
+* pthread_support.c (GC_init_real_syms, start_mark_threads):
+Likewise.
+
+* win32_threads.c (GC_get_next_stack): Don't define for Cygwin
+(since unused for now).
+
+* dyn_load.c (HAVE_REGISTER_MAIN_STATIC_DATA): Don't define unless
+GC_register_main_static_data() is defined.
+* dyn_load.c (GC_register_dynamic_libraries): Define only if used
+(if DYNAMIC_LOADING or PCR or Win32/CE).
+* dyn_load.c (GC_register_main_static_data): Define the default
+one only if DYNAMIC_LOADING.
+* include/private/gc_priv.h (GC_register_dynamic_libraries):
+Declare only if used (to prevent compiler warning).
+
+* mark_rts.c (GC_approx_sp): Add a comment (for GCC).
+
+
+== [7.2alpha4] 2009-12-01 ==
+
+* configure.ac (AC_CONFIG_COMMANDS): Quote srcdir value.
+
+* include/gc.h (GC_get_suspend_signal): New function declaration.
+* misc.c (GC_get_suspend_signal): New API function (only if
+THREADS).
+
+* alloc.c (min_bytes_allocd): Multiply GC_free_space_divisor by
+two if GC_incremental (instead of TRUE_INCREMENTAL).
+
+* sparc_mach_dep.S (GC_push_regs): Remove the reference.
+
+* os_dep.c (SIZE_T, PULONG_PTR): Remove.
+* os_dep.c (ULONG_PTR): Replace with GC_ULONG_PTR (defined as GC
+"word"); add the comment.
+* os_dep.c (GetWriteWatch_type, detect_GetWriteWatch,
+GC_gww_read_dirty): Prefix ULONG_PTR with "GC_".
+
+* win32_threads.c (THREAD_TABLE_SZ): Change back to a power-of-two
+const value (for speed).
+* win32_threads.c (THREAD_TABLE_INDEX): New macro.
+* win32_threads.c (GC_new_thread, GC_lookup_thread_inner,
+GC_delete_gc_thread, GC_delete_thread, GC_lookup_pthread): Use
+THREAD_TABLE_INDEX instead of THREAD_TABLE_SZ.
+* win32_threads.c (PTHREAD_MAP_HASH): Rename to PTHREAD_MAP_INDEX.
+
+* win32_threads.c (THREAD_TABLE_SZ): Make the const value prime.
+
+* backgraph.c: Remove apostrophe char from "#error".
+
+* doc/README.macros (GC_DISABLE_INCREMENTAL): Document.
+* include/private/gcconfig.h (GC_DISABLE_INCREMENTAL): Recognize
+new macro; implicitly define it if SMALL_CONFIG.
+* alloc.c (GC_incremental, GC_timeout_stop_func): Check for
+GC_DISABLE_INCREMENTAL instead of SMALL_CONFIG.
+* include/private/gc_priv.h (GC_incremental, TRUE_INCREMENTAL,
+GC_push_conditional): Likewise.
+* mark.c (GC_push_next_marked_dirty, GC_push_selected,
+GC_push_conditional, GC_block_was_dirty): Likewise.
+* misc.c (GC_enable_incremental): Likewise.
+* misc.c (GC_init): Likewise.
+
+* dyn_load.c (WIN32_LEAN_AND_MEAN): Guard with ifndef.
+* misc.c (WIN32_LEAN_AND_MEAN): Likewise.
+* os_dep.c (WIN32_LEAN_AND_MEAN): Likewise.
+* allchblk.c (GC_allochblk_nth): Fix a minor typo (don't/doesn't)
+in a comment.
+* backgraph.c: Likewise.
+* dyn_load.c (GC_register_dynamic_libraries): Likewise.
+* extra/threadlibs.c (main): Likewise.
+* pthread_support.c (pthread_join): Likewise.
+* tests/test.c (main): Likewise.
+
+* mach_dep.c (GC_push_regs): Remove STATIC (just to catch
+a duplicate symbol definition linker error).
+* misc.c (GC_clear_stack_inner): Likewise.
+* sparc_mach_dep.S (GC_push_regs): Comment out the reference.
+
+* include/private/gc_priv.h (GC_write_disabled): New variable
+declaration (only if GC_ASSERTIONS and Win32 threads).
+* misc.c (GC_write): Add assertion for GC_write_disabled value is
+not on (only if THREADS).
+* win32_threads.c (GC_write_disabled): New variable (only if
+GC_ASSERTIONS and not Cygwin).
+* win32_threads.c (GC_stop_world): Set and clear GC_write_disabled
+(while holding GC_write_cs).
+
+* win32_threads.c (GC_please_stop): If DllMain-based thread
+registration is not compiled in then define GC_please_stop as
+a non-volatile variable for assertion only.
+* win32_threads.c (GC_stop_world): Set and clear only if defined.
+* win32_threads.c (GC_stop_world): Add the comment for GC_printf()
+usage (while holding GC_write_cs).
+* win32_threads.c (GC_delete_gc_thread): Likewise.
+* os_dep.c (GC_remove_protection): Likewise.
+
+* pthread_support.c (GC_inner_start_routine): Join 3 sequential
+GC_printf() calls into a single one (for DEBUG_THREADS).
+
+* include/private/gc_priv.h (GC_total_stacksize): New variable
+declaration (only if THREADS).
+* alloc.c (GC_total_stacksize): New variable (only if THREADS).
+* alloc.c (min_bytes_allocd): Calculate stack_size using
+GC_stackbottom only in the single-threaded case; otherwise use
+GC_total_stacksize; print GC_total_stacksize value if
+DEBUG_THREADS.
+* darwin_stop_world.c (GC_push_all_stacks): Use "%p" printf type
+specifier for lo/hi values (instead of "%lx").
+* darwin_stop_world.c (GC_push_all_stacks): Use
+GC_push_all_stack_frames() instead of GC_push_all_stack().
+* darwin_stop_world.c (GC_push_all_stacks): Recalculate
+GC_total_stacksize value.
+* pthread_stop_world.c (GC_push_all_stacks): Likewise.
+* win32_threads.c (GC_push_all_stacks): Likewise.
+* win32_threads.c (GC_push_stack_for): Pass "me" argument; return
+stack size; don't check for non-zero value of thread->stack_base.
+* win32_threads.c (GC_push_all_stacks): Don't call
+GC_push_stack_for() and don't check for "t->id == me" if
+thread->stack_base is zero.
+
+* dyn_load.c (GC_dump_meminfo): Prefix "%lx" printf type specifier
+with "0x".
+* os_dep.c (PROTECT): Likewise.
+* win32_threads.c (GC_mark_thread_local_free_lists): Cast p->id to
+int (to match printf type specifier).
+
+* tests/test.c (check_heap_stats): Take into account the unmapped
+memory size when checking for "Unexpected heap growth"; remove
+FIXME.
+
+* alloc.c: Revert last change.
+
+* include/private/gcconfig.h (STACKBOTTOM): Add a presence check
+for eCos/NOSYS.
+* misc.c (GC_write): Comment out _Jv_diag_write() call (since no
+longer defined in GCJ).
+
+* os_dep.c (brk): Rename to ecos_gc_brk.
+
+* alloc.c (min_bytes_allocd): Use GC_stackbottom value to compute
+stack_size even if THREADS.
+* doc/README.macros (DEBUG_THREADS): Document.
+* pthread_support.c (DEBUG_THREADS): Remove the commented out
+definition.
+* win32_threads.c (DEBUG_WIN32_THREADS): Remove duplicate
+definition.
+* win32_threads.c: Include errno.h (except for WinCE).
+* win32_threads.c (GC_win32_start_inner): Copy "start" and "param"
+to local variables, and free "arg" parameter before "start"
+invocation.
+* win32_threads.c (GC_beginthreadex): Set errno to EAGAIN on error
+(instead of calling SetLastError(ERROR_NOT_ENOUGH_MEMORY)).
+* win32_threads.c (GC_beginthreadex): Return 0 on error (instead
+of -1).
+
+* darwin_stop_world.c (GC_darwin_register_mach_handler_thread):
+Use GC_INNER for the function definition.
+* include/private/darwin_stop_world.h
+(GC_darwin_register_mach_handler_thread): Remove the prototype.
+* os_dep.c (GC_darwin_register_mach_handler_thread): Use GC_INNER
+for the function prototype.
+* include/private/gc_priv.h (NDEBUG): Explicitly define if
+NO_DEBUGGING and not GC_ASSERTIONS (before the standard headers
+inclusion).
+
+* include/private/gcconfig.h: Move DebugBreak() workaround (for
+x86mingw32ce toolchain) to gc_priv.h (after windows.h inclusion).
+
+* allchblk.c (GC_unmap_old, GC_merge_unmapped, GC_allochblk,
+GC_freehblk): Use GC_INNER for the function definition.
+* alloc.c (GC_never_stop_func, GC_should_collect,
+GC_try_to_collect_inner, GC_collect_a_little_inner,
+GC_set_fl_marks, GC_add_to_our_memory, GC_add_to_heap,
+GC_expand_hp_inner, GC_collect_or_expand, GC_allocobj): Likewise.
+* backgraph.c (GC_build_back_graph, GC_traverse_back_graph):
+Likewise.
+* blacklst.c (GC_default_print_heap_obj_proc, GC_bl_init,
+GC_promote_black_lists, GC_unpromote_black_lists,
+GC_add_to_black_list_normal, GC_add_to_black_list_stack,
+GC_is_black_listed): Likewise.
+* darwin_stop_world.c (GC_push_all_stacks, GC_push_all_stacks,
+GC_stop_init, GC_stop_world, GC_start_world): Likewise.
+* dbg_mlc.c (GC_has_other_debug_info, GC_store_back_pointer,
+GC_marked_for_finalization, GC_generate_random_backtrace_no_gc,
+GC_store_debug_info, GC_start_debugging,
+GC_debug_generic_malloc_inner,
+GC_debug_generic_malloc_inner_ignore_off_page,
+GC_debug_malloc_uncollectable, GC_debug_free_inner): Likewise.
+* dyn_load.c (GC_register_dynamic_libraries,
+GC_register_main_static_data, GC_init_dyld): Likewise.
+* finalize.c (GC_push_finalizer_structures, GC_finalize,
+GC_notify_or_invoke_finalizers, GC_print_finalization_stats):
+Likewise.
+* gcj_mlc.c (GC_core_gcj_malloc): Likewise.
+* headers.c (GC_find_header, GC_header_cache_miss,
+GC_scratch_alloc, GC_init_headers, GC_install_header,
+GC_install_counts, GC_remove_header, GC_remove_counts,
+GC_next_used_block, GC_prev_block): Likewise.
+* mach_dep.c (GC_with_callee_saves_pushed): Likewise.
+* malloc.c (GC_collect_or_expand, GC_alloc_large,
+GC_generic_malloc_inner, GC_generic_malloc_inner_ignore_off_page,
+GC_core_malloc_atomic, GC_core_malloc, GC_free_inner): Likewise.
+* mallocx.c (GC_generic_malloc_ignore_off_page): Likewise.
+* mark.c (GC_collection_in_progress, GC_clear_hdr_marks,
+GC_set_hdr_marks, GC_set_mark_bit, GC_clear_mark_bit,
+GC_clear_marks, GC_initiate_gc, GC_mark_some,
+GC_mark_stack_empty, GC_invalidate_mark_state,
+GC_signal_mark_stack_overflow, GC_mark_from, GC_help_marker,
+GC_mark_init, GC_push_all, GC_push_conditional,
+GC_mark_and_push_stack, GC_push_all_eager, GC_push_all_stack):
+Likewise.
+* mark_rts.c (GC_is_static_root, GC_roots_present, GC_approx_sp,
+GC_exclude_static_roots_inner, GC_push_all_register_frames,
+GC_push_all_stack_frames, GC_cond_register_dynamic_libraries,
+GC_push_roots): Likewise.
+* misc.c (GC_extend_size_map, GC_clear_stack, GC_err_write):
+Likewise.
+* new_hblk.c (GC_build_fl, GC_new_hblk): Likewise.
+* obj_map.c (GC_register_displacement_inner, GC_add_map_entry,
+GC_initialize_offsets): Likewise.
+* os_dep.c (GC_get_maps, GC_parse_map_entry, GC_text_mapping,
+GC_init_linux_data_start, GC_init_netbsd_elf, GC_setpagesize,
+GC_set_and_save_fault_handler, GC_setup_temporary_fault_handler,
+GC_reset_fault_handler, GC_get_register_stack_base, GC_init_win32,
+GC_add_current_malloc_heap, GC_is_heap_base, GC_unmap, GC_remap,
+GC_unmap_gap, GC_push_all_stacks, GC_gww_dirty_init,
+GC_dirty_init, GC_read_dirty, GC_page_was_dirty,
+GC_page_was_ever_dirty, GC_remove_protection,
+GC_write_fault_handler, GC_mprotect_stop, GC_mprotect_resume,
+GC_save_callers, GC_print_callers): Likewise.
+* pthread_stop_world.c (GC_push_all_stacks, GC_stop_world,
+GC_start_world, GC_stop_init): Likewise.
+* pthread_support.c (GC_mark_thread_local_free_lists,
+GC_lookup_thread, GC_reset_finalizer_nested,
+GC_check_finalizer_nested, GC_segment_is_thread_stack,
+GC_greatest_stack_base_below, GC_thr_init, GC_init_parallel,
+GC_do_blocking_inner, GC_lock, GC_acquire_mark_lock,
+GC_release_mark_lock, GC_wait_for_reclaim, GC_notify_all_builder,
+GC_wait_marker, GC_notify_all_marker): Likewise.
+* reclaim.c (GC_print_all_errors, GC_block_empty,
+GC_reclaim_generic, GC_start_reclaim, GC_continue_reclaim,
+GC_reclaim_all): Likewise.
+* thread_local_alloc.c (GC_init_thread_local,
+GC_destroy_thread_local, GC_mark_thread_local_fls_for): Likewise.
+* win32_threads.c (GC_reset_finalizer_nested,
+GC_check_finalizer_nested, GC_do_blocking_inner, GC_stop_world,
+GC_start_world, GC_push_all_stacks, GC_get_next_stack,
+GC_acquire_mark_lock, GC_release_mark_lock, GC_wait_for_reclaim,
+GC_notify_all_builder, GC_wait_marker, GC_notify_all_marker,
+GC_thr_init, GC_init_parallel, GC_lock,
+GC_mark_thread_local_free_lists): Likewise.
+* alloc.c (GC_add_current_malloc_heap, GC_build_back_graph,
+GC_traverse_back_graph): Use GC_INNER for the function prototype.
+* darwin_stop_world.c (GC_mprotect_stop, GC_mprotect_resume):
+Likewise.
+* dbg_mlc.c (GC_default_print_heap_obj_proc): Likewise.
+* dyn_load.c (GC_parse_map_entry, GC_get_maps,
+GC_segment_is_thread_stack, GC_roots_present, GC_is_heap_base,
+GC_get_next_stack): Likewise.
+* finalize.c (GC_reset_finalizer_nested,
+GC_check_finalizer_nested): Likewise.
+* gcj_mlc.c (GC_start_debugging): Likewise.
+* include/private/dbg_mlc.h (GC_save_callers, GC_print_callers,
+GC_has_other_debug_info, GC_store_debug_info): Likewise.
+* include/private/gc_hdrs.h (GC_header_cache_miss): Likewise.
+* include/private/gc_locks.h (GC_lock): Likewise.
+* include/private/gc_pmark.h (GC_signal_mark_stack_overflow,
+GC_mark_from): Likewise.
+* include/private/pthread_support.h (GC_lookup_thread,
+GC_stop_init): Likewise.
+* include/private/thread_local_alloc.h (GC_init_thread_local,
+GC_destroy_thread_local, GC_mark_thread_local_fls_for): Likewise.
+* malloc.c (GC_extend_size_map, GC_text_mapping): Likewise.
+* mark.c (GC_page_was_ever_dirty): Likewise.
+* mark_rts.c (GC_mark_thread_local_free_lists): Likewise.
+* misc.c (GC_register_main_static_data, GC_init_win32,
+GC_setpagesize, GC_init_linux_data_start,
+GC_set_and_save_fault_handler, GC_init_dyld, GC_init_netbsd_elf,
+GC_do_blocking_inner): Likewise.
+* os_dep.c (GC_greatest_stack_base_below): Likewise.
+* win32_threads.c (GC_write_fault_handler, GC_gww_dirty_init):
+Likewise.
+* include/private/gc_priv.h: Likewise.
+* include/private/gc_priv.h (GC_INNER): Update the comment.
+* doc/README.macros (GC_DLL): Update.
+
+* alloc.c (GC_collection_in_progress): Move the prototype to
+gc_priv.h.
+* gc_dlopen.c (GC_collection_in_progress): Likewise.
+* pthread_support.c (GC_collection_in_progress): Likewise.
+* misc.c (GC_init_parallel): Likewise.
+* pthread_support.c (GC_init_parallel): Likewise.
+* win32_threads.c (GC_init_parallel): Likewise.
+* darwin_stop_world.c (GC_thr_init): Likewise.
+* misc.c (GC_thr_init): Likewise.
+* pthread_stop_world.c (GC_thr_init): Likewise.
+* pthread_support.c (GC_thr_init): Likewise.
+* blacklst.c (GC_clear_bl, GC_copy_bl,
+GC_number_stack_black_listed): Make STATIC.
+* dbg_mlc.c (GC_print_obj, GC_make_closure,
+GC_debug_invoke_finalizer): Likewise.
+* malloc.c (GC_alloc_large_and_clear): Likewise.
+* mark.c (GC_push_selected, GC_push_marked1, GC_push_marked2,
+GC_push_marked4, GC_push_marked, GC_push_next_marked,
+GC_push_next_marked_dirty, GC_push_next_marked_uncollectable):
+Likewise.
+* misc.c (GC_clear_stack_inner): Likewise.
+* os_dep.c (GC_repeat_read, GC_default_push_other_roots): Likewise.
+* darwin_stop_world.c (FindTopOfStack): Make static; define only
+if not DARWIN_DONT_PARSE_STACK.
+* dbg_mlc.c (GC_debug_free_inner): Define only if DBG_HDRS_ALL.
+* dyn_load.c (GC_repeat_read): Remove unused prototype.
+* include/private/gc_pmark.h (GC_find_start): Likewise.
+* misc.c (GC_read, GC_register_finalizer_no_order): Likewise.
+* dyn_load.c (GC_segment_is_thread_stack): Add prototype (only if
+THREADS).
+* dyn_load.c (GC_register_main_static_data): Define only if
+DYNAMIC_LOADING.
+* finalize.c (GC_enqueue_all_finalizers): Remove unnecessary tail
+"return" statement.
+* gc_dlopen.c (GC_SOLARIS_THREADS): Don't recognize (since implies
+GC_PTHREADS).
+* include/gc.h: Fix a typo.
+* include/gc_inline.h (GC_ASSERT): Define (if not defined) since
+the header is public.
+* include/gc_inline.h (GC_generic_malloc_many): New public
+function declaration.
+* mallocx.c (GC_generic_malloc_many): Make public.
+* include/private/gc_priv.h (GC_INNER): Use visibility attribute
+(if available).
+* include/private/gc_priv.h (GC_EXTERN): Define using GC_INNER.
+* include/private/gc_priv.h: Include atomic_ops.h if THREADS and
+MPROTECT_VDB.
+* os_dep.c: Don't include atomic_ops.h
+* win32_threads.c: Likewise.
+* include/private/gc_priv.h (GC_push_selected, GC_push_regs,
+GC_push_marked, GC_number_stack_black_listed,
+GC_alloc_large_and_clear, GC_reclaim_or_delete_all,
+GC_generic_malloc_many, GC_make_closure,
+GC_debug_invoke_finalizer, GC_print_obj, GC_page_was_ever_dirty):
+Remove the prototype.
+* mark.c (GC_page_was_ever_dirty): Add prototype (only if
+PROC_VDB).
+* include/private/gc_priv.h (GC_push_next_marked_dirty,
+GC_push_next_marked, GC_push_next_marked_uncollectable): Move
+the prototype to mark.c.
+* include/private/gc_priv.h (GC_is_static_root): Declare only if
+not THREADS.
+* include/private/gc_priv.h (GC_free_inner): Declare only if
+THREADS.
+* include/private/gc_priv.h (GC_debug_free_inner): Declare only if
+THREADS and DBG_HDRS_ALL.
+* include/private/gc_priv.h (GC_markers): Declare GC_markers only
+if PARALLEL_MARK.
+* include/private/gc_priv.h (GC_register_main_static_data): Move
+the prototype to misc.c.
+* mach_dep.c (GC_push_regs): Make STATIC; define only along with
+HAVE_PUSH_REGS definition.
+* mach_dep.c (GC_clear_stack_inner): Replace K&R-style function
+definition with the ANSI C one.
+* mark.c (GC_started_thread_while_stopped): Declared only if not
+GNU C.
+* win32_threads.c (GC_started_thread_while_stopped): Don't define
+if GNU C.
+* mark.c (GC_mark_from): Avoid unbalanced brackets in
+#if-#else-#endif blocks.
+* mark_rts.c (GC_is_static_root): Define only if not THREADS.
+* os_dep.c (GC_get_stack_base): Make public (for OpenBSD).
+* os_dep.c (GC_page_was_ever_dirty): Comment out the function
+except for PROC_VDB.
+* tests/test.c (main): Don't reference GC_print_obj,
+GC_make_closure, GC_debug_invoke_finalizer,
+GC_page_was_ever_dirty, GC_is_fresh (in GC_noop).
+* thread_local_alloc.c: Don't include "gc_inline.h".
+* win32_threads.c (GC_write_fault_handler): Declare only if
+MPROTECT_VDB.
+
+* allchblk.c (DEBUG): Remove macro (since unused).
+* allchblk.c: Include private/gc_priv.h before other includes and
+definitions.
+* alloc.c: Likewise.
+* gc_dlopen.c: Likewise.
+* headers.c: Likewise.
+* mallocx.c: Likewise.
+* mark_rts.c: Likewise.
+* new_hblk.c: Likewise.
+* reclaim.c: Likewise.
+* mark.c: Include private/gc_pmark.h before other includes.
+* misc.c: Likewise.
+* dyn_load.c (_GNU_SOURCE): Move the definition to gc_priv.h.
+* pthread_support.c (_USING_POSIX4A_DRAFT10): Likewise.
+* pthread_support.c (_POSIX4A_DRAFT10_SOURCE): Remove (since
+already defined in gc_config_macros.h).
+* dyn_load.c (GC_init_dyld): Remove parameter cast for
+_dyld_register_func_for_add_image() and
+_dyld_register_func_for_remove_image(); add the comment about
+possible warnings; add FIXME for the deprecated
+_dyld_bind_fully_image_containing_address().
+* include/private/gc_priv.h: Include gc.h before the standard
+headers inclusion.
+* tests/test.c: Likewise.
+* include/private/gcconfig.h (DebugBreak): Update the comment.
+* typd_mlc.c (ED_INITIAL_SIZE): Remove ';'.
+
+* configure.ac (openbsd): Define GC_OPENBSD_THREADS.
+* configure.ac: Add AM_CONDITIONAL(OPENBSD_THREADS).
+* configure.ac: Add sparc-openbsd case.
+* doc/README.macros (GC_NETBSD_THREADS, GC_OPENBSD_THREADS):
+Document.
+* tests/test.c (main): Handle OpenBSD case.
+* include/private/pthread_stop_world.h: Likewise.
+* extra/threadlibs.c (main): Replace K&R-style function definition
+with the ANSI C one.
+* extra/threadlibs.c (main): Handle GC_OPENBSD_THREADS case.
+* dyn_load.c (OPENBSD): Recognize (similar to NETBSD).
+* include/gc_config_macros.h (GC_SOLARIS_THREADS): Recognize;
+define it for OpenBSD.
+* include/gc_pthread_redirects.h (GC_pthread_sigmask,
+pthread_sigmask): Don't declare and redefine for OpenBSD.
+* include/private/gcconfig.h: Handle OpenBSD (on arm, sh, x86,
+x64, powerpc).
+* mach_dep.c (NO_GETCONTEXT): Likewise.
+* include/private/pthread_stop_world.h (thread_stop_info): Don't
+define last_stop_count field if OpenBSD.
+* misc.c (GC_init_dyld): Add declaration (if NetBSD).
+* misc.c (GC_init): Don't call GC_init_netbsd_elf() for OpenBSD.
+* os_dep.c (GC_init_netbsd_elf): Don't define for OpenBSD.
+* os_dep.c (old_segv_act, GC_jmp_buf_openbsd): New static variable
+(only if OpenBSD).
+* os_dep.c (GC_fault_handler_openbsd, GC_find_limit_openbsd,
+GC_skip_hole_openbsd): New static function (only if OpenBSD).
+* os_dep.c (GC_get_stack_base, GC_get_main_stack_base,
+GC_register_data_segments): Define specially for OpenBSD case.
+* os_dep.c (GC_fault_handler_lock): Initialize to
+AO_TS_INITIALIZER (instead of 0).
+* pthread_support.c (GC_allocate_lock): Likewise.
+* pthread_stop_world.c (NSIG, GC_print_sig_mask,
+GC_remove_allowed_signals, suspend_handler_mask, GC_stop_count,
+GC_world_is_stopped, GC_retry_signals, SIG_THR_RESTART,
+GC_suspend_ack_sem, GC_suspend_handler_inner, GC_suspend_handler,
+GC_restart_handler): Don't define and use if OpenBSD.
+* pthread_stop_world.c (GC_suspend_all, GC_stop_world,
+GC_start_world): Handle OpenBSD case.
+* pthread_stop_world.c (GC_stop_init): Define as empty if OpenBSD.
+* pthread_support.c (pthread_sigmask): Don't undefine the macro and
+don't define the wrapper function if OpenBSD.
+* pthread_support.c (GC_thr_init): Handle OpenBSD case.
+
+* dyn_load.c: Move the inclusion of private/gc_priv.h below
+definition of a feature macro (_GNU_SOURCE).
+
+* include/gc.h (REVEAL_POINTER): Remove redundant parentheses.
+* include/gc.h (GC_HIDE_POINTER, GC_REVEAL_POINTER): New macros
+(only if GC_I_HIDE_POINTERS).
+* backgraph.c (GET_OH_BG_PTR): Prefix REVEAL_POINTER() with "GC_".
+* dbg_mlc.c (GC_get_back_ptr_info): Likewise.
+* finalize.c (GC_grow_table, GC_dump_finalization, GC_finalize,
+GC_enqueue_all_finalizers): Likewise.
+* backgraph.c (SET_OH_BG_PTR): Prefix HIDE_POINTER() with "GC_".
+* finalize.c (GC_general_register_disappearing_link,
+GC_unregister_disappearing_link, GC_register_finalizer_inner,
+GC_finalize): Likewise.
+* include/private/dbg_mlc.h (HIDE_BACK_PTR): Likewise.
+* include/private/dbg_mlc.h (GC_I_HIDE_POINTERS): Define instead
+of I_HIDE_POINTERS.
+* include/private/gc_priv.h (GC_I_HIDE_POINTERS): Likewise.
+* include/gc.h (_GC_H): Strip leading underscore.
+* include/gc_backptr.h (_GC_H): Likewise.
+* include/gc_gcj.h (_GC_H): Likewise.
+* include/gc_mark.h (_GC_H): Likewise.
+* include/gc_typed.h (_GC_TYPED_H, _GC_H): Likewise.
+* include/javaxfc.h (_GC_H): Likewise.
+* include/new_gc_alloc.h (__GC_SPECIALIZE): Likewise.
+* include/private/dbg_mlc.h (_GC_H): Likewise.
+* include/private/gc_priv.h (_GC_H): Likewise.
+
+* gc_cpp.cc: Include "gc_cpp.h" instead of <gc_cpp.h>.
+
+* include/private/gc_priv.h (GC_INNER): New macro (for GC-scope
+variable definitions).
+* include/private/gc_priv.h (GC_EXTERN): Update the comment.
+* allchblk.c (GC_unmap_threshold): Define as GC_INNER.
+* alloc.c (GC_incremental, GC_world_stopped, GC_n_heap_sects,
+GC_n_memory, GC_fail_count): Likewise.
+* blacklst.c (GC_black_list_spacing, GC_print_heap_obj): Likewise.
+* gcj_mlc.c (GC_gcj_malloc_initialized, GC_gcjobjfreelist): Likewise.
+* mach_dep.c (GC_save_regs_ret_val): Likewise.
+* mark.c (GC_n_mark_procs, GC_obj_kinds, GC_n_kinds,
+GC_mark_stack, GC_mark_stack_limit, GC_mark_stack_size,
+GC_mark_stack_top, GC_mark_state, GC_mark_stack_too_small,
+GC_mark_no, GC_markers): Likewise.
+* mark_rts.c (GC_root_size, GC_push_typed_structures): Likewise.
+* misc.c (GC_allocate_ml, GC_debugging_started, GC_check_heap,
+GC_print_all_smashed, GC_print_back_height, GC_dump_regularly,
+GC_backtraces, GC_force_unmap_on_gcollect,
+GC_large_alloc_warn_interval, GC_is_initialized, GC_write_cs,
+GC_current_warn_proc, GC_blocked_sp, GC_activation_frame): Likewise.
+* os_dep.c (GC_page_size, GC_dont_query_stack_min,
+GC_no_win32_dlls, GC_wnt, GC_sysinfo, GC_push_other_roots,
+GC_dirty_maintained, GC_fault_handler_lock): Likewise.
+* pthread_support.c (GC_allocate_ml, GC_lock_holder,
+GC_need_to_lock, GC_thr_initialized, GC_threads,
+GC_in_thread_creation, GC_collecting, GC_allocate_lock,
+GC_mark_lock_holder): Likewise.
+* reclaim.c (GC_bytes_found, GC_fl_builder_count, GC_have_errors):
+Likewise.
+* win32_threads.c (GC_allocate_ml, GC_lock_holder,
+GC_need_to_lock, GC_mark_lock_holder, GC_collecting): Likewise.
+* extra/gc.c (GC_INNER, GC_EXTERN): Define as STATIC.
+* mach_dep.c (GC_with_callee_saves_pushed): Remove redundant {}.
+
+* include/private/gc_priv.h (GC_bytes_allocd, GC_objfreelist,
+GC_aobjfreelist): Replace GC_EXTERN to extern for SEPARATE_GLOBALS
+case (since they are not defined inside GC at present).
+* include/private/gc_priv.h (GC_objects_are_marked): Remove the
+declaration (since made static).
+* mark.c (GC_objects_are_marked): Define as STATIC.
+* win32_threads.c (GC_thr_initialized, GC_in_thread_creation):
+Likewise.
+* mark.c (GC_N_KINDS_INITIAL_VALUE): New macro (defined and used
+to initialize GC_n_kinds).
+* win32_threads.c (start_mark_threads): Adjust the comment.
+
+* alloc.c (GC_notify_full_gc): Use GC_INLINE for a tiny static
+function.
+* backgraph.c (pop_in_progress, GC_apply_to_each_object): Likewise.
+* mark_rts.c (add_roots_to_index): Likewise.
+
+* extra/gc.c: New file.
+* Makefile.am (EXTRA_DIST): Add "extra/gc.c".
+
+* misc.c (GC_log): Remove the declaration; move the definition (to
+the place where it is used); make STATIC.
+* misc.c (GC_init): Use GC_err_printf() instead of GC_log_printf()
+to print open log failure.
+* misc.c (GC_write): Don't abort on open log failure if the GC is
+compiled with GC_PRINT_VERBOSE_STATS (useful for WinCE).
+
+* include/private/gcconfig.h (USE_MMAP): Guard with ifndef.
+
+* allchblk.c (GC_fail_count, GC_large_alloc_warn_interval): Move
+the variable declaration to gc_priv.h.
+* alloc.c (GC_bytes_found, GC_unmap_threshold,
+GC_force_unmap_on_gcollect): Likewise.
+* dyn_load.c (GC_no_win32_dlls, GC_wnt): Likewise.
+* finalize.c (GC_fail_count): Likewise.
+* include/private/gc_locks.h (GC_allocate_ml, GC_lock_holder,
+GC_collecting, GC_mark_lock_holder, GC_need_to_lock): Likewise.
+* include/private/gc_pmark.h (GC_n_mark_procs, GC_mark_stack_size,
+GC_mark_stack_limit, GC_mark_stack_top, GC_mark_stack,
+GC_mark_stack_too_small, GC_mark_state): Likewise.
+* include/private/pthread_support.h (GC_threads,
+GC_thr_initialized, GC_in_thread_creation): Likewise.
+* mallocx.c (GC_bytes_found): Likewise.
+* mark_rts.c (GC_save_regs_ret_val, GC_world_stopped): Likewise.
+* misc.c (GC_unmap_threshold): Likewise.
+* os_dep.c (GC_unmap_threshold): Likewise.
+* pthread_support.c (GC_markers): Likewise.
+* thread_local_alloc.c (GC_gcjobjfreelist,
+GC_gcj_malloc_initialized, GC_gcj_kind): Likewise.
+* win32_threads.c (GC_fault_handler_lock, GC_write_cs,
+GC_dont_query_stack_min, GC_markers, GC_wnt): Likewise.
+* include/private/gc_priv.h (GC_EXTERN): New macro (used mostly as
+a tag for now); defined after "gcconfig.h" inclusion.
+* include/private/gc_priv.h: Use GC_EXTERN instead of "extern"
+keyword for most global variables.
+* alloc.c (GC_copyright): Add the comment about the symbol
+visibility.
+* finalize.c (GC_fo_entries): Likewise.
+* include/private/gc_priv.h (GC_print_stats): Likewise.
+* misc.c (GC_quiet): Likewise.
+* mallocx.c (GC_bytes_allocd_tmp): Make the volatile variable
+STATIC.
+* pthread_support.c (GC_threads): Add explicit zero initializer
+(to make the variable definition differ from the declaration).
+
+* backgraph.c (GC_quiet): Remove the declaration (not needed
+anymore since gc_priv.h is always included).
+* checksums.c (GC_quiet): Likewise.
+* gcj_mlc.c (GC_quiet): Likewise.
+* headers.c (GC_hdr_cache_hits, GC_hdr_cache_misses): Add the
+comment.
+* include/private/gc_hdrs.h (GC_hdr_cache_hits,
+GC_hdr_cache_misses): Likewise.
+* mark.c (GC_first_nonempty): Make the volatile variable STATIC.
+* pthread_stop_world.c (GC_stop_count, GC_world_is_stopped):
+Likewise.
+* win32_threads.c (GC_please_stop, GC_max_thread_index,
+GC_mark_mutex_waitcnt): Likewise.
+
+* pthread_support.c (GC_USE_LD_WRAP): Fix a typo (swapped 'L' and
+'D') in the name.
+
+* gc_dlopen.c (GC_MUST_RESTORE_REDEFINED_DLOPEN): Define if dlopen
+redirection is turned off; turn it on later when dlopen real
+symbol is no longer needed (according to the comment and the same
+as in dyn_load.c).
+* gc_dlopen.c (WRAP_FUNC, REAL_FUNC): Rename to WRAP_DLFUNC and
+REAL_DLFUNC, respectively (to have unique names since the
+definitions may differ from that of the similar ones in
+pthread_support.c).
+* mark.c (source): Undefine the macro when no longer needed.
+* os_dep.c (handler): Rename the type to GC_fault_handler_t (to
+have the unique name across the project).
+* os_dep.c (STAT_BUF_SIZE, STAT_READ); Guard with ifndef; add the
+comment.
+* pthread_support.c (STAT_BUF_SIZE, STAT_READ): Likewise.
+* os_dep.c (sbrk): Undo sbrk() redirection (for ECOS) when no
+longer needed.
+
+* pthread_stop_world.c (pthread_sigmask): Undefine before using
+in GC_print_sig_mask() (only if DEBUG_THREADS); add the comment.
+* win32_threads.c (dlopen, _beginthread): Don't undefine (since
+neither redirected nor used here).
+* win32_threads.c (GC_Thread_Rep): Rename "table_management" to
+"tm" for short; remove "tm_" prefix.
+* win32_threads.c (in_use, next): Don't define the macros; use
+tm.in_use and tm.next fields, respectively (to ease debugging).
+* win32_threads.c (HASH): Rename to PTHREAD_MAP_HASH (to have
+unique name across the project).
+
+* include/private/gc_priv.h (I_HIDE_POINTERS): Define before gc.h
+inclusion.
+* include/private/gc_pmark.h (I_HIDE_POINTERS): Define if gc.h is
+not included yet.
+* finalize.c (I_HIDE_POINTERS): Don't define.
+* include/private/dbg_mlc.h (I_HIDE_POINTERS): Likewise.
+* misc.c (I_HIDE_POINTERS): Likewise.
+* include/private/dbg_mlc.h (HIDE_POINTER, REVEAL_POINTER,
+GC_hidden_pointer): Don't define if HIDE_POINTER is undefined.
+* include/private/gc_pmark.h: Remove the comment about gc_priv.h
+inclusion order.
+
+* dyn_load.c: Include gc_priv.h before using configuration
+information (MACOS).
+* dyn_load.c (GC_must_restore_redefined_dlopen): Rename to
+GC_MUST_RESTORE_REDEFINED_DLOPEN.
+
+* backgraph.c (SET_OH_BG_PTR): Place outermost parenthesis
+properly.
+* darwin_stop_world.c: Replace "if DEBUG_THREADS" with
+"ifdef DEBUG_THREADS".
+* pthread_stop_world.c: Likewise.
+* pthread_support.c: Likewise.
+* include/gc_inline.h: Guard with GC_INLINE_H.
+
+* alloc.c (GC_copyright): Define as const.
+* alloc.c (GC_collect_at_heapsize): Replace "static" with "STATIC"
+(since the name starts with "GC_" prefix).
+* dbg_mlc.c (GC_describe_type_fns): Likewise.
+* dyn_load.c (GC_FirstDLOpenedLinkMap,
+GC_register_dynlib_callback, GC_dyld_sections,
+GC_dyld_name_for_hdr, GC_dyld_image_add, GC_dyld_image_remove):
+Likewise.
+* malloc.c (GC_libpthread_start, GC_libpthread_end,
+GC_libld_start, GC_libld_end): Likewise.
+* mark_rts.c (GC_remove_root_at_pos, GC_rebuild_root_index):
+Likewise.
+* os_dep.c (GC_gww_read_dirty, GC_gww_page_was_dirty,
+GC_gww_page_was_ever_dirty, GC_mprotect_thread_notify,
+GC_mprotect_thread_reply, GC_mprotect_thread, GC_darwin_sigbus,
+GC_forward_exception): Likewise.
+* pthread_support.c (GC_syms_initialized): Likewise.
+* typd_mlc.c (GC_push_typed_structures_proc): Likewise.
+* win32_threads.c (GC_win32_dll_threads,
+GC_register_my_thread_inner, GC_lookup_pthread, GC_get_stack_min,
+GC_waitForSingleObjectInfinite): Likewise.
+* darwin_stop_world.c (GC_use_mach_handler_thread,
+GC_use_mach_handler_thread, GC_mach_threads_count): Replace
+"static" with "STATIC" and add zero initializer.
+* os_dep.c (GC_task_self, GC_ports, GC_mprotect_state,
+GC_sigbus_count): Likewise.
+* headers.c (free_hdr): Replace "static" with GC_INLINE.
+* misc.c (GC_tmp): Rename static variable to fwrite_gc_res.
+* os_dep.c (memory): Rename static variable to ecos_gc_memory.
+* os_dep.c (async_set_pht_entry_from_index): Make static (for
+MPROTECT_VDB case).
+* pthread_support.c (GC_real_pthread_create,
+GC_real_pthread_sigmask, GC_real_pthread_join,
+GC_real_pthread_detach, GC_init_real_syms): Use REAL_FUNC() macro
+for static GC_real_XXX symbols.
+* win32_threads.c (GC_may_be_in_stack): Remove "GC_" prefix.
+
+* alloc.c (GC_finish_collection): Replace getenv() with GETENV().
+* dyn_load.c (GC_init_dyld): Likewise.
+* os_dep.c (GC_print_callers): Likewise.
+* dyn_load.c (GC_dyld_name_for_hdr): Cast _dyld_get_image_name()
+result (since it's always of "struct mach_header" type).
+* dyn_load.c (GC_init_dyld): Cast GC_dyld_image_add and
+GC_dyld_image_remove (to always have the first argument of
+"struct mach_header" pointer type).
+
+* configure.ac: Add threads support for OpenBSD case (threads may
+not work correctly for it).
+
+* acinclude.m4: Rename to m4/gc_set_version.m4.
+* m4/libtool.m4: Delete the file.
+* m4/lt~obsolete.m4: Likewise.
+* m4/ltoptions.m4: Likewise.
+* m4/ltsugar.m4: Likewise.
+* m4/ltversion.m4: Likewise.
+
+* include/private/gcconfig.h: Define DebugBreak() as _exit(-1) for
+x86mingw32ce toolchain to workaround the incorrect DebugBreak()
+declaration in winbase.h (the workaround would turn into a no-op
+when DebugBreak() will be defined as a macro in the toolchain).
+
+* include/private/gcconfig.h: Recognize __i386__ if WinCE (for
+x86mingw32ce toolchain).
+* include/private/gcconfig.h (NO_GETENV): Don't define for CeGCC
+toolchain (or if already defined).
+* include/private/gcconfig.h (NO_GETENV_WIN32): New macro (always
+defined for WinCE or if NO_GETENV is defined).
+* misc.c (GC_CreateLogFile): Use NO_GETENV_WIN32 macro instead of
+NO_GETENV one.
+
+* configure.ac: Add AC_CONFIG_MACRO_DIR([m4]).
+* Makefile.am: Add "ACLOCAL_AMFLAGS = -I m4".
+* libtool.m4: Remove.
+* m4/libtool.m4: New file (generated).
+* m4/lt~obsolete.m4: Likewise.
+* m4/ltoptions.m4: Likewise.
+* m4/ltsugar.m4: Likewise.
+* m4/ltversion.m4: Likewise.
+
+* include/gc.h (GC_UNDERSCORE_STDCALL): Recognize new macro;
+prefix GC_CreateThread and GC_ExitThread with '_' if defined.
+* doc/README.macros (GC_UNDERSCORE_STDCALL): Document.
+
+* alloc.c (GC_collect_or_expand): Add "retry" argument; add the
+comments; don't use "default" stop_func on a retry if
+GC_dont_expand.
+* alloc.c (GC_allocobj): Pass "retry" argument to
+GC_collect_or_expand().
+* malloc.c (GC_alloc_large): Likewise.
+* include/private/gc_priv.h (GC_collect_or_expand): Move the
+declaration to malloc.c; add "retry" argument.
+
+* alloc.c (GC_start_call_back): Move the variable definition from
+misc.c.
+* include/private/gc_priv.h (GC_start_call_back): Remove the
+declaration.
+* alloc.c (GC_notify_full_gc): Remove unnecessary cast of 0.
+* alloc.c (GC_try_to_collect_inner): Also call stop_func at the
+beginning of the function.
+* include/gc.h (GC_try_to_collect): Refine the comment about
+stop_func.
+
+* alloc.c (GC_default_stop_func, GC_try_to_collect_general,
+GC_gcollect): Add the comment.
+* alloc.c (GC_try_to_collect_general): Move the assertion on
+stop_func != 0 to GC_try_to_collect().
+* alloc.c (GC_try_to_collect_general): If stop_func == 0 then use
+GC_default_stop_func instead (holding the lock).
+* alloc.c (GC_gcollect): Pass 0 as stop_func instead of
+GC_default_stop_func (to prevent data races).
+
+* Makefile.direct: Move "define arguments" documentation to
+doc/README.macros; add reference to doc/README.macros.
+* Makefile.dj: Change the documentation reference to
+doc/README.macros.
+* README.QUICK: Likewise.
+* configure.ac: Likewise.
+* allchblk.c: Remove unnecessary "-D" from the comment.
+* doc/README.macros: Likewise.
+* README.environment: Likewise.
+* include/gc.h: Likewise.
+* include/gc_inline.h: Likewise.
+* include/private/gcconfig.h: Likewise.
+* README.QUICK: Fix a typo.
+
+* misc.c (GC_CreateLogFile): Use FILE_ATTRIBUTE_NORMAL for
+CreateFile(); don't immediately flush every write if very verbose.
+
+* doc/README.win32: Replace ".exe.log" to ".gc.log".
+* doc/README.win64: Likewise.
+* doc/README.win64: Fix a typo.
+* misc.c (GC_CreateLogFile): Strip executable file extension for
+the log file; use ".gc.log" extension (instead of ".log").
+
+* include/gc_config_macros.h: Avoid the redefinition of
+GC_xxx_THREADS macros.
+
+* alloc.c (GC_try_to_collect_general): Change the type of "result"
+local variable to GC_bool.
+
+* include/gc_config_macros.h: Use old behavior for FreeBSD and
+NetBSD platform detection code (check that other GC_xxx_THREADS
+are undefined); add FIXME.
+
+* include/gc_config_macros.h: Rearrange the platform detection
+code (GC_WIN32_PTHREADS implies GC_WIN32_THREADS; define
+GC_THREADS first if GC_XXX_THREADS already set; define proper
+GC_XXX_THREADS if GC_THREADS; define GC_PTHREADS in a single
+place; define _REENTRANT if posix threads except for Win32).
+
+* alloc.c (GC_try_to_collect_general): New function (move the code
+from GC_try_to_collect, pass force_unmap argument).
+* alloc.c (GC_try_to_collect, GC_gcollect): Call
+GC_try_to_collect_general().
+* alloc.c (GC_gcollect_and_unmap): New public function.
+* include/gc.h (GC_gcollect_and_unmap): New function declaration.
+* tests/test.c (window_proc): Call GC_gcollect_and_unmap() on
+WM_HIBERNATE event (instead of GC_set_force_unmap_on_gcollect()
+and GC_gcollect()).
+
+* include/gc.h (GC_allow_register_threads, GC_register_my_thread,
+GC_unregister_my_thread, GC_malloc_many): Refine the comment.
+* include/gc.h (GC_malloc_many, GC_NEXT): Declare unconditionally
+(that is, don't depend on GC_THREADS macro).
+* include/gc.h: Don't check for __CYGWIN32__ and __CYGWIN__ along
+with a check for GC_PTHREADS (since the former implies the
+latter).
+
+* include/gc.h (GC_SOLARIS_THREADS): Don't check for.
+* include/gc.h (GC_MIN, GC_MAX): Don't define.
+* mallocx.c (GC_malloc_many): Add comment to #endif.
+
+* configure.ac: Drop the subdir-objects Automake option, since
+it's incompatible with picking source files from libatomic_ops.
+
+* allchblk.c (GC_fail_count, GC_large_alloc_warn_interval): Add
+"extern" keyword to a global variable declaration (some compilers
+require it).
+* alloc.c (GC_bytes_found, GC_unmap_threshold,
+GC_force_unmap_on_gcollect): Likewise.
+* dyn_load.c (GC_no_win32_dlls, GC_wnt): Likewise.
+* finalize.c (GC_fail_count): Likewise.
+* include/private/gc_hdrs.h (GC_hdr_cache_hits,
+GC_hdr_cache_misses): Likewise.
+* mallocx.c (GC_bytes_found): Likewise.
+* mark_rts.c (GC_save_regs_ret_val, GC_world_stopped): Likewise.
+* misc.c (GC_unmap_threshold): Likewise.
+* os_dep.c (GC_unmap_threshold, GC_old_allocator): Likewise.
+* pthread_support.c (GC_markers): Likewise.
+* thread_local_alloc.c (GC_gcjobjfreelist,
+GC_gcj_malloc_initialized, GC_gcj_kind): Likewise.
+* win32_threads.c (GC_fault_handler_lock, GC_write_cs,
+GC_dont_query_stack_min, GC_markers, GC_wnt): Likewise.
+
+* tests/huge_test.c: Define GC_IGNORE_WARN (if not defined) to
+suppress misleading GC "Out of Memory!" warning printed on every
+GC_MALLOC(LONG_MAX) call.
+* tests/huge_test.c: Include "gc.h" instead of <gc.h>.
+* tests/huge_test.c (main): Replace K&R-style function definition
+with the ANSI C one.
+
+* dyn_load.c (GC_register_dynamic_libraries): Always use
+lpMaximumApplicationAddress value for WinCE (even for old
+versions).
+* os_dep.c (VER_PLATFORM_WIN32_CE): Define if not in winbase.h.
+* os_dep.c (GC_dont_query_stack_min): New global variable (only if
+WinCE and THREADS).
+* os_dep.c (GC_setpagesize): Adjust lpMaximumApplicationAddress
+for WinCE (prior to version 6) if not _WIN32_WCE_EMULATION; set
+GC_dont_query_stack_min for older WinCE (prior to version 5).
+* win32_threads.c (GC_dont_query_stack_min): Declare.
+* win32_threads.c (GC_get_stack_min): Rename the macro to
+GC_wince_evaluate_stack_min for WinCE; update the comment.
+* win32_threads.c (GC_push_stack_for, GC_get_next_stack): Use
+GC_wince_evaluate_stack_min() instead of GC_get_stack_min() for
+WinCE and don't update thread's last_stack_min value (only if
+GC_dont_query_stack_min).
+* win32_threads.c (GC_push_stack_for): Skip assertion for WinCE if
+GC_dont_query_stack_min (since the evaluated stack_min value may
+be incorrect if the stack is bigger than 64 KiB).
+
+* gc_dlopen.c (GC_dlopen): Add function redirector (only if
+GC_USE_LD_WRAP).
+* include/gc.h: Include "gc_pthread_redirects.h" even if
+GC_USE_LD_WRAP or GC_NO_THREAD_REDIRECTS.
+* include/gc_pthread_redirects.h (GC_PTHREAD_REDIRECTS_H): Don't
+define and check for (since included only from gc.h).
+* include/gc_pthread_redirects.h: Declare "GC_" symbols even if
+GC_USE_LD_WRAP or GC_NO_THREAD_REDIRECTS.
+* include/gc_pthread_redirects.h: Include signal.h only to get
+sigset_t definition.
+
+* Makefile.direct: Document GC_REGISTER_MEM_PRIVATE.
+* mark_rts.c (GC_is_tmp_root): Define also for WinCE unless
+NO_DEBUGGING (that is, replace _WIN32_WCE_EMULATION with MSWINCE).
+* os_dep.c (GC_sysinfo): Remove explicit global variable
+initialization to "{0}" (revert back the previous change) since it
+might produce a warning.
+
+* allchblk.c (GC_large_alloc_warn_interval): Move declaration from
+gc_priv.h.
+* allchblk.c (GC_large_alloc_warn_suppressed): Move definition
+from misc.c; define as STATIC.
+* include/private/gc_priv.h (GC_large_alloc_warn_interval,
+GC_large_alloc_warn_suppressed): Remove declaration.
+* alloc.c (GC_bytes_found): Add "defined in" comment.
+* mallocx.c (GC_bytes_found): Likewise.
+* misc.c (GC_unmap_threshold): Likewise.
+* os_dep.c (GC_old_allocator): Likewise.
+* pthread_support.c (GC_markers): Likewise.
+* thread_local_alloc.c (GC_gcjobjfreelist,
+GC_gcj_malloc_initialized, GC_gcj_kind): Likewise.
+* win32_threads.c (GC_markers): Likewise.
+* alloc.c (GC_start_time): Explicitly initialize to 0 or NULL (to
+be distinctive from a variable declaration).
+* backgraph.c (GC_max_height, GC_deepest_obj): Likewise.
+* blacklst.c (GC_old_normal_bl, GC_incomplete_normal_bl,
+GC_old_stack_bl, GC_incomplete_stack_bl): Likewise.
+* checksums.c (GC_faulted, GC_n_dirty_errors,
+GC_n_faulted_dirty_errors, GC_n_changed_errors, GC_n_clean,
+GC_n_dirty, GC_bytes_in_used_blocks): Likewise.
+* dbg_mlc.c (GC_smashed): Likewise.
+* finalize.c (GC_old_dl_entries): Likewise.
+* gcj_mlc.c (GC_gcj_kind, GC_gcj_debug_kind, GC_gcjobjfreelist,
+GC_gcjdebugobjfreelist): Likewise.
+* mach_dep.c (GC_save_regs_ret_val): Likewise.
+* mark.c (GC_n_rescuing_pages, GC_mark_stack, GC_mark_stack_limit,
+GC_mark_stack_top): Likewise.
+* misc.c (GC_min_sp, GC_high_water, GC_bytes_allocd_at_reset):
+Likewise.
+* os_dep.c (GC_data_start, GC_page_size, GC_sysinfo,
+GC_old_segv_handler, GC_old_bus_handler,
+GC_old_bus_handler_used_si, GC_old_segv_handler_used_si,
+GC_proc_buf, GC_proc_fd, GC_vd_base): Likewise.
+* pthread_stop_world.c (GC_stop_count, GC_stopping_pid): Likewise.
+* reclaim.c (GC_leaked): Likewise.
+* typd_mlc.c (GC_explicit_kind, GC_array_kind, GC_ext_descriptors,
+GC_typed_mark_proc_index, GC_array_mark_proc_index,
+GC_eobjfreelist, GC_arobjfreelist): Likewise.
+* win32_threads.c (GC_pthread_map_cache, GC_marker_cv,
+GC_marker_Id): Likewise.
+* dbg_mlc.c (GC_smashed, GC_n_smashed): Define as STATIC.
+* gcj_mlc.c (GC_gcjdebugobjfreelist): Likewise.
+* os_dep.c (GC_vd_base): Likewise.
+* pthread_support.c (GC_mark_threads): Likewise.
+* reclaim.c (GC_leaked): Likewise.
+* typd_mlc.c (GC_bm_table): Likewise.
+* mark_rts.c (GC_save_regs_ret_val): Change declaration type to
+that of definition; add "defined in" comment.
+* mark_rts.c (GC_push_current_stack): Remove unnecessary cast for
+GC_save_regs_ret_val.
+* misc.c (GC_check_heap, GC_print_all_smashed,
+GC_start_call_back): Remove unnecessary cast (of 0).
+* misc.c (GC_LARGE_ALLOC_WARN_INTERVAL): New tuning macro.
+* misc.c (GC_large_alloc_warn_interval): Initialize to
+GC_LARGE_ALLOC_WARN_INTERVAL value.
+* misc.c (GC_tmp): Change to "static".
+* os_dep.c (GC_mprotect_state): Define as static.
+* pthread_support.c (dummy_thread_local): Prefix with "GC_".
+* win32_threads.c (WinMain): Remove FIXME for WinCE.
+
+* os_dep.c (PROTECT, UNPROTECT): Use distinct ABORT messages.
+
+* configure.ac: Rewrite the tests for external or internal
+libatomic_ops.
+* configure.ac: In particular, drop the symbolic links. Add option
+--with-libatomic-ops for forced selection.
+* Makefile.am: Adjust the path of source files from libatomic_ops
+to not use the links.
+* Makefile.am (libgc_la_LIBADD): Add $(ATOMIC_OPS_LIBS). This will
+be empty if we use the bundled AO sources.
+
+* Makefile.am: Strip version suffix for libatomic_ops directory.
+* build_atomic_ops.sh: Likewise.
+* build_atomic_ops.sh.cygwin: Likewise.
+* configure_atomic_ops.sh: Likewise.
+* Makefile.direct: Remove AO_VERSION definition; strip version
+suffix for libatomic_ops directory.
+* NT_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_THREADS_MAKEFILE: Likewise.
+* gc.mak: Likewise.
+
+* libatomic_ops: Rename from "libatomic_ops-1.2".
+
+* alloc.c (GC_version): Add "const" keyword.
+* alloc.c (GC_get_version): New public function.
+* include/gc.h (GC_get_version): New function declaration; update
+the comment for the GC version.
+
+* include/private/gc_locks.h (GC_allocate_ml, GC_lock_holder,
+GC_collecting, GC_mark_lock_holder, GC_need_to_lock): Use "extern"
+(for the global variable declaration) again.
+* include/private/gc_pmark.h (GC_n_mark_procs, GC_mark_stack_size,
+GC_mark_stack_limit, GC_mark_stack_top, GC_mark_stack,
+GC_mark_stack_too_small, GC_mark_state): Likewise.
+* include/private/gcconfig.h (GC_register_stackbottom): Likewise.
+* include/private/pthread_support.h (GC_threads,
+GC_thr_initialized, GC_in_thread_creation): Likewise.
+* include/private/gc_priv.h: Likewise.
+
+* real_malloc.c: Include private/config.h if HAVE_CONFIG_H.
+
+* allchblk.c (GC_hblkfreelist): Define as STATIC.
+* blacklst.c (GC_total_stack_black_listed): Likewise.
+* include/private/gc_priv.h (GC_hblkfreelist, GC_stopped_mark,
+GC_total_stack_black_listed, GC_push_stubborn_structures): Remove
+declaration.
+* mark_rts.c (GC_stopped_mark): Add declaration (only if
+THREAD_LOCAL_ALLOC).
+* allchblk.c (GC_fail_count): Move the declaration out of
+GC_allochblk_nth(); remove "extern".
+* alloc.c (IF_THREADS): Remove unused macro.
+* alloc.c (GC_world_stopped): Define only if THREAD_LOCAL_ALLOC.
+* alloc.c (GC_stopped_mark): Set GC_world_stopped value only if
+THREAD_LOCAL_ALLOC.
+* alloc.c (GC_bytes_found, GC_collection_in_progress,
+GC_check_tls, GC_unmap_threshold, GC_force_unmap_on_gcollect):
+Remove K&R-style "extern" for the declaration.
+* dbg_mlc.c (GC_free_inner): Likewise.
+* dyn_load.c (GC_repeat_read, GC_roots_present, GC_is_heap_base,
+GC_get_next_stack, GC_no_win32_dlls, GC_wnt): Likewise.
+* finalize.c (GC_fail_count): Likewise.
+* include/private/gc_hdrs.h (GC_hdr_cache_hits,
+GC_hdr_cache_misses): Likewise.
+* include/private/gc_locks.h (GC_allocate_ml, GC_lock_holder,
+GC_lock, GC_collecting, GC_mark_lock_holder, GC_need_to_lock):
+Likewise.
+* include/private/gc_pmark.h (GC_mark_procs, GC_n_mark_procs,
+GC_mark_stack_size, GC_mark_stack_limit, GC_mark_stack_top,
+GC_mark_stack, GC_mark_stack_too_small, GC_mark_state): Likewise.
+* include/private/gc_priv.h (GC_current_warn_proc, GC_obj_kinds,
+GC_n_kinds, GC_fo_entries, GC_n_heap_sects, GC_n_memory,
+GC_page_size, GC_sysinfo, GC_black_list_spacing,
+GC_objects_are_marked, GC_incremental, GC_dirty_maintained,
+GC_root_size, GC_debugging_started, GC_large_alloc_warn_interval,
+GC_large_alloc_warn_suppressed, GC_blocked_sp,
+GC_activation_frame, GC_push_other_roots,
+GC_push_finalizer_structures, GC_push_thread_structures,
+GC_push_typed_structures, GC_start_call_back, GC_is_initialized,
+GC_check_heap, GC_print_all_smashed, GC_print_all_errors,
+GC_print_heap_obj, GC_have_errors, GC_print_stats,
+GC_dump_regularly, GC_backtraces, GC_print_back_height,
+GC_debug_generic_malloc_inner,
+GC_debug_generic_malloc_inner_ignore_off_page,
+GC_fl_builder_count, GC_mark_no, GC_help_marker,
+GC_setup_temporary_fault_handler, GC_reset_fault_handler): Likewise.
+* include/private/gcconfig.h (GC_SysVGetDataStart,
+GC_FreeBSDGetDataStart, GC_register_stackbottom,
+GC_MacTemporaryNewPtr, GC_amiga_get_mem): Likewise.
+* include/private/pthread_support.h (GC_threads,
+GC_thr_initialized, GC_in_thread_creation): Likewise.
+* malloc.c (GC_text_mapping): Likewise.
+* mallocx.c (GC_bytes_found): Likewise.
+* mark.c (GC_check_dirty, GC_started_thread_while_stopped): Likewise.
+* mark_rts.c (GC_save_regs_ret_val): Likewise.
+* misc.c (GC_clear_stack_inner, GC_init_parallel, GC_init_win32,
+GC_setpagesize, GC_init_linux_data_start,
+GC_set_and_save_fault_handler, GC_unmap_threshold): Likewise.
+* os_dep.c (GC_unmap_threshold, GC_push_all_stacks,
+GC_darwin_register_mach_handler_thread): Likewise.
+* pthread_support.c (GC_markers, GC_collection_in_progress):
+Likewise.
+* tests/test.c (GC_amiga_free_all_mem): Likewise.
+* thread_local_alloc.c (GC_gcjobjfreelist,
+GC_gcj_malloc_initialized, GC_gcj_kind): Likewise.
+* win32_threads.c (GC_write_fault_handler, GC_gww_dirty_init,
+GC_fault_handler_lock, GC_write_cs, GC_markers): Likewise.
+* misc.c (GC_read, GC_register_finalizer_no_order, GC_init_dyld):
+Move the declaration out of GC_init(); remove "extern".
+* os_dep.c (GC_abort): Add the comment; add workaround to suppress
+compiler "unreachable code" warnings for ABORT callers (where
+ABORT is followed by a dummy return statement).
+* os_dep.c (GC_old_allocator): Move the declaration out of
+GC_default_push_other_roots(); remove "extern".
+* darwin_stop_world.c (GC_mprotect_stop, GC_mprotect_resume):
+Move the declaration out of GC_stop_world() and GC_start_world()
+(only if MPROTECT_VDB); remove "extern".
+
+* win32_threads.c (GC_get_stack_min, GC_push_stack_for,
+GC_get_next_stack): Recognize _WIN32_WCE_EMULATION macro (used for
+WinCE emulation and for custom WinCE 6 devices); add the comment.
+* win32_threads.c (GC_get_stack_min): Cast pointer to word instead
+of DWORD.
+* win32_threads.c (GC_get_next_stack): Don't use and maintain the
+latest known stack_min value for WinCE (if GC_get_stack_min is
+defined as a macro); update the comments.
+* win32_threads.c (GC_wnt): Don't declare for WinCE.
+
+* Makefile.direct: Document EMPTY_GETENV_RESULTS.
+* gcj_mlc.c (GC_clear_stack): Remove declaration.
+* malloc.c (GC_clear_stack): Likewise.
+* mallocx.c (GC_clear_stack): Likewise.
+* typd_mlc.c (GC_clear_stack): Likewise.
+* gcj_mlc.c (GENERAL_MALLOC, GENERAL_MALLOC_IOP): Rename to
+GENERAL_MALLOC_INNER and GENERAL_MALLOC_INNER_IOP, respectively;
+remove "lb" unnecessary cast to word.
+* include/private/gc_priv.h (GC_clear_stack): Add declaration.
+* include/private/gc_priv.h (GENERAL_MALLOC, GENERAL_MALLOC_IOP):
+Move common declaration from typd_mlc.c and malloc.c; remove
+unnecessary result and "lb" parameter casts.
+* include/private/thread_local_alloc.h: Guard against duplicate
+header file inclusion.
+* os_dep.c (USE_MUNMAP): Replace "-->" with an error directive for
+the case when USE_MMAP is not defined.
+* pthread_support.c (GC_is_thread_tsd_valid): New internal
+function (only if GC_ASSERTIONS and THREAD_LOCAL_ALLOC); move the
+code from thread-local GC_malloc(); add FIXME for the condition.
+* win32_threads.c (GC_is_thread_tsd_valid): Likewise.
+* thread_local_alloc.c (GC_gcjobjfreelist): Change the type (to
+match that of its definition).
+* thread_local_alloc.c (GC_destroy_thread_local): Add a cast for
+GC_gcjobjfreelist.
+* thread_local_alloc.c (GC_lookup_thread, GC_lookup_thread_inner):
+Remove unused declaration; don't include pthread.h.
+* thread_local_alloc.c (GC_is_thread_tsd_valid): New declaration
+(only if GC_ASSERTIONS).
+* thread_local_alloc.c (GC_malloc): Use GC_is_thread_tsd_valid()
+instead of GC_lookup_thread().
+* win32_threads.c (GC_lookup_thread_inner): Define as STATIC.
+* win32_threads.c (UNPROTECT): Rename to UNPROTECT_THREAD (to have
+id different from that in os_dep.c).
+
+* allchblk.c (GC_enough_large_bytes_left): Replace "inline static"
+with GC_INLINE.
+* include/private/gc_priv.h (fixed_getenv): Likewise.
+* alloc.c (GC_max, GC_min): Replace "static INLINE" with
+GC_INLINE.
+* mark_rts.c (rt_hash): Likewise.
+* win32_threads.c (GC_get_max_thread_index): Likewise.
+* include/private/gc_priv.h (INLINE): Prefix with "GC_"; include
+"static"; define for Sun CC; define for VC++ (and other
+compilers).
+* pthread_support.c: Don't define __inline__ for non-GNU compilers
+(not needed anymore).
+
+* NT_THREADS_MAKEFILE: Remove file (since it duplicates gc.mak).
+* Makefile.in: Remove reference to NT_THREADS_MAKEFILE.
+* Makefile.am: Likewise.
+* Makefile.dj: Likewise.
+* Makefile.direct: Likewise.
+* doc/README.win32: Add reference to gc.mak.
+* NT_X64_THREADS_MAKEFILE: Likewise.
+
+* Makefile.direct: Remove references to acinclude.m4, libtool.m4.
+
+* autogen.sh: Update.
+
+* Makefile.am: Don't add libtool.m4 to EXTRA_DIST.
+* acinclude.m4: Fix underquoting of GC_SET_VERSION.
+* README.QUICK: Update information for Makefile.
+* Makefile.am: Do not distribute the substituted bdw-gc.pc.
+* configure.ac: Add AM conditional analog to KEEP_BACK_PTRS.
+* tests/tests.am: Use it here to conditionally enable tracetest
+when possible.
+
+* dyn_load.c (GC_wnt): Update the comment.
+* dyn_load.c (GC_register_dynamic_libraries): Add the comment for
+_WIN32_WCE_EMULATION; recognize GC_REGISTER_MEM_PRIVATE (new
+macro); call GC_is_heap_base() only if check for Type succeeded.
+
+* mark_rts.c (GC_is_tmp_root): Don't define unless NO_DEBUGGING;
+update the comment.
+* include/private/gc_priv.h (GC_is_tmp_root): Remove declaration.
+
+* include/private/gcconfig.h (CANCEL_SAFE, IF_CANCEL): new macros.
+* include/private/gc_priv.h (DISABLE_CANCEL, RESTORE_CANCEL,
+ASSERT_CANCEL_DISABLED): New macros.
+* alloc.c (GC_maybe_gc): Assert cancellation disabled.
+(GC_collect_a_little_inner,GC_try_to_collect, GC_collect_or_expand):
+Disable cancellation.
+(GC_add_to_our_memory): Check for overflow.
+* misc.c (GC_cancel_disable_count): declare.
+(GC_init, GC_write): Disable cancellation.
+(GC_init): Remove redundant GC_is_initialized test.
+* os_dep.c (GC_repeat_read): Assert cancellation disabled.
+(GC_get_stack_base): Disable cancellation.
+* pthread_stop_world.c (GC_suspend_handler_inner): Disable
+cancellation.
+* pthread_support.c (GC_mark_thread): Permanently disable
+cancellation.
+(GC_wait_for_gc_completion, GC_wait_builder, GC_wait_marker):
+Assert cancellation disabled.
+(fork handling): Disable cancellation, fix comment.
+(GC_pthread_create): Disable cancellation.
+(GC_unregister_my_thread): Disable cancellation.
+* Makefile.direct: Document NO_CANCEL_SAFE.
+
+* Makefile: Remove outdated file (Makefile.direct should be used
+instead).
+
+* include/gc.h (GC_use_DllMain): Refine the comment.
+
+* configure.ac: Add documentation to AC_DEFINE for GC_THREADS and
+EMPTY_GETENV_RESULTS.
+* configure.ac: Fix a typo.
+* Makefile.am: Likewise.
+
+* checksums.c (GC_checksum, GC_update_check_page): Remove
+"register" keyword in local variable declarations (for the code
+used only for debugging or which is not time-critical).
+* dbg_mlc.c (GC_has_other_debug_info, GC_store_debug_info,
+GC_store_debug_info_inner, GC_check_annotated_obj, GC_print_obj,
+GC_print_smashed_obj, GC_debug_end_stubborn_change,
+GC_debug_invoke_finalizer): Likewise.
+* dyn_load.c (GC_register_dynamic_libraries): Likewise.
+* mallocx.c (GC_realloc): Likewise.
+* mark_rts.c (GC_print_static_roots, GC_is_static_root,
+GC_clear_roots): Likewise.
+* misc.c (GC_write): Likewise.
+* os_dep.c (GC_print_callers): Likewise.
+* dyn_load.c (GC_register_dynamic_libraries): Rename "i" local
+variable to "j" for the nested loop (just not to hide the similar
+variable in the outer one).
+* mark_rts.c (GC_print_static_roots): Output an error message
+using GC_err_printf() (instead of GC_printf()).
+
+* configure.ac: Move include flag from ${INCLUDE} ...
+* Makefile.am: ... to AM_CPPFLAGS and also add the build directory.
+* configure.ac: Call AM_CONFIG_HEADER([include/private/config.h]).
+* configure.ac: Add documentation to all AC_DEFINE either directly
+or using AH_TEMPLATE.
+
+* win32_threads.c (GC_waitForSingleObjectInfinite): New static
+function (only if GC_WINMAIN_REDIRECT).
+* win32_threads.c (WinMain): Call GC_waitForSingleObjectInfinite()
+thru GC_do_blocking() instead of calling WaitForSingleObject()
+directly.
+
+* pthread_support.c (start_mark_threads): Refine printed message.
+* win32_threads.c (GC_thr_init): Likewise.
+
+* Makefile.direct (GC_WINMAIN_REDIRECT): Add the comment for.
+* Makefile.direct (NO_GETENV): Update the comment.
+* include/gc.h (GC_WINMAIN_WINCE_LPTSTR): Remove macro.
+* include/gc.h (GC_WinMain): Remove declaration.
+* include/gc.h (WinMain): Define (as GC_WinMain) if and only if
+GC_WINMAIN_REDIRECT.
+* tests/test.c (GC_COND_INIT): Define as GC_INIT() also in case of
+WinCE target unless GC_WINMAIN_REDIRECT is defined.
+* tests/test.c (WINMAIN_LPTSTR): New macro.
+* tests/test.c (WinMain): Use WINMAIN_LPTSTR instead of LP[W]STR
+and GC_WINMAIN_WINCE_LPTSTR.
+* win32_threads.c (start_mark_threads): Add the comment for
+MARK_THREAD_STACK_SIZE.
+* win32_threads.c: Recognize new GC_WINMAIN_REDIRECT macro.
+* win32_threads.c (WINMAIN_LPTSTR, WINMAIN_THREAD_STACK_SIZE): New
+macro (only if GC_WINMAIN_REDIRECT).
+* win32_threads.c: Undefine WinMain macro if GC_WINMAIN_REDIRECT.
+* win32_threads.c (GC_WinMain): Add prototype (only if
+GC_WINMAIN_REDIRECT).
+* win32_threads.c (main_thread_args, WinMain): Rename
+GC_WINMAIN_WINCE_LPTSTR to WINMAIN_LPTSTR.
+* win32_threads.c (WinMain): Call GC_INIT() instead of GC_init();
+use WINMAIN_THREAD_STACK_SIZE.
+* win32_threads.c (WinMain): Call GC_deinit() and
+DeleteCriticalSection() only if WinCE; add FIXME.
+
+* os_dep.c (GC_get_main_stack_base): add assertion for mem_base
+value returned by GC_get_stack_base().
+
+* Makefile.direct (MUNMAP_THRESHOLD, GC_FORCE_UNMAP_ON_GCOLLECT):
+Add the comment for.
+* alloc.c (GC_unmap_threshold, GC_force_unmap_on_gcollect):
+Declare external variable (only if USE_MUNMAP).
+* alloc.c (GC_try_to_collect): Temporarily set GC_unmap_threshold
+value to 1 if GC_force_unmap_on_gcollect and restore it before
+unlocking (only if USE_MUNMAP).
+* doc/README.environment (GC_FORCE_UNMAP_ON_GCOLLECT): Add
+information for.
+* include/gc.h (GC_set_force_unmap_on_gcollect,
+GC_get_force_unmap_on_gcollect): New public function prototype.
+* include/gc.h (GC_FORCE_UNMAP_ON_GCOLLECT): New macro is
+recognized.
+* misc.c (GC_FORCE_UNMAP_ON_GCOLLECT): Likewise.
+* include/gc.h (GC_INIT_CONF_FORCE_UNMAP_ON_GCOLLECT): New
+internal macro (used by GC_INIT only).
+* misc.c (GC_force_unmap_on_gcollect): New global variable.
+* misc.c (GC_init): Recognize new "GC_FORCE_UNMAP_ON_GCOLLECT"
+environment variable (and set GC_force_unmap_on_gcollect).
+* misc.c (GC_set_force_unmap_on_gcollect,
+GC_get_force_unmap_on_gcollect): New public function.
+* tests/test.c (window_proc): Call GC_set_force_unmap_on_gcollect
+to force the mode on if WM_HIBERNATE; restore the mode after
+GC_gcollect().
+
+* Makefile.direct (LARGE_CONFIG): Update information.
+* include/gc.h (GC_stop_func): Refine the comment.
+
+* configure.ac: Use EMPTY_GETENV_RESULTS instead of NO_GETENV for
+Win32 (workaround for Wine bug).
+
+* allchblk.c (GC_freehblk): Adjust local variables indentation.
+* mallocx.c (GC_generic_malloc_many): Likewise.
+* typd_mlc.c (GC_malloc_explicitly_typed_ignore_off_page,
+GC_calloc_explicitly_typed): Likewise.
+* typd_mlc.c (GC_make_array_descriptor): Remove unnecessary
+brackets.
+
+* configure.ac: Replace GC_WIN32_THREADS with GC_THREADS.
+* configure.ac: Process enable_parallel_mark option for Cygwin and
+Win32; define THREAD_LOCAL_ALLOC for Win32.
+
+* include/private/gc_priv.h: Define AO_ASSUME_WINDOWS98 if
+PARALLEL_MARK (required for VC++ x86).
+
+* dbg_mlc.c (GC_generate_random_backtrace): Call
+GC_try_to_collect(GC_never_stop_func) instead of GC_gcollect();
+if GC is disabled then print error message and return.
+* include/gc.h (GC_try_to_collect): Refine the comment.
+* include/private/gc_priv.h (GC_never_stop_func): Fix return type;
+refine the comment.
+
+* add_gc_prefix.c: Move the file to the new "extra" directory.
+* AmigaOS.c: Likewise.
+* gcname.c: Likewise.
+* if_mach.c: Likewise.
+* if_not_there.c: Likewise.
+* MacOS.c: Likewise.
+* msvc_dbg.c: Likewise.
+* setjmp_t.c: Likewise.
+* threadlibs.c: Likewise.
+* EMX_MAKEFILE: Prepend setjmp_t.c with "extra" directory.
+* Makefile: Prepend AmigaOS.c, MacOS.c, add_gc_prefix.c, gcname.c,
+if_mach.c, if_not_there.c, msvc_dbg.c, setjmp_t.c, threadlibs.c
+with "extra" directory.
+* Makefile.am: Likewise.
+* Makefile.direct: Likewise.
+* Makefile.dj: Likewise.
+* Makefile.in: Likewise.
+* NT_MAKEFILE: Prepend msvc_dbg.obj with "extra" directory.
+* NT_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_THREADS_MAKEFILE: Likewise.
+* NT_THREADS_MAKEFILE: Prepend msvc_dbg.c with "extra" directory.
+* gc.mak: Likewise.
+* PCR-Makefile: Prepend if_mach.c, if_not_there.c with "extra"
+directory.
+* SMakefile.amiga: Prepend AmigaOS.c, setjmp_t.c with "extra"
+directory.
+* doc/simple_example.html: Update for threadlibs.c.
+* os_dep.c: Prepend included AmigaOS.c with "extra" directory.
+
+* include/gc.h (GC_do_blocking, GC_call_with_gc_active): New
+function prototype.
+* include/private/gc_priv.h (STOP_WORLD): Replace a no-op (for the
+single-threaded case) with an assertion check for the state to be
+not a "do-blocking" one.
+* include/private/gc_priv.h (blocking_data): Move the structure
+definition from pthread_support.c; change "fn" return type to void
+pointer.
+* include/private/gc_priv.h (GC_activation_frame_s): New structure
+type.
+* include/private/gc_priv.h (GC_push_all_stack_frames): New
+function declaration (only if THREADS).
+* include/private/gc_priv.h (GC_world_stopped): Don't declare
+unless THREADS.
+* include/private/gc_priv.h (GC_blocked_sp,
+GC_activation_frame_s): New declaration (only if not THREADS).
+* include/private/gc_priv.h (GC_push_all_register_frames): New
+function declaration (only for IA-64).
+* include/private/gc_priv.h (NURSERY, GC_push_proc): Remove
+obsolete (unused) symbols.
+* include/private/gc_priv.h (GC_push_all_stack_partially_eager):
+Remove declaration (since it is static now).
+* mark_rts.c (GC_push_all_stack_partially_eager): Move from mark.c
+(for code locality) and make STATIC.
+* mark_rts.c (GC_push_all_register_frames): New function (only for
+IA-64).
+* mark_rts.c (GC_push_all_stack_frames): New function (only if
+THREADS).
+* mark_rts.c (GC_add_trace_entry): New function prototype (used by
+GC_push_all_stack_partially_eager(), only if TRACE_BUF).
+* mark_rts.c (GC_push_all_stack_part_eager_frames): New function.
+* mar_rts.c (GC_save_regs_ret_val): Move the declaration out of a
+function body (only for IA-64).
+* mark_rts.c (GC_push_current_stack): Call
+GC_push_all_stack_part_eager_frames() instead of
+GC_push_all_stack_partially_eager().
+* mark_rts.c (GC_push_current_stack): Call
+GC_push_all_register_frames() instead of GC_push_all_eager() for
+IA-64 backing store.
+* misc.c (GC_do_blocking_inner): Declare function (if THREADS
+only).
+* misc.c (GC_blocked_sp, GC_blocked_register_sp,
+GC_activation_frame): New global variables (only if not THREADS).
+* misc.c (GC_call_with_gc_active, GC_do_blocking_inner): New API
+function (only if not THREADS).
+* misc.c (GC_do_blocking): Move the function from
+pthread_support.c.
+* include/private/pthread_support.h (GC_Thread_Rep): Add
+"activation_frame" field.
+* pthread_stop_world.c (GC_push_all_stacks): Call
+GC_push_all_stack_frames() and GC_push_all_register_frames instead
+of GC_push_all_stack() and/or GC_push_all_eager(); don't check for
+STACK_GROWS_UP here.
+* pthread_support.c (GC_do_blocking_inner): Remove "static"; store
+"fn" result back to "client_data" field.
+* pthread_support.c (GC_call_with_gc_active): New API function.
+* win32_threads.c (GC_call_with_gc_active): Likewise.
+* win32_threads.c (GC_Thread_Rep): Add "thread_blocked_sp" and
+"activation_frame" fields.
+* win32_threads.c (GC_new_thread): Add assertion checking for
+thread_blocked_sp is NULL.
+* win32_threads.c (GC_do_blocking_inner): New function.
+* win32_threads.c (GC_stop_world): Don't suspend a thread if its
+thread_blocked_sp is non-NULL.
+* win32_threads.c (GC_push_stack_for): Use thread
+"activation_frame" (if non-NULL); use "thread_blocked_sp" if
+non-NULL (instead of calling GetThreadContext()); "UNPROTECT" the
+thread before modifying its last_stack_min; call
+GC_push_all_stack_frames() instead of GC_push_all_stack(); update
+the comments.
+
+* alloc.c (GC_default_stop_func): New static variable (initialized
+to GC_never_stop_func).
+* alloc.c (GC_set_stop_func, GC_get_stop_func): New function.
+* alloc.c (GC_timeout_stop_func): Define as GC_default_stop_func
+(instead of GC_never_stop_func) if SMALL_CONFIG (or NO_CLOCK),
+else call GC_default_stop_func() before getting "current_time".
+* alloc.c (GC_maybe_gc): Expand GC_gcollect_inner() macro (for
+FIXME comment).
+* alloc.c (GC_maybe_gc, GC_collect_a_little_inner): add FIXME for
+replacing GC_never_stop_func with GC_default_stop_func (if
+possible).
+* alloc.c (GC_gcollect): Use GC_default_stop_func.
+* alloc.c (GC_collect_or_expand): Use GC_default_stop_func
+(instead of GC_never_stop_func) unless it is triggered due to out of
+memory; don't increment GC_fail_count and don't output warning
+(before trying to collect again) in case the collection has been
+interrupted (by GC_default_stop_func) and the heap expansion has
+failed too.
+* include/gc.h (GC_set_stop_func, GC_get_stop_func): New function
+prototypes.
+
+* os_dep.c (GC_get_stack_base): Add FIXME; add assertion for
+GC_get_writable_length() result.
+
+* configure.ac: Don't use -lpthread -ldl for Cygwin.
+
+* NT_THREADS_MAKEFILE: Make it back equal to gc.mak.
+
+* include/private/gcconfig.h (GWW_VDB): Undefine if
+USE_GLOBAL_ALLOC (since incompatible).
+* os_dep.c (GetWriteWatch_alloc_flag): Define as 0 unless GWW_VDB
+is defined.
+* os_dep.c (GC_unmap_threshold): Declare (for use in
+GC_init_win32) if USE_MUNMAP.
+* os_dep.c (GC_init_win32): Turn off memory unmapping if
+GlobalAlloc() is used.
+* os_dep.c (GC_win32_get_mem): Define and use new
+VIRTUAL_ALLOC_PAD macro; don't waste an extra memory page unless
+MPROTECT_VDB is in use.
+
+* Makefile: Replace "version.h" with "include/gc_version.h".
+* include/gc_version.h: Likewise.
+
+* alloc.c (GC_collect_or_expand): Output heap size in WARN()
+(before returning FALSE) for convenience.
+
+* allchblk.c (GC_allochblk_nth): Use GC_PRIdPTR in WARN() format
+string.
+* pthread_support.c (start_mark_threads, GC_thr_init): Likewise.
+* win32_threads.c (GC_delete_thread): Likewise.
+* include/private/gc_priv.h (GC_PRIdPTR): New macro.
+* pthread_stop_world.c (GC_suspend_handler_inner): Remove
+unnecessary cast for WARN argument.
+* pthread_support.c (start_mark_threads): if pthread_create()
+failed then don't try to create other marker threads and (after
+printing a warning) adjust GC_markers and GC_parallel values; log
+GC_markers value (possibly adjusted) after that.
+
+* win32_threads.c (start_mark_threads): if pthread_create() is
+failed then don't try to create other marker threads and (after
+printing a warning) adjust GC_markers and GC_parallel values.
+* win32_threads.c (mark_mutex_event, builder_cv, mark_cv): Move
+the definition upper (to be visible in start_mark_threads()).
+* win32_threads.c (start_mark_threads): if CreateThread() or
+_beginthreadex() is failed then don't try to create other marker
+threads and (after printing a warning) adjust GC_markers,
+GC_parallel values, and destroy the event objects (either only
+some for the uncreated threads if DONT_USE_SIGNALANDWAIT or all if
+not a single thread is created).
+* win32_threads.c (GC_thr_init): Log GC_markers value (possibly
+adjusted) after start_mark_threads() call.
+
+* Makefile.am: Back remove "GC_" prefix for PTHREADS,
+DARWIN_THREADS, WIN32_THREADS (for configure.ac).
+
+* include/private/gc_priv.h: Change include of config.h to
+private/config.h.
+* include/private/gc_pmark.h: Likewise.
+* gc_cpp.cc: Likewise.
+* tests/test.c: Likewise.
+* tests/test_cpp.cc: Include private/config.h (if HAVE_CONFIG_H);
+undefine GC_BUILD.
+
+* finalize.c (GC_general_register_disappearing_link): Return
+GC_SUCCESS, GC_DUPLICATE, GC_NO_MEMORY (instead of 0, 1 and 2,
+respectively).
+* include/gc.h (GC_NO_MEMORY): New macro (defined as 2).
+* include/gc.h (GC_register_disappearing_link,
+GC_general_register_disappearing_link): Update the comment.
+* typd_mlc.c (GC_calloc_explicitly_typed): Use GC_NO_MEMORY macro.
+* finalize.c (GC_general_register_disappearing_link,
+GC_register_finalizer_inner): Recalculate the hash table index
+after GC_oom_fn succeeded (since the table may grow while not
+holding the lock) and check again that the entry is still not in
+the table (free the unused entry otherwise unless DBG_HDRS_ALL).
+* finalize.c (GC_register_finalizer_inner): Initialize "hhdr"
+local variable (to prevent a compiler warning).
+* finalize.c (GC_register_finalizer_inner): Don't modify the data
+pointed by "ocd" and "ofn" in GC_register_finalizer_inner() failed
+(due to out of memory).
+
+* alloc.c (GC_set_fl_marks, GC_clear_fl_marks): Transform loop to
+suppress compiler "variable might be uninitialized" warnings.
+
+* Makefile.direct (DONT_USE_SIGNALANDWAIT): Add the comment for.
+* win32_threads.c (DONT_USE_SIGNALANDWAIT): Always define for
+WinCE.
+* win32_threads.c (THREAD_HANDLE): Cast Id (of DWORD type) to
+HANDLE thru word type (to avoid a compiler warning) for WinCE.
+* win32_threads.c (GC_marker_cv, GC_marker_Id): New static array
+(only if DONT_USE_SIGNALANDWAIT).
+* win32_threads.c (start_mark_threads): Initialize GC_marker_Id
+and GC_marker_cv for each helper thread (only if
+DONT_USE_SIGNALANDWAIT).
+* win32_threads.c (GC_mark_mutex_state): New static variable (only
+if DONT_USE_SIGNALANDWAIT).
+* win32_threads.c (GC_mark_mutex_waitcnt,
+signalObjectAndWait_func): Don't define if DONT_USE_SIGNALANDWAIT.
+* win32_threads.c (GC_acquire_mark_lock, GC_release_mark_lock):
+Use InterlockedExchange() over GC_mark_mutex_state (instead of
+AO_fetch_and_add()) if DONT_USE_SIGNALANDWAIT.
+* win32_threads.c (GC_wait_marker, GC_notify_all_marker):
+Implement wait/broadcast primitives using Win32 multiple events
+(one for each marker thread) if DONT_USE_SIGNALANDWAIT (instead of
+using Win32 SignalObjectAndWait).
+* win32_threads.c (GC_thr_init): Don't declare hK32 local
+variable, don't check for GC_wnt, and don't initialize
+signalObjectAndWait_func if DONT_USE_SIGNALANDWAIT.
+
+* alloc.c (GC_finish_collection): Call GC_print_finalization_stats
+if GC_print_stats (after getting "done_time").
+* finalize.c (GC_old_dl_entries): New static variable (only if not
+SMALL_CONFIG).
+* finalize.c (GC_finalize): Save current GC_dl_entries value (only
+if not SMALL_CONFIG).
+* finalize.c (GC_print_finalization_stats): Define if and only if
+not SMALL_CONFIG; use GC_old_dl_entries value; use GC_log_printf()
+instead of GC_printf(); use "%lu" (instead of "%u") print format
+specifier; use unsigned long type for "ready" counter (for LP64
+targets).
+* misc.c (GC_dump): No longer call GC_print_finalization_stats()
+here (since it is called from GC_finish_collection()).
+* misc.c (STACKBASE): Remove unused macro undef (for NOSYS and
+ECOS).
+
+* alloc.c (GC_expand_hp): Replace GC_init_inner() call with
+GC_init() one.
+* malloc.c (GC_alloc_large, GC_generic_malloc_inner): Likewise.
+* mallocx.c (GC_generic_malloc_many): Likewise.
+* misc.c (GC_enable_incremental): Likewise.
+* alloc.c (GC_expand_hp): Update the comment.
+* mark.c (GC_obj_kinds): Likewise.
+* win32_threads.c (GC_allow_register_threads): Likewise.
+* private/gc_priv.h (GC_init_inner): Remove function declaration.
+* misc.c (GC_init_inner): Replace with public GC_init().
+
+* gcj_mlc.c (GC_gcj_fake_mark_proc): New static function.
+* gcj_mlc.c (GC_init_gcj_malloc): If mp is 0 then supply
+GC_gcj_fake_mark_proc (aborting with the appropriate message)
+instead.
+
+* os_dep.c (GC_wince_get_mem): If VirtualAlloc() returns NULL (due
+to out of memory) then don't increment GC_n_heap_bases and don't
+call VirtualAlloc() again (with MEM_COMMIT).
+* os_dep.c (GC_remap): Abort with a more informatory message if
+VirtualAlloc() fails due to out of memory; update FIXME.
+
+* Makefile: Fix typo for msvc_dbg.c.
+* Makefile.direct: Likewise.
+* Makefile.am: Prefix PTHREADS, DARWIN_THREADS, WIN32_THREADS with
+"GC_".
+* Makefile.dj: Don't reference remove files (nursery.c,
+gc_nursery.h, gc_copy_descr.h).
+* NT_MAKEFILE: Don't define __STDC__ macro (no longer used).
+* NT_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_THREADS_MAKEFILE: Likewise.
+* NT_X64_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_THREADS_MAKEFILE: Likewise.
+* gc.mak: Likewise.
+* NT_MAKEFILE: Remove unnecessary -DGC_BUILD (since it is always
+defined in the source files).
+* NT_THREADS_MAKEFILE: Likewise.
+* NT_X64_THREADS_MAKEFILE: Likewise.
+* gc.mak: Likewise.
+* NT_X64_THREADS_MAKEFILE: Fix typo for -DGC_NOT_DLL.
+* NT_STATIC_THREADS_MAKEFILE: Replace GC_WIN32_THREADS with
+GC_THREADS.
+* NT_THREADS_MAKEFILE: Likewise.
+* NT_X64_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_THREADS_MAKEFILE: Likewise.
+* gc.mak: Likewise.
+* NT_MAKEFILE: Define _CRT_SECURE_NO_DEPRECATE to suppress the
+compiler warnings.
+* NT_STATIC_THREADS_MAKEFILE: Likewise.
+* NT_X64_STATIC_THREADS_MAKEFILE: Place -D_CRT_SECURE_NO_DEPRECATE
+before "$*.C" (and "$*.CPP").
+* NT_X64_THREADS_MAKEFILE: Likewise.
+
+* doc/README.solaris2: Replace GC_SOLARIS_THREADS with GC_THREADS.
+* doc/README.win32: Replace GC_WIN32_THREADS with GC_THREADS.
+* doc/README.win64: Add info about mingw-w64; add note for VC++
+warnings suppression.
+
+* os_dep.c (GC_forward_exception): Fix logic in several places.
+(OSX-specific)
+
+* include/private/gc_priv.h (MAX_HEAP_SECTS): Guard with ifndef.
+
+* Makefile.direct: Copy missing information for -DSHORT_DBG_HDRS
+from Makefile.
+* Makefile: Remove the information about "define arguments" (which
+is incomplete and outdated compared to that in Makefile.direct);
+add help reference to Makefile.direct.
+* Makefile.dj: Likewise.
+
+* alloc.c (world_stopped_total_time, world_stopped_total_divisor):
+Replace "STATIC" with "static" in the definition (since the
+symbols aren't prefixed with "GC_").
+* win32_threads.c (marker_sp, marker_bsp, marker_last_stack_min,
+start_mark_threads, mark_mutex, builder_cv, mark_cv,
+mark_mutex_event, signalObjectAndWait_func, main_thread_start):
+Likewise.
+* pthread_support.c (GC_wait_builder): Define as STATIC.
+* win32_threads.c (GC_wait_builder): Likewise.
+
+* misc.c (GC_get_heap_size_inner, GC_get_free_bytes_inner): New
+API function.
+* include/gc_pmark.h (GC_get_heap_size_inner,
+GC_get_free_bytes_inner): New function declaration.
+
+* include/gc.h: Recognize __CEGCC__ (as a synonym for _WIN32_WCE).
+* include/gc_config_macros.h: Likewise.
+* include/gc.h (GC_MAXIMUM_HEAP_SIZE): Recognize new macro.
+* include/gc.h (GC_INIT_CONF_MAXIMUM_HEAP_SIZE): New macro (for
+internal use).
+* include/gc_config_macros.h: Always include stddef.h if GCC.
+* include/gc_config_macros.h (GC_API): Define for CeGCC in the
+same way as for MinGW.
+* include/gc_config_macros.h (GC_API): Group the definition for
+all cases together (check for GC_DLL only once).
+* include/gc_pthread_redirects.h: Group non-Darwin code together.
+* tests/test.c: Recognize GC_PRINT_VERBOSE_STATS (only if GC_DLL).
+
+* Makefile.direct (GC_PTHREADS_PARAMARK, GC_IGNORE_GCJ_INFO,
+GC_PRINT_VERBOSE_STATS, GC_DONT_EXPAND, GC_INITIAL_HEAP_SIZE,
+GC_FREE_SPACE_DIVISOR, GC_TIME_LIMIT, GC_FULL_FREQ): Add the
+comment for.
+* misc.c (GC_init_inner): Recognize GC_PRINT_VERBOSE_STATS (new
+macro).
+* dyn_load.c (GC_wnt): Change definition to TRUE for WinCE; add
+FIXME and the comment for WinCE.
+* gcj_mlc.c (GC_init_gcj_malloc): Recognize GC_IGNORE_GCJ_INFO
+(new macro).
+* include/gc.h (GC_HAVE_BUILTIN_BACKTRACE): Don't define for VC++
+WinCE (since backtrace() is unimplemented).
+* include/private/gc_priv.h (GC_n_heap_bases): Remove declaration
+(since static).
+* os_dep.c (GC_n_heap_bases): Define as STATIC; move the
+definition to be above GC_is_heap_base().
+* include/private/gcconfig.h: Don't define NOSYS for WinCE on ARM
+(both for MinGW and CeGCC toolchains).
+* include/private/gcconfig.h: Recognize __CEGCC__ and
+__MINGW32CE__ (as synonyms for __WIN32_WCE).
+* include/private/gcconfig.h: If SH4 then don't set config
+parameters for SH.
+* include/private/thread_local_alloc.h (GC_key_create): Don't
+abort on failures, just return -1 in these cases (this also
+prevents compilation error for targets where ABORT is defined
+indirectly as an inline assembler sequence).
+* mark.c (WRAP_MARK_SOME): Also define for WinCE; add FIXME for
+the GCC-based cross-compiler.
+* mark.c (ext_ex_regn, mark_ex_handler): Don't define unless
+WRAP_MARK_SOME is defined; define also for WinCE case; don't
+check for _WIN64 (since WRAP_MARK_SOME is undefined for it).
+* mark.c (GC_mark_some): Use __try/__except also for WinCE; update
+the comment.
+* misc.c: Include signal.h after gc_pmark.h included; check for
+MSWINCE instead of _WIN32_WCE.
+* misc.c (GC_init_inner): Remove duplicate GC_setpagesize() call.
+* misc.c: Don't include <crtdbg.h> for WinCE targets.
+* misc.c (GC_write): Define _MAX_PATH if undefined (workaround for
+CeGCC toolchain).
+* misc.c (GC_write): Use OutputDebugStringW() instead of
+_CrtDbgReport() for WinCE targets.
+* os_dep.c (GC_least_described_address): Define as STATIC.
+* os_dep.c (GC_register_data_segments): Fix code indentation.
+* os_dep.c (GC_wince_get_mem): Initialize "result" local variable
+(to prevent a compiler warning).
+* os_dep.c (GC_dirty_init): Add comment for WinCE target.
+* tests/test.c: Don't include winbase.h directly if GCC for WinCE,
+include assert.h instead.
+* tests/test.c (tiny_reverse_test): Define and use
+TINY_REVERSE_UPPER_VALUE macro (4 if VERY_SMALL_CONFIG else 10);
+useful for WinCE.
+* win32_threads.c (GC_Thread_Rep): Don't declare "handle" field
+for WinCE (since thread Id is used as a "real" thread handle).
+* win32_threads.c (THREAD_HANDLE): New macro.
+* win32_threads.c (GC_register_my_thread_inner): Don't recognize
+DONT_IMPORT_GETCURTHREAD anymore; don't record thread handle on
+WinCE.
+* Makefile.direct (DONT_IMPORT_GETCURTHREAD): Remove comment for.
+* win32_threads.c (UNPROTECT, GC_fault_handler_lock): Don't check
+for MSWINCE.
+* win32_threads.c (GC_delete_gc_thread, GC_delete_thread): Don't
+close thread handle on WinCE (since it's a thread Id).
+* win32_threads.c (GC_suspend): Don't check for MSWINCE in the
+MPROTECT-related code (for the case if MPROTECT_VDB would be
+implemented for WinCE).
+* win32_threads.c (GC_suspend, GC_start_world, GC_push_stack_for):
+Use THREAD_HANDLE(t) to obtain thread handle.
+* win32_threads.c (GC_PTHREADS_PARAMARK): New macro recognized;
+implicitly define GC_PTHREADS_PARAMARK if GC_PTHREADS; include
+pthread.h; define NUMERIC_THREAD_ID(id) if undefined yet; replace
+GC_PTHREADS with GC_PTHREADS_PARAMARK where appropriate (for the
+parallel mark support).
+* win32_threads.c (start_mark_threads): Use int type for "i" local
+variable (instead of "unsigned") to prevent a compiler warning.
+* win32_threads.c (start_mark_threads): Don't check CreateThread()
+result for -1; call CloseHandle() for the handle created by
+CreateThread() (on WinCE); don't use errno (since errno.h is
+missing on some targets like WinCE) when printing warning on a
+marker thread creation failure.
+* win32_threads.c (signalObjectAndWait_func): Define for WinCE.
+* win32_threads.c (GC_wait_marker): Remove unnecessary assertion
+for non-zero signalObjectAndWait_func (to make the code compilable
+for WinCE).
+* win32_threads.c (GC_thr_init): Allow PARALLEL_MARK for WinCE;
+use GC_sysinfo to get processors count if WinCE; don't check for
+SignalObjectAndWait() if WinCE; replace GC_PTHREADS with
+GC_PTHREADS_PARAMARK.
+* win32_threads.c (GC_thr_init): Recognize GC_MIN_MARKERS new
+macro (useful for testing parallel marking on WinCE).
+* win32_threads.c (GC_win32_start, main_thread_start): Define as
+STATIC.
+* win32_threads.c: Don't define main_thread_args,
+main_thread_start(), WinMain() for WinCE if GC_DLL.
+* win32_threads.c (WINCE_MAIN_STACK_SIZE): Remove useless macro
+(since the stack size parameter is ignored on WinCE).
+* win32_threads.c (main_thread_start): Remove forward declaration;
+place its definition before WinMain() one.
+* win32_threads.c (WinMain): Abort if GC_CreateThread() or
+WaitForSingleObject() failed (for the main thread).
+
+* allchblk.c (MUNMAP_THRESHOLD): Move macro definition out of
+a function.
+* allchblk.c (GC_unmap_threshold): New global variable definition
+(initialized to MUNMAP_THRESHOLD).
+* allchblk.c (GC_unmap_old): Use GC_unmap_threshold instead of
+MUNMAP_THRESHOLD; skip unmapping if GC_unmap_threshold is 0.
+* doc/README.environment (GC_UNMAP_THRESHOLD): Add information.
+* misc.c (GC_unmap_threshold): New variable declaration.
+* misc.c (GC_init_inner): Recognize "GC_UNMAP_THRESHOLD"
+environment variable to set GC_unmap_threshold value (only if
+USE_MUNMAP).
+
+* dbg_mlc.c (OFN_UNSET): New macro (to detect
+GC_register_finalizer() failures).
+* dbg_mlc.c (store_old): Add a check for register_finalizer()
+failure caused by an out-of-memory event (leave *ofn and *ocd
+unmodified in that case).
+* dbg_mlc.c (GC_debug_register_finalizer,
+GC_debug_register_finalizer_no_order,
+GC_debug_register_finalizer_unreachable,
+GC_debug_register_finalizer_ignore_self): Initialize my_old_fn
+to OFN_UNSET; clear *ocd and *ofn for non-heap objects (the same
+as in GC_register_finalizer_inner()).
+
+* Makefile.direct (GC_DLL): Add the comment for.
+* doc/README.macros: Fix a typo.
+* doc/README.macros (_DLL, GC_DLL, GC_NOT_DLL): Update info.
+* doc/README.macros (__STDC__): Remove info.
+* dbg_mlc.c (GC_get_back_ptr_info, GC_generate_random_heap_address,
+GC_generate_random_valid_address, GC_print_backtrace,
+GC_generate_random_backtrace, GC_register_describe_type_fn): Add
+GC_API and GC_CALL to function definition.
+* malloc.c (GC_generic_malloc): Likewise.
+* mallocx.c (GC_incr_bytes_allocd, GC_incr_bytes_freed): Likewise.
+* mark.c (GC_mark_and_push): Likewise.
+* misc.c (GC_new_free_list_inner, GC_new_free_list,
+GC_new_kind_inner, GC_new_kind, GC_new_proc_inner, GC_new_proc):
+Likewise.
+* include/gc_backptr.h (GC_get_back_ptr_info,
+GC_generate_random_heap_address, GC_generate_random_valid_address,
+GC_generate_random_backtrace, GC_print_backtrace): Add GC_API and
+GC_CALL to function prototype.
+* include/gc_mark.h (GC_mark_and_push, GC_new_free_list,
+GC_new_free_list_inner, GC_new_kind, GC_new_kind_inner,
+GC_new_proc, GC_new_proc_inner, GC_generic_malloc,
+GC_register_describe_type_fn): Likewise.
+* include/new_gc_alloc.h (GC_incr_bytes_allocd, GC_incr_mem_freed,
+GC_generic_malloc_words_small): Likewise.
+* gc_cpp.cc: Include "config.h" (if HAVE_CONFIG_H defined).
+* include/private/gc_pmark.h: Likewise.
+* include/private/gc_priv.h: Likewise.
+* tests/test.c: Likewise.
+* gc_cpp.cc: Define GC_BUILD.
+* include/private/gc_pmark.h: Likewise.
+* include/private/gc_priv.h: Likewise.
+* gc_dlopen.c (WRAP_FUNC, REAL_FUNC): New macro.
+* gc_dlopen.c (dlopen): Add GC_API to the wrapper function
+definition.
+* pthread_support.c (GC_pthread_create, GC_pthread_sigmask,
+GC_pthread_join, GC_pthread_detach, pthread_sigmask, pthread_join,
+pthread_detach, pthread_create): Likewise.
+* win32_threads.c (GC_pthread_join, GC_pthread_create,
+GC_pthread_sigmask, GC_pthread_detach): Likewise.
+* gc_dlopen.c (dlopen): Use WRAP_FUNC and REAL_FUNC macros.
+* include/gc_backptr.h: Include "gc.h".
+* include/gc_backptr.h: Use extern "C" for the exported functions.
+* include/gc_mark.h: Likewise.
+* include/gc_config_macros.h (GC_THREADS): Define the macro if any
+GC_XXX_THREADS is defined.
+* include/gc_config_macros.h (_PTHREADS, _POSIX4A_DRAFT10_SOURCE):
+Move the definitions below the place where GC_NETBSD_THREADS and
+GC_DGUX386_THREADS are defined.
+* include/gc_config_macros.h (GC_DLL): Don't define (even if _DLL
+is defined) for GCC.
+* include/gc_config_macros.h (GC_API): Define for Cygwin (in the
+same way as for VC++); define for GCC v4+ (other than already
+recognized MinGW/Cygwin) as a "default" visibility attribute if
+GC_DLL is defined.
+* include/gc_config_macros.h (GC_ATTR_MALLOC, GC_ATTR_ALLOC_SIZE):
+New macro.
+* include/gc.h (GC_malloc, GC_malloc_atomic, GC_strdup,
+GC_malloc_uncollectable, GC_malloc_stubborn, GC_memalign,
+GC_malloc_atomic_uncollectable, GC_malloc_ignore_off_page,
+GC_malloc_atomic_ignore_off_page, GC_debug_malloc,
+GC_debug_malloc_atomic, GC_debug_strdup,
+GC_debug_malloc_uncollectable, GC_debug_malloc_stubborn,
+GC_debug_malloc_ignore_off_page,
+GC_debug_malloc_atomic_ignore_off_page,
+GC_debug_malloc_replacement): Add GC_ATTR_MALLOC attribute.
+* include/gc_gcj.h (GC_gcj_malloc, GC_debug_gcj_malloc,
+GC_gcj_malloc_ignore_off_page): Likewise.
+* include/gc.h (GC_malloc, GC_malloc_atomic,
+GC_malloc_uncollectable, GC_malloc_stubborn,
+GC_malloc_atomic_uncollectable, GC_malloc_ignore_off_page,
+GC_malloc_atomic_ignore_off_page, GC_debug_malloc,
+GC_debug_malloc_atomic, GC_debug_malloc_uncollectable,
+GC_debug_malloc_stubborn, GC_debug_malloc_ignore_off_page,
+GC_debug_malloc_atomic_ignore_off_page,
+GC_debug_malloc_replacement: Add GC_ATTR_ALLOC_SIZE attribute
+(for the first argument).
+* include/gc_gcj.h (GC_gcj_malloc, GC_debug_gcj_malloc,
+GC_gcj_malloc_ignore_off_page): Likewise.
+* include/gc.h (GC_memalign, GC_realloc, GC_debug_realloc,
+GC_debug_realloc_replacement): Add GC_ATTR_ALLOC_SIZE attribute
+(for the second argument).
+* include/gc.h (GC_malloc, GC_malloc_atomic, GC_strdup,
+GC_malloc_uncollectable, GC_malloc_stubborn, GC_memalign,
+GC_malloc_atomic_uncollectable, GC_free, GC_base, GC_size,
+GC_realloc, GC_expand_hp, GC_set_max_heap_size,
+GC_exclude_static_roots, GC_add_roots, GC_remove_roots,
+GC_register_displacement, GC_debug_register_displacement,
+GC_try_to_collect, GC_malloc_ignore_off_page,
+GC_malloc_atomic_ignore_off_page, GC_debug_malloc,
+GC_debug_malloc_atomic, GC_debug_strdup,
+GC_debug_malloc_uncollectable, GC_debug_malloc_stubborn,
+GC_debug_malloc_ignore_off_page,
+GC_debug_malloc_atomic_ignore_off_page, GC_debug_free,
+GC_debug_realloc, GC_debug_malloc_replacement,
+GC_debug_realloc_replacement, GC_finalization_proc,
+GC_register_finalizer, GC_debug_register_finalizer,
+GC_register_finalizer_ignore_self,
+GC_debug_register_finalizer_ignore_self,
+GC_register_finalizer_no_order,
+GC_debug_register_finalizer_no_order,
+GC_register_finalizer_unreachable,
+GC_debug_register_finalizer_unreachable,
+GC_register_disappearing_link,
+GC_general_register_disappearing_link,
+GC_unregister_disappearing_link, GC_noop1, GC_warn_proc,
+GC_set_warn_proc, GC_ignore_warn_proc, GC_fn_type,
+GC_call_with_alloc_lock, GC_stack_base_func,
+GC_call_with_stack_base, GC_same_obj, GC_pre_incr, GC_post_incr,
+GC_is_visible, GC_is_valid_displacement, GC_same_obj_print_proc,
+GC_is_valid_displacement_print_proc, GC_is_visible_print_proc,
+GC_malloc_many, GC_CreateThread, GC_beginthreadex,
+GC_endthreadex): Comment out (or remove if single and meaningless)
+function argument names (to avoid identifiers out of the name
+space).
+* include/gc_gcj.h (GC_init_gcj_malloc, GC_gcj_malloc,
+GC_debug_gcj_malloc, GC_gcj_malloc_ignore_off_page): Likewise.
+* include/gc.h (GC_try_to_collect): Update the comment.
+* include/gc.h (GC_size, GC_register_my_thread): Add const
+qualifier for the argument referent.
+* misc.c (GC_size): Likewise.
+* pthread_support.c (GC_register_my_thread_inner,
+GC_register_my_thread): Likewise.
+* win32_threads.c (GC_register_my_thread_inner,
+GC_register_my_thread): Likewise.
+* include/gc.h (GC_INIT_CONF_ROOTS): New macro for internal use
+(define instead of GC_INIT() for Cygwin and AIX).
+* include/gc.h (GC_DONT_EXPAND, GC_MAX_RETRIES,
+GC_FREE_SPACE_DIVISOR, GC_FULL_FREQ, GC_TIME_LIMIT, GC_IGNORE_WARN,
+GC_INITIAL_HEAP_SIZE): Recognize new macro.
+* include/gc.h (GC_INIT_CONF_DONT_EXPAND, GC_INIT_CONF_MAX_RETRIES,
+GC_INIT_CONF_FREE_SPACE_DIVISOR, GC_INIT_CONF_FULL_FREQ,
+GC_INIT_CONF_TIME_LIMIT, GC_INIT_CONF_IGNORE_WARN,
+GC_INIT_CONF_INITIAL_HEAP_SIZE): New macro for internal use.
+* include/gc.h (GC_INIT): Use GC_INIT_CONF_XXX macros.
+* include/gc_mark.h: Prefix GC_H with '_'.
+* include/gc_mark.h (GC_least_plausible_heap_addr,
+GC_greatest_plausible_heap_addr, GC_debug_header_size): Use GC_API
+for the public variable declaration.
+* include/new_gc_alloc.h (GC_objfreelist_ptr, GC_aobjfreelist_ptr,
+GC_uobjfreelist_ptr, GC_auobjfreelist_ptr): Likewise.
+* include/gc_pthread_redirects.h (GC_pthread_create,
+GC_pthread_sigmask, GC_dlopen, GC_pthread_join, GC_pthread_detach):
+Use GC_API for the wrapper prototype.
+* include/gc_pthread_redirects.h (pthread_create, pthread_join,
+pthread_detach, pthread_sigmask, dlopen): Undefine unconditionally
+before redirecting.
+* include/new_gc_alloc.h: Replace GC_incr_mem_freed() with
+GC_incr_bytes_freed(); remove FIXME.
+* include/private/gc_priv.h (GC_make_closure,
+GC_debug_invoke_finalizer, GC_noop): Remove GC_API for the private
+function.
+* tests/test.c (GC_print_stats): Handle GC_DLL case regardless of
+the target.
+
+* finalize.c (GC_general_register_disappearing_link,
+GC_register_finalizer_inner): Remove unnecessary "ifdef THREADS"
+guard for LOCK/UNLOCK().
+* finalize.c (GC_general_register_disappearing_link,
+GC_register_finalizer_inner): Get GC_oom_fn value before releasing
+the lock (to prevent data races).
+* gcj_mlc.c (GC_gcj_malloc, GC_debug_gcj_malloc,
+GC_gcj_malloc_ignore_off_page): Likewise.
+* mallocx.c (GC_generic_malloc_ignore_off_page): Likewise.
+* include/gc_inline.h (GC_FAST_MALLOC_GRANS): Use GC_get_oom_fn()
+instead of GC_oom_fn (to prevent data races).
+* malloc.c (GC_generic_malloc): Likewise.
+* mallocx.c (GC_memalign): Likewise.
+* pthread_support.c (pthread_create): Likewise.
+* gcj_mlc.c (maybe_finalize): Acquire the lock before setting
+last_finalized_no value to prevent data races.
+* include/gc.h (GC_gc_no, GC_get_gc_no, GC_oom_fn, GC_set_oom_fn,
+GC_set_find_leak, GC_set_finalize_on_demand,
+GC_set_java_finalization, GC_set_finalizer_notifier,
+GC_set_dont_expand, GC_set_full_freq, GC_set_non_gc_bytes,
+GC_set_no_dls, GC_set_free_space_divisor, GC_set_max_retries,
+GC_set_dont_precollect, GC_set_time_limit, GC_warn_proc): Refine
+the comment.
+* misc.c (GC_set_oom_fn): Likewise.
+* include/gc.h (GC_general_register_disappearing_link): Refine the
+comment (replace "soft" word with "weak").
+* misc.c (GC_oom_fn, GC_get_gc_no, GC_get_parallel,
+GC_set_finalizer_notifier, GC_set_find_leak): Add the comment.
+* misc.c (GC_set_oom_fn, GC_get_oom_fn, GC_set_finalizer_notifier,
+GC_get_finalizer_notifier): Use LOCK/UNLOCK to prevent data races.
+
+* dbg_mlc.c: Guard include <errno.h> with ifndef MSWINCE; include
+"private/dbg_mlc.h" before it.
+* malloc.c: Likewise.
+* dbg_mlc.c (GC_debug_strdup): Use memcpy() instead of strcpy()
+for WinCE (since deprecated); evaluate strlen() only once; don't
+set errno for WinCE.
+* malloc.c (GC_strdup): Likewise.
+* dyn_load.c (GC_wnt): Define as macro (FALSE) for WinCE.
+* include/gc.h (GC_unregister_my_thread): Refine the comment.
+* include/gc.h (GC_uintptr_t, GC_beginthreadex, GC_endthreadex):
+Don't declare for WinCE.
+* include/gc.h (GC_WINMAIN_WINCE_LPTSTR): New macro (WinCE only).
+* include/gc.h (GC_WinMain): Remove GC_API.
+* include/gc.h (GC_WinMain): Use GC_WINMAIN_WINCE_LPTSTR for
+lpCmdLine.
+* tests/test.c (GC_WinMain): Likewise.
+* win32_threads.c (main_thread_args, GC_WinMain): Likewise.
+* include/gc_config_macros.h (ptrdiff_t): Guard with
+ifndef _PTRDIFF_T_DEFINED; define _PTRDIFF_T_DEFINED macro.
+* include/private/gc_locks.h: Guard include "atomic_ops.h" with
+ifdef GC_PTHREADS (and not GC_WIN32_THREADS).
+* mark.c: Include "atomic_ops.h" if PARALLEL_MARK.
+* thread_local_alloc.c: Include "atomic_ops.h" if GC_GCJ_SUPPORT.
+* win32_threads.c: Include "atomic_ops.h" if MPROTECT_VDB.
+* include/private/gc_locks.h: Use include "atomic_ops.h" instead
+of include <atomic_ops.h>.
+* include/private/gc_priv.h: Likewise.
+* include/private/gc_locks.h (GC_allocate_ml, GC_need_to_lock):
+Don't export (replace GC_API to "extern").
+* win32_threads.c (GC_allocate_ml): Don't export.
+* include/private/gc_priv.h (DebugBreak): Define as macro for
+WinCE (if not UNDER_CE and DebugBreak is not defined yet).
+* include/private/gc_priv.h (UNALIGNED): Rename to UNALIGNED_PTRS
+(since "UNALIGNED" is defined in winnt.h of WinCE).
+* mark.c (UNALIGNED): Likewise.
+* include/private/gcconfig.h (ARM32): Recognize _M_ARM and _ARM_.
+* include/private/gcconfig.h (ALIGNMENT): Check always defined.
+* include/private/gcconfig.h: Allow GC_WIN32_THREADS for WinCE.
+* include/private/thread_local_alloc.h: Define USE_WIN32_SPECIFIC
+for WinCE (since __declspec(thread) is unsupported).
+* include/private/thread_local_alloc.h (TLS_OUT_OF_INDEXES):
+Define for WinCE (if undefined).
+* malloc.c (GC_malloc): Remove outdated comment about disabling
+signals.
+* misc.c: Don't include <tchar.h> (since not used anymore and may
+break TEXT() macro defined in winnt.h).
+* misc.c (GC_init_inner): Don't use GetModuleHandle() and
+InitializeCriticalSectionAndSpinCount() for WinCE.
+* misc.c (GC_init_inner): Replace GetModuleHandleA() with
+GetModuleHandle() (and use TEXT() macro controlled by UNICODE).
+* misc.c (LOG_FILE): Remove unused macro; don't use _T() macro.
+* misc.c (GC_CreateLogFile): New static function (Win32/WinCE
+only); move the code from GC_write(); replace GETENV() with
+GetEnvironmentVariable(); replace CreateFileA() with
+CreateFile(); use TEXT() macro (for Unicode support); replace
+strcat() with memcpy() (since deprecated in WinCE).
+* misc.c (GC_write): Define as STATIC.
+* win32_threads.c (GC_attached_thread): Likewise.
+* misc.c (GC_write): Use GC_CreateLogFile().
+* misc.c: Define vsnprintf macro as StringCchVPrintfA for WinCE.
+* misc.c (GC_abort): Try to invoke MessageBoxA() dynamically
+(Win32 only) if DONT_USE_USER32_DLL is defined.
+* misc.c (GC_abort): Duplicate msg to GC log file (for Win32 and
+WinCE).
+* misc.c (GC_abort): Use a more user-friendly abort if
+NO_DEBUGGING (Win32 only).
+* os_dep.c: Include "atomic_ops.h" only if MPROTECT_VDB (and
+THREADS).
+* os_dep.c (detect_GetWriteWatch): Use TEXT() for GetModuleHandle
+(for Unicode support); check GetModuleHandle() result.
+* tests/test.c: Don't define assert for WinCE (since may be
+redefined by "assert.h" included from libatomic_ops).
+* tests/test.c (FAIL): Define as ABORT for all targets (except
+for PCR).
+* tests/test.c (n_tests): Don't use AO_t.
+* tests/test.c (check_heap_stats): Don't cast n_tests.
+* tests/test.c (inc_int_counter): New function (for n_tests atomic
+incrementation).
+* tests/test.c (run_one_test): Test GC_memalign() for all targets.
+* tests/test.c (run_one_test): Avoid unbalanced brackets in
+#if-#else-#endif blocks.
+* tests/test.c (run_one_test): Replace AO_fetch_and_add1() and
+private LOCK/UNLOCK with GC_call_with_alloc_lock(inc_int_counter).
+* tests/test.c (check_heap_stats): Replace
+"if (sizeof(char *) > 4)" with "#if CPP_WORDSZ == 64" to suppress
+"unreachable code" compiler warning.
+* tests/test.c (WinMain): Set cmd type to LPWSTR (for WinCE
+"UNDER_CE" mode); else use LPSTR type (for Win32 and WinCE).
+* tests/test.c (thr_window): Replace "L" string prefix with
+TEXT().
+* thread_local_alloc.c: Check THREADS is defined (to prevent other
+compiler errors and warnings otherwise).
+* tests/test.c (WinMain): Recognize GC_NO_DLLMAIN macro (for
+GC_use_DllMain()).
+* Makefile.direct (GC_NO_DLLMAIN, DONT_IMPORT_GETCURTHREAD): Add
+the comments for.
+* win32_threads.c (GC_register_my_thread_inner): Recognize
+DONT_IMPORT_GETCURTHREAD macro.
+* win32_threads.c: Recognize GC_NO_DLLMAIN macro (to exclude
+DllMain support if needed).
+* win32_threads.c (GC_NO_DLLMAIN): Define implicitly if DllMain
+thread registration is unsupported for a given configuration.
+* win32_threads.c (GC_use_DllMain): Update the comment; refine
+ABORT message.
+* win32_threads.c (GC_use_DllMain,
+GC_started_thread_while_stopped, GC_register_my_thread_inner,
+GC_lookup_thread_inner, GC_delete_gc_thread,
+GC_allow_register_threads, GC_lookup_pthread,
+GC_push_thread_structures, GC_stop_world, GC_push_all_stacks):
+Check for GC_NO_DLLMAIN.
+* win32_threads.c (GC_Thread_Rep.tm_in_use, GC_attached_thread,
+DllMain): Don't define if GC_NO_DLLMAIN.
+* win32_threads.c (GC_stop_world): Declare "i" and "max" local
+variables only if not GC_NO_DLLMAIN (to suppress compiler
+warning).
+* win32_threads.c (GC_mark_thread, start_mark_threads): Use
+CreateThread() instead of _beginthreadex() for WinCE.
+* win32_threads.c (MARK_THREAD_STACK_SIZE, WINCE_MAIN_STACK_SIZE):
+New macros defined (used by start_mark_threads(), WinMain()).
+* win32_threads.c (GC_thr_init): Exclude parallel-specific code on
+WinCE for now (since getenv(), GetProcessAffinityMask() and
+SignalObjectAndWait() are missing on WinCE).
+* win32_threads.c (GC_thr_init): replace GetModuleHandleA() with
+GetModuleHandle(); replace CreateEventA() with CreateEvent(); use
+TEXT() macro (for Unicode support).
+
+* include/gc.h (GC_has_static_roots_func): New typedef (user filter
+callback).
+* include/gc.h (GC_register_has_static_roots_callback): Use
+GC_has_static_roots_func type.
+* dyn_load.c (GC_has_static_roots,
+GC_register_has_static_roots_callback): Likewise.
+* dyn_load.c (GC_has_static_roots,
+GC_register_has_static_roots_callback): Define on all platforms.
+* dyn_load.c (GC_register_dynlib_callback,
+GC_register_dynamic_libraries, GC_init_dyld): Replace K&R-style
+functions definition with the ANSI C one.
+* dyn_load.c (GC_register_dynlib_callback): Use new local variable
+"callback" (initialized from GC_has_static_roots) to minimize data
+races.
+* dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr,
+GC_cond_add_roots): Define as STATIC.
+* mark_rts.c (GC_remove_roots_inner): Likewise.
+* dyn_load.c (GC_dyld_image_add): Don't call GC_add_roots() for
+sections smaller than pointer size (just to avoid acquiring the
+lock unnecessarily).
+* dyn_load.c (GC_dyld_name_for_hdr): Define unconditionally (not
+only for DARWIN_DEBUG).
+* dyn_load.c (GC_dyld_image_add): Replace GC_add_roots() call with
+LOCK + GC_add_roots_inner() + UNLOCK.
+* dyn_load.c (GC_dyld_image_add): Call GC_has_static_roots() user
+callback (if set) holding the lock; if it returns 0 then don't call
+GC_add_roots_inner() for that region.
+* dyn_load.c (GC_register_has_static_roots_callback): Put
+"callback" value to GC_has_static_roots on all platforms.
+* dyn_load.c (GC_has_static_roots): Update the comments.
+* include/gc.h (GC_exclude_static_roots, GC_add_roots,
+GC_remove_roots, GC_register_has_static_roots_callback): Likewise.
+* include/private/gc_priv.h (struct roots): Likewise.
+* include/private/gc_priv.h (GC_remove_roots_inner): Move prototype
+to mark_rts.c and declare it as STATIC.
+* include/private/gc_priv.h (GC_exclude_static_roots_inner): New
+prototype.
+* dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr): Use
+GC_exclude_static_roots_inner() instead of GC_exclude_static_roots.
+* misc.c (GC_init_inner): Likewise.
+* mark_rts.c (GC_exclude_static_roots_inner): New function (move
+all the code from GC_exclude_static_roots(); add the comment.
+* mark_rts.c (GC_add_roots_inner, GC_exclude_static_roots_inner):
+add alignment assertion for the lower bound; add assertion for the
+lower bound to be less than the upper one.
+* mark_rts.c (GC_add_roots_inner, GC_exclude_static_roots): Adjust
+the upper bound (round down to be of a pointer-aligned value);
+return in case of an empty range.
+* mark_rts.c (GC_exclude_static_roots): Acquire the lock and call
+GC_exclude_static_roots_inner().
+* mark_rts.c (GC_remove_roots): Quickly check the bounds and return
+in case of a do-nothing case (before acquiring the lock).
+
+* finalize.c (GC_fail_count): New external variable declaration.
+* finalize.c (GC_reset_finalizer_nested,
+GC_check_finalizer_nested): New function declarations (if THREADS
+only).
+* finalize.c (GC_finalizer_nested, GC_finalizer_skipped): New
+static global variables (used internally by GC_finalize() and
+GC_check_finalizer_nested()).
+* finalize.c (GC_check_finalizer_nested): New static function
+definition (only if not THREADS, used internally by
+GC_notify_or_invoke_finalizers() to minimize the probability of
+a deep recursion when a client finalizer tries to allocate GC
+memory).
+* finalize.c (GC_finalize): Reset GC_finalizer_nested value (or
+call GC_reset_finalizer_nested()) if last heap expansion failed.
+* finalize.c (GC_notify_or_invoke_finalizers): Access GC_gc_no,
+GC_finalizer_now, GC_finalize_on_demand, GC_finalizer_notifier,
+last_finalizer_notification variables holding the lock (to avoid
+data races).
+* finalize.c (GC_finalizer_notifier): Add comment.
+* finalize.c (GC_notify_or_invoke_finalizers): Add "quick" check
+for an empty finalization queue (only if THREADS and not
+KEEP_BACK_PTRS/MAKE_BACK_GRAPH).
+* finalize.c (GC_notify_or_invoke_finalizers): Call
+GC_check_finalizer_nested() and skip GC_invoke_finalizers() call
+if appropriate.
+* include/private/pthread_support.h (GC_Thread_Rep): Add unsigned
+finalizer_nested and finalizer_skipped fields (for internal use
+by the multi-threaded GC_check_finalizer_nested()).
+* win32_threads.c (GC_Thread_Rep): Likewise.
+* pthread_support.c (GC_reset_finalizer_nested,
+GC_check_finalizer_nested): New function definitions (the
+multi-threaded variants of that in finalize.c).
+* win32_threads.c (GC_reset_finalizer_nested,
+GC_check_finalizer_nested): Likewise.
+
+* alloc.c (GC_stopped_mark): Remove GC_log_printf("") (not needed
+anymore and GCC produces a warning for it).
+* alloc.c (GC_stopped_mark): Adjust printf argument type
+specifier.
+* backgraph.c: Include dbg_mlc.h before ifdef MAKE_BACK_GRAPH (for
+the case when the configuration information comes from a config.h
+file).
+* checksums.c: Likewise.
+* include/gc_allocator.h (GC_ATTR_UNUSED): Use "__unused__"
+keyword instead of "unused".
+* include/gc_allocator.h: Fix typos in comments.
+* thread_local_alloc.c: Likewise.
+* include/javaxfc.h (GC_finalize_all): Update comment.
+* include/private/gc_priv.h (GC_API_PRIV): New macro (defined as
+GC_API and serves only as a marker for the private but exported
+symbols used by test.c only).
+* include/private/gc_priv.h (GC_abort, GC_arrays, GC_is_marked,
+GC_printf, GC_err_printf, GC_log_printf): Replace GC_API decl with
+GC_API_PRIV one.
+* include/private/gc_priv.h (GC_fo_entries): Don't export it
+outside a DLL.
+* include/private/gc_priv.h (GC_ATTR_FORMAT_PRINTF): New macro
+designated to check the arguments correctness of printf-like
+functions (currently works only for GCC v3+).
+* include/private/gc_priv.h (GC_printf, GC_err_printf,
+GC_log_printf): Use GC_ATTR_FORMAT_PRINTF attribute.
+
+* dyn_load.c (HAVE_DL_ITERATE_PHDR): Break definition from use.
+Define for FreeBSD 7.0+.
+
+* mach_dep.c: Don't include ucontext.h with NO_GETCONTEXT.
+
+* include/gc_gcj.h (GC_init_gcj_malloc): Improve descriptive
+comment.
+
+* allchblk.c (GC_merge_unmapped): Don't assume that adjacent
+free blocks have different mapping status. Correctly handle gap
+between blocks.
+(GC_split_block): Remove dead code setting hb_flags. Add comment.
+(GC_allochblk): Split blocks also in generational-only mode.
+* os_dep.c (GC_unmap_gap): Don't really use munmap.
+
+* include/private/gc_priv.h (GC_unmapped_bytes): Define as 0 for
+not USE_MUNMAP case.
+
+* Makefile.direct (MARK_BIT_PER_OBJ, PRINT_BLACK_LIST,
+USE_PROC_FOR_LIBRARIES): Fix typo in the comments.
+* Makefile.direct (USE_MMAP, USE_MUNMAP, THREAD_LOCAL_ALLOC,
+PARALLEL_MARK, STATIC): Update the comments.
+* include/private/gcconfig.h (GC_PREFER_MPROTECT_VDB): New macro
+recognized (only if MPROTECT_VDB).
+* Makefile.direct (DONT_USE_USER32_DLL, GC_PREFER_MPROTECT_VDB):
+Add the comments for.
+* os_dep.c (detect_GetWriteWatch): Recognize "GC_USE_GETWRITEWATCH"
+environment variable (only if MPROTECT_VDB, if the variable is
+unset when GC_PREFER_MPROTECT_VDB macro controls the strategy).
+* doc/README.environment (GC_USE_GETWRITEWATCH): New variable.
+* include/private/gcconfig.h (MPROTECT_VDB): Add FIXME for
+USE_MUNMAP and PARALLEL_MARK cases (to relax the conditions in
+the future).
+* misc.c (GC_get_heap_size, GC_get_free_bytes): Ignore the memory
+space returned to OS (GC_unmapped_bytes).
+* include/gc.h (GC_get_heap_size, GC_get_free_bytes): Update the
+comments.
+* misc.c (GC_get_unmapped_bytes): New API function.
+* include/gc.h (GC_get_unmapped_bytes): New API prototype.
+* os_dep.c (GC_dirty_init): Move "ifdef GWW_VDB" block out of
+"ifdef MSWIN32" one (for Cygwin).
+
+* pthread_support.c (GC_allow_register_threads): New API function.
+* win32_threads.c (GC_allow_register_threads): Likewise.
+* include/gc.h (GC_allow_register_threads): New API prototype.
+* include/gc.h (GC_register_my_thread, GC_unregister_my_thread):
+Update the comments.
+* pthread_support.c (GC_register_my_thread): Check the collector
+is in the multi-threaded mode.
+* win32_threads.c (GC_register_my_thread): Likewise.
+
+* finalize.c (GC_finalize_all): Always call GC_invoke_finalizers
+instead, following Ivan's original patch.
+
+* allchblk.c (GC_allochblk_nth): Add assertion.
+* checksums.c: Add GC_record_fault, GC_was_faulted,
+CC_n_faulted_dirty_errors.
+(GC_check_dirty): Remove register declarations, print
+dirty bit errors on faulted pages.
+* os_dep.c (GC_write_fault_handler): Call GC_record_fault().
+* os_dep.c (GC_remove_protection): Compute index correctly.
+
+
+== [7.2alpha2] 2009-06-12 ==
+
+* dbg_mlc.c (GC_print_smashed_obj): Convert a group of printf()
+calls into a single one (for output atomicity).
+* typd_mlc.c (GC_calloc_explicitly_typed): Don't declare and use
+GC_finalization_failures variable; check the result of
+GC_general_register_disappearing_link() (for lack of memory)
+instead.
+* finalize.c (GC_finalization_failures): Remove unused global
+variable.
+* finalize.c (GC_general_register_disappearing_link,
+GC_general_register_disappearing_link): Don't update the value of
+GC_finalization_failures (since unused).
+* include/private/gc_pmark.h (PUSH_ONE_CHECKED_STACK,
+GC_PUSH_ONE_STACK, GC_PUSH_ONE_HEAP): The first parameter is of
+word type now (as FIXUP_POINTER requires numeric argument).
+* finalize.c (GC_ignore_self_finalize_mark_proc): GC_PUSH_ONE_HEAP
+requires the first parameter of word type.
+* mark.c (PUSH_GRANULE): Likewise.
+* mark.c (GC_push_one, GC_push_all_eager): Likewise.
+* finalize.c (GC_finalize_all): Call GC_invoke_finalizers() or
+GC_finalizer_notifier directly, instead
+of GC_INVOKE_FINALIZERS() to prevent infinite looping.
+* include/javaxfc.h: Clarify GC_finalize_all comment.
+* gcj_mlc.c: Include gc_pmark.h before "ifdef GC_GCJ_SUPPORT" (not
+after) for configuration information.
+* gcj_mlc.c (GC_gcj_malloc_ignore_off_page): Add comment.
+* gcj_mlc.c (GC_gcj_malloc_ignore_off_page): Check "op" local
+variable for NULL before dereferencing it, return GC_oom_fn() in
+this case.
+* typd_mlc.c (GC_malloc_explicitly_typed,
+GC_malloc_explicitly_typed_ignore_off_page): Transform the code to
+suppress compiler warning (for uninitialized "lg" variable).
+
+* win32_threads.c (GC_unregister_my_thread): add false assertion
+in unreachable code.
+
+* pthread_support.c (GC_inner_start_routine): Don't release the
+GC lock between GC_register_my_thread_inner() and
+GC_init_thread_local() calls (post the "registered" even after
+calling GC_init_thread_local()).
+* win32_threads.c (GC_register_my_thread, GC_unregister_my_thread):
+Use GC_lookup_thread_inner() instead of GC_lookup_thread() and
+acquire the GC lock only once.
+* win32_threads.c (GC_thr_init): Call GC_register_my_thread_inner()
+directly instead of GC_register_my_thread() since I_HOLD_LOCK
+and our (main) thread is not registered yet (add assertion for it).
+* win32_threads.c (GC_init_parallel): Call GC_lookup_thread_inner()
+directly instead of GC_lookup_thread() (since I_HOLD_LOCK).
+* win32_threads.c (GC_lookup_thread): Remove unused function.
+* win32_threads.c: Remove "#error GC_DLL untested with Cygwin".
+* win32_threads.c (GC_win32_dll_threads): Define as FALSE macro
+also if THREAD_LOCAL_ALLOC or GC_PTHREADS.
+* win32_threads.c (GC_use_DllMain): Call ABORT also if GC_PTHREADS
+(for Cygwin).
+* win32_threads.c (GC_push_stack_for): Add parentheses around "&&"
+(inside GC_ASSERT) to prevent compiler warning.
+* win32_threads.c (GC_push_all_stacks): Remove FIXME for
+PARALLEL_MARK.
+* win32_threads.c (MAX_MARKERS, GC_markers): Move the definitions
+to a place before GC_get_next_stack().
+* win32_threads.c (marker_sp, marker_bsp): New static arrays (same
+as in pthread_support.c).
+* win32_threads.c (marker_last_stack_min): New static arrays (the
+same semantics as for last_stack_min of GC_Thread_Rep).
+* win32_threads.c (GC_get_next_stack): Handle marker threads.
+* win32_threads.c (GC_mark_thread): Save the current stack pointer
+to marker_[b]sp.
+* win32_threads.c (start_mark_threads): Initialize
+marker_last_stack_min elements (to "unset" value).
+
+* misc.c (GC_set_oom_fn, GC_set_all_interior_pointers,
+GC_set_finalize_on_demand, GC_set_java_finalization,
+GC_set_finalizer_notifier, GC_set_dont_expand, GC_set_full_freq,
+GC_set_no_dls, GC_set_free_space_divisor, GC_set_max_retries,
+GC_set_dont_precollect, GC_set_time_limit, GC_set_warn_proc):
+Change return type to void (these API functions no longer return
+the old value).
+* include/gc.h: Likewise.
+* tests/test.c (main, WinMain, test): Remove explicit cast to void
+for GC_set_warn_proc().
+* misc.c (GC_get_oom_fn, GC_get_all_interior_pointers,
+GC_get_finalize_on_demand, GC_get_java_finalization,
+GC_get_finalizer_notifier, GC_get_dont_expand, GC_get_full_freq,
+GC_get_no_dls, GC_get_free_space_divisor, GC_get_max_retries,
+GC_get_dont_precollect, GC_get_time_limit, GC_get_warn_proc): New
+API functions (to get the current value of the corresponding R/W
+public variables).
+* include/gc.h: Likewise.
+* include/gc.h (GC_set_warn_proc, GC_set_free_space_divisor):
+Update the comment.
+* misc.c (GC_ignore_warn_proc): New API call-back function.
+* include/gc.h (GC_ignore_warn_proc): Likewise.
+* misc.c (GC_set_find_leak, GC_get_find_leak, GC_set_non_gc_bytes,
+GC_get_non_gc_bytes): New API setter and getter functions (for the
+public GC_find_leak and GC_non_gc_bytes variables, respectively).
+* include/gc.h: Likewise.
+* include/gc.h (GC_memalign): Add proto to GC API.
+* mallocx.c (GC_memalign): Use GC_API, GC_CALL for the definition.
+* tests/test.c (run_one_test): Test GC_memalign() on Win32 too,
+remove GC_memalign() proto.
+* misc.c (GC_write): Use multi-byte (A) variants of Win32
+GetModuleFileName() and CreateFile().
+* tests/test.c (main): Replace K&R-style function definition with the
+ANSI C one.
+
+* include/private/gcconfig.h (PLATFORM_ANDROID): New macro
+recognized (for Linux on ARM32 without glibc).
+* include/private/gcconfig.h (STRTOULL): Define for all targets
+(define as "strtoul" for most targets except for LLP64/Win64).
+* misc.c (GC_init_inner): Use STRTOULL instead of atoi/atol()
+(cast the result to word type) to decode values of "GC_TRACE",
+"GC_INITIAL_HEAP_SIZE", "GC_MAXIMUM_HEAP_SIZE" environment
+variables.
+
+* include/gc_allocator.h: Add gc_allocator_ignore_off_page.
+* tests/test_cpp.cc: Add call to gc_allocator_ignore_off_page.
+
+* win32_threads.c (GC_release_mark_lock): Correct misspelling of
+AO_load in assertion.
+
+* win32_threads.c (MAX_THREADS): Define as 1 if GC_win32_dll_threads
+is defined as FALSE (otherwise the size of dll_thread_table is near
+200 KiB for 32-bit).
+* win32_threads.c (GC_use_DllMain): Optimize for THREAD_LOCAL_ALLOC.
+* win32_threads.c (GC_Thread_Rep): Add backing_store_end and
+backing_store_ptr fields for IA64 support.
+* win32_threads.c (GC_register_my_thread_inner): Set
+backing_store_end field to reg_base value for IA64 (same as in
+pthread_support.c).
+* win32_threads.c (SET_PTHREAD_MAP_CACHE): Put parentheses in the
+"right" places, remove ';'.
+* win32_threads.c (GC_fault_handler_lock): Declare only
+if MPROTECT_VDB (and not WinCE).
+* win32_threads.c (GC_suspend): Acquire and release
+GC_fault_handler_lock only if MPROTECT_VDB (and not WinCE).
+* win32_threads.c (GC_suspend): Define as STATIC.
+* win32_threads.c (GC_push_stack_for): Fix WARN() format specifier
+(should be word-compliant, "%p" is used w/o "0x"), don't cast sp.
+* win32_threads.c (GC_push_all_stacks): Convert a group of printf()
+calls into a single one (for output atomicity).
+* win32_threads.c (GC_get_next_stack): Unprotect thread descriptor
+before altering its last_stack_min ("thread" variable is added).
+* win32_threads.c (GC_get_next_stack): Remove unnecessary checks for
+"s" is non-NULL.
+* win32_threads.c (GC_get_next_stack): Don't call GC_may_be_in_stack
+if WinCE.
+* win32_threads.c (GC_get_next_stack): Pass current_min value to
+GC_get_stack_min as-is (without -1).
+* win32_threads.c (GC_wait_marker): Remove FIXME and use "release"
+version of AO_fetch_and_sub1().
+* win32_threads.c (GC_win32_start_inner, GC_win32_start): convert int
+to pointer (and vice versa) thru word type to suppress warnings.
+* win32_threads.c (GC_mark_mutex_waitcnt): Fix comment, always
+access atomically.
+* misc.c: Change GC_THREADS tests back to THREADS.
+
+* allchblk.c (GC_print_hblkfreelist, GC_dump_regions): Convert
+a group of printf() calls into a single one (for output atomicity).
+* include/gc.h (GC_set_all_interior_pointers, GC_set_full_freq,
+GC_set_time_limit): New prototypes.
+* misc.c (GC_set_all_interior_pointers, GC_set_full_freq,
+GC_set_time_limit): New public setter/getter functions.
+* include/gc.h: Fix (and remove outdated) comments for thread-local
+allocation.
+* include/gc.h: Fix typos in comments.
+* misc.c (GC_init_inner, GC_printf): Likewise.
+* include/gc.h (GC_unregister_disappearing_link): Refine comment.
+* include/gc.h (GC_stack_base): Recognize _M_IA64 macro.
+* misc.c (GC_stack_last_cleared, GC_min_sp, GC_high_water,
+GC_bytes_allocd_at_reset, DEGRADE_RATE): Define only if THREADS.
+* misc.c (GC_stack_last_cleared, GC_min_sp, GC_high_water,
+GC_bytes_allocd_at_reset): Define as STATIC.
+* misc.c (GC_get_heap_size, GC_get_free_bytes,
+GC_get_bytes_since_gc, GC_get_total_bytes): Acquire the GC lock to
+avoid data races.
+* misc.c (GC_write_cs): Define only if THREADS (Win32/WinCE only).
+* misc.c (GC_init_inner): Initialize GC_write_cs only if THREADS.
+* misc.c (GC_init_inner): Use GC_INITIAL_HEAP_SIZE (if available) to
+set the default initial value of initial_heap_sz.
+* misc.c (GC_deinit): Destroy GC_write_cs only if THREADS.
+* misc.c (GC_init_inner): Fix WARN() format specifier (should be
+word-compliant, "%p" is used w/o "0x").
+* misc.c (GC_init_inner): Don't recognize "GC_PAUSE_TIME_TARGET"
+environment variable if SMALL_CONFIG.
+* misc.c (GC_init_inner): Recognize "GC_FULL_FREQUENCY" environment
+variable to set initial GC_full_freq value (if not SMALL_CONFIG).
+* doc/README.environment (GC_FULL_FREQUENCY): Add information.
+* doc/README.environment (GC_MARKERS): Refine information.
+* misc.c (GC_init_inner): Change GC_ASSERT to GC_STATIC_ASSERT where
+possible.
+* misc.c (IF_NEED_TO_LOCK): New macro (instead of GC_need_to_lock).
+* misc.c (GC_write): Use IF_NEED_TO_LOCK for handling GC_write_cs.
+* misc.c (GC_abort): Don't define if SMALL_CONFIG.
+* misc.c (GC_abort): Directly use WRITE() instead of GC_err_printf()
+(to prevent possible infinite recursion).
+
+* finalize.c (finalization_mark_proc): Replace K&R-style declaration
+with ANSI C one.
+* finalize.c (GC_grow_table, GC_register_finalizer_inner,
+GC_enqueue_all_finalizers): Remove outdated comments about disabling
+signals.
+* finalize.c (GC_general_register_disappearing_link): Fix assertion
+to catch NULL "obj" value.
+* finalize.c (GC_unregister_disappearing_link): Check "link"
+alignment before gaining the lock.
+* finalize.c (GC_finalize): Refine comment.
+* finalize.c (GC_finalize): Fix WARN() format specifier (should be
+word-compliant, "%p" is used w/o "0x").
+* finalize.c (GC_invoke_finalizers): Initialize "bytes_freed_before"
+variable (to 0) to suppress compiler warning.
+* include/gc_gcj.h (MARK_DESCR_OFFSET): Move to private/gc_pmark.h.
+* include/gc_gcj.h: add "extern C" header and tail.
+* include/private/gc_pmark.h: Remove GC_do_parallel_mark(),
+GC_help_wanted, GC_helper_count, GC_active_count declarations (move
+the comments to the place where these symbols are defined in mark.c).
+* mark.c: Add STATIC GC_do_parallel_mark() declaration (for use by
+GC_mark_some_inner, if PARALLEL_MARK only).
+* mark.c (GC_mark_some_inner, GC_help_wanted, GC_helper_count,
+GC_active_count, GC_do_parallel_mark): Define as STATIC.
+* pthread_support.c (GC_mark_thread): Likewise.
+* typd_mlc.c (GC_explicit_typing_initialized, GC_explicit_kind,
+GC_array_kind, GC_ext_descriptors, GC_ed_size, GC_avail_descr,
+GC_typed_mark_proc_index, GC_array_mark_proc_index, GC_eobjfreelist,
+GC_arobjfreelist): Likewise.
+* include/private/gc_pmark.h (PUSH_CONTENTS_HDR): Change GC_ASSERT
+for HBLKSIZE to GC_STATIC_ASSERT.
+* mark.c (GC_noop): Define for Borland C the same as for Watcom.
+* mark.c (GC_noop, GC_mark_and_push): Add ARGSUSED tag.
+* pthread_support.c (GC_do_blocking_inner): Likewise.
+* mark.c (GC_mark_from): Initialize "limit" (to 0) in the default
+switch branch to suppress compiler warning.
+* mark.c (GC_return_mark_stack): Append new-line to printf message.
+* mark.c: Remove unused GC_true_func(), GC_PUSH_ALL().
+* pthread_support.c (GC_mark_thread): Add dummy "return 0" to
+suppress compiler warning.
+* pthread_support.c (start_mark_threads): Move the code limiting
+"GC_markers" value (and printing a warning) to GC_thr_init().
+* pthread_support.c (GC_thr_init): Silently limit "GC_markers" value
+if based on the number of CPUs.
+* pthread_support.c (GC_thr_init): Treat incorrect "GC_markers"
+values as one.
+* pthread_support.c (GC_register_my_thread_inner): Add a check for
+"stack_end" is non-NULL (the same as in win32_threads.c).
+* pthread_support.c (pthread_create): Call GC_oom_fn before giving up
+with ENOMEM.
+* thread_local_alloc.c (return_single_freelist): Convert "for" loop
+to "while" one to suppress "possible extraneous ';'" warning.
+
+* darwin_stop_world.c (GC_push_all_stacks): Recognize ARM32.
+* include/private/gc_priv.h (GC_THREAD_STATE_T): Define for ARM32
+(Darwin only).
+* include/private/gcconfig.h: Add machine-specific part for DARWIN.
+* include/private/gcconfig.h (ARM32): Define config parameters for
+DARWIN (iPhone).
+
+* alloc.c (GC_FULL_FREQ, GC_DONT_EXPAND, GC_FREE_SPACE_DIVISOR,
+GC_TIME_LIMIT): New macros (used to control the default initial
+values of GC_full_freq variable, GC_dont_expand,
+GC_free_space_divisor, GC_time_limit respectively).
+* include/private/gc_priv.h (TIME_LIMIT): Remove macro (replaced
+with GC_TIME_LIMIT in alloc.c).
+* alloc.c (GC_need_full_gc, GC_stopped_mark, GC_finish_collection):
+Define as STATIC.
+* mark_rts.c (GC_push_current_stack, GC_push_gc_structures): Likewise.
+* include/private/gc_priv.h (GC_stopped_mark, GC_finish_collection):
+Move the prototypes to alloc.c, make STATIC.
+* include/private/gc_priv.h (GC_push_current_stack,
+GC_push_gc_structures, GC_push_regs_and_stack): Remove prototypes
+(move the comments to the places where these functions are defined).
+* mach_dep.c (GC_push_regs_and_stack): Move to mark_rts.c and define
+as STATIC.
+* alloc.c (GC_timeout_stop_func, GC_stopped_mark,
+GC_print_heap_sects): Convert a group of printf() calls into
+a single one (for output atomicity).
+* mark_rts.c (GC_print_static_roots): Likewise.
+* alloc.c (GC_stopped_mark): Output blank line (when logging) for
+convenience to delimit collections.
+* alloc.c (GC_clear_a_few_frames): Rename NWORDS to CLEAR_NWORDS;
+make "frames" local variable volatile (to prevent optimization).
+* alloc.c (GC_try_to_collect_inner, GC_stopped_mark,
+GC_finish_collection, GC_allocobj): Remove outdated comments about
+disabling signals.
+* include/private/gc_priv.h (GC_register_displacement_inner,
+GC_gcollect_inner): Likewise.
+* alloc.c (GC_try_to_collect_inner, GC_stopped_mark,
+GC_finish_collection): Initialize "start_time" local variable (to 0)
+to suppress compiler warning.
+* mark_rts.c (GC_add_roots_inner): Likewise.
+* alloc.c (GC_RATE, MAX_PRIOR_ATTEMPTS): Guard with "ifndef".
+* include/private/gc_priv.h (clock, GC_stop_world, GC_start_world,
+GC_acquire_mark_lock, GC_release_mark_lock, GC_notify_all_builder,
+GC_wait_for_reclaim, GC_notify_all_marker, GC_wait_marker): Replace
+K&R-style function prototypes with ANSI C one.
+* include/private/gc_priv.h (ABORT): Define as DebugBreak() for
+Win32/WinCE if SMALL_CONFIG (the same as in GC_abort()).
+* include/private/gc_priv.h (ROUNDED_UP_WORDS, abs): Remove unused
+macros.
+* include/private/gc_priv.h (GC_noop): Declare for Borland C the
+same as for Watcom.
+* mark_rts.c (GC_push_conditional_with_exclusions): Add ARGSUSED tag.
+
+* dbg_mlc.c (GC_store_debug_info, GC_store_debug_info_inner): Remove
+outdated comment about disabling signals.
+* mallocx.c (GC_malloc_uncollectable,
+GC_malloc_atomic_uncollectable): Likewise.
+* os_dep.c: Likewise.
+* dbg_mlc.c (GC_debug_change_stubborn, GC_debug_end_stubborn_change):
+Add ARGSUSED tag.
+* pthread_stop_world.c (GC_suspend_handler,
+GC_suspend_handler_inner): Likewise.
+* dbg_mlc.c (GC_debug_free, GC_debug_realloc): Fix printf message.
+* dbg_mlc.c (GC_debug_realloc): Set "result" to NULL in the default
+switch branch to suppress compiler warning.
+* dyn_load.c (GC_init_dyld): Use ABORT() instead of GC_abort().
+* include/private/darwin_semaphore.h (sem_init): Likewise.
+* include/javaxfc.h: Replace "GC_H" with "_GC_H".
+* include/private/dbg_mlc.h (GC_has_other_debug_info,
+GC_store_debug_info): Replace K&R-style function prototypes with ANSI
+C one.
+* include/private/gcconfig.h (GC_FreeBSDGetDataStart, real_malloc,
+GC_win32_get_mem, GC_wince_get_mem, GC_unix_get_mem): Likewise.
+* include/private/pthread_support.h (GC_stop_init): Likewise.
+* include/private/gcconfig.h: Refine comment about setting
+GC_stackbottom.
+* include/private/gcconfig.h (FIXUP_POINTER): Put parentheses in the
+"right" places.
+* include/private/pthread_support.h (GC_Thread_Rep): Refine comment
+for "stack_end" field.
+* mallocx.c (GC_malloc_uncollectable,
+GC_malloc_atomic_uncollectable): Remove cast to undefined "hbklk".
+* os_dep.c (GC_USE_MEM_TOP_DOWN): New macro (for setting
+GC_mem_top_down to MEM_TOP_DOWN for debug purposes).
+* os_dep.c (GC_gww_read_dirty, catch_exception_raise): Fix WARN()
+format specifier (should be word-compliant, "%p" is used w/o "0x").
+* pthread_stop_world.c (GC_suspend_handler_inner): Likewise.
+* os_dep.c (GC_dirty_init): Append new-line to printf messages.
+* os_dep.c (GC_mprotect_thread): Fix GC_err_printf message.
+* os_dep.c (GC_save_callers): Change GC_ASSERT to GC_STATIC_ASSERT.
+* pthread_stop_world.c (GC_retry_signals, GC_suspend_ack_sem): Define
+as STATIC.
+* pthread_stop_world.c (GC_push_all_stacks): Add assertion for that
+"thread_blocked" is not set for the current thread.
+* real_malloc.c: Add "extern GC_quiet" to suppress compiler warning.
+* reclaim.c (GC_reclaim_all): Initialize "start_time" (to 0) to
+suppress compiler warning.
+
+* tests/test.c (check_heap_stats): Avoid unbalanced brackets in ifdef.
+
+* win32_threads.c: restructure parallel marking mutex initialization.
+* win32_threads.c, alloc.c, darwin_stop_world.c, mallocx.c, mark.c,
+pthread_stop_world.c, pthread_support.c: Add runtime conditions
+on GC_parallel were appropriate.
+* pthread_support.c: Condition marker_bsp on ia64.
+(GC_segment_is_thread_stack): Fix loop upper bound.
+* reclaim.c: Limit some assertions to PARALLEL_MARK.
+* pthread_support.c: Don't acquire mark lock for thread-local
+allocation.
+* include/private/gc_priv.h: Don't define parallel mark sync
+support just for THREAD_LOCAL_ALLOC.
+
+* include/private/gcconfig.h: refine MINGW32 test.
+* mark.c: Add win64/gcc tests.
+
+* test.c (fork_a_thread, reverse_test, alloc8bytes, tree_test,
+typed_test, run_one_test, check_heap_stats, main, test): Replace
+all K&R-style function definitions with ANSI C ones.
+* trace_test.c (main): Likewise.
+* test.c (GC_COND_INIT): Define as GC_INIT() also in case of
+THREAD_LOCAL_ALLOC.
+* test.c (reverse_test): Call fork_a_thread() only if GC_PTHREADS
+or GC_WIN32_THREADS; remove fork_a_thread() macros definition.
+* test.c (reverse_test): Use "volatile" when clearing "b" and "c"
+local variables (to suppress "assigned value is never used"
+compiler warning).
+* test.c (tree_test): Use public GC_noop1() instead of private
+GC_noop().
+* test.c (typed_test): Likewise.
+* test.c (check_heap_stats): Define and assign value to
+"late_finalize_count" local variable only if its value is used
+(if FINALIZE_ON_DEMAND defined).
+* test.c (main): Remove DJGPP-specific initialization of
+GC_stackbottom (not needed anymore, handled in gcconfig.h).
+* trace_test.c: Guard #define GC_DEBUG with #ifndef.
+* trace_test.c: Include "gc_backptr.h".
+* trace_test.c (main): Call GC_INIT().
+* trace_test.c (main): Add "return 0" statement.
+
+* dyn_load.c (GC_register_dynlib_callback): Use new index j
+instead of i in the inner loop.
+
+* tests/test.c: Increment n_tests with fetch_and_add when possible,
+avoiding need to export lock.
+
+* include/gc_pthread_redirects.h:
+- dlfcn.h is included for dlopen() proto before undefining
+"dlopen" (so, it's possible now to include dlfcn.h after
+gc.h from user code);
+- GC_dlopen() proto is added (except for Darwin as
+it's missing there);
+- "dlopen" is explicitly undefined (before its redefinition).
+* include/gc.h:
+- "process.h" is included besides "windows.h"
+(for _beginthreadex/_endthreadex); win32 only.
+- GC_NO_THREAD_DECLS is moved to the right place
+(before closing "extern C").
+* pthread_support.c: Fix out of memory handling for Thread_Reps.
+* win32_threads.c: Don't include process.h on winCE,
+improve out of memory handling for thread structures, don't
+define GC_beginthreadex and GC_endthreadex for winCE.
+
+* tests/test.c: Change gcj vtable decriptor type from size_t to
+GC_word.
+
+* gcj_mlc.c: Add comment.
+* tests/test.c: Change NTEST to NTHREADS. Fork 5 threads by default.
+Run reverse_test a second time in each thread.Add comments.
+Don't rely on AO_fetch_and_add.
+
+* dyn_load.c (GC_register_dynlib_callback,
+GC_register_dynamic_libraries_dl_iterate_phdr): Add support
+for GNU_PT_RELRO relocations.
+
+* Makefile, Makefile.direct: GC_SOLARIS_PTHREADS was replaced
+by GC_SOLARIS_THREADS.
+* include/gc.h: Improve finalizer documentation.
+* mips_sgi_mach_dep.s: Replace _MIPS_SIM_ABI32 with _ABIO32.
+* pthread_stop_world.c, Makefile.dj: Fix typos.
+
+* win32_threads.c (GC_new_thread): Make first_thread
+visible to the whole file.
+(UNPROTECT): New macro.
+(GC_push_stack_for, GC_suspend, GC_start_world): unprotect
+thread structures before writing.
+(GC_suspend): Acquire GC_fault_handler_lock before suspending
+thread.
+* os_dep.c: export GC_fault_handler_lock.
+(GC_remove_protection): Check if already unprotected.
+
+* doc/README.win32: Add OpenWatcom warning.
+* include/private/gcconfig.h: Really check it in.
+
+* os_dep.c (GC_get_stack_base, windows): Replace with Dave Korn's
+code from gcc version.
+* os_dep.c: make gc compilable (optionally) for Cygwin with
+GetWriteWatch-based virtual dirty bit implementation ("os_dep.c" file).
+* os_dep.c: Make non-win32 GC_write_fault_handler STATIC.
+* mark.c (GC_noop): fix declaration definition mismatch for DMC.
+* include/private/gcconfig.h: Enable MPROTECT_VDB and GWW_VDB for
+Watcom (Win32 only). It works.
+
+* mach_dep.c: Don't use __builtin_unwind_init for register
+state on PowerPC/Darwin.
+
+* doc/gcdescr.html: Improve description of object freelist
+structure.
+* include/private/gc_priv.h: Fix comment for _size_map.
+
+* os_dep.c (GC_linux_stack_base): Relax sanity test.
+
+* include/private/gc_pmark.h (PUSH_CONTENTS_HDR for
+MARK_BIT_PER_OBJ): Add missing backslash before eoln.
+
+* misc.c (GC_set_warn_proc): Implicitly initialize GC on
+non-Cygwin win32.
+
+* configure.ac: Enable thread-local allocation for sparc-linux.
+
+* alloc.c (GC_try_to_collect): Remove duplicate initialization
+check.
+* malloc.c (GC_generic_malloc): Remove lw to eliminate single-
+threaded warnings.
+* mallocx.c (GC_generic_malloc_ignore_off_page): Likewise.
+
+* allchblk.c, backgraph.c, dbg_mlc.c, dyn_load.c,
+finalize.c, include/private/gc_pmark.h, malloc.c, mark.c,
+os_dep.c, pthread_stop_world.c, pthread_support.c, reclaim.c,
+thread_local_alloc.c.
+* misc.c: Refine comment.
+
+* os_dep.c: Define GC_GWW_BUF_LEN more intelligently. Add FIXME
+comment.
+
+* win32_threads.c (GC_push_stack_for): Yet another attempt
+at the stack_min finding logic. Try to clean up the existing code
+while minimizing VirtualQuery calls.
+(GC_win32_start_inner): Register thread before GC_printf.
+Produce more output with DEBUG_THREADS.
+*include/gc.h: Update obsolete comments.
+
+* tests/test.c:
+(gcj_class_struct2): Use cast instead of l suffix.
+Cast GetLastError to int in various places.
+Avoid unused result warning from incr/decr macros.
+Add cast for fake_gcj_mark_proc.
+Cast GC_gc_no to unsigned in printf.
+
+* include/gc.h: Fix two typos in comments.
+
+* finalize.c: Fix typo in comment.
+
+* blacklst.c (GC_print_source_pointer): Don't call GC_print_heap_obj
+with lock.
+
+* reclaim.c: (GC_reclaim_block): Scan even nearly full blocks
+if we are checking for leaks.
+
+* win32_threads.c: Remove mark lock spinning.
+* win32_threads.c, pthread_support.c: Update GC_unlocked_count,
+GC_spin_count, and GC_block_count using atomic operations.
+* tests/test.c: Declare n_tests as AO_t only if we have threads.
+
+* win32_threads.c: Support PARALLEL_MARK. Make printf arg
+types agree with format specifiers.
+Add STATIC for GC_threads.
+* include/private/gcconfig.h: Add FIXME comment.
+* tests/test.c (run_ine_test): Replace LOCK/UNLOCK use with
+AO_fetch_and_add1_full. Declare n_tests as AO_t.
+(WinMain): Don't call GC_use_DllMain.
+with PARALLEL_MARK or THREAD_LOCAL_ALLOC.
+
+* alloc.c (GC_try_to_collect_inner): Don't print redundant
+GC_bytes_allocd and GC_gc_no.
+(GC_stopped_mark): Print average world stop time.
+* include/private/gc_priv.h (MS_TIME_DIFF): Add cast.
+
+* misc.c, doc/README.environment: Add support for
+GC_FREE_SPACE_DIVISOR and GC-disable-incremental.
+* include/gc.h: Make GC_set_free_space_divisor correspond to
+(somewhat unfortunate) reality.
+
+(Mostly improves LLP64 support.)
+* backgraph.c, checksums.c, dbg_mlc.c, finalize.c, mark.c,
+misc.c, reclaim.c: Changed some int and long type to word or size_t
+(and vice versa where appropriate)
+* gcj_mlc.c, include/private/dbg_mlc.h, include/private/gcconfig.h,
+include/private/thread_local_alloc.h, mark.c,
+misc.c, thread_local_alloc.c, win32_threads.c: Added intermediate
+casts to word type when casting from int to pointer (or pointer
+to int, or data pointer to code pointer) - just to remove the
+corresponding compiler warning.
+* ptr_chck.c (GC_is_visible): cast int const to word type to
+prevent left shift overflow.
+* os_dep.c: change the type of GC_mem_top_down global variable
+(containing a flag) to DWORD.
+* include/gc_config_macros.h: define GC_SOLARIS_THREADS if GC_THREADS
+is defined on SunOS/x64.
+* misc.c (GC_init_size_map): Ifdef out GC_ASSERT as a workaround
+for VC++ 2008 x64 (v15.00.21022.08 for x64) compiler bug
+(the compiler gets hung if invoked with -Ox -D
+ALL_INTERIOR_POINTERS -D GC_ASSERTIONS)
+* backgraph.c: cast GC_gc_no value to unsigned short when
+assigned/compared to height_gc_no field of back_edges.
+* os_dep.c (GC_remove_protection): Add ARGSUSED.
+* win32_threads.c (GC_thread_exit_proc): Remove unused local
+variable.
+* mark.c (GC_check_dirty): Move declaration out of func body.
+
+* doc/gcinterface.html: Improve REDIRECT_MALLOC documentation.
+* include/gc.h (GC_register_my_thread): Improve comment.
+
+* Makefile.direct: Add comment for -DCHECKSUMS.
+
+* thread_local_alloc.c, include/private/thread_local_alloc.h:
+Fix typos in comments.
+* finalize.c: Declare mark_procs and GC_register_finalizer_inner
+STATIC.
+* malloc.c (GC_free): Move size calculation below assertion.
+
+* win32_threads.c (GC_get_stack_min, GC_may_be_in_stack):
+Add one entry VirtualQuery cache, I_HOLD_LOCK assertions.
+(GC_push_stack_for, GC_get_next_stack) : Hopefully fix WINCE support.
+
+* finalize.c (GC_general_register_disappearing_link): Add
+assertion.
+* malloc.c (GC_generic_malloc): Round lb to granules, not words.
+* mallocx.c (GC_generic_malloc_ignore_off_page): Round lb to
+granules, not words.
+
+* mach_dep.c (NO_GETCONTEXT): Define for sparc linux.
+* configure.ac: Define mach_dep for sparc-linux.
+
+* mark_rts.c (GC_approx_sp): Use volatile to avoid common
+warning.
+
+* dyn_load.c (GC_cond_add_roots): Fix GC_get_next_stack argument
+order.
+
+* alloc.c, dbg_mlc.c, dyn_load.c, finalize.c, gcj_mlc.c,
+include/gc.h, include/gc_config_macros.h, include/gc_cpp.h,
+include/gc_gcj.h, include/gc_mark.h, include/gc_typed.h,
+include/javaxfc.h, include/private/gc_locks.h,
+include/private/gc_priv.h, malloc.c, mallocx.c, mark.c, mark_rts.c,
+misc.c, obj_map.c, os_dep.c, pthread_support.c, ptr_chck.c,
+stubborn.c, tests/test.c, thread_local_alloc.c, typd_mlc.c
+win32_threads.c: Add GC_CALL and GC_CALLBACK macro invocations.
+* test.c: Remove some old K&R code.
+
+* win32_threads.c (GC_may_be_in_stack): New. (GC_Thread_Rep):
+Add last_stack_min. (GC_push_stack_for): Use last_stack_min.
+(GC_get_next_stack): Add limit argument, use_last_stack_min.
+(GC_suspend): make stack_base assignment conditional.
+* dyn_load.c (win32 GC_cod_add_roots): Pass limit to
+GC_get_next_stack.
+* configure_atomic_ops.sh: Remove.
+* build_atomic_ops.sh, build_atomic_ops.sh.cygwin, doc/README.win32,
+Makefile.direct: Partially support build directories whose path
+name contains blanks.
+* Makefile.am: Support new files (build_atomic_ops.sh,
+build_atomic_ops.sh.cygwin)
+
+* include/private/gc_locks.h, include/private/gc_pmark.h,
+include/private/gc_priv.h, include/private/gcconfig.h,
+mach_dep.c, mark_rts.c, misc.c, os_dep.c, pthread_stop_world.c,
+pthread_support.c, thread_local_alloc.c, typd_mlc.c, win32_threads.c:
+Fix comments.
+
+* pthread_support.c: Comment out LOCK_STATS.
+* include/gc.h: Fix comments.
+
+* misc.c (GC_init_inner): Enable GC_LOG_FILE on Cygwin.
+* include/private/gcconfig.h: Consider USE_MMAP for Cygwin.
+* os_dep.c (GC_get_main_stack_base): Use alternate definition
+with USE_MMAP.
+* include/private/gc_priv.h: Sometimes define SETJMP on Cygwin.
+
+* doc/README: Make it clearer when Makefile.direct is assumed.
+* cord/cord.am: install include/cord.h.
+
+* win32_threads.c (GC_pthread_join, GC_pthread_start_inner):
+Remove unused variables.
+* darwin_stop_world.c: Always declare GC_thr_init().
+* dbg_mlc.c (GC_debug_free_inner): Don't touch oh_sz if
+SHORT_DBG_HDRS is defined.
+* include/private/gc_pmark.h (OR_WORD_EXIT_IF_SET, parallel
+mark, USE_MARK_BITS version): Refer to correct parameter name.
+
+* finalize.c (GC_general_register_disappearing_link): Remove
+redundant code.
+* gcj_mlc.c (GC_init_gcj_malloc): Add cast to signed.
+* os_dep.c: (GC_write_fault_handler): Remove remaining
+references to deleted variable "code". Remove redundant
+FREEBSD definitions.
+* include/private/gcconfig.h (GWW_VDB): Define for X86_64 when
+defined for x86. (STATIC): Define as "static" with NO_DEBUGGING.
+
+* include/private/gc_priv.h: Update MAX_HEAP_SECTS.
+
+* dbg_mlc.c (GC_print_smashed_obj): Increase robustness with
+smashed string, (GC_debug_free_inner): Mark as free.
+* mallocx.c (GC_malloc_many): Always clear new block if
+GC_debugging_started.
+* reclaim.c: Move GC_debugging_started from
+GC_reclaim_small_nonempty_block() to GC_reclaim_generic(),
+which is also called directly.
+* doc/README: Fix spelling error. Update license summary.
+* include/gc.h (GC_PRE_INCR3, GC_POST_INCR3): add (void **) casts.
+* tests/test.c: Don't define GC_DEBUG if already defined.
+
+* doc/simple_example.html: update --enable-full-debug reference,
+Make HTML formatting standards compliant.
+* doc/debugging.html, doc/leak.html: Fix HTML formatting bugs.
+* doc/gcinterface.html: specify encoding.
+
+* doc/simple_example.html: Update thread-local allocation
+description.
+
+* configure.ac: Check for gc-debug earlier; replace remaining
+full-debug tests.
+* include/gc.h, ptr_chck.c (GC_pre_incr, GC_post_incr):
+Use signed offset type. Use ptr_t internally.
+* doc/gcinterface.html: Update LOCAL_MALLOC description.
+* doc/README.autoconf, doc/leak.html, doc/README.DGUX386:
+Fix full-debug reference.
+* include/gc.h: Rewrite GC_..._INCR and friends.
+* tests/test.c: Minimally test GC_..._INCR and friends.
+
+* mark.c: (GC_push_next_marked, GC_push_next_marked_dirty,
+GC_push_next_marked_uncollectable): Never invoke GC_push_marked
+on free hblk.
+* headers.c: Test COUNT_HDR_CACHE_HITS not USE_HDR_CACHE.
+(GC_header_cache_miss): Always blacklist pointers for free
+hblks. Add assertion and comment.
+* pthread_support.c (GC_register_my_thread): Fix #if indentation.
+* include/private/gc_hdrs.h: USE_HDR_CACHE is no longer tested.
+Delete it.
+* include/private/gc_pmark.h: (PUSH_OBJ): Add assertion.
+
+* alloc.c, include/gc_mark.h, Makefile.direct: Improve comments.
+
+* configure.ac: Set win32_threads on MinGW.
+
+Ivan's description of the patch follows. Note that a few pieces like
+the GC_malloc(0) patch, were not applied since an alternate had been
+previously applied. A few differed stylistically from the rest of
+the code (mostly casts to void * instead of target type),
+or were classified as too minor to bother. Note that
+all of Ivan's static declarations which did not correct outright
+naming bugs (as a few did), where replaced by STATIC, which is
+ignored by default.
+
+- minor bug fixing (for FreeBSD, for THREAD_LOCAL_ALLOC and for
+GC_malloc(0));
+- addition of missing getter/setter functions for public variables
+(may be useful if compiled as Win32 DLL);
+- addition of missing GC_API for some exported functions;
+- addition of missing "static" declarator for internal functions
+and variables (where possible);
+- replacement of all remaining K&R-style definitions with ANSI
+C ones (__STDC__ macro is not used anymore);
+- addition of some Win32 macro definitions (that may be missing in
+the standard headers supplied with a compiler) for GWW_VDB mode;
+- elimination of most compiler warnings (except for
+"uninitialized data" warning);
+- several typos correction;
+- missing parenthesis addition in macros in some header files of
+"libatomic_ops" module.
+
+My highlights based on reading the patch:
+
+* allchblk.c: Remove GC_freehblk_ptr decl.
+Make free_list_index_of() static.
+* include/gc.h: Use __int64 on Win64, define GC_oom_func,
+GC_finalizer_notifier_proc, GC_finalizer_notifier_proc,
+add getter and setters: GC_get_gc_no, GC_get_parallel,
+GC_set_oom_fn, GC_set_finalize_on_demand,
+GC_set_java_finalization, GC_set_dont_expand,
+GC_set_no_dls, GC_set_max_retries, GC_set_dont_precollect,
+GC_set_finalizer_notifier. Always define GC_win32_free_heap.
+gc_config_macros.h: Define _REENTRANT after processing
+GC_THREADS.
+* include/gc_cpp.h: Improve GC_PLACEMENT_DELETE test,
+handling of operator new[] for old Windows compilers.
+* include/gc_inline.h (GC_MALLOC_FAST_GRANS): Add parentheses
+around arguments.
+* dbg_mlc.c, malloc.c, misc.c: Add many GC_API specs.
+* mark.c (GC_mark_and_push_stack): Fix source argument for
+blacklist printing.
+* misc.c: Fix log file naming based on environment variable
+for Windows. Make GC_set_warn_proc and GC_set_free_space_divisor
+just return current value with 0 argument. Add DONT_USE_USER32_DLL.
+Add various getters and setters as in gc.h.
+* os_dep.c: Remove no longer used GC_disable/enable_signals
+implementations. (GC_get_stack_base): Add pthread_attr_destroy
+call. No longer set GC_old_bus_handler in DARWIN workaround.
+* pthread_support.c: GC_register_my_thread must also
+call GC_init_thread_local.
+
+* Makefile.direct, mach_dep.c: Add support for NO_GETCONTEXT.
+* mach_dep.c: Include signal.h.
+* gc_priv.h: Factor out INLINE declaration.
+
+* include/private/gcconfig.h: Update MIPS/LINUX config.
+* doc/gcdescr.html: Fix typo.
+* mach_dep.c (GC_with_callee_saves_pushed): Don't rely on getcontext
+for MIPS/LINUX.
+
+* configure.ac: SPARC fixes.
+* thread_local_alloc.c(GC_mark_thread_local_fls_for): Include
+size 0, except for gcj.
+* doc/gc.man: Expand C++ cautions.
+* include/gc_inline.h: Fix comments.
+
+
+== [7.1] 2008-05-03 ==
+
+* doc/gcinterface.html: Improve C++ interface documentation.
+
+* allchblk.c (GC_allochblk): Check for overflow during size
+rounding.
+* tests/huge_test.c: New.
+* Makefile.direct, tests/tests.am: Add huge_test.c
+
+* pthread_support.c: Fix typo in comment.
+* os_dep.c (GC_win32_get_mem): Add heap section only if
+allocation succeeded.
+
+* malloc.c: (free replacement) Fix caller address space check.
+
+* finalize.c (GC_grow_table): Dereference table in null-check.
+
+* win32_threads.c (GC_delete_gc_thread, GC_delete_thread):
+Consistently call CloseHandle. (GC_suspend): Call
+GC_delete_gc_thread.
+* tests/test.c: Don't reference GC_print_stats if not exported.
+
+* tests/test.c (run_one_test): Don't mention pthread_self().
+* misc.c: Declare GC_thr_init().
+
+* allchblk.c (add_to_fl): disable assertions with USE_MUNMAP,
+and refine assertions to handle huge unmergeable blocks.
+(GC_allochblk_nth): Add comment.
+
+* include/private/gcconfig.h: Add missing FREEBSD macro
+consistency test.
+
+* allchblk.c (GC_enough_large_bytes_left): No longer take
+parameters; return free list index bound.
+(GC_merge_unmapped): Don't access nexthdr until after null test.
+(Fixes bug in 1/29/08 check-in.) (GC_allochblk): Calculate
+when splitting is allowable only once here, not when considering each
+block. (GC_allochblk_nth): Accept new may_split parameter.
+Avoid some redundant tests for exact size matches.
+* alloc.c (GC_should_collect): Cache min_bytes_allocd.
+(GC_maybe_gc): Make locking assertion testable.
+* mark_rts.c: Fix indentation.
+* pthread_stop_world.c: Replace old GC_err_printf1 reference.
+* tests/test.c: Remove (void) casts. Optionally print some
+timing information.
+
+* windows-untested/gc.def: Remove CreateThread line.
+* windows-untested/README: New file.
+* win32_threads.c (GC_use_DllMain): Force collector initialization.
+* include/gc.h (GC_use_DllMain): Clarify usage rules in comment.
+* mark.c (GC_mark_from): Slightly simplify GC_DS_PER_OBJECT code.
+* include/gc_cpp.h: Add matching placement delete overloads
+everywhere.
+* include/private/gc_locks.h (NO_THREAD): Add cast.
+* include/private/gcconfig.h: Add test for __HP_aCC.
+* configure.ac, tests/tests.am: Avoid libgccpp on HP/UX.
+
+* doc/README.win32: Fix typo.
+* configure.ac: Fix printing of enable-shared result.
+
+* misc.c (GC_init_inner): Assert !GC_need_to_lock only when
+defined. (GC_call_with_stack_base): Add GC_API.
+* os_dep.c (GC_get_stack_base): Add GC_API.
+* win32_threads.c: (GC_register_my_thread, GC_unregister_my_thread):
+Add GC_API.
+* include/gc.h: Add GC_API annotations.
+* include/private/gc_locks.h: Define UNCOND_LOCK etc. also for
+PCR.
+* include/private/gc_pmark.h: Fix comments.
+
+* include/private/gc_priv.h, mark_rts.c, typd_mlc.c:
+Add GC_push_typed_structures() to push GC_ext_descriptors.
+
+* tests/test.c: Call GC_INIT for DARWIN; test system type using
+gcconfig.h-defined macros.
+
+* allchblk.c (GC_merge_unmapped, GC_freehblk): Refuse to create
+blocks large enough that their size, when interpreted as a signed
+value, would be negative.
+* include/private/gc_priv.h: Comment hb_sz range limit.
+
+* mark.c (GC_push_next_marked): correct comment.
+* Makefile.direct: document NO_PROC_STAT.
+* include/private/gcconfig.h: Accommodate NO_PROC_STAT.
+
+
+== [7.1alpha2] 2008-01-10 ==
+
+* Makefile.am: Mention atomic_ops.c and atomic_ops_sysdeps.S
+again. Refer to build directory as ".".
+
+* configure.ac: Ignore --enable-parallel-mark on Darwin for now.
+* darwin_stop_world.c: Add FIXME comment for parallel marker.
+
+* include/private/gc_priv.h: Update MAX_ROOT_SETS
+and LOG_PHT_ENTRIES to handle larger heaps.
+
+* include/gc.h (GC_INIT,GC_init): Update comments.
+
+* allchblk.c, alloc.c, include/private/gc_priv.h:
+Track GC_bytes_dropped and use in GC triggering decisions.
+* alloc.c (min_bytes_allocd): Weight atomic blocks less.
+
+* alloc.c (GC_add_to_heap): Call GC_install_header(p) AFTER
+adjusting p.
+
+* Makefile.am: Add NT_X64_THREADS_MAKEFILE.
+
+* NT_X64_STATIC_THREADS_MAKEFILE: Clean up obsolete comment.
+* alloc.c: Add declaration for GC_add_current_malloc_heap.
+* win32_threads.c (GC_beginthreadex): Clean up error
+return code.
+* doc/README.win64, NT_X64_THREADS_MAKEFILE, Makefile.direct:
+Add NT_X64_THREADS_MAKEFILE.
+
+* alloc.c: Define GC_version instead of in version.h.
+* version.h: Remove.
+* include/gc_version.h: Move most of version.h here.
+* include/gc.h: Include gc_version.h.
+* gcname.c, add_gc_prefix.c: include gc.h instead of version.h.
+* Makefile.direct, Makefile.dj, Makefile.am, include/include.am:
+Adjust for version.h rename.
+
+* configure.ac: Put libatomic_ops links in build directory.
+* Makefile.am: Don't mention atomic_ops.c and atomic_ops_sysdeps.S
+as nodist sources.
+
+* include/gc.h, doc/README.macros: Add GC_NO_THREAD_REDIRECTS,
+GC_NO_THREAD_DECLS, don't test explicitly for GC_SOLARIS_THREADS.
+
+* alloc.c: Deal correctly with address wrapping for
+GC_greatest_plausible_heap_addr and GC_least_plausible_heap_addr.
+* finalize.c, include/gc.h (GC_register_disappearing_link,
+GC_register_finalizer_inner): Improve out-of-memory handling.
+* include/private/gc_pmark.h: Fix comment spelling.
+
+* include/gc_inline.h, include/gc_tiny_fl.h: cleanups to make usable
+in other contexts.
+
+* include/gc.h: Don't define GC_HAVE_BUILTIN_BACKTRACE for uclibc.
+
+* gc_cpp.cc: Don't include gc_cpp.h from local directory.
+
+* allchblk.c, configure.ac (add --enable-munmap)
+
+* dyn_load.c (GC_dyld_image_add): Remove ifdef clause and use the macro
+GC_GETSECTBYNAME instead.
+* include/private/gc_priv.h: Define GC_GETSECTBYNAME according to the
+architecture (Darwin).
+
+* reclaim.c (GC_bytes_found): Expand comment.
+* thread_local_alloc.c (GC_malloc_atomic, GC_gcj_malloc): Pass
+granules, not bytes, to GC_FAST_MALLOC_GRANS.
+* include/gc.h: Never include gc_local_alloc.h.
+* tests/test.c: Add size zero allocation tests.
+
+* malloc.c: Update GC_large_allocd_bytes on explicit deallocation.
+* allchblk.c: Sanity check GC_max_large_allocd_bytes.
+
+* Makefile.direct: Invoke $(MAKE) instead of make.
+
+* doc/scale.html: Reflect gc7 thread local allocation behavior.
+
+* include/extra/gc.h, include/extra/gc_cpp.h: New.
+* include/include.am: Install gc.h and gc_cpp.h in $(prefix)/include
+again.
+
+* pthread_support.c (GC_thr_init): Use sysconf(_SC_NPROCESSORS_ONLN)
+for HURD.
+
+* include/private/gcconfig.h: Add Linux/mips-64 support.
+
+* dbg_mlc.c: Use random() on all glibc systems.
+* mach_dep.c (GC_with_callee_saves_pushed): Don't use getcontext() on
+HURD. Add comment.
+* pthread_stop_world.c (GC_suspend_handler, GC_stop_init): Accommodate
+systems without SA_SIGINFO.
+
+* include/gc.h (GC_PTR_STORE): Fix non-DEBUG parentheses.
+* tests/test.c (run_one_test): Add GC_PTR_STORE test.
+No longer test for RS6000.
+
+* alloc.c, backgraph.c, headers.c, include/private/gc_priv.h:
+Maintain GC_our_memory and GC_n_memory.
+* dbg_mlc.c (GC_print_smashed_obj): Improve message.
+(GC_print_all_smashed_proc): Pass client object address instead of
+base.
+* dyn_load.c (sort_heap_sects): New. (GC_register_map_entries):
+Register sections that are contiguous and merged with our heap.
+* malloc.c, os_dep.c (GC_text_mapping): Check for just base name
+of libraries.
+* malloc.c (calloc): Check for special callers even with
+USE_PROC_FOR_LIBRARIES. Move assertion. Add rudimentary
+malloc/free tracing.
+* misc.c: No longer call GC_init_lib_bounds explicitly.
+* thread_local_alloc.c (GC_malloc, GC_malloc_atomic): Always
+initialize on demand.
+* tests/test.c: Call GC_INIT only when required.
+
+* Makefile.direct: Remove comment fragment.
+* tests/tests.am: Add smashtest.
+* configure.ac: Define GC_USE_DLOPEN_WRAP with redirect-malloc.
+* pthread_support.c: Fix comment spelling.
+* include/private/gcconfig.h: Define USE_PROC_FOR_LIBRARIES with
+GC_LINUX_THREADS and REDIRECT_MALLOC.
+* tests/smash_test.c: Initial check-in.
+* obj_map.c: Print log entry to correct file.
+* include/private/thread_local_alloc.h: Add TlsAlloc error check.
+
+* alloc.c (GC_stopped_mark): Call GC_add_current_malloc_heap()
+while world is still running.
+* os_dep.c (GC_is_heap_base): Don't call GC_add_current_malloc_heap()
+with world stopped.
+* include/gc.h (GC_INIT for cygwin): Always call GC_add_roots.
+* misc.c (GC_init/GC_init_inner): Perform all work in
+GC_init_inner.
+* Makefile.direct: Expand -DUSE_MUNMAP comment.
+
+* include/gc.h: Define uintptr_t explicitly for VC++6.
+* msvc_dbg.c (GetModuleBase): Revert to strcat if strcat_s doesn't
+exist.
+
+
+== [7.0] 2007-07-02 ==
+
+* include/gc_config_macros.h: Also check for IA64 when setting
+GC_HPUX_THREADS.
+* mallocx.c: Change my_bytes_allocd to signed_word.
+* include/gc_pthread_redirects.h: Remove obsolete Solaris threads
+(as opposed to pthreads) support.
+
+* mach_dep.c (GC_with_callee_saves_pushed): Don't use getcontext()
+on ARM/Linux. Check getcontext() return value.
+
+* backgraph.c (per_object_func): Make argument types consistent.
+(GC_traverse_back_graph): Mark GC_deepest_obj.
+
+* finalize.c (GC_finalize): Change dl_size and fo_size to size_t.
+* os_dep.c (GC_win32_get_mem): Add GC_mem_top_down option.
+
+* doc/README.win32, doc/README, README.QUICK: Fix some of the worst
+anachronisms.
+* dyn_load.c: Partially support cygwin, but don't enable it yet.
+
+* Makefile.am: Use -no-undefined for libgc.
+* Makefile.direct: Document USE_PROC_FOR_LIBRARIES.
+* dyn_load.c (GC_register_map_entries): Rename prot_buf to prot
+consistently.
+* misc.c: Fix some WARN calls. Move GC_is_initialized setting and
+GC_thr_init() call.
+* os_dep.c: Consistently use WARN where appropriate.
+* thread_local_alloc.c: Revert change to GC_WIN32_THREADS test. Instead
+remove inappropriate pthread.h include.
+* doc/README.linux: Remove some anachronisms.
+
+* alloc.c: Also use GC_check_tls on non-Linux systems.
+* mallocx.c (GC_reclaim_generic): Remove bogus declaration.
+* include/private/gc_priv.h (GC_reclaim_generic): Declare correctly
+with prototype.
+
+* alloc.c (GC_adj_bytes_allocd): Avoid (long) casts, fix comment.
+(GC_print_heap_sects): Use size_t instead of unsigned long.
+* thread_local_alloc.c (GC_lookup_thread): Define in the correct
+context.
+* win32_threads.c, include/gc_config_macros.h: The last of Romano
+Paolo Tenca's patch. Move stdint.h include to gc_config_macros.h.
+* include/gc_inline.h: Avoid gc_priv.h dependencies.
+* tests/test.c (check_heap_stats): Replace unsigned long with size_t.
+
+* NT_X64_STATIC_THREADS_MAKEFILE: Replace obsolete -debugtype:cv.
+* mark_rts.c (GC_push_roots): Fix kind type.
+
+* doc/README.win64: New file.
+* doc/doc.am, Makefile.direct: Add README.win64.
+
+* Makefile.am, Makefile.direct: Add NT_X64_STATIC_THREADS_MAKEFILE.
+* NT_X64_STATIC_THREADS_MAKEFILE: Fix warning flags.
+* allochblk.c, alloc.c, blacklst.c, dbg_mlc.c, dyn_load.c,
+finalize.c, headers.c, mach_dep.c, malloc.c, mark.c, misc.c,
+obj_map.c, os_dep.c, ptr_chck.c, reclaim.c, typd_mlc.c,
+win32_threads.c, cord/de_win.c, include/gc_mark.h,
+include/private/gc_hdrs.h, include/private/gc_pmark.h,
+include/private/gc_priv.h, tests/test_cpp.cc:
+Replace old style function declarations. Clean up integral types.
+Remove register declarations. The change in malloc.c and the
+"int descr" declaration in mark.c are the most likely to have
+been real bugs outside of Win64.
+* msvc_dbg.c: Disable on Win64.
+* win32_threads.c: Add x64 support.
+* include/gc.h: no backtrace on x64 for now.
+
+* msvc_dbg.c(GetModuleBase): Replace strcat with strcat_s.
+
+* include/gc.h: (GC_word, GC_signed_word): Fix Win64 definitions.
+Don't include windows.h in an extern "C" context.
+* include/private/gcconfig.h: Fix Win64 configuration.
+* tests/test.c: Eliminate more old style function definitions.
+Cleanup pointer and integer casts for Win64.
+* tests/test_cpp.cc: Don't include gc_priv.h.
+* NT_STATIC_THREADS_MAKEFILE: Restrict suffixes for VC++ 2005.
+* NT_X64_STATIC_THREADS_MAKEFILE: New.
+
+* win32_threads.c: Separate out DEBUG_WIN32_PTHREADS_STACK. Ignore
+FINISHED threads for suspension. (GC_pthread_join): Add
+pthread_self() cast. (GC_pthread_start_inner): Execute cleanup
+handler when popping it.
+* include/private/gc_locks.h: Inline THREAD_EQUAL for
+GC_WIN32_PTHREADS. Define USE_PTHREAD_LOCKS only if we have
+pthreads.
+
+* gc_dlopen.c, thread_local_alloc.c, threadlibs.c, win32_threads.c,
+tests/test.c: Accommodate GC_WIN32_PTHREADS.
+* include/gc.h: Don't include windows.h for GC_WIN32_PTHREADS.
+* include/gc_config_macros.h: Define both PTHREADS and
+GC_WIN32_THREADS.
+* include/private/gc_locks.h: Nonstandard definitions of
+NUMERIC_THREAD_ID for GC_WIN32_PTHREADS.
+* doc/README.win32, Makefile.direct: Include documentation
+for GC_WIN32_PTHREADS.
+* Makefile.direct: Remove some anachronisms in the documentation.
+
+* Makefile.am: Move includes to bottom. Add better library
+dependencies. Increment library version. Remove "SUBDIRS += .".
+* cord/cord.am, tests/tests.am: Add better library dependencies.
+Remove now unnecessary dependencies.
+* include/gc.h (GC_beginthreadex, GC_endthreadex, GC_ExitThread):
+Move to define on all Windows platforms. (_beginthread): define
+to generate error if used.
+
+* include/private/gc_locks.h: Format to 80 columns.
+
+* malloc.c(GC_free): Ignore bad frees on MSWIN32 with REDIRECT_MALLOC.
+* NT_MAKEFILE: msvc_dbg.h is in include/private. Don't use cvars
+rc.
+* misc.c (WIN32 GC_write): Define GC_need_to_lock in single-threaded
+case.
+* win32_threads.c: Test for __MINGW32__ in addition to _MINGW_VER.
+(GC_CreateThread, GC_beginthreadex): Deallocate args even if we fail.
+* include/gc.h: Add GC_reachable_here(). (GC_WinMain): Add GC_API.
+(GC_beginthreadex, GC_endthreadex, GC_ExitThread): Declare.
+* tests/test.c: Add GC_reachable_here() call.
+
+* alloc.c (GC_try_to_collect): Call GC_init if necessary.
+* tests/thread_leak_test.c: Don't unconditionally define
+GC_LINUX_THREADS.
+
+* Makefile.am: Remove extra_ldflags_libgc definition.
+
+* include/private/gc_priv.h: Define AO_REQUIRE_CAS.
+
+* finalize.c (GC_unreachable_finalize_mark_proc): Don't return void
+value.
+
+
+== [7.0alpha9] 2007-05-15 ==
+
+* Some gc6.9 changes.
+* Change FindTopOfStack decl in darwin_stop_world.c.
+* Move some static tests from misc.c to gcconfig.h. Use #error.
+* Add GC_print_free_list() function (thanks to Bruce Hoult).
+* Add GC_GNU_THREADS support on HURD (thanks to Aleksey Demakov,
+Barry DeFreese, and possibly other Debian maintainers).
+* __GNUC__ was misspelled as __GNUC in thread_local_alloc.h (thanks to
+Peter Wang).
+* Integrated various MacOSX patches and tried to reconcile them (thanks to
+Allan Hsu, several contributors at Apple, and probably others).
+* Added some casts to powerpc.h in libatomic_ops to silence warnings.
+
+* Makefile.am: Include NT_STATIC_THREADS_MAKEFILE in dist.
+* include/private/gc_locks.h: GC_compare_and_exchange, GC_atomic_add:
+remove. NUMERIC_THREAD_ID, THREAD_EQUAL: New. GC_lock_holder: now
+unsigned long. I_DONT_HOLD_LOCK, I_HOLD_LOCK: Update.
+* pthread_stop_world.c, pthread_support.c, win32_threads.c: Use
+NUMERIC_THREAD_ID, THREAD_EQUAL.
+* include/private/gcconfig.h: GENERIC_COMPARE_AND_SWAP: Remove.
+* include/private/thread_local_alloc.h: Don't USE_COMPILER_TLS on
+ARM.
+
+* dbg_mlc.c, include/gc.h, finalize.c: Merge Alexandre Oliva's
+GC_debug_register_finalizer_unreachable() patch from gcc tree.
+* thread_local_alloc.c (GC_malloc, GC_malloc_atomic): Add assertions
+to check GC has been initialized.
+
+* include/gc_cpp.h: Documentation updates.
+* include/gc_config_macros.h: Don't check for __ppc__ to set
+DARWIN_THREADS.
+* Makefile.am: Include configure_atomic_ops.sh in dist.
+
+* Makefile.am: Don't distribute copied atomic_ops files. Include
+libatomic_ops with "make dist".
+* configure.ac: Enable THREAD_LOCAL_ALLOC for Cygwin with threads.
+* win32_threads.c: Report error for Cygwin + GC_DLL.
+
+* Makefile.direct: Update THREAD_LOCAL_ALLOC documentation.
+* cord/de_win.c: Rename and move AboutBox. Call GC_INIT. Remove
+MakeProcInstance anachronism.
+* doc/README.macros: Officially remove elif prohibition.
+Remove documentation for defunct SRC_M3 support.
+* include/gc.h: Remove more SRC_M3 references.
+* include/private/gcconfig.h: Remove still more SRC_M3 references.
+GC_SOLARIS_THREADS no longer needs to be checked separately.
+
+* thread_local_alloc.c, include/private/thread_local_alloc.h:
+Spell __declspec correctly.
+* NT_STATIC_THREADS_MAKEFILE: Enable thread-local allocation.
+
+* doc/README.win32: Adjust GC_win32_dll_threads rules again.
+
+* mark.c (GC_mark_some wrapper): Restructure for readability, handle
+GC_started_thread_while_stopped.
+* misc.c (Win32 GC_write): Lock GC_write_cs only if needed.
+* win32_threads.c: (client_has_run): remove,
+GC_started_thread_while_stopped, GC_attached_thread: add.
+(GC_push_all_stacks): Add verbose output.
+(DllMain): Avoid initializing collector or the like.
+Never update both thread tables.
+* doc/README.win32: Adjust GC_win32_dll_threads rules.
+
+* pthread_stop_world.c (GC_push_all_stacks): Print thread count with
+GC_PRINT_VERBOSE_STATS.
+
+* configure.ac: Comment out redundant
+AC_DEFINE(NO_EXECUTE_PERMISSION).
+* sparc_mach_dep.S: Remove single quote in comment.
+* include/private/gcconfig.h: Fix DATAEND for NONSTOP.
+* win32_threads.c: Include stdint.h for Mingw. Add GC_API for DllMain.
+(GC_use_DllMain): Fix assertion.
+
+* configure.ac: Introduce extra_ldflags_libgc. Use it for Darwin.
+* Makefile.am (libgc_la_LDFLAGS): Use extra_ldflags_libgc.
+* include/private/gcconfig.h: Enable MPROTECT_VDB for all Darwin
+targets. Remove comments.
+Prepare ppc64 support for Darwin.
+
+* darwin_stop_world.c (GC_push_all_stacks): Fix compiler warnings.
+Make i unsigned.
+(GC_stop_world): Likewise. Remove unused GC_thread p.
+(GC_start_world): Likewise.
+
+* os_dep.c: Define GC_darwin_register_mach_handler_thread extern.
+Remove double SIG_HNDLR_PTR definition.
+(GC_forward_exception): Fix compiler warnings, make i unsigned.
+Initialize thread_state to NULL.
+(catch_exception_raise): Fix compiler warnings, make i unsigned.
+
+* include/private/gc_priv.h (NEED_FIND_LIMIT, FREEBSD variant):
+also define for X86_64.
+* configure.ac: Move generic gnu (Hurd) case to below kfreebsd case.
+* README.changes: Point to ChangeLog.
+
+* darwin_stop_world.c: Move THREAD_FLD defines to ...
+* include/private/gc_priv.h: ... here.
+Fix THREAD_STATE definitions for ppc64.
+* os_dep.c (catch_exception_raise): Use THREAD_FLD for exc_state member
+access.
+
+* configure.ac (i586-darwin): Replaced HAS_I386_THREAD_STATE_* with
+HAS_X86_THREAD_STATE32_*.
+(x86_64-*-darwin*): Extended the above check for x86_64-*-darwin* with
+HAS_X86_THREAD_STATE64_*.
+Added value 1 in the above AC_DEFINE's. Important for the upcoming
+Leopard.
+* include/private/gcconfig.h: Modified X86_64 define for Darwin.
+Removed __x86_64__ check in POWERPC section. Added base definitions
+for the X86_64 Darwin port.
+* include/private/gc_priv.h: Added GC_MACH_HEADER and GC_MACH_SECTION
+to distinguish between 32 and 64-bit applications. Added definitions
+for X86_64 Darwin.
+* darwin_stop_world.c: Added HAS_X86_THREAD_STATE64___RAX. And
+replaced HAS_I386_THREAD_STATE___EAX with HAS_X86_THREAD_STATE32___EAX.
+(GC_push_all_stacks): Added code for X86_64 Darwin. Even for the
+!DARWIN_DONT_PARSE_STACK. Maybe obsolete.
+* dyn_load.c (GC_dyld_name_for_hdr): Use GC_MACH_HEADER.
+(GC_dyld_image_add): Use GC_MACH_HEADER and GC_MACH_SECTION.
+Distinguish between getsectbynamefromheader_64 and
+getsectbynamefromheader.
+* os_dep.c (catch_exception_raise): Introduce exception definition for
+X86_64 Darwin. Replaced old i386_EXCEPTION_STATE_* definition with
+x86_EXCEPTION_STATE32_*. Add X86_64 for exc_state.faultvaddr.
+
+
+== [7.0alpha7] 2006-09-19 ==
+
+* More 6.7 changes.
+* Declare GC_dump() in gc.h.
+* Add --enable-large-config, which just defines the LARGE_CONFIG macro.
+* Make GlobalAlloc address alignment a bit more intuitive (thanks to
+Charles Mills).
+* Use #elif in the definitions of GET_MEM.
+* Overhaul porting.html. Remove corresponding text from README.
+* Fix typo in DARWIN section of gcconfig.h.
+* Fix Darwin thread memory leak (thanks to Bruce Mitchener).
+* Update x86 AO_test_and_set implementation to use "=q".
+* Add $(EXEEXT) to many tests in tests/tests.am. (Corresponds to a
+6.7 fix, which no longer applied.)
+* Fix Darwin/PPC port.
+* Fix Cygwin/threads port.
+* Fix gcj malloc support.
+* For GNU-style make, don't build libatomic_ops unless threads are requested.
+This should allow single-threaded builds on platforms which do not
+currently support libatomic_ops.
+* Clean up and hopefully fix the CFLAGS calculation for GNU build.
+(Substantially improves things on HP/UX.)
+* Integrated Andrei Polushin's Visual C++ patches. These provide for
+stack traces, better C++ debug support, and better log file handling.
+Note that these change the location of the log file to a the path of the
+executable with a .log extension. To get the old behavior back, define
+OLD_WIN32_LOG_FILE. For the time being, I'm checking his project
+files and the like into a windows-untested subdirectory. They
+are almost certainly already out of date, but better than what we had
+before.
+* Fixed some win32 threads bugs, and added support for _beginthreadex.
+* Fix zero size thread local allocation so that explicit deallocation
+works correctly.
+* Removed serious bug in GC_malloc_uncollectable(large size).
+* Do not try to do thread-local gcj allocation in incremental mode. There
+are races in setting up the descriptor.
+* Add GC_INIT() to middle.c, fix some more GC_printfn calls.
+* Some assertions erroneously used I_HOLD_LOCK() negatively, even though
+it can now spuriously return TRUE.
+* Rename SUNOS5 macro and OS name to SOLARIS and SUNOS5DL to SOLARISDL.
+* On Linux and some Un*x variants, allocate memory by first trying sbrk,
+and then switching to mmap if that fails.
+* Fixed /proc/x/maps reading to deal with asynchronous deletions.
+* Fix REDIRECT_MALLOC with threads on Linux. It now usually seems to work
+with ugly hacks that include having calloc behave differently when it is
+called from ld.so or the pthreads library. A reasonable amount of
+infrastructure was added to support some of this. (Thanks to Roland McGrath
+for ideas and information.)
+* Import various updated build scripts.
+* Add GC_register_has_static_roots_callback (thanks to Andrew Haley).
+* Fix serious bugs in GC_malloc_atomic_uncollectable().
+* Return GC_SUCCESS form GC_get_stack_base().
+* Fix several atomic_ops problems on IA64 with HP Compiler.
+* Update to atomic_ops-1.2.
+* Fix hb_n_marks description and reclaim.c assertion.
+* Various additional win32 threads fixes.
+* Enable GC_ASSERTIONS for Debug build with NT_THREADS_MAKEFILE.
+
+
+== [7.0alpha5] 2005-09-29 ==
+
+* More 6.6, 6.7 changes.
+* Some Solaris fixes, including some more general changes in how
+the assembly pieces of mach_dep.c are handled.
+* Removed a lot of SOLARIS_THREADS-specific code that was only
+needed with the old implementation. This included many (mostly no-op)
+versions of GC_is_fresh.
+* Don't use atomic_ops in gc_locks.h unless we need threads.
+* Fixed USE_MARK_BITS, which is once again the default without PARALLEL_MARK.
+* Removed Solaris GC_INIT hack. It's a workaround for a long dead bug,
+and it seemed to be wrong anyway.
+* Changed win32_threads.c to require preprocessor-based interception
+of thread routines by default. A client call to GC_use_DllMain is
+now required to get the old behavior in which DllMain is used to implicitly
+register threads. This was done for uniformity with other platforms, and
+because the DllMain solution seemed to require very tricky code which,
+at least in the past, imposed hard bounds on the number of threads.
+* Many small changes to make thread support work again on Cygwin.
+* Moved definition of allocator lock etc. to pthread_support.c and
+win32_threads.c for those two cases.
+* Got rid of the FASTLOCK() machinery. It doesn't seem useful on modern
+platforms.
+* Cleaned up the uncollectible allocation routines, speeding up the
+slower paths. The code did enough unnecessary work off the critical path
+that the underlying logic was getting hard to extract.
+* No longer turn off THREAD_LOCAL_ALLOC with DBG_HDRS_ALL. Indications
+are it just works, and I think the reasons for it not working disappeared
+a while ago.
+* Fixed bugs in hb_n_marks calculation and assertion.
+* Don't use __builtin_expect for pre-3.0 gcc.
+* Define GWW_VDB only for recent Microsoft tool chains.
+* Add overview.html to doc directory.
+* Fix NT_STATIC_THREADS_MAKEFILE, various compiler warnings.
+* Made thread local allocation sort of work with Cygwin. The code should
+be there to deal with other Windows variants, But non-Cygwin Windows
+threads need more bug fixes.
+
+
+== [7.0alpha4] 2005-08-02 ==
+
+* Various 6.5, 6.6 changes.
+* Removed GC_brief_async_signal_safe_sleep and used atomic_ops instead
+(thanks to Ben Maurer).
+* Integrated build patches from Davide Angelocola and Petter Urkedal.
+* Fix dynamic-linker-based pthread call redirection.
+* Renamed RS6000 to POWERPC/AIX.
+* Allow recovery from SIGSEGV in marker on Linux. This works around
+a race in thread stack marking if /proc is used to find roots. We do
+that by default with malloc redirection and threads. This involved
+moving some GC_find_limit and SETJMP related declarations to gc_priv.h.
+* Added doc/porting.html file.
+* Added ADD_HEAP_GUARD_PAGES for sbrk/*nix platforms to debug extreme
+memory overwrite errors.
+* Added trivial NO_INCREMENTAL flag to facilitate debugging.
+* Added GC_getattr_np-based GC_get_stack_base (untested).
+* Separated thread local allocation into a separate file and added the
+beginning of win32 support for that.
+
+
+== [7.0alpha3] 2005-04-28 ==
+
+* Added support for dlopen-based interception of pthread functions.
+This is only half done. The gc.h redefinitions currently interfere.
+* Integrated major automake overhaul from Petter Urkedal.
+
+
+== [7.0alpha2] 2005-04-07 ==
+
+* GC_bytes_allocd was incremented by a possibly uninitialized variable
+in GC_generic_malloc_inner. (Bug introduced in gc7.0alpha1. Thanks
+to Ben Hutchings for tracking it down.)
+* Win32 fixes (thanks to Ben Hutchings and Maurizio Vairani).
+* Integrated Ben Hutchings' GetWriteWatch-based virtual dirty bit
+implementation for win32.
+* Removed pc_gc.tar and floppy targets in Makefile.direct. Removed
+pc_excludes file.
+* No longer include GC_bytes_wasted when evaluating allocation progress.
+Since we are now counting live memory, it no longer makes sense.
+* Applied Davide Angelocola's configure patch. There are now separate
+Makefile.am's in the cord and tests subdirectory, more tests, etc.
+* Renamed configure.in to configure.ac.
+* Merged a very small number of Nathanael Nerode's configure.ac
+cleanups from the gcc tree. Unfortunately, that file is a bit
+different from ours.
+* Changed EINTR handling in sem_wait slightly.
+* Restructure the root marking code. Remove all traces of
+USE_GENERIC_PUSH_REGS, and effectively make it the default.
+Make it easier to pass a context pointer to the mark routine, in
+case we ever want to do precise stack marking.
+* Replace GC_start_blocking() and GC_end_blocking() with GC_do_blocking().
+This remains undocumented, and only implemented for pthreads. But it
+removes an otherwise unavoidable race with stores of callee-save
+registers.
+* Fix GC_n_mark_bits for the default MARK_BIT_PER_GRANULE case. This
+resulted in bogus complaints in heap dumps.
+* Upgrade to libatomic_ops-1.0, and update build structure to match.
+* Remove SRC_M3 support. Clean up lock initialization code in misc.c.
+* Removed gc_local_alloc.h. If THREAD_LOCAL_ALLOC is defined, the
+thread local allocation routines are now called automatically.
+* Renamed gc_inl.h back to gc_inline.h. Changed the interface appreciably
+since locking has turned into a dominant issue, and in-line allocation
+only makes sense if it's no worse than thread-local allocation.
+Gc_inline.h is now also used to implement thread-local allocation.
+* Finished replacing stubborn allocation with manual write barrier.
+Untested.
+* Use thread-local allocation code by default.
+* Added GC_register_my_thread and friends for Posix and win32.
+* Patch for GWW_VDB from Ben Hutchings.
+* Removed explicit THREAD_LOCAL_ALLOC tests, since that now always
+redefines GC_malloc.
+* Removed now unused AIX memory allocation code.
+* Various minor fixes for bugs introduced in 7.0alpha1.
+
+
+== [7.0alpha1] 2004-11-09 ==
+
+* Remove GC_PROTO, VOLATILE, GC_PTR, and GC_CONST. Assume ANSI C compiler
+and use ANSI constructs unconditionally.
+* Introduce #elif and #error in some of the appropriate places.
+* Remove GC_printf cruft. Use stdargs.
+* Remove separate Solaris threads support. Use the more generic Posix
+implementation.
+* Use atomic_ops for atomic operations and memory barriers.
+* Clean up MPROTECT_VDB implementation. Use SA_SIGINFO wherever
+possible.
+* Remove broken SIGNALS stuff.
+* Use size_t instead of word, where appropriate.
+* Add .S.o rule to Makefile.am.
+* Officially discontinue SunOS4, several old flavors of M68K (SunOS4,
+A/UX, HP), IBM PC/RTs and RISCOS/Irix4. (I doubt the old code worked.
+If anyone cares, these should be easy to resurrect.)
+* Add EXPECT() in some critical places.
+* Redefined hb_sz and hb_body to deal with bytes rather than words.
+This affected a great deal of code. I would like to consistently use
+byte offsets and sizes where there's not a convincing reason to do
+otherwise.
+* Redefined several other variables (GC_mem_found, GC_words_allocd)
+etc. to use units of bytes. Most of these were also renamed to
+reflect that fact.
+* Killed as many "register" declarations as possible.
+* Partially replaced stubborn allocation with manual write barrier.
+It's currently broken.
+* Restructured mark code, to allow mark bits to be kept either on
+a per allocation granule or per object basis. The emphasis is
+now on the -DUSE_MARK_BYTES option, since individual bits perform
+quite badly on hyper-threaded P4s, and are probably suboptimal on
+other architectures. -DUSE_MARK_BITS is currently broken, and may
+be resurrected only for the single-threaded case. This significantly
+reduced the cache footprint required by auxiliary GC data structures.
+It also reduces space overhead for small heaps. It probably slows
+things down slightly if interior pointers are very common.
+* As part of the above, we now maintain an approximate count of set
+mark bits in each heap block.
+* As part of the above, the semantics of hb_map changed drastically.
+For MARK_BIT_PER_OBJ, it doesn't exist. For MARK_BIT_PER_GRANULE,
+it is purely a way to replace a mod instruction with a table lookup.
+(Somewhat to my surprise, this still wins on modern hardware.)
+* Removed PRINTSTATS, GATHERSTATS, and SILENT macros. Everything is
+now controlled by GC_print_stats variable and GC_PRINT_STATS
+and new GC_PRINT_VERBOSE_STATS environment variables.
+* Add GC_log_printf and use it consistently for logging output.
+* Unconditionally count the objects we reclaim in the sweep phase.
+For thread local allocation, we need that anyway, and we expect
+that's increasingly the only case that matters. And it simplifies
+the code. In general expect minor performance hacks that benefit
+only the single-threaded case to disappear.
+* Remove GC_quiet from gc.h and elsewhere.
+* Changed the heap expansion heuristic, and the definition of
+GC_free_space_divisor, to refer to live data size, instead of total
+heap size. I believe this is much more robust. It wasn't previously
+possible, because we didn't have access to live data size.
+* Thread local allocation added the extra byte in twice: Once in
+thread_local_alloc, and once in malloc_many.
+* Removed GC_malloc_words_small and GC_gcj_fast_malloc. A new
+mechanism based on the thread local allocation data structures
+is expected to be added instead. This should allow inlined code
+that is both fast and doesn't rely on collector internals.
+* Changed both free lists and reclaim lists to be indexed by granules
+instead of words, norming halving their size.
+* MERGE_SIZE is now the only option, and the macro was removed.
+(Without it, we need a memory reference to GC_all_interior_pointers
+anyway. Thus it costs us nothing.)
+* Change GC_size_map to map to granules instead of words. Make sure
+that every possible size up to TINY_FREELISTS is present.
+* Split of macros need for fast inline allocation into gc_tiny_fl.h
+in anticipation of a new inline allocator that doesn't rely on GC
+internals.
+* Changed thread local allocation to use GRANULE_BYTES and TINY_FREELISTS
+in anticipation of a merge with the inline allocation code.
+* Removed ALIGN_DOUBLE. This is mostly handled by GRANULE_BYTES.
+* Make locking on most platforms conditional on GC_need_to_lock.
+
+
+== [6.9] ==
+
+* Fix typo in PREFETCH implementation for X86_64 (thanks to Peter Wang).
+* Fix M68K LINUX port (thanks to Debian packagers).
+* __GNUC__ was misspelled as __GNUC in new_gc_alloc.h (thanks to Peter Wang).
+* Integrated Allan Hsu's patch for OS X VM deallocation problems.
+* Applied FreeBSD/X86_64 patch.
+
+
+== [6.8] 2006-07-08 ==
+
+* Added some support for Dragonfly BSD (thanks to Joerg Sonnenberger and
+Thomas Klausner).
+* Improvements to the HP/UX section of configure.in/configure.ac (thanks
+to Andreas Tobler).
+* GC_unix_get_mem could neglect to release the malloc lock on Irix, under
+extremely unlikely circumstances. (Thanks to Jean-Baptiste Nivois for
+some careful code inspection.)
+* Added support for kFreeBSD + glibc (thanks to Petr Salinger).
+* Fix more MacOS threads memory leaks (thanks to Allan Hsu).
+* Added initial Solaris/x64 support (thanks to Rainer Orth).
+
+
+== [6.7] 2006-03-03 ==
+
+* Add "int" to Solaris "end" and "etext" declaration in gc.h. Declared
+the symbols with underscores and as arrays, since that's what's actually
+used. Perhaps this could all just be removed. (Thanks to John Bowman.)
+* Fixed ARM GC_test_and_set code (thanks to Kazu Hirata and Paul Brook).
+* Added casts for assignments to hb_last_reclaimed, which truncate the
+value. Added a cast to GC_adj_words_allocd. Use GetModuleHandleA
+when retrieving a handle to kernel32.dll under win32.
+* Added Tandem S-Series support. (Thanks to Craig McDaniel. A modified
+version of his patch was applied, and hence breakage is probably not
+his fault.)
+* Remove spurious gc:: qualifier for operator delete[] in gc_cpp.h (thanks
+to Hanno Boeck).
+* Changed a test for LINUX in config_macros.h to one for __linux__.
+* Add prototypes for GC_finalizer_notifier and GC_thr_init (thanks to
+David Ayers).
+* Use ld instead of nonexistent ldz instruction in Darwin FindTopOfStack
+(thanks to Andreas Tobler).
+* Add support for Darwin/x86 (thanks to Geoff Norton and the Mono
+developers).
+* Merge in some recent gcc fixes. Add ppc64 asm code. (Thanks to
+Bryce McKinlay and other GCJ developers.)
+* Scan MEM_PRIVATE sections under Windows ME and predecessors.
+* Interior pointers with some largish offsets into large objects could
+be ignored, if GC_all_interior_pointers was set. (Oddly this worked
+correctly for stack references if it was not set. Otherwise it failed
+for both stack and heap references. Thanks to Andrew McKinlay for the
+critical test case.)
+* Integrated Tatsuya Bizenn's NETBSD threads support, with some
+untested changes.
+* Added GC_strdup and friends to make leak detection work correctly
+for strdup clients (thanks to Jon Moore). Fixed the existing strdup
+with malloc redirection to handle a null malloc return correctly.
+
+
+== [6.6] 2005-09-09 ==
+
+* Fix CPU count detection for Irix and FreeBSD (thanks to Dan Bonachea).
+* Integrate Dan Bonachea's patch for the IBM XLC compiler on Darwin.
+* Integrated Andreas Tobler's FreeBSD/PowerPC patch.
+* Don't access the GC thread structure from the restart handler. It's
+unsafe, since the handler may run too late. (Thanks to Ben Maurer for
+tracking this down.)
+* Applied Christian Thalinger's patch to change comment syntax in
+alpha_mach_dep.S.
+* Added test for GC_no_dls in GC_dyld_image_add for DARWIN (thanks to
+Juan Jose Garcia-Ripoll).
+* Use LINUX_STACKBOTTOM for Linux/SH and LINUX/ARM (thanks to
+Sugioka Toshinobu and Christian Thalinger).
+* Rewrote GC_parse_map_entry. This assumed a fixed column layout of
+/proc/self/maps on Linux. This ceased to be true about 2 years ago.
+The old code is probably quite problematic with -DREDIRECT_MALLOC. It
+is also used by default for IA64, though I haven't seen actual failures
+there.
+* More consistently define HBLKSIZE to 4096 on 64 bit architectures with
+4K pages (thanks to Andrew Haley).
+* With win32 threads, GC_stop_world needs to acquire GC_write_cs (thanks
+to Ben Hutchings for the observation and patch).
+* Move up struct callinfo declaration to make gcc 4.0.2 happy.
+
+
+== [6.5] 2005-05-22 ==
+
+* Integrated Paolo Molaro's patch to deal with EINTR in sem_wait.
+* Make GC_approx_sp() write to dummy location to ensure that stack
+is grown here, when sp looks reasonable, rather than later, when
+it might look like a bad memory reference. (Problem was never
+observed that I know of. But on rereading the code it seemed
+dubious.)
+* Separate out GC_with_callee_saves_pushed and sometimes call
+it from GC_suspend_handler in pthread_stop_world.c. Callee-save
+register values sometimes failed to get traced under HP/UX on
+PA-RISC. Linux/IA64 had the same problem, though non-stacked
+callee-save registers seem to be so rarely used there that nobody
+ever noticed.
+* Integrated an ancient Darwin powerpc_darwin_machine_dep.s patch
+from Andreas Tobler, which I had lost.
+* Fix compare_and_exchange implementation for gcc/IA64 to deal with
+pickier compiler versions.
+* Fixed Itanium 32-bit ABI support (HP/UX). In particular, the
+compare_and_exchange implementation didn't consider that possibility.
+* Undefine GC_pthread_detach in win32_threads.c (thanks to
+Tommaso Tagliapietra).
+* Fixed inclusion of frame.h for NETBSD in os_dep.c.
+* Applied Dan Bonachea's patch to use mmap on AIX.
+* Several fixes to resurrect the Irix port on recent OS versions.
+* Change ALPHA to use LINUX_STACKBOTTOM.
+* Change SPARC64/LINUX to also use LINUX_STACKBOTTOM. Deal with potential
+bad values of __libc_stack_end on that platform (thanks to David Miller).
+* Relax gctest to allow larger heap if ALIGN_DOUBLE isn't set.
+(Unnecessary in 7.0)
+* Force a define of __STDC__=0 for the IBM compiler on AIX, so that
+we get prototypes. (Unnecessary in 7.0)
+* GC_INIT definition for AIX and CYGWIN referred to DATASTART and DATAEND
+which are only defined in private include files.
+* Integrated some small gcconfig.h patches from Dan Bonachea. Also
+relaxed assertion about FreeBSD stack size in pthread_support.c.
+* Integrated Andrew Begel's darwin_stop_world.c patch for 64-bit
+support. This may need additional work.
+* Avoided potentially infinite recursion in GC_save_callers if
+the system backtrace calls malloc. The workaround currently requires
+__thread support if this code is used with threads.
+* Avoided another similar infinite recursion by conditionally
+invoking GC_save_callers in alloc.c (thanks to Matthias Andree
+for helping to track down both of these).
+* Removed all traces of aix_irix_threads.c. AIX and Irix now use
+pthread_support.c and pthread_stop_world.c. The old code appeared
+to be unreliable for AIX, and was not regularly maintained.
+* On Irix, ignore segments with MA_FETCHOP or MA_NOTCACHED attributed;
+they're not always safe to read.
+* Fixed a previously vacuous assertion (diagnosed by the SGI compiler)
+in GC_remove_from_fl.
+* Fix stack_size assertion in GC_pthread_create.
+* Fix assertion in GC_steal_mark_stack.
+
+
+== [6.4] 2004-12-21 ==
+
+* Merge gcconfig.h changes from gcc tree.
+* Unconditionally include gc_priv.h in solaris_pthreads.c, win32_threads.h,
+aix_irix_threads.c, and solaris_threads.c to get thread definitions.
+* Start marker threads in GC_thr_init, so that they get started even
+if no other threads are ever started. (Oddly enough, the parallel
+collector worked correctly, though not well, with no helper threads.)
+* Go ahead and split large blocks in GC_allochblk_nth if GC_dont_gc
+is set (thanks to Alexander Petrossian).
+* GC_PRINT_BACK_HEIGHT would deadlock with thread support.
+* Let in_progress_space in backgraph.s grow dynamically.
+* Fix README.solaris2. The GC_thr_init() hack doesn't work anymore.
+* Convert GC_finalizer_mem_freed to bytes in allchblk.c.
+* Add missing declaration for GC_generic_malloc_words_small_inner.
+Without it, s390x breaks. (Thanks to Ulrich Weigand.)
+* Applied several MacOSX patches to support older tool chains (thanks
+to Stefan Ring).
+* Bug fix for NetBSD/x64 (thanks to Marc Recht).
+* Add NetBSD/sh3 support (thanks to Uchiyama Yasushi).
+* Fixed an uninitialized variable in cordprnt.c.
+* Eliminated some, but not all, gcc -Wall warnings.
+* Changed some old style casts to reinterpret_cast in new_gc_alloc.h
+(thanks to Dan Grayson).
+* GC_extend_size_map shouldn't adjust for GC_all_interior_pointers if
+GC_DONT_ADD_BYTE_AT_END is set.
+* Changed some (long) casts to (word) in preparation for Win64 (thanks
+to Peter Colson).
+* Changed "int stack_size" declaration in pthread_support.c to use
+size_t. (Only mattered with GC_ASSERTIONS enabled.)
+* Added CRIS (etrax) support (thanks to Simon Posnjak and Hans-Peter Nilsson).
+* Removed GC_IGNORE_FB frame buffer recognition, and replaced
+it with a check that the mapping type is MEM_IMAGE.
+In theory, this should work much better, but it is a high
+risk change for win32. (Thanks to Ashley Bone for the crucial
+experimental data behind this, and to Rutger Ovidius for
+some further experiments.)
+* GC_allochblk_nth incremented GC_words_wasted by bytes rather than
+words.
+* Consider GC_words_wasted in GC_adj_words_allocd only if it is within
+reason. (A hack to avoid some extremely unlikely scenarios in which
+we manage to allocate only "wasted" space. 7.0 has a better fix.)
+* Changed PowerPC GC_clear implementation to use lwsync instead of
+eieio, since the documentation recommends against eieio, and
+it seems to be incorrect if the preceding memory op is a load.
+* Fixed print_block_list to print the correct kind number for
+STUBBORN (thanks to Rutger Ovidius).
+* Have configure.in generate an error if it is asked to support
+pthreads, but doesn't know how to.
+* Added Kazuhiro Inaoka's patch for Renesas M32R support.
+* Have the GNU build mechanism link with -ldl. Rename THREADLIBS
+to THREADDLLIBS to reflect this. (Thanks to Sven Verdoolaege.)
+* Added Hannes Mehnert's patch for FreeBSD/SPARC support.
+* Merged some FreeBSD specific patches to threadlibs.c and dyn_load.c.
+(Thanks to John Merryweather Cooper.)
+* Define MPROTECT_VDB on MACOSX only if threads are being used, since the
+dirty page tracking mechanism uses threads. (This avoids an undefined
+reference to _GC_darwin_register_mach_handler_thread.)
+* By popular demand, use __libc symbols only if we are built with
+USE_LIBC_PRIVATES, which is off by default, and not otherwise documented.
+* Ignore GC_enable_incremental() requests when KEEP_BACK_PTRS is set.
+The GC itself will dirty lots of pages in this cases, probably making
+it counterproductive on all platforms. And the DARWIN port crashes.
+
+
+== [6.3] 2004-07-08 ==
+
+* Compile test_cpp.cc with CXXCOMPILE instead of COMPILE.
+* Very large allocations could cause a collector hang. Correct
+calculation of GC_collect_at_heapsize.
+* GC_print_hblkfreelist printed some bogus results if USE_MUNMAP
+was defined.
+* Include gc_config_macros.h in threadlibs.c.
+* Correct MacOSX thread stop code (thanks to Dick Porter).
+* SMALL_OBJ definition was off by one. This could cause crashes
+at startup. (Thanks to Zoltan Varga for narrowing this down to
+a trivial test case.)
+* Integrate Paolo Molaro's patch to deal with a race in the Darwin
+thread stopping code.
+* Changed X86_64 implementation to use SA_SIGINFO in the MPROTECT_VDB
+implementation. The old approach appears to have been broken by
+recent kernels.
+* Added GC_ATTR_UNUSED to eliminate a warning in gc_allocator.h (thanks
+to Andrew Begel).
+* Fix GC_task_self declaration in os_dep.c (thanks to Andrew Pinski).
+* Increase INITIAL_BUF_SZ in os_dep.c for Solaris /proc reads.
+
+
+== [6.3alpha6] 2004-05-06 ==
+
+* Define USE_GENERIC_PUSH_REGS for NetBSD/M68K.
+* Fixed the x64 PREFETCH macros to correctly handle ia32e (which uses
+different prefetch instructions on x64). (Thanks to H.J. Lu.)
+* GC_config_macros.h did not correctly define GC_WIN32_THREADS from
+GC_THREADS.
+* Added simple_example.html.
+* Merged Andrew Gray's patch to correctly restore signal handlers on
+FreeBSD.
+* Merged a patch from Andreas Jaeger to deal with prefetch-related warnings
+on x86-64. Added some other casts so that the PREFETCH macros
+always get a ptr_t argument. Removed some casts in the PREFETCH
+implementations.
+* Added a header guard for gc_allocator.h and changed GC_debug_free to
+clobber contents of deallocated object (suggested by Jesse Jones).
+* The signal masking code in pthread_stop_world.c contained some errors.
+In particular SIGSEGV was masked in the handler, in spite of the fact that
+it wrote to the heap. This could lead to an uncaught SIGSEGV, which
+apparently became much more likely in Linux 2.6. Also fixed some
+typos, and reduced code duplication in the same area.
+* Remove ltconfig, clean up configure messages for DG/UX (thanks to
+Adrian Bunk for the patches).
+* Integrated NetBSD/OpenBSD patches from Marc Recht and Matthias Drochner.
+
+
+== [6.3alpha5] 2004-03-30 ==
+
+* Fix & vs && typo in GC_generic_malloc and
+GC_generic_malloc_ignore_off_page. (Propagated from the gcc tree.)
+* Removed SA_NODEFER hack from NetBSD and Solaris write-protect handler.
+(According to Christian Limpach, the NetBSD problem is fixed.
+Presumably so is the Solaris 2.3 problem.)
+* Removed placement delete from gc_cpp.h for the SGI compiler (thanks
+to Simon Gornall for the patch).
+* Changed semantics of the GC_IGNORE_FB environment variable, based
+on experimentation by Nicolas Cannasse pointing out that the old
+interpretation was useless. We still need help in identifying win32
+graphics memory mappings. The current "solution" is a hack.
+* Removed "MAKEOVERRIDES =" from Makefile.am and thus Makefile.in.
+It probably made more sense in the gcc context.
+* Explicitly ensure that NEED_FIND_LIMIT is defined for {Open,Net}BSD/ELF.
+* Replaced USE_HPUX_TLS macro by USE_COMPILER_TLS, since gcc often
+supports the same extension on various platforms.
+* Added some basic (completely untested) defines for Win64, in support
+of future work.
+* Declared GC_jmp_buf in os_dep.s as JMP_BUF instead of jmp_buf, fixing
+a memory overwrite bug on Solaris and perhaps other platforms.
+* Added 0 != __libc_stack_end test to GC_linux_stack_base (thanks to
+Jakub Jelinek for the patch and explaining the problem).
+Otherwise pre-linking could cause the collector to fail.
+* Changed default thread local storage implementation to USE_PTHREAD_SPECIFIC
+for HP/UX with gcc. The compiler-based implementation appears to work
+only with the vendor compiler.
+* Export GC_debug_header_size and GC_USR_PTR_FROM_BASE from gc_mark.h,
+making client mark code cleaner and less dependent on GC version.
+* Export several new procedures and GC_generic_malloc from gc_mark.h
+to support user-defined kinds. Use the new procedures to replace existing
+code in gcj_mlc.c and typd_mlc.c.
+* Added support for GC_BACKTRACES.
+* Fixed a remaining problem in CORD_str with signed characters (thanks
+to Alexandr Petrosian for the patch).
+* Removed supposedly redundant, but very buggy, definitions of finalizer
+macros from javaxfc.h. Fortunately this file probably has no users.
+The correct declarations were already in gc.h.
+* Also need to set GC_in_thread_creation while waiting for GC during
+thread termination, since it is also possible to collect from an
+unregistered thread in that case.
+* Define NO_GETENV for Windows CE, since getenv doesn't appear to exist.
+Plus some other minor WinCE fixes (thanks to Alain Novak).
+* Added GC_register_describe_type_fn.
+* Arrange for debugging finalizer registration to ignore non-heap
+registrations, since the regular version of the routine also behaves
+that way.
+* GC_gcj_malloc and friends need to check for finalizers waiting to be run.
+One of the more obscure allocation routines with missing a LOCK() call.
+* Fixed cvtres invocations in NT_MAKEFILE and NT_STATIC_THREADS_MAKEFILE
+to work with VS.NET.
+* Cleaned up GC_INIT calls in test. Updated gc.man to encourage GC_INIT
+use in portable code.
+* Taught the GC to use libunwind if --enable-full-debug is specified on
+IA64 and libunwind is present.
+* The USE_MUNMAP code could get confused about the age of a block and
+prematurely unmap it. GC_unmap_old had a bug related to wrapping of
+GC_gc_no. GC_freehblk and GC_merge_unmapped didn't maintain
+hb_last_reclaimed reasonably when blocks were merged. The code was
+fixed to reflect original intent, but that may not always be an
+improvement.
+
+
+== [6.3alpha4] 2004-01-01 ==
+
+* USE_MMAP was broken by confusion in the code dealing with USE_MMAP_ANON.
+* Darwin support was broken in alpha3 as a result of my mis-integration of
+Andrew Begel's patches. Fixed with another patch from Andrew Begel.
+* A new sanity check in pthread_stop_world.c:GC_push_all_stacks() was
+overly aggressive. We may collect from an unregistered thread during
+thread creation. Fixed by explicitly checking for that case. (Added
+GC_in_thread_creation.)
+
+
+== [6.3alpha3] 2003-12-20 ==
+
+* Removed -DSMALL_CONFIG from BCC_MAKEFILE.
+* Changed macros to test for an ARM processor (Patch from Richard Earnshaw.)
+* Mostly applied a DJGPP patch from Doug Kaufman. Especially Makefile.dj
+had suffered from serious bit rot.
+* Rewrote GC_apply_to_maps, eliminating an off-by-one subscript error,
+and a call to alloca (for lcc compatibility).
+* Changed USE_MUNMAP behavior on POSIX platforms to immediately remap
+the memory with PROT_NONE instead of unmapping it. The latter risks
+an intervening mmap grabbing the address space out from underneath us.
+Updated this code to reflect a cleaner patch from Ulrich Drepper.
+* Replaced _T with _Tp in new_gc_alloc.h to avoid a MACOS X conflict.
+(Patch from Andrew Begel.)
+* Dynamically choose whether or not lock should spin on win32 (thanks
+to Maurizio Vairani for the patch). This may be a significant performance
+improvement for win32.
+* Fix Makefile.direct to actually include NT_STATIC_THREADS_MAKEFILE
+in the distribution (thanks to Maurizio Vairani).
+* Maybe_install_looping_handler() was accidentally exported, violating
+our name space convention.
+* Made os_dep.c use sigsetjmp and SA_NODEFER for NetBSD. (Thanks to
+Christian Limpach. I generalized the patch to use sigsetjmp on all
+UNIX_LIKE platforms, admittedly a slightly risky move. But it may avoid
+similar problems on some other platforms. I also cleaned up the definition
+of UNIX_LIKE a bit.)
+* Integrated Andrew Begel's Darwin threads patch, adjusted according to
+some of Fergus Hendersons's comments. (Patch didn't apply cleanly,
+errors are possible.)
+* Added another test or two for the Intel 8.0 compiler to avoid
+confusing it with gcc. The single-threaded collector should now build
+with icc, at least on ia64.
+
+
+== [6.3alpha2] 2003-11-04 ==
+
+* Re-enabled I_HOLD_LOCK assertion in aix_irix_threads.h.
+* Put back the WINABI qualifier for GC_CreateThread. (Thanks to
+Danny Smith for the patch. 6.3alpha1 had the qualifier in one place
+but not elsewhere, which was clearly wrong.)
+* Sometimes explicitly define __private_extern__ before DARWIN dyld.h
+include. (Thanks to Andreas Tobler for posting the patch.)
+* Included signal.h from pthread_support.c. Removed GC_looping_handler,
+which was dead code.
+* GC_find_start was misdeclared by gc_pmark.h if PRINT_BLACK_LIST was
+defined (thanks to Glauco Masotti for testing and reporting this).
+Changed GC_find_start to never just return 0. According to its
+comment it doesn't, and it's unclear that's correct.
+* GC_alloc_large had several largely compensating bugs in the
+computation of GC_words_wasted. (It was confused about bytes vs.
+words in two places.)
+* Integrated Slava Sysoltsev's patch to support more recent versions of
+the Intel compiler on IA64/Linux.
+* Changed win32 spinlock initialization to conditionally set a spin count.
+(Emmanual Stumpf pointed out that enabling this makes a large performance
+difference on win32 multiprocessors.) Also cleaned up the win32 spinlock
+initialization code a bit.
+* Fixed thread support for HP/UX/IA64. The register backing store base for
+the main thread was sometimes not set correctly. (Thanks to
+Laurent Morichetti.)
+* Added -DEMPTY_GETENV_RESULTS flag to work around Wine problem.
+* Declare GC_stack_alloc and GC_stack_free in solaris_threads.h to
+avoid 64-bit size mismatches (thanks to Bernie Solomon).
+* Fixed GC_generic_push_regs to avoid a potential and very unfortunate
+tail call optimization. This could lead to prematurely reclaimed
+objects on configurations that used the generic routine and the new
+build infrastructure (which potentially optimizes mach_dep.c).
+This was a serious bug, but it's unclear whether it has resulted in
+any real failures.
+* Fixed CORD_str to deal with signed characters (thanks to Alexandr Petrosian
+for noticing the problem and supplying the patch).
+* Merged a couple of NOSYS/ECOS tests into os_dep.c from gcj (thanks
+to Anthony Green).
+* Partially merged a win32 patch from Ben Hutchings, and substantially
+revised other parts of win32_threads.c. It had several problems.
+Under MinGW with a statically linked library, the main thread was
+not registered. Cygwin detached threads leaked thread descriptors.
+There were several race conditions. For now, unfortunately the
+static threads limit remains, though we increased it, and made table
+traversal cost depend on the actual thread count.
+There is also still some code duplication with pthread_support.c.
+(Thread descriptors did become much smaller, since Ben Hutchings
+removed the thread context from them.)
+* Integrated a Solaris configure.in patch from Rainer Orth.
+* Added GC_IGNORE_FB and associated warning to very partially address
+the issue of the collector treating a mapped frame buffer as part
+of the root set. (Thanks to David Peroutka for providing some
+insight. More would be helpful. Is there anything that can be used
+to at least partially identify such memory segments?)
+
+
+== [6.3alpha1] 2003-07-26 ==
+
+* Integrated some NetBSD patches by Marc Recht. These
+were already in the NetBSD package.
+* GC_pthread_create waited for the semaphore even if pthread_create failed.
+(Thanks to Dick Porter for the pthread_support.c patch.) Applied the
+analogous fix for aix_irix_threads.c.
+* Added Rainer Orth's Tru64 fixes.
+* The check for exceeding the thread table size in win32 threadDetach
+was incorrect (thanks to Alexandr Petrosian for the patch).
+* Applied Andrew Begel's patch to correct some reentrancy issues
+with dynamic loading on Darwin.
+* GC_CreateThread() was neglecting to duplicate the thread handle in
+the table (thanks to Tum Nguyen for the patch).
+* Pass +ESdbgasm only on PA-RISC machines with vendor compiler (thanks to
+Roger Sayle for the patch).
+* Applied more AIX threads patches from Scott Ananian.
+
+
+== [6.2] 2003-06-21 ==
+
+* Integrated a second round of Irix/AIX patches from Dan Bonachea.
+Renamed mips_sgi_mach_dep.S back to mips_sgi_mach_dep.s, since it requires
+the Irix assembler to do the C preprocessing; gcc -E doesn't work.
+* Fixed Makefile.direct for DARWIN (thanks to Manuel Serrano).
+* There was a race between GC_pthread_detach and thread exit that could
+result in a thread structure being deallocated by GC_pthread_detach
+even though it was still needed by the thread exit code (thanks to
+Dick Porter for the small test case that allowed this to be debugged).
+* Fixed version parsing for non-alpha versions in acinclude.m4 and
+version checking in version.h.
+* Issues identified (not yet fixed):
+- A dynamic libgc.so references dlopen unconditionally, but doesn't link
+against libdl.
+- GC_proc_fd for Solaris is not correctly updated in response to a
+fork() call. Thus incremental collection in the child won't work
+correctly. (Thanks to Ben Cottrell for pointing this out.)
+- --enable-redirect-malloc is mostly untested and known not to work
+on some platforms.
+- There seem to be outstanding issues on Solaris/x86, possibly with
+finding the data segment starting address.
+- Very large root set sizes (> 16 MB or so) could cause the collector
+to abort with an unexpected mark stack overflow. (Thanks to
+Peter Chubb.) NOT YET FIXED. Workaround is to increase the initial
+size.
+- The SGI version of the collector marks from mmapped pages, even
+if they are not part of dynamic library static data areas. This
+causes performance problems with some SGI libraries that use mmap
+as a bitmap allocator. NOT YET FIXED. It may be possible to turn
+off DYNAMIC_LOADING in the collector as a workaround. It may also
+be possible to conditionally intercept mmap and use GC_exclude_static_roots.
+The real fix is to walk rld data structures, which looks possible.
+- Incremental collector should handle large objects better. Currently,
+it looks like the whole object is treated as dirty if any part of it is.
+
+
+== [6.2alpha6] 2003-06-05 ==
+
+* There was an extra underscore in the name of GC_save_registers_in_stack
+for NetBSD/SPARC (thanks to Jaap Boender for the patch).
+* Integrated Brian Alliet's patch for Darwin. This restructured the
+linuxthreads/pthreads support to separate generic pthreads support
+from more the system-dependent thread-stopping code. I believe this
+should make it easier to eliminate the code duplication between
+pthreads platforms in the future. The patch included some other
+code cleanups.
+* Integrated Dan Bonachea's patch to support AIX threads. This required
+substantial manual integration, mostly due to conflicts with other
+recent threads changes. It may take another iteration to
+get it to work.
+* Removed HPUX/PA-RISC support from aix_irix_threads.c. It wasn't used
+anyway and it cluttered up the code. And anything we can do to migrate
+towards generic pthreads support is a good thing.
+* Added a more explicit test for tracing of function arguments to test.c.
+* Added Akira Tagoh's PowerPC64 patch.
+* Fixed some bit rot in the Cygwin port (thanks to Dan Bonachea for
+pointing it out). gc.h now includes just windows.h, not winbase.h.
+* Declared GC_save_regs_in_stack() in gc_priv.h. Remove other declarations.
+* Changed --enable-cplusplus to use automake consistently. The old way
+confused libtool. "Make install" didn't work correctly for the old version.
+Previously --enable-cplusplus was broken on cygwin.
+* Changed the C version of GC_push_regs to fail at compile time if it is
+generated with an empty body. This seems to have been the cause of one
+or two subtle failures on unusual platforms. Those failures should
+now occur at build time and be easily fixable.
+
+
+== [6.2alpha5] 2003-05-14 ==
+
+* GC_invoke_finalizers could, under rare conditions, set
+GC_finalizer_mem_freed to an essentially random value. This could
+possibly cause unbounded heap growth for long-running applications
+under some conditions. (The bug was introduced in 6.1alpha5, and
+is not in gcc3.3.)
+* Attempted to sanitize the various DLL macros. GC_USE_DLL disappeared.
+GC_DLL is used instead. All internal tests are now on GC_DLL.
+README.macros is now more precise about the intended meaning.
+* Include DllMain in the multi-threaded win32 version only if the
+collector is actually built as a dll (thanks to Mohan Embar for
+a version of the patch).
+* Hide the cygwin threadAttach/Detach functions. They were violating our
+namespace rules.
+* Fixed an assertion in GC_check_heap_proc. Added GC_STATIC_ASSERT
+(thanks again to Ben Hutchings).
+* Removed some obsolete definitions for Linux/PowerPC in gcconfig.h.
+* CORD_cat was not rebalancing unbalanced trees in some cases, violating
+a CORD invariant. Also tweaked the re-balancing rule for
+CORD_cat_char_star. (Thanks to Alexandr Petrosian for the bug report
+and patch.)
+* Added hand-coded structured exception handling support to mark.c.
+This should enable support of dynamic libraries under win32 with
+gcc-compiled code. (Thanks to Ranjit Mathew for the patch.)
+Turned on dynamic library scanning for gcc on Win32.
+* Removed some remnants of read wrapping (thanks to Kenneth Schalk).
+GC_USE_LD_WRAP was probably broken in recent versions.
+* The build could fail on some platforms since gcconfig.h could include
+declarations mentioning ptr_t, which was not defined, e.g. when if_mach
+was built (thanks to Yann Dirson for pointing this out). Also
+cleaned up tests for GC_PRIVATE_H in gcconfig.h a bit.
+* The GC_LOOP_ON_ABORT environment variable interfered with incremental
+collection, since the write fault handler was erroneously overridden.
+Handlers are now set up in the correct order.
+* It used to be possible to call GC_mark_thread_local_free_lists() while
+the world was not stopped during an incremental GC. This was not safe.
+Fortunately, it was also unnecessary. Added GC_world_stopped flag
+to avoid it. (This caused occasional crashes in GC_set_fl_marks
+with thread local allocation and incremental GC. This probably happened
+primarily on old, slow multiprocessors.)
+* Allowed overriding of MAX_THREADS in win32_threads.c from the build
+command line (thanks to Yannis Bres for the patch).
+* Taught the IA64/linux code to determine the register backing store base from
+/proc/self/maps after checking the __libc symbol, but before guessing.
+(__libc symbols are on the endangered list, and the guess is likely to not
+always be right for 2.6 kernels.) Restructured the code to read and parse
+/proc/self/maps so it only exists in one place (all platforms).
+* The -DUSE_PROC_FOR_LIBRARIES code was broken on Linux. It claimed that it
+also registered the main data segment, but didn't actually do so. (I don't
+think anyone actually uses this configuration, but ...)
+* Made another attempt to get --enablecplusplus to do the right thing.
+Since there are unavoidable problems with C programs linking against a
+dynamic library that includes C++ code, I separated out the c++ code into
+libgccpp.
+
+
+== [6.2alpha4] 2003-03-10 ==
+
+* Use LINUX_STACKBOTTOM for >= glibc2.2 on Linux/MIPS. (See Debian bug
+# 177204)
+* Integrated Jeff Sturm and Jesse Rosenstock's MACOSX threads patches.
+* Integrated Grzegorz Jakacki's substantial GNU build patch. "Make dist"
+should now work for the GNU build process. Documentation files
+are installed under share/gc.
+* Tweaked gc_cpp.h to again support the Borland compiler (thanks to
+Rene Girard for pointing out the problems).
+* Updated BCC_MAKEFILE (thanks to Rene Girard).
+* Added GC_ASSERT check for minimum thread stack size.
+* Added --enable-gc-assertions.
+* Added some web documentation to the distribution. Updated it in the
+process.
+* Separate gc_conf_macros.h from gc.h.
+* Added generic GC_THREADS client-defined macro to set the appropriate
+GC_XXX_THREADS internal macro. (gc_config_macros.h.)
+* Add debugging versions of _ignore_off_page allocation primitives.
+* Moved declarations of GC_make_closure and GC_debug_invoke_finalizer
+from gc.h to gc_priv.h.
+* Reset GC_fail_count even if only a small allocation succeeds.
+* Integrated Brian Alliet's patch for dynamic library support on Darwin.
+* gc_cpp.h's gc_cleanup destructor called GC_REGISTER_FINALIZER_IGNORE_SELF
+when it should have called the lower case version, since it was
+explicitly computing a base pointer.
+
+
+== [6.2alpha3] 2003-01-30 ==
+
+* Don't include execinfo.h in os_dep.c when it's not needed, and may not
+exist.
+
+
+== [6.2alpha2] ==
+
+* Fixed the completely broken FreeBSD code in 6.2alpha1 (thanks to
+Hironori Sakamoto for the patch).
+* Changed IRIX reference in dbg_mlc.c to IRIX5 (thanks to Marcus Herbert).
+* Attempted to work around the problems with .S filenames and the SGI
+compiler. (Untested.)
+* Worked around an HP/UX make issue with the GNU-style build process.
+* Fixed the --enable-cplusplus build machinery to allow builds without
+a C++ compiler. (That was always the intent ...)
+* Changed the debugging allocation macros to explicitly pass the return
+address for Linux and XXXBSD on hardware for which we can't get stack
+traces. Use __builtin_return_address(0) to generate it when possible.
+Some of the configuration work was cleaned up (good) and moved to gc.h
+(bad, but necessary). This should make leak detection more useful
+on a number of platforms. (Thanks to Fabian Thylman for the suggestion.)
+* Fixed compilation problems in dbg_mlc.c with GC_ADD_CALLER.
+* Bumped revision number for dynamic library.
+
+
+== [6.2alpha1] 2003-01-23 ==
+
+* Guard the test for GC_DUMP_REGULARLY in misc.c with
+"#ifndef NO_DEBUGGING". Otherwise it fails to build with NO_DEBUGGING
+defined. (Thanks to Manuel Serrano.)
+* Message about retrying suspend signals was incorrectly generated even when
+flag was not set.
+* Cleaned up MACOSX/NEXT root registration code. There was apparently a
+separate ifdef case in GC_register_data_segments() for no reason.
+* Removed MPROTECT_VDB for MACOSX port, based on one negative report.
+* Arrange for gc.h and friends to be correctly installed with GNU-style
+"make install".
+* Enable the GNU-style build facility include C++ support in the library
+with --enable-cplusplus (thanks to Thomas Maier for some of the patch).
+* Mark from GC_thread_key in linux_threads.c, in case that's allocated
+from the garbage collected heap, as it is with our own thread-specific
+storage implementation (thanks to Jeff Sturm).
+* Mark all free list header blocks if they are heap allocated. This avoids
+some unnecessary tracing. And it remains correct if we clear the
+root set. (Thanks to Jeff Sturm for identifying the bug.)
+* Improved S390/Linux support. Add S390/Linux 64-bit support (thanks to
+Ulrich Weigand).
+* Corrected the spelling of GC_{M,C}ALLOC_EXPLICTLY_TYPED to
+GC_{M,C}ALLOC_EXPLICITLY_TYPED in gc_typed.h. This is technically
+an interface change. Based on the fact that nobody reported this,
+I suspect/hope there were no clients.
+* Cleaned up gc_typed.h so that (1) it adds an extern "C" declaration
+when appropriate, (2) doesn't generate references to undefined internal
+macros, and (3) allows easier manual construction of descriptors.
+* Close the file descriptor used by GC_print_address_map().
+* Set the "close-on-exec" bit for various file descriptors maintained
+for the collector's internal use.
+* Added a hack to find memory segments owned by the system allocator
+under win32. Based on my tests, this tends to eventually find all
+segments, though it may take a while. There appear to be cleaner,
+but slower solutions under NT/XP. But they rely on an API that's
+unsupported under 9X.
+* Changed Linux PowerPC stack finding to LINUX_STACKBOTTOM. (Thanks
+to Akira Tagoh for pointing out that HEURISTIC1 does not work on
+64-bit kernels.)
+* Added GC_set_free_space_divisor to avoid some Windows dll issues.
+* Added FIXUP_POINTER, POINTER_SHIFT, POINTER_MASK to allow preprocessing
+of candidate pointers for tagging, etc.
+* Always lock around GC_notify_full_gc(). Simplified code for
+invoking GC_notify_full_gc().
+* Changed the way DATASTART is defined on FreeBSD to be robust against
+an unmapped page after etext. (Thanks to Hironori Sakamoto for
+tracking down the intermittent failure.)
+* Made GC_enable() and GC_disable() official. Deprecated direct update
+of GC_dont_gc. Changed GC_gcollect to be a noop when garbage collection
+is disabled.
+* Call GC_register_dynamic_libraries before stopping the world on Linux,
+in order to avoid a potential deadlock due to the dl_iterate_phdr lock.
+* Introduced a more general mechanism for platform-dependent code to
+decide whether the main data segment should be handled separately
+from dynamic libraries, or registered by GC_register_dynamic_libraries.
+The latter is more reliable and easier on Linux with dl_iterate_phdr.
+
+
+== [6.1] ==
+
+* Added GC_MAXIMUM_HEAP_SIZE environment variable.
+* Fix configure.in for MIPS/LINUX (thanks to H.J. Lu).
+* Double page hash table size for -DLARGE_CONFIG.
+* Integrated Bo Thorsen's x64 support.
+* STACKBOTTOM definition for LINUX/MIPS was partially changed back
+(thanks to H.J. Lu and Hiroshi Kawashima for resolving this).
+* Replaced all occurrences of LINUX_DATA_START in gcconfig.h with
+SEARCH_FOR_DATA_START. It doesn't hurt to fall back to a search.
+And __data_start doesn't seem to get defined correctly of the GC
+library is loaded with LD_PRELOAD, e.g. for leak detection.
+* If the GC_find_leak environment variable is set, do a
+atexit(GC_gcollect) to give us at least one chance to detect leaks.
+This may report some very benign leaks, but ...
+* Addeded REDIRECT_FREE. It's necessary if we want leak detection with
+LD_PRELOAD.
+* Defer printing of leaked objects, as for smashed objects.
+* Fixed process and descriptor leak in GC_print_callers. Try for
+line number even if we got function name.)
+* Ported parallel GC support and thread local allocation to Alpha.
+Not yet well-tested.
+* Added GC_DUMP_REGULARLY and added finalization statistics to GC_dump().
+* Fixed Makefile.am to mention alpha_mach_dep.S instead of the defunct
+alpha_mach_dep.s.
+* Incorporated a change to new_gc_alloc.h,
+which should make it work with gcc3.1.
+* Use alpha_mach_dep.S only on Linux. (It's not clear that this is
+optimal, but it otherwise didn't build on Tru64. Thanks to Fergus Henderson.)
+* Added ifdef to guard free() in os_dep.c. Otherwise we get a
+compilation error on Irix (thanks to Dai Sato).
+* Added an experimental version of GC_memalign to mallocx.c. This can't
+always work, since we don't handle alignment requests in the hblk-level
+allocator, and we can't handle arbitrary pointer displacements unless
+GC_all_interior_pointers is enabled. But it should work for alignment
+requests up to HBLKSIZE. This is not yet documented in the standard
+places.
+* Finally debugged the OSF1/Tru64 thread support. This needs more testing,
+since I needed to add a somewhat unconvincing workaround for signal
+delivery issues that I don't yet completely understand. But it does
+pass my tests, even in parallel GC mode. Incremental GC support is
+disabled if thread support is enabled, due to the signal issues.
+* Eliminated name-space-incorrect definition of _cdecl from gc_cpp.h.
+* Added GC_debug_malloc_replacement and GC_debug_realloc_replacement
+declarations to gc.h. On IA64, this is required for REDIRECT_MALLOC
+to work correctly with these.
+* Fixed Linux USE_PROC_FOR_LIBRARIES to work with a 64-bit /proc format.
+
+
+== [6.1alpha5] 2002-06-19 ==
+
+* Added GC_finalizer_mem_freed, and changed some of the code that
+decided on heap expansion to look at it. Memory explicitly
+deallocated by finalizers essentially needs to be counted as reclaimed
+by the GC. Otherwise there are cases in which the heap can grow
+infinitely. (Thanks to Mark Reichert for the test case.)
+* Integrated Adam Megacz patches to not scan dynamic libraries if
+we are compiling with gcc on win32. Otherwise we need structured
+exception handling to deal with asynchronously unmapped root
+segments, and gcc doesn't directly support that.
+* Integrated Anthony Green's patch to support Wine.
+* GC_OPERATOR_NEW_ARRAY was misspelled OPERATOR_NEW_ARRAY in several
+places, including gc_cpp.cc (thanks to Wink Saville for pointing this out).
+* Integrated Loren J. Rittle's Alpha FreeBSD patches. These also
+changed the declarations of symbols like _end on many platforms to
+that they wouldn't mistakenly be declared as short data symbols (suggested by
+Richard Henderson).
+* Integrated changes from the Debian distribution (thanks to Ryan Murray
+for pointing these out).
+Fix C++ comments in POWERPC port. Add ARM32
+incremental GC support. Get rid of USE_GENERIC_PUSH_REGS for alpha/Linux,
+this time for real. Use va_copy to get rid of cord printf problems
+(finally).
+* Close file descriptor used to count CPUs (thanks to Jeff Sturm for
+pointing out the omission).
+* Don't just drop gcj free lists in GC_start_reclaim, since that can
+eventually cause the marker to see a bogus mark descriptor in the
+dropped objects. The usual symptom was a very intermittent segmentation
+fault in the marker. This mattered only if one of the GC_gcj_malloc
+variants was used (thanks to Michael Smith, Jeff Sturm, Bryce McKinlay and
+Tom Tromey for helping to track this down).
+* Fixed Linux and Solaris/64 SPARC configuration (thanks to David Miller,
+Jeff Sturm, Tom Tromey, and Christian Joensson).
+* Fixed a typo in strdup definition (thanks to Gerard A Allan).
+* Changed Makefile.direct to invoke $(CC) to assemble alpha_mach_dep.S.
+This is needed on Linux. I'm not sure whether it's better or worse
+on Tru64.
+* Changed gc_cpp.h once more to declare operator new and friends only in
+a Microsoft environment. This may need further fine tuning (thanks to
+Johannes Schmidt for pointing out that the older code breaks on gcc3.0.4).
+* Don't ever override strdup if it's already macro defined (thanks to
+Adnan Ali for pointing out the problem).
+* Changed gc_cpp.h yet again to also overload placement new. Due to the
+C++ overloading rules, the other overloaded new operations otherwise hide
+placement new, which causes many STL uses to break (thanks to Reza Shahidi
+for reporting this, and to Matt Austern for proposing a fix).
+* Integrated cygwin pthreads support from Dan Bonachea.
+* Turn on DYNAMIC_LOADING for NetBSD (thanks to Krister Walfridsson).
+* Changed printing code to print more complete GC times.
+* Applied Mark Mitchell's Irix patch to correct some bit rot.
+* Clarified which object-printing routines in dbg_mlc.c should hold
+the allocation lock. Restructured the code to allow reasonable object
+printing with -DREDIRECT_MALLOC.
+* Fix the Linux mmap code to always start with 0x1000 as the initial hint.
+Minor patches for 64-bit AIX, particularly to STACKBOTTOM (thanks to
+Jeffrey Mark Siskind).
+* Renamed "SUSPENDED" flag for Solaris threads support to avoid a conflict
+with a system header (thanks to Philip Brown).
+* Cause win32_threads.c to handle an out of range stack pointer correctly,
+though currently with a warning. (Thanks to Jonathan Clark for
+observing that Windows applications may temporarily use the stack
+pointer for other purposes, and suggesting a fix. Unfortunately, it's
+not clear that there is a complete solution to this problem.)
+
+
+== [6.1alpha4] 2002-06-16 ==
+
+* Fixed typo in sparc_mach_dep.S, preventing the 64-bit version from
+building. Increased 64-bit heap size limit in test.c slightly, since
+a functional SPARC collector seems to slightly exceed the old limits.
+* Use NPRGREG in solaris_threads.c, thus printing all registers if things
+go wrong.
+* Added GC_MARKERS environment variable to allow use of a single marker
+thread on an MP without confusing the lock implementation.
+* Collect much less aggressively in incremental mode with GC_TIME_UNLIMITED.
+This is really a purely generational mode, and we can afford to
+postpone the collection until the heap is (nearly) full.
+* Remove read() wrapper for MPROTECT_VDB. It was causing more harm than
+good. It is often no longer needed if system calls avoid writing to
+pointerful heap objects.
+* Fix MACOSX test in gcconfig.h (thanks to John Clements).
+* Change GC_test_and_set so that it consistently has one argument.
+Add spaces to ::: in powerpc assembly code in gc_locks.h (thanks to
+Ryan Murray).
+* Fixed a formatting error in dbg_mlc.c. Added prototype to GC_abort()
+declaration (thanks to Michael Smith).
+* Removed "source" argument to GC_find_start(). Eliminate GC_FIND_START().
+* Added win32 recognition code in configure.in. Changed some of the
+dllimport/export defines in gc.h (thanks to Adam Megacz).
+* GC_malloc_many didn't set hb_last_reclaimed when it called
+GC_reclaim_generic. (I'm not sure this matters much, but ...)
+* Allocating uncollectible objects with debug information sometimes
+allocated objects that were one byte too small, since uncollectible
+objects don't have the extra byte added at the end (thanks to
+Wink Saville for pointing this out).
+* Added a bit more assertion checking to make sure that gcj objects
+on free lists never have a nonzero second word.
+* Replaced BCC_MAKEFILE with an up-to-date one (thanks to Andre Leiradella).
+* Upgraded libtool, configure.in and some related files to hopefully
+support NetBSD/SPARC (thanks to Adrian Bunk). Unfortunately,
+libtool 1.4.2 seemed to be buggy due to missing quotes in several
+"test" invocations. Fixed those in the ltmain.sh script.
+* Some win32-specific patches, including the introduction of
+GC_CreateThread (thanks to Adam Megacz).
+* Merged in gcj changes from Anthony Green to support embedded systems.
+* Tried to consistently rename preprocessed assembly files with a capital
+.S extension.
+* Use alpha_mach_dep.S on ALPHA again. It doesn't really matter, but this
+makes our distribution consistent with the gcc one, avoiding future merge
+problems.
+* Move GET_MEM definition into gcconfig.h. Include gcconfig.h slightly
+later in gc_priv.h to avoid forward references to ptr_t.
+* Add some testing of local allocation to test.c.
+* Change definition of INVALID_QTID in specific.h. The -1 value was used
+inconsistently, and too likely to collide with a valid stack address.
+Some general clean-up of specific.[ch]. Added assertions. (Thanks
+to Michael Smith for tracking down an intermittent bug to this
+general area. I'm not sure it has been squashed yet, however.)
+* On Pthread systems it was not safe to call GC_malloc() between fork()
+and exec(). According to the applicable standards, it doesn't appear
+to be safe to call malloc() or many other libc functions either, thus
+it's not clear this is fixable. Added experimental support for
+-DHANDLE_FORK in linux_threads.c which tries to support it. It may
+succeed if libc does the right thing. I'm not sure whether it does.
+(Thanks to Kenneth Schalk for pointing out this issue.)
+* Documented thread local allocation primitives to require an
+explicit GC_init call. GC_init_parallel is no longer declared to
+be a constructor function, since that isn't portable and often
+seems to lead to initialization order problems.
+* Changed gc_cpp.cc and gc_cpp.h in one more attempt to make them
+compatible with Visual C++ 6 (thanks to Wink Saville for the patch).
+* Some more patches for Linux on HP PA-RISC.
+* Added include/gc_allocator.h. It implements (hopefully) standard
+conforming (as opposed to SGI-style) allocators that allocate
+collectible (gc_allocator) or GC-traceable, but not collectible
+(traceable_allocator) objects. This borrows heavily from libstc++,
+which borrows heavily from the SGI implementation, this part of
+which was written by Matt Austern. Changed test_cpp.cc to very
+minimally test this.
+* On Linux/x86, retry mmap with a different start argument. That should
+allow the collector to use more (closer to 3GB) of the address space.
+* Force 64 bit alignment with GCJ support (reflects Bryce McKinlay's
+patch to the gcc tree).
+* Refined the choice of sa_handler vs. sa_sigaction in GC_dirty_init
+to accommodate some glibc5 systems (thanks to Dan Fandrich for the patch).
+* Compensated for the fact that current versions of glibc set
+__libc_stack_end incorrectly on Linux/IA64 while initialization code
+is running. This could cause the collector to miss 16 bytes of
+the memory stack if GC_malloc or friends where called before main().
+* Mostly integrated Takis Psarogiannakopoulos' port to DG/UX Inix 86.
+This will probably take another iteration to work, since his
+patch conflicted with the libtool upgrade.
+* Added README.arm.cross containing some information about cross-
+compiling to an ARM processor from Margaret Fleck (original code provided by
+Bradley D. LaRonde; edited by Andrej Cedilnik using some of solutions by
+Tilman Vogel; also ported for iPAQ by Oliver Kurth).
+
+
+== [6.1alpha3] 2002-02-07 ==
+
+* Minor cleanup on the gcconfig.h section for SPARC.
+* Minor fix to support Intel compiler for Linux/x86 (thanks to
+Sven Hartrumpf).
+* Added SPARC V9 (64-bit) support (thanks to Jeff Sturm).
+* Restructured the way in which we determine whether or not to keep
+call stacks for debug allocation. By default SAVE_CALL_COUNT is
+now zero on all platforms. Added SAVE_CALL_NARGS parameters.
+If possible, use execinfo.h to capture call stack. (This should
+add support for a number of new platforms, though often at
+considerable runtime expense.)
+* Try to print symbolic information for call stacks. On Linux, we
+do this with a combination of execinfo.h and running addr2line in
+a separate process. This is both much more expensive and much more
+useful. Amazingly, it seems to be fast enough for most purposes.
+* Redefined strdup if -DREDIRECT_MALLOC is given.
+* Changed incremental collector and MPROTECT_VDB implementation so that,
+under favorable conditions, pointer-free objects are not protected.
+Added GC_incremental_protection_needs() to determine ahead of time whether
+pointer-free objects may be protected. Replaced GC_write_hint() with
+GC_remove_protection().
+* Added test for GC_ENABLE_INCREMENTAL environment variable.
+* Made GC_time_limit runtime configurable. Added GC_PAUSE_TIME_TARGET
+environment variable.
+* Eliminated GC_page_sz, a duplicate of GC_page_size.
+* Caused the Solaris and Irix thread creation primitives to call
+GC_init_inner().
+
+
+== [6.1alpha2] 2001-12-20 ==
+
+* No longer wrap read by default in multi-threaded applications. It was
+pointed out on the libgcj list that this holds the allocation lock for
+way too long if the read blocks. For now, reads into the heap are
+broken with incremental collection. It's possible to turn this back on
+if you make sure that read calls don't block (e.g. by calling select
+first).
+* Fix ifdef in Solaris_threads.h to refer to GC_SOLARIS_THREADS.
+* Added check for environment variable GC_IGNORE_GCJ_INFO.
+* Added printing of stop-the-world GC times if GC_PRINT_STATS environment
+variable is set.
+* The calloc definition in leak_detector.h was missing parentheses, and
+realloc was missing a second argument to GC_REALLOC (thanks to
+Elvenlord Elrond).
+* Added GC_PRINT_BACK_HEIGHT environment variable and associated
+code, mostly in the new file backgraph.c. See doc/README.environment.
+* Added -DUSE_GLOBAL_ALLOC to work around a Windows NT issue (thanks to
+Jonathan Clark).
+* Integrated port to NEC EWS4800 (MIPS-based workstation, with somewhat
+different address-space layout). This may help for other machines with
+holes in the data segment. (Thanks to Hironori Sakamoto.)
+* Changed the order in which GC_push_roots and friends push things onto
+the mark stack. GC_push_all calls need to come first, since we can't
+necessarily recover if those overflow the mark stack. (Thanks to
+Matthew Flatt for tracking down the problem.)
+* Some minor cleanups to mostly support the Intel compiler on Linux/IA64.
+
+
+== [6.1alpha1] 2001-09-22 ==
+
+* Non-debug, atomic allocations could result in bogus smashed object
+reports with debugging on (thanks to Patrick Doyle for the small test case).
+* Fixed GC_get_register_stack_base (Itanium only) to work around a glibc
+2.2.4 bug.
+* Initial port to HP/UX on Itanium. Thread support and both 32 and 64
+bit ABIs appear to work. Parallel mark support doesn't yet, due to
+some inline assembly code issues. Thread local allocation does appear
+to work.
+* ifdef'ed out glibc2.1/Itanium workaround. I suspect nobody is using
+that combination anymore.
+* Added a patch to make new_gc_alloc.h usable with gcc3.0 (thanks to
+Dimitris Vyzovitis for the patch).
+* Debugged 64-bit support on HP/UX PA-RISC.
+* Turned on dynamic loading support for FreeBSD/ELF (thanks to Peter Housel).
+* Unregistering of finalizers with debugging allocation was broken (thanks
+to Jani Kajala for the test case).
+* Old finalizers were not returned correctly from GC_debug_register_finalizer.
+* Disabled MPROTECT_VDB for Linux/M68K based on a report that it doesn't work.
+* Cleaned up some statistics gathering code in reclaim.c (thanks to
+Walter Bright).
+* Added some support for OpenBSD/ELF/Linux (thanks to Suzuki Toshiya).
+* Added Jakub Jelinek's patch to use dl_iterate_phdr for dynamic library
+traversal to dyn_load.c. Changed it to weakly reference dl_iterate_phdr,
+so that the old code is still used with old versions of glibc.
+* Cleaned up feature test macros for various threads packages and
+integrated (partially functional) FreeBSD threads code from Loren J. Rittle.
+It's likely that the cleanup broke something, since it touched lots of
+code. It's also likely that it fixed some unreported bugs in the
+less common thread implementations, since some of the original code
+didn't stand up to close scrutiny. Support for the next pthreads
+implementation should be easier to add.
+
+
+== [6.0] 2001-07-26 ==
+
+* Two more bug fixes for KEEP_BACK_PTRS and DBG_HDRS_ALL.
+* Fixed a stack clearing problem that resulted in SIGILL with a
+misaligned stack pointer for multi-threaded SPARC builds.
+* Integrated another HURD patch (thanks to Igor Khavkine).
+
+
+== [6.0alpha9] ==
+
+* added README.macros.
+* Made gc.mak a symbolic link to work around winzip's tendency to ignore
+hard links.
+* Simplified the setting of NEED_FIND_LIMIT in os_dep.c, possibly breaking
+it on untested platforms.
+* Integrated initial GNU HURD port (thanks to Chris Lingard and
+Igor Khavkine).
+* A few more fixes for Digital Mars compiler (by Walter Bright).
+* Fixed gcc version recognition. Renamed OPERATOR_NEW_ARRAY to
+GC_OPERATOR_NEW_ARRAY. Changed GC_OPERATOR_NEW_ARRAY to be the default.
+It can be overridden with -DGC_NO_OPERATOR_NEW_ARRAY (thanks to
+Cesar Eduardo Barros).
+* Changed the byte size to free-list mapping in thread local allocation
+so that size 0 allocations are handled correctly.
+* Fixed Linux/MIPS stackbottom for new toolchain (thanks to Ryan Murray).
+* Changed finalization registration to invoke GC_oom_fn when it runs out
+of memory.
+* Removed lvalue cast in finalize.c. This caused some debug configurations
+not to build with some non-gcc compilers.
+
+
+== [6.0alpha8] 2001-06-15 ==
+
+* Changed GC_debug_malloc_replacement and GC_debug_realloc_replacement
+so that they compile under Irix (thanks to Dave Love).
+* Updated powerpc_macosx_mach_dep.s so that it works if the collector
+is in a dynamic library (thanks to Andrew Begel).
+* Transformed README.debugging into debugging.html, updating and
+expanding it in the process. Added gcdescr.html and tree.html
+from the web site to the GC distribution.
+* Fixed several problems related to PRINT_BLACK_LIST. This involved
+restructuring some of the marker macros.
+* Fixed some problems with the sizing of objects with debug information.
+Finalization was broken KEEP_BACK_PTRS or PRINT_BLACK_LIST. Reduced the
+object size with SHORT_DEBUG_HDRS by another word.
+* The "Needed to allocate blacklisted ..." warning had inadvertently
+been turned off by default, due to a buggy test in allchblk.c. Turned
+it back on.
+* Removed the marker macros to deal with 2 pointers in interleaved fashion.
+They were messy and the performance improvement seemed minimal. We'll
+leave such scheduling issues to the compiler.
+* Changed Linux/PowerPC test to also check for __powerpc__ in response
+to a discussion on the gcc mailing list.
+* Removed the "static" from the jmp_buf declaration in GC_generic_push_regs
+(suggested by Matthew Flatt). This was causing problems in
+systems that register all of their own roots. It looks far more correct
+to me without the "static" anyway.
+* Fixed several problems with thread local allocation of pointer-free or
+typed objects. The collector was reclaiming thread-local free lists, since
+it wasn't following the link fields.
+* There was apparently a long-standing race condition related to
+multi-threaded incremental collection. A collection could be started and
+a thread stopped between the memory unprotect system call and the setting of
+the corresponding dirt bit. I believe this did not affect Solaris or PCR,
+which use a different dirty-bit implementation. Fixed this by installing
+signal handlers with sigaction instead of signal, and disabling the thread
+suspend signal while in the write-protect handler. (It is unclear
+whether this scenario ever actually occurred.)
+* Incremental collection did not cooperate correctly with the PARALLEL_MARK
+implementation of GC_malloc_many or the local_malloc primitives. It still
+doesn't work well, but it shouldn't lose memory anymore.
+* Integrated some changes from the gcc source tree that I had previously
+missed (thanks to Bryce McKinlay for the reminder and patch).
+* Added Makefile.direct as a copy of the default Makefile, which would
+normally be overwritten if configure is run.
+* Changed the gc.tar target in Makefile.direct to embed the version number
+in the gc directory name. This will affect future tar file distributions.
+* Changed the Irix dynamic library finding code to no longer try to
+eliminate writable text segments under Irix6.x, since that is probably no
+longer necessary, and can apparently be unsafe on occasion (thanks to
+Shiro Kawai for pointing this out).
+* GC_cleanup with GC_DEBUG enabled passed a real object base address to
+GC_debug_register_finalizer_ignore_self, which expected a pointer past the
+debug header. Call GC_register_finalizer_ignore_self instead, even with
+debugging enabled (thanks to Jean-Daniel Fekete for catching this).
+* The collector didn't build with call chain saving enabled but NARGS=0.
+* Fixed up the GNU-style build files enough so that they work in some
+obvious cases (thanks to Maarten Thibaut).
+* Added initial port to Digital Mars compiler for win32 (thanks to Walter
+Bright).
+
+
+== [6.0alpha7] 2001-04-19 ==
+
+* Added GC_finalizer_notifier. Fixed GC_finalize_on_demand. (The variable
+actually wasn't being tested at the right points. The build-time flag
+was.)
+* Added Tom Tromey's S390 Linux patch.
+* Added code to push GC_finalize_now in GC_push_finalizer_structures
+(thanks to Matthew Flatt).
+* Added GC_push_gc_structures() to push all GC internal roots.
+* Integrated some FreeBSD changes from Matthew Flatt.
+* It looks like USRSTACK is not always correctly defined under Solaris.
+Hacked gcconfig.h to attempt to work around the problem. The result
+is not well tested. (Thanks again to Matthew Flatt for pointing this out.)
+* Added Ji-Yong Chung's win32 threads and C++ fixes.
+* Arranged for hpux_test_and_clear.s to no longer be needed or built.
+It was causing build problems with gas, and it's not clear this is
+better than the pthreads alternative on this platform.
+* Some MINGW32 fixes from Hubert Garavel.
+* Added initial Hitachi SH4 port from Kaz Kojima.
+* Ported thread-local allocation and parallel mark code to HP/UX on PA_RISC.
+* Made include/gc_mark.h more public and separated out the really private
+pieces. This is probably still not quite sufficient for clients that
+want to supply their own kind of type information. But it's a start.
+This involved lots of identifier renaming to make it namespace clean.
+* Added GC_dont_precollect for clients that need complete control over
+the root set.
+* GC_is_visible didn't do the right thing with gcj objects. (Not that
+many people are likely to care, but ...)
+* Don't redefine read with GC_USE_LD_WRAP.
+* Initial port to LINUX/HP_PA. Incremental collection and threads are not
+yet supported. (Incremental collection should work if you have the
+right kernel. Threads may work with a sufficiently patched pthread
+library.)
+* Changed gcconfig.h to recognize __i386__ as an alternative to x86 in
+many places (thanks to Benjamin Lerman).
+* Made win32_threads.c more tolerant of detaching a thread that it didn't
+know about (thanks to Paul Nash).
+* Added Makefile.am and configure.in from gcc to the distribution, with
+minimal changes. For the moment, those are just placeholders. In the
+future, we're planning to switch to a GNU-style build environment for
+Un*x-like systems, though the old Makefile will remain as a backup.
+* Turned off STUBBORN_ALLOC by default, and added it back as a Makefile
+option.
+* Redistributed some functions between malloc.c and mallocx.c, so that
+simple statically linked apps no longer pull in mallocx.o.
+* Changed large object allocation to clear the first and last few words
+of each block before releasing the lock. Otherwise the marker could see
+objects with nonsensical type descriptors.
+* Fixed a couple of subtle problems that could result in not recognizing
+interior pointers from the stack. (I believe these were introduced
+in 6.0alpha6.)
+* GC_debug_free_inner called GC_free, which tried to reacquire the
+allocator lock, and hence deadlocked. (DBG_HDRS_ALL probably never worked
+with threads.)
+* Fixed several problems with back traces. Accidental references to a free
+list could cause the free list pointer to be overwritten by a back pointer.
+There seemed to be some problems with the encoding of root and finalizer
+references.
+
+
+== [6.0alpha6] ==
+
+* Changed the definition of DATASTART on ALPHA and IA64, where data_start
+and __data_start are not defined by earlier versions of glibc. This might
+need to be fixed on other platforms as well.
+* Changed the way the stack base and backing store base are found on IA64.
+This should now remain reliable on future kernels. But since it relies
+on /proc, it will no longer work in the simulated NUE environment.
+* Made the call to random() in dbg_mlc.c with -DKEEP_BACK_PTRS dependent
+on the OS. On non-Unix systems, rand() should be used instead. Handled
+small RAND_MAX (thanks to Peter Ross for pointing this out).
+* Fixed the cord make rules to create the cord subdirectory, if necessary
+(thanks to Doug Moen).
+* Changed fo_object_size calculation in finalize.c. Turned finalization
+of non-heap object into a no-op. Removed anachronism from GC_size()
+implementation.
+* Changed GC_push_dirty call in solaris_threads.c to GC_push_selected.
+It was missed in a previous renaming (thanks to Vladimir Tsichevski
+for pointing this out).
+* Arranged to not mask SIGABRT in linux_threads.c (thanks to Bryce McKinlay).
+* Added GC_no_dls hook for applications that want to register their own
+roots.
+* Integrated Kjetil Matheussen's Amiga changes.
+* Added FREEBSD_STACKBOTTOM. Changed the FreeBSD/x86 port to use it
+(thanks to Matthew Flatt).
+* Added pthread_detach interception for platforms supported by linux_threads.c
+and irix_threads.c.
+* Changed the USE_MMAP code to check for the case in which we got the
+high end of the address space, i.e. mem_ptr + mem_sz == 0. It appears
+that this can happen under Solaris 7. It seems to be allowed by what
+I would claim is an oversight in the mmap specification. (Thanks to
+Toshio Endo for pointing out the problem.)
+* Cleanup of linux_threads.c. Some code was originally cloned from
+irix_threads.c and now unnecessary. Some comments were obviously wrong.
+* (Mostly) fixed a longstanding problem with setting of dirty bits from
+a signal handler. In the presence of threads, dirty bits could get lost,
+since the getting of a bit in the bit vector was not atomic with respect
+to other updates. The fix is 100% correct only for platforms for which
+GC_test_and_set is defined. The goal is to make that all platforms with
+thread support. Matters only if incremental GC and threads are both
+enabled.
+* made GC_all_interior_pointers (a.k.a. ALL_INTERIOR_POINTERS) an
+initialization time, instead of build-time option. This is a
+nontrivial, high risk change. It should slow down the code measurably
+only if MERGE_SIZES is not defined, which is a very nonstandard
+configuration.
+* Added doc/README.environment, and implemented what it describes. This
+allows a number of additional configuration options to be set through
+the environment. It documents a few previously undocumented options.
+* Integrated Eric Benson's leak testing improvements.
+* Removed the option to throw away the beginning of each page (DISCARD_WORDS).
+This became less and less useful as processors enforce stricter alignment.
+And it hadn't been tested in ages, and was thus probably broken anyway.
+
+
+== [6.0alpha5] ==
+
+* Changed the definition of GC_pause in linux_threads.c to use a volatile
+asm. Some versions of gcc apparently optimize away writes to local volatile
+variables. This caused poor locking behavior starting at about
+4 processors.
+* Added GC_start_blocking(), GC_end_blocking() calls and wrapper for sleep
+to linux_threads.c.
+The first two calls could be used to generally avoid sending GC signals to
+blocked threads, avoiding both premature wakeups and unnecessary overhead.
+* Fixed a serious bug in thread-local allocation. At thread termination,
+GC_free could get called on small integers. Changed the code for thread
+termination to more efficiently return left-over free-lists.
+* Integrated Kjetil Matheussen's BeOS support.
+* Rearranged the directory structure to create the doc and tests
+subdirectories.
+* Sort of integrated Eric Benson's patch for OSF1. This provided basic
+OSF1 thread support by suitably extending hpux_irix_threads.c. Based
+on earlier email conversations with David Butenhof, I suspect that it
+will be more reliable in the long run to base this on linux_threads.c
+instead. Thus I attempted to patch up linux_threads.c based on Eric's code.
+The result is almost certainly broken, but hopefully close enough that
+someone with access to a machine can pick it up.
+* Integrated lots of minor changes from the NetBSD distribution. (These
+were supplied by David Brownlee. I'm not sure about the original
+authors.)
+* Hacked a bit more on the HP/UX thread-support in linux_threads.c. It
+now appears to work in the absence of incremental collection. Renamed
+hpux_irix_threads.c back to irix_threads.c, and removed the attempt to
+support HPUX there.
+* Changed gc.h to define _REENTRANT in cases in which it should already
+have been defined. It is still safer to also define it on the command
+line.
+
+
+== [6.0alpha4] ==
+
+* Moved up the detection of mostly full blocks to the initiation of the
+sweep phase. This eliminates some lock contention in the PARALLEL_MARK case,
+as multiple threads try to look at mostly full blocks concurrently.
+* Restored the code in GC_malloc_many that grabs a prefix of the global
+free list. This avoids the case in which every GC_malloc_many call
+tries and fails to allocate a new heap block, and the returns a single
+object from the global free list.
+* Some minor fixes in new_hblk.c. (Attempted to build free lists in order
+of increasing addresses instead of decreasing addresses for cache performance
+reasons. But this seems to be only a very minor gain with -DEAGER_SWEEP,
+and a loss in other cases. So the change was backed out.)
+* Fixed some of the documentation (thanks in large part to Fergus Henderson).
+* Fixed the Linux USE_PROC_FOR_LIBRARIES code to deal with apps that perform
+large numbers of mmaps (thanks to Eric Benson). Also fixed that code to
+deal with short reads.
+* Added GC_get_total_bytes().
+* Fixed leak detection mode to avoid spurious messages under linuxthreads.
+(This should also now be easy for the other supported threads packages.
+But the code is tricky enough that I'm hesitant to do it without being able
+to test. Everything allocated in the GC thread support itself should be
+explicitly deallocated.)
+* Made it possible (with luck) to redirect malloc to GC_local_malloc.
+
+
+== [6.0alpha3] 2000-09-26 ==
+
+* Fixed the /proc/self/maps code to not seek, since that apparently is not
+reliable across all interesting kernels.
+* Fixed some compilation problems in the absence of PARALLEL_MARK
+(introduced in alpha2).
+* Fixed an algorithmic problem with PARALLEL_MARK. If work needs to
+be given back to the main mark "stack", the BOTTOM entries of the local
+stack should be given away, not the top ones. This has substantial
+performance impact, especially for > 2 processors, from what I can tell.
+* Extracted gc_lock.h from gc_priv.h. This should eventually make it a
+bit easier to avoid including gc_priv.h in clients.
+* Moved all include files to include/ and removed duplicate links to the
+same file. The old scheme was a bad idea because it was too easy to get the
+copies out of sync, and many systems don't support hard links.
+Unfortunately, it's likely that I broke some of the non-Unix Makefiles in
+the process, although I tried to update them appropriately.
+* Removed the partial support for a copied nursery. It's not clear that
+this would be a tremendous win, since we don't consistently lose to
+generational copying collectors. And it would significantly complicate
+many things. May be reintroduced if/when it really turns out to win.
+* Removed references to IRIX_JDK_THREADS, since I believe there never
+were and never will be any clients.
+* Added some code to linux_threads.c to possibly support HPUX threads
+using the Linux code. Unfortunately, it doesn't work yet, and is
+currently disabled.
+* Added support under Linux/x86 for saving the call chain, both in (debug)
+objects for client debugging, and in GC_arrays._last_stack for GC
+debugging. This was previously supported only under Solaris. It is
+not enabled by default under x86, since it requires that code be compiled
+to explicitly gave frame pointers on the call stack. (With gcc this
+currently happens by default, but is often turned off explicitly.)
+To turn it on, define SAVE_CALL_CHAIN.
+
+
+== [6.0alpha2] ==
+
+* Added USE_MARK_BYTES to reduce the need for compare-and-swap on platforms
+for which that's expensive.
+* Fixed a locking bug ib GC_gcj_malloc and some locking assertion problems.
+* Added a missing volatile to OR_WORD and renamed the parameter to
+GC_compare_and_swap so it's not a C++ reserved word (thanks to
+Toshio Endo for pointing out both of those).
+* Changed Linux dynamic library registration code to look at /proc/self/maps
+instead of the rld data structures when REDIRECT_MALLOC is defined.
+Otherwise some of the rld data data structures may be prematurely garbage
+collected.
+* Fixed USE_LD_WRAP a bit more, so it should now work without threads.
+* Renamed XXX_THREADS macros to GC_XXX_THREADS for namespace correctness.
+Temporarily added some backward compatibility definitions. Renamed
+USE_LD_WRAP to GC_USE_LD_WRAP.
+* Many MACOSX POWERPC changes, some additions to the gctest output, and
+a few minor generic bug fixes (thanks to Dietmar Planitzer).
+
+
+== [6.0alpha1] ==
+
+* Added HP/PA prefetch support.
+* Added -DDBG_HDRS_ALL and -DSHORT_DBG_HDRS to reduce the cost and improve
+the reliability of generating pointer backtrace information, e.g. in
+the Bigloo environment.
+* Added parallel marking support (-DPARALLEL_MARK). This currently
+works only under IA32 and IA64 Linux, but it shouldn't be hard to adapt
+to other platforms. This is intended to be a lighter-weight (less
+new code, probably not as scalable) solution than the work by Toshio Endo
+et al, at the University of Tokyo. A number of their ideas were
+reused, though the code wasn't, and the underlying data structure
+is significantly different. In particular, we keep the global mark
+stack as a single shared data structure, but most of the work is done
+on smaller thread-local mark stacks.
+* Changed GC_malloc_many to be cheaper, and to require less mutual exclusion
+with -DPARALLEL_MARK.
+* Added full support for thread local allocation under Linux
+(-DTHREAD_LOCAL_ALLOC). This is a thin veneer on GC_malloc_many, and
+should be easily portable to other platforms, especially those that
+support pthreads.
+* CLEAR_DOUBLE was not always getting invoked when it should have been.
+* GC_gcj_malloc and friends used different out of memory handling than
+everything else, probably because I forgot about one when I implemented
+the other. They now both call GC_oom_fn(), not GC_oom_action().
+* Integrated Jakub Jelinek's fixes for Linux/SPARC.
+* Moved GC_objfreelist, GC_aobjfreelist, and GC_words_allocd out of
+GC_arrays, and separately registered the first two as excluded roots.
+This makes code compiled with gc_inl.h less dependent on the
+collector version. (It would be nice to remove the inclusion of
+gc_priv.h by gc_inl.h completely, but we're not there yet. The
+locking definitions in gc_priv.h are still referenced.)
+This change was later conditioned on SEPARATE_GLOBALS, which
+is not defined by default, since it involves a performance hit.
+* Register GC_obj_kinds separately as an excluded root region. The
+attempt to register it with GC_arrays was usually failing. (This wasn't
+serious, but seemed to generate some confusion.)
+* Moved backptr.h to gc_backptr.h.
+
+
+== [5.4] ==
+
+* Fixed a typo that prevented compilation with -DUSE_3DNOW_PREFETCH (thanks to
+Shawn Wagner for actually testing this).
+* Fixed GC_is_thread_stack in solaris_threads.c. It forgot to return a value
+in the common case.
+* Fixed another silly syntax problem in GC_double_descr (thanks to
+Fergus Henderson for finding it).
+* Fixed a GC_gcj_malloc bug: It tended to release the allocator lock twice.
+
+
+== [5.3] 2000-09-24 ==
+
+* Fixed _end declaration for OSF1.
+* There were lots of spurious leak reports in leak detection mode, caused
+by the fact that some pages were not being swept, and hence unmarked
+objects weren't making it onto free lists. (This bug dated back to 5.0.)
+* Fixed a typo in the liblinuxgc.so Makefile rule.
+* Added the GetExitCodeThread to Win32 GC_stop_world to (mostly) work
+around a Windows 95 GetOpenFileName problem (thanks to Jacob Navia).
+
+
+== [5.2] ==
+
+* dyn_load.c declared GC_scratch_last_end_ptr as an extern even if it
+was defined as a macro. This prevented the collector from building on
+Irix.
+* We quietly assumed that indirect mark descriptors were never 0.
+Our own typed allocation interface violated that. This could result
+in segmentation faults in the marker with typed allocation.
+* Fixed a _DUSE_MUNMAP bug in the heap block allocation code (thanks to
+Ben Hutchings for the patch).
+* Taught the collector about VC++ handling array operator new (thanks to
+Ben Hutchings for the patch).
+* The two copies of gc_hdrs.h had diverged. Made one a link to the other
+again.
+
+
+== [5.1] ==
+
+* Fixed a gc.h header bug which showed up under Irix (thanks to Dan Sullivan).
+* Fixed a typo in GC_double_descr in typd_mlc.c.
+This probably could result in objects described by array descriptors not
+getting traced correctly (thanks to Ben Hutchings for pointing this out).
+* The block nearly full tests in reclaim.c were not correct for 64 bit
+environments. This could result in unnecessary heap growth under unlikely
+conditions.
+
+
+== [5.0] ==
+
+* Fixed threadlibs.c for linux threads. -DUSE_LD_WRAP was broken and
+-ldl was omitted. Fixed Linux stack finding code to handle
+-DUSE_LD_WRAP correctly.
+* Added MSWIN32 exception handler around marker, so that the collector
+can recover from root segments that are unmapped during the collection.
+This caused occasional failures under Windows 98, and may also be
+an issue under Windows NT/2000.
+
+
+== [5.0alpha7] ==
+
+* -DREDIRECT_MALLOC was broken in alpha6. Fixed.
+* Cleaned up gc_ccp.h slightly, thus also causing the HP C++ compiler to
+accept it.
+* Removed accidental reference to dbg_mlc.c, which caused dbg_mlc.o to be
+linked into every executable.
+* Added PREFETCH to bitmap marker. Changed it to use the header cache.
+* GC_push_marked sometimes pushed one object too many, resulting in a
+segmentation fault in GC_mark_from_mark_stack. This was probably an old
+bug. It finally showed up in gctest on win32.
+* Gc_priv.h erroneously #defined GC_incremental to be TRUE instead of FALSE
+when SMALL_CONFIG was defined. This was no doubt a major performance bug for
+the default win32 configuration.
+* Removed -DSMALL_CONFIG from NT_MAKEFILE. It seemed like an anachronism now
+that the average PC has 64MB or so.
+* Integrated Bryce McKinlay's patches for linux threads and dynamic loading
+from the libgcj tree. Turned on dynamic loading support for Linux/PPC.
+* Changed the stack finding code to use environ on HP/UX (thanks
+to Gustavo Rodriguez-Rivera for the suggestion). This should
+probably be done on other platforms, too. Since I can't test those, that'll
+wait until after 5.0.
+
+
+== [5.0alpha6] ==
+
+* GC_malloc_explicitly_typed and friends sometimes failed to
+initialize first word.
+* Added allocation routines and support in the marker for mark descriptors
+in a type structure referenced by the first word of an object. This was
+introduced to support gcj, but hopefully in a way that makes it
+generically useful.
+* Added GC_requested_heapsize, and inhibited collections in non-incremental
+mode if the actual used heap size is less than what was explicitly
+requested.
+* The Solaris pthreads version of GC_pthread_create didn't handle a NULL
+attribute pointer. Solaris thread support used the wrong default thread
+stack size (thanks to Melissa O'Neill for the patch).
+* Changed PUSH_CONTENTS macro to no longer modify first parameter.
+This usually doesn't matter, but it was certainly an accident waiting
+to happen ...
+* Added GC_register_finalizer_no_order and friends to gc.h. They're
+needed by Java implementations.
+* Integrated a fix for a win32 deadlock resulting from clock() calling
+malloc (thanks to Chris Dodd).
+* Integrated Hiroshi Kawashima's port to Linux/MIPS. This was designed
+for a handheld platform, and may or may not be sufficient for other
+machines.
+* Fixed a va_arg problem with the %c specifier in cordprnt.c. It appears
+that this was always broken, but recent versions of gcc are the first to
+report the (statically detectable) bug.
+* Added an attempt at a more general solution to dlopen races/deadlocks.
+GC_dlopen now temporarily disables collection. Still not ideal, but ...
+* Added -DUSE_I686_PREFETCH, -DUSE_3DNOW_PREFETCH, and support for IA64
+prefetch instructions. May improve performance measurably, but I'm not
+sure the code will run correctly on processors that don't support the
+instruction. Won't build except with very recent gcc.
+* Added caching for header lookups in the marker. This seems to result
+in a barely measurable performance gain. Added support for interleaved
+lookups of two pointers, but unconfigured that since the performance
+gain is currently near zero, and it adds to code size.
+* Changed Linux DATASTART definition to check both data_start and
+__data_start, since nothing else seems to be portable.
+* Added -DUSE_LD_WRAP to optionally take advantage of the GNU ld function
+wrapping mechanism. Probably currently useful only on Linux.
+* Moved some variables for the scratch allocator into GC_arrays (suggested
+by Martin Hirzel).
+* Fixed a win32 threads bug that caused the collector to not look for
+interior pointers from one of the thread stacks without
+ALL_INTERIOR_POINTERS (thanks to Jeff Sturm).
+* Added Mingw32 support (thanks to Jeff Sturm for the patch).
+* Changed the alpha port to use the generic register scanning code instead
+of alpha_mach_dep.s. Alpha_mach_dep.s doesn't look for pointers in fp
+registers, but gcc sometimes spills pointers there (thanks to Manuel Serrano
+for helping debug this). Changed the IA64 code to
+do something similar for similar reasons.
+
+
+== [5.0alpha4] 1999-10-30 ==
+
+* Added protection fault handling patch for Linux/M68K from Fergus
+Henderson and Roman Hodek.
+* Removed the tests for SGI_SOURCE in new_gc_alloc.h. This was causing that
+interface to fail on non-SGI platforms.
+* Changed the Linux stack finding code to use /proc, after changing it
+to use HEURISTIC1 (thanks to David Mosberger for pointing out /proc hook).
+* Added HP/UX incremental GC support and HP/UX 11 thread support.
+Thread support is currently still flaky.
+* Added basic Linux/IA64 support.
+* Integrated Anthony Green's PicoJava support.
+* Integrated Scott Ananian's StrongARM/NetBSD support.
+* Fixed some fairly serious performance bugs in the incremental
+collector. These have probably been there essentially forever.
+(Mark bits were sometimes set before scanning dirty pages.
+The reclaim phase unnecessarily dirtied full small object pages.)
+* Changed the reclaim phase to ignore nearly full pages to avoid
+touching them.
+* Limited GC_black_list_spacing to roughly the heap growth increment.
+* Changed full collection triggering heuristic to decrease full GC
+frequency by default, but to explicitly trigger full GCs during
+heap growth. This doesn't always improve things, but on average it's
+probably a win.
+* GC_debug_free(0, ...) failed (thanks to Fergus Henderson for the
+bug report and fix).
+
+
+== [5.0alpha3] 1999-09-15 ==
+
+(Also known as 4.15alpha3.)
+* Added some highly incomplete code to support a copied young generation.
+Comments on nursery.h are appreciated.
+* Changed -DFIND_LEAK, -DJAVA_FINALIZATION, and -DFINALIZE_ON_DEMAND,
+so the same effect could be obtained with a runtime switch. This is
+a step towards standardizing on a single dynamic GC library.
+* Significantly changed the way leak detection is handled, as a consequence
+of the above.
+
+
+== [5.0alpha2] 1999-07-23 ==
+
+* Fixed bugs introduced in alpha1 (OpenBSD & large block initialization).
+* Added -DKEEP_BACK_PTRS and backptr.h interface. (The implementation
+idea came from Alan Demers.)
+
+
+== [5.0alpha1] 1999-06-30 ==
+
+(Also known as 4.15alpha1.)
+* Reworked large block allocator. Now uses multiple doubly linked free
+lists to approximate best fit.
+* Changed heap expansion heuristic. Entirely free blocks are no longer
+counted towards the heap size. This seems to have a major impact on
+heap size stability; the old version could expand the heap way too
+much in the presence of large block fragmentation.
+* added -DGC_ASSERTIONS and some simple assertions inside the collector.
+This is mainlyt for collector debugging.
+* added -DUSE_MUNMAP to allow the heap to shrink. Supported on only
+a few UNIX-like platforms for now.
+* added GC_dump_regions() for debugging of fragmentation issues.
+* Changed PowerPC pointer alignment under Linux to 4.
+* Changed the Linux/Alpha port to walk the data segment backwards until
+it encounters a SIGSEGV. The old way to find the start of the data
+segment broke with a recent release.
+* cordxtra.c needed to call GC_REGISTER_FINALIZER instead of
+GC_register_finalizer, so that it would continue to work with GC_DEBUG.
+* allochblk sometimes cleared the wrong block for debugging purposes
+when it dropped blacklisted blocks. This could result in spurious
+error reports with GC_DEBUG.
+* added MACOS X Server support (thanks to Andrew Stone).
+* Changed the Solaris threads code to ignore stack limits > 8 MB with
+a warning. Empirically, it is not safe to access arbitrary pages
+in such large stacks. And the dirty bit implementation does not
+guarantee that none of them will be accessed.
+* Integrated Martin Tauchmann's Amiga changes.
+* Integrated James Dominy's OpenBSD/SPARC port.
+
+
+== [4.14] 1999-04-16 ==
+
+* changed STACKBOTTOM for DJGPP (thanks to Salvador Eduardo Tropea).
+
+
+== [4.14alpha2] 1999-03-26 ==
+
+* -DSMALL_CONFIG did not work reliably with large (> 4K) pages.
+Recycling the mark stack during expansion could result in a size
+zero heap segment, which confused things. (This was probably also an
+issue with the normal config and huge pages.)
+* Did more work to make sure that callee-save registers were scanned
+completely, even with the setjmp-based code. Added USE_GENERIC_PUSH_REGS
+macro to facilitate testing on machines I have access to.
+* Added code to explicitly push register contents for win32 threads.
+This seems to be necessary. (Thanks to Pierre de Rop.)
+
+
+== [4.14alpha1] 1999-03-10 ==
+
+* Fixed GC_print_source_ptr to not use a prototype.
+* generalized CYGWIN test.
+* gc::new did the wrong thing with PointerFreeGC placement (thanks to
+Rauli Ruohonen).
+* In the ALL_INTERIOR_POINTERS (default) case, some callee-save register
+values could fail to be scanned if the register was saved and
+reused in a GC frame. This showed up in verbose mode with gctest
+compiled with an unreleased SGI compiler. I vaguely recall an old
+bug report that may have been related. The bug was probably quite old.
+(The problem was that the stack scanning could be deferred until
+after the relevant frame was overwritten, and the new save location
+might be outside the scanned area. Fixed by more eager stack scanning.)
+* PRINT_BLACK_LIST had some problems. A few source addresses were garbage.
+* Replaced Makefile.dj and added -I flags to cord make targets (thanks to
+Gary Leavens).
+* GC_try_to_collect was broken with the non-incremental collector.
+* gc_cleanup destructors could pass the wrong address to
+GC_register_finalizer_ignore_self in the presence of multiple
+inheritance (thanks to Darrell Schiebel).
+* Changed PowerPC Linux stack finding code.
+
+
+== [4.13] 1999-02-19 ==
+
+* Fixed a crucial bug in the Watcom port. There was a redundant declaration
+of GC_push_one in gc_priv.h.
+* Added FINALIZE_ON_DEMAND.
+* Fixed some pre-ANSI cc problems in test.c.
+* Removed getpagesize() use for Solaris. It seems to be missing in one
+or two versions.
+* Fixed bool handling for SPARCCompiler version 4.2.
+* Fixed some files in include that had gotten unlinked from the main
+copy.
+* Some RS/6000 fixes (missing casts). (Thanks to Toralf Foerster.)
+* Fixed several problems in GC_debug_realloc, affecting mostly the
+FIND_LEAK case.
+* GC_exclude_static_roots contained a buggy unsigned comparison to
+terminate a loop (thanks to Wilson Ho).
+* CORD_str failed if the substring occurred at the last possible position.
+(Only affects cord users.)
+* Fixed Linux code to deal with RedHat 5.0 and integrated Peter Bigot's
+os_dep.c code for dealing with various Linux versions.
+* Added workaround for Irix pthreads sigaction bug and possible signal
+misdirection problems.
+
+
+== [4.13alpha3] 1998-12-08 ==
+
+* Fixed MSWIN32 recognition test, which interfered with cygwin.
+* Removed unnecessary gc_watcom.asm from distribution. Removed
+some obsolete README.win32 text.
+* Added Alpha Linux incremental GC support (thanks to Philipp Tomsich
+for code for retrieving the fault address in a signal handler).
+Changed Linux signal handler context argument to be a pointer.
+* Took care of some new warnings generated by the 7.3 SGI compiler.
+* Integrated Phillip Musumeci's FreeBSD/ELF fixes.
+* -DIRIX_THREADS was broken with the -o32 ABI (typo in gc_priv.h).
+
+
+== [4.13alpha2] 1998-08-08 ==
+
+* Fixed more Linux threads problems.
+* Changed default GC_free_space_divisor to 3 with new large block allocation
+(thanks to Matthew Flatt for some measurements that suggest the old
+value sometimes favors space too much over time).
+* More CYGWIN32 fixes.
+* Integrated Tyson Dowd's Linux-M68K port.
+* Minor HP PA and DEC UNIX fixes from Fergus Henderson.
+* Integrated Christoffe Raffali's Linux-SPARC changes.
+* Allowed for one more GC fixup iteration after a full GC in incremental
+mode. Some quick measurements suggested that this significantly
+reduces pause times even with smaller GC_RATE values.
+* Moved some more GC data structures into GC_arrays. This decreases
+pause times and GC overhead, but makes debugging slightly less convenient.
+* Fixed namespace pollution problem ("excl_table").
+* Made GC_incremental a constant for -DSMALL_CONFIG, hopefully shrinking
+that slightly.
+* Added some win32 threads fixes.
+* Integrated Ivan Demakov and David Stes' Watcom fixes.
+* Various other minor fixes contributed by many people.
+* Renamed config.h to gcconfig.h, since config.h tends to be used for
+many other things.
+* Integrated Matthew Flatt's support for 68K MacOS "far globals".
+* Fixed up some of the dynamic library Makefile targets for consistency
+across platforms.
+* Fixed a USE_MMAP typo that caused out-of-memory handling to fail
+on Solaris.
+* Added code to test.c to test thread creation a bit more.
+* Integrated GC_win32_free_heap (as suggested by Ivan Demakov).
+* Fixed Solaris 2.7 stack base finding problem. (This may actually
+have been done in an earlier alpha release.)
+
+
+== [4.13alpha1] 1998-02-17 ==
+
+* Changed RS6000 STACKBOTTOM.
+* Integrated Patrick Beard's Mac changes.
+* Alpha1 didn't compile on Irix m.n, m < 6.
+* Replaced Makefile.dj with a new one from Gary Leavens.
+* Added Andrew Stitcher's changes to support SCO OpenServer.
+* Added PRINT_BLACK_LIST, to allow debugging of high densities of false
+pointers.
+* Added code to debug allocator to keep track of return address
+in GC_malloc caller, thus giving a bit more context.
+* Changed default behavior of large block allocator to more
+aggressively avoid fragmentation. This is likely to slow down the
+collector when it succeeds at reducing space cost.
+* Integrated Fergus Henderson's CYGWIN32 changes. They are untested,
+but needed for newer versions.
+* USE_MMAP had some serious bugs. This caused the collector to fail
+consistently on Solaris with -DSMALL_CONFIG.
+* Added Linux threads support (thanks to Fergus Henderson).
+
+
+== [4.12] 1997-08-26 ==
+
+* Fixed ElfW definition in dyn_load.c.
+This prevented the dynamic library support from compiling on some
+older ELF Linux systems.
+* Fixed UTS4 port (which I apparently mangled during the integration).
+(Thanks to Alistair Crooks.)
+* "Make C++" failed on Suns with SC4.0, due to a problem with "bool".
+Fixed in gc_priv.h.
+* Added more pieces for GNU win32 (thanks to Timothy N. Newsham).
+The current state of things should suffice for at least some
+applications.
+* Changed the out of memory retry count handling. (This matters only
+if GC_max_retries > 0, which is no longer the default.)
+* If a /proc read failed repeatedly, GC_written_pages was not updated
+correctly (thanks to Peter Chubb for diagnosing this).
+* Under unlikely circumstances, the allocator could infinite loop in
+an out of memory situation (thanks to Kenjiro Taura for
+identifying the problem and supplying a fix).
+* Fixed a syntactic error in the DJGPP code. Also fixed a test program
+problem with DJGPP (thanks to Fergus Henderson and Peter Monks).
+* Atomic uncollectible objects were not treated correctly by the
+incremental collector. This resulted in weird log statistics and
+occasional performance problems (thanks to Peter Chubb for pointing this out).
+* Fixed some problems resulting from compilers that don't define
+__STDC__. In this case void * and char * were used inconsistently
+in some cases. (Void * should not have been used at all. If
+you have an ANSI superset compiler that does not define __STDC__,
+please compile with -D__STDC__=0. Thanks to Manuel Serrano and others
+for pointing out the problem.)
+* Fixed a compilation problem on Irix with -n32 and -DIRIX_THREADS.
+Also fixed some other IRIX_THREADS problems which may or may not have
+had observable symptoms.
+* Fixed an HP PA compilation problem in dyn_load.c (thanks to
+Philippe Queinnec).
+* SEGV fault handlers sometimes did not get reset correctly (thanks
+to David Pickens).
+* Added a fix for SOLARIS_THREADS on Intel (thanks to David Pickens).
+This probably needs more work to become functional.
+* Fixed struct sigcontext_struct in os_dep.c for compilation under
+Linux 2.1.X (thanks to Fergus Henderson).
+* Changed the DJGPP STACKBOTTOM and DATASTART values to those ones suggested
+(by Kristian Kristensen). These may still not be right, but it is
+it is likely to work more often than what was there before. They may
+even be exactly right.
+* Added a #include <string.h> to test_cpp.cc. This appears to help
+with HP/UX and gcc (thanks to Assar Westerlund).
+* Version 4.11 failed to run in incremental mode on recent 64-bit Irix
+kernels. This was a problem related to page unaligned heap segments.
+Changed the code to page align heap sections on all platforms.
+(I had mistakenly identified this as a kernel problem earlier.
+It was not.)
+* Version 4.11 did not make allocated storage executable, except on
+one or two platforms, due to a bug in a #if test (thanks to David Grove
+for pointing this out).
+* Added sparc_sunos4_mach_dep.s to support Sun's compilers under SunOS4.
+* Added GC_exclude_static_roots.
+* Fixed the object size mapping algorithm. This shouldn't matter,
+but the old code was ugly.
+* Heap checking code could die if one of the allocated objects was
+larger than its base address. (Unsigned underflow problem. Thanks
+to Clay Spence for isolating the problem.)
+* Added RS6000 (AIX) dynamic library support and fixed STACK_BOTTOM (thanks
+to Fred Stearns).
+* Added Fergus Henderson's patches for improved robustness with large
+heaps and lots of blacklisting.
+* Added Peter Chubb's changes to support Solaris Pthreads, to support
+MMAP allocation in Solaris, to allow Solaris to find dynamic libraries
+through /proc, to add malloc_typed_ignore_off_page, and a few other
+minor features and bug fixes.
+* The Solaris 2 port should not use sbrk. I received confirmation from
+Sun that the use of sbrk and malloc in the same program is not
+supported. The collector now defines USE_MMAP by default on Solaris.
+* Replaced the djgpp makefile with Gary Leavens' version.
+* Fixed MSWIN32 detection test.
+* Added Fergus Henderson's patches to allow putting the collector into
+a DLL under GNU win32.
+* Added Ivan V. Demakov's port to Watcom C on x86.
+* Added Ian Piumarta's Linux/PowerPC port.
+* Added PointerFreeGC to the placement options in gc_cpp.h (suggested by
+Brian Burton). This is of course unsafe, and may be controversial.
+On the other hand, it seems to be needed often enough that it's worth
+adding as a standard facility.
+* Add Lars Farm's suggestions on building the collector for MacOS.
+
+
+== [4.12alpha2] ==
+
+(Changes not specified.)
+
+
+== [4.11] 1996-12-03 ==
+
+* Rationalized (hopefully) GC_try_to_collect in an incremental collection
+environment. It appeared to not handle a call while a collection was in
+progress, and was otherwise too conservative.
+* Merged GC_reclaim_or_delete_all into GC_reclaim_all to get rid of some
+code.
+* Added Patrick Beard's Mac fixes, with substantial completely untested
+modifications.
+* Fixed the MPROTECT_VDB code to deal with large pages and imprecise
+fault addresses (as on an UltraSPARC running Solaris 2.5). Note that this
+was not a problem in the default configuration, which uses PROC_VDB.
+* The DEC Alpha assembly code needed to restore $gp between calls (thanks to
+Fergus Henderson for tracking this down and supplying a patch).
+* The write command for "de" was completely broken for large files.
+I used the easiest portable fix, which involved changing the semantics
+so that f.new is written instead of overwriting f. That's safer anyway.
+* Added README.solaris2 with a discussion of the possible problems of
+mixing the collector's sbrk allocation with malloc/realloc.
+* Changed the data segment starting address for SGI machines. The
+old code failed under IRIX6.
+* Required double word alignment for MIPS.
+* Various minor fixes to remove warnings.
+* Attempted to fix some Solaris threads problems (reported by Zhiying Chen).
+In particular, the collector could try to fork a thread with the
+world stopped as part of GC_thr_init. It also failed to deal with
+the case in which the original thread terminated before the whole
+process did.
+* Added -DNO_EXECUTE_PERMISSION. This has a major performance impact
+on the incremental collector under Irix, and perhaps under other
+operating systems.
+* Added some code to support allocating the heap with mmap. This may
+be preferable under some circumstances.
+* Integrated dynamic library support for HP (thanks to Knut Tvedten).
+* Integrated James Clark's win32 threads support, and made a number
+of changes to it (many of which suggested by Pontus Rydin). This is still
+not 100% solid.
+* Integrated Alistair G. Crooks' support for UTS4 running on an Amdahl
+370-class machine.
+* Fixed a serious bug in explicitly typed allocation. Objects requiring
+large descriptors where handled in a way that usually resulted in
+a segmentation fault in the marker (thanks to Jeremy Fitzhardinge
+for helping to track this down).
+* Added partial support for GNU win32 development (thanks to
+Fergus Henderson).
+* Added optional support for Java-style finalization semantics (thanks to
+Patrick Bridges). This is recommended only for Java implementations.
+* GC_malloc_uncollectable faulted instead of returning 0 when out of
+memory (thanks to Daniel R. Grayson for noticing).
+* Calls to GC_base before the collector was initialized failed on a
+DEC Alpha (thanks to Matthew Flatt).
+* Added base pointer checking to GC_REGISTER_FINALIZER in debugging mode
+(thanks to Jeremy Fitzhardinge).
+* GC_debug_realloc failed for uncollectible objects (thanks to
+Jeremy Fitzhardinge).
+* Explicitly typed allocation could crash if it ran out of memory (thanks to
+Jeremy Fitzhardinge).
+* Added minimal support for a DEC Alpha running Linux.
+* Fixed a problem with allocation of objects whose size overflowed
+ptrdiff_t. (This now fails unconditionally, as it should.)
+* Added the beginning of Irix pthread support.
+* Integrated Xiaokun Zhu's fixes for djgpp 2.01.
+* Added SGI-style STL allocator support (gc_alloc.h).
+* Fixed a serious bug in README.solaris2.
+Multi-threaded programs must include
+gc.h with SOLARIS_THREADS defined.
+* Changed GC_free so it actually deallocates uncollectible objects (thanks
+to Peter Chubb for pointing out the problem).
+* Added Linux ELF support for dynamic libraries (thanks to Patrick Bridges).
+* Changed the Borland cc configuration so that the assembler is not
+required.
+* Fixed a bug in the C++ test that caused it to fail in 64-bit
+environments.
+
+
+== [4.10t3] 1996-11-18 ==
+
+Some changes related to threads support.
+
+
+== [4.10] 1996-02-19 ==
+
+* Fixed a typo around a call to GC_collect_or_expand in alloc.c. It broke
+handling of out of memory. (Thanks to Patrick C. Beard for noticing.)
+
+
+== [4.9] 1996-02-12 ==
+
+* More README.debugging fixes.
+* Objects ready for finalization, but not finalized in the same GC
+cycle, could be prematurely collected. This occasionally happened
+in test_cpp.
+* Too little memory was obtained from the system for very large
+objects. That could cause a heap explosion if these objects were
+not contiguous (e.g. under PCR), and too much of them was blacklisted.
+* Due to an improper initialization, the collector was too hesitant to
+allocate blacklisted objects immediately after system startup.
+* Moved GC_arrays from the data into the bss segment by not explicitly
+initializing it to zero. This significantly
+reduces the size of executables, and probably avoids some disk accesses
+on program startup. It's conceivable that it might break a port that I
+didn't test.
+* Fixed EMX_MAKEFILE to reflect the gc_c++.h to gc_cpp.h renaming which
+occurred a while ago.
+
+
+== [4.8] 1995-11-20 ==
+
+* Changed a "comment" in a MacOS specific part of mach_dep.c that caused
+gcc to fail on other platforms.
+
+
+== [4.7] 1995-11-18 ==
+
+* Fixed some compilation problems with -DCHECKSUMS (thanks to Ian Searle).
+* Updated some Mac specific files (to synchronize with Patrick C. Beard).
+* Fixed a serious bug for machines with non-word-aligned pointers.
+(Thanks to Patrick C. Beard for pointing out the problem. The collector
+should fail almost any conceivable test immediately on such machines.)
+
+
+== [4.6] 1995-11-09 ==
+
+* Added Linux ELF support (thanks to Arrigo Triulzi).
+* GC_base crashed if it was called before any other GC_ routines.
+This could happen if a gc_cleanup object was allocated outside the heap
+before any heap allocation.
+* The heap expansion heuristic was not stable if all objects had finalization
+enabled. Fixed finalize.c to count memory in finalization queue and
+avoid explicit deallocation. Changed alloc.c to also consider this count.
+(This is still not recommended. It's expensive if nothing else. Thanks
+to John Ellis for pointing this out.)
+* GC_malloc_uncollectable(0) was broken (thanks to Phong Vo for pointing
+this out).
+* The collector didn't compile under Linux 1.3.X (thanks to Fred Gilham for
+pointing this out). The current workaround is ugly, but expected to be
+temporary.
+* Fixed a formatting problem for SPARC stack traces.
+* Fixed some '=='s in os_dep.c that should have been assignments.
+Fortunately these were in code that should never be executed anyway (thanks
+to Fergus Henderson).
+* Fixed the heap block allocator to only drop blacklisted blocks in small
+chunks. Made BL_LIMIT self adjusting. (Both of these were in response
+to heap growth observed by Paul Graham.)
+* Fixed the Metrowerks/68K Mac code to also mark from a6 (thanks to
+Patrick C. Beard).
+* Significantly updated README.debugging.
+* Fixed some problems with longjmps out of signal handlers, especially under
+Solaris. Added a workaround for the fact that siglongjmp doesn't appear to
+do the right thing with -lthread under Solaris.
+* Added MSDOS/djgpp port (thanks to Mitch Harris).
+* Added "make reserved_namespace" and "make user_namespace". The
+first renames ALL "GC_xxx" identifiers as "_GC_xxx". The second is the
+inverse transformation. Note that doing this is guaranteed to break all
+clients written for the other names.
+* descriptor field for kind NORMAL in GC_obj_kinds with ADD_BYTE_AT_END
+defined should be -ALIGNMENT not WORDS_TO_BYTES(-1). This is
+a serious bug on machines with pointer alignment of less than a word.
+* GC_ignore_self_finalize_mark_proc didn't handle pointers to very near the
+end of the object correctly. Caused failures of the C++ test on a DEC Alpha
+with g++.
+* gc_inl.h still had problems. Partially fixed. Added warnings at the
+beginning to hopefully specify the remaining dangers.
+* Added DATAEND definition to config.h.
+* Fixed some of the .h file organization. Fixed "make floppy".
+
+
+== [4.5] 1995-06-14 ==
+
+* Fixed many minor and one major README bugs (thanks to Franklin Chen
+for pointing out many of them).
+* Fixed ALPHA/OSF/1 dynamic library support (thanks to Jonathan Bachrach).
+* Added incremental GC support (MPROTECT_VDB) for Linux (with some
+help from Bruno Haible).
+* Altered SPARC recognition tests in gc.h and config.h (mostly as
+suggested by Fergus Henderson).
+* Added basic incremental GC support for win32, as implemented by
+Windows NT and Windows 95. GC_enable_incremental is a no-op
+under win32s, which doesn't implement enough of the VM interface.
+* Added -DLARGE_CONFIG.
+* Fixed GC_..._ignore_off_page to also function without
+-DALL_INTERIOR_POINTERS.
+* (Hopefully) fixed RS/6000 port. (Only the test was broken.)
+* Fixed a performance bug in the non-incremental collector running
+on machines supporting incremental collection with MPROTECT_VDB
+(e.g. SunOS 4, DEC AXP). This turned into a correctness bug under
+win32s with win32 incremental collection. (Not all memory protection
+was disabled.)
+* Fixed some ppcr related bit rot.
+* Caused dynamic libraries to be unregistered before re-registering.
+The old way turned out to be a performance bug on some machines.
+* GC_root_size was not properly maintained under MSWIN32.
+* Added -DNO_DEBUGGING and GC_dump.
+* Fixed a couple of bugs arising with SOLARIS_THREADS +
+REDIRECT_MALLOC.
+* Added NetBSD/M68K port (thanks to Peter Seebach).
+* Fixed a serious realloc bug. For certain object sizes, the collector
+wouldn't scan the expanded part of the object. (Thanks to Clay Spence
+for noticing the problem, and helping me to track it down.)
+
+
+== [4.4] 1995-02-18 ==
+
+* ASM_CLEAR_CODE was erroneously defined for HP
+PA machines, resulting in a compile error.
+* Fixed OS/2 Makefile to create a library (thanks to Mark Boulter).
+* Gc_cleanup objects didn't work if they were created on
+the stack. Fixed.
+* One copy of Gc_cpp.h in the distribution was out of
+synch, and failed to document some known compiler
+problems with explicit destructor invocation. Partially
+fixed. There are probably other compilers on which
+gc_cleanup is miscompiled.
+* Fixed Makefile to pass C compiler flags to C++ compiler.
+* Added Mac fixes.
+* Fixed os_dep.c to work around what appears to be
+a new and different VirtualQuery bug under newer
+versions of win32s.
+* GC_non_gc_bytes was not correctly maintained by
+GC_free. Fixed (thanks to James Clark).
+* Added GC_set_max_heap_size.
+* Changed allocation code to ignore blacklisting if it is preventing
+use of a very large block of memory. This has the advantage
+that naive code allocating very large objects is much more
+likely to work. The downside is you might no
+longer find out that such code should really use
+GC_malloc_ignore_off_page.
+* Changed GC_printf under win32 to close and reopen the file
+between calls. FAT file systems otherwise make the log file
+useless for debugging.
+* Added GC_try_to_collect and GC_get_bytes_since_gc. These
+allow starting an abortable collection during idle times.
+This facility does not require special OS support. (Thanks to
+Michael Spertus of Geodesic Systems for suggesting this. It was
+actually an easy addition. Kumar Srikantan previously added a similar
+facility to a now ancient version of the collector. At the time
+this was much harder, and the result was less convincing.)
+* Added some support for the Borland development environment (thanks
+to John Ellis and Michael Spertus).
+* Removed a misfeature from checksums.c that caused unexpected
+heap growth (thanks to Scott Schwartz).
+* Changed finalize.c to call WARN if it encounters a finalization cycle.
+WARN is defined in gc_priv.h to write a message, usually to stdout.
+In many environments, this may be inappropriate.
+* Renamed NO_PARAMS in gc.h to GC_NO_PARAMS, thus adhering to my own
+naming convention.
+* Added GC_set_warn_proc to intercept warnings.
+* Fixed Amiga port (thanks to Michel Schinz).
+* Fixed a bug in mark.c that could result in an access to unmapped
+memory from GC_mark_from_mark_stack on machines with unaligned
+pointers.
+* Fixed a win32 specific performance bug that could result in scanning of
+objects allocated with the system malloc.
+* Added REDIRECT_MALLOC.
+
+
+== [4.3] 1994-12-23 ==
+
+* Fixed SPARC alignment problem with GC_DEBUG.
+* Fixed Solaris threads /proc workaround. The real
+problem was an interaction with mprotect.
+* Incorporated fix from Patrick Beard for gc_c++.h (now gc_cpp.h).
+* Slightly improved allocator space utilization by
+fixing the GC_size_map mechanism.
+* Integrated some Sony News and MIPS RISCos 4.51
+patches (thanks to Nobuyuki Hikichi at Software Research Associates,
+Inc., Japan).
+* Fixed HP_PA alignment problem (thanks to Brian F. Dennis).
+* Added GC_same_obj and friends. Changed GC_base
+to return 0 for pointers past the end of large objects.
+Improved GC_base performance with ALL_INTERIOR_POINTERS
+on machines with a slow integer mod operation.
+Added GC_PTR_ADD, GC_PTR_STORE, etc. to prepare
+for preprocessor.
+* changed the default on most UNIX machines to be that
+signals are not disabled during critical GC operations.
+This is still ANSI-conforming, though somewhat dangerous
+in the presence of signal handlers. But the performance
+cost of the alternative is sometimes problematic.
+Can be changed back with a minor Makefile edit.
+* renamed IS_STRING in gc.h, to CORD_IS_STRING, thus
+following my own naming convention. Added the function
+CORD_to_const_char_star.
+* Fixed a gross bug in GC_finalize. Symptom: occasional
+address faults in that function (thanks to Anselm Baird-Smith).
+* Added port to ICL DRS6000 running DRS/NX. Restructured
+things a bit to factor out common code, and remove obsolete
+code. Collector should now run under SUNOS5 with either
+mprotect or /proc dirty bits. (Thanks to Douglas Steel.)
+* More bug fixes and workarounds for Solaris 2.X. (These were
+mostly related to putting the collector in a dynamic library,
+which didn't really work before. Also SOLARIS_THREADS
+didn't interact well with dl_open.) (Thanks to Brian Lewis.)
+* Fixed a serious performance bug on the DEC Alpha. The text
+segment was getting registered as part of the root set.
+(Amazingly, the result was still fast enough that the bug
+was not conspicuous.) The fix works on OSF/1, version 1.3.
+Hopefully it also works on other versions of OSF/1 ...
+* Fixed a bug in GC_clear_roots.
+* Fixed a bug in GC_generic_malloc_words_small that broke
+gc_inl.h (reported by Antoine de Maricourt).
+* Fixed some problems with cord/de under Linux.
+* Fixed some cord problems, notably with CORD_riter4.
+* Added DG/UX port (thanks to Ben A. Mesander).
+* Added finalization registration routines with weaker ordering
+constraints. (This is necessary for C++ finalization with
+multiple inheritance, since the compiler often adds self-cycles.)
+* Filled the holes in the SCO port (thanks to Michael Arnoldus).
+* Completely rewritten the documentation in the interface gc_c++.h
+(later renamed gc_cpp.h) making it both clearer and more precise (done by
+John Ellis).
+* The definition of accessibility now ignores pointers from a finalizable
+object (an object with a clean-up function) to itself (done by John Ellis).
+This allows objects with virtual base classes to be finalizable by the
+collector. Compilers typically implement virtual base classes using
+pointers from an object to itself, which under the old definition of
+accessibility prevented objects with virtual base classes from ever
+being collected or finalized.
+* gc_cleanup now includes gc as a virtual base. This was enabled by
+the change in the definition of accessibility (by John Ellis).
+* Added support for operator new[] (by John Ellis). Since most compilers
+don't yet support operator new[], it is conditionalized on
+-DOPERATOR_NEW_ARRAY. The code is untested, but it's trivial and looks
+correct.
+* The test program test_gc_c++ (later renamed test_cpp.cc)
+tries to test for the C++-specific functionality not tested by the
+other programs.
+* Added unistd.h include to misc.c. (Needed for ppcr.)
+* Added PowerMac port (thanks to Patrick C. Beard).
+* Fixed "srcdir"-related Makefile problems. Changed things so
+that all externally visible include files always appear in the
+include subdirectory of the source. Made gc.h directly
+includable from C++ code (thanks to Per Bothner).
+* Changed Intel code to also mark from ebp (thanks to Kevin Warne).
+* Renamed C++ related files so they could live in a FAT
+file system (thanks to Charles Fiterman).
+* Changed Windows NT Makefile to include C++ support in
+gc.lib. Added C++ test as Makefile target.
+
+
+== [4.2] 1994-08-03 ==
+
+* Multiple bug fixes/workarounds in the Solaris threads version.
+(It occasionally failed to locate some register contents for
+marking. It also turns out that thr_suspend and friends are
+unreliable in Solaris 2.3. Dirty bit reads appear
+to be unreliable under some weird
+circumstances. My stack marking code
+contained a serious performance bug. The new code is
+extremely defensive, and has not failed in several CPU
+hours of testing. But no guarantees ...)
+* Added MacOS support. (Thanks to Patrick C. Beard.
+David Chase suggested several improvements.)
+* Fixed several syntactic bugs in gc_c++.h and friends. (These
+didn't bother g++, but did bother most other compilers.)
+Fixed gc_c++.h finalization interface.
+* 64 bit alignment for allocated objects was not guaranteed in a
+few cases in which it should have been.
+* Added GC_malloc_atomic_ignore_off_page.
+* Added GC_collect_a_little.
+* Added some prototypes to gc.h.
+* Some other minor bug fixes (notably in Makefile).
+* Fixed OS/2 / EMX port (thanks to Ari Huttunen).
+* Fixed AmigaDOS port (thanks to Michel Schinz).
+* Fixed the DATASTART definition under Solaris. There
+was a 1 in 16K chance of the collector missing the first
+64K of static data (and thus crashing).
+* Fixed some blatant anachronisms in the README file.
+* Fixed PCR-Makefile for upcoming PPCR release.
+
+
+== [4.1] 1994-05-20 ==
+
+* Changed finalization implementation to guarantee that
+finalization procedures are called outside of the allocation
+lock, making direct use of the interface a little less dangerous.
+MAY BREAK EXISTING CLIENTS that assume finalizers
+are protected by a lock. Since there seem to be few multi-threaded
+clients that use finalization, this is hopefully not much of
+a problem.
+* Fixed a gross bug in CORD_prev.
+* Fixed a bug in blacklst.c that could result in unbounded
+heap growth during startup on machines that do not clear
+memory obtained from the OS (e.g. win32s).
+* Ported de editor to Win32 and win32s. (This is now the only
+version with a mouse-sensitive UI. Thanks to Rob Haack for the
+implementation based on the generic Windows application template.)
+* Added GC_malloc_ignore_off_page to allocate large arrays
+in the presence of ALL_INTERIOR_POINTERS.
+* Changed GC_call_with_alloc_lock to not disable signals in
+the single-threaded case.
+* Reduced retry count in GC_collect_or_expand for garbage
+collecting when out of memory.
+* Made uncollectible allocations bypass black-listing, as they
+should.
+* Fixed a bug in typed_test in test.c that could cause (legitimate)
+GC crashes.
+* Fixed some potential synchronization problems in finalize.c
+* Fixed a real locking problem in typd_mlc.c.
+* Worked around an AIX 3.2 compiler feature that results in
+out of bounds memory references.
+* Partially worked around an IRIX5.2 beta problem (which may
+or may not persist to the final release).
+* Fixed a bug in the heap integrity checking code that could
+result in explicitly deallocated objects being identified as
+smashed. Fixed a bug in the dbg_mlc stack saving code
+that caused old argument pointers to be considered live.
+* Fixed a bug in CORD_ncmp (and hence CORD_str).
+* Repaired the OS2 port, which had suffered from bit rot
+in 4.0. Worked around what appears to be CSet/2 V1.0
+optimizer bug.
+* Fixed a Makefile bug for target "c++".
+
+
+== [4.0] 1994-04-07 ==
+
+* Added support for Solaris threads (which was possible
+only by reimplementing some fraction of Solaris threads,
+since Sun doesn't currently make the thread debugging
+interface available).
+* Added non-threads Win32 and win32s support.
+* (Grudgingly, with suitable muttering of obscenities) renamed
+files so that the collector distribution could live on a FAT
+file system. Files that are guaranteed to be useless on
+a PC still have long names. Gc_inline.h and gc_private.h
+still exist, but now just include gc_inl.h and gc_priv.h.
+* Fixed a really obscure bug in finalization that could cause
+undetected mark stack overflows. (I would be surprised if
+any real code ever tickled this one.)
+* Changed finalization code to dynamically resize the hash
+tables it maintains. (This probably does not matter for well-
+-written code. It no doubt does for C++ code that overuses
+destructors.)
+* Added typed allocation primitives. Rewrote the marker to
+accommodate them with more reasonable efficiency. This
+change should also speed up marking for GC_malloc allocated
+objects a little. See gc_typed.h for new primitives. (Thanks to
+Zhong Shao performed much of the experimentation that led to the
+current typed allocation facility.)
+* Improved debugging facilities slightly. Allocation time
+stack traces are now kept by default on SPARC/SUNOS4. (Thanks to
+Scott Schwartz.)
+* Added better support for small heap applications.
+* Significantly extended cord package. Fixed a bug in the
+implementation of lazily read files. Printf and friends now
+have cord variants. Cord traversals are a bit faster.
+* Made ALL_INTERIOR_POINTERS recognition the default.
+* Fixed de so that it can run in constant space, independent
+of file size. Added simple string searching to cords and de.
+* Added the Hull-Ellis C++ interface (supplied by Jesse Hull and John Ellis).
+* Added dynamic library support for OSF/1 (thanks to Alan Dosser and
+Tim Bingham at DEC).
+* Changed argument to GC_expand_hp to be expressed
+in units of bytes instead of heap blocks. (Necessary
+since the heap block size now varies depending on
+configuration. The old version was never very clean.)
+* Added GC_get_heap_size(). The previous "equivalent"
+was broken.
+* Restructured the Makefile a bit.
+* Added FreeBSD port (provided by Jeffrey Hsu).
+
+
+== [3.7] 1994-03-15 ==
+
+* Added a workaround for an HP/UX compiler bug.
+* Fixed another stack clearing performance bug. Reworked
+that code once more.
+
+
+== [3.6] 1994-01-14 ==
+
+* fixed a bug in the mark stack growth code that was introduced
+in 3.4.
+* fixed Makefile to work around DEC AXP compiler tail recursion
+bug.
+
+
+== [3.5] ==
+
+* Minor collections now mark from roots only once, if that
+doesn't cause an excessive pause.
+* The stack clearing heuristic was refined to prevent anomalies
+with very heavily recursive programs and sparse stacks.
+* Fixed a bug that prevented mark stack growth in some cases.
+GC_objects_are_marked should be set to TRUE after a call
+to GC_push_roots and as part of GC_push_marked, since
+both can now set mark bits. I think this is only a performance
+bug, but I wouldn't bet on it. It's certainly very hard to argue
+that the old version was correct.
+* Fixed an incremental collection bug that prevented it from
+working at all when HBLKSIZE != getpagesize()
+* Changed dynamic_loading.c to include gc_priv.h before testing
+DYNAMIC_LOADING. SunOS dynamic library scanning
+must have been broken in 3.4.
+* Object size rounding now adapts to program behavior.
+* Added a workaround (provided by Manuel Serrano and
+colleagues) to a long-standing SunOS 4.X (and 3.X) ld bug
+that I had incorrectly assumed to have been squished.
+The collector was broken if the text segment size was within
+32 bytes of a multiple of 8K bytes, and if the beginning of
+the data segment contained interesting roots. The workaround
+assumes a demand-loadable executable. The original may have
+have "worked" in some other cases.
+* Added dynamic library support under IRIX5.
+* Added support for EMX under OS/2 (thanks to Ari Huttunen).
+* Added support of Motorola 88K processor running CX/UX (by Brent Benson).
+
+
+== [3.4] ==
+
+* Fixed a performance bug in GC_realloc.
+* Updated the amiga port.
+* Added NetBSD and 386BSD ports (supplied by Alistair G. Crooks).
+* Added cord library.
+* Added trivial performance enhancement for
+ALL_INTERIOR_POINTERS (do not scan last word).
+
+
+== [3.3] 1993-10-02 ==
+
+* PCR-specific bugs (thanks to Neil Sharman).
+* Missing locking in GC_free, redundant FASTUNLOCK
+in GC_malloc_stubborn, and 2 bugs in
+GC_unregister_disappearing_link (pointed out by Neil Sharman).
+* Common symbols allocated by the SunOS4.X dynamic loader
+were not included in the root set.
+* Bug in GC_finalize (reported by Brian Beuning and Alan Dosser).
+* Merged Amiga port from Jesper Peterson (untested).
+* Merged NeXT port from Thomas Funke (significantly
+modified and untested). (Also thanks to Brian D. Carlstrom for
+the supplied the NeXT ports.)
+
+
+== [3.2] ==
+
+Fixed a serious and not entirely repeatable bug in
+the incremental collector. It appeared only when dirty bit info
+on the roots was available, which is normally only under Solaris.
+It also added GC_general_register_disappearing_link, and some
+testing code. Interface.c disappeared.
+
+
+== [3.1] ==
+
+* A workaround for a SunOS 4.X SPARC C compiler
+misfeature that caused problems when the collector was turned into
+a dynamic library.
+* A fix for a bug in GC_base that could result in a memory fault.
+* A fix for a performance bug (and several other misfeatures) pointed
+out by Dave Detlefs and Alan Dosser.
+* Use of dirty bit information for static data under Solaris 2.X.
+* DEC Alpha/OSF1 support (thanks to Alan Dosser).
+* Incremental collection on more platforms.
+* A more refined heap expansion policy. Less space usage by default.
+* Various minor enhancements to reduce space usage, and to reduce
+the amount of memory scanned by the collector.
+* Uncollectible allocation without per object overhead.
+* More conscientious handling of out-of-memory conditions.
+* Fixed a bug in debugging stubborn allocation.
+* Fixed a bug that resulted in occasional erroneous reporting of smashed
+objects with debugging allocation.
+* Fixed bogus leak reports of size 4096 blocks with FIND_LEAK.
+
+
+== [3.0] ==
+
+Added generational/incremental collection and stubborn objects.
+
+
+== [2.6] 1993-04-27 ==
+
+(Changes not specified.)
+
+
+== [2.5] ==
+
+* Removed an explicit call to exit(1)
+* Fixed calls to GC_printf and GC_err_printf, so the correct number of
+arguments are always supplied. The OS/2 C compiler gets confused if
+the number of actuals and the number of formals differ. (ANSI C
+doesn't require this to work. The ANSI sanctioned way of doing things
+causes too many compatibility problems.)
+
+
+== [2.4] 1993-01-26 ==
+
+Added GC_free_space_divisor as a tuning knob, added
+support for OS/2 and linux, and fixed the following bugs:
+* On machines with unaligned pointers (e.g. Sun 3), every 128th word could
+fail to be considered for marking.
+* Dynamic_load.c erroneously added 4 bytes to the length of the data and
+bss sections of the dynamic library. This could result in a bad memory
+reference if the actual length was a multiple of a page. (Observed on
+Sun 3. Can probably also happen on a Sun 4.)
+(Thanks to Robert Brazile for pointing out that the Sun 3 version
+was broken. Dynamic library handling is still broken on Sun 3s
+under 4.1.1U1, but apparently not 4.1.1. If you have such a machine,
+use -Bstatic.)
+
+
+== [2.3] ==
+
+* Added ALL_INTERIOR_POINTERS.
+* Missing declaration of etext in the A/UX version.
+* Some PCR root-finding problems.
+* Blacklisting was not 100% effective, because the plausible future
+heap bounds were being miscalculated.
+* GC_realloc didn't handle out-of-memory correctly.
+* GC_base could return a nonzero value for addresses inside free blocks.
+* test.c wasn't really thread safe, and could erroneously report failure
+in a multi-threaded environment. (The locking primitives need to be
+replaced for other threads packages.)
+* GC_CONS was thoroughly broken.
+* On a SPARC with dynamic linking, signals stayed disabled while the
+client code was running (thanks to Manuel Serrano).
+
+
+== [2.2] ==
+
+* GC_realloc could fail to extend the size of the object for certain large
+object sizes.
+* A blatant subscript range error in GC_printf, which unfortunately
+wasn't exercised on machines with sufficient stack alignment constraints.
+* GC_register_displacement did the wrong thing if it was called after
+any allocation had taken place.
+* The leak finding code would eventually break after 2048 byte
+byte objects leaked.
+* interface.c didn't compile.
+* The heap size remained much too small for large stacks.
+* The stack clearing code behaved badly for large stacks, and perhaps
+on HP/PA machines.
+
+
+== [2.1] ==
+
+* The first stable version since 1.9.
+* Added support for PPCR.
+
+
+== [2.0] ==
+
+* Introduced a consistent naming convention for collector
+routines and added support for registering dynamic library data segments
+in the standard mark_roots.c (original code supporting the SunOS dynamic
+loader provided by Bill Janssen). Most of the data structures were revamped.
+The treatment of interior pointers was completely changed. Finalization
+was added. Support for locking was added. Object kinds were added.
+We added a black listing facility to avoid allocating at addresses known
+to occur as integers somewhere in the address space. Much of this
+was accomplished by adapting ideas and code from the PCR collector.
+The test program was changed and expanded.
+
+
+== [1.9] 1992-01-29 ==
+
+* fixed a major bug in gc_realloc.
+
+
+== [1.8] ==
+
+* added ULTRIX support in gc_private.h. (Robert Brazile originally supplied
+the ULTRIX code. Alan Dosser and Regis Cridlig subsequently provided updates
+and information on variation between ULTRIX systems.)
+
+
+== [1.5] ==
+
+* ensure 8 byte alignment for objects allocated on a sparc based machine.
+
+
+== [1.4] ==
+
+* Does not use compile time determined values
+for the stack base. This no longer works on Sun 3s, since Sun 3/80s use
+a different stack base. We now use a straightforward heuristic on all
+machines on which it is known to work (incl. Sun 3s) and compile-time
+determined values for the rest. There should really be library calls
+to determine such values.
+
+
+== [1.3] ==
+
+* Fixed spurious
+assembly language assignments to TMP_SP. Only the assignment in the PC/RT
+code is necessary. On other machines, with certain compiler options,
+the assignments can lead to an unsaved register being overwritten.
+Known to cause problems under SunOS 3.5 WITHOUT the -O option. (With
+-O the compiler recognizes it as dead code. It probably shouldn't,
+but that's another story.)
+The SPARC-specific code was originally contributed by Mark Weiser.
+The Encore Multimax modifications were supplied by Kevin Kenny.
+The adaptation to the IBM PC/RT is largely
+due to Vernon Lee, on machines made available to Rice by IBM.
+Much of the HP specific code and a number of good suggestions for improving
+the generic code are due to Walter Underwood.
+Parag Patel supplied the A/UX code.
+Manuel Serrano supplied linux and Sony News specific code.
diff --git a/graphics/asymptote/gc/Config.cmake.in b/graphics/asymptote/gc/Config.cmake.in
new file mode 100644
index 0000000000..354f0ae317
--- /dev/null
+++ b/graphics/asymptote/gc/Config.cmake.in
@@ -0,0 +1,5 @@
+# The BDWgc CMake configuration file.
+
+@PACKAGE_INIT@
+include("${CMAKE_CURRENT_LIST_DIR}/BDWgcTargets.cmake")
+check_required_components(gc)
diff --git a/graphics/asymptote/gc/Makefile.am b/graphics/asymptote/gc/Makefile.am
new file mode 100644
index 0000000000..1cf6dc562f
--- /dev/null
+++ b/graphics/asymptote/gc/Makefile.am
@@ -0,0 +1,249 @@
+# Copyright (c) 1999-2001 by Red Hat, Inc. All rights reserved.
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+## Process this file with automake to produce Makefile.in.
+
+# Info (current:revision:age) for the Libtool versioning system.
+# These numbers should be updated at most once just before the release,
+# and, optionally, at most once during the development (after the release).
+LIBGC_VER_INFO = 6:4:5
+LIBGCCPP_VER_INFO = 6:0:5
+
+## FIXME: `make distcheck' in this directory will not currently work.
+## This is most likely to the explicit flags passed to submakes.
+
+# We currently use the source files directly from libatomic_ops, if we
+# use the internal version. This is done since libatomic_ops doesn't
+# use libtool, since it has no real use for it. But that seems to make
+# it hard to use either the resulting object files or libraries.
+# Thus there seems to be no real reason to recursively build in the
+# libatomic_ops directory.
+# if USE_INTERNAL_LIBATOMICS_OPS
+# SUBDIRS = @maybe_libatomic_ops@
+# else
+# SUBDIRS =
+# endif
+SUBDIRS =
+
+ACLOCAL_AMFLAGS = -I m4
+AM_CPPFLAGS = \
+ -I$(top_builddir)/include -I$(top_srcdir)/include \
+ $(ATOMIC_OPS_CFLAGS)
+
+## Initialize variables so that we can declare files locally.
+EXTRA_DIST =
+lib_LTLIBRARIES =
+include_HEADERS =
+pkginclude_HEADERS =
+dist_noinst_HEADERS =
+check_PROGRAMS =
+check_LTLIBRARIES =
+TESTS =
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = bdw-gc.pc
+
+# C Library
+# ---------
+
+lib_LTLIBRARIES += libgc.la
+
+if SINGLE_GC_OBJ
+
+libgc_la_SOURCES = extra/gc.c
+
+if PTHREAD_START_STANDALONE
+AM_CPPFLAGS += -DGC_PTHREAD_START_STANDALONE
+libgc_la_SOURCES += pthread_start.c
+endif
+
+else
+
+EXTRA_DIST += extra/gc.c
+libgc_la_SOURCES = \
+ allchblk.c alloc.c blacklst.c dbg_mlc.c \
+ dyn_load.c finalize.c gc_dlopen.c headers.c \
+ mach_dep.c malloc.c mallocx.c mark.c mark_rts.c misc.c new_hblk.c \
+ obj_map.c os_dep.c ptr_chck.c reclaim.c specific.c typd_mlc.c
+
+# C Library: Architecture Dependent
+# ---------------------------------
+
+if WIN32_THREADS
+libgc_la_SOURCES += win32_threads.c
+else
+if PTHREADS
+# Not Cygwin or MinGW.
+libgc_la_SOURCES += pthread_start.c pthread_support.c
+if DARWIN_THREADS
+libgc_la_SOURCES += darwin_stop_world.c
+else
+libgc_la_SOURCES += pthread_stop_world.c
+endif
+endif
+endif
+
+if THREAD_LOCAL_ALLOC
+libgc_la_SOURCES += thread_local_alloc.c
+endif
+
+if MAKE_BACK_GRAPH
+libgc_la_SOURCES += backgraph.c
+endif
+
+if CHECKSUMS
+libgc_la_SOURCES += checksums.c
+endif
+
+if ENABLE_GCJ_SUPPORT
+libgc_la_SOURCES += gcj_mlc.c
+endif
+
+if ENABLE_DISCLAIM
+libgc_la_SOURCES += fnlz_mlc.c
+endif
+
+## End of !SINGLE_GC_OBJ
+endif
+
+if PTHREADS
+pkginclude_HEADERS += include/gc_pthread_redirects.h
+endif
+
+if ENABLE_GCJ_SUPPORT
+pkginclude_HEADERS += include/gc_gcj.h
+endif
+
+if ENABLE_DISCLAIM
+pkginclude_HEADERS += include/gc_disclaim.h
+endif
+
+if USE_INTERNAL_LIBATOMIC_OPS
+nodist_libgc_la_SOURCES = libatomic_ops/src/atomic_ops.c
+if NEED_ATOMIC_OPS_ASM
+nodist_libgc_la_SOURCES += libatomic_ops/src/atomic_ops_sysdeps.S
+endif
+endif
+
+# Include THREADDLLIBS here to ensure that the correct versions of
+# linuxthread semaphore (and clock_gettime) functions get linked:
+libgc_la_LIBADD = @addobjs@ $(THREADDLLIBS) $(UNWINDLIBS) $(ATOMIC_OPS_LIBS)
+libgc_la_DEPENDENCIES = @addobjs@
+libgc_la_LDFLAGS = $(extra_ldflags_libgc) -version-info $(LIBGC_VER_INFO) \
+ -no-undefined
+
+EXTRA_libgc_la_SOURCES = ia64_save_regs_in_stack.s sparc_mach_dep.S \
+ sparc_netbsd_mach_dep.s
+
+if CPLUSPLUS
+# C++ Interface
+# -------------
+lib_LTLIBRARIES += libgccpp.la
+pkginclude_HEADERS += include/gc_allocator.h include/gc_cpp.h
+include_HEADERS += include/extra/gc_cpp.h
+libgccpp_la_SOURCES = gc_badalc.cc gc_cpp.cc
+libgccpp_la_LIBADD = libgc.la
+libgccpp_la_LDFLAGS = -version-info $(LIBGCCPP_VER_INFO) -no-undefined
+if GC_TBA_LIBRARY
+# The same as libgccpp but contains only gc_badalc.o.
+lib_LTLIBRARIES += libgctba.la
+libgctba_la_SOURCES = gc_badalc.cc
+libgctba_la_LIBADD = libgc.la
+# Set the same version as for libgccpp.
+libgctba_la_LDFLAGS = -version-info $(LIBGCCPP_VER_INFO) -no-undefined
+endif
+endif
+
+## FIXME: If Visual C++ users use Makefile.am, this should go into
+## pkginclude_HEADERS with proper AM_CONDITIONALization. Otherwise
+## delete this comment.
+EXTRA_DIST += gc_badalc.cpp gc_cpp.cpp
+
+
+# Misc
+# ----
+
+AM_CXXFLAGS = @GC_CFLAGS@
+AM_CFLAGS = $(WERROR_CFLAGS) @GC_CFLAGS@
+
+CFLAGS += $(CFLAGS_EXTRA)
+CXXFLAGS += $(CFLAGS_EXTRA)
+
+## FIXME: relies on internal code generated by automake.
+## FIXME: ./configure --enable-dependency-tracking should be used
+#all_objs = @addobjs@ $(libgc_la_OBJECTS)
+#$(all_objs) : include/private/gcconfig.h include/private/gc_priv.h \
+#include/private/gc_hdrs.h include/gc.h include/gc_gcj.h \
+#include/gc_pthread_redirects.h include/gc_config_macros.h \
+#include/private/thread_local_alloc.h include/private_support.h \
+#include/private/pthread_stop_world.h \
+#include/gc_mark.h @addincludes@
+
+## FIXME: we shouldn't have to do this, but automake forces us to.
+## We use -Wp,-P to strip #line directives. Irix `as' chokes on
+## these.
+if ASM_WITH_CPP_UNSUPPORTED
+ ASM_CPP_OPTIONS =
+else
+ ASM_CPP_OPTIONS = -Wp,-P -x assembler-with-cpp
+endif
+
+.s.lo:
+ $(LTCOMPILE) $(ASM_CPP_OPTIONS) -c $<
+
+.S.lo:
+ $(LTCOMPILE) $(ASM_CPP_OPTIONS) -c $<
+
+## We need to add DEFS to assembler flags
+## :FIXME: what if assembler does not accept -D... ?
+## (use Autoconf to prepare ASDEFS?)
+
+CCASFLAGS += $(DEFS)
+
+# headers which are not installed
+# (see include/include.am for more)
+#
+
+# documentation which is not installed
+#
+EXTRA_DIST += README.QUICK
+
+# other makefiles
+EXTRA_DIST += NT_MAKEFILE OS2_MAKEFILE PCR-Makefile digimars.mak \
+ Makefile.direct SMakefile.amiga WCC_MAKEFILE autogen.sh CMakeLists.txt \
+ Config.cmake.in build/s60v3/bld.inf build/s60v3/libgc.mmp
+
+# files used by makefiles other than Makefile.am
+#
+EXTRA_DIST += tools/if_mach.c tools/if_not_there.c tools/setjmp_t.c \
+ tools/threadlibs.c extra/MacOS.c extra/AmigaOS.c \
+ extra/symbian/global_end.cpp extra/symbian/global_start.cpp \
+ extra/symbian/init_global_static_roots.cpp extra/symbian.cpp \
+ extra/pcr_interface.c extra/real_malloc.c \
+ extra/Mac_files/datastart.c extra/Mac_files/dataend.c \
+ extra/Mac_files/MacOS_config.h \
+ include/private/msvc_dbg.h extra/msvc_dbg.c tools/callprocs.sh
+
+#
+# :GOTCHA: GNU make rule for making .s out of .S is flawed,
+# it will not remove dest if building fails
+.S.s:
+ if $(CPP) $< >$@ ; then :; else rm -f $@; fi
+
+include include/include.am
+include cord/cord.am
+include tests/tests.am
+include doc/doc.am
+## Putting these at the top causes cord to be built first, and not find
+## libgc.a on HP/UX. There may be a better fix.
+
+# A dummy target for mono build.
+test-bundle:
diff --git a/graphics/asymptote/gc/Makefile.direct b/graphics/asymptote/gc/Makefile.direct
new file mode 100644
index 0000000000..27612cb991
--- /dev/null
+++ b/graphics/asymptote/gc/Makefile.direct
@@ -0,0 +1,431 @@
+# This is the original manually generated Makefile. It may still be used
+# to build the collector.
+#
+# Primary targets:
+# all - builds gc.a, gccpp.a, gctba.a and cord.a
+# base_lib - builds gc.a only (basic library)
+# c++ - builds gccpp.a and gctba.a only (C++ interface to library)
+# cords - builds cord.a only (heavyweight strings library)
+# check - same as "all" but also prints porting information, and runs some
+# tests of collector and cords
+# check-cpp - builds gc.a, gccpp.a and gctba.a, runs C++ only test
+# cord/de - builds dumb editor based on cords.
+
+ABI_FLAG=
+# ABI_FLAG should be the cc flag that specifies the ABI. On most
+# platforms this will be the empty string. Possible values:
+# +DD64 for 64-bit executable on HP/UX.
+# -n32, -n64, -o32 for SGI/MIPS ABIs.
+
+AS_ABI_FLAG=$(ABI_FLAG)
+# ABI flag for assembler. On HP/UX this is +A64 for 64 bit
+# executables.
+
+CC=cc $(ABI_FLAG)
+# Compiler executable name. For EMX, replace to "gcc".
+
+CXX= c++ $(ABI_FLAG)
+# Needed only for "make c++", which builds the C++ interface.
+
+AS=as $(AS_ABI_FLAG)
+# The above doesn't work with gas, which doesn't run cpp.
+# Define AS as `gcc -c -x assembler-with-cpp' instead.
+# Under Irix 6, you have to specify the ABI (-o32, -n32, or -64)
+# if you use something other than the default ABI on your machine.
+
+LD=ld
+
+# Redefining srcdir allows object code for the nonPCR version of the collector
+# to be generated in different directories.
+srcdir= .
+VPATH= $(srcdir)
+
+# Path to atomic_ops source.
+AO_SRC_DIR=$(srcdir)/libatomic_ops
+
+CFLAGS_EXTRA=
+# We need CFLAGS_FOR_PIC because we might be building a shared library.
+CFLAGS= -O -I$(srcdir)/include -I$(AO_SRC_DIR)/src \
+ -DALL_INTERIOR_POINTERS -DENABLE_DISCLAIM -DGC_ATOMIC_UNCOLLECTABLE \
+ -DGC_GCJ_SUPPORT -DJAVA_FINALIZATION -DNO_EXECUTE_PERMISSION \
+ -DUSE_MMAP -DUSE_MUNMAP $(CFLAGS_FOR_PIC) $(CFLAGS_EXTRA)
+
+# To build the collector with threads support, add to the above:
+# -DGC_THREADS -DPARALLEL_MARK -DTHREAD_LOCAL_ALLOC
+#
+# To build the preload library that intercepts malloc, add:
+# -DGC_USE_DLOPEN_WRAP -DREDIRECT_MALLOC=GC_malloc -fpic
+
+# To build the collector with fork() support by default, add to the above:
+# -DHANDLE_FORK
+
+# HOSTCC and HOSTCFLAGS are used to build executables that will be run as
+# part of the build process, i.e. on the build machine. These will usually
+# be the same as CC and CFLAGS, except in a cross-compilation environment.
+# Note that HOSTCFLAGS should include any -D flags that affect thread support.
+HOSTCC=$(CC)
+HOSTCFLAGS=$(CFLAGS)
+
+# For dynamic library builds, it may be necessary to add flags to generate
+# PIC code, e.g. -fPIC on Linux.
+
+# Setjmp_test may yield overly optimistic results when compiled
+# without optimization.
+
+# Look into doc/README.macros for the description of the "define arguments"
+# influencing the collector configuration.
+
+CXXFLAGS= $(CFLAGS)
+AR= ar
+
+RANLIB= ranlib
+# For EMX, replace "ranlib" with "ar s".
+
+# All .o files of libgc.a except for dyn_load.o.
+OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o \
+ headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o \
+ malloc.o checksums.o pthread_support.o pthread_stop_world.o \
+ darwin_stop_world.o typd_mlc.o ptr_chck.o mallocx.o gcj_mlc.o specific.o \
+ gc_dlopen.o backgraph.o win32_threads.o pthread_start.o \
+ thread_local_alloc.o fnlz_mlc.o atomic_ops.o atomic_ops_sysdeps.o
+
+CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c \
+ headers.c mark.c obj_map.c blacklst.c finalize.c \
+ new_hblk.c dyn_load.c dbg_mlc.c malloc.c \
+ checksums.c pthread_support.c pthread_stop_world.c darwin_stop_world.c \
+ typd_mlc.c ptr_chck.c mallocx.c gcj_mlc.c specific.c gc_dlopen.c \
+ backgraph.c win32_threads.c pthread_start.c thread_local_alloc.c fnlz_mlc.c
+
+CORD_SRCS= cord/cordbscs.c cord/cordxtra.c cord/cordprnt.c cord/tests/de.c \
+ cord/tests/cordtest.c include/cord.h include/ec.h \
+ include/cord_pos.h cord/tests/de_win.c cord/tests/de_win.h \
+ cord/tests/de_cmds.h cord/tests/de_win.rc
+
+CORD_OBJS= cord/cordbscs.o cord/cordxtra.o cord/cordprnt.o
+
+SRCS= $(CSRCS) \
+ include/gc.h include/gc_typed.h include/gc_tiny_fl.h \
+ include/gc_version.h include/private/gc_hdrs.h include/private/gc_priv.h \
+ include/private/gcconfig.h include/private/gc_pmark.h \
+ include/gc_inline.h include/gc_mark.h include/gc_disclaim.h \
+ tools/threadlibs.c tools/if_mach.c tools/if_not_there.c gc_badalc.cc \
+ gc_cpp.cc include/gc_cpp.h include/private/gc_alloc_ptrs.h \
+ include/gc_allocator.h include/javaxfc.h include/gc_backptr.h \
+ include/gc_gcj.h include/private/gc_locks.h include/private/dbg_mlc.h \
+ include/private/specific.h include/leak_detector.h \
+ include/gc_pthread_redirects.h include/private/gc_atomic_ops.h \
+ include/gc_config_macros.h include/private/pthread_support.h \
+ include/private/pthread_stop_world.h include/private/darwin_semaphore.h \
+ include/private/darwin_stop_world.h include/private/thread_local_alloc.h \
+ ia64_save_regs_in_stack.s sparc_mach_dep.S \
+ sparc_netbsd_mach_dep.s $(CORD_SRCS)
+
+CORD_INCLUDE_FILES= $(srcdir)/include/gc.h $(srcdir)/include/cord.h \
+ $(srcdir)/include/ec.h $(srcdir)/include/cord_pos.h
+
+# Executable file name extension. For EMX, specify ".exe".
+EXEEXT=
+
+UTILS= if_mach$(EXEEXT) if_not_there$(EXEEXT) threadlibs$(EXEEXT)
+
+# Libraries needed for curses applications. Only needed for de.
+# It might also require -ltermlib on some targets.
+CURSES= -lcurses
+
+# The following is irrelevant on most systems. But a few
+# versions of make otherwise fork the shell specified in
+# the SHELL environment variable.
+SHELL= /bin/sh
+
+SPECIALCFLAGS= -I$(srcdir)/include -I$(AO_SRC_DIR)/src $(CFLAGS_FOR_PIC)
+# Alternative flags to the C compiler for mach_dep.c.
+# Mach_dep.c often doesn't like optimization, and it's
+# not time-critical anyway.
+# Set SPECIALCFLAGS to -q nodirect_code on Encore.
+
+all: base_lib cords c++
+
+atomic_ops.o: $(AO_SRC_DIR)/src/atomic_ops.c
+ $(CC) $(CFLAGS) -c -o $@ $(AO_SRC_DIR)/src/atomic_ops.c
+# For some reason, Solaris make does not handle "$<" properly.
+
+atomic_ops_sysdeps.o: $(AO_SRC_DIR)/src/atomic_ops_sysdeps.S
+ $(CC) $(CFLAGS) -c -o $@ $(AO_SRC_DIR)/src/atomic_ops_sysdeps.S
+
+LEAKFLAGS= $(CFLAGS) -DFIND_LEAK
+
+BSD-pkg-all: bsd-libgc.a bsd-libleak.a
+
+bsd-libgc.a bsd-libgccpp.a bsd-libgctba.a:
+ $(MAKE) -f Makefile.direct CFLAGS="$(CFLAGS)" clean c++-t
+ mv gc.a bsd-libgc.a
+ mv gccpp.a bsd-libgccpp.a
+ mv gctba.a bsd-libgctba.a
+
+bsd-libleak.a:
+ $(MAKE) -f Makefile.direct CFLAGS="$(LEAKFLAGS)" clean c++-nt
+ mv gc.a bsd-libleak.a
+
+BSD-pkg-install: BSD-pkg-all
+ ${CP} bsd-libgc.a libgc.a
+ ${INSTALL_DATA} libgc.a ${PREFIX}/lib
+ ${CP} bsd-libgccpp.a libgccpp.a
+ ${INSTALL_DATA} libgccpp.a ${PREFIX}/lib
+ ${CP} bsd-libgctba.a libgctba.a
+ ${INSTALL_DATA} libgctba.a ${PREFIX}/lib
+ ${INSTALL_DATA} gc.h gc_cpp.h ${PREFIX}/include
+ ${INSTALL_MAN} doc/gc.man ${PREFIX}/man/man3/gc.3
+
+pcr: PCR-Makefile include/private/gc_private.h include/private/gc_hdrs.h \
+ include/private/gc_locks.h include/gc.h include/private/gcconfig.h \
+ mach_dep.o $(SRCS)
+ $(MAKE) -f PCR-Makefile depend
+ $(MAKE) -f PCR-Makefile
+
+$(OBJS) tests/test.o dyn_load.o dyn_load_sunos53.o: \
+ $(srcdir)/include/private/gc_priv.h \
+ $(srcdir)/include/private/gc_hdrs.h $(srcdir)/include/private/gc_locks.h \
+ $(srcdir)/include/gc.h $(srcdir)/include/gc_pthread_redirects.h \
+ $(srcdir)/include/private/gcconfig.h $(srcdir)/include/gc_typed.h \
+ $(srcdir)/include/gc_config_macros.h
+
+mark.o typd_mlc.o finalize.o ptr_chck.o: $(srcdir)/include/gc_mark.h \
+ $(srcdir)/include/private/gc_pmark.h
+
+specific.o pthread_support.o thread_local_alloc.o win32_threads.o: \
+ $(srcdir)/include/private/specific.h $(srcdir)/include/gc_inline.h \
+ $(srcdir)/include/private/thread_local_alloc.h
+
+dbg_mlc.o gcj_mlc.o: $(srcdir)/include/private/dbg_mlc.h
+
+tests/test.o: $(srcdir)/tests/test.c
+ mkdir tests || cat /dev/null
+ $(CC) $(CFLAGS) -c $(srcdir)/tests/test.c
+ mv test.o tests/test.o
+
+base_lib gc.a: $(OBJS) dyn_load.o $(UTILS)
+ rm -f dont_ar_1
+ ./if_mach SPARC SOLARIS touch dont_ar_1
+ ./if_mach SPARC SOLARIS $(AR) rus gc.a $(OBJS) dyn_load.o
+ ./if_mach M68K AMIGA touch dont_ar_1
+ ./if_mach M68K AMIGA $(AR) -vrus gc.a $(OBJS) dyn_load.o
+ ./if_not_there dont_ar_1 || $(AR) ru gc.a $(OBJS) dyn_load.o
+ ./if_not_there dont_ar_1 || $(RANLIB) gc.a || cat /dev/null
+ echo > base_lib
+# Ignore ranlib failure; that usually means it doesn't exist, and
+# isn't needed.
+
+cords cord.a: $(CORD_OBJS) $(UTILS)
+ rm -f dont_ar_3
+ ./if_mach SPARC SOLARIS touch dont_ar_3
+ ./if_mach SPARC SOLARIS $(AR) rus cord.a $(CORD_OBJS)
+ ./if_mach M68K AMIGA touch dont_ar_3
+ ./if_mach M68K AMIGA $(AR) -vrus cord.a $(CORD_OBJS)
+ ./if_not_there dont_ar_3 || $(AR) ru cord.a $(CORD_OBJS)
+ ./if_not_there dont_ar_3 || $(RANLIB) cord.a || cat /dev/null
+ echo > cords
+
+gc_badalc.o: $(srcdir)/gc_badalc.cc $(srcdir)/include/gc_cpp.h \
+ $(srcdir)/include/gc.h
+ $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_badalc.cc
+
+gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/include/gc_cpp.h $(srcdir)/include/gc.h
+ $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_cpp.cc
+
+test_cpp$(EXEEXT): $(srcdir)/tests/test_cpp.cc $(srcdir)/include/gc_cpp.h \
+ $(srcdir)/include/gc.h c++ base_lib $(UTILS)
+ rm -f test_cpp$(EXEEXT)
+ ./if_mach HP_PA HPUX $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/tests/test_cpp.cc gc.a gccpp.a -ldld `./threadlibs`
+ ./if_not_there test_cpp$(EXEEXT) || $(CXX) $(CXXFLAGS) -DGC_NOT_DLL -o test_cpp$(EXEEXT) $(srcdir)/tests/test_cpp.cc gc.a gccpp.a `./threadlibs`
+
+check-cpp: test_cpp$(EXEEXT)
+ ./test_cpp
+
+c++-t: c++ test_cpp$(EXEEXT)
+ ./test_cpp 1
+
+c++-nt: c++
+ @echo "Use ./test_cpp 1 to test the leak library"
+
+c++ gccpp.a gctba.a: gc_badalc.o gc_cpp.o $(UTILS)
+ rm -f dont_ar_4
+ ./if_mach SPARC SOLARIS touch dont_ar_4
+ ./if_mach SPARC SOLARIS $(AR) rus gccpp.a gc_badalc.o gc_cpp.o
+ ./if_mach SPARC SOLARIS $(AR) rus gctba.a gc_badalc.o
+ ./if_mach M68K AMIGA touch dont_ar_4
+ ./if_mach M68K AMIGA $(AR) -vrus gccpp.a gc_badalc.o gc_cpp.o
+ ./if_mach M68K AMIGA $(AR) -vrus gctba.a gc_badalc.o
+ ./if_not_there dont_ar_4 || $(AR) ru gccpp.a gc_badalc.o gc_cpp.o
+ ./if_not_there dont_ar_4 || $(RANLIB) gccpp.a || cat /dev/null
+ ./if_not_there dont_ar_4 || $(AR) ru gctba.a gc_badalc.o
+ ./if_not_there dont_ar_4 || $(RANLIB) gctba.a || cat /dev/null
+ echo > c++
+
+dyn_load_sunos53.o: dyn_load.c
+ $(CC) $(CFLAGS) -DSUNOS53_SHARED_LIB -c $(srcdir)/dyn_load.c -o $@
+
+# SunOS5 shared library version of the collector
+sunos5gc.so: $(OBJS) dyn_load_sunos53.o
+ $(CC) -G -o sunos5gc.so $(OBJS) dyn_load_sunos53.o -ldl
+ ln sunos5gc.so libgc.so
+
+# Alpha/OSF shared library version of the collector
+libalphagc.so: $(OBJS) dyn_load.o
+ $(LD) -shared -o libalphagc.so $(OBJS) dyn_load.o -lc
+ ln libalphagc.so libgc.so
+
+# IRIX shared library version of the collector
+libirixgc.so: $(OBJS) dyn_load.o
+ $(LD) -shared $(ABI_FLAG) -o libirixgc.so $(OBJS) dyn_load.o -lc
+ ln libirixgc.so libgc.so
+
+# Linux shared library version of the collector
+liblinuxgc.so: $(OBJS) dyn_load.o
+ gcc -shared -o liblinuxgc.so $(OBJS) dyn_load.o
+ ln liblinuxgc.so libgc.so
+
+# Build gctest with dynamic library
+dyn_test:
+ $(CC) $(CFLAGS) -o gctest$(EXEEXT) tests/test.c libgc.so `./threadlibs`
+ ./gctest
+
+# Alternative Linux rule. This is preferable, but is likely to break the
+# Makefile for some non-linux platforms.
+# LIBOBJS= $(patsubst %.o, %.lo, $(OBJS))
+#
+#.SUFFIXES: .lo $(SUFFIXES)
+#
+#.c.lo:
+# $(CC) $(CFLAGS) $(CPPFLAGS) -fPIC -c $< -o $@
+#
+# liblinuxgc.so: $(LIBOBJS) dyn_load.lo
+# gcc -shared -Wl,-soname=libgc.so.0 -o libgc.so.0 $(LIBOBJS) dyn_load.lo
+# touch liblinuxgc.so
+
+mach_dep.o: $(srcdir)/mach_dep.c $(srcdir)/sparc_mach_dep.S \
+ $(srcdir)/ia64_save_regs_in_stack.s \
+ $(srcdir)/sparc_netbsd_mach_dep.s $(UTILS)
+ rm -f mach_dep.o
+ ./if_mach SPARC LINUX $(CC) -c -o mach_dep2.o $(srcdir)/sparc_mach_dep.S
+ ./if_mach SPARC SOLARIS $(CC) -c -o mach_dep2.o $(srcdir)/sparc_mach_dep.S
+ ./if_mach SPARC OPENBSD $(CC) -c -o mach_dep2.o $(srcdir)/sparc_mach_dep.S
+ ./if_mach SPARC NETBSD $(AS) -o mach_dep2.o $(srcdir)/sparc_netbsd_mach_dep.s
+ ./if_mach SPARC "" $(CC) -c -o mach_dep1.o $(SPECIALCFLAGS) $(srcdir)/mach_dep.c
+ ./if_mach SPARC "" $(LD) -r -o mach_dep.o mach_dep1.o mach_dep2.o
+ ./if_mach IA64 "" $(AS) -o ia64_save_regs_in_stack.o $(srcdir)/ia64_save_regs_in_stack.s
+ ./if_mach IA64 "" $(CC) -c -o mach_dep1.o $(SPECIALCFLAGS) $(srcdir)/mach_dep.c
+ ./if_mach IA64 "" $(LD) -r -o mach_dep.o mach_dep1.o ia64_save_regs_in_stack.o
+ -./if_not_there mach_dep.o || $(CC) -c $(SPECIALCFLAGS) $(srcdir)/mach_dep.c
+ -./if_not_there mach_dep.o || `cygpath -w /bin/sh` $(CC) -c $(SPECIALCFLAGS) $(srcdir)/mach_dep.c
+ -./if_not_there mach_dep.o || /bin/sh $(CC) -c $(SPECIALCFLAGS) $(srcdir)/mach_dep.c
+
+mark_rts.o: $(srcdir)/mark_rts.c $(UTILS)
+ rm -f mark_rts.o
+ -./if_mach ALPHA OSF1 $(CC) -c $(CFLAGS) -Wo,-notail $(srcdir)/mark_rts.c
+ -./if_not_there mark_rts.o || $(CC) -c $(CFLAGS) $(srcdir)/mark_rts.c
+ -./if_not_there mark_rts.o || `cygpath -w /bin/sh` $(CC) -c $(CFLAGS) $(srcdir)/mark_rts.c
+ -./if_not_there mark_rts.o || /bin/sh $(CC) -c $(CFLAGS) $(srcdir)/mark_rts.c
+# Work-around for DEC optimizer tail recursion elimination bug.
+# The ALPHA-specific line should be removed if gcc is used.
+
+alloc.o: include/gc_version.h
+
+cord/cordbscs.o: $(srcdir)/cord/cordbscs.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordbscs.c
+ mkdir cord || cat /dev/null
+ mv cordbscs.o cord/cordbscs.o
+# not all compilers understand -o filename
+
+cord/cordxtra.o: $(srcdir)/cord/cordxtra.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordxtra.c
+ mkdir cord || cat /dev/null
+ mv cordxtra.o cord/cordxtra.o
+
+cord/cordprnt.o: $(srcdir)/cord/cordprnt.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordprnt.c
+ mkdir cord || cat /dev/null
+ mv cordprnt.o cord/cordprnt.o
+
+cordtest$(EXEEXT): $(srcdir)/cord/tests/cordtest.c cords base_lib $(UTILS)
+ rm -f cordtest$(EXEEXT)
+ ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cordtest $(srcdir)/cord/tests/cordtest.c gc.a cord.a -lucb
+ ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o cordtest $(srcdir)/cord/tests/cordtest.c gc.a cord.a -ldld `./threadlibs`
+ ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o cordtest $(srcdir)/cord/tests/cordtest.c gc.a cord.a `./threadlibs`
+ ./if_not_there cordtest$(EXEEXT) || $(CC) $(CFLAGS) -o cordtest$(EXEEXT) $(srcdir)/cord/tests/cordtest.c gc.a cord.a `./threadlibs`
+
+cord/de: de$(EXEEXT)
+
+de$(EXEEXT): $(srcdir)/cord/tests/de.c $(srcdir)/cord/tests/de_win.c \
+ $(srcdir)/cord/tests/de_win.h cords base_lib $(UTILS)
+ rm -f de$(EXEEXT)
+ ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c gc.a cord.a -lcurses -ltermlib -lucb `./threadlibs`
+ ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c gc.a cord.a -lcurses -ltermlib -ldld `./threadlibs`
+ ./if_mach POWERPC AIX $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c gc.a cord.a -lcurses
+ ./if_mach POWERPC DARWIN $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c gc.a cord.a
+ ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o de $(srcdir)/cord/tests/de.c gc.a cord.a -lcurses
+ ./if_not_there de$(EXEEXT) || $(CC) $(CFLAGS) -o de$(EXEEXT) $(srcdir)/cord/tests/de.c $(srcdir)/cord/tests/de_win.c gc.a cord.a $(CURSES) `./threadlibs`
+
+if_mach$(EXEEXT): $(srcdir)/tools/if_mach.c \
+ $(srcdir)/include/private/gcconfig.h
+ $(HOSTCC) $(HOSTCFLAGS) -o if_mach$(EXEEXT) $(srcdir)/tools/if_mach.c
+
+threadlibs$(EXEEXT): $(srcdir)/tools/threadlibs.c \
+ $(srcdir)/include/private/gcconfig.h
+ $(HOSTCC) $(HOSTCFLAGS) -o threadlibs$(EXEEXT) $(srcdir)/tools/threadlibs.c
+
+if_not_there$(EXEEXT): $(srcdir)/tools/if_not_there.c
+ $(HOSTCC) $(HOSTCFLAGS) -o if_not_there$(EXEEXT) $(srcdir)/tools/if_not_there.c
+
+clean:
+ rm -f *.a *.i *.o *.exe tests/*.o gctest gctest_dyn_link test_cpp \
+ setjmp_test mon.out gmon.out a.out core if_not_there if_mach \
+ base_lib c++ $(CORD_OBJS) cordtest de cords dont_ar_* \
+ threadlibs *.log cordtst*.tmp
+ -rm -f *~
+
+gctest$(EXEEXT): tests/test.o base_lib $(UTILS)
+ rm -f gctest$(EXEEXT)
+ ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o gctest tests/test.o gc.a -lucb
+ ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o gctest tests/test.o gc.a -ldld `./threadlibs`
+ ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o gctest tests/test.o gc.a `./threadlibs`
+ ./if_not_there gctest$(EXEEXT) || $(CC) $(CFLAGS) -o gctest$(EXEEXT) tests/test.o gc.a `./threadlibs`
+
+# If an optimized setjmp_test generates a segmentation fault,
+# odds are your compiler is broken. Gctest may still work.
+# Try compiling setjmp_t.c unoptimized.
+setjmp_test$(EXEEXT): $(srcdir)/tools/setjmp_t.c $(srcdir)/include/gc.h \
+ $(UTILS)
+ $(CC) $(CFLAGS) -o setjmp_test$(EXEEXT) $(srcdir)/tools/setjmp_t.c
+
+check: cordtest$(EXEEXT) gctest$(EXEEXT) setjmp_test$(EXEEXT) test_cpp$(EXEEXT)
+ ./setjmp_test
+ ./gctest
+ ./cordtest
+ ./test_cpp
+
+# A synonym to "check" (for compatibility with older GC versions).
+test: check
+
+# BTL: added to test shared library version of collector.
+# Currently works only under SunOS5. Requires GC_INIT call from statically
+# loaded client code.
+ABSDIR= `pwd`
+gctest_dyn_link: tests/test.o libgc.so
+ $(CC) -L$(ABSDIR) -R$(ABSDIR) -o gctest_dyn_link tests/test.o -lgc -ldl -lthread
+
+gctest_irix_dyn_link: tests/test.o libirixgc.so
+ $(CC) -L$(ABSDIR) -o gctest_irix_dyn_link tests/test.o -lirixgc
+
+SYM_PREFIX-libgc=GC
+
+reserved_namespace: $(SRCS)
+ for file in $(SRCS) tests/test.c tests/test_cpp.cc; do \
+ sed s/GC_/_GC_/g < $$file > tmp; \
+ cp tmp $$file; \
+ done
+
+user_namespace: $(SRCS)
+ for file in $(SRCS) tests/test.c tests/test_cpp.cc; do \
+ sed s/_GC_/GC_/g < $$file > tmp; \
+ cp tmp $$file; \
+ done
diff --git a/graphics/asymptote/gc/Makefile.in b/graphics/asymptote/gc/Makefile.in
new file mode 100644
index 0000000000..d5a7504287
--- /dev/null
+++ b/graphics/asymptote/gc/Makefile.in
@@ -0,0 +1,2837 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (c) 1999-2001 by Red Hat, Inc. All rights reserved.
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+check_PROGRAMS = cordtest$(EXEEXT) gctest$(EXEEXT) $(am__EXEEXT_1) \
+ leaktest$(EXEEXT) middletest$(EXEEXT) smashtest$(EXEEXT) \
+ hugetest$(EXEEXT) realloc_test$(EXEEXT) \
+ staticrootstest$(EXEEXT) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+ $(am__EXEEXT_4) $(am__EXEEXT_5)
+@PTHREAD_START_STANDALONE_TRUE@@SINGLE_GC_OBJ_TRUE@am__append_1 = -DGC_PTHREAD_START_STANDALONE
+@PTHREAD_START_STANDALONE_TRUE@@SINGLE_GC_OBJ_TRUE@am__append_2 = pthread_start.c
+@SINGLE_GC_OBJ_FALSE@am__append_3 = extra/gc.c
+
+# C Library: Architecture Dependent
+# ---------------------------------
+@SINGLE_GC_OBJ_FALSE@@WIN32_THREADS_TRUE@am__append_4 = win32_threads.c
+# Not Cygwin or MinGW.
+@PTHREADS_TRUE@@SINGLE_GC_OBJ_FALSE@@WIN32_THREADS_FALSE@am__append_5 = pthread_start.c pthread_support.c
+@DARWIN_THREADS_TRUE@@PTHREADS_TRUE@@SINGLE_GC_OBJ_FALSE@@WIN32_THREADS_FALSE@am__append_6 = darwin_stop_world.c
+@DARWIN_THREADS_FALSE@@PTHREADS_TRUE@@SINGLE_GC_OBJ_FALSE@@WIN32_THREADS_FALSE@am__append_7 = pthread_stop_world.c
+@SINGLE_GC_OBJ_FALSE@@THREAD_LOCAL_ALLOC_TRUE@am__append_8 = thread_local_alloc.c
+@MAKE_BACK_GRAPH_TRUE@@SINGLE_GC_OBJ_FALSE@am__append_9 = backgraph.c
+@CHECKSUMS_TRUE@@SINGLE_GC_OBJ_FALSE@am__append_10 = checksums.c
+@ENABLE_GCJ_SUPPORT_TRUE@@SINGLE_GC_OBJ_FALSE@am__append_11 = gcj_mlc.c
+@ENABLE_DISCLAIM_TRUE@@SINGLE_GC_OBJ_FALSE@am__append_12 = fnlz_mlc.c
+@PTHREADS_TRUE@am__append_13 = include/gc_pthread_redirects.h
+@ENABLE_GCJ_SUPPORT_TRUE@am__append_14 = include/gc_gcj.h
+@ENABLE_DISCLAIM_TRUE@am__append_15 = include/gc_disclaim.h
+@NEED_ATOMIC_OPS_ASM_TRUE@@USE_INTERNAL_LIBATOMIC_OPS_TRUE@am__append_16 = libatomic_ops/src/atomic_ops_sysdeps.S
+
+# C++ Interface
+# -------------
+@CPLUSPLUS_TRUE@am__append_17 = libgccpp.la
+@CPLUSPLUS_TRUE@am__append_18 = include/gc_allocator.h include/gc_cpp.h
+@CPLUSPLUS_TRUE@am__append_19 = include/extra/gc_cpp.h
+# The same as libgccpp but contains only gc_badalc.o.
+@CPLUSPLUS_TRUE@@GC_TBA_LIBRARY_TRUE@am__append_20 = libgctba.la
+@ENABLE_SHARED_TRUE@am__append_21 = $(top_builddir)/libgc.la
+@THREADS_TRUE@am__append_22 = $(THREADDLLIBS)
+
+# Note: because of libtool, you'll need to point your browser to
+# .libs/gctest.html, not gctest.html at topdir.
+@EMSCRIPTEN_TRUE@am__append_23 = gctest.html
+@ENABLE_SHARED_TRUE@am__append_24 = $(top_builddir)/libgc.la
+@KEEP_BACK_PTRS_TRUE@am__append_25 = tracetest$(EXEEXT)
+@KEEP_BACK_PTRS_TRUE@am__append_26 = tracetest
+@THREADS_TRUE@am__append_27 = test_atomic_ops$(EXEEXT) \
+@THREADS_TRUE@ threadleaktest$(EXEEXT) threadkey_test$(EXEEXT) \
+@THREADS_TRUE@ subthreadcreate_test$(EXEEXT) \
+@THREADS_TRUE@ initsecondarythread_test$(EXEEXT)
+@THREADS_TRUE@am__append_28 = test_atomic_ops threadleaktest \
+@THREADS_TRUE@ threadkey_test subthreadcreate_test \
+@THREADS_TRUE@ initsecondarythread_test
+@CPLUSPLUS_TRUE@am__append_29 = test_cpp$(EXEEXT)
+@CPLUSPLUS_TRUE@am__append_30 = test_cpp
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@@ENABLE_SHARED_TRUE@am__append_31 = $(top_builddir)/libgc.la
+@ENABLE_DISCLAIM_TRUE@am__append_32 = disclaim_test$(EXEEXT) \
+@ENABLE_DISCLAIM_TRUE@ disclaim_bench$(EXEEXT) \
+@ENABLE_DISCLAIM_TRUE@ disclaim_weakmap_test$(EXEEXT)
+@ENABLE_DISCLAIM_TRUE@am__append_33 = disclaim_test disclaim_bench \
+@ENABLE_DISCLAIM_TRUE@ disclaim_weakmap_test
+@ENABLE_DISCLAIM_TRUE@@THREADS_TRUE@am__append_34 = $(THREADDLLIBS)
+@ENABLE_DISCLAIM_TRUE@@THREADS_TRUE@am__append_35 = $(THREADDLLIBS)
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gc_set_version.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(am__dist_doc_DATA_DIST) \
+ $(dist_noinst_HEADERS) $(am__include_HEADERS_DIST) \
+ $(am__pkginclude_HEADERS_DIST) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES = bdw-gc.pc
+CONFIG_CLEAN_VPATH_FILES =
+@EMSCRIPTEN_TRUE@am__EXEEXT_1 = gctest.html$(EXEEXT)
+@KEEP_BACK_PTRS_TRUE@am__EXEEXT_2 = tracetest$(EXEEXT)
+@THREADS_TRUE@am__EXEEXT_3 = test_atomic_ops$(EXEEXT) \
+@THREADS_TRUE@ threadleaktest$(EXEEXT) threadkey_test$(EXEEXT) \
+@THREADS_TRUE@ subthreadcreate_test$(EXEEXT) \
+@THREADS_TRUE@ initsecondarythread_test$(EXEEXT)
+@CPLUSPLUS_TRUE@am__EXEEXT_4 = test_cpp$(EXEEXT)
+@ENABLE_DISCLAIM_TRUE@am__EXEEXT_5 = disclaim_test$(EXEEXT) \
+@ENABLE_DISCLAIM_TRUE@ disclaim_bench$(EXEEXT) \
+@ENABLE_DISCLAIM_TRUE@ disclaim_weakmap_test$(EXEEXT)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" \
+ "$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgconfigdir)" \
+ "$(DESTDIR)$(includedir)" "$(DESTDIR)$(pkgincludedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libcord_la_DEPENDENCIES = libgc.la
+am__dirstamp = $(am__leading_dot)dirstamp
+am_libcord_la_OBJECTS = cord/libcord_la-cordbscs.lo \
+ cord/libcord_la-cordprnt.lo cord/libcord_la-cordxtra.lo
+libcord_la_OBJECTS = $(am_libcord_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libcord_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(libcord_la_LDFLAGS) $(LDFLAGS) -o $@
+am__DEPENDENCIES_1 =
+am__libgc_la_SOURCES_DIST = allchblk.c alloc.c blacklst.c dbg_mlc.c \
+ dyn_load.c finalize.c gc_dlopen.c headers.c mach_dep.c \
+ malloc.c mallocx.c mark.c mark_rts.c misc.c new_hblk.c \
+ obj_map.c os_dep.c ptr_chck.c reclaim.c specific.c typd_mlc.c \
+ win32_threads.c pthread_start.c pthread_support.c \
+ darwin_stop_world.c pthread_stop_world.c thread_local_alloc.c \
+ backgraph.c checksums.c gcj_mlc.c fnlz_mlc.c extra/gc.c
+@SINGLE_GC_OBJ_FALSE@@WIN32_THREADS_TRUE@am__objects_1 = \
+@SINGLE_GC_OBJ_FALSE@@WIN32_THREADS_TRUE@ win32_threads.lo
+@PTHREADS_TRUE@@SINGLE_GC_OBJ_FALSE@@WIN32_THREADS_FALSE@am__objects_2 = pthread_start.lo \
+@PTHREADS_TRUE@@SINGLE_GC_OBJ_FALSE@@WIN32_THREADS_FALSE@ pthread_support.lo
+@DARWIN_THREADS_TRUE@@PTHREADS_TRUE@@SINGLE_GC_OBJ_FALSE@@WIN32_THREADS_FALSE@am__objects_3 = darwin_stop_world.lo
+@DARWIN_THREADS_FALSE@@PTHREADS_TRUE@@SINGLE_GC_OBJ_FALSE@@WIN32_THREADS_FALSE@am__objects_4 = pthread_stop_world.lo
+@SINGLE_GC_OBJ_FALSE@@THREAD_LOCAL_ALLOC_TRUE@am__objects_5 = thread_local_alloc.lo
+@MAKE_BACK_GRAPH_TRUE@@SINGLE_GC_OBJ_FALSE@am__objects_6 = \
+@MAKE_BACK_GRAPH_TRUE@@SINGLE_GC_OBJ_FALSE@ backgraph.lo
+@CHECKSUMS_TRUE@@SINGLE_GC_OBJ_FALSE@am__objects_7 = checksums.lo
+@ENABLE_GCJ_SUPPORT_TRUE@@SINGLE_GC_OBJ_FALSE@am__objects_8 = \
+@ENABLE_GCJ_SUPPORT_TRUE@@SINGLE_GC_OBJ_FALSE@ gcj_mlc.lo
+@ENABLE_DISCLAIM_TRUE@@SINGLE_GC_OBJ_FALSE@am__objects_9 = \
+@ENABLE_DISCLAIM_TRUE@@SINGLE_GC_OBJ_FALSE@ fnlz_mlc.lo
+@PTHREAD_START_STANDALONE_TRUE@@SINGLE_GC_OBJ_TRUE@am__objects_10 = pthread_start.lo
+@SINGLE_GC_OBJ_FALSE@am_libgc_la_OBJECTS = allchblk.lo alloc.lo \
+@SINGLE_GC_OBJ_FALSE@ blacklst.lo dbg_mlc.lo dyn_load.lo \
+@SINGLE_GC_OBJ_FALSE@ finalize.lo gc_dlopen.lo headers.lo \
+@SINGLE_GC_OBJ_FALSE@ mach_dep.lo malloc.lo mallocx.lo mark.lo \
+@SINGLE_GC_OBJ_FALSE@ mark_rts.lo misc.lo new_hblk.lo \
+@SINGLE_GC_OBJ_FALSE@ obj_map.lo os_dep.lo ptr_chck.lo \
+@SINGLE_GC_OBJ_FALSE@ reclaim.lo specific.lo typd_mlc.lo \
+@SINGLE_GC_OBJ_FALSE@ $(am__objects_1) $(am__objects_2) \
+@SINGLE_GC_OBJ_FALSE@ $(am__objects_3) $(am__objects_4) \
+@SINGLE_GC_OBJ_FALSE@ $(am__objects_5) $(am__objects_6) \
+@SINGLE_GC_OBJ_FALSE@ $(am__objects_7) $(am__objects_8) \
+@SINGLE_GC_OBJ_FALSE@ $(am__objects_9)
+@SINGLE_GC_OBJ_TRUE@am_libgc_la_OBJECTS = extra/gc.lo \
+@SINGLE_GC_OBJ_TRUE@ $(am__objects_10) $(am__objects_1) \
+@SINGLE_GC_OBJ_TRUE@ $(am__objects_2) $(am__objects_3) \
+@SINGLE_GC_OBJ_TRUE@ $(am__objects_4) $(am__objects_5) \
+@SINGLE_GC_OBJ_TRUE@ $(am__objects_6) $(am__objects_7) \
+@SINGLE_GC_OBJ_TRUE@ $(am__objects_8) $(am__objects_9)
+@NEED_ATOMIC_OPS_ASM_TRUE@@USE_INTERNAL_LIBATOMIC_OPS_TRUE@am__objects_11 = libatomic_ops/src/atomic_ops_sysdeps.lo
+@USE_INTERNAL_LIBATOMIC_OPS_TRUE@nodist_libgc_la_OBJECTS = libatomic_ops/src/atomic_ops.lo \
+@USE_INTERNAL_LIBATOMIC_OPS_TRUE@ $(am__objects_11)
+libgc_la_OBJECTS = $(am_libgc_la_OBJECTS) $(nodist_libgc_la_OBJECTS)
+libgc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(libgc_la_LDFLAGS) $(LDFLAGS) -o $@
+@CPLUSPLUS_TRUE@libgccpp_la_DEPENDENCIES = libgc.la
+am__libgccpp_la_SOURCES_DIST = gc_badalc.cc gc_cpp.cc
+@CPLUSPLUS_TRUE@am_libgccpp_la_OBJECTS = gc_badalc.lo gc_cpp.lo
+libgccpp_la_OBJECTS = $(am_libgccpp_la_OBJECTS)
+libgccpp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(libgccpp_la_LDFLAGS) $(LDFLAGS) -o $@
+@CPLUSPLUS_TRUE@am_libgccpp_la_rpath = -rpath $(libdir)
+@CPLUSPLUS_TRUE@@GC_TBA_LIBRARY_TRUE@libgctba_la_DEPENDENCIES = \
+@CPLUSPLUS_TRUE@@GC_TBA_LIBRARY_TRUE@ libgc.la
+am__libgctba_la_SOURCES_DIST = gc_badalc.cc
+@CPLUSPLUS_TRUE@@GC_TBA_LIBRARY_TRUE@am_libgctba_la_OBJECTS = \
+@CPLUSPLUS_TRUE@@GC_TBA_LIBRARY_TRUE@ gc_badalc.lo
+libgctba_la_OBJECTS = $(am_libgctba_la_OBJECTS)
+libgctba_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(libgctba_la_LDFLAGS) $(LDFLAGS) -o $@
+@CPLUSPLUS_TRUE@@GC_TBA_LIBRARY_TRUE@am_libgctba_la_rpath = -rpath \
+@CPLUSPLUS_TRUE@@GC_TBA_LIBRARY_TRUE@ $(libdir)
+am__DEPENDENCIES_2 = $(nodist_libgc_la_OBJECTS) \
+ $(top_builddir)/libgc.la $(am__DEPENDENCIES_1)
+libstaticrootslib2_test_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_libstaticrootslib2_test_la_OBJECTS = \
+ tests/libstaticrootslib2_test_la-staticrootslib.lo
+libstaticrootslib2_test_la_OBJECTS = \
+ $(am_libstaticrootslib2_test_la_OBJECTS)
+libstaticrootslib2_test_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libstaticrootslib2_test_la_CFLAGS) $(CFLAGS) \
+ $(libstaticrootslib2_test_la_LDFLAGS) $(LDFLAGS) -o $@
+am_libstaticrootslib_test_la_OBJECTS = tests/staticrootslib.lo
+libstaticrootslib_test_la_OBJECTS = \
+ $(am_libstaticrootslib_test_la_OBJECTS)
+libstaticrootslib_test_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(AM_CFLAGS) $(CFLAGS) $(libstaticrootslib_test_la_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_cordtest_OBJECTS = cord/tests/cordtest.$(OBJEXT)
+cordtest_OBJECTS = $(am_cordtest_OBJECTS)
+cordtest_DEPENDENCIES = $(top_builddir)/libcord.la $(am__append_21)
+am__disclaim_bench_SOURCES_DIST = tests/disclaim_bench.c
+@ENABLE_DISCLAIM_TRUE@am_disclaim_bench_OBJECTS = \
+@ENABLE_DISCLAIM_TRUE@ tests/disclaim_bench.$(OBJEXT)
+disclaim_bench_OBJECTS = $(am_disclaim_bench_OBJECTS)
+@ENABLE_DISCLAIM_TRUE@disclaim_bench_DEPENDENCIES = \
+@ENABLE_DISCLAIM_TRUE@ $(am__DEPENDENCIES_2)
+am__disclaim_test_SOURCES_DIST = tests/disclaim_test.c
+@ENABLE_DISCLAIM_TRUE@am_disclaim_test_OBJECTS = \
+@ENABLE_DISCLAIM_TRUE@ tests/disclaim_test.$(OBJEXT)
+disclaim_test_OBJECTS = $(am_disclaim_test_OBJECTS)
+@ENABLE_DISCLAIM_TRUE@@THREADS_TRUE@am__DEPENDENCIES_3 = \
+@ENABLE_DISCLAIM_TRUE@@THREADS_TRUE@ $(am__DEPENDENCIES_1)
+@ENABLE_DISCLAIM_TRUE@disclaim_test_DEPENDENCIES = \
+@ENABLE_DISCLAIM_TRUE@ $(am__DEPENDENCIES_2) \
+@ENABLE_DISCLAIM_TRUE@ $(am__DEPENDENCIES_3)
+am__disclaim_weakmap_test_SOURCES_DIST = \
+ tests/disclaim_weakmap_test.c
+@ENABLE_DISCLAIM_TRUE@am_disclaim_weakmap_test_OBJECTS = \
+@ENABLE_DISCLAIM_TRUE@ tests/disclaim_weakmap_test.$(OBJEXT)
+disclaim_weakmap_test_OBJECTS = $(am_disclaim_weakmap_test_OBJECTS)
+@ENABLE_DISCLAIM_TRUE@disclaim_weakmap_test_DEPENDENCIES = \
+@ENABLE_DISCLAIM_TRUE@ $(am__DEPENDENCIES_2) \
+@ENABLE_DISCLAIM_TRUE@ $(am__DEPENDENCIES_3)
+am_gctest_OBJECTS = tests/test.$(OBJEXT)
+gctest_OBJECTS = $(am_gctest_OBJECTS)
+@THREADS_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1)
+am__gctest_html_SOURCES_DIST = tests/test.c
+am__objects_12 = tests/test.$(OBJEXT)
+@EMSCRIPTEN_TRUE@am_gctest_html_OBJECTS = $(am__objects_12)
+gctest_html_OBJECTS = $(am_gctest_html_OBJECTS)
+am__DEPENDENCIES_5 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_4)
+@EMSCRIPTEN_TRUE@gctest_html_DEPENDENCIES = $(am__DEPENDENCIES_5)
+gctest_html_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(gctest_html_LDFLAGS) $(LDFLAGS) -o $@
+am_hugetest_OBJECTS = tests/huge_test.$(OBJEXT)
+hugetest_OBJECTS = $(am_hugetest_OBJECTS)
+hugetest_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am__initsecondarythread_test_SOURCES_DIST = \
+ tests/initsecondarythread.c
+@THREADS_TRUE@am_initsecondarythread_test_OBJECTS = \
+@THREADS_TRUE@ tests/initsecondarythread.$(OBJEXT)
+initsecondarythread_test_OBJECTS = \
+ $(am_initsecondarythread_test_OBJECTS)
+@THREADS_TRUE@initsecondarythread_test_DEPENDENCIES = \
+@THREADS_TRUE@ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+am_leaktest_OBJECTS = tests/leak_test.$(OBJEXT)
+leaktest_OBJECTS = $(am_leaktest_OBJECTS)
+leaktest_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_middletest_OBJECTS = tests/middle.$(OBJEXT)
+middletest_OBJECTS = $(am_middletest_OBJECTS)
+middletest_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_realloc_test_OBJECTS = tests/realloc_test.$(OBJEXT)
+realloc_test_OBJECTS = $(am_realloc_test_OBJECTS)
+realloc_test_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_smashtest_OBJECTS = tests/smash_test.$(OBJEXT)
+smashtest_OBJECTS = $(am_smashtest_OBJECTS)
+smashtest_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_staticrootstest_OBJECTS = \
+ tests/staticrootstest-staticrootstest.$(OBJEXT)
+staticrootstest_OBJECTS = $(am_staticrootstest_OBJECTS)
+staticrootstest_DEPENDENCIES = $(nodist_libgc_la_OBJECTS) \
+ $(am__DEPENDENCIES_1) libstaticrootslib_test.la \
+ libstaticrootslib2_test.la $(am__append_24)
+staticrootstest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(staticrootstest_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+am__subthreadcreate_test_SOURCES_DIST = tests/subthread_create.c
+@THREADS_TRUE@am_subthreadcreate_test_OBJECTS = \
+@THREADS_TRUE@ tests/subthread_create.$(OBJEXT)
+subthreadcreate_test_OBJECTS = $(am_subthreadcreate_test_OBJECTS)
+@THREADS_TRUE@subthreadcreate_test_DEPENDENCIES = \
+@THREADS_TRUE@ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+am__test_atomic_ops_SOURCES_DIST = tests/test_atomic_ops.c
+@THREADS_TRUE@am_test_atomic_ops_OBJECTS = \
+@THREADS_TRUE@ tests/test_atomic_ops.$(OBJEXT)
+test_atomic_ops_OBJECTS = $(am_test_atomic_ops_OBJECTS)
+@THREADS_TRUE@test_atomic_ops_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@THREADS_TRUE@ $(am__DEPENDENCIES_1)
+am__test_cpp_SOURCES_DIST = tests/test_cpp.cc
+@CPLUSPLUS_TRUE@am_test_cpp_OBJECTS = tests/test_cpp.$(OBJEXT)
+test_cpp_OBJECTS = $(am_test_cpp_OBJECTS)
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@test_cpp_DEPENDENCIES = \
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@ libgccpp.la \
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@ $(nodist_libgc_la_OBJECTS) \
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@ $(am__DEPENDENCIES_1) \
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@ $(am__DEPENDENCIES_1) \
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@ $(am__append_31)
+@AVOID_CPP_LIB_TRUE@@CPLUSPLUS_TRUE@test_cpp_DEPENDENCIES = \
+@AVOID_CPP_LIB_TRUE@@CPLUSPLUS_TRUE@ gc_badalc.o gc_cpp.o \
+@AVOID_CPP_LIB_TRUE@@CPLUSPLUS_TRUE@ $(am__DEPENDENCIES_2) \
+@AVOID_CPP_LIB_TRUE@@CPLUSPLUS_TRUE@ $(am__DEPENDENCIES_1) \
+@AVOID_CPP_LIB_TRUE@@CPLUSPLUS_TRUE@ $(am__append_31)
+am__threadkey_test_SOURCES_DIST = tests/threadkey_test.c
+@THREADS_TRUE@am_threadkey_test_OBJECTS = \
+@THREADS_TRUE@ tests/threadkey_test.$(OBJEXT)
+threadkey_test_OBJECTS = $(am_threadkey_test_OBJECTS)
+@THREADS_TRUE@threadkey_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@THREADS_TRUE@ $(am__DEPENDENCIES_1)
+am__threadleaktest_SOURCES_DIST = tests/thread_leak_test.c
+@THREADS_TRUE@am_threadleaktest_OBJECTS = \
+@THREADS_TRUE@ tests/thread_leak_test.$(OBJEXT)
+threadleaktest_OBJECTS = $(am_threadleaktest_OBJECTS)
+@THREADS_TRUE@threadleaktest_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@THREADS_TRUE@ $(am__DEPENDENCIES_1)
+am__tracetest_SOURCES_DIST = tests/trace_test.c
+@KEEP_BACK_PTRS_TRUE@am_tracetest_OBJECTS = \
+@KEEP_BACK_PTRS_TRUE@ tests/trace_test.$(OBJEXT)
+tracetest_OBJECTS = $(am_tracetest_OBJECTS)
+@KEEP_BACK_PTRS_TRUE@tracetest_DEPENDENCIES = $(am__DEPENDENCIES_2)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES =
+depcomp = $(SHELL) $(top_srcdir)/../depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/allchblk.Plo ./$(DEPDIR)/alloc.Plo \
+ ./$(DEPDIR)/backgraph.Plo ./$(DEPDIR)/blacklst.Plo \
+ ./$(DEPDIR)/checksums.Plo ./$(DEPDIR)/darwin_stop_world.Plo \
+ ./$(DEPDIR)/dbg_mlc.Plo ./$(DEPDIR)/dyn_load.Plo \
+ ./$(DEPDIR)/finalize.Plo ./$(DEPDIR)/fnlz_mlc.Plo \
+ ./$(DEPDIR)/gc_badalc.Plo ./$(DEPDIR)/gc_cpp.Plo \
+ ./$(DEPDIR)/gc_dlopen.Plo ./$(DEPDIR)/gcj_mlc.Plo \
+ ./$(DEPDIR)/headers.Plo ./$(DEPDIR)/mach_dep.Plo \
+ ./$(DEPDIR)/malloc.Plo ./$(DEPDIR)/mallocx.Plo \
+ ./$(DEPDIR)/mark.Plo ./$(DEPDIR)/mark_rts.Plo \
+ ./$(DEPDIR)/misc.Plo ./$(DEPDIR)/new_hblk.Plo \
+ ./$(DEPDIR)/obj_map.Plo ./$(DEPDIR)/os_dep.Plo \
+ ./$(DEPDIR)/pthread_start.Plo \
+ ./$(DEPDIR)/pthread_stop_world.Plo \
+ ./$(DEPDIR)/pthread_support.Plo ./$(DEPDIR)/ptr_chck.Plo \
+ ./$(DEPDIR)/reclaim.Plo ./$(DEPDIR)/sparc_mach_dep.Plo \
+ ./$(DEPDIR)/specific.Plo ./$(DEPDIR)/thread_local_alloc.Plo \
+ ./$(DEPDIR)/typd_mlc.Plo ./$(DEPDIR)/win32_threads.Plo \
+ cord/$(DEPDIR)/libcord_la-cordbscs.Plo \
+ cord/$(DEPDIR)/libcord_la-cordprnt.Plo \
+ cord/$(DEPDIR)/libcord_la-cordxtra.Plo \
+ cord/tests/$(DEPDIR)/cordtest.Po extra/$(DEPDIR)/gc.Plo \
+ libatomic_ops/src/$(DEPDIR)/atomic_ops.Plo \
+ libatomic_ops/src/$(DEPDIR)/atomic_ops_sysdeps.Plo \
+ tests/$(DEPDIR)/disclaim_bench.Po \
+ tests/$(DEPDIR)/disclaim_test.Po \
+ tests/$(DEPDIR)/disclaim_weakmap_test.Po \
+ tests/$(DEPDIR)/huge_test.Po \
+ tests/$(DEPDIR)/initsecondarythread.Po \
+ tests/$(DEPDIR)/leak_test.Po \
+ tests/$(DEPDIR)/libstaticrootslib2_test_la-staticrootslib.Plo \
+ tests/$(DEPDIR)/middle.Po tests/$(DEPDIR)/realloc_test.Po \
+ tests/$(DEPDIR)/smash_test.Po \
+ tests/$(DEPDIR)/staticrootslib.Plo \
+ tests/$(DEPDIR)/staticrootstest-staticrootstest.Po \
+ tests/$(DEPDIR)/subthread_create.Po tests/$(DEPDIR)/test.Po \
+ tests/$(DEPDIR)/test_atomic_ops.Po tests/$(DEPDIR)/test_cpp.Po \
+ tests/$(DEPDIR)/thread_leak_test.Po \
+ tests/$(DEPDIR)/threadkey_test.Po \
+ tests/$(DEPDIR)/trace_test.Po
+am__mv = mv -f
+CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)
+LTCPPASCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CCASFLAGS) $(CCASFLAGS)
+AM_V_CPPAS = $(am__v_CPPAS_@AM_V@)
+am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@)
+am__v_CPPAS_0 = @echo " CPPAS " $@;
+am__v_CPPAS_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)
+LTCCASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(AM_CCASFLAGS) \
+ $(CCASFLAGS)
+AM_V_CCAS = $(am__v_CCAS_@AM_V@)
+am__v_CCAS_ = $(am__v_CCAS_@AM_DEFAULT_V@)
+am__v_CCAS_0 = @echo " CCAS " $@;
+am__v_CCAS_1 =
+SOURCES = $(libcord_la_SOURCES) $(libgc_la_SOURCES) \
+ $(EXTRA_libgc_la_SOURCES) $(nodist_libgc_la_SOURCES) \
+ $(libgccpp_la_SOURCES) $(libgctba_la_SOURCES) \
+ $(libstaticrootslib2_test_la_SOURCES) \
+ $(libstaticrootslib_test_la_SOURCES) $(cordtest_SOURCES) \
+ $(disclaim_bench_SOURCES) $(disclaim_test_SOURCES) \
+ $(disclaim_weakmap_test_SOURCES) $(gctest_SOURCES) \
+ $(gctest_html_SOURCES) $(hugetest_SOURCES) \
+ $(initsecondarythread_test_SOURCES) $(leaktest_SOURCES) \
+ $(middletest_SOURCES) $(realloc_test_SOURCES) \
+ $(smashtest_SOURCES) $(staticrootstest_SOURCES) \
+ $(subthreadcreate_test_SOURCES) $(test_atomic_ops_SOURCES) \
+ $(test_cpp_SOURCES) $(threadkey_test_SOURCES) \
+ $(threadleaktest_SOURCES) $(tracetest_SOURCES)
+DIST_SOURCES = $(libcord_la_SOURCES) $(am__libgc_la_SOURCES_DIST) \
+ $(EXTRA_libgc_la_SOURCES) $(am__libgccpp_la_SOURCES_DIST) \
+ $(am__libgctba_la_SOURCES_DIST) \
+ $(libstaticrootslib2_test_la_SOURCES) \
+ $(libstaticrootslib_test_la_SOURCES) $(cordtest_SOURCES) \
+ $(am__disclaim_bench_SOURCES_DIST) \
+ $(am__disclaim_test_SOURCES_DIST) \
+ $(am__disclaim_weakmap_test_SOURCES_DIST) $(gctest_SOURCES) \
+ $(am__gctest_html_SOURCES_DIST) $(hugetest_SOURCES) \
+ $(am__initsecondarythread_test_SOURCES_DIST) \
+ $(leaktest_SOURCES) $(middletest_SOURCES) \
+ $(realloc_test_SOURCES) $(smashtest_SOURCES) \
+ $(staticrootstest_SOURCES) \
+ $(am__subthreadcreate_test_SOURCES_DIST) \
+ $(am__test_atomic_ops_SOURCES_DIST) \
+ $(am__test_cpp_SOURCES_DIST) \
+ $(am__threadkey_test_SOURCES_DIST) \
+ $(am__threadleaktest_SOURCES_DIST) \
+ $(am__tracetest_SOURCES_DIST)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+man3dir = $(mandir)/man3
+NROFF = nroff
+MANS = $(dist_man3_MANS)
+am__dist_doc_DATA_DIST = AUTHORS README.md doc/README.DGUX386 \
+ doc/README.Mac doc/README.OS2 doc/README.amiga \
+ doc/README.arm.cross doc/README.autoconf doc/README.cmake \
+ doc/README.cords doc/README.darwin doc/README.emscripten \
+ doc/README.environment doc/README.ews4800 doc/README.hp \
+ doc/README.linux doc/README.macros doc/README.rs6000 \
+ doc/README.sgi doc/README.solaris2 doc/README.symbian \
+ doc/README.uts doc/README.win32 doc/README.win64 \
+ doc/debugging.md doc/finalization.md doc/gcdescr.md \
+ doc/gcinterface.md doc/leak.md doc/overview.md doc/porting.md \
+ doc/scale.md doc/simple_example.md doc/tree.md
+DATA = $(dist_doc_DATA) $(pkgconfig_DATA)
+am__include_HEADERS_DIST = include/extra/gc_cpp.h include/extra/gc.h
+am__pkginclude_HEADERS_DIST = include/gc_pthread_redirects.h \
+ include/gc_gcj.h include/gc_disclaim.h include/gc_allocator.h \
+ include/gc_cpp.h include/gc.h include/gc_backptr.h \
+ include/gc_config_macros.h include/gc_inline.h \
+ include/gc_mark.h include/gc_tiny_fl.h include/gc_typed.h \
+ include/gc_version.h include/javaxfc.h include/leak_detector.h \
+ include/cord.h include/cord_pos.h include/ec.h
+HEADERS = $(dist_noinst_HEADERS) $(include_HEADERS) \
+ $(pkginclude_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ cscope check recheck distdir distdir-am dist dist-all \
+ distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/../test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/../test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(dist_man3_MANS) $(srcdir)/Makefile.in \
+ $(srcdir)/bdw-gc.pc.in $(srcdir)/cord/cord.am \
+ $(srcdir)/doc/doc.am $(srcdir)/include/include.am \
+ $(srcdir)/tests/tests.am $(top_srcdir)/../compile \
+ $(top_srcdir)/../config.guess $(top_srcdir)/../config.sub \
+ $(top_srcdir)/../depcomp $(top_srcdir)/../install-sh \
+ $(top_srcdir)/../ltmain.sh $(top_srcdir)/../missing \
+ $(top_srcdir)/../test-driver $(top_srcdir)/include/config.h.in \
+ AUTHORS ChangeLog README.md
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+# Exists only to be overridden by the user if desired.
+AM_DISTCHECK_DVI_TARGET = dvi
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_CFLAGS = $(WERROR_CFLAGS) @GC_CFLAGS@
+AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \
+ $(ATOMIC_OPS_CFLAGS) $(am__append_1)
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+ATOMIC_OPS_CFLAGS = @ATOMIC_OPS_CFLAGS@
+ATOMIC_OPS_LIBS = @ATOMIC_OPS_LIBS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@ $(DEFS)
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@ $(CFLAGS_EXTRA)
+CFLAGS_EXTRA = @CFLAGS_EXTRA@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@ $(CFLAGS_EXTRA)
+CXXLIBS = @CXXLIBS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+EXTRA_TEST_LIBS = @EXTRA_TEST_LIBS@
+FGREP = @FGREP@
+FILECMD = @FILECMD@
+GC_CFLAGS = @GC_CFLAGS@
+GC_VERSION = @GC_VERSION@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+THREADDLLIBS = @THREADDLLIBS@
+UNWINDLIBS = @UNWINDLIBS@
+VERSION = @VERSION@
+WERROR_CFLAGS = @WERROR_CFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+addlibs = @addlibs@
+addobjs = @addobjs@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_ldflags_libgc = @extra_ldflags_libgc@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_all = @target_all@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# Info (current:revision:age) for the Libtool versioning system.
+# These numbers should be updated at most once just before the release,
+# and, optionally, at most once during the development (after the release).
+LIBGC_VER_INFO = 6:4:5
+LIBGCCPP_VER_INFO = 6:0:5
+
+# We currently use the source files directly from libatomic_ops, if we
+# use the internal version. This is done since libatomic_ops doesn't
+# use libtool, since it has no real use for it. But that seems to make
+# it hard to use either the resulting object files or libraries.
+# Thus there seems to be no real reason to recursively build in the
+# libatomic_ops directory.
+# if USE_INTERNAL_LIBATOMICS_OPS
+# SUBDIRS = @maybe_libatomic_ops@
+# else
+# SUBDIRS =
+# endif
+SUBDIRS =
+ACLOCAL_AMFLAGS = -I m4
+
+# headers which are not installed
+# (see include/include.am for more)
+#
+
+# documentation which is not installed
+#
+
+# other makefiles
+
+# files used by makefiles other than Makefile.am
+#
+EXTRA_DIST = $(am__append_3) gc_badalc.cpp gc_cpp.cpp README.QUICK \
+ NT_MAKEFILE OS2_MAKEFILE PCR-Makefile digimars.mak \
+ Makefile.direct SMakefile.amiga WCC_MAKEFILE autogen.sh \
+ CMakeLists.txt Config.cmake.in build/s60v3/bld.inf \
+ build/s60v3/libgc.mmp tools/if_mach.c tools/if_not_there.c \
+ tools/setjmp_t.c tools/threadlibs.c extra/MacOS.c \
+ extra/AmigaOS.c extra/symbian/global_end.cpp \
+ extra/symbian/global_start.cpp \
+ extra/symbian/init_global_static_roots.cpp extra/symbian.cpp \
+ extra/pcr_interface.c extra/real_malloc.c \
+ extra/Mac_files/datastart.c extra/Mac_files/dataend.c \
+ extra/Mac_files/MacOS_config.h include/private/msvc_dbg.h \
+ extra/msvc_dbg.c tools/callprocs.sh cord/tests/de.c \
+ cord/tests/de_cmds.h cord/tests/de_win.c cord/tests/de_win.h \
+ cord/tests/de_win.rc
+
+# C Library
+# ---------
+lib_LTLIBRARIES = libgc.la $(am__append_17) $(am__append_20) \
+ libcord.la
+
+# unprefixed header
+include_HEADERS = $(am__append_19) include/extra/gc.h
+
+# installed headers
+#
+pkginclude_HEADERS = $(am__append_13) $(am__append_14) \
+ $(am__append_15) $(am__append_18) include/gc.h \
+ include/gc_backptr.h include/gc_config_macros.h \
+ include/gc_inline.h include/gc_mark.h include/gc_tiny_fl.h \
+ include/gc_typed.h include/gc_version.h include/javaxfc.h \
+ include/leak_detector.h include/cord.h include/cord_pos.h \
+ include/ec.h
+
+# headers which are not installed
+#
+dist_noinst_HEADERS = include/private/darwin_semaphore.h \
+ include/private/darwin_stop_world.h include/private/dbg_mlc.h \
+ include/private/gc_alloc_ptrs.h \
+ include/private/gc_atomic_ops.h include/private/gc_hdrs.h \
+ include/private/gc_locks.h include/private/gc_pmark.h \
+ include/private/gc_priv.h include/private/gcconfig.h \
+ include/private/pthread_stop_world.h \
+ include/private/pthread_support.h include/private/specific.h \
+ include/private/thread_local_alloc.h
+check_LTLIBRARIES = libstaticrootslib_test.la \
+ libstaticrootslib2_test.la
+TESTS = cordtest$(EXEEXT) gctest$(EXEEXT) leaktest$(EXEEXT) \
+ middletest$(EXEEXT) smashtest$(EXEEXT) hugetest$(EXEEXT) \
+ realloc_test$(EXEEXT) staticrootstest$(EXEEXT) \
+ $(am__append_25) $(am__append_27) $(am__append_29) \
+ $(am__append_32)
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = bdw-gc.pc
+@SINGLE_GC_OBJ_FALSE@libgc_la_SOURCES = allchblk.c alloc.c blacklst.c \
+@SINGLE_GC_OBJ_FALSE@ dbg_mlc.c dyn_load.c finalize.c \
+@SINGLE_GC_OBJ_FALSE@ gc_dlopen.c headers.c mach_dep.c malloc.c \
+@SINGLE_GC_OBJ_FALSE@ mallocx.c mark.c mark_rts.c misc.c \
+@SINGLE_GC_OBJ_FALSE@ new_hblk.c obj_map.c os_dep.c ptr_chck.c \
+@SINGLE_GC_OBJ_FALSE@ reclaim.c specific.c typd_mlc.c \
+@SINGLE_GC_OBJ_FALSE@ $(am__append_4) $(am__append_5) \
+@SINGLE_GC_OBJ_FALSE@ $(am__append_6) $(am__append_7) \
+@SINGLE_GC_OBJ_FALSE@ $(am__append_8) $(am__append_9) \
+@SINGLE_GC_OBJ_FALSE@ $(am__append_10) $(am__append_11) \
+@SINGLE_GC_OBJ_FALSE@ $(am__append_12)
+@SINGLE_GC_OBJ_TRUE@libgc_la_SOURCES = extra/gc.c $(am__append_2) \
+@SINGLE_GC_OBJ_TRUE@ $(am__append_4) $(am__append_5) \
+@SINGLE_GC_OBJ_TRUE@ $(am__append_6) $(am__append_7) \
+@SINGLE_GC_OBJ_TRUE@ $(am__append_8) $(am__append_9) \
+@SINGLE_GC_OBJ_TRUE@ $(am__append_10) $(am__append_11) \
+@SINGLE_GC_OBJ_TRUE@ $(am__append_12)
+@USE_INTERNAL_LIBATOMIC_OPS_TRUE@nodist_libgc_la_SOURCES = libatomic_ops/src/atomic_ops.c \
+@USE_INTERNAL_LIBATOMIC_OPS_TRUE@ $(am__append_16)
+
+# Include THREADDLLIBS here to ensure that the correct versions of
+# linuxthread semaphore (and clock_gettime) functions get linked:
+libgc_la_LIBADD = @addobjs@ $(THREADDLLIBS) $(UNWINDLIBS) $(ATOMIC_OPS_LIBS)
+libgc_la_DEPENDENCIES = @addobjs@
+libgc_la_LDFLAGS = $(extra_ldflags_libgc) -version-info $(LIBGC_VER_INFO) \
+ -no-undefined
+
+EXTRA_libgc_la_SOURCES = ia64_save_regs_in_stack.s sparc_mach_dep.S \
+ sparc_netbsd_mach_dep.s
+
+@CPLUSPLUS_TRUE@libgccpp_la_SOURCES = gc_badalc.cc gc_cpp.cc
+@CPLUSPLUS_TRUE@libgccpp_la_LIBADD = libgc.la
+@CPLUSPLUS_TRUE@libgccpp_la_LDFLAGS = -version-info $(LIBGCCPP_VER_INFO) -no-undefined
+@CPLUSPLUS_TRUE@@GC_TBA_LIBRARY_TRUE@libgctba_la_SOURCES = gc_badalc.cc
+@CPLUSPLUS_TRUE@@GC_TBA_LIBRARY_TRUE@libgctba_la_LIBADD = libgc.la
+# Set the same version as for libgccpp.
+@CPLUSPLUS_TRUE@@GC_TBA_LIBRARY_TRUE@libgctba_la_LDFLAGS = -version-info $(LIBGCCPP_VER_INFO) -no-undefined
+
+# Misc
+# ----
+AM_CXXFLAGS = @GC_CFLAGS@
+@ASM_WITH_CPP_UNSUPPORTED_FALSE@ASM_CPP_OPTIONS = -Wp,-P -x assembler-with-cpp
+
+#all_objs = @addobjs@ $(libgc_la_OBJECTS)
+#$(all_objs) : include/private/gcconfig.h include/private/gc_priv.h \
+#include/private/gc_hdrs.h include/gc.h include/gc_gcj.h \
+#include/gc_pthread_redirects.h include/gc_config_macros.h \
+#include/private/thread_local_alloc.h include/private_support.h \
+#include/private/pthread_stop_world.h \
+#include/gc_mark.h @addincludes@
+@ASM_WITH_CPP_UNSUPPORTED_TRUE@ASM_CPP_OPTIONS =
+
+# Info (current:revision:age) for the Libtool versioning system.
+# These numbers should be updated at most once just before the release,
+# and, optionally, at most once during the development (after the release).
+LIBCORD_VER_INFO = 6:1:5
+libcord_la_LIBADD = libgc.la
+libcord_la_LDFLAGS = -version-info $(LIBCORD_VER_INFO) -no-undefined
+libcord_la_CPPFLAGS = $(AM_CPPFLAGS)
+libcord_la_SOURCES = \
+ cord/cordbscs.c \
+ cord/cordprnt.c \
+ cord/cordxtra.c
+
+cordtest_SOURCES = cord/tests/cordtest.c
+cordtest_LDADD = $(top_builddir)/libcord.la $(am__append_21)
+
+# Common libs to _LDADD for all tests.
+test_ldadd = $(nodist_libgc_la_OBJECTS) $(top_builddir)/libgc.la \
+ $(EXTRA_TEST_LIBS)
+
+gctest_SOURCES = tests/test.c
+gctest_LDADD = $(test_ldadd) $(am__append_22)
+gctest_DEPENDENCIES = $(top_builddir)/libgc.la
+@EMSCRIPTEN_TRUE@gctest_html_SOURCES = $(gctest_SOURCES)
+@EMSCRIPTEN_TRUE@gctest_html_LDADD = $(gctest_LDADD)
+# Bug in the linker not being able to determine that _memalign and _memset
+# are needed? it's part of mmap.
+@EMSCRIPTEN_TRUE@gctest_html_LDFLAGS = -s "EXPORTED_FUNCTIONS=['_memalign', '_main', '_memset']"
+leaktest_SOURCES = tests/leak_test.c
+leaktest_LDADD = $(test_ldadd)
+middletest_SOURCES = tests/middle.c
+middletest_LDADD = $(test_ldadd)
+smashtest_SOURCES = tests/smash_test.c
+smashtest_LDADD = $(test_ldadd)
+hugetest_SOURCES = tests/huge_test.c
+hugetest_LDADD = $(test_ldadd)
+realloc_test_SOURCES = tests/realloc_test.c
+realloc_test_LDADD = $(test_ldadd)
+staticrootstest_SOURCES = tests/staticrootstest.c
+staticrootstest_CFLAGS = -DSTATICROOTSLIB2
+staticrootstest_LDADD = $(nodist_libgc_la_OBJECTS) $(EXTRA_TEST_LIBS) \
+ libstaticrootslib_test.la libstaticrootslib2_test.la \
+ $(am__append_24)
+libstaticrootslib_test_la_SOURCES = tests/staticrootslib.c
+libstaticrootslib_test_la_LIBADD = $(test_ldadd)
+libstaticrootslib_test_la_LDFLAGS = -no-undefined -rpath /nowhere
+libstaticrootslib_test_la_DEPENDENCIES = $(top_builddir)/libgc.la
+libstaticrootslib2_test_la_SOURCES = tests/staticrootslib.c
+libstaticrootslib2_test_la_LIBADD = $(test_ldadd)
+libstaticrootslib2_test_la_CFLAGS = -DSTATICROOTSLIB2
+libstaticrootslib2_test_la_LDFLAGS = -no-undefined -rpath /nowhere
+@KEEP_BACK_PTRS_TRUE@tracetest_SOURCES = tests/trace_test.c
+@KEEP_BACK_PTRS_TRUE@tracetest_LDADD = $(test_ldadd)
+@THREADS_TRUE@test_atomic_ops_SOURCES = tests/test_atomic_ops.c
+# Really should need only $(ATOMIC_OPS_LIBS)
+@THREADS_TRUE@test_atomic_ops_LDADD = $(test_ldadd) $(THREADDLLIBS)
+@THREADS_TRUE@threadleaktest_SOURCES = tests/thread_leak_test.c
+@THREADS_TRUE@threadleaktest_LDADD = $(test_ldadd) $(THREADDLLIBS)
+@THREADS_TRUE@threadkey_test_SOURCES = tests/threadkey_test.c
+@THREADS_TRUE@threadkey_test_LDADD = $(test_ldadd) $(THREADDLLIBS)
+@THREADS_TRUE@subthreadcreate_test_SOURCES = tests/subthread_create.c
+@THREADS_TRUE@subthreadcreate_test_LDADD = $(test_ldadd) $(THREADDLLIBS)
+@THREADS_TRUE@initsecondarythread_test_SOURCES = tests/initsecondarythread.c
+@THREADS_TRUE@initsecondarythread_test_LDADD = $(test_ldadd) $(THREADDLLIBS)
+@CPLUSPLUS_TRUE@test_cpp_SOURCES = tests/test_cpp.cc
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@test_cpp_LDADD = libgccpp.la \
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@ $(nodist_libgc_la_OBJECTS) \
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@ $(EXTRA_TEST_LIBS) \
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@ $(CXXLIBS) \
+@AVOID_CPP_LIB_FALSE@@CPLUSPLUS_TRUE@ $(am__append_31)
+@AVOID_CPP_LIB_TRUE@@CPLUSPLUS_TRUE@test_cpp_LDADD = gc_badalc.o \
+@AVOID_CPP_LIB_TRUE@@CPLUSPLUS_TRUE@ gc_cpp.o $(test_ldadd) \
+@AVOID_CPP_LIB_TRUE@@CPLUSPLUS_TRUE@ $(CXXLIBS) \
+@AVOID_CPP_LIB_TRUE@@CPLUSPLUS_TRUE@ $(am__append_31)
+@ENABLE_DISCLAIM_TRUE@disclaim_test_SOURCES = tests/disclaim_test.c
+@ENABLE_DISCLAIM_TRUE@disclaim_test_LDADD = $(test_ldadd) \
+@ENABLE_DISCLAIM_TRUE@ $(am__append_34)
+@ENABLE_DISCLAIM_TRUE@disclaim_bench_SOURCES = tests/disclaim_bench.c
+@ENABLE_DISCLAIM_TRUE@disclaim_bench_LDADD = $(test_ldadd)
+@ENABLE_DISCLAIM_TRUE@disclaim_weakmap_test_SOURCES = tests/disclaim_weakmap_test.c
+@ENABLE_DISCLAIM_TRUE@disclaim_weakmap_test_LDADD = $(test_ldadd) \
+@ENABLE_DISCLAIM_TRUE@ $(am__append_35)
+
+# installed documentation
+@ENABLE_DOCS_TRUE@dist_doc_DATA = \
+@ENABLE_DOCS_TRUE@ AUTHORS \
+@ENABLE_DOCS_TRUE@ README.md \
+@ENABLE_DOCS_TRUE@ doc/README.DGUX386 \
+@ENABLE_DOCS_TRUE@ doc/README.Mac \
+@ENABLE_DOCS_TRUE@ doc/README.OS2 \
+@ENABLE_DOCS_TRUE@ doc/README.amiga \
+@ENABLE_DOCS_TRUE@ doc/README.arm.cross \
+@ENABLE_DOCS_TRUE@ doc/README.autoconf \
+@ENABLE_DOCS_TRUE@ doc/README.cmake \
+@ENABLE_DOCS_TRUE@ doc/README.cords \
+@ENABLE_DOCS_TRUE@ doc/README.darwin \
+@ENABLE_DOCS_TRUE@ doc/README.emscripten \
+@ENABLE_DOCS_TRUE@ doc/README.environment \
+@ENABLE_DOCS_TRUE@ doc/README.ews4800 \
+@ENABLE_DOCS_TRUE@ doc/README.hp \
+@ENABLE_DOCS_TRUE@ doc/README.linux \
+@ENABLE_DOCS_TRUE@ doc/README.macros \
+@ENABLE_DOCS_TRUE@ doc/README.rs6000 \
+@ENABLE_DOCS_TRUE@ doc/README.sgi \
+@ENABLE_DOCS_TRUE@ doc/README.solaris2 \
+@ENABLE_DOCS_TRUE@ doc/README.symbian \
+@ENABLE_DOCS_TRUE@ doc/README.uts \
+@ENABLE_DOCS_TRUE@ doc/README.win32 \
+@ENABLE_DOCS_TRUE@ doc/README.win64 \
+@ENABLE_DOCS_TRUE@ doc/debugging.md \
+@ENABLE_DOCS_TRUE@ doc/finalization.md \
+@ENABLE_DOCS_TRUE@ doc/gcdescr.md \
+@ENABLE_DOCS_TRUE@ doc/gcinterface.md \
+@ENABLE_DOCS_TRUE@ doc/leak.md \
+@ENABLE_DOCS_TRUE@ doc/overview.md \
+@ENABLE_DOCS_TRUE@ doc/porting.md \
+@ENABLE_DOCS_TRUE@ doc/scale.md \
+@ENABLE_DOCS_TRUE@ doc/simple_example.md \
+@ENABLE_DOCS_TRUE@ doc/tree.md
+
+@ENABLE_DOCS_TRUE@dist_man3_MANS = doc/gc.man
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .S .c .cc .lo .log .o .obj .s .test .test$(EXEEXT) .trs
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/include/include.am $(srcdir)/cord/cord.am $(srcdir)/tests/tests.am $(srcdir)/doc/doc.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+ esac;
+$(srcdir)/include/include.am $(srcdir)/cord/cord.am $(srcdir)/tests/tests.am $(srcdir)/doc/doc.am $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+include/config.h: include/stamp-h1
+ @test -f $@ || rm -f include/stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) include/stamp-h1
+
+include/stamp-h1: $(top_srcdir)/include/config.h.in $(top_builddir)/config.status
+ @rm -f include/stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status include/config.h
+$(top_srcdir)/include/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+ rm -f include/stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f include/config.h include/stamp-h1
+bdw-gc.pc: $(top_builddir)/config.status $(srcdir)/bdw-gc.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+clean-checkLTLIBRARIES:
+ -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES)
+ @list='$(check_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+cord/$(am__dirstamp):
+ @$(MKDIR_P) cord
+ @: > cord/$(am__dirstamp)
+cord/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) cord/$(DEPDIR)
+ @: > cord/$(DEPDIR)/$(am__dirstamp)
+cord/libcord_la-cordbscs.lo: cord/$(am__dirstamp) \
+ cord/$(DEPDIR)/$(am__dirstamp)
+cord/libcord_la-cordprnt.lo: cord/$(am__dirstamp) \
+ cord/$(DEPDIR)/$(am__dirstamp)
+cord/libcord_la-cordxtra.lo: cord/$(am__dirstamp) \
+ cord/$(DEPDIR)/$(am__dirstamp)
+
+libcord.la: $(libcord_la_OBJECTS) $(libcord_la_DEPENDENCIES) $(EXTRA_libcord_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libcord_la_LINK) -rpath $(libdir) $(libcord_la_OBJECTS) $(libcord_la_LIBADD) $(LIBS)
+extra/$(am__dirstamp):
+ @$(MKDIR_P) extra
+ @: > extra/$(am__dirstamp)
+extra/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) extra/$(DEPDIR)
+ @: > extra/$(DEPDIR)/$(am__dirstamp)
+extra/gc.lo: extra/$(am__dirstamp) extra/$(DEPDIR)/$(am__dirstamp)
+libatomic_ops/src/$(am__dirstamp):
+ @$(MKDIR_P) libatomic_ops/src
+ @: > libatomic_ops/src/$(am__dirstamp)
+libatomic_ops/src/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) libatomic_ops/src/$(DEPDIR)
+ @: > libatomic_ops/src/$(DEPDIR)/$(am__dirstamp)
+libatomic_ops/src/atomic_ops.lo: libatomic_ops/src/$(am__dirstamp) \
+ libatomic_ops/src/$(DEPDIR)/$(am__dirstamp)
+libatomic_ops/src/atomic_ops_sysdeps.lo: \
+ libatomic_ops/src/$(am__dirstamp) \
+ libatomic_ops/src/$(DEPDIR)/$(am__dirstamp)
+
+libgc.la: $(libgc_la_OBJECTS) $(libgc_la_DEPENDENCIES) $(EXTRA_libgc_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgc_la_LINK) -rpath $(libdir) $(libgc_la_OBJECTS) $(libgc_la_LIBADD) $(LIBS)
+
+libgccpp.la: $(libgccpp_la_OBJECTS) $(libgccpp_la_DEPENDENCIES) $(EXTRA_libgccpp_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libgccpp_la_LINK) $(am_libgccpp_la_rpath) $(libgccpp_la_OBJECTS) $(libgccpp_la_LIBADD) $(LIBS)
+
+libgctba.la: $(libgctba_la_OBJECTS) $(libgctba_la_DEPENDENCIES) $(EXTRA_libgctba_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libgctba_la_LINK) $(am_libgctba_la_rpath) $(libgctba_la_OBJECTS) $(libgctba_la_LIBADD) $(LIBS)
+tests/$(am__dirstamp):
+ @$(MKDIR_P) tests
+ @: > tests/$(am__dirstamp)
+tests/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tests/$(DEPDIR)
+ @: > tests/$(DEPDIR)/$(am__dirstamp)
+tests/libstaticrootslib2_test_la-staticrootslib.lo: \
+ tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp)
+
+libstaticrootslib2_test.la: $(libstaticrootslib2_test_la_OBJECTS) $(libstaticrootslib2_test_la_DEPENDENCIES) $(EXTRA_libstaticrootslib2_test_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libstaticrootslib2_test_la_LINK) $(libstaticrootslib2_test_la_OBJECTS) $(libstaticrootslib2_test_la_LIBADD) $(LIBS)
+tests/staticrootslib.lo: tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+libstaticrootslib_test.la: $(libstaticrootslib_test_la_OBJECTS) $(libstaticrootslib_test_la_DEPENDENCIES) $(EXTRA_libstaticrootslib_test_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libstaticrootslib_test_la_LINK) $(libstaticrootslib_test_la_OBJECTS) $(libstaticrootslib_test_la_LIBADD) $(LIBS)
+cord/tests/$(am__dirstamp):
+ @$(MKDIR_P) cord/tests
+ @: > cord/tests/$(am__dirstamp)
+cord/tests/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) cord/tests/$(DEPDIR)
+ @: > cord/tests/$(DEPDIR)/$(am__dirstamp)
+cord/tests/cordtest.$(OBJEXT): cord/tests/$(am__dirstamp) \
+ cord/tests/$(DEPDIR)/$(am__dirstamp)
+
+cordtest$(EXEEXT): $(cordtest_OBJECTS) $(cordtest_DEPENDENCIES) $(EXTRA_cordtest_DEPENDENCIES)
+ @rm -f cordtest$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(cordtest_OBJECTS) $(cordtest_LDADD) $(LIBS)
+tests/disclaim_bench.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+disclaim_bench$(EXEEXT): $(disclaim_bench_OBJECTS) $(disclaim_bench_DEPENDENCIES) $(EXTRA_disclaim_bench_DEPENDENCIES)
+ @rm -f disclaim_bench$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(disclaim_bench_OBJECTS) $(disclaim_bench_LDADD) $(LIBS)
+tests/disclaim_test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+disclaim_test$(EXEEXT): $(disclaim_test_OBJECTS) $(disclaim_test_DEPENDENCIES) $(EXTRA_disclaim_test_DEPENDENCIES)
+ @rm -f disclaim_test$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(disclaim_test_OBJECTS) $(disclaim_test_LDADD) $(LIBS)
+tests/disclaim_weakmap_test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+disclaim_weakmap_test$(EXEEXT): $(disclaim_weakmap_test_OBJECTS) $(disclaim_weakmap_test_DEPENDENCIES) $(EXTRA_disclaim_weakmap_test_DEPENDENCIES)
+ @rm -f disclaim_weakmap_test$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(disclaim_weakmap_test_OBJECTS) $(disclaim_weakmap_test_LDADD) $(LIBS)
+tests/test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+gctest$(EXEEXT): $(gctest_OBJECTS) $(gctest_DEPENDENCIES) $(EXTRA_gctest_DEPENDENCIES)
+ @rm -f gctest$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gctest_OBJECTS) $(gctest_LDADD) $(LIBS)
+
+gctest.html$(EXEEXT): $(gctest_html_OBJECTS) $(gctest_html_DEPENDENCIES) $(EXTRA_gctest_html_DEPENDENCIES)
+ @rm -f gctest.html$(EXEEXT)
+ $(AM_V_CCLD)$(gctest_html_LINK) $(gctest_html_OBJECTS) $(gctest_html_LDADD) $(LIBS)
+tests/huge_test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+hugetest$(EXEEXT): $(hugetest_OBJECTS) $(hugetest_DEPENDENCIES) $(EXTRA_hugetest_DEPENDENCIES)
+ @rm -f hugetest$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(hugetest_OBJECTS) $(hugetest_LDADD) $(LIBS)
+tests/initsecondarythread.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+initsecondarythread_test$(EXEEXT): $(initsecondarythread_test_OBJECTS) $(initsecondarythread_test_DEPENDENCIES) $(EXTRA_initsecondarythread_test_DEPENDENCIES)
+ @rm -f initsecondarythread_test$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(initsecondarythread_test_OBJECTS) $(initsecondarythread_test_LDADD) $(LIBS)
+tests/leak_test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+leaktest$(EXEEXT): $(leaktest_OBJECTS) $(leaktest_DEPENDENCIES) $(EXTRA_leaktest_DEPENDENCIES)
+ @rm -f leaktest$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(leaktest_OBJECTS) $(leaktest_LDADD) $(LIBS)
+tests/middle.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+middletest$(EXEEXT): $(middletest_OBJECTS) $(middletest_DEPENDENCIES) $(EXTRA_middletest_DEPENDENCIES)
+ @rm -f middletest$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(middletest_OBJECTS) $(middletest_LDADD) $(LIBS)
+tests/realloc_test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+realloc_test$(EXEEXT): $(realloc_test_OBJECTS) $(realloc_test_DEPENDENCIES) $(EXTRA_realloc_test_DEPENDENCIES)
+ @rm -f realloc_test$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(realloc_test_OBJECTS) $(realloc_test_LDADD) $(LIBS)
+tests/smash_test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+smashtest$(EXEEXT): $(smashtest_OBJECTS) $(smashtest_DEPENDENCIES) $(EXTRA_smashtest_DEPENDENCIES)
+ @rm -f smashtest$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(smashtest_OBJECTS) $(smashtest_LDADD) $(LIBS)
+tests/staticrootstest-staticrootstest.$(OBJEXT): \
+ tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp)
+
+staticrootstest$(EXEEXT): $(staticrootstest_OBJECTS) $(staticrootstest_DEPENDENCIES) $(EXTRA_staticrootstest_DEPENDENCIES)
+ @rm -f staticrootstest$(EXEEXT)
+ $(AM_V_CCLD)$(staticrootstest_LINK) $(staticrootstest_OBJECTS) $(staticrootstest_LDADD) $(LIBS)
+tests/subthread_create.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+subthreadcreate_test$(EXEEXT): $(subthreadcreate_test_OBJECTS) $(subthreadcreate_test_DEPENDENCIES) $(EXTRA_subthreadcreate_test_DEPENDENCIES)
+ @rm -f subthreadcreate_test$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(subthreadcreate_test_OBJECTS) $(subthreadcreate_test_LDADD) $(LIBS)
+tests/test_atomic_ops.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+test_atomic_ops$(EXEEXT): $(test_atomic_ops_OBJECTS) $(test_atomic_ops_DEPENDENCIES) $(EXTRA_test_atomic_ops_DEPENDENCIES)
+ @rm -f test_atomic_ops$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_atomic_ops_OBJECTS) $(test_atomic_ops_LDADD) $(LIBS)
+tests/test_cpp.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+test_cpp$(EXEEXT): $(test_cpp_OBJECTS) $(test_cpp_DEPENDENCIES) $(EXTRA_test_cpp_DEPENDENCIES)
+ @rm -f test_cpp$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(test_cpp_OBJECTS) $(test_cpp_LDADD) $(LIBS)
+tests/threadkey_test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+threadkey_test$(EXEEXT): $(threadkey_test_OBJECTS) $(threadkey_test_DEPENDENCIES) $(EXTRA_threadkey_test_DEPENDENCIES)
+ @rm -f threadkey_test$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(threadkey_test_OBJECTS) $(threadkey_test_LDADD) $(LIBS)
+tests/thread_leak_test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+threadleaktest$(EXEEXT): $(threadleaktest_OBJECTS) $(threadleaktest_DEPENDENCIES) $(EXTRA_threadleaktest_DEPENDENCIES)
+ @rm -f threadleaktest$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(threadleaktest_OBJECTS) $(threadleaktest_LDADD) $(LIBS)
+tests/trace_test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+
+tracetest$(EXEEXT): $(tracetest_OBJECTS) $(tracetest_DEPENDENCIES) $(EXTRA_tracetest_DEPENDENCIES)
+ @rm -f tracetest$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(tracetest_OBJECTS) $(tracetest_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+ -rm -f cord/*.$(OBJEXT)
+ -rm -f cord/*.lo
+ -rm -f cord/tests/*.$(OBJEXT)
+ -rm -f extra/*.$(OBJEXT)
+ -rm -f extra/*.lo
+ -rm -f libatomic_ops/src/*.$(OBJEXT)
+ -rm -f libatomic_ops/src/*.lo
+ -rm -f tests/*.$(OBJEXT)
+ -rm -f tests/*.lo
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allchblk.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backgraph.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blacklst.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checksums.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/darwin_stop_world.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbg_mlc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dyn_load.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/finalize.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnlz_mlc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc_badalc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc_cpp.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc_dlopen.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gcj_mlc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/headers.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mach_dep.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mallocx.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mark.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mark_rts.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/new_hblk.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/obj_map.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/os_dep.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pthread_start.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pthread_stop_world.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pthread_support.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptr_chck.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reclaim.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sparc_mach_dep.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/specific.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread_local_alloc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/typd_mlc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32_threads.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cord/$(DEPDIR)/libcord_la-cordbscs.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cord/$(DEPDIR)/libcord_la-cordprnt.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cord/$(DEPDIR)/libcord_la-cordxtra.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cord/tests/$(DEPDIR)/cordtest.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@extra/$(DEPDIR)/gc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@libatomic_ops/src/$(DEPDIR)/atomic_ops.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@libatomic_ops/src/$(DEPDIR)/atomic_ops_sysdeps.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/disclaim_bench.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/disclaim_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/disclaim_weakmap_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/huge_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/initsecondarythread.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/leak_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/libstaticrootslib2_test_la-staticrootslib.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/middle.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/realloc_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/smash_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/staticrootslib.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/staticrootstest-staticrootstest.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/subthread_create.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test_atomic_ops.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test_cpp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/thread_leak_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/threadkey_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/trace_test.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.S.o:
+@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ $<
+
+.S.obj:
+@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+cord/libcord_la-cordbscs.lo: cord/cordbscs.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcord_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cord/libcord_la-cordbscs.lo -MD -MP -MF cord/$(DEPDIR)/libcord_la-cordbscs.Tpo -c -o cord/libcord_la-cordbscs.lo `test -f 'cord/cordbscs.c' || echo '$(srcdir)/'`cord/cordbscs.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) cord/$(DEPDIR)/libcord_la-cordbscs.Tpo cord/$(DEPDIR)/libcord_la-cordbscs.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cord/cordbscs.c' object='cord/libcord_la-cordbscs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcord_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cord/libcord_la-cordbscs.lo `test -f 'cord/cordbscs.c' || echo '$(srcdir)/'`cord/cordbscs.c
+
+cord/libcord_la-cordprnt.lo: cord/cordprnt.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcord_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cord/libcord_la-cordprnt.lo -MD -MP -MF cord/$(DEPDIR)/libcord_la-cordprnt.Tpo -c -o cord/libcord_la-cordprnt.lo `test -f 'cord/cordprnt.c' || echo '$(srcdir)/'`cord/cordprnt.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) cord/$(DEPDIR)/libcord_la-cordprnt.Tpo cord/$(DEPDIR)/libcord_la-cordprnt.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cord/cordprnt.c' object='cord/libcord_la-cordprnt.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcord_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cord/libcord_la-cordprnt.lo `test -f 'cord/cordprnt.c' || echo '$(srcdir)/'`cord/cordprnt.c
+
+cord/libcord_la-cordxtra.lo: cord/cordxtra.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcord_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cord/libcord_la-cordxtra.lo -MD -MP -MF cord/$(DEPDIR)/libcord_la-cordxtra.Tpo -c -o cord/libcord_la-cordxtra.lo `test -f 'cord/cordxtra.c' || echo '$(srcdir)/'`cord/cordxtra.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) cord/$(DEPDIR)/libcord_la-cordxtra.Tpo cord/$(DEPDIR)/libcord_la-cordxtra.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cord/cordxtra.c' object='cord/libcord_la-cordxtra.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcord_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cord/libcord_la-cordxtra.lo `test -f 'cord/cordxtra.c' || echo '$(srcdir)/'`cord/cordxtra.c
+
+tests/libstaticrootslib2_test_la-staticrootslib.lo: tests/staticrootslib.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstaticrootslib2_test_la_CFLAGS) $(CFLAGS) -MT tests/libstaticrootslib2_test_la-staticrootslib.lo -MD -MP -MF tests/$(DEPDIR)/libstaticrootslib2_test_la-staticrootslib.Tpo -c -o tests/libstaticrootslib2_test_la-staticrootslib.lo `test -f 'tests/staticrootslib.c' || echo '$(srcdir)/'`tests/staticrootslib.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/libstaticrootslib2_test_la-staticrootslib.Tpo tests/$(DEPDIR)/libstaticrootslib2_test_la-staticrootslib.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/staticrootslib.c' object='tests/libstaticrootslib2_test_la-staticrootslib.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstaticrootslib2_test_la_CFLAGS) $(CFLAGS) -c -o tests/libstaticrootslib2_test_la-staticrootslib.lo `test -f 'tests/staticrootslib.c' || echo '$(srcdir)/'`tests/staticrootslib.c
+
+tests/staticrootstest-staticrootstest.o: tests/staticrootstest.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(staticrootstest_CFLAGS) $(CFLAGS) -MT tests/staticrootstest-staticrootstest.o -MD -MP -MF tests/$(DEPDIR)/staticrootstest-staticrootstest.Tpo -c -o tests/staticrootstest-staticrootstest.o `test -f 'tests/staticrootstest.c' || echo '$(srcdir)/'`tests/staticrootstest.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/staticrootstest-staticrootstest.Tpo tests/$(DEPDIR)/staticrootstest-staticrootstest.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/staticrootstest.c' object='tests/staticrootstest-staticrootstest.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(staticrootstest_CFLAGS) $(CFLAGS) -c -o tests/staticrootstest-staticrootstest.o `test -f 'tests/staticrootstest.c' || echo '$(srcdir)/'`tests/staticrootstest.c
+
+tests/staticrootstest-staticrootstest.obj: tests/staticrootstest.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(staticrootstest_CFLAGS) $(CFLAGS) -MT tests/staticrootstest-staticrootstest.obj -MD -MP -MF tests/$(DEPDIR)/staticrootstest-staticrootstest.Tpo -c -o tests/staticrootstest-staticrootstest.obj `if test -f 'tests/staticrootstest.c'; then $(CYGPATH_W) 'tests/staticrootstest.c'; else $(CYGPATH_W) '$(srcdir)/tests/staticrootstest.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/staticrootstest-staticrootstest.Tpo tests/$(DEPDIR)/staticrootstest-staticrootstest.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/staticrootstest.c' object='tests/staticrootstest-staticrootstest.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(staticrootstest_CFLAGS) $(CFLAGS) -c -o tests/staticrootstest-staticrootstest.obj `if test -f 'tests/staticrootstest.c'; then $(CYGPATH_W) 'tests/staticrootstest.c'; else $(CYGPATH_W) '$(srcdir)/tests/staticrootstest.c'; fi`
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+.s.o:
+ $(AM_V_CCAS)$(CCASCOMPILE) -c -o $@ $<
+
+.s.obj:
+ $(AM_V_CCAS)$(CCASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+ -rm -rf cord/.libs cord/_libs
+ -rm -rf extra/.libs extra/_libs
+ -rm -rf libatomic_ops/src/.libs libatomic_ops/src/_libs
+ -rm -rf tests/.libs tests/_libs
+
+distclean-libtool:
+ -rm -f libtool config.lt
+install-man3: $(dist_man3_MANS)
+ @$(NORMAL_INSTALL)
+ @list1='$(dist_man3_MANS)'; \
+ list2=''; \
+ test -n "$(man3dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.3[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man3:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_man3_MANS)'; test -n "$(man3dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
+install-dist_docDATA: $(dist_doc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \
+ done
+
+uninstall-dist_docDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)
+install-pkgconfigDATA: $(pkgconfig_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+ done
+
+uninstall-pkgconfigDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
+install-includeHEADERS: $(include_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+ done
+
+uninstall-includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS: $(check_PROGRAMS) $(check_LTLIBRARIES)
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS) $(check_LTLIBRARIES)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+cordtest.log: cordtest$(EXEEXT)
+ @p='cordtest$(EXEEXT)'; \
+ b='cordtest'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+gctest.log: gctest$(EXEEXT)
+ @p='gctest$(EXEEXT)'; \
+ b='gctest'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+leaktest.log: leaktest$(EXEEXT)
+ @p='leaktest$(EXEEXT)'; \
+ b='leaktest'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+middletest.log: middletest$(EXEEXT)
+ @p='middletest$(EXEEXT)'; \
+ b='middletest'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+smashtest.log: smashtest$(EXEEXT)
+ @p='smashtest$(EXEEXT)'; \
+ b='smashtest'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+hugetest.log: hugetest$(EXEEXT)
+ @p='hugetest$(EXEEXT)'; \
+ b='hugetest'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+realloc_test.log: realloc_test$(EXEEXT)
+ @p='realloc_test$(EXEEXT)'; \
+ b='realloc_test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+staticrootstest.log: staticrootstest$(EXEEXT)
+ @p='staticrootstest$(EXEEXT)'; \
+ b='staticrootstest'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+tracetest.log: tracetest$(EXEEXT)
+ @p='tracetest$(EXEEXT)'; \
+ b='tracetest'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test_atomic_ops.log: test_atomic_ops$(EXEEXT)
+ @p='test_atomic_ops$(EXEEXT)'; \
+ b='test_atomic_ops'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+threadleaktest.log: threadleaktest$(EXEEXT)
+ @p='threadleaktest$(EXEEXT)'; \
+ b='threadleaktest'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+threadkey_test.log: threadkey_test$(EXEEXT)
+ @p='threadkey_test$(EXEEXT)'; \
+ b='threadkey_test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+subthreadcreate_test.log: subthreadcreate_test$(EXEEXT)
+ @p='subthreadcreate_test$(EXEEXT)'; \
+ b='subthreadcreate_test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+initsecondarythread_test.log: initsecondarythread_test$(EXEEXT)
+ @p='initsecondarythread_test$(EXEEXT)'; \
+ b='initsecondarythread_test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test_cpp.log: test_cpp$(EXEEXT)
+ @p='test_cpp$(EXEEXT)'; \
+ b='test_cpp'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+disclaim_test.log: disclaim_test$(EXEEXT)
+ @p='disclaim_test$(EXEEXT)'; \
+ b='disclaim_test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+disclaim_bench.log: disclaim_bench$(EXEEXT)
+ @p='disclaim_bench$(EXEEXT)'; \
+ b='disclaim_bench'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+disclaim_weakmap_test.log: disclaim_weakmap_test$(EXEEXT)
+ @p='disclaim_weakmap_test$(EXEEXT)'; \
+ b='disclaim_weakmap_test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-zstd: distdir
+ tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ *.tar.zst*) \
+ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build/sub \
+ && ../../configure \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=../.. --prefix="$$dc_install_base" \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__post_remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_LTLIBRARIES)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-recursive
+all-am: Makefile $(LTLIBRARIES) $(MANS) $(DATA) $(HEADERS)
+install-checkPROGRAMS: install-libLTLIBRARIES
+
+install-checkLTLIBRARIES: install-libLTLIBRARIES
+
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -rm -f cord/$(DEPDIR)/$(am__dirstamp)
+ -rm -f cord/$(am__dirstamp)
+ -rm -f cord/tests/$(DEPDIR)/$(am__dirstamp)
+ -rm -f cord/tests/$(am__dirstamp)
+ -rm -f extra/$(DEPDIR)/$(am__dirstamp)
+ -rm -f extra/$(am__dirstamp)
+ -rm -f libatomic_ops/src/$(DEPDIR)/$(am__dirstamp)
+ -rm -f libatomic_ops/src/$(am__dirstamp)
+ -rm -f tests/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tests/$(am__dirstamp)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \
+ clean-libLTLIBRARIES clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f ./$(DEPDIR)/allchblk.Plo
+ -rm -f ./$(DEPDIR)/alloc.Plo
+ -rm -f ./$(DEPDIR)/backgraph.Plo
+ -rm -f ./$(DEPDIR)/blacklst.Plo
+ -rm -f ./$(DEPDIR)/checksums.Plo
+ -rm -f ./$(DEPDIR)/darwin_stop_world.Plo
+ -rm -f ./$(DEPDIR)/dbg_mlc.Plo
+ -rm -f ./$(DEPDIR)/dyn_load.Plo
+ -rm -f ./$(DEPDIR)/finalize.Plo
+ -rm -f ./$(DEPDIR)/fnlz_mlc.Plo
+ -rm -f ./$(DEPDIR)/gc_badalc.Plo
+ -rm -f ./$(DEPDIR)/gc_cpp.Plo
+ -rm -f ./$(DEPDIR)/gc_dlopen.Plo
+ -rm -f ./$(DEPDIR)/gcj_mlc.Plo
+ -rm -f ./$(DEPDIR)/headers.Plo
+ -rm -f ./$(DEPDIR)/mach_dep.Plo
+ -rm -f ./$(DEPDIR)/malloc.Plo
+ -rm -f ./$(DEPDIR)/mallocx.Plo
+ -rm -f ./$(DEPDIR)/mark.Plo
+ -rm -f ./$(DEPDIR)/mark_rts.Plo
+ -rm -f ./$(DEPDIR)/misc.Plo
+ -rm -f ./$(DEPDIR)/new_hblk.Plo
+ -rm -f ./$(DEPDIR)/obj_map.Plo
+ -rm -f ./$(DEPDIR)/os_dep.Plo
+ -rm -f ./$(DEPDIR)/pthread_start.Plo
+ -rm -f ./$(DEPDIR)/pthread_stop_world.Plo
+ -rm -f ./$(DEPDIR)/pthread_support.Plo
+ -rm -f ./$(DEPDIR)/ptr_chck.Plo
+ -rm -f ./$(DEPDIR)/reclaim.Plo
+ -rm -f ./$(DEPDIR)/sparc_mach_dep.Plo
+ -rm -f ./$(DEPDIR)/specific.Plo
+ -rm -f ./$(DEPDIR)/thread_local_alloc.Plo
+ -rm -f ./$(DEPDIR)/typd_mlc.Plo
+ -rm -f ./$(DEPDIR)/win32_threads.Plo
+ -rm -f cord/$(DEPDIR)/libcord_la-cordbscs.Plo
+ -rm -f cord/$(DEPDIR)/libcord_la-cordprnt.Plo
+ -rm -f cord/$(DEPDIR)/libcord_la-cordxtra.Plo
+ -rm -f cord/tests/$(DEPDIR)/cordtest.Po
+ -rm -f extra/$(DEPDIR)/gc.Plo
+ -rm -f libatomic_ops/src/$(DEPDIR)/atomic_ops.Plo
+ -rm -f libatomic_ops/src/$(DEPDIR)/atomic_ops_sysdeps.Plo
+ -rm -f tests/$(DEPDIR)/disclaim_bench.Po
+ -rm -f tests/$(DEPDIR)/disclaim_test.Po
+ -rm -f tests/$(DEPDIR)/disclaim_weakmap_test.Po
+ -rm -f tests/$(DEPDIR)/huge_test.Po
+ -rm -f tests/$(DEPDIR)/initsecondarythread.Po
+ -rm -f tests/$(DEPDIR)/leak_test.Po
+ -rm -f tests/$(DEPDIR)/libstaticrootslib2_test_la-staticrootslib.Plo
+ -rm -f tests/$(DEPDIR)/middle.Po
+ -rm -f tests/$(DEPDIR)/realloc_test.Po
+ -rm -f tests/$(DEPDIR)/smash_test.Po
+ -rm -f tests/$(DEPDIR)/staticrootslib.Plo
+ -rm -f tests/$(DEPDIR)/staticrootstest-staticrootstest.Po
+ -rm -f tests/$(DEPDIR)/subthread_create.Po
+ -rm -f tests/$(DEPDIR)/test.Po
+ -rm -f tests/$(DEPDIR)/test_atomic_ops.Po
+ -rm -f tests/$(DEPDIR)/test_cpp.Po
+ -rm -f tests/$(DEPDIR)/thread_leak_test.Po
+ -rm -f tests/$(DEPDIR)/threadkey_test.Po
+ -rm -f tests/$(DEPDIR)/trace_test.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-dist_docDATA install-includeHEADERS \
+ install-man install-pkgconfigDATA install-pkgincludeHEADERS
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man3
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f ./$(DEPDIR)/allchblk.Plo
+ -rm -f ./$(DEPDIR)/alloc.Plo
+ -rm -f ./$(DEPDIR)/backgraph.Plo
+ -rm -f ./$(DEPDIR)/blacklst.Plo
+ -rm -f ./$(DEPDIR)/checksums.Plo
+ -rm -f ./$(DEPDIR)/darwin_stop_world.Plo
+ -rm -f ./$(DEPDIR)/dbg_mlc.Plo
+ -rm -f ./$(DEPDIR)/dyn_load.Plo
+ -rm -f ./$(DEPDIR)/finalize.Plo
+ -rm -f ./$(DEPDIR)/fnlz_mlc.Plo
+ -rm -f ./$(DEPDIR)/gc_badalc.Plo
+ -rm -f ./$(DEPDIR)/gc_cpp.Plo
+ -rm -f ./$(DEPDIR)/gc_dlopen.Plo
+ -rm -f ./$(DEPDIR)/gcj_mlc.Plo
+ -rm -f ./$(DEPDIR)/headers.Plo
+ -rm -f ./$(DEPDIR)/mach_dep.Plo
+ -rm -f ./$(DEPDIR)/malloc.Plo
+ -rm -f ./$(DEPDIR)/mallocx.Plo
+ -rm -f ./$(DEPDIR)/mark.Plo
+ -rm -f ./$(DEPDIR)/mark_rts.Plo
+ -rm -f ./$(DEPDIR)/misc.Plo
+ -rm -f ./$(DEPDIR)/new_hblk.Plo
+ -rm -f ./$(DEPDIR)/obj_map.Plo
+ -rm -f ./$(DEPDIR)/os_dep.Plo
+ -rm -f ./$(DEPDIR)/pthread_start.Plo
+ -rm -f ./$(DEPDIR)/pthread_stop_world.Plo
+ -rm -f ./$(DEPDIR)/pthread_support.Plo
+ -rm -f ./$(DEPDIR)/ptr_chck.Plo
+ -rm -f ./$(DEPDIR)/reclaim.Plo
+ -rm -f ./$(DEPDIR)/sparc_mach_dep.Plo
+ -rm -f ./$(DEPDIR)/specific.Plo
+ -rm -f ./$(DEPDIR)/thread_local_alloc.Plo
+ -rm -f ./$(DEPDIR)/typd_mlc.Plo
+ -rm -f ./$(DEPDIR)/win32_threads.Plo
+ -rm -f cord/$(DEPDIR)/libcord_la-cordbscs.Plo
+ -rm -f cord/$(DEPDIR)/libcord_la-cordprnt.Plo
+ -rm -f cord/$(DEPDIR)/libcord_la-cordxtra.Plo
+ -rm -f cord/tests/$(DEPDIR)/cordtest.Po
+ -rm -f extra/$(DEPDIR)/gc.Plo
+ -rm -f libatomic_ops/src/$(DEPDIR)/atomic_ops.Plo
+ -rm -f libatomic_ops/src/$(DEPDIR)/atomic_ops_sysdeps.Plo
+ -rm -f tests/$(DEPDIR)/disclaim_bench.Po
+ -rm -f tests/$(DEPDIR)/disclaim_test.Po
+ -rm -f tests/$(DEPDIR)/disclaim_weakmap_test.Po
+ -rm -f tests/$(DEPDIR)/huge_test.Po
+ -rm -f tests/$(DEPDIR)/initsecondarythread.Po
+ -rm -f tests/$(DEPDIR)/leak_test.Po
+ -rm -f tests/$(DEPDIR)/libstaticrootslib2_test_la-staticrootslib.Plo
+ -rm -f tests/$(DEPDIR)/middle.Po
+ -rm -f tests/$(DEPDIR)/realloc_test.Po
+ -rm -f tests/$(DEPDIR)/smash_test.Po
+ -rm -f tests/$(DEPDIR)/staticrootslib.Plo
+ -rm -f tests/$(DEPDIR)/staticrootstest-staticrootstest.Po
+ -rm -f tests/$(DEPDIR)/subthread_create.Po
+ -rm -f tests/$(DEPDIR)/test.Po
+ -rm -f tests/$(DEPDIR)/test_atomic_ops.Po
+ -rm -f tests/$(DEPDIR)/test_cpp.Po
+ -rm -f tests/$(DEPDIR)/thread_leak_test.Po
+ -rm -f tests/$(DEPDIR)/threadkey_test.Po
+ -rm -f tests/$(DEPDIR)/trace_test.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-dist_docDATA uninstall-includeHEADERS \
+ uninstall-libLTLIBRARIES uninstall-man uninstall-pkgconfigDATA \
+ uninstall-pkgincludeHEADERS
+
+uninstall-man: uninstall-man3
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--depfiles am--refresh check check-TESTS check-am clean \
+ clean-checkLTLIBRARIES clean-checkPROGRAMS clean-cscope \
+ clean-generic clean-libLTLIBRARIES clean-libtool cscope \
+ cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
+ dist-zstd distcheck distclean distclean-compile \
+ distclean-generic distclean-hdr distclean-libtool \
+ distclean-tags distcleancheck distdir distuninstallcheck dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dist_docDATA install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-includeHEADERS install-info \
+ install-info-am install-libLTLIBRARIES install-man \
+ install-man3 install-pdf install-pdf-am install-pkgconfigDATA \
+ install-pkgincludeHEADERS install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
+ uninstall uninstall-am uninstall-dist_docDATA \
+ uninstall-includeHEADERS uninstall-libLTLIBRARIES \
+ uninstall-man uninstall-man3 uninstall-pkgconfigDATA \
+ uninstall-pkgincludeHEADERS
+
+.PRECIOUS: Makefile
+
+
+.s.lo:
+ $(LTCOMPILE) $(ASM_CPP_OPTIONS) -c $<
+
+.S.lo:
+ $(LTCOMPILE) $(ASM_CPP_OPTIONS) -c $<
+
+#
+# :GOTCHA: GNU make rule for making .s out of .S is flawed,
+# it will not remove dest if building fails
+.S.s:
+ if $(CPP) $< >$@ ; then :; else rm -f $@; fi
+
+# Run the tests directly (without test-driver):
+.PHONY: check-without-test-driver
+check-without-test-driver: $(TESTS)
+ ./gctest$(EXEEXT)
+ ./hugetest$(EXEEXT)
+ ./leaktest$(EXEEXT)
+ ./middletest$(EXEEXT)
+ ./realloc_test$(EXEEXT)
+ ./smashtest$(EXEEXT)
+ ./staticrootstest$(EXEEXT)
+ test ! -f disclaim_bench$(EXEEXT) || ./disclaim_bench$(EXEEXT)
+ test ! -f disclaim_test$(EXEEXT) || ./disclaim_test$(EXEEXT)
+ test ! -f disclaim_weakmap_test$(EXEEXT) || ./disclaim_weakmap_test$(EXEEXT)
+ test ! -f initsecondarythread_test$(EXEEXT) \
+ || ./initsecondarythread_test$(EXEEXT)
+ test ! -f test_atomic_ops$(EXEEXT) || ./test_atomic_ops$(EXEEXT)
+ test ! -f threadkey_test$(EXEEXT) || ./threadkey_test$(EXEEXT)
+ test ! -f threadleaktest$(EXEEXT) || ./threadleaktest$(EXEEXT)
+ test ! -f subthreadcreate_test$(EXEEXT) || ./subthreadcreate_test$(EXEEXT)
+ test ! -f test_cpp$(EXEEXT) || ./test_cpp$(EXEEXT)
+ test ! -f tracetest$(EXEEXT) || ./tracetest$(EXEEXT)
+ ./cordtest$(EXEEXT)
+
+# A dummy target for mono build.
+test-bundle:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/graphics/asymptote/gc/NT_MAKEFILE b/graphics/asymptote/gc/NT_MAKEFILE
new file mode 100644
index 0000000000..4160818839
--- /dev/null
+++ b/graphics/asymptote/gc/NT_MAKEFILE
@@ -0,0 +1,186 @@
+# Makefile for Windows (Win32/64). Assumes Microsoft compiler.
+# Should be invoked as "nmake -f NT_MAKEFILE [<args>]"; the optional arguments
+# are: "cpu=AMD64" - to target x64, "cpu=i386" - to target x86,
+# "enable_static=1" - to build it as a static library, "nodebug=1" - to produce
+# the release variant of the library, "disable_threads=1" - to build the
+# library and the tests without threads support.
+
+cc = cl
+link = link
+rc = rc
+
+!IF !DEFINED(CPU) || "$(CPU)" == ""
+CPU = $(PROCESSOR_ARCHITECTURE)
+!ENDIF
+!IF "$(CPU)" == "I386" || "$(CPU)" == "X86" || "$(CPU)" == "x86"
+CPU = i386
+!ELSEIF "$(CPU)" == "X64" || "$(CPU)" == "x64" || "$(CPU)" == "amd64"
+CPU = AMD64
+!ENDIF
+
+!IF !DEFINED(NMAKE_WINVER)
+NMAKE_WINVER = 0x0600
+!ENDIF
+
+cflags = $(cflags) -c -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -GS -D_WINNT -W4
+!IF "$(CPU)" == "i386"
+cflags = $(cflags) -D_X86_=1 -DWIN32 -D_WIN32
+!ELSEIF "$(CPU)" == "AMD64"
+cflags = $(cflags) -D_AMD64_=1 -DWIN64 -D_WIN64 -DWIN32 -D_WIN32
+!ENDIF
+cflags = $(cflags) -D_WIN32_WINNT=$(NMAKE_WINVER) -DWINVER=$(NMAKE_WINVER)
+
+!IFDEF NODEBUG
+cvarsmt = -D_MT -MT
+cdebug = -Ox -DNDEBUG
+rcvars = -DWIN32 -D_WIN32 -DWINVER=$(NMAKE_WINVER)
+ldebug = /RELEASE
+!ELSE
+cvarsmt = -D_MT -MTd
+cdebug = -Zi -Od -DDEBUG
+rcvars = -DWIN32 -D_WIN32 -DWINVER=$(NMAKE_WINVER) -DDEBUG -D_DEBUG
+ldebug = /DEBUG /DEBUGTYPE:cv
+!ENDIF
+
+!IF "$(CPU)" == "i386"
+CVTRES_CPU=X86
+!ELSEIF "$(CPU)" == "AMD64"
+CVTRES_CPU=X64
+!ENDIF
+
+!IFNDEF NODEBUG
+CFLAGS_DEBUG=-DGC_ASSERTIONS
+!ENDIF
+
+!IFDEF ENABLE_STATIC
+CFLAGS_GCDLL=-DGC_NOT_DLL
+CORDFLAG=
+!ELSE
+CFLAGS_GCDLL=-DGC_DLL
+# cord.dll and its clients should not link C library statically otherwise
+# FILE-related functions might not work (because own set of opened FILEs
+# is maintained by each copy of the C library thus making impossible to pass
+# FILE pointer from .exe code to .dll code).
+cvarsmt=
+!IFDEF NODEBUG
+CORDFLAG=-MD
+!ELSE
+CORDFLAG=-MDd
+!ENDIF
+!ENDIF
+
+!IFNDEF DISABLE_THREADS
+CFLAGS_MT=$(cvarsmt) -DGC_THREADS -DTHREAD_LOCAL_ALLOC -DPARALLEL_MARK
+!ENDIF
+
+CFLAGS_SPECIFIC=$(CFLAGS_DEBUG) $(CFLAGS_GCDLL) $(CFLAGS_MT)
+
+CFLAGS_DEFAULT=-DALL_INTERIOR_POINTERS -DENABLE_DISCLAIM -DGC_ATOMIC_UNCOLLECTABLE -DGC_GCJ_SUPPORT -DJAVA_FINALIZATION -DNO_EXECUTE_PERMISSION -DUSE_MUNMAP
+
+CXXFLAGS_SPECIFIC=/EHsc
+
+# Make sure that .cc is not viewed as a suffix. It is for VC++2005, but
+# not earlier versions. We can deal with either, but not inconsistency.
+.SUFFIXES:
+.SUFFIXES: .obj .cpp .c
+
+# Atomic_ops installation directory. For Win32, the source directory
+# should do, since we only need the headers.
+# We assume this was manually unpacked.
+AO_SRC_DIR=libatomic_ops/src
+AO_INCLUDE_DIR=$(AO_SRC_DIR)
+
+!IFDEF ENABLE_STATIC
+OBJS= misc.obj win32_threads.obj alloc.obj reclaim.obj allchblk.obj mach_dep.obj os_dep.obj mark_rts.obj headers.obj mark.obj obj_map.obj blacklst.obj finalize.obj new_hblk.obj dbg_mlc.obj fnlz_mlc.obj malloc.obj dyn_load.obj typd_mlc.obj ptr_chck.obj gcj_mlc.obj mallocx.obj extra\msvc_dbg.obj thread_local_alloc.obj
+!ELSE
+OBJS= extra\gc.obj extra\msvc_dbg.obj
+!ENDIF
+
+COBJS= cord\cordbscs.obj cord\cordxtra.obj cord\cordprnt.obj
+
+all: gc.lib cord.lib gccpp.lib gctba.lib
+
+check: gctest.exe test_cpp.exe cordtest.exe de.exe
+ gctest.exe
+ cordtest.exe
+ test_cpp.exe
+
+.c.obj:
+ $(cc) $(cdebug) $(cflags) $(CFLAGS_SPECIFIC) $(CORDFLAG) -Iinclude -I$(AO_INCLUDE_DIR) $(CFLAGS_DEFAULT) -D_CRT_SECURE_NO_DEPRECATE $*.c /Fo$*.obj /wd4100 /wd4127 /wd4701
+# Disable crt security warnings, since unfortunately they warn about all sorts
+# of safe uses of strncpy. It would be nice to leave the rest enabled.
+
+.cpp.obj:
+ $(cc) $(cdebug) $(cflags) $(CFLAGS_SPECIFIC) -Iinclude $(CFLAGS_DEFAULT) $(CXXFLAGS_SPECIFIC) -D_CRT_SECURE_NO_DEPRECATE $*.cpp /Fo$*.obj
+
+$(OBJS) tests\test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h include\private\gc_locks.h include\private\gc_pmark.h include\gc_mark.h include\gc_disclaim.h include\private\msvc_dbg.h
+
+!IFDEF ENABLE_STATIC
+
+gc.lib: $(OBJS)
+ lib /out:gc.lib /MACHINE:$(CPU) $(OBJS)
+
+cord.lib: $(COBJS)
+ lib /out:cord.lib /MACHINE:$(CPU) $(COBJS)
+
+gccpp.lib: gc_badalc.obj gc_cpp.obj
+ lib /out:gccpp.lib /MACHINE:$(CPU) gc_badalc.obj gc_cpp.obj
+
+# The same as gccpp.lib but contains only gc_badalc.obj.
+gctba.lib: gc_badalc.obj
+ lib /out:gctba.lib /MACHINE:$(CPU) gc_badalc.obj
+
+!ELSE
+
+gc.lib: $(OBJS)
+ $(link) $(ldebug) kernel32.lib user32.lib /subsystem:windows /dll /INCREMENTAL:NO /pdb:"gc.pdb" /out:gc.dll /implib:gc.lib /MACHINE:$(CPU) $(OBJS)
+
+cord.lib: $(COBJS) gc.lib
+ $(link) $(ldebug) gc.lib /subsystem:windows /dll /INCREMENTAL:NO /pdb:"cord.pdb" /out:cord.dll /implib:cord.lib /MACHINE:$(CPU) $(COBJS)
+
+gccpp.lib: gc_badalc.obj gc_cpp.obj gc.lib
+ $(link) $(ldebug) gc.lib /subsystem:windows /dll /INCREMENTAL:NO /pdb:"gccpp.pdb" /out:gccpp.dll /implib:gccpp.lib /MACHINE:$(CPU) gc_badalc.obj gc_cpp.obj
+
+gctba.lib: gc_badalc.obj gc.lib
+ $(link) $(ldebug) gc.lib /subsystem:windows /dll /INCREMENTAL:NO /pdb:"gctba.pdb" /out:gctba.dll /implib:gctba.lib /MACHINE:$(CPU) gc_badalc.obj
+
+!ENDIF
+
+gctest.exe: gc.lib tests\test.obj
+ $(link) /MACHINE:$(CPU) /INCREMENTAL:NO $(ldebug) $(lflags) user32.lib -out:$*.exe tests\test.obj gc.lib
+# mapsympe -n -o gctest.sym gctest.exe
+# This produces a GUI app that opens no window and writes to gctest.gc.log.
+
+cord\tests\de_win.rbj: cord\tests\de_win.res
+ cvtres /MACHINE:$(CVTRES_CPU) /OUT:cord\tests\de_win.rbj cord\tests\de_win.res
+
+cord\tests\de.obj cord\tests\de_win.obj: include\cord.h include\cord_pos.h cord\tests\de_win.h cord\tests\de_cmds.h
+
+cord\tests\de_win.res: cord\tests\de_win.rc cord\tests\de_win.h cord\tests\de_cmds.h
+ $(rc) $(rcvars) -r -fo cord\tests\de_win.res cord\tests\de_win.rc
+
+# Cord/de is a real Windows GUI app.
+de.exe: cord\tests\de.obj cord\tests\de_win.obj cord\tests\de_win.rbj gc.lib cord.lib
+ $(link) /MACHINE:$(CPU) /INCREMENTAL:NO $(ldebug) $(lflags) -out:de.exe cord\tests\de.obj cord\tests\de_win.obj cord\tests\de_win.rbj gc.lib cord.lib gdi32.lib user32.lib
+
+cordtest.exe: cord\tests\cordtest.obj gc.lib cord.lib
+ $(link) /subsystem:console /MACHINE:$(CPU) /INCREMENTAL:NO $(ldebug) $(lflags) -out:cordtest.exe cord\tests\cordtest.obj gc.lib cord.lib user32.lib
+
+gc_badalc.obj: gc_badalc.cc include\gc_cpp.h include\gc.h
+
+gc_cpp.obj: gc_cpp.cc include\gc_cpp.h include\gc.h
+
+test_cpp.cpp: tests\test_cpp.cc
+ copy tests\test_cpp.cc test_cpp.cpp
+
+# This generates the C++ test executable. The executable expects
+# a single numeric argument, which is the number of iterations.
+# The output appears in test_cpp.gc.log file.
+test_cpp.exe: test_cpp.obj include\gc_cpp.h include\gc.h gc.lib gccpp.lib
+ $(link) /MACHINE:$(CPU) /INCREMENTAL:NO $(ldebug) $(lflags) user32.lib -out:test_cpp.exe test_cpp.obj gc.lib gccpp.lib
+
+$(AO_SRC_DIR):
+ tar xvfz $(AO_SRC_DIR).tar.gz
+
+clean:
+ del *.dll *.exe *.exp *.lib *.log *.obj *.pdb cordtst*.tmp cord\*.obj cord\tests\*.rbj cord\tests\*.res cord\tests\*.obj extra\*.obj test_cpp.cpp tests\*.obj 2> nul
diff --git a/graphics/asymptote/gc/OS2_MAKEFILE b/graphics/asymptote/gc/OS2_MAKEFILE
new file mode 100644
index 0000000000..a521631694
--- /dev/null
+++ b/graphics/asymptote/gc/OS2_MAKEFILE
@@ -0,0 +1,59 @@
+# Makefile for OS/2. Assumes IBM's compiler, static linking, and a single thread.
+# Adding dynamic linking support seems easy, but takes a little bit of work.
+# Adding thread support may be nontrivial, since we haven't yet figured out how to
+# look at another thread's registers.
+
+# Significantly revised by Mark Boulter (Jan 1994).
+
+OBJS= alloc.obj reclaim.obj allchblk.obj misc.obj mach_dep.obj os_dep.obj mark_rts.obj headers.obj mark.obj obj_map.obj blacklst.obj finalize.obj new_hblk.obj dbg_mlc.obj fnlz_mlc.obj malloc.obj typd_mlc.obj ptr_chck.obj mallocx.obj gcj_mlc.obj
+
+CORDOBJS= cord\cordbscs.obj cord\cordxtra.obj cord\cordprnt.obj
+
+CC= icc
+CFLAGS= /O /Q /DALL_INTERIOR_POINTERS /DENABLE_DISCLAIM /DGC_ATOMIC_UNCOLLECTABLE /DGC_GCJ_SUPPORT /DJAVA_FINALIZATION /DNO_EXECUTE_PERMISSION /DSMALL_CONFIG
+# Use /Ti instead of /O for debugging
+# Setjmp_test may yield overly optimistic results when compiled
+# without optimization.
+
+all: gc.lib cord.lib
+
+check: gctest.exe cordtest.exe
+ gctest.exe
+ cordtest.exe
+
+$(OBJS) test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h
+
+## ERASE THE LIB FIRST - if it is already there then this command will fail
+## (make sure it is there or erase will fail!)
+gc.lib: $(OBJS)
+ echo . > gc.lib
+ erase gc.lib
+ LIB gc.lib $(OBJS), gc.lst
+
+mach_dep.obj: mach_dep.c
+ $(CC) $(CFLAGS) /C mach_dep.c
+
+gctest.exe: test.obj gc.lib
+ $(CC) $(CFLAGS) /B"/STACK:524288" /Fegctest test.obj gc.lib
+
+cord\cordbscs.obj: cord\cordbscs.c include\cord.h include\cord_pos.h
+ $(CC) $(CFLAGS) /C /Focord\cordbscs cord\cordbscs.c
+
+cord\cordxtra.obj: cord\cordxtra.c include\cord.h include\cord_pos.h include\ec.h
+ $(CC) $(CFLAGS) /C /Focord\cordxtra cord\cordxtra.c
+
+cord\cordprnt.obj: cord\cordprnt.c include\cord.h include\cord_pos.h include\ec.h
+ $(CC) $(CFLAGS) /C /Focord\cordprnt cord\cordprnt.c
+
+cord.lib: $(CORDOBJS)
+ echo . > cord.lib
+ erase cord.lib
+ LIB cord.lib $(CORDOBJS), cord.lst
+
+cordtest.exe: cord\tests\cordtest.c include\cord.h include\cord_pos.h include\ec.h gc.lib cord.lib
+ $(CC) $(CFLAGS) /B"/STACK:65536" /Fecordtest cord\tests\cordtest.c gc.lib cord.lib
+
+clean:
+ erase gc.lib cord.lib
+ erase gctest.exe cordtest.exe
+ erase $(OBJS) $(CORDOBJS)
diff --git a/graphics/asymptote/gc/PCR-Makefile b/graphics/asymptote/gc/PCR-Makefile
new file mode 100644
index 0000000000..4af42ed4d5
--- /dev/null
+++ b/graphics/asymptote/gc/PCR-Makefile
@@ -0,0 +1,47 @@
+#
+# Default target
+#
+
+default: gc.o
+
+include ../config/common.mk
+
+#
+# compilation flags, etc.
+#
+
+CPPFLAGS = $(INCLUDE) $(CONFIG_CPPFLAGS) \
+ -DPCR_NO_RENAME -DPCR_NO_HOSTDEP_ERR
+#CFLAGS = -DPCR $(CONFIG_CFLAGS)
+CFLAGS = -DPCR -DENABLE_DISCLAIM $(CONFIG_CFLAGS)
+SPECIALCFLAGS = # For code involving asm's
+
+ASPPFLAGS = $(INCLUDE) $(CONFIG_ASPPFLAGS) \
+ -DPCR_NO_RENAME -DPCR_NO_HOSTDEP_ERR -DASM
+
+ASFLAGS = $(CONFIG_ASFLAGS)
+
+LDRFLAGS = $(CONFIG_LDRFLAGS)
+
+LDFLAGS = $(CONFIG_LDFLAGS)
+
+#
+# BEGIN PACKAGE-SPECIFIC PART
+#
+
+# Fix to point to local pcr installation directory.
+PCRDIR= ..
+
+COBJ= alloc.o reclaim.o allchblk.o misc.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o extra/pcr_interface.o extra/real_malloc.o dyn_load.o dbg_mlc.o fnlz_mlc.o malloc.o checksums.o typd_mlc.o ptr_chck.o mallocx.o
+
+CSRC= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c blacklst.c finalize.c new_hblk.c extra/pcr_interface.c extra/real_malloc.c dyn_load.c dbg_mlc.c fnlz_mlc.c malloc.c checksums.c typd_mlc.c ptr_chck.c mallocx.c
+
+SHELL= /bin/sh
+
+default: gc.o
+
+gc.o: $(COBJ) mach_dep.o
+ $(LDR) $(CONFIG_LDRFLAGS) -o gc.o $(COBJ) mach_dep.o
+
+mach_dep.o: mach_dep.c
+ $(CC) -c $(SPECIALCFLAGS) mach_dep.c
diff --git a/graphics/asymptote/gc/README.QUICK b/graphics/asymptote/gc/README.QUICK
new file mode 100644
index 0000000000..6e9a924901
--- /dev/null
+++ b/graphics/asymptote/gc/README.QUICK
@@ -0,0 +1,85 @@
+Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+Copyright (c) 1999-2001 by Hewlett-Packard. All rights reserved.
+Copyright (c) 2009-2021 Ivan Maidanski
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program
+for any purpose, provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is granted,
+provided the above notices are retained, and a notice that the code was
+modified is included with the above copyright notice.
+
+A few files have other copyright holders. A few of the files needed
+to use the GNU-style build procedure come with a modified GPL license
+that appears not to significantly restrict use of the collector, though
+use of those files for a purpose other than building the collector may
+require the resulting code to be covered by the GPL.
+
+For more details and the names of other contributors, see the README.md,
+doc/README.*, AUTHORS and include/gc.h files. These files describe typical
+use of the collector on a machine that is already supported.
+
+For the version number, see README.md or include/gc_version.h files.
+
+INSTALLATION:
+Under UN*X, Linux:
+Alternative 1 (the old way): type "make -f Makefile.direct check".
+ Link against gc.a.
+
+Alternative 2 (the new way): type
+ "./configure --prefix=<dir>; make; make check; make install".
+ Link against <dir>/lib/libgc.a or <dir>/lib/libgc.so.
+ See doc/README.autoconf for details
+
+Under Windows 95, 98, Me, NT, or 2000:
+copy the appropriate makefile to MAKEFILE, read it, and type "nmake check".
+(Under Windows, this assumes you have Microsoft command-line tools
+installed, and suitably configured.)
+Read the machine specific README.XXX in the doc directory if one exists.
+
+If you need thread support, you should define GC_THREADS as described in
+doc/README.macros (configure defines this implicitly unless --disable-threads
+option is given).
+
+If you wish to use the cord (structured string) library with the stand-alone
+Makefile.direct, type "make -f Makefile.direct cords". (You may need to
+override CC specified in the Makefile. The CORD_printf implementation in
+cordprnt.c is known to be less than perfectly portable. The rest of the
+package should still work.) See include/cord.h for the API.
+
+If you wish to use the collector from C++, type "make c++", or use
+--enable-cplusplus with the configure script. With Makefile.direct,
+"make c++" creates gccpp.a and gctba.a files (you should link with either
+gccpp.a or gctba.a). With the alternate (preferred) build process, this
+generates libgccpp.a and libgctba.a, and/or libgccpp.so and libgctba.so.
+See include/gc_cpp.h and doc/gcinterface.md.
+
+TYPICAL USE:
+Include "gc.h" from the include subdirectory. Link against the
+appropriate library ("gc.a" under UN*X). Replace calls to malloc
+by calls to GC_MALLOC, and calls to realloc by calls to GC_REALLOC.
+If the object is known to never contain pointers, use GC_MALLOC_ATOMIC
+instead of GC_MALLOC.
+
+Define GC_DEBUG before including gc.h for additional checking.
+
+More documentation on the collector interface can be found in README.md,
+doc/gcinterface.md, include/gc.h, and other files in the doc directory.
+
+WARNINGS:
+
+Do not store the only pointer to an object in memory allocated
+with system malloc, since the collector usually does not scan
+memory allocated in this way.
+
+Use with threads may be supported on your system, but requires the collector
+to be built with thread support. See Makefile.am or Makefile.direct.
+The collector does not guarantee to scan thread-local storage (e.g. of the
+kind accessed with pthread_getspecific()). The collector does scan
+thread stacks though, so generally the best solution is to ensure that
+any pointers stored in thread-local storage are also stored on the
+thread's stack for the duration of their lifetime.
diff --git a/graphics/asymptote/gc/README.md b/graphics/asymptote/gc/README.md
new file mode 100644
index 0000000000..794582fdd3
--- /dev/null
+++ b/graphics/asymptote/gc/README.md
@@ -0,0 +1,575 @@
+# Boehm-Demers-Weiser Garbage Collector
+
+This is version 8.2.8 of a conservative garbage
+collector for C and C++.
+
+
+## Download
+
+You might find a more recent/stable version on the
+[Download](https://github.com/ivmai/bdwgc/wiki/Download) page, or
+[BDWGC site](http://www.hboehm.info/gc/).
+
+Also, the latest bug fixes and new features are available in the
+[development repository](https://github.com/ivmai/bdwgc).
+
+
+## Overview
+
+This is intended to be a general purpose, garbage collecting storage
+allocator. The algorithms used are described in:
+
+ * Boehm, H., and M. Weiser, "Garbage Collection in an Uncooperative
+ Environment", Software Practice & Experience, September 1988, pp. 807-820.
+
+ * Boehm, H., A. Demers, and S. Shenker, "Mostly Parallel Garbage Collection",
+ Proceedings of the ACM SIGPLAN '91 Conference on Programming Language Design
+ and Implementation, SIGPLAN Notices 26, 6 (June 1991), pp. 157-164.
+
+ * Boehm, H., "Space Efficient Conservative Garbage Collection", Proceedings
+ of the ACM SIGPLAN '91 Conference on Programming Language Design and
+ Implementation, SIGPLAN Notices 28, 6 (June 1993), pp. 197-206.
+
+ * Boehm H., "Reducing Garbage Collector Cache Misses", Proceedings of the
+ 2000 International Symposium on Memory Management.
+
+Possible interactions between the collector and optimizing compilers are
+discussed in
+
+ * Boehm, H., and D. Chase, "A Proposal for GC-safe C Compilation",
+ The Journal of C Language Translation 4, 2 (December 1992).
+
+and
+
+ * Boehm H., "Simple GC-safe Compilation", Proceedings of the ACM SIGPLAN '96
+ Conference on Programming Language Design and Implementation.
+
+Unlike the collector described in the second reference, this collector
+operates either with the mutator stopped during the entire collection
+(default) or incrementally during allocations. (The latter is supported
+on fewer machines.) On the most common platforms, it can be built
+with or without thread support. On a few platforms, it can take advantage
+of a multiprocessor to speed up garbage collection.
+
+Many of the ideas underlying the collector have previously been explored
+by others. Notably, some of the run-time systems developed at Xerox PARC
+in the early 1980s conservatively scanned thread stacks to locate possible
+pointers (cf. Paul Rovner, "On Adding Garbage Collection and Runtime Types
+to a Strongly-Typed Statically Checked, Concurrent Language" Xerox PARC
+CSL 84-7). Doug McIlroy wrote a simpler fully conservative collector that
+was part of version 8 UNIX (tm), but appears to not have received
+widespread use.
+
+Rudimentary tools for use of the collector as a
+[leak detector](doc/leak.md) are included,
+as is a fairly sophisticated string package "cord" that makes use of the
+collector. (See doc/README.cords and H.-J. Boehm, R. Atkinson, and M. Plass,
+"Ropes: An Alternative to Strings", Software Practice and Experience 25, 12
+(December 1995), pp. 1315-1330. This is very similar to the "rope" package
+in Xerox Cedar, or the "rope" package in the SGI STL or the g++ distribution.)
+
+Further collector documentation can be found in the
+[overview](doc/overview.md).
+
+
+## General Description
+
+This is a garbage collecting storage allocator that is intended to be
+used as a plug-in replacement for C's malloc.
+
+Since the collector does not require pointers to be tagged, it does not
+attempt to ensure that all inaccessible storage is reclaimed. However,
+in our experience, it is typically more successful at reclaiming unused
+memory than most C programs using explicit deallocation. Unlike manually
+introduced leaks, the amount of unreclaimed memory typically stays
+bounded.
+
+In the following, an "object" is defined to be a region of memory allocated
+by the routines described below.
+
+Any objects not intended to be collected must be pointed to either
+from other such accessible objects, or from the registers,
+stack, data, or statically allocated bss segments. Pointers from
+the stack or registers may point to anywhere inside an object.
+The same is true for heap pointers if the collector is compiled with
+`ALL_INTERIOR_POINTERS` defined, or `GC_all_interior_pointers` is otherwise
+set, as is now the default.
+
+Compiling without `ALL_INTERIOR_POINTERS` may reduce accidental retention
+of garbage objects, by requiring pointers from the heap to the beginning
+of an object. But this no longer appears to be a significant
+issue for most programs occupying a small fraction of the possible
+address space.
+
+There are a number of routines which modify the pointer recognition
+algorithm. `GC_register_displacement` allows certain interior pointers
+to be recognized even if `ALL_INTERIOR_POINTERS` is not defined.
+`GC_malloc_ignore_off_page` allows some pointers into the middle of
+large objects to be disregarded, greatly reducing the probability of
+accidental retention of large objects. For most purposes it seems
+best to compile with `ALL_INTERIOR_POINTERS` and to use
+`GC_malloc_ignore_off_page` if you get collector warnings from
+allocations of very large objects. See [here](doc/debugging.md) for details.
+
+_WARNING_: pointers inside memory allocated by the standard `malloc` are not
+seen by the garbage collector. Thus objects pointed to only from such a
+region may be prematurely deallocated. It is thus suggested that the
+standard `malloc` be used only for memory regions, such as I/O buffers, that
+are guaranteed not to contain pointers to garbage collectible memory.
+Pointers in C language automatic, static, or register variables,
+are correctly recognized. (Note that `GC_malloc_uncollectable` has
+semantics similar to standard malloc, but allocates objects that are
+traced by the collector.)
+
+_WARNING_: the collector does not always know how to find pointers in data
+areas that are associated with dynamic libraries. This is easy to
+remedy IF you know how to find those data areas on your operating
+system (see `GC_add_roots`). Code for doing this under SunOS, IRIX
+5.X and 6.X, HP/UX, Alpha OSF/1, Linux, and win32 is included and used
+by default. (See doc/README.win32 for Win32 details.) On other systems
+pointers from dynamic library data areas may not be considered by the
+collector. If you're writing a program that depends on the collector
+scanning dynamic library data areas, it may be a good idea to include
+at least one call to `GC_is_visible` to ensure that those areas are
+visible to the collector.
+
+Note that the garbage collector does not need to be informed of shared
+read-only data. However, if the shared library mechanism can introduce
+discontiguous data areas that may contain pointers then the collector does
+need to be informed.
+
+Signal processing for most signals may be deferred during collection,
+and during uninterruptible parts of the allocation process.
+Like standard ANSI C mallocs, by default it is unsafe to invoke
+malloc (and other GC routines) from a signal handler while another
+malloc call may be in progress.
+
+The allocator/collector can also be configured for thread-safe operation.
+(Full signal safety can also be achieved, but only at the cost of two system
+calls per malloc, which is usually unacceptable.)
+
+_WARNING_: the collector does not guarantee to scan thread-local storage
+(e.g. of the kind accessed with `pthread_getspecific`). The collector
+does scan thread stacks, though, so generally the best solution is to
+ensure that any pointers stored in thread-local storage are also
+stored on the thread's stack for the duration of their lifetime.
+(This is arguably a longstanding bug, but it hasn't been fixed yet.)
+
+
+## Installation and Portability
+
+The collector operates silently in the default configuration.
+In the event of problems, this can usually be changed by defining the
+`GC_PRINT_STATS` or `GC_PRINT_VERBOSE_STATS` environment variables. This
+will result in a few lines of descriptive output for each collection.
+(The given statistics exhibit a few peculiarities.
+Things don't appear to add up for a variety of reasons, most notably
+fragmentation losses. These are probably much more significant for the
+contrived program "test.c" than for your application.)
+
+On most Unix-like platforms, the collector can be built either using a
+GNU autoconf-based build infrastructure (type `./configure; make` in the
+simplest case), or with a classic makefile by itself (type
+`make -f Makefile.direct`).
+
+Please note that the collector source repository does not contain configure
+and similar auto-generated files, thus the full procedure of autoconf-based
+build of `master` branch of the collector could look like:
+
+ git clone https://github.com/ivmai/bdwgc
+ cd bdwgc
+ git clone https://github.com/ivmai/libatomic_ops
+ ./autogen.sh
+ ./configure
+ make -j
+ make check
+
+Cloning of `libatomic_ops` is now optional provided the compiler supports
+atomic intrinsics.
+
+Below we focus on the collector build using classic makefile.
+For the Makefile.direct-based process, typing `make check` instead of `make`
+will automatically build the collector and then run `setjmp_test` and `gctest`.
+`Setjmp_test` will give you information about configuring the collector, which is
+useful primarily if you have a machine that's not already supported. Gctest is
+a somewhat superficial test of collector functionality. Failure is indicated
+by a core dump or a message to the effect that the collector is broken. Gctest
+takes about a second to two to run on reasonable 2007 vintage desktops. It may
+use up to about 30 MB of memory. (The multi-threaded version will use more.
+64-bit versions may use more.) `make check` will also, as its last step,
+attempt to build and test the "cord" string library.)
+
+Makefile.direct will generate a library gc.a which you should link against.
+Typing "make cords" will build the cord library (cord.a).
+
+The GNU style build process understands the usual targets. `make check`
+runs a number of tests. `make install` installs at least libgc, and libcord.
+Try `./configure --help` to see the configuration options. It is currently
+not possible to exercise all combinations of build options this way.
+
+All include files that need to be used by clients will be put in the
+include subdirectory. (Normally this is just gc.h. `make cords` adds
+"cord.h" and "ec.h".)
+
+The collector currently is designed to run essentially unmodified on
+machines that use a flat 32-bit or 64-bit address space.
+That includes the vast majority of Workstations and x86 (i386 or later) PCs.
+
+In a few cases (Amiga, OS/2, Win32, MacOS) a separate makefile
+or equivalent is supplied. Many of these have separate README.system
+files.
+
+Dynamic libraries are completely supported only under SunOS/Solaris,
+(and even that support is not functional on the last Sun 3 release),
+Linux, FreeBSD, NetBSD, IRIX 5&6, HP/UX, Win32 (not win32s) and OSF/1
+on DEC AXP machines plus perhaps a few others listed near the top
+of dyn_load.c. On other machines we recommend that you do one of
+the following:
+
+ 1. Add dynamic library support (and send us the code).
+ 2. Use static versions of the libraries.
+ 3. Arrange for dynamic libraries to use the standard malloc. This is still
+ dangerous if the library stores a pointer to a garbage collected object.
+ But nearly all standard interfaces prohibit this, because they deal
+ correctly with pointers to stack allocated objects. (`strtok` is an
+ exception. Don't use it.)
+
+In all cases we assume that pointer alignment is consistent with that
+enforced by the standard C compilers. If you use a nonstandard compiler
+you may have to adjust the alignment parameters defined in gc_priv.h.
+Note that this may also be an issue with packed records/structs, if those
+enforce less alignment for pointers.
+
+A port to a machine that is not byte addressed, or does not use 32 bit
+or 64 bit addresses will require a major effort. A port to plain MSDOS
+or win16 is hard.
+
+For machines not already mentioned, or for nonstandard compilers,
+some porting suggestions are provided [here](doc/porting.md).
+
+
+## The C Interface to the Allocator
+
+The following routines are intended to be directly called by the user.
+Note that usually only `GC_malloc` is necessary. `GC_clear_roots` and
+`GC_add_roots` calls may be required if the collector has to trace
+from nonstandard places (e.g. from dynamic library data areas on a
+machine on which the collector doesn't already understand them.) On
+some machines, it may be desirable to set `GC_stackbottom` to a good
+approximation of the stack base (bottom).
+
+Client code may include "gc.h", which defines all of the following, plus many
+others.
+
+ 1. `GC_malloc(bytes)` - Allocate an object of a given size. Unlike malloc,
+ the object is cleared before being returned to the user. `GC_malloc` will
+ invoke the garbage collector when it determines this to be appropriate.
+ GC_malloc may return 0 if it is unable to acquire sufficient space from the
+ operating system. This is the most probable consequence of running out
+ of space. Other possible consequences are that a function call will fail
+ due to lack of stack space, or that the collector will fail in other ways
+ because it cannot maintain its internal data structures, or that a crucial
+ system process will fail and take down the machine. Most of these
+ possibilities are independent of the malloc implementation.
+
+ 2. `GC_malloc_atomic(bytes)` - Allocate an object of a given size that
+ is guaranteed not to contain any pointers. The returned object is not
+ guaranteed to be cleared. (Can always be replaced by `GC_malloc`, but
+ results in faster collection times. The collector will probably run faster
+ if large character arrays, etc. are allocated with `GC_malloc_atomic` than
+ if they are statically allocated.)
+
+ 3. `GC_realloc(object, new_bytes)` - Change the size of object to be of
+ a given size. Returns a pointer to the new object, which may, or may not,
+ be the same as the pointer to the old object. The new object is taken to
+ be atomic if and only if the old one was. If the new object is composite
+ and larger than the original object then the newly added bytes are cleared.
+ This is very likely to allocate a new object.
+
+ 4. `GC_free(object)` - Explicitly deallocate an object returned by
+ `GC_malloc` or `GC_malloc_atomic`, or friends. Not necessary, but can be
+ used to minimize collections if performance is critical. Probably
+ a performance loss for very small objects (<= 8 bytes).
+
+ 5. `GC_expand_hp(bytes)` - Explicitly increase the heap size. (This is
+ normally done automatically if a garbage collection failed to reclaim
+ enough memory. Explicit calls to `GC_expand_hp` may prevent unnecessarily
+ frequent collections at program startup.)
+
+ 6. `GC_malloc_ignore_off_page(bytes)` - Identical to `GC_malloc`, but the
+ client promises to keep a pointer to the somewhere within the first GC
+ heap block (512 .. 4096 bytes or even more, depending on the configuration)
+ of the object while it is live. (This pointer should normally be
+ declared volatile to prevent interference from compiler optimizations.)
+ This is the recommended way to allocate anything that is likely to be
+ larger than 100 KB or so. (`GC_malloc` may result in a failure to reclaim
+ such objects.)
+
+ 7. `GC_set_warn_proc(proc)` - Can be used to redirect warnings from the
+ collector. Such warnings should be rare, and should not be ignored during
+ code development.
+
+ 8. `GC_enable_incremental()` - Enables generational and incremental
+ collection. Useful for large heaps on machines that provide access to page
+ dirty information. Some dirty bit implementations may interfere with
+ debugging (by catching address faults) and place restrictions on heap
+ arguments to system calls (since write faults inside a system call may not
+ be handled well).
+
+ 9. `GC_register_finalizer(object, proc, data, 0, 0)` and friends - Allow for
+ registration of finalization code. User supplied finalization code
+ (`(*proc)(object, data)`) is invoked after object becomes unreachable.
+ For more sophisticated uses, and for finalization ordering issues, see gc.h.
+
+The global variable `GC_free_space_divisor` may be adjusted up from it
+default value of 3 to use less space and more collection time, or down for
+the opposite effect. Setting it to 1 will almost disable collections
+and cause all allocations to simply grow the heap.
+
+The variable `GC_non_gc_bytes`, which is normally 0, may be changed to reflect
+the amount of memory allocated by the above routines that should not be
+considered as a candidate for collection. Careless use may, of course, result
+in excessive memory consumption.
+
+Some additional tuning is possible through the parameters defined
+near the top of gc_priv.h.
+
+If only `GC_malloc` is intended to be used, it might be appropriate to define:
+
+ #define malloc(n) GC_malloc(n)
+ #define calloc(m,n) GC_malloc((m)*(n))
+
+For small pieces of VERY allocation intensive code, gc_inline.h includes
+some allocation macros that may be used in place of `GC_malloc` and
+friends.
+
+All externally visible names in the garbage collector start with `GC_`.
+To avoid name conflicts, client code should avoid this prefix, except when
+accessing garbage collector routines.
+
+There are provisions for allocation with explicit type information.
+This is rarely necessary. Details can be found in gc_typed.h.
+
+
+## The C++ Interface to the Allocator
+
+The Ellis-Hull C++ interface to the collector is included in the collector
+distribution. If you intend to use this, type
+`./configure --enable-cplusplus; make` (or `make -f Makefile.direct c++`)
+after the initial build of the collector is complete. See gc_cpp.h for the
+definition of the interface. This interface tries to approximate the
+Ellis-Detlefs C++ garbage collection proposal without compiler changes.
+
+Very often it will also be necessary to use gc_allocator.h and the
+allocator declared there to construct STL data structures. Otherwise
+subobjects of STL data structures will be allocated using a system
+allocator, and objects they refer to may be prematurely collected.
+
+
+## Use as Leak Detector
+
+The collector may be used to track down leaks in C programs that are
+intended to run with malloc/free (e.g. code with extreme real-time or
+portability constraints). To do so define `FIND_LEAK` in Makefile.
+This will cause the collector to print a human-readable object description
+whenever an inaccessible object is found that has not been explicitly freed.
+Such objects will also be automatically reclaimed.
+
+If all objects are allocated with `GC_DEBUG_MALLOC` (see the next section)
+then, by default, the human-readable object description will at least contain
+the source file and the line number at which the leaked object was allocated.
+This may sometimes be sufficient. (On a few machines, it will also report
+a cryptic stack trace. If this is not symbolic, it can sometimes be called
+into a symbolic stack trace by invoking program "foo" with
+`tools/callprocs.sh foo`. It is a short shell script that invokes adb to
+expand program counter values to symbolic addresses. It was largely supplied
+by Scott Schwartz.)
+
+Note that the debugging facilities described in the next section can
+sometimes be slightly LESS effective in leak finding mode, since in the latter
+`GC_debug_free` actually results in reuse of the object. (Otherwise the
+object is simply marked invalid.) Also, note that most GC tests are not
+designed to run meaningfully in `FIND_LEAK` mode.
+
+
+## Debugging Facilities
+
+The routines `GC_debug_malloc`, `GC_debug_malloc_atomic`, `GC_debug_realloc`,
+and `GC_debug_free` provide an alternate interface to the collector, which
+provides some help with memory overwrite errors, and the like.
+Objects allocated in this way are annotated with additional
+information. Some of this information is checked during garbage
+collections, and detected inconsistencies are reported to stderr.
+
+Simple cases of writing past the end of an allocated object should
+be caught if the object is explicitly deallocated, or if the
+collector is invoked while the object is live. The first deallocation
+of an object will clear the debugging info associated with an
+object, so accidentally repeated calls to `GC_debug_free` will report the
+deallocation of an object without debugging information. Out of
+memory errors will be reported to stderr, in addition to returning `NULL`.
+
+`GC_debug_malloc` checking during garbage collection is enabled
+with the first call to this function. This will result in some
+slowdown during collections. If frequent heap checks are desired,
+this can be achieved by explicitly invoking `GC_gcollect`, e.g. from
+the debugger.
+
+`GC_debug_malloc` allocated objects should not be passed to `GC_realloc`
+or `GC_free`, and conversely. It is however acceptable to allocate only
+some objects with `GC_debug_malloc`, and to use `GC_malloc` for other objects,
+provided the two pools are kept distinct. In this case, there is a very
+low probability that `GC_malloc` allocated objects may be misidentified as
+having been overwritten. This should happen with probability at most
+one in 2**32. This probability is zero if `GC_debug_malloc` is never called.
+
+`GC_debug_malloc`, `GC_debug_malloc_atomic`, and `GC_debug_realloc` take two
+additional trailing arguments, a string and an integer. These are not
+interpreted by the allocator. They are stored in the object (the string is
+not copied). If an error involving the object is detected, they are printed.
+
+The macros `GC_MALLOC`, `GC_MALLOC_ATOMIC`, `GC_REALLOC`, `GC_FREE`,
+`GC_REGISTER_FINALIZER` and friends are also provided. These require the same
+arguments as the corresponding (nondebugging) routines. If gc.h is included
+with `GC_DEBUG` defined, they call the debugging versions of these
+functions, passing the current file name and line number as the two
+extra arguments, where appropriate. If gc.h is included without `GC_DEBUG`
+defined then all these macros will instead be defined to their nondebugging
+equivalents. (`GC_REGISTER_FINALIZER` is necessary, since pointers to
+objects with debugging information are really pointers to a displacement
+of 16 bytes from the object beginning, and some translation is necessary
+when finalization routines are invoked. For details, about what's stored
+in the header, see the definition of the type oh in dbg_mlc.c file.)
+
+
+## Incremental/Generational Collection
+
+The collector normally interrupts client code for the duration of
+a garbage collection mark phase. This may be unacceptable if interactive
+response is needed for programs with large heaps. The collector
+can also run in a "generational" mode, in which it usually attempts to
+collect only objects allocated since the last garbage collection.
+Furthermore, in this mode, garbage collections run mostly incrementally,
+with a small amount of work performed in response to each of a large number of
+`GC_malloc` requests.
+
+This mode is enabled by a call to `GC_enable_incremental`.
+
+Incremental and generational collection is effective in reducing
+pause times only if the collector has some way to tell which objects
+or pages have been recently modified. The collector uses two sources
+of information:
+
+ 1. Information provided by the VM system. This may be provided in one of
+ several forms. Under Solaris 2.X (and potentially under other similar
+ systems) information on dirty pages can be read from the /proc file system.
+ Under other systems (e.g. SunOS4.X) it is possible to write-protect
+ the heap, and catch the resulting faults. On these systems we require that
+ system calls writing to the heap (other than read) be handled specially by
+ client code. See `os_dep.c` for details.
+
+ 2. Information supplied by the programmer. The object is considered dirty
+ after a call to `GC_end_stubborn_change` provided the library has been
+ compiled suitably. It is typically not worth using for short-lived objects.
+ Note that bugs caused by a missing `GC_end_stubborn_change` or
+ `GC_reachable_here` call are likely to be observed very infrequently and
+ hard to trace.
+
+
+## Bugs
+
+Any memory that does not have a recognizable pointer to it will be
+reclaimed. Exclusive-or'ing forward and backward links in a list
+doesn't cut it.
+
+Some C optimizers may lose the last undisguised pointer to a memory
+object as a consequence of clever optimizations. This has almost
+never been observed in practice.
+
+This is not a real-time collector. In the standard configuration,
+percentage of time required for collection should be constant across
+heap sizes. But collection pauses will increase for larger heaps.
+They will decrease with the number of processors if parallel marking
+is enabled.
+
+(On 2007 vintage machines, GC times may be on the order of 5 ms
+per MB of accessible memory that needs to be scanned and processed.
+Your mileage may vary.) The incremental/generational collection facility
+may help in some cases.
+
+
+## Feedback, Contribution, Questions and Notifications
+
+Please address bug reports and new feature ideas to
+[GitHub issues](https://github.com/ivmai/bdwgc/issues). Before the
+submission please check that it has not been done yet by someone else.
+
+If you want to contribute, submit
+a [pull request](https://github.com/ivmai/bdwgc/pulls) to GitHub.
+
+If you need help, use
+[Stack Overflow](https://stackoverflow.com/questions/tagged/boehm-gc).
+Older technical discussions are available in `bdwgc` mailing list archive - it
+can be downloaded as a
+[compressed file](https://github.com/ivmai/bdwgc/files/1038163/bdwgc-mailing-list-archive-2017_04.tar.gz)
+or browsed at [Narkive](http://bdwgc.opendylan.narkive.com).
+
+To get new release announcements, subscribe to
+[RSS feed](https://github.com/ivmai/bdwgc/releases.atom).
+(To receive the notifications by email, a 3rd-party free service like
+[IFTTT RSS Feed](https://ifttt.com/feed) can be setup.)
+To be notified on all issues, please
+[watch](https://github.com/ivmai/bdwgc/watchers) the project on
+GitHub.
+
+
+## Copyright & Warranty
+
+ * Copyright (c) 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1996 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2011 by Hewlett-Packard Development Company.
+ * Copyright (c) 2008-2021 Ivan Maidanski
+
+The files pthread_stop_world.c, pthread_support.c and some others are also
+
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+
+The file include/gc.h is also
+
+ * Copyright (c) 2007 Free Software Foundation, Inc
+
+The files Makefile.am and configure.ac are
+
+ * Copyright (c) 2001 by Red Hat Inc. All rights reserved.
+
+The files extra/msvc_dbg.c and include/private/msvc_dbg.h are
+
+ * Copyright (c) 2004-2005 Andrei Polushin
+
+The file tests/initsecondarythread.c is
+
+ * Copyright (c) 2011 Ludovic Courtes
+
+The file tests/disclaim_weakmap_test.c is
+
+ * Copyright (c) 2018 Petter A. Urkedal
+
+Several files supporting GNU-style builds are copyrighted by the Free
+Software Foundation, and carry a different license from that given
+below.
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program
+for any purpose, provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is granted,
+provided the above notices are retained, and a notice that the code was
+modified is included with the above copyright notice.
+
+A few of the files needed to use the GNU-style build procedure come with
+slightly different licenses, though they are all similar in spirit. A few
+are GPL'ed, but with an exception that should cover all uses in the
+collector. (If you are concerned about such things, I recommend you look
+at the notice in config.guess or ltmain.sh.)
diff --git a/graphics/asymptote/gc/SMakefile.amiga b/graphics/asymptote/gc/SMakefile.amiga
new file mode 100644
index 0000000000..d481f9863f
--- /dev/null
+++ b/graphics/asymptote/gc/SMakefile.amiga
@@ -0,0 +1,172 @@
+
+# Rewritten smakefile for amiga / sas/c. -Kjetil M.
+# Don't use the cord-package if you define parm=both or parm=reg.
+
+
+#----------------TOOLS--------------------------------
+CC=sc
+LINKER=slink
+LIBER=oml
+
+#----------------CPU OPTIONS--------------------------
+
+CPU=68060
+
+#----------------FPU OPTIONS--------------------------
+
+MATH=8
+MATHLIB=LIB:scm881.lib
+
+#----------------COMPILER OPTIONS---------------------
+
+IGNORE= IGNORE=85 IGNORE=154 IGNORE=161 IGNORE=100
+
+OPTIMIZE=optimize optimizetime optglobal optimizerdepth=100 optimizerpeephole optloop OPTSCHED optimizerinlocal optimizerrecurdepth=100
+# optimizerinline optimizercomplexity=100
+
+OPT= $(OPTIMIZE) CPU=$(CPU) math=$(MATH) NOSTACKCHECK VERBOSE \
+MAPHUNK NOVERSION NOICONS nodebug \
+parm=reg \
+DEFINE __USE_SYSBASE
+
+
+SOPT= $(OPT) $(IGNORE) \
+DEFINE AMIGA_SKIP_SEG \
+DEFINE GC_ATOMIC_UNCOLLECTABLE \
+DEFINE GC_AMIGA_FASTALLOC \
+DEFINE GC_AMIGA_RETRY \
+DEFINE GC_AMIGA_PRINTSTATS \
+DEFINE GC_AMIGA_GC
+
+
+#DEFINE ALL_INTERIOR_POINTERS \
+
+
+SCOPT= $(SOPT) define GC_AMIGA_MAKINGLIB
+
+CSCOPT= $(OPT) DEFINE AMIGA IGNORE=100 IGNORE=161
+
+#------------------LINKING----------------------------
+
+
+all: gc.lib cord.lib
+
+clean:
+ delete *.lib gctest setjmp_t *.o *.lnk cord/*.o cord/tests/*.o cordtest
+ smake
+
+check: setjmp_t gctest cordtest
+ setjmp_t
+ gctest
+ cordtest
+
+gctest: gc.lib GCAmigaOS$(CPU).lib test.o
+ $(LINKER) LIB:c.o test.o TO gctest LIB gc.lib LIB:sc.lib $(MATHLIB)
+
+setjmp_t: setjmp_t.o gc.h
+ $(LINKER) LIB:c.o setjmp_t.o to setjmp_t lib LIB:sc.lib
+
+cordtest: cord/tests/cordtest.o cord.lib gc.lib
+ $(LINKER) LIB:c.o cord/tests/cordtest.o LIB $(MATHLIB) gc.lib cord.lib LIB:sc.lib TO cordtest
+
+
+#------------------LIBBING----------------------------
+
+OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dyn_load.o dbg_mlc.o malloc.o checksums.o typd_mlc.o ptr_chck.o mallocx.o fnlz_mlc.o
+
+gc.lib: $(OBJS)
+ $(LIBER) gc.lib r $(OBJS)
+
+
+COBJS = cord/cordbscs.o cord/cordprnt.o cord/cordxtra.o
+
+cord.lib: $(COBJS)
+ $(LIBER) cord.lib r $(COBJS)
+
+#------------------COMPILING--------------------------
+
+INC= gc_private.h gc_hdrs.h gc.h gcconfig.h
+
+alloc.o : alloc.c $(INC)
+ $(CC) alloc.c $(SCOPT) ignore=7
+
+reclaim.o : reclaim.c $(INC)
+ $(CC) reclaim.c $(SCOPT)
+
+allchblk.o : allchblk.c $(INC)
+ $(CC) allchblk.c $(SCOPT)
+
+misc.o : misc.c $(INC)
+ $(CC) misc.c $(SCOPT)
+
+os_dep.o : os_dep.c $(INC) extra/AmigaOS.c
+ $(CC) os_dep.c $(SCOPT)
+
+mark_rts.o : mark_rts.c $(INC)
+ $(CC) mark_rts.c $(SCOPT)
+
+headers.o : headers.c $(INC)
+ $(CC) headers.c $(SCOPT)
+
+mark.o : mark.c $(INC)
+ $(CC) mark.c $(SCOPT)
+
+obj_map.o : obj_map.c $(INC)
+ $(CC) obj_map.c $(SCOPT)
+
+blacklst.o : blacklst.c $(INC)
+ $(CC) blacklst.c $(SCOPT)
+
+finalize.o : finalize.c $(INC)
+ $(CC) finalize.c $(SCOPT) noopt
+# Could sas/c still have problems with this one? Gctest sometimes fails to finalize all.
+
+new_hblk.o : new_hblk.c $(INC)
+ $(CC) new_hblk.c $(SCOPT)
+
+dyn_load.o : dyn_load.c $(INC)
+ $(CC) dyn_load.c $(SCOPT)
+
+dbg_mlc.o : dbg_mlc.c $(INC)
+ $(CC) dbg_mlc.c $(SCOPT)
+
+fnlz_mlc.o : fnlz_mlc.c $(INC)
+ $(CC) fnlz_mlc.c $(SCOPT)
+
+malloc.o : malloc.c $(INC)
+ $(CC) malloc.c $(SCOPT)
+
+mallocx.o : mallocx.c $(INC)
+ $(CC) mallocx.c $(SCOPT)
+
+checksums.o : checksums.c $(INC)
+ $(CC) checksums.c $(SCOPT)
+
+typd_mlc.o: typd_mlc.c $(INC)
+ $(CC) typd_mlc.c $(SCOPT)
+
+mach_dep.o : mach_dep.c $(INC)
+ $(CC) mach_dep.c $(SCOPT)
+
+ptr_chck.o: ptr_chck.c $(INC)
+ $(CC) ptr_chck.c $(SCOPT)
+
+test.o : test.c $(INC)
+ $(CC) test.c $(SOPT)
+
+setjmp_t: tools/setjmp_t.c gc.h
+ $(CC) tools/setjmp_t.c $(SOPT)
+
+# cords:
+
+cord/cordbscs.o: cord/cordbscs.c
+ $(CC) cord/cordbscs.c $(CSCOPT)
+
+cord/cordprnt.o: cord/cordprnt.c
+ $(CC) cord/cordprnt.c $(CSCOPT)
+
+cord/cordxtra.o: cord/cordxtra.c
+ $(CC) cord/cordxtra.c $(CSCOPT)
+
+cord/tests/cordtest.o: cord/tests/cordtest.c
+ $(CC) cord/tests/cordtest.c $(CSCOPT)
diff --git a/graphics/asymptote/gc/WCC_MAKEFILE b/graphics/asymptote/gc/WCC_MAKEFILE
new file mode 100644
index 0000000000..1e53da98d2
--- /dev/null
+++ b/graphics/asymptote/gc/WCC_MAKEFILE
@@ -0,0 +1,286 @@
+# Makefile for Watcom C/C++ 10.5, 10.6, 11.0 on NT, OS2 and DOS4GW.
+# May work with Watcom 10.0.
+
+# Uncomment one of the lines below for cross compilation.
+SYSTEM=MSWIN32
+#SYSTEM=DOS4GW
+#SYSTEM=OS2
+
+# The collector can be built either as dynamic (the default) or as static
+# library. The latter is selected by setting ENABLE_STATIC variable.
+#ENABLE_STATIC=1
+
+# Select calling conventions.
+# Possible choices are r and s.
+CALLING=s
+
+# Select target CPU.
+# Possible choices are 3, 4, 5, and 6.
+# The last choice available only since version 11.0.
+CPU=5
+
+# Set optimization options.
+# Watcom before 11.0 does not support option "-oh".
+OPTIM=-oneatx -s
+#OPTIM=-ohneatx -s
+
+DEFS=-DALL_INTERIOR_POINTERS -DENABLE_DISCLAIM -DGC_ATOMIC_UNCOLLECTABLE -DGC_GCJ_SUPPORT -DJAVA_FINALIZATION -DNO_EXECUTE_PERMISSION #-DSMALL_CONFIG
+
+
+#####
+
+!ifndef SYSTEM
+!ifdef __MSDOS__
+SYSTEM=DOS4GW
+!else ifdef __NT__
+SYSTEM=MSWIN32
+!else ifdef __OS2__
+SYSTEM=OS2
+!else
+SYSTEM=Unknown
+!endif
+!endif
+
+!define $(SYSTEM)
+
+!ifdef DOS4GW
+SYSFLAG=-DDOS4GW -bt=dos
+!else ifdef MSWIN32
+SYSFLAG=-DMSWIN32 -bt=nt
+DEFS=$(DEFS) -DUSE_MUNMAP
+!else ifdef OS2
+SYSFLAG=-DOS2 -bt=os2
+!else
+!error undefined or unsupported target platform: $(SYSTEM)
+!endif
+
+!ifdef ENABLE_STATIC
+DLLFLAG=
+TEST_DLLFLAG=-DGC_NOT_DLL
+CORDFLAG=
+!else
+DLLFLAG=-bd -DGC_DLL
+TEST_DLLFLAG=-DGC_DLL
+# cord.dll and its clients should not link C library statically otherwise
+# FILE-related functions might not work (because own set of opened FILEs
+# is maintained by each copy of the C library thus making impossible to pass
+# FILE pointer from, e.g., .exe code to .dll one).
+CORDFLAG=-br
+!endif
+
+CC=wcc386
+CXX=wpp386
+
+CFLAGS=-$(CPU)$(CALLING) $(OPTIM) -iinclude -zp4 -zc $(SYSFLAG) $(DLLFLAG) $(DEFS)
+CXXFLAGS= $(CFLAGS) -xs
+TEST_CFLAGS=-$(CPU)$(CALLING) $(OPTIM) -iinclude -zp4 -zc $(SYSFLAG) $(TEST_DLLFLAG) $(DEFS)
+TEST_CXXFLAGS= $(TEST_CFLAGS) -xs
+
+COBJS= cordbscs.obj cordxtra.obj cordprnt.obj
+
+all: gc.lib gccpp.lib gctba.lib cord.lib
+
+check: gctest.exe test_cpp.exe cordtest.exe .SYMBOLIC
+ *gctest.exe
+ *test_cpp.exe
+ *cordtest.exe
+
+!ifdef ENABLE_STATIC
+
+OBJS= alloc.obj reclaim.obj allchblk.obj backgraph.obj checksums.obj &
+ misc.obj mach_dep.obj os_dep.obj mark_rts.obj headers.obj mark.obj &
+ obj_map.obj blacklst.obj finalize.obj new_hblk.obj &
+ dbg_mlc.obj malloc.obj dyn_load.obj &
+ typd_mlc.obj ptr_chck.obj mallocx.obj fnlz_mlc.obj gcj_mlc.obj
+
+gc.lib: $(OBJS)
+ @%create $*.lb1
+ @for %i in ($(OBJS)) do @%append $*.lb1 +%i
+ *wlib -b -c -n -p=512 $@ @$*.lb1
+
+cord.lib: $(COBJS)
+ @%create $*.lb1
+ @for %i in ($(COBJS)) do @%append $*.lb1 +%i
+ *wlib -b -c -n -p=512 $@ @$*.lb1
+
+gccpp.lib: gc_badalc.obj gc_cpp.obj
+ @%create $*.lb1
+ @%append $*.lb1 +gc_badalc.obj
+ @%append $*.lb1 +gc_cpp.obj
+ *wlib -b -c -n -p=512 $@ @$*.lb1
+
+# The same as gccpp.lib but contains only gc_badalc.obj.
+gctba.lib: gc_badalc.obj
+ @%create $*.lb1
+ @%append $*.lb1 +gc_badalc.obj
+ *wlib -b -c -n -p=512 $@ @$*.lb1
+
+!else
+
+gc.obj: extra\gc.c .AUTODEPEND
+ $(CC) $(CFLAGS) extra\gc.c
+
+gc.lib: gc.dll
+ *wlib -b -c -n -p=512 $@ +gc.dll
+
+gc.dll: gc.obj .AUTODEPEND
+ @%create $*.lnk
+!ifdef DOS4GW
+ @%append $*.lnk sys os2v2_dll
+!else ifdef MSWIN32
+ @%append $*.lnk sys nt_dll
+!else ifdef OS2
+ @%append $*.lnk sys os2v2_dll
+!endif
+ @%append $*.lnk op case
+ @%append $*.lnk name $*
+ @%append $*.lnk file gc.obj
+ *wlink @$*.lnk
+
+cord.lib: cord.dll
+ *wlib -b -c -n -p=512 $@ +cord.dll
+
+cord.dll: $(COBJS) gc.lib .AUTODEPEND
+ @%create $*.lnk
+!ifdef DOS4GW
+ @%append $*.lnk sys os2v2_dll
+!else ifdef MSWIN32
+ @%append $*.lnk sys nt_dll
+!else ifdef OS2
+ @%append $*.lnk sys os2v2_dll
+!endif
+ @%append $*.lnk op case
+ @%append $*.lnk name $*
+ @for %i in ($(COBJS)) do @%append $*.lnk file %i
+ @%append $*.lnk library gc.lib
+ *wlink @$*.lnk
+
+gccpp.lib: gccpp.dll
+ *wlib -b -c -n -p=512 $@ +gccpp.dll
+
+gccpp.dll: gc_badalc.obj gc_cpp.obj gc.lib .AUTODEPEND
+ @%create $*.lnk
+!ifdef DOS4GW
+ @%append $*.lnk sys os2v2_dll
+!else ifdef MSWIN32
+ @%append $*.lnk sys nt_dll
+!else ifdef OS2
+ @%append $*.lnk sys os2v2_dll
+!endif
+ @%append $*.lnk op case
+ @%append $*.lnk name $*
+ @%append $*.lnk file gc_badalc.obj
+ @%append $*.lnk file gc_cpp.obj
+ @%append $*.lnk library gc.lib
+ @%append $*.lnk library wr7$(CALLING)dll.lib
+ *wlink @$*.lnk
+
+gctba.lib: gctba.dll
+ *wlib -b -c -n -p=512 $@ +gctba.dll
+
+gctba.dll: gc_badalc.obj gc.lib .AUTODEPEND
+ @%create $*.lnk
+!ifdef DOS4GW
+ @%append $*.lnk sys os2v2_dll
+!else ifdef MSWIN32
+ @%append $*.lnk sys nt_dll
+!else ifdef OS2
+ @%append $*.lnk sys os2v2_dll
+!endif
+ @%append $*.lnk op case
+ @%append $*.lnk name $*
+ @%append $*.lnk file gc_badalc.obj
+ @%append $*.lnk library gc.lib
+ @%append $*.lnk library wr7$(CALLING)dll.lib
+ *wlink @$*.lnk
+
+!endif
+
+gctest.exe: test.obj gc.lib
+ %create $*.lnk
+!ifdef DOS4GW
+ @%append $*.lnk sys dos4g
+!else ifdef MSWIN32
+ @%append $*.lnk sys nt
+!else ifdef OS2
+ @%append $*.lnk sys os2v2
+!endif
+ @%append $*.lnk op case
+ @%append $*.lnk op stack=256K
+ @%append $*.lnk name $*
+ @%append $*.lnk file test.obj
+ @%append $*.lnk library gc.lib
+ *wlink @$*.lnk
+
+cordtest.exe: cordtest.obj gc.lib cord.lib
+ %create $*.lnk
+!ifdef DOS4GW
+ @%append $*.lnk sys dos4g
+!else ifdef MSWIN32
+ @%append $*.lnk sys nt
+!else ifdef OS2
+ @%append $*.lnk sys os2v2
+!endif
+ @%append $*.lnk op case
+ @%append $*.lnk op stack=256K
+ @%append $*.lnk name $*
+ @%append $*.lnk file cordtest.obj
+ @%append $*.lnk library gc.lib
+ @%append $*.lnk library cord.lib
+ *wlink @$*.lnk
+
+test_cpp.exe: test_cpp.obj gc.lib gccpp.lib
+ %create $*.lnk
+!ifdef DOS4GW
+ @%append $*.lnk sys dos4g
+!else ifdef MSWIN32
+ @%append $*.lnk sys nt
+!else ifdef OS2
+ @%append $*.lnk sys os2v2
+!endif
+ @%append $*.lnk op case
+ @%append $*.lnk op stack=256K
+ @%append $*.lnk name $*
+ @%append $*.lnk file test_cpp.obj
+ @%append $*.lnk library gc.lib
+ @%append $*.lnk library gccpp.lib
+ *wlink @$*.lnk
+
+cordbscs.obj: cord\cordbscs.c .AUTODEPEND
+ $(CC) $(CFLAGS) $(CORDFLAG) cord\cordbscs.c
+cordxtra.obj: cord\cordxtra.c .AUTODEPEND
+ $(CC) $(CFLAGS) $(CORDFLAG) cord\cordxtra.c
+cordprnt.obj: cord\cordprnt.c .AUTODEPEND
+ $(CC) $(CFLAGS) $(CORDFLAG) cord\cordprnt.c
+
+gc_badalc.obj: gc_badalc.cc .AUTODEPEND
+ $(CXX) $(TEST_CXXFLAGS) $*.cc
+gc_cpp.obj: gc_cpp.cc .AUTODEPEND
+ $(CXX) $(TEST_CXXFLAGS) $*.cc
+
+test.obj: tests\test.c .AUTODEPEND
+ $(CC) $(TEST_CFLAGS) /wcd=201 tests\test.c
+cordtest.obj: cord\tests\cordtest.c .AUTODEPEND
+ $(CC) $(TEST_CFLAGS) $(CORDFLAG) cord\tests\cordtest.c
+test_cpp.obj: tests\test_cpp.cc .AUTODEPEND
+ $(CXX) $(TEST_CXXFLAGS) tests\test_cpp.cc
+
+.c.obj: .AUTODEPEND
+ $(CC) $(CFLAGS) $*.c
+
+.cc.obj: .AUTODEPEND
+ $(CXX) $(CXXFLAGS) $*.cc
+
+clean: .SYMBOLIC
+ @if exist *.obj del *.obj
+ @if exist *.map del *.map
+ @if exist *.lnk del *.lnk
+ @if exist *.lb1 del *.lb1
+ @if exist *.sym del *.sym
+ @if exist *.err del *.err
+ @if exist *.tmp del *.tmp
+ @if exist *.lst del *.lst
+ @if exist *.exe del *.exe
+ @if exist *.log del *.log
+ @if exist *.lib del *.lib
+ @if exist *.dll del *.dll
diff --git a/graphics/asymptote/gc/aclocal.m4 b/graphics/asymptote/gc/aclocal.m4
new file mode 100644
index 0000000000..4bbd9e5ad0
--- /dev/null
+++ b/graphics/asymptote/gc/aclocal.m4
@@ -0,0 +1,1212 @@
+# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],,
+[m4_warning([this file was generated for autoconf 2.71.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.16.5], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.5])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# Figure out how to run the assembler. -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_AS
+# ----------
+AC_DEFUN([AM_PROG_AS],
+[# By default we simply use the C compiler to build assembly code.
+AC_REQUIRE([AC_PROG_CC])
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)])
+AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)])
+_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
+])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+m4_ifdef([_$0_ALREADY_INIT],
+ [m4_fatal([$0 expanded multiple times
+]m4_defn([_$0_ALREADY_INIT]))],
+ [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+AC_SUBST([CTAGS])
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+AC_SUBST([ETAGS])
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+AC_SUBST([CSCOPE])
+
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well. Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+ [enable], [m4_define([am_maintainer_other], [disable])],
+ [disable], [m4_define([am_maintainer_other], [enable])],
+ [m4_define([am_maintainer_other], [enable])
+ m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+ AC_ARG_ENABLE([maintainer-mode],
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST([MAINT])dnl
+]
+)
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/gc_set_version.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
diff --git a/graphics/asymptote/gc/allchblk.c b/graphics/asymptote/gc/allchblk.c
new file mode 100644
index 0000000000..6d31968b2e
--- /dev/null
+++ b/graphics/asymptote/gc/allchblk.c
@@ -0,0 +1,993 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1998-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+#include <stdio.h>
+
+#ifdef GC_USE_ENTIRE_HEAP
+ int GC_use_entire_heap = TRUE;
+#else
+ int GC_use_entire_heap = FALSE;
+#endif
+
+/*
+ * Free heap blocks are kept on one of several free lists,
+ * depending on the size of the block. Each free list is doubly linked.
+ * Adjacent free blocks are coalesced.
+ */
+
+
+# define MAX_BLACK_LIST_ALLOC (2*HBLKSIZE)
+ /* largest block we will allocate starting on a black */
+ /* listed block. Must be >= HBLKSIZE. */
+
+
+# define UNIQUE_THRESHOLD 32
+ /* Sizes up to this many HBLKs each have their own free list */
+# define HUGE_THRESHOLD 256
+ /* Sizes of at least this many heap blocks are mapped to a */
+ /* single free list. */
+# define FL_COMPRESSION 8
+ /* In between sizes map this many distinct sizes to a single */
+ /* bin. */
+
+# define N_HBLK_FLS ((HUGE_THRESHOLD - UNIQUE_THRESHOLD) / FL_COMPRESSION \
+ + UNIQUE_THRESHOLD)
+
+#ifndef GC_GCJ_SUPPORT
+ STATIC
+#endif
+ struct hblk * GC_hblkfreelist[N_HBLK_FLS+1] = { 0 };
+ /* List of completely empty heap blocks */
+ /* Linked through hb_next field of */
+ /* header structure associated with */
+ /* block. Remains externally visible */
+ /* as used by GNU GCJ currently. */
+
+#ifndef GC_GCJ_SUPPORT
+ STATIC
+#endif
+ word GC_free_bytes[N_HBLK_FLS+1] = { 0 };
+ /* Number of free bytes on each list. Remains visible to GCJ. */
+
+/* Return the largest n such that the number of free bytes on lists */
+/* n .. N_HBLK_FLS is greater or equal to GC_max_large_allocd_bytes */
+/* minus GC_large_allocd_bytes. If there is no such n, return 0. */
+GC_INLINE int GC_enough_large_bytes_left(void)
+{
+ int n;
+ word bytes = GC_large_allocd_bytes;
+
+ GC_ASSERT(GC_max_large_allocd_bytes <= GC_heapsize);
+ for (n = N_HBLK_FLS; n >= 0; --n) {
+ bytes += GC_free_bytes[n];
+ if (bytes >= GC_max_large_allocd_bytes) return n;
+ }
+ return 0;
+}
+
+/* Map a number of blocks to the appropriate large block free list index. */
+STATIC int GC_hblk_fl_from_blocks(word blocks_needed)
+{
+ if (blocks_needed <= UNIQUE_THRESHOLD) return (int)blocks_needed;
+ if (blocks_needed >= HUGE_THRESHOLD) return N_HBLK_FLS;
+ return (int)(blocks_needed - UNIQUE_THRESHOLD)/FL_COMPRESSION
+ + UNIQUE_THRESHOLD;
+
+}
+
+# define PHDR(hhdr) HDR((hhdr) -> hb_prev)
+# define NHDR(hhdr) HDR((hhdr) -> hb_next)
+
+# ifdef USE_MUNMAP
+# define IS_MAPPED(hhdr) (((hhdr) -> hb_flags & WAS_UNMAPPED) == 0)
+# else
+# define IS_MAPPED(hhdr) TRUE
+# endif /* !USE_MUNMAP */
+
+#if !defined(NO_DEBUGGING) || defined(GC_ASSERTIONS)
+ /* Should return the same value as GC_large_free_bytes. */
+ GC_INNER word GC_compute_large_free_bytes(void)
+ {
+ word total_free = 0;
+ unsigned i;
+
+ for (i = 0; i <= N_HBLK_FLS; ++i) {
+ struct hblk * h;
+ hdr * hhdr;
+
+ for (h = GC_hblkfreelist[i]; h != 0; h = hhdr->hb_next) {
+ hhdr = HDR(h);
+ total_free += hhdr->hb_sz;
+ }
+ }
+ return total_free;
+ }
+#endif /* !NO_DEBUGGING || GC_ASSERTIONS */
+
+# if !defined(NO_DEBUGGING)
+void GC_print_hblkfreelist(void)
+{
+ unsigned i;
+ word total;
+
+ for (i = 0; i <= N_HBLK_FLS; ++i) {
+ struct hblk * h = GC_hblkfreelist[i];
+
+ if (0 != h) GC_printf("Free list %u (total size %lu):\n",
+ i, (unsigned long)GC_free_bytes[i]);
+ while (h /* != NULL */) { /* CPPCHECK */
+ hdr * hhdr = HDR(h);
+
+ GC_printf("\t%p size %lu %s black listed\n",
+ (void *)h, (unsigned long) hhdr -> hb_sz,
+ GC_is_black_listed(h, HBLKSIZE) != 0 ? "start" :
+ GC_is_black_listed(h, hhdr -> hb_sz) != 0 ? "partially" :
+ "not");
+ h = hhdr -> hb_next;
+ }
+ }
+ GC_printf("GC_large_free_bytes: %lu\n",
+ (unsigned long)GC_large_free_bytes);
+
+ if ((total = GC_compute_large_free_bytes()) != GC_large_free_bytes)
+ GC_err_printf("GC_large_free_bytes INCONSISTENT!! Should be: %lu\n",
+ (unsigned long)total);
+}
+
+/* Return the free list index on which the block described by the header */
+/* appears, or -1 if it appears nowhere. */
+static int free_list_index_of(hdr *wanted)
+{
+ int i;
+
+ for (i = 0; i <= N_HBLK_FLS; ++i) {
+ struct hblk * h;
+ hdr * hhdr;
+
+ for (h = GC_hblkfreelist[i]; h != 0; h = hhdr -> hb_next) {
+ hhdr = HDR(h);
+ if (hhdr == wanted) return i;
+ }
+ }
+ return -1;
+}
+
+GC_API void GC_CALL GC_dump_regions(void)
+{
+ unsigned i;
+
+ for (i = 0; i < GC_n_heap_sects; ++i) {
+ ptr_t start = GC_heap_sects[i].hs_start;
+ size_t bytes = GC_heap_sects[i].hs_bytes;
+ ptr_t end = start + bytes;
+ ptr_t p;
+
+ /* Merge in contiguous sections. */
+ while (i+1 < GC_n_heap_sects && GC_heap_sects[i+1].hs_start == end) {
+ ++i;
+ end = GC_heap_sects[i].hs_start + GC_heap_sects[i].hs_bytes;
+ }
+ GC_printf("***Section from %p to %p\n", (void *)start, (void *)end);
+ for (p = start; (word)p < (word)end; ) {
+ hdr *hhdr = HDR(p);
+
+ if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ GC_printf("\t%p Missing header!!(%p)\n",
+ (void *)p, (void *)hhdr);
+ p += HBLKSIZE;
+ continue;
+ }
+ if (HBLK_IS_FREE(hhdr)) {
+ int correct_index = GC_hblk_fl_from_blocks(
+ divHBLKSZ(hhdr -> hb_sz));
+ int actual_index;
+
+ GC_printf("\t%p\tfree block of size 0x%lx bytes%s\n",
+ (void *)p, (unsigned long)(hhdr -> hb_sz),
+ IS_MAPPED(hhdr) ? "" : " (unmapped)");
+ actual_index = free_list_index_of(hhdr);
+ if (-1 == actual_index) {
+ GC_printf("\t\tBlock not on free list %d!!\n",
+ correct_index);
+ } else if (correct_index != actual_index) {
+ GC_printf("\t\tBlock on list %d, should be on %d!!\n",
+ actual_index, correct_index);
+ }
+ p += hhdr -> hb_sz;
+ } else {
+ GC_printf("\t%p\tused for blocks of size 0x%lx bytes\n",
+ (void *)p, (unsigned long)(hhdr -> hb_sz));
+ p += HBLKSIZE * OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz);
+ }
+ }
+ }
+}
+
+# endif /* NO_DEBUGGING */
+
+/* Initialize hdr for a block containing the indicated size and */
+/* kind of objects. */
+/* Return FALSE on failure. */
+static GC_bool setup_header(hdr * hhdr, struct hblk *block, size_t byte_sz,
+ int kind, unsigned flags)
+{
+ word descr;
+
+# ifdef MARK_BIT_PER_GRANULE
+ if (byte_sz > MAXOBJBYTES)
+ flags |= LARGE_BLOCK;
+# endif
+# ifdef ENABLE_DISCLAIM
+ if (GC_obj_kinds[kind].ok_disclaim_proc)
+ flags |= HAS_DISCLAIM;
+ if (GC_obj_kinds[kind].ok_mark_unconditionally)
+ flags |= MARK_UNCONDITIONALLY;
+# endif
+
+ /* Set size, kind and mark proc fields */
+ hhdr -> hb_sz = byte_sz;
+ hhdr -> hb_obj_kind = (unsigned char)kind;
+ hhdr -> hb_flags = (unsigned char)flags;
+ hhdr -> hb_block = block;
+ descr = GC_obj_kinds[kind].ok_descriptor;
+ if (GC_obj_kinds[kind].ok_relocate_descr) descr += byte_sz;
+ hhdr -> hb_descr = descr;
+
+# ifdef MARK_BIT_PER_OBJ
+ /* Set hb_inv_sz as portably as possible. */
+ /* We set it to the smallest value such that sz * inv_sz >= 2**32 */
+ /* This may be more precision than necessary. */
+ if (byte_sz > MAXOBJBYTES) {
+ hhdr -> hb_inv_sz = LARGE_INV_SZ;
+ } else {
+ word inv_sz;
+
+# if CPP_WORDSZ == 64
+ inv_sz = ((word)1 << 32)/byte_sz;
+ if (((inv_sz*byte_sz) >> 32) == 0) ++inv_sz;
+# else /* 32 bit words */
+ GC_ASSERT(byte_sz >= 4);
+ inv_sz = ((unsigned)1 << 31)/byte_sz;
+ inv_sz *= 2;
+ while (inv_sz*byte_sz > byte_sz) ++inv_sz;
+# endif
+# ifdef INV_SZ_COMPUTATION_CHECK
+ GC_ASSERT(((1ULL << 32) + byte_sz - 1) / byte_sz == inv_sz);
+# endif
+ hhdr -> hb_inv_sz = inv_sz;
+ }
+# endif
+# ifdef MARK_BIT_PER_GRANULE
+ {
+ size_t granules = BYTES_TO_GRANULES(byte_sz);
+
+ if (EXPECT(!GC_add_map_entry(granules), FALSE)) {
+ /* Make it look like a valid block. */
+ hhdr -> hb_sz = HBLKSIZE;
+ hhdr -> hb_descr = 0;
+ hhdr -> hb_flags |= LARGE_BLOCK;
+ hhdr -> hb_map = 0;
+ return FALSE;
+ }
+ hhdr -> hb_map = GC_obj_map[(hhdr -> hb_flags & LARGE_BLOCK) != 0 ?
+ 0 : granules];
+ }
+# endif /* MARK_BIT_PER_GRANULE */
+
+ /* Clear mark bits */
+ GC_clear_hdr_marks(hhdr);
+
+ hhdr -> hb_last_reclaimed = (unsigned short)GC_gc_no;
+ return(TRUE);
+}
+
+/* Remove hhdr from the free list (it is assumed to specified by index). */
+STATIC void GC_remove_from_fl_at(hdr *hhdr, int index)
+{
+ GC_ASSERT(((hhdr -> hb_sz) & (HBLKSIZE-1)) == 0);
+ if (hhdr -> hb_prev == 0) {
+ GC_ASSERT(HDR(GC_hblkfreelist[index]) == hhdr);
+ GC_hblkfreelist[index] = hhdr -> hb_next;
+ } else {
+ hdr *phdr;
+ GET_HDR(hhdr -> hb_prev, phdr);
+ phdr -> hb_next = hhdr -> hb_next;
+ }
+ /* We always need index to maintain free counts. */
+ GC_ASSERT(GC_free_bytes[index] >= hhdr -> hb_sz);
+ GC_free_bytes[index] -= hhdr -> hb_sz;
+ if (0 != hhdr -> hb_next) {
+ hdr * nhdr;
+ GC_ASSERT(!IS_FORWARDING_ADDR_OR_NIL(NHDR(hhdr)));
+ GET_HDR(hhdr -> hb_next, nhdr);
+ nhdr -> hb_prev = hhdr -> hb_prev;
+ }
+}
+
+/* Remove hhdr from the appropriate free list (we assume it is on the */
+/* size-appropriate free list). */
+GC_INLINE void GC_remove_from_fl(hdr *hhdr)
+{
+ GC_remove_from_fl_at(hhdr, GC_hblk_fl_from_blocks(divHBLKSZ(hhdr->hb_sz)));
+}
+
+/* Return a pointer to the block ending just before h, if any. */
+static struct hblk * get_block_ending_at(struct hblk *h)
+{
+ struct hblk * p = h - 1;
+ hdr * phdr;
+
+ GET_HDR(p, phdr);
+ while (0 != phdr && IS_FORWARDING_ADDR_OR_NIL(phdr)) {
+ p = FORWARDED_ADDR(p,phdr);
+ phdr = HDR(p);
+ }
+ if (0 != phdr) {
+ return p;
+ }
+ p = GC_prev_block(h - 1);
+ if (p) {
+ phdr = HDR(p);
+ if ((ptr_t)p + phdr -> hb_sz == (ptr_t)h) {
+ return p;
+ }
+ }
+ return NULL;
+}
+
+/* Return a pointer to the free block ending just before h, if any. */
+STATIC struct hblk * GC_free_block_ending_at(struct hblk *h)
+{
+ struct hblk * p = get_block_ending_at(h);
+
+ if (p /* != NULL */) { /* CPPCHECK */
+ hdr * phdr = HDR(p);
+
+ if (HBLK_IS_FREE(phdr)) {
+ return p;
+ }
+ }
+ return 0;
+}
+
+/* Add hhdr to the appropriate free list. */
+/* We maintain individual free lists sorted by address. */
+STATIC void GC_add_to_fl(struct hblk *h, hdr *hhdr)
+{
+ int index = GC_hblk_fl_from_blocks(divHBLKSZ(hhdr -> hb_sz));
+ struct hblk *second = GC_hblkfreelist[index];
+# if defined(GC_ASSERTIONS) && !defined(USE_MUNMAP)
+ struct hblk *next = (struct hblk *)((word)h + hhdr -> hb_sz);
+ hdr * nexthdr = HDR(next);
+ struct hblk *prev = GC_free_block_ending_at(h);
+ hdr * prevhdr = HDR(prev);
+
+ GC_ASSERT(nexthdr == 0 || !HBLK_IS_FREE(nexthdr)
+ || (GC_heapsize & SIGNB) != 0);
+ /* In the last case, blocks may be too large to merge. */
+ GC_ASSERT(prev == 0 || !HBLK_IS_FREE(prevhdr)
+ || (GC_heapsize & SIGNB) != 0);
+# endif
+ GC_ASSERT(((hhdr -> hb_sz) & (HBLKSIZE-1)) == 0);
+ GC_hblkfreelist[index] = h;
+ GC_free_bytes[index] += hhdr -> hb_sz;
+ GC_ASSERT(GC_free_bytes[index] <= GC_large_free_bytes);
+ hhdr -> hb_next = second;
+ hhdr -> hb_prev = 0;
+ if (second /* != NULL */) { /* CPPCHECK */
+ hdr * second_hdr;
+
+ GET_HDR(second, second_hdr);
+ second_hdr -> hb_prev = h;
+ }
+ hhdr -> hb_flags |= FREE_BLK;
+}
+
+#ifdef USE_MUNMAP
+
+# ifndef MUNMAP_THRESHOLD
+# define MUNMAP_THRESHOLD 6
+# endif
+
+GC_INNER int GC_unmap_threshold = MUNMAP_THRESHOLD;
+
+#ifdef COUNT_UNMAPPED_REGIONS
+ /* GC_unmap_old will avoid creating more than this many unmapped regions, */
+ /* but an unmapped region may be split again so exceeding the limit. */
+
+ /* Return the change in number of unmapped regions if the block h swaps */
+ /* from its current state of mapped/unmapped to the opposite state. */
+ static int calc_num_unmapped_regions_delta(struct hblk *h, hdr *hhdr)
+ {
+ struct hblk * prev = get_block_ending_at(h);
+ struct hblk * next;
+ GC_bool prev_unmapped = FALSE;
+ GC_bool next_unmapped = FALSE;
+
+ next = GC_next_block((struct hblk *)((ptr_t)h + hhdr->hb_sz), TRUE);
+ /* Ensure next is contiguous with h. */
+ if ((ptr_t)next != GC_unmap_end((ptr_t)h, (size_t)hhdr->hb_sz)) {
+ next = NULL;
+ }
+ if (prev != NULL) {
+ hdr * prevhdr = HDR(prev);
+ prev_unmapped = !IS_MAPPED(prevhdr);
+ }
+ if (next != NULL) {
+ hdr * nexthdr = HDR(next);
+ next_unmapped = !IS_MAPPED(nexthdr);
+ }
+
+ if (prev_unmapped && next_unmapped) {
+ /* If h unmapped, merge two unmapped regions into one. */
+ /* If h remapped, split one unmapped region into two. */
+ return IS_MAPPED(hhdr) ? -1 : 1;
+ }
+ if (!prev_unmapped && !next_unmapped) {
+ /* If h unmapped, create an isolated unmapped region. */
+ /* If h remapped, remove it. */
+ return IS_MAPPED(hhdr) ? 1 : -1;
+ }
+ /* If h unmapped, merge it with previous or next unmapped region. */
+ /* If h remapped, reduce either previous or next unmapped region. */
+ /* In either way, no change to the number of unmapped regions. */
+ return 0;
+ }
+#endif /* COUNT_UNMAPPED_REGIONS */
+
+/* Update GC_num_unmapped_regions assuming the block h changes */
+/* from its current state of mapped/unmapped to the opposite state. */
+GC_INLINE void GC_adjust_num_unmapped(struct hblk *h GC_ATTR_UNUSED,
+ hdr *hhdr GC_ATTR_UNUSED)
+{
+# ifdef COUNT_UNMAPPED_REGIONS
+ GC_num_unmapped_regions += calc_num_unmapped_regions_delta(h, hhdr);
+# endif
+}
+
+/* Unmap blocks that haven't been recently touched. This is the only */
+/* way blocks are ever unmapped. */
+GC_INNER void GC_unmap_old(void)
+{
+ int i;
+
+ if (GC_unmap_threshold == 0)
+ return; /* unmapping disabled */
+# ifdef COUNT_UNMAPPED_REGIONS
+ /* Skip unmapping if we have already exceeded the soft limit. */
+ /* This forgoes any opportunities to merge unmapped regions though. */
+ if (GC_num_unmapped_regions >= GC_UNMAPPED_REGIONS_SOFT_LIMIT)
+ return;
+# endif
+
+ for (i = 0; i <= N_HBLK_FLS; ++i) {
+ struct hblk * h;
+ hdr * hhdr;
+
+ for (h = GC_hblkfreelist[i]; 0 != h; h = hhdr -> hb_next) {
+ hhdr = HDR(h);
+ if (!IS_MAPPED(hhdr)) continue;
+
+ /* Check that the interval is larger than the threshold (the */
+ /* truncated counter value wrapping is handled correctly). */
+ if ((unsigned short)(GC_gc_no - hhdr->hb_last_reclaimed) >
+ (unsigned short)GC_unmap_threshold) {
+# ifdef COUNT_UNMAPPED_REGIONS
+ /* Continue with unmapping the block only if it will not */
+ /* create too many unmapped regions, or if unmapping */
+ /* reduces the number of regions. */
+ int delta = calc_num_unmapped_regions_delta(h, hhdr);
+ signed_word regions = GC_num_unmapped_regions + delta;
+
+ if (delta >= 0 && regions >= GC_UNMAPPED_REGIONS_SOFT_LIMIT) {
+ GC_COND_LOG_PRINTF("Unmapped regions limit reached!\n");
+ return;
+ }
+ GC_num_unmapped_regions = regions;
+# endif
+ GC_unmap((ptr_t)h, (size_t)hhdr->hb_sz);
+ hhdr -> hb_flags |= WAS_UNMAPPED;
+ }
+ }
+ }
+}
+
+/* Merge all unmapped blocks that are adjacent to other free */
+/* blocks. This may involve remapping, since all blocks are either */
+/* fully mapped or fully unmapped. */
+GC_INNER void GC_merge_unmapped(void)
+{
+ int i;
+
+ for (i = 0; i <= N_HBLK_FLS; ++i) {
+ struct hblk *h = GC_hblkfreelist[i];
+
+ while (h != 0) {
+ struct hblk *next;
+ hdr *hhdr, *nexthdr;
+ word size, nextsize;
+
+ GET_HDR(h, hhdr);
+ size = hhdr->hb_sz;
+ next = (struct hblk *)((word)h + size);
+ GET_HDR(next, nexthdr);
+ /* Coalesce with successor, if possible */
+ if (0 != nexthdr && HBLK_IS_FREE(nexthdr)
+ && (signed_word) (size + (nextsize = nexthdr->hb_sz)) > 0
+ /* no pot. overflow */) {
+ /* Note that we usually try to avoid adjacent free blocks */
+ /* that are either both mapped or both unmapped. But that */
+ /* isn't guaranteed to hold since we remap blocks when we */
+ /* split them, and don't merge at that point. It may also */
+ /* not hold if the merged block would be too big. */
+ if (IS_MAPPED(hhdr) && !IS_MAPPED(nexthdr)) {
+ /* make both consistent, so that we can merge */
+ if (size > nextsize) {
+ GC_adjust_num_unmapped(next, nexthdr);
+ GC_remap((ptr_t)next, nextsize);
+ } else {
+ GC_adjust_num_unmapped(h, hhdr);
+ GC_unmap((ptr_t)h, size);
+ GC_unmap_gap((ptr_t)h, size, (ptr_t)next, nextsize);
+ hhdr -> hb_flags |= WAS_UNMAPPED;
+ }
+ } else if (IS_MAPPED(nexthdr) && !IS_MAPPED(hhdr)) {
+ if (size > nextsize) {
+ GC_adjust_num_unmapped(next, nexthdr);
+ GC_unmap((ptr_t)next, nextsize);
+ GC_unmap_gap((ptr_t)h, size, (ptr_t)next, nextsize);
+ } else {
+ GC_adjust_num_unmapped(h, hhdr);
+ GC_remap((ptr_t)h, size);
+ hhdr -> hb_flags &= ~WAS_UNMAPPED;
+ hhdr -> hb_last_reclaimed = nexthdr -> hb_last_reclaimed;
+ }
+ } else if (!IS_MAPPED(hhdr) && !IS_MAPPED(nexthdr)) {
+ /* Unmap any gap in the middle */
+ GC_unmap_gap((ptr_t)h, size, (ptr_t)next, nextsize);
+ }
+ /* If they are both unmapped, we merge, but leave unmapped. */
+ GC_remove_from_fl_at(hhdr, i);
+ GC_remove_from_fl(nexthdr);
+ hhdr -> hb_sz += nexthdr -> hb_sz;
+ GC_remove_header(next);
+ GC_add_to_fl(h, hhdr);
+ /* Start over at beginning of list */
+ h = GC_hblkfreelist[i];
+ } else /* not mergeable with successor */ {
+ h = hhdr -> hb_next;
+ }
+ } /* while (h != 0) ... */
+ } /* for ... */
+}
+
+#endif /* USE_MUNMAP */
+
+/*
+ * Return a pointer to a block starting at h of length bytes.
+ * Memory for the block is mapped.
+ * Remove the block from its free list, and return the remainder (if any)
+ * to its appropriate free list.
+ * May fail by returning 0.
+ * The header for the returned block must be set up by the caller.
+ * If the return value is not 0, then hhdr is the header for it.
+ */
+STATIC struct hblk * GC_get_first_part(struct hblk *h, hdr *hhdr,
+ size_t bytes, int index)
+{
+ word total_size = hhdr -> hb_sz;
+ struct hblk * rest;
+ hdr * rest_hdr;
+
+ GC_ASSERT((total_size & (HBLKSIZE-1)) == 0);
+ GC_remove_from_fl_at(hhdr, index);
+ if (total_size == bytes) return h;
+ rest = (struct hblk *)((word)h + bytes);
+ rest_hdr = GC_install_header(rest);
+ if (0 == rest_hdr) {
+ /* FIXME: This is likely to be very bad news ... */
+ WARN("Header allocation failed: dropping block\n", 0);
+ return(0);
+ }
+ rest_hdr -> hb_sz = total_size - bytes;
+ rest_hdr -> hb_flags = 0;
+# ifdef GC_ASSERTIONS
+ /* Mark h not free, to avoid assertion about adjacent free blocks. */
+ hhdr -> hb_flags &= ~FREE_BLK;
+# endif
+ GC_add_to_fl(rest, rest_hdr);
+ return h;
+}
+
+/*
+ * H is a free block. N points at an address inside it.
+ * A new header for n has already been set up. Fix up h's header
+ * to reflect the fact that it is being split, move it to the
+ * appropriate free list.
+ * N replaces h in the original free list.
+ *
+ * Nhdr is not completely filled in, since it is about to be allocated.
+ * It may in fact end up on the wrong free list for its size.
+ * That's not a disaster, since n is about to be allocated
+ * by our caller.
+ * (Hence adding it to a free list is silly. But this path is hopefully
+ * rare enough that it doesn't matter. The code is cleaner this way.)
+ */
+STATIC void GC_split_block(struct hblk *h, hdr *hhdr, struct hblk *n,
+ hdr *nhdr, int index /* Index of free list */)
+{
+ word total_size = hhdr -> hb_sz;
+ word h_size = (word)n - (word)h;
+ struct hblk *prev = hhdr -> hb_prev;
+ struct hblk *next = hhdr -> hb_next;
+
+ /* Replace h with n on its freelist */
+ nhdr -> hb_prev = prev;
+ nhdr -> hb_next = next;
+ nhdr -> hb_sz = total_size - h_size;
+ nhdr -> hb_flags = 0;
+ if (prev /* != NULL */) { /* CPPCHECK */
+ HDR(prev) -> hb_next = n;
+ } else {
+ GC_hblkfreelist[index] = n;
+ }
+ if (next /* != NULL */) {
+ HDR(next) -> hb_prev = n;
+ }
+ GC_ASSERT(GC_free_bytes[index] > h_size);
+ GC_free_bytes[index] -= h_size;
+# ifdef USE_MUNMAP
+ hhdr -> hb_last_reclaimed = (unsigned short)GC_gc_no;
+# endif
+ hhdr -> hb_sz = h_size;
+ GC_add_to_fl(h, hhdr);
+ nhdr -> hb_flags |= FREE_BLK;
+}
+
+STATIC struct hblk *
+GC_allochblk_nth(size_t sz /* bytes */, int kind, unsigned flags, int n,
+ int may_split);
+#define AVOID_SPLIT_REMAPPED 2
+
+/*
+ * Allocate (and return pointer to) a heap block
+ * for objects of size sz bytes, searching the nth free list.
+ *
+ * NOTE: We set obj_map field in header correctly.
+ * Caller is responsible for building an object freelist in block.
+ *
+ * The client is responsible for clearing the block, if necessary.
+ */
+GC_INNER struct hblk *
+GC_allochblk(size_t sz, int kind, unsigned flags/* IGNORE_OFF_PAGE or 0 */)
+{
+ word blocks;
+ int start_list;
+ struct hblk *result;
+ int may_split;
+ int split_limit; /* Highest index of free list whose blocks we */
+ /* split. */
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_ASSERT((sz & (GRANULE_BYTES - 1)) == 0);
+ blocks = OBJ_SZ_TO_BLOCKS_CHECKED(sz);
+ if ((signed_word)(blocks * HBLKSIZE) < 0) {
+ return 0;
+ }
+ start_list = GC_hblk_fl_from_blocks(blocks);
+ /* Try for an exact match first. */
+ result = GC_allochblk_nth(sz, kind, flags, start_list, FALSE);
+ if (0 != result) return result;
+
+ may_split = TRUE;
+ if (GC_use_entire_heap || GC_dont_gc
+ || USED_HEAP_SIZE < GC_requested_heapsize
+ || GC_incremental || !GC_should_collect()) {
+ /* Should use more of the heap, even if it requires splitting. */
+ split_limit = N_HBLK_FLS;
+ } else if (GC_finalizer_bytes_freed > (GC_heapsize >> 4)) {
+ /* If we are deallocating lots of memory from */
+ /* finalizers, fail and collect sooner rather */
+ /* than later. */
+ split_limit = 0;
+ } else {
+ /* If we have enough large blocks left to cover any */
+ /* previous request for large blocks, we go ahead */
+ /* and split. Assuming a steady state, that should */
+ /* be safe. It means that we can use the full */
+ /* heap if we allocate only small objects. */
+ split_limit = GC_enough_large_bytes_left();
+# ifdef USE_MUNMAP
+ if (split_limit > 0)
+ may_split = AVOID_SPLIT_REMAPPED;
+# endif
+ }
+ if (start_list < UNIQUE_THRESHOLD) {
+ /* No reason to try start_list again, since all blocks are exact */
+ /* matches. */
+ ++start_list;
+ }
+ for (; start_list <= split_limit; ++start_list) {
+ result = GC_allochblk_nth(sz, kind, flags, start_list, may_split);
+ if (0 != result)
+ break;
+ }
+ return result;
+}
+
+STATIC long GC_large_alloc_warn_suppressed = 0;
+ /* Number of warnings suppressed so far. */
+
+/* The same, but with search restricted to nth free list. Flags is */
+/* IGNORE_OFF_PAGE or zero. sz is in bytes. The may_split flag */
+/* indicates whether it is OK to split larger blocks (if set to */
+/* AVOID_SPLIT_REMAPPED then memory remapping followed by splitting */
+/* should be generally avoided). */
+STATIC struct hblk *
+GC_allochblk_nth(size_t sz, int kind, unsigned flags, int n, int may_split)
+{
+ struct hblk *hbp;
+ hdr * hhdr; /* Header corr. to hbp */
+ struct hblk *thishbp;
+ hdr * thishdr; /* Header corr. to thishbp */
+ signed_word size_needed = HBLKSIZE * OBJ_SZ_TO_BLOCKS_CHECKED(sz);
+ /* number of bytes in requested objects */
+
+ /* search for a big enough block in free list */
+ for (hbp = GC_hblkfreelist[n];; hbp = hhdr -> hb_next) {
+ signed_word size_avail; /* bytes available in this block */
+
+ if (hbp /* != NULL */) {
+ /* CPPCHECK */
+ } else {
+ return NULL;
+ }
+ GET_HDR(hbp, hhdr); /* set hhdr value */
+ size_avail = (signed_word)hhdr->hb_sz;
+ if (size_avail < size_needed) continue;
+ if (size_avail != size_needed) {
+ if (!may_split) continue;
+ /* If the next heap block is obviously better, go on. */
+ /* This prevents us from disassembling a single large */
+ /* block to get tiny blocks. */
+ thishbp = hhdr -> hb_next;
+ if (thishbp /* != NULL */) { /* CPPCHECK */
+ signed_word next_size;
+
+ GET_HDR(thishbp, thishdr);
+ next_size = (signed_word)(thishdr -> hb_sz);
+ if (next_size < size_avail
+ && next_size >= size_needed
+ && !GC_is_black_listed(thishbp, (word)size_needed)) {
+ continue;
+ }
+ }
+ }
+ if (!IS_UNCOLLECTABLE(kind) && (kind != PTRFREE
+ || size_needed > (signed_word)MAX_BLACK_LIST_ALLOC)) {
+ struct hblk * lasthbp = hbp;
+ ptr_t search_end = (ptr_t)hbp + size_avail - size_needed;
+ signed_word orig_avail = size_avail;
+ signed_word eff_size_needed = (flags & IGNORE_OFF_PAGE) != 0 ?
+ (signed_word)HBLKSIZE
+ : size_needed;
+
+ while ((word)lasthbp <= (word)search_end
+ && (thishbp = GC_is_black_listed(lasthbp,
+ (word)eff_size_needed)) != 0) {
+ lasthbp = thishbp;
+ }
+ size_avail -= (ptr_t)lasthbp - (ptr_t)hbp;
+ thishbp = lasthbp;
+ if (size_avail >= size_needed) {
+ if (thishbp != hbp) {
+# ifdef USE_MUNMAP
+ /* Avoid remapping followed by splitting. */
+ if (may_split == AVOID_SPLIT_REMAPPED && !IS_MAPPED(hhdr))
+ continue;
+# endif
+ thishdr = GC_install_header(thishbp);
+ if (0 != thishdr) {
+ /* Make sure it's mapped before we mangle it. */
+# ifdef USE_MUNMAP
+ if (!IS_MAPPED(hhdr)) {
+ GC_adjust_num_unmapped(hbp, hhdr);
+ GC_remap((ptr_t)hbp, (size_t)hhdr->hb_sz);
+ hhdr -> hb_flags &= ~WAS_UNMAPPED;
+ }
+# endif
+ /* Split the block at thishbp */
+ GC_split_block(hbp, hhdr, thishbp, thishdr, n);
+ /* Advance to thishbp */
+ hbp = thishbp;
+ hhdr = thishdr;
+ /* We must now allocate thishbp, since it may */
+ /* be on the wrong free list. */
+ }
+ }
+ } else if (size_needed > (signed_word)BL_LIMIT
+ && orig_avail - size_needed
+ > (signed_word)BL_LIMIT) {
+ /* Punt, since anything else risks unreasonable heap growth. */
+ if (++GC_large_alloc_warn_suppressed
+ >= GC_large_alloc_warn_interval) {
+ WARN("Repeated allocation of very large block "
+ "(appr. size %" WARN_PRIuPTR " KiB):\n"
+ "\tMay lead to memory leak and poor performance\n",
+ (word)size_needed >> 10);
+ GC_large_alloc_warn_suppressed = 0;
+ }
+ size_avail = orig_avail;
+ } else if (size_avail == 0
+ && size_needed == (signed_word)HBLKSIZE
+ && IS_MAPPED(hhdr)) {
+ if (!GC_find_leak) {
+ static unsigned count = 0;
+
+ /* The block is completely blacklisted. We need */
+ /* to drop some such blocks, since otherwise we spend */
+ /* all our time traversing them if pointer-free */
+ /* blocks are unpopular. */
+ /* A dropped block will be reconsidered at next GC. */
+ if ((++count & 3) == 0) {
+ /* Allocate and drop the block in small chunks, to */
+ /* maximize the chance that we will recover some */
+ /* later. */
+ word total_size = hhdr -> hb_sz;
+ struct hblk * limit = hbp + divHBLKSZ(total_size);
+ struct hblk * h;
+ struct hblk * prev = hhdr -> hb_prev;
+
+ GC_large_free_bytes -= total_size;
+ GC_bytes_dropped += total_size;
+ GC_remove_from_fl_at(hhdr, n);
+ for (h = hbp; (word)h < (word)limit; h++) {
+ if (h != hbp) {
+ hhdr = GC_install_header(h);
+ }
+ if (NULL != hhdr) {
+ (void)setup_header(hhdr, h, HBLKSIZE, PTRFREE, 0);
+ /* Can't fail. */
+ if (GC_debugging_started) {
+ BZERO(h, HBLKSIZE);
+ }
+ }
+ }
+ /* Restore hbp to point at free block */
+ hbp = prev;
+ if (0 == hbp) {
+ return GC_allochblk_nth(sz, kind, flags, n, may_split);
+ }
+ hhdr = HDR(hbp);
+ }
+ }
+ }
+ }
+ if( size_avail >= size_needed ) {
+# ifdef USE_MUNMAP
+ if (!IS_MAPPED(hhdr)) {
+ GC_adjust_num_unmapped(hbp, hhdr);
+ GC_remap((ptr_t)hbp, (size_t)hhdr->hb_sz);
+ hhdr -> hb_flags &= ~WAS_UNMAPPED;
+ /* Note: This may leave adjacent, mapped free blocks. */
+ }
+# endif
+ /* hbp may be on the wrong freelist; the parameter n */
+ /* is important. */
+ hbp = GC_get_first_part(hbp, hhdr, size_needed, n);
+ break;
+ }
+ }
+
+ if (0 == hbp) return 0;
+
+ /* Add it to map of valid blocks */
+ if (!GC_install_counts(hbp, (word)size_needed)) return(0);
+ /* This leaks memory under very rare conditions. */
+
+ /* Set up header */
+ if (!setup_header(hhdr, hbp, sz, kind, flags)) {
+ GC_remove_counts(hbp, (word)size_needed);
+ return(0); /* ditto */
+ }
+# ifndef GC_DISABLE_INCREMENTAL
+ /* Notify virtual dirty bit implementation that we are about to */
+ /* write. Ensure that pointer-free objects are not protected */
+ /* if it is avoidable. This also ensures that newly allocated */
+ /* blocks are treated as dirty. Necessary since we don't */
+ /* protect free blocks. */
+ GC_ASSERT((size_needed & (HBLKSIZE-1)) == 0);
+ GC_remove_protection(hbp, divHBLKSZ(size_needed),
+ (hhdr -> hb_descr == 0) /* pointer-free */);
+# endif
+ /* We just successfully allocated a block. Restart count of */
+ /* consecutive failures. */
+ GC_fail_count = 0;
+
+ GC_large_free_bytes -= size_needed;
+ GC_ASSERT(IS_MAPPED(hhdr));
+ return( hbp );
+}
+
+/*
+ * Free a heap block.
+ *
+ * Coalesce the block with its neighbors if possible.
+ *
+ * All mark words are assumed to be cleared.
+ */
+GC_INNER void GC_freehblk(struct hblk *hbp)
+{
+ struct hblk *next, *prev;
+ hdr *hhdr, *prevhdr, *nexthdr;
+ word size;
+
+ GET_HDR(hbp, hhdr);
+ size = HBLKSIZE * OBJ_SZ_TO_BLOCKS(hhdr->hb_sz);
+ if ((size & SIGNB) != 0)
+ ABORT("Deallocating excessively large block. Too large an allocation?");
+ /* Probably possible if we try to allocate more than half the address */
+ /* space at once. If we don't catch it here, strange things happen */
+ /* later. */
+ GC_remove_counts(hbp, size);
+ hhdr->hb_sz = size;
+# ifdef USE_MUNMAP
+ hhdr -> hb_last_reclaimed = (unsigned short)GC_gc_no;
+# endif
+
+ /* Check for duplicate deallocation in the easy case */
+ if (HBLK_IS_FREE(hhdr)) {
+ ABORT_ARG1("Duplicate large block deallocation",
+ " of %p", (void *)hbp);
+ }
+
+ GC_ASSERT(IS_MAPPED(hhdr));
+ hhdr -> hb_flags |= FREE_BLK;
+ next = (struct hblk *)((ptr_t)hbp + size);
+ GET_HDR(next, nexthdr);
+ prev = GC_free_block_ending_at(hbp);
+ /* Coalesce with successor, if possible */
+ if(0 != nexthdr && HBLK_IS_FREE(nexthdr) && IS_MAPPED(nexthdr)
+ && (signed_word)(hhdr -> hb_sz + nexthdr -> hb_sz) > 0
+ /* no overflow */) {
+ GC_remove_from_fl(nexthdr);
+ hhdr -> hb_sz += nexthdr -> hb_sz;
+ GC_remove_header(next);
+ }
+ /* Coalesce with predecessor, if possible. */
+ if (prev /* != NULL */) { /* CPPCHECK */
+ prevhdr = HDR(prev);
+ if (IS_MAPPED(prevhdr)
+ && (signed_word)(hhdr -> hb_sz + prevhdr -> hb_sz) > 0) {
+ GC_remove_from_fl(prevhdr);
+ prevhdr -> hb_sz += hhdr -> hb_sz;
+# ifdef USE_MUNMAP
+ prevhdr -> hb_last_reclaimed = (unsigned short)GC_gc_no;
+# endif
+ GC_remove_header(hbp);
+ hbp = prev;
+ hhdr = prevhdr;
+ }
+ }
+ /* FIXME: It is not clear we really always want to do these merges */
+ /* with USE_MUNMAP, since it updates ages and hence prevents */
+ /* unmapping. */
+
+ GC_large_free_bytes += size;
+ GC_add_to_fl(hbp, hhdr);
+}
diff --git a/graphics/asymptote/gc/alloc.c b/graphics/asymptote/gc/alloc.c
new file mode 100644
index 0000000000..9627c79d27
--- /dev/null
+++ b/graphics/asymptote/gc/alloc.c
@@ -0,0 +1,1812 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1996 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1998 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2008-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#include "private/gc_priv.h"
+
+#include <stdio.h>
+#if !defined(MACOS) && !defined(MSWINCE)
+# include <signal.h>
+# if !defined(GC_NO_TYPES) && !defined(SN_TARGET_PSP2) \
+ && !defined(__CC_ARM)
+# include <sys/types.h>
+# endif
+#endif
+
+/*
+ * Separate free lists are maintained for different sized objects
+ * up to MAXOBJBYTES.
+ * The call GC_allocobj(i,k) ensures that the freelist for
+ * kind k objects of size i points to a non-empty
+ * free list. It returns a pointer to the first entry on the free list.
+ * In a single-threaded world, GC_allocobj may be called to allocate
+ * an object of small size lb (and NORMAL kind) as follows
+ * (GC_generic_malloc_inner is a wrapper over GC_allocobj which also
+ * fills in GC_size_map if needed):
+ *
+ * lg = GC_size_map[lb];
+ * op = GC_objfreelist[lg];
+ * if (NULL == op) {
+ * op = GC_generic_malloc_inner(lb, NORMAL);
+ * } else {
+ * GC_objfreelist[lg] = obj_link(op);
+ * GC_bytes_allocd += GRANULES_TO_BYTES((word)lg);
+ * }
+ *
+ * Note that this is very fast if the free list is non-empty; it should
+ * only involve the execution of 4 or 5 simple instructions.
+ * All composite objects on freelists are cleared, except for
+ * their first word.
+ */
+
+/*
+ * The allocator uses GC_allochblk to allocate large chunks of objects.
+ * These chunks all start on addresses which are multiples of
+ * HBLKSZ. Each allocated chunk has an associated header,
+ * which can be located quickly based on the address of the chunk.
+ * (See headers.c for details.)
+ * This makes it possible to check quickly whether an
+ * arbitrary address corresponds to an object administered by the
+ * allocator.
+ */
+
+word GC_non_gc_bytes = 0; /* Number of bytes not intended to be collected */
+
+word GC_gc_no = 0;
+
+#ifndef NO_CLOCK
+ static unsigned long full_gc_total_time = 0; /* in ms, may wrap */
+ static unsigned full_gc_total_ns_frac = 0; /* fraction of 1 ms */
+ static GC_bool measure_performance = FALSE;
+ /* Do performance measurements if set to true (e.g., */
+ /* accumulation of the total time of full collections). */
+
+ GC_API void GC_CALL GC_start_performance_measurement(void)
+ {
+ measure_performance = TRUE;
+ }
+
+ GC_API unsigned long GC_CALL GC_get_full_gc_total_time(void)
+ {
+ return full_gc_total_time;
+ }
+#endif /* !NO_CLOCK */
+
+#ifndef GC_DISABLE_INCREMENTAL
+ GC_INNER GC_bool GC_incremental = FALSE; /* By default, stop the world. */
+ STATIC GC_bool GC_should_start_incremental_collection = FALSE;
+#endif
+
+GC_API int GC_CALL GC_is_incremental_mode(void)
+{
+ return (int)GC_incremental;
+}
+
+#ifdef THREADS
+ int GC_parallel = FALSE; /* By default, parallel GC is off. */
+#endif
+
+#if defined(GC_FULL_FREQ) && !defined(CPPCHECK)
+ int GC_full_freq = GC_FULL_FREQ;
+#else
+ int GC_full_freq = 19; /* Every 20th collection is a full */
+ /* collection, whether we need it */
+ /* or not. */
+#endif
+
+STATIC GC_bool GC_need_full_gc = FALSE;
+ /* Need full GC due to heap growth. */
+
+#ifdef THREAD_LOCAL_ALLOC
+ GC_INNER GC_bool GC_world_stopped = FALSE;
+#endif
+
+STATIC GC_bool GC_disable_automatic_collection = FALSE;
+
+GC_API void GC_CALL GC_set_disable_automatic_collection(int value)
+{
+ DCL_LOCK_STATE;
+
+ LOCK();
+ GC_disable_automatic_collection = (GC_bool)value;
+ UNLOCK();
+}
+
+GC_API int GC_CALL GC_get_disable_automatic_collection(void)
+{
+ int value;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ value = (int)GC_disable_automatic_collection;
+ UNLOCK();
+ return value;
+}
+
+STATIC word GC_used_heap_size_after_full = 0;
+
+/* GC_copyright symbol is externally visible. */
+EXTERN_C_BEGIN
+extern const char * const GC_copyright[];
+EXTERN_C_END
+const char * const GC_copyright[] =
+{"Copyright 1988, 1989 Hans-J. Boehm and Alan J. Demers ",
+"Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. ",
+"Copyright (c) 1996-1998 by Silicon Graphics. All rights reserved. ",
+"Copyright (c) 1999-2009 by Hewlett-Packard Company. All rights reserved. ",
+"Copyright (c) 2008-2021 Ivan Maidanski ",
+"THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY",
+" EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK.",
+"See source code for details." };
+
+/* Version macros are now defined in gc_version.h, which is included by */
+/* gc.h, which is included by gc_priv.h. */
+#ifndef GC_NO_VERSION_VAR
+ EXTERN_C_BEGIN
+ extern const unsigned GC_version;
+ EXTERN_C_END
+ const unsigned GC_version = ((GC_VERSION_MAJOR << 16) |
+ (GC_VERSION_MINOR << 8) | GC_VERSION_MICRO);
+#endif
+
+GC_API unsigned GC_CALL GC_get_version(void)
+{
+ return (GC_VERSION_MAJOR << 16) | (GC_VERSION_MINOR << 8) |
+ GC_VERSION_MICRO;
+}
+
+/* some more variables */
+
+#ifdef GC_DONT_EXPAND
+ int GC_dont_expand = TRUE;
+#else
+ int GC_dont_expand = FALSE;
+#endif
+
+#if defined(GC_FREE_SPACE_DIVISOR) && !defined(CPPCHECK)
+ word GC_free_space_divisor = GC_FREE_SPACE_DIVISOR; /* must be > 0 */
+#else
+ word GC_free_space_divisor = 3;
+#endif
+
+GC_INNER int GC_CALLBACK GC_never_stop_func(void)
+{
+ return(0);
+}
+
+#if defined(GC_TIME_LIMIT) && !defined(CPPCHECK)
+ unsigned long GC_time_limit = GC_TIME_LIMIT;
+ /* We try to keep pause times from exceeding */
+ /* this by much. In milliseconds. */
+#elif defined(PARALLEL_MARK)
+ unsigned long GC_time_limit = GC_TIME_UNLIMITED;
+ /* The parallel marker cannot be interrupted for */
+ /* now, so the time limit is absent by default. */
+#else
+ unsigned long GC_time_limit = 50;
+#endif
+
+#ifndef NO_CLOCK
+ STATIC unsigned long GC_time_lim_nsec = 0;
+ /* The nanoseconds add-on to GC_time_limit */
+ /* value. Not updated by GC_set_time_limit(). */
+ /* Ignored if the value of GC_time_limit is */
+ /* GC_TIME_UNLIMITED. */
+
+# define TV_NSEC_LIMIT (1000UL * 1000) /* amount of nanoseconds in 1 ms */
+
+ GC_API void GC_CALL GC_set_time_limit_tv(struct GC_timeval_s tv)
+ {
+ GC_ASSERT(tv.tv_ms <= GC_TIME_UNLIMITED);
+ GC_ASSERT(tv.tv_nsec < TV_NSEC_LIMIT);
+ GC_time_limit = tv.tv_ms;
+ GC_time_lim_nsec = tv.tv_nsec;
+ }
+
+ GC_API struct GC_timeval_s GC_CALL GC_get_time_limit_tv(void)
+ {
+ struct GC_timeval_s tv;
+
+ tv.tv_ms = GC_time_limit;
+ tv.tv_nsec = GC_time_lim_nsec;
+ return tv;
+ }
+
+ STATIC CLOCK_TYPE GC_start_time = CLOCK_TYPE_INITIALIZER;
+ /* Time at which we stopped world. */
+ /* used only in GC_timeout_stop_func. */
+#endif /* !NO_CLOCK */
+
+STATIC int GC_n_attempts = 0; /* Number of attempts at finishing */
+ /* collection within GC_time_limit. */
+
+STATIC GC_stop_func GC_default_stop_func = GC_never_stop_func;
+ /* accessed holding the lock. */
+
+GC_API void GC_CALL GC_set_stop_func(GC_stop_func stop_func)
+{
+ DCL_LOCK_STATE;
+ GC_ASSERT(NONNULL_ARG_NOT_NULL(stop_func));
+ LOCK();
+ GC_default_stop_func = stop_func;
+ UNLOCK();
+}
+
+GC_API GC_stop_func GC_CALL GC_get_stop_func(void)
+{
+ GC_stop_func stop_func;
+ DCL_LOCK_STATE;
+ LOCK();
+ stop_func = GC_default_stop_func;
+ UNLOCK();
+ return stop_func;
+}
+
+#if defined(GC_DISABLE_INCREMENTAL) || defined(NO_CLOCK)
+# define GC_timeout_stop_func GC_default_stop_func
+#else
+ STATIC int GC_CALLBACK GC_timeout_stop_func (void)
+ {
+ CLOCK_TYPE current_time;
+ static unsigned count = 0;
+ unsigned long time_diff, nsec_diff;
+
+ if ((*GC_default_stop_func)())
+ return(1);
+
+ if ((count++ & 3) != 0) return(0);
+ GET_TIME(current_time);
+ time_diff = MS_TIME_DIFF(current_time,GC_start_time);
+ nsec_diff = NS_FRAC_TIME_DIFF(current_time, GC_start_time);
+# if defined(CPPCHECK)
+ GC_noop1((word)&nsec_diff);
+# endif
+ if (time_diff >= GC_time_limit
+ && (time_diff > GC_time_limit || nsec_diff >= GC_time_lim_nsec)) {
+ GC_COND_LOG_PRINTF("Abandoning stopped marking after %lu ms %lu ns"
+ " (attempt %d)\n",
+ time_diff, nsec_diff, GC_n_attempts);
+ return 1;
+ }
+ return(0);
+ }
+#endif /* !GC_DISABLE_INCREMENTAL */
+
+#ifdef THREADS
+ GC_INNER word GC_total_stacksize = 0; /* updated on every push_all_stacks */
+#endif
+
+static size_t min_bytes_allocd_minimum = 1;
+ /* The lowest value returned by min_bytes_allocd(). */
+
+GC_API void GC_CALL GC_set_min_bytes_allocd(size_t value)
+{
+ GC_ASSERT(value > 0);
+ min_bytes_allocd_minimum = value;
+}
+
+GC_API size_t GC_CALL GC_get_min_bytes_allocd(void)
+{
+ return min_bytes_allocd_minimum;
+}
+
+/* Return the minimum number of bytes that must be allocated between */
+/* collections to amortize the collection cost. Should be non-zero. */
+static word min_bytes_allocd(void)
+{
+ word result;
+ word stack_size;
+ word total_root_size; /* includes double stack size, */
+ /* since the stack is expensive */
+ /* to scan. */
+ word scan_size; /* Estimate of memory to be scanned */
+ /* during normal GC. */
+
+# ifdef THREADS
+ if (GC_need_to_lock) {
+ /* We are multi-threaded... */
+ stack_size = GC_total_stacksize;
+ /* For now, we just use the value computed during the latest GC. */
+# ifdef DEBUG_THREADS
+ GC_log_printf("Total stacks size: %lu\n",
+ (unsigned long)stack_size);
+# endif
+ } else
+# endif
+ /* else*/ {
+# ifdef STACK_NOT_SCANNED
+ stack_size = 0;
+# elif defined(STACK_GROWS_UP)
+ stack_size = GC_approx_sp() - GC_stackbottom;
+# else
+ stack_size = GC_stackbottom - GC_approx_sp();
+# endif
+ }
+
+ total_root_size = 2 * stack_size + GC_root_size;
+ scan_size = 2 * GC_composite_in_use + GC_atomic_in_use / 4
+ + total_root_size;
+ result = scan_size / GC_free_space_divisor;
+ if (GC_incremental) {
+ result /= 2;
+ }
+ return result > min_bytes_allocd_minimum
+ ? result : min_bytes_allocd_minimum;
+}
+
+STATIC word GC_non_gc_bytes_at_gc = 0;
+ /* Number of explicitly managed bytes of storage */
+ /* at last collection. */
+
+/* Return the number of bytes allocated, adjusted for explicit storage */
+/* management, etc.. This number is used in deciding when to trigger */
+/* collections. */
+STATIC word GC_adj_bytes_allocd(void)
+{
+ signed_word result;
+ signed_word expl_managed = (signed_word)GC_non_gc_bytes
+ - (signed_word)GC_non_gc_bytes_at_gc;
+
+ /* Don't count what was explicitly freed, or newly allocated for */
+ /* explicit management. Note that deallocating an explicitly */
+ /* managed object should not alter result, assuming the client */
+ /* is playing by the rules. */
+ result = (signed_word)GC_bytes_allocd
+ + (signed_word)GC_bytes_dropped
+ - (signed_word)GC_bytes_freed
+ + (signed_word)GC_finalizer_bytes_freed
+ - expl_managed;
+ if (result > (signed_word)GC_bytes_allocd) {
+ result = GC_bytes_allocd;
+ /* probably client bug or unfortunate scheduling */
+ }
+ result += GC_bytes_finalized;
+ /* We count objects enqueued for finalization as though they */
+ /* had been reallocated this round. Finalization is user */
+ /* visible progress. And if we don't count this, we have */
+ /* stability problems for programs that finalize all objects. */
+ if (result < (signed_word)(GC_bytes_allocd >> 3)) {
+ /* Always count at least 1/8 of the allocations. We don't want */
+ /* to collect too infrequently, since that would inhibit */
+ /* coalescing of free storage blocks. */
+ /* This also makes us partially robust against client bugs. */
+ return(GC_bytes_allocd >> 3);
+ } else {
+ return(result);
+ }
+}
+
+
+/* Clear up a few frames worth of garbage left at the top of the stack. */
+/* This is used to prevent us from accidentally treating garbage left */
+/* on the stack by other parts of the collector as roots. This */
+/* differs from the code in misc.c, which actually tries to keep the */
+/* stack clear of long-lived, client-generated garbage. */
+STATIC void GC_clear_a_few_frames(void)
+{
+# ifndef CLEAR_NWORDS
+# define CLEAR_NWORDS 64
+# endif
+ volatile word frames[CLEAR_NWORDS];
+ BZERO((word *)frames, CLEAR_NWORDS * sizeof(word));
+}
+
+/* Heap size at which we need a collection to avoid expanding past */
+/* limits used by blacklisting. */
+STATIC word GC_collect_at_heapsize = GC_WORD_MAX;
+
+GC_API void GC_CALL GC_start_incremental_collection(void)
+{
+# ifndef GC_DISABLE_INCREMENTAL
+ DCL_LOCK_STATE;
+
+ if (!GC_incremental) return;
+ LOCK();
+ GC_should_start_incremental_collection = TRUE;
+ if (!GC_dont_gc) {
+ ENTER_GC();
+ GC_collect_a_little_inner(1);
+ EXIT_GC();
+ }
+ UNLOCK();
+# endif
+}
+
+/* Have we allocated enough to amortize a collection? */
+GC_INNER GC_bool GC_should_collect(void)
+{
+ static word last_min_bytes_allocd;
+ static word last_gc_no;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (last_gc_no != GC_gc_no) {
+ last_min_bytes_allocd = min_bytes_allocd();
+ last_gc_no = GC_gc_no;
+ }
+# ifndef GC_DISABLE_INCREMENTAL
+ if (GC_should_start_incremental_collection) {
+ GC_should_start_incremental_collection = FALSE;
+ return TRUE;
+ }
+# endif
+ if (GC_disable_automatic_collection) return FALSE;
+
+ return(GC_adj_bytes_allocd() >= last_min_bytes_allocd
+ || GC_heapsize >= GC_collect_at_heapsize);
+}
+
+/* STATIC */ GC_start_callback_proc GC_start_call_back = 0;
+ /* Called at start of full collections. */
+ /* Not called if 0. Called with the allocation */
+ /* lock held. Not used by GC itself. */
+
+GC_API void GC_CALL GC_set_start_callback(GC_start_callback_proc fn)
+{
+ DCL_LOCK_STATE;
+ LOCK();
+ GC_start_call_back = fn;
+ UNLOCK();
+}
+
+GC_API GC_start_callback_proc GC_CALL GC_get_start_callback(void)
+{
+ GC_start_callback_proc fn;
+ DCL_LOCK_STATE;
+ LOCK();
+ fn = GC_start_call_back;
+ UNLOCK();
+ return fn;
+}
+
+GC_INLINE void GC_notify_full_gc(void)
+{
+ if (GC_start_call_back != 0) {
+ (*GC_start_call_back)();
+ }
+}
+
+STATIC GC_bool GC_is_full_gc = FALSE;
+
+STATIC GC_bool GC_stopped_mark(GC_stop_func stop_func);
+STATIC void GC_finish_collection(void);
+
+/*
+ * Initiate a garbage collection if appropriate.
+ * Choose judiciously
+ * between partial, full, and stop-world collections.
+ */
+STATIC void GC_maybe_gc(void)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+ ASSERT_CANCEL_DISABLED();
+ if (GC_should_collect()) {
+ static int n_partial_gcs = 0;
+
+ if (!GC_incremental) {
+ /* TODO: If possible, GC_default_stop_func should be used here */
+ GC_try_to_collect_inner(GC_never_stop_func);
+ n_partial_gcs = 0;
+ return;
+ } else {
+# ifdef PARALLEL_MARK
+ if (GC_parallel)
+ GC_wait_for_reclaim();
+# endif
+ if (GC_need_full_gc || n_partial_gcs >= GC_full_freq) {
+ GC_COND_LOG_PRINTF(
+ "***>Full mark for collection #%lu after %lu allocd bytes\n",
+ (unsigned long)GC_gc_no + 1, (unsigned long)GC_bytes_allocd);
+ GC_promote_black_lists();
+ (void)GC_reclaim_all((GC_stop_func)0, TRUE);
+ GC_notify_full_gc();
+ GC_clear_marks();
+ n_partial_gcs = 0;
+ GC_is_full_gc = TRUE;
+ } else {
+ n_partial_gcs++;
+ }
+ }
+ /* We try to mark with the world stopped. */
+ /* If we run out of time, this turns into */
+ /* incremental marking. */
+# ifndef NO_CLOCK
+ if (GC_time_limit != GC_TIME_UNLIMITED) { GET_TIME(GC_start_time); }
+# endif
+ /* TODO: If possible, GC_default_stop_func should be */
+ /* used instead of GC_never_stop_func here. */
+ if (GC_stopped_mark(GC_time_limit == GC_TIME_UNLIMITED?
+ GC_never_stop_func : GC_timeout_stop_func)) {
+ SAVE_CALLERS_TO_LAST_STACK();
+ GC_finish_collection();
+ } else {
+ if (!GC_is_full_gc) {
+ /* Count this as the first attempt */
+ GC_n_attempts++;
+ }
+ }
+ }
+}
+
+STATIC GC_on_collection_event_proc GC_on_collection_event = 0;
+
+GC_API void GC_CALL GC_set_on_collection_event(GC_on_collection_event_proc fn)
+{
+ /* fn may be 0 (means no event notifier). */
+ DCL_LOCK_STATE;
+ LOCK();
+ GC_on_collection_event = fn;
+ UNLOCK();
+}
+
+GC_API GC_on_collection_event_proc GC_CALL GC_get_on_collection_event(void)
+{
+ GC_on_collection_event_proc fn;
+ DCL_LOCK_STATE;
+ LOCK();
+ fn = GC_on_collection_event;
+ UNLOCK();
+ return fn;
+}
+
+/* Stop the world garbage collection. If stop_func is not */
+/* GC_never_stop_func then abort if stop_func returns TRUE. */
+/* Return TRUE if we successfully completed the collection. */
+GC_INNER GC_bool GC_try_to_collect_inner(GC_stop_func stop_func)
+{
+# ifndef NO_CLOCK
+ CLOCK_TYPE start_time = CLOCK_TYPE_INITIALIZER;
+ GC_bool start_time_valid;
+# endif
+
+ ASSERT_CANCEL_DISABLED();
+ GC_ASSERT(I_HOLD_LOCK());
+ if (GC_dont_gc || (*stop_func)()) return FALSE;
+ if (GC_on_collection_event)
+ GC_on_collection_event(GC_EVENT_START);
+ if (GC_incremental && GC_collection_in_progress()) {
+ GC_COND_LOG_PRINTF(
+ "GC_try_to_collect_inner: finishing collection in progress\n");
+ /* Just finish collection already in progress. */
+ while(GC_collection_in_progress()) {
+ if ((*stop_func)()) {
+ /* TODO: Notify GC_EVENT_ABANDON */
+ return(FALSE);
+ }
+ ENTER_GC();
+ GC_collect_a_little_inner(1);
+ EXIT_GC();
+ }
+ }
+ GC_notify_full_gc();
+# ifndef NO_CLOCK
+ start_time_valid = FALSE;
+ if ((GC_print_stats | (int)measure_performance) != 0) {
+ if (GC_print_stats)
+ GC_log_printf("Initiating full world-stop collection!\n");
+ start_time_valid = TRUE;
+ GET_TIME(start_time);
+ }
+# endif
+ GC_promote_black_lists();
+ /* Make sure all blocks have been reclaimed, so sweep routines */
+ /* don't see cleared mark bits. */
+ /* If we're guaranteed to finish, then this is unnecessary. */
+ /* In the find_leak case, we have to finish to guarantee that */
+ /* previously unmarked objects are not reported as leaks. */
+# ifdef PARALLEL_MARK
+ if (GC_parallel)
+ GC_wait_for_reclaim();
+# endif
+ if ((GC_find_leak || stop_func != GC_never_stop_func)
+ && !GC_reclaim_all(stop_func, FALSE)) {
+ /* Aborted. So far everything is still consistent. */
+ /* TODO: Notify GC_EVENT_ABANDON */
+ return(FALSE);
+ }
+ GC_invalidate_mark_state(); /* Flush mark stack. */
+ GC_clear_marks();
+ SAVE_CALLERS_TO_LAST_STACK();
+ GC_is_full_gc = TRUE;
+ if (!GC_stopped_mark(stop_func)) {
+ if (!GC_incremental) {
+ /* We're partially done and have no way to complete or use */
+ /* current work. Reestablish invariants as cheaply as */
+ /* possible. */
+ GC_invalidate_mark_state();
+ GC_unpromote_black_lists();
+ } /* else we claim the world is already still consistent. We'll */
+ /* finish incrementally. */
+ /* TODO: Notify GC_EVENT_ABANDON */
+ return(FALSE);
+ }
+ GC_finish_collection();
+# ifndef NO_CLOCK
+ if (start_time_valid) {
+ CLOCK_TYPE current_time;
+ unsigned long time_diff, ns_frac_diff;
+
+ GET_TIME(current_time);
+ time_diff = MS_TIME_DIFF(current_time, start_time);
+ ns_frac_diff = NS_FRAC_TIME_DIFF(current_time, start_time);
+ if (measure_performance) {
+ full_gc_total_time += time_diff; /* may wrap */
+ full_gc_total_ns_frac += (unsigned)ns_frac_diff;
+ if (full_gc_total_ns_frac >= 1000000U) {
+ /* Overflow of the nanoseconds part. */
+ full_gc_total_ns_frac -= 1000000U;
+ full_gc_total_time++;
+ }
+ }
+ if (GC_print_stats)
+ GC_log_printf("Complete collection took %lu ms %lu ns\n",
+ time_diff, ns_frac_diff);
+ }
+# endif
+ if (GC_on_collection_event)
+ GC_on_collection_event(GC_EVENT_END);
+ return(TRUE);
+}
+
+/* The number of extra calls to GC_mark_some that we have made. */
+STATIC int GC_deficit = 0;
+
+/* The default value of GC_rate. */
+#ifndef GC_RATE
+# define GC_RATE 10
+#endif
+
+/* When GC_collect_a_little_inner() performs n units of GC work, a unit */
+/* is intended to touch roughly GC_rate pages. (But, every once in */
+/* a while, we do more than that.) This needs to be a fairly large */
+/* number with our current incremental GC strategy, since otherwise we */
+/* allocate too much during GC, and the cleanup gets expensive. */
+STATIC int GC_rate = GC_RATE;
+
+GC_API void GC_CALL GC_set_rate(int value)
+{
+ GC_ASSERT(value > 0);
+ GC_rate = value;
+}
+
+GC_API int GC_CALL GC_get_rate(void)
+{
+ return GC_rate;
+}
+
+/* The default maximum number of prior attempts at world stop marking. */
+#ifndef MAX_PRIOR_ATTEMPTS
+# define MAX_PRIOR_ATTEMPTS 1
+#endif
+
+/* The maximum number of prior attempts at world stop marking. */
+/* A value of 1 means that we finish the second time, no matter how */
+/* long it takes. Does not count the initial root scan for a full GC. */
+static int max_prior_attempts = MAX_PRIOR_ATTEMPTS;
+
+GC_API void GC_CALL GC_set_max_prior_attempts(int value)
+{
+ GC_ASSERT(value >= 0);
+ max_prior_attempts = value;
+}
+
+GC_API int GC_CALL GC_get_max_prior_attempts(void)
+{
+ return max_prior_attempts;
+}
+
+GC_INNER void GC_collect_a_little_inner(int n)
+{
+ IF_CANCEL(int cancel_state;)
+
+ GC_ASSERT(I_HOLD_LOCK());
+ DISABLE_CANCEL(cancel_state);
+ if (GC_incremental && GC_collection_in_progress()) {
+ int i;
+ int max_deficit = GC_rate * n;
+
+# ifdef PARALLEL_MARK
+ if (GC_time_limit != GC_TIME_UNLIMITED)
+ GC_parallel_mark_disabled = TRUE;
+# endif
+ for (i = GC_deficit; i < max_deficit; i++) {
+ if (GC_mark_some(NULL))
+ break;
+ }
+# ifdef PARALLEL_MARK
+ GC_parallel_mark_disabled = FALSE;
+# endif
+
+ if (i < max_deficit && !GC_dont_gc) {
+ /* Need to finish a collection. */
+ SAVE_CALLERS_TO_LAST_STACK();
+# ifdef PARALLEL_MARK
+ if (GC_parallel)
+ GC_wait_for_reclaim();
+# endif
+ if (GC_n_attempts < max_prior_attempts
+ && GC_time_limit != GC_TIME_UNLIMITED) {
+# ifndef NO_CLOCK
+ GET_TIME(GC_start_time);
+# endif
+ if (GC_stopped_mark(GC_timeout_stop_func)) {
+ GC_finish_collection();
+ } else {
+ GC_n_attempts++;
+ }
+ } else {
+ /* TODO: If possible, GC_default_stop_func should be */
+ /* used here. */
+ (void)GC_stopped_mark(GC_never_stop_func);
+ GC_finish_collection();
+ }
+ }
+ if (GC_deficit > 0) {
+ GC_deficit -= max_deficit;
+ if (GC_deficit < 0)
+ GC_deficit = 0;
+ }
+ } else if (!GC_dont_gc) {
+ GC_maybe_gc();
+ }
+ RESTORE_CANCEL(cancel_state);
+}
+
+GC_INNER void (*GC_check_heap)(void) = 0;
+GC_INNER void (*GC_print_all_smashed)(void) = 0;
+
+GC_API int GC_CALL GC_collect_a_little(void)
+{
+ int result;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ if (!GC_dont_gc) {
+ ENTER_GC();
+ GC_collect_a_little_inner(1);
+ EXIT_GC();
+ }
+ result = (int)GC_collection_in_progress();
+ UNLOCK();
+ if (!result && GC_debugging_started) GC_print_all_smashed();
+ return(result);
+}
+
+#ifndef NO_CLOCK
+ /* Variables for world-stop average delay time statistic computation. */
+ /* "divisor" is incremented every world-stop and halved when reached */
+ /* its maximum (or upon "total_time" overflow). */
+ static unsigned world_stopped_total_time = 0;
+ static unsigned world_stopped_total_divisor = 0;
+# ifndef MAX_TOTAL_TIME_DIVISOR
+ /* We shall not use big values here (so "outdated" delay time */
+ /* values would have less impact on "average" delay time value than */
+ /* newer ones). */
+# define MAX_TOTAL_TIME_DIVISOR 1000
+# endif
+#endif /* !NO_CLOCK */
+
+#ifdef USE_MUNMAP
+# define IF_USE_MUNMAP(x) x
+# define COMMA_IF_USE_MUNMAP(x) /* comma */, x
+#else
+# define IF_USE_MUNMAP(x) /* empty */
+# define COMMA_IF_USE_MUNMAP(x) /* empty */
+#endif
+
+/*
+ * We stop the world and mark from all roots.
+ * If stop_func() ever returns TRUE, we may fail and return FALSE.
+ * Increment GC_gc_no if we succeed.
+ */
+STATIC GC_bool GC_stopped_mark(GC_stop_func stop_func)
+{
+ int i;
+# ifndef NO_CLOCK
+ CLOCK_TYPE start_time = CLOCK_TYPE_INITIALIZER;
+# endif
+
+ GC_ASSERT(I_HOLD_LOCK());
+# if !defined(REDIRECT_MALLOC) && defined(USE_WINALLOC)
+ GC_add_current_malloc_heap();
+# endif
+# if defined(REGISTER_LIBRARIES_EARLY)
+ GC_cond_register_dynamic_libraries();
+# endif
+
+# ifndef NO_CLOCK
+ if (GC_PRINT_STATS_FLAG)
+ GET_TIME(start_time);
+# endif
+
+# if !defined(GC_NO_FINALIZATION) && !defined(GC_TOGGLE_REFS_NOT_NEEDED)
+ GC_process_togglerefs();
+# endif
+# ifdef THREADS
+ if (GC_on_collection_event)
+ GC_on_collection_event(GC_EVENT_PRE_STOP_WORLD);
+# endif
+ STOP_WORLD();
+# ifdef THREADS
+ if (GC_on_collection_event)
+ GC_on_collection_event(GC_EVENT_POST_STOP_WORLD);
+# endif
+
+# ifdef THREAD_LOCAL_ALLOC
+ GC_world_stopped = TRUE;
+# endif
+ /* Output blank line for convenience here */
+ GC_COND_LOG_PRINTF(
+ "\n--> Marking for collection #%lu after %lu allocated bytes\n",
+ (unsigned long)GC_gc_no + 1, (unsigned long) GC_bytes_allocd);
+# ifdef MAKE_BACK_GRAPH
+ if (GC_print_back_height) {
+ GC_build_back_graph();
+ }
+# endif
+
+ /* Mark from all roots. */
+ if (GC_on_collection_event)
+ GC_on_collection_event(GC_EVENT_MARK_START);
+
+ /* Minimize junk left in my registers and on the stack */
+ GC_clear_a_few_frames();
+ GC_noop6(0,0,0,0,0,0);
+
+ GC_initiate_gc();
+# ifdef PARALLEL_MARK
+ if (stop_func != GC_never_stop_func)
+ GC_parallel_mark_disabled = TRUE;
+# endif
+ for (i = 0; !(*stop_func)(); i++) {
+ if (GC_mark_some(GC_approx_sp())) {
+# ifdef PARALLEL_MARK
+ if (GC_parallel && GC_parallel_mark_disabled) {
+ GC_COND_LOG_PRINTF("Stopped marking done after %d iterations"
+ " with disabled parallel marker\n", i);
+ }
+# endif
+ i = -1;
+ break;
+ }
+ }
+# ifdef PARALLEL_MARK
+ GC_parallel_mark_disabled = FALSE;
+# endif
+
+ if (i >= 0) {
+ GC_COND_LOG_PRINTF("Abandoned stopped marking after"
+ " %d iterations\n", i);
+ GC_deficit = i; /* Give the mutator a chance. */
+# ifdef THREAD_LOCAL_ALLOC
+ GC_world_stopped = FALSE;
+# endif
+
+# ifdef THREADS
+ if (GC_on_collection_event)
+ GC_on_collection_event(GC_EVENT_PRE_START_WORLD);
+# endif
+
+ START_WORLD();
+
+# ifdef THREADS
+ if (GC_on_collection_event)
+ GC_on_collection_event(GC_EVENT_POST_START_WORLD);
+# endif
+
+ /* TODO: Notify GC_EVENT_MARK_ABANDON */
+ return FALSE;
+ }
+
+ GC_gc_no++;
+# ifdef USE_MUNMAP
+ GC_ASSERT(GC_heapsize >= GC_unmapped_bytes);
+# endif
+ GC_ASSERT(GC_our_mem_bytes >= GC_heapsize);
+ GC_DBGLOG_PRINTF("GC #%lu freed %ld bytes, heap %lu KiB ("
+ IF_USE_MUNMAP("+ %lu KiB unmapped ")
+ "+ %lu KiB internal)\n",
+ (unsigned long)GC_gc_no, (long)GC_bytes_found,
+ TO_KiB_UL(GC_heapsize - GC_unmapped_bytes) /*, */
+ COMMA_IF_USE_MUNMAP(TO_KiB_UL(GC_unmapped_bytes)),
+ TO_KiB_UL(GC_our_mem_bytes - GC_heapsize));
+
+ /* Check all debugged objects for consistency */
+ if (GC_debugging_started) {
+ (*GC_check_heap)();
+ }
+ if (GC_on_collection_event) {
+ GC_on_collection_event(GC_EVENT_MARK_END);
+# ifdef THREADS
+ GC_on_collection_event(GC_EVENT_PRE_START_WORLD);
+# endif
+ }
+# ifdef THREAD_LOCAL_ALLOC
+ GC_world_stopped = FALSE;
+# endif
+
+ START_WORLD();
+
+# ifdef THREADS
+ if (GC_on_collection_event)
+ GC_on_collection_event(GC_EVENT_POST_START_WORLD);
+# endif
+
+# ifndef NO_CLOCK
+ if (GC_PRINT_STATS_FLAG) {
+ unsigned long time_diff;
+ unsigned total_time, divisor;
+ CLOCK_TYPE current_time;
+
+ GET_TIME(current_time);
+ time_diff = MS_TIME_DIFF(current_time,start_time);
+
+ /* Compute new world-stop delay total time */
+ total_time = world_stopped_total_time;
+ divisor = world_stopped_total_divisor;
+ if ((int)total_time < 0 || divisor >= MAX_TOTAL_TIME_DIVISOR) {
+ /* Halve values if overflow occurs */
+ total_time >>= 1;
+ divisor >>= 1;
+ }
+ total_time += time_diff < (((unsigned)-1) >> 1) ?
+ (unsigned)time_diff : ((unsigned)-1) >> 1;
+ /* Update old world_stopped_total_time and its divisor */
+ world_stopped_total_time = total_time;
+ world_stopped_total_divisor = ++divisor;
+
+ GC_ASSERT(divisor != 0);
+ GC_log_printf("World-stopped marking took %lu ms %lu ns"
+ " (%u ms in average)\n",
+ time_diff, NS_FRAC_TIME_DIFF(current_time, start_time),
+ total_time / divisor);
+ }
+# endif
+ return(TRUE);
+}
+
+/* Set all mark bits for the free list whose first entry is q */
+GC_INNER void GC_set_fl_marks(ptr_t q)
+{
+ if (q /* != NULL */) { /* CPPCHECK */
+ struct hblk *h = HBLKPTR(q);
+ struct hblk *last_h = h;
+ hdr *hhdr = HDR(h);
+ IF_PER_OBJ(word sz = hhdr->hb_sz;)
+
+ for (;;) {
+ word bit_no = MARK_BIT_NO((ptr_t)q - (ptr_t)h, sz);
+
+ if (!mark_bit_from_hdr(hhdr, bit_no)) {
+ set_mark_bit_from_hdr(hhdr, bit_no);
+ ++hhdr -> hb_n_marks;
+ }
+
+ q = (ptr_t)obj_link(q);
+ if (q == NULL)
+ break;
+
+ h = HBLKPTR(q);
+ if (h != last_h) {
+ last_h = h;
+ hhdr = HDR(h);
+ IF_PER_OBJ(sz = hhdr->hb_sz;)
+ }
+ }
+ }
+}
+
+#if defined(GC_ASSERTIONS) && defined(THREAD_LOCAL_ALLOC)
+ /* Check that all mark bits for the free list whose first entry is */
+ /* (*pfreelist) are set. Check skipped if points to a special value. */
+ void GC_check_fl_marks(void **pfreelist)
+ {
+ /* TODO: There is a data race with GC_FAST_MALLOC_GRANS (which does */
+ /* not do atomic updates to the free-list). The race seems to be */
+ /* harmless, and for now we just skip this check in case of TSan. */
+# if defined(AO_HAVE_load_acquire_read) && !defined(THREAD_SANITIZER)
+ AO_t *list = (AO_t *)AO_load_acquire_read((AO_t *)pfreelist);
+ /* Atomic operations are used because the world is running. */
+ AO_t *prev;
+ AO_t *p;
+
+ if ((word)list <= HBLKSIZE) return;
+
+ prev = (AO_t *)pfreelist;
+ for (p = list; p != NULL;) {
+ AO_t *next;
+
+ if (!GC_is_marked(p)) {
+ ABORT_ARG2("Unmarked local free list entry",
+ ": object %p on list %p", (void *)p, (void *)list);
+ }
+
+ /* While traversing the free-list, it re-reads the pointer to */
+ /* the current node before accepting its next pointer and */
+ /* bails out if the latter has changed. That way, it won't */
+ /* try to follow the pointer which might be been modified */
+ /* after the object was returned to the client. It might */
+ /* perform the mark-check on the just allocated object but */
+ /* that should be harmless. */
+ next = (AO_t *)AO_load_acquire_read(p);
+ if (AO_load(prev) != (AO_t)p)
+ break;
+ prev = p;
+ p = next;
+ }
+# else
+ /* FIXME: Not implemented (just skipped). */
+ (void)pfreelist;
+# endif
+ }
+#endif /* GC_ASSERTIONS && THREAD_LOCAL_ALLOC */
+
+/* Clear all mark bits for the free list whose first entry is q */
+/* Decrement GC_bytes_found by number of bytes on free list. */
+STATIC void GC_clear_fl_marks(ptr_t q)
+{
+ struct hblk *h = HBLKPTR(q);
+ struct hblk *last_h = h;
+ hdr *hhdr = HDR(h);
+ word sz = hhdr->hb_sz; /* Normally set only once. */
+
+ for (;;) {
+ word bit_no = MARK_BIT_NO((ptr_t)q - (ptr_t)h, sz);
+
+ if (mark_bit_from_hdr(hhdr, bit_no)) {
+ size_t n_marks = hhdr -> hb_n_marks;
+
+ GC_ASSERT(n_marks != 0);
+ clear_mark_bit_from_hdr(hhdr, bit_no);
+ n_marks--;
+# ifdef PARALLEL_MARK
+ /* Appr. count, don't decrement to zero! */
+ if (0 != n_marks || !GC_parallel) {
+ hhdr -> hb_n_marks = n_marks;
+ }
+# else
+ hhdr -> hb_n_marks = n_marks;
+# endif
+ }
+ GC_bytes_found -= sz;
+
+ q = (ptr_t)obj_link(q);
+ if (q == NULL)
+ break;
+
+ h = HBLKPTR(q);
+ if (h != last_h) {
+ last_h = h;
+ hhdr = HDR(h);
+ sz = hhdr->hb_sz;
+ }
+ }
+}
+
+#if defined(GC_ASSERTIONS) && defined(THREAD_LOCAL_ALLOC)
+ void GC_check_tls(void);
+#endif
+
+GC_on_heap_resize_proc GC_on_heap_resize = 0;
+
+/* Used for logging only. */
+GC_INLINE int GC_compute_heap_usage_percent(void)
+{
+ word used = GC_composite_in_use + GC_atomic_in_use;
+ word heap_sz = GC_heapsize - GC_unmapped_bytes;
+# if defined(CPPCHECK)
+ word limit = (GC_WORD_MAX >> 1) / 50; /* to avoid a false positive */
+# else
+ const word limit = GC_WORD_MAX / 100;
+# endif
+
+ return used >= heap_sz ? 0 : used < limit ?
+ (int)((used * 100) / heap_sz) : (int)(used / (heap_sz / 100));
+}
+
+/* Finish up a collection. Assumes mark bits are consistent, lock is */
+/* held, but the world is otherwise running. */
+STATIC void GC_finish_collection(void)
+{
+# ifndef NO_CLOCK
+ CLOCK_TYPE start_time = CLOCK_TYPE_INITIALIZER;
+ CLOCK_TYPE finalize_time = CLOCK_TYPE_INITIALIZER;
+# endif
+
+ GC_ASSERT(I_HOLD_LOCK());
+# if defined(GC_ASSERTIONS) \
+ && defined(THREAD_LOCAL_ALLOC) && !defined(DBG_HDRS_ALL)
+ /* Check that we marked some of our own data. */
+ /* TODO: Add more checks. */
+ GC_check_tls();
+# endif
+
+# ifndef NO_CLOCK
+ if (GC_print_stats)
+ GET_TIME(start_time);
+# endif
+ if (GC_on_collection_event)
+ GC_on_collection_event(GC_EVENT_RECLAIM_START);
+
+# ifndef GC_GET_HEAP_USAGE_NOT_NEEDED
+ if (GC_bytes_found > 0)
+ GC_reclaimed_bytes_before_gc += (word)GC_bytes_found;
+# endif
+ GC_bytes_found = 0;
+# if defined(LINUX) && defined(__ELF__) && !defined(SMALL_CONFIG)
+ if (GETENV("GC_PRINT_ADDRESS_MAP") != 0) {
+ GC_print_address_map();
+ }
+# endif
+ COND_DUMP;
+ if (GC_find_leak) {
+ /* Mark all objects on the free list. All objects should be */
+ /* marked when we're done. */
+ word size; /* current object size */
+ unsigned kind;
+ ptr_t q;
+
+ for (kind = 0; kind < GC_n_kinds; kind++) {
+ for (size = 1; size <= MAXOBJGRANULES; size++) {
+ q = (ptr_t)GC_obj_kinds[kind].ok_freelist[size];
+ if (q != NULL)
+ GC_set_fl_marks(q);
+ }
+ }
+ GC_start_reclaim(TRUE);
+ /* The above just checks; it doesn't really reclaim anything. */
+ }
+
+# ifndef GC_NO_FINALIZATION
+ GC_finalize();
+# endif
+# ifndef NO_CLOCK
+ if (GC_print_stats)
+ GET_TIME(finalize_time);
+# endif
+
+ if (GC_print_back_height) {
+# ifdef MAKE_BACK_GRAPH
+ GC_traverse_back_graph();
+# elif !defined(SMALL_CONFIG)
+ GC_err_printf("Back height not available: "
+ "Rebuild collector with -DMAKE_BACK_GRAPH\n");
+# endif
+ }
+
+ /* Clear free list mark bits, in case they got accidentally marked */
+ /* (or GC_find_leak is set and they were intentionally marked). */
+ /* Also subtract memory remaining from GC_bytes_found count. */
+ /* Note that composite objects on free list are cleared. */
+ /* Thus accidentally marking a free list is not a problem; only */
+ /* objects on the list itself will be marked, and that's fixed here. */
+ {
+ word size; /* current object size */
+ ptr_t q; /* pointer to current object */
+ unsigned kind;
+
+ for (kind = 0; kind < GC_n_kinds; kind++) {
+ for (size = 1; size <= MAXOBJGRANULES; size++) {
+ q = (ptr_t)GC_obj_kinds[kind].ok_freelist[size];
+ if (q != NULL)
+ GC_clear_fl_marks(q);
+ }
+ }
+ }
+
+ GC_VERBOSE_LOG_PRINTF("Bytes recovered before sweep - f.l. count = %ld\n",
+ (long)GC_bytes_found);
+
+ /* Reconstruct free lists to contain everything not marked */
+ GC_start_reclaim(FALSE);
+ GC_DBGLOG_PRINTF("In-use heap: %d%% (%lu KiB pointers + %lu KiB other)\n",
+ GC_compute_heap_usage_percent(),
+ TO_KiB_UL(GC_composite_in_use),
+ TO_KiB_UL(GC_atomic_in_use));
+ if (GC_is_full_gc) {
+ GC_used_heap_size_after_full = USED_HEAP_SIZE;
+ GC_need_full_gc = FALSE;
+ } else {
+ GC_need_full_gc = USED_HEAP_SIZE - GC_used_heap_size_after_full
+ > min_bytes_allocd();
+ }
+
+ GC_VERBOSE_LOG_PRINTF("Immediately reclaimed %ld bytes, heapsize:"
+ " %lu bytes" IF_USE_MUNMAP(" (%lu unmapped)") "\n",
+ (long)GC_bytes_found,
+ (unsigned long)GC_heapsize /*, */
+ COMMA_IF_USE_MUNMAP((unsigned long)
+ GC_unmapped_bytes));
+
+ /* Reset or increment counters for next cycle */
+ GC_n_attempts = 0;
+ GC_is_full_gc = FALSE;
+ GC_bytes_allocd_before_gc += GC_bytes_allocd;
+ GC_non_gc_bytes_at_gc = GC_non_gc_bytes;
+ GC_bytes_allocd = 0;
+ GC_bytes_dropped = 0;
+ GC_bytes_freed = 0;
+ GC_finalizer_bytes_freed = 0;
+
+ IF_USE_MUNMAP(GC_unmap_old());
+
+ if (GC_on_collection_event)
+ GC_on_collection_event(GC_EVENT_RECLAIM_END);
+# ifndef NO_CLOCK
+ if (GC_print_stats) {
+ CLOCK_TYPE done_time;
+
+ GET_TIME(done_time);
+# if !defined(SMALL_CONFIG) && !defined(GC_NO_FINALIZATION)
+ /* A convenient place to output finalization statistics. */
+ GC_print_finalization_stats();
+# endif
+ GC_log_printf("Finalize and initiate sweep took %lu ms %lu ns"
+ " + %lu ms %lu ns\n",
+ MS_TIME_DIFF(finalize_time, start_time),
+ NS_FRAC_TIME_DIFF(finalize_time, start_time),
+ MS_TIME_DIFF(done_time, finalize_time),
+ NS_FRAC_TIME_DIFF(done_time, finalize_time));
+ }
+# elif !defined(SMALL_CONFIG) && !defined(GC_NO_FINALIZATION)
+ if (GC_print_stats)
+ GC_print_finalization_stats();
+# endif
+}
+
+STATIC word GC_heapsize_at_forced_unmap = 0;
+ /* accessed with the allocation lock held */
+
+/* If stop_func == 0 then GC_default_stop_func is used instead. */
+STATIC GC_bool GC_try_to_collect_general(GC_stop_func stop_func,
+ GC_bool force_unmap)
+{
+ GC_bool result;
+ IF_USE_MUNMAP(int old_unmap_threshold;)
+ IF_CANCEL(int cancel_state;)
+ DCL_LOCK_STATE;
+
+ if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
+ if (GC_debugging_started) GC_print_all_smashed();
+ GC_INVOKE_FINALIZERS();
+ LOCK();
+ if (force_unmap) {
+ /* Record current heap size to make heap growth more conservative */
+ /* afterwards (as if the heap is growing from zero size again). */
+ GC_heapsize_at_forced_unmap = GC_heapsize;
+ }
+ DISABLE_CANCEL(cancel_state);
+# ifdef USE_MUNMAP
+ old_unmap_threshold = GC_unmap_threshold;
+ if (force_unmap ||
+ (GC_force_unmap_on_gcollect && old_unmap_threshold > 0))
+ GC_unmap_threshold = 1; /* unmap as much as possible */
+# endif
+ ENTER_GC();
+ /* Minimize junk left in my registers */
+ GC_noop6(0,0,0,0,0,0);
+ result = GC_try_to_collect_inner(stop_func != 0 ? stop_func :
+ GC_default_stop_func);
+ EXIT_GC();
+ IF_USE_MUNMAP(GC_unmap_threshold = old_unmap_threshold); /* restore */
+ RESTORE_CANCEL(cancel_state);
+ UNLOCK();
+ if (result) {
+ if (GC_debugging_started) GC_print_all_smashed();
+ GC_INVOKE_FINALIZERS();
+ }
+ return(result);
+}
+
+/* Externally callable routines to invoke full, stop-the-world collection. */
+
+GC_API int GC_CALL GC_try_to_collect(GC_stop_func stop_func)
+{
+ GC_ASSERT(NONNULL_ARG_NOT_NULL(stop_func));
+ return (int)GC_try_to_collect_general(stop_func, FALSE);
+}
+
+GC_API void GC_CALL GC_gcollect(void)
+{
+ /* 0 is passed as stop_func to get GC_default_stop_func value */
+ /* while holding the allocation lock (to prevent data races). */
+ (void)GC_try_to_collect_general(0, FALSE);
+ if (get_have_errors())
+ GC_print_all_errors();
+}
+
+GC_API void GC_CALL GC_gcollect_and_unmap(void)
+{
+ /* Collect and force memory unmapping to OS. */
+ (void)GC_try_to_collect_general(GC_never_stop_func, TRUE);
+}
+
+#ifdef USE_PROC_FOR_LIBRARIES
+ /* Add HBLKSIZE aligned, GET_MEM-generated block to GC_our_memory. */
+ GC_INNER void GC_add_to_our_memory(ptr_t p, size_t bytes)
+ {
+ GC_ASSERT(p != NULL);
+ if (GC_n_memory >= MAX_HEAP_SECTS)
+ ABORT("Too many GC-allocated memory sections: Increase MAX_HEAP_SECTS");
+ GC_our_memory[GC_n_memory].hs_start = p;
+ GC_our_memory[GC_n_memory].hs_bytes = bytes;
+ GC_n_memory++;
+ GC_our_mem_bytes += bytes;
+ }
+#endif
+
+/* Use the chunk of memory starting at p of size bytes as part of the heap. */
+/* Assumes p is HBLKSIZE aligned, bytes argument is a multiple of HBLKSIZE. */
+STATIC void GC_add_to_heap(struct hblk *p, size_t bytes)
+{
+ hdr * phdr;
+ word endp;
+ size_t old_capacity = 0;
+ void *old_heap_sects = NULL;
+# ifdef GC_ASSERTIONS
+ unsigned i;
+# endif
+
+ GC_ASSERT((word)p % HBLKSIZE == 0);
+ GC_ASSERT(bytes % HBLKSIZE == 0);
+ GC_ASSERT(bytes > 0);
+ GC_ASSERT(GC_all_nils != NULL);
+
+ if (GC_n_heap_sects == GC_capacity_heap_sects) {
+ /* Allocate new GC_heap_sects with sufficient capacity. */
+# ifndef INITIAL_HEAP_SECTS
+# define INITIAL_HEAP_SECTS 32
+# endif
+ size_t new_capacity = GC_n_heap_sects > 0 ?
+ (size_t)GC_n_heap_sects * 2 : INITIAL_HEAP_SECTS;
+ void *new_heap_sects =
+ GC_scratch_alloc(new_capacity * sizeof(struct HeapSect));
+
+ if (EXPECT(NULL == new_heap_sects, FALSE)) {
+ /* Retry with smaller yet sufficient capacity. */
+ new_capacity = (size_t)GC_n_heap_sects + INITIAL_HEAP_SECTS;
+ new_heap_sects =
+ GC_scratch_alloc(new_capacity * sizeof(struct HeapSect));
+ if (NULL == new_heap_sects)
+ ABORT("Insufficient memory for heap sections");
+ }
+ old_capacity = GC_capacity_heap_sects;
+ old_heap_sects = GC_heap_sects;
+ /* Transfer GC_heap_sects contents to the newly allocated array. */
+ if (GC_n_heap_sects > 0)
+ BCOPY(old_heap_sects, new_heap_sects,
+ GC_n_heap_sects * sizeof(struct HeapSect));
+ GC_capacity_heap_sects = new_capacity;
+ GC_heap_sects = (struct HeapSect *)new_heap_sects;
+ GC_COND_LOG_PRINTF("Grew heap sections array to %lu elements\n",
+ (unsigned long)new_capacity);
+ }
+
+ while ((word)p <= HBLKSIZE) {
+ /* Can't handle memory near address zero. */
+ ++p;
+ bytes -= HBLKSIZE;
+ if (0 == bytes) return;
+ }
+ endp = (word)p + bytes;
+ while (endp <= (word)p) {
+ /* Address wrapped. */
+ bytes -= HBLKSIZE;
+ if (0 == bytes) return;
+ endp -= HBLKSIZE;
+ }
+ phdr = GC_install_header(p);
+ if (0 == phdr) {
+ /* This is extremely unlikely. Can't add it. This will */
+ /* almost certainly result in a 0 return from the allocator, */
+ /* which is entirely appropriate. */
+ return;
+ }
+ GC_ASSERT(endp > (word)p && endp == (word)p + bytes);
+# ifdef GC_ASSERTIONS
+ /* Ensure no intersection between sections. */
+ for (i = 0; i < GC_n_heap_sects; i++) {
+ word hs_start = (word)GC_heap_sects[i].hs_start;
+ word hs_end = hs_start + GC_heap_sects[i].hs_bytes;
+ word p_e = (word)p + bytes;
+
+ GC_ASSERT(!((hs_start <= (word)p && (word)p < hs_end)
+ || (hs_start < p_e && p_e <= hs_end)
+ || ((word)p < hs_start && hs_end < p_e)));
+ }
+# endif
+ GC_heap_sects[GC_n_heap_sects].hs_start = (ptr_t)p;
+ GC_heap_sects[GC_n_heap_sects].hs_bytes = bytes;
+ GC_n_heap_sects++;
+ phdr -> hb_sz = bytes;
+ phdr -> hb_flags = 0;
+ GC_freehblk(p);
+ GC_heapsize += bytes;
+
+ /* Normally the caller calculates a new GC_collect_at_heapsize,
+ * but this is also called directly from GC_scratch_recycle_inner, so
+ * adjust here. It will be recalculated when called from
+ * GC_expand_hp_inner.
+ */
+ GC_collect_at_heapsize += bytes;
+ if (GC_collect_at_heapsize < GC_heapsize /* wrapped */)
+ GC_collect_at_heapsize = GC_WORD_MAX;
+
+ if ((word)p <= (word)GC_least_plausible_heap_addr
+ || GC_least_plausible_heap_addr == 0) {
+ GC_least_plausible_heap_addr = (void *)((ptr_t)p - sizeof(word));
+ /* Making it a little smaller than necessary prevents */
+ /* us from getting a false hit from the variable */
+ /* itself. There's some unintentional reflection */
+ /* here. */
+ }
+ if ((word)p + bytes >= (word)GC_greatest_plausible_heap_addr) {
+ GC_greatest_plausible_heap_addr = (void *)endp;
+ }
+# ifdef SET_REAL_HEAP_BOUNDS
+ if ((word)p < GC_least_real_heap_addr
+ || EXPECT(0 == GC_least_real_heap_addr, FALSE))
+ GC_least_real_heap_addr = (word)p - sizeof(word);
+ if (endp > GC_greatest_real_heap_addr) {
+# ifdef INCLUDE_LINUX_THREAD_DESCR
+ /* Avoid heap intersection with the static data roots. */
+ GC_exclude_static_roots_inner((void *)p, (void *)endp);
+# endif
+ GC_greatest_real_heap_addr = endp;
+ }
+# endif
+ GC_handle_protected_regions_limit();
+ if (old_capacity > 0) {
+# ifndef GWW_VDB
+ /* Recycling may call GC_add_to_heap() again but should not */
+ /* cause resizing of GC_heap_sects. */
+ GC_scratch_recycle_no_gww(old_heap_sects,
+ old_capacity * sizeof(struct HeapSect));
+# else
+ /* TODO: implement GWW-aware recycling as in alloc_mark_stack */
+ GC_noop1((word)old_heap_sects);
+# endif
+ }
+}
+
+#if !defined(NO_DEBUGGING)
+ void GC_print_heap_sects(void)
+ {
+ unsigned i;
+
+ GC_printf("Total heap size: %lu" IF_USE_MUNMAP(" (%lu unmapped)") "\n",
+ (unsigned long)GC_heapsize /*, */
+ COMMA_IF_USE_MUNMAP((unsigned long)GC_unmapped_bytes));
+
+ for (i = 0; i < GC_n_heap_sects; i++) {
+ ptr_t start = GC_heap_sects[i].hs_start;
+ size_t len = GC_heap_sects[i].hs_bytes;
+ struct hblk *h;
+ unsigned nbl = 0;
+
+ for (h = (struct hblk *)start; (word)h < (word)(start + len); h++) {
+ if (GC_is_black_listed(h, HBLKSIZE)) nbl++;
+ }
+ GC_printf("Section %d from %p to %p %u/%lu blacklisted\n",
+ i, (void *)start, (void *)&start[len],
+ nbl, (unsigned long)divHBLKSZ(len));
+ }
+ }
+#endif
+
+void * GC_least_plausible_heap_addr = (void *)GC_WORD_MAX;
+void * GC_greatest_plausible_heap_addr = 0;
+
+GC_INLINE word GC_max(word x, word y)
+{
+ return(x > y? x : y);
+}
+
+GC_INLINE word GC_min(word x, word y)
+{
+ return(x < y? x : y);
+}
+
+STATIC word GC_max_heapsize = 0;
+
+GC_API void GC_CALL GC_set_max_heap_size(GC_word n)
+{
+ GC_max_heapsize = n;
+}
+
+GC_word GC_max_retries = 0;
+
+GC_INNER void GC_scratch_recycle_inner(void *ptr, size_t bytes)
+{
+ size_t page_offset;
+ size_t displ = 0;
+ size_t recycled_bytes;
+
+ if (NULL == ptr) return;
+
+ GC_ASSERT(bytes != 0);
+ GC_ASSERT(GC_page_size != 0);
+ /* TODO: Assert correct memory flags if GWW_VDB */
+ page_offset = (word)ptr & (GC_page_size - 1);
+ if (page_offset != 0)
+ displ = GC_page_size - page_offset;
+ recycled_bytes = bytes > displ ? (bytes - displ) & ~(GC_page_size - 1) : 0;
+ GC_COND_LOG_PRINTF("Recycle %lu/%lu scratch-allocated bytes at %p\n",
+ (unsigned long)recycled_bytes, (unsigned long)bytes, ptr);
+ if (recycled_bytes > 0)
+ GC_add_to_heap((struct hblk *)((word)ptr + displ), recycled_bytes);
+}
+
+/* This explicitly increases the size of the heap. It is used */
+/* internally, but may also be invoked from GC_expand_hp by the user. */
+/* The argument is in units of HBLKSIZE (tiny values are rounded up). */
+/* Returns FALSE on failure. */
+GC_INNER GC_bool GC_expand_hp_inner(word n)
+{
+ size_t bytes;
+ struct hblk * space;
+ word expansion_slop; /* Number of bytes by which we expect */
+ /* the heap to expand soon. */
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_ASSERT(GC_page_size != 0);
+ if (n < MINHINCR) n = MINHINCR;
+ bytes = ROUNDUP_PAGESIZE((size_t)n * HBLKSIZE);
+ if (GC_max_heapsize != 0
+ && (GC_max_heapsize < (word)bytes
+ || GC_heapsize > GC_max_heapsize - (word)bytes)) {
+ /* Exceeded self-imposed limit */
+ return(FALSE);
+ }
+ space = GET_MEM(bytes);
+ if (EXPECT(NULL == space, FALSE)) {
+ WARN("Failed to expand heap by %" WARN_PRIuPTR " KiB\n", bytes >> 10);
+ return(FALSE);
+ }
+ GC_add_to_our_memory((ptr_t)space, bytes);
+ GC_INFOLOG_PRINTF("Grow heap to %lu KiB after %lu bytes allocated\n",
+ TO_KiB_UL(GC_heapsize + bytes),
+ (unsigned long)GC_bytes_allocd);
+
+ /* Adjust heap limits generously for blacklisting to work better. */
+ /* GC_add_to_heap performs minimal adjustment needed for */
+ /* correctness. */
+ expansion_slop = min_bytes_allocd() + 4 * MAXHINCR * HBLKSIZE;
+ if ((GC_last_heap_addr == 0 && !((word)space & SIGNB))
+ || (GC_last_heap_addr != 0
+ && (word)GC_last_heap_addr < (word)space)) {
+ /* Assume the heap is growing up. */
+ word new_limit = (word)space + (word)bytes + expansion_slop;
+ if (new_limit > (word)space) {
+ GC_greatest_plausible_heap_addr =
+ (void *)GC_max((word)GC_greatest_plausible_heap_addr,
+ (word)new_limit);
+ }
+ } else {
+ /* Heap is growing down. */
+ word new_limit = (word)space - expansion_slop;
+ if (new_limit < (word)space) {
+ GC_least_plausible_heap_addr =
+ (void *)GC_min((word)GC_least_plausible_heap_addr,
+ (word)space - expansion_slop);
+ }
+ }
+ GC_last_heap_addr = (ptr_t)space;
+
+ GC_add_to_heap(space, bytes);
+
+ /* Force GC before we are likely to allocate past expansion_slop. */
+ GC_collect_at_heapsize =
+ GC_heapsize + expansion_slop - 2 * MAXHINCR * HBLKSIZE;
+ if (GC_collect_at_heapsize < GC_heapsize /* wrapped */)
+ GC_collect_at_heapsize = GC_WORD_MAX;
+ if (GC_on_heap_resize)
+ (*GC_on_heap_resize)(GC_heapsize);
+
+ return(TRUE);
+}
+
+/* Really returns a bool, but it's externally visible, so that's clumsy. */
+/* The argument is in bytes. Includes GC_init() call. */
+GC_API int GC_CALL GC_expand_hp(size_t bytes)
+{
+ int result;
+ DCL_LOCK_STATE;
+
+ if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
+ LOCK();
+ result = (int)GC_expand_hp_inner(divHBLKSZ((word)bytes));
+ if (result) GC_requested_heapsize += bytes;
+ UNLOCK();
+ return(result);
+}
+
+GC_INNER unsigned GC_fail_count = 0;
+ /* How many consecutive GC/expansion failures? */
+ /* Reset by GC_allochblk. */
+
+/* The minimum value of the ratio of allocated bytes since the latest */
+/* GC to the amount of finalizers created since that GC which triggers */
+/* the collection instead heap expansion. Has no effect in the */
+/* incremental mode. */
+#if defined(GC_ALLOCD_BYTES_PER_FINALIZER) && !defined(CPPCHECK)
+ STATIC word GC_allocd_bytes_per_finalizer = GC_ALLOCD_BYTES_PER_FINALIZER;
+#else
+ STATIC word GC_allocd_bytes_per_finalizer = 10000;
+#endif
+
+GC_API void GC_CALL GC_set_allocd_bytes_per_finalizer(GC_word value)
+{
+ GC_allocd_bytes_per_finalizer = value;
+}
+
+GC_API GC_word GC_CALL GC_get_allocd_bytes_per_finalizer(void)
+{
+ return GC_allocd_bytes_per_finalizer;
+}
+
+static word last_fo_entries = 0;
+static word last_bytes_finalized = 0;
+
+/* Collect or expand heap in an attempt make the indicated number of */
+/* free blocks available. Should be called until the blocks are */
+/* available (setting retry value to TRUE unless this is the first call */
+/* in a loop) or until it fails by returning FALSE. */
+GC_INNER GC_bool GC_collect_or_expand(word needed_blocks,
+ GC_bool ignore_off_page,
+ GC_bool retry)
+{
+ GC_bool gc_not_stopped = TRUE;
+ word blocks_to_get;
+ IF_CANCEL(int cancel_state;)
+
+ GC_ASSERT(I_HOLD_LOCK());
+ DISABLE_CANCEL(cancel_state);
+ if (!GC_incremental && !GC_dont_gc &&
+ ((GC_dont_expand && GC_bytes_allocd > 0)
+ || (GC_fo_entries > last_fo_entries
+ && (last_bytes_finalized | GC_bytes_finalized) != 0
+ && (GC_fo_entries - last_fo_entries)
+ * GC_allocd_bytes_per_finalizer > GC_bytes_allocd)
+ || GC_should_collect())) {
+ /* Try to do a full collection using 'default' stop_func (unless */
+ /* nothing has been allocated since the latest collection or heap */
+ /* expansion is disabled). */
+ gc_not_stopped = GC_try_to_collect_inner(
+ GC_bytes_allocd > 0 && (!GC_dont_expand || !retry) ?
+ GC_default_stop_func : GC_never_stop_func);
+ if (gc_not_stopped == TRUE || !retry) {
+ /* Either the collection hasn't been aborted or this is the */
+ /* first attempt (in a loop). */
+ last_fo_entries = GC_fo_entries;
+ last_bytes_finalized = GC_bytes_finalized;
+ RESTORE_CANCEL(cancel_state);
+ return(TRUE);
+ }
+ }
+
+ blocks_to_get = (GC_heapsize - GC_heapsize_at_forced_unmap)
+ / (HBLKSIZE * GC_free_space_divisor)
+ + needed_blocks;
+ if (blocks_to_get > MAXHINCR) {
+ word slop;
+
+ /* Get the minimum required to make it likely that we can satisfy */
+ /* the current request in the presence of black-listing. */
+ /* This will probably be more than MAXHINCR. */
+ if (ignore_off_page) {
+ slop = 4;
+ } else {
+ slop = 2 * divHBLKSZ(BL_LIMIT);
+ if (slop > needed_blocks) slop = needed_blocks;
+ }
+ if (needed_blocks + slop > MAXHINCR) {
+ blocks_to_get = needed_blocks + slop;
+ } else {
+ blocks_to_get = MAXHINCR;
+ }
+ if (blocks_to_get > divHBLKSZ(GC_WORD_MAX))
+ blocks_to_get = divHBLKSZ(GC_WORD_MAX);
+ }
+
+ if (!GC_expand_hp_inner(blocks_to_get)
+ && (blocks_to_get == needed_blocks
+ || !GC_expand_hp_inner(needed_blocks))) {
+ if (gc_not_stopped == FALSE) {
+ /* Don't increment GC_fail_count here (and no warning). */
+ GC_gcollect_inner();
+ GC_ASSERT(GC_bytes_allocd == 0);
+ } else if (GC_fail_count++ < GC_max_retries) {
+ WARN("Out of Memory! Trying to continue...\n", 0);
+ GC_gcollect_inner();
+ } else {
+# if !defined(AMIGA) || !defined(GC_AMIGA_FASTALLOC)
+# ifdef USE_MUNMAP
+ GC_ASSERT(GC_heapsize >= GC_unmapped_bytes);
+# endif
+ WARN("Out of Memory! Heap size: %" WARN_PRIuPTR " MiB."
+ " Returning NULL!\n", (GC_heapsize - GC_unmapped_bytes) >> 20);
+# endif
+ RESTORE_CANCEL(cancel_state);
+ return(FALSE);
+ }
+ } else if (GC_fail_count) {
+ GC_COND_LOG_PRINTF("Memory available again...\n");
+ }
+ RESTORE_CANCEL(cancel_state);
+ return(TRUE);
+}
+
+/*
+ * Make sure the object free list for size gran (in granules) is not empty.
+ * Return a pointer to the first object on the free list.
+ * The object MUST BE REMOVED FROM THE FREE LIST BY THE CALLER.
+ */
+GC_INNER ptr_t GC_allocobj(size_t gran, int kind)
+{
+ void ** flh = &(GC_obj_kinds[kind].ok_freelist[gran]);
+ GC_bool tried_minor = FALSE;
+ GC_bool retry = FALSE;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (gran == 0) return(0);
+
+ while (*flh == 0) {
+ ENTER_GC();
+# ifndef GC_DISABLE_INCREMENTAL
+ if (GC_incremental && GC_time_limit != GC_TIME_UNLIMITED
+ && !GC_dont_gc) {
+ /* True incremental mode, not just generational. */
+ /* Do our share of marking work. */
+ GC_collect_a_little_inner(1);
+ }
+# endif
+ /* Sweep blocks for objects of this size */
+ GC_ASSERT(!GC_is_full_gc
+ || NULL == GC_obj_kinds[kind].ok_reclaim_list
+ || NULL == GC_obj_kinds[kind].ok_reclaim_list[gran]);
+ GC_continue_reclaim(gran, kind);
+ EXIT_GC();
+# if defined(CPPCHECK)
+ GC_noop1((word)&flh);
+# endif
+ if (NULL == *flh) {
+ GC_new_hblk(gran, kind);
+# if defined(CPPCHECK)
+ GC_noop1((word)&flh);
+# endif
+ if (NULL == *flh) {
+ ENTER_GC();
+ if (GC_incremental && GC_time_limit == GC_TIME_UNLIMITED
+ && !tried_minor && !GC_dont_gc) {
+ GC_collect_a_little_inner(1);
+ tried_minor = TRUE;
+ } else {
+ if (!GC_collect_or_expand(1, FALSE, retry)) {
+ EXIT_GC();
+ return(0);
+ }
+ retry = TRUE;
+ }
+ EXIT_GC();
+ }
+ }
+ }
+ /* Successful allocation; reset failure count. */
+ GC_fail_count = 0;
+
+ return (ptr_t)(*flh);
+}
diff --git a/graphics/asymptote/gc/autogen.sh b/graphics/asymptote/gc/autogen.sh
new file mode 100755
index 0000000000..c1500b2dc9
--- /dev/null
+++ b/graphics/asymptote/gc/autogen.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+set -e
+
+# This script creates (or regenerates) configure (as well as aclocal.m4,
+# config.h.in, Makefile.in, etc.) missing in the source repository.
+#
+# If you compile from a distribution tarball, you can skip this. Otherwise,
+# make sure that you have Autoconf, Automake and Libtool installed
+# on your system, and that the corresponding *.m4 files are visible
+# to the aclocal. The latter can be achieved by using packages shipped by
+# your OS, or by installing custom versions of all four packages to the same
+# prefix. Otherwise, you may need to invoke autoreconf with the appropriate
+# -I options to locate the required *.m4 files.
+
+autoreconf -i
+
+echo
+echo "Ready to run './configure'."
diff --git a/graphics/asymptote/gc/autom4te.cache/output.0 b/graphics/asymptote/gc/autom4te.cache/output.0
new file mode 100644
index 0000000000..09b023a70e
--- /dev/null
+++ b/graphics/asymptote/gc/autom4te.cache/output.0
@@ -0,0 +1,22068 @@
+@%:@! /bin/sh
+@%:@ Guess values for system-dependent variables and create Makefiles.
+@%:@ Generated by GNU Autoconf 2.71 for gc 8.2.8.
+@%:@
+@%:@ Report bugs to <https://github.com/ivmai/bdwgc/issues>.
+@%:@
+@%:@
+@%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+@%:@ Inc.
+@%:@
+@%:@
+@%:@ This configure script is free software; the Free Software Foundation
+@%:@ gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in @%:@((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in @%:@ ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else \$as_nop
+ case \`(set -o) 2>/dev/null\` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
+
+else \$as_nop
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null
+then :
+ as_have_required=yes
+else $as_nop
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
+
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+ case $as_dir in @%:@(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
+
+
+ if test "x$CONFIG_SHELL" != x
+then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in @%:@ ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and
+$0: https://github.com/ivmai/bdwgc/issues about your
+$0: system, including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+@%:@ as_fn_unset VAR
+@%:@ ---------------
+@%:@ Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+
+@%:@ as_fn_set_status STATUS
+@%:@ -----------------------
+@%:@ Set @S|@? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} @%:@ as_fn_set_status
+
+@%:@ as_fn_exit STATUS
+@%:@ -----------------
+@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} @%:@ as_fn_exit
+@%:@ as_fn_nop
+@%:@ ---------
+@%:@ Do nothing but, unlike ":", preserve the value of @S|@?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+@%:@ as_fn_mkdir_p
+@%:@ -------------
+@%:@ Create "@S|@as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} @%:@ as_fn_mkdir_p
+
+@%:@ as_fn_executable_p FILE
+@%:@ -----------------------
+@%:@ Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} @%:@ as_fn_executable_p
+@%:@ as_fn_append VAR VALUE
+@%:@ ----------------------
+@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take
+@%:@ advantage of any shell optimizations that allow amortized linear growth over
+@%:@ repeated appends, instead of the typical quadratic growth present in naive
+@%:@ implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+@%:@ as_fn_arith ARG...
+@%:@ ------------------
+@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the
+@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments
+@%:@ must be portable across @S|@(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+@%:@ as_fn_nop
+@%:@ ---------
+@%:@ Do nothing but, unlike ":", preserve the value of @S|@?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD]
+@%:@ ----------------------------------------
+@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+@%:@ script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} @%:@ as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in @%:@(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_@&t@echo='printf %s\n'
+as_@&t@echo_n='printf %s'
+
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIB@&t@OBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='gc'
+PACKAGE_TARNAME='gc'
+PACKAGE_VERSION='8.2.8'
+PACKAGE_STRING='gc 8.2.8'
+PACKAGE_BUGREPORT='https://github.com/ivmai/bdwgc/issues'
+PACKAGE_URL=''
+
+ac_unique_file="gcj_mlc.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_c_list=
+enable_option_checking=no
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIB@&t@OBJS
+THREAD_LOCAL_ALLOC_FALSE
+THREAD_LOCAL_ALLOC_TRUE
+NEED_ATOMIC_OPS_ASM_FALSE
+NEED_ATOMIC_OPS_ASM_TRUE
+USE_INTERNAL_LIBATOMIC_OPS_FALSE
+USE_INTERNAL_LIBATOMIC_OPS_TRUE
+subdirs
+ATOMIC_OPS_CFLAGS
+ATOMIC_OPS_LIBS
+ENABLE_SHARED_FALSE
+ENABLE_SHARED_TRUE
+ENABLE_DOCS_FALSE
+ENABLE_DOCS_TRUE
+SINGLE_GC_OBJ_FALSE
+SINGLE_GC_OBJ_TRUE
+WERROR_CFLAGS
+USE_LIBDIR_FALSE
+USE_LIBDIR_TRUE
+CHECKSUMS_FALSE
+CHECKSUMS_TRUE
+UNWINDLIBS
+ENABLE_DISCLAIM_FALSE
+ENABLE_DISCLAIM_TRUE
+KEEP_BACK_PTRS_FALSE
+KEEP_BACK_PTRS_TRUE
+MAKE_BACK_GRAPH_FALSE
+MAKE_BACK_GRAPH_TRUE
+ENABLE_GCJ_SUPPORT_FALSE
+ENABLE_GCJ_SUPPORT_TRUE
+addlibs
+addobjs
+CXXLIBS
+AM_CPPFLAGS
+AM_CFLAGS
+GC_TBA_LIBRARY_FALSE
+GC_TBA_LIBRARY_TRUE
+CPLUSPLUS_FALSE
+CPLUSPLUS_TRUE
+target_all
+EXTRA_TEST_LIBS
+extra_ldflags_libgc
+AVOID_CPP_LIB_FALSE
+AVOID_CPP_LIB_TRUE
+ASM_WITH_CPP_UNSUPPORTED_FALSE
+ASM_WITH_CPP_UNSUPPORTED_TRUE
+PTHREAD_START_STANDALONE_FALSE
+PTHREAD_START_STANDALONE_TRUE
+WIN32_THREADS_FALSE
+WIN32_THREADS_TRUE
+DARWIN_THREADS_FALSE
+DARWIN_THREADS_TRUE
+PTHREADS_FALSE
+PTHREADS_TRUE
+THREADS_FALSE
+THREADS_TRUE
+THREADDLLIBS
+CFLAGS_EXTRA
+GC_CFLAGS
+EMSCRIPTEN_FALSE
+EMSCRIPTEN_TRUE
+CXXCPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+FILECMD
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+LIBTOOL
+am__fastdepCCAS_FALSE
+am__fastdepCCAS_TRUE
+CCASDEPMODE
+CCASFLAGS
+CCAS
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+GC_VERSION
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+CSCOPE
+ETAGS
+CTAGS
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_static
+enable_shared
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_emscripten_asyncify
+enable_threads
+enable_parallel_mark
+enable_thread_local_alloc
+enable_threads_discovery
+enable_cplusplus
+with_ecos
+enable_throw_bad_alloc_library
+with_target_subdir
+with_cross_host
+enable_gcj_support
+enable_sigrt_signals
+enable_gc_debug
+enable_java_finalization
+enable_atomic_uncollectable
+enable_redirect_malloc
+enable_disclaim
+enable_large_config
+enable_gc_assertions
+enable_mmap
+enable_munmap
+enable_dynamic_loading
+enable_register_main_static_data
+enable_checksums
+enable_werror
+enable_single_obj_compilation
+enable_gcov
+enable_docs
+with_libatomic_ops
+enable_handle_fork
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CCAS
+CCASFLAGS
+LT_SYS_LIBRARY_PATH
+CXXCPP'
+ac_subdirs_all='libatomic_ops'
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir runstatedir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures gc 8.2.8 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ @<:@@S|@ac_default_prefix@:>@
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ @<:@PREFIX@:>@
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gc@:>@
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of gc 8.2.8:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=no@:>@
+ --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@
+ --enable-fast-install@<:@=PKGS@:>@
+ optimize for fast installation @<:@default=yes@:>@
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-emscripten-asyncify
+ use Emscripten asyncify feature
+ --enable-threads=TYPE choose threading package
+ --disable-parallel-mark do not parallelize marking and free list
+ construction
+ --disable-thread-local-alloc
+ turn off thread-local allocation optimization
+ --disable-threads-discovery
+ disable threads discovery in GC
+ --enable-cplusplus install C++ support
+ --disable-throw-bad-alloc-library
+ do not build C++ gctba library
+ --disable-gcj-support disable support for gcj
+ --enable-sigrt-signals force GC to use SIGRTMIN-based signals for thread
+ suspend/resume
+ --enable-gc-debug include full support for pointer backtracing etc.
+ --disable-java-finalization
+ disable support for java finalization
+ --disable-atomic-uncollectible
+ disable support for atomic uncollectible allocation
+ --enable-redirect-malloc
+ redirect malloc and friends to GC routines
+ --disable-disclaim disable alternative (more efficient) finalization
+ interface
+ --enable-large-config optimize for large (> 100 MB) heap or root set
+ --enable-gc-assertions collector-internal assertion checking
+ --enable-mmap use mmap instead of sbrk to expand the heap
+ --enable-munmap=N return page to the OS if empty for N collections
+ (default: 6)
+ --disable-dynamic-loading
+ build the collector with disabled tracing of dynamic
+ library data roots
+ --disable-register-main-static-data
+ skip the initial guess of data root sets
+ --enable-checksums report on erroneously cleared dirty bits at
+ substantial performance cost; use only for debugging
+ of the incremental collector
+ --enable-werror pass -Werror to the C compiler
+ --enable-single-obj-compilation
+ compile all libgc source files into single .o
+ (default: yes if static libraries are disabled)
+ --enable-gcov turn on code coverage analysis
+ --disable-docs do not build and install documentation
+ --enable-handle-fork=yes|no|auto|manual
+ attempt to ensure a usable collector after fork() in
+ multi-threaded programs (default: auto; manual:
+ GC_atfork_prepare/parent/child should be called by
+ the client)
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use
+ both@:>@
+ --with-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, @<:@default=aix@:>@.
+ --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@
+ --with-sysroot@<:@=DIR@:>@ Search for dependent libraries within DIR (or the
+ compiler's sysroot if not specified).
+ --with-ecos enable runtime eCos target support
+ --with-target-subdir=SUBDIR
+ configuring with a cross compiler
+ --with-cross-host=HOST configuring with a cross compiler
+ --with-libatomic-ops=yes|no|check|none
+ use an external libatomic_ops? (default: check;
+ none: use compiler intrinsics or no thread support)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CCAS assembler compiler command (defaults to CC)
+ CCASFLAGS assembler compiler flags (defaults to CFLAGS)
+ LT_SYS_LIBRARY_PATH
+ User-defined run-time library search path.
+ CXXCPP C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <https://github.com/ivmai/bdwgc/issues>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+gc configure 8.2.8
+generated by GNU Autoconf 2.71
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+@%:@ ac_fn_c_try_compile LINENO
+@%:@ --------------------------
+@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_compile
+
+@%:@ ac_fn_cxx_try_compile LINENO
+@%:@ ----------------------------
+@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_compile
+
+@%:@ ac_fn_c_try_link LINENO
+@%:@ -----------------------
+@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_link
+
+@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+@%:@ -------------------------------------------------------
+@%:@ Tests whether HEADER exists and can be compiled using the include files in
+@%:@ INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+@%:@include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} @%:@ ac_fn_c_check_header_compile
+
+@%:@ ac_fn_c_check_func LINENO FUNC VAR
+@%:@ ----------------------------------
+@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below. */
+
+#include <limits.h>
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* 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 defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} @%:@ ac_fn_c_check_func
+
+@%:@ ac_fn_cxx_try_cpp LINENO
+@%:@ ------------------------
+@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_cpp
+
+@%:@ ac_fn_cxx_try_link LINENO
+@%:@ -------------------------
+@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_link
+
+@%:@ ac_fn_c_try_run LINENO
+@%:@ ----------------------
+@%:@ Try to run conftest.@S|@ac_ext, and return whether this succeeded. Assumes that
+@%:@ executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_run
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?@<:@ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gc $as_me 8.2.8, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ $ $0$ac_configure_args_raw
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ printf "%s\n" "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ printf "%s\n" "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ printf "%s\n" "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ printf "%s\n" "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+printf "%s\n" "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+printf "%s\n" "@%:@define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ ac_site_files="$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
+else
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+fi
+
+for ac_site_file in $ac_site_files
+do
+ case $ac_site_file in @%:@(
+ */*) :
+ ;; @%:@(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+ extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+ try {
+ throw "test";
+ } catch (const char *s) {
+ // Extra parentheses suppress a warning when building autoconf itself,
+ // due to lint rules shared with more typical C programs.
+ assert (!(strcmp) (s, "test"));
+ }
+}
+
+template <typename T> struct test_template
+{
+ T const val;
+ explicit test_template(T t) : val(t) {}
+ template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+ assert (argc);
+ assert (! argv[0]);
+{
+ test_exception_syntax ();
+ test_template<double> tt (2.0);
+ assert (tt.add (4) == 6.0);
+ assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+ constexpr int get_val() { return 20; }
+
+ struct testinit
+ {
+ int i;
+ double d;
+ };
+
+ class delegate
+ {
+ public:
+ delegate(int n) : n(n) {}
+ delegate(): delegate(2354) {}
+
+ virtual int getval() { return this->n; };
+ protected:
+ int n;
+ };
+
+ class overridden : public delegate
+ {
+ public:
+ overridden(int n): delegate(n) {}
+ virtual int getval() override final { return this->n * 2; }
+ };
+
+ class nocopy
+ {
+ public:
+ nocopy(int i): i(i) {}
+ nocopy() = default;
+ nocopy(const nocopy&) = delete;
+ nocopy & operator=(const nocopy&) = delete;
+ private:
+ int i;
+ };
+
+ // for testing lambda expressions
+ template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+ {
+ return f(v);
+ }
+
+ // for testing variadic templates and trailing return types
+ template <typename V> auto sum(V first) -> V
+ {
+ return first;
+ }
+ template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+ {
+ return first + sum(rest...);
+ }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+ // Test auto and decltype
+ auto a1 = 6538;
+ auto a2 = 48573953.4;
+ auto a3 = "String literal";
+
+ int total = 0;
+ for (auto i = a3; *i; ++i) { total += *i; }
+
+ decltype(a2) a4 = 34895.034;
+}
+{
+ // Test constexpr
+ short sa[cxx11test::get_val()] = { 0 };
+}
+{
+ // Test initializer lists
+ cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+ // Test range-based for
+ int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+ 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+ for (auto &x : array) { x += 23; }
+}
+{
+ // Test lambda expressions
+ using cxx11test::eval;
+ assert (eval ([](int x) { return x*2; }, 21) == 42);
+ double d = 2.0;
+ assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+ assert (d == 5.0);
+ assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+ assert (d == 5.0);
+}
+{
+ // Test use of variadic templates
+ using cxx11test::sum;
+ auto a = sum(1);
+ auto b = sum(1, 2);
+ auto c = sum(1.0, 2.0, 3.0);
+}
+{
+ // Test constructor delegation
+ cxx11test::delegate d1;
+ cxx11test::delegate d2();
+ cxx11test::delegate d3(45);
+}
+{
+ // Test override and final
+ cxx11test::overridden o1(55464);
+}
+{
+ // Test nullptr
+ char *c = nullptr;
+}
+{
+ // Test template brackets
+ test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+ // Unicode literals
+ char const *utf8 = u8"UTF-8 string \u2500";
+ char16_t const *utf16 = u"UTF-8 string \u2500";
+ char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ ${ac_cxx_conftest_cxx11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="ltmain.sh compile missing install-sh config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_@&t@configure="$SHELL ${ac_aux_dir}configure"
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
+else
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking GC version numbers" >&5
+printf %s "checking GC version numbers... " >&6; }
+ GC_VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\([0-9][0-9]*\)[.].*$/\1/g'`
+ GC_VERSION_MINOR=`echo $PACKAGE_VERSION | sed 's/^[^.]*[.]\([0-9][0-9]*\).*$/\1/g'`
+ GC_VERSION_MICRO=`echo $PACKAGE_VERSION | sed 's/^[^.]*[.][^.]*[.]\([0-9][0-9]*\)$/\1/g'`
+
+ if test :$GC_VERSION_MAJOR: = :: \
+ -o :$GC_VERSION_MINOR: = :: \
+ -o :$GC_VERSION_MICRO: = :: ;
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: invalid" >&5
+printf "%s\n" "invalid" >&6; }
+ as_fn_error $? "nonconforming PACKAGE_VERSION='$PACKAGE_VERSION'" "$LINENO" 5
+ fi
+
+
+printf "%s\n" "@%:@define GC_VERSION_MAJOR $GC_VERSION_MAJOR" >>confdefs.h
+
+
+printf "%s\n" "@%:@define GC_VERSION_MINOR $GC_VERSION_MINOR" >>confdefs.h
+
+
+printf "%s\n" "@%:@define GC_VERSION_MICRO $GC_VERSION_MICRO" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO" >&5
+printf "%s\n" "major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO" >&6; }
+
+am__api_version='1.16'
+
+
+ # Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in @%:@((
+ ./ | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test ${ac_cv_path_install+y}; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"`
+
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+
+ if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ 'BusyBox '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test ${ac_cv_path_mkdir+y}; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SET_MAKE=
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+@%:@ Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gc'
+ VERSION='8.2.8'
+
+
+printf "%s\n" "@%:@define PACKAGE \"$PACKAGE\"" >>confdefs.h
+
+
+printf "%s\n" "@%:@define VERSION \"$VERSION\"" >>confdefs.h
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+ac_config_headers="$ac_config_headers include/config.h"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ @%:@ Check whether --enable-maintainer-mode was given.
+if test ${enable_maintainer_mode+y}
+then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else $as_nop
+ USE_MAINTAINER_MODE=no
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+printf "%s\n" "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in @%:@(
+ '0:this is the am__doit target') :
+ case $s in @%:@(
+ BSD) :
+ am__include='.include' am__quote='"' ;; @%:@(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; @%:@(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
+
+@%:@ Check whether --enable-dependency-tracking was given.
+if test ${enable_dependency_tracking+y}
+then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $@%:@ != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else $as_nop
+ ac_file=''
+fi
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <stdio.h>
+int
+main (void)
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+y}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+else $as_nop
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+# By default we simply use the C compiler to build assembly code.
+
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+
+
+
+depcc="$CCAS" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CCAS_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CCAS_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CCAS_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CCAS_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CCAS_dependencies_compiler_type" >&6; }
+CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then
+ am__fastdepCCAS_TRUE=
+ am__fastdepCCAS_FALSE='#'
+else
+ am__fastdepCCAS_TRUE='#'
+ am__fastdepCCAS_FALSE=
+fi
+
+
+
+case `pwd` in
+ *\ * | *\ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.7'
+macro_revision='2.4.7'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+printf %s "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO ""
+}
+
+case $ECHO in
+ printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+printf "%s\n" "printf" >&6; } ;;
+ print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+printf "%s\n" "print -r" >&6; } ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+printf "%s\n" "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in sed gsed
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+printf %s "checking for fgrep... " >&6; }
+if test ${ac_cv_path_FGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+ then ac_cv_path_FGREP="$GREP -F"
+ else
+ if test -z "$FGREP"; then
+ ac_path_FGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in fgrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+ # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'FGREP' >> "conftest.nl"
+ "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_FGREP="$ac_path_FGREP"
+ ac_path_FGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_FGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_FGREP"; then
+ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_FGREP=$FGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+printf "%s\n" "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@%:@ Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test ${lt_cv_path_NM+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+printf "%s\n" "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in dumpbin "link -dump"
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DUMPBIN"; then
+ ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+printf "%s\n" "$DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$DUMPBIN" && break
+ done
+fi
+if test -z "$DUMPBIN"; then
+ ac_ct_DUMPBIN=$DUMPBIN
+ for ac_prog in dumpbin "link -dump"
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DUMPBIN"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+printf "%s\n" "$ac_ct_DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_DUMPBIN" && break
+done
+
+ if test "x$ac_ct_DUMPBIN" = x; then
+ DUMPBIN=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DUMPBIN=$ac_ct_DUMPBIN
+ fi
+fi
+
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+printf %s "checking the name lister ($NM) interface... " >&6; }
+if test ${lt_cv_nm_interface+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+printf "%s\n" "$lt_cv_nm_interface" >&6; }
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+printf %s "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+printf "%s\n" "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+printf %s "checking the maximum length of command line arguments... " >&6; }
+if test ${lt_cv_sys_max_cmd_len+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+printf %s "checking how to convert $build file names to $host format... " >&6; }
+if test ${lt_cv_to_host_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+printf %s "checking how to convert $build file names to toolchain format... " >&6; }
+if test ${lt_cv_to_tool_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+printf %s "checking for $LD option to reload object files... " >&6; }
+if test ${lt_cv_ld_reload_flag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_reload_flag='-r'
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+printf "%s\n" "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args.
+set dummy ${ac_tool_prefix}file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$FILECMD"; then
+ ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_FILECMD="${ac_tool_prefix}file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+FILECMD=$ac_cv_prog_FILECMD
+if test -n "$FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5
+printf "%s\n" "$FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_FILECMD"; then
+ ac_ct_FILECMD=$FILECMD
+ # Extract the first word of "file", so it can be a program name with args.
+set dummy file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_FILECMD"; then
+ ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_FILECMD="file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD
+if test -n "$ac_ct_FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5
+printf "%s\n" "$ac_ct_FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_FILECMD" = x; then
+ FILECMD=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ FILECMD=$ac_ct_FILECMD
+ fi
+else
+ FILECMD="$ac_cv_prog_FILECMD"
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+printf "%s\n" "$OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+printf "%s\n" "$ac_ct_OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+printf %s "checking how to recognize dependent libraries... " >&6; }
+if test ${lt_cv_deplibs_check_method+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='$FILECMD -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=$FILECMD
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[3-9]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+printf "%s\n" "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+printf "%s\n" "$DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+printf "%s\n" "$ac_ct_DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+printf %s "checking how to associate runtime and link libraries... " >&6; }
+if test ${lt_cv_sharedlib_from_linklib_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AR" && break
+ done
+fi
+if test -z "$AR"; then
+ ac_ct_AR=$AR
+ for ac_prog in ar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AR" && break
+done
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+fi
+
+: ${AR=ar}
+
+
+
+
+
+
+# Use ARFLAGS variable as AR's operation code to sync the variable naming with
+# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
+# higher priority because thats what people were doing historically (setting
+# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS
+# variable obsoleted/removed.
+
+test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
+lt_ar_flags=$AR_FLAGS
+
+
+
+
+
+
+# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override
+# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+printf %s "checking for archiver @FILE support... " >&6; }
+if test ${lt_cv_ar_at_file+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -eq "$ac_status"; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+printf "%s\n" "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+printf %s "checking command to parse $NM output from $compiler object... " >&6; }
+if test ${lt_cv_sys_global_symbol_pipe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ if test ia64 = "$host_cpu"; then
+ symcode='[ABCDEGRST]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="$SED -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
+ # Also find C++ and __fastcall symbols from MSVC++ or ICC,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK '"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx"
+ else
+ lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT@&t@_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT@&t@_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS=conftstm.$ac_objext
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test yes = "$pipe_works"; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+printf "%s\n" "failed" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+printf "%s\n" "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+printf %s "checking for sysroot... " >&6; }
+
+@%:@ Check whether --with-sysroot was given.
+if test ${with_sysroot+y}
+then :
+ withval=$with_sysroot;
+else $as_nop
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+printf "%s\n" "$with_sysroot" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+printf "%s\n" "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+printf %s "checking for a working dd... " >&6; }
+if test ${ac_cv_path_lt_DD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+ ac_path_lt_DD_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in dd
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+ $ac_path_lt_DD_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_lt_DD"; then
+ :
+ fi
+else
+ ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+printf "%s\n" "$ac_cv_path_lt_DD" >&6; }
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+printf %s "checking how to truncate binary pipes... " >&6; }
+if test ${lt_cv_truncate_bin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+printf "%s\n" "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+@%:@ Check whether --enable-libtool-lock was given.
+if test ${enable_libtool_lock+y}
+then :
+ enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE=32
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE=64
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ emul=elf
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ case `$FILECMD conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -belf"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+printf %s "checking whether the C compiler needs -belf... " >&6; }
+if test ${lt_cv_cc_needs_belf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_cc_needs_belf=yes
+else $as_nop
+ lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+printf "%s\n" "$lt_cv_cc_needs_belf" >&6; }
+ if test yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$MANIFEST_TOOL"; then
+ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+printf "%s\n" "$MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+ # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_MANIFEST_TOOL"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+ fi
+else
+ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if test ${lt_cv_path_mainfest_tool+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&5
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+ MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+ case $host_os in
+ rhapsody* | darwin*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DSYMUTIL"; then
+ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+printf "%s\n" "$DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+ ac_ct_DSYMUTIL=$DSYMUTIL
+ # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DSYMUTIL"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+printf "%s\n" "$ac_ct_DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DSYMUTIL=$ac_ct_DSYMUTIL
+ fi
+else
+ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$NMEDIT"; then
+ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+printf "%s\n" "$NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+ ac_ct_NMEDIT=$NMEDIT
+ # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_NMEDIT"; then
+ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+printf "%s\n" "$ac_ct_NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ NMEDIT=$ac_ct_NMEDIT
+ fi
+else
+ NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$LIPO"; then
+ ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+printf "%s\n" "$LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+ ac_ct_LIPO=$LIPO
+ # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_LIPO"; then
+ ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_LIPO="lipo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+printf "%s\n" "$ac_ct_LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_LIPO" = x; then
+ LIPO=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIPO=$ac_ct_LIPO
+ fi
+else
+ LIPO="$ac_cv_prog_LIPO"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OTOOL"; then
+ ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+printf "%s\n" "$OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+ ac_ct_OTOOL=$OTOOL
+ # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OTOOL"; then
+ ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL="otool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+printf "%s\n" "$ac_ct_OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL" = x; then
+ OTOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL=$ac_ct_OTOOL
+ fi
+else
+ OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OTOOL64"; then
+ ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+printf "%s\n" "$OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+ ac_ct_OTOOL64=$OTOOL64
+ # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OTOOL64"; then
+ ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL64="otool64"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+printf "%s\n" "$ac_ct_OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL64" = x; then
+ OTOOL64=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL64=$ac_ct_OTOOL64
+ fi
+else
+ OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+printf %s "checking for -single_module linker flag... " >&6; }
+if test ${lt_cv_apple_cc_single_mod+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_apple_cc_single_mod=no
+ if test -z "$LT_MULTI_MODULE"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+printf %s "checking for -exported_symbols_list linker flag... " >&6; }
+if test ${lt_cv_ld_exported_symbols_list+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_ld_exported_symbols_list=yes
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+printf %s "checking for -force_load linker flag... " >&6; }
+if test ${lt_cv_ld_force_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+ echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5
+ $AR $AR_FLAGS libconftest.a conftest.o 2>&5
+ echo "$RANLIB libconftest.a" >&5
+ $RANLIB libconftest.a 2>&5
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+printf "%s\n" "$lt_cv_ld_force_load" >&6; }
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ darwin*)
+ case $MACOSX_DEPLOYMENT_TARGET,$host in
+ 10.[012],*|,*powerpc*-darwin[5-8]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ *)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+ fi
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "@%:@define STDC_HEADERS 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes
+then :
+ printf "%s\n" "@%:@define HAVE_DLFCN_H 1" >>confdefs.h
+
+fi
+
+
+
+
+func_stripname_cnf ()
+{
+ case @S|@2 in
+ .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+ *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
+ esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+@%:@ Check whether --enable-static was given.
+if test ${enable_static+y}
+then :
+ enableval=$enable_static; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_static=no
+fi
+
+
+
+
+
+
+
+
+
+
+ enable_dlopen=no
+
+
+ enable_win32_dll=no
+
+
+ @%:@ Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+@%:@ Check whether --with-pic was given.
+if test ${with_pic+y}
+then :
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ pic_mode=default
+fi
+
+
+
+
+
+
+
+
+ @%:@ Check whether --enable-fast-install was given.
+if test ${enable_fast_install+y}
+then :
+ enableval=$enable_fast_install; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+ shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+printf %s "checking which variant of shared library versioning to provide... " >&6; }
+
+@%:@ Check whether --with-aix-soname was given.
+if test ${with_aix_soname+y}
+then :
+ withval=$with_aix_soname; case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else $as_nop
+ if test ${lt_cv_with_aix_soname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_with_aix_soname=aix
+fi
+
+ with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+printf "%s\n" "$with_aix_soname" >&6; }
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+printf %s "checking for objdir... " >&6; }
+if test ${lt_cv_objdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+printf "%s\n" "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+printf "%s\n" "@%:@define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC and
+# ICC, which need '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+printf %s "checking for ${ac_tool_prefix}file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/${ac_tool_prefix}file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+printf %s "checking for file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test ${lt_cv_prog_compiler_rtti_exceptions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+
+
+
+
+
+ lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+ if test yes = "$GCC"; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='$wl-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ # old Intel for x86_64, which still supported -KPIC.
+ ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='--shared'
+ lt_prog_compiler_static='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag=
+ always_export_symbols=no
+ archive_cmds=
+ archive_expsym_cmds=
+ compiler_needs_object=no
+ enable_shared_with_static_runtimes=no
+ export_dynamic_flag_spec=
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ hardcode_automatic=no
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_separator=
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ inherit_rpath=no
+ link_all_deplibs=unknown
+ module_cmds=
+ module_expsym_cmds=
+ old_archive_from_new_cmds=
+ old_archive_from_expsyms_cmds=
+ thread_safe_flag_spec=
+ whole_archive_flag_spec=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
+ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ if test yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test yes = "$with_gnu_ld"; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+ *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test yes = "$lt_use_gnu_ld_interface"; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='$wl'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec='$wl--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test ia64 != "$host_cpu"; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ export_dynamic_flag_spec='$wl--export-all-symbols'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ haiku*)
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs=yes
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test linux-dietlibc = "$host_os"; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test no = "$tmp_diet"
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ whole_archive_flag_spec=
+ tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
+ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ tcc*)
+ export_dynamic_flag_spec='-rdynamic'
+ ;;
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test no = "$ld_shlibs"; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ file_list_spec='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' $wl-bernotok'
+ allow_undefined_flag=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ fi
+ archive_cmds_need_lc=yes
+ archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl* | icl*)
+ # Native MSVC or ICC
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ file_list_spec='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+ enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ old_postinstall_cmds='chmod 644 $oldlib'
+ postlink_cmds='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC and ICC wrapper
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ enable_shared_with_static_runtimes=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec=''
+ fi
+ link_all_deplibs=yes
+ allow_undefined_flag=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+ else
+ ld_shlibs=no
+ fi
+
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly* | midnightbsd*)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test yes = "$GCC"; then
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='$wl-E'
+ ;;
+
+ hpux10*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+printf %s "checking if $CC understands -b... " >&6; }
+if test ${lt_cv_prog_compiler__b+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler__b=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -b"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler__b=yes
+ fi
+ else
+ lt_cv_prog_compiler__b=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+printf "%s\n" "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+ ;;
+ esac
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if test ${lt_cv_irix_exported_symbol+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_irix_exported_symbol=yes
+else $as_nop
+ lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; }
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+ fi
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ inherit_rpath=yes
+ link_all_deplibs=yes
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ ld_shlibs=yes
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ hardcode_direct_absolute=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ else
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z defs'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='$wl'
+ archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test yes = "$GCC"; then
+ whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test sequent = "$host_vendor"; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag='$wl-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='$wl-z,text'
+ allow_undefined_flag='$wl-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-R,$libdir'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+
+ if test sni = "$host_vendor"; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ export_dynamic_flag_spec='$wl-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+printf "%s\n" "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+ case $host_os in
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary...
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo = "/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[lt_foo]++; }
+ if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+ test -n "$runpath_var" ||
+ test yes = "$hardcode_automatic"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+ test no != "$hardcode_minus_L"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+printf "%s\n" "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+ test yes = "$inherit_rpath"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+ if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else $as_nop
+
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes
+then :
+ lt_cv_dlopen=shl_load
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+printf %s "checking for shl_load in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_shl_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main (void)
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_shl_load=yes
+else $as_nop
+ ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes
+then :
+ lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else $as_nop
+ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+printf %s "checking for dlopen in -lsvld... " >&6; }
+if test ${ac_cv_lib_svld_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_svld_dlopen=yes
+else $as_nop
+ ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+printf %s "checking for dld_link in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_dld_link+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main (void)
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_dld_link=yes
+else $as_nop
+ ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes
+then :
+ lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+printf %s "checking whether a program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+printf "%s\n" "$lt_cv_dlopen_self" >&6; }
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+printf %s "checking whether a statically linked program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self_static+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+printf "%s\n" "$lt_cv_dlopen_self_static" >&6; }
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+printf %s "checking whether stripping libraries is possible... " >&6; }
+if test -z "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+else
+ if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ case $host_os in
+ darwin*)
+ # FIXME - insert some real tests, host_os isn't really good enough
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ ;;
+ freebsd*)
+ if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ ;;
+ esac
+ fi
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # Report what library types will actually be built
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+printf %s "checking if libtool supports shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+printf "%s\n" "$can_build_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+printf %s "checking whether to build static libraries... " >&6; }
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+printf "%s\n" "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+ if test -n "$CXX" && ( test no != "$CXX" &&
+ ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+ (test g++ != "$CXX"))); then
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+printf %s "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if test ${ac_cv_prog_CXXCPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CXX needs to be expanded
+ for CXXCPP in "$CXX -E" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+printf "%s\n" "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+ _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="int some_variable = 0;"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+ # save warnings/boilerplate of simple test code
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_CFLAGS=$CFLAGS
+ lt_save_LD=$LD
+ lt_save_GCC=$GCC
+ GCC=$GXX
+ lt_save_with_gnu_ld=$with_gnu_ld
+ lt_save_path_LD=$lt_cv_path_LD
+ if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+ else
+ $as_unset lt_cv_prog_gnu_ld
+ fi
+ if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+ else
+ $as_unset lt_cv_path_LD
+ fi
+ test -z "${LDCXX+set}" || LD=$LDCXX
+ CC=${CXX-"c++"}
+ CFLAGS=$CXXFLAGS
+ compiler=$CC
+ compiler_CXX=$CC
+ func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+ if test -n "$compiler"; then
+ # We don't want -fno-exception when compiling C++ code, so set the
+ # no_builtin_flag separately
+ if test yes = "$GXX"; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+ else
+ lt_prog_compiler_no_builtin_flag_CXX=
+ fi
+
+ if test yes = "$GXX"; then
+ # Set up default GNU C++ configuration
+
+
+
+@%:@ Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test yes = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='$wl'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+ $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec_CXX=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+ fi
+
+ # PORTME: fill in a description of your system's C++ link characteristics
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ ld_shlibs_CXX=yes
+ case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_CXX=''
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ file_list_spec_CXX='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct_CXX=no
+ hardcode_direct_absolute_CXX=no
+ ;;
+ esac
+
+ if test yes = "$GXX"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct_CXX=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_CXX=yes
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_libdir_separator_CXX=
+ fi
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag=$shared_flag' $wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec_CXX='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to
+ # export.
+ always_export_symbols_CXX=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ # The "-G" linker flag allows undefined symbols.
+ no_undefined_flag_CXX='-bernotok'
+ # Determine the default libpath from the value encoded in an empty
+ # executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+
+ archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_CXX="-z nodefs"
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_CXX=' $wl-bernotok'
+ allow_undefined_flag_CXX=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ fi
+ archive_cmds_need_lc_CXX=yes
+ archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared
+ # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_CXX=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $GXX,$cc_basename in
+ ,cl* | no,cl* | ,icl* | no,icl*)
+ # Native MSVC or ICC
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX=' '
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=yes
+ file_list_spec_CXX='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+ enable_shared_with_static_runtimes_CXX=yes
+ # Don't use ranlib
+ old_postinstall_cmds_CXX='chmod 644 $oldlib'
+ postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # g++
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=no
+ enable_shared_with_static_runtimes_CXX=yes
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec_CXX=''
+ fi
+ link_all_deplibs_CXX=yes
+ allow_undefined_flag_CXX=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ if test yes != "$lt_cv_apple_cc_single_mod"; then
+ archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+ fi
+
+ else
+ ld_shlibs_CXX=no
+ fi
+
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_minus_L_CXX=yes
+ allow_undefined_flag_CXX=unsupported
+ shrext_cmds=.dll
+ archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes_CXX=yes
+ file_list_spec_CXX='@'
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ freebsd2.*)
+ # C++ shared libraries reported to be fairly broken before
+ # switch to ELF
+ ld_shlibs_CXX=no
+ ;;
+
+ freebsd-elf*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+
+ haiku*)
+ archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs_CXX=yes
+ ;;
+
+ hpux9*)
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='$wl-E'
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ hpux10*|hpux11*)
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ export_dynamic_flag_spec_CXX='$wl-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ ;;
+ *)
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+ fi
+ fi
+ link_all_deplibs_CXX=yes
+ ;;
+ esac
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ inherit_rpath_CXX=yes
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc* | ecpc* )
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ case `$CC -V` in
+ *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+ prelink_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+ old_archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+ $RANLIB $oldlib'
+ archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 6 and above use weak symbols
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+ ;;
+ xl* | mpixl* | bgxl*)
+ # IBM XL 8.0 on PPC, with GNU ld
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object_CXX=yes
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ m88k*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+
+ *nto* | *qnx*)
+ ld_shlibs_CXX=yes
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ hardcode_direct_absolute_CXX=yes
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ fi
+ output_verbose_link_cmd=func_echo_all
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ case $host in
+ osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+ *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+ esac
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ case $host in
+ osf3*)
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ ;;
+ *)
+ allow_undefined_flag_CXX=' -expect_unresolved \*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+ $RM $lib.exp'
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ ;;
+ esac
+
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ case $host in
+ osf3*)
+ archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ psos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ archive_cmds_need_lc_CXX=yes
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_shlibpath_var_CXX=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ no_undefined_flag_CXX=' $wl-z ${wl}defs'
+ if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ else
+ # g++ 2.7 appears to require '-G' NOT '-shared' on this
+ # platform.
+ archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_CXX='$wl-z,text'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_CXX='$wl-z,text'
+ allow_undefined_flag_CXX='$wl-z,nodefs'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ export_dynamic_flag_spec_CXX='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+ '"$old_archive_cmds_CXX"
+ reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+ '"$reload_cmds_CXX"
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+ test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+ GCC_CXX=$GXX
+ LD_CXX=$LD
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ for p in `eval "$output_verbose_link_cmd"`; do
+ case $prev$p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test x-L = "$p" ||
+ test x-R = "$p"; then
+ prev=$p
+ continue
+ fi
+
+ # Expand the sysroot to ease extracting the directories later.
+ if test -z "$prev"; then
+ case $p in
+ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+ esac
+ fi
+ case $p in
+ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+ esac
+ if test no = "$pre_test_object_deps_done"; then
+ case $prev in
+ -L | -R)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_path_CXX=$prev$p
+ else
+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$postdeps_CXX"; then
+ postdeps_CXX=$prev$p
+ else
+ postdeps_CXX="${postdeps_CXX} $prev$p"
+ fi
+ fi
+ prev=
+ ;;
+
+ *.lto.$objext) ;; # Ignore GCC LTO objects
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test no = "$pre_test_object_deps_done"; then
+ if test -z "$predep_objects_CXX"; then
+ predep_objects_CXX=$p
+ else
+ predep_objects_CXX="$predep_objects_CXX $p"
+ fi
+ else
+ if test -z "$postdep_objects_CXX"; then
+ postdep_objects_CXX=$p
+ else
+ postdep_objects_CXX="$postdep_objects_CXX $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ predep_objects_CXX=
+ postdep_objects_CXX=
+ postdeps_CXX=
+ ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test yes = "$GXX"; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static_CXX='$wl-static'
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static_CXX=
+ ;;
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[4-9]*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ if test ia64 != "$host_cpu"; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ ecpc* )
+ # old Intel C++ for x86_64, which still supported -KPIC.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ icpc* )
+ # Intel C++, used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fpic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-qpic'
+ lt_prog_compiler_static_CXX='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works_CXX=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ case $host_os in
+ aix[4-9]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ export_symbols_cmds_CXX=$ltdll_cmds
+ ;;
+ cygwin* | mingw* | cegcc*)
+ case $cc_basename in
+ cl* | icl*)
+ exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+ ;;
+ esac
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_CXX=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds_CXX in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_CXX
+ pic_flag=$lt_prog_compiler_pic_CXX
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+ allow_undefined_flag_CXX=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc_CXX=no
+ else
+ lt_cv_archive_cmds_need_lc_CXX=yes
+ fi
+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+ archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+ test -n "$runpath_var_CXX" ||
+ test yes = "$hardcode_automatic_CXX"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct_CXX" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+ test no != "$hardcode_minus_L_CXX"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_CXX=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_CXX=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_CXX=unsupported
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+printf "%s\n" "$hardcode_action_CXX" >&6; }
+
+if test relink = "$hardcode_action_CXX" ||
+ test yes = "$inherit_rpath_CXX"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+ fi # test -n "$compiler"
+
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+ LDCXX=$LD
+ LD=$lt_save_LD
+ GCC=$lt_save_GCC
+ with_gnu_ld=$lt_save_with_gnu_ld
+ lt_cv_path_LDCXX=$lt_cv_path_LD
+ lt_cv_path_LD=$lt_save_path_LD
+ lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+# Only the shared libraries are produced by default, use "--enable-static"
+# option to override it.
+
+# Special CFLAGS to use when building
+gc_cflags=""
+
+# Set to "yes" on platforms where mmap should be used instead of sbrk.
+# This will define USE_MMAP.
+gc_use_mmap=""
+
+# We should set -fexceptions if we are using gcc and might be used
+# inside something like gcj. This is the zeroth approximation:
+if test :"$GCC": = :yes: ; then
+ gc_cflags="${gc_cflags} -fexceptions"
+else
+ case "$host" in
+ hppa*-*-hpux* )
+ if test :$GCC: != :"yes": ; then
+ gc_cflags="${gc_cflags} +ESdbgasm"
+ fi
+ # :TODO: actually we should check using Autoconf if
+ # the compiler supports this option.
+ ;;
+ esac
+fi
+
+# target_optspace --enable-target-optspace ("yes", "no", "")
+case "${target_optspace}:${host}" in
+ yes:*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ :m32r-* | :d10v-* | :d30v-*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ no:* | :*)
+ # Nothing.
+ ;;
+esac
+
+# Set any host dependent compiler flags.
+case "${host}" in
+ mips-tx39-*|mipstx39-unknown-*)
+ gc_cflags="${gc_cflags} -G 0"
+ ;;
+ *)
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for emscripten" >&5
+printf %s "checking for emscripten... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# ifndef __EMSCRIPTEN__
+# error This is not Emscripten
+# endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ emscripten=yes
+else $as_nop
+ emscripten=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test x$emscripten = xyes; then
+ EMSCRIPTEN_TRUE=
+ EMSCRIPTEN_FALSE='#'
+else
+ EMSCRIPTEN_TRUE='#'
+ EMSCRIPTEN_FALSE=
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $emscripten" >&5
+printf "%s\n" "$emscripten" >&6; }
+
+@%:@ Check whether --enable-emscripten-asyncify was given.
+if test ${enable_emscripten_asyncify+y}
+then :
+ enableval=$enable_emscripten_asyncify;
+fi
+
+# Use this option if your program is targeting -sASYNCIFY. The latter is
+# required to scan the stack, ASYNCIFY_STACK_SIZE is probably needed for
+# gctest only.
+if test "${emscripten}" = yes -a "${enable_emscripten_asyncify}" = yes
+then :
+ gc_cflags="${gc_cflags} -DEMSCRIPTEN_ASYNCIFY"
+ gc_cflags="${gc_cflags} -sASYNCIFY -sASYNCIFY_STACK_SIZE=128000"
+fi
+
+GC_CFLAGS=${gc_cflags}
+
+
+
+
+@%:@ Check whether --enable-threads was given.
+if test ${enable_threads+y}
+then :
+ enableval=$enable_threads; THREADS=$enableval
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thread model used by GCC" >&5
+printf %s "checking for thread model used by GCC... " >&6; }
+ THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
+ if test -z "$THREADS" -o "x$emscripten" = "xyes"; then
+ THREADS=no
+ fi
+ if test "$THREADS" = "posix"; then
+ case "$host" in
+ *-*-mingw*)
+ # Adjust thread model if cross-compiling for MinGW.
+ THREADS=win32
+ ;;
+ esac
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $THREADS" >&5
+printf "%s\n" "$THREADS" >&6; }
+fi
+
+
+@%:@ Check whether --enable-parallel-mark was given.
+if test ${enable_parallel_mark+y}
+then :
+ enableval=$enable_parallel_mark; case "$THREADS" in
+ no | none | single)
+ if test "${enable_parallel_mark}" != no; then
+ as_fn_error $? "Parallel mark requires --enable-threads=x spec" "$LINENO" 5
+ fi
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-thread-local-alloc was given.
+if test ${enable_thread_local_alloc+y}
+then :
+ enableval=$enable_thread_local_alloc; case "$THREADS" in
+ no | none | single)
+ if test "${enable_thread_local_alloc}" = yes; then
+ as_fn_error $? "Thread-local allocation requires --enable-threads=x spec" "$LINENO" 5
+ fi
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-threads-discovery was given.
+if test ${enable_threads_discovery+y}
+then :
+ enableval=$enable_threads_discovery;
+fi
+
+if test "${enable_threads_discovery}" = no; then
+
+printf "%s\n" "@%:@define GC_NO_THREADS_DISCOVERY 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-cplusplus was given.
+if test ${enable_cplusplus+y}
+then :
+ enableval=$enable_cplusplus;
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+CFLAGS="$old_CFLAGS"
+
+THREADDLLIBS=
+need_atomic_ops_asm=false
+need_lib_rt=false
+compile_asm=false
+use_parallel_mark=no
+use_thread_local_alloc=no
+# Libraries needed to support dynamic loading and/or threads.
+case "$THREADS" in
+ no | none | single)
+ THREADS=none
+ ;;
+ posix | pthreads)
+ THREADS=posix
+ default_threadlibs=false
+ # Common defines for most POSIX platforms.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-dragonfly* | \
+ *-*-freebsd* | *-*-haiku* | *-*-hpux11* | *-*-irix* | \
+ *-*-kfreebsd*-gnu | *-*-gnu* | *-*-*linux* | *-*-msys* | *-*-nacl* | \
+ *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define _REENTRANT 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ default_threadlibs=true
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&2;}
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5
+printf %s "checking for pthread_self in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char pthread_self ();
+int
+main (void)
+{
+return pthread_self ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_self=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_self=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_self" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_self" = xyes
+then :
+ THREADDLLIBS="-lpthread"
+fi
+
+ case "$host" in
+ *-*-hpux11*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Only HP/UX 11 POSIX threads are supported.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Only HP/UX 11 POSIX threads are supported.\"" >&2;}
+ printf "%s\n" "@%:@define _POSIX_C_SOURCE 199506L" >>confdefs.h
+
+ THREADDLLIBS="-lpthread"
+ # HPUX needs REENTRANT for the _r calls.
+ need_lib_rt=true
+ ;;
+ *-*-openbsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-freebsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ ;;
+ *-*-kfreebsd*-gnu)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-gnu*) # E.g. linux but excluding kfreebsd.
+ # The default THREADDLLIBS.
+ ;;
+ *-*-netbsd*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Only on NetBSD 2.0 or later.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Only on NetBSD 2.0 or later.\"" >&2;}
+ printf "%s\n" "@%:@define _PTHREADS 1" >>confdefs.h
+
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-solaris*)
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-cygwin* | *-*-msys*)
+ # Cygwin doesn't have a real libpthread, so Libtool can't link
+ # against it.
+ THREADDLLIBS=""
+ win32_threads=true
+ ;;
+ *-*-mingw*)
+ printf "%s\n" "@%:@define GC_WIN32_PTHREADS 1" >>confdefs.h
+
+ # Using pthreads-win32 (or other non-Cygwin pthreads) library.
+ THREADDLLIBS="-lpthread"
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ win32_threads=true
+ ;;
+ *-*-darwin*)
+ darwin_threads=true
+ ;;
+ *-*-osf*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *)
+ if test x$default_threadlibs != xtrue
+then :
+ as_fn_error $? "Pthreads not supported by the GC on this platform" "$LINENO" 5
+fi
+ # The default THREADDLLIBS.
+ ;;
+ esac
+ case "$host" in
+ sparc*-*-solaris*)
+ if test "$GCC" != yes; then
+ need_atomic_ops_asm=true
+ fi
+ ;;
+ esac
+ ;;
+ mcf | win32)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ if test "${enable_parallel_mark}" != no \
+ -o "${enable_shared}" != yes -o "${enable_static}" != no; then
+ # Imply THREAD_LOCAL_ALLOC unless GC_DLL.
+ use_thread_local_alloc=$enable_thread_local_alloc
+ fi
+ if test "${enable_win32_dllmain}" = yes; then
+
+printf "%s\n" "@%:@define GC_INSIDE_DLL 1" >>confdefs.h
+
+ fi
+ win32_threads=true
+
+printf "%s\n" "@%:@define EMPTY_GETENV_RESULTS 1" >>confdefs.h
+
+ ;;
+ dgux386)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ # Use pthread GCC switch
+ THREADDLLIBS=-pthread
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&2;}
+ AM_CFLAGS="-pthread $AM_CFLAGS"
+ ;;
+ aix)
+ THREADS=posix
+ THREADDLLIBS=-lpthread
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ printf "%s\n" "@%:@define _REENTRANT 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ rtems)
+ THREADS=posix
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ decosf1 | irix | mach | os2 | solaris | dce | vxworks)
+ as_fn_error $? "thread package $THREADS not yet supported" "$LINENO" 5
+ ;;
+ *)
+ as_fn_error $? "$THREADS is an unknown thread package" "$LINENO" 5
+ ;;
+esac
+
+# Check whether -lrt linker option is needed to use clock_gettime.
+if test "x$need_lib_rt" != xtrue; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime without additional libraries" >&5
+printf %s "checking for clock_gettime without additional libraries... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <time.h>
+int
+main (void)
+{
+struct timespec t; clock_gettime(CLOCK_REALTIME, &t)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
+printf %s "checking for clock_gettime in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_clock_gettime+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char clock_gettime ();
+int
+main (void)
+{
+return clock_gettime ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_rt_clock_gettime=yes
+else $as_nop
+ ac_cv_lib_rt_clock_gettime=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5
+printf "%s\n" "$ac_cv_lib_rt_clock_gettime" >&6; }
+if test "x$ac_cv_lib_rt_clock_gettime" = xyes
+then :
+ need_lib_rt=true
+fi
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+if test "x$need_lib_rt" = xtrue; then
+ THREADDLLIBS="$THREADDLLIBS -lrt"
+fi
+
+
+ if test x$THREADS != xnone; then
+ THREADS_TRUE=
+ THREADS_FALSE='#'
+else
+ THREADS_TRUE='#'
+ THREADS_FALSE=
+fi
+
+ if test x$THREADS = xposix; then
+ PTHREADS_TRUE=
+ PTHREADS_FALSE='#'
+else
+ PTHREADS_TRUE='#'
+ PTHREADS_FALSE=
+fi
+
+ if test x$darwin_threads = xtrue; then
+ DARWIN_THREADS_TRUE=
+ DARWIN_THREADS_FALSE='#'
+else
+ DARWIN_THREADS_TRUE='#'
+ DARWIN_THREADS_FALSE=
+fi
+
+ if test x$win32_threads = xtrue; then
+ WIN32_THREADS_TRUE=
+ WIN32_THREADS_FALSE='#'
+else
+ WIN32_THREADS_TRUE='#'
+ WIN32_THREADS_FALSE=
+fi
+
+
+compiler_suncc=no
+pthread_start_standalone=no
+case "$host" in
+ *-*-*linux*)
+ # Turn on the workaround described in pthread_start.c.
+ if test "$THREADS" = posix
+then :
+ pthread_start_standalone=yes
+fi
+ ;;
+ powerpc-*-darwin*)
+ powerpc_darwin=true
+ ;;
+ *-*-solaris*)
+ if test "$GCC" != yes; then
+ # Solaris SunCC
+ compiler_suncc=yes
+ CFLAGS="-O $CFLAGS"
+ fi
+ ;;
+ *-*-wince*)
+ if test "$enable_gc_debug" != "no"; then
+
+printf "%s\n" "@%:@define GC_READ_ENV_FILE 1" >>confdefs.h
+
+ fi
+ ;;
+esac
+ if test x$pthread_start_standalone = xyes; then
+ PTHREAD_START_STANDALONE_TRUE=
+ PTHREAD_START_STANDALONE_FALSE='#'
+else
+ PTHREAD_START_STANDALONE_TRUE='#'
+ PTHREAD_START_STANDALONE_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ # Output all warnings.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wextra" >&5
+printf %s "checking whether compiler supports -Wextra... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Wextra $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_cc_wextra=yes
+else $as_nop
+ ac_cv_cc_wextra=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_wextra" >&5
+printf "%s\n" "$ac_cv_cc_wextra" >&6; }
+ if test "$ac_cv_cc_wextra" = yes
+then :
+ WEXTRA="-Wextra"
+else $as_nop
+ WEXTRA="-W"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wpedantic" >&5
+printf %s "checking whether compiler supports -Wpedantic... " >&6; }
+ CFLAGS="-Wpedantic -Wno-long-long $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ extern int quiet;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_cc_pedantic=yes
+else $as_nop
+ ac_cv_cc_pedantic=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_pedantic" >&5
+printf "%s\n" "$ac_cv_cc_pedantic" >&6; }
+ WPEDANTIC=
+ if test "$ac_cv_cc_pedantic" = yes
+then :
+ WPEDANTIC="-Wpedantic -Wno-long-long"
+fi
+ CFLAGS="-Wall $WEXTRA $WPEDANTIC $CFLAGS"
+ CXXFLAGS="-Wall $WEXTRA $WPEDANTIC $CXXFLAGS"
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xlc" >&5
+printf %s "checking for xlc... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ #ifndef __xlC__
+ # error
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ compiler_xlc=yes
+else $as_nop
+ compiler_xlc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $compiler_xlc" >&5
+printf "%s\n" "$compiler_xlc" >&6; }
+if test $compiler_xlc = yes -a "$powerpc_darwin" = true; then
+ # the darwin stack-frame-walking code is completely broken on xlc
+
+printf "%s\n" "@%:@define DARWIN_DONT_PARSE_STACK 1" >>confdefs.h
+
+fi
+
+# XLC neither requires nor tolerates the unnecessary assembler goop.
+# Similar for the Sun C compiler.
+ if test $compiler_xlc = yes -o $compiler_suncc = yes; then
+ ASM_WITH_CPP_UNSUPPORTED_TRUE=
+ ASM_WITH_CPP_UNSUPPORTED_FALSE='#'
+else
+ ASM_WITH_CPP_UNSUPPORTED_TRUE='#'
+ ASM_WITH_CPP_UNSUPPORTED_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ # Disable aliasing optimization unless forced to.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fno-strict-aliasing" >&5
+printf %s "checking whether compiler supports -fno-strict-aliasing... " >&6; }
+ ac_cv_fno_strict_aliasing=no
+ for cflag in $CFLAGS; do
+ case "$cflag" in
+ -fstrict-aliasing)
+ # Opposite option already present
+ ac_cv_fno_strict_aliasing=skipped
+ break
+ ;;
+ esac
+ done
+ if test "$ac_cv_fno_strict_aliasing" != skipped; then
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_fno_strict_aliasing=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_fno_strict_aliasing" = yes
+then :
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+fi
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fno_strict_aliasing" >&5
+printf "%s\n" "$ac_cv_fno_strict_aliasing" >&6; }
+fi
+
+# Check for getcontext (uClibc can be configured without it, for example)
+ac_fn_c_check_func "$LINENO" "getcontext" "ac_cv_func_getcontext"
+if test "x$ac_cv_func_getcontext" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "@%:@define NO_GETCONTEXT 1" >>confdefs.h
+
+fi
+
+
+# Check whether dl_iterate_phdr exists (as a strong symbol).
+ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr"
+if test "x$ac_cv_func_dl_iterate_phdr" = xyes
+then :
+ printf "%s\n" "@%:@define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h
+
+fi
+
+
+case "$host" in
+# While IRIX 6 has libdl for the O32 and N32 ABIs, it's missing for N64
+# and unnecessary everywhere.
+ mips-sgi-irix6*) ;;
+# We never want libdl on darwin. It is a fake libdl that just ends up making
+# dyld calls anyway. The same applies to Cygwin.
+ *-*-cygwin* | *-*-darwin* | *-*-msys*)
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ THREADDLLIBS="$THREADDLLIBS -ldl"
+fi
+
+ ;;
+esac
+
+case "$host" in
+ *-*-hpux*)
+ avoid_cpp_lib=yes;;
+ *)
+ avoid_cpp_lib=no;
+ ;;
+esac
+ if test $avoid_cpp_lib = yes; then
+ AVOID_CPP_LIB_TRUE=
+ AVOID_CPP_LIB_FALSE='#'
+else
+ AVOID_CPP_LIB_TRUE='#'
+ AVOID_CPP_LIB_FALSE=
+fi
+
+
+# Check for various headers.
+ac_fn_c_check_header_compile "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default"
+if test "x$ac_cv_header_execinfo_h" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "@%:@define GC_MISSING_EXECINFO_H 1" >>confdefs.h
+
+fi
+
+
+# extra LD Flags which are required for targets
+case "${host}" in
+ *-*-darwin*)
+ extra_ldflags_libgc=-Wl,-single_module
+ ;;
+esac
+
+
+
+
+target_all=libgc.la
+
+
+TARGET_ECOS="no"
+
+@%:@ Check whether --with-ecos was given.
+if test ${with_ecos+y}
+then :
+ withval=$with_ecos; TARGET_ECOS="$with_ecos"
+
+fi
+
+
+addobjs=
+addlibs=
+CXXLIBS=
+
+case "$TARGET_ECOS" in
+ no)
+ ;;
+ *)
+
+printf "%s\n" "@%:@define ECOS 1" >>confdefs.h
+
+ AM_CPPFLAGS="-I${TARGET_ECOS}/include $AM_CPPFLAGS"
+ addobjs="$addobjs ecos.lo"
+ ;;
+esac
+
+ if test "${enable_cplusplus}" = yes; then
+ CPLUSPLUS_TRUE=
+ CPLUSPLUS_FALSE='#'
+else
+ CPLUSPLUS_TRUE='#'
+ CPLUSPLUS_FALSE=
+fi
+
+
+@%:@ Check whether --enable-throw-bad-alloc-library was given.
+if test ${enable_throw_bad_alloc_library+y}
+then :
+ enableval=$enable_throw_bad_alloc_library;
+fi
+
+ if test "${enable_cplusplus}" = yes \
+ -a "${enable_throw_bad_alloc_library}" != no; then
+ GC_TBA_LIBRARY_TRUE=
+ GC_TBA_LIBRARY_FALSE='#'
+else
+ GC_TBA_LIBRARY_TRUE='#'
+ GC_TBA_LIBRARY_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ if test "${enable_cplusplus}" = yes; then
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libsupc++ required" >&5
+printf %s "checking whether libsupc++ required... " >&6; }
+ SUPC="`$CXX -print-file-name=libsupc++.a 2>/dev/null`"
+ if test -n "$SUPC" -a "$SUPC" != "libsupc++.a"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ CXXLIBS="-lsupc++"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ esac
+ fi
+fi
+
+
+
+
+
+
+# Configuration of shared libraries
+#
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+@%:@ Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+case "$host" in
+ alpha-*-openbsd*)
+ enable_shared=no
+ ;;
+ *)
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+# Compile with GC_DLL defined unless building static libraries.
+if test "${enable_shared}" != no -a "${enable_static}" != yes; then
+ printf "%s\n" "@%:@define GC_DLL 1" >>confdefs.h
+
+ if test "$GCC" = yes; then
+ # Pass -fvisibility=hidden option if supported
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fvisibility" >&5
+printf %s "checking whether compiler supports -fvisibility... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Werror -fvisibility=hidden $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_fvisibility_hidden=yes
+else $as_nop
+ ac_cv_fvisibility_hidden=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_fvisibility_hidden" = yes
+then :
+ CFLAGS="-DGC_VISIBILITY_HIDDEN_SET -fvisibility=hidden $CFLAGS"
+else $as_nop
+ CFLAGS="-DGC_NO_VISIBILITY $CFLAGS"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fvisibility_hidden" >&5
+printf "%s\n" "$ac_cv_fvisibility_hidden" >&6; }
+ fi
+else
+
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ # Do not require the clients to link with "user32" system library.
+
+printf "%s\n" "@%:@define DONT_USE_USER32_DLL 1" >>confdefs.h
+
+ # Use inline version of GC new and delete operators in test_cpp
+ # otherwise the system ones might be used instead because of arbitrary
+ # ordering of object files when linking.
+ CXXFLAGS="$CXXFLAGS -DGC_NOT_DLL"
+ ;;
+ esac
+fi
+
+# Configuration of machine-dependent code
+#
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which machine-dependent code should be used" >&5
+printf %s "checking which machine-dependent code should be used... " >&6; }
+machdep=
+case "$host" in
+ alpha-*-openbsd*)
+ if test x"${ac_cv_lib_dl_dlopen}" != xyes ; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"OpenBSD/Alpha without dlopen(). Shared library support is disabled.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"OpenBSD/Alpha without dlopen(). Shared library support is disabled.\"" >&2;}
+ fi
+ ;;
+ i?86-*-solaris2.[89])
+ # PROC_VDB appears to work in 2.8 and 2.9 but not in 2.10+ (for now).
+
+printf "%s\n" "@%:@define SOLARIS25_PROC_VDB_BUG_FIXED 1" >>confdefs.h
+
+ ;;
+ sparc-*-netbsd*)
+ machdep="sparc_netbsd_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc*-*-linux* | sparc*-*-openbsd* | sparc64-*-freebsd* | sparc64-*-netbsd*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc-sun-solaris2.3)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+
+printf "%s\n" "@%:@define SUNOS53_SHARED_LIB 1" >>confdefs.h
+
+ ;;
+ sparc*-sun-solaris2*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ ia64-*-*)
+ machdep="ia64_save_regs_in_stack.lo"
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $machdep" >&5
+printf "%s\n" "$machdep" >&6; }
+addobjs="$addobjs $machdep"
+
+
+
+
+
+# Suppress "extension used" clang warning (when compiling .S files).
+if test x$compile_asm = xtrue -a "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-language-extension-token" >&5
+printf %s "checking whether compiler supports -Wno-language-extension-token... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-language-extension-token"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_lang_ext_token=yes
+else $as_nop
+ ac_cv_lang_ext_token=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_lang_ext_token" = yes
+then :
+ CFLAGS="$CFLAGS -Wno-language-extension-token"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lang_ext_token" >&5
+printf "%s\n" "$ac_cv_lang_ext_token" >&6; }
+fi
+
+
+@%:@ Check whether --with-target-subdir was given.
+if test ${with_target_subdir+y}
+then :
+ withval=$with_target_subdir;
+fi
+
+
+@%:@ Check whether --with-cross-host was given.
+if test ${with_cross_host+y}
+then :
+ withval=$with_cross_host;
+fi
+
+
+if false; then
+ :
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether AIX gcc optimization fix is necessary" >&5
+printf %s "checking whether AIX gcc optimization fix is necessary... " >&6; }
+case "$host" in
+ *aix*)
+ if test "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ new_CFLAGS=
+ for i in $CFLAGS; do
+ case "$i" in
+ -O*)
+ ;;
+ *)
+ new_CFLAGS="$new_CFLAGS $i"
+ ;;
+ esac
+ done
+ CFLAGS="$new_CFLAGS"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
+
+
+printf "%s\n" "@%:@define NO_EXECUTE_PERMISSION 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define ALL_INTERIOR_POINTERS 1" >>confdefs.h
+
+
+
+@%:@ Check whether --enable-gcj-support was given.
+if test ${enable_gcj_support+y}
+then :
+ enableval=$enable_gcj_support;
+fi
+
+if test x"$enable_gcj_support" != xno; then
+
+printf "%s\n" "@%:@define GC_GCJ_SUPPORT 1" >>confdefs.h
+
+ case "$host" in
+ *-*-kfreebsd*-gnu)
+ # FIXME: For a reason, gctest hangs up on kFreeBSD if both of
+ # THREAD_LOCAL_ALLOC and GC_ENABLE_SUSPEND_THREAD are defined.
+ if test "${enable_thread_local_alloc}" = no; then
+ printf "%s\n" "@%:@define GC_ENABLE_SUSPEND_THREAD 1" >>confdefs.h
+
+ fi
+ ;;
+ *)
+
+printf "%s\n" "@%:@define GC_ENABLE_SUSPEND_THREAD 1" >>confdefs.h
+
+ ;;
+ esac
+fi
+ if test x"enable_gcj_support" != xno; then
+ ENABLE_GCJ_SUPPORT_TRUE=
+ ENABLE_GCJ_SUPPORT_FALSE='#'
+else
+ ENABLE_GCJ_SUPPORT_TRUE='#'
+ ENABLE_GCJ_SUPPORT_FALSE=
+fi
+
+
+@%:@ Check whether --enable-sigrt-signals was given.
+if test ${enable_sigrt_signals+y}
+then :
+ enableval=$enable_sigrt_signals;
+fi
+
+if test x"${enable_sigrt_signals}" = xyes; then
+
+printf "%s\n" "@%:@define GC_USESIGRT_SIGNALS 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+UNWINDLIBS=
+@%:@ Check whether --enable-gc-debug was given.
+if test ${enable_gc_debug+y}
+then :
+ enableval=$enable_gc_debug; if test "$enable_gc_debug" = "yes"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Should define GC_DEBUG and use debug alloc in clients.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Should define GC_DEBUG and use debug alloc in clients.\"" >&2;}
+
+printf "%s\n" "@%:@define KEEP_BACK_PTRS 1" >>confdefs.h
+
+ keep_back_ptrs=true
+
+printf "%s\n" "@%:@define DBG_HDRS_ALL 1" >>confdefs.h
+
+
+
+ case $host in
+ ia64-*-linux* )
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ printf "%s\n" "@%:@define SAVE_CALL_COUNT 8" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for backtrace in -lunwind" >&5
+printf %s "checking for backtrace in -lunwind... " >&6; }
+if test ${ac_cv_lib_unwind_backtrace+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lunwind $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char backtrace ();
+int
+main (void)
+{
+return backtrace ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_unwind_backtrace=yes
+else $as_nop
+ ac_cv_lib_unwind_backtrace=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_unwind_backtrace" >&5
+printf "%s\n" "$ac_cv_lib_unwind_backtrace" >&6; }
+if test "x$ac_cv_lib_unwind_backtrace" = xyes
+then :
+
+ printf "%s\n" "@%:@define GC_HAVE_BUILTIN_BACKTRACE 1" >>confdefs.h
+
+ UNWINDLIBS=-lunwind
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Client code may need to link against libunwind.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Client code may need to link against libunwind.\"" >&2;}
+
+fi
+
+ ;;
+ x86-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&2;}
+ printf "%s\n" "@%:@define SAVE_CALL_COUNT 8" >>confdefs.h
+
+ ;;
+ i345686-*-dgux*)
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+fi
+
+ if test x"$enable_gc_debug" = xyes; then
+ MAKE_BACK_GRAPH_TRUE=
+ MAKE_BACK_GRAPH_FALSE='#'
+else
+ MAKE_BACK_GRAPH_TRUE='#'
+ MAKE_BACK_GRAPH_FALSE=
+fi
+
+ if test x"$keep_back_ptrs" = xtrue; then
+ KEEP_BACK_PTRS_TRUE=
+ KEEP_BACK_PTRS_FALSE='#'
+else
+ KEEP_BACK_PTRS_TRUE='#'
+ KEEP_BACK_PTRS_FALSE=
+fi
+
+
+# Check whether a compiler warning of unsafe __builtin_return_address(1)
+# could be suppressed by -Wno-frame-address option.
+# __builtin_return_address(1) is used by libgc for debugging purposes only.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -Wno-frame-address works" >&5
+printf %s "checking whether -Wno-frame-address works... " >&6; }
+use_wno_error_frame_address=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Werror -Wno-frame-address $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+{
+ if (!__builtin_return_address(1)) return 1;
+}
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ use_wno_error_frame_address=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $use_wno_error_frame_address" >&5
+printf "%s\n" "$use_wno_error_frame_address" >&6; }
+if test x"$use_wno_error_frame_address" = xyes; then
+ CFLAGS="$CFLAGS -Wno-frame-address"
+fi
+
+# Check for dladdr (used for debugging).
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dladdr" >&5
+printf %s "checking for dladdr... " >&6; }
+have_dladdr=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _GNU_SOURCE 1
+#include <dlfcn.h>
+int
+main (void)
+{
+{
+ Dl_info info;
+ (void)dladdr("", &info);
+}
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ have_dladdr=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_dladdr" >&5
+printf "%s\n" "$have_dladdr" >&6; }
+if test x"$have_dladdr" = xyes; then
+
+printf "%s\n" "@%:@define HAVE_DLADDR 1" >>confdefs.h
+
+fi
+
+# sigsetjmp could be a macro (thus AC_CHECK_FUNCS cannot be used).
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sigsetjmp" >&5
+printf %s "checking for sigsetjmp... " >&6; }
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <setjmp.h>
+int
+main (void)
+{
+sigjmp_buf t; sigsetjmp(t, 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+printf "%s\n" "@%:@define GC_NO_SIGSETJMP 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+
+# pthread_setname_np, if available, may have 1, 2 or 3 arguments.
+if test "$THREADS" = posix
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_setname_np" >&5
+printf %s "checking for pthread_setname_np... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -Werror"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np("thread-name")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (w/o tid)" >&5
+printf "%s\n" "yes (w/o tid)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID 1" >>confdefs.h
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np(pthread_self(), "thread-name-%u", 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (with tid and arg)" >&5
+printf "%s\n" "yes (with tid and arg)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG 1" >>confdefs.h
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np(pthread_self(), "thread-name")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (with tid)" >&5
+printf "%s\n" "yes (with tid)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITH_TID 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for AViiON Machines running DGUX
+ac_is_dgux=no
+ac_fn_c_check_header_compile "$LINENO" "sys/dg_sys_info.h" "ac_cv_header_sys_dg_sys_info_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_dg_sys_info_h" = xyes
+then :
+ ac_is_dgux=yes;
+fi
+
+
+if test $ac_is_dgux = yes; then
+ dgux_spec_opts="-DDGUX -D_DGUX_SOURCE -Di386 -mno-legend -O2"
+ CFLAGS="$dgux_spec_opts $CFLAGS"
+ CXXFLAGS="$dgux_spec_opts $CXXFLAGS"
+ if test "$enable_gc_debug" = "yes"; then
+ CFLAGS="-g -mstandard $CFLAGS"
+ CXXFLAGS="-g -mstandard $CXXFLAGS"
+ fi
+
+
+fi
+
+@%:@ Check whether --enable-java-finalization was given.
+if test ${enable_java_finalization+y}
+then :
+ enableval=$enable_java_finalization;
+fi
+
+if test x"$enable_java_finalization" != xno; then
+
+printf "%s\n" "@%:@define JAVA_FINALIZATION 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-atomic-uncollectable was given.
+if test ${enable_atomic_uncollectable+y}
+then :
+ enableval=$enable_atomic_uncollectable;
+fi
+
+if test x"$enable_atomic_uncollectible" != x"no"; then
+
+printf "%s\n" "@%:@define GC_ATOMIC_UNCOLLECTABLE 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-redirect-malloc was given.
+if test ${enable_redirect_malloc+y}
+then :
+ enableval=$enable_redirect_malloc;
+fi
+
+
+if test "${enable_redirect_malloc}" = yes; then
+ if test "${enable_gc_debug}" = yes; then
+
+printf "%s\n" "@%:@define REDIRECT_MALLOC GC_debug_malloc_replacement" >>confdefs.h
+
+
+printf "%s\n" "@%:@define REDIRECT_REALLOC GC_debug_realloc_replacement" >>confdefs.h
+
+
+printf "%s\n" "@%:@define REDIRECT_FREE GC_debug_free" >>confdefs.h
+
+ else
+ printf "%s\n" "@%:@define REDIRECT_MALLOC GC_malloc" >>confdefs.h
+
+ fi
+
+printf "%s\n" "@%:@define GC_USE_DLOPEN_WRAP 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-disclaim was given.
+if test ${enable_disclaim+y}
+then :
+ enableval=$enable_disclaim;
+fi
+
+if test x"$enable_disclaim" != xno; then
+
+printf "%s\n" "@%:@define ENABLE_DISCLAIM 1" >>confdefs.h
+
+fi
+ if test x"$enable_disclaim" != xno; then
+ ENABLE_DISCLAIM_TRUE=
+ ENABLE_DISCLAIM_FALSE='#'
+else
+ ENABLE_DISCLAIM_TRUE='#'
+ ENABLE_DISCLAIM_FALSE=
+fi
+
+
+@%:@ Check whether --enable-large-config was given.
+if test ${enable_large_config+y}
+then :
+ enableval=$enable_large_config;
+fi
+
+if test "${enable_large_config}" = yes; then
+
+printf "%s\n" "@%:@define LARGE_CONFIG 1" >>confdefs.h
+
+fi
+
+if test -n "${with_cross_host}"; then
+
+printf "%s\n" "@%:@define NO_CLOCK 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define SMALL_CONFIG 1" >>confdefs.h
+
+fi
+
+if test "$enable_gc_debug" = "no"; then
+
+printf "%s\n" "@%:@define NO_DEBUGGING 1" >>confdefs.h
+
+fi
+
+
+
+@%:@ Check whether --enable-gc-assertions was given.
+if test ${enable_gc_assertions+y}
+then :
+ enableval=$enable_gc_assertions;
+fi
+
+if test "${enable_gc_assertions}" = yes; then
+
+printf "%s\n" "@%:@define GC_ASSERTIONS 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-mmap was given.
+if test ${enable_mmap+y}
+then :
+ enableval=$enable_mmap; gc_use_mmap=$enableval
+fi
+
+
+@%:@ Check whether --enable-munmap was given.
+if test ${enable_munmap+y}
+then :
+ enableval=$enable_munmap; MUNMAP_THRESHOLD=$enableval
+fi
+
+if test x$enable_munmap != xno; then
+
+printf "%s\n" "@%:@define USE_MMAP 1" >>confdefs.h
+
+
+
+printf "%s\n" "@%:@define USE_MUNMAP 1" >>confdefs.h
+
+ if test x$MUNMAP_THRESHOLD = x -o x$MUNMAP_THRESHOLD = xyes; then
+ MUNMAP_THRESHOLD=6
+ fi
+
+printf "%s\n" "@%:@define MUNMAP_THRESHOLD ${MUNMAP_THRESHOLD}" >>confdefs.h
+
+else
+ if test "${gc_use_mmap}" = "yes"; then
+
+printf "%s\n" "@%:@define USE_MMAP 1" >>confdefs.h
+
+ fi
+fi
+
+@%:@ Check whether --enable-dynamic-loading was given.
+if test ${enable_dynamic_loading+y}
+then :
+ enableval=$enable_dynamic_loading;
+fi
+
+if test "${enable_dynamic_loading}" = "no"; then
+
+printf "%s\n" "@%:@define IGNORE_DYNAMIC_LOADING 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-register-main-static-data was given.
+if test ${enable_register_main_static_data+y}
+then :
+ enableval=$enable_register_main_static_data;
+fi
+
+if test "${enable_register_main_static_data}" = "no"; then
+
+printf "%s\n" "@%:@define GC_DONT_REGISTER_MAIN_STATIC_DATA 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-checksums was given.
+if test ${enable_checksums+y}
+then :
+ enableval=$enable_checksums;
+fi
+
+if test x$enable_checksums = xyes; then
+ if test x$enable_munmap != xno -o x$THREADS != xnone; then
+ as_fn_error $? "CHECKSUMS not compatible with USE_MUNMAP or threads" "$LINENO" 5
+ fi
+
+printf "%s\n" "@%:@define CHECKSUMS 1" >>confdefs.h
+
+fi
+ if test x$enable_checksums = xyes; then
+ CHECKSUMS_TRUE=
+ CHECKSUMS_FALSE='#'
+else
+ CHECKSUMS_TRUE='#'
+ CHECKSUMS_FALSE=
+fi
+
+
+ if test -z "$with_cross_host"; then
+ USE_LIBDIR_TRUE=
+ USE_LIBDIR_FALSE='#'
+else
+ USE_LIBDIR_TRUE='#'
+ USE_LIBDIR_FALSE=
+fi
+
+
+@%:@ Check whether --enable-werror was given.
+if test ${enable_werror+y}
+then :
+ enableval=$enable_werror; werror_flag=$enableval
+else $as_nop
+ werror_flag=no
+fi
+
+if test x$werror_flag = xyes; then
+ WERROR_CFLAGS="-Werror"
+ case "$host" in
+ # _dyld_bind_fully_image_containing_address is deprecated in OS X 10.5+
+ *-*-darwin*)
+ WERROR_CFLAGS="$WERROR_CFLAGS -Wno-deprecated-declarations"
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-single-obj-compilation was given.
+if test ${enable_single_obj_compilation+y}
+then :
+ enableval=$enable_single_obj_compilation;
+else $as_nop
+ if test x"$enable_static" = xno
+then :
+ enable_single_obj_compilation=yes
+fi
+fi
+
+ if test x"$enable_single_obj_compilation" = xyes; then
+ SINGLE_GC_OBJ_TRUE=
+ SINGLE_GC_OBJ_FALSE='#'
+else
+ SINGLE_GC_OBJ_TRUE='#'
+ SINGLE_GC_OBJ_FALSE=
+fi
+
+
+@%:@ Check whether --enable-gcov was given.
+if test ${enable_gcov+y}
+then :
+ enableval=$enable_gcov;
+fi
+
+if test "$enable_gcov" = "yes"; then
+ CFLAGS="-D NTHREADS=20 $CFLAGS --coverage"
+ if test "${enable_shared}" = no; then
+ # FIXME: As of g++-4.8.4/x64, in case of shared library build, test_cpp
+ # linkage fails with "hidden symbol atexit is referenced by DSO" message.
+ CXXFLAGS="$CXXFLAGS --coverage"
+ fi
+ # Turn off optimization to get accurate line numbers.
+ CFLAGS=`echo "$CFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+ CXXFLAGS=`echo "$CXXFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+fi
+
+@%:@ Check whether --enable-docs was given.
+if test ${enable_docs+y}
+then :
+ enableval=$enable_docs;
+fi
+
+ if test x$enable_docs != xno; then
+ ENABLE_DOCS_TRUE=
+ ENABLE_DOCS_FALSE='#'
+else
+ ENABLE_DOCS_TRUE='#'
+ ENABLE_DOCS_FALSE=
+fi
+
+
+ if test x$enable_shared = xyes; then
+ ENABLE_SHARED_TRUE=
+ ENABLE_SHARED_FALSE='#'
+else
+ ENABLE_SHARED_TRUE='#'
+ ENABLE_SHARED_FALSE=
+fi
+
+
+# Atomic Ops
+# ----------
+
+# Do we want to use an external libatomic_ops? By default use it if it's
+# found.
+
+@%:@ Check whether --with-libatomic-ops was given.
+if test ${with_libatomic_ops+y}
+then :
+ withval=$with_libatomic_ops;
+else $as_nop
+ if test x"$THREADS" != xnone
+then :
+ with_libatomic_ops=check
+else $as_nop
+ with_libatomic_ops=none
+fi
+fi
+
+
+# Check whether compiler atomic intrinsics can be used.
+if test x"$with_libatomic_ops" = xcheck; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler intrinsics support" >&5
+printf %s "checking for compiler intrinsics support... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -DGC_BUILTIN_ATOMIC"
+ CFLAGS="$CFLAGS -I${srcdir}/include -I${srcdir}/tests"
+ if test "$cross_compiling" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: skipped because cross-compiling" >&5
+printf "%s\n" "skipped because cross-compiling" >&6; }
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "test_atomic_ops.c"
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ with_libatomic_ops=none
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for an external libatomic_ops if the above answer is "yes" or "check".
+# If not found, fail on "yes", and convert "check" to "no".
+# First, check that libatomic_ops usage is not disabled explicitly.
+missing_libatomic_ops=false
+if test x"$with_libatomic_ops" != xno -a x"$with_libatomic_ops" != xnone
+then :
+ missing_libatomic_ops=true
+fi
+
+
+if test x$missing_libatomic_ops = xtrue
+then :
+ ac_fn_c_check_header_compile "$LINENO" "atomic_ops.h" "ac_cv_header_atomic_ops_h" "$ac_includes_default"
+if test "x$ac_cv_header_atomic_ops_h" = xyes
+then :
+ missing_libatomic_ops=false
+fi
+
+fi
+if test x$missing_libatomic_ops = xtrue
+then :
+ if test x"$with_libatomic_ops" != xcheck
+then :
+ as_fn_error $? "An external libatomic_ops was not found" "$LINENO" 5
+fi
+ with_libatomic_ops=no
+fi
+
+# If we have neither an external or an internal version, offer a useful hint
+# and exit.
+if test x"$with_libatomic_ops" = xno \
+ -a ! -e "$srcdir/libatomic_ops/src/atomic_ops.h"
+then :
+ as_fn_error $? "libatomic_ops is required. You can either install it on
+ your system, or fetch and unpack a recent version into the
+ source directory and link or rename it to libatomic_ops." "$LINENO" 5
+fi
+
+# Finally, emit the definitions for bundled or external AO.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which libatomic_ops to use" >&5
+printf %s "checking which libatomic_ops to use... " >&6; }
+
+
+if test x"$with_libatomic_ops" != xno
+then :
+ if test x"$with_libatomic_ops" != xnone -a x"$THREADS" != xnone
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: external" >&5
+printf "%s\n" "external" >&6; }
+ ATOMIC_OPS_LIBS="-latomic_ops"
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+ if test x"$THREADS" != xnone
+then :
+
+printf "%s\n" "@%:@define GC_BUILTIN_ATOMIC 1" >>confdefs.h
+
+fi
+fi
+ AO_TRYLINK_CFLAGS=""
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: internal" >&5
+printf "%s\n" "internal" >&6; }
+ AO_TRYLINK_CFLAGS="-I${srcdir}/libatomic_ops/src"
+ ATOMIC_OPS_CFLAGS='-I$(top_builddir)/libatomic_ops/src -I$(top_srcdir)/libatomic_ops/src'
+ ATOMIC_OPS_LIBS=""
+
+ subdirs="$subdirs libatomic_ops"
+
+
+fi
+ if test x$with_libatomic_ops = xno -a x"$THREADS" != xnone; then
+ USE_INTERNAL_LIBATOMIC_OPS_TRUE=
+ USE_INTERNAL_LIBATOMIC_OPS_FALSE='#'
+else
+ USE_INTERNAL_LIBATOMIC_OPS_TRUE='#'
+ USE_INTERNAL_LIBATOMIC_OPS_FALSE=
+fi
+
+ if test x$with_libatomic_ops = xno -a x$need_atomic_ops_asm = xtrue; then
+ NEED_ATOMIC_OPS_ASM_TRUE=
+ NEED_ATOMIC_OPS_ASM_FALSE='#'
+else
+ NEED_ATOMIC_OPS_ASM_TRUE='#'
+ NEED_ATOMIC_OPS_ASM_FALSE=
+fi
+
+
+# Check whether particular AO primitives are emulated with locks.
+# The check below is based on the fact that linking with the libatomic_ops
+# binary file is not needed in case of absence of the emulation (except for
+# Solaris SPARC).
+if test x$with_libatomic_ops != xnone -a x$need_atomic_ops_asm != xtrue
+then :
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $AO_TRYLINK_CFLAGS $CFLAGS_EXTRA"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free AO_or primitive" >&5
+printf %s "checking for lock-free AO_or primitive... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;AO_or(&x,1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "@%:@define HAVE_LOCKFREE_AO_OR 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free AO load/store, test-and-set primitives" >&5
+printf %s "checking for lock-free AO load/store, test-and-set primitives... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;unsigned char c=0;AO_TS_t z=AO_TS_INITIALIZER;
+ (void)AO_test_and_set_acquire(&z);AO_CLEAR(&z);AO_compiler_barrier();
+ AO_store(&x,AO_load(&x)+1);AO_char_store(&c,AO_char_load(&c)+1);
+ AO_store_release(&x,AO_load_acquire(&x)+1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ use_thread_local_alloc=no
+
+printf "%s\n" "@%:@define BASE_ATOMIC_OPS_EMULATED 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test x$use_parallel_mark != xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free compare-and-swap and fetch-and-add primitives" >&5
+printf %s "checking for lock-free compare-and-swap and fetch-and-add primitives... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;(void)AO_fetch_and_add(&x,1);(void)AO_compare_and_swap(&x,1,2)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ use_parallel_mark=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ CFLAGS="$old_CFLAGS"
+fi
+
+if test x$use_parallel_mark != xno
+then :
+ printf "%s\n" "@%:@define PARALLEL_MARK 1" >>confdefs.h
+
+fi
+if test x$use_thread_local_alloc != xno
+then :
+ printf "%s\n" "@%:@define THREAD_LOCAL_ALLOC 1" >>confdefs.h
+
+fi
+ if test x$use_thread_local_alloc != xno; then
+ THREAD_LOCAL_ALLOC_TRUE=
+ THREAD_LOCAL_ALLOC_FALSE='#'
+else
+ THREAD_LOCAL_ALLOC_TRUE='#'
+ THREAD_LOCAL_ALLOC_FALSE=
+fi
+
+
+@%:@ Check whether --enable-handle-fork was given.
+if test ${enable_handle_fork+y}
+then :
+ enableval=$enable_handle_fork;
+fi
+
+if test "${enable_handle_fork}" = yes; then
+
+printf "%s\n" "@%:@define HANDLE_FORK 1" >>confdefs.h
+
+elif test "${enable_handle_fork}" = no; then
+
+printf "%s\n" "@%:@define NO_HANDLE_FORK 1" >>confdefs.h
+
+elif test "${enable_handle_fork}" != manual -a x$THREADS = xposix; then
+ # If the option is omitted, pthread_atfork handlers are installed
+ # by default for the targets where pthread_atfork is known to work.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-freebsd* | \
+ *-*-haiku* | *-*-hpux11* | *-*-irix* | *-*-kfreebsd*-gnu | \
+ *-*-*linux* | *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ printf "%s\n" "@%:@define HANDLE_FORK 1" >>confdefs.h
+
+ ;;
+ esac
+fi
+
+
+ac_config_files="$ac_config_files Makefile bdw-gc.pc"
+
+
+ac_config_commands="$ac_config_commands default"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIB@&t@OBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${EMSCRIPTEN_TRUE}" && test -z "${EMSCRIPTEN_FALSE}"; then
+ as_fn_error $? "conditional \"EMSCRIPTEN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THREADS_TRUE}" && test -z "${THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PTHREADS_TRUE}" && test -z "${PTHREADS_FALSE}"; then
+ as_fn_error $? "conditional \"PTHREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DARWIN_THREADS_TRUE}" && test -z "${DARWIN_THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"DARWIN_THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WIN32_THREADS_TRUE}" && test -z "${WIN32_THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"WIN32_THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PTHREAD_START_STANDALONE_TRUE}" && test -z "${PTHREAD_START_STANDALONE_FALSE}"; then
+ as_fn_error $? "conditional \"PTHREAD_START_STANDALONE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ASM_WITH_CPP_UNSUPPORTED_TRUE}" && test -z "${ASM_WITH_CPP_UNSUPPORTED_FALSE}"; then
+ as_fn_error $? "conditional \"ASM_WITH_CPP_UNSUPPORTED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AVOID_CPP_LIB_TRUE}" && test -z "${AVOID_CPP_LIB_FALSE}"; then
+ as_fn_error $? "conditional \"AVOID_CPP_LIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CPLUSPLUS_TRUE}" && test -z "${CPLUSPLUS_FALSE}"; then
+ as_fn_error $? "conditional \"CPLUSPLUS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GC_TBA_LIBRARY_TRUE}" && test -z "${GC_TBA_LIBRARY_FALSE}"; then
+ as_fn_error $? "conditional \"GC_TBA_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GCJ_SUPPORT_TRUE}" && test -z "${ENABLE_GCJ_SUPPORT_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_GCJ_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MAKE_BACK_GRAPH_TRUE}" && test -z "${MAKE_BACK_GRAPH_FALSE}"; then
+ as_fn_error $? "conditional \"MAKE_BACK_GRAPH\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${KEEP_BACK_PTRS_TRUE}" && test -z "${KEEP_BACK_PTRS_FALSE}"; then
+ as_fn_error $? "conditional \"KEEP_BACK_PTRS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DISCLAIM_TRUE}" && test -z "${ENABLE_DISCLAIM_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DISCLAIM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CHECKSUMS_TRUE}" && test -z "${CHECKSUMS_FALSE}"; then
+ as_fn_error $? "conditional \"CHECKSUMS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_LIBDIR_TRUE}" && test -z "${USE_LIBDIR_FALSE}"; then
+ as_fn_error $? "conditional \"USE_LIBDIR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SINGLE_GC_OBJ_TRUE}" && test -z "${SINGLE_GC_OBJ_FALSE}"; then
+ as_fn_error $? "conditional \"SINGLE_GC_OBJ\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DOCS_TRUE}" && test -z "${ENABLE_DOCS_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DOCS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INTERNAL_LIBATOMIC_OPS_TRUE}" && test -z "${USE_INTERNAL_LIBATOMIC_OPS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_INTERNAL_LIBATOMIC_OPS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${NEED_ATOMIC_OPS_ASM_TRUE}" && test -z "${NEED_ATOMIC_OPS_ASM_FALSE}"; then
+ as_fn_error $? "conditional \"NEED_ATOMIC_OPS_ASM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THREAD_LOCAL_ALLOC_TRUE}" && test -z "${THREAD_LOCAL_ALLOC_FALSE}"; then
+ as_fn_error $? "conditional \"THREAD_LOCAL_ALLOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in @%:@((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+
+@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD]
+@%:@ ----------------------------------------
+@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+@%:@ script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} @%:@ as_fn_error
+
+
+
+@%:@ as_fn_set_status STATUS
+@%:@ -----------------------
+@%:@ Set @S|@? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} @%:@ as_fn_set_status
+
+@%:@ as_fn_exit STATUS
+@%:@ -----------------
+@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} @%:@ as_fn_exit
+
+@%:@ as_fn_unset VAR
+@%:@ ---------------
+@%:@ Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+@%:@ as_fn_append VAR VALUE
+@%:@ ----------------------
+@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take
+@%:@ advantage of any shell optimizations that allow amortized linear growth over
+@%:@ repeated appends, instead of the typical quadratic growth present in naive
+@%:@ implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+@%:@ as_fn_arith ARG...
+@%:@ ------------------
+@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the
+@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments
+@%:@ must be portable across @S|@(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in @%:@(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_@&t@echo='printf %s\n'
+as_@&t@echo_n='printf %s'
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+@%:@ as_fn_mkdir_p
+@%:@ -------------
+@%:@ Create "@S|@as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} @%:@ as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+@%:@ as_fn_executable_p FILE
+@%:@ -----------------------
+@%:@ Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} @%:@ as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gc $as_me 8.2.8, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <https://github.com/ivmai/bdwgc/issues>."
+
+_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config='$ac_cs_config_escaped'
+ac_cs_version="\\
+gc config.status 8.2.8
+configured by $0, generated by GNU Autoconf 2.71,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ printf "%s\n" "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ printf "%s\n" "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ printf "%s\n" "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX
+@%:@@%:@ Running $as_me. @%:@@%:@
+_ASBOX
+ printf "%s\n" "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+FILECMD \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+
+
+
+
+ srcdir="${srcdir}"
+ host=${host}
+ CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ CC="${CC}"
+ DEFS="$DEFS"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "bdw-gc.pc") CONFIG_FILES="$CONFIG_FILES bdw-gc.pc" ;;
+ "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in @%:@(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; @%:@(
+ *) :
+ set x $CONFIG_FILES ;; @%:@(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "libtool":C)
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# A file(cmd) program that detects file types.
+FILECMD=$lt_FILECMD
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive (by configure).
+lt_ar_flags=$lt_ar_flags
+
+# Flags to create an archive.
+AR_FLAGS=\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ $SED '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+
+ cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file, --srcdir, and --disable-option-checking arguments
+ # so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ eval "set x $ac_configure_args"
+ shift
+ for ac_arg
+ do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case $ac_arg in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+ | --c=*)
+ ;;
+ --config-cache | -C)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ;;
+ --disable-option-checking)
+ ;;
+ *)
+ case $ac_arg in
+ *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
+ esac
+ done
+
+ # Always prepend --prefix to ensure using the same prefix
+ # in subdir configurations.
+ ac_arg="--prefix=$prefix"
+ case $ac_arg in
+ *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
+
+ # Pass --silent
+ if test "$silent" = yes; then
+ ac_sub_configure_args="--silent $ac_sub_configure_args"
+ fi
+
+ # Always prepend --disable-option-checking to silence warnings, since
+ # different subdirs can have different --enable and --with options.
+ ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
+
+ ac_popdir=`pwd`
+ for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ test -d "$srcdir/$ac_dir" || continue
+
+ ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
+ printf "%s\n" "$ac_msg" >&6
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ cd "$ac_dir"
+
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ ac_sub_configure=$ac_srcdir/configure.gnu
+ elif test -f "$ac_srcdir/configure"; then
+ ac_sub_configure=$ac_srcdir/configure
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
+printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+ # Make the cache file name correct relative to the subdirectory.
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+ *) # Relative name.
+ ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+printf "%s\n" "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+ # The eval makes quoting arguments work.
+ eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
+ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
+ as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
+ fi
+
+ cd "$ac_popdir"
+ done
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/graphics/asymptote/gc/autom4te.cache/output.1 b/graphics/asymptote/gc/autom4te.cache/output.1
new file mode 100644
index 0000000000..09b023a70e
--- /dev/null
+++ b/graphics/asymptote/gc/autom4te.cache/output.1
@@ -0,0 +1,22068 @@
+@%:@! /bin/sh
+@%:@ Guess values for system-dependent variables and create Makefiles.
+@%:@ Generated by GNU Autoconf 2.71 for gc 8.2.8.
+@%:@
+@%:@ Report bugs to <https://github.com/ivmai/bdwgc/issues>.
+@%:@
+@%:@
+@%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+@%:@ Inc.
+@%:@
+@%:@
+@%:@ This configure script is free software; the Free Software Foundation
+@%:@ gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in @%:@((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in @%:@ ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else \$as_nop
+ case \`(set -o) 2>/dev/null\` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
+
+else \$as_nop
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null
+then :
+ as_have_required=yes
+else $as_nop
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
+
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+ case $as_dir in @%:@(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
+
+
+ if test "x$CONFIG_SHELL" != x
+then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in @%:@ ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and
+$0: https://github.com/ivmai/bdwgc/issues about your
+$0: system, including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+@%:@ as_fn_unset VAR
+@%:@ ---------------
+@%:@ Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+
+@%:@ as_fn_set_status STATUS
+@%:@ -----------------------
+@%:@ Set @S|@? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} @%:@ as_fn_set_status
+
+@%:@ as_fn_exit STATUS
+@%:@ -----------------
+@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} @%:@ as_fn_exit
+@%:@ as_fn_nop
+@%:@ ---------
+@%:@ Do nothing but, unlike ":", preserve the value of @S|@?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+@%:@ as_fn_mkdir_p
+@%:@ -------------
+@%:@ Create "@S|@as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} @%:@ as_fn_mkdir_p
+
+@%:@ as_fn_executable_p FILE
+@%:@ -----------------------
+@%:@ Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} @%:@ as_fn_executable_p
+@%:@ as_fn_append VAR VALUE
+@%:@ ----------------------
+@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take
+@%:@ advantage of any shell optimizations that allow amortized linear growth over
+@%:@ repeated appends, instead of the typical quadratic growth present in naive
+@%:@ implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+@%:@ as_fn_arith ARG...
+@%:@ ------------------
+@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the
+@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments
+@%:@ must be portable across @S|@(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+@%:@ as_fn_nop
+@%:@ ---------
+@%:@ Do nothing but, unlike ":", preserve the value of @S|@?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD]
+@%:@ ----------------------------------------
+@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+@%:@ script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} @%:@ as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in @%:@(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_@&t@echo='printf %s\n'
+as_@&t@echo_n='printf %s'
+
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIB@&t@OBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='gc'
+PACKAGE_TARNAME='gc'
+PACKAGE_VERSION='8.2.8'
+PACKAGE_STRING='gc 8.2.8'
+PACKAGE_BUGREPORT='https://github.com/ivmai/bdwgc/issues'
+PACKAGE_URL=''
+
+ac_unique_file="gcj_mlc.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_c_list=
+enable_option_checking=no
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIB@&t@OBJS
+THREAD_LOCAL_ALLOC_FALSE
+THREAD_LOCAL_ALLOC_TRUE
+NEED_ATOMIC_OPS_ASM_FALSE
+NEED_ATOMIC_OPS_ASM_TRUE
+USE_INTERNAL_LIBATOMIC_OPS_FALSE
+USE_INTERNAL_LIBATOMIC_OPS_TRUE
+subdirs
+ATOMIC_OPS_CFLAGS
+ATOMIC_OPS_LIBS
+ENABLE_SHARED_FALSE
+ENABLE_SHARED_TRUE
+ENABLE_DOCS_FALSE
+ENABLE_DOCS_TRUE
+SINGLE_GC_OBJ_FALSE
+SINGLE_GC_OBJ_TRUE
+WERROR_CFLAGS
+USE_LIBDIR_FALSE
+USE_LIBDIR_TRUE
+CHECKSUMS_FALSE
+CHECKSUMS_TRUE
+UNWINDLIBS
+ENABLE_DISCLAIM_FALSE
+ENABLE_DISCLAIM_TRUE
+KEEP_BACK_PTRS_FALSE
+KEEP_BACK_PTRS_TRUE
+MAKE_BACK_GRAPH_FALSE
+MAKE_BACK_GRAPH_TRUE
+ENABLE_GCJ_SUPPORT_FALSE
+ENABLE_GCJ_SUPPORT_TRUE
+addlibs
+addobjs
+CXXLIBS
+AM_CPPFLAGS
+AM_CFLAGS
+GC_TBA_LIBRARY_FALSE
+GC_TBA_LIBRARY_TRUE
+CPLUSPLUS_FALSE
+CPLUSPLUS_TRUE
+target_all
+EXTRA_TEST_LIBS
+extra_ldflags_libgc
+AVOID_CPP_LIB_FALSE
+AVOID_CPP_LIB_TRUE
+ASM_WITH_CPP_UNSUPPORTED_FALSE
+ASM_WITH_CPP_UNSUPPORTED_TRUE
+PTHREAD_START_STANDALONE_FALSE
+PTHREAD_START_STANDALONE_TRUE
+WIN32_THREADS_FALSE
+WIN32_THREADS_TRUE
+DARWIN_THREADS_FALSE
+DARWIN_THREADS_TRUE
+PTHREADS_FALSE
+PTHREADS_TRUE
+THREADS_FALSE
+THREADS_TRUE
+THREADDLLIBS
+CFLAGS_EXTRA
+GC_CFLAGS
+EMSCRIPTEN_FALSE
+EMSCRIPTEN_TRUE
+CXXCPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+FILECMD
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+LIBTOOL
+am__fastdepCCAS_FALSE
+am__fastdepCCAS_TRUE
+CCASDEPMODE
+CCASFLAGS
+CCAS
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+GC_VERSION
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+CSCOPE
+ETAGS
+CTAGS
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_static
+enable_shared
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_emscripten_asyncify
+enable_threads
+enable_parallel_mark
+enable_thread_local_alloc
+enable_threads_discovery
+enable_cplusplus
+with_ecos
+enable_throw_bad_alloc_library
+with_target_subdir
+with_cross_host
+enable_gcj_support
+enable_sigrt_signals
+enable_gc_debug
+enable_java_finalization
+enable_atomic_uncollectable
+enable_redirect_malloc
+enable_disclaim
+enable_large_config
+enable_gc_assertions
+enable_mmap
+enable_munmap
+enable_dynamic_loading
+enable_register_main_static_data
+enable_checksums
+enable_werror
+enable_single_obj_compilation
+enable_gcov
+enable_docs
+with_libatomic_ops
+enable_handle_fork
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CCAS
+CCASFLAGS
+LT_SYS_LIBRARY_PATH
+CXXCPP'
+ac_subdirs_all='libatomic_ops'
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir runstatedir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures gc 8.2.8 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ @<:@@S|@ac_default_prefix@:>@
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ @<:@PREFIX@:>@
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gc@:>@
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of gc 8.2.8:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=no@:>@
+ --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@
+ --enable-fast-install@<:@=PKGS@:>@
+ optimize for fast installation @<:@default=yes@:>@
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-emscripten-asyncify
+ use Emscripten asyncify feature
+ --enable-threads=TYPE choose threading package
+ --disable-parallel-mark do not parallelize marking and free list
+ construction
+ --disable-thread-local-alloc
+ turn off thread-local allocation optimization
+ --disable-threads-discovery
+ disable threads discovery in GC
+ --enable-cplusplus install C++ support
+ --disable-throw-bad-alloc-library
+ do not build C++ gctba library
+ --disable-gcj-support disable support for gcj
+ --enable-sigrt-signals force GC to use SIGRTMIN-based signals for thread
+ suspend/resume
+ --enable-gc-debug include full support for pointer backtracing etc.
+ --disable-java-finalization
+ disable support for java finalization
+ --disable-atomic-uncollectible
+ disable support for atomic uncollectible allocation
+ --enable-redirect-malloc
+ redirect malloc and friends to GC routines
+ --disable-disclaim disable alternative (more efficient) finalization
+ interface
+ --enable-large-config optimize for large (> 100 MB) heap or root set
+ --enable-gc-assertions collector-internal assertion checking
+ --enable-mmap use mmap instead of sbrk to expand the heap
+ --enable-munmap=N return page to the OS if empty for N collections
+ (default: 6)
+ --disable-dynamic-loading
+ build the collector with disabled tracing of dynamic
+ library data roots
+ --disable-register-main-static-data
+ skip the initial guess of data root sets
+ --enable-checksums report on erroneously cleared dirty bits at
+ substantial performance cost; use only for debugging
+ of the incremental collector
+ --enable-werror pass -Werror to the C compiler
+ --enable-single-obj-compilation
+ compile all libgc source files into single .o
+ (default: yes if static libraries are disabled)
+ --enable-gcov turn on code coverage analysis
+ --disable-docs do not build and install documentation
+ --enable-handle-fork=yes|no|auto|manual
+ attempt to ensure a usable collector after fork() in
+ multi-threaded programs (default: auto; manual:
+ GC_atfork_prepare/parent/child should be called by
+ the client)
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use
+ both@:>@
+ --with-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, @<:@default=aix@:>@.
+ --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@
+ --with-sysroot@<:@=DIR@:>@ Search for dependent libraries within DIR (or the
+ compiler's sysroot if not specified).
+ --with-ecos enable runtime eCos target support
+ --with-target-subdir=SUBDIR
+ configuring with a cross compiler
+ --with-cross-host=HOST configuring with a cross compiler
+ --with-libatomic-ops=yes|no|check|none
+ use an external libatomic_ops? (default: check;
+ none: use compiler intrinsics or no thread support)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CCAS assembler compiler command (defaults to CC)
+ CCASFLAGS assembler compiler flags (defaults to CFLAGS)
+ LT_SYS_LIBRARY_PATH
+ User-defined run-time library search path.
+ CXXCPP C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <https://github.com/ivmai/bdwgc/issues>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+gc configure 8.2.8
+generated by GNU Autoconf 2.71
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+@%:@ ac_fn_c_try_compile LINENO
+@%:@ --------------------------
+@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_compile
+
+@%:@ ac_fn_cxx_try_compile LINENO
+@%:@ ----------------------------
+@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_compile
+
+@%:@ ac_fn_c_try_link LINENO
+@%:@ -----------------------
+@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_link
+
+@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+@%:@ -------------------------------------------------------
+@%:@ Tests whether HEADER exists and can be compiled using the include files in
+@%:@ INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+@%:@include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} @%:@ ac_fn_c_check_header_compile
+
+@%:@ ac_fn_c_check_func LINENO FUNC VAR
+@%:@ ----------------------------------
+@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below. */
+
+#include <limits.h>
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* 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 defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} @%:@ ac_fn_c_check_func
+
+@%:@ ac_fn_cxx_try_cpp LINENO
+@%:@ ------------------------
+@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_cpp
+
+@%:@ ac_fn_cxx_try_link LINENO
+@%:@ -------------------------
+@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_link
+
+@%:@ ac_fn_c_try_run LINENO
+@%:@ ----------------------
+@%:@ Try to run conftest.@S|@ac_ext, and return whether this succeeded. Assumes that
+@%:@ executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_run
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?@<:@ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gc $as_me 8.2.8, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ $ $0$ac_configure_args_raw
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ printf "%s\n" "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ printf "%s\n" "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ printf "%s\n" "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ printf "%s\n" "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+printf "%s\n" "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+printf "%s\n" "@%:@define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ ac_site_files="$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
+else
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+fi
+
+for ac_site_file in $ac_site_files
+do
+ case $ac_site_file in @%:@(
+ */*) :
+ ;; @%:@(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+ extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+ try {
+ throw "test";
+ } catch (const char *s) {
+ // Extra parentheses suppress a warning when building autoconf itself,
+ // due to lint rules shared with more typical C programs.
+ assert (!(strcmp) (s, "test"));
+ }
+}
+
+template <typename T> struct test_template
+{
+ T const val;
+ explicit test_template(T t) : val(t) {}
+ template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+ assert (argc);
+ assert (! argv[0]);
+{
+ test_exception_syntax ();
+ test_template<double> tt (2.0);
+ assert (tt.add (4) == 6.0);
+ assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+ constexpr int get_val() { return 20; }
+
+ struct testinit
+ {
+ int i;
+ double d;
+ };
+
+ class delegate
+ {
+ public:
+ delegate(int n) : n(n) {}
+ delegate(): delegate(2354) {}
+
+ virtual int getval() { return this->n; };
+ protected:
+ int n;
+ };
+
+ class overridden : public delegate
+ {
+ public:
+ overridden(int n): delegate(n) {}
+ virtual int getval() override final { return this->n * 2; }
+ };
+
+ class nocopy
+ {
+ public:
+ nocopy(int i): i(i) {}
+ nocopy() = default;
+ nocopy(const nocopy&) = delete;
+ nocopy & operator=(const nocopy&) = delete;
+ private:
+ int i;
+ };
+
+ // for testing lambda expressions
+ template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+ {
+ return f(v);
+ }
+
+ // for testing variadic templates and trailing return types
+ template <typename V> auto sum(V first) -> V
+ {
+ return first;
+ }
+ template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+ {
+ return first + sum(rest...);
+ }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+ // Test auto and decltype
+ auto a1 = 6538;
+ auto a2 = 48573953.4;
+ auto a3 = "String literal";
+
+ int total = 0;
+ for (auto i = a3; *i; ++i) { total += *i; }
+
+ decltype(a2) a4 = 34895.034;
+}
+{
+ // Test constexpr
+ short sa[cxx11test::get_val()] = { 0 };
+}
+{
+ // Test initializer lists
+ cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+ // Test range-based for
+ int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+ 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+ for (auto &x : array) { x += 23; }
+}
+{
+ // Test lambda expressions
+ using cxx11test::eval;
+ assert (eval ([](int x) { return x*2; }, 21) == 42);
+ double d = 2.0;
+ assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+ assert (d == 5.0);
+ assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+ assert (d == 5.0);
+}
+{
+ // Test use of variadic templates
+ using cxx11test::sum;
+ auto a = sum(1);
+ auto b = sum(1, 2);
+ auto c = sum(1.0, 2.0, 3.0);
+}
+{
+ // Test constructor delegation
+ cxx11test::delegate d1;
+ cxx11test::delegate d2();
+ cxx11test::delegate d3(45);
+}
+{
+ // Test override and final
+ cxx11test::overridden o1(55464);
+}
+{
+ // Test nullptr
+ char *c = nullptr;
+}
+{
+ // Test template brackets
+ test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+ // Unicode literals
+ char const *utf8 = u8"UTF-8 string \u2500";
+ char16_t const *utf16 = u"UTF-8 string \u2500";
+ char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ ${ac_cxx_conftest_cxx11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="ltmain.sh compile missing install-sh config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_@&t@configure="$SHELL ${ac_aux_dir}configure"
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
+else
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking GC version numbers" >&5
+printf %s "checking GC version numbers... " >&6; }
+ GC_VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\([0-9][0-9]*\)[.].*$/\1/g'`
+ GC_VERSION_MINOR=`echo $PACKAGE_VERSION | sed 's/^[^.]*[.]\([0-9][0-9]*\).*$/\1/g'`
+ GC_VERSION_MICRO=`echo $PACKAGE_VERSION | sed 's/^[^.]*[.][^.]*[.]\([0-9][0-9]*\)$/\1/g'`
+
+ if test :$GC_VERSION_MAJOR: = :: \
+ -o :$GC_VERSION_MINOR: = :: \
+ -o :$GC_VERSION_MICRO: = :: ;
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: invalid" >&5
+printf "%s\n" "invalid" >&6; }
+ as_fn_error $? "nonconforming PACKAGE_VERSION='$PACKAGE_VERSION'" "$LINENO" 5
+ fi
+
+
+printf "%s\n" "@%:@define GC_VERSION_MAJOR $GC_VERSION_MAJOR" >>confdefs.h
+
+
+printf "%s\n" "@%:@define GC_VERSION_MINOR $GC_VERSION_MINOR" >>confdefs.h
+
+
+printf "%s\n" "@%:@define GC_VERSION_MICRO $GC_VERSION_MICRO" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO" >&5
+printf "%s\n" "major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO" >&6; }
+
+am__api_version='1.16'
+
+
+ # Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in @%:@((
+ ./ | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test ${ac_cv_path_install+y}; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"`
+
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+
+ if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ 'BusyBox '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test ${ac_cv_path_mkdir+y}; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SET_MAKE=
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+@%:@ Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gc'
+ VERSION='8.2.8'
+
+
+printf "%s\n" "@%:@define PACKAGE \"$PACKAGE\"" >>confdefs.h
+
+
+printf "%s\n" "@%:@define VERSION \"$VERSION\"" >>confdefs.h
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+ac_config_headers="$ac_config_headers include/config.h"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ @%:@ Check whether --enable-maintainer-mode was given.
+if test ${enable_maintainer_mode+y}
+then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else $as_nop
+ USE_MAINTAINER_MODE=no
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+printf "%s\n" "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in @%:@(
+ '0:this is the am__doit target') :
+ case $s in @%:@(
+ BSD) :
+ am__include='.include' am__quote='"' ;; @%:@(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; @%:@(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
+
+@%:@ Check whether --enable-dependency-tracking was given.
+if test ${enable_dependency_tracking+y}
+then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $@%:@ != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else $as_nop
+ ac_file=''
+fi
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <stdio.h>
+int
+main (void)
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+y}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+else $as_nop
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+# By default we simply use the C compiler to build assembly code.
+
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+
+
+
+depcc="$CCAS" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CCAS_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CCAS_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CCAS_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CCAS_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CCAS_dependencies_compiler_type" >&6; }
+CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then
+ am__fastdepCCAS_TRUE=
+ am__fastdepCCAS_FALSE='#'
+else
+ am__fastdepCCAS_TRUE='#'
+ am__fastdepCCAS_FALSE=
+fi
+
+
+
+case `pwd` in
+ *\ * | *\ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.7'
+macro_revision='2.4.7'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+printf %s "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO ""
+}
+
+case $ECHO in
+ printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+printf "%s\n" "printf" >&6; } ;;
+ print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+printf "%s\n" "print -r" >&6; } ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+printf "%s\n" "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in sed gsed
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+printf %s "checking for fgrep... " >&6; }
+if test ${ac_cv_path_FGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+ then ac_cv_path_FGREP="$GREP -F"
+ else
+ if test -z "$FGREP"; then
+ ac_path_FGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in fgrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+ # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'FGREP' >> "conftest.nl"
+ "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_FGREP="$ac_path_FGREP"
+ ac_path_FGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_FGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_FGREP"; then
+ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_FGREP=$FGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+printf "%s\n" "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@%:@ Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test ${lt_cv_path_NM+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+printf "%s\n" "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in dumpbin "link -dump"
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DUMPBIN"; then
+ ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+printf "%s\n" "$DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$DUMPBIN" && break
+ done
+fi
+if test -z "$DUMPBIN"; then
+ ac_ct_DUMPBIN=$DUMPBIN
+ for ac_prog in dumpbin "link -dump"
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DUMPBIN"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+printf "%s\n" "$ac_ct_DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_DUMPBIN" && break
+done
+
+ if test "x$ac_ct_DUMPBIN" = x; then
+ DUMPBIN=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DUMPBIN=$ac_ct_DUMPBIN
+ fi
+fi
+
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+printf %s "checking the name lister ($NM) interface... " >&6; }
+if test ${lt_cv_nm_interface+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+printf "%s\n" "$lt_cv_nm_interface" >&6; }
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+printf %s "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+printf "%s\n" "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+printf %s "checking the maximum length of command line arguments... " >&6; }
+if test ${lt_cv_sys_max_cmd_len+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+printf %s "checking how to convert $build file names to $host format... " >&6; }
+if test ${lt_cv_to_host_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+printf %s "checking how to convert $build file names to toolchain format... " >&6; }
+if test ${lt_cv_to_tool_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+printf %s "checking for $LD option to reload object files... " >&6; }
+if test ${lt_cv_ld_reload_flag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_reload_flag='-r'
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+printf "%s\n" "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args.
+set dummy ${ac_tool_prefix}file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$FILECMD"; then
+ ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_FILECMD="${ac_tool_prefix}file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+FILECMD=$ac_cv_prog_FILECMD
+if test -n "$FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5
+printf "%s\n" "$FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_FILECMD"; then
+ ac_ct_FILECMD=$FILECMD
+ # Extract the first word of "file", so it can be a program name with args.
+set dummy file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_FILECMD"; then
+ ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_FILECMD="file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD
+if test -n "$ac_ct_FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5
+printf "%s\n" "$ac_ct_FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_FILECMD" = x; then
+ FILECMD=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ FILECMD=$ac_ct_FILECMD
+ fi
+else
+ FILECMD="$ac_cv_prog_FILECMD"
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+printf "%s\n" "$OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+printf "%s\n" "$ac_ct_OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+printf %s "checking how to recognize dependent libraries... " >&6; }
+if test ${lt_cv_deplibs_check_method+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='$FILECMD -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=$FILECMD
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[3-9]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+printf "%s\n" "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+printf "%s\n" "$DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+printf "%s\n" "$ac_ct_DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+printf %s "checking how to associate runtime and link libraries... " >&6; }
+if test ${lt_cv_sharedlib_from_linklib_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AR" && break
+ done
+fi
+if test -z "$AR"; then
+ ac_ct_AR=$AR
+ for ac_prog in ar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AR" && break
+done
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+fi
+
+: ${AR=ar}
+
+
+
+
+
+
+# Use ARFLAGS variable as AR's operation code to sync the variable naming with
+# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
+# higher priority because thats what people were doing historically (setting
+# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS
+# variable obsoleted/removed.
+
+test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
+lt_ar_flags=$AR_FLAGS
+
+
+
+
+
+
+# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override
+# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+printf %s "checking for archiver @FILE support... " >&6; }
+if test ${lt_cv_ar_at_file+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -eq "$ac_status"; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+printf "%s\n" "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+printf %s "checking command to parse $NM output from $compiler object... " >&6; }
+if test ${lt_cv_sys_global_symbol_pipe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ if test ia64 = "$host_cpu"; then
+ symcode='[ABCDEGRST]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="$SED -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
+ # Also find C++ and __fastcall symbols from MSVC++ or ICC,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK '"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx"
+ else
+ lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT@&t@_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT@&t@_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS=conftstm.$ac_objext
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test yes = "$pipe_works"; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+printf "%s\n" "failed" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+printf "%s\n" "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+printf %s "checking for sysroot... " >&6; }
+
+@%:@ Check whether --with-sysroot was given.
+if test ${with_sysroot+y}
+then :
+ withval=$with_sysroot;
+else $as_nop
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+printf "%s\n" "$with_sysroot" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+printf "%s\n" "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+printf %s "checking for a working dd... " >&6; }
+if test ${ac_cv_path_lt_DD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+ ac_path_lt_DD_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in dd
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+ $ac_path_lt_DD_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_lt_DD"; then
+ :
+ fi
+else
+ ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+printf "%s\n" "$ac_cv_path_lt_DD" >&6; }
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+printf %s "checking how to truncate binary pipes... " >&6; }
+if test ${lt_cv_truncate_bin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+printf "%s\n" "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+@%:@ Check whether --enable-libtool-lock was given.
+if test ${enable_libtool_lock+y}
+then :
+ enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE=32
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE=64
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ emul=elf
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ case `$FILECMD conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -belf"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+printf %s "checking whether the C compiler needs -belf... " >&6; }
+if test ${lt_cv_cc_needs_belf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_cc_needs_belf=yes
+else $as_nop
+ lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+printf "%s\n" "$lt_cv_cc_needs_belf" >&6; }
+ if test yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$MANIFEST_TOOL"; then
+ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+printf "%s\n" "$MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+ # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_MANIFEST_TOOL"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+ fi
+else
+ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if test ${lt_cv_path_mainfest_tool+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&5
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+ MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+ case $host_os in
+ rhapsody* | darwin*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DSYMUTIL"; then
+ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+printf "%s\n" "$DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+ ac_ct_DSYMUTIL=$DSYMUTIL
+ # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DSYMUTIL"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+printf "%s\n" "$ac_ct_DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DSYMUTIL=$ac_ct_DSYMUTIL
+ fi
+else
+ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$NMEDIT"; then
+ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+printf "%s\n" "$NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+ ac_ct_NMEDIT=$NMEDIT
+ # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_NMEDIT"; then
+ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+printf "%s\n" "$ac_ct_NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ NMEDIT=$ac_ct_NMEDIT
+ fi
+else
+ NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$LIPO"; then
+ ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+printf "%s\n" "$LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+ ac_ct_LIPO=$LIPO
+ # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_LIPO"; then
+ ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_LIPO="lipo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+printf "%s\n" "$ac_ct_LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_LIPO" = x; then
+ LIPO=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIPO=$ac_ct_LIPO
+ fi
+else
+ LIPO="$ac_cv_prog_LIPO"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OTOOL"; then
+ ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+printf "%s\n" "$OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+ ac_ct_OTOOL=$OTOOL
+ # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OTOOL"; then
+ ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL="otool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+printf "%s\n" "$ac_ct_OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL" = x; then
+ OTOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL=$ac_ct_OTOOL
+ fi
+else
+ OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OTOOL64"; then
+ ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+printf "%s\n" "$OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+ ac_ct_OTOOL64=$OTOOL64
+ # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OTOOL64"; then
+ ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL64="otool64"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+printf "%s\n" "$ac_ct_OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL64" = x; then
+ OTOOL64=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL64=$ac_ct_OTOOL64
+ fi
+else
+ OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+printf %s "checking for -single_module linker flag... " >&6; }
+if test ${lt_cv_apple_cc_single_mod+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_apple_cc_single_mod=no
+ if test -z "$LT_MULTI_MODULE"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+printf %s "checking for -exported_symbols_list linker flag... " >&6; }
+if test ${lt_cv_ld_exported_symbols_list+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_ld_exported_symbols_list=yes
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+printf %s "checking for -force_load linker flag... " >&6; }
+if test ${lt_cv_ld_force_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+ echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5
+ $AR $AR_FLAGS libconftest.a conftest.o 2>&5
+ echo "$RANLIB libconftest.a" >&5
+ $RANLIB libconftest.a 2>&5
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+printf "%s\n" "$lt_cv_ld_force_load" >&6; }
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ darwin*)
+ case $MACOSX_DEPLOYMENT_TARGET,$host in
+ 10.[012],*|,*powerpc*-darwin[5-8]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ *)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+ fi
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "@%:@define STDC_HEADERS 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes
+then :
+ printf "%s\n" "@%:@define HAVE_DLFCN_H 1" >>confdefs.h
+
+fi
+
+
+
+
+func_stripname_cnf ()
+{
+ case @S|@2 in
+ .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+ *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
+ esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+@%:@ Check whether --enable-static was given.
+if test ${enable_static+y}
+then :
+ enableval=$enable_static; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_static=no
+fi
+
+
+
+
+
+
+
+
+
+
+ enable_dlopen=no
+
+
+ enable_win32_dll=no
+
+
+ @%:@ Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+@%:@ Check whether --with-pic was given.
+if test ${with_pic+y}
+then :
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ pic_mode=default
+fi
+
+
+
+
+
+
+
+
+ @%:@ Check whether --enable-fast-install was given.
+if test ${enable_fast_install+y}
+then :
+ enableval=$enable_fast_install; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+ shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+printf %s "checking which variant of shared library versioning to provide... " >&6; }
+
+@%:@ Check whether --with-aix-soname was given.
+if test ${with_aix_soname+y}
+then :
+ withval=$with_aix_soname; case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else $as_nop
+ if test ${lt_cv_with_aix_soname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_with_aix_soname=aix
+fi
+
+ with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+printf "%s\n" "$with_aix_soname" >&6; }
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+printf %s "checking for objdir... " >&6; }
+if test ${lt_cv_objdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+printf "%s\n" "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+printf "%s\n" "@%:@define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC and
+# ICC, which need '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+printf %s "checking for ${ac_tool_prefix}file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/${ac_tool_prefix}file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+printf %s "checking for file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test ${lt_cv_prog_compiler_rtti_exceptions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+
+
+
+
+
+ lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+ if test yes = "$GCC"; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='$wl-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ # old Intel for x86_64, which still supported -KPIC.
+ ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='--shared'
+ lt_prog_compiler_static='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag=
+ always_export_symbols=no
+ archive_cmds=
+ archive_expsym_cmds=
+ compiler_needs_object=no
+ enable_shared_with_static_runtimes=no
+ export_dynamic_flag_spec=
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ hardcode_automatic=no
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_separator=
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ inherit_rpath=no
+ link_all_deplibs=unknown
+ module_cmds=
+ module_expsym_cmds=
+ old_archive_from_new_cmds=
+ old_archive_from_expsyms_cmds=
+ thread_safe_flag_spec=
+ whole_archive_flag_spec=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
+ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ if test yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test yes = "$with_gnu_ld"; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+ *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test yes = "$lt_use_gnu_ld_interface"; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='$wl'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec='$wl--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test ia64 != "$host_cpu"; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ export_dynamic_flag_spec='$wl--export-all-symbols'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ haiku*)
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs=yes
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test linux-dietlibc = "$host_os"; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test no = "$tmp_diet"
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ whole_archive_flag_spec=
+ tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
+ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ tcc*)
+ export_dynamic_flag_spec='-rdynamic'
+ ;;
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test no = "$ld_shlibs"; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ file_list_spec='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' $wl-bernotok'
+ allow_undefined_flag=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ fi
+ archive_cmds_need_lc=yes
+ archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl* | icl*)
+ # Native MSVC or ICC
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ file_list_spec='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+ enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ old_postinstall_cmds='chmod 644 $oldlib'
+ postlink_cmds='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC and ICC wrapper
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ enable_shared_with_static_runtimes=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec=''
+ fi
+ link_all_deplibs=yes
+ allow_undefined_flag=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+ else
+ ld_shlibs=no
+ fi
+
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly* | midnightbsd*)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test yes = "$GCC"; then
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='$wl-E'
+ ;;
+
+ hpux10*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+printf %s "checking if $CC understands -b... " >&6; }
+if test ${lt_cv_prog_compiler__b+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler__b=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -b"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler__b=yes
+ fi
+ else
+ lt_cv_prog_compiler__b=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+printf "%s\n" "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+ ;;
+ esac
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if test ${lt_cv_irix_exported_symbol+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_irix_exported_symbol=yes
+else $as_nop
+ lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; }
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+ fi
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ inherit_rpath=yes
+ link_all_deplibs=yes
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ ld_shlibs=yes
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ hardcode_direct_absolute=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ else
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z defs'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='$wl'
+ archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test yes = "$GCC"; then
+ whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test sequent = "$host_vendor"; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag='$wl-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='$wl-z,text'
+ allow_undefined_flag='$wl-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-R,$libdir'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+
+ if test sni = "$host_vendor"; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ export_dynamic_flag_spec='$wl-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+printf "%s\n" "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+ case $host_os in
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary...
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo = "/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[lt_foo]++; }
+ if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+ test -n "$runpath_var" ||
+ test yes = "$hardcode_automatic"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+ test no != "$hardcode_minus_L"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+printf "%s\n" "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+ test yes = "$inherit_rpath"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+ if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else $as_nop
+
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes
+then :
+ lt_cv_dlopen=shl_load
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+printf %s "checking for shl_load in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_shl_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main (void)
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_shl_load=yes
+else $as_nop
+ ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes
+then :
+ lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else $as_nop
+ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+printf %s "checking for dlopen in -lsvld... " >&6; }
+if test ${ac_cv_lib_svld_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_svld_dlopen=yes
+else $as_nop
+ ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+printf %s "checking for dld_link in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_dld_link+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main (void)
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_dld_link=yes
+else $as_nop
+ ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes
+then :
+ lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+printf %s "checking whether a program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+printf "%s\n" "$lt_cv_dlopen_self" >&6; }
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+printf %s "checking whether a statically linked program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self_static+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+printf "%s\n" "$lt_cv_dlopen_self_static" >&6; }
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+printf %s "checking whether stripping libraries is possible... " >&6; }
+if test -z "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+else
+ if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ case $host_os in
+ darwin*)
+ # FIXME - insert some real tests, host_os isn't really good enough
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ ;;
+ freebsd*)
+ if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ ;;
+ esac
+ fi
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # Report what library types will actually be built
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+printf %s "checking if libtool supports shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+printf "%s\n" "$can_build_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+printf %s "checking whether to build static libraries... " >&6; }
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+printf "%s\n" "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+ if test -n "$CXX" && ( test no != "$CXX" &&
+ ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+ (test g++ != "$CXX"))); then
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+printf %s "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if test ${ac_cv_prog_CXXCPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CXX needs to be expanded
+ for CXXCPP in "$CXX -E" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+printf "%s\n" "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+ _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="int some_variable = 0;"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+ # save warnings/boilerplate of simple test code
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_CFLAGS=$CFLAGS
+ lt_save_LD=$LD
+ lt_save_GCC=$GCC
+ GCC=$GXX
+ lt_save_with_gnu_ld=$with_gnu_ld
+ lt_save_path_LD=$lt_cv_path_LD
+ if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+ else
+ $as_unset lt_cv_prog_gnu_ld
+ fi
+ if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+ else
+ $as_unset lt_cv_path_LD
+ fi
+ test -z "${LDCXX+set}" || LD=$LDCXX
+ CC=${CXX-"c++"}
+ CFLAGS=$CXXFLAGS
+ compiler=$CC
+ compiler_CXX=$CC
+ func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+ if test -n "$compiler"; then
+ # We don't want -fno-exception when compiling C++ code, so set the
+ # no_builtin_flag separately
+ if test yes = "$GXX"; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+ else
+ lt_prog_compiler_no_builtin_flag_CXX=
+ fi
+
+ if test yes = "$GXX"; then
+ # Set up default GNU C++ configuration
+
+
+
+@%:@ Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test yes = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='$wl'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+ $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec_CXX=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+ fi
+
+ # PORTME: fill in a description of your system's C++ link characteristics
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ ld_shlibs_CXX=yes
+ case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_CXX=''
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ file_list_spec_CXX='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct_CXX=no
+ hardcode_direct_absolute_CXX=no
+ ;;
+ esac
+
+ if test yes = "$GXX"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct_CXX=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_CXX=yes
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_libdir_separator_CXX=
+ fi
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag=$shared_flag' $wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec_CXX='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to
+ # export.
+ always_export_symbols_CXX=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ # The "-G" linker flag allows undefined symbols.
+ no_undefined_flag_CXX='-bernotok'
+ # Determine the default libpath from the value encoded in an empty
+ # executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+
+ archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_CXX="-z nodefs"
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_CXX=' $wl-bernotok'
+ allow_undefined_flag_CXX=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ fi
+ archive_cmds_need_lc_CXX=yes
+ archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared
+ # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_CXX=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $GXX,$cc_basename in
+ ,cl* | no,cl* | ,icl* | no,icl*)
+ # Native MSVC or ICC
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX=' '
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=yes
+ file_list_spec_CXX='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+ enable_shared_with_static_runtimes_CXX=yes
+ # Don't use ranlib
+ old_postinstall_cmds_CXX='chmod 644 $oldlib'
+ postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # g++
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=no
+ enable_shared_with_static_runtimes_CXX=yes
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec_CXX=''
+ fi
+ link_all_deplibs_CXX=yes
+ allow_undefined_flag_CXX=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ if test yes != "$lt_cv_apple_cc_single_mod"; then
+ archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+ fi
+
+ else
+ ld_shlibs_CXX=no
+ fi
+
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_minus_L_CXX=yes
+ allow_undefined_flag_CXX=unsupported
+ shrext_cmds=.dll
+ archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes_CXX=yes
+ file_list_spec_CXX='@'
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ freebsd2.*)
+ # C++ shared libraries reported to be fairly broken before
+ # switch to ELF
+ ld_shlibs_CXX=no
+ ;;
+
+ freebsd-elf*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+
+ haiku*)
+ archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs_CXX=yes
+ ;;
+
+ hpux9*)
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='$wl-E'
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ hpux10*|hpux11*)
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ export_dynamic_flag_spec_CXX='$wl-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ ;;
+ *)
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+ fi
+ fi
+ link_all_deplibs_CXX=yes
+ ;;
+ esac
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ inherit_rpath_CXX=yes
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc* | ecpc* )
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ case `$CC -V` in
+ *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+ prelink_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+ old_archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+ $RANLIB $oldlib'
+ archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 6 and above use weak symbols
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+ ;;
+ xl* | mpixl* | bgxl*)
+ # IBM XL 8.0 on PPC, with GNU ld
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object_CXX=yes
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ m88k*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+
+ *nto* | *qnx*)
+ ld_shlibs_CXX=yes
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ hardcode_direct_absolute_CXX=yes
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ fi
+ output_verbose_link_cmd=func_echo_all
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ case $host in
+ osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+ *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+ esac
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ case $host in
+ osf3*)
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ ;;
+ *)
+ allow_undefined_flag_CXX=' -expect_unresolved \*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+ $RM $lib.exp'
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ ;;
+ esac
+
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ case $host in
+ osf3*)
+ archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ psos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ archive_cmds_need_lc_CXX=yes
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_shlibpath_var_CXX=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ no_undefined_flag_CXX=' $wl-z ${wl}defs'
+ if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ else
+ # g++ 2.7 appears to require '-G' NOT '-shared' on this
+ # platform.
+ archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_CXX='$wl-z,text'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_CXX='$wl-z,text'
+ allow_undefined_flag_CXX='$wl-z,nodefs'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ export_dynamic_flag_spec_CXX='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+ '"$old_archive_cmds_CXX"
+ reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+ '"$reload_cmds_CXX"
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+ test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+ GCC_CXX=$GXX
+ LD_CXX=$LD
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ for p in `eval "$output_verbose_link_cmd"`; do
+ case $prev$p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test x-L = "$p" ||
+ test x-R = "$p"; then
+ prev=$p
+ continue
+ fi
+
+ # Expand the sysroot to ease extracting the directories later.
+ if test -z "$prev"; then
+ case $p in
+ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+ esac
+ fi
+ case $p in
+ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+ esac
+ if test no = "$pre_test_object_deps_done"; then
+ case $prev in
+ -L | -R)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_path_CXX=$prev$p
+ else
+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$postdeps_CXX"; then
+ postdeps_CXX=$prev$p
+ else
+ postdeps_CXX="${postdeps_CXX} $prev$p"
+ fi
+ fi
+ prev=
+ ;;
+
+ *.lto.$objext) ;; # Ignore GCC LTO objects
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test no = "$pre_test_object_deps_done"; then
+ if test -z "$predep_objects_CXX"; then
+ predep_objects_CXX=$p
+ else
+ predep_objects_CXX="$predep_objects_CXX $p"
+ fi
+ else
+ if test -z "$postdep_objects_CXX"; then
+ postdep_objects_CXX=$p
+ else
+ postdep_objects_CXX="$postdep_objects_CXX $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ predep_objects_CXX=
+ postdep_objects_CXX=
+ postdeps_CXX=
+ ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test yes = "$GXX"; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static_CXX='$wl-static'
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static_CXX=
+ ;;
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[4-9]*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ if test ia64 != "$host_cpu"; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ ecpc* )
+ # old Intel C++ for x86_64, which still supported -KPIC.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ icpc* )
+ # Intel C++, used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fpic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-qpic'
+ lt_prog_compiler_static_CXX='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works_CXX=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ case $host_os in
+ aix[4-9]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ export_symbols_cmds_CXX=$ltdll_cmds
+ ;;
+ cygwin* | mingw* | cegcc*)
+ case $cc_basename in
+ cl* | icl*)
+ exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+ ;;
+ esac
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_CXX=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds_CXX in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_CXX
+ pic_flag=$lt_prog_compiler_pic_CXX
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+ allow_undefined_flag_CXX=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc_CXX=no
+ else
+ lt_cv_archive_cmds_need_lc_CXX=yes
+ fi
+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+ archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+ test -n "$runpath_var_CXX" ||
+ test yes = "$hardcode_automatic_CXX"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct_CXX" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+ test no != "$hardcode_minus_L_CXX"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_CXX=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_CXX=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_CXX=unsupported
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+printf "%s\n" "$hardcode_action_CXX" >&6; }
+
+if test relink = "$hardcode_action_CXX" ||
+ test yes = "$inherit_rpath_CXX"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+ fi # test -n "$compiler"
+
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+ LDCXX=$LD
+ LD=$lt_save_LD
+ GCC=$lt_save_GCC
+ with_gnu_ld=$lt_save_with_gnu_ld
+ lt_cv_path_LDCXX=$lt_cv_path_LD
+ lt_cv_path_LD=$lt_save_path_LD
+ lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+# Only the shared libraries are produced by default, use "--enable-static"
+# option to override it.
+
+# Special CFLAGS to use when building
+gc_cflags=""
+
+# Set to "yes" on platforms where mmap should be used instead of sbrk.
+# This will define USE_MMAP.
+gc_use_mmap=""
+
+# We should set -fexceptions if we are using gcc and might be used
+# inside something like gcj. This is the zeroth approximation:
+if test :"$GCC": = :yes: ; then
+ gc_cflags="${gc_cflags} -fexceptions"
+else
+ case "$host" in
+ hppa*-*-hpux* )
+ if test :$GCC: != :"yes": ; then
+ gc_cflags="${gc_cflags} +ESdbgasm"
+ fi
+ # :TODO: actually we should check using Autoconf if
+ # the compiler supports this option.
+ ;;
+ esac
+fi
+
+# target_optspace --enable-target-optspace ("yes", "no", "")
+case "${target_optspace}:${host}" in
+ yes:*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ :m32r-* | :d10v-* | :d30v-*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ no:* | :*)
+ # Nothing.
+ ;;
+esac
+
+# Set any host dependent compiler flags.
+case "${host}" in
+ mips-tx39-*|mipstx39-unknown-*)
+ gc_cflags="${gc_cflags} -G 0"
+ ;;
+ *)
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for emscripten" >&5
+printf %s "checking for emscripten... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# ifndef __EMSCRIPTEN__
+# error This is not Emscripten
+# endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ emscripten=yes
+else $as_nop
+ emscripten=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test x$emscripten = xyes; then
+ EMSCRIPTEN_TRUE=
+ EMSCRIPTEN_FALSE='#'
+else
+ EMSCRIPTEN_TRUE='#'
+ EMSCRIPTEN_FALSE=
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $emscripten" >&5
+printf "%s\n" "$emscripten" >&6; }
+
+@%:@ Check whether --enable-emscripten-asyncify was given.
+if test ${enable_emscripten_asyncify+y}
+then :
+ enableval=$enable_emscripten_asyncify;
+fi
+
+# Use this option if your program is targeting -sASYNCIFY. The latter is
+# required to scan the stack, ASYNCIFY_STACK_SIZE is probably needed for
+# gctest only.
+if test "${emscripten}" = yes -a "${enable_emscripten_asyncify}" = yes
+then :
+ gc_cflags="${gc_cflags} -DEMSCRIPTEN_ASYNCIFY"
+ gc_cflags="${gc_cflags} -sASYNCIFY -sASYNCIFY_STACK_SIZE=128000"
+fi
+
+GC_CFLAGS=${gc_cflags}
+
+
+
+
+@%:@ Check whether --enable-threads was given.
+if test ${enable_threads+y}
+then :
+ enableval=$enable_threads; THREADS=$enableval
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thread model used by GCC" >&5
+printf %s "checking for thread model used by GCC... " >&6; }
+ THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
+ if test -z "$THREADS" -o "x$emscripten" = "xyes"; then
+ THREADS=no
+ fi
+ if test "$THREADS" = "posix"; then
+ case "$host" in
+ *-*-mingw*)
+ # Adjust thread model if cross-compiling for MinGW.
+ THREADS=win32
+ ;;
+ esac
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $THREADS" >&5
+printf "%s\n" "$THREADS" >&6; }
+fi
+
+
+@%:@ Check whether --enable-parallel-mark was given.
+if test ${enable_parallel_mark+y}
+then :
+ enableval=$enable_parallel_mark; case "$THREADS" in
+ no | none | single)
+ if test "${enable_parallel_mark}" != no; then
+ as_fn_error $? "Parallel mark requires --enable-threads=x spec" "$LINENO" 5
+ fi
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-thread-local-alloc was given.
+if test ${enable_thread_local_alloc+y}
+then :
+ enableval=$enable_thread_local_alloc; case "$THREADS" in
+ no | none | single)
+ if test "${enable_thread_local_alloc}" = yes; then
+ as_fn_error $? "Thread-local allocation requires --enable-threads=x spec" "$LINENO" 5
+ fi
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-threads-discovery was given.
+if test ${enable_threads_discovery+y}
+then :
+ enableval=$enable_threads_discovery;
+fi
+
+if test "${enable_threads_discovery}" = no; then
+
+printf "%s\n" "@%:@define GC_NO_THREADS_DISCOVERY 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-cplusplus was given.
+if test ${enable_cplusplus+y}
+then :
+ enableval=$enable_cplusplus;
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+CFLAGS="$old_CFLAGS"
+
+THREADDLLIBS=
+need_atomic_ops_asm=false
+need_lib_rt=false
+compile_asm=false
+use_parallel_mark=no
+use_thread_local_alloc=no
+# Libraries needed to support dynamic loading and/or threads.
+case "$THREADS" in
+ no | none | single)
+ THREADS=none
+ ;;
+ posix | pthreads)
+ THREADS=posix
+ default_threadlibs=false
+ # Common defines for most POSIX platforms.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-dragonfly* | \
+ *-*-freebsd* | *-*-haiku* | *-*-hpux11* | *-*-irix* | \
+ *-*-kfreebsd*-gnu | *-*-gnu* | *-*-*linux* | *-*-msys* | *-*-nacl* | \
+ *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define _REENTRANT 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ default_threadlibs=true
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&2;}
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5
+printf %s "checking for pthread_self in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char pthread_self ();
+int
+main (void)
+{
+return pthread_self ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_self=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_self=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_self" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_self" = xyes
+then :
+ THREADDLLIBS="-lpthread"
+fi
+
+ case "$host" in
+ *-*-hpux11*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Only HP/UX 11 POSIX threads are supported.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Only HP/UX 11 POSIX threads are supported.\"" >&2;}
+ printf "%s\n" "@%:@define _POSIX_C_SOURCE 199506L" >>confdefs.h
+
+ THREADDLLIBS="-lpthread"
+ # HPUX needs REENTRANT for the _r calls.
+ need_lib_rt=true
+ ;;
+ *-*-openbsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-freebsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ ;;
+ *-*-kfreebsd*-gnu)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-gnu*) # E.g. linux but excluding kfreebsd.
+ # The default THREADDLLIBS.
+ ;;
+ *-*-netbsd*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Only on NetBSD 2.0 or later.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Only on NetBSD 2.0 or later.\"" >&2;}
+ printf "%s\n" "@%:@define _PTHREADS 1" >>confdefs.h
+
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-solaris*)
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-cygwin* | *-*-msys*)
+ # Cygwin doesn't have a real libpthread, so Libtool can't link
+ # against it.
+ THREADDLLIBS=""
+ win32_threads=true
+ ;;
+ *-*-mingw*)
+ printf "%s\n" "@%:@define GC_WIN32_PTHREADS 1" >>confdefs.h
+
+ # Using pthreads-win32 (or other non-Cygwin pthreads) library.
+ THREADDLLIBS="-lpthread"
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ win32_threads=true
+ ;;
+ *-*-darwin*)
+ darwin_threads=true
+ ;;
+ *-*-osf*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *)
+ if test x$default_threadlibs != xtrue
+then :
+ as_fn_error $? "Pthreads not supported by the GC on this platform" "$LINENO" 5
+fi
+ # The default THREADDLLIBS.
+ ;;
+ esac
+ case "$host" in
+ sparc*-*-solaris*)
+ if test "$GCC" != yes; then
+ need_atomic_ops_asm=true
+ fi
+ ;;
+ esac
+ ;;
+ mcf | win32)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ if test "${enable_parallel_mark}" != no \
+ -o "${enable_shared}" != yes -o "${enable_static}" != no; then
+ # Imply THREAD_LOCAL_ALLOC unless GC_DLL.
+ use_thread_local_alloc=$enable_thread_local_alloc
+ fi
+ if test "${enable_win32_dllmain}" = yes; then
+
+printf "%s\n" "@%:@define GC_INSIDE_DLL 1" >>confdefs.h
+
+ fi
+ win32_threads=true
+
+printf "%s\n" "@%:@define EMPTY_GETENV_RESULTS 1" >>confdefs.h
+
+ ;;
+ dgux386)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ # Use pthread GCC switch
+ THREADDLLIBS=-pthread
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&2;}
+ AM_CFLAGS="-pthread $AM_CFLAGS"
+ ;;
+ aix)
+ THREADS=posix
+ THREADDLLIBS=-lpthread
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ printf "%s\n" "@%:@define _REENTRANT 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ rtems)
+ THREADS=posix
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ decosf1 | irix | mach | os2 | solaris | dce | vxworks)
+ as_fn_error $? "thread package $THREADS not yet supported" "$LINENO" 5
+ ;;
+ *)
+ as_fn_error $? "$THREADS is an unknown thread package" "$LINENO" 5
+ ;;
+esac
+
+# Check whether -lrt linker option is needed to use clock_gettime.
+if test "x$need_lib_rt" != xtrue; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime without additional libraries" >&5
+printf %s "checking for clock_gettime without additional libraries... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <time.h>
+int
+main (void)
+{
+struct timespec t; clock_gettime(CLOCK_REALTIME, &t)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
+printf %s "checking for clock_gettime in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_clock_gettime+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char clock_gettime ();
+int
+main (void)
+{
+return clock_gettime ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_rt_clock_gettime=yes
+else $as_nop
+ ac_cv_lib_rt_clock_gettime=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5
+printf "%s\n" "$ac_cv_lib_rt_clock_gettime" >&6; }
+if test "x$ac_cv_lib_rt_clock_gettime" = xyes
+then :
+ need_lib_rt=true
+fi
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+if test "x$need_lib_rt" = xtrue; then
+ THREADDLLIBS="$THREADDLLIBS -lrt"
+fi
+
+
+ if test x$THREADS != xnone; then
+ THREADS_TRUE=
+ THREADS_FALSE='#'
+else
+ THREADS_TRUE='#'
+ THREADS_FALSE=
+fi
+
+ if test x$THREADS = xposix; then
+ PTHREADS_TRUE=
+ PTHREADS_FALSE='#'
+else
+ PTHREADS_TRUE='#'
+ PTHREADS_FALSE=
+fi
+
+ if test x$darwin_threads = xtrue; then
+ DARWIN_THREADS_TRUE=
+ DARWIN_THREADS_FALSE='#'
+else
+ DARWIN_THREADS_TRUE='#'
+ DARWIN_THREADS_FALSE=
+fi
+
+ if test x$win32_threads = xtrue; then
+ WIN32_THREADS_TRUE=
+ WIN32_THREADS_FALSE='#'
+else
+ WIN32_THREADS_TRUE='#'
+ WIN32_THREADS_FALSE=
+fi
+
+
+compiler_suncc=no
+pthread_start_standalone=no
+case "$host" in
+ *-*-*linux*)
+ # Turn on the workaround described in pthread_start.c.
+ if test "$THREADS" = posix
+then :
+ pthread_start_standalone=yes
+fi
+ ;;
+ powerpc-*-darwin*)
+ powerpc_darwin=true
+ ;;
+ *-*-solaris*)
+ if test "$GCC" != yes; then
+ # Solaris SunCC
+ compiler_suncc=yes
+ CFLAGS="-O $CFLAGS"
+ fi
+ ;;
+ *-*-wince*)
+ if test "$enable_gc_debug" != "no"; then
+
+printf "%s\n" "@%:@define GC_READ_ENV_FILE 1" >>confdefs.h
+
+ fi
+ ;;
+esac
+ if test x$pthread_start_standalone = xyes; then
+ PTHREAD_START_STANDALONE_TRUE=
+ PTHREAD_START_STANDALONE_FALSE='#'
+else
+ PTHREAD_START_STANDALONE_TRUE='#'
+ PTHREAD_START_STANDALONE_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ # Output all warnings.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wextra" >&5
+printf %s "checking whether compiler supports -Wextra... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Wextra $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_cc_wextra=yes
+else $as_nop
+ ac_cv_cc_wextra=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_wextra" >&5
+printf "%s\n" "$ac_cv_cc_wextra" >&6; }
+ if test "$ac_cv_cc_wextra" = yes
+then :
+ WEXTRA="-Wextra"
+else $as_nop
+ WEXTRA="-W"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wpedantic" >&5
+printf %s "checking whether compiler supports -Wpedantic... " >&6; }
+ CFLAGS="-Wpedantic -Wno-long-long $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ extern int quiet;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_cc_pedantic=yes
+else $as_nop
+ ac_cv_cc_pedantic=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_pedantic" >&5
+printf "%s\n" "$ac_cv_cc_pedantic" >&6; }
+ WPEDANTIC=
+ if test "$ac_cv_cc_pedantic" = yes
+then :
+ WPEDANTIC="-Wpedantic -Wno-long-long"
+fi
+ CFLAGS="-Wall $WEXTRA $WPEDANTIC $CFLAGS"
+ CXXFLAGS="-Wall $WEXTRA $WPEDANTIC $CXXFLAGS"
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xlc" >&5
+printf %s "checking for xlc... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ #ifndef __xlC__
+ # error
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ compiler_xlc=yes
+else $as_nop
+ compiler_xlc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $compiler_xlc" >&5
+printf "%s\n" "$compiler_xlc" >&6; }
+if test $compiler_xlc = yes -a "$powerpc_darwin" = true; then
+ # the darwin stack-frame-walking code is completely broken on xlc
+
+printf "%s\n" "@%:@define DARWIN_DONT_PARSE_STACK 1" >>confdefs.h
+
+fi
+
+# XLC neither requires nor tolerates the unnecessary assembler goop.
+# Similar for the Sun C compiler.
+ if test $compiler_xlc = yes -o $compiler_suncc = yes; then
+ ASM_WITH_CPP_UNSUPPORTED_TRUE=
+ ASM_WITH_CPP_UNSUPPORTED_FALSE='#'
+else
+ ASM_WITH_CPP_UNSUPPORTED_TRUE='#'
+ ASM_WITH_CPP_UNSUPPORTED_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ # Disable aliasing optimization unless forced to.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fno-strict-aliasing" >&5
+printf %s "checking whether compiler supports -fno-strict-aliasing... " >&6; }
+ ac_cv_fno_strict_aliasing=no
+ for cflag in $CFLAGS; do
+ case "$cflag" in
+ -fstrict-aliasing)
+ # Opposite option already present
+ ac_cv_fno_strict_aliasing=skipped
+ break
+ ;;
+ esac
+ done
+ if test "$ac_cv_fno_strict_aliasing" != skipped; then
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_fno_strict_aliasing=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_fno_strict_aliasing" = yes
+then :
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+fi
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fno_strict_aliasing" >&5
+printf "%s\n" "$ac_cv_fno_strict_aliasing" >&6; }
+fi
+
+# Check for getcontext (uClibc can be configured without it, for example)
+ac_fn_c_check_func "$LINENO" "getcontext" "ac_cv_func_getcontext"
+if test "x$ac_cv_func_getcontext" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "@%:@define NO_GETCONTEXT 1" >>confdefs.h
+
+fi
+
+
+# Check whether dl_iterate_phdr exists (as a strong symbol).
+ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr"
+if test "x$ac_cv_func_dl_iterate_phdr" = xyes
+then :
+ printf "%s\n" "@%:@define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h
+
+fi
+
+
+case "$host" in
+# While IRIX 6 has libdl for the O32 and N32 ABIs, it's missing for N64
+# and unnecessary everywhere.
+ mips-sgi-irix6*) ;;
+# We never want libdl on darwin. It is a fake libdl that just ends up making
+# dyld calls anyway. The same applies to Cygwin.
+ *-*-cygwin* | *-*-darwin* | *-*-msys*)
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ THREADDLLIBS="$THREADDLLIBS -ldl"
+fi
+
+ ;;
+esac
+
+case "$host" in
+ *-*-hpux*)
+ avoid_cpp_lib=yes;;
+ *)
+ avoid_cpp_lib=no;
+ ;;
+esac
+ if test $avoid_cpp_lib = yes; then
+ AVOID_CPP_LIB_TRUE=
+ AVOID_CPP_LIB_FALSE='#'
+else
+ AVOID_CPP_LIB_TRUE='#'
+ AVOID_CPP_LIB_FALSE=
+fi
+
+
+# Check for various headers.
+ac_fn_c_check_header_compile "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default"
+if test "x$ac_cv_header_execinfo_h" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "@%:@define GC_MISSING_EXECINFO_H 1" >>confdefs.h
+
+fi
+
+
+# extra LD Flags which are required for targets
+case "${host}" in
+ *-*-darwin*)
+ extra_ldflags_libgc=-Wl,-single_module
+ ;;
+esac
+
+
+
+
+target_all=libgc.la
+
+
+TARGET_ECOS="no"
+
+@%:@ Check whether --with-ecos was given.
+if test ${with_ecos+y}
+then :
+ withval=$with_ecos; TARGET_ECOS="$with_ecos"
+
+fi
+
+
+addobjs=
+addlibs=
+CXXLIBS=
+
+case "$TARGET_ECOS" in
+ no)
+ ;;
+ *)
+
+printf "%s\n" "@%:@define ECOS 1" >>confdefs.h
+
+ AM_CPPFLAGS="-I${TARGET_ECOS}/include $AM_CPPFLAGS"
+ addobjs="$addobjs ecos.lo"
+ ;;
+esac
+
+ if test "${enable_cplusplus}" = yes; then
+ CPLUSPLUS_TRUE=
+ CPLUSPLUS_FALSE='#'
+else
+ CPLUSPLUS_TRUE='#'
+ CPLUSPLUS_FALSE=
+fi
+
+
+@%:@ Check whether --enable-throw-bad-alloc-library was given.
+if test ${enable_throw_bad_alloc_library+y}
+then :
+ enableval=$enable_throw_bad_alloc_library;
+fi
+
+ if test "${enable_cplusplus}" = yes \
+ -a "${enable_throw_bad_alloc_library}" != no; then
+ GC_TBA_LIBRARY_TRUE=
+ GC_TBA_LIBRARY_FALSE='#'
+else
+ GC_TBA_LIBRARY_TRUE='#'
+ GC_TBA_LIBRARY_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ if test "${enable_cplusplus}" = yes; then
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libsupc++ required" >&5
+printf %s "checking whether libsupc++ required... " >&6; }
+ SUPC="`$CXX -print-file-name=libsupc++.a 2>/dev/null`"
+ if test -n "$SUPC" -a "$SUPC" != "libsupc++.a"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ CXXLIBS="-lsupc++"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ esac
+ fi
+fi
+
+
+
+
+
+
+# Configuration of shared libraries
+#
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+@%:@ Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+case "$host" in
+ alpha-*-openbsd*)
+ enable_shared=no
+ ;;
+ *)
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+# Compile with GC_DLL defined unless building static libraries.
+if test "${enable_shared}" != no -a "${enable_static}" != yes; then
+ printf "%s\n" "@%:@define GC_DLL 1" >>confdefs.h
+
+ if test "$GCC" = yes; then
+ # Pass -fvisibility=hidden option if supported
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fvisibility" >&5
+printf %s "checking whether compiler supports -fvisibility... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Werror -fvisibility=hidden $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_fvisibility_hidden=yes
+else $as_nop
+ ac_cv_fvisibility_hidden=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_fvisibility_hidden" = yes
+then :
+ CFLAGS="-DGC_VISIBILITY_HIDDEN_SET -fvisibility=hidden $CFLAGS"
+else $as_nop
+ CFLAGS="-DGC_NO_VISIBILITY $CFLAGS"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fvisibility_hidden" >&5
+printf "%s\n" "$ac_cv_fvisibility_hidden" >&6; }
+ fi
+else
+
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ # Do not require the clients to link with "user32" system library.
+
+printf "%s\n" "@%:@define DONT_USE_USER32_DLL 1" >>confdefs.h
+
+ # Use inline version of GC new and delete operators in test_cpp
+ # otherwise the system ones might be used instead because of arbitrary
+ # ordering of object files when linking.
+ CXXFLAGS="$CXXFLAGS -DGC_NOT_DLL"
+ ;;
+ esac
+fi
+
+# Configuration of machine-dependent code
+#
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which machine-dependent code should be used" >&5
+printf %s "checking which machine-dependent code should be used... " >&6; }
+machdep=
+case "$host" in
+ alpha-*-openbsd*)
+ if test x"${ac_cv_lib_dl_dlopen}" != xyes ; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"OpenBSD/Alpha without dlopen(). Shared library support is disabled.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"OpenBSD/Alpha without dlopen(). Shared library support is disabled.\"" >&2;}
+ fi
+ ;;
+ i?86-*-solaris2.[89])
+ # PROC_VDB appears to work in 2.8 and 2.9 but not in 2.10+ (for now).
+
+printf "%s\n" "@%:@define SOLARIS25_PROC_VDB_BUG_FIXED 1" >>confdefs.h
+
+ ;;
+ sparc-*-netbsd*)
+ machdep="sparc_netbsd_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc*-*-linux* | sparc*-*-openbsd* | sparc64-*-freebsd* | sparc64-*-netbsd*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc-sun-solaris2.3)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+
+printf "%s\n" "@%:@define SUNOS53_SHARED_LIB 1" >>confdefs.h
+
+ ;;
+ sparc*-sun-solaris2*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ ia64-*-*)
+ machdep="ia64_save_regs_in_stack.lo"
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $machdep" >&5
+printf "%s\n" "$machdep" >&6; }
+addobjs="$addobjs $machdep"
+
+
+
+
+
+# Suppress "extension used" clang warning (when compiling .S files).
+if test x$compile_asm = xtrue -a "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-language-extension-token" >&5
+printf %s "checking whether compiler supports -Wno-language-extension-token... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-language-extension-token"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_lang_ext_token=yes
+else $as_nop
+ ac_cv_lang_ext_token=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_lang_ext_token" = yes
+then :
+ CFLAGS="$CFLAGS -Wno-language-extension-token"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lang_ext_token" >&5
+printf "%s\n" "$ac_cv_lang_ext_token" >&6; }
+fi
+
+
+@%:@ Check whether --with-target-subdir was given.
+if test ${with_target_subdir+y}
+then :
+ withval=$with_target_subdir;
+fi
+
+
+@%:@ Check whether --with-cross-host was given.
+if test ${with_cross_host+y}
+then :
+ withval=$with_cross_host;
+fi
+
+
+if false; then
+ :
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether AIX gcc optimization fix is necessary" >&5
+printf %s "checking whether AIX gcc optimization fix is necessary... " >&6; }
+case "$host" in
+ *aix*)
+ if test "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ new_CFLAGS=
+ for i in $CFLAGS; do
+ case "$i" in
+ -O*)
+ ;;
+ *)
+ new_CFLAGS="$new_CFLAGS $i"
+ ;;
+ esac
+ done
+ CFLAGS="$new_CFLAGS"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
+
+
+printf "%s\n" "@%:@define NO_EXECUTE_PERMISSION 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define ALL_INTERIOR_POINTERS 1" >>confdefs.h
+
+
+
+@%:@ Check whether --enable-gcj-support was given.
+if test ${enable_gcj_support+y}
+then :
+ enableval=$enable_gcj_support;
+fi
+
+if test x"$enable_gcj_support" != xno; then
+
+printf "%s\n" "@%:@define GC_GCJ_SUPPORT 1" >>confdefs.h
+
+ case "$host" in
+ *-*-kfreebsd*-gnu)
+ # FIXME: For a reason, gctest hangs up on kFreeBSD if both of
+ # THREAD_LOCAL_ALLOC and GC_ENABLE_SUSPEND_THREAD are defined.
+ if test "${enable_thread_local_alloc}" = no; then
+ printf "%s\n" "@%:@define GC_ENABLE_SUSPEND_THREAD 1" >>confdefs.h
+
+ fi
+ ;;
+ *)
+
+printf "%s\n" "@%:@define GC_ENABLE_SUSPEND_THREAD 1" >>confdefs.h
+
+ ;;
+ esac
+fi
+ if test x"enable_gcj_support" != xno; then
+ ENABLE_GCJ_SUPPORT_TRUE=
+ ENABLE_GCJ_SUPPORT_FALSE='#'
+else
+ ENABLE_GCJ_SUPPORT_TRUE='#'
+ ENABLE_GCJ_SUPPORT_FALSE=
+fi
+
+
+@%:@ Check whether --enable-sigrt-signals was given.
+if test ${enable_sigrt_signals+y}
+then :
+ enableval=$enable_sigrt_signals;
+fi
+
+if test x"${enable_sigrt_signals}" = xyes; then
+
+printf "%s\n" "@%:@define GC_USESIGRT_SIGNALS 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+UNWINDLIBS=
+@%:@ Check whether --enable-gc-debug was given.
+if test ${enable_gc_debug+y}
+then :
+ enableval=$enable_gc_debug; if test "$enable_gc_debug" = "yes"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Should define GC_DEBUG and use debug alloc in clients.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Should define GC_DEBUG and use debug alloc in clients.\"" >&2;}
+
+printf "%s\n" "@%:@define KEEP_BACK_PTRS 1" >>confdefs.h
+
+ keep_back_ptrs=true
+
+printf "%s\n" "@%:@define DBG_HDRS_ALL 1" >>confdefs.h
+
+
+
+ case $host in
+ ia64-*-linux* )
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ printf "%s\n" "@%:@define SAVE_CALL_COUNT 8" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for backtrace in -lunwind" >&5
+printf %s "checking for backtrace in -lunwind... " >&6; }
+if test ${ac_cv_lib_unwind_backtrace+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lunwind $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char backtrace ();
+int
+main (void)
+{
+return backtrace ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_unwind_backtrace=yes
+else $as_nop
+ ac_cv_lib_unwind_backtrace=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_unwind_backtrace" >&5
+printf "%s\n" "$ac_cv_lib_unwind_backtrace" >&6; }
+if test "x$ac_cv_lib_unwind_backtrace" = xyes
+then :
+
+ printf "%s\n" "@%:@define GC_HAVE_BUILTIN_BACKTRACE 1" >>confdefs.h
+
+ UNWINDLIBS=-lunwind
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Client code may need to link against libunwind.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Client code may need to link against libunwind.\"" >&2;}
+
+fi
+
+ ;;
+ x86-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&2;}
+ printf "%s\n" "@%:@define SAVE_CALL_COUNT 8" >>confdefs.h
+
+ ;;
+ i345686-*-dgux*)
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+fi
+
+ if test x"$enable_gc_debug" = xyes; then
+ MAKE_BACK_GRAPH_TRUE=
+ MAKE_BACK_GRAPH_FALSE='#'
+else
+ MAKE_BACK_GRAPH_TRUE='#'
+ MAKE_BACK_GRAPH_FALSE=
+fi
+
+ if test x"$keep_back_ptrs" = xtrue; then
+ KEEP_BACK_PTRS_TRUE=
+ KEEP_BACK_PTRS_FALSE='#'
+else
+ KEEP_BACK_PTRS_TRUE='#'
+ KEEP_BACK_PTRS_FALSE=
+fi
+
+
+# Check whether a compiler warning of unsafe __builtin_return_address(1)
+# could be suppressed by -Wno-frame-address option.
+# __builtin_return_address(1) is used by libgc for debugging purposes only.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -Wno-frame-address works" >&5
+printf %s "checking whether -Wno-frame-address works... " >&6; }
+use_wno_error_frame_address=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Werror -Wno-frame-address $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+{
+ if (!__builtin_return_address(1)) return 1;
+}
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ use_wno_error_frame_address=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $use_wno_error_frame_address" >&5
+printf "%s\n" "$use_wno_error_frame_address" >&6; }
+if test x"$use_wno_error_frame_address" = xyes; then
+ CFLAGS="$CFLAGS -Wno-frame-address"
+fi
+
+# Check for dladdr (used for debugging).
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dladdr" >&5
+printf %s "checking for dladdr... " >&6; }
+have_dladdr=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _GNU_SOURCE 1
+#include <dlfcn.h>
+int
+main (void)
+{
+{
+ Dl_info info;
+ (void)dladdr("", &info);
+}
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ have_dladdr=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_dladdr" >&5
+printf "%s\n" "$have_dladdr" >&6; }
+if test x"$have_dladdr" = xyes; then
+
+printf "%s\n" "@%:@define HAVE_DLADDR 1" >>confdefs.h
+
+fi
+
+# sigsetjmp could be a macro (thus AC_CHECK_FUNCS cannot be used).
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sigsetjmp" >&5
+printf %s "checking for sigsetjmp... " >&6; }
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <setjmp.h>
+int
+main (void)
+{
+sigjmp_buf t; sigsetjmp(t, 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+printf "%s\n" "@%:@define GC_NO_SIGSETJMP 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+
+# pthread_setname_np, if available, may have 1, 2 or 3 arguments.
+if test "$THREADS" = posix
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_setname_np" >&5
+printf %s "checking for pthread_setname_np... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -Werror"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np("thread-name")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (w/o tid)" >&5
+printf "%s\n" "yes (w/o tid)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID 1" >>confdefs.h
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np(pthread_self(), "thread-name-%u", 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (with tid and arg)" >&5
+printf "%s\n" "yes (with tid and arg)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG 1" >>confdefs.h
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np(pthread_self(), "thread-name")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (with tid)" >&5
+printf "%s\n" "yes (with tid)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITH_TID 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for AViiON Machines running DGUX
+ac_is_dgux=no
+ac_fn_c_check_header_compile "$LINENO" "sys/dg_sys_info.h" "ac_cv_header_sys_dg_sys_info_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_dg_sys_info_h" = xyes
+then :
+ ac_is_dgux=yes;
+fi
+
+
+if test $ac_is_dgux = yes; then
+ dgux_spec_opts="-DDGUX -D_DGUX_SOURCE -Di386 -mno-legend -O2"
+ CFLAGS="$dgux_spec_opts $CFLAGS"
+ CXXFLAGS="$dgux_spec_opts $CXXFLAGS"
+ if test "$enable_gc_debug" = "yes"; then
+ CFLAGS="-g -mstandard $CFLAGS"
+ CXXFLAGS="-g -mstandard $CXXFLAGS"
+ fi
+
+
+fi
+
+@%:@ Check whether --enable-java-finalization was given.
+if test ${enable_java_finalization+y}
+then :
+ enableval=$enable_java_finalization;
+fi
+
+if test x"$enable_java_finalization" != xno; then
+
+printf "%s\n" "@%:@define JAVA_FINALIZATION 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-atomic-uncollectable was given.
+if test ${enable_atomic_uncollectable+y}
+then :
+ enableval=$enable_atomic_uncollectable;
+fi
+
+if test x"$enable_atomic_uncollectible" != x"no"; then
+
+printf "%s\n" "@%:@define GC_ATOMIC_UNCOLLECTABLE 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-redirect-malloc was given.
+if test ${enable_redirect_malloc+y}
+then :
+ enableval=$enable_redirect_malloc;
+fi
+
+
+if test "${enable_redirect_malloc}" = yes; then
+ if test "${enable_gc_debug}" = yes; then
+
+printf "%s\n" "@%:@define REDIRECT_MALLOC GC_debug_malloc_replacement" >>confdefs.h
+
+
+printf "%s\n" "@%:@define REDIRECT_REALLOC GC_debug_realloc_replacement" >>confdefs.h
+
+
+printf "%s\n" "@%:@define REDIRECT_FREE GC_debug_free" >>confdefs.h
+
+ else
+ printf "%s\n" "@%:@define REDIRECT_MALLOC GC_malloc" >>confdefs.h
+
+ fi
+
+printf "%s\n" "@%:@define GC_USE_DLOPEN_WRAP 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-disclaim was given.
+if test ${enable_disclaim+y}
+then :
+ enableval=$enable_disclaim;
+fi
+
+if test x"$enable_disclaim" != xno; then
+
+printf "%s\n" "@%:@define ENABLE_DISCLAIM 1" >>confdefs.h
+
+fi
+ if test x"$enable_disclaim" != xno; then
+ ENABLE_DISCLAIM_TRUE=
+ ENABLE_DISCLAIM_FALSE='#'
+else
+ ENABLE_DISCLAIM_TRUE='#'
+ ENABLE_DISCLAIM_FALSE=
+fi
+
+
+@%:@ Check whether --enable-large-config was given.
+if test ${enable_large_config+y}
+then :
+ enableval=$enable_large_config;
+fi
+
+if test "${enable_large_config}" = yes; then
+
+printf "%s\n" "@%:@define LARGE_CONFIG 1" >>confdefs.h
+
+fi
+
+if test -n "${with_cross_host}"; then
+
+printf "%s\n" "@%:@define NO_CLOCK 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define SMALL_CONFIG 1" >>confdefs.h
+
+fi
+
+if test "$enable_gc_debug" = "no"; then
+
+printf "%s\n" "@%:@define NO_DEBUGGING 1" >>confdefs.h
+
+fi
+
+
+
+@%:@ Check whether --enable-gc-assertions was given.
+if test ${enable_gc_assertions+y}
+then :
+ enableval=$enable_gc_assertions;
+fi
+
+if test "${enable_gc_assertions}" = yes; then
+
+printf "%s\n" "@%:@define GC_ASSERTIONS 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-mmap was given.
+if test ${enable_mmap+y}
+then :
+ enableval=$enable_mmap; gc_use_mmap=$enableval
+fi
+
+
+@%:@ Check whether --enable-munmap was given.
+if test ${enable_munmap+y}
+then :
+ enableval=$enable_munmap; MUNMAP_THRESHOLD=$enableval
+fi
+
+if test x$enable_munmap != xno; then
+
+printf "%s\n" "@%:@define USE_MMAP 1" >>confdefs.h
+
+
+
+printf "%s\n" "@%:@define USE_MUNMAP 1" >>confdefs.h
+
+ if test x$MUNMAP_THRESHOLD = x -o x$MUNMAP_THRESHOLD = xyes; then
+ MUNMAP_THRESHOLD=6
+ fi
+
+printf "%s\n" "@%:@define MUNMAP_THRESHOLD ${MUNMAP_THRESHOLD}" >>confdefs.h
+
+else
+ if test "${gc_use_mmap}" = "yes"; then
+
+printf "%s\n" "@%:@define USE_MMAP 1" >>confdefs.h
+
+ fi
+fi
+
+@%:@ Check whether --enable-dynamic-loading was given.
+if test ${enable_dynamic_loading+y}
+then :
+ enableval=$enable_dynamic_loading;
+fi
+
+if test "${enable_dynamic_loading}" = "no"; then
+
+printf "%s\n" "@%:@define IGNORE_DYNAMIC_LOADING 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-register-main-static-data was given.
+if test ${enable_register_main_static_data+y}
+then :
+ enableval=$enable_register_main_static_data;
+fi
+
+if test "${enable_register_main_static_data}" = "no"; then
+
+printf "%s\n" "@%:@define GC_DONT_REGISTER_MAIN_STATIC_DATA 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-checksums was given.
+if test ${enable_checksums+y}
+then :
+ enableval=$enable_checksums;
+fi
+
+if test x$enable_checksums = xyes; then
+ if test x$enable_munmap != xno -o x$THREADS != xnone; then
+ as_fn_error $? "CHECKSUMS not compatible with USE_MUNMAP or threads" "$LINENO" 5
+ fi
+
+printf "%s\n" "@%:@define CHECKSUMS 1" >>confdefs.h
+
+fi
+ if test x$enable_checksums = xyes; then
+ CHECKSUMS_TRUE=
+ CHECKSUMS_FALSE='#'
+else
+ CHECKSUMS_TRUE='#'
+ CHECKSUMS_FALSE=
+fi
+
+
+ if test -z "$with_cross_host"; then
+ USE_LIBDIR_TRUE=
+ USE_LIBDIR_FALSE='#'
+else
+ USE_LIBDIR_TRUE='#'
+ USE_LIBDIR_FALSE=
+fi
+
+
+@%:@ Check whether --enable-werror was given.
+if test ${enable_werror+y}
+then :
+ enableval=$enable_werror; werror_flag=$enableval
+else $as_nop
+ werror_flag=no
+fi
+
+if test x$werror_flag = xyes; then
+ WERROR_CFLAGS="-Werror"
+ case "$host" in
+ # _dyld_bind_fully_image_containing_address is deprecated in OS X 10.5+
+ *-*-darwin*)
+ WERROR_CFLAGS="$WERROR_CFLAGS -Wno-deprecated-declarations"
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-single-obj-compilation was given.
+if test ${enable_single_obj_compilation+y}
+then :
+ enableval=$enable_single_obj_compilation;
+else $as_nop
+ if test x"$enable_static" = xno
+then :
+ enable_single_obj_compilation=yes
+fi
+fi
+
+ if test x"$enable_single_obj_compilation" = xyes; then
+ SINGLE_GC_OBJ_TRUE=
+ SINGLE_GC_OBJ_FALSE='#'
+else
+ SINGLE_GC_OBJ_TRUE='#'
+ SINGLE_GC_OBJ_FALSE=
+fi
+
+
+@%:@ Check whether --enable-gcov was given.
+if test ${enable_gcov+y}
+then :
+ enableval=$enable_gcov;
+fi
+
+if test "$enable_gcov" = "yes"; then
+ CFLAGS="-D NTHREADS=20 $CFLAGS --coverage"
+ if test "${enable_shared}" = no; then
+ # FIXME: As of g++-4.8.4/x64, in case of shared library build, test_cpp
+ # linkage fails with "hidden symbol atexit is referenced by DSO" message.
+ CXXFLAGS="$CXXFLAGS --coverage"
+ fi
+ # Turn off optimization to get accurate line numbers.
+ CFLAGS=`echo "$CFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+ CXXFLAGS=`echo "$CXXFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+fi
+
+@%:@ Check whether --enable-docs was given.
+if test ${enable_docs+y}
+then :
+ enableval=$enable_docs;
+fi
+
+ if test x$enable_docs != xno; then
+ ENABLE_DOCS_TRUE=
+ ENABLE_DOCS_FALSE='#'
+else
+ ENABLE_DOCS_TRUE='#'
+ ENABLE_DOCS_FALSE=
+fi
+
+
+ if test x$enable_shared = xyes; then
+ ENABLE_SHARED_TRUE=
+ ENABLE_SHARED_FALSE='#'
+else
+ ENABLE_SHARED_TRUE='#'
+ ENABLE_SHARED_FALSE=
+fi
+
+
+# Atomic Ops
+# ----------
+
+# Do we want to use an external libatomic_ops? By default use it if it's
+# found.
+
+@%:@ Check whether --with-libatomic-ops was given.
+if test ${with_libatomic_ops+y}
+then :
+ withval=$with_libatomic_ops;
+else $as_nop
+ if test x"$THREADS" != xnone
+then :
+ with_libatomic_ops=check
+else $as_nop
+ with_libatomic_ops=none
+fi
+fi
+
+
+# Check whether compiler atomic intrinsics can be used.
+if test x"$with_libatomic_ops" = xcheck; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler intrinsics support" >&5
+printf %s "checking for compiler intrinsics support... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -DGC_BUILTIN_ATOMIC"
+ CFLAGS="$CFLAGS -I${srcdir}/include -I${srcdir}/tests"
+ if test "$cross_compiling" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: skipped because cross-compiling" >&5
+printf "%s\n" "skipped because cross-compiling" >&6; }
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "test_atomic_ops.c"
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ with_libatomic_ops=none
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for an external libatomic_ops if the above answer is "yes" or "check".
+# If not found, fail on "yes", and convert "check" to "no".
+# First, check that libatomic_ops usage is not disabled explicitly.
+missing_libatomic_ops=false
+if test x"$with_libatomic_ops" != xno -a x"$with_libatomic_ops" != xnone
+then :
+ missing_libatomic_ops=true
+fi
+
+
+if test x$missing_libatomic_ops = xtrue
+then :
+ ac_fn_c_check_header_compile "$LINENO" "atomic_ops.h" "ac_cv_header_atomic_ops_h" "$ac_includes_default"
+if test "x$ac_cv_header_atomic_ops_h" = xyes
+then :
+ missing_libatomic_ops=false
+fi
+
+fi
+if test x$missing_libatomic_ops = xtrue
+then :
+ if test x"$with_libatomic_ops" != xcheck
+then :
+ as_fn_error $? "An external libatomic_ops was not found" "$LINENO" 5
+fi
+ with_libatomic_ops=no
+fi
+
+# If we have neither an external or an internal version, offer a useful hint
+# and exit.
+if test x"$with_libatomic_ops" = xno \
+ -a ! -e "$srcdir/libatomic_ops/src/atomic_ops.h"
+then :
+ as_fn_error $? "libatomic_ops is required. You can either install it on
+ your system, or fetch and unpack a recent version into the
+ source directory and link or rename it to libatomic_ops." "$LINENO" 5
+fi
+
+# Finally, emit the definitions for bundled or external AO.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which libatomic_ops to use" >&5
+printf %s "checking which libatomic_ops to use... " >&6; }
+
+
+if test x"$with_libatomic_ops" != xno
+then :
+ if test x"$with_libatomic_ops" != xnone -a x"$THREADS" != xnone
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: external" >&5
+printf "%s\n" "external" >&6; }
+ ATOMIC_OPS_LIBS="-latomic_ops"
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+ if test x"$THREADS" != xnone
+then :
+
+printf "%s\n" "@%:@define GC_BUILTIN_ATOMIC 1" >>confdefs.h
+
+fi
+fi
+ AO_TRYLINK_CFLAGS=""
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: internal" >&5
+printf "%s\n" "internal" >&6; }
+ AO_TRYLINK_CFLAGS="-I${srcdir}/libatomic_ops/src"
+ ATOMIC_OPS_CFLAGS='-I$(top_builddir)/libatomic_ops/src -I$(top_srcdir)/libatomic_ops/src'
+ ATOMIC_OPS_LIBS=""
+
+ subdirs="$subdirs libatomic_ops"
+
+
+fi
+ if test x$with_libatomic_ops = xno -a x"$THREADS" != xnone; then
+ USE_INTERNAL_LIBATOMIC_OPS_TRUE=
+ USE_INTERNAL_LIBATOMIC_OPS_FALSE='#'
+else
+ USE_INTERNAL_LIBATOMIC_OPS_TRUE='#'
+ USE_INTERNAL_LIBATOMIC_OPS_FALSE=
+fi
+
+ if test x$with_libatomic_ops = xno -a x$need_atomic_ops_asm = xtrue; then
+ NEED_ATOMIC_OPS_ASM_TRUE=
+ NEED_ATOMIC_OPS_ASM_FALSE='#'
+else
+ NEED_ATOMIC_OPS_ASM_TRUE='#'
+ NEED_ATOMIC_OPS_ASM_FALSE=
+fi
+
+
+# Check whether particular AO primitives are emulated with locks.
+# The check below is based on the fact that linking with the libatomic_ops
+# binary file is not needed in case of absence of the emulation (except for
+# Solaris SPARC).
+if test x$with_libatomic_ops != xnone -a x$need_atomic_ops_asm != xtrue
+then :
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $AO_TRYLINK_CFLAGS $CFLAGS_EXTRA"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free AO_or primitive" >&5
+printf %s "checking for lock-free AO_or primitive... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;AO_or(&x,1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "@%:@define HAVE_LOCKFREE_AO_OR 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free AO load/store, test-and-set primitives" >&5
+printf %s "checking for lock-free AO load/store, test-and-set primitives... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;unsigned char c=0;AO_TS_t z=AO_TS_INITIALIZER;
+ (void)AO_test_and_set_acquire(&z);AO_CLEAR(&z);AO_compiler_barrier();
+ AO_store(&x,AO_load(&x)+1);AO_char_store(&c,AO_char_load(&c)+1);
+ AO_store_release(&x,AO_load_acquire(&x)+1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ use_thread_local_alloc=no
+
+printf "%s\n" "@%:@define BASE_ATOMIC_OPS_EMULATED 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test x$use_parallel_mark != xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free compare-and-swap and fetch-and-add primitives" >&5
+printf %s "checking for lock-free compare-and-swap and fetch-and-add primitives... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;(void)AO_fetch_and_add(&x,1);(void)AO_compare_and_swap(&x,1,2)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ use_parallel_mark=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ CFLAGS="$old_CFLAGS"
+fi
+
+if test x$use_parallel_mark != xno
+then :
+ printf "%s\n" "@%:@define PARALLEL_MARK 1" >>confdefs.h
+
+fi
+if test x$use_thread_local_alloc != xno
+then :
+ printf "%s\n" "@%:@define THREAD_LOCAL_ALLOC 1" >>confdefs.h
+
+fi
+ if test x$use_thread_local_alloc != xno; then
+ THREAD_LOCAL_ALLOC_TRUE=
+ THREAD_LOCAL_ALLOC_FALSE='#'
+else
+ THREAD_LOCAL_ALLOC_TRUE='#'
+ THREAD_LOCAL_ALLOC_FALSE=
+fi
+
+
+@%:@ Check whether --enable-handle-fork was given.
+if test ${enable_handle_fork+y}
+then :
+ enableval=$enable_handle_fork;
+fi
+
+if test "${enable_handle_fork}" = yes; then
+
+printf "%s\n" "@%:@define HANDLE_FORK 1" >>confdefs.h
+
+elif test "${enable_handle_fork}" = no; then
+
+printf "%s\n" "@%:@define NO_HANDLE_FORK 1" >>confdefs.h
+
+elif test "${enable_handle_fork}" != manual -a x$THREADS = xposix; then
+ # If the option is omitted, pthread_atfork handlers are installed
+ # by default for the targets where pthread_atfork is known to work.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-freebsd* | \
+ *-*-haiku* | *-*-hpux11* | *-*-irix* | *-*-kfreebsd*-gnu | \
+ *-*-*linux* | *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ printf "%s\n" "@%:@define HANDLE_FORK 1" >>confdefs.h
+
+ ;;
+ esac
+fi
+
+
+ac_config_files="$ac_config_files Makefile bdw-gc.pc"
+
+
+ac_config_commands="$ac_config_commands default"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIB@&t@OBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${EMSCRIPTEN_TRUE}" && test -z "${EMSCRIPTEN_FALSE}"; then
+ as_fn_error $? "conditional \"EMSCRIPTEN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THREADS_TRUE}" && test -z "${THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PTHREADS_TRUE}" && test -z "${PTHREADS_FALSE}"; then
+ as_fn_error $? "conditional \"PTHREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DARWIN_THREADS_TRUE}" && test -z "${DARWIN_THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"DARWIN_THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WIN32_THREADS_TRUE}" && test -z "${WIN32_THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"WIN32_THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PTHREAD_START_STANDALONE_TRUE}" && test -z "${PTHREAD_START_STANDALONE_FALSE}"; then
+ as_fn_error $? "conditional \"PTHREAD_START_STANDALONE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ASM_WITH_CPP_UNSUPPORTED_TRUE}" && test -z "${ASM_WITH_CPP_UNSUPPORTED_FALSE}"; then
+ as_fn_error $? "conditional \"ASM_WITH_CPP_UNSUPPORTED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AVOID_CPP_LIB_TRUE}" && test -z "${AVOID_CPP_LIB_FALSE}"; then
+ as_fn_error $? "conditional \"AVOID_CPP_LIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CPLUSPLUS_TRUE}" && test -z "${CPLUSPLUS_FALSE}"; then
+ as_fn_error $? "conditional \"CPLUSPLUS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GC_TBA_LIBRARY_TRUE}" && test -z "${GC_TBA_LIBRARY_FALSE}"; then
+ as_fn_error $? "conditional \"GC_TBA_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GCJ_SUPPORT_TRUE}" && test -z "${ENABLE_GCJ_SUPPORT_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_GCJ_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MAKE_BACK_GRAPH_TRUE}" && test -z "${MAKE_BACK_GRAPH_FALSE}"; then
+ as_fn_error $? "conditional \"MAKE_BACK_GRAPH\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${KEEP_BACK_PTRS_TRUE}" && test -z "${KEEP_BACK_PTRS_FALSE}"; then
+ as_fn_error $? "conditional \"KEEP_BACK_PTRS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DISCLAIM_TRUE}" && test -z "${ENABLE_DISCLAIM_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DISCLAIM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CHECKSUMS_TRUE}" && test -z "${CHECKSUMS_FALSE}"; then
+ as_fn_error $? "conditional \"CHECKSUMS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_LIBDIR_TRUE}" && test -z "${USE_LIBDIR_FALSE}"; then
+ as_fn_error $? "conditional \"USE_LIBDIR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SINGLE_GC_OBJ_TRUE}" && test -z "${SINGLE_GC_OBJ_FALSE}"; then
+ as_fn_error $? "conditional \"SINGLE_GC_OBJ\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DOCS_TRUE}" && test -z "${ENABLE_DOCS_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DOCS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INTERNAL_LIBATOMIC_OPS_TRUE}" && test -z "${USE_INTERNAL_LIBATOMIC_OPS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_INTERNAL_LIBATOMIC_OPS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${NEED_ATOMIC_OPS_ASM_TRUE}" && test -z "${NEED_ATOMIC_OPS_ASM_FALSE}"; then
+ as_fn_error $? "conditional \"NEED_ATOMIC_OPS_ASM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THREAD_LOCAL_ALLOC_TRUE}" && test -z "${THREAD_LOCAL_ALLOC_FALSE}"; then
+ as_fn_error $? "conditional \"THREAD_LOCAL_ALLOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in @%:@((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+
+@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD]
+@%:@ ----------------------------------------
+@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+@%:@ script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} @%:@ as_fn_error
+
+
+
+@%:@ as_fn_set_status STATUS
+@%:@ -----------------------
+@%:@ Set @S|@? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} @%:@ as_fn_set_status
+
+@%:@ as_fn_exit STATUS
+@%:@ -----------------
+@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} @%:@ as_fn_exit
+
+@%:@ as_fn_unset VAR
+@%:@ ---------------
+@%:@ Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+@%:@ as_fn_append VAR VALUE
+@%:@ ----------------------
+@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take
+@%:@ advantage of any shell optimizations that allow amortized linear growth over
+@%:@ repeated appends, instead of the typical quadratic growth present in naive
+@%:@ implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+@%:@ as_fn_arith ARG...
+@%:@ ------------------
+@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the
+@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments
+@%:@ must be portable across @S|@(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in @%:@(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_@&t@echo='printf %s\n'
+as_@&t@echo_n='printf %s'
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+@%:@ as_fn_mkdir_p
+@%:@ -------------
+@%:@ Create "@S|@as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} @%:@ as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+@%:@ as_fn_executable_p FILE
+@%:@ -----------------------
+@%:@ Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} @%:@ as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gc $as_me 8.2.8, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <https://github.com/ivmai/bdwgc/issues>."
+
+_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config='$ac_cs_config_escaped'
+ac_cs_version="\\
+gc config.status 8.2.8
+configured by $0, generated by GNU Autoconf 2.71,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ printf "%s\n" "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ printf "%s\n" "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ printf "%s\n" "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX
+@%:@@%:@ Running $as_me. @%:@@%:@
+_ASBOX
+ printf "%s\n" "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+FILECMD \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+
+
+
+
+ srcdir="${srcdir}"
+ host=${host}
+ CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ CC="${CC}"
+ DEFS="$DEFS"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "bdw-gc.pc") CONFIG_FILES="$CONFIG_FILES bdw-gc.pc" ;;
+ "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in @%:@(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; @%:@(
+ *) :
+ set x $CONFIG_FILES ;; @%:@(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "libtool":C)
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# A file(cmd) program that detects file types.
+FILECMD=$lt_FILECMD
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive (by configure).
+lt_ar_flags=$lt_ar_flags
+
+# Flags to create an archive.
+AR_FLAGS=\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ $SED '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+
+ cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file, --srcdir, and --disable-option-checking arguments
+ # so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ eval "set x $ac_configure_args"
+ shift
+ for ac_arg
+ do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case $ac_arg in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+ | --c=*)
+ ;;
+ --config-cache | -C)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ;;
+ --disable-option-checking)
+ ;;
+ *)
+ case $ac_arg in
+ *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
+ esac
+ done
+
+ # Always prepend --prefix to ensure using the same prefix
+ # in subdir configurations.
+ ac_arg="--prefix=$prefix"
+ case $ac_arg in
+ *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
+
+ # Pass --silent
+ if test "$silent" = yes; then
+ ac_sub_configure_args="--silent $ac_sub_configure_args"
+ fi
+
+ # Always prepend --disable-option-checking to silence warnings, since
+ # different subdirs can have different --enable and --with options.
+ ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
+
+ ac_popdir=`pwd`
+ for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ test -d "$srcdir/$ac_dir" || continue
+
+ ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
+ printf "%s\n" "$ac_msg" >&6
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ cd "$ac_dir"
+
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ ac_sub_configure=$ac_srcdir/configure.gnu
+ elif test -f "$ac_srcdir/configure"; then
+ ac_sub_configure=$ac_srcdir/configure
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
+printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+ # Make the cache file name correct relative to the subdirectory.
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+ *) # Relative name.
+ ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+printf "%s\n" "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+ # The eval makes quoting arguments work.
+ eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
+ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
+ as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
+ fi
+
+ cd "$ac_popdir"
+ done
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/graphics/asymptote/gc/autom4te.cache/output.2 b/graphics/asymptote/gc/autom4te.cache/output.2
new file mode 100644
index 0000000000..09b023a70e
--- /dev/null
+++ b/graphics/asymptote/gc/autom4te.cache/output.2
@@ -0,0 +1,22068 @@
+@%:@! /bin/sh
+@%:@ Guess values for system-dependent variables and create Makefiles.
+@%:@ Generated by GNU Autoconf 2.71 for gc 8.2.8.
+@%:@
+@%:@ Report bugs to <https://github.com/ivmai/bdwgc/issues>.
+@%:@
+@%:@
+@%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+@%:@ Inc.
+@%:@
+@%:@
+@%:@ This configure script is free software; the Free Software Foundation
+@%:@ gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in @%:@((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in @%:@ ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else \$as_nop
+ case \`(set -o) 2>/dev/null\` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
+
+else \$as_nop
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null
+then :
+ as_have_required=yes
+else $as_nop
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
+
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+ case $as_dir in @%:@(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
+
+
+ if test "x$CONFIG_SHELL" != x
+then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in @%:@ ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and
+$0: https://github.com/ivmai/bdwgc/issues about your
+$0: system, including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+@%:@ as_fn_unset VAR
+@%:@ ---------------
+@%:@ Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+
+@%:@ as_fn_set_status STATUS
+@%:@ -----------------------
+@%:@ Set @S|@? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} @%:@ as_fn_set_status
+
+@%:@ as_fn_exit STATUS
+@%:@ -----------------
+@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} @%:@ as_fn_exit
+@%:@ as_fn_nop
+@%:@ ---------
+@%:@ Do nothing but, unlike ":", preserve the value of @S|@?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+@%:@ as_fn_mkdir_p
+@%:@ -------------
+@%:@ Create "@S|@as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} @%:@ as_fn_mkdir_p
+
+@%:@ as_fn_executable_p FILE
+@%:@ -----------------------
+@%:@ Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} @%:@ as_fn_executable_p
+@%:@ as_fn_append VAR VALUE
+@%:@ ----------------------
+@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take
+@%:@ advantage of any shell optimizations that allow amortized linear growth over
+@%:@ repeated appends, instead of the typical quadratic growth present in naive
+@%:@ implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+@%:@ as_fn_arith ARG...
+@%:@ ------------------
+@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the
+@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments
+@%:@ must be portable across @S|@(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+@%:@ as_fn_nop
+@%:@ ---------
+@%:@ Do nothing but, unlike ":", preserve the value of @S|@?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD]
+@%:@ ----------------------------------------
+@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+@%:@ script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} @%:@ as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in @%:@(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_@&t@echo='printf %s\n'
+as_@&t@echo_n='printf %s'
+
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIB@&t@OBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='gc'
+PACKAGE_TARNAME='gc'
+PACKAGE_VERSION='8.2.8'
+PACKAGE_STRING='gc 8.2.8'
+PACKAGE_BUGREPORT='https://github.com/ivmai/bdwgc/issues'
+PACKAGE_URL=''
+
+ac_unique_file="gcj_mlc.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_c_list=
+enable_option_checking=no
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIB@&t@OBJS
+THREAD_LOCAL_ALLOC_FALSE
+THREAD_LOCAL_ALLOC_TRUE
+NEED_ATOMIC_OPS_ASM_FALSE
+NEED_ATOMIC_OPS_ASM_TRUE
+USE_INTERNAL_LIBATOMIC_OPS_FALSE
+USE_INTERNAL_LIBATOMIC_OPS_TRUE
+subdirs
+ATOMIC_OPS_CFLAGS
+ATOMIC_OPS_LIBS
+ENABLE_SHARED_FALSE
+ENABLE_SHARED_TRUE
+ENABLE_DOCS_FALSE
+ENABLE_DOCS_TRUE
+SINGLE_GC_OBJ_FALSE
+SINGLE_GC_OBJ_TRUE
+WERROR_CFLAGS
+USE_LIBDIR_FALSE
+USE_LIBDIR_TRUE
+CHECKSUMS_FALSE
+CHECKSUMS_TRUE
+UNWINDLIBS
+ENABLE_DISCLAIM_FALSE
+ENABLE_DISCLAIM_TRUE
+KEEP_BACK_PTRS_FALSE
+KEEP_BACK_PTRS_TRUE
+MAKE_BACK_GRAPH_FALSE
+MAKE_BACK_GRAPH_TRUE
+ENABLE_GCJ_SUPPORT_FALSE
+ENABLE_GCJ_SUPPORT_TRUE
+addlibs
+addobjs
+CXXLIBS
+AM_CPPFLAGS
+AM_CFLAGS
+GC_TBA_LIBRARY_FALSE
+GC_TBA_LIBRARY_TRUE
+CPLUSPLUS_FALSE
+CPLUSPLUS_TRUE
+target_all
+EXTRA_TEST_LIBS
+extra_ldflags_libgc
+AVOID_CPP_LIB_FALSE
+AVOID_CPP_LIB_TRUE
+ASM_WITH_CPP_UNSUPPORTED_FALSE
+ASM_WITH_CPP_UNSUPPORTED_TRUE
+PTHREAD_START_STANDALONE_FALSE
+PTHREAD_START_STANDALONE_TRUE
+WIN32_THREADS_FALSE
+WIN32_THREADS_TRUE
+DARWIN_THREADS_FALSE
+DARWIN_THREADS_TRUE
+PTHREADS_FALSE
+PTHREADS_TRUE
+THREADS_FALSE
+THREADS_TRUE
+THREADDLLIBS
+CFLAGS_EXTRA
+GC_CFLAGS
+EMSCRIPTEN_FALSE
+EMSCRIPTEN_TRUE
+CXXCPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+FILECMD
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+LIBTOOL
+am__fastdepCCAS_FALSE
+am__fastdepCCAS_TRUE
+CCASDEPMODE
+CCASFLAGS
+CCAS
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+GC_VERSION
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+CSCOPE
+ETAGS
+CTAGS
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_static
+enable_shared
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_emscripten_asyncify
+enable_threads
+enable_parallel_mark
+enable_thread_local_alloc
+enable_threads_discovery
+enable_cplusplus
+with_ecos
+enable_throw_bad_alloc_library
+with_target_subdir
+with_cross_host
+enable_gcj_support
+enable_sigrt_signals
+enable_gc_debug
+enable_java_finalization
+enable_atomic_uncollectable
+enable_redirect_malloc
+enable_disclaim
+enable_large_config
+enable_gc_assertions
+enable_mmap
+enable_munmap
+enable_dynamic_loading
+enable_register_main_static_data
+enable_checksums
+enable_werror
+enable_single_obj_compilation
+enable_gcov
+enable_docs
+with_libatomic_ops
+enable_handle_fork
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CCAS
+CCASFLAGS
+LT_SYS_LIBRARY_PATH
+CXXCPP'
+ac_subdirs_all='libatomic_ops'
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir runstatedir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures gc 8.2.8 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ @<:@@S|@ac_default_prefix@:>@
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ @<:@PREFIX@:>@
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gc@:>@
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of gc 8.2.8:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=no@:>@
+ --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@
+ --enable-fast-install@<:@=PKGS@:>@
+ optimize for fast installation @<:@default=yes@:>@
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-emscripten-asyncify
+ use Emscripten asyncify feature
+ --enable-threads=TYPE choose threading package
+ --disable-parallel-mark do not parallelize marking and free list
+ construction
+ --disable-thread-local-alloc
+ turn off thread-local allocation optimization
+ --disable-threads-discovery
+ disable threads discovery in GC
+ --enable-cplusplus install C++ support
+ --disable-throw-bad-alloc-library
+ do not build C++ gctba library
+ --disable-gcj-support disable support for gcj
+ --enable-sigrt-signals force GC to use SIGRTMIN-based signals for thread
+ suspend/resume
+ --enable-gc-debug include full support for pointer backtracing etc.
+ --disable-java-finalization
+ disable support for java finalization
+ --disable-atomic-uncollectible
+ disable support for atomic uncollectible allocation
+ --enable-redirect-malloc
+ redirect malloc and friends to GC routines
+ --disable-disclaim disable alternative (more efficient) finalization
+ interface
+ --enable-large-config optimize for large (> 100 MB) heap or root set
+ --enable-gc-assertions collector-internal assertion checking
+ --enable-mmap use mmap instead of sbrk to expand the heap
+ --enable-munmap=N return page to the OS if empty for N collections
+ (default: 6)
+ --disable-dynamic-loading
+ build the collector with disabled tracing of dynamic
+ library data roots
+ --disable-register-main-static-data
+ skip the initial guess of data root sets
+ --enable-checksums report on erroneously cleared dirty bits at
+ substantial performance cost; use only for debugging
+ of the incremental collector
+ --enable-werror pass -Werror to the C compiler
+ --enable-single-obj-compilation
+ compile all libgc source files into single .o
+ (default: yes if static libraries are disabled)
+ --enable-gcov turn on code coverage analysis
+ --disable-docs do not build and install documentation
+ --enable-handle-fork=yes|no|auto|manual
+ attempt to ensure a usable collector after fork() in
+ multi-threaded programs (default: auto; manual:
+ GC_atfork_prepare/parent/child should be called by
+ the client)
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use
+ both@:>@
+ --with-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, @<:@default=aix@:>@.
+ --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@
+ --with-sysroot@<:@=DIR@:>@ Search for dependent libraries within DIR (or the
+ compiler's sysroot if not specified).
+ --with-ecos enable runtime eCos target support
+ --with-target-subdir=SUBDIR
+ configuring with a cross compiler
+ --with-cross-host=HOST configuring with a cross compiler
+ --with-libatomic-ops=yes|no|check|none
+ use an external libatomic_ops? (default: check;
+ none: use compiler intrinsics or no thread support)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CCAS assembler compiler command (defaults to CC)
+ CCASFLAGS assembler compiler flags (defaults to CFLAGS)
+ LT_SYS_LIBRARY_PATH
+ User-defined run-time library search path.
+ CXXCPP C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <https://github.com/ivmai/bdwgc/issues>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+gc configure 8.2.8
+generated by GNU Autoconf 2.71
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+@%:@ ac_fn_c_try_compile LINENO
+@%:@ --------------------------
+@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_compile
+
+@%:@ ac_fn_cxx_try_compile LINENO
+@%:@ ----------------------------
+@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_compile
+
+@%:@ ac_fn_c_try_link LINENO
+@%:@ -----------------------
+@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_link
+
+@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+@%:@ -------------------------------------------------------
+@%:@ Tests whether HEADER exists and can be compiled using the include files in
+@%:@ INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+@%:@include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} @%:@ ac_fn_c_check_header_compile
+
+@%:@ ac_fn_c_check_func LINENO FUNC VAR
+@%:@ ----------------------------------
+@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below. */
+
+#include <limits.h>
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* 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 defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} @%:@ ac_fn_c_check_func
+
+@%:@ ac_fn_cxx_try_cpp LINENO
+@%:@ ------------------------
+@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_cpp
+
+@%:@ ac_fn_cxx_try_link LINENO
+@%:@ -------------------------
+@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_link
+
+@%:@ ac_fn_c_try_run LINENO
+@%:@ ----------------------
+@%:@ Try to run conftest.@S|@ac_ext, and return whether this succeeded. Assumes that
+@%:@ executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_run
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?@<:@ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gc $as_me 8.2.8, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ $ $0$ac_configure_args_raw
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ printf "%s\n" "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ printf "%s\n" "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ printf "%s\n" "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ printf "%s\n" "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+printf "%s\n" "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+printf "%s\n" "@%:@define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ ac_site_files="$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
+else
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+fi
+
+for ac_site_file in $ac_site_files
+do
+ case $ac_site_file in @%:@(
+ */*) :
+ ;; @%:@(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+ extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+ try {
+ throw "test";
+ } catch (const char *s) {
+ // Extra parentheses suppress a warning when building autoconf itself,
+ // due to lint rules shared with more typical C programs.
+ assert (!(strcmp) (s, "test"));
+ }
+}
+
+template <typename T> struct test_template
+{
+ T const val;
+ explicit test_template(T t) : val(t) {}
+ template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+ assert (argc);
+ assert (! argv[0]);
+{
+ test_exception_syntax ();
+ test_template<double> tt (2.0);
+ assert (tt.add (4) == 6.0);
+ assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+ constexpr int get_val() { return 20; }
+
+ struct testinit
+ {
+ int i;
+ double d;
+ };
+
+ class delegate
+ {
+ public:
+ delegate(int n) : n(n) {}
+ delegate(): delegate(2354) {}
+
+ virtual int getval() { return this->n; };
+ protected:
+ int n;
+ };
+
+ class overridden : public delegate
+ {
+ public:
+ overridden(int n): delegate(n) {}
+ virtual int getval() override final { return this->n * 2; }
+ };
+
+ class nocopy
+ {
+ public:
+ nocopy(int i): i(i) {}
+ nocopy() = default;
+ nocopy(const nocopy&) = delete;
+ nocopy & operator=(const nocopy&) = delete;
+ private:
+ int i;
+ };
+
+ // for testing lambda expressions
+ template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+ {
+ return f(v);
+ }
+
+ // for testing variadic templates and trailing return types
+ template <typename V> auto sum(V first) -> V
+ {
+ return first;
+ }
+ template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+ {
+ return first + sum(rest...);
+ }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+ // Test auto and decltype
+ auto a1 = 6538;
+ auto a2 = 48573953.4;
+ auto a3 = "String literal";
+
+ int total = 0;
+ for (auto i = a3; *i; ++i) { total += *i; }
+
+ decltype(a2) a4 = 34895.034;
+}
+{
+ // Test constexpr
+ short sa[cxx11test::get_val()] = { 0 };
+}
+{
+ // Test initializer lists
+ cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+ // Test range-based for
+ int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+ 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+ for (auto &x : array) { x += 23; }
+}
+{
+ // Test lambda expressions
+ using cxx11test::eval;
+ assert (eval ([](int x) { return x*2; }, 21) == 42);
+ double d = 2.0;
+ assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+ assert (d == 5.0);
+ assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+ assert (d == 5.0);
+}
+{
+ // Test use of variadic templates
+ using cxx11test::sum;
+ auto a = sum(1);
+ auto b = sum(1, 2);
+ auto c = sum(1.0, 2.0, 3.0);
+}
+{
+ // Test constructor delegation
+ cxx11test::delegate d1;
+ cxx11test::delegate d2();
+ cxx11test::delegate d3(45);
+}
+{
+ // Test override and final
+ cxx11test::overridden o1(55464);
+}
+{
+ // Test nullptr
+ char *c = nullptr;
+}
+{
+ // Test template brackets
+ test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+ // Unicode literals
+ char const *utf8 = u8"UTF-8 string \u2500";
+ char16_t const *utf16 = u"UTF-8 string \u2500";
+ char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ ${ac_cxx_conftest_cxx11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="ltmain.sh compile missing install-sh config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_@&t@configure="$SHELL ${ac_aux_dir}configure"
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
+else
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking GC version numbers" >&5
+printf %s "checking GC version numbers... " >&6; }
+ GC_VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\([0-9][0-9]*\)[.].*$/\1/g'`
+ GC_VERSION_MINOR=`echo $PACKAGE_VERSION | sed 's/^[^.]*[.]\([0-9][0-9]*\).*$/\1/g'`
+ GC_VERSION_MICRO=`echo $PACKAGE_VERSION | sed 's/^[^.]*[.][^.]*[.]\([0-9][0-9]*\)$/\1/g'`
+
+ if test :$GC_VERSION_MAJOR: = :: \
+ -o :$GC_VERSION_MINOR: = :: \
+ -o :$GC_VERSION_MICRO: = :: ;
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: invalid" >&5
+printf "%s\n" "invalid" >&6; }
+ as_fn_error $? "nonconforming PACKAGE_VERSION='$PACKAGE_VERSION'" "$LINENO" 5
+ fi
+
+
+printf "%s\n" "@%:@define GC_VERSION_MAJOR $GC_VERSION_MAJOR" >>confdefs.h
+
+
+printf "%s\n" "@%:@define GC_VERSION_MINOR $GC_VERSION_MINOR" >>confdefs.h
+
+
+printf "%s\n" "@%:@define GC_VERSION_MICRO $GC_VERSION_MICRO" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO" >&5
+printf "%s\n" "major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO" >&6; }
+
+am__api_version='1.16'
+
+
+ # Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in @%:@((
+ ./ | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test ${ac_cv_path_install+y}; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"`
+
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+
+ if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ 'BusyBox '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test ${ac_cv_path_mkdir+y}; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SET_MAKE=
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+@%:@ Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gc'
+ VERSION='8.2.8'
+
+
+printf "%s\n" "@%:@define PACKAGE \"$PACKAGE\"" >>confdefs.h
+
+
+printf "%s\n" "@%:@define VERSION \"$VERSION\"" >>confdefs.h
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+ac_config_headers="$ac_config_headers include/config.h"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ @%:@ Check whether --enable-maintainer-mode was given.
+if test ${enable_maintainer_mode+y}
+then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else $as_nop
+ USE_MAINTAINER_MODE=no
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+printf "%s\n" "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in @%:@(
+ '0:this is the am__doit target') :
+ case $s in @%:@(
+ BSD) :
+ am__include='.include' am__quote='"' ;; @%:@(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; @%:@(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
+
+@%:@ Check whether --enable-dependency-tracking was given.
+if test ${enable_dependency_tracking+y}
+then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $@%:@ != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else $as_nop
+ ac_file=''
+fi
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <stdio.h>
+int
+main (void)
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+y}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+else $as_nop
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+# By default we simply use the C compiler to build assembly code.
+
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+
+
+
+depcc="$CCAS" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CCAS_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CCAS_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CCAS_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CCAS_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CCAS_dependencies_compiler_type" >&6; }
+CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then
+ am__fastdepCCAS_TRUE=
+ am__fastdepCCAS_FALSE='#'
+else
+ am__fastdepCCAS_TRUE='#'
+ am__fastdepCCAS_FALSE=
+fi
+
+
+
+case `pwd` in
+ *\ * | *\ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.7'
+macro_revision='2.4.7'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+printf %s "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO ""
+}
+
+case $ECHO in
+ printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+printf "%s\n" "printf" >&6; } ;;
+ print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+printf "%s\n" "print -r" >&6; } ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+printf "%s\n" "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in sed gsed
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+printf %s "checking for fgrep... " >&6; }
+if test ${ac_cv_path_FGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+ then ac_cv_path_FGREP="$GREP -F"
+ else
+ if test -z "$FGREP"; then
+ ac_path_FGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in fgrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+ # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'FGREP' >> "conftest.nl"
+ "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_FGREP="$ac_path_FGREP"
+ ac_path_FGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_FGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_FGREP"; then
+ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_FGREP=$FGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+printf "%s\n" "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@%:@ Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test ${lt_cv_path_NM+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+printf "%s\n" "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in dumpbin "link -dump"
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DUMPBIN"; then
+ ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+printf "%s\n" "$DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$DUMPBIN" && break
+ done
+fi
+if test -z "$DUMPBIN"; then
+ ac_ct_DUMPBIN=$DUMPBIN
+ for ac_prog in dumpbin "link -dump"
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DUMPBIN"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+printf "%s\n" "$ac_ct_DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_DUMPBIN" && break
+done
+
+ if test "x$ac_ct_DUMPBIN" = x; then
+ DUMPBIN=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DUMPBIN=$ac_ct_DUMPBIN
+ fi
+fi
+
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+printf %s "checking the name lister ($NM) interface... " >&6; }
+if test ${lt_cv_nm_interface+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+printf "%s\n" "$lt_cv_nm_interface" >&6; }
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+printf %s "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+printf "%s\n" "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+printf %s "checking the maximum length of command line arguments... " >&6; }
+if test ${lt_cv_sys_max_cmd_len+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+printf %s "checking how to convert $build file names to $host format... " >&6; }
+if test ${lt_cv_to_host_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+printf %s "checking how to convert $build file names to toolchain format... " >&6; }
+if test ${lt_cv_to_tool_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+printf %s "checking for $LD option to reload object files... " >&6; }
+if test ${lt_cv_ld_reload_flag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_reload_flag='-r'
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+printf "%s\n" "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args.
+set dummy ${ac_tool_prefix}file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$FILECMD"; then
+ ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_FILECMD="${ac_tool_prefix}file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+FILECMD=$ac_cv_prog_FILECMD
+if test -n "$FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5
+printf "%s\n" "$FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_FILECMD"; then
+ ac_ct_FILECMD=$FILECMD
+ # Extract the first word of "file", so it can be a program name with args.
+set dummy file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_FILECMD"; then
+ ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_FILECMD="file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD
+if test -n "$ac_ct_FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5
+printf "%s\n" "$ac_ct_FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_FILECMD" = x; then
+ FILECMD=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ FILECMD=$ac_ct_FILECMD
+ fi
+else
+ FILECMD="$ac_cv_prog_FILECMD"
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+printf "%s\n" "$OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+printf "%s\n" "$ac_ct_OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+printf %s "checking how to recognize dependent libraries... " >&6; }
+if test ${lt_cv_deplibs_check_method+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='$FILECMD -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=$FILECMD
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[3-9]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+printf "%s\n" "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+printf "%s\n" "$DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+printf "%s\n" "$ac_ct_DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+printf %s "checking how to associate runtime and link libraries... " >&6; }
+if test ${lt_cv_sharedlib_from_linklib_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AR" && break
+ done
+fi
+if test -z "$AR"; then
+ ac_ct_AR=$AR
+ for ac_prog in ar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AR" && break
+done
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+fi
+
+: ${AR=ar}
+
+
+
+
+
+
+# Use ARFLAGS variable as AR's operation code to sync the variable naming with
+# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
+# higher priority because thats what people were doing historically (setting
+# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS
+# variable obsoleted/removed.
+
+test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
+lt_ar_flags=$AR_FLAGS
+
+
+
+
+
+
+# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override
+# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+printf %s "checking for archiver @FILE support... " >&6; }
+if test ${lt_cv_ar_at_file+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -eq "$ac_status"; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+printf "%s\n" "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+printf %s "checking command to parse $NM output from $compiler object... " >&6; }
+if test ${lt_cv_sys_global_symbol_pipe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ if test ia64 = "$host_cpu"; then
+ symcode='[ABCDEGRST]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="$SED -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
+ # Also find C++ and __fastcall symbols from MSVC++ or ICC,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK '"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx"
+ else
+ lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT@&t@_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT@&t@_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS=conftstm.$ac_objext
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test yes = "$pipe_works"; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+printf "%s\n" "failed" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+printf "%s\n" "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+printf %s "checking for sysroot... " >&6; }
+
+@%:@ Check whether --with-sysroot was given.
+if test ${with_sysroot+y}
+then :
+ withval=$with_sysroot;
+else $as_nop
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+printf "%s\n" "$with_sysroot" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+printf "%s\n" "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+printf %s "checking for a working dd... " >&6; }
+if test ${ac_cv_path_lt_DD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+ ac_path_lt_DD_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in dd
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+ $ac_path_lt_DD_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_lt_DD"; then
+ :
+ fi
+else
+ ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+printf "%s\n" "$ac_cv_path_lt_DD" >&6; }
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+printf %s "checking how to truncate binary pipes... " >&6; }
+if test ${lt_cv_truncate_bin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+printf "%s\n" "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+@%:@ Check whether --enable-libtool-lock was given.
+if test ${enable_libtool_lock+y}
+then :
+ enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE=32
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE=64
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ emul=elf
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ case `$FILECMD conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -belf"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+printf %s "checking whether the C compiler needs -belf... " >&6; }
+if test ${lt_cv_cc_needs_belf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_cc_needs_belf=yes
+else $as_nop
+ lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+printf "%s\n" "$lt_cv_cc_needs_belf" >&6; }
+ if test yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$MANIFEST_TOOL"; then
+ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+printf "%s\n" "$MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+ # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_MANIFEST_TOOL"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+ fi
+else
+ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if test ${lt_cv_path_mainfest_tool+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&5
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+ MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+ case $host_os in
+ rhapsody* | darwin*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DSYMUTIL"; then
+ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+printf "%s\n" "$DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+ ac_ct_DSYMUTIL=$DSYMUTIL
+ # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DSYMUTIL"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+printf "%s\n" "$ac_ct_DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DSYMUTIL=$ac_ct_DSYMUTIL
+ fi
+else
+ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$NMEDIT"; then
+ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+printf "%s\n" "$NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+ ac_ct_NMEDIT=$NMEDIT
+ # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_NMEDIT"; then
+ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+printf "%s\n" "$ac_ct_NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ NMEDIT=$ac_ct_NMEDIT
+ fi
+else
+ NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$LIPO"; then
+ ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+printf "%s\n" "$LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+ ac_ct_LIPO=$LIPO
+ # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_LIPO"; then
+ ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_LIPO="lipo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+printf "%s\n" "$ac_ct_LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_LIPO" = x; then
+ LIPO=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIPO=$ac_ct_LIPO
+ fi
+else
+ LIPO="$ac_cv_prog_LIPO"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OTOOL"; then
+ ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+printf "%s\n" "$OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+ ac_ct_OTOOL=$OTOOL
+ # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OTOOL"; then
+ ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL="otool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+printf "%s\n" "$ac_ct_OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL" = x; then
+ OTOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL=$ac_ct_OTOOL
+ fi
+else
+ OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OTOOL64"; then
+ ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+printf "%s\n" "$OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+ ac_ct_OTOOL64=$OTOOL64
+ # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OTOOL64"; then
+ ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL64="otool64"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+printf "%s\n" "$ac_ct_OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL64" = x; then
+ OTOOL64=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL64=$ac_ct_OTOOL64
+ fi
+else
+ OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+printf %s "checking for -single_module linker flag... " >&6; }
+if test ${lt_cv_apple_cc_single_mod+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_apple_cc_single_mod=no
+ if test -z "$LT_MULTI_MODULE"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+printf %s "checking for -exported_symbols_list linker flag... " >&6; }
+if test ${lt_cv_ld_exported_symbols_list+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_ld_exported_symbols_list=yes
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+printf %s "checking for -force_load linker flag... " >&6; }
+if test ${lt_cv_ld_force_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+ echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5
+ $AR $AR_FLAGS libconftest.a conftest.o 2>&5
+ echo "$RANLIB libconftest.a" >&5
+ $RANLIB libconftest.a 2>&5
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+printf "%s\n" "$lt_cv_ld_force_load" >&6; }
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ darwin*)
+ case $MACOSX_DEPLOYMENT_TARGET,$host in
+ 10.[012],*|,*powerpc*-darwin[5-8]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ *)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+ fi
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "@%:@define STDC_HEADERS 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes
+then :
+ printf "%s\n" "@%:@define HAVE_DLFCN_H 1" >>confdefs.h
+
+fi
+
+
+
+
+func_stripname_cnf ()
+{
+ case @S|@2 in
+ .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+ *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
+ esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+@%:@ Check whether --enable-static was given.
+if test ${enable_static+y}
+then :
+ enableval=$enable_static; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_static=no
+fi
+
+
+
+
+
+
+
+
+
+
+ enable_dlopen=no
+
+
+ enable_win32_dll=no
+
+
+ @%:@ Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+@%:@ Check whether --with-pic was given.
+if test ${with_pic+y}
+then :
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ pic_mode=default
+fi
+
+
+
+
+
+
+
+
+ @%:@ Check whether --enable-fast-install was given.
+if test ${enable_fast_install+y}
+then :
+ enableval=$enable_fast_install; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+ shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+printf %s "checking which variant of shared library versioning to provide... " >&6; }
+
+@%:@ Check whether --with-aix-soname was given.
+if test ${with_aix_soname+y}
+then :
+ withval=$with_aix_soname; case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else $as_nop
+ if test ${lt_cv_with_aix_soname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_with_aix_soname=aix
+fi
+
+ with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+printf "%s\n" "$with_aix_soname" >&6; }
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+printf %s "checking for objdir... " >&6; }
+if test ${lt_cv_objdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+printf "%s\n" "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+printf "%s\n" "@%:@define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC and
+# ICC, which need '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+printf %s "checking for ${ac_tool_prefix}file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/${ac_tool_prefix}file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+printf %s "checking for file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test ${lt_cv_prog_compiler_rtti_exceptions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+
+
+
+
+
+ lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+ if test yes = "$GCC"; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='$wl-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ # old Intel for x86_64, which still supported -KPIC.
+ ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='--shared'
+ lt_prog_compiler_static='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag=
+ always_export_symbols=no
+ archive_cmds=
+ archive_expsym_cmds=
+ compiler_needs_object=no
+ enable_shared_with_static_runtimes=no
+ export_dynamic_flag_spec=
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ hardcode_automatic=no
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_separator=
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ inherit_rpath=no
+ link_all_deplibs=unknown
+ module_cmds=
+ module_expsym_cmds=
+ old_archive_from_new_cmds=
+ old_archive_from_expsyms_cmds=
+ thread_safe_flag_spec=
+ whole_archive_flag_spec=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
+ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ if test yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test yes = "$with_gnu_ld"; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+ *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test yes = "$lt_use_gnu_ld_interface"; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='$wl'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec='$wl--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test ia64 != "$host_cpu"; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ export_dynamic_flag_spec='$wl--export-all-symbols'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ haiku*)
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs=yes
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test linux-dietlibc = "$host_os"; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test no = "$tmp_diet"
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ whole_archive_flag_spec=
+ tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
+ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ tcc*)
+ export_dynamic_flag_spec='-rdynamic'
+ ;;
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test no = "$ld_shlibs"; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ file_list_spec='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' $wl-bernotok'
+ allow_undefined_flag=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ fi
+ archive_cmds_need_lc=yes
+ archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl* | icl*)
+ # Native MSVC or ICC
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ file_list_spec='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+ enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ old_postinstall_cmds='chmod 644 $oldlib'
+ postlink_cmds='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC and ICC wrapper
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ enable_shared_with_static_runtimes=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec=''
+ fi
+ link_all_deplibs=yes
+ allow_undefined_flag=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+ else
+ ld_shlibs=no
+ fi
+
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly* | midnightbsd*)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test yes = "$GCC"; then
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='$wl-E'
+ ;;
+
+ hpux10*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+printf %s "checking if $CC understands -b... " >&6; }
+if test ${lt_cv_prog_compiler__b+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler__b=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -b"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler__b=yes
+ fi
+ else
+ lt_cv_prog_compiler__b=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+printf "%s\n" "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+ ;;
+ esac
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if test ${lt_cv_irix_exported_symbol+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_irix_exported_symbol=yes
+else $as_nop
+ lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; }
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+ fi
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ inherit_rpath=yes
+ link_all_deplibs=yes
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ ld_shlibs=yes
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ hardcode_direct_absolute=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ else
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z defs'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='$wl'
+ archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test yes = "$GCC"; then
+ whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test sequent = "$host_vendor"; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag='$wl-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='$wl-z,text'
+ allow_undefined_flag='$wl-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-R,$libdir'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+
+ if test sni = "$host_vendor"; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ export_dynamic_flag_spec='$wl-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+printf "%s\n" "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+ case $host_os in
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary...
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo = "/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[lt_foo]++; }
+ if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+ test -n "$runpath_var" ||
+ test yes = "$hardcode_automatic"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+ test no != "$hardcode_minus_L"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+printf "%s\n" "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+ test yes = "$inherit_rpath"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+ if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else $as_nop
+
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes
+then :
+ lt_cv_dlopen=shl_load
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+printf %s "checking for shl_load in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_shl_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main (void)
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_shl_load=yes
+else $as_nop
+ ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes
+then :
+ lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else $as_nop
+ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+printf %s "checking for dlopen in -lsvld... " >&6; }
+if test ${ac_cv_lib_svld_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_svld_dlopen=yes
+else $as_nop
+ ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+printf %s "checking for dld_link in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_dld_link+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main (void)
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_dld_link=yes
+else $as_nop
+ ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes
+then :
+ lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+printf %s "checking whether a program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+printf "%s\n" "$lt_cv_dlopen_self" >&6; }
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+printf %s "checking whether a statically linked program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self_static+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+printf "%s\n" "$lt_cv_dlopen_self_static" >&6; }
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+printf %s "checking whether stripping libraries is possible... " >&6; }
+if test -z "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+else
+ if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ case $host_os in
+ darwin*)
+ # FIXME - insert some real tests, host_os isn't really good enough
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ ;;
+ freebsd*)
+ if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ ;;
+ esac
+ fi
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # Report what library types will actually be built
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+printf %s "checking if libtool supports shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+printf "%s\n" "$can_build_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+printf %s "checking whether to build static libraries... " >&6; }
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+printf "%s\n" "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+ if test -n "$CXX" && ( test no != "$CXX" &&
+ ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+ (test g++ != "$CXX"))); then
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+printf %s "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if test ${ac_cv_prog_CXXCPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CXX needs to be expanded
+ for CXXCPP in "$CXX -E" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+printf "%s\n" "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+ _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="int some_variable = 0;"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+ # save warnings/boilerplate of simple test code
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_CFLAGS=$CFLAGS
+ lt_save_LD=$LD
+ lt_save_GCC=$GCC
+ GCC=$GXX
+ lt_save_with_gnu_ld=$with_gnu_ld
+ lt_save_path_LD=$lt_cv_path_LD
+ if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+ else
+ $as_unset lt_cv_prog_gnu_ld
+ fi
+ if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+ else
+ $as_unset lt_cv_path_LD
+ fi
+ test -z "${LDCXX+set}" || LD=$LDCXX
+ CC=${CXX-"c++"}
+ CFLAGS=$CXXFLAGS
+ compiler=$CC
+ compiler_CXX=$CC
+ func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+ if test -n "$compiler"; then
+ # We don't want -fno-exception when compiling C++ code, so set the
+ # no_builtin_flag separately
+ if test yes = "$GXX"; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+ else
+ lt_prog_compiler_no_builtin_flag_CXX=
+ fi
+
+ if test yes = "$GXX"; then
+ # Set up default GNU C++ configuration
+
+
+
+@%:@ Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test yes = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='$wl'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+ $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec_CXX=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+ fi
+
+ # PORTME: fill in a description of your system's C++ link characteristics
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ ld_shlibs_CXX=yes
+ case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_CXX=''
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ file_list_spec_CXX='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct_CXX=no
+ hardcode_direct_absolute_CXX=no
+ ;;
+ esac
+
+ if test yes = "$GXX"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct_CXX=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_CXX=yes
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_libdir_separator_CXX=
+ fi
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag=$shared_flag' $wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec_CXX='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to
+ # export.
+ always_export_symbols_CXX=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ # The "-G" linker flag allows undefined symbols.
+ no_undefined_flag_CXX='-bernotok'
+ # Determine the default libpath from the value encoded in an empty
+ # executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+
+ archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_CXX="-z nodefs"
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_CXX=' $wl-bernotok'
+ allow_undefined_flag_CXX=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ fi
+ archive_cmds_need_lc_CXX=yes
+ archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared
+ # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_CXX=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $GXX,$cc_basename in
+ ,cl* | no,cl* | ,icl* | no,icl*)
+ # Native MSVC or ICC
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX=' '
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=yes
+ file_list_spec_CXX='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+ enable_shared_with_static_runtimes_CXX=yes
+ # Don't use ranlib
+ old_postinstall_cmds_CXX='chmod 644 $oldlib'
+ postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # g++
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=no
+ enable_shared_with_static_runtimes_CXX=yes
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec_CXX=''
+ fi
+ link_all_deplibs_CXX=yes
+ allow_undefined_flag_CXX=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ if test yes != "$lt_cv_apple_cc_single_mod"; then
+ archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+ fi
+
+ else
+ ld_shlibs_CXX=no
+ fi
+
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_minus_L_CXX=yes
+ allow_undefined_flag_CXX=unsupported
+ shrext_cmds=.dll
+ archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes_CXX=yes
+ file_list_spec_CXX='@'
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ freebsd2.*)
+ # C++ shared libraries reported to be fairly broken before
+ # switch to ELF
+ ld_shlibs_CXX=no
+ ;;
+
+ freebsd-elf*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+
+ haiku*)
+ archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs_CXX=yes
+ ;;
+
+ hpux9*)
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='$wl-E'
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ hpux10*|hpux11*)
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ export_dynamic_flag_spec_CXX='$wl-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ ;;
+ *)
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+ fi
+ fi
+ link_all_deplibs_CXX=yes
+ ;;
+ esac
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ inherit_rpath_CXX=yes
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc* | ecpc* )
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ case `$CC -V` in
+ *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+ prelink_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+ old_archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+ $RANLIB $oldlib'
+ archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 6 and above use weak symbols
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+ ;;
+ xl* | mpixl* | bgxl*)
+ # IBM XL 8.0 on PPC, with GNU ld
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object_CXX=yes
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ m88k*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+
+ *nto* | *qnx*)
+ ld_shlibs_CXX=yes
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ hardcode_direct_absolute_CXX=yes
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ fi
+ output_verbose_link_cmd=func_echo_all
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ case $host in
+ osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+ *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+ esac
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ case $host in
+ osf3*)
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ ;;
+ *)
+ allow_undefined_flag_CXX=' -expect_unresolved \*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+ $RM $lib.exp'
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ ;;
+ esac
+
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ case $host in
+ osf3*)
+ archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ psos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ archive_cmds_need_lc_CXX=yes
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_shlibpath_var_CXX=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ no_undefined_flag_CXX=' $wl-z ${wl}defs'
+ if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ else
+ # g++ 2.7 appears to require '-G' NOT '-shared' on this
+ # platform.
+ archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_CXX='$wl-z,text'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_CXX='$wl-z,text'
+ allow_undefined_flag_CXX='$wl-z,nodefs'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ export_dynamic_flag_spec_CXX='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+ '"$old_archive_cmds_CXX"
+ reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+ '"$reload_cmds_CXX"
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+ test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+ GCC_CXX=$GXX
+ LD_CXX=$LD
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ for p in `eval "$output_verbose_link_cmd"`; do
+ case $prev$p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test x-L = "$p" ||
+ test x-R = "$p"; then
+ prev=$p
+ continue
+ fi
+
+ # Expand the sysroot to ease extracting the directories later.
+ if test -z "$prev"; then
+ case $p in
+ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+ esac
+ fi
+ case $p in
+ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+ esac
+ if test no = "$pre_test_object_deps_done"; then
+ case $prev in
+ -L | -R)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_path_CXX=$prev$p
+ else
+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$postdeps_CXX"; then
+ postdeps_CXX=$prev$p
+ else
+ postdeps_CXX="${postdeps_CXX} $prev$p"
+ fi
+ fi
+ prev=
+ ;;
+
+ *.lto.$objext) ;; # Ignore GCC LTO objects
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test no = "$pre_test_object_deps_done"; then
+ if test -z "$predep_objects_CXX"; then
+ predep_objects_CXX=$p
+ else
+ predep_objects_CXX="$predep_objects_CXX $p"
+ fi
+ else
+ if test -z "$postdep_objects_CXX"; then
+ postdep_objects_CXX=$p
+ else
+ postdep_objects_CXX="$postdep_objects_CXX $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ predep_objects_CXX=
+ postdep_objects_CXX=
+ postdeps_CXX=
+ ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test yes = "$GXX"; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static_CXX='$wl-static'
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static_CXX=
+ ;;
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[4-9]*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ if test ia64 != "$host_cpu"; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ ecpc* )
+ # old Intel C++ for x86_64, which still supported -KPIC.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ icpc* )
+ # Intel C++, used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fpic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-qpic'
+ lt_prog_compiler_static_CXX='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works_CXX=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ case $host_os in
+ aix[4-9]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ export_symbols_cmds_CXX=$ltdll_cmds
+ ;;
+ cygwin* | mingw* | cegcc*)
+ case $cc_basename in
+ cl* | icl*)
+ exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+ ;;
+ esac
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_CXX=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds_CXX in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_CXX
+ pic_flag=$lt_prog_compiler_pic_CXX
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+ allow_undefined_flag_CXX=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc_CXX=no
+ else
+ lt_cv_archive_cmds_need_lc_CXX=yes
+ fi
+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+ archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+ test -n "$runpath_var_CXX" ||
+ test yes = "$hardcode_automatic_CXX"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct_CXX" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+ test no != "$hardcode_minus_L_CXX"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_CXX=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_CXX=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_CXX=unsupported
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+printf "%s\n" "$hardcode_action_CXX" >&6; }
+
+if test relink = "$hardcode_action_CXX" ||
+ test yes = "$inherit_rpath_CXX"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+ fi # test -n "$compiler"
+
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+ LDCXX=$LD
+ LD=$lt_save_LD
+ GCC=$lt_save_GCC
+ with_gnu_ld=$lt_save_with_gnu_ld
+ lt_cv_path_LDCXX=$lt_cv_path_LD
+ lt_cv_path_LD=$lt_save_path_LD
+ lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+# Only the shared libraries are produced by default, use "--enable-static"
+# option to override it.
+
+# Special CFLAGS to use when building
+gc_cflags=""
+
+# Set to "yes" on platforms where mmap should be used instead of sbrk.
+# This will define USE_MMAP.
+gc_use_mmap=""
+
+# We should set -fexceptions if we are using gcc and might be used
+# inside something like gcj. This is the zeroth approximation:
+if test :"$GCC": = :yes: ; then
+ gc_cflags="${gc_cflags} -fexceptions"
+else
+ case "$host" in
+ hppa*-*-hpux* )
+ if test :$GCC: != :"yes": ; then
+ gc_cflags="${gc_cflags} +ESdbgasm"
+ fi
+ # :TODO: actually we should check using Autoconf if
+ # the compiler supports this option.
+ ;;
+ esac
+fi
+
+# target_optspace --enable-target-optspace ("yes", "no", "")
+case "${target_optspace}:${host}" in
+ yes:*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ :m32r-* | :d10v-* | :d30v-*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ no:* | :*)
+ # Nothing.
+ ;;
+esac
+
+# Set any host dependent compiler flags.
+case "${host}" in
+ mips-tx39-*|mipstx39-unknown-*)
+ gc_cflags="${gc_cflags} -G 0"
+ ;;
+ *)
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for emscripten" >&5
+printf %s "checking for emscripten... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# ifndef __EMSCRIPTEN__
+# error This is not Emscripten
+# endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ emscripten=yes
+else $as_nop
+ emscripten=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test x$emscripten = xyes; then
+ EMSCRIPTEN_TRUE=
+ EMSCRIPTEN_FALSE='#'
+else
+ EMSCRIPTEN_TRUE='#'
+ EMSCRIPTEN_FALSE=
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $emscripten" >&5
+printf "%s\n" "$emscripten" >&6; }
+
+@%:@ Check whether --enable-emscripten-asyncify was given.
+if test ${enable_emscripten_asyncify+y}
+then :
+ enableval=$enable_emscripten_asyncify;
+fi
+
+# Use this option if your program is targeting -sASYNCIFY. The latter is
+# required to scan the stack, ASYNCIFY_STACK_SIZE is probably needed for
+# gctest only.
+if test "${emscripten}" = yes -a "${enable_emscripten_asyncify}" = yes
+then :
+ gc_cflags="${gc_cflags} -DEMSCRIPTEN_ASYNCIFY"
+ gc_cflags="${gc_cflags} -sASYNCIFY -sASYNCIFY_STACK_SIZE=128000"
+fi
+
+GC_CFLAGS=${gc_cflags}
+
+
+
+
+@%:@ Check whether --enable-threads was given.
+if test ${enable_threads+y}
+then :
+ enableval=$enable_threads; THREADS=$enableval
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thread model used by GCC" >&5
+printf %s "checking for thread model used by GCC... " >&6; }
+ THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
+ if test -z "$THREADS" -o "x$emscripten" = "xyes"; then
+ THREADS=no
+ fi
+ if test "$THREADS" = "posix"; then
+ case "$host" in
+ *-*-mingw*)
+ # Adjust thread model if cross-compiling for MinGW.
+ THREADS=win32
+ ;;
+ esac
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $THREADS" >&5
+printf "%s\n" "$THREADS" >&6; }
+fi
+
+
+@%:@ Check whether --enable-parallel-mark was given.
+if test ${enable_parallel_mark+y}
+then :
+ enableval=$enable_parallel_mark; case "$THREADS" in
+ no | none | single)
+ if test "${enable_parallel_mark}" != no; then
+ as_fn_error $? "Parallel mark requires --enable-threads=x spec" "$LINENO" 5
+ fi
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-thread-local-alloc was given.
+if test ${enable_thread_local_alloc+y}
+then :
+ enableval=$enable_thread_local_alloc; case "$THREADS" in
+ no | none | single)
+ if test "${enable_thread_local_alloc}" = yes; then
+ as_fn_error $? "Thread-local allocation requires --enable-threads=x spec" "$LINENO" 5
+ fi
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-threads-discovery was given.
+if test ${enable_threads_discovery+y}
+then :
+ enableval=$enable_threads_discovery;
+fi
+
+if test "${enable_threads_discovery}" = no; then
+
+printf "%s\n" "@%:@define GC_NO_THREADS_DISCOVERY 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-cplusplus was given.
+if test ${enable_cplusplus+y}
+then :
+ enableval=$enable_cplusplus;
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+CFLAGS="$old_CFLAGS"
+
+THREADDLLIBS=
+need_atomic_ops_asm=false
+need_lib_rt=false
+compile_asm=false
+use_parallel_mark=no
+use_thread_local_alloc=no
+# Libraries needed to support dynamic loading and/or threads.
+case "$THREADS" in
+ no | none | single)
+ THREADS=none
+ ;;
+ posix | pthreads)
+ THREADS=posix
+ default_threadlibs=false
+ # Common defines for most POSIX platforms.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-dragonfly* | \
+ *-*-freebsd* | *-*-haiku* | *-*-hpux11* | *-*-irix* | \
+ *-*-kfreebsd*-gnu | *-*-gnu* | *-*-*linux* | *-*-msys* | *-*-nacl* | \
+ *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define _REENTRANT 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ default_threadlibs=true
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&2;}
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5
+printf %s "checking for pthread_self in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char pthread_self ();
+int
+main (void)
+{
+return pthread_self ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_self=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_self=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_self" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_self" = xyes
+then :
+ THREADDLLIBS="-lpthread"
+fi
+
+ case "$host" in
+ *-*-hpux11*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Only HP/UX 11 POSIX threads are supported.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Only HP/UX 11 POSIX threads are supported.\"" >&2;}
+ printf "%s\n" "@%:@define _POSIX_C_SOURCE 199506L" >>confdefs.h
+
+ THREADDLLIBS="-lpthread"
+ # HPUX needs REENTRANT for the _r calls.
+ need_lib_rt=true
+ ;;
+ *-*-openbsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-freebsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ ;;
+ *-*-kfreebsd*-gnu)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-gnu*) # E.g. linux but excluding kfreebsd.
+ # The default THREADDLLIBS.
+ ;;
+ *-*-netbsd*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Only on NetBSD 2.0 or later.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Only on NetBSD 2.0 or later.\"" >&2;}
+ printf "%s\n" "@%:@define _PTHREADS 1" >>confdefs.h
+
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-solaris*)
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-cygwin* | *-*-msys*)
+ # Cygwin doesn't have a real libpthread, so Libtool can't link
+ # against it.
+ THREADDLLIBS=""
+ win32_threads=true
+ ;;
+ *-*-mingw*)
+ printf "%s\n" "@%:@define GC_WIN32_PTHREADS 1" >>confdefs.h
+
+ # Using pthreads-win32 (or other non-Cygwin pthreads) library.
+ THREADDLLIBS="-lpthread"
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ win32_threads=true
+ ;;
+ *-*-darwin*)
+ darwin_threads=true
+ ;;
+ *-*-osf*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *)
+ if test x$default_threadlibs != xtrue
+then :
+ as_fn_error $? "Pthreads not supported by the GC on this platform" "$LINENO" 5
+fi
+ # The default THREADDLLIBS.
+ ;;
+ esac
+ case "$host" in
+ sparc*-*-solaris*)
+ if test "$GCC" != yes; then
+ need_atomic_ops_asm=true
+ fi
+ ;;
+ esac
+ ;;
+ mcf | win32)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ if test "${enable_parallel_mark}" != no \
+ -o "${enable_shared}" != yes -o "${enable_static}" != no; then
+ # Imply THREAD_LOCAL_ALLOC unless GC_DLL.
+ use_thread_local_alloc=$enable_thread_local_alloc
+ fi
+ if test "${enable_win32_dllmain}" = yes; then
+
+printf "%s\n" "@%:@define GC_INSIDE_DLL 1" >>confdefs.h
+
+ fi
+ win32_threads=true
+
+printf "%s\n" "@%:@define EMPTY_GETENV_RESULTS 1" >>confdefs.h
+
+ ;;
+ dgux386)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ # Use pthread GCC switch
+ THREADDLLIBS=-pthread
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&2;}
+ AM_CFLAGS="-pthread $AM_CFLAGS"
+ ;;
+ aix)
+ THREADS=posix
+ THREADDLLIBS=-lpthread
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ printf "%s\n" "@%:@define _REENTRANT 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ rtems)
+ THREADS=posix
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ decosf1 | irix | mach | os2 | solaris | dce | vxworks)
+ as_fn_error $? "thread package $THREADS not yet supported" "$LINENO" 5
+ ;;
+ *)
+ as_fn_error $? "$THREADS is an unknown thread package" "$LINENO" 5
+ ;;
+esac
+
+# Check whether -lrt linker option is needed to use clock_gettime.
+if test "x$need_lib_rt" != xtrue; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime without additional libraries" >&5
+printf %s "checking for clock_gettime without additional libraries... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <time.h>
+int
+main (void)
+{
+struct timespec t; clock_gettime(CLOCK_REALTIME, &t)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
+printf %s "checking for clock_gettime in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_clock_gettime+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char clock_gettime ();
+int
+main (void)
+{
+return clock_gettime ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_rt_clock_gettime=yes
+else $as_nop
+ ac_cv_lib_rt_clock_gettime=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5
+printf "%s\n" "$ac_cv_lib_rt_clock_gettime" >&6; }
+if test "x$ac_cv_lib_rt_clock_gettime" = xyes
+then :
+ need_lib_rt=true
+fi
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+if test "x$need_lib_rt" = xtrue; then
+ THREADDLLIBS="$THREADDLLIBS -lrt"
+fi
+
+
+ if test x$THREADS != xnone; then
+ THREADS_TRUE=
+ THREADS_FALSE='#'
+else
+ THREADS_TRUE='#'
+ THREADS_FALSE=
+fi
+
+ if test x$THREADS = xposix; then
+ PTHREADS_TRUE=
+ PTHREADS_FALSE='#'
+else
+ PTHREADS_TRUE='#'
+ PTHREADS_FALSE=
+fi
+
+ if test x$darwin_threads = xtrue; then
+ DARWIN_THREADS_TRUE=
+ DARWIN_THREADS_FALSE='#'
+else
+ DARWIN_THREADS_TRUE='#'
+ DARWIN_THREADS_FALSE=
+fi
+
+ if test x$win32_threads = xtrue; then
+ WIN32_THREADS_TRUE=
+ WIN32_THREADS_FALSE='#'
+else
+ WIN32_THREADS_TRUE='#'
+ WIN32_THREADS_FALSE=
+fi
+
+
+compiler_suncc=no
+pthread_start_standalone=no
+case "$host" in
+ *-*-*linux*)
+ # Turn on the workaround described in pthread_start.c.
+ if test "$THREADS" = posix
+then :
+ pthread_start_standalone=yes
+fi
+ ;;
+ powerpc-*-darwin*)
+ powerpc_darwin=true
+ ;;
+ *-*-solaris*)
+ if test "$GCC" != yes; then
+ # Solaris SunCC
+ compiler_suncc=yes
+ CFLAGS="-O $CFLAGS"
+ fi
+ ;;
+ *-*-wince*)
+ if test "$enable_gc_debug" != "no"; then
+
+printf "%s\n" "@%:@define GC_READ_ENV_FILE 1" >>confdefs.h
+
+ fi
+ ;;
+esac
+ if test x$pthread_start_standalone = xyes; then
+ PTHREAD_START_STANDALONE_TRUE=
+ PTHREAD_START_STANDALONE_FALSE='#'
+else
+ PTHREAD_START_STANDALONE_TRUE='#'
+ PTHREAD_START_STANDALONE_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ # Output all warnings.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wextra" >&5
+printf %s "checking whether compiler supports -Wextra... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Wextra $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_cc_wextra=yes
+else $as_nop
+ ac_cv_cc_wextra=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_wextra" >&5
+printf "%s\n" "$ac_cv_cc_wextra" >&6; }
+ if test "$ac_cv_cc_wextra" = yes
+then :
+ WEXTRA="-Wextra"
+else $as_nop
+ WEXTRA="-W"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wpedantic" >&5
+printf %s "checking whether compiler supports -Wpedantic... " >&6; }
+ CFLAGS="-Wpedantic -Wno-long-long $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ extern int quiet;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_cc_pedantic=yes
+else $as_nop
+ ac_cv_cc_pedantic=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_pedantic" >&5
+printf "%s\n" "$ac_cv_cc_pedantic" >&6; }
+ WPEDANTIC=
+ if test "$ac_cv_cc_pedantic" = yes
+then :
+ WPEDANTIC="-Wpedantic -Wno-long-long"
+fi
+ CFLAGS="-Wall $WEXTRA $WPEDANTIC $CFLAGS"
+ CXXFLAGS="-Wall $WEXTRA $WPEDANTIC $CXXFLAGS"
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xlc" >&5
+printf %s "checking for xlc... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ #ifndef __xlC__
+ # error
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ compiler_xlc=yes
+else $as_nop
+ compiler_xlc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $compiler_xlc" >&5
+printf "%s\n" "$compiler_xlc" >&6; }
+if test $compiler_xlc = yes -a "$powerpc_darwin" = true; then
+ # the darwin stack-frame-walking code is completely broken on xlc
+
+printf "%s\n" "@%:@define DARWIN_DONT_PARSE_STACK 1" >>confdefs.h
+
+fi
+
+# XLC neither requires nor tolerates the unnecessary assembler goop.
+# Similar for the Sun C compiler.
+ if test $compiler_xlc = yes -o $compiler_suncc = yes; then
+ ASM_WITH_CPP_UNSUPPORTED_TRUE=
+ ASM_WITH_CPP_UNSUPPORTED_FALSE='#'
+else
+ ASM_WITH_CPP_UNSUPPORTED_TRUE='#'
+ ASM_WITH_CPP_UNSUPPORTED_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ # Disable aliasing optimization unless forced to.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fno-strict-aliasing" >&5
+printf %s "checking whether compiler supports -fno-strict-aliasing... " >&6; }
+ ac_cv_fno_strict_aliasing=no
+ for cflag in $CFLAGS; do
+ case "$cflag" in
+ -fstrict-aliasing)
+ # Opposite option already present
+ ac_cv_fno_strict_aliasing=skipped
+ break
+ ;;
+ esac
+ done
+ if test "$ac_cv_fno_strict_aliasing" != skipped; then
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_fno_strict_aliasing=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_fno_strict_aliasing" = yes
+then :
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+fi
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fno_strict_aliasing" >&5
+printf "%s\n" "$ac_cv_fno_strict_aliasing" >&6; }
+fi
+
+# Check for getcontext (uClibc can be configured without it, for example)
+ac_fn_c_check_func "$LINENO" "getcontext" "ac_cv_func_getcontext"
+if test "x$ac_cv_func_getcontext" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "@%:@define NO_GETCONTEXT 1" >>confdefs.h
+
+fi
+
+
+# Check whether dl_iterate_phdr exists (as a strong symbol).
+ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr"
+if test "x$ac_cv_func_dl_iterate_phdr" = xyes
+then :
+ printf "%s\n" "@%:@define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h
+
+fi
+
+
+case "$host" in
+# While IRIX 6 has libdl for the O32 and N32 ABIs, it's missing for N64
+# and unnecessary everywhere.
+ mips-sgi-irix6*) ;;
+# We never want libdl on darwin. It is a fake libdl that just ends up making
+# dyld calls anyway. The same applies to Cygwin.
+ *-*-cygwin* | *-*-darwin* | *-*-msys*)
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ THREADDLLIBS="$THREADDLLIBS -ldl"
+fi
+
+ ;;
+esac
+
+case "$host" in
+ *-*-hpux*)
+ avoid_cpp_lib=yes;;
+ *)
+ avoid_cpp_lib=no;
+ ;;
+esac
+ if test $avoid_cpp_lib = yes; then
+ AVOID_CPP_LIB_TRUE=
+ AVOID_CPP_LIB_FALSE='#'
+else
+ AVOID_CPP_LIB_TRUE='#'
+ AVOID_CPP_LIB_FALSE=
+fi
+
+
+# Check for various headers.
+ac_fn_c_check_header_compile "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default"
+if test "x$ac_cv_header_execinfo_h" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "@%:@define GC_MISSING_EXECINFO_H 1" >>confdefs.h
+
+fi
+
+
+# extra LD Flags which are required for targets
+case "${host}" in
+ *-*-darwin*)
+ extra_ldflags_libgc=-Wl,-single_module
+ ;;
+esac
+
+
+
+
+target_all=libgc.la
+
+
+TARGET_ECOS="no"
+
+@%:@ Check whether --with-ecos was given.
+if test ${with_ecos+y}
+then :
+ withval=$with_ecos; TARGET_ECOS="$with_ecos"
+
+fi
+
+
+addobjs=
+addlibs=
+CXXLIBS=
+
+case "$TARGET_ECOS" in
+ no)
+ ;;
+ *)
+
+printf "%s\n" "@%:@define ECOS 1" >>confdefs.h
+
+ AM_CPPFLAGS="-I${TARGET_ECOS}/include $AM_CPPFLAGS"
+ addobjs="$addobjs ecos.lo"
+ ;;
+esac
+
+ if test "${enable_cplusplus}" = yes; then
+ CPLUSPLUS_TRUE=
+ CPLUSPLUS_FALSE='#'
+else
+ CPLUSPLUS_TRUE='#'
+ CPLUSPLUS_FALSE=
+fi
+
+
+@%:@ Check whether --enable-throw-bad-alloc-library was given.
+if test ${enable_throw_bad_alloc_library+y}
+then :
+ enableval=$enable_throw_bad_alloc_library;
+fi
+
+ if test "${enable_cplusplus}" = yes \
+ -a "${enable_throw_bad_alloc_library}" != no; then
+ GC_TBA_LIBRARY_TRUE=
+ GC_TBA_LIBRARY_FALSE='#'
+else
+ GC_TBA_LIBRARY_TRUE='#'
+ GC_TBA_LIBRARY_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ if test "${enable_cplusplus}" = yes; then
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libsupc++ required" >&5
+printf %s "checking whether libsupc++ required... " >&6; }
+ SUPC="`$CXX -print-file-name=libsupc++.a 2>/dev/null`"
+ if test -n "$SUPC" -a "$SUPC" != "libsupc++.a"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ CXXLIBS="-lsupc++"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ esac
+ fi
+fi
+
+
+
+
+
+
+# Configuration of shared libraries
+#
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+@%:@ Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+case "$host" in
+ alpha-*-openbsd*)
+ enable_shared=no
+ ;;
+ *)
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+# Compile with GC_DLL defined unless building static libraries.
+if test "${enable_shared}" != no -a "${enable_static}" != yes; then
+ printf "%s\n" "@%:@define GC_DLL 1" >>confdefs.h
+
+ if test "$GCC" = yes; then
+ # Pass -fvisibility=hidden option if supported
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fvisibility" >&5
+printf %s "checking whether compiler supports -fvisibility... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Werror -fvisibility=hidden $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_fvisibility_hidden=yes
+else $as_nop
+ ac_cv_fvisibility_hidden=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_fvisibility_hidden" = yes
+then :
+ CFLAGS="-DGC_VISIBILITY_HIDDEN_SET -fvisibility=hidden $CFLAGS"
+else $as_nop
+ CFLAGS="-DGC_NO_VISIBILITY $CFLAGS"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fvisibility_hidden" >&5
+printf "%s\n" "$ac_cv_fvisibility_hidden" >&6; }
+ fi
+else
+
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ # Do not require the clients to link with "user32" system library.
+
+printf "%s\n" "@%:@define DONT_USE_USER32_DLL 1" >>confdefs.h
+
+ # Use inline version of GC new and delete operators in test_cpp
+ # otherwise the system ones might be used instead because of arbitrary
+ # ordering of object files when linking.
+ CXXFLAGS="$CXXFLAGS -DGC_NOT_DLL"
+ ;;
+ esac
+fi
+
+# Configuration of machine-dependent code
+#
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which machine-dependent code should be used" >&5
+printf %s "checking which machine-dependent code should be used... " >&6; }
+machdep=
+case "$host" in
+ alpha-*-openbsd*)
+ if test x"${ac_cv_lib_dl_dlopen}" != xyes ; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"OpenBSD/Alpha without dlopen(). Shared library support is disabled.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"OpenBSD/Alpha without dlopen(). Shared library support is disabled.\"" >&2;}
+ fi
+ ;;
+ i?86-*-solaris2.[89])
+ # PROC_VDB appears to work in 2.8 and 2.9 but not in 2.10+ (for now).
+
+printf "%s\n" "@%:@define SOLARIS25_PROC_VDB_BUG_FIXED 1" >>confdefs.h
+
+ ;;
+ sparc-*-netbsd*)
+ machdep="sparc_netbsd_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc*-*-linux* | sparc*-*-openbsd* | sparc64-*-freebsd* | sparc64-*-netbsd*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc-sun-solaris2.3)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+
+printf "%s\n" "@%:@define SUNOS53_SHARED_LIB 1" >>confdefs.h
+
+ ;;
+ sparc*-sun-solaris2*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ ia64-*-*)
+ machdep="ia64_save_regs_in_stack.lo"
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $machdep" >&5
+printf "%s\n" "$machdep" >&6; }
+addobjs="$addobjs $machdep"
+
+
+
+
+
+# Suppress "extension used" clang warning (when compiling .S files).
+if test x$compile_asm = xtrue -a "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-language-extension-token" >&5
+printf %s "checking whether compiler supports -Wno-language-extension-token... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-language-extension-token"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_lang_ext_token=yes
+else $as_nop
+ ac_cv_lang_ext_token=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_lang_ext_token" = yes
+then :
+ CFLAGS="$CFLAGS -Wno-language-extension-token"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lang_ext_token" >&5
+printf "%s\n" "$ac_cv_lang_ext_token" >&6; }
+fi
+
+
+@%:@ Check whether --with-target-subdir was given.
+if test ${with_target_subdir+y}
+then :
+ withval=$with_target_subdir;
+fi
+
+
+@%:@ Check whether --with-cross-host was given.
+if test ${with_cross_host+y}
+then :
+ withval=$with_cross_host;
+fi
+
+
+if false; then
+ :
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether AIX gcc optimization fix is necessary" >&5
+printf %s "checking whether AIX gcc optimization fix is necessary... " >&6; }
+case "$host" in
+ *aix*)
+ if test "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ new_CFLAGS=
+ for i in $CFLAGS; do
+ case "$i" in
+ -O*)
+ ;;
+ *)
+ new_CFLAGS="$new_CFLAGS $i"
+ ;;
+ esac
+ done
+ CFLAGS="$new_CFLAGS"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
+
+
+printf "%s\n" "@%:@define NO_EXECUTE_PERMISSION 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define ALL_INTERIOR_POINTERS 1" >>confdefs.h
+
+
+
+@%:@ Check whether --enable-gcj-support was given.
+if test ${enable_gcj_support+y}
+then :
+ enableval=$enable_gcj_support;
+fi
+
+if test x"$enable_gcj_support" != xno; then
+
+printf "%s\n" "@%:@define GC_GCJ_SUPPORT 1" >>confdefs.h
+
+ case "$host" in
+ *-*-kfreebsd*-gnu)
+ # FIXME: For a reason, gctest hangs up on kFreeBSD if both of
+ # THREAD_LOCAL_ALLOC and GC_ENABLE_SUSPEND_THREAD are defined.
+ if test "${enable_thread_local_alloc}" = no; then
+ printf "%s\n" "@%:@define GC_ENABLE_SUSPEND_THREAD 1" >>confdefs.h
+
+ fi
+ ;;
+ *)
+
+printf "%s\n" "@%:@define GC_ENABLE_SUSPEND_THREAD 1" >>confdefs.h
+
+ ;;
+ esac
+fi
+ if test x"enable_gcj_support" != xno; then
+ ENABLE_GCJ_SUPPORT_TRUE=
+ ENABLE_GCJ_SUPPORT_FALSE='#'
+else
+ ENABLE_GCJ_SUPPORT_TRUE='#'
+ ENABLE_GCJ_SUPPORT_FALSE=
+fi
+
+
+@%:@ Check whether --enable-sigrt-signals was given.
+if test ${enable_sigrt_signals+y}
+then :
+ enableval=$enable_sigrt_signals;
+fi
+
+if test x"${enable_sigrt_signals}" = xyes; then
+
+printf "%s\n" "@%:@define GC_USESIGRT_SIGNALS 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+UNWINDLIBS=
+@%:@ Check whether --enable-gc-debug was given.
+if test ${enable_gc_debug+y}
+then :
+ enableval=$enable_gc_debug; if test "$enable_gc_debug" = "yes"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Should define GC_DEBUG and use debug alloc in clients.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Should define GC_DEBUG and use debug alloc in clients.\"" >&2;}
+
+printf "%s\n" "@%:@define KEEP_BACK_PTRS 1" >>confdefs.h
+
+ keep_back_ptrs=true
+
+printf "%s\n" "@%:@define DBG_HDRS_ALL 1" >>confdefs.h
+
+
+
+ case $host in
+ ia64-*-linux* )
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ printf "%s\n" "@%:@define SAVE_CALL_COUNT 8" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for backtrace in -lunwind" >&5
+printf %s "checking for backtrace in -lunwind... " >&6; }
+if test ${ac_cv_lib_unwind_backtrace+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lunwind $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char backtrace ();
+int
+main (void)
+{
+return backtrace ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_unwind_backtrace=yes
+else $as_nop
+ ac_cv_lib_unwind_backtrace=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_unwind_backtrace" >&5
+printf "%s\n" "$ac_cv_lib_unwind_backtrace" >&6; }
+if test "x$ac_cv_lib_unwind_backtrace" = xyes
+then :
+
+ printf "%s\n" "@%:@define GC_HAVE_BUILTIN_BACKTRACE 1" >>confdefs.h
+
+ UNWINDLIBS=-lunwind
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Client code may need to link against libunwind.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Client code may need to link against libunwind.\"" >&2;}
+
+fi
+
+ ;;
+ x86-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&2;}
+ printf "%s\n" "@%:@define SAVE_CALL_COUNT 8" >>confdefs.h
+
+ ;;
+ i345686-*-dgux*)
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+fi
+
+ if test x"$enable_gc_debug" = xyes; then
+ MAKE_BACK_GRAPH_TRUE=
+ MAKE_BACK_GRAPH_FALSE='#'
+else
+ MAKE_BACK_GRAPH_TRUE='#'
+ MAKE_BACK_GRAPH_FALSE=
+fi
+
+ if test x"$keep_back_ptrs" = xtrue; then
+ KEEP_BACK_PTRS_TRUE=
+ KEEP_BACK_PTRS_FALSE='#'
+else
+ KEEP_BACK_PTRS_TRUE='#'
+ KEEP_BACK_PTRS_FALSE=
+fi
+
+
+# Check whether a compiler warning of unsafe __builtin_return_address(1)
+# could be suppressed by -Wno-frame-address option.
+# __builtin_return_address(1) is used by libgc for debugging purposes only.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -Wno-frame-address works" >&5
+printf %s "checking whether -Wno-frame-address works... " >&6; }
+use_wno_error_frame_address=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Werror -Wno-frame-address $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+{
+ if (!__builtin_return_address(1)) return 1;
+}
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ use_wno_error_frame_address=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $use_wno_error_frame_address" >&5
+printf "%s\n" "$use_wno_error_frame_address" >&6; }
+if test x"$use_wno_error_frame_address" = xyes; then
+ CFLAGS="$CFLAGS -Wno-frame-address"
+fi
+
+# Check for dladdr (used for debugging).
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dladdr" >&5
+printf %s "checking for dladdr... " >&6; }
+have_dladdr=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _GNU_SOURCE 1
+#include <dlfcn.h>
+int
+main (void)
+{
+{
+ Dl_info info;
+ (void)dladdr("", &info);
+}
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ have_dladdr=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_dladdr" >&5
+printf "%s\n" "$have_dladdr" >&6; }
+if test x"$have_dladdr" = xyes; then
+
+printf "%s\n" "@%:@define HAVE_DLADDR 1" >>confdefs.h
+
+fi
+
+# sigsetjmp could be a macro (thus AC_CHECK_FUNCS cannot be used).
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sigsetjmp" >&5
+printf %s "checking for sigsetjmp... " >&6; }
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <setjmp.h>
+int
+main (void)
+{
+sigjmp_buf t; sigsetjmp(t, 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+printf "%s\n" "@%:@define GC_NO_SIGSETJMP 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+
+# pthread_setname_np, if available, may have 1, 2 or 3 arguments.
+if test "$THREADS" = posix
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_setname_np" >&5
+printf %s "checking for pthread_setname_np... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -Werror"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np("thread-name")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (w/o tid)" >&5
+printf "%s\n" "yes (w/o tid)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID 1" >>confdefs.h
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np(pthread_self(), "thread-name-%u", 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (with tid and arg)" >&5
+printf "%s\n" "yes (with tid and arg)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG 1" >>confdefs.h
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np(pthread_self(), "thread-name")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (with tid)" >&5
+printf "%s\n" "yes (with tid)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITH_TID 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for AViiON Machines running DGUX
+ac_is_dgux=no
+ac_fn_c_check_header_compile "$LINENO" "sys/dg_sys_info.h" "ac_cv_header_sys_dg_sys_info_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_dg_sys_info_h" = xyes
+then :
+ ac_is_dgux=yes;
+fi
+
+
+if test $ac_is_dgux = yes; then
+ dgux_spec_opts="-DDGUX -D_DGUX_SOURCE -Di386 -mno-legend -O2"
+ CFLAGS="$dgux_spec_opts $CFLAGS"
+ CXXFLAGS="$dgux_spec_opts $CXXFLAGS"
+ if test "$enable_gc_debug" = "yes"; then
+ CFLAGS="-g -mstandard $CFLAGS"
+ CXXFLAGS="-g -mstandard $CXXFLAGS"
+ fi
+
+
+fi
+
+@%:@ Check whether --enable-java-finalization was given.
+if test ${enable_java_finalization+y}
+then :
+ enableval=$enable_java_finalization;
+fi
+
+if test x"$enable_java_finalization" != xno; then
+
+printf "%s\n" "@%:@define JAVA_FINALIZATION 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-atomic-uncollectable was given.
+if test ${enable_atomic_uncollectable+y}
+then :
+ enableval=$enable_atomic_uncollectable;
+fi
+
+if test x"$enable_atomic_uncollectible" != x"no"; then
+
+printf "%s\n" "@%:@define GC_ATOMIC_UNCOLLECTABLE 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-redirect-malloc was given.
+if test ${enable_redirect_malloc+y}
+then :
+ enableval=$enable_redirect_malloc;
+fi
+
+
+if test "${enable_redirect_malloc}" = yes; then
+ if test "${enable_gc_debug}" = yes; then
+
+printf "%s\n" "@%:@define REDIRECT_MALLOC GC_debug_malloc_replacement" >>confdefs.h
+
+
+printf "%s\n" "@%:@define REDIRECT_REALLOC GC_debug_realloc_replacement" >>confdefs.h
+
+
+printf "%s\n" "@%:@define REDIRECT_FREE GC_debug_free" >>confdefs.h
+
+ else
+ printf "%s\n" "@%:@define REDIRECT_MALLOC GC_malloc" >>confdefs.h
+
+ fi
+
+printf "%s\n" "@%:@define GC_USE_DLOPEN_WRAP 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-disclaim was given.
+if test ${enable_disclaim+y}
+then :
+ enableval=$enable_disclaim;
+fi
+
+if test x"$enable_disclaim" != xno; then
+
+printf "%s\n" "@%:@define ENABLE_DISCLAIM 1" >>confdefs.h
+
+fi
+ if test x"$enable_disclaim" != xno; then
+ ENABLE_DISCLAIM_TRUE=
+ ENABLE_DISCLAIM_FALSE='#'
+else
+ ENABLE_DISCLAIM_TRUE='#'
+ ENABLE_DISCLAIM_FALSE=
+fi
+
+
+@%:@ Check whether --enable-large-config was given.
+if test ${enable_large_config+y}
+then :
+ enableval=$enable_large_config;
+fi
+
+if test "${enable_large_config}" = yes; then
+
+printf "%s\n" "@%:@define LARGE_CONFIG 1" >>confdefs.h
+
+fi
+
+if test -n "${with_cross_host}"; then
+
+printf "%s\n" "@%:@define NO_CLOCK 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define SMALL_CONFIG 1" >>confdefs.h
+
+fi
+
+if test "$enable_gc_debug" = "no"; then
+
+printf "%s\n" "@%:@define NO_DEBUGGING 1" >>confdefs.h
+
+fi
+
+
+
+@%:@ Check whether --enable-gc-assertions was given.
+if test ${enable_gc_assertions+y}
+then :
+ enableval=$enable_gc_assertions;
+fi
+
+if test "${enable_gc_assertions}" = yes; then
+
+printf "%s\n" "@%:@define GC_ASSERTIONS 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-mmap was given.
+if test ${enable_mmap+y}
+then :
+ enableval=$enable_mmap; gc_use_mmap=$enableval
+fi
+
+
+@%:@ Check whether --enable-munmap was given.
+if test ${enable_munmap+y}
+then :
+ enableval=$enable_munmap; MUNMAP_THRESHOLD=$enableval
+fi
+
+if test x$enable_munmap != xno; then
+
+printf "%s\n" "@%:@define USE_MMAP 1" >>confdefs.h
+
+
+
+printf "%s\n" "@%:@define USE_MUNMAP 1" >>confdefs.h
+
+ if test x$MUNMAP_THRESHOLD = x -o x$MUNMAP_THRESHOLD = xyes; then
+ MUNMAP_THRESHOLD=6
+ fi
+
+printf "%s\n" "@%:@define MUNMAP_THRESHOLD ${MUNMAP_THRESHOLD}" >>confdefs.h
+
+else
+ if test "${gc_use_mmap}" = "yes"; then
+
+printf "%s\n" "@%:@define USE_MMAP 1" >>confdefs.h
+
+ fi
+fi
+
+@%:@ Check whether --enable-dynamic-loading was given.
+if test ${enable_dynamic_loading+y}
+then :
+ enableval=$enable_dynamic_loading;
+fi
+
+if test "${enable_dynamic_loading}" = "no"; then
+
+printf "%s\n" "@%:@define IGNORE_DYNAMIC_LOADING 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-register-main-static-data was given.
+if test ${enable_register_main_static_data+y}
+then :
+ enableval=$enable_register_main_static_data;
+fi
+
+if test "${enable_register_main_static_data}" = "no"; then
+
+printf "%s\n" "@%:@define GC_DONT_REGISTER_MAIN_STATIC_DATA 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-checksums was given.
+if test ${enable_checksums+y}
+then :
+ enableval=$enable_checksums;
+fi
+
+if test x$enable_checksums = xyes; then
+ if test x$enable_munmap != xno -o x$THREADS != xnone; then
+ as_fn_error $? "CHECKSUMS not compatible with USE_MUNMAP or threads" "$LINENO" 5
+ fi
+
+printf "%s\n" "@%:@define CHECKSUMS 1" >>confdefs.h
+
+fi
+ if test x$enable_checksums = xyes; then
+ CHECKSUMS_TRUE=
+ CHECKSUMS_FALSE='#'
+else
+ CHECKSUMS_TRUE='#'
+ CHECKSUMS_FALSE=
+fi
+
+
+ if test -z "$with_cross_host"; then
+ USE_LIBDIR_TRUE=
+ USE_LIBDIR_FALSE='#'
+else
+ USE_LIBDIR_TRUE='#'
+ USE_LIBDIR_FALSE=
+fi
+
+
+@%:@ Check whether --enable-werror was given.
+if test ${enable_werror+y}
+then :
+ enableval=$enable_werror; werror_flag=$enableval
+else $as_nop
+ werror_flag=no
+fi
+
+if test x$werror_flag = xyes; then
+ WERROR_CFLAGS="-Werror"
+ case "$host" in
+ # _dyld_bind_fully_image_containing_address is deprecated in OS X 10.5+
+ *-*-darwin*)
+ WERROR_CFLAGS="$WERROR_CFLAGS -Wno-deprecated-declarations"
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-single-obj-compilation was given.
+if test ${enable_single_obj_compilation+y}
+then :
+ enableval=$enable_single_obj_compilation;
+else $as_nop
+ if test x"$enable_static" = xno
+then :
+ enable_single_obj_compilation=yes
+fi
+fi
+
+ if test x"$enable_single_obj_compilation" = xyes; then
+ SINGLE_GC_OBJ_TRUE=
+ SINGLE_GC_OBJ_FALSE='#'
+else
+ SINGLE_GC_OBJ_TRUE='#'
+ SINGLE_GC_OBJ_FALSE=
+fi
+
+
+@%:@ Check whether --enable-gcov was given.
+if test ${enable_gcov+y}
+then :
+ enableval=$enable_gcov;
+fi
+
+if test "$enable_gcov" = "yes"; then
+ CFLAGS="-D NTHREADS=20 $CFLAGS --coverage"
+ if test "${enable_shared}" = no; then
+ # FIXME: As of g++-4.8.4/x64, in case of shared library build, test_cpp
+ # linkage fails with "hidden symbol atexit is referenced by DSO" message.
+ CXXFLAGS="$CXXFLAGS --coverage"
+ fi
+ # Turn off optimization to get accurate line numbers.
+ CFLAGS=`echo "$CFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+ CXXFLAGS=`echo "$CXXFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+fi
+
+@%:@ Check whether --enable-docs was given.
+if test ${enable_docs+y}
+then :
+ enableval=$enable_docs;
+fi
+
+ if test x$enable_docs != xno; then
+ ENABLE_DOCS_TRUE=
+ ENABLE_DOCS_FALSE='#'
+else
+ ENABLE_DOCS_TRUE='#'
+ ENABLE_DOCS_FALSE=
+fi
+
+
+ if test x$enable_shared = xyes; then
+ ENABLE_SHARED_TRUE=
+ ENABLE_SHARED_FALSE='#'
+else
+ ENABLE_SHARED_TRUE='#'
+ ENABLE_SHARED_FALSE=
+fi
+
+
+# Atomic Ops
+# ----------
+
+# Do we want to use an external libatomic_ops? By default use it if it's
+# found.
+
+@%:@ Check whether --with-libatomic-ops was given.
+if test ${with_libatomic_ops+y}
+then :
+ withval=$with_libatomic_ops;
+else $as_nop
+ if test x"$THREADS" != xnone
+then :
+ with_libatomic_ops=check
+else $as_nop
+ with_libatomic_ops=none
+fi
+fi
+
+
+# Check whether compiler atomic intrinsics can be used.
+if test x"$with_libatomic_ops" = xcheck; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler intrinsics support" >&5
+printf %s "checking for compiler intrinsics support... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -DGC_BUILTIN_ATOMIC"
+ CFLAGS="$CFLAGS -I${srcdir}/include -I${srcdir}/tests"
+ if test "$cross_compiling" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: skipped because cross-compiling" >&5
+printf "%s\n" "skipped because cross-compiling" >&6; }
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "test_atomic_ops.c"
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ with_libatomic_ops=none
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for an external libatomic_ops if the above answer is "yes" or "check".
+# If not found, fail on "yes", and convert "check" to "no".
+# First, check that libatomic_ops usage is not disabled explicitly.
+missing_libatomic_ops=false
+if test x"$with_libatomic_ops" != xno -a x"$with_libatomic_ops" != xnone
+then :
+ missing_libatomic_ops=true
+fi
+
+
+if test x$missing_libatomic_ops = xtrue
+then :
+ ac_fn_c_check_header_compile "$LINENO" "atomic_ops.h" "ac_cv_header_atomic_ops_h" "$ac_includes_default"
+if test "x$ac_cv_header_atomic_ops_h" = xyes
+then :
+ missing_libatomic_ops=false
+fi
+
+fi
+if test x$missing_libatomic_ops = xtrue
+then :
+ if test x"$with_libatomic_ops" != xcheck
+then :
+ as_fn_error $? "An external libatomic_ops was not found" "$LINENO" 5
+fi
+ with_libatomic_ops=no
+fi
+
+# If we have neither an external or an internal version, offer a useful hint
+# and exit.
+if test x"$with_libatomic_ops" = xno \
+ -a ! -e "$srcdir/libatomic_ops/src/atomic_ops.h"
+then :
+ as_fn_error $? "libatomic_ops is required. You can either install it on
+ your system, or fetch and unpack a recent version into the
+ source directory and link or rename it to libatomic_ops." "$LINENO" 5
+fi
+
+# Finally, emit the definitions for bundled or external AO.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which libatomic_ops to use" >&5
+printf %s "checking which libatomic_ops to use... " >&6; }
+
+
+if test x"$with_libatomic_ops" != xno
+then :
+ if test x"$with_libatomic_ops" != xnone -a x"$THREADS" != xnone
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: external" >&5
+printf "%s\n" "external" >&6; }
+ ATOMIC_OPS_LIBS="-latomic_ops"
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+ if test x"$THREADS" != xnone
+then :
+
+printf "%s\n" "@%:@define GC_BUILTIN_ATOMIC 1" >>confdefs.h
+
+fi
+fi
+ AO_TRYLINK_CFLAGS=""
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: internal" >&5
+printf "%s\n" "internal" >&6; }
+ AO_TRYLINK_CFLAGS="-I${srcdir}/libatomic_ops/src"
+ ATOMIC_OPS_CFLAGS='-I$(top_builddir)/libatomic_ops/src -I$(top_srcdir)/libatomic_ops/src'
+ ATOMIC_OPS_LIBS=""
+
+ subdirs="$subdirs libatomic_ops"
+
+
+fi
+ if test x$with_libatomic_ops = xno -a x"$THREADS" != xnone; then
+ USE_INTERNAL_LIBATOMIC_OPS_TRUE=
+ USE_INTERNAL_LIBATOMIC_OPS_FALSE='#'
+else
+ USE_INTERNAL_LIBATOMIC_OPS_TRUE='#'
+ USE_INTERNAL_LIBATOMIC_OPS_FALSE=
+fi
+
+ if test x$with_libatomic_ops = xno -a x$need_atomic_ops_asm = xtrue; then
+ NEED_ATOMIC_OPS_ASM_TRUE=
+ NEED_ATOMIC_OPS_ASM_FALSE='#'
+else
+ NEED_ATOMIC_OPS_ASM_TRUE='#'
+ NEED_ATOMIC_OPS_ASM_FALSE=
+fi
+
+
+# Check whether particular AO primitives are emulated with locks.
+# The check below is based on the fact that linking with the libatomic_ops
+# binary file is not needed in case of absence of the emulation (except for
+# Solaris SPARC).
+if test x$with_libatomic_ops != xnone -a x$need_atomic_ops_asm != xtrue
+then :
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $AO_TRYLINK_CFLAGS $CFLAGS_EXTRA"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free AO_or primitive" >&5
+printf %s "checking for lock-free AO_or primitive... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;AO_or(&x,1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "@%:@define HAVE_LOCKFREE_AO_OR 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free AO load/store, test-and-set primitives" >&5
+printf %s "checking for lock-free AO load/store, test-and-set primitives... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;unsigned char c=0;AO_TS_t z=AO_TS_INITIALIZER;
+ (void)AO_test_and_set_acquire(&z);AO_CLEAR(&z);AO_compiler_barrier();
+ AO_store(&x,AO_load(&x)+1);AO_char_store(&c,AO_char_load(&c)+1);
+ AO_store_release(&x,AO_load_acquire(&x)+1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ use_thread_local_alloc=no
+
+printf "%s\n" "@%:@define BASE_ATOMIC_OPS_EMULATED 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test x$use_parallel_mark != xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free compare-and-swap and fetch-and-add primitives" >&5
+printf %s "checking for lock-free compare-and-swap and fetch-and-add primitives... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;(void)AO_fetch_and_add(&x,1);(void)AO_compare_and_swap(&x,1,2)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ use_parallel_mark=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ CFLAGS="$old_CFLAGS"
+fi
+
+if test x$use_parallel_mark != xno
+then :
+ printf "%s\n" "@%:@define PARALLEL_MARK 1" >>confdefs.h
+
+fi
+if test x$use_thread_local_alloc != xno
+then :
+ printf "%s\n" "@%:@define THREAD_LOCAL_ALLOC 1" >>confdefs.h
+
+fi
+ if test x$use_thread_local_alloc != xno; then
+ THREAD_LOCAL_ALLOC_TRUE=
+ THREAD_LOCAL_ALLOC_FALSE='#'
+else
+ THREAD_LOCAL_ALLOC_TRUE='#'
+ THREAD_LOCAL_ALLOC_FALSE=
+fi
+
+
+@%:@ Check whether --enable-handle-fork was given.
+if test ${enable_handle_fork+y}
+then :
+ enableval=$enable_handle_fork;
+fi
+
+if test "${enable_handle_fork}" = yes; then
+
+printf "%s\n" "@%:@define HANDLE_FORK 1" >>confdefs.h
+
+elif test "${enable_handle_fork}" = no; then
+
+printf "%s\n" "@%:@define NO_HANDLE_FORK 1" >>confdefs.h
+
+elif test "${enable_handle_fork}" != manual -a x$THREADS = xposix; then
+ # If the option is omitted, pthread_atfork handlers are installed
+ # by default for the targets where pthread_atfork is known to work.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-freebsd* | \
+ *-*-haiku* | *-*-hpux11* | *-*-irix* | *-*-kfreebsd*-gnu | \
+ *-*-*linux* | *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ printf "%s\n" "@%:@define HANDLE_FORK 1" >>confdefs.h
+
+ ;;
+ esac
+fi
+
+
+ac_config_files="$ac_config_files Makefile bdw-gc.pc"
+
+
+ac_config_commands="$ac_config_commands default"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIB@&t@OBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${EMSCRIPTEN_TRUE}" && test -z "${EMSCRIPTEN_FALSE}"; then
+ as_fn_error $? "conditional \"EMSCRIPTEN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THREADS_TRUE}" && test -z "${THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PTHREADS_TRUE}" && test -z "${PTHREADS_FALSE}"; then
+ as_fn_error $? "conditional \"PTHREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DARWIN_THREADS_TRUE}" && test -z "${DARWIN_THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"DARWIN_THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WIN32_THREADS_TRUE}" && test -z "${WIN32_THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"WIN32_THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PTHREAD_START_STANDALONE_TRUE}" && test -z "${PTHREAD_START_STANDALONE_FALSE}"; then
+ as_fn_error $? "conditional \"PTHREAD_START_STANDALONE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ASM_WITH_CPP_UNSUPPORTED_TRUE}" && test -z "${ASM_WITH_CPP_UNSUPPORTED_FALSE}"; then
+ as_fn_error $? "conditional \"ASM_WITH_CPP_UNSUPPORTED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AVOID_CPP_LIB_TRUE}" && test -z "${AVOID_CPP_LIB_FALSE}"; then
+ as_fn_error $? "conditional \"AVOID_CPP_LIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CPLUSPLUS_TRUE}" && test -z "${CPLUSPLUS_FALSE}"; then
+ as_fn_error $? "conditional \"CPLUSPLUS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GC_TBA_LIBRARY_TRUE}" && test -z "${GC_TBA_LIBRARY_FALSE}"; then
+ as_fn_error $? "conditional \"GC_TBA_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GCJ_SUPPORT_TRUE}" && test -z "${ENABLE_GCJ_SUPPORT_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_GCJ_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MAKE_BACK_GRAPH_TRUE}" && test -z "${MAKE_BACK_GRAPH_FALSE}"; then
+ as_fn_error $? "conditional \"MAKE_BACK_GRAPH\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${KEEP_BACK_PTRS_TRUE}" && test -z "${KEEP_BACK_PTRS_FALSE}"; then
+ as_fn_error $? "conditional \"KEEP_BACK_PTRS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DISCLAIM_TRUE}" && test -z "${ENABLE_DISCLAIM_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DISCLAIM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CHECKSUMS_TRUE}" && test -z "${CHECKSUMS_FALSE}"; then
+ as_fn_error $? "conditional \"CHECKSUMS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_LIBDIR_TRUE}" && test -z "${USE_LIBDIR_FALSE}"; then
+ as_fn_error $? "conditional \"USE_LIBDIR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SINGLE_GC_OBJ_TRUE}" && test -z "${SINGLE_GC_OBJ_FALSE}"; then
+ as_fn_error $? "conditional \"SINGLE_GC_OBJ\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DOCS_TRUE}" && test -z "${ENABLE_DOCS_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DOCS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INTERNAL_LIBATOMIC_OPS_TRUE}" && test -z "${USE_INTERNAL_LIBATOMIC_OPS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_INTERNAL_LIBATOMIC_OPS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${NEED_ATOMIC_OPS_ASM_TRUE}" && test -z "${NEED_ATOMIC_OPS_ASM_FALSE}"; then
+ as_fn_error $? "conditional \"NEED_ATOMIC_OPS_ASM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THREAD_LOCAL_ALLOC_TRUE}" && test -z "${THREAD_LOCAL_ALLOC_FALSE}"; then
+ as_fn_error $? "conditional \"THREAD_LOCAL_ALLOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in @%:@((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+
+@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD]
+@%:@ ----------------------------------------
+@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+@%:@ script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} @%:@ as_fn_error
+
+
+
+@%:@ as_fn_set_status STATUS
+@%:@ -----------------------
+@%:@ Set @S|@? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} @%:@ as_fn_set_status
+
+@%:@ as_fn_exit STATUS
+@%:@ -----------------
+@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} @%:@ as_fn_exit
+
+@%:@ as_fn_unset VAR
+@%:@ ---------------
+@%:@ Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+@%:@ as_fn_append VAR VALUE
+@%:@ ----------------------
+@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take
+@%:@ advantage of any shell optimizations that allow amortized linear growth over
+@%:@ repeated appends, instead of the typical quadratic growth present in naive
+@%:@ implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+@%:@ as_fn_arith ARG...
+@%:@ ------------------
+@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the
+@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments
+@%:@ must be portable across @S|@(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in @%:@(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_@&t@echo='printf %s\n'
+as_@&t@echo_n='printf %s'
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+@%:@ as_fn_mkdir_p
+@%:@ -------------
+@%:@ Create "@S|@as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} @%:@ as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+@%:@ as_fn_executable_p FILE
+@%:@ -----------------------
+@%:@ Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} @%:@ as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gc $as_me 8.2.8, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <https://github.com/ivmai/bdwgc/issues>."
+
+_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config='$ac_cs_config_escaped'
+ac_cs_version="\\
+gc config.status 8.2.8
+configured by $0, generated by GNU Autoconf 2.71,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ printf "%s\n" "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ printf "%s\n" "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ printf "%s\n" "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX
+@%:@@%:@ Running $as_me. @%:@@%:@
+_ASBOX
+ printf "%s\n" "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+FILECMD \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+
+
+
+
+ srcdir="${srcdir}"
+ host=${host}
+ CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ CC="${CC}"
+ DEFS="$DEFS"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "bdw-gc.pc") CONFIG_FILES="$CONFIG_FILES bdw-gc.pc" ;;
+ "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in @%:@(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; @%:@(
+ *) :
+ set x $CONFIG_FILES ;; @%:@(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "libtool":C)
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# A file(cmd) program that detects file types.
+FILECMD=$lt_FILECMD
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive (by configure).
+lt_ar_flags=$lt_ar_flags
+
+# Flags to create an archive.
+AR_FLAGS=\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ $SED '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+
+ cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file, --srcdir, and --disable-option-checking arguments
+ # so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ eval "set x $ac_configure_args"
+ shift
+ for ac_arg
+ do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case $ac_arg in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+ | --c=*)
+ ;;
+ --config-cache | -C)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ;;
+ --disable-option-checking)
+ ;;
+ *)
+ case $ac_arg in
+ *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
+ esac
+ done
+
+ # Always prepend --prefix to ensure using the same prefix
+ # in subdir configurations.
+ ac_arg="--prefix=$prefix"
+ case $ac_arg in
+ *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
+
+ # Pass --silent
+ if test "$silent" = yes; then
+ ac_sub_configure_args="--silent $ac_sub_configure_args"
+ fi
+
+ # Always prepend --disable-option-checking to silence warnings, since
+ # different subdirs can have different --enable and --with options.
+ ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
+
+ ac_popdir=`pwd`
+ for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ test -d "$srcdir/$ac_dir" || continue
+
+ ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
+ printf "%s\n" "$ac_msg" >&6
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ cd "$ac_dir"
+
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ ac_sub_configure=$ac_srcdir/configure.gnu
+ elif test -f "$ac_srcdir/configure"; then
+ ac_sub_configure=$ac_srcdir/configure
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
+printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+ # Make the cache file name correct relative to the subdirectory.
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+ *) # Relative name.
+ ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+printf "%s\n" "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+ # The eval makes quoting arguments work.
+ eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
+ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
+ as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
+ fi
+
+ cd "$ac_popdir"
+ done
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/graphics/asymptote/gc/autom4te.cache/output.3 b/graphics/asymptote/gc/autom4te.cache/output.3
new file mode 100644
index 0000000000..5f562f94e4
--- /dev/null
+++ b/graphics/asymptote/gc/autom4te.cache/output.3
@@ -0,0 +1,22069 @@
+@%:@! /bin/sh
+@%:@ Guess values for system-dependent variables and create Makefiles.
+@%:@ Generated by GNU Autoconf 2.71 for gc 8.2.8.
+@%:@
+@%:@ Report bugs to <https://github.com/ivmai/bdwgc/issues>.
+@%:@
+@%:@
+@%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+@%:@ Inc.
+@%:@
+@%:@
+@%:@ This configure script is free software; the Free Software Foundation
+@%:@ gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in @%:@((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in @%:@ ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else \$as_nop
+ case \`(set -o) 2>/dev/null\` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
+
+else \$as_nop
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null
+then :
+ as_have_required=yes
+else $as_nop
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
+
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+ case $as_dir in @%:@(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
+
+
+ if test "x$CONFIG_SHELL" != x
+then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in @%:@ ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and
+$0: https://github.com/ivmai/bdwgc/issues about your
+$0: system, including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+@%:@ as_fn_unset VAR
+@%:@ ---------------
+@%:@ Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+
+@%:@ as_fn_set_status STATUS
+@%:@ -----------------------
+@%:@ Set @S|@? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} @%:@ as_fn_set_status
+
+@%:@ as_fn_exit STATUS
+@%:@ -----------------
+@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} @%:@ as_fn_exit
+@%:@ as_fn_nop
+@%:@ ---------
+@%:@ Do nothing but, unlike ":", preserve the value of @S|@?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+@%:@ as_fn_mkdir_p
+@%:@ -------------
+@%:@ Create "@S|@as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} @%:@ as_fn_mkdir_p
+
+@%:@ as_fn_executable_p FILE
+@%:@ -----------------------
+@%:@ Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} @%:@ as_fn_executable_p
+@%:@ as_fn_append VAR VALUE
+@%:@ ----------------------
+@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take
+@%:@ advantage of any shell optimizations that allow amortized linear growth over
+@%:@ repeated appends, instead of the typical quadratic growth present in naive
+@%:@ implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+@%:@ as_fn_arith ARG...
+@%:@ ------------------
+@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the
+@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments
+@%:@ must be portable across @S|@(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+@%:@ as_fn_nop
+@%:@ ---------
+@%:@ Do nothing but, unlike ":", preserve the value of @S|@?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD]
+@%:@ ----------------------------------------
+@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+@%:@ script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} @%:@ as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in @%:@(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_@&t@echo='printf %s\n'
+as_@&t@echo_n='printf %s'
+
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIB@&t@OBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='gc'
+PACKAGE_TARNAME='gc'
+PACKAGE_VERSION='8.2.8'
+PACKAGE_STRING='gc 8.2.8'
+PACKAGE_BUGREPORT='https://github.com/ivmai/bdwgc/issues'
+PACKAGE_URL=''
+
+ac_unique_file="gcj_mlc.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_c_list=
+enable_option_checking=no
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIB@&t@OBJS
+THREAD_LOCAL_ALLOC_FALSE
+THREAD_LOCAL_ALLOC_TRUE
+NEED_ATOMIC_OPS_ASM_FALSE
+NEED_ATOMIC_OPS_ASM_TRUE
+USE_INTERNAL_LIBATOMIC_OPS_FALSE
+USE_INTERNAL_LIBATOMIC_OPS_TRUE
+subdirs
+ATOMIC_OPS_CFLAGS
+ATOMIC_OPS_LIBS
+ENABLE_SHARED_FALSE
+ENABLE_SHARED_TRUE
+ENABLE_DOCS_FALSE
+ENABLE_DOCS_TRUE
+SINGLE_GC_OBJ_FALSE
+SINGLE_GC_OBJ_TRUE
+WERROR_CFLAGS
+USE_LIBDIR_FALSE
+USE_LIBDIR_TRUE
+CHECKSUMS_FALSE
+CHECKSUMS_TRUE
+UNWINDLIBS
+ENABLE_DISCLAIM_FALSE
+ENABLE_DISCLAIM_TRUE
+KEEP_BACK_PTRS_FALSE
+KEEP_BACK_PTRS_TRUE
+MAKE_BACK_GRAPH_FALSE
+MAKE_BACK_GRAPH_TRUE
+ENABLE_GCJ_SUPPORT_FALSE
+ENABLE_GCJ_SUPPORT_TRUE
+addlibs
+addobjs
+CXXLIBS
+AM_CPPFLAGS
+AM_CFLAGS
+GC_TBA_LIBRARY_FALSE
+GC_TBA_LIBRARY_TRUE
+CPLUSPLUS_FALSE
+CPLUSPLUS_TRUE
+target_all
+EXTRA_TEST_LIBS
+extra_ldflags_libgc
+AVOID_CPP_LIB_FALSE
+AVOID_CPP_LIB_TRUE
+ASM_WITH_CPP_UNSUPPORTED_FALSE
+ASM_WITH_CPP_UNSUPPORTED_TRUE
+PTHREAD_START_STANDALONE_FALSE
+PTHREAD_START_STANDALONE_TRUE
+WIN32_THREADS_FALSE
+WIN32_THREADS_TRUE
+DARWIN_THREADS_FALSE
+DARWIN_THREADS_TRUE
+PTHREADS_FALSE
+PTHREADS_TRUE
+THREADS_FALSE
+THREADS_TRUE
+THREADDLLIBS
+CFLAGS_EXTRA
+GC_CFLAGS
+EMSCRIPTEN_FALSE
+EMSCRIPTEN_TRUE
+CXXCPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+FILECMD
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+LIBTOOL
+am__fastdepCCAS_FALSE
+am__fastdepCCAS_TRUE
+CCASDEPMODE
+CCASFLAGS
+CCAS
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+GC_VERSION
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+CSCOPE
+ETAGS
+CTAGS
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_static
+enable_shared
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_emscripten_asyncify
+enable_threads
+enable_parallel_mark
+enable_thread_local_alloc
+enable_threads_discovery
+enable_cplusplus
+with_ecos
+enable_throw_bad_alloc_library
+with_target_subdir
+with_cross_host
+enable_gcj_support
+enable_sigrt_signals
+enable_gc_debug
+enable_java_finalization
+enable_atomic_uncollectable
+enable_redirect_malloc
+enable_disclaim
+enable_large_config
+enable_gc_assertions
+enable_mmap
+enable_munmap
+enable_dynamic_loading
+enable_register_main_static_data
+enable_checksums
+enable_werror
+enable_single_obj_compilation
+enable_gcov
+enable_docs
+with_libatomic_ops
+enable_handle_fork
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CCAS
+CCASFLAGS
+LT_SYS_LIBRARY_PATH
+CXXCPP'
+ac_subdirs_all='libatomic_ops'
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir runstatedir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures gc 8.2.8 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ @<:@@S|@ac_default_prefix@:>@
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ @<:@PREFIX@:>@
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gc@:>@
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of gc 8.2.8:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=no@:>@
+ --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@
+ --enable-fast-install@<:@=PKGS@:>@
+ optimize for fast installation @<:@default=yes@:>@
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-emscripten-asyncify
+ use Emscripten asyncify feature
+ --enable-threads=TYPE choose threading package
+ --disable-parallel-mark do not parallelize marking and free list
+ construction
+ --disable-thread-local-alloc
+ turn off thread-local allocation optimization
+ --disable-threads-discovery
+ disable threads discovery in GC
+ --enable-cplusplus install C++ support
+ --disable-throw-bad-alloc-library
+ do not build C++ gctba library
+ --disable-gcj-support disable support for gcj
+ --enable-sigrt-signals force GC to use SIGRTMIN-based signals for thread
+ suspend/resume
+ --enable-gc-debug include full support for pointer backtracing etc.
+ --disable-java-finalization
+ disable support for java finalization
+ --disable-atomic-uncollectible
+ disable support for atomic uncollectible allocation
+ --enable-redirect-malloc
+ redirect malloc and friends to GC routines
+ --disable-disclaim disable alternative (more efficient) finalization
+ interface
+ --enable-large-config optimize for large (> 100 MB) heap or root set
+ --enable-gc-assertions collector-internal assertion checking
+ --enable-mmap use mmap instead of sbrk to expand the heap
+ --enable-munmap=N return page to the OS if empty for N collections
+ (default: 6)
+ --disable-dynamic-loading
+ build the collector with disabled tracing of dynamic
+ library data roots
+ --disable-register-main-static-data
+ skip the initial guess of data root sets
+ --enable-checksums report on erroneously cleared dirty bits at
+ substantial performance cost; use only for debugging
+ of the incremental collector
+ --enable-werror pass -Werror to the C compiler
+ --enable-single-obj-compilation
+ compile all libgc source files into single .o
+ (default: yes if static libraries are disabled)
+ --enable-gcov turn on code coverage analysis
+ --disable-docs do not build and install documentation
+ --enable-handle-fork=yes|no|auto|manual
+ attempt to ensure a usable collector after fork() in
+ multi-threaded programs (default: auto; manual:
+ GC_atfork_prepare/parent/child should be called by
+ the client)
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use
+ both@:>@
+ --with-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, @<:@default=aix@:>@.
+ --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@
+ --with-sysroot@<:@=DIR@:>@ Search for dependent libraries within DIR (or the
+ compiler's sysroot if not specified).
+ --with-ecos enable runtime eCos target support
+ --with-target-subdir=SUBDIR
+ configuring with a cross compiler
+ --with-cross-host=HOST configuring with a cross compiler
+ --with-libatomic-ops=yes|no|check|none
+ use an external libatomic_ops? (default: check;
+ none: use compiler intrinsics or no thread support)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CCAS assembler compiler command (defaults to CC)
+ CCASFLAGS assembler compiler flags (defaults to CFLAGS)
+ LT_SYS_LIBRARY_PATH
+ User-defined run-time library search path.
+ CXXCPP C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <https://github.com/ivmai/bdwgc/issues>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+gc configure 8.2.8
+generated by GNU Autoconf 2.71
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+@%:@ ac_fn_c_try_compile LINENO
+@%:@ --------------------------
+@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_compile
+
+@%:@ ac_fn_cxx_try_compile LINENO
+@%:@ ----------------------------
+@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_compile
+
+@%:@ ac_fn_c_try_link LINENO
+@%:@ -----------------------
+@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_link
+
+@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+@%:@ -------------------------------------------------------
+@%:@ Tests whether HEADER exists and can be compiled using the include files in
+@%:@ INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+@%:@include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} @%:@ ac_fn_c_check_header_compile
+
+@%:@ ac_fn_c_check_func LINENO FUNC VAR
+@%:@ ----------------------------------
+@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below. */
+
+#include <limits.h>
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* 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 defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} @%:@ ac_fn_c_check_func
+
+@%:@ ac_fn_cxx_try_cpp LINENO
+@%:@ ------------------------
+@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_cpp
+
+@%:@ ac_fn_cxx_try_link LINENO
+@%:@ -------------------------
+@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_cxx_try_link
+
+@%:@ ac_fn_c_try_run LINENO
+@%:@ ----------------------
+@%:@ Try to run conftest.@S|@ac_ext, and return whether this succeeded. Assumes that
+@%:@ executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} @%:@ ac_fn_c_try_run
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?@<:@ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gc $as_me 8.2.8, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ $ $0$ac_configure_args_raw
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ printf "%s\n" "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ printf "%s\n" "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ printf "%s\n" "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ printf "%s\n" "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+printf "%s\n" "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+printf "%s\n" "@%:@define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
+
+printf "%s\n" "@%:@define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ ac_site_files="$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
+else
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+fi
+
+for ac_site_file in $ac_site_files
+do
+ case $ac_site_file in @%:@(
+ */*) :
+ ;; @%:@(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+ extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+ try {
+ throw "test";
+ } catch (const char *s) {
+ // Extra parentheses suppress a warning when building autoconf itself,
+ // due to lint rules shared with more typical C programs.
+ assert (!(strcmp) (s, "test"));
+ }
+}
+
+template <typename T> struct test_template
+{
+ T const val;
+ explicit test_template(T t) : val(t) {}
+ template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+ assert (argc);
+ assert (! argv[0]);
+{
+ test_exception_syntax ();
+ test_template<double> tt (2.0);
+ assert (tt.add (4) == 6.0);
+ assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+ constexpr int get_val() { return 20; }
+
+ struct testinit
+ {
+ int i;
+ double d;
+ };
+
+ class delegate
+ {
+ public:
+ delegate(int n) : n(n) {}
+ delegate(): delegate(2354) {}
+
+ virtual int getval() { return this->n; };
+ protected:
+ int n;
+ };
+
+ class overridden : public delegate
+ {
+ public:
+ overridden(int n): delegate(n) {}
+ virtual int getval() override final { return this->n * 2; }
+ };
+
+ class nocopy
+ {
+ public:
+ nocopy(int i): i(i) {}
+ nocopy() = default;
+ nocopy(const nocopy&) = delete;
+ nocopy & operator=(const nocopy&) = delete;
+ private:
+ int i;
+ };
+
+ // for testing lambda expressions
+ template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+ {
+ return f(v);
+ }
+
+ // for testing variadic templates and trailing return types
+ template <typename V> auto sum(V first) -> V
+ {
+ return first;
+ }
+ template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+ {
+ return first + sum(rest...);
+ }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+ // Test auto and decltype
+ auto a1 = 6538;
+ auto a2 = 48573953.4;
+ auto a3 = "String literal";
+
+ int total = 0;
+ for (auto i = a3; *i; ++i) { total += *i; }
+
+ decltype(a2) a4 = 34895.034;
+}
+{
+ // Test constexpr
+ short sa[cxx11test::get_val()] = { 0 };
+}
+{
+ // Test initializer lists
+ cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+ // Test range-based for
+ int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+ 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+ for (auto &x : array) { x += 23; }
+}
+{
+ // Test lambda expressions
+ using cxx11test::eval;
+ assert (eval ([](int x) { return x*2; }, 21) == 42);
+ double d = 2.0;
+ assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+ assert (d == 5.0);
+ assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+ assert (d == 5.0);
+}
+{
+ // Test use of variadic templates
+ using cxx11test::sum;
+ auto a = sum(1);
+ auto b = sum(1, 2);
+ auto c = sum(1.0, 2.0, 3.0);
+}
+{
+ // Test constructor delegation
+ cxx11test::delegate d1;
+ cxx11test::delegate d2();
+ cxx11test::delegate d3(45);
+}
+{
+ // Test override and final
+ cxx11test::overridden o1(55464);
+}
+{
+ // Test nullptr
+ char *c = nullptr;
+}
+{
+ // Test template brackets
+ test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+ // Unicode literals
+ char const *utf8 = u8"UTF-8 string \u2500";
+ char16_t const *utf16 = u"UTF-8 string \u2500";
+ char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ ${ac_cxx_conftest_cxx11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="ltmain.sh compile missing install-sh config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_@&t@configure="$SHELL ${ac_aux_dir}configure"
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
+else
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking GC version numbers" >&5
+printf %s "checking GC version numbers... " >&6; }
+ GC_VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\([0-9][0-9]*\)[.].*$/\1/g'`
+ GC_VERSION_MINOR=`echo $PACKAGE_VERSION | sed 's/^[^.]*[.]\([0-9][0-9]*\).*$/\1/g'`
+ GC_VERSION_MICRO=`echo $PACKAGE_VERSION | sed 's/^[^.]*[.][^.]*[.]\([0-9][0-9]*\)$/\1/g'`
+
+ if test :$GC_VERSION_MAJOR: = :: \
+ -o :$GC_VERSION_MINOR: = :: \
+ -o :$GC_VERSION_MICRO: = :: ;
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: invalid" >&5
+printf "%s\n" "invalid" >&6; }
+ as_fn_error $? "nonconforming PACKAGE_VERSION='$PACKAGE_VERSION'" "$LINENO" 5
+ fi
+
+
+printf "%s\n" "@%:@define GC_VERSION_MAJOR $GC_VERSION_MAJOR" >>confdefs.h
+
+
+printf "%s\n" "@%:@define GC_VERSION_MINOR $GC_VERSION_MINOR" >>confdefs.h
+
+
+printf "%s\n" "@%:@define GC_VERSION_MICRO $GC_VERSION_MICRO" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO" >&5
+printf "%s\n" "major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO" >&6; }
+
+am__api_version='1.16'
+
+
+ # Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in @%:@((
+ ./ | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test ${ac_cv_path_install+y}; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"`
+
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+
+ if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ 'BusyBox '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test ${ac_cv_path_mkdir+y}; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SET_MAKE=
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+@%:@ Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gc'
+ VERSION='8.2.8'
+
+
+printf "%s\n" "@%:@define PACKAGE \"$PACKAGE\"" >>confdefs.h
+
+
+printf "%s\n" "@%:@define VERSION \"$VERSION\"" >>confdefs.h
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+ac_config_headers="$ac_config_headers include/config.h"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ @%:@ Check whether --enable-maintainer-mode was given.
+if test ${enable_maintainer_mode+y}
+then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else $as_nop
+ USE_MAINTAINER_MODE=no
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+printf "%s\n" "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in @%:@(
+ '0:this is the am__doit target') :
+ case $s in @%:@(
+ BSD) :
+ am__include='.include' am__quote='"' ;; @%:@(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; @%:@(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
+
+@%:@ Check whether --enable-dependency-tracking was given.
+if test ${enable_dependency_tracking+y}
+then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $@%:@ != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else $as_nop
+ ac_file=''
+fi
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <stdio.h>
+int
+main (void)
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+y}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+else $as_nop
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+# By default we simply use the C compiler to build assembly code.
+
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+
+
+
+depcc="$CCAS" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CCAS_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CCAS_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CCAS_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CCAS_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CCAS_dependencies_compiler_type" >&6; }
+CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then
+ am__fastdepCCAS_TRUE=
+ am__fastdepCCAS_FALSE='#'
+else
+ am__fastdepCCAS_TRUE='#'
+ am__fastdepCCAS_FALSE=
+fi
+
+
+
+case `pwd` in
+ *\ * | *\ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.7'
+macro_revision='2.4.7'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+printf %s "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO ""
+}
+
+case $ECHO in
+ printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+printf "%s\n" "printf" >&6; } ;;
+ print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+printf "%s\n" "print -r" >&6; } ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+printf "%s\n" "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in sed gsed
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+printf %s "checking for fgrep... " >&6; }
+if test ${ac_cv_path_FGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+ then ac_cv_path_FGREP="$GREP -F"
+ else
+ if test -z "$FGREP"; then
+ ac_path_FGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in fgrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+ # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'FGREP' >> "conftest.nl"
+ "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_FGREP="$ac_path_FGREP"
+ ac_path_FGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_FGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_FGREP"; then
+ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_FGREP=$FGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+printf "%s\n" "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@%:@ Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test ${lt_cv_path_NM+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+printf "%s\n" "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in dumpbin "link -dump"
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DUMPBIN"; then
+ ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+printf "%s\n" "$DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$DUMPBIN" && break
+ done
+fi
+if test -z "$DUMPBIN"; then
+ ac_ct_DUMPBIN=$DUMPBIN
+ for ac_prog in dumpbin "link -dump"
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DUMPBIN"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+printf "%s\n" "$ac_ct_DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_DUMPBIN" && break
+done
+
+ if test "x$ac_ct_DUMPBIN" = x; then
+ DUMPBIN=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DUMPBIN=$ac_ct_DUMPBIN
+ fi
+fi
+
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+printf %s "checking the name lister ($NM) interface... " >&6; }
+if test ${lt_cv_nm_interface+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+printf "%s\n" "$lt_cv_nm_interface" >&6; }
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+printf %s "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+printf "%s\n" "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+printf %s "checking the maximum length of command line arguments... " >&6; }
+if test ${lt_cv_sys_max_cmd_len+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+printf %s "checking how to convert $build file names to $host format... " >&6; }
+if test ${lt_cv_to_host_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+printf %s "checking how to convert $build file names to toolchain format... " >&6; }
+if test ${lt_cv_to_tool_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+printf %s "checking for $LD option to reload object files... " >&6; }
+if test ${lt_cv_ld_reload_flag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_reload_flag='-r'
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+printf "%s\n" "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args.
+set dummy ${ac_tool_prefix}file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$FILECMD"; then
+ ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_FILECMD="${ac_tool_prefix}file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+FILECMD=$ac_cv_prog_FILECMD
+if test -n "$FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5
+printf "%s\n" "$FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_FILECMD"; then
+ ac_ct_FILECMD=$FILECMD
+ # Extract the first word of "file", so it can be a program name with args.
+set dummy file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_FILECMD"; then
+ ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_FILECMD="file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD
+if test -n "$ac_ct_FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5
+printf "%s\n" "$ac_ct_FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_FILECMD" = x; then
+ FILECMD=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ FILECMD=$ac_ct_FILECMD
+ fi
+else
+ FILECMD="$ac_cv_prog_FILECMD"
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+printf "%s\n" "$OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+printf "%s\n" "$ac_ct_OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+printf %s "checking how to recognize dependent libraries... " >&6; }
+if test ${lt_cv_deplibs_check_method+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='$FILECMD -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=$FILECMD
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[3-9]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+printf "%s\n" "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+printf "%s\n" "$DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+printf "%s\n" "$ac_ct_DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+printf %s "checking how to associate runtime and link libraries... " >&6; }
+if test ${lt_cv_sharedlib_from_linklib_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AR" && break
+ done
+fi
+if test -z "$AR"; then
+ ac_ct_AR=$AR
+ for ac_prog in ar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AR" && break
+done
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+fi
+
+: ${AR=ar}
+
+
+
+
+
+
+# Use ARFLAGS variable as AR's operation code to sync the variable naming with
+# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
+# higher priority because thats what people were doing historically (setting
+# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS
+# variable obsoleted/removed.
+
+test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
+lt_ar_flags=$AR_FLAGS
+
+
+
+
+
+
+# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override
+# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+printf %s "checking for archiver @FILE support... " >&6; }
+if test ${lt_cv_ar_at_file+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -eq "$ac_status"; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+printf "%s\n" "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+printf %s "checking command to parse $NM output from $compiler object... " >&6; }
+if test ${lt_cv_sys_global_symbol_pipe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ if test ia64 = "$host_cpu"; then
+ symcode='[ABCDEGRST]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="$SED -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
+ # Also find C++ and __fastcall symbols from MSVC++ or ICC,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK '"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx"
+ else
+ lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT@&t@_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT@&t@_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS=conftstm.$ac_objext
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test yes = "$pipe_works"; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+printf "%s\n" "failed" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+printf "%s\n" "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+printf %s "checking for sysroot... " >&6; }
+
+@%:@ Check whether --with-sysroot was given.
+if test ${with_sysroot+y}
+then :
+ withval=$with_sysroot;
+else $as_nop
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+printf "%s\n" "$with_sysroot" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+printf "%s\n" "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+printf %s "checking for a working dd... " >&6; }
+if test ${ac_cv_path_lt_DD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+ ac_path_lt_DD_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in dd
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+ $ac_path_lt_DD_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_lt_DD"; then
+ :
+ fi
+else
+ ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+printf "%s\n" "$ac_cv_path_lt_DD" >&6; }
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+printf %s "checking how to truncate binary pipes... " >&6; }
+if test ${lt_cv_truncate_bin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+printf "%s\n" "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+@%:@ Check whether --enable-libtool-lock was given.
+if test ${enable_libtool_lock+y}
+then :
+ enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE=32
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE=64
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ emul=elf
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ case `$FILECMD conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -belf"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+printf %s "checking whether the C compiler needs -belf... " >&6; }
+if test ${lt_cv_cc_needs_belf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_cc_needs_belf=yes
+else $as_nop
+ lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+printf "%s\n" "$lt_cv_cc_needs_belf" >&6; }
+ if test yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$MANIFEST_TOOL"; then
+ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+printf "%s\n" "$MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+ # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_MANIFEST_TOOL"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+ fi
+else
+ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if test ${lt_cv_path_mainfest_tool+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&5
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+ MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+ case $host_os in
+ rhapsody* | darwin*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DSYMUTIL"; then
+ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+printf "%s\n" "$DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+ ac_ct_DSYMUTIL=$DSYMUTIL
+ # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DSYMUTIL"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+printf "%s\n" "$ac_ct_DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DSYMUTIL=$ac_ct_DSYMUTIL
+ fi
+else
+ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$NMEDIT"; then
+ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+printf "%s\n" "$NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+ ac_ct_NMEDIT=$NMEDIT
+ # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_NMEDIT"; then
+ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+printf "%s\n" "$ac_ct_NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ NMEDIT=$ac_ct_NMEDIT
+ fi
+else
+ NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$LIPO"; then
+ ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+printf "%s\n" "$LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+ ac_ct_LIPO=$LIPO
+ # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_LIPO"; then
+ ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_LIPO="lipo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+printf "%s\n" "$ac_ct_LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_LIPO" = x; then
+ LIPO=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIPO=$ac_ct_LIPO
+ fi
+else
+ LIPO="$ac_cv_prog_LIPO"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OTOOL"; then
+ ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+printf "%s\n" "$OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+ ac_ct_OTOOL=$OTOOL
+ # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OTOOL"; then
+ ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL="otool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+printf "%s\n" "$ac_ct_OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL" = x; then
+ OTOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL=$ac_ct_OTOOL
+ fi
+else
+ OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OTOOL64"; then
+ ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+printf "%s\n" "$OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+ ac_ct_OTOOL64=$OTOOL64
+ # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OTOOL64"; then
+ ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL64="otool64"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+printf "%s\n" "$ac_ct_OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL64" = x; then
+ OTOOL64=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL64=$ac_ct_OTOOL64
+ fi
+else
+ OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+printf %s "checking for -single_module linker flag... " >&6; }
+if test ${lt_cv_apple_cc_single_mod+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_apple_cc_single_mod=no
+ if test -z "$LT_MULTI_MODULE"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+printf %s "checking for -exported_symbols_list linker flag... " >&6; }
+if test ${lt_cv_ld_exported_symbols_list+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_ld_exported_symbols_list=yes
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+printf %s "checking for -force_load linker flag... " >&6; }
+if test ${lt_cv_ld_force_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+ echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5
+ $AR $AR_FLAGS libconftest.a conftest.o 2>&5
+ echo "$RANLIB libconftest.a" >&5
+ $RANLIB libconftest.a 2>&5
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+printf "%s\n" "$lt_cv_ld_force_load" >&6; }
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ darwin*)
+ case $MACOSX_DEPLOYMENT_TARGET,$host in
+ 10.[012],*|,*powerpc*-darwin[5-8]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ *)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+ fi
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "@%:@define STDC_HEADERS 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes
+then :
+ printf "%s\n" "@%:@define HAVE_DLFCN_H 1" >>confdefs.h
+
+fi
+
+
+
+
+func_stripname_cnf ()
+{
+ case @S|@2 in
+ .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+ *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
+ esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+@%:@ Check whether --enable-static was given.
+if test ${enable_static+y}
+then :
+ enableval=$enable_static; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_static=no
+fi
+
+
+
+
+
+
+
+
+
+
+ enable_dlopen=no
+
+
+ enable_win32_dll=no
+
+
+ @%:@ Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+@%:@ Check whether --with-pic was given.
+if test ${with_pic+y}
+then :
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ pic_mode=default
+fi
+
+
+
+
+
+
+
+
+ @%:@ Check whether --enable-fast-install was given.
+if test ${enable_fast_install+y}
+then :
+ enableval=$enable_fast_install; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+ shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+printf %s "checking which variant of shared library versioning to provide... " >&6; }
+
+@%:@ Check whether --with-aix-soname was given.
+if test ${with_aix_soname+y}
+then :
+ withval=$with_aix_soname; case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else $as_nop
+ if test ${lt_cv_with_aix_soname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_with_aix_soname=aix
+fi
+
+ with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+printf "%s\n" "$with_aix_soname" >&6; }
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+printf %s "checking for objdir... " >&6; }
+if test ${lt_cv_objdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+printf "%s\n" "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+printf "%s\n" "@%:@define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC and
+# ICC, which need '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+printf %s "checking for ${ac_tool_prefix}file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/${ac_tool_prefix}file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+printf %s "checking for file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test ${lt_cv_prog_compiler_rtti_exceptions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+
+
+
+
+
+ lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+ if test yes = "$GCC"; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='$wl-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ # old Intel for x86_64, which still supported -KPIC.
+ ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='--shared'
+ lt_prog_compiler_static='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag=
+ always_export_symbols=no
+ archive_cmds=
+ archive_expsym_cmds=
+ compiler_needs_object=no
+ enable_shared_with_static_runtimes=no
+ export_dynamic_flag_spec=
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ hardcode_automatic=no
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_separator=
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ inherit_rpath=no
+ link_all_deplibs=unknown
+ module_cmds=
+ module_expsym_cmds=
+ old_archive_from_new_cmds=
+ old_archive_from_expsyms_cmds=
+ thread_safe_flag_spec=
+ whole_archive_flag_spec=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
+ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ if test yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test yes = "$with_gnu_ld"; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+ *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test yes = "$lt_use_gnu_ld_interface"; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='$wl'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec='$wl--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test ia64 != "$host_cpu"; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ export_dynamic_flag_spec='$wl--export-all-symbols'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ haiku*)
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs=yes
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test linux-dietlibc = "$host_os"; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test no = "$tmp_diet"
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ whole_archive_flag_spec=
+ tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
+ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ tcc*)
+ export_dynamic_flag_spec='-rdynamic'
+ ;;
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test no = "$ld_shlibs"; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ file_list_spec='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' $wl-bernotok'
+ allow_undefined_flag=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ fi
+ archive_cmds_need_lc=yes
+ archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl* | icl*)
+ # Native MSVC or ICC
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ file_list_spec='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+ enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ old_postinstall_cmds='chmod 644 $oldlib'
+ postlink_cmds='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC and ICC wrapper
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ enable_shared_with_static_runtimes=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec=''
+ fi
+ link_all_deplibs=yes
+ allow_undefined_flag=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+ else
+ ld_shlibs=no
+ fi
+
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly* | midnightbsd*)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test yes = "$GCC"; then
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='$wl-E'
+ ;;
+
+ hpux10*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+printf %s "checking if $CC understands -b... " >&6; }
+if test ${lt_cv_prog_compiler__b+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler__b=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -b"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler__b=yes
+ fi
+ else
+ lt_cv_prog_compiler__b=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+printf "%s\n" "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+ ;;
+ esac
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if test ${lt_cv_irix_exported_symbol+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_irix_exported_symbol=yes
+else $as_nop
+ lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; }
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+ fi
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ inherit_rpath=yes
+ link_all_deplibs=yes
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ ld_shlibs=yes
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ hardcode_direct_absolute=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ else
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z defs'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='$wl'
+ archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test yes = "$GCC"; then
+ whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test sequent = "$host_vendor"; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag='$wl-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='$wl-z,text'
+ allow_undefined_flag='$wl-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-R,$libdir'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+
+ if test sni = "$host_vendor"; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ export_dynamic_flag_spec='$wl-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+printf "%s\n" "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+ case $host_os in
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary...
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo = "/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[lt_foo]++; }
+ if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+ test -n "$runpath_var" ||
+ test yes = "$hardcode_automatic"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+ test no != "$hardcode_minus_L"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+printf "%s\n" "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+ test yes = "$inherit_rpath"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+ if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else $as_nop
+
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes
+then :
+ lt_cv_dlopen=shl_load
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+printf %s "checking for shl_load in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_shl_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main (void)
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_shl_load=yes
+else $as_nop
+ ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes
+then :
+ lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else $as_nop
+ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+printf %s "checking for dlopen in -lsvld... " >&6; }
+if test ${ac_cv_lib_svld_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_svld_dlopen=yes
+else $as_nop
+ ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+printf %s "checking for dld_link in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_dld_link+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main (void)
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_dld_link=yes
+else $as_nop
+ ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes
+then :
+ lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+printf %s "checking whether a program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+printf "%s\n" "$lt_cv_dlopen_self" >&6; }
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+printf %s "checking whether a statically linked program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self_static+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+printf "%s\n" "$lt_cv_dlopen_self_static" >&6; }
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+printf %s "checking whether stripping libraries is possible... " >&6; }
+if test -z "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+else
+ if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ case $host_os in
+ darwin*)
+ # FIXME - insert some real tests, host_os isn't really good enough
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ ;;
+ freebsd*)
+ if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ ;;
+ esac
+ fi
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # Report what library types will actually be built
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+printf %s "checking if libtool supports shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+printf "%s\n" "$can_build_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+printf %s "checking whether to build static libraries... " >&6; }
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+printf "%s\n" "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+ if test -n "$CXX" && ( test no != "$CXX" &&
+ ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+ (test g++ != "$CXX"))); then
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+printf %s "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if test ${ac_cv_prog_CXXCPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CXX needs to be expanded
+ for CXXCPP in "$CXX -E" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+printf "%s\n" "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+ _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="int some_variable = 0;"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+ # save warnings/boilerplate of simple test code
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_CFLAGS=$CFLAGS
+ lt_save_LD=$LD
+ lt_save_GCC=$GCC
+ GCC=$GXX
+ lt_save_with_gnu_ld=$with_gnu_ld
+ lt_save_path_LD=$lt_cv_path_LD
+ if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+ else
+ $as_unset lt_cv_prog_gnu_ld
+ fi
+ if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+ else
+ $as_unset lt_cv_path_LD
+ fi
+ test -z "${LDCXX+set}" || LD=$LDCXX
+ CC=${CXX-"c++"}
+ CFLAGS=$CXXFLAGS
+ compiler=$CC
+ compiler_CXX=$CC
+ func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+ if test -n "$compiler"; then
+ # We don't want -fno-exception when compiling C++ code, so set the
+ # no_builtin_flag separately
+ if test yes = "$GXX"; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+ else
+ lt_prog_compiler_no_builtin_flag_CXX=
+ fi
+
+ if test yes = "$GXX"; then
+ # Set up default GNU C++ configuration
+
+
+
+@%:@ Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test yes = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='$wl'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+ $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec_CXX=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+ fi
+
+ # PORTME: fill in a description of your system's C++ link characteristics
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ ld_shlibs_CXX=yes
+ case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_CXX=''
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ file_list_spec_CXX='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct_CXX=no
+ hardcode_direct_absolute_CXX=no
+ ;;
+ esac
+
+ if test yes = "$GXX"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct_CXX=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_CXX=yes
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_libdir_separator_CXX=
+ fi
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag=$shared_flag' $wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec_CXX='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to
+ # export.
+ always_export_symbols_CXX=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ # The "-G" linker flag allows undefined symbols.
+ no_undefined_flag_CXX='-bernotok'
+ # Determine the default libpath from the value encoded in an empty
+ # executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+
+ archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_CXX="-z nodefs"
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_CXX=' $wl-bernotok'
+ allow_undefined_flag_CXX=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ fi
+ archive_cmds_need_lc_CXX=yes
+ archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared
+ # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_CXX=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $GXX,$cc_basename in
+ ,cl* | no,cl* | ,icl* | no,icl*)
+ # Native MSVC or ICC
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX=' '
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=yes
+ file_list_spec_CXX='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+ enable_shared_with_static_runtimes_CXX=yes
+ # Don't use ranlib
+ old_postinstall_cmds_CXX='chmod 644 $oldlib'
+ postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # g++
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=no
+ enable_shared_with_static_runtimes_CXX=yes
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec_CXX=''
+ fi
+ link_all_deplibs_CXX=yes
+ allow_undefined_flag_CXX=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ if test yes != "$lt_cv_apple_cc_single_mod"; then
+ archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+ fi
+
+ else
+ ld_shlibs_CXX=no
+ fi
+
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_minus_L_CXX=yes
+ allow_undefined_flag_CXX=unsupported
+ shrext_cmds=.dll
+ archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes_CXX=yes
+ file_list_spec_CXX='@'
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ freebsd2.*)
+ # C++ shared libraries reported to be fairly broken before
+ # switch to ELF
+ ld_shlibs_CXX=no
+ ;;
+
+ freebsd-elf*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+
+ haiku*)
+ archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs_CXX=yes
+ ;;
+
+ hpux9*)
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='$wl-E'
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ hpux10*|hpux11*)
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ export_dynamic_flag_spec_CXX='$wl-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ ;;
+ *)
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+ fi
+ fi
+ link_all_deplibs_CXX=yes
+ ;;
+ esac
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ inherit_rpath_CXX=yes
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc* | ecpc* )
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ case `$CC -V` in
+ *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+ prelink_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+ old_archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+ $RANLIB $oldlib'
+ archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 6 and above use weak symbols
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+ ;;
+ xl* | mpixl* | bgxl*)
+ # IBM XL 8.0 on PPC, with GNU ld
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object_CXX=yes
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ m88k*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+
+ *nto* | *qnx*)
+ ld_shlibs_CXX=yes
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ hardcode_direct_absolute_CXX=yes
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ fi
+ output_verbose_link_cmd=func_echo_all
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ case $host in
+ osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+ *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+ esac
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ case $host in
+ osf3*)
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ ;;
+ *)
+ allow_undefined_flag_CXX=' -expect_unresolved \*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+ $RM $lib.exp'
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ ;;
+ esac
+
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ case $host in
+ osf3*)
+ archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ psos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ archive_cmds_need_lc_CXX=yes
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_shlibpath_var_CXX=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ no_undefined_flag_CXX=' $wl-z ${wl}defs'
+ if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ else
+ # g++ 2.7 appears to require '-G' NOT '-shared' on this
+ # platform.
+ archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_CXX='$wl-z,text'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_CXX='$wl-z,text'
+ allow_undefined_flag_CXX='$wl-z,nodefs'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ export_dynamic_flag_spec_CXX='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+ '"$old_archive_cmds_CXX"
+ reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+ '"$reload_cmds_CXX"
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+ test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+ GCC_CXX=$GXX
+ LD_CXX=$LD
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ for p in `eval "$output_verbose_link_cmd"`; do
+ case $prev$p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test x-L = "$p" ||
+ test x-R = "$p"; then
+ prev=$p
+ continue
+ fi
+
+ # Expand the sysroot to ease extracting the directories later.
+ if test -z "$prev"; then
+ case $p in
+ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+ esac
+ fi
+ case $p in
+ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+ esac
+ if test no = "$pre_test_object_deps_done"; then
+ case $prev in
+ -L | -R)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_path_CXX=$prev$p
+ else
+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$postdeps_CXX"; then
+ postdeps_CXX=$prev$p
+ else
+ postdeps_CXX="${postdeps_CXX} $prev$p"
+ fi
+ fi
+ prev=
+ ;;
+
+ *.lto.$objext) ;; # Ignore GCC LTO objects
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test no = "$pre_test_object_deps_done"; then
+ if test -z "$predep_objects_CXX"; then
+ predep_objects_CXX=$p
+ else
+ predep_objects_CXX="$predep_objects_CXX $p"
+ fi
+ else
+ if test -z "$postdep_objects_CXX"; then
+ postdep_objects_CXX=$p
+ else
+ postdep_objects_CXX="$postdep_objects_CXX $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ predep_objects_CXX=
+ postdep_objects_CXX=
+ postdeps_CXX=
+ ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test yes = "$GXX"; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static_CXX='$wl-static'
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static_CXX=
+ ;;
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[4-9]*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ if test ia64 != "$host_cpu"; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ ecpc* )
+ # old Intel C++ for x86_64, which still supported -KPIC.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ icpc* )
+ # Intel C++, used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fpic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-qpic'
+ lt_prog_compiler_static_CXX='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works_CXX=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ case $host_os in
+ aix[4-9]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ export_symbols_cmds_CXX=$ltdll_cmds
+ ;;
+ cygwin* | mingw* | cegcc*)
+ case $cc_basename in
+ cl* | icl*)
+ exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+ ;;
+ esac
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_CXX=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds_CXX in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_CXX
+ pic_flag=$lt_prog_compiler_pic_CXX
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+ allow_undefined_flag_CXX=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc_CXX=no
+ else
+ lt_cv_archive_cmds_need_lc_CXX=yes
+ fi
+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+ archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+ test -n "$runpath_var_CXX" ||
+ test yes = "$hardcode_automatic_CXX"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct_CXX" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+ test no != "$hardcode_minus_L_CXX"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_CXX=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_CXX=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_CXX=unsupported
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+printf "%s\n" "$hardcode_action_CXX" >&6; }
+
+if test relink = "$hardcode_action_CXX" ||
+ test yes = "$inherit_rpath_CXX"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+ fi # test -n "$compiler"
+
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+ LDCXX=$LD
+ LD=$lt_save_LD
+ GCC=$lt_save_GCC
+ with_gnu_ld=$lt_save_with_gnu_ld
+ lt_cv_path_LDCXX=$lt_cv_path_LD
+ lt_cv_path_LD=$lt_save_path_LD
+ lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+# Only the shared libraries are produced by default, use "--enable-static"
+# option to override it.
+
+# Special CFLAGS to use when building
+gc_cflags=""
+
+# Set to "yes" on platforms where mmap should be used instead of sbrk.
+# This will define USE_MMAP.
+gc_use_mmap=""
+
+# We should set -fexceptions if we are using gcc and might be used
+# inside something like gcj. This is the zeroth approximation:
+if test :"$GCC": = :yes: ; then
+ gc_cflags="${gc_cflags} -fexceptions"
+else
+ case "$host" in
+ hppa*-*-hpux* )
+ if test :$GCC: != :"yes": ; then
+ gc_cflags="${gc_cflags} +ESdbgasm"
+ fi
+ # :TODO: actually we should check using Autoconf if
+ # the compiler supports this option.
+ ;;
+ esac
+fi
+
+# target_optspace --enable-target-optspace ("yes", "no", "")
+case "${target_optspace}:${host}" in
+ yes:*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ :m32r-* | :d10v-* | :d30v-*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ no:* | :*)
+ # Nothing.
+ ;;
+esac
+
+# Set any host dependent compiler flags.
+case "${host}" in
+ mips-tx39-*|mipstx39-unknown-*)
+ gc_cflags="${gc_cflags} -G 0"
+ ;;
+ *)
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for emscripten" >&5
+printf %s "checking for emscripten... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# ifndef __EMSCRIPTEN__
+# error This is not Emscripten
+# endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ emscripten=yes
+else $as_nop
+ emscripten=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test x$emscripten = xyes; then
+ EMSCRIPTEN_TRUE=
+ EMSCRIPTEN_FALSE='#'
+else
+ EMSCRIPTEN_TRUE='#'
+ EMSCRIPTEN_FALSE=
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $emscripten" >&5
+printf "%s\n" "$emscripten" >&6; }
+
+@%:@ Check whether --enable-emscripten-asyncify was given.
+if test ${enable_emscripten_asyncify+y}
+then :
+ enableval=$enable_emscripten_asyncify;
+fi
+
+# Use this option if your program is targeting -sASYNCIFY. The latter is
+# required to scan the stack, ASYNCIFY_STACK_SIZE is probably needed for
+# gctest only.
+if test "${emscripten}" = yes -a "${enable_emscripten_asyncify}" = yes
+then :
+ gc_cflags="${gc_cflags} -DEMSCRIPTEN_ASYNCIFY"
+ gc_cflags="${gc_cflags} -sASYNCIFY -sASYNCIFY_STACK_SIZE=128000"
+fi
+
+GC_CFLAGS=${gc_cflags}
+
+
+
+
+@%:@ Check whether --enable-threads was given.
+if test ${enable_threads+y}
+then :
+ enableval=$enable_threads; THREADS=$enableval
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thread model used by GCC" >&5
+printf %s "checking for thread model used by GCC... " >&6; }
+ THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
+ if test -z "$THREADS" -o "x$emscripten" = "xyes"; then
+ THREADS=no
+ fi
+ if test "$THREADS" = "posix"; then
+ case "$host" in
+ *-*-mingw*)
+ # Adjust thread model if cross-compiling for MinGW.
+ THREADS=win32
+ ;;
+ esac
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $THREADS" >&5
+printf "%s\n" "$THREADS" >&6; }
+fi
+
+
+@%:@ Check whether --enable-parallel-mark was given.
+if test ${enable_parallel_mark+y}
+then :
+ enableval=$enable_parallel_mark; case "$THREADS" in
+ no | none | single)
+ if test "${enable_parallel_mark}" != no; then
+ as_fn_error $? "Parallel mark requires --enable-threads=x spec" "$LINENO" 5
+ fi
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-thread-local-alloc was given.
+if test ${enable_thread_local_alloc+y}
+then :
+ enableval=$enable_thread_local_alloc; case "$THREADS" in
+ no | none | single)
+ if test "${enable_thread_local_alloc}" = yes; then
+ as_fn_error $? "Thread-local allocation requires --enable-threads=x spec" "$LINENO" 5
+ fi
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-threads-discovery was given.
+if test ${enable_threads_discovery+y}
+then :
+ enableval=$enable_threads_discovery;
+fi
+
+if test "${enable_threads_discovery}" = no; then
+
+printf "%s\n" "@%:@define GC_NO_THREADS_DISCOVERY 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-cplusplus was given.
+if test ${enable_cplusplus+y}
+then :
+ enableval=$enable_cplusplus;
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+CFLAGS="$old_CFLAGS"
+
+THREADDLLIBS=
+need_atomic_ops_asm=false
+need_lib_rt=false
+compile_asm=false
+use_parallel_mark=no
+use_thread_local_alloc=no
+# Libraries needed to support dynamic loading and/or threads.
+case "$THREADS" in
+ no | none | single)
+ THREADS=none
+ ;;
+ posix | pthreads)
+ THREADS=posix
+ default_threadlibs=false
+ # Common defines for most POSIX platforms.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-dragonfly* | \
+ *-*-freebsd* | *-*-haiku* | *-*-hpux11* | *-*-irix* | \
+ *-*-kfreebsd*-gnu | *-*-gnu* | *-*-*linux* | *-*-msys* | *-*-nacl* | \
+ *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define _REENTRANT 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ default_threadlibs=true
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&2;}
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5
+printf %s "checking for pthread_self in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char pthread_self ();
+int
+main (void)
+{
+return pthread_self ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_self=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_self=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_self" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_self" = xyes
+then :
+ THREADDLLIBS="-lpthread"
+fi
+
+ case "$host" in
+ *-*-hpux11*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Only HP/UX 11 POSIX threads are supported.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Only HP/UX 11 POSIX threads are supported.\"" >&2;}
+ printf "%s\n" "@%:@define _POSIX_C_SOURCE 199506L" >>confdefs.h
+
+ THREADDLLIBS="-lpthread"
+ # HPUX needs REENTRANT for the _r calls.
+ need_lib_rt=true
+ ;;
+ *-*-openbsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-freebsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ ;;
+ *-*-kfreebsd*-gnu)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-gnu*) # E.g. linux but excluding kfreebsd.
+ # The default THREADDLLIBS.
+ ;;
+ *-*-netbsd*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Only on NetBSD 2.0 or later.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Only on NetBSD 2.0 or later.\"" >&2;}
+ printf "%s\n" "@%:@define _PTHREADS 1" >>confdefs.h
+
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-solaris*)
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-cygwin* | *-*-msys*)
+ # Cygwin doesn't have a real libpthread, so Libtool can't link
+ # against it.
+ THREADDLLIBS=""
+ win32_threads=true
+ ;;
+ *-*-mingw*)
+ printf "%s\n" "@%:@define GC_WIN32_PTHREADS 1" >>confdefs.h
+
+ # Using pthreads-win32 (or other non-Cygwin pthreads) library.
+ THREADDLLIBS="-lpthread"
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ win32_threads=true
+ ;;
+ *-*-darwin*)
+ darwin_threads=true
+ ;;
+ *-*-osf*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *)
+ if test x$default_threadlibs != xtrue
+then :
+ as_fn_error $? "Pthreads not supported by the GC on this platform" "$LINENO" 5
+fi
+ # The default THREADDLLIBS.
+ ;;
+ esac
+ case "$host" in
+ sparc*-*-solaris*)
+ if test "$GCC" != yes; then
+ need_atomic_ops_asm=true
+ fi
+ ;;
+ esac
+ ;;
+ mcf | win32)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ if test "${enable_parallel_mark}" != no \
+ -o "${enable_shared}" != yes -o "${enable_static}" != no; then
+ # Imply THREAD_LOCAL_ALLOC unless GC_DLL.
+ use_thread_local_alloc=$enable_thread_local_alloc
+ fi
+ if test "${enable_win32_dllmain}" = yes; then
+
+printf "%s\n" "@%:@define GC_INSIDE_DLL 1" >>confdefs.h
+
+ fi
+ win32_threads=true
+
+printf "%s\n" "@%:@define EMPTY_GETENV_RESULTS 1" >>confdefs.h
+
+ ;;
+ dgux386)
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ # Use pthread GCC switch
+ THREADDLLIBS=-pthread
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&2;}
+ AM_CFLAGS="-pthread $AM_CFLAGS"
+ ;;
+ aix)
+ THREADS=posix
+ THREADDLLIBS=-lpthread
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ printf "%s\n" "@%:@define _REENTRANT 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ rtems)
+ THREADS=posix
+ printf "%s\n" "@%:@define GC_THREADS 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ decosf1 | irix | mach | os2 | solaris | dce | vxworks)
+ as_fn_error $? "thread package $THREADS not yet supported" "$LINENO" 5
+ ;;
+ *)
+ as_fn_error $? "$THREADS is an unknown thread package" "$LINENO" 5
+ ;;
+esac
+
+# Check whether -lrt linker option is needed to use clock_gettime.
+if test "x$need_lib_rt" != xtrue; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime without additional libraries" >&5
+printf %s "checking for clock_gettime without additional libraries... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <time.h>
+int
+main (void)
+{
+struct timespec t; clock_gettime(CLOCK_REALTIME, &t)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
+printf %s "checking for clock_gettime in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_clock_gettime+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char clock_gettime ();
+int
+main (void)
+{
+return clock_gettime ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_rt_clock_gettime=yes
+else $as_nop
+ ac_cv_lib_rt_clock_gettime=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5
+printf "%s\n" "$ac_cv_lib_rt_clock_gettime" >&6; }
+if test "x$ac_cv_lib_rt_clock_gettime" = xyes
+then :
+ need_lib_rt=true
+fi
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+if test "x$need_lib_rt" = xtrue; then
+ THREADDLLIBS="$THREADDLLIBS -lrt"
+fi
+
+
+ if test x$THREADS != xnone; then
+ THREADS_TRUE=
+ THREADS_FALSE='#'
+else
+ THREADS_TRUE='#'
+ THREADS_FALSE=
+fi
+
+ if test x$THREADS = xposix; then
+ PTHREADS_TRUE=
+ PTHREADS_FALSE='#'
+else
+ PTHREADS_TRUE='#'
+ PTHREADS_FALSE=
+fi
+
+ if test x$darwin_threads = xtrue; then
+ DARWIN_THREADS_TRUE=
+ DARWIN_THREADS_FALSE='#'
+else
+ DARWIN_THREADS_TRUE='#'
+ DARWIN_THREADS_FALSE=
+fi
+
+ if test x$win32_threads = xtrue; then
+ WIN32_THREADS_TRUE=
+ WIN32_THREADS_FALSE='#'
+else
+ WIN32_THREADS_TRUE='#'
+ WIN32_THREADS_FALSE=
+fi
+
+
+compiler_suncc=no
+pthread_start_standalone=no
+case "$host" in
+ *-*-*linux*)
+ # Turn on the workaround described in pthread_start.c.
+ if test "$THREADS" = posix
+then :
+ pthread_start_standalone=yes
+fi
+ ;;
+ powerpc-*-darwin*)
+ powerpc_darwin=true
+ ;;
+ *-*-solaris*)
+ if test "$GCC" != yes; then
+ # Solaris SunCC
+ compiler_suncc=yes
+ CFLAGS="-O $CFLAGS"
+ fi
+ ;;
+ *-*-wince*)
+ if test "$enable_gc_debug" != "no"; then
+
+printf "%s\n" "@%:@define GC_READ_ENV_FILE 1" >>confdefs.h
+
+ fi
+ ;;
+esac
+ if test x$pthread_start_standalone = xyes; then
+ PTHREAD_START_STANDALONE_TRUE=
+ PTHREAD_START_STANDALONE_FALSE='#'
+else
+ PTHREAD_START_STANDALONE_TRUE='#'
+ PTHREAD_START_STANDALONE_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ # Output all warnings.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wextra" >&5
+printf %s "checking whether compiler supports -Wextra... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Wextra $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_cc_wextra=yes
+else $as_nop
+ ac_cv_cc_wextra=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_wextra" >&5
+printf "%s\n" "$ac_cv_cc_wextra" >&6; }
+ if test "$ac_cv_cc_wextra" = yes
+then :
+ WEXTRA="-Wextra"
+else $as_nop
+ WEXTRA="-W"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wpedantic" >&5
+printf %s "checking whether compiler supports -Wpedantic... " >&6; }
+ CFLAGS="-Wpedantic -Wno-long-long $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ extern int quiet;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_cc_pedantic=yes
+else $as_nop
+ ac_cv_cc_pedantic=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_pedantic" >&5
+printf "%s\n" "$ac_cv_cc_pedantic" >&6; }
+ WPEDANTIC=
+ if test "$ac_cv_cc_pedantic" = yes
+then :
+ WPEDANTIC="-Wpedantic -Wno-long-long"
+fi
+ CFLAGS="-Wall $WEXTRA $WPEDANTIC $CFLAGS"
+ CXXFLAGS="-Wall $WEXTRA $WPEDANTIC $CXXFLAGS"
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xlc" >&5
+printf %s "checking for xlc... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ #ifndef __xlC__
+ # error
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ compiler_xlc=yes
+else $as_nop
+ compiler_xlc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $compiler_xlc" >&5
+printf "%s\n" "$compiler_xlc" >&6; }
+if test $compiler_xlc = yes -a "$powerpc_darwin" = true; then
+ # the darwin stack-frame-walking code is completely broken on xlc
+
+printf "%s\n" "@%:@define DARWIN_DONT_PARSE_STACK 1" >>confdefs.h
+
+fi
+
+# XLC neither requires nor tolerates the unnecessary assembler goop.
+# Similar for the Sun C compiler.
+ if test $compiler_xlc = yes -o $compiler_suncc = yes; then
+ ASM_WITH_CPP_UNSUPPORTED_TRUE=
+ ASM_WITH_CPP_UNSUPPORTED_FALSE='#'
+else
+ ASM_WITH_CPP_UNSUPPORTED_TRUE='#'
+ ASM_WITH_CPP_UNSUPPORTED_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ # Disable aliasing optimization unless forced to.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fno-strict-aliasing" >&5
+printf %s "checking whether compiler supports -fno-strict-aliasing... " >&6; }
+ ac_cv_fno_strict_aliasing=no
+ for cflag in $CFLAGS; do
+ case "$cflag" in
+ -fstrict-aliasing)
+ # Opposite option already present
+ ac_cv_fno_strict_aliasing=skipped
+ break
+ ;;
+ esac
+ done
+ if test "$ac_cv_fno_strict_aliasing" != skipped; then
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_fno_strict_aliasing=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_fno_strict_aliasing" = yes
+then :
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+fi
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fno_strict_aliasing" >&5
+printf "%s\n" "$ac_cv_fno_strict_aliasing" >&6; }
+fi
+
+# Check for getcontext (uClibc can be configured without it, for example)
+ac_fn_c_check_func "$LINENO" "getcontext" "ac_cv_func_getcontext"
+if test "x$ac_cv_func_getcontext" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "@%:@define NO_GETCONTEXT 1" >>confdefs.h
+
+fi
+
+
+# Check whether dl_iterate_phdr exists (as a strong symbol).
+ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr"
+if test "x$ac_cv_func_dl_iterate_phdr" = xyes
+then :
+ printf "%s\n" "@%:@define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h
+
+fi
+
+
+case "$host" in
+# While IRIX 6 has libdl for the O32 and N32 ABIs, it's missing for N64
+# and unnecessary everywhere.
+ mips-sgi-irix6*) ;;
+# We never want libdl on darwin. It is a fake libdl that just ends up making
+# dyld calls anyway. The same applies to Cygwin.
+ *-*-cygwin* | *-*-darwin* | *-*-msys*)
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ THREADDLLIBS="$THREADDLLIBS -ldl"
+fi
+
+ ;;
+esac
+
+case "$host" in
+ *-*-hpux*)
+ avoid_cpp_lib=yes;;
+ *)
+ avoid_cpp_lib=no;
+ ;;
+esac
+ if test $avoid_cpp_lib = yes; then
+ AVOID_CPP_LIB_TRUE=
+ AVOID_CPP_LIB_FALSE='#'
+else
+ AVOID_CPP_LIB_TRUE='#'
+ AVOID_CPP_LIB_FALSE=
+fi
+
+
+# Check for various headers.
+ac_fn_c_check_header_compile "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default"
+if test "x$ac_cv_header_execinfo_h" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "@%:@define GC_MISSING_EXECINFO_H 1" >>confdefs.h
+
+fi
+
+
+# extra LD Flags which are required for targets
+case "${host}" in
+ *-*-darwin*)
+ extra_ldflags_libgc=-Wl,-single_module
+ ;;
+esac
+
+
+
+
+target_all=libgc.la
+
+
+TARGET_ECOS="no"
+
+@%:@ Check whether --with-ecos was given.
+if test ${with_ecos+y}
+then :
+ withval=$with_ecos; TARGET_ECOS="$with_ecos"
+
+fi
+
+
+addobjs=
+addlibs=
+CXXLIBS=
+
+case "$TARGET_ECOS" in
+ no)
+ ;;
+ *)
+
+printf "%s\n" "@%:@define ECOS 1" >>confdefs.h
+
+ AM_CPPFLAGS="-I${TARGET_ECOS}/include $AM_CPPFLAGS"
+ addobjs="$addobjs ecos.lo"
+ ;;
+esac
+
+ if test "${enable_cplusplus}" = yes; then
+ CPLUSPLUS_TRUE=
+ CPLUSPLUS_FALSE='#'
+else
+ CPLUSPLUS_TRUE='#'
+ CPLUSPLUS_FALSE=
+fi
+
+
+@%:@ Check whether --enable-throw-bad-alloc-library was given.
+if test ${enable_throw_bad_alloc_library+y}
+then :
+ enableval=$enable_throw_bad_alloc_library;
+fi
+
+ if test "${enable_cplusplus}" = yes \
+ -a "${enable_throw_bad_alloc_library}" != no; then
+ GC_TBA_LIBRARY_TRUE=
+ GC_TBA_LIBRARY_FALSE='#'
+else
+ GC_TBA_LIBRARY_TRUE='#'
+ GC_TBA_LIBRARY_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ if test "${enable_cplusplus}" = yes; then
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libsupc++ required" >&5
+printf %s "checking whether libsupc++ required... " >&6; }
+ SUPC="`$CXX -print-file-name=libsupc++.a 2>/dev/null`"
+ if test -n "$SUPC" -a "$SUPC" != "libsupc++.a"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ CXXLIBS="-lsupc++"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ esac
+ fi
+fi
+
+
+
+
+
+
+# Configuration of shared libraries
+#
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+@%:@ Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+case "$host" in
+ alpha-*-openbsd*)
+ enable_shared=no
+ ;;
+ *)
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+# Compile with GC_DLL defined unless building static libraries.
+if test "${enable_shared}" != no -a "${enable_static}" != yes; then
+ printf "%s\n" "@%:@define GC_DLL 1" >>confdefs.h
+
+ if test "$GCC" = yes; then
+ # Pass -fvisibility=hidden option if supported
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fvisibility" >&5
+printf %s "checking whether compiler supports -fvisibility... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Werror -fvisibility=hidden $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_fvisibility_hidden=yes
+else $as_nop
+ ac_cv_fvisibility_hidden=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_fvisibility_hidden" = yes
+then :
+ CFLAGS="-DGC_VISIBILITY_HIDDEN_SET -fvisibility=hidden $CFLAGS"
+else $as_nop
+ CFLAGS="-DGC_NO_VISIBILITY $CFLAGS"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fvisibility_hidden" >&5
+printf "%s\n" "$ac_cv_fvisibility_hidden" >&6; }
+ fi
+else
+
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ # Do not require the clients to link with "user32" system library.
+
+printf "%s\n" "@%:@define DONT_USE_USER32_DLL 1" >>confdefs.h
+
+ # Use inline version of GC new and delete operators in test_cpp
+ # otherwise the system ones might be used instead because of arbitrary
+ # ordering of object files when linking.
+ CXXFLAGS="$CXXFLAGS -DGC_NOT_DLL"
+ ;;
+ esac
+fi
+
+# Configuration of machine-dependent code
+#
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which machine-dependent code should be used" >&5
+printf %s "checking which machine-dependent code should be used... " >&6; }
+machdep=
+case "$host" in
+ alpha-*-openbsd*)
+ if test x"${ac_cv_lib_dl_dlopen}" != xyes ; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"OpenBSD/Alpha without dlopen(). Shared library support is disabled.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"OpenBSD/Alpha without dlopen(). Shared library support is disabled.\"" >&2;}
+ fi
+ ;;
+ i?86-*-solaris2.[89])
+ # PROC_VDB appears to work in 2.8 and 2.9 but not in 2.10+ (for now).
+
+printf "%s\n" "@%:@define SOLARIS25_PROC_VDB_BUG_FIXED 1" >>confdefs.h
+
+ ;;
+ sparc-*-netbsd*)
+ machdep="sparc_netbsd_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc*-*-linux* | sparc*-*-openbsd* | sparc64-*-freebsd* | sparc64-*-netbsd*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc-sun-solaris2.3)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+
+printf "%s\n" "@%:@define SUNOS53_SHARED_LIB 1" >>confdefs.h
+
+ ;;
+ sparc*-sun-solaris2*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ ia64-*-*)
+ machdep="ia64_save_regs_in_stack.lo"
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $machdep" >&5
+printf "%s\n" "$machdep" >&6; }
+addobjs="$addobjs $machdep"
+
+
+
+
+
+# Suppress "extension used" clang warning (when compiling .S files).
+if test x$compile_asm = xtrue -a "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-language-extension-token" >&5
+printf %s "checking whether compiler supports -Wno-language-extension-token... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-language-extension-token"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_lang_ext_token=yes
+else $as_nop
+ ac_cv_lang_ext_token=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_lang_ext_token" = yes
+then :
+ CFLAGS="$CFLAGS -Wno-language-extension-token"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lang_ext_token" >&5
+printf "%s\n" "$ac_cv_lang_ext_token" >&6; }
+fi
+
+
+@%:@ Check whether --with-target-subdir was given.
+if test ${with_target_subdir+y}
+then :
+ withval=$with_target_subdir;
+fi
+
+
+@%:@ Check whether --with-cross-host was given.
+if test ${with_cross_host+y}
+then :
+ withval=$with_cross_host;
+fi
+
+
+if false; then
+ :
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether AIX gcc optimization fix is necessary" >&5
+printf %s "checking whether AIX gcc optimization fix is necessary... " >&6; }
+case "$host" in
+ *aix*)
+ if test "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ new_CFLAGS=
+ for i in $CFLAGS; do
+ case "$i" in
+ -O*)
+ ;;
+ *)
+ new_CFLAGS="$new_CFLAGS $i"
+ ;;
+ esac
+ done
+ CFLAGS="$new_CFLAGS"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
+
+
+printf "%s\n" "@%:@define NO_EXECUTE_PERMISSION 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define ALL_INTERIOR_POINTERS 1" >>confdefs.h
+
+
+
+@%:@ Check whether --enable-gcj-support was given.
+if test ${enable_gcj_support+y}
+then :
+ enableval=$enable_gcj_support;
+fi
+
+if test x"$enable_gcj_support" != xno; then
+
+printf "%s\n" "@%:@define GC_GCJ_SUPPORT 1" >>confdefs.h
+
+ case "$host" in
+ *-*-kfreebsd*-gnu)
+ # FIXME: For a reason, gctest hangs up on kFreeBSD if both of
+ # THREAD_LOCAL_ALLOC and GC_ENABLE_SUSPEND_THREAD are defined.
+ if test "${enable_thread_local_alloc}" = no; then
+ printf "%s\n" "@%:@define GC_ENABLE_SUSPEND_THREAD 1" >>confdefs.h
+
+ fi
+ ;;
+ *)
+
+printf "%s\n" "@%:@define GC_ENABLE_SUSPEND_THREAD 1" >>confdefs.h
+
+ ;;
+ esac
+fi
+ if test x"enable_gcj_support" != xno; then
+ ENABLE_GCJ_SUPPORT_TRUE=
+ ENABLE_GCJ_SUPPORT_FALSE='#'
+else
+ ENABLE_GCJ_SUPPORT_TRUE='#'
+ ENABLE_GCJ_SUPPORT_FALSE=
+fi
+
+
+@%:@ Check whether --enable-sigrt-signals was given.
+if test ${enable_sigrt_signals+y}
+then :
+ enableval=$enable_sigrt_signals;
+fi
+
+if test x"${enable_sigrt_signals}" = xyes; then
+
+printf "%s\n" "@%:@define GC_USESIGRT_SIGNALS 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+UNWINDLIBS=
+@%:@ Check whether --enable-gc-debug was given.
+if test ${enable_gc_debug+y}
+then :
+ enableval=$enable_gc_debug; if test "$enable_gc_debug" = "yes"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Should define GC_DEBUG and use debug alloc in clients.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Should define GC_DEBUG and use debug alloc in clients.\"" >&2;}
+
+printf "%s\n" "@%:@define KEEP_BACK_PTRS 1" >>confdefs.h
+
+ keep_back_ptrs=true
+
+printf "%s\n" "@%:@define DBG_HDRS_ALL 1" >>confdefs.h
+
+
+
+ case $host in
+ ia64-*-linux* )
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ printf "%s\n" "@%:@define SAVE_CALL_COUNT 8" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for backtrace in -lunwind" >&5
+printf %s "checking for backtrace in -lunwind... " >&6; }
+if test ${ac_cv_lib_unwind_backtrace+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lunwind $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char backtrace ();
+int
+main (void)
+{
+return backtrace ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_unwind_backtrace=yes
+else $as_nop
+ ac_cv_lib_unwind_backtrace=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_unwind_backtrace" >&5
+printf "%s\n" "$ac_cv_lib_unwind_backtrace" >&6; }
+if test "x$ac_cv_lib_unwind_backtrace" = xyes
+then :
+
+ printf "%s\n" "@%:@define GC_HAVE_BUILTIN_BACKTRACE 1" >>confdefs.h
+
+ UNWINDLIBS=-lunwind
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Client code may need to link against libunwind.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Client code may need to link against libunwind.\"" >&2;}
+
+fi
+
+ ;;
+ x86-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&2;}
+ printf "%s\n" "@%:@define SAVE_CALL_COUNT 8" >>confdefs.h
+
+ ;;
+ i345686-*-dgux*)
+ printf "%s\n" "@%:@define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+fi
+
+ if test x"$enable_gc_debug" = xyes; then
+ MAKE_BACK_GRAPH_TRUE=
+ MAKE_BACK_GRAPH_FALSE='#'
+else
+ MAKE_BACK_GRAPH_TRUE='#'
+ MAKE_BACK_GRAPH_FALSE=
+fi
+
+ if test x"$keep_back_ptrs" = xtrue; then
+ KEEP_BACK_PTRS_TRUE=
+ KEEP_BACK_PTRS_FALSE='#'
+else
+ KEEP_BACK_PTRS_TRUE='#'
+ KEEP_BACK_PTRS_FALSE=
+fi
+
+
+# Check whether a compiler warning of unsafe __builtin_return_address(1)
+# could be suppressed by -Wno-frame-address option.
+# __builtin_return_address(1) is used by libgc for debugging purposes only.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -Wno-frame-address works" >&5
+printf %s "checking whether -Wno-frame-address works... " >&6; }
+use_wno_error_frame_address=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Werror -Wno-frame-address $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+{
+ if (!__builtin_return_address(1)) return 1;
+}
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ use_wno_error_frame_address=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $use_wno_error_frame_address" >&5
+printf "%s\n" "$use_wno_error_frame_address" >&6; }
+if test x"$use_wno_error_frame_address" = xyes; then
+ CFLAGS="$CFLAGS -Wno-frame-address"
+fi
+
+# Check for dladdr (used for debugging).
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dladdr" >&5
+printf %s "checking for dladdr... " >&6; }
+have_dladdr=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _GNU_SOURCE 1
+#include <dlfcn.h>
+int
+main (void)
+{
+{
+ Dl_info info;
+ (void)dladdr("", &info);
+}
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ have_dladdr=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_dladdr" >&5
+printf "%s\n" "$have_dladdr" >&6; }
+if test x"$have_dladdr" = xyes; then
+
+printf "%s\n" "@%:@define HAVE_DLADDR 1" >>confdefs.h
+
+fi
+
+# sigsetjmp could be a macro (thus AC_CHECK_FUNCS cannot be used).
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sigsetjmp" >&5
+printf %s "checking for sigsetjmp... " >&6; }
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <setjmp.h>
+int
+main (void)
+{
+sigjmp_buf t; sigsetjmp(t, 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+printf "%s\n" "@%:@define GC_NO_SIGSETJMP 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+
+# pthread_setname_np, if available, may have 1, 2 or 3 arguments.
+if test "$THREADS" = posix
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_setname_np" >&5
+printf %s "checking for pthread_setname_np... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -Werror"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np("thread-name")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (w/o tid)" >&5
+printf "%s\n" "yes (w/o tid)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID 1" >>confdefs.h
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np(pthread_self(), "thread-name-%u", 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (with tid and arg)" >&5
+printf "%s\n" "yes (with tid and arg)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG 1" >>confdefs.h
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np(pthread_self(), "thread-name")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (with tid)" >&5
+printf "%s\n" "yes (with tid)" >&6; }
+
+printf "%s\n" "@%:@define HAVE_PTHREAD_SETNAME_NP_WITH_TID 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for AViiON Machines running DGUX
+ac_is_dgux=no
+ac_fn_c_check_header_compile "$LINENO" "sys/dg_sys_info.h" "ac_cv_header_sys_dg_sys_info_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_dg_sys_info_h" = xyes
+then :
+ ac_is_dgux=yes;
+fi
+
+
+if test $ac_is_dgux = yes; then
+ dgux_spec_opts="-DDGUX -D_DGUX_SOURCE -Di386 -mno-legend -O2"
+ CFLAGS="$dgux_spec_opts $CFLAGS"
+ CXXFLAGS="$dgux_spec_opts $CXXFLAGS"
+ if test "$enable_gc_debug" = "yes"; then
+ CFLAGS="-g -mstandard $CFLAGS"
+ CXXFLAGS="-g -mstandard $CXXFLAGS"
+ fi
+
+
+fi
+
+@%:@ Check whether --enable-java-finalization was given.
+if test ${enable_java_finalization+y}
+then :
+ enableval=$enable_java_finalization;
+fi
+
+if test x"$enable_java_finalization" != xno; then
+
+printf "%s\n" "@%:@define JAVA_FINALIZATION 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-atomic-uncollectable was given.
+if test ${enable_atomic_uncollectable+y}
+then :
+ enableval=$enable_atomic_uncollectable;
+fi
+
+if test x"$enable_atomic_uncollectible" != x"no"; then
+
+printf "%s\n" "@%:@define GC_ATOMIC_UNCOLLECTABLE 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-redirect-malloc was given.
+if test ${enable_redirect_malloc+y}
+then :
+ enableval=$enable_redirect_malloc;
+fi
+
+
+if test "${enable_redirect_malloc}" = yes; then
+ if test "${enable_gc_debug}" = yes; then
+
+printf "%s\n" "@%:@define REDIRECT_MALLOC GC_debug_malloc_replacement" >>confdefs.h
+
+
+printf "%s\n" "@%:@define REDIRECT_REALLOC GC_debug_realloc_replacement" >>confdefs.h
+
+
+printf "%s\n" "@%:@define REDIRECT_FREE GC_debug_free" >>confdefs.h
+
+ else
+ printf "%s\n" "@%:@define REDIRECT_MALLOC GC_malloc" >>confdefs.h
+
+ fi
+
+printf "%s\n" "@%:@define GC_USE_DLOPEN_WRAP 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-disclaim was given.
+if test ${enable_disclaim+y}
+then :
+ enableval=$enable_disclaim;
+fi
+
+if test x"$enable_disclaim" != xno; then
+
+printf "%s\n" "@%:@define ENABLE_DISCLAIM 1" >>confdefs.h
+
+fi
+ if test x"$enable_disclaim" != xno; then
+ ENABLE_DISCLAIM_TRUE=
+ ENABLE_DISCLAIM_FALSE='#'
+else
+ ENABLE_DISCLAIM_TRUE='#'
+ ENABLE_DISCLAIM_FALSE=
+fi
+
+
+@%:@ Check whether --enable-large-config was given.
+if test ${enable_large_config+y}
+then :
+ enableval=$enable_large_config;
+fi
+
+if test "${enable_large_config}" = yes; then
+
+printf "%s\n" "@%:@define LARGE_CONFIG 1" >>confdefs.h
+
+fi
+
+if test -n "${with_cross_host}"; then
+
+printf "%s\n" "@%:@define NO_CLOCK 1" >>confdefs.h
+
+
+printf "%s\n" "@%:@define SMALL_CONFIG 1" >>confdefs.h
+
+fi
+
+if test "$enable_gc_debug" = "no"; then
+
+printf "%s\n" "@%:@define NO_DEBUGGING 1" >>confdefs.h
+
+fi
+
+
+
+@%:@ Check whether --enable-gc-assertions was given.
+if test ${enable_gc_assertions+y}
+then :
+ enableval=$enable_gc_assertions;
+fi
+
+if test "${enable_gc_assertions}" = yes; then
+
+printf "%s\n" "@%:@define GC_ASSERTIONS 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-mmap was given.
+if test ${enable_mmap+y}
+then :
+ enableval=$enable_mmap; gc_use_mmap=$enableval
+fi
+
+
+@%:@ Check whether --enable-munmap was given.
+if test ${enable_munmap+y}
+then :
+ enableval=$enable_munmap; MUNMAP_THRESHOLD=$enableval
+fi
+
+if test x$enable_munmap != xno; then
+
+printf "%s\n" "@%:@define USE_MMAP 1" >>confdefs.h
+
+
+
+printf "%s\n" "@%:@define USE_MUNMAP 1" >>confdefs.h
+
+ if test x$MUNMAP_THRESHOLD = x -o x$MUNMAP_THRESHOLD = xyes; then
+ MUNMAP_THRESHOLD=6
+ fi
+
+printf "%s\n" "@%:@define MUNMAP_THRESHOLD ${MUNMAP_THRESHOLD}" >>confdefs.h
+
+else
+ if test "${gc_use_mmap}" = "yes"; then
+
+printf "%s\n" "@%:@define USE_MMAP 1" >>confdefs.h
+
+ fi
+fi
+
+@%:@ Check whether --enable-dynamic-loading was given.
+if test ${enable_dynamic_loading+y}
+then :
+ enableval=$enable_dynamic_loading;
+fi
+
+if test "${enable_dynamic_loading}" = "no"; then
+
+printf "%s\n" "@%:@define IGNORE_DYNAMIC_LOADING 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-register-main-static-data was given.
+if test ${enable_register_main_static_data+y}
+then :
+ enableval=$enable_register_main_static_data;
+fi
+
+if test "${enable_register_main_static_data}" = "no"; then
+
+printf "%s\n" "@%:@define GC_DONT_REGISTER_MAIN_STATIC_DATA 1" >>confdefs.h
+
+fi
+
+@%:@ Check whether --enable-checksums was given.
+if test ${enable_checksums+y}
+then :
+ enableval=$enable_checksums;
+fi
+
+if test x$enable_checksums = xyes; then
+ if test x$enable_munmap != xno -o x$THREADS != xnone; then
+ as_fn_error $? "CHECKSUMS not compatible with USE_MUNMAP or threads" "$LINENO" 5
+ fi
+
+printf "%s\n" "@%:@define CHECKSUMS 1" >>confdefs.h
+
+fi
+ if test x$enable_checksums = xyes; then
+ CHECKSUMS_TRUE=
+ CHECKSUMS_FALSE='#'
+else
+ CHECKSUMS_TRUE='#'
+ CHECKSUMS_FALSE=
+fi
+
+
+ if test -z "$with_cross_host"; then
+ USE_LIBDIR_TRUE=
+ USE_LIBDIR_FALSE='#'
+else
+ USE_LIBDIR_TRUE='#'
+ USE_LIBDIR_FALSE=
+fi
+
+
+@%:@ Check whether --enable-werror was given.
+if test ${enable_werror+y}
+then :
+ enableval=$enable_werror; werror_flag=$enableval
+else $as_nop
+ werror_flag=no
+fi
+
+if test x$werror_flag = xyes; then
+ WERROR_CFLAGS="-Werror"
+ case "$host" in
+ # _dyld_bind_fully_image_containing_address is deprecated in OS X 10.5+
+ *-*-darwin*)
+ WERROR_CFLAGS="$WERROR_CFLAGS -Wno-deprecated-declarations"
+ ;;
+ esac
+fi
+
+
+@%:@ Check whether --enable-single-obj-compilation was given.
+if test ${enable_single_obj_compilation+y}
+then :
+ enableval=$enable_single_obj_compilation;
+else $as_nop
+ if test x"$enable_static" = xno
+then :
+ enable_single_obj_compilation=yes
+fi
+fi
+
+ if test x"$enable_single_obj_compilation" = xyes; then
+ SINGLE_GC_OBJ_TRUE=
+ SINGLE_GC_OBJ_FALSE='#'
+else
+ SINGLE_GC_OBJ_TRUE='#'
+ SINGLE_GC_OBJ_FALSE=
+fi
+
+
+@%:@ Check whether --enable-gcov was given.
+if test ${enable_gcov+y}
+then :
+ enableval=$enable_gcov;
+fi
+
+if test "$enable_gcov" = "yes"; then
+ CFLAGS="-D NTHREADS=20 $CFLAGS --coverage"
+ if test "${enable_shared}" = no; then
+ # FIXME: As of g++-4.8.4/x64, in case of shared library build, test_cpp
+ # linkage fails with "hidden symbol atexit is referenced by DSO" message.
+ CXXFLAGS="$CXXFLAGS --coverage"
+ fi
+ # Turn off optimization to get accurate line numbers.
+ CFLAGS=`echo "$CFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+ CXXFLAGS=`echo "$CXXFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+fi
+
+@%:@ Check whether --enable-docs was given.
+if test ${enable_docs+y}
+then :
+ enableval=$enable_docs;
+fi
+
+ if test x$enable_docs != xno; then
+ ENABLE_DOCS_TRUE=
+ ENABLE_DOCS_FALSE='#'
+else
+ ENABLE_DOCS_TRUE='#'
+ ENABLE_DOCS_FALSE=
+fi
+
+
+ if test x$enable_shared = xyes; then
+ ENABLE_SHARED_TRUE=
+ ENABLE_SHARED_FALSE='#'
+else
+ ENABLE_SHARED_TRUE='#'
+ ENABLE_SHARED_FALSE=
+fi
+
+
+# Atomic Ops
+# ----------
+
+# Do we want to use an external libatomic_ops? By default use it if it's
+# found.
+
+@%:@ Check whether --with-libatomic-ops was given.
+if test ${with_libatomic_ops+y}
+then :
+ withval=$with_libatomic_ops;
+else $as_nop
+ if test x"$THREADS" != xnone
+then :
+ with_libatomic_ops=check
+else $as_nop
+ with_libatomic_ops=none
+fi
+fi
+
+
+# Check whether compiler atomic intrinsics can be used.
+if test x"$with_libatomic_ops" = xcheck; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler intrinsics support" >&5
+printf %s "checking for compiler intrinsics support... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -DGC_BUILTIN_ATOMIC"
+ CFLAGS="$CFLAGS -I${srcdir}/include -I${srcdir}/tests"
+ if test "$cross_compiling" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: skipped because cross-compiling" >&5
+printf "%s\n" "skipped because cross-compiling" >&6; }
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "test_atomic_ops.c"
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ with_libatomic_ops=none
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for an external libatomic_ops if the above answer is "yes" or "check".
+# If not found, fail on "yes", and convert "check" to "no".
+# First, check that libatomic_ops usage is not disabled explicitly.
+missing_libatomic_ops=false
+if test x"$with_libatomic_ops" != xno -a x"$with_libatomic_ops" != xnone
+then :
+ missing_libatomic_ops=true
+fi
+
+
+if test x$missing_libatomic_ops = xtrue
+then :
+ ac_fn_c_check_header_compile "$LINENO" "atomic_ops.h" "ac_cv_header_atomic_ops_h" "$ac_includes_default"
+if test "x$ac_cv_header_atomic_ops_h" = xyes
+then :
+ missing_libatomic_ops=false
+fi
+
+fi
+if test x$missing_libatomic_ops = xtrue
+then :
+ if test x"$with_libatomic_ops" != xcheck
+then :
+ as_fn_error $? "An external libatomic_ops was not found" "$LINENO" 5
+fi
+ with_libatomic_ops=no
+fi
+
+# If we have neither an external or an internal version, offer a useful hint
+# and exit.
+if test x"$with_libatomic_ops" = xno \
+ -a ! -e "$srcdir/libatomic_ops/src/atomic_ops.h"
+then :
+ as_fn_error $? "libatomic_ops is required. You can either install it on
+ your system, or fetch and unpack a recent version into the
+ source directory and link or rename it to libatomic_ops." "$LINENO" 5
+fi
+
+# Finally, emit the definitions for bundled or external AO.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which libatomic_ops to use" >&5
+printf %s "checking which libatomic_ops to use... " >&6; }
+
+
+if test x"$with_libatomic_ops" != xno
+then :
+ if test x"$with_libatomic_ops" != xnone -a x"$THREADS" != xnone
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: external" >&5
+printf "%s\n" "external" >&6; }
+ ATOMIC_OPS_LIBS="-latomic_ops"
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+ if test x"$THREADS" != xnone
+then :
+
+printf "%s\n" "@%:@define GC_BUILTIN_ATOMIC 1" >>confdefs.h
+
+fi
+fi
+ AO_TRYLINK_CFLAGS=""
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: internal" >&5
+printf "%s\n" "internal" >&6; }
+ AO_TRYLINK_CFLAGS="-I${srcdir}/libatomic_ops/src"
+ ATOMIC_OPS_CFLAGS='-I$(top_builddir)/libatomic_ops/src -I$(top_srcdir)/libatomic_ops/src'
+ ATOMIC_OPS_LIBS=""
+
+ subdirs="$subdirs libatomic_ops"
+
+
+fi
+ if test x$with_libatomic_ops = xno -a x"$THREADS" != xnone; then
+ USE_INTERNAL_LIBATOMIC_OPS_TRUE=
+ USE_INTERNAL_LIBATOMIC_OPS_FALSE='#'
+else
+ USE_INTERNAL_LIBATOMIC_OPS_TRUE='#'
+ USE_INTERNAL_LIBATOMIC_OPS_FALSE=
+fi
+
+ if test x$with_libatomic_ops = xno -a x$need_atomic_ops_asm = xtrue; then
+ NEED_ATOMIC_OPS_ASM_TRUE=
+ NEED_ATOMIC_OPS_ASM_FALSE='#'
+else
+ NEED_ATOMIC_OPS_ASM_TRUE='#'
+ NEED_ATOMIC_OPS_ASM_FALSE=
+fi
+
+
+# Check whether particular AO primitives are emulated with locks.
+# The check below is based on the fact that linking with the libatomic_ops
+# binary file is not needed in case of absence of the emulation (except for
+# Solaris SPARC).
+if test x$with_libatomic_ops != xnone -a x$need_atomic_ops_asm != xtrue
+then :
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $AO_TRYLINK_CFLAGS $CFLAGS_EXTRA"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free AO_or primitive" >&5
+printf %s "checking for lock-free AO_or primitive... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;AO_or(&x,1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "@%:@define HAVE_LOCKFREE_AO_OR 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free AO load/store, test-and-set primitives" >&5
+printf %s "checking for lock-free AO load/store, test-and-set primitives... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;unsigned char c=0;AO_TS_t z=AO_TS_INITIALIZER;
+ (void)AO_test_and_set_acquire(&z);AO_CLEAR(&z);AO_compiler_barrier();
+ AO_store(&x,AO_load(&x)+1);AO_char_store(&c,AO_char_load(&c)+1);
+ AO_store_release(&x,AO_load_acquire(&x)+1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ use_thread_local_alloc=no
+
+printf "%s\n" "@%:@define BASE_ATOMIC_OPS_EMULATED 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test x$use_parallel_mark != xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free compare-and-swap and fetch-and-add primitives" >&5
+printf %s "checking for lock-free compare-and-swap and fetch-and-add primitives... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;(void)AO_fetch_and_add(&x,1);(void)AO_compare_and_swap(&x,1,2)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ use_parallel_mark=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ CFLAGS="$old_CFLAGS"
+fi
+
+if test x$use_parallel_mark != xno
+then :
+ printf "%s\n" "@%:@define PARALLEL_MARK 1" >>confdefs.h
+
+fi
+if test x$use_thread_local_alloc != xno
+then :
+ printf "%s\n" "@%:@define THREAD_LOCAL_ALLOC 1" >>confdefs.h
+
+fi
+ if test x$use_thread_local_alloc != xno; then
+ THREAD_LOCAL_ALLOC_TRUE=
+ THREAD_LOCAL_ALLOC_FALSE='#'
+else
+ THREAD_LOCAL_ALLOC_TRUE='#'
+ THREAD_LOCAL_ALLOC_FALSE=
+fi
+
+
+@%:@ Check whether --enable-handle-fork was given.
+if test ${enable_handle_fork+y}
+then :
+ enableval=$enable_handle_fork;
+fi
+
+if test "${enable_handle_fork}" = yes; then
+
+printf "%s\n" "@%:@define HANDLE_FORK 1" >>confdefs.h
+
+elif test "${enable_handle_fork}" = no; then
+
+printf "%s\n" "@%:@define NO_HANDLE_FORK 1" >>confdefs.h
+
+elif test "${enable_handle_fork}" != manual -a x$THREADS = xposix; then
+ # If the option is omitted, pthread_atfork handlers are installed
+ # by default for the targets where pthread_atfork is known to work.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-freebsd* | \
+ *-*-haiku* | *-*-hpux11* | *-*-irix* | *-*-kfreebsd*-gnu | \
+ *-*-*linux* | *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ printf "%s\n" "@%:@define HANDLE_FORK 1" >>confdefs.h
+
+ ;;
+ esac
+fi
+
+
+ac_config_files="$ac_config_files Makefile bdw-gc.pc"
+
+
+ac_config_commands="$ac_config_commands default"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIB@&t@OBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${EMSCRIPTEN_TRUE}" && test -z "${EMSCRIPTEN_FALSE}"; then
+ as_fn_error $? "conditional \"EMSCRIPTEN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THREADS_TRUE}" && test -z "${THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PTHREADS_TRUE}" && test -z "${PTHREADS_FALSE}"; then
+ as_fn_error $? "conditional \"PTHREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DARWIN_THREADS_TRUE}" && test -z "${DARWIN_THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"DARWIN_THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WIN32_THREADS_TRUE}" && test -z "${WIN32_THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"WIN32_THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PTHREAD_START_STANDALONE_TRUE}" && test -z "${PTHREAD_START_STANDALONE_FALSE}"; then
+ as_fn_error $? "conditional \"PTHREAD_START_STANDALONE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ASM_WITH_CPP_UNSUPPORTED_TRUE}" && test -z "${ASM_WITH_CPP_UNSUPPORTED_FALSE}"; then
+ as_fn_error $? "conditional \"ASM_WITH_CPP_UNSUPPORTED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AVOID_CPP_LIB_TRUE}" && test -z "${AVOID_CPP_LIB_FALSE}"; then
+ as_fn_error $? "conditional \"AVOID_CPP_LIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CPLUSPLUS_TRUE}" && test -z "${CPLUSPLUS_FALSE}"; then
+ as_fn_error $? "conditional \"CPLUSPLUS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GC_TBA_LIBRARY_TRUE}" && test -z "${GC_TBA_LIBRARY_FALSE}"; then
+ as_fn_error $? "conditional \"GC_TBA_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GCJ_SUPPORT_TRUE}" && test -z "${ENABLE_GCJ_SUPPORT_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_GCJ_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MAKE_BACK_GRAPH_TRUE}" && test -z "${MAKE_BACK_GRAPH_FALSE}"; then
+ as_fn_error $? "conditional \"MAKE_BACK_GRAPH\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${KEEP_BACK_PTRS_TRUE}" && test -z "${KEEP_BACK_PTRS_FALSE}"; then
+ as_fn_error $? "conditional \"KEEP_BACK_PTRS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DISCLAIM_TRUE}" && test -z "${ENABLE_DISCLAIM_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DISCLAIM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CHECKSUMS_TRUE}" && test -z "${CHECKSUMS_FALSE}"; then
+ as_fn_error $? "conditional \"CHECKSUMS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_LIBDIR_TRUE}" && test -z "${USE_LIBDIR_FALSE}"; then
+ as_fn_error $? "conditional \"USE_LIBDIR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SINGLE_GC_OBJ_TRUE}" && test -z "${SINGLE_GC_OBJ_FALSE}"; then
+ as_fn_error $? "conditional \"SINGLE_GC_OBJ\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DOCS_TRUE}" && test -z "${ENABLE_DOCS_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DOCS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INTERNAL_LIBATOMIC_OPS_TRUE}" && test -z "${USE_INTERNAL_LIBATOMIC_OPS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_INTERNAL_LIBATOMIC_OPS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${NEED_ATOMIC_OPS_ASM_TRUE}" && test -z "${NEED_ATOMIC_OPS_ASM_FALSE}"; then
+ as_fn_error $? "conditional \"NEED_ATOMIC_OPS_ASM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THREAD_LOCAL_ALLOC_TRUE}" && test -z "${THREAD_LOCAL_ALLOC_FALSE}"; then
+ as_fn_error $? "conditional \"THREAD_LOCAL_ALLOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in @%:@(
+ *posix*) :
+ set -o posix ;; @%:@(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in @%:@((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+
+@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD]
+@%:@ ----------------------------------------
+@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+@%:@ script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} @%:@ as_fn_error
+
+
+
+@%:@ as_fn_set_status STATUS
+@%:@ -----------------------
+@%:@ Set @S|@? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} @%:@ as_fn_set_status
+
+@%:@ as_fn_exit STATUS
+@%:@ -----------------
+@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} @%:@ as_fn_exit
+
+@%:@ as_fn_unset VAR
+@%:@ ---------------
+@%:@ Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+@%:@ as_fn_append VAR VALUE
+@%:@ ----------------------
+@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take
+@%:@ advantage of any shell optimizations that allow amortized linear growth over
+@%:@ repeated appends, instead of the typical quadratic growth present in naive
+@%:@ implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+@%:@ as_fn_arith ARG...
+@%:@ ------------------
+@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the
+@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments
+@%:@ must be portable across @S|@(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in @%:@(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_@&t@echo='printf %s\n'
+as_@&t@echo_n='printf %s'
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+@%:@ as_fn_mkdir_p
+@%:@ -------------
+@%:@ Create "@S|@as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} @%:@ as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+@%:@ as_fn_executable_p FILE
+@%:@ -----------------------
+@%:@ Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} @%:@ as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gc $as_me 8.2.8, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <https://github.com/ivmai/bdwgc/issues>."
+
+_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config='$ac_cs_config_escaped'
+ac_cs_version="\\
+gc config.status 8.2.8
+configured by $0, generated by GNU Autoconf 2.71,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ printf "%s\n" "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ printf "%s\n" "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ printf "%s\n" "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX
+@%:@@%:@ Running $as_me. @%:@@%:@
+_ASBOX
+ printf "%s\n" "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+FILECMD \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+
+
+
+
+ srcdir="${srcdir}"
+ host=${host}
+ CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ CC="${CC}"
+ DEFS="$DEFS"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "bdw-gc.pc") CONFIG_FILES="$CONFIG_FILES bdw-gc.pc" ;;
+ "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in @%:@(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; @%:@(
+ *) :
+ set x $CONFIG_FILES ;; @%:@(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "libtool":C)
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# A file(cmd) program that detects file types.
+FILECMD=$lt_FILECMD
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive (by configure).
+lt_ar_flags=$lt_ar_flags
+
+# Flags to create an archive.
+AR_FLAGS=\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ $SED '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+
+ cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file, --srcdir, and --disable-option-checking arguments
+ # so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ eval "set x $ac_configure_args"
+ shift
+ for ac_arg
+ do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case $ac_arg in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+ | --c=*)
+ ;;
+ --config-cache | -C)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ;;
+ --disable-option-checking)
+ ;;
+ *)
+ case $ac_arg in
+ *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
+ esac
+ done
+
+ # Always prepend --prefix to ensure using the same prefix
+ # in subdir configurations.
+ ac_arg="--prefix=$prefix"
+ case $ac_arg in
+ *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
+
+ # Pass --silent
+ if test "$silent" = yes; then
+ ac_sub_configure_args="--silent $ac_sub_configure_args"
+ fi
+
+ # Always prepend --disable-option-checking to silence warnings, since
+ # different subdirs can have different --enable and --with options.
+ ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
+
+ ac_popdir=`pwd`
+ for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ test -d "$srcdir/$ac_dir" || continue
+
+ ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
+ printf "%s\n" "$ac_msg" >&6
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ cd "$ac_dir"
+
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ ac_sub_configure=$ac_srcdir/configure.gnu
+ elif test -f "$ac_srcdir/configure"; then
+ ac_sub_configure=$ac_srcdir/configure
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
+printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+ # Make the cache file name correct relative to the subdirectory.
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+ *) # Relative name.
+ ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+printf "%s\n" "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+ # The eval makes quoting arguments work.
+ eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
+ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
+ as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
+ fi
+
+ cd "$ac_popdir"
+ done
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+ \ No newline at end of file
diff --git a/graphics/asymptote/gc/autom4te.cache/requests b/graphics/asymptote/gc/autom4te.cache/requests
new file mode 100644
index 0000000000..fa8f13a88e
--- /dev/null
+++ b/graphics/asymptote/gc/autom4te.cache/requests
@@ -0,0 +1,610 @@
+# This file was generated by Autom4te 2.71.
+# It contains the lists of macros which have been traced.
+# It can be safely removed.
+
+@request = (
+ bless( [
+ '0',
+ 1,
+ [
+ '/usr/share/autoconf'
+ ],
+ [
+ '/usr/share/autoconf/autoconf/autoconf.m4f',
+ '/usr/share/aclocal-1.16/internal/ac-config-macro-dirs.m4',
+ '/usr/share/aclocal/libtool.m4',
+ '/usr/share/aclocal/ltargz.m4',
+ '/usr/share/aclocal/ltdl.m4',
+ '/usr/share/aclocal/ltoptions.m4',
+ '/usr/share/aclocal/ltsugar.m4',
+ '/usr/share/aclocal/ltversion.m4',
+ '/usr/share/aclocal/lt~obsolete.m4',
+ '/usr/share/aclocal-1.16/amversion.m4',
+ '/usr/share/aclocal-1.16/as.m4',
+ '/usr/share/aclocal-1.16/auxdir.m4',
+ '/usr/share/aclocal-1.16/cond.m4',
+ '/usr/share/aclocal-1.16/depend.m4',
+ '/usr/share/aclocal-1.16/depout.m4',
+ '/usr/share/aclocal-1.16/init.m4',
+ '/usr/share/aclocal-1.16/install-sh.m4',
+ '/usr/share/aclocal-1.16/lead-dot.m4',
+ '/usr/share/aclocal-1.16/maintainer.m4',
+ '/usr/share/aclocal-1.16/make.m4',
+ '/usr/share/aclocal-1.16/missing.m4',
+ '/usr/share/aclocal-1.16/options.m4',
+ '/usr/share/aclocal-1.16/prog-cc-c-o.m4',
+ '/usr/share/aclocal-1.16/runlog.m4',
+ '/usr/share/aclocal-1.16/sanity.m4',
+ '/usr/share/aclocal-1.16/silent.m4',
+ '/usr/share/aclocal-1.16/strip.m4',
+ '/usr/share/aclocal-1.16/substnot.m4',
+ '/usr/share/aclocal-1.16/tar.m4',
+ 'm4/gc_set_version.m4',
+ 'configure.ac'
+ ],
+ {
+ '_AM_SET_OPTION' => 1,
+ 'AM_PROG_LD' => 1,
+ '_m4_warn' => 1,
+ '_AM_DEPENDENCIES' => 1,
+ 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1,
+ 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1,
+ '_LT_PROG_F77' => 1,
+ '_AM_SET_OPTIONS' => 1,
+ 'LT_LIB_M' => 1,
+ 'AC_LIBTOOL_F77' => 1,
+ '_LT_AC_PROG_ECHO_BACKSLASH' => 1,
+ 'LT_SYS_MODULE_PATH' => 1,
+ 'AC_LIBTOOL_LANG_RC_CONFIG' => 1,
+ 'm4_include' => 1,
+ '_LT_PATH_TOOL_PREFIX' => 1,
+ 'AC_DEPLIBS_CHECK_METHOD' => 1,
+ 'LTDL_INIT' => 1,
+ 'LTOBSOLETE_VERSION' => 1,
+ 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1,
+ 'LTSUGAR_VERSION' => 1,
+ 'AC_PATH_MAGIC' => 1,
+ 'AM_AUX_DIR_EXPAND' => 1,
+ 'AC_LTDL_SHLIBPATH' => 1,
+ 'AU_DEFUN' => 1,
+ 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1,
+ '_AC_AM_CONFIG_HEADER_HOOK' => 1,
+ '_AC_PROG_LIBTOOL' => 1,
+ 'AM_SILENT_RULES' => 1,
+ 'AM_SET_DEPDIR' => 1,
+ '_AM_SUBST_NOTMAKE' => 1,
+ 'AC_LIBTOOL_OBJDIR' => 1,
+ 'include' => 1,
+ 'AC_LIBTOOL_CONFIG' => 1,
+ 'AM_PROG_AS' => 1,
+ 'AM_CONDITIONAL' => 1,
+ 'AC_DEFUN_ONCE' => 1,
+ 'LT_SYS_DLOPEN_SELF' => 1,
+ 'LT_FUNC_ARGZ' => 1,
+ 'AC_PROG_LD' => 1,
+ 'AC_LIBTOOL_POSTDEP_PREDEP' => 1,
+ 'AC_PROG_NM' => 1,
+ 'AC_LTDL_PREOPEN' => 1,
+ 'AC_LIBTOOL_SYS_LIB_STRIP' => 1,
+ 'AC_DEFUN' => 1,
+ 'AM_SUBST_NOTMAKE' => 1,
+ 'GC_SET_VERSION' => 1,
+ 'AC_LTDL_ENABLE_INSTALL' => 1,
+ 'AC_LIBTOOL_LANG_C_CONFIG' => 1,
+ '_LT_AC_TRY_DLOPEN_SELF' => 1,
+ 'LTDL_INSTALLABLE' => 1,
+ '_LT_PROG_LTMAIN' => 1,
+ 'AC_PROG_LD_GNU' => 1,
+ 'AC_LIBTOOL_SETUP' => 1,
+ 'LT_SUPPORTED_TAG' => 1,
+ '_AM_IF_OPTION' => 1,
+ 'LT_PROG_RC' => 1,
+ '_LT_WITH_SYSROOT' => 1,
+ 'AC_DISABLE_SHARED' => 1,
+ 'AC_LIB_LTDL' => 1,
+ 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1,
+ 'AC_LIBTOOL_PROG_CC_C_O' => 1,
+ 'AM_MISSING_HAS_RUN' => 1,
+ 'LTOPTIONS_VERSION' => 1,
+ 'AM_PROG_LIBTOOL' => 1,
+ '_AM_AUTOCONF_VERSION' => 1,
+ 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1,
+ 'AC_LIBTOOL_LANG_F77_CONFIG' => 1,
+ 'LT_WITH_LTDL' => 1,
+ 'AM_PROG_INSTALL_SH' => 1,
+ '_LT_AC_PROG_CXXCPP' => 1,
+ 'AC_CHECK_LIBM' => 1,
+ 'AC_PROG_LIBTOOL' => 1,
+ '_LT_AC_LANG_F77_CONFIG' => 1,
+ 'AM_DISABLE_SHARED' => 1,
+ '_LT_AC_TAGVAR' => 1,
+ '_LT_REQUIRED_DARWIN_CHECKS' => 1,
+ 'AM_PROG_INSTALL_STRIP' => 1,
+ '_LT_CC_BASENAME' => 1,
+ '_LT_AC_LANG_F77' => 1,
+ 'AC_LIBTOOL_LINKER_OPTION' => 1,
+ 'LT_FUNC_DLSYM_USCORE' => 1,
+ '_LT_AC_CHECK_DLFCN' => 1,
+ 'AM_RUN_LOG' => 1,
+ 'LT_AC_PROG_EGREP' => 1,
+ 'LTDL_CONVENIENCE' => 1,
+ 'LT_SYS_DLOPEN_DEPLIBS' => 1,
+ 'LT_LIB_DLLOAD' => 1,
+ 'AC_DISABLE_FAST_INSTALL' => 1,
+ '_LT_AC_SHELL_INIT' => 1,
+ 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1,
+ '_AM_CONFIG_MACRO_DIRS' => 1,
+ 'AC_LIBTOOL_DLOPEN' => 1,
+ 'LT_CMD_MAX_LEN' => 1,
+ 'AM_PROG_NM' => 1,
+ 'LT_AC_PROG_SED' => 1,
+ 'AC_LTDL_SHLIBEXT' => 1,
+ 'AC_LTDL_SYSSEARCHPATH' => 1,
+ 'AC_LTDL_SYS_DLOPEN_DEPLIBS' => 1,
+ 'AM_SET_LEADING_DOT' => 1,
+ '_LT_PROG_ECHO_BACKSLASH' => 1,
+ 'LT_PATH_NM' => 1,
+ '_LT_LIBOBJ' => 1,
+ 'AC_ENABLE_SHARED' => 1,
+ 'AC_ENABLE_FAST_INSTALL' => 1,
+ 'AC_LIBTOOL_RC' => 1,
+ 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1,
+ 'AC_LIBTOOL_CXX' => 1,
+ 'AC_LIBLTDL_CONVENIENCE' => 1,
+ 'AC_ENABLE_STATIC' => 1,
+ 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1,
+ 'AC_LTDL_OBJDIR' => 1,
+ '_LT_LINKER_OPTION' => 1,
+ 'LT_INIT' => 1,
+ 'AC_LTDL_DLSYM_USCORE' => 1,
+ '_LT_AC_LANG_GCJ' => 1,
+ '_LT_PREPARE_SED_QUOTE_VARS' => 1,
+ 'LT_SYS_DLSEARCH_PATH' => 1,
+ '_LT_AC_LOCK' => 1,
+ '_LT_AC_LANG_C_CONFIG' => 1,
+ 'AM_ENABLE_STATIC' => 1,
+ '_LT_AC_LANG_GCJ_CONFIG' => 1,
+ 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1,
+ 'AM_ENABLE_SHARED' => 1,
+ '_LT_COMPILER_OPTION' => 1,
+ 'LT_SYS_MODULE_EXT' => 1,
+ '_LT_AC_LANG_RC_CONFIG' => 1,
+ 'LT_PROG_GCJ' => 1,
+ 'AM_MISSING_PROG' => 1,
+ 'LT_CONFIG_LTDL_DIR' => 1,
+ 'LT_AC_PROG_GCJ' => 1,
+ 'AM_MAKE_INCLUDE' => 1,
+ 'AC_PROG_EGREP' => 1,
+ 'LTVERSION_VERSION' => 1,
+ 'AM_PROG_CC_C_O' => 1,
+ 'm4_pattern_allow' => 1,
+ 'LT_LANG' => 1,
+ 'AC_DISABLE_STATIC' => 1,
+ 'AC_LIBTOOL_COMPILER_OPTION' => 1,
+ '_LTDL_SETUP' => 1,
+ 'AC_PATH_TOOL_PREFIX' => 1,
+ 'LT_SYS_SYMBOL_USCORE' => 1,
+ 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1,
+ 'm4_pattern_forbid' => 1,
+ 'AM_INIT_AUTOMAKE' => 1,
+ '_LT_AC_TAGCONFIG' => 1,
+ 'LT_OUTPUT' => 1,
+ 'AM_AUTOMAKE_VERSION' => 1,
+ 'LT_AC_PROG_RC' => 1,
+ '_LT_COMPILER_BOILERPLATE' => 1,
+ '_LT_DLL_DEF_P' => 1,
+ 'AC_LIBTOOL_WIN32_DLL' => 1,
+ '_LT_AC_SYS_COMPILER' => 1,
+ 'AC_CONFIG_MACRO_DIR' => 1,
+ 'AC_LTDL_DLLIB' => 1,
+ 'AC_LIBTOOL_DLOPEN_SELF' => 1,
+ 'AC_CONFIG_MACRO_DIR_TRACE' => 1,
+ '_AM_PROG_TAR' => 1,
+ '_LT_AC_FILE_LTDLL_C' => 1,
+ '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1,
+ 'AC_PROG_LD_RELOAD_FLAG' => 1,
+ 'AM_DEP_TRACK' => 1,
+ 'AC_WITH_LTDL' => 1,
+ 'AM_MAINTAINER_MODE' => 1,
+ 'AC_LIBTOOL_FC' => 1,
+ 'AC_LIBTOOL_PICMODE' => 1,
+ 'LT_PROG_GO' => 1,
+ '_LT_PROG_CXX' => 1,
+ 'LT_PATH_LD' => 1,
+ '_LT_AC_SYS_LIBPATH_AIX' => 1,
+ 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1,
+ '_AM_PROG_CC_C_O' => 1,
+ '_AM_MANGLE_OPTION' => 1,
+ '_LT_LINKER_BOILERPLATE' => 1,
+ 'AC_LIBTOOL_GCJ' => 1,
+ 'AC_LTDL_SYMBOL_USCORE' => 1,
+ '_LT_AC_LANG_CXX_CONFIG' => 1,
+ 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1,
+ '_LT_AC_LANG_CXX' => 1,
+ '_LT_PROG_FC' => 1,
+ 'AM_DISABLE_STATIC' => 1,
+ 'AM_SANITY_CHECK' => 1,
+ 'AC_LIBLTDL_INSTALLABLE' => 1
+ }
+ ], 'Autom4te::Request' ),
+ bless( [
+ '1',
+ 1,
+ [
+ '/usr/share/autoconf'
+ ],
+ [
+ '/usr/share/autoconf/autoconf/autoconf.m4f',
+ 'aclocal.m4',
+ 'configure.ac'
+ ],
+ {
+ 'AM_PROG_FC_C_O' => 1,
+ 'AC_SUBST' => 1,
+ 'AM_PROG_F77_C_O' => 1,
+ 'AC_CANONICAL_HOST' => 1,
+ 'AC_FC_FREEFORM' => 1,
+ 'LT_INIT' => 1,
+ 'sinclude' => 1,
+ 'AM_POT_TOOLS' => 1,
+ 'm4_sinclude' => 1,
+ 'AC_PROG_LIBTOOL' => 1,
+ 'AC_SUBST_TRACE' => 1,
+ 'AC_LIBSOURCE' => 1,
+ 'AM_MAINTAINER_MODE' => 1,
+ '_AM_SUBST_NOTMAKE' => 1,
+ 'AH_OUTPUT' => 1,
+ 'AM_SILENT_RULES' => 1,
+ '_AM_MAKEFILE_INCLUDE' => 1,
+ 'AM_PATH_GUILE' => 1,
+ 'AC_CANONICAL_TARGET' => 1,
+ 'include' => 1,
+ 'LT_CONFIG_LTDL_DIR' => 1,
+ 'AM_XGETTEXT_OPTION' => 1,
+ 'GTK_DOC_CHECK' => 1,
+ 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1,
+ 'AM_CONDITIONAL' => 1,
+ 'AM_PROG_CXX_C_O' => 1,
+ 'AC_CONFIG_HEADERS' => 1,
+ 'AM_PROG_CC_C_O' => 1,
+ 'm4_pattern_allow' => 1,
+ 'AC_DEFINE_TRACE_LITERAL' => 1,
+ 'AC_FC_PP_SRCEXT' => 1,
+ 'AC_CONFIG_LIBOBJ_DIR' => 1,
+ 'AC_CANONICAL_SYSTEM' => 1,
+ '_m4_warn' => 1,
+ 'IT_PROG_INTLTOOL' => 1,
+ 'AC_CONFIG_SUBDIRS' => 1,
+ '_AM_COND_ENDIF' => 1,
+ 'AM_PROG_MOC' => 1,
+ 'AM_INIT_AUTOMAKE' => 1,
+ 'AC_FC_SRCEXT' => 1,
+ 'AC_FC_PP_DEFINE' => 1,
+ 'AC_REQUIRE_AUX_FILE' => 1,
+ 'm4_pattern_forbid' => 1,
+ 'AM_AUTOMAKE_VERSION' => 1,
+ 'AM_ENABLE_MULTILIB' => 1,
+ 'm4_include' => 1,
+ 'AM_PROG_MKDIR_P' => 1,
+ 'AC_CONFIG_FILES' => 1,
+ '_LT_AC_TAGCONFIG' => 1,
+ 'AM_PROG_AR' => 1,
+ 'LT_SUPPORTED_TAG' => 1,
+ 'AM_GNU_GETTEXT' => 1,
+ 'AC_INIT' => 1,
+ '_AM_COND_ELSE' => 1,
+ 'AC_CANONICAL_BUILD' => 1,
+ 'AM_MAKEFILE_INCLUDE' => 1,
+ 'AC_CONFIG_LINKS' => 1,
+ 'AM_EXTRA_RECURSIVE_TARGETS' => 1,
+ 'AC_CONFIG_MACRO_DIR_TRACE' => 1,
+ '_AM_COND_IF' => 1,
+ 'AM_PROG_LIBTOOL' => 1,
+ 'AM_NLS' => 1,
+ 'AC_CONFIG_AUX_DIR' => 1
+ }
+ ], 'Autom4te::Request' ),
+ bless( [
+ '2',
+ 1,
+ [
+ '/usr/share/autoconf'
+ ],
+ [
+ '/usr/share/autoconf/autoconf/autoconf.m4f',
+ '/usr/share/aclocal-1.16/internal/ac-config-macro-dirs.m4',
+ '/usr/share/aclocal/ltargz.m4',
+ '/usr/share/aclocal/ltdl.m4',
+ '/usr/share/aclocal-1.16/amversion.m4',
+ '/usr/share/aclocal-1.16/as.m4',
+ '/usr/share/aclocal-1.16/auxdir.m4',
+ '/usr/share/aclocal-1.16/cond.m4',
+ '/usr/share/aclocal-1.16/depend.m4',
+ '/usr/share/aclocal-1.16/depout.m4',
+ '/usr/share/aclocal-1.16/init.m4',
+ '/usr/share/aclocal-1.16/install-sh.m4',
+ '/usr/share/aclocal-1.16/lead-dot.m4',
+ '/usr/share/aclocal-1.16/maintainer.m4',
+ '/usr/share/aclocal-1.16/make.m4',
+ '/usr/share/aclocal-1.16/missing.m4',
+ '/usr/share/aclocal-1.16/options.m4',
+ '/usr/share/aclocal-1.16/prog-cc-c-o.m4',
+ '/usr/share/aclocal-1.16/runlog.m4',
+ '/usr/share/aclocal-1.16/sanity.m4',
+ '/usr/share/aclocal-1.16/silent.m4',
+ '/usr/share/aclocal-1.16/strip.m4',
+ '/usr/share/aclocal-1.16/substnot.m4',
+ '/usr/share/aclocal-1.16/tar.m4',
+ 'm4/gc_set_version.m4',
+ 'm4/libtool.m4',
+ 'm4/ltoptions.m4',
+ 'm4/ltsugar.m4',
+ 'm4/ltversion.m4',
+ 'm4/lt~obsolete.m4',
+ 'configure.ac'
+ ],
+ {
+ 'LT_AC_PROG_EGREP' => 1,
+ 'LT_LIB_DLLOAD' => 1,
+ 'LTDL_CONVENIENCE' => 1,
+ 'LT_SYS_DLOPEN_DEPLIBS' => 1,
+ 'AC_LIBTOOL_LINKER_OPTION' => 1,
+ '_LT_AC_CHECK_DLFCN' => 1,
+ 'AM_RUN_LOG' => 1,
+ 'LT_FUNC_DLSYM_USCORE' => 1,
+ 'LT_AC_PROG_SED' => 1,
+ '_AM_CONFIG_MACRO_DIRS' => 1,
+ 'AM_PROG_NM' => 1,
+ 'LT_CMD_MAX_LEN' => 1,
+ 'AC_LIBTOOL_DLOPEN' => 1,
+ 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1,
+ '_LT_AC_SHELL_INIT' => 1,
+ 'AC_DISABLE_FAST_INSTALL' => 1,
+ 'AC_PROG_LIBTOOL' => 1,
+ '_LT_AC_LANG_F77_CONFIG' => 1,
+ '_LT_AC_PROG_CXXCPP' => 1,
+ 'AC_CHECK_LIBM' => 1,
+ '_LT_AC_LANG_F77' => 1,
+ '_LT_CC_BASENAME' => 1,
+ 'AM_PROG_INSTALL_STRIP' => 1,
+ '_LT_AC_TAGVAR' => 1,
+ 'AM_DISABLE_SHARED' => 1,
+ '_LT_REQUIRED_DARWIN_CHECKS' => 1,
+ '_LT_WITH_SYSROOT' => 1,
+ 'AC_LIB_LTDL' => 1,
+ 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1,
+ 'AC_DISABLE_SHARED' => 1,
+ 'LT_PROG_RC' => 1,
+ '_AM_IF_OPTION' => 1,
+ 'LTOPTIONS_VERSION' => 1,
+ 'AC_LIBTOOL_PROG_CC_C_O' => 1,
+ 'AM_MISSING_HAS_RUN' => 1,
+ 'AC_LIBTOOL_SETUP' => 1,
+ 'AC_PROG_LD_GNU' => 1,
+ 'LT_SUPPORTED_TAG' => 1,
+ '_LT_PROG_LTMAIN' => 1,
+ 'LT_WITH_LTDL' => 1,
+ 'AM_PROG_INSTALL_SH' => 1,
+ 'AC_LIBTOOL_LANG_F77_CONFIG' => 1,
+ 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1,
+ 'AM_PROG_LIBTOOL' => 1,
+ '_AM_AUTOCONF_VERSION' => 1,
+ 'AC_LIBTOOL_SYS_LIB_STRIP' => 1,
+ 'AC_LTDL_PREOPEN' => 1,
+ 'AC_LIBTOOL_POSTDEP_PREDEP' => 1,
+ 'AC_PROG_NM' => 1,
+ 'AC_LTDL_ENABLE_INSTALL' => 1,
+ 'LTDL_INSTALLABLE' => 1,
+ '_LT_AC_TRY_DLOPEN_SELF' => 1,
+ 'AC_LIBTOOL_LANG_C_CONFIG' => 1,
+ 'GC_SET_VERSION' => 1,
+ 'AM_SUBST_NOTMAKE' => 1,
+ 'AC_DEFUN' => 1,
+ 'include' => 1,
+ 'AC_LIBTOOL_CONFIG' => 1,
+ 'AC_LIBTOOL_OBJDIR' => 1,
+ 'AC_PROG_LD' => 1,
+ 'LT_FUNC_ARGZ' => 1,
+ 'LT_SYS_DLOPEN_SELF' => 1,
+ 'AC_DEFUN_ONCE' => 1,
+ 'AM_CONDITIONAL' => 1,
+ 'AM_PROG_AS' => 1,
+ 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1,
+ 'AU_DEFUN' => 1,
+ 'AC_LTDL_SHLIBPATH' => 1,
+ '_AM_SUBST_NOTMAKE' => 1,
+ 'AM_SET_DEPDIR' => 1,
+ 'AM_SILENT_RULES' => 1,
+ '_AC_AM_CONFIG_HEADER_HOOK' => 1,
+ '_AC_PROG_LIBTOOL' => 1,
+ '_LT_PATH_TOOL_PREFIX' => 1,
+ 'LTSUGAR_VERSION' => 1,
+ 'AM_AUX_DIR_EXPAND' => 1,
+ 'AC_PATH_MAGIC' => 1,
+ 'LTDL_INIT' => 1,
+ 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1,
+ 'LTOBSOLETE_VERSION' => 1,
+ 'AC_DEPLIBS_CHECK_METHOD' => 1,
+ 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1,
+ '_LT_PROG_F77' => 1,
+ '_AM_SET_OPTIONS' => 1,
+ 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1,
+ '_m4_warn' => 1,
+ '_AM_DEPENDENCIES' => 1,
+ 'AM_PROG_LD' => 1,
+ '_AM_SET_OPTION' => 1,
+ 'LT_SYS_MODULE_PATH' => 1,
+ 'AC_LIBTOOL_LANG_RC_CONFIG' => 1,
+ 'm4_include' => 1,
+ '_LT_AC_PROG_ECHO_BACKSLASH' => 1,
+ 'LT_LIB_M' => 1,
+ 'AC_LIBTOOL_F77' => 1,
+ 'AC_LIBTOOL_GCJ' => 1,
+ '_LT_AC_LANG_CXX_CONFIG' => 1,
+ 'AC_LTDL_SYMBOL_USCORE' => 1,
+ '_LT_AC_SYS_LIBPATH_AIX' => 1,
+ 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1,
+ '_LT_LINKER_BOILERPLATE' => 1,
+ '_AM_MANGLE_OPTION' => 1,
+ '_AM_PROG_CC_C_O' => 1,
+ '_LT_PROG_CXX' => 1,
+ 'LT_PATH_LD' => 1,
+ 'AM_SANITY_CHECK' => 1,
+ 'AM_DISABLE_STATIC' => 1,
+ '_LT_PROG_FC' => 1,
+ 'AC_LIBLTDL_INSTALLABLE' => 1,
+ '_LT_AC_LANG_CXX' => 1,
+ 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1,
+ 'AM_DEP_TRACK' => 1,
+ 'AC_PROG_LD_RELOAD_FLAG' => 1,
+ '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1,
+ 'LT_PROG_GO' => 1,
+ 'AC_LIBTOOL_PICMODE' => 1,
+ 'AC_LIBTOOL_FC' => 1,
+ 'AC_WITH_LTDL' => 1,
+ 'AM_MAINTAINER_MODE' => 1,
+ '_LT_AC_SYS_COMPILER' => 1,
+ 'AC_CONFIG_MACRO_DIR' => 1,
+ 'AC_LIBTOOL_WIN32_DLL' => 1,
+ '_LT_DLL_DEF_P' => 1,
+ '_LT_COMPILER_BOILERPLATE' => 1,
+ 'LT_AC_PROG_RC' => 1,
+ '_LT_AC_FILE_LTDLL_C' => 1,
+ '_AM_PROG_TAR' => 1,
+ 'AC_CONFIG_MACRO_DIR_TRACE' => 1,
+ 'AC_LIBTOOL_DLOPEN_SELF' => 1,
+ 'AC_LTDL_DLLIB' => 1,
+ 'LT_SYS_SYMBOL_USCORE' => 1,
+ 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1,
+ '_LTDL_SETUP' => 1,
+ 'AC_LIBTOOL_COMPILER_OPTION' => 1,
+ 'AC_DISABLE_STATIC' => 1,
+ 'AC_PATH_TOOL_PREFIX' => 1,
+ 'LT_LANG' => 1,
+ 'LT_OUTPUT' => 1,
+ 'AM_AUTOMAKE_VERSION' => 1,
+ '_LT_AC_TAGCONFIG' => 1,
+ 'AM_INIT_AUTOMAKE' => 1,
+ 'm4_pattern_forbid' => 1,
+ 'LT_AC_PROG_GCJ' => 1,
+ 'LT_CONFIG_LTDL_DIR' => 1,
+ 'LT_PROG_GCJ' => 1,
+ 'AM_MISSING_PROG' => 1,
+ 'LTVERSION_VERSION' => 1,
+ 'm4_pattern_allow' => 1,
+ 'AM_PROG_CC_C_O' => 1,
+ 'AC_PROG_EGREP' => 1,
+ 'AM_MAKE_INCLUDE' => 1,
+ '_LT_PREPARE_SED_QUOTE_VARS' => 1,
+ '_LT_AC_LOCK' => 1,
+ 'LT_SYS_DLSEARCH_PATH' => 1,
+ '_LT_AC_LANG_GCJ' => 1,
+ 'LT_INIT' => 1,
+ 'AC_LTDL_DLSYM_USCORE' => 1,
+ '_LT_AC_LANG_RC_CONFIG' => 1,
+ 'AM_ENABLE_SHARED' => 1,
+ 'LT_SYS_MODULE_EXT' => 1,
+ '_LT_COMPILER_OPTION' => 1,
+ 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1,
+ '_LT_AC_LANG_C_CONFIG' => 1,
+ '_LT_AC_LANG_GCJ_CONFIG' => 1,
+ 'AM_ENABLE_STATIC' => 1,
+ 'AC_ENABLE_STATIC' => 1,
+ 'AC_LIBLTDL_CONVENIENCE' => 1,
+ 'AC_LIBTOOL_CXX' => 1,
+ 'AC_LIBTOOL_RC' => 1,
+ 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1,
+ 'AC_ENABLE_SHARED' => 1,
+ 'AC_ENABLE_FAST_INSTALL' => 1,
+ 'AC_LTDL_OBJDIR' => 1,
+ '_LT_LINKER_OPTION' => 1,
+ 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1,
+ 'AM_SET_LEADING_DOT' => 1,
+ 'AC_LTDL_SYS_DLOPEN_DEPLIBS' => 1,
+ 'AC_LTDL_SHLIBEXT' => 1,
+ 'AC_LTDL_SYSSEARCHPATH' => 1,
+ 'LT_PATH_NM' => 1,
+ '_LT_LIBOBJ' => 1,
+ '_LT_PROG_ECHO_BACKSLASH' => 1
+ }
+ ], 'Autom4te::Request' ),
+ bless( [
+ '3',
+ 1,
+ [
+ '/usr/share/autoconf'
+ ],
+ [
+ '/usr/share/autoconf/autoconf/autoconf.m4f',
+ 'aclocal.m4',
+ '/usr/share/autoconf/autoconf/trailer.m4',
+ 'configure.ac'
+ ],
+ {
+ 'AM_MAKEFILE_INCLUDE' => 1,
+ 'AC_CONFIG_LINKS' => 1,
+ '_AM_COND_ELSE' => 1,
+ 'AC_CANONICAL_BUILD' => 1,
+ 'AC_INIT' => 1,
+ 'AM_GNU_GETTEXT' => 1,
+ 'LT_SUPPORTED_TAG' => 1,
+ 'AM_PROG_AR' => 1,
+ 'AC_CONFIG_AUX_DIR' => 1,
+ 'AM_NLS' => 1,
+ 'AM_PROG_LIBTOOL' => 1,
+ '_AM_COND_IF' => 1,
+ 'AM_EXTRA_RECURSIVE_TARGETS' => 1,
+ 'AC_CONFIG_MACRO_DIR_TRACE' => 1,
+ '_AM_COND_ENDIF' => 1,
+ 'AM_PROG_MOC' => 1,
+ 'AC_CONFIG_SUBDIRS' => 1,
+ 'IT_PROG_INTLTOOL' => 1,
+ 'AC_CANONICAL_SYSTEM' => 1,
+ '_m4_warn' => 1,
+ 'AC_CONFIG_LIBOBJ_DIR' => 1,
+ '_LT_AC_TAGCONFIG' => 1,
+ 'AM_PROG_MKDIR_P' => 1,
+ 'AC_CONFIG_FILES' => 1,
+ 'AM_ENABLE_MULTILIB' => 1,
+ 'AM_AUTOMAKE_VERSION' => 1,
+ 'm4_include' => 1,
+ 'm4_pattern_forbid' => 1,
+ 'AM_INIT_AUTOMAKE' => 1,
+ 'AC_FC_PP_DEFINE' => 1,
+ 'AC_REQUIRE_AUX_FILE' => 1,
+ 'AC_FC_SRCEXT' => 1,
+ 'LT_CONFIG_LTDL_DIR' => 1,
+ 'include' => 1,
+ 'AC_CANONICAL_TARGET' => 1,
+ 'AM_PATH_GUILE' => 1,
+ '_AM_MAKEFILE_INCLUDE' => 1,
+ 'AC_DEFINE_TRACE_LITERAL' => 1,
+ 'AC_FC_PP_SRCEXT' => 1,
+ 'm4_pattern_allow' => 1,
+ 'AM_PROG_CC_C_O' => 1,
+ 'AC_CONFIG_HEADERS' => 1,
+ 'AM_CONDITIONAL' => 1,
+ 'AM_PROG_CXX_C_O' => 1,
+ 'GTK_DOC_CHECK' => 1,
+ 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1,
+ 'AM_XGETTEXT_OPTION' => 1,
+ 'AC_PROG_LIBTOOL' => 1,
+ 'm4_sinclude' => 1,
+ 'AC_FC_FREEFORM' => 1,
+ 'LT_INIT' => 1,
+ 'sinclude' => 1,
+ 'AM_POT_TOOLS' => 1,
+ 'AC_SUBST' => 1,
+ 'AC_CANONICAL_HOST' => 1,
+ 'AM_PROG_F77_C_O' => 1,
+ 'AM_PROG_FC_C_O' => 1,
+ 'AM_SILENT_RULES' => 1,
+ '_AM_SUBST_NOTMAKE' => 1,
+ 'AH_OUTPUT' => 1,
+ 'AM_MAINTAINER_MODE' => 1,
+ 'AC_LIBSOURCE' => 1,
+ 'AC_SUBST_TRACE' => 1
+ }
+ ], 'Autom4te::Request' )
+ );
+
diff --git a/graphics/asymptote/gc/autom4te.cache/traces.0 b/graphics/asymptote/gc/autom4te.cache/traces.0
new file mode 100644
index 0000000000..da5708eba2
--- /dev/null
+++ b/graphics/asymptote/gc/autom4te.cache/traces.0
@@ -0,0 +1,3054 @@
+m4trace:/usr/share/aclocal/libtool.m4:62: -1- AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])
+m4trace:/usr/share/aclocal/libtool.m4:100: -1- AU_DEFUN([AC_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:100: -1- AC_DEFUN([AC_PROG_LIBTOOL], [m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_INIT], [LT_INIT($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:101: -1- AU_DEFUN([AM_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:101: -1- AC_DEFUN([AM_PROG_LIBTOOL], [m4_warn([obsolete], [The macro `AM_PROG_LIBTOOL' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_INIT], [LT_INIT($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:621: -1- AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+ echo
+ AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $[#]
+do
+ case $[1] in
+ --version | --v* | -V )
+ echo "$lt_cl_version"; exit 0 ;;
+ --help | --h* | -h )
+ echo "$lt_cl_help"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --quiet | --q* | --silent | --s* | -q )
+ lt_cl_silent=: ;;
+
+ -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try '$[0] --help' for more information.]) ;;
+
+ *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try '$[0] --help' for more information.]) ;;
+ esac
+ shift
+done
+
+if $lt_cl_silent; then
+ exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure. Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+ lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])
+m4trace:/usr/share/aclocal/libtool.m4:814: -1- AC_DEFUN([LT_SUPPORTED_TAG], [])
+m4trace:/usr/share/aclocal/libtool.m4:825: -1- AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+ [C], [_LT_LANG(C)],
+ [C++], [_LT_LANG(CXX)],
+ [Go], [_LT_LANG(GO)],
+ [Java], [_LT_LANG(GCJ)],
+ [Fortran 77], [_LT_LANG(F77)],
+ [Fortran], [_LT_LANG(FC)],
+ [Windows Resource], [_LT_LANG(RC)],
+ [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+ [_LT_LANG($1)],
+ [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])
+m4trace:/usr/share/aclocal/libtool.m4:917: -1- AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+m4trace:/usr/share/aclocal/libtool.m4:917: -1- AC_DEFUN([AC_LIBTOOL_CXX], [m4_warn([obsolete], [The macro `AC_LIBTOOL_CXX' is obsolete.
+You should run autoupdate.])dnl
+LT_LANG(C++)])
+m4trace:/usr/share/aclocal/libtool.m4:918: -1- AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+m4trace:/usr/share/aclocal/libtool.m4:918: -1- AC_DEFUN([AC_LIBTOOL_F77], [m4_warn([obsolete], [The macro `AC_LIBTOOL_F77' is obsolete.
+You should run autoupdate.])dnl
+LT_LANG(Fortran 77)])
+m4trace:/usr/share/aclocal/libtool.m4:919: -1- AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+m4trace:/usr/share/aclocal/libtool.m4:919: -1- AC_DEFUN([AC_LIBTOOL_FC], [m4_warn([obsolete], [The macro `AC_LIBTOOL_FC' is obsolete.
+You should run autoupdate.])dnl
+LT_LANG(Fortran)])
+m4trace:/usr/share/aclocal/libtool.m4:920: -1- AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+m4trace:/usr/share/aclocal/libtool.m4:920: -1- AC_DEFUN([AC_LIBTOOL_GCJ], [m4_warn([obsolete], [The macro `AC_LIBTOOL_GCJ' is obsolete.
+You should run autoupdate.])dnl
+LT_LANG(Java)])
+m4trace:/usr/share/aclocal/libtool.m4:921: -1- AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+m4trace:/usr/share/aclocal/libtool.m4:921: -1- AC_DEFUN([AC_LIBTOOL_RC], [m4_warn([obsolete], [The macro `AC_LIBTOOL_RC' is obsolete.
+You should run autoupdate.])dnl
+LT_LANG(Windows Resource)])
+m4trace:/usr/share/aclocal/libtool.m4:1244: -1- AC_DEFUN([_LT_WITH_SYSROOT], [m4_require([_LT_DECL_SED])dnl
+AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+ [Search for dependent libraries within DIR (or the compiler's sysroot
+ if not specified).])],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted. We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ AC_MSG_RESULT([$with_sysroot])
+ AC_MSG_ERROR([The sysroot must be an absolute path.])
+ ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and where our libraries should be installed.])])
+m4trace:/usr/share/aclocal/libtool.m4:1589: -1- AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ fi
+ $RM conftest*
+])
+
+if test yes = "[$]$2"; then
+ m4_if([$5], , :, [$5])
+else
+ m4_if([$6], , :, [$6])
+fi
+])
+m4trace:/usr/share/aclocal/libtool.m4:1631: -1- AU_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:1631: -1- AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_warn([obsolete], [The macro `AC_LIBTOOL_COMPILER_OPTION' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:1640: -1- AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $3"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&AS_MESSAGE_LOG_FD
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ else
+ $2=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+])
+
+if test yes = "[$]$2"; then
+ m4_if([$4], , :, [$4])
+else
+ m4_if([$5], , :, [$5])
+fi
+])
+m4trace:/usr/share/aclocal/libtool.m4:1675: -1- AU_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:1675: -1- AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_warn([obsolete], [The macro `AC_LIBTOOL_LINKER_OPTION' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:1682: -1- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[ ]]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+])
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+ AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+ [What is the maximum length of a command?])
+])
+m4trace:/usr/share/aclocal/libtool.m4:1821: -1- AU_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:1821: -1- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_warn([obsolete], [The macro `AC_LIBTOOL_SYS_MAX_CMD_LEN' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:1932: -1- AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl
+if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ])
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen=shl_load],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen=dlopen],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+ [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+ [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+ [Whether dlopen of statically linked programs is supported])
+])
+m4trace:/usr/share/aclocal/libtool.m4:2057: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:2057: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_warn([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:3178: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] | ?:[\\/]*])
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word. This closes a longstanding sh security hole.
+ ac_dummy="m4_if([$2], , $PATH, [$2])"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$1"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac])
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ AC_MSG_RESULT($MAGIC_CMD)
+else
+ AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+ [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])
+m4trace:/usr/share/aclocal/libtool.m4:3240: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:3240: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [m4_warn([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:3263: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+ [AS_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+ [test no = "$withval" || with_gnu_ld=yes],
+ [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi])
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])
+m4trace:/usr/share/aclocal/libtool.m4:3352: -1- AU_DEFUN([AM_PROG_LD], [m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:3352: -1- AC_DEFUN([AM_PROG_LD], [m4_warn([obsolete], [The macro `AM_PROG_LD' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:3353: -1- AU_DEFUN([AC_PROG_LD], [m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:3353: -1- AC_DEFUN([AC_PROG_LD], [m4_warn([obsolete], [The macro `AC_PROG_LD' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:3682: -1- AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi])
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+ AC_SUBST([DUMPBIN])
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+ [lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+ cat conftest.out >&AS_MESSAGE_LOG_FD
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*])
+])
+m4trace:/usr/share/aclocal/libtool.m4:3777: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:3777: -1- AC_DEFUN([AM_PROG_NM], [m4_warn([obsolete], [The macro `AM_PROG_NM' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:3778: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:3778: -1- AC_DEFUN([AC_PROG_NM], [m4_warn([obsolete], [The macro `AC_PROG_NM' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:3849: -1- AC_DEFUN([_LT_DLL_DEF_P], [dnl
+ test DEF = "`$SED -n dnl
+ -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace
+ -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments
+ -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl
+ -e q dnl Only consider the first "real" line
+ $1`" dnl
+])
+m4trace:/usr/share/aclocal/libtool.m4:3863: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
+ AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, cos, LIBM=-lm)
+ ;;
+esac
+AC_SUBST([LIBM])
+])
+m4trace:/usr/share/aclocal/libtool.m4:3882: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:3882: -1- AC_DEFUN([AC_CHECK_LIBM], [m4_warn([obsolete], [The macro `AC_CHECK_LIBM' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:8148: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+ [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+ [AC_CHECK_TOOL(GCJ, gcj,)
+ test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)])])[]dnl
+])
+m4trace:/usr/share/aclocal/libtool.m4:8157: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:8157: -1- AC_DEFUN([LT_AC_PROG_GCJ], [m4_warn([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:8164: -1- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,)
+])
+m4trace:/usr/share/aclocal/libtool.m4:8171: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,)
+])
+m4trace:/usr/share/aclocal/libtool.m4:8176: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:8176: -1- AC_DEFUN([LT_AC_PROG_RC], [m4_warn([obsolete], [The macro `LT_AC_PROG_RC' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])])
+m4trace:/usr/share/aclocal/libtool.m4:8304: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])], [], [])
+m4trace:/usr/share/aclocal/libtool.m4:8304: -1- AC_DEFUN([LT_AC_PROG_SED], [m4_warn([obsolete], [The macro `LT_AC_PROG_SED' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])])
+m4trace:/usr/share/aclocal/ltargz.m4:13: -1- AC_DEFUN([LT_FUNC_ARGZ], [
+dnl Required for use of '$SED' in Cygwin configuration.
+AC_REQUIRE([AC_PROG_SED])dnl
+AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT])
+
+AC_CHECK_TYPES([error_t],
+ [],
+ [AC_DEFINE([error_t], [int],
+ [Define to a type to use for 'error_t' if it is not otherwise available.])
+ AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h
+ does not typedef error_t.])],
+ [#if defined(HAVE_ARGZ_H)
+# include <argz.h>
+#endif])
+
+LT_ARGZ_H=
+AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \
+ argz_next argz_stringify], [], [LT_ARGZ_H=lt__argz.h; AC_LIBOBJ([lt__argz])])
+
+dnl if have system argz functions, allow forced use of
+dnl libltdl-supplied implementation (and default to do so
+dnl on "known bad" systems). Could use a runtime check, but
+dnl (a) detecting malloc issues is notoriously unreliable
+dnl (b) only known system that declares argz functions,
+dnl provides them, yet they are broken, is cygwin
+dnl releases prior to 16-Mar-2007 (1.5.24 and earlier)
+dnl So, it's more straightforward simply to special case
+dnl this for known bad systems.
+AS_IF([test -z "$LT_ARGZ_H"],
+ [AC_CACHE_CHECK(
+ [if argz actually works],
+ [lt_cv_sys_argz_works],
+ [[case $host_os in #(
+ *cygwin*)
+ lt_cv_sys_argz_works=no
+ if test no != "$cross_compiling"; then
+ lt_cv_sys_argz_works="guessing no"
+ else
+ lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/'
+ save_IFS=$IFS
+ IFS=-.
+ set x `uname -r | $SED -e "$lt_sed_extract_leading_digits"`
+ IFS=$save_IFS
+ lt_os_major=${2-0}
+ lt_os_minor=${3-0}
+ lt_os_micro=${4-0}
+ if test 1 -lt "$lt_os_major" \
+ || { test 1 -eq "$lt_os_major" \
+ && { test 5 -lt "$lt_os_minor" \
+ || { test 5 -eq "$lt_os_minor" \
+ && test 24 -lt "$lt_os_micro"; }; }; }; then
+ lt_cv_sys_argz_works=yes
+ fi
+ fi
+ ;; #(
+ *) lt_cv_sys_argz_works=yes ;;
+ esac]])
+ AS_IF([test yes = "$lt_cv_sys_argz_works"],
+ [AC_DEFINE([HAVE_WORKING_ARGZ], 1,
+ [This value is set to 1 to indicate that the system argz facility works])],
+ [LT_ARGZ_H=lt__argz.h
+ AC_LIBOBJ([lt__argz])])])
+
+AC_SUBST([LT_ARGZ_H])
+])
+m4trace:/usr/share/aclocal/ltdl.m4:17: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT])
+_$0($*)
+])
+m4trace:/usr/share/aclocal/ltdl.m4:69: -1- AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl
+dnl Although the argument is deprecated and no longer documented,
+dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one
+dnl here make sure it is the same as any other declaration of libltdl's
+dnl location! This also ensures lt_ltdl_dir is set when configure.ac is
+dnl not yet using an explicit LT_CONFIG_LTDL_DIR.
+m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl
+_$0()
+])
+m4trace:/usr/share/aclocal/ltdl.m4:82: -1- AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_CONVENIENCE])
+m4trace:/usr/share/aclocal/ltdl.m4:82: -1- AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [m4_warn([obsolete], [The macro `AC_LIBLTDL_CONVENIENCE' is obsolete.
+You should run autoupdate.])dnl
+_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_CONVENIENCE])
+m4trace:/usr/share/aclocal/ltdl.m4:125: -1- AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl
+dnl Although the argument is deprecated and no longer documented,
+dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one
+dnl here make sure it is the same as any other declaration of libltdl's
+dnl location! This also ensures lt_ltdl_dir is set when configure.ac is
+dnl not yet using an explicit LT_CONFIG_LTDL_DIR.
+m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl
+_$0()
+])
+m4trace:/usr/share/aclocal/ltdl.m4:138: -1- AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_INSTALLABLE])
+m4trace:/usr/share/aclocal/ltdl.m4:138: -1- AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [m4_warn([obsolete], [The macro `AC_LIBLTDL_INSTALLABLE' is obsolete.
+You should run autoupdate.])dnl
+_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_INSTALLABLE])
+m4trace:/usr/share/aclocal/ltdl.m4:214: -1- AC_DEFUN([_LT_LIBOBJ], [
+ m4_pattern_allow([^_LT_LIBOBJS$])
+ _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext"
+])
+m4trace:/usr/share/aclocal/ltdl.m4:227: -1- AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+dnl We need to keep our own list of libobjs separate from our parent project,
+dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while
+dnl we look for our own LIBOBJs.
+m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ]))
+m4_pushdef([AC_LIBSOURCES])
+
+dnl If not otherwise defined, default to the 1.5.x compatible subproject mode:
+m4_if(_LTDL_MODE, [],
+ [m4_define([_LTDL_MODE], m4_default([$2], [subproject]))
+ m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])],
+ [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])
+
+AC_ARG_WITH([included_ltdl],
+ [AS_HELP_STRING([--with-included-ltdl],
+ [use the GNU ltdl sources included here])])
+
+if test yes != "$with_included_ltdl"; then
+ # We are not being forced to use the included libltdl sources, so
+ # decide whether there is a useful installed version we can use.
+ AC_CHECK_HEADER([ltdl.h],
+ [AC_CHECK_DECL([lt_dlinterface_register],
+ [AC_CHECK_LIB([ltdl], [lt_dladvise_preload],
+ [with_included_ltdl=no],
+ [with_included_ltdl=yes])],
+ [with_included_ltdl=yes],
+ [AC_INCLUDES_DEFAULT
+ #include <ltdl.h>])],
+ [with_included_ltdl=yes],
+ [AC_INCLUDES_DEFAULT]
+ )
+fi
+
+dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE
+dnl was called yet, then for old times' sake, we assume libltdl is in an
+dnl eponymous directory:
+AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])])
+
+AC_ARG_WITH([ltdl_include],
+ [AS_HELP_STRING([--with-ltdl-include=DIR],
+ [use the ltdl headers installed in DIR])])
+
+if test -n "$with_ltdl_include"; then
+ if test -f "$with_ltdl_include/ltdl.h"; then :
+ else
+ AC_MSG_ERROR([invalid ltdl include directory: '$with_ltdl_include'])
+ fi
+else
+ with_ltdl_include=no
+fi
+
+AC_ARG_WITH([ltdl_lib],
+ [AS_HELP_STRING([--with-ltdl-lib=DIR],
+ [use the libltdl.la installed in DIR])])
+
+if test -n "$with_ltdl_lib"; then
+ if test -f "$with_ltdl_lib/libltdl.la"; then :
+ else
+ AC_MSG_ERROR([invalid ltdl library directory: '$with_ltdl_lib'])
+ fi
+else
+ with_ltdl_lib=no
+fi
+
+case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in
+ ,yes,no,no,)
+ m4_case(m4_default(_LTDL_TYPE, [convenience]),
+ [convenience], [_LTDL_CONVENIENCE],
+ [installable], [_LTDL_INSTALLABLE],
+ [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)])
+ ;;
+ ,no,no,no,)
+ # If the included ltdl is not to be used, then use the
+ # preinstalled libltdl we found.
+ AC_DEFINE([HAVE_LTDL], [1],
+ [Define this if a modern libltdl is already installed])
+ LIBLTDL=-lltdl
+ LTDLDEPS=
+ LTDLINCL=
+ ;;
+ ,no*,no,*)
+ AC_MSG_ERROR(['--with-ltdl-include' and '--with-ltdl-lib' options must be used together])
+ ;;
+ *) with_included_ltdl=no
+ LIBLTDL="-L$with_ltdl_lib -lltdl"
+ LTDLDEPS=
+ LTDLINCL=-I$with_ltdl_include
+ ;;
+esac
+INCLTDL=$LTDLINCL
+
+# Report our decision...
+AC_MSG_CHECKING([where to find libltdl headers])
+AC_MSG_RESULT([$LTDLINCL])
+AC_MSG_CHECKING([where to find libltdl library])
+AC_MSG_RESULT([$LIBLTDL])
+
+_LTDL_SETUP
+
+dnl restore autoconf definition.
+m4_popdef([AC_LIBOBJ])
+m4_popdef([AC_LIBSOURCES])
+
+AC_CONFIG_COMMANDS_PRE([
+ _ltdl_libobjs=
+ _ltdl_ltlibobjs=
+ if test -n "$_LT_LIBOBJS"; then
+ # Remove the extension.
+ _lt_sed_drop_objext='s/\.o$//;s/\.obj$//'
+ for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | $SED "$_lt_sed_drop_objext" | sort -u`; do
+ _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext"
+ _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo"
+ done
+ fi
+ AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs])
+ AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs])
+])
+
+# Only expand once:
+m4_define([LTDL_INIT])
+])
+m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AC_DEFUN([AC_LIB_LTDL], [m4_warn([obsolete], [The macro `AC_LIB_LTDL' is obsolete.
+You should run autoupdate.])dnl
+LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AC_DEFUN([AC_WITH_LTDL], [m4_warn([obsolete], [The macro `AC_WITH_LTDL' is obsolete.
+You should run autoupdate.])dnl
+LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:355: -1- AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:355: -1- AC_DEFUN([LT_WITH_LTDL], [m4_warn([obsolete], [The macro `LT_WITH_LTDL' is obsolete.
+You should run autoupdate.])dnl
+LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:368: -1- AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_SYS_MODULE_EXT])dnl
+AC_REQUIRE([LT_SYS_MODULE_PATH])dnl
+AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl
+AC_REQUIRE([LT_LIB_DLLOAD])dnl
+AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl
+AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl
+AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl
+AC_REQUIRE([LT_FUNC_ARGZ])dnl
+
+m4_require([_LT_CHECK_OBJDIR])dnl
+m4_require([_LT_HEADER_DLFCN])dnl
+m4_require([_LT_CHECK_DLPREOPEN])dnl
+m4_require([_LT_DECL_SED])dnl
+
+dnl Don't require this, or it will be expanded earlier than the code
+dnl that sets the variables it relies on:
+_LT_ENABLE_INSTALL
+
+dnl _LTDL_MODE specific code must be called at least once:
+_LTDL_MODE_DISPATCH
+
+# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS
+# the user used. This is so that ltdl.h can pick up the parent projects
+# config.h file, The first file in AC_CONFIG_HEADERS must contain the
+# definitions required by ltdl.c.
+# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility).
+AC_CONFIG_COMMANDS_PRE([dnl
+m4_pattern_allow([^LT_CONFIG_H$])dnl
+m4_ifset([AH_HEADER],
+ [LT_CONFIG_H=AH_HEADER],
+ [m4_ifset([AC_LIST_HEADERS],
+ [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's|^[[ ]]*||;s|[[ :]].*$||'`],
+ [])])])
+AC_SUBST([LT_CONFIG_H])
+
+AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h],
+ [], [], [AC_INCLUDES_DEFAULT])
+
+AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])])
+AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])])
+
+m4_pattern_allow([LT_LIBEXT])dnl
+AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension])
+
+name=
+eval "lt_libprefix=\"$libname_spec\""
+m4_pattern_allow([LT_LIBPREFIX])dnl
+AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix])
+
+name=ltdl
+eval "LTDLOPEN=\"$libname_spec\""
+AC_SUBST([LTDLOPEN])
+])
+m4trace:/usr/share/aclocal/ltdl.m4:444: -1- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_CACHE_CHECK([whether deplibs are loaded by dlopen],
+ [lt_cv_sys_dlopen_deplibs],
+ [# PORTME does your system automatically load deplibs for dlopen?
+ # or its logical equivalent (e.g. shl_load for HP-UX < 11)
+ # For now, we just catch OSes we know something about -- in the
+ # future, we'll try test this programmatically.
+ lt_cv_sys_dlopen_deplibs=unknown
+ case $host_os in
+ aix3*|aix4.1.*|aix4.2.*)
+ # Unknown whether this is true for these versions of AIX, but
+ # we want this 'case' here to explicitly catch those versions.
+ lt_cv_sys_dlopen_deplibs=unknown
+ ;;
+ aix[[4-9]]*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ lt_cv_sys_dlopen_deplibs=no
+ ;;
+ esac
+ ;;
+ bitrig*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ darwin*)
+ # Assuming the user has installed a libdl from somewhere, this is true
+ # If you are looking for one http://www.opendarwin.org/projects/dlcompat
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ # GNU and its variants, using gnu ld.so (Glibc)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ hpux10*|hpux11*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ interix*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ irix[[12345]]*|irix6.[[01]]*)
+ # Catch all versions of IRIX before 6.2, and indicate that we don't
+ # know how it worked for any of those versions.
+ lt_cv_sys_dlopen_deplibs=unknown
+ ;;
+ irix*)
+ # The case above catches anything before 6.2, and it's known that
+ # at 6.2 and later dlopen does load deplibs.
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ netbsd*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ openbsd*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ osf[[1234]]*)
+ # dlopen did load deplibs (at least at 4.x), but until the 5.x series,
+ # it did *not* use an RPATH in a shared library to find objects the
+ # library depends on, so we explicitly say 'no'.
+ lt_cv_sys_dlopen_deplibs=no
+ ;;
+ osf5.0|osf5.0a|osf5.1)
+ # dlopen *does* load deplibs and with the right loader patch applied
+ # it even uses RPATH in a shared library to search for shared objects
+ # that the library depends on, but there's no easy way to know if that
+ # patch is installed. Since this is the case, all we can really
+ # say is unknown -- it depends on the patch being installed. If
+ # it is, this changes to 'yes'. Without it, it would be 'no'.
+ lt_cv_sys_dlopen_deplibs=unknown
+ ;;
+ osf*)
+ # the two cases above should catch all versions of osf <= 5.1. Read
+ # the comments above for what we know about them.
+ # At > 5.1, deplibs are loaded *and* any RPATH in a shared library
+ # is used to find them so we can finally say 'yes'.
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ qnx*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ solaris*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ libltdl_cv_sys_dlopen_deplibs=yes
+ ;;
+ esac
+ ])
+if test yes != "$lt_cv_sys_dlopen_deplibs"; then
+ AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1],
+ [Define if the OS needs help to load dependent libraries for dlopen().])
+fi
+])
+m4trace:/usr/share/aclocal/ltdl.m4:546: -1- AU_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:546: -1- AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_warn([obsolete], [The macro `AC_LTDL_SYS_DLOPEN_DEPLIBS' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:553: -1- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([what extension is used for runtime loadable modules],
+ [libltdl_cv_shlibext],
+[
+module=yes
+eval libltdl_cv_shlibext=$shrext_cmds
+module=no
+eval libltdl_cv_shrext=$shrext_cmds
+ ])
+if test -n "$libltdl_cv_shlibext"; then
+ m4_pattern_allow([LT_MODULE_EXT])dnl
+ AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"],
+ [Define to the extension used for runtime loadable modules, say, ".so".])
+fi
+if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then
+ m4_pattern_allow([LT_SHARED_EXT])dnl
+ AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"],
+ [Define to the shared library suffix, say, ".dylib".])
+fi
+if test -n "$shared_archive_member_spec"; then
+ m4_pattern_allow([LT_SHARED_LIB_MEMBER])dnl
+ AC_DEFINE_UNQUOTED([LT_SHARED_LIB_MEMBER], ["($shared_archive_member_spec.o)"],
+ [Define to the shared archive member specification, say "(shr.o)".])
+fi
+])
+m4trace:/usr/share/aclocal/ltdl.m4:581: -1- AU_DEFUN([AC_LTDL_SHLIBEXT], [m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:581: -1- AC_DEFUN([AC_LTDL_SHLIBEXT], [m4_warn([obsolete], [The macro `AC_LTDL_SHLIBEXT' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:588: -1- AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([what variable specifies run-time module search path],
+ [lt_cv_module_path_var], [lt_cv_module_path_var=$shlibpath_var])
+if test -n "$lt_cv_module_path_var"; then
+ m4_pattern_allow([LT_MODULE_PATH_VAR])dnl
+ AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"],
+ [Define to the name of the environment variable that determines the run-time module search path.])
+fi
+])
+m4trace:/usr/share/aclocal/ltdl.m4:600: -1- AU_DEFUN([AC_LTDL_SHLIBPATH], [m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:600: -1- AC_DEFUN([AC_LTDL_SHLIBPATH], [m4_warn([obsolete], [The macro `AC_LTDL_SHLIBPATH' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:607: -1- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([for the default library search path],
+ [lt_cv_sys_dlsearch_path],
+ [lt_cv_sys_dlsearch_path=$sys_lib_dlsearch_path_spec])
+if test -n "$lt_cv_sys_dlsearch_path"; then
+ sys_dlsearch_path=
+ for dir in $lt_cv_sys_dlsearch_path; do
+ if test -z "$sys_dlsearch_path"; then
+ sys_dlsearch_path=$dir
+ else
+ sys_dlsearch_path=$sys_dlsearch_path$PATH_SEPARATOR$dir
+ fi
+ done
+ m4_pattern_allow([LT_DLSEARCH_PATH])dnl
+ AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"],
+ [Define to the system default library search path.])
+fi
+])
+m4trace:/usr/share/aclocal/ltdl.m4:628: -1- AU_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:628: -1- AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_warn([obsolete], [The macro `AC_LTDL_SYSSEARCHPATH' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:654: -1- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$])
+LT_DLLOADERS=
+AC_SUBST([LT_DLLOADERS])
+
+AC_LANG_PUSH([C])
+lt_dlload_save_LIBS=$LIBS
+
+LIBADD_DLOPEN=
+AC_SEARCH_LIBS([dlopen], [dl],
+ [AC_DEFINE([HAVE_LIBDL], [1],
+ [Define if you have the libdl library or equivalent.])
+ if test "$ac_cv_search_dlopen" != "none required"; then
+ LIBADD_DLOPEN=-ldl
+ fi
+ libltdl_cv_lib_dl_dlopen=yes
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H
+# include <dlfcn.h>
+#endif
+ ]], [[dlopen(0, 0);]])],
+ [AC_DEFINE([HAVE_LIBDL], [1],
+ [Define if you have the libdl library or equivalent.])
+ libltdl_cv_func_dlopen=yes
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [AC_DEFINE([HAVE_LIBDL], [1],
+ [Define if you have the libdl library or equivalent.])
+ LIBADD_DLOPEN=-lsvld libltdl_cv_func_dlopen=yes
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])])
+if test yes = "$libltdl_cv_func_dlopen" || test yes = "$libltdl_cv_lib_dl_dlopen"
+then
+ lt_save_LIBS=$LIBS
+ LIBS="$LIBS $LIBADD_DLOPEN"
+ AC_CHECK_FUNCS([dlerror])
+ LIBS=$lt_save_LIBS
+fi
+AC_SUBST([LIBADD_DLOPEN])
+
+LIBADD_SHL_LOAD=
+AC_CHECK_FUNC([shl_load],
+ [AC_DEFINE([HAVE_SHL_LOAD], [1],
+ [Define if you have the shl_load function.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [AC_DEFINE([HAVE_SHL_LOAD], [1],
+ [Define if you have the shl_load function.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"
+ LIBADD_SHL_LOAD=-ldld])])
+AC_SUBST([LIBADD_SHL_LOAD])
+
+case $host_os in
+darwin[[1567]].*)
+# We only want this for pre-Mac OS X 10.4.
+ AC_CHECK_FUNC([_dyld_func_lookup],
+ [AC_DEFINE([HAVE_DYLD], [1],
+ [Define if you have the _dyld_func_lookup function.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"])
+ ;;
+beos*)
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la"
+ ;;
+cygwin* | mingw* | pw32*)
+ AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include <sys/cygwin.h>]])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la"
+ ;;
+esac
+
+AC_CHECK_LIB([dld], [dld_link],
+ [AC_DEFINE([HAVE_DLD], [1],
+ [Define if you have the GNU dld library.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"])
+AC_SUBST([LIBADD_DLD_LINK])
+
+m4_pattern_allow([^LT_DLPREOPEN$])
+LT_DLPREOPEN=
+if test -n "$LT_DLLOADERS"
+then
+ for lt_loader in $LT_DLLOADERS; do
+ LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader "
+ done
+ AC_DEFINE([HAVE_LIBDLLOADER], [1],
+ [Define if libdlloader will be built on this platform])
+fi
+AC_SUBST([LT_DLPREOPEN])
+
+dnl This isn't used anymore, but set it for backwards compatibility
+LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD"
+AC_SUBST([LIBADD_DL])
+
+LIBS=$lt_dlload_save_LIBS
+AC_LANG_POP
+])
+m4trace:/usr/share/aclocal/ltdl.m4:749: -1- AU_DEFUN([AC_LTDL_DLLIB], [m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:749: -1- AC_DEFUN([AC_LTDL_DLLIB], [m4_warn([obsolete], [The macro `AC_LTDL_DLLIB' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:757: -1- AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+AC_CACHE_CHECK([for _ prefix in compiled symbols],
+ [lt_cv_sys_symbol_underscore],
+ [lt_cv_sys_symbol_underscore=no
+ cat > conftest.$ac_ext <<_LT_EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+_LT_EOF
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+ # See whether the symbols have a leading underscore.
+ if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+ lt_cv_sys_symbol_underscore=yes
+ else
+ if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+ :
+ else
+ echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ fi
+ else
+ echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat conftest.c >&AS_MESSAGE_LOG_FD
+ fi
+ rm -rf conftest*
+ ])
+ sys_symbol_underscore=$lt_cv_sys_symbol_underscore
+ AC_SUBST([sys_symbol_underscore])
+])
+m4trace:/usr/share/aclocal/ltdl.m4:794: -1- AU_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:794: -1- AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_warn([obsolete], [The macro `AC_LTDL_SYMBOL_USCORE' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:801: -1- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([_LT_COMPILER_PIC])dnl for lt_prog_compiler_wl
+AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl for lt_cv_sys_symbol_underscore
+AC_REQUIRE([LT_SYS_MODULE_EXT])dnl for libltdl_cv_shlibext
+if test yes = "$lt_cv_sys_symbol_underscore"; then
+ if test yes = "$libltdl_cv_func_dlopen" || test yes = "$libltdl_cv_lib_dl_dlopen"; then
+ AC_CACHE_CHECK([whether we have to add an underscore for dlsym],
+ [libltdl_cv_need_uscore],
+ [libltdl_cv_need_uscore=unknown
+ dlsym_uscore_save_LIBS=$LIBS
+ LIBS="$LIBS $LIBADD_DLOPEN"
+ libname=conftmod # stay within 8.3 filename limits!
+ cat >$libname.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+int fnord () { return 42; }]
+_LT_EOF
+
+ # ltfn_module_cmds module_cmds
+ # Execute tilde-delimited MODULE_CMDS with environment primed for
+ # $module_cmds or $archive_cmds type content.
+ ltfn_module_cmds ()
+ {( # subshell avoids polluting parent global environment
+ module_cmds_save_ifs=$IFS; IFS='~'
+ for cmd in @S|@1; do
+ IFS=$module_cmds_save_ifs
+ libobjs=$libname.$ac_objext; lib=$libname$libltdl_cv_shlibext
+ rpath=/not-exists; soname=$libname$libltdl_cv_shlibext; output_objdir=.
+ major=; versuffix=; verstring=; deplibs=
+ ECHO=echo; wl=$lt_prog_compiler_wl; allow_undefined_flag=
+ eval $cmd
+ done
+ IFS=$module_cmds_save_ifs
+ )}
+
+ # Compile a loadable module using libtool macro expansion results.
+ $CC $pic_flag -c $libname.$ac_ext
+ ltfn_module_cmds "${module_cmds:-$archive_cmds}"
+
+ # Try to fetch fnord with dlsym().
+ libltdl_dlunknown=0; libltdl_dlnouscore=1; libltdl_dluscore=2
+ cat >conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+#include <stdio.h>
+#ifndef RTLD_GLOBAL
+# ifdef DL_GLOBAL
+# define RTLD_GLOBAL DL_GLOBAL
+# else
+# define RTLD_GLOBAL 0
+# endif
+#endif
+#ifndef RTLD_NOW
+# ifdef DL_NOW
+# define RTLD_NOW DL_NOW
+# else
+# define RTLD_NOW 0
+# endif
+#endif
+int main () {
+ void *handle = dlopen ("`pwd`/$libname$libltdl_cv_shlibext", RTLD_GLOBAL|RTLD_NOW);
+ int status = $libltdl_dlunknown;
+ if (handle) {
+ if (dlsym (handle, "fnord"))
+ status = $libltdl_dlnouscore;
+ else {
+ if (dlsym (handle, "_fnord"))
+ status = $libltdl_dluscore;
+ else
+ puts (dlerror ());
+ }
+ dlclose (handle);
+ } else
+ puts (dlerror ());
+ return status;
+}]
+_LT_EOF
+ if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+ libltdl_status=$?
+ case x$libltdl_status in
+ x$libltdl_dlnouscore) libltdl_cv_need_uscore=no ;;
+ x$libltdl_dluscore) libltdl_cv_need_uscore=yes ;;
+ x*) libltdl_cv_need_uscore=unknown ;;
+ esac
+ fi
+ rm -rf conftest* $libname*
+ LIBS=$dlsym_uscore_save_LIBS
+ ])
+ fi
+fi
+
+if test yes = "$libltdl_cv_need_uscore"; then
+ AC_DEFINE([NEED_USCORE], [1],
+ [Define if dlsym() requires a leading underscore in symbol names.])
+fi
+])
+m4trace:/usr/share/aclocal/ltdl.m4:908: -1- AU_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:908: -1- AC_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_warn([obsolete], [The macro `AC_LTDL_DLSYM_USCORE' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])])
+m4trace:/usr/share/aclocal/ltoptions.m4:14: -1- AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+m4trace:/usr/share/aclocal/ltoptions.m4:113: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'dlopen' option into LT_INIT's first parameter.])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:113: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN], [m4_warn([obsolete], [The macro `AC_LIBTOOL_DLOPEN' is obsolete.
+You should run autoupdate.])dnl
+_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'dlopen' option into LT_INIT's first parameter.])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:148: -1- AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'win32-dll' option into LT_INIT's first parameter.])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:148: -1- AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [m4_warn([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete.
+You should run autoupdate.])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'win32-dll' option into LT_INIT's first parameter.])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:197: -1- AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:201: -1- AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:205: -1- AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+m4trace:/usr/share/aclocal/ltoptions.m4:205: -1- AC_DEFUN([AM_ENABLE_SHARED], [m4_warn([obsolete], [The macro `AM_ENABLE_SHARED' is obsolete.
+You should run autoupdate.])dnl
+AC_ENABLE_SHARED($@)])
+m4trace:/usr/share/aclocal/ltoptions.m4:206: -1- AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+m4trace:/usr/share/aclocal/ltoptions.m4:206: -1- AC_DEFUN([AM_DISABLE_SHARED], [m4_warn([obsolete], [The macro `AM_DISABLE_SHARED' is obsolete.
+You should run autoupdate.])dnl
+AC_DISABLE_SHARED($@)])
+m4trace:/usr/share/aclocal/ltoptions.m4:251: -1- AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:255: -1- AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:259: -1- AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+m4trace:/usr/share/aclocal/ltoptions.m4:259: -1- AC_DEFUN([AM_ENABLE_STATIC], [m4_warn([obsolete], [The macro `AM_ENABLE_STATIC' is obsolete.
+You should run autoupdate.])dnl
+AC_ENABLE_STATIC($@)])
+m4trace:/usr/share/aclocal/ltoptions.m4:260: -1- AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+m4trace:/usr/share/aclocal/ltoptions.m4:260: -1- AC_DEFUN([AM_DISABLE_STATIC], [m4_warn([obsolete], [The macro `AM_DISABLE_STATIC' is obsolete.
+You should run autoupdate.])dnl
+AC_DISABLE_STATIC($@)])
+m4trace:/usr/share/aclocal/ltoptions.m4:305: -1- AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'fast-install' option into LT_INIT's first parameter.])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:305: -1- AC_DEFUN([AC_ENABLE_FAST_INSTALL], [m4_warn([obsolete], [The macro `AC_ENABLE_FAST_INSTALL' is obsolete.
+You should run autoupdate.])dnl
+_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'fast-install' option into LT_INIT's first parameter.])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:312: -1- AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'disable-fast-install' option into LT_INIT's first parameter.])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:312: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL], [m4_warn([obsolete], [The macro `AC_DISABLE_FAST_INSTALL' is obsolete.
+You should run autoupdate.])dnl
+_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'disable-fast-install' option into LT_INIT's first parameter.])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:411: -1- AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'pic-only' option into LT_INIT's first parameter.])
+])
+m4trace:/usr/share/aclocal/ltoptions.m4:411: -1- AC_DEFUN([AC_LIBTOOL_PICMODE], [m4_warn([obsolete], [The macro `AC_LIBTOOL_PICMODE' is obsolete.
+You should run autoupdate.])dnl
+_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'pic-only' option into LT_INIT's first parameter.])
+])
+m4trace:/usr/share/aclocal/ltsugar.m4:14: -1- AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+m4trace:/usr/share/aclocal/ltversion.m4:19: -1- AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.7'
+macro_revision='2.4.7'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:37: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:41: -1- AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:42: -1- AC_DEFUN([_LT_AC_SHELL_INIT])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:43: -1- AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:45: -1- AC_DEFUN([_LT_AC_TAGVAR])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:46: -1- AC_DEFUN([AC_LTDL_ENABLE_INSTALL])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:47: -1- AC_DEFUN([AC_LTDL_PREOPEN])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:48: -1- AC_DEFUN([_LT_AC_SYS_COMPILER])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:49: -1- AC_DEFUN([_LT_AC_LOCK])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:50: -1- AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:51: -1- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:52: -1- AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:53: -1- AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:54: -1- AC_DEFUN([AC_LIBTOOL_OBJDIR])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:55: -1- AC_DEFUN([AC_LTDL_OBJDIR])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:56: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:57: -1- AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:58: -1- AC_DEFUN([AC_PATH_MAGIC])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:59: -1- AC_DEFUN([AC_PROG_LD_GNU])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:60: -1- AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:61: -1- AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:62: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:63: -1- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:64: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:65: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:66: -1- AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:67: -1- AC_DEFUN([LT_AC_PROG_EGREP])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:72: -1- AC_DEFUN([_AC_PROG_LIBTOOL])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:73: -1- AC_DEFUN([AC_LIBTOOL_SETUP])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:74: -1- AC_DEFUN([_LT_AC_CHECK_DLFCN])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:75: -1- AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:76: -1- AC_DEFUN([_LT_AC_TAGCONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:78: -1- AC_DEFUN([_LT_AC_LANG_CXX])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:79: -1- AC_DEFUN([_LT_AC_LANG_F77])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:80: -1- AC_DEFUN([_LT_AC_LANG_GCJ])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:81: -1- AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:82: -1- AC_DEFUN([_LT_AC_LANG_C_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:83: -1- AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:84: -1- AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:85: -1- AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:86: -1- AC_DEFUN([_LT_AC_LANG_F77_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:87: -1- AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:88: -1- AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:89: -1- AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:90: -1- AC_DEFUN([_LT_AC_LANG_RC_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:91: -1- AC_DEFUN([AC_LIBTOOL_CONFIG])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:92: -1- AC_DEFUN([_LT_AC_FILE_LTDLL_C])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:94: -1- AC_DEFUN([_LT_AC_PROG_CXXCPP])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:97: -1- AC_DEFUN([_LT_PROG_F77])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:98: -1- AC_DEFUN([_LT_PROG_FC])
+m4trace:/usr/share/aclocal/lt~obsolete.m4:99: -1- AC_DEFUN([_LT_PROG_CXX])
+m4trace:/usr/share/aclocal-1.16/amversion.m4:14: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.16.5], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+m4trace:/usr/share/aclocal-1.16/amversion.m4:33: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.5])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+m4trace:/usr/share/aclocal-1.16/as.m4:11: -1- AC_DEFUN([AM_PROG_AS], [# By default we simply use the C compiler to build assembly code.
+AC_REQUIRE([AC_PROG_CC])
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)])
+AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)])
+_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
+])
+m4trace:/usr/share/aclocal-1.16/auxdir.m4:47: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+m4trace:/usr/share/aclocal-1.16/cond.m4:12: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+m4trace:/usr/share/aclocal-1.16/depend.m4:26: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+m4trace:/usr/share/aclocal-1.16/depend.m4:163: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+m4trace:/usr/share/aclocal-1.16/depend.m4:171: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+m4trace:/usr/share/aclocal-1.16/depout.m4:11: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])
+m4trace:/usr/share/aclocal-1.16/depout.m4:64: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+m4trace:/usr/share/aclocal-1.16/init.m4:29: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl
+m4_ifdef([_$0_ALREADY_INIT],
+ [m4_fatal([$0 expanded multiple times
+]m4_defn([_$0_ALREADY_INIT]))],
+ [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+AC_SUBST([CTAGS])
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+AC_SUBST([ETAGS])
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+AC_SUBST([CSCOPE])
+
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+m4trace:/usr/share/aclocal-1.16/init.m4:204: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+m4trace:/usr/share/aclocal-1.16/install-sh.m4:11: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+m4trace:/usr/share/aclocal-1.16/lead-dot.m4:10: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+m4trace:/usr/share/aclocal-1.16/maintainer.m4:16: -1- AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]),
+ [enable], [m4_define([am_maintainer_other], [disable])],
+ [disable], [m4_define([am_maintainer_other], [enable])],
+ [m4_define([am_maintainer_other], [enable])
+ m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+ AC_ARG_ENABLE([maintainer-mode],
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST([MAINT])dnl
+
+])
+m4trace:/usr/share/aclocal-1.16/make.m4:13: -1- AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+m4trace:/usr/share/aclocal-1.16/make.m4:42: -1- m4_pattern_allow([^am__quote$])
+m4trace:/usr/share/aclocal-1.16/missing.m4:11: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+m4trace:/usr/share/aclocal-1.16/missing.m4:20: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+m4trace:/usr/share/aclocal-1.16/options.m4:11: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+m4trace:/usr/share/aclocal-1.16/options.m4:17: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+m4trace:/usr/share/aclocal-1.16/options.m4:23: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+m4trace:/usr/share/aclocal-1.16/options.m4:29: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+m4trace:/usr/share/aclocal-1.16/prog-cc-c-o.m4:12: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+m4trace:/usr/share/aclocal-1.16/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+m4trace:/usr/share/aclocal-1.16/runlog.m4:12: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+m4trace:/usr/share/aclocal-1.16/sanity.m4:11: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+m4trace:/usr/share/aclocal-1.16/silent.m4:12: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+m4trace:/usr/share/aclocal-1.16/strip.m4:17: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+m4trace:/usr/share/aclocal-1.16/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE])
+m4trace:/usr/share/aclocal-1.16/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+m4trace:/usr/share/aclocal-1.16/tar.m4:23: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+])
+m4trace:m4/gc_set_version.m4:16: -1- AC_DEFUN([GC_SET_VERSION], [
+ AC_MSG_CHECKING(GC version numbers)
+ GC_VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\([[0-9]][[0-9]]*\)[[.]].*$/\1/g'`
+ GC_VERSION_MINOR=`echo $PACKAGE_VERSION | sed 's/^[[^.]]*[[.]]\([[0-9]][[0-9]]*\).*$/\1/g'`
+ GC_VERSION_MICRO=`echo $PACKAGE_VERSION | sed 's/^[[^.]]*[[.]][[^.]]*[[.]]\([[0-9]][[0-9]]*\)$/\1/g'`
+
+ if test :$GC_VERSION_MAJOR: = :: \
+ -o :$GC_VERSION_MINOR: = :: \
+ -o :$GC_VERSION_MICRO: = :: ;
+ then
+ AC_MSG_RESULT(invalid)
+ AC_MSG_ERROR([nonconforming PACKAGE_VERSION='$PACKAGE_VERSION'])
+ fi
+
+ AC_DEFINE_UNQUOTED([GC_VERSION_MAJOR], $GC_VERSION_MAJOR,
+ [The major version number of this GC release.])
+ AC_DEFINE_UNQUOTED([GC_VERSION_MINOR], $GC_VERSION_MINOR,
+ [The minor version number of this GC release.])
+ AC_DEFINE_UNQUOTED([GC_VERSION_MICRO], $GC_VERSION_MICRO,
+ [The micro version number of this GC release.])
+ AC_MSG_RESULT(major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO)
+])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?A[CHUM]_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([_AC_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS'])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^AS_FLAGS$])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?m4_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^dnl$])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?AS_])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^SHELL$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PATH_SEPARATOR$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_URL$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^exec_prefix$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^prefix$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^program_transform_name$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^bindir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sbindir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^libexecdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^datarootdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^datadir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sysconfdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sharedstatedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^localstatedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^runstatedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^includedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^oldincludedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^docdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^infodir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^htmldir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^dvidir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^pdfdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^psdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^libdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^localedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^mandir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_URL$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^DEFS$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_C$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_N$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_T$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^build_alias$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^host_alias$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^target_alias$])
+m4trace:configure.ac:21: -1- AC_CONFIG_MACRO_DIR([m4])
+m4trace:configure.ac:21: -1- AC_CONFIG_MACRO_DIR_TRACE([m4])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_cpu$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_vendor$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_os$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_cpu$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_vendor$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_os$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_cpu$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_vendor$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_os$])
+m4trace:configure.ac:24: -1- GC_SET_VERSION
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MAJOR$])
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MINOR$])
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MICRO$])
+m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([foreign nostdinc subdir-objects])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$])
+m4trace:configure.ac:25: -1- AM_SET_CURRENT_AUTOMAKE_VERSION
+m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.16.5])
+m4trace:configure.ac:25: -1- _AM_AUTOCONF_VERSION([2.71])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$])
+m4trace:configure.ac:25: -1- _AM_SET_OPTIONS([foreign nostdinc subdir-objects])
+m4trace:configure.ac:25: -1- _AM_SET_OPTION([foreign])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([foreign])
+m4trace:configure.ac:25: -1- _AM_SET_OPTION([nostdinc])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([nostdinc])
+m4trace:configure.ac:25: -1- _AM_SET_OPTION([subdir-objects])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([subdir-objects])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$])
+m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-define])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$])
+m4trace:configure.ac:25: -1- AM_SANITY_CHECK
+m4trace:configure.ac:25: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+m4trace:configure.ac:25: -1- AM_MISSING_HAS_RUN
+m4trace:configure.ac:25: -1- AM_AUX_DIR_EXPAND
+m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$])
+m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOCONF], [autoconf])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$])
+m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$])
+m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$])
+m4trace:configure.ac:25: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$])
+m4trace:configure.ac:25: -1- AM_PROG_INSTALL_SH
+m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$])
+m4trace:configure.ac:25: -1- AM_PROG_INSTALL_STRIP
+m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$])
+m4trace:configure.ac:25: -1- AM_SET_LEADING_DOT
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$])
+m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-ustar])
+m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-pax])
+m4trace:configure.ac:25: -1- _AM_PROG_TAR([v7])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$])
+m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-dependencies])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CTAGS$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^ETAGS$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CSCOPE$])
+m4trace:configure.ac:25: -1- AM_SILENT_RULES
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_V$])
+m4trace:configure.ac:25: -1- AM_SUBST_NOTMAKE([AM_V])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_V])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_DEFAULT_V$])
+m4trace:configure.ac:25: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_BACKSLASH$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH])
+m4trace:configure.ac:27: -1- AM_MAINTAINER_MODE
+m4trace:configure.ac:27: -1- AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINTAINER_MODE_TRUE$])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINTAINER_MODE_FALSE$])
+m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_TRUE])
+m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_FALSE])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINT$])
+m4trace:configure.ac:29: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:30: -1- m4_pattern_allow([^GC_VERSION$])
+m4trace:configure.ac:32: -1- AM_PROG_CC_C_O
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^ac_ct_CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^EXEEXT$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^OBJEXT$])
+m4trace:configure.ac:32: -1- _AM_PROG_CC_C_O
+m4trace:configure.ac:32: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext])
+m4trace:configure.ac:32: -1- _AM_DEPENDENCIES([CC])
+m4trace:configure.ac:32: -1- AM_SET_DEPDIR
+m4trace:configure.ac:32: -1- m4_pattern_allow([^DEPDIR$])
+m4trace:configure.ac:32: -1- AM_OUTPUT_DEPENDENCY_COMMANDS
+m4trace:configure.ac:32: -1- AM_MAKE_INCLUDE
+m4trace:configure.ac:32: -1- AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__include$])
+m4trace:configure.ac:32: -1- AM_DEP_TRACK
+m4trace:configure.ac:32: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEP_TRUE$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEP_FALSE$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEPBACKSLASH$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__nodep$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__nodep])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CCDEPMODE$])
+m4trace:configure.ac:32: -1- AM_CONDITIONAL([am__fastdepCC], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__fastdepCC_TRUE$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__fastdepCC_FALSE$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXXFLAGS$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^ac_ct_CXX$])
+m4trace:configure.ac:33: -1- _AM_DEPENDENCIES([CXX])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXXDEPMODE$])
+m4trace:configure.ac:33: -1- AM_CONDITIONAL([am__fastdepCXX], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$])
+m4trace:configure.ac:33: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE])
+m4trace:configure.ac:33: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE])
+m4trace:configure.ac:34: -1- AM_PROG_AS
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCAS$])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCASFLAGS$])
+m4trace:configure.ac:34: -1- _AM_IF_OPTION([no-dependencies], [], [_AM_DEPENDENCIES([CCAS])])
+m4trace:configure.ac:34: -2- _AM_MANGLE_OPTION([no-dependencies])
+m4trace:configure.ac:34: -1- _AM_DEPENDENCIES([CCAS])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCASDEPMODE$])
+m4trace:configure.ac:34: -1- AM_CONDITIONAL([am__fastdepCCAS], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^am__fastdepCCAS_TRUE$])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^am__fastdepCCAS_FALSE$])
+m4trace:configure.ac:34: -1- _AM_SUBST_NOTMAKE([am__fastdepCCAS_TRUE])
+m4trace:configure.ac:34: -1- _AM_SUBST_NOTMAKE([am__fastdepCCAS_FALSE])
+m4trace:configure.ac:36: -1- LT_INIT([disable-static])
+m4trace:configure.ac:36: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])
+m4trace:configure.ac:36: -1- LTOPTIONS_VERSION
+m4trace:configure.ac:36: -1- LTSUGAR_VERSION
+m4trace:configure.ac:36: -1- LTVERSION_VERSION
+m4trace:configure.ac:36: -1- LTOBSOLETE_VERSION
+m4trace:configure.ac:36: -1- _LT_PROG_LTMAIN
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LIBTOOL$])
+m4trace:configure.ac:36: -1- _LT_PREPARE_SED_QUOTE_VARS
+m4trace:configure.ac:36: -1- _LT_PROG_ECHO_BACKSLASH
+m4trace:configure.ac:36: -1- LT_PATH_LD
+m4trace:configure.ac:36: -1- m4_pattern_allow([^SED$])
+m4trace:configure.ac:36: -1- AC_PROG_EGREP
+m4trace:configure.ac:36: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^EGREP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^FGREP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LD$])
+m4trace:configure.ac:36: -1- LT_PATH_NM
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DUMPBIN$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_DUMPBIN$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DUMPBIN$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^NM$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LN_S$])
+m4trace:configure.ac:36: -1- LT_CMD_MAX_LEN
+m4trace:configure.ac:36: -1- m4_pattern_allow([^FILECMD$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OBJDUMP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OBJDUMP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DLLTOOL$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DLLTOOL$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^AR$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_AR$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^STRIP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^RANLIB$])
+m4trace:configure.ac:36: -1- _LT_WITH_SYSROOT
+m4trace:configure.ac:36: -1- m4_pattern_allow([LT_OBJDIR])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_OBJDIR$])
+m4trace:configure.ac:36: -1- _LT_CC_BASENAME([$compiler])
+m4trace:configure.ac:36: -1- _LT_PATH_TOOL_PREFIX([${ac_tool_prefix}file], [/usr/bin$PATH_SEPARATOR$PATH])
+m4trace:configure.ac:36: -1- _LT_PATH_TOOL_PREFIX([file], [/usr/bin$PATH_SEPARATOR$PATH])
+m4trace:configure.ac:36: -1- LT_SUPPORTED_TAG([CC])
+m4trace:configure.ac:36: -1- _LT_COMPILER_BOILERPLATE
+m4trace:configure.ac:36: -1- _LT_LINKER_BOILERPLATE
+m4trace:configure.ac:36: -1- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], [lt_cv_prog_compiler_rtti_exceptions], [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, )="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, ) -fno-rtti -fno-exceptions"])
+m4trace:configure.ac:36: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, ) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, )], [$_LT_TAGVAR(lt_prog_compiler_pic, )@&t@m4_if([],[],[ -DPIC],[m4_if([],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, ) in
+ "" | " "*) ;;
+ *) _LT_TAGVAR(lt_prog_compiler_pic, )=" $_LT_TAGVAR(lt_prog_compiler_pic, )" ;;
+ esac], [_LT_TAGVAR(lt_prog_compiler_pic, )=
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, )=no])
+m4trace:configure.ac:36: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, )=])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^MANIFEST_TOOL$])
+m4trace:configure.ac:36: -1- _LT_DLL_DEF_P([$export_symbols])
+m4trace:configure.ac:36: -1- _LT_DLL_DEF_P([$export_symbols])
+m4trace:configure.ac:36: -1- _LT_REQUIRED_DARWIN_CHECKS
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DSYMUTIL$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^NMEDIT$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LIPO$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OTOOL$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OTOOL64$])
+m4trace:configure.ac:36: -1- _LT_LINKER_OPTION([if $CC understands -b], [lt_cv_prog_compiler__b], [-b], [_LT_TAGVAR(archive_cmds, )='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, )='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$])
+m4trace:configure.ac:36: -1- LT_SYS_DLOPEN_SELF
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_stdio_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" stdio.h ]AS_TR_SH([stdio.h]) AS_TR_CPP([HAVE_stdio.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_stdlib_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" stdlib.h ]AS_TR_SH([stdlib.h]) AS_TR_CPP([HAVE_stdlib.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_string_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" string.h ]AS_TR_SH([string.h]) AS_TR_CPP([HAVE_string.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_inttypes_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" inttypes.h ]AS_TR_SH([inttypes.h]) AS_TR_CPP([HAVE_inttypes.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_stdint_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" stdint.h ]AS_TR_SH([stdint.h]) AS_TR_CPP([HAVE_stdint.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_strings_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" strings.h ]AS_TR_SH([strings.h]) AS_TR_CPP([HAVE_strings.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_sys_stat_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" sys/stat.h ]AS_TR_SH([sys/stat.h]) AS_TR_CPP([HAVE_sys/stat.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_sys_types_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" sys/types.h ]AS_TR_SH([sys/types.h]) AS_TR_CPP([HAVE_sys/types.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" unistd.h ]AS_TR_SH([unistd.h]) AS_TR_CPP([HAVE_unistd.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^STDC_HEADERS$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^HAVE_DLFCN_H$])
+m4trace:configure.ac:36: -1- LT_LANG([CXX])
+m4trace:configure.ac:36: -1- LT_SUPPORTED_TAG([CXX])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXCPP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXCPP$])
+m4trace:configure.ac:36: -1- _LT_COMPILER_BOILERPLATE
+m4trace:configure.ac:36: -1- _LT_LINKER_BOILERPLATE
+m4trace:configure.ac:36: -1- _LT_CC_BASENAME([$compiler])
+m4trace:configure.ac:36: -1- LT_PATH_LD
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LD$])
+m4trace:configure.ac:36: -1- _LT_DLL_DEF_P([$export_symbols])
+m4trace:configure.ac:36: -1- _LT_DLL_DEF_P([$export_symbols])
+m4trace:configure.ac:36: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, CXX) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, CXX)], [$_LT_TAGVAR(lt_prog_compiler_pic, CXX)@&t@m4_if([CXX],[],[ -DPIC],[m4_if([CXX],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, CXX) in
+ "" | " "*) ;;
+ *) _LT_TAGVAR(lt_prog_compiler_pic, CXX)=" $_LT_TAGVAR(lt_prog_compiler_pic, CXX)" ;;
+ esac], [_LT_TAGVAR(lt_prog_compiler_pic, CXX)=
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, CXX)=no])
+m4trace:configure.ac:36: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works_CXX], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, CXX)=])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$])
+m4trace:configure.ac:93: -1- AM_CONDITIONAL([EMSCRIPTEN], [test x$emscripten = xyes])
+m4trace:configure.ac:93: -1- m4_pattern_allow([^EMSCRIPTEN_TRUE$])
+m4trace:configure.ac:93: -1- m4_pattern_allow([^EMSCRIPTEN_FALSE$])
+m4trace:configure.ac:93: -1- _AM_SUBST_NOTMAKE([EMSCRIPTEN_TRUE])
+m4trace:configure.ac:93: -1- _AM_SUBST_NOTMAKE([EMSCRIPTEN_FALSE])
+m4trace:configure.ac:107: -1- m4_pattern_allow([^GC_CFLAGS$])
+m4trace:configure.ac:110: -1- m4_pattern_allow([^CFLAGS_EXTRA$])
+m4trace:configure.ac:157: -1- m4_pattern_allow([^GC_NO_THREADS_DISCOVERY$])
+m4trace:configure.ac:217: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:218: -1- m4_pattern_allow([^_REENTRANT$])
+m4trace:configure.ac:230: -1- m4_pattern_allow([^_POSIX_C_SOURCE$])
+m4trace:configure.ac:251: -1- m4_pattern_allow([^_PTHREADS$])
+m4trace:configure.ac:266: -1- m4_pattern_allow([^GC_WIN32_PTHREADS$])
+m4trace:configure.ac:297: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:305: -1- m4_pattern_allow([^GC_INSIDE_DLL$])
+m4trace:configure.ac:309: -1- m4_pattern_allow([^EMPTY_GETENV_RESULTS$])
+m4trace:configure.ac:313: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:324: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:325: -1- m4_pattern_allow([^_REENTRANT$])
+m4trace:configure.ac:331: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:356: -1- m4_pattern_allow([^THREADDLLIBS$])
+m4trace:configure.ac:358: -1- AM_CONDITIONAL([THREADS], [test x$THREADS != xnone])
+m4trace:configure.ac:358: -1- m4_pattern_allow([^THREADS_TRUE$])
+m4trace:configure.ac:358: -1- m4_pattern_allow([^THREADS_FALSE$])
+m4trace:configure.ac:358: -1- _AM_SUBST_NOTMAKE([THREADS_TRUE])
+m4trace:configure.ac:358: -1- _AM_SUBST_NOTMAKE([THREADS_FALSE])
+m4trace:configure.ac:359: -1- AM_CONDITIONAL([PTHREADS], [test x$THREADS = xposix])
+m4trace:configure.ac:359: -1- m4_pattern_allow([^PTHREADS_TRUE$])
+m4trace:configure.ac:359: -1- m4_pattern_allow([^PTHREADS_FALSE$])
+m4trace:configure.ac:359: -1- _AM_SUBST_NOTMAKE([PTHREADS_TRUE])
+m4trace:configure.ac:359: -1- _AM_SUBST_NOTMAKE([PTHREADS_FALSE])
+m4trace:configure.ac:360: -1- AM_CONDITIONAL([DARWIN_THREADS], [test x$darwin_threads = xtrue])
+m4trace:configure.ac:360: -1- m4_pattern_allow([^DARWIN_THREADS_TRUE$])
+m4trace:configure.ac:360: -1- m4_pattern_allow([^DARWIN_THREADS_FALSE$])
+m4trace:configure.ac:360: -1- _AM_SUBST_NOTMAKE([DARWIN_THREADS_TRUE])
+m4trace:configure.ac:360: -1- _AM_SUBST_NOTMAKE([DARWIN_THREADS_FALSE])
+m4trace:configure.ac:361: -1- AM_CONDITIONAL([WIN32_THREADS], [test x$win32_threads = xtrue])
+m4trace:configure.ac:361: -1- m4_pattern_allow([^WIN32_THREADS_TRUE$])
+m4trace:configure.ac:361: -1- m4_pattern_allow([^WIN32_THREADS_FALSE$])
+m4trace:configure.ac:361: -1- _AM_SUBST_NOTMAKE([WIN32_THREADS_TRUE])
+m4trace:configure.ac:361: -1- _AM_SUBST_NOTMAKE([WIN32_THREADS_FALSE])
+m4trace:configure.ac:382: -1- m4_pattern_allow([^GC_READ_ENV_FILE$])
+m4trace:configure.ac:387: -1- AM_CONDITIONAL([PTHREAD_START_STANDALONE], [test x$pthread_start_standalone = xyes])
+m4trace:configure.ac:387: -1- m4_pattern_allow([^PTHREAD_START_STANDALONE_TRUE$])
+m4trace:configure.ac:387: -1- m4_pattern_allow([^PTHREAD_START_STANDALONE_FALSE$])
+m4trace:configure.ac:387: -1- _AM_SUBST_NOTMAKE([PTHREAD_START_STANDALONE_TRUE])
+m4trace:configure.ac:387: -1- _AM_SUBST_NOTMAKE([PTHREAD_START_STANDALONE_FALSE])
+m4trace:configure.ac:422: -1- m4_pattern_allow([^DARWIN_DONT_PARSE_STACK$])
+m4trace:configure.ac:427: -1- AM_CONDITIONAL([ASM_WITH_CPP_UNSUPPORTED], [test $compiler_xlc = yes -o $compiler_suncc = yes])
+m4trace:configure.ac:427: -1- m4_pattern_allow([^ASM_WITH_CPP_UNSUPPORTED_TRUE$])
+m4trace:configure.ac:427: -1- m4_pattern_allow([^ASM_WITH_CPP_UNSUPPORTED_FALSE$])
+m4trace:configure.ac:427: -1- _AM_SUBST_NOTMAKE([ASM_WITH_CPP_UNSUPPORTED_TRUE])
+m4trace:configure.ac:427: -1- _AM_SUBST_NOTMAKE([ASM_WITH_CPP_UNSUPPORTED_FALSE])
+m4trace:configure.ac:455: -1- m4_pattern_allow([^NO_GETCONTEXT$])
+m4trace:configure.ac:459: -1- m4_pattern_allow([^HAVE_DL_ITERATE_PHDR$])
+m4trace:configure.ac:481: -1- AM_CONDITIONAL([AVOID_CPP_LIB], [test $avoid_cpp_lib = yes])
+m4trace:configure.ac:481: -1- m4_pattern_allow([^AVOID_CPP_LIB_TRUE$])
+m4trace:configure.ac:481: -1- m4_pattern_allow([^AVOID_CPP_LIB_FALSE$])
+m4trace:configure.ac:481: -1- _AM_SUBST_NOTMAKE([AVOID_CPP_LIB_TRUE])
+m4trace:configure.ac:481: -1- _AM_SUBST_NOTMAKE([AVOID_CPP_LIB_FALSE])
+m4trace:configure.ac:484: -1- m4_pattern_allow([^GC_MISSING_EXECINFO_H$])
+m4trace:configure.ac:493: -1- m4_pattern_allow([^extra_ldflags_libgc$])
+m4trace:configure.ac:495: -1- m4_pattern_allow([^EXTRA_TEST_LIBS$])
+m4trace:configure.ac:498: -1- m4_pattern_allow([^target_all$])
+m4trace:configure.ac:518: -1- m4_pattern_allow([^ECOS$])
+m4trace:configure.ac:524: -1- AM_CONDITIONAL([CPLUSPLUS], [test "${enable_cplusplus}" = yes])
+m4trace:configure.ac:524: -1- m4_pattern_allow([^CPLUSPLUS_TRUE$])
+m4trace:configure.ac:524: -1- m4_pattern_allow([^CPLUSPLUS_FALSE$])
+m4trace:configure.ac:524: -1- _AM_SUBST_NOTMAKE([CPLUSPLUS_TRUE])
+m4trace:configure.ac:524: -1- _AM_SUBST_NOTMAKE([CPLUSPLUS_FALSE])
+m4trace:configure.ac:529: -1- AM_CONDITIONAL([GC_TBA_LIBRARY], [test "${enable_cplusplus}" = yes \
+ -a "${enable_throw_bad_alloc_library}" != no])
+m4trace:configure.ac:529: -1- m4_pattern_allow([^GC_TBA_LIBRARY_TRUE$])
+m4trace:configure.ac:529: -1- m4_pattern_allow([^GC_TBA_LIBRARY_FALSE$])
+m4trace:configure.ac:529: -1- _AM_SUBST_NOTMAKE([GC_TBA_LIBRARY_TRUE])
+m4trace:configure.ac:529: -1- _AM_SUBST_NOTMAKE([GC_TBA_LIBRARY_FALSE])
+m4trace:configure.ac:550: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:551: -1- m4_pattern_allow([^AM_CFLAGS$])
+m4trace:configure.ac:552: -1- m4_pattern_allow([^AM_CPPFLAGS$])
+m4trace:configure.ac:553: -1- m4_pattern_allow([^CXXLIBS$])
+m4trace:configure.ac:558: -1- AC_ENABLE_SHARED
+m4trace:configure.ac:572: -1- m4_pattern_allow([^GC_DLL$])
+m4trace:configure.ac:590: -1- m4_pattern_allow([^DONT_USE_USER32_DLL$])
+m4trace:configure.ac:613: -1- m4_pattern_allow([^SOLARIS25_PROC_VDB_BUG_FIXED$])
+m4trace:configure.ac:627: -1- m4_pattern_allow([^SUNOS53_SHARED_LIB$])
+m4trace:configure.ac:640: -1- m4_pattern_allow([^addobjs$])
+m4trace:configure.ac:641: -1- m4_pattern_allow([^addlibs$])
+m4trace:configure.ac:643: -1- LT_INIT
+m4trace:configure.ac:704: -1- m4_pattern_allow([^NO_EXECUTE_PERMISSION$])
+m4trace:configure.ac:707: -1- m4_pattern_allow([^ALL_INTERIOR_POINTERS$])
+m4trace:configure.ac:718: -1- m4_pattern_allow([^GC_GCJ_SUPPORT$])
+m4trace:configure.ac:724: -1- m4_pattern_allow([^GC_ENABLE_SUSPEND_THREAD$])
+m4trace:configure.ac:728: -1- m4_pattern_allow([^GC_ENABLE_SUSPEND_THREAD$])
+m4trace:configure.ac:733: -1- AM_CONDITIONAL([ENABLE_GCJ_SUPPORT], [test x"enable_gcj_support" != xno])
+m4trace:configure.ac:733: -1- m4_pattern_allow([^ENABLE_GCJ_SUPPORT_TRUE$])
+m4trace:configure.ac:733: -1- m4_pattern_allow([^ENABLE_GCJ_SUPPORT_FALSE$])
+m4trace:configure.ac:733: -1- _AM_SUBST_NOTMAKE([ENABLE_GCJ_SUPPORT_TRUE])
+m4trace:configure.ac:733: -1- _AM_SUBST_NOTMAKE([ENABLE_GCJ_SUPPORT_FALSE])
+m4trace:configure.ac:740: -1- m4_pattern_allow([^GC_USESIGRT_SIGNALS$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^KEEP_BACK_PTRS$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^DBG_HDRS_ALL$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^SAVE_CALL_COUNT$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^GC_HAVE_BUILTIN_BACKTRACE$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^SAVE_CALL_COUNT$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:789: -1- AM_CONDITIONAL([MAKE_BACK_GRAPH], [test x"$enable_gc_debug" = xyes])
+m4trace:configure.ac:789: -1- m4_pattern_allow([^MAKE_BACK_GRAPH_TRUE$])
+m4trace:configure.ac:789: -1- m4_pattern_allow([^MAKE_BACK_GRAPH_FALSE$])
+m4trace:configure.ac:789: -1- _AM_SUBST_NOTMAKE([MAKE_BACK_GRAPH_TRUE])
+m4trace:configure.ac:789: -1- _AM_SUBST_NOTMAKE([MAKE_BACK_GRAPH_FALSE])
+m4trace:configure.ac:790: -1- AM_CONDITIONAL([KEEP_BACK_PTRS], [test x"$keep_back_ptrs" = xtrue])
+m4trace:configure.ac:790: -1- m4_pattern_allow([^KEEP_BACK_PTRS_TRUE$])
+m4trace:configure.ac:790: -1- m4_pattern_allow([^KEEP_BACK_PTRS_FALSE$])
+m4trace:configure.ac:790: -1- _AM_SUBST_NOTMAKE([KEEP_BACK_PTRS_TRUE])
+m4trace:configure.ac:790: -1- _AM_SUBST_NOTMAKE([KEEP_BACK_PTRS_FALSE])
+m4trace:configure.ac:822: -1- m4_pattern_allow([^HAVE_DLADDR$])
+m4trace:configure.ac:829: -1- m4_pattern_allow([^GC_NO_SIGSETJMP$])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID$])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG$])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITH_TID$])
+m4trace:configure.ac:877: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.ac:878: -1- m4_pattern_allow([^CXXFLAGS$])
+m4trace:configure.ac:885: -1- m4_pattern_allow([^JAVA_FINALIZATION$])
+m4trace:configure.ac:892: -1- m4_pattern_allow([^GC_ATOMIC_UNCOLLECTABLE$])
+m4trace:configure.ac:902: -1- m4_pattern_allow([^REDIRECT_MALLOC$])
+m4trace:configure.ac:904: -1- m4_pattern_allow([^REDIRECT_REALLOC$])
+m4trace:configure.ac:906: -1- m4_pattern_allow([^REDIRECT_FREE$])
+m4trace:configure.ac:909: -1- m4_pattern_allow([^REDIRECT_MALLOC$])
+m4trace:configure.ac:911: -1- m4_pattern_allow([^GC_USE_DLOPEN_WRAP$])
+m4trace:configure.ac:918: -1- m4_pattern_allow([^ENABLE_DISCLAIM$])
+m4trace:configure.ac:921: -1- AM_CONDITIONAL([ENABLE_DISCLAIM], [test x"$enable_disclaim" != xno])
+m4trace:configure.ac:921: -1- m4_pattern_allow([^ENABLE_DISCLAIM_TRUE$])
+m4trace:configure.ac:921: -1- m4_pattern_allow([^ENABLE_DISCLAIM_FALSE$])
+m4trace:configure.ac:921: -1- _AM_SUBST_NOTMAKE([ENABLE_DISCLAIM_TRUE])
+m4trace:configure.ac:921: -1- _AM_SUBST_NOTMAKE([ENABLE_DISCLAIM_FALSE])
+m4trace:configure.ac:928: -1- m4_pattern_allow([^LARGE_CONFIG$])
+m4trace:configure.ac:936: -1- m4_pattern_allow([^NO_CLOCK$])
+m4trace:configure.ac:937: -1- m4_pattern_allow([^SMALL_CONFIG$])
+m4trace:configure.ac:942: -1- m4_pattern_allow([^NO_DEBUGGING$])
+m4trace:configure.ac:946: -1- m4_pattern_allow([^UNWINDLIBS$])
+m4trace:configure.ac:952: -1- m4_pattern_allow([^GC_ASSERTIONS$])
+m4trace:configure.ac:967: -1- m4_pattern_allow([^USE_MMAP$])
+m4trace:configure.ac:972: -1- m4_pattern_allow([^USE_MUNMAP$])
+m4trace:configure.ac:978: -1- m4_pattern_allow([^MUNMAP_THRESHOLD$])
+m4trace:configure.ac:982: -1- m4_pattern_allow([^USE_MMAP$])
+m4trace:configure.ac:992: -1- m4_pattern_allow([^IGNORE_DYNAMIC_LOADING$])
+m4trace:configure.ac:1001: -1- m4_pattern_allow([^GC_DONT_REGISTER_MAIN_STATIC_DATA$])
+m4trace:configure.ac:1014: -1- m4_pattern_allow([^CHECKSUMS$])
+m4trace:configure.ac:1018: -1- AM_CONDITIONAL([CHECKSUMS], [test x$enable_checksums = xyes])
+m4trace:configure.ac:1018: -1- m4_pattern_allow([^CHECKSUMS_TRUE$])
+m4trace:configure.ac:1018: -1- m4_pattern_allow([^CHECKSUMS_FALSE$])
+m4trace:configure.ac:1018: -1- _AM_SUBST_NOTMAKE([CHECKSUMS_TRUE])
+m4trace:configure.ac:1018: -1- _AM_SUBST_NOTMAKE([CHECKSUMS_FALSE])
+m4trace:configure.ac:1020: -1- AM_CONDITIONAL([USE_LIBDIR], [test -z "$with_cross_host"])
+m4trace:configure.ac:1020: -1- m4_pattern_allow([^USE_LIBDIR_TRUE$])
+m4trace:configure.ac:1020: -1- m4_pattern_allow([^USE_LIBDIR_FALSE$])
+m4trace:configure.ac:1020: -1- _AM_SUBST_NOTMAKE([USE_LIBDIR_TRUE])
+m4trace:configure.ac:1020: -1- _AM_SUBST_NOTMAKE([USE_LIBDIR_FALSE])
+m4trace:configure.ac:1034: -1- m4_pattern_allow([^WERROR_CFLAGS$])
+m4trace:configure.ac:1042: -1- AM_CONDITIONAL([SINGLE_GC_OBJ], [test x"$enable_single_obj_compilation" = xyes])
+m4trace:configure.ac:1042: -1- m4_pattern_allow([^SINGLE_GC_OBJ_TRUE$])
+m4trace:configure.ac:1042: -1- m4_pattern_allow([^SINGLE_GC_OBJ_FALSE$])
+m4trace:configure.ac:1042: -1- _AM_SUBST_NOTMAKE([SINGLE_GC_OBJ_TRUE])
+m4trace:configure.ac:1042: -1- _AM_SUBST_NOTMAKE([SINGLE_GC_OBJ_FALSE])
+m4trace:configure.ac:1062: -1- AM_CONDITIONAL([ENABLE_DOCS], [test x$enable_docs != xno])
+m4trace:configure.ac:1062: -1- m4_pattern_allow([^ENABLE_DOCS_TRUE$])
+m4trace:configure.ac:1062: -1- m4_pattern_allow([^ENABLE_DOCS_FALSE$])
+m4trace:configure.ac:1062: -1- _AM_SUBST_NOTMAKE([ENABLE_DOCS_TRUE])
+m4trace:configure.ac:1062: -1- _AM_SUBST_NOTMAKE([ENABLE_DOCS_FALSE])
+m4trace:configure.ac:1064: -1- AM_CONDITIONAL([ENABLE_SHARED], [test x$enable_shared = xyes])
+m4trace:configure.ac:1064: -1- m4_pattern_allow([^ENABLE_SHARED_TRUE$])
+m4trace:configure.ac:1064: -1- m4_pattern_allow([^ENABLE_SHARED_FALSE$])
+m4trace:configure.ac:1064: -1- _AM_SUBST_NOTMAKE([ENABLE_SHARED_TRUE])
+m4trace:configure.ac:1064: -1- _AM_SUBST_NOTMAKE([ENABLE_SHARED_FALSE])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^ATOMIC_OPS_LIBS$])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^GC_BUILTIN_ATOMIC$])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^ATOMIC_OPS_CFLAGS$])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^subdirs$])
+m4trace:configure.ac:1139: -1- AM_CONDITIONAL([USE_INTERNAL_LIBATOMIC_OPS], [test x$with_libatomic_ops = xno -a x"$THREADS" != xnone])
+m4trace:configure.ac:1139: -1- m4_pattern_allow([^USE_INTERNAL_LIBATOMIC_OPS_TRUE$])
+m4trace:configure.ac:1139: -1- m4_pattern_allow([^USE_INTERNAL_LIBATOMIC_OPS_FALSE$])
+m4trace:configure.ac:1139: -1- _AM_SUBST_NOTMAKE([USE_INTERNAL_LIBATOMIC_OPS_TRUE])
+m4trace:configure.ac:1139: -1- _AM_SUBST_NOTMAKE([USE_INTERNAL_LIBATOMIC_OPS_FALSE])
+m4trace:configure.ac:1141: -1- AM_CONDITIONAL([NEED_ATOMIC_OPS_ASM], [test x$with_libatomic_ops = xno -a x$need_atomic_ops_asm = xtrue])
+m4trace:configure.ac:1141: -1- m4_pattern_allow([^NEED_ATOMIC_OPS_ASM_TRUE$])
+m4trace:configure.ac:1141: -1- m4_pattern_allow([^NEED_ATOMIC_OPS_ASM_FALSE$])
+m4trace:configure.ac:1141: -1- _AM_SUBST_NOTMAKE([NEED_ATOMIC_OPS_ASM_TRUE])
+m4trace:configure.ac:1141: -1- _AM_SUBST_NOTMAKE([NEED_ATOMIC_OPS_ASM_FALSE])
+m4trace:configure.ac:1148: -1- m4_pattern_allow([^HAVE_LOCKFREE_AO_OR$])
+m4trace:configure.ac:1148: -1- m4_pattern_allow([^BASE_ATOMIC_OPS_EMULATED$])
+m4trace:configure.ac:1172: -1- m4_pattern_allow([^PARALLEL_MARK$])
+m4trace:configure.ac:1174: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC$])
+m4trace:configure.ac:1176: -1- AM_CONDITIONAL([THREAD_LOCAL_ALLOC], [test x$use_thread_local_alloc != xno])
+m4trace:configure.ac:1176: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC_TRUE$])
+m4trace:configure.ac:1176: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC_FALSE$])
+m4trace:configure.ac:1176: -1- _AM_SUBST_NOTMAKE([THREAD_LOCAL_ALLOC_TRUE])
+m4trace:configure.ac:1176: -1- _AM_SUBST_NOTMAKE([THREAD_LOCAL_ALLOC_FALSE])
+m4trace:configure.ac:1185: -1- m4_pattern_allow([^HANDLE_FORK$])
+m4trace:configure.ac:1188: -1- m4_pattern_allow([^NO_HANDLE_FORK$])
+m4trace:configure.ac:1197: -1- m4_pattern_allow([^HANDLE_FORK$])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.ac:1214: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
+m4trace:configure.ac:1214: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
+m4trace:configure.ac:1214: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
+m4trace:configure.ac:1214: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"])
+m4trace:configure.ac:1214: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS
+m4trace:configure.ac:1214: -1- AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles])
+m4trace:configure.ac:1214: -1- _LT_PROG_LTMAIN
diff --git a/graphics/asymptote/gc/autom4te.cache/traces.1 b/graphics/asymptote/gc/autom4te.cache/traces.1
new file mode 100644
index 0000000000..f967fa3b14
--- /dev/null
+++ b/graphics/asymptote/gc/autom4te.cache/traces.1
@@ -0,0 +1,1181 @@
+m4trace:aclocal.m4:755: -1- AC_SUBST([am__quote])
+m4trace:aclocal.m4:755: -1- AC_SUBST_TRACE([am__quote])
+m4trace:aclocal.m4:755: -1- m4_pattern_allow([^am__quote$])
+m4trace:aclocal.m4:1207: -1- m4_include([m4/gc_set_version.m4])
+m4trace:m4/gc_set_version.m4:40: -1- sinclude([libtool.m4])
+m4trace:aclocal.m4:1208: -1- m4_include([m4/libtool.m4])
+m4trace:aclocal.m4:1209: -1- m4_include([m4/ltoptions.m4])
+m4trace:aclocal.m4:1210: -1- m4_include([m4/ltsugar.m4])
+m4trace:aclocal.m4:1211: -1- m4_include([m4/ltversion.m4])
+m4trace:aclocal.m4:1212: -1- m4_include([m4/lt~obsolete.m4])
+m4trace:configure.ac:17: -1- AC_INIT([gc], [8.2.8], [https://github.com/ivmai/bdwgc/issues])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?A[CHUM]_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([_AC_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS'])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^AS_FLAGS$])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?m4_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^dnl$])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?AS_])
+m4trace:configure.ac:17: -1- AC_SUBST([SHELL])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([SHELL])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^SHELL$])
+m4trace:configure.ac:17: -1- AC_SUBST([PATH_SEPARATOR])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PATH_SEPARATOR])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PATH_SEPARATOR$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_NAME])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_TARNAME])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_VERSION])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_STRING])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_URL])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_URL$])
+m4trace:configure.ac:17: -1- AC_SUBST([exec_prefix], [NONE])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([exec_prefix])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^exec_prefix$])
+m4trace:configure.ac:17: -1- AC_SUBST([prefix], [NONE])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([prefix])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^prefix$])
+m4trace:configure.ac:17: -1- AC_SUBST([program_transform_name], [s,x,x,])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([program_transform_name])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^program_transform_name$])
+m4trace:configure.ac:17: -1- AC_SUBST([bindir], ['${exec_prefix}/bin'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([bindir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^bindir$])
+m4trace:configure.ac:17: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([sbindir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sbindir$])
+m4trace:configure.ac:17: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([libexecdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^libexecdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([datarootdir], ['${prefix}/share'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([datarootdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^datarootdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([datadir], ['${datarootdir}'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([datadir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^datadir$])
+m4trace:configure.ac:17: -1- AC_SUBST([sysconfdir], ['${prefix}/etc'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([sysconfdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sysconfdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([sharedstatedir], ['${prefix}/com'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([sharedstatedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sharedstatedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([localstatedir], ['${prefix}/var'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([localstatedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^localstatedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([runstatedir], ['${localstatedir}/run'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([runstatedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^runstatedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([includedir], ['${prefix}/include'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([includedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^includedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([oldincludedir], ['/usr/include'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([oldincludedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^oldincludedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME],
+ ['${datarootdir}/doc/${PACKAGE_TARNAME}'],
+ ['${datarootdir}/doc/${PACKAGE}'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([docdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^docdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([infodir], ['${datarootdir}/info'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([infodir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^infodir$])
+m4trace:configure.ac:17: -1- AC_SUBST([htmldir], ['${docdir}'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([htmldir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^htmldir$])
+m4trace:configure.ac:17: -1- AC_SUBST([dvidir], ['${docdir}'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([dvidir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^dvidir$])
+m4trace:configure.ac:17: -1- AC_SUBST([pdfdir], ['${docdir}'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([pdfdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^pdfdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([psdir], ['${docdir}'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([psdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^psdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([libdir], ['${exec_prefix}/lib'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([libdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^libdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([localedir], ['${datarootdir}/locale'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([localedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^localedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([mandir], ['${datarootdir}/man'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([mandir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^mandir$])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */
+@%:@undef PACKAGE_NAME])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */
+@%:@undef PACKAGE_TARNAME])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */
+@%:@undef PACKAGE_VERSION])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */
+@%:@undef PACKAGE_STRING])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */
+@%:@undef PACKAGE_BUGREPORT])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_URL$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */
+@%:@undef PACKAGE_URL])
+m4trace:configure.ac:17: -1- AC_SUBST([DEFS])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([DEFS])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^DEFS$])
+m4trace:configure.ac:17: -1- AC_SUBST([ECHO_C])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([ECHO_C])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_C$])
+m4trace:configure.ac:17: -1- AC_SUBST([ECHO_N])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([ECHO_N])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_N$])
+m4trace:configure.ac:17: -1- AC_SUBST([ECHO_T])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([ECHO_T])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_T$])
+m4trace:configure.ac:17: -1- AC_SUBST([LIBS])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:17: -1- AC_SUBST([build_alias])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([build_alias])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^build_alias$])
+m4trace:configure.ac:17: -1- AC_SUBST([host_alias])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([host_alias])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^host_alias$])
+m4trace:configure.ac:17: -1- AC_SUBST([target_alias])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([target_alias])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^target_alias$])
+m4trace:configure.ac:21: -1- AC_CONFIG_MACRO_DIR_TRACE([m4])
+m4trace:configure.ac:22: -1- AC_CANONICAL_TARGET
+m4trace:configure.ac:22: -1- AC_CANONICAL_HOST
+m4trace:configure.ac:22: -1- AC_CANONICAL_BUILD
+m4trace:configure.ac:22: -1- AC_REQUIRE_AUX_FILE([config.sub])
+m4trace:configure.ac:22: -1- AC_REQUIRE_AUX_FILE([config.guess])
+m4trace:configure.ac:22: -1- AC_SUBST([build], [$ac_cv_build])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([build])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build$])
+m4trace:configure.ac:22: -1- AC_SUBST([build_cpu], [$[1]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([build_cpu])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_cpu$])
+m4trace:configure.ac:22: -1- AC_SUBST([build_vendor], [$[2]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([build_vendor])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_vendor$])
+m4trace:configure.ac:22: -1- AC_SUBST([build_os])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([build_os])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_os$])
+m4trace:configure.ac:22: -1- AC_SUBST([host], [$ac_cv_host])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([host])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host$])
+m4trace:configure.ac:22: -1- AC_SUBST([host_cpu], [$[1]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([host_cpu])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_cpu$])
+m4trace:configure.ac:22: -1- AC_SUBST([host_vendor], [$[2]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([host_vendor])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_vendor$])
+m4trace:configure.ac:22: -1- AC_SUBST([host_os])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([host_os])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_os$])
+m4trace:configure.ac:22: -1- AC_SUBST([target], [$ac_cv_target])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([target])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target$])
+m4trace:configure.ac:22: -1- AC_SUBST([target_cpu], [$[1]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([target_cpu])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_cpu$])
+m4trace:configure.ac:22: -1- AC_SUBST([target_vendor], [$[2]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([target_vendor])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_vendor$])
+m4trace:configure.ac:22: -1- AC_SUBST([target_os])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([target_os])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_os$])
+m4trace:configure.ac:24: -1- AC_DEFINE_TRACE_LITERAL([GC_VERSION_MAJOR])
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MAJOR$])
+m4trace:configure.ac:24: -1- AH_OUTPUT([GC_VERSION_MAJOR], [/* The major version number of this GC release. */
+@%:@undef GC_VERSION_MAJOR])
+m4trace:configure.ac:24: -1- AC_DEFINE_TRACE_LITERAL([GC_VERSION_MINOR])
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MINOR$])
+m4trace:configure.ac:24: -1- AH_OUTPUT([GC_VERSION_MINOR], [/* The minor version number of this GC release. */
+@%:@undef GC_VERSION_MINOR])
+m4trace:configure.ac:24: -1- AC_DEFINE_TRACE_LITERAL([GC_VERSION_MICRO])
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MICRO$])
+m4trace:configure.ac:24: -1- AH_OUTPUT([GC_VERSION_MICRO], [/* The micro version number of this GC release. */
+@%:@undef GC_VERSION_MICRO])
+m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([foreign nostdinc subdir-objects])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$])
+m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.16.5])
+m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([install-sh])
+m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_PROGRAM])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_PROGRAM])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$])
+m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_SCRIPT])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_SCRIPT])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$])
+m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_DATA])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_DATA])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$])
+m4trace:configure.ac:25: -1- AC_SUBST([am__isrc], [' -I$(srcdir)'])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__isrc])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc])
+m4trace:configure.ac:25: -1- AC_SUBST([CYGPATH_W])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([CYGPATH_W])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$])
+m4trace:configure.ac:25: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([PACKAGE])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:25: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([VERSION])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$])
+m4trace:configure.ac:25: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:25: -1- AH_OUTPUT([PACKAGE], [/* Name of package */
+@%:@undef PACKAGE])
+m4trace:configure.ac:25: -1- AC_DEFINE_TRACE_LITERAL([VERSION])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$])
+m4trace:configure.ac:25: -1- AH_OUTPUT([VERSION], [/* Version number of package */
+@%:@undef VERSION])
+m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([missing])
+m4trace:configure.ac:25: -1- AC_SUBST([ACLOCAL])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([ACLOCAL])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$])
+m4trace:configure.ac:25: -1- AC_SUBST([AUTOCONF])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOCONF])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$])
+m4trace:configure.ac:25: -1- AC_SUBST([AUTOMAKE])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOMAKE])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$])
+m4trace:configure.ac:25: -1- AC_SUBST([AUTOHEADER])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOHEADER])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$])
+m4trace:configure.ac:25: -1- AC_SUBST([MAKEINFO])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([MAKEINFO])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$])
+m4trace:configure.ac:25: -1- AC_SUBST([install_sh])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([install_sh])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$])
+m4trace:configure.ac:25: -1- AC_SUBST([STRIP])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([STRIP])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$])
+m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_STRIP_PROGRAM])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$])
+m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([install-sh])
+m4trace:configure.ac:25: -1- AC_SUBST([MKDIR_P])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([MKDIR_P])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$])
+m4trace:configure.ac:25: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([mkdir_p])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$])
+m4trace:configure.ac:25: -1- AC_SUBST([AWK])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AWK])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$])
+m4trace:configure.ac:25: -1- AC_SUBST([SET_MAKE])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([SET_MAKE])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$])
+m4trace:configure.ac:25: -1- AC_SUBST([am__leading_dot])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__leading_dot])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$])
+m4trace:configure.ac:25: -1- AC_SUBST([AMTAR], ['$${TAR-tar}'])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AMTAR])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$])
+m4trace:configure.ac:25: -1- AC_SUBST([am__tar])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__tar])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$])
+m4trace:configure.ac:25: -1- AC_SUBST([am__untar])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__untar])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$])
+m4trace:configure.ac:25: -1- AC_SUBST([CTAGS])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([CTAGS])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CTAGS$])
+m4trace:configure.ac:25: -1- AC_SUBST([ETAGS])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([ETAGS])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^ETAGS$])
+m4trace:configure.ac:25: -1- AC_SUBST([CSCOPE])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([CSCOPE])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CSCOPE$])
+m4trace:configure.ac:25: -1- AM_SILENT_RULES
+m4trace:configure.ac:25: -1- AC_SUBST([AM_V])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AM_V])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_V$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_V])
+m4trace:configure.ac:25: -1- AC_SUBST([AM_DEFAULT_V])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AM_DEFAULT_V])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_DEFAULT_V$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V])
+m4trace:configure.ac:25: -1- AC_SUBST([AM_DEFAULT_VERBOSITY])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$])
+m4trace:configure.ac:25: -1- AC_SUBST([AM_BACKSLASH])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AM_BACKSLASH])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_BACKSLASH$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH])
+m4trace:configure.ac:26: -1- AC_CONFIG_HEADERS([include/config.h])
+m4trace:configure.ac:27: -1- AM_MAINTAINER_MODE
+m4trace:configure.ac:27: -1- AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+m4trace:configure.ac:27: -1- AC_SUBST([MAINTAINER_MODE_TRUE])
+m4trace:configure.ac:27: -1- AC_SUBST_TRACE([MAINTAINER_MODE_TRUE])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINTAINER_MODE_TRUE$])
+m4trace:configure.ac:27: -1- AC_SUBST([MAINTAINER_MODE_FALSE])
+m4trace:configure.ac:27: -1- AC_SUBST_TRACE([MAINTAINER_MODE_FALSE])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINTAINER_MODE_FALSE$])
+m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_TRUE])
+m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_FALSE])
+m4trace:configure.ac:27: -1- AC_SUBST([MAINT])
+m4trace:configure.ac:27: -1- AC_SUBST_TRACE([MAINT])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINT$])
+m4trace:configure.ac:29: -1- AC_SUBST([PACKAGE])
+m4trace:configure.ac:29: -1- AC_SUBST_TRACE([PACKAGE])
+m4trace:configure.ac:29: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:30: -1- AC_SUBST([GC_VERSION])
+m4trace:configure.ac:30: -1- AC_SUBST_TRACE([GC_VERSION])
+m4trace:configure.ac:30: -1- m4_pattern_allow([^GC_VERSION$])
+m4trace:configure.ac:32: -1- AM_PROG_CC_C_O
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([CFLAGS])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CFLAGS])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.ac:32: -1- AC_SUBST([LDFLAGS])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([LDFLAGS])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.ac:32: -1- AC_SUBST([LIBS])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:32: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([ac_ct_CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([ac_ct_CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^ac_ct_CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([EXEEXT])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^EXEEXT$])
+m4trace:configure.ac:32: -1- AC_SUBST([OBJEXT], [$ac_cv_objext])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([OBJEXT])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^OBJEXT$])
+m4trace:configure.ac:32: -1- AC_REQUIRE_AUX_FILE([compile])
+m4trace:configure.ac:32: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([DEPDIR])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^DEPDIR$])
+m4trace:configure.ac:32: -1- AC_SUBST([am__include])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([am__include])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__include$])
+m4trace:configure.ac:32: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+m4trace:configure.ac:32: -1- AC_SUBST([AMDEP_TRUE])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([AMDEP_TRUE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEP_TRUE$])
+m4trace:configure.ac:32: -1- AC_SUBST([AMDEP_FALSE])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([AMDEP_FALSE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEP_FALSE$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE])
+m4trace:configure.ac:32: -1- AC_SUBST([AMDEPBACKSLASH])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([AMDEPBACKSLASH])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEPBACKSLASH$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])
+m4trace:configure.ac:32: -1- AC_SUBST([am__nodep])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([am__nodep])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__nodep$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__nodep])
+m4trace:configure.ac:32: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CCDEPMODE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CCDEPMODE$])
+m4trace:configure.ac:32: -1- AM_CONDITIONAL([am__fastdepCC], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:32: -1- AC_SUBST([am__fastdepCC_TRUE])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__fastdepCC_TRUE$])
+m4trace:configure.ac:32: -1- AC_SUBST([am__fastdepCC_FALSE])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__fastdepCC_FALSE$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE])
+m4trace:configure.ac:33: -1- AC_SUBST([CXX])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([CXX])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:33: -1- AC_SUBST([CXXFLAGS])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([CXXFLAGS])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXXFLAGS$])
+m4trace:configure.ac:33: -1- AC_SUBST([LDFLAGS])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([LDFLAGS])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.ac:33: -1- AC_SUBST([LIBS])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:33: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:33: -1- AC_SUBST([CXX])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([CXX])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:33: -1- AC_SUBST([ac_ct_CXX])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([ac_ct_CXX])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^ac_ct_CXX$])
+m4trace:configure.ac:33: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([CXXDEPMODE])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXXDEPMODE$])
+m4trace:configure.ac:33: -1- AM_CONDITIONAL([am__fastdepCXX], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:33: -1- AC_SUBST([am__fastdepCXX_TRUE])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$])
+m4trace:configure.ac:33: -1- AC_SUBST([am__fastdepCXX_FALSE])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$])
+m4trace:configure.ac:33: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE])
+m4trace:configure.ac:33: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE])
+m4trace:configure.ac:34: -1- AC_SUBST([CCAS])
+m4trace:configure.ac:34: -1- AC_SUBST_TRACE([CCAS])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCAS$])
+m4trace:configure.ac:34: -1- AC_SUBST([CCASFLAGS])
+m4trace:configure.ac:34: -1- AC_SUBST_TRACE([CCASFLAGS])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCASFLAGS$])
+m4trace:configure.ac:34: -1- AC_SUBST([CCASDEPMODE], [depmode=$am_cv_CCAS_dependencies_compiler_type])
+m4trace:configure.ac:34: -1- AC_SUBST_TRACE([CCASDEPMODE])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCASDEPMODE$])
+m4trace:configure.ac:34: -1- AM_CONDITIONAL([am__fastdepCCAS], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:34: -1- AC_SUBST([am__fastdepCCAS_TRUE])
+m4trace:configure.ac:34: -1- AC_SUBST_TRACE([am__fastdepCCAS_TRUE])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^am__fastdepCCAS_TRUE$])
+m4trace:configure.ac:34: -1- AC_SUBST([am__fastdepCCAS_FALSE])
+m4trace:configure.ac:34: -1- AC_SUBST_TRACE([am__fastdepCCAS_FALSE])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^am__fastdepCCAS_FALSE$])
+m4trace:configure.ac:34: -1- _AM_SUBST_NOTMAKE([am__fastdepCCAS_TRUE])
+m4trace:configure.ac:34: -1- _AM_SUBST_NOTMAKE([am__fastdepCCAS_FALSE])
+m4trace:configure.ac:36: -1- LT_INIT([disable-static])
+m4trace:configure.ac:36: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])
+m4trace:configure.ac:36: -1- AC_REQUIRE_AUX_FILE([ltmain.sh])
+m4trace:configure.ac:36: -1- AC_SUBST([LIBTOOL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LIBTOOL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LIBTOOL$])
+m4trace:configure.ac:36: -1- AC_SUBST([SED])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([SED])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^SED$])
+m4trace:configure.ac:36: -1- AC_SUBST([GREP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([GREP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.ac:36: -1- AC_SUBST([EGREP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([EGREP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^EGREP$])
+m4trace:configure.ac:36: -1- AC_SUBST([FGREP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([FGREP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^FGREP$])
+m4trace:configure.ac:36: -1- AC_SUBST([GREP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([GREP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.ac:36: -1- AC_SUBST([LD])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LD])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LD$])
+m4trace:configure.ac:36: -1- AC_SUBST([DUMPBIN])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([DUMPBIN])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DUMPBIN$])
+m4trace:configure.ac:36: -1- AC_SUBST([ac_ct_DUMPBIN])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([ac_ct_DUMPBIN])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_DUMPBIN$])
+m4trace:configure.ac:36: -1- AC_SUBST([DUMPBIN])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([DUMPBIN])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DUMPBIN$])
+m4trace:configure.ac:36: -1- AC_SUBST([NM])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([NM])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^NM$])
+m4trace:configure.ac:36: -1- AC_SUBST([LN_S], [$as_ln_s])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LN_S])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LN_S$])
+m4trace:configure.ac:36: -1- AC_SUBST([FILECMD])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([FILECMD])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^FILECMD$])
+m4trace:configure.ac:36: -1- AC_SUBST([OBJDUMP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([OBJDUMP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OBJDUMP$])
+m4trace:configure.ac:36: -1- AC_SUBST([OBJDUMP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([OBJDUMP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OBJDUMP$])
+m4trace:configure.ac:36: -1- AC_SUBST([DLLTOOL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([DLLTOOL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DLLTOOL$])
+m4trace:configure.ac:36: -1- AC_SUBST([DLLTOOL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([DLLTOOL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DLLTOOL$])
+m4trace:configure.ac:36: -1- AC_SUBST([AR])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([AR])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^AR$])
+m4trace:configure.ac:36: -1- AC_SUBST([ac_ct_AR])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([ac_ct_AR])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_AR$])
+m4trace:configure.ac:36: -1- AC_SUBST([STRIP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([STRIP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^STRIP$])
+m4trace:configure.ac:36: -1- AC_SUBST([RANLIB])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([RANLIB])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^RANLIB$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([LT_OBJDIR])
+m4trace:configure.ac:36: -1- AC_DEFINE_TRACE_LITERAL([LT_OBJDIR])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_OBJDIR$])
+m4trace:configure.ac:36: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory where libtool stores uninstalled libraries. */
+@%:@undef LT_OBJDIR])
+m4trace:configure.ac:36: -1- LT_SUPPORTED_TAG([CC])
+m4trace:configure.ac:36: -1- AC_SUBST([MANIFEST_TOOL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([MANIFEST_TOOL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^MANIFEST_TOOL$])
+m4trace:configure.ac:36: -1- AC_SUBST([DSYMUTIL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([DSYMUTIL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DSYMUTIL$])
+m4trace:configure.ac:36: -1- AC_SUBST([NMEDIT])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([NMEDIT])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^NMEDIT$])
+m4trace:configure.ac:36: -1- AC_SUBST([LIPO])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LIPO])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LIPO$])
+m4trace:configure.ac:36: -1- AC_SUBST([OTOOL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([OTOOL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OTOOL$])
+m4trace:configure.ac:36: -1- AC_SUBST([OTOOL64])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([OTOOL64])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OTOOL64$])
+m4trace:configure.ac:36: -1- AC_SUBST([LT_SYS_LIBRARY_PATH])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LT_SYS_LIBRARY_PATH])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the <dlfcn.h> header file. */
+@%:@undef HAVE_DLFCN_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_STDIO_H], [/* Define to 1 if you have the <stdio.h> header file. */
+@%:@undef HAVE_STDIO_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
+@%:@undef HAVE_STDLIB_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
+@%:@undef HAVE_STRING_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */
+@%:@undef HAVE_INTTYPES_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */
+@%:@undef HAVE_STDINT_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */
+@%:@undef HAVE_STRINGS_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */
+@%:@undef HAVE_SYS_STAT_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */
+@%:@undef HAVE_SYS_TYPES_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
+@%:@undef HAVE_UNISTD_H])
+m4trace:configure.ac:36: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^STDC_HEADERS$])
+m4trace:configure.ac:36: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if all of the C90 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
+@%:@undef STDC_HEADERS])
+m4trace:configure.ac:36: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^HAVE_DLFCN_H$])
+m4trace:configure.ac:36: -1- LT_SUPPORTED_TAG([CXX])
+m4trace:configure.ac:36: -1- AC_SUBST([CXXCPP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXXCPP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXCPP$])
+m4trace:configure.ac:36: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:36: -1- AC_SUBST([CXXCPP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXXCPP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXCPP$])
+m4trace:configure.ac:36: -1- AC_SUBST([LD])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LD])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LD$])
+m4trace:configure.ac:36: -1- AC_SUBST([LT_SYS_LIBRARY_PATH])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LT_SYS_LIBRARY_PATH])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$])
+m4trace:configure.ac:93: -1- AM_CONDITIONAL([EMSCRIPTEN], [test x$emscripten = xyes])
+m4trace:configure.ac:93: -1- AC_SUBST([EMSCRIPTEN_TRUE])
+m4trace:configure.ac:93: -1- AC_SUBST_TRACE([EMSCRIPTEN_TRUE])
+m4trace:configure.ac:93: -1- m4_pattern_allow([^EMSCRIPTEN_TRUE$])
+m4trace:configure.ac:93: -1- AC_SUBST([EMSCRIPTEN_FALSE])
+m4trace:configure.ac:93: -1- AC_SUBST_TRACE([EMSCRIPTEN_FALSE])
+m4trace:configure.ac:93: -1- m4_pattern_allow([^EMSCRIPTEN_FALSE$])
+m4trace:configure.ac:93: -1- _AM_SUBST_NOTMAKE([EMSCRIPTEN_TRUE])
+m4trace:configure.ac:93: -1- _AM_SUBST_NOTMAKE([EMSCRIPTEN_FALSE])
+m4trace:configure.ac:107: -1- AC_SUBST([GC_CFLAGS])
+m4trace:configure.ac:107: -1- AC_SUBST_TRACE([GC_CFLAGS])
+m4trace:configure.ac:107: -1- m4_pattern_allow([^GC_CFLAGS$])
+m4trace:configure.ac:110: -1- AC_SUBST([CFLAGS_EXTRA])
+m4trace:configure.ac:110: -1- AC_SUBST_TRACE([CFLAGS_EXTRA])
+m4trace:configure.ac:110: -1- m4_pattern_allow([^CFLAGS_EXTRA$])
+m4trace:configure.ac:157: -1- AC_DEFINE_TRACE_LITERAL([GC_NO_THREADS_DISCOVERY])
+m4trace:configure.ac:157: -1- m4_pattern_allow([^GC_NO_THREADS_DISCOVERY$])
+m4trace:configure.ac:157: -1- AH_OUTPUT([GC_NO_THREADS_DISCOVERY], [/* Disable threads discovery in GC. */
+@%:@undef GC_NO_THREADS_DISCOVERY])
+m4trace:configure.ac:165: -1- AH_OUTPUT([PARALLEL_MARK], [/* Define to enable parallel marking. */
+@%:@undef PARALLEL_MARK])
+m4trace:configure.ac:166: -1- AH_OUTPUT([THREAD_LOCAL_ALLOC], [/* Define to enable thread-local allocation optimization. */
+@%:@undef THREAD_LOCAL_ALLOC])
+m4trace:configure.ac:168: -1- AH_OUTPUT([USE_COMPILER_TLS], [/* Define to use of compiler-support for thread-local variables. */
+@%:@undef USE_COMPILER_TLS])
+m4trace:configure.ac:172: -1- AH_OUTPUT([GC_THREADS], [/* Define to support platform-specific threads. */
+@%:@undef GC_THREADS])
+m4trace:configure.ac:174: -1- AH_OUTPUT([GC_WIN32_PTHREADS], [/* Define to support pthreads-win32 or winpthreads. */
+@%:@undef GC_WIN32_PTHREADS])
+m4trace:configure.ac:178: -1- AH_OUTPUT([_POSIX_C_SOURCE], [/* The POSIX feature macro. */
+@%:@undef _POSIX_C_SOURCE])
+m4trace:configure.ac:179: -1- AH_OUTPUT([_PTHREADS], [/* Indicates the use of pthreads (NetBSD). */
+@%:@undef _PTHREADS])
+m4trace:configure.ac:182: -1- AH_OUTPUT([GC_UNDERSCORE_STDCALL], [/* Explicitly prefix exported/imported WINAPI symbols with \'_\'. */
+@%:@undef GC_UNDERSCORE_STDCALL])
+m4trace:configure.ac:184: -1- AH_OUTPUT([UNICODE], [/* Use Unicode (W) variant of Win32 API instead of ASCII (A) one. */
+@%:@undef UNICODE])
+m4trace:configure.ac:188: -1- AH_OUTPUT([GC_DLL], [/* Define to build dynamic libraries with only API symbols exposed. */
+@%:@undef GC_DLL])
+m4trace:configure.ac:194: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler
+ calls it, or to nothing if \'inline\' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif])
+m4trace:configure.ac:217: -1- AC_DEFINE_TRACE_LITERAL([GC_THREADS])
+m4trace:configure.ac:217: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:218: -1- AC_DEFINE_TRACE_LITERAL([_REENTRANT])
+m4trace:configure.ac:218: -1- m4_pattern_allow([^_REENTRANT$])
+m4trace:configure.ac:218: -1- AH_OUTPUT([_REENTRANT], [/* Required define if using POSIX threads. */
+@%:@undef _REENTRANT])
+m4trace:configure.ac:230: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_C_SOURCE])
+m4trace:configure.ac:230: -1- m4_pattern_allow([^_POSIX_C_SOURCE$])
+m4trace:configure.ac:251: -1- AC_DEFINE_TRACE_LITERAL([_PTHREADS])
+m4trace:configure.ac:251: -1- m4_pattern_allow([^_PTHREADS$])
+m4trace:configure.ac:266: -1- AC_DEFINE_TRACE_LITERAL([GC_WIN32_PTHREADS])
+m4trace:configure.ac:266: -1- m4_pattern_allow([^GC_WIN32_PTHREADS$])
+m4trace:configure.ac:297: -1- AC_DEFINE_TRACE_LITERAL([GC_THREADS])
+m4trace:configure.ac:297: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:305: -1- AC_DEFINE_TRACE_LITERAL([GC_INSIDE_DLL])
+m4trace:configure.ac:305: -1- m4_pattern_allow([^GC_INSIDE_DLL$])
+m4trace:configure.ac:305: -1- AH_OUTPUT([GC_INSIDE_DLL], [/* Enable Win32 DllMain-based approach of threads registering. */
+@%:@undef GC_INSIDE_DLL])
+m4trace:configure.ac:309: -1- AC_DEFINE_TRACE_LITERAL([EMPTY_GETENV_RESULTS])
+m4trace:configure.ac:309: -1- m4_pattern_allow([^EMPTY_GETENV_RESULTS$])
+m4trace:configure.ac:309: -1- AH_OUTPUT([EMPTY_GETENV_RESULTS], [/* Wine getenv may not return NULL for missing entry. */
+@%:@undef EMPTY_GETENV_RESULTS])
+m4trace:configure.ac:313: -1- AC_DEFINE_TRACE_LITERAL([GC_THREADS])
+m4trace:configure.ac:313: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:324: -1- AC_DEFINE_TRACE_LITERAL([GC_THREADS])
+m4trace:configure.ac:324: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:325: -1- AC_DEFINE_TRACE_LITERAL([_REENTRANT])
+m4trace:configure.ac:325: -1- m4_pattern_allow([^_REENTRANT$])
+m4trace:configure.ac:331: -1- AC_DEFINE_TRACE_LITERAL([GC_THREADS])
+m4trace:configure.ac:331: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:356: -1- AC_SUBST([THREADDLLIBS])
+m4trace:configure.ac:356: -1- AC_SUBST_TRACE([THREADDLLIBS])
+m4trace:configure.ac:356: -1- m4_pattern_allow([^THREADDLLIBS$])
+m4trace:configure.ac:358: -1- AM_CONDITIONAL([THREADS], [test x$THREADS != xnone])
+m4trace:configure.ac:358: -1- AC_SUBST([THREADS_TRUE])
+m4trace:configure.ac:358: -1- AC_SUBST_TRACE([THREADS_TRUE])
+m4trace:configure.ac:358: -1- m4_pattern_allow([^THREADS_TRUE$])
+m4trace:configure.ac:358: -1- AC_SUBST([THREADS_FALSE])
+m4trace:configure.ac:358: -1- AC_SUBST_TRACE([THREADS_FALSE])
+m4trace:configure.ac:358: -1- m4_pattern_allow([^THREADS_FALSE$])
+m4trace:configure.ac:358: -1- _AM_SUBST_NOTMAKE([THREADS_TRUE])
+m4trace:configure.ac:358: -1- _AM_SUBST_NOTMAKE([THREADS_FALSE])
+m4trace:configure.ac:359: -1- AM_CONDITIONAL([PTHREADS], [test x$THREADS = xposix])
+m4trace:configure.ac:359: -1- AC_SUBST([PTHREADS_TRUE])
+m4trace:configure.ac:359: -1- AC_SUBST_TRACE([PTHREADS_TRUE])
+m4trace:configure.ac:359: -1- m4_pattern_allow([^PTHREADS_TRUE$])
+m4trace:configure.ac:359: -1- AC_SUBST([PTHREADS_FALSE])
+m4trace:configure.ac:359: -1- AC_SUBST_TRACE([PTHREADS_FALSE])
+m4trace:configure.ac:359: -1- m4_pattern_allow([^PTHREADS_FALSE$])
+m4trace:configure.ac:359: -1- _AM_SUBST_NOTMAKE([PTHREADS_TRUE])
+m4trace:configure.ac:359: -1- _AM_SUBST_NOTMAKE([PTHREADS_FALSE])
+m4trace:configure.ac:360: -1- AM_CONDITIONAL([DARWIN_THREADS], [test x$darwin_threads = xtrue])
+m4trace:configure.ac:360: -1- AC_SUBST([DARWIN_THREADS_TRUE])
+m4trace:configure.ac:360: -1- AC_SUBST_TRACE([DARWIN_THREADS_TRUE])
+m4trace:configure.ac:360: -1- m4_pattern_allow([^DARWIN_THREADS_TRUE$])
+m4trace:configure.ac:360: -1- AC_SUBST([DARWIN_THREADS_FALSE])
+m4trace:configure.ac:360: -1- AC_SUBST_TRACE([DARWIN_THREADS_FALSE])
+m4trace:configure.ac:360: -1- m4_pattern_allow([^DARWIN_THREADS_FALSE$])
+m4trace:configure.ac:360: -1- _AM_SUBST_NOTMAKE([DARWIN_THREADS_TRUE])
+m4trace:configure.ac:360: -1- _AM_SUBST_NOTMAKE([DARWIN_THREADS_FALSE])
+m4trace:configure.ac:361: -1- AM_CONDITIONAL([WIN32_THREADS], [test x$win32_threads = xtrue])
+m4trace:configure.ac:361: -1- AC_SUBST([WIN32_THREADS_TRUE])
+m4trace:configure.ac:361: -1- AC_SUBST_TRACE([WIN32_THREADS_TRUE])
+m4trace:configure.ac:361: -1- m4_pattern_allow([^WIN32_THREADS_TRUE$])
+m4trace:configure.ac:361: -1- AC_SUBST([WIN32_THREADS_FALSE])
+m4trace:configure.ac:361: -1- AC_SUBST_TRACE([WIN32_THREADS_FALSE])
+m4trace:configure.ac:361: -1- m4_pattern_allow([^WIN32_THREADS_FALSE$])
+m4trace:configure.ac:361: -1- _AM_SUBST_NOTMAKE([WIN32_THREADS_TRUE])
+m4trace:configure.ac:361: -1- _AM_SUBST_NOTMAKE([WIN32_THREADS_FALSE])
+m4trace:configure.ac:382: -1- AC_DEFINE_TRACE_LITERAL([GC_READ_ENV_FILE])
+m4trace:configure.ac:382: -1- m4_pattern_allow([^GC_READ_ENV_FILE$])
+m4trace:configure.ac:382: -1- AH_OUTPUT([GC_READ_ENV_FILE], [/* Read environment variables from the GC \'env\' file. */
+@%:@undef GC_READ_ENV_FILE])
+m4trace:configure.ac:387: -1- AM_CONDITIONAL([PTHREAD_START_STANDALONE], [test x$pthread_start_standalone = xyes])
+m4trace:configure.ac:387: -1- AC_SUBST([PTHREAD_START_STANDALONE_TRUE])
+m4trace:configure.ac:387: -1- AC_SUBST_TRACE([PTHREAD_START_STANDALONE_TRUE])
+m4trace:configure.ac:387: -1- m4_pattern_allow([^PTHREAD_START_STANDALONE_TRUE$])
+m4trace:configure.ac:387: -1- AC_SUBST([PTHREAD_START_STANDALONE_FALSE])
+m4trace:configure.ac:387: -1- AC_SUBST_TRACE([PTHREAD_START_STANDALONE_FALSE])
+m4trace:configure.ac:387: -1- m4_pattern_allow([^PTHREAD_START_STANDALONE_FALSE$])
+m4trace:configure.ac:387: -1- _AM_SUBST_NOTMAKE([PTHREAD_START_STANDALONE_TRUE])
+m4trace:configure.ac:387: -1- _AM_SUBST_NOTMAKE([PTHREAD_START_STANDALONE_FALSE])
+m4trace:configure.ac:422: -1- AC_DEFINE_TRACE_LITERAL([DARWIN_DONT_PARSE_STACK])
+m4trace:configure.ac:422: -1- m4_pattern_allow([^DARWIN_DONT_PARSE_STACK$])
+m4trace:configure.ac:422: -1- AH_OUTPUT([DARWIN_DONT_PARSE_STACK], [/* See doc/README.macros. */
+@%:@undef DARWIN_DONT_PARSE_STACK])
+m4trace:configure.ac:427: -1- AM_CONDITIONAL([ASM_WITH_CPP_UNSUPPORTED], [test $compiler_xlc = yes -o $compiler_suncc = yes])
+m4trace:configure.ac:427: -1- AC_SUBST([ASM_WITH_CPP_UNSUPPORTED_TRUE])
+m4trace:configure.ac:427: -1- AC_SUBST_TRACE([ASM_WITH_CPP_UNSUPPORTED_TRUE])
+m4trace:configure.ac:427: -1- m4_pattern_allow([^ASM_WITH_CPP_UNSUPPORTED_TRUE$])
+m4trace:configure.ac:427: -1- AC_SUBST([ASM_WITH_CPP_UNSUPPORTED_FALSE])
+m4trace:configure.ac:427: -1- AC_SUBST_TRACE([ASM_WITH_CPP_UNSUPPORTED_FALSE])
+m4trace:configure.ac:427: -1- m4_pattern_allow([^ASM_WITH_CPP_UNSUPPORTED_FALSE$])
+m4trace:configure.ac:427: -1- _AM_SUBST_NOTMAKE([ASM_WITH_CPP_UNSUPPORTED_TRUE])
+m4trace:configure.ac:427: -1- _AM_SUBST_NOTMAKE([ASM_WITH_CPP_UNSUPPORTED_FALSE])
+m4trace:configure.ac:455: -1- AC_DEFINE_TRACE_LITERAL([NO_GETCONTEXT])
+m4trace:configure.ac:455: -1- m4_pattern_allow([^NO_GETCONTEXT$])
+m4trace:configure.ac:455: -1- AH_OUTPUT([NO_GETCONTEXT], [/* Missing getcontext function. */
+@%:@undef NO_GETCONTEXT])
+m4trace:configure.ac:459: -1- AH_OUTPUT([HAVE_DL_ITERATE_PHDR], [/* Define to 1 if you have the `dl_iterate_phdr\' function. */
+@%:@undef HAVE_DL_ITERATE_PHDR])
+m4trace:configure.ac:459: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DL_ITERATE_PHDR])
+m4trace:configure.ac:459: -1- m4_pattern_allow([^HAVE_DL_ITERATE_PHDR$])
+m4trace:configure.ac:481: -1- AM_CONDITIONAL([AVOID_CPP_LIB], [test $avoid_cpp_lib = yes])
+m4trace:configure.ac:481: -1- AC_SUBST([AVOID_CPP_LIB_TRUE])
+m4trace:configure.ac:481: -1- AC_SUBST_TRACE([AVOID_CPP_LIB_TRUE])
+m4trace:configure.ac:481: -1- m4_pattern_allow([^AVOID_CPP_LIB_TRUE$])
+m4trace:configure.ac:481: -1- AC_SUBST([AVOID_CPP_LIB_FALSE])
+m4trace:configure.ac:481: -1- AC_SUBST_TRACE([AVOID_CPP_LIB_FALSE])
+m4trace:configure.ac:481: -1- m4_pattern_allow([^AVOID_CPP_LIB_FALSE$])
+m4trace:configure.ac:481: -1- _AM_SUBST_NOTMAKE([AVOID_CPP_LIB_TRUE])
+m4trace:configure.ac:481: -1- _AM_SUBST_NOTMAKE([AVOID_CPP_LIB_FALSE])
+m4trace:configure.ac:484: -1- AC_DEFINE_TRACE_LITERAL([GC_MISSING_EXECINFO_H])
+m4trace:configure.ac:484: -1- m4_pattern_allow([^GC_MISSING_EXECINFO_H$])
+m4trace:configure.ac:484: -1- AH_OUTPUT([GC_MISSING_EXECINFO_H], [/* Missing execinfo.h header. */
+@%:@undef GC_MISSING_EXECINFO_H])
+m4trace:configure.ac:493: -1- AC_SUBST([extra_ldflags_libgc])
+m4trace:configure.ac:493: -1- AC_SUBST_TRACE([extra_ldflags_libgc])
+m4trace:configure.ac:493: -1- m4_pattern_allow([^extra_ldflags_libgc$])
+m4trace:configure.ac:495: -1- AC_SUBST([EXTRA_TEST_LIBS])
+m4trace:configure.ac:495: -1- AC_SUBST_TRACE([EXTRA_TEST_LIBS])
+m4trace:configure.ac:495: -1- m4_pattern_allow([^EXTRA_TEST_LIBS$])
+m4trace:configure.ac:498: -1- AC_SUBST([target_all])
+m4trace:configure.ac:498: -1- AC_SUBST_TRACE([target_all])
+m4trace:configure.ac:498: -1- m4_pattern_allow([^target_all$])
+m4trace:configure.ac:518: -1- AC_DEFINE_TRACE_LITERAL([ECOS])
+m4trace:configure.ac:518: -1- m4_pattern_allow([^ECOS$])
+m4trace:configure.ac:518: -1- AH_OUTPUT([ECOS], [/* Define to enable eCos target support. */
+@%:@undef ECOS])
+m4trace:configure.ac:524: -1- AM_CONDITIONAL([CPLUSPLUS], [test "${enable_cplusplus}" = yes])
+m4trace:configure.ac:524: -1- AC_SUBST([CPLUSPLUS_TRUE])
+m4trace:configure.ac:524: -1- AC_SUBST_TRACE([CPLUSPLUS_TRUE])
+m4trace:configure.ac:524: -1- m4_pattern_allow([^CPLUSPLUS_TRUE$])
+m4trace:configure.ac:524: -1- AC_SUBST([CPLUSPLUS_FALSE])
+m4trace:configure.ac:524: -1- AC_SUBST_TRACE([CPLUSPLUS_FALSE])
+m4trace:configure.ac:524: -1- m4_pattern_allow([^CPLUSPLUS_FALSE$])
+m4trace:configure.ac:524: -1- _AM_SUBST_NOTMAKE([CPLUSPLUS_TRUE])
+m4trace:configure.ac:524: -1- _AM_SUBST_NOTMAKE([CPLUSPLUS_FALSE])
+m4trace:configure.ac:529: -1- AM_CONDITIONAL([GC_TBA_LIBRARY], [test "${enable_cplusplus}" = yes \
+ -a "${enable_throw_bad_alloc_library}" != no])
+m4trace:configure.ac:529: -1- AC_SUBST([GC_TBA_LIBRARY_TRUE])
+m4trace:configure.ac:529: -1- AC_SUBST_TRACE([GC_TBA_LIBRARY_TRUE])
+m4trace:configure.ac:529: -1- m4_pattern_allow([^GC_TBA_LIBRARY_TRUE$])
+m4trace:configure.ac:529: -1- AC_SUBST([GC_TBA_LIBRARY_FALSE])
+m4trace:configure.ac:529: -1- AC_SUBST_TRACE([GC_TBA_LIBRARY_FALSE])
+m4trace:configure.ac:529: -1- m4_pattern_allow([^GC_TBA_LIBRARY_FALSE$])
+m4trace:configure.ac:529: -1- _AM_SUBST_NOTMAKE([GC_TBA_LIBRARY_TRUE])
+m4trace:configure.ac:529: -1- _AM_SUBST_NOTMAKE([GC_TBA_LIBRARY_FALSE])
+m4trace:configure.ac:550: -1- AC_SUBST([CXX])
+m4trace:configure.ac:550: -1- AC_SUBST_TRACE([CXX])
+m4trace:configure.ac:550: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:551: -1- AC_SUBST([AM_CFLAGS])
+m4trace:configure.ac:551: -1- AC_SUBST_TRACE([AM_CFLAGS])
+m4trace:configure.ac:551: -1- m4_pattern_allow([^AM_CFLAGS$])
+m4trace:configure.ac:552: -1- AC_SUBST([AM_CPPFLAGS])
+m4trace:configure.ac:552: -1- AC_SUBST_TRACE([AM_CPPFLAGS])
+m4trace:configure.ac:552: -1- m4_pattern_allow([^AM_CPPFLAGS$])
+m4trace:configure.ac:553: -1- AC_SUBST([CXXLIBS])
+m4trace:configure.ac:553: -1- AC_SUBST_TRACE([CXXLIBS])
+m4trace:configure.ac:553: -1- m4_pattern_allow([^CXXLIBS$])
+m4trace:configure.ac:572: -1- AC_DEFINE_TRACE_LITERAL([GC_DLL])
+m4trace:configure.ac:572: -1- m4_pattern_allow([^GC_DLL$])
+m4trace:configure.ac:590: -1- AC_DEFINE_TRACE_LITERAL([DONT_USE_USER32_DLL])
+m4trace:configure.ac:590: -1- m4_pattern_allow([^DONT_USE_USER32_DLL$])
+m4trace:configure.ac:590: -1- AH_OUTPUT([DONT_USE_USER32_DLL], [/* Do not use user32.dll import library (Win32). */
+@%:@undef DONT_USE_USER32_DLL])
+m4trace:configure.ac:613: -1- AC_DEFINE_TRACE_LITERAL([SOLARIS25_PROC_VDB_BUG_FIXED])
+m4trace:configure.ac:613: -1- m4_pattern_allow([^SOLARIS25_PROC_VDB_BUG_FIXED$])
+m4trace:configure.ac:613: -1- AH_OUTPUT([SOLARIS25_PROC_VDB_BUG_FIXED], [/* See the comment in gcconfig.h. */
+@%:@undef SOLARIS25_PROC_VDB_BUG_FIXED])
+m4trace:configure.ac:627: -1- AC_DEFINE_TRACE_LITERAL([SUNOS53_SHARED_LIB])
+m4trace:configure.ac:627: -1- m4_pattern_allow([^SUNOS53_SHARED_LIB$])
+m4trace:configure.ac:627: -1- AH_OUTPUT([SUNOS53_SHARED_LIB], [/* Define to work around a Solaris 5.3 bug (see dyn_load.c). */
+@%:@undef SUNOS53_SHARED_LIB])
+m4trace:configure.ac:640: -1- AC_SUBST([addobjs])
+m4trace:configure.ac:640: -1- AC_SUBST_TRACE([addobjs])
+m4trace:configure.ac:640: -1- m4_pattern_allow([^addobjs$])
+m4trace:configure.ac:641: -1- AC_SUBST([addlibs])
+m4trace:configure.ac:641: -1- AC_SUBST_TRACE([addlibs])
+m4trace:configure.ac:641: -1- m4_pattern_allow([^addlibs$])
+m4trace:configure.ac:643: -1- LT_INIT
+m4trace:configure.ac:704: -1- AC_DEFINE_TRACE_LITERAL([NO_EXECUTE_PERMISSION])
+m4trace:configure.ac:704: -1- m4_pattern_allow([^NO_EXECUTE_PERMISSION$])
+m4trace:configure.ac:704: -1- AH_OUTPUT([NO_EXECUTE_PERMISSION], [/* Define to make the collector not allocate executable memory by default. */
+@%:@undef NO_EXECUTE_PERMISSION])
+m4trace:configure.ac:707: -1- AC_DEFINE_TRACE_LITERAL([ALL_INTERIOR_POINTERS])
+m4trace:configure.ac:707: -1- m4_pattern_allow([^ALL_INTERIOR_POINTERS$])
+m4trace:configure.ac:707: -1- AH_OUTPUT([ALL_INTERIOR_POINTERS], [/* Define to recognise all pointers to the interior of objects. */
+@%:@undef ALL_INTERIOR_POINTERS])
+m4trace:configure.ac:718: -1- AC_DEFINE_TRACE_LITERAL([GC_GCJ_SUPPORT])
+m4trace:configure.ac:718: -1- m4_pattern_allow([^GC_GCJ_SUPPORT$])
+m4trace:configure.ac:718: -1- AH_OUTPUT([GC_GCJ_SUPPORT], [/* Define to include support for gcj. */
+@%:@undef GC_GCJ_SUPPORT])
+m4trace:configure.ac:724: -1- AC_DEFINE_TRACE_LITERAL([GC_ENABLE_SUSPEND_THREAD])
+m4trace:configure.ac:724: -1- m4_pattern_allow([^GC_ENABLE_SUSPEND_THREAD$])
+m4trace:configure.ac:728: -1- AC_DEFINE_TRACE_LITERAL([GC_ENABLE_SUSPEND_THREAD])
+m4trace:configure.ac:728: -1- m4_pattern_allow([^GC_ENABLE_SUSPEND_THREAD$])
+m4trace:configure.ac:728: -1- AH_OUTPUT([GC_ENABLE_SUSPEND_THREAD], [/* Define to turn on GC_suspend_thread support. */
+@%:@undef GC_ENABLE_SUSPEND_THREAD])
+m4trace:configure.ac:733: -1- AM_CONDITIONAL([ENABLE_GCJ_SUPPORT], [test x"enable_gcj_support" != xno])
+m4trace:configure.ac:733: -1- AC_SUBST([ENABLE_GCJ_SUPPORT_TRUE])
+m4trace:configure.ac:733: -1- AC_SUBST_TRACE([ENABLE_GCJ_SUPPORT_TRUE])
+m4trace:configure.ac:733: -1- m4_pattern_allow([^ENABLE_GCJ_SUPPORT_TRUE$])
+m4trace:configure.ac:733: -1- AC_SUBST([ENABLE_GCJ_SUPPORT_FALSE])
+m4trace:configure.ac:733: -1- AC_SUBST_TRACE([ENABLE_GCJ_SUPPORT_FALSE])
+m4trace:configure.ac:733: -1- m4_pattern_allow([^ENABLE_GCJ_SUPPORT_FALSE$])
+m4trace:configure.ac:733: -1- _AM_SUBST_NOTMAKE([ENABLE_GCJ_SUPPORT_TRUE])
+m4trace:configure.ac:733: -1- _AM_SUBST_NOTMAKE([ENABLE_GCJ_SUPPORT_FALSE])
+m4trace:configure.ac:740: -1- AC_DEFINE_TRACE_LITERAL([GC_USESIGRT_SIGNALS])
+m4trace:configure.ac:740: -1- m4_pattern_allow([^GC_USESIGRT_SIGNALS$])
+m4trace:configure.ac:740: -1- AH_OUTPUT([GC_USESIGRT_SIGNALS], [/* Force the GC to use signals based on SIGRTMIN+k. */
+@%:@undef GC_USESIGRT_SIGNALS])
+m4trace:configure.ac:748: -1- AH_OUTPUT([GC_HAVE_BUILTIN_BACKTRACE], [/* Define if backtrace information is supported. */
+@%:@undef GC_HAVE_BUILTIN_BACKTRACE])
+m4trace:configure.ac:750: -1- AH_OUTPUT([MAKE_BACK_GRAPH], [/* See doc/README.macros. */
+@%:@undef MAKE_BACK_GRAPH])
+m4trace:configure.ac:751: -1- AH_OUTPUT([SAVE_CALL_COUNT], [/* The number of caller frames saved when allocating with the debugging API.
+ */
+@%:@undef SAVE_CALL_COUNT])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([KEEP_BACK_PTRS])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^KEEP_BACK_PTRS$])
+m4trace:configure.ac:755: -1- AH_OUTPUT([KEEP_BACK_PTRS], [/* Define to save back-pointers in debugging headers. */
+@%:@undef KEEP_BACK_PTRS])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([DBG_HDRS_ALL])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^DBG_HDRS_ALL$])
+m4trace:configure.ac:755: -1- AH_OUTPUT([DBG_HDRS_ALL], [/* Define to force debug headers on all objects. */
+@%:@undef DBG_HDRS_ALL])
+m4trace:configure.ac:755: -1- AH_OUTPUT([SHORT_DBG_HDRS], [/* Shorten the headers to minimize object size at the expense of checking for
+ writes past the end (see doc/README.macros). */
+@%:@undef SHORT_DBG_HDRS])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([MAKE_BACK_GRAPH])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([SAVE_CALL_COUNT])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^SAVE_CALL_COUNT$])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([GC_HAVE_BUILTIN_BACKTRACE])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^GC_HAVE_BUILTIN_BACKTRACE$])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([MAKE_BACK_GRAPH])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([SAVE_CALL_COUNT])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^SAVE_CALL_COUNT$])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([MAKE_BACK_GRAPH])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:789: -1- AM_CONDITIONAL([MAKE_BACK_GRAPH], [test x"$enable_gc_debug" = xyes])
+m4trace:configure.ac:789: -1- AC_SUBST([MAKE_BACK_GRAPH_TRUE])
+m4trace:configure.ac:789: -1- AC_SUBST_TRACE([MAKE_BACK_GRAPH_TRUE])
+m4trace:configure.ac:789: -1- m4_pattern_allow([^MAKE_BACK_GRAPH_TRUE$])
+m4trace:configure.ac:789: -1- AC_SUBST([MAKE_BACK_GRAPH_FALSE])
+m4trace:configure.ac:789: -1- AC_SUBST_TRACE([MAKE_BACK_GRAPH_FALSE])
+m4trace:configure.ac:789: -1- m4_pattern_allow([^MAKE_BACK_GRAPH_FALSE$])
+m4trace:configure.ac:789: -1- _AM_SUBST_NOTMAKE([MAKE_BACK_GRAPH_TRUE])
+m4trace:configure.ac:789: -1- _AM_SUBST_NOTMAKE([MAKE_BACK_GRAPH_FALSE])
+m4trace:configure.ac:790: -1- AM_CONDITIONAL([KEEP_BACK_PTRS], [test x"$keep_back_ptrs" = xtrue])
+m4trace:configure.ac:790: -1- AC_SUBST([KEEP_BACK_PTRS_TRUE])
+m4trace:configure.ac:790: -1- AC_SUBST_TRACE([KEEP_BACK_PTRS_TRUE])
+m4trace:configure.ac:790: -1- m4_pattern_allow([^KEEP_BACK_PTRS_TRUE$])
+m4trace:configure.ac:790: -1- AC_SUBST([KEEP_BACK_PTRS_FALSE])
+m4trace:configure.ac:790: -1- AC_SUBST_TRACE([KEEP_BACK_PTRS_FALSE])
+m4trace:configure.ac:790: -1- m4_pattern_allow([^KEEP_BACK_PTRS_FALSE$])
+m4trace:configure.ac:790: -1- _AM_SUBST_NOTMAKE([KEEP_BACK_PTRS_TRUE])
+m4trace:configure.ac:790: -1- _AM_SUBST_NOTMAKE([KEEP_BACK_PTRS_FALSE])
+m4trace:configure.ac:822: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLADDR])
+m4trace:configure.ac:822: -1- m4_pattern_allow([^HAVE_DLADDR$])
+m4trace:configure.ac:822: -1- AH_OUTPUT([HAVE_DLADDR], [/* Define to use \'dladdr\' function. */
+@%:@undef HAVE_DLADDR])
+m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([GC_NO_SIGSETJMP])
+m4trace:configure.ac:829: -1- m4_pattern_allow([^GC_NO_SIGSETJMP$])
+m4trace:configure.ac:829: -1- AH_OUTPUT([GC_NO_SIGSETJMP], [/* Missing sigsetjmp function. */
+@%:@undef GC_NO_SIGSETJMP])
+m4trace:configure.ac:834: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID$])
+m4trace:configure.ac:834: -1- AH_OUTPUT([HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID], [/* Define to use \'pthread_setname_np(const char*)\' function. */
+@%:@undef HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID])
+m4trace:configure.ac:834: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG$])
+m4trace:configure.ac:834: -1- AH_OUTPUT([HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG], [/* Define to use \'pthread_setname_np(pthread_t, const char*, void *)\'
+ function. */
+@%:@undef HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG])
+m4trace:configure.ac:834: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD_SETNAME_NP_WITH_TID])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITH_TID$])
+m4trace:configure.ac:834: -1- AH_OUTPUT([HAVE_PTHREAD_SETNAME_NP_WITH_TID], [/* Define to use \'pthread_setname_np(pthread_t, const char*)\' function. */
+@%:@undef HAVE_PTHREAD_SETNAME_NP_WITH_TID])
+m4trace:configure.ac:877: -1- AC_SUBST([CFLAGS])
+m4trace:configure.ac:877: -1- AC_SUBST_TRACE([CFLAGS])
+m4trace:configure.ac:877: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.ac:878: -1- AC_SUBST([CXXFLAGS])
+m4trace:configure.ac:878: -1- AC_SUBST_TRACE([CXXFLAGS])
+m4trace:configure.ac:878: -1- m4_pattern_allow([^CXXFLAGS$])
+m4trace:configure.ac:885: -1- AC_DEFINE_TRACE_LITERAL([JAVA_FINALIZATION])
+m4trace:configure.ac:885: -1- m4_pattern_allow([^JAVA_FINALIZATION$])
+m4trace:configure.ac:885: -1- AH_OUTPUT([JAVA_FINALIZATION], [/* See doc/README.macros. */
+@%:@undef JAVA_FINALIZATION])
+m4trace:configure.ac:892: -1- AC_DEFINE_TRACE_LITERAL([GC_ATOMIC_UNCOLLECTABLE])
+m4trace:configure.ac:892: -1- m4_pattern_allow([^GC_ATOMIC_UNCOLLECTABLE$])
+m4trace:configure.ac:892: -1- AH_OUTPUT([GC_ATOMIC_UNCOLLECTABLE], [/* Define to enable atomic uncollectible allocation. */
+@%:@undef GC_ATOMIC_UNCOLLECTABLE])
+m4trace:configure.ac:902: -1- AC_DEFINE_TRACE_LITERAL([REDIRECT_MALLOC])
+m4trace:configure.ac:902: -1- m4_pattern_allow([^REDIRECT_MALLOC$])
+m4trace:configure.ac:902: -1- AH_OUTPUT([REDIRECT_MALLOC], [/* If defined, redirect malloc to this function. */
+@%:@undef REDIRECT_MALLOC])
+m4trace:configure.ac:904: -1- AC_DEFINE_TRACE_LITERAL([REDIRECT_REALLOC])
+m4trace:configure.ac:904: -1- m4_pattern_allow([^REDIRECT_REALLOC$])
+m4trace:configure.ac:904: -1- AH_OUTPUT([REDIRECT_REALLOC], [/* If defined, redirect GC_realloc to this function. */
+@%:@undef REDIRECT_REALLOC])
+m4trace:configure.ac:906: -1- AC_DEFINE_TRACE_LITERAL([REDIRECT_FREE])
+m4trace:configure.ac:906: -1- m4_pattern_allow([^REDIRECT_FREE$])
+m4trace:configure.ac:906: -1- AH_OUTPUT([REDIRECT_FREE], [/* If defined, redirect free to this function. */
+@%:@undef REDIRECT_FREE])
+m4trace:configure.ac:909: -1- AC_DEFINE_TRACE_LITERAL([REDIRECT_MALLOC])
+m4trace:configure.ac:909: -1- m4_pattern_allow([^REDIRECT_MALLOC$])
+m4trace:configure.ac:911: -1- AC_DEFINE_TRACE_LITERAL([GC_USE_DLOPEN_WRAP])
+m4trace:configure.ac:911: -1- m4_pattern_allow([^GC_USE_DLOPEN_WRAP$])
+m4trace:configure.ac:911: -1- AH_OUTPUT([GC_USE_DLOPEN_WRAP], [/* See doc/README.macros. */
+@%:@undef GC_USE_DLOPEN_WRAP])
+m4trace:configure.ac:918: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_DISCLAIM])
+m4trace:configure.ac:918: -1- m4_pattern_allow([^ENABLE_DISCLAIM$])
+m4trace:configure.ac:918: -1- AH_OUTPUT([ENABLE_DISCLAIM], [/* Define to enable alternative finalization interface. */
+@%:@undef ENABLE_DISCLAIM])
+m4trace:configure.ac:921: -1- AM_CONDITIONAL([ENABLE_DISCLAIM], [test x"$enable_disclaim" != xno])
+m4trace:configure.ac:921: -1- AC_SUBST([ENABLE_DISCLAIM_TRUE])
+m4trace:configure.ac:921: -1- AC_SUBST_TRACE([ENABLE_DISCLAIM_TRUE])
+m4trace:configure.ac:921: -1- m4_pattern_allow([^ENABLE_DISCLAIM_TRUE$])
+m4trace:configure.ac:921: -1- AC_SUBST([ENABLE_DISCLAIM_FALSE])
+m4trace:configure.ac:921: -1- AC_SUBST_TRACE([ENABLE_DISCLAIM_FALSE])
+m4trace:configure.ac:921: -1- m4_pattern_allow([^ENABLE_DISCLAIM_FALSE$])
+m4trace:configure.ac:921: -1- _AM_SUBST_NOTMAKE([ENABLE_DISCLAIM_TRUE])
+m4trace:configure.ac:921: -1- _AM_SUBST_NOTMAKE([ENABLE_DISCLAIM_FALSE])
+m4trace:configure.ac:928: -1- AC_DEFINE_TRACE_LITERAL([LARGE_CONFIG])
+m4trace:configure.ac:928: -1- m4_pattern_allow([^LARGE_CONFIG$])
+m4trace:configure.ac:928: -1- AH_OUTPUT([LARGE_CONFIG], [/* Define to optimize for large heaps or root sets. */
+@%:@undef LARGE_CONFIG])
+m4trace:configure.ac:936: -1- AC_DEFINE_TRACE_LITERAL([NO_CLOCK])
+m4trace:configure.ac:936: -1- m4_pattern_allow([^NO_CLOCK$])
+m4trace:configure.ac:936: -1- AH_OUTPUT([NO_CLOCK], [/* Define to not use system clock (cross compiling). */
+@%:@undef NO_CLOCK])
+m4trace:configure.ac:937: -1- AC_DEFINE_TRACE_LITERAL([SMALL_CONFIG])
+m4trace:configure.ac:937: -1- m4_pattern_allow([^SMALL_CONFIG$])
+m4trace:configure.ac:937: -1- AH_OUTPUT([SMALL_CONFIG], [/* Define to tune the collector for small heap sizes. */
+@%:@undef SMALL_CONFIG])
+m4trace:configure.ac:942: -1- AC_DEFINE_TRACE_LITERAL([NO_DEBUGGING])
+m4trace:configure.ac:942: -1- m4_pattern_allow([^NO_DEBUGGING$])
+m4trace:configure.ac:942: -1- AH_OUTPUT([NO_DEBUGGING], [/* Disable debugging, like GC_dump and its callees. */
+@%:@undef NO_DEBUGGING])
+m4trace:configure.ac:946: -1- AC_SUBST([UNWINDLIBS])
+m4trace:configure.ac:946: -1- AC_SUBST_TRACE([UNWINDLIBS])
+m4trace:configure.ac:946: -1- m4_pattern_allow([^UNWINDLIBS$])
+m4trace:configure.ac:952: -1- AC_DEFINE_TRACE_LITERAL([GC_ASSERTIONS])
+m4trace:configure.ac:952: -1- m4_pattern_allow([^GC_ASSERTIONS$])
+m4trace:configure.ac:952: -1- AH_OUTPUT([GC_ASSERTIONS], [/* Define to enable internal debug assertions. */
+@%:@undef GC_ASSERTIONS])
+m4trace:configure.ac:967: -1- AC_DEFINE_TRACE_LITERAL([USE_MMAP])
+m4trace:configure.ac:967: -1- m4_pattern_allow([^USE_MMAP$])
+m4trace:configure.ac:967: -1- AH_OUTPUT([USE_MMAP], [/* Define to use mmap instead of sbrk to expand the heap. */
+@%:@undef USE_MMAP])
+m4trace:configure.ac:969: -1- AH_OUTPUT([USE_WINALLOC], [/* Define to use Win32 VirtualAlloc (instead of sbrk or mmap) to expand the
+ heap. */
+@%:@undef USE_WINALLOC])
+m4trace:configure.ac:972: -1- AC_DEFINE_TRACE_LITERAL([USE_MUNMAP])
+m4trace:configure.ac:972: -1- m4_pattern_allow([^USE_MUNMAP$])
+m4trace:configure.ac:972: -1- AH_OUTPUT([USE_MUNMAP], [/* Define to return memory to OS with munmap calls (see doc/README.macros). */
+@%:@undef USE_MUNMAP])
+m4trace:configure.ac:978: -1- AC_DEFINE_TRACE_LITERAL([MUNMAP_THRESHOLD])
+m4trace:configure.ac:978: -1- m4_pattern_allow([^MUNMAP_THRESHOLD$])
+m4trace:configure.ac:978: -1- AH_OUTPUT([MUNMAP_THRESHOLD], [/* Number of GC cycles to wait before unmapping an unused block. */
+@%:@undef MUNMAP_THRESHOLD])
+m4trace:configure.ac:982: -1- AC_DEFINE_TRACE_LITERAL([USE_MMAP])
+m4trace:configure.ac:982: -1- m4_pattern_allow([^USE_MMAP$])
+m4trace:configure.ac:982: -1- AH_OUTPUT([USE_MMAP], [/* Define to use mmap instead of sbrk to expand the heap. */
+@%:@undef USE_MMAP])
+m4trace:configure.ac:992: -1- AC_DEFINE_TRACE_LITERAL([IGNORE_DYNAMIC_LOADING])
+m4trace:configure.ac:992: -1- m4_pattern_allow([^IGNORE_DYNAMIC_LOADING$])
+m4trace:configure.ac:992: -1- AH_OUTPUT([IGNORE_DYNAMIC_LOADING], [/* Do not define DYNAMIC_LOADING even if supported (i.e., build the collector
+ with disabled tracing of dynamic library data roots). */
+@%:@undef IGNORE_DYNAMIC_LOADING])
+m4trace:configure.ac:1001: -1- AC_DEFINE_TRACE_LITERAL([GC_DONT_REGISTER_MAIN_STATIC_DATA])
+m4trace:configure.ac:1001: -1- m4_pattern_allow([^GC_DONT_REGISTER_MAIN_STATIC_DATA$])
+m4trace:configure.ac:1001: -1- AH_OUTPUT([GC_DONT_REGISTER_MAIN_STATIC_DATA], [/* Skip the initial guess of data root sets. */
+@%:@undef GC_DONT_REGISTER_MAIN_STATIC_DATA])
+m4trace:configure.ac:1014: -1- AC_DEFINE_TRACE_LITERAL([CHECKSUMS])
+m4trace:configure.ac:1014: -1- m4_pattern_allow([^CHECKSUMS$])
+m4trace:configure.ac:1014: -1- AH_OUTPUT([CHECKSUMS], [/* Erroneously cleared dirty bits checking. Use only for debugging of the
+ incremental collector. */
+@%:@undef CHECKSUMS])
+m4trace:configure.ac:1018: -1- AM_CONDITIONAL([CHECKSUMS], [test x$enable_checksums = xyes])
+m4trace:configure.ac:1018: -1- AC_SUBST([CHECKSUMS_TRUE])
+m4trace:configure.ac:1018: -1- AC_SUBST_TRACE([CHECKSUMS_TRUE])
+m4trace:configure.ac:1018: -1- m4_pattern_allow([^CHECKSUMS_TRUE$])
+m4trace:configure.ac:1018: -1- AC_SUBST([CHECKSUMS_FALSE])
+m4trace:configure.ac:1018: -1- AC_SUBST_TRACE([CHECKSUMS_FALSE])
+m4trace:configure.ac:1018: -1- m4_pattern_allow([^CHECKSUMS_FALSE$])
+m4trace:configure.ac:1018: -1- _AM_SUBST_NOTMAKE([CHECKSUMS_TRUE])
+m4trace:configure.ac:1018: -1- _AM_SUBST_NOTMAKE([CHECKSUMS_FALSE])
+m4trace:configure.ac:1020: -1- AM_CONDITIONAL([USE_LIBDIR], [test -z "$with_cross_host"])
+m4trace:configure.ac:1020: -1- AC_SUBST([USE_LIBDIR_TRUE])
+m4trace:configure.ac:1020: -1- AC_SUBST_TRACE([USE_LIBDIR_TRUE])
+m4trace:configure.ac:1020: -1- m4_pattern_allow([^USE_LIBDIR_TRUE$])
+m4trace:configure.ac:1020: -1- AC_SUBST([USE_LIBDIR_FALSE])
+m4trace:configure.ac:1020: -1- AC_SUBST_TRACE([USE_LIBDIR_FALSE])
+m4trace:configure.ac:1020: -1- m4_pattern_allow([^USE_LIBDIR_FALSE$])
+m4trace:configure.ac:1020: -1- _AM_SUBST_NOTMAKE([USE_LIBDIR_TRUE])
+m4trace:configure.ac:1020: -1- _AM_SUBST_NOTMAKE([USE_LIBDIR_FALSE])
+m4trace:configure.ac:1034: -1- AC_SUBST([WERROR_CFLAGS])
+m4trace:configure.ac:1034: -1- AC_SUBST_TRACE([WERROR_CFLAGS])
+m4trace:configure.ac:1034: -1- m4_pattern_allow([^WERROR_CFLAGS$])
+m4trace:configure.ac:1042: -1- AM_CONDITIONAL([SINGLE_GC_OBJ], [test x"$enable_single_obj_compilation" = xyes])
+m4trace:configure.ac:1042: -1- AC_SUBST([SINGLE_GC_OBJ_TRUE])
+m4trace:configure.ac:1042: -1- AC_SUBST_TRACE([SINGLE_GC_OBJ_TRUE])
+m4trace:configure.ac:1042: -1- m4_pattern_allow([^SINGLE_GC_OBJ_TRUE$])
+m4trace:configure.ac:1042: -1- AC_SUBST([SINGLE_GC_OBJ_FALSE])
+m4trace:configure.ac:1042: -1- AC_SUBST_TRACE([SINGLE_GC_OBJ_FALSE])
+m4trace:configure.ac:1042: -1- m4_pattern_allow([^SINGLE_GC_OBJ_FALSE$])
+m4trace:configure.ac:1042: -1- _AM_SUBST_NOTMAKE([SINGLE_GC_OBJ_TRUE])
+m4trace:configure.ac:1042: -1- _AM_SUBST_NOTMAKE([SINGLE_GC_OBJ_FALSE])
+m4trace:configure.ac:1062: -1- AM_CONDITIONAL([ENABLE_DOCS], [test x$enable_docs != xno])
+m4trace:configure.ac:1062: -1- AC_SUBST([ENABLE_DOCS_TRUE])
+m4trace:configure.ac:1062: -1- AC_SUBST_TRACE([ENABLE_DOCS_TRUE])
+m4trace:configure.ac:1062: -1- m4_pattern_allow([^ENABLE_DOCS_TRUE$])
+m4trace:configure.ac:1062: -1- AC_SUBST([ENABLE_DOCS_FALSE])
+m4trace:configure.ac:1062: -1- AC_SUBST_TRACE([ENABLE_DOCS_FALSE])
+m4trace:configure.ac:1062: -1- m4_pattern_allow([^ENABLE_DOCS_FALSE$])
+m4trace:configure.ac:1062: -1- _AM_SUBST_NOTMAKE([ENABLE_DOCS_TRUE])
+m4trace:configure.ac:1062: -1- _AM_SUBST_NOTMAKE([ENABLE_DOCS_FALSE])
+m4trace:configure.ac:1064: -1- AM_CONDITIONAL([ENABLE_SHARED], [test x$enable_shared = xyes])
+m4trace:configure.ac:1064: -1- AC_SUBST([ENABLE_SHARED_TRUE])
+m4trace:configure.ac:1064: -1- AC_SUBST_TRACE([ENABLE_SHARED_TRUE])
+m4trace:configure.ac:1064: -1- m4_pattern_allow([^ENABLE_SHARED_TRUE$])
+m4trace:configure.ac:1064: -1- AC_SUBST([ENABLE_SHARED_FALSE])
+m4trace:configure.ac:1064: -1- AC_SUBST_TRACE([ENABLE_SHARED_FALSE])
+m4trace:configure.ac:1064: -1- m4_pattern_allow([^ENABLE_SHARED_FALSE$])
+m4trace:configure.ac:1064: -1- _AM_SUBST_NOTMAKE([ENABLE_SHARED_TRUE])
+m4trace:configure.ac:1064: -1- _AM_SUBST_NOTMAKE([ENABLE_SHARED_FALSE])
+m4trace:configure.ac:1121: -1- AC_SUBST([ATOMIC_OPS_LIBS])
+m4trace:configure.ac:1121: -1- AC_SUBST_TRACE([ATOMIC_OPS_LIBS])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^ATOMIC_OPS_LIBS$])
+m4trace:configure.ac:1121: -1- AC_DEFINE_TRACE_LITERAL([GC_BUILTIN_ATOMIC])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^GC_BUILTIN_ATOMIC$])
+m4trace:configure.ac:1121: -1- AH_OUTPUT([GC_BUILTIN_ATOMIC], [/* Use GCC atomic intrinsics instead of libatomic_ops primitives. */
+@%:@undef GC_BUILTIN_ATOMIC])
+m4trace:configure.ac:1121: -1- AC_SUBST([ATOMIC_OPS_CFLAGS])
+m4trace:configure.ac:1121: -1- AC_SUBST_TRACE([ATOMIC_OPS_CFLAGS])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^ATOMIC_OPS_CFLAGS$])
+m4trace:configure.ac:1121: -1- AC_CONFIG_SUBDIRS([libatomic_ops])
+m4trace:configure.ac:1121: -1- AC_SUBST([subdirs], ["$subdirs libatomic_ops"])
+m4trace:configure.ac:1121: -1- AC_SUBST_TRACE([subdirs])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^subdirs$])
+m4trace:configure.ac:1139: -1- AM_CONDITIONAL([USE_INTERNAL_LIBATOMIC_OPS], [test x$with_libatomic_ops = xno -a x"$THREADS" != xnone])
+m4trace:configure.ac:1139: -1- AC_SUBST([USE_INTERNAL_LIBATOMIC_OPS_TRUE])
+m4trace:configure.ac:1139: -1- AC_SUBST_TRACE([USE_INTERNAL_LIBATOMIC_OPS_TRUE])
+m4trace:configure.ac:1139: -1- m4_pattern_allow([^USE_INTERNAL_LIBATOMIC_OPS_TRUE$])
+m4trace:configure.ac:1139: -1- AC_SUBST([USE_INTERNAL_LIBATOMIC_OPS_FALSE])
+m4trace:configure.ac:1139: -1- AC_SUBST_TRACE([USE_INTERNAL_LIBATOMIC_OPS_FALSE])
+m4trace:configure.ac:1139: -1- m4_pattern_allow([^USE_INTERNAL_LIBATOMIC_OPS_FALSE$])
+m4trace:configure.ac:1139: -1- _AM_SUBST_NOTMAKE([USE_INTERNAL_LIBATOMIC_OPS_TRUE])
+m4trace:configure.ac:1139: -1- _AM_SUBST_NOTMAKE([USE_INTERNAL_LIBATOMIC_OPS_FALSE])
+m4trace:configure.ac:1141: -1- AM_CONDITIONAL([NEED_ATOMIC_OPS_ASM], [test x$with_libatomic_ops = xno -a x$need_atomic_ops_asm = xtrue])
+m4trace:configure.ac:1141: -1- AC_SUBST([NEED_ATOMIC_OPS_ASM_TRUE])
+m4trace:configure.ac:1141: -1- AC_SUBST_TRACE([NEED_ATOMIC_OPS_ASM_TRUE])
+m4trace:configure.ac:1141: -1- m4_pattern_allow([^NEED_ATOMIC_OPS_ASM_TRUE$])
+m4trace:configure.ac:1141: -1- AC_SUBST([NEED_ATOMIC_OPS_ASM_FALSE])
+m4trace:configure.ac:1141: -1- AC_SUBST_TRACE([NEED_ATOMIC_OPS_ASM_FALSE])
+m4trace:configure.ac:1141: -1- m4_pattern_allow([^NEED_ATOMIC_OPS_ASM_FALSE$])
+m4trace:configure.ac:1141: -1- _AM_SUBST_NOTMAKE([NEED_ATOMIC_OPS_ASM_TRUE])
+m4trace:configure.ac:1141: -1- _AM_SUBST_NOTMAKE([NEED_ATOMIC_OPS_ASM_FALSE])
+m4trace:configure.ac:1148: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LOCKFREE_AO_OR])
+m4trace:configure.ac:1148: -1- m4_pattern_allow([^HAVE_LOCKFREE_AO_OR$])
+m4trace:configure.ac:1148: -1- AH_OUTPUT([HAVE_LOCKFREE_AO_OR], [/* libatomic_ops AO_or primitive implementation is lock-free. */
+@%:@undef HAVE_LOCKFREE_AO_OR])
+m4trace:configure.ac:1148: -1- AC_DEFINE_TRACE_LITERAL([BASE_ATOMIC_OPS_EMULATED])
+m4trace:configure.ac:1148: -1- m4_pattern_allow([^BASE_ATOMIC_OPS_EMULATED$])
+m4trace:configure.ac:1148: -1- AH_OUTPUT([BASE_ATOMIC_OPS_EMULATED], [/* AO load, store and/or test-and-set primitives are implemented in
+ libatomic_ops using locks. */
+@%:@undef BASE_ATOMIC_OPS_EMULATED])
+m4trace:configure.ac:1172: -1- AC_DEFINE_TRACE_LITERAL([PARALLEL_MARK])
+m4trace:configure.ac:1172: -1- m4_pattern_allow([^PARALLEL_MARK$])
+m4trace:configure.ac:1174: -1- AC_DEFINE_TRACE_LITERAL([THREAD_LOCAL_ALLOC])
+m4trace:configure.ac:1174: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC$])
+m4trace:configure.ac:1176: -1- AM_CONDITIONAL([THREAD_LOCAL_ALLOC], [test x$use_thread_local_alloc != xno])
+m4trace:configure.ac:1176: -1- AC_SUBST([THREAD_LOCAL_ALLOC_TRUE])
+m4trace:configure.ac:1176: -1- AC_SUBST_TRACE([THREAD_LOCAL_ALLOC_TRUE])
+m4trace:configure.ac:1176: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC_TRUE$])
+m4trace:configure.ac:1176: -1- AC_SUBST([THREAD_LOCAL_ALLOC_FALSE])
+m4trace:configure.ac:1176: -1- AC_SUBST_TRACE([THREAD_LOCAL_ALLOC_FALSE])
+m4trace:configure.ac:1176: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC_FALSE$])
+m4trace:configure.ac:1176: -1- _AM_SUBST_NOTMAKE([THREAD_LOCAL_ALLOC_TRUE])
+m4trace:configure.ac:1176: -1- _AM_SUBST_NOTMAKE([THREAD_LOCAL_ALLOC_FALSE])
+m4trace:configure.ac:1185: -1- AC_DEFINE_TRACE_LITERAL([HANDLE_FORK])
+m4trace:configure.ac:1185: -1- m4_pattern_allow([^HANDLE_FORK$])
+m4trace:configure.ac:1185: -1- AH_OUTPUT([HANDLE_FORK], [/* Define to install pthread_atfork() handlers by default. */
+@%:@undef HANDLE_FORK])
+m4trace:configure.ac:1188: -1- AC_DEFINE_TRACE_LITERAL([NO_HANDLE_FORK])
+m4trace:configure.ac:1188: -1- m4_pattern_allow([^NO_HANDLE_FORK$])
+m4trace:configure.ac:1188: -1- AH_OUTPUT([NO_HANDLE_FORK], [/* Prohibit installation of pthread_atfork() handlers. */
+@%:@undef NO_HANDLE_FORK])
+m4trace:configure.ac:1197: -1- AC_DEFINE_TRACE_LITERAL([HANDLE_FORK])
+m4trace:configure.ac:1197: -1- m4_pattern_allow([^HANDLE_FORK$])
+m4trace:configure.ac:1205: -1- AC_CONFIG_FILES([Makefile bdw-gc.pc])
+m4trace:configure.ac:1214: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:1214: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([LTLIBOBJS])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.ac:1214: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
+m4trace:configure.ac:1214: -1- AC_SUBST([am__EXEEXT_TRUE])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
+m4trace:configure.ac:1214: -1- AC_SUBST([am__EXEEXT_FALSE])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
+m4trace:configure.ac:1214: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
+m4trace:configure.ac:1214: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([top_builddir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([top_build_prefix])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([srcdir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([abs_srcdir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([top_srcdir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([abs_top_srcdir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([builddir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([abs_builddir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([abs_top_builddir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([INSTALL])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([MKDIR_P])
+m4trace:configure.ac:1214: -1- AC_REQUIRE_AUX_FILE([ltmain.sh])
diff --git a/graphics/asymptote/gc/autom4te.cache/traces.2 b/graphics/asymptote/gc/autom4te.cache/traces.2
new file mode 100644
index 0000000000..221ee51b88
--- /dev/null
+++ b/graphics/asymptote/gc/autom4te.cache/traces.2
@@ -0,0 +1,3054 @@
+m4trace:/usr/share/aclocal/ltargz.m4:13: -1- AC_DEFUN([LT_FUNC_ARGZ], [
+dnl Required for use of '$SED' in Cygwin configuration.
+AC_REQUIRE([AC_PROG_SED])dnl
+AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT])
+
+AC_CHECK_TYPES([error_t],
+ [],
+ [AC_DEFINE([error_t], [int],
+ [Define to a type to use for 'error_t' if it is not otherwise available.])
+ AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h
+ does not typedef error_t.])],
+ [#if defined(HAVE_ARGZ_H)
+# include <argz.h>
+#endif])
+
+LT_ARGZ_H=
+AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \
+ argz_next argz_stringify], [], [LT_ARGZ_H=lt__argz.h; AC_LIBOBJ([lt__argz])])
+
+dnl if have system argz functions, allow forced use of
+dnl libltdl-supplied implementation (and default to do so
+dnl on "known bad" systems). Could use a runtime check, but
+dnl (a) detecting malloc issues is notoriously unreliable
+dnl (b) only known system that declares argz functions,
+dnl provides them, yet they are broken, is cygwin
+dnl releases prior to 16-Mar-2007 (1.5.24 and earlier)
+dnl So, it's more straightforward simply to special case
+dnl this for known bad systems.
+AS_IF([test -z "$LT_ARGZ_H"],
+ [AC_CACHE_CHECK(
+ [if argz actually works],
+ [lt_cv_sys_argz_works],
+ [[case $host_os in #(
+ *cygwin*)
+ lt_cv_sys_argz_works=no
+ if test no != "$cross_compiling"; then
+ lt_cv_sys_argz_works="guessing no"
+ else
+ lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/'
+ save_IFS=$IFS
+ IFS=-.
+ set x `uname -r | $SED -e "$lt_sed_extract_leading_digits"`
+ IFS=$save_IFS
+ lt_os_major=${2-0}
+ lt_os_minor=${3-0}
+ lt_os_micro=${4-0}
+ if test 1 -lt "$lt_os_major" \
+ || { test 1 -eq "$lt_os_major" \
+ && { test 5 -lt "$lt_os_minor" \
+ || { test 5 -eq "$lt_os_minor" \
+ && test 24 -lt "$lt_os_micro"; }; }; }; then
+ lt_cv_sys_argz_works=yes
+ fi
+ fi
+ ;; #(
+ *) lt_cv_sys_argz_works=yes ;;
+ esac]])
+ AS_IF([test yes = "$lt_cv_sys_argz_works"],
+ [AC_DEFINE([HAVE_WORKING_ARGZ], 1,
+ [This value is set to 1 to indicate that the system argz facility works])],
+ [LT_ARGZ_H=lt__argz.h
+ AC_LIBOBJ([lt__argz])])])
+
+AC_SUBST([LT_ARGZ_H])
+])
+m4trace:/usr/share/aclocal/ltdl.m4:17: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT])
+_$0($*)
+])
+m4trace:/usr/share/aclocal/ltdl.m4:69: -1- AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl
+dnl Although the argument is deprecated and no longer documented,
+dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one
+dnl here make sure it is the same as any other declaration of libltdl's
+dnl location! This also ensures lt_ltdl_dir is set when configure.ac is
+dnl not yet using an explicit LT_CONFIG_LTDL_DIR.
+m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl
+_$0()
+])
+m4trace:/usr/share/aclocal/ltdl.m4:82: -1- AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_CONVENIENCE])
+m4trace:/usr/share/aclocal/ltdl.m4:82: -1- AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [m4_warn([obsolete], [The macro `AC_LIBLTDL_CONVENIENCE' is obsolete.
+You should run autoupdate.])dnl
+_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_CONVENIENCE])
+m4trace:/usr/share/aclocal/ltdl.m4:125: -1- AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl
+dnl Although the argument is deprecated and no longer documented,
+dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one
+dnl here make sure it is the same as any other declaration of libltdl's
+dnl location! This also ensures lt_ltdl_dir is set when configure.ac is
+dnl not yet using an explicit LT_CONFIG_LTDL_DIR.
+m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl
+_$0()
+])
+m4trace:/usr/share/aclocal/ltdl.m4:138: -1- AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_INSTALLABLE])
+m4trace:/usr/share/aclocal/ltdl.m4:138: -1- AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [m4_warn([obsolete], [The macro `AC_LIBLTDL_INSTALLABLE' is obsolete.
+You should run autoupdate.])dnl
+_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_INSTALLABLE])
+m4trace:/usr/share/aclocal/ltdl.m4:214: -1- AC_DEFUN([_LT_LIBOBJ], [
+ m4_pattern_allow([^_LT_LIBOBJS$])
+ _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext"
+])
+m4trace:/usr/share/aclocal/ltdl.m4:227: -1- AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+dnl We need to keep our own list of libobjs separate from our parent project,
+dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while
+dnl we look for our own LIBOBJs.
+m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ]))
+m4_pushdef([AC_LIBSOURCES])
+
+dnl If not otherwise defined, default to the 1.5.x compatible subproject mode:
+m4_if(_LTDL_MODE, [],
+ [m4_define([_LTDL_MODE], m4_default([$2], [subproject]))
+ m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])],
+ [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])
+
+AC_ARG_WITH([included_ltdl],
+ [AS_HELP_STRING([--with-included-ltdl],
+ [use the GNU ltdl sources included here])])
+
+if test yes != "$with_included_ltdl"; then
+ # We are not being forced to use the included libltdl sources, so
+ # decide whether there is a useful installed version we can use.
+ AC_CHECK_HEADER([ltdl.h],
+ [AC_CHECK_DECL([lt_dlinterface_register],
+ [AC_CHECK_LIB([ltdl], [lt_dladvise_preload],
+ [with_included_ltdl=no],
+ [with_included_ltdl=yes])],
+ [with_included_ltdl=yes],
+ [AC_INCLUDES_DEFAULT
+ #include <ltdl.h>])],
+ [with_included_ltdl=yes],
+ [AC_INCLUDES_DEFAULT]
+ )
+fi
+
+dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE
+dnl was called yet, then for old times' sake, we assume libltdl is in an
+dnl eponymous directory:
+AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])])
+
+AC_ARG_WITH([ltdl_include],
+ [AS_HELP_STRING([--with-ltdl-include=DIR],
+ [use the ltdl headers installed in DIR])])
+
+if test -n "$with_ltdl_include"; then
+ if test -f "$with_ltdl_include/ltdl.h"; then :
+ else
+ AC_MSG_ERROR([invalid ltdl include directory: '$with_ltdl_include'])
+ fi
+else
+ with_ltdl_include=no
+fi
+
+AC_ARG_WITH([ltdl_lib],
+ [AS_HELP_STRING([--with-ltdl-lib=DIR],
+ [use the libltdl.la installed in DIR])])
+
+if test -n "$with_ltdl_lib"; then
+ if test -f "$with_ltdl_lib/libltdl.la"; then :
+ else
+ AC_MSG_ERROR([invalid ltdl library directory: '$with_ltdl_lib'])
+ fi
+else
+ with_ltdl_lib=no
+fi
+
+case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in
+ ,yes,no,no,)
+ m4_case(m4_default(_LTDL_TYPE, [convenience]),
+ [convenience], [_LTDL_CONVENIENCE],
+ [installable], [_LTDL_INSTALLABLE],
+ [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)])
+ ;;
+ ,no,no,no,)
+ # If the included ltdl is not to be used, then use the
+ # preinstalled libltdl we found.
+ AC_DEFINE([HAVE_LTDL], [1],
+ [Define this if a modern libltdl is already installed])
+ LIBLTDL=-lltdl
+ LTDLDEPS=
+ LTDLINCL=
+ ;;
+ ,no*,no,*)
+ AC_MSG_ERROR(['--with-ltdl-include' and '--with-ltdl-lib' options must be used together])
+ ;;
+ *) with_included_ltdl=no
+ LIBLTDL="-L$with_ltdl_lib -lltdl"
+ LTDLDEPS=
+ LTDLINCL=-I$with_ltdl_include
+ ;;
+esac
+INCLTDL=$LTDLINCL
+
+# Report our decision...
+AC_MSG_CHECKING([where to find libltdl headers])
+AC_MSG_RESULT([$LTDLINCL])
+AC_MSG_CHECKING([where to find libltdl library])
+AC_MSG_RESULT([$LIBLTDL])
+
+_LTDL_SETUP
+
+dnl restore autoconf definition.
+m4_popdef([AC_LIBOBJ])
+m4_popdef([AC_LIBSOURCES])
+
+AC_CONFIG_COMMANDS_PRE([
+ _ltdl_libobjs=
+ _ltdl_ltlibobjs=
+ if test -n "$_LT_LIBOBJS"; then
+ # Remove the extension.
+ _lt_sed_drop_objext='s/\.o$//;s/\.obj$//'
+ for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | $SED "$_lt_sed_drop_objext" | sort -u`; do
+ _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext"
+ _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo"
+ done
+ fi
+ AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs])
+ AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs])
+])
+
+# Only expand once:
+m4_define([LTDL_INIT])
+])
+m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AC_DEFUN([AC_LIB_LTDL], [m4_warn([obsolete], [The macro `AC_LIB_LTDL' is obsolete.
+You should run autoupdate.])dnl
+LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AC_DEFUN([AC_WITH_LTDL], [m4_warn([obsolete], [The macro `AC_WITH_LTDL' is obsolete.
+You should run autoupdate.])dnl
+LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:355: -1- AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:355: -1- AC_DEFUN([LT_WITH_LTDL], [m4_warn([obsolete], [The macro `LT_WITH_LTDL' is obsolete.
+You should run autoupdate.])dnl
+LTDL_INIT($@)])
+m4trace:/usr/share/aclocal/ltdl.m4:368: -1- AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_SYS_MODULE_EXT])dnl
+AC_REQUIRE([LT_SYS_MODULE_PATH])dnl
+AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl
+AC_REQUIRE([LT_LIB_DLLOAD])dnl
+AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl
+AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl
+AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl
+AC_REQUIRE([LT_FUNC_ARGZ])dnl
+
+m4_require([_LT_CHECK_OBJDIR])dnl
+m4_require([_LT_HEADER_DLFCN])dnl
+m4_require([_LT_CHECK_DLPREOPEN])dnl
+m4_require([_LT_DECL_SED])dnl
+
+dnl Don't require this, or it will be expanded earlier than the code
+dnl that sets the variables it relies on:
+_LT_ENABLE_INSTALL
+
+dnl _LTDL_MODE specific code must be called at least once:
+_LTDL_MODE_DISPATCH
+
+# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS
+# the user used. This is so that ltdl.h can pick up the parent projects
+# config.h file, The first file in AC_CONFIG_HEADERS must contain the
+# definitions required by ltdl.c.
+# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility).
+AC_CONFIG_COMMANDS_PRE([dnl
+m4_pattern_allow([^LT_CONFIG_H$])dnl
+m4_ifset([AH_HEADER],
+ [LT_CONFIG_H=AH_HEADER],
+ [m4_ifset([AC_LIST_HEADERS],
+ [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's|^[[ ]]*||;s|[[ :]].*$||'`],
+ [])])])
+AC_SUBST([LT_CONFIG_H])
+
+AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h],
+ [], [], [AC_INCLUDES_DEFAULT])
+
+AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])])
+AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])])
+
+m4_pattern_allow([LT_LIBEXT])dnl
+AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension])
+
+name=
+eval "lt_libprefix=\"$libname_spec\""
+m4_pattern_allow([LT_LIBPREFIX])dnl
+AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix])
+
+name=ltdl
+eval "LTDLOPEN=\"$libname_spec\""
+AC_SUBST([LTDLOPEN])
+])
+m4trace:/usr/share/aclocal/ltdl.m4:444: -1- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_CACHE_CHECK([whether deplibs are loaded by dlopen],
+ [lt_cv_sys_dlopen_deplibs],
+ [# PORTME does your system automatically load deplibs for dlopen?
+ # or its logical equivalent (e.g. shl_load for HP-UX < 11)
+ # For now, we just catch OSes we know something about -- in the
+ # future, we'll try test this programmatically.
+ lt_cv_sys_dlopen_deplibs=unknown
+ case $host_os in
+ aix3*|aix4.1.*|aix4.2.*)
+ # Unknown whether this is true for these versions of AIX, but
+ # we want this 'case' here to explicitly catch those versions.
+ lt_cv_sys_dlopen_deplibs=unknown
+ ;;
+ aix[[4-9]]*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ lt_cv_sys_dlopen_deplibs=no
+ ;;
+ esac
+ ;;
+ bitrig*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ darwin*)
+ # Assuming the user has installed a libdl from somewhere, this is true
+ # If you are looking for one http://www.opendarwin.org/projects/dlcompat
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ # GNU and its variants, using gnu ld.so (Glibc)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ hpux10*|hpux11*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ interix*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ irix[[12345]]*|irix6.[[01]]*)
+ # Catch all versions of IRIX before 6.2, and indicate that we don't
+ # know how it worked for any of those versions.
+ lt_cv_sys_dlopen_deplibs=unknown
+ ;;
+ irix*)
+ # The case above catches anything before 6.2, and it's known that
+ # at 6.2 and later dlopen does load deplibs.
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ netbsd*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ openbsd*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ osf[[1234]]*)
+ # dlopen did load deplibs (at least at 4.x), but until the 5.x series,
+ # it did *not* use an RPATH in a shared library to find objects the
+ # library depends on, so we explicitly say 'no'.
+ lt_cv_sys_dlopen_deplibs=no
+ ;;
+ osf5.0|osf5.0a|osf5.1)
+ # dlopen *does* load deplibs and with the right loader patch applied
+ # it even uses RPATH in a shared library to search for shared objects
+ # that the library depends on, but there's no easy way to know if that
+ # patch is installed. Since this is the case, all we can really
+ # say is unknown -- it depends on the patch being installed. If
+ # it is, this changes to 'yes'. Without it, it would be 'no'.
+ lt_cv_sys_dlopen_deplibs=unknown
+ ;;
+ osf*)
+ # the two cases above should catch all versions of osf <= 5.1. Read
+ # the comments above for what we know about them.
+ # At > 5.1, deplibs are loaded *and* any RPATH in a shared library
+ # is used to find them so we can finally say 'yes'.
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ qnx*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ solaris*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ libltdl_cv_sys_dlopen_deplibs=yes
+ ;;
+ esac
+ ])
+if test yes != "$lt_cv_sys_dlopen_deplibs"; then
+ AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1],
+ [Define if the OS needs help to load dependent libraries for dlopen().])
+fi
+])
+m4trace:/usr/share/aclocal/ltdl.m4:546: -1- AU_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:546: -1- AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_warn([obsolete], [The macro `AC_LTDL_SYS_DLOPEN_DEPLIBS' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:553: -1- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([what extension is used for runtime loadable modules],
+ [libltdl_cv_shlibext],
+[
+module=yes
+eval libltdl_cv_shlibext=$shrext_cmds
+module=no
+eval libltdl_cv_shrext=$shrext_cmds
+ ])
+if test -n "$libltdl_cv_shlibext"; then
+ m4_pattern_allow([LT_MODULE_EXT])dnl
+ AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"],
+ [Define to the extension used for runtime loadable modules, say, ".so".])
+fi
+if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then
+ m4_pattern_allow([LT_SHARED_EXT])dnl
+ AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"],
+ [Define to the shared library suffix, say, ".dylib".])
+fi
+if test -n "$shared_archive_member_spec"; then
+ m4_pattern_allow([LT_SHARED_LIB_MEMBER])dnl
+ AC_DEFINE_UNQUOTED([LT_SHARED_LIB_MEMBER], ["($shared_archive_member_spec.o)"],
+ [Define to the shared archive member specification, say "(shr.o)".])
+fi
+])
+m4trace:/usr/share/aclocal/ltdl.m4:581: -1- AU_DEFUN([AC_LTDL_SHLIBEXT], [m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:581: -1- AC_DEFUN([AC_LTDL_SHLIBEXT], [m4_warn([obsolete], [The macro `AC_LTDL_SHLIBEXT' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:588: -1- AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([what variable specifies run-time module search path],
+ [lt_cv_module_path_var], [lt_cv_module_path_var=$shlibpath_var])
+if test -n "$lt_cv_module_path_var"; then
+ m4_pattern_allow([LT_MODULE_PATH_VAR])dnl
+ AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"],
+ [Define to the name of the environment variable that determines the run-time module search path.])
+fi
+])
+m4trace:/usr/share/aclocal/ltdl.m4:600: -1- AU_DEFUN([AC_LTDL_SHLIBPATH], [m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:600: -1- AC_DEFUN([AC_LTDL_SHLIBPATH], [m4_warn([obsolete], [The macro `AC_LTDL_SHLIBPATH' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:607: -1- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([for the default library search path],
+ [lt_cv_sys_dlsearch_path],
+ [lt_cv_sys_dlsearch_path=$sys_lib_dlsearch_path_spec])
+if test -n "$lt_cv_sys_dlsearch_path"; then
+ sys_dlsearch_path=
+ for dir in $lt_cv_sys_dlsearch_path; do
+ if test -z "$sys_dlsearch_path"; then
+ sys_dlsearch_path=$dir
+ else
+ sys_dlsearch_path=$sys_dlsearch_path$PATH_SEPARATOR$dir
+ fi
+ done
+ m4_pattern_allow([LT_DLSEARCH_PATH])dnl
+ AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"],
+ [Define to the system default library search path.])
+fi
+])
+m4trace:/usr/share/aclocal/ltdl.m4:628: -1- AU_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:628: -1- AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_warn([obsolete], [The macro `AC_LTDL_SYSSEARCHPATH' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:654: -1- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$])
+LT_DLLOADERS=
+AC_SUBST([LT_DLLOADERS])
+
+AC_LANG_PUSH([C])
+lt_dlload_save_LIBS=$LIBS
+
+LIBADD_DLOPEN=
+AC_SEARCH_LIBS([dlopen], [dl],
+ [AC_DEFINE([HAVE_LIBDL], [1],
+ [Define if you have the libdl library or equivalent.])
+ if test "$ac_cv_search_dlopen" != "none required"; then
+ LIBADD_DLOPEN=-ldl
+ fi
+ libltdl_cv_lib_dl_dlopen=yes
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H
+# include <dlfcn.h>
+#endif
+ ]], [[dlopen(0, 0);]])],
+ [AC_DEFINE([HAVE_LIBDL], [1],
+ [Define if you have the libdl library or equivalent.])
+ libltdl_cv_func_dlopen=yes
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [AC_DEFINE([HAVE_LIBDL], [1],
+ [Define if you have the libdl library or equivalent.])
+ LIBADD_DLOPEN=-lsvld libltdl_cv_func_dlopen=yes
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])])
+if test yes = "$libltdl_cv_func_dlopen" || test yes = "$libltdl_cv_lib_dl_dlopen"
+then
+ lt_save_LIBS=$LIBS
+ LIBS="$LIBS $LIBADD_DLOPEN"
+ AC_CHECK_FUNCS([dlerror])
+ LIBS=$lt_save_LIBS
+fi
+AC_SUBST([LIBADD_DLOPEN])
+
+LIBADD_SHL_LOAD=
+AC_CHECK_FUNC([shl_load],
+ [AC_DEFINE([HAVE_SHL_LOAD], [1],
+ [Define if you have the shl_load function.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [AC_DEFINE([HAVE_SHL_LOAD], [1],
+ [Define if you have the shl_load function.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"
+ LIBADD_SHL_LOAD=-ldld])])
+AC_SUBST([LIBADD_SHL_LOAD])
+
+case $host_os in
+darwin[[1567]].*)
+# We only want this for pre-Mac OS X 10.4.
+ AC_CHECK_FUNC([_dyld_func_lookup],
+ [AC_DEFINE([HAVE_DYLD], [1],
+ [Define if you have the _dyld_func_lookup function.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"])
+ ;;
+beos*)
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la"
+ ;;
+cygwin* | mingw* | pw32*)
+ AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include <sys/cygwin.h>]])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la"
+ ;;
+esac
+
+AC_CHECK_LIB([dld], [dld_link],
+ [AC_DEFINE([HAVE_DLD], [1],
+ [Define if you have the GNU dld library.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"])
+AC_SUBST([LIBADD_DLD_LINK])
+
+m4_pattern_allow([^LT_DLPREOPEN$])
+LT_DLPREOPEN=
+if test -n "$LT_DLLOADERS"
+then
+ for lt_loader in $LT_DLLOADERS; do
+ LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader "
+ done
+ AC_DEFINE([HAVE_LIBDLLOADER], [1],
+ [Define if libdlloader will be built on this platform])
+fi
+AC_SUBST([LT_DLPREOPEN])
+
+dnl This isn't used anymore, but set it for backwards compatibility
+LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD"
+AC_SUBST([LIBADD_DL])
+
+LIBS=$lt_dlload_save_LIBS
+AC_LANG_POP
+])
+m4trace:/usr/share/aclocal/ltdl.m4:749: -1- AU_DEFUN([AC_LTDL_DLLIB], [m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:749: -1- AC_DEFUN([AC_LTDL_DLLIB], [m4_warn([obsolete], [The macro `AC_LTDL_DLLIB' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:757: -1- AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+AC_CACHE_CHECK([for _ prefix in compiled symbols],
+ [lt_cv_sys_symbol_underscore],
+ [lt_cv_sys_symbol_underscore=no
+ cat > conftest.$ac_ext <<_LT_EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+_LT_EOF
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+ # See whether the symbols have a leading underscore.
+ if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+ lt_cv_sys_symbol_underscore=yes
+ else
+ if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+ :
+ else
+ echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ fi
+ else
+ echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat conftest.c >&AS_MESSAGE_LOG_FD
+ fi
+ rm -rf conftest*
+ ])
+ sys_symbol_underscore=$lt_cv_sys_symbol_underscore
+ AC_SUBST([sys_symbol_underscore])
+])
+m4trace:/usr/share/aclocal/ltdl.m4:794: -1- AU_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:794: -1- AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_warn([obsolete], [The macro `AC_LTDL_SYMBOL_USCORE' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])])
+m4trace:/usr/share/aclocal/ltdl.m4:801: -1- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([_LT_COMPILER_PIC])dnl for lt_prog_compiler_wl
+AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl for lt_cv_sys_symbol_underscore
+AC_REQUIRE([LT_SYS_MODULE_EXT])dnl for libltdl_cv_shlibext
+if test yes = "$lt_cv_sys_symbol_underscore"; then
+ if test yes = "$libltdl_cv_func_dlopen" || test yes = "$libltdl_cv_lib_dl_dlopen"; then
+ AC_CACHE_CHECK([whether we have to add an underscore for dlsym],
+ [libltdl_cv_need_uscore],
+ [libltdl_cv_need_uscore=unknown
+ dlsym_uscore_save_LIBS=$LIBS
+ LIBS="$LIBS $LIBADD_DLOPEN"
+ libname=conftmod # stay within 8.3 filename limits!
+ cat >$libname.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+int fnord () { return 42; }]
+_LT_EOF
+
+ # ltfn_module_cmds module_cmds
+ # Execute tilde-delimited MODULE_CMDS with environment primed for
+ # $module_cmds or $archive_cmds type content.
+ ltfn_module_cmds ()
+ {( # subshell avoids polluting parent global environment
+ module_cmds_save_ifs=$IFS; IFS='~'
+ for cmd in @S|@1; do
+ IFS=$module_cmds_save_ifs
+ libobjs=$libname.$ac_objext; lib=$libname$libltdl_cv_shlibext
+ rpath=/not-exists; soname=$libname$libltdl_cv_shlibext; output_objdir=.
+ major=; versuffix=; verstring=; deplibs=
+ ECHO=echo; wl=$lt_prog_compiler_wl; allow_undefined_flag=
+ eval $cmd
+ done
+ IFS=$module_cmds_save_ifs
+ )}
+
+ # Compile a loadable module using libtool macro expansion results.
+ $CC $pic_flag -c $libname.$ac_ext
+ ltfn_module_cmds "${module_cmds:-$archive_cmds}"
+
+ # Try to fetch fnord with dlsym().
+ libltdl_dlunknown=0; libltdl_dlnouscore=1; libltdl_dluscore=2
+ cat >conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+#include <stdio.h>
+#ifndef RTLD_GLOBAL
+# ifdef DL_GLOBAL
+# define RTLD_GLOBAL DL_GLOBAL
+# else
+# define RTLD_GLOBAL 0
+# endif
+#endif
+#ifndef RTLD_NOW
+# ifdef DL_NOW
+# define RTLD_NOW DL_NOW
+# else
+# define RTLD_NOW 0
+# endif
+#endif
+int main () {
+ void *handle = dlopen ("`pwd`/$libname$libltdl_cv_shlibext", RTLD_GLOBAL|RTLD_NOW);
+ int status = $libltdl_dlunknown;
+ if (handle) {
+ if (dlsym (handle, "fnord"))
+ status = $libltdl_dlnouscore;
+ else {
+ if (dlsym (handle, "_fnord"))
+ status = $libltdl_dluscore;
+ else
+ puts (dlerror ());
+ }
+ dlclose (handle);
+ } else
+ puts (dlerror ());
+ return status;
+}]
+_LT_EOF
+ if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+ libltdl_status=$?
+ case x$libltdl_status in
+ x$libltdl_dlnouscore) libltdl_cv_need_uscore=no ;;
+ x$libltdl_dluscore) libltdl_cv_need_uscore=yes ;;
+ x*) libltdl_cv_need_uscore=unknown ;;
+ esac
+ fi
+ rm -rf conftest* $libname*
+ LIBS=$dlsym_uscore_save_LIBS
+ ])
+ fi
+fi
+
+if test yes = "$libltdl_cv_need_uscore"; then
+ AC_DEFINE([NEED_USCORE], [1],
+ [Define if dlsym() requires a leading underscore in symbol names.])
+fi
+])
+m4trace:/usr/share/aclocal/ltdl.m4:908: -1- AU_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])], [], [])
+m4trace:/usr/share/aclocal/ltdl.m4:908: -1- AC_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_warn([obsolete], [The macro `AC_LTDL_DLSYM_USCORE' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])])
+m4trace:/usr/share/aclocal-1.16/amversion.m4:14: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.16.5], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+m4trace:/usr/share/aclocal-1.16/amversion.m4:33: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.5])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+m4trace:/usr/share/aclocal-1.16/as.m4:11: -1- AC_DEFUN([AM_PROG_AS], [# By default we simply use the C compiler to build assembly code.
+AC_REQUIRE([AC_PROG_CC])
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)])
+AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)])
+_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
+])
+m4trace:/usr/share/aclocal-1.16/auxdir.m4:47: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+m4trace:/usr/share/aclocal-1.16/cond.m4:12: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+m4trace:/usr/share/aclocal-1.16/depend.m4:26: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+m4trace:/usr/share/aclocal-1.16/depend.m4:163: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+m4trace:/usr/share/aclocal-1.16/depend.m4:171: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+m4trace:/usr/share/aclocal-1.16/depout.m4:11: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])
+m4trace:/usr/share/aclocal-1.16/depout.m4:64: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+m4trace:/usr/share/aclocal-1.16/init.m4:29: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl
+m4_ifdef([_$0_ALREADY_INIT],
+ [m4_fatal([$0 expanded multiple times
+]m4_defn([_$0_ALREADY_INIT]))],
+ [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+AC_SUBST([CTAGS])
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+AC_SUBST([ETAGS])
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+AC_SUBST([CSCOPE])
+
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+m4trace:/usr/share/aclocal-1.16/init.m4:204: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+m4trace:/usr/share/aclocal-1.16/install-sh.m4:11: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+m4trace:/usr/share/aclocal-1.16/lead-dot.m4:10: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+m4trace:/usr/share/aclocal-1.16/maintainer.m4:16: -1- AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]),
+ [enable], [m4_define([am_maintainer_other], [disable])],
+ [disable], [m4_define([am_maintainer_other], [enable])],
+ [m4_define([am_maintainer_other], [enable])
+ m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+ AC_ARG_ENABLE([maintainer-mode],
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST([MAINT])dnl
+
+])
+m4trace:/usr/share/aclocal-1.16/make.m4:13: -1- AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+m4trace:/usr/share/aclocal-1.16/make.m4:42: -1- m4_pattern_allow([^am__quote$])
+m4trace:/usr/share/aclocal-1.16/missing.m4:11: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+m4trace:/usr/share/aclocal-1.16/missing.m4:20: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+m4trace:/usr/share/aclocal-1.16/options.m4:11: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+m4trace:/usr/share/aclocal-1.16/options.m4:17: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+m4trace:/usr/share/aclocal-1.16/options.m4:23: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+m4trace:/usr/share/aclocal-1.16/options.m4:29: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+m4trace:/usr/share/aclocal-1.16/prog-cc-c-o.m4:12: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+m4trace:/usr/share/aclocal-1.16/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+m4trace:/usr/share/aclocal-1.16/runlog.m4:12: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+m4trace:/usr/share/aclocal-1.16/sanity.m4:11: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+m4trace:/usr/share/aclocal-1.16/silent.m4:12: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+m4trace:/usr/share/aclocal-1.16/strip.m4:17: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+m4trace:/usr/share/aclocal-1.16/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE])
+m4trace:/usr/share/aclocal-1.16/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+m4trace:/usr/share/aclocal-1.16/tar.m4:23: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+])
+m4trace:m4/gc_set_version.m4:16: -1- AC_DEFUN([GC_SET_VERSION], [
+ AC_MSG_CHECKING(GC version numbers)
+ GC_VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\([[0-9]][[0-9]]*\)[[.]].*$/\1/g'`
+ GC_VERSION_MINOR=`echo $PACKAGE_VERSION | sed 's/^[[^.]]*[[.]]\([[0-9]][[0-9]]*\).*$/\1/g'`
+ GC_VERSION_MICRO=`echo $PACKAGE_VERSION | sed 's/^[[^.]]*[[.]][[^.]]*[[.]]\([[0-9]][[0-9]]*\)$/\1/g'`
+
+ if test :$GC_VERSION_MAJOR: = :: \
+ -o :$GC_VERSION_MINOR: = :: \
+ -o :$GC_VERSION_MICRO: = :: ;
+ then
+ AC_MSG_RESULT(invalid)
+ AC_MSG_ERROR([nonconforming PACKAGE_VERSION='$PACKAGE_VERSION'])
+ fi
+
+ AC_DEFINE_UNQUOTED([GC_VERSION_MAJOR], $GC_VERSION_MAJOR,
+ [The major version number of this GC release.])
+ AC_DEFINE_UNQUOTED([GC_VERSION_MINOR], $GC_VERSION_MINOR,
+ [The minor version number of this GC release.])
+ AC_DEFINE_UNQUOTED([GC_VERSION_MICRO], $GC_VERSION_MICRO,
+ [The micro version number of this GC release.])
+ AC_MSG_RESULT(major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO)
+])
+m4trace:m4/libtool.m4:62: -1- AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])
+m4trace:m4/libtool.m4:100: -1- AU_DEFUN([AC_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])], [], [])
+m4trace:m4/libtool.m4:100: -1- AC_DEFUN([AC_PROG_LIBTOOL], [m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_INIT], [LT_INIT($@)])])
+m4trace:m4/libtool.m4:101: -1- AU_DEFUN([AM_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])], [], [])
+m4trace:m4/libtool.m4:101: -1- AC_DEFUN([AM_PROG_LIBTOOL], [m4_warn([obsolete], [The macro `AM_PROG_LIBTOOL' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_INIT], [LT_INIT($@)])])
+m4trace:m4/libtool.m4:621: -1- AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+ echo
+ AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $[#]
+do
+ case $[1] in
+ --version | --v* | -V )
+ echo "$lt_cl_version"; exit 0 ;;
+ --help | --h* | -h )
+ echo "$lt_cl_help"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --quiet | --q* | --silent | --s* | -q )
+ lt_cl_silent=: ;;
+
+ -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try '$[0] --help' for more information.]) ;;
+
+ *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try '$[0] --help' for more information.]) ;;
+ esac
+ shift
+done
+
+if $lt_cl_silent; then
+ exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure. Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+ lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])
+m4trace:m4/libtool.m4:814: -1- AC_DEFUN([LT_SUPPORTED_TAG], [])
+m4trace:m4/libtool.m4:825: -1- AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+ [C], [_LT_LANG(C)],
+ [C++], [_LT_LANG(CXX)],
+ [Go], [_LT_LANG(GO)],
+ [Java], [_LT_LANG(GCJ)],
+ [Fortran 77], [_LT_LANG(F77)],
+ [Fortran], [_LT_LANG(FC)],
+ [Windows Resource], [_LT_LANG(RC)],
+ [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+ [_LT_LANG($1)],
+ [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])
+m4trace:m4/libtool.m4:917: -1- AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+m4trace:m4/libtool.m4:917: -1- AC_DEFUN([AC_LIBTOOL_CXX], [m4_warn([obsolete], [The macro `AC_LIBTOOL_CXX' is obsolete.
+You should run autoupdate.])dnl
+LT_LANG(C++)])
+m4trace:m4/libtool.m4:918: -1- AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+m4trace:m4/libtool.m4:918: -1- AC_DEFUN([AC_LIBTOOL_F77], [m4_warn([obsolete], [The macro `AC_LIBTOOL_F77' is obsolete.
+You should run autoupdate.])dnl
+LT_LANG(Fortran 77)])
+m4trace:m4/libtool.m4:919: -1- AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+m4trace:m4/libtool.m4:919: -1- AC_DEFUN([AC_LIBTOOL_FC], [m4_warn([obsolete], [The macro `AC_LIBTOOL_FC' is obsolete.
+You should run autoupdate.])dnl
+LT_LANG(Fortran)])
+m4trace:m4/libtool.m4:920: -1- AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+m4trace:m4/libtool.m4:920: -1- AC_DEFUN([AC_LIBTOOL_GCJ], [m4_warn([obsolete], [The macro `AC_LIBTOOL_GCJ' is obsolete.
+You should run autoupdate.])dnl
+LT_LANG(Java)])
+m4trace:m4/libtool.m4:921: -1- AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+m4trace:m4/libtool.m4:921: -1- AC_DEFUN([AC_LIBTOOL_RC], [m4_warn([obsolete], [The macro `AC_LIBTOOL_RC' is obsolete.
+You should run autoupdate.])dnl
+LT_LANG(Windows Resource)])
+m4trace:m4/libtool.m4:1244: -1- AC_DEFUN([_LT_WITH_SYSROOT], [m4_require([_LT_DECL_SED])dnl
+AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+ [Search for dependent libraries within DIR (or the compiler's sysroot
+ if not specified).])],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted. We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ AC_MSG_RESULT([$with_sysroot])
+ AC_MSG_ERROR([The sysroot must be an absolute path.])
+ ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and where our libraries should be installed.])])
+m4trace:m4/libtool.m4:1589: -1- AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ fi
+ $RM conftest*
+])
+
+if test yes = "[$]$2"; then
+ m4_if([$5], , :, [$5])
+else
+ m4_if([$6], , :, [$6])
+fi
+])
+m4trace:m4/libtool.m4:1631: -1- AU_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])], [], [])
+m4trace:m4/libtool.m4:1631: -1- AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_warn([obsolete], [The macro `AC_LIBTOOL_COMPILER_OPTION' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])])
+m4trace:m4/libtool.m4:1640: -1- AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $3"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&AS_MESSAGE_LOG_FD
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ else
+ $2=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+])
+
+if test yes = "[$]$2"; then
+ m4_if([$4], , :, [$4])
+else
+ m4_if([$5], , :, [$5])
+fi
+])
+m4trace:m4/libtool.m4:1675: -1- AU_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])], [], [])
+m4trace:m4/libtool.m4:1675: -1- AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_warn([obsolete], [The macro `AC_LIBTOOL_LINKER_OPTION' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])])
+m4trace:m4/libtool.m4:1682: -1- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[ ]]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+])
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+ AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+ [What is the maximum length of a command?])
+])
+m4trace:m4/libtool.m4:1821: -1- AU_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])], [], [])
+m4trace:m4/libtool.m4:1821: -1- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_warn([obsolete], [The macro `AC_LIBTOOL_SYS_MAX_CMD_LEN' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])])
+m4trace:m4/libtool.m4:1932: -1- AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl
+if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ])
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen=shl_load],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen=dlopen],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+ [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+ [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+ [Whether dlopen of statically linked programs is supported])
+])
+m4trace:m4/libtool.m4:2057: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])], [], [])
+m4trace:m4/libtool.m4:2057: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_warn([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])])
+m4trace:m4/libtool.m4:3178: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] | ?:[\\/]*])
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word. This closes a longstanding sh security hole.
+ ac_dummy="m4_if([$2], , $PATH, [$2])"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$1"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac])
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ AC_MSG_RESULT($MAGIC_CMD)
+else
+ AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+ [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])
+m4trace:m4/libtool.m4:3240: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])], [], [])
+m4trace:m4/libtool.m4:3240: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [m4_warn([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])])
+m4trace:m4/libtool.m4:3263: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+ [AS_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+ [test no = "$withval" || with_gnu_ld=yes],
+ [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi])
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])
+m4trace:m4/libtool.m4:3352: -1- AU_DEFUN([AM_PROG_LD], [m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])], [], [])
+m4trace:m4/libtool.m4:3352: -1- AC_DEFUN([AM_PROG_LD], [m4_warn([obsolete], [The macro `AM_PROG_LD' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])])
+m4trace:m4/libtool.m4:3353: -1- AU_DEFUN([AC_PROG_LD], [m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])], [], [])
+m4trace:m4/libtool.m4:3353: -1- AC_DEFUN([AC_PROG_LD], [m4_warn([obsolete], [The macro `AC_PROG_LD' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])])
+m4trace:m4/libtool.m4:3682: -1- AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi])
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+ AC_SUBST([DUMPBIN])
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+ [lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+ cat conftest.out >&AS_MESSAGE_LOG_FD
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*])
+])
+m4trace:m4/libtool.m4:3777: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])], [], [])
+m4trace:m4/libtool.m4:3777: -1- AC_DEFUN([AM_PROG_NM], [m4_warn([obsolete], [The macro `AM_PROG_NM' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])])
+m4trace:m4/libtool.m4:3778: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])], [], [])
+m4trace:m4/libtool.m4:3778: -1- AC_DEFUN([AC_PROG_NM], [m4_warn([obsolete], [The macro `AC_PROG_NM' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])])
+m4trace:m4/libtool.m4:3849: -1- AC_DEFUN([_LT_DLL_DEF_P], [dnl
+ test DEF = "`$SED -n dnl
+ -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace
+ -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments
+ -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl
+ -e q dnl Only consider the first "real" line
+ $1`" dnl
+])
+m4trace:m4/libtool.m4:3863: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
+ AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, cos, LIBM=-lm)
+ ;;
+esac
+AC_SUBST([LIBM])
+])
+m4trace:m4/libtool.m4:3882: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])], [], [])
+m4trace:m4/libtool.m4:3882: -1- AC_DEFUN([AC_CHECK_LIBM], [m4_warn([obsolete], [The macro `AC_CHECK_LIBM' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])])
+m4trace:m4/libtool.m4:8148: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+ [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+ [AC_CHECK_TOOL(GCJ, gcj,)
+ test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)])])[]dnl
+])
+m4trace:m4/libtool.m4:8157: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])], [], [])
+m4trace:m4/libtool.m4:8157: -1- AC_DEFUN([LT_AC_PROG_GCJ], [m4_warn([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])])
+m4trace:m4/libtool.m4:8164: -1- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,)
+])
+m4trace:m4/libtool.m4:8171: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,)
+])
+m4trace:m4/libtool.m4:8176: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])], [], [])
+m4trace:m4/libtool.m4:8176: -1- AC_DEFUN([LT_AC_PROG_RC], [m4_warn([obsolete], [The macro `LT_AC_PROG_RC' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])])
+m4trace:m4/libtool.m4:8304: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])], [], [])
+m4trace:m4/libtool.m4:8304: -1- AC_DEFUN([LT_AC_PROG_SED], [m4_warn([obsolete], [The macro `LT_AC_PROG_SED' is obsolete.
+You should run autoupdate.])dnl
+m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])])
+m4trace:m4/ltoptions.m4:14: -1- AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+m4trace:m4/ltoptions.m4:113: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'dlopen' option into LT_INIT's first parameter.])
+])
+m4trace:m4/ltoptions.m4:113: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN], [m4_warn([obsolete], [The macro `AC_LIBTOOL_DLOPEN' is obsolete.
+You should run autoupdate.])dnl
+_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'dlopen' option into LT_INIT's first parameter.])
+])
+m4trace:m4/ltoptions.m4:148: -1- AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'win32-dll' option into LT_INIT's first parameter.])
+])
+m4trace:m4/ltoptions.m4:148: -1- AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [m4_warn([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete.
+You should run autoupdate.])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'win32-dll' option into LT_INIT's first parameter.])
+])
+m4trace:m4/ltoptions.m4:197: -1- AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+m4trace:m4/ltoptions.m4:201: -1- AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+m4trace:m4/ltoptions.m4:205: -1- AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+m4trace:m4/ltoptions.m4:205: -1- AC_DEFUN([AM_ENABLE_SHARED], [m4_warn([obsolete], [The macro `AM_ENABLE_SHARED' is obsolete.
+You should run autoupdate.])dnl
+AC_ENABLE_SHARED($@)])
+m4trace:m4/ltoptions.m4:206: -1- AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+m4trace:m4/ltoptions.m4:206: -1- AC_DEFUN([AM_DISABLE_SHARED], [m4_warn([obsolete], [The macro `AM_DISABLE_SHARED' is obsolete.
+You should run autoupdate.])dnl
+AC_DISABLE_SHARED($@)])
+m4trace:m4/ltoptions.m4:251: -1- AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+m4trace:m4/ltoptions.m4:255: -1- AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+m4trace:m4/ltoptions.m4:259: -1- AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+m4trace:m4/ltoptions.m4:259: -1- AC_DEFUN([AM_ENABLE_STATIC], [m4_warn([obsolete], [The macro `AM_ENABLE_STATIC' is obsolete.
+You should run autoupdate.])dnl
+AC_ENABLE_STATIC($@)])
+m4trace:m4/ltoptions.m4:260: -1- AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+m4trace:m4/ltoptions.m4:260: -1- AC_DEFUN([AM_DISABLE_STATIC], [m4_warn([obsolete], [The macro `AM_DISABLE_STATIC' is obsolete.
+You should run autoupdate.])dnl
+AC_DISABLE_STATIC($@)])
+m4trace:m4/ltoptions.m4:305: -1- AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'fast-install' option into LT_INIT's first parameter.])
+])
+m4trace:m4/ltoptions.m4:305: -1- AC_DEFUN([AC_ENABLE_FAST_INSTALL], [m4_warn([obsolete], [The macro `AC_ENABLE_FAST_INSTALL' is obsolete.
+You should run autoupdate.])dnl
+_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'fast-install' option into LT_INIT's first parameter.])
+])
+m4trace:m4/ltoptions.m4:312: -1- AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'disable-fast-install' option into LT_INIT's first parameter.])
+])
+m4trace:m4/ltoptions.m4:312: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL], [m4_warn([obsolete], [The macro `AC_DISABLE_FAST_INSTALL' is obsolete.
+You should run autoupdate.])dnl
+_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'disable-fast-install' option into LT_INIT's first parameter.])
+])
+m4trace:m4/ltoptions.m4:411: -1- AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'pic-only' option into LT_INIT's first parameter.])
+])
+m4trace:m4/ltoptions.m4:411: -1- AC_DEFUN([AC_LIBTOOL_PICMODE], [m4_warn([obsolete], [The macro `AC_LIBTOOL_PICMODE' is obsolete.
+You should run autoupdate.])dnl
+_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'pic-only' option into LT_INIT's first parameter.])
+])
+m4trace:m4/ltsugar.m4:14: -1- AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+m4trace:m4/ltversion.m4:19: -1- AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.7'
+macro_revision='2.4.7'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
+m4trace:m4/lt~obsolete.m4:37: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+m4trace:m4/lt~obsolete.m4:41: -1- AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])
+m4trace:m4/lt~obsolete.m4:42: -1- AC_DEFUN([_LT_AC_SHELL_INIT])
+m4trace:m4/lt~obsolete.m4:43: -1- AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])
+m4trace:m4/lt~obsolete.m4:45: -1- AC_DEFUN([_LT_AC_TAGVAR])
+m4trace:m4/lt~obsolete.m4:46: -1- AC_DEFUN([AC_LTDL_ENABLE_INSTALL])
+m4trace:m4/lt~obsolete.m4:47: -1- AC_DEFUN([AC_LTDL_PREOPEN])
+m4trace:m4/lt~obsolete.m4:48: -1- AC_DEFUN([_LT_AC_SYS_COMPILER])
+m4trace:m4/lt~obsolete.m4:49: -1- AC_DEFUN([_LT_AC_LOCK])
+m4trace:m4/lt~obsolete.m4:50: -1- AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])
+m4trace:m4/lt~obsolete.m4:51: -1- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])
+m4trace:m4/lt~obsolete.m4:52: -1- AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])
+m4trace:m4/lt~obsolete.m4:53: -1- AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])
+m4trace:m4/lt~obsolete.m4:54: -1- AC_DEFUN([AC_LIBTOOL_OBJDIR])
+m4trace:m4/lt~obsolete.m4:55: -1- AC_DEFUN([AC_LTDL_OBJDIR])
+m4trace:m4/lt~obsolete.m4:56: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])
+m4trace:m4/lt~obsolete.m4:57: -1- AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])
+m4trace:m4/lt~obsolete.m4:58: -1- AC_DEFUN([AC_PATH_MAGIC])
+m4trace:m4/lt~obsolete.m4:59: -1- AC_DEFUN([AC_PROG_LD_GNU])
+m4trace:m4/lt~obsolete.m4:60: -1- AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])
+m4trace:m4/lt~obsolete.m4:61: -1- AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])
+m4trace:m4/lt~obsolete.m4:62: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])
+m4trace:m4/lt~obsolete.m4:63: -1- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])
+m4trace:m4/lt~obsolete.m4:64: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])
+m4trace:m4/lt~obsolete.m4:65: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])
+m4trace:m4/lt~obsolete.m4:66: -1- AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])
+m4trace:m4/lt~obsolete.m4:67: -1- AC_DEFUN([LT_AC_PROG_EGREP])
+m4trace:m4/lt~obsolete.m4:72: -1- AC_DEFUN([_AC_PROG_LIBTOOL])
+m4trace:m4/lt~obsolete.m4:73: -1- AC_DEFUN([AC_LIBTOOL_SETUP])
+m4trace:m4/lt~obsolete.m4:74: -1- AC_DEFUN([_LT_AC_CHECK_DLFCN])
+m4trace:m4/lt~obsolete.m4:75: -1- AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])
+m4trace:m4/lt~obsolete.m4:76: -1- AC_DEFUN([_LT_AC_TAGCONFIG])
+m4trace:m4/lt~obsolete.m4:78: -1- AC_DEFUN([_LT_AC_LANG_CXX])
+m4trace:m4/lt~obsolete.m4:79: -1- AC_DEFUN([_LT_AC_LANG_F77])
+m4trace:m4/lt~obsolete.m4:80: -1- AC_DEFUN([_LT_AC_LANG_GCJ])
+m4trace:m4/lt~obsolete.m4:81: -1- AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])
+m4trace:m4/lt~obsolete.m4:82: -1- AC_DEFUN([_LT_AC_LANG_C_CONFIG])
+m4trace:m4/lt~obsolete.m4:83: -1- AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])
+m4trace:m4/lt~obsolete.m4:84: -1- AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])
+m4trace:m4/lt~obsolete.m4:85: -1- AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])
+m4trace:m4/lt~obsolete.m4:86: -1- AC_DEFUN([_LT_AC_LANG_F77_CONFIG])
+m4trace:m4/lt~obsolete.m4:87: -1- AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])
+m4trace:m4/lt~obsolete.m4:88: -1- AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])
+m4trace:m4/lt~obsolete.m4:89: -1- AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])
+m4trace:m4/lt~obsolete.m4:90: -1- AC_DEFUN([_LT_AC_LANG_RC_CONFIG])
+m4trace:m4/lt~obsolete.m4:91: -1- AC_DEFUN([AC_LIBTOOL_CONFIG])
+m4trace:m4/lt~obsolete.m4:92: -1- AC_DEFUN([_LT_AC_FILE_LTDLL_C])
+m4trace:m4/lt~obsolete.m4:94: -1- AC_DEFUN([_LT_AC_PROG_CXXCPP])
+m4trace:m4/lt~obsolete.m4:97: -1- AC_DEFUN([_LT_PROG_F77])
+m4trace:m4/lt~obsolete.m4:98: -1- AC_DEFUN([_LT_PROG_FC])
+m4trace:m4/lt~obsolete.m4:99: -1- AC_DEFUN([_LT_PROG_CXX])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?A[CHUM]_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([_AC_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS'])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^AS_FLAGS$])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?m4_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^dnl$])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?AS_])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^SHELL$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PATH_SEPARATOR$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_URL$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^exec_prefix$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^prefix$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^program_transform_name$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^bindir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sbindir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^libexecdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^datarootdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^datadir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sysconfdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sharedstatedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^localstatedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^runstatedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^includedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^oldincludedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^docdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^infodir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^htmldir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^dvidir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^pdfdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^psdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^libdir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^localedir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^mandir$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_URL$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^DEFS$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_C$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_N$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_T$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^build_alias$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^host_alias$])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^target_alias$])
+m4trace:configure.ac:21: -1- AC_CONFIG_MACRO_DIR([m4])
+m4trace:configure.ac:21: -1- AC_CONFIG_MACRO_DIR_TRACE([m4])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_cpu$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_vendor$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_os$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_cpu$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_vendor$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_os$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_cpu$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_vendor$])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_os$])
+m4trace:configure.ac:24: -1- GC_SET_VERSION
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MAJOR$])
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MINOR$])
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MICRO$])
+m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([foreign nostdinc subdir-objects])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$])
+m4trace:configure.ac:25: -1- AM_SET_CURRENT_AUTOMAKE_VERSION
+m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.16.5])
+m4trace:configure.ac:25: -1- _AM_AUTOCONF_VERSION([2.71])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$])
+m4trace:configure.ac:25: -1- _AM_SET_OPTIONS([foreign nostdinc subdir-objects])
+m4trace:configure.ac:25: -1- _AM_SET_OPTION([foreign])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([foreign])
+m4trace:configure.ac:25: -1- _AM_SET_OPTION([nostdinc])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([nostdinc])
+m4trace:configure.ac:25: -1- _AM_SET_OPTION([subdir-objects])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([subdir-objects])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$])
+m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-define])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$])
+m4trace:configure.ac:25: -1- AM_SANITY_CHECK
+m4trace:configure.ac:25: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+m4trace:configure.ac:25: -1- AM_MISSING_HAS_RUN
+m4trace:configure.ac:25: -1- AM_AUX_DIR_EXPAND
+m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$])
+m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOCONF], [autoconf])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$])
+m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$])
+m4trace:configure.ac:25: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$])
+m4trace:configure.ac:25: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$])
+m4trace:configure.ac:25: -1- AM_PROG_INSTALL_SH
+m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$])
+m4trace:configure.ac:25: -1- AM_PROG_INSTALL_STRIP
+m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$])
+m4trace:configure.ac:25: -1- AM_SET_LEADING_DOT
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$])
+m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-ustar])
+m4trace:configure.ac:25: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([tar-pax])
+m4trace:configure.ac:25: -1- _AM_PROG_TAR([v7])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$])
+m4trace:configure.ac:25: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+m4trace:configure.ac:25: -2- _AM_MANGLE_OPTION([no-dependencies])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CTAGS$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^ETAGS$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CSCOPE$])
+m4trace:configure.ac:25: -1- AM_SILENT_RULES
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_V$])
+m4trace:configure.ac:25: -1- AM_SUBST_NOTMAKE([AM_V])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_V])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_DEFAULT_V$])
+m4trace:configure.ac:25: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_BACKSLASH$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH])
+m4trace:configure.ac:27: -1- AM_MAINTAINER_MODE
+m4trace:configure.ac:27: -1- AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINTAINER_MODE_TRUE$])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINTAINER_MODE_FALSE$])
+m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_TRUE])
+m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_FALSE])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINT$])
+m4trace:configure.ac:29: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:30: -1- m4_pattern_allow([^GC_VERSION$])
+m4trace:configure.ac:32: -1- AM_PROG_CC_C_O
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^ac_ct_CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^EXEEXT$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^OBJEXT$])
+m4trace:configure.ac:32: -1- _AM_PROG_CC_C_O
+m4trace:configure.ac:32: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext])
+m4trace:configure.ac:32: -1- _AM_DEPENDENCIES([CC])
+m4trace:configure.ac:32: -1- AM_SET_DEPDIR
+m4trace:configure.ac:32: -1- m4_pattern_allow([^DEPDIR$])
+m4trace:configure.ac:32: -1- AM_OUTPUT_DEPENDENCY_COMMANDS
+m4trace:configure.ac:32: -1- AM_MAKE_INCLUDE
+m4trace:configure.ac:32: -1- AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__include$])
+m4trace:configure.ac:32: -1- AM_DEP_TRACK
+m4trace:configure.ac:32: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEP_TRUE$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEP_FALSE$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEPBACKSLASH$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__nodep$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__nodep])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CCDEPMODE$])
+m4trace:configure.ac:32: -1- AM_CONDITIONAL([am__fastdepCC], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__fastdepCC_TRUE$])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__fastdepCC_FALSE$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXXFLAGS$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^ac_ct_CXX$])
+m4trace:configure.ac:33: -1- _AM_DEPENDENCIES([CXX])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXXDEPMODE$])
+m4trace:configure.ac:33: -1- AM_CONDITIONAL([am__fastdepCXX], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$])
+m4trace:configure.ac:33: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE])
+m4trace:configure.ac:33: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE])
+m4trace:configure.ac:34: -1- AM_PROG_AS
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCAS$])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCASFLAGS$])
+m4trace:configure.ac:34: -1- _AM_IF_OPTION([no-dependencies], [], [_AM_DEPENDENCIES([CCAS])])
+m4trace:configure.ac:34: -2- _AM_MANGLE_OPTION([no-dependencies])
+m4trace:configure.ac:34: -1- _AM_DEPENDENCIES([CCAS])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCASDEPMODE$])
+m4trace:configure.ac:34: -1- AM_CONDITIONAL([am__fastdepCCAS], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^am__fastdepCCAS_TRUE$])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^am__fastdepCCAS_FALSE$])
+m4trace:configure.ac:34: -1- _AM_SUBST_NOTMAKE([am__fastdepCCAS_TRUE])
+m4trace:configure.ac:34: -1- _AM_SUBST_NOTMAKE([am__fastdepCCAS_FALSE])
+m4trace:configure.ac:36: -1- LT_INIT([disable-static])
+m4trace:configure.ac:36: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])
+m4trace:configure.ac:36: -1- LTOPTIONS_VERSION
+m4trace:configure.ac:36: -1- LTSUGAR_VERSION
+m4trace:configure.ac:36: -1- LTVERSION_VERSION
+m4trace:configure.ac:36: -1- LTOBSOLETE_VERSION
+m4trace:configure.ac:36: -1- _LT_PROG_LTMAIN
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LIBTOOL$])
+m4trace:configure.ac:36: -1- _LT_PREPARE_SED_QUOTE_VARS
+m4trace:configure.ac:36: -1- _LT_PROG_ECHO_BACKSLASH
+m4trace:configure.ac:36: -1- LT_PATH_LD
+m4trace:configure.ac:36: -1- m4_pattern_allow([^SED$])
+m4trace:configure.ac:36: -1- AC_PROG_EGREP
+m4trace:configure.ac:36: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^EGREP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^FGREP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LD$])
+m4trace:configure.ac:36: -1- LT_PATH_NM
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DUMPBIN$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_DUMPBIN$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DUMPBIN$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^NM$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LN_S$])
+m4trace:configure.ac:36: -1- LT_CMD_MAX_LEN
+m4trace:configure.ac:36: -1- m4_pattern_allow([^FILECMD$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OBJDUMP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OBJDUMP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DLLTOOL$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DLLTOOL$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^AR$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_AR$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^STRIP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^RANLIB$])
+m4trace:configure.ac:36: -1- _LT_WITH_SYSROOT
+m4trace:configure.ac:36: -1- m4_pattern_allow([LT_OBJDIR])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_OBJDIR$])
+m4trace:configure.ac:36: -1- _LT_CC_BASENAME([$compiler])
+m4trace:configure.ac:36: -1- _LT_PATH_TOOL_PREFIX([${ac_tool_prefix}file], [/usr/bin$PATH_SEPARATOR$PATH])
+m4trace:configure.ac:36: -1- _LT_PATH_TOOL_PREFIX([file], [/usr/bin$PATH_SEPARATOR$PATH])
+m4trace:configure.ac:36: -1- LT_SUPPORTED_TAG([CC])
+m4trace:configure.ac:36: -1- _LT_COMPILER_BOILERPLATE
+m4trace:configure.ac:36: -1- _LT_LINKER_BOILERPLATE
+m4trace:configure.ac:36: -1- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], [lt_cv_prog_compiler_rtti_exceptions], [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, )="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, ) -fno-rtti -fno-exceptions"])
+m4trace:configure.ac:36: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, ) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, )], [$_LT_TAGVAR(lt_prog_compiler_pic, )@&t@m4_if([],[],[ -DPIC],[m4_if([],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, ) in
+ "" | " "*) ;;
+ *) _LT_TAGVAR(lt_prog_compiler_pic, )=" $_LT_TAGVAR(lt_prog_compiler_pic, )" ;;
+ esac], [_LT_TAGVAR(lt_prog_compiler_pic, )=
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, )=no])
+m4trace:configure.ac:36: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, )=])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^MANIFEST_TOOL$])
+m4trace:configure.ac:36: -1- _LT_DLL_DEF_P([$export_symbols])
+m4trace:configure.ac:36: -1- _LT_DLL_DEF_P([$export_symbols])
+m4trace:configure.ac:36: -1- _LT_REQUIRED_DARWIN_CHECKS
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DSYMUTIL$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^NMEDIT$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LIPO$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OTOOL$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OTOOL64$])
+m4trace:configure.ac:36: -1- _LT_LINKER_OPTION([if $CC understands -b], [lt_cv_prog_compiler__b], [-b], [_LT_TAGVAR(archive_cmds, )='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, )='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$])
+m4trace:configure.ac:36: -1- LT_SYS_DLOPEN_SELF
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_stdio_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" stdio.h ]AS_TR_SH([stdio.h]) AS_TR_CPP([HAVE_stdio.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_stdlib_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" stdlib.h ]AS_TR_SH([stdlib.h]) AS_TR_CPP([HAVE_stdlib.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_string_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" string.h ]AS_TR_SH([string.h]) AS_TR_CPP([HAVE_string.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_inttypes_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" inttypes.h ]AS_TR_SH([inttypes.h]) AS_TR_CPP([HAVE_inttypes.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_stdint_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" stdint.h ]AS_TR_SH([stdint.h]) AS_TR_CPP([HAVE_stdint.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_strings_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" strings.h ]AS_TR_SH([strings.h]) AS_TR_CPP([HAVE_strings.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_sys_stat_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" sys/stat.h ]AS_TR_SH([sys/stat.h]) AS_TR_CPP([HAVE_sys/stat.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_sys_types_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" sys/types.h ]AS_TR_SH([sys/types.h]) AS_TR_CPP([HAVE_sys/types.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE],
+ [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list],
+ [" unistd.h ]AS_TR_SH([unistd.h]) AS_TR_CPP([HAVE_unistd.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^STDC_HEADERS$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^HAVE_DLFCN_H$])
+m4trace:configure.ac:36: -1- LT_LANG([CXX])
+m4trace:configure.ac:36: -1- LT_SUPPORTED_TAG([CXX])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXCPP$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXCPP$])
+m4trace:configure.ac:36: -1- _LT_COMPILER_BOILERPLATE
+m4trace:configure.ac:36: -1- _LT_LINKER_BOILERPLATE
+m4trace:configure.ac:36: -1- _LT_CC_BASENAME([$compiler])
+m4trace:configure.ac:36: -1- LT_PATH_LD
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LD$])
+m4trace:configure.ac:36: -1- _LT_DLL_DEF_P([$export_symbols])
+m4trace:configure.ac:36: -1- _LT_DLL_DEF_P([$export_symbols])
+m4trace:configure.ac:36: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, CXX) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, CXX)], [$_LT_TAGVAR(lt_prog_compiler_pic, CXX)@&t@m4_if([CXX],[],[ -DPIC],[m4_if([CXX],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, CXX) in
+ "" | " "*) ;;
+ *) _LT_TAGVAR(lt_prog_compiler_pic, CXX)=" $_LT_TAGVAR(lt_prog_compiler_pic, CXX)" ;;
+ esac], [_LT_TAGVAR(lt_prog_compiler_pic, CXX)=
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, CXX)=no])
+m4trace:configure.ac:36: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works_CXX], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, CXX)=])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$])
+m4trace:configure.ac:93: -1- AM_CONDITIONAL([EMSCRIPTEN], [test x$emscripten = xyes])
+m4trace:configure.ac:93: -1- m4_pattern_allow([^EMSCRIPTEN_TRUE$])
+m4trace:configure.ac:93: -1- m4_pattern_allow([^EMSCRIPTEN_FALSE$])
+m4trace:configure.ac:93: -1- _AM_SUBST_NOTMAKE([EMSCRIPTEN_TRUE])
+m4trace:configure.ac:93: -1- _AM_SUBST_NOTMAKE([EMSCRIPTEN_FALSE])
+m4trace:configure.ac:107: -1- m4_pattern_allow([^GC_CFLAGS$])
+m4trace:configure.ac:110: -1- m4_pattern_allow([^CFLAGS_EXTRA$])
+m4trace:configure.ac:157: -1- m4_pattern_allow([^GC_NO_THREADS_DISCOVERY$])
+m4trace:configure.ac:217: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:218: -1- m4_pattern_allow([^_REENTRANT$])
+m4trace:configure.ac:230: -1- m4_pattern_allow([^_POSIX_C_SOURCE$])
+m4trace:configure.ac:251: -1- m4_pattern_allow([^_PTHREADS$])
+m4trace:configure.ac:266: -1- m4_pattern_allow([^GC_WIN32_PTHREADS$])
+m4trace:configure.ac:297: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:305: -1- m4_pattern_allow([^GC_INSIDE_DLL$])
+m4trace:configure.ac:309: -1- m4_pattern_allow([^EMPTY_GETENV_RESULTS$])
+m4trace:configure.ac:313: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:324: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:325: -1- m4_pattern_allow([^_REENTRANT$])
+m4trace:configure.ac:331: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:356: -1- m4_pattern_allow([^THREADDLLIBS$])
+m4trace:configure.ac:358: -1- AM_CONDITIONAL([THREADS], [test x$THREADS != xnone])
+m4trace:configure.ac:358: -1- m4_pattern_allow([^THREADS_TRUE$])
+m4trace:configure.ac:358: -1- m4_pattern_allow([^THREADS_FALSE$])
+m4trace:configure.ac:358: -1- _AM_SUBST_NOTMAKE([THREADS_TRUE])
+m4trace:configure.ac:358: -1- _AM_SUBST_NOTMAKE([THREADS_FALSE])
+m4trace:configure.ac:359: -1- AM_CONDITIONAL([PTHREADS], [test x$THREADS = xposix])
+m4trace:configure.ac:359: -1- m4_pattern_allow([^PTHREADS_TRUE$])
+m4trace:configure.ac:359: -1- m4_pattern_allow([^PTHREADS_FALSE$])
+m4trace:configure.ac:359: -1- _AM_SUBST_NOTMAKE([PTHREADS_TRUE])
+m4trace:configure.ac:359: -1- _AM_SUBST_NOTMAKE([PTHREADS_FALSE])
+m4trace:configure.ac:360: -1- AM_CONDITIONAL([DARWIN_THREADS], [test x$darwin_threads = xtrue])
+m4trace:configure.ac:360: -1- m4_pattern_allow([^DARWIN_THREADS_TRUE$])
+m4trace:configure.ac:360: -1- m4_pattern_allow([^DARWIN_THREADS_FALSE$])
+m4trace:configure.ac:360: -1- _AM_SUBST_NOTMAKE([DARWIN_THREADS_TRUE])
+m4trace:configure.ac:360: -1- _AM_SUBST_NOTMAKE([DARWIN_THREADS_FALSE])
+m4trace:configure.ac:361: -1- AM_CONDITIONAL([WIN32_THREADS], [test x$win32_threads = xtrue])
+m4trace:configure.ac:361: -1- m4_pattern_allow([^WIN32_THREADS_TRUE$])
+m4trace:configure.ac:361: -1- m4_pattern_allow([^WIN32_THREADS_FALSE$])
+m4trace:configure.ac:361: -1- _AM_SUBST_NOTMAKE([WIN32_THREADS_TRUE])
+m4trace:configure.ac:361: -1- _AM_SUBST_NOTMAKE([WIN32_THREADS_FALSE])
+m4trace:configure.ac:382: -1- m4_pattern_allow([^GC_READ_ENV_FILE$])
+m4trace:configure.ac:387: -1- AM_CONDITIONAL([PTHREAD_START_STANDALONE], [test x$pthread_start_standalone = xyes])
+m4trace:configure.ac:387: -1- m4_pattern_allow([^PTHREAD_START_STANDALONE_TRUE$])
+m4trace:configure.ac:387: -1- m4_pattern_allow([^PTHREAD_START_STANDALONE_FALSE$])
+m4trace:configure.ac:387: -1- _AM_SUBST_NOTMAKE([PTHREAD_START_STANDALONE_TRUE])
+m4trace:configure.ac:387: -1- _AM_SUBST_NOTMAKE([PTHREAD_START_STANDALONE_FALSE])
+m4trace:configure.ac:422: -1- m4_pattern_allow([^DARWIN_DONT_PARSE_STACK$])
+m4trace:configure.ac:427: -1- AM_CONDITIONAL([ASM_WITH_CPP_UNSUPPORTED], [test $compiler_xlc = yes -o $compiler_suncc = yes])
+m4trace:configure.ac:427: -1- m4_pattern_allow([^ASM_WITH_CPP_UNSUPPORTED_TRUE$])
+m4trace:configure.ac:427: -1- m4_pattern_allow([^ASM_WITH_CPP_UNSUPPORTED_FALSE$])
+m4trace:configure.ac:427: -1- _AM_SUBST_NOTMAKE([ASM_WITH_CPP_UNSUPPORTED_TRUE])
+m4trace:configure.ac:427: -1- _AM_SUBST_NOTMAKE([ASM_WITH_CPP_UNSUPPORTED_FALSE])
+m4trace:configure.ac:455: -1- m4_pattern_allow([^NO_GETCONTEXT$])
+m4trace:configure.ac:459: -1- m4_pattern_allow([^HAVE_DL_ITERATE_PHDR$])
+m4trace:configure.ac:481: -1- AM_CONDITIONAL([AVOID_CPP_LIB], [test $avoid_cpp_lib = yes])
+m4trace:configure.ac:481: -1- m4_pattern_allow([^AVOID_CPP_LIB_TRUE$])
+m4trace:configure.ac:481: -1- m4_pattern_allow([^AVOID_CPP_LIB_FALSE$])
+m4trace:configure.ac:481: -1- _AM_SUBST_NOTMAKE([AVOID_CPP_LIB_TRUE])
+m4trace:configure.ac:481: -1- _AM_SUBST_NOTMAKE([AVOID_CPP_LIB_FALSE])
+m4trace:configure.ac:484: -1- m4_pattern_allow([^GC_MISSING_EXECINFO_H$])
+m4trace:configure.ac:493: -1- m4_pattern_allow([^extra_ldflags_libgc$])
+m4trace:configure.ac:495: -1- m4_pattern_allow([^EXTRA_TEST_LIBS$])
+m4trace:configure.ac:498: -1- m4_pattern_allow([^target_all$])
+m4trace:configure.ac:518: -1- m4_pattern_allow([^ECOS$])
+m4trace:configure.ac:524: -1- AM_CONDITIONAL([CPLUSPLUS], [test "${enable_cplusplus}" = yes])
+m4trace:configure.ac:524: -1- m4_pattern_allow([^CPLUSPLUS_TRUE$])
+m4trace:configure.ac:524: -1- m4_pattern_allow([^CPLUSPLUS_FALSE$])
+m4trace:configure.ac:524: -1- _AM_SUBST_NOTMAKE([CPLUSPLUS_TRUE])
+m4trace:configure.ac:524: -1- _AM_SUBST_NOTMAKE([CPLUSPLUS_FALSE])
+m4trace:configure.ac:529: -1- AM_CONDITIONAL([GC_TBA_LIBRARY], [test "${enable_cplusplus}" = yes \
+ -a "${enable_throw_bad_alloc_library}" != no])
+m4trace:configure.ac:529: -1- m4_pattern_allow([^GC_TBA_LIBRARY_TRUE$])
+m4trace:configure.ac:529: -1- m4_pattern_allow([^GC_TBA_LIBRARY_FALSE$])
+m4trace:configure.ac:529: -1- _AM_SUBST_NOTMAKE([GC_TBA_LIBRARY_TRUE])
+m4trace:configure.ac:529: -1- _AM_SUBST_NOTMAKE([GC_TBA_LIBRARY_FALSE])
+m4trace:configure.ac:550: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:551: -1- m4_pattern_allow([^AM_CFLAGS$])
+m4trace:configure.ac:552: -1- m4_pattern_allow([^AM_CPPFLAGS$])
+m4trace:configure.ac:553: -1- m4_pattern_allow([^CXXLIBS$])
+m4trace:configure.ac:558: -1- AC_ENABLE_SHARED
+m4trace:configure.ac:572: -1- m4_pattern_allow([^GC_DLL$])
+m4trace:configure.ac:590: -1- m4_pattern_allow([^DONT_USE_USER32_DLL$])
+m4trace:configure.ac:613: -1- m4_pattern_allow([^SOLARIS25_PROC_VDB_BUG_FIXED$])
+m4trace:configure.ac:627: -1- m4_pattern_allow([^SUNOS53_SHARED_LIB$])
+m4trace:configure.ac:640: -1- m4_pattern_allow([^addobjs$])
+m4trace:configure.ac:641: -1- m4_pattern_allow([^addlibs$])
+m4trace:configure.ac:643: -1- LT_INIT
+m4trace:configure.ac:704: -1- m4_pattern_allow([^NO_EXECUTE_PERMISSION$])
+m4trace:configure.ac:707: -1- m4_pattern_allow([^ALL_INTERIOR_POINTERS$])
+m4trace:configure.ac:718: -1- m4_pattern_allow([^GC_GCJ_SUPPORT$])
+m4trace:configure.ac:724: -1- m4_pattern_allow([^GC_ENABLE_SUSPEND_THREAD$])
+m4trace:configure.ac:728: -1- m4_pattern_allow([^GC_ENABLE_SUSPEND_THREAD$])
+m4trace:configure.ac:733: -1- AM_CONDITIONAL([ENABLE_GCJ_SUPPORT], [test x"enable_gcj_support" != xno])
+m4trace:configure.ac:733: -1- m4_pattern_allow([^ENABLE_GCJ_SUPPORT_TRUE$])
+m4trace:configure.ac:733: -1- m4_pattern_allow([^ENABLE_GCJ_SUPPORT_FALSE$])
+m4trace:configure.ac:733: -1- _AM_SUBST_NOTMAKE([ENABLE_GCJ_SUPPORT_TRUE])
+m4trace:configure.ac:733: -1- _AM_SUBST_NOTMAKE([ENABLE_GCJ_SUPPORT_FALSE])
+m4trace:configure.ac:740: -1- m4_pattern_allow([^GC_USESIGRT_SIGNALS$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^KEEP_BACK_PTRS$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^DBG_HDRS_ALL$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^SAVE_CALL_COUNT$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^GC_HAVE_BUILTIN_BACKTRACE$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^SAVE_CALL_COUNT$])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:789: -1- AM_CONDITIONAL([MAKE_BACK_GRAPH], [test x"$enable_gc_debug" = xyes])
+m4trace:configure.ac:789: -1- m4_pattern_allow([^MAKE_BACK_GRAPH_TRUE$])
+m4trace:configure.ac:789: -1- m4_pattern_allow([^MAKE_BACK_GRAPH_FALSE$])
+m4trace:configure.ac:789: -1- _AM_SUBST_NOTMAKE([MAKE_BACK_GRAPH_TRUE])
+m4trace:configure.ac:789: -1- _AM_SUBST_NOTMAKE([MAKE_BACK_GRAPH_FALSE])
+m4trace:configure.ac:790: -1- AM_CONDITIONAL([KEEP_BACK_PTRS], [test x"$keep_back_ptrs" = xtrue])
+m4trace:configure.ac:790: -1- m4_pattern_allow([^KEEP_BACK_PTRS_TRUE$])
+m4trace:configure.ac:790: -1- m4_pattern_allow([^KEEP_BACK_PTRS_FALSE$])
+m4trace:configure.ac:790: -1- _AM_SUBST_NOTMAKE([KEEP_BACK_PTRS_TRUE])
+m4trace:configure.ac:790: -1- _AM_SUBST_NOTMAKE([KEEP_BACK_PTRS_FALSE])
+m4trace:configure.ac:822: -1- m4_pattern_allow([^HAVE_DLADDR$])
+m4trace:configure.ac:829: -1- m4_pattern_allow([^GC_NO_SIGSETJMP$])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID$])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG$])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITH_TID$])
+m4trace:configure.ac:877: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.ac:878: -1- m4_pattern_allow([^CXXFLAGS$])
+m4trace:configure.ac:885: -1- m4_pattern_allow([^JAVA_FINALIZATION$])
+m4trace:configure.ac:892: -1- m4_pattern_allow([^GC_ATOMIC_UNCOLLECTABLE$])
+m4trace:configure.ac:902: -1- m4_pattern_allow([^REDIRECT_MALLOC$])
+m4trace:configure.ac:904: -1- m4_pattern_allow([^REDIRECT_REALLOC$])
+m4trace:configure.ac:906: -1- m4_pattern_allow([^REDIRECT_FREE$])
+m4trace:configure.ac:909: -1- m4_pattern_allow([^REDIRECT_MALLOC$])
+m4trace:configure.ac:911: -1- m4_pattern_allow([^GC_USE_DLOPEN_WRAP$])
+m4trace:configure.ac:918: -1- m4_pattern_allow([^ENABLE_DISCLAIM$])
+m4trace:configure.ac:921: -1- AM_CONDITIONAL([ENABLE_DISCLAIM], [test x"$enable_disclaim" != xno])
+m4trace:configure.ac:921: -1- m4_pattern_allow([^ENABLE_DISCLAIM_TRUE$])
+m4trace:configure.ac:921: -1- m4_pattern_allow([^ENABLE_DISCLAIM_FALSE$])
+m4trace:configure.ac:921: -1- _AM_SUBST_NOTMAKE([ENABLE_DISCLAIM_TRUE])
+m4trace:configure.ac:921: -1- _AM_SUBST_NOTMAKE([ENABLE_DISCLAIM_FALSE])
+m4trace:configure.ac:928: -1- m4_pattern_allow([^LARGE_CONFIG$])
+m4trace:configure.ac:936: -1- m4_pattern_allow([^NO_CLOCK$])
+m4trace:configure.ac:937: -1- m4_pattern_allow([^SMALL_CONFIG$])
+m4trace:configure.ac:942: -1- m4_pattern_allow([^NO_DEBUGGING$])
+m4trace:configure.ac:946: -1- m4_pattern_allow([^UNWINDLIBS$])
+m4trace:configure.ac:952: -1- m4_pattern_allow([^GC_ASSERTIONS$])
+m4trace:configure.ac:967: -1- m4_pattern_allow([^USE_MMAP$])
+m4trace:configure.ac:972: -1- m4_pattern_allow([^USE_MUNMAP$])
+m4trace:configure.ac:978: -1- m4_pattern_allow([^MUNMAP_THRESHOLD$])
+m4trace:configure.ac:982: -1- m4_pattern_allow([^USE_MMAP$])
+m4trace:configure.ac:992: -1- m4_pattern_allow([^IGNORE_DYNAMIC_LOADING$])
+m4trace:configure.ac:1001: -1- m4_pattern_allow([^GC_DONT_REGISTER_MAIN_STATIC_DATA$])
+m4trace:configure.ac:1014: -1- m4_pattern_allow([^CHECKSUMS$])
+m4trace:configure.ac:1018: -1- AM_CONDITIONAL([CHECKSUMS], [test x$enable_checksums = xyes])
+m4trace:configure.ac:1018: -1- m4_pattern_allow([^CHECKSUMS_TRUE$])
+m4trace:configure.ac:1018: -1- m4_pattern_allow([^CHECKSUMS_FALSE$])
+m4trace:configure.ac:1018: -1- _AM_SUBST_NOTMAKE([CHECKSUMS_TRUE])
+m4trace:configure.ac:1018: -1- _AM_SUBST_NOTMAKE([CHECKSUMS_FALSE])
+m4trace:configure.ac:1020: -1- AM_CONDITIONAL([USE_LIBDIR], [test -z "$with_cross_host"])
+m4trace:configure.ac:1020: -1- m4_pattern_allow([^USE_LIBDIR_TRUE$])
+m4trace:configure.ac:1020: -1- m4_pattern_allow([^USE_LIBDIR_FALSE$])
+m4trace:configure.ac:1020: -1- _AM_SUBST_NOTMAKE([USE_LIBDIR_TRUE])
+m4trace:configure.ac:1020: -1- _AM_SUBST_NOTMAKE([USE_LIBDIR_FALSE])
+m4trace:configure.ac:1034: -1- m4_pattern_allow([^WERROR_CFLAGS$])
+m4trace:configure.ac:1042: -1- AM_CONDITIONAL([SINGLE_GC_OBJ], [test x"$enable_single_obj_compilation" = xyes])
+m4trace:configure.ac:1042: -1- m4_pattern_allow([^SINGLE_GC_OBJ_TRUE$])
+m4trace:configure.ac:1042: -1- m4_pattern_allow([^SINGLE_GC_OBJ_FALSE$])
+m4trace:configure.ac:1042: -1- _AM_SUBST_NOTMAKE([SINGLE_GC_OBJ_TRUE])
+m4trace:configure.ac:1042: -1- _AM_SUBST_NOTMAKE([SINGLE_GC_OBJ_FALSE])
+m4trace:configure.ac:1062: -1- AM_CONDITIONAL([ENABLE_DOCS], [test x$enable_docs != xno])
+m4trace:configure.ac:1062: -1- m4_pattern_allow([^ENABLE_DOCS_TRUE$])
+m4trace:configure.ac:1062: -1- m4_pattern_allow([^ENABLE_DOCS_FALSE$])
+m4trace:configure.ac:1062: -1- _AM_SUBST_NOTMAKE([ENABLE_DOCS_TRUE])
+m4trace:configure.ac:1062: -1- _AM_SUBST_NOTMAKE([ENABLE_DOCS_FALSE])
+m4trace:configure.ac:1064: -1- AM_CONDITIONAL([ENABLE_SHARED], [test x$enable_shared = xyes])
+m4trace:configure.ac:1064: -1- m4_pattern_allow([^ENABLE_SHARED_TRUE$])
+m4trace:configure.ac:1064: -1- m4_pattern_allow([^ENABLE_SHARED_FALSE$])
+m4trace:configure.ac:1064: -1- _AM_SUBST_NOTMAKE([ENABLE_SHARED_TRUE])
+m4trace:configure.ac:1064: -1- _AM_SUBST_NOTMAKE([ENABLE_SHARED_FALSE])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^ATOMIC_OPS_LIBS$])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^GC_BUILTIN_ATOMIC$])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^ATOMIC_OPS_CFLAGS$])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^subdirs$])
+m4trace:configure.ac:1139: -1- AM_CONDITIONAL([USE_INTERNAL_LIBATOMIC_OPS], [test x$with_libatomic_ops = xno -a x"$THREADS" != xnone])
+m4trace:configure.ac:1139: -1- m4_pattern_allow([^USE_INTERNAL_LIBATOMIC_OPS_TRUE$])
+m4trace:configure.ac:1139: -1- m4_pattern_allow([^USE_INTERNAL_LIBATOMIC_OPS_FALSE$])
+m4trace:configure.ac:1139: -1- _AM_SUBST_NOTMAKE([USE_INTERNAL_LIBATOMIC_OPS_TRUE])
+m4trace:configure.ac:1139: -1- _AM_SUBST_NOTMAKE([USE_INTERNAL_LIBATOMIC_OPS_FALSE])
+m4trace:configure.ac:1141: -1- AM_CONDITIONAL([NEED_ATOMIC_OPS_ASM], [test x$with_libatomic_ops = xno -a x$need_atomic_ops_asm = xtrue])
+m4trace:configure.ac:1141: -1- m4_pattern_allow([^NEED_ATOMIC_OPS_ASM_TRUE$])
+m4trace:configure.ac:1141: -1- m4_pattern_allow([^NEED_ATOMIC_OPS_ASM_FALSE$])
+m4trace:configure.ac:1141: -1- _AM_SUBST_NOTMAKE([NEED_ATOMIC_OPS_ASM_TRUE])
+m4trace:configure.ac:1141: -1- _AM_SUBST_NOTMAKE([NEED_ATOMIC_OPS_ASM_FALSE])
+m4trace:configure.ac:1148: -1- m4_pattern_allow([^HAVE_LOCKFREE_AO_OR$])
+m4trace:configure.ac:1148: -1- m4_pattern_allow([^BASE_ATOMIC_OPS_EMULATED$])
+m4trace:configure.ac:1172: -1- m4_pattern_allow([^PARALLEL_MARK$])
+m4trace:configure.ac:1174: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC$])
+m4trace:configure.ac:1176: -1- AM_CONDITIONAL([THREAD_LOCAL_ALLOC], [test x$use_thread_local_alloc != xno])
+m4trace:configure.ac:1176: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC_TRUE$])
+m4trace:configure.ac:1176: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC_FALSE$])
+m4trace:configure.ac:1176: -1- _AM_SUBST_NOTMAKE([THREAD_LOCAL_ALLOC_TRUE])
+m4trace:configure.ac:1176: -1- _AM_SUBST_NOTMAKE([THREAD_LOCAL_ALLOC_FALSE])
+m4trace:configure.ac:1185: -1- m4_pattern_allow([^HANDLE_FORK$])
+m4trace:configure.ac:1188: -1- m4_pattern_allow([^NO_HANDLE_FORK$])
+m4trace:configure.ac:1197: -1- m4_pattern_allow([^HANDLE_FORK$])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.ac:1214: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
+m4trace:configure.ac:1214: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
+m4trace:configure.ac:1214: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
+m4trace:configure.ac:1214: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"])
+m4trace:configure.ac:1214: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS
+m4trace:configure.ac:1214: -1- AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles])
+m4trace:configure.ac:1214: -1- _LT_PROG_LTMAIN
diff --git a/graphics/asymptote/gc/autom4te.cache/traces.3 b/graphics/asymptote/gc/autom4te.cache/traces.3
new file mode 100644
index 0000000000..f967fa3b14
--- /dev/null
+++ b/graphics/asymptote/gc/autom4te.cache/traces.3
@@ -0,0 +1,1181 @@
+m4trace:aclocal.m4:755: -1- AC_SUBST([am__quote])
+m4trace:aclocal.m4:755: -1- AC_SUBST_TRACE([am__quote])
+m4trace:aclocal.m4:755: -1- m4_pattern_allow([^am__quote$])
+m4trace:aclocal.m4:1207: -1- m4_include([m4/gc_set_version.m4])
+m4trace:m4/gc_set_version.m4:40: -1- sinclude([libtool.m4])
+m4trace:aclocal.m4:1208: -1- m4_include([m4/libtool.m4])
+m4trace:aclocal.m4:1209: -1- m4_include([m4/ltoptions.m4])
+m4trace:aclocal.m4:1210: -1- m4_include([m4/ltsugar.m4])
+m4trace:aclocal.m4:1211: -1- m4_include([m4/ltversion.m4])
+m4trace:aclocal.m4:1212: -1- m4_include([m4/lt~obsolete.m4])
+m4trace:configure.ac:17: -1- AC_INIT([gc], [8.2.8], [https://github.com/ivmai/bdwgc/issues])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?A[CHUM]_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([_AC_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS'])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^AS_FLAGS$])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?m4_])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^dnl$])
+m4trace:configure.ac:17: -1- m4_pattern_forbid([^_?AS_])
+m4trace:configure.ac:17: -1- AC_SUBST([SHELL])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([SHELL])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^SHELL$])
+m4trace:configure.ac:17: -1- AC_SUBST([PATH_SEPARATOR])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PATH_SEPARATOR])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PATH_SEPARATOR$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_NAME])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_TARNAME])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_VERSION])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_STRING])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE_URL])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_URL$])
+m4trace:configure.ac:17: -1- AC_SUBST([exec_prefix], [NONE])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([exec_prefix])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^exec_prefix$])
+m4trace:configure.ac:17: -1- AC_SUBST([prefix], [NONE])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([prefix])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^prefix$])
+m4trace:configure.ac:17: -1- AC_SUBST([program_transform_name], [s,x,x,])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([program_transform_name])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^program_transform_name$])
+m4trace:configure.ac:17: -1- AC_SUBST([bindir], ['${exec_prefix}/bin'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([bindir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^bindir$])
+m4trace:configure.ac:17: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([sbindir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sbindir$])
+m4trace:configure.ac:17: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([libexecdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^libexecdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([datarootdir], ['${prefix}/share'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([datarootdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^datarootdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([datadir], ['${datarootdir}'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([datadir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^datadir$])
+m4trace:configure.ac:17: -1- AC_SUBST([sysconfdir], ['${prefix}/etc'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([sysconfdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sysconfdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([sharedstatedir], ['${prefix}/com'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([sharedstatedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^sharedstatedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([localstatedir], ['${prefix}/var'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([localstatedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^localstatedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([runstatedir], ['${localstatedir}/run'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([runstatedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^runstatedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([includedir], ['${prefix}/include'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([includedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^includedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([oldincludedir], ['/usr/include'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([oldincludedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^oldincludedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME],
+ ['${datarootdir}/doc/${PACKAGE_TARNAME}'],
+ ['${datarootdir}/doc/${PACKAGE}'])])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([docdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^docdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([infodir], ['${datarootdir}/info'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([infodir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^infodir$])
+m4trace:configure.ac:17: -1- AC_SUBST([htmldir], ['${docdir}'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([htmldir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^htmldir$])
+m4trace:configure.ac:17: -1- AC_SUBST([dvidir], ['${docdir}'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([dvidir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^dvidir$])
+m4trace:configure.ac:17: -1- AC_SUBST([pdfdir], ['${docdir}'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([pdfdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^pdfdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([psdir], ['${docdir}'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([psdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^psdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([libdir], ['${exec_prefix}/lib'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([libdir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^libdir$])
+m4trace:configure.ac:17: -1- AC_SUBST([localedir], ['${datarootdir}/locale'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([localedir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^localedir$])
+m4trace:configure.ac:17: -1- AC_SUBST([mandir], ['${datarootdir}/man'])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([mandir])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^mandir$])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */
+@%:@undef PACKAGE_NAME])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */
+@%:@undef PACKAGE_TARNAME])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */
+@%:@undef PACKAGE_VERSION])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */
+@%:@undef PACKAGE_STRING])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */
+@%:@undef PACKAGE_BUGREPORT])
+m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE_URL$])
+m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */
+@%:@undef PACKAGE_URL])
+m4trace:configure.ac:17: -1- AC_SUBST([DEFS])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([DEFS])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^DEFS$])
+m4trace:configure.ac:17: -1- AC_SUBST([ECHO_C])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([ECHO_C])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_C$])
+m4trace:configure.ac:17: -1- AC_SUBST([ECHO_N])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([ECHO_N])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_N$])
+m4trace:configure.ac:17: -1- AC_SUBST([ECHO_T])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([ECHO_T])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^ECHO_T$])
+m4trace:configure.ac:17: -1- AC_SUBST([LIBS])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:17: -1- AC_SUBST([build_alias])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([build_alias])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^build_alias$])
+m4trace:configure.ac:17: -1- AC_SUBST([host_alias])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([host_alias])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^host_alias$])
+m4trace:configure.ac:17: -1- AC_SUBST([target_alias])
+m4trace:configure.ac:17: -1- AC_SUBST_TRACE([target_alias])
+m4trace:configure.ac:17: -1- m4_pattern_allow([^target_alias$])
+m4trace:configure.ac:21: -1- AC_CONFIG_MACRO_DIR_TRACE([m4])
+m4trace:configure.ac:22: -1- AC_CANONICAL_TARGET
+m4trace:configure.ac:22: -1- AC_CANONICAL_HOST
+m4trace:configure.ac:22: -1- AC_CANONICAL_BUILD
+m4trace:configure.ac:22: -1- AC_REQUIRE_AUX_FILE([config.sub])
+m4trace:configure.ac:22: -1- AC_REQUIRE_AUX_FILE([config.guess])
+m4trace:configure.ac:22: -1- AC_SUBST([build], [$ac_cv_build])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([build])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build$])
+m4trace:configure.ac:22: -1- AC_SUBST([build_cpu], [$[1]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([build_cpu])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_cpu$])
+m4trace:configure.ac:22: -1- AC_SUBST([build_vendor], [$[2]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([build_vendor])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_vendor$])
+m4trace:configure.ac:22: -1- AC_SUBST([build_os])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([build_os])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^build_os$])
+m4trace:configure.ac:22: -1- AC_SUBST([host], [$ac_cv_host])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([host])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host$])
+m4trace:configure.ac:22: -1- AC_SUBST([host_cpu], [$[1]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([host_cpu])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_cpu$])
+m4trace:configure.ac:22: -1- AC_SUBST([host_vendor], [$[2]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([host_vendor])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_vendor$])
+m4trace:configure.ac:22: -1- AC_SUBST([host_os])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([host_os])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^host_os$])
+m4trace:configure.ac:22: -1- AC_SUBST([target], [$ac_cv_target])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([target])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target$])
+m4trace:configure.ac:22: -1- AC_SUBST([target_cpu], [$[1]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([target_cpu])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_cpu$])
+m4trace:configure.ac:22: -1- AC_SUBST([target_vendor], [$[2]])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([target_vendor])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_vendor$])
+m4trace:configure.ac:22: -1- AC_SUBST([target_os])
+m4trace:configure.ac:22: -1- AC_SUBST_TRACE([target_os])
+m4trace:configure.ac:22: -1- m4_pattern_allow([^target_os$])
+m4trace:configure.ac:24: -1- AC_DEFINE_TRACE_LITERAL([GC_VERSION_MAJOR])
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MAJOR$])
+m4trace:configure.ac:24: -1- AH_OUTPUT([GC_VERSION_MAJOR], [/* The major version number of this GC release. */
+@%:@undef GC_VERSION_MAJOR])
+m4trace:configure.ac:24: -1- AC_DEFINE_TRACE_LITERAL([GC_VERSION_MINOR])
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MINOR$])
+m4trace:configure.ac:24: -1- AH_OUTPUT([GC_VERSION_MINOR], [/* The minor version number of this GC release. */
+@%:@undef GC_VERSION_MINOR])
+m4trace:configure.ac:24: -1- AC_DEFINE_TRACE_LITERAL([GC_VERSION_MICRO])
+m4trace:configure.ac:24: -1- m4_pattern_allow([^GC_VERSION_MICRO$])
+m4trace:configure.ac:24: -1- AH_OUTPUT([GC_VERSION_MICRO], [/* The micro version number of this GC release. */
+@%:@undef GC_VERSION_MICRO])
+m4trace:configure.ac:25: -1- AM_INIT_AUTOMAKE([foreign nostdinc subdir-objects])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$])
+m4trace:configure.ac:25: -1- AM_AUTOMAKE_VERSION([1.16.5])
+m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([install-sh])
+m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_PROGRAM])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_PROGRAM])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_PROGRAM$])
+m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_SCRIPT])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_SCRIPT])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_SCRIPT$])
+m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_DATA])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_DATA])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_DATA$])
+m4trace:configure.ac:25: -1- AC_SUBST([am__isrc], [' -I$(srcdir)'])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__isrc])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__isrc$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([am__isrc])
+m4trace:configure.ac:25: -1- AC_SUBST([CYGPATH_W])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([CYGPATH_W])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CYGPATH_W$])
+m4trace:configure.ac:25: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([PACKAGE])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:25: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([VERSION])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$])
+m4trace:configure.ac:25: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:25: -1- AH_OUTPUT([PACKAGE], [/* Name of package */
+@%:@undef PACKAGE])
+m4trace:configure.ac:25: -1- AC_DEFINE_TRACE_LITERAL([VERSION])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^VERSION$])
+m4trace:configure.ac:25: -1- AH_OUTPUT([VERSION], [/* Version number of package */
+@%:@undef VERSION])
+m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([missing])
+m4trace:configure.ac:25: -1- AC_SUBST([ACLOCAL])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([ACLOCAL])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^ACLOCAL$])
+m4trace:configure.ac:25: -1- AC_SUBST([AUTOCONF])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOCONF])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOCONF$])
+m4trace:configure.ac:25: -1- AC_SUBST([AUTOMAKE])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOMAKE])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOMAKE$])
+m4trace:configure.ac:25: -1- AC_SUBST([AUTOHEADER])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AUTOHEADER])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AUTOHEADER$])
+m4trace:configure.ac:25: -1- AC_SUBST([MAKEINFO])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([MAKEINFO])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^MAKEINFO$])
+m4trace:configure.ac:25: -1- AC_SUBST([install_sh])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([install_sh])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^install_sh$])
+m4trace:configure.ac:25: -1- AC_SUBST([STRIP])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([STRIP])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^STRIP$])
+m4trace:configure.ac:25: -1- AC_SUBST([INSTALL_STRIP_PROGRAM])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$])
+m4trace:configure.ac:25: -1- AC_REQUIRE_AUX_FILE([install-sh])
+m4trace:configure.ac:25: -1- AC_SUBST([MKDIR_P])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([MKDIR_P])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^MKDIR_P$])
+m4trace:configure.ac:25: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([mkdir_p])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^mkdir_p$])
+m4trace:configure.ac:25: -1- AC_SUBST([AWK])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AWK])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AWK$])
+m4trace:configure.ac:25: -1- AC_SUBST([SET_MAKE])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([SET_MAKE])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^SET_MAKE$])
+m4trace:configure.ac:25: -1- AC_SUBST([am__leading_dot])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__leading_dot])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__leading_dot$])
+m4trace:configure.ac:25: -1- AC_SUBST([AMTAR], ['$${TAR-tar}'])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AMTAR])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AMTAR$])
+m4trace:configure.ac:25: -1- AC_SUBST([am__tar])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__tar])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__tar$])
+m4trace:configure.ac:25: -1- AC_SUBST([am__untar])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([am__untar])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^am__untar$])
+m4trace:configure.ac:25: -1- AC_SUBST([CTAGS])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([CTAGS])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CTAGS$])
+m4trace:configure.ac:25: -1- AC_SUBST([ETAGS])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([ETAGS])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^ETAGS$])
+m4trace:configure.ac:25: -1- AC_SUBST([CSCOPE])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([CSCOPE])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^CSCOPE$])
+m4trace:configure.ac:25: -1- AM_SILENT_RULES
+m4trace:configure.ac:25: -1- AC_SUBST([AM_V])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AM_V])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_V$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_V])
+m4trace:configure.ac:25: -1- AC_SUBST([AM_DEFAULT_V])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AM_DEFAULT_V])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_DEFAULT_V$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V])
+m4trace:configure.ac:25: -1- AC_SUBST([AM_DEFAULT_VERBOSITY])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$])
+m4trace:configure.ac:25: -1- AC_SUBST([AM_BACKSLASH])
+m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AM_BACKSLASH])
+m4trace:configure.ac:25: -1- m4_pattern_allow([^AM_BACKSLASH$])
+m4trace:configure.ac:25: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH])
+m4trace:configure.ac:26: -1- AC_CONFIG_HEADERS([include/config.h])
+m4trace:configure.ac:27: -1- AM_MAINTAINER_MODE
+m4trace:configure.ac:27: -1- AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+m4trace:configure.ac:27: -1- AC_SUBST([MAINTAINER_MODE_TRUE])
+m4trace:configure.ac:27: -1- AC_SUBST_TRACE([MAINTAINER_MODE_TRUE])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINTAINER_MODE_TRUE$])
+m4trace:configure.ac:27: -1- AC_SUBST([MAINTAINER_MODE_FALSE])
+m4trace:configure.ac:27: -1- AC_SUBST_TRACE([MAINTAINER_MODE_FALSE])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINTAINER_MODE_FALSE$])
+m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_TRUE])
+m4trace:configure.ac:27: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_FALSE])
+m4trace:configure.ac:27: -1- AC_SUBST([MAINT])
+m4trace:configure.ac:27: -1- AC_SUBST_TRACE([MAINT])
+m4trace:configure.ac:27: -1- m4_pattern_allow([^MAINT$])
+m4trace:configure.ac:29: -1- AC_SUBST([PACKAGE])
+m4trace:configure.ac:29: -1- AC_SUBST_TRACE([PACKAGE])
+m4trace:configure.ac:29: -1- m4_pattern_allow([^PACKAGE$])
+m4trace:configure.ac:30: -1- AC_SUBST([GC_VERSION])
+m4trace:configure.ac:30: -1- AC_SUBST_TRACE([GC_VERSION])
+m4trace:configure.ac:30: -1- m4_pattern_allow([^GC_VERSION$])
+m4trace:configure.ac:32: -1- AM_PROG_CC_C_O
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([CFLAGS])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CFLAGS])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.ac:32: -1- AC_SUBST([LDFLAGS])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([LDFLAGS])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.ac:32: -1- AC_SUBST([LIBS])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:32: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([ac_ct_CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([ac_ct_CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^ac_ct_CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([CC])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:32: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([EXEEXT])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^EXEEXT$])
+m4trace:configure.ac:32: -1- AC_SUBST([OBJEXT], [$ac_cv_objext])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([OBJEXT])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^OBJEXT$])
+m4trace:configure.ac:32: -1- AC_REQUIRE_AUX_FILE([compile])
+m4trace:configure.ac:32: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([DEPDIR])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^DEPDIR$])
+m4trace:configure.ac:32: -1- AC_SUBST([am__include])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([am__include])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__include$])
+m4trace:configure.ac:32: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+m4trace:configure.ac:32: -1- AC_SUBST([AMDEP_TRUE])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([AMDEP_TRUE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEP_TRUE$])
+m4trace:configure.ac:32: -1- AC_SUBST([AMDEP_FALSE])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([AMDEP_FALSE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEP_FALSE$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE])
+m4trace:configure.ac:32: -1- AC_SUBST([AMDEPBACKSLASH])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([AMDEPBACKSLASH])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^AMDEPBACKSLASH$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])
+m4trace:configure.ac:32: -1- AC_SUBST([am__nodep])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([am__nodep])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__nodep$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__nodep])
+m4trace:configure.ac:32: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([CCDEPMODE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^CCDEPMODE$])
+m4trace:configure.ac:32: -1- AM_CONDITIONAL([am__fastdepCC], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:32: -1- AC_SUBST([am__fastdepCC_TRUE])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__fastdepCC_TRUE$])
+m4trace:configure.ac:32: -1- AC_SUBST([am__fastdepCC_FALSE])
+m4trace:configure.ac:32: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE])
+m4trace:configure.ac:32: -1- m4_pattern_allow([^am__fastdepCC_FALSE$])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE])
+m4trace:configure.ac:32: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE])
+m4trace:configure.ac:33: -1- AC_SUBST([CXX])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([CXX])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:33: -1- AC_SUBST([CXXFLAGS])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([CXXFLAGS])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXXFLAGS$])
+m4trace:configure.ac:33: -1- AC_SUBST([LDFLAGS])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([LDFLAGS])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.ac:33: -1- AC_SUBST([LIBS])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:33: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:33: -1- AC_SUBST([CXX])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([CXX])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:33: -1- AC_SUBST([ac_ct_CXX])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([ac_ct_CXX])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^ac_ct_CXX$])
+m4trace:configure.ac:33: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([CXXDEPMODE])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^CXXDEPMODE$])
+m4trace:configure.ac:33: -1- AM_CONDITIONAL([am__fastdepCXX], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:33: -1- AC_SUBST([am__fastdepCXX_TRUE])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$])
+m4trace:configure.ac:33: -1- AC_SUBST([am__fastdepCXX_FALSE])
+m4trace:configure.ac:33: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE])
+m4trace:configure.ac:33: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$])
+m4trace:configure.ac:33: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE])
+m4trace:configure.ac:33: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE])
+m4trace:configure.ac:34: -1- AC_SUBST([CCAS])
+m4trace:configure.ac:34: -1- AC_SUBST_TRACE([CCAS])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCAS$])
+m4trace:configure.ac:34: -1- AC_SUBST([CCASFLAGS])
+m4trace:configure.ac:34: -1- AC_SUBST_TRACE([CCASFLAGS])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCASFLAGS$])
+m4trace:configure.ac:34: -1- AC_SUBST([CCASDEPMODE], [depmode=$am_cv_CCAS_dependencies_compiler_type])
+m4trace:configure.ac:34: -1- AC_SUBST_TRACE([CCASDEPMODE])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^CCASDEPMODE$])
+m4trace:configure.ac:34: -1- AM_CONDITIONAL([am__fastdepCCAS], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3])
+m4trace:configure.ac:34: -1- AC_SUBST([am__fastdepCCAS_TRUE])
+m4trace:configure.ac:34: -1- AC_SUBST_TRACE([am__fastdepCCAS_TRUE])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^am__fastdepCCAS_TRUE$])
+m4trace:configure.ac:34: -1- AC_SUBST([am__fastdepCCAS_FALSE])
+m4trace:configure.ac:34: -1- AC_SUBST_TRACE([am__fastdepCCAS_FALSE])
+m4trace:configure.ac:34: -1- m4_pattern_allow([^am__fastdepCCAS_FALSE$])
+m4trace:configure.ac:34: -1- _AM_SUBST_NOTMAKE([am__fastdepCCAS_TRUE])
+m4trace:configure.ac:34: -1- _AM_SUBST_NOTMAKE([am__fastdepCCAS_FALSE])
+m4trace:configure.ac:36: -1- LT_INIT([disable-static])
+m4trace:configure.ac:36: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])
+m4trace:configure.ac:36: -1- AC_REQUIRE_AUX_FILE([ltmain.sh])
+m4trace:configure.ac:36: -1- AC_SUBST([LIBTOOL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LIBTOOL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LIBTOOL$])
+m4trace:configure.ac:36: -1- AC_SUBST([SED])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([SED])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^SED$])
+m4trace:configure.ac:36: -1- AC_SUBST([GREP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([GREP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.ac:36: -1- AC_SUBST([EGREP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([EGREP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^EGREP$])
+m4trace:configure.ac:36: -1- AC_SUBST([FGREP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([FGREP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^FGREP$])
+m4trace:configure.ac:36: -1- AC_SUBST([GREP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([GREP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.ac:36: -1- AC_SUBST([LD])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LD])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LD$])
+m4trace:configure.ac:36: -1- AC_SUBST([DUMPBIN])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([DUMPBIN])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DUMPBIN$])
+m4trace:configure.ac:36: -1- AC_SUBST([ac_ct_DUMPBIN])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([ac_ct_DUMPBIN])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_DUMPBIN$])
+m4trace:configure.ac:36: -1- AC_SUBST([DUMPBIN])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([DUMPBIN])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DUMPBIN$])
+m4trace:configure.ac:36: -1- AC_SUBST([NM])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([NM])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^NM$])
+m4trace:configure.ac:36: -1- AC_SUBST([LN_S], [$as_ln_s])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LN_S])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LN_S$])
+m4trace:configure.ac:36: -1- AC_SUBST([FILECMD])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([FILECMD])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^FILECMD$])
+m4trace:configure.ac:36: -1- AC_SUBST([OBJDUMP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([OBJDUMP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OBJDUMP$])
+m4trace:configure.ac:36: -1- AC_SUBST([OBJDUMP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([OBJDUMP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OBJDUMP$])
+m4trace:configure.ac:36: -1- AC_SUBST([DLLTOOL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([DLLTOOL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DLLTOOL$])
+m4trace:configure.ac:36: -1- AC_SUBST([DLLTOOL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([DLLTOOL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DLLTOOL$])
+m4trace:configure.ac:36: -1- AC_SUBST([AR])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([AR])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^AR$])
+m4trace:configure.ac:36: -1- AC_SUBST([ac_ct_AR])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([ac_ct_AR])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_AR$])
+m4trace:configure.ac:36: -1- AC_SUBST([STRIP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([STRIP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^STRIP$])
+m4trace:configure.ac:36: -1- AC_SUBST([RANLIB])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([RANLIB])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^RANLIB$])
+m4trace:configure.ac:36: -1- m4_pattern_allow([LT_OBJDIR])
+m4trace:configure.ac:36: -1- AC_DEFINE_TRACE_LITERAL([LT_OBJDIR])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_OBJDIR$])
+m4trace:configure.ac:36: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory where libtool stores uninstalled libraries. */
+@%:@undef LT_OBJDIR])
+m4trace:configure.ac:36: -1- LT_SUPPORTED_TAG([CC])
+m4trace:configure.ac:36: -1- AC_SUBST([MANIFEST_TOOL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([MANIFEST_TOOL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^MANIFEST_TOOL$])
+m4trace:configure.ac:36: -1- AC_SUBST([DSYMUTIL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([DSYMUTIL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^DSYMUTIL$])
+m4trace:configure.ac:36: -1- AC_SUBST([NMEDIT])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([NMEDIT])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^NMEDIT$])
+m4trace:configure.ac:36: -1- AC_SUBST([LIPO])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LIPO])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LIPO$])
+m4trace:configure.ac:36: -1- AC_SUBST([OTOOL])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([OTOOL])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OTOOL$])
+m4trace:configure.ac:36: -1- AC_SUBST([OTOOL64])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([OTOOL64])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^OTOOL64$])
+m4trace:configure.ac:36: -1- AC_SUBST([LT_SYS_LIBRARY_PATH])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LT_SYS_LIBRARY_PATH])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the <dlfcn.h> header file. */
+@%:@undef HAVE_DLFCN_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_STDIO_H], [/* Define to 1 if you have the <stdio.h> header file. */
+@%:@undef HAVE_STDIO_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
+@%:@undef HAVE_STDLIB_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
+@%:@undef HAVE_STRING_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */
+@%:@undef HAVE_INTTYPES_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */
+@%:@undef HAVE_STDINT_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */
+@%:@undef HAVE_STRINGS_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */
+@%:@undef HAVE_SYS_STAT_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */
+@%:@undef HAVE_SYS_TYPES_H])
+m4trace:configure.ac:36: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
+@%:@undef HAVE_UNISTD_H])
+m4trace:configure.ac:36: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^STDC_HEADERS$])
+m4trace:configure.ac:36: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if all of the C90 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
+@%:@undef STDC_HEADERS])
+m4trace:configure.ac:36: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^HAVE_DLFCN_H$])
+m4trace:configure.ac:36: -1- LT_SUPPORTED_TAG([CXX])
+m4trace:configure.ac:36: -1- AC_SUBST([CXXCPP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXXCPP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXCPP$])
+m4trace:configure.ac:36: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:36: -1- AC_SUBST([CXXCPP])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXXCPP])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXCPP$])
+m4trace:configure.ac:36: -1- AC_SUBST([LD])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LD])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LD$])
+m4trace:configure.ac:36: -1- AC_SUBST([LT_SYS_LIBRARY_PATH])
+m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LT_SYS_LIBRARY_PATH])
+m4trace:configure.ac:36: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$])
+m4trace:configure.ac:93: -1- AM_CONDITIONAL([EMSCRIPTEN], [test x$emscripten = xyes])
+m4trace:configure.ac:93: -1- AC_SUBST([EMSCRIPTEN_TRUE])
+m4trace:configure.ac:93: -1- AC_SUBST_TRACE([EMSCRIPTEN_TRUE])
+m4trace:configure.ac:93: -1- m4_pattern_allow([^EMSCRIPTEN_TRUE$])
+m4trace:configure.ac:93: -1- AC_SUBST([EMSCRIPTEN_FALSE])
+m4trace:configure.ac:93: -1- AC_SUBST_TRACE([EMSCRIPTEN_FALSE])
+m4trace:configure.ac:93: -1- m4_pattern_allow([^EMSCRIPTEN_FALSE$])
+m4trace:configure.ac:93: -1- _AM_SUBST_NOTMAKE([EMSCRIPTEN_TRUE])
+m4trace:configure.ac:93: -1- _AM_SUBST_NOTMAKE([EMSCRIPTEN_FALSE])
+m4trace:configure.ac:107: -1- AC_SUBST([GC_CFLAGS])
+m4trace:configure.ac:107: -1- AC_SUBST_TRACE([GC_CFLAGS])
+m4trace:configure.ac:107: -1- m4_pattern_allow([^GC_CFLAGS$])
+m4trace:configure.ac:110: -1- AC_SUBST([CFLAGS_EXTRA])
+m4trace:configure.ac:110: -1- AC_SUBST_TRACE([CFLAGS_EXTRA])
+m4trace:configure.ac:110: -1- m4_pattern_allow([^CFLAGS_EXTRA$])
+m4trace:configure.ac:157: -1- AC_DEFINE_TRACE_LITERAL([GC_NO_THREADS_DISCOVERY])
+m4trace:configure.ac:157: -1- m4_pattern_allow([^GC_NO_THREADS_DISCOVERY$])
+m4trace:configure.ac:157: -1- AH_OUTPUT([GC_NO_THREADS_DISCOVERY], [/* Disable threads discovery in GC. */
+@%:@undef GC_NO_THREADS_DISCOVERY])
+m4trace:configure.ac:165: -1- AH_OUTPUT([PARALLEL_MARK], [/* Define to enable parallel marking. */
+@%:@undef PARALLEL_MARK])
+m4trace:configure.ac:166: -1- AH_OUTPUT([THREAD_LOCAL_ALLOC], [/* Define to enable thread-local allocation optimization. */
+@%:@undef THREAD_LOCAL_ALLOC])
+m4trace:configure.ac:168: -1- AH_OUTPUT([USE_COMPILER_TLS], [/* Define to use of compiler-support for thread-local variables. */
+@%:@undef USE_COMPILER_TLS])
+m4trace:configure.ac:172: -1- AH_OUTPUT([GC_THREADS], [/* Define to support platform-specific threads. */
+@%:@undef GC_THREADS])
+m4trace:configure.ac:174: -1- AH_OUTPUT([GC_WIN32_PTHREADS], [/* Define to support pthreads-win32 or winpthreads. */
+@%:@undef GC_WIN32_PTHREADS])
+m4trace:configure.ac:178: -1- AH_OUTPUT([_POSIX_C_SOURCE], [/* The POSIX feature macro. */
+@%:@undef _POSIX_C_SOURCE])
+m4trace:configure.ac:179: -1- AH_OUTPUT([_PTHREADS], [/* Indicates the use of pthreads (NetBSD). */
+@%:@undef _PTHREADS])
+m4trace:configure.ac:182: -1- AH_OUTPUT([GC_UNDERSCORE_STDCALL], [/* Explicitly prefix exported/imported WINAPI symbols with \'_\'. */
+@%:@undef GC_UNDERSCORE_STDCALL])
+m4trace:configure.ac:184: -1- AH_OUTPUT([UNICODE], [/* Use Unicode (W) variant of Win32 API instead of ASCII (A) one. */
+@%:@undef UNICODE])
+m4trace:configure.ac:188: -1- AH_OUTPUT([GC_DLL], [/* Define to build dynamic libraries with only API symbols exposed. */
+@%:@undef GC_DLL])
+m4trace:configure.ac:194: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler
+ calls it, or to nothing if \'inline\' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif])
+m4trace:configure.ac:217: -1- AC_DEFINE_TRACE_LITERAL([GC_THREADS])
+m4trace:configure.ac:217: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:218: -1- AC_DEFINE_TRACE_LITERAL([_REENTRANT])
+m4trace:configure.ac:218: -1- m4_pattern_allow([^_REENTRANT$])
+m4trace:configure.ac:218: -1- AH_OUTPUT([_REENTRANT], [/* Required define if using POSIX threads. */
+@%:@undef _REENTRANT])
+m4trace:configure.ac:230: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_C_SOURCE])
+m4trace:configure.ac:230: -1- m4_pattern_allow([^_POSIX_C_SOURCE$])
+m4trace:configure.ac:251: -1- AC_DEFINE_TRACE_LITERAL([_PTHREADS])
+m4trace:configure.ac:251: -1- m4_pattern_allow([^_PTHREADS$])
+m4trace:configure.ac:266: -1- AC_DEFINE_TRACE_LITERAL([GC_WIN32_PTHREADS])
+m4trace:configure.ac:266: -1- m4_pattern_allow([^GC_WIN32_PTHREADS$])
+m4trace:configure.ac:297: -1- AC_DEFINE_TRACE_LITERAL([GC_THREADS])
+m4trace:configure.ac:297: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:305: -1- AC_DEFINE_TRACE_LITERAL([GC_INSIDE_DLL])
+m4trace:configure.ac:305: -1- m4_pattern_allow([^GC_INSIDE_DLL$])
+m4trace:configure.ac:305: -1- AH_OUTPUT([GC_INSIDE_DLL], [/* Enable Win32 DllMain-based approach of threads registering. */
+@%:@undef GC_INSIDE_DLL])
+m4trace:configure.ac:309: -1- AC_DEFINE_TRACE_LITERAL([EMPTY_GETENV_RESULTS])
+m4trace:configure.ac:309: -1- m4_pattern_allow([^EMPTY_GETENV_RESULTS$])
+m4trace:configure.ac:309: -1- AH_OUTPUT([EMPTY_GETENV_RESULTS], [/* Wine getenv may not return NULL for missing entry. */
+@%:@undef EMPTY_GETENV_RESULTS])
+m4trace:configure.ac:313: -1- AC_DEFINE_TRACE_LITERAL([GC_THREADS])
+m4trace:configure.ac:313: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:324: -1- AC_DEFINE_TRACE_LITERAL([GC_THREADS])
+m4trace:configure.ac:324: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:325: -1- AC_DEFINE_TRACE_LITERAL([_REENTRANT])
+m4trace:configure.ac:325: -1- m4_pattern_allow([^_REENTRANT$])
+m4trace:configure.ac:331: -1- AC_DEFINE_TRACE_LITERAL([GC_THREADS])
+m4trace:configure.ac:331: -1- m4_pattern_allow([^GC_THREADS$])
+m4trace:configure.ac:356: -1- AC_SUBST([THREADDLLIBS])
+m4trace:configure.ac:356: -1- AC_SUBST_TRACE([THREADDLLIBS])
+m4trace:configure.ac:356: -1- m4_pattern_allow([^THREADDLLIBS$])
+m4trace:configure.ac:358: -1- AM_CONDITIONAL([THREADS], [test x$THREADS != xnone])
+m4trace:configure.ac:358: -1- AC_SUBST([THREADS_TRUE])
+m4trace:configure.ac:358: -1- AC_SUBST_TRACE([THREADS_TRUE])
+m4trace:configure.ac:358: -1- m4_pattern_allow([^THREADS_TRUE$])
+m4trace:configure.ac:358: -1- AC_SUBST([THREADS_FALSE])
+m4trace:configure.ac:358: -1- AC_SUBST_TRACE([THREADS_FALSE])
+m4trace:configure.ac:358: -1- m4_pattern_allow([^THREADS_FALSE$])
+m4trace:configure.ac:358: -1- _AM_SUBST_NOTMAKE([THREADS_TRUE])
+m4trace:configure.ac:358: -1- _AM_SUBST_NOTMAKE([THREADS_FALSE])
+m4trace:configure.ac:359: -1- AM_CONDITIONAL([PTHREADS], [test x$THREADS = xposix])
+m4trace:configure.ac:359: -1- AC_SUBST([PTHREADS_TRUE])
+m4trace:configure.ac:359: -1- AC_SUBST_TRACE([PTHREADS_TRUE])
+m4trace:configure.ac:359: -1- m4_pattern_allow([^PTHREADS_TRUE$])
+m4trace:configure.ac:359: -1- AC_SUBST([PTHREADS_FALSE])
+m4trace:configure.ac:359: -1- AC_SUBST_TRACE([PTHREADS_FALSE])
+m4trace:configure.ac:359: -1- m4_pattern_allow([^PTHREADS_FALSE$])
+m4trace:configure.ac:359: -1- _AM_SUBST_NOTMAKE([PTHREADS_TRUE])
+m4trace:configure.ac:359: -1- _AM_SUBST_NOTMAKE([PTHREADS_FALSE])
+m4trace:configure.ac:360: -1- AM_CONDITIONAL([DARWIN_THREADS], [test x$darwin_threads = xtrue])
+m4trace:configure.ac:360: -1- AC_SUBST([DARWIN_THREADS_TRUE])
+m4trace:configure.ac:360: -1- AC_SUBST_TRACE([DARWIN_THREADS_TRUE])
+m4trace:configure.ac:360: -1- m4_pattern_allow([^DARWIN_THREADS_TRUE$])
+m4trace:configure.ac:360: -1- AC_SUBST([DARWIN_THREADS_FALSE])
+m4trace:configure.ac:360: -1- AC_SUBST_TRACE([DARWIN_THREADS_FALSE])
+m4trace:configure.ac:360: -1- m4_pattern_allow([^DARWIN_THREADS_FALSE$])
+m4trace:configure.ac:360: -1- _AM_SUBST_NOTMAKE([DARWIN_THREADS_TRUE])
+m4trace:configure.ac:360: -1- _AM_SUBST_NOTMAKE([DARWIN_THREADS_FALSE])
+m4trace:configure.ac:361: -1- AM_CONDITIONAL([WIN32_THREADS], [test x$win32_threads = xtrue])
+m4trace:configure.ac:361: -1- AC_SUBST([WIN32_THREADS_TRUE])
+m4trace:configure.ac:361: -1- AC_SUBST_TRACE([WIN32_THREADS_TRUE])
+m4trace:configure.ac:361: -1- m4_pattern_allow([^WIN32_THREADS_TRUE$])
+m4trace:configure.ac:361: -1- AC_SUBST([WIN32_THREADS_FALSE])
+m4trace:configure.ac:361: -1- AC_SUBST_TRACE([WIN32_THREADS_FALSE])
+m4trace:configure.ac:361: -1- m4_pattern_allow([^WIN32_THREADS_FALSE$])
+m4trace:configure.ac:361: -1- _AM_SUBST_NOTMAKE([WIN32_THREADS_TRUE])
+m4trace:configure.ac:361: -1- _AM_SUBST_NOTMAKE([WIN32_THREADS_FALSE])
+m4trace:configure.ac:382: -1- AC_DEFINE_TRACE_LITERAL([GC_READ_ENV_FILE])
+m4trace:configure.ac:382: -1- m4_pattern_allow([^GC_READ_ENV_FILE$])
+m4trace:configure.ac:382: -1- AH_OUTPUT([GC_READ_ENV_FILE], [/* Read environment variables from the GC \'env\' file. */
+@%:@undef GC_READ_ENV_FILE])
+m4trace:configure.ac:387: -1- AM_CONDITIONAL([PTHREAD_START_STANDALONE], [test x$pthread_start_standalone = xyes])
+m4trace:configure.ac:387: -1- AC_SUBST([PTHREAD_START_STANDALONE_TRUE])
+m4trace:configure.ac:387: -1- AC_SUBST_TRACE([PTHREAD_START_STANDALONE_TRUE])
+m4trace:configure.ac:387: -1- m4_pattern_allow([^PTHREAD_START_STANDALONE_TRUE$])
+m4trace:configure.ac:387: -1- AC_SUBST([PTHREAD_START_STANDALONE_FALSE])
+m4trace:configure.ac:387: -1- AC_SUBST_TRACE([PTHREAD_START_STANDALONE_FALSE])
+m4trace:configure.ac:387: -1- m4_pattern_allow([^PTHREAD_START_STANDALONE_FALSE$])
+m4trace:configure.ac:387: -1- _AM_SUBST_NOTMAKE([PTHREAD_START_STANDALONE_TRUE])
+m4trace:configure.ac:387: -1- _AM_SUBST_NOTMAKE([PTHREAD_START_STANDALONE_FALSE])
+m4trace:configure.ac:422: -1- AC_DEFINE_TRACE_LITERAL([DARWIN_DONT_PARSE_STACK])
+m4trace:configure.ac:422: -1- m4_pattern_allow([^DARWIN_DONT_PARSE_STACK$])
+m4trace:configure.ac:422: -1- AH_OUTPUT([DARWIN_DONT_PARSE_STACK], [/* See doc/README.macros. */
+@%:@undef DARWIN_DONT_PARSE_STACK])
+m4trace:configure.ac:427: -1- AM_CONDITIONAL([ASM_WITH_CPP_UNSUPPORTED], [test $compiler_xlc = yes -o $compiler_suncc = yes])
+m4trace:configure.ac:427: -1- AC_SUBST([ASM_WITH_CPP_UNSUPPORTED_TRUE])
+m4trace:configure.ac:427: -1- AC_SUBST_TRACE([ASM_WITH_CPP_UNSUPPORTED_TRUE])
+m4trace:configure.ac:427: -1- m4_pattern_allow([^ASM_WITH_CPP_UNSUPPORTED_TRUE$])
+m4trace:configure.ac:427: -1- AC_SUBST([ASM_WITH_CPP_UNSUPPORTED_FALSE])
+m4trace:configure.ac:427: -1- AC_SUBST_TRACE([ASM_WITH_CPP_UNSUPPORTED_FALSE])
+m4trace:configure.ac:427: -1- m4_pattern_allow([^ASM_WITH_CPP_UNSUPPORTED_FALSE$])
+m4trace:configure.ac:427: -1- _AM_SUBST_NOTMAKE([ASM_WITH_CPP_UNSUPPORTED_TRUE])
+m4trace:configure.ac:427: -1- _AM_SUBST_NOTMAKE([ASM_WITH_CPP_UNSUPPORTED_FALSE])
+m4trace:configure.ac:455: -1- AC_DEFINE_TRACE_LITERAL([NO_GETCONTEXT])
+m4trace:configure.ac:455: -1- m4_pattern_allow([^NO_GETCONTEXT$])
+m4trace:configure.ac:455: -1- AH_OUTPUT([NO_GETCONTEXT], [/* Missing getcontext function. */
+@%:@undef NO_GETCONTEXT])
+m4trace:configure.ac:459: -1- AH_OUTPUT([HAVE_DL_ITERATE_PHDR], [/* Define to 1 if you have the `dl_iterate_phdr\' function. */
+@%:@undef HAVE_DL_ITERATE_PHDR])
+m4trace:configure.ac:459: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DL_ITERATE_PHDR])
+m4trace:configure.ac:459: -1- m4_pattern_allow([^HAVE_DL_ITERATE_PHDR$])
+m4trace:configure.ac:481: -1- AM_CONDITIONAL([AVOID_CPP_LIB], [test $avoid_cpp_lib = yes])
+m4trace:configure.ac:481: -1- AC_SUBST([AVOID_CPP_LIB_TRUE])
+m4trace:configure.ac:481: -1- AC_SUBST_TRACE([AVOID_CPP_LIB_TRUE])
+m4trace:configure.ac:481: -1- m4_pattern_allow([^AVOID_CPP_LIB_TRUE$])
+m4trace:configure.ac:481: -1- AC_SUBST([AVOID_CPP_LIB_FALSE])
+m4trace:configure.ac:481: -1- AC_SUBST_TRACE([AVOID_CPP_LIB_FALSE])
+m4trace:configure.ac:481: -1- m4_pattern_allow([^AVOID_CPP_LIB_FALSE$])
+m4trace:configure.ac:481: -1- _AM_SUBST_NOTMAKE([AVOID_CPP_LIB_TRUE])
+m4trace:configure.ac:481: -1- _AM_SUBST_NOTMAKE([AVOID_CPP_LIB_FALSE])
+m4trace:configure.ac:484: -1- AC_DEFINE_TRACE_LITERAL([GC_MISSING_EXECINFO_H])
+m4trace:configure.ac:484: -1- m4_pattern_allow([^GC_MISSING_EXECINFO_H$])
+m4trace:configure.ac:484: -1- AH_OUTPUT([GC_MISSING_EXECINFO_H], [/* Missing execinfo.h header. */
+@%:@undef GC_MISSING_EXECINFO_H])
+m4trace:configure.ac:493: -1- AC_SUBST([extra_ldflags_libgc])
+m4trace:configure.ac:493: -1- AC_SUBST_TRACE([extra_ldflags_libgc])
+m4trace:configure.ac:493: -1- m4_pattern_allow([^extra_ldflags_libgc$])
+m4trace:configure.ac:495: -1- AC_SUBST([EXTRA_TEST_LIBS])
+m4trace:configure.ac:495: -1- AC_SUBST_TRACE([EXTRA_TEST_LIBS])
+m4trace:configure.ac:495: -1- m4_pattern_allow([^EXTRA_TEST_LIBS$])
+m4trace:configure.ac:498: -1- AC_SUBST([target_all])
+m4trace:configure.ac:498: -1- AC_SUBST_TRACE([target_all])
+m4trace:configure.ac:498: -1- m4_pattern_allow([^target_all$])
+m4trace:configure.ac:518: -1- AC_DEFINE_TRACE_LITERAL([ECOS])
+m4trace:configure.ac:518: -1- m4_pattern_allow([^ECOS$])
+m4trace:configure.ac:518: -1- AH_OUTPUT([ECOS], [/* Define to enable eCos target support. */
+@%:@undef ECOS])
+m4trace:configure.ac:524: -1- AM_CONDITIONAL([CPLUSPLUS], [test "${enable_cplusplus}" = yes])
+m4trace:configure.ac:524: -1- AC_SUBST([CPLUSPLUS_TRUE])
+m4trace:configure.ac:524: -1- AC_SUBST_TRACE([CPLUSPLUS_TRUE])
+m4trace:configure.ac:524: -1- m4_pattern_allow([^CPLUSPLUS_TRUE$])
+m4trace:configure.ac:524: -1- AC_SUBST([CPLUSPLUS_FALSE])
+m4trace:configure.ac:524: -1- AC_SUBST_TRACE([CPLUSPLUS_FALSE])
+m4trace:configure.ac:524: -1- m4_pattern_allow([^CPLUSPLUS_FALSE$])
+m4trace:configure.ac:524: -1- _AM_SUBST_NOTMAKE([CPLUSPLUS_TRUE])
+m4trace:configure.ac:524: -1- _AM_SUBST_NOTMAKE([CPLUSPLUS_FALSE])
+m4trace:configure.ac:529: -1- AM_CONDITIONAL([GC_TBA_LIBRARY], [test "${enable_cplusplus}" = yes \
+ -a "${enable_throw_bad_alloc_library}" != no])
+m4trace:configure.ac:529: -1- AC_SUBST([GC_TBA_LIBRARY_TRUE])
+m4trace:configure.ac:529: -1- AC_SUBST_TRACE([GC_TBA_LIBRARY_TRUE])
+m4trace:configure.ac:529: -1- m4_pattern_allow([^GC_TBA_LIBRARY_TRUE$])
+m4trace:configure.ac:529: -1- AC_SUBST([GC_TBA_LIBRARY_FALSE])
+m4trace:configure.ac:529: -1- AC_SUBST_TRACE([GC_TBA_LIBRARY_FALSE])
+m4trace:configure.ac:529: -1- m4_pattern_allow([^GC_TBA_LIBRARY_FALSE$])
+m4trace:configure.ac:529: -1- _AM_SUBST_NOTMAKE([GC_TBA_LIBRARY_TRUE])
+m4trace:configure.ac:529: -1- _AM_SUBST_NOTMAKE([GC_TBA_LIBRARY_FALSE])
+m4trace:configure.ac:550: -1- AC_SUBST([CXX])
+m4trace:configure.ac:550: -1- AC_SUBST_TRACE([CXX])
+m4trace:configure.ac:550: -1- m4_pattern_allow([^CXX$])
+m4trace:configure.ac:551: -1- AC_SUBST([AM_CFLAGS])
+m4trace:configure.ac:551: -1- AC_SUBST_TRACE([AM_CFLAGS])
+m4trace:configure.ac:551: -1- m4_pattern_allow([^AM_CFLAGS$])
+m4trace:configure.ac:552: -1- AC_SUBST([AM_CPPFLAGS])
+m4trace:configure.ac:552: -1- AC_SUBST_TRACE([AM_CPPFLAGS])
+m4trace:configure.ac:552: -1- m4_pattern_allow([^AM_CPPFLAGS$])
+m4trace:configure.ac:553: -1- AC_SUBST([CXXLIBS])
+m4trace:configure.ac:553: -1- AC_SUBST_TRACE([CXXLIBS])
+m4trace:configure.ac:553: -1- m4_pattern_allow([^CXXLIBS$])
+m4trace:configure.ac:572: -1- AC_DEFINE_TRACE_LITERAL([GC_DLL])
+m4trace:configure.ac:572: -1- m4_pattern_allow([^GC_DLL$])
+m4trace:configure.ac:590: -1- AC_DEFINE_TRACE_LITERAL([DONT_USE_USER32_DLL])
+m4trace:configure.ac:590: -1- m4_pattern_allow([^DONT_USE_USER32_DLL$])
+m4trace:configure.ac:590: -1- AH_OUTPUT([DONT_USE_USER32_DLL], [/* Do not use user32.dll import library (Win32). */
+@%:@undef DONT_USE_USER32_DLL])
+m4trace:configure.ac:613: -1- AC_DEFINE_TRACE_LITERAL([SOLARIS25_PROC_VDB_BUG_FIXED])
+m4trace:configure.ac:613: -1- m4_pattern_allow([^SOLARIS25_PROC_VDB_BUG_FIXED$])
+m4trace:configure.ac:613: -1- AH_OUTPUT([SOLARIS25_PROC_VDB_BUG_FIXED], [/* See the comment in gcconfig.h. */
+@%:@undef SOLARIS25_PROC_VDB_BUG_FIXED])
+m4trace:configure.ac:627: -1- AC_DEFINE_TRACE_LITERAL([SUNOS53_SHARED_LIB])
+m4trace:configure.ac:627: -1- m4_pattern_allow([^SUNOS53_SHARED_LIB$])
+m4trace:configure.ac:627: -1- AH_OUTPUT([SUNOS53_SHARED_LIB], [/* Define to work around a Solaris 5.3 bug (see dyn_load.c). */
+@%:@undef SUNOS53_SHARED_LIB])
+m4trace:configure.ac:640: -1- AC_SUBST([addobjs])
+m4trace:configure.ac:640: -1- AC_SUBST_TRACE([addobjs])
+m4trace:configure.ac:640: -1- m4_pattern_allow([^addobjs$])
+m4trace:configure.ac:641: -1- AC_SUBST([addlibs])
+m4trace:configure.ac:641: -1- AC_SUBST_TRACE([addlibs])
+m4trace:configure.ac:641: -1- m4_pattern_allow([^addlibs$])
+m4trace:configure.ac:643: -1- LT_INIT
+m4trace:configure.ac:704: -1- AC_DEFINE_TRACE_LITERAL([NO_EXECUTE_PERMISSION])
+m4trace:configure.ac:704: -1- m4_pattern_allow([^NO_EXECUTE_PERMISSION$])
+m4trace:configure.ac:704: -1- AH_OUTPUT([NO_EXECUTE_PERMISSION], [/* Define to make the collector not allocate executable memory by default. */
+@%:@undef NO_EXECUTE_PERMISSION])
+m4trace:configure.ac:707: -1- AC_DEFINE_TRACE_LITERAL([ALL_INTERIOR_POINTERS])
+m4trace:configure.ac:707: -1- m4_pattern_allow([^ALL_INTERIOR_POINTERS$])
+m4trace:configure.ac:707: -1- AH_OUTPUT([ALL_INTERIOR_POINTERS], [/* Define to recognise all pointers to the interior of objects. */
+@%:@undef ALL_INTERIOR_POINTERS])
+m4trace:configure.ac:718: -1- AC_DEFINE_TRACE_LITERAL([GC_GCJ_SUPPORT])
+m4trace:configure.ac:718: -1- m4_pattern_allow([^GC_GCJ_SUPPORT$])
+m4trace:configure.ac:718: -1- AH_OUTPUT([GC_GCJ_SUPPORT], [/* Define to include support for gcj. */
+@%:@undef GC_GCJ_SUPPORT])
+m4trace:configure.ac:724: -1- AC_DEFINE_TRACE_LITERAL([GC_ENABLE_SUSPEND_THREAD])
+m4trace:configure.ac:724: -1- m4_pattern_allow([^GC_ENABLE_SUSPEND_THREAD$])
+m4trace:configure.ac:728: -1- AC_DEFINE_TRACE_LITERAL([GC_ENABLE_SUSPEND_THREAD])
+m4trace:configure.ac:728: -1- m4_pattern_allow([^GC_ENABLE_SUSPEND_THREAD$])
+m4trace:configure.ac:728: -1- AH_OUTPUT([GC_ENABLE_SUSPEND_THREAD], [/* Define to turn on GC_suspend_thread support. */
+@%:@undef GC_ENABLE_SUSPEND_THREAD])
+m4trace:configure.ac:733: -1- AM_CONDITIONAL([ENABLE_GCJ_SUPPORT], [test x"enable_gcj_support" != xno])
+m4trace:configure.ac:733: -1- AC_SUBST([ENABLE_GCJ_SUPPORT_TRUE])
+m4trace:configure.ac:733: -1- AC_SUBST_TRACE([ENABLE_GCJ_SUPPORT_TRUE])
+m4trace:configure.ac:733: -1- m4_pattern_allow([^ENABLE_GCJ_SUPPORT_TRUE$])
+m4trace:configure.ac:733: -1- AC_SUBST([ENABLE_GCJ_SUPPORT_FALSE])
+m4trace:configure.ac:733: -1- AC_SUBST_TRACE([ENABLE_GCJ_SUPPORT_FALSE])
+m4trace:configure.ac:733: -1- m4_pattern_allow([^ENABLE_GCJ_SUPPORT_FALSE$])
+m4trace:configure.ac:733: -1- _AM_SUBST_NOTMAKE([ENABLE_GCJ_SUPPORT_TRUE])
+m4trace:configure.ac:733: -1- _AM_SUBST_NOTMAKE([ENABLE_GCJ_SUPPORT_FALSE])
+m4trace:configure.ac:740: -1- AC_DEFINE_TRACE_LITERAL([GC_USESIGRT_SIGNALS])
+m4trace:configure.ac:740: -1- m4_pattern_allow([^GC_USESIGRT_SIGNALS$])
+m4trace:configure.ac:740: -1- AH_OUTPUT([GC_USESIGRT_SIGNALS], [/* Force the GC to use signals based on SIGRTMIN+k. */
+@%:@undef GC_USESIGRT_SIGNALS])
+m4trace:configure.ac:748: -1- AH_OUTPUT([GC_HAVE_BUILTIN_BACKTRACE], [/* Define if backtrace information is supported. */
+@%:@undef GC_HAVE_BUILTIN_BACKTRACE])
+m4trace:configure.ac:750: -1- AH_OUTPUT([MAKE_BACK_GRAPH], [/* See doc/README.macros. */
+@%:@undef MAKE_BACK_GRAPH])
+m4trace:configure.ac:751: -1- AH_OUTPUT([SAVE_CALL_COUNT], [/* The number of caller frames saved when allocating with the debugging API.
+ */
+@%:@undef SAVE_CALL_COUNT])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([KEEP_BACK_PTRS])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^KEEP_BACK_PTRS$])
+m4trace:configure.ac:755: -1- AH_OUTPUT([KEEP_BACK_PTRS], [/* Define to save back-pointers in debugging headers. */
+@%:@undef KEEP_BACK_PTRS])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([DBG_HDRS_ALL])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^DBG_HDRS_ALL$])
+m4trace:configure.ac:755: -1- AH_OUTPUT([DBG_HDRS_ALL], [/* Define to force debug headers on all objects. */
+@%:@undef DBG_HDRS_ALL])
+m4trace:configure.ac:755: -1- AH_OUTPUT([SHORT_DBG_HDRS], [/* Shorten the headers to minimize object size at the expense of checking for
+ writes past the end (see doc/README.macros). */
+@%:@undef SHORT_DBG_HDRS])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([MAKE_BACK_GRAPH])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([SAVE_CALL_COUNT])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^SAVE_CALL_COUNT$])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([GC_HAVE_BUILTIN_BACKTRACE])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^GC_HAVE_BUILTIN_BACKTRACE$])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([MAKE_BACK_GRAPH])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([SAVE_CALL_COUNT])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^SAVE_CALL_COUNT$])
+m4trace:configure.ac:755: -1- AC_DEFINE_TRACE_LITERAL([MAKE_BACK_GRAPH])
+m4trace:configure.ac:755: -1- m4_pattern_allow([^MAKE_BACK_GRAPH$])
+m4trace:configure.ac:789: -1- AM_CONDITIONAL([MAKE_BACK_GRAPH], [test x"$enable_gc_debug" = xyes])
+m4trace:configure.ac:789: -1- AC_SUBST([MAKE_BACK_GRAPH_TRUE])
+m4trace:configure.ac:789: -1- AC_SUBST_TRACE([MAKE_BACK_GRAPH_TRUE])
+m4trace:configure.ac:789: -1- m4_pattern_allow([^MAKE_BACK_GRAPH_TRUE$])
+m4trace:configure.ac:789: -1- AC_SUBST([MAKE_BACK_GRAPH_FALSE])
+m4trace:configure.ac:789: -1- AC_SUBST_TRACE([MAKE_BACK_GRAPH_FALSE])
+m4trace:configure.ac:789: -1- m4_pattern_allow([^MAKE_BACK_GRAPH_FALSE$])
+m4trace:configure.ac:789: -1- _AM_SUBST_NOTMAKE([MAKE_BACK_GRAPH_TRUE])
+m4trace:configure.ac:789: -1- _AM_SUBST_NOTMAKE([MAKE_BACK_GRAPH_FALSE])
+m4trace:configure.ac:790: -1- AM_CONDITIONAL([KEEP_BACK_PTRS], [test x"$keep_back_ptrs" = xtrue])
+m4trace:configure.ac:790: -1- AC_SUBST([KEEP_BACK_PTRS_TRUE])
+m4trace:configure.ac:790: -1- AC_SUBST_TRACE([KEEP_BACK_PTRS_TRUE])
+m4trace:configure.ac:790: -1- m4_pattern_allow([^KEEP_BACK_PTRS_TRUE$])
+m4trace:configure.ac:790: -1- AC_SUBST([KEEP_BACK_PTRS_FALSE])
+m4trace:configure.ac:790: -1- AC_SUBST_TRACE([KEEP_BACK_PTRS_FALSE])
+m4trace:configure.ac:790: -1- m4_pattern_allow([^KEEP_BACK_PTRS_FALSE$])
+m4trace:configure.ac:790: -1- _AM_SUBST_NOTMAKE([KEEP_BACK_PTRS_TRUE])
+m4trace:configure.ac:790: -1- _AM_SUBST_NOTMAKE([KEEP_BACK_PTRS_FALSE])
+m4trace:configure.ac:822: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLADDR])
+m4trace:configure.ac:822: -1- m4_pattern_allow([^HAVE_DLADDR$])
+m4trace:configure.ac:822: -1- AH_OUTPUT([HAVE_DLADDR], [/* Define to use \'dladdr\' function. */
+@%:@undef HAVE_DLADDR])
+m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([GC_NO_SIGSETJMP])
+m4trace:configure.ac:829: -1- m4_pattern_allow([^GC_NO_SIGSETJMP$])
+m4trace:configure.ac:829: -1- AH_OUTPUT([GC_NO_SIGSETJMP], [/* Missing sigsetjmp function. */
+@%:@undef GC_NO_SIGSETJMP])
+m4trace:configure.ac:834: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID$])
+m4trace:configure.ac:834: -1- AH_OUTPUT([HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID], [/* Define to use \'pthread_setname_np(const char*)\' function. */
+@%:@undef HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID])
+m4trace:configure.ac:834: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG$])
+m4trace:configure.ac:834: -1- AH_OUTPUT([HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG], [/* Define to use \'pthread_setname_np(pthread_t, const char*, void *)\'
+ function. */
+@%:@undef HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG])
+m4trace:configure.ac:834: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD_SETNAME_NP_WITH_TID])
+m4trace:configure.ac:834: -1- m4_pattern_allow([^HAVE_PTHREAD_SETNAME_NP_WITH_TID$])
+m4trace:configure.ac:834: -1- AH_OUTPUT([HAVE_PTHREAD_SETNAME_NP_WITH_TID], [/* Define to use \'pthread_setname_np(pthread_t, const char*)\' function. */
+@%:@undef HAVE_PTHREAD_SETNAME_NP_WITH_TID])
+m4trace:configure.ac:877: -1- AC_SUBST([CFLAGS])
+m4trace:configure.ac:877: -1- AC_SUBST_TRACE([CFLAGS])
+m4trace:configure.ac:877: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.ac:878: -1- AC_SUBST([CXXFLAGS])
+m4trace:configure.ac:878: -1- AC_SUBST_TRACE([CXXFLAGS])
+m4trace:configure.ac:878: -1- m4_pattern_allow([^CXXFLAGS$])
+m4trace:configure.ac:885: -1- AC_DEFINE_TRACE_LITERAL([JAVA_FINALIZATION])
+m4trace:configure.ac:885: -1- m4_pattern_allow([^JAVA_FINALIZATION$])
+m4trace:configure.ac:885: -1- AH_OUTPUT([JAVA_FINALIZATION], [/* See doc/README.macros. */
+@%:@undef JAVA_FINALIZATION])
+m4trace:configure.ac:892: -1- AC_DEFINE_TRACE_LITERAL([GC_ATOMIC_UNCOLLECTABLE])
+m4trace:configure.ac:892: -1- m4_pattern_allow([^GC_ATOMIC_UNCOLLECTABLE$])
+m4trace:configure.ac:892: -1- AH_OUTPUT([GC_ATOMIC_UNCOLLECTABLE], [/* Define to enable atomic uncollectible allocation. */
+@%:@undef GC_ATOMIC_UNCOLLECTABLE])
+m4trace:configure.ac:902: -1- AC_DEFINE_TRACE_LITERAL([REDIRECT_MALLOC])
+m4trace:configure.ac:902: -1- m4_pattern_allow([^REDIRECT_MALLOC$])
+m4trace:configure.ac:902: -1- AH_OUTPUT([REDIRECT_MALLOC], [/* If defined, redirect malloc to this function. */
+@%:@undef REDIRECT_MALLOC])
+m4trace:configure.ac:904: -1- AC_DEFINE_TRACE_LITERAL([REDIRECT_REALLOC])
+m4trace:configure.ac:904: -1- m4_pattern_allow([^REDIRECT_REALLOC$])
+m4trace:configure.ac:904: -1- AH_OUTPUT([REDIRECT_REALLOC], [/* If defined, redirect GC_realloc to this function. */
+@%:@undef REDIRECT_REALLOC])
+m4trace:configure.ac:906: -1- AC_DEFINE_TRACE_LITERAL([REDIRECT_FREE])
+m4trace:configure.ac:906: -1- m4_pattern_allow([^REDIRECT_FREE$])
+m4trace:configure.ac:906: -1- AH_OUTPUT([REDIRECT_FREE], [/* If defined, redirect free to this function. */
+@%:@undef REDIRECT_FREE])
+m4trace:configure.ac:909: -1- AC_DEFINE_TRACE_LITERAL([REDIRECT_MALLOC])
+m4trace:configure.ac:909: -1- m4_pattern_allow([^REDIRECT_MALLOC$])
+m4trace:configure.ac:911: -1- AC_DEFINE_TRACE_LITERAL([GC_USE_DLOPEN_WRAP])
+m4trace:configure.ac:911: -1- m4_pattern_allow([^GC_USE_DLOPEN_WRAP$])
+m4trace:configure.ac:911: -1- AH_OUTPUT([GC_USE_DLOPEN_WRAP], [/* See doc/README.macros. */
+@%:@undef GC_USE_DLOPEN_WRAP])
+m4trace:configure.ac:918: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_DISCLAIM])
+m4trace:configure.ac:918: -1- m4_pattern_allow([^ENABLE_DISCLAIM$])
+m4trace:configure.ac:918: -1- AH_OUTPUT([ENABLE_DISCLAIM], [/* Define to enable alternative finalization interface. */
+@%:@undef ENABLE_DISCLAIM])
+m4trace:configure.ac:921: -1- AM_CONDITIONAL([ENABLE_DISCLAIM], [test x"$enable_disclaim" != xno])
+m4trace:configure.ac:921: -1- AC_SUBST([ENABLE_DISCLAIM_TRUE])
+m4trace:configure.ac:921: -1- AC_SUBST_TRACE([ENABLE_DISCLAIM_TRUE])
+m4trace:configure.ac:921: -1- m4_pattern_allow([^ENABLE_DISCLAIM_TRUE$])
+m4trace:configure.ac:921: -1- AC_SUBST([ENABLE_DISCLAIM_FALSE])
+m4trace:configure.ac:921: -1- AC_SUBST_TRACE([ENABLE_DISCLAIM_FALSE])
+m4trace:configure.ac:921: -1- m4_pattern_allow([^ENABLE_DISCLAIM_FALSE$])
+m4trace:configure.ac:921: -1- _AM_SUBST_NOTMAKE([ENABLE_DISCLAIM_TRUE])
+m4trace:configure.ac:921: -1- _AM_SUBST_NOTMAKE([ENABLE_DISCLAIM_FALSE])
+m4trace:configure.ac:928: -1- AC_DEFINE_TRACE_LITERAL([LARGE_CONFIG])
+m4trace:configure.ac:928: -1- m4_pattern_allow([^LARGE_CONFIG$])
+m4trace:configure.ac:928: -1- AH_OUTPUT([LARGE_CONFIG], [/* Define to optimize for large heaps or root sets. */
+@%:@undef LARGE_CONFIG])
+m4trace:configure.ac:936: -1- AC_DEFINE_TRACE_LITERAL([NO_CLOCK])
+m4trace:configure.ac:936: -1- m4_pattern_allow([^NO_CLOCK$])
+m4trace:configure.ac:936: -1- AH_OUTPUT([NO_CLOCK], [/* Define to not use system clock (cross compiling). */
+@%:@undef NO_CLOCK])
+m4trace:configure.ac:937: -1- AC_DEFINE_TRACE_LITERAL([SMALL_CONFIG])
+m4trace:configure.ac:937: -1- m4_pattern_allow([^SMALL_CONFIG$])
+m4trace:configure.ac:937: -1- AH_OUTPUT([SMALL_CONFIG], [/* Define to tune the collector for small heap sizes. */
+@%:@undef SMALL_CONFIG])
+m4trace:configure.ac:942: -1- AC_DEFINE_TRACE_LITERAL([NO_DEBUGGING])
+m4trace:configure.ac:942: -1- m4_pattern_allow([^NO_DEBUGGING$])
+m4trace:configure.ac:942: -1- AH_OUTPUT([NO_DEBUGGING], [/* Disable debugging, like GC_dump and its callees. */
+@%:@undef NO_DEBUGGING])
+m4trace:configure.ac:946: -1- AC_SUBST([UNWINDLIBS])
+m4trace:configure.ac:946: -1- AC_SUBST_TRACE([UNWINDLIBS])
+m4trace:configure.ac:946: -1- m4_pattern_allow([^UNWINDLIBS$])
+m4trace:configure.ac:952: -1- AC_DEFINE_TRACE_LITERAL([GC_ASSERTIONS])
+m4trace:configure.ac:952: -1- m4_pattern_allow([^GC_ASSERTIONS$])
+m4trace:configure.ac:952: -1- AH_OUTPUT([GC_ASSERTIONS], [/* Define to enable internal debug assertions. */
+@%:@undef GC_ASSERTIONS])
+m4trace:configure.ac:967: -1- AC_DEFINE_TRACE_LITERAL([USE_MMAP])
+m4trace:configure.ac:967: -1- m4_pattern_allow([^USE_MMAP$])
+m4trace:configure.ac:967: -1- AH_OUTPUT([USE_MMAP], [/* Define to use mmap instead of sbrk to expand the heap. */
+@%:@undef USE_MMAP])
+m4trace:configure.ac:969: -1- AH_OUTPUT([USE_WINALLOC], [/* Define to use Win32 VirtualAlloc (instead of sbrk or mmap) to expand the
+ heap. */
+@%:@undef USE_WINALLOC])
+m4trace:configure.ac:972: -1- AC_DEFINE_TRACE_LITERAL([USE_MUNMAP])
+m4trace:configure.ac:972: -1- m4_pattern_allow([^USE_MUNMAP$])
+m4trace:configure.ac:972: -1- AH_OUTPUT([USE_MUNMAP], [/* Define to return memory to OS with munmap calls (see doc/README.macros). */
+@%:@undef USE_MUNMAP])
+m4trace:configure.ac:978: -1- AC_DEFINE_TRACE_LITERAL([MUNMAP_THRESHOLD])
+m4trace:configure.ac:978: -1- m4_pattern_allow([^MUNMAP_THRESHOLD$])
+m4trace:configure.ac:978: -1- AH_OUTPUT([MUNMAP_THRESHOLD], [/* Number of GC cycles to wait before unmapping an unused block. */
+@%:@undef MUNMAP_THRESHOLD])
+m4trace:configure.ac:982: -1- AC_DEFINE_TRACE_LITERAL([USE_MMAP])
+m4trace:configure.ac:982: -1- m4_pattern_allow([^USE_MMAP$])
+m4trace:configure.ac:982: -1- AH_OUTPUT([USE_MMAP], [/* Define to use mmap instead of sbrk to expand the heap. */
+@%:@undef USE_MMAP])
+m4trace:configure.ac:992: -1- AC_DEFINE_TRACE_LITERAL([IGNORE_DYNAMIC_LOADING])
+m4trace:configure.ac:992: -1- m4_pattern_allow([^IGNORE_DYNAMIC_LOADING$])
+m4trace:configure.ac:992: -1- AH_OUTPUT([IGNORE_DYNAMIC_LOADING], [/* Do not define DYNAMIC_LOADING even if supported (i.e., build the collector
+ with disabled tracing of dynamic library data roots). */
+@%:@undef IGNORE_DYNAMIC_LOADING])
+m4trace:configure.ac:1001: -1- AC_DEFINE_TRACE_LITERAL([GC_DONT_REGISTER_MAIN_STATIC_DATA])
+m4trace:configure.ac:1001: -1- m4_pattern_allow([^GC_DONT_REGISTER_MAIN_STATIC_DATA$])
+m4trace:configure.ac:1001: -1- AH_OUTPUT([GC_DONT_REGISTER_MAIN_STATIC_DATA], [/* Skip the initial guess of data root sets. */
+@%:@undef GC_DONT_REGISTER_MAIN_STATIC_DATA])
+m4trace:configure.ac:1014: -1- AC_DEFINE_TRACE_LITERAL([CHECKSUMS])
+m4trace:configure.ac:1014: -1- m4_pattern_allow([^CHECKSUMS$])
+m4trace:configure.ac:1014: -1- AH_OUTPUT([CHECKSUMS], [/* Erroneously cleared dirty bits checking. Use only for debugging of the
+ incremental collector. */
+@%:@undef CHECKSUMS])
+m4trace:configure.ac:1018: -1- AM_CONDITIONAL([CHECKSUMS], [test x$enable_checksums = xyes])
+m4trace:configure.ac:1018: -1- AC_SUBST([CHECKSUMS_TRUE])
+m4trace:configure.ac:1018: -1- AC_SUBST_TRACE([CHECKSUMS_TRUE])
+m4trace:configure.ac:1018: -1- m4_pattern_allow([^CHECKSUMS_TRUE$])
+m4trace:configure.ac:1018: -1- AC_SUBST([CHECKSUMS_FALSE])
+m4trace:configure.ac:1018: -1- AC_SUBST_TRACE([CHECKSUMS_FALSE])
+m4trace:configure.ac:1018: -1- m4_pattern_allow([^CHECKSUMS_FALSE$])
+m4trace:configure.ac:1018: -1- _AM_SUBST_NOTMAKE([CHECKSUMS_TRUE])
+m4trace:configure.ac:1018: -1- _AM_SUBST_NOTMAKE([CHECKSUMS_FALSE])
+m4trace:configure.ac:1020: -1- AM_CONDITIONAL([USE_LIBDIR], [test -z "$with_cross_host"])
+m4trace:configure.ac:1020: -1- AC_SUBST([USE_LIBDIR_TRUE])
+m4trace:configure.ac:1020: -1- AC_SUBST_TRACE([USE_LIBDIR_TRUE])
+m4trace:configure.ac:1020: -1- m4_pattern_allow([^USE_LIBDIR_TRUE$])
+m4trace:configure.ac:1020: -1- AC_SUBST([USE_LIBDIR_FALSE])
+m4trace:configure.ac:1020: -1- AC_SUBST_TRACE([USE_LIBDIR_FALSE])
+m4trace:configure.ac:1020: -1- m4_pattern_allow([^USE_LIBDIR_FALSE$])
+m4trace:configure.ac:1020: -1- _AM_SUBST_NOTMAKE([USE_LIBDIR_TRUE])
+m4trace:configure.ac:1020: -1- _AM_SUBST_NOTMAKE([USE_LIBDIR_FALSE])
+m4trace:configure.ac:1034: -1- AC_SUBST([WERROR_CFLAGS])
+m4trace:configure.ac:1034: -1- AC_SUBST_TRACE([WERROR_CFLAGS])
+m4trace:configure.ac:1034: -1- m4_pattern_allow([^WERROR_CFLAGS$])
+m4trace:configure.ac:1042: -1- AM_CONDITIONAL([SINGLE_GC_OBJ], [test x"$enable_single_obj_compilation" = xyes])
+m4trace:configure.ac:1042: -1- AC_SUBST([SINGLE_GC_OBJ_TRUE])
+m4trace:configure.ac:1042: -1- AC_SUBST_TRACE([SINGLE_GC_OBJ_TRUE])
+m4trace:configure.ac:1042: -1- m4_pattern_allow([^SINGLE_GC_OBJ_TRUE$])
+m4trace:configure.ac:1042: -1- AC_SUBST([SINGLE_GC_OBJ_FALSE])
+m4trace:configure.ac:1042: -1- AC_SUBST_TRACE([SINGLE_GC_OBJ_FALSE])
+m4trace:configure.ac:1042: -1- m4_pattern_allow([^SINGLE_GC_OBJ_FALSE$])
+m4trace:configure.ac:1042: -1- _AM_SUBST_NOTMAKE([SINGLE_GC_OBJ_TRUE])
+m4trace:configure.ac:1042: -1- _AM_SUBST_NOTMAKE([SINGLE_GC_OBJ_FALSE])
+m4trace:configure.ac:1062: -1- AM_CONDITIONAL([ENABLE_DOCS], [test x$enable_docs != xno])
+m4trace:configure.ac:1062: -1- AC_SUBST([ENABLE_DOCS_TRUE])
+m4trace:configure.ac:1062: -1- AC_SUBST_TRACE([ENABLE_DOCS_TRUE])
+m4trace:configure.ac:1062: -1- m4_pattern_allow([^ENABLE_DOCS_TRUE$])
+m4trace:configure.ac:1062: -1- AC_SUBST([ENABLE_DOCS_FALSE])
+m4trace:configure.ac:1062: -1- AC_SUBST_TRACE([ENABLE_DOCS_FALSE])
+m4trace:configure.ac:1062: -1- m4_pattern_allow([^ENABLE_DOCS_FALSE$])
+m4trace:configure.ac:1062: -1- _AM_SUBST_NOTMAKE([ENABLE_DOCS_TRUE])
+m4trace:configure.ac:1062: -1- _AM_SUBST_NOTMAKE([ENABLE_DOCS_FALSE])
+m4trace:configure.ac:1064: -1- AM_CONDITIONAL([ENABLE_SHARED], [test x$enable_shared = xyes])
+m4trace:configure.ac:1064: -1- AC_SUBST([ENABLE_SHARED_TRUE])
+m4trace:configure.ac:1064: -1- AC_SUBST_TRACE([ENABLE_SHARED_TRUE])
+m4trace:configure.ac:1064: -1- m4_pattern_allow([^ENABLE_SHARED_TRUE$])
+m4trace:configure.ac:1064: -1- AC_SUBST([ENABLE_SHARED_FALSE])
+m4trace:configure.ac:1064: -1- AC_SUBST_TRACE([ENABLE_SHARED_FALSE])
+m4trace:configure.ac:1064: -1- m4_pattern_allow([^ENABLE_SHARED_FALSE$])
+m4trace:configure.ac:1064: -1- _AM_SUBST_NOTMAKE([ENABLE_SHARED_TRUE])
+m4trace:configure.ac:1064: -1- _AM_SUBST_NOTMAKE([ENABLE_SHARED_FALSE])
+m4trace:configure.ac:1121: -1- AC_SUBST([ATOMIC_OPS_LIBS])
+m4trace:configure.ac:1121: -1- AC_SUBST_TRACE([ATOMIC_OPS_LIBS])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^ATOMIC_OPS_LIBS$])
+m4trace:configure.ac:1121: -1- AC_DEFINE_TRACE_LITERAL([GC_BUILTIN_ATOMIC])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^GC_BUILTIN_ATOMIC$])
+m4trace:configure.ac:1121: -1- AH_OUTPUT([GC_BUILTIN_ATOMIC], [/* Use GCC atomic intrinsics instead of libatomic_ops primitives. */
+@%:@undef GC_BUILTIN_ATOMIC])
+m4trace:configure.ac:1121: -1- AC_SUBST([ATOMIC_OPS_CFLAGS])
+m4trace:configure.ac:1121: -1- AC_SUBST_TRACE([ATOMIC_OPS_CFLAGS])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^ATOMIC_OPS_CFLAGS$])
+m4trace:configure.ac:1121: -1- AC_CONFIG_SUBDIRS([libatomic_ops])
+m4trace:configure.ac:1121: -1- AC_SUBST([subdirs], ["$subdirs libatomic_ops"])
+m4trace:configure.ac:1121: -1- AC_SUBST_TRACE([subdirs])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^subdirs$])
+m4trace:configure.ac:1139: -1- AM_CONDITIONAL([USE_INTERNAL_LIBATOMIC_OPS], [test x$with_libatomic_ops = xno -a x"$THREADS" != xnone])
+m4trace:configure.ac:1139: -1- AC_SUBST([USE_INTERNAL_LIBATOMIC_OPS_TRUE])
+m4trace:configure.ac:1139: -1- AC_SUBST_TRACE([USE_INTERNAL_LIBATOMIC_OPS_TRUE])
+m4trace:configure.ac:1139: -1- m4_pattern_allow([^USE_INTERNAL_LIBATOMIC_OPS_TRUE$])
+m4trace:configure.ac:1139: -1- AC_SUBST([USE_INTERNAL_LIBATOMIC_OPS_FALSE])
+m4trace:configure.ac:1139: -1- AC_SUBST_TRACE([USE_INTERNAL_LIBATOMIC_OPS_FALSE])
+m4trace:configure.ac:1139: -1- m4_pattern_allow([^USE_INTERNAL_LIBATOMIC_OPS_FALSE$])
+m4trace:configure.ac:1139: -1- _AM_SUBST_NOTMAKE([USE_INTERNAL_LIBATOMIC_OPS_TRUE])
+m4trace:configure.ac:1139: -1- _AM_SUBST_NOTMAKE([USE_INTERNAL_LIBATOMIC_OPS_FALSE])
+m4trace:configure.ac:1141: -1- AM_CONDITIONAL([NEED_ATOMIC_OPS_ASM], [test x$with_libatomic_ops = xno -a x$need_atomic_ops_asm = xtrue])
+m4trace:configure.ac:1141: -1- AC_SUBST([NEED_ATOMIC_OPS_ASM_TRUE])
+m4trace:configure.ac:1141: -1- AC_SUBST_TRACE([NEED_ATOMIC_OPS_ASM_TRUE])
+m4trace:configure.ac:1141: -1- m4_pattern_allow([^NEED_ATOMIC_OPS_ASM_TRUE$])
+m4trace:configure.ac:1141: -1- AC_SUBST([NEED_ATOMIC_OPS_ASM_FALSE])
+m4trace:configure.ac:1141: -1- AC_SUBST_TRACE([NEED_ATOMIC_OPS_ASM_FALSE])
+m4trace:configure.ac:1141: -1- m4_pattern_allow([^NEED_ATOMIC_OPS_ASM_FALSE$])
+m4trace:configure.ac:1141: -1- _AM_SUBST_NOTMAKE([NEED_ATOMIC_OPS_ASM_TRUE])
+m4trace:configure.ac:1141: -1- _AM_SUBST_NOTMAKE([NEED_ATOMIC_OPS_ASM_FALSE])
+m4trace:configure.ac:1148: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LOCKFREE_AO_OR])
+m4trace:configure.ac:1148: -1- m4_pattern_allow([^HAVE_LOCKFREE_AO_OR$])
+m4trace:configure.ac:1148: -1- AH_OUTPUT([HAVE_LOCKFREE_AO_OR], [/* libatomic_ops AO_or primitive implementation is lock-free. */
+@%:@undef HAVE_LOCKFREE_AO_OR])
+m4trace:configure.ac:1148: -1- AC_DEFINE_TRACE_LITERAL([BASE_ATOMIC_OPS_EMULATED])
+m4trace:configure.ac:1148: -1- m4_pattern_allow([^BASE_ATOMIC_OPS_EMULATED$])
+m4trace:configure.ac:1148: -1- AH_OUTPUT([BASE_ATOMIC_OPS_EMULATED], [/* AO load, store and/or test-and-set primitives are implemented in
+ libatomic_ops using locks. */
+@%:@undef BASE_ATOMIC_OPS_EMULATED])
+m4trace:configure.ac:1172: -1- AC_DEFINE_TRACE_LITERAL([PARALLEL_MARK])
+m4trace:configure.ac:1172: -1- m4_pattern_allow([^PARALLEL_MARK$])
+m4trace:configure.ac:1174: -1- AC_DEFINE_TRACE_LITERAL([THREAD_LOCAL_ALLOC])
+m4trace:configure.ac:1174: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC$])
+m4trace:configure.ac:1176: -1- AM_CONDITIONAL([THREAD_LOCAL_ALLOC], [test x$use_thread_local_alloc != xno])
+m4trace:configure.ac:1176: -1- AC_SUBST([THREAD_LOCAL_ALLOC_TRUE])
+m4trace:configure.ac:1176: -1- AC_SUBST_TRACE([THREAD_LOCAL_ALLOC_TRUE])
+m4trace:configure.ac:1176: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC_TRUE$])
+m4trace:configure.ac:1176: -1- AC_SUBST([THREAD_LOCAL_ALLOC_FALSE])
+m4trace:configure.ac:1176: -1- AC_SUBST_TRACE([THREAD_LOCAL_ALLOC_FALSE])
+m4trace:configure.ac:1176: -1- m4_pattern_allow([^THREAD_LOCAL_ALLOC_FALSE$])
+m4trace:configure.ac:1176: -1- _AM_SUBST_NOTMAKE([THREAD_LOCAL_ALLOC_TRUE])
+m4trace:configure.ac:1176: -1- _AM_SUBST_NOTMAKE([THREAD_LOCAL_ALLOC_FALSE])
+m4trace:configure.ac:1185: -1- AC_DEFINE_TRACE_LITERAL([HANDLE_FORK])
+m4trace:configure.ac:1185: -1- m4_pattern_allow([^HANDLE_FORK$])
+m4trace:configure.ac:1185: -1- AH_OUTPUT([HANDLE_FORK], [/* Define to install pthread_atfork() handlers by default. */
+@%:@undef HANDLE_FORK])
+m4trace:configure.ac:1188: -1- AC_DEFINE_TRACE_LITERAL([NO_HANDLE_FORK])
+m4trace:configure.ac:1188: -1- m4_pattern_allow([^NO_HANDLE_FORK$])
+m4trace:configure.ac:1188: -1- AH_OUTPUT([NO_HANDLE_FORK], [/* Prohibit installation of pthread_atfork() handlers. */
+@%:@undef NO_HANDLE_FORK])
+m4trace:configure.ac:1197: -1- AC_DEFINE_TRACE_LITERAL([HANDLE_FORK])
+m4trace:configure.ac:1197: -1- m4_pattern_allow([^HANDLE_FORK$])
+m4trace:configure.ac:1205: -1- AC_CONFIG_FILES([Makefile bdw-gc.pc])
+m4trace:configure.ac:1214: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:1214: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([LTLIBOBJS])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.ac:1214: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
+m4trace:configure.ac:1214: -1- AC_SUBST([am__EXEEXT_TRUE])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
+m4trace:configure.ac:1214: -1- AC_SUBST([am__EXEEXT_FALSE])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE])
+m4trace:configure.ac:1214: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
+m4trace:configure.ac:1214: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
+m4trace:configure.ac:1214: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([top_builddir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([top_build_prefix])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([srcdir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([abs_srcdir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([top_srcdir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([abs_top_srcdir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([builddir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([abs_builddir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([abs_top_builddir])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([INSTALL])
+m4trace:configure.ac:1214: -1- AC_SUBST_TRACE([MKDIR_P])
+m4trace:configure.ac:1214: -1- AC_REQUIRE_AUX_FILE([ltmain.sh])
diff --git a/graphics/asymptote/gc/backgraph.c b/graphics/asymptote/gc/backgraph.c
new file mode 100644
index 0000000000..733edea2b6
--- /dev/null
+++ b/graphics/asymptote/gc/backgraph.c
@@ -0,0 +1,558 @@
+/*
+ * Copyright (c) 2001 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#include "private/dbg_mlc.h"
+
+/*
+ * This implements a full, though not well-tuned, representation of the
+ * backwards points-to graph. This is used to test for non-GC-robust
+ * data structures; the code is not used during normal garbage collection.
+ *
+ * One restriction is that we drop all back-edges from nodes with very
+ * high in-degree, and simply add them add them to a list of such
+ * nodes. They are then treated as permanent roots. If this by itself
+ * doesn't introduce a space leak, then such nodes can't contribute to
+ * a growing space leak.
+ */
+
+#ifdef MAKE_BACK_GRAPH
+
+#define MAX_IN 10 /* Maximum in-degree we handle directly */
+
+/* #include <unistd.h> */
+
+#if (!defined(DBG_HDRS_ALL) || (ALIGNMENT != CPP_WORDSZ/8) \
+ /* || !defined(UNIX_LIKE) */) && !defined(CPPCHECK)
+# error The configuration does not support MAKE_BACK_GRAPH
+#endif
+
+/* We store single back pointers directly in the object's oh_bg_ptr field. */
+/* If there is more than one ptr to an object, we store q | FLAG_MANY, */
+/* where q is a pointer to a back_edges object. */
+/* Every once in a while we use a back_edges object even for a single */
+/* pointer, since we need the other fields in the back_edges structure to */
+/* be present in some fraction of the objects. Otherwise we get serious */
+/* performance issues. */
+#define FLAG_MANY 2
+
+typedef struct back_edges_struct {
+ word n_edges; /* Number of edges, including those in continuation */
+ /* structures. */
+ unsigned short flags;
+# define RETAIN 1 /* Directly points to a reachable object; */
+ /* retain for next GC. */
+ unsigned short height_gc_no;
+ /* If height > 0, then the GC_gc_no value when it */
+ /* was computed. If it was computed this cycle, then */
+ /* it is current. If it was computed during the */
+ /* last cycle, then it represents the old height, */
+ /* which is only saved for live objects referenced by */
+ /* dead ones. This may grow due to refs from newly */
+ /* dead objects. */
+ signed_word height;
+ /* Longest path through unreachable nodes to this node */
+ /* that we found using depth first search. */
+# define HEIGHT_UNKNOWN (-2)
+# define HEIGHT_IN_PROGRESS (-1)
+
+ ptr_t edges[MAX_IN];
+ struct back_edges_struct *cont;
+ /* Pointer to continuation structure; we use only the */
+ /* edges field in the continuation. */
+ /* also used as free list link. */
+} back_edges;
+
+/* Allocate a new back edge structure. Should be more sophisticated */
+/* if this were production code. */
+#define MAX_BACK_EDGE_STRUCTS 100000
+static back_edges *back_edge_space = 0;
+STATIC int GC_n_back_edge_structs = 0;
+ /* Serves as pointer to never used */
+ /* back_edges space. */
+static back_edges *avail_back_edges = 0;
+ /* Pointer to free list of deallocated */
+ /* back_edges structures. */
+
+static back_edges * new_back_edges(void)
+{
+ if (0 == back_edge_space) {
+ size_t bytes_to_get = ROUNDUP_PAGESIZE_IF_MMAP(MAX_BACK_EDGE_STRUCTS
+ * sizeof(back_edges));
+
+ GC_ASSERT(GC_page_size != 0);
+ back_edge_space = (back_edges *)GET_MEM(bytes_to_get);
+ if (NULL == back_edge_space)
+ ABORT("Insufficient memory for back edges");
+ GC_add_to_our_memory((ptr_t)back_edge_space, bytes_to_get);
+ }
+ if (0 != avail_back_edges) {
+ back_edges * result = avail_back_edges;
+ avail_back_edges = result -> cont;
+ result -> cont = 0;
+ return result;
+ }
+ if (GC_n_back_edge_structs >= MAX_BACK_EDGE_STRUCTS - 1) {
+ ABORT("Needed too much space for back edges: adjust "
+ "MAX_BACK_EDGE_STRUCTS");
+ }
+ return back_edge_space + (GC_n_back_edge_structs++);
+}
+
+/* Deallocate p and its associated continuation structures. */
+static void deallocate_back_edges(back_edges *p)
+{
+ back_edges *last = p;
+
+ while (0 != last -> cont) last = last -> cont;
+ last -> cont = avail_back_edges;
+ avail_back_edges = p;
+}
+
+/* Table of objects that are currently on the depth-first search */
+/* stack. Only objects with in-degree one are in this table. */
+/* Other objects are identified using HEIGHT_IN_PROGRESS. */
+/* FIXME: This data structure NEEDS IMPROVEMENT. */
+#define INITIAL_IN_PROGRESS 10000
+static ptr_t * in_progress_space = 0;
+static size_t in_progress_size = 0;
+static size_t n_in_progress = 0;
+
+static void push_in_progress(ptr_t p)
+{
+ if (n_in_progress >= in_progress_size) {
+ ptr_t * new_in_progress_space;
+
+ GC_ASSERT(GC_page_size != 0);
+ if (NULL == in_progress_space) {
+ in_progress_size = ROUNDUP_PAGESIZE_IF_MMAP(INITIAL_IN_PROGRESS
+ * sizeof(ptr_t))
+ / sizeof(ptr_t);
+ new_in_progress_space =
+ (ptr_t *)GET_MEM(in_progress_size * sizeof(ptr_t));
+ } else {
+ in_progress_size *= 2;
+ new_in_progress_space = (ptr_t *)
+ GET_MEM(in_progress_size * sizeof(ptr_t));
+ if (new_in_progress_space != NULL)
+ BCOPY(in_progress_space, new_in_progress_space,
+ n_in_progress * sizeof(ptr_t));
+ }
+ if (EXPECT(new_in_progress_space != NULL, TRUE))
+ GC_add_to_our_memory((ptr_t)new_in_progress_space,
+ in_progress_size * sizeof(ptr_t));
+# ifndef GWW_VDB
+ GC_scratch_recycle_no_gww(in_progress_space,
+ n_in_progress * sizeof(ptr_t));
+# elif defined(LINT2)
+ /* TODO: implement GWW-aware recycling as in alloc_mark_stack */
+ GC_noop1((word)in_progress_space);
+# endif
+ in_progress_space = new_in_progress_space;
+ }
+ if (in_progress_space == 0)
+ ABORT("MAKE_BACK_GRAPH: Out of in-progress space: "
+ "Huge linear data structure?");
+ in_progress_space[n_in_progress++] = p;
+}
+
+static GC_bool is_in_progress(ptr_t p)
+{
+ size_t i;
+ for (i = 0; i < n_in_progress; ++i) {
+ if (in_progress_space[i] == p) return TRUE;
+ }
+ return FALSE;
+}
+
+GC_INLINE void pop_in_progress(ptr_t p GC_ATTR_UNUSED)
+{
+ --n_in_progress;
+ GC_ASSERT(in_progress_space[n_in_progress] == p);
+}
+
+#define GET_OH_BG_PTR(p) \
+ (ptr_t)GC_REVEAL_POINTER(((oh *)(p)) -> oh_bg_ptr)
+#define SET_OH_BG_PTR(p,q) (((oh *)(p)) -> oh_bg_ptr = GC_HIDE_POINTER(q))
+
+/* Ensure that p has a back_edges structure associated with it. */
+static void ensure_struct(ptr_t p)
+{
+ ptr_t old_back_ptr = GET_OH_BG_PTR(p);
+
+ if (!((word)old_back_ptr & FLAG_MANY)) {
+ back_edges *be = new_back_edges();
+ be -> flags = 0;
+ if (0 == old_back_ptr) {
+ be -> n_edges = 0;
+ } else {
+ be -> n_edges = 1;
+ be -> edges[0] = old_back_ptr;
+ }
+ be -> height = HEIGHT_UNKNOWN;
+ be -> height_gc_no = (unsigned short)(GC_gc_no - 1);
+ GC_ASSERT((word)be >= (word)back_edge_space);
+ SET_OH_BG_PTR(p, (word)be | FLAG_MANY);
+ }
+}
+
+/* Add the (forward) edge from p to q to the backward graph. Both p */
+/* q are pointers to the object base, i.e. pointers to an oh. */
+static void add_edge(ptr_t p, ptr_t q)
+{
+ ptr_t pred = GET_OH_BG_PTR(q);
+ back_edges * be, *be_cont;
+ word i;
+
+ GC_ASSERT(p == GC_base(p) && q == GC_base(q));
+ if (!GC_HAS_DEBUG_INFO(q) || !GC_HAS_DEBUG_INFO(p)) {
+ /* This is really a misinterpreted free list link, since we saw */
+ /* a pointer to a free list. Don't overwrite it! */
+ return;
+ }
+ if (NULL == pred) {
+ static unsigned random_number = 13;
+# define GOT_LUCKY_NUMBER (((++random_number) & 0x7f) == 0)
+ /* A not very random number we use to occasionally allocate a */
+ /* back_edges structure even for a single backward edge. This */
+ /* prevents us from repeatedly tracing back through very long */
+ /* chains, since we will have some place to store height and */
+ /* in_progress flags along the way. */
+
+ SET_OH_BG_PTR(q, p);
+ if (GOT_LUCKY_NUMBER) ensure_struct(q);
+ return;
+ }
+
+ /* Check whether it was already in the list of predecessors. */
+ {
+ back_edges *e = (back_edges *)((word)pred & ~(word)FLAG_MANY);
+ word n_edges;
+ word total;
+ int local = 0;
+
+ if (((word)pred & FLAG_MANY) != 0) {
+ n_edges = e -> n_edges;
+ } else if (((word)COVERT_DATAFLOW(pred) & 1) == 0) {
+ /* A misinterpreted freelist link. */
+ n_edges = 1;
+ local = -1;
+ } else {
+ n_edges = 0;
+ }
+ for (total = 0; total < n_edges; ++total) {
+ if (local == MAX_IN) {
+ e = e -> cont;
+ local = 0;
+ }
+ if (local >= 0)
+ pred = e -> edges[local++];
+ if (pred == p)
+ return;
+ }
+ }
+
+ ensure_struct(q);
+ be = (back_edges *)((word)GET_OH_BG_PTR(q) & ~(word)FLAG_MANY);
+ for (i = be -> n_edges, be_cont = be; i > MAX_IN; i -= MAX_IN)
+ be_cont = be_cont -> cont;
+ if (i == MAX_IN) {
+ be_cont -> cont = new_back_edges();
+ be_cont = be_cont -> cont;
+ i = 0;
+ }
+ be_cont -> edges[i] = p;
+ be -> n_edges++;
+# ifdef DEBUG_PRINT_BIG_N_EDGES
+ if (GC_print_stats == VERBOSE && be -> n_edges == 100) {
+ GC_err_printf("The following object has big in-degree:\n");
+ GC_print_heap_obj(q);
+ }
+# endif
+}
+
+typedef void (*per_object_func)(ptr_t p, size_t n_bytes, word gc_descr);
+
+static void per_object_helper(struct hblk *h, word fn)
+{
+ hdr * hhdr = HDR(h);
+ size_t sz = (size_t)hhdr->hb_sz;
+ word descr = hhdr -> hb_descr;
+ per_object_func f = (per_object_func)fn;
+ size_t i = 0;
+
+ do {
+ f((ptr_t)(h -> hb_body + i), sz, descr);
+ i += sz;
+ } while (i + sz <= HBLKSIZE);
+}
+
+GC_INLINE void GC_apply_to_each_object(per_object_func f)
+{
+ GC_apply_to_all_blocks(per_object_helper, (word)f);
+}
+
+static void reset_back_edge(ptr_t p, size_t n_bytes GC_ATTR_UNUSED,
+ word gc_descr GC_ATTR_UNUSED)
+{
+ /* Skip any free list links, or dropped blocks */
+ if (GC_HAS_DEBUG_INFO(p)) {
+ ptr_t old_back_ptr = GET_OH_BG_PTR(p);
+ if ((word)old_back_ptr & FLAG_MANY) {
+ back_edges *be = (back_edges *)((word)old_back_ptr & ~(word)FLAG_MANY);
+ if (!(be -> flags & RETAIN)) {
+ deallocate_back_edges(be);
+ SET_OH_BG_PTR(p, 0);
+ } else {
+
+ GC_ASSERT(GC_is_marked(p));
+
+ /* Back edges may point to objects that will not be retained. */
+ /* Delete them for now, but remember the height. */
+ /* Some will be added back at next GC. */
+ be -> n_edges = 0;
+ if (0 != be -> cont) {
+ deallocate_back_edges(be -> cont);
+ be -> cont = 0;
+ }
+
+ GC_ASSERT(GC_is_marked(p));
+
+ /* We only retain things for one GC cycle at a time. */
+ be -> flags &= ~RETAIN;
+ }
+ } else /* Simple back pointer */ {
+ /* Clear to avoid dangling pointer. */
+ SET_OH_BG_PTR(p, 0);
+ }
+ }
+}
+
+static void add_back_edges(ptr_t p, size_t n_bytes, word gc_descr)
+{
+ word *currentp = (word *)(p + sizeof(oh));
+
+ /* For now, fix up non-length descriptors conservatively. */
+ if((gc_descr & GC_DS_TAGS) != GC_DS_LENGTH) {
+ gc_descr = n_bytes;
+ }
+ while ((word)currentp < (word)(p + gc_descr)) {
+ word current = *currentp++;
+ FIXUP_POINTER(current);
+ if (current >= (word)GC_least_plausible_heap_addr &&
+ current <= (word)GC_greatest_plausible_heap_addr) {
+ ptr_t target = (ptr_t)GC_base((void *)current);
+ if (0 != target) {
+ add_edge(p, target);
+ }
+ }
+ }
+}
+
+/* Rebuild the representation of the backward reachability graph. */
+/* Does not examine mark bits. Can be called before GC. */
+GC_INNER void GC_build_back_graph(void)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_apply_to_each_object(add_back_edges);
+}
+
+/* Return an approximation to the length of the longest simple path */
+/* through unreachable objects to p. We refer to this as the height */
+/* of p. */
+static word backwards_height(ptr_t p)
+{
+ word result;
+ ptr_t pred = GET_OH_BG_PTR(p);
+ back_edges *be;
+
+ if (NULL == pred)
+ return 1;
+ if (((word)pred & FLAG_MANY) == 0) {
+ if (is_in_progress(p)) return 0; /* DFS back edge, i.e. we followed */
+ /* an edge to an object already */
+ /* on our stack: ignore */
+ push_in_progress(p);
+ result = backwards_height(pred) + 1;
+ pop_in_progress(p);
+ return result;
+ }
+ be = (back_edges *)((word)pred & ~(word)FLAG_MANY);
+ if (be -> height >= 0 && be -> height_gc_no == (unsigned short)GC_gc_no)
+ return be -> height;
+ /* Ignore back edges in DFS */
+ if (be -> height == HEIGHT_IN_PROGRESS) return 0;
+ result = (be -> height > 0? be -> height : 1);
+ be -> height = HEIGHT_IN_PROGRESS;
+
+ {
+ back_edges *e = be;
+ word n_edges;
+ word total;
+ int local = 0;
+
+ if (((word)pred & FLAG_MANY) != 0) {
+ n_edges = e -> n_edges;
+ } else if (((word)pred & 1) == 0) {
+ /* A misinterpreted freelist link. */
+ n_edges = 1;
+ local = -1;
+ } else {
+ n_edges = 0;
+ }
+ for (total = 0; total < n_edges; ++total) {
+ word this_height;
+ if (local == MAX_IN) {
+ e = e -> cont;
+ local = 0;
+ }
+ if (local >= 0)
+ pred = e -> edges[local++];
+
+ /* Execute the following once for each predecessor pred of p */
+ /* in the points-to graph. */
+ if (GC_is_marked(pred) && ((word)GET_OH_BG_PTR(p) & FLAG_MANY) == 0) {
+ GC_COND_LOG_PRINTF("Found bogus pointer from %p to %p\n",
+ (void *)pred, (void *)p);
+ /* Reachable object "points to" unreachable one. */
+ /* Could be caused by our lax treatment of GC descriptors. */
+ this_height = 1;
+ } else {
+ this_height = backwards_height(pred);
+ }
+ if (this_height >= result)
+ result = this_height + 1;
+ }
+ }
+
+ be -> height = result;
+ be -> height_gc_no = (unsigned short)GC_gc_no;
+ return result;
+}
+
+STATIC word GC_max_height = 0;
+STATIC ptr_t GC_deepest_obj = NULL;
+
+/* Compute the maximum height of every unreachable predecessor p of a */
+/* reachable object. Arrange to save the heights of all such objects p */
+/* so that they can be used in calculating the height of objects in the */
+/* next GC. */
+/* Set GC_max_height to be the maximum height we encounter, and */
+/* GC_deepest_obj to be the corresponding object. */
+static void update_max_height(ptr_t p, size_t n_bytes GC_ATTR_UNUSED,
+ word gc_descr GC_ATTR_UNUSED)
+{
+ if (GC_is_marked(p) && GC_HAS_DEBUG_INFO(p)) {
+ word p_height = 0;
+ ptr_t p_deepest_obj = 0;
+ ptr_t back_ptr;
+ back_edges *be = 0;
+
+ /* If we remembered a height last time, use it as a minimum. */
+ /* It may have increased due to newly unreachable chains pointing */
+ /* to p, but it can't have decreased. */
+ back_ptr = GET_OH_BG_PTR(p);
+ if (0 != back_ptr && ((word)back_ptr & FLAG_MANY)) {
+ be = (back_edges *)((word)back_ptr & ~(word)FLAG_MANY);
+ if (be -> height != HEIGHT_UNKNOWN) p_height = be -> height;
+ }
+
+ {
+ ptr_t pred = GET_OH_BG_PTR(p);
+ back_edges *e = (back_edges *)((word)pred & ~(word)FLAG_MANY);
+ word n_edges;
+ word total;
+ int local = 0;
+
+ if (((word)pred & FLAG_MANY) != 0) {
+ n_edges = e -> n_edges;
+ } else if (pred != NULL && ((word)pred & 1) == 0) {
+ /* A misinterpreted freelist link. */
+ n_edges = 1;
+ local = -1;
+ } else {
+ n_edges = 0;
+ }
+ for (total = 0; total < n_edges; ++total) {
+ if (local == MAX_IN) {
+ e = e -> cont;
+ local = 0;
+ }
+ if (local >= 0)
+ pred = e -> edges[local++];
+
+ /* Execute the following once for each predecessor pred of p */
+ /* in the points-to graph. */
+ if (!GC_is_marked(pred) && GC_HAS_DEBUG_INFO(pred)) {
+ word this_height = backwards_height(pred);
+ if (this_height > p_height) {
+ p_height = this_height;
+ p_deepest_obj = pred;
+ }
+ }
+ }
+ }
+
+ if (p_height > 0) {
+ /* Remember the height for next time. */
+ if (be == 0) {
+ ensure_struct(p);
+ back_ptr = GET_OH_BG_PTR(p);
+ be = (back_edges *)((word)back_ptr & ~(word)FLAG_MANY);
+ }
+ be -> flags |= RETAIN;
+ be -> height = p_height;
+ be -> height_gc_no = (unsigned short)GC_gc_no;
+ }
+ if (p_height > GC_max_height) {
+ GC_max_height = p_height;
+ GC_deepest_obj = p_deepest_obj;
+ }
+ }
+}
+
+STATIC word GC_max_max_height = 0;
+
+GC_INNER void GC_traverse_back_graph(void)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_max_height = 0;
+ GC_apply_to_each_object(update_max_height);
+ if (0 != GC_deepest_obj)
+ GC_set_mark_bit(GC_deepest_obj); /* Keep it until we can print it. */
+}
+
+void GC_print_back_graph_stats(void)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_printf("Maximum backwards height of reachable objects"
+ " at GC #%lu is %lu\n",
+ (unsigned long)GC_gc_no, (unsigned long)GC_max_height);
+ if (GC_max_height > GC_max_max_height) {
+ ptr_t obj = GC_deepest_obj;
+
+ GC_max_max_height = GC_max_height;
+ UNLOCK();
+ GC_err_printf(
+ "The following unreachable object is last in a longest chain "
+ "of unreachable objects:\n");
+ GC_print_heap_obj(obj);
+ LOCK();
+ }
+ GC_COND_LOG_PRINTF("Needed max total of %d back-edge structs\n",
+ GC_n_back_edge_structs);
+ GC_apply_to_each_object(reset_back_edge);
+ GC_deepest_obj = 0;
+}
+
+#endif /* MAKE_BACK_GRAPH */
diff --git a/graphics/asymptote/gc/bdw-gc.pc.in b/graphics/asymptote/gc/bdw-gc.pc.in
new file mode 100644
index 0000000000..23678f4300
--- /dev/null
+++ b/graphics/asymptote/gc/bdw-gc.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: Boehm-Demers-Weiser Conservative Garbage Collector
+Description: A garbage collector for C and C++
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} @ATOMIC_OPS_LIBS@ -lgc @THREADDLLIBS@
+Cflags: -I${includedir}
diff --git a/graphics/asymptote/gc/blacklst.c b/graphics/asymptote/gc/blacklst.c
new file mode 100644
index 0000000000..a345de8e4e
--- /dev/null
+++ b/graphics/asymptote/gc/blacklst.c
@@ -0,0 +1,301 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+/*
+ * We maintain several hash tables of hblks that have had false hits.
+ * Each contains one bit per hash bucket; If any page in the bucket
+ * has had a false hit, we assume that all of them have.
+ * See the definition of page_hash_table in gc_priv.h.
+ * False hits from the stack(s) are much more dangerous than false hits
+ * from elsewhere, since the former can pin a large object that spans the
+ * block, even though it does not start on the dangerous block.
+ */
+
+/*
+ * Externally callable routines are:
+
+ * GC_add_to_black_list_normal
+ * GC_add_to_black_list_stack
+ * GC_promote_black_lists
+ * GC_is_black_listed
+ *
+ * All require that the allocator lock is held.
+ */
+
+/* Pointers to individual tables. We replace one table by another by */
+/* switching these pointers. */
+STATIC word * GC_old_normal_bl = NULL;
+ /* Nonstack false references seen at last full */
+ /* collection. */
+STATIC word * GC_incomplete_normal_bl = NULL;
+ /* Nonstack false references seen since last */
+ /* full collection. */
+STATIC word * GC_old_stack_bl = NULL;
+STATIC word * GC_incomplete_stack_bl = NULL;
+
+STATIC word GC_total_stack_black_listed = 0;
+ /* Number of bytes on stack blacklist. */
+
+GC_INNER word GC_black_list_spacing = MINHINCR * HBLKSIZE;
+ /* Initial rough guess. */
+
+STATIC void GC_clear_bl(word *);
+
+GC_INNER void GC_default_print_heap_obj_proc(ptr_t p)
+{
+ ptr_t base = (ptr_t)GC_base(p);
+ int kind = HDR(base)->hb_obj_kind;
+
+ GC_err_printf("object at %p of appr. %lu bytes (%s)\n",
+ (void *)base, (unsigned long)GC_size(base),
+ kind == PTRFREE ? "atomic" :
+ IS_UNCOLLECTABLE(kind) ? "uncollectable" : "composite");
+}
+
+GC_INNER void (*GC_print_heap_obj)(ptr_t p) = GC_default_print_heap_obj_proc;
+
+#ifdef PRINT_BLACK_LIST
+ STATIC void GC_print_blacklisted_ptr(word p, ptr_t source,
+ const char *kind_str)
+ {
+ ptr_t base = (ptr_t)GC_base(source);
+
+ if (0 == base) {
+ GC_err_printf("Black listing (%s) %p referenced from %p in %s\n",
+ kind_str, (void *)p, (void *)source,
+ NULL != source ? "root set" : "register");
+ } else {
+ /* FIXME: We can't call the debug version of GC_print_heap_obj */
+ /* (with PRINT_CALL_CHAIN) here because the lock is held and */
+ /* the world is stopped. */
+ GC_err_printf("Black listing (%s) %p referenced from %p in"
+ " object at %p of appr. %lu bytes\n",
+ kind_str, (void *)p, (void *)source,
+ (void *)base, (unsigned long)GC_size(base));
+ }
+ }
+#endif /* PRINT_BLACK_LIST */
+
+GC_INNER void GC_bl_init_no_interiors(void)
+{
+ if (GC_incomplete_normal_bl == 0) {
+ GC_old_normal_bl = (word *)GC_scratch_alloc(sizeof(page_hash_table));
+ GC_incomplete_normal_bl = (word *)GC_scratch_alloc(
+ sizeof(page_hash_table));
+ if (GC_old_normal_bl == 0 || GC_incomplete_normal_bl == 0) {
+ GC_err_printf("Insufficient memory for black list\n");
+ EXIT();
+ }
+ GC_clear_bl(GC_old_normal_bl);
+ GC_clear_bl(GC_incomplete_normal_bl);
+ }
+}
+
+GC_INNER void GC_bl_init(void)
+{
+ if (!GC_all_interior_pointers) {
+ GC_bl_init_no_interiors();
+ }
+ GC_ASSERT(NULL == GC_old_stack_bl && NULL == GC_incomplete_stack_bl);
+ GC_old_stack_bl = (word *)GC_scratch_alloc(sizeof(page_hash_table));
+ GC_incomplete_stack_bl = (word *)GC_scratch_alloc(sizeof(page_hash_table));
+ if (GC_old_stack_bl == 0 || GC_incomplete_stack_bl == 0) {
+ GC_err_printf("Insufficient memory for black list\n");
+ EXIT();
+ }
+ GC_clear_bl(GC_old_stack_bl);
+ GC_clear_bl(GC_incomplete_stack_bl);
+}
+
+STATIC void GC_clear_bl(word *doomed)
+{
+ BZERO(doomed, sizeof(page_hash_table));
+}
+
+STATIC void GC_copy_bl(word *old, word *dest)
+{
+ BCOPY(old, dest, sizeof(page_hash_table));
+}
+
+static word total_stack_black_listed(void);
+
+/* Signal the completion of a collection. Turn the incomplete black */
+/* lists into new black lists, etc. */
+GC_INNER void GC_promote_black_lists(void)
+{
+ word * very_old_normal_bl = GC_old_normal_bl;
+ word * very_old_stack_bl = GC_old_stack_bl;
+
+ GC_old_normal_bl = GC_incomplete_normal_bl;
+ GC_old_stack_bl = GC_incomplete_stack_bl;
+ if (!GC_all_interior_pointers) {
+ GC_clear_bl(very_old_normal_bl);
+ }
+ GC_clear_bl(very_old_stack_bl);
+ GC_incomplete_normal_bl = very_old_normal_bl;
+ GC_incomplete_stack_bl = very_old_stack_bl;
+ GC_total_stack_black_listed = total_stack_black_listed();
+ GC_VERBOSE_LOG_PRINTF(
+ "%lu bytes in heap blacklisted for interior pointers\n",
+ (unsigned long)GC_total_stack_black_listed);
+ if (GC_total_stack_black_listed != 0) {
+ GC_black_list_spacing =
+ HBLKSIZE*(GC_heapsize/GC_total_stack_black_listed);
+ }
+ if (GC_black_list_spacing < 3 * HBLKSIZE) {
+ GC_black_list_spacing = 3 * HBLKSIZE;
+ }
+ if (GC_black_list_spacing > MAXHINCR * HBLKSIZE) {
+ GC_black_list_spacing = MAXHINCR * HBLKSIZE;
+ /* Makes it easier to allocate really huge blocks, which otherwise */
+ /* may have problems with nonuniform blacklist distributions. */
+ /* This way we should always succeed immediately after growing the */
+ /* heap. */
+ }
+}
+
+GC_INNER void GC_unpromote_black_lists(void)
+{
+ if (!GC_all_interior_pointers) {
+ GC_copy_bl(GC_old_normal_bl, GC_incomplete_normal_bl);
+ }
+ GC_copy_bl(GC_old_stack_bl, GC_incomplete_stack_bl);
+}
+
+#if defined(PARALLEL_MARK) && defined(THREAD_SANITIZER)
+# define backlist_set_pht_entry_from_index(db, index) \
+ set_pht_entry_from_index_concurrent(db, index)
+#else
+ /* It is safe to set a bit in a blacklist even without */
+ /* synchronization, the only drawback is that we might have */
+ /* to redo blacklisting sometimes. */
+# define backlist_set_pht_entry_from_index(bl, index) \
+ set_pht_entry_from_index(bl, index)
+#endif
+
+/* P is not a valid pointer reference, but it falls inside */
+/* the plausible heap bounds. */
+/* Add it to the normal incomplete black list if appropriate. */
+#ifdef PRINT_BLACK_LIST
+ GC_INNER void GC_add_to_black_list_normal(word p, ptr_t source)
+#else
+ GC_INNER void GC_add_to_black_list_normal(word p)
+#endif
+{
+ if (GC_modws_valid_offsets[p & (sizeof(word)-1)]) {
+ word index = PHT_HASH((word)p);
+
+ if (HDR(p) == 0 || get_pht_entry_from_index(GC_old_normal_bl, index)) {
+# ifdef PRINT_BLACK_LIST
+ if (!get_pht_entry_from_index(GC_incomplete_normal_bl, index)) {
+ GC_print_blacklisted_ptr(p, source, "normal");
+ }
+# endif
+ backlist_set_pht_entry_from_index(GC_incomplete_normal_bl, index);
+ } /* else this is probably just an interior pointer to an allocated */
+ /* object, and isn't worth black listing. */
+ }
+}
+
+/* And the same for false pointers from the stack. */
+#ifdef PRINT_BLACK_LIST
+ GC_INNER void GC_add_to_black_list_stack(word p, ptr_t source)
+#else
+ GC_INNER void GC_add_to_black_list_stack(word p)
+#endif
+{
+ word index = PHT_HASH((word)p);
+
+ if (HDR(p) == 0 || get_pht_entry_from_index(GC_old_stack_bl, index)) {
+# ifdef PRINT_BLACK_LIST
+ if (!get_pht_entry_from_index(GC_incomplete_stack_bl, index)) {
+ GC_print_blacklisted_ptr(p, source, "stack");
+ }
+# endif
+ backlist_set_pht_entry_from_index(GC_incomplete_stack_bl, index);
+ }
+}
+
+/*
+ * Is the block starting at h of size len bytes black listed? If so,
+ * return the address of the next plausible r such that (r, len) might not
+ * be black listed. (R may not actually be in the heap. We guarantee only
+ * that every smaller value of r after h is also black listed.)
+ * If (h,len) is not black listed, return 0.
+ * Knows about the structure of the black list hash tables.
+ */
+struct hblk * GC_is_black_listed(struct hblk *h, word len)
+{
+ word index = PHT_HASH((word)h);
+ word i;
+ word nblocks;
+
+ if (!GC_all_interior_pointers
+ && (get_pht_entry_from_index(GC_old_normal_bl, index)
+ || get_pht_entry_from_index(GC_incomplete_normal_bl, index))) {
+ return (h+1);
+ }
+
+ nblocks = divHBLKSZ(len);
+ for (i = 0;;) {
+ if (GC_old_stack_bl[divWORDSZ(index)] == 0
+ && GC_incomplete_stack_bl[divWORDSZ(index)] == 0) {
+ /* An easy case */
+ i += WORDSZ - modWORDSZ(index);
+ } else {
+ if (get_pht_entry_from_index(GC_old_stack_bl, index)
+ || get_pht_entry_from_index(GC_incomplete_stack_bl, index)) {
+ return(h+i+1);
+ }
+ i++;
+ }
+ if (i >= nblocks) break;
+ index = PHT_HASH((word)(h+i));
+ }
+ return(0);
+}
+
+/* Return the number of blacklisted blocks in a given range. */
+/* Used only for statistical purposes. */
+/* Looks only at the GC_incomplete_stack_bl. */
+STATIC word GC_number_stack_black_listed(struct hblk *start,
+ struct hblk *endp1)
+{
+ struct hblk * h;
+ word result = 0;
+
+ for (h = start; (word)h < (word)endp1; h++) {
+ word index = PHT_HASH((word)h);
+
+ if (get_pht_entry_from_index(GC_old_stack_bl, index)) result++;
+ }
+ return(result);
+}
+
+/* Return the total number of (stack) black-listed bytes. */
+static word total_stack_black_listed(void)
+{
+ unsigned i;
+ word total = 0;
+
+ for (i = 0; i < GC_n_heap_sects; i++) {
+ struct hblk * start = (struct hblk *) GC_heap_sects[i].hs_start;
+ struct hblk * endp1 = start + divHBLKSZ(GC_heap_sects[i].hs_bytes);
+
+ total += GC_number_stack_black_listed(start, endp1);
+ }
+ return(total * HBLKSIZE);
+}
diff --git a/graphics/asymptote/gc/build/s60v3/bld.inf b/graphics/asymptote/gc/build/s60v3/bld.inf
new file mode 100644
index 0000000000..491fcf4343
--- /dev/null
+++ b/graphics/asymptote/gc/build/s60v3/bld.inf
@@ -0,0 +1,11 @@
+/*
+ Name : bld.inf
+ Description : This file provides the information required for building the
+ whole of a libgc.
+*/
+
+PRJ_PLATFORMS
+default armv5
+
+PRJ_MMPFILES
+libgc.mmp
diff --git a/graphics/asymptote/gc/build/s60v3/libgc.mmp b/graphics/asymptote/gc/build/s60v3/libgc.mmp
new file mode 100644
index 0000000000..ada5ad64bd
--- /dev/null
+++ b/graphics/asymptote/gc/build/s60v3/libgc.mmp
@@ -0,0 +1,78 @@
+TARGET libgc.dll
+
+TARGETTYPE dll
+UID 0x1000008d 0x200107C2 // check uid
+
+EXPORTUNFROZEN
+EPOCALLOWDLLDATA
+//ALWAYS_BUILD_AS_ARM
+//nocompresstarget
+//srcdbg
+//baseaddress 00500000
+//LINKEROPTION CW -map libgc.map
+//LINKEROPTION CW -filealign 0x10000
+
+CAPABILITY PowerMgmt ReadDeviceData ReadUserData WriteDeviceData WriteUserData SwEvent LocalServices NetworkServices UserEnvironment
+
+
+MACRO ALL_INTERIOR_POINTERS
+MACRO NO_EXECUTE_PERMISSION
+MACRO USE_MMAP
+MACRO GC_ATOMIC_UNCOLLECTABLE
+MACRO GC_DONT_REGISTER_MAIN_STATIC_DATA
+MACRO GC_DLL
+MACRO JAVA_FINALIZATION
+MACRO SYMBIAN
+MACRO ENABLE_DISCLAIM
+//MACRO GC_GCJ_SUPPORT
+
+USERINCLUDE ..\..\include
+USERINCLUDE ..\..\include\private
+
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE \epoc32\include\stdapis
+
+SOURCEPATH ..\..\
+
+SOURCE allchblk.c
+SOURCE alloc.c
+SOURCE blacklst.c
+SOURCE dbg_mlc.c
+SOURCE dyn_load.c
+SOURCE finalize.c
+SOURCE fnlz_mlc.c
+//SOURCE gc_badalc.cpp
+//SOURCE gc_cpp.cpp
+SOURCE gcj_mlc.c
+SOURCE headers.c
+SOURCE mach_dep.c
+SOURCE malloc.c
+SOURCE mallocx.c
+SOURCE mark.c
+SOURCE mark_rts.c
+SOURCE misc.c
+SOURCE new_hblk.c
+SOURCE obj_map.c
+SOURCE os_dep.c
+SOURCE extra/symbian.cpp
+SOURCE ptr_chck.c
+SOURCE reclaim.c
+SOURCE typd_mlc.c
+
+/*
+#ifdef ENABLE_ABIV2_MODE
+ DEBUGGABLE_UDEBONLY
+#endif
+*/
+
+// Using main() as entry point
+STATICLIBRARY libcrt0.lib
+
+// libc and euser are always needed when using main() entry point
+LIBRARY libc.lib
+
+
+LIBRARY euser.lib
+LIBRARY efsrv.lib
+LIBRARY avkon.lib
+LIBRARY eikcore.lib
diff --git a/graphics/asymptote/gc/checksums.c b/graphics/asymptote/gc/checksums.c
new file mode 100644
index 0000000000..cf0c13322a
--- /dev/null
+++ b/graphics/asymptote/gc/checksums.c
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 1992-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+#ifdef CHECKSUMS
+
+/* This is debugging code intended to verify the results of dirty bit */
+/* computations. Works only in a single threaded environment. */
+#define NSUMS 10000
+
+#define OFFSET 0x10000
+
+typedef struct {
+ GC_bool new_valid;
+ word old_sum;
+ word new_sum;
+ struct hblk * block; /* Block to which this refers + OFFSET */
+ /* to hide it from collector. */
+} page_entry;
+
+page_entry GC_sums[NSUMS];
+
+STATIC word GC_faulted[NSUMS] = { 0 };
+ /* Record of pages on which we saw a write fault. */
+
+STATIC size_t GC_n_faulted = 0;
+
+#ifdef MPROTECT_VDB
+ void GC_record_fault(struct hblk * h)
+ {
+ word page = (word)h & ~(word)(GC_page_size-1);
+
+ GC_ASSERT(GC_page_size != 0);
+ if (GC_n_faulted >= NSUMS) ABORT("write fault log overflowed");
+ GC_faulted[GC_n_faulted++] = page;
+ }
+#endif
+
+STATIC GC_bool GC_was_faulted(struct hblk *h)
+{
+ size_t i;
+ word page = (word)h & ~(word)(GC_page_size-1);
+
+ for (i = 0; i < GC_n_faulted; ++i) {
+ if (GC_faulted[i] == page) return TRUE;
+ }
+ return FALSE;
+}
+
+STATIC word GC_checksum(struct hblk *h)
+{
+ word *p = (word *)h;
+ word *lim = (word *)(h+1);
+ word result = 0;
+
+ while ((word)p < (word)lim) {
+ result += *p++;
+ }
+ return(result | 0x80000000 /* doesn't look like pointer */);
+}
+
+int GC_n_dirty_errors = 0;
+int GC_n_faulted_dirty_errors = 0;
+unsigned long GC_n_clean = 0;
+unsigned long GC_n_dirty = 0;
+
+STATIC void GC_update_check_page(struct hblk *h, int index)
+{
+ page_entry *pe = GC_sums + index;
+ hdr * hhdr = HDR(h);
+ struct hblk *b;
+
+ if (pe -> block != 0 && pe -> block != h + OFFSET) ABORT("goofed");
+ pe -> old_sum = pe -> new_sum;
+ pe -> new_sum = GC_checksum(h);
+# if !defined(MSWIN32) && !defined(MSWINCE)
+ if (pe -> new_sum != 0x80000000 && !GC_page_was_ever_dirty(h)) {
+ GC_err_printf("GC_page_was_ever_dirty(%p) is wrong\n", (void *)h);
+ }
+# endif
+ if (GC_page_was_dirty(h)) {
+ GC_n_dirty++;
+ } else {
+ GC_n_clean++;
+ }
+ b = h;
+ while (IS_FORWARDING_ADDR_OR_NIL(hhdr) && hhdr != 0) {
+ b -= (word)hhdr;
+ hhdr = HDR(b);
+ }
+ if (pe -> new_valid
+ && hhdr != 0 && hhdr -> hb_descr != 0 /* may contain pointers */
+ && pe -> old_sum != pe -> new_sum) {
+ if (!GC_page_was_dirty(h) || !GC_page_was_ever_dirty(h)) {
+ GC_bool was_faulted = GC_was_faulted(h);
+ /* Set breakpoint here */GC_n_dirty_errors++;
+ if (was_faulted) GC_n_faulted_dirty_errors++;
+ }
+ }
+ pe -> new_valid = TRUE;
+ pe -> block = h + OFFSET;
+}
+
+word GC_bytes_in_used_blocks = 0;
+
+STATIC void GC_add_block(struct hblk *h, word dummy GC_ATTR_UNUSED)
+{
+ hdr * hhdr = HDR(h);
+
+ GC_bytes_in_used_blocks += (hhdr->hb_sz + HBLKSIZE-1) & ~(word)(HBLKSIZE-1);
+}
+
+STATIC void GC_check_blocks(void)
+{
+ word bytes_in_free_blocks = GC_large_free_bytes;
+
+ GC_bytes_in_used_blocks = 0;
+ GC_apply_to_all_blocks(GC_add_block, (word)0);
+ GC_COND_LOG_PRINTF("GC_bytes_in_used_blocks= %lu,"
+ " bytes_in_free_blocks= %lu, heapsize= %lu\n",
+ (unsigned long)GC_bytes_in_used_blocks,
+ (unsigned long)bytes_in_free_blocks,
+ (unsigned long)GC_heapsize);
+ if (GC_bytes_in_used_blocks + bytes_in_free_blocks != GC_heapsize) {
+ GC_err_printf("LOST SOME BLOCKS!!\n");
+ }
+}
+
+/* Should be called immediately after GC_read_dirty. */
+void GC_check_dirty(void)
+{
+ int index;
+ unsigned i;
+ struct hblk *h;
+ ptr_t start;
+
+ GC_check_blocks();
+
+ GC_n_dirty_errors = 0;
+ GC_n_faulted_dirty_errors = 0;
+ GC_n_clean = 0;
+ GC_n_dirty = 0;
+
+ index = 0;
+ for (i = 0; i < GC_n_heap_sects; i++) {
+ start = GC_heap_sects[i].hs_start;
+ for (h = (struct hblk *)start;
+ (word)h < (word)(start + GC_heap_sects[i].hs_bytes); h++) {
+ GC_update_check_page(h, index);
+ index++;
+ if (index >= NSUMS) goto out;
+ }
+ }
+out:
+ GC_COND_LOG_PRINTF("Checked %lu clean and %lu dirty pages\n",
+ GC_n_clean, GC_n_dirty);
+ if (GC_n_dirty_errors > 0) {
+ GC_err_printf("Found %d dirty bit errors (%d were faulted)\n",
+ GC_n_dirty_errors, GC_n_faulted_dirty_errors);
+ }
+ for (i = 0; i < GC_n_faulted; ++i) {
+ GC_faulted[i] = 0; /* Don't expose block pointers to GC */
+ }
+ GC_n_faulted = 0;
+}
+
+#endif /* CHECKSUMS */
diff --git a/graphics/asymptote/gc/config.guess b/graphics/asymptote/gc/config.guess
new file mode 100755
index 0000000000..e7a6fe3e6d
--- /dev/null
+++ b/graphics/asymptote/gc/config.guess
@@ -0,0 +1,1774 @@
+#!/usr/bin/sh
+# Attempt to guess a canonical system name.
+# Copyright 1992-2023 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2023-06-23'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system '$me' is run on.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2023 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try '$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+# Just in case it came from the environment.
+GUESS=
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still
+# use 'HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+ # prevent multiple calls if $tmp is already set
+ test "$tmp" && return 0
+ : "${TMPDIR=/tmp}"
+ # shellcheck disable=SC2039,SC3028
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+ dummy=$tmp/dummy
+ case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+ ,,) echo "int x;" > "$dummy.c"
+ for driver in cc gcc c89 c99 ; do
+ if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+ CC_FOR_BUILD=$driver
+ break
+ fi
+ done
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+ esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case $UNAME_SYSTEM in
+Linux|GNU|GNU/*)
+ LIBC=unknown
+
+ set_cc_for_build
+ cat <<-EOF > "$dummy.c"
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #elif defined(__GLIBC__)
+ LIBC=gnu
+ #else
+ #include <stdarg.h>
+ /* First heuristic to detect musl libc. */
+ #ifdef __DEFINED_va_list
+ LIBC=musl
+ #endif
+ #endif
+ EOF
+ cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+ eval "$cc_set_libc"
+
+ # Second heuristic to detect musl libc.
+ if [ "$LIBC" = unknown ] &&
+ command -v ldd >/dev/null &&
+ ldd --version 2>&1 | grep -q ^musl; then
+ LIBC=musl
+ fi
+
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ if [ "$LIBC" = unknown ]; then
+ LIBC=gnu
+ fi
+ ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ echo unknown)`
+ case $UNAME_MACHINE_ARCH in
+ aarch64eb) machine=aarch64_be-unknown ;;
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine=${arch}${endian}-unknown
+ ;;
+ *) machine=$UNAME_MACHINE_ARCH-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently (or will in the future) and ABI.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ os=netbsdelf
+ ;;
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # Determine ABI tags.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case $UNAME_VERSION in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ GUESS=$machine-${os}${release}${abi-}
+ ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+ ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+ ;;
+ *:SecBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+ ;;
+ *:LibertyBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+ ;;
+ *:MidnightBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+ ;;
+ *:ekkoBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+ ;;
+ *:SolidBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+ ;;
+ *:OS108:*:*)
+ GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+ ;;
+ macppc:MirBSD:*:*)
+ GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:MirBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:Sortix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-sortix
+ ;;
+ *:Twizzler:*:*)
+ GUESS=$UNAME_MACHINE-unknown-twizzler
+ ;;
+ *:Redox:*:*)
+ GUESS=$UNAME_MACHINE-unknown-redox
+ ;;
+ mips:OSF1:*.*)
+ GUESS=mips-dec-osf1
+ ;;
+ alpha:OSF1:*:*)
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ trap '' 0
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case $ALPHA_CPU_TYPE in
+ "EV4 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE=alpha ;;
+ "EV5 (21164)")
+ UNAME_MACHINE=alphaev5 ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE=alphaev56 ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE=alphapca56 ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE=alphapca57 ;;
+ "EV6 (21264)")
+ UNAME_MACHINE=alphaev6 ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE=alphaev67 ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE=alphaev69 ;;
+ "EV7 (21364)")
+ UNAME_MACHINE=alphaev7 ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE=alphaev79 ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+ ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ GUESS=m68k-unknown-sysv4
+ ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-amigaos
+ ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-morphos
+ ;;
+ *:OS/390:*:*)
+ GUESS=i370-ibm-openedition
+ ;;
+ *:z/VM:*:*)
+ GUESS=s390-ibm-zvmoe
+ ;;
+ *:OS400:*:*)
+ GUESS=powerpc-ibm-os400
+ ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ GUESS=arm-acorn-riscix$UNAME_RELEASE
+ ;;
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
+ GUESS=arm-unknown-riscos
+ ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ GUESS=hppa1.1-hitachi-hiuxmpp
+ ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ case `(/bin/universe) 2>/dev/null` in
+ att) GUESS=pyramid-pyramid-sysv3 ;;
+ *) GUESS=pyramid-pyramid-bsd ;;
+ esac
+ ;;
+ NILE*:*:*:dcosx)
+ GUESS=pyramid-pyramid-svr4
+ ;;
+ DRS?6000:unix:4.0:6*)
+ GUESS=sparc-icl-nx6
+ ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) GUESS=sparc-icl-nx7 ;;
+ esac
+ ;;
+ s390x:SunOS:*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+ ;;
+ sun4H:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-hal-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris2$SUN_REL
+ ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ GUESS=i386-pc-auroraux$UNAME_RELEASE
+ ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ set_cc_for_build
+ SUN_ARCH=i386
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH=x86_64
+ fi
+ fi
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris3$SUN_REL
+ ;;
+ sun4*:SunOS:*:*)
+ case `/usr/bin/arch -k` in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like '4.1.3-JL'.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+ GUESS=sparc-sun-sunos$SUN_REL
+ ;;
+ sun3*:SunOS:*:*)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+ case `/bin/arch` in
+ sun3)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun4)
+ GUESS=sparc-sun-sunos$UNAME_RELEASE
+ ;;
+ esac
+ ;;
+ aushp:SunOS:*:*)
+ GUESS=sparc-auspex-sunos$UNAME_RELEASE
+ ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ GUESS=m68k-milan-mint$UNAME_RELEASE
+ ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ GUESS=m68k-hades-mint$UNAME_RELEASE
+ ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ GUESS=m68k-unknown-mint$UNAME_RELEASE
+ ;;
+ m68k:machten:*:*)
+ GUESS=m68k-apple-machten$UNAME_RELEASE
+ ;;
+ powerpc:machten:*:*)
+ GUESS=powerpc-apple-machten$UNAME_RELEASE
+ ;;
+ RISC*:Mach:*:*)
+ GUESS=mips-dec-mach_bsd4.3
+ ;;
+ RISC*:ULTRIX:*:*)
+ GUESS=mips-dec-ultrix$UNAME_RELEASE
+ ;;
+ VAX*:ULTRIX*:*:*)
+ GUESS=vax-dec-ultrix$UNAME_RELEASE
+ ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ GUESS=clipper-intergraph-clix$UNAME_RELEASE
+ ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+ dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ GUESS=mips-mips-riscos$UNAME_RELEASE
+ ;;
+ Motorola:PowerMAX_OS:*:*)
+ GUESS=powerpc-motorola-powermax
+ ;;
+ Motorola:*:4.3:PL8-*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:Power_UNIX:*:*)
+ GUESS=powerpc-harris-powerunix
+ ;;
+ m88k:CX/UX:7*:*)
+ GUESS=m88k-harris-cxux7
+ ;;
+ m88k:*:4*:R4*)
+ GUESS=m88k-motorola-sysv4
+ ;;
+ m88k:*:3*:R3*)
+ GUESS=m88k-motorola-sysv3
+ ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
+ then
+ if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+ test "$TARGET_BINARY_INTERFACE"x = x
+ then
+ GUESS=m88k-dg-dgux$UNAME_RELEASE
+ else
+ GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
+ fi
+ else
+ GUESS=i586-dg-dgux$UNAME_RELEASE
+ fi
+ ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ GUESS=m88k-dolphin-sysv3
+ ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ GUESS=m88k-motorola-sysv3
+ ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ GUESS=m88k-tektronix-sysv3
+ ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ GUESS=m68k-tektronix-bsd
+ ;;
+ *:IRIX*:*:*)
+ IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+ GUESS=mips-sgi-irix$IRIX_REL
+ ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ GUESS=i386-ibm-aix
+ ;;
+ ia64:AIX:*:*)
+ if test -x /usr/bin/oslevel ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+ ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+ then
+ GUESS=$SYSTEM_NAME
+ else
+ GUESS=rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ GUESS=rs6000-ibm-aix3.2.4
+ else
+ GUESS=rs6000-ibm-aix3.2
+ fi
+ ;;
+ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if test -x /usr/bin/lslpp ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+ ;;
+ *:AIX:*:*)
+ GUESS=rs6000-ibm-aix
+ ;;
+ ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+ GUESS=romp-ibm-bsd4.4
+ ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to
+ ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ GUESS=rs6000-bull-bosx
+ ;;
+ DPX/2?00:B.O.S.:*:*)
+ GUESS=m68k-bull-sysv3
+ ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ GUESS=m68k-hp-bsd
+ ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ GUESS=m68k-hp-bsd4.4
+ ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ case $UNAME_MACHINE in
+ 9000/31?) HP_ARCH=m68000 ;;
+ 9000/[34]??) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if test -x /usr/bin/getconf; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case $sc_cpu_version in
+ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case $sc_kernel_bits in
+ 32) HP_ARCH=hppa2.0n ;;
+ 64) HP_ARCH=hppa2.0w ;;
+ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if test "$HP_ARCH" = ""; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if test "$HP_ARCH" = hppa2.0w
+ then
+ set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH=hppa2.0w
+ else
+ HP_ARCH=hppa64
+ fi
+ fi
+ GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+ ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ GUESS=ia64-hp-hpux$HPUX_REV
+ ;;
+ 3050*:HI-UX:*:*)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ GUESS=unknown-hitachi-hiuxwe2
+ ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+ GUESS=hppa1.1-hp-bsd
+ ;;
+ 9000/8??:4.3bsd:*:*)
+ GUESS=hppa1.0-hp-bsd
+ ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ GUESS=hppa1.0-hp-mpeix
+ ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+ GUESS=hppa1.1-hp-osf
+ ;;
+ hp8??:OSF1:*:*)
+ GUESS=hppa1.0-hp-osf
+ ;;
+ i*86:OSF1:*:*)
+ if test -x /usr/sbin/sysversion ; then
+ GUESS=$UNAME_MACHINE-unknown-osf1mk
+ else
+ GUESS=$UNAME_MACHINE-unknown-osf1
+ fi
+ ;;
+ parisc*:Lites*:*:*)
+ GUESS=hppa1.1-hp-lites
+ ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ GUESS=c1-convex-bsd
+ ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ GUESS=c34-convex-bsd
+ ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ GUESS=c38-convex-bsd
+ ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ GUESS=c4-convex-bsd
+ ;;
+ CRAY*Y-MP:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=ymp-cray-unicos$CRAY_REL
+ ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=t90-cray-unicos$CRAY_REL
+ ;;
+ CRAY*T3E:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=alphaev5-cray-unicosmk$CRAY_REL
+ ;;
+ CRAY*SV1:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=sv1-cray-unicos$CRAY_REL
+ ;;
+ *:UNICOS/mp:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=craynv-cray-unicosmp$CRAY_REL
+ ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+ GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+ GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+ ;;
+ sparc*:BSD/OS:*:*)
+ GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+ ;;
+ *:BSD/OS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+ ;;
+ arm:FreeBSD:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ set_cc_for_build
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
+ else
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
+ fi
+ ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case $UNAME_PROCESSOR in
+ amd64)
+ UNAME_PROCESSOR=x86_64 ;;
+ i386)
+ UNAME_PROCESSOR=i586 ;;
+ esac
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+ ;;
+ i*:CYGWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-cygwin
+ ;;
+ *:MINGW64*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw64
+ ;;
+ *:MINGW*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw32
+ ;;
+ *:MSYS*:*)
+ GUESS=$UNAME_MACHINE-pc-msys
+ ;;
+ i*:PW*:*)
+ GUESS=$UNAME_MACHINE-pc-pw32
+ ;;
+ *:SerenityOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-serenity
+ ;;
+ *:Interix*:*)
+ case $UNAME_MACHINE in
+ x86)
+ GUESS=i586-pc-interix$UNAME_RELEASE
+ ;;
+ authenticamd | genuineintel | EM64T)
+ GUESS=x86_64-unknown-interix$UNAME_RELEASE
+ ;;
+ IA64)
+ GUESS=ia64-unknown-interix$UNAME_RELEASE
+ ;;
+ esac ;;
+ i*:UWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-uwin
+ ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ GUESS=x86_64-pc-cygwin
+ ;;
+ prep*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=powerpcle-unknown-solaris2$SUN_REL
+ ;;
+ *:GNU:*:*)
+ # the GNU system
+ GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+ GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+ ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+ ;;
+ x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*)
+ GUESS="$UNAME_MACHINE-pc-managarm-mlibc"
+ ;;
+ *:[Mm]anagarm:*:*)
+ GUESS="$UNAME_MACHINE-unknown-managarm-mlibc"
+ ;;
+ *:Minix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-minix
+ ;;
+ aarch64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arm*:Linux:*:*)
+ set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
+ else
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
+ fi
+ fi
+ ;;
+ avr32*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ cris:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ crisv32:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ e2k:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ frv:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ hexagon:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:Linux:*:*)
+ GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+ ;;
+ ia64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ k1om:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ loongarch32:Linux:*:* | loongarch64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m32r*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m68*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ set_cc_for_build
+ IS_GLIBC=0
+ test x"${LIBC}" = xgnu && IS_GLIBC=1
+ sed 's/^ //' << EOF > "$dummy.c"
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #undef mips64
+ #undef mips64el
+ #if ${IS_GLIBC} && defined(_ABI64)
+ LIBCABI=gnuabi64
+ #else
+ #if ${IS_GLIBC} && defined(_ABIN32)
+ LIBCABI=gnuabin32
+ #else
+ LIBCABI=${LIBC}
+ #endif
+ #endif
+
+ #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa64r6
+ #else
+ #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa32r6
+ #else
+ #if defined(__mips64)
+ CPU=mips64
+ #else
+ CPU=mips
+ #endif
+ #endif
+ #endif
+
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ MIPS_ENDIAN=el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ MIPS_ENDIAN=
+ #else
+ MIPS_ENDIAN=
+ #endif
+ #endif
+EOF
+ cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+ eval "$cc_set_vars"
+ test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+ ;;
+ mips64el:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ openrisc*:Linux:*:*)
+ GUESS=or1k-unknown-linux-$LIBC
+ ;;
+ or32:Linux:*:* | or1k*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ padre:Linux:*:*)
+ GUESS=sparc-unknown-linux-$LIBC
+ ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ GUESS=hppa64-unknown-linux-$LIBC
+ ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+ PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+ *) GUESS=hppa-unknown-linux-$LIBC ;;
+ esac
+ ;;
+ ppc64:Linux:*:*)
+ GUESS=powerpc64-unknown-linux-$LIBC
+ ;;
+ ppc:Linux:*:*)
+ GUESS=powerpc-unknown-linux-$LIBC
+ ;;
+ ppc64le:Linux:*:*)
+ GUESS=powerpc64le-unknown-linux-$LIBC
+ ;;
+ ppcle:Linux:*:*)
+ GUESS=powerpcle-unknown-linux-$LIBC
+ ;;
+ riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+ ;;
+ sh64*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sh*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ tile*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ vax:Linux:*:*)
+ GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+ ;;
+ x86_64:Linux:*:*)
+ set_cc_for_build
+ CPU=$UNAME_MACHINE
+ LIBCABI=$LIBC
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ ABI=64
+ sed 's/^ //' << EOF > "$dummy.c"
+ #ifdef __i386__
+ ABI=x86
+ #else
+ #ifdef __ILP32__
+ ABI=x32
+ #endif
+ #endif
+EOF
+ cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
+ eval "$cc_set_abi"
+ case $ABI in
+ x86) CPU=i686 ;;
+ x32) LIBCABI=${LIBC}x32 ;;
+ esac
+ fi
+ GUESS=$CPU-pc-linux-$LIBCABI
+ ;;
+ xtensa*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ GUESS=i386-sequent-sysv4
+ ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+ ;;
+ i*86:OS/2:*:*)
+ # If we were able to find 'uname', then EMX Unix compatibility
+ # is probably installed.
+ GUESS=$UNAME_MACHINE-pc-os2-emx
+ ;;
+ i*86:XTS-300:*:STOP)
+ GUESS=$UNAME_MACHINE-unknown-stop
+ ;;
+ i*86:atheos:*:*)
+ GUESS=$UNAME_MACHINE-unknown-atheos
+ ;;
+ i*86:syllable:*:*)
+ GUESS=$UNAME_MACHINE-pc-syllable
+ ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ GUESS=i386-unknown-lynxos$UNAME_RELEASE
+ ;;
+ i*86:*DOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+ ;;
+ i*86:*:4.*:*)
+ UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
+ fi
+ ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv32
+ fi
+ ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configure will decide that
+ # this is a cross-build.
+ GUESS=i586-pc-msdosdjgpp
+ ;;
+ Intel:Mach:3*:*)
+ GUESS=i386-pc-mach3
+ ;;
+ paragon:*:*:*)
+ GUESS=i860-intel-osf1
+ ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4
+ fi
+ ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ GUESS=m68010-convergent-sysv
+ ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ GUESS=m68k-convergent-sysv
+ ;;
+ M680?0:D-NIX:5.3:*)
+ GUESS=m68k-diab-dnix
+ ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+ ;;
+ mc68030:UNIX_System_V:4.*:*)
+ GUESS=m68k-atari-sysv4
+ ;;
+ TSUNAMI:LynxOS:2.*:*)
+ GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ rs6000:LynxOS:2.*:*)
+ GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+ ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ SM[BE]S:UNIX_SV:*:*)
+ GUESS=mips-dde-sysv$UNAME_RELEASE
+ ;;
+ RM*:ReliantUNIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ RM*:SINIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ GUESS=$UNAME_MACHINE-sni-sysv4
+ else
+ GUESS=ns32k-sni-sysv
+ fi
+ ;;
+ PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ GUESS=i586-unisys-sysv4
+ ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ GUESS=hppa1.1-stratus-sysv4
+ ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ GUESS=i860-stratus-sysv4
+ ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=$UNAME_MACHINE-stratus-vos
+ ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=hppa1.1-stratus-vos
+ ;;
+ mc68*:A/UX:*:*)
+ GUESS=m68k-apple-aux$UNAME_RELEASE
+ ;;
+ news*:NEWS-OS:6*:*)
+ GUESS=mips-sony-newsos6
+ ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if test -d /usr/nec; then
+ GUESS=mips-nec-sysv$UNAME_RELEASE
+ else
+ GUESS=mips-unknown-sysv$UNAME_RELEASE
+ fi
+ ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ GUESS=powerpc-be-beos
+ ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ GUESS=powerpc-apple-beos
+ ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ GUESS=i586-pc-beos
+ ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ GUESS=i586-pc-haiku
+ ;;
+ ppc:Haiku:*:*) # Haiku running on Apple PowerPC
+ GUESS=powerpc-apple-haiku
+ ;;
+ *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat)
+ GUESS=$UNAME_MACHINE-unknown-haiku
+ ;;
+ SX-4:SUPER-UX:*:*)
+ GUESS=sx4-nec-superux$UNAME_RELEASE
+ ;;
+ SX-5:SUPER-UX:*:*)
+ GUESS=sx5-nec-superux$UNAME_RELEASE
+ ;;
+ SX-6:SUPER-UX:*:*)
+ GUESS=sx6-nec-superux$UNAME_RELEASE
+ ;;
+ SX-7:SUPER-UX:*:*)
+ GUESS=sx7-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8:SUPER-UX:*:*)
+ GUESS=sx8-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8R:SUPER-UX:*:*)
+ GUESS=sx8r-nec-superux$UNAME_RELEASE
+ ;;
+ SX-ACE:SUPER-UX:*:*)
+ GUESS=sxace-nec-superux$UNAME_RELEASE
+ ;;
+ Power*:Rhapsody:*:*)
+ GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+ ;;
+ *:Rhapsody:*:*)
+ GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+ ;;
+ arm64:Darwin:*:*)
+ GUESS=aarch64-apple-darwin$UNAME_RELEASE
+ ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ if command -v xcode-select > /dev/null 2> /dev/null && \
+ ! xcode-select --print-path > /dev/null 2> /dev/null ; then
+ # Avoid executing cc if there is no toolchain installed as
+ # cc will be a stub that puts up a graphical alert
+ # prompting the user to install developer tools.
+ CC_FOR_BUILD=no_compiler_found
+ else
+ set_cc_for_build
+ fi
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_PPC >/dev/null
+ then
+ UNAME_PROCESSOR=powerpc
+ fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # uname -m returns i386 or x86_64
+ UNAME_PROCESSOR=$UNAME_MACHINE
+ fi
+ GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+ ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = x86; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+ ;;
+ *:QNX:*:4*)
+ GUESS=i386-pc-qnx
+ ;;
+ NEO-*:NONSTOP_KERNEL:*:*)
+ GUESS=neo-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
+ GUESS=nse-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSR-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsr-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSV-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsv-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSX-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsx-tandem-nsk$UNAME_RELEASE
+ ;;
+ *:NonStop-UX:*:*)
+ GUESS=mips-compaq-nonstopux
+ ;;
+ BS2000:POSIX*:*:*)
+ GUESS=bs2000-siemens-sysv
+ ;;
+ DS/*:UNIX_System_V:*:*)
+ GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+ ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "${cputype-}" = 386; then
+ UNAME_MACHINE=i386
+ elif test "x${cputype-}" != x; then
+ UNAME_MACHINE=$cputype
+ fi
+ GUESS=$UNAME_MACHINE-unknown-plan9
+ ;;
+ *:TOPS-10:*:*)
+ GUESS=pdp10-unknown-tops10
+ ;;
+ *:TENEX:*:*)
+ GUESS=pdp10-unknown-tenex
+ ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ GUESS=pdp10-dec-tops20
+ ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ GUESS=pdp10-xkl-tops20
+ ;;
+ *:TOPS-20:*:*)
+ GUESS=pdp10-unknown-tops20
+ ;;
+ *:ITS:*:*)
+ GUESS=pdp10-unknown-its
+ ;;
+ SEI:*:*:SEIUX)
+ GUESS=mips-sei-seiux$UNAME_RELEASE
+ ;;
+ *:DragonFly:*:*)
+ DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+ ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case $UNAME_MACHINE in
+ A*) GUESS=alpha-dec-vms ;;
+ I*) GUESS=ia64-dec-vms ;;
+ V*) GUESS=vax-dec-vms ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ GUESS=i386-pc-xenix
+ ;;
+ i*86:skyos:*:*)
+ SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+ GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+ ;;
+ i*86:rdos:*:*)
+ GUESS=$UNAME_MACHINE-pc-rdos
+ ;;
+ i*86:Fiwix:*:*)
+ GUESS=$UNAME_MACHINE-pc-fiwix
+ ;;
+ *:AROS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-aros
+ ;;
+ x86_64:VMkernel:*:*)
+ GUESS=$UNAME_MACHINE-unknown-esx
+ ;;
+ amd64:Isilon\ OneFS:*:*)
+ GUESS=x86_64-unknown-onefs
+ ;;
+ *:Unleashed:*:*)
+ GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+ ;;
+esac
+
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+ echo "$GUESS"
+ exit
+fi
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname un;
+ uname (&un);
+ printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname *un;
+ uname (&un);
+ printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case $UNAME_MACHINE:$UNAME_SYSTEM in
+ mips:Linux | mips64:Linux)
+ # If we got here on MIPS GNU/Linux, output extra information.
+ cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+ ;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+and
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+ cat >&2 <<EOF
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+fi
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/graphics/asymptote/gc/config.sub b/graphics/asymptote/gc/config.sub
new file mode 100755
index 0000000000..a6d99a0f15
--- /dev/null
+++ b/graphics/asymptote/gc/config.sub
@@ -0,0 +1,1907 @@
+#!/usr/bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2023 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2023-06-23'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2023 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try '$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo "$1"
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+saved_IFS=$IFS
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+IFS=$saved_IFS
+
+# Separate into logical components for further validation
+case $1 in
+ *-*-*-*-*)
+ echo "Invalid configuration '$1': more than four components" >&2
+ exit 1
+ ;;
+ *-*-*-*)
+ basic_machine=$field1-$field2
+ basic_os=$field3-$field4
+ ;;
+ *-*-*)
+ # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+ # parts
+ maybe_os=$field2-$field3
+ case $maybe_os in
+ nto-qnx* | linux-* | uclinux-uclibc* \
+ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-*)
+ basic_machine=$field1
+ basic_os=$maybe_os
+ ;;
+ android-linux)
+ basic_machine=$field1-unknown
+ basic_os=linux-android
+ ;;
+ *)
+ basic_machine=$field1-$field2
+ basic_os=$field3
+ ;;
+ esac
+ ;;
+ *-*)
+ # A lone config we happen to match not fitting any pattern
+ case $field1-$field2 in
+ decstation-3100)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ *-*)
+ # Second component is usually, but not always the OS
+ case $field2 in
+ # Prevent following clause from handling this valid os
+ sun*os*)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ zephyr*)
+ basic_machine=$field1-unknown
+ basic_os=$field2
+ ;;
+ # Manufacturers
+ dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+ | unicom* | ibm* | next | hp | isi* | apollo | altos* \
+ | convergent* | ncr* | news | 32* | 3600* | 3100* \
+ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+ | ultra | tti* | harris | dolphin | highlevel | gould \
+ | cbm | ns | masscomp | apple | axis | knuth | cray \
+ | microblaze* | sim | cisco \
+ | oki | wec | wrs | winbond)
+ basic_machine=$field1-$field2
+ basic_os=
+ ;;
+ *)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *)
+ # Convert single-component short-hands not valid as part of
+ # multi-component configurations.
+ case $field1 in
+ 386bsd)
+ basic_machine=i386-pc
+ basic_os=bsd
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ basic_os=scout
+ ;;
+ alliant)
+ basic_machine=fx80-alliant
+ basic_os=
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ basic_os=
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ basic_os=bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ basic_os=sysv
+ ;;
+ amiga)
+ basic_machine=m68k-unknown
+ basic_os=
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ basic_os=amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ basic_os=sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ basic_os=sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ basic_os=bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ basic_os=aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ basic_os=aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ basic_os=dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ basic_os=linux
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ basic_os=cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ basic_os=bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ basic_os=bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ basic_os=bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ basic_os=bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ basic_os=bsd
+ ;;
+ cray)
+ basic_machine=j90-cray
+ basic_os=unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ basic_os=
+ ;;
+ da30)
+ basic_machine=m68k-da30
+ basic_os=
+ ;;
+ decstation | pmax | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ basic_os=sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ basic_os=dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ basic_os=msdosdjgpp
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ basic_os=ebmon
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ basic_os=ose
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ basic_os=sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ basic_os=go32
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ basic_os=hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ basic_os=xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ basic_os=hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ basic_os=sysv3
+ ;;
+ hp300 | hp300hpux)
+ basic_machine=m68k-hp
+ basic_os=hpux
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ basic_os=bsd
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ basic_os=osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ basic_os=proelf
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ basic_os=mach
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ basic_os=sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ basic_os=linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ basic_os=sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ basic_os=sysv
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ basic_os=mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ basic_os=mingw32ce
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ basic_os=morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ basic_os=moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ basic_os=msdos
+ ;;
+ msys)
+ basic_machine=i686-pc
+ basic_os=msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ basic_os=mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ basic_os=nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ basic_os=sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-pc
+ basic_os=netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ basic_os=linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ basic_os=newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ basic_os=newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ basic_os=sysv
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ basic_os=cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ basic_os=cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ basic_os=nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ basic_os=mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ basic_os=nonstopux
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ basic_os=os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ basic_os=ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ basic_os=os68k
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ basic_os=osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ basic_os=linux
+ ;;
+ psp)
+ basic_machine=mipsallegrexel-sony
+ basic_os=psp
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ basic_os=pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ basic_os=rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ basic_os=rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ sei)
+ basic_machine=mips-sei
+ basic_os=seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ basic_os=
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ basic_os=sysv2
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ basic_os=
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ basic_os=sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ basic_os=
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ basic_os=sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ basic_os=sunos4
+ ;;
+ sun3)
+ basic_machine=m68k-sun
+ basic_os=
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ basic_os=sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ basic_os=sunos4
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ basic_os=
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ basic_os=sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ basic_os=sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ basic_os=solaris2
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ basic_os=
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ basic_os=unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ basic_os=dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ basic_os=unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ basic_os=unicos
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ basic_os=tops20
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ basic_os=tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ basic_os=sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ basic_os=none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ basic_os=sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ basic_os=vms
+ ;;
+ vsta)
+ basic_machine=i386-pc
+ basic_os=vsta
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ basic_os=vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ basic_os=vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ basic_os=vxworks
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ basic_os=unicos
+ ;;
+ *)
+ basic_machine=$1
+ basic_os=
+ ;;
+ esac
+ ;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+ # Here we handle the default manufacturer of certain CPU types. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ cpu=hppa1.1
+ vendor=winbond
+ ;;
+ op50n)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ op60c)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ ibm*)
+ cpu=i370
+ vendor=ibm
+ ;;
+ orion105)
+ cpu=clipper
+ vendor=highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ cpu=m68k
+ vendor=apple
+ ;;
+ pmac | pmac-mpw)
+ cpu=powerpc
+ vendor=apple
+ ;;
+
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ cpu=m68000
+ vendor=att
+ ;;
+ 3b*)
+ cpu=we32k
+ vendor=att
+ ;;
+ bluegene*)
+ cpu=powerpc
+ vendor=ibm
+ basic_os=cnk
+ ;;
+ decsystem10* | dec10*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops10
+ ;;
+ decsystem20* | dec20*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ cpu=m68k
+ vendor=motorola
+ ;;
+ dpx2*)
+ cpu=m68k
+ vendor=bull
+ basic_os=sysv3
+ ;;
+ encore | umax | mmax)
+ cpu=ns32k
+ vendor=encore
+ ;;
+ elxsi)
+ cpu=elxsi
+ vendor=elxsi
+ basic_os=${basic_os:-bsd}
+ ;;
+ fx2800)
+ cpu=i860
+ vendor=alliant
+ ;;
+ genix)
+ cpu=ns32k
+ vendor=ns
+ ;;
+ h3050r* | hiux*)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ cpu=m68000
+ vendor=hp
+ ;;
+ hp9k3[2-9][0-9])
+ cpu=m68k
+ vendor=hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ i*86v32)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv32
+ ;;
+ i*86v4*)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv4
+ ;;
+ i*86v)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv
+ ;;
+ i*86sol2)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=solaris2
+ ;;
+ j90 | j90-cray)
+ cpu=j90
+ vendor=cray
+ basic_os=${basic_os:-unicos}
+ ;;
+ iris | iris4d)
+ cpu=mips
+ vendor=sgi
+ case $basic_os in
+ irix*)
+ ;;
+ *)
+ basic_os=irix4
+ ;;
+ esac
+ ;;
+ miniframe)
+ cpu=m68000
+ vendor=convergent
+ ;;
+ *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ cpu=m68k
+ vendor=atari
+ basic_os=mint
+ ;;
+ news-3600 | risc-news)
+ cpu=mips
+ vendor=sony
+ basic_os=newsos
+ ;;
+ next | m*-next)
+ cpu=m68k
+ vendor=next
+ case $basic_os in
+ openstep*)
+ ;;
+ nextstep*)
+ ;;
+ ns2*)
+ basic_os=nextstep2
+ ;;
+ *)
+ basic_os=nextstep3
+ ;;
+ esac
+ ;;
+ np1)
+ cpu=np1
+ vendor=gould
+ ;;
+ op50n-* | op60c-*)
+ cpu=hppa1.1
+ vendor=oki
+ basic_os=proelf
+ ;;
+ pa-hitachi)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ pbd)
+ cpu=sparc
+ vendor=tti
+ ;;
+ pbb)
+ cpu=m68k
+ vendor=tti
+ ;;
+ pc532)
+ cpu=ns32k
+ vendor=pc532
+ ;;
+ pn)
+ cpu=pn
+ vendor=gould
+ ;;
+ power)
+ cpu=power
+ vendor=ibm
+ ;;
+ ps2)
+ cpu=i386
+ vendor=ibm
+ ;;
+ rm[46]00)
+ cpu=mips
+ vendor=siemens
+ ;;
+ rtpc | rtpc-*)
+ cpu=romp
+ vendor=ibm
+ ;;
+ sde)
+ cpu=mipsisa32
+ vendor=sde
+ basic_os=${basic_os:-elf}
+ ;;
+ simso-wrs)
+ cpu=sparclite
+ vendor=wrs
+ basic_os=vxworks
+ ;;
+ tower | tower-32)
+ cpu=m68k
+ vendor=ncr
+ ;;
+ vpp*|vx|vx-*)
+ cpu=f301
+ vendor=fujitsu
+ ;;
+ w65)
+ cpu=w65
+ vendor=wdc
+ ;;
+ w89k-*)
+ cpu=hppa1.1
+ vendor=winbond
+ basic_os=proelf
+ ;;
+ none)
+ cpu=none
+ vendor=none
+ ;;
+ leon|leon[3-9])
+ cpu=sparc
+ vendor=$basic_machine
+ ;;
+ leon-*|leon[3-9]-*)
+ cpu=sparc
+ vendor=`echo "$basic_machine" | sed 's/-.*//'`
+ ;;
+
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+ IFS=$saved_IFS
+ ;;
+ # We use 'pc' rather than 'unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ cpu=$basic_machine
+ vendor=pc
+ ;;
+ # These rules are duplicated from below for sake of the special case above;
+ # i.e. things that normalized to x86 arches should also default to "pc"
+ pc98)
+ cpu=i386
+ vendor=pc
+ ;;
+ x64 | amd64)
+ cpu=x86_64
+ vendor=pc
+ ;;
+ # Recognize the basic CPU types without company name.
+ *)
+ cpu=$basic_machine
+ vendor=unknown
+ ;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+ # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ craynv-unknown)
+ vendor=cray
+ basic_os=${basic_os:-unicosmp}
+ ;;
+ c90-unknown | c90-cray)
+ vendor=cray
+ basic_os=${Basic_os:-unicos}
+ ;;
+ fx80-unknown)
+ vendor=alliant
+ ;;
+ romp-unknown)
+ vendor=ibm
+ ;;
+ mmix-unknown)
+ vendor=knuth
+ ;;
+ microblaze-unknown | microblazeel-unknown)
+ vendor=xilinx
+ ;;
+ rs6000-unknown)
+ vendor=ibm
+ ;;
+ vax-unknown)
+ vendor=dec
+ ;;
+ pdp11-unknown)
+ vendor=dec
+ ;;
+ we32k-unknown)
+ vendor=att
+ ;;
+ cydra-unknown)
+ vendor=cydrome
+ ;;
+ i370-ibm*)
+ vendor=ibm
+ ;;
+ orion-unknown)
+ vendor=highlevel
+ ;;
+ xps-unknown | xps100-unknown)
+ cpu=xps100
+ vendor=honeywell
+ ;;
+
+ # Here we normalize CPU types with a missing or matching vendor
+ armh-unknown | armh-alt)
+ cpu=armv7l
+ vendor=alt
+ basic_os=${basic_os:-linux-gnueabihf}
+ ;;
+ dpx20-unknown | dpx20-bull)
+ cpu=rs6000
+ vendor=bull
+ basic_os=${basic_os:-bosx}
+ ;;
+
+ # Here we normalize CPU types irrespective of the vendor
+ amd64-*)
+ cpu=x86_64
+ ;;
+ blackfin-*)
+ cpu=bfin
+ basic_os=linux
+ ;;
+ c54x-*)
+ cpu=tic54x
+ ;;
+ c55x-*)
+ cpu=tic55x
+ ;;
+ c6x-*)
+ cpu=tic6x
+ ;;
+ e500v[12]-*)
+ cpu=powerpc
+ basic_os=${basic_os}"spe"
+ ;;
+ mips3*-*)
+ cpu=mips64
+ ;;
+ ms1-*)
+ cpu=mt
+ ;;
+ m68knommu-*)
+ cpu=m68k
+ basic_os=linux
+ ;;
+ m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+ cpu=s12z
+ ;;
+ openrisc-*)
+ cpu=or32
+ ;;
+ parisc-*)
+ cpu=hppa
+ basic_os=linux
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ cpu=i586
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*)
+ cpu=i686
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ cpu=i686
+ ;;
+ pentium4-*)
+ cpu=i786
+ ;;
+ pc98-*)
+ cpu=i386
+ ;;
+ ppc-* | ppcbe-*)
+ cpu=powerpc
+ ;;
+ ppcle-* | powerpclittle-*)
+ cpu=powerpcle
+ ;;
+ ppc64-*)
+ cpu=powerpc64
+ ;;
+ ppc64le-* | powerpc64little-*)
+ cpu=powerpc64le
+ ;;
+ sb1-*)
+ cpu=mipsisa64sb1
+ ;;
+ sb1el-*)
+ cpu=mipsisa64sb1el
+ ;;
+ sh5e[lb]-*)
+ cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+ ;;
+ spur-*)
+ cpu=spur
+ ;;
+ strongarm-* | thumb-*)
+ cpu=arm
+ ;;
+ tx39-*)
+ cpu=mipstx39
+ ;;
+ tx39el-*)
+ cpu=mipstx39el
+ ;;
+ x64-*)
+ cpu=x86_64
+ ;;
+ xscale-* | xscalee[bl]-*)
+ cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+ ;;
+ arm64-* | aarch64le-*)
+ cpu=aarch64
+ ;;
+
+ # Recognize the canonical CPU Types that limit and/or modify the
+ # company names they are paired with.
+ cr16-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ crisv32-* | etraxfs*-*)
+ cpu=crisv32
+ vendor=axis
+ ;;
+ cris-* | etrax*-*)
+ cpu=cris
+ vendor=axis
+ ;;
+ crx-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ neo-tandem)
+ cpu=neo
+ vendor=tandem
+ ;;
+ nse-tandem)
+ cpu=nse
+ vendor=tandem
+ ;;
+ nsr-tandem)
+ cpu=nsr
+ vendor=tandem
+ ;;
+ nsv-tandem)
+ cpu=nsv
+ vendor=tandem
+ ;;
+ nsx-tandem)
+ cpu=nsx
+ vendor=tandem
+ ;;
+ mipsallegrexel-sony)
+ cpu=mipsallegrexel
+ vendor=sony
+ ;;
+ tile*-*)
+ basic_os=${basic_os:-linux-gnu}
+ ;;
+
+ *)
+ # Recognize the canonical CPU types that are allowed with any
+ # company name.
+ case $cpu in
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | abacus \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+ | alphapca5[67] | alpha64pca5[67] \
+ | am33_2.0 \
+ | amdgcn \
+ | arc | arceb | arc32 | arc64 \
+ | arm | arm[lb]e | arme[lb] | armv* \
+ | avr | avr32 \
+ | asmjs \
+ | ba \
+ | be32 | be64 \
+ | bfin | bpf | bs2000 \
+ | c[123]* | c30 | [cjt]90 | c4x \
+ | c8051 | clipper | craynv | csky | cydra \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | elxsi | epiphany \
+ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+ | h8300 | h8500 \
+ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | loongarch32 | loongarch64 \
+ | m32c | m32r | m32rle \
+ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64eb | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r3 | mipsisa32r3el \
+ | mipsisa32r5 | mipsisa32r5el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r3 | mipsisa64r3el \
+ | mipsisa64r5 | mipsisa64r5el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mmix \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nfp \
+ | nios | nios2 | nios2eb | nios2el \
+ | none | np1 | ns16k | ns32k | nvptx \
+ | open8 \
+ | or1k* \
+ | or32 \
+ | orion \
+ | picochip \
+ | pdp10 | pdp11 | pj | pjl | pn | power \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+ | pru \
+ | pyramid \
+ | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
+ | rl78 | romp | rs6000 | rx \
+ | s390 | s390x \
+ | score \
+ | sh | shl \
+ | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+ | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+ | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+ | spu \
+ | tahoe \
+ | thumbv7* \
+ | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+ | tron \
+ | ubicom32 \
+ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+ | vax \
+ | visium \
+ | w65 \
+ | wasm32 | wasm64 \
+ | we32k \
+ | x86 | x86_64 | xc16x | xgate | xps100 \
+ | xstormy16 | xtensa* \
+ | ymp \
+ | z8k | z80)
+ ;;
+
+ *)
+ echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+ digital*)
+ vendor=dec
+ ;;
+ commodore*)
+ vendor=cbm
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if test x$basic_os != x
+then
+
+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+ gnu/linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+ ;;
+ os2-emx)
+ kernel=os2
+ os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+ ;;
+ nto-qnx*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+ ;;
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+ IFS=$saved_IFS
+ ;;
+ # Default OS when just kernel was specified
+ nto*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+ ;;
+ linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+ ;;
+ managarm*)
+ kernel=managarm
+ os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'`
+ ;;
+ *)
+ kernel=
+ os=$basic_os
+ ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
+case $os in
+ # First match some system type aliases that might get confused
+ # with valid system types.
+ # solaris* is a basic system type, with this one exception.
+ auroraux)
+ os=auroraux
+ ;;
+ bluegene*)
+ os=cnk
+ ;;
+ solaris1 | solaris1.*)
+ os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
+ ;;
+ solaris)
+ os=solaris2
+ ;;
+ unixware*)
+ os=sysv4.2uw
+ ;;
+ # es1800 is here to avoid being matched by es* (a different OS)
+ es1800*)
+ os=ose
+ ;;
+ # Some version numbers need modification
+ chorusos*)
+ os=chorusos
+ ;;
+ isc)
+ os=isc2.2
+ ;;
+ sco6)
+ os=sco5v6
+ ;;
+ sco5)
+ os=sco3.2v5
+ ;;
+ sco4)
+ os=sco3.2v4
+ ;;
+ sco3.2.[4-9]*)
+ os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
+ ;;
+ sco*v* | scout)
+ # Don't match below
+ ;;
+ sco*)
+ os=sco3.2v2
+ ;;
+ psos*)
+ os=psos
+ ;;
+ qnx*)
+ os=qnx
+ ;;
+ hiux*)
+ os=hiuxwe2
+ ;;
+ lynx*178)
+ os=lynxos178
+ ;;
+ lynx*5)
+ os=lynxos5
+ ;;
+ lynxos*)
+ # don't get caught up in next wildcard
+ ;;
+ lynx*)
+ os=lynxos
+ ;;
+ mac[0-9]*)
+ os=`echo "$os" | sed -e 's|mac|macos|'`
+ ;;
+ opened*)
+ os=openedition
+ ;;
+ os400*)
+ os=os400
+ ;;
+ sunos5*)
+ os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+ ;;
+ sunos6*)
+ os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+ ;;
+ wince*)
+ os=wince
+ ;;
+ utek*)
+ os=bsd
+ ;;
+ dynix*)
+ os=bsd
+ ;;
+ acis*)
+ os=aos
+ ;;
+ atheos*)
+ os=atheos
+ ;;
+ syllable*)
+ os=syllable
+ ;;
+ 386bsd)
+ os=bsd
+ ;;
+ ctix* | uts*)
+ os=sysv
+ ;;
+ nova*)
+ os=rtmk-nova
+ ;;
+ ns2)
+ os=nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ sinix5.*)
+ os=`echo "$os" | sed -e 's|sinix|sysv|'`
+ ;;
+ sinix*)
+ os=sysv4
+ ;;
+ tpf*)
+ os=tpf
+ ;;
+ triton*)
+ os=sysv3
+ ;;
+ oss*)
+ os=sysv3
+ ;;
+ svr4*)
+ os=sysv4
+ ;;
+ svr3)
+ os=sysv3
+ ;;
+ sysvr4)
+ os=sysv4
+ ;;
+ ose*)
+ os=ose
+ ;;
+ *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ os=mint
+ ;;
+ dicos*)
+ os=dicos
+ ;;
+ pikeos*)
+ # Until real need of OS specific support for
+ # particular features comes up, bare metal
+ # configurations are quite functional.
+ case $cpu in
+ arm*)
+ os=eabi
+ ;;
+ *)
+ os=elf
+ ;;
+ esac
+ ;;
+ *)
+ # No normalization, but not necessarily accepted, that comes below.
+ ;;
+esac
+
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+kernel=
+case $cpu-$vendor in
+ score-*)
+ os=elf
+ ;;
+ spu-*)
+ os=elf
+ ;;
+ *-acorn)
+ os=riscix1.2
+ ;;
+ arm*-rebel)
+ kernel=linux
+ os=gnu
+ ;;
+ arm*-semi)
+ os=aout
+ ;;
+ c4x-* | tic4x-*)
+ os=coff
+ ;;
+ c8051-*)
+ os=elf
+ ;;
+ clipper-intergraph)
+ os=clix
+ ;;
+ hexagon-*)
+ os=elf
+ ;;
+ tic54x-*)
+ os=coff
+ ;;
+ tic55x-*)
+ os=coff
+ ;;
+ tic6x-*)
+ os=coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=tops20
+ ;;
+ pdp11-*)
+ os=none
+ ;;
+ *-dec | vax-*)
+ os=ultrix4.2
+ ;;
+ m68*-apollo)
+ os=domain
+ ;;
+ i386-sun)
+ os=sunos4.0.2
+ ;;
+ m68000-sun)
+ os=sunos3
+ ;;
+ m68*-cisco)
+ os=aout
+ ;;
+ mep-*)
+ os=elf
+ ;;
+ mips*-cisco)
+ os=elf
+ ;;
+ mips*-*)
+ os=elf
+ ;;
+ or32-*)
+ os=coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=sysv3
+ ;;
+ sparc-* | *-sun)
+ os=sunos4.1.1
+ ;;
+ pru-*)
+ os=elf
+ ;;
+ *-be)
+ os=beos
+ ;;
+ *-ibm)
+ os=aix
+ ;;
+ *-knuth)
+ os=mmixware
+ ;;
+ *-wec)
+ os=proelf
+ ;;
+ *-winbond)
+ os=proelf
+ ;;
+ *-oki)
+ os=proelf
+ ;;
+ *-hp)
+ os=hpux
+ ;;
+ *-hitachi)
+ os=hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=sysv
+ ;;
+ *-cbm)
+ os=amigaos
+ ;;
+ *-dg)
+ os=dgux
+ ;;
+ *-dolphin)
+ os=sysv3
+ ;;
+ m68k-ccur)
+ os=rtu
+ ;;
+ m88k-omron*)
+ os=luna
+ ;;
+ *-next)
+ os=nextstep
+ ;;
+ *-sequent)
+ os=ptx
+ ;;
+ *-crds)
+ os=unos
+ ;;
+ *-ns)
+ os=genix
+ ;;
+ i370-*)
+ os=mvs
+ ;;
+ *-gould)
+ os=sysv
+ ;;
+ *-highlevel)
+ os=bsd
+ ;;
+ *-encore)
+ os=bsd
+ ;;
+ *-sgi)
+ os=irix
+ ;;
+ *-siemens)
+ os=sysv4
+ ;;
+ *-masscomp)
+ os=rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=uxpv
+ ;;
+ *-rom68k)
+ os=coff
+ ;;
+ *-*bug)
+ os=coff
+ ;;
+ *-apple)
+ os=macos
+ ;;
+ *-atari*)
+ os=mint
+ ;;
+ *-wrs)
+ os=vxworks
+ ;;
+ *)
+ os=none
+ ;;
+esac
+
+fi
+
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+ # Sometimes we do "kernel-libc", so those need to count as OSes.
+ musl* | newlib* | relibc* | uclibc*)
+ ;;
+ # Likewise for "kernel-abi"
+ eabi* | gnueabi*)
+ ;;
+ # VxWorks passes extra cpu info in the 4th filed.
+ simlinux | simwindows | spe)
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+ | os9* | macos* | osx* | ios* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* | serenity* \
+ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+ | openstep* | oskit* | conix* | pw32* | nonstopux* \
+ | storm-chaos* | tops10* | tenex* | tops20* | its* \
+ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
+ | fiwix* | mlibc* )
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
+ none)
+ ;;
+ kernel* )
+ # Restricted further below
+ ;;
+ *)
+ echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2
+ exit 1
+ ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+ | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* )
+ ;;
+ uclinux-uclibc* )
+ ;;
+ managarm-mlibc* | managarm-kernel* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+ echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ -kernel* )
+ echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ *-kernel* )
+ echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2
+ exit 1
+ ;;
+ kfreebsd*-gnu* | kopensolaris*-gnu*)
+ ;;
+ vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+ ;;
+ nto-qnx*)
+ ;;
+ os2-emx)
+ ;;
+ *-eabi* | *-gnueabi*)
+ ;;
+ -*)
+ # Blank kernel with real OS is always fine.
+ ;;
+ *-*)
+ echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+case $vendor in
+ unknown)
+ case $cpu-$os in
+ *-riscix*)
+ vendor=acorn
+ ;;
+ *-sunos*)
+ vendor=sun
+ ;;
+ *-cnk* | *-aix*)
+ vendor=ibm
+ ;;
+ *-beos*)
+ vendor=be
+ ;;
+ *-hpux*)
+ vendor=hp
+ ;;
+ *-mpeix*)
+ vendor=hp
+ ;;
+ *-hiux*)
+ vendor=hitachi
+ ;;
+ *-unos*)
+ vendor=crds
+ ;;
+ *-dgux*)
+ vendor=dg
+ ;;
+ *-luna*)
+ vendor=omron
+ ;;
+ *-genix*)
+ vendor=ns
+ ;;
+ *-clix*)
+ vendor=intergraph
+ ;;
+ *-mvs* | *-opened*)
+ vendor=ibm
+ ;;
+ *-os400*)
+ vendor=ibm
+ ;;
+ s390-* | s390x-*)
+ vendor=ibm
+ ;;
+ *-ptx*)
+ vendor=sequent
+ ;;
+ *-tpf*)
+ vendor=ibm
+ ;;
+ *-vxsim* | *-vxworks* | *-windiss*)
+ vendor=wrs
+ ;;
+ *-aux*)
+ vendor=apple
+ ;;
+ *-hms*)
+ vendor=hitachi
+ ;;
+ *-mpw* | *-macos*)
+ vendor=apple
+ ;;
+ *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
+ vendor=atari
+ ;;
+ *-vos*)
+ vendor=stratus
+ ;;
+ esac
+ ;;
+esac
+
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/graphics/asymptote/gc/configure b/graphics/asymptote/gc/configure
new file mode 100755
index 0000000000..d459d62edc
--- /dev/null
+++ b/graphics/asymptote/gc/configure
@@ -0,0 +1,22069 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.71 for gc 8.2.8.
+#
+# Report bugs to <https://github.com/ivmai/bdwgc/issues>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else \$as_nop
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
+
+else \$as_nop
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null
+then :
+ as_have_required=yes
+else $as_nop
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
+
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
+
+
+ if test "x$CONFIG_SHELL" != x
+then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and
+$0: https://github.com/ivmai/bdwgc/issues about your
+$0: system, including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='gc'
+PACKAGE_TARNAME='gc'
+PACKAGE_VERSION='8.2.8'
+PACKAGE_STRING='gc 8.2.8'
+PACKAGE_BUGREPORT='https://github.com/ivmai/bdwgc/issues'
+PACKAGE_URL=''
+
+ac_unique_file="gcj_mlc.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_c_list=
+enable_option_checking=no
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+THREAD_LOCAL_ALLOC_FALSE
+THREAD_LOCAL_ALLOC_TRUE
+NEED_ATOMIC_OPS_ASM_FALSE
+NEED_ATOMIC_OPS_ASM_TRUE
+USE_INTERNAL_LIBATOMIC_OPS_FALSE
+USE_INTERNAL_LIBATOMIC_OPS_TRUE
+subdirs
+ATOMIC_OPS_CFLAGS
+ATOMIC_OPS_LIBS
+ENABLE_SHARED_FALSE
+ENABLE_SHARED_TRUE
+ENABLE_DOCS_FALSE
+ENABLE_DOCS_TRUE
+SINGLE_GC_OBJ_FALSE
+SINGLE_GC_OBJ_TRUE
+WERROR_CFLAGS
+USE_LIBDIR_FALSE
+USE_LIBDIR_TRUE
+CHECKSUMS_FALSE
+CHECKSUMS_TRUE
+UNWINDLIBS
+ENABLE_DISCLAIM_FALSE
+ENABLE_DISCLAIM_TRUE
+KEEP_BACK_PTRS_FALSE
+KEEP_BACK_PTRS_TRUE
+MAKE_BACK_GRAPH_FALSE
+MAKE_BACK_GRAPH_TRUE
+ENABLE_GCJ_SUPPORT_FALSE
+ENABLE_GCJ_SUPPORT_TRUE
+addlibs
+addobjs
+CXXLIBS
+AM_CPPFLAGS
+AM_CFLAGS
+GC_TBA_LIBRARY_FALSE
+GC_TBA_LIBRARY_TRUE
+CPLUSPLUS_FALSE
+CPLUSPLUS_TRUE
+target_all
+EXTRA_TEST_LIBS
+extra_ldflags_libgc
+AVOID_CPP_LIB_FALSE
+AVOID_CPP_LIB_TRUE
+ASM_WITH_CPP_UNSUPPORTED_FALSE
+ASM_WITH_CPP_UNSUPPORTED_TRUE
+PTHREAD_START_STANDALONE_FALSE
+PTHREAD_START_STANDALONE_TRUE
+WIN32_THREADS_FALSE
+WIN32_THREADS_TRUE
+DARWIN_THREADS_FALSE
+DARWIN_THREADS_TRUE
+PTHREADS_FALSE
+PTHREADS_TRUE
+THREADS_FALSE
+THREADS_TRUE
+THREADDLLIBS
+CFLAGS_EXTRA
+GC_CFLAGS
+EMSCRIPTEN_FALSE
+EMSCRIPTEN_TRUE
+CXXCPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+FILECMD
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+LIBTOOL
+am__fastdepCCAS_FALSE
+am__fastdepCCAS_TRUE
+CCASDEPMODE
+CCASFLAGS
+CCAS
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+GC_VERSION
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+CSCOPE
+ETAGS
+CTAGS
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_static
+enable_shared
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_emscripten_asyncify
+enable_threads
+enable_parallel_mark
+enable_thread_local_alloc
+enable_threads_discovery
+enable_cplusplus
+with_ecos
+enable_throw_bad_alloc_library
+with_target_subdir
+with_cross_host
+enable_gcj_support
+enable_sigrt_signals
+enable_gc_debug
+enable_java_finalization
+enable_atomic_uncollectable
+enable_redirect_malloc
+enable_disclaim
+enable_large_config
+enable_gc_assertions
+enable_mmap
+enable_munmap
+enable_dynamic_loading
+enable_register_main_static_data
+enable_checksums
+enable_werror
+enable_single_obj_compilation
+enable_gcov
+enable_docs
+with_libatomic_ops
+enable_handle_fork
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CCAS
+CCASFLAGS
+LT_SYS_LIBRARY_PATH
+CXXCPP'
+ac_subdirs_all='libatomic_ops'
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir runstatedir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures gc 8.2.8 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/gc]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of gc 8.2.8:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-static[=PKGS] build static libraries [default=no]
+ --enable-shared[=PKGS] build shared libraries [default=yes]
+ --enable-fast-install[=PKGS]
+ optimize for fast installation [default=yes]
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-emscripten-asyncify
+ use Emscripten asyncify feature
+ --enable-threads=TYPE choose threading package
+ --disable-parallel-mark do not parallelize marking and free list
+ construction
+ --disable-thread-local-alloc
+ turn off thread-local allocation optimization
+ --disable-threads-discovery
+ disable threads discovery in GC
+ --enable-cplusplus install C++ support
+ --disable-throw-bad-alloc-library
+ do not build C++ gctba library
+ --disable-gcj-support disable support for gcj
+ --enable-sigrt-signals force GC to use SIGRTMIN-based signals for thread
+ suspend/resume
+ --enable-gc-debug include full support for pointer backtracing etc.
+ --disable-java-finalization
+ disable support for java finalization
+ --disable-atomic-uncollectible
+ disable support for atomic uncollectible allocation
+ --enable-redirect-malloc
+ redirect malloc and friends to GC routines
+ --disable-disclaim disable alternative (more efficient) finalization
+ interface
+ --enable-large-config optimize for large (> 100 MB) heap or root set
+ --enable-gc-assertions collector-internal assertion checking
+ --enable-mmap use mmap instead of sbrk to expand the heap
+ --enable-munmap=N return page to the OS if empty for N collections
+ (default: 6)
+ --disable-dynamic-loading
+ build the collector with disabled tracing of dynamic
+ library data roots
+ --disable-register-main-static-data
+ skip the initial guess of data root sets
+ --enable-checksums report on erroneously cleared dirty bits at
+ substantial performance cost; use only for debugging
+ of the incremental collector
+ --enable-werror pass -Werror to the C compiler
+ --enable-single-obj-compilation
+ compile all libgc source files into single .o
+ (default: yes if static libraries are disabled)
+ --enable-gcov turn on code coverage analysis
+ --disable-docs do not build and install documentation
+ --enable-handle-fork=yes|no|auto|manual
+ attempt to ensure a usable collector after fork() in
+ multi-threaded programs (default: auto; manual:
+ GC_atfork_prepare/parent/child should be called by
+ the client)
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, [default=aix].
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the
+ compiler's sysroot if not specified).
+ --with-ecos enable runtime eCos target support
+ --with-target-subdir=SUBDIR
+ configuring with a cross compiler
+ --with-cross-host=HOST configuring with a cross compiler
+ --with-libatomic-ops=yes|no|check|none
+ use an external libatomic_ops? (default: check;
+ none: use compiler intrinsics or no thread support)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CCAS assembler compiler command (defaults to CC)
+ CCASFLAGS assembler compiler flags (defaults to CFLAGS)
+ LT_SYS_LIBRARY_PATH
+ User-defined run-time library search path.
+ CXXCPP C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <https://github.com/ivmai/bdwgc/issues>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+gc configure 8.2.8
+generated by GNU Autoconf 2.71
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below. */
+
+#include <limits.h>
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* 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 defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gc $as_me 8.2.8, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ $ $0$ac_configure_args_raw
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ printf "%s\n" "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ printf "%s\n" "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ printf "%s\n" "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ printf "%s\n" "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+printf "%s\n" "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ ac_site_files="$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
+else
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+fi
+
+for ac_site_file in $ac_site_files
+do
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+ extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+ try {
+ throw "test";
+ } catch (const char *s) {
+ // Extra parentheses suppress a warning when building autoconf itself,
+ // due to lint rules shared with more typical C programs.
+ assert (!(strcmp) (s, "test"));
+ }
+}
+
+template <typename T> struct test_template
+{
+ T const val;
+ explicit test_template(T t) : val(t) {}
+ template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+ assert (argc);
+ assert (! argv[0]);
+{
+ test_exception_syntax ();
+ test_template<double> tt (2.0);
+ assert (tt.add (4) == 6.0);
+ assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+ constexpr int get_val() { return 20; }
+
+ struct testinit
+ {
+ int i;
+ double d;
+ };
+
+ class delegate
+ {
+ public:
+ delegate(int n) : n(n) {}
+ delegate(): delegate(2354) {}
+
+ virtual int getval() { return this->n; };
+ protected:
+ int n;
+ };
+
+ class overridden : public delegate
+ {
+ public:
+ overridden(int n): delegate(n) {}
+ virtual int getval() override final { return this->n * 2; }
+ };
+
+ class nocopy
+ {
+ public:
+ nocopy(int i): i(i) {}
+ nocopy() = default;
+ nocopy(const nocopy&) = delete;
+ nocopy & operator=(const nocopy&) = delete;
+ private:
+ int i;
+ };
+
+ // for testing lambda expressions
+ template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+ {
+ return f(v);
+ }
+
+ // for testing variadic templates and trailing return types
+ template <typename V> auto sum(V first) -> V
+ {
+ return first;
+ }
+ template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+ {
+ return first + sum(rest...);
+ }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+ // Test auto and decltype
+ auto a1 = 6538;
+ auto a2 = 48573953.4;
+ auto a3 = "String literal";
+
+ int total = 0;
+ for (auto i = a3; *i; ++i) { total += *i; }
+
+ decltype(a2) a4 = 34895.034;
+}
+{
+ // Test constexpr
+ short sa[cxx11test::get_val()] = { 0 };
+}
+{
+ // Test initializer lists
+ cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+ // Test range-based for
+ int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+ 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+ for (auto &x : array) { x += 23; }
+}
+{
+ // Test lambda expressions
+ using cxx11test::eval;
+ assert (eval ([](int x) { return x*2; }, 21) == 42);
+ double d = 2.0;
+ assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+ assert (d == 5.0);
+ assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+ assert (d == 5.0);
+}
+{
+ // Test use of variadic templates
+ using cxx11test::sum;
+ auto a = sum(1);
+ auto b = sum(1, 2);
+ auto c = sum(1.0, 2.0, 3.0);
+}
+{
+ // Test constructor delegation
+ cxx11test::delegate d1;
+ cxx11test::delegate d2();
+ cxx11test::delegate d3(45);
+}
+{
+ // Test override and final
+ cxx11test::overridden o1(55464);
+}
+{
+ // Test nullptr
+ char *c = nullptr;
+}
+{
+ // Test template brackets
+ test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+ // Unicode literals
+ char const *utf8 = u8"UTF-8 string \u2500";
+ char16_t const *utf16 = u"UTF-8 string \u2500";
+ char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ ${ac_cxx_conftest_cxx11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="ltmain.sh compile missing install-sh config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
+else
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking GC version numbers" >&5
+printf %s "checking GC version numbers... " >&6; }
+ GC_VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\([0-9][0-9]*\)[.].*$/\1/g'`
+ GC_VERSION_MINOR=`echo $PACKAGE_VERSION | sed 's/^[^.]*[.]\([0-9][0-9]*\).*$/\1/g'`
+ GC_VERSION_MICRO=`echo $PACKAGE_VERSION | sed 's/^[^.]*[.][^.]*[.]\([0-9][0-9]*\)$/\1/g'`
+
+ if test :$GC_VERSION_MAJOR: = :: \
+ -o :$GC_VERSION_MINOR: = :: \
+ -o :$GC_VERSION_MICRO: = :: ;
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: invalid" >&5
+printf "%s\n" "invalid" >&6; }
+ as_fn_error $? "nonconforming PACKAGE_VERSION='$PACKAGE_VERSION'" "$LINENO" 5
+ fi
+
+
+printf "%s\n" "#define GC_VERSION_MAJOR $GC_VERSION_MAJOR" >>confdefs.h
+
+
+printf "%s\n" "#define GC_VERSION_MINOR $GC_VERSION_MINOR" >>confdefs.h
+
+
+printf "%s\n" "#define GC_VERSION_MICRO $GC_VERSION_MICRO" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO" >&5
+printf "%s\n" "major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO" >&6; }
+
+am__api_version='1.16'
+
+
+ # Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in #((
+ ./ | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test ${ac_cv_path_install+y}; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"`
+
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+
+ if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ 'BusyBox '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test ${ac_cv_path_mkdir+y}; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SET_MAKE=
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gc'
+ VERSION='8.2.8'
+
+
+printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
+
+
+printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+ac_config_headers="$ac_config_headers include/config.h"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ # Check whether --enable-maintainer-mode was given.
+if test ${enable_maintainer_mode+y}
+then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else $as_nop
+ USE_MAINTAINER_MODE=no
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+printf "%s\n" "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in #(
+ '0:this is the am__doit target') :
+ case $s in #(
+ BSD) :
+ am__include='.include' am__quote='"' ;; #(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test ${enable_dependency_tracking+y}
+then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else $as_nop
+ ac_file=''
+fi
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main (void)
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+y}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+else $as_nop
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+# By default we simply use the C compiler to build assembly code.
+
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+
+
+
+depcc="$CCAS" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CCAS_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CCAS_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CCAS_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CCAS_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CCAS_dependencies_compiler_type" >&6; }
+CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then
+ am__fastdepCCAS_TRUE=
+ am__fastdepCCAS_FALSE='#'
+else
+ am__fastdepCCAS_TRUE='#'
+ am__fastdepCCAS_FALSE=
+fi
+
+
+
+case `pwd` in
+ *\ * | *\ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.7'
+macro_revision='2.4.7'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+printf %s "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO ""
+}
+
+case $ECHO in
+ printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+printf "%s\n" "printf" >&6; } ;;
+ print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+printf "%s\n" "print -r" >&6; } ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+printf "%s\n" "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in sed gsed
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+printf %s "checking for fgrep... " >&6; }
+if test ${ac_cv_path_FGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+ then ac_cv_path_FGREP="$GREP -F"
+ else
+ if test -z "$FGREP"; then
+ ac_path_FGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in fgrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+ # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'FGREP' >> "conftest.nl"
+ "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_FGREP="$ac_path_FGREP"
+ ac_path_FGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_FGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_FGREP"; then
+ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_FGREP=$FGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+printf "%s\n" "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test ${lt_cv_path_NM+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+printf "%s\n" "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in dumpbin "link -dump"
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DUMPBIN"; then
+ ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+printf "%s\n" "$DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$DUMPBIN" && break
+ done
+fi
+if test -z "$DUMPBIN"; then
+ ac_ct_DUMPBIN=$DUMPBIN
+ for ac_prog in dumpbin "link -dump"
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DUMPBIN"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+printf "%s\n" "$ac_ct_DUMPBIN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_DUMPBIN" && break
+done
+
+ if test "x$ac_ct_DUMPBIN" = x; then
+ DUMPBIN=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DUMPBIN=$ac_ct_DUMPBIN
+ fi
+fi
+
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+printf %s "checking the name lister ($NM) interface... " >&6; }
+if test ${lt_cv_nm_interface+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+printf "%s\n" "$lt_cv_nm_interface" >&6; }
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+printf %s "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+printf "%s\n" "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+printf %s "checking the maximum length of command line arguments... " >&6; }
+if test ${lt_cv_sys_max_cmd_len+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+printf %s "checking how to convert $build file names to $host format... " >&6; }
+if test ${lt_cv_to_host_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+printf %s "checking how to convert $build file names to toolchain format... " >&6; }
+if test ${lt_cv_to_tool_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+printf %s "checking for $LD option to reload object files... " >&6; }
+if test ${lt_cv_ld_reload_flag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_reload_flag='-r'
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+printf "%s\n" "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args.
+set dummy ${ac_tool_prefix}file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$FILECMD"; then
+ ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_FILECMD="${ac_tool_prefix}file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+FILECMD=$ac_cv_prog_FILECMD
+if test -n "$FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5
+printf "%s\n" "$FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_FILECMD"; then
+ ac_ct_FILECMD=$FILECMD
+ # Extract the first word of "file", so it can be a program name with args.
+set dummy file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_FILECMD"; then
+ ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_FILECMD="file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD
+if test -n "$ac_ct_FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5
+printf "%s\n" "$ac_ct_FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_FILECMD" = x; then
+ FILECMD=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ FILECMD=$ac_ct_FILECMD
+ fi
+else
+ FILECMD="$ac_cv_prog_FILECMD"
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+printf "%s\n" "$OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+printf "%s\n" "$ac_ct_OBJDUMP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+printf %s "checking how to recognize dependent libraries... " >&6; }
+if test ${lt_cv_deplibs_check_method+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='$FILECMD -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=$FILECMD
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[3-9]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+printf "%s\n" "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+printf "%s\n" "$DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+printf "%s\n" "$ac_ct_DLLTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+printf %s "checking how to associate runtime and link libraries... " >&6; }
+if test ${lt_cv_sharedlib_from_linklib_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
+ ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AR" && break
+ done
+fi
+if test -z "$AR"; then
+ ac_ct_AR=$AR
+ for ac_prog in ar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AR" && break
+done
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+fi
+
+: ${AR=ar}
+
+
+
+
+
+
+# Use ARFLAGS variable as AR's operation code to sync the variable naming with
+# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
+# higher priority because thats what people were doing historically (setting
+# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS
+# variable obsoleted/removed.
+
+test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
+lt_ar_flags=$AR_FLAGS
+
+
+
+
+
+
+# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override
+# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+printf %s "checking for archiver @FILE support... " >&6; }
+if test ${lt_cv_ar_at_file+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -eq "$ac_status"; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+printf "%s\n" "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+printf %s "checking command to parse $NM output from $compiler object... " >&6; }
+if test ${lt_cv_sys_global_symbol_pipe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ if test ia64 = "$host_cpu"; then
+ symcode='[ABCDEGRST]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="$SED -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
+ # Also find C++ and __fastcall symbols from MSVC++ or ICC,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK '"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx"
+ else
+ lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS=conftstm.$ac_objext
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test yes = "$pipe_works"; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+printf "%s\n" "failed" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+printf "%s\n" "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+printf %s "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test ${with_sysroot+y}
+then :
+ withval=$with_sysroot;
+else $as_nop
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+printf "%s\n" "$with_sysroot" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+printf "%s\n" "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+printf %s "checking for a working dd... " >&6; }
+if test ${ac_cv_path_lt_DD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+ ac_path_lt_DD_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in dd
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+ $ac_path_lt_DD_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_lt_DD"; then
+ :
+ fi
+else
+ ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+printf "%s\n" "$ac_cv_path_lt_DD" >&6; }
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+printf %s "checking how to truncate binary pipes... " >&6; }
+if test ${lt_cv_truncate_bin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+printf "%s\n" "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+# Check whether --enable-libtool-lock was given.
+if test ${enable_libtool_lock+y}
+then :
+ enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE=32
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE=64
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ emul=elf
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ case `$FILECMD conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -belf"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+printf %s "checking whether the C compiler needs -belf... " >&6; }
+if test ${lt_cv_cc_needs_belf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_cc_needs_belf=yes
+else $as_nop
+ lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+printf "%s\n" "$lt_cv_cc_needs_belf" >&6; }
+ if test yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `$FILECMD conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$MANIFEST_TOOL"; then
+ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+printf "%s\n" "$MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+ # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_MANIFEST_TOOL"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+ fi
+else
+ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if test ${lt_cv_path_mainfest_tool+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&5
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+ MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+ case $host_os in
+ rhapsody* | darwin*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$DSYMUTIL"; then
+ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+printf "%s\n" "$DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+ ac_ct_DSYMUTIL=$DSYMUTIL
+ # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_DSYMUTIL"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+printf "%s\n" "$ac_ct_DSYMUTIL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DSYMUTIL=$ac_ct_DSYMUTIL
+ fi
+else
+ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$NMEDIT"; then
+ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+printf "%s\n" "$NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+ ac_ct_NMEDIT=$NMEDIT
+ # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_NMEDIT"; then
+ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+printf "%s\n" "$ac_ct_NMEDIT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ NMEDIT=$ac_ct_NMEDIT
+ fi
+else
+ NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$LIPO"; then
+ ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+printf "%s\n" "$LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+ ac_ct_LIPO=$LIPO
+ # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_LIPO"; then
+ ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_LIPO="lipo"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+printf "%s\n" "$ac_ct_LIPO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_LIPO" = x; then
+ LIPO=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIPO=$ac_ct_LIPO
+ fi
+else
+ LIPO="$ac_cv_prog_LIPO"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OTOOL"; then
+ ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+printf "%s\n" "$OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+ ac_ct_OTOOL=$OTOOL
+ # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OTOOL"; then
+ ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL="otool"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+printf "%s\n" "$ac_ct_OTOOL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL" = x; then
+ OTOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL=$ac_ct_OTOOL
+ fi
+else
+ OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$OTOOL64"; then
+ ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+printf "%s\n" "$OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+ ac_ct_OTOOL64=$OTOOL64
+ # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_OTOOL64"; then
+ ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL64="otool64"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+printf "%s\n" "$ac_ct_OTOOL64" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL64" = x; then
+ OTOOL64=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL64=$ac_ct_OTOOL64
+ fi
+else
+ OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+printf %s "checking for -single_module linker flag... " >&6; }
+if test ${lt_cv_apple_cc_single_mod+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_apple_cc_single_mod=no
+ if test -z "$LT_MULTI_MODULE"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+printf %s "checking for -exported_symbols_list linker flag... " >&6; }
+if test ${lt_cv_ld_exported_symbols_list+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_ld_exported_symbols_list=yes
+else $as_nop
+ lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+printf %s "checking for -force_load linker flag... " >&6; }
+if test ${lt_cv_ld_force_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+ echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5
+ $AR $AR_FLAGS libconftest.a conftest.o 2>&5
+ echo "$RANLIB libconftest.a" >&5
+ $RANLIB libconftest.a 2>&5
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+printf "%s\n" "$lt_cv_ld_force_load" >&6; }
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ darwin*)
+ case $MACOSX_DEPLOYMENT_TARGET,$host in
+ 10.[012],*|,*powerpc*-darwin[5-8]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ *)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+ fi
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h
+
+fi
+
+
+
+
+func_stripname_cnf ()
+{
+ case $2 in
+ .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
+ *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
+ esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+# Check whether --enable-static was given.
+if test ${enable_static+y}
+then :
+ enableval=$enable_static; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_static=no
+fi
+
+
+
+
+
+
+
+
+
+
+ enable_dlopen=no
+
+
+ enable_win32_dll=no
+
+
+ # Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test ${with_pic+y}
+then :
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ pic_mode=default
+fi
+
+
+
+
+
+
+
+
+ # Check whether --enable-fast-install was given.
+if test ${enable_fast_install+y}
+then :
+ enableval=$enable_fast_install; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+ shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+printf %s "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test ${with_aix_soname+y}
+then :
+ withval=$with_aix_soname; case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else $as_nop
+ if test ${lt_cv_with_aix_soname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_with_aix_soname=aix
+fi
+
+ with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+printf "%s\n" "$with_aix_soname" >&6; }
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+printf %s "checking for objdir... " >&6; }
+if test ${lt_cv_objdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+printf "%s\n" "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC and
+# ICC, which need '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+printf %s "checking for ${ac_tool_prefix}file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/${ac_tool_prefix}file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+printf %s "checking for file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test ${lt_cv_prog_compiler_rtti_exceptions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+
+
+
+
+
+ lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+ if test yes = "$GCC"; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='$wl-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ # old Intel for x86_64, which still supported -KPIC.
+ ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='--shared'
+ lt_prog_compiler_static='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag=
+ always_export_symbols=no
+ archive_cmds=
+ archive_expsym_cmds=
+ compiler_needs_object=no
+ enable_shared_with_static_runtimes=no
+ export_dynamic_flag_spec=
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ hardcode_automatic=no
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_separator=
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ inherit_rpath=no
+ link_all_deplibs=unknown
+ module_cmds=
+ module_expsym_cmds=
+ old_archive_from_new_cmds=
+ old_archive_from_expsyms_cmds=
+ thread_safe_flag_spec=
+ whole_archive_flag_spec=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
+ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ if test yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test yes = "$with_gnu_ld"; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+ *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test yes = "$lt_use_gnu_ld_interface"; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='$wl'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec='$wl--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test ia64 != "$host_cpu"; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ export_dynamic_flag_spec='$wl--export-all-symbols'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ haiku*)
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs=yes
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test linux-dietlibc = "$host_os"; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test no = "$tmp_diet"
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ whole_archive_flag_spec=
+ tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
+ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ tcc*)
+ export_dynamic_flag_spec='-rdynamic'
+ ;;
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test no = "$ld_shlibs"; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ file_list_spec='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' $wl-bernotok'
+ allow_undefined_flag=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ fi
+ archive_cmds_need_lc=yes
+ archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl* | icl*)
+ # Native MSVC or ICC
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ file_list_spec='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+ enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ old_postinstall_cmds='chmod 644 $oldlib'
+ postlink_cmds='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC and ICC wrapper
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ enable_shared_with_static_runtimes=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec=''
+ fi
+ link_all_deplibs=yes
+ allow_undefined_flag=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+ else
+ ld_shlibs=no
+ fi
+
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly* | midnightbsd*)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test yes = "$GCC"; then
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='$wl-E'
+ ;;
+
+ hpux10*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+printf %s "checking if $CC understands -b... " >&6; }
+if test ${lt_cv_prog_compiler__b+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler__b=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -b"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler__b=yes
+ fi
+ else
+ lt_cv_prog_compiler__b=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+printf "%s\n" "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+ ;;
+ esac
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if test ${lt_cv_irix_exported_symbol+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_irix_exported_symbol=yes
+else $as_nop
+ lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; }
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+ fi
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ inherit_rpath=yes
+ link_all_deplibs=yes
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ ld_shlibs=yes
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ hardcode_direct_absolute=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ else
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z defs'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='$wl'
+ archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test yes = "$GCC"; then
+ whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test sequent = "$host_vendor"; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag='$wl-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='$wl-z,text'
+ allow_undefined_flag='$wl-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-R,$libdir'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+
+ if test sni = "$host_vendor"; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ export_dynamic_flag_spec='$wl-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+printf "%s\n" "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+ case $host_os in
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary...
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo = "/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[lt_foo]++; }
+ if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+ test -n "$runpath_var" ||
+ test yes = "$hardcode_automatic"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+ test no != "$hardcode_minus_L"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+printf "%s\n" "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+ test yes = "$inherit_rpath"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+ if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else $as_nop
+
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes
+then :
+ lt_cv_dlopen=shl_load
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+printf %s "checking for shl_load in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_shl_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main (void)
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_shl_load=yes
+else $as_nop
+ ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes
+then :
+ lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else $as_nop
+ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+printf %s "checking for dlopen in -lsvld... " >&6; }
+if test ${ac_cv_lib_svld_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_svld_dlopen=yes
+else $as_nop
+ ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes
+then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+printf %s "checking for dld_link in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_dld_link+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main (void)
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dld_dld_link=yes
+else $as_nop
+ ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes
+then :
+ lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+printf %s "checking whether a program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+printf "%s\n" "$lt_cv_dlopen_self" >&6; }
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+printf %s "checking whether a statically linked program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self_static+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+printf "%s\n" "$lt_cv_dlopen_self_static" >&6; }
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+printf %s "checking whether stripping libraries is possible... " >&6; }
+if test -z "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+else
+ if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ case $host_os in
+ darwin*)
+ # FIXME - insert some real tests, host_os isn't really good enough
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ ;;
+ freebsd*)
+ if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ ;;
+ esac
+ fi
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # Report what library types will actually be built
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+printf %s "checking if libtool supports shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+printf "%s\n" "$can_build_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+printf %s "checking whether to build static libraries... " >&6; }
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+printf "%s\n" "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+ if test -n "$CXX" && ( test no != "$CXX" &&
+ ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+ (test g++ != "$CXX"))); then
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+printf %s "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if test ${ac_cv_prog_CXXCPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CXX needs to be expanded
+ for CXXCPP in "$CXX -E" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+printf "%s\n" "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+ _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="int some_variable = 0;"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+ # save warnings/boilerplate of simple test code
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_CFLAGS=$CFLAGS
+ lt_save_LD=$LD
+ lt_save_GCC=$GCC
+ GCC=$GXX
+ lt_save_with_gnu_ld=$with_gnu_ld
+ lt_save_path_LD=$lt_cv_path_LD
+ if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+ else
+ $as_unset lt_cv_prog_gnu_ld
+ fi
+ if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+ else
+ $as_unset lt_cv_path_LD
+ fi
+ test -z "${LDCXX+set}" || LD=$LDCXX
+ CC=${CXX-"c++"}
+ CFLAGS=$CXXFLAGS
+ compiler=$CC
+ compiler_CXX=$CC
+ func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+ if test -n "$compiler"; then
+ # We don't want -fno-exception when compiling C++ code, so set the
+ # no_builtin_flag separately
+ if test yes = "$GXX"; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+ else
+ lt_prog_compiler_no_builtin_flag_CXX=
+ fi
+
+ if test yes = "$GXX"; then
+ # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test yes = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='$wl'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+ $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec_CXX=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+ fi
+
+ # PORTME: fill in a description of your system's C++ link characteristics
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ ld_shlibs_CXX=yes
+ case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_CXX=''
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ file_list_spec_CXX='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct_CXX=no
+ hardcode_direct_absolute_CXX=no
+ ;;
+ esac
+
+ if test yes = "$GXX"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct_CXX=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_CXX=yes
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_libdir_separator_CXX=
+ fi
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag=$shared_flag' $wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec_CXX='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to
+ # export.
+ always_export_symbols_CXX=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ # The "-G" linker flag allows undefined symbols.
+ no_undefined_flag_CXX='-bernotok'
+ # Determine the default libpath from the value encoded in an empty
+ # executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+
+ archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_CXX="-z nodefs"
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_CXX=' $wl-bernotok'
+ allow_undefined_flag_CXX=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ fi
+ archive_cmds_need_lc_CXX=yes
+ archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared
+ # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_CXX=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $GXX,$cc_basename in
+ ,cl* | no,cl* | ,icl* | no,icl*)
+ # Native MSVC or ICC
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX=' '
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=yes
+ file_list_spec_CXX='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+ enable_shared_with_static_runtimes_CXX=yes
+ # Don't use ranlib
+ old_postinstall_cmds_CXX='chmod 644 $oldlib'
+ postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # g++
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=no
+ enable_shared_with_static_runtimes_CXX=yes
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec_CXX=''
+ fi
+ link_all_deplibs_CXX=yes
+ allow_undefined_flag_CXX=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ if test yes != "$lt_cv_apple_cc_single_mod"; then
+ archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+ fi
+
+ else
+ ld_shlibs_CXX=no
+ fi
+
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_minus_L_CXX=yes
+ allow_undefined_flag_CXX=unsupported
+ shrext_cmds=.dll
+ archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes_CXX=yes
+ file_list_spec_CXX='@'
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ freebsd2.*)
+ # C++ shared libraries reported to be fairly broken before
+ # switch to ELF
+ ld_shlibs_CXX=no
+ ;;
+
+ freebsd-elf*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+
+ haiku*)
+ archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs_CXX=yes
+ ;;
+
+ hpux9*)
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='$wl-E'
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ hpux10*|hpux11*)
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ export_dynamic_flag_spec_CXX='$wl-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ ;;
+ *)
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+ fi
+ fi
+ link_all_deplibs_CXX=yes
+ ;;
+ esac
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ inherit_rpath_CXX=yes
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc* | ecpc* )
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ case `$CC -V` in
+ *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+ prelink_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+ old_archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+ $RANLIB $oldlib'
+ archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 6 and above use weak symbols
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+ ;;
+ xl* | mpixl* | bgxl*)
+ # IBM XL 8.0 on PPC, with GNU ld
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object_CXX=yes
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ m88k*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+
+ *nto* | *qnx*)
+ ld_shlibs_CXX=yes
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ hardcode_direct_absolute_CXX=yes
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ fi
+ output_verbose_link_cmd=func_echo_all
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ case $host in
+ osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+ *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+ esac
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ case $host in
+ osf3*)
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ ;;
+ *)
+ allow_undefined_flag_CXX=' -expect_unresolved \*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+ $RM $lib.exp'
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ ;;
+ esac
+
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ case $host in
+ osf3*)
+ archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ psos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ archive_cmds_need_lc_CXX=yes
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_shlibpath_var_CXX=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ no_undefined_flag_CXX=' $wl-z ${wl}defs'
+ if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ else
+ # g++ 2.7 appears to require '-G' NOT '-shared' on this
+ # platform.
+ archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_CXX='$wl-z,text'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_CXX='$wl-z,text'
+ allow_undefined_flag_CXX='$wl-z,nodefs'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ export_dynamic_flag_spec_CXX='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+ '"$old_archive_cmds_CXX"
+ reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+ '"$reload_cmds_CXX"
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+ test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+ GCC_CXX=$GXX
+ LD_CXX=$LD
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ for p in `eval "$output_verbose_link_cmd"`; do
+ case $prev$p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test x-L = "$p" ||
+ test x-R = "$p"; then
+ prev=$p
+ continue
+ fi
+
+ # Expand the sysroot to ease extracting the directories later.
+ if test -z "$prev"; then
+ case $p in
+ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+ esac
+ fi
+ case $p in
+ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+ esac
+ if test no = "$pre_test_object_deps_done"; then
+ case $prev in
+ -L | -R)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_path_CXX=$prev$p
+ else
+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$postdeps_CXX"; then
+ postdeps_CXX=$prev$p
+ else
+ postdeps_CXX="${postdeps_CXX} $prev$p"
+ fi
+ fi
+ prev=
+ ;;
+
+ *.lto.$objext) ;; # Ignore GCC LTO objects
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test no = "$pre_test_object_deps_done"; then
+ if test -z "$predep_objects_CXX"; then
+ predep_objects_CXX=$p
+ else
+ predep_objects_CXX="$predep_objects_CXX $p"
+ fi
+ else
+ if test -z "$postdep_objects_CXX"; then
+ postdep_objects_CXX=$p
+ else
+ postdep_objects_CXX="$postdep_objects_CXX $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ predep_objects_CXX=
+ postdep_objects_CXX=
+ postdeps_CXX=
+ ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test yes = "$GXX"; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static_CXX='$wl-static'
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static_CXX=
+ ;;
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[4-9]*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ if test ia64 != "$host_cpu"; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ ecpc* )
+ # old Intel C++ for x86_64, which still supported -KPIC.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ icpc* )
+ # Intel C++, used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fpic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-qpic'
+ lt_prog_compiler_static_CXX='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works_CXX=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ case $host_os in
+ aix[4-9]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ export_symbols_cmds_CXX=$ltdll_cmds
+ ;;
+ cygwin* | mingw* | cegcc*)
+ case $cc_basename in
+ cl* | icl*)
+ exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+ ;;
+ esac
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
+test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_CXX=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds_CXX in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_CXX
+ pic_flag=$lt_prog_compiler_pic_CXX
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+ allow_undefined_flag_CXX=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc_CXX=no
+ else
+ lt_cv_archive_cmds_need_lc_CXX=yes
+ fi
+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+ archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+ test -n "$runpath_var_CXX" ||
+ test yes = "$hardcode_automatic_CXX"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct_CXX" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+ test no != "$hardcode_minus_L_CXX"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_CXX=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_CXX=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_CXX=unsupported
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+printf "%s\n" "$hardcode_action_CXX" >&6; }
+
+if test relink = "$hardcode_action_CXX" ||
+ test yes = "$inherit_rpath_CXX"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+ fi # test -n "$compiler"
+
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+ LDCXX=$LD
+ LD=$lt_save_LD
+ GCC=$lt_save_GCC
+ with_gnu_ld=$lt_save_with_gnu_ld
+ lt_cv_path_LDCXX=$lt_cv_path_LD
+ lt_cv_path_LD=$lt_save_path_LD
+ lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+# Only the shared libraries are produced by default, use "--enable-static"
+# option to override it.
+
+# Special CFLAGS to use when building
+gc_cflags=""
+
+# Set to "yes" on platforms where mmap should be used instead of sbrk.
+# This will define USE_MMAP.
+gc_use_mmap=""
+
+# We should set -fexceptions if we are using gcc and might be used
+# inside something like gcj. This is the zeroth approximation:
+if test :"$GCC": = :yes: ; then
+ gc_cflags="${gc_cflags} -fexceptions"
+else
+ case "$host" in
+ hppa*-*-hpux* )
+ if test :$GCC: != :"yes": ; then
+ gc_cflags="${gc_cflags} +ESdbgasm"
+ fi
+ # :TODO: actually we should check using Autoconf if
+ # the compiler supports this option.
+ ;;
+ esac
+fi
+
+# target_optspace --enable-target-optspace ("yes", "no", "")
+case "${target_optspace}:${host}" in
+ yes:*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ :m32r-* | :d10v-* | :d30v-*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ no:* | :*)
+ # Nothing.
+ ;;
+esac
+
+# Set any host dependent compiler flags.
+case "${host}" in
+ mips-tx39-*|mipstx39-unknown-*)
+ gc_cflags="${gc_cflags} -G 0"
+ ;;
+ *)
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for emscripten" >&5
+printf %s "checking for emscripten... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# ifndef __EMSCRIPTEN__
+# error This is not Emscripten
+# endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ emscripten=yes
+else $as_nop
+ emscripten=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test x$emscripten = xyes; then
+ EMSCRIPTEN_TRUE=
+ EMSCRIPTEN_FALSE='#'
+else
+ EMSCRIPTEN_TRUE='#'
+ EMSCRIPTEN_FALSE=
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $emscripten" >&5
+printf "%s\n" "$emscripten" >&6; }
+
+# Check whether --enable-emscripten-asyncify was given.
+if test ${enable_emscripten_asyncify+y}
+then :
+ enableval=$enable_emscripten_asyncify;
+fi
+
+# Use this option if your program is targeting -sASYNCIFY. The latter is
+# required to scan the stack, ASYNCIFY_STACK_SIZE is probably needed for
+# gctest only.
+if test "${emscripten}" = yes -a "${enable_emscripten_asyncify}" = yes
+then :
+ gc_cflags="${gc_cflags} -DEMSCRIPTEN_ASYNCIFY"
+ gc_cflags="${gc_cflags} -sASYNCIFY -sASYNCIFY_STACK_SIZE=128000"
+fi
+
+GC_CFLAGS=${gc_cflags}
+
+
+
+
+# Check whether --enable-threads was given.
+if test ${enable_threads+y}
+then :
+ enableval=$enable_threads; THREADS=$enableval
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thread model used by GCC" >&5
+printf %s "checking for thread model used by GCC... " >&6; }
+ THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
+ if test -z "$THREADS" -o "x$emscripten" = "xyes"; then
+ THREADS=no
+ fi
+ if test "$THREADS" = "posix"; then
+ case "$host" in
+ *-*-mingw*)
+ # Adjust thread model if cross-compiling for MinGW.
+ THREADS=win32
+ ;;
+ esac
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $THREADS" >&5
+printf "%s\n" "$THREADS" >&6; }
+fi
+
+
+# Check whether --enable-parallel-mark was given.
+if test ${enable_parallel_mark+y}
+then :
+ enableval=$enable_parallel_mark; case "$THREADS" in
+ no | none | single)
+ if test "${enable_parallel_mark}" != no; then
+ as_fn_error $? "Parallel mark requires --enable-threads=x spec" "$LINENO" 5
+ fi
+ ;;
+ esac
+fi
+
+
+# Check whether --enable-thread-local-alloc was given.
+if test ${enable_thread_local_alloc+y}
+then :
+ enableval=$enable_thread_local_alloc; case "$THREADS" in
+ no | none | single)
+ if test "${enable_thread_local_alloc}" = yes; then
+ as_fn_error $? "Thread-local allocation requires --enable-threads=x spec" "$LINENO" 5
+ fi
+ ;;
+ esac
+fi
+
+
+# Check whether --enable-threads-discovery was given.
+if test ${enable_threads_discovery+y}
+then :
+ enableval=$enable_threads_discovery;
+fi
+
+if test "${enable_threads_discovery}" = no; then
+
+printf "%s\n" "#define GC_NO_THREADS_DISCOVERY 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-cplusplus was given.
+if test ${enable_cplusplus+y}
+then :
+ enableval=$enable_cplusplus;
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+CFLAGS="$old_CFLAGS"
+
+THREADDLLIBS=
+need_atomic_ops_asm=false
+need_lib_rt=false
+compile_asm=false
+use_parallel_mark=no
+use_thread_local_alloc=no
+# Libraries needed to support dynamic loading and/or threads.
+case "$THREADS" in
+ no | none | single)
+ THREADS=none
+ ;;
+ posix | pthreads)
+ THREADS=posix
+ default_threadlibs=false
+ # Common defines for most POSIX platforms.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-dragonfly* | \
+ *-*-freebsd* | *-*-haiku* | *-*-hpux11* | *-*-irix* | \
+ *-*-kfreebsd*-gnu | *-*-gnu* | *-*-*linux* | *-*-msys* | *-*-nacl* | \
+ *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ printf "%s\n" "#define GC_THREADS 1" >>confdefs.h
+
+
+printf "%s\n" "#define _REENTRANT 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ default_threadlibs=true
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&2;}
+ ;;
+ esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5
+printf %s "checking for pthread_self in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char pthread_self ();
+int
+main (void)
+{
+return pthread_self ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_self=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_self=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_self" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_self" = xyes
+then :
+ THREADDLLIBS="-lpthread"
+fi
+
+ case "$host" in
+ *-*-hpux11*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Only HP/UX 11 POSIX threads are supported.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Only HP/UX 11 POSIX threads are supported.\"" >&2;}
+ printf "%s\n" "#define _POSIX_C_SOURCE 199506L" >>confdefs.h
+
+ THREADDLLIBS="-lpthread"
+ # HPUX needs REENTRANT for the _r calls.
+ need_lib_rt=true
+ ;;
+ *-*-openbsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-freebsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ ;;
+ *-*-kfreebsd*-gnu)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-gnu*) # E.g. linux but excluding kfreebsd.
+ # The default THREADDLLIBS.
+ ;;
+ *-*-netbsd*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Only on NetBSD 2.0 or later.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Only on NetBSD 2.0 or later.\"" >&2;}
+ printf "%s\n" "#define _PTHREADS 1" >>confdefs.h
+
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-solaris*)
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-cygwin* | *-*-msys*)
+ # Cygwin doesn't have a real libpthread, so Libtool can't link
+ # against it.
+ THREADDLLIBS=""
+ win32_threads=true
+ ;;
+ *-*-mingw*)
+ printf "%s\n" "#define GC_WIN32_PTHREADS 1" >>confdefs.h
+
+ # Using pthreads-win32 (or other non-Cygwin pthreads) library.
+ THREADDLLIBS="-lpthread"
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ win32_threads=true
+ ;;
+ *-*-darwin*)
+ darwin_threads=true
+ ;;
+ *-*-osf*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *)
+ if test x$default_threadlibs != xtrue
+then :
+ as_fn_error $? "Pthreads not supported by the GC on this platform" "$LINENO" 5
+fi
+ # The default THREADDLLIBS.
+ ;;
+ esac
+ case "$host" in
+ sparc*-*-solaris*)
+ if test "$GCC" != yes; then
+ need_atomic_ops_asm=true
+ fi
+ ;;
+ esac
+ ;;
+ mcf | win32)
+ printf "%s\n" "#define GC_THREADS 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ if test "${enable_parallel_mark}" != no \
+ -o "${enable_shared}" != yes -o "${enable_static}" != no; then
+ # Imply THREAD_LOCAL_ALLOC unless GC_DLL.
+ use_thread_local_alloc=$enable_thread_local_alloc
+ fi
+ if test "${enable_win32_dllmain}" = yes; then
+
+printf "%s\n" "#define GC_INSIDE_DLL 1" >>confdefs.h
+
+ fi
+ win32_threads=true
+
+printf "%s\n" "#define EMPTY_GETENV_RESULTS 1" >>confdefs.h
+
+ ;;
+ dgux386)
+ printf "%s\n" "#define GC_THREADS 1" >>confdefs.h
+
+ # Use pthread GCC switch
+ THREADDLLIBS=-pthread
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Explicit GC_INIT() calls may be required.\"" >&2;}
+ AM_CFLAGS="-pthread $AM_CFLAGS"
+ ;;
+ aix)
+ THREADS=posix
+ THREADDLLIBS=-lpthread
+ printf "%s\n" "#define GC_THREADS 1" >>confdefs.h
+
+ printf "%s\n" "#define _REENTRANT 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ rtems)
+ THREADS=posix
+ printf "%s\n" "#define GC_THREADS 1" >>confdefs.h
+
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ decosf1 | irix | mach | os2 | solaris | dce | vxworks)
+ as_fn_error $? "thread package $THREADS not yet supported" "$LINENO" 5
+ ;;
+ *)
+ as_fn_error $? "$THREADS is an unknown thread package" "$LINENO" 5
+ ;;
+esac
+
+# Check whether -lrt linker option is needed to use clock_gettime.
+if test "x$need_lib_rt" != xtrue; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime without additional libraries" >&5
+printf %s "checking for clock_gettime without additional libraries... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <time.h>
+int
+main (void)
+{
+struct timespec t; clock_gettime(CLOCK_REALTIME, &t)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
+printf %s "checking for clock_gettime in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_clock_gettime+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char clock_gettime ();
+int
+main (void)
+{
+return clock_gettime ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_rt_clock_gettime=yes
+else $as_nop
+ ac_cv_lib_rt_clock_gettime=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5
+printf "%s\n" "$ac_cv_lib_rt_clock_gettime" >&6; }
+if test "x$ac_cv_lib_rt_clock_gettime" = xyes
+then :
+ need_lib_rt=true
+fi
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+if test "x$need_lib_rt" = xtrue; then
+ THREADDLLIBS="$THREADDLLIBS -lrt"
+fi
+
+
+ if test x$THREADS != xnone; then
+ THREADS_TRUE=
+ THREADS_FALSE='#'
+else
+ THREADS_TRUE='#'
+ THREADS_FALSE=
+fi
+
+ if test x$THREADS = xposix; then
+ PTHREADS_TRUE=
+ PTHREADS_FALSE='#'
+else
+ PTHREADS_TRUE='#'
+ PTHREADS_FALSE=
+fi
+
+ if test x$darwin_threads = xtrue; then
+ DARWIN_THREADS_TRUE=
+ DARWIN_THREADS_FALSE='#'
+else
+ DARWIN_THREADS_TRUE='#'
+ DARWIN_THREADS_FALSE=
+fi
+
+ if test x$win32_threads = xtrue; then
+ WIN32_THREADS_TRUE=
+ WIN32_THREADS_FALSE='#'
+else
+ WIN32_THREADS_TRUE='#'
+ WIN32_THREADS_FALSE=
+fi
+
+
+compiler_suncc=no
+pthread_start_standalone=no
+case "$host" in
+ *-*-*linux*)
+ # Turn on the workaround described in pthread_start.c.
+ if test "$THREADS" = posix
+then :
+ pthread_start_standalone=yes
+fi
+ ;;
+ powerpc-*-darwin*)
+ powerpc_darwin=true
+ ;;
+ *-*-solaris*)
+ if test "$GCC" != yes; then
+ # Solaris SunCC
+ compiler_suncc=yes
+ CFLAGS="-O $CFLAGS"
+ fi
+ ;;
+ *-*-wince*)
+ if test "$enable_gc_debug" != "no"; then
+
+printf "%s\n" "#define GC_READ_ENV_FILE 1" >>confdefs.h
+
+ fi
+ ;;
+esac
+ if test x$pthread_start_standalone = xyes; then
+ PTHREAD_START_STANDALONE_TRUE=
+ PTHREAD_START_STANDALONE_FALSE='#'
+else
+ PTHREAD_START_STANDALONE_TRUE='#'
+ PTHREAD_START_STANDALONE_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ # Output all warnings.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wextra" >&5
+printf %s "checking whether compiler supports -Wextra... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Wextra $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_cc_wextra=yes
+else $as_nop
+ ac_cv_cc_wextra=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_wextra" >&5
+printf "%s\n" "$ac_cv_cc_wextra" >&6; }
+ if test "$ac_cv_cc_wextra" = yes
+then :
+ WEXTRA="-Wextra"
+else $as_nop
+ WEXTRA="-W"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wpedantic" >&5
+printf %s "checking whether compiler supports -Wpedantic... " >&6; }
+ CFLAGS="-Wpedantic -Wno-long-long $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ extern int quiet;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_cc_pedantic=yes
+else $as_nop
+ ac_cv_cc_pedantic=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_pedantic" >&5
+printf "%s\n" "$ac_cv_cc_pedantic" >&6; }
+ WPEDANTIC=
+ if test "$ac_cv_cc_pedantic" = yes
+then :
+ WPEDANTIC="-Wpedantic -Wno-long-long"
+fi
+ CFLAGS="-Wall $WEXTRA $WPEDANTIC $CFLAGS"
+ CXXFLAGS="-Wall $WEXTRA $WPEDANTIC $CXXFLAGS"
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xlc" >&5
+printf %s "checking for xlc... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ #ifndef __xlC__
+ # error
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ compiler_xlc=yes
+else $as_nop
+ compiler_xlc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $compiler_xlc" >&5
+printf "%s\n" "$compiler_xlc" >&6; }
+if test $compiler_xlc = yes -a "$powerpc_darwin" = true; then
+ # the darwin stack-frame-walking code is completely broken on xlc
+
+printf "%s\n" "#define DARWIN_DONT_PARSE_STACK 1" >>confdefs.h
+
+fi
+
+# XLC neither requires nor tolerates the unnecessary assembler goop.
+# Similar for the Sun C compiler.
+ if test $compiler_xlc = yes -o $compiler_suncc = yes; then
+ ASM_WITH_CPP_UNSUPPORTED_TRUE=
+ ASM_WITH_CPP_UNSUPPORTED_FALSE='#'
+else
+ ASM_WITH_CPP_UNSUPPORTED_TRUE='#'
+ ASM_WITH_CPP_UNSUPPORTED_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ # Disable aliasing optimization unless forced to.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fno-strict-aliasing" >&5
+printf %s "checking whether compiler supports -fno-strict-aliasing... " >&6; }
+ ac_cv_fno_strict_aliasing=no
+ for cflag in $CFLAGS; do
+ case "$cflag" in
+ -fstrict-aliasing)
+ # Opposite option already present
+ ac_cv_fno_strict_aliasing=skipped
+ break
+ ;;
+ esac
+ done
+ if test "$ac_cv_fno_strict_aliasing" != skipped; then
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_fno_strict_aliasing=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_fno_strict_aliasing" = yes
+then :
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+fi
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fno_strict_aliasing" >&5
+printf "%s\n" "$ac_cv_fno_strict_aliasing" >&6; }
+fi
+
+# Check for getcontext (uClibc can be configured without it, for example)
+ac_fn_c_check_func "$LINENO" "getcontext" "ac_cv_func_getcontext"
+if test "x$ac_cv_func_getcontext" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define NO_GETCONTEXT 1" >>confdefs.h
+
+fi
+
+
+# Check whether dl_iterate_phdr exists (as a strong symbol).
+ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr"
+if test "x$ac_cv_func_dl_iterate_phdr" = xyes
+then :
+ printf "%s\n" "#define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h
+
+fi
+
+
+case "$host" in
+# While IRIX 6 has libdl for the O32 and N32 ABIs, it's missing for N64
+# and unnecessary everywhere.
+ mips-sgi-irix6*) ;;
+# We never want libdl on darwin. It is a fake libdl that just ends up making
+# dyld calls anyway. The same applies to Cygwin.
+ *-*-cygwin* | *-*-darwin* | *-*-msys*)
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ THREADDLLIBS="$THREADDLLIBS -ldl"
+fi
+
+ ;;
+esac
+
+case "$host" in
+ *-*-hpux*)
+ avoid_cpp_lib=yes;;
+ *)
+ avoid_cpp_lib=no;
+ ;;
+esac
+ if test $avoid_cpp_lib = yes; then
+ AVOID_CPP_LIB_TRUE=
+ AVOID_CPP_LIB_FALSE='#'
+else
+ AVOID_CPP_LIB_TRUE='#'
+ AVOID_CPP_LIB_FALSE=
+fi
+
+
+# Check for various headers.
+ac_fn_c_check_header_compile "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default"
+if test "x$ac_cv_header_execinfo_h" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define GC_MISSING_EXECINFO_H 1" >>confdefs.h
+
+fi
+
+
+# extra LD Flags which are required for targets
+case "${host}" in
+ *-*-darwin*)
+ extra_ldflags_libgc=-Wl,-single_module
+ ;;
+esac
+
+
+
+
+target_all=libgc.la
+
+
+TARGET_ECOS="no"
+
+# Check whether --with-ecos was given.
+if test ${with_ecos+y}
+then :
+ withval=$with_ecos; TARGET_ECOS="$with_ecos"
+
+fi
+
+
+addobjs=
+addlibs=
+CXXLIBS=
+
+case "$TARGET_ECOS" in
+ no)
+ ;;
+ *)
+
+printf "%s\n" "#define ECOS 1" >>confdefs.h
+
+ AM_CPPFLAGS="-I${TARGET_ECOS}/include $AM_CPPFLAGS"
+ addobjs="$addobjs ecos.lo"
+ ;;
+esac
+
+ if test "${enable_cplusplus}" = yes; then
+ CPLUSPLUS_TRUE=
+ CPLUSPLUS_FALSE='#'
+else
+ CPLUSPLUS_TRUE='#'
+ CPLUSPLUS_FALSE=
+fi
+
+
+# Check whether --enable-throw-bad-alloc-library was given.
+if test ${enable_throw_bad_alloc_library+y}
+then :
+ enableval=$enable_throw_bad_alloc_library;
+fi
+
+ if test "${enable_cplusplus}" = yes \
+ -a "${enable_throw_bad_alloc_library}" != no; then
+ GC_TBA_LIBRARY_TRUE=
+ GC_TBA_LIBRARY_FALSE='#'
+else
+ GC_TBA_LIBRARY_TRUE='#'
+ GC_TBA_LIBRARY_FALSE=
+fi
+
+
+if test "$GCC" = yes; then
+ if test "${enable_cplusplus}" = yes; then
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libsupc++ required" >&5
+printf %s "checking whether libsupc++ required... " >&6; }
+ SUPC="`$CXX -print-file-name=libsupc++.a 2>/dev/null`"
+ if test -n "$SUPC" -a "$SUPC" != "libsupc++.a"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ CXXLIBS="-lsupc++"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ esac
+ fi
+fi
+
+
+
+
+
+
+# Configuration of shared libraries
+#
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
+# Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+case "$host" in
+ alpha-*-openbsd*)
+ enable_shared=no
+ ;;
+ *)
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
+
+# Compile with GC_DLL defined unless building static libraries.
+if test "${enable_shared}" != no -a "${enable_static}" != yes; then
+ printf "%s\n" "#define GC_DLL 1" >>confdefs.h
+
+ if test "$GCC" = yes; then
+ # Pass -fvisibility=hidden option if supported
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fvisibility" >&5
+printf %s "checking whether compiler supports -fvisibility... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Werror -fvisibility=hidden $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_fvisibility_hidden=yes
+else $as_nop
+ ac_cv_fvisibility_hidden=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_fvisibility_hidden" = yes
+then :
+ CFLAGS="-DGC_VISIBILITY_HIDDEN_SET -fvisibility=hidden $CFLAGS"
+else $as_nop
+ CFLAGS="-DGC_NO_VISIBILITY $CFLAGS"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fvisibility_hidden" >&5
+printf "%s\n" "$ac_cv_fvisibility_hidden" >&6; }
+ fi
+else
+
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ # Do not require the clients to link with "user32" system library.
+
+printf "%s\n" "#define DONT_USE_USER32_DLL 1" >>confdefs.h
+
+ # Use inline version of GC new and delete operators in test_cpp
+ # otherwise the system ones might be used instead because of arbitrary
+ # ordering of object files when linking.
+ CXXFLAGS="$CXXFLAGS -DGC_NOT_DLL"
+ ;;
+ esac
+fi
+
+# Configuration of machine-dependent code
+#
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which machine-dependent code should be used" >&5
+printf %s "checking which machine-dependent code should be used... " >&6; }
+machdep=
+case "$host" in
+ alpha-*-openbsd*)
+ if test x"${ac_cv_lib_dl_dlopen}" != xyes ; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"OpenBSD/Alpha without dlopen(). Shared library support is disabled.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"OpenBSD/Alpha without dlopen(). Shared library support is disabled.\"" >&2;}
+ fi
+ ;;
+ i?86-*-solaris2.[89])
+ # PROC_VDB appears to work in 2.8 and 2.9 but not in 2.10+ (for now).
+
+printf "%s\n" "#define SOLARIS25_PROC_VDB_BUG_FIXED 1" >>confdefs.h
+
+ ;;
+ sparc-*-netbsd*)
+ machdep="sparc_netbsd_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc*-*-linux* | sparc*-*-openbsd* | sparc64-*-freebsd* | sparc64-*-netbsd*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc-sun-solaris2.3)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+
+printf "%s\n" "#define SUNOS53_SHARED_LIB 1" >>confdefs.h
+
+ ;;
+ sparc*-sun-solaris2*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ ia64-*-*)
+ machdep="ia64_save_regs_in_stack.lo"
+ ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $machdep" >&5
+printf "%s\n" "$machdep" >&6; }
+addobjs="$addobjs $machdep"
+
+
+
+
+
+# Suppress "extension used" clang warning (when compiling .S files).
+if test x$compile_asm = xtrue -a "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-language-extension-token" >&5
+printf %s "checking whether compiler supports -Wno-language-extension-token... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-language-extension-token"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_lang_ext_token=yes
+else $as_nop
+ ac_cv_lang_ext_token=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+ if test "$ac_cv_lang_ext_token" = yes
+then :
+ CFLAGS="$CFLAGS -Wno-language-extension-token"
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lang_ext_token" >&5
+printf "%s\n" "$ac_cv_lang_ext_token" >&6; }
+fi
+
+
+# Check whether --with-target-subdir was given.
+if test ${with_target_subdir+y}
+then :
+ withval=$with_target_subdir;
+fi
+
+
+# Check whether --with-cross-host was given.
+if test ${with_cross_host+y}
+then :
+ withval=$with_cross_host;
+fi
+
+
+if false; then
+ :
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether AIX gcc optimization fix is necessary" >&5
+printf %s "checking whether AIX gcc optimization fix is necessary... " >&6; }
+case "$host" in
+ *aix*)
+ if test "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ new_CFLAGS=
+ for i in $CFLAGS; do
+ case "$i" in
+ -O*)
+ ;;
+ *)
+ new_CFLAGS="$new_CFLAGS $i"
+ ;;
+ esac
+ done
+ CFLAGS="$new_CFLAGS"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
+
+
+printf "%s\n" "#define NO_EXECUTE_PERMISSION 1" >>confdefs.h
+
+
+printf "%s\n" "#define ALL_INTERIOR_POINTERS 1" >>confdefs.h
+
+
+
+# Check whether --enable-gcj-support was given.
+if test ${enable_gcj_support+y}
+then :
+ enableval=$enable_gcj_support;
+fi
+
+if test x"$enable_gcj_support" != xno; then
+
+printf "%s\n" "#define GC_GCJ_SUPPORT 1" >>confdefs.h
+
+ case "$host" in
+ *-*-kfreebsd*-gnu)
+ # FIXME: For a reason, gctest hangs up on kFreeBSD if both of
+ # THREAD_LOCAL_ALLOC and GC_ENABLE_SUSPEND_THREAD are defined.
+ if test "${enable_thread_local_alloc}" = no; then
+ printf "%s\n" "#define GC_ENABLE_SUSPEND_THREAD 1" >>confdefs.h
+
+ fi
+ ;;
+ *)
+
+printf "%s\n" "#define GC_ENABLE_SUSPEND_THREAD 1" >>confdefs.h
+
+ ;;
+ esac
+fi
+ if test x"enable_gcj_support" != xno; then
+ ENABLE_GCJ_SUPPORT_TRUE=
+ ENABLE_GCJ_SUPPORT_FALSE='#'
+else
+ ENABLE_GCJ_SUPPORT_TRUE='#'
+ ENABLE_GCJ_SUPPORT_FALSE=
+fi
+
+
+# Check whether --enable-sigrt-signals was given.
+if test ${enable_sigrt_signals+y}
+then :
+ enableval=$enable_sigrt_signals;
+fi
+
+if test x"${enable_sigrt_signals}" = xyes; then
+
+printf "%s\n" "#define GC_USESIGRT_SIGNALS 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+UNWINDLIBS=
+# Check whether --enable-gc-debug was given.
+if test ${enable_gc_debug+y}
+then :
+ enableval=$enable_gc_debug; if test "$enable_gc_debug" = "yes"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Should define GC_DEBUG and use debug alloc in clients.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Should define GC_DEBUG and use debug alloc in clients.\"" >&2;}
+
+printf "%s\n" "#define KEEP_BACK_PTRS 1" >>confdefs.h
+
+ keep_back_ptrs=true
+
+printf "%s\n" "#define DBG_HDRS_ALL 1" >>confdefs.h
+
+
+
+ case $host in
+ ia64-*-linux* )
+ printf "%s\n" "#define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ printf "%s\n" "#define SAVE_CALL_COUNT 8" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for backtrace in -lunwind" >&5
+printf %s "checking for backtrace in -lunwind... " >&6; }
+if test ${ac_cv_lib_unwind_backtrace+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lunwind $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char backtrace ();
+int
+main (void)
+{
+return backtrace ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_unwind_backtrace=yes
+else $as_nop
+ ac_cv_lib_unwind_backtrace=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_unwind_backtrace" >&5
+printf "%s\n" "$ac_cv_lib_unwind_backtrace" >&6; }
+if test "x$ac_cv_lib_unwind_backtrace" = xyes
+then :
+
+ printf "%s\n" "#define GC_HAVE_BUILTIN_BACKTRACE 1" >>confdefs.h
+
+ UNWINDLIBS=-lunwind
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Client code may need to link against libunwind.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Client code may need to link against libunwind.\"" >&2;}
+
+fi
+
+ ;;
+ x86-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
+ printf "%s\n" "#define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&5
+printf "%s\n" "$as_me: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&2;}
+ printf "%s\n" "#define SAVE_CALL_COUNT 8" >>confdefs.h
+
+ ;;
+ i345686-*-dgux*)
+ printf "%s\n" "#define MAKE_BACK_GRAPH 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+fi
+
+ if test x"$enable_gc_debug" = xyes; then
+ MAKE_BACK_GRAPH_TRUE=
+ MAKE_BACK_GRAPH_FALSE='#'
+else
+ MAKE_BACK_GRAPH_TRUE='#'
+ MAKE_BACK_GRAPH_FALSE=
+fi
+
+ if test x"$keep_back_ptrs" = xtrue; then
+ KEEP_BACK_PTRS_TRUE=
+ KEEP_BACK_PTRS_FALSE='#'
+else
+ KEEP_BACK_PTRS_TRUE='#'
+ KEEP_BACK_PTRS_FALSE=
+fi
+
+
+# Check whether a compiler warning of unsafe __builtin_return_address(1)
+# could be suppressed by -Wno-frame-address option.
+# __builtin_return_address(1) is used by libgc for debugging purposes only.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -Wno-frame-address works" >&5
+printf %s "checking whether -Wno-frame-address works... " >&6; }
+use_wno_error_frame_address=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Werror -Wno-frame-address $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+{
+ if (!__builtin_return_address(1)) return 1;
+}
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ use_wno_error_frame_address=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $use_wno_error_frame_address" >&5
+printf "%s\n" "$use_wno_error_frame_address" >&6; }
+if test x"$use_wno_error_frame_address" = xyes; then
+ CFLAGS="$CFLAGS -Wno-frame-address"
+fi
+
+# Check for dladdr (used for debugging).
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dladdr" >&5
+printf %s "checking for dladdr... " >&6; }
+have_dladdr=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _GNU_SOURCE 1
+#include <dlfcn.h>
+int
+main (void)
+{
+{
+ Dl_info info;
+ (void)dladdr("", &info);
+}
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ have_dladdr=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_dladdr" >&5
+printf "%s\n" "$have_dladdr" >&6; }
+if test x"$have_dladdr" = xyes; then
+
+printf "%s\n" "#define HAVE_DLADDR 1" >>confdefs.h
+
+fi
+
+# sigsetjmp could be a macro (thus AC_CHECK_FUNCS cannot be used).
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sigsetjmp" >&5
+printf %s "checking for sigsetjmp... " >&6; }
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <setjmp.h>
+int
+main (void)
+{
+sigjmp_buf t; sigsetjmp(t, 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+printf "%s\n" "#define GC_NO_SIGSETJMP 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+
+# pthread_setname_np, if available, may have 1, 2 or 3 arguments.
+if test "$THREADS" = posix
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_setname_np" >&5
+printf %s "checking for pthread_setname_np... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -Werror"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np("thread-name")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (w/o tid)" >&5
+printf "%s\n" "yes (w/o tid)" >&6; }
+
+printf "%s\n" "#define HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID 1" >>confdefs.h
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np(pthread_self(), "thread-name-%u", 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (with tid and arg)" >&5
+printf "%s\n" "yes (with tid and arg)" >&6; }
+
+printf "%s\n" "#define HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG 1" >>confdefs.h
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define _GNU_SOURCE 1
+# include <pthread.h>
+
+int
+main (void)
+{
+pthread_setname_np(pthread_self(), "thread-name")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (with tid)" >&5
+printf "%s\n" "yes (with tid)" >&6; }
+
+printf "%s\n" "#define HAVE_PTHREAD_SETNAME_NP_WITH_TID 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for AViiON Machines running DGUX
+ac_is_dgux=no
+ac_fn_c_check_header_compile "$LINENO" "sys/dg_sys_info.h" "ac_cv_header_sys_dg_sys_info_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_dg_sys_info_h" = xyes
+then :
+ ac_is_dgux=yes;
+fi
+
+
+if test $ac_is_dgux = yes; then
+ dgux_spec_opts="-DDGUX -D_DGUX_SOURCE -Di386 -mno-legend -O2"
+ CFLAGS="$dgux_spec_opts $CFLAGS"
+ CXXFLAGS="$dgux_spec_opts $CXXFLAGS"
+ if test "$enable_gc_debug" = "yes"; then
+ CFLAGS="-g -mstandard $CFLAGS"
+ CXXFLAGS="-g -mstandard $CXXFLAGS"
+ fi
+
+
+fi
+
+# Check whether --enable-java-finalization was given.
+if test ${enable_java_finalization+y}
+then :
+ enableval=$enable_java_finalization;
+fi
+
+if test x"$enable_java_finalization" != xno; then
+
+printf "%s\n" "#define JAVA_FINALIZATION 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-atomic-uncollectable was given.
+if test ${enable_atomic_uncollectable+y}
+then :
+ enableval=$enable_atomic_uncollectable;
+fi
+
+if test x"$enable_atomic_uncollectible" != x"no"; then
+
+printf "%s\n" "#define GC_ATOMIC_UNCOLLECTABLE 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-redirect-malloc was given.
+if test ${enable_redirect_malloc+y}
+then :
+ enableval=$enable_redirect_malloc;
+fi
+
+
+if test "${enable_redirect_malloc}" = yes; then
+ if test "${enable_gc_debug}" = yes; then
+
+printf "%s\n" "#define REDIRECT_MALLOC GC_debug_malloc_replacement" >>confdefs.h
+
+
+printf "%s\n" "#define REDIRECT_REALLOC GC_debug_realloc_replacement" >>confdefs.h
+
+
+printf "%s\n" "#define REDIRECT_FREE GC_debug_free" >>confdefs.h
+
+ else
+ printf "%s\n" "#define REDIRECT_MALLOC GC_malloc" >>confdefs.h
+
+ fi
+
+printf "%s\n" "#define GC_USE_DLOPEN_WRAP 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-disclaim was given.
+if test ${enable_disclaim+y}
+then :
+ enableval=$enable_disclaim;
+fi
+
+if test x"$enable_disclaim" != xno; then
+
+printf "%s\n" "#define ENABLE_DISCLAIM 1" >>confdefs.h
+
+fi
+ if test x"$enable_disclaim" != xno; then
+ ENABLE_DISCLAIM_TRUE=
+ ENABLE_DISCLAIM_FALSE='#'
+else
+ ENABLE_DISCLAIM_TRUE='#'
+ ENABLE_DISCLAIM_FALSE=
+fi
+
+
+# Check whether --enable-large-config was given.
+if test ${enable_large_config+y}
+then :
+ enableval=$enable_large_config;
+fi
+
+if test "${enable_large_config}" = yes; then
+
+printf "%s\n" "#define LARGE_CONFIG 1" >>confdefs.h
+
+fi
+
+if test -n "${with_cross_host}"; then
+
+printf "%s\n" "#define NO_CLOCK 1" >>confdefs.h
+
+
+printf "%s\n" "#define SMALL_CONFIG 1" >>confdefs.h
+
+fi
+
+if test "$enable_gc_debug" = "no"; then
+
+printf "%s\n" "#define NO_DEBUGGING 1" >>confdefs.h
+
+fi
+
+
+
+# Check whether --enable-gc-assertions was given.
+if test ${enable_gc_assertions+y}
+then :
+ enableval=$enable_gc_assertions;
+fi
+
+if test "${enable_gc_assertions}" = yes; then
+
+printf "%s\n" "#define GC_ASSERTIONS 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-mmap was given.
+if test ${enable_mmap+y}
+then :
+ enableval=$enable_mmap; gc_use_mmap=$enableval
+fi
+
+
+# Check whether --enable-munmap was given.
+if test ${enable_munmap+y}
+then :
+ enableval=$enable_munmap; MUNMAP_THRESHOLD=$enableval
+fi
+
+if test x$enable_munmap != xno; then
+
+printf "%s\n" "#define USE_MMAP 1" >>confdefs.h
+
+
+
+printf "%s\n" "#define USE_MUNMAP 1" >>confdefs.h
+
+ if test x$MUNMAP_THRESHOLD = x -o x$MUNMAP_THRESHOLD = xyes; then
+ MUNMAP_THRESHOLD=6
+ fi
+
+printf "%s\n" "#define MUNMAP_THRESHOLD ${MUNMAP_THRESHOLD}" >>confdefs.h
+
+else
+ if test "${gc_use_mmap}" = "yes"; then
+
+printf "%s\n" "#define USE_MMAP 1" >>confdefs.h
+
+ fi
+fi
+
+# Check whether --enable-dynamic-loading was given.
+if test ${enable_dynamic_loading+y}
+then :
+ enableval=$enable_dynamic_loading;
+fi
+
+if test "${enable_dynamic_loading}" = "no"; then
+
+printf "%s\n" "#define IGNORE_DYNAMIC_LOADING 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-register-main-static-data was given.
+if test ${enable_register_main_static_data+y}
+then :
+ enableval=$enable_register_main_static_data;
+fi
+
+if test "${enable_register_main_static_data}" = "no"; then
+
+printf "%s\n" "#define GC_DONT_REGISTER_MAIN_STATIC_DATA 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-checksums was given.
+if test ${enable_checksums+y}
+then :
+ enableval=$enable_checksums;
+fi
+
+if test x$enable_checksums = xyes; then
+ if test x$enable_munmap != xno -o x$THREADS != xnone; then
+ as_fn_error $? "CHECKSUMS not compatible with USE_MUNMAP or threads" "$LINENO" 5
+ fi
+
+printf "%s\n" "#define CHECKSUMS 1" >>confdefs.h
+
+fi
+ if test x$enable_checksums = xyes; then
+ CHECKSUMS_TRUE=
+ CHECKSUMS_FALSE='#'
+else
+ CHECKSUMS_TRUE='#'
+ CHECKSUMS_FALSE=
+fi
+
+
+ if test -z "$with_cross_host"; then
+ USE_LIBDIR_TRUE=
+ USE_LIBDIR_FALSE='#'
+else
+ USE_LIBDIR_TRUE='#'
+ USE_LIBDIR_FALSE=
+fi
+
+
+# Check whether --enable-werror was given.
+if test ${enable_werror+y}
+then :
+ enableval=$enable_werror; werror_flag=$enableval
+else $as_nop
+ werror_flag=no
+fi
+
+if test x$werror_flag = xyes; then
+ WERROR_CFLAGS="-Werror"
+ case "$host" in
+ # _dyld_bind_fully_image_containing_address is deprecated in OS X 10.5+
+ *-*-darwin*)
+ WERROR_CFLAGS="$WERROR_CFLAGS -Wno-deprecated-declarations"
+ ;;
+ esac
+fi
+
+
+# Check whether --enable-single-obj-compilation was given.
+if test ${enable_single_obj_compilation+y}
+then :
+ enableval=$enable_single_obj_compilation;
+else $as_nop
+ if test x"$enable_static" = xno
+then :
+ enable_single_obj_compilation=yes
+fi
+fi
+
+ if test x"$enable_single_obj_compilation" = xyes; then
+ SINGLE_GC_OBJ_TRUE=
+ SINGLE_GC_OBJ_FALSE='#'
+else
+ SINGLE_GC_OBJ_TRUE='#'
+ SINGLE_GC_OBJ_FALSE=
+fi
+
+
+# Check whether --enable-gcov was given.
+if test ${enable_gcov+y}
+then :
+ enableval=$enable_gcov;
+fi
+
+if test "$enable_gcov" = "yes"; then
+ CFLAGS="-D NTHREADS=20 $CFLAGS --coverage"
+ if test "${enable_shared}" = no; then
+ # FIXME: As of g++-4.8.4/x64, in case of shared library build, test_cpp
+ # linkage fails with "hidden symbol atexit is referenced by DSO" message.
+ CXXFLAGS="$CXXFLAGS --coverage"
+ fi
+ # Turn off optimization to get accurate line numbers.
+ CFLAGS=`echo "$CFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+ CXXFLAGS=`echo "$CXXFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+fi
+
+# Check whether --enable-docs was given.
+if test ${enable_docs+y}
+then :
+ enableval=$enable_docs;
+fi
+
+ if test x$enable_docs != xno; then
+ ENABLE_DOCS_TRUE=
+ ENABLE_DOCS_FALSE='#'
+else
+ ENABLE_DOCS_TRUE='#'
+ ENABLE_DOCS_FALSE=
+fi
+
+
+ if test x$enable_shared = xyes; then
+ ENABLE_SHARED_TRUE=
+ ENABLE_SHARED_FALSE='#'
+else
+ ENABLE_SHARED_TRUE='#'
+ ENABLE_SHARED_FALSE=
+fi
+
+
+# Atomic Ops
+# ----------
+
+# Do we want to use an external libatomic_ops? By default use it if it's
+# found.
+
+# Check whether --with-libatomic-ops was given.
+if test ${with_libatomic_ops+y}
+then :
+ withval=$with_libatomic_ops;
+else $as_nop
+ if test x"$THREADS" != xnone
+then :
+ with_libatomic_ops=check
+else $as_nop
+ with_libatomic_ops=none
+fi
+fi
+
+
+# Check whether compiler atomic intrinsics can be used.
+if test x"$with_libatomic_ops" = xcheck; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler intrinsics support" >&5
+printf %s "checking for compiler intrinsics support... " >&6; }
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -DGC_BUILTIN_ATOMIC"
+ CFLAGS="$CFLAGS -I${srcdir}/include -I${srcdir}/tests"
+ if test "$cross_compiling" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: skipped because cross-compiling" >&5
+printf "%s\n" "skipped because cross-compiling" >&6; }
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "test_atomic_ops.c"
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ with_libatomic_ops=none
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for an external libatomic_ops if the above answer is "yes" or "check".
+# If not found, fail on "yes", and convert "check" to "no".
+# First, check that libatomic_ops usage is not disabled explicitly.
+missing_libatomic_ops=false
+if test x"$with_libatomic_ops" != xno -a x"$with_libatomic_ops" != xnone
+then :
+ missing_libatomic_ops=true
+fi
+
+
+if test x$missing_libatomic_ops = xtrue
+then :
+ ac_fn_c_check_header_compile "$LINENO" "atomic_ops.h" "ac_cv_header_atomic_ops_h" "$ac_includes_default"
+if test "x$ac_cv_header_atomic_ops_h" = xyes
+then :
+ missing_libatomic_ops=false
+fi
+
+fi
+if test x$missing_libatomic_ops = xtrue
+then :
+ if test x"$with_libatomic_ops" != xcheck
+then :
+ as_fn_error $? "An external libatomic_ops was not found" "$LINENO" 5
+fi
+ with_libatomic_ops=no
+fi
+
+# If we have neither an external or an internal version, offer a useful hint
+# and exit.
+if test x"$with_libatomic_ops" = xno \
+ -a ! -e "$srcdir/libatomic_ops/src/atomic_ops.h"
+then :
+ as_fn_error $? "libatomic_ops is required. You can either install it on
+ your system, or fetch and unpack a recent version into the
+ source directory and link or rename it to libatomic_ops." "$LINENO" 5
+fi
+
+# Finally, emit the definitions for bundled or external AO.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which libatomic_ops to use" >&5
+printf %s "checking which libatomic_ops to use... " >&6; }
+
+
+if test x"$with_libatomic_ops" != xno
+then :
+ if test x"$with_libatomic_ops" != xnone -a x"$THREADS" != xnone
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: external" >&5
+printf "%s\n" "external" >&6; }
+ ATOMIC_OPS_LIBS="-latomic_ops"
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
+ if test x"$THREADS" != xnone
+then :
+
+printf "%s\n" "#define GC_BUILTIN_ATOMIC 1" >>confdefs.h
+
+fi
+fi
+ AO_TRYLINK_CFLAGS=""
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: internal" >&5
+printf "%s\n" "internal" >&6; }
+ AO_TRYLINK_CFLAGS="-I${srcdir}/libatomic_ops/src"
+ ATOMIC_OPS_CFLAGS='-I$(top_builddir)/libatomic_ops/src -I$(top_srcdir)/libatomic_ops/src'
+ ATOMIC_OPS_LIBS=""
+
+ subdirs="$subdirs libatomic_ops"
+
+
+fi
+ if test x$with_libatomic_ops = xno -a x"$THREADS" != xnone; then
+ USE_INTERNAL_LIBATOMIC_OPS_TRUE=
+ USE_INTERNAL_LIBATOMIC_OPS_FALSE='#'
+else
+ USE_INTERNAL_LIBATOMIC_OPS_TRUE='#'
+ USE_INTERNAL_LIBATOMIC_OPS_FALSE=
+fi
+
+ if test x$with_libatomic_ops = xno -a x$need_atomic_ops_asm = xtrue; then
+ NEED_ATOMIC_OPS_ASM_TRUE=
+ NEED_ATOMIC_OPS_ASM_FALSE='#'
+else
+ NEED_ATOMIC_OPS_ASM_TRUE='#'
+ NEED_ATOMIC_OPS_ASM_FALSE=
+fi
+
+
+# Check whether particular AO primitives are emulated with locks.
+# The check below is based on the fact that linking with the libatomic_ops
+# binary file is not needed in case of absence of the emulation (except for
+# Solaris SPARC).
+if test x$with_libatomic_ops != xnone -a x$need_atomic_ops_asm != xtrue
+then :
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $AO_TRYLINK_CFLAGS $CFLAGS_EXTRA"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free AO_or primitive" >&5
+printf %s "checking for lock-free AO_or primitive... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;AO_or(&x,1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_LOCKFREE_AO_OR 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free AO load/store, test-and-set primitives" >&5
+printf %s "checking for lock-free AO load/store, test-and-set primitives... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;unsigned char c=0;AO_TS_t z=AO_TS_INITIALIZER;
+ (void)AO_test_and_set_acquire(&z);AO_CLEAR(&z);AO_compiler_barrier();
+ AO_store(&x,AO_load(&x)+1);AO_char_store(&c,AO_char_load(&c)+1);
+ AO_store_release(&x,AO_load_acquire(&x)+1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ use_thread_local_alloc=no
+
+printf "%s\n" "#define BASE_ATOMIC_OPS_EMULATED 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test x$use_parallel_mark != xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lock-free compare-and-swap and fetch-and-add primitives" >&5
+printf %s "checking for lock-free compare-and-swap and fetch-and-add primitives... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"
+int
+main (void)
+{
+AO_t x=0;(void)AO_fetch_and_add(&x,1);(void)AO_compare_and_swap(&x,1,2)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ use_parallel_mark=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ CFLAGS="$old_CFLAGS"
+fi
+
+if test x$use_parallel_mark != xno
+then :
+ printf "%s\n" "#define PARALLEL_MARK 1" >>confdefs.h
+
+fi
+if test x$use_thread_local_alloc != xno
+then :
+ printf "%s\n" "#define THREAD_LOCAL_ALLOC 1" >>confdefs.h
+
+fi
+ if test x$use_thread_local_alloc != xno; then
+ THREAD_LOCAL_ALLOC_TRUE=
+ THREAD_LOCAL_ALLOC_FALSE='#'
+else
+ THREAD_LOCAL_ALLOC_TRUE='#'
+ THREAD_LOCAL_ALLOC_FALSE=
+fi
+
+
+# Check whether --enable-handle-fork was given.
+if test ${enable_handle_fork+y}
+then :
+ enableval=$enable_handle_fork;
+fi
+
+if test "${enable_handle_fork}" = yes; then
+
+printf "%s\n" "#define HANDLE_FORK 1" >>confdefs.h
+
+elif test "${enable_handle_fork}" = no; then
+
+printf "%s\n" "#define NO_HANDLE_FORK 1" >>confdefs.h
+
+elif test "${enable_handle_fork}" != manual -a x$THREADS = xposix; then
+ # If the option is omitted, pthread_atfork handlers are installed
+ # by default for the targets where pthread_atfork is known to work.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-freebsd* | \
+ *-*-haiku* | *-*-hpux11* | *-*-irix* | *-*-kfreebsd*-gnu | \
+ *-*-*linux* | *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ printf "%s\n" "#define HANDLE_FORK 1" >>confdefs.h
+
+ ;;
+ esac
+fi
+
+
+ac_config_files="$ac_config_files Makefile bdw-gc.pc"
+
+
+ac_config_commands="$ac_config_commands default"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${EMSCRIPTEN_TRUE}" && test -z "${EMSCRIPTEN_FALSE}"; then
+ as_fn_error $? "conditional \"EMSCRIPTEN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THREADS_TRUE}" && test -z "${THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PTHREADS_TRUE}" && test -z "${PTHREADS_FALSE}"; then
+ as_fn_error $? "conditional \"PTHREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DARWIN_THREADS_TRUE}" && test -z "${DARWIN_THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"DARWIN_THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WIN32_THREADS_TRUE}" && test -z "${WIN32_THREADS_FALSE}"; then
+ as_fn_error $? "conditional \"WIN32_THREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PTHREAD_START_STANDALONE_TRUE}" && test -z "${PTHREAD_START_STANDALONE_FALSE}"; then
+ as_fn_error $? "conditional \"PTHREAD_START_STANDALONE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ASM_WITH_CPP_UNSUPPORTED_TRUE}" && test -z "${ASM_WITH_CPP_UNSUPPORTED_FALSE}"; then
+ as_fn_error $? "conditional \"ASM_WITH_CPP_UNSUPPORTED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AVOID_CPP_LIB_TRUE}" && test -z "${AVOID_CPP_LIB_FALSE}"; then
+ as_fn_error $? "conditional \"AVOID_CPP_LIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CPLUSPLUS_TRUE}" && test -z "${CPLUSPLUS_FALSE}"; then
+ as_fn_error $? "conditional \"CPLUSPLUS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GC_TBA_LIBRARY_TRUE}" && test -z "${GC_TBA_LIBRARY_FALSE}"; then
+ as_fn_error $? "conditional \"GC_TBA_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GCJ_SUPPORT_TRUE}" && test -z "${ENABLE_GCJ_SUPPORT_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_GCJ_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MAKE_BACK_GRAPH_TRUE}" && test -z "${MAKE_BACK_GRAPH_FALSE}"; then
+ as_fn_error $? "conditional \"MAKE_BACK_GRAPH\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${KEEP_BACK_PTRS_TRUE}" && test -z "${KEEP_BACK_PTRS_FALSE}"; then
+ as_fn_error $? "conditional \"KEEP_BACK_PTRS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DISCLAIM_TRUE}" && test -z "${ENABLE_DISCLAIM_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DISCLAIM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CHECKSUMS_TRUE}" && test -z "${CHECKSUMS_FALSE}"; then
+ as_fn_error $? "conditional \"CHECKSUMS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_LIBDIR_TRUE}" && test -z "${USE_LIBDIR_FALSE}"; then
+ as_fn_error $? "conditional \"USE_LIBDIR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SINGLE_GC_OBJ_TRUE}" && test -z "${SINGLE_GC_OBJ_FALSE}"; then
+ as_fn_error $? "conditional \"SINGLE_GC_OBJ\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DOCS_TRUE}" && test -z "${ENABLE_DOCS_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DOCS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INTERNAL_LIBATOMIC_OPS_TRUE}" && test -z "${USE_INTERNAL_LIBATOMIC_OPS_FALSE}"; then
+ as_fn_error $? "conditional \"USE_INTERNAL_LIBATOMIC_OPS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${NEED_ATOMIC_OPS_ASM_TRUE}" && test -z "${NEED_ATOMIC_OPS_ASM_FALSE}"; then
+ as_fn_error $? "conditional \"NEED_ATOMIC_OPS_ASM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THREAD_LOCAL_ALLOC_TRUE}" && test -z "${THREAD_LOCAL_ALLOC_FALSE}"; then
+ as_fn_error $? "conditional \"THREAD_LOCAL_ALLOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gc $as_me 8.2.8, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <https://github.com/ivmai/bdwgc/issues>."
+
+_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config='$ac_cs_config_escaped'
+ac_cs_version="\\
+gc config.status 8.2.8
+configured by $0, generated by GNU Autoconf 2.71,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ printf "%s\n" "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ printf "%s\n" "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ printf "%s\n" "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ printf "%s\n" "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+FILECMD \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+
+
+
+
+ srcdir="${srcdir}"
+ host=${host}
+ CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ CC="${CC}"
+ DEFS="$DEFS"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "bdw-gc.pc") CONFIG_FILES="$CONFIG_FILES bdw-gc.pc" ;;
+ "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in #(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; #(
+ *) :
+ set x $CONFIG_FILES ;; #(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "libtool":C)
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# A file(cmd) program that detects file types.
+FILECMD=$lt_FILECMD
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive (by configure).
+lt_ar_flags=$lt_ar_flags
+
+# Flags to create an archive.
+AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"}
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ $SED '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+
+ cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file, --srcdir, and --disable-option-checking arguments
+ # so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ eval "set x $ac_configure_args"
+ shift
+ for ac_arg
+ do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case $ac_arg in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+ | --c=*)
+ ;;
+ --config-cache | -C)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ;;
+ --disable-option-checking)
+ ;;
+ *)
+ case $ac_arg in
+ *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
+ esac
+ done
+
+ # Always prepend --prefix to ensure using the same prefix
+ # in subdir configurations.
+ ac_arg="--prefix=$prefix"
+ case $ac_arg in
+ *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
+
+ # Pass --silent
+ if test "$silent" = yes; then
+ ac_sub_configure_args="--silent $ac_sub_configure_args"
+ fi
+
+ # Always prepend --disable-option-checking to silence warnings, since
+ # different subdirs can have different --enable and --with options.
+ ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
+
+ ac_popdir=`pwd`
+ for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ test -d "$srcdir/$ac_dir" || continue
+
+ ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
+ printf "%s\n" "$ac_msg" >&6
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ cd "$ac_dir"
+
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ ac_sub_configure=$ac_srcdir/configure.gnu
+ elif test -f "$ac_srcdir/configure"; then
+ ac_sub_configure=$ac_srcdir/configure
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
+printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+ # Make the cache file name correct relative to the subdirectory.
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+ *) # Relative name.
+ ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+printf "%s\n" "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+ # The eval makes quoting arguments work.
+ eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
+ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
+ as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
+ fi
+
+ cd "$ac_popdir"
+ done
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
diff --git a/graphics/asymptote/gc/configure.ac b/graphics/asymptote/gc/configure.ac
new file mode 100644
index 0000000000..3d30c9c13c
--- /dev/null
+++ b/graphics/asymptote/gc/configure.ac
@@ -0,0 +1,1214 @@
+# Copyright (c) 1999-2001 by Red Hat, Inc. All rights reserved.
+# Copyright (c) 2005-2009 Hewlett-Packard Development Company, L.P.
+# Copyright (c) 2009-2021 Ivan Maidanski
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+dnl Process this file with autoconf to produce configure.
+
+dnl Initialization.
+AC_INIT([gc],[8.2.8],[https://github.com/ivmai/bdwgc/issues])
+dnl Version must conform to: [0-9]+[.][0-9]+[.][0-9]+
+
+AC_CONFIG_SRCDIR(gcj_mlc.c)
+AC_CONFIG_MACRO_DIR([m4])
+AC_CANONICAL_TARGET
+AC_PREREQ([2.71])
+GC_SET_VERSION
+AM_INIT_AUTOMAKE([foreign nostdinc subdir-objects])
+AC_CONFIG_HEADERS([include/config.h])
+AM_MAINTAINER_MODE
+
+AC_SUBST(PACKAGE)
+AC_SUBST(GC_VERSION)
+
+AM_PROG_CC_C_O
+AC_PROG_CXX
+AM_PROG_AS
+AC_PROG_INSTALL
+LT_INIT([disable-static])
+# Only the shared libraries are produced by default, use "--enable-static"
+# option to override it.
+dnl Note: If Autoconf reports that LIBTOOL (or AC_ENABLE_SHARED, or
+dnl LT_INIT) is undefined, Libtool installation should be checked.
+
+# Special CFLAGS to use when building
+gc_cflags=""
+
+# Set to "yes" on platforms where mmap should be used instead of sbrk.
+# This will define USE_MMAP.
+gc_use_mmap=""
+
+# We should set -fexceptions if we are using gcc and might be used
+# inside something like gcj. This is the zeroth approximation:
+if test :"$GCC": = :yes: ; then
+ gc_cflags="${gc_cflags} -fexceptions"
+else
+ case "$host" in
+ hppa*-*-hpux* )
+ if test :$GCC: != :"yes": ; then
+ gc_cflags="${gc_cflags} +ESdbgasm"
+ fi
+ # :TODO: actually we should check using Autoconf if
+ # the compiler supports this option.
+ ;;
+ esac
+fi
+
+# target_optspace --enable-target-optspace ("yes", "no", "")
+case "${target_optspace}:${host}" in
+ yes:*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ :m32r-* | :d10v-* | :d30v-*)
+ gc_cflags="${gc_cflags} -Os"
+ ;;
+ no:* | :*)
+ # Nothing.
+ ;;
+esac
+
+# Set any host dependent compiler flags.
+case "${host}" in
+ mips-tx39-*|mipstx39-unknown-*)
+ gc_cflags="${gc_cflags} -G 0"
+ ;;
+ *)
+ ;;
+esac
+
+AC_MSG_CHECKING([for emscripten])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+# ifndef __EMSCRIPTEN__
+# error This is not Emscripten
+# endif
+ ]])], [emscripten=yes], [emscripten=no])
+AM_CONDITIONAL(EMSCRIPTEN, test x$emscripten = xyes)
+AC_MSG_RESULT([$emscripten])
+
+AC_ARG_ENABLE(emscripten-asyncify,
+ [AS_HELP_STRING([--enable-emscripten-asyncify],
+ [use Emscripten asyncify feature])])
+# Use this option if your program is targeting -sASYNCIFY. The latter is
+# required to scan the stack, ASYNCIFY_STACK_SIZE is probably needed for
+# gctest only.
+AS_IF([test "${emscripten}" = yes -a "${enable_emscripten_asyncify}" = yes],
+ [gc_cflags="${gc_cflags} -DEMSCRIPTEN_ASYNCIFY"
+ gc_cflags="${gc_cflags} -sASYNCIFY -sASYNCIFY_STACK_SIZE=128000"])
+
+GC_CFLAGS=${gc_cflags}
+AC_SUBST(GC_CFLAGS)
+
+dnl Extra user-defined flags to pass both to C and C++ compilers.
+AC_SUBST([CFLAGS_EXTRA])
+
+AC_ARG_ENABLE(threads,
+ [AS_HELP_STRING([--enable-threads=TYPE], [choose threading package])],
+ THREADS=$enableval,
+ [ AC_MSG_CHECKING([for thread model used by GCC])
+ THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
+ if test -z "$THREADS" -o "x$emscripten" = "xyes"; then
+ THREADS=no
+ fi
+ if test "$THREADS" = "posix"; then
+ case "$host" in
+ *-*-mingw*)
+ # Adjust thread model if cross-compiling for MinGW.
+ THREADS=win32
+ ;;
+ esac
+ fi
+ AC_MSG_RESULT([$THREADS]) ])
+
+AC_ARG_ENABLE(parallel-mark,
+ [AS_HELP_STRING([--disable-parallel-mark],
+ [do not parallelize marking and free list construction])],
+ [case "$THREADS" in
+ no | none | single)
+ if test "${enable_parallel_mark}" != no; then
+ AC_MSG_ERROR([Parallel mark requires --enable-threads=x spec])
+ fi
+ ;;
+ esac])
+
+AC_ARG_ENABLE(thread-local-alloc,
+ [AS_HELP_STRING([--disable-thread-local-alloc],
+ [turn off thread-local allocation optimization])],
+ [case "$THREADS" in
+ no | none | single)
+ if test "${enable_thread_local_alloc}" = yes; then
+ AC_MSG_ERROR(
+ [Thread-local allocation requires --enable-threads=x spec])
+ fi
+ ;;
+ esac])
+
+AC_ARG_ENABLE(threads-discovery,
+ [AS_HELP_STRING([--disable-threads-discovery],
+ [disable threads discovery in GC])])
+if test "${enable_threads_discovery}" = no; then
+ AC_DEFINE([GC_NO_THREADS_DISCOVERY], 1,
+ [Disable threads discovery in GC.])
+fi
+
+AC_ARG_ENABLE(cplusplus,
+ [AS_HELP_STRING([--enable-cplusplus], [install C++ support])])
+
+dnl Features which may be selected in the following thread-detection switch.
+AH_TEMPLATE([PARALLEL_MARK], [Define to enable parallel marking.])
+AH_TEMPLATE([THREAD_LOCAL_ALLOC],
+ [Define to enable thread-local allocation optimization.])
+AH_TEMPLATE([USE_COMPILER_TLS],
+ [Define to use of compiler-support for thread-local variables.])
+
+dnl Thread selection macros.
+AH_TEMPLATE([GC_THREADS], [Define to support platform-specific
+ threads.])
+AH_TEMPLATE([GC_WIN32_PTHREADS],
+ [Define to support pthreads-win32 or winpthreads.])
+
+dnl System header feature requests.
+AH_TEMPLATE([_POSIX_C_SOURCE], [The POSIX feature macro.])
+AH_TEMPLATE([_PTHREADS], [Indicates the use of pthreads (NetBSD).])
+
+dnl Win32-specific API usage controls.
+AH_TEMPLATE([GC_UNDERSCORE_STDCALL],
+ [Explicitly prefix exported/imported WINAPI symbols with '_'.])
+AH_TEMPLATE([UNICODE],
+ [Use Unicode (W) variant of Win32 API instead of ASCII (A) one.])
+
+dnl GC API symbols export control.
+AH_TEMPLATE([GC_DLL],
+ [Define to build dynamic libraries with only API symbols exposed.])
+
+dnl Check for a flavor of supported inline keyword.
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+AC_C_INLINE
+CFLAGS="$old_CFLAGS"
+
+THREADDLLIBS=
+need_atomic_ops_asm=false
+need_lib_rt=false
+compile_asm=false
+use_parallel_mark=no
+use_thread_local_alloc=no
+# Libraries needed to support dynamic loading and/or threads.
+case "$THREADS" in
+ no | none | single)
+ THREADS=none
+ ;;
+ posix | pthreads)
+ THREADS=posix
+ default_threadlibs=false
+ # Common defines for most POSIX platforms.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-dragonfly* | \
+ *-*-freebsd* | *-*-haiku* | *-*-hpux11* | *-*-irix* | \
+ *-*-kfreebsd*-gnu | *-*-gnu* | *-*-*linux* | *-*-msys* | *-*-nacl* | \
+ *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ AC_DEFINE(GC_THREADS)
+ AC_DEFINE([_REENTRANT], [1],
+ [Required define if using POSIX threads.])
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ default_threadlibs=true
+ AC_MSG_WARN("Explicit GC_INIT() calls may be required.")
+ ;;
+ esac
+ AC_CHECK_LIB(pthread, pthread_self, THREADDLLIBS="-lpthread",,)
+ case "$host" in
+ *-*-hpux11*)
+ AC_MSG_WARN("Only HP/UX 11 POSIX threads are supported.")
+ AC_DEFINE(_POSIX_C_SOURCE,199506L)
+ THREADDLLIBS="-lpthread"
+ # HPUX needs REENTRANT for the _r calls.
+ need_lib_rt=true
+ ;;
+ *-*-openbsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-freebsd*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ ;;
+ *-*-kfreebsd*-gnu)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-gnu*) # E.g. linux but excluding kfreebsd.
+ # The default THREADDLLIBS.
+ ;;
+ *-*-netbsd*)
+ AC_MSG_WARN("Only on NetBSD 2.0 or later.")
+ AC_DEFINE(_PTHREADS)
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-solaris*)
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *-*-cygwin* | *-*-msys*)
+ # Cygwin doesn't have a real libpthread, so Libtool can't link
+ # against it.
+ THREADDLLIBS=""
+ win32_threads=true
+ ;;
+ *-*-mingw*)
+ AC_DEFINE(GC_WIN32_PTHREADS)
+ # Using pthreads-win32 (or other non-Cygwin pthreads) library.
+ THREADDLLIBS="-lpthread"
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ win32_threads=true
+ ;;
+ *-*-darwin*)
+ darwin_threads=true
+ ;;
+ *-*-osf*)
+ AM_CFLAGS="$AM_CFLAGS -pthread"
+ THREADDLLIBS="-lpthread"
+ need_lib_rt=true
+ ;;
+ *)
+ AS_IF([test x$default_threadlibs != xtrue],
+ [ AC_MSG_ERROR(
+ [Pthreads not supported by the GC on this platform]) ])
+ # The default THREADDLLIBS.
+ ;;
+ esac
+ case "$host" in
+ sparc*-*-solaris*)
+ if test "$GCC" != yes; then
+ need_atomic_ops_asm=true
+ fi
+ ;;
+ esac
+ ;;
+ mcf | win32)
+ AC_DEFINE(GC_THREADS)
+ use_parallel_mark=$enable_parallel_mark
+ if test "${enable_parallel_mark}" != no \
+ -o "${enable_shared}" != yes -o "${enable_static}" != no; then
+ # Imply THREAD_LOCAL_ALLOC unless GC_DLL.
+ use_thread_local_alloc=$enable_thread_local_alloc
+ fi
+ if test "${enable_win32_dllmain}" = yes; then
+ AC_DEFINE(GC_INSIDE_DLL, 1,
+ [Enable Win32 DllMain-based approach of threads registering.])
+ fi
+ win32_threads=true
+ AC_DEFINE([EMPTY_GETENV_RESULTS], [1],
+ [Wine getenv may not return NULL for missing entry.])
+ ;;
+ dgux386)
+ AC_DEFINE(GC_THREADS)
+ # Use pthread GCC switch
+ THREADDLLIBS=-pthread
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ AC_MSG_WARN("Explicit GC_INIT() calls may be required.")
+ AM_CFLAGS="-pthread $AM_CFLAGS"
+ ;;
+ aix)
+ THREADS=posix
+ THREADDLLIBS=-lpthread
+ AC_DEFINE(GC_THREADS)
+ AC_DEFINE(_REENTRANT)
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ rtems)
+ THREADS=posix
+ AC_DEFINE(GC_THREADS)
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
+ ;;
+ decosf1 | irix | mach | os2 | solaris | dce | vxworks)
+ AC_MSG_ERROR(thread package $THREADS not yet supported)
+ ;;
+ *)
+ AC_MSG_ERROR($THREADS is an unknown thread package)
+ ;;
+esac
+
+# Check whether -lrt linker option is needed to use clock_gettime.
+if test "x$need_lib_rt" != xtrue; then
+ AC_MSG_CHECKING(for clock_gettime without additional libraries)
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <time.h>],
+ [struct timespec t; clock_gettime(CLOCK_REALTIME, &t)])],
+ [AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)
+ AC_CHECK_LIB(rt, clock_gettime, [need_lib_rt=true])])
+fi
+
+if test "x$need_lib_rt" = xtrue; then
+ THREADDLLIBS="$THREADDLLIBS -lrt"
+fi
+AC_SUBST(THREADDLLIBS)
+
+AM_CONDITIONAL(THREADS, test x$THREADS != xnone)
+AM_CONDITIONAL(PTHREADS, test x$THREADS = xposix)
+AM_CONDITIONAL(DARWIN_THREADS, test x$darwin_threads = xtrue)
+AM_CONDITIONAL(WIN32_THREADS, test x$win32_threads = xtrue)
+
+compiler_suncc=no
+pthread_start_standalone=no
+case "$host" in
+ *-*-*linux*)
+ # Turn on the workaround described in pthread_start.c.
+ AS_IF([test "$THREADS" = posix], [pthread_start_standalone=yes])
+ ;;
+ powerpc-*-darwin*)
+ powerpc_darwin=true
+ ;;
+ *-*-solaris*)
+ if test "$GCC" != yes; then
+ # Solaris SunCC
+ compiler_suncc=yes
+ CFLAGS="-O $CFLAGS"
+ fi
+ ;;
+ *-*-wince*)
+ if test "$enable_gc_debug" != "no"; then
+ AC_DEFINE([GC_READ_ENV_FILE], 1,
+ [Read environment variables from the GC 'env' file.])
+ fi
+ ;;
+esac
+AM_CONDITIONAL(PTHREAD_START_STANDALONE,
+ test x$pthread_start_standalone = xyes)
+
+if test "$GCC" = yes; then
+ # Output all warnings.
+ AC_MSG_CHECKING([whether compiler supports -Wextra])
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Wextra $CFLAGS"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[ac_cv_cc_wextra=yes],[ac_cv_cc_wextra=no])
+ CFLAGS="$old_CFLAGS"
+ AC_MSG_RESULT($ac_cv_cc_wextra)
+ AS_IF([test "$ac_cv_cc_wextra" = yes], [WEXTRA="-Wextra"], [WEXTRA="-W"])
+ AC_MSG_CHECKING([whether compiler supports -Wpedantic])
+ CFLAGS="-Wpedantic -Wno-long-long $CFLAGS"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
+ extern int quiet;
+ ]])],[ac_cv_cc_pedantic=yes],[ac_cv_cc_pedantic=no])
+ CFLAGS="$old_CFLAGS"
+ AC_MSG_RESULT($ac_cv_cc_pedantic)
+ WPEDANTIC=
+ AS_IF([test "$ac_cv_cc_pedantic" = yes],
+ [WPEDANTIC="-Wpedantic -Wno-long-long"])
+ CFLAGS="-Wall $WEXTRA $WPEDANTIC $CFLAGS"
+ CXXFLAGS="-Wall $WEXTRA $WPEDANTIC $CXXFLAGS"
+fi
+
+AC_MSG_CHECKING(for xlc)
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
+ #ifndef __xlC__
+ # error
+ #endif
+]])],[compiler_xlc=yes],[compiler_xlc=no])
+AC_MSG_RESULT($compiler_xlc)
+if test $compiler_xlc = yes -a "$powerpc_darwin" = true; then
+ # the darwin stack-frame-walking code is completely broken on xlc
+ AC_DEFINE([DARWIN_DONT_PARSE_STACK], 1, [See doc/README.macros.])
+fi
+
+# XLC neither requires nor tolerates the unnecessary assembler goop.
+# Similar for the Sun C compiler.
+AM_CONDITIONAL([ASM_WITH_CPP_UNSUPPORTED],
+ [test $compiler_xlc = yes -o $compiler_suncc = yes])
+
+if test "$GCC" = yes; then
+ # Disable aliasing optimization unless forced to.
+ AC_MSG_CHECKING([whether compiler supports -fno-strict-aliasing])
+ ac_cv_fno_strict_aliasing=no
+ for cflag in $CFLAGS; do
+ case "$cflag" in
+ -fstrict-aliasing)
+ # Opposite option already present
+ ac_cv_fno_strict_aliasing=skipped
+ break
+ ;;
+ esac
+ done
+ if test "$ac_cv_fno_strict_aliasing" != skipped; then
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fno-strict-aliasing"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[ac_cv_fno_strict_aliasing=yes],[])
+ CFLAGS="$old_CFLAGS"
+ AS_IF([test "$ac_cv_fno_strict_aliasing" = yes],
+ [CFLAGS="$CFLAGS -fno-strict-aliasing"], [])
+ fi
+ AC_MSG_RESULT($ac_cv_fno_strict_aliasing)
+fi
+
+# Check for getcontext (uClibc can be configured without it, for example)
+AC_CHECK_FUNC([getcontext], [],
+ [ AC_DEFINE([NO_GETCONTEXT], [1], [Missing getcontext function.]) ])
+
+# Check whether dl_iterate_phdr exists (as a strong symbol).
+AC_CHECK_FUNCS([dl_iterate_phdr])
+
+case "$host" in
+# While IRIX 6 has libdl for the O32 and N32 ABIs, it's missing for N64
+# and unnecessary everywhere.
+ mips-sgi-irix6*) ;;
+# We never want libdl on darwin. It is a fake libdl that just ends up making
+# dyld calls anyway. The same applies to Cygwin.
+ *-*-cygwin* | *-*-darwin* | *-*-msys*)
+ ;;
+ *)
+ AC_CHECK_LIB(dl, dlopen, THREADDLLIBS="$THREADDLLIBS -ldl")
+ ;;
+esac
+
+case "$host" in
+ *-*-hpux*)
+ avoid_cpp_lib=yes;;
+ *)
+ avoid_cpp_lib=no;
+ ;;
+esac
+AM_CONDITIONAL(AVOID_CPP_LIB,test $avoid_cpp_lib = yes)
+
+# Check for various headers.
+AC_CHECK_HEADER([execinfo.h], [],
+ [ AC_DEFINE([GC_MISSING_EXECINFO_H], [1], [Missing execinfo.h header.]) ])
+
+# extra LD Flags which are required for targets
+case "${host}" in
+ *-*-darwin*)
+ extra_ldflags_libgc=-Wl,-single_module
+ ;;
+esac
+AC_SUBST(extra_ldflags_libgc)
+
+AC_SUBST(EXTRA_TEST_LIBS)
+
+target_all=libgc.la
+AC_SUBST(target_all)
+
+dnl If the target is an eCos system, use the appropriate eCos
+dnl I/O routines.
+dnl FIXME: this should not be a local option but a global target
+dnl system; at present there is no eCos target.
+TARGET_ECOS="no"
+AC_ARG_WITH(ecos,
+[ --with-ecos enable runtime eCos target support],
+TARGET_ECOS="$with_ecos"
+)
+
+addobjs=
+addlibs=
+CXXLIBS=
+
+case "$TARGET_ECOS" in
+ no)
+ ;;
+ *)
+ AC_DEFINE([ECOS], 1, [Define to enable eCos target support.])
+ AM_CPPFLAGS="-I${TARGET_ECOS}/include $AM_CPPFLAGS"
+ addobjs="$addobjs ecos.lo"
+ ;;
+esac
+
+AM_CONDITIONAL(CPLUSPLUS, test "${enable_cplusplus}" = yes)
+
+AC_ARG_ENABLE(throw-bad-alloc-library,
+ [AS_HELP_STRING([--disable-throw-bad-alloc-library],
+ [do not build C++ gctba library])])
+AM_CONDITIONAL(GC_TBA_LIBRARY,
+ test "${enable_cplusplus}" = yes \
+ -a "${enable_throw_bad_alloc_library}" != no)
+
+if test "$GCC" = yes; then
+ if test "${enable_cplusplus}" = yes; then
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ AC_MSG_CHECKING([whether libsupc++ required])
+ SUPC="`$CXX -print-file-name=libsupc++.a 2>/dev/null`"
+ if test -n "$SUPC" -a "$SUPC" != "libsupc++.a"; then
+ AC_MSG_RESULT(yes)
+ CXXLIBS="-lsupc++"
+ else
+ AC_MSG_RESULT(no)
+ fi
+ ;;
+ esac
+ fi
+fi
+
+AC_SUBST(CXX)
+AC_SUBST(AM_CFLAGS)
+AC_SUBST(AM_CPPFLAGS)
+AC_SUBST(CXXLIBS)
+
+# Configuration of shared libraries
+#
+AC_MSG_CHECKING(whether to build shared libraries)
+AC_ENABLE_SHARED
+
+case "$host" in
+ alpha-*-openbsd*)
+ enable_shared=no
+ ;;
+ *)
+ ;;
+esac
+
+AC_MSG_RESULT($enable_shared)
+
+# Compile with GC_DLL defined unless building static libraries.
+if test "${enable_shared}" != no -a "${enable_static}" != yes; then
+ AC_DEFINE(GC_DLL)
+ if test "$GCC" = yes; then
+ # Pass -fvisibility=hidden option if supported
+ AC_MSG_CHECKING([whether compiler supports -fvisibility])
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Werror -fvisibility=hidden $CFLAGS"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[ac_cv_fvisibility_hidden=yes],[ac_cv_fvisibility_hidden=no])
+ CFLAGS="$old_CFLAGS"
+ AS_IF([test "$ac_cv_fvisibility_hidden" = yes],
+ [CFLAGS="-DGC_VISIBILITY_HIDDEN_SET -fvisibility=hidden $CFLAGS"],
+ [CFLAGS="-DGC_NO_VISIBILITY $CFLAGS"])
+ AC_MSG_RESULT($ac_cv_fvisibility_hidden)
+ fi
+else
+
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ # Do not require the clients to link with "user32" system library.
+ AC_DEFINE([DONT_USE_USER32_DLL], 1,
+ [Do not use user32.dll import library (Win32).])
+ # Use inline version of GC new and delete operators in test_cpp
+ # otherwise the system ones might be used instead because of arbitrary
+ # ordering of object files when linking.
+ CXXFLAGS="$CXXFLAGS -DGC_NOT_DLL"
+ ;;
+ esac
+fi
+
+# Configuration of machine-dependent code
+#
+AC_MSG_CHECKING(which machine-dependent code should be used)
+machdep=
+case "$host" in
+ alpha-*-openbsd*)
+ if test x"${ac_cv_lib_dl_dlopen}" != xyes ; then
+ AC_MSG_WARN(
+ "OpenBSD/Alpha without dlopen(). Shared library support is disabled.")
+ fi
+ ;;
+ i?86-*-solaris2.[[89]])
+ # PROC_VDB appears to work in 2.8 and 2.9 but not in 2.10+ (for now).
+ AC_DEFINE([SOLARIS25_PROC_VDB_BUG_FIXED], 1,
+ [See the comment in gcconfig.h.])
+ ;;
+ sparc-*-netbsd*)
+ machdep="sparc_netbsd_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc*-*-linux* | sparc*-*-openbsd* | sparc64-*-freebsd* | sparc64-*-netbsd*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ sparc-sun-solaris2.3)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ AC_DEFINE(SUNOS53_SHARED_LIB, 1,
+ [Define to work around a Solaris 5.3 bug (see dyn_load.c).])
+ ;;
+ sparc*-sun-solaris2*)
+ machdep="sparc_mach_dep.lo"
+ compile_asm=true
+ ;;
+ ia64-*-*)
+ machdep="ia64_save_regs_in_stack.lo"
+ ;;
+esac
+AC_MSG_RESULT($machdep)
+addobjs="$addobjs $machdep"
+AC_SUBST(addobjs)
+AC_SUBST(addlibs)
+
+LT_INIT
+
+# Suppress "extension used" clang warning (when compiling .S files).
+if test x$compile_asm = xtrue -a "$GCC" = yes; then
+ AC_MSG_CHECKING([whether compiler supports -Wno-language-extension-token])
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-language-extension-token"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
+ [ac_cv_lang_ext_token=yes], [ac_cv_lang_ext_token=no])
+ CFLAGS="$old_CFLAGS"
+ AS_IF([test "$ac_cv_lang_ext_token" = yes],
+ [CFLAGS="$CFLAGS -Wno-language-extension-token"])
+ AC_MSG_RESULT($ac_cv_lang_ext_token)
+fi
+
+dnl We use these options to decide which functions to include.
+AC_ARG_WITH(target-subdir,
+[ --with-target-subdir=SUBDIR
+ configuring with a cross compiler])
+AC_ARG_WITH(cross-host,
+[ --with-cross-host=HOST configuring with a cross compiler])
+
+dnl automake wants to see AC_EXEEXT. But we don't need it. And having
+dnl it is actually a problem, because the compiler we're passed can't
+dnl necessarily do a full link. So we fool automake here.
+if false; then
+ dnl autoconf 2.50 runs AC_EXEEXT by default, and the macro expands
+ dnl to nothing, so nothing would remain between `then' and `fi' if it
+ dnl were not for the `:' below.
+ :
+ AC_EXEEXT
+fi
+
+dnl The collector might not properly work on IBM AIX when
+dnl built with gcc and -O. So we remove -O in the appropriate case.
+AC_MSG_CHECKING(whether AIX gcc optimization fix is necessary)
+case "$host" in
+ *aix*)
+ if test "$GCC" = yes; then
+ AC_MSG_RESULT(yes)
+ new_CFLAGS=
+ for i in $CFLAGS; do
+ case "$i" in
+ -O*)
+ ;;
+ *)
+ new_CFLAGS="$new_CFLAGS $i"
+ ;;
+ esac
+ done
+ CFLAGS="$new_CFLAGS"
+ else
+ AC_MSG_RESULT(no)
+ fi
+ ;;
+ *) AC_MSG_RESULT(no) ;;
+esac
+
+dnl Include defines that have become de facto standard.
+dnl ALL_INTERIOR_POINTERS and NO_EXECUTE_PERMISSION can be overridden
+dnl in the startup code.
+AC_DEFINE([NO_EXECUTE_PERMISSION], [1],
+ [Define to make the collector not allocate executable memory
+ by default.])
+AC_DEFINE([ALL_INTERIOR_POINTERS], [1],
+ [Define to recognise all pointers to the interior of objects.])
+
+
+dnl Interface Selection
+dnl -------------------
+dnl
+dnl By default, make the library as general as possible.
+AC_ARG_ENABLE(gcj-support,
+ [AS_HELP_STRING([--disable-gcj-support], [disable support for gcj])])
+if test x"$enable_gcj_support" != xno; then
+ AC_DEFINE(GC_GCJ_SUPPORT, 1, [Define to include support for gcj.])
+ case "$host" in
+ *-*-kfreebsd*-gnu)
+ # FIXME: For a reason, gctest hangs up on kFreeBSD if both of
+ # THREAD_LOCAL_ALLOC and GC_ENABLE_SUSPEND_THREAD are defined.
+ if test "${enable_thread_local_alloc}" = no; then
+ AC_DEFINE(GC_ENABLE_SUSPEND_THREAD)
+ fi
+ ;;
+ *)
+ AC_DEFINE([GC_ENABLE_SUSPEND_THREAD], 1,
+ [Define to turn on GC_suspend_thread support.])
+ ;;
+ esac
+fi
+AM_CONDITIONAL(ENABLE_GCJ_SUPPORT, [test x"enable_gcj_support" != xno])
+
+dnl Interaction with other programs that might use signals.
+AC_ARG_ENABLE(sigrt-signals,
+ [AS_HELP_STRING([--enable-sigrt-signals],
+ [force GC to use SIGRTMIN-based signals for thread suspend/resume])])
+if test x"${enable_sigrt_signals}" = xyes; then
+ AC_DEFINE([GC_USESIGRT_SIGNALS], 1,
+ [Force the GC to use signals based on SIGRTMIN+k.])
+fi
+
+
+dnl Debugging
+dnl ---------
+
+AH_TEMPLATE([GC_HAVE_BUILTIN_BACKTRACE],
+ [Define if backtrace information is supported.])
+AH_TEMPLATE([MAKE_BACK_GRAPH], [See doc/README.macros.])
+AH_TEMPLATE([SAVE_CALL_COUNT],
+ [The number of caller frames saved when allocating with the
+ debugging API.])
+UNWINDLIBS=
+AC_ARG_ENABLE(gc-debug,
+ [AS_HELP_STRING([--enable-gc-debug],
+ [include full support for pointer backtracing etc.])],
+[ if test "$enable_gc_debug" = "yes"; then
+ AC_MSG_WARN("Should define GC_DEBUG and use debug alloc in clients.")
+ AC_DEFINE([KEEP_BACK_PTRS], 1,
+ [Define to save back-pointers in debugging headers.])
+ keep_back_ptrs=true
+ AC_DEFINE([DBG_HDRS_ALL], 1,
+ [Define to force debug headers on all objects.])
+ AH_TEMPLATE([SHORT_DBG_HDRS],
+ [Shorten the headers to minimize object size at the expense
+ of checking for writes past the end (see doc/README.macros).])
+
+ case $host in
+ ia64-*-linux* )
+ AC_DEFINE(MAKE_BACK_GRAPH)
+ AC_DEFINE(SAVE_CALL_COUNT, 8)
+ AC_CHECK_LIB(unwind, backtrace, [
+ AC_DEFINE(GC_HAVE_BUILTIN_BACKTRACE)
+ UNWINDLIBS=-lunwind
+ AC_MSG_WARN("Client code may need to link against libunwind.")
+ ])
+ ;;
+ x86-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
+ AC_DEFINE(MAKE_BACK_GRAPH)
+ AC_MSG_WARN("Client must not use -fomit-frame-pointer.")
+ AC_DEFINE(SAVE_CALL_COUNT, 8)
+ ;;
+ i[3456]86-*-dgux*)
+ AC_DEFINE(MAKE_BACK_GRAPH)
+ ;;
+ esac
+ fi ])
+AM_CONDITIONAL([MAKE_BACK_GRAPH], [test x"$enable_gc_debug" = xyes])
+AM_CONDITIONAL([KEEP_BACK_PTRS], [test x"$keep_back_ptrs" = xtrue])
+
+# Check whether a compiler warning of unsafe __builtin_return_address(1)
+# could be suppressed by -Wno-frame-address option.
+# __builtin_return_address(1) is used by libgc for debugging purposes only.
+AC_MSG_CHECKING([whether -Wno-frame-address works])
+use_wno_error_frame_address=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Werror -Wno-frame-address $CFLAGS_EXTRA"
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[{
+ if (!__builtin_return_address(1)) return 1;
+}]])],[ use_wno_error_frame_address=yes ],[])
+CFLAGS="$old_CFLAGS"
+AC_MSG_RESULT($use_wno_error_frame_address)
+if test x"$use_wno_error_frame_address" = xyes; then
+ CFLAGS="$CFLAGS -Wno-frame-address"
+fi
+
+# Check for dladdr (used for debugging).
+AC_MSG_CHECKING(for dladdr)
+have_dladdr=no
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#define _GNU_SOURCE 1
+#include <dlfcn.h>]], [[{
+ Dl_info info;
+ (void)dladdr("", &info);
+}]])],[ have_dladdr=yes ],[])
+CFLAGS="$old_CFLAGS"
+AC_MSG_RESULT($have_dladdr)
+if test x"$have_dladdr" = xyes; then
+ AC_DEFINE([HAVE_DLADDR], 1, [Define to use 'dladdr' function.])
+fi
+
+# sigsetjmp could be a macro (thus AC_CHECK_FUNCS cannot be used).
+AC_MSG_CHECKING(for sigsetjmp)
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $CFLAGS_EXTRA"
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <setjmp.h>]], [[sigjmp_buf t; sigsetjmp(t, 0)]])],[AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)
+ AC_DEFINE([GC_NO_SIGSETJMP], [1], [Missing sigsetjmp function.])])
+CFLAGS="$old_CFLAGS"
+
+# pthread_setname_np, if available, may have 1, 2 or 3 arguments.
+AS_IF([test "$THREADS" = posix],
+ [AC_MSG_CHECKING(for pthread_setname_np)
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -Werror"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+# define _GNU_SOURCE 1
+# include <pthread.h>
+ ], [pthread_setname_np("thread-name")])],
+ [AC_MSG_RESULT([yes (w/o tid)])
+ AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID], [1],
+ [Define to use 'pthread_setname_np(const char*)' function.])], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+# define _GNU_SOURCE 1
+# include <pthread.h>
+ ], [pthread_setname_np(pthread_self(), "thread-name-%u", 0)])],
+ [AC_MSG_RESULT([yes (with tid and arg)])
+ AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG], [1],
+ [Define to use 'pthread_setname_np(pthread_t, const char*, void *)'
+ function.])],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+# define _GNU_SOURCE 1
+# include <pthread.h>
+ ], [pthread_setname_np(pthread_self(), "thread-name")])],
+ [AC_MSG_RESULT([yes (with tid)])
+ AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_WITH_TID], [1],
+ [Define to use 'pthread_setname_np(pthread_t, const char*)'
+ function.])],
+ [AC_MSG_RESULT(no)])])])
+ CFLAGS="$old_CFLAGS"])
+
+# Check for AViiON Machines running DGUX
+ac_is_dgux=no
+AC_CHECK_HEADER(sys/dg_sys_info.h,
+[ac_is_dgux=yes;])
+
+dnl :GOTCHA: we do not check anything but sys/dg_sys_info.h
+if test $ac_is_dgux = yes; then
+ dgux_spec_opts="-DDGUX -D_DGUX_SOURCE -Di386 -mno-legend -O2"
+ CFLAGS="$dgux_spec_opts $CFLAGS"
+ CXXFLAGS="$dgux_spec_opts $CXXFLAGS"
+ if test "$enable_gc_debug" = "yes"; then
+ CFLAGS="-g -mstandard $CFLAGS"
+ CXXFLAGS="-g -mstandard $CXXFLAGS"
+ fi
+ AC_SUBST(CFLAGS)
+ AC_SUBST(CXXFLAGS)
+fi
+
+AC_ARG_ENABLE(java-finalization,
+ [AS_HELP_STRING([--disable-java-finalization],
+ [disable support for java finalization])])
+if test x"$enable_java_finalization" != xno; then
+ AC_DEFINE([JAVA_FINALIZATION], 1, [See doc/README.macros.])
+fi
+
+AC_ARG_ENABLE(atomic-uncollectable,
+ [AS_HELP_STRING([--disable-atomic-uncollectible],
+ [disable support for atomic uncollectible allocation])])
+if test x"$enable_atomic_uncollectible" != x"no"; then
+ AC_DEFINE([GC_ATOMIC_UNCOLLECTABLE], 1,
+ [Define to enable atomic uncollectible allocation.])
+fi
+
+AC_ARG_ENABLE(redirect-malloc,
+ [AS_HELP_STRING([--enable-redirect-malloc],
+ [redirect malloc and friends to GC routines])])
+
+if test "${enable_redirect_malloc}" = yes; then
+ if test "${enable_gc_debug}" = yes; then
+ AC_DEFINE([REDIRECT_MALLOC], GC_debug_malloc_replacement,
+ [If defined, redirect malloc to this function.])
+ AC_DEFINE([REDIRECT_REALLOC], GC_debug_realloc_replacement,
+ [If defined, redirect GC_realloc to this function.])
+ AC_DEFINE([REDIRECT_FREE], GC_debug_free,
+ [If defined, redirect free to this function.])
+ else
+ AC_DEFINE(REDIRECT_MALLOC, GC_malloc)
+ fi
+ AC_DEFINE([GC_USE_DLOPEN_WRAP], 1, [See doc/README.macros.])
+fi
+
+AC_ARG_ENABLE(disclaim,
+ [AS_HELP_STRING([--disable-disclaim],
+ [disable alternative (more efficient) finalization interface])])
+if test x"$enable_disclaim" != xno; then
+ AC_DEFINE(ENABLE_DISCLAIM, 1,
+ [Define to enable alternative finalization interface.])
+fi
+AM_CONDITIONAL(ENABLE_DISCLAIM,
+ [test x"$enable_disclaim" != xno])
+
+AC_ARG_ENABLE(large-config,
+ [AS_HELP_STRING([--enable-large-config],
+ [optimize for large (> 100 MB) heap or root set])])
+if test "${enable_large_config}" = yes; then
+ AC_DEFINE(LARGE_CONFIG, 1,
+ [Define to optimize for large heaps or root sets.])
+fi
+
+dnl This is something of a hack. When cross-compiling we turn off
+dnl some functionality. We also enable the "small" configuration.
+dnl These is only correct when targeting an embedded system. FIXME.
+if test -n "${with_cross_host}"; then
+ AC_DEFINE([NO_CLOCK], 1, [Define to not use system clock (cross compiling).])
+ AC_DEFINE([SMALL_CONFIG], 1,
+ [Define to tune the collector for small heap sizes.])
+fi
+
+if test "$enable_gc_debug" = "no"; then
+ AC_DEFINE([NO_DEBUGGING], 1,
+ [Disable debugging, like GC_dump and its callees.])
+fi
+
+AC_SUBST(UNWINDLIBS)
+
+AC_ARG_ENABLE(gc-assertions,
+ [AS_HELP_STRING([--enable-gc-assertions],
+ [collector-internal assertion checking])])
+if test "${enable_gc_assertions}" = yes; then
+ AC_DEFINE([GC_ASSERTIONS], 1,
+ [Define to enable internal debug assertions.])
+fi
+
+AC_ARG_ENABLE(mmap,
+ [AS_HELP_STRING([--enable-mmap],
+ [use mmap instead of sbrk to expand the heap])],
+ gc_use_mmap=$enableval)
+
+AC_ARG_ENABLE(munmap,
+ [AS_HELP_STRING([--enable-munmap=N],
+ [return page to the OS if empty for N collections
+ (default: 6)])],
+ MUNMAP_THRESHOLD=$enableval)
+if test x$enable_munmap != xno; then
+ AC_DEFINE([USE_MMAP], 1,
+ [Define to use mmap instead of sbrk to expand the heap.])
+ AH_TEMPLATE([USE_WINALLOC],
+ [Define to use Win32 VirtualAlloc (instead of sbrk or
+ mmap) to expand the heap.])
+ AC_DEFINE([USE_MUNMAP], 1,
+ [Define to return memory to OS with munmap calls
+ (see doc/README.macros).])
+ if test x$MUNMAP_THRESHOLD = x -o x$MUNMAP_THRESHOLD = xyes; then
+ MUNMAP_THRESHOLD=6
+ fi
+ AC_DEFINE_UNQUOTED([MUNMAP_THRESHOLD], [${MUNMAP_THRESHOLD}],
+ [Number of GC cycles to wait before unmapping an unused block.])
+else
+ if test "${gc_use_mmap}" = "yes"; then
+ AC_DEFINE([USE_MMAP], 1,
+ [Define to use mmap instead of sbrk to expand the heap.])
+ fi
+fi
+
+AC_ARG_ENABLE(dynamic-loading,
+ [AS_HELP_STRING([--disable-dynamic-loading],
+ [build the collector with disabled tracing
+ of dynamic library data roots])])
+if test "${enable_dynamic_loading}" = "no"; then
+ AC_DEFINE([IGNORE_DYNAMIC_LOADING], 1,
+ [Do not define DYNAMIC_LOADING even if supported (i.e., build the
+ collector with disabled tracing of dynamic library data roots).])
+fi
+
+AC_ARG_ENABLE(register-main-static-data,
+ [AS_HELP_STRING([--disable-register-main-static-data],
+ [skip the initial guess of data root sets])])
+if test "${enable_register_main_static_data}" = "no"; then
+ AC_DEFINE([GC_DONT_REGISTER_MAIN_STATIC_DATA], 1,
+ [Skip the initial guess of data root sets.])
+fi
+
+AC_ARG_ENABLE(checksums,
+ [AS_HELP_STRING([--enable-checksums],
+ [report on erroneously cleared dirty bits at
+ substantial performance cost; use only for
+ debugging of the incremental collector])])
+if test x$enable_checksums = xyes; then
+ if test x$enable_munmap != xno -o x$THREADS != xnone; then
+ AC_MSG_ERROR([CHECKSUMS not compatible with USE_MUNMAP or threads])
+ fi
+ AC_DEFINE([CHECKSUMS], 1,
+ [Erroneously cleared dirty bits checking. Use only for
+ debugging of the incremental collector.])
+fi
+AM_CONDITIONAL([CHECKSUMS], test x$enable_checksums = xyes)
+
+AM_CONDITIONAL(USE_LIBDIR, test -z "$with_cross_host")
+
+AC_ARG_ENABLE(werror,
+ [AS_HELP_STRING([--enable-werror], [pass -Werror to the C compiler])],
+ werror_flag=$enableval, werror_flag=no)
+if test x$werror_flag = xyes; then
+ WERROR_CFLAGS="-Werror"
+ case "$host" in
+ # _dyld_bind_fully_image_containing_address is deprecated in OS X 10.5+
+ *-*-darwin*)
+ WERROR_CFLAGS="$WERROR_CFLAGS -Wno-deprecated-declarations"
+ ;;
+ esac
+fi
+AC_SUBST([WERROR_CFLAGS])
+
+AC_ARG_ENABLE(single-obj-compilation,
+ [AS_HELP_STRING([--enable-single-obj-compilation],
+ [compile all libgc source files into single .o
+ (default: yes if static libraries are disabled)])],
+ [], [ AS_IF([test x"$enable_static" = xno],
+ [enable_single_obj_compilation=yes]) ])
+AM_CONDITIONAL([SINGLE_GC_OBJ],
+ [test x"$enable_single_obj_compilation" = xyes])
+
+AC_ARG_ENABLE(gcov,
+ [AS_HELP_STRING([--enable-gcov], [turn on code coverage analysis])])
+if test "$enable_gcov" = "yes"; then
+ CFLAGS="-D NTHREADS=20 $CFLAGS --coverage"
+ if test "${enable_shared}" = no; then
+ # FIXME: As of g++-4.8.4/x64, in case of shared library build, test_cpp
+ # linkage fails with "hidden symbol atexit is referenced by DSO" message.
+ CXXFLAGS="$CXXFLAGS --coverage"
+ fi
+ # Turn off optimization to get accurate line numbers.
+ CFLAGS=`echo "$CFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+ CXXFLAGS=`echo "$CXXFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+fi
+
+AC_ARG_ENABLE(docs,
+ [AS_HELP_STRING([--disable-docs],
+ [do not build and install documentation])])
+AM_CONDITIONAL(ENABLE_DOCS, test x$enable_docs != xno)
+
+AM_CONDITIONAL(ENABLE_SHARED, test x$enable_shared = xyes)
+
+# Atomic Ops
+# ----------
+
+# Do we want to use an external libatomic_ops? By default use it if it's
+# found.
+AC_ARG_WITH([libatomic-ops],
+ [AS_HELP_STRING([--with-libatomic-ops[=yes|no|check|none]],
+ [use an external libatomic_ops? (default: check;
+ none: use compiler intrinsics or no thread support)])],
+ [], [ AS_IF([test x"$THREADS" != xnone],
+ [with_libatomic_ops=check], [with_libatomic_ops=none]) ])
+
+# Check whether compiler atomic intrinsics can be used.
+if test x"$with_libatomic_ops" = xcheck; then
+ AC_MSG_CHECKING(for compiler intrinsics support)
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAGS_EXTRA -DGC_BUILTIN_ATOMIC"
+ CFLAGS="$CFLAGS -I${srcdir}/include -I${srcdir}/tests"
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[#include "test_atomic_ops.c"]])],[AC_MSG_RESULT(yes)
+ with_libatomic_ops=none],[AC_MSG_RESULT(no)],[AC_MSG_RESULT(skipped because cross-compiling)])
+ CFLAGS="$old_CFLAGS"
+fi
+
+# Check for an external libatomic_ops if the above answer is "yes" or "check".
+# If not found, fail on "yes", and convert "check" to "no".
+# First, check that libatomic_ops usage is not disabled explicitly.
+missing_libatomic_ops=false
+AS_IF([test x"$with_libatomic_ops" != xno -a x"$with_libatomic_ops" != xnone],
+ [ missing_libatomic_ops=true ])
+
+dnl To avoid "syntax error near unexpected token ATOMIC_OPS" configure error
+dnl observed by some clients, the following 3 code lines are commented out:
+dnl
+dnl AS_IF([test x$missing_libatomic_ops = xtrue],
+dnl [ PKG_CHECK_MODULES([ATOMIC_OPS], [atomic_ops],
+dnl [ missing_libatomic_ops=false ], [ [] ]) ])
+
+dnl Retry with AC_CHECK_HEADER if PKG_CHECK_MODULES failed.
+AS_IF([test x$missing_libatomic_ops = xtrue],
+ [ AC_CHECK_HEADER([atomic_ops.h], [missing_libatomic_ops=false]) ])
+AS_IF([test x$missing_libatomic_ops = xtrue],
+ [ AS_IF([test x"$with_libatomic_ops" != xcheck],
+ [ AC_MSG_ERROR([An external libatomic_ops was not found]) ])
+ with_libatomic_ops=no ])
+
+# If we have neither an external or an internal version, offer a useful hint
+# and exit.
+AS_IF([test x"$with_libatomic_ops" = xno \
+ -a ! -e "$srcdir/libatomic_ops/src/atomic_ops.h"],
+ [ AC_MSG_ERROR([libatomic_ops is required. You can either install it on
+ your system, or fetch and unpack a recent version into the
+ source directory and link or rename it to libatomic_ops.]) ])
+
+# Finally, emit the definitions for bundled or external AO.
+AC_MSG_CHECKING([which libatomic_ops to use])
+AS_IF([test x"$with_libatomic_ops" != xno],
+ [ AS_IF([test x"$with_libatomic_ops" != xnone -a x"$THREADS" != xnone],
+ [ AC_MSG_RESULT([external])
+ ATOMIC_OPS_LIBS="-latomic_ops"
+ AC_SUBST([ATOMIC_OPS_LIBS]) ],
+ [ AC_MSG_RESULT([none])
+ AS_IF([test x"$THREADS" != xnone],
+ [ AC_DEFINE([GC_BUILTIN_ATOMIC], [1],
+ [Use GCC atomic intrinsics instead of
+ libatomic_ops primitives.]) ]) ])
+ AO_TRYLINK_CFLAGS="" ],
+ [ AC_MSG_RESULT([internal])
+ AO_TRYLINK_CFLAGS="-I${srcdir}/libatomic_ops/src"
+ ATOMIC_OPS_CFLAGS='-I$(top_builddir)/libatomic_ops/src -I$(top_srcdir)/libatomic_ops/src'
+ ATOMIC_OPS_LIBS=""
+ AC_SUBST([ATOMIC_OPS_CFLAGS])
+ AC_CONFIG_SUBDIRS([libatomic_ops])
+ ])
+AM_CONDITIONAL([USE_INTERNAL_LIBATOMIC_OPS],
+ [test x$with_libatomic_ops = xno -a x"$THREADS" != xnone])
+AM_CONDITIONAL([NEED_ATOMIC_OPS_ASM],
+ [test x$with_libatomic_ops = xno -a x$need_atomic_ops_asm = xtrue])
+
+# Check whether particular AO primitives are emulated with locks.
+# The check below is based on the fact that linking with the libatomic_ops
+# binary file is not needed in case of absence of the emulation (except for
+# Solaris SPARC).
+AS_IF([test x$with_libatomic_ops != xnone -a x$need_atomic_ops_asm != xtrue],
+ [ old_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $AO_TRYLINK_CFLAGS $CFLAGS_EXTRA"
+ AC_MSG_CHECKING([for lock-free AO_or primitive])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "atomic_ops.h"]], [[AO_t x=0;AO_or(&x,1)]])],[ AC_MSG_RESULT(yes)
+ AC_DEFINE([HAVE_LOCKFREE_AO_OR], [1],
+ [libatomic_ops AO_or primitive implementation is lock-free.]) ],[ AC_MSG_RESULT(no) ])
+ AC_MSG_CHECKING([for lock-free AO load/store, test-and-set primitives])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "atomic_ops.h"]], [[AO_t x=0;unsigned char c=0;AO_TS_t z=AO_TS_INITIALIZER;
+ (void)AO_test_and_set_acquire(&z);AO_CLEAR(&z);AO_compiler_barrier();
+ AO_store(&x,AO_load(&x)+1);AO_char_store(&c,AO_char_load(&c)+1);
+ AO_store_release(&x,AO_load_acquire(&x)+1)]])],[ AC_MSG_RESULT(yes) ],[ AC_MSG_RESULT(no)
+ use_thread_local_alloc=no
+ AC_DEFINE([BASE_ATOMIC_OPS_EMULATED], [1],
+ [AO load, store and/or test-and-set primitives are
+ implemented in libatomic_ops using locks.]) ])
+ AS_IF([test x$use_parallel_mark != xno],
+ [ AC_MSG_CHECKING(
+ [for lock-free compare-and-swap and fetch-and-add primitives])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"]], [[AO_t x=0;(void)AO_fetch_and_add(&x,1);(void)AO_compare_and_swap(&x,1,2)]])],[ AC_MSG_RESULT(yes) ],[ AC_MSG_RESULT(no)
+ use_parallel_mark=no ]) ])
+ CFLAGS="$old_CFLAGS" ])
+
+AS_IF([test x$use_parallel_mark != xno],
+ [ AC_DEFINE(PARALLEL_MARK) ])
+AS_IF([test x$use_thread_local_alloc != xno],
+ [ AC_DEFINE(THREAD_LOCAL_ALLOC) ])
+AM_CONDITIONAL(THREAD_LOCAL_ALLOC, test x$use_thread_local_alloc != xno)
+
+AC_ARG_ENABLE(handle-fork,
+ [AS_HELP_STRING([--enable-handle-fork[=yes|no|auto|manual]],
+ [attempt to ensure a usable collector after fork()
+ in multi-threaded programs (default: auto;
+ manual: GC_atfork_prepare/parent/child should be
+ called by the client)])])
+if test "${enable_handle_fork}" = yes; then
+ AC_DEFINE(HANDLE_FORK, 1,
+ [Define to install pthread_atfork() handlers by default.])
+elif test "${enable_handle_fork}" = no; then
+ AC_DEFINE(NO_HANDLE_FORK, 1,
+ [Prohibit installation of pthread_atfork() handlers.])
+elif test "${enable_handle_fork}" != manual -a x$THREADS = xposix; then
+ # If the option is omitted, pthread_atfork handlers are installed
+ # by default for the targets where pthread_atfork is known to work.
+ case "$host" in
+ *-*-aix* | *-*-android* | *-*-cygwin* | *-*-darwin* | *-*-freebsd* | \
+ *-*-haiku* | *-*-hpux11* | *-*-irix* | *-*-kfreebsd*-gnu | \
+ *-*-*linux* | *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ AC_DEFINE(HANDLE_FORK)
+ ;;
+ esac
+fi
+
+dnl Produce the Files
+dnl -----------------
+
+AC_CONFIG_FILES([Makefile bdw-gc.pc])
+
+AC_CONFIG_COMMANDS([default],,
+ [ srcdir="${srcdir}"
+ host=${host}
+ CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ CC="${CC}"
+ DEFS="$DEFS" ])
+
+AC_OUTPUT
diff --git a/graphics/asymptote/gc/cord/cord.am b/graphics/asymptote/gc/cord/cord.am
new file mode 100644
index 0000000000..466d50d524
--- /dev/null
+++ b/graphics/asymptote/gc/cord/cord.am
@@ -0,0 +1,40 @@
+## This file is processed with automake.
+
+# Info (current:revision:age) for the Libtool versioning system.
+# These numbers should be updated at most once just before the release,
+# and, optionally, at most once during the development (after the release).
+LIBCORD_VER_INFO = 6:1:5
+
+lib_LTLIBRARIES += libcord.la
+
+libcord_la_LIBADD = libgc.la
+libcord_la_LDFLAGS = -version-info $(LIBCORD_VER_INFO) -no-undefined
+libcord_la_CPPFLAGS = $(AM_CPPFLAGS)
+
+libcord_la_SOURCES = \
+ cord/cordbscs.c \
+ cord/cordprnt.c \
+ cord/cordxtra.c
+
+TESTS += cordtest$(EXEEXT)
+check_PROGRAMS += cordtest
+cordtest_SOURCES = cord/tests/cordtest.c
+cordtest_LDADD = $(top_builddir)/libcord.la
+
+## In case of static libraries build, libgc.a is already referenced in
+## dependency_libs attribute of libcord.la file.
+if ENABLE_SHARED
+cordtest_LDADD += $(top_builddir)/libgc.la
+endif
+
+EXTRA_DIST += \
+ cord/tests/de.c \
+ cord/tests/de_cmds.h \
+ cord/tests/de_win.c \
+ cord/tests/de_win.h \
+ cord/tests/de_win.rc
+
+pkginclude_HEADERS += \
+ include/cord.h \
+ include/cord_pos.h \
+ include/ec.h
diff --git a/graphics/asymptote/gc/cord/cordbscs.c b/graphics/asymptote/gc/cord/cordbscs.c
new file mode 100644
index 0000000000..f2a5a50570
--- /dev/null
+++ b/graphics/asymptote/gc/cord/cordbscs.c
@@ -0,0 +1,942 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#ifndef CORD_BUILD
+# define CORD_BUILD
+#endif
+
+# include "gc.h"
+# include "cord.h"
+# include <stdlib.h>
+# include <stdio.h>
+# include <string.h>
+
+/* An implementation of the cord primitives. These are the only */
+/* Functions that understand the representation. We perform only */
+/* minimal checks on arguments to these functions. Out of bounds */
+/* arguments to the iteration functions may result in client functions */
+/* invoked on garbage data. In most cases, client functions should be */
+/* programmed defensively enough that this does not result in memory */
+/* smashes. */
+
+typedef void (* oom_fn)(void);
+
+oom_fn CORD_oom_fn = (oom_fn) 0;
+
+# define OUT_OF_MEMORY { if (CORD_oom_fn != (oom_fn) 0) (*CORD_oom_fn)(); \
+ ABORT("Out of memory"); }
+# define ABORT(msg) { fprintf(stderr, "%s\n", msg); abort(); }
+
+typedef unsigned long word;
+
+ struct Concatenation {
+ char null;
+ char header;
+ char depth; /* concatenation nesting depth. */
+ unsigned char left_len;
+ /* Length of left child if it is sufficiently */
+ /* short; 0 otherwise. */
+# define MAX_LEFT_LEN 255
+ word len;
+ CORD left; /* length(left) > 0 */
+ CORD right; /* length(right) > 0 */
+ };
+
+ struct Function {
+ char null;
+ char header;
+ char depth; /* always 0 */
+ char left_len; /* always 0 */
+ word len;
+ CORD_fn fn;
+ void * client_data;
+ };
+
+ struct Generic {
+ char null;
+ char header;
+ char depth;
+ char left_len;
+ word len;
+ };
+
+typedef union {
+ struct Concatenation concatenation;
+ struct Function function;
+ struct Generic generic;
+ char string[1];
+} CordRep;
+
+# define CONCAT_HDR 1
+
+# define FN_HDR 4
+# define SUBSTR_HDR 6
+ /* Substring nodes are a special case of function nodes. */
+ /* The client_data field is known to point to a substr_args */
+ /* structure, and the function is either CORD_apply_access_fn */
+ /* or CORD_index_access_fn. */
+
+/* The following may be applied only to function and concatenation nodes: */
+#define IS_CONCATENATION(s) (((CordRep *)s)->generic.header == CONCAT_HDR)
+
+#define IS_FUNCTION(s) ((((CordRep *)s)->generic.header & FN_HDR) != 0)
+
+#define IS_SUBSTR(s) (((CordRep *)s)->generic.header == SUBSTR_HDR)
+
+#define LEN(s) (((CordRep *)s) -> generic.len)
+#define DEPTH(s) (((CordRep *)s) -> generic.depth)
+#define GEN_LEN(s) (CORD_IS_STRING(s) ? strlen(s) : LEN(s))
+
+#define LEFT_LEN(c) ((c) -> left_len != 0? \
+ (c) -> left_len \
+ : (CORD_IS_STRING((c) -> left) ? \
+ (c) -> len - GEN_LEN((c) -> right) \
+ : LEN((c) -> left)))
+
+#define SHORT_LIMIT (sizeof(CordRep) - 1)
+ /* Cords shorter than this are C strings */
+
+
+/* Dump the internal representation of x to stdout, with initial */
+/* indentation level n. */
+void CORD_dump_inner(CORD x, unsigned n)
+{
+ size_t i;
+
+ for (i = 0; i < (size_t)n; i++) {
+ fputs(" ", stdout);
+ }
+ if (x == 0) {
+ fputs("NIL\n", stdout);
+ } else if (CORD_IS_STRING(x)) {
+ for (i = 0; i <= SHORT_LIMIT; i++) {
+ if (x[i] == '\0') break;
+ putchar(x[i]);
+ }
+ if (x[i] != '\0') fputs("...", stdout);
+ putchar('\n');
+ } else if (IS_CONCATENATION(x)) {
+ struct Concatenation * conc = &(((CordRep *)x) -> concatenation);
+
+ printf("Concatenation: %p (len: %d, depth: %d)\n",
+ (void *)x, (int)(conc -> len), (int)(conc -> depth));
+ CORD_dump_inner(conc -> left, n+1);
+ CORD_dump_inner(conc -> right, n+1);
+ } else /* function */ {
+ struct Function * func = &(((CordRep *)x) -> function);
+
+ if (IS_SUBSTR(x)) printf("(Substring) ");
+ printf("Function: %p (len: %d): ", (void *)x, (int)(func -> len));
+ for (i = 0; i < 20 && i < func -> len; i++) {
+ putchar((*(func -> fn))(i, func -> client_data));
+ }
+ if (i < func -> len) fputs("...", stdout);
+ putchar('\n');
+ }
+}
+
+/* Dump the internal representation of x to stdout */
+void CORD_dump(CORD x)
+{
+ CORD_dump_inner(x, 0);
+ fflush(stdout);
+}
+
+CORD CORD_cat_char_star(CORD x, const char * y, size_t leny)
+{
+ size_t result_len;
+ size_t lenx;
+ int depth;
+
+ if (x == CORD_EMPTY) return(y);
+ if (leny == 0) return(x);
+ if (CORD_IS_STRING(x)) {
+ lenx = strlen(x);
+ result_len = lenx + leny;
+ if (result_len <= SHORT_LIMIT) {
+ char * result = (char *)GC_MALLOC_ATOMIC(result_len + 1);
+
+ if (result == 0) OUT_OF_MEMORY;
+# ifdef LINT2
+ memcpy(result, x, lenx + 1);
+# else
+ memcpy(result, x, lenx);
+ /* No need to copy the terminating zero */
+ /* as result[lenx] is written below. */
+# endif
+ memcpy(result + lenx, y, leny);
+ result[result_len] = '\0';
+ return((CORD) result);
+ } else {
+ depth = 1;
+ }
+ } else {
+ CORD right;
+ CORD left;
+ char * new_right;
+
+ lenx = LEN(x);
+
+ if (leny <= SHORT_LIMIT/2
+ && IS_CONCATENATION(x)
+ && CORD_IS_STRING(right = ((CordRep *)x) -> concatenation.right)) {
+ size_t right_len;
+
+ /* Merge y into right part of x. */
+ if (!CORD_IS_STRING(left = ((CordRep *)x) -> concatenation.left)) {
+ right_len = lenx - LEN(left);
+ } else if (((CordRep *)x) -> concatenation.left_len != 0) {
+ right_len = lenx - ((CordRep *)x) -> concatenation.left_len;
+ } else {
+ right_len = strlen(right);
+ }
+ result_len = right_len + leny; /* length of new_right */
+ if (result_len <= SHORT_LIMIT) {
+ new_right = (char *)GC_MALLOC_ATOMIC(result_len + 1);
+ if (new_right == 0) OUT_OF_MEMORY;
+ memcpy(new_right, right, right_len);
+ memcpy(new_right + right_len, y, leny);
+ new_right[result_len] = '\0';
+ y = new_right;
+ leny = result_len;
+ x = left;
+ lenx -= right_len;
+ /* Now fall through to concatenate the two pieces: */
+ }
+ if (CORD_IS_STRING(x)) {
+ depth = 1;
+ } else {
+ depth = DEPTH(x) + 1;
+ }
+ } else {
+ depth = DEPTH(x) + 1;
+ }
+ result_len = lenx + leny;
+ }
+ {
+ /* The general case; lenx, result_len is known: */
+ struct Concatenation * result = GC_NEW(struct Concatenation);
+
+ if (NULL == result) OUT_OF_MEMORY;
+ result->header = CONCAT_HDR;
+ result->depth = (char)depth;
+ if (lenx <= MAX_LEFT_LEN)
+ result->left_len = (unsigned char)lenx;
+ result->len = (word)result_len;
+ result->left = x;
+ GC_PTR_STORE_AND_DIRTY((void *)&result->right, y);
+ GC_reachable_here(x);
+ if (depth >= MAX_DEPTH) {
+ return(CORD_balance((CORD)result));
+ } else {
+ return((CORD) result);
+ }
+ }
+}
+
+
+CORD CORD_cat(CORD x, CORD y)
+{
+ size_t result_len;
+ int depth;
+ size_t lenx;
+
+ if (x == CORD_EMPTY) return(y);
+ if (y == CORD_EMPTY) return(x);
+ if (CORD_IS_STRING(y)) {
+ return(CORD_cat_char_star(x, y, strlen(y)));
+ } else if (CORD_IS_STRING(x)) {
+ lenx = strlen(x);
+ depth = DEPTH(y) + 1;
+ } else {
+ int depthy = DEPTH(y);
+
+ lenx = LEN(x);
+ depth = DEPTH(x) + 1;
+ if (depthy >= depth) depth = depthy + 1;
+ }
+ result_len = lenx + LEN(y);
+ {
+ struct Concatenation * result = GC_NEW(struct Concatenation);
+
+ if (NULL == result) OUT_OF_MEMORY;
+ result->header = CONCAT_HDR;
+ result->depth = (char)depth;
+ if (lenx <= MAX_LEFT_LEN)
+ result->left_len = (unsigned char)lenx;
+ result->len = (word)result_len;
+ result->left = x;
+ GC_PTR_STORE_AND_DIRTY((void *)&result->right, y);
+ GC_reachable_here(x);
+ if (depth >= MAX_DEPTH) {
+ return(CORD_balance((CORD)result));
+ } else {
+ return((CORD) result);
+ }
+ }
+}
+
+
+static CordRep *CORD_from_fn_inner(CORD_fn fn, void * client_data, size_t len)
+{
+ if (len == 0) return(0);
+ if (len <= SHORT_LIMIT) {
+ char * result;
+ size_t i;
+ char buf[SHORT_LIMIT+1];
+
+ for (i = 0; i < len; i++) {
+ char c = (*fn)(i, client_data);
+
+ if (c == '\0') goto gen_case;
+ buf[i] = c;
+ }
+
+ result = (char *)GC_MALLOC_ATOMIC(len + 1);
+ if (result == 0) OUT_OF_MEMORY;
+ memcpy(result, buf, len);
+ result[len] = '\0';
+ return (CordRep *)result;
+ }
+ gen_case:
+ {
+ struct Function * result = GC_NEW(struct Function);
+
+ if (NULL == result) OUT_OF_MEMORY;
+ result->header = FN_HDR;
+ /* depth is already 0 */
+ result->len = (word)len;
+ result->fn = fn;
+ GC_PTR_STORE_AND_DIRTY(&result->client_data, client_data);
+ return (CordRep *)result;
+ }
+}
+
+CORD CORD_from_fn(CORD_fn fn, void * client_data, size_t len)
+{
+ return (/* const */ CORD) CORD_from_fn_inner(fn, client_data, len);
+}
+
+size_t CORD_len(CORD x)
+{
+ if (x == 0) {
+ return(0);
+ } else {
+ return(GEN_LEN(x));
+ }
+}
+
+struct substr_args {
+ CordRep * sa_cord;
+ size_t sa_index;
+};
+
+char CORD_index_access_fn(size_t i, void * client_data)
+{
+ struct substr_args *descr = (struct substr_args *)client_data;
+
+ return(((char *)(descr->sa_cord))[i + descr->sa_index]);
+}
+
+char CORD_apply_access_fn(size_t i, void * client_data)
+{
+ struct substr_args *descr = (struct substr_args *)client_data;
+ struct Function * fn_cord = &(descr->sa_cord->function);
+
+ return((*(fn_cord->fn))(i + descr->sa_index, fn_cord->client_data));
+}
+
+/* A version of CORD_substr that simply returns a function node, thus */
+/* postponing its work. The fourth argument is a function that may */
+/* be used for efficient access to the ith character. */
+/* Assumes i >= 0 and i + n < length(x). */
+CORD CORD_substr_closure(CORD x, size_t i, size_t n, CORD_fn f)
+{
+ struct substr_args * sa = GC_NEW(struct substr_args);
+ CordRep * result;
+
+ if (sa == 0) OUT_OF_MEMORY;
+ sa->sa_index = i;
+ GC_PTR_STORE_AND_DIRTY(&sa->sa_cord, x);
+ result = CORD_from_fn_inner(f, (void *)sa, n);
+ if ((CORD)result != CORD_EMPTY && 0 == result -> function.null)
+ result -> function.header = SUBSTR_HDR;
+ return (CORD)result;
+}
+
+# define SUBSTR_LIMIT (10 * SHORT_LIMIT)
+ /* Substrings of function nodes and flat strings shorter than */
+ /* this are flat strings. Othewise we use a functional */
+ /* representation, which is significantly slower to access. */
+
+/* A version of CORD_substr that assumes i >= 0, n > 0, and i + n < length(x).*/
+CORD CORD_substr_checked(CORD x, size_t i, size_t n)
+{
+ if (CORD_IS_STRING(x)) {
+ if (n > SUBSTR_LIMIT) {
+ return(CORD_substr_closure(x, i, n, CORD_index_access_fn));
+ } else {
+ char * result = (char *)GC_MALLOC_ATOMIC(n + 1);
+
+ if (result == 0) OUT_OF_MEMORY;
+ strncpy(result, x+i, n);
+ result[n] = '\0';
+ return(result);
+ }
+ } else if (IS_CONCATENATION(x)) {
+ struct Concatenation * conc = &(((CordRep *)x) -> concatenation);
+ size_t left_len = LEFT_LEN(conc);
+ size_t right_len = conc -> len - left_len;
+
+ if (i >= left_len) {
+ if (n == right_len) return(conc -> right);
+ return(CORD_substr_checked(conc -> right, i - left_len, n));
+ } else if (i+n <= left_len) {
+ if (n == left_len) return(conc -> left);
+ return(CORD_substr_checked(conc -> left, i, n));
+ } else {
+ /* Need at least one character from each side. */
+ CORD left_part;
+ CORD right_part;
+ size_t left_part_len = left_len - i;
+
+ if (i == 0) {
+ left_part = conc -> left;
+ } else {
+ left_part = CORD_substr_checked(conc -> left, i, left_part_len);
+ }
+ if (i + n == right_len + left_len) {
+ right_part = conc -> right;
+ } else {
+ right_part = CORD_substr_checked(conc -> right, 0,
+ n - left_part_len);
+ }
+ return(CORD_cat(left_part, right_part));
+ }
+ } else /* function */ {
+ if (n > SUBSTR_LIMIT) {
+ if (IS_SUBSTR(x)) {
+ /* Avoid nesting substring nodes. */
+ struct Function * f = &(((CordRep *)x) -> function);
+ struct substr_args *descr =
+ (struct substr_args *)(f -> client_data);
+
+ return(CORD_substr_closure((CORD)descr->sa_cord,
+ i + descr->sa_index,
+ n, f -> fn));
+ } else {
+ return(CORD_substr_closure(x, i, n, CORD_apply_access_fn));
+ }
+ } else {
+ char * result;
+ struct Function * f = &(((CordRep *)x) -> function);
+ char buf[SUBSTR_LIMIT+1];
+ char * p = buf;
+ size_t j;
+ size_t lim = i + n;
+
+ for (j = i; j < lim; j++) {
+ char c = (*(f -> fn))(j, f -> client_data);
+
+ if (c == '\0') {
+ return(CORD_substr_closure(x, i, n, CORD_apply_access_fn));
+ }
+ *p++ = c;
+ }
+ result = (char *)GC_MALLOC_ATOMIC(n + 1);
+ if (result == 0) OUT_OF_MEMORY;
+ memcpy(result, buf, n);
+ result[n] = '\0';
+ return(result);
+ }
+ }
+}
+
+CORD CORD_substr(CORD x, size_t i, size_t n)
+{
+ size_t len = CORD_len(x);
+
+ if (i >= len || n == 0) return(0);
+ if (i + n > len) n = len - i;
+ return(CORD_substr_checked(x, i, n));
+}
+
+/* See cord.h for definition. We assume i is in range. */
+int CORD_iter5(CORD x, size_t i, CORD_iter_fn f1,
+ CORD_batched_iter_fn f2, void * client_data)
+{
+ if (x == 0) return(0);
+ if (CORD_IS_STRING(x)) {
+ const char *p = x+i;
+
+ if (*p == '\0') ABORT("2nd arg to CORD_iter5 too big");
+ if (f2 != CORD_NO_FN) {
+ return((*f2)(p, client_data));
+ } else {
+ while (*p) {
+ if ((*f1)(*p, client_data)) return(1);
+ p++;
+ }
+ return(0);
+ }
+ } else if (IS_CONCATENATION(x)) {
+ struct Concatenation * conc = &(((CordRep *)x) -> concatenation);
+
+ if (i > 0) {
+ size_t left_len = LEFT_LEN(conc);
+
+ if (i >= left_len) {
+ return(CORD_iter5(conc -> right, i - left_len, f1, f2,
+ client_data));
+ }
+ }
+ if (CORD_iter5(conc -> left, i, f1, f2, client_data)) {
+ return(1);
+ }
+ return(CORD_iter5(conc -> right, 0, f1, f2, client_data));
+ } else /* function */ {
+ struct Function * f = &(((CordRep *)x) -> function);
+ size_t j;
+ size_t lim = f -> len;
+
+ for (j = i; j < lim; j++) {
+ if ((*f1)((*(f -> fn))(j, f -> client_data), client_data)) {
+ return(1);
+ }
+ }
+ return(0);
+ }
+}
+
+#undef CORD_iter
+int CORD_iter(CORD x, CORD_iter_fn f1, void * client_data)
+{
+ return(CORD_iter5(x, 0, f1, CORD_NO_FN, client_data));
+}
+
+int CORD_riter4(CORD x, size_t i, CORD_iter_fn f1, void * client_data)
+{
+ if (x == 0) return(0);
+ if (CORD_IS_STRING(x)) {
+ const char *p = x + i;
+
+ for(;;) {
+ char c = *p;
+
+ if (c == '\0') ABORT("2nd arg to CORD_riter4 too big");
+ if ((*f1)(c, client_data)) return(1);
+ if (p == x) break;
+ p--;
+ }
+ return(0);
+ } else if (IS_CONCATENATION(x)) {
+ struct Concatenation * conc = &(((CordRep *)x) -> concatenation);
+ CORD left_part = conc -> left;
+ size_t left_len = LEFT_LEN(conc);
+
+ if (i >= left_len) {
+ if (CORD_riter4(conc -> right, i - left_len, f1, client_data)) {
+ return(1);
+ }
+ return(CORD_riter4(left_part, left_len - 1, f1, client_data));
+ } else {
+ return(CORD_riter4(left_part, i, f1, client_data));
+ }
+ } else /* function */ {
+ struct Function * f = &(((CordRep *)x) -> function);
+ size_t j;
+
+ for (j = i; ; j--) {
+ if ((*f1)((*(f -> fn))(j, f -> client_data), client_data)) {
+ return(1);
+ }
+ if (j == 0) return(0);
+ }
+ }
+}
+
+int CORD_riter(CORD x, CORD_iter_fn f1, void * client_data)
+{
+ size_t len = CORD_len(x);
+ if (len == 0) return(0);
+ return(CORD_riter4(x, len - 1, f1, client_data));
+}
+
+/*
+ * The following functions are concerned with balancing cords.
+ * Strategy:
+ * Scan the cord from left to right, keeping the cord scanned so far
+ * as a forest of balanced trees of exponentially decreasing length.
+ * When a new subtree needs to be added to the forest, we concatenate all
+ * shorter ones to the new tree in the appropriate order, and then insert
+ * the result into the forest.
+ * Crucial invariants:
+ * 1. The concatenation of the forest (in decreasing order) with the
+ * unscanned part of the rope is equal to the rope being balanced.
+ * 2. All trees in the forest are balanced.
+ * 3. forest[i] has depth at most i.
+ */
+
+typedef struct {
+ CORD c;
+ size_t len; /* Actual length of c */
+} ForestElement;
+
+static size_t min_len [ MAX_DEPTH ];
+
+static int min_len_init = 0;
+
+int CORD_max_len;
+
+typedef ForestElement Forest [ MAX_DEPTH ];
+ /* forest[i].len >= fib(i+1) */
+ /* The string is the concatenation */
+ /* of the forest in order of DECREASING */
+ /* indices. */
+
+void CORD_init_min_len(void)
+{
+ int i;
+ size_t last, previous;
+
+ min_len[0] = previous = 1;
+ min_len[1] = last = 2;
+ for (i = 2; i < MAX_DEPTH; i++) {
+ size_t current = last + previous;
+
+ if (current < last) /* overflow */ current = last;
+ min_len[i] = current;
+ previous = last;
+ last = current;
+ }
+ CORD_max_len = (int)last - 1;
+ min_len_init = 1;
+}
+
+
+void CORD_init_forest(ForestElement * forest, size_t max_len)
+{
+ int i;
+
+ for (i = 0; i < MAX_DEPTH; i++) {
+ forest[i].c = 0;
+ if (min_len[i] > max_len) return;
+ }
+ ABORT("Cord too long");
+}
+
+/* Add a leaf to the appropriate level in the forest, cleaning */
+/* out lower levels as necessary. */
+/* Also works if x is a balanced tree of concatenations; however */
+/* in this case an extra concatenation node may be inserted above x; */
+/* This node should not be counted in the statement of the invariants. */
+void CORD_add_forest(ForestElement * forest, CORD x, size_t len)
+{
+ int i = 0;
+ CORD sum = CORD_EMPTY;
+ size_t sum_len = 0;
+
+ while (len > min_len[i + 1]) {
+ if (forest[i].c != 0) {
+ sum = CORD_cat(forest[i].c, sum);
+ sum_len += forest[i].len;
+ forest[i].c = 0;
+ }
+ i++;
+ }
+ /* Sum has depth at most 1 greter than what would be required */
+ /* for balance. */
+ sum = CORD_cat(sum, x);
+ sum_len += len;
+ /* If x was a leaf, then sum is now balanced. To see this */
+ /* consider the two cases in which forest[i-1] either is or is */
+ /* not empty. */
+ while (sum_len >= min_len[i]) {
+ if (forest[i].c != 0) {
+ sum = CORD_cat(forest[i].c, sum);
+ sum_len += forest[i].len;
+ /* This is again balanced, since sum was balanced, and has */
+ /* allowable depth that differs from i by at most 1. */
+ forest[i].c = 0;
+ }
+ i++;
+ }
+ i--;
+ forest[i].c = sum;
+ forest[i].len = sum_len;
+}
+
+CORD CORD_concat_forest(ForestElement * forest, size_t expected_len)
+{
+ int i = 0;
+ CORD sum = 0;
+ size_t sum_len = 0;
+
+ while (sum_len != expected_len) {
+ if (forest[i].c != 0) {
+ sum = CORD_cat(forest[i].c, sum);
+ sum_len += forest[i].len;
+ }
+ i++;
+ }
+ return(sum);
+}
+
+/* Insert the frontier of x into forest. Balanced subtrees are */
+/* treated as leaves. This potentially adds one to the depth */
+/* of the final tree. */
+void CORD_balance_insert(CORD x, size_t len, ForestElement * forest)
+{
+ int depth;
+
+ if (CORD_IS_STRING(x)) {
+ CORD_add_forest(forest, x, len);
+ } else if (IS_CONCATENATION(x)
+ && ((depth = DEPTH(x)) >= MAX_DEPTH
+ || len < min_len[depth])) {
+ struct Concatenation * conc = &(((CordRep *)x) -> concatenation);
+ size_t left_len = LEFT_LEN(conc);
+
+ CORD_balance_insert(conc -> left, left_len, forest);
+ CORD_balance_insert(conc -> right, len - left_len, forest);
+ } else /* function or balanced */ {
+ CORD_add_forest(forest, x, len);
+ }
+}
+
+
+CORD CORD_balance(CORD x)
+{
+ Forest forest;
+ size_t len;
+
+ if (x == 0) return(0);
+ if (CORD_IS_STRING(x)) return(x);
+ if (!min_len_init) CORD_init_min_len();
+ len = LEN(x);
+ CORD_init_forest(forest, len);
+ CORD_balance_insert(x, len, forest);
+ return(CORD_concat_forest(forest, len));
+}
+
+
+/* Position primitives */
+
+/* Private routines to deal with the hard cases only: */
+
+/* P contains a prefix of the path to cur_pos. Extend it to a full */
+/* path and set up leaf info. */
+/* Return 0 if past the end of cord, 1 o.w. */
+void CORD__extend_path(CORD_pos p)
+{
+ struct CORD_pe * current_pe = &(p[0].path[p[0].path_len]);
+ CORD top = current_pe -> pe_cord;
+ size_t pos = p[0].cur_pos;
+ size_t top_pos = current_pe -> pe_start_pos;
+ size_t top_len = GEN_LEN(top);
+
+ /* Fill in the rest of the path. */
+ while(!CORD_IS_STRING(top) && IS_CONCATENATION(top)) {
+ struct Concatenation * conc = &(((CordRep *)top) -> concatenation);
+ size_t left_len;
+
+ left_len = LEFT_LEN(conc);
+ current_pe++;
+ if (pos >= top_pos + left_len) {
+ current_pe -> pe_cord = top = conc -> right;
+ current_pe -> pe_start_pos = top_pos = top_pos + left_len;
+ top_len -= left_len;
+ } else {
+ current_pe -> pe_cord = top = conc -> left;
+ current_pe -> pe_start_pos = top_pos;
+ top_len = left_len;
+ }
+ p[0].path_len++;
+ }
+ /* Fill in leaf description for fast access. */
+ if (CORD_IS_STRING(top)) {
+ p[0].cur_leaf = top;
+ p[0].cur_start = top_pos;
+ p[0].cur_end = top_pos + top_len;
+ } else {
+ p[0].cur_end = 0;
+ }
+ if (pos >= top_pos + top_len) p[0].path_len = CORD_POS_INVALID;
+}
+
+char CORD__pos_fetch(CORD_pos p)
+{
+ /* Leaf is a function node */
+ struct CORD_pe * pe;
+ CORD leaf;
+ struct Function * f;
+
+ if (!CORD_pos_valid(p))
+ ABORT("CORD_pos_fetch: invalid argument");
+ pe = &p[0].path[p[0].path_len];
+ leaf = pe -> pe_cord;
+ if (!IS_FUNCTION(leaf))
+ ABORT("CORD_pos_fetch: bad leaf");
+ f = &((CordRep *)leaf)->function;
+ return ((*(f -> fn))(p[0].cur_pos - pe -> pe_start_pos, f -> client_data));
+}
+
+void CORD__next(CORD_pos p)
+{
+ size_t cur_pos = p[0].cur_pos + 1;
+ struct CORD_pe * current_pe;
+ CORD leaf;
+
+ if (!CORD_pos_valid(p))
+ ABORT("CORD_next: invalid argument");
+ current_pe = &p[0].path[p[0].path_len];
+ leaf = current_pe -> pe_cord;
+
+ /* Leaf is not a string or we're at end of leaf */
+ p[0].cur_pos = cur_pos;
+ if (!CORD_IS_STRING(leaf)) {
+ /* Function leaf */
+ struct Function * f = &(((CordRep *)leaf) -> function);
+ size_t start_pos = current_pe -> pe_start_pos;
+ size_t end_pos = start_pos + f -> len;
+
+ if (cur_pos < end_pos) {
+ /* Fill cache and return. */
+ size_t i;
+ size_t limit = FUNCTION_BUF_SZ;
+ CORD_fn fn = f -> fn;
+ void * client_data = f -> client_data;
+
+ if (end_pos - cur_pos < FUNCTION_BUF_SZ) {
+ limit = end_pos - cur_pos;
+ }
+ for (i = 0; i < limit; i++) {
+ p[0].function_buf[i] = (*fn)(i + cur_pos - start_pos,
+ client_data);
+ }
+ p[0].cur_start = cur_pos;
+ p[0].cur_leaf = p[0].function_buf;
+ p[0].cur_end = cur_pos + limit;
+ return;
+ }
+ }
+ /* End of leaf */
+ /* Pop the stack until we find two concatenation nodes with the */
+ /* same start position: this implies we were in left part. */
+ {
+ while (p[0].path_len > 0
+ && current_pe[0].pe_start_pos != current_pe[-1].pe_start_pos) {
+ p[0].path_len--;
+ current_pe--;
+ }
+ if (p[0].path_len == 0) {
+ p[0].path_len = CORD_POS_INVALID;
+ return;
+ }
+ }
+ p[0].path_len--;
+ CORD__extend_path(p);
+}
+
+void CORD__prev(CORD_pos p)
+{
+ struct CORD_pe * pe = &(p[0].path[p[0].path_len]);
+
+ if (p[0].cur_pos == 0) {
+ p[0].path_len = CORD_POS_INVALID;
+ return;
+ }
+ p[0].cur_pos--;
+ if (p[0].cur_pos >= pe -> pe_start_pos) return;
+
+ /* Beginning of leaf */
+
+ /* Pop the stack until we find two concatenation nodes with the */
+ /* different start position: this implies we were in right part. */
+ {
+ struct CORD_pe * current_pe = &((p)[0].path[(p)[0].path_len]);
+
+ while (p[0].path_len > 0
+ && current_pe[0].pe_start_pos == current_pe[-1].pe_start_pos) {
+ p[0].path_len--;
+ current_pe--;
+ }
+ }
+ p[0].path_len--;
+ CORD__extend_path(p);
+}
+
+#undef CORD_pos_fetch
+#undef CORD_next
+#undef CORD_prev
+#undef CORD_pos_to_index
+#undef CORD_pos_to_cord
+#undef CORD_pos_valid
+
+char CORD_pos_fetch(CORD_pos p)
+{
+ if (p[0].cur_end != 0) {
+ return(p[0].cur_leaf[p[0].cur_pos - p[0].cur_start]);
+ } else {
+ return(CORD__pos_fetch(p));
+ }
+}
+
+void CORD_next(CORD_pos p)
+{
+ if (p[0].cur_pos + 1 < p[0].cur_end) {
+ p[0].cur_pos++;
+ } else {
+ CORD__next(p);
+ }
+}
+
+void CORD_prev(CORD_pos p)
+{
+ if (p[0].cur_end != 0 && p[0].cur_pos > p[0].cur_start) {
+ p[0].cur_pos--;
+ } else {
+ CORD__prev(p);
+ }
+}
+
+size_t CORD_pos_to_index(CORD_pos p)
+{
+ return(p[0].cur_pos);
+}
+
+CORD CORD_pos_to_cord(CORD_pos p)
+{
+ return(p[0].path[0].pe_cord);
+}
+
+int CORD_pos_valid(CORD_pos p)
+{
+ return(p[0].path_len != CORD_POS_INVALID);
+}
+
+void CORD_set_pos(CORD_pos p, CORD x, size_t i)
+{
+ if (x == CORD_EMPTY) {
+ p[0].path_len = CORD_POS_INVALID;
+ return;
+ }
+ p[0].path[0].pe_cord = x;
+ p[0].path[0].pe_start_pos = 0;
+ p[0].path_len = 0;
+ p[0].cur_pos = i;
+ CORD__extend_path(p);
+}
diff --git a/graphics/asymptote/gc/cord/cordprnt.c b/graphics/asymptote/gc/cord/cordprnt.c
new file mode 100644
index 0000000000..048b972d41
--- /dev/null
+++ b/graphics/asymptote/gc/cord/cordprnt.c
@@ -0,0 +1,455 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* An sprintf implementation that understands cords. This is probably */
+/* not terribly portable. It assumes an ANSI stdarg.h. It further */
+/* assumes that I can make copies of va_list variables, and read */
+/* arguments repeatedly by applying va_arg to the copies. This */
+/* could be avoided at some performance cost. */
+/* We also assume that unsigned and signed integers of various kinds */
+/* have the same sizes, and can be cast back and forth. */
+/* We assume that void * and char * have the same size. */
+/* All this cruft is needed because we want to rely on the underlying */
+/* sprintf implementation whenever possible. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#ifndef CORD_BUILD
+# define CORD_BUILD
+#endif
+
+#include "cord.h"
+#include "ec.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gc.h"
+
+#define CONV_SPEC_LEN 50 /* Maximum length of a single */
+ /* conversion specification. */
+#define CONV_RESULT_LEN 50 /* Maximum length of any */
+ /* conversion with default */
+ /* width and prec. */
+#if defined(CPPCHECK)
+# define MACRO_BLKSTMT_BEGIN {
+# define MACRO_BLKSTMT_END }
+#else
+# define MACRO_BLKSTMT_BEGIN do {
+# define MACRO_BLKSTMT_END } while (0)
+#endif
+
+#define OUT_OF_MEMORY MACRO_BLKSTMT_BEGIN \
+ if (CORD_oom_fn != 0) (*CORD_oom_fn)(); \
+ fprintf(stderr, "Out of memory\n"); \
+ abort(); \
+ MACRO_BLKSTMT_END
+
+static int ec_len(CORD_ec x)
+{
+ return (int)(CORD_len(x[0].ec_cord) + (x[0].ec_bufptr - x[0].ec_buf));
+}
+
+/* Possible non-numeric precision values. */
+# define NONE -1
+# define VARIABLE -2
+/* Copy the conversion specification from CORD_pos into the buffer buf */
+/* Return negative on error. */
+/* Source initially points one past the leading %. */
+/* It is left pointing at the conversion type. */
+/* Assign field width and precision to *width and *prec. */
+/* If width or prec is *, VARIABLE is assigned. */
+/* Set *left to 1 if left adjustment flag is present. */
+/* Set *long_arg to 1 if long flag ('l' or 'L') is present, or to */
+/* -1 if 'h' is present, or to 2 if 'z' is present. */
+static int extract_conv_spec(CORD_pos source, char *buf,
+ int * width, int *prec, int *left, int * long_arg)
+{
+ int result = 0;
+ int current_number = 0;
+ int saw_period = 0;
+ int saw_number = 0;
+ int chars_so_far = 0;
+ char current;
+
+ *width = NONE;
+ buf[chars_so_far++] = '%';
+ while(CORD_pos_valid(source)) {
+ if (chars_so_far >= CONV_SPEC_LEN) return(-1);
+ current = CORD_pos_fetch(source);
+ buf[chars_so_far++] = current;
+ switch(current) {
+ case '*':
+ saw_number = 1;
+ current_number = VARIABLE;
+ break;
+ case '0':
+ if (!saw_number) {
+ /* Zero fill flag; ignore */
+ break;
+ }
+ current_number *= 10;
+ break;
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ saw_number = 1;
+ current_number *= 10;
+ current_number += current - '0';
+ break;
+ case '.':
+ saw_period = 1;
+ if(saw_number) {
+ *width = current_number;
+ saw_number = 0;
+ }
+ current_number = 0;
+ break;
+ case 'l':
+ case 'L':
+ *long_arg = 1;
+ current_number = 0;
+ break;
+ case 'z':
+ *long_arg = 2;
+ current_number = 0;
+ break;
+ case 'h':
+ *long_arg = -1;
+ current_number = 0;
+ break;
+ case ' ':
+ case '+':
+ case '#':
+ current_number = 0;
+ break;
+ case '-':
+ *left = 1;
+ current_number = 0;
+ break;
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'u':
+ case 'x':
+ case 'X':
+ case 'f':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ case 'c':
+ case 'C':
+ case 's':
+ case 'S':
+ case 'p':
+ case 'n':
+ case 'r':
+ goto done;
+ default:
+ return(-1);
+ }
+ CORD_next(source);
+ }
+ return(-1);
+ done:
+ if (saw_number) {
+ if (saw_period) {
+ *prec = current_number;
+ } else {
+ *prec = NONE;
+ *width = current_number;
+ }
+ } else {
+ *prec = NONE;
+ }
+ buf[chars_so_far] = '\0';
+ return(result);
+}
+
+#if defined(__DJGPP__) || defined(__STRICT_ANSI__)
+ /* vsnprintf is missing in DJGPP (v2.0.3) */
+# define GC_VSNPRINTF(buf, bufsz, format, args) vsprintf(buf, format, args)
+#elif defined(_MSC_VER)
+# if defined(_WIN32_WCE)
+ /* _vsnprintf is deprecated in WinCE */
+# define GC_VSNPRINTF StringCchVPrintfA
+# else
+# define GC_VSNPRINTF _vsnprintf
+# endif
+#else
+# define GC_VSNPRINTF vsnprintf
+#endif
+
+int CORD_vsprintf(CORD * out, CORD format, va_list args)
+{
+ CORD_ec result;
+ int count;
+ char current;
+ CORD_pos pos;
+ char conv_spec[CONV_SPEC_LEN + 1];
+
+ CORD_ec_init(result);
+ for (CORD_set_pos(pos, format, 0); CORD_pos_valid(pos); CORD_next(pos)) {
+ current = CORD_pos_fetch(pos);
+ if (current == '%') {
+ CORD_next(pos);
+ if (!CORD_pos_valid(pos)) return(-1);
+ current = CORD_pos_fetch(pos);
+ if (current == '%') {
+ CORD_ec_append(result, current);
+ } else {
+ int width, prec;
+ int left_adj = 0;
+ int long_arg = 0;
+ CORD arg;
+ size_t len;
+
+ if (extract_conv_spec(pos, conv_spec,
+ &width, &prec,
+ &left_adj, &long_arg) < 0) {
+ return(-1);
+ }
+ current = CORD_pos_fetch(pos);
+ switch(current) {
+ case 'n':
+ /* Assign length to next arg */
+ if (long_arg == 0) {
+ int * pos_ptr;
+ pos_ptr = va_arg(args, int *);
+ *pos_ptr = ec_len(result);
+ } else if (long_arg == 2) {
+ size_t * pos_ptr = va_arg(args, size_t *);
+ *pos_ptr = (size_t)(unsigned)ec_len(result);
+ } else if (long_arg > 0) {
+ long * pos_ptr;
+ pos_ptr = va_arg(args, long *);
+ *pos_ptr = ec_len(result);
+ } else {
+ short * pos_ptr;
+ pos_ptr = va_arg(args, short *);
+ *pos_ptr = (short)ec_len(result);
+ }
+ goto done;
+ case 'r':
+ /* Append cord and any padding */
+ if (width == VARIABLE) width = va_arg(args, int);
+ if (prec == VARIABLE) prec = va_arg(args, int);
+ arg = va_arg(args, CORD);
+ len = CORD_len(arg);
+ if (prec != NONE && len > (unsigned)prec) {
+ if (prec < 0) return(-1);
+ arg = CORD_substr(arg, 0, (unsigned)prec);
+ len = (unsigned)prec;
+ }
+ if (width != NONE && len < (unsigned)width) {
+ char * blanks = (char *)GC_MALLOC_ATOMIC(
+ (unsigned)width - len + 1);
+
+ if (NULL == blanks) OUT_OF_MEMORY;
+ memset(blanks, ' ', (unsigned)width - len);
+ blanks[(unsigned)width - len] = '\0';
+ if (left_adj) {
+ arg = CORD_cat(arg, blanks);
+ } else {
+ arg = CORD_cat(blanks, arg);
+ }
+ }
+ CORD_ec_append_cord(result, arg);
+ goto done;
+ case 'c':
+ if (width == NONE && prec == NONE) {
+ char c;
+
+ c = (char)va_arg(args, int);
+ CORD_ec_append(result, c);
+ goto done;
+ }
+ break;
+ case 's':
+ if (width == NONE && prec == NONE) {
+ char * str = va_arg(args, char *);
+ char c;
+
+ while ((c = *str++) != '\0') {
+ CORD_ec_append(result, c);
+ }
+ goto done;
+ }
+ break;
+ default:
+ break;
+ }
+ /* Use standard sprintf to perform conversion */
+ {
+ char * buf;
+ va_list vsprintf_args;
+ int max_size = 0;
+ int res = 0;
+
+# if defined(CPPCHECK)
+ va_copy(vsprintf_args, args);
+# elif defined(__va_copy)
+ __va_copy(vsprintf_args, args);
+# elif defined(__GNUC__) && !defined(__DJGPP__) \
+ && !defined(__EMX__) /* and probably in other cases */
+ va_copy(vsprintf_args, args);
+# else
+ vsprintf_args = args;
+# endif
+ if (width == VARIABLE) width = va_arg(args, int);
+ if (prec == VARIABLE) prec = va_arg(args, int);
+ if (width != NONE) max_size = width;
+ if (prec != NONE && prec > max_size) max_size = prec;
+ max_size += CONV_RESULT_LEN;
+ if (max_size >= CORD_BUFSZ) {
+ buf = (char *)GC_MALLOC_ATOMIC((unsigned)max_size + 1);
+ if (NULL == buf) OUT_OF_MEMORY;
+ } else {
+ if (CORD_BUFSZ - (result[0].ec_bufptr-result[0].ec_buf)
+ < max_size) {
+ CORD_ec_flush_buf(result);
+ }
+ buf = result[0].ec_bufptr;
+ }
+ switch(current) {
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'u':
+ case 'x':
+ case 'X':
+ case 'c':
+ if (long_arg <= 0) {
+ (void) va_arg(args, int);
+ } else if (long_arg == 2) {
+ (void) va_arg(args, size_t);
+ } else /* long_arg == 1 */ {
+ (void) va_arg(args, long);
+ }
+ break;
+ case 's':
+ case 'p':
+ (void) va_arg(args, char *);
+ break;
+ case 'f':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ (void) va_arg(args, double);
+ break;
+ default:
+ res = -1;
+ }
+ if (0 == res)
+ res = GC_VSNPRINTF(buf, max_size + 1, conv_spec,
+ vsprintf_args);
+# if defined(CPPCHECK) || defined(__va_copy) \
+ || (defined(__GNUC__) && !defined(__DJGPP__) \
+ && !defined(__EMX__))
+ va_end(vsprintf_args);
+# endif
+ len = (unsigned)res;
+ if ((char *)(GC_word)res == buf) {
+ /* old style vsprintf */
+ len = strlen(buf);
+ } else if (res < 0) {
+ return(-1);
+ }
+ if (buf != result[0].ec_bufptr) {
+ char c;
+
+ while ((c = *buf++) != '\0') {
+ CORD_ec_append(result, c);
+ }
+ } else {
+ result[0].ec_bufptr = buf + len;
+ }
+ }
+ done:;
+ }
+ } else {
+ CORD_ec_append(result, current);
+ }
+ }
+ count = ec_len(result);
+ *out = CORD_balance(CORD_ec_to_cord(result));
+ return(count);
+}
+
+int CORD_sprintf(CORD * out, CORD format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start(args, format);
+ result = CORD_vsprintf(out, format, args);
+ va_end(args);
+ return(result);
+}
+
+int CORD_fprintf(FILE * f, CORD format, ...)
+{
+ va_list args;
+ int result;
+ CORD out = CORD_EMPTY; /* initialized to prevent compiler warning */
+
+ va_start(args, format);
+ result = CORD_vsprintf(&out, format, args);
+ va_end(args);
+ if (result > 0) CORD_put(out, f);
+ return(result);
+}
+
+int CORD_vfprintf(FILE * f, CORD format, va_list args)
+{
+ int result;
+ CORD out = CORD_EMPTY;
+
+ result = CORD_vsprintf(&out, format, args);
+ if (result > 0) CORD_put(out, f);
+ return(result);
+}
+
+int CORD_printf(CORD format, ...)
+{
+ va_list args;
+ int result;
+ CORD out = CORD_EMPTY;
+
+ va_start(args, format);
+ result = CORD_vsprintf(&out, format, args);
+ va_end(args);
+ if (result > 0) CORD_put(out, stdout);
+ return(result);
+}
+
+int CORD_vprintf(CORD format, va_list args)
+{
+ int result;
+ CORD out = CORD_EMPTY;
+
+ result = CORD_vsprintf(&out, format, args);
+ if (result > 0) CORD_put(out, stdout);
+ return(result);
+}
diff --git a/graphics/asymptote/gc/cord/cordxtra.c b/graphics/asymptote/gc/cord/cordxtra.c
new file mode 100644
index 0000000000..3cdc4efea4
--- /dev/null
+++ b/graphics/asymptote/gc/cord/cordxtra.c
@@ -0,0 +1,664 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * These are functions on cords that do not need to understand their
+ * implementation. They serve also serve as example client code for
+ * cord_basics.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#ifndef CORD_BUILD
+# define CORD_BUILD
+#endif
+
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+# include <stdarg.h>
+
+# include "cord.h"
+# include "ec.h"
+
+# define I_HIDE_POINTERS /* So we get access to allocation lock. */
+ /* We use this for lazy file reading, */
+ /* so that we remain independent */
+ /* of the threads primitives. */
+# include "gc.h"
+
+/* If available, use GCC built-in atomic load-acquire and store-release */
+/* primitives to access the cache lines safely. Otherwise, fall back */
+/* to using the GC allocation lock even during the cache lines reading. */
+/* Note: for simplicity of libcord building, do not rely on GC_THREADS */
+/* macro, libatomic_ops package presence and private/gc_atomic_ops.h. */
+#if !defined(AO_DISABLE_GCC_ATOMICS) \
+ && ((defined(__clang__) && __clang_major__ >= 8) /* clang 8.0+ */ \
+ || (defined(__GNUC__) /* gcc 5.4+ */ \
+ && (__GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 4))))
+# define CORD_USE_GCC_ATOMIC
+#endif
+
+/* The standard says these are in stdio.h, but they aren't always: */
+# ifndef SEEK_SET
+# define SEEK_SET 0
+# endif
+# ifndef SEEK_END
+# define SEEK_END 2
+# endif
+
+# define BUFSZ 2048 /* Size of stack allocated buffers when */
+ /* we want large buffers. */
+
+typedef void (* oom_fn)(void);
+
+# define OUT_OF_MEMORY { if (CORD_oom_fn != (oom_fn) 0) (*CORD_oom_fn)(); \
+ ABORT("Out of memory"); }
+# define ABORT(msg) { fprintf(stderr, "%s\n", msg); abort(); }
+
+#if GC_GNUC_PREREQ(3, 4) || defined(__clang__)
+# define CORD_ATTR_UNUSED __attribute__((__unused__))
+#else
+# define CORD_ATTR_UNUSED /* empty */
+#endif
+
+CORD CORD_cat_char(CORD x, char c)
+{
+ char * string;
+
+ if (c == '\0') return(CORD_cat(x, CORD_nul(1)));
+ string = (char *)GC_MALLOC_ATOMIC(2);
+ if (string == 0) OUT_OF_MEMORY;
+ string[0] = c;
+ string[1] = '\0';
+ return(CORD_cat_char_star(x, string, 1));
+}
+
+CORD CORD_catn(int nargs, ...)
+{
+ CORD result = CORD_EMPTY;
+ va_list args;
+ int i;
+
+ va_start(args, nargs);
+ for (i = 0; i < nargs; i++) {
+ CORD next = va_arg(args, CORD);
+ result = CORD_cat(result, next);
+ }
+ va_end(args);
+ return(result);
+}
+
+typedef struct {
+ size_t len;
+ size_t count;
+ char * buf;
+} CORD_fill_data;
+
+int CORD_fill_proc(char c, void * client_data)
+{
+ CORD_fill_data * d = (CORD_fill_data *)client_data;
+ size_t count = d -> count;
+
+ (d -> buf)[count] = c;
+ d -> count = ++count;
+ if (count >= d -> len) {
+ return(1);
+ } else {
+ return(0);
+ }
+}
+
+int CORD_batched_fill_proc(const char * s, void * client_data)
+{
+ CORD_fill_data * d = (CORD_fill_data *)client_data;
+ size_t count = d -> count;
+ size_t max = d -> len;
+ char * buf = d -> buf;
+ const char * t = s;
+
+ while((buf[count] = *t++) != '\0') {
+ count++;
+ if (count >= max) {
+ d -> count = count;
+ return(1);
+ }
+ }
+ d -> count = count;
+ return(0);
+}
+
+/* Fill buf with len characters starting at i. */
+/* Assumes len characters are available in buf. */
+/* Return 1 if buf is filled fully (and len is */
+/* non-zero), 0 otherwise. */
+int CORD_fill_buf(CORD x, size_t i, size_t len, char * buf)
+{
+ CORD_fill_data fd;
+
+ fd.len = len;
+ fd.buf = buf;
+ fd.count = 0;
+ return CORD_iter5(x, i, CORD_fill_proc, CORD_batched_fill_proc, &fd);
+}
+
+int CORD_cmp(CORD x, CORD y)
+{
+ CORD_pos xpos;
+ CORD_pos ypos;
+
+ if (y == CORD_EMPTY) return(x != CORD_EMPTY);
+ if (x == CORD_EMPTY) return(-1);
+ if (CORD_IS_STRING(y) && CORD_IS_STRING(x)) return(strcmp(x,y));
+ CORD_set_pos(xpos, x, 0);
+ CORD_set_pos(ypos, y, 0);
+ for(;;) {
+ size_t avail, yavail;
+
+ if (!CORD_pos_valid(xpos)) {
+ if (CORD_pos_valid(ypos)) {
+ return(-1);
+ } else {
+ return(0);
+ }
+ }
+ if (!CORD_pos_valid(ypos)) {
+ return(1);
+ }
+ avail = CORD_pos_chars_left(xpos);
+ if (avail == 0
+ || (yavail = CORD_pos_chars_left(ypos)) == 0) {
+ char xcurrent = CORD_pos_fetch(xpos);
+ char ycurrent = CORD_pos_fetch(ypos);
+ if (xcurrent != ycurrent) return(xcurrent - ycurrent);
+ CORD_next(xpos);
+ CORD_next(ypos);
+ } else {
+ /* process as many characters as we can */
+ int result;
+
+ if (avail > yavail) avail = yavail;
+ result = strncmp(CORD_pos_cur_char_addr(xpos),
+ CORD_pos_cur_char_addr(ypos), avail);
+ if (result != 0) return(result);
+ CORD_pos_advance(xpos, avail);
+ CORD_pos_advance(ypos, avail);
+ }
+ }
+}
+
+int CORD_ncmp(CORD x, size_t x_start, CORD y, size_t y_start, size_t len)
+{
+ CORD_pos xpos;
+ CORD_pos ypos;
+ size_t count;
+
+ CORD_set_pos(xpos, x, x_start);
+ CORD_set_pos(ypos, y, y_start);
+ for(count = 0; count < len;) {
+ long avail, yavail;
+
+ if (!CORD_pos_valid(xpos)) {
+ if (CORD_pos_valid(ypos)) {
+ return(-1);
+ } else {
+ return(0);
+ }
+ }
+ if (!CORD_pos_valid(ypos)) {
+ return(1);
+ }
+ if ((avail = CORD_pos_chars_left(xpos)) <= 0
+ || (yavail = CORD_pos_chars_left(ypos)) <= 0) {
+ char xcurrent = CORD_pos_fetch(xpos);
+ char ycurrent = CORD_pos_fetch(ypos);
+
+ if (xcurrent != ycurrent) return(xcurrent - ycurrent);
+ CORD_next(xpos);
+ CORD_next(ypos);
+ count++;
+ } else {
+ /* process as many characters as we can */
+ int result;
+
+ if (avail > yavail) avail = yavail;
+ count += avail;
+ if (count > len)
+ avail -= (long)(count - len);
+ result = strncmp(CORD_pos_cur_char_addr(xpos),
+ CORD_pos_cur_char_addr(ypos), (size_t)avail);
+ if (result != 0) return(result);
+ CORD_pos_advance(xpos, (size_t)avail);
+ CORD_pos_advance(ypos, (size_t)avail);
+ }
+ }
+ return(0);
+}
+
+char * CORD_to_char_star(CORD x)
+{
+ size_t len = CORD_len(x);
+ char * result = (char *)GC_MALLOC_ATOMIC(len + 1);
+
+ if (result == 0) OUT_OF_MEMORY;
+ if (len > 0 && CORD_fill_buf(x, 0, len, result) != 1)
+ ABORT("CORD_fill_buf malfunction");
+ result[len] = '\0';
+ return(result);
+}
+
+CORD CORD_from_char_star(const char *s)
+{
+ char * result;
+ size_t len = strlen(s);
+
+ if (0 == len) return(CORD_EMPTY);
+ result = (char *)GC_MALLOC_ATOMIC(len + 1);
+ if (result == 0) OUT_OF_MEMORY;
+ memcpy(result, s, len+1);
+ return(result);
+}
+
+const char * CORD_to_const_char_star(CORD x)
+{
+ if (x == 0) return("");
+ if (CORD_IS_STRING(x)) return((const char *)x);
+ return(CORD_to_char_star(x));
+}
+
+char CORD_fetch(CORD x, size_t i)
+{
+ CORD_pos xpos;
+
+ CORD_set_pos(xpos, x, i);
+ if (!CORD_pos_valid(xpos)) ABORT("bad index?");
+ return(CORD_pos_fetch(xpos));
+}
+
+
+int CORD_put_proc(char c, void * client_data)
+{
+ FILE * f = (FILE *)client_data;
+
+ return(putc(c, f) == EOF);
+}
+
+int CORD_batched_put_proc(const char * s, void * client_data)
+{
+ FILE * f = (FILE *)client_data;
+
+ return(fputs(s, f) == EOF);
+}
+
+
+int CORD_put(CORD x, FILE * f)
+{
+ if (CORD_iter5(x, 0, CORD_put_proc, CORD_batched_put_proc, f)) {
+ return(EOF);
+ } else {
+ return(1);
+ }
+}
+
+typedef struct {
+ size_t pos; /* Current position in the cord */
+ char target; /* Character we're looking for */
+} chr_data;
+
+int CORD_chr_proc(char c, void * client_data)
+{
+ chr_data * d = (chr_data *)client_data;
+
+ if (c == d -> target) return(1);
+ (d -> pos) ++;
+ return(0);
+}
+
+int CORD_rchr_proc(char c, void * client_data)
+{
+ chr_data * d = (chr_data *)client_data;
+
+ if (c == d -> target) return(1);
+ (d -> pos) --;
+ return(0);
+}
+
+int CORD_batched_chr_proc(const char *s, void * client_data)
+{
+ chr_data * d = (chr_data *)client_data;
+ const char * occ = strchr(s, d -> target);
+
+ if (NULL == occ) {
+ d -> pos += strlen(s);
+ return(0);
+ } else {
+ d -> pos += occ - s;
+ return(1);
+ }
+}
+
+size_t CORD_chr(CORD x, size_t i, int c)
+{
+ chr_data d;
+
+ d.pos = i;
+ d.target = (char)c;
+ if (CORD_iter5(x, i, CORD_chr_proc, CORD_batched_chr_proc, &d)) {
+ return(d.pos);
+ } else {
+ return(CORD_NOT_FOUND);
+ }
+}
+
+size_t CORD_rchr(CORD x, size_t i, int c)
+{
+ chr_data d;
+
+ d.pos = i;
+ d.target = (char)c;
+ if (CORD_riter4(x, i, CORD_rchr_proc, &d)) {
+ return(d.pos);
+ } else {
+ return(CORD_NOT_FOUND);
+ }
+}
+
+/* Find the first occurrence of s in x at position start or later. */
+/* This uses an asymptotically poor algorithm, which should typically */
+/* perform acceptably. We compare the first few characters directly, */
+/* and call CORD_ncmp whenever there is a partial match. */
+/* This has the advantage that we allocate very little, or not at all. */
+/* It's very fast if there are few close misses. */
+size_t CORD_str(CORD x, size_t start, CORD s)
+{
+ CORD_pos xpos;
+ size_t xlen = CORD_len(x);
+ size_t slen;
+ size_t start_len;
+ const char * s_start;
+ unsigned long s_buf = 0; /* The first few characters of s */
+ unsigned long x_buf = 0; /* Start of candidate substring. */
+ /* Initialized only to make compilers */
+ /* happy. */
+ unsigned long mask = 0;
+ size_t i;
+ size_t match_pos;
+
+ if (s == CORD_EMPTY) return(start);
+ if (CORD_IS_STRING(s)) {
+ s_start = s;
+ slen = strlen(s);
+ } else {
+ s_start = CORD_to_char_star(CORD_substr(s, 0, sizeof(unsigned long)));
+ slen = CORD_len(s);
+ }
+ if (xlen < start || xlen - start < slen) return(CORD_NOT_FOUND);
+ start_len = slen;
+ if (start_len > sizeof(unsigned long)) start_len = sizeof(unsigned long);
+ CORD_set_pos(xpos, x, start);
+ for (i = 0; i < start_len; i++) {
+ mask <<= 8;
+ mask |= 0xff;
+ s_buf <<= 8;
+ s_buf |= (unsigned char)s_start[i];
+ x_buf <<= 8;
+ x_buf |= (unsigned char)CORD_pos_fetch(xpos);
+ CORD_next(xpos);
+ }
+ for (match_pos = start; ; match_pos++) {
+ if ((x_buf & mask) == s_buf) {
+ if (slen == start_len ||
+ CORD_ncmp(x, match_pos + start_len,
+ s, start_len, slen - start_len) == 0) {
+ return(match_pos);
+ }
+ }
+ if ( match_pos == xlen - slen ) {
+ return(CORD_NOT_FOUND);
+ }
+ x_buf <<= 8;
+ x_buf |= (unsigned char)CORD_pos_fetch(xpos);
+ CORD_next(xpos);
+ }
+}
+
+void CORD_ec_flush_buf(CORD_ec x)
+{
+ size_t len = x[0].ec_bufptr - x[0].ec_buf;
+ char * s;
+
+ if (len == 0) return;
+ s = (char *)GC_MALLOC_ATOMIC(len + 1);
+ if (NULL == s) OUT_OF_MEMORY;
+ memcpy(s, x[0].ec_buf, len);
+ s[len] = '\0';
+ x[0].ec_cord = CORD_cat_char_star(x[0].ec_cord, s, len);
+ x[0].ec_bufptr = x[0].ec_buf;
+}
+
+void CORD_ec_append_cord(CORD_ec x, CORD s)
+{
+ CORD_ec_flush_buf(x);
+ x[0].ec_cord = CORD_cat(x[0].ec_cord, s);
+}
+
+char CORD_nul_func(size_t i CORD_ATTR_UNUSED, void * client_data)
+{
+ return (char)(GC_word)client_data;
+}
+
+CORD CORD_chars(char c, size_t i)
+{
+ return CORD_from_fn(CORD_nul_func, (void *)(GC_word)(unsigned char)c, i);
+}
+
+CORD CORD_from_file_eager(FILE * f)
+{
+ CORD_ec ecord;
+
+ CORD_ec_init(ecord);
+ for(;;) {
+ int c = getc(f);
+
+ if (c == 0) {
+ /* Append the right number of NULs */
+ /* Note that any string of NULs is represented in 4 words, */
+ /* independent of its length. */
+ size_t count = 1;
+
+ CORD_ec_flush_buf(ecord);
+ while ((c = getc(f)) == 0) count++;
+ ecord[0].ec_cord = CORD_cat(ecord[0].ec_cord, CORD_nul(count));
+ }
+ if (c == EOF) break;
+ CORD_ec_append(ecord, (char)c);
+ }
+ (void) fclose(f);
+ return(CORD_balance(CORD_ec_to_cord(ecord)));
+}
+
+/* The state maintained for a lazily read file consists primarily */
+/* of a large direct-mapped cache of previously read values. */
+/* We could rely more on stdio buffering. That would have 2 */
+/* disadvantages: */
+/* 1) Empirically, not all fseek implementations preserve the */
+/* buffer whenever they could. */
+/* 2) It would fail if 2 different sections of a long cord */
+/* were being read alternately. */
+/* We do use the stdio buffer for read ahead. */
+/* To guarantee thread safety in the presence of atomic pointer */
+/* writes, cache lines are always replaced, and never modified in */
+/* place. */
+
+# define LOG_CACHE_SZ 14
+# define CACHE_SZ (1 << LOG_CACHE_SZ)
+# define LOG_LINE_SZ 9
+# define LINE_SZ (1 << LOG_LINE_SZ)
+
+typedef struct {
+ size_t tag;
+ char data[LINE_SZ];
+ /* data[i%LINE_SZ] = ith char in file if tag = i/LINE_SZ */
+} cache_line;
+
+typedef struct {
+ FILE * lf_file;
+ size_t lf_current; /* Current file pointer value */
+ cache_line * volatile lf_cache[CACHE_SZ/LINE_SZ];
+} lf_state;
+
+# define MOD_CACHE_SZ(n) ((n) & (CACHE_SZ - 1))
+# define DIV_CACHE_SZ(n) ((n) >> LOG_CACHE_SZ)
+# define MOD_LINE_SZ(n) ((n) & (LINE_SZ - 1))
+# define DIV_LINE_SZ(n) ((n) >> LOG_LINE_SZ)
+# define LINE_START(n) ((n) & ~(size_t)(LINE_SZ - 1))
+
+typedef struct {
+ lf_state * state;
+ size_t file_pos; /* Position of needed character. */
+ cache_line * new_cache;
+} refill_data;
+
+/* Executed with allocation lock. */
+static void * GC_CALLBACK refill_cache(void * client_data)
+{
+ lf_state * state = ((refill_data *)client_data) -> state;
+ size_t file_pos = ((refill_data *)client_data) -> file_pos;
+ FILE *f = state -> lf_file;
+ size_t line_start = LINE_START(file_pos);
+ size_t line_no = DIV_LINE_SZ(MOD_CACHE_SZ(file_pos));
+ cache_line * new_cache = ((refill_data *)client_data) -> new_cache;
+
+ if (line_start != state -> lf_current
+ && fseek(f, (long)line_start, SEEK_SET) != 0) {
+ ABORT("fseek failed");
+ }
+ if (fread(new_cache -> data, sizeof(char), LINE_SZ, f)
+ <= file_pos - line_start) {
+ ABORT("fread failed");
+ }
+ new_cache -> tag = DIV_LINE_SZ(file_pos);
+# ifdef CORD_USE_GCC_ATOMIC
+ __atomic_store_n(&(state -> lf_cache[line_no]), new_cache,
+ __ATOMIC_RELEASE);
+# else
+ state -> lf_cache[line_no] = new_cache;
+# endif
+ GC_END_STUBBORN_CHANGE((/* no volatile */ void *)(state -> lf_cache
+ + line_no));
+ state -> lf_current = line_start + LINE_SZ;
+ return (void *)((GC_word)new_cache->data[MOD_LINE_SZ(file_pos)]);
+}
+
+#ifndef CORD_USE_GCC_ATOMIC
+ static void * GC_CALLBACK get_cache_line(void * client_data)
+ {
+ return (void *)(*(cache_line **)client_data);
+ }
+#endif
+
+char CORD_lf_func(size_t i, void * client_data)
+{
+ lf_state * state = (lf_state *)client_data;
+ cache_line * volatile * cl_addr =
+ &(state -> lf_cache[DIV_LINE_SZ(MOD_CACHE_SZ(i))]);
+# ifdef CORD_USE_GCC_ATOMIC
+ cache_line * cl = (cache_line *)__atomic_load_n(cl_addr,
+ __ATOMIC_ACQUIRE);
+# else
+ cache_line * cl = (cache_line *)GC_call_with_alloc_lock(
+ get_cache_line, (void *)cl_addr);
+# endif
+
+ if (cl == 0 || cl -> tag != DIV_LINE_SZ(i)) {
+ /* Cache miss */
+ refill_data rd;
+
+ rd.state = state;
+ rd.file_pos = i;
+ rd.new_cache = GC_NEW_ATOMIC(cache_line);
+ if (rd.new_cache == 0) OUT_OF_MEMORY;
+ return (char)((GC_word)GC_call_with_alloc_lock(refill_cache, &rd));
+ }
+ return(cl -> data[MOD_LINE_SZ(i)]);
+}
+
+#ifndef GC_NO_FINALIZATION
+ void CORD_lf_close_proc(void * obj, void * client_data CORD_ATTR_UNUSED)
+ {
+ if (fclose(((lf_state *)obj) -> lf_file) != 0) {
+ ABORT("CORD_lf_close_proc: fclose failed");
+ }
+ }
+#endif
+
+CORD CORD_from_file_lazy_inner(FILE * f, size_t len)
+{
+ lf_state * state = GC_NEW(lf_state);
+ int i;
+
+ if (state == 0) OUT_OF_MEMORY;
+ if (len != 0) {
+ /* Dummy read to force buffer allocation. */
+ /* This greatly increases the probability */
+ /* of avoiding deadlock if buffer allocation */
+ /* is redirected to GC_malloc and the */
+ /* world is multi-threaded. */
+ char buf[1];
+
+ if (fread(buf, 1, 1, f) > 1
+ || fseek(f, 0l, SEEK_SET) != 0) {
+ ABORT("Bad f argument or I/O failure");
+ }
+ }
+ state -> lf_file = f;
+ for (i = 0; i < CACHE_SZ/LINE_SZ; i++) {
+ state -> lf_cache[i] = 0;
+ }
+ state -> lf_current = 0;
+# ifndef GC_NO_FINALIZATION
+ GC_REGISTER_FINALIZER(state, CORD_lf_close_proc, 0, 0, 0);
+# endif
+ return(CORD_from_fn(CORD_lf_func, state, len));
+}
+
+CORD CORD_from_file_lazy(FILE * f)
+{
+ long len;
+
+ if (fseek(f, 0l, SEEK_END) != 0
+ || (len = ftell(f)) < 0
+ || fseek(f, 0l, SEEK_SET) != 0) {
+ ABORT("Bad f argument or I/O failure");
+ }
+ return(CORD_from_file_lazy_inner(f, (size_t)len));
+}
+
+# define LAZY_THRESHOLD (128*1024 + 1)
+
+CORD CORD_from_file(FILE * f)
+{
+ long len;
+
+ if (fseek(f, 0l, SEEK_END) != 0
+ || (len = ftell(f)) < 0
+ || fseek(f, 0l, SEEK_SET) != 0) {
+ ABORT("Bad f argument or I/O failure");
+ }
+ if (len < LAZY_THRESHOLD) {
+ return(CORD_from_file_eager(f));
+ } else {
+ return(CORD_from_file_lazy_inner(f, (size_t)len));
+ }
+}
diff --git a/graphics/asymptote/gc/cord/tests/cordtest.c b/graphics/asymptote/gc/cord/tests/cordtest.c
new file mode 100644
index 0000000000..44df3e1b6c
--- /dev/null
+++ b/graphics/asymptote/gc/cord/tests/cordtest.c
@@ -0,0 +1,351 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+# include "gc.h"
+# include "cord.h"
+
+# include <stdarg.h>
+# include <string.h>
+# include <stdio.h>
+# include <stdlib.h>
+
+/* This is a very incomplete test of the cord package. It knows about */
+/* a few internals of the package (e.g. when C strings are returned) */
+/* that real clients shouldn't rely on. */
+
+# define ABORT(string) \
+ { fprintf(stderr, "FAILED: %s\n", string); abort(); }
+
+#if defined(CPPCHECK)
+# undef CORD_iter
+# undef CORD_next
+# undef CORD_pos_fetch
+# undef CORD_pos_to_cord
+# undef CORD_pos_to_index
+# undef CORD_pos_valid
+# undef CORD_prev
+#endif
+
+int count;
+
+int test_fn(char c, void * client_data)
+{
+ if (client_data != (void *)(GC_word)13)
+ ABORT("bad client data");
+ if (count < 64*1024+1) {
+ if ((count & 1) == 0) {
+ if (c != 'b') ABORT("bad char");
+ } else {
+ if (c != 'a') ABORT("bad char");
+ }
+ count++;
+ return(0);
+ } else {
+ if (c != 'c') ABORT("bad char");
+ count++;
+ return(1);
+ }
+}
+
+char id_cord_fn(size_t i, void * client_data)
+{
+ if (client_data != 0) ABORT("id_cord_fn: bad client data");
+ return((char)i);
+}
+
+void test_basics(void)
+{
+ CORD x = CORD_from_char_star("ab");
+ size_t i;
+ CORD y;
+ CORD_pos p;
+
+ x = CORD_cat(x,x);
+ if (x == CORD_EMPTY) ABORT("CORD_cat(x,x) returned empty cord");
+ if (!CORD_IS_STRING(x)) ABORT("short cord should usually be a string");
+ if (strcmp(x, "abab") != 0) ABORT("bad CORD_cat result");
+
+ for (i = 1; i < 16; i++) {
+ x = CORD_cat(x,x);
+ }
+ x = CORD_cat(x,"c");
+ if (CORD_len(x) != 128*1024+1) ABORT("bad length");
+
+ count = 0;
+ if (CORD_iter5(x, 64*1024-1, test_fn, CORD_NO_FN,
+ (void *)(GC_word)13) == 0) {
+ ABORT("CORD_iter5 failed");
+ }
+ if (count != 64*1024 + 2) ABORT("CORD_iter5 failed");
+
+ count = 0;
+ CORD_set_pos(p, x, 64*1024-1);
+ while(CORD_pos_valid(p)) {
+ (void)test_fn(CORD_pos_fetch(p), (void *)(GC_word)13);
+ CORD_next(p);
+ }
+ if (count != 64*1024 + 2) ABORT("Position based iteration failed");
+
+ y = CORD_substr(x, 1023, 5);
+ if (!y) ABORT("CORD_substr returned NULL");
+ if (!CORD_IS_STRING(y)) ABORT("short cord should usually be a string");
+ if (strcmp(y, "babab") != 0) ABORT("bad CORD_substr result");
+
+ y = CORD_substr(x, 1024, 8);
+ if (!y) ABORT("CORD_substr returned NULL");
+ if (!CORD_IS_STRING(y)) ABORT("short cord should usually be a string");
+ if (strcmp(y, "abababab") != 0) ABORT("bad CORD_substr result");
+
+ y = CORD_substr(x, 128*1024-1, 8);
+ if (!y) ABORT("CORD_substr returned NULL");
+ if (!CORD_IS_STRING(y)) ABORT("short cord should usually be a string");
+ if (strcmp(y, "bc") != 0) ABORT("bad CORD_substr result");
+
+ x = CORD_balance(x);
+ if (CORD_len(x) != 128*1024+1) ABORT("bad length");
+
+ count = 0;
+ if (CORD_iter5(x, 64*1024-1, test_fn, CORD_NO_FN,
+ (void *)(GC_word)13) == 0) {
+ ABORT("CORD_iter5 failed");
+ }
+ if (count != 64*1024 + 2) ABORT("CORD_iter5 failed");
+
+ y = CORD_substr(x, 1023, 5);
+ if (!y) ABORT("CORD_substr returned NULL");
+ if (!CORD_IS_STRING(y)) ABORT("short cord should usually be a string");
+ if (strcmp(y, "babab") != 0) ABORT("bad CORD_substr result");
+ y = CORD_from_fn(id_cord_fn, 0, 13);
+ i = 0;
+ CORD_set_pos(p, y, i);
+ while(CORD_pos_valid(p)) {
+ char c = CORD_pos_fetch(p);
+
+ if ((size_t)(unsigned char)c != i)
+ ABORT("Traversal of function node failed");
+ CORD_next(p);
+ i++;
+ }
+ if (i != 13) ABORT("Bad apparent length for function node");
+# if defined(CPPCHECK)
+ /* TODO: Actually test these functions. */
+ CORD_prev(p);
+ (void)CORD_pos_to_cord(p);
+ (void)CORD_pos_to_index(p);
+ (void)CORD_iter(CORD_EMPTY, test_fn, NULL);
+ (void)CORD_riter(CORD_EMPTY, test_fn, NULL);
+ CORD_dump(y);
+# endif
+}
+
+void test_extras(void)
+{
+# define FNAME1 "cordtst1.tmp" /* short name (8+3) for portability */
+# define FNAME2 "cordtst2.tmp"
+ int i;
+ CORD y = "abcdefghijklmnopqrstuvwxyz0123456789";
+ CORD x = "{}";
+ CORD u, w, z;
+ FILE *f;
+ FILE *f1a, *f1b, *f2;
+
+ w = CORD_cat(CORD_cat(y,y),y);
+ z = CORD_catn(3,y,y,y);
+ if (CORD_cmp(w,z) != 0) ABORT("CORD_catn comparison wrong");
+ for (i = 1; i < 100; i++) {
+ x = CORD_cat(x, y);
+ }
+ z = CORD_balance(x);
+ if (CORD_cmp(x,z) != 0) ABORT("balanced string comparison wrong");
+ if (CORD_cmp(x,CORD_cat(z, CORD_nul(13))) >= 0) ABORT("comparison 2");
+ if (CORD_cmp(CORD_cat(x, CORD_nul(13)), z) <= 0) ABORT("comparison 3");
+ if (CORD_cmp(x,CORD_cat(z, "13")) >= 0) ABORT("comparison 4");
+ if ((f = fopen(FNAME1, "w")) == 0) ABORT("open failed");
+ if (CORD_put(z,f) == EOF) ABORT("CORD_put failed");
+ if (fclose(f) == EOF) ABORT("fclose failed");
+ f1a = fopen(FNAME1, "rb");
+ if (!f1a) ABORT("Unable to open " FNAME1);
+ w = CORD_from_file(f1a);
+ if (CORD_len(w) != CORD_len(z)) ABORT("file length wrong");
+ if (CORD_cmp(w,z) != 0) ABORT("file comparison wrong");
+ if (CORD_cmp(CORD_substr(w, 50*36+2, 36), y) != 0)
+ ABORT("file substr wrong");
+ f1b = fopen(FNAME1, "rb");
+ if (!f1b) ABORT("2nd open failed: " FNAME1);
+ z = CORD_from_file_lazy(f1b);
+ if (CORD_cmp(w,z) != 0) ABORT("File conversions differ");
+ if (CORD_chr(w, 0, '9') != 37) ABORT("CORD_chr failed 1");
+ if (CORD_chr(w, 3, 'a') != 38) ABORT("CORD_chr failed 2");
+ if (CORD_rchr(w, CORD_len(w) - 1, '}') != 1) ABORT("CORD_rchr failed");
+ x = y;
+ for (i = 1; i < 14; i++) {
+ x = CORD_cat(x,x);
+ }
+ if ((f = fopen(FNAME2, "w")) == 0) ABORT("2nd open failed");
+# ifdef __DJGPP__
+ /* FIXME: DJGPP workaround. Why does this help? */
+ if (fflush(f) != 0) ABORT("fflush failed");
+# endif
+ if (CORD_put(x,f) == EOF) ABORT("CORD_put failed");
+ if (fclose(f) == EOF) ABORT("fclose failed");
+ f2 = fopen(FNAME2, "rb");
+ if (!f2) ABORT("Unable to open " FNAME2);
+ w = CORD_from_file(f2);
+ if (CORD_len(w) != CORD_len(x)) ABORT("file length wrong");
+ if (CORD_cmp(w,x) != 0) ABORT("file comparison wrong");
+ if (CORD_cmp(CORD_substr(w, 1000*36, 36), y) != 0)
+ ABORT("file substr wrong");
+ if (strcmp(CORD_to_char_star(CORD_substr(w, 1000*36, 36)), y) != 0)
+ ABORT("char * file substr wrong");
+ u = CORD_substr(w, 1000*36, 2);
+ if (!u) ABORT("CORD_substr returned NULL");
+ if (strcmp(u, "ab") != 0)
+ ABORT("short file substr wrong");
+ if (CORD_str(x,1,"9a") != 35) ABORT("CORD_str failed 1");
+ if (CORD_str(x,0,"9abcdefghijk") != 35) ABORT("CORD_str failed 2");
+ if (CORD_str(x,0,"9abcdefghijx") != CORD_NOT_FOUND)
+ ABORT("CORD_str failed 3");
+ if (CORD_str(x,0,"9>") != CORD_NOT_FOUND) ABORT("CORD_str failed 4");
+ /* Note: f1a, f1b, f2 handles are closed lazily by CORD library. */
+ /* TODO: Propose and use CORD_fclose. */
+ *(CORD volatile *)&w = CORD_EMPTY;
+ *(CORD volatile *)&z = CORD_EMPTY;
+ GC_gcollect();
+# ifndef GC_NO_FINALIZATION
+ GC_invoke_finalizers();
+ /* Of course, this does not guarantee the files are closed. */
+# endif
+ if (remove(FNAME1) != 0) {
+ /* On some systems, e.g. OS2, this may fail if f1 is still open. */
+ /* But we cannot call fclose as it might lead to double close. */
+ fprintf(stderr, "WARNING: remove failed: " FNAME1 "\n");
+ }
+}
+
+int wrap_vprintf(CORD format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start(args, format);
+ result = CORD_vprintf(format, args);
+ va_end(args);
+ return result;
+}
+
+int wrap_vfprintf(FILE * f, CORD format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start(args, format);
+ result = CORD_vfprintf(f, format, args);
+ va_end(args);
+ return result;
+}
+
+#if defined(__DJGPP__) || defined(__STRICT_ANSI__)
+ /* snprintf is missing in DJGPP (v2.0.3) */
+#else
+# if defined(_MSC_VER)
+# if defined(_WIN32_WCE)
+ /* _snprintf is deprecated in WinCE */
+# define GC_SNPRINTF StringCchPrintfA
+# else
+# define GC_SNPRINTF _snprintf
+# endif
+# else
+# define GC_SNPRINTF snprintf
+# endif
+#endif
+
+/* no static */ /* no const */ char *zu_format = (char*)"%zu";
+
+void test_printf(void)
+{
+ CORD result;
+ char result2[200];
+ long l = -1;
+ short s = (short)-1;
+ CORD x;
+ int res;
+
+ if (CORD_sprintf(&result, "%7.2f%ln", 3.14159F, &l) != 7)
+ ABORT("CORD_sprintf failed 1");
+ if (CORD_cmp(result, " 3.14") != 0) ABORT("CORD_sprintf goofed 1");
+ if (l != 7) ABORT("CORD_sprintf goofed 2");
+ if (CORD_sprintf(&result, "%-7.2s%hn%c%s", "abcd", &s, 'x', "yz") != 10)
+ ABORT("CORD_sprintf failed 2");
+ if (CORD_cmp(result, "ab xyz") != 0) ABORT("CORD_sprintf goofed 3");
+ if (s != 7) ABORT("CORD_sprintf goofed 4");
+ x = "abcdefghij";
+ x = CORD_cat(x,x);
+ x = CORD_cat(x,x);
+ x = CORD_cat(x,x);
+ if (CORD_sprintf(&result, "->%-120.78r!\n", x) != 124)
+ ABORT("CORD_sprintf failed 3");
+# ifdef GC_SNPRINTF
+ (void)GC_SNPRINTF(result2, sizeof(result2), "->%-120.78s!\n",
+ CORD_to_char_star(x));
+# else
+ (void)sprintf(result2, "->%-120.78s!\n", CORD_to_char_star(x));
+# endif
+ result2[sizeof(result2) - 1] = '\0';
+ if (CORD_cmp(result, result2) != 0) ABORT("CORD_sprintf goofed 5");
+
+# ifdef GC_SNPRINTF
+ /* Check whether "%zu" specifier is supported; pass the format */
+ /* string via a variable to avoid a compiler warning if not. */
+ res = GC_SNPRINTF(result2, sizeof(result2), zu_format, (size_t)0);
+# else
+ res = sprintf(result2, zu_format, (size_t)0);
+# endif
+ result2[sizeof(result2) - 1] = '\0';
+ if (res == 1) /* is "%z" supported by printf? */ {
+ if (CORD_sprintf(&result, "%zu %zd 0x%0zx",
+ (size_t)123, (size_t)4567, (size_t)0x4abc) != 15)
+ ABORT("CORD_sprintf failed 5");
+ if (CORD_cmp(result, "123 4567 0x4abc") != 0)
+ ABORT("CORD_sprintf goofed 5");
+ } else {
+ (void)CORD_printf("printf lacks support of 'z' modifier\n");
+ }
+
+ /* TODO: Better test CORD_[v][f]printf. */
+ (void)CORD_printf(CORD_EMPTY);
+ (void)wrap_vfprintf(stdout, CORD_EMPTY);
+ (void)wrap_vprintf(CORD_EMPTY);
+}
+
+int main(void)
+{
+# ifdef THINK_C
+ printf("cordtest:\n");
+# endif
+ GC_INIT();
+# ifndef NO_INCREMENTAL
+ GC_enable_incremental();
+# endif
+ if (GC_get_find_leak())
+ printf("This test program is not designed for leak detection mode\n");
+ test_basics();
+ test_extras();
+ test_printf();
+
+ GC_gcollect(); /* to close f2 before the file removal */
+ if (remove(FNAME2) != 0) {
+ fprintf(stderr, "WARNING: remove failed: " FNAME2 "\n");
+ }
+ CORD_fprintf(stdout, "SUCCEEDED\n");
+ return(0);
+}
diff --git a/graphics/asymptote/gc/cord/tests/de.c b/graphics/asymptote/gc/cord/tests/de.c
new file mode 100644
index 0000000000..2bdaa8e609
--- /dev/null
+++ b/graphics/asymptote/gc/cord/tests/de.c
@@ -0,0 +1,640 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * A really simple-minded text editor based on cords.
+ * Things it does right:
+ * No size bounds.
+ * Unbounded undo.
+ * Shouldn't crash no matter what file you invoke it on (e.g. /vmunix)
+ * (Make sure /vmunix is not writable before you try this.)
+ * Scrolls horizontally.
+ * Things it does wrong:
+ * It doesn't handle tabs reasonably (use "expand" first).
+ * The command set is MUCH too small.
+ * The redisplay algorithm doesn't let curses do the scrolling.
+ * The rule for moving the window over the file is suboptimal.
+ */
+
+#include <stdio.h>
+#include <stdlib.h> /* for exit() */
+
+#include "gc.h"
+#include "cord.h"
+
+#ifdef THINK_C
+#define MACINTOSH
+#endif
+#include <ctype.h>
+
+#if (defined(__BORLANDC__) || defined(__CYGWIN__) || defined(__MINGW32__) \
+ || defined(__NT__) || defined(_WIN32)) && !defined(WIN32)
+ /* If this is DOS or win16, we'll fail anyway. */
+# define WIN32
+#endif
+
+#if defined(WIN32)
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+# endif
+# define NOSERVICE
+# include <windows.h>
+# include "de_win.h"
+#elif defined(MACINTOSH)
+# include <console.h>
+/* curses emulation. */
+# define initscr()
+# define endwin()
+# define nonl()
+# define noecho() csetmode(C_NOECHO, stdout)
+# define cbreak() csetmode(C_CBREAK, stdout)
+# define refresh()
+# define addch(c) putchar(c)
+# define standout() cinverse(1, stdout)
+# define standend() cinverse(0, stdout)
+# define move(line,col) cgotoxy(col + 1, line + 1, stdout)
+# define clrtoeol() ccleol(stdout)
+# define de_error(s) { fprintf(stderr, s); getchar(); }
+# define LINES 25
+# define COLS 80
+#else
+# include <curses.h>
+# include <unistd.h> /* for sleep() */
+# define de_error(s) { fprintf(stderr, s); sleep(2); }
+#endif
+#include "de_cmds.h"
+
+#if defined(CPPCHECK)
+# define MACRO_BLKSTMT_BEGIN {
+# define MACRO_BLKSTMT_END }
+#else
+# define MACRO_BLKSTMT_BEGIN do {
+# define MACRO_BLKSTMT_END } while (0)
+#endif
+
+#define OUT_OF_MEMORY MACRO_BLKSTMT_BEGIN \
+ fprintf(stderr, "Out of memory\n"); \
+ exit(3); \
+ MACRO_BLKSTMT_END
+
+/* List of line number to position mappings, in descending order. */
+/* There may be holes. */
+typedef struct LineMapRep {
+ int line;
+ size_t pos;
+ struct LineMapRep * previous;
+} * line_map;
+
+/* List of file versions, one per edit operation */
+typedef struct HistoryRep {
+ CORD file_contents;
+ struct HistoryRep * previous;
+ line_map map; /* Invalid for first record "now" */
+} * history;
+
+history now = 0;
+CORD current; /* == now -> file_contents. */
+size_t current_len; /* Current file length. */
+line_map current_map = 0; /* Current line no. to pos. map */
+size_t current_map_size = 0; /* Number of current_map entries. */
+ /* Not always accurate, but reset */
+ /* by prune_map. */
+# define MAX_MAP_SIZE 3000
+
+/* Current display position */
+int dis_line = 0;
+int dis_col = 0;
+
+# define ALL -1
+# define NONE - 2
+int need_redisplay = 0; /* Line that needs to be redisplayed. */
+
+
+/* Current cursor position. Always within file. */
+int line = 0;
+int col = 0;
+size_t file_pos = 0; /* Character position corresponding to cursor. */
+
+/* Invalidate line map for lines > i */
+void invalidate_map(int i)
+{
+ for (;;) {
+ if (NULL == current_map) exit(4); /* for CSA, should not happen */
+ if (current_map -> line <= i) break;
+ current_map = current_map -> previous;
+ current_map_size--;
+ }
+}
+
+/* Reduce the number of map entries to save space for huge files. */
+/* This also affects maps in histories. */
+void prune_map(void)
+{
+ line_map map = current_map;
+ int start_line = map -> line;
+
+ current_map_size = 0;
+ do {
+ current_map_size++;
+ if (map -> line < start_line - LINES && map -> previous != 0) {
+ line_map pred = map -> previous -> previous;
+
+ GC_PTR_STORE_AND_DIRTY(&map->previous, pred);
+ }
+ map = map -> previous;
+ } while (map != 0);
+}
+
+/* Add mapping entry */
+void add_map(int line_arg, size_t pos)
+{
+ line_map new_map = GC_NEW(struct LineMapRep);
+ line_map cur_map;
+
+ if (NULL == new_map) OUT_OF_MEMORY;
+ if (current_map_size >= MAX_MAP_SIZE) prune_map();
+ new_map -> line = line_arg;
+ new_map -> pos = pos;
+ cur_map = current_map;
+ GC_PTR_STORE_AND_DIRTY(&new_map->previous, cur_map);
+ current_map = new_map;
+ current_map_size++;
+}
+
+/* Return position of column *c of ith line in */
+/* current file. Adjust *c to be within the line.*/
+/* A 0 pointer is taken as 0 column. */
+/* Returns CORD_NOT_FOUND if i is too big. */
+/* Assumes i > dis_line. */
+size_t line_pos(int i, int *c)
+{
+ int j;
+ size_t cur;
+ line_map map = current_map;
+
+ while (map -> line > i) map = map -> previous;
+ if (map -> line < i - 2) /* rebuild */ invalidate_map(i);
+ for (j = map -> line, cur = map -> pos; j < i;) {
+ cur = CORD_chr(current, cur, '\n');
+ if (cur == current_len-1) return(CORD_NOT_FOUND);
+ cur++;
+ if (++j > current_map -> line) add_map(j, cur);
+ }
+ if (c != 0) {
+ size_t next = CORD_chr(current, cur, '\n');
+
+ if (next == CORD_NOT_FOUND) next = current_len - 1;
+ if (next < cur + *c) {
+ *c = (int)(next - cur);
+ }
+ cur += *c;
+ }
+ return(cur);
+}
+
+void add_hist(CORD s)
+{
+ history new_file = GC_NEW(struct HistoryRep);
+
+ if (NULL == new_file) OUT_OF_MEMORY;
+ new_file -> file_contents = current = s;
+ current_len = CORD_len(s);
+ new_file -> previous = now;
+ GC_END_STUBBORN_CHANGE(new_file);
+ if (now != NULL) {
+ now -> map = current_map;
+ GC_END_STUBBORN_CHANGE(now);
+ }
+ now = new_file;
+}
+
+void del_hist(void)
+{
+ now = now -> previous;
+ current = now -> file_contents;
+ current_map = now -> map;
+ current_len = CORD_len(current);
+}
+
+/* Current screen_contents; a dynamically allocated array of CORDs */
+CORD * screen = 0;
+int screen_size = 0;
+
+# ifndef WIN32
+/* Replace a line in the curses stdscr. All control characters are */
+/* displayed as upper case characters in standout mode. This isn't */
+/* terribly appropriate for tabs. */
+void replace_line(int i, CORD s)
+{
+ CORD_pos p;
+# if !defined(MACINTOSH)
+ size_t len = CORD_len(s);
+# endif
+
+ if (screen == 0 || LINES > screen_size) {
+ screen_size = LINES;
+ screen = (CORD *)GC_MALLOC(screen_size * sizeof(CORD));
+ if (NULL == screen) OUT_OF_MEMORY;
+ }
+# if !defined(MACINTOSH)
+ /* A gross workaround for an apparent curses bug: */
+ if (i == LINES-1 && len == (unsigned)COLS) {
+ s = CORD_substr(s, 0, len - 1);
+ }
+# endif
+ if (CORD_cmp(screen[i], s) != 0) {
+ move(i, 0); clrtoeol(); move(i,0);
+
+ CORD_FOR (p, s) {
+ int c = CORD_pos_fetch(p) & 0x7f;
+
+ if (iscntrl(c)) {
+ standout(); addch(c + 0x40); standend();
+ } else {
+ addch(c);
+ }
+ }
+ GC_PTR_STORE_AND_DIRTY(screen + i, s);
+ }
+}
+#else
+# define replace_line(i,s) invalidate_line(i)
+#endif
+
+/* Return up to COLS characters of the line of s starting at pos, */
+/* returning only characters after the given column. */
+CORD retrieve_line(CORD s, size_t pos, unsigned column)
+{
+ CORD candidate = CORD_substr(s, pos, column + COLS);
+ /* avoids scanning very long lines */
+ size_t eol = CORD_chr(candidate, 0, '\n');
+ int len;
+
+ if (eol == CORD_NOT_FOUND) eol = CORD_len(candidate);
+ len = (int)eol - (int)column;
+ if (len < 0) len = 0;
+ return(CORD_substr(s, pos + column, len));
+}
+
+# ifdef WIN32
+# define refresh();
+
+ CORD retrieve_screen_line(int i)
+ {
+ size_t pos;
+
+ invalidate_map(dis_line + LINES); /* Prune search */
+ pos = line_pos(dis_line + i, 0);
+ if (pos == CORD_NOT_FOUND) return(CORD_EMPTY);
+ return(retrieve_line(current, pos, dis_col));
+ }
+# endif
+
+/* Display the visible section of the current file */
+void redisplay(void)
+{
+ int i;
+
+ invalidate_map(dis_line + LINES); /* Prune search */
+ for (i = 0; i < LINES; i++) {
+ if (need_redisplay == ALL || need_redisplay == i) {
+ size_t pos = line_pos(dis_line + i, 0);
+
+ if (pos == CORD_NOT_FOUND) break;
+ replace_line(i, retrieve_line(current, pos, dis_col));
+ if (need_redisplay == i) goto done;
+ }
+ }
+ for (; i < LINES; i++) replace_line(i, CORD_EMPTY);
+done:
+ refresh();
+ need_redisplay = NONE;
+}
+
+int dis_granularity;
+
+/* Update dis_line, dis_col, and dis_pos to make cursor visible. */
+/* Assumes line, col, dis_line, dis_pos are in bounds. */
+void normalize_display(void)
+{
+ int old_line = dis_line;
+ int old_col = dis_col;
+
+ dis_granularity = 1;
+ if (LINES > 15 && COLS > 15) dis_granularity = 2;
+ while (dis_line > line) dis_line -= dis_granularity;
+ while (dis_col > col) dis_col -= dis_granularity;
+ while (line >= dis_line + LINES) dis_line += dis_granularity;
+ while (col >= dis_col + COLS) dis_col += dis_granularity;
+ if (old_line != dis_line || old_col != dis_col) {
+ need_redisplay = ALL;
+ }
+}
+
+# if defined(WIN32)
+# elif defined(MACINTOSH)
+# define move_cursor(x,y) cgotoxy(x + 1, y + 1, stdout)
+# else
+# define move_cursor(x,y) move(y,x)
+# endif
+
+/* Adjust display so that cursor is visible; move cursor into position */
+/* Update screen if necessary. */
+void fix_cursor(void)
+{
+ normalize_display();
+ if (need_redisplay != NONE) redisplay();
+ move_cursor(col - dis_col, line - dis_line);
+ refresh();
+# ifndef WIN32
+ fflush(stdout);
+# endif
+}
+
+/* Make sure line, col, and dis_pos are somewhere inside file. */
+/* Recompute file_pos. Assumes dis_pos is accurate or past eof */
+void fix_pos(void)
+{
+ int my_col = col;
+
+ if ((size_t)line > current_len)
+ line = (int)current_len;
+ file_pos = line_pos(line, &my_col);
+ if (file_pos == CORD_NOT_FOUND) {
+ for (line = current_map -> line, file_pos = current_map -> pos;
+ file_pos < current_len;
+ line++, file_pos = CORD_chr(current, file_pos, '\n') + 1);
+ line--;
+ file_pos = line_pos(line, &col);
+ } else {
+ col = my_col;
+ }
+}
+
+#if defined(WIN32)
+# define beep() Beep(1000 /* Hz */, 300 /* ms */)
+#elif defined(MACINTOSH)
+# define beep() SysBeep(1)
+#else
+/*
+ * beep() is part of some curses packages and not others.
+ * We try to match the type of the builtin one, if any.
+ */
+ int beep(void)
+ {
+ putc('\007', stderr);
+ return(0);
+ }
+#endif /* !WIN32 && !MACINTOSH */
+
+# define NO_PREFIX -1
+# define BARE_PREFIX -2
+int repeat_count = NO_PREFIX; /* Current command prefix. */
+
+int locate_mode = 0; /* Currently between 2 ^Ls */
+CORD locate_string = CORD_EMPTY; /* Current search string. */
+
+char * arg_file_name;
+
+#ifdef WIN32
+/* Change the current position to whatever is currently displayed at */
+/* the given SCREEN coordinates. */
+void set_position(int c, int l)
+{
+ line = l + dis_line;
+ col = c + dis_col;
+ fix_pos();
+ move_cursor(col - dis_col, line - dis_line);
+}
+#endif /* WIN32 */
+
+/* Perform the command associated with character c. C may be an */
+/* integer > 256 denoting a windows command, one of the above control */
+/* characters, or another ASCII character to be used as either a */
+/* character to be inserted, a repeat count, or a search string, */
+/* depending on the current state. */
+void do_command(int c)
+{
+ int i;
+ int need_fix_pos;
+ FILE * out;
+
+ if ( c == '\r') c = '\n';
+ if (locate_mode) {
+ size_t new_pos;
+
+ if (c == LOCATE) {
+ locate_mode = 0;
+ locate_string = CORD_EMPTY;
+ return;
+ }
+ locate_string = CORD_cat_char(locate_string, (char)c);
+ new_pos = CORD_str(current, file_pos - CORD_len(locate_string) + 1,
+ locate_string);
+ if (new_pos != CORD_NOT_FOUND) {
+ need_redisplay = ALL;
+ new_pos += CORD_len(locate_string);
+ for (;;) {
+ file_pos = line_pos(line + 1, 0);
+ if (file_pos > new_pos) break;
+ line++;
+ }
+ col = (int)(new_pos - line_pos(line, 0));
+ file_pos = new_pos;
+ fix_cursor();
+ } else {
+ locate_string = CORD_substr(locate_string, 0,
+ CORD_len(locate_string) - 1);
+ beep();
+ }
+ return;
+ }
+ if (c == REPEAT) {
+ repeat_count = BARE_PREFIX; return;
+ } else if (c < 0x100 && isdigit(c)){
+ if (repeat_count == BARE_PREFIX) {
+ repeat_count = c - '0'; return;
+ } else if (repeat_count != NO_PREFIX) {
+ repeat_count = 10 * repeat_count + c - '0'; return;
+ }
+ }
+ if (repeat_count == NO_PREFIX) repeat_count = 1;
+ if (repeat_count == BARE_PREFIX && (c == UP || c == DOWN)) {
+ repeat_count = LINES - dis_granularity;
+ }
+ if (repeat_count == BARE_PREFIX) repeat_count = 8;
+ need_fix_pos = 0;
+ for (i = 0; i < repeat_count; i++) {
+ switch(c) {
+ case LOCATE:
+ locate_mode = 1;
+ break;
+ case TOP:
+ line = col = 0;
+ file_pos = 0;
+ break;
+ case UP:
+ if (line != 0) {
+ line--;
+ need_fix_pos = 1;
+ }
+ break;
+ case DOWN:
+ line++;
+ need_fix_pos = 1;
+ break;
+ case LEFT:
+ if (col != 0) {
+ col--; file_pos--;
+ }
+ break;
+ case RIGHT:
+ if (CORD_fetch(current, file_pos) == '\n') break;
+ col++; file_pos++;
+ break;
+ case UNDO:
+ del_hist();
+ need_redisplay = ALL; need_fix_pos = 1;
+ break;
+ case BS:
+ if (col == 0) {
+ beep();
+ break;
+ }
+ col--; file_pos--;
+ /* FALLTHRU */
+ case DEL:
+ if (file_pos == current_len-1) break;
+ /* Can't delete trailing newline */
+ if (CORD_fetch(current, file_pos) == '\n') {
+ need_redisplay = ALL; need_fix_pos = 1;
+ } else {
+ need_redisplay = line - dis_line;
+ }
+ add_hist(CORD_cat(
+ CORD_substr(current, 0, file_pos),
+ CORD_substr(current, file_pos+1, current_len)));
+ invalidate_map(line);
+ break;
+ case WRITE:
+ {
+ CORD name = CORD_cat(CORD_from_char_star(arg_file_name),
+ ".new");
+
+ if ((out = fopen(CORD_to_const_char_star(name), "wb")) == NULL
+ || CORD_put(current, out) == EOF) {
+ de_error("Write failed\n");
+ need_redisplay = ALL;
+ } else {
+ fclose(out);
+ }
+ }
+ break;
+ default:
+ {
+ CORD left_part = CORD_substr(current, 0, file_pos);
+ CORD right_part = CORD_substr(current, file_pos, current_len);
+
+ add_hist(CORD_cat(CORD_cat_char(left_part, (char)c),
+ right_part));
+ invalidate_map(line);
+ if (c == '\n') {
+ col = 0; line++; file_pos++;
+ need_redisplay = ALL;
+ } else {
+ col++; file_pos++;
+ need_redisplay = line - dis_line;
+ }
+ break;
+ }
+ }
+ }
+ if (need_fix_pos) fix_pos();
+ fix_cursor();
+ repeat_count = NO_PREFIX;
+}
+
+/* OS independent initialization */
+
+void generic_init(void)
+{
+ FILE * f;
+ CORD initial;
+
+ if ((f = fopen(arg_file_name, "rb")) == NULL) {
+ initial = "\n";
+ } else {
+ size_t len;
+
+ initial = CORD_from_file(f);
+ len = CORD_len(initial);
+ if (0 == len || CORD_fetch(initial, len - 1) != '\n') {
+ initial = CORD_cat(initial, "\n");
+ }
+ }
+ add_map(0,0);
+ add_hist(initial);
+ now -> map = current_map;
+ now -> previous = now; /* Can't back up further: beginning of the world */
+ GC_END_STUBBORN_CHANGE(now);
+ need_redisplay = ALL;
+ fix_cursor();
+}
+
+#ifndef WIN32
+
+int main(int argc, char **argv)
+{
+ int c;
+ void *buf;
+
+# if defined(MACINTOSH)
+ console_options.title = "\pDumb Editor";
+ cshow(stdout);
+ argc = ccommand(&argv);
+# endif
+ GC_set_find_leak(0); /* app is not for testing leak detection mode */
+ GC_INIT();
+# ifndef NO_INCREMENTAL
+ GC_enable_incremental();
+# endif
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s file\n", argv[0]);
+ fprintf(stderr, "Cursor keys: ^B(left) ^F(right) ^P(up) ^N(down)\n");
+ fprintf(stderr, "Undo: ^U Write to <file>.new: ^W");
+ fprintf(stderr, "Quit:^D Repeat count: ^R[n]\n");
+ fprintf(stderr, "Top: ^T Locate (search, find): ^L text ^L\n");
+ exit(1);
+ }
+ arg_file_name = argv[1];
+ buf = GC_MALLOC_ATOMIC(8192);
+ if (NULL == buf) OUT_OF_MEMORY;
+ setvbuf(stdout, (char *)buf, _IOFBF, 8192);
+ initscr();
+ noecho(); nonl(); cbreak();
+ generic_init();
+ while ((c = getchar()) != QUIT) {
+ if (c == EOF) break;
+ do_command(c);
+ }
+ move(LINES-1, 0);
+ clrtoeol();
+ refresh();
+ nl();
+ echo();
+ endwin();
+ return 0;
+}
+
+#endif /* !WIN32 */
diff --git a/graphics/asymptote/gc/cord/tests/de_cmds.h b/graphics/asymptote/gc/cord/tests/de_cmds.h
new file mode 100644
index 0000000000..2a69594ef0
--- /dev/null
+++ b/graphics/asymptote/gc/cord/tests/de_cmds.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef DE_CMDS_H
+
+# define DE_CMDS_H
+
+# define UP 16 /* ^P */
+# define DOWN 14 /* ^N */
+# define LEFT 2 /* ^B */
+# define RIGHT 6 /* ^F */
+# define DEL 127 /* ^? */
+# define BS 8 /* ^H */
+# define UNDO 21 /* ^U */
+# define WRITE 23 /* ^W */
+# define QUIT 4 /* ^D */
+# define REPEAT 18 /* ^R */
+# define LOCATE 12 /* ^L */
+# define TOP 20 /* ^T */
+
+#endif
diff --git a/graphics/asymptote/gc/cord/tests/de_win.c b/graphics/asymptote/gc/cord/tests/de_win.c
new file mode 100644
index 0000000000..45425ae6be
--- /dev/null
+++ b/graphics/asymptote/gc/cord/tests/de_win.c
@@ -0,0 +1,387 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * The Windows specific part of de.
+ * This started as the generic Windows application template
+ * but significant parts didn't survive to the final version.
+ */
+#if defined(__BORLANDC__) || defined(__CYGWIN__) || defined(__MINGW32__) \
+ || defined(__NT__) || defined(_WIN32) || defined(WIN32)
+
+#ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+#endif
+#define NOSERVICE
+#include <windows.h>
+
+#include <ctype.h>
+
+#include "gc.h"
+#include "cord.h"
+#include "de_cmds.h"
+#include "de_win.h"
+
+int LINES = 0;
+int COLS = 0;
+
+#define szAppName TEXT("DE")
+
+HWND hwnd;
+
+void de_error(const char *s)
+{
+ (void)MessageBoxA(hwnd, s, "Demonstration Editor",
+ MB_ICONINFORMATION | MB_OK);
+ InvalidateRect(hwnd, NULL, TRUE);
+}
+
+int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
+ LPSTR command_line, int nCmdShow)
+{
+ MSG msg;
+ WNDCLASS wndclass;
+ HACCEL hAccel;
+
+ GC_set_find_leak(0);
+ GC_INIT();
+# ifndef NO_INCREMENTAL
+ GC_enable_incremental();
+# endif
+# if defined(CPPCHECK)
+ GC_noop1((GC_word)&WinMain);
+# endif
+
+ if (!hPrevInstance)
+ {
+ wndclass.style = CS_HREDRAW | CS_VREDRAW;
+ wndclass.lpfnWndProc = WndProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = DLGWINDOWEXTRA;
+ wndclass.hInstance = hInstance;
+ wndclass.hIcon = LoadIcon (hInstance, szAppName);
+ wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
+ wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+ wndclass.lpszMenuName = TEXT("DE");
+ wndclass.lpszClassName = szAppName;
+
+ if (RegisterClass (&wndclass) == 0) {
+ de_error("RegisterClass error");
+ return(0);
+ }
+ }
+
+ /* Empirically, the command line does not include the command name ...
+ if (command_line != 0) {
+ while (isspace(*command_line)) command_line++;
+ while (*command_line != 0 && !isspace(*command_line)) command_line++;
+ while (isspace(*command_line)) command_line++;
+ } */
+
+ if (command_line == 0 || *command_line == 0) {
+ de_error("File name argument required");
+ return( 0 );
+ } else {
+ char *p = command_line;
+
+ while (*p != 0 && !isspace(*(unsigned char *)p))
+ p++;
+ arg_file_name = CORD_to_char_star(
+ CORD_substr(command_line, 0, p - command_line));
+ }
+
+ hwnd = CreateWindow (szAppName,
+ TEXT("Demonstration Editor"),
+ WS_OVERLAPPEDWINDOW | WS_CAPTION, /* Window style */
+ CW_USEDEFAULT, 0, /* default pos. */
+ CW_USEDEFAULT, 0, /* default width, height */
+ NULL, /* No parent */
+ NULL, /* Window class menu */
+ hInstance, NULL);
+ if (hwnd == NULL) {
+ de_error("CreateWindow error");
+ return(0);
+ }
+
+ ShowWindow (hwnd, nCmdShow);
+
+ hAccel = LoadAccelerators( hInstance, szAppName );
+
+ while (GetMessage (&msg, NULL, 0, 0))
+ {
+ if( !TranslateAccelerator( hwnd, hAccel, &msg ) )
+ {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+ }
+ return (int)msg.wParam;
+}
+
+/* Return the argument with all control characters replaced by blanks. */
+char * plain_chars(char * text, size_t len)
+{
+ char * result = (char *)GC_MALLOC_ATOMIC(len + 1);
+ size_t i;
+
+ if (NULL == result) return NULL;
+ for (i = 0; i < len; i++) {
+ if (iscntrl(((unsigned char *)text)[i])) {
+ result[i] = ' ';
+ } else {
+ result[i] = text[i];
+ }
+ }
+ result[len] = '\0';
+ return(result);
+}
+
+/* Return the argument with all non-control-characters replaced by */
+/* blank, and all control characters c replaced by c + 64. */
+char * control_chars(char * text, size_t len)
+{
+ char * result = (char *)GC_MALLOC_ATOMIC(len + 1);
+ size_t i;
+
+ if (NULL == result) return NULL;
+ for (i = 0; i < len; i++) {
+ if (iscntrl(((unsigned char *)text)[i])) {
+ result[i] = (char)(text[i] + 0x40);
+ } else {
+ result[i] = ' ';
+ }
+ }
+ result[len] = '\0';
+ return(result);
+}
+
+int char_width;
+int char_height;
+
+void get_line_rect(int line_arg, int win_width, RECT * rectp)
+{
+ rectp -> top = line_arg * (LONG)char_height;
+ rectp -> bottom = rectp->top + char_height;
+ rectp -> left = 0;
+ rectp -> right = win_width;
+}
+
+int caret_visible = 0; /* Caret is currently visible. */
+
+int screen_was_painted = 0;/* Screen has been painted at least once. */
+
+void update_cursor(void);
+
+INT_PTR CALLBACK AboutBoxCallback( HWND hDlg, UINT message,
+ WPARAM wParam, LPARAM lParam )
+{
+ (void)lParam;
+ switch( message )
+ {
+ case WM_INITDIALOG:
+ SetFocus( GetDlgItem( hDlg, IDOK ) );
+ break;
+
+ case WM_COMMAND:
+ switch( wParam )
+ {
+ case IDOK:
+ EndDialog( hDlg, TRUE );
+ break;
+ }
+ break;
+
+ case WM_CLOSE:
+ EndDialog( hDlg, TRUE );
+ return TRUE;
+
+ }
+ return FALSE;
+}
+
+LRESULT CALLBACK WndProc (HWND hwnd_arg, UINT message,
+ WPARAM wParam, LPARAM lParam)
+{
+ static HINSTANCE hInstance;
+ HDC dc;
+ PAINTSTRUCT ps;
+ RECT client_area;
+ RECT this_line;
+ RECT dummy;
+ TEXTMETRIC tm;
+ int i;
+ int id;
+
+ switch (message)
+ {
+ case WM_CREATE:
+ hInstance = ( (LPCREATESTRUCT) lParam)->hInstance;
+ dc = GetDC(hwnd_arg);
+ SelectObject(dc, GetStockObject(SYSTEM_FIXED_FONT));
+ GetTextMetrics(dc, &tm);
+ ReleaseDC(hwnd_arg, dc);
+ char_width = tm.tmAveCharWidth;
+ char_height = tm.tmHeight + tm.tmExternalLeading;
+ GetClientRect(hwnd_arg, &client_area);
+ COLS = (client_area.right - client_area.left)/char_width;
+ LINES = (client_area.bottom - client_area.top)/char_height;
+ generic_init();
+ return(0);
+
+ case WM_CHAR:
+ if (wParam == QUIT) {
+ SendMessage(hwnd_arg, WM_CLOSE, 0, 0L);
+ } else {
+ do_command((int)wParam);
+ }
+ return(0);
+
+ case WM_SETFOCUS:
+ CreateCaret(hwnd_arg, NULL, char_width, char_height);
+ ShowCaret(hwnd_arg);
+ caret_visible = 1;
+ update_cursor();
+ return(0);
+
+ case WM_KILLFOCUS:
+ HideCaret(hwnd_arg);
+ DestroyCaret();
+ caret_visible = 0;
+ return(0);
+
+ case WM_LBUTTONUP:
+ {
+ unsigned xpos = LOWORD(lParam); /* From left */
+ unsigned ypos = HIWORD(lParam); /* from top */
+
+ set_position(xpos / (unsigned)char_width,
+ ypos / (unsigned)char_height);
+ return(0);
+ }
+
+ case WM_COMMAND:
+ id = LOWORD(wParam);
+ if (id & EDIT_CMD_FLAG) {
+ if (id & REPEAT_FLAG) do_command(REPEAT);
+ do_command(CHAR_CMD(id));
+ return( 0 );
+ } else {
+ switch(id) {
+ case IDM_FILEEXIT:
+ SendMessage(hwnd_arg, WM_CLOSE, 0, 0L);
+ return( 0 );
+
+ case IDM_HELPABOUT:
+ if( DialogBox( hInstance, TEXT("ABOUTBOX"),
+ hwnd_arg, AboutBoxCallback ) )
+ InvalidateRect(hwnd_arg, NULL, TRUE);
+ return( 0 );
+ case IDM_HELPCONTENTS:
+ de_error(
+ "Cursor keys: ^B(left) ^F(right) ^P(up) ^N(down)\n"
+ "Undo: ^U Write: ^W Quit:^D Repeat count: ^R[n]\n"
+ "Top: ^T Locate (search, find): ^L text ^L\n");
+ return( 0 );
+ }
+ }
+ break;
+
+ case WM_CLOSE:
+ DestroyWindow(hwnd_arg);
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage (0);
+ GC_win32_free_heap();
+ return 0;
+
+ case WM_PAINT:
+ dc = BeginPaint(hwnd_arg, &ps);
+ GetClientRect(hwnd_arg, &client_area);
+ COLS = (client_area.right - client_area.left)/char_width;
+ LINES = (client_area.bottom - client_area.top)/char_height;
+ SelectObject(dc, GetStockObject(SYSTEM_FIXED_FONT));
+ for (i = 0; i < LINES; i++) {
+ get_line_rect(i, client_area.right, &this_line);
+ if (IntersectRect(&dummy, &this_line, &ps.rcPaint)) {
+ CORD raw_line = retrieve_screen_line(i);
+ size_t len = CORD_len(raw_line);
+ char * text = CORD_to_char_star(raw_line);
+ /* May contain embedded NULLs */
+ char * plain = plain_chars(text, len);
+ char * blanks = CORD_to_char_star(CORD_chars(' ',
+ COLS - len));
+ char * control = control_chars(text, len);
+ if (NULL == plain || NULL == control)
+ de_error("Out of memory!");
+
+# define RED RGB(255,0,0)
+
+ SetBkMode(dc, OPAQUE);
+ SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT));
+
+ if (plain != NULL)
+ TextOutA(dc, this_line.left, this_line.top,
+ plain, (int)len);
+ TextOutA(dc, this_line.left + (int)len * char_width,
+ this_line.top,
+ blanks, (int)(COLS - len));
+ SetBkMode(dc, TRANSPARENT);
+ SetTextColor(dc, RED);
+ if (control != NULL)
+ TextOutA(dc, this_line.left, this_line.top,
+ control, (int)strlen(control));
+ }
+ }
+ EndPaint(hwnd_arg, &ps);
+ screen_was_painted = 1;
+ return 0;
+ }
+ return DefWindowProc(hwnd_arg, message, wParam, lParam);
+}
+
+int last_col;
+int last_line;
+
+void move_cursor(int c, int l)
+{
+ last_col = c;
+ last_line = l;
+
+ if (caret_visible) update_cursor();
+}
+
+void update_cursor(void)
+{
+ SetCaretPos(last_col * char_width, last_line * char_height);
+ ShowCaret(hwnd);
+}
+
+void invalidate_line(int i)
+{
+ RECT line_r;
+
+ if (!screen_was_painted) return;
+ /* Invalidating a rectangle before painting seems result in a */
+ /* major performance problem. */
+ get_line_rect(i, COLS*char_width, &line_r);
+ InvalidateRect(hwnd, &line_r, FALSE);
+}
+
+#else
+
+ extern int GC_quiet;
+ /* ANSI C doesn't allow translation units to be empty. */
+ /* So we guarantee this one is nonempty. */
+
+#endif /* !WIN32 */
diff --git a/graphics/asymptote/gc/cord/tests/de_win.h b/graphics/asymptote/gc/cord/tests/de_win.h
new file mode 100644
index 0000000000..4a50780825
--- /dev/null
+++ b/graphics/asymptote/gc/cord/tests/de_win.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* cord.h, de_cmds.h, and windows.h should be included before this. */
+
+# define OTHER_FLAG 0x100
+# define EDIT_CMD_FLAG 0x200
+# define REPEAT_FLAG 0x400
+
+# define CHAR_CMD(i) ((i) & 0xff)
+
+/* MENU: DE */
+#define IDM_FILESAVE (EDIT_CMD_FLAG + WRITE)
+#define IDM_FILEEXIT (OTHER_FLAG + 1)
+#define IDM_HELPABOUT (OTHER_FLAG + 2)
+#define IDM_HELPCONTENTS (OTHER_FLAG + 3)
+
+#define IDM_EDITPDOWN (REPEAT_FLAG + EDIT_CMD_FLAG + DOWN)
+#define IDM_EDITPUP (REPEAT_FLAG + EDIT_CMD_FLAG + UP)
+#define IDM_EDITUNDO (EDIT_CMD_FLAG + UNDO)
+#define IDM_EDITLOCATE (EDIT_CMD_FLAG + LOCATE)
+#define IDM_EDITDOWN (EDIT_CMD_FLAG + DOWN)
+#define IDM_EDITUP (EDIT_CMD_FLAG + UP)
+#define IDM_EDITLEFT (EDIT_CMD_FLAG + LEFT)
+#define IDM_EDITRIGHT (EDIT_CMD_FLAG + RIGHT)
+#define IDM_EDITBS (EDIT_CMD_FLAG + BS)
+#define IDM_EDITDEL (EDIT_CMD_FLAG + DEL)
+#define IDM_EDITREPEAT (EDIT_CMD_FLAG + REPEAT)
+#define IDM_EDITTOP (EDIT_CMD_FLAG + TOP)
+
+
+
+
+/* Windows UI stuff */
+
+LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
+ WPARAM wParam, LPARAM lParam);
+
+/* Screen dimensions. Maintained by de_win.c. */
+extern int LINES;
+extern int COLS;
+
+/* File being edited. */
+extern char * arg_file_name;
+
+/* Current display position in file. Maintained by de.c */
+extern int dis_line;
+extern int dis_col;
+
+/* Current cursor position in file. */
+extern int line;
+extern int col;
+
+/*
+ * Calls from de_win.c to de.c
+ */
+
+CORD retrieve_screen_line(int i);
+ /* Get the contents of i'th screen line. */
+ /* Relies on COLS. */
+
+void set_position(int x, int y);
+ /* Set column, row. Upper left of window = (0,0). */
+
+void do_command(int);
+ /* Execute an editor command. */
+ /* Argument is a command character or one */
+ /* of the IDM_ commands. */
+
+void generic_init(void);
+ /* OS independent initialization */
+
+
+/*
+ * Calls from de.c to de_win.c
+ */
+
+void move_cursor(int column, int line);
+ /* Physically move the cursor on the display, */
+ /* so that it appears at */
+ /* (column, line). */
+
+void invalidate_line(int line);
+ /* Invalidate line i on the screen. */
+
+void de_error(const char *s);
+ /* Display error message. */
diff --git a/graphics/asymptote/gc/cord/tests/de_win.rc b/graphics/asymptote/gc/cord/tests/de_win.rc
new file mode 100644
index 0000000000..746a73dd22
--- /dev/null
+++ b/graphics/asymptote/gc/cord/tests/de_win.rc
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "windows.h"
+#include "de_cmds.h"
+#include "de_win.h"
+
+ABOUTBOX DIALOG 19, 21, 163, 47
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "About Demonstration Text Editor"
+BEGIN
+ LTEXT "Demonstration Text Editor", -1, 44, 8, 118, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
+ PUSHBUTTON "OK", IDOK, 118, 27, 24, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+END
+
+DE MENU
+BEGIN
+ POPUP "&File"
+ BEGIN
+ MENUITEM "&Save\t^W", IDM_FILESAVE
+ MENUITEM "E&xit\t^D", IDM_FILEEXIT
+ END
+
+ POPUP "&Edit"
+ BEGIN
+ MENUITEM "Page &Down\t^R^N", IDM_EDITPDOWN
+ MENUITEM "Page &Up\t^R^P", IDM_EDITPUP
+ MENUITEM "U&ndo\t^U", IDM_EDITUNDO
+ MENUITEM "&Locate\t^L ... ^L", IDM_EDITLOCATE
+ MENUITEM "D&own\t^N", IDM_EDITDOWN
+ MENUITEM "U&p\t^P", IDM_EDITUP
+ MENUITEM "Le&ft\t^B", IDM_EDITLEFT
+ MENUITEM "&Right\t^F", IDM_EDITRIGHT
+ MENUITEM "Delete &Backward\tBS", IDM_EDITBS
+ MENUITEM "Delete F&orward\tDEL", IDM_EDITDEL
+ MENUITEM "&Top\t^T", IDM_EDITTOP
+ END
+
+ POPUP "&Help"
+ BEGIN
+ MENUITEM "&Contents", IDM_HELPCONTENTS
+ MENUITEM "&About...", IDM_HELPABOUT
+ END
+
+ MENUITEM "Page_&Down", IDM_EDITPDOWN
+ MENUITEM "Page_&Up", IDM_EDITPUP
+END
+
+DE ACCELERATORS
+BEGIN
+ "^R", IDM_EDITREPEAT
+ "^N", IDM_EDITDOWN
+ "^P", IDM_EDITUP
+ "^L", IDM_EDITLOCATE
+ "^B", IDM_EDITLEFT
+ "^F", IDM_EDITRIGHT
+ "^T", IDM_EDITTOP
+ VK_DELETE, IDM_EDITDEL, VIRTKEY
+ VK_BACK, IDM_EDITBS, VIRTKEY
+END
diff --git a/graphics/asymptote/gc/darwin_stop_world.c b/graphics/asymptote/gc/darwin_stop_world.c
new file mode 100644
index 0000000000..0605d78199
--- /dev/null
+++ b/graphics/asymptote/gc/darwin_stop_world.c
@@ -0,0 +1,785 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2010 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/pthread_support.h"
+
+/* This probably needs more porting work to ppc64. */
+
+#if defined(GC_DARWIN_THREADS)
+
+#include <sys/sysctl.h>
+#include <mach/machine.h>
+
+#if defined(ARM32) && defined(ARM_THREAD_STATE32)
+# include <CoreFoundation/CoreFoundation.h>
+#endif
+
+/* From "Inside Mac OS X - Mach-O Runtime Architecture" published by Apple
+ Page 49:
+ "The space beneath the stack pointer, where a new stack frame would normally
+ be allocated, is called the red zone. This area as shown in Figure 3-2 may
+ be used for any purpose as long as a new stack frame does not need to be
+ added to the stack."
+
+ Page 50: "If a leaf procedure's red zone usage would exceed 224 bytes, then
+ it must set up a stack frame just like routines that call other routines."
+*/
+#ifdef POWERPC
+# if CPP_WORDSZ == 32
+# define PPC_RED_ZONE_SIZE 224
+# elif CPP_WORDSZ == 64
+# define PPC_RED_ZONE_SIZE 320
+# endif
+#endif
+
+#ifndef DARWIN_DONT_PARSE_STACK
+
+typedef struct StackFrame {
+ unsigned long savedSP;
+ unsigned long savedCR;
+ unsigned long savedLR;
+ unsigned long reserved[2];
+ unsigned long savedRTOC;
+} StackFrame;
+
+GC_INNER ptr_t GC_FindTopOfStack(unsigned long stack_start)
+{
+ StackFrame *frame = (StackFrame *)stack_start;
+
+ if (stack_start == 0) {
+# ifdef POWERPC
+# if CPP_WORDSZ == 32
+ __asm__ __volatile__ ("lwz %0,0(r1)" : "=r" (frame));
+# else
+ __asm__ __volatile__ ("ld %0,0(r1)" : "=r" (frame));
+# endif
+# elif defined(ARM32)
+ volatile ptr_t sp_reg;
+ __asm__ __volatile__ ("mov %0, r7\n" : "=r" (sp_reg));
+ frame = (StackFrame *)sp_reg;
+# elif defined(AARCH64)
+ volatile ptr_t sp_reg;
+ __asm__ __volatile__ ("mov %0, x29\n" : "=r" (sp_reg));
+ frame = (StackFrame *)sp_reg;
+# else
+# if defined(CPPCHECK)
+ GC_noop1((word)&frame);
+# endif
+ ABORT("GC_FindTopOfStack(0) is not implemented");
+# endif
+ }
+
+# ifdef DEBUG_THREADS_EXTRA
+ GC_log_printf("FindTopOfStack start at sp= %p\n", (void *)frame);
+# endif
+ while (frame->savedSP != 0) { /* stop if no more stack frames */
+ unsigned long maskedLR;
+
+ frame = (StackFrame*)frame->savedSP;
+
+ /* we do these next two checks after going to the next frame
+ because the LR for the first stack frame in the loop
+ is not set up on purpose, so we shouldn't check it. */
+ maskedLR = frame -> savedLR & ~0x3UL;
+ if (0 == maskedLR || ~0x3UL == maskedLR)
+ break; /* if the next LR is bogus, stop */
+ }
+# ifdef DEBUG_THREADS_EXTRA
+ GC_log_printf("FindTopOfStack finish at sp= %p\n", (void *)frame);
+# endif
+ return (ptr_t)frame;
+}
+
+#endif /* !DARWIN_DONT_PARSE_STACK */
+
+/* GC_query_task_threads controls whether to obtain the list of */
+/* the threads from the kernel or to use GC_threads table. */
+#ifdef GC_NO_THREADS_DISCOVERY
+# define GC_query_task_threads FALSE
+#elif defined(GC_DISCOVER_TASK_THREADS)
+# define GC_query_task_threads TRUE
+#else
+ STATIC GC_bool GC_query_task_threads = FALSE;
+#endif /* !GC_NO_THREADS_DISCOVERY */
+
+/* Use implicit threads registration (all task threads excluding the GC */
+/* special ones are stopped and scanned). Should be called before */
+/* GC_INIT() (or, at least, before going multi-threaded). Deprecated. */
+GC_API void GC_CALL GC_use_threads_discovery(void)
+{
+# if defined(GC_NO_THREADS_DISCOVERY) || defined(DARWIN_DONT_PARSE_STACK)
+ ABORT("Darwin task-threads-based stop and push unsupported");
+# else
+# ifndef GC_ALWAYS_MULTITHREADED
+ GC_ASSERT(!GC_need_to_lock);
+# endif
+# ifndef GC_DISCOVER_TASK_THREADS
+ GC_query_task_threads = TRUE;
+# endif
+ GC_init_parallel(); /* just to be consistent with Win32 one */
+# endif
+}
+
+#ifndef kCFCoreFoundationVersionNumber_iOS_8_0
+# define kCFCoreFoundationVersionNumber_iOS_8_0 1140.1
+#endif
+
+/* Evaluates the stack range for a given thread. Returns the lower */
+/* bound and sets *phi to the upper one. */
+STATIC ptr_t GC_stack_range_for(ptr_t *phi, thread_act_t thread, GC_thread p,
+ GC_bool thread_blocked, mach_port_t my_thread,
+ ptr_t *paltstack_lo,
+ ptr_t *paltstack_hi GC_ATTR_UNUSED)
+{
+ ptr_t lo;
+ if (thread == my_thread) {
+ GC_ASSERT(!thread_blocked);
+ lo = GC_approx_sp();
+# ifndef DARWIN_DONT_PARSE_STACK
+ *phi = GC_FindTopOfStack(0);
+# endif
+
+ } else if (thread_blocked) {
+# if defined(CPPCHECK)
+ if (NULL == p) ABORT("Invalid GC_thread passed to GC_stack_range_for");
+# endif
+ lo = p->stop_info.stack_ptr;
+# ifndef DARWIN_DONT_PARSE_STACK
+ *phi = p->topOfStack;
+# endif
+
+ } else {
+ /* MACHINE_THREAD_STATE_COUNT does not seem to be defined */
+ /* everywhere. Hence we use our own version. Alternatively, */
+ /* we could use THREAD_STATE_MAX (but seems to be not optimal). */
+ kern_return_t kern_result;
+ GC_THREAD_STATE_T state;
+
+# if defined(ARM32) && defined(ARM_THREAD_STATE32)
+ /* Use ARM_UNIFIED_THREAD_STATE on iOS8+ 32-bit targets and on */
+ /* 64-bit H/W (iOS7+ 32-bit mode). */
+ size_t size;
+ static cpu_type_t cputype = 0;
+
+ if (cputype == 0) {
+ sysctlbyname("hw.cputype", &cputype, &size, NULL, 0);
+ }
+ if (cputype == CPU_TYPE_ARM64
+ || kCFCoreFoundationVersionNumber
+ >= kCFCoreFoundationVersionNumber_iOS_8_0) {
+ arm_unified_thread_state_t unified_state;
+ mach_msg_type_number_t unified_thread_state_count
+ = ARM_UNIFIED_THREAD_STATE_COUNT;
+# if defined(CPPCHECK)
+# define GC_ARM_UNIFIED_THREAD_STATE 1
+# else
+# define GC_ARM_UNIFIED_THREAD_STATE ARM_UNIFIED_THREAD_STATE
+# endif
+ kern_result = thread_get_state(thread, GC_ARM_UNIFIED_THREAD_STATE,
+ (natural_t *)&unified_state,
+ &unified_thread_state_count);
+# if !defined(CPPCHECK)
+ if (unified_state.ash.flavor != ARM_THREAD_STATE32) {
+ ABORT("unified_state flavor should be ARM_THREAD_STATE32");
+ }
+# endif
+ state = unified_state;
+ } else
+# endif
+ /* else */ {
+ mach_msg_type_number_t thread_state_count = GC_MACH_THREAD_STATE_COUNT;
+
+ /* Get the thread state (registers, etc.) */
+ do {
+ kern_result = thread_get_state(thread, GC_MACH_THREAD_STATE,
+ (natural_t *)&state,
+ &thread_state_count);
+ } while (kern_result == KERN_ABORTED);
+ }
+# ifdef DEBUG_THREADS
+ GC_log_printf("thread_get_state returns %d\n", kern_result);
+# endif
+ if (kern_result != KERN_SUCCESS)
+ ABORT("thread_get_state failed");
+
+# if defined(I386)
+ lo = (ptr_t)state.THREAD_FLD(esp);
+# ifndef DARWIN_DONT_PARSE_STACK
+ *phi = GC_FindTopOfStack(state.THREAD_FLD(esp));
+# endif
+ GC_push_one(state.THREAD_FLD(eax));
+ GC_push_one(state.THREAD_FLD(ebx));
+ GC_push_one(state.THREAD_FLD(ecx));
+ GC_push_one(state.THREAD_FLD(edx));
+ GC_push_one(state.THREAD_FLD(edi));
+ GC_push_one(state.THREAD_FLD(esi));
+ GC_push_one(state.THREAD_FLD(ebp));
+
+# elif defined(X86_64)
+ lo = (ptr_t)state.THREAD_FLD(rsp);
+# ifndef DARWIN_DONT_PARSE_STACK
+ *phi = GC_FindTopOfStack(state.THREAD_FLD(rsp));
+# endif
+ GC_push_one(state.THREAD_FLD(rax));
+ GC_push_one(state.THREAD_FLD(rbx));
+ GC_push_one(state.THREAD_FLD(rcx));
+ GC_push_one(state.THREAD_FLD(rdx));
+ GC_push_one(state.THREAD_FLD(rdi));
+ GC_push_one(state.THREAD_FLD(rsi));
+ GC_push_one(state.THREAD_FLD(rbp));
+ /* rsp is skipped. */
+ GC_push_one(state.THREAD_FLD(r8));
+ GC_push_one(state.THREAD_FLD(r9));
+ GC_push_one(state.THREAD_FLD(r10));
+ GC_push_one(state.THREAD_FLD(r11));
+ GC_push_one(state.THREAD_FLD(r12));
+ GC_push_one(state.THREAD_FLD(r13));
+ GC_push_one(state.THREAD_FLD(r14));
+ GC_push_one(state.THREAD_FLD(r15));
+
+# elif defined(POWERPC)
+ lo = (ptr_t)(state.THREAD_FLD(r1) - PPC_RED_ZONE_SIZE);
+# ifndef DARWIN_DONT_PARSE_STACK
+ *phi = GC_FindTopOfStack(state.THREAD_FLD(r1));
+# endif
+ GC_push_one(state.THREAD_FLD(r0));
+ /* r1 is skipped. */
+ GC_push_one(state.THREAD_FLD(r2));
+ GC_push_one(state.THREAD_FLD(r3));
+ GC_push_one(state.THREAD_FLD(r4));
+ GC_push_one(state.THREAD_FLD(r5));
+ GC_push_one(state.THREAD_FLD(r6));
+ GC_push_one(state.THREAD_FLD(r7));
+ GC_push_one(state.THREAD_FLD(r8));
+ GC_push_one(state.THREAD_FLD(r9));
+ GC_push_one(state.THREAD_FLD(r10));
+ GC_push_one(state.THREAD_FLD(r11));
+ GC_push_one(state.THREAD_FLD(r12));
+ GC_push_one(state.THREAD_FLD(r13));
+ GC_push_one(state.THREAD_FLD(r14));
+ GC_push_one(state.THREAD_FLD(r15));
+ GC_push_one(state.THREAD_FLD(r16));
+ GC_push_one(state.THREAD_FLD(r17));
+ GC_push_one(state.THREAD_FLD(r18));
+ GC_push_one(state.THREAD_FLD(r19));
+ GC_push_one(state.THREAD_FLD(r20));
+ GC_push_one(state.THREAD_FLD(r21));
+ GC_push_one(state.THREAD_FLD(r22));
+ GC_push_one(state.THREAD_FLD(r23));
+ GC_push_one(state.THREAD_FLD(r24));
+ GC_push_one(state.THREAD_FLD(r25));
+ GC_push_one(state.THREAD_FLD(r26));
+ GC_push_one(state.THREAD_FLD(r27));
+ GC_push_one(state.THREAD_FLD(r28));
+ GC_push_one(state.THREAD_FLD(r29));
+ GC_push_one(state.THREAD_FLD(r30));
+ GC_push_one(state.THREAD_FLD(r31));
+
+# elif defined(ARM32)
+ lo = (ptr_t)state.THREAD_FLD(sp);
+# ifndef DARWIN_DONT_PARSE_STACK
+ *phi = GC_FindTopOfStack(state.THREAD_FLD(r[7])); /* fp */
+# endif
+ {
+ int j;
+ for (j = 0; j < 7; j++)
+ GC_push_one(state.THREAD_FLD(r[j]));
+ j++; /* "r7" is skipped (iOS uses it as a frame pointer) */
+ for (; j <= 12; j++)
+ GC_push_one(state.THREAD_FLD(r[j]));
+ }
+ /* "cpsr", "pc" and "sp" are skipped */
+ GC_push_one(state.THREAD_FLD(lr));
+
+# elif defined(AARCH64)
+ lo = (ptr_t)state.THREAD_FLD(sp);
+# ifndef DARWIN_DONT_PARSE_STACK
+ *phi = GC_FindTopOfStack(state.THREAD_FLD(fp));
+# endif
+ {
+ int j;
+ for (j = 0; j <= 28; j++) {
+ GC_push_one(state.THREAD_FLD(x[j]));
+ }
+ }
+ /* "cpsr", "fp", "pc" and "sp" are skipped */
+ GC_push_one(state.THREAD_FLD(lr));
+
+# elif defined(CPPCHECK)
+ lo = NULL;
+# else
+# error FIXME for non-arm/ppc/x86 architectures
+# endif
+ } /* thread != my_thread */
+
+# ifdef DARWIN_DONT_PARSE_STACK
+ /* p is guaranteed to be non-NULL regardless of GC_query_task_threads. */
+ *phi = (p->flags & MAIN_THREAD) != 0 ? GC_stackbottom : p->stack_end;
+# endif
+
+ /* TODO: Determine p and handle altstack if !DARWIN_DONT_PARSE_STACK */
+# ifdef DARWIN_DONT_PARSE_STACK
+ if (p->altstack != NULL && (word)p->altstack <= (word)lo
+ && (word)lo <= (word)p->altstack + p->altstack_size) {
+ *paltstack_lo = lo;
+ *paltstack_hi = p->altstack + p->altstack_size;
+ lo = p->stack;
+ *phi = p->stack + p->stack_size;
+ } else
+# endif
+ /* else */ {
+ *paltstack_lo = NULL;
+ }
+# if defined(STACKPTR_CORRECTOR_AVAILABLE) && defined(DARWIN_DONT_PARSE_STACK)
+ if (GC_sp_corrector != 0)
+ GC_sp_corrector((void **)&lo, (void *)(p -> id));
+# endif
+# ifdef DEBUG_THREADS
+ GC_log_printf("Darwin: Stack for thread %p is [%p,%p)\n",
+ (void *)(word)thread, (void *)lo, (void *)(*phi));
+# endif
+ return lo;
+}
+
+GC_INNER void GC_push_all_stacks(void)
+{
+ ptr_t hi, altstack_lo, altstack_hi;
+ task_t my_task = current_task();
+ mach_port_t my_thread = mach_thread_self();
+ GC_bool found_me = FALSE;
+ int nthreads = 0;
+ word total_size = 0;
+ mach_msg_type_number_t listcount = (mach_msg_type_number_t)THREAD_TABLE_SZ;
+ if (!EXPECT(GC_thr_initialized, TRUE))
+ GC_thr_init();
+
+# ifndef DARWIN_DONT_PARSE_STACK
+ if (GC_query_task_threads) {
+ int i;
+ kern_return_t kern_result;
+ thread_act_array_t act_list = 0;
+
+ /* Obtain the list of the threads from the kernel. */
+ kern_result = task_threads(my_task, &act_list, &listcount);
+ if (kern_result != KERN_SUCCESS)
+ ABORT("task_threads failed");
+
+ for (i = 0; i < (int)listcount; i++) {
+ thread_act_t thread = act_list[i];
+ ptr_t lo = GC_stack_range_for(&hi, thread, NULL, FALSE, my_thread,
+ &altstack_lo, &altstack_hi);
+
+ if (lo) {
+ GC_ASSERT((word)lo <= (word)hi);
+ total_size += hi - lo;
+ GC_push_all_stack(lo, hi);
+ }
+ /* TODO: Handle altstack */
+ nthreads++;
+ if (thread == my_thread)
+ found_me = TRUE;
+ mach_port_deallocate(my_task, thread);
+ } /* for (i=0; ...) */
+
+ vm_deallocate(my_task, (vm_address_t)act_list,
+ sizeof(thread_t) * listcount);
+ } else
+# endif /* !DARWIN_DONT_PARSE_STACK */
+ /* else */ {
+ int i;
+
+ for (i = 0; i < (int)listcount; i++) {
+ GC_thread p;
+
+ for (p = GC_threads[i]; p != NULL; p = p->next)
+ if ((p->flags & FINISHED) == 0) {
+ thread_act_t thread = (thread_act_t)p->stop_info.mach_thread;
+ ptr_t lo = GC_stack_range_for(&hi, thread, p,
+ (GC_bool)p->thread_blocked,
+ my_thread, &altstack_lo,
+ &altstack_hi);
+
+ if (lo) {
+ GC_ASSERT((word)lo <= (word)hi);
+ total_size += hi - lo;
+ GC_push_all_stack_sections(lo, hi, p->traced_stack_sect);
+ }
+ if (altstack_lo) {
+ total_size += altstack_hi - altstack_lo;
+ GC_push_all_stack(altstack_lo, altstack_hi);
+ }
+ nthreads++;
+ if (thread == my_thread)
+ found_me = TRUE;
+ }
+ } /* for (i=0; ...) */
+ }
+
+ mach_port_deallocate(my_task, my_thread);
+ GC_VERBOSE_LOG_PRINTF("Pushed %d thread stacks\n", nthreads);
+ if (!found_me && !GC_in_thread_creation)
+ ABORT("Collecting from unknown thread");
+ GC_total_stacksize = total_size;
+}
+
+#ifndef GC_NO_THREADS_DISCOVERY
+
+# ifdef MPROTECT_VDB
+ STATIC mach_port_t GC_mach_handler_thread = 0;
+ STATIC GC_bool GC_use_mach_handler_thread = FALSE;
+
+ GC_INNER void GC_darwin_register_mach_handler_thread(mach_port_t thread)
+ {
+ GC_mach_handler_thread = thread;
+ GC_use_mach_handler_thread = TRUE;
+ }
+# endif /* MPROTECT_VDB */
+
+# ifndef GC_MAX_MACH_THREADS
+# define GC_MAX_MACH_THREADS THREAD_TABLE_SZ
+# endif
+
+ struct GC_mach_thread {
+ thread_act_t thread;
+ GC_bool suspended;
+ };
+
+ struct GC_mach_thread GC_mach_threads[GC_MAX_MACH_THREADS];
+ STATIC int GC_mach_threads_count = 0;
+ /* FIXME: it is better to implement GC_mach_threads as a hash set. */
+
+/* returns true if there's a thread in act_list that wasn't in old_list */
+STATIC GC_bool GC_suspend_thread_list(thread_act_array_t act_list, int count,
+ thread_act_array_t old_list,
+ int old_count, task_t my_task,
+ mach_port_t my_thread)
+{
+ int i;
+ int j = -1;
+ GC_bool changed = FALSE;
+
+ for (i = 0; i < count; i++) {
+ thread_act_t thread = act_list[i];
+ GC_bool found;
+ kern_return_t kern_result;
+
+ if (thread == my_thread
+# ifdef MPROTECT_VDB
+ || (GC_mach_handler_thread == thread && GC_use_mach_handler_thread)
+# endif
+# ifdef PARALLEL_MARK
+ || GC_is_mach_marker(thread) /* ignore the parallel markers */
+# endif
+ ) {
+ /* Do not add our one, parallel marker and the handler threads; */
+ /* consider it as found (e.g., it was processed earlier). */
+ mach_port_deallocate(my_task, thread);
+ continue;
+ }
+
+ /* find the current thread in the old list */
+ found = FALSE;
+ {
+ int last_found = j; /* remember the previous found thread index */
+
+ /* Search for the thread starting from the last found one first. */
+ while (++j < old_count)
+ if (old_list[j] == thread) {
+ found = TRUE;
+ break;
+ }
+ if (!found) {
+ /* If not found, search in the rest (beginning) of the list. */
+ for (j = 0; j < last_found; j++)
+ if (old_list[j] == thread) {
+ found = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (found) {
+ /* It is already in the list, skip processing, release mach port. */
+ mach_port_deallocate(my_task, thread);
+ continue;
+ }
+
+ /* add it to the GC_mach_threads list */
+ if (GC_mach_threads_count == GC_MAX_MACH_THREADS)
+ ABORT("Too many threads");
+ GC_mach_threads[GC_mach_threads_count].thread = thread;
+ /* default is not suspended */
+ GC_mach_threads[GC_mach_threads_count].suspended = FALSE;
+ changed = TRUE;
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Suspending %p\n", (void *)(word)thread);
+# endif
+ /* Unconditionally suspend the thread. It will do no */
+ /* harm if it is already suspended by the client logic. */
+ GC_acquire_dirty_lock();
+ do {
+ kern_result = thread_suspend(thread);
+ } while (kern_result == KERN_ABORTED);
+ GC_release_dirty_lock();
+ if (kern_result != KERN_SUCCESS) {
+ /* The thread may have quit since the thread_threads() call we */
+ /* mark already suspended so it's not dealt with anymore later. */
+ GC_mach_threads[GC_mach_threads_count].suspended = FALSE;
+ } else {
+ /* Mark the thread as suspended and require resume. */
+ GC_mach_threads[GC_mach_threads_count].suspended = TRUE;
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_SUSPENDED, (void *)(word)thread);
+ }
+ GC_mach_threads_count++;
+ }
+ return changed;
+}
+
+#endif /* !GC_NO_THREADS_DISCOVERY */
+
+/* Caller holds allocation lock. */
+GC_INNER void GC_stop_world(void)
+{
+ task_t my_task = current_task();
+ mach_port_t my_thread = mach_thread_self();
+ kern_return_t kern_result;
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Stopping the world from thread %p\n",
+ (void *)(word)my_thread);
+# endif
+ /* Make sure all free list construction has stopped before we */
+ /* start. No new construction can start, since free list */
+ /* construction is required to acquire and release the GC lock */
+ /* before it starts, and we have the lock. */
+
+# ifdef PARALLEL_MARK
+ if (GC_parallel) {
+ GC_acquire_mark_lock();
+ GC_ASSERT(GC_fl_builder_count == 0);
+ /* We should have previously waited for it to become zero. */
+ }
+# endif /* PARALLEL_MARK */
+
+ if (GC_query_task_threads) {
+# ifndef GC_NO_THREADS_DISCOVERY
+ GC_bool changed;
+ thread_act_array_t act_list, prev_list;
+ mach_msg_type_number_t listcount, prevcount;
+
+ /* Clear out the mach threads list table. We do not need to */
+ /* really clear GC_mach_threads[] as it is used only in the range */
+ /* from 0 to GC_mach_threads_count-1, inclusive. */
+ GC_mach_threads_count = 0;
+
+ /* Loop stopping threads until you have gone over the whole list */
+ /* twice without a new one appearing. thread_create() won't */
+ /* return (and thus the thread stop) until the new thread exists, */
+ /* so there is no window whereby you could stop a thread, */
+ /* recognize it is stopped, but then have a new thread it created */
+ /* before stopping show up later. */
+ changed = TRUE;
+ prev_list = NULL;
+ prevcount = 0;
+ do {
+ kern_result = task_threads(my_task, &act_list, &listcount);
+
+ if (kern_result == KERN_SUCCESS) {
+ changed = GC_suspend_thread_list(act_list, listcount, prev_list,
+ prevcount, my_task, my_thread);
+
+ if (prev_list != NULL) {
+ /* Thread ports are not deallocated by list, unused ports */
+ /* deallocated in GC_suspend_thread_list, used - kept in */
+ /* GC_mach_threads till GC_start_world as otherwise thread */
+ /* object change can occur and GC_start_world will not */
+ /* find the thread to resume which will cause app to hang. */
+ vm_deallocate(my_task, (vm_address_t)prev_list,
+ sizeof(thread_t) * prevcount);
+ }
+
+ /* Repeat while having changes. */
+ prev_list = act_list;
+ prevcount = listcount;
+ }
+ } while (changed);
+
+ GC_ASSERT(prev_list != 0);
+ /* The thread ports are not deallocated by list, see above. */
+ vm_deallocate(my_task, (vm_address_t)act_list,
+ sizeof(thread_t) * listcount);
+# endif /* !GC_NO_THREADS_DISCOVERY */
+
+ } else {
+ unsigned i;
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ GC_thread p;
+
+ for (p = GC_threads[i]; p != NULL; p = p->next) {
+ if ((p->flags & FINISHED) == 0 && !p->thread_blocked &&
+ p->stop_info.mach_thread != my_thread) {
+ GC_acquire_dirty_lock();
+ do {
+ kern_result = thread_suspend(p->stop_info.mach_thread);
+ } while (kern_result == KERN_ABORTED);
+ GC_release_dirty_lock();
+ if (kern_result != KERN_SUCCESS)
+ ABORT("thread_suspend failed");
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_SUSPENDED,
+ (void *)(word)p->stop_info.mach_thread);
+ }
+ }
+ }
+ }
+
+# ifdef MPROTECT_VDB
+ if (GC_auto_incremental) {
+ GC_mprotect_stop();
+ }
+# endif
+# ifdef PARALLEL_MARK
+ if (GC_parallel)
+ GC_release_mark_lock();
+# endif
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("World stopped from %p\n", (void *)(word)my_thread);
+# endif
+ mach_port_deallocate(my_task, my_thread);
+}
+
+GC_INLINE void GC_thread_resume(thread_act_t thread)
+{
+ kern_return_t kern_result;
+# if defined(DEBUG_THREADS) || defined(GC_ASSERTIONS)
+ struct thread_basic_info info;
+ mach_msg_type_number_t outCount = THREAD_BASIC_INFO_COUNT;
+
+# ifdef CPPCHECK
+ info.run_state = 0;
+# endif
+ kern_result = thread_info(thread, THREAD_BASIC_INFO,
+ (thread_info_t)&info, &outCount);
+ if (kern_result != KERN_SUCCESS)
+ ABORT("thread_info failed");
+# endif
+# ifdef DEBUG_THREADS
+ GC_log_printf("Resuming thread %p with state %d\n", (void *)(word)thread,
+ info.run_state);
+# endif
+ /* Resume the thread */
+ kern_result = thread_resume(thread);
+ if (kern_result != KERN_SUCCESS) {
+ WARN("thread_resume(%p) failed: mach port invalid\n", thread);
+ } else if (GC_on_thread_event) {
+ GC_on_thread_event(GC_EVENT_THREAD_UNSUSPENDED, (void *)(word)thread);
+ }
+}
+
+/* Caller holds allocation lock, and has held it continuously since */
+/* the world stopped. */
+GC_INNER void GC_start_world(void)
+{
+ task_t my_task = current_task();
+# ifdef DEBUG_THREADS
+ GC_log_printf("World starting\n");
+# endif
+# ifdef MPROTECT_VDB
+ if (GC_auto_incremental) {
+ GC_mprotect_resume();
+ }
+# endif
+
+ if (GC_query_task_threads) {
+# ifndef GC_NO_THREADS_DISCOVERY
+ int i, j;
+ kern_return_t kern_result;
+ thread_act_array_t act_list;
+ mach_msg_type_number_t listcount;
+
+ kern_result = task_threads(my_task, &act_list, &listcount);
+ if (kern_result != KERN_SUCCESS)
+ ABORT("task_threads failed");
+
+ j = (int)listcount;
+ for (i = 0; i < GC_mach_threads_count; i++) {
+ thread_act_t thread = GC_mach_threads[i].thread;
+
+ if (GC_mach_threads[i].suspended) {
+ int last_found = j; /* The thread index found during the */
+ /* previous iteration (count value */
+ /* means no thread found yet). */
+
+ /* Search for the thread starting from the last found one first. */
+ while (++j < (int)listcount) {
+ if (act_list[j] == thread)
+ break;
+ }
+ if (j >= (int)listcount) {
+ /* If not found, search in the rest (beginning) of the list. */
+ for (j = 0; j < last_found; j++) {
+ if (act_list[j] == thread)
+ break;
+ }
+ }
+ if (j != last_found) {
+ /* The thread is alive, resume it. */
+ GC_thread_resume(thread);
+ }
+ } else {
+ /* This thread was failed to be suspended by GC_stop_world, */
+ /* no action needed. */
+# ifdef DEBUG_THREADS
+ GC_log_printf("Not resuming thread %p as it is not suspended\n",
+ (void *)(word)thread);
+# endif
+ }
+ mach_port_deallocate(my_task, thread);
+ }
+
+ for (i = 0; i < (int)listcount; i++)
+ mach_port_deallocate(my_task, act_list[i]);
+ vm_deallocate(my_task, (vm_address_t)act_list,
+ sizeof(thread_t) * listcount);
+# endif /* !GC_NO_THREADS_DISCOVERY */
+
+ } else {
+ int i;
+ mach_port_t my_thread = mach_thread_self();
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ GC_thread p;
+ for (p = GC_threads[i]; p != NULL; p = p->next) {
+ if ((p->flags & FINISHED) == 0 && !p->thread_blocked &&
+ p->stop_info.mach_thread != my_thread)
+ GC_thread_resume(p->stop_info.mach_thread);
+ }
+ }
+
+ mach_port_deallocate(my_task, my_thread);
+ }
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("World started\n");
+# endif
+}
+
+#endif /* GC_DARWIN_THREADS */
diff --git a/graphics/asymptote/gc/dbg_mlc.c b/graphics/asymptote/gc/dbg_mlc.c
new file mode 100644
index 0000000000..2c3c35676b
--- /dev/null
+++ b/graphics/asymptote/gc/dbg_mlc.c
@@ -0,0 +1,1210 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1997 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
+ * Copyright (C) 2007 Free Software Foundation, Inc
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/dbg_mlc.h"
+
+#ifndef MSWINCE
+# include <errno.h>
+#endif
+#include <string.h>
+
+#ifndef SHORT_DBG_HDRS
+ /* Check whether object with base pointer p has debugging info. */
+ /* p is assumed to point to a legitimate object in our part */
+ /* of the heap. */
+ /* This excludes the check as to whether the back pointer is */
+ /* odd, which is added by the GC_HAS_DEBUG_INFO macro. */
+ /* Note that if DBG_HDRS_ALL is set, uncollectible objects */
+ /* on free lists may not have debug information set. Thus it's */
+ /* not always safe to return TRUE (1), even if the client does */
+ /* its part. Return -1 if the object with debug info has been */
+ /* marked as deallocated. */
+ GC_INNER int GC_has_other_debug_info(ptr_t p)
+ {
+ ptr_t body = (ptr_t)((oh *)p + 1);
+ word sz = GC_size(p);
+
+ if (HBLKPTR(p) != HBLKPTR((ptr_t)body)
+ || sz < DEBUG_BYTES + EXTRA_BYTES) {
+ return 0;
+ }
+ if (((oh *)p) -> oh_sf != (START_FLAG ^ (word)body)
+ && ((word *)p)[BYTES_TO_WORDS(sz)-1] != (END_FLAG ^ (word)body)) {
+ return 0;
+ }
+ if (((oh *)p)->oh_sz == sz) {
+ /* Object may have had debug info, but has been deallocated */
+ return -1;
+ }
+ return 1;
+ }
+#endif /* !SHORT_DBG_HDRS */
+
+#ifdef KEEP_BACK_PTRS
+
+ /* Use a custom trivial random() implementation as the standard */
+ /* one might lead to crashes (if used from a multi-threaded code) */
+ /* or to a compiler warning about the deterministic result. */
+ static int GC_rand(void)
+ {
+ static GC_RAND_STATE_T seed;
+
+ return GC_RAND_NEXT(&seed);
+ }
+
+# define RANDOM() (long)GC_rand()
+
+ /* Store back pointer to source in dest, if that appears to be possible. */
+ /* This is not completely safe, since we may mistakenly conclude that */
+ /* dest has a debugging wrapper. But the error probability is very */
+ /* small, and this shouldn't be used in production code. */
+ /* We assume that dest is the real base pointer. Source will usually */
+ /* be a pointer to the interior of an object. */
+ GC_INNER void GC_store_back_pointer(ptr_t source, ptr_t dest)
+ {
+ if (GC_HAS_DEBUG_INFO(dest)) {
+# ifdef PARALLEL_MARK
+ AO_store((volatile AO_t *)&((oh *)dest)->oh_back_ptr,
+ (AO_t)HIDE_BACK_PTR(source));
+# else
+ ((oh *)dest) -> oh_back_ptr = HIDE_BACK_PTR(source);
+# endif
+ }
+ }
+
+ GC_INNER void GC_marked_for_finalization(ptr_t dest)
+ {
+ GC_store_back_pointer(MARKED_FOR_FINALIZATION, dest);
+ }
+
+ /* Store information about the object referencing dest in *base_p */
+ /* and *offset_p. */
+ /* source is root ==> *base_p = address, *offset_p = 0 */
+ /* source is heap object ==> *base_p != 0, *offset_p = offset */
+ /* Dest can be any address within a heap object. */
+ GC_API GC_ref_kind GC_CALL GC_get_back_ptr_info(void *dest, void **base_p,
+ size_t *offset_p)
+ {
+ oh * hdr = (oh *)GC_base(dest);
+ ptr_t bp;
+ ptr_t bp_base;
+
+# ifdef LINT2
+ /* Explicitly instruct the code analysis tool that */
+ /* GC_get_back_ptr_info is not expected to be called with an */
+ /* incorrect "dest" value. */
+ if (!hdr) ABORT("Invalid GC_get_back_ptr_info argument");
+# endif
+ if (!GC_HAS_DEBUG_INFO((ptr_t) hdr)) return GC_NO_SPACE;
+ bp = (ptr_t)GC_REVEAL_POINTER(hdr -> oh_back_ptr);
+ if (MARKED_FOR_FINALIZATION == bp) return GC_FINALIZER_REFD;
+ if (MARKED_FROM_REGISTER == bp) return GC_REFD_FROM_REG;
+ if (NOT_MARKED == bp) return GC_UNREFERENCED;
+# if ALIGNMENT == 1
+ /* Heuristically try to fix off by 1 errors we introduced by */
+ /* insisting on even addresses. */
+ {
+ ptr_t alternate_ptr = bp + 1;
+ ptr_t target = *(ptr_t *)bp;
+ ptr_t alternate_target = *(ptr_t *)alternate_ptr;
+
+ if ((word)alternate_target > GC_least_real_heap_addr
+ && (word)alternate_target < GC_greatest_real_heap_addr
+ && ((word)target <= GC_least_real_heap_addr
+ || (word)target >= GC_greatest_real_heap_addr)) {
+ bp = alternate_ptr;
+ }
+ }
+# endif
+ bp_base = (ptr_t)GC_base(bp);
+ if (NULL == bp_base) {
+ *base_p = bp;
+ *offset_p = 0;
+ return GC_REFD_FROM_ROOT;
+ } else {
+ if (GC_HAS_DEBUG_INFO(bp_base)) bp_base += sizeof(oh);
+ *base_p = bp_base;
+ *offset_p = bp - bp_base;
+ return GC_REFD_FROM_HEAP;
+ }
+ }
+
+ /* Generate a random heap address. */
+ /* The resulting address is in the heap, but */
+ /* not necessarily inside a valid object. */
+ GC_API void * GC_CALL GC_generate_random_heap_address(void)
+ {
+ size_t i;
+ word heap_offset = (word)RANDOM();
+
+ if (GC_heapsize > (word)GC_RAND_MAX) {
+ heap_offset *= GC_RAND_MAX;
+ heap_offset += (word)RANDOM();
+ }
+ heap_offset %= GC_heapsize;
+ /* This doesn't yield a uniform distribution, especially if */
+ /* e.g. RAND_MAX is 1.5*GC_heapsize. But for typical cases, */
+ /* it's not too bad. */
+
+ for (i = 0;; ++i) {
+ size_t size;
+
+ if (i >= GC_n_heap_sects)
+ ABORT("GC_generate_random_heap_address: size inconsistency");
+
+ size = GC_heap_sects[i].hs_bytes;
+ if (heap_offset < size) {
+ break;
+ } else {
+ heap_offset -= size;
+ }
+ }
+ return GC_heap_sects[i].hs_start + heap_offset;
+ }
+
+ /* Generate a random address inside a valid marked heap object. */
+ GC_API void * GC_CALL GC_generate_random_valid_address(void)
+ {
+ ptr_t result;
+ ptr_t base;
+ do {
+ result = (ptr_t)GC_generate_random_heap_address();
+ base = (ptr_t)GC_base(result);
+ } while (NULL == base || !GC_is_marked(base));
+ return result;
+ }
+
+ /* Print back trace for p */
+ GC_API void GC_CALL GC_print_backtrace(void *p)
+ {
+ void *current = p;
+ int i;
+ GC_ref_kind source;
+ size_t offset;
+ void *base;
+
+ GC_print_heap_obj((ptr_t)GC_base(current));
+
+ for (i = 0; ; ++i) {
+ source = GC_get_back_ptr_info(current, &base, &offset);
+ if (GC_UNREFERENCED == source) {
+ GC_err_printf("Reference could not be found\n");
+ goto out;
+ }
+ if (GC_NO_SPACE == source) {
+ GC_err_printf("No debug info in object: Can't find reference\n");
+ goto out;
+ }
+ GC_err_printf("Reachable via %d levels of pointers from ", i);
+ switch(source) {
+ case GC_REFD_FROM_ROOT:
+ GC_err_printf("root at %p\n\n", base);
+ goto out;
+ case GC_REFD_FROM_REG:
+ GC_err_printf("root in register\n\n");
+ goto out;
+ case GC_FINALIZER_REFD:
+ GC_err_printf("list of finalizable objects\n\n");
+ goto out;
+ case GC_REFD_FROM_HEAP:
+ GC_err_printf("offset %ld in object:\n", (long)offset);
+ /* Take GC_base(base) to get real base, i.e. header. */
+ GC_print_heap_obj((ptr_t)GC_base(base));
+ break;
+ default:
+ GC_err_printf("INTERNAL ERROR: UNEXPECTED SOURCE!!!!\n");
+ goto out;
+ }
+ current = base;
+ }
+ out:;
+ }
+
+ GC_API void GC_CALL GC_generate_random_backtrace(void)
+ {
+ void *current;
+ DCL_LOCK_STATE;
+
+ if (GC_try_to_collect(GC_never_stop_func) == 0) {
+ GC_err_printf("Cannot generate a backtrace: "
+ "garbage collection is disabled!\n");
+ return;
+ }
+
+ /* Generate/print a backtrace from a random heap address. */
+ LOCK();
+ current = GC_generate_random_valid_address();
+ UNLOCK();
+ GC_printf("\n****Chosen address %p in object\n", current);
+ GC_print_backtrace(current);
+ }
+
+#endif /* KEEP_BACK_PTRS */
+
+# define CROSSES_HBLK(p, sz) \
+ (((word)((p) + sizeof(oh) + (sz) - 1) ^ (word)(p)) >= HBLKSIZE)
+
+GC_INNER void *GC_store_debug_info_inner(void *p, word sz GC_ATTR_UNUSED,
+ const char *string, int linenum)
+{
+ word * result = (word *)((oh *)p + 1);
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_ASSERT(GC_size(p) >= sizeof(oh) + sz);
+ GC_ASSERT(!(SMALL_OBJ(sz) && CROSSES_HBLK((ptr_t)p, sz)));
+# ifdef KEEP_BACK_PTRS
+ ((oh *)p) -> oh_back_ptr = HIDE_BACK_PTR(NOT_MARKED);
+# endif
+# ifdef MAKE_BACK_GRAPH
+ ((oh *)p) -> oh_bg_ptr = HIDE_BACK_PTR((ptr_t)0);
+# endif
+ ((oh *)p) -> oh_string = string;
+ ((oh *)p) -> oh_int = linenum;
+# ifndef SHORT_DBG_HDRS
+ ((oh *)p) -> oh_sz = sz;
+ ((oh *)p) -> oh_sf = START_FLAG ^ (word)result;
+ ((word *)p)[BYTES_TO_WORDS(GC_size(p))-1] =
+ result[SIMPLE_ROUNDED_UP_WORDS(sz)] = END_FLAG ^ (word)result;
+# endif
+ return result;
+}
+
+/* Check the allocation is successful, store debugging info into p, */
+/* start the debugging mode (if not yet), and return displaced pointer. */
+static void *store_debug_info(void *p, size_t lb,
+ const char *fn, GC_EXTRA_PARAMS)
+{
+ void *result;
+ DCL_LOCK_STATE;
+
+ if (NULL == p) {
+ GC_err_printf("%s(%lu) returning NULL (%s:%d)\n",
+ fn, (unsigned long)lb, s, i);
+ return NULL;
+ }
+ LOCK();
+ if (!GC_debugging_started)
+ GC_start_debugging_inner();
+ result = GC_store_debug_info_inner(p, (word)lb, s, i);
+ ADD_CALL_CHAIN(p, ra);
+ UNLOCK();
+ return result;
+}
+
+#ifndef SHORT_DBG_HDRS
+ /* Check the object with debugging info at ohdr. */
+ /* Return NULL if it's OK. Else return clobbered */
+ /* address. */
+ STATIC ptr_t GC_check_annotated_obj(oh *ohdr)
+ {
+ ptr_t body = (ptr_t)(ohdr + 1);
+ word gc_sz = GC_size((ptr_t)ohdr);
+ if (ohdr -> oh_sz + DEBUG_BYTES > gc_sz) {
+ return((ptr_t)(&(ohdr -> oh_sz)));
+ }
+ if (ohdr -> oh_sf != (START_FLAG ^ (word)body)) {
+ return((ptr_t)(&(ohdr -> oh_sf)));
+ }
+ if (((word *)ohdr)[BYTES_TO_WORDS(gc_sz)-1] != (END_FLAG ^ (word)body)) {
+ return (ptr_t)(&((word *)ohdr)[BYTES_TO_WORDS(gc_sz)-1]);
+ }
+ if (((word *)body)[SIMPLE_ROUNDED_UP_WORDS(ohdr -> oh_sz)]
+ != (END_FLAG ^ (word)body)) {
+ return (ptr_t)(&((word *)body)[SIMPLE_ROUNDED_UP_WORDS(ohdr->oh_sz)]);
+ }
+ return(0);
+ }
+#endif /* !SHORT_DBG_HDRS */
+
+STATIC GC_describe_type_fn GC_describe_type_fns[MAXOBJKINDS] = {0};
+
+GC_API void GC_CALL GC_register_describe_type_fn(int kind,
+ GC_describe_type_fn fn)
+{
+ GC_describe_type_fns[kind] = fn;
+}
+
+#define GET_OH_LINENUM(ohdr) ((int)(ohdr)->oh_int)
+
+#ifndef SHORT_DBG_HDRS
+# define IF_NOT_SHORTDBG_HDRS(x) x
+# define COMMA_IFNOT_SHORTDBG_HDRS(x) /* comma */, x
+#else
+# define IF_NOT_SHORTDBG_HDRS(x) /* empty */
+# define COMMA_IFNOT_SHORTDBG_HDRS(x) /* empty */
+#endif
+
+/* Print a human-readable description of the object to stderr. */
+/* p points to somewhere inside an object with the debugging info. */
+STATIC void GC_print_obj(ptr_t p)
+{
+ oh * ohdr = (oh *)GC_base(p);
+ ptr_t q;
+ hdr * hhdr;
+ int kind;
+ const char *kind_str;
+ char buffer[GC_TYPE_DESCR_LEN + 1];
+
+ GC_ASSERT(I_DONT_HOLD_LOCK());
+# ifdef LINT2
+ if (!ohdr) ABORT("Invalid GC_print_obj argument");
+# endif
+
+ q = (ptr_t)(ohdr + 1);
+ /* Print a type description for the object whose client-visible */
+ /* address is q. */
+ hhdr = GC_find_header(q);
+ kind = hhdr -> hb_obj_kind;
+ if (0 != GC_describe_type_fns[kind] && GC_is_marked(ohdr)) {
+ /* This should preclude free list objects except with */
+ /* thread-local allocation. */
+ buffer[GC_TYPE_DESCR_LEN] = 0;
+ (GC_describe_type_fns[kind])(q, buffer);
+ GC_ASSERT(buffer[GC_TYPE_DESCR_LEN] == 0);
+ kind_str = buffer;
+ } else {
+ switch(kind) {
+ case PTRFREE:
+ kind_str = "PTRFREE";
+ break;
+ case NORMAL:
+ kind_str = "NORMAL";
+ break;
+ case UNCOLLECTABLE:
+ kind_str = "UNCOLLECTABLE";
+ break;
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+ case AUNCOLLECTABLE:
+ kind_str = "ATOMIC_UNCOLLECTABLE";
+ break;
+# endif
+ default:
+ kind_str = NULL;
+ /* The alternative is to use snprintf(buffer) but it is */
+ /* not quite portable (see vsnprintf in misc.c). */
+ }
+ }
+
+ if (NULL != kind_str) {
+ GC_err_printf("%p (%s:%d," IF_NOT_SHORTDBG_HDRS(" sz= %lu,") " %s)\n",
+ (void *)((ptr_t)ohdr + sizeof(oh)),
+ ohdr->oh_string, GET_OH_LINENUM(ohdr) /*, */
+ COMMA_IFNOT_SHORTDBG_HDRS((unsigned long)ohdr->oh_sz),
+ kind_str);
+ } else {
+ GC_err_printf("%p (%s:%d," IF_NOT_SHORTDBG_HDRS(" sz= %lu,")
+ " kind= %d, descr= 0x%lx)\n",
+ (void *)((ptr_t)ohdr + sizeof(oh)),
+ ohdr->oh_string, GET_OH_LINENUM(ohdr) /*, */
+ COMMA_IFNOT_SHORTDBG_HDRS((unsigned long)ohdr->oh_sz),
+ kind, (unsigned long)hhdr->hb_descr);
+ }
+ PRINT_CALL_CHAIN(ohdr);
+}
+
+STATIC void GC_debug_print_heap_obj_proc(ptr_t p)
+{
+ GC_ASSERT(I_DONT_HOLD_LOCK());
+ if (GC_HAS_DEBUG_INFO(p)) {
+ GC_print_obj(p);
+ } else {
+ GC_default_print_heap_obj_proc(p);
+ }
+}
+
+#ifndef SHORT_DBG_HDRS
+ /* Use GC_err_printf and friends to print a description of the object */
+ /* whose client-visible address is p, and which was smashed at */
+ /* clobbered_addr. */
+ STATIC void GC_print_smashed_obj(const char *msg, void *p,
+ ptr_t clobbered_addr)
+ {
+ oh * ohdr = (oh *)GC_base(p);
+
+ GC_ASSERT(I_DONT_HOLD_LOCK());
+# ifdef LINT2
+ if (!ohdr) ABORT("Invalid GC_print_smashed_obj argument");
+# endif
+ if ((word)clobbered_addr <= (word)(&ohdr->oh_sz)
+ || ohdr -> oh_string == 0) {
+ GC_err_printf(
+ "%s %p in or near object at %p(<smashed>, appr. sz= %lu)\n",
+ msg, (void *)clobbered_addr, p,
+ (unsigned long)(GC_size((ptr_t)ohdr) - DEBUG_BYTES));
+ } else {
+ GC_err_printf("%s %p in or near object at %p (%s:%d, sz= %lu)\n",
+ msg, (void *)clobbered_addr, p,
+ (word)(ohdr -> oh_string) < HBLKSIZE ? "(smashed string)" :
+ ohdr -> oh_string[0] == '\0' ? "EMPTY(smashed?)" :
+ ohdr -> oh_string,
+ GET_OH_LINENUM(ohdr), (unsigned long)(ohdr -> oh_sz));
+ PRINT_CALL_CHAIN(ohdr);
+ }
+ }
+
+ STATIC void GC_check_heap_proc (void);
+ STATIC void GC_print_all_smashed_proc (void);
+#else
+ STATIC void GC_do_nothing(void) {}
+#endif
+
+GC_INNER void GC_start_debugging_inner(void)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+# ifndef SHORT_DBG_HDRS
+ GC_check_heap = GC_check_heap_proc;
+ GC_print_all_smashed = GC_print_all_smashed_proc;
+# else
+ GC_check_heap = GC_do_nothing;
+ GC_print_all_smashed = GC_do_nothing;
+# endif
+ GC_print_heap_obj = GC_debug_print_heap_obj_proc;
+ GC_debugging_started = TRUE;
+ GC_register_displacement_inner((word)sizeof(oh));
+# if defined(CPPCHECK)
+ GC_noop1(GC_debug_header_size);
+# endif
+}
+
+const size_t GC_debug_header_size = sizeof(oh);
+
+GC_API size_t GC_CALL GC_get_debug_header_size(void) {
+ return sizeof(oh);
+}
+
+GC_API void GC_CALL GC_debug_register_displacement(size_t offset)
+{
+ DCL_LOCK_STATE;
+
+ LOCK();
+ GC_register_displacement_inner(offset);
+ GC_register_displacement_inner((word)sizeof(oh) + offset);
+ UNLOCK();
+}
+
+#ifdef GC_ADD_CALLER
+# if defined(HAVE_DLADDR) && defined(GC_HAVE_RETURN_ADDR_PARENT)
+# include <dlfcn.h>
+
+ STATIC void GC_caller_func_offset(word ad, const char **symp, int *offp)
+ {
+ Dl_info caller;
+
+ if (ad && dladdr((void *)ad, &caller) && caller.dli_sname != NULL) {
+ *symp = caller.dli_sname;
+ *offp = (int)((char *)ad - (char *)caller.dli_saddr);
+ }
+ if (NULL == *symp) {
+ *symp = "unknown";
+ }
+ }
+# else
+# define GC_caller_func_offset(ad, symp, offp) (void)(*(symp) = "unknown")
+# endif
+#endif /* GC_ADD_CALLER */
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_debug_malloc(size_t lb,
+ GC_EXTRA_PARAMS)
+{
+ void * result;
+
+ /* Note that according to malloc() specification, if size is 0 then */
+ /* malloc() returns either NULL, or a unique pointer value that can */
+ /* later be successfully passed to free(). We always do the latter. */
+# if defined(_FORTIFY_SOURCE) && !defined(__clang__)
+ /* Workaround to avoid "exceeds maximum object size" gcc warning. */
+ result = GC_malloc(lb < GC_SIZE_MAX - DEBUG_BYTES ? lb + DEBUG_BYTES
+ : GC_SIZE_MAX >> 1);
+# else
+ result = GC_malloc(SIZET_SAT_ADD(lb, DEBUG_BYTES));
+# endif
+# ifdef GC_ADD_CALLER
+ if (s == NULL) {
+ GC_caller_func_offset(ra, &s, &i);
+ }
+# endif
+ return store_debug_info(result, lb, "GC_debug_malloc", OPT_RA s, i);
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL
+ GC_debug_malloc_ignore_off_page(size_t lb, GC_EXTRA_PARAMS)
+{
+ void * result = GC_malloc_ignore_off_page(SIZET_SAT_ADD(lb, DEBUG_BYTES));
+
+ return store_debug_info(result, lb, "GC_debug_malloc_ignore_off_page",
+ OPT_RA s, i);
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL
+ GC_debug_malloc_atomic_ignore_off_page(size_t lb, GC_EXTRA_PARAMS)
+{
+ void * result = GC_malloc_atomic_ignore_off_page(
+ SIZET_SAT_ADD(lb, DEBUG_BYTES));
+
+ return store_debug_info(result, lb,
+ "GC_debug_malloc_atomic_ignore_off_page",
+ OPT_RA s, i);
+}
+
+STATIC void * GC_debug_generic_malloc(size_t lb, int knd, GC_EXTRA_PARAMS)
+{
+ void * result = GC_generic_malloc(SIZET_SAT_ADD(lb, DEBUG_BYTES), knd);
+
+ return store_debug_info(result, lb, "GC_debug_generic_malloc",
+ OPT_RA s, i);
+}
+
+#ifdef DBG_HDRS_ALL
+ /* An allocation function for internal use. Normally internally */
+ /* allocated objects do not have debug information. But in this */
+ /* case, we need to make sure that all objects have debug headers. */
+ GC_INNER void * GC_debug_generic_malloc_inner(size_t lb, int k)
+ {
+ void *base, *result;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ base = GC_generic_malloc_inner(SIZET_SAT_ADD(lb, DEBUG_BYTES), k);
+ if (NULL == base) {
+ GC_err_printf("GC internal allocation (%lu bytes) returning NULL\n",
+ (unsigned long) lb);
+ return(0);
+ }
+ if (!GC_debugging_started) {
+ GC_start_debugging_inner();
+ }
+ result = GC_store_debug_info_inner(base, (word)lb, "INTERNAL", 0);
+ ADD_CALL_CHAIN(base, GC_RETURN_ADDR);
+ return result;
+ }
+
+ GC_INNER void * GC_debug_generic_malloc_inner_ignore_off_page(size_t lb,
+ int k)
+ {
+ void *base, *result;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ base = GC_generic_malloc_inner_ignore_off_page(
+ SIZET_SAT_ADD(lb, DEBUG_BYTES), k);
+ if (NULL == base) {
+ GC_err_printf("GC internal allocation (%lu bytes) returning NULL\n",
+ (unsigned long) lb);
+ return(0);
+ }
+ if (!GC_debugging_started) {
+ GC_start_debugging_inner();
+ }
+ result = GC_store_debug_info_inner(base, (word)lb, "INTERNAL", 0);
+ ADD_CALL_CHAIN_INNER(base);
+ return result;
+ }
+#endif /* DBG_HDRS_ALL */
+
+#ifndef CPPCHECK
+ GC_API void * GC_CALL GC_debug_malloc_stubborn(size_t lb, GC_EXTRA_PARAMS)
+ {
+ return GC_debug_malloc(lb, OPT_RA s, i);
+ }
+
+ GC_API void GC_CALL GC_debug_change_stubborn(
+ const void * p GC_ATTR_UNUSED) {}
+#endif /* !CPPCHECK */
+
+GC_API void GC_CALL GC_debug_end_stubborn_change(const void *p)
+{
+ const void * q = GC_base_C(p);
+
+ if (NULL == q) {
+ ABORT_ARG1("GC_debug_end_stubborn_change: bad arg", ": %p", p);
+ }
+ GC_end_stubborn_change(q);
+}
+
+GC_API void GC_CALL GC_debug_ptr_store_and_dirty(void *p, const void *q)
+{
+ *(void **)GC_is_visible(p) = GC_is_valid_displacement((void *)q);
+ GC_debug_end_stubborn_change(p);
+ REACHABLE_AFTER_DIRTY(q);
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_debug_malloc_atomic(size_t lb,
+ GC_EXTRA_PARAMS)
+{
+ void * result = GC_malloc_atomic(SIZET_SAT_ADD(lb, DEBUG_BYTES));
+
+ return store_debug_info(result, lb, "GC_debug_malloc_atomic",
+ OPT_RA s, i);
+}
+
+GC_API GC_ATTR_MALLOC char * GC_CALL GC_debug_strdup(const char *str,
+ GC_EXTRA_PARAMS)
+{
+ char *copy;
+ size_t lb;
+ if (str == NULL) {
+ if (GC_find_leak)
+ GC_err_printf("strdup(NULL) behavior is undefined\n");
+ return NULL;
+ }
+
+ lb = strlen(str) + 1;
+ copy = (char *)GC_debug_malloc_atomic(lb, OPT_RA s, i);
+ if (copy == NULL) {
+# ifndef MSWINCE
+ errno = ENOMEM;
+# endif
+ return NULL;
+ }
+ BCOPY(str, copy, lb);
+ return copy;
+}
+
+GC_API GC_ATTR_MALLOC char * GC_CALL GC_debug_strndup(const char *str,
+ size_t size, GC_EXTRA_PARAMS)
+{
+ char *copy;
+ size_t len = strlen(str); /* str is expected to be non-NULL */
+ if (len > size)
+ len = size;
+ copy = (char *)GC_debug_malloc_atomic(len + 1, OPT_RA s, i);
+ if (copy == NULL) {
+# ifndef MSWINCE
+ errno = ENOMEM;
+# endif
+ return NULL;
+ }
+ if (len > 0)
+ BCOPY(str, copy, len);
+ copy[len] = '\0';
+ return copy;
+}
+
+#ifdef GC_REQUIRE_WCSDUP
+# include <wchar.h> /* for wcslen() */
+
+ GC_API GC_ATTR_MALLOC wchar_t * GC_CALL GC_debug_wcsdup(const wchar_t *str,
+ GC_EXTRA_PARAMS)
+ {
+ size_t lb = (wcslen(str) + 1) * sizeof(wchar_t);
+ wchar_t *copy = (wchar_t *)GC_debug_malloc_atomic(lb, OPT_RA s, i);
+ if (copy == NULL) {
+# ifndef MSWINCE
+ errno = ENOMEM;
+# endif
+ return NULL;
+ }
+ BCOPY(str, copy, lb);
+ return copy;
+ }
+#endif /* GC_REQUIRE_WCSDUP */
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_debug_malloc_uncollectable(size_t lb,
+ GC_EXTRA_PARAMS)
+{
+ void * result = GC_malloc_uncollectable(
+ SIZET_SAT_ADD(lb, UNCOLLECTABLE_DEBUG_BYTES));
+
+ return store_debug_info(result, lb, "GC_debug_malloc_uncollectable",
+ OPT_RA s, i);
+}
+
+#ifdef GC_ATOMIC_UNCOLLECTABLE
+ GC_API GC_ATTR_MALLOC void * GC_CALL
+ GC_debug_malloc_atomic_uncollectable(size_t lb, GC_EXTRA_PARAMS)
+ {
+ void * result = GC_malloc_atomic_uncollectable(
+ SIZET_SAT_ADD(lb, UNCOLLECTABLE_DEBUG_BYTES));
+
+ return store_debug_info(result, lb,
+ "GC_debug_malloc_atomic_uncollectable",
+ OPT_RA s, i);
+ }
+#endif /* GC_ATOMIC_UNCOLLECTABLE */
+
+#ifndef GC_FREED_MEM_MARKER
+# if CPP_WORDSZ == 32
+# define GC_FREED_MEM_MARKER 0xdeadbeef
+# else
+# define GC_FREED_MEM_MARKER GC_WORD_C(0xEFBEADDEdeadbeef)
+# endif
+#endif
+
+GC_API void GC_CALL GC_debug_free(void * p)
+{
+ ptr_t base;
+ if (0 == p) return;
+
+ base = (ptr_t)GC_base(p);
+ if (NULL == base) {
+# if defined(REDIRECT_MALLOC) \
+ && ((defined(NEED_CALLINFO) && defined(GC_HAVE_BUILTIN_BACKTRACE)) \
+ || defined(GC_LINUX_THREADS) || defined(GC_SOLARIS_THREADS) \
+ || defined(MSWIN32))
+ /* In some cases, we should ignore objects that do not belong */
+ /* to the GC heap. See the comment in GC_free. */
+ if (!GC_is_heap_ptr(p)) return;
+# endif
+ ABORT_ARG1("Invalid pointer passed to free()", ": %p", p);
+ }
+ if ((ptr_t)p - (ptr_t)base != sizeof(oh)) {
+# if defined(REDIRECT_FREE) && defined(USE_PROC_FOR_LIBRARIES)
+ /* TODO: Suppress the warning if free() caller is in libpthread */
+ /* or libdl. */
+# endif
+ GC_err_printf(
+ "GC_debug_free called on pointer %p w/o debugging info\n", p);
+ } else {
+# ifndef SHORT_DBG_HDRS
+ ptr_t clobbered = GC_check_annotated_obj((oh *)base);
+ word sz = GC_size(base);
+ if (clobbered != 0) {
+ GC_SET_HAVE_ERRORS(); /* no "release" barrier is needed */
+ if (((oh *)base) -> oh_sz == sz) {
+ GC_print_smashed_obj(
+ "GC_debug_free: found previously deallocated (?) object at",
+ p, clobbered);
+ return; /* ignore double free */
+ } else {
+ GC_print_smashed_obj("GC_debug_free: found smashed location at",
+ p, clobbered);
+ }
+ }
+ /* Invalidate size (mark the object as deallocated) */
+ ((oh *)base) -> oh_sz = sz;
+# endif /* !SHORT_DBG_HDRS */
+ }
+ if (GC_find_leak
+# ifndef SHORT_DBG_HDRS
+ && ((ptr_t)p - (ptr_t)base != sizeof(oh) || !GC_findleak_delay_free)
+# endif
+ ) {
+ GC_free(base);
+ } else {
+ hdr * hhdr = HDR(p);
+ if (hhdr -> hb_obj_kind == UNCOLLECTABLE
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+ || hhdr -> hb_obj_kind == AUNCOLLECTABLE
+# endif
+ ) {
+ GC_free(base);
+ } else {
+ word i;
+ word sz = hhdr -> hb_sz;
+ word obj_sz = BYTES_TO_WORDS(sz - sizeof(oh));
+
+ for (i = 0; i < obj_sz; ++i)
+ ((word *)p)[i] = GC_FREED_MEM_MARKER;
+ GC_ASSERT((word *)p + i == (word *)(base + sz));
+ /* Update the counter even though the real deallocation */
+ /* is deferred. */
+ LOCK();
+ GC_bytes_freed += sz;
+ UNLOCK();
+ }
+ } /* !GC_find_leak */
+}
+
+#if defined(THREADS) && defined(DBG_HDRS_ALL)
+ /* Used internally; we assume it's called correctly. */
+ GC_INNER void GC_debug_free_inner(void * p)
+ {
+ ptr_t base = (ptr_t)GC_base(p);
+ GC_ASSERT((ptr_t)p - (ptr_t)base == sizeof(oh));
+# ifdef LINT2
+ if (!base) ABORT("Invalid GC_debug_free_inner argument");
+# endif
+# ifndef SHORT_DBG_HDRS
+ /* Invalidate size */
+ ((oh *)base) -> oh_sz = GC_size(base);
+# endif
+ GC_free_inner(base);
+ }
+#endif
+
+GC_API void * GC_CALL GC_debug_realloc(void * p, size_t lb, GC_EXTRA_PARAMS)
+{
+ void * base;
+ void * result;
+ hdr * hhdr;
+
+ if (p == 0) {
+ return GC_debug_malloc(lb, OPT_RA s, i);
+ }
+ if (0 == lb) /* and p != NULL */ {
+ GC_debug_free(p);
+ return NULL;
+ }
+
+# ifdef GC_ADD_CALLER
+ if (s == NULL) {
+ GC_caller_func_offset(ra, &s, &i);
+ }
+# endif
+ base = GC_base(p);
+ if (base == 0) {
+ ABORT_ARG1("Invalid pointer passed to realloc()", ": %p", p);
+ }
+ if ((ptr_t)p - (ptr_t)base != sizeof(oh)) {
+ GC_err_printf(
+ "GC_debug_realloc called on pointer %p w/o debugging info\n", p);
+ return(GC_realloc(p, lb));
+ }
+ hhdr = HDR(base);
+ switch (hhdr -> hb_obj_kind) {
+ case NORMAL:
+ result = GC_debug_malloc(lb, OPT_RA s, i);
+ break;
+ case PTRFREE:
+ result = GC_debug_malloc_atomic(lb, OPT_RA s, i);
+ break;
+ case UNCOLLECTABLE:
+ result = GC_debug_malloc_uncollectable(lb, OPT_RA s, i);
+ break;
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+ case AUNCOLLECTABLE:
+ result = GC_debug_malloc_atomic_uncollectable(lb, OPT_RA s, i);
+ break;
+# endif
+ default:
+ result = GC_debug_generic_malloc(lb, hhdr -> hb_obj_kind, OPT_RA s, i);
+ break;
+ }
+
+ if (result != NULL) {
+ size_t old_sz;
+# ifdef SHORT_DBG_HDRS
+ old_sz = GC_size(base) - sizeof(oh);
+# else
+ old_sz = ((oh *)base) -> oh_sz;
+# endif
+ if (old_sz > 0)
+ BCOPY(p, result, old_sz < lb ? old_sz : lb);
+ GC_debug_free(p);
+ }
+ return(result);
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL
+ GC_debug_generic_or_special_malloc(size_t lb, int knd, GC_EXTRA_PARAMS)
+{
+ switch (knd) {
+ case PTRFREE:
+ return GC_debug_malloc_atomic(lb, OPT_RA s, i);
+ case NORMAL:
+ return GC_debug_malloc(lb, OPT_RA s, i);
+ case UNCOLLECTABLE:
+ return GC_debug_malloc_uncollectable(lb, OPT_RA s, i);
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+ case AUNCOLLECTABLE:
+ return GC_debug_malloc_atomic_uncollectable(lb, OPT_RA s, i);
+# endif
+ default:
+ return GC_debug_generic_malloc(lb, knd, OPT_RA s, i);
+ }
+}
+
+#ifndef SHORT_DBG_HDRS
+
+/* List of smashed (clobbered) locations. We defer printing these, */
+/* since we can't always print them nicely with the allocation lock */
+/* held. We put them here instead of in GC_arrays, since it may be */
+/* useful to be able to look at them with the debugger. */
+#ifndef MAX_SMASHED
+# define MAX_SMASHED 20
+#endif
+STATIC ptr_t GC_smashed[MAX_SMASHED] = {0};
+STATIC unsigned GC_n_smashed = 0;
+
+STATIC void GC_add_smashed(ptr_t smashed)
+{
+ GC_ASSERT(GC_is_marked(GC_base(smashed)));
+ /* FIXME: Prevent adding an object while printing smashed list. */
+ GC_smashed[GC_n_smashed] = smashed;
+ if (GC_n_smashed < MAX_SMASHED - 1) ++GC_n_smashed;
+ /* In case of overflow, we keep the first MAX_SMASHED-1 */
+ /* entries plus the last one. */
+ GC_SET_HAVE_ERRORS();
+}
+
+/* Print all objects on the list. Clear the list. */
+STATIC void GC_print_all_smashed_proc(void)
+{
+ unsigned i;
+
+ GC_ASSERT(I_DONT_HOLD_LOCK());
+ if (GC_n_smashed == 0) return;
+ GC_err_printf("GC_check_heap_block: found %u smashed heap objects:\n",
+ GC_n_smashed);
+ for (i = 0; i < GC_n_smashed; ++i) {
+ ptr_t base = (ptr_t)GC_base(GC_smashed[i]);
+
+# ifdef LINT2
+ if (!base) ABORT("Invalid GC_smashed element");
+# endif
+ GC_print_smashed_obj("", base + sizeof(oh), GC_smashed[i]);
+ GC_smashed[i] = 0;
+ }
+ GC_n_smashed = 0;
+}
+
+/* Check all marked objects in the given block for validity */
+/* Avoid GC_apply_to_each_object for performance reasons. */
+STATIC void GC_check_heap_block(struct hblk *hbp, word dummy GC_ATTR_UNUSED)
+{
+ struct hblkhdr * hhdr = HDR(hbp);
+ word sz = hhdr -> hb_sz;
+ word bit_no;
+ char *p, *plim;
+
+ p = hbp->hb_body;
+ if (sz > MAXOBJBYTES) {
+ plim = p;
+ } else {
+ plim = hbp->hb_body + HBLKSIZE - sz;
+ }
+ /* go through all objects in block */
+ for (bit_no = 0; (word)p <= (word)plim;
+ bit_no += MARK_BIT_OFFSET(sz), p += sz) {
+ if (mark_bit_from_hdr(hhdr, bit_no) && GC_HAS_DEBUG_INFO((ptr_t)p)) {
+ ptr_t clobbered = GC_check_annotated_obj((oh *)p);
+ if (clobbered != 0)
+ GC_add_smashed(clobbered);
+ }
+ }
+}
+
+/* This assumes that all accessible objects are marked, and that */
+/* I hold the allocation lock. Normally called by collector. */
+STATIC void GC_check_heap_proc(void)
+{
+ GC_STATIC_ASSERT((sizeof(oh) & (GRANULE_BYTES - 1)) == 0);
+ /* FIXME: Should we check for twice that alignment? */
+ GC_apply_to_all_blocks(GC_check_heap_block, 0);
+}
+
+GC_INNER GC_bool GC_check_leaked(ptr_t base)
+{
+ word i;
+ word obj_sz;
+ word *p;
+
+ if (
+# if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH)
+ (*(word *)base & 1) != 0 &&
+# endif
+ GC_has_other_debug_info(base) >= 0)
+ return TRUE; /* object has leaked */
+
+ /* Validate freed object's content. */
+ p = (word *)(base + sizeof(oh));
+ obj_sz = BYTES_TO_WORDS(HDR(base)->hb_sz - sizeof(oh));
+ for (i = 0; i < obj_sz; ++i)
+ if (p[i] != GC_FREED_MEM_MARKER) {
+ GC_set_mark_bit(base); /* do not reclaim it in this cycle */
+ GC_add_smashed((ptr_t)(&p[i])); /* alter-after-free detected */
+ break; /* don't report any other smashed locations in the object */
+ }
+
+ return FALSE; /* GC_debug_free() has been called */
+}
+
+#endif /* !SHORT_DBG_HDRS */
+
+#ifndef GC_NO_FINALIZATION
+
+struct closure {
+ GC_finalization_proc cl_fn;
+ void * cl_data;
+};
+
+STATIC void * GC_make_closure(GC_finalization_proc fn, void * data)
+{
+ struct closure * result =
+# ifdef DBG_HDRS_ALL
+ (struct closure *) GC_debug_malloc(sizeof (struct closure),
+ GC_EXTRAS);
+# else
+ (struct closure *) GC_malloc(sizeof (struct closure));
+# endif
+ if (result != 0) {
+ result -> cl_fn = fn;
+ result -> cl_data = data;
+ }
+ return((void *)result);
+}
+
+/* An auxiliary fns to make finalization work correctly with displaced */
+/* pointers introduced by the debugging allocators. */
+STATIC void GC_CALLBACK GC_debug_invoke_finalizer(void * obj, void * data)
+{
+ struct closure * cl = (struct closure *) data;
+ (*(cl -> cl_fn))((void *)((char *)obj + sizeof(oh)), cl -> cl_data);
+}
+
+/* Special finalizer_proc value to detect GC_register_finalizer() failure. */
+#define OFN_UNSET ((GC_finalization_proc)~(signed_word)0)
+
+/* Set ofn and ocd to reflect the values we got back. */
+static void store_old(void *obj, GC_finalization_proc my_old_fn,
+ struct closure *my_old_cd, GC_finalization_proc *ofn,
+ void **ocd)
+{
+ if (0 != my_old_fn) {
+ if (my_old_fn == OFN_UNSET) {
+ /* GC_register_finalizer() failed; (*ofn) and (*ocd) are unchanged. */
+ return;
+ }
+ if (my_old_fn != GC_debug_invoke_finalizer) {
+ GC_err_printf("Debuggable object at %p had a non-debug finalizer\n",
+ obj);
+ /* This should probably be fatal. */
+ } else {
+ if (ofn) *ofn = my_old_cd -> cl_fn;
+ if (ocd) *ocd = my_old_cd -> cl_data;
+ }
+ } else {
+ if (ofn) *ofn = 0;
+ if (ocd) *ocd = 0;
+ }
+}
+
+GC_API void GC_CALL GC_debug_register_finalizer(void * obj,
+ GC_finalization_proc fn,
+ void * cd, GC_finalization_proc *ofn,
+ void * *ocd)
+{
+ GC_finalization_proc my_old_fn = OFN_UNSET;
+ void * my_old_cd = NULL; /* to avoid "might be uninitialized" warning */
+ ptr_t base = (ptr_t)GC_base(obj);
+ if (NULL == base) {
+ /* We won't collect it, hence finalizer wouldn't be run. */
+ if (ocd) *ocd = 0;
+ if (ofn) *ofn = 0;
+ return;
+ }
+ if ((ptr_t)obj - base != sizeof(oh)) {
+ GC_err_printf("GC_debug_register_finalizer called with"
+ " non-base-pointer %p\n", obj);
+ }
+ if (0 == fn) {
+ GC_register_finalizer(base, 0, 0, &my_old_fn, &my_old_cd);
+ } else {
+ cd = GC_make_closure(fn, cd);
+ if (cd == 0) return; /* out of memory; *ofn and *ocd are unchanged */
+ GC_register_finalizer(base, GC_debug_invoke_finalizer,
+ cd, &my_old_fn, &my_old_cd);
+ }
+ store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd);
+}
+
+GC_API void GC_CALL GC_debug_register_finalizer_no_order
+ (void * obj, GC_finalization_proc fn,
+ void * cd, GC_finalization_proc *ofn,
+ void * *ocd)
+{
+ GC_finalization_proc my_old_fn = OFN_UNSET;
+ void * my_old_cd = NULL;
+ ptr_t base = (ptr_t)GC_base(obj);
+ if (NULL == base) {
+ /* We won't collect it, hence finalizer wouldn't be run. */
+ if (ocd) *ocd = 0;
+ if (ofn) *ofn = 0;
+ return;
+ }
+ if ((ptr_t)obj - base != sizeof(oh)) {
+ GC_err_printf("GC_debug_register_finalizer_no_order called with"
+ " non-base-pointer %p\n", obj);
+ }
+ if (0 == fn) {
+ GC_register_finalizer_no_order(base, 0, 0, &my_old_fn, &my_old_cd);
+ } else {
+ cd = GC_make_closure(fn, cd);
+ if (cd == 0) return; /* out of memory */
+ GC_register_finalizer_no_order(base, GC_debug_invoke_finalizer,
+ cd, &my_old_fn, &my_old_cd);
+ }
+ store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd);
+}
+
+GC_API void GC_CALL GC_debug_register_finalizer_unreachable
+ (void * obj, GC_finalization_proc fn,
+ void * cd, GC_finalization_proc *ofn,
+ void * *ocd)
+{
+ GC_finalization_proc my_old_fn = OFN_UNSET;
+ void * my_old_cd = NULL;
+ ptr_t base = (ptr_t)GC_base(obj);
+ if (NULL == base) {
+ /* We won't collect it, hence finalizer wouldn't be run. */
+ if (ocd) *ocd = 0;
+ if (ofn) *ofn = 0;
+ return;
+ }
+ if ((ptr_t)obj - base != sizeof(oh)) {
+ GC_err_printf("GC_debug_register_finalizer_unreachable called with"
+ " non-base-pointer %p\n", obj);
+ }
+ if (0 == fn) {
+ GC_register_finalizer_unreachable(base, 0, 0, &my_old_fn, &my_old_cd);
+ } else {
+ cd = GC_make_closure(fn, cd);
+ if (cd == 0) return; /* out of memory */
+ GC_register_finalizer_unreachable(base, GC_debug_invoke_finalizer,
+ cd, &my_old_fn, &my_old_cd);
+ }
+ store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd);
+}
+
+GC_API void GC_CALL GC_debug_register_finalizer_ignore_self
+ (void * obj, GC_finalization_proc fn,
+ void * cd, GC_finalization_proc *ofn,
+ void * *ocd)
+{
+ GC_finalization_proc my_old_fn = OFN_UNSET;
+ void * my_old_cd = NULL;
+ ptr_t base = (ptr_t)GC_base(obj);
+ if (NULL == base) {
+ /* We won't collect it, hence finalizer wouldn't be run. */
+ if (ocd) *ocd = 0;
+ if (ofn) *ofn = 0;
+ return;
+ }
+ if ((ptr_t)obj - base != sizeof(oh)) {
+ GC_err_printf("GC_debug_register_finalizer_ignore_self called with"
+ " non-base-pointer %p\n", obj);
+ }
+ if (0 == fn) {
+ GC_register_finalizer_ignore_self(base, 0, 0, &my_old_fn, &my_old_cd);
+ } else {
+ cd = GC_make_closure(fn, cd);
+ if (cd == 0) return; /* out of memory */
+ GC_register_finalizer_ignore_self(base, GC_debug_invoke_finalizer,
+ cd, &my_old_fn, &my_old_cd);
+ }
+ store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd);
+}
+
+#endif /* !GC_NO_FINALIZATION */
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_debug_malloc_replacement(size_t lb)
+{
+ return GC_debug_malloc(lb, GC_DBG_EXTRAS);
+}
+
+GC_API void * GC_CALL GC_debug_realloc_replacement(void *p, size_t lb)
+{
+ return GC_debug_realloc(p, lb, GC_DBG_EXTRAS);
+}
diff --git a/graphics/asymptote/gc/digimars.mak b/graphics/asymptote/gc/digimars.mak
new file mode 100644
index 0000000000..4c91dceca0
--- /dev/null
+++ b/graphics/asymptote/gc/digimars.mak
@@ -0,0 +1,102 @@
+# Makefile to build Hans Boehm garbage collector using the Digital Mars
+# compiler from www.digitalmars.com
+# Written by Walter Bright
+
+DEFINES=-D_WINDOWS -DGC_DLL -DGC_THREADS -DGC_DISCOVER_TASK_THREADS -DALL_INTERIOR_POINTERS -DENABLE_DISCLAIM -DGC_ATOMIC_UNCOLLECTABLE -DGC_GCJ_SUPPORT -DJAVA_FINALIZATION -DNO_EXECUTE_PERMISSION -DUSE_MUNMAP
+CFLAGS=-Iinclude -Ilibatomic_ops\src $(DEFINES) -wx -g
+LFLAGS=/ma/implib/co
+CC=sc
+
+.c.obj:
+ $(CC) -c $(CFLAGS) $*
+
+.cpp.obj:
+ $(CC) -c $(CFLAGS) -Aa $*
+
+OBJS= \
+ allchblk.obj\
+ alloc.obj\
+ blacklst.obj\
+ checksums.obj\
+ dbg_mlc.obj\
+ fnlz_mlc.obj\
+ dyn_load.obj\
+ finalize.obj\
+ gc_badalc.obj\
+ gc_cpp.obj\
+ gcj_mlc.obj\
+ headers.obj\
+ mach_dep.obj\
+ malloc.obj\
+ mallocx.obj\
+ mark.obj\
+ mark_rts.obj\
+ misc.obj\
+ new_hblk.obj\
+ obj_map.obj\
+ os_dep.obj\
+ ptr_chck.obj\
+ reclaim.obj\
+ typd_mlc.obj\
+ win32_threads.obj
+
+targets: gc.dll gc.lib
+
+check: gctest.exe test_cpp.exe
+ gctest.exe
+ test_cpp.exe
+
+gc.lib: gc.dll
+
+gc.dll: $(OBJS) gc.def digimars.mak
+ $(CC) -ogc.dll $(OBJS) -L$(LFLAGS) gc.def kernel32.lib user32.lib
+
+gc.def: digimars.mak
+ echo LIBRARY GC >gc.def
+ echo DESCRIPTION "Boehm-Demers-Weiser Garbage Collector" >>gc.def
+ echo EXETYPE NT >>gc.def
+ echo EXPORTS >>gc.def
+ echo GC_is_visible_print_proc >>gc.def
+ echo GC_is_valid_displacement_print_proc >>gc.def
+
+clean:
+ del *.log gc.def gc.dll gc.lib gc.map gctest.map test_cpp.map
+ del tests\test.obj gctest.exe tests\test_cpp.obj test_cpp.exe
+ del $(OBJS)
+
+gctest.exe: gc.lib tests\test.obj
+ $(CC) -ogctest.exe tests\test.obj gc.lib
+
+tests\test.obj: tests\test.c
+ $(CC) -c $(CFLAGS) tests\test.c -otests\test.obj
+
+test_cpp.exe: gc.lib tests\test_cpp.obj
+ $(CC) -otest_cpp.exe tests\test_cpp.obj gc.lib
+
+tests\test_cpp.obj: tests\test_cpp.cc
+ $(CC) -c $(CFLAGS) -cpp tests\test_cpp.cc -otests\test_cpp.obj
+
+allchblk.obj: allchblk.c
+alloc.obj: alloc.c
+blacklst.obj: blacklst.c
+checksums.obj: checksums.c
+dbg_mlc.obj: dbg_mlc.c
+dyn_load.obj: dyn_load.c
+finalize.obj: finalize.c
+fnlz_mlc.obj: fnlz_mlc.c
+gc_badalc.obj: gc_badalc.cc gc_badalc.cpp
+gc_cpp.obj: gc_cpp.cc gc_cpp.cpp
+headers.obj: headers.c
+mach_dep.obj: mach_dep.c
+malloc.obj: malloc.c
+mallocx.obj: mallocx.c
+mark.obj: mark.c
+mark_rts.obj: mark_rts.c
+misc.obj: misc.c
+new_hblk.obj: new_hblk.c
+obj_map.obj: obj_map.c
+os_dep.obj: os_dep.c
+ptr_chck.obj: ptr_chck.c
+reclaim.obj: reclaim.c
+typd_mlc.obj: typd_mlc.c
+win32_threads.obj: win32_threads.c
diff --git a/graphics/asymptote/gc/doc/README.DGUX386 b/graphics/asymptote/gc/doc/README.DGUX386
new file mode 100644
index 0000000000..98f344c0c8
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.DGUX386
@@ -0,0 +1,39 @@
+ Garbage Collector (parallel version) for x86 DG/UX Release R4.20MU07
+
+
+ *READ* the file README.QUICK.
+
+ You need the GCC-3.0.3 rev (DG/UX) compiler to build this tree.
+ This compiler has the new "dgux386" threads package implemented.
+ It also supports the switch "-pthread" needed to link correctly
+ the DG/UX's -lrte -lthread with -lgcc and the system's -lc.
+ Finally, we support parallel mark for the SMP DG/UX machines.
+ To build the garbage collector do:
+
+ ./configure
+ make
+ make gctest
+
+ Before you run "gctest" you need to set your LD_LIBRARY_PATH
+ correctly so that "gctest" can find the shared library libgc.
+ Alternatively you can do a configuration
+
+ ./configure --disable-shared
+
+ to build only the static version of libgc.
+
+ To enable debugging messages please do:
+ 1) Add the "--enable-gc-debug" flag during configuration.
+ 2) Pass "CFLAGS=-DDEBUG_THREADS" to "make".
+
+ In a machine with 4 CPUs (my own machine), parallel mark makes
+ a BIG difference.
+
+ Takis Psarogiannakopoulos
+
+Note (HB):
+ The integration of this patch is currently not complete.
+ The following patches against 6.1alpha3 where hard to move
+ to alpha4, and are not integrated. There may also be minor
+ problems with stylistic corrections made by me.
+[The diff for ltconfig and ltmain.sh was removed from this file on 2011-08-22]
diff --git a/graphics/asymptote/gc/doc/README.Mac b/graphics/asymptote/gc/doc/README.Mac
new file mode 100644
index 0000000000..018218eedd
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.Mac
@@ -0,0 +1,332 @@
+The contents of this file are old and pertain to pre-MacOSX versions.
+You probably really wanted README.darwin.
+
+---------------------------------------------
+
+Patrick Beard's Notes for building GC with CodeWarrior Pro 2:
+----------------------------------------------------------------------------
+The current build environment for the collector is CodeWarrior Pro 2.
+Projects for CodeWarrior Pro 2 (and for quite a few older versions)
+are distributed in the file Mac_projects.sit.hqx. The project file
+:Mac_projects:gc.prj builds static library versions of the collector.
+:Mac_projects:gctest.prj builds the GC test suite.
+
+Configuring the collector is still done by editing the file
+:extra:Mac_files:MacOS_config.h.
+
+Lars Farm's suggestions on building the collector:
+----------------------------------------------------------------------------
+Garbage Collection on MacOS - a manual 'MakeFile'
+-------------------------------------------------
+
+Project files and IDE's are great on the Macintosh, but they do have
+problems when used as distribution media. This note tries to provide
+porting instructions in pure TEXT form to avoid those problems. A manual
+'makefile' if you like.
+
+ Codewarrior: CWPro1
+ date: 18 July 1997
+
+The notes may or may not apply to earlier or later versions of the CWPro.
+
+This is just to record my experiences. These notes do not mean I now
+provide a supported port of the GC to MacOS. It works for me. If it works
+for you, great. If it doesn't, sorry, try again...;-) Still, if you find
+errors, please let me know.
+
+
+Porting to MacOS is a bit more complex than it first seems. Which MacOS?
+68K/PowerPC? Which compiler? Each supports both 68K and PowerPC and offer a
+large number of (unique to each environment) compiler settings. Each
+combination of compiler/68K/PPC/settings require a unique combination of
+standard libraries. And the IDE's does not select them for you. They don't
+even check that the library is built with compatible setting and this is
+the major source of problems when porting the GC (and otherwise too).
+
+You will have to make choices when you configure the GC. I've made some
+choices here, but there are other combinations of settings and #defines
+that work too.
+
+As for target settings the major obstacles may be:
+- 68K Processor: check "4-byte Ints".
+- PPC Processor: uncheck "Store Static Data in TOC".
+
+What you need to do:
+1) Build the GC as a library
+2) Test that the library works with 'test.c'.
+3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'.
+
+== 1. The Libraries ==
+
+I made one project with four targets (68K/PPC tempmem or appheap). One target
+will suffice if you're able to decide which one you want. I wasn't...
+
+Codewarrior allows a large number of compiler/linker settings. I used these:
+
+Settings shared by all targets:
+------------------------------
+o Access Paths:
+ - User Paths: the GC folder
+ - System Paths: {Compiler}:Metrowerks Standard Library:
+ {Compiler}:MacOS Support:Headers:
+ {Compiler}:MacOS Support:MacHeaders:
+o C/C++ language:
+ - inlining: normal
+ - direct to SOM: off
+ - enable/check: exceptions, RTTI, bool (and if you like pool strings)
+
+PowerPC target settings
+-----------------------
+o Target Settings:
+ - name of target
+ - MacOS PPC Linker
+o PPC Target
+ - name of library
+o C/C++ language
+ - prefix file as described below
+o PPC Processor
+ - Struct Alignment: PowerPC
+ - uncheck "Store Static Data in TOC" -- important!
+ I don't think the others matter, I use full optimization and it is OK
+o PPC Linker
+ - Factory Settings (SYM file with full paths, faster linking, dead-strip
+ static init, Main: __start)
+
+
+68K target settings
+-------------------
+o Target Settings:
+ - name of target
+ - MacOS 68K Linker
+o 68K Target
+ - name of library
+ - A5 relative data
+o C/C++ language
+ - prefix file as described below
+o 68K Processor
+ - Code model: smart
+ - Struct alignment: 68K
+ - FP: SANE
+ - enable 4-Byte Ints -- important!
+ I don't think the others matter. I selected...
+ - enable: 68020
+ - enable: global register allocation
+o IR Optimizer
+ - enable: Optimize Space, Optimize Speed
+ I suppose the others would work too, but haven't tried...
+o 68K Linker
+ - Factory Settings (New Style MacsBug, SYM file with full paths,
+ A6 Frames, fast link, Merge compiler glue into segment 1,
+ dead-strip static init)
+
+Prefix Files to configure the GC sources
+----------------------------------------
+The Codewarrior equivalent of command-line compilers -DNAME=X is to use
+prefix-files. A TEXT file that is automatically #included before the first byte
+of every source file. I used these:
+
+---- ( cut here ) ---- gc_prefix_tempmem.h -- 68K and PPC -----
+ #include "gc_prefix_common.h"
+ #undef USE_TEMPORARY_MEMORY
+ #define USE_TEMPORARY_MEMORY
+---- ( cut here ) ---- gc_prefix_appmem.h -- 68K and PPC -----
+ #include "gc_prefix_common.h"
+ #undef USE_TEMPORARY_MEMORY
+// #define USE_TEMPORARY_MEMORY
+
+---- ( cut here ) ---- gc_prefix_common.h --------------------
+// gc_prefix_common.h
+// ------------------
+// Codewarrior prefix file to configure the GC libraries
+//
+// prefix files are the Codewarrior equivalent of the
+// command line option -Dname=x frequently seen in makefiles
+
+#if !__MWERKS__
+ #error only tried this with Codewarrior
+#endif
+
+#if macintosh
+ #define MSL_USE_PRECOMPILED_HEADERS 0
+ #include <ansi_prefix.mac.h>
+
+ // See list of #defines to configure the library in: 'MakeFile'
+ // see also README
+
+ #define ALL_INTERIOR_POINTERS // follows interior pointers.
+//#define DONT_ADD_BYTE_AT_END // disables the padding if defined.
+//#define SMALL_CONFIG // whether to use a smaller heap.
+ #define GC_ATOMIC_UNCOLLECTABLE // GC_malloc_atomic_uncollectable()
+
+ // define either or none as per personal preference
+ // used in malloc.c
+ #define REDIRECT_MALLOC GC_malloc
+//#define REDIRECT_MALLOC GC_malloc_uncollectable
+ // if REDIRECT_MALLOC is #defined make sure that the GC library
+ // is listed before the ANSI/ISO libs in the Codewarrior
+ // 'Link order' panel
+//#define IGNORE_FREE
+
+ // mac specific configs
+//#define USE_TEMPORARY_MEMORY // use Macintosh temporary memory.
+//#define SHARED_LIBRARY_BUILD // build for use in a shared library.
+
+#else
+ // could build Win32 here too, or in the future
+ // Rhapsody PPC-mach, Rhapsody PPC-MacOS,
+ // Rhapsody Intel-mach, Rhapsody Intel-Win32,...
+ // ... ugh this will get messy ...
+#endif
+
+// make sure ints are at least 32-bit
+// ( could be set to 16-bit by compiler settings (68K) )
+
+struct gc_private_assert_intsize_{ char x[ sizeof(int)>=4 ? 1 : 0 ]; };
+
+#if __powerc
+ #if __option(toc_data)
+ #error turn off "store static data in TOC" when using GC
+ // ... or find a way to add TOC to the root set...(?)
+ #endif
+#endif
+---- ( cut here ) ---- end of gc_prefix_common.h -----------------
+
+Files to build the GC libraries:
+--------------------------------
+ allchblk.c
+ alloc.c
+ blacklst.c
+ checksums.c
+ dbg_mlc.c
+ finalize.c
+ fnlz_mlc.c
+ headers.c
+ mach_dep.c
+ extra/MacOS.c -- contains MacOS code
+ malloc.c
+ mallocx.c
+ mark.c
+ mark_rts.c
+ misc.c
+ new_hblk.c
+ obj_map.c
+ os_dep.c -- contains MacOS code
+ ptr_chck.c
+ reclaim.c
+ typd_mlc.c
+ gc_badalc.cc
+ gc_cpp.cc
+
+== 2. Test that the library works with 'test.c' ==
+
+The test app is just an ordinary ANSI-C console app. Make sure settings
+match the library you're testing.
+
+Files
+-----
+ test.c
+ the GC library to test -- link order before ANSI libs
+ suitable Mac+ANSI libraries
+
+prefix:
+------
+---- ( cut here ) ---- gc_prefix_testlib.h -- all libs -----
+#define MSL_USE_PRECOMPILED_HEADERS 0
+#include <ansi_prefix.mac.h>
+#undef NDEBUG
+
+#define ALL_INTERIOR_POINTERS /* for GC_priv.h */
+---- ( cut here ) ----
+
+== 3. Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc' ==
+
+The test app is just an ordinary ANSI-C console app. Make sure settings match
+the library you're testing.
+
+Files
+-----
+ test_cpp.cc
+ the GC library to test -- link order before ANSI libs
+ suitable Mac+ANSI libraries
+
+prefix:
+------
+same as for test.c
+
+For convenience I used one test-project with several targets so that all
+test apps are build at once. Two for each library to test: test.c and
+gc_app.cc. When I was satisfied that the libraries were OK. I put the
+libraries + gc.h + the c++ interface-file in a folder that I then put into
+the MSL hierarchy so that I don't have to alter access-paths in projects
+that use the GC.
+
+After that, just add the proper GC library to your project and the GC is in
+action! malloc will call GC_malloc and free GC_free, new/delete too. You
+don't have to call free or delete. You may have to be a bit cautious about
+delete if you're freeing other resources than RAM. See gc_cpp.h. You can
+also keep coding as always with delete/free. That works too. If you want,
+include "gc.h" and tweak its use a bit.
+
+== Symantec SPM ==
+
+It has been a while since I tried the GC in SPM, but I think that the above
+instructions should be sufficient to guide you through in SPM too. SPM
+needs to know where the global data is. Use the files 'datastart.c' and
+'dataend.c'. Put 'datastart.c' at the top of your project and 'dataend.c'
+at the bottom of your project so that all data is surrounded. This is not
+needed in Codewarrior because it provides intrinsic variables
+__datastart__, __data_end__ that wraps all globals.
+
+
+ It worked for me, hope it works for you.
+
+ Lars Farm
+----------------------------------------------------------------------------
+
+
+Patrick Beard's instructions (may be dated):
+
+The collector should run under Symantec C++/THINK C v7.0.4, and
+Metrowerks C/C++ v4.5 both 68K and PowerPC. Project files are provided
+to build and test the collector under both development systems.
+
+Configuration
+-------------
+
+To configure the collector, under both development systems, a prefix file
+is used to set preprocessor directives. This file is called "MacOS_config.h".
+
+Testing
+-------
+
+To test the collector (always a good idea), build one of the gctest projects,
+gctest. (Symantec C++/THINK C), mw/gctest.68K, or mw/gctest.PPC. The
+test will ask you how many times to run; 1 should be sufficient.
+
+Building
+--------
+
+For your convenience project files for the major Macintosh development
+systems are provided.
+
+For Symantec C++/THINK C, you must build the two projects gclib-1 and
+gclib-2. It has to be split up because the collector has more than 32 KB
+of static data and no library can have more than this in the Symantec
+environment. (Future versions will probably fix this.)
+
+For Metrowerks C/C++ 4.5 you build gc.68K/PPC and the result will
+be a library called gc.68K.lib/gc.PPC.lib.
+
+Using
+-----
+
+Under Symantec C++/THINK C, you can just add the gclib-1 and gclib-2
+projects to your own project. Under Metrowerks, you add gc.68K.lib or
+gc.PPC.lib and two additional files. You add the files called datastart.c
+and dataend.c to your project, bracketing all files that use the collector.
+See mw/gctest for an example.
+
+Include the projects/libraries you built above into your own project,
+#include "gc.h", and call GC_malloc. You don't have to call GC_free.
+
+Patrick C. Beard
diff --git a/graphics/asymptote/gc/doc/README.OS2 b/graphics/asymptote/gc/doc/README.OS2
new file mode 100644
index 0000000000..5aaf84c04e
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.OS2
@@ -0,0 +1,6 @@
+The code assumes static linking, and a single thread. The editor de has
+not been ported. The cord test program has. The supplied OS2_MAKEFILE
+assumes the IBM C Set/2 environment, but the code shouldn't.
+
+Since we haven't figured out how to do partial linking or to build static
+libraries, clients currently need to link against a long list of executables.
diff --git a/graphics/asymptote/gc/doc/README.amiga b/graphics/asymptote/gc/doc/README.amiga
new file mode 100644
index 0000000000..53efc9a625
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.amiga
@@ -0,0 +1,284 @@
+ Kjetil S. Matheussen's notes (28-11-2000)
+
+Compiles under SAS/C again. Should also still compile under other
+Amiga compilers without big changes. I haven't checked if it still
+works under gcc, because I don't have gcc for Amiga. But I have
+updated 'Makefile', and hope it compiles fine.
+
+
+WHATS NEW:
+
+1.
+ Made a pretty big effort in preventing GC allocating-functions from
+ returning chip-mem.
+
+ The lower part of the new file AmigaOS.c does this in various ways, mainly by
+ wrapping GC_malloc, GC_malloc_atomic, GC_malloc_uncollectable,
+ GC_malloc_atomic_uncollectable, GC_malloc_ignore_off_page
+ and GC_malloc_atomic_ignore_off_page. GC_realloc is also wrapped, but
+ doesn't do the same effort in preventing to return chip-mem.
+ Other allocating-functions (e.g., GC_*_typed) can probably be
+ used without any problems, but beware that the warn hook will not be called.
+ In case of problems, don't define GC_AMIGA_FASTALLOC.
+
+ Programs using more time actually using the memory allocated
+ (instead of just allocate and free rapidly) have
+ the most to earn on this, but even gctest now normally runs twice
+ as fast and uses less memory, on my poor 8 MB machine.
+
+ The changes have only effect when there is no more
+ fast-mem left. But with the way GC works, it
+ could happen quite often. Beware that an atexit handler had to be added,
+ so using the abort() function will make a big memory-loss.
+ If you absolutely must call abort() instead of exit(), try calling
+ the GC_amiga_free_all_mem function before abort().
+
+ New Amiga-specific compilation flags:
+
+ GC_AMIGA_FASTALLOC - By NOT defining this option, GC will work like before,
+ it will not try to force fast-mem out of the OS, and
+ it will use normal calloc for allocation, and the rest
+ of the following flags will have no effect.
+
+ GC_AMIGA_ONLYFAST - Makes GC never to return chip-mem. GC_AMIGA_RETRY have
+ no effect if this flag is set.
+
+ GC_AMIGA_GC - If gc returns NULL, do a GC_gcollect, and try again. This
+ usually is a success with the standard GC configuration.
+ It is also the most important flag to set to prevent
+ GC from returning chip-mem. Beware that it slows down a lot
+ when a program is rapidly allocating/deallocating when
+ there's either very little fast-memory left or very little
+ chip-memory left. It's not a very common situation, but gctest
+ sometimes (very rare) use many minutes because of this.
+
+ GC_AMIGA_RETRY - If gc succeed allocating memory, but it is chip-mem,
+ try again and see if it is fast-mem. Most of the time,
+ it will actually return fast-mem for the second try.
+ I have set max number of retries to 9 or size/5000. You
+ can change this if you like. (see GC_amiga_rec_alloc())
+
+ GC_AMIGA_PRINTSTATS - Gather some statistics during the execution of a
+ program, and prints out the info when the atexit-handler
+ is called.
+
+ My recommendation is to set all this flags, except GC_AMIGA_PRINTSTATS and
+ GC_AMIGA_ONLYFAST.
+
+ If your program demands high response-time, you should
+ not define GC_AMIGA_GC, and possible also define GC_AMIGA_ONLYFAST.
+ GC_AMIGA_RETRY does not seem to slow down much.
+
+ Also, when compiling up programs, and GC_AMIGA_FASTALLOC was not defined when
+ compiling gc, you can define GC_AMIGA_MAKINGLIB to avoid having these allocation-
+ functions wrapped. (see gc.h)
+
+ Note that GC_realloc must not be called before any of
+ the other above mentioned allocating-functions have been called. (shouldn't be
+ any programs doing so either, I hope).
+
+ Another note. The allocation-function is wrapped when defining
+ GC_AMIGA_FASTALLOC by letting the function go thru the new
+ GC_amiga_allocwrapper_do function-pointer (see gc.h). Means that
+ sending function-pointers, such as GC_malloc, GC_malloc_atomic, etc.,
+ for later to be called, e.g., like this, (*GC_malloc_function_pointer)(size),
+ will not wrap the function. This is normally not a big problem, unless
+ all allocation function is called like this, which will cause the
+ atexit un-allocating function never to be called. Then you either
+ have to manually add the atexit handler, or call the allocation-
+ functions function-pointer functions like this;
+ (*GC_amiga_allocwrapper_do)(size,GC_malloc_function_pointer).
+ There are probably better ways this problem could be handled, unfortunately,
+ I didn't find any without rewriting or replacing a lot of the GC-code, which
+ I really didn't want to. (Making new GC_malloc_* functions, and just
+ defining, e.g., GC_malloc as GC_amiga_malloc should work too).
+
+
+ New Amiga-specific function:
+
+ void GC_amiga_set_toany(void (*func)(void));
+
+ 'func' is a function that will be called right before gc has to change
+ allocation-method from MEMF_FAST to MEMF_ANY. I.e., when it is likely
+ it will return chip-mem.
+
+
+2. A few small compiler-specific additions to make it compile with SAS/C again.
+
+3. Updated and rewritten the SMakefile.amiga, so that it works again and that
+ the "unnecessary" 'SCOPTIONS' files could be removed. Also included
+ the cord-smakefile stuff in the main smakefile, so that the cord smakefile
+ could be removed too. By typing "smake -f SMakefile.amiga", both gc.lib and
+ cord.lib will be made.
+
+
+
+STILL MISSING:
+
+Programs can not be started from workbench, at least not for SAS/C. (Martin
+Tauchmanns note about that it now works with workbench is definitely wrong
+when concerning SAS/C). An iconx-script solves this problem.
+
+
+BEWARE!
+
+-To run gctest, set the stack to around 200000 bytes first.
+-SAS/C-specific: cord will crash if you compile gc.lib with
+ either parm=reg or parm=both. (missing legal prototypes for
+ function-pointers someplace is the reason I guess.).
+
+
+tested with software: Radium, http://www.stud.ifi.uio.no/~ksvalast/radium/
+tested with hardware: MC68060
+
+
+ Martin Tauchmann's notes (1-Apr-99)
+
+Works now, also with the GNU-C compiler V2.7.2.1. <ftp://ftp.unina.it/pub/amiga/geekgadgets/amiga/m68k/snapshots/971125/amiga-bin/>
+Modify the `Makefile`
+CC=cc $(ABI_FLAG)
+to
+CC=gcc $(ABI_FLAG)
+
+TECHNICAL NOTES
+
+- `GC_get_stack_base()`, `GC_register_data_segments()` works now with every
+ C compiler; also Workbench.
+
+- Removed AMIGA_SKIP_SEG, but the Code-Segment must not be scanned by GC.
+
+
+PROBLEMS
+- When the Linker, does`t merge all Code-Segments to an single one. LD of GCC
+ do it always.
+
+- With ixemul.library V47.3, when an GC program launched from another program
+ (example: `Make` or `if_mach M68K AMIGA gctest`), `GC_register_data_segments()`
+ found the Segment-List of the caller program.
+ Can be fixed, if the run-time initialization code (for C programs, usually *crt0*)
+ support `__data` and `__bss`.
+
+- PowerPC Amiga currently not supported.
+
+- Dynamic libraries (dyn_load.c) not supported.
+
+
+TESTED WITH SOFTWARE
+
+`Optimized Oberon 2 C` (oo2c) <http://cognac.informatik.uni-kl.de/download/index.html>
+
+
+TESTED WITH HARDWARE
+
+MC68030
+
+
+ Michel Schinz's notes
+
+WHO DID WHAT
+
+The original Amiga port was made by Jesper Peterson. I (Michel Schinz)
+modified it slightly to reflect the changes made in the new official
+distributions, and to take advantage of the new SAS/C 6.x features. I also
+created a makefile to compile the "cord" package (see the cord
+subdirectory).
+
+TECHNICAL NOTES
+
+In addition to Jesper's notes, I have the following to say:
+
+- gctest checks to see if the code segment is added to the root set or not,
+ and complains if it is. The only problem is that, as far as I know, it is
+ impossible to know which segments are code segments and which are data
+ segments (there are indeed solutions to this problem, like scanning the
+ program on disk or patch the LoadSeg functions, but they are rather
+ complicated). The solution I have chosen (see os_dep.c) is to test whether
+ the program counter is in the segment we are about to add to the root set,
+ and if it is, to skip the segment. The problems are that this solution is
+ rather awkward and that it works only for one code segment. This means that
+ if your program has more than one code segment, all of them but one will be
+ added to the root set. This isn't a big problem in fact, since the
+ collector will continue to work correctly, but it may be slower.
+
+ Anyway, the code which decides whether to skip a segment or not can be
+ removed simply by not defining AMIGA_SKIP_SEG. But notice that if you do
+ so, gctest will complain (it will say that "GC_is_visible produced wrong
+ failure indication"). However, it may be useful if you happen to have
+ pointers stored in a code segment (you really shouldn't).
+
+ If anyone has a good solution to the problem of finding, when a program
+ is loaded in memory, whether a segment is a code or a data segment,
+ please let me know.
+
+
+ Jesper Peterson's notes
+
+ADDITIONAL NOTES FOR AMIGA PORT
+
+These notes assume some familiarity with Amiga internals.
+
+WHY I PORTED TO THE AMIGA
+
+The sole reason why I made this port was as a first step in getting
+the Sather(*) language on the Amiga. A port of this language will
+be done as soon as the Sather 1.0 sources are made available to me.
+Given this motivation, the garbage collection (GC) port is rather
+minimal.
+
+(*) For information on Sather read the comp.lang.sather newsgroup.
+
+LIMITATIONS
+
+This port assumes that the startup code linked with target programs
+is that supplied with SAS/C versions 6.0 or later. This allows
+assumptions to be made about where to find the stack base pointer
+and data segments when programs are run from WorkBench, as opposed
+to running from the CLI. The compiler dependent code is all in the
+GC_get_stack_base() and GC_register_data_segments() functions, but
+may spread as I add Amiga specific features.
+
+Given that SAS/C was assumed, the port is set up to be built with
+"smake" using the "SMakefile". Compiler options in "SCoptions" can
+be set with "scopts" program. Both "smake" and "scopts" are part of
+the SAS/C commercial development system.
+
+In keeping with the porting philosophy outlined above, this port
+will not behave well with Amiga specific code. Especially not inter-
+process communications via messages, and setting up public structures like
+Intuition objects or anything else in the system lists. For the
+time being the use of this library is limited to single threaded
+ANSI/POSIX compliant or near-compliant code. (i.e., stick to stdio
+for now). Given this limitation there is currently no mechanism for
+allocating "CHIP" or "PUBLIC" memory under the garbage collector.
+I'll add this after giving it considerable thought. The major
+problem is the entire physical address space may have to me scanned,
+since there is no telling who we may have passed memory to.
+
+If you allocate your own stack in client code, you will have to
+assign the pointer plus stack size to GC_stackbottom.
+
+The initial stack size of the target program can be compiled in by
+setting the __stack symbol (see SAS documentation). It can be over-
+ridden from the CLI by running the AmigaDOS "stack" program, or from
+the WorkBench by setting the stack size in the tool types window.
+
+SAS/C COMPILER OPTIONS (SCoptions)
+
+You may wish to check the "CPU" code option is appropriate for your
+intended target system.
+
+Under no circumstances set the "StackExtend" code option in either
+compiling the library or *ANY* client code.
+
+All benign compiler warnings have been suppressed. These mainly
+involve lack of prototypes in the code, and dead assignments
+detected by the optimizer.
+
+THE GOOD NEWS
+
+The library as it stands is compatible with the GigaMem commercial
+virtual memory software, and probably similar PD software.
+
+The performance of "gctest" on an Amiga 2630 (68030 @ 25 MHz)
+compares favorably with an HP9000 with similar architecture (a 325
+with a 68030 I think).
diff --git a/graphics/asymptote/gc/doc/README.arm.cross b/graphics/asymptote/gc/doc/README.arm.cross
new file mode 100644
index 0000000000..9e60dda77b
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.arm.cross
@@ -0,0 +1,62 @@
+From: Margaret Fleck
+
+Here's the key details of what worked for me, in case anyone else needs them.
+There may well be better ways to do some of this, but ....
+ -- Margaret
+
+
+The badge4 has a StrongArm-1110 processor and a StrongArm-1111 coprocessor.
+
+Assume that the garbage collector distribution is unpacked into /home/arm/gc,
+which is visible to both the ARM machine and a linux desktop (e.g. via NFS mounting).
+
+Assume that you have a file /home/arm/config.site with contents something like the
+example attached below. Notice that our local ARM toolchain lives in
+/skiff/local.
+
+Go to /home/arm/gc directory. Do
+ CONFIG_SITE=/home/arm/config.site ./configure --target=arm-linux
+--prefix=/home/arm/gc
+
+On your desktop, do:
+ make
+ make install
+The main garbage collector library should now be in ../gc/lib/libgc.so.
+
+To test the garbage collector, first do the following on your desktop
+ make gctest
+ ./gctest
+Then do the following on the ARM machine
+ cd .libs
+ ./lt-gctest
+
+Do not try to do "make check" (the usual way of running the test
+program). This does not work and seems to erase some of the important
+files.
+
+The gctest program claims to have succeeded. Haven't run any further tests
+with it, though I'll be doing so in the near future.
+
+-------------------------------
+# config.site for configure
+
+HOSTCC=gcc
+
+# Names of the cross-compilers
+CC=/skiff/local/bin/arm-linux-gcc
+CXX=/skiff/local/bin/arm-linux-gcc
+
+# The cross compiler specific options
+CFLAGS="-O2 -fno-exceptions"
+CXXFLAGS="-O2 -fno-exceptions"
+CPPFLAGS="-O2 -fno-exceptions"
+LDFLAGS=""
+
+# Some other programs
+AR=/skiff/local/bin/arm-linux-ar
+RANLIB=/skiff/local/bin/arm-linux-ranlib
+NM=/skiff/local/bin/arm-linux-nm
+ac_cv_path_NM=/skiff/local/bin/arm-linux-nm
+ac_cv_func_setpgrp_void=yes
+x_includes=/skiff/local/arm-linux/include/X11
+x_libraries=/skiff/local/arm-linux/lib/X11
diff --git a/graphics/asymptote/gc/doc/README.autoconf b/graphics/asymptote/gc/doc/README.autoconf
new file mode 100644
index 0000000000..dd3734020e
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.autoconf
@@ -0,0 +1,59 @@
+We support GNU-style builds based on automake, autoconf and libtool.
+This is based almost entirely on Tom Tromey's work with gcj.
+
+To build and install libraries use
+
+configure; make; make install
+
+The advantages of this process are:
+
+1) It should eventually do a better job of automatically determining the
+right compiler to use, etc. It probably already does in some cases.
+
+2) It tries to automatically set a good set of default GC parameters for
+the platform (e.g. thread support). It provides an easier way to configure
+some of the others.
+
+3) It integrates better with other projects using a GNU-style build process.
+
+4) It builds both dynamic and static libraries.
+
+The known disadvantages are:
+
+1) The build scripts are much more complex and harder to debug (though largely
+standard). I don't understand them all, and there's probably lots of redundant
+stuff.
+
+2) It probably doesn't work on all Un*x-like platforms yet. It probably will
+never work on the rest.
+
+3) The scripts are not yet complete. Some of the standard GNU targets don't
+yet work. (Corrections/additions are very welcome.)
+
+The distribution should contain all files needed to run "configure" and "make",
+as well as the sources needed to regenerate the derived files. (If I missed
+some, please let me know.)
+
+Note that the distribution comes without "Makefile" which is generated by
+"configure". The distribution also contains "Makefile.direct" which is not
+always equivalent to the generated one.
+
+Important options to configure:
+
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [/usr/local]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --enable-threads=TYPE choose threading package
+ --disable-parallel-mark do not parallelize marking and free list
+ construction
+ --enable-gc-debug include full support for pointer back-tracing, etc.
+
+
+Unless --prefix is set (or --exec-prefix or one of the more obscure options),
+"make install" will install libgc.a and libgc.so in /usr/local/lib and
+/usr/local/bin, respectively, which would typically require the "make install"
+to be run as root.
+
+It is not recommended to turn off parallel marking for multiprocessors unless
+a poor support of the feature on the platform.
diff --git a/graphics/asymptote/gc/doc/README.cmake b/graphics/asymptote/gc/doc/README.cmake
new file mode 100644
index 0000000000..d38ac6ac2b
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.cmake
@@ -0,0 +1,62 @@
+
+CMAKE
+-----
+
+Unix and Win32 binaries (both 32- and 64-bit) can be built using CMake.
+CMake is an open-source tool like automake - it generates makefiles.
+
+CMake v3.14.5 is able to generate:
+ Borland Makefiles
+ MSYS Makefiles
+ MinGW Makefiles
+ NMake Makefiles
+ Unix Makefiles
+ Visual Studio 16 2019
+ Visual Studio 15 2017
+ Visual Studio 14 2015
+ Visual Studio 12 2013
+ Visual Studio 11 2012
+ Visual Studio 10 2010
+ Visual Studio 9 2008
+ Watcom WMake
+
+
+BUILD PROCESS
+-------------
+
+ . install cmake (cmake.org)
+ . add directory containing cmake.exe to %PATH%
+ . run cmake from the gc root directory, passing the target with -G:
+ e.g.,
+ > cmake -G "Visual Studio 9 2008" .
+ use the gc.sln file generated by cmake to build gc
+ . specify -Denable_cplusplus=ON option to build gccpp, gctba (GC C++ support)
+ . specify -Dbuild_tests=ON option to the tests (and run them by "ctest -V")
+ . you can also run cmake from a build directory to build outside of
+ the source tree. Just specify the path to the source tree:
+ e.g.,
+ > mkdir out
+ > cd out
+ > cmake -G "Visual Studio 9 2008" ..
+ > cmake --build . --config Release
+ > ctest --build-config Release -V
+
+
+INPUT
+-----
+
+The main input to cmake is CMakeLists.txt file in the GC root directory. For
+help, go to cmake.org.
+
+
+HOW TO IMPORT BDWGC
+-------------------
+
+Another project could add bdwgc as one of its dependencies with something like
+this in their CMakeLists.txt:
+
+find_package(BDWgc 8.2.8 REQUIRED)
+add_executable(Foo foo.c)
+target_link_libraries(Foo BDWgc::gc)
+
+Other exported libraries are: cord, gccpp, gctba.
diff --git a/graphics/asymptote/gc/doc/README.cords b/graphics/asymptote/gc/doc/README.cords
new file mode 100644
index 0000000000..02477f4da6
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.cords
@@ -0,0 +1,45 @@
+Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program
+for any purpose, provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is granted,
+provided the above notices are retained, and a notice that the code was
+modified is included with the above copyright notice.
+
+This is a string packages that uses a tree-based representation.
+See cord.h for a description of the functions provided. Ec.h describes
+"extensible cords", which are essentially output streams that write
+to a cord. These allow for efficient construction of cords without
+requiring a bound on the size of a cord.
+
+More details on the data structure can be found in
+
+Boehm, Atkinson, and Plass, "Ropes: An Alternative to Strings",
+Software Practice and Experience 25, 12, December 1995, pp. 1315-1330.
+
+A fundamentally similar "rope" data structure is also part of SGI's standard
+template library implementation, and its descendants, which include the
+GNU C++ library. That uses reference counting by default.
+There is a short description of that data structure at
+http://www.sgi.com/tech/stl/ropeimpl.html .
+
+All of these are descendants of the "ropes" in Xerox Cedar.
+
+cord/tests/de.c is a very dumb text editor that illustrates the use of cords.
+It maintains a list of file versions. Each version is simply a
+cord representing the file contents. Nonetheless, standard
+editing operations are efficient, even on very large files.
+(Its 3 line "user manual" can be obtained by invoking it without
+arguments. Note that ^R^N and ^R^P move the cursor by
+almost a screen. It does not understand tabs, which will show
+up as highlighted "I"s. Use the UNIX "expand" program first.)
+To build the editor, type "make de" in the gc directory.
+
+Note that CORD_printf and friends use C functions with variable numbers
+of arguments in non-standard-conforming ways. This code is known to
+break on some platforms, notably PowerPC. It should be possible to
+build the remainder of the library (everything but cordprnt.c) on
+any platform that supports the collector.
diff --git a/graphics/asymptote/gc/doc/README.darwin b/graphics/asymptote/gc/doc/README.darwin
new file mode 100644
index 0000000000..32a5fb1701
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.darwin
@@ -0,0 +1,81 @@
+Darwin/MacOSX Support - December 16, 2003
+
+== Build Notes ==
+
+Building can be done with autoconf as normal. If you want to build
+a Universal library using autoconf, you need to disable dependency
+tracking and specify your desired architectures in CFLAGS:
+
+CFLAGS="-arch ppc -arch i386 -arch x86_64" ./configure --disable-dependency-tracking
+
+
+== Important Usage Notes ==
+
+GC_INIT() MUST be called before calling any other GC functions. This
+is necessary to properly register segments in dynamic libraries. This
+call is required even if you code does not use dynamic libraries as the
+dyld code handles registering all data segments.
+
+When your use of the garbage collector is confined to dylibs and you
+cannot call GC_INIT() before your libraries' static initializers have
+run and perhaps called GC_malloc(), create an initialization routine
+for each library to call GC_INIT(), e.g.:
+
+#include "gc.h"
+extern "C" void my_library_init() { GC_INIT(); }
+
+Compile this code into a my_library_init.o, and link it into your
+dylib. When you link the dylib, pass the -init argument with
+_my_library_init (e.g. gcc -dynamiclib -o my_library.dylib a.o b.o c.o
+my_library_init.o -init _my_library_init). This causes
+my_library_init() to be called before any static initializers, and
+will initialize the garbage collector properly.
+
+Note: It doesn't hurt to call GC_INIT() more than once, so it's best,
+if you have an application or set of libraries that all use the
+garbage collector, to create an initialization routine for each of
+them that calls GC_INIT(). Better safe than sorry.
+
+Thread-local GC allocation will not work with threads that are not
+created using the GC-provided override of pthread_create(). Threads
+created without the GC-provided pthread_create() do not have the
+necessary data structures in the GC to store this data.
+
+
+== Implementation Information ==
+
+Darwin/MacOSX support is nearly complete. Thread support is reliable on
+Darwin 6.x (MacOSX 10.2) and there have been reports of success on older
+Darwin versions (MacOSX 10.1). Shared library support had also been
+added and the gc can be run from a shared library.
+
+Thread support is implemented in terms of mach thread_suspend and
+thread_resume calls. These provide a very clean interface to thread
+suspension. This implementation doesn't rely on pthread_kill so the
+code works on Darwin < 6.0 (MacOSX 10.1). All the code to stop and
+start the world is located in darwin_stop_world.c.
+
+Since not all uses of the GC enable clients to override pthread_create()
+before threads have been created, the code for stopping the world has
+been rewritten to look for threads using Mach kernel calls. Each
+thread identified in this way is suspended and resumed as above. In
+addition, since Mach kernel threads do not contain pointers to their
+stacks, a stack-walking function has been written to find the stack
+limits. Given an initial stack pointer (for the current thread, a
+pointer to a stack-allocated local variable will do; for a non-active
+thread, we grab the value of register 1 (on PowerPC)), it
+will walk the PPC Mach-O-ABI compliant stack chain until it reaches the
+top of the stack. This appears to work correctly for GCC-compiled C,
+C++, Objective-C, and Objective-C++ code, as well as for Java
+programs that use JNI. If you run code that does not follow the stack
+layout or stack pointer conventions laid out in the PPC Mach-O ABI,
+then this will likely crash the garbage collector.
+
+Mach has a very clean interface to exception handing. So, the current
+implementation of the incremental collection uses Mach's exception handling.
+
+Much thanks goes to Andrew Stone, Dietmar Planitzer, Andrew Begel,
+Jeff Sturm, and Jesse Rosenstock for all their work on the
+Darwin/OS X port.
+
+-Brian Alliet
diff --git a/graphics/asymptote/gc/doc/README.emscripten b/graphics/asymptote/gc/doc/README.emscripten
new file mode 100644
index 0000000000..c869f19ace
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.emscripten
@@ -0,0 +1,15 @@
+
+The build system (at least autotools-based) should detect and configure
+emscripten correctly.
+
+As of now, gctest almost passes, except for the tests that involve a_get().
+
+No thread support for now. No idea how to stop other threads (perhaps we need
+support from JS side).
+
+How to build:
+
+ # source EMSDK first
+ emconfigure ./configure
+ emmake make gctest.html
+ # point your browser at .libs/gctest.html
diff --git a/graphics/asymptote/gc/doc/README.environment b/graphics/asymptote/gc/doc/README.environment
new file mode 100644
index 0000000000..d2237c10f5
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.environment
@@ -0,0 +1,185 @@
+The garbage collector looks at a number of environment variables which are,
+then, used to affect its operation.
+
+GC_INITIAL_HEAP_SIZE=<bytes> - Initial heap size in bytes. May speed up
+ process start-up. Optionally, may be
+ specified with a multiplier ('k', 'M' or 'G')
+ suffix.
+
+GC_MAXIMUM_HEAP_SIZE=<bytes> - Maximum collected heap size. Allows
+ a multiplier suffix.
+
+GC_LOOP_ON_ABORT - Causes the collector abort routine to enter a tight loop.
+ This may make it easier to debug, such a process, especially
+ for multi-threaded platforms that don't produce usable core
+ files, or if a core file would be too large. On some
+ platforms, this also causes SIGSEGV to be caught and
+ result in an infinite loop in a handler, allowing
+ similar debugging techniques.
+
+GC_PRINT_STATS - Turn on GC logging. Not functional with SMALL_CONFIG.
+
+GC_LOG_FILE - The name of the log file. Stderr by default. Not functional
+ with SMALL_CONFIG.
+
+GC_ONLY_LOG_TO_FILE - Turns off redirection of GC stdout and stderr to the log
+ file specified by GC_LOG_FILE. Has no effect unless
+ GC_LOG_FILE is set. Not functional with SMALL_CONFIG.
+
+GC_PRINT_VERBOSE_STATS - Turn on even more logging. Not functional with
+ SMALL_CONFIG.
+
+GC_DUMP_REGULARLY - Generate a GC debugging dump (by GC_dump_named) on startup
+ and during every collection. Very verbose. Useful
+ if you have a bug to report, but please include only the
+ last complete dump.
+
+GC_COLLECT_AT_MALLOC=<n> - Override the default value specified by
+ GC_COLLECT_AT_MALLOC macro. Has no effect unless
+ GC is built with GC_COLLECT_AT_MALLOC defined.
+
+GC_BACKTRACES=<n> - Generate n random back-traces (for heap profiling) after
+ each GC. Collector must have been built with
+ KEEP_BACK_PTRS. This won't generate useful output unless
+ most objects in the heap were allocated through debug
+ allocators. This is intended to be only a statistical
+ sample; individual traces may be erroneous due to
+ concurrent heap mutation.
+
+GC_PRINT_ADDRESS_MAP - Linux only. Dump /proc/self/maps, i.e. various address
+ maps for the process, to stderr on every GC. Useful for
+ mapping root addresses to source for deciphering leak
+ reports.
+
+GC_NPROCS=<n> - Linux w/threads only. Explicitly sets the number of processors
+ that the GC should expect to use. Note that setting this to 1
+ when multiple processors are available will preserve
+ correctness, but may lead to really horrible performance,
+ since the lock implementation will immediately yield without
+ first spinning.
+
+GC_MARKERS=<n> - Only if compiled with PARALLEL_MARK. Set the number
+ of marker threads. This is normally set to the number of
+ processors. It is safer to adjust GC_MARKERS than GC_NPROCS,
+ since GC_MARKERS has no impact on the lock implementation.
+
+GC_NO_BLACKLIST_WARNING - Prevents the collector from issuing
+ warnings about allocations of very large blocks.
+ Deprecated. Use GC_LARGE_ALLOC_WARN_INTERVAL instead.
+
+GC_LARGE_ALLOC_WARN_INTERVAL=<n> - Print every nth warning about very large
+ block allocations, starting with the nth one. Small values
+ of n are generally benign, in that a bounded number of
+ such warnings generally indicate at most a bounded leak.
+ For best results it should be set at 1 during testing.
+ Default is 5. Very large numbers effectively disable the
+ warning.
+
+GC_IGNORE_GCJ_INFO - Ignore the type descriptors implicitly supplied by
+ GC_gcj_malloc and friends. This is useful for debugging
+ descriptor generation problems, and possibly for
+ temporarily working around such problems. It forces a
+ fully conservative scan of all heap objects except
+ those known to be pointer-free, and may thus have other
+ adverse effects.
+
+GC_PRINT_BACK_HEIGHT - Print max length of chain through unreachable objects
+ ending in a reachable one. If this number remains
+ bounded, then the program is "GC robust". This ensures
+ that a fixed number of misidentified pointers can only
+ result in a bounded space leak. This currently only
+ works if debugging allocation is used throughout.
+ It increases GC space and time requirements appreciably.
+ This feature is still somewhat experimental, and requires
+ that the collector have been built with MAKE_BACK_GRAPH
+ defined. For details, see Boehm, "Bounding Space Usage
+ of Conservative Garbage Collectors", POPL 2001
+ (http://www.hpl.hp.com/techreports/2001/HPL-2001-251.html).
+
+GC_RETRY_SIGNALS - Try to compensate for lost
+ thread suspend and restart signals (Pthreads only).
+ On by default for OSF1 (Tru64) or if the library is
+ sanitized, off otherwise. Since we've previously seen
+ similar issues on some other operating systems, it
+ was turned into a runtime flag to enable last-minute
+ work-arounds. "0" value means "do not retry signals".
+
+GC_USE_GETWRITEWATCH=<n> - Only if MPROTECT_VDB and (GWW_VDB or SOFT_VDB) are
+ both defined (Win32 and Linux only). Explicitly specify
+ which strategy of keeping track of dirtied pages should
+ be used. If n=0, then fall back to protecting pages and
+ catching memory faults strategy), else the collector
+ tries to use GetWriteWatch-based strategy (GWW_VDB) or
+ soft-dirty bits strategy (SOFT_VDB) first if available.
+
+GC_DISABLE_INCREMENTAL - Ignore runtime requests to enable incremental GC.
+ Useful for debugging.
+
+The following turn on runtime flags that are also program settable. Checked
+only during initialization. We expect that they will usually be set through
+other means, but this may help with debugging and testing:
+
+GC_ENABLE_INCREMENTAL - Turn on incremental collection at startup. Note that,
+ depending on platform and collector configuration, this
+ may involve write protecting pieces of the heap to
+ track modifications. These pieces may include
+ pointer-free objects or not. Although this is intended
+ to be transparent, it may cause unintended system call
+ failures. Use with caution.
+
+GC_PAUSE_TIME_TARGET - Set the desired garbage collector pause time in
+ milliseconds (ms). This only has an effect if incremental
+ collection is enabled. If a collection requires
+ appreciably more time than this, the client will be
+ restarted, and the collector will need to do additional
+ work to compensate. The special value "999999" indicates
+ that pause time is unlimited, and the incremental
+ collector will behave completely like a simple
+ generational collector. Any value, except for the given
+ special one, disables parallel marker (almost fully) for
+ now.
+
+GC_FULL_FREQUENCY - Set the desired number of partial collections between full
+ collections. Matters only if GC_incremental is set.
+ Not functional with SMALL_CONFIG.
+
+GC_FREE_SPACE_DIVISOR - Set GC_free_space_divisor to the indicated value.
+ Setting it to larger values decreases space consumption
+ and increases GC frequency.
+
+GC_UNMAP_THRESHOLD - Set the desired memory blocks unmapping threshold (the
+ number of sequential garbage collections for which
+ a candidate block for unmapping should remain free). The
+ special value "0" completely disables unmapping.
+
+GC_FORCE_UNMAP_ON_GCOLLECT - Turn "unmap as much as possible on explicit GC"
+ mode on (overrides the default value). Has no effect on
+ implicitly-initiated garbage collections. Has no effect if
+ memory unmapping is disabled (or not compiled in) or if the
+ unmapping threshold is 1.
+
+GC_FIND_LEAK - Turns on GC_find_leak and thus leak detection. Forces a
+ collection at program termination to detect leaks that would
+ otherwise occur after the last GC.
+
+GC_FINDLEAK_DELAY_FREE - Turns on deferred freeing of objects in the
+ leak-finding mode (see the corresponding macro
+ description for more information).
+
+GC_ABORT_ON_LEAK - Causes the application to be terminated once leaked or
+ smashed objects are found.
+
+GC_ALL_INTERIOR_POINTERS - Turns on GC_all_interior_pointers and thus interior
+ pointer recognition.
+
+GC_DONT_GC - Turns off garbage collection. Use cautiously.
+
+GC_USE_ENTIRE_HEAP - Set desired GC_use_entire_heap value at start-up. See
+ the similar macro description in README.macros.
+
+GC_TRACE=addr - Intended for collector debugging. Requires that the collector
+ have been built with ENABLE_TRACE defined. Causes the debugger
+ to log information about the tracing of address ranges
+ containing addr. Typically addr is the address that contains
+ a pointer to an object that mysteriously failed to get marked.
+ Addr must be specified as a hexadecimal integer.
diff --git a/graphics/asymptote/gc/doc/README.ews4800 b/graphics/asymptote/gc/doc/README.ews4800
new file mode 100644
index 0000000000..83e8b1e07b
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.ews4800
@@ -0,0 +1,81 @@
+GC on EWS4800
+-------------
+
+1. About EWS4800
+
+ EWS4800 is a 32/64-bit workstation.
+
+ Vendor: NEC Corporation
+ OS: UX/4800 R9.* - R13.* (SystemV R4.2)
+ CPU: R4000, R4400, R10000 (MIPS)
+
+2. Compiler
+
+ 32-bit:
+ Use ANSI C compiler.
+ CC = /usr/abiccs/bin/cc
+
+ 64-bit:
+ Use the 64-bit ANSI C compiler.
+ CC = /usr/ccs64/bin/cc
+ AR = /usr/ccs64/bin/ar
+
+3. ELF file format
+ *** Caution: The following information is empirical. ***
+
+ 32-bit:
+ ELF file has a unique format. (See a.out(4) and end(3C).)
+
+ &_start
+ : text segment
+ &etext
+ DATASTART
+ : data segment (initialized)
+ &edata
+ DATASTART2
+ : data segment (uninitialized)
+ &end
+
+ Here, DATASTART and DATASTART2 are macros of GC, and are defined as
+ the following equations. (See include/private/gcconfig.h.)
+ The algorithm for DATASTART is similar with the function
+ GC_SysVGetDataStart() in os_dep.c.
+
+ DATASTART = ((&etext + 0x3ffff) & ~0x3ffff) + (&etext & 0xffff)
+
+ Dynamically linked:
+ DATASTART2 = (&_gp + 0x8000 + 0x3ffff) & ~0x3ffff
+
+ Statically linked:
+ DATASTART2 = &edata
+
+ GC has to check addresses both between DATASTART and &edata, and
+ between DATASTART2 and &end. If a program accesses between &etext
+ and DATASTART, or between &edata and DATASTART2, the segmentation
+ error occurs and the program stops.
+
+ If a program is statically linked, there is not a gap between
+ &edata and DATASTART2. The global symbol &_DYNAMIC_LINKING is used
+ for the detection.
+
+ 64-bit:
+ ELF file has a simple format. (See end(3C).)
+
+ _ftext
+ : text segment
+ _etext
+ _fdata = DATASTART
+ : data segment (initialized)
+ _edata
+ _fbss
+ : data segment (uninitialized)
+ _end = DATAEND
+
+--
+Hironori SAKAMOTO
+
+
+When using the new "configure; make" build process, please
+run configure with the --disable-shared option. "Make check" does not
+yet pass with dynamic libraries. The reasons for that are not yet
+understood. (HB, paraphrasing message from Hironori SAKAMOTO.)
diff --git a/graphics/asymptote/gc/doc/README.hp b/graphics/asymptote/gc/doc/README.hp
new file mode 100644
index 0000000000..cc31b18de9
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.hp
@@ -0,0 +1,18 @@
+Dynamic loading support requires that executables be linked with -ldld.
+The alternative is to build the collector without defining DYNAMIC_LOADING
+in gcconfig.h and ensuring that all garbage collectible objects are
+accessible without considering statically allocated variables in dynamic
+libraries.
+
+The collector should compile with either plain cc or cc -Ae. Cc -Aa
+fails to define _HPUX_SOURCE and thus will not configure the collector
+correctly.
+
+Incremental collection support was added recently, and should now work.
+
+In spite of past claims, pthread support under HP/UX 11 should now work.
+Define GC_THREADS macro for the build. Incremental collection still does not
+work in combination with it.
+
+The stack finding code can be confused by putenv calls before collector
+initialization. Call GC_malloc() or GC_INIT() before any putenv() calls.
diff --git a/graphics/asymptote/gc/doc/README.linux b/graphics/asymptote/gc/doc/README.linux
new file mode 100644
index 0000000000..c9ced48171
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.linux
@@ -0,0 +1,127 @@
+See README.alpha for Linux on DEC AXP info.
+
+This file applies mostly to Linux/Intel IA-32. Ports to Linux on an M68K,
+IA-64, SPARC, MIPS, Alpha and PowerPC are integrated too. They should behave
+similarly, except that the PowerPC port lacks incremental GC support, and
+it is unknown to what extent the Linux threads code is functional.
+See below for M68K specific notes.
+
+Incremental GC is generally supported.
+
+Dynamic libraries are supported on an ELF system.
+
+The collector appears to work reliably with Linux threads, but beware
+of older versions of glibc and gdb.
+
+The garbage collector uses SIGPWR and SIGXCPU if it is used with
+Linux threads. These should not be touched by the client program.
+
+To use threads, you need to abide by the following requirements:
+
+1) You need to use LinuxThreads or NPTL (which are included in libc6).
+
+ The collector relies on some implementation details of the LinuxThreads
+ package. This code may not work on other
+ pthread implementations (in particular it will *not* work with
+ MIT pthreads).
+
+2) You must compile the collector with "-DGC_THREADS -D_REENTRANT" specified
+ in the Makefile.direct file.
+
+3a) Every file that makes thread calls should define GC_THREADS, and then
+ include gc.h. The latter redefines some of the pthread primitives as
+ macros which also provide the collector with information it requires.
+
+3b) A new alternative to (3a) is to build the collector and compile GC clients
+ with -DGC_USE_LD_WRAP, and to link the final program with
+
+ (for ld) --wrap dlopen --wrap pthread_create \
+ --wrap pthread_join --wrap pthread_detach \
+ --wrap pthread_sigmask --wrap pthread_exit --wrap pthread_cancel
+
+ (for gcc) -Wl,--wrap -Wl,dlopen -Wl,--wrap -Wl,pthread_create \
+ -Wl,--wrap -Wl,pthread_join -Wl,--wrap -Wl,pthread_detach \
+ -Wl,--wrap -Wl,pthread_sigmask -Wl,--wrap -Wl,pthread_exit \
+ -Wl,--wrap -Wl,pthread_cancel
+
+ In any case, _REENTRANT should be defined during compilation.
+
+4) Dlopen() disables collection during its execution. (It can't run
+ concurrently with the collector, since the collector looks at its
+ data structures. It can't acquire the allocator lock, since arbitrary
+ user startup code may run as part of dlopen().) Under unusual
+ conditions, this may cause unexpected heap growth.
+
+5) The combination of GC_THREADS, REDIRECT_MALLOC, and incremental
+ collection is probably not fully reliable, though it now seems to work
+ in simple cases.
+
+6) Thread local storage may not be viewed as part of the root set by the
+ collector. This probably depends on the linuxthreads version. For the
+ time being, any collectible memory referenced by thread local storage
+ should also be referenced from elsewhere, or be allocated as uncollectible.
+ (This is really a bug that should be fixed somehow. Actually, the
+ collector probably gets things right, on Linux at least, if there are not
+ too many tls locations and if dlopen is not used.)
+
+
+M68K LINUX:
+(From Richard Zidlicky)
+The bad news is that it can crash every linux-m68k kernel on a 68040,
+so an additional test is needed somewhere on startup. I have meanwhile
+patches to correct the problem in 68040 buserror handler but it is not
+yet in any standard kernel.
+
+Here is a simple test program to detect whether the kernel has the
+problem. It could be run as a separate check in configure or tested
+upon startup. If it fails (return !0) than mprotect can't be used
+on that system.
+
+/*
+ * test for bug that may crash 68040 based Linux
+ */
+
+#include <sys/mman.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+char *membase;
+int pagesize=4096;
+int pageshift=12;
+int x_taken=0;
+
+int sighandler(int sig)
+{
+ mprotect(membase,pagesize,PROT_READ|PROT_WRITE);
+ x_taken=1;
+}
+
+main()
+{
+ long l;
+
+ signal(SIGSEGV,sighandler);
+ l=(long)mmap(NULL,pagesize,PROT_READ,MAP_PRIVATE | MAP_ANON,-1,0);
+ if (l==-1)
+ {
+ perror("mmap/malloc");
+ abort();
+ }
+ membase=(char*)l;
+ *(long*)(membase+sizeof(long))=123456789;
+ if (*(long*)(membase+sizeof(long)) != 123456789 )
+ {
+ fprintf(stderr,"writeback failed !\n");
+ exit(1);
+ }
+ if (!x_taken)
+ {
+ fprintf(stderr,"exception not taken !\n");
+ exit(1);
+ }
+ fprintf(stderr,"vmtest Ok\n");
+ exit(0);
+}
diff --git a/graphics/asymptote/gc/doc/README.macros b/graphics/asymptote/gc/doc/README.macros
new file mode 100644
index 0000000000..e43321f411
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.macros
@@ -0,0 +1,609 @@
+The collector uses a large amount of conditional compilation in order to
+deal with platform dependencies. This violates a number of known coding
+standards. On the other hand, it seems to be the only practical way to
+support this many platforms without excessive code duplication.
+
+A few guidelines have mostly been followed in order to keep this manageable:
+
+1) #if and #ifdef directives are properly indented whenever easily possible.
+All known C compilers allow whitespace between the "#" and the "if" to make
+this possible. ANSI C also allows white space before the "#", though we
+avoid that. It has the known disadvantages that it differs from the normal
+GNU conventions, and that it makes patches larger than otherwise necessary.
+In my opinion, it's still well worth it, for the same reason that we indent
+ordinary "if" statements.
+
+2) Whenever possible, tests are performed on the macros defined in gcconfig.h
+instead of directly testing platform-specific predefined macros. This makes
+it relatively easy to adapt to new compilers with a different set of
+predefined macros. Currently these macros generally identify platforms
+instead of features. In many cases, this is a mistake.
+
+Many of the tested configuration macros are at least somewhat defined in
+either include/private/gcconfig.h or in Makefile.direct. Here is an attempt
+at documenting these macros: (Thanks to Walter Bright for suggesting
+this.)
+
+MACRO EXPLANATION
+----- -----------
+
+GC_DEBUG Tested by gc.h. Causes all-upper-case macros to
+ expand to calls to debug versions of collector routines.
+
+GC_NAMESPACE Tested by gc_cpp.h. Causes gc_cpp symbols to be defined
+ in "boehmgc" namespace.
+
+GC_DEBUG_REPLACEMENT Tested by gc.h. Causes GC_MALLOC/REALLOC() to be
+ defined as GC_debug_malloc/realloc_replacement().
+
+GC_NO_THREAD_REDIRECTS Tested by gc.h. Prevents redirection of thread
+ creation routines etc. to GC_ versions. Requires the
+ programmer to explicitly handle thread registration.
+
+GC_NO_THREAD_DECLS Tested by gc.h. Windows only. Do not declare
+ Windows thread creation routines and do not include windows.h.
+
+GC_DONT_INCLUDE_WINDOWS_H Tested by gc.h. Windows only. Do not include
+ windows.h from gc.h (but Windows-specific thread creation
+ routines are declared).
+
+GC_UNDERSCORE_STDCALL Tested by gc.h. Explicitly prefix exported/imported
+ WINAPI (__stdcall) symbols with '_' (underscore). Could be
+ used with MinGW (for x86) compiler (in conjunction with
+ GC_DLL) to follow MS conventions for __stdcall symbols naming.
+
+_ENABLE_ARRAYNEW
+ #define'd by the Digital Mars C++ compiler when
+ operator new[] and delete[] are separately
+ overloadable. Used in gc_cpp.h.
+
+GC_NO_INLINE_STD_NEW Tested by gc_cpp.cc and gc_cpp.h. Windows only.
+ Define the system-wide new and delete operators in gccpp.dll
+ instead of providing an inline version of the operators.
+
+_DLL Tested by gc_config_macros.h. Defined by Visual C++ if runtime
+ dynamic libraries are in use. Used (only if none of GC_DLL,
+ GC_NOT_DLL, __GNUC__ are defined) to test whether
+ __declspec(dllimport) needs to be added to declarations
+ to support the case in which the collector is in a DLL.
+
+GC_DLL Defined by user if dynamic libraries are being built
+ or used. Also set by gc.h if _DLL is defined (except for
+ mingw) while GC_NOT_DLL and __GNUC__ are both undefined.
+ This is the macro that is tested internally to determine
+ whether the GC is in its own dynamic library. May need
+ to be set by clients before including gc.h. Note that
+ inside the GC implementation it indicates that the
+ collector is in its own dynamic library, should export
+ its symbols, etc. But in clients it indicates that the
+ GC resides in a different DLL, its entry points should
+ be referenced accordingly, and precautions may need to
+ be taken to properly deal with statically allocated
+ variables in the main program. Used for Windows.
+ Also used by GCC v4+ (only when the dynamic shared library
+ is being built) to hide internally used symbols.
+
+GC_NOT_DLL User-settable macro that overrides _DLL, e.g. if runtime
+ dynamic libraries are used, but the collector is in a static
+ library. Tested by gc_config_macros.h.
+
+GC_MARKERS=<n> Set the desired number of marker threads. If not defined or
+ defined to zero, then the collector decides based on the
+ number of CPU cores. Only if compiled with PARALLEL_MARK.
+
+
+These define arguments influence the collector configuration:
+
+GC_REQUIRE_WCSDUP Force GC to export GC_wcsdup() (the Unicode version
+ of GC_strdup); could be useful in the leak-finding mode. Clients should
+ define it before including gc.h if the function is needed.
+
+FIND_LEAK Causes GC_find_leak to be initially set. This causes the
+ collector to assume that all inaccessible objects should have been
+ explicitly deallocated, and reports exceptions. Finalization and the test
+ program are not usable in this mode.
+
+GC_FINDLEAK_DELAY_FREE Turns on deferred freeing of objects in the
+ leak-finding mode letting the collector to detect alter-object-after-free
+ errors as well as detect leaked objects sooner (instead of only when program
+ terminates). Has no effect if SHORT_DBG_HDRS.
+
+GC_ABORT_ON_LEAK Causes the application to be terminated once leaked or
+ smashed (corrupted on use-after-free) objects are found (after printing the
+ information about that objects).
+
+SUNOS5SIGS Solaris-like signal handling. This is probably misnamed,
+ since it really doesn't guarantee much more than POSIX. Currently set only
+ for DRSNX, FreeBSD, HP/UX and Solaris.
+
+PCR Set if the collector is being built as part of the Xerox Portable
+ Common Runtime.
+
+GC_THREADS Should set the appropriate one of the below macros,
+ except GC_WIN32_PTHREADS, which must be set explicitly. Tested by gc.h.
+ IMPORTANT: GC_THREADS macro (or the relevant platform-specific deprecated
+ one) must normally also be defined by the client before including gc.h.
+ This redefines thread primitives to invoke the GC_ wrappers instead.
+ Alternatively, linker-based symbol interception can be used on a few
+ platforms.
+
+GC_SOLARIS_THREADS Enables support for Solaris pthreads.
+ Must also define _REENTRANT. Deprecated, use GC_THREADS instead.
+
+GC_IRIX_THREADS Enables support for Irix pthreads. See README.sgi.
+ Deprecated, use GC_THREADS instead.
+
+GC_HPUX_THREADS Enables support for HP/UX 11 pthreads.
+ Also requires _REENTRANT or _POSIX_C_SOURCE=199506L. See README.hp.
+ Deprecated, use GC_THREADS instead.
+
+GC_LINUX_THREADS Enables support for Xavier Leroy's Linux threads
+ or NPTL threads. See README.linux. _REENTRANT may also be required.
+ Deprecated, use GC_THREADS instead.
+
+GC_OSF1_THREADS Enables support for Tru64 pthreads. Deprecated, use
+ GC_THREADS instead.
+
+GC_FREEBSD_THREADS Enables support for FreeBSD pthreads. Appeared to run
+ into some underlying thread problems. Deprecated, use GC_THREADS instead.
+
+GC_NETBSD_THREADS Enables support for NetBSD pthreads. Deprecated, use
+ GC_THREADS instead.
+
+GC_OPENBSD_THREADS Enables support for OpenBSD pthreads. Deprecated,
+ use GC_THREADS instead.
+
+GC_DARWIN_THREADS Enables support for Mac OS X pthreads. Deprecated,
+ use GC_THREADS instead.
+
+GC_AIX_THREADS Enables support for IBM AIX threads. Deprecated, use
+ GC_THREADS instead.
+
+GC_DGUX386_THREADS Enables support for DB/UX x86 threads.
+ See README.DGUX386. (Probably has not been tested recently.) Deprecated,
+ use GC_THREADS instead.
+
+GC_WIN32_THREADS Enables support for Win32 threads. Deprecated,
+ use GC_THREADS instead.
+
+GC_WIN32_PTHREADS Enables support for pthreads-win32 (or other
+ non-Cygwin pthreads library for Windows). This cannot be enabled
+ automatically by GC_THREADS, which would assume Win32 native threads.
+
+PTW32_STATIC_LIB Causes the static version of the Mingw pthreads
+ library to be used. Requires GC_WIN32_PTHREADS.
+
+GC_PTHREADS_PARAMARK Causes pthread-based parallel mark implementation
+ to be used even if GC_WIN32_PTHREADS is undefined. (Useful for WinCE.)
+
+ALL_INTERIOR_POINTERS Allows all pointers to the interior of objects to be
+ recognized. (See gc_priv.h for consequences.) Alternatively,
+ GC_all_interior_pointers can be set at process initialization time.
+
+SMALL_CONFIG Tries to tune the collector for small heap sizes,
+ usually causing it to use less space in such situations. Incremental
+ collection no longer works in this case. Also, removes some
+ statistic-printing code. Turns off some optimization algorithms (like data
+ prefetching in the mark routine).
+
+NO_CLOCK Do not use system clock. Disables some statistic printing.
+
+GC_DISABLE_INCREMENTAL Turn off the incremental collection support.
+
+NO_INCREMENTAL Causes the GC test programs to not invoke the incremental mode
+ of the collector. This has no impact on the generated library, only on the
+ test programs. (This is often useful for debugging failures unrelated to
+ incremental GC.)
+
+LARGE_CONFIG Tunes the collector for unusually large heaps.
+ Necessary for heaps larger than about 4 GiB on most (64-bit) machines.
+ Recommended for heaps larger than about 500 MiB. Not recommended for
+ embedded systems. Could be used in conjunction with SMALL_CONFIG to
+ generate smaller code (by disabling incremental collection support,
+ statistic printing and some optimization algorithms).
+
+DONT_ADD_BYTE_AT_END Meaningful only with ALL_INTERIOR_POINTERS or
+ GC_all_interior_pointers = 1. Normally ALL_INTERIOR_POINTERS
+ causes all objects to be padded so that pointers just past the end of
+ an object can be recognized. This can be expensive. (The padding
+ is normally more than one byte due to alignment constraints.)
+ DONT_ADD_BYTE_AT_END disables the padding.
+
+NO_EXECUTE_PERMISSION May cause some or all of the heap to not
+ have execute permission, i.e. it may be impossible to execute
+ code from the heap. Affects the incremental collector and memory unmapping.
+ It may greatly improve the performance, since this may avoid some expensive
+ cache synchronization. Portable clients should call
+ GC_set_pages_executable(1) at the process initialization time if the
+ execute permission is required.
+
+GC_NO_OPERATOR_NEW_ARRAY Declares that the C++ compiler does not
+ support the new syntax "operator new[]" for allocating and deleting arrays.
+ See gc_cpp.h for details. No effect on the C part of the collector.
+ This is defined implicitly in a few environments. Must also be defined
+ by clients that use gc_cpp.h.
+
+REDIRECT_MALLOC=<X> Causes malloc to be defined as alias for X.
+ Unless the following macros are defined, realloc is also redirected
+ to GC_realloc, and free is redirected to GC_free.
+ Calloc and str[n]dup are redefined in terms of the new malloc. X should
+ be either GC_malloc or GC_malloc_uncollectable, or
+ GC_debug_malloc_replacement. (The latter invokes GC_debug_malloc
+ with dummy source location information, but still results in
+ properly remembered call stacks on Linux/x86 and Solaris/SPARC.
+ It requires that the following two macros also be used.)
+ The former is occasionally useful for working around leaks in code
+ you don't want to (or can't) look at. It may not work for
+ existing code, but it often does. Neither works on all platforms,
+ since some ports use malloc or calloc to obtain system memory.
+ (Probably works for UNIX, and Win32.) If you build with DBG_HDRS_ALL,
+ you should only use GC_debug_malloc_replacement as a malloc
+ replacement.
+
+REDIRECT_REALLOC=<X> Causes realloc to be redirected to X.
+ The canonical use is REDIRECT_REALLOC=GC_debug_realloc_replacement,
+ together with REDIRECT_MALLOC=GC_debug_malloc_replacement to
+ generate leak reports with call stacks for both malloc and realloc.
+ This also requires REDIRECT_FREE.
+
+REDIRECT_FREE=<X> Causes free to be redirected to X. The canonical use
+ is REDIRECT_FREE=GC_debug_free.
+
+IGNORE_FREE Turns calls to free into a no-op. Only useful with
+ REDIRECT_MALLOC.
+
+NO_DEBUGGING Removes GC_dump and the debugging routines it calls.
+ Reduces code size slightly at the expense of debuggability.
+
+GC_DUMP_REGULARLY Generate regular debugging dumps.
+
+DEBUG_THREADS Turn on printing additional thread-support debugging
+ information.
+
+GC_COLLECT_AT_MALLOC=<n> Force garbage collection at every
+ GC_malloc_* call with the size greater than the specified value.
+ (Might be useful for application debugging or in find-leak mode.)
+
+JAVA_FINALIZATION Makes it somewhat safer to finalize objects out of
+ order by specifying a nonstandard finalization mark procedure (see
+ finalize.c). Objects reachable from finalizable objects will be marked
+ in a separate post-pass, and hence their memory won't be reclaimed.
+ Not recommended unless you are implementing a language that specifies
+ these semantics. Actually, the macro determines only the initial value
+ of GC_java_finalization variable.
+
+FINALIZE_ON_DEMAND Causes finalizers to be run only in response
+ to explicit GC_invoke_finalizers() calls. Actually, the macro only
+ determines the initial value of GC_finalize_on_demand.
+
+GC_NO_FINALIZATION Exclude finalization support (for smaller code size).
+
+GC_TOGGLE_REFS_NOT_NEEDED Exclude toggle-refs support.
+
+GC_ATOMIC_UNCOLLECTABLE Includes code for GC_malloc_atomic_uncollectable.
+ This is useful if either the vendor malloc implementation is poor,
+ or if REDIRECT_MALLOC is used.
+
+MARK_BIT_PER_GRANULE Requests that a mark bit (or often byte)
+ be allocated for each allocation granule, as opposed to each object.
+ This often improves speed, possibly at some cost in space and/or
+ cache footprint. Normally it is best to let this decision be
+ made automatically depending on platform.
+
+MARK_BIT_PER_OBJ Requests that a mark bit be allocated for each
+ object instead of allocation granule. The opposite of
+ MARK_BIT_PER_GRANULE.
+
+HBLKSIZE=<ddd> Explicitly sets the heap block size (where ddd is a power of
+ 2 between 512 and 16384). Each heap block is devoted to a single size and
+ kind of object. For the incremental collector it makes sense to match
+ the most likely page size. Otherwise large values result in more
+ fragmentation, but generally better performance for large heaps.
+
+USE_MMAP Use MMAP instead of sbrk to get new memory.
+ Works for Linux, FreeBSD, Cygwin, Solaris and Irix.
+
+USE_MUNMAP Causes memory to be returned to the OS under the right
+ circumstances. Works under some Unix, Linux and Windows versions.
+ Requires USE_MMAP except for Windows.
+
+USE_WINALLOC (Cygwin only) Use Win32 VirtualAlloc (instead of sbrk or mmap)
+ to get new memory. Useful if memory unmapping (USE_MUNMAP) is enabled.
+
+MUNMAP_THRESHOLD=<value> Set the desired memory blocks unmapping
+ threshold (the number of sequential garbage collections for which
+ a candidate block for unmapping should remain free).
+
+GC_FORCE_UNMAP_ON_GCOLLECT Set "unmap as much as possible on explicit GC"
+ mode on by default. The mode could be changed at run-time. Has no effect
+ unless unmapping is turned on. Has no effect on implicitly-initiated
+ garbage collections.
+
+PRINT_BLACK_LIST Whenever a black list entry is added, i.e. whenever
+ the garbage collector detects a value that looks almost, but not quite,
+ like a pointer, print both the address containing the value, and the
+ value of the near-bogus-pointer. Can be used to identify regions of
+ memory that are likely to contribute misidentified pointers.
+
+KEEP_BACK_PTRS Add code to save back pointers in debugging headers
+ for objects allocated with the debugging allocator. If all objects
+ through GC_MALLOC with GC_DEBUG defined, this allows the client
+ to determine how particular or randomly chosen objects are reachable
+ for debugging/profiling purposes. The gc_backptr.h interface is
+ implemented only if this is defined.
+
+GC_ASSERTIONS Enable some internal GC assertion checking. It is intended
+ primarily for debugging of the garbage collector itself, but could also
+ help to identify cases of incorrect GC usage by a client.
+
+DBG_HDRS_ALL Make sure that all objects have debug headers. Increases
+ the reliability (from 99.9999% to 100% mod. bugs) of some of the debugging
+ code (especially KEEP_BACK_PTRS). Makes SHORT_DBG_HDRS possible.
+ Assumes that all client allocation is done through debugging allocators.
+
+SHORT_DBG_HDRS Assume that all objects have debug headers. Shorten
+ the headers to minimize object size, at the expense of checking for
+ writes past the end of an object. This is intended for environments
+ in which most client code is written in a "safe" language, such as
+ Scheme or Java. Assumes that all client allocation is done using
+ the GC_debug_ functions, or through the macros that expand to these,
+ or by redirecting malloc to GC_debug_malloc_replacement.
+ (Also eliminates the field for the requested object size.)
+ Occasionally could be useful for debugging of client code. Slows down the
+ collector somewhat, but not drastically.
+
+SAVE_CALL_COUNT=<n> Set the number of call frames saved with objects
+ allocated through the debugging interface. Affects the amount of
+ information generated in leak reports. Only matters on platforms
+ on which we can quickly generate call stacks, currently Linux/x86,
+ Linux/SPARC, Solaris/SPARC, and platforms that provide execinfo.h.
+ Default is zero. On x86, client code should NOT be compiled with
+ -fomit-frame-pointer.
+
+SAVE_CALL_NARGS=<n> Set the number of functions arguments to be saved
+ with each call frame. Default is zero. Ignored if we don't know how to
+ retrieve arguments on the platform.
+
+CHECKSUMS Reports on erroneously clear dirty bits (at a substantial
+ performance cost). Use only for debugging of the incremental collector.
+ Not compatible with USE_MUNMAP or threads.
+
+GC_GCJ_SUPPORT Includes support for gcj (and possibly other systems
+ that include a pointer to a type descriptor in each allocated object).
+
+USE_I686_PREFETCH Causes the collector to issue Pentium III style
+ prefetch instructions. No effect except on Linux/x86 platforms.
+ Empirically the code appears to still run correctly on Pentium II
+ processors, though with no performance benefit. May not run on other
+ x86 processors probably. In some cases this improves performance by 15%
+ or so.
+
+USE_3DNOW_PREFETCH Causes the collector to issue AMD 3DNow style
+ prefetch instructions. Same restrictions as USE_I686_PREFETCH.
+ Minimally tested. Didn't appear to be an obvious win on a K6-2/500.
+
+USE_PPC_PREFETCH Causes the collector to issue PowerPC style
+ prefetch instructions. No effect except on PowerPC OS X platforms.
+ Performance impact untested.
+
+GC_USE_LD_WRAP In combination with the old flags listed in README.linux
+ causes the collector some system and pthread calls in a more transparent
+ fashion than the usual macro-based approach. Requires GNU ld, and
+ currently probably works only with Linux.
+
+GC_USE_DLOPEN_WRAP Causes the collector to redefine malloc and
+ intercepted pthread routines with their real names, and causes it to use
+ dlopen and dlsym to refer to the original versions. This makes it possible
+ to build an LD_PRELOADable malloc replacement library.
+
+THREAD_LOCAL_ALLOC Defines GC_malloc(), GC_malloc_atomic() and
+ GC_gcj_malloc() to use a per-thread set of free-lists. These then allocate
+ in a way that usually does not involve acquisition of a global lock.
+ Recommended for multiprocessors.
+
+USE_COMPILER_TLS Causes thread local allocation to use
+ the compiler-supported "__thread" thread-local variables. This is the
+ default in HP/UX. It may help performance on recent Linux installations.
+ (It failed for me on RedHat 8, but appears to work on RedHat 9.)
+
+GC_ATTR_TLS_FAST Use specific attributes for GC_thread_key like
+ __attribute__((tls_model("local-exec"))).
+
+PARALLEL_MARK Allows the marker to run in multiple threads. Recommended
+ for multiprocessors.
+
+GC_BUILTIN_ATOMIC Use GCC atomic intrinsics instead of libatomic_ops
+ primitives.
+
+GC_ALWAYS_MULTITHREADED Force multi-threaded mode at GC initialization.
+
+GC_ENABLE_SUSPEND_THREAD (Linux only) Turn on thread suspend/resume API
+support.
+
+GC_WINMAIN_REDIRECT (Win32 only) Redirect (rename) an application
+ WinMain to GC_WinMain; implement the "real" WinMain which starts a new
+ thread to call GC_WinMain after initializing the GC. Useful for WinCE.
+ Incompatible with GC_DLL.
+
+GC_REGISTER_MEM_PRIVATE (Win32 only) Force to register MEM_PRIVATE R/W
+ sections as data roots. Might be needed for some WinCE 6.0+ custom builds.
+ (May result in numerous "Data Abort" messages logged to WinCE debugging
+ console.) Incompatible with GCC toolchains for WinCE.
+
+NO_GETENV Prevents the collector from looking at environment variables.
+ These may otherwise alter its configuration, or turn off GC altogether.
+ I don't know of a reason to disable this, except possibly if the resulting
+ process runs as a privileged user. (This is on by default for WinCE.)
+
+EMPTY_GETENV_RESULTS Define to workaround a reputed Wine bug in getenv
+ (getenv() may return an empty string instead of NULL for a missing entry).
+
+GC_READ_ENV_FILE (Win32 only) Read environment variables from the GC "env"
+ file (named as the program name plus ".gc.env" extension). Useful for WinCE
+ targets (which have no getenv()). In the file, every variable is specified
+ in a separate line and the format is as "<name>=<value>" (without spaces).
+ A comment line may start with any character except for the Latin letters,
+ the digits and the underscore ('_'). The file encoding is Latin-1.
+
+USE_GLOBAL_ALLOC (Win32 only) Use GlobalAlloc() instead of VirtualAlloc()
+ to allocate the heap. May be needed to work around a Windows NT/2000 issue.
+ Incompatible with USE_MUNMAP. See README.win32 for details.
+
+MAKE_BACK_GRAPH Enable GC_PRINT_BACK_HEIGHT environment variable.
+ See README.environment for details. Experimental. Limited platform
+ support. Implies DBG_HDRS_ALL. All allocation should be done using
+ the debug interface.
+
+GC_PRINT_BACK_HEIGHT Permanently turn on back-height printing mode
+ (useful when NO_GETENV). See the similar environment variable description
+ in README.environment. Requires MAKE_BACK_GRAPH defined.
+
+HANDLE_FORK (Unix and Cygwin only) Attempt by default to make GC_malloc()
+ work in a child process fork()'ed from a multi-threaded parent. Not fully
+ POSIX-compliant and could be disabled at runtime (before GC_INIT).
+
+TEST_WITH_SYSTEM_MALLOC Causes gctest to allocate (and leak) large
+ chunks of memory with the standard system malloc. This will cause the root
+ set and collected heap to grow significantly if malloc'ed memory is somehow
+ getting traced by the collector. This has no impact on the generated
+ library; it only affects the test.
+
+POINTER_MASK=<0x...> Causes candidate pointers to be AND'ed with the given
+ mask before being considered. If either this or the following macro is
+ defined, it will be assumed that all pointers stored in the heap need to be
+ processed this way. Stack and register pointers will be considered both
+ with and without processing. These macros are normally needed only to
+ support systems that use high-order pointer tags. EXPERIMENTAL.
+
+POINTER_SHIFT=<n> Causes the collector to left shift candidate pointers
+ by the indicated amount before trying to interpret them. Applied after
+ POINTER_MASK. EXPERIMENTAL. See also the preceding macro.
+
+ENABLE_TRACE Enables the GC_TRACE=addr environment setting to do its job.
+ By default this is not supported in order to keep the marker as fast as
+ possible.
+
+DARWIN_DONT_PARSE_STACK Causes the Darwin port to discover thread
+ stack bounds in the same way as other pthread ports, without trying to
+ walk the frames on the stack. This is recommended only as a fall-back for
+ applications that don't support proper stack unwinding.
+
+GC_NO_THREADS_DISCOVERY (Darwin and Win32+DLL only) Exclude DllMain-based
+ (on Windows) and task-threads-based (on Darwin) thread registration support.
+
+GC_INSIDE_DLL (Win32 only) Enable DllMain-based approach of threads
+ registering even in case GC_DLL is not defined.
+
+GC_DISCOVER_TASK_THREADS (Darwin and Win32+DLL only) Compile the collector
+ with the implicitly turned on task-threads-based (on Darwin) or
+ DllMain-based (on Windows) approach of threads registering. Only for
+ compatibility and for the case when it is not possible to call
+ GC_use_threads_discovery() early (before other GC calls).
+
+USE_PROC_FOR_LIBRARIES Causes the Linux collector to treat writable
+ memory mappings (as reported by /proc) as roots, if it doesn't have
+ other information about them. It no longer traverses dynamic loader
+ data structures to find dynamic library static data. This may be
+ required for applications that store pointers in mmapped segments without
+ informing the collector. But it typically performs poorly, especially
+ since it will scan inactive but cached NPTL thread stacks completely.
+
+IGNORE_DYNAMIC_LOADING Don't define DYNAMIC_LOADING even if supported by the
+ platform (that is, build the collector with disabled tracing of dynamic
+ library data roots).
+
+NO_PROC_STAT Causes the collector to avoid relying on Linux
+ "/proc/self/stat".
+
+NO_GETCONTEXT Causes the collector to not assume the existence of the
+ getcontext() function on linux-like platforms. This currently happens
+ implicitly on Darwin, Hurd, or ARM or MIPS hardware. It is explicitly
+ needed for some old versions of FreeBSD.
+
+STATIC=static Causes various GC_ symbols that could logically be declared
+ static to be declared (this is the default if NO_DEBUGGING is specified).
+ Reduces the number of visible symbols (letting the optimizer do its work
+ better), which is probably cleaner, but may make some kinds of debugging
+ and profiling harder.
+
+GC_DLL Build dynamic-link library (or dynamic shared object). For Unix this
+ causes the exported symbols to have 'default' visibility (ignored unless
+ GCC v4+) and the internal ones to have 'hidden' visibility.
+
+NO_MSGBOX_ON_ERROR (Win32 only) Do not show Windows message box with
+ "OK" button on a GC fatal error. Otherwise the client application is
+ terminated only once the user clicks "OK" button. Useful for non-GUI (or
+ non-interactive) applications.
+
+DONT_USE_USER32_DLL (Win32 only) Don't use "user32" DLL import library
+ (containing MessageBox() entry); useful for a static GC library.
+
+GC_PREFER_MPROTECT_VDB Choose MPROTECT_VDB manually in case of multiple
+ virtual dirty bit strategies are implemented (at present useful on Win32,
+ Solaris and Linux to force MPROTECT_VDB strategy instead of the default
+ GWW_VDB, PROC_VDB or SOFT_VDB ones, respectively).
+
+GC_IGNORE_GCJ_INFO Disable GCJ-style type information (useful for
+ debugging on WinCE).
+
+GC_PRINT_VERBOSE_STATS Permanently turn on verbose logging (useful for
+ debugging and profiling on WinCE).
+
+GC_ONLY_LOG_TO_FILE Don't redirect GC stdout and stderr to the log file
+ specified by GC_LOG_FILE environment variable. Has effect only when the
+ variable is set (to anything other than "0").
+
+GC_ANDROID_LOG (Android only) Output error/debug information to Android log.
+
+CONSOLE_LOG (Win32 only) Output error/debug information to stdout and
+ stderr.
+
+GC_DONT_EXPAND Don't expand the heap unless explicitly requested or forced to.
+
+GC_USE_ENTIRE_HEAP Causes the non-incremental collector to use the
+ entire heap before collecting. This sometimes results in more large block
+ fragmentation, since very large blocks will tend to get broken up during
+ each GC cycle. It is likely to result in a larger working set, but lower
+ collection frequencies, and hence fewer instructions executed in the
+ collector. This macro controls only the default GC_use_entire_heap value.
+
+GC_INITIAL_HEAP_SIZE=<value> Set the desired default initial heap size
+ in bytes.
+
+GC_FREE_SPACE_DIVISOR=<value> Set alternate default GC_free_space_divisor
+ value.
+
+GC_ALLOCD_BYTES_PER_FINALIZER=<value> Set alternate default value of
+ GC_allocd_bytes_per_finalizer.
+
+GC_TIME_LIMIT=<milliseconds> Set alternate default GC_time_limit value
+ (setting this to GC_TIME_UNLIMITED will essentially disable incremental
+ collection while leaving generational collection enabled).
+
+GC_FULL_FREQ=<value> Set alternate default number of partial collections
+ between full collections (matters only if incremental collection is on).
+
+NO_CANCEL_SAFE (Posix platforms with threads only) Don't bother trying
+ to make the collector safe for thread cancellation; cancellation is not
+ used. (Note that if cancellation is used anyway, threads may end up
+ getting canceled in unexpected places.) Even without this option,
+ PTHREAD_CANCEL_ASYNCHRONOUS is never safe with the collector. (We could
+ argue about its safety without the collector.)
+
+UNICODE (Win32 only) Use the Unicode variant ('W') of the Win32 API instead
+ of ANSI/ASCII one ('A'). Useful for WinCE.
+
+HOST_ANDROID (or __ANDROID__) Compile for Android NDK platform.
+
+SN_TARGET_PS3 Compile for Sony PS/3.
+
+USE_GET_STACKBASE_FOR_MAIN (Linux only) Use pthread_attr_getstack() instead
+ of __libc_stack_end (or instead of any hard-coded value) for getting the
+ primordial thread stack bottom (useful if the client modifies the program's
+ address space).
+
+EMSCRIPTEN_ASYNCIFY (Emscripten only) Use Asyncify feature. Note this is
+ a relatively rarely used feature of Emscripten, most developers do not use
+ it, and it does not scale well to moderate-to-large code bases. But the
+ feature is needed to pass gctest, at least. Requires -sASYNCIFY linker
+ flag.
diff --git a/graphics/asymptote/gc/doc/README.rs6000 b/graphics/asymptote/gc/doc/README.rs6000
new file mode 100644
index 0000000000..f5630b20a3
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.rs6000
@@ -0,0 +1,9 @@
+We have so far failed to find a good way to determine the stack base.
+It is highly recommended that GC_stackbottom be set explicitly on program
+startup. The supplied value sometimes causes failure under AIX 4.1, though
+it appears to work under 3.X. HEURISTIC2 seems to work under 4.1, but
+involves a substantial performance penalty, and will fail if there is
+no limit on stack size.
+
+There is no thread support. (I assume recent versions of AIX provide
+pthreads? I no longer have access to a machine ...)
diff --git a/graphics/asymptote/gc/doc/README.sgi b/graphics/asymptote/gc/doc/README.sgi
new file mode 100644
index 0000000000..4258dce4f3
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.sgi
@@ -0,0 +1,39 @@
+Performance of the incremental collector can be greatly enhanced with
+-DNO_EXECUTE_PERMISSION.
+
+The collector should run with all of the -32, -n32 and -64 ABIs. Remember to
+define the AS macro in the Makefile.direct to be "as -64", or "as -n32".
+
+If you use -DREDIRECT_MALLOC=GC_malloc with C++ code, your code should make
+at least one explicit call to malloc instead of new to ensure that the proper
+version of malloc is linked in.
+
+Sproc threads are not supported.
+
+Pthreads support is provided. This requires that:
+
+1) You compile the collector with -DGC_THREADS specified in Makefile.direct.
+
+2) You have the latest pthreads patches installed.
+
+(Though the collector makes only documented pthread calls,
+it relies on signal/threads interactions working just right in ways
+that are not required by the standard. It is unlikely that this code
+will run on other pthreads platforms. But please tell me if it does.)
+
+3) Every file that makes thread calls should define GC_THREADS and then
+include gc.h. Gc.h redefines some of the pthread primitives as macros which
+also provide the collector with information it requires.
+
+4) pthread_cond_wait and pthread_cond_timedwait should be prepared for
+premature wakeups. (I believe the pthreads and related standards require this
+anyway. Irix pthreads often terminate a wait if a signal arrives.
+The garbage collector uses signals to stop threads.)
+
+5) It is expensive to stop a thread waiting in IO at the time the request is
+initiated. Applications with many such threads may not exhibit acceptable
+performance with the collector. (Increasing the heap size may help.)
+
+6) The collector should not be compiled with -DREDIRECT_MALLOC. This
+confuses some library calls made by the pthreads implementation, which
+expect the standard malloc.
diff --git a/graphics/asymptote/gc/doc/README.solaris2 b/graphics/asymptote/gc/doc/README.solaris2
new file mode 100644
index 0000000000..8eb4b9c2c8
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.solaris2
@@ -0,0 +1,68 @@
+The collector supports both incremental collection and threads under
+Solaris 2. The incremental collector normally retrieves page dirty information
+through the appropriate /proc calls. But it can also be configured
+(by defining MPROTECT_VDB instead of PROC_VDB in gcconfig.h) to use mprotect
+and signals. This may result in shorter pause times, but it is no longer
+safe to issue arbitrary system calls that write to the heap.
+
+Under other UNIX versions,
+the collector normally obtains memory through sbrk. There is some reason
+to expect that this is not safe if the client program also calls the system
+malloc, or especially realloc. The sbrk man page strongly suggests this is
+not safe: "Many library routines use malloc() internally, so use brk()
+and sbrk() only when you know that malloc() definitely will not be used by
+any library routine." This doesn't make a lot of sense to me, since there
+seems to be no documentation as to which routines can transitively call malloc.
+Nonetheless, under Solaris2, the collector now allocates
+memory using mmap by default. (It defines USE_MMAP in gcconfig.h.)
+You may want to reverse this decisions if you use -DREDIRECT_MALLOC=...
+
+Note:
+Before you run "make check", you need to set your LD_LIBRARY_PATH correctly
+(e.g., to "/usr/local/lib") so that tests can find the shared library
+libgcc_s.so.1. Alternatively, you can configure with --disable-shared.
+
+SOLARIS THREADS:
+
+Unless --disable-threads option is given, threads support is on by default in
+configure. This causes the collector to be compiled with -D GC_THREADS
+ensuring thread safety. This assumes use of the pthread_ interface; old-style
+Solaris threads are no longer supported. Thread-local allocation is on by
+default. Parallel marking is on by default (it could be disabled manually
+by configure --disable-parallel-mark option).
+
+It is also essential that gc.h be included in files that call pthread_create,
+pthread_join, pthread_detach, or dlopen. gc.h macro defines these to also do
+GC bookkeeping, etc. gc.h must be included with GC_THREADS macro defined
+first, otherwise these replacements are not visible. A collector built in
+this way may only be used by programs that are linked with the threads library.
+
+Unless USE_PROC_FOR_LIBRARIES is defined, dlopen disables collection
+temporarily. In some unlikely cases, this can result in unpleasant heap
+growth. But it seems better than the race/deadlock issues we had before.
+
+If threads are used on an x86 processor with malloc redirected to
+GC_malloc, it is necessary to call GC_INIT explicitly before forking the
+first thread. (This avoids a deadlock arising from calling GC_thr_init
+with the allocation lock held.)
+
+There could be an issue when using gc_cpp.h in conjunction with Solaris
+threads and Sun's C++ runtime. Apparently the overloaded new operator
+may be invoked by some iostream initialization code before threads are
+correctly initialized. This may cause a SIGSEGV during initialization
+of the garbage collector. Currently the only known workaround is to not
+invoke the garbage collector from a user defined global operator new, or to
+have it invoke the garbage-collector's allocators only after main has started.
+(Note that the latter requires a moderately expensive test in operator
+delete.)
+
+I encountered "symbol <unknown>: offset .... is non-aligned" errors. These
+appear to be traceable to the use of the GNU assembler with the Sun linker.
+The former appears to generate a relocation not understood by the latter.
+The fix appears to be to use a consistent toolchain. (As a non-Solaris-expert
+my solution involved hacking the libtool script, but I'm sure you can
+do something less ugly.)
+
+Hans-J. Boehm
+(The above contains my personal opinions, which are probably not shared
+by anyone else.)
diff --git a/graphics/asymptote/gc/doc/README.symbian b/graphics/asymptote/gc/doc/README.symbian
new file mode 100644
index 0000000000..515a9ccaba
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.symbian
@@ -0,0 +1,11 @@
+Instructions for Symbian:
+1. Build: use libgc.mmp
+2. Limitations
+2.1. No multi-threaded support yet
+2.2. Be careful with limitation that emulator introduces: Static roots are not
+dynamically accessible (there are Symbian APIs for this purpose but are just
+stubs, returning irrelevant values).
+Consequently, on emulator, you can only use dlls or exe, and retrieve static
+roots by calling global_init_static_root per dll (or exe).
+On target, only libs are supported, because static roots are retrieved by
+linker flags, by calling global_init_static_root in main exe.
diff --git a/graphics/asymptote/gc/doc/README.uts b/graphics/asymptote/gc/doc/README.uts
new file mode 100644
index 0000000000..6be49667d7
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.uts
@@ -0,0 +1,2 @@
+Alistair Crooks supplied the port. He used Lexa C version 2.1.3 with
+-Xa to compile.
diff --git a/graphics/asymptote/gc/doc/README.win32 b/graphics/asymptote/gc/doc/README.win32
new file mode 100644
index 0000000000..21d1418107
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.win32
@@ -0,0 +1,215 @@
+The collector has at various times been compiled under Windows 95 and later,
+NT, and XP, with the original Microsoft SDK, with Visual C++ 2.0, 4.0, and 6,
+with the GNU Win32 tools, with Borland C++ Builder, with Watcom C, with EMX,
+and with the Digital Mars compiler (DMC).
+
+For historical reasons,
+the collector test program "gctest" is linked as a GUI application,
+but does not open any windows. Its output normally appears in the file
+"gctest.gc.log". It may be started from the file manager. The hour glass
+cursor may appear as long as it's running. If it is started from the
+command line, it will usually run in the background. Wait a few
+minutes (a few seconds on a modern machine) before you check the output.
+You should see either a failure indication or a "Collector appears to work"
+message.
+
+A toy editor (de.exe) based on cords (heavyweight
+strings represented as trees) has been ported and is included.
+It runs fine under either Win32 or win32s. It serves as an example
+of a true Windows application, except that it was written by a
+nonexpert Windows programmer. (There are some peculiarities
+in the way files are displayed. The <cr> is displayed explicitly
+for standard DOS text files. As in the UNIX version, control
+characters are displayed explicitly, but in this case as red text.
+This may be suboptimal for some tastes and/or sets of default
+window colors.)
+
+In general -DREDIRECT_MALLOC is unlikely to work unless the
+application is completely statically linked.
+
+The collector normally allocates memory from the OS with VirtualAlloc.
+This appears to cause problems under Windows NT and Windows 2000 (but
+not Windows 95/98) if the memory is later passed to CreateDIBitmap.
+To work around this problem, build the collector with -DUSE_GLOBAL_ALLOC.
+This is currently incompatible with -DUSE_MUNMAP. (Thanks to Jonathan
+Clark for tracking this down. There's some chance this may be fixed
+since we now separate heap sections with an unused page.)
+
+[Threads and incremental collection are discussed near the end, below.]
+
+Microsoft Tools
+---------------
+
+For Microsoft development tools, type
+"nmake -f NT_MAKEFILE cpu=i386 disable_threads=1 enable_static=1 nodebug=1"
+to build the release variant of the collector as a static library without
+threads support.
+
+In order to use the gc_cpp.h C++ interface, all client code should include
+gc_cpp.h.
+
+[See above for gctest.]
+
+If you would prefer a VC++ .NET project file, ask Hans Boehm. One has
+been contributed, but it seems to contain some absolute paths etc., so
+it can presumably only be a starting point, and is not in the standard
+distribution. It is unclear (to me, Hans Boehm) whether it is feasible to
+change that.
+
+Clients may need to define GC_NOT_DLL before including gc.h, if the
+collector was built as a static library.
+
+GNU Tools
+---------
+
+The collector should be buildable under Cygwin with the
+"./configure; make check" machinery.
+
+MinGW builds (including for x64) are available both directly (on a Windows
+host) and via cross-compilation, e.g.
+"./configure --host=i686-pc-mingw32; make check"
+
+By default, configure instructs make to build the collector as a DLL (shared
+library), adding -D GC_DLL to CFLAGS.
+
+Parallel marker is enabled by default; it could be disabled by
+"--disable-parallel-mark" option.
+
+Memory unmapping could be turned off by "--disable-munmap" option.
+
+Borland Tools
+-------------
+
+For Borland tools, use `cmake -G "Borland Makefiles"`. Note that
+Borland's compiler defaults to 1 byte alignment in structures (-a1),
+whereas Visual C++ appears to default to 8 byte alignment (/Zp8).
+The garbage collector in its default configuration EXPECTS AT
+LEAST 4 BYTE ALIGNMENT. Thus the BORLAND DEFAULT MUST
+BE OVERRIDDEN. (In my opinion, it should usually be anyway.
+I expect that -a1 introduces major performance penalties on a
+486 or Pentium.) Note that this changes structure layouts. (As a last
+resort, gcconfig.h can be changed to allow 1 byte alignment. But
+this has significant negative performance implications.)
+
+Digital Mars compiler
+---------------------
+
+Same as MS Visual C++ but might require
+-DAO_OLD_STYLE_INTERLOCKED_COMPARE_EXCHANGE option to compile with the
+parallel marker enabled.
+
+Watcom compiler
+---------------
+
+Ivan V. Demakov's README for the Watcom port:
+
+The collector has been tested with Watcom C 10.6, 11.0 and OpenWatcom 2.0.
+It runs under Win32 and win32s, and even under DOS with dos4gw
+dos-extender. It should also run under OS/2, though this isn't
+tested. Under Win32 the collector can be built either as dll
+or as static library.
+
+Note that all compilations were done under Windows 95 or NT.
+For unknown reason compiling under Windows 3.11 for NT (one
+attempt has been made) leads to broken executables.
+
+Incremental collection is supported (except for MSDOS and OS/2).
+
+Before compiling you may need to edit WCC_MAKEFILE to set target
+platform, library type (dynamic or static), calling conventions, and
+optimization options.
+
+To compile the collector use the command:
+ wmake -f WCC_MAKEFILE
+
+All programs using gc should be compiled with 4-byte alignment.
+For further explanations on this see comments about Borland.
+
+If the gc is compiled as dll, the macro "GC_DLL" should be defined before
+including "gc.h" (for example, with -DGC_DLL compiler option). It's
+important, otherwise resulting programs will not run.
+
+The alternate way to compile the collector is to use cmake build system:
+ cmake -G "Watcom WMake" .
+ cmake --build .
+
+Special note for OpenWatcom users: the C (unlike the C++) compiler (of the
+latest stable release, not sure for older ones) doesn't force pointer global
+variables (i.e. not struct fields, not sure for locals) to be aligned unless
+optimizing for speed (e.g., "-ot" option is set); the "-zp" option (or align
+pragma) only controls alignment for structs; I don't know whether it's a bug or
+a feature (see an old report of same kind -
+http://bugzilla.openwatcom.org/show_bug.cgi?id=664), so You are warned.
+
+Incremental Collection
+----------------------
+
+There is some support for incremental collection. By default, the
+collector chooses between explicit page protection, and GetWriteWatch-based
+write tracking automatically, depending on the platform.
+
+The former is slow and interacts poorly with a debugger.
+Pages are protected. Protection faults are caught by a handler
+installed at the bottom of the handler
+stack. Whenever possible, I recommend adding a call to
+GC_enable_incremental at the last possible moment, after most
+debugging is complete. No system
+calls are wrapped by the collector itself. It may be necessary
+to wrap ReadFile calls that use a buffer in the heap, so that the
+call does not encounter a protection fault while it's running.
+(As usual, none of this is an issue unless GC_enable_incremental
+is called.)
+
+Note that incremental collection is disabled with -DSMALL_CONFIG.
+
+Threads
+-------
+
+The collector by default handles threads similarly to other platforms.
+James Clark's code which tracks threads attached to the collector DLL still
+exists, but requires that both
+- the collector is built in a DLL with GC_DLL defined, and
+- GC_use_threads_discovery() is called before GC initialization, which
+ in turn must happen before creating additional threads.
+We generally recommend avoiding this if possible, since it seems to
+be less than 100% reliable.
+
+To build the collector as a dynamic library which handles threads similarly
+to other platforms, type "nmake -f NT_MAKEFILE". If automatic tracking of
+threads attached to the collector DLL (i.e. support of both kinds of thread
+tracking) is needed then delete "-DTHREAD_LOCAL_ALLOC" from NT_MAKEFILE
+manually before the build.
+
+The incremental collection is supported only if it is enabled before any
+additional threads are created.
+
+Threads are also supported in static library builds with Microsoft tools
+(e.g., NT_MAKEFILE), as well as with the CMake and GNU tools. The collector
+must be built with GC_THREADS defined (this is the default in NT_MAKEFILE,
+CMakeLists.txt and configure).
+
+For the normal, non-dll-based thread tracking to work properly,
+threads should be created with GC_CreateThread or GC_beginthreadex,
+and exit normally, or call GC_endthreadex or GC_ExitThread. (For Cygwin, the
+standard pthread_create/exit calls could be used instead.) As in the pthread
+case, including gc.h will redefine CreateThread, _beginthreadex,
+_endthreadex, and ExitThread to call the GC_ versions instead.
+
+Note that, as usual, GC_CreateThread tends to introduce resource leaks (in the
+C runtime) that are avoided by GC_beginthreadex. There is currently no
+equivalent of _beginthread, and it should not be used.
+
+GC_INIT should be called from the main thread before other GC calls.
+
+We strongly advise against using the TerminateThread() Windows API call,
+especially with the garbage collector. Any use is likely to provoke a
+crash in the GC, since it makes it impossible for the collector to
+correctly track threads.
+
+To build the collector for MinGW pthreads-win32 (or other non-Cygwin pthreads
+implementation for Windows), use Makefile.direct and explicitly set
+GC_WIN32_PTHREADS (or pass --enable-threads=pthreads to configure).
+Use -DPTW32_STATIC_LIB for the static threads library.
+
+The alternate (better) way to build the library is to use CMake script;
+please see README.cmake for the details.
diff --git a/graphics/asymptote/gc/doc/README.win64 b/graphics/asymptote/gc/doc/README.win64
new file mode 100644
index 0000000000..91d02829fd
--- /dev/null
+++ b/graphics/asymptote/gc/doc/README.win64
@@ -0,0 +1,27 @@
+64-bit Windows on AMD64/Intel EM64T (x64) is supported. A collector can be
+built with Microsoft Visual C++ 2005 or with mingw-w64 gcc.
+
+NT_MAKEFILE has been used in this environment. Type
+"nmake -f NT_MAKEFILE cpu=AMD64 nodebug=1" in a Visual C++ command line
+window to build the release variant of the dynamic library with threads
+support.
+To verify that the collector is at least somewhat functional,
+type "nmake -f NT_MAKEFILE cpu=AMD64 check" to build and run the usual test
+programs. This should create gctest.gc.log after a few seconds.
+
+Test_cpp.exe might not run correctly in case of dynamic GC linking. (It seems
+that we're getting wrong instances of operator new/delete in some cases.)
+
+This process is completely analogous to NT_MAKEFILE usage
+for the 32-bit library version.
+
+A similar procedure using NT_MAKEFILE is applicable to build the static
+library - just pass "enable_static=1" as an extra argument to nmake.
+If needed, it is also possible to build the library without threads
+support - this could be done by passing "disable_threads=1" argument to nmake.
+
+Note that some warnings have been explicitly turned off in the makefile.
+
+VC++ note: to suppress warnings -D_CRT_SECURE_NO_DEPRECATE is used.
+
+gcc note: -fno-strict-aliasing should be used if optimizing.
diff --git a/graphics/asymptote/gc/doc/debugging.md b/graphics/asymptote/gc/doc/debugging.md
new file mode 100644
index 0000000000..8554f7cc32
--- /dev/null
+++ b/graphics/asymptote/gc/doc/debugging.md
@@ -0,0 +1,273 @@
+# Debugging Garbage Collector Related Problems
+
+This page contains some hints on debugging issues specific to the
+Boehm-Demers-Weiser conservative garbage collector. It applies both
+to debugging issues in client code that manifest themselves as collector
+misbehavior, and to debugging the collector itself.
+
+If you suspect a bug in the collector itself, it is strongly recommended that
+you try the latest collector release before proceeding.
+
+## Bus Errors and Segmentation Violations
+
+If the fault occurred in `GC_find_limit`, or with incremental collection
+enabled, this is probably normal. The collector installs handlers to take care
+of these. You will not see these unless you are using a debugger. Your
+debugger _should_ allow you to continue. It's often preferable to tell the
+debugger to ignore SIGBUS and SIGSEGV ("handle SIGSEGV SIGBUS nostop noprint"
+in gdb, "ignore SIGSEGV SIGBUS" in most versions of dbx) and set a breakpoint
+in `abort`. The collector will call abort if the signal had another cause, and
+there was not other handler previously installed.
+
+We recommend debugging without incremental collection if possible. (This
+applies directly to UNIX systems. Debugging with incremental collection under
+Win32 is worse. See README.win32.)
+
+If the application generates an unhandled SIGSEGV or equivalent, it may often
+be easiest to set the environment variable `GC_LOOP_ON_ABORT`. On many
+platforms, this will cause the collector to loop in a handler when the SIGSEGV
+is encountered (or when the collector aborts for some other reason), and
+a debugger can then be attached to the looping process. This sidesteps common
+operating system problems related to incomplete core files for multi-threaded
+applications, etc.
+
+## Other Signals
+
+On most platforms, the multi-threaded version of the collector needs one or
+two other signals for internal use by the collector in stopping threads. It is
+normally wise to tell the debugger to ignore these. On Linux, the collector
+currently uses SIGPWR and SIGXCPU by default.
+
+## Warning Messages About Needing to Allocate Blacklisted Blocks
+
+The garbage collector generates warning messages of the form:
+
+
+ Repeated allocation of very large block ...
+ May lead to memory leak and poor performance
+
+
+when it needs to allocate a block at a location that it knows to be referenced
+by a false pointer. These false pointers can be either permanent (e.g.
+a static integer variable that never changes) or temporary. In the latter
+case, the warning is largely spurious, and the block will eventually
+be reclaimed normally. In the former case, the program will still run
+correctly, but the block will never be reclaimed. Unless the block is intended
+to be permanent, the warning indicates a memory leak.
+
+ 1. Ignore these warnings while you are using GC_DEBUG. Some of the routines
+ mentioned below don't have debugging equivalents. (Alternatively, write the
+ missing routines and send them to me.)
+ 2. Replace allocator calls that request large blocks with calls to
+ `GC_malloc_ignore_off_page` or `GC_malloc_atomic_ignore_off_page`. You may
+ want to set a breakpoint in `GC_default_warn_proc` to help you identify such
+ calls. Make sure that a pointer to somewhere near the beginning of the
+ resulting block is maintained in a (preferably volatile) variable as long
+ as the block is needed.
+ 3. If the large blocks are allocated with realloc, we suggest instead
+ allocating them with something like the following. Note that the realloc
+ size increment should be fairly large (e.g. a factor of 3/2) for this to
+ exhibit reasonable performance. But we all know we should do that anyway.
+
+
+ void * big_realloc(void *p, size_t new_size) {
+ size_t old_size = GC_size(p);
+ void * result;
+ if (new_size <= 10000) return(GC_realloc(p, new_size));
+ if (new_size <= old_size) return(p);
+ result = GC_malloc_ignore_off_page(new_size);
+ if (result == 0) return(0);
+ memcpy(result,p,old_size);
+ GC_free(p);
+ return(result);
+ }
+
+
+ 4. In the unlikely case that even relatively small object (<20 KB)
+ allocations are triggering these warnings, then your address space contains
+ lots of "bogus pointers", i.e. values that appear to be pointers but aren't.
+ Usually this can be solved by using `GC_malloc_atomic` or the routines
+ in `gc_typed.h` to allocate large pointer-free regions of bitmaps, etc.
+ Sometimes the problem can be solved with trivial changes of encoding
+ in certain values. It is possible, to identify the source of the bogus
+ pointers by building the collector with `-DPRINT_BLACK_LIST`, which will
+ cause it to print the "bogus pointers", along with their location.
+ 5. If you get only a fixed number of these warnings, you are probably only
+ introducing a bounded leak by ignoring them. If the data structures being
+ allocated are intended to be permanent, then it is also safe to ignore them.
+ The warnings can be turned off by calling `GC_set_warn_proc` with
+ a procedure that ignores these warnings (e.g. by doing absolutely nothing).
+
+## The Collector References a Bad Address in GC_malloc
+
+This typically happens while the collector is trying to remove an entry from
+its free list, and the free list pointer is bad because the free list link
+in the last allocated object was bad.
+
+With >99% probability, you wrote past the end of an allocated object. Try
+setting `GC_DEBUG` before including `gc.h` and allocating with `GC_MALLOC`.
+This will try to detect such overwrite errors.
+
+## Unexpectedly Large Heap
+
+Unexpected heap growth can be due to one of the following:
+
+ 1. Data structures that are being unintentionally retained. This is commonly
+ caused by data structures that are no longer being used, but were not
+ cleared, or by caches growing without bounds.
+ 2. Pointer misidentification. The garbage collector is interpreting integers
+ or other data as pointers and retaining the "referenced" objects. A common
+ symptom is that GC_dump() shows much of the heap as black-listed.
+ 3. Heap fragmentation. This should never result in unbounded growth, but
+ it may account for larger heaps. This is most commonly caused by allocation
+ of large objects.
+ 4. Per object overhead. This is usually a relatively minor effect, but
+ it may be worth considering. If the collector recognizes interior pointers,
+ object sizes are increased, so that one-past-the-end pointers are correctly
+ recognized. The collector can be configured not to do this
+ (`-DDONT_ADD_BYTE_AT_END`).
+
+The collector rounds up object sizes so the result fits well into the chunk
+size (`HBLKSIZE`, normally 4 KB on 32-bit machines, 8 KB on 64-bit ones) used
+by the collector. Thus it may be worth avoiding objects of size 2K + 1 bytes
+(or exactly 2 KB if a byte is being added at the end.) The last two cases can
+often be identified by looking at the output of a call to `GC_dump`. Among
+other things, it will print the list of free heap blocks, and a very brief
+description of all chunks in the heap, the object sizes they correspond to,
+and how many live objects were found in the chunk at the last collection.
+
+Growing data structures can usually be identified by:
+
+ 1. Building the collector with `-DKEEP_BACK_PTRS`,
+ 2. Preferably using debugging allocation (defining `GC_DEBUG` before
+ including `gc.h` and allocating with `GC_MALLOC`), so that objects will
+ be identified by their allocation site,
+ 3. Running the application long enough so that most of the heap is composed
+ of "leaked" memory, and
+ 4. Then calling `GC_generate_random_backtrace` from gc_backptr.h a few times
+ to determine why some randomly sampled objects in the heap are being
+ retained.
+
+The same technique can often be used to identify problems with false pointers,
+by noting whether the reference chains printed
+by `GC_generate_random_backtrace` involve any misidentified pointers.
+An alternate technique is to build the collector with `-DPRINT_BLACK_LIST`
+which will cause it to report values that are almost, but not quite, look like
+heap pointers. It is very likely that actual false pointers will come from
+similar sources.
+
+In the unlikely case that false pointers are an issue, it can usually
+be resolved using one or more of the following techniques:
+
+ 1. Use `GC_malloc_atomic` for objects containing no pointers. This is
+ especially important for large arrays containing compressed data,
+ pseudo-random numbers, and the like. It is also likely to improve GC
+ performance, perhaps drastically so if the application is paging.
+ 2. If you allocate large objects containing only one or two pointers at the
+ beginning, either try the typed allocation primitives in `gc_typed.h`,
+ or separate out the pointer-free component.
+ 3. Consider using `GC_malloc_ignore_off_page` to allocate large objects.
+ (See `gc.h` and above for details. Large means more than 100 KB in most
+ environments.)
+ 4. If your heap size is larger than 100 MB or so, build the collector with
+ `-DLARGE_CONFIG`. This allows the collector to keep more precise black-list
+ information.
+ 5. If you are using heaps close to, or larger than, a gigabyte on a 32-bit
+ machine, you may want to consider moving to a platform with 64-bit pointers.
+ This is very likely to resolve any false pointer issues.
+
+## Prematurely Reclaimed Objects
+
+The usual symptom of this is a segmentation fault, or an obviously overwritten
+value in a heap object. This should, of course, be impossible. In practice,
+it may happen for reasons like the following:
+
+ 1. The collector did not intercept the creation of threads correctly
+ in a multi-threaded application, e.g. because the client called
+ `pthread_create` without including `gc.h`, which redefines it.
+ 2. The last pointer to an object in the garbage collected heap was stored
+ somewhere were the collector could not see it, e.g. in an object allocated
+ with system `malloc`, in certain types of `mmap`ed files, or in some data
+ structure visible only to the OS. (On some platforms, thread-local storage
+ is one of these.)
+ 3. The last pointer to an object was somehow disguised, e.g. by XORing
+ it with another pointer.
+ 4. Incorrect use of `GC_malloc_atomic` or typed allocation.
+ 5. An incorrect `GC_free` call.
+ 6. The client program overwrote an internal garbage collector data
+ structure.
+ 7. A garbage collector bug.
+ 8. (Empirically less likely than any of the above.) A compiler optimization
+ that disguised the last pointer.
+
+The following relatively simple techniques should be tried first to narrow
+down the problem:
+
+ 1. If you are using the incremental collector try turning it off for
+ debugging.
+ 2. If you are using shared libraries, try linking statically. If that works,
+ ensure that DYNAMIC_LOADING is defined on your platform.
+ 3. Try to reproduce the problem with fully debuggable unoptimized code. This
+ will eliminate the last possibility, as well as making debugging easier.
+ 4. Try replacing any suspect typed allocation and `GC_malloc_atomic` calls
+ with calls to `GC_malloc`.
+ 5. Try removing any `GC_free` calls (e.g. with a suitable `#define`).
+ 6. Rebuild the collector with `-DGC_ASSERTIONS`.
+ 7. If the following works on your platform (i.e. if gctest still works if
+ you do this), try building the collector with
+ `-DREDIRECT_MALLOC=GC_malloc_uncollectable`. This will cause the collector
+ to scan memory allocated with malloc.
+
+If all else fails, you will have to attack this with a debugger. The suggested
+steps are:
+
+ 1. Call `GC_dump` from the debugger around the time of the failure. Verify
+ that the collectors idea of the root set (i.e. static data regions which
+ it should scan for pointers) looks plausible. If not, i.e. if it does not
+ include some static variables, report this as a collector bug. Be sure
+ to describe your platform precisely, since this sort of problem is nearly
+ always very platform dependent.
+ 2. Especially if the failure is not deterministic, try to isolate
+ it to a relatively small test case.
+ 3. Set a break point in `GC_finish_collection`. This is a good point
+ to examine what has been marked, i.e. found reachable, by the collector.
+ 4. If the failure is deterministic, run the process up to the last
+ collection before the failure. Note that the variable `GC_gc_no` counts
+ collections and can be used to set a conditional breakpoint in the right
+ one. It is incremented just before the call to `GC_finish_collection`.
+ If object `p` was prematurely recycled, it may be helpful to look
+ at `*GC_find_header(p)` at the failure point. The `hb_last_reclaimed` field
+ will identify the collection number during which its block was last swept.
+ 5. Verify that the offending object still has its correct contents at this
+ point. Then call `GC_is_marked(p)` from the debugger to verify that the
+ object has not been marked, and is about to be reclaimed. Note that
+ `GC_is_marked(p)` expects the real address of an object (the address of the
+ debug header if there is one), and thus it may be more appropriate to call
+ `GC_is_marked(GC_base(p))` instead.
+ 6. Determine a path from a root, i.e. static variable, stack, or register
+ variable, to the reclaimed object. Call `GC_is_marked(q)` for each object
+ `q` along the path, trying to locate the first unmarked object, say `r`.
+ 7. If `r` is pointed to by a static root, verify that the location pointing
+ to it is part of the root set printed by `GC_dump`. If it is on the stack
+ in the main (or only) thread, verify that `GC_stackbottom` is set correctly
+ to the base of the stack. If it is in another thread stack, check the
+ collector's thread data structure (`GC_thread[]` on several platforms)
+ to make sure that stack bounds are set correctly.
+ 8. If `r` is pointed to by heap object `s`, check that the collector's
+ layout description for `s` is such that the pointer field will be scanned.
+ Call `*GC_find_header(s)` to look at the descriptor for the heap chunk.
+ The `hb_descr` field specifies the layout of objects in that chunk.
+ See `gc_mark.h` for the meaning of the descriptor. (If its low order 2 bits
+ are zero, then it is just the length of the object prefix to be scanned.
+ This form is always used for objects allocated with `GC_malloc` or
+ `GC_malloc_atomic`.)
+ 9. If the failure is not deterministic, you may still be able to apply some
+ of the above technique at the point of failure. But remember that objects
+ allocated since the last collection will not have been marked, even if the
+ collector is functioning properly. On some platforms, the collector can
+ be configured to save call chains in objects for debugging. Enabling this
+ feature will also cause it to save the call stack at the point of the last
+ GC in `GC_arrays._last_stack`.
+ 10. When looking at GC internal data structures remember that a number
+ of `GC_xxx` variables are really macro defined to `GC_arrays._xxx`, so that
+ the collector can avoid scanning them.
diff --git a/graphics/asymptote/gc/doc/doc.am b/graphics/asymptote/gc/doc/doc.am
new file mode 100644
index 0000000000..39322f94a4
--- /dev/null
+++ b/graphics/asymptote/gc/doc/doc.am
@@ -0,0 +1,52 @@
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+## Process this file with automake to produce Makefile.in.
+
+# installed documentation
+if ENABLE_DOCS
+dist_doc_DATA = \
+ AUTHORS \
+ README.md \
+ doc/README.DGUX386 \
+ doc/README.Mac \
+ doc/README.OS2 \
+ doc/README.amiga \
+ doc/README.arm.cross \
+ doc/README.autoconf \
+ doc/README.cmake \
+ doc/README.cords \
+ doc/README.darwin \
+ doc/README.emscripten \
+ doc/README.environment \
+ doc/README.ews4800 \
+ doc/README.hp \
+ doc/README.linux \
+ doc/README.macros \
+ doc/README.rs6000 \
+ doc/README.sgi \
+ doc/README.solaris2 \
+ doc/README.symbian \
+ doc/README.uts \
+ doc/README.win32 \
+ doc/README.win64 \
+ doc/debugging.md \
+ doc/finalization.md \
+ doc/gcdescr.md \
+ doc/gcinterface.md \
+ doc/leak.md \
+ doc/overview.md \
+ doc/porting.md \
+ doc/scale.md \
+ doc/simple_example.md \
+ doc/tree.md
+
+dist_man3_MANS = doc/gc.man
+endif
diff --git a/graphics/asymptote/gc/doc/finalization.md b/graphics/asymptote/gc/doc/finalization.md
new file mode 100644
index 0000000000..49aee982bc
--- /dev/null
+++ b/graphics/asymptote/gc/doc/finalization.md
@@ -0,0 +1,158 @@
+# Finalization
+
+Many garbage collectors provide a facility for executing user code just before
+an object is collected. This can be used to reclaim any system resources
+or non-garbage-collected memory associated with the object. Experience has
+shown that this can be a useful facility. It is indispensable in cases
+in which system resources are embedded in complex data structures (e.g. file
+descriptors in the `include/cord.h`).
+
+Our collector provides the necessary functionality through
+`GC_register_finalizer` in `include/gc.h`, or by inheriting from `gc_cleanup`
+in `include/gc_cpp.h`).
+
+However, finalization should not be used in the same way as C++ destructors.
+In well-written programs there will typically be very few uses
+of finalization. (Garbage collected programs that interact with explicitly
+memory-managed libraries may be an exception.)
+
+In general the following guidelines should be followed:
+
+ * Actions that must be executed promptly do not belong in finalizers. They
+ should be handled by explicit calls in the code (or C++ destructors if you
+ prefer). If you expect the action to occur at a specific point, this
+ is probably not hard.
+ * Finalizers are intended for resource reclamation.
+ * Scarce system resources should be managed explicitly whenever convenient.
+ Use finalizers only as a backup mechanism for the cases that would be hard
+ to handle explicitly.
+ * If scarce resources are managed with finalization, the allocation routine
+ for that resource (e.g. open for file handles) should force a garbage
+ collection (two if that does not suffice) if it finds itself short of the
+ resource.
+ * If extremely scarce resources are managed by finalization (e.g. file
+ descriptors on systems which have a limit of 20 open files), it may
+ be necessary to introduce a descriptor caching scheme to hide the resource
+ limit. (E.g., the program would keep real file descriptors for the 20 most
+ recently used logically open files. Any other needed files would be closed
+ after saving their state. They would then be reopened on demand.
+ Finalization would logically close the file, closing the real descriptor
+ only if it happened to be cached.) Note that most modern systems allow
+ thousands of open files, and this is typically not an issue.
+ * Finalization code may be run anyplace an allocation or other call to the
+ collector takes place. In multi-threaded programs, finalizers have to obey
+ the normal locking conventions to ensure safety. Code run directly from
+ finalizers should not acquire locks that may be held during allocation.
+ This restriction can be easily circumvented by calling
+ `GC_set_finalize_on_demand(1)` at program start and creating a separate
+ thread dedicated to periodic invocation of `GC_invoke_finalizers()`.
+
+In single-threaded code, it is also often easiest to have finalizers queued
+and, then to have them explicitly executed by `GC_invoke_finalizers()`.
+
+## Topologically ordered finalization
+
+Our _conservative garbage collector_ supports a form of finalization (with
+`GC_register_finalizer`) in which objects are finalized in topological order.
+If _A_ points to _B_ and both are registered for finalization, it is
+guaranteed the _A_ will be finalized first. This usually guarantees that
+finalization procedures see only unfinalized objects.
+
+This decision is often questioned, particularly since it has an obvious
+disadvantage. The current implementation finalizes long chains of finalizable
+objects one per collection. This is hard to avoid, since the first finalizer
+invoked may store a pointer to the rest of the chain in a global variable,
+making it accessible again. Or it may mutate the rest of the chain.
+
+Cycles involving one or more finalizable objects are never finalized.
+
+## Why topological ordering?
+
+It is important to keep in mind that the choice of finalization ordering
+matters only in relatively rare cases. In spite of the fact that it has
+received a lot of discussion, it is not one of the more important decisions
+in designing a system. Many, especially smaller, applications will never
+notice the difference. Nonetheless, we believe that topologically ordered
+finalization is the right choice.
+
+To understand the justification, observe that if _A_'s finalization procedure
+does not refer to _B_, we could fairly easily have avoided the dependency.
+We could have split _A_ into _A'_ and _A''_ such that any references to _A_
+become references to _A'_, _A'_ points to _A''_ but not vice-versa, only
+fields needed for finalization are stored in _A''_, and _A''_ is enabled for
+finalization. (`GC_register_disappearing_link` provides an alternative
+mechanism that does not require breaking up objects.)
+
+Thus assume that _A_ actually does need access to _B_ during finalization.
+To make things concrete, assume that _B_ is finalizable because it holds
+a pointer to a C object, which must be explicitly deallocated. (This is likely
+to be one of the most common uses of finalization.) If _B_ happens to be
+finalized first, _A_ will see a dangling pointer during its finalization. But
+a principal goal of garbage collection was to avoid dangling pointers.
+
+Note that the client program could enforce topological ordering even if the
+system did not. A pointer to _B_ could be stored in some globally visible
+place, where it is cleared only by _A_'s finalizer. But this puts the burden
+to ensure safety back on the programmer.
+
+With topologically ordered finalization, the programmer can fail to split
+an object, thus leaving an accidental cycle. This results in a leak, which
+is arguably less dangerous than a dangling pointer. More importantly, it is
+_much_ easier to diagnose, since the garbage collector would have to go out of
+its way not to notice finalization cycles. It can trivially report them.
+
+Furthermore unordered finalization does not really solve the problem
+of cycles. Consider the above case in which _A_'s finalization procedure
+depends on _B_, and thus a pointer to _B_ is stored in a global data
+structure, to be cleared by _A_'s finalizer. If there is an accidental pointer
+from _B_ back to _A_, and thus a cycle, neither _B_ nor _A_ will become
+unreachable. The leak is there, just as in the topologically ordered case, but
+it is hidden from easy diagnosis.
+
+A number of alternative finalization orderings have been proposed, e.g. based
+on statically assigned priorities. In our opinion, these are much more likely
+to require complex programming discipline to use in a large modular system.
+(Some of them, e.g. Guardians proposed by Dybvig, Bruggeman, and Eby, do avoid
+some problems which arise in combination with certain other collection
+algorithms.)
+
+Fundamentally, a garbage collector assumes that objects reachable via pointer
+chains may be accessed, and thus should be preserved. Topologically ordered
+finalization simply extends this to object finalization; an finalizable object
+reachable from another finalizer via a pointer chain is presumed to be
+accessible by the finalizer, and thus should not be finalized.
+
+## Programming with topological finalization
+
+Experience with Cedar has shown that cycles or long chains of finalizable
+objects are typically not a problem. Finalizable objects are typically rare.
+There are several ways to reduce spurious dependencies between finalizable
+objects. Splitting objects as discussed above is one technique. The collector
+also provides `GC_register_disappearing_link`, which explicitly nils a pointer
+before determining finalization ordering.
+
+Some so-called "operating systems" fail to clean up some resources associated
+with a process. These resources must be deallocated at all cost before process
+exit whether or not they are still referenced. Probably the best way to deal
+with those is by not relying exclusively on finalization. They should
+be registered in a table of weak pointers (implemented as disguised pointers
+cleared by the finalization procedure that deallocates the resource). If any
+references are still left at process exit, they can be explicitly deallocated
+then.
+
+## Getting around topological finalization ordering
+
+There are certain situations in which cycles between finalizable objects are
+genuinely unavoidable. Most notably, C++ compilers introduce self-cycles
+to represent inheritance. `GC_register_finalizer_ignore_self` tells the
+finalization part of the collector to ignore self cycles. This is used by the
+C++ interface.
+
+Finalize.c actually contains an intentionally undocumented mechanism for
+registering a finalizable object with user-defined dependencies. The problem
+is that this dependency information is also used for memory reclamation, not
+just finalization ordering. Thus misuse can result in dangling pointers even
+if finalization does not create any. The risk of dangling pointers can be
+eliminated by building the collector with `-DJAVA_FINALIZATION`. This forces
+objects reachable from finalizers to be marked, even though this dependency
+is not considered for finalization ordering.
diff --git a/graphics/asymptote/gc/doc/gc.man b/graphics/asymptote/gc/doc/gc.man
new file mode 100644
index 0000000000..86065b52c9
--- /dev/null
+++ b/graphics/asymptote/gc/doc/gc.man
@@ -0,0 +1,155 @@
+.TH BDWGC 3 "23 Aug 2023"
+.SH NAME
+GC_malloc, GC_malloc_atomic, GC_free, GC_realloc, GC_enable_incremental,
+GC_register_finalizer, GC_malloc_ignore_off_page,
+GC_malloc_atomic_ignore_off_page, GC_set_warn_proc \- Garbage collecting
+malloc replacement
+.SH SYNOPSIS
+#include <gc/gc.h>
+.br
+void * GC_malloc(size_t size);
+.br
+void * GC_malloc_atomic(size_t size);
+.br
+void GC_free(void *ptr);
+.br
+void * GC_realloc(void *ptr, size_t size);
+.br
+void GC_enable_incremental(void);
+.br
+void * GC_malloc_ignore_off_page(size_t size);
+.br
+void * GC_malloc_atomic_ignore_off_page(size_t size);
+.br
+void GC_set_warn_proc(void (*proc)(char *, GC_word));
+.br
+.sp
+cc ... -lgc
+.LP
+.SH DESCRIPTION
+.I GC_malloc
+and
+.I GC_free
+are plug-in replacements for standard malloc and free. However,
+.I
+GC_malloc
+will attempt to reclaim inaccessible space automatically by invoking
+a conservative garbage collector at appropriate points. The collector
+traverses all data structures accessible by following pointers from the
+machines registers, stack(s), data, and bss segments. Inaccessible structures
+will be reclaimed. A machine word is considered to be a valid pointer if
+it is an address inside an object allocated by
+.I
+GC_malloc
+or friends.
+.LP
+In most cases it is preferable to call the macros GC_MALLOC, GC_FREE, etc.
+instead of calling GC_malloc and friends directly. This allows debugging
+versions of the routines to be substituted by defining GC_DEBUG before
+including gc.h.
+.LP
+See the documentation in the include files gc_cpp.h and gc_allocator.h,
+as well as the gcinterface.md file in the distribution,
+for an alternate, C++ specific interface to the garbage collector.
+Note that C++ programs generally
+need to be careful to ensure that all allocated memory (whether via new,
+malloc, or STL allocators) that may point to garbage collected memory
+is either itself garbage collected, or at least traced by the collector.
+.LP
+Unlike the standard implementations of malloc,
+.I
+GC_malloc
+clears the newly allocated storage.
+.I
+GC_malloc_atomic
+does not. Furthermore, it informs the collector that the resulting object
+will never contain any pointers, and should therefore not be scanned by the
+collector.
+.LP
+.I
+GC_free
+can be used to deallocate objects, but its use is optional, and generally
+discouraged.
+.I
+GC_realloc
+has the standard realloc semantics. It preserves pointer-free-ness.
+.I
+GC_register_finalizer
+allows for registration of functions that are invoked when an object becomes
+inaccessible.
+.LP
+The garbage collector tries to avoid allocating memory at locations that
+already appear to be referenced before allocation. (Such apparent
+``pointers'' are usually large integers and the like that just happen to look
+like an address.) This may make it hard to allocate very large objects.
+An attempt to do so may generate a warning.
+.LP
+.I
+GC_malloc_ignore_off_page
+and
+.I
+GC_malloc_atomic_ignore_off_page
+inform the collector that the client code will always maintain a pointer to
+near the beginning (i.e. within the first heap block) of the object, and that
+pointers beyond that can be ignored by the collector. This makes it much
+easier for the collector to place large objects. These are recommended for
+large object allocation. (Objects expected to be > ~100 KB should be
+allocated this way.)
+.LP
+It is also possible to use the collector to find storage leaks in programs
+destined to be run with standard malloc/free. The collector can be compiled
+for thread-safe operation. Unlike standard malloc, it is safe to call malloc
+after a previous malloc call was interrupted by a signal, provided the
+original malloc call is not resumed.
+.LP
+The collector may, on rare occasion, produce warning messages. On UNIX
+machines these appear on stderr. Warning messages can be filtered,
+redirected, or ignored with
+.I
+GC_set_warn_proc
+This is recommended for production code. See gc.h for details.
+.LP
+Fully portable code should call
+.I
+GC_INIT
+from the primordial thread of the main program before making any other
+GC calls. On most platforms this does nothing and the collector is
+initialized on first use. On a few platforms explicit initialization is
+necessary. And it can never hurt.
+.LP
+Debugging versions of many of the above routines are provided as macros.
+Their names are identical to the above, but consist of all capital letters.
+If GC_DEBUG is defined before gc.h is included, these routines do additional
+checking, and allow the leak detecting version of the collector to produce
+slightly more useful output. Without GC_DEBUG defined, they behave exactly
+like the lower-case versions.
+.LP
+On some machines, collection will be performed incrementally after a call to
+.I
+GC_enable_incremental.
+This may temporarily write protect pages in the heap. See the README file for
+more information on how this interacts with system calls that write to the
+heap.
+.LP
+Other facilities not discussed here include limited facilities to support
+incremental collection on machines without appropriate VM support, provisions
+for providing more explicit object layout information to the garbage
+collector, more direct support for ``weak'' pointers, support for
+``abortable'' garbage collections during idle time, etc.
+.LP
+.SH "SEE ALSO"
+The README and gc.h files in the distribution. More detailed definitions of
+the functions exported by the collector are given there. (The above list is
+not complete.)
+.LP
+The web site at http://www.hboehm.info/gc/ (or https://github.com/ivmai/bdwgc/).
+.LP
+Boehm, H., and M. Weiser, "Garbage Collection in an Uncooperative Environment",
+"Software Practice & Experience", September 1988, pp. 807-820.
+.LP
+The malloc(3) man page.
+.LP
+.SH AUTHOR
+Hans-J. Boehm (boehm@acm.org).
+Some of the code was written by others (see the AUTHORS file for the details),
+most notably by Alan Demers, and, recently, Ivan Maidanski.
diff --git a/graphics/asymptote/gc/doc/gcdescr.md b/graphics/asymptote/gc/doc/gcdescr.md
new file mode 100644
index 0000000000..4fa2698794
--- /dev/null
+++ b/graphics/asymptote/gc/doc/gcdescr.md
@@ -0,0 +1,546 @@
+# Conservative GC Algorithmic Overview
+
+This is a description of the algorithms and data structures used in our
+conservative garbage collector. I expect the level of detail to increase with
+time. For a survey of GC algorithms, e.g. see Paul Wilson's
+["Uniprocessor Garbage Collection Techniques"](ftp://ftp.cs.utexas.edu/pub/garbage/gcsurvey.ps)
+excellent paper. For an overview of the collector interface, see
+[here](gcinterface.md).
+
+This description is targeted primarily at someone trying to understand the
+source code. It specifically refers to variable and function names. It may
+also be useful for understanding the algorithms at a higher level.
+
+The description here assumes that the collector is used in default mode.
+In particular, we assume that it used as a garbage collector, and not just
+a leak detector. We initially assume that it is used in stop-the-world,
+non-incremental mode, though the presence of the incremental collector will
+be apparent in the design. We assume the default finalization model, but the
+code affected by that is very localized.
+
+Table of Contents
+ * [Introduction](#introduction)
+ * [Allocation](#allocation)
+ * [Mark phase](#mark-phase)
+ * [Sweep phase](#sweep-phase)
+ * [Finalization](#finalization)
+ * [Generational Collection and Dirty Bits](#generational-collection-and-dirty-bits)
+ * [Black-listing](#black-listing)
+ * [Thread support](#thread-support)
+ * [Thread-local allocation](#thread-local-allocation)
+
+## Introduction
+
+The garbage collector uses a modified mark-sweep algorithm. Conceptually
+it operates roughly in four phases, which are performed occasionally as part
+of a memory allocation:
+
+ 1. _Preparation phase_
+
+ Each object has an associated mark bit. Clear all mark
+ bits, indicating that all objects are potentially unreachable.
+
+ 2. _Mark phase_
+
+ Marks all objects that can be reachable via chains of pointers from
+ variables. Often the collector has no real information about the location
+ of pointer variables in the heap, so it views all static data areas,
+ stacks and registers as potentially containing pointers. Any bit
+ patterns that represent addresses inside heap objects managed by the
+ collector are viewed as pointers. Unless the client program has made heap
+ object layout information available to the collector, any heap objects
+ found to be reachable from variables are again scanned similarly.
+
+ 3. _Sweep phase_
+
+ Scans the heap for inaccessible, and hence unmarked,
+ objects, and returns them to an appropriate free list for reuse. This is
+ not really a separate phase; even in non-incremental mode this operation
+ is usually performed on demand during an allocation that discovers an
+ empty free list. Thus the sweep phase is very unlikely to touch a page
+ that would not have been touched shortly thereafter anyway.
+
+ 4. _Finalization phase_
+
+ Unreachable objects which had been registered for
+ finalization are enqueued for finalization outside the collector.
+
+The remaining sections describe the memory allocation data structures, and
+then the last 3 collection phases in more detail. We conclude by outlining
+some of the additional features implemented in the collector.
+
+## Allocation
+
+The collector includes its own memory allocator. The allocator obtains memory
+from the system in a platform-dependent way. Under UNIX, it uses either
+`malloc`, `sbrk`, or `mmap`.
+
+Most static data used by the allocator, as well as that needed by the rest
+of the garbage collector is stored inside the `_GC_arrays` structure. This
+allows the garbage collector to easily ignore the collectors own data
+structures when it searches for root pointers. Other allocator and collector
+internal data structures are allocated dynamically with `GC_scratch_alloc`.
+The latter does not allow for deallocation, and is therefore used only for
+permanent data structures.
+
+The allocator returns objects of different _kinds_. Different _kinds_ are
+handled somewhat differently by certain parts of the garbage collector.
+Certain kinds are scanned for pointers, others are not. Some may have
+per-object type descriptors that determine pointer locations. Or a specific
+kind may correspond to one specific object layout. Two built-in kinds are
+uncollectible. In spite of that, it is very likely that most C clients of the
+collector currently use at most two kinds: `NORMAL` and `PTRFREE` objects. The
+[GCJ](https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcj/) runtime also makes heavy
+use of a kind (allocated with `GC_gcj_malloc`) that stores type information
+at a known offset in method tables.
+
+The collector uses a two level allocator. A large block is defined to be one
+larger than half of `HBLKSIZE`, which is a power of 2, typically on the order
+of the page size.
+
+Large block sizes are rounded up to the next multiple of `HBLKSIZE` and then
+allocated by `GC_allochblk`. The collector use an approximate best fit
+algorithm by keeping free lists for several large block sizes. The actual
+implementation of `GC_allochblk` is significantly complicated by black-listing
+issues (see below).
+
+Small blocks are allocated in chunks of size `HBLKSIZE`. Each chunk
+is dedicated to only one object size and kind.
+
+The allocator maintains separate free lists for each size and kind of object.
+Associated with each kind is an array of free list pointers, with entry
+`freelist[i]` pointing to a free list of size 'i' objects. Index `i` is
+expressed in granules, which are the minimum allocatable unit, typically 8 or
+16 bytes. The free lists themselves are linked through the first word in each
+object (see `obj_link` macro).
+
+Once a large block is split for use in smaller objects, it can only be used
+for objects of that size, unless the collector discovers a completely empty
+chunk. Completely empty chunks are restored to the appropriate large block
+free list.
+
+In order to avoid allocating blocks for too many distinct object sizes, the
+collector normally does not directly allocate objects of every possible
+request size. Instead, the request is rounded up to one of a smaller number
+of allocated sizes, for which free lists are maintained. The exact allocated
+sizes are computed on demand, but subject to the constraint that they increase
+roughly in geometric progression. Thus objects requested early in the
+execution are likely to be allocated with exactly the requested size, subject
+to alignment constraints. See `GC_init_size_map` for details.
+
+The actual size rounding operation during small object allocation
+is implemented as a table lookup in `GC_size_map` which maps a requested
+allocation size in bytes to a number of granules.
+
+Both collector initialization and computation of allocated sizes are handled
+carefully so that they do not slow down the small object fast allocation path.
+An attempt to allocate before the collector is initialized, or before the
+appropriate `GC_size_map` entry is computed, will take the same path as an
+allocation attempt with an empty free list. This results in a call to the slow
+path code (`GC_generic_malloc_inner`) which performs the appropriate
+initialization checks.
+
+In non-incremental mode, we make a decision about whether to garbage collect
+whenever an allocation would otherwise have failed with the current heap size.
+If the total amount of allocation since the last collection is less than the
+heap size divided by `GC_free_space_divisor`, we try to expand the heap.
+Otherwise, we initiate a garbage collection. This ensures that the amount
+of garbage collection work per allocated byte remains constant.
+
+The above is in fact an oversimplification of the real heap expansion and GC
+triggering heuristic, which adjusts slightly for root size and certain kinds
+of fragmentation. In particular:
+
+ * Programs with a large root set size and little live heap memory will
+ expand the heap to amortize the cost of scanning the roots.
+ * GC actually collects more frequently in non-incremental mode. The large
+ block allocator usually refuses to split large heap blocks once the garbage
+ collection threshold is reached. This often has the effect of collecting
+ well before the heap fills up, thus reducing fragmentation and working set
+ size at the expense of GC time. (If the collector is configured not to unmap
+ unused pages, GC chooses an intermediate strategy depending on how much
+ large object allocation has taken place in the past.)
+ * In calculating the amount of allocation since the last collection we give
+ partial credit for objects we expect to be explicitly deallocated. Even
+ if all objects are explicitly managed, it is often desirable to collect
+ on rare occasion, since that is our only mechanism for coalescing completely
+ empty chunks.
+
+It has been suggested that this should be adjusted so that we favor expansion
+if the resulting heap still fits into physical memory. In many cases, that
+would no doubt help. But it is tricky to do this in a way that remains robust
+if multiple application are contending for a single pool of physical memory.
+
+## Mark phase
+
+At each collection, the collector marks all objects that are possibly
+reachable from pointer variables. Since it cannot generally tell where pointer
+variables are located, it scans the following _root segments_ for pointers:
+
+ * The registers. Depending on the architecture, this may be done using
+ assembly code, or by calling a `setjmp`-like function which saves register
+ contents on the stack.
+ * The stack(s). In the case of a single-threaded application, on most
+ platforms this is done by scanning the memory between (an approximation of)
+ the current stack pointer and `GC_stackbottom`. (For Intel Itanium, the
+ register stack scanned separately.) The `GC_stackbottom` variable is set in
+ a highly platform-specific way depending on the appropriate configuration
+ information in `gcconfig.h`. Note that the currently active stack needs
+ to be scanned carefully, since callee-save registers of client code may
+ appear inside collector stack frames, which may change during the mark
+ process. This is addressed by scanning some sections of the stack _eagerly_,
+ effectively capturing a snapshot at one point in time.
+ * Static data region(s). In the simplest case, this is the region between
+ `DATASTART` and `DATAEND`, as defined in `gcconfig.h`. However, in most
+ cases, this will also involve static data regions associated with dynamic
+ libraries. These are identified by the mostly platform-specific code
+ in `dyn_load.c`. The marker maintains an explicit stack of memory regions
+ that are known to be accessible, but that have not yet been searched for
+ contained pointers. Each stack entry contains the starting address of the
+ block to be scanned, as well as a descriptor of the block. If no layout
+ information is available for the block, then the descriptor is simply
+ a length. (For other possibilities, see `gc_mark.h`.)
+
+At the beginning of the mark phase, all root segments (as described above) are
+pushed on the stack by `GC_push_roots`. (Registers and eagerly scanned stack
+sections are processed by pushing the referenced objects instead of the stack
+section itself.) If `ALL_INTERIOR_POINTERS` is not defined, then stack roots
+require special treatment. In this case, the normal marking code ignores
+interior pointers, but `GC_push_all_stack` explicitly checks for interior
+pointers and pushes descriptors for target objects.
+
+The marker is structured to allow incremental marking. Each call
+to `GC_mark_some` performs a small amount of work towards marking the heap.
+It maintains explicit state in the form of `GC_mark_state`, which identifies
+a particular sub-phase. Some other pieces of state, most notably the mark
+stack, identify how much work remains to be done in each sub-phase. The normal
+progression of mark states for a stop-the-world collection is:
+
+ 1. `MS_INVALID` indicating that there may be accessible unmarked objects.
+ In this case `GC_objects_are_marked` will simultaneously be false, so the
+ mark state is advanced to
+ 2. `MS_PUSH_UNCOLLECTABLE` indicating that it suffices to push uncollectible
+ objects, roots, and then mark everything reachable from them. `GC_scan_ptr`
+ is advanced through the heap until all uncollectible objects are pushed, and
+ objects reachable from them are marked. At that point, the next call
+ to `GC_mark_some` calls `GC_push_roots` to push the roots. It, then,
+ advances the mark state to
+ 3. `MS_ROOTS_PUSHED` asserting that once the mark stack is empty, all
+ reachable objects are marked. Once in this state, we work only on emptying
+ the mark stack. Once this is completed, the state changes to
+ 4. `MS_NONE` indicating that reachable objects are marked.
+
+The core mark routine `GC_mark_from`, is called repeatedly by several of the
+sub-phases when the mark stack starts to fill up. It is also called repeatedly
+in `MS_ROOTS_PUSHED` state to empty the mark stack. The routine is designed
+to only perform a limited amount of marking at each call, so that it can
+also be used by the incremental collector. It is fairly carefully tuned,
+since it usually consumes a large majority of the garbage collection time.
+
+The fact that it performs only a small amount of work per call also allows
+it to be used as the core routine of the parallel marker. In that case it is
+normally invoked on thread-private mark stacks instead of the global mark
+stack. More details can be found [here](scale.md).
+
+The marker correctly handles mark stack overflows. Whenever the mark stack
+overflows, the mark state is reset to `MS_INVALID`. Since there are already
+marked objects in the heap, this eventually forces a complete scan of the
+heap, searching for pointers, during which any unmarked objects referenced
+by marked objects are again pushed on the mark stack. This process is repeated
+until the mark phase completes without a stack overflow. Each time the stack
+overflows, an attempt is made to grow the mark stack. All pieces of the
+collector that push regions onto the mark stack have to be careful to ensure
+forward progress, even in case of repeated mark stack overflows. Every mark
+attempt results in additional marked objects.
+
+Each mark stack entry is processed by examining all candidate pointers in the
+range described by the entry. If the region has no associated type information
+then this typically requires that each 4-byte aligned quantity (8-byte aligned
+if 64-bit pointers) be considered a candidate pointer.
+
+We determine whether a candidate pointer is actually the address of a heap
+block. This is done in the following steps:
+
+ * The candidate pointer is checked against rough heap bounds. These heap
+ bounds are maintained such that all actual heap objects fall between them.
+ In order to facilitate black-listing (see below) we also include address
+ regions that the heap is likely to expand into. Most non-pointers fail this
+ initial test.
+ * The candidate pointer is divided into two pieces; the most significant
+ bits identify a `HBLKSIZE`-sized page in the address space, and the least
+ significant bits specify an offset within that page. (A hardware page may
+ actually consist of multiple such pages. Normally, HBLKSIZE is usually the
+ page size divided by a small power of two. Alternatively, if the collector
+ is built with `-DLARGE_CONFIG`, such a page may consist of multiple hardware
+ pages.)
+ * The page address part of the candidate pointer is looked up in
+ a [table](tree.md). Each table entry contains either 0, indicating that
+ the page is not part of the garbage collected heap, a small integer _n_,
+ indicating that the page is part of large object, starting at least _n_
+ pages back, or a pointer to a descriptor for the page. In the first case,
+ the candidate pointer is not a true pointer and can be safely ignored.
+ In the last two cases, we can obtain a descriptor for the page containing
+ the beginning of the object.
+ * The starting address of the referenced object is computed. The page
+ descriptor contains the size of the object(s) in that page, the object kind,
+ and the necessary mark bits for those objects. The size information can be
+ used to map the candidate pointer to the object starting address.
+ To accelerate this process, the page header also contains a pointer to
+ a precomputed map of page offsets to displacements from the beginning of an
+ object. The use of this map avoids a potentially slow integer remainder
+ operation in computing the object start address.
+ * The mark bit for the target object is checked and set. If the object was
+ previously unmarked, the object is pushed on the mark stack. The descriptor
+ is read from the page descriptor. (This is computed from information stored
+ in `GC_obj_kinds` when the page is first allocated.)
+
+At the end of the mark phase, mark bits for left-over free lists are cleared,
+in case a free list was accidentally marked due to a stray pointer.
+
+## Sweep phase
+
+At the end of the mark phase, all blocks in the heap are examined. Unmarked
+large objects are immediately returned to the large object free list. Each
+small object page is checked to see if all mark bits are clear. If so, the
+entire page is returned to the large object free list. Small object pages
+containing some reachable object are queued for later sweeping, unless
+we determine that the page contains very little free space, in which case
+it is not examined further.
+
+This initial sweep pass touches only block headers, not the blocks themselves.
+Thus it does not require significant paging, even if large sections of the
+heap are not in physical memory.
+
+Nonempty small object pages are swept when an allocation attempt encounters
+an empty free list for that object size and kind. Pages for the correct size
+and kind are repeatedly swept until at least one empty block is found.
+Sweeping such a page involves scanning the mark bit array in the page header,
+and building a free list linked through the first words in the objects
+themselves. This does involve touching the appropriate data page, but in most
+cases it will be touched only just before it is used for allocation. Hence any
+paging is essentially unavoidable.
+
+Except in the case of pointer-free objects, we maintain the invariant that any
+object in a small object free list is cleared (except possibly for the link
+field). Thus it becomes the burden of the small object sweep routine to clear
+objects. This has the advantage that we can easily recover from accidentally
+marking a free list, though that could also be handled by other means. The
+collector currently spends a fair amount of time clearing objects, and this
+approach should probably be revisited. In most configurations, we use
+specialized sweep routines to handle common small object sizes. Since
+we allocate one mark bit per word, it becomes easier to examine the relevant
+mark bits if the object size divides the word length evenly. We also suitably
+unroll the inner sweep loop in each case. (It is conceivable that
+profile-based procedure cloning in the compiler could make this unnecessary
+and counterproductive. I know of no existing compiler to which this applies.)
+
+The sweeping of small object pages could be avoided completely at the expense
+of examining mark bits directly in the allocator. This would probably be more
+expensive, since each allocation call would have to reload a large amount
+of state (e.g. next object address to be swept, position in mark bit table)
+before it could do its work. The current scheme keeps the allocator simple and
+allows useful optimizations in the sweeper.
+
+## Finalization
+
+Both `GC_register_disappearing_link` and `GC_register_finalizer` add the
+request to a corresponding hash table. The hash table is allocated out of
+collected memory, but the reference to the finalizable object is hidden from
+the collector. Currently finalization requests are processed non-incrementally
+at the end of a mark cycle.
+
+The collector makes an initial pass over the table of finalizable objects,
+pushing the contents of unmarked objects onto the mark stack. After pushing
+each object, the marker is invoked to mark all objects reachable from it. The
+object itself is not explicitly marked. This assures that objects on which
+a finalizer depends are neither collected nor finalized.
+
+If in the process of marking from an object the object itself becomes marked,
+we have uncovered a cycle involving the object. This usually results in
+a warning from the collector. Such objects are not finalized, since it may be
+unsafe to do so. See the more detailed discussion of
+[finalization semantics](finalization.md).
+
+Any objects remaining unmarked at the end of this process are added to a queue
+of objects whose finalizers can be run. Depending on collector configuration,
+finalizers are dequeued and run either implicitly during allocation calls,
+or explicitly in response to a user request. (Note that the former
+is unfortunately both the default and not generally safe. If finalizers
+perform synchronization, it may result in deadlocks. Nontrivial finalizers
+generally need to perform synchronization, and thus require a different
+collector configuration.)
+
+The collector provides a mechanism for replacing the procedure that is used
+to mark through objects. This is used both to provide support for Java-style
+unordered finalization, and to ignore certain kinds of cycles, e.g. those
+arising from C++ implementations of virtual inheritance.
+
+## Generational Collection and Dirty Bits
+
+We basically use the concurrent and generational GC algorithm described in
+["Mostly Parallel Garbage Collection"](http://www.hboehm.info/gc/papers/pldi91.ps.Z),
+by Boehm, Demers, and Shenker.
+
+The most significant modification is that the collector always starts running
+in the allocating thread. There is no separate garbage collector thread. (If
+parallel GC is enabled, helper threads may also be woken up.) If an allocation
+attempt either requests a large object, or encounters an empty small object
+free list, and notices that there is a collection in progress, it immediately
+performs a small amount of marking work as described above.
+
+This change was made both because we wanted to easily accommodate
+single-threaded environments, and because a separate GC thread requires very
+careful control over the scheduler to prevent the mutator from out-running the
+collector, and hence provoking unneeded heap growth.
+
+In incremental mode, the heap is always expanded when we encounter
+insufficient space for an allocation. Garbage collection is triggered whenever
+we notice that more than `GC_heap_size / 2 * GC_free_space_divisor` bytes
+of allocation have taken place. After `GC_full_freq` minor collections a major
+collection is started.
+
+All collections initially run uninterrupted until a predetermined amount
+of time (50 ms by default) has expired. If this allows the collection
+to complete entirely, we can avoid correcting for data structure modifications
+during the collection. If it does not complete, we return control to the
+mutator, and perform small amounts of additional GC work during those later
+allocations that cannot be satisfied from small object free lists. When
+marking completes, the set of modified pages is retrieved, and we mark once
+again from marked objects on those pages, this time with the mutator stopped.
+
+We keep track of modified pages using one of several distinct mechanisms:
+
+ * (`MPROTECT_VDB`) By write-protecting physical pages and catching write
+ faults. This is implemented for many Unix-like systems and for Win32. It is
+ not possible in a few environments.
+ * (`GWW_VDB`) By using the Win32 `GetWriteWatch` function to read dirty
+ bits.
+ * (`PROC_VDB`) By retrieving dirty bit information from /proc. (Currently
+ only Sun's Solaris supports this. Though this is considerably cleaner,
+ performance may actually be better with `mprotect` and signals.)
+ * (`SOFT_VDB`) By retrieving Linux soft-dirty bit information from /proc.
+ * (`PCR_VDB`) By relying on an external dirty bit implementation, in this
+ case the one in Xerox PCR.
+ * Through explicit mutator cooperation. This enabled by
+ `GC_set_manual_vdb_allowed(1)` call, and requires the client code to call
+ `GC_ptr_store_and_dirty` or `GC_end_stubborn_change` (followed by a number
+ of `GC_reachable_here` calls), and is rarely used.
+ * (`DEFAULT_VDB`) By treating all pages as dirty. This is the default
+ if none of the other techniques is known to be usable. (Practical only for
+ testing.)
+
+## Black-listing
+
+The collector implements _black-listing_ of pages, as described in
+["Space Efficient Conservative Collection", PLDI'93](http://dl.acm.org/citation.cfm?doid=155090.155109)
+by Boehm, also available
+[here](https://www.cs.rice.edu/~javaplt/311/Readings/pldi93.pdf).
+
+During the mark phase, the collector tracks _near misses_, i.e. attempts
+to follow a _pointer_ to just outside the garbage-collected heap, or to
+a currently unallocated page inside the heap. Pages that have been the targets
+of such near misses are likely to be the targets of misidentified _pointers_
+in the future. To minimize the future damage caused by such misidentification,
+they will be allocated only to small pointer-free objects.
+
+The collector understands two different kinds of black-listing. A page may be
+black listed for interior pointer references (`GC_add_to_black_list_stack`),
+if it was the target of a near miss from a location that requires interior
+pointer recognition, e.g. the stack, or the heap if `GC_all_interior_pointers`
+is set. In this case, we also avoid allocating large blocks that include this
+page.
+
+If the near miss came from a source that did not require interior pointer
+recognition, it is black-listed with `GC_add_to_black_list_normal`. A page
+black-listed in this way may appear inside a large object, so long as it is
+not the first page of a large object.
+
+The `GC_allochblk` routine respects black-listing when assigning a block to
+a particular object kind and size. It occasionally drops (i.e. allocates and
+forgets) blocks that are completely black-listed in order to avoid excessively
+long large block free lists containing only unusable blocks. This would
+otherwise become an issue if there is low demand for small pointer-free
+objects.
+
+## Thread support
+
+We support several different threading models. Unfortunately Pthreads, the
+only reasonably well standardized thread model, supports too narrow
+an interface for conservative garbage collection. There appears to be no
+completely portable way to allow the collector to coexist with various
+Pthreads implementations. Hence we currently support only the more common
+Pthreads implementations.
+
+In particular, it is very difficult for the collector to stop all other
+threads in the system and examine the register contents. This is currently
+accomplished with very different mechanisms for some Pthreads implementations.
+For Linux/HPUX/OSF1, Solaris and Irix it sends signals to individual Pthreads
+and has them wait in the signal handler.
+
+The Linux and Irix implementations use only documented Pthreads calls, but
+rely on extensions to their semantics. The Linux implementation
+`pthread_stop_world.c` relies on only very mild extensions to the pthreads
+semantics, and already supports a large number of other Unix-like pthreads
+implementations. Our goal is to make this the only pthread support in the
+collector.
+
+All implementations must intercept thread creation and a few other
+thread-specific calls to allow enumeration of threads and location of thread
+stacks. This is current accomplished with `#define`'s in `gc.h` (really
+`gc_pthread_redirects.h`), or optionally by using `ld`'s function call
+wrapping mechanism under Linux.
+
+The collector support several facilities to enhance the processor-scalability
+and thread performance of the collector. These are discussed in more detail
+[here](scale.md). We briefly outline the data approach to thread-local
+allocation in the next section.
+
+## Thread-local allocation
+
+If thread-local allocation is enabled (which is true in the default
+configuration for most supported platforms), the collector keeps separate
+arrays of free lists for each thread.
+
+The free list arrays associated with each thread are only used to satisfy
+requests for objects that are both very small, and belong to one of a small
+number of well-known kinds. These include _normal_, pointer-free, _gcj_ and
+_disclaim_ objects.
+
+Thread-local free list entries contain either a pointer to the first element
+of a free list, or they contain a counter of the number of allocation
+granules, corresponding to objects of this size, allocated so far. Initially
+they contain the value one, i.e. a small counter value.
+
+Thread-local allocation goes directly through the global allocator if the
+object is of a size or kind not covered by the local free lists.
+
+If there is an appropriate local free list, the allocator checks whether
+it contains a sufficiently small counter value. If so, the counter is simply
+incremented by a value, and the global allocator is used. In this way,
+the initial few allocations of a given size bypass the local allocator.
+A thread that only allocates a handful of objects of a given size will not
+build up its own free list for that size. This avoids wasting space for
+unpopular objects sizes or kinds.
+
+Once the counter passes a threshold, `GC_malloc_many` is called to allocate
+roughly `HBLKSIZE` space and put it on the corresponding local free list.
+Further allocations of that size and kind then use this free list, and no
+longer need to acquire the allocation lock. The allocation procedure
+is otherwise similar to the global free lists. The local free lists are also
+linked using the first word in the object. In most cases this means they
+require considerably less time.
+
+Local free lists are treated by most of the rest of the collector as though
+they were in-use reachable data. This requires some care, since pointer-free
+objects are not normally traced, and hence a special tracing procedure
+is required to mark all objects on pointer-free and gcj local free lists.
+
+On thread exit, any remaining thread-local free list entries are transferred
+back to the global free list.
+
+Note that if the collector is configured for thread-local allocation (the
+default for most platforms), `GC_malloc` and friends only use thread-local
+allocation.
+
+For some more details see [here](scale.md), and the technical report entitled
+["Fast Multiprocessor Memory Allocation and Garbage Collection"](http://www.hpl.hp.com/techreports/2000/HPL-2000-165.html).
diff --git a/graphics/asymptote/gc/doc/gcinterface.md b/graphics/asymptote/gc/doc/gcinterface.md
new file mode 100644
index 0000000000..8247ba2264
--- /dev/null
+++ b/graphics/asymptote/gc/doc/gcinterface.md
@@ -0,0 +1,216 @@
+# C/C++ Interface
+
+On many platforms, a single-threaded garbage collector library can be built
+to act as a plug-in `malloc` replacement. (Build it with
+`-DREDIRECT_MALLOC=GC_malloc -DIGNORE_FREE`.) This is often the best way to
+deal with third-party libraries which leak or prematurely free objects.
+`-DREDIRECT_MALLOC=GC_malloc` is intended primarily as an easy way to adapt
+old code, not for new development.
+
+New code should use the interface discussed below.
+
+Code must be linked against the GC library. On most UNIX platforms, depending
+on how the collector is built, this will be `gc.a` or `libgc.{a,so}`.
+
+The following describes the standard C interface to the garbage collector.
+It is not a complete definition of the interface. It describes only the most
+commonly used functionality, approximately in decreasing order of frequency
+of use. This somewhat duplicates the information in `gc.man` file. The full
+interface is described in `gc.h` file.
+
+Clients should include `gc.h` (i.e., not `gc_config_macros.h`,
+`gc_pthread_redirects.h`, `gc_version.h`). In the case of multi-threaded code,
+`gc.h` should be included after the threads header file, and after defining
+`GC_THREADS` macro. The header file `gc.h` must be included in files that use
+either GC or threads primitives, since threads primitives will be redefined
+to cooperate with the GC on many platforms.
+
+Thread users should also be aware that on many platforms objects reachable
+only from thread-local variables may be prematurely reclaimed. Thus objects
+pointed to by thread-local variables should also be pointed to by a globally
+visible data area, e.g. thread's stack. (This behavior is viewed as a bug, but
+as one that is exceedingly hard to fix without some `libc` hooks.)
+
+`void * GC_MALLOC(size_t _bytes_)` - Allocates and clears _bytes_
+of storage. Requires (amortized) time proportional to _bytes_. The resulting
+object will be automatically deallocated when unreferenced. References from
+objects allocated with the system malloc are usually not considered by the
+collector. (See `GC_MALLOC_UNCOLLECTABLE`, however. Building the collector
+with `-DREDIRECT_MALLOC=GC_malloc_uncollectable` is often a way around this.)
+`GC_MALLOC` is a macro which invokes `GC_malloc` by default or, if `GC_DEBUG`
+is defined before `gc.h` is included, a debugging version that checks
+occasionally for overwrite errors, and the like.
+
+`void * GC_MALLOC_ATOMIC(size_t _bytes_)` - Allocates _bytes_
+of storage. Requires (amortized) time proportional to _bytes_. The resulting
+object will be automatically deallocated when unreferenced. The client
+promises that the resulting object will never contain any pointers. The memory
+is not cleared. This is the preferred way to allocate strings, floating point
+arrays, bitmaps, etc. More precise information about pointer locations can be
+communicated to the collector using the interface in `gc_typed.h`.
+
+`void * GC_MALLOC_UNCOLLECTABLE(size_t _bytes_)` - Identical
+to `GC_MALLOC`, except that the resulting object is not automatically
+deallocated. Unlike the system-provided `malloc`, the collector does scan the
+object for pointers to garbage-collectible memory, even if the block itself
+does not appear to be reachable. (Objects allocated in this way are
+effectively treated as roots by the collector.)
+
+`void * GC_REALLOC(void * _old_object_, size_t _new_bytes_)` - Allocates
+a new object of the indicated size and copy the old object's content into the
+new object. The old object is reused in place if convenient. If the original
+object was allocated with `GC_MALLOC_ATOMIC`, the new object is subject to the
+same constraints. If it was allocated as an uncollectible object, then the new
+object is uncollectible, and the old object (if different) is deallocated.
+
+`void GC_FREE(void * _object_)` - Explicitly deallocates an _object_.
+Typically not useful for small collectible objects.
+
+`void * GC_MALLOC_IGNORE_OFF_PAGE(size_t _bytes_)` and
+`void * GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(size_t _bytes_)` - Analogous
+to `GC_MALLOC` and `GC_MALLOC_ATOMIC`, respectively, except that the client
+guarantees that as long as the resulting object is of use, a pointer
+is maintained to someplace inside the first heap block (hblk) of the object.
+This pointer should be declared volatile to avoid interference from compiler
+optimizations. (Other nonvolatile pointers to the object may exist as well.)
+This is the preferred way to allocate objects that are likely to be
+more than 100 KB in size. It greatly reduces the risk that such objects will
+be accidentally retained when they are no longer needed. Thus space usage may
+be significantly reduced. Another way is `GC_set_all_interior_pointers(0)`
+called at program start (this, however, is generally not suitable for C++ code
+because of multiple inheritance).
+
+`void GC_INIT()` - On some platforms, it is necessary to invoke this _from
+the main executable_, _not from a dynamic library_, before the initial
+invocation of a GC routine. It is recommended that this be done in portable
+code, though we try to ensure that it expands to a no-op on as many platforms
+as possible.
+
+`void GC_gcollect(void)` - Explicitly forces a garbage collection.
+
+`void GC_enable_incremental(void)` - Causes the garbage collector
+to perform a small amount of work every few invocations of `GC_MALLOC` or the
+like, instead of performing an entire collection at once. This is likely
+to increase total running time. It will improve response on a platform that
+has suitable support in the garbage collector (Linux and most Unix versions,
+Win32 if the collector was suitably built). On many platforms this interacts
+poorly with system calls that write to the garbage collected heap.
+
+`void GC_set_warn_proc(GC_warn_proc)` - Replaces the default procedure
+used by the collector to print warnings. The collector may otherwise
+write to `stderr`, most commonly because `GC_malloc` was used in a situation
+in which `GC_malloc_ignore_off_page` would have been more appropriate. See
+`gc.h` for details.
+
+`void GC_REGISTER_FINALIZER(...)` - Registers a function to be called when
+an object becomes inaccessible. This is often useful as a backup method for
+releasing system resources (e.g. closing files) when the object referencing
+them becomes inaccessible. It is not an acceptable method to perform actions
+that must be performed in a timely fashion. See `gc.h` for details of the
+interface. See also [here](finalization.md) for a more detailed discussion
+of the design. Note that an object may become inaccessible before client code
+is done operating on objects referenced by its fields. Suitable
+synchronization is usually required. See
+[here](http://portal.acm.org/citation.cfm?doid=604131.604153) or
+[here](http://www.hpl.hp.com/techreports/2002/HPL-2002-335.html) for details.
+
+If you are concerned with multiprocessor performance and scalability, you
+should consider enabling and using thread local allocation.
+
+If your platform supports it, you should also build the collector with
+parallel marking support (`-DPARALLEL_MARK`); configure has it on by default.
+
+If the collector is used in an environment in which pointer location
+information for heap objects is easily available, this can be passed on to the
+collector using the interfaces in either `gc_typed.h` or `gc_gcj.h`.
+
+The collector distribution also includes a **string package** that takes
+advantage of the collector. For details see `cord.h` file.
+
+## C++ Interface
+
+The C++ interface is implemented as a thin layer on the C interface.
+Unfortunately, this thin layer appears to be very sensitive to variations
+in C++ implementations, particularly since it tries to replace the global
+`::new` operator, something that appears to not be well-standardized. Your
+platform may need minor adjustments in this layer (`gc_badalc.cc`,
+`gc_cpp.cc`, `gc_cpp.h`, and possibly `gc_allocator.h`). Such changes do not
+require understanding of collector internals, though they may require a good
+understanding of your platform. (Patches enhancing portability are welcome.
+But it is easy to break one platform by fixing another.)
+
+Usage of the collector from C++ is also complicated by the fact that there are
+many _standard_ ways to allocate memory in C++. The default `::new` operator,
+default `malloc`, and default STL allocators allocate memory that is not
+garbage collected, and is not normally _traced_ by the collector. This means
+that any pointers in memory allocated by these default allocators will not be
+seen by the collector. Garbage-collectible memory referenced only by pointers
+stored in such default-allocated objects is likely to be reclaimed prematurely
+by the collector.
+
+It is the programmers responsibility to ensure that garbage-collectible memory
+is referenced by pointers stored in one of
+
+ * Program variables
+ * Garbage-collected objects
+ * Uncollected but _traceable_ objects
+
+Traceable objects are not necessarily reclaimed by the collector, but are
+scanned for pointers to collectible objects. They are usually allocated
+by `GC_MALLOC_UNCOLLECTABLE`, as described above, and through some interfaces
+described below.
+
+On most platforms, the collector may not trace correctly from in-flight
+exception objects. Thus objects thrown as exceptions should only point
+to otherwise reachable memory. This is another bug whose proper repair
+requires platform hooks.
+
+The easiest way to ensure that collectible objects are properly referenced
+is to allocate only collectible objects. This requires that every allocation
+go through one of the following interfaces, each one of which replaces
+a standard C++ allocation mechanism. Note that this requires that all STL
+containers be explicitly instantiated with `gc_allocator`.
+
+### STL allocators
+
+Recent versions of the collector include a hopefully standard-conforming
+allocator implementation in `gc_allocator.h`. It defines `traceable_allocator`
+and `gc_allocator` which may be used either directly to allocate memory or to
+instantiate container templates. The former allocates uncollectible but traced
+memory. The latter allocates garbage-collected memory.
+
+These should work with any fully standard-conforming C++ compiler.
+
+### Class inheritance based interface for new-based allocation
+
+Users may include `gc_cpp.h` and then cause members of classes to be allocated
+in garbage collectible memory by having those classes inherit from class `gc`.
+For details see `gc_cpp.h` file.
+
+Linking against `gccpp` in addition to the `gc` library overrides `::new`
+(and friends) to allocate traceable but uncollectible memory, making
+it safe to refer to collectible objects from the resulting memory.
+
+If the user includes `gc_cpp.h` but `::new` should not be overridden then
+`gctba` (in addition to the `gc`) library should be linked with to provide
+the definition of `GC_throw_bad_alloc` C++ function used by operator `new` of
+class `gc`. Alternatively, the client may define `GC_NEW_ABORTS_ON_OOM` macro
+before include of `gc_cpp.h` (this instructs `::new` to issue an abort instead
+of throwing an exception), or may define `GC_INCLUDE_NEW` one before include
+of `gc_cpp.h` (however, this might not compile or work as expected on some
+platforms).
+
+## C interface
+
+It is also possible to use the C interface from `gc.h` directly. On platforms
+which use `malloc` to implement `::new`, it should usually be possible to use
+a version of the collector that has been compiled as a `malloc` replacement.
+It is also possible to replace `::new` and other allocation functions
+suitably, as is done by `gccpp`.
+
+Note that user-implemented small-block allocation often works poorly with
+an underlying garbage-collected large block allocator, since the collector has
+to view all objects accessible from the user's free list as reachable. This
+is likely to cause problems if `GC_MALLOC` is used with something like the
+original HP version of STL. This approach works well with the SGI versions
+of the STL only if the `malloc_alloc` allocator is used.
diff --git a/graphics/asymptote/gc/doc/leak.md b/graphics/asymptote/gc/doc/leak.md
new file mode 100644
index 0000000000..6b5ed22666
--- /dev/null
+++ b/graphics/asymptote/gc/doc/leak.md
@@ -0,0 +1,160 @@
+# Using the Garbage Collector as Leak Detector
+
+The garbage collector may be used as a leak detector. In this case, the
+primary function of the collector is to report objects that were allocated
+(typically with `GC_MALLOC`), not deallocated (normally with `GC_FREE`), but
+are no longer accessible. Since the object is no longer accessible, there
+is normally no way to deallocate the object at a later time; thus it can
+safely be assumed that the object has been "leaked".
+
+This is substantially different from counting leak detectors, which simply
+verify that all allocated objects are eventually deallocated.
+A garbage-collector based leak detector can provide somewhat more precise
+information when an object was leaked. More importantly, it does not report
+objects that are never deallocated because they are part of "permanent" data
+structures. Thus it does not require all objects to be deallocated at process
+exit time, a potentially useless activity that often triggers large amounts
+of paging.
+
+The garbage collector provides leak detection support. This includes the
+following features:
+
+ 1. Leak detection mode can be initiated at run-time by `GC_set_find_leak(1)`
+ call at program startup instead of building the collector with `FIND_LEAK`
+ macro defined.
+ 2. Leaked objects should be reported and then correctly garbage collected.
+
+To use the collector as a leak detector, do the following steps:
+
+ 1. Activate the leak detection mode as described above.
+ 2. Change the program so that all allocation and deallocation goes through
+ the garbage collector.
+ 3. Arrange to call `GC_gcollect` (or `CHECK_LEAKS()`) at appropriate points
+ to check for leaks. (This happens implicitly but probably not with
+ a sufficient frequency for long running programs.)
+
+The second step can usually be accomplished with the
+`-DREDIRECT_MALLOC=GC_malloc` option when the collector is built, or by
+defining `malloc`, `calloc`, `realloc`, `free` (as well as `strdup`,
+`strndup`, `wcsdup`, `memalign`, `posix_memalign`) to call the corresponding
+garbage collector functions. But this, by itself, will not yield very
+informative diagnostics, since the collector does not keep track of the
+information about how objects were allocated. The error reports will include
+only object addresses.
+
+For more precise error reports, as much of the program as possible should use
+the all uppercase variants of these functions, after defining `GC_DEBUG`, and
+then including `gc.h`. In this environment `GC_MALLOC` is a macro which causes
+at least the file name and line number at the allocation point to be saved
+as part of the object. Leak reports will then also include this information.
+
+Many collector features (e.g. finalization and disappearing links) are less
+useful in this context, and are not fully supported. Their use will usually
+generate additional bogus leak reports, since the collector itself drops some
+associated objects.
+
+The same is generally true of thread support. However, the correct leak
+reports should be generated with linuxthreads, at least.
+
+On a few platforms (currently Solaris/SPARC, Irix, and, with
+`-DSAVE_CALL_CHAIN`, Linux/x86), `GC_MALLOC` also causes some more information
+about its call stack to be saved in the object. Such information is reproduced
+in the error reports in very non-symbolic form, but it can be very useful with
+the aid of a debugger.
+
+## An Example
+
+The `leak_detector.h` file is included in the "include" subdirectory of the
+distribution.
+
+Assume the collector has been built with `-DFIND_LEAK` or
+`GC_set_find_leak(1)` exists as the first statement in `main`.
+
+The program to be tested for leaks could look like `tests/leak_test.c` file
+of the distribution.
+
+On a Linux/x86 system this produces on the stderr stream:
+
+
+ Found 1 leaked objects:
+ 0x806dff0 (tests/leak_test.c:19, sz=4, NORMAL)
+
+
+(On most unmentioned operating systems, the output is similar to this. If the
+collector had been built on Linux/x86 with `-DSAVE_CALL_CHAIN`, the output
+would be closer to the Solaris example. For this to work, the program should
+not be compiled with `-fomit_frame_pointer`.)
+
+On Irix it reports:
+
+
+ Found 1 leaked objects:
+ 0x10040fe0 (tests/leak_test.c:19, sz=4, NORMAL)
+ Caller at allocation:
+ ##PC##= 0x10004910
+
+
+and on Solaris the error report is:
+
+
+ Found 1 leaked objects:
+ 0xef621fc8 (tests/leak_test.c:19, sz=4, NORMAL)
+ Call chain at allocation:
+ args: 4 (0x4), 200656 (0x30FD0)
+ ##PC##= 0x14ADC
+ args: 1 (0x1), -268436012 (0xEFFFFDD4)
+ ##PC##= 0x14A64
+
+
+In the latter two cases some additional information is given about how malloc
+was called when the leaked object was allocated. For Solaris, the first line
+specifies the arguments to `GC_debug_malloc` (the actual allocation routine),
+The second one specifies the program counter inside `main`, the third one
+specifies the arguments to `main`, and, finally, the program counter inside
+the caller to `main` (i.e. in the C startup code). In the Irix case, only the
+address inside the caller to `main` is given.
+
+In many cases, a debugger is needed to interpret the additional information.
+On systems supporting the `adb` debugger, the `tools/callprocs.sh` script can
+be used to replace program counter values with symbolic names. The collector
+tries to generate symbolic names for call stacks if it knows how to do so on
+the platform. This is true on Linux/x86, but not on most other platforms.
+
+## Simplified leak detection under Linux
+
+It should be possible to run the collector in the leak detection mode on
+a program a.out under Linux/x86 as follows:
+
+ 1. If possible, ensure that a.out is a single-threaded executable. On some
+ platforms this does not work at all for the multi-threaded programs.
+ 2. If possible, ensure that the `addr2line` program is installed
+ in `/usr/bin`. (It comes with most Linux distributions.)
+ 3. If possible, compile your program, which we'll call `a.out`, with full
+ debug information. This will improve the quality of the leak reports.
+ With this approach, it is no longer necessary to call `GC_` routines
+ explicitly, though that can also improve the quality of the leak reports.
+ 4. Build the collector and install it in directory _foo_ as follows (it may
+ be safe to omit the `--disable-threads` option on Linux, but the combination
+ of thread support and `malloc` replacement is not yet rock solid):
+
+ - `configure --prefix=_foo_ --enable-gc-debug --enable-redirect-malloc --disable-threads`
+ - `make`
+ - `make install`
+
+ 5. Set environment variables as follows (the last two are optional, just to
+ confirm the collector is running, and to facilitate debugging from another
+ console window if something goes wrong, respectively):
+
+ - `LD_PRELOAD=_foo_/lib/libgc.so`
+ - `GC_FIND_LEAK`
+ - `GC_PRINT_STATS`
+ - `GC_LOOP_ON_ABORT`
+
+ 6. Simply run `a.out` as you normally would. Note that if you run anything
+ else (e.g. your editor) with those environment variables set, it will also
+ be leak tested. This may or may not be useful and/or embarrassing. It can
+ generate mountains of leak reports if the application was not designed
+ to avoid leaks, e.g. because it's always short-lived.
+
+This has not yet been thoroughly tested on large applications, but it's known
+to do the right thing on at least some small ones.
diff --git a/graphics/asymptote/gc/doc/overview.md b/graphics/asymptote/gc/doc/overview.md
new file mode 100644
index 0000000000..465e2e0075
--- /dev/null
+++ b/graphics/asymptote/gc/doc/overview.md
@@ -0,0 +1,311 @@
+[Interface Overview](gcinterface.md) | [Tutorial Slides](http://www.hboehm.info/gc/04tutorial.pdf) | [FAQ](http://www.hboehm.info/gc/faq.html) | [Example](simple_example.md) | [Download](https://github.com/ivmai/bdwgc/wiki/Download) | [License](http://www.hboehm.info/gc/license.txt)
+---|---|---|---|---|---
+
+# A garbage collector for C and C++
+
+ * Platforms
+ * Some collector details
+ * Further reading
+ * Information provided on the BDWGC site
+ * More background information
+ * Contacts and new release announcements
+
+[ This is an updated version of the page formerly at
+`www.hpl.hp.com/personal/Hans_Boehm/gc/`, before that at
+`http://reality.sgi.com/boehm/gc.html` and before that at
+`ftp://ftp.parc.xerox.com/pub/gc/gc.html`. ]
+
+The
+[Boehm](http://www.hboehm.info)-[Demers](http://www.cs.cornell.edu/annual_report/00-01/bios.htm#demers)-[Weiser](http://www.ubiq.com/hypertext/weiser/weiser.html)
+conservative Garbage Collector (**BDWGC**) can be used as a garbage collecting
+replacement for C `malloc` or C++ `new`. It allows you to allocate memory
+basically as you normally would, without explicitly deallocating memory that
+is no longer useful. The collector automatically recycles memory when
+it determines that it can no longer be otherwise accessed. A simple example
+of such a use is given [here](simple_example.md).
+
+The collector is also used by a number of programming language implementations
+that either use C as intermediate code, want to facilitate easier
+interoperation with C libraries, or just prefer the simple collector
+interface. For a more detailed description of the interface, see
+[here](gcinterface.md).
+
+Alternatively, the garbage collector may be used as a [leak detector](leak.md)
+for C or C++ programs, though that is not its primary goal.
+
+Typically several versions are offered for
+[downloading](https://github.com/ivmai/bdwgc/wiki/Download): preview, stable,
+legacy. Usually you should use the one marked as the _latest stable_ release.
+Preview versions may contain additional features, platform support, but are
+likely to be less well tested. The list of changes for each version
+is specified on the [releases](https://github.com/ivmai/bdwgc/releases) page.
+The development version (snapshot) is available in the master branch of
+[bdwgc git](https://github.com/ivmai/bdwgc) repository on GitHub.
+
+The arguments for and against conservative garbage collection in C and C++ are
+briefly discussed [here](http://www.hboehm.info/gc/issues.html). The
+beginnings of a frequently-asked-questions list are
+[here](http://www.hboehm.info/gc/faq.html).
+
+The garbage collector code is copyrighted by
+[Hans-J. Boehm](http://www.hboehm.info), Alan J. Demers,
+[Xerox Corporation](http://www.xerox.com/),
+[Silicon Graphics](http://www.sgi.com/),
+[Hewlett-Packard Company](http://www.hp.com/),
+[Ivan Maidanski](https://github.com/ivmai), and partially by some others.
+It may be used and copied without payment of a fee under minimal restrictions.
+See the README.md file in the distribution or the
+[license](http://www.hboehm.info/gc/license.txt) for more details.
+**IT IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED OR IMPLIED.
+ANY USE IS AT YOUR OWN RISK.**
+
+Empirically, this collector works with most unmodified C programs, simply
+by replacing `malloc` and `calloc` with `GC_malloc` calls, replacing `realloc`
+with `GC_realloc` calls, and removing `free` calls. Exceptions are discussed
+[here](http://www.hboehm.info/gc/issues.html).
+
+## Platforms
+
+The collector is not completely portable, but the distribution includes ports
+to most standard PC and UNIX/Linux platforms. The collector should work
+on Linux, Android, BSD variants, OS/2, Windows (Win32 and Win64), MacOS X,
+iOS, HP/UX, Solaris, Tru64, Irix, Symbian and other operating systems. Some
+platforms are more polished (better supported) than others.
+
+Irix pthreads, Linux threads, Windows threads, Solaris threads (pthreads
+only), HP/UX 11 pthreads, Tru64 pthreads, and MacOS X threads are supported.
+
+## Some Collector Details
+
+The collector uses a [mark-sweep](http://www.hboehm.info/gc/complexity.html)
+algorithm. It provides incremental and generational collection under operating
+systems which provide the right kind of virtual memory support. (Currently
+this includes SunOS[45], IRIX, OSF/1, Linux, and Windows, with varying
+restrictions.) It allows [finalization](finalization.md) code to be invoked
+when an object is collected. It can take advantage of type information
+to locate pointers if such information is provided, but it is usually used
+without such information. See the README and `gc.h` files in the distribution
+for more details.
+
+For an overview of the implementation, see [here](gcdescr.md).
+
+The garbage collector distribution includes a C string (`cord.h`) package that
+provides for fast concatenation and substring operations on long strings.
+A simple curses- and Windows-based editor that represents the entire file as
+a cord is included as a sample application.
+
+Performance of the non-incremental collector is typically competitive with
+`malloc`/`free` implementations. Both space and time overhead are likely to be
+only slightly higher for programs written for `malloc`/`free` (see Detlefs,
+Dosser and Zorn's
+[Memory Allocation Costs in Large C and C++ Programs](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.30.3073&rep=rep1&type=ps)).
+For programs allocating primarily very small objects, the collector may be
+faster; for programs allocating primarily large objects it will be slower.
+If the collector is used in a multi-threaded environment and configured for
+thread-local allocation, it may in some cases significantly outperform
+`malloc`/`free` allocation in time.
+
+We also expect that in many cases any additional overhead will be more than
+compensated for by e.g. decreased copying if programs are written and tuned
+for garbage collection.
+
+## Further reading
+
+**The beginnings of a frequently asked questions list for this collector are
+[here](http://www.hboehm.info/gc/faq.html).**
+
+**The following provide information on garbage collection in general:**
+
+Paul Wilson's
+[garbage collection ftp archive](ftp://ftp.cs.utexas.edu/pub/garbage)
+and [GC survey](ftp://ftp.cs.utexas.edu/pub/garbage/gcsurvey.ps).
+
+The Ravenbrook
+[Memory Management Reference](http://www.memorymanagement.org/).
+
+David Chase's [GC FAQ](http://www.iecc.com/gclist/GC-faq.html).
+
+Richard Jones'
+[Garbage Collection Page](https://www.cs.kent.ac.uk/people/staff/rej/gc.html)
+and his [book](http://www.cs.kent.ac.uk/people/staff/rej/gcbook/gcbook.html).
+
+**The following papers describe the collector algorithms we use and the
+underlying design decisions at a higher level:**
+
+(Some of the lower level details can be found [here](gcdescr.md).)
+
+The first one is not available electronically due to copyright considerations.
+Most of the others are subject to ACM copyright.
+
+Boehm, H., Dynamic Memory Allocation and Garbage Collection,
+_Computers in Physics 9_, 3, May/June 1995, pp. 297-303. This is directed
+at an otherwise sophisticated audience unfamiliar with memory allocation
+issues. The algorithmic details differ from those in the implementation. There
+is a related letter to the editor and a minor correction in the next issue.
+
+Boehm, H., and [M. Weiser](http://www.ubiq.com/hypertext/weiser/weiser.html),
+[Garbage Collection in an Uncooperative Environment](http://www.hboehm.info/spe_gc_paper/),
+_Software Practice and Experience_, September 1988, pp. 807-820.
+
+Boehm, H., A. Demers, and S. Shenker,
+[Mostly Parallel Garbage Collection](http://www.hboehm.info/gc/papers/pldi91.ps.Z),
+Proceedings of the ACM SIGPLAN '91 Conference on Programming Language Design
+and Implementation, _SIGPLAN Notices 26_, 6 (June 1991), pp. 157-164.
+
+Boehm, H.,
+[Space Efficient Conservative Garbage Collection](http://www.hboehm.info/gc/papers/pldi93.ps.Z),
+Proceedings of the ACM SIGPLAN '93 Conference on Programming Language Design
+and Implementation, _SIGPLAN Notices 28_, 6 (June 1993), pp. 197-206.
+
+Boehm, H., Reducing Garbage Collector Cache Misses,
+_Proceedings of the 2000 International Symposium on Memory Management_.
+[Official version](http://portal.acm.org/citation.cfm?doid=362422.362438).
+[Technical report](http://www.hpl.hp.com/techreports/2000/HPL-2000-99.html)
+version. Describes the prefetch strategy incorporated into the collector for
+some platforms. Explains why the sweep phase of a _mark-sweep_ collector
+should not really be a distinct phase.
+
+M. Serrano, H. Boehm, Understanding Memory Allocation of Scheme Programs,
+_Proceedings of the Fifth ACM SIGPLAN International Conference on Functional
+Programming_, 2000, Montreal, Canada, pp. 245-256.
+[Official version](http://dl.acm.org/citation.cfm?id=351264). Earlier
+[Technical Report](http://www.hpl.hp.com/techreports/2000/HPL-2000-62.html)
+version. Includes some discussion of the collector debugging facilities for
+identifying causes of memory retention.
+
+Boehm, H., Fast Multiprocessor Memory Allocation and Garbage Collection,
+[HP Labs Technical Report HPL 2000-165](http://www.hpl.hp.com/techreports/2000/HPL-2000-165.html).
+Discusses the parallel collection algorithms, and presents some performance
+results.
+
+Boehm, H., Bounding Space Usage of Conservative Garbage Collectors,
+_Proceedings of the 2002 ACM SIGPLAN-SIGACT Symposium on Principles
+of Programming Languages_, Jan. 2002, pp. 93-100.
+[Official version](http://portal.acm.org/citation.cfm?doid=503272.503282).
+[Technical report](http://www.hpl.hp.com/techreports/2001/HPL-2001-251.html)
+version. Includes a discussion of a collector facility to much more reliably
+test for the potential of unbounded heap growth.
+
+**The following papers discuss language and compiler restrictions necessary
+to guaranteed safety of conservative garbage collection:**
+
+We thank John Levine and JCLT for allowing us to make the second paper
+available electronically, and providing PostScript for the final version.
+
+Boehm, H.,
+[Simple Garbage-Collector-Safety](http://www.hboehm.info/gc/papers/pldi96.ps.gz),
+Proceedings of the ACM SIGPLAN '96 Conference on Programming Language Design
+and Implementation.
+
+Boehm, H., and D. Chase,
+[A Proposal for Garbage-Collector-Safe C Compilation](http://www.hboehm.info/gc/papers/boecha.ps.gz),
+_Journal of C Language Translation 4_, 2 (December 1992), pp. 126-141.
+
+**Other related information:**
+
+The Detlefs, Dosser and Zorn's
+[Memory Allocation Costs in Large C and C++ Programs](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.30.3073&rep=rep1&type=ps).
+This is a performance comparison of the Boehm-Demers-Weiser collector
+to `malloc`/`free`, using programs written for `malloc`/`free`.
+
+Joel Bartlett's
+[mostly copying conservative garbage collector for C++](ftp://gatekeeper.dec.com/pub/compaq/WRL/research-reports/WRL-TN-12.ps).
+
+John Ellis and David Detlef's
+[Safe Efficient Garbage Collection for C++](http://dl.acm.org/citation.cfm?id=1267983)
+proposal.
+
+Henry Baker's [paper collection](http://home.pipeline.com/%7Ehbaker1/).
+
+Slides for Hans Boehm's
+[Allocation and GC Myths](http://www.hboehm.info/gc/myths.ps) talk.
+
+## Information provided on the BDWGC site
+
+[Current users](https://github.com/ivmai/bdwgc/wiki/Known-clients) (the list
+may be rather outdated).
+
+[A simple illustration of how to build and use the collector](simple_example.md).
+
+[Description of alternate interfaces to the garbage collector](gcinterface.md).
+
+[Slides from an ISMM 2004 tutorial about the GC](http://www.hboehm.info/gc/04tutorial.pdf).
+
+[A FAQ (frequently asked questions) list](http://www.hboehm.info/gc/faq.html).
+
+[How to use the garbage collector as a leak detector](leak.md).
+
+[Some hints on debugging garbage collected applications](debugging.md).
+
+[An overview of the implementation of the garbage collector](gcdescr.md).
+
+[The data structure used for fast pointer lookups](tree.md).
+
+[Scalability of the collector to multiprocessors](scale.md).
+
+[Directory](http://www.hboehm.info/gc/gc_source/) containing the distribution
+files of all garbage collector releases. It duplicates
+[Download](https://github.com/ivmai/bdwgc/wiki/Download) page on GitHub.
+
+## More background information
+
+[An attempt to establish a bound on space usage of conservative garbage collectors](http://www.hboehm.info/gc/bounds.html).
+
+[Mark-sweep versus copying garbage collectors and their complexity](http://www.hboehm.info/gc/complexity.html).
+
+[Pros and cons of conservative garbage collectors, in comparison to other collectors](http://www.hboehm.info/gc/conservative.html).
+
+[Issues related to garbage collection vs. manual memory management in C/C++](http://www.hboehm.info/gc/issues.html).
+
+[An example of a case in which garbage collection results in a much faster implementation as a result of reduced synchronization](http://www.hboehm.info/gc/example.html).
+
+[Slide set discussing performance of nonmoving garbage collectors](http://www.hboehm.info/gc/nonmoving/).
+
+[Slide set discussing _Destructors, Finalizers, and Synchronization_, POPL 2003](http://www.hboehm.info/popl03/web/).
+
+[Paper corresponding to above slide set](http://portal.acm.org/citation.cfm?doid=604131.604153)
+([Technical Report](http://www.hpl.hp.com/techreports/2002/HPL-2002-335.html)
+version).
+
+[A Java/Scheme/C/C++ garbage collection benchmark](http://www.hboehm.info/gc/gc_bench/).
+
+[Slides for talk on memory allocation myths](http://www.hboehm.info/gc/myths.ps).
+
+[Slides for OOPSLA 98 garbage collection talk](http://www.hboehm.info/gc/gctalk.ps).
+
+[Related papers](http://www.hboehm.info/gc/papers/).
+
+## Contacts and new release announcements
+
+GitHub and Stack Overflow are the major two places for communication.
+
+Technical questions (how to, how does it work, etc.) should be posted
+to [Stack Overflow](https://stackoverflow.com/questions/tagged/boehm-gc) with
+_boehm-gc_ tag.
+
+To contribute, please rebase your code to the latest
+[master](https://github.com/ivmai/bdwgc/tree/master/) and submit
+a [pull request](https://github.com/ivmai/bdwgc/pulls) to GitHub.
+
+To report a bug, or propose (request) a new feature, create
+a [GitHub issue](https://github.com/ivmai/bdwgc/issues). Please make sure
+it has not been reported yet by someone else.
+
+To receive notifications on every release, please subscribe to
+[Releases RSS feed](https://github.com/ivmai/bdwgc/releases.atom).
+Notifications on all issues and pull requests are available
+by [watching](https://github.com/ivmai/bdwgc/watchers) the project.
+
+Mailing lists (bdwgc-announce@lists.opendylan.org, bdwgc@lists.opendylan.org,
+and the former gc-announce@linux.hpl.hp.com and gc@linux.hpl.hp.com) are not
+used at this moment. Their content is available
+in
+[bdwgc-announce](https://github.com/ivmai/bdwgc/files/1037650/bdwgc-announce-mailing-list-archive-2014_02.tar.gz)
+and
+[bdwgc](https://github.com/ivmai/bdwgc/files/1038163/bdwgc-mailing-list-archive-2017_04.tar.gz)
+archive files, respectively. The gc list archive may also be read
+at [Narkive](http://bdwgc.opendylan.narkive.com).
+
+Some prior discussion of the collector has taken place on the gcc java mailing
+list, whose archives appear [here](http://gcc.gnu.org/ml/java/), and also
+on [gclist@iecc.com](http://lists.tunes.org/mailman/listinfo/gclist).
diff --git a/graphics/asymptote/gc/doc/porting.md b/graphics/asymptote/gc/doc/porting.md
new file mode 100644
index 0000000000..6025e53fcf
--- /dev/null
+++ b/graphics/asymptote/gc/doc/porting.md
@@ -0,0 +1,263 @@
+# Conservative Garbage Collector Porting Directions
+
+The collector is designed to be relatively easy to port, but is not portable
+code per se. The collector inherently has to perform operations, such
+as scanning the stack(s), that are not possible in portable C code.
+
+All of the following assumes that the collector is being ported to
+a byte-addressable 32- or 64-bit machine. Currently all successful ports
+to 64-bit machines involve LP64 and LLP64 targets (notably Win64). You
+are hereby discouraged from attempting a port to non-byte-addressable,
+or 8-bit, or 16-bit machines.
+
+The difficulty of porting the collector varies greatly depending on the needed
+functionality. In the simplest case, only some small additions are needed for
+the `include/private/gcconfig.h` file. This is described in the following
+section. Later sections discuss some of the optional features, which typically
+involve more porting effort.
+
+Note that the collector makes heavy use of `ifdef`s. Unlike some other
+software projects, we have concluded repeatedly that this is preferable
+to system dependent files, with code duplicated between the files. However,
+to keep this manageable, we do strongly believe in indenting `ifdef`s
+correctly (for historical reasons usually without the leading sharp sign).
+(Separate source files are of course fine if they do not result in code
+duplication.)
+
+## Adding Platforms to gcconfig.h
+
+If neither thread support, nor tracing of dynamic library data is required,
+these are often the only changes you will need to make.
+
+The `gcconfig.h` file consists of three sections:
+
+ 1. A section that defines GC-internal macros that identify the architecture
+ (e.g. `IA64` or `I386`) and operating system (e.g. `LINUX` or `MSWIN32`).
+ This is usually done by testing predefined macros. By defining our own
+ macros instead of using the predefined ones directly, we can impose a bit
+ more consistency, and somewhat isolate ourselves from compiler differences.
+ It is relatively straightforward to add a new entry here. But please try
+ to be consistent with the existing code. In particular, 64-bit variants
+ of 32-bit architectures general are _not_ treated as a new architecture.
+ Instead we explicitly test for 64-bit-ness in the few places in which
+ it matters. (The notable exception here is `I386` and `X86_64`. This
+ is partially historical, and partially justified by the fact that there are
+ arguably more substantial architecture and ABI differences here than for
+ RISC variants.) On GNU-based systems, `cpp -dM empty_source_file.c` seems
+ to generate a set of predefined macros. On some other systems, the "verbose"
+ compiler option may do so, or the manual page may list them.
+
+ 2. A section that defines a small number of platform-specific macros, which
+ are then used directly by the collector. For simple ports, this is where
+ most of the effort is required. We describe the macros below. This section
+ contains a subsection for each architecture (enclosed in a suitable `ifdef`.
+ Each subsection usually contains some architecture-dependent defines,
+ followed by several sets of OS-dependent defines, again enclosed in
+ `ifdef`s.
+
+ 3. A section that fills in defaults for some macros left undefined in the
+ preceding section, and defines some other macros that rarely need adjustment
+ for new platforms. You will typically not have to touch these. If you are
+ porting to an OS that was previously completely unsupported, it is likely
+ that you will need to add another clause to the definition of `GET_MEM`.
+
+The following macros must be defined correctly for each architecture and
+operating system:
+
+ * `MACH_TYPE` - Defined to a string that represents the machine
+ architecture. Usually just the macro name used to identify the architecture,
+ but enclosed in quotes.
+ * `OS_TYPE` - Defined to a string that represents the operating system name.
+ Usually just the macro name used to identify the operating system, but
+ enclosed in quotes.
+ * `CPP_WORDSZ` - The word size in bits as a constant suitable for
+ preprocessor tests, i.e. without casts or `sizeof` expressions. Currently
+ always defined as either 64 or 32. For platforms supporting both 32- and
+ 64-bit ABIs, this should be conditionally defined depending on the current
+ ABI. There is a default of 32.
+ * `ALIGNMENT` - Defined to be the largest _N_ such that all pointer
+ are guaranteed to be aligned on _N_-byte boundaries. Defining it to be _1_
+ will always work, but perform poorly. For all modern 32-bit platforms, this
+ is 4. For all modern 64-bit platforms, this is 8. Whether or not x86
+ qualifies as a modern architecture here is compiler- and OS-dependent.
+ * `DATASTART` - The beginning of the main data segment. The collector will
+ trace all memory between `DATASTART` and `DATAEND` for root pointers.
+ On some platforms, this can be defined to a constant address, though
+ experience has shown that to be risky. Ideally the linker will define
+ a symbol (e.g. `_data`) whose address is the beginning of the data segment.
+ Sometimes the value can be computed using the `GC_SysVGetDataStart`
+ function. Not used if either the next macro is defined, or if dynamic
+ loading is supported, and the dynamic loading support defines a function
+ `GC_register_main_static_data` which returns false.
+ * `SEARCH_FOR_DATA_START` - If this is defined `DATASTART` will be defined
+ to a dynamically computed value which is obtained by starting with the
+ address of `_end` and walking backwards until non-addressable memory
+ is found. This often works on Posix-like platforms. It makes it harder
+ to debug client programs, since startup involves generating and catching
+ a segmentation fault, which tends to confuse users.
+ * `DATAEND` - Set to the end of the main data segment. Defaults to `_end`,
+ where that is declared as an array. This works in some cases, since the
+ linker introduces a suitable symbol.
+ * `DATASTART2`, `DATAEND2` - Some platforms have two discontiguous main data
+ segments, e.g. for initialized and uninitialized data. If so, these two
+ macros should be defined to the limits of the second main data segment.
+ * `STACK_GROWS_UP` - Should be defined if the stack (or thread stacks) grow
+ towards higher addresses. (This appears to be true only on PA-RISC. If your
+ architecture has more than one stack per thread, and is not supported yet,
+ you will need to do more work. Grep for "IA64" in the source for an
+ example.)
+ * `STACKBOTTOM` - Defined to be the cold end of the stack, which is usually
+ (i.e. when the stacks grow down) the highest address in the stack. It must
+ bound the region of the stack that contains pointers into the GC heap. With
+ thread support, this must be the cold end of the main stack, which typically
+ cannot be found in the same way as the other thread stacks. If this is not
+ defined and none of the following three macros is defined, client code must
+ explicitly set `GC_stackbottom` to an appropriate value before calling
+ `GC_INIT` or any other `GC_` routine.
+ * `LINUX_STACKBOTTOM` - May be defined instead of `STACKBOTTOM`. If defined,
+ then the cold end of the stack will be determined, we usually read it from
+ `/proc`.
+ * `HEURISTIC1` - May be defined instead of `STACKBOTTOM`. `STACK_GRAN`
+ should generally also be redefined. The cold end of the stack is determined
+ by taking an address inside `GC_init`s frame, and rounding it up to the next
+ multiple of `STACK_GRAN`. This works well if the stack bottom is always
+ aligned to a large power of two. (`STACK_GRAN` is predefined to 0x1000000,
+ which is rarely optimal.)
+ * `HEURISTIC2` - May be defined instead of `STACKBOTTOM`. The cold end
+ of the stack is determined by taking an address inside `GC_init`s frame,
+ incrementing it repeatedly in small steps (decrement if `STACK_GROWS_UP`),
+ and reading the value at each location. We remember the value when the first
+ Segmentation violation or Bus error is signaled, round that to the nearest
+ plausible page boundary, and use that as the stack bottom.
+ * `DYNAMIC_LOADING` - Should be defined if `dyn_load.c` has been updated for
+ this platform and tracing of dynamic library roots is supported.
+ * `GWW_VDB`, `MPROTECT_VDB`, `PROC_VDB`, `SOFT_VDB` - May be defined if the
+ corresponding _virtual dirty bit_ implementation in `os_dep.c` is usable on
+ this platform. This allows incremental/generational garbage collection.
+ (`GWW_VDB` uses the Win32 `GetWriteWatch` function to read dirty bits,
+ `MPROTECT_VDB` identifies modified pages by write protecting the heap and
+ catching faults. `PROC_VDB` and `SOFT_VDB` use the /proc pseudo-files to
+ read dirty bits.)
+ * `PREFETCH`, `GC_PREFETCH_FOR_WRITE` - The collector uses `PREFETCH(x)`
+ to preload the cache with the data at _x_ address. This defaults to a no-op.
+ * `CLEAR_DOUBLE` - If `CLEAR_DOUBLE` is defined, then `CLEAR_DOUBLE(x)`
+ is used as a fast way to clear the two words at `GC_malloc`-aligned address
+ _x_. By default, word stores of 0 are used instead.
+ * `HEAP_START` - May be defined as the initial address hint for mmap-based
+ allocation.
+
+## Additional requirements for a basic port
+
+In some cases, you may have to add additional platform-specific code to other
+files. A likely candidate is the implementation
+of `GC_with_callee_saves_pushed` in `mach_dep.c`. This ensure that register
+contents that the collector must trace from are copied to the stack. Typically
+this can be done portably, but on some platforms it may require assembly code,
+or just tweaking of conditional compilation tests.
+
+If your platform supports `getcontext` then defining the macro
+`UNIX_LIKE` for your OS in `gcconfig.h` (if it is not defined there yet)
+is likely to solve the problem. Otherwise, if you are using gcc,
+`_builtin_unwind_init` will be used, and should work fine. If that is not
+applicable either, the implementation will try to use `setjmp`. This will work
+if your `setjmp` implementation saves all possibly pointer-valued registers
+into the buffer, as opposed to trying to unwind the stack at `longjmp` time.
+The `setjmp_test` test tries to determine this, but often does not get it
+right. Registers tracing handled with an assembly code is generally to be
+avoided.
+
+Most commonly `os_dep.c` will not require attention, but see below.
+
+## Thread support
+
+Supporting threads requires that the collector be able to find and suspend all
+threads potentially accessing the garbage-collected heap, and locate any state
+associated with each thread that must be traced.
+
+The functionality needed for thread support is generally implemented in one or
+more files specific to the particular thread interface. For example, somewhat
+portable pthread support is implemented in `pthread_support.c` and
+`pthread_stop_world.c`. The essential functionality consists of:
+
+ * `GC_stop_world` - Stops all threads which may access the garbage collected
+ heap, other than the caller;
+ * `GC_start_world` - Restart other threads;
+ * `GC_push_all_stacks` - Push the contents of all thread stacks (or,
+ at least, of pointer-containing regions in the thread stacks) onto the mark
+ stack.
+
+These very often require that the garbage collector maintain its own data
+structures to track active threads.
+
+In addition, `LOCK` and `UNLOCK` must be implemented in `gc_locks.h`.
+
+The easiest case is probably a new pthreads platform on which threads can be
+stopped with signals. In this case, the changes involve:
+
+ 1. Introducing a suitable `GC_xxx_THREADS` macro, which should
+ be automatically defined by `gc_config_macros.h` in the right cases.
+ It should also result in a definition of `GC_PTHREADS`, as for the existing
+ cases.
+ 2. Ensuring that the `atomic_ops` package at least minimally
+ supports the platform. If incremental GC is needed, or if pthread locks
+ do not perform adequately as the allocation lock, you will probably need
+ to ensure that a sufficient `atomic_ops` port exists for the platform
+ to provided an atomic test and set operation. The latest GC code can use
+ GCC atomic intrinsics instead of `atomic_ops` package (see
+ `include/private/gc_atomic_ops.h`).
+ 3. Making any needed adjustments to `pthread_stop_world.c` and
+ `pthread_support.c`. Ideally none should be needed. In fact, not all of this
+ is as well standardized as one would like, and outright bugs requiring
+ workarounds are common. Non-preemptive threads packages will probably
+ require further work. Similarly thread-local allocation and parallel marking
+ requires further work in `pthread_support.c`, and may require better
+ `atomic_ops` support for the designed platform.
+
+## Dynamic library support
+
+So long as `DATASTART` and `DATAEND` are defined correctly, the collector will
+trace memory reachable from file scope or `static` variables defined as part
+of the main executable. This is sufficient if either the program is statically
+linked, or if pointers to the garbage-collected heap are never stored
+in non-stack variables defined in dynamic libraries.
+
+If dynamic library data sections must also be traced, then:
+
+ * `DYNAMIC_LOADING` must be defined in the appropriate section of
+ `gcconfig.h`.
+ * An appropriate versions of the functions `GC_register_dynamic_libraries`
+ should be defined in `dyn_load.c`. This function should invoke
+ `GC_cond_add_roots(region_start, region_end, TRUE)` on each dynamic
+ library data section.
+
+Implementations that scan for writable data segments are error prone,
+particularly in the presence of threads. They frequently result in race
+conditions when threads exit and stacks disappear. They may also accidentally
+trace large regions of graphics memory, or mapped files. On at least one
+occasion they have been known to try to trace device memory that could not
+safely be read in the manner the GC wanted to read it.
+
+It is usually safer to walk the dynamic linker data structure, especially
+if the linker exports an interface to do so. But beware of poorly documented
+locking behavior in this case.
+
+## Incremental GC support
+
+For incremental and generational collection to work, `os_dep.c` must contain
+a suitable _virtual dirty bit_ implementation, which allows the collector
+to track which heap pages (assumed to be a multiple of the collector's block
+size) have been written during a certain time interval. The collector provides
+several implementations, which might be adapted. The default (`DEFAULT_VDB`)
+is a placeholder which treats all pages as having been written. This ensures
+correctness, but renders incremental and generational collection essentially
+useless.
+
+## Stack traces for debug support
+
+If stack traces in objects are needed for debug support, `GC_save_callers` and
+`GC_print_callers` must be implemented.
+
+## Disclaimer
+
+This is an initial pass at porting guidelines. Some things have no doubt been
+overlooked.
diff --git a/graphics/asymptote/gc/doc/scale.md b/graphics/asymptote/gc/doc/scale.md
new file mode 100644
index 0000000000..77a83fd0db
--- /dev/null
+++ b/graphics/asymptote/gc/doc/scale.md
@@ -0,0 +1,173 @@
+# Garbage collector scalability
+
+If Makefile.direct is used, in its default configuration the
+Boehm-Demers-Weiser garbage collector is not thread-safe. Generally, it can be
+made thread-safe by building the collector with `-DGC_THREADS` compilation
+flag. This has primarily the following effects:
+
+ 1. It causes the garbage collector to stop all other threads when it needs
+ to see a consistent memory state. It intercepts thread creation and
+ termination events to maintain a list of client threads to be stopped when
+ needed.
+ 2. It causes the collector to acquire a lock around essentially all
+ allocation and garbage collection activity. Since a single lock is used for
+ all allocation-related activity, only one thread can be allocating
+ or collecting at one point. This inherently limits performance
+ of multi-threaded applications on multiprocessors.
+
+On most platforms, the allocator/collector lock is implemented as a spin lock
+with exponential back-off. Longer wait times are implemented by yielding
+and/or sleeping. If a collection is in progress, the pure spinning stage
+is skipped. This has the uncontested advantage that most uniprocessor lock
+acquisitions are very cheap. It has the disadvantage that the application may
+sleep for small periods of time even when there is work to be done. And
+threads may be unnecessarily woken up for short periods. Nonetheless, this
+scheme empirically outperforms native queue-based mutual exclusion
+implementations in most cases, sometimes drastically so.
+
+## Options for enhanced scalability
+
+The collector uses two facilities to enhance collector scalability on
+multiprocessors. They are intended to be used together. (The following refers
+to Makefile.direct again.)
+
+ * Building the collector with `-DPARALLEL_MARK` allows the collector to run
+ the mark phase in parallel in multiple threads, and thus on multiple
+ processors (or processor cores). The mark phase typically consumes the large
+ majority of the collection time. Thus, this largely parallelizes the garbage
+ collector itself, though not the allocation process. Currently the marking
+ is performed by the thread that triggered the collection, together with
+ _N_ - 1 dedicated threads, where _N_ is the number of processors (cores)
+ detected by the collector. The dedicated marker threads are created when the
+ client calls `GC_start_mark_threads()` or when the client starts the first
+ non-main thread after the GC initialization (or after fork operation in
+ a child process). Another effect of this flag is to switch to a more
+ concurrent implementation of `GC_malloc_many`, so that free lists can be
+ built and memory can be cleared by more than one thread concurrently.
+ * Building the collector with `-DTHREAD_LOCAL_ALLOC` adds support for
+ thread-local allocation. This causes `GC_malloc` (actually `GC_malloc_kind`)
+ and `GC_gcj_malloc` to be redefined to perform thread-local allocation.
+
+Memory returned from thread-local allocators is completely interchangeable
+with that returned by the standard allocators. It may be used by other
+threads. The only difference is that, if the thread allocates enough memory
+of a certain kind, it will build a thread-local free list for objects of that
+kind, and allocate from that. This greatly reduces locking. The thread-local
+free lists are refilled using `GC_malloc_many`.
+
+An important side effect of this flag is to replace the default
+spin-then-sleep lock to be replaced by a spin-then-queue based implementation.
+This _reduces performance_ for the standard allocation functions, though
+it usually improves performance when thread-local allocation is used heavily,
+and, thus, the number of short-duration lock acquisitions is greatly reduced.
+
+## The Parallel Marking Algorithm
+
+We use an algorithm similar to
+[that developed by Endo, Taura, and Yonezawa](http://www.yl.is.s.u-tokyo.ac.jp/gc/)
+at the University of Tokyo. However, the data structures and implementation
+are different, and represent a smaller change to the original collector
+source, probably at the expense of extreme scalability. Some of the
+refinements they suggest, e.g. splitting large objects, were also incorporated
+into our approach.
+
+The global mark stack is transformed into a global work queue. Unlike the
+usual case, it never shrinks during a mark phase. The mark threads remove
+objects from the queue by copying them to a local mark stack and changing the
+global descriptor to zero, indicating that there is no more work to be done
+for this entry. This removal is done with no synchronization. Thus it is
+possible for more than one worker to remove the same entry, resulting in some
+work duplication.
+
+The global work queue grows only if a marker thread decides to return some
+of its local mark stack to the global one. This is done if the global queue
+appears to be running low, or if the local stack is in danger of overflowing.
+It does require synchronization, but should be relatively rare.
+
+The sequential marking code is reused to process local mark stacks. Hence the
+amount of additional code required for parallel marking is minimal.
+
+It should be possible to use incremental/generational collection in the
+presence of the parallel collector by calling `GC_enable_incremental`, but
+the current implementation does not allow interruption of the parallel marker,
+so the latter is mostly avoided if the client sets the collection time limit.
+
+Gcj-style mark descriptors do not currently mix with the combination of local
+allocation and incremental collection. They should work correctly with one or
+the other, but not both.
+
+The number of marker threads is set on startup to the number of available
+processor cores (or to the value of either `GC_MARKERS` or `GC_NPROCS`
+environment variable, if provided). If only a single processor is detected,
+parallel marking is disabled.
+
+Note that setting `GC_NPROCS` to 1 also causes some lock acquisitions inside
+the collector to immediately yield the processor instead of busy waiting
+first. In the case of a multiprocessor and a client with multiple
+simultaneously runnable threads, this may have disastrous performance
+consequences (e.g. a factor of 10 slowdown).
+
+## Performance
+
+We conducted some simple experiments with a version of
+[our GC benchmark](http://www.hboehm.info/gc/gc_bench/) that was slightly
+modified to run multiple concurrent client threads in the same address space.
+Each client thread does the same work as the original benchmark, but they
+share a heap. This benchmark involves very little work outside of memory
+allocation. This was run with an ancient GC (released in 2000) on a dual
+processor Pentium III/500 machine under Linux 2.2.12.
+
+Running with a thread-unsafe collector, the benchmark ran in 9 seconds. With
+the simple thread-safe collector, built with `-DGC_THREADS`, the execution
+time increased to 10.3 seconds, or 23.5 elapsed seconds with two clients. (The
+times for the `malloc`/`free` version with glibc `malloc` are 10.51 (standard
+library, pthreads not linked), 20.90 (one thread, pthreads linked), and 24.55
+seconds, respectively. The benchmark favors a garbage collector, since most
+objects are small.)
+
+The following table gives execution times for the collector built with
+parallel marking and thread-local allocation support
+(`-DGC_THREADS -DPARALLEL_MARK -DTHREAD_LOCAL_ALLOC`). We tested the client
+using either one or two marker threads, and running one or two client threads.
+Note that the client uses thread local allocation exclusively. With
+`-DTHREAD_LOCAL_ALLOC` the collector switches to a locking strategy that
+is better tuned to less frequent lock acquisition. The standard allocation
+primitives thus perform slightly worse than without `-DTHREAD_LOCAL_ALLOC`,
+and should be avoided in time-critical code.
+
+(The results using `pthread_mutex_lock` directly for allocation locking would
+have been worse still, at least for older versions of linuxthreads. With
+`-DTHREAD_LOCAL_ALLOC`, we first repeatedly try to acquire the lock with
+`pthread_mutex_try_lock`, busy-waiting between attempts. After a fixed number
+of attempts, we use `pthread_mutex_lock`.)
+
+These measurements do not use incremental collection, nor was prefetching
+enabled in the marker. We used the C version of the benchmark. All
+measurements are in elapsed seconds on an unloaded machine.
+
+Number of client threads| 1 marker thread (secs.)| 2 marker threads (secs.)
+---|------|-----
+ 1| 10.45| 7.85
+ 2| 19.95| 12.3
+
+The execution time for the single threaded case is slightly worse than with
+simple locking. However, even the single-threaded benchmark runs faster than
+even the thread-unsafe version if a second processor is available. The
+execution time for two clients with thread local allocation time is only 1.4
+times the sequential execution time for a single thread in a thread-unsafe
+environment, even though it involves twice the client work. That represents
+close to a factor of 2 improvement over the 2 client case with the old
+collector. The old collector clearly still suffered from some contention
+overhead, in spite of the fact that the locking scheme had been fairly well
+tuned.
+
+Full linear speedup (i.e. the same execution time for 1 client on one
+processor as 2 clients on 2 processors) is probably not achievable on this
+kind of hardware even with such a small number of processors, since the memory
+system is a major constraint for the garbage collector, the processors usually
+share a single memory bus, and thus the aggregate memory bandwidth does not
+increase in proportion to the number of processors (cores).
+
+These results are likely to be very sensitive to both hardware and OS issues.
+Preliminary experiments with an older Pentium Pro machine running an older
+kernel were far less encouraging.
diff --git a/graphics/asymptote/gc/doc/simple_example.md b/graphics/asymptote/gc/doc/simple_example.md
new file mode 100644
index 0000000000..d24c9a085c
--- /dev/null
+++ b/graphics/asymptote/gc/doc/simple_example.md
@@ -0,0 +1,182 @@
+# Using the Garbage Collector: A simple example
+
+The following consists of step-by-step instructions for building and using the
+collector. We'll assume a Linux/gcc platform and a single-threaded
+application. The green text contains information about other platforms
+or scenarios. It can be skipped, especially on first reading.
+
+## Building the collector
+
+If you have not so yet, unpack the collector and enter the newly created
+directory with:
+
+
+ tar xvfz gc-<version>.tar.gz
+ cd gc-<version>
+
+
+You can configure, build, and install the collector in a private directory,
+say /home/xyz/gc, with the following commands:
+
+
+ ./configure --prefix=/home/xyz/gc --disable-threads
+ make
+ make check
+ make install
+
+
+Here the `make check` command is optional, but highly recommended. It runs
+a basic correctness test which usually takes well under a minute.
+
+### Other platforms
+
+On non-Unix, non-Linux platforms, the collector is usually built by copying
+the appropriate makefile (see the platform-specific README in doc/README.xxx
+in the distribution) to the file "Makefile", and then typing `make` (or
+`nmake` or ...). This builds the library in the source tree. You may want
+to move it and the files in the include directory to a more convenient place.
+
+If you use a makefile that does not require running a configure script, you
+should first look at the makefile, and adjust any options that are documented
+there.
+
+If your platform provides a `make` utility, that is generally preferred
+to platform- and compiler- dependent "project" files. (At least that is the
+strong preference of the would-be maintainer of those project files.)
+
+### Threads
+
+If you do not need thread support, configure the collector with:
+
+
+ --disable-threads
+
+
+Alternatively, if your target is a real old-fashioned uniprocessor (no
+"hyperthreading", etc.), you may just want to turn off parallel marking with
+`--disable-parallel-mark`.
+
+### C++
+
+You will need to include the C++ support, which unfortunately tends to be
+among the least portable parts of the collector, since it seems to rely
+on some corner cases of the language. On Linux, it suffices to add
+`--enable-cplusplus` to the configure options.
+
+## Writing the program
+
+You will need to include "gc.h" at the beginning of every file that allocates
+memory through the garbage collector. Call `GC_MALLOC` wherever you would have
+call `malloc`. This initializes memory to zero like `calloc`; there is no need
+to explicitly clear the result.
+
+If you know that an object will not contain pointers to the garbage-collected
+heap, and you don't need it to be initialized, call `GC_MALLOC_ATOMIC`
+instead.
+
+A function `GC_FREE` is provided but need not be called. For very small
+objects, your program will probably perform better if you do not call it, and
+let the collector do its job.
+
+A `GC_REALLOC` function behaves like the C library `realloc`. It allocates
+uninitialized pointer-free memory if the original object was allocated that
+way.
+
+The following program `loop.c` is a trivial example:
+
+
+ #include "gc.h"
+ #include <assert.h>
+ #include <stdio.h>
+
+ int main(void) {
+ int i;
+
+ GC_INIT();
+ for (i = 0; i < 10000000; ++i) {
+ int **p = (int **) GC_MALLOC(sizeof(int *));
+ int *q = (int *) GC_MALLOC_ATOMIC(sizeof(int));
+ assert(*p == 0);
+ *p = (int *) GC_REALLOC(q, 2 * sizeof(int));
+ if (i % 100000 == 0)
+ printf("Heap size = %lu bytes\n",
+ (unsigned long)GC_get_heap_size());
+ }
+ return 0;
+ }
+
+
+### Interaction with the system malloc
+
+It is usually best not to mix garbage-collected allocation with the system
+`malloc`-`free`. If you do, you need to be careful not to store pointers
+to the garbage-collected heap in memory allocated with the system `malloc`.
+
+### Other Platforms
+
+On some other platforms it is necessary to call `GC_INIT` from the main
+program, which is presumed to be part of the main executable, not a dynamic
+library. This can never hurt, and is thus generally good practice.
+
+### Threads
+
+For a multi-threaded program, some more rules apply:
+
+ * Files that either allocate through the GC _or make thread-related calls_
+ should first define the macro `GC_THREADS`, and then include `gc.h`. On some
+ platforms this will redefine some threads primitives, e.g. to let the
+ collector keep track of thread creation.
+
+### C++
+
+In the case of C++, you need to be especially careful not to store pointers
+to the garbage-collected heap in areas that are not traced by the collector.
+The collector includes some _alternate interfaces_ to make that easier.
+
+### Debugging
+
+Additional debug checks can be performed by defining `GC_DEBUG` before
+including `gc.h`. Additional options are available if the collector is also
+built with `--enable-gc-debug` and all allocations are performed with
+`GC_DEBUG` defined.
+
+### What if I can't rewrite/recompile my program?
+
+You may be able to build the collector with `--enable-redirect-malloc` and set
+the `LD_PRELOAD` environment variable to point to the resulting library, thus
+replacing the standard `malloc` with its garbage-collected counterpart. This
+is rather platform dependent. See the _GC leak detection documentation_ for
+some more details.
+
+## Compiling and linking
+
+The above application `loop.c` test program can be compiled and linked with:
+
+
+ cc -I/home/xyz/gc/include loop.c /home/xyz/gc/lib/libgc.a -o loop
+
+
+The `-I` option directs the compiler to the right include directory. In this
+case, we list the static library directly on the compile line; the dynamic
+library could have been used instead, provided we arranged for the dynamic
+loader to find it, e.g. by setting `LD_LIBRARY_PATH`.
+
+### Threads
+
+On pthread platforms, you will of course also have to link with `-lpthread`,
+and compile with any thread-safety options required by your compiler. On some
+platforms, you may also need to link with `-ldl` or `-lrt`. Looking
+at `tools/threadlibs.c` should give you the appropriate list if a plain
+`-lpthread` does not work.
+
+## Running the executable
+
+The executable can of course be run normally, e.g. by typing:
+
+
+ ./loop
+
+
+The operation of the collector is affected by a number of environment
+variables. For example, setting `GC_PRINT_STATS` produces some GC statistics
+on stdout. See `README.environment` in the distribution for details.
diff --git a/graphics/asymptote/gc/doc/tree.md b/graphics/asymptote/gc/doc/tree.md
new file mode 100644
index 0000000000..0fd3401d57
--- /dev/null
+++ b/graphics/asymptote/gc/doc/tree.md
@@ -0,0 +1,182 @@
+# Two-Level Tree Structure for Fast Pointer Lookup
+
+The Boehm-Demers-Weiser conservative Garbage Collector uses a 2-level tree
+data structure to aid in fast pointer identification. This data structure
+is described in a bit more detail here, since
+
+ 1. Variations of the data structure are more generally useful.
+ 2. It appears to be hard to understand by reading the code.
+ 3. Some other collectors appear to use inferior data structures to solve the
+ same problem.
+ 4. It is central to fast collector operation. A candidate pointer
+ is divided into three sections, the _high_, _middle_, and _low_ bits. The
+ exact division between these three groups of bits is dependent on the
+ detailed collector configuration.
+
+The high and middle bits are used to look up an entry in the table described
+here. The resulting table entry consists of either a block descriptor
+(`struct hblkhdr *` or `hdr *`) identifying the layout of objects in the
+block, or an indication that this address range corresponds to the middle of
+a large block, together with a hint for locating the actual block descriptor.
+Such a hint consist of a displacement that can be subtracted from the middle
+bits of the candidate pointer without leaving the object.
+
+In either case, the block descriptor (`struct hblkhdr`) refers to a table
+of object starting addresses (the `hb_map` field). The starting address table
+is indexed by the low bits if the candidate pointer. The resulting entry
+contains a displacement to the beginning of the object, or an indication that
+this cannot be a valid object pointer. (If all interior pointer are
+recognized, pointers into large objects are handled specially,
+as appropriate.)
+
+## The Tree
+
+The rest of this discussion focuses on the two level data structure used
+to map the high and middle bits to the block descriptor.
+
+The high bits are used as an index into the `GC_top_index` (really
+`GC_arrays._top_index`) array. Each entry points to a `bottom_index` data
+structure. This structure in turn consists mostly of an array `index` indexed
+by the middle bits of the candidate pointer. The `index` array contains the
+actual `hdr` pointers.
+
+Thus a pointer lookup consists primarily of a handful of memory references,
+and can be quite fast:
+
+ 1. The appropriate `bottom_index` pointer is looked up in `GC_top_index`,
+ based on the high bits of the candidate pointer.
+ 2. The appropriate `hdr` pointer is looked up in the `bottom_index`
+ structure, based on the middle bits.
+ 3. The block layout map pointer is retrieved from the `hdr` structure. (This
+ memory reference is necessary since we try to share block layout maps.)
+ 4. The displacement to the beginning of the object is retrieved from the
+ above map.
+
+In order to conserve space, not all `GC_top_index` entries in fact point
+to distinct `bottom_index` structures. If no address with the corresponding
+high bits is part of the heap, then the entry points to `GC_all_nils`,
+a single `bottom_index` structure consisting only of `NULL` `hdr` pointers.
+
+`Bottom_index` structures contain slightly more information than just `hdr`
+pointers. The `asc_link` field is used to link all `bottom_index` structures
+in ascending order for fast traversal. This list is pointed to be
+`GC_all_bottom_indices`. It is maintained with the aid of `key` field that
+contains the high bits corresponding to the `bottom_index`.
+
+## 64-bit addresses
+
+In the case of 64-bit addresses, this picture is complicated slightly by the
+fact that one of the index structures would have to be huge to cover the
+entire address space with a two level tree. We deal with this by turning
+`GC_top_index` into a chained hash table, instead of a simple array. This adds
+a `hash_link` field to the `bottom_index` structure.
+
+The _hash function_ consists of dropping the high bits. This is cheap
+to compute, and guarantees that there will be no collisions if the heap
+is contiguous and not excessively large.
+
+## A picture
+
+The following is an _ASCII_ diagram of the data structure used by GC_base. This was
+contributed originally by Dave Barrett.
+
+
+ 63 LOG_TOP_SZ[11] LOG_BOTTOM_SZ[10] LOG_HBLKSIZE[13]
+ +------------------+----------------+------------------+------------------+
+ p:| | TL_HASH(hi) | | HBLKDISPL(p) |
+ +------------------+----------------+------------------+------------------+
+ \-----------------------HBLKPTR(p)-------------------/
+ \------------hi-------------------/
+ \______ ________/ \________ _______/ \________ _______/
+ V V V
+ | | |
+ GC_top_index[] | | |
+ --- +--------------+ | | |
+ ^ | | | | |
+ | | | | | |
+ TOP_SZ +--------------+<--+ | |
+ (items)+-<| [] | * | |
+ | | +--------------+ if 0 < bi< HBLKSIZE | |
+ | | | | then large object | |
+ | | | | starts at the bi'th | |
+ v | | | hblk before p. | i |
+ --- | +--------------+ | (word- |
+ v | aligned) |
+ bi= |GET_BI(p){->hash_link}->key==hi | |
+ v | |
+ | (bottom_index) \ GC_scratch_alloc'd | |
+ | (struct bi) / by get_index() | |
+ --- +->+--------------+ | |
+ ^ | | | |
+ | | | | |
+ BOTTOM_SZ | | ha=GET_HDR_ADDR(p) | |
+ (items) +--------------+<----------------------+ +-------+
+ | +--<| index[] | |
+ | | +--------------+ GC_obj_map: v
+ | | | | from / +-+-+-----+-+-+-+-+ ---
+ v | | | GC_add_map_entry <0| | | | | | | | ^
+ --- | +--------------+ \ +-+-+-----+-+-+-+-+ |
+ | | asc_link | +-+-+-----+-+-+-+-+ MAXOBJGRANULES
+ | +--------------+ +-->| | | j | | | | | +1
+ | | key | | +-+-+-----+-+-+-+-+ |
+ | +--------------+ | +-+-+-----+-+-+-+-+ |
+ | | hash_link | | | | | | | | | | v
+ | +--------------+ | +-+-+-----+-+-+-+-+ ---
+ | | |<----MAP_LEN---->|
+ | | =HBLKSIZE/GRANULE_BYTES
+ HDR(p)| GC_find_header(p) | (1024 elements on Alpha)
+ | \ from | (16 bits each)
+ | (hdr) (struct hblkhdr) / alloc_hdr() |
+ +--->+----------------------+ |
+ GET_HDR(p)| struct hblk *hb_next | |
+ +----------------------+ |
+ | ... | |
+ +----------------------+ |
+ | uchar hb_obj_kind | |
+ +----------------------+ |
+ | uchar hb_flags | |
+ +----------------------+ |
+ | hb_last_reclaimed | |
+ +----------------------+ |
+ | size_t hb_sz | |
+ +----------------------+ |
+ | word hb_descr | |
+ +----------------------+ |
+ | ushort *hb_map |>------------+
+ +----------------------+
+ | AO_t hb_n_marks |
+ --- +----------------------+
+ ^ | |
+ | | | * if hdr is free, hb_sz is the size
+ MARK_BITS_SZ| char/word hb_marks[] | of a heap chunk (struct hblk) of at
+ | | | least MINHINCR*HBLKSIZE bytes (below);
+ v | | otherwise, size of each object in chunk.
+ --- +----------------------+
+
+
+Dynamic data structures above are interleaved throughout the heap in blocks
+of size `MINHINCR * HBLKSIZE` bytes as done by `GC_scratch_alloc` which cannot
+be freed; free lists are used (e.g. `alloc_hdr`). `hblk`'s below are
+collected.
+
+
+ (struct hblk)
+ --- +----------------------+ < HBLKSIZE ---
+ ^ +-----hb_body----------+ (and WORDSZ- ^ --- ---
+ | | | aligned) | ^ ^
+ | | | | | |
+ | | | | hb_sz |
+ | | Object 0 | | | |
+ | | | i |(word- v |
+ | + - - - - - - - - - - -+ --- (bytes)|aligned) --- |
+ | | | ^ | ^ |
+ | | | j (words) | | |
+ n * | Object 1 | v v hb_sz HBLKSIZE/BYTES_PER_WORD
+ HBLKSIZE | |--------------- | (words)
+ (bytes) | | v |
+ | + - - - - - - - - - - -+ --- |
+ | | | !ALL_INTERIOR_POINTERS ^ |
+ | | | sets j only for hb_sz |
+ | | Object N | valid object offsets. | |
+ v | | All objects WORDSZ- v v
+ --- +----------------------+ aligned. --- ---
diff --git a/graphics/asymptote/gc/dyn_load.c b/graphics/asymptote/gc/dyn_load.c
new file mode 100644
index 0000000000..c73897e6ba
--- /dev/null
+++ b/graphics/asymptote/gc/dyn_load.c
@@ -0,0 +1,1575 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1997 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2009-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+/*
+ * This is incredibly OS specific code for tracking down data sections in
+ * dynamic libraries. There appears to be no way of doing this quickly
+ * without groveling through undocumented data structures. We would argue
+ * that this is a bug in the design of the dlopen interface. THIS CODE
+ * MAY BREAK IN FUTURE OS RELEASES. If this matters to you, don't hesitate
+ * to let your vendor know ...
+ *
+ * None of this is safe with dlclose and incremental collection.
+ * But then not much of anything is safe in the presence of dlclose.
+ */
+
+#if !defined(MACOS) && !defined(GC_NO_TYPES) && !defined(SN_TARGET_PSP2) \
+ && !defined(_WIN32_WCE) && !defined(__CC_ARM)
+# include <sys/types.h>
+#endif
+
+/* BTL: avoid circular redefinition of dlopen if GC_SOLARIS_THREADS defined */
+#undef GC_MUST_RESTORE_REDEFINED_DLOPEN
+#if defined(GC_PTHREADS) && !defined(GC_NO_DLOPEN) \
+ && !defined(GC_NO_THREAD_REDIRECTS) && !defined(GC_USE_LD_WRAP)
+ /* To support threads in Solaris, gc.h interposes on dlopen by */
+ /* defining "dlopen" to be "GC_dlopen", which is implemented below. */
+ /* However, both GC_FirstDLOpenedLinkMap() and GC_dlopen() use the */
+ /* real system dlopen() in their implementation. We first remove */
+ /* gc.h's dlopen definition and restore it later, after GC_dlopen(). */
+# undef dlopen
+# define GC_MUST_RESTORE_REDEFINED_DLOPEN
+#endif /* !GC_NO_DLOPEN */
+
+/* A user-supplied routine (custom filter) that might be called to */
+/* determine whether a DSO really needs to be scanned by the GC. */
+/* 0 means no filter installed. May be unused on some platforms. */
+/* FIXME: Add filter support for more platforms. */
+STATIC GC_has_static_roots_func GC_has_static_roots = 0;
+
+#if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(MSWINCE) \
+ || defined(CYGWIN32)) && !defined(PCR)
+
+#if !defined(DARWIN) && !defined(SCO_ELF) && !defined(SOLARISDL) \
+ && !defined(AIX) && !defined(DGUX) && !defined(IRIX5) && !defined(HPUX) \
+ && !defined(CYGWIN32) && !defined(MSWIN32) && !defined(MSWINCE) \
+ && !(defined(ALPHA) && defined(OSF1)) \
+ && !(defined(FREEBSD) && defined(__ELF__)) \
+ && !(defined(LINUX) && defined(__ELF__)) \
+ && !(defined(NETBSD) && defined(__ELF__)) \
+ && !(defined(OPENBSD) && (defined(__ELF__) || defined(M68K))) \
+ && !defined(HAIKU) && !defined(HURD) && !defined(NACL) \
+ && !defined(CPPCHECK)
+# error We only know how to find data segments of dynamic libraries for above.
+# error Additional SVR4 variants might not be too hard to add.
+#endif
+
+#include <stdio.h>
+#ifdef SOLARISDL
+# include <sys/elf.h>
+# include <dlfcn.h>
+# include <link.h>
+#endif
+
+#if defined(NETBSD)
+# include <sys/param.h>
+# include <dlfcn.h>
+# include <machine/elf_machdep.h>
+# define ELFSIZE ARCH_ELFSIZE
+#endif
+
+#if defined(OPENBSD)
+# include <sys/param.h>
+# if (OpenBSD >= 200519) && !defined(HAVE_DL_ITERATE_PHDR)
+# define HAVE_DL_ITERATE_PHDR
+# endif
+#endif /* OPENBSD */
+
+#if defined(SCO_ELF) || defined(DGUX) || defined(HURD) || defined(NACL) \
+ || (defined(__ELF__) && (defined(LINUX) || defined(FREEBSD) \
+ || defined(NETBSD) || defined(OPENBSD)))
+# include <stddef.h>
+# if !defined(OPENBSD) && !defined(HOST_ANDROID)
+ /* OpenBSD does not have elf.h file; link.h below is sufficient. */
+ /* Exclude Android because linker.h below includes its own version. */
+# include <elf.h>
+# endif
+# ifdef HOST_ANDROID
+ /* If you don't need the "dynamic loading" feature, you may build */
+ /* the collector with -D IGNORE_DYNAMIC_LOADING. */
+# ifdef BIONIC_ELFDATA_REDEF_BUG
+ /* Workaround a problem in Bionic (as of Android 4.2) which has */
+ /* mismatching ELF_DATA definitions in sys/exec_elf.h and */
+ /* asm/elf.h included from linker.h file (similar to EM_ALPHA). */
+# include <asm/elf.h>
+# include <linux/elf-em.h>
+# undef ELF_DATA
+# undef EM_ALPHA
+# endif
+# include <link.h>
+# if !defined(GC_DONT_DEFINE_LINK_MAP) && !(__ANDROID_API__ >= 21)
+ /* link_map and r_debug are defined in link.h of NDK r10+. */
+ /* bionic/linker/linker.h defines them too but the header */
+ /* itself is a C++ one starting from Android 4.3. */
+ struct link_map {
+ uintptr_t l_addr;
+ char* l_name;
+ uintptr_t l_ld;
+ struct link_map* l_next;
+ struct link_map* l_prev;
+ };
+ struct r_debug {
+ int32_t r_version;
+ struct link_map* r_map;
+ void (*r_brk)(void);
+ int32_t r_state;
+ uintptr_t r_ldbase;
+ };
+# endif
+# else
+ EXTERN_C_BEGIN /* Workaround missing extern "C" around _DYNAMIC */
+ /* symbol in link.h of some Linux hosts. */
+# include <link.h>
+ EXTERN_C_END
+# endif
+#endif
+
+/* Newer versions of GNU/Linux define this macro. We
+ * define it similarly for any ELF systems that don't. */
+# ifndef ElfW
+# if defined(FREEBSD)
+# if __ELF_WORD_SIZE == 32
+# define ElfW(type) Elf32_##type
+# else
+# define ElfW(type) Elf64_##type
+# endif
+# elif defined(NETBSD) || defined(OPENBSD)
+# if ELFSIZE == 32
+# define ElfW(type) Elf32_##type
+# elif ELFSIZE == 64
+# define ElfW(type) Elf64_##type
+# else
+# error Missing ELFSIZE define
+# endif
+# else
+# if !defined(ELF_CLASS) || ELF_CLASS == ELFCLASS32
+# define ElfW(type) Elf32_##type
+# else
+# define ElfW(type) Elf64_##type
+# endif
+# endif
+# endif
+
+#if defined(SOLARISDL) && !defined(USE_PROC_FOR_LIBRARIES)
+
+ EXTERN_C_BEGIN
+ extern ElfW(Dyn) _DYNAMIC;
+ EXTERN_C_END
+
+ STATIC struct link_map *
+ GC_FirstDLOpenedLinkMap(void)
+ {
+ ElfW(Dyn) *dp;
+ static struct link_map * cachedResult = 0;
+ static ElfW(Dyn) *dynStructureAddr = 0;
+ /* BTL: added to avoid Solaris 5.3 ld.so _DYNAMIC bug */
+
+# ifdef SUNOS53_SHARED_LIB
+ /* BTL: Avoid the Solaris 5.3 bug that _DYNAMIC isn't being set */
+ /* up properly in dynamically linked .so's. This means we have */
+ /* to use its value in the set of original object files loaded */
+ /* at program startup. */
+ if( dynStructureAddr == 0 ) {
+ void* startupSyms = dlopen(0, RTLD_LAZY);
+ dynStructureAddr = (ElfW(Dyn)*)(word)dlsym(startupSyms, "_DYNAMIC");
+ }
+# else
+ dynStructureAddr = &_DYNAMIC;
+# endif
+
+ if (0 == COVERT_DATAFLOW(dynStructureAddr)) {
+ /* _DYNAMIC symbol not resolved. */
+ return(0);
+ }
+ if (cachedResult == 0) {
+ int tag;
+ for( dp = ((ElfW(Dyn) *)(&_DYNAMIC)); (tag = dp->d_tag) != 0; dp++ ) {
+ if (tag == DT_DEBUG) {
+ struct r_debug *rd = (struct r_debug *)dp->d_un.d_ptr;
+ if (rd != NULL) {
+ struct link_map *lm = rd->r_map;
+ if (lm != NULL)
+ cachedResult = lm->l_next; /* might be NULL */
+ }
+ break;
+ }
+ }
+ }
+ return cachedResult;
+ }
+
+#endif /* SOLARISDL ... */
+
+/* BTL: added to fix circular dlopen definition if GC_SOLARIS_THREADS defined */
+# ifdef GC_MUST_RESTORE_REDEFINED_DLOPEN
+# define dlopen GC_dlopen
+# endif
+
+# if defined(SOLARISDL)
+
+/* Add dynamic library data sections to the root set. */
+# if !defined(PCR) && !defined(GC_SOLARIS_THREADS) && defined(THREADS) \
+ && !defined(CPPCHECK)
+# error Fix mutual exclusion with dlopen
+# endif
+
+# ifndef USE_PROC_FOR_LIBRARIES
+GC_INNER void GC_register_dynamic_libraries(void)
+{
+ struct link_map *lm;
+
+ for (lm = GC_FirstDLOpenedLinkMap(); lm != 0; lm = lm->l_next) {
+ ElfW(Ehdr) * e;
+ ElfW(Phdr) * p;
+ unsigned long offset;
+ char * start;
+ int i;
+
+ e = (ElfW(Ehdr) *) lm->l_addr;
+ p = ((ElfW(Phdr) *)(((char *)(e)) + e->e_phoff));
+ offset = ((unsigned long)(lm->l_addr));
+ for( i = 0; i < (int)e->e_phnum; i++, p++ ) {
+ switch( p->p_type ) {
+ case PT_LOAD:
+ {
+ if( !(p->p_flags & PF_W) ) break;
+ start = ((char *)(p->p_vaddr)) + offset;
+ GC_add_roots_inner(start, start + p->p_memsz, TRUE);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
+
+# endif /* !USE_PROC_FOR_LIBRARIES */
+# endif /* SOLARISDL */
+
+#if defined(SCO_ELF) || defined(DGUX) || defined(HURD) || defined(NACL) \
+ || (defined(__ELF__) && (defined(LINUX) || defined(FREEBSD) \
+ || defined(NETBSD) || defined(OPENBSD)))
+
+#ifdef USE_PROC_FOR_LIBRARIES
+
+#include <string.h>
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#define MAPS_BUF_SIZE (32*1024)
+
+/* Sort an array of HeapSects by start address. */
+/* Unfortunately at least some versions of */
+/* Linux qsort end up calling malloc by way of sysconf, and hence can't */
+/* be used in the collector. Hence we roll our own. Should be */
+/* reasonably fast if the array is already mostly sorted, as we expect */
+/* it to be. */
+static void sort_heap_sects(struct HeapSect *base, size_t number_of_elements)
+{
+ signed_word n = (signed_word)number_of_elements;
+ signed_word nsorted = 1;
+
+ while (nsorted < n) {
+ signed_word i;
+
+ while (nsorted < n &&
+ (word)base[nsorted-1].hs_start < (word)base[nsorted].hs_start)
+ ++nsorted;
+ if (nsorted == n) break;
+ GC_ASSERT((word)base[nsorted-1].hs_start > (word)base[nsorted].hs_start);
+ i = nsorted - 1;
+ while (i >= 0 && (word)base[i].hs_start > (word)base[i+1].hs_start) {
+ struct HeapSect tmp = base[i];
+ base[i] = base[i+1];
+ base[i+1] = tmp;
+ --i;
+ }
+ GC_ASSERT((word)base[nsorted-1].hs_start < (word)base[nsorted].hs_start);
+ ++nsorted;
+ }
+}
+
+STATIC void GC_register_map_entries(const char *maps)
+{
+ const char *prot;
+ ptr_t start, end;
+ unsigned int maj_dev;
+ ptr_t least_ha, greatest_ha;
+ unsigned i;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ sort_heap_sects(GC_our_memory, GC_n_memory);
+ least_ha = GC_our_memory[0].hs_start;
+ greatest_ha = GC_our_memory[GC_n_memory-1].hs_start
+ + GC_our_memory[GC_n_memory-1].hs_bytes;
+
+ for (;;) {
+ maps = GC_parse_map_entry(maps, &start, &end, &prot, &maj_dev, 0);
+ if (NULL == maps) break;
+
+ if (prot[1] == 'w') {
+ /* This is a writable mapping. Add it to */
+ /* the root set unless it is already otherwise */
+ /* accounted for. */
+ if ((word)start <= (word)GC_stackbottom
+ && (word)end >= (word)GC_stackbottom) {
+ /* Stack mapping; discard */
+ continue;
+ }
+# ifdef THREADS
+ /* This may fail, since a thread may already be */
+ /* unregistered, but its thread stack may still be there. */
+ /* That can fail because the stack may disappear while */
+ /* we're marking. Thus the marker is, and has to be */
+ /* prepared to recover from segmentation faults. */
+
+ if (GC_segment_is_thread_stack(start, end)) continue;
+
+ /* FIXME: NPTL squirrels */
+ /* away pointers in pieces of the stack segment that we */
+ /* don't scan. We work around this */
+ /* by treating anything allocated by libpthread as */
+ /* uncollectible, as we do in some other cases. */
+ /* A specifically identified problem is that */
+ /* thread stacks contain pointers to dynamic thread */
+ /* vectors, which may be reused due to thread caching. */
+ /* They may not be marked if the thread is still live. */
+ /* This specific instance should be addressed by */
+ /* INCLUDE_LINUX_THREAD_DESCR, but that doesn't quite */
+ /* seem to suffice. */
+ /* We currently trace entire thread stacks, if they are */
+ /* are currently cached but unused. This is */
+ /* very suboptimal for performance reasons. */
+# endif
+ /* We no longer exclude the main data segment. */
+ if ((word)end <= (word)least_ha
+ || (word)start >= (word)greatest_ha) {
+ /* The easy case; just trace entire segment */
+ GC_add_roots_inner(start, end, TRUE);
+ continue;
+ }
+ /* Add sections that don't belong to us. */
+ i = 0;
+ while ((word)(GC_our_memory[i].hs_start
+ + GC_our_memory[i].hs_bytes) < (word)start)
+ ++i;
+ GC_ASSERT(i < GC_n_memory);
+ if ((word)GC_our_memory[i].hs_start <= (word)start) {
+ start = GC_our_memory[i].hs_start
+ + GC_our_memory[i].hs_bytes;
+ ++i;
+ }
+ while (i < GC_n_memory
+ && (word)GC_our_memory[i].hs_start < (word)end
+ && (word)start < (word)end) {
+ if ((word)start < (word)GC_our_memory[i].hs_start)
+ GC_add_roots_inner(start,
+ GC_our_memory[i].hs_start, TRUE);
+ start = GC_our_memory[i].hs_start
+ + GC_our_memory[i].hs_bytes;
+ ++i;
+ }
+ if ((word)start < (word)end)
+ GC_add_roots_inner(start, end, TRUE);
+ } else if (prot[0] == '-' && prot[1] == '-' && prot[2] == '-') {
+ /* Even roots added statically might disappear partially */
+ /* (e.g. the roots added by INCLUDE_LINUX_THREAD_DESCR). */
+ GC_remove_roots_subregion(start, end);
+ }
+ }
+}
+
+GC_INNER void GC_register_dynamic_libraries(void)
+{
+ GC_register_map_entries(GC_get_maps());
+}
+
+/* We now take care of the main data segment ourselves: */
+GC_INNER GC_bool GC_register_main_static_data(void)
+{
+ return FALSE;
+}
+
+# define HAVE_REGISTER_MAIN_STATIC_DATA
+
+#else /* !USE_PROC_FOR_LIBRARIES */
+
+/* The following is the preferred way to walk dynamic libraries */
+/* for glibc 2.2.4+. Unfortunately, it doesn't work for older */
+/* versions. Thanks to Jakub Jelinek for most of the code. */
+
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
+ || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)) \
+ || defined(HOST_ANDROID) /* Are others OK here, too? */
+# ifndef HAVE_DL_ITERATE_PHDR
+# define HAVE_DL_ITERATE_PHDR
+# endif
+# ifdef HOST_ANDROID
+ /* Android headers might have no such definition for some targets. */
+ EXTERN_C_BEGIN
+ extern int dl_iterate_phdr(int (*cb)(struct dl_phdr_info *,
+ size_t, void *),
+ void *data);
+ EXTERN_C_END
+# endif
+#endif /* __GLIBC__ >= 2 || HOST_ANDROID */
+
+#if defined(__DragonFly__) || defined(__FreeBSD_kernel__) \
+ || (defined(FREEBSD) && __FreeBSD__ >= 7)
+ /* On the FreeBSD system, any target system at major version 7 shall */
+ /* have dl_iterate_phdr; therefore, we need not make it weak as below. */
+# ifndef HAVE_DL_ITERATE_PHDR
+# define HAVE_DL_ITERATE_PHDR
+# endif
+# define DL_ITERATE_PHDR_STRONG
+#elif defined(HAVE_DL_ITERATE_PHDR)
+ /* We have the header files for a glibc that includes dl_iterate_phdr.*/
+ /* It may still not be available in the library on the target system. */
+ /* Thus we also treat it as a weak symbol. */
+ EXTERN_C_BEGIN
+# pragma weak dl_iterate_phdr
+ EXTERN_C_END
+#endif
+
+#if defined(HAVE_DL_ITERATE_PHDR)
+
+# ifdef PT_GNU_RELRO
+/* Instead of registering PT_LOAD sections directly, we keep them */
+/* in a temporary list, and filter them by excluding PT_GNU_RELRO */
+/* segments. Processing PT_GNU_RELRO sections with */
+/* GC_exclude_static_roots instead would be superficially cleaner. But */
+/* it runs into trouble if a client registers an overlapping segment, */
+/* which unfortunately seems quite possible. */
+
+# define MAX_LOAD_SEGS MAX_ROOT_SETS
+
+ static struct load_segment {
+ ptr_t start;
+ ptr_t end;
+ /* Room for a second segment if we remove a RELRO segment */
+ /* from the middle. */
+ ptr_t start2;
+ ptr_t end2;
+ } load_segs[MAX_LOAD_SEGS];
+
+ static int n_load_segs;
+ static GC_bool load_segs_overflow;
+# endif /* PT_GNU_RELRO */
+
+STATIC int GC_register_dynlib_callback(struct dl_phdr_info * info,
+ size_t size, void * ptr)
+{
+ const ElfW(Phdr) * p;
+ ptr_t start, end;
+ int i;
+
+ /* Make sure struct dl_phdr_info is at least as big as we need. */
+ if (size < offsetof (struct dl_phdr_info, dlpi_phnum)
+ + sizeof (info->dlpi_phnum))
+ return -1;
+
+ p = info->dlpi_phdr;
+ for (i = 0; i < (int)info->dlpi_phnum; i++, p++) {
+ if (p->p_type == PT_LOAD) {
+ GC_has_static_roots_func callback = GC_has_static_roots;
+ if ((p->p_flags & PF_W) == 0) continue;
+
+ start = (ptr_t)p->p_vaddr + info->dlpi_addr;
+ end = start + p->p_memsz;
+ if (callback != 0 && !callback(info->dlpi_name, start, p->p_memsz))
+ continue;
+# ifdef PT_GNU_RELRO
+# if CPP_WORDSZ == 64
+ /* TODO: GC_push_all eventually does the correct */
+ /* rounding to the next multiple of ALIGNMENT, so, most */
+ /* probably, we should remove the corresponding assertion */
+ /* check in GC_add_roots_inner along with this code line. */
+ /* start pointer value may require aligning. */
+ start = (ptr_t)((word)start & ~(word)(sizeof(word) - 1));
+# endif
+ if (n_load_segs >= MAX_LOAD_SEGS) {
+ if (!load_segs_overflow) {
+ WARN("Too many PT_LOAD segments;"
+ " registering as roots directly...\n", 0);
+ load_segs_overflow = TRUE;
+ }
+ GC_add_roots_inner(start, end, TRUE);
+ } else {
+ load_segs[n_load_segs].start = start;
+ load_segs[n_load_segs].end = end;
+ load_segs[n_load_segs].start2 = 0;
+ load_segs[n_load_segs].end2 = 0;
+ ++n_load_segs;
+ }
+# else
+ GC_add_roots_inner(start, end, TRUE);
+# endif /* !PT_GNU_RELRO */
+ }
+ }
+
+# ifdef PT_GNU_RELRO
+ p = info->dlpi_phdr;
+ for (i = 0; i < (int)info->dlpi_phnum; i++, p++) {
+ if (p->p_type == PT_GNU_RELRO) {
+ /* This entry is known to be constant and will eventually be */
+ /* remapped as read-only. However, the address range covered */
+ /* by this entry is typically a subset of a previously */
+ /* encountered "LOAD" segment, so we need to exclude it. */
+ int j;
+
+ start = (ptr_t)p->p_vaddr + info->dlpi_addr;
+ end = start + p->p_memsz;
+ for (j = n_load_segs; --j >= 0; ) {
+ if ((word)start >= (word)load_segs[j].start
+ && (word)start < (word)load_segs[j].end) {
+ if (load_segs[j].start2 != 0) {
+ WARN("More than one GNU_RELRO segment per load one\n",0);
+ } else {
+ GC_ASSERT((word)end <=
+ (((word)load_segs[j].end + GC_page_size - 1) &
+ ~(word)(GC_page_size - 1)));
+ /* Remove from the existing load segment */
+ load_segs[j].end2 = load_segs[j].end;
+ load_segs[j].end = start;
+ load_segs[j].start2 = end;
+ /* Note that start2 may be greater than end2 because of */
+ /* p->p_memsz value multiple of page size. */
+ }
+ break;
+ }
+ if (0 == j && 0 == GC_has_static_roots)
+ WARN("Failed to find PT_GNU_RELRO segment"
+ " inside PT_LOAD region\n", 0);
+ /* No warning reported in case of the callback is present */
+ /* because most likely the segment has been excluded. */
+ }
+ }
+ }
+# endif
+
+ *(int *)ptr = 1; /* Signal that we were called */
+ return 0;
+}
+
+/* Do we need to separately register the main static data segment? */
+GC_INNER GC_bool GC_register_main_static_data(void)
+{
+# ifdef DL_ITERATE_PHDR_STRONG
+ /* If dl_iterate_phdr is not a weak symbol then don't test against */
+ /* zero (otherwise a compiler might issue a warning). */
+ return FALSE;
+# else
+ return 0 == COVERT_DATAFLOW(dl_iterate_phdr);
+# endif
+}
+
+/* Return TRUE if we succeed, FALSE if dl_iterate_phdr wasn't there. */
+STATIC GC_bool GC_register_dynamic_libraries_dl_iterate_phdr(void)
+{
+ int did_something;
+ if (GC_register_main_static_data())
+ return FALSE;
+
+# ifdef PT_GNU_RELRO
+ {
+ static GC_bool excluded_segs = FALSE;
+ n_load_segs = 0;
+ load_segs_overflow = FALSE;
+ if (!EXPECT(excluded_segs, TRUE)) {
+ GC_exclude_static_roots_inner((ptr_t)load_segs,
+ (ptr_t)load_segs + sizeof(load_segs));
+ excluded_segs = TRUE;
+ }
+ }
+# endif
+
+ did_something = 0;
+ dl_iterate_phdr(GC_register_dynlib_callback, &did_something);
+ if (did_something) {
+# ifdef PT_GNU_RELRO
+ int i;
+
+ for (i = 0; i < n_load_segs; ++i) {
+ if ((word)load_segs[i].end > (word)load_segs[i].start) {
+ GC_add_roots_inner(load_segs[i].start, load_segs[i].end, TRUE);
+ }
+ if ((word)load_segs[i].end2 > (word)load_segs[i].start2) {
+ GC_add_roots_inner(load_segs[i].start2, load_segs[i].end2, TRUE);
+ }
+ }
+# endif
+ } else {
+ ptr_t datastart, dataend;
+# ifdef DATASTART_IS_FUNC
+ static ptr_t datastart_cached = (ptr_t)GC_WORD_MAX;
+
+ /* Evaluate DATASTART only once. */
+ if (datastart_cached == (ptr_t)GC_WORD_MAX) {
+ datastart_cached = DATASTART;
+ }
+ datastart = datastart_cached;
+# else
+ datastart = DATASTART;
+# endif
+# ifdef DATAEND_IS_FUNC
+ {
+ static ptr_t dataend_cached = 0;
+ /* Evaluate DATAEND only once. */
+ if (dataend_cached == 0) {
+ dataend_cached = DATAEND;
+ }
+ dataend = dataend_cached;
+ }
+# else
+ dataend = DATAEND;
+# endif
+ if (NULL == *(char * volatile *)&datastart
+ || (word)datastart > (word)dataend)
+ ABORT_ARG2("Wrong DATASTART/END pair",
+ ": %p .. %p", (void *)datastart, (void *)dataend);
+
+ /* dl_iterate_phdr may forget the static data segment in */
+ /* statically linked executables. */
+ GC_add_roots_inner(datastart, dataend, TRUE);
+# ifdef GC_HAVE_DATAREGION2
+ if ((word)DATASTART2 - 1U >= (word)DATAEND2) {
+ /* Subtract one to check also for NULL */
+ /* without a compiler warning. */
+ ABORT_ARG2("Wrong DATASTART/END2 pair",
+ ": %p .. %p", (void *)DATASTART2, (void *)DATAEND2);
+ }
+ GC_add_roots_inner(DATASTART2, DATAEND2, TRUE);
+# endif
+ }
+ return TRUE;
+}
+
+# define HAVE_REGISTER_MAIN_STATIC_DATA
+
+#else /* !HAVE_DL_ITERATE_PHDR */
+
+/* Dynamic loading code for Linux running ELF. Somewhat tested on
+ * Linux/x86, untested but hopefully should work on Linux/Alpha.
+ * This code was derived from the Solaris/ELF support. Thanks to
+ * whatever kind soul wrote that. - Patrick Bridges */
+
+/* This doesn't necessarily work in all cases, e.g. with preloaded
+ * dynamic libraries. */
+
+# if defined(NETBSD) || defined(OPENBSD)
+# include <sys/exec_elf.h>
+ /* for compatibility with 1.4.x */
+# ifndef DT_DEBUG
+# define DT_DEBUG 21
+# endif
+# ifndef PT_LOAD
+# define PT_LOAD 1
+# endif
+# ifndef PF_W
+# define PF_W 2
+# endif
+# elif !defined(HOST_ANDROID)
+# include <elf.h>
+# endif
+
+# ifndef HOST_ANDROID
+# include <link.h>
+# endif
+
+#endif /* !HAVE_DL_ITERATE_PHDR */
+
+EXTERN_C_BEGIN
+#ifdef __GNUC__
+# pragma weak _DYNAMIC
+#endif
+extern ElfW(Dyn) _DYNAMIC[];
+EXTERN_C_END
+
+STATIC struct link_map *
+GC_FirstDLOpenedLinkMap(void)
+{
+ static struct link_map *cachedResult = 0;
+
+ if (0 == COVERT_DATAFLOW(_DYNAMIC)) {
+ /* _DYNAMIC symbol not resolved. */
+ return(0);
+ }
+ if( cachedResult == 0 ) {
+# if defined(NETBSD) && defined(RTLD_DI_LINKMAP)
+# if defined(CPPCHECK)
+# define GC_RTLD_DI_LINKMAP 2
+# else
+# define GC_RTLD_DI_LINKMAP RTLD_DI_LINKMAP
+# endif
+ struct link_map *lm = NULL;
+ if (!dlinfo(RTLD_SELF, GC_RTLD_DI_LINKMAP, &lm) && lm != NULL) {
+ /* Now lm points link_map object of libgc. Since it */
+ /* might not be the first dynamically linked object, */
+ /* try to find it (object next to the main object). */
+ while (lm->l_prev != NULL) {
+ lm = lm->l_prev;
+ }
+ cachedResult = lm->l_next;
+ }
+# else
+ ElfW(Dyn) *dp;
+ int tag;
+
+ for( dp = _DYNAMIC; (tag = dp->d_tag) != 0; dp++ ) {
+ if (tag == DT_DEBUG) {
+ struct r_debug *rd = (struct r_debug *)dp->d_un.d_ptr;
+ /* d_ptr could be null if libs are linked statically. */
+ if (rd != NULL) {
+ struct link_map *lm = rd->r_map;
+ if (lm != NULL)
+ cachedResult = lm->l_next; /* might be NULL */
+ }
+ break;
+ }
+ }
+# endif /* !NETBSD || !RTLD_DI_LINKMAP */
+ }
+ return cachedResult;
+}
+
+GC_INNER void GC_register_dynamic_libraries(void)
+{
+ struct link_map *lm;
+
+# ifdef HAVE_DL_ITERATE_PHDR
+ if (GC_register_dynamic_libraries_dl_iterate_phdr()) {
+ return;
+ }
+# endif
+ for (lm = GC_FirstDLOpenedLinkMap(); lm != 0; lm = lm->l_next)
+ {
+ ElfW(Ehdr) * e;
+ ElfW(Phdr) * p;
+ unsigned long offset;
+ char * start;
+ int i;
+
+ e = (ElfW(Ehdr) *) lm->l_addr;
+# ifdef HOST_ANDROID
+ if (e == NULL)
+ continue;
+# endif
+ p = ((ElfW(Phdr) *)(((char *)(e)) + e->e_phoff));
+ offset = ((unsigned long)(lm->l_addr));
+ for( i = 0; i < (int)e->e_phnum; i++, p++ ) {
+ switch( p->p_type ) {
+ case PT_LOAD:
+ {
+ if( !(p->p_flags & PF_W) ) break;
+ start = ((char *)(p->p_vaddr)) + offset;
+ GC_add_roots_inner(start, start + p->p_memsz, TRUE);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
+
+#endif /* !USE_PROC_FOR_LIBRARIES */
+
+#endif /* LINUX */
+
+#if defined(IRIX5) || (defined(USE_PROC_FOR_LIBRARIES) && !defined(LINUX))
+
+#include <sys/procfs.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <elf.h>
+#include <errno.h>
+#include <signal.h> /* Only for the following test. */
+#ifndef _sigargs
+# define IRIX6
+#endif
+
+/* We use /proc to track down all parts of the address space that are */
+/* mapped by the process, and throw out regions we know we shouldn't */
+/* worry about. This may also work under other SVR4 variants. */
+GC_INNER void GC_register_dynamic_libraries(void)
+{
+ static int fd = -1;
+ char buf[30];
+ static prmap_t * addr_map = 0;
+ static int current_sz = 0; /* Number of records currently in addr_map */
+ int needed_sz = 0; /* Required size of addr_map */
+ int i;
+ long flags;
+ ptr_t start;
+ ptr_t limit;
+ ptr_t heap_start = HEAP_START;
+ ptr_t heap_end = heap_start;
+
+# ifdef SOLARISDL
+# define MA_PHYS 0
+# endif /* SOLARISDL */
+
+ if (fd < 0) {
+ (void)snprintf(buf, sizeof(buf), "/proc/%ld", (long)getpid());
+ buf[sizeof(buf) - 1] = '\0';
+ fd = open(buf, O_RDONLY);
+ if (fd < 0) {
+ ABORT("/proc open failed");
+ }
+ }
+ if (ioctl(fd, PIOCNMAP, &needed_sz) < 0) {
+ ABORT_ARG2("/proc PIOCNMAP ioctl failed",
+ ": fd= %d, errno= %d", fd, errno);
+ }
+ if (needed_sz >= current_sz) {
+ GC_scratch_recycle_no_gww(addr_map,
+ (size_t)current_sz * sizeof(prmap_t));
+ current_sz = needed_sz * 2 + 1;
+ /* Expansion, plus room for 0 record */
+ addr_map = (prmap_t *)GC_scratch_alloc(
+ (size_t)current_sz * sizeof(prmap_t));
+ if (addr_map == NULL)
+ ABORT("Insufficient memory for address map");
+ }
+ if (ioctl(fd, PIOCMAP, addr_map) < 0) {
+ ABORT_ARG3("/proc PIOCMAP ioctl failed",
+ ": errcode= %d, needed_sz= %d, addr_map= %p",
+ errno, needed_sz, (void *)addr_map);
+ }
+ if (GC_n_heap_sects > 0) {
+ heap_end = GC_heap_sects[GC_n_heap_sects-1].hs_start
+ + GC_heap_sects[GC_n_heap_sects-1].hs_bytes;
+ if ((word)heap_end < (word)GC_scratch_last_end_ptr)
+ heap_end = GC_scratch_last_end_ptr;
+ }
+ for (i = 0; i < needed_sz; i++) {
+ flags = addr_map[i].pr_mflags;
+ if ((flags & (MA_BREAK | MA_STACK | MA_PHYS
+ | MA_FETCHOP | MA_NOTCACHED)) != 0) goto irrelevant;
+ if ((flags & (MA_READ | MA_WRITE)) != (MA_READ | MA_WRITE))
+ goto irrelevant;
+ /* The latter test is empirically useless in very old Irix */
+ /* versions. Other than the */
+ /* main data and stack segments, everything appears to be */
+ /* mapped readable, writable, executable, and shared(!!). */
+ /* This makes no sense to me. - HB */
+ start = (ptr_t)(addr_map[i].pr_vaddr);
+ if (GC_roots_present(start)) goto irrelevant;
+ if ((word)start < (word)heap_end && (word)start >= (word)heap_start)
+ goto irrelevant;
+
+ limit = start + addr_map[i].pr_size;
+ /* The following seemed to be necessary for very old versions */
+ /* of Irix, but it has been reported to discard relevant */
+ /* segments under Irix 6.5. */
+# ifndef IRIX6
+ if (addr_map[i].pr_off == 0 && strncmp(start, ELFMAG, 4) == 0) {
+ /* Discard text segments, i.e. 0-offset mappings against */
+ /* executable files which appear to have ELF headers. */
+ caddr_t arg;
+ int obj;
+# define MAP_IRR_SZ 10
+ static ptr_t map_irr[MAP_IRR_SZ];
+ /* Known irrelevant map entries */
+ static int n_irr = 0;
+ struct stat buf;
+ int j;
+
+ for (j = 0; j < n_irr; j++) {
+ if (map_irr[j] == start) goto irrelevant;
+ }
+ arg = (caddr_t)start;
+ obj = ioctl(fd, PIOCOPENM, &arg);
+ if (obj >= 0) {
+ fstat(obj, &buf);
+ close(obj);
+ if ((buf.st_mode & 0111) != 0) {
+ if (n_irr < MAP_IRR_SZ) {
+ map_irr[n_irr++] = start;
+ }
+ goto irrelevant;
+ }
+ }
+ }
+# endif /* !IRIX6 */
+ GC_add_roots_inner(start, limit, TRUE);
+ irrelevant: ;
+ }
+ /* Don't keep cached descriptor, for now. Some kernels don't like us */
+ /* to keep a /proc file descriptor around during kill -9. */
+ /* Otherwise, it should also require FD_CLOEXEC and proper handling */
+ /* at fork (i.e. close because of the pid change). */
+ if (close(fd) < 0) ABORT("Couldn't close /proc file");
+ fd = -1;
+}
+
+# endif /* USE_PROC_FOR_LIBRARIES || IRIX5 */
+
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+
+# include <stdlib.h>
+
+ /* We traverse the entire address space and register all segments */
+ /* that could possibly have been written to. */
+ STATIC void GC_cond_add_roots(char *base, char * limit)
+ {
+# ifdef GC_WIN32_THREADS
+ char * curr_base = base;
+ char * next_stack_lo;
+ char * next_stack_hi;
+
+ if (base == limit) return;
+ for(;;) {
+ GC_get_next_stack(curr_base, limit, &next_stack_lo, &next_stack_hi);
+ if ((word)next_stack_lo >= (word)limit) break;
+ if ((word)next_stack_lo > (word)curr_base)
+ GC_add_roots_inner(curr_base, next_stack_lo, TRUE);
+ curr_base = next_stack_hi;
+ }
+ if ((word)curr_base < (word)limit)
+ GC_add_roots_inner(curr_base, limit, TRUE);
+# else
+ char * stack_top
+ = (char *)((word)GC_approx_sp() &
+ ~(word)(GC_sysinfo.dwAllocationGranularity - 1));
+
+ if (base == limit) return;
+ if ((word)limit > (word)stack_top
+ && (word)base < (word)GC_stackbottom) {
+ /* Part of the stack; ignore it. */
+ return;
+ }
+ GC_add_roots_inner(base, limit, TRUE);
+# endif
+ }
+
+#ifdef DYNAMIC_LOADING
+ /* GC_register_main_static_data is not needed unless DYNAMIC_LOADING. */
+ GC_INNER GC_bool GC_register_main_static_data(void)
+ {
+# if defined(MSWINCE) || defined(CYGWIN32)
+ /* Do we need to separately register the main static data segment? */
+ return FALSE;
+# else
+ return GC_no_win32_dlls;
+# endif
+ }
+# define HAVE_REGISTER_MAIN_STATIC_DATA
+#endif /* DYNAMIC_LOADING */
+
+# ifdef DEBUG_VIRTUALQUERY
+ void GC_dump_meminfo(MEMORY_BASIC_INFORMATION *buf)
+ {
+ GC_printf("BaseAddress= 0x%lx, AllocationBase= 0x%lx,"
+ " RegionSize= 0x%lx(%lu)\n",
+ buf -> BaseAddress, buf -> AllocationBase,
+ buf -> RegionSize, buf -> RegionSize);
+ GC_printf("\tAllocationProtect= 0x%lx, State= 0x%lx, Protect= 0x%lx, "
+ "Type= 0x%lx\n", buf -> AllocationProtect, buf -> State,
+ buf -> Protect, buf -> Type);
+ }
+# endif /* DEBUG_VIRTUALQUERY */
+
+# if defined(MSWINCE) || defined(CYGWIN32)
+ /* FIXME: Should we really need to scan MEM_PRIVATE sections? */
+ /* For now, we don't add MEM_PRIVATE sections to the data roots for */
+ /* WinCE because otherwise SEGV fault sometimes happens to occur in */
+ /* GC_mark_from() (and, even if we use WRAP_MARK_SOME, WinCE prints */
+ /* a "Data Abort" message to the debugging console). */
+ /* To workaround that, use -DGC_REGISTER_MEM_PRIVATE. */
+# define GC_wnt TRUE
+# endif
+
+ GC_INNER void GC_register_dynamic_libraries(void)
+ {
+ MEMORY_BASIC_INFORMATION buf;
+ DWORD protect;
+ LPVOID p;
+ char * base;
+ char * limit;
+
+# ifdef MSWIN32
+ if (GC_no_win32_dlls) return;
+# endif
+ p = GC_sysinfo.lpMinimumApplicationAddress;
+ base = limit = (char *)p;
+ while ((word)p < (word)GC_sysinfo.lpMaximumApplicationAddress) {
+ size_t result = VirtualQuery(p, &buf, sizeof(buf));
+
+# ifdef MSWINCE
+ if (result == 0) {
+ if ((word)p > GC_WORD_MAX - GC_sysinfo.dwAllocationGranularity)
+ break; /* overflow */
+ /* Page is free; advance to the next possible allocation base. */
+ p = (LPVOID)(((DWORD)p + GC_sysinfo.dwAllocationGranularity)
+ & ~(GC_sysinfo.dwAllocationGranularity-1));
+ } else
+# endif
+ /* else */ {
+ if (result != sizeof(buf)) {
+ ABORT("Weird VirtualQuery result");
+ }
+ if ((word)p > GC_WORD_MAX - buf.RegionSize) break; /* overflow */
+
+ protect = buf.Protect;
+ if (buf.State == MEM_COMMIT
+ && (protect == PAGE_EXECUTE_READWRITE
+ || protect == PAGE_EXECUTE_WRITECOPY
+ || protect == PAGE_READWRITE
+ || protect == PAGE_WRITECOPY)
+ && (buf.Type == MEM_IMAGE
+# ifdef GC_REGISTER_MEM_PRIVATE
+ || (protect == PAGE_READWRITE && buf.Type == MEM_PRIVATE)
+# else
+ /* There is some evidence that we cannot always */
+ /* ignore MEM_PRIVATE sections under Windows ME */
+ /* and predecessors. Hence we now also check for */
+ /* that case. */
+ || (!GC_wnt && buf.Type == MEM_PRIVATE)
+# endif
+ )
+ && !GC_is_heap_base(buf.AllocationBase)) {
+# ifdef DEBUG_VIRTUALQUERY
+ GC_dump_meminfo(&buf);
+# endif
+ if ((char *)p != limit) {
+ GC_cond_add_roots(base, limit);
+ base = (char *)p;
+ }
+ limit = (char *)p + buf.RegionSize;
+ }
+ p = (char *)p + buf.RegionSize;
+ }
+ }
+ GC_cond_add_roots(base, limit);
+ }
+
+#endif /* MSWIN32 || MSWINCE || CYGWIN32 */
+
+#if defined(ALPHA) && defined(OSF1)
+
+#include <loader.h>
+
+EXTERN_C_BEGIN
+extern char *sys_errlist[];
+extern int sys_nerr;
+extern int errno;
+EXTERN_C_END
+
+GC_INNER void GC_register_dynamic_libraries(void)
+{
+ ldr_module_t moduleid = LDR_NULL_MODULE;
+ ldr_process_t mypid = ldr_my_process(); /* obtain id of this process */
+
+ /* For each module */
+ while (TRUE) {
+ ldr_module_info_t moduleinfo;
+ size_t modulereturnsize;
+ ldr_region_t region;
+ ldr_region_info_t regioninfo;
+ size_t regionreturnsize;
+ int status = ldr_next_module(mypid, &moduleid);
+ /* Get the next (first) module */
+
+ /* Any more modules? */
+ if (moduleid == LDR_NULL_MODULE)
+ break; /* No more modules */
+
+ /* Check status AFTER checking moduleid because */
+ /* of a bug in the non-shared ldr_next_module stub. */
+ if (status != 0) {
+ ABORT_ARG3("ldr_next_module failed",
+ ": status= %d, errcode= %d (%s)", status, errno,
+ errno < sys_nerr ? sys_errlist[errno] : "");
+ }
+
+ /* Get the module information */
+ status = ldr_inq_module(mypid, moduleid, &moduleinfo,
+ sizeof(moduleinfo), &modulereturnsize);
+ if (status != 0 )
+ ABORT("ldr_inq_module failed");
+
+ /* is module for the main program (i.e. nonshared portion)? */
+ if (moduleinfo.lmi_flags & LDR_MAIN)
+ continue; /* skip the main module */
+
+# ifdef DL_VERBOSE
+ GC_log_printf("---Module---\n");
+ GC_log_printf("Module ID: %ld\n", moduleinfo.lmi_modid);
+ GC_log_printf("Count of regions: %d\n", moduleinfo.lmi_nregion);
+ GC_log_printf("Flags for module: %016lx\n", moduleinfo.lmi_flags);
+ GC_log_printf("Module pathname: \"%s\"\n", moduleinfo.lmi_name);
+# endif
+
+ /* For each region in this module */
+ for (region = 0; region < moduleinfo.lmi_nregion; region++) {
+ /* Get the region information */
+ status = ldr_inq_region(mypid, moduleid, region, &regioninfo,
+ sizeof(regioninfo), &regionreturnsize);
+ if (status != 0 )
+ ABORT("ldr_inq_region failed");
+
+ /* only process writable (data) regions */
+ if (! (regioninfo.lri_prot & LDR_W))
+ continue;
+
+# ifdef DL_VERBOSE
+ GC_log_printf("--- Region ---\n");
+ GC_log_printf("Region number: %ld\n", regioninfo.lri_region_no);
+ GC_log_printf("Protection flags: %016x\n", regioninfo.lri_prot);
+ GC_log_printf("Virtual address: %p\n", regioninfo.lri_vaddr);
+ GC_log_printf("Mapped address: %p\n", regioninfo.lri_mapaddr);
+ GC_log_printf("Region size: %ld\n", regioninfo.lri_size);
+ GC_log_printf("Region name: \"%s\"\n", regioninfo.lri_name);
+# endif
+
+ /* register region as a garbage collection root */
+ GC_add_roots_inner((char *)regioninfo.lri_mapaddr,
+ (char *)regioninfo.lri_mapaddr + regioninfo.lri_size,
+ TRUE);
+
+ }
+ }
+}
+#endif
+
+#if defined(HPUX)
+
+#include <errno.h>
+#include <dl.h>
+
+EXTERN_C_BEGIN
+extern char *sys_errlist[];
+extern int sys_nerr;
+EXTERN_C_END
+
+GC_INNER void GC_register_dynamic_libraries(void)
+{
+ int index = 1; /* Ordinal position in shared library search list */
+
+ /* For each dynamic library loaded */
+ while (TRUE) {
+ struct shl_descriptor *shl_desc; /* Shared library info, see dl.h */
+ int status = shl_get(index, &shl_desc);
+ /* Get info about next shared library */
+
+ /* Check if this is the end of the list or if some error occurred */
+ if (status != 0) {
+# ifdef GC_HPUX_THREADS
+ /* I've seen errno values of 0. The man page is not clear */
+ /* as to whether errno should get set on a -1 return. */
+ break;
+# else
+ if (errno == EINVAL) {
+ break; /* Moved past end of shared library list --> finished */
+ } else {
+ ABORT_ARG3("shl_get failed",
+ ": status= %d, errcode= %d (%s)", status, errno,
+ errno < sys_nerr ? sys_errlist[errno] : "");
+ }
+# endif
+ }
+
+# ifdef DL_VERBOSE
+ GC_log_printf("---Shared library---\n");
+ GC_log_printf("filename= \"%s\"\n", shl_desc->filename);
+ GC_log_printf("index= %d\n", index);
+ GC_log_printf("handle= %08x\n", (unsigned long) shl_desc->handle);
+ GC_log_printf("text seg.start= %08x\n", shl_desc->tstart);
+ GC_log_printf("text seg.end= %08x\n", shl_desc->tend);
+ GC_log_printf("data seg.start= %08x\n", shl_desc->dstart);
+ GC_log_printf("data seg.end= %08x\n", shl_desc->dend);
+ GC_log_printf("ref.count= %lu\n", shl_desc->ref_count);
+# endif
+
+ /* register shared library's data segment as a garbage collection root */
+ GC_add_roots_inner((char *) shl_desc->dstart,
+ (char *) shl_desc->dend, TRUE);
+
+ index++;
+ }
+}
+#endif /* HPUX */
+
+#ifdef AIX
+# include <alloca.h>
+# include <sys/ldr.h>
+# include <sys/errno.h>
+ GC_INNER void GC_register_dynamic_libraries(void)
+ {
+ int ldibuflen = 8192;
+
+ for (;;) {
+ int len;
+ struct ld_info *ldi;
+# if defined(CPPCHECK)
+ char ldibuf[ldibuflen];
+# else
+ char *ldibuf = alloca(ldibuflen);
+# endif
+
+ len = loadquery(L_GETINFO, ldibuf, ldibuflen);
+ if (len < 0) {
+ if (errno != ENOMEM) {
+ ABORT("loadquery failed");
+ }
+ ldibuflen *= 2;
+ continue;
+ }
+
+ ldi = (struct ld_info *)ldibuf;
+ while (ldi) {
+ len = ldi->ldinfo_next;
+ GC_add_roots_inner(
+ ldi->ldinfo_dataorg,
+ (ptr_t)(unsigned long)ldi->ldinfo_dataorg
+ + ldi->ldinfo_datasize,
+ TRUE);
+ ldi = len ? (struct ld_info *)((char *)ldi + len) : 0;
+ }
+ break;
+ }
+ }
+#endif /* AIX */
+
+#ifdef DARWIN
+
+/* __private_extern__ hack required for pre-3.4 gcc versions. */
+#ifndef __private_extern__
+# define __private_extern__ extern
+# include <mach-o/dyld.h>
+# undef __private_extern__
+#else
+# include <mach-o/dyld.h>
+#endif
+#include <mach-o/getsect.h>
+
+/*#define DARWIN_DEBUG*/
+
+/* Writable sections generally available on Darwin. */
+STATIC const struct dyld_sections_s {
+ const char *seg;
+ const char *sect;
+} GC_dyld_sections[] = {
+ { SEG_DATA, SECT_DATA },
+ /* Used by FSF GCC, but not by OS X system tools, so far. */
+ { SEG_DATA, "__static_data" },
+ { SEG_DATA, SECT_BSS },
+ { SEG_DATA, SECT_COMMON },
+ /* FSF GCC - zero-sized object sections for targets */
+ /*supporting section anchors. */
+ { SEG_DATA, "__zobj_data" },
+ { SEG_DATA, "__zobj_bss" }
+};
+
+/* Additional writable sections: */
+/* GCC on Darwin constructs aligned sections "on demand", where */
+/* the alignment size is embedded in the section name. */
+/* Furthermore, there are distinctions between sections */
+/* containing private vs. public symbols. It also constructs */
+/* sections specifically for zero-sized objects, when the */
+/* target supports section anchors. */
+STATIC const char * const GC_dyld_add_sect_fmts[] = {
+ "__bss%u",
+ "__pu_bss%u",
+ "__zo_bss%u",
+ "__zo_pu_bss%u"
+};
+
+/* Currently, mach-o will allow up to the max of 2^15 alignment */
+/* in an object file. */
+#ifndef L2_MAX_OFILE_ALIGNMENT
+# define L2_MAX_OFILE_ALIGNMENT 15
+#endif
+
+STATIC const char *GC_dyld_name_for_hdr(const struct GC_MACH_HEADER *hdr)
+{
+ unsigned long i, c;
+ c = _dyld_image_count();
+ for (i = 0; i < c; i++)
+ if ((const struct GC_MACH_HEADER *)_dyld_get_image_header(i) == hdr)
+ return _dyld_get_image_name(i);
+ return NULL;
+}
+
+/* This should never be called by a thread holding the lock. */
+STATIC void GC_dyld_image_add(const struct GC_MACH_HEADER *hdr,
+ intptr_t slide)
+{
+ unsigned long start, end;
+ unsigned i, j;
+ const struct GC_MACH_SECTION *sec;
+ const char *name;
+ GC_has_static_roots_func callback = GC_has_static_roots;
+ DCL_LOCK_STATE;
+
+ if (GC_no_dls) return;
+# ifdef DARWIN_DEBUG
+ name = GC_dyld_name_for_hdr(hdr);
+# else
+ name = callback != 0 ? GC_dyld_name_for_hdr(hdr) : NULL;
+# endif
+ for (i = 0; i < sizeof(GC_dyld_sections)/sizeof(GC_dyld_sections[0]); i++) {
+ sec = GC_GETSECTBYNAME(hdr, GC_dyld_sections[i].seg,
+ GC_dyld_sections[i].sect);
+ if (sec == NULL || sec->size < sizeof(word))
+ continue;
+ start = slide + sec->addr;
+ end = start + sec->size;
+ LOCK();
+ /* The user callback is called holding the lock. */
+ if (callback == 0 || callback(name, (void*)start, (size_t)sec->size)) {
+# ifdef DARWIN_DEBUG
+ GC_log_printf(
+ "Adding section __DATA,%s at %p-%p (%lu bytes) from image %s\n",
+ GC_dyld_sections[i].sect, (void*)start, (void*)end,
+ (unsigned long)sec->size, name);
+# endif
+ GC_add_roots_inner((ptr_t)start, (ptr_t)end, FALSE);
+ }
+ UNLOCK();
+ }
+
+ /* Sections constructed on demand. */
+ for (j = 0; j < sizeof(GC_dyld_add_sect_fmts) / sizeof(char *); j++) {
+ const char *fmt = GC_dyld_add_sect_fmts[j];
+
+ /* Add our manufactured aligned BSS sections. */
+ for (i = 0; i <= L2_MAX_OFILE_ALIGNMENT; i++) {
+ char secnam[16];
+
+ (void)snprintf(secnam, sizeof(secnam), fmt, (unsigned)i);
+ secnam[sizeof(secnam) - 1] = '\0';
+ sec = GC_GETSECTBYNAME(hdr, SEG_DATA, secnam);
+ if (sec == NULL || sec->size == 0)
+ continue;
+ start = slide + sec->addr;
+ end = start + sec->size;
+# ifdef DARWIN_DEBUG
+ GC_log_printf("Adding on-demand section __DATA,%s at"
+ " %p-%p (%lu bytes) from image %s\n",
+ secnam, (void*)start, (void*)end,
+ (unsigned long)sec->size, name);
+# endif
+ GC_add_roots((char*)start, (char*)end);
+ }
+ }
+
+# if defined(DARWIN_DEBUG) && !defined(NO_DEBUGGING)
+ LOCK();
+ GC_print_static_roots();
+ UNLOCK();
+# endif
+}
+
+/* This should never be called by a thread holding the lock. */
+STATIC void GC_dyld_image_remove(const struct GC_MACH_HEADER *hdr,
+ intptr_t slide)
+{
+ unsigned long start, end;
+ unsigned i, j;
+ const struct GC_MACH_SECTION *sec;
+# if defined(DARWIN_DEBUG) && !defined(NO_DEBUGGING)
+ DCL_LOCK_STATE;
+# endif
+
+ for (i = 0; i < sizeof(GC_dyld_sections)/sizeof(GC_dyld_sections[0]); i++) {
+ sec = GC_GETSECTBYNAME(hdr, GC_dyld_sections[i].seg,
+ GC_dyld_sections[i].sect);
+ if (sec == NULL || sec->size == 0)
+ continue;
+ start = slide + sec->addr;
+ end = start + sec->size;
+# ifdef DARWIN_DEBUG
+ GC_log_printf(
+ "Removing section __DATA,%s at %p-%p (%lu bytes) from image %s\n",
+ GC_dyld_sections[i].sect, (void*)start, (void*)end,
+ (unsigned long)sec->size, GC_dyld_name_for_hdr(hdr));
+# endif
+ GC_remove_roots((char*)start, (char*)end);
+ }
+
+ /* Remove our on-demand sections. */
+ for (j = 0; j < sizeof(GC_dyld_add_sect_fmts) / sizeof(char *); j++) {
+ const char *fmt = GC_dyld_add_sect_fmts[j];
+
+ for (i = 0; i <= L2_MAX_OFILE_ALIGNMENT; i++) {
+ char secnam[16];
+
+ (void)snprintf(secnam, sizeof(secnam), fmt, (unsigned)i);
+ secnam[sizeof(secnam) - 1] = '\0';
+ sec = GC_GETSECTBYNAME(hdr, SEG_DATA, secnam);
+ if (sec == NULL || sec->size == 0)
+ continue;
+ start = slide + sec->addr;
+ end = start + sec->size;
+# ifdef DARWIN_DEBUG
+ GC_log_printf("Removing on-demand section __DATA,%s at"
+ " %p-%p (%lu bytes) from image %s\n", secnam,
+ (void*)start, (void*)end, (unsigned long)sec->size,
+ GC_dyld_name_for_hdr(hdr));
+# endif
+ GC_remove_roots((char*)start, (char*)end);
+ }
+ }
+
+# if defined(DARWIN_DEBUG) && !defined(NO_DEBUGGING)
+ LOCK();
+ GC_print_static_roots();
+ UNLOCK();
+# endif
+}
+
+GC_INNER void GC_register_dynamic_libraries(void)
+{
+ /* Currently does nothing. The callbacks are setup by GC_init_dyld()
+ The dyld library takes it from there. */
+}
+
+/* The _dyld_* functions have an internal lock so no _dyld functions
+ can be called while the world is stopped without the risk of a deadlock.
+ Because of this we MUST setup callbacks BEFORE we ever stop the world.
+ This should be called BEFORE any thread is created and WITHOUT the
+ allocation lock held. */
+
+GC_INNER void GC_init_dyld(void)
+{
+ static GC_bool initialized = FALSE;
+
+ if (initialized) return;
+
+# ifdef DARWIN_DEBUG
+ GC_log_printf("Registering dyld callbacks...\n");
+# endif
+
+ /* Apple's Documentation:
+ When you call _dyld_register_func_for_add_image, the dynamic linker
+ runtime calls the specified callback (func) once for each of the images
+ that is currently loaded into the program. When a new image is added to
+ the program, your callback is called again with the mach_header for the
+ new image, and the virtual memory slide amount of the new image.
+
+ This WILL properly register already linked libraries and libraries
+ linked in the future.
+ */
+ _dyld_register_func_for_add_image(
+ (void (*)(const struct mach_header*, intptr_t))GC_dyld_image_add);
+ _dyld_register_func_for_remove_image(
+ (void (*)(const struct mach_header*, intptr_t))GC_dyld_image_remove);
+ /* Structure mach_header_64 has the same fields */
+ /* as mach_header except for the reserved one */
+ /* at the end, so these casts are OK. */
+
+ /* Set this early to avoid reentrancy issues. */
+ initialized = TRUE;
+
+# ifdef NO_DYLD_BIND_FULLY_IMAGE
+ /* FIXME: What should we do in this case? */
+# else
+ if (GC_no_dls) return; /* skip main data segment registration */
+
+ /* When the environment variable is set, the dynamic linker binds */
+ /* all undefined symbols the application needs at launch time. */
+ /* This includes function symbols that are normally bound lazily at */
+ /* the time of their first invocation. */
+ if (GETENV("DYLD_BIND_AT_LAUNCH") == 0) {
+ /* The environment variable is unset, so we should bind manually. */
+# ifdef DARWIN_DEBUG
+ GC_log_printf("Forcing full bind of GC code...\n");
+# endif
+ /* FIXME: '_dyld_bind_fully_image_containing_address' is deprecated. */
+ if (!_dyld_bind_fully_image_containing_address(
+ (unsigned long *)GC_malloc))
+ ABORT("_dyld_bind_fully_image_containing_address failed");
+ }
+# endif
+}
+
+#define HAVE_REGISTER_MAIN_STATIC_DATA
+GC_INNER GC_bool GC_register_main_static_data(void)
+{
+ /* Already done through dyld callbacks */
+ return FALSE;
+}
+
+#endif /* DARWIN */
+
+#if defined(HAIKU)
+# include <kernel/image.h>
+
+ GC_INNER void GC_register_dynamic_libraries(void)
+ {
+ image_info info;
+ int32 cookie = 0;
+
+ while (get_next_image_info(0, &cookie, &info) == B_OK) {
+ ptr_t data = (ptr_t)info.data;
+ GC_add_roots_inner(data, data + info.data_size, TRUE);
+ }
+ }
+#endif /* HAIKU */
+
+#elif defined(PCR)
+
+# include "il/PCR_IL.h"
+# include "th/PCR_ThCtl.h"
+# include "mm/PCR_MM.h"
+
+ GC_INNER void GC_register_dynamic_libraries(void)
+ {
+ /* Add new static data areas of dynamically loaded modules. */
+ PCR_IL_LoadedFile * p = PCR_IL_GetLastLoadedFile();
+ PCR_IL_LoadedSegment * q;
+
+ /* Skip uncommitted files */
+ while (p != NIL && !(p -> lf_commitPoint)) {
+ /* The loading of this file has not yet been committed */
+ /* Hence its description could be inconsistent. */
+ /* Furthermore, it hasn't yet been run. Hence its data */
+ /* segments can't possibly reference heap allocated */
+ /* objects. */
+ p = p -> lf_prev;
+ }
+ for (; p != NIL; p = p -> lf_prev) {
+ for (q = p -> lf_ls; q != NIL; q = q -> ls_next) {
+ if ((q -> ls_flags & PCR_IL_SegFlags_Traced_MASK)
+ == PCR_IL_SegFlags_Traced_on) {
+ GC_add_roots_inner((ptr_t)q->ls_addr,
+ (ptr_t)q->ls_addr + q->ls_bytes, TRUE);
+ }
+ }
+ }
+ }
+#endif /* PCR && !DYNAMIC_LOADING && !MSWIN32 */
+
+#if !defined(HAVE_REGISTER_MAIN_STATIC_DATA) && defined(DYNAMIC_LOADING)
+ /* Do we need to separately register the main static data segment? */
+ GC_INNER GC_bool GC_register_main_static_data(void)
+ {
+ return TRUE;
+ }
+#endif /* HAVE_REGISTER_MAIN_STATIC_DATA */
+
+/* Register a routine to filter dynamic library registration. */
+GC_API void GC_CALL GC_register_has_static_roots_callback(
+ GC_has_static_roots_func callback)
+{
+ GC_has_static_roots = callback;
+}
diff --git a/graphics/asymptote/gc/extra/AmigaOS.c b/graphics/asymptote/gc/extra/AmigaOS.c
new file mode 100644
index 0000000000..e81af6fecc
--- /dev/null
+++ b/graphics/asymptote/gc/extra/AmigaOS.c
@@ -0,0 +1,544 @@
+
+
+/******************************************************************
+
+ AmigaOS-specific routines for GC.
+ This file is normally included from os_dep.c
+
+******************************************************************/
+
+
+#if !defined(GC_AMIGA_DEF) && !defined(GC_AMIGA_SB) && !defined(GC_AMIGA_DS) && !defined(GC_AMIGA_AM)
+# include "private/gc_priv.h"
+# include <stdio.h>
+# include <signal.h>
+# define GC_AMIGA_DEF
+# define GC_AMIGA_SB
+# define GC_AMIGA_DS
+# define GC_AMIGA_AM
+#endif
+
+
+#ifdef GC_AMIGA_DEF
+
+# ifndef __GNUC__
+# include <exec/exec.h>
+# endif
+# include <proto/exec.h>
+# include <proto/dos.h>
+# include <dos/dosextens.h>
+# include <workbench/startup.h>
+
+#endif
+
+
+
+
+#ifdef GC_AMIGA_SB
+
+/******************************************************************
+ Find the base of the stack.
+******************************************************************/
+
+ptr_t GC_get_main_stack_base(void)
+{
+ struct Process *proc = (struct Process*)SysBase->ThisTask;
+
+ /* Reference: Amiga Guru Book Pages: 42,567,574 */
+ if (proc->pr_Task.tc_Node.ln_Type==NT_PROCESS
+ && proc->pr_CLI != NULL) {
+ /* first ULONG is StackSize */
+ /*longPtr = proc->pr_ReturnAddr;
+ size = longPtr[0];*/
+
+ return (char *)proc->pr_ReturnAddr + sizeof(ULONG);
+ } else {
+ return (char *)proc->pr_Task.tc_SPUpper;
+ }
+}
+
+#endif
+
+
+#ifdef GC_AMIGA_DS
+/******************************************************************
+ Register data segments.
+******************************************************************/
+
+ void GC_register_data_segments(void)
+ {
+ struct Process *proc;
+ struct CommandLineInterface *cli;
+ BPTR myseglist;
+ ULONG *data;
+
+# ifdef __GNUC__
+ ULONG dataSegSize;
+ GC_bool found_segment = FALSE;
+ extern char __data_size[];
+
+ dataSegSize=__data_size+8;
+ /* Can`t find the Location of __data_size, because
+ it`s possible that is it, inside the segment. */
+
+# endif
+
+ proc= (struct Process*)SysBase->ThisTask;
+
+ /* Reference: Amiga Guru Book Pages: 538ff,565,573
+ and XOper.asm */
+ myseglist = proc->pr_SegList;
+ if (proc->pr_Task.tc_Node.ln_Type==NT_PROCESS) {
+ if (proc->pr_CLI != NULL) {
+ /* ProcLoaded 'Loaded as a command: '*/
+ cli = BADDR(proc->pr_CLI);
+ myseglist = cli->cli_Module;
+ }
+ } else {
+ ABORT("Not a Process.");
+ }
+
+ if (myseglist == NULL) {
+ ABORT("Arrrgh.. can't find segments, aborting");
+ }
+
+ /* xoper hunks Shell Process */
+
+ for (data = (ULONG *)BADDR(myseglist); data != NULL;
+ data = (ULONG *)BADDR(data[0])) {
+ if ((ULONG)GC_register_data_segments < (ULONG)(&data[1])
+ || (ULONG)GC_register_data_segments > (ULONG)(&data[1])
+ + data[-1]) {
+# ifdef __GNUC__
+ if (dataSegSize == data[-1]) {
+ found_segment = TRUE;
+ }
+# endif
+ GC_add_roots_inner((char *)&data[1],
+ ((char *)&data[1]) + data[-1], FALSE);
+ }
+ } /* for */
+# ifdef __GNUC__
+ if (!found_segment) {
+ ABORT("Can`t find correct Segments.\nSolution: Use an newer version of ixemul.library");
+ }
+# endif
+ }
+
+#endif
+
+
+
+#ifdef GC_AMIGA_AM
+
+#ifndef GC_AMIGA_FASTALLOC
+
+void *GC_amiga_allocwrapper(size_t size,void *(*AllocFunction)(size_t size2)){
+ return (*AllocFunction)(size);
+}
+
+void *(*GC_amiga_allocwrapper_do)(size_t size,void *(*AllocFunction)(size_t size2))
+ =GC_amiga_allocwrapper;
+
+#else
+
+
+
+
+void *GC_amiga_allocwrapper_firsttime(size_t size,void *(*AllocFunction)(size_t size2));
+
+void *(*GC_amiga_allocwrapper_do)(size_t size,void *(*AllocFunction)(size_t size2))
+ =GC_amiga_allocwrapper_firsttime;
+
+
+/******************************************************************
+ Amiga-specific routines to obtain memory, and force GC to give
+ back fast-mem whenever possible.
+ These hacks makes gc-programs go many times faster when
+ the Amiga is low on memory, and are therefore strictly necessary.
+
+ -Kjetil S. Matheussen, 2000.
+******************************************************************/
+
+
+
+/* List-header for all allocated memory. */
+
+struct GC_Amiga_AllocedMemoryHeader{
+ ULONG size;
+ struct GC_Amiga_AllocedMemoryHeader *next;
+};
+struct GC_Amiga_AllocedMemoryHeader *GC_AMIGAMEM=(struct GC_Amiga_AllocedMemoryHeader *)(int)~(NULL);
+
+
+
+/* Type of memory. Once in the execution of a program, this might change to MEMF_ANY|MEMF_CLEAR */
+
+ULONG GC_AMIGA_MEMF = MEMF_FAST | MEMF_CLEAR;
+
+
+/* Prevents GC_amiga_get_mem from allocating memory if this one is TRUE. */
+#ifndef GC_AMIGA_ONLYFAST
+BOOL GC_amiga_dontalloc=FALSE;
+#endif
+
+#ifdef GC_AMIGA_PRINTSTATS
+int succ=0,succ2=0;
+int nsucc=0,nsucc2=0;
+int nullretries=0;
+int numcollects=0;
+int chipa=0;
+int allochip=0;
+int allocfast=0;
+int cur0=0;
+int cur1=0;
+int cur10=0;
+int cur50=0;
+int cur150=0;
+int cur151=0;
+int ncur0=0;
+int ncur1=0;
+int ncur10=0;
+int ncur50=0;
+int ncur150=0;
+int ncur151=0;
+#endif
+
+/* Free everything at program-end. */
+
+void GC_amiga_free_all_mem(void){
+ struct GC_Amiga_AllocedMemoryHeader *gc_am=(struct GC_Amiga_AllocedMemoryHeader *)(~(int)(GC_AMIGAMEM));
+
+#ifdef GC_AMIGA_PRINTSTATS
+ printf("\n\n"
+ "%d bytes of chip-mem, and %d bytes of fast-mem where allocated from the OS.\n",
+ allochip,allocfast
+ );
+ printf(
+ "%d bytes of chip-mem were returned from the GC_AMIGA_FASTALLOC supported allocating functions.\n",
+ chipa
+ );
+ printf("\n");
+ printf("GC_gcollect was called %d times to avoid returning NULL or start allocating with the MEMF_ANY flag.\n",numcollects);
+ printf("%d of them was a success. (the others had to use allocation from the OS.)\n",nullretries);
+ printf("\n");
+ printf("Succeeded forcing %d gc-allocations (%d bytes) of chip-mem to be fast-mem.\n",succ,succ2);
+ printf("Failed forcing %d gc-allocations (%d bytes) of chip-mem to be fast-mem.\n",nsucc,nsucc2);
+ printf("\n");
+ printf(
+ "Number of retries before succeeding a chip->fast force:\n"
+ "0: %d, 1: %d, 2-9: %d, 10-49: %d, 50-149: %d, >150: %d\n",
+ cur0,cur1,cur10,cur50,cur150,cur151
+ );
+ printf(
+ "Number of retries before giving up a chip->fast force:\n"
+ "0: %d, 1: %d, 2-9: %d, 10-49: %d, 50-149: %d, >150: %d\n",
+ ncur0,ncur1,ncur10,ncur50,ncur150,ncur151
+ );
+#endif
+
+ while(gc_am!=NULL){
+ struct GC_Amiga_AllocedMemoryHeader *temp = gc_am->next;
+ FreeMem(gc_am,gc_am->size);
+ gc_am=(struct GC_Amiga_AllocedMemoryHeader *)(~(int)(temp));
+ }
+}
+
+#ifndef GC_AMIGA_ONLYFAST
+
+/* All memory with address lower than this one is chip-mem. */
+
+char *chipmax;
+
+
+/*
+ * Always set to the last size of memory tried to be allocated.
+ * Needed to ensure allocation when the size is bigger than 100000.
+ *
+ */
+size_t latestsize;
+
+#endif
+
+
+#ifdef GC_AMIGA_FASTALLOC
+
+/*
+ * The actual function that is called with the GET_MEM macro.
+ *
+ */
+
+void *GC_amiga_get_mem(size_t size){
+ struct GC_Amiga_AllocedMemoryHeader *gc_am;
+
+#ifndef GC_AMIGA_ONLYFAST
+ if(GC_amiga_dontalloc==TRUE){
+ return NULL;
+ }
+
+ /* We really don't want to use chip-mem, but if we must, then as little as possible. */
+ if(GC_AMIGA_MEMF==(MEMF_ANY|MEMF_CLEAR) && size>100000 && latestsize<50000) return NULL;
+#endif
+
+ gc_am=AllocMem((ULONG)(size + sizeof(struct GC_Amiga_AllocedMemoryHeader)),GC_AMIGA_MEMF);
+ if(gc_am==NULL) return NULL;
+
+ gc_am->next=GC_AMIGAMEM;
+ gc_am->size=size + sizeof(struct GC_Amiga_AllocedMemoryHeader);
+ GC_AMIGAMEM=(struct GC_Amiga_AllocedMemoryHeader *)(~(int)(gc_am));
+
+#ifdef GC_AMIGA_PRINTSTATS
+ if((char *)gc_am<chipmax){
+ allochip+=size;
+ }else{
+ allocfast+=size;
+ }
+#endif
+
+ return gc_am+1;
+
+}
+
+#endif
+
+
+#ifndef GC_AMIGA_ONLYFAST
+
+/* Tries very hard to force GC to find fast-mem to return. Done recursively
+ * to hold the rejected memory-pointers reachable from the collector in an
+ * easy way.
+ *
+ */
+#ifdef GC_AMIGA_RETRY
+void *GC_amiga_rec_alloc(size_t size,void *(*AllocFunction)(size_t size2),const int rec){
+ void *ret;
+
+ ret=(*AllocFunction)(size);
+
+#ifdef GC_AMIGA_PRINTSTATS
+ if((char *)ret>chipmax || ret==NULL){
+ if(ret==NULL){
+ nsucc++;
+ nsucc2+=size;
+ if(rec==0) ncur0++;
+ if(rec==1) ncur1++;
+ if(rec>1 && rec<10) ncur10++;
+ if(rec>=10 && rec<50) ncur50++;
+ if(rec>=50 && rec<150) ncur150++;
+ if(rec>=150) ncur151++;
+ }else{
+ succ++;
+ succ2+=size;
+ if(rec==0) cur0++;
+ if(rec==1) cur1++;
+ if(rec>1 && rec<10) cur10++;
+ if(rec>=10 && rec<50) cur50++;
+ if(rec>=50 && rec<150) cur150++;
+ if(rec>=150) cur151++;
+ }
+ }
+#endif
+
+ if (((char *)ret)<=chipmax && ret!=NULL && (rec<(size>500000?9:size/5000))){
+ ret=GC_amiga_rec_alloc(size,AllocFunction,rec+1);
+ }
+
+ return ret;
+}
+#endif
+
+
+/* The allocating-functions defined inside the Amiga-blocks in gc.h is called
+ * via these functions.
+ */
+
+
+void *GC_amiga_allocwrapper_any(size_t size,void *(*AllocFunction)(size_t size2)){
+ void *ret;
+
+ GC_amiga_dontalloc=TRUE; /* Pretty tough thing to do, but it's indeed necessary. */
+ latestsize=size;
+
+ ret=(*AllocFunction)(size);
+
+ if(((char *)ret) <= chipmax){
+ if(ret==NULL){
+ /* Give GC access to allocate memory. */
+#ifdef GC_AMIGA_GC
+ if(!GC_dont_gc){
+ GC_gcollect();
+#ifdef GC_AMIGA_PRINTSTATS
+ numcollects++;
+#endif
+ ret=(*AllocFunction)(size);
+ }
+ if(ret==NULL)
+#endif
+ {
+ GC_amiga_dontalloc=FALSE;
+ ret=(*AllocFunction)(size);
+ if(ret==NULL){
+ WARN("Out of Memory! Returning NIL!\n", 0);
+ }
+ }
+#ifdef GC_AMIGA_PRINTSTATS
+ else{
+ nullretries++;
+ }
+ if(ret!=NULL && (char *)ret<=chipmax) chipa+=size;
+#endif
+ }
+#ifdef GC_AMIGA_RETRY
+ else{
+ void *ret2;
+ /* We got chip-mem. Better try again and again and again etc., we might get fast-mem sooner or later... */
+ /* Using gctest to check the effectiveness of doing this, does seldom give a very good result. */
+ /* However, real programs doesn't normally rapidly allocate and deallocate. */
+ if(
+ AllocFunction!=GC_malloc_uncollectable
+#ifdef GC_ATOMIC_UNCOLLECTABLE
+ && AllocFunction!=GC_malloc_atomic_uncollectable
+#endif
+ ){
+ ret2=GC_amiga_rec_alloc(size,AllocFunction,0);
+ }else{
+ ret2=(*AllocFunction)(size);
+#ifdef GC_AMIGA_PRINTSTATS
+ if((char *)ret2<chipmax || ret2==NULL){
+ nsucc++;
+ nsucc2+=size;
+ ncur0++;
+ }else{
+ succ++;
+ succ2+=size;
+ cur0++;
+ }
+#endif
+ }
+ if(((char *)ret2)>chipmax){
+ GC_free(ret);
+ ret=ret2;
+ }else{
+ GC_free(ret2);
+ }
+ }
+#endif
+ }
+
+# if defined(CPPCHECK)
+ if (GC_amiga_dontalloc) /* variable is actually used by AllocFunction */
+# endif
+ GC_amiga_dontalloc=FALSE;
+
+ return ret;
+}
+
+
+
+void (*GC_amiga_toany)(void)=NULL;
+
+void GC_amiga_set_toany(void (*func)(void)){
+ GC_amiga_toany=func;
+}
+
+#endif /* !GC_AMIGA_ONLYFAST */
+
+
+void *GC_amiga_allocwrapper_fast(size_t size,void *(*AllocFunction)(size_t size2)){
+ void *ret;
+
+ ret=(*AllocFunction)(size);
+
+ if(ret==NULL){
+ /* Enable chip-mem allocation. */
+#ifdef GC_AMIGA_GC
+ if(!GC_dont_gc){
+ GC_gcollect();
+#ifdef GC_AMIGA_PRINTSTATS
+ numcollects++;
+#endif
+ ret=(*AllocFunction)(size);
+ }
+ if(ret==NULL)
+#endif
+ {
+#ifndef GC_AMIGA_ONLYFAST
+ GC_AMIGA_MEMF=MEMF_ANY | MEMF_CLEAR;
+ if(GC_amiga_toany!=NULL) (*GC_amiga_toany)();
+ GC_amiga_allocwrapper_do=GC_amiga_allocwrapper_any;
+ return GC_amiga_allocwrapper_any(size,AllocFunction);
+#endif
+ }
+#ifdef GC_AMIGA_PRINTSTATS
+ else{
+ nullretries++;
+ }
+#endif
+ }
+
+ return ret;
+}
+
+void *GC_amiga_allocwrapper_firsttime(size_t size,void *(*AllocFunction)(size_t size2)){
+ atexit(&GC_amiga_free_all_mem);
+ chipmax=(char *)SysBase->MaxLocMem; /* For people still having SysBase in chip-mem, this might speed up a bit. */
+ GC_amiga_allocwrapper_do=GC_amiga_allocwrapper_fast;
+ return GC_amiga_allocwrapper_fast(size,AllocFunction);
+}
+
+
+#endif /* GC_AMIGA_FASTALLOC */
+
+
+
+/*
+ * The wrapped realloc function.
+ *
+ */
+void *GC_amiga_realloc(void *old_object,size_t new_size_in_bytes){
+#ifndef GC_AMIGA_FASTALLOC
+ return GC_realloc(old_object,new_size_in_bytes);
+#else
+ void *ret;
+ latestsize=new_size_in_bytes;
+ ret=GC_realloc(old_object,new_size_in_bytes);
+ if(ret==NULL && new_size_in_bytes != 0
+ && GC_AMIGA_MEMF==(MEMF_FAST | MEMF_CLEAR)){
+ /* Out of fast-mem. */
+#ifdef GC_AMIGA_GC
+ if(!GC_dont_gc){
+ GC_gcollect();
+#ifdef GC_AMIGA_PRINTSTATS
+ numcollects++;
+#endif
+ ret=GC_realloc(old_object,new_size_in_bytes);
+ }
+ if(ret==NULL)
+#endif
+ {
+#ifndef GC_AMIGA_ONLYFAST
+ GC_AMIGA_MEMF=MEMF_ANY | MEMF_CLEAR;
+ if(GC_amiga_toany!=NULL) (*GC_amiga_toany)();
+ GC_amiga_allocwrapper_do=GC_amiga_allocwrapper_any;
+ ret=GC_realloc(old_object,new_size_in_bytes);
+#endif
+ }
+#ifdef GC_AMIGA_PRINTSTATS
+ else{
+ nullretries++;
+ }
+#endif
+ }
+ if(ret==NULL && new_size_in_bytes != 0){
+ WARN("Out of Memory! Returning NIL!\n", 0);
+ }
+#ifdef GC_AMIGA_PRINTSTATS
+ if(((char *)ret)<chipmax && ret!=NULL){
+ chipa+=new_size_in_bytes;
+ }
+#endif
+ return ret;
+#endif
+}
+
+#endif /* GC_AMIGA_AM */
diff --git a/graphics/asymptote/gc/extra/MacOS.c b/graphics/asymptote/gc/extra/MacOS.c
new file mode 100644
index 0000000000..082ee6ed7c
--- /dev/null
+++ b/graphics/asymptote/gc/extra/MacOS.c
@@ -0,0 +1,169 @@
+/*
+ MacOS.c
+
+ Some routines for the Macintosh OS port of the Hans-J. Boehm, Alan J. Demers
+ garbage collector.
+
+ <Revision History>
+
+ 11/22/94 pcb StripAddress the temporary memory handle for 24-bit mode.
+ 11/30/94 pcb Tracking all memory usage so we can deallocate it all at once.
+ 02/10/96 pcb Added routine to perform a final collection when
+unloading shared library.
+
+ by Patrick C. Beard.
+ */
+/* Boehm, February 15, 1996 2:55 pm PST */
+
+#include <Resources.h>
+#include <Memory.h>
+#include <LowMem.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define GC_BUILD
+#include "gc.h"
+#include "private/gc_priv.h"
+
+/* use 'CODE' resource 0 to get exact location of the beginning of global space. */
+
+typedef struct {
+ unsigned long aboveA5;
+ unsigned long belowA5;
+ unsigned long JTSize;
+ unsigned long JTOffset;
+} *CodeZeroPtr, **CodeZeroHandle;
+
+void* GC_MacGetDataStart(void)
+{
+ CodeZeroHandle code0 = (CodeZeroHandle)GetResource('CODE', 0);
+ if (code0) {
+ long belowA5Size = (**code0).belowA5;
+ ReleaseResource((Handle)code0);
+ return (LMGetCurrentA5() - belowA5Size);
+ }
+ fprintf(stderr, "Couldn't load the jump table.");
+ exit(-1);
+# if !defined(CPPCHECK)
+ return 0; /* to avoid compiler complain about missing return */
+# endif
+}
+
+#ifdef USE_TEMPORARY_MEMORY
+
+/* track the use of temporary memory so it can be freed all at once. */
+
+typedef struct TemporaryMemoryBlock TemporaryMemoryBlock, **TemporaryMemoryHandle;
+
+struct TemporaryMemoryBlock {
+ TemporaryMemoryHandle nextBlock;
+ char data[];
+};
+
+static TemporaryMemoryHandle theTemporaryMemory = NULL;
+
+void GC_MacFreeTemporaryMemory(void);
+
+Ptr GC_MacTemporaryNewPtr(size_t size, Boolean clearMemory)
+{
+# if !defined(SHARED_LIBRARY_BUILD)
+ static Boolean firstTime = true;
+# endif
+ OSErr result;
+ TemporaryMemoryHandle tempMemBlock;
+ Ptr tempPtr = nil;
+
+ tempMemBlock = (TemporaryMemoryHandle)TempNewHandle(size + sizeof(TemporaryMemoryBlock), &result);
+ if (tempMemBlock && result == noErr) {
+ HLockHi((Handle)tempMemBlock);
+ tempPtr = (**tempMemBlock).data;
+ if (clearMemory) memset(tempPtr, 0, size);
+ tempPtr = StripAddress(tempPtr);
+
+ /* keep track of the allocated blocks. */
+ (**tempMemBlock).nextBlock = theTemporaryMemory;
+ theTemporaryMemory = tempMemBlock;
+ }
+
+# if !defined(SHARED_LIBRARY_BUILD)
+ /* install an exit routine to clean up the memory used at the end. */
+ if (firstTime) {
+ atexit(&GC_MacFreeTemporaryMemory);
+ firstTime = false;
+ }
+# endif
+
+ return tempPtr;
+}
+
+static void perform_final_collection(void)
+{
+ unsigned i;
+ word last_fo_entries = 0;
+
+ /* adjust the stack bottom, because CFM calls us from another stack
+ location. */
+ GC_stackbottom = (ptr_t)&i;
+
+ /* try to collect and finalize everything in sight */
+ for (i = 0; i < 2 || GC_fo_entries < last_fo_entries; i++) {
+ last_fo_entries = GC_fo_entries;
+ GC_gcollect();
+ }
+}
+
+
+void GC_MacFreeTemporaryMemory(void)
+{
+# if defined(SHARED_LIBRARY_BUILD)
+ /* if possible, collect all memory, and invoke all finalizers. */
+ perform_final_collection();
+# endif
+
+ if (theTemporaryMemory != NULL) {
+# if !defined(SHARED_LIBRARY_BUILD)
+ long totalMemoryUsed = 0;
+# endif
+ TemporaryMemoryHandle tempMemBlock = theTemporaryMemory;
+ while (tempMemBlock /* != NULL */) {
+ TemporaryMemoryHandle nextBlock = (**tempMemBlock).nextBlock;
+# if !defined(SHARED_LIBRARY_BUILD)
+ totalMemoryUsed += GetHandleSize((Handle)tempMemBlock);
+# endif
+ DisposeHandle((Handle)tempMemBlock);
+ tempMemBlock = nextBlock;
+ }
+ theTemporaryMemory = NULL;
+
+# if !defined(SHARED_LIBRARY_BUILD)
+ if (GC_print_stats) {
+ fprintf(stdout, "[total memory used: %ld bytes.]\n",
+ totalMemoryUsed);
+ fprintf(stdout, "[total collections: %lu]\n",
+ (unsigned long)GC_gc_no);
+ }
+# endif
+ }
+}
+
+#endif /* USE_TEMPORARY_MEMORY */
+
+#if __option(far_data)
+
+ void* GC_MacGetDataEnd(void)
+ {
+ CodeZeroHandle code0 = (CodeZeroHandle)GetResource('CODE', 0);
+ if (code0) {
+ long aboveA5Size = (**code0).aboveA5;
+ ReleaseResource((Handle)code0);
+ return (LMGetCurrentA5() + aboveA5Size);
+ }
+ fprintf(stderr, "Couldn't load the jump table.");
+ exit(-1);
+# if !defined(CPPCHECK)
+ return 0;
+# endif
+ }
+
+#endif /* __option(far_data) */
diff --git a/graphics/asymptote/gc/extra/Mac_files/MacOS_config.h b/graphics/asymptote/gc/extra/Mac_files/MacOS_config.h
new file mode 100644
index 0000000000..abbf9d8ef0
--- /dev/null
+++ b/graphics/asymptote/gc/extra/Mac_files/MacOS_config.h
@@ -0,0 +1,27 @@
+/*
+ MacOS_config.h
+
+ Configuration flags for Macintosh development systems.
+
+ <Revision History>
+
+ 11/16/95 pcb Updated compilation flags to reflect latest 4.6 Makefile.
+
+ by Patrick C. Beard.
+ */
+/* Boehm, November 17, 1995 12:10 pm PST */
+
+#ifdef __MWERKS__
+/* for CodeWarrior Pro with Metrowerks Standard Library (MSL). */
+/* #define MSL_USE_PRECOMPILED_HEADERS 0 */
+#include <ansi_prefix.mac.h>
+#endif /* __MWERKS__ */
+
+/* these are defined again in gc_priv.h. */
+#undef TRUE
+#undef FALSE
+
+#define ALL_INTERIOR_POINTERS /* follows interior pointers. */
+/* #define DONT_ADD_BYTE_AT_END */ /* no padding. */
+/* #define SMALL_CONFIG */ /* whether to use a smaller heap. */
+#define USE_TEMPORARY_MEMORY /* use Macintosh temporary memory. */
diff --git a/graphics/asymptote/gc/extra/Mac_files/dataend.c b/graphics/asymptote/gc/extra/Mac_files/dataend.c
new file mode 100644
index 0000000000..0bed469467
--- /dev/null
+++ b/graphics/asymptote/gc/extra/Mac_files/dataend.c
@@ -0,0 +1,9 @@
+/*
+ dataend.c
+
+ A hack to get the extent of global data for the Macintosh.
+
+ by Patrick C. Beard.
+ */
+
+long __dataend;
diff --git a/graphics/asymptote/gc/extra/Mac_files/datastart.c b/graphics/asymptote/gc/extra/Mac_files/datastart.c
new file mode 100644
index 0000000000..a1dc6f6de7
--- /dev/null
+++ b/graphics/asymptote/gc/extra/Mac_files/datastart.c
@@ -0,0 +1,9 @@
+/*
+ datastart.c
+
+ A hack to get the extent of global data for the Macintosh.
+
+ by Patrick C. Beard.
+ */
+
+long __datastart;
diff --git a/graphics/asymptote/gc/extra/gc.c b/graphics/asymptote/gc/extra/gc.c
new file mode 100644
index 0000000000..4f907a8ab0
--- /dev/null
+++ b/graphics/asymptote/gc/extra/gc.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2009 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ * Copyright (c) 2009-2018 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* This file could be used for the following purposes: */
+/* - get the complete GC as a single link object file (module); */
+/* - enable more compiler optimizations. */
+
+/* Tip: to get the highest level of compiler optimizations, the typical */
+/* compiler options (GCC) to use are: */
+/* -O3 -fno-strict-aliasing -march=native -Wall -fprofile-generate/use */
+
+/* Warning: GCC for Linux (for C++ clients only): Use -fexceptions both */
+/* for GC and the client otherwise GC_thread_exit_proc() is not */
+/* guaranteed to be invoked (see the comments in pthread_start.c). */
+
+#ifndef __cplusplus
+ /* static is desirable here for more efficient linkage. */
+ /* TODO: Enable this in case of the compilation as C++ code. */
+# define GC_INNER STATIC
+# define GC_EXTERN GC_INNER
+ /* STATIC is defined in gcconfig.h. */
+#endif
+
+/* Small files go first... */
+#include "../backgraph.c"
+#include "../blacklst.c"
+#include "../checksums.c"
+#include "../gcj_mlc.c"
+#include "../headers.c"
+#include "../new_hblk.c"
+#include "../obj_map.c"
+#include "../ptr_chck.c"
+
+#include "gc_inline.h"
+#include "../allchblk.c"
+#include "../alloc.c"
+#include "../dbg_mlc.c"
+#include "../finalize.c"
+#include "../fnlz_mlc.c"
+#include "../malloc.c"
+#include "../mallocx.c"
+#include "../mark.c"
+#include "../mark_rts.c"
+#include "../reclaim.c"
+#include "../typd_mlc.c"
+
+#include "../misc.c"
+#include "../os_dep.c"
+#include "../thread_local_alloc.c"
+
+/* Most platform-specific files go here... */
+#include "../darwin_stop_world.c"
+#include "../dyn_load.c"
+#include "../gc_dlopen.c"
+#if !defined(PLATFORM_MACH_DEP)
+# include "../mach_dep.c"
+#endif
+#if !defined(PLATFORM_STOP_WORLD)
+# include "../pthread_stop_world.c"
+#endif
+#include "../pthread_support.c"
+#include "../specific.c"
+#include "../win32_threads.c"
+
+#ifndef GC_PTHREAD_START_STANDALONE
+# include "../pthread_start.c"
+#endif
+
+/* Restore pthread calls redirection (if altered in */
+/* pthread_stop_world.c, pthread_support.c or win32_threads.c). */
+/* This is only useful if directly included from application */
+/* (instead of linking gc). */
+#ifndef GC_NO_THREAD_REDIRECTS
+# define GC_PTHREAD_REDIRECTS_ONLY
+# include "gc_pthread_redirects.h"
+#endif
+
+/* The files from "extra" folder are not included. */
diff --git a/graphics/asymptote/gc/extra/msvc_dbg.c b/graphics/asymptote/gc/extra/msvc_dbg.c
new file mode 100644
index 0000000000..9337a8e81e
--- /dev/null
+++ b/graphics/asymptote/gc/extra/msvc_dbg.c
@@ -0,0 +1,406 @@
+/*
+ Copyright (c) 2004 Andrei Polushin
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION 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(_M_ARM) && !defined(_M_ARM64) \
+ && !defined(_M_X64) && defined(_MSC_VER)
+
+/* TODO: arm[64], x64 currently miss some machine-dependent code below. */
+/* See also GC_HAVE_BUILTIN_BACKTRACE in gc_config_macros.h. */
+
+#define GC_BUILD
+#include "private/msvc_dbg.h"
+#include "gc.h"
+
+#include <stdio.h>
+
+#ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+#endif
+#define NOSERVICE
+#include <windows.h>
+
+#pragma pack(push, 8)
+#include <imagehlp.h>
+#pragma pack(pop)
+
+#pragma comment(lib, "dbghelp.lib")
+#pragma optimize("gy", off)
+
+/* Disable a warning that /GS can not protect parameters and local */
+/* variables from local buffer overrun because optimizations are off. */
+#pragma warning(disable:4748)
+
+typedef GC_word word;
+#define GC_ULONG_PTR word
+
+#ifdef _WIN64
+ typedef GC_ULONG_PTR ULONG_ADDR;
+#else
+ typedef ULONG ULONG_ADDR;
+#endif
+
+static HANDLE GetSymHandle(void)
+{
+ static HANDLE symHandle = NULL;
+ if (!symHandle) {
+ BOOL bRet = SymInitialize(symHandle = GetCurrentProcess(), NULL, FALSE);
+ if (bRet) {
+ DWORD dwOptions = SymGetOptions();
+ dwOptions &= ~SYMOPT_UNDNAME;
+ dwOptions |= SYMOPT_LOAD_LINES;
+ SymSetOptions(dwOptions);
+ }
+ }
+ return symHandle;
+}
+
+static void* CALLBACK FunctionTableAccess(HANDLE hProcess,
+ ULONG_ADDR dwAddrBase)
+{
+ return SymFunctionTableAccess(hProcess, dwAddrBase);
+}
+
+static ULONG_ADDR CALLBACK GetModuleBase(HANDLE hProcess, ULONG_ADDR dwAddress)
+{
+ MEMORY_BASIC_INFORMATION memoryInfo;
+ ULONG_ADDR dwAddrBase = SymGetModuleBase(hProcess, dwAddress);
+ if (dwAddrBase != 0) {
+ return dwAddrBase;
+ }
+ if (VirtualQueryEx(hProcess, (void*)(GC_ULONG_PTR)dwAddress, &memoryInfo,
+ sizeof(memoryInfo))) {
+ char filePath[_MAX_PATH];
+ char curDir[_MAX_PATH];
+ char exePath[_MAX_PATH];
+ DWORD size = GetModuleFileNameA((HINSTANCE)memoryInfo.AllocationBase,
+ filePath, sizeof(filePath));
+
+ /* Save and restore current directory around SymLoadModule, see KB */
+ /* article Q189780. */
+ GetCurrentDirectoryA(sizeof(curDir), curDir);
+ GetModuleFileNameA(NULL, exePath, sizeof(exePath));
+#if _MSC_VER > 1200
+ strcat_s(exePath, sizeof(exePath), "\\..");
+#else /* VC6 or earlier */
+ strcat(exePath, "\\..");
+#endif
+ SetCurrentDirectoryA(exePath);
+#ifdef _DEBUG
+ GetCurrentDirectoryA(sizeof(exePath), exePath);
+#endif
+ SymLoadModule(hProcess, NULL, size ? filePath : NULL, NULL,
+ (ULONG_ADDR)(GC_ULONG_PTR)memoryInfo.AllocationBase, 0);
+ SetCurrentDirectoryA(curDir);
+ }
+ return (ULONG_ADDR)(GC_ULONG_PTR)memoryInfo.AllocationBase;
+}
+
+static ULONG_ADDR CheckAddress(void* address)
+{
+ ULONG_ADDR dwAddress = (ULONG_ADDR)(GC_ULONG_PTR)address;
+ GetModuleBase(GetSymHandle(), dwAddress);
+ return dwAddress;
+}
+
+size_t GetStackFrames(size_t skip, void* frames[], size_t maxFrames)
+{
+ HANDLE hProcess = GetSymHandle();
+ HANDLE hThread = GetCurrentThread();
+ CONTEXT context;
+ context.ContextFlags = CONTEXT_FULL;
+ if (!GetThreadContext(hThread, &context)) {
+ return 0;
+ }
+ /* GetThreadContext might return invalid context for the current thread. */
+#if defined(_M_IX86)
+ __asm mov context.Ebp, ebp
+#endif
+ return GetStackFramesFromContext(hProcess, hThread, &context, skip + 1,
+ frames, maxFrames);
+}
+
+size_t GetStackFramesFromContext(HANDLE hProcess, HANDLE hThread,
+ CONTEXT* context, size_t skip,
+ void* frames[], size_t maxFrames)
+{
+ size_t frameIndex;
+ DWORD machineType;
+ STACKFRAME stackFrame = { 0 };
+ stackFrame.AddrPC.Mode = AddrModeFlat;
+#if defined(_M_IX86)
+ machineType = IMAGE_FILE_MACHINE_I386;
+ stackFrame.AddrPC.Offset = context->Eip;
+ stackFrame.AddrStack.Mode = AddrModeFlat;
+ stackFrame.AddrStack.Offset = context->Esp;
+ stackFrame.AddrFrame.Mode = AddrModeFlat;
+ stackFrame.AddrFrame.Offset = context->Ebp;
+#elif defined(_M_MRX000)
+ machineType = IMAGE_FILE_MACHINE_R4000;
+ stackFrame.AddrPC.Offset = context->Fir;
+#elif defined(_M_ALPHA)
+ machineType = IMAGE_FILE_MACHINE_ALPHA;
+ stackFrame.AddrPC.Offset = (unsigned long)context->Fir;
+#elif defined(_M_PPC)
+ machineType = IMAGE_FILE_MACHINE_POWERPC;
+ stackFrame.AddrPC.Offset = context->Iar;
+#elif defined(_M_IA64)
+ machineType = IMAGE_FILE_MACHINE_IA64;
+ stackFrame.AddrPC.Offset = context->StIIP;
+#elif defined(_M_ALPHA64)
+ machineType = IMAGE_FILE_MACHINE_ALPHA64;
+ stackFrame.AddrPC.Offset = context->Fir;
+#elif !defined(CPPCHECK)
+# error Unknown CPU
+#endif
+ for (frameIndex = 0; frameIndex < maxFrames; ) {
+ BOOL bRet = StackWalk(machineType, hProcess, hThread, &stackFrame,
+ &context, NULL, FunctionTableAccess, GetModuleBase, NULL);
+ if (!bRet) {
+ break;
+ }
+ if (skip) {
+ skip--;
+ } else {
+ frames[frameIndex++] = (void*)(GC_ULONG_PTR)stackFrame.AddrPC.Offset;
+ }
+ }
+ return frameIndex;
+}
+
+size_t GetModuleNameFromAddress(void* address, char* moduleName, size_t size)
+{
+ if (size) *moduleName = 0;
+ {
+ const char* sourceName;
+ IMAGEHLP_MODULE moduleInfo = { sizeof (moduleInfo) };
+ if (!SymGetModuleInfo(GetSymHandle(), CheckAddress(address),
+ &moduleInfo)) {
+ return 0;
+ }
+ sourceName = strrchr(moduleInfo.ImageName, '\\');
+ if (sourceName) {
+ sourceName++;
+ } else {
+ sourceName = moduleInfo.ImageName;
+ }
+ if (size) {
+ strncpy(moduleName, sourceName, size)[size - 1] = 0;
+ }
+ return strlen(sourceName);
+ }
+}
+
+size_t GetModuleNameFromStack(size_t skip, char* moduleName, size_t size)
+{
+ void* address = NULL;
+ GetStackFrames(skip + 1, &address, 1);
+ if (address) {
+ return GetModuleNameFromAddress(address, moduleName, size);
+ }
+ return 0;
+}
+
+union sym_namebuf_u {
+ IMAGEHLP_SYMBOL sym;
+ char symNameBuffer[sizeof(IMAGEHLP_SYMBOL) + MAX_SYM_NAME];
+};
+
+size_t GetSymbolNameFromAddress(void* address, char* symbolName, size_t size,
+ size_t* offsetBytes)
+{
+ if (size) *symbolName = 0;
+ if (offsetBytes) *offsetBytes = 0;
+ __try {
+ ULONG_ADDR dwOffset = 0;
+ union sym_namebuf_u u;
+
+ u.sym.SizeOfStruct = sizeof(u.sym);
+ u.sym.MaxNameLength = sizeof(u.symNameBuffer) - sizeof(u.sym);
+
+ if (!SymGetSymFromAddr(GetSymHandle(), CheckAddress(address), &dwOffset,
+ &u.sym)) {
+ return 0;
+ } else {
+ const char* sourceName = u.sym.Name;
+ char undName[1024];
+ if (UnDecorateSymbolName(u.sym.Name, undName, sizeof(undName),
+ UNDNAME_NO_MS_KEYWORDS | UNDNAME_NO_ACCESS_SPECIFIERS)) {
+ sourceName = undName;
+ } else if (SymUnDName(&u.sym, undName, sizeof(undName))) {
+ sourceName = undName;
+ }
+ if (offsetBytes) {
+ *offsetBytes = dwOffset;
+ }
+ if (size) {
+ strncpy(symbolName, sourceName, size)[size - 1] = 0;
+ }
+ return strlen(sourceName);
+ }
+ } __except (EXCEPTION_EXECUTE_HANDLER) {
+ SetLastError(GetExceptionCode());
+ }
+ return 0;
+}
+
+size_t GetSymbolNameFromStack(size_t skip, char* symbolName, size_t size,
+ size_t* offsetBytes)
+{
+ void* address = NULL;
+ GetStackFrames(skip + 1, &address, 1);
+ if (address) {
+ return GetSymbolNameFromAddress(address, symbolName, size, offsetBytes);
+ }
+ return 0;
+}
+
+size_t GetFileLineFromAddress(void* address, char* fileName, size_t size,
+ size_t* lineNumber, size_t* offsetBytes)
+{
+ if (size) *fileName = 0;
+ if (lineNumber) *lineNumber = 0;
+ if (offsetBytes) *offsetBytes = 0;
+ {
+ char* sourceName;
+ IMAGEHLP_LINE line = { sizeof (line) };
+ GC_ULONG_PTR dwOffset = 0;
+ if (!SymGetLineFromAddr(GetSymHandle(), CheckAddress(address), &dwOffset,
+ &line)) {
+ return 0;
+ }
+ if (lineNumber) {
+ *lineNumber = line.LineNumber;
+ }
+ if (offsetBytes) {
+ *offsetBytes = dwOffset;
+ }
+ sourceName = line.FileName;
+ /* TODO: resolve relative filenames, found in 'source directories' */
+ /* registered with MSVC IDE. */
+ if (size) {
+ strncpy(fileName, sourceName, size)[size - 1] = 0;
+ }
+ return strlen(sourceName);
+ }
+}
+
+size_t GetFileLineFromStack(size_t skip, char* fileName, size_t size,
+ size_t* lineNumber, size_t* offsetBytes)
+{
+ void* address = NULL;
+ GetStackFrames(skip + 1, &address, 1);
+ if (address) {
+ return GetFileLineFromAddress(address, fileName, size, lineNumber,
+ offsetBytes);
+ }
+ return 0;
+}
+
+#define GC_SNPRINTF _snprintf
+
+size_t GetDescriptionFromAddress(void* address, const char* format,
+ char* buffer, size_t size)
+{
+ char* const begin = buffer;
+ char* const end = buffer + size;
+ size_t line_number = 0;
+
+ (void)format;
+ if (size) {
+ *buffer = 0;
+ }
+ buffer += GetFileLineFromAddress(address, buffer, size, &line_number, NULL);
+ size = (GC_ULONG_PTR)end < (GC_ULONG_PTR)buffer ? 0 : end - buffer;
+
+ if (line_number) {
+ char str[20];
+
+ (void)GC_SNPRINTF(str, sizeof(str), "(%d) : ", (int)line_number);
+ str[sizeof(str) - 1] = '\0';
+ if (size) {
+ strncpy(buffer, str, size)[size - 1] = 0;
+ }
+ buffer += strlen(str);
+ size = (GC_ULONG_PTR)end < (GC_ULONG_PTR)buffer ? 0 : end - buffer;
+ }
+
+ if (size) {
+ strncpy(buffer, "at ", size)[size - 1] = 0;
+ }
+ buffer += sizeof("at ") - 1;
+ size = (GC_ULONG_PTR)end < (GC_ULONG_PTR)buffer ? 0 : end - buffer;
+
+ buffer += GetSymbolNameFromAddress(address, buffer, size, NULL);
+ size = (GC_ULONG_PTR)end < (GC_ULONG_PTR)buffer ? 0 : end - buffer;
+
+ if (size) {
+ strncpy(buffer, " in ", size)[size - 1] = 0;
+ }
+ buffer += sizeof(" in ") - 1;
+ size = (GC_ULONG_PTR)end < (GC_ULONG_PTR)buffer ? 0 : end - buffer;
+
+ buffer += GetModuleNameFromAddress(address, buffer, size);
+ return buffer - begin;
+}
+
+size_t GetDescriptionFromStack(void* const frames[], size_t count,
+ const char* format, char* description[],
+ size_t size)
+{
+ const GC_ULONG_PTR begin = (GC_ULONG_PTR)description;
+ const GC_ULONG_PTR end = begin + size;
+ GC_ULONG_PTR buffer = begin + (count + 1) * sizeof(char*);
+ size_t i;
+
+ for (i = 0; i < count; ++i) {
+ if (description)
+ description[i] = (char*)buffer;
+ buffer += 1 + GetDescriptionFromAddress(frames[i], format, (char*)buffer,
+ end < buffer ? 0 : end - buffer);
+ }
+ if (description)
+ description[count] = NULL;
+ return buffer - begin;
+}
+
+/* Compatibility with execinfo.h: */
+
+int backtrace(void* addresses[], int count)
+{
+ return GetStackFrames(1, addresses, count);
+}
+
+char** backtrace_symbols(void*const* addresses, int count)
+{
+ size_t size = GetDescriptionFromStack(addresses, count, NULL, NULL, 0);
+ char** symbols = (char**)malloc(size);
+ if (symbols != NULL)
+ GetDescriptionFromStack(addresses, count, NULL, symbols, size);
+ return symbols;
+}
+
+#else
+
+ extern int GC_quiet;
+ /* ANSI C does not allow translation units to be empty. */
+
+#endif
diff --git a/graphics/asymptote/gc/extra/pcr_interface.c b/graphics/asymptote/gc/extra/pcr_interface.c
new file mode 100644
index 0000000000..7266c1b3e7
--- /dev/null
+++ b/graphics/asymptote/gc/extra/pcr_interface.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+# include "private/gc_priv.h"
+
+# ifdef PCR
+/*
+ * We wrap all of the allocator functions to avoid questions of
+ * compatibility between the prototyped and nonprototyped versions of the f
+ */
+# include "config/PCR_StdTypes.h"
+# include "mm/PCR_MM.h"
+# include <errno.h>
+
+# define MY_MAGIC 17L
+# define MY_DEBUGMAGIC 42L
+
+void * GC_AllocProc(size_t size, PCR_Bool ptrFree, PCR_Bool clear )
+{
+ if (ptrFree) {
+ void * result = (void *)GC_malloc_atomic(size);
+ if (clear && result != 0) BZERO(result, size);
+ return(result);
+ } else {
+ return((void *)GC_malloc(size));
+ }
+}
+
+void * GC_DebugAllocProc(size_t size, PCR_Bool ptrFree, PCR_Bool clear )
+{
+ if (ptrFree) {
+ void * result = (void *)GC_debug_malloc_atomic(size, __FILE__,
+ __LINE__);
+ if (clear && result != 0) BZERO(result, size);
+ return(result);
+ } else {
+ return((void *)GC_debug_malloc(size, __FILE__, __LINE__));
+ }
+}
+
+# define GC_ReallocProc GC_realloc
+void * GC_DebugReallocProc(void * old_object, size_t new_size_in_bytes)
+{
+ return(GC_debug_realloc(old_object, new_size_in_bytes, __FILE__, __LINE__));
+}
+
+# define GC_FreeProc GC_free
+# define GC_DebugFreeProc GC_debug_free
+
+typedef struct {
+ PCR_ERes (*ed_proc)(void *p, size_t size, PCR_Any data);
+ GC_bool ed_pointerfree;
+ PCR_ERes ed_fail_code;
+ PCR_Any ed_client_data;
+} enumerate_data;
+
+void GC_enumerate_block(struct hblk *h, enumerate_data * ed)
+{
+ hdr * hhdr;
+ size_t sz;
+ ptr_t p;
+ ptr_t lim;
+ word descr;
+
+# if !defined(CPPCHECK)
+# error This code was updated without testing.
+# error and its precursor was clearly broken.
+# endif
+ hhdr = HDR(h);
+ descr = hhdr -> hb_descr;
+ sz = (size_t)hhdr->hb_sz;
+ if (descr != 0 && ed -> ed_pointerfree
+ || descr == 0 && !(ed -> ed_pointerfree)) return;
+ lim = (ptr_t)(h+1) - sz;
+ p = (ptr_t)h;
+ do {
+ if (PCR_ERes_IsErr(ed -> ed_fail_code)) return;
+ ed -> ed_fail_code =
+ (*(ed -> ed_proc))(p, sz, ed -> ed_client_data);
+ p+= sz;
+ } while ((word)p <= (word)lim);
+}
+
+struct PCR_MM_ProcsRep * GC_old_allocator = 0;
+
+PCR_ERes GC_EnumerateProc(
+ PCR_Bool ptrFree,
+ PCR_ERes (*proc)(void *p, size_t size, PCR_Any data),
+ PCR_Any data
+)
+{
+ enumerate_data ed;
+
+ ed.ed_proc = proc;
+ ed.ed_pointerfree = ptrFree;
+ ed.ed_fail_code = PCR_ERes_okay;
+ ed.ed_client_data = data;
+ GC_apply_to_all_blocks(GC_enumerate_block, &ed);
+ if (ed.ed_fail_code != PCR_ERes_okay) {
+ return(ed.ed_fail_code);
+ } else {
+ /* Also enumerate objects allocated by my predecessors */
+ return((*(GC_old_allocator->mmp_enumerate))(ptrFree, proc, data));
+ }
+}
+
+void GC_DummyFreeProc(void *p) {}
+
+void GC_DummyShutdownProc(void) {}
+
+struct PCR_MM_ProcsRep GC_Rep = {
+ MY_MAGIC,
+ GC_AllocProc,
+ GC_ReallocProc,
+ GC_DummyFreeProc, /* mmp_free */
+ GC_FreeProc, /* mmp_unsafeFree */
+ GC_EnumerateProc,
+ GC_DummyShutdownProc /* mmp_shutdown */
+};
+
+struct PCR_MM_ProcsRep GC_DebugRep = {
+ MY_DEBUGMAGIC,
+ GC_DebugAllocProc,
+ GC_DebugReallocProc,
+ GC_DummyFreeProc, /* mmp_free */
+ GC_DebugFreeProc, /* mmp_unsafeFree */
+ GC_EnumerateProc,
+ GC_DummyShutdownProc /* mmp_shutdown */
+};
+
+GC_bool GC_use_debug = 0;
+
+void GC_pcr_install()
+{
+ PCR_MM_Install((GC_use_debug? &GC_DebugRep : &GC_Rep), &GC_old_allocator);
+}
+
+PCR_ERes
+PCR_GC_Setup(void)
+{
+ return PCR_ERes_okay;
+}
+
+extern GC_bool GC_quiet;
+
+PCR_ERes
+PCR_GC_Run(void)
+{
+
+ if( !PCR_Base_TestPCRArg("-nogc") ) {
+ GC_quiet = ( PCR_Base_TestPCRArg("-gctrace") ? 0 : 1 );
+ GC_use_debug = (GC_bool)PCR_Base_TestPCRArg("-debug_alloc");
+ GC_init();
+ if( !PCR_Base_TestPCRArg("-nogc_incremental") ) {
+ /*
+ * awful hack to test whether VD is implemented ...
+ */
+ if( PCR_VD_Start( 0, NIL, 0) != PCR_ERes_FromErr(ENOSYS) ) {
+ GC_enable_incremental();
+ }
+ }
+ }
+ return PCR_ERes_okay;
+}
+
+void GC_push_thread_structures(void)
+{
+ /* PCR doesn't work unless static roots are pushed. Can't get here. */
+ ABORT("In GC_push_thread_structures()");
+}
+
+# endif
diff --git a/graphics/asymptote/gc/extra/real_malloc.c b/graphics/asymptote/gc/extra/real_malloc.c
new file mode 100644
index 0000000000..145e73f3b4
--- /dev/null
+++ b/graphics/asymptote/gc/extra/real_malloc.c
@@ -0,0 +1,39 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+# ifdef HAVE_CONFIG_H
+# include "config.h"
+# endif
+
+# ifdef PCR
+/*
+ * This definition should go in its own file that includes no other
+ * header files. Otherwise, we risk not getting the underlying system
+ * malloc.
+ */
+# define PCR_NO_RENAME
+# include <stdlib.h>
+
+void * real_malloc(size_t size)
+{
+ return(malloc(size));
+}
+
+# else
+
+extern int GC_quiet;
+ /* ANSI C doesn't allow translation units to be empty. */
+ /* So we guarantee this one is nonempty. */
+
+#endif /* PCR */
diff --git a/graphics/asymptote/gc/extra/symbian.cpp b/graphics/asymptote/gc/extra/symbian.cpp
new file mode 100644
index 0000000000..2ec7afbbd3
--- /dev/null
+++ b/graphics/asymptote/gc/extra/symbian.cpp
@@ -0,0 +1,52 @@
+
+#include <e32cmn.h>
+#include <e32std.h>
+#include <f32file.h>
+#include <aknutils.h>
+#include <stdlib.h>
+#include <string.h>
+
+extern "C" {
+
+int GC_get_main_symbian_stack_base()
+{
+ TThreadStackInfo aInfo;
+ TInt err = RThread().StackInfo(aInfo);
+ if ( !err )
+ {
+ return aInfo.iBase;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+char* GC_get_private_path_and_zero_file()
+{
+ // always on c: drive
+ RFs fs;
+ fs.Connect();
+ fs.CreatePrivatePath( EDriveC );
+ TFileName path;
+ fs.PrivatePath( path );
+ fs.Close();
+ _LIT( KCDrive, "c:" );
+ path.Insert( 0, KCDrive );
+
+
+ //convert to char*, assume ascii
+ TBuf8<KMaxFileName> path8;
+ path8.Copy( path );
+ _LIT8( KZero8, "zero" );
+ path8.Append( KZero8 );
+
+ size_t size = path8.Length() + 1;
+ char* copyChar = (char*) malloc( size );
+ if (copyChar)
+ memcpy( copyChar, path8.PtrZ(), size );
+
+ return copyChar; // ownership passed
+}
+
+} /* extern "C" */
diff --git a/graphics/asymptote/gc/extra/symbian/global_end.cpp b/graphics/asymptote/gc/extra/symbian/global_end.cpp
new file mode 100644
index 0000000000..14c7710d4e
--- /dev/null
+++ b/graphics/asymptote/gc/extra/symbian/global_end.cpp
@@ -0,0 +1,10 @@
+// Symbian-specific file.
+
+// INCLUDE FILES
+#include "private/gcconfig.h"
+
+extern "C" {
+
+int winscw_data_end;
+
+} /* extern "C" */
diff --git a/graphics/asymptote/gc/extra/symbian/global_start.cpp b/graphics/asymptote/gc/extra/symbian/global_start.cpp
new file mode 100644
index 0000000000..1b030bc4dd
--- /dev/null
+++ b/graphics/asymptote/gc/extra/symbian/global_start.cpp
@@ -0,0 +1,10 @@
+// Symbian-specific file.
+
+// INCLUDE FILES
+#include "private/gcconfig.h"
+
+extern "C" {
+
+int winscw_data_start;
+
+} /* extern "C" */
diff --git a/graphics/asymptote/gc/extra/symbian/init_global_static_roots.cpp b/graphics/asymptote/gc/extra/symbian/init_global_static_roots.cpp
new file mode 100644
index 0000000000..89163c1f78
--- /dev/null
+++ b/graphics/asymptote/gc/extra/symbian/init_global_static_roots.cpp
@@ -0,0 +1,28 @@
+// Symbian-specific file.
+
+// INCLUDE FILES
+#include <e32def.h>
+
+#include "private/gcconfig.h"
+#include "gc.h"
+
+extern "C" {
+
+void GC_init_global_static_roots()
+{
+ ptr_t dataStart;
+ ptr_t dataEnd;
+# if defined (__WINS__)
+ extern int winscw_data_start, winscw_data_end;
+ dataStart = ((ptr_t)&winscw_data_start);
+ dataEnd = ((ptr_t)&winscw_data_end);
+# else
+ extern int Image$$RW$$Limit[], Image$$RW$$Base[];
+ dataStart = ((ptr_t)Image$$RW$$Base);
+ dataEnd = ((ptr_t)Image$$RW$$Limit);
+# endif
+
+ GC_add_roots(dataStart, dataEnd);
+}
+
+} /* extern "C" */
diff --git a/graphics/asymptote/gc/finalize.c b/graphics/asymptote/gc/finalize.c
new file mode 100644
index 0000000000..5901ec49e0
--- /dev/null
+++ b/graphics/asymptote/gc/finalize.c
@@ -0,0 +1,1391 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1996 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (C) 2007 Free Software Foundation, Inc
+ * Copyright (c) 2008-2020 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_pmark.h"
+
+#ifndef GC_NO_FINALIZATION
+# include "javaxfc.h" /* to get GC_finalize_all() as extern "C" */
+
+/* Type of mark procedure used for marking from finalizable object. */
+/* This procedure normally does not mark the object, only its */
+/* descendants. */
+typedef void (* finalization_mark_proc)(ptr_t /* finalizable_obj_ptr */);
+
+#define HASH3(addr,size,log_size) \
+ ((((word)(addr) >> 3) ^ ((word)(addr) >> (3 + (log_size)))) \
+ & ((size) - 1))
+#define HASH2(addr,log_size) HASH3(addr, (word)1 << (log_size), log_size)
+
+struct hash_chain_entry {
+ word hidden_key;
+ struct hash_chain_entry * next;
+};
+
+struct disappearing_link {
+ struct hash_chain_entry prolog;
+# define dl_hidden_link prolog.hidden_key
+ /* Field to be cleared. */
+# define dl_next(x) (struct disappearing_link *)((x) -> prolog.next)
+# define dl_set_next(x, y) \
+ (void)((x)->prolog.next = (struct hash_chain_entry *)(y))
+ word dl_hidden_obj; /* Pointer to object base */
+};
+
+struct finalizable_object {
+ struct hash_chain_entry prolog;
+# define fo_hidden_base prolog.hidden_key
+ /* Pointer to object base. */
+ /* No longer hidden once object */
+ /* is on finalize_now queue. */
+# define fo_next(x) (struct finalizable_object *)((x) -> prolog.next)
+# define fo_set_next(x,y) ((x)->prolog.next = (struct hash_chain_entry *)(y))
+ GC_finalization_proc fo_fn; /* Finalizer. */
+ ptr_t fo_client_data;
+ word fo_object_size; /* In bytes. */
+ finalization_mark_proc fo_mark_proc; /* Mark-through procedure */
+};
+
+#ifdef AO_HAVE_store
+ /* Update finalize_now atomically as GC_should_invoke_finalizers does */
+ /* not acquire the allocation lock. */
+# define SET_FINALIZE_NOW(fo) \
+ AO_store((volatile AO_t *)&GC_fnlz_roots.finalize_now, (AO_t)(fo))
+#else
+# define SET_FINALIZE_NOW(fo) (void)(GC_fnlz_roots.finalize_now = (fo))
+#endif /* !THREADS */
+
+GC_API void GC_CALL GC_push_finalizer_structures(void)
+{
+ GC_ASSERT((word)(&GC_dl_hashtbl.head) % sizeof(word) == 0);
+ GC_ASSERT((word)(&GC_fnlz_roots) % sizeof(word) == 0);
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_ASSERT((word)(&GC_ll_hashtbl.head) % sizeof(word) == 0);
+ GC_PUSH_ALL_SYM(GC_ll_hashtbl.head);
+# endif
+ GC_PUSH_ALL_SYM(GC_dl_hashtbl.head);
+ GC_PUSH_ALL_SYM(GC_fnlz_roots);
+ /* GC_toggleref_arr is pushed specially by GC_mark_togglerefs. */
+}
+
+/* Threshold of log_size to initiate full collection before growing */
+/* a hash table. */
+#ifndef GC_ON_GROW_LOG_SIZE_MIN
+# define GC_ON_GROW_LOG_SIZE_MIN CPP_LOG_HBLKSIZE
+#endif
+
+/* Double the size of a hash table. *log_size_ptr is the log of its */
+/* current size. May be a no-op. */
+/* *table is a pointer to an array of hash headers. If we succeed, we */
+/* update both *table and *log_size_ptr. Lock is held. */
+STATIC void GC_grow_table(struct hash_chain_entry ***table,
+ unsigned *log_size_ptr, word *entries_ptr)
+{
+ word i;
+ struct hash_chain_entry *p;
+ unsigned log_old_size = *log_size_ptr;
+ unsigned log_new_size = log_old_size + 1;
+ word old_size = *table == NULL ? 0 : (word)1 << log_old_size;
+ word new_size = (word)1 << log_new_size;
+ /* FIXME: Power of 2 size often gets rounded up to one more page. */
+ struct hash_chain_entry **new_table;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ /* Avoid growing the table in case of at least 25% of entries can */
+ /* be deleted by enforcing a collection. Ignored for small tables. */
+ /* In incremental mode we skip this optimization, as we want to */
+ /* avoid triggering a full GC whenever possible. */
+ if (log_old_size >= GC_ON_GROW_LOG_SIZE_MIN && !GC_incremental) {
+ IF_CANCEL(int cancel_state;)
+
+ DISABLE_CANCEL(cancel_state);
+ (void)GC_try_to_collect_inner(GC_never_stop_func);
+ RESTORE_CANCEL(cancel_state);
+ /* GC_finalize might decrease entries value. */
+ if (*entries_ptr < ((word)1 << log_old_size) - (*entries_ptr >> 2))
+ return;
+ }
+
+ new_table = (struct hash_chain_entry **)
+ GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE(
+ (size_t)new_size * sizeof(struct hash_chain_entry *),
+ NORMAL);
+ if (new_table == 0) {
+ if (*table == 0) {
+ ABORT("Insufficient space for initial table allocation");
+ } else {
+ return;
+ }
+ }
+ for (i = 0; i < old_size; i++) {
+ p = (*table)[i];
+ while (p != 0) {
+ ptr_t real_key = (ptr_t)GC_REVEAL_POINTER(p->hidden_key);
+ struct hash_chain_entry *next = p -> next;
+ size_t new_hash = HASH3(real_key, new_size, log_new_size);
+
+ p -> next = new_table[new_hash];
+ GC_dirty(p);
+ new_table[new_hash] = p;
+ p = next;
+ }
+ }
+ *log_size_ptr = log_new_size;
+ *table = new_table;
+ GC_dirty(new_table); /* entire object */
+}
+
+GC_API int GC_CALL GC_register_disappearing_link(void * * link)
+{
+ ptr_t base;
+
+ base = (ptr_t)GC_base(link);
+ if (base == 0)
+ ABORT("Bad arg to GC_register_disappearing_link");
+ return(GC_general_register_disappearing_link(link, base));
+}
+
+STATIC int GC_register_disappearing_link_inner(
+ struct dl_hashtbl_s *dl_hashtbl, void **link,
+ const void *obj, const char *tbl_log_name)
+{
+ struct disappearing_link *curr_dl;
+ size_t index;
+ struct disappearing_link * new_dl;
+ DCL_LOCK_STATE;
+
+ if (EXPECT(GC_find_leak, FALSE)) return GC_UNIMPLEMENTED;
+ LOCK();
+ GC_ASSERT(obj != NULL && GC_base_C(obj) == obj);
+ if (EXPECT(NULL == dl_hashtbl -> head, FALSE)
+ || EXPECT(dl_hashtbl -> entries
+ > ((word)1 << dl_hashtbl -> log_size), FALSE)) {
+ GC_grow_table((struct hash_chain_entry ***)&dl_hashtbl -> head,
+ &dl_hashtbl -> log_size, &dl_hashtbl -> entries);
+ GC_COND_LOG_PRINTF("Grew %s table to %u entries\n", tbl_log_name,
+ 1U << dl_hashtbl -> log_size);
+ }
+ index = HASH2(link, dl_hashtbl -> log_size);
+ for (curr_dl = dl_hashtbl -> head[index]; curr_dl != 0;
+ curr_dl = dl_next(curr_dl)) {
+ if (curr_dl -> dl_hidden_link == GC_HIDE_POINTER(link)) {
+ curr_dl -> dl_hidden_obj = GC_HIDE_POINTER(obj);
+ UNLOCK();
+ return GC_DUPLICATE;
+ }
+ }
+ new_dl = (struct disappearing_link *)
+ GC_INTERNAL_MALLOC(sizeof(struct disappearing_link),NORMAL);
+ if (0 == new_dl) {
+ GC_oom_func oom_fn = GC_oom_fn;
+ UNLOCK();
+ new_dl = (struct disappearing_link *)
+ (*oom_fn)(sizeof(struct disappearing_link));
+ if (0 == new_dl) {
+ return GC_NO_MEMORY;
+ }
+ /* It's not likely we'll make it here, but ... */
+ LOCK();
+ /* Recalculate index since the table may grow. */
+ index = HASH2(link, dl_hashtbl -> log_size);
+ /* Check again that our disappearing link not in the table. */
+ for (curr_dl = dl_hashtbl -> head[index]; curr_dl != 0;
+ curr_dl = dl_next(curr_dl)) {
+ if (curr_dl -> dl_hidden_link == GC_HIDE_POINTER(link)) {
+ curr_dl -> dl_hidden_obj = GC_HIDE_POINTER(obj);
+ UNLOCK();
+# ifndef DBG_HDRS_ALL
+ /* Free unused new_dl returned by GC_oom_fn() */
+ GC_free((void *)new_dl);
+# endif
+ return GC_DUPLICATE;
+ }
+ }
+ }
+ new_dl -> dl_hidden_obj = GC_HIDE_POINTER(obj);
+ new_dl -> dl_hidden_link = GC_HIDE_POINTER(link);
+ dl_set_next(new_dl, dl_hashtbl -> head[index]);
+ GC_dirty(new_dl);
+ dl_hashtbl -> head[index] = new_dl;
+ dl_hashtbl -> entries++;
+ GC_dirty(dl_hashtbl->head + index);
+ UNLOCK();
+ return GC_SUCCESS;
+}
+
+GC_API int GC_CALL GC_general_register_disappearing_link(void * * link,
+ const void * obj)
+{
+ if (((word)link & (ALIGNMENT-1)) != 0 || !NONNULL_ARG_NOT_NULL(link))
+ ABORT("Bad arg to GC_general_register_disappearing_link");
+ return GC_register_disappearing_link_inner(&GC_dl_hashtbl, link, obj,
+ "dl");
+}
+
+#ifdef DBG_HDRS_ALL
+# define FREE_DL_ENTRY(curr_dl) dl_set_next(curr_dl, NULL)
+#else
+# define FREE_DL_ENTRY(curr_dl) GC_free(curr_dl)
+#endif
+
+/* Unregisters given link and returns the link entry to free. */
+GC_INLINE struct disappearing_link *GC_unregister_disappearing_link_inner(
+ struct dl_hashtbl_s *dl_hashtbl, void **link)
+{
+ struct disappearing_link *curr_dl;
+ struct disappearing_link *prev_dl = NULL;
+ size_t index;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (EXPECT(NULL == dl_hashtbl -> head, FALSE)) return NULL;
+
+ index = HASH2(link, dl_hashtbl -> log_size);
+ for (curr_dl = dl_hashtbl -> head[index]; curr_dl;
+ curr_dl = dl_next(curr_dl)) {
+ if (curr_dl -> dl_hidden_link == GC_HIDE_POINTER(link)) {
+ /* Remove found entry from the table. */
+ if (NULL == prev_dl) {
+ dl_hashtbl -> head[index] = dl_next(curr_dl);
+ GC_dirty(dl_hashtbl->head + index);
+ } else {
+ dl_set_next(prev_dl, dl_next(curr_dl));
+ GC_dirty(prev_dl);
+ }
+ dl_hashtbl -> entries--;
+ break;
+ }
+ prev_dl = curr_dl;
+ }
+ return curr_dl;
+}
+
+GC_API int GC_CALL GC_unregister_disappearing_link(void * * link)
+{
+ struct disappearing_link *curr_dl;
+ DCL_LOCK_STATE;
+
+ if (((word)link & (ALIGNMENT-1)) != 0) return(0); /* Nothing to do. */
+
+ LOCK();
+ curr_dl = GC_unregister_disappearing_link_inner(&GC_dl_hashtbl, link);
+ UNLOCK();
+ if (NULL == curr_dl) return 0;
+ FREE_DL_ENTRY(curr_dl);
+ return 1;
+}
+
+/* Toggle-ref support. */
+#ifndef GC_TOGGLE_REFS_NOT_NEEDED
+ typedef union toggle_ref_u GCToggleRef;
+
+ STATIC GC_toggleref_func GC_toggleref_callback = 0;
+
+ GC_INNER void GC_process_togglerefs(void)
+ {
+ size_t i;
+ size_t new_size = 0;
+ GC_bool needs_barrier = FALSE;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ for (i = 0; i < GC_toggleref_array_size; ++i) {
+ GCToggleRef r = GC_toggleref_arr[i];
+ void *obj = r.strong_ref;
+
+ if (((word)obj & 1) != 0) {
+ obj = GC_REVEAL_POINTER(r.weak_ref);
+ }
+ if (NULL == obj) {
+ continue;
+ }
+ switch (GC_toggleref_callback(obj)) {
+ case GC_TOGGLE_REF_DROP:
+ break;
+ case GC_TOGGLE_REF_STRONG:
+ GC_toggleref_arr[new_size++].strong_ref = obj;
+ needs_barrier = TRUE;
+ break;
+ case GC_TOGGLE_REF_WEAK:
+ GC_toggleref_arr[new_size++].weak_ref = GC_HIDE_POINTER(obj);
+ break;
+ default:
+ ABORT("Bad toggle-ref status returned by callback");
+ }
+ }
+
+ if (new_size < GC_toggleref_array_size) {
+ BZERO(&GC_toggleref_arr[new_size],
+ (GC_toggleref_array_size - new_size) * sizeof(GCToggleRef));
+ GC_toggleref_array_size = new_size;
+ }
+ if (needs_barrier)
+ GC_dirty(GC_toggleref_arr); /* entire object */
+ }
+
+ STATIC void GC_normal_finalize_mark_proc(ptr_t);
+
+ static void push_and_mark_object(void *p)
+ {
+ GC_normal_finalize_mark_proc((ptr_t)p);
+ while (!GC_mark_stack_empty()) {
+ MARK_FROM_MARK_STACK();
+ }
+ GC_set_mark_bit(p);
+ if (GC_mark_state != MS_NONE) {
+ while (!GC_mark_some(0)) {
+ /* Empty. */
+ }
+ }
+ }
+
+ STATIC void GC_mark_togglerefs(void)
+ {
+ size_t i;
+ if (NULL == GC_toggleref_arr)
+ return;
+
+ GC_set_mark_bit(GC_toggleref_arr);
+ for (i = 0; i < GC_toggleref_array_size; ++i) {
+ void *obj = GC_toggleref_arr[i].strong_ref;
+ if (obj != NULL && ((word)obj & 1) == 0) {
+ push_and_mark_object(obj);
+ }
+ }
+ }
+
+ STATIC void GC_clear_togglerefs(void)
+ {
+ size_t i;
+ for (i = 0; i < GC_toggleref_array_size; ++i) {
+ if ((GC_toggleref_arr[i].weak_ref & 1) != 0) {
+ if (!GC_is_marked(GC_REVEAL_POINTER(GC_toggleref_arr[i].weak_ref))) {
+ GC_toggleref_arr[i].weak_ref = 0;
+ } else {
+ /* No need to copy, BDWGC is a non-moving collector. */
+ }
+ }
+ }
+ }
+
+ GC_API void GC_CALL GC_set_toggleref_func(GC_toggleref_func fn)
+ {
+ DCL_LOCK_STATE;
+
+ LOCK();
+ GC_toggleref_callback = fn;
+ UNLOCK();
+ }
+
+ GC_API GC_toggleref_func GC_CALL GC_get_toggleref_func(void)
+ {
+ GC_toggleref_func fn;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ fn = GC_toggleref_callback;
+ UNLOCK();
+ return fn;
+ }
+
+ static GC_bool ensure_toggleref_capacity(size_t capacity_inc)
+ {
+ GC_ASSERT(I_HOLD_LOCK());
+ if (NULL == GC_toggleref_arr) {
+ GC_toggleref_array_capacity = 32; /* initial capacity */
+ GC_toggleref_arr = (GCToggleRef *)GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE(
+ GC_toggleref_array_capacity * sizeof(GCToggleRef),
+ NORMAL);
+ if (NULL == GC_toggleref_arr)
+ return FALSE;
+ }
+ if (GC_toggleref_array_size + capacity_inc
+ >= GC_toggleref_array_capacity) {
+ GCToggleRef *new_array;
+ while (GC_toggleref_array_capacity
+ < GC_toggleref_array_size + capacity_inc) {
+ GC_toggleref_array_capacity *= 2;
+ if ((GC_toggleref_array_capacity
+ & ((size_t)1 << (sizeof(size_t) * 8 - 1))) != 0)
+ return FALSE; /* overflow */
+ }
+
+ new_array = (GCToggleRef *)GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE(
+ GC_toggleref_array_capacity * sizeof(GCToggleRef),
+ NORMAL);
+ if (NULL == new_array)
+ return FALSE;
+ if (EXPECT(GC_toggleref_array_size > 0, TRUE))
+ BCOPY(GC_toggleref_arr, new_array,
+ GC_toggleref_array_size * sizeof(GCToggleRef));
+ GC_INTERNAL_FREE(GC_toggleref_arr);
+ GC_toggleref_arr = new_array;
+ }
+ return TRUE;
+ }
+
+ GC_API int GC_CALL GC_toggleref_add(void *obj, int is_strong_ref)
+ {
+ int res = GC_SUCCESS;
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(NONNULL_ARG_NOT_NULL(obj));
+ LOCK();
+ if (GC_toggleref_callback != 0) {
+ if (!ensure_toggleref_capacity(1)) {
+ res = GC_NO_MEMORY;
+ } else {
+ GC_toggleref_arr[GC_toggleref_array_size].strong_ref =
+ is_strong_ref ? obj : (void *)GC_HIDE_POINTER(obj);
+ if (is_strong_ref)
+ GC_dirty(GC_toggleref_arr + GC_toggleref_array_size);
+ GC_toggleref_array_size++;
+ }
+ }
+ UNLOCK();
+ return res;
+ }
+#endif /* !GC_TOGGLE_REFS_NOT_NEEDED */
+
+/* Finalizer callback support. */
+STATIC GC_await_finalize_proc GC_object_finalized_proc = 0;
+
+GC_API void GC_CALL GC_set_await_finalize_proc(GC_await_finalize_proc fn)
+{
+ DCL_LOCK_STATE;
+
+ LOCK();
+ GC_object_finalized_proc = fn;
+ UNLOCK();
+}
+
+GC_API GC_await_finalize_proc GC_CALL GC_get_await_finalize_proc(void)
+{
+ GC_await_finalize_proc fn;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ fn = GC_object_finalized_proc;
+ UNLOCK();
+ return fn;
+}
+
+#ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_API int GC_CALL GC_register_long_link(void * * link, const void * obj)
+ {
+ if (((word)link & (ALIGNMENT-1)) != 0 || !NONNULL_ARG_NOT_NULL(link))
+ ABORT("Bad arg to GC_register_long_link");
+ return GC_register_disappearing_link_inner(&GC_ll_hashtbl, link, obj,
+ "long dl");
+ }
+
+ GC_API int GC_CALL GC_unregister_long_link(void * * link)
+ {
+ struct disappearing_link *curr_dl;
+ DCL_LOCK_STATE;
+
+ if (((word)link & (ALIGNMENT-1)) != 0) return(0); /* Nothing to do. */
+
+ LOCK();
+ curr_dl = GC_unregister_disappearing_link_inner(&GC_ll_hashtbl, link);
+ UNLOCK();
+ if (NULL == curr_dl) return 0;
+ FREE_DL_ENTRY(curr_dl);
+ return 1;
+ }
+#endif /* !GC_LONG_REFS_NOT_NEEDED */
+
+#ifndef GC_MOVE_DISAPPEARING_LINK_NOT_NEEDED
+ /* Moves a link. Assume the lock is held. */
+ STATIC int GC_move_disappearing_link_inner(
+ struct dl_hashtbl_s *dl_hashtbl,
+ void **link, void **new_link)
+ {
+ struct disappearing_link *curr_dl, *new_dl;
+ struct disappearing_link *prev_dl = NULL;
+ size_t curr_index, new_index;
+ word curr_hidden_link, new_hidden_link;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (EXPECT(NULL == dl_hashtbl -> head, FALSE)) return GC_NOT_FOUND;
+
+ /* Find current link. */
+ curr_index = HASH2(link, dl_hashtbl -> log_size);
+ curr_hidden_link = GC_HIDE_POINTER(link);
+ for (curr_dl = dl_hashtbl -> head[curr_index]; curr_dl;
+ curr_dl = dl_next(curr_dl)) {
+ if (curr_dl -> dl_hidden_link == curr_hidden_link)
+ break;
+ prev_dl = curr_dl;
+ }
+ if (EXPECT(NULL == curr_dl, FALSE)) {
+ return GC_NOT_FOUND;
+ } else if (link == new_link) {
+ return GC_SUCCESS; /* Nothing to do. */
+ }
+
+ /* link found; now check new_link not present. */
+ new_index = HASH2(new_link, dl_hashtbl -> log_size);
+ new_hidden_link = GC_HIDE_POINTER(new_link);
+ for (new_dl = dl_hashtbl -> head[new_index]; new_dl;
+ new_dl = dl_next(new_dl)) {
+ if (new_dl -> dl_hidden_link == new_hidden_link) {
+ /* Target already registered; bail. */
+ return GC_DUPLICATE;
+ }
+ }
+
+ /* Remove from old, add to new, update link. */
+ if (NULL == prev_dl) {
+ dl_hashtbl -> head[curr_index] = dl_next(curr_dl);
+ } else {
+ dl_set_next(prev_dl, dl_next(curr_dl));
+ GC_dirty(prev_dl);
+ }
+ curr_dl -> dl_hidden_link = new_hidden_link;
+ dl_set_next(curr_dl, dl_hashtbl -> head[new_index]);
+ dl_hashtbl -> head[new_index] = curr_dl;
+ GC_dirty(curr_dl);
+ GC_dirty(dl_hashtbl->head); /* entire object */
+ return GC_SUCCESS;
+ }
+
+ GC_API int GC_CALL GC_move_disappearing_link(void **link, void **new_link)
+ {
+ int result;
+ DCL_LOCK_STATE;
+
+ if (((word)new_link & (ALIGNMENT-1)) != 0
+ || !NONNULL_ARG_NOT_NULL(new_link))
+ ABORT("Bad new_link arg to GC_move_disappearing_link");
+ if (((word)link & (ALIGNMENT-1)) != 0)
+ return GC_NOT_FOUND; /* Nothing to do. */
+
+ LOCK();
+ result = GC_move_disappearing_link_inner(&GC_dl_hashtbl, link, new_link);
+ UNLOCK();
+ return result;
+ }
+
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_API int GC_CALL GC_move_long_link(void **link, void **new_link)
+ {
+ int result;
+ DCL_LOCK_STATE;
+
+ if (((word)new_link & (ALIGNMENT-1)) != 0
+ || !NONNULL_ARG_NOT_NULL(new_link))
+ ABORT("Bad new_link arg to GC_move_long_link");
+ if (((word)link & (ALIGNMENT-1)) != 0)
+ return GC_NOT_FOUND; /* Nothing to do. */
+
+ LOCK();
+ result = GC_move_disappearing_link_inner(&GC_ll_hashtbl, link, new_link);
+ UNLOCK();
+ return result;
+ }
+# endif /* !GC_LONG_REFS_NOT_NEEDED */
+#endif /* !GC_MOVE_DISAPPEARING_LINK_NOT_NEEDED */
+
+/* Possible finalization_marker procedures. Note that mark stack */
+/* overflow is handled by the caller, and is not a disaster. */
+#if defined(_MSC_VER) && defined(I386)
+ GC_ATTR_NOINLINE
+ /* Otherwise some optimizer bug is tickled in VC for x86 (v19, at least). */
+#endif
+STATIC void GC_normal_finalize_mark_proc(ptr_t p)
+{
+ GC_mark_stack_top = GC_push_obj(p, HDR(p), GC_mark_stack_top,
+ GC_mark_stack + GC_mark_stack_size);
+}
+
+/* This only pays very partial attention to the mark descriptor. */
+/* It does the right thing for normal and atomic objects, and treats */
+/* most others as normal. */
+STATIC void GC_ignore_self_finalize_mark_proc(ptr_t p)
+{
+ hdr * hhdr = HDR(p);
+ word descr = hhdr -> hb_descr;
+ ptr_t q;
+ ptr_t scan_limit;
+ ptr_t target_limit = p + hhdr -> hb_sz - 1;
+
+ if ((descr & GC_DS_TAGS) == GC_DS_LENGTH) {
+ scan_limit = p + descr - sizeof(word);
+ } else {
+ scan_limit = target_limit + 1 - sizeof(word);
+ }
+ for (q = p; (word)q <= (word)scan_limit; q += ALIGNMENT) {
+ word r = *(word *)q;
+
+ if (r < (word)p || r > (word)target_limit) {
+ GC_PUSH_ONE_HEAP(r, q, GC_mark_stack_top);
+ }
+ }
+}
+
+STATIC void GC_null_finalize_mark_proc(ptr_t p GC_ATTR_UNUSED) {}
+
+/* Possible finalization_marker procedures. Note that mark stack */
+/* overflow is handled by the caller, and is not a disaster. */
+
+/* GC_unreachable_finalize_mark_proc is an alias for normal marking, */
+/* but it is explicitly tested for, and triggers different */
+/* behavior. Objects registered in this way are not finalized */
+/* if they are reachable by other finalizable objects, even if those */
+/* other objects specify no ordering. */
+STATIC void GC_unreachable_finalize_mark_proc(ptr_t p)
+{
+ /* A dummy comparison to ensure the compiler not to optimize two */
+ /* identical functions into a single one (thus, to ensure a unique */
+ /* address of each). Alternatively, GC_noop1(p) could be used. */
+ if (EXPECT(NULL == p, FALSE)) return;
+
+ GC_normal_finalize_mark_proc(p);
+}
+
+static GC_bool need_unreachable_finalization = FALSE;
+ /* Avoid the work if this is not used. */
+ /* TODO: turn need_unreachable_finalization into a counter */
+
+/* Register a finalization function. See gc.h for details. */
+/* The last parameter is a procedure that determines */
+/* marking for finalization ordering. Any objects marked */
+/* by that procedure will be guaranteed to not have been */
+/* finalized when this finalizer is invoked. */
+STATIC void GC_register_finalizer_inner(void * obj,
+ GC_finalization_proc fn, void *cd,
+ GC_finalization_proc *ofn, void **ocd,
+ finalization_mark_proc mp)
+{
+ struct finalizable_object * curr_fo;
+ size_t index;
+ struct finalizable_object *new_fo = 0;
+ hdr *hhdr = NULL; /* initialized to prevent warning. */
+ DCL_LOCK_STATE;
+
+ if (EXPECT(GC_find_leak, FALSE)) {
+ /* No-op. *ocd and *ofn remain unchanged. */
+ return;
+ }
+ LOCK();
+ if (mp == GC_unreachable_finalize_mark_proc)
+ need_unreachable_finalization = TRUE;
+ if (EXPECT(NULL == GC_fnlz_roots.fo_head, FALSE)
+ || EXPECT(GC_fo_entries > ((word)1 << GC_log_fo_table_size), FALSE)) {
+ GC_grow_table((struct hash_chain_entry ***)&GC_fnlz_roots.fo_head,
+ &GC_log_fo_table_size, &GC_fo_entries);
+ GC_COND_LOG_PRINTF("Grew fo table to %u entries\n",
+ 1U << GC_log_fo_table_size);
+ }
+ /* in the THREADS case we hold allocation lock. */
+ for (;;) {
+ struct finalizable_object *prev_fo = NULL;
+ GC_oom_func oom_fn;
+
+ index = HASH2(obj, GC_log_fo_table_size);
+ curr_fo = GC_fnlz_roots.fo_head[index];
+ while (curr_fo != 0) {
+ GC_ASSERT(GC_size(curr_fo) >= sizeof(struct finalizable_object));
+ if (curr_fo -> fo_hidden_base == GC_HIDE_POINTER(obj)) {
+ /* Interruption by a signal in the middle of this */
+ /* should be safe. The client may see only *ocd */
+ /* updated, but we'll declare that to be his problem. */
+ if (ocd) *ocd = (void *) (curr_fo -> fo_client_data);
+ if (ofn) *ofn = curr_fo -> fo_fn;
+ /* Delete the structure for obj. */
+ if (prev_fo == 0) {
+ GC_fnlz_roots.fo_head[index] = fo_next(curr_fo);
+ } else {
+ fo_set_next(prev_fo, fo_next(curr_fo));
+ GC_dirty(prev_fo);
+ }
+ if (fn == 0) {
+ GC_fo_entries--;
+ /* May not happen if we get a signal. But a high */
+ /* estimate will only make the table larger than */
+ /* necessary. */
+# if !defined(THREADS) && !defined(DBG_HDRS_ALL)
+ GC_free((void *)curr_fo);
+# endif
+ } else {
+ curr_fo -> fo_fn = fn;
+ curr_fo -> fo_client_data = (ptr_t)cd;
+ curr_fo -> fo_mark_proc = mp;
+ GC_dirty(curr_fo);
+ /* Reinsert it. We deleted it first to maintain */
+ /* consistency in the event of a signal. */
+ if (prev_fo == 0) {
+ GC_fnlz_roots.fo_head[index] = curr_fo;
+ } else {
+ fo_set_next(prev_fo, curr_fo);
+ GC_dirty(prev_fo);
+ }
+ }
+ if (NULL == prev_fo)
+ GC_dirty(GC_fnlz_roots.fo_head + index);
+ UNLOCK();
+# ifndef DBG_HDRS_ALL
+ /* Free unused new_fo returned by GC_oom_fn() */
+ GC_free((void *)new_fo);
+# endif
+ return;
+ }
+ prev_fo = curr_fo;
+ curr_fo = fo_next(curr_fo);
+ }
+ if (EXPECT(new_fo != 0, FALSE)) {
+ /* new_fo is returned by GC_oom_fn(). */
+ GC_ASSERT(fn != 0);
+# ifdef LINT2
+ if (NULL == hhdr) ABORT("Bad hhdr in GC_register_finalizer_inner");
+# endif
+ break;
+ }
+ if (fn == 0) {
+ if (ocd) *ocd = 0;
+ if (ofn) *ofn = 0;
+ UNLOCK();
+ return;
+ }
+ GET_HDR(obj, hhdr);
+ if (EXPECT(0 == hhdr, FALSE)) {
+ /* We won't collect it, hence finalizer wouldn't be run. */
+ if (ocd) *ocd = 0;
+ if (ofn) *ofn = 0;
+ UNLOCK();
+ return;
+ }
+ new_fo = (struct finalizable_object *)
+ GC_INTERNAL_MALLOC(sizeof(struct finalizable_object),NORMAL);
+ if (EXPECT(new_fo != 0, TRUE))
+ break;
+ oom_fn = GC_oom_fn;
+ UNLOCK();
+ new_fo = (struct finalizable_object *)
+ (*oom_fn)(sizeof(struct finalizable_object));
+ if (0 == new_fo) {
+ /* No enough memory. *ocd and *ofn remain unchanged. */
+ return;
+ }
+ /* It's not likely we'll make it here, but ... */
+ LOCK();
+ /* Recalculate index since the table may grow and */
+ /* check again that our finalizer is not in the table. */
+ }
+ GC_ASSERT(GC_size(new_fo) >= sizeof(struct finalizable_object));
+ if (ocd) *ocd = 0;
+ if (ofn) *ofn = 0;
+ new_fo -> fo_hidden_base = GC_HIDE_POINTER(obj);
+ new_fo -> fo_fn = fn;
+ new_fo -> fo_client_data = (ptr_t)cd;
+ new_fo -> fo_object_size = hhdr -> hb_sz;
+ new_fo -> fo_mark_proc = mp;
+ fo_set_next(new_fo, GC_fnlz_roots.fo_head[index]);
+ GC_dirty(new_fo);
+ GC_fo_entries++;
+ GC_fnlz_roots.fo_head[index] = new_fo;
+ GC_dirty(GC_fnlz_roots.fo_head + index);
+ UNLOCK();
+}
+
+GC_API void GC_CALL GC_register_finalizer(void * obj,
+ GC_finalization_proc fn, void * cd,
+ GC_finalization_proc *ofn, void ** ocd)
+{
+ GC_register_finalizer_inner(obj, fn, cd, ofn,
+ ocd, GC_normal_finalize_mark_proc);
+}
+
+GC_API void GC_CALL GC_register_finalizer_ignore_self(void * obj,
+ GC_finalization_proc fn, void * cd,
+ GC_finalization_proc *ofn, void ** ocd)
+{
+ GC_register_finalizer_inner(obj, fn, cd, ofn,
+ ocd, GC_ignore_self_finalize_mark_proc);
+}
+
+GC_API void GC_CALL GC_register_finalizer_no_order(void * obj,
+ GC_finalization_proc fn, void * cd,
+ GC_finalization_proc *ofn, void ** ocd)
+{
+ GC_register_finalizer_inner(obj, fn, cd, ofn,
+ ocd, GC_null_finalize_mark_proc);
+}
+
+GC_API void GC_CALL GC_register_finalizer_unreachable(void * obj,
+ GC_finalization_proc fn, void * cd,
+ GC_finalization_proc *ofn, void ** ocd)
+{
+ GC_ASSERT(GC_java_finalization);
+ GC_register_finalizer_inner(obj, fn, cd, ofn,
+ ocd, GC_unreachable_finalize_mark_proc);
+}
+
+#ifndef NO_DEBUGGING
+ STATIC void GC_dump_finalization_links(
+ const struct dl_hashtbl_s *dl_hashtbl)
+ {
+ size_t dl_size = (size_t)1 << dl_hashtbl -> log_size;
+ size_t i;
+
+ if (NULL == dl_hashtbl -> head) return; /* empty table */
+
+ for (i = 0; i < dl_size; i++) {
+ struct disappearing_link *curr_dl;
+
+ for (curr_dl = dl_hashtbl -> head[i]; curr_dl != 0;
+ curr_dl = dl_next(curr_dl)) {
+ ptr_t real_ptr = (ptr_t)GC_REVEAL_POINTER(curr_dl->dl_hidden_obj);
+ ptr_t real_link = (ptr_t)GC_REVEAL_POINTER(curr_dl->dl_hidden_link);
+
+ GC_printf("Object: %p, link: %p\n",
+ (void *)real_ptr, (void *)real_link);
+ }
+ }
+ }
+
+ GC_API void GC_CALL GC_dump_finalization(void)
+ {
+ struct finalizable_object * curr_fo;
+ size_t i;
+ size_t fo_size = GC_fnlz_roots.fo_head == NULL ? 0 :
+ (size_t)1 << GC_log_fo_table_size;
+
+ GC_printf("Disappearing (short) links:\n");
+ GC_dump_finalization_links(&GC_dl_hashtbl);
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_printf("Disappearing long links:\n");
+ GC_dump_finalization_links(&GC_ll_hashtbl);
+# endif
+ GC_printf("Finalizers:\n");
+ for (i = 0; i < fo_size; i++) {
+ for (curr_fo = GC_fnlz_roots.fo_head[i];
+ curr_fo != NULL; curr_fo = fo_next(curr_fo)) {
+ ptr_t real_ptr = (ptr_t)GC_REVEAL_POINTER(curr_fo->fo_hidden_base);
+
+ GC_printf("Finalizable object: %p\n", (void *)real_ptr);
+ }
+ }
+ }
+#endif /* !NO_DEBUGGING */
+
+#ifndef SMALL_CONFIG
+ STATIC word GC_old_dl_entries = 0; /* for stats printing */
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ STATIC word GC_old_ll_entries = 0;
+# endif
+#endif /* !SMALL_CONFIG */
+
+#ifndef THREADS
+ /* Global variables to minimize the level of recursion when a client */
+ /* finalizer allocates memory. */
+ STATIC int GC_finalizer_nested = 0;
+ /* Only the lowest byte is used, the rest is */
+ /* padding for proper global data alignment */
+ /* required for some compilers (like Watcom). */
+ STATIC unsigned GC_finalizer_skipped = 0;
+
+ /* Checks and updates the level of finalizers recursion. */
+ /* Returns NULL if GC_invoke_finalizers() should not be called by the */
+ /* collector (to minimize the risk of a deep finalizers recursion), */
+ /* otherwise returns a pointer to GC_finalizer_nested. */
+ STATIC unsigned char *GC_check_finalizer_nested(void)
+ {
+ unsigned nesting_level = *(unsigned char *)&GC_finalizer_nested;
+ if (nesting_level) {
+ /* We are inside another GC_invoke_finalizers(). */
+ /* Skip some implicitly-called GC_invoke_finalizers() */
+ /* depending on the nesting (recursion) level. */
+ if (++GC_finalizer_skipped < (1U << nesting_level)) return NULL;
+ GC_finalizer_skipped = 0;
+ }
+ *(char *)&GC_finalizer_nested = (char)(nesting_level + 1);
+ return (unsigned char *)&GC_finalizer_nested;
+ }
+#endif /* THREADS */
+
+GC_INLINE void GC_make_disappearing_links_disappear(
+ struct dl_hashtbl_s* dl_hashtbl,
+ GC_bool is_remove_dangling)
+{
+ size_t i;
+ size_t dl_size = (size_t)1 << dl_hashtbl -> log_size;
+ GC_bool needs_barrier = FALSE;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (NULL == dl_hashtbl -> head) return; /* empty table */
+
+ for (i = 0; i < dl_size; i++) {
+ struct disappearing_link *curr_dl, *next_dl;
+ struct disappearing_link *prev_dl = NULL;
+
+ for (curr_dl = dl_hashtbl->head[i]; curr_dl != NULL; curr_dl = next_dl) {
+ next_dl = dl_next(curr_dl);
+ if (is_remove_dangling) {
+ ptr_t real_link = (ptr_t)GC_base(GC_REVEAL_POINTER(
+ curr_dl->dl_hidden_link));
+
+ if (NULL == real_link || EXPECT(GC_is_marked(real_link), TRUE)) {
+ prev_dl = curr_dl;
+ continue;
+ }
+ } else {
+ if (EXPECT(GC_is_marked((ptr_t)GC_REVEAL_POINTER(
+ curr_dl->dl_hidden_obj)), TRUE)) {
+ prev_dl = curr_dl;
+ continue;
+ }
+ *(ptr_t *)GC_REVEAL_POINTER(curr_dl->dl_hidden_link) = NULL;
+ }
+
+ /* Delete curr_dl entry from dl_hashtbl. */
+ if (NULL == prev_dl) {
+ dl_hashtbl -> head[i] = next_dl;
+ needs_barrier = TRUE;
+ } else {
+ dl_set_next(prev_dl, next_dl);
+ GC_dirty(prev_dl);
+ }
+ GC_clear_mark_bit(curr_dl);
+ dl_hashtbl -> entries--;
+ }
+ }
+ if (needs_barrier)
+ GC_dirty(dl_hashtbl -> head); /* entire object */
+}
+
+/* Called with held lock (but the world is running). */
+/* Cause disappearing links to disappear and unreachable objects to be */
+/* enqueued for finalization. */
+GC_INNER void GC_finalize(void)
+{
+ struct finalizable_object * curr_fo, * prev_fo, * next_fo;
+ ptr_t real_ptr;
+ size_t i;
+ size_t fo_size = GC_fnlz_roots.fo_head == NULL ? 0 :
+ (size_t)1 << GC_log_fo_table_size;
+ GC_bool needs_barrier = FALSE;
+
+ GC_ASSERT(I_HOLD_LOCK());
+# ifndef SMALL_CONFIG
+ /* Save current GC_[dl/ll]_entries value for stats printing */
+ GC_old_dl_entries = GC_dl_hashtbl.entries;
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_old_ll_entries = GC_ll_hashtbl.entries;
+# endif
+# endif
+
+# ifndef GC_TOGGLE_REFS_NOT_NEEDED
+ GC_mark_togglerefs();
+# endif
+ GC_make_disappearing_links_disappear(&GC_dl_hashtbl, FALSE);
+
+ /* Mark all objects reachable via chains of 1 or more pointers */
+ /* from finalizable objects. */
+ GC_ASSERT(GC_mark_state == MS_NONE);
+ for (i = 0; i < fo_size; i++) {
+ for (curr_fo = GC_fnlz_roots.fo_head[i];
+ curr_fo != NULL; curr_fo = fo_next(curr_fo)) {
+ GC_ASSERT(GC_size(curr_fo) >= sizeof(struct finalizable_object));
+ real_ptr = (ptr_t)GC_REVEAL_POINTER(curr_fo->fo_hidden_base);
+ if (!GC_is_marked(real_ptr)) {
+ GC_MARKED_FOR_FINALIZATION(real_ptr);
+ GC_MARK_FO(real_ptr, curr_fo -> fo_mark_proc);
+ if (GC_is_marked(real_ptr)) {
+ WARN("Finalization cycle involving %p\n", real_ptr);
+ }
+ }
+ }
+ }
+ /* Enqueue for finalization all objects that are still */
+ /* unreachable. */
+ GC_bytes_finalized = 0;
+ for (i = 0; i < fo_size; i++) {
+ curr_fo = GC_fnlz_roots.fo_head[i];
+ prev_fo = 0;
+ while (curr_fo != 0) {
+ real_ptr = (ptr_t)GC_REVEAL_POINTER(curr_fo->fo_hidden_base);
+ if (!GC_is_marked(real_ptr)) {
+ if (!GC_java_finalization) {
+ GC_set_mark_bit(real_ptr);
+ }
+ /* Delete from hash table */
+ next_fo = fo_next(curr_fo);
+ if (NULL == prev_fo) {
+ GC_fnlz_roots.fo_head[i] = next_fo;
+ if (GC_object_finalized_proc) {
+ GC_dirty(GC_fnlz_roots.fo_head + i);
+ } else {
+ needs_barrier = TRUE;
+ }
+ } else {
+ fo_set_next(prev_fo, next_fo);
+ GC_dirty(prev_fo);
+ }
+ GC_fo_entries--;
+ if (GC_object_finalized_proc)
+ GC_object_finalized_proc(real_ptr);
+
+ /* Add to list of objects awaiting finalization. */
+ fo_set_next(curr_fo, GC_fnlz_roots.finalize_now);
+ GC_dirty(curr_fo);
+ SET_FINALIZE_NOW(curr_fo);
+ /* unhide object pointer so any future collections will */
+ /* see it. */
+ curr_fo -> fo_hidden_base =
+ (word)GC_REVEAL_POINTER(curr_fo -> fo_hidden_base);
+ GC_bytes_finalized +=
+ curr_fo -> fo_object_size
+ + sizeof(struct finalizable_object);
+ GC_ASSERT(GC_is_marked(GC_base(curr_fo)));
+ curr_fo = next_fo;
+ } else {
+ prev_fo = curr_fo;
+ curr_fo = fo_next(curr_fo);
+ }
+ }
+ }
+
+ if (GC_java_finalization) {
+ /* make sure we mark everything reachable from objects finalized
+ using the no_order mark_proc */
+ for (curr_fo = GC_fnlz_roots.finalize_now;
+ curr_fo != NULL; curr_fo = fo_next(curr_fo)) {
+ real_ptr = (ptr_t)curr_fo -> fo_hidden_base;
+ if (!GC_is_marked(real_ptr)) {
+ if (curr_fo -> fo_mark_proc == GC_null_finalize_mark_proc) {
+ GC_MARK_FO(real_ptr, GC_normal_finalize_mark_proc);
+ }
+ if (curr_fo -> fo_mark_proc != GC_unreachable_finalize_mark_proc) {
+ GC_set_mark_bit(real_ptr);
+ }
+ }
+ }
+
+ /* now revive finalize-when-unreachable objects reachable from
+ other finalizable objects */
+ if (need_unreachable_finalization) {
+ curr_fo = GC_fnlz_roots.finalize_now;
+ GC_ASSERT(NULL == curr_fo || GC_fnlz_roots.fo_head != NULL);
+ prev_fo = NULL;
+ while (curr_fo != NULL) {
+ next_fo = fo_next(curr_fo);
+ if (curr_fo -> fo_mark_proc == GC_unreachable_finalize_mark_proc) {
+ real_ptr = (ptr_t)curr_fo -> fo_hidden_base;
+ if (!GC_is_marked(real_ptr)) {
+ GC_set_mark_bit(real_ptr);
+ } else {
+ if (NULL == prev_fo) {
+ SET_FINALIZE_NOW(next_fo);
+ } else {
+ fo_set_next(prev_fo, next_fo);
+ GC_dirty(prev_fo);
+ }
+ curr_fo -> fo_hidden_base =
+ GC_HIDE_POINTER(curr_fo -> fo_hidden_base);
+ GC_bytes_finalized -=
+ curr_fo->fo_object_size + sizeof(struct finalizable_object);
+
+ i = HASH2(real_ptr, GC_log_fo_table_size);
+ fo_set_next(curr_fo, GC_fnlz_roots.fo_head[i]);
+ GC_dirty(curr_fo);
+ GC_fo_entries++;
+ GC_fnlz_roots.fo_head[i] = curr_fo;
+ curr_fo = prev_fo;
+ needs_barrier = TRUE;
+ }
+ }
+ prev_fo = curr_fo;
+ curr_fo = next_fo;
+ }
+ }
+ }
+ if (needs_barrier)
+ GC_dirty(GC_fnlz_roots.fo_head); /* entire object */
+
+ /* Remove dangling disappearing links. */
+ GC_make_disappearing_links_disappear(&GC_dl_hashtbl, TRUE);
+
+# ifndef GC_TOGGLE_REFS_NOT_NEEDED
+ GC_clear_togglerefs();
+# endif
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_make_disappearing_links_disappear(&GC_ll_hashtbl, FALSE);
+ GC_make_disappearing_links_disappear(&GC_ll_hashtbl, TRUE);
+# endif
+
+ if (GC_fail_count) {
+ /* Don't prevent running finalizers if there has been an allocation */
+ /* failure recently. */
+# ifdef THREADS
+ GC_reset_finalizer_nested();
+# else
+ GC_finalizer_nested = 0;
+# endif
+ }
+}
+
+#ifndef JAVA_FINALIZATION_NOT_NEEDED
+
+ /* Enqueue all remaining finalizers to be run. */
+ STATIC void GC_enqueue_all_finalizers(void)
+ {
+ struct finalizable_object * next_fo;
+ size_t i;
+ size_t fo_size = GC_fnlz_roots.fo_head == NULL ? 0 :
+ (size_t)1 << GC_log_fo_table_size;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_bytes_finalized = 0;
+ for (i = 0; i < fo_size; i++) {
+ struct finalizable_object * curr_fo = GC_fnlz_roots.fo_head[i];
+
+ GC_fnlz_roots.fo_head[i] = NULL;
+ while (curr_fo != NULL) {
+ ptr_t real_ptr = (ptr_t)GC_REVEAL_POINTER(curr_fo->fo_hidden_base);
+
+ GC_MARK_FO(real_ptr, GC_normal_finalize_mark_proc);
+ GC_set_mark_bit(real_ptr);
+
+ next_fo = fo_next(curr_fo);
+
+ /* Add to list of objects awaiting finalization. */
+ fo_set_next(curr_fo, GC_fnlz_roots.finalize_now);
+ GC_dirty(curr_fo);
+ SET_FINALIZE_NOW(curr_fo);
+
+ /* unhide object pointer so any future collections will */
+ /* see it. */
+ curr_fo -> fo_hidden_base =
+ (word)GC_REVEAL_POINTER(curr_fo -> fo_hidden_base);
+ GC_bytes_finalized +=
+ curr_fo -> fo_object_size + sizeof(struct finalizable_object);
+ curr_fo = next_fo;
+ }
+ }
+ GC_fo_entries = 0; /* all entries deleted from the hash table */
+ }
+
+ /* Invoke all remaining finalizers that haven't yet been run.
+ * This is needed for strict compliance with the Java standard,
+ * which can make the runtime guarantee that all finalizers are run.
+ * Unfortunately, the Java standard implies we have to keep running
+ * finalizers until there are no more left, a potential infinite loop.
+ * YUCK.
+ * Note that this is even more dangerous than the usual Java
+ * finalizers, in that objects reachable from static variables
+ * may have been finalized when these finalizers are run.
+ * Finalizers run at this point must be prepared to deal with a
+ * mostly broken world.
+ * This routine is externally callable, so is called without
+ * the allocation lock.
+ */
+ GC_API void GC_CALL GC_finalize_all(void)
+ {
+ DCL_LOCK_STATE;
+
+ LOCK();
+ while (GC_fo_entries > 0) {
+ GC_enqueue_all_finalizers();
+ UNLOCK();
+ GC_invoke_finalizers();
+ /* Running the finalizers in this thread is arguably not a good */
+ /* idea when we should be notifying another thread to run them. */
+ /* But otherwise we don't have a great way to wait for them to */
+ /* run. */
+ LOCK();
+ }
+ UNLOCK();
+ }
+
+#endif /* !JAVA_FINALIZATION_NOT_NEEDED */
+
+/* Returns true if it is worth calling GC_invoke_finalizers. (Useful if */
+/* finalizers can only be called from some kind of "safe state" and */
+/* getting into that safe state is expensive.) */
+GC_API int GC_CALL GC_should_invoke_finalizers(void)
+{
+# ifdef AO_HAVE_load
+ return AO_load((volatile AO_t *)&GC_fnlz_roots.finalize_now) != 0;
+# else
+ return GC_fnlz_roots.finalize_now != NULL;
+# endif /* !THREADS */
+}
+
+/* Invoke finalizers for all objects that are ready to be finalized. */
+/* Should be called without allocation lock. */
+GC_API int GC_CALL GC_invoke_finalizers(void)
+{
+ int count = 0;
+ word bytes_freed_before = 0; /* initialized to prevent warning. */
+ DCL_LOCK_STATE;
+
+ while (GC_should_invoke_finalizers()) {
+ struct finalizable_object * curr_fo;
+
+# ifdef THREADS
+ LOCK();
+# endif
+ if (count == 0) {
+ bytes_freed_before = GC_bytes_freed;
+ /* Don't do this outside, since we need the lock. */
+ }
+ curr_fo = GC_fnlz_roots.finalize_now;
+# ifdef THREADS
+ if (curr_fo != NULL)
+ SET_FINALIZE_NOW(fo_next(curr_fo));
+ UNLOCK();
+ if (curr_fo == 0) break;
+# else
+ GC_fnlz_roots.finalize_now = fo_next(curr_fo);
+# endif
+ fo_set_next(curr_fo, 0);
+ (*(curr_fo -> fo_fn))((ptr_t)(curr_fo -> fo_hidden_base),
+ curr_fo -> fo_client_data);
+ curr_fo -> fo_client_data = 0;
+ ++count;
+ /* Explicit freeing of curr_fo is probably a bad idea. */
+ /* It throws off accounting if nearly all objects are */
+ /* finalizable. Otherwise it should not matter. */
+ }
+ /* bytes_freed_before is initialized whenever count != 0 */
+ if (count != 0
+# if defined(THREADS) && !defined(THREAD_SANITIZER)
+ /* A quick check whether some memory was freed. */
+ /* The race with GC_free() is safe to be ignored */
+ /* because we only need to know if the current */
+ /* thread has deallocated something. */
+ && bytes_freed_before != GC_bytes_freed
+# endif
+ ) {
+ LOCK();
+ GC_finalizer_bytes_freed += (GC_bytes_freed - bytes_freed_before);
+ UNLOCK();
+ }
+ return count;
+}
+
+static word last_finalizer_notification = 0;
+
+GC_INNER void GC_notify_or_invoke_finalizers(void)
+{
+ GC_finalizer_notifier_proc notifier_fn = 0;
+# if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH)
+ static word last_back_trace_gc_no = 1; /* Skip first one. */
+# endif
+ DCL_LOCK_STATE;
+
+# if defined(THREADS) && !defined(KEEP_BACK_PTRS) \
+ && !defined(MAKE_BACK_GRAPH)
+ /* Quick check (while unlocked) for an empty finalization queue. */
+ if (!GC_should_invoke_finalizers())
+ return;
+# endif
+ LOCK();
+
+ /* This is a convenient place to generate backtraces if appropriate, */
+ /* since that code is not callable with the allocation lock. */
+# if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH)
+ if (GC_gc_no != last_back_trace_gc_no) {
+# ifdef KEEP_BACK_PTRS
+ static GC_bool bt_in_progress = FALSE;
+
+ if (!bt_in_progress) {
+ long i;
+
+ bt_in_progress = TRUE; /* prevent recursion or parallel usage */
+ for (i = 0; i < GC_backtraces; ++i) {
+ /* FIXME: This tolerates concurrent heap mutation, */
+ /* which may cause occasional mysterious results. */
+ /* We need to release the GC lock, since GC_print_callers */
+ /* acquires it. It probably shouldn't. */
+ void *current = GC_generate_random_valid_address();
+
+ UNLOCK();
+ GC_printf("\n****Chosen address %p in object\n", current);
+ GC_print_backtrace(current);
+ LOCK();
+ }
+ bt_in_progress = FALSE;
+ }
+# endif
+ last_back_trace_gc_no = GC_gc_no;
+# ifdef MAKE_BACK_GRAPH
+ if (GC_print_back_height) {
+ GC_print_back_graph_stats();
+ }
+# endif
+ }
+# endif
+ if (NULL == GC_fnlz_roots.finalize_now) {
+ UNLOCK();
+ return;
+ }
+
+ if (!GC_finalize_on_demand) {
+ unsigned char *pnested = GC_check_finalizer_nested();
+ UNLOCK();
+ /* Skip GC_invoke_finalizers() if nested */
+ if (pnested != NULL) {
+ (void) GC_invoke_finalizers();
+ *pnested = 0; /* Reset since no more finalizers. */
+# ifndef THREADS
+ GC_ASSERT(NULL == GC_fnlz_roots.finalize_now);
+# endif /* Otherwise GC can run concurrently and add more */
+ }
+ return;
+ }
+
+ /* These variables require synchronization to avoid data races. */
+ if (last_finalizer_notification != GC_gc_no) {
+ notifier_fn = GC_finalizer_notifier;
+ last_finalizer_notification = GC_gc_no;
+ }
+ UNLOCK();
+ if (notifier_fn != 0)
+ (*notifier_fn)(); /* Invoke the notifier */
+}
+
+#ifndef SMALL_CONFIG
+# ifndef GC_LONG_REFS_NOT_NEEDED
+# define IF_LONG_REFS_PRESENT_ELSE(x,y) (x)
+# else
+# define IF_LONG_REFS_PRESENT_ELSE(x,y) (y)
+# endif
+
+ GC_INNER void GC_print_finalization_stats(void)
+ {
+ struct finalizable_object *fo;
+ unsigned long ready = 0;
+
+ GC_log_printf("%lu finalization entries;"
+ " %lu/%lu short/long disappearing links alive\n",
+ (unsigned long)GC_fo_entries,
+ (unsigned long)GC_dl_hashtbl.entries,
+ (unsigned long)IF_LONG_REFS_PRESENT_ELSE(
+ GC_ll_hashtbl.entries, 0));
+
+ for (fo = GC_fnlz_roots.finalize_now; fo != NULL; fo = fo_next(fo))
+ ++ready;
+ GC_log_printf("%lu finalization-ready objects;"
+ " %ld/%ld short/long links cleared\n",
+ ready,
+ (long)GC_old_dl_entries - (long)GC_dl_hashtbl.entries,
+ (long)IF_LONG_REFS_PRESENT_ELSE(
+ GC_old_ll_entries - GC_ll_hashtbl.entries, 0));
+ }
+#endif /* !SMALL_CONFIG */
+
+#endif /* !GC_NO_FINALIZATION */
diff --git a/graphics/asymptote/gc/fnlz_mlc.c b/graphics/asymptote/gc/fnlz_mlc.c
new file mode 100644
index 0000000000..cf64a9db41
--- /dev/null
+++ b/graphics/asymptote/gc/fnlz_mlc.c
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2011 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#include "private/gc_priv.h"
+
+#ifdef ENABLE_DISCLAIM
+
+#include "gc_disclaim.h"
+#include "gc_inline.h" /* for GC_malloc_kind */
+#include "private/dbg_mlc.h" /* for oh type */
+
+#if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH)
+ /* The first bit is already used for a debug purpose. */
+# define FINALIZER_CLOSURE_FLAG 0x2
+#else
+# define FINALIZER_CLOSURE_FLAG 0x1
+#endif
+
+STATIC int GC_CALLBACK GC_finalized_disclaim(void *obj)
+{
+# ifdef AO_HAVE_load
+ word fc_word = (word)AO_load((volatile AO_t *)obj);
+# else
+ word fc_word = *(word *)obj;
+# endif
+
+ if ((fc_word & FINALIZER_CLOSURE_FLAG) != 0) {
+ /* The disclaim function may be passed fragments from the */
+ /* free-list, on which it should not run finalization. */
+ /* To recognize this case, we use the fact that the first word */
+ /* on such fragments is always multiple of 4 (a link to the next */
+ /* fragment, or NULL). If it is desirable to have a finalizer */
+ /* which does not use the first word for storing finalization */
+ /* info, GC_disclaim_and_reclaim() must be extended to clear */
+ /* fragments so that the assumption holds for the selected word. */
+ const struct GC_finalizer_closure *fc
+ = (struct GC_finalizer_closure *)(fc_word
+ & ~(word)FINALIZER_CLOSURE_FLAG);
+ GC_ASSERT(!GC_find_leak);
+ (*fc->proc)((word *)obj + 1, fc->cd);
+ }
+ return 0;
+}
+
+GC_API void GC_CALL GC_init_finalized_malloc(void)
+{
+ DCL_LOCK_STATE;
+
+ GC_init(); /* In case it's not already done. */
+ LOCK();
+ if (GC_finalized_kind != 0) {
+ UNLOCK();
+ return;
+ }
+
+ /* The finalizer closure is placed in the first word in order to */
+ /* use the lower bits to distinguish live objects from objects on */
+ /* the free list. The downside of this is that we need one-word */
+ /* offset interior pointers, and that GC_base does not return the */
+ /* start of the user region. */
+ GC_register_displacement_inner(sizeof(word));
+
+ /* And, the pointer to the finalizer closure object itself is */
+ /* displaced due to baking in this indicator. */
+ GC_register_displacement_inner(FINALIZER_CLOSURE_FLAG);
+ GC_register_displacement_inner(sizeof(oh) + FINALIZER_CLOSURE_FLAG);
+
+ GC_finalized_kind = GC_new_kind_inner(GC_new_free_list_inner(),
+ GC_DS_LENGTH, TRUE, TRUE);
+ GC_ASSERT(GC_finalized_kind != 0);
+ GC_register_disclaim_proc(GC_finalized_kind, GC_finalized_disclaim, TRUE);
+ UNLOCK();
+}
+
+GC_API void GC_CALL GC_register_disclaim_proc(int kind, GC_disclaim_proc proc,
+ int mark_unconditionally)
+{
+ GC_ASSERT((unsigned)kind < MAXOBJKINDS);
+ if (!EXPECT(GC_find_leak, FALSE)) {
+ GC_obj_kinds[kind].ok_disclaim_proc = proc;
+ GC_obj_kinds[kind].ok_mark_unconditionally =
+ (GC_bool)mark_unconditionally;
+ }
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_finalized_malloc(size_t lb,
+ const struct GC_finalizer_closure *fclos)
+{
+ void *op;
+
+ GC_ASSERT(GC_finalized_kind != 0);
+ GC_ASSERT(NONNULL_ARG_NOT_NULL(fclos));
+ GC_ASSERT(((word)fclos & FINALIZER_CLOSURE_FLAG) == 0);
+ op = GC_malloc_kind(SIZET_SAT_ADD(lb, sizeof(word)), GC_finalized_kind);
+ if (EXPECT(NULL == op, FALSE))
+ return NULL;
+# ifdef AO_HAVE_store
+ AO_store((volatile AO_t *)op, (AO_t)fclos | FINALIZER_CLOSURE_FLAG);
+# else
+ *(word *)op = (word)fclos | FINALIZER_CLOSURE_FLAG;
+# endif
+ GC_dirty(op);
+ REACHABLE_AFTER_DIRTY(fclos);
+ return (word *)op + 1;
+}
+
+#endif /* ENABLE_DISCLAIM */
diff --git a/graphics/asymptote/gc/gc_badalc.cc b/graphics/asymptote/gc/gc_badalc.cc
new file mode 100644
index 0000000000..6015dc56d0
--- /dev/null
+++ b/graphics/asymptote/gc/gc_badalc.cc
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2018-2020 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+// This file provides the implementation of GC_throw_bad_alloc() which
+// is invoked by GC operator "new" in case of an out-of-memory event.
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef GC_BUILD
+# define GC_BUILD
+#endif
+
+#define GC_DONT_INCL_WINDOWS_H
+#include "gc.h"
+
+#include <new> // for bad_alloc, precedes include of gc_cpp.h
+
+#if defined(GC_NEW_ABORTS_ON_OOM) || defined(_LIBCPP_NO_EXCEPTIONS)
+# define GC_ALLOCATOR_THROW_OR_ABORT() GC_abort_on_oom()
+#else
+# define GC_ALLOCATOR_THROW_OR_ABORT() throw std::bad_alloc()
+#endif
+
+GC_API void GC_CALL GC_throw_bad_alloc() {
+ GC_ALLOCATOR_THROW_OR_ABORT();
+}
diff --git a/graphics/asymptote/gc/gc_badalc.cpp b/graphics/asymptote/gc/gc_badalc.cpp
new file mode 100644
index 0000000000..7d4dc41ad5
--- /dev/null
+++ b/graphics/asymptote/gc/gc_badalc.cpp
@@ -0,0 +1,2 @@
+// Visual C++ seems to prefer a .cpp extension to .cc one.
+#include "gc_badalc.cc"
diff --git a/graphics/asymptote/gc/gc_cpp.cc b/graphics/asymptote/gc/gc_cpp.cc
new file mode 100644
index 0000000000..341805a645
--- /dev/null
+++ b/graphics/asymptote/gc/gc_cpp.cc
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*************************************************************************
+This implementation module for gc_cpp.h provides an implementation of
+the global operators "new" and "delete" that calls the Boehm
+allocator. All objects allocated by this implementation will be
+uncollectible but part of the root set of the collector.
+
+You should ensure (using implementation-dependent techniques) that the
+linker finds this module before the library that defines the default
+built-in "new" and "delete".
+**************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef GC_BUILD
+# define GC_BUILD
+#endif
+
+#define GC_DONT_INCL_WINDOWS_H
+#include "gc.h"
+
+#ifndef GC_INCLUDE_NEW
+# define GC_INCLUDE_NEW
+#endif
+#include "gc_cpp.h"
+
+#if !(defined(_MSC_VER) || defined(__DMC__)) || defined(GC_NO_INLINE_STD_NEW)
+
+#if defined(GC_NEW_ABORTS_ON_OOM) || defined(_LIBCPP_NO_EXCEPTIONS)
+# define GC_ALLOCATOR_THROW_OR_ABORT() GC_abort_on_oom()
+#else
+// Use bad_alloc() directly instead of GC_throw_bad_alloc() call.
+# define GC_ALLOCATOR_THROW_OR_ABORT() throw std::bad_alloc()
+#endif
+
+ void* operator new(size_t size) GC_DECL_NEW_THROW {
+ void* obj = GC_MALLOC_UNCOLLECTABLE(size);
+ if (0 == obj)
+ GC_ALLOCATOR_THROW_OR_ABORT();
+ return obj;
+ }
+
+# ifdef _MSC_VER
+ // This new operator is used by VC++ in case of Debug builds.
+ void* operator new(size_t size, int /* nBlockUse */,
+ const char* szFileName, int nLine)
+ {
+# ifdef GC_DEBUG
+ void* obj = GC_debug_malloc_uncollectable(size, szFileName, nLine);
+# else
+ void* obj = GC_MALLOC_UNCOLLECTABLE(size);
+ (void)szFileName; (void)nLine;
+# endif
+ if (0 == obj)
+ GC_ALLOCATOR_THROW_OR_ABORT();
+ return obj;
+ }
+# endif // _MSC_VER
+
+ void operator delete(void* obj) GC_NOEXCEPT {
+ GC_FREE(obj);
+ }
+
+# if defined(GC_OPERATOR_NEW_ARRAY) && !defined(CPPCHECK)
+ void* operator new[](size_t size) GC_DECL_NEW_THROW {
+ void* obj = GC_MALLOC_UNCOLLECTABLE(size);
+ if (0 == obj)
+ GC_ALLOCATOR_THROW_OR_ABORT();
+ return obj;
+ }
+
+# ifdef _MSC_VER
+ // This new operator is used by VC++ 7+ in Debug builds.
+ void* operator new[](size_t size, int nBlockUse,
+ const char* szFileName, int nLine)
+ {
+ return operator new(size, nBlockUse, szFileName, nLine);
+ }
+# endif // _MSC_VER
+
+ void operator delete[](void* obj) GC_NOEXCEPT {
+ GC_FREE(obj);
+ }
+# endif // GC_OPERATOR_NEW_ARRAY
+
+# if __cplusplus >= 201402L || _MSVC_LANG >= 201402L // C++14
+ void operator delete(void* obj, size_t size) GC_NOEXCEPT {
+ (void)size; // size is ignored
+ GC_FREE(obj);
+ }
+
+# if defined(GC_OPERATOR_NEW_ARRAY) && !defined(CPPCHECK)
+ void operator delete[](void* obj, size_t size) GC_NOEXCEPT {
+ (void)size;
+ GC_FREE(obj);
+ }
+# endif
+# endif // C++14
+
+#endif // !_MSC_VER && !__DMC__ || GC_NO_INLINE_STD_NEW
diff --git a/graphics/asymptote/gc/gc_cpp.cpp b/graphics/asymptote/gc/gc_cpp.cpp
new file mode 100644
index 0000000000..f6bd95e59a
--- /dev/null
+++ b/graphics/asymptote/gc/gc_cpp.cpp
@@ -0,0 +1,2 @@
+// Visual C++ seems to prefer a .cpp extension to .cc
+#include "gc_cpp.cc"
diff --git a/graphics/asymptote/gc/gc_dlopen.c b/graphics/asymptote/gc/gc_dlopen.c
new file mode 100644
index 0000000000..13991bae6d
--- /dev/null
+++ b/graphics/asymptote/gc/gc_dlopen.c
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1997 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+/* This used to be in dyn_load.c. It was extracted into a separate */
+/* file to avoid having to link against libdl.{a,so} if the client */
+/* doesn't call dlopen. Of course this fails if the collector is in */
+/* a dynamic library. -HB */
+#if defined(GC_PTHREADS) && !defined(GC_NO_DLOPEN)
+
+#undef GC_MUST_RESTORE_REDEFINED_DLOPEN
+#if defined(dlopen) && !defined(GC_USE_LD_WRAP)
+ /* To support various threads pkgs, gc.h interposes on dlopen by */
+ /* defining "dlopen" to be "GC_dlopen", which is implemented below. */
+ /* However, both GC_FirstDLOpenedLinkMap() and GC_dlopen() use the */
+ /* real system dlopen() in their implementation. We first remove */
+ /* gc.h's dlopen definition and restore it later, after GC_dlopen(). */
+# undef dlopen
+# define GC_MUST_RESTORE_REDEFINED_DLOPEN
+#endif
+
+/* Make sure we're not in the middle of a collection, and make sure we */
+/* don't start any. This is invoked prior to a dlopen call to avoid */
+/* synchronization issues. We can't just acquire the allocation lock, */
+/* since startup code in dlopen may try to allocate. This solution */
+/* risks heap growth (or, even, heap overflow) in the presence of many */
+/* dlopen calls in either a multi-threaded environment, or if the */
+/* library initialization code allocates substantial amounts of GC'ed */
+/* memory. */
+#ifndef USE_PROC_FOR_LIBRARIES
+ static void disable_gc_for_dlopen(void)
+ {
+ DCL_LOCK_STATE;
+ LOCK();
+ while (GC_incremental && GC_collection_in_progress()) {
+ ENTER_GC();
+ GC_collect_a_little_inner(1000);
+ EXIT_GC();
+ }
+ ++GC_dont_gc;
+ UNLOCK();
+ }
+#endif
+
+/* Redefine dlopen to guarantee mutual exclusion with */
+/* GC_register_dynamic_libraries. Should probably happen for */
+/* other operating systems, too. */
+
+/* This is similar to WRAP/REAL_FUNC() in pthread_support.c. */
+#ifdef GC_USE_LD_WRAP
+# define WRAP_DLFUNC(f) __wrap_##f
+# define REAL_DLFUNC(f) __real_##f
+ void * REAL_DLFUNC(dlopen)(const char *, int);
+#else
+# define WRAP_DLFUNC(f) GC_##f
+# define REAL_DLFUNC(f) f
+#endif
+
+GC_API void * WRAP_DLFUNC(dlopen)(const char *path, int mode)
+{
+ void * result;
+
+# ifndef USE_PROC_FOR_LIBRARIES
+ /* Disable collections. This solution risks heap growth (or, */
+ /* even, heap overflow) but there seems no better solutions. */
+ disable_gc_for_dlopen();
+# endif
+ result = REAL_DLFUNC(dlopen)(path, mode);
+# ifndef USE_PROC_FOR_LIBRARIES
+ GC_enable(); /* undoes disable_gc_for_dlopen */
+# endif
+ return(result);
+}
+
+#ifdef GC_USE_LD_WRAP
+ /* Define GC_ function as an alias for the plain one, which will be */
+ /* intercepted. This allows files which include gc.h, and hence */
+ /* generate references to the GC_ symbol, to see the right symbol. */
+ GC_API void *GC_dlopen(const char *path, int mode)
+ {
+ return dlopen(path, mode);
+ }
+#endif /* GC_USE_LD_WRAP */
+
+#ifdef GC_MUST_RESTORE_REDEFINED_DLOPEN
+# define dlopen GC_dlopen
+#endif
+
+#endif /* GC_PTHREADS && !GC_NO_DLOPEN */
diff --git a/graphics/asymptote/gc/gcj_mlc.c b/graphics/asymptote/gc/gcj_mlc.c
new file mode 100644
index 0000000000..10525d21d8
--- /dev/null
+++ b/graphics/asymptote/gc/gcj_mlc.c
@@ -0,0 +1,266 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#include "private/gc_pmark.h" /* includes gc_priv.h */
+
+#ifdef GC_GCJ_SUPPORT
+
+/*
+ * This is an allocator interface tuned for gcj (the GNU static
+ * java compiler).
+ *
+ * Each allocated object has a pointer in its first word to a vtable,
+ * which for our purposes is simply a structure describing the type of
+ * the object.
+ * This descriptor structure contains a GC marking descriptor at offset
+ * MARK_DESCR_OFFSET.
+ *
+ * It is hoped that this interface may also be useful for other systems,
+ * possibly with some tuning of the constants. But the immediate goal
+ * is to get better gcj performance.
+ *
+ * We assume: counting on explicit initialization of this interface is OK.
+ */
+
+#include "gc_gcj.h"
+#include "private/dbg_mlc.h"
+
+int GC_gcj_kind = 0; /* Object kind for objects with descriptors */
+ /* in "vtable". */
+int GC_gcj_debug_kind = 0;
+ /* The kind of objects that is always marked */
+ /* with a mark proc call. */
+
+STATIC struct GC_ms_entry * GC_gcj_fake_mark_proc(word * addr GC_ATTR_UNUSED,
+ struct GC_ms_entry *mark_stack_ptr,
+ struct GC_ms_entry * mark_stack_limit GC_ATTR_UNUSED,
+ word env GC_ATTR_UNUSED)
+{
+ ABORT_RET("No client gcj mark proc is specified");
+ return mark_stack_ptr;
+}
+
+/* Caller does not hold allocation lock. */
+GC_API void GC_CALL GC_init_gcj_malloc(int mp_index,
+ void * /* really GC_mark_proc */mp)
+{
+# ifndef GC_IGNORE_GCJ_INFO
+ GC_bool ignore_gcj_info;
+# endif
+ DCL_LOCK_STATE;
+
+ if (mp == 0) /* In case GC_DS_PROC is unused. */
+ mp = (void *)(word)GC_gcj_fake_mark_proc;
+
+ GC_init(); /* In case it's not already done. */
+ LOCK();
+ if (GC_gcjobjfreelist != NULL) {
+ /* Already initialized. */
+ UNLOCK();
+ return;
+ }
+# ifdef GC_IGNORE_GCJ_INFO
+ /* This is useful for debugging on platforms with missing getenv(). */
+# define ignore_gcj_info TRUE
+# else
+ ignore_gcj_info = (0 != GETENV("GC_IGNORE_GCJ_INFO"));
+# endif
+ if (ignore_gcj_info) {
+ GC_COND_LOG_PRINTF("Gcj-style type information is disabled!\n");
+ }
+ GC_ASSERT(GC_mark_procs[mp_index] == (GC_mark_proc)0); /* unused */
+ GC_mark_procs[mp_index] = (GC_mark_proc)(word)mp;
+ if ((unsigned)mp_index >= GC_n_mark_procs)
+ ABORT("GC_init_gcj_malloc: bad index");
+ /* Set up object kind gcj-style indirect descriptor. */
+ GC_gcjobjfreelist = (ptr_t *)GC_new_free_list_inner();
+ if (ignore_gcj_info) {
+ /* Use a simple length-based descriptor, thus forcing a fully */
+ /* conservative scan. */
+ GC_gcj_kind = GC_new_kind_inner((void **)GC_gcjobjfreelist,
+ /* 0 | */ GC_DS_LENGTH,
+ TRUE, TRUE);
+ GC_gcj_debug_kind = GC_gcj_kind;
+ } else {
+ GC_gcj_kind = GC_new_kind_inner(
+ (void **)GC_gcjobjfreelist,
+ (((word)(-(signed_word)MARK_DESCR_OFFSET
+ - GC_INDIR_PER_OBJ_BIAS))
+ | GC_DS_PER_OBJECT),
+ FALSE, TRUE);
+ /* Set up object kind for objects that require mark proc call. */
+ GC_gcj_debug_kind = GC_new_kind_inner(GC_new_free_list_inner(),
+ GC_MAKE_PROC(mp_index,
+ 1 /* allocated with debug info */),
+ FALSE, TRUE);
+ }
+ UNLOCK();
+# undef ignore_gcj_info
+}
+
+#define GENERAL_MALLOC_INNER(lb,k) \
+ GC_clear_stack(GC_generic_malloc_inner(lb, k))
+
+#define GENERAL_MALLOC_INNER_IOP(lb,k) \
+ GC_clear_stack(GC_generic_malloc_inner_ignore_off_page(lb, k))
+
+/* We need a mechanism to release the lock and invoke finalizers. */
+/* We don't really have an opportunity to do this on a rarely executed */
+/* path on which the lock is not held. Thus we check at a */
+/* rarely executed point at which it is safe to release the lock. */
+/* We do this even where we could just call GC_INVOKE_FINALIZERS, */
+/* since it's probably cheaper and certainly more uniform. */
+/* TODO: Consider doing the same elsewhere? */
+static void maybe_finalize(void)
+{
+ static word last_finalized_no = 0;
+ DCL_LOCK_STATE;
+
+ if (GC_gc_no == last_finalized_no ||
+ !EXPECT(GC_is_initialized, TRUE)) return;
+ UNLOCK();
+ GC_INVOKE_FINALIZERS();
+ LOCK();
+ last_finalized_no = GC_gc_no;
+}
+
+/* Allocate an object, clear it, and store the pointer to the */
+/* type structure (vtable in gcj). */
+/* This adds a byte at the end of the object if GC_malloc would.*/
+#ifdef THREAD_LOCAL_ALLOC
+ GC_INNER void * GC_core_gcj_malloc(size_t lb,
+ void * ptr_to_struct_containing_descr)
+#else
+ GC_API GC_ATTR_MALLOC void * GC_CALL GC_gcj_malloc(size_t lb,
+ void * ptr_to_struct_containing_descr)
+#endif
+{
+ ptr_t op;
+ DCL_LOCK_STATE;
+
+ GC_DBG_COLLECT_AT_MALLOC(lb);
+ if(SMALL_OBJ(lb)) {
+ word lg;
+
+ LOCK();
+ lg = GC_size_map[lb];
+ op = GC_gcjobjfreelist[lg];
+ if(EXPECT(0 == op, FALSE)) {
+ maybe_finalize();
+ op = (ptr_t)GENERAL_MALLOC_INNER((word)lb, GC_gcj_kind);
+ if (0 == op) {
+ GC_oom_func oom_fn = GC_oom_fn;
+ UNLOCK();
+ return((*oom_fn)(lb));
+ }
+ } else {
+ GC_gcjobjfreelist[lg] = (ptr_t)obj_link(op);
+ GC_bytes_allocd += GRANULES_TO_BYTES((word)lg);
+ }
+ GC_ASSERT(((void **)op)[1] == 0);
+ } else {
+ LOCK();
+ maybe_finalize();
+ op = (ptr_t)GENERAL_MALLOC_INNER((word)lb, GC_gcj_kind);
+ if (0 == op) {
+ GC_oom_func oom_fn = GC_oom_fn;
+ UNLOCK();
+ return((*oom_fn)(lb));
+ }
+ }
+ *(void **)op = ptr_to_struct_containing_descr;
+ UNLOCK();
+ GC_dirty(op);
+ REACHABLE_AFTER_DIRTY(ptr_to_struct_containing_descr);
+ return (void *)op;
+}
+
+/* Similar to GC_gcj_malloc, but add debug info. This is allocated */
+/* with GC_gcj_debug_kind. */
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_debug_gcj_malloc(size_t lb,
+ void * ptr_to_struct_containing_descr, GC_EXTRA_PARAMS)
+{
+ void *base, *result;
+ DCL_LOCK_STATE;
+
+ /* We're careful to avoid extra calls, which could */
+ /* confuse the backtrace. */
+ LOCK();
+ maybe_finalize();
+ base = GC_generic_malloc_inner(SIZET_SAT_ADD(lb, DEBUG_BYTES),
+ GC_gcj_debug_kind);
+ if (NULL == base) {
+ GC_oom_func oom_fn = GC_oom_fn;
+ UNLOCK();
+ GC_err_printf("GC_debug_gcj_malloc(%lu, %p) returning NULL (%s:%d)\n",
+ (unsigned long)lb, ptr_to_struct_containing_descr, s, i);
+ return((*oom_fn)(lb));
+ }
+ *((void **)((ptr_t)base + sizeof(oh))) = ptr_to_struct_containing_descr;
+ if (!GC_debugging_started) {
+ GC_start_debugging_inner();
+ }
+ result = GC_store_debug_info_inner(base, (word)lb, s, i);
+ ADD_CALL_CHAIN(base, ra);
+ UNLOCK();
+ GC_dirty(result);
+ REACHABLE_AFTER_DIRTY(ptr_to_struct_containing_descr);
+ return result;
+}
+
+/* There is no THREAD_LOCAL_ALLOC for GC_gcj_malloc_ignore_off_page(). */
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_gcj_malloc_ignore_off_page(size_t lb,
+ void * ptr_to_struct_containing_descr)
+{
+ ptr_t op;
+ DCL_LOCK_STATE;
+
+ GC_DBG_COLLECT_AT_MALLOC(lb);
+ if(SMALL_OBJ(lb)) {
+ word lg;
+
+ LOCK();
+ lg = GC_size_map[lb];
+ op = GC_gcjobjfreelist[lg];
+ if (EXPECT(0 == op, FALSE)) {
+ maybe_finalize();
+ op = (ptr_t)GENERAL_MALLOC_INNER_IOP(lb, GC_gcj_kind);
+ if (0 == op) {
+ GC_oom_func oom_fn = GC_oom_fn;
+ UNLOCK();
+ return((*oom_fn)(lb));
+ }
+ } else {
+ GC_gcjobjfreelist[lg] = (ptr_t)obj_link(op);
+ GC_bytes_allocd += GRANULES_TO_BYTES((word)lg);
+ }
+ } else {
+ LOCK();
+ maybe_finalize();
+ op = (ptr_t)GENERAL_MALLOC_INNER_IOP(lb, GC_gcj_kind);
+ if (0 == op) {
+ GC_oom_func oom_fn = GC_oom_fn;
+ UNLOCK();
+ return((*oom_fn)(lb));
+ }
+ }
+ *(void **)op = ptr_to_struct_containing_descr;
+ UNLOCK();
+ GC_dirty(op);
+ REACHABLE_AFTER_DIRTY(ptr_to_struct_containing_descr);
+ return (void *)op;
+}
+
+#endif /* GC_GCJ_SUPPORT */
diff --git a/graphics/asymptote/gc/headers.c b/graphics/asymptote/gc/headers.c
new file mode 100644
index 0000000000..c7517dba99
--- /dev/null
+++ b/graphics/asymptote/gc/headers.c
@@ -0,0 +1,422 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+/*
+ * This implements:
+ * 1. allocation of heap block headers
+ * 2. A map from addresses to heap block addresses to heap block headers
+ *
+ * Access speed is crucial. We implement an index structure based on a 2
+ * level tree.
+ */
+
+/* Non-macro version of header location routine */
+GC_INNER hdr * GC_find_header(ptr_t h)
+{
+# ifdef HASH_TL
+ hdr * result;
+ GET_HDR(h, result);
+ return(result);
+# else
+ return(HDR_INNER(h));
+# endif
+}
+
+/* Handle a header cache miss. Returns a pointer to the */
+/* header corresponding to p, if p can possibly be a valid */
+/* object pointer, and 0 otherwise. */
+/* GUARANTEED to return 0 for a pointer past the first page */
+/* of an object unless both GC_all_interior_pointers is set */
+/* and p is in fact a valid object pointer. */
+/* Never returns a pointer to a free hblk. */
+GC_INNER hdr *
+#ifdef PRINT_BLACK_LIST
+ GC_header_cache_miss(ptr_t p, hdr_cache_entry *hce, ptr_t source)
+#else
+ GC_header_cache_miss(ptr_t p, hdr_cache_entry *hce)
+#endif
+{
+ hdr *hhdr;
+ HC_MISS();
+ GET_HDR(p, hhdr);
+ if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ if (GC_all_interior_pointers) {
+ if (hhdr != 0) {
+ ptr_t current = p;
+
+ current = (ptr_t)HBLKPTR(current);
+ do {
+ current = current - HBLKSIZE*(word)hhdr;
+ hhdr = HDR(current);
+ } while(IS_FORWARDING_ADDR_OR_NIL(hhdr));
+ /* current points to near the start of the large object */
+ if (hhdr -> hb_flags & IGNORE_OFF_PAGE)
+ return 0;
+ if (HBLK_IS_FREE(hhdr)
+ || p - current >= (ptrdiff_t)(hhdr->hb_sz)) {
+ GC_ADD_TO_BLACK_LIST_NORMAL(p, source);
+ /* Pointer past the end of the block */
+ return 0;
+ }
+ } else {
+ GC_ADD_TO_BLACK_LIST_NORMAL(p, source);
+ /* And return zero: */
+ }
+ GC_ASSERT(hhdr == 0 || !HBLK_IS_FREE(hhdr));
+ return hhdr;
+ /* Pointers past the first page are probably too rare */
+ /* to add them to the cache. We don't. */
+ /* And correctness relies on the fact that we don't. */
+ } else {
+ if (hhdr == 0) {
+ GC_ADD_TO_BLACK_LIST_NORMAL(p, source);
+ }
+ return 0;
+ }
+ } else {
+ if (HBLK_IS_FREE(hhdr)) {
+ GC_ADD_TO_BLACK_LIST_NORMAL(p, source);
+ return 0;
+ } else {
+ hce -> block_addr = (word)(p) >> LOG_HBLKSIZE;
+ hce -> hce_hdr = hhdr;
+ return hhdr;
+ }
+ }
+}
+
+/* Routines to dynamically allocate collector data structures that will */
+/* never be freed. */
+
+GC_INNER ptr_t GC_scratch_alloc(size_t bytes)
+{
+ ptr_t result = GC_scratch_free_ptr;
+ size_t bytes_to_get;
+
+ bytes = ROUNDUP_GRANULE_SIZE(bytes);
+ for (;;) {
+ GC_ASSERT((word)GC_scratch_end_ptr >= (word)result);
+ if (bytes <= (word)GC_scratch_end_ptr - (word)result) {
+ /* Unallocated space of scratch buffer has enough size. */
+ GC_scratch_free_ptr = result + bytes;
+ return result;
+ }
+
+ GC_ASSERT(GC_page_size != 0);
+ if (bytes >= MINHINCR * HBLKSIZE) {
+ bytes_to_get = ROUNDUP_PAGESIZE_IF_MMAP(bytes);
+ result = (ptr_t)GET_MEM(bytes_to_get);
+ if (result != NULL) {
+ GC_add_to_our_memory(result, bytes_to_get);
+ /* No update of scratch free area pointer; */
+ /* get memory directly. */
+# ifdef USE_SCRATCH_LAST_END_PTR
+ /* Update end point of last obtained area (needed only */
+ /* by GC_register_dynamic_libraries for some targets). */
+ GC_scratch_last_end_ptr = result + bytes;
+# endif
+ }
+ return result;
+ }
+
+ bytes_to_get = ROUNDUP_PAGESIZE_IF_MMAP(MINHINCR * HBLKSIZE);
+ /* round up for safety */
+ result = (ptr_t)GET_MEM(bytes_to_get);
+ if (EXPECT(NULL == result, FALSE)) {
+ WARN("Out of memory - trying to allocate requested amount"
+ " (%" WARN_PRIuPTR " bytes)...\n", bytes);
+ bytes_to_get = ROUNDUP_PAGESIZE_IF_MMAP(bytes);
+ result = (ptr_t)GET_MEM(bytes_to_get);
+ if (result != NULL) {
+ GC_add_to_our_memory(result, bytes_to_get);
+# ifdef USE_SCRATCH_LAST_END_PTR
+ GC_scratch_last_end_ptr = result + bytes;
+# endif
+ }
+ return result;
+ }
+
+ GC_add_to_our_memory(result, bytes_to_get);
+ /* TODO: some amount of unallocated space may remain unused forever */
+ /* Update scratch area pointers and retry. */
+ GC_scratch_free_ptr = result;
+ GC_scratch_end_ptr = GC_scratch_free_ptr + bytes_to_get;
+# ifdef USE_SCRATCH_LAST_END_PTR
+ GC_scratch_last_end_ptr = GC_scratch_end_ptr;
+# endif
+ }
+}
+
+/* Return an uninitialized header */
+static hdr * alloc_hdr(void)
+{
+ hdr * result;
+
+ if (NULL == GC_hdr_free_list) {
+ result = (hdr *)GC_scratch_alloc(sizeof(hdr));
+ } else {
+ result = GC_hdr_free_list;
+ GC_hdr_free_list = (hdr *) result -> hb_next;
+ }
+ return(result);
+}
+
+GC_INLINE void free_hdr(hdr * hhdr)
+{
+ hhdr -> hb_next = (struct hblk *) GC_hdr_free_list;
+ GC_hdr_free_list = hhdr;
+}
+
+#ifdef COUNT_HDR_CACHE_HITS
+ /* Used for debugging/profiling (the symbols are externally visible). */
+ word GC_hdr_cache_hits = 0;
+ word GC_hdr_cache_misses = 0;
+#endif
+
+GC_INNER void GC_init_headers(void)
+{
+ unsigned i;
+
+ GC_ASSERT(NULL == GC_all_nils);
+ GC_all_nils = (bottom_index *)GC_scratch_alloc(sizeof(bottom_index));
+ if (GC_all_nils == NULL) {
+ GC_err_printf("Insufficient memory for GC_all_nils\n");
+ EXIT();
+ }
+ BZERO(GC_all_nils, sizeof(bottom_index));
+ for (i = 0; i < TOP_SZ; i++) {
+ GC_top_index[i] = GC_all_nils;
+ }
+}
+
+/* Make sure that there is a bottom level index block for address addr. */
+/* Return FALSE on failure. */
+static GC_bool get_index(word addr)
+{
+ word hi = (word)(addr) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE);
+ bottom_index * r;
+ bottom_index * p;
+ bottom_index ** prev;
+ bottom_index *pi; /* old_p */
+ word i;
+
+ GC_ASSERT(I_HOLD_LOCK());
+# ifdef HASH_TL
+ i = TL_HASH(hi);
+
+ pi = p = GC_top_index[i];
+ while(p != GC_all_nils) {
+ if (p -> key == hi) return(TRUE);
+ p = p -> hash_link;
+ }
+# else
+ if (GC_top_index[hi] != GC_all_nils)
+ return TRUE;
+ i = hi;
+# endif
+ r = (bottom_index *)GC_scratch_alloc(sizeof(bottom_index));
+ if (EXPECT(NULL == r, FALSE))
+ return FALSE;
+ BZERO(r, sizeof(bottom_index));
+ r -> key = hi;
+# ifdef HASH_TL
+ r -> hash_link = pi;
+# endif
+
+ /* Add it to the list of bottom indices */
+ prev = &GC_all_bottom_indices; /* pointer to p */
+ pi = 0; /* bottom_index preceding p */
+ while ((p = *prev) != 0 && p -> key < hi) {
+ pi = p;
+ prev = &(p -> asc_link);
+ }
+ r -> desc_link = pi;
+ if (0 == p) {
+ GC_all_bottom_indices_end = r;
+ } else {
+ p -> desc_link = r;
+ }
+ r -> asc_link = p;
+ *prev = r;
+
+ GC_top_index[i] = r;
+ return(TRUE);
+}
+
+/* Install a header for block h. */
+/* The header is uninitialized. */
+/* Returns the header or 0 on failure. */
+GC_INNER struct hblkhdr * GC_install_header(struct hblk *h)
+{
+ hdr * result;
+
+ if (!get_index((word) h)) return(0);
+ result = alloc_hdr();
+ if (result) {
+ SET_HDR(h, result);
+# ifdef USE_MUNMAP
+ result -> hb_last_reclaimed = (unsigned short)GC_gc_no;
+# endif
+ }
+ return(result);
+}
+
+/* Set up forwarding counts for block h of size sz */
+GC_INNER GC_bool GC_install_counts(struct hblk *h, size_t sz/* bytes */)
+{
+ struct hblk * hbp;
+
+ for (hbp = h; (word)hbp < (word)h + sz; hbp += BOTTOM_SZ) {
+ if (!get_index((word)hbp))
+ return FALSE;
+ if ((word)hbp > GC_WORD_MAX - (word)BOTTOM_SZ * HBLKSIZE)
+ break; /* overflow of hbp+=BOTTOM_SZ is expected */
+ }
+ if (!get_index((word)h + sz - 1))
+ return FALSE;
+ for (hbp = h + 1; (word)hbp < (word)h + sz; hbp += 1) {
+ word i = HBLK_PTR_DIFF(hbp, h);
+
+ SET_HDR(hbp, (hdr *)(i > MAX_JUMP? MAX_JUMP : i));
+ }
+ return TRUE;
+}
+
+/* Remove the header for block h */
+GC_INNER void GC_remove_header(struct hblk *h)
+{
+ hdr **ha;
+ GET_HDR_ADDR(h, ha);
+ free_hdr(*ha);
+ *ha = 0;
+}
+
+/* Remove forwarding counts for h */
+GC_INNER void GC_remove_counts(struct hblk *h, size_t sz/* bytes */)
+{
+ struct hblk * hbp;
+
+ if (sz <= HBLKSIZE) return;
+ if (HDR(h+1) == 0) {
+# ifdef GC_ASSERTIONS
+ for (hbp = h+2; (word)hbp < (word)h + sz; hbp++)
+ GC_ASSERT(HDR(hbp) == 0);
+# endif
+ return;
+ }
+
+ for (hbp = h+1; (word)hbp < (word)h + sz; hbp += 1) {
+ SET_HDR(hbp, 0);
+ }
+}
+
+/* Apply fn to all allocated blocks. It is the caller responsibility */
+/* to avoid data race during the function execution (e.g. by holding */
+/* the allocation lock). */
+void GC_apply_to_all_blocks(void (*fn)(struct hblk *h, word client_data),
+ word client_data)
+{
+ signed_word j;
+ bottom_index * index_p;
+
+ for (index_p = GC_all_bottom_indices; index_p != 0;
+ index_p = index_p -> asc_link) {
+ for (j = BOTTOM_SZ-1; j >= 0;) {
+ if (!IS_FORWARDING_ADDR_OR_NIL(index_p->index[j])) {
+ if (!HBLK_IS_FREE(index_p->index[j])) {
+ (*fn)(((struct hblk *)
+ (((index_p->key << LOG_BOTTOM_SZ) + (word)j)
+ << LOG_HBLKSIZE)),
+ client_data);
+ }
+ j--;
+ } else if (index_p->index[j] == 0) {
+ j--;
+ } else {
+ j -= (signed_word)(index_p->index[j]);
+ }
+ }
+ }
+}
+
+GC_INNER struct hblk * GC_next_block(struct hblk *h, GC_bool allow_free)
+{
+ REGISTER bottom_index * bi;
+ REGISTER word j = ((word)h >> LOG_HBLKSIZE) & (BOTTOM_SZ-1);
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GET_BI(h, bi);
+ if (bi == GC_all_nils) {
+ REGISTER word hi = (word)h >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE);
+
+ bi = GC_all_bottom_indices;
+ while (bi != 0 && bi -> key < hi) bi = bi -> asc_link;
+ j = 0;
+ }
+
+ while (bi != 0) {
+ while (j < BOTTOM_SZ) {
+ hdr * hhdr = bi -> index[j];
+ if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ j++;
+ } else {
+ if (allow_free || !HBLK_IS_FREE(hhdr)) {
+ return ((struct hblk *)
+ (((bi -> key << LOG_BOTTOM_SZ) + j)
+ << LOG_HBLKSIZE));
+ } else {
+ j += divHBLKSZ(hhdr -> hb_sz);
+ }
+ }
+ }
+ j = 0;
+ bi = bi -> asc_link;
+ }
+ return(0);
+}
+
+GC_INNER struct hblk * GC_prev_block(struct hblk *h)
+{
+ bottom_index * bi;
+ signed_word j = ((word)h >> LOG_HBLKSIZE) & (BOTTOM_SZ-1);
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GET_BI(h, bi);
+ if (bi == GC_all_nils) {
+ word hi = (word)h >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE);
+ bi = GC_all_bottom_indices_end;
+ while (bi != 0 && bi -> key > hi) bi = bi -> desc_link;
+ j = BOTTOM_SZ - 1;
+ }
+ while(bi != 0) {
+ while (j >= 0) {
+ hdr * hhdr = bi -> index[j];
+ if (0 == hhdr) {
+ --j;
+ } else if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ j -= (signed_word)hhdr;
+ } else {
+ return((struct hblk *)
+ (((bi -> key << LOG_BOTTOM_SZ) + j)
+ << LOG_HBLKSIZE));
+ }
+ }
+ j = BOTTOM_SZ - 1;
+ bi = bi -> desc_link;
+ }
+ return(0);
+}
diff --git a/graphics/asymptote/gc/ia64_save_regs_in_stack.s b/graphics/asymptote/gc/ia64_save_regs_in_stack.s
new file mode 100644
index 0000000000..2b81edfaab
--- /dev/null
+++ b/graphics/asymptote/gc/ia64_save_regs_in_stack.s
@@ -0,0 +1,11 @@
+ .text
+ .align 16
+ .global GC_save_regs_in_stack
+ .proc GC_save_regs_in_stack
+GC_save_regs_in_stack:
+ .body
+ flushrs
+ ;;
+ mov r8=ar.bsp
+ br.ret.sptk.few rp
+ .endp GC_save_regs_in_stack
diff --git a/graphics/asymptote/gc/include/config.h.in b/graphics/asymptote/gc/include/config.h.in
new file mode 100644
index 0000000000..0126c6ab13
--- /dev/null
+++ b/graphics/asymptote/gc/include/config.h.in
@@ -0,0 +1,274 @@
+/* include/config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to recognise all pointers to the interior of objects. */
+#undef ALL_INTERIOR_POINTERS
+
+/* AO load, store and/or test-and-set primitives are implemented in
+ libatomic_ops using locks. */
+#undef BASE_ATOMIC_OPS_EMULATED
+
+/* Erroneously cleared dirty bits checking. Use only for debugging of the
+ incremental collector. */
+#undef CHECKSUMS
+
+/* See doc/README.macros. */
+#undef DARWIN_DONT_PARSE_STACK
+
+/* Define to force debug headers on all objects. */
+#undef DBG_HDRS_ALL
+
+/* Do not use user32.dll import library (Win32). */
+#undef DONT_USE_USER32_DLL
+
+/* Define to enable eCos target support. */
+#undef ECOS
+
+/* Wine getenv may not return NULL for missing entry. */
+#undef EMPTY_GETENV_RESULTS
+
+/* Define to enable alternative finalization interface. */
+#undef ENABLE_DISCLAIM
+
+/* Define to enable internal debug assertions. */
+#undef GC_ASSERTIONS
+
+/* Define to enable atomic uncollectible allocation. */
+#undef GC_ATOMIC_UNCOLLECTABLE
+
+/* Use GCC atomic intrinsics instead of libatomic_ops primitives. */
+#undef GC_BUILTIN_ATOMIC
+
+/* Define to build dynamic libraries with only API symbols exposed. */
+#undef GC_DLL
+
+/* Skip the initial guess of data root sets. */
+#undef GC_DONT_REGISTER_MAIN_STATIC_DATA
+
+/* Define to turn on GC_suspend_thread support. */
+#undef GC_ENABLE_SUSPEND_THREAD
+
+/* Define to include support for gcj. */
+#undef GC_GCJ_SUPPORT
+
+/* Define if backtrace information is supported. */
+#undef GC_HAVE_BUILTIN_BACKTRACE
+
+/* Enable Win32 DllMain-based approach of threads registering. */
+#undef GC_INSIDE_DLL
+
+/* Missing execinfo.h header. */
+#undef GC_MISSING_EXECINFO_H
+
+/* Missing sigsetjmp function. */
+#undef GC_NO_SIGSETJMP
+
+/* Disable threads discovery in GC. */
+#undef GC_NO_THREADS_DISCOVERY
+
+/* Read environment variables from the GC 'env' file. */
+#undef GC_READ_ENV_FILE
+
+/* Define to support platform-specific threads. */
+#undef GC_THREADS
+
+/* Explicitly prefix exported/imported WINAPI symbols with '_'. */
+#undef GC_UNDERSCORE_STDCALL
+
+/* Force the GC to use signals based on SIGRTMIN+k. */
+#undef GC_USESIGRT_SIGNALS
+
+/* See doc/README.macros. */
+#undef GC_USE_DLOPEN_WRAP
+
+/* The major version number of this GC release. */
+#undef GC_VERSION_MAJOR
+
+/* The micro version number of this GC release. */
+#undef GC_VERSION_MICRO
+
+/* The minor version number of this GC release. */
+#undef GC_VERSION_MINOR
+
+/* Define to support pthreads-win32 or winpthreads. */
+#undef GC_WIN32_PTHREADS
+
+/* Define to install pthread_atfork() handlers by default. */
+#undef HANDLE_FORK
+
+/* Define to use 'dladdr' function. */
+#undef HAVE_DLADDR
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the `dl_iterate_phdr' function. */
+#undef HAVE_DL_ITERATE_PHDR
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* libatomic_ops AO_or primitive implementation is lock-free. */
+#undef HAVE_LOCKFREE_AO_OR
+
+/* Define to use 'pthread_setname_np(const char*)' function. */
+#undef HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID
+
+/* Define to use 'pthread_setname_np(pthread_t, const char*)' function. */
+#undef HAVE_PTHREAD_SETNAME_NP_WITH_TID
+
+/* Define to use 'pthread_setname_np(pthread_t, const char*, void *)'
+ function. */
+#undef HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_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/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
+
+/* Do not define DYNAMIC_LOADING even if supported (i.e., build the collector
+ with disabled tracing of dynamic library data roots). */
+#undef IGNORE_DYNAMIC_LOADING
+
+/* See doc/README.macros. */
+#undef JAVA_FINALIZATION
+
+/* Define to save back-pointers in debugging headers. */
+#undef KEEP_BACK_PTRS
+
+/* Define to optimize for large heaps or root sets. */
+#undef LARGE_CONFIG
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* See doc/README.macros. */
+#undef MAKE_BACK_GRAPH
+
+/* Number of GC cycles to wait before unmapping an unused block. */
+#undef MUNMAP_THRESHOLD
+
+/* Define to not use system clock (cross compiling). */
+#undef NO_CLOCK
+
+/* Disable debugging, like GC_dump and its callees. */
+#undef NO_DEBUGGING
+
+/* Define to make the collector not allocate executable memory by default. */
+#undef NO_EXECUTE_PERMISSION
+
+/* Missing getcontext function. */
+#undef NO_GETCONTEXT
+
+/* Prohibit installation of pthread_atfork() handlers. */
+#undef NO_HANDLE_FORK
+
+/* 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 enable parallel marking. */
+#undef PARALLEL_MARK
+
+/* If defined, redirect free to this function. */
+#undef REDIRECT_FREE
+
+/* If defined, redirect malloc to this function. */
+#undef REDIRECT_MALLOC
+
+/* If defined, redirect GC_realloc to this function. */
+#undef REDIRECT_REALLOC
+
+/* The number of caller frames saved when allocating with the debugging API.
+ */
+#undef SAVE_CALL_COUNT
+
+/* Shorten the headers to minimize object size at the expense of checking for
+ writes past the end (see doc/README.macros). */
+#undef SHORT_DBG_HDRS
+
+/* Define to tune the collector for small heap sizes. */
+#undef SMALL_CONFIG
+
+/* See the comment in gcconfig.h. */
+#undef SOLARIS25_PROC_VDB_BUG_FIXED
+
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
+#undef STDC_HEADERS
+
+/* Define to work around a Solaris 5.3 bug (see dyn_load.c). */
+#undef SUNOS53_SHARED_LIB
+
+/* Define to enable thread-local allocation optimization. */
+#undef THREAD_LOCAL_ALLOC
+
+/* Use Unicode (W) variant of Win32 API instead of ASCII (A) one. */
+#undef UNICODE
+
+/* Define to use of compiler-support for thread-local variables. */
+#undef USE_COMPILER_TLS
+
+/* Define to use mmap instead of sbrk to expand the heap. */
+#undef USE_MMAP
+
+/* Define to return memory to OS with munmap calls (see doc/README.macros). */
+#undef USE_MUNMAP
+
+/* Define to use Win32 VirtualAlloc (instead of sbrk or mmap) to expand the
+ heap. */
+#undef USE_WINALLOC
+
+/* Version number of package */
+#undef VERSION
+
+/* The POSIX feature macro. */
+#undef _POSIX_C_SOURCE
+
+/* Indicates the use of pthreads (NetBSD). */
+#undef _PTHREADS
+
+/* Required define if using POSIX threads. */
+#undef _REENTRANT
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
diff --git a/graphics/asymptote/gc/include/cord.h b/graphics/asymptote/gc/include/cord.h
new file mode 100644
index 0000000000..e8a72b0db9
--- /dev/null
+++ b/graphics/asymptote/gc/include/cord.h
@@ -0,0 +1,378 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * Cords are immutable character strings. A number of operations
+ * on long cords are much more efficient than their strings.h counterpart.
+ * In particular, concatenation takes constant time independent of the length
+ * of the arguments. (Cords are represented as trees, with internal
+ * nodes representing concatenation and leaves consisting of either C
+ * strings or a functional description of the string.)
+ *
+ * The following are reasonable applications of cords. They would perform
+ * unacceptably if C strings were used:
+ * - A compiler that produces assembly language output by repeatedly
+ * concatenating instructions onto a cord representing the output file.
+ * - A text editor that converts the input file to a cord, and then
+ * performs editing operations by producing a new cord representing
+ * the file after each character change (and keeping the old ones in an
+ * edit history).
+ *
+ * For optimal performance, cords should be built by
+ * concatenating short sections.
+ * This interface is designed for maximum compatibility with C strings.
+ * ASCII NUL characters may be embedded in cords using CORD_from_fn.
+ * This is handled correctly, but CORD_to_char_star will produce a string
+ * with embedded NULs when given such a cord.
+ *
+ * This interface is fairly big, largely for performance reasons.
+ * The most basic constants and functions:
+ *
+ * CORD - the type of a cord;
+ * CORD_EMPTY - empty cord;
+ * CORD_len(cord) - length of a cord;
+ * CORD_cat(cord1,cord2) - concatenation of two cords;
+ * CORD_substr(cord, start, len) - substring (or subcord);
+ * CORD_pos i; CORD_FOR(i, cord) { ... CORD_pos_fetch(i) ... } -
+ * examine each character in a cord (CORD_pos_fetch(i) is the char);
+ * CORD_fetch(int i) - Retrieve i'th character (slowly);
+ * CORD_cmp(cord1, cord2) - compare two cords;
+ * CORD_from_file(FILE * f) - turn a read-only file into a cord;
+ * CORD_to_char_star(cord) - convert to C string
+ * (non-NULL C constant strings are cords);
+ * CORD_printf (etc.) - cord version of printf (use %r for cords).
+ */
+
+#ifndef CORD_H
+#define CORD_H
+
+#include <stddef.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#if defined(GC_DLL) && !defined(CORD_NOT_DLL)
+ /* Same as for GC_API in gc_config_macros.h. */
+# ifdef CORD_BUILD
+# if defined(__MINGW32__) || defined(__CEGCC__)
+# define CORD_API __declspec(dllexport)
+# elif defined(_MSC_VER) || defined(__DMC__) || defined(__BORLANDC__) \
+ || defined(__CYGWIN__) || defined(__WATCOMC__)
+# define CORD_API extern __declspec(dllexport)
+# elif defined(__GNUC__) && !defined(GC_NO_VISIBILITY) \
+ && (__GNUC__ >= 4 || defined(GC_VISIBILITY_HIDDEN_SET))
+ /* Only matters if used in conjunction with -fvisibility=hidden option. */
+# define CORD_API extern __attribute__((__visibility__("default")))
+# endif
+# else
+# if defined(__MINGW32__) || defined(__CEGCC__) || defined(_MSC_VER) \
+ || defined(__DMC__) || defined(__BORLANDC__) || defined(__CYGWIN__)
+# define CORD_API __declspec(dllimport)
+# elif defined(__WATCOMC__)
+# define CORD_API extern __declspec(dllimport)
+# endif
+# endif /* !CORD_BUILD */
+#endif /* GC_DLL */
+
+#ifndef CORD_API
+# define CORD_API extern
+#endif
+
+/* Cords have type const char *. This is cheating quite a bit, and not */
+/* 100% portable. But it means that nonempty character string */
+/* constants may be used as cords directly, provided the string is */
+/* never modified in place. The empty cord is represented by, and */
+/* can be written as, 0. */
+
+typedef const char * CORD;
+
+/* An empty cord is always represented as nil. */
+#define CORD_EMPTY 0
+
+/* Is a nonempty cord represented as a C string? */
+#define CORD_IS_STRING(s) (*(s) != '\0')
+
+/* Concatenate two cords. If the arguments are C strings, they may */
+/* not be subsequently altered. */
+CORD_API CORD CORD_cat(CORD x, CORD y);
+
+/* Concatenate a cord and a C string with known length. Except for the */
+/* empty string case, this is a special case of CORD_cat. Since the */
+/* length is known, it can be faster. */
+/* The string y is shared with the resulting CORD. Hence it should */
+/* not be altered by the caller. */
+CORD_API CORD CORD_cat_char_star(CORD x, const char * y, size_t leny);
+
+/* Compute the length of a cord. */
+CORD_API size_t CORD_len(CORD x);
+
+/* Cords may be represented by functions defining the ith character. */
+typedef char (* CORD_fn)(size_t i, void * client_data);
+
+/* Turn a functional description into a cord. */
+CORD_API CORD CORD_from_fn(CORD_fn fn, void * client_data, size_t len);
+
+/* Return the substring (subcord really) of x with length at most n, */
+/* starting at position i. (The initial character has position 0.) */
+CORD_API CORD CORD_substr(CORD x, size_t i, size_t n);
+
+/* Return the argument, but rebalanced to allow more efficient */
+/* character retrieval, substring operations, and comparisons. */
+/* This is useful only for cords that were built using repeated */
+/* concatenation. Guarantees log time access to the result, unless */
+/* x was obtained through a large number of repeated substring ops */
+/* or the embedded functional descriptions take longer to evaluate. */
+/* May reallocate significant parts of the cord. The argument is not */
+/* modified; only the result is balanced. */
+CORD_API CORD CORD_balance(CORD x);
+
+/* The following traverse a cord by applying a function to each */
+/* character. This is occasionally appropriate, especially where */
+/* speed is crucial. But, since C doesn't have nested functions, */
+/* clients of this sort of traversal are clumsy to write. Consider */
+/* the functions that operate on cord positions instead. */
+
+/* Function to iteratively apply to individual characters in cord. */
+typedef int (* CORD_iter_fn)(char c, void * client_data);
+
+/* Function to apply to substrings of a cord. Each substring is a */
+/* a C character string, not a general cord. */
+typedef int (* CORD_batched_iter_fn)(const char * s, void * client_data);
+#define CORD_NO_FN ((CORD_batched_iter_fn)0)
+
+/* Apply f1 to each character in the cord, in ascending order, */
+/* starting at position i. If f2 is not CORD_NO_FN, then */
+/* multiple calls to f1 may be replaced by */
+/* a single call to f2. The parameter f2 is provided only to allow */
+/* some optimization by the client. This terminates when the right */
+/* end of this string is reached, or when f1 or f2 return != 0. In the */
+/* latter case CORD_iter returns != 0. Otherwise it returns 0. */
+/* The specified value of i must be < CORD_len(x). */
+CORD_API int CORD_iter5(CORD x, size_t i, CORD_iter_fn f1,
+ CORD_batched_iter_fn f2, void * client_data);
+
+/* A simpler version that starts at 0, and without f2. */
+CORD_API int CORD_iter(CORD x, CORD_iter_fn f1, void * client_data);
+#define CORD_iter(x, f1, cd) CORD_iter5(x, 0, f1, CORD_NO_FN, cd)
+
+/* Similar to CORD_iter5, but end-to-beginning. No provisions for */
+/* CORD_batched_iter_fn. */
+CORD_API int CORD_riter4(CORD x, size_t i, CORD_iter_fn f1, void * client_data);
+
+/* A simpler version that starts at the end. */
+CORD_API int CORD_riter(CORD x, CORD_iter_fn f1, void * client_data);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+/* Functions that operate on cord positions. The easy way to traverse */
+/* cords. A cord position is logically a pair consisting of a cord */
+/* and an index into that cord. But it is much faster to retrieve a */
+/* character based on a position than on an index. Unfortunately, */
+/* positions are big (order of a few 100 bytes), so allocate them with */
+/* caution. */
+/* Things in cord_pos.h should be treated as opaque, except as */
+/* described below. Also, note that CORD_pos_fetch, CORD_next and */
+/* CORD_prev have both macro and function definitions. The former */
+/* may evaluate their argument more than once. */
+#include "cord_pos.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*
+ Visible definitions from above:
+
+ typedef <OPAQUE but fairly big> CORD_pos[1];
+
+ * Extract the cord from a position:
+ CORD CORD_pos_to_cord(CORD_pos p);
+
+ * Extract the current index from a position:
+ size_t CORD_pos_to_index(CORD_pos p);
+
+ * Fetch the character located at the given position:
+ char CORD_pos_fetch(CORD_pos p);
+
+ * Initialize the position to refer to the given cord and index.
+ * Note that this is the most expensive function on positions:
+ void CORD_set_pos(CORD_pos p, CORD x, size_t i);
+
+ * Advance the position to the next character.
+ * P must be initialized and valid.
+ * Invalidates p if past end:
+ void CORD_next(CORD_pos p);
+
+ * Move the position to the preceding character.
+ * P must be initialized and valid.
+ * Invalidates p if past beginning:
+ void CORD_prev(CORD_pos p);
+
+ * Is the position valid, i.e. inside the cord?
+ int CORD_pos_valid(CORD_pos p);
+*/
+#define CORD_FOR(pos, cord) \
+ for (CORD_set_pos(pos, cord, 0); CORD_pos_valid(pos); CORD_next(pos))
+
+
+/* An out of memory handler to call. May be supplied by client. */
+/* Must not return. */
+extern void (* CORD_oom_fn)(void);
+
+/* Dump the representation of x to stdout in an implementation defined */
+/* manner. Intended for debugging only. */
+CORD_API void CORD_dump(CORD x);
+
+/* The following could easily be implemented by the client. They are */
+/* provided in cordxtra.c for convenience. */
+
+/* Concatenate a character to the end of a cord. */
+CORD_API CORD CORD_cat_char(CORD x, char c);
+
+/* Concatenate n cords. */
+CORD_API CORD CORD_catn(int n, /* CORD */ ...);
+
+/* Return the character in CORD_substr(x, i, 1). */
+CORD_API char CORD_fetch(CORD x, size_t i);
+
+/* Return < 0, 0, or > 0, depending on whether x < y, x = y, x > y. */
+CORD_API int CORD_cmp(CORD x, CORD y);
+
+/* A generalization that takes both starting positions for the */
+/* comparison, and a limit on the number of characters to be compared. */
+CORD_API int CORD_ncmp(CORD x, size_t x_start, CORD y, size_t y_start,
+ size_t len);
+
+/* Find the first occurrence of s in x at position start or later. */
+/* Return the position of the first character of s in x, or */
+/* CORD_NOT_FOUND if there is none. */
+CORD_API size_t CORD_str(CORD x, size_t start, CORD s);
+
+/* Return a cord consisting of i copies of (possibly NUL) c. Dangerous */
+/* in conjunction with CORD_to_char_star. */
+/* The resulting representation takes constant space, independent of i. */
+CORD_API CORD CORD_chars(char c, size_t i);
+#define CORD_nul(i) CORD_chars('\0', (i))
+
+/* Turn a file into cord. The file must be seekable. Its contents */
+/* must remain constant. The file may be accessed as an immediate */
+/* result of this call and/or as a result of subsequent accesses to */
+/* the cord. Short files are likely to be immediately read, but */
+/* long files are likely to be read on demand, possibly relying on */
+/* stdio for buffering. */
+/* We must have exclusive access to the descriptor f, i.e. we may */
+/* read it at any time, and expect the file pointer to be */
+/* where we left it. Normally this should be invoked as */
+/* CORD_from_file(fopen(...)). */
+/* CORD_from_file arranges to close the file descriptor when it is no */
+/* longer needed (e.g. when the result becomes inaccessible). */
+/* The file f must be such that ftell reflects the actual character */
+/* position in the file, i.e. the number of characters that can be */
+/* or were read with fread. On UNIX systems this is always true. */
+/* On Windows systems, f must be opened in binary mode. */
+CORD_API CORD CORD_from_file(FILE * f);
+
+/* Equivalent to the above, except that the entire file will be read */
+/* and the file pointer will be closed immediately. */
+/* The binary mode restriction from above does not apply. */
+CORD_API CORD CORD_from_file_eager(FILE * f);
+
+/* Equivalent to the above, except that the file will be read on */
+/* demand. The binary mode restriction applies. */
+CORD_API CORD CORD_from_file_lazy(FILE * f);
+
+/* Turn a cord into a C string. The result shares no structure with */
+/* x, and is thus modifiable. */
+CORD_API char * CORD_to_char_star(CORD x);
+
+/* Turn a C string into a CORD. The C string is copied, and so may */
+/* subsequently be modified. */
+CORD_API CORD CORD_from_char_star(const char *s);
+
+/* Identical to the above, but the result may share structure with */
+/* the argument and is thus not modifiable. */
+CORD_API const char * CORD_to_const_char_star(CORD x);
+
+/* Write a cord to a file, starting at the current position. */
+/* No trailing NULs are newlines are added. */
+/* Returns EOF if a write error occurs, 1 otherwise. */
+CORD_API int CORD_put(CORD x, FILE * f);
+
+/* "Not found" result for the following two functions. */
+#define CORD_NOT_FOUND ((size_t)(-1))
+
+/* A vague analog of strchr. Returns the position (an integer, not */
+/* a pointer) of the first occurrence of (char) c inside x at position */
+/* i or later. The value i must be < CORD_len(x). */
+CORD_API size_t CORD_chr(CORD x, size_t i, int c);
+
+/* A vague analog of strrchr. Returns index of the last occurrence */
+/* of (char) c inside x at position i or earlier. The value i */
+/* must be < CORD_len(x). */
+CORD_API size_t CORD_rchr(CORD x, size_t i, int c);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+/* The following are also not primitive, but are implemented in */
+/* cordprnt.c. They provide functionality similar to the ANSI C */
+/* functions with corresponding names, but with the following */
+/* additions and changes: */
+/* 1. A %r conversion specification specifies a CORD argument. Field */
+/* width, precision, etc. have the same semantics as for %s. */
+/* (Note that %c, %C, and %S were already taken.) */
+/* 2. The format string is represented as a CORD. */
+/* 3. CORD_sprintf and CORD_vsprintf assign the result through the 1st */
+/* argument. Unlike their ANSI C versions, there is no need to */
+/* guess the correct buffer size. */
+/* 4. Most of the conversions are implement through the native */
+/* vsprintf. Hence they are usually no faster, and */
+/* idiosyncrasies of the native printf are preserved. However, */
+/* CORD arguments to CORD_sprintf and CORD_vsprintf are NOT copied; */
+/* the result shares the original structure. This may make them */
+/* very efficient in some unusual applications. */
+/* The format string is copied. */
+/* All functions return the number of characters generated or -1 on */
+/* error. This complies with the ANSI standard, but is inconsistent */
+/* with some older implementations of sprintf. */
+
+/* The implementation of these is probably less portable than the rest */
+/* of this package. */
+
+#ifndef CORD_NO_IO
+
+#include <stdarg.h>
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+
+CORD_API int CORD_sprintf(CORD * out, CORD format, ...);
+CORD_API int CORD_vsprintf(CORD * out, CORD format, va_list args);
+CORD_API int CORD_fprintf(FILE * f, CORD format, ...);
+CORD_API int CORD_vfprintf(FILE * f, CORD format, va_list args);
+CORD_API int CORD_printf(CORD format, ...);
+CORD_API int CORD_vprintf(CORD format, va_list args);
+
+# ifdef __cplusplus
+ } /* extern "C" */
+# endif
+
+#endif /* CORD_NO_IO */
+
+#endif /* CORD_H */
diff --git a/graphics/asymptote/gc/include/cord_pos.h b/graphics/asymptote/gc/include/cord_pos.h
new file mode 100644
index 0000000000..45b5261ab8
--- /dev/null
+++ b/graphics/asymptote/gc/include/cord_pos.h
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* This should never be included directly; included only from cord.h. */
+#if !defined(CORD_POSITION_H) && defined(CORD_H)
+#define CORD_POSITION_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* The representation of CORD_position. This is private to the */
+/* implementation, but the size is known to clients. Also */
+/* the implementation of some exported macros relies on it. */
+/* Don't use anything defined here and not in cord.h. */
+
+# define MAX_DEPTH 48
+ /* The maximum depth of a balanced cord + 1. */
+ /* We don't let cords get deeper than MAX_DEPTH. */
+
+struct CORD_pe {
+ CORD pe_cord;
+ size_t pe_start_pos;
+};
+
+/* A structure describing an entry on the path from the root */
+/* to current position. */
+typedef struct CORD_Pos {
+ size_t cur_pos;
+ int path_len;
+# define CORD_POS_INVALID (0x55555555)
+ /* path_len == INVALID <==> position invalid */
+ const char *cur_leaf; /* Current leaf, if it is a string. */
+ /* If the current leaf is a function, */
+ /* then this may point to function_buf */
+ /* containing the next few characters. */
+ /* Always points to a valid string */
+ /* containing the current character */
+ /* unless cur_end is 0. */
+ size_t cur_start; /* Start position of cur_leaf. */
+ size_t cur_end; /* Ending position of cur_leaf; */
+ /* 0 if cur_leaf is invalid. */
+ struct CORD_pe path[MAX_DEPTH + 1];
+ /* path[path_len] is the leaf corresponding to cur_pos */
+ /* path[0].pe_cord is the cord we point to. */
+# define FUNCTION_BUF_SZ 8
+ char function_buf[FUNCTION_BUF_SZ]; /* Space for next few chars */
+ /* from function node. */
+} CORD_pos[1];
+
+/* Extract the cord from a position: */
+CORD_API CORD CORD_pos_to_cord(CORD_pos p);
+
+/* Extract the current index from a position: */
+CORD_API size_t CORD_pos_to_index(CORD_pos p);
+
+/* Fetch the character located at the given position: */
+CORD_API char CORD_pos_fetch(CORD_pos p);
+
+/* Initialize the position to refer to the given cord and index. */
+/* Note that this is the most expensive function on positions. */
+CORD_API void CORD_set_pos(CORD_pos p, CORD x, size_t i);
+
+/* Advance the position to the next character. */
+/* P must be initialized and valid. */
+/* Invalidates p if past end: */
+CORD_API void CORD_next(CORD_pos p);
+
+/* Move the position to the preceding character. */
+/* P must be initialized and valid. */
+/* Invalidates p if past beginning: */
+CORD_API void CORD_prev(CORD_pos p);
+
+/* Is the position valid, i.e. inside the cord? */
+CORD_API int CORD_pos_valid(CORD_pos p);
+
+CORD_API char CORD__pos_fetch(CORD_pos);
+CORD_API void CORD__next(CORD_pos);
+CORD_API void CORD__prev(CORD_pos);
+
+#define CORD_pos_fetch(p) \
+ (((p)[0].cur_end != 0)? \
+ (p)[0].cur_leaf[(p)[0].cur_pos - (p)[0].cur_start] \
+ : CORD__pos_fetch(p))
+
+#define CORD_next(p) \
+ (((p)[0].cur_pos + 1 < (p)[0].cur_end)? \
+ (p)[0].cur_pos++ \
+ : (CORD__next(p), 0))
+
+#define CORD_prev(p) \
+ (((p)[0].cur_end != 0 && (p)[0].cur_pos > (p)[0].cur_start)? \
+ (p)[0].cur_pos-- \
+ : (CORD__prev(p), 0))
+
+#define CORD_pos_to_index(p) ((p)[0].cur_pos)
+
+#define CORD_pos_to_cord(p) ((p)[0].path[0].pe_cord)
+
+#define CORD_pos_valid(p) ((p)[0].path_len != CORD_POS_INVALID)
+
+/* Some grubby stuff for performance-critical friends: */
+#define CORD_pos_chars_left(p) ((long)((p)[0].cur_end)-(long)((p)[0].cur_pos))
+ /* Number of characters in cache. <= 0 ==> none */
+
+#define CORD_pos_advance(p,n) ((p)[0].cur_pos += (n) - 1, CORD_next(p))
+ /* Advance position by n characters; */
+ /* 0 < n < CORD_pos_chars_left(p). */
+
+#define CORD_pos_cur_char_addr(p) \
+ ((p)[0].cur_leaf + ((p)[0].cur_pos - (p)[0].cur_start))
+ /* Address of the current character in cache. */
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif
diff --git a/graphics/asymptote/gc/include/ec.h b/graphics/asymptote/gc/include/ec.h
new file mode 100644
index 0000000000..54df5f8850
--- /dev/null
+++ b/graphics/asymptote/gc/include/ec.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef EC_H
+#define EC_H
+
+# ifndef CORD_H
+# include "cord.h"
+# endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Extensible cords are strings that may be destructively appended to. */
+/* They allow fast construction of cords from characters that are */
+/* being read from a stream. */
+/*
+ * A client might look like:
+ *
+ * {
+ * CORD_ec x;
+ * CORD result;
+ * char c;
+ * FILE *f;
+ *
+ * ...
+ * CORD_ec_init(x);
+ * while (...) {
+ * c = getc(f);
+ * ...
+ * CORD_ec_append(x, c);
+ * }
+ * result = CORD_balance(CORD_ec_to_cord(x));
+ *
+ * If a C string is desired as the final result, the call to CORD_balance
+ * may be replaced by a call to CORD_to_char_star.
+ */
+
+# ifndef CORD_BUFSZ
+# define CORD_BUFSZ 128
+# endif
+
+/* This structure represents the concatenation of ec_cord with */
+/* ec_buf[0 .. ec_bufptr-ec_buf-1]. */
+typedef struct CORD_ec_struct {
+ CORD ec_cord;
+ char * ec_bufptr;
+ char ec_buf[CORD_BUFSZ+1];
+} CORD_ec[1];
+
+/* Flush the buffer part of the extended cord into ec_cord. */
+/* Note that this is almost the only real function, and it is */
+/* implemented in 6 lines in cordxtra.c */
+void CORD_ec_flush_buf(CORD_ec x);
+
+/* Convert an extensible cord to a cord. */
+# define CORD_ec_to_cord(x) (CORD_ec_flush_buf(x), (x)[0].ec_cord)
+
+/* Initialize an extensible cord. */
+#define CORD_ec_init(x) \
+ ((x)[0].ec_cord = 0, (void)((x)[0].ec_bufptr = (x)[0].ec_buf))
+
+/* Append a character to an extensible cord. */
+#define CORD_ec_append(x, c) \
+ ((void)((x)[0].ec_bufptr == (x)[0].ec_buf + CORD_BUFSZ \
+ ? (CORD_ec_flush_buf(x), 0) : 0), \
+ (void)(*(x)[0].ec_bufptr++ = (c)))
+
+/* Append a cord to an extensible cord. Structure remains shared with */
+/* original. */
+void CORD_ec_append_cord(CORD_ec x, CORD s);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* EC_H */
diff --git a/graphics/asymptote/gc/include/extra/gc.h b/graphics/asymptote/gc/include/extra/gc.h
new file mode 100644
index 0000000000..55ae4c6c14
--- /dev/null
+++ b/graphics/asymptote/gc/include/extra/gc.h
@@ -0,0 +1,2 @@
+/* This file is installed for backward compatibility. */
+#include <gc/gc.h>
diff --git a/graphics/asymptote/gc/include/extra/gc_cpp.h b/graphics/asymptote/gc/include/extra/gc_cpp.h
new file mode 100644
index 0000000000..36669f9c8d
--- /dev/null
+++ b/graphics/asymptote/gc/include/extra/gc_cpp.h
@@ -0,0 +1,2 @@
+/* This file is installed for backward compatibility. */
+#include <gc/gc_cpp.h>
diff --git a/graphics/asymptote/gc/include/gc.h b/graphics/asymptote/gc/include/gc.h
new file mode 100644
index 0000000000..78c6a4babf
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc.h
@@ -0,0 +1,2197 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright 1999 by Hewlett-Packard Company. All rights reserved.
+ * Copyright (C) 2007 Free Software Foundation, Inc
+ * Copyright (c) 2000-2011 by Hewlett-Packard Development Company.
+ * Copyright (c) 2009-2020 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * Note that this defines a large number of tuning hooks, which can
+ * safely be ignored in nearly all cases. For normal use it suffices
+ * to call only GC_MALLOC and perhaps GC_REALLOC.
+ * For better performance, also look at GC_MALLOC_ATOMIC, and
+ * GC_enable_incremental. If you need an action to be performed
+ * immediately before an object is collected, look at GC_register_finalizer.
+ * Everything else is best ignored unless you encounter performance
+ * problems.
+ */
+
+#ifndef GC_H
+#define GC_H
+
+/* Help debug mixed up preprocessor symbols. */
+#if (defined(WIN64) && !defined(_WIN64)) && defined(_MSC_VER)
+#pragma message("Warning: Expecting _WIN64 for x64 targets! Notice the leading underscore!")
+#endif
+
+#include "gc_version.h"
+ /* Define version numbers here to allow test on build machine */
+ /* for cross-builds. Note that this defines the header */
+ /* version number, which may or may not match that of the */
+ /* dynamic library. GC_get_version() can be used to obtain */
+ /* the latter. */
+
+#include "gc_config_macros.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+typedef void * GC_PTR; /* preserved only for backward compatibility */
+
+/* Define word and signed_word to be unsigned and signed types of the */
+/* size as char * or void *. There seems to be no way to do this */
+/* even semi-portably. The following is probably no better/worse */
+/* than almost anything else. */
+/* The ANSI standard suggests that size_t and ptrdiff_t might be */
+/* better choices. But those had incorrect definitions on some older */
+/* systems. Notably "typedef int size_t" is WRONG. */
+#ifdef _WIN64
+# if defined(__int64) && !defined(CPPCHECK)
+ typedef unsigned __int64 GC_word;
+ typedef __int64 GC_signed_word;
+# else
+ typedef unsigned long long GC_word;
+ typedef long long GC_signed_word;
+# endif
+#else
+ typedef unsigned long GC_word;
+ typedef long GC_signed_word;
+#endif
+
+/* Get the GC library version. The returned value is a constant in the */
+/* form: ((version_major<<16) | (version_minor<<8) | version_micro). */
+GC_API unsigned GC_CALL GC_get_version(void);
+
+/* Public read-only variables */
+/* The supplied getter functions are preferred for new code. */
+
+GC_API GC_ATTR_DEPRECATED GC_word GC_gc_no;
+ /* Counter incremented per collection. */
+ /* Includes empty GCs at startup. */
+GC_API GC_word GC_CALL GC_get_gc_no(void);
+ /* GC_get_gc_no() is unsynchronized, so */
+ /* it requires GC_call_with_alloc_lock() to */
+ /* avoid data races on multiprocessors. */
+
+#ifdef GC_THREADS
+ /* GC is parallelized for performance on multiprocessors. Set to */
+ /* a non-zero value when client calls GC_start_mark_threads() */
+ /* directly or starts the first non-main thread, provided the */
+ /* collector is built with PARALLEL_MARK defined, and either */
+ /* GC_MARKERS (or GC_NPROCS) environment variable is set to a value */
+ /* bigger than 1, or multiple cores (processors) are available, or */
+ /* the client calls GC_set_markers_count() before GC initialization. */
+ /* After setting, GC_parallel value is equal to the number of marker */
+ /* threads minus one (i.e. the number of existing parallel marker */
+ /* threads excluding the initiating one). */
+ GC_API GC_ATTR_DEPRECATED int GC_parallel;
+
+ /* Return value of GC_parallel. Does not acquire the GC lock. */
+ GC_API int GC_CALL GC_get_parallel(void);
+
+ /* Set the number of marker threads (including the initiating one) */
+ /* to the desired value at start-up. Zero value means the collector */
+ /* is to decide. If the correct non-zero value is passed, then later */
+ /* GC_parallel will be set to the value minus one. Has no effect if */
+ /* called after GC initialization. Does not itself cause creation of */
+ /* the marker threads. Does not use any synchronization. */
+ GC_API void GC_CALL GC_set_markers_count(unsigned);
+#endif
+
+
+/* Public R/W variables */
+/* The supplied setter and getter functions are preferred for new code. */
+
+typedef void * (GC_CALLBACK * GC_oom_func)(size_t /* bytes_requested */);
+GC_API GC_ATTR_DEPRECATED GC_oom_func GC_oom_fn;
+ /* When there is insufficient memory to satisfy */
+ /* an allocation request, we return */
+ /* (*GC_oom_fn)(size). By default this just */
+ /* returns NULL. */
+ /* If it returns, it must return 0 or a valid */
+ /* pointer to a previously allocated heap */
+ /* object. GC_oom_fn must not be 0. */
+ /* Both the supplied setter and the getter */
+ /* acquire the GC lock (to avoid data races). */
+GC_API void GC_CALL GC_set_oom_fn(GC_oom_func) GC_ATTR_NONNULL(1);
+GC_API GC_oom_func GC_CALL GC_get_oom_fn(void);
+
+typedef void (GC_CALLBACK * GC_on_heap_resize_proc)(GC_word /* new_size */);
+GC_API GC_ATTR_DEPRECATED GC_on_heap_resize_proc GC_on_heap_resize;
+ /* Invoked when the heap grows or shrinks. */
+ /* Called with the world stopped (and the */
+ /* allocation lock held). May be 0. */
+GC_API void GC_CALL GC_set_on_heap_resize(GC_on_heap_resize_proc);
+GC_API GC_on_heap_resize_proc GC_CALL GC_get_on_heap_resize(void);
+ /* Both the supplied setter and the getter */
+ /* acquire the GC lock (to avoid data races). */
+
+typedef enum {
+ GC_EVENT_START /* COLLECTION */,
+ GC_EVENT_MARK_START,
+ GC_EVENT_MARK_END,
+ GC_EVENT_RECLAIM_START,
+ GC_EVENT_RECLAIM_END,
+ GC_EVENT_END /* COLLECTION */,
+ GC_EVENT_PRE_STOP_WORLD /* STOPWORLD_BEGIN */,
+ GC_EVENT_POST_STOP_WORLD /* STOPWORLD_END */,
+ GC_EVENT_PRE_START_WORLD /* STARTWORLD_BEGIN */,
+ GC_EVENT_POST_START_WORLD /* STARTWORLD_END */,
+ GC_EVENT_THREAD_SUSPENDED,
+ GC_EVENT_THREAD_UNSUSPENDED
+} GC_EventType;
+
+typedef void (GC_CALLBACK * GC_on_collection_event_proc)(GC_EventType);
+ /* Invoked to indicate progress through the */
+ /* collection process. Not used for thread */
+ /* suspend/resume notifications. Called with */
+ /* the GC lock held (or, even, the world */
+ /* stopped). May be 0 (means no notifier). */
+GC_API void GC_CALL GC_set_on_collection_event(GC_on_collection_event_proc);
+GC_API GC_on_collection_event_proc GC_CALL GC_get_on_collection_event(void);
+ /* Both the supplied setter and the getter */
+ /* acquire the GC lock (to avoid data races). */
+
+#if defined(GC_THREADS) || (defined(GC_BUILD) && defined(NN_PLATFORM_CTR))
+ typedef void (GC_CALLBACK * GC_on_thread_event_proc)(GC_EventType,
+ void * /* thread_id */);
+ /* Invoked when a thread is suspended or */
+ /* resumed during collection. Called with the */
+ /* GC lock held (and the world stopped */
+ /* partially). May be 0 (means no notifier). */
+ GC_API void GC_CALL GC_set_on_thread_event(GC_on_thread_event_proc);
+ GC_API GC_on_thread_event_proc GC_CALL GC_get_on_thread_event(void);
+ /* Both the supplied setter and the getter */
+ /* acquire the GC lock (to avoid data races). */
+#endif
+
+GC_API GC_ATTR_DEPRECATED int GC_find_leak;
+ /* Set to true to turn on the leak-finding mode */
+ /* (do not actually garbage collect, but simply */
+ /* report inaccessible memory that was not */
+ /* deallocated with GC_FREE). Initial value */
+ /* is determined by FIND_LEAK macro. */
+ /* The value should not typically be modified */
+ /* after GC initialization (and, thus, it does */
+ /* not use or need synchronization). */
+GC_API void GC_CALL GC_set_find_leak(int);
+GC_API int GC_CALL GC_get_find_leak(void);
+
+GC_API GC_ATTR_DEPRECATED int GC_all_interior_pointers;
+ /* Arrange for pointers to object interiors to */
+ /* be recognized as valid. Typically should */
+ /* not be changed after GC initialization (in */
+ /* case of calling it after the GC is */
+ /* initialized, the setter acquires the GC lock */
+ /* (to avoid data races). The initial value */
+ /* depends on whether the GC is built with */
+ /* ALL_INTERIOR_POINTERS macro defined or not. */
+ /* Unless DONT_ADD_BYTE_AT_END is defined, this */
+ /* also affects whether sizes are increased by */
+ /* at least a byte to allow "off the end" */
+ /* pointer recognition. Must be only 0 or 1. */
+GC_API void GC_CALL GC_set_all_interior_pointers(int);
+GC_API int GC_CALL GC_get_all_interior_pointers(void);
+
+GC_API GC_ATTR_DEPRECATED int GC_finalize_on_demand;
+ /* If nonzero, finalizers will only be run in */
+ /* response to an explicit GC_invoke_finalizers */
+ /* call. The default is determined by whether */
+ /* the FINALIZE_ON_DEMAND macro is defined */
+ /* when the collector is built. */
+ /* The setter and getter are unsynchronized. */
+GC_API void GC_CALL GC_set_finalize_on_demand(int);
+GC_API int GC_CALL GC_get_finalize_on_demand(void);
+
+GC_API GC_ATTR_DEPRECATED int GC_java_finalization;
+ /* Mark objects reachable from finalizable */
+ /* objects in a separate post-pass. This makes */
+ /* it a bit safer to use non-topologically- */
+ /* ordered finalization. Default value is */
+ /* determined by JAVA_FINALIZATION macro. */
+ /* Enables GC_register_finalizer_unreachable to */
+ /* work correctly. */
+ /* The setter and getter are unsynchronized. */
+GC_API void GC_CALL GC_set_java_finalization(int);
+GC_API int GC_CALL GC_get_java_finalization(void);
+
+typedef void (GC_CALLBACK * GC_finalizer_notifier_proc)(void);
+GC_API GC_ATTR_DEPRECATED GC_finalizer_notifier_proc GC_finalizer_notifier;
+ /* Invoked by the collector when there are */
+ /* objects to be finalized. Invoked at most */
+ /* once per GC cycle. Never invoked unless */
+ /* GC_finalize_on_demand is set. */
+ /* Typically this will notify a finalization */
+ /* thread, which will call GC_invoke_finalizers */
+ /* in response. May be 0 (means no notifier). */
+ /* Both the supplied setter and the getter */
+ /* acquire the GC lock (to avoid data races). */
+GC_API void GC_CALL GC_set_finalizer_notifier(GC_finalizer_notifier_proc);
+GC_API GC_finalizer_notifier_proc GC_CALL GC_get_finalizer_notifier(void);
+
+GC_API
+# ifndef GC_DONT_GC
+ GC_ATTR_DEPRECATED
+# endif
+ int GC_dont_gc; /* != 0 ==> Do not collect. This overrides */
+ /* explicit GC_gcollect() calls as well. */
+ /* Used as a counter, so that nested enabling */
+ /* and disabling work correctly. Should */
+ /* normally be updated with GC_enable() and */
+ /* GC_disable() calls. Direct assignment to */
+ /* GC_dont_gc is deprecated. To check whether */
+ /* GC is disabled, GC_is_disabled() is */
+ /* preferred for new code. */
+
+GC_API GC_ATTR_DEPRECATED int GC_dont_expand;
+ /* Do not expand the heap unless explicitly */
+ /* requested or forced to. The setter and */
+ /* getter are unsynchronized. */
+GC_API void GC_CALL GC_set_dont_expand(int);
+GC_API int GC_CALL GC_get_dont_expand(void);
+
+GC_API GC_ATTR_DEPRECATED int GC_use_entire_heap;
+ /* Causes the non-incremental collector to use the */
+ /* entire heap before collecting. This sometimes */
+ /* results in more large block fragmentation, since */
+ /* very large blocks will tend to get broken up */
+ /* during each GC cycle. It is likely to result in a */
+ /* larger working set, but lower collection */
+ /* frequencies, and hence fewer instructions executed */
+ /* in the collector. */
+
+GC_API GC_ATTR_DEPRECATED int GC_full_freq;
+ /* Number of partial collections between */
+ /* full collections. Matters only if */
+ /* GC_is_incremental_mode(). */
+ /* Full collections are also triggered if */
+ /* the collector detects a substantial */
+ /* increase in the number of in-use heap */
+ /* blocks. Values in the tens are now */
+ /* perfectly reasonable, unlike for */
+ /* earlier GC versions. */
+ /* The setter and getter are unsynchronized, so */
+ /* GC_call_with_alloc_lock() is required to */
+ /* avoid data races (if the value is modified */
+ /* after the GC is put to multi-threaded mode). */
+GC_API void GC_CALL GC_set_full_freq(int);
+GC_API int GC_CALL GC_get_full_freq(void);
+
+GC_API GC_ATTR_DEPRECATED GC_word GC_non_gc_bytes;
+ /* Bytes not considered candidates for */
+ /* collection. Used only to control scheduling */
+ /* of collections. Updated by */
+ /* GC_malloc_uncollectable and GC_free. */
+ /* Wizards only. */
+ /* The setter and getter are unsynchronized, so */
+ /* GC_call_with_alloc_lock() is required to */
+ /* avoid data races (if the value is modified */
+ /* after the GC is put to multi-threaded mode). */
+GC_API void GC_CALL GC_set_non_gc_bytes(GC_word);
+GC_API GC_word GC_CALL GC_get_non_gc_bytes(void);
+
+GC_API GC_ATTR_DEPRECATED int GC_no_dls;
+ /* Don't register dynamic library data segments. */
+ /* Wizards only. Should be used only if the */
+ /* application explicitly registers all roots. */
+ /* (In some environments like Microsoft Windows */
+ /* and Apple's Darwin, this may also prevent */
+ /* registration of the main data segment as part */
+ /* of the root set.) */
+ /* The setter and getter are unsynchronized. */
+GC_API void GC_CALL GC_set_no_dls(int);
+GC_API int GC_CALL GC_get_no_dls(void);
+
+GC_API GC_ATTR_DEPRECATED GC_word GC_free_space_divisor;
+ /* We try to make sure that we allocate at */
+ /* least N/GC_free_space_divisor bytes between */
+ /* collections, where N is twice the number */
+ /* of traced bytes, plus the number of untraced */
+ /* bytes (bytes in "atomic" objects), plus */
+ /* a rough estimate of the root set size. */
+ /* N approximates GC tracing work per GC. */
+ /* The initial value is GC_FREE_SPACE_DIVISOR. */
+ /* Increasing its value will use less space */
+ /* but more collection time. Decreasing it */
+ /* will appreciably decrease collection time */
+ /* at the expense of space. */
+ /* The setter and getter are unsynchronized, so */
+ /* GC_call_with_alloc_lock() is required to */
+ /* avoid data races (if the value is modified */
+ /* after the GC is put to multi-threaded mode). */
+ /* In GC v7.1 (and before), the setter returned */
+ /* the old value. */
+GC_API void GC_CALL GC_set_free_space_divisor(GC_word);
+GC_API GC_word GC_CALL GC_get_free_space_divisor(void);
+
+GC_API GC_ATTR_DEPRECATED GC_word GC_max_retries;
+ /* The maximum number of GCs attempted before */
+ /* reporting out of memory after heap */
+ /* expansion fails. Initially 0. */
+ /* The setter and getter are unsynchronized, so */
+ /* GC_call_with_alloc_lock() is required to */
+ /* avoid data races (if the value is modified */
+ /* after the GC is put to multi-threaded mode). */
+GC_API void GC_CALL GC_set_max_retries(GC_word);
+GC_API GC_word GC_CALL GC_get_max_retries(void);
+
+
+GC_API GC_ATTR_DEPRECATED char *GC_stackbottom;
+ /* The cold end (bottom) of user stack. */
+ /* May be set in the client prior to */
+ /* calling any GC_ routines. This */
+ /* avoids some overhead, and */
+ /* potentially some signals that can */
+ /* confuse debuggers. Otherwise the */
+ /* collector attempts to set it */
+ /* automatically. */
+ /* For multi-threaded code, this is the */
+ /* cold end of the stack for the */
+ /* primordial thread. Portable clients */
+ /* should use GC_get_stack_base(), */
+ /* GC_call_with_gc_active() and */
+ /* GC_register_my_thread() instead. */
+
+GC_API GC_ATTR_DEPRECATED int GC_dont_precollect;
+ /* Do not collect as part of GC */
+ /* initialization. Should be set only */
+ /* if the client wants a chance to */
+ /* manually initialize the root set */
+ /* before the first collection. */
+ /* Interferes with blacklisting. */
+ /* Wizards only. The setter and getter */
+ /* are unsynchronized (and no external */
+ /* locking is needed since the value is */
+ /* accessed at GC initialization only). */
+GC_API void GC_CALL GC_set_dont_precollect(int);
+GC_API int GC_CALL GC_get_dont_precollect(void);
+
+GC_API GC_ATTR_DEPRECATED unsigned long GC_time_limit;
+ /* If incremental collection is enabled, */
+ /* we try to terminate collections */
+ /* after this many milliseconds (plus */
+ /* the amount of nanoseconds as given in */
+ /* the latest GC_set_time_limit_tv call, */
+ /* if any). Not a hard time bound. */
+ /* Setting this variable to */
+ /* GC_TIME_UNLIMITED will essentially */
+ /* disable incremental collection while */
+ /* leaving generational collection */
+ /* enabled. */
+#define GC_TIME_UNLIMITED 999999
+ /* Setting GC_time_limit to this value */
+ /* will disable the "pause time exceeded"*/
+ /* tests. */
+ /* The setter and getter are unsynchronized, so */
+ /* GC_call_with_alloc_lock() is required to */
+ /* avoid data races (if the value is modified */
+ /* after the GC is put to multi-threaded mode). */
+ /* The setter does not update the value of the */
+ /* nanosecond part of the time limit (it is */
+ /* zero unless ever set by GC_set_time_limit_tv */
+ /* call). */
+GC_API void GC_CALL GC_set_time_limit(unsigned long);
+GC_API unsigned long GC_CALL GC_get_time_limit(void);
+
+/* A portable type definition of time with a nanosecond precision. */
+struct GC_timeval_s {
+ unsigned long tv_ms; /* time in milliseconds */
+ unsigned long tv_nsec;/* nanoseconds fraction (<1000000) */
+};
+
+/* Public procedures */
+
+/* Set/get the time limit of the incremental collections. This is */
+/* similar to GC_set_time_limit and GC_get_time_limit but the time is */
+/* provided with the nanosecond precision. The value of tv_nsec part */
+/* should be less than a million. If the value of tv_ms part is */
+/* GC_TIME_UNLIMITED then tv_nsec is ignored. Initially, the value of */
+/* tv_nsec part of the time limit is zero. The functions do not use */
+/* any synchronization. Defined only if the library has been compiled */
+/* without NO_CLOCK. */
+GC_API void GC_CALL GC_set_time_limit_tv(struct GC_timeval_s);
+GC_API struct GC_timeval_s GC_CALL GC_get_time_limit_tv(void);
+
+/* Set/get the minimum value of the ratio of allocated bytes since GC */
+/* to the amount of finalizers created since that GC (value > */
+/* GC_bytes_allocd / (GC_fo_entries - last_fo_entries)) which triggers */
+/* the collection instead heap expansion. The value has no effect in */
+/* the GC incremental mode. The default value is 10000 unless */
+/* GC_ALLOCD_BYTES_PER_FINALIZER macro with a custom value is defined */
+/* to build libgc. The default value might be not the right choice for */
+/* clients where e.g. most objects have a finalizer. Zero value */
+/* effectively disables taking amount of finalizers in the decision */
+/* whether to collect or not. The functions do not use any */
+/* synchronization. */
+GC_API void GC_CALL GC_set_allocd_bytes_per_finalizer(GC_word);
+GC_API GC_word GC_CALL GC_get_allocd_bytes_per_finalizer(void);
+
+/* Tell the collector to start various performance measurements. */
+/* Only the total time taken by full collections is calculated, as */
+/* of now. And, currently, there is no way to stop the measurements. */
+/* The function does not use any synchronization. Defined only if the */
+/* library has been compiled without NO_CLOCK. */
+GC_API void GC_CALL GC_start_performance_measurement(void);
+
+/* Get the total time of all full collections since the start of the */
+/* performance measurements. The measurement unit is one millisecond. */
+/* Note that the returned value wraps around on overflow. */
+/* The function does not use any synchronization. Defined only if the */
+/* library has been compiled without NO_CLOCK. */
+GC_API unsigned long GC_CALL GC_get_full_gc_total_time(void);
+
+/* Set whether the GC will allocate executable memory pages or not. */
+/* A non-zero argument instructs the collector to allocate memory with */
+/* the executable flag on. Must be called before the collector is */
+/* initialized. May have no effect on some platforms. The default */
+/* value is controlled by NO_EXECUTE_PERMISSION macro (if present then */
+/* the flag is off). Portable clients should have */
+/* GC_set_pages_executable(1) call (before GC_INIT) provided they are */
+/* going to execute code on any of the GC-allocated memory objects. */
+GC_API void GC_CALL GC_set_pages_executable(int);
+
+/* Returns non-zero value if the GC is set to the allocate-executable */
+/* mode. The mode could be changed by GC_set_pages_executable (before */
+/* GC_INIT) unless the former has no effect on the platform. Does not */
+/* use or need synchronization (i.e. acquiring the allocator lock). */
+GC_API int GC_CALL GC_get_pages_executable(void);
+
+/* The setter and getter of the minimum value returned by the internal */
+/* min_bytes_allocd(). The value should not be zero; the default value */
+/* is one. Not synchronized. */
+GC_API void GC_CALL GC_set_min_bytes_allocd(size_t);
+GC_API size_t GC_CALL GC_get_min_bytes_allocd(void);
+
+/* Set/get the size in pages of units operated by GC_collect_a_little. */
+/* The value should not be zero. Not synchronized. */
+GC_API void GC_CALL GC_set_rate(int);
+GC_API int GC_CALL GC_get_rate(void);
+
+/* Set/get the maximum number of prior attempts at the world-stop */
+/* marking. Not synchronized. */
+GC_API void GC_CALL GC_set_max_prior_attempts(int);
+GC_API int GC_CALL GC_get_max_prior_attempts(void);
+
+/* Control whether to disable algorithm deciding if a collection should */
+/* be started when we allocated enough to amortize GC. Both the setter */
+/* and the getter acquire the GC lock (to avoid data races). */
+GC_API void GC_CALL GC_set_disable_automatic_collection(int);
+GC_API int GC_CALL GC_get_disable_automatic_collection(void);
+
+/* Overrides the default handle-fork mode. Non-zero value means GC */
+/* should install proper pthread_atfork handlers. Has effect only if */
+/* called before GC_INIT. Clients should invoke GC_set_handle_fork */
+/* with non-zero argument if going to use fork with GC functions called */
+/* in the forked child. (Note that such client and atfork handlers */
+/* activities are not fully POSIX-compliant.) GC_set_handle_fork */
+/* instructs GC_init to setup GC fork handlers using pthread_atfork, */
+/* the latter might fail (or, even, absent on some targets) causing */
+/* abort at GC initialization. Issues with missing (or failed) */
+/* pthread_atfork() could be avoided by invocation */
+/* of GC_set_handle_fork(-1) at application start-up and surrounding */
+/* each fork() with the relevant GC_atfork_prepare/parent/child calls. */
+GC_API void GC_CALL GC_set_handle_fork(int);
+
+/* Routines to handle POSIX fork() manually (no-op if handled */
+/* automatically). GC_atfork_prepare should be called immediately */
+/* before fork(); GC_atfork_parent should be invoked just after fork in */
+/* the branch that corresponds to parent process (i.e., fork result is */
+/* non-zero); GC_atfork_child is to be called immediately in the child */
+/* branch (i.e., fork result is 0). Note that GC_atfork_child() call */
+/* should, of course, precede GC_start_mark_threads call (if any). */
+GC_API void GC_CALL GC_atfork_prepare(void);
+GC_API void GC_CALL GC_atfork_parent(void);
+GC_API void GC_CALL GC_atfork_child(void);
+
+/* Initialize the collector. Portable clients should call GC_INIT() */
+/* from the main program instead. */
+GC_API void GC_CALL GC_init(void);
+
+/* Returns non-zero (TRUE) if and only if the collector is initialized */
+/* (or, at least, the initialization is in progress). */
+GC_API int GC_CALL GC_is_init_called(void);
+
+/* Perform the collector shutdown. (E.g. dispose critical sections on */
+/* Win32 target.) A duplicate invocation is a no-op. GC_INIT should */
+/* not be called after the shutdown. See also GC_win32_free_heap(). */
+GC_API void GC_CALL GC_deinit(void);
+
+/* General purpose allocation routines, with roughly malloc calling */
+/* conv. The atomic versions promise that no relevant pointers are */
+/* contained in the object. The non-atomic versions guarantee that the */
+/* new object is cleared. GC_malloc_uncollectable allocates */
+/* an object that is scanned for pointers to collectible */
+/* objects, but is not itself collectible. The object is scanned even */
+/* if it does not appear to be reachable. GC_malloc_uncollectable and */
+/* GC_free called on the resulting object implicitly update */
+/* GC_non_gc_bytes appropriately. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_malloc(size_t /* size_in_bytes */);
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_malloc_atomic(size_t /* size_in_bytes */);
+GC_API GC_ATTR_MALLOC char * GC_CALL GC_strdup(const char *);
+GC_API GC_ATTR_MALLOC char * GC_CALL
+ GC_strndup(const char *, size_t) GC_ATTR_NONNULL(1);
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_malloc_uncollectable(size_t /* size_in_bytes */);
+GC_API GC_ATTR_DEPRECATED void * GC_CALL GC_malloc_stubborn(size_t);
+
+/* GC_memalign() is not well tested. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(2) void * GC_CALL
+ GC_memalign(size_t /* align */, size_t /* lb */);
+GC_API int GC_CALL GC_posix_memalign(void ** /* memptr */, size_t /* align */,
+ size_t /* lb */) GC_ATTR_NONNULL(1);
+
+/* Explicitly deallocate an object. Dangerous if used incorrectly. */
+/* Requires a pointer to the base of an object. */
+/* An object should not be enabled for finalization (and it should not */
+/* contain registered disappearing links of any kind) when it is */
+/* explicitly deallocated. */
+/* GC_free(0) is a no-op, as required by ANSI C for free. */
+GC_API void GC_CALL GC_free(void *);
+
+/* The "stubborn" objects allocation is not supported anymore. Exists */
+/* only for the backward compatibility. */
+#define GC_MALLOC_STUBBORN(sz) GC_MALLOC(sz)
+#define GC_NEW_STUBBORN(t) GC_NEW(t)
+#define GC_CHANGE_STUBBORN(p) GC_change_stubborn(p)
+GC_API GC_ATTR_DEPRECATED void GC_CALL GC_change_stubborn(const void *);
+
+/* Inform the collector that the object has been changed. */
+/* Only non-NULL pointer stores into the object are considered to be */
+/* changes. Matters only if the incremental collection is enabled in */
+/* the manual VDB mode (otherwise the function does nothing). */
+/* Should be followed typically by GC_reachable_here called for each */
+/* of the stored pointers. */
+GC_API void GC_CALL GC_end_stubborn_change(const void *) GC_ATTR_NONNULL(1);
+
+/* Return a pointer to the base (lowest address) of an object given */
+/* a pointer to a location within the object. */
+/* I.e., map an interior pointer to the corresponding base pointer. */
+/* Note that with debugging allocation, this returns a pointer to the */
+/* actual base of the object, i.e. the debug information, not to */
+/* the base of the user object. */
+/* Return 0 if displaced_pointer doesn't point to within a valid */
+/* object. */
+/* Note that a deallocated object in the garbage collected heap */
+/* may be considered valid, even if it has been deallocated with */
+/* GC_free. */
+GC_API void * GC_CALL GC_base(void * /* displaced_pointer */);
+
+/* Return non-zero (TRUE) if and only if the argument points to */
+/* somewhere in GC heap. Primary use is as a fast alternative to */
+/* GC_base to check whether the pointed object is allocated by GC */
+/* or not. It is assumed that the collector is already initialized. */
+GC_API int GC_CALL GC_is_heap_ptr(const void *);
+
+/* Given a pointer to the base of an object, return its size in bytes. */
+/* (For small objects this also happens to work from interior pointers, */
+/* but that should not be relied upon.) The returned size may be */
+/* slightly larger than what was originally requested. The argument */
+/* may be NULL (causing 0 to be returned). */
+GC_API size_t GC_CALL GC_size(const void * /* obj_addr */);
+
+/* For compatibility with C library. This is occasionally faster than */
+/* a malloc followed by a bcopy. But if you rely on that, either here */
+/* or with the standard C library, your code is broken. In my */
+/* opinion, it shouldn't have been invented, but now we're stuck. -HB */
+/* The resulting object has the same kind as the original. */
+/* It is an error to have changes enabled for the original object. */
+/* It does not change the content of the object from its beginning to */
+/* the minimum of old size and new_size_in_bytes; the content above in */
+/* case of object size growth is initialized to zero (not guaranteed */
+/* for atomic object type). The function follows ANSI conventions for */
+/* NULL old_object (i.e., equivalent to GC_malloc regardless of new */
+/* size). If new size is zero (and old_object is non-NULL) then the */
+/* call is equivalent to GC_free (and NULL is returned). If old_object */
+/* is non-NULL, it must have been returned by an earlier call to */
+/* GC_malloc* or GC_realloc. In case of the allocation failure, the */
+/* memory pointed by old_object is untouched (and not freed). */
+/* If the returned pointer is not the same as old_object and both of */
+/* them are non-NULL then old_object is freed. Returns either NULL (in */
+/* case of the allocation failure or zero new size) or pointer to the */
+/* allocated memory. */
+GC_API void * GC_CALL GC_realloc(void * /* old_object */,
+ size_t /* new_size_in_bytes */)
+ /* 'realloc' attr */ GC_ATTR_ALLOC_SIZE(2);
+
+/* Explicitly increase the heap size. */
+/* Returns 0 on failure, 1 on success. */
+GC_API int GC_CALL GC_expand_hp(size_t /* number_of_bytes */);
+
+/* Limit the heap size to n bytes. Useful when you're debugging, */
+/* especially on systems that don't handle running out of memory well. */
+/* n == 0 ==> unbounded. This is the default. This setter function is */
+/* unsynchronized (so it might require GC_call_with_alloc_lock to avoid */
+/* data races). */
+GC_API void GC_CALL GC_set_max_heap_size(GC_word /* n */);
+
+/* Inform the collector that a certain section of statically allocated */
+/* memory contains no pointers to garbage collected memory. Thus it */
+/* need not be scanned. This is sometimes important if the application */
+/* maps large read/write files into the address space, which could be */
+/* mistaken for dynamic library data segments on some systems. */
+/* Both section start and end are not needed to be pointer-aligned. */
+GC_API void GC_CALL GC_exclude_static_roots(void * /* low_address */,
+ void * /* high_address_plus_1 */);
+
+/* Clear the number of entries in the exclusion table. Wizards only. */
+GC_API void GC_CALL GC_clear_exclusion_table(void);
+
+/* Clear the set of root segments. Wizards only. */
+GC_API void GC_CALL GC_clear_roots(void);
+
+/* Add a root segment. Wizards only. */
+/* May merge adjacent or overlapping segments if appropriate. */
+/* Both segment start and end are not needed to be pointer-aligned. */
+/* low_address must not be greater than high_address_plus_1. */
+GC_API void GC_CALL GC_add_roots(void * /* low_address */,
+ void * /* high_address_plus_1 */);
+
+/* Remove root segments located fully in the region. Wizards only. */
+GC_API void GC_CALL GC_remove_roots(void * /* low_address */,
+ void * /* high_address_plus_1 */);
+
+/* Add a displacement to the set of those considered valid by the */
+/* collector. GC_register_displacement(n) means that if p was returned */
+/* by GC_malloc, then (char *)p + n will be considered to be a valid */
+/* pointer to p. N must be small and less than the size of p. */
+/* (All pointers to the interior of objects from the stack are */
+/* considered valid in any case. This applies to heap objects and */
+/* static data.) */
+/* Preferably, this should be called before any other GC procedures. */
+/* Calling it later adds to the probability of excess memory */
+/* retention. */
+/* This is a no-op if the collector has recognition of */
+/* arbitrary interior pointers enabled, which is now the default. */
+GC_API void GC_CALL GC_register_displacement(size_t /* n */);
+
+/* The following version should be used if any debugging allocation is */
+/* being done. */
+GC_API void GC_CALL GC_debug_register_displacement(size_t /* n */);
+
+/* Explicitly trigger a full, world-stop collection. */
+GC_API void GC_CALL GC_gcollect(void);
+
+/* Same as above but ignores the default stop_func setting and tries to */
+/* unmap as much memory as possible (regardless of the corresponding */
+/* switch setting). The recommended usage: on receiving a system */
+/* low-memory event; before retrying a system call failed because of */
+/* the system is running out of resources. */
+GC_API void GC_CALL GC_gcollect_and_unmap(void);
+
+/* Trigger a full world-stopped collection. Abort the collection if */
+/* and when stop_func returns a nonzero value. Stop_func will be */
+/* called frequently, and should be reasonably fast. (stop_func is */
+/* called with the allocation lock held and the world might be stopped; */
+/* it's not allowed for stop_func to manipulate pointers to the garbage */
+/* collected heap or call most of GC functions.) This works even */
+/* if virtual dirty bits, and hence incremental collection is not */
+/* available for this architecture. Collections can be aborted faster */
+/* than normal pause times for incremental collection. However, */
+/* aborted collections do no useful work; the next collection needs */
+/* to start from the beginning. stop_func must not be 0. */
+/* GC_try_to_collect() returns 0 if the collection was aborted (or the */
+/* collections are disabled), 1 if it succeeded. */
+typedef int (GC_CALLBACK * GC_stop_func)(void);
+GC_API int GC_CALL GC_try_to_collect(GC_stop_func /* stop_func */)
+ GC_ATTR_NONNULL(1);
+
+/* Set and get the default stop_func. The default stop_func is used by */
+/* GC_gcollect() and by implicitly triggered collections (except for */
+/* the case when handling out of memory). Must not be 0. */
+/* Both the setter and getter acquire the GC lock to avoid data races. */
+GC_API void GC_CALL GC_set_stop_func(GC_stop_func /* stop_func */)
+ GC_ATTR_NONNULL(1);
+GC_API GC_stop_func GC_CALL GC_get_stop_func(void);
+
+/* Return the number of bytes in the heap. Excludes collector private */
+/* data structures. Excludes the unmapped memory (returned to the OS). */
+/* Includes empty blocks and fragmentation loss. Includes some pages */
+/* that were allocated but never written. */
+/* This is an unsynchronized getter, so it should be called typically */
+/* with the GC lock held to avoid data races on multiprocessors (the */
+/* alternative is to use GC_get_heap_usage_safe or GC_get_prof_stats */
+/* API calls instead). */
+/* This getter remains lock-free (unsynchronized) for compatibility */
+/* reason since some existing clients call it from a GC callback */
+/* holding the allocator lock. (This API function and the following */
+/* four ones below were made thread-safe in GC v7.2alpha1 and */
+/* reverted back in v7.2alpha7 for the reason described.) */
+GC_API size_t GC_CALL GC_get_heap_size(void);
+
+/* Return a lower bound on the number of free bytes in the heap */
+/* (excluding the unmapped memory space). This is an unsynchronized */
+/* getter (see GC_get_heap_size comment regarding thread-safety). */
+GC_API size_t GC_CALL GC_get_free_bytes(void);
+
+/* Return the size (in bytes) of the unmapped memory (which is returned */
+/* to the OS but could be remapped back by the collector later unless */
+/* the OS runs out of system/virtual memory). This is an unsynchronized */
+/* getter (see GC_get_heap_size comment regarding thread-safety). */
+GC_API size_t GC_CALL GC_get_unmapped_bytes(void);
+
+/* Return the number of bytes allocated since the last collection. */
+/* This is an unsynchronized getter (see GC_get_heap_size comment */
+/* regarding thread-safety). */
+GC_API size_t GC_CALL GC_get_bytes_since_gc(void);
+
+/* Return the number of explicitly deallocated bytes of memory since */
+/* the recent collection. This is an unsynchronized getter. */
+GC_API size_t GC_CALL GC_get_expl_freed_bytes_since_gc(void);
+
+/* Return the total number of bytes allocated in this process. */
+/* Never decreases, except due to wrapping. This is an unsynchronized */
+/* getter (see GC_get_heap_size comment regarding thread-safety). */
+GC_API size_t GC_CALL GC_get_total_bytes(void);
+
+/* Return the total number of bytes obtained from OS. Includes the */
+/* unmapped memory. Never decreases. It is an unsynchronized getter. */
+GC_API size_t GC_CALL GC_get_obtained_from_os_bytes(void);
+
+/* Return the heap usage information. This is a thread-safe (atomic) */
+/* alternative for the five above getters. (This function acquires */
+/* the allocator lock thus preventing data racing and returning the */
+/* consistent result.) Passing NULL pointer is allowed for any */
+/* argument. Returned (filled in) values are of word type. */
+GC_API void GC_CALL GC_get_heap_usage_safe(GC_word * /* pheap_size */,
+ GC_word * /* pfree_bytes */,
+ GC_word * /* punmapped_bytes */,
+ GC_word * /* pbytes_since_gc */,
+ GC_word * /* ptotal_bytes */);
+
+/* Structure used to query GC statistics (profiling information). */
+/* More fields could be added in the future. To preserve compatibility */
+/* new fields should be added only to the end, and no deprecated fields */
+/* should be removed from. */
+struct GC_prof_stats_s {
+ GC_word heapsize_full;
+ /* Heap size in bytes (including the area unmapped to OS). */
+ /* Same as GC_get_heap_size() + GC_get_unmapped_bytes(). */
+ GC_word free_bytes_full;
+ /* Total bytes contained in free and unmapped blocks. */
+ /* Same as GC_get_free_bytes() + GC_get_unmapped_bytes(). */
+ GC_word unmapped_bytes;
+ /* Amount of memory unmapped to OS. Same as the value */
+ /* returned by GC_get_unmapped_bytes(). */
+ GC_word bytes_allocd_since_gc;
+ /* Number of bytes allocated since the recent collection. */
+ /* Same as returned by GC_get_bytes_since_gc(). */
+ GC_word allocd_bytes_before_gc;
+ /* Number of bytes allocated before the recent garbage */
+ /* collection. The value may wrap. Same as the result of */
+ /* GC_get_total_bytes() - GC_get_bytes_since_gc(). */
+ GC_word non_gc_bytes;
+ /* Number of bytes not considered candidates for garbage */
+ /* collection. Same as returned by GC_get_non_gc_bytes(). */
+ GC_word gc_no;
+ /* Garbage collection cycle number. The value may wrap */
+ /* (and could be -1). Same as returned by GC_get_gc_no(). */
+ GC_word markers_m1;
+ /* Number of marker threads (excluding the initiating one). */
+ /* Same as returned by GC_get_parallel (or 0 if the */
+ /* collector is single-threaded). */
+ GC_word bytes_reclaimed_since_gc;
+ /* Approximate number of reclaimed bytes after recent GC. */
+ GC_word reclaimed_bytes_before_gc;
+ /* Approximate number of bytes reclaimed before the recent */
+ /* garbage collection. The value may wrap. */
+ GC_word expl_freed_bytes_since_gc;
+ /* Number of bytes freed explicitly since the recent GC. */
+ /* Same as returned by GC_get_expl_freed_bytes_since_gc(). */
+ GC_word obtained_from_os_bytes;
+ /* Total amount of memory obtained from OS, in bytes. */
+};
+
+/* Atomically get GC statistics (various global counters). Clients */
+/* should pass the size of the buffer (of GC_prof_stats_s type) to fill */
+/* in the values - this is for interoperability between different GC */
+/* versions, an old client could have fewer fields, and vice versa, */
+/* client could use newer gc.h (with more entries declared in the */
+/* structure) than that of the linked libgc binary; in the latter case, */
+/* unsupported (unknown) fields are filled in with -1. Return the size */
+/* (in bytes) of the filled in part of the structure (excluding all */
+/* unknown fields, if any). */
+GC_API size_t GC_CALL GC_get_prof_stats(struct GC_prof_stats_s *,
+ size_t /* stats_sz */);
+#ifdef GC_THREADS
+ /* Same as above but unsynchronized (i.e., not holding the allocation */
+ /* lock). Clients should call it using GC_call_with_alloc_lock to */
+ /* avoid data races on multiprocessors. */
+ GC_API size_t GC_CALL GC_get_prof_stats_unsafe(struct GC_prof_stats_s *,
+ size_t /* stats_sz */);
+#endif
+
+/* Get the element value (converted to bytes) at a given index of */
+/* size_map table which provides requested-to-actual allocation size */
+/* mapping. Assumes the collector is initialized. Returns -1 if the */
+/* index is out of size_map table bounds. Does not use synchronization, */
+/* thus clients should call it using GC_call_with_alloc_lock typically */
+/* to avoid data races on multiprocessors. */
+GC_API size_t GC_CALL GC_get_size_map_at(int i);
+
+/* Count total memory use in bytes by all allocated blocks. Acquires */
+/* the lock. */
+GC_API size_t GC_CALL GC_get_memory_use(void);
+
+/* Disable garbage collection. Even GC_gcollect calls will be */
+/* ineffective. */
+GC_API void GC_CALL GC_disable(void);
+
+/* Return non-zero (TRUE) if and only if garbage collection is disabled */
+/* (i.e., GC_dont_gc value is non-zero). Does not acquire the lock. */
+GC_API int GC_CALL GC_is_disabled(void);
+
+/* Try to re-enable garbage collection. GC_disable() and GC_enable() */
+/* calls nest. Garbage collection is enabled if the number of calls to */
+/* both functions is equal. */
+GC_API void GC_CALL GC_enable(void);
+
+/* Select whether to use the manual VDB mode for the incremental */
+/* collection. Has no effect if called after enabling the incremental */
+/* collection. The default value is off unless the collector is */
+/* compiled with MANUAL_VDB defined. The manual VDB mode should be */
+/* used only if the client has the appropriate GC_END_STUBBORN_CHANGE */
+/* and GC_reachable_here (or, alternatively, GC_PTR_STORE_AND_DIRTY) */
+/* calls (to ensure proper write barriers). Both the setter and getter */
+/* are not synchronized, and are defined only if the library has been */
+/* compiled without SMALL_CONFIG. */
+GC_API void GC_CALL GC_set_manual_vdb_allowed(int);
+GC_API int GC_CALL GC_get_manual_vdb_allowed(void);
+
+/* Enable incremental/generational collection. Not advisable unless */
+/* dirty bits are available or most heap objects are pointer-free */
+/* (atomic) or immutable. Don't use in leak finding mode. Ignored if */
+/* GC_dont_gc is non-zero. Only the generational piece of this is */
+/* functional if GC_time_limit is set to GC_TIME_UNLIMITED. Causes */
+/* thread-local variant of GC_gcj_malloc() to revert to locked */
+/* allocation. Must be called before any such GC_gcj_malloc() calls. */
+/* For best performance, should be called as early as possible. */
+/* On some platforms, calling it later may have adverse effects. */
+/* Safe to call before GC_INIT(). Includes a GC_init() call. */
+GC_API void GC_CALL GC_enable_incremental(void);
+
+/* Return non-zero (TRUE) if and only if the incremental mode is on. */
+/* Does not acquire the lock. */
+GC_API int GC_CALL GC_is_incremental_mode(void);
+
+#define GC_PROTECTS_POINTER_HEAP 1 /* May protect non-atomic objects. */
+#define GC_PROTECTS_PTRFREE_HEAP 2
+#define GC_PROTECTS_STATIC_DATA 4 /* Currently never. */
+#define GC_PROTECTS_STACK 8 /* Probably impractical. */
+
+#define GC_PROTECTS_NONE 0
+
+/* Does incremental mode write-protect pages? Returns zero or */
+/* more of the above GC_PROTECTS_*, or'ed together. */
+/* The collector is assumed to be initialized before this call. */
+/* The result is not affected by GC_set_manual_vdb_allowed(). */
+/* Call of GC_enable_incremental() may change the result to */
+/* GC_PROTECTS_NONE if some implementation is chosen at runtime */
+/* not needing to write-protect the pages. */
+GC_API int GC_CALL GC_incremental_protection_needs(void);
+
+/* Force start of incremental collection. Acquires the GC lock. */
+/* No-op unless GC incremental mode is on. */
+GC_API void GC_CALL GC_start_incremental_collection(void);
+
+/* Perform some garbage collection work, if appropriate. */
+/* Return 0 if there is no more work to be done (including the */
+/* case when garbage collection is not appropriate). */
+/* Typically performs an amount of work corresponding roughly */
+/* to marking from one page. May do more work if further */
+/* progress requires it, e.g. if incremental collection is */
+/* disabled. It is reasonable to call this in a wait loop */
+/* until it returns 0. */
+GC_API int GC_CALL GC_collect_a_little(void);
+
+/* Allocate an object of size lb bytes. The client guarantees that as */
+/* long as the object is live, it will be referenced by a pointer that */
+/* points to somewhere within the first GC heap block (hblk) of the */
+/* object. (This should normally be declared volatile to prevent the */
+/* compiler from invalidating this assertion.) This routine is only */
+/* useful if a large array is being allocated. It reduces the chance */
+/* of accidentally retaining such an array as a result of scanning an */
+/* integer that happens to be an address inside the array. (Actually, */
+/* it reduces the chance of the allocator not finding space for such */
+/* an array, since it will try hard to avoid introducing such a false */
+/* reference.) On a SunOS 4.X or Windows system this is recommended */
+/* for arrays likely to be larger than 100 KB or so. For other systems,*/
+/* or if the collector is not configured to recognize all interior */
+/* pointers, the threshold is normally much higher. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_malloc_ignore_off_page(size_t /* lb */);
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_malloc_atomic_ignore_off_page(size_t /* lb */);
+
+#ifdef GC_ADD_CALLER
+# define GC_EXTRAS GC_RETURN_ADDR, __FILE__, __LINE__
+# define GC_EXTRA_PARAMS GC_word ra, const char * s, int i
+#else
+# define GC_EXTRAS __FILE__, __LINE__
+# define GC_EXTRA_PARAMS const char * s, int i
+#endif
+
+/* The following is only defined if the library has been suitably */
+/* compiled: */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_malloc_atomic_uncollectable(size_t /* size_in_bytes */);
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_debug_malloc_atomic_uncollectable(size_t, GC_EXTRA_PARAMS);
+
+/* Debugging (annotated) allocation. GC_gcollect will check */
+/* objects allocated in this way for overwrites, etc. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_debug_malloc(size_t /* size_in_bytes */, GC_EXTRA_PARAMS);
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_debug_malloc_atomic(size_t /* size_in_bytes */, GC_EXTRA_PARAMS);
+GC_API GC_ATTR_MALLOC char * GC_CALL
+ GC_debug_strdup(const char *, GC_EXTRA_PARAMS);
+GC_API GC_ATTR_MALLOC char * GC_CALL
+ GC_debug_strndup(const char *, size_t, GC_EXTRA_PARAMS)
+ GC_ATTR_NONNULL(1);
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_debug_malloc_uncollectable(size_t /* size_in_bytes */,
+ GC_EXTRA_PARAMS);
+GC_API GC_ATTR_DEPRECATED void * GC_CALL
+ GC_debug_malloc_stubborn(size_t /* size_in_bytes */, GC_EXTRA_PARAMS);
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_debug_malloc_ignore_off_page(size_t /* size_in_bytes */,
+ GC_EXTRA_PARAMS);
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_debug_malloc_atomic_ignore_off_page(size_t /* size_in_bytes */,
+ GC_EXTRA_PARAMS);
+GC_API void GC_CALL GC_debug_free(void *);
+GC_API void * GC_CALL GC_debug_realloc(void * /* old_object */,
+ size_t /* new_size_in_bytes */, GC_EXTRA_PARAMS)
+ /* 'realloc' attr */ GC_ATTR_ALLOC_SIZE(2);
+GC_API GC_ATTR_DEPRECATED void GC_CALL GC_debug_change_stubborn(const void *);
+GC_API void GC_CALL GC_debug_end_stubborn_change(const void *)
+ GC_ATTR_NONNULL(1);
+
+/* Routines that allocate objects with debug information (like the */
+/* above), but just fill in dummy file and line number information. */
+/* Thus they can serve as drop-in malloc/realloc replacements. This */
+/* can be useful for two reasons: */
+/* 1) It allows the collector to be built with DBG_HDRS_ALL defined */
+/* even if some allocation calls come from 3rd party libraries */
+/* that can't be recompiled. */
+/* 2) On some platforms, the file and line information is redundant, */
+/* since it can be reconstructed from a stack trace. On such */
+/* platforms it may be more convenient not to recompile, e.g. for */
+/* leak detection. This can be accomplished by instructing the */
+/* linker to replace malloc/realloc with these. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_debug_malloc_replacement(size_t /* size_in_bytes */);
+GC_API /* 'realloc' attr */ GC_ATTR_ALLOC_SIZE(2) void * GC_CALL
+ GC_debug_realloc_replacement(void * /* object_addr */,
+ size_t /* size_in_bytes */);
+
+#ifdef GC_DEBUG_REPLACEMENT
+# define GC_MALLOC(sz) GC_debug_malloc_replacement(sz)
+# define GC_REALLOC(old, sz) GC_debug_realloc_replacement(old, sz)
+#elif defined(GC_DEBUG)
+# define GC_MALLOC(sz) GC_debug_malloc(sz, GC_EXTRAS)
+# define GC_REALLOC(old, sz) GC_debug_realloc(old, sz, GC_EXTRAS)
+#else
+# define GC_MALLOC(sz) GC_malloc(sz)
+# define GC_REALLOC(old, sz) GC_realloc(old, sz)
+#endif /* !GC_DEBUG_REPLACEMENT && !GC_DEBUG */
+
+#ifdef GC_DEBUG
+# define GC_MALLOC_ATOMIC(sz) GC_debug_malloc_atomic(sz, GC_EXTRAS)
+# define GC_STRDUP(s) GC_debug_strdup(s, GC_EXTRAS)
+# define GC_STRNDUP(s, sz) GC_debug_strndup(s, sz, GC_EXTRAS)
+# define GC_MALLOC_ATOMIC_UNCOLLECTABLE(sz) \
+ GC_debug_malloc_atomic_uncollectable(sz, GC_EXTRAS)
+# define GC_MALLOC_UNCOLLECTABLE(sz) \
+ GC_debug_malloc_uncollectable(sz, GC_EXTRAS)
+# define GC_MALLOC_IGNORE_OFF_PAGE(sz) \
+ GC_debug_malloc_ignore_off_page(sz, GC_EXTRAS)
+# define GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(sz) \
+ GC_debug_malloc_atomic_ignore_off_page(sz, GC_EXTRAS)
+# define GC_FREE(p) GC_debug_free(p)
+# define GC_REGISTER_FINALIZER(p, f, d, of, od) \
+ GC_debug_register_finalizer(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \
+ GC_debug_register_finalizer_ignore_self(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_NO_ORDER(p, f, d, of, od) \
+ GC_debug_register_finalizer_no_order(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_UNREACHABLE(p, f, d, of, od) \
+ GC_debug_register_finalizer_unreachable(p, f, d, of, od)
+# define GC_END_STUBBORN_CHANGE(p) GC_debug_end_stubborn_change(p)
+# define GC_PTR_STORE_AND_DIRTY(p, q) GC_debug_ptr_store_and_dirty(p, q)
+# define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \
+ GC_general_register_disappearing_link(link, \
+ GC_base((/* no const */ void *)(obj)))
+# define GC_REGISTER_LONG_LINK(link, obj) \
+ GC_register_long_link(link, GC_base((/* no const */ void *)(obj)))
+# define GC_REGISTER_DISPLACEMENT(n) GC_debug_register_displacement(n)
+#else
+# define GC_MALLOC_ATOMIC(sz) GC_malloc_atomic(sz)
+# define GC_STRDUP(s) GC_strdup(s)
+# define GC_STRNDUP(s, sz) GC_strndup(s, sz)
+# define GC_MALLOC_ATOMIC_UNCOLLECTABLE(sz) GC_malloc_atomic_uncollectable(sz)
+# define GC_MALLOC_UNCOLLECTABLE(sz) GC_malloc_uncollectable(sz)
+# define GC_MALLOC_IGNORE_OFF_PAGE(sz) \
+ GC_malloc_ignore_off_page(sz)
+# define GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(sz) \
+ GC_malloc_atomic_ignore_off_page(sz)
+# define GC_FREE(p) GC_free(p)
+# define GC_REGISTER_FINALIZER(p, f, d, of, od) \
+ GC_register_finalizer(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \
+ GC_register_finalizer_ignore_self(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_NO_ORDER(p, f, d, of, od) \
+ GC_register_finalizer_no_order(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_UNREACHABLE(p, f, d, of, od) \
+ GC_register_finalizer_unreachable(p, f, d, of, od)
+# define GC_END_STUBBORN_CHANGE(p) GC_end_stubborn_change(p)
+# define GC_PTR_STORE_AND_DIRTY(p, q) GC_ptr_store_and_dirty(p, q)
+# define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \
+ GC_general_register_disappearing_link(link, obj)
+# define GC_REGISTER_LONG_LINK(link, obj) \
+ GC_register_long_link(link, obj)
+# define GC_REGISTER_DISPLACEMENT(n) GC_register_displacement(n)
+#endif /* !GC_DEBUG */
+
+/* The following are included because they are often convenient, and */
+/* reduce the chance for a misspecified size argument. But calls may */
+/* expand to something syntactically incorrect if t is a complicated */
+/* type expression. Note that, unlike C++ new operator, these ones */
+/* may return NULL (if out of memory). */
+#define GC_NEW(t) ((t*)GC_MALLOC(sizeof(t)))
+#define GC_NEW_ATOMIC(t) ((t*)GC_MALLOC_ATOMIC(sizeof(t)))
+#define GC_NEW_UNCOLLECTABLE(t) ((t*)GC_MALLOC_UNCOLLECTABLE(sizeof(t)))
+
+#ifdef GC_REQUIRE_WCSDUP
+ /* This might be unavailable on some targets (or not needed). */
+ /* wchar_t should be defined in stddef.h */
+ GC_API GC_ATTR_MALLOC wchar_t * GC_CALL
+ GC_wcsdup(const wchar_t *) GC_ATTR_NONNULL(1);
+ GC_API GC_ATTR_MALLOC wchar_t * GC_CALL
+ GC_debug_wcsdup(const wchar_t *, GC_EXTRA_PARAMS) GC_ATTR_NONNULL(1);
+# ifdef GC_DEBUG
+# define GC_WCSDUP(s) GC_debug_wcsdup(s, GC_EXTRAS)
+# else
+# define GC_WCSDUP(s) GC_wcsdup(s)
+# endif
+#endif /* GC_REQUIRE_WCSDUP */
+
+/* Finalization. Some of these primitives are grossly unsafe. */
+/* The idea is to make them both cheap, and sufficient to build */
+/* a safer layer, closer to Modula-3, Java, or PCedar finalization. */
+/* The interface represents my conclusions from a long discussion */
+/* with Alan Demers, Dan Greene, Carl Hauser, Barry Hayes, */
+/* Christian Jacobi, and Russ Atkinson. It's not perfect, and */
+/* probably nobody else agrees with it. Hans-J. Boehm 3/13/92 */
+typedef void (GC_CALLBACK * GC_finalization_proc)(void * /* obj */,
+ void * /* client_data */);
+
+GC_API void GC_CALL GC_register_finalizer(void * /* obj */,
+ GC_finalization_proc /* fn */, void * /* cd */,
+ GC_finalization_proc * /* ofn */, void ** /* ocd */)
+ GC_ATTR_NONNULL(1);
+GC_API void GC_CALL GC_debug_register_finalizer(void * /* obj */,
+ GC_finalization_proc /* fn */, void * /* cd */,
+ GC_finalization_proc * /* ofn */, void ** /* ocd */)
+ GC_ATTR_NONNULL(1);
+ /* When obj is no longer accessible, invoke */
+ /* (*fn)(obj, cd). If a and b are inaccessible, and */
+ /* a points to b (after disappearing links have been */
+ /* made to disappear), then only a will be */
+ /* finalized. (If this does not create any new */
+ /* pointers to b, then b will be finalized after the */
+ /* next collection.) Any finalizable object that */
+ /* is reachable from itself by following one or more */
+ /* pointers will not be finalized (or collected). */
+ /* Thus cycles involving finalizable objects should */
+ /* be avoided, or broken by disappearing links. */
+ /* All but the last finalizer registered for an object */
+ /* is ignored. */
+ /* No-op in the leak-finding mode. */
+ /* Finalization may be removed by passing 0 as fn. */
+ /* Finalizers are implicitly unregistered when they are */
+ /* enqueued for finalization (i.e. become ready to be */
+ /* finalized). */
+ /* The old finalizer and client data are stored in */
+ /* *ofn and *ocd. (ofn and/or ocd may be NULL. */
+ /* The allocation lock is held while *ofn and *ocd are */
+ /* updated. In case of error (no memory to register */
+ /* new finalizer), *ofn and *ocd remain unchanged.) */
+ /* Fn is never invoked on an accessible object, */
+ /* provided hidden pointers are converted to real */
+ /* pointers only if the allocation lock is held, and */
+ /* such conversions are not performed by finalization */
+ /* routines. */
+ /* If GC_register_finalizer is aborted as a result of */
+ /* a signal, the object may be left with no */
+ /* finalization, even if neither the old nor new */
+ /* finalizer were NULL. */
+ /* Obj should be the starting address of an object */
+ /* allocated by GC_malloc or friends. Obj may also be */
+ /* NULL or point to something outside GC heap (in this */
+ /* case, fn is ignored, *ofn and *ocd are set to NULL). */
+ /* Note that any garbage collectible object referenced */
+ /* by cd will be considered accessible until the */
+ /* finalizer is invoked. */
+
+/* Another versions of the above follow. It ignores */
+/* self-cycles, i.e. pointers from a finalizable object to */
+/* itself. There is a stylistic argument that this is wrong, */
+/* but it's unavoidable for C++, since the compiler may */
+/* silently introduce these. It's also benign in that specific */
+/* case. And it helps if finalizable objects are split to */
+/* avoid cycles. */
+/* Note that cd will still be viewed as accessible, even if it */
+/* refers to the object itself. */
+GC_API void GC_CALL GC_register_finalizer_ignore_self(void * /* obj */,
+ GC_finalization_proc /* fn */, void * /* cd */,
+ GC_finalization_proc * /* ofn */, void ** /* ocd */)
+ GC_ATTR_NONNULL(1);
+GC_API void GC_CALL GC_debug_register_finalizer_ignore_self(void * /* obj */,
+ GC_finalization_proc /* fn */, void * /* cd */,
+ GC_finalization_proc * /* ofn */, void ** /* ocd */)
+ GC_ATTR_NONNULL(1);
+
+/* Another version of the above. It ignores all cycles. */
+/* It should probably only be used by Java implementations. */
+/* Note that cd will still be viewed as accessible, even if it */
+/* refers to the object itself. */
+GC_API void GC_CALL GC_register_finalizer_no_order(void * /* obj */,
+ GC_finalization_proc /* fn */, void * /* cd */,
+ GC_finalization_proc * /* ofn */, void ** /* ocd */)
+ GC_ATTR_NONNULL(1);
+GC_API void GC_CALL GC_debug_register_finalizer_no_order(void * /* obj */,
+ GC_finalization_proc /* fn */, void * /* cd */,
+ GC_finalization_proc * /* ofn */, void ** /* ocd */)
+ GC_ATTR_NONNULL(1);
+
+/* This is a special finalizer that is useful when an object's */
+/* finalizer must be run when the object is known to be no */
+/* longer reachable, not even from other finalizable objects. */
+/* It behaves like "normal" finalization, except that the */
+/* finalizer is not run while the object is reachable from */
+/* other objects specifying unordered finalization. */
+/* Effectively it allows an object referenced, possibly */
+/* indirectly, from an unordered finalizable object to override */
+/* the unordered finalization request. */
+/* This can be used in combination with finalizer_no_order so */
+/* as to release resources that must not be released while an */
+/* object can still be brought back to life by other */
+/* finalizers. */
+/* Only works if GC_java_finalization is set. Probably only */
+/* of interest when implementing a language that requires */
+/* unordered finalization (e.g. Java, C#). */
+GC_API void GC_CALL GC_register_finalizer_unreachable(void * /* obj */,
+ GC_finalization_proc /* fn */, void * /* cd */,
+ GC_finalization_proc * /* ofn */, void ** /* ocd */)
+ GC_ATTR_NONNULL(1);
+GC_API void GC_CALL GC_debug_register_finalizer_unreachable(void * /* obj */,
+ GC_finalization_proc /* fn */, void * /* cd */,
+ GC_finalization_proc * /* ofn */, void ** /* ocd */)
+ GC_ATTR_NONNULL(1);
+
+#define GC_NO_MEMORY 2 /* Failure due to lack of memory. */
+
+/* The following routine may be used to break cycles between */
+/* finalizable objects, thus causing cyclic finalizable */
+/* objects to be finalized in the correct order. Standard */
+/* use involves calling GC_register_disappearing_link(&p), */
+/* where p is a pointer that is not followed by finalization */
+/* code, and should not be considered in determining */
+/* finalization order. */
+GC_API int GC_CALL GC_register_disappearing_link(void ** /* link */)
+ GC_ATTR_NONNULL(1);
+ /* Link should point to a field of a heap allocated */
+ /* object obj. *link will be cleared when obj is */
+ /* found to be inaccessible. This happens BEFORE any */
+ /* finalization code is invoked, and BEFORE any */
+ /* decisions about finalization order are made. */
+ /* This is useful in telling the finalizer that */
+ /* some pointers are not essential for proper */
+ /* finalization. This may avoid finalization cycles. */
+ /* Note that obj may be resurrected by another */
+ /* finalizer, and thus the clearing of *link may */
+ /* be visible to non-finalization code. */
+ /* There's an argument that an arbitrary action should */
+ /* be allowed here, instead of just clearing a pointer. */
+ /* But this causes problems if that action alters, or */
+ /* examines connectivity. Returns GC_DUPLICATE if link */
+ /* was already registered, GC_SUCCESS if registration */
+ /* succeeded, GC_NO_MEMORY if it failed for lack of */
+ /* memory, and GC_oom_fn did not handle the problem. */
+ /* Only exists for backward compatibility. See below: */
+
+GC_API int GC_CALL GC_general_register_disappearing_link(void ** /* link */,
+ const void * /* obj */)
+ GC_ATTR_NONNULL(1) GC_ATTR_NONNULL(2);
+ /* A slight generalization of the above. *link is */
+ /* cleared when obj first becomes inaccessible. This */
+ /* can be used to implement weak pointers easily and */
+ /* safely. Typically link will point to a location */
+ /* holding a disguised pointer to obj. (A pointer */
+ /* inside an "atomic" object is effectively disguised.) */
+ /* In this way, weak pointers are broken before any */
+ /* object reachable from them gets finalized. */
+ /* Each link may be registered only with one obj value, */
+ /* i.e. all objects but the last one (link registered */
+ /* with) are ignored. This was added after a long */
+ /* email discussion with John Ellis. */
+ /* link must be non-NULL (and be properly aligned). */
+ /* obj must be a pointer to the first word of an object */
+ /* allocated by GC_malloc or friends. A link */
+ /* disappears when it is unregistered manually, or when */
+ /* (*link) is cleared, or when the object containing */
+ /* this link is garbage collected. It is unsafe to */
+ /* explicitly deallocate the object containing link. */
+ /* Explicit deallocation of obj may or may not cause */
+ /* link to eventually be cleared. */
+ /* No-op in the leak-finding mode. */
+ /* This function can be used to implement certain types */
+ /* of weak pointers. Note, however, this generally */
+ /* requires that the allocation lock is held (see */
+ /* GC_call_with_alloc_lock() below) when the disguised */
+ /* pointer is accessed. Otherwise a strong pointer */
+ /* could be recreated between the time the collector */
+ /* decides to reclaim the object and the link is */
+ /* cleared. Returns GC_SUCCESS if registration */
+ /* succeeded (a new link is registered), GC_DUPLICATE */
+ /* if link was already registered (with some object), */
+ /* GC_NO_MEMORY if registration failed for lack of */
+ /* memory (and GC_oom_fn did not handle the problem), */
+ /* GC_UNIMPLEMENTED if GC_find_leak is true. */
+
+GC_API int GC_CALL GC_move_disappearing_link(void ** /* link */,
+ void ** /* new_link */)
+ GC_ATTR_NONNULL(2);
+ /* Moves a link previously registered via */
+ /* GC_general_register_disappearing_link (or */
+ /* GC_register_disappearing_link). Does not change the */
+ /* target object of the weak reference. Does not */
+ /* change (*new_link) content. May be called with */
+ /* new_link equal to link (to check whether link has */
+ /* been registered). Returns GC_SUCCESS on success, */
+ /* GC_DUPLICATE if there is already another */
+ /* disappearing link at the new location (never */
+ /* returned if new_link is equal to link), GC_NOT_FOUND */
+ /* if no link is registered at the original location. */
+
+GC_API int GC_CALL GC_unregister_disappearing_link(void ** /* link */);
+ /* Undoes a registration by either of the above two */
+ /* routines. Returns 0 if link was not actually */
+ /* registered (otherwise returns 1). */
+
+GC_API int GC_CALL GC_register_long_link(void ** /* link */,
+ const void * /* obj */)
+ GC_ATTR_NONNULL(1) GC_ATTR_NONNULL(2);
+ /* Similar to GC_general_register_disappearing_link but */
+ /* *link only gets cleared when obj becomes truly */
+ /* inaccessible. An object becomes truly inaccessible */
+ /* when it can no longer be resurrected from its */
+ /* finalizer (e.g. by assigning itself to a pointer */
+ /* traceable from root). This can be used to implement */
+ /* long weak pointers easily and safely. */
+
+GC_API int GC_CALL GC_move_long_link(void ** /* link */,
+ void ** /* new_link */)
+ GC_ATTR_NONNULL(2);
+ /* Similar to GC_move_disappearing_link but for a link */
+ /* previously registered via GC_register_long_link. */
+
+GC_API int GC_CALL GC_unregister_long_link(void ** /* link */);
+ /* Similar to GC_unregister_disappearing_link but for a */
+ /* registration by either of the above two routines. */
+
+/* Support of toggle-ref style of external memory management */
+/* without hooking up to the host retain/release machinery. */
+/* The idea of toggle-ref is that an external reference to */
+/* an object is kept and it can be either a strong or weak */
+/* reference; a weak reference is used when the external peer */
+/* has no interest in the object, and a strong otherwise. */
+typedef enum {
+ GC_TOGGLE_REF_DROP,
+ GC_TOGGLE_REF_STRONG,
+ GC_TOGGLE_REF_WEAK
+} GC_ToggleRefStatus;
+
+/* The callback is to decide (return) the new state of a given */
+/* object. Invoked by the collector for all objects registered */
+/* for toggle-ref processing. Invoked with the allocation lock */
+/* held (but the "world" is running). */
+typedef GC_ToggleRefStatus (GC_CALLBACK *GC_toggleref_func)(void * /* obj */);
+
+/* Set (register) a callback that decides the state of a given */
+/* object (by, probably, inspecting its native state). */
+/* The argument may be 0 (means no callback). Both the setter */
+/* and the getter acquire the allocation lock (to avoid data */
+/* races). */
+GC_API void GC_CALL GC_set_toggleref_func(GC_toggleref_func);
+GC_API GC_toggleref_func GC_CALL GC_get_toggleref_func(void);
+
+/* Register a given object for toggle-ref processing. It will */
+/* be stored internally and the toggle-ref callback will be */
+/* invoked on the object until the callback returns */
+/* GC_TOGGLE_REF_DROP or the object is collected. If is_strong */
+/* is true then the object is registered with a strong ref, */
+/* a weak one otherwise. Returns GC_SUCCESS if registration */
+/* succeeded (or no callback registered yet), GC_NO_MEMORY if */
+/* it failed for lack of memory. */
+GC_API int GC_CALL GC_toggleref_add(void * /* obj */, int /* is_strong */)
+ GC_ATTR_NONNULL(1);
+
+/* Finalizer callback support. Invoked by the collector (with */
+/* the allocation lock held) for each unreachable object */
+/* enqueued for finalization. */
+typedef void (GC_CALLBACK * GC_await_finalize_proc)(void * /* obj */);
+GC_API void GC_CALL GC_set_await_finalize_proc(GC_await_finalize_proc);
+GC_API GC_await_finalize_proc GC_CALL GC_get_await_finalize_proc(void);
+ /* Zero means no callback. The setter */
+ /* and getter acquire the lock too. */
+
+/* Returns !=0 if GC_invoke_finalizers has something to do. */
+/* Does not use any synchronization. */
+GC_API int GC_CALL GC_should_invoke_finalizers(void);
+
+GC_API int GC_CALL GC_invoke_finalizers(void);
+ /* Run finalizers for all objects that are ready to */
+ /* be finalized. Return the number of finalizers */
+ /* that were run. Normally this is also called */
+ /* implicitly during some allocations. If */
+ /* GC_finalize_on_demand is nonzero, it must be called */
+ /* explicitly. */
+
+/* Explicitly tell the collector that an object is reachable */
+/* at a particular program point. This prevents the argument */
+/* pointer from being optimized away, even it is otherwise no */
+/* longer needed. It should have no visible effect in the */
+/* absence of finalizers or disappearing links. But it may be */
+/* needed to prevent finalizers from running while the */
+/* associated external resource is still in use. */
+/* The function is sometimes called keep_alive in other */
+/* settings. */
+#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
+# if defined(__e2k__)
+# define GC_reachable_here(ptr) \
+ __asm__ __volatile__ (" " : : "r"(ptr) : "memory")
+# else
+# define GC_reachable_here(ptr) \
+ __asm__ __volatile__ (" " : : "X"(ptr) : "memory")
+# endif
+#else
+ GC_API void GC_CALL GC_noop1(GC_word);
+# ifdef LINT2
+# define GC_reachable_here(ptr) GC_noop1(~(GC_word)(ptr)^(~(GC_word)0))
+ /* The expression matches the one of COVERT_DATAFLOW(). */
+# else
+# define GC_reachable_here(ptr) GC_noop1((GC_word)(ptr))
+# endif
+#endif
+
+/* GC_set_warn_proc can be used to redirect or filter warning messages. */
+/* p may not be a NULL pointer. msg is printf format string (arg must */
+/* match the format). Both the setter and the getter acquire the GC */
+/* lock (to avoid data races). In GC v7.1 (and before), the setter */
+/* returned the old warn_proc value. */
+typedef void (GC_CALLBACK * GC_warn_proc)(char * /* msg */,
+ GC_word /* arg */);
+GC_API void GC_CALL GC_set_warn_proc(GC_warn_proc /* p */) GC_ATTR_NONNULL(1);
+/* GC_get_warn_proc returns the current warn_proc. */
+GC_API GC_warn_proc GC_CALL GC_get_warn_proc(void);
+
+/* GC_ignore_warn_proc may be used as an argument for GC_set_warn_proc */
+/* to suppress all warnings (unless statistics printing is turned on). */
+GC_API void GC_CALLBACK GC_ignore_warn_proc(char *, GC_word);
+
+/* Change file descriptor of GC log. Unavailable on some targets. */
+GC_API void GC_CALL GC_set_log_fd(int);
+
+/* abort_func is invoked on GC fatal aborts (just before OS-dependent */
+/* abort or exit(1) is called). Must be non-NULL. The default one */
+/* outputs msg to stderr provided msg is non-NULL. msg is NULL if */
+/* invoked before exit(1) otherwise msg is non-NULL (i.e., if invoked */
+/* before abort). Both the setter and getter acquire the GC lock. */
+/* Both the setter and getter are defined only if the library has been */
+/* compiled without SMALL_CONFIG. */
+typedef void (GC_CALLBACK * GC_abort_func)(const char * /* msg */);
+GC_API void GC_CALL GC_set_abort_func(GC_abort_func) GC_ATTR_NONNULL(1);
+GC_API GC_abort_func GC_CALL GC_get_abort_func(void);
+
+/* A portable way to abort the application because of not enough memory.*/
+GC_API void GC_CALL GC_abort_on_oom(void);
+
+/* The following is intended to be used by a higher level */
+/* (e.g. Java-like) finalization facility. It is expected */
+/* that finalization code will arrange for hidden pointers to */
+/* disappear. Otherwise objects can be accessed after they */
+/* have been collected. */
+/* Should not be used in the leak-finding mode. */
+/* Note that putting pointers in atomic objects or in */
+/* non-pointer slots of "typed" objects is equivalent to */
+/* disguising them in this way, and may have other advantages. */
+typedef GC_word GC_hidden_pointer;
+#define GC_HIDE_POINTER(p) (~(GC_hidden_pointer)(p))
+/* Converting a hidden pointer to a real pointer requires verifying */
+/* that the object still exists. This involves acquiring the */
+/* allocator lock to avoid a race with the collector. */
+#define GC_REVEAL_POINTER(p) ((void *)GC_HIDE_POINTER(p))
+
+#if defined(I_HIDE_POINTERS) || defined(GC_I_HIDE_POINTERS)
+ /* This exists only for compatibility (the GC-prefixed symbols are */
+ /* preferred for new code). */
+# define HIDE_POINTER(p) GC_HIDE_POINTER(p)
+# define REVEAL_POINTER(p) GC_REVEAL_POINTER(p)
+#endif
+
+/* The routines to acquire/release the allocator lock. */
+/* The lock is not reentrant. GC_alloc_unlock() should not be called */
+/* unless the lock is acquired by the current thread. */
+#ifdef GC_THREADS
+ GC_API void GC_CALL GC_alloc_lock(void);
+ GC_API void GC_CALL GC_alloc_unlock(void);
+#else
+ /* No need for real locking if the client is single-threaded. */
+# define GC_alloc_lock() (void)0
+# define GC_alloc_unlock() (void)0
+#endif /* !GC_THREADS */
+
+typedef void * (GC_CALLBACK * GC_fn_type)(void * /* client_data */);
+GC_API void * GC_CALL GC_call_with_alloc_lock(GC_fn_type /* fn */,
+ void * /* client_data */) GC_ATTR_NONNULL(1);
+
+/* These routines are intended to explicitly notify the collector */
+/* of new threads. Often this is unnecessary because thread creation */
+/* is implicitly intercepted by the collector, using header-file */
+/* defines, or linker-based interception. In the long run the intent */
+/* is to always make redundant registration safe. In the short run, */
+/* this is being implemented a platform at a time. */
+/* The interface is complicated by the fact that we probably will not */
+/* ever be able to automatically determine the stack bottom for thread */
+/* stacks on all platforms. */
+
+/* Structure representing the bottom (cold end) of a thread stack. */
+/* On most platforms this contains just a single address. */
+struct GC_stack_base {
+ void * mem_base; /* the bottom of the general-purpose stack */
+# if defined(__e2k__) \
+ || defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
+ void * reg_base; /* the bottom of the register stack */
+# endif
+};
+
+typedef void * (GC_CALLBACK * GC_stack_base_func)(
+ struct GC_stack_base * /* sb */, void * /* arg */);
+
+/* Call a function with a stack base structure corresponding to */
+/* somewhere in the GC_call_with_stack_base frame. This often can */
+/* be used to provide a sufficiently accurate stack bottom. And we */
+/* implement it everywhere. */
+GC_API void * GC_CALL GC_call_with_stack_base(GC_stack_base_func /* fn */,
+ void * /* arg */) GC_ATTR_NONNULL(1);
+
+#define GC_SUCCESS 0
+#define GC_DUPLICATE 1 /* Was already registered. */
+#define GC_NO_THREADS 2 /* No thread support in GC. */
+ /* GC_NO_THREADS is not returned by any GC function anymore. */
+#define GC_UNIMPLEMENTED 3 /* Not yet implemented on this platform. */
+#define GC_NOT_FOUND 4 /* Requested link not found (returned */
+ /* by GC_move_disappearing_link). */
+
+/* Start the parallel marker threads, if available. Useful, e.g., */
+/* after POSIX fork in a child process (provided not followed by exec) */
+/* or in single-threaded clients (provided it is OK for the client to */
+/* perform marking in parallel). Acquires the GC lock to avoid a race. */
+GC_API void GC_CALL GC_start_mark_threads(void);
+
+#if defined(GC_DARWIN_THREADS) || defined(GC_WIN32_THREADS)
+ /* Use implicit thread registration and processing (via Win32 DllMain */
+ /* or Darwin task_threads). Deprecated. Must be called before */
+ /* GC_INIT() and other GC routines. Should be avoided if */
+ /* GC_pthread_create, GC_beginthreadex (or GC_CreateThread) could be */
+ /* called instead. Disables parallelized GC on Win32. */
+ GC_API void GC_CALL GC_use_threads_discovery(void);
+#endif
+
+#ifdef GC_THREADS
+ /* Suggest the GC to use the specific signal to suspend threads. */
+ /* Has no effect after GC_init and on non-POSIX systems. */
+ GC_API void GC_CALL GC_set_suspend_signal(int);
+
+ /* Suggest the GC to use the specific signal to resume threads. */
+ /* Has no effect after GC_init and on non-POSIX systems. */
+ GC_API void GC_CALL GC_set_thr_restart_signal(int);
+
+ /* Return the signal number (constant after initialization) used by */
+ /* the GC to suspend threads on POSIX systems. Return -1 otherwise. */
+ GC_API int GC_CALL GC_get_suspend_signal(void);
+
+ /* Return the signal number (constant after initialization) used by */
+ /* the garbage collector to restart (resume) threads on POSIX */
+ /* systems. Return -1 otherwise. */
+ GC_API int GC_CALL GC_get_thr_restart_signal(void);
+
+ /* Explicitly enable GC_register_my_thread() invocation. */
+ /* Done implicitly if a GC thread-creation function is called (or */
+ /* implicit thread registration is activated, or the collector is */
+ /* compiled with GC_ALWAYS_MULTITHREADED defined). Otherwise, it */
+ /* must be called from the main (or any previously registered) thread */
+ /* between the collector initialization and the first explicit */
+ /* registering of a thread (it should be called as late as possible). */
+ /* Includes a GC_start_mark_threads() call. */
+ GC_API void GC_CALL GC_allow_register_threads(void);
+
+ /* Register the current thread, with the indicated stack bottom, as */
+ /* a new thread whose stack(s) should be traced by the GC. If it */
+ /* is not implicitly called by the GC, this must be called before a */
+ /* thread can allocate garbage collected memory, or assign pointers */
+ /* to the garbage collected heap. Once registered, a thread will be */
+ /* stopped during garbage collections. */
+ /* This call must be previously enabled (see above). */
+ /* This should never be called from the main thread, where it is */
+ /* always done implicitly. This is normally done implicitly if GC_ */
+ /* functions are called to create the thread, e.g. by including gc.h */
+ /* (which redefines some system functions) before calling the system */
+ /* thread creation function. Nonetheless, thread cleanup routines */
+ /* (e.g., pthread key destructor) typically require manual thread */
+ /* registering (and unregistering) if pointers to GC-allocated */
+ /* objects are manipulated inside. */
+ /* It is also always done implicitly on some platforms if */
+ /* GC_use_threads_discovery() is called at start-up. Except for the */
+ /* latter case, the explicit call is normally required for threads */
+ /* created by third-party libraries. */
+ /* A manually registered thread requires manual unregistering. */
+ /* Returns GC_SUCCESS on success, GC_DUPLICATE if already registered. */
+ GC_API int GC_CALL GC_register_my_thread(const struct GC_stack_base *)
+ GC_ATTR_NONNULL(1);
+
+ /* Return non-zero (TRUE) if and only if the calling thread is */
+ /* registered with the garbage collector. */
+ /* If the thread is finished (e.g. running in a destructor and not */
+ /* registered manually again), it is considered as not registered. */
+ GC_API int GC_CALL GC_thread_is_registered(void);
+
+ /* Notify the collector about the stack and the alt-stack of the */
+ /* current thread. stack_start/size is used to determine the stack */
+ /* boundaries when a thread is suspended while it is on an alt-stack. */
+ GC_API void GC_CALL GC_register_altstack(void * /* stack_start */,
+ GC_word /* stack_size */,
+ void * /* altstack_base */,
+ GC_word /* altstack_size */);
+
+ /* Unregister the current thread. Only an explicitly registered */
+ /* thread (i.e. for which GC_register_my_thread() returns GC_SUCCESS) */
+ /* is allowed (and required) to call this function. (As a special */
+ /* exception, it is also allowed to once unregister the main thread.) */
+ /* The thread may no longer allocate garbage collected memory or */
+ /* manipulate pointers to the garbage collected heap after making */
+ /* this call. Specifically, if it wants to return or otherwise */
+ /* communicate a pointer to the garbage-collected heap to another */
+ /* thread, it must do this before calling GC_unregister_my_thread, */
+ /* most probably by saving it in a global data structure. Must not */
+ /* be called inside a GC callback function (except for */
+ /* GC_call_with_stack_base() one). */
+ GC_API int GC_CALL GC_unregister_my_thread(void);
+
+ /* Stop/start the world explicitly. Not recommended for general use. */
+ GC_API void GC_CALL GC_stop_world_external(void);
+ GC_API void GC_CALL GC_start_world_external(void);
+
+ /* Provide a verifier/modifier of the stack pointer when pushing the */
+ /* thread stacks. This might be useful for a crude integration */
+ /* with certain coroutine implementations. (*sp_ptr) is the captured */
+ /* stack pointer of the suspended thread with pthread_id (the latter */
+ /* is actually of pthread_t type). The functionality is unsupported */
+ /* on some targets (the getter always returns 0 in such a case). */
+ /* Both the setter and the getter acquire the GC lock. The client */
+ /* function (if provided) is called with the GC lock acquired, and */
+ /* might be with the world stopped. */
+ typedef void (GC_CALLBACK * GC_sp_corrector_proc)(void ** /* sp_ptr */,
+ void * /* pthread_id */);
+ GC_API void GC_CALL GC_set_sp_corrector(GC_sp_corrector_proc);
+ GC_API GC_sp_corrector_proc GC_CALL GC_get_sp_corrector(void);
+#endif /* GC_THREADS */
+
+/* Wrapper for functions that are likely to block (or, at least, do not */
+/* allocate garbage collected memory and/or manipulate pointers to the */
+/* garbage collected heap) for an appreciable length of time. While fn */
+/* is running, the collector is said to be in the "inactive" state for */
+/* the current thread (this means that the thread is not suspended and */
+/* the thread's stack frames "belonging" to the functions in the */
+/* "inactive" state are not scanned during garbage collections). It is */
+/* assumed that the collector is already initialized and the current */
+/* thread is registered. It is allowed for fn to call */
+/* GC_call_with_gc_active() (even recursively), thus temporarily */
+/* toggling the collector's state back to "active". The latter */
+/* technique might be used to make stack scanning more precise (i.e. */
+/* scan only stack frames of functions that allocate garbage collected */
+/* memory and/or manipulate pointers to the garbage collected heap). */
+GC_API void * GC_CALL GC_do_blocking(GC_fn_type /* fn */,
+ void * /* client_data */) GC_ATTR_NONNULL(1);
+
+/* Call a function switching to the "active" state of the collector for */
+/* the current thread (i.e. the user function is allowed to call any */
+/* GC function and/or manipulate pointers to the garbage collected */
+/* heap). GC_call_with_gc_active() has the functionality opposite to */
+/* GC_do_blocking() one. It is assumed that the collector is already */
+/* initialized and the current thread is registered. fn may toggle */
+/* the collector thread's state temporarily to "inactive" one by using */
+/* GC_do_blocking. GC_call_with_gc_active() often can be used to */
+/* provide a sufficiently accurate stack bottom. */
+GC_API void * GC_CALL GC_call_with_gc_active(GC_fn_type /* fn */,
+ void * /* client_data */) GC_ATTR_NONNULL(1);
+
+/* Attempt to fill in the GC_stack_base structure with the stack bottom */
+/* for this thread. This appears to be required to implement anything */
+/* like the JNI AttachCurrentThread in an environment in which new */
+/* threads are not automatically registered with the collector. */
+/* It is also unfortunately hard to implement well on many platforms. */
+/* Returns GC_SUCCESS or GC_UNIMPLEMENTED. This function acquires the */
+/* GC lock on some platforms. */
+GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *)
+ GC_ATTR_NONNULL(1);
+
+/* Fill in the GC_stack_base structure with the cold end (bottom) of */
+/* the stack of the current thread (or coroutine). */
+/* Unlike GC_get_stack_base, it retrieves the value stored in the */
+/* collector (which is initially set by the collector upon the thread */
+/* is started or registered manually but it could be later updated by */
+/* client using GC_set_stackbottom). Returns the GC-internal non-NULL */
+/* handle of the thread which could be passed to GC_set_stackbottom */
+/* later. It is assumed that the collector is already initialized and */
+/* the thread is registered. Acquires the GC lock to avoid data races. */
+GC_API void * GC_CALL GC_get_my_stackbottom(struct GC_stack_base *)
+ GC_ATTR_NONNULL(1);
+
+/* Set the cool end of the user (coroutine) stack of the specified */
+/* thread. The GC thread handle is either the one returned by */
+/* GC_get_my_stackbottom or NULL (the latter designates the current */
+/* thread). The caller should hold the GC lock (e.g. using */
+/* GC_call_with_alloc_lock). Also, the function could be used for */
+/* setting GC_stackbottom value (the bottom of the primordial thread) */
+/* before the collector is initialized (the GC lock is not needed to be */
+/* acquired in this case). */
+GC_API void GC_CALL GC_set_stackbottom(void * /* gc_thread_handle */,
+ const struct GC_stack_base *)
+ GC_ATTR_NONNULL(2);
+
+/* The following routines are primarily intended for use with a */
+/* preprocessor which inserts calls to check C pointer arithmetic. */
+/* They indicate failure by invoking the corresponding _print_proc. */
+
+/* Check that p and q point to the same object. */
+/* Fail conspicuously if they don't. */
+/* Returns the first argument. */
+/* Succeeds if neither p nor q points to the heap. */
+/* May succeed if both p and q point to between heap objects. */
+GC_API void * GC_CALL GC_same_obj(void * /* p */, void * /* q */);
+
+/* Checked pointer pre- and post- increment operations. Note that */
+/* the second argument is in units of bytes, not multiples of the */
+/* object size. This should either be invoked from a macro, or the */
+/* call should be automatically generated. */
+GC_API void * GC_CALL GC_pre_incr(void **, ptrdiff_t /* how_much */)
+ GC_ATTR_NONNULL(1);
+GC_API void * GC_CALL GC_post_incr(void **, ptrdiff_t /* how_much */)
+ GC_ATTR_NONNULL(1);
+
+/* Check that p is visible */
+/* to the collector as a possibly pointer containing location. */
+/* If it isn't fail conspicuously. */
+/* Returns the argument in all cases. May erroneously succeed */
+/* in hard cases. (This is intended for debugging use with */
+/* untyped allocations. The idea is that it should be possible, though */
+/* slow, to add such a call to all indirect pointer stores.) */
+/* Currently useless for multi-threaded worlds. */
+GC_API void * GC_CALL GC_is_visible(void * /* p */);
+
+/* Check that if p is a pointer to a heap page, then it points to */
+/* a valid displacement within a heap object. */
+/* Fail conspicuously if this property does not hold. */
+/* Uninteresting with GC_all_interior_pointers. */
+/* Always returns its argument. */
+GC_API void * GC_CALL GC_is_valid_displacement(void * /* p */);
+
+/* Explicitly dump the GC state. This is most often called from the */
+/* debugger, or by setting the GC_DUMP_REGULARLY environment variable, */
+/* but it may be useful to call it from client code during debugging. */
+/* The current collection number is printed in the header of the dump. */
+/* Acquires the GC lock to avoid data races. */
+/* Defined only if the library has been compiled without NO_DEBUGGING. */
+GC_API void GC_CALL GC_dump(void);
+
+/* The same as GC_dump but allows to specify the name of dump and does */
+/* not acquire the lock. If name is non-NULL, it is printed to help */
+/* identifying individual dumps. Otherwise the current collection */
+/* number is used as the name. */
+/* Defined only if the library has been compiled without NO_DEBUGGING. */
+GC_API void GC_CALL GC_dump_named(const char * /* name */);
+
+/* Dump information about each block of every GC memory section. */
+/* Defined only if the library has been compiled without NO_DEBUGGING. */
+GC_API void GC_CALL GC_dump_regions(void);
+
+/* Dump information about every registered disappearing link and */
+/* finalizable object. */
+/* Defined only if the library has been compiled without NO_DEBUGGING. */
+GC_API void GC_CALL GC_dump_finalization(void);
+
+/* Safer, but slow, pointer addition. Probably useful mainly with */
+/* a preprocessor. Useful only for heap pointers. */
+/* Only the macros without trailing digits are meant to be used */
+/* by clients. These are designed to model the available C pointer */
+/* arithmetic expressions. */
+/* Even then, these are probably more useful as */
+/* documentation than as part of the API. */
+/* Note that GC_PTR_ADD evaluates the first argument more than once. */
+#if defined(GC_DEBUG) && defined(__GNUC__)
+# define GC_PTR_ADD3(x, n, type_of_result) \
+ ((type_of_result)GC_same_obj((x)+(n), (x)))
+# define GC_PRE_INCR3(x, n, type_of_result) \
+ ((type_of_result)GC_pre_incr((void **)(&(x)), (n)*sizeof(*x)))
+# define GC_POST_INCR3(x, n, type_of_result) \
+ ((type_of_result)GC_post_incr((void **)(&(x)), (n)*sizeof(*x)))
+# define GC_PTR_ADD(x, n) GC_PTR_ADD3(x, n, __typeof__(x))
+# define GC_PRE_INCR(x, n) GC_PRE_INCR3(x, n, __typeof__(x))
+# define GC_POST_INCR(x) GC_POST_INCR3(x, 1, __typeof__(x))
+# define GC_POST_DECR(x) GC_POST_INCR3(x, -1, __typeof__(x))
+#else /* !GC_DEBUG || !__GNUC__ */
+ /* We can't do this right without typeof, which ANSI decided was not */
+ /* sufficiently useful. Without it we resort to the non-debug version. */
+ /* TODO: This should eventually support C++0x decltype. */
+# define GC_PTR_ADD(x, n) ((x)+(n))
+# define GC_PRE_INCR(x, n) ((x) += (n))
+# define GC_POST_INCR(x) ((x)++)
+# define GC_POST_DECR(x) ((x)--)
+#endif /* !GC_DEBUG || !__GNUC__ */
+
+/* Safer assignment of a pointer to a non-stack location. */
+#ifdef GC_DEBUG
+# define GC_PTR_STORE(p, q) \
+ (*(void **)GC_is_visible((void *)(p)) = \
+ GC_is_valid_displacement((void *)(q)))
+#else
+# define GC_PTR_STORE(p, q) (*(void **)(p) = (void *)(q))
+#endif
+
+/* GC_PTR_STORE_AND_DIRTY(p,q) is equivalent to GC_PTR_STORE(p,q) */
+/* followed by GC_END_STUBBORN_CHANGE(p) and GC_reachable_here(q) */
+/* (assuming p and q do not have side effects). */
+GC_API void GC_CALL GC_ptr_store_and_dirty(void * /* p */,
+ const void * /* q */);
+GC_API void GC_CALL GC_debug_ptr_store_and_dirty(void * /* p */,
+ const void * /* q */);
+
+/* Functions called to report pointer checking errors */
+GC_API void (GC_CALLBACK * GC_same_obj_print_proc)(void * /* p */,
+ void * /* q */);
+GC_API void (GC_CALLBACK * GC_is_valid_displacement_print_proc)(void *);
+GC_API void (GC_CALLBACK * GC_is_visible_print_proc)(void *);
+
+#ifdef GC_PTHREADS
+ /* For pthread support, we generally need to intercept a number of */
+ /* thread library calls. We do that here by macro defining them. */
+# ifdef __cplusplus
+ } /* extern "C" */
+# endif
+# include "gc_pthread_redirects.h"
+# ifdef __cplusplus
+ extern "C" {
+# endif
+#endif
+
+/* This returns a list of objects, linked through their first word. */
+/* Its use can greatly reduce lock contention problems, since the */
+/* allocation lock can be acquired and released many fewer times. */
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_many(size_t /* lb */);
+#define GC_NEXT(p) (*(void * *)(p)) /* Retrieve the next element */
+ /* in returned list. */
+
+/* A filter function to control the scanning of dynamic libraries. */
+/* If implemented, called by GC before registering a dynamic library */
+/* (discovered by GC) section as a static data root (called only as */
+/* a last reason not to register). The filename of the library, the */
+/* address and the length of the memory region (section) are passed. */
+/* This routine should return nonzero if that region should be scanned. */
+/* Always called with the allocation lock held. Depending on the */
+/* platform, might be called with the "world" stopped. */
+typedef int (GC_CALLBACK * GC_has_static_roots_func)(
+ const char * /* dlpi_name */,
+ void * /* section_start */,
+ size_t /* section_size */);
+
+/* Register a new callback (a user-supplied filter) to control the */
+/* scanning of dynamic libraries. Replaces any previously registered */
+/* callback. May be 0 (means no filtering). May be unused on some */
+/* platforms (if the filtering is unimplemented or inappropriate). */
+GC_API void GC_CALL GC_register_has_static_roots_callback(
+ GC_has_static_roots_func);
+
+#if !defined(CPPCHECK) && !defined(GC_WINDOWS_H_INCLUDED) && defined(WINAPI)
+ /* windows.h is included before gc.h */
+# define GC_WINDOWS_H_INCLUDED
+#endif
+
+#if defined(GC_WIN32_THREADS) \
+ && (!defined(GC_PTHREADS) || defined(GC_BUILD) \
+ || defined(GC_WINDOWS_H_INCLUDED))
+ /* Note: for Cygwin and pthreads-win32, this is skipped */
+ /* unless windows.h is included before gc.h. */
+
+# if (!defined(GC_NO_THREAD_DECLS) || defined(GC_BUILD)) \
+ && !defined(GC_DONT_INCL_WINDOWS_H)
+
+# ifdef __cplusplus
+ } /* Including windows.h in an extern "C" context no longer works. */
+# endif
+
+# if !defined(_WIN32_WCE) && !defined(__CEGCC__)
+# include <process.h> /* For _beginthreadex, _endthreadex */
+# endif
+
+# if defined(GC_BUILD) || !defined(GC_DONT_INCLUDE_WINDOWS_H)
+# include <windows.h>
+# define GC_WINDOWS_H_INCLUDED
+# endif
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+
+# ifdef GC_UNDERSCORE_STDCALL
+ /* Explicitly prefix exported/imported WINAPI (__stdcall) symbols */
+ /* with '_' (underscore). Might be useful if MinGW/x86 is used. */
+# define GC_CreateThread _GC_CreateThread
+# define GC_ExitThread _GC_ExitThread
+# endif
+
+# ifndef DECLSPEC_NORETURN
+ /* Typically defined in winnt.h. */
+# ifdef GC_WINDOWS_H_INCLUDED
+# define DECLSPEC_NORETURN /* empty */
+# else
+# define DECLSPEC_NORETURN __declspec(noreturn)
+# endif
+# endif
+
+# if !defined(_UINTPTR_T) && !defined(_UINTPTR_T_DEFINED) \
+ && !defined(UINTPTR_MAX)
+ typedef GC_word GC_uintptr_t;
+# else
+ typedef uintptr_t GC_uintptr_t;
+# endif
+
+# ifdef _WIN64
+# define GC_WIN32_SIZE_T GC_uintptr_t
+# elif defined(GC_WINDOWS_H_INCLUDED)
+# define GC_WIN32_SIZE_T DWORD
+# else
+# define GC_WIN32_SIZE_T unsigned long
+# endif
+
+# ifdef GC_INSIDE_DLL
+ /* Export GC DllMain to be invoked from client DllMain. */
+# ifdef GC_UNDERSCORE_STDCALL
+# define GC_DllMain _GC_DllMain
+# endif
+# ifdef GC_WINDOWS_H_INCLUDED
+ GC_API BOOL WINAPI GC_DllMain(HINSTANCE /* inst */,
+ ULONG /* reason */,
+ LPVOID /* reserved */);
+# else
+ GC_API int __stdcall GC_DllMain(void *, unsigned long, void *);
+# endif
+# endif /* GC_INSIDE_DLL */
+
+ /* All threads must be created using GC_CreateThread or */
+ /* GC_beginthreadex, or must explicitly call GC_register_my_thread */
+ /* (and call GC_unregister_my_thread before thread termination), so */
+ /* that they will be recorded in the thread table. For backward */
+ /* compatibility, it is possible to build the GC with GC_DLL */
+ /* defined, and to call GC_use_threads_discovery. This implicitly */
+ /* registers all created threads, but appears to be less robust. */
+ /* Currently the collector expects all threads to fall through and */
+ /* terminate normally, or call GC_endthreadex() or GC_ExitThread, */
+ /* so that the thread is properly unregistered. */
+# ifdef GC_WINDOWS_H_INCLUDED
+ GC_API HANDLE WINAPI GC_CreateThread(
+ LPSECURITY_ATTRIBUTES /* lpThreadAttributes */,
+ GC_WIN32_SIZE_T /* dwStackSize */,
+ LPTHREAD_START_ROUTINE /* lpStartAddress */,
+ LPVOID /* lpParameter */, DWORD /* dwCreationFlags */,
+ LPDWORD /* lpThreadId */);
+
+ GC_API DECLSPEC_NORETURN void WINAPI GC_ExitThread(
+ DWORD /* dwExitCode */);
+# else
+ struct _SECURITY_ATTRIBUTES;
+ GC_API void *__stdcall GC_CreateThread(struct _SECURITY_ATTRIBUTES *,
+ GC_WIN32_SIZE_T,
+ unsigned long (__stdcall *)(void *),
+ void *, unsigned long, unsigned long *);
+ GC_API DECLSPEC_NORETURN void __stdcall GC_ExitThread(unsigned long);
+# endif
+
+# if !defined(_WIN32_WCE) && !defined(__CEGCC__)
+ GC_API GC_uintptr_t GC_CALL GC_beginthreadex(
+ void * /* security */, unsigned /* stack_size */,
+ unsigned (__stdcall *)(void *),
+ void * /* arglist */, unsigned /* initflag */,
+ unsigned * /* thrdaddr */);
+
+ /* Note: _endthreadex() is not currently marked as no-return in */
+ /* VC++ and MinGW headers, so we don't mark it neither. */
+ GC_API void GC_CALL GC_endthreadex(unsigned /* retval */);
+# endif /* !_WIN32_WCE */
+
+# endif /* !GC_NO_THREAD_DECLS */
+
+# ifdef GC_WINMAIN_REDIRECT
+ /* win32_threads.c implements the real WinMain(), which will start */
+ /* a new thread to call GC_WinMain() after initializing the garbage */
+ /* collector. */
+# define WinMain GC_WinMain
+# endif
+
+ /* For compatibility only. */
+# define GC_use_DllMain GC_use_threads_discovery
+
+# ifndef GC_NO_THREAD_REDIRECTS
+# define CreateThread GC_CreateThread
+# define ExitThread GC_ExitThread
+# undef _beginthreadex
+# define _beginthreadex GC_beginthreadex
+# undef _endthreadex
+# define _endthreadex GC_endthreadex
+/* #define _beginthread { > "Please use _beginthreadex instead of _beginthread" < } */
+# endif /* !GC_NO_THREAD_REDIRECTS */
+
+#endif /* GC_WIN32_THREADS */
+
+/* Public setter and getter for switching "unmap as much as possible" */
+/* mode on(1) and off(0). Has no effect unless unmapping is turned on. */
+/* Has no effect on implicitly-initiated garbage collections. Initial */
+/* value is controlled by GC_FORCE_UNMAP_ON_GCOLLECT. The setter and */
+/* getter are unsynchronized. */
+GC_API void GC_CALL GC_set_force_unmap_on_gcollect(int);
+GC_API int GC_CALL GC_get_force_unmap_on_gcollect(void);
+
+/* Fully portable code should call GC_INIT() from the main program */
+/* before making any other GC_ calls. On most platforms this is a */
+/* no-op and the collector self-initializes. But a number of */
+/* platforms make that too hard. */
+/* A GC_INIT call is required if the collector is built with */
+/* THREAD_LOCAL_ALLOC defined and the initial allocation call is not */
+/* to GC_malloc() or GC_malloc_atomic(). */
+
+#if defined(__CYGWIN32__) || defined(__CYGWIN__)
+ /* Similarly gnu-win32 DLLs need explicit initialization from the */
+ /* main program, as does AIX. */
+# ifdef __x86_64__
+ /* Cygwin/x64 does not add leading underscore to symbols anymore. */
+ extern int __data_start__[], __data_end__[];
+ extern int __bss_start__[], __bss_end__[];
+# define GC_DATASTART ((GC_word)__data_start__ < (GC_word)__bss_start__ \
+ ? (void *)__data_start__ : (void *)__bss_start__)
+# define GC_DATAEND ((GC_word)__data_end__ > (GC_word)__bss_end__ \
+ ? (void *)__data_end__ : (void *)__bss_end__)
+# else
+ extern int _data_start__[], _data_end__[], _bss_start__[], _bss_end__[];
+# define GC_DATASTART ((GC_word)_data_start__ < (GC_word)_bss_start__ \
+ ? (void *)_data_start__ : (void *)_bss_start__)
+# define GC_DATAEND ((GC_word)_data_end__ > (GC_word)_bss_end__ \
+ ? (void *)_data_end__ : (void *)_bss_end__)
+# endif /* !__x86_64__ */
+# define GC_INIT_CONF_ROOTS GC_add_roots(GC_DATASTART, GC_DATAEND); \
+ GC_gcollect() /* For blacklisting. */
+ /* Required at least if GC is in a DLL. And doesn't hurt. */
+#elif defined(_AIX)
+ extern int _data[], _end[];
+# define GC_DATASTART ((void *)_data)
+# define GC_DATAEND ((void *)_end)
+# define GC_INIT_CONF_ROOTS GC_add_roots(GC_DATASTART, GC_DATAEND)
+#elif (defined(HOST_ANDROID) || defined(__ANDROID__)) \
+ && defined(IGNORE_DYNAMIC_LOADING)
+ /* This is ugly but seems the only way to register data roots of the */
+ /* client shared library if the GC dynamic loading support is off. */
+# pragma weak __dso_handle
+ extern int __dso_handle[];
+ GC_API void * GC_CALL GC_find_limit(void * /* start */, int /* up */);
+# define GC_INIT_CONF_ROOTS (void)(__dso_handle != 0 \
+ ? (GC_add_roots(__dso_handle, \
+ GC_find_limit(__dso_handle, \
+ 1 /*up*/)), 0) : 0)
+#else
+# define GC_INIT_CONF_ROOTS /* empty */
+#endif
+
+#ifdef GC_DONT_EXPAND
+ /* Set GC_dont_expand to TRUE at start-up */
+# define GC_INIT_CONF_DONT_EXPAND GC_set_dont_expand(1)
+#else
+# define GC_INIT_CONF_DONT_EXPAND /* empty */
+#endif
+
+#ifdef GC_FORCE_UNMAP_ON_GCOLLECT
+ /* Turn on "unmap as much as possible on explicit GC" mode at start-up */
+# define GC_INIT_CONF_FORCE_UNMAP_ON_GCOLLECT \
+ GC_set_force_unmap_on_gcollect(1)
+#else
+# define GC_INIT_CONF_FORCE_UNMAP_ON_GCOLLECT /* empty */
+#endif
+
+#ifdef GC_DONT_GC
+ /* This is for debugging only (useful if environment variables are */
+ /* unsupported); cannot call GC_disable as goes before GC_init. */
+# define GC_INIT_CONF_MAX_RETRIES (void)(GC_dont_gc = 1)
+#elif defined(GC_MAX_RETRIES) && !defined(CPPCHECK)
+ /* Set GC_max_retries to the desired value at start-up */
+# define GC_INIT_CONF_MAX_RETRIES GC_set_max_retries(GC_MAX_RETRIES)
+#else
+# define GC_INIT_CONF_MAX_RETRIES /* empty */
+#endif
+
+#if defined(GC_ALLOCD_BYTES_PER_FINALIZER) && !defined(CPPCHECK)
+ /* Set GC_allocd_bytes_per_finalizer to the desired value at start-up. */
+# define GC_INIT_CONF_ALLOCD_BYTES_PER_FINALIZER \
+ GC_set_allocd_bytes_per_finalizer(GC_ALLOCD_BYTES_PER_FINALIZER)
+#else
+# define GC_INIT_CONF_ALLOCD_BYTES_PER_FINALIZER /* empty */
+#endif
+
+#if defined(GC_FREE_SPACE_DIVISOR) && !defined(CPPCHECK)
+ /* Set GC_free_space_divisor to the desired value at start-up */
+# define GC_INIT_CONF_FREE_SPACE_DIVISOR \
+ GC_set_free_space_divisor(GC_FREE_SPACE_DIVISOR)
+#else
+# define GC_INIT_CONF_FREE_SPACE_DIVISOR /* empty */
+#endif
+
+#if defined(GC_FULL_FREQ) && !defined(CPPCHECK)
+ /* Set GC_full_freq to the desired value at start-up */
+# define GC_INIT_CONF_FULL_FREQ GC_set_full_freq(GC_FULL_FREQ)
+#else
+# define GC_INIT_CONF_FULL_FREQ /* empty */
+#endif
+
+#if defined(GC_TIME_LIMIT) && !defined(CPPCHECK)
+ /* Set GC_time_limit (in ms) to the desired value at start-up. */
+# define GC_INIT_CONF_TIME_LIMIT GC_set_time_limit(GC_TIME_LIMIT)
+#else
+# define GC_INIT_CONF_TIME_LIMIT /* empty */
+#endif
+
+#if defined(GC_MARKERS) && defined(GC_THREADS) && !defined(CPPCHECK)
+ /* Set the number of marker threads (including the initiating */
+ /* one) to the desired value at start-up. */
+# define GC_INIT_CONF_MARKERS GC_set_markers_count(GC_MARKERS)
+#else
+# define GC_INIT_CONF_MARKERS /* empty */
+#endif
+
+#if defined(GC_SIG_SUSPEND) && defined(GC_THREADS) && !defined(CPPCHECK)
+# define GC_INIT_CONF_SUSPEND_SIGNAL GC_set_suspend_signal(GC_SIG_SUSPEND)
+#else
+# define GC_INIT_CONF_SUSPEND_SIGNAL /* empty */
+#endif
+
+#if defined(GC_SIG_THR_RESTART) && defined(GC_THREADS) && !defined(CPPCHECK)
+# define GC_INIT_CONF_THR_RESTART_SIGNAL \
+ GC_set_thr_restart_signal(GC_SIG_THR_RESTART)
+#else
+# define GC_INIT_CONF_THR_RESTART_SIGNAL /* empty */
+#endif
+
+#if defined(GC_MAXIMUM_HEAP_SIZE) && !defined(CPPCHECK)
+ /* Limit the heap size to the desired value (useful for debugging). */
+ /* The limit could be overridden either at the program start-up by */
+ /* the similar environment variable or anytime later by the */
+ /* corresponding API function call. */
+# define GC_INIT_CONF_MAXIMUM_HEAP_SIZE \
+ GC_set_max_heap_size(GC_MAXIMUM_HEAP_SIZE)
+#else
+# define GC_INIT_CONF_MAXIMUM_HEAP_SIZE /* empty */
+#endif
+
+#ifdef GC_IGNORE_WARN
+ /* Turn off all warnings at start-up (after GC initialization) */
+# define GC_INIT_CONF_IGNORE_WARN GC_set_warn_proc(GC_ignore_warn_proc)
+#else
+# define GC_INIT_CONF_IGNORE_WARN /* empty */
+#endif
+
+#if defined(GC_INITIAL_HEAP_SIZE) && !defined(CPPCHECK)
+ /* Set heap size to the desired value at start-up */
+# define GC_INIT_CONF_INITIAL_HEAP_SIZE \
+ { size_t heap_size = GC_get_heap_size(); \
+ if (heap_size < (GC_INITIAL_HEAP_SIZE)) \
+ (void)GC_expand_hp((GC_INITIAL_HEAP_SIZE) - heap_size); }
+#else
+# define GC_INIT_CONF_INITIAL_HEAP_SIZE /* empty */
+#endif
+
+/* Portable clients should call this at the program start-up. More */
+/* over, some platforms require this call to be done strictly from the */
+/* primordial thread. Multiple invocations are harmless. */
+#define GC_INIT() { GC_INIT_CONF_DONT_EXPAND; /* pre-init */ \
+ GC_INIT_CONF_FORCE_UNMAP_ON_GCOLLECT; \
+ GC_INIT_CONF_MAX_RETRIES; \
+ GC_INIT_CONF_ALLOCD_BYTES_PER_FINALIZER; \
+ GC_INIT_CONF_FREE_SPACE_DIVISOR; \
+ GC_INIT_CONF_FULL_FREQ; \
+ GC_INIT_CONF_TIME_LIMIT; \
+ GC_INIT_CONF_MARKERS; \
+ GC_INIT_CONF_SUSPEND_SIGNAL; \
+ GC_INIT_CONF_THR_RESTART_SIGNAL; \
+ GC_INIT_CONF_MAXIMUM_HEAP_SIZE; \
+ GC_init(); /* real GC initialization */ \
+ GC_INIT_CONF_ROOTS; /* post-init */ \
+ GC_INIT_CONF_IGNORE_WARN; \
+ GC_INIT_CONF_INITIAL_HEAP_SIZE; }
+
+/* win32s may not free all resources on process exit. */
+/* This explicitly deallocates the heap. Defined only for Windows. */
+GC_API void GC_CALL GC_win32_free_heap(void);
+
+#if defined(__SYMBIAN32__)
+ void GC_init_global_static_roots(void);
+#endif
+
+#if defined(_AMIGA) && !defined(GC_AMIGA_MAKINGLIB)
+ /* Allocation really goes through GC_amiga_allocwrapper_do. */
+ void *GC_amiga_realloc(void *, size_t);
+# define GC_realloc(a,b) GC_amiga_realloc(a,b)
+ void GC_amiga_set_toany(void (*)(void));
+ extern int GC_amiga_free_space_divisor_inc;
+ extern void *(*GC_amiga_allocwrapper_do)(size_t, void *(GC_CALL *)(size_t));
+# define GC_malloc(a) \
+ (*GC_amiga_allocwrapper_do)(a,GC_malloc)
+# define GC_malloc_atomic(a) \
+ (*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic)
+# define GC_malloc_uncollectable(a) \
+ (*GC_amiga_allocwrapper_do)(a,GC_malloc_uncollectable)
+# define GC_malloc_atomic_uncollectable(a) \
+ (*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic_uncollectable)
+# define GC_malloc_ignore_off_page(a) \
+ (*GC_amiga_allocwrapper_do)(a,GC_malloc_ignore_off_page)
+# define GC_malloc_atomic_ignore_off_page(a) \
+ (*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic_ignore_off_page)
+#endif /* _AMIGA && !GC_AMIGA_MAKINGLIB */
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* GC_H */
diff --git a/graphics/asymptote/gc/include/gc_allocator.h b/graphics/asymptote/gc/include/gc_allocator.h
new file mode 100644
index 0000000000..f8d069d898
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_allocator.h
@@ -0,0 +1,355 @@
+/*
+ * Copyright (c) 1996-1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * Copyright (c) 2002
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ */
+
+/*
+ * This implements standard-conforming allocators that interact with
+ * the garbage collector. Gc_allocator<T> allocates garbage-collectible
+ * objects of type T. Traceable_allocator<T> allocates objects that
+ * are not themselves garbage collected, but are scanned by the
+ * collector for pointers to collectible objects. Traceable_alloc
+ * should be used for explicitly managed STL containers that may
+ * point to collectible objects.
+ *
+ * This code was derived from an earlier version of the GNU C++ standard
+ * library, which itself was derived from the SGI STL implementation.
+ *
+ * Ignore-off-page allocator: George T. Talbot
+ */
+
+#ifndef GC_ALLOCATOR_H
+#define GC_ALLOCATOR_H
+
+#include "gc.h"
+#include <new> // for placement new and bad_alloc
+
+#if !defined(GC_NO_MEMBER_TEMPLATES) && defined(_MSC_VER) && _MSC_VER <= 1200
+ // MSVC++ 6.0 do not support member templates.
+# define GC_NO_MEMBER_TEMPLATES
+#endif
+
+#if defined(GC_NEW_ABORTS_ON_OOM) || defined(_LIBCPP_NO_EXCEPTIONS)
+# define GC_ALLOCATOR_THROW_OR_ABORT() GC_abort_on_oom()
+#else
+# define GC_ALLOCATOR_THROW_OR_ABORT() throw std::bad_alloc()
+#endif
+
+/* First some helpers to allow us to dispatch on whether or not a type
+ * is known to be pointer-free.
+ * These are private, except that the client may invoke the
+ * GC_DECLARE_PTRFREE macro.
+ */
+
+struct GC_true_type {};
+struct GC_false_type {};
+
+template <class GC_tp>
+struct GC_type_traits {
+ GC_false_type GC_is_ptr_free;
+};
+
+# define GC_DECLARE_PTRFREE(T) \
+template<> struct GC_type_traits<T> { GC_true_type GC_is_ptr_free; }
+
+GC_DECLARE_PTRFREE(char);
+GC_DECLARE_PTRFREE(signed char);
+GC_DECLARE_PTRFREE(unsigned char);
+GC_DECLARE_PTRFREE(signed short);
+GC_DECLARE_PTRFREE(unsigned short);
+GC_DECLARE_PTRFREE(signed int);
+GC_DECLARE_PTRFREE(unsigned int);
+GC_DECLARE_PTRFREE(signed long);
+GC_DECLARE_PTRFREE(unsigned long);
+GC_DECLARE_PTRFREE(float);
+GC_DECLARE_PTRFREE(double);
+GC_DECLARE_PTRFREE(long double);
+/* The client may want to add others. */
+
+// In the following GC_Tp is GC_true_type if we are allocating a
+// pointer-free object.
+template <class GC_Tp>
+inline void * GC_selective_alloc(size_t n, GC_Tp, bool ignore_off_page) {
+ void *obj = ignore_off_page ? GC_MALLOC_IGNORE_OFF_PAGE(n) : GC_MALLOC(n);
+ if (0 == obj)
+ GC_ALLOCATOR_THROW_OR_ABORT();
+ return obj;
+}
+
+#if !defined(__WATCOMC__)
+ /* Note: template-id not supported in this context by Watcom compiler. */
+ template <>
+ inline void * GC_selective_alloc<GC_true_type>(size_t n, GC_true_type,
+ bool ignore_off_page) {
+ void * obj = ignore_off_page ? GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(n)
+ : GC_MALLOC_ATOMIC(n);
+ if (0 == obj)
+ GC_ALLOCATOR_THROW_OR_ABORT();
+ return obj;
+ }
+#endif
+
+// Now the public gc_allocator<T> class.
+template <class GC_Tp>
+class gc_allocator {
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef GC_Tp* pointer;
+ typedef const GC_Tp* const_pointer;
+ typedef GC_Tp& reference;
+ typedef const GC_Tp& const_reference;
+ typedef GC_Tp value_type;
+
+ template <class GC_Tp1> struct rebind {
+ typedef gc_allocator<GC_Tp1> other;
+ };
+
+ GC_CONSTEXPR gc_allocator() GC_NOEXCEPT {}
+ GC_CONSTEXPR gc_allocator(const gc_allocator&) GC_NOEXCEPT {}
+# ifndef GC_NO_MEMBER_TEMPLATES
+ template <class GC_Tp1> GC_ATTR_EXPLICIT
+ GC_CONSTEXPR gc_allocator(const gc_allocator<GC_Tp1>&) GC_NOEXCEPT {}
+# endif
+ GC_CONSTEXPR ~gc_allocator() GC_NOEXCEPT {}
+
+ GC_CONSTEXPR pointer address(reference GC_x) const { return &GC_x; }
+ GC_CONSTEXPR const_pointer address(const_reference GC_x) const {
+ return &GC_x;
+ }
+
+ // GC_n is permitted to be 0. The C++ standard says nothing about what
+ // the return value is when GC_n == 0.
+ GC_CONSTEXPR GC_Tp* allocate(size_type GC_n, const void* = 0) {
+ GC_type_traits<GC_Tp> traits;
+ return static_cast<GC_Tp *>(GC_selective_alloc(GC_n * sizeof(GC_Tp),
+ traits.GC_is_ptr_free, false));
+ }
+
+ GC_CONSTEXPR void deallocate(pointer __p, size_type /* GC_n */) GC_NOEXCEPT {
+ GC_FREE(__p);
+ }
+
+ GC_CONSTEXPR size_type max_size() const GC_NOEXCEPT
+ { return size_t(-1) / sizeof(GC_Tp); }
+
+ GC_CONSTEXPR void construct(pointer __p, const GC_Tp& __val) {
+ new(__p) GC_Tp(__val);
+ }
+
+ GC_CONSTEXPR void destroy(pointer __p) { __p->~GC_Tp(); }
+};
+
+template<>
+class gc_allocator<void> {
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+
+ template <class GC_Tp1> struct rebind {
+ typedef gc_allocator<GC_Tp1> other;
+ };
+};
+
+
+template <class GC_T1, class GC_T2>
+GC_CONSTEXPR inline bool operator==(const gc_allocator<GC_T1>&,
+ const gc_allocator<GC_T2>&) GC_NOEXCEPT {
+ return true;
+}
+
+template <class GC_T1, class GC_T2>
+GC_CONSTEXPR inline bool operator!=(const gc_allocator<GC_T1>&,
+ const gc_allocator<GC_T2>&) GC_NOEXCEPT {
+ return false;
+}
+
+
+// Now the public gc_allocator_ignore_off_page<T> class.
+template <class GC_Tp>
+class gc_allocator_ignore_off_page {
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef GC_Tp* pointer;
+ typedef const GC_Tp* const_pointer;
+ typedef GC_Tp& reference;
+ typedef const GC_Tp& const_reference;
+ typedef GC_Tp value_type;
+
+ template <class GC_Tp1> struct rebind {
+ typedef gc_allocator_ignore_off_page<GC_Tp1> other;
+ };
+
+ GC_CONSTEXPR gc_allocator_ignore_off_page() GC_NOEXCEPT {}
+ GC_CONSTEXPR gc_allocator_ignore_off_page(
+ const gc_allocator_ignore_off_page&) GC_NOEXCEPT {}
+# ifndef GC_NO_MEMBER_TEMPLATES
+ template <class GC_Tp1> GC_ATTR_EXPLICIT
+ GC_CONSTEXPR gc_allocator_ignore_off_page(
+ const gc_allocator_ignore_off_page<GC_Tp1>&) GC_NOEXCEPT {}
+# endif
+ GC_CONSTEXPR ~gc_allocator_ignore_off_page() GC_NOEXCEPT {}
+
+ GC_CONSTEXPR pointer address(reference GC_x) const { return &GC_x; }
+ GC_CONSTEXPR const_pointer address(const_reference GC_x) const {
+ return &GC_x;
+ }
+
+ // GC_n is permitted to be 0. The C++ standard says nothing about what
+ // the return value is when GC_n == 0.
+ GC_CONSTEXPR GC_Tp* allocate(size_type GC_n, const void* = 0) {
+ GC_type_traits<GC_Tp> traits;
+ return static_cast<GC_Tp *>(GC_selective_alloc(GC_n * sizeof(GC_Tp),
+ traits.GC_is_ptr_free, true));
+ }
+
+ GC_CONSTEXPR void deallocate(pointer __p, size_type /* GC_n */) GC_NOEXCEPT {
+ GC_FREE(__p);
+ }
+
+ GC_CONSTEXPR size_type max_size() const GC_NOEXCEPT
+ { return size_t(-1) / sizeof(GC_Tp); }
+
+ GC_CONSTEXPR void construct(pointer __p, const GC_Tp& __val) {
+ new(__p) GC_Tp(__val);
+ }
+
+ GC_CONSTEXPR void destroy(pointer __p) { __p->~GC_Tp(); }
+};
+
+template<>
+class gc_allocator_ignore_off_page<void> {
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+
+ template <class GC_Tp1> struct rebind {
+ typedef gc_allocator_ignore_off_page<GC_Tp1> other;
+ };
+};
+
+template <class GC_T1, class GC_T2>
+GC_CONSTEXPR inline bool operator==(const gc_allocator_ignore_off_page<GC_T1>&,
+ const gc_allocator_ignore_off_page<GC_T2>&) GC_NOEXCEPT {
+ return true;
+}
+
+template <class GC_T1, class GC_T2>
+GC_CONSTEXPR inline bool operator!=(const gc_allocator_ignore_off_page<GC_T1>&,
+ const gc_allocator_ignore_off_page<GC_T2>&) GC_NOEXCEPT {
+ return false;
+}
+
+// And the public traceable_allocator class.
+
+/* Note that we currently don't specialize the pointer-free case, since a
+ * pointer-free traceable container doesn't make that much sense,
+ * though it could become an issue due to abstraction boundaries.
+ */
+
+template <class GC_Tp>
+class traceable_allocator {
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef GC_Tp* pointer;
+ typedef const GC_Tp* const_pointer;
+ typedef GC_Tp& reference;
+ typedef const GC_Tp& const_reference;
+ typedef GC_Tp value_type;
+
+ template <class GC_Tp1> struct rebind {
+ typedef traceable_allocator<GC_Tp1> other;
+ };
+
+ GC_CONSTEXPR traceable_allocator() GC_NOEXCEPT {}
+ GC_CONSTEXPR traceable_allocator(const traceable_allocator&) GC_NOEXCEPT {}
+# ifndef GC_NO_MEMBER_TEMPLATES
+ template <class GC_Tp1> GC_ATTR_EXPLICIT
+ GC_CONSTEXPR traceable_allocator(
+ const traceable_allocator<GC_Tp1>&) GC_NOEXCEPT {}
+# endif
+ GC_CONSTEXPR ~traceable_allocator() GC_NOEXCEPT {}
+
+ GC_CONSTEXPR pointer address(reference GC_x) const { return &GC_x; }
+ GC_CONSTEXPR const_pointer address(const_reference GC_x) const {
+ return &GC_x;
+ }
+
+ // GC_n is permitted to be 0. The C++ standard says nothing about what
+ // the return value is when GC_n == 0.
+ GC_CONSTEXPR GC_Tp* allocate(size_type GC_n, const void* = 0) {
+ void * obj = GC_MALLOC_UNCOLLECTABLE(GC_n * sizeof(GC_Tp));
+ if (0 == obj)
+ GC_ALLOCATOR_THROW_OR_ABORT();
+ return static_cast<GC_Tp*>(obj);
+ }
+
+ GC_CONSTEXPR void deallocate(pointer __p, size_type /* GC_n */) GC_NOEXCEPT {
+ GC_FREE(__p);
+ }
+
+ GC_CONSTEXPR size_type max_size() const GC_NOEXCEPT
+ { return size_t(-1) / sizeof(GC_Tp); }
+
+ GC_CONSTEXPR void construct(pointer __p, const GC_Tp& __val) {
+ new(__p) GC_Tp(__val);
+ }
+
+ GC_CONSTEXPR void destroy(pointer __p) { __p->~GC_Tp(); }
+};
+
+template<>
+class traceable_allocator<void> {
+public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+
+ template <class GC_Tp1> struct rebind {
+ typedef traceable_allocator<GC_Tp1> other;
+ };
+};
+
+
+template <class GC_T1, class GC_T2>
+GC_CONSTEXPR inline bool operator==(const traceable_allocator<GC_T1>&,
+ const traceable_allocator<GC_T2>&) GC_NOEXCEPT {
+ return true;
+}
+
+template <class GC_T1, class GC_T2>
+GC_CONSTEXPR inline bool operator!=(const traceable_allocator<GC_T1>&,
+ const traceable_allocator<GC_T2>&) GC_NOEXCEPT {
+ return false;
+}
+
+#endif /* GC_ALLOCATOR_H */
diff --git a/graphics/asymptote/gc/include/gc_backptr.h b/graphics/asymptote/gc/include/gc_backptr.h
new file mode 100644
index 0000000000..da04f9c953
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_backptr.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2009 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * This is a simple API to implement pointer back tracing, i.e.
+ * to answer questions such as "who is pointing to this" or
+ * "why is this object being retained by the collector"
+ *
+ * Most of these calls yield useful information on only after
+ * a garbage collection. Usually the client will first force
+ * a full collection and then gather information, preferably
+ * before much intervening allocation.
+ *
+ * The implementation of the interface is only about 99.9999%
+ * correct. It is intended to be good enough for profiling,
+ * but is not intended to be used with production code.
+ *
+ * Results are likely to be much more useful if all allocation is
+ * accomplished through the debugging allocators.
+ *
+ * The implementation idea is due to A. Demers.
+ */
+
+#ifndef GC_BACKPTR_H
+#define GC_BACKPTR_H
+
+#ifndef GC_H
+# include "gc.h"
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Store information about the object referencing dest in *base_p */
+/* and *offset_p. */
+/* If multiple objects or roots point to dest, the one reported */
+/* will be the last one used by the garbage collector to trace the */
+/* object. */
+/* source is root ==> *base_p = address, *offset_p = 0 */
+/* source is heap object ==> *base_p != 0, *offset_p = offset */
+/* Dest can be any address within a heap object. */
+typedef enum {
+ GC_UNREFERENCED, /* No reference info available. */
+ GC_NO_SPACE, /* Dest not allocated with debug alloc. */
+ GC_REFD_FROM_ROOT, /* Referenced directly by root *base_p. */
+ GC_REFD_FROM_REG, /* Referenced from a register, i.e. */
+ /* a root without an address. */
+ GC_REFD_FROM_HEAP, /* Referenced from another heap obj. */
+ GC_FINALIZER_REFD /* Finalizable and hence accessible. */
+} GC_ref_kind;
+
+GC_API GC_ref_kind GC_CALL GC_get_back_ptr_info(void * /* dest */,
+ void ** /* base_p */, size_t * /* offset_p */)
+ GC_ATTR_NONNULL(1);
+
+/* Generate a random heap address. */
+/* The resulting address is in the heap, but */
+/* not necessarily inside a valid object. */
+GC_API void * GC_CALL GC_generate_random_heap_address(void);
+
+/* Generate a random address inside a valid marked heap object. */
+GC_API void * GC_CALL GC_generate_random_valid_address(void);
+
+/* Force a garbage collection and generate a backtrace from a */
+/* random heap address. */
+/* This uses the GC logging mechanism (GC_printf) to produce */
+/* output. It can often be called from a debugger. The */
+/* source in dbg_mlc.c also serves as a sample client. */
+GC_API void GC_CALL GC_generate_random_backtrace(void);
+
+/* Print a backtrace from a specific address. Used by the */
+/* above. The client should call GC_gcollect() immediately */
+/* before invocation. */
+GC_API void GC_CALL GC_print_backtrace(void *) GC_ATTR_NONNULL(1);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* GC_BACKPTR_H */
diff --git a/graphics/asymptote/gc/include/gc_config_macros.h b/graphics/asymptote/gc/include/gc_config_macros.h
new file mode 100644
index 0000000000..ec452c68d2
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_config_macros.h
@@ -0,0 +1,466 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2009 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ * Copyright (c) 2008-2020 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* This should never be included directly; it is included only from gc.h. */
+/* We separate it only to make gc.h more suitable as documentation. */
+#if defined(GC_H)
+
+/* Convenient internal macro to test version of GCC. */
+#if defined(__GNUC__) && defined(__GNUC_MINOR__)
+# define GC_GNUC_PREREQ(major, minor) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((major) << 16) + (minor))
+#else
+# define GC_GNUC_PREREQ(major, minor) 0 /* FALSE */
+#endif
+
+/* Some tests for old macros. These violate our namespace rules and */
+/* will disappear shortly. Use the GC_ names. */
+#if defined(SOLARIS_THREADS) || defined(_SOLARIS_THREADS) \
+ || defined(_SOLARIS_PTHREADS) || defined(GC_SOLARIS_PTHREADS)
+ /* We no longer support old style Solaris threads. */
+ /* GC_SOLARIS_THREADS now means pthreads. */
+# ifndef GC_SOLARIS_THREADS
+# define GC_SOLARIS_THREADS
+# endif
+#endif
+#if defined(IRIX_THREADS)
+# define GC_IRIX_THREADS
+#endif
+#if defined(DGUX_THREADS) && !defined(GC_DGUX386_THREADS)
+# define GC_DGUX386_THREADS
+#endif
+#if defined(AIX_THREADS)
+# define GC_AIX_THREADS
+#endif
+#if defined(HPUX_THREADS)
+# define GC_HPUX_THREADS
+#endif
+#if defined(OSF1_THREADS)
+# define GC_OSF1_THREADS
+#endif
+#if defined(LINUX_THREADS)
+# define GC_LINUX_THREADS
+#endif
+#if defined(WIN32_THREADS)
+# define GC_WIN32_THREADS
+#endif
+#if defined(RTEMS_THREADS)
+# define GC_RTEMS_PTHREADS
+#endif
+#if defined(USE_LD_WRAP)
+# define GC_USE_LD_WRAP
+#endif
+
+#if defined(GC_WIN32_PTHREADS) && !defined(GC_WIN32_THREADS)
+ /* Using pthreads-win32 library (or other Win32 implementation). */
+# define GC_WIN32_THREADS
+#endif
+
+#if defined(GC_AIX_THREADS) || defined(GC_DARWIN_THREADS) \
+ || defined(GC_DGUX386_THREADS) || defined(GC_FREEBSD_THREADS) \
+ || defined(GC_HPUX_THREADS) \
+ || defined(GC_IRIX_THREADS) || defined(GC_LINUX_THREADS) \
+ || defined(GC_NETBSD_THREADS) || defined(GC_OPENBSD_THREADS) \
+ || defined(GC_OSF1_THREADS) || defined(GC_SOLARIS_THREADS) \
+ || defined(GC_WIN32_THREADS) || defined(GC_RTEMS_PTHREADS)
+# ifndef GC_THREADS
+# define GC_THREADS
+# endif
+#elif defined(GC_THREADS)
+# if defined(__linux__)
+# define GC_LINUX_THREADS
+# elif defined(__OpenBSD__)
+# define GC_OPENBSD_THREADS
+# elif defined(_PA_RISC1_1) || defined(_PA_RISC2_0) || defined(hppa) \
+ || defined(__HPPA) || (defined(__ia64) && defined(_HPUX_SOURCE))
+# define GC_HPUX_THREADS
+# elif defined(__HAIKU__)
+# define GC_HAIKU_THREADS
+# elif (defined(__DragonFly__) || defined(__FreeBSD_kernel__) \
+ || defined(__FreeBSD__)) && !defined(GC_NO_FREEBSD)
+# define GC_FREEBSD_THREADS
+# elif defined(__NetBSD__)
+# define GC_NETBSD_THREADS
+# elif defined(__alpha) || defined(__alpha__) /* && !Linux && !xBSD */
+# define GC_OSF1_THREADS
+# elif (defined(mips) || defined(__mips) || defined(_mips)) \
+ && !(defined(nec_ews) || defined(_nec_ews) \
+ || defined(ultrix) || defined(__ultrix))
+# define GC_IRIX_THREADS
+# elif defined(__sparc) /* && !Linux */ \
+ || ((defined(sun) || defined(__sun)) \
+ && (defined(i386) || defined(__i386__) \
+ || defined(__amd64) || defined(__amd64__)))
+# define GC_SOLARIS_THREADS
+# elif defined(__APPLE__) && defined(__MACH__)
+# define GC_DARWIN_THREADS
+# endif
+# if defined(DGUX) && (defined(i386) || defined(__i386__))
+# define GC_DGUX386_THREADS
+# endif
+# if defined(_AIX)
+# define GC_AIX_THREADS
+# endif
+# if (defined(_WIN32) || defined(_MSC_VER) || defined(__BORLANDC__) \
+ || defined(__CYGWIN32__) || defined(__CYGWIN__) || defined(__CEGCC__) \
+ || defined(_WIN32_WCE) || defined(__MINGW32__)) \
+ && !defined(GC_WIN32_THREADS)
+ /* Either posix or native Win32 threads. */
+# define GC_WIN32_THREADS
+# endif
+# if defined(__rtems__) && (defined(i386) || defined(__i386__))
+# define GC_RTEMS_PTHREADS
+# endif
+#endif /* GC_THREADS */
+
+#undef GC_PTHREADS
+#if (!defined(GC_WIN32_THREADS) || defined(GC_WIN32_PTHREADS) \
+ || defined(__CYGWIN32__) || defined(__CYGWIN__)) && defined(GC_THREADS) \
+ && !defined(NN_PLATFORM_CTR) && !defined(NN_BUILD_TARGET_PLATFORM_NX)
+ /* Posix threads. */
+# define GC_PTHREADS
+#endif
+
+#if !defined(_PTHREADS) && defined(GC_NETBSD_THREADS)
+# define _PTHREADS
+#endif
+
+#if defined(GC_DGUX386_THREADS) && !defined(_POSIX4A_DRAFT10_SOURCE)
+# define _POSIX4A_DRAFT10_SOURCE 1
+#endif
+
+#if !defined(_REENTRANT) && defined(GC_PTHREADS) && !defined(GC_WIN32_THREADS)
+ /* Better late than never. This fails if system headers that depend */
+ /* on this were previously included. */
+# define _REENTRANT 1
+#endif
+
+#define __GC
+#if !defined(_WIN32_WCE) || defined(__GNUC__)
+# include <stddef.h>
+# if defined(__MINGW32__) && !defined(_WIN32_WCE)
+# include <stdint.h>
+ /* We mention uintptr_t. */
+ /* Perhaps this should be included in pure msft environments */
+ /* as well? */
+# endif
+#else /* _WIN32_WCE */
+ /* Yet more kludges for WinCE. */
+# include <stdlib.h> /* size_t is defined here */
+# ifndef _PTRDIFF_T_DEFINED
+ /* ptrdiff_t is not defined */
+# define _PTRDIFF_T_DEFINED
+ typedef long ptrdiff_t;
+# endif
+#endif /* _WIN32_WCE */
+
+#if !defined(GC_NOT_DLL) && !defined(GC_DLL) \
+ && ((defined(_DLL) && !defined(__GNUC__)) \
+ || (defined(DLL_EXPORT) && defined(GC_BUILD)))
+# define GC_DLL
+#endif
+
+#if defined(GC_DLL) && !defined(GC_API)
+
+# if defined(__CEGCC__)
+# if defined(GC_BUILD)
+# define GC_API __declspec(dllexport)
+# else
+# define GC_API __declspec(dllimport)
+# endif
+
+# elif defined(__MINGW32__)
+# if defined(__cplusplus) && defined(GC_BUILD)
+# define GC_API extern __declspec(dllexport)
+# elif defined(GC_BUILD) || defined(__MINGW32_DELAY_LOAD__)
+# define GC_API __declspec(dllexport)
+# else
+# define GC_API extern __declspec(dllimport)
+# endif
+
+# elif defined(_MSC_VER) || defined(__DMC__) || defined(__BORLANDC__) \
+ || defined(__CYGWIN__)
+# ifdef GC_BUILD
+# define GC_API extern __declspec(dllexport)
+# else
+# define GC_API __declspec(dllimport)
+# endif
+
+# elif defined(__WATCOMC__)
+# ifdef GC_BUILD
+# define GC_API extern __declspec(dllexport)
+# else
+# define GC_API extern __declspec(dllimport)
+# endif
+
+# elif defined(__SYMBIAN32__)
+# ifdef GC_BUILD
+# define GC_API extern EXPORT_C
+# else
+# define GC_API extern IMPORT_C
+# endif
+
+# elif defined(__GNUC__)
+ /* Only matters if used in conjunction with -fvisibility=hidden option. */
+# if defined(GC_BUILD) && !defined(GC_NO_VISIBILITY) \
+ && (GC_GNUC_PREREQ(4, 0) || defined(GC_VISIBILITY_HIDDEN_SET))
+# define GC_API extern __attribute__((__visibility__("default")))
+# endif
+# endif
+#endif /* GC_DLL */
+
+#ifndef GC_API
+# define GC_API extern
+#endif
+
+#ifndef GC_CALL
+# define GC_CALL
+#endif
+
+#ifndef GC_CALLBACK
+# define GC_CALLBACK GC_CALL
+#endif
+
+#ifndef GC_ATTR_MALLOC
+ /* 'malloc' attribute should be used for all malloc-like functions */
+ /* (to tell the compiler that a function may be treated as if any */
+ /* non-NULL pointer it returns cannot alias any other pointer valid */
+ /* when the function returns). If the client code violates this rule */
+ /* by using custom GC_oom_func then define GC_OOM_FUNC_RETURNS_ALIAS. */
+# ifdef GC_OOM_FUNC_RETURNS_ALIAS
+# define GC_ATTR_MALLOC /* empty */
+# elif GC_GNUC_PREREQ(3, 1)
+# define GC_ATTR_MALLOC __attribute__((__malloc__))
+# elif defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(__EDG__)
+# define GC_ATTR_MALLOC \
+ __declspec(allocator) __declspec(noalias) __declspec(restrict)
+# elif defined(_MSC_VER) && _MSC_VER >= 1400
+# define GC_ATTR_MALLOC __declspec(noalias) __declspec(restrict)
+# else
+# define GC_ATTR_MALLOC
+# endif
+#endif
+
+#ifndef GC_ATTR_ALLOC_SIZE
+ /* 'alloc_size' attribute improves __builtin_object_size correctness. */
+# undef GC_ATTR_CALLOC_SIZE
+# ifdef __clang__
+# if __has_attribute(__alloc_size__)
+# define GC_ATTR_ALLOC_SIZE(argnum) __attribute__((__alloc_size__(argnum)))
+# define GC_ATTR_CALLOC_SIZE(n, s) __attribute__((__alloc_size__(n, s)))
+# else
+# define GC_ATTR_ALLOC_SIZE(argnum) /* empty */
+# endif
+# elif GC_GNUC_PREREQ(4, 3) && !defined(__ICC)
+# define GC_ATTR_ALLOC_SIZE(argnum) __attribute__((__alloc_size__(argnum)))
+# define GC_ATTR_CALLOC_SIZE(n, s) __attribute__((__alloc_size__(n, s)))
+# else
+# define GC_ATTR_ALLOC_SIZE(argnum) /* empty */
+# endif
+#endif
+
+#ifndef GC_ATTR_CALLOC_SIZE
+# define GC_ATTR_CALLOC_SIZE(n, s) /* empty */
+#endif
+
+#ifndef GC_ATTR_NONNULL
+# if GC_GNUC_PREREQ(4, 0)
+# define GC_ATTR_NONNULL(argnum) __attribute__((__nonnull__(argnum)))
+# else
+# define GC_ATTR_NONNULL(argnum) /* empty */
+# endif
+#endif
+
+#ifndef GC_ATTR_CONST
+# if GC_GNUC_PREREQ(4, 0)
+# define GC_ATTR_CONST __attribute__((__const__))
+# else
+# define GC_ATTR_CONST /* empty */
+# endif
+#endif
+
+#ifndef GC_ATTR_DEPRECATED
+# ifdef GC_BUILD
+# undef GC_ATTR_DEPRECATED
+# define GC_ATTR_DEPRECATED /* empty */
+# elif GC_GNUC_PREREQ(4, 0)
+# define GC_ATTR_DEPRECATED __attribute__((__deprecated__))
+# elif defined(_MSC_VER) && _MSC_VER >= 1200
+# define GC_ATTR_DEPRECATED __declspec(deprecated)
+# else
+# define GC_ATTR_DEPRECATED /* empty */
+# endif
+#endif
+
+#if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION >= 720
+# define GC_ADD_CALLER
+# define GC_RETURN_ADDR (GC_word)__return_address
+#endif
+
+#if defined(__linux__) || defined(__GLIBC__)
+# if !defined(__native_client__)
+# include <features.h>
+# endif
+# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \
+ && !defined(__ia64__) \
+ && !defined(GC_MISSING_EXECINFO_H) \
+ && !defined(GC_HAVE_BUILTIN_BACKTRACE)
+# define GC_HAVE_BUILTIN_BACKTRACE
+# endif
+# if defined(__i386__) || defined(__amd64__) || defined(__x86_64__)
+# define GC_CAN_SAVE_CALL_STACKS
+# endif
+#endif /* GLIBC */
+
+#if defined(_MSC_VER) && _MSC_VER >= 1200 /* version 12.0+ (MSVC 6.0+) */ \
+ && !defined(_M_ARM) && !defined(_M_ARM64) \
+ && !defined(_AMD64_) && !defined(_M_X64) && !defined(_WIN32_WCE) \
+ && !defined(GC_HAVE_NO_BUILTIN_BACKTRACE) \
+ && !defined(GC_HAVE_BUILTIN_BACKTRACE)
+# define GC_HAVE_BUILTIN_BACKTRACE
+#endif
+
+#if defined(GC_HAVE_BUILTIN_BACKTRACE) && !defined(GC_CAN_SAVE_CALL_STACKS)
+# define GC_CAN_SAVE_CALL_STACKS
+#endif
+
+#if defined(__sparc__)
+# define GC_CAN_SAVE_CALL_STACKS
+#endif
+
+/* If we're on a platform on which we can't save call stacks, but */
+/* gcc is normally used, we go ahead and define GC_ADD_CALLER. */
+/* We make this decision independent of whether gcc is actually being */
+/* used, in order to keep the interface consistent, and allow mixing */
+/* of compilers. */
+/* This may also be desirable if it is possible but expensive to */
+/* retrieve the call chain. */
+#if (defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__) \
+ || defined(__FreeBSD_kernel__) || defined(__HAIKU__) \
+ || defined(__NetBSD__) || defined(__OpenBSD__) \
+ || defined(HOST_ANDROID) || defined(__ANDROID__)) \
+ && !defined(GC_CAN_SAVE_CALL_STACKS)
+# define GC_ADD_CALLER
+# if GC_GNUC_PREREQ(2, 95)
+ /* gcc knows how to retrieve return address, but we don't know */
+ /* how to generate call stacks. */
+# define GC_RETURN_ADDR (GC_word)__builtin_return_address(0)
+# if GC_GNUC_PREREQ(4, 0) && (defined(__i386__) || defined(__amd64__) \
+ || defined(__x86_64__) /* and probably others... */) \
+ && !defined(GC_NO_RETURN_ADDR_PARENT)
+# define GC_HAVE_RETURN_ADDR_PARENT
+# define GC_RETURN_ADDR_PARENT \
+ (GC_word)__builtin_extract_return_addr(__builtin_return_address(1))
+ /* Note: a compiler might complain that calling */
+ /* __builtin_return_address with a nonzero argument is unsafe. */
+# endif
+# else
+ /* Just pass 0 for gcc compatibility. */
+# define GC_RETURN_ADDR 0
+# endif
+#endif /* !GC_CAN_SAVE_CALL_STACKS */
+
+#ifdef GC_PTHREADS
+
+# if (defined(GC_DARWIN_THREADS) || defined(GC_WIN32_PTHREADS) \
+ || defined(__native_client__) || defined(GC_RTEMS_PTHREADS)) \
+ && !defined(GC_NO_DLOPEN)
+ /* Either there is no dlopen() or we do not need to intercept it. */
+# define GC_NO_DLOPEN
+# endif
+
+# if (defined(GC_DARWIN_THREADS) || defined(GC_WIN32_PTHREADS) \
+ || defined(__native_client__)) \
+ && !defined(GC_NO_PTHREAD_SIGMASK)
+ /* Either there is no pthread_sigmask() or no need to intercept it. */
+# define GC_NO_PTHREAD_SIGMASK
+# endif
+
+# if defined(__native_client__)
+ /* At present, NaCl pthread_create() prototype does not have */
+ /* "const" for its "attr" argument; also, NaCl pthread_exit() one */
+ /* does not have "noreturn" attribute. */
+# ifndef GC_PTHREAD_CREATE_CONST
+# define GC_PTHREAD_CREATE_CONST /* empty */
+# endif
+# ifndef GC_HAVE_PTHREAD_EXIT
+# define GC_HAVE_PTHREAD_EXIT
+# define GC_PTHREAD_EXIT_ATTRIBUTE /* empty */
+# endif
+# endif
+
+# if !defined(GC_HAVE_PTHREAD_EXIT) \
+ && !defined(HOST_ANDROID) && !defined(__ANDROID__) \
+ && (defined(GC_LINUX_THREADS) || defined(GC_SOLARIS_THREADS))
+# define GC_HAVE_PTHREAD_EXIT
+ /* Intercept pthread_exit on Linux and Solaris. */
+# if GC_GNUC_PREREQ(2, 7)
+# define GC_PTHREAD_EXIT_ATTRIBUTE __attribute__((__noreturn__))
+# elif defined(__NORETURN) /* used in Solaris */
+# define GC_PTHREAD_EXIT_ATTRIBUTE __NORETURN
+# else
+# define GC_PTHREAD_EXIT_ATTRIBUTE /* empty */
+# endif
+# endif
+
+# if (!defined(GC_HAVE_PTHREAD_EXIT) || defined(__native_client__)) \
+ && !defined(GC_NO_PTHREAD_CANCEL)
+ /* Either there is no pthread_cancel() or no need to intercept it. */
+# define GC_NO_PTHREAD_CANCEL
+# endif
+
+#endif /* GC_PTHREADS */
+
+#ifdef __cplusplus
+
+#ifndef GC_ATTR_EXPLICIT
+# if __cplusplus >= 201103L && !defined(__clang__) || _MSVC_LANG >= 201103L \
+ || defined(CPPCHECK)
+# define GC_ATTR_EXPLICIT explicit
+# else
+# define GC_ATTR_EXPLICIT /* empty */
+# endif
+#endif
+
+#ifndef GC_NOEXCEPT
+# if defined(__DMC__) || (defined(__BORLANDC__) \
+ && (defined(_RWSTD_NO_EXCEPTIONS) || defined(_RWSTD_NO_EX_SPEC))) \
+ || (defined(_MSC_VER) && defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS) \
+ || (defined(__WATCOMC__) && !defined(_CPPUNWIND))
+# define GC_NOEXCEPT /* empty */
+# ifndef GC_NEW_ABORTS_ON_OOM
+# define GC_NEW_ABORTS_ON_OOM
+# endif
+# elif __cplusplus >= 201103L || _MSVC_LANG >= 201103L
+# define GC_NOEXCEPT noexcept
+# else
+# define GC_NOEXCEPT throw()
+# endif
+#endif
+
+#ifndef GC_CONSTEXPR
+# if __cplusplus >= 202002L
+# define GC_CONSTEXPR constexpr
+# else
+# define GC_CONSTEXPR /* empty */
+# endif
+#endif
+
+#endif /* __cplusplus */
+
+#endif
diff --git a/graphics/asymptote/gc/include/gc_cpp.h b/graphics/asymptote/gc/include/gc_cpp.h
new file mode 100644
index 0000000000..edb691848e
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_cpp.h
@@ -0,0 +1,603 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+
+#ifndef GC_CPP_H
+#define GC_CPP_H
+
+/****************************************************************************
+C++ Interface to the Boehm Collector
+
+ John R. Ellis and Jesse Hull
+
+This interface provides access to the Boehm collector. It provides
+basic facilities similar to those described in "Safe, Efficient
+Garbage Collection for C++", by John R. Ellis and David L. Detlefs
+(ftp://ftp.parc.xerox.com/pub/ellis/gc).
+
+All heap-allocated objects are either "collectible" or
+"uncollectible". Programs must explicitly delete uncollectible
+objects, whereas the garbage collector will automatically delete
+collectible objects when it discovers them to be inaccessible.
+Collectible objects may freely point at uncollectible objects and vice
+versa.
+
+Objects allocated with the built-in "::operator new" are uncollectible.
+
+Objects derived from class "gc" are collectible. For example:
+
+ class A: public gc {...};
+ A* a = new A; // a is collectible.
+
+Collectible instances of non-class types can be allocated using the GC
+(or UseGC) placement:
+
+ typedef int A[ 10 ];
+ A* a = new (GC) A;
+
+Uncollectible instances of classes derived from "gc" can be allocated
+using the NoGC placement:
+
+ class A: public gc {...};
+ A* a = new (NoGC) A; // a is uncollectible.
+
+The new(PointerFreeGC) syntax allows the allocation of collectible
+objects that are not scanned by the collector. This useful if you
+are allocating compressed data, bitmaps, or network packets. (In
+the latter case, it may remove danger of unfriendly network packets
+intentionally containing values that cause spurious memory retention.)
+
+Both uncollectible and collectible objects can be explicitly deleted
+with "delete", which invokes an object's destructors and frees its
+storage immediately.
+
+A collectible object may have a clean-up function, which will be
+invoked when the collector discovers the object to be inaccessible.
+An object derived from "gc_cleanup" or containing a member derived
+from "gc_cleanup" has a default clean-up function that invokes the
+object's destructors. Explicit clean-up functions may be specified as
+an additional placement argument:
+
+ A* a = ::new (GC, MyCleanup) A;
+
+An object is considered "accessible" by the collector if it can be
+reached by a path of pointers from static variables, automatic
+variables of active functions, or from some object with clean-up
+enabled; pointers from an object to itself are ignored.
+
+Thus, if objects A and B both have clean-up functions, and A points at
+B, B is considered accessible. After A's clean-up is invoked and its
+storage released, B will then become inaccessible and will have its
+clean-up invoked. If A points at B and B points to A, forming a
+cycle, then that's considered a storage leak, and neither will be
+collectible. See the interface gc.h for low-level facilities for
+handling such cycles of objects with clean-up.
+
+The collector cannot guarantee that it will find all inaccessible
+objects. In practice, it finds almost all of them.
+
+
+Cautions:
+
+1. Be sure the collector has been augmented with "make c++" or
+"--enable-cplusplus".
+
+2. If your compiler supports the new "operator new[]" syntax, then
+add -DGC_OPERATOR_NEW_ARRAY to the Makefile.
+
+If your compiler doesn't support "operator new[]", beware that an
+array of type T, where T is derived from "gc", may or may not be
+allocated as a collectible object (it depends on the compiler). Use
+the explicit GC placement to make the array collectible. For example:
+
+ class A: public gc {...};
+ A* a1 = new A[ 10 ]; // collectible or uncollectible?
+ A* a2 = new (GC) A[ 10 ]; // collectible.
+
+3. The destructors of collectible arrays of objects derived from
+"gc_cleanup" will not be invoked properly. For example:
+
+ class A: public gc_cleanup {...};
+ A* a = new (GC) A[ 10 ]; // destructors not invoked correctly
+
+Typically, only the destructor for the first element of the array will
+be invoked when the array is garbage-collected. To get all the
+destructors of any array executed, you must supply an explicit
+clean-up function:
+
+ A* a = new (GC, MyCleanUp) A[ 10 ];
+
+(Implementing clean-up of arrays correctly, portably, and in a way
+that preserves the correct exception semantics requires a language
+extension, e.g. the "gc" keyword.)
+
+4. Compiler bugs (now hopefully history):
+
+* Solaris 2's CC (SC3.0) doesn't implement t->~T() correctly, so the
+destructors of classes derived from gc_cleanup won't be invoked.
+You'll have to explicitly register a clean-up function with
+new-placement syntax.
+
+* Evidently cfront 3.0 does not allow destructors to be explicitly
+invoked using the ANSI-conforming syntax t->~T(). If you're using
+cfront 3.0, you'll have to comment out the class gc_cleanup, which
+uses explicit invocation.
+
+5. GC name conflicts:
+
+Many other systems seem to use the identifier "GC" as an abbreviation
+for "Graphics Context". Thus, GC placement has been replaced
+by UseGC. GC is an alias for UseGC, unless GC_NAME_CONFLICT is defined.
+
+****************************************************************************/
+
+#include "gc.h"
+
+#ifdef GC_INCLUDE_NEW
+# include <new> // for std, bad_alloc
+#endif
+
+#ifdef GC_NAMESPACE
+# define GC_NS_QUALIFY(T) boehmgc::T
+#else
+# define GC_NS_QUALIFY(T) T
+#endif
+
+#ifndef THINK_CPLUS
+# define GC_cdecl GC_CALLBACK
+#else
+# define GC_cdecl _cdecl
+#endif
+
+#if !defined(GC_NO_OPERATOR_NEW_ARRAY) \
+ && !defined(_ENABLE_ARRAYNEW) /* Digimars */ \
+ && (defined(__BORLANDC__) && (__BORLANDC__ < 0x450) \
+ || (defined(__GNUC__) && !GC_GNUC_PREREQ(2, 6)) \
+ || (defined(_MSC_VER) && _MSC_VER <= 1020) \
+ || (defined(__WATCOMC__) && __WATCOMC__ < 1050))
+# define GC_NO_OPERATOR_NEW_ARRAY
+#endif
+
+#if !defined(GC_NO_OPERATOR_NEW_ARRAY) && !defined(GC_OPERATOR_NEW_ARRAY)
+# define GC_OPERATOR_NEW_ARRAY
+#endif
+
+#if (!defined(__BORLANDC__) || __BORLANDC__ > 0x0620) \
+ && ! defined (__sgi) && ! defined(__WATCOMC__) \
+ && (!defined(_MSC_VER) || _MSC_VER > 1020)
+# define GC_PLACEMENT_DELETE
+#endif
+
+#if !defined(GC_NEW_DELETE_THROW_NOT_NEEDED) \
+ && !defined(GC_NEW_DELETE_NEED_THROW) && GC_GNUC_PREREQ(4, 2) \
+ && (__cplusplus < 201103L || defined(__clang__))
+# define GC_NEW_DELETE_NEED_THROW
+#endif
+
+#ifndef GC_NEW_DELETE_NEED_THROW
+# define GC_DECL_NEW_THROW /* empty */
+#elif __cplusplus >= 201703L || _MSVC_LANG >= 201703L
+ // The "dynamic exception" syntax had been deprecated in C++11
+ // and was removed in C++17.
+# define GC_DECL_NEW_THROW noexcept(false)
+#elif defined(GC_INCLUDE_NEW)
+# define GC_DECL_NEW_THROW throw(std::bad_alloc)
+#else
+# define GC_DECL_NEW_THROW /* empty (as bad_alloc might be undeclared) */
+#endif
+
+#if defined(GC_NEW_ABORTS_ON_OOM) || defined(_LIBCPP_NO_EXCEPTIONS)
+# define GC_OP_NEW_OOM_CHECK(obj) \
+ do { if (!(obj)) GC_abort_on_oom(); } while (0)
+#elif defined(GC_INCLUDE_NEW)
+# define GC_OP_NEW_OOM_CHECK(obj) if (obj) {} else throw std::bad_alloc()
+#else
+ // "new" header is not included, so bad_alloc cannot be thrown directly.
+ GC_API void GC_CALL GC_throw_bad_alloc();
+# define GC_OP_NEW_OOM_CHECK(obj) if (obj) {} else GC_throw_bad_alloc()
+#endif // !GC_NEW_ABORTS_ON_OOM && !GC_INCLUDE_NEW
+
+#ifdef GC_NAMESPACE
+namespace boehmgc
+{
+#endif
+
+enum GCPlacement
+{
+ UseGC,
+# ifndef GC_NAME_CONFLICT
+ GC = UseGC,
+# endif
+ NoGC,
+ PointerFreeGC
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+ , PointerFreeNoGC
+# endif
+};
+
+/**
+ * Instances of classes derived from "gc" will be allocated in the collected
+ * heap by default, unless an explicit NoGC placement is specified.
+ */
+class gc
+{
+public:
+ inline void* operator new(size_t size);
+ inline void* operator new(size_t size, GCPlacement gcp);
+ inline void* operator new(size_t size, void* p) GC_NOEXCEPT;
+ // Must be redefined here, since the other overloadings hide
+ // the global definition.
+ inline void operator delete(void* obj) GC_NOEXCEPT;
+
+# ifdef GC_PLACEMENT_DELETE
+ inline void operator delete(void*, GCPlacement) GC_NOEXCEPT;
+ // Called if construction fails.
+ inline void operator delete(void*, void*) GC_NOEXCEPT;
+# endif // GC_PLACEMENT_DELETE
+
+# ifdef GC_OPERATOR_NEW_ARRAY
+ inline void* operator new[](size_t size);
+ inline void* operator new[](size_t size, GCPlacement gcp);
+ inline void* operator new[](size_t size, void* p) GC_NOEXCEPT;
+ inline void operator delete[](void* obj) GC_NOEXCEPT;
+# ifdef GC_PLACEMENT_DELETE
+ inline void operator delete[](void*, GCPlacement) GC_NOEXCEPT;
+ inline void operator delete[](void*, void*) GC_NOEXCEPT;
+# endif
+# endif // GC_OPERATOR_NEW_ARRAY
+};
+
+/**
+ * Instances of classes derived from "gc_cleanup" will be allocated
+ * in the collected heap by default. When the collector discovers
+ * an inaccessible object derived from "gc_cleanup" or containing
+ * a member derived from "gc_cleanup", its destructors will be invoked.
+ */
+class gc_cleanup: virtual public gc
+{
+public:
+ inline gc_cleanup();
+ inline virtual ~gc_cleanup();
+
+private:
+ inline static void GC_cdecl cleanup(void* obj, void* clientData);
+};
+
+extern "C" {
+ typedef void (GC_CALLBACK * GCCleanUpFunc)(void* obj, void* clientData);
+}
+
+#ifdef GC_NAMESPACE
+}
+#endif
+
+#ifdef _MSC_VER
+ // Disable warning that "no matching operator delete found; memory will
+ // not be freed if initialization throws an exception"
+# pragma warning(disable:4291)
+ // TODO: "non-member operator new or delete may not be declared inline"
+ // warning is disabled for now.
+# pragma warning(disable:4595)
+#endif
+
+inline void* operator new(size_t size, GC_NS_QUALIFY(GCPlacement) gcp,
+ GC_NS_QUALIFY(GCCleanUpFunc) /* cleanup */ = 0,
+ void* /* clientData */ = 0);
+ // Allocates a collectible or uncollectible object, according to the
+ // value of "gcp".
+ //
+ // For collectible objects, if "cleanup" is non-null, then when the
+ // allocated object "obj" becomes inaccessible, the collector will
+ // invoke the function "cleanup(obj, clientData)" but will not
+ // invoke the object's destructors. It is an error to explicitly
+ // delete an object allocated with a non-null "cleanup".
+ //
+ // It is an error to specify a non-null "cleanup" with NoGC or for
+ // classes derived from "gc_cleanup" or containing members derived
+ // from "gc_cleanup".
+
+#ifdef GC_PLACEMENT_DELETE
+ inline void operator delete(void*, GC_NS_QUALIFY(GCPlacement),
+ GC_NS_QUALIFY(GCCleanUpFunc),
+ void*) GC_NOEXCEPT;
+#endif
+
+#ifndef GC_NO_INLINE_STD_NEW
+
+#if defined(_MSC_VER) || defined(__DMC__) \
+ || ((defined(__BORLANDC__) || defined(__CYGWIN__) \
+ || defined(__CYGWIN32__) || defined(__MINGW32__) \
+ || defined(__WATCOMC__)) \
+ && !defined(GC_BUILD) && !defined(GC_NOT_DLL))
+ // Inlining done to avoid mix up of new and delete operators by VC++ 9 (due
+ // to arbitrary ordering during linking).
+
+# ifdef GC_OPERATOR_NEW_ARRAY
+ inline void* operator new[](size_t size) GC_DECL_NEW_THROW
+ {
+ void* obj = GC_MALLOC_UNCOLLECTABLE(size);
+ GC_OP_NEW_OOM_CHECK(obj);
+ return obj;
+ }
+
+ inline void operator delete[](void* obj) GC_NOEXCEPT
+ {
+ GC_FREE(obj);
+ }
+# endif
+
+ inline void* operator new(size_t size) GC_DECL_NEW_THROW
+ {
+ void* obj = GC_MALLOC_UNCOLLECTABLE(size);
+ GC_OP_NEW_OOM_CHECK(obj);
+ return obj;
+ }
+
+ inline void operator delete(void* obj) GC_NOEXCEPT
+ {
+ GC_FREE(obj);
+ }
+
+# if __cplusplus >= 201402L || _MSVC_LANG >= 201402L // C++14
+ inline void operator delete(void* obj, size_t size) GC_NOEXCEPT {
+ (void)size; // size is ignored
+ GC_FREE(obj);
+ }
+
+# if defined(GC_OPERATOR_NEW_ARRAY)
+ inline void operator delete[](void* obj, size_t size) GC_NOEXCEPT {
+ (void)size;
+ GC_FREE(obj);
+ }
+# endif
+# endif // C++14
+#endif
+
+#ifdef _MSC_VER
+
+ // This new operator is used by VC++ in case of Debug builds:
+# ifdef GC_DEBUG
+ inline void* operator new(size_t size, int /* nBlockUse */,
+ const char* szFileName, int nLine)
+ {
+ void* obj = GC_debug_malloc_uncollectable(size, szFileName, nLine);
+ GC_OP_NEW_OOM_CHECK(obj);
+ return obj;
+ }
+# else
+ inline void* operator new(size_t size, int /* nBlockUse */,
+ const char* /* szFileName */, int /* nLine */)
+ {
+ void* obj = GC_malloc_uncollectable(size);
+ GC_OP_NEW_OOM_CHECK(obj);
+ return obj;
+ }
+# endif /* !GC_DEBUG */
+
+# ifdef GC_OPERATOR_NEW_ARRAY
+ // This new operator is used by VC++ 7+ in Debug builds:
+ inline void* operator new[](size_t size, int nBlockUse,
+ const char* szFileName, int nLine)
+ {
+ return operator new(size, nBlockUse, szFileName, nLine);
+ }
+# endif
+
+#endif // _MSC_VER
+
+#elif defined(_MSC_VER)
+ // The following ensures that the system default operator new[] does not
+ // get undefined, which is what seems to happen on VC++ 6 for some reason
+ // if we define a multi-argument operator new[].
+ // There seems to be no way to redirect new in this environment without
+ // including this everywhere.
+# ifdef GC_OPERATOR_NEW_ARRAY
+ void *operator new[](size_t size) GC_DECL_NEW_THROW;
+ void operator delete[](void* obj) GC_NOEXCEPT;
+
+ void* operator new[](size_t size, int /* nBlockUse */,
+ const char * szFileName, int nLine);
+# endif // GC_OPERATOR_NEW_ARRAY
+
+ void* operator new(size_t size) GC_DECL_NEW_THROW;
+ void operator delete(void* obj) GC_NOEXCEPT;
+
+ void* operator new(size_t size, int /* nBlockUse */,
+ const char * szFileName, int nLine);
+#endif // GC_NO_INLINE_STD_NEW && _MSC_VER
+
+#ifdef GC_OPERATOR_NEW_ARRAY
+ // The operator new for arrays, identical to the above.
+ inline void* operator new[](size_t size, GC_NS_QUALIFY(GCPlacement) gcp,
+ GC_NS_QUALIFY(GCCleanUpFunc) /* cleanup */ = 0,
+ void* /* clientData */ = 0);
+#endif // GC_OPERATOR_NEW_ARRAY
+
+/* Inline implementation */
+
+#ifdef GC_NAMESPACE
+namespace boehmgc
+{
+#endif
+
+inline void* gc::operator new(size_t size)
+{
+ void* obj = GC_MALLOC(size);
+ GC_OP_NEW_OOM_CHECK(obj);
+ return obj;
+}
+
+inline void* gc::operator new(size_t size, GCPlacement gcp)
+{
+ void* obj;
+ switch (gcp) {
+ case UseGC:
+ obj = GC_MALLOC(size);
+ break;
+ case PointerFreeGC:
+ obj = GC_MALLOC_ATOMIC(size);
+ break;
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+ case PointerFreeNoGC:
+ obj = GC_MALLOC_ATOMIC_UNCOLLECTABLE(size);
+ break;
+# endif
+ case NoGC:
+ default:
+ obj = GC_MALLOC_UNCOLLECTABLE(size);
+ }
+ GC_OP_NEW_OOM_CHECK(obj);
+ return obj;
+}
+
+inline void* gc::operator new(size_t /* size */, void* p) GC_NOEXCEPT
+{
+ return p;
+}
+
+inline void gc::operator delete(void* obj) GC_NOEXCEPT
+{
+ GC_FREE(obj);
+}
+
+#ifdef GC_PLACEMENT_DELETE
+ inline void gc::operator delete(void*, void*) GC_NOEXCEPT {}
+
+ inline void gc::operator delete(void* p, GCPlacement /* gcp */) GC_NOEXCEPT
+ {
+ GC_FREE(p);
+ }
+#endif // GC_PLACEMENT_DELETE
+
+#ifdef GC_OPERATOR_NEW_ARRAY
+ inline void* gc::operator new[](size_t size)
+ {
+ return gc::operator new(size);
+ }
+
+ inline void* gc::operator new[](size_t size, GCPlacement gcp)
+ {
+ return gc::operator new(size, gcp);
+ }
+
+ inline void* gc::operator new[](size_t /* size */, void* p) GC_NOEXCEPT
+ {
+ return p;
+ }
+
+ inline void gc::operator delete[](void* obj) GC_NOEXCEPT
+ {
+ gc::operator delete(obj);
+ }
+
+# ifdef GC_PLACEMENT_DELETE
+ inline void gc::operator delete[](void*, void*) GC_NOEXCEPT {}
+
+ inline void gc::operator delete[](void* p,
+ GCPlacement /* gcp */) GC_NOEXCEPT
+ {
+ gc::operator delete(p);
+ }
+# endif
+#endif // GC_OPERATOR_NEW_ARRAY
+
+inline gc_cleanup::~gc_cleanup()
+{
+# ifndef GC_NO_FINALIZATION
+ void* base = GC_base(this);
+ if (0 == base) return; // Non-heap object.
+ GC_register_finalizer_ignore_self(base, 0, 0, 0, 0);
+# endif
+}
+
+inline void GC_CALLBACK gc_cleanup::cleanup(void* obj, void* displ)
+{
+ ((gc_cleanup*) ((char*) obj + (ptrdiff_t) displ))->~gc_cleanup();
+}
+
+inline gc_cleanup::gc_cleanup()
+{
+# ifndef GC_NO_FINALIZATION
+ GC_finalization_proc oldProc = 0;
+ void* oldData = NULL; // to avoid "might be uninitialized" compiler warning
+ void* this_ptr = (void*)this;
+ void* base = GC_base(this_ptr);
+ if (base != 0) {
+ // Don't call the debug version, since this is a real base address.
+ GC_register_finalizer_ignore_self(base, (GC_finalization_proc) cleanup,
+ (void*)((char*)this_ptr-(char*)base),
+ &oldProc, &oldData);
+ if (oldProc != 0) {
+ GC_register_finalizer_ignore_self(base, oldProc, oldData, 0, 0);
+ }
+ }
+# elif defined(CPPCHECK)
+ (void)cleanup;
+# endif
+}
+
+#ifdef GC_NAMESPACE
+}
+#endif
+
+inline void* operator new(size_t size, GC_NS_QUALIFY(GCPlacement) gcp,
+ GC_NS_QUALIFY(GCCleanUpFunc) cleanup,
+ void* clientData)
+{
+ void* obj;
+ switch (gcp) {
+ case GC_NS_QUALIFY(UseGC):
+ obj = GC_MALLOC(size);
+# ifndef GC_NO_FINALIZATION
+ if (cleanup != 0 && obj != 0) {
+ GC_REGISTER_FINALIZER_IGNORE_SELF(obj, cleanup, clientData, 0, 0);
+ }
+# else
+ (void)cleanup;
+ (void)clientData;
+# endif
+ break;
+ case GC_NS_QUALIFY(PointerFreeGC):
+ obj = GC_MALLOC_ATOMIC(size);
+ break;
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+ case GC_NS_QUALIFY(PointerFreeNoGC):
+ obj = GC_MALLOC_ATOMIC_UNCOLLECTABLE(size);
+ break;
+# endif
+ case GC_NS_QUALIFY(NoGC):
+ default:
+ obj = GC_MALLOC_UNCOLLECTABLE(size);
+ }
+ GC_OP_NEW_OOM_CHECK(obj);
+ return obj;
+}
+
+#ifdef GC_PLACEMENT_DELETE
+ inline void operator delete(void* p, GC_NS_QUALIFY(GCPlacement) /* gcp */,
+ GC_NS_QUALIFY(GCCleanUpFunc) /* cleanup */,
+ void* /* clientData */) GC_NOEXCEPT
+ {
+ GC_FREE(p);
+ }
+#endif // GC_PLACEMENT_DELETE
+
+#ifdef GC_OPERATOR_NEW_ARRAY
+ inline void* operator new[](size_t size, GC_NS_QUALIFY(GCPlacement) gcp,
+ GC_NS_QUALIFY(GCCleanUpFunc) cleanup,
+ void* clientData)
+ {
+ return ::operator new(size, gcp, cleanup, clientData);
+ }
+#endif // GC_OPERATOR_NEW_ARRAY
+
+#endif /* GC_CPP_H */
diff --git a/graphics/asymptote/gc/include/gc_disclaim.h b/graphics/asymptote/gc/include/gc_disclaim.h
new file mode 100644
index 0000000000..785182b5e7
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_disclaim.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2007-2011 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef GC_DISCLAIM_H
+#define GC_DISCLAIM_H
+
+#include "gc.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* This API is defined only if the library has been suitably compiled */
+/* (i.e. with ENABLE_DISCLAIM defined). */
+
+/* Prepare the object kind used by GC_finalized_malloc. Call it from */
+/* your initialization code or, at least, at some point before using */
+/* finalized allocations. The function is thread-safe. */
+GC_API void GC_CALL GC_init_finalized_malloc(void);
+
+/* Type of a disclaim call-back. Called with the allocation lock held. */
+typedef int (GC_CALLBACK * GC_disclaim_proc)(void * /*obj*/);
+
+/* Register "proc" to be called on each object of "kind" ready to be */
+/* reclaimed. If "proc" returns non-zero, the collector will not */
+/* reclaim the object on this GC cycle ("proc" should not try to */
+/* resurrect the object otherwise). Objects reachable from "proc" */
+/* (including the referred closure object) will be protected from */
+/* collection if "mark_from_all" is non-zero, but at the expense that */
+/* long chains of objects will take many cycles to reclaim. */
+/* Calls to GC_free() will free its argument without inquiring "proc". */
+/* No-op in the leak-finding mode. */
+GC_API void GC_CALL GC_register_disclaim_proc(int /*kind*/,
+ GC_disclaim_proc /*proc*/,
+ int /*mark_from_all*/);
+
+/* The finalizer closure used by GC_finalized_malloc. */
+struct GC_finalizer_closure {
+ GC_finalization_proc proc;
+ void *cd;
+};
+
+/* Allocate "size" bytes which is finalized by "fc". This uses a */
+/* dedicated object kind with a disclaim procedure, and is more */
+/* efficient than GC_register_finalizer and friends. */
+/* GC_init_finalized_malloc must be called before using this. */
+/* The collector will reclaim the object during this GC cycle (thus, */
+/* "proc" should not try to resurrect the object). The other objects */
+/* reachable from "proc" (including the closure object in case it is */
+/* a heap-allocated one) will be protected from collection. */
+/* Note that GC_size (applied to such allocated object) returns a value */
+/* slightly bigger than the specified allocation size, and that GC_base */
+/* result points to a word prior to the start of the allocated object. */
+/* The disclaim procedure is not invoked in the leak-finding mode. */
+/* There is no debugging version of this allocation API. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_finalized_malloc(size_t /*size*/,
+ const struct GC_finalizer_closure * /*fc*/) GC_ATTR_NONNULL(2);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif
diff --git a/graphics/asymptote/gc/include/gc_gcj.h b/graphics/asymptote/gc/include/gc_gcj.h
new file mode 100644
index 0000000000..4dbf0220f0
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_gcj.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright 1999 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* This file assumes the collector has been compiled with GC_GCJ_SUPPORT. */
+
+/*
+ * We allocate objects whose first word contains a pointer to a struct
+ * describing the object type. This struct contains a garbage collector mark
+ * descriptor at offset MARK_DESCR_OFFSET. Alternatively, the objects
+ * may be marked by the mark procedure passed to GC_init_gcj_malloc.
+ */
+
+#ifndef GC_GCJ_H
+#define GC_GCJ_H
+
+ /* Gcj keeps GC descriptor as second word of vtable. This */
+ /* probably needs to be adjusted for other clients. */
+ /* We currently assume that this offset is such that: */
+ /* - all objects of this kind are large enough to have */
+ /* a value at that offset, and */
+ /* - it is not zero. */
+ /* These assumptions allow objects on the free list to be */
+ /* marked normally. */
+
+#ifndef GC_H
+# include "gc.h"
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* The following allocators signal an out of memory condition with */
+/* return GC_oom_fn(bytes); */
+
+/* The following function must be called before the gcj allocators */
+/* can be invoked. */
+/* mp_index and mp are the index and mark_proc (see gc_mark.h) */
+/* respectively for the allocated objects. Mark_proc will be */
+/* used to build the descriptor for objects allocated through the */
+/* debugging interface. The mark_proc will be invoked on all such */
+/* objects with an "environment" value of 1. The client may choose */
+/* to use the same mark_proc for some of its generated mark descriptors.*/
+/* In that case, it should use a different "environment" value to */
+/* detect the presence or absence of the debug header. */
+/* Mp is really of type mark_proc, as defined in gc_mark.h. We don't */
+/* want to include that here for namespace pollution reasons. */
+/* Passing in mp_index here instead of having GC_init_gcj_malloc() */
+/* internally call GC_new_proc() is quite ugly, but in typical usage */
+/* scenarios a compiler also has to know about mp_index, so */
+/* generating it dynamically is not acceptable. Mp_index will */
+/* typically be an integer < RESERVED_MARK_PROCS, so that it doesn't */
+/* collide with GC_new_proc allocated indices. If the application */
+/* needs no other reserved indices, zero */
+/* (GC_GCJ_RESERVED_MARK_PROC_INDEX in gc_mark.h) is an obvious choice. */
+GC_API void GC_CALL GC_init_gcj_malloc(int /* mp_index */,
+ void * /* really mark_proc */ /* mp */);
+
+/* Allocate an object, clear it, and store the pointer to the */
+/* type structure (vtable in gcj). */
+/* This adds a byte at the end of the object if GC_malloc would.*/
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_gcj_malloc(size_t /* lb */,
+ void * /* ptr_to_struct_containing_descr */);
+
+/* The debug versions allocate such that the specified mark_proc */
+/* is always invoked. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_debug_gcj_malloc(size_t /* lb */,
+ void * /* ptr_to_struct_containing_descr */,
+ GC_EXTRA_PARAMS);
+
+/* Similar to GC_gcj_malloc, but assumes that a pointer to near the */
+/* beginning (i.e. within the first heap block) of the allocated object */
+/* is always maintained. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_gcj_malloc_ignore_off_page(size_t /* lb */,
+ void * /* ptr_to_struct_containing_descr */);
+
+/* The kind numbers of normal and debug gcj objects. */
+/* Useful only for debug support, we hope. */
+GC_API int GC_gcj_kind;
+
+GC_API int GC_gcj_debug_kind;
+
+#ifdef GC_DEBUG
+# define GC_GCJ_MALLOC(s,d) GC_debug_gcj_malloc(s,d,GC_EXTRAS)
+# define GC_GCJ_MALLOC_IGNORE_OFF_PAGE(s,d) GC_debug_gcj_malloc(s,d,GC_EXTRAS)
+#else
+# define GC_GCJ_MALLOC(s,d) GC_gcj_malloc(s,d)
+# define GC_GCJ_MALLOC_IGNORE_OFF_PAGE(s,d) GC_gcj_malloc_ignore_off_page(s,d)
+#endif
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* GC_GCJ_H */
diff --git a/graphics/asymptote/gc/include/gc_inline.h b/graphics/asymptote/gc/include/gc_inline.h
new file mode 100644
index 0000000000..a2aa5e6c35
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_inline.h
@@ -0,0 +1,209 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 2005 Hewlett-Packard Development Company, L.P.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_INLINE_H
+#define GC_INLINE_H
+
+/* WARNING: */
+/* Note that for these routines, it is the clients responsibility to */
+/* add the extra byte at the end to deal with one-past-the-end pointers.*/
+/* In the standard collector configuration, the collector assumes that */
+/* such a byte has been added, and hence does not trace the last word */
+/* in the resulting object. */
+/* This is not an issue if the collector is compiled with */
+/* DONT_ADD_BYTE_AT_END, or if GC_all_interior_pointers is not set. */
+/* This interface is most useful for compilers that generate C. */
+/* It is also used internally for thread-local allocation. */
+/* Manual use is hereby discouraged. */
+/* There is no debugging version of this allocation API. */
+
+#include "gc.h"
+#include "gc_tiny_fl.h"
+
+#if GC_GNUC_PREREQ(3, 0)
+# define GC_EXPECT(expr, outcome) __builtin_expect(expr,outcome)
+ /* Equivalent to (expr), but predict that usually (expr)==outcome. */
+#else
+# define GC_EXPECT(expr, outcome) (expr)
+#endif
+
+#ifndef GC_ASSERT
+# ifdef NDEBUG
+# define GC_ASSERT(expr) /* empty */
+# else
+# include <assert.h>
+# define GC_ASSERT(expr) assert(expr)
+# endif
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifndef GC_PREFETCH_FOR_WRITE
+# if GC_GNUC_PREREQ(3, 0) && !defined(GC_NO_PREFETCH_FOR_WRITE)
+# define GC_PREFETCH_FOR_WRITE(x) __builtin_prefetch((x), 1)
+# else
+# define GC_PREFETCH_FOR_WRITE(x) (void)0
+# endif
+#endif
+
+/* Object kinds; must match PTRFREE, NORMAL in gc_priv.h. */
+#define GC_I_PTRFREE 0
+#define GC_I_NORMAL 1
+
+/* Store a pointer to a list of newly allocated objects of kind k and */
+/* size lb in *result. The caller must make sure that *result is */
+/* traced even if objects are ptrfree. */
+GC_API void GC_CALL GC_generic_malloc_many(size_t /* lb */, int /* k */,
+ void ** /* result */);
+
+/* Generalized version of GC_malloc and GC_malloc_atomic. */
+/* Uses appropriately the thread-local (if available) or the global */
+/* free-list of the specified kind. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_malloc_kind(size_t /* lb */, int /* k */);
+
+#ifdef GC_THREADS
+ /* Same as above but uses only the global free-list. */
+ GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_malloc_kind_global(size_t /* lb */, int /* k */);
+#else
+# define GC_malloc_kind_global GC_malloc_kind
+#endif
+
+/* An internal macro to update the free list pointer atomically (if */
+/* the AO primitives are available) to avoid race with the marker. */
+#if defined(GC_THREADS) && defined(AO_HAVE_store)
+# define GC_FAST_M_AO_STORE(my_fl, next) \
+ AO_store((volatile AO_t *)(my_fl), (AO_t)(next))
+#else
+# define GC_FAST_M_AO_STORE(my_fl, next) (void)(*(my_fl) = (next))
+#endif
+
+/* The ultimately general inline allocation macro. Allocate an object */
+/* of size granules, putting the resulting pointer in result. Tiny_fl */
+/* is a "tiny" free list array, which will be used first, if the size */
+/* is appropriate. If granules argument is too large, we allocate with */
+/* default_expr instead. If we need to refill the free list, we use */
+/* GC_generic_malloc_many with the indicated kind. */
+/* Tiny_fl should be an array of GC_TINY_FREELISTS void * pointers. */
+/* If num_direct is nonzero, and the individual free list pointers */
+/* are initialized to (void *)1, then we allocate num_direct granules */
+/* directly using generic_malloc before putting multiple objects into */
+/* the tiny_fl entry. If num_direct is zero, then the free lists may */
+/* also be initialized to (void *)0. */
+/* Note that we use the zeroth free list to hold objects 1 granule in */
+/* size that are used to satisfy size 0 allocation requests. */
+/* We rely on much of this hopefully getting optimized away in the */
+/* num_direct = 0 case. */
+/* Particularly, if granules argument is constant, this should generate */
+/* a small amount of code. */
+# define GC_FAST_MALLOC_GRANS(result,granules,tiny_fl,num_direct, \
+ kind,default_expr,init) \
+ do { \
+ if (GC_EXPECT((granules) >= GC_TINY_FREELISTS,0)) { \
+ result = (default_expr); \
+ } else { \
+ void **my_fl = (tiny_fl) + (granules); \
+ void *my_entry=*my_fl; \
+ void *next; \
+ \
+ for (;;) { \
+ if (GC_EXPECT((GC_word)my_entry \
+ > (num_direct) + GC_TINY_FREELISTS + 1, 1)) { \
+ next = *(void **)(my_entry); \
+ result = (void *)my_entry; \
+ GC_FAST_M_AO_STORE(my_fl, next); \
+ init; \
+ GC_PREFETCH_FOR_WRITE(next); \
+ if ((kind) != GC_I_PTRFREE) { \
+ GC_end_stubborn_change(my_fl); \
+ GC_reachable_here(next); \
+ } \
+ GC_ASSERT(GC_size(result) >= (granules)*GC_GRANULE_BYTES); \
+ GC_ASSERT((kind) == GC_I_PTRFREE \
+ || ((GC_word *)result)[1] == 0); \
+ break; \
+ } \
+ /* Entry contains counter or NULL */ \
+ if ((GC_signed_word)my_entry - (GC_signed_word)(num_direct) <= 0 \
+ /* (GC_word)my_entry <= (num_direct) */ \
+ && my_entry != 0 /* NULL */) { \
+ /* Small counter value, not NULL */ \
+ GC_FAST_M_AO_STORE(my_fl, (char *)my_entry \
+ + (granules) + 1); \
+ result = (default_expr); \
+ break; \
+ } else { \
+ /* Large counter or NULL */ \
+ GC_generic_malloc_many(((granules) == 0? GC_GRANULE_BYTES : \
+ GC_RAW_BYTES_FROM_INDEX(granules)), \
+ kind, my_fl); \
+ my_entry = *my_fl; \
+ if (my_entry == 0) { \
+ result = (*GC_get_oom_fn())((granules)*GC_GRANULE_BYTES); \
+ break; \
+ } \
+ } \
+ } \
+ } \
+ } while (0)
+
+# define GC_WORDS_TO_WHOLE_GRANULES(n) \
+ GC_WORDS_TO_GRANULES((n) + GC_GRANULE_WORDS - 1)
+
+/* Allocate n words (NOT BYTES). X is made to point to the result. */
+/* This should really only be used if GC_all_interior_pointers is */
+/* not set, or DONT_ADD_BYTE_AT_END is set. See above. */
+/* Does not acquire lock. The caller is responsible for supplying */
+/* a cleared tiny_fl free list array. For single-threaded */
+/* applications, this may be a global array. */
+# define GC_MALLOC_WORDS_KIND(result,n,tiny_fl,kind,init) \
+ do { \
+ size_t granules = GC_WORDS_TO_WHOLE_GRANULES(n); \
+ GC_FAST_MALLOC_GRANS(result, granules, tiny_fl, 0, kind, \
+ GC_malloc_kind(granules*GC_GRANULE_BYTES, kind), \
+ init); \
+ } while (0)
+
+# define GC_MALLOC_WORDS(result,n,tiny_fl) \
+ GC_MALLOC_WORDS_KIND(result, n, tiny_fl, GC_I_NORMAL, \
+ *(void **)(result) = 0)
+
+# define GC_MALLOC_ATOMIC_WORDS(result,n,tiny_fl) \
+ GC_MALLOC_WORDS_KIND(result, n, tiny_fl, GC_I_PTRFREE, (void)0)
+
+/* And once more for two word initialized objects: */
+# define GC_CONS(result, first, second, tiny_fl) \
+ do { \
+ void *l = (void *)(first); \
+ void *r = (void *)(second); \
+ GC_MALLOC_WORDS_KIND(result, 2, tiny_fl, GC_I_NORMAL, (void)0); \
+ if ((result) != 0 /* NULL */) { \
+ *(void **)(result) = l; \
+ GC_ptr_store_and_dirty((void **)(result) + 1, r); \
+ GC_reachable_here(l); \
+ } \
+ } while (0)
+
+GC_API void GC_CALL GC_print_free_list(int /* kind */,
+ size_t /* sz_in_granules */);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* !GC_INLINE_H */
diff --git a/graphics/asymptote/gc/include/gc_mark.h b/graphics/asymptote/gc/include/gc_mark.h
new file mode 100644
index 0000000000..215e41c5b5
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_mark.h
@@ -0,0 +1,333 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 2001 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ * This contains interfaces to the GC marker that are likely to be useful to
+ * clients that provide detailed heap layout information to the collector.
+ * This interface should not be used by normal C or C++ clients.
+ * It will be useful to runtimes for other languages.
+ *
+ * This is an experts-only interface! There are many ways to break the
+ * collector in subtle ways by using this functionality.
+ */
+#ifndef GC_MARK_H
+#define GC_MARK_H
+
+#ifndef GC_H
+# include "gc.h"
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#define GC_PROC_BYTES 100
+
+#if defined(GC_BUILD) || defined(NOT_GCBUILD)
+ struct GC_ms_entry;
+#else
+ struct GC_ms_entry { void *opaque; };
+#endif
+
+/* A client supplied mark procedure. Returns new mark stack pointer. */
+/* Primary effect should be to push new entries on the mark stack. */
+/* Mark stack pointer values are passed and returned explicitly. */
+/* Global variables describing mark stack are not necessarily valid. */
+/* (This usually saves a few cycles by keeping things in registers.) */
+/* Assumed to scan about GC_PROC_BYTES on average. If it needs to do */
+/* much more work than that, it should do it in smaller pieces by */
+/* pushing itself back on the mark stack. */
+/* Note that it should always do some work (defined as marking some */
+/* objects) before pushing more than one entry on the mark stack. */
+/* This is required to ensure termination in the event of mark stack */
+/* overflows. */
+/* This procedure is always called with at least one empty entry on the */
+/* mark stack. */
+/* Currently we require that mark procedures look for pointers in a */
+/* subset of the places the conservative marker would. It must be safe */
+/* to invoke the normal mark procedure instead. */
+/* WARNING: Such a mark procedure may be invoked on an unused object */
+/* residing on a free list. Such objects are cleared, except for a */
+/* free list link field in the first word. Thus mark procedures may */
+/* not count on the presence of a type descriptor, and must handle this */
+/* case correctly somehow. Also, a mark procedure should be prepared */
+/* to be executed concurrently from the marker threads (the later ones */
+/* are created only if the client has called GC_start_mark_threads() */
+/* or started a user thread previously). */
+typedef struct GC_ms_entry * (*GC_mark_proc)(GC_word * /* addr */,
+ struct GC_ms_entry * /* mark_stack_ptr */,
+ struct GC_ms_entry * /* mark_stack_limit */,
+ GC_word /* env */);
+
+#define GC_LOG_MAX_MARK_PROCS 6
+#define GC_MAX_MARK_PROCS (1 << GC_LOG_MAX_MARK_PROCS)
+
+/* In a few cases it's necessary to assign statically known indices to */
+/* certain mark procs. Thus we reserve a few for well known clients. */
+/* (This is necessary if mark descriptors are compiler generated.) */
+#define GC_RESERVED_MARK_PROCS 8
+#define GC_GCJ_RESERVED_MARK_PROC_INDEX 0
+
+/* Object descriptors on mark stack or in objects. Low order two */
+/* bits are tags distinguishing among the following 4 possibilities */
+/* for the rest (high order) bits. */
+#define GC_DS_TAG_BITS 2
+#define GC_DS_TAGS ((1 << GC_DS_TAG_BITS) - 1)
+#define GC_DS_LENGTH 0 /* The entire word is a length in bytes that */
+ /* must be a multiple of 4. */
+#define GC_DS_BITMAP 1 /* The high order bits are describing pointer */
+ /* fields. The most significant bit is set if */
+ /* the first word is a pointer. */
+ /* (This unconventional ordering sometimes */
+ /* makes the marker slightly faster.) */
+ /* Zeroes indicate definite nonpointers. Ones */
+ /* indicate possible pointers. */
+ /* Only usable if pointers are word aligned. */
+#define GC_DS_PROC 2
+ /* The objects referenced by this object can be */
+ /* pushed on the mark stack by invoking */
+ /* PROC(descr). ENV(descr) is passed as the */
+ /* last argument. */
+#define GC_MAKE_PROC(proc_index, env) \
+ ((((((GC_word)(env)) << GC_LOG_MAX_MARK_PROCS) \
+ | (proc_index)) << GC_DS_TAG_BITS) | GC_DS_PROC)
+#define GC_DS_PER_OBJECT 3 /* The real descriptor is at the */
+ /* byte displacement from the beginning of the */
+ /* object given by descr & ~GC_DS_TAGS. */
+ /* If the descriptor is negative, the real */
+ /* descriptor is at (*<object_start>) - */
+ /* (descr&~GC_DS_TAGS) - GC_INDIR_PER_OBJ_BIAS */
+ /* The latter alternative can be used if each */
+ /* object contains a type descriptor in the */
+ /* first word. */
+ /* Note that in the multi-threaded environments */
+ /* per-object descriptors must be located in */
+ /* either the first two or last two words of */
+ /* the object, since only those are guaranteed */
+ /* to be cleared while the allocation lock is */
+ /* held. */
+#define GC_INDIR_PER_OBJ_BIAS 0x10
+
+GC_API void * GC_least_plausible_heap_addr;
+GC_API void * GC_greatest_plausible_heap_addr;
+ /* Bounds on the heap. Guaranteed valid */
+ /* Likely to include future heap expansion. */
+ /* Hence usually includes not-yet-mapped */
+ /* memory, or might overlap with other data */
+ /* roots. */
+
+/* Handle nested references in a custom mark procedure. */
+/* Check if obj is a valid object. If so, ensure that it is marked. */
+/* If it was not previously marked, push its contents onto the mark */
+/* stack for future scanning. The object will then be scanned using */
+/* its mark descriptor. */
+/* Returns the new mark stack pointer. */
+/* Handles mark stack overflows correctly. */
+/* Since this marks first, it makes progress even if there are mark */
+/* stack overflows. */
+/* Src is the address of the pointer to obj, which is used only */
+/* for back pointer-based heap debugging. */
+/* It is strongly recommended that most objects be handled without mark */
+/* procedures, e.g. with bitmap descriptors, and that mark procedures */
+/* be reserved for exceptional cases. That will ensure that */
+/* performance of this call is not extremely performance critical. */
+/* (Otherwise we would need to inline GC_mark_and_push completely, */
+/* which would tie the client code to a fixed collector version.) */
+/* Note that mark procedures should explicitly call FIXUP_POINTER() */
+/* if required. */
+GC_API struct GC_ms_entry * GC_CALL GC_mark_and_push(void * /* obj */,
+ struct GC_ms_entry * /* mark_stack_ptr */,
+ struct GC_ms_entry * /* mark_stack_limit */,
+ void ** /* src */);
+
+#define GC_MARK_AND_PUSH(obj, msp, lim, src) \
+ ((GC_word)(obj) >= (GC_word)GC_least_plausible_heap_addr && \
+ (GC_word)(obj) <= (GC_word)GC_greatest_plausible_heap_addr ? \
+ GC_mark_and_push(obj, msp, lim, src) : (msp))
+
+/* The size of the header added to objects allocated through the */
+/* GC_debug routines. Defined as a function so that client mark */
+/* procedures do not need to be recompiled for the collector library */
+/* version changes. */
+GC_API GC_ATTR_CONST size_t GC_CALL GC_get_debug_header_size(void);
+#define GC_USR_PTR_FROM_BASE(p) \
+ ((void *)((char *)(p) + GC_get_debug_header_size()))
+
+/* The same but defined as a variable. Exists only for the backward */
+/* compatibility. Some compilers do not accept "const" together with */
+/* deprecated or dllimport attributes, so the symbol is exported as */
+/* a non-constant one. */
+GC_API GC_ATTR_DEPRECATED
+# ifdef GC_BUILD
+ const
+# endif
+ size_t GC_debug_header_size;
+
+/* And some routines to support creation of new "kinds", e.g. with */
+/* custom mark procedures, by language runtimes. */
+/* The _inner versions assume the caller holds the allocation lock. */
+
+/* Return a new free list array. */
+GC_API void ** GC_CALL GC_new_free_list(void);
+GC_API void ** GC_CALL GC_new_free_list_inner(void);
+
+/* Return a new kind, as specified. */
+GC_API unsigned GC_CALL GC_new_kind(void ** /* free_list */,
+ GC_word /* mark_descriptor_template */,
+ int /* add_size_to_descriptor */,
+ int /* clear_new_objects */) GC_ATTR_NONNULL(1);
+ /* The last two parameters must be zero or one. */
+GC_API unsigned GC_CALL GC_new_kind_inner(void ** /* free_list */,
+ GC_word /* mark_descriptor_template */,
+ int /* add_size_to_descriptor */,
+ int /* clear_new_objects */) GC_ATTR_NONNULL(1);
+
+/* Return a new mark procedure identifier, suitable for use as */
+/* the first argument in GC_MAKE_PROC. */
+GC_API unsigned GC_CALL GC_new_proc(GC_mark_proc);
+GC_API unsigned GC_CALL GC_new_proc_inner(GC_mark_proc);
+
+/* Allocate an object of a given kind. By default, there are only */
+/* a few kinds: composite (pointerful), atomic, uncollectible, etc. */
+/* We claim it is possible for clever client code that understands the */
+/* GC internals to add more, e.g. to communicate object layout */
+/* information to the collector. Note that in the multi-threaded */
+/* contexts, this is usually unsafe for kinds that have the descriptor */
+/* in the object itself, since there is otherwise a window in which */
+/* the descriptor is not correct. Even in the single-threaded case, */
+/* we need to be sure that cleared objects on a free list don't */
+/* cause a GC crash if they are accidentally traced. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL GC_generic_malloc(
+ size_t /* lb */,
+ int /* knd */);
+
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_generic_malloc_ignore_off_page(
+ size_t /* lb */, int /* knd */);
+ /* As above, but pointers to past the */
+ /* first hblk of the resulting object */
+ /* are ignored. */
+
+/* Generalized version of GC_malloc_[atomic_]uncollectable. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_generic_malloc_uncollectable(
+ size_t /* lb */, int /* knd */);
+
+/* Same as above but primary for allocating an object of the same kind */
+/* as an existing one (kind obtained by GC_get_kind_and_size). */
+/* Not suitable for GCJ and typed-malloc kinds. */
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_generic_or_special_malloc(
+ size_t /* size */, int /* knd */);
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_debug_generic_or_special_malloc(
+ size_t /* size */, int /* knd */,
+ GC_EXTRA_PARAMS);
+
+#ifdef GC_DEBUG
+# define GC_GENERIC_OR_SPECIAL_MALLOC(sz, knd) \
+ GC_debug_generic_or_special_malloc(sz, knd, GC_EXTRAS)
+#else
+# define GC_GENERIC_OR_SPECIAL_MALLOC(sz, knd) \
+ GC_generic_or_special_malloc(sz, knd)
+#endif /* !GC_DEBUG */
+
+/* Similar to GC_size but returns object kind. Size is returned too */
+/* if psize is not NULL. The object pointer should not be NULL. */
+GC_API int GC_CALL GC_get_kind_and_size(const void *, size_t * /* psize */)
+ GC_ATTR_NONNULL(1);
+
+typedef void (GC_CALLBACK * GC_describe_type_fn)(void * /* p */,
+ char * /* out_buf */);
+ /* A procedure which */
+ /* produces a human-readable */
+ /* description of the "type" of object */
+ /* p into the buffer out_buf of length */
+ /* GC_TYPE_DESCR_LEN. This is used by */
+ /* the debug support when printing */
+ /* objects. */
+ /* These functions should be as robust */
+ /* as possible, though we do avoid */
+ /* invoking them on objects on the */
+ /* global free list. */
+#define GC_TYPE_DESCR_LEN 40
+
+GC_API void GC_CALL GC_register_describe_type_fn(int /* kind */,
+ GC_describe_type_fn);
+ /* Register a describe_type function */
+ /* to be used when printing objects */
+ /* of a particular kind. */
+
+/* Clear some of the inaccessible part of the stack. Returns its */
+/* argument, so it can be used in a tail call position, hence clearing */
+/* another frame. Argument may be NULL. */
+GC_API void * GC_CALL GC_clear_stack(void *);
+
+/* Set and get the client notifier on collections. The client function */
+/* is called at the start of every full GC (called with the allocation */
+/* lock held). May be 0. This is a really tricky interface to use */
+/* correctly. Unless you really understand the collector internals, */
+/* the callback should not, directly or indirectly, make any GC_ or */
+/* potentially blocking calls. In particular, it is not safe to */
+/* allocate memory using the garbage collector from within the callback */
+/* function. Both the setter and getter acquire the GC lock. */
+typedef void (GC_CALLBACK * GC_start_callback_proc)(void);
+GC_API void GC_CALL GC_set_start_callback(GC_start_callback_proc);
+GC_API GC_start_callback_proc GC_CALL GC_get_start_callback(void);
+
+/* Slow/general mark bit manipulation. The caller must hold the */
+/* allocation lock. GC_is_marked returns 1 (TRUE) or 0. */
+GC_API int GC_CALL GC_is_marked(const void *) GC_ATTR_NONNULL(1);
+GC_API void GC_CALL GC_clear_mark_bit(const void *) GC_ATTR_NONNULL(1);
+GC_API void GC_CALL GC_set_mark_bit(const void *) GC_ATTR_NONNULL(1);
+
+/* Push everything in the given range onto the mark stack. */
+/* (GC_push_conditional pushes either all or only dirty pages depending */
+/* on the third argument.) GC_push_all_eager also ensures that stack */
+/* is scanned immediately, not just scheduled for scanning. */
+GC_API void GC_CALL GC_push_all(void * /* bottom */, void * /* top */);
+GC_API void GC_CALL GC_push_all_eager(void * /* bottom */, void * /* top */);
+GC_API void GC_CALL GC_push_conditional(void * /* bottom */, void * /* top */,
+ int /* bool all */);
+GC_API void GC_CALL GC_push_finalizer_structures(void);
+
+/* Set and get the client push-other-roots procedure. A client */
+/* supplied procedure should also call the original procedure. */
+/* Note that both the setter and getter require some external */
+/* synchronization to avoid data race. */
+typedef void (GC_CALLBACK * GC_push_other_roots_proc)(void);
+GC_API void GC_CALL GC_set_push_other_roots(GC_push_other_roots_proc);
+GC_API GC_push_other_roots_proc GC_CALL GC_get_push_other_roots(void);
+
+/* Walk the GC heap visiting all reachable objects. Assume the caller */
+/* holds the allocation lock. Object base pointer, object size and */
+/* client custom data are passed to the callback (holding the lock). */
+typedef void (GC_CALLBACK *GC_reachable_object_proc)(void * /* obj */,
+ size_t /* bytes */,
+ void * /* client_data */);
+GC_API void GC_CALL GC_enumerate_reachable_objects_inner(
+ GC_reachable_object_proc,
+ void * /* client_data */) GC_ATTR_NONNULL(1);
+
+GC_API int GC_CALL GC_is_tmp_root(void *);
+
+GC_API void GC_CALL GC_print_trace(GC_word /* gc_no */);
+GC_API void GC_CALL GC_print_trace_inner(GC_word /* gc_no */);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* GC_MARK_H */
diff --git a/graphics/asymptote/gc/include/gc_pthread_redirects.h b/graphics/asymptote/gc/include/gc_pthread_redirects.h
new file mode 100644
index 0000000000..1cc0c96cba
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_pthread_redirects.h
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2010 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* Our pthread support normally needs to intercept a number of thread */
+/* calls. We arrange to do that here, if appropriate. */
+
+#ifndef GC_PTHREAD_REDIRECTS_H
+#define GC_PTHREAD_REDIRECTS_H
+
+/* Included from gc.h only. Included only if GC_PTHREADS. */
+#if defined(GC_H) && defined(GC_PTHREADS)
+
+/* We need to intercept calls to many of the threads primitives, so */
+/* that we can locate thread stacks and stop the world. */
+/* Note also that the collector cannot always see thread specific data. */
+/* Thread specific data should generally consist of pointers to */
+/* uncollectible objects (allocated with GC_malloc_uncollectable, */
+/* not the system malloc), which are deallocated using the destructor */
+/* facility in thr_keycreate. Alternatively, keep a redundant pointer */
+/* to thread specific data on the thread stack. */
+
+#ifndef GC_PTHREAD_REDIRECTS_ONLY
+
+# include <pthread.h>
+# ifndef GC_NO_DLOPEN
+# include <dlfcn.h>
+# endif
+# ifndef GC_NO_PTHREAD_SIGMASK
+# include <signal.h> /* needed anyway for proper redirection */
+# endif
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+
+# ifndef GC_SUSPEND_THREAD_ID
+# define GC_SUSPEND_THREAD_ID pthread_t
+# endif
+
+# ifndef GC_NO_DLOPEN
+ GC_API void *GC_dlopen(const char * /* path */, int /* mode */);
+# endif /* !GC_NO_DLOPEN */
+
+# ifndef GC_NO_PTHREAD_SIGMASK
+# if defined(GC_PTHREAD_SIGMASK_NEEDED) || defined(_BSD_SOURCE) \
+ || defined(_GNU_SOURCE) || defined(_NETBSD_SOURCE) \
+ || (_POSIX_C_SOURCE >= 199506L) || (_XOPEN_SOURCE >= 500) \
+ || (__POSIX_VISIBLE >= 199506) /* xBSD internal macro */
+ GC_API int GC_pthread_sigmask(int /* how */, const sigset_t *,
+ sigset_t * /* oset */);
+# else
+# define GC_NO_PTHREAD_SIGMASK
+# endif
+# endif /* !GC_NO_PTHREAD_SIGMASK */
+
+# ifndef GC_PTHREAD_CREATE_CONST
+ /* This is used for pthread_create() only. */
+# define GC_PTHREAD_CREATE_CONST const
+# endif
+
+ GC_API int GC_pthread_create(pthread_t *,
+ GC_PTHREAD_CREATE_CONST pthread_attr_t *,
+ void *(*)(void *), void * /* arg */);
+ GC_API int GC_pthread_join(pthread_t, void ** /* retval */);
+ GC_API int GC_pthread_detach(pthread_t);
+
+# ifndef GC_NO_PTHREAD_CANCEL
+ GC_API int GC_pthread_cancel(pthread_t);
+# endif
+
+# if defined(GC_HAVE_PTHREAD_EXIT) && !defined(GC_PTHREAD_EXIT_DECLARED)
+# define GC_PTHREAD_EXIT_DECLARED
+ GC_API void GC_pthread_exit(void *) GC_PTHREAD_EXIT_ATTRIBUTE;
+# endif
+
+# ifdef __cplusplus
+ } /* extern "C" */
+# endif
+
+#endif /* !GC_PTHREAD_REDIRECTS_ONLY */
+
+#if !defined(GC_NO_THREAD_REDIRECTS) && !defined(GC_USE_LD_WRAP)
+ /* Unless the compiler supports #pragma extern_prefix, the Tru64 */
+ /* UNIX <pthread.h> redefines some POSIX thread functions to use */
+ /* mangled names. Anyway, it's safe to undef them before redefining. */
+# undef pthread_create
+# undef pthread_join
+# undef pthread_detach
+# define pthread_create GC_pthread_create
+# define pthread_join GC_pthread_join
+# define pthread_detach GC_pthread_detach
+
+# ifndef GC_NO_PTHREAD_SIGMASK
+# undef pthread_sigmask
+# define pthread_sigmask GC_pthread_sigmask
+# endif
+# ifndef GC_NO_DLOPEN
+# undef dlopen
+# define dlopen GC_dlopen
+# endif
+# ifndef GC_NO_PTHREAD_CANCEL
+# undef pthread_cancel
+# define pthread_cancel GC_pthread_cancel
+# endif
+# ifdef GC_HAVE_PTHREAD_EXIT
+# undef pthread_exit
+# define pthread_exit GC_pthread_exit
+# endif
+#endif /* !GC_NO_THREAD_REDIRECTS */
+
+#endif /* GC_PTHREADS */
+
+#endif /* GC_PTHREAD_REDIRECTS_H */
diff --git a/graphics/asymptote/gc/include/gc_tiny_fl.h b/graphics/asymptote/gc/include/gc_tiny_fl.h
new file mode 100644
index 0000000000..0382b4179d
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_tiny_fl.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 1999-2005 Hewlett-Packard Development Company, L.P.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_TINY_FL_H
+#define GC_TINY_FL_H
+/*
+ * Constants and data structures for "tiny" free lists.
+ * These are used for thread-local allocation or in-lined allocators.
+ * Each global free list also essentially starts with one of these.
+ * However, global free lists are known to the GC. "Tiny" free lists
+ * are basically private to the client. Their contents are viewed as
+ * "in use" and marked accordingly by the core of the GC.
+ *
+ * Note that inlined code might know about the layout of these and the constants
+ * involved. Thus any change here may invalidate clients, and such changes should
+ * be avoided. Hence we keep this as simple as possible.
+ */
+
+/*
+ * We always set GC_GRANULE_BYTES to twice the length of a pointer.
+ * This means that all allocation requests are rounded up to the next
+ * multiple of 16 on 64-bit architectures or 8 on 32-bit architectures.
+ * This appears to be a reasonable compromise between fragmentation overhead
+ * and space usage for mark bits (usually mark bytes).
+ * On many 64-bit architectures some memory references require 16-byte
+ * alignment, making this necessary anyway.
+ * For a few 32-bit architecture (e.g. x86), we may also need 16-byte alignment
+ * for certain memory references. But currently that does not seem to be the
+ * default for all conventional malloc implementations, so we ignore that
+ * problem.
+ * It would always be safe, and often useful, to be able to allocate very
+ * small objects with smaller alignment. But that would cost us mark bit
+ * space, so we no longer do so.
+ */
+#ifndef GC_GRANULE_BYTES
+ /* GC_GRANULE_BYTES should not be overridden in any instances of the GC */
+ /* library that may be shared between applications, since it affects */
+ /* the binary interface to the library. */
+# if defined(__LP64__) || defined (_LP64) || defined(_WIN64) \
+ || defined(__s390x__) \
+ || (defined(__x86_64__) && !defined(__ILP32__)) \
+ || defined(__alpha__) || defined(__powerpc64__) \
+ || defined(__arch64__)
+# define GC_GRANULE_BYTES 16
+# define GC_GRANULE_WORDS 2
+# else
+# define GC_GRANULE_BYTES 8
+# define GC_GRANULE_WORDS 2
+# endif
+#endif /* !GC_GRANULE_BYTES */
+
+#if GC_GRANULE_WORDS == 2
+# define GC_WORDS_TO_GRANULES(n) ((n)>>1)
+#else
+# define GC_WORDS_TO_GRANULES(n) ((n)*sizeof(void *)/GC_GRANULE_BYTES)
+#endif
+
+/* A "tiny" free list header contains TINY_FREELISTS pointers to */
+/* singly linked lists of objects of different sizes, the ith one */
+/* containing objects i granules in size. Note that there is a list */
+/* of size zero objects. */
+#ifndef GC_TINY_FREELISTS
+# if GC_GRANULE_BYTES == 16
+# define GC_TINY_FREELISTS 25
+# else
+# define GC_TINY_FREELISTS 33 /* Up to and including 256 bytes */
+# endif
+#endif /* !GC_TINY_FREELISTS */
+
+/* The ith free list corresponds to size i*GC_GRANULE_BYTES */
+/* Internally to the collector, the index can be computed with */
+/* ROUNDED_UP_GRANULES. Externally, we don't know whether */
+/* DONT_ADD_BYTE_AT_END is set, but the client should know. */
+
+/* Convert a free list index to the actual size of objects */
+/* on that list, including extra space we added. Not an */
+/* inverse of the above. */
+#define GC_RAW_BYTES_FROM_INDEX(i) ((i) * GC_GRANULE_BYTES)
+
+#endif /* GC_TINY_FL_H */
diff --git a/graphics/asymptote/gc/include/gc_typed.h b/graphics/asymptote/gc/include/gc_typed.h
new file mode 100644
index 0000000000..f91c7bcecf
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_typed.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright 1996 Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * Some simple primitives for allocation with explicit type information.
+ * Facilities for dynamic type inference may be added later.
+ * Should be used only for extremely performance critical applications,
+ * or if conservative collector leakage is otherwise a problem (unlikely).
+ * Note that this is implemented completely separately from the rest
+ * of the collector, and is not linked in unless referenced.
+ * This does not currently support GC_DEBUG in any interesting way.
+ */
+
+#ifndef GC_TYPED_H
+#define GC_TYPED_H
+
+#ifndef GC_H
+# include "gc.h"
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+typedef GC_word * GC_bitmap;
+ /* The least significant bit of the first word is one if */
+ /* the first word in the object may be a pointer. */
+
+#define GC_WORDSZ (8 * sizeof(GC_word))
+#define GC_get_bit(bm, index) \
+ (((bm)[(index) / GC_WORDSZ] >> ((index) % GC_WORDSZ)) & 1)
+#define GC_set_bit(bm, index) \
+ ((bm)[(index) / GC_WORDSZ] |= (GC_word)1 << ((index) % GC_WORDSZ))
+#define GC_WORD_OFFSET(t, f) (offsetof(t,f) / sizeof(GC_word))
+#define GC_WORD_LEN(t) (sizeof(t) / sizeof(GC_word))
+#define GC_BITMAP_SIZE(t) ((GC_WORD_LEN(t) + GC_WORDSZ - 1) / GC_WORDSZ)
+
+typedef GC_word GC_descr;
+
+GC_API GC_descr GC_CALL GC_make_descriptor(const GC_word * /* GC_bitmap bm */,
+ size_t /* len (number_of_bits_in_bitmap) */);
+ /* Return a type descriptor for the object whose layout */
+ /* is described by the argument. */
+ /* The least significant bit of the first word is one */
+ /* if the first word in the object may be a pointer. */
+ /* The second argument specifies the number of */
+ /* meaningful bits in the bitmap. The actual object */
+ /* may be larger (but not smaller). Any additional */
+ /* words in the object are assumed not to contain */
+ /* pointers. */
+ /* Returns a conservative approximation in the */
+ /* (unlikely) case of insufficient memory to build */
+ /* the descriptor. Calls to GC_make_descriptor */
+ /* may consume some amount of a finite resource. This */
+ /* is intended to be called once per type, not once */
+ /* per allocation. */
+
+/* It is possible to generate a descriptor for a C type T with */
+/* word aligned pointer fields f1, f2, ... as follows: */
+/* */
+/* GC_descr T_descr; */
+/* GC_word T_bitmap[GC_BITMAP_SIZE(T)] = {0}; */
+/* GC_set_bit(T_bitmap, GC_WORD_OFFSET(T,f1)); */
+/* GC_set_bit(T_bitmap, GC_WORD_OFFSET(T,f2)); */
+/* ... */
+/* T_descr = GC_make_descriptor(T_bitmap, GC_WORD_LEN(T)); */
+
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_malloc_explicitly_typed(size_t /* size_in_bytes */,
+ GC_descr /* d */);
+ /* Allocate an object whose layout is described by d. */
+ /* The size may NOT be less than the number of */
+ /* meaningful bits in the bitmap of d multiplied by */
+ /* sizeof GC_word. The returned object is cleared. */
+ /* The returned object may NOT be passed to GC_realloc. */
+
+GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
+ GC_malloc_explicitly_typed_ignore_off_page(size_t /* size_in_bytes */,
+ GC_descr /* d */);
+
+GC_API GC_ATTR_MALLOC GC_ATTR_CALLOC_SIZE(1, 2) void * GC_CALL
+ GC_calloc_explicitly_typed(size_t /* nelements */,
+ size_t /* element_size_in_bytes */,
+ GC_descr /* d */);
+ /* Allocate an array of nelements elements, each of the */
+ /* given size, and with the given descriptor. */
+ /* The element size must be a multiple of the byte */
+ /* alignment required for pointers. E.g. on a 32-bit */
+ /* machine with 16-bit aligned pointers, size_in_bytes */
+ /* must be a multiple of 2. The element size may NOT */
+ /* be less than the number of meaningful bits in the */
+ /* bitmap of d multiplied by sizeof GC_word. */
+ /* Returned object is cleared. */
+
+#ifdef GC_DEBUG
+# define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) ((void)(d), GC_MALLOC(bytes))
+# define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) \
+ ((void)(d), GC_MALLOC((n) * (bytes)))
+#else
+# define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) \
+ GC_malloc_explicitly_typed(bytes, d)
+# define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) \
+ GC_calloc_explicitly_typed(n, bytes, d)
+#endif
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* GC_TYPED_H */
diff --git a/graphics/asymptote/gc/include/gc_version.h b/graphics/asymptote/gc/include/gc_version.h
new file mode 100644
index 0000000000..b58d0128de
--- /dev/null
+++ b/graphics/asymptote/gc/include/gc_version.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2009 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* This should never be included directly; it is included only from gc.h. */
+#if defined(GC_H)
+
+/* The policy regarding version numbers: development code has odd */
+/* "minor" number (and "micro" part is 0); when development is finished */
+/* and a release is prepared, "minor" number is incremented (keeping */
+/* "micro" number still zero), whenever a defect is fixed a new release */
+/* is prepared incrementing "micro" part to odd value (the most stable */
+/* release has the biggest "micro" number). */
+
+/* The version here should match that in configure/configure.ac */
+/* Eventually this one may become unnecessary. For now we need */
+/* it to keep the old-style build process working. */
+#define GC_TMP_VERSION_MAJOR 8
+#define GC_TMP_VERSION_MINOR 2
+#define GC_TMP_VERSION_MICRO 8 /* 8.2.8 */
+
+#ifdef GC_VERSION_MAJOR
+# if GC_TMP_VERSION_MAJOR != GC_VERSION_MAJOR \
+ || GC_TMP_VERSION_MINOR != GC_VERSION_MINOR \
+ || GC_TMP_VERSION_MICRO != GC_VERSION_MICRO
+# error Inconsistent version info. Check README.md, include/gc_version.h and configure.ac.
+# endif
+#else
+# define GC_VERSION_MAJOR GC_TMP_VERSION_MAJOR
+# define GC_VERSION_MINOR GC_TMP_VERSION_MINOR
+# define GC_VERSION_MICRO GC_TMP_VERSION_MICRO
+#endif /* !GC_VERSION_MAJOR */
+
+#endif
diff --git a/graphics/asymptote/gc/include/include.am b/graphics/asymptote/gc/include/include.am
new file mode 100644
index 0000000000..4e8e9dfce8
--- /dev/null
+++ b/graphics/asymptote/gc/include/include.am
@@ -0,0 +1,47 @@
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+## Process this file with automake to produce part of Makefile.in.
+
+# installed headers
+#
+pkginclude_HEADERS += \
+ include/gc.h \
+ include/gc_backptr.h \
+ include/gc_config_macros.h \
+ include/gc_inline.h \
+ include/gc_mark.h \
+ include/gc_tiny_fl.h \
+ include/gc_typed.h \
+ include/gc_version.h \
+ include/javaxfc.h \
+ include/leak_detector.h
+
+# headers which are not installed
+#
+dist_noinst_HEADERS += \
+ include/private/darwin_semaphore.h \
+ include/private/darwin_stop_world.h \
+ include/private/dbg_mlc.h \
+ include/private/gc_alloc_ptrs.h \
+ include/private/gc_atomic_ops.h \
+ include/private/gc_hdrs.h \
+ include/private/gc_locks.h \
+ include/private/gc_pmark.h \
+ include/private/gc_priv.h \
+ include/private/gcconfig.h \
+ include/private/pthread_stop_world.h \
+ include/private/pthread_support.h \
+ include/private/specific.h \
+ include/private/thread_local_alloc.h
+
+# unprefixed header
+include_HEADERS += \
+ include/extra/gc.h
diff --git a/graphics/asymptote/gc/include/javaxfc.h b/graphics/asymptote/gc/include/javaxfc.h
new file mode 100644
index 0000000000..40ff5b7fb0
--- /dev/null
+++ b/graphics/asymptote/gc/include/javaxfc.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2009 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_JAVAXFC_H
+#define GC_JAVAXFC_H
+
+#ifndef GC_H
+# include "gc.h"
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*
+ * Invoke all remaining finalizers that haven't yet been run. (Since the
+ * notifier is not called, this should be called from a separate thread.)
+ * This function is needed for strict compliance with the Java standard,
+ * which can make the runtime guarantee that all finalizers are run.
+ * This is problematic for several reasons:
+ * 1) It means that finalizers, and all methods called by them,
+ * must be prepared to deal with objects that have been finalized in
+ * spite of the fact that they are still referenced by statically
+ * allocated pointer variables.
+ * 2) It may mean that we get stuck in an infinite loop running
+ * finalizers which create new finalizable objects, though that's
+ * probably unlikely.
+ * Thus this is not recommended for general use.
+ */
+GC_API void GC_CALL GC_finalize_all(void);
+
+#ifdef GC_THREADS
+ /* External thread suspension support. No thread suspension count */
+ /* (so a thread which has been suspended numerous times will be */
+ /* resumed with the very first call to GC_resume_thread). */
+ /* Acquire the allocation lock. Thread should be registered in GC */
+ /* (otherwise no-op, GC_is_thread_suspended returns false). */
+ /* Unimplemented on some platforms. Not recommended for general use. */
+# ifndef GC_SUSPEND_THREAD_ID
+# define GC_SUSPEND_THREAD_ID void*
+# endif
+ GC_API void GC_CALL GC_suspend_thread(GC_SUSPEND_THREAD_ID);
+ GC_API void GC_CALL GC_resume_thread(GC_SUSPEND_THREAD_ID);
+ GC_API int GC_CALL GC_is_thread_suspended(GC_SUSPEND_THREAD_ID);
+#endif /* GC_THREADS */
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* GC_JAVAXFC_H */
diff --git a/graphics/asymptote/gc/include/leak_detector.h b/graphics/asymptote/gc/include/leak_detector.h
new file mode 100644
index 0000000000..c85502c444
--- /dev/null
+++ b/graphics/asymptote/gc/include/leak_detector.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2000-2011 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_LEAK_DETECTOR_H
+#define GC_LEAK_DETECTOR_H
+
+/* Include leak_detector.h (e.g., via GCC --include directive) */
+/* to turn libgc into a leak detector. */
+
+#ifndef GC_DEBUG
+# define GC_DEBUG
+#endif
+#include "gc.h"
+
+#ifndef GC_DONT_INCLUDE_STDLIB
+ /* We ensure stdlib.h and string.h are included before */
+ /* redirecting malloc() and the accompanying functions. */
+# include <stdlib.h>
+# include <string.h>
+#endif
+
+#undef malloc
+#define malloc(n) GC_MALLOC(n)
+#undef calloc
+#define calloc(m,n) GC_MALLOC((m)*(n))
+#undef free
+#define free(p) GC_FREE(p)
+#undef realloc
+#define realloc(p,n) GC_REALLOC(p,n)
+
+#undef strdup
+#define strdup(s) GC_STRDUP(s)
+#undef strndup
+#define strndup(s,n) GC_STRNDUP(s,n)
+
+#ifdef GC_REQUIRE_WCSDUP
+ /* The collector should be built with GC_REQUIRE_WCSDUP */
+ /* defined as well to redirect wcsdup(). */
+# include <wchar.h>
+# undef wcsdup
+# define wcsdup(s) GC_WCSDUP(s)
+#endif
+
+#undef memalign
+#define memalign(a,n) GC_memalign(a,n)
+#undef posix_memalign
+#define posix_memalign(p,a,n) GC_posix_memalign(p,a,n)
+
+#undef malloc_usable_size
+#define malloc_usable_size(p) GC_size(p)
+
+#ifndef CHECK_LEAKS
+# define CHECK_LEAKS() GC_gcollect()
+ /* Note 1: CHECK_LEAKS does not have GC prefix (preserved for */
+ /* backward compatibility). */
+ /* Note 2: GC_gcollect() is also called automatically in the */
+ /* leak-finding mode at program exit. */
+#endif
+
+#endif /* GC_LEAK_DETECTOR_H */
diff --git a/graphics/asymptote/gc/include/private/darwin_semaphore.h b/graphics/asymptote/gc/include/private/darwin_semaphore.h
new file mode 100644
index 0000000000..6431f439e2
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/darwin_semaphore.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2009 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_DARWIN_SEMAPHORE_H
+#define GC_DARWIN_SEMAPHORE_H
+
+#if !defined(GC_DARWIN_THREADS) && !defined(GC_WIN32_THREADS)
+# error darwin_semaphore.h included for improper target
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* This is a very simple semaphore implementation based on pthreads. */
+/* It is not async-signal safe. But this is not a problem because */
+/* signals are not used to suspend threads on the target. */
+
+typedef struct {
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ int value;
+} sem_t;
+
+GC_INLINE int sem_init(sem_t *sem, int pshared, int value) {
+ if (pshared != 0) {
+ errno = EPERM; /* unsupported */
+ return -1;
+ }
+ sem->value = value;
+ if (pthread_mutex_init(&sem->mutex, NULL) != 0)
+ return -1;
+ if (pthread_cond_init(&sem->cond, NULL) != 0) {
+ (void)pthread_mutex_destroy(&sem->mutex);
+ return -1;
+ }
+ return 0;
+}
+
+GC_INLINE int sem_post(sem_t *sem) {
+ if (pthread_mutex_lock(&sem->mutex) != 0)
+ return -1;
+ sem->value++;
+ if (pthread_cond_signal(&sem->cond) != 0) {
+ (void)pthread_mutex_unlock(&sem->mutex);
+ return -1;
+ }
+ return pthread_mutex_unlock(&sem->mutex) != 0 ? -1 : 0;
+}
+
+GC_INLINE int sem_wait(sem_t *sem) {
+ if (pthread_mutex_lock(&sem->mutex) != 0)
+ return -1;
+ while (sem->value == 0) {
+ if (pthread_cond_wait(&sem->cond, &sem->mutex) != 0) {
+ (void)pthread_mutex_unlock(&sem->mutex);
+ return -1;
+ }
+ }
+ sem->value--;
+ return pthread_mutex_unlock(&sem->mutex) != 0 ? -1 : 0;
+}
+
+GC_INLINE int sem_destroy(sem_t *sem) {
+ return pthread_cond_destroy(&sem->cond) != 0
+ || pthread_mutex_destroy(&sem->mutex) != 0 ? -1 : 0;
+}
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif
diff --git a/graphics/asymptote/gc/include/private/darwin_stop_world.h b/graphics/asymptote/gc/include/private/darwin_stop_world.h
new file mode 100644
index 0000000000..ee97cbf66c
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/darwin_stop_world.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2009 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_DARWIN_STOP_WORLD_H
+#define GC_DARWIN_STOP_WORLD_H
+
+#if !defined(GC_DARWIN_THREADS)
+# error darwin_stop_world.h included without GC_DARWIN_THREADS defined
+#endif
+
+#include <mach/mach.h>
+#include <mach/thread_act.h>
+
+EXTERN_C_BEGIN
+
+struct thread_stop_info {
+ mach_port_t mach_thread;
+ ptr_t stack_ptr; /* Valid only when thread is in a "blocked" state. */
+};
+
+#ifndef DARWIN_DONT_PARSE_STACK
+ GC_INNER ptr_t GC_FindTopOfStack(unsigned long);
+#endif
+
+#ifdef MPROTECT_VDB
+ GC_INNER void GC_mprotect_stop(void);
+ GC_INNER void GC_mprotect_resume(void);
+# ifndef GC_NO_THREADS_DISCOVERY
+ GC_INNER void GC_darwin_register_mach_handler_thread(mach_port_t thread);
+# endif
+#endif
+
+#if defined(PARALLEL_MARK) && !defined(GC_NO_THREADS_DISCOVERY)
+ GC_INNER GC_bool GC_is_mach_marker(thread_act_t);
+#endif
+
+EXTERN_C_END
+
+#endif
diff --git a/graphics/asymptote/gc/include/private/dbg_mlc.h b/graphics/asymptote/gc/include/private/dbg_mlc.h
new file mode 100644
index 0000000000..0e510ceefc
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/dbg_mlc.h
@@ -0,0 +1,193 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1997 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * This is mostly an internal header file. Typical clients should
+ * not use it. Clients that define their own object kinds with
+ * debugging allocators will probably want to include this, however.
+ * No attempt is made to keep the namespace clean. This should not be
+ * included from header files that are frequently included by clients.
+ */
+
+#ifndef GC_DBG_MLC_H
+#define GC_DBG_MLC_H
+
+#include "gc_priv.h"
+#ifdef KEEP_BACK_PTRS
+# include "gc_backptr.h"
+#endif
+
+EXTERN_C_BEGIN
+
+#if CPP_WORDSZ == 32
+# define START_FLAG (word)0xfedcedcb
+# define END_FLAG (word)0xbcdecdef
+#else
+# define START_FLAG GC_WORD_C(0xFEDCEDCBfedcedcb)
+# define END_FLAG GC_WORD_C(0xBCDECDEFbcdecdef)
+#endif
+ /* Stored both one past the end of user object, and one before */
+ /* the end of the object as seen by the allocator. */
+
+#if defined(KEEP_BACK_PTRS) || defined(PRINT_BLACK_LIST) \
+ || defined(MAKE_BACK_GRAPH)
+ /* Pointer "source"s that aren't real locations. */
+ /* Used in oh_back_ptr fields and as "source" */
+ /* argument to some marking functions. */
+# define NOT_MARKED (ptr_t)0
+# define MARKED_FOR_FINALIZATION ((ptr_t)(word)2)
+ /* Object was marked because it is finalizable. */
+# define MARKED_FROM_REGISTER ((ptr_t)(word)4)
+ /* Object was marked from a register. Hence the */
+ /* source of the reference doesn't have an address. */
+#endif /* KEEP_BACK_PTRS || PRINT_BLACK_LIST */
+
+/* Object header */
+typedef struct {
+# if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH)
+ /* We potentially keep two different kinds of back */
+ /* pointers. KEEP_BACK_PTRS stores a single back */
+ /* pointer in each reachable object to allow reporting */
+ /* of why an object was retained. MAKE_BACK_GRAPH */
+ /* builds a graph containing the inverse of all */
+ /* "points-to" edges including those involving */
+ /* objects that have just become unreachable. This */
+ /* allows detection of growing chains of unreachable */
+ /* objects. It may be possible to eventually combine */
+ /* both, but for now we keep them separate. Both */
+ /* kinds of back pointers are hidden using the */
+ /* following macros. In both cases, the plain version */
+ /* is constrained to have an least significant bit of 1, */
+ /* to allow it to be distinguished from a free list */
+ /* link. This means the plain version must have an */
+ /* lsb of 0. */
+ /* Note that blocks dropped by black-listing will */
+ /* also have the lsb clear once debugging has */
+ /* started. */
+ /* We're careful never to overwrite a value with lsb 0. */
+# if ALIGNMENT == 1
+ /* Fudge back pointer to be even. */
+# define HIDE_BACK_PTR(p) GC_HIDE_POINTER(~(word)1 & (word)(p))
+# else
+# define HIDE_BACK_PTR(p) GC_HIDE_POINTER(p)
+# endif
+# ifdef KEEP_BACK_PTRS
+ GC_hidden_pointer oh_back_ptr;
+# endif
+# ifdef MAKE_BACK_GRAPH
+ GC_hidden_pointer oh_bg_ptr;
+# endif
+# if defined(KEEP_BACK_PTRS) != defined(MAKE_BACK_GRAPH)
+ /* Keep double-pointer-sized alignment. */
+ word oh_dummy;
+# endif
+# endif
+ const char * oh_string; /* object descriptor string (file name) */
+ signed_word oh_int; /* object descriptor integer (line number) */
+# ifdef NEED_CALLINFO
+ struct callinfo oh_ci[NFRAMES];
+# endif
+# ifndef SHORT_DBG_HDRS
+ word oh_sz; /* Original malloc arg. */
+ word oh_sf; /* start flag */
+# endif /* SHORT_DBG_HDRS */
+} oh;
+/* The size of the above structure is assumed not to de-align things, */
+/* and to be a multiple of the word length. */
+
+#ifdef SHORT_DBG_HDRS
+# define DEBUG_BYTES (sizeof (oh))
+# define UNCOLLECTABLE_DEBUG_BYTES DEBUG_BYTES
+#else
+ /* Add space for END_FLAG, but use any extra space that was already */
+ /* added to catch off-the-end pointers. */
+ /* For uncollectible objects, the extra byte is not added. */
+# define UNCOLLECTABLE_DEBUG_BYTES (sizeof (oh) + sizeof (word))
+# define DEBUG_BYTES (UNCOLLECTABLE_DEBUG_BYTES - EXTRA_BYTES)
+#endif
+
+/* Round bytes to words without adding extra byte at end. */
+#define SIMPLE_ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + WORDS_TO_BYTES(1) - 1)
+
+/* ADD_CALL_CHAIN stores a (partial) call chain into an object */
+/* header; it should be called with the allocation lock held. */
+/* PRINT_CALL_CHAIN prints the call chain stored in an object */
+/* to stderr. It requires that we do not hold the lock. */
+#if defined(SAVE_CALL_CHAIN)
+ struct callinfo;
+ GC_INNER void GC_save_callers(struct callinfo info[NFRAMES]);
+ GC_INNER void GC_print_callers(struct callinfo info[NFRAMES]);
+# define ADD_CALL_CHAIN(base, ra) GC_save_callers(((oh *)(base)) -> oh_ci)
+# if defined(REDIRECT_MALLOC) && defined(THREADS) && defined(DBG_HDRS_ALL) \
+ && NARGS == 0 && NFRAMES % 2 == 0 && defined(GC_HAVE_BUILTIN_BACKTRACE)
+ GC_INNER void GC_save_callers_no_unlock(struct callinfo info[NFRAMES]);
+# define ADD_CALL_CHAIN_INNER(base) \
+ GC_save_callers_no_unlock(((oh *)(base)) -> oh_ci)
+# endif
+# define PRINT_CALL_CHAIN(base) GC_print_callers(((oh *)(base)) -> oh_ci)
+#elif defined(GC_ADD_CALLER)
+ struct callinfo;
+ GC_INNER void GC_print_callers(struct callinfo info[NFRAMES]);
+# define ADD_CALL_CHAIN(base, ra) ((oh *)(base)) -> oh_ci[0].ci_pc = (ra)
+# define PRINT_CALL_CHAIN(base) GC_print_callers(((oh *)(base)) -> oh_ci)
+#else
+# define ADD_CALL_CHAIN(base, ra)
+# define PRINT_CALL_CHAIN(base)
+#endif
+
+#if !defined(ADD_CALL_CHAIN_INNER) && defined(DBG_HDRS_ALL)
+ /* A variant of ADD_CALL_CHAIN() used for internal allocations. */
+# define ADD_CALL_CHAIN_INNER(base) ADD_CALL_CHAIN(base, GC_RETURN_ADDR)
+#endif
+
+#ifdef GC_ADD_CALLER
+# define OPT_RA ra,
+#else
+# define OPT_RA
+#endif
+
+/* Check whether object with base pointer p has debugging info */
+/* p is assumed to point to a legitimate object in our part */
+/* of the heap. */
+#ifdef SHORT_DBG_HDRS
+# define GC_has_other_debug_info(p) 1
+#else
+ GC_INNER int GC_has_other_debug_info(ptr_t p);
+#endif
+
+#if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH)
+# if defined(SHORT_DBG_HDRS) && !defined(CPPCHECK)
+# error Non-ptr stored in object results in GC_HAS_DEBUG_INFO malfunction
+ /* We may mistakenly conclude that p has a debugging wrapper. */
+# endif
+# if defined(PARALLEL_MARK) && defined(KEEP_BACK_PTRS)
+# define GC_HAS_DEBUG_INFO(p) \
+ ((AO_load((volatile AO_t *)(p)) & 1) != 0 \
+ && GC_has_other_debug_info(p) > 0)
+ /* Atomic load is used as GC_store_back_pointer */
+ /* stores oh_back_ptr atomically (p might point */
+ /* to the field); this prevents a TSan warning. */
+# else
+# define GC_HAS_DEBUG_INFO(p) \
+ ((*(word *)(p) & 1) && GC_has_other_debug_info(p) > 0)
+# endif
+#else
+# define GC_HAS_DEBUG_INFO(p) (GC_has_other_debug_info(p) > 0)
+#endif /* !KEEP_BACK_PTRS && !MAKE_BACK_GRAPH */
+
+EXTERN_C_END
+
+#endif /* GC_DBG_MLC_H */
diff --git a/graphics/asymptote/gc/include/private/gc_alloc_ptrs.h b/graphics/asymptote/gc/include/private/gc_alloc_ptrs.h
new file mode 100644
index 0000000000..a31c183276
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/gc_alloc_ptrs.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 1996-1998 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2018-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* This file is kept for a binary compatibility purpose only. */
+
+#ifndef GC_ALLOC_PTRS_H
+#define GC_ALLOC_PTRS_H
+
+#include "gc.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifndef GC_API_PRIV
+# define GC_API_PRIV GC_API
+#endif
+
+/* Some compilers do not accept "const" together with the dllimport */
+/* attribute, so the symbols below are exported as non-constant ones. */
+#ifndef GC_APIVAR_CONST
+# if defined(GC_BUILD) || !defined(GC_DLL)
+# define GC_APIVAR_CONST const
+# else
+# define GC_APIVAR_CONST /* empty */
+# endif
+#endif
+
+GC_API_PRIV void ** GC_APIVAR_CONST GC_objfreelist_ptr;
+GC_API_PRIV void ** GC_APIVAR_CONST GC_aobjfreelist_ptr;
+GC_API_PRIV void ** GC_APIVAR_CONST GC_uobjfreelist_ptr;
+
+#ifdef GC_ATOMIC_UNCOLLECTABLE
+ GC_API_PRIV void ** GC_APIVAR_CONST GC_auobjfreelist_ptr;
+#endif
+
+/* Manually update the number of bytes allocated during the current */
+/* collection cycle and the number of explicitly deallocated bytes of */
+/* memory since the last collection, respectively. Both functions are */
+/* unsynchronized, GC_call_with_alloc_lock() should be used to avoid */
+/* data races. */
+GC_API_PRIV void GC_CALL GC_incr_bytes_allocd(size_t /* bytes */);
+GC_API_PRIV void GC_CALL GC_incr_bytes_freed(size_t /* bytes */);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* GC_ALLOC_PTRS_H */
diff --git a/graphics/asymptote/gc/include/private/gc_atomic_ops.h b/graphics/asymptote/gc/include/private/gc_atomic_ops.h
new file mode 100644
index 0000000000..eaa28cb191
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/gc_atomic_ops.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2017 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* This is a private GC header which provides an implementation of */
+/* libatomic_ops subset primitives sufficient for GC assuming that GCC */
+/* atomic intrinsics are available (and have correct implementation). */
+/* This is enabled by defining GC_BUILTIN_ATOMIC macro. Otherwise, */
+/* libatomic_ops library is used to define the primitives. */
+
+#ifndef GC_ATOMIC_OPS_H
+#define GC_ATOMIC_OPS_H
+
+#ifdef GC_BUILTIN_ATOMIC
+
+# include "gc.h" /* for GC_word */
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+
+ typedef GC_word AO_t;
+
+# ifdef GC_PRIVATE_H /* have GC_INLINE */
+# define AO_INLINE GC_INLINE
+# else
+# define AO_INLINE static __inline
+# endif
+
+ typedef unsigned char AO_TS_t;
+# define AO_TS_CLEAR 0
+# define AO_TS_INITIALIZER (AO_TS_t)AO_TS_CLEAR
+# if defined(__GCC_ATOMIC_TEST_AND_SET_TRUEVAL) && !defined(CPPCHECK)
+# define AO_TS_SET __GCC_ATOMIC_TEST_AND_SET_TRUEVAL
+# else
+# define AO_TS_SET (AO_TS_t)1 /* true */
+# endif
+# define AO_CLEAR(p) __atomic_clear(p, __ATOMIC_RELEASE)
+# define AO_test_and_set_acquire(p) \
+ (__atomic_test_and_set(p, __ATOMIC_ACQUIRE) ? AO_TS_SET : AO_TS_CLEAR)
+# define AO_HAVE_test_and_set_acquire
+
+# define AO_compiler_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)
+# define AO_nop_full() __atomic_thread_fence(__ATOMIC_SEQ_CST)
+# define AO_HAVE_nop_full
+
+# define AO_fetch_and_add(p, v) __atomic_fetch_add(p, v, __ATOMIC_RELAXED)
+# define AO_HAVE_fetch_and_add
+# define AO_fetch_and_add1(p) AO_fetch_and_add(p, 1)
+# define AO_HAVE_fetch_and_add1
+
+# define AO_or(p, v) (void)__atomic_or_fetch(p, v, __ATOMIC_RELAXED)
+# define AO_HAVE_or
+
+# define AO_load(p) __atomic_load_n(p, __ATOMIC_RELAXED)
+# define AO_HAVE_load
+# define AO_load_acquire(p) __atomic_load_n(p, __ATOMIC_ACQUIRE)
+# define AO_HAVE_load_acquire
+# define AO_load_acquire_read(p) AO_load_acquire(p)
+# define AO_HAVE_load_acquire_read
+
+# define AO_store(p, v) __atomic_store_n(p, v, __ATOMIC_RELAXED)
+# define AO_HAVE_store
+# define AO_store_release(p, v) __atomic_store_n(p, v, __ATOMIC_RELEASE)
+# define AO_HAVE_store_release
+# define AO_store_release_write(p, v) AO_store_release(p, v)
+# define AO_HAVE_store_release_write
+
+# define AO_char_load(p) __atomic_load_n(p, __ATOMIC_RELAXED)
+# define AO_HAVE_char_load
+# define AO_char_store(p, v) __atomic_store_n(p, v, __ATOMIC_RELAXED)
+# define AO_HAVE_char_store
+
+# ifdef AO_REQUIRE_CAS
+ AO_INLINE int
+ AO_compare_and_swap(volatile AO_t *p, AO_t ov, AO_t nv)
+ {
+ return (int)__atomic_compare_exchange_n(p, &ov, nv, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+ }
+
+ AO_INLINE int
+ AO_compare_and_swap_release(volatile AO_t *p, AO_t ov, AO_t nv)
+ {
+ return (int)__atomic_compare_exchange_n(p, &ov, nv, 0,
+ __ATOMIC_RELEASE, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_compare_and_swap_release
+# endif
+
+# ifdef __cplusplus
+ } /* extern "C" */
+# endif
+
+# ifndef NO_LOCKFREE_AO_OR
+ /* __atomic_or_fetch is assumed to be lock-free. */
+# define HAVE_LOCKFREE_AO_OR 1
+# endif
+
+#else
+ /* Fallback to libatomic_ops. */
+# include "atomic_ops.h"
+
+ /* AO_compiler_barrier, AO_load and AO_store should be defined for */
+ /* all targets; the rest of the primitives are guaranteed to exist */
+ /* only if AO_REQUIRE_CAS is defined (or if the corresponding */
+ /* AO_HAVE_x macro is defined). x86/x64 targets have AO_nop_full, */
+ /* AO_load_acquire, AO_store_release, at least. */
+# if (!defined(AO_HAVE_load) || !defined(AO_HAVE_store)) && !defined(CPPCHECK)
+# error AO_load or AO_store is missing; probably old version of atomic_ops
+# endif
+
+#endif /* !GC_BUILTIN_ATOMIC */
+
+#endif /* GC_ATOMIC_OPS_H */
diff --git a/graphics/asymptote/gc/include/private/gc_hdrs.h b/graphics/asymptote/gc/include/private/gc_hdrs.h
new file mode 100644
index 0000000000..a6e7037a56
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/gc_hdrs.h
@@ -0,0 +1,215 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_HEADERS_H
+#define GC_HEADERS_H
+
+#if CPP_WORDSZ != 32 && CPP_WORDSZ < 36 && !defined(CPPCHECK)
+# error Get a real machine
+#endif
+
+EXTERN_C_BEGIN
+
+typedef struct hblkhdr hdr;
+
+/*
+ * The 2 level tree data structure that is used to find block headers.
+ * If there are more than 32 bits in a pointer, the top level is a hash
+ * table.
+ *
+ * This defines HDR, GET_HDR, and SET_HDR, the main macros used to
+ * retrieve and set object headers.
+ *
+ * We take advantage of a header lookup
+ * cache. This is a locally declared direct mapped cache, used inside
+ * the marker. The HC_GET_HDR macro uses and maintains this
+ * cache. Assuming we get reasonable hit rates, this shaves a few
+ * memory references from each pointer validation.
+ */
+
+#if CPP_WORDSZ > 32
+# define HASH_TL
+#endif
+
+/* Define appropriate out-degrees for each of the two tree levels */
+#if defined(LARGE_CONFIG) || !defined(SMALL_CONFIG)
+# define LOG_BOTTOM_SZ 10
+#else
+# define LOG_BOTTOM_SZ 11
+ /* Keep top index size reasonable with smaller blocks. */
+#endif
+#define BOTTOM_SZ (1 << LOG_BOTTOM_SZ)
+
+#ifndef HASH_TL
+# define LOG_TOP_SZ (WORDSZ - LOG_BOTTOM_SZ - LOG_HBLKSIZE)
+#else
+# define LOG_TOP_SZ 11
+#endif
+#define TOP_SZ (1 << LOG_TOP_SZ)
+
+/* #define COUNT_HDR_CACHE_HITS */
+
+#ifdef COUNT_HDR_CACHE_HITS
+ extern word GC_hdr_cache_hits; /* used for debugging/profiling */
+ extern word GC_hdr_cache_misses;
+# define HC_HIT() (void)(++GC_hdr_cache_hits)
+# define HC_MISS() (void)(++GC_hdr_cache_misses)
+#else
+# define HC_HIT() /* empty */
+# define HC_MISS() /* empty */
+#endif
+
+typedef struct hce {
+ word block_addr; /* right shifted by LOG_HBLKSIZE */
+ hdr * hce_hdr;
+} hdr_cache_entry;
+
+#define HDR_CACHE_SIZE 8 /* power of 2 */
+
+#define DECLARE_HDR_CACHE \
+ hdr_cache_entry hdr_cache[HDR_CACHE_SIZE]
+
+#define INIT_HDR_CACHE BZERO(hdr_cache, sizeof(hdr_cache))
+
+#define HCE(h) \
+ (hdr_cache + (((word)(h) >> LOG_HBLKSIZE) & (HDR_CACHE_SIZE-1)))
+
+#define HCE_VALID_FOR(hce, h) ((hce) -> block_addr == \
+ ((word)(h) >> LOG_HBLKSIZE))
+
+#define HCE_HDR(h) ((hce) -> hce_hdr)
+
+#ifdef PRINT_BLACK_LIST
+ GC_INNER hdr * GC_header_cache_miss(ptr_t p, hdr_cache_entry *hce,
+ ptr_t source);
+# define HEADER_CACHE_MISS(p, hce, source) \
+ GC_header_cache_miss(p, hce, source)
+#else
+ GC_INNER hdr * GC_header_cache_miss(ptr_t p, hdr_cache_entry *hce);
+# define HEADER_CACHE_MISS(p, hce, source) GC_header_cache_miss(p, hce)
+#endif
+
+/* Set hhdr to the header for p. Analogous to GET_HDR below, */
+/* except that in the case of large objects, it gets the header for */
+/* the object beginning if GC_all_interior_pointers is set. */
+/* Returns zero if p points to somewhere other than the first page */
+/* of an object, and it is not a valid pointer to the object. */
+#define HC_GET_HDR(p, hhdr, source) \
+ { /* cannot use do-while(0) here */ \
+ hdr_cache_entry * hce = HCE(p); \
+ if (EXPECT(HCE_VALID_FOR(hce, p), TRUE)) { \
+ HC_HIT(); \
+ hhdr = hce -> hce_hdr; \
+ } else { \
+ hhdr = HEADER_CACHE_MISS(p, hce, source); \
+ if (NULL == hhdr) break; /* go to the enclosing loop end */ \
+ } \
+ }
+
+typedef struct bi {
+ hdr * index[BOTTOM_SZ];
+ /*
+ * The bottom level index contains one of three kinds of values:
+ * 0 means we're not responsible for this block,
+ * or this is a block other than the first one in a free block.
+ * 1 < (long)X <= MAX_JUMP means the block starts at least
+ * X * HBLKSIZE bytes before the current address.
+ * A valid pointer points to a hdr structure. (The above can't be
+ * valid pointers due to the GET_MEM return convention.)
+ */
+ struct bi * asc_link; /* All indices are linked in */
+ /* ascending order... */
+ struct bi * desc_link; /* ... and in descending order. */
+ word key; /* high order address bits. */
+# ifdef HASH_TL
+ struct bi * hash_link; /* Hash chain link. */
+# endif
+} bottom_index;
+
+/* bottom_index GC_all_nils; - really part of GC_arrays */
+
+/* extern bottom_index * GC_top_index []; - really part of GC_arrays */
+ /* Each entry points to a bottom_index. */
+ /* On a 32 bit machine, it points to */
+ /* the index for a set of high order */
+ /* bits equal to the index. For longer */
+ /* addresses, we hash the high order */
+ /* bits to compute the index in */
+ /* GC_top_index, and each entry points */
+ /* to a hash chain. */
+ /* The last entry in each chain is */
+ /* GC_all_nils. */
+
+
+#define MAX_JUMP (HBLKSIZE - 1)
+
+#define HDR_FROM_BI(bi, p) \
+ ((bi)->index[((word)(p) >> LOG_HBLKSIZE) & (BOTTOM_SZ - 1)])
+#ifndef HASH_TL
+# define BI(p) (GC_top_index \
+ [(word)(p) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE)])
+# define HDR_INNER(p) HDR_FROM_BI(BI(p),p)
+# ifdef SMALL_CONFIG
+# define HDR(p) GC_find_header((ptr_t)(p))
+# else
+# define HDR(p) HDR_INNER(p)
+# endif
+# define GET_BI(p, bottom_indx) (void)((bottom_indx) = BI(p))
+# define GET_HDR(p, hhdr) (void)((hhdr) = HDR(p))
+# define SET_HDR(p, hhdr) (void)(HDR_INNER(p) = (hhdr))
+# define GET_HDR_ADDR(p, ha) (void)((ha) = &HDR_INNER(p))
+#else /* hash */
+ /* Hash function for tree top level */
+# define TL_HASH(hi) ((hi) & (TOP_SZ - 1))
+ /* Set bottom_indx to point to the bottom index for address p */
+# define GET_BI(p, bottom_indx) \
+ do { \
+ REGISTER word hi = (word)(p) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE); \
+ REGISTER bottom_index * _bi = GC_top_index[TL_HASH(hi)]; \
+ while (_bi -> key != hi && _bi != GC_all_nils) \
+ _bi = _bi -> hash_link; \
+ (bottom_indx) = _bi; \
+ } while (0)
+# define GET_HDR_ADDR(p, ha) \
+ do { \
+ REGISTER bottom_index * bi; \
+ GET_BI(p, bi); \
+ (ha) = &HDR_FROM_BI(bi, p); \
+ } while (0)
+# define GET_HDR(p, hhdr) \
+ do { \
+ REGISTER hdr ** _ha; \
+ GET_HDR_ADDR(p, _ha); \
+ (hhdr) = *_ha; \
+ } while (0)
+# define SET_HDR(p, hhdr) \
+ do { \
+ REGISTER hdr ** _ha; \
+ GET_HDR_ADDR(p, _ha); \
+ *_ha = (hhdr); \
+ } while (0)
+# define HDR(p) GC_find_header((ptr_t)(p))
+#endif
+
+/* Is the result a forwarding address to someplace closer to the */
+/* beginning of the block or NULL? */
+#define IS_FORWARDING_ADDR_OR_NIL(hhdr) ((size_t) (hhdr) <= MAX_JUMP)
+
+/* Get an HBLKSIZE aligned address closer to the beginning of the block */
+/* h. Assumes hhdr == HDR(h) and IS_FORWARDING_ADDR(hhdr). */
+#define FORWARDED_ADDR(h, hhdr) ((struct hblk *)(h) - (size_t)(hhdr))
+
+EXTERN_C_END
+
+#endif /* GC_HEADERS_H */
diff --git a/graphics/asymptote/gc/include/private/gc_locks.h b/graphics/asymptote/gc/include/private/gc_locks.h
new file mode 100644
index 0000000000..ffad99e09f
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/gc_locks.h
@@ -0,0 +1,281 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_LOCKS_H
+#define GC_LOCKS_H
+
+/*
+ * Mutual exclusion between allocator/collector routines.
+ * Needed if there is more than one allocator thread.
+ * DCL_LOCK_STATE declares any local variables needed by LOCK and UNLOCK.
+ *
+ * Note that I_HOLD_LOCK and I_DONT_HOLD_LOCK are used only positively
+ * in assertions, and may return TRUE in the "don't know" case.
+ */
+# ifdef THREADS
+
+# ifdef PCR
+# include <base/PCR_Base.h>
+# include <th/PCR_Th.h>
+# endif
+
+ EXTERN_C_BEGIN
+
+# ifdef PCR
+ GC_EXTERN PCR_Th_ML GC_allocate_ml;
+# define UNCOND_LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml)
+# define UNCOND_UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml)
+# elif defined(NN_PLATFORM_CTR) || defined(NINTENDO_SWITCH)
+ extern void GC_lock(void);
+ extern void GC_unlock(void);
+# define UNCOND_LOCK() GC_lock()
+# define UNCOND_UNLOCK() GC_unlock()
+# endif
+
+# if (!defined(AO_HAVE_test_and_set_acquire) || defined(GC_RTEMS_PTHREADS) \
+ || defined(SN_TARGET_PS3) \
+ || defined(GC_WIN32_THREADS) || defined(BASE_ATOMIC_OPS_EMULATED) \
+ || defined(LINT2)) && defined(GC_PTHREADS)
+# define USE_PTHREAD_LOCKS
+# undef USE_SPIN_LOCK
+# if defined(LINT2) && !defined(NO_PTHREAD_TRYLOCK)
+# define NO_PTHREAD_TRYLOCK
+# endif
+# endif
+
+# if defined(GC_WIN32_THREADS) && !defined(USE_PTHREAD_LOCKS)
+# define NO_THREAD (DWORD)(-1)
+ GC_EXTERN CRITICAL_SECTION GC_allocate_ml;
+# ifdef GC_ASSERTIONS
+ GC_EXTERN DWORD GC_lock_holder;
+# define SET_LOCK_HOLDER() GC_lock_holder = GetCurrentThreadId()
+# define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD
+# define I_HOLD_LOCK() (!GC_need_to_lock \
+ || GC_lock_holder == GetCurrentThreadId())
+# ifdef THREAD_SANITIZER
+# define I_DONT_HOLD_LOCK() TRUE /* Conservatively say yes */
+# else
+# define I_DONT_HOLD_LOCK() (!GC_need_to_lock \
+ || GC_lock_holder != GetCurrentThreadId())
+# endif
+# define UNCOND_LOCK() \
+ { GC_ASSERT(I_DONT_HOLD_LOCK()); \
+ EnterCriticalSection(&GC_allocate_ml); \
+ SET_LOCK_HOLDER(); }
+# define UNCOND_UNLOCK() \
+ { GC_ASSERT(I_HOLD_LOCK()); UNSET_LOCK_HOLDER(); \
+ LeaveCriticalSection(&GC_allocate_ml); }
+# else
+# define UNCOND_LOCK() EnterCriticalSection(&GC_allocate_ml)
+# define UNCOND_UNLOCK() LeaveCriticalSection(&GC_allocate_ml)
+# endif /* !GC_ASSERTIONS */
+# elif defined(GC_PTHREADS)
+ EXTERN_C_END
+# include <pthread.h>
+ EXTERN_C_BEGIN
+ /* Posix allows pthread_t to be a struct, though it rarely is. */
+ /* Unfortunately, we need to use a pthread_t to index a data */
+ /* structure. It also helps if comparisons don't involve a */
+ /* function call. Hence we introduce platform-dependent macros */
+ /* to compare pthread_t ids and to map them to integers. */
+ /* The mapping to integers does not need to result in different */
+ /* integers for each thread, though that should be true as much */
+ /* as possible. */
+ /* Refine to exclude platforms on which pthread_t is struct. */
+# if !defined(GC_WIN32_PTHREADS)
+# define NUMERIC_THREAD_ID(id) ((unsigned long)(id))
+# define THREAD_EQUAL(id1, id2) ((id1) == (id2))
+# define NUMERIC_THREAD_ID_UNIQUE
+# elif defined(__WINPTHREADS_VERSION_MAJOR) /* winpthreads */
+# define NUMERIC_THREAD_ID(id) ((unsigned long)(id))
+# define THREAD_EQUAL(id1, id2) ((id1) == (id2))
+# ifndef _WIN64
+ /* NUMERIC_THREAD_ID is 32-bit and not unique on Win64. */
+# define NUMERIC_THREAD_ID_UNIQUE
+# endif
+# else /* pthreads-win32 */
+# define NUMERIC_THREAD_ID(id) ((unsigned long)(word)(id.p))
+ /* Using documented internal details of pthreads-win32 library. */
+ /* Faster than pthread_equal(). Should not change with */
+ /* future versions of pthreads-win32 library. */
+# define THREAD_EQUAL(id1, id2) ((id1.p == id2.p) && (id1.x == id2.x))
+# undef NUMERIC_THREAD_ID_UNIQUE
+ /* Generic definitions based on pthread_equal() always work but */
+ /* will result in poor performance (as NUMERIC_THREAD_ID is */
+ /* defined to just a constant) and weak assertion checking. */
+# endif
+# define NO_THREAD ((unsigned long)(-1l))
+ /* != NUMERIC_THREAD_ID(pthread_self()) for any thread */
+
+# ifdef SN_TARGET_PSP2
+ EXTERN_C_END
+# include "psp2-support.h"
+ EXTERN_C_BEGIN
+ GC_EXTERN WapiMutex GC_allocate_ml_PSP2;
+# define UNCOND_LOCK() { int res; GC_ASSERT(I_DONT_HOLD_LOCK()); \
+ res = PSP2_MutexLock(&GC_allocate_ml_PSP2); \
+ GC_ASSERT(0 == res); (void)res; \
+ SET_LOCK_HOLDER(); }
+# define UNCOND_UNLOCK() { int res; GC_ASSERT(I_HOLD_LOCK()); \
+ UNSET_LOCK_HOLDER(); \
+ res = PSP2_MutexUnlock(&GC_allocate_ml_PSP2); \
+ GC_ASSERT(0 == res); (void)res; }
+
+# elif (!defined(THREAD_LOCAL_ALLOC) || defined(USE_SPIN_LOCK)) \
+ && !defined(USE_PTHREAD_LOCKS)
+ /* In the THREAD_LOCAL_ALLOC case, the allocation lock tends to */
+ /* be held for long periods, if it is held at all. Thus spinning */
+ /* and sleeping for fixed periods are likely to result in */
+ /* significant wasted time. We thus rely mostly on queued locks. */
+# undef USE_SPIN_LOCK
+# define USE_SPIN_LOCK
+ GC_EXTERN volatile AO_TS_t GC_allocate_lock;
+ GC_INNER void GC_lock(void);
+# ifdef GC_ASSERTIONS
+# define UNCOND_LOCK() \
+ { GC_ASSERT(I_DONT_HOLD_LOCK()); \
+ if (AO_test_and_set_acquire(&GC_allocate_lock) == AO_TS_SET) \
+ GC_lock(); \
+ SET_LOCK_HOLDER(); }
+# define UNCOND_UNLOCK() \
+ { GC_ASSERT(I_HOLD_LOCK()); UNSET_LOCK_HOLDER(); \
+ AO_CLEAR(&GC_allocate_lock); }
+# else
+# define UNCOND_LOCK() \
+ { if (AO_test_and_set_acquire(&GC_allocate_lock) == AO_TS_SET) \
+ GC_lock(); }
+# define UNCOND_UNLOCK() AO_CLEAR(&GC_allocate_lock)
+# endif /* !GC_ASSERTIONS */
+# else /* THREAD_LOCAL_ALLOC || USE_PTHREAD_LOCKS */
+# ifndef USE_PTHREAD_LOCKS
+# define USE_PTHREAD_LOCKS
+# endif
+# endif /* THREAD_LOCAL_ALLOC || USE_PTHREAD_LOCKS */
+# ifdef USE_PTHREAD_LOCKS
+ EXTERN_C_END
+# include <pthread.h>
+ EXTERN_C_BEGIN
+ GC_EXTERN pthread_mutex_t GC_allocate_ml;
+# ifdef GC_ASSERTIONS
+ GC_INNER void GC_lock(void);
+# define UNCOND_LOCK() { GC_ASSERT(I_DONT_HOLD_LOCK()); \
+ GC_lock(); SET_LOCK_HOLDER(); }
+# define UNCOND_UNLOCK() \
+ { GC_ASSERT(I_HOLD_LOCK()); UNSET_LOCK_HOLDER(); \
+ pthread_mutex_unlock(&GC_allocate_ml); }
+# else /* !GC_ASSERTIONS */
+# if defined(NO_PTHREAD_TRYLOCK)
+# define UNCOND_LOCK() pthread_mutex_lock(&GC_allocate_ml)
+# else
+ GC_INNER void GC_lock(void);
+# define UNCOND_LOCK() \
+ { if (0 != pthread_mutex_trylock(&GC_allocate_ml)) \
+ GC_lock(); }
+# endif
+# define UNCOND_UNLOCK() pthread_mutex_unlock(&GC_allocate_ml)
+# endif /* !GC_ASSERTIONS */
+# endif /* USE_PTHREAD_LOCKS */
+# ifdef GC_ASSERTIONS
+ GC_EXTERN unsigned long GC_lock_holder;
+ /* The allocator lock holder. */
+# define SET_LOCK_HOLDER() \
+ GC_lock_holder = NUMERIC_THREAD_ID(pthread_self())
+# define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD
+# define I_HOLD_LOCK() \
+ (!GC_need_to_lock \
+ || GC_lock_holder == NUMERIC_THREAD_ID(pthread_self()))
+# if !defined(NUMERIC_THREAD_ID_UNIQUE) || defined(THREAD_SANITIZER)
+# define I_DONT_HOLD_LOCK() TRUE /* Conservatively say yes */
+# else
+# define I_DONT_HOLD_LOCK() \
+ (!GC_need_to_lock \
+ || GC_lock_holder != NUMERIC_THREAD_ID(pthread_self()))
+# endif
+# endif /* GC_ASSERTIONS */
+# ifndef GC_WIN32_THREADS
+ GC_EXTERN volatile GC_bool GC_collecting;
+# ifdef AO_HAVE_char_store
+# define ENTER_GC() AO_char_store((unsigned char*)&GC_collecting, TRUE)
+# define EXIT_GC() AO_char_store((unsigned char*)&GC_collecting, FALSE)
+# else
+# define ENTER_GC() (void)(GC_collecting = TRUE)
+# define EXIT_GC() (void)(GC_collecting = FALSE)
+# endif
+# endif
+# endif /* GC_PTHREADS */
+# if defined(GC_ALWAYS_MULTITHREADED) \
+ && (defined(USE_PTHREAD_LOCKS) || defined(USE_SPIN_LOCK))
+# define GC_need_to_lock TRUE
+# define set_need_to_lock() (void)0
+# else
+# if defined(GC_ALWAYS_MULTITHREADED) && !defined(CPPCHECK)
+# error Runtime initialization of GC lock is needed!
+# endif
+# undef GC_ALWAYS_MULTITHREADED
+ GC_EXTERN GC_bool GC_need_to_lock;
+# ifdef THREAD_SANITIZER
+ /* To workaround TSan false positive (e.g., when */
+ /* GC_pthread_create is called from multiple threads in */
+ /* parallel), do not set GC_need_to_lock if it is already set. */
+# define set_need_to_lock() \
+ (void)(*(GC_bool volatile *)&GC_need_to_lock \
+ ? FALSE \
+ : (GC_need_to_lock = TRUE))
+# else
+# define set_need_to_lock() (void)(GC_need_to_lock = TRUE)
+ /* We are multi-threaded now. */
+# endif
+# endif
+
+ EXTERN_C_END
+
+# else /* !THREADS */
+# define LOCK() (void)0
+# define UNLOCK() (void)0
+# ifdef GC_ASSERTIONS
+# define I_HOLD_LOCK() TRUE
+# define I_DONT_HOLD_LOCK() TRUE
+ /* Used only in positive assertions or to test whether */
+ /* we still need to acquire the lock. TRUE works in */
+ /* either case. */
+# endif
+# endif /* !THREADS */
+
+#if defined(UNCOND_LOCK) && !defined(LOCK)
+# if (defined(LINT2) && defined(USE_PTHREAD_LOCKS)) \
+ || defined(GC_ALWAYS_MULTITHREADED)
+ /* Instruct code analysis tools not to care about GC_need_to_lock */
+ /* influence to LOCK/UNLOCK semantic. */
+# define LOCK() UNCOND_LOCK()
+# define UNLOCK() UNCOND_UNLOCK()
+# else
+ /* At least two thread running; need to lock. */
+# define LOCK() do { if (GC_need_to_lock) UNCOND_LOCK(); } while (0)
+# define UNLOCK() do { if (GC_need_to_lock) UNCOND_UNLOCK(); } while (0)
+# endif
+#endif
+
+# ifndef ENTER_GC
+# define ENTER_GC()
+# define EXIT_GC()
+# endif
+
+# ifndef DCL_LOCK_STATE
+# define DCL_LOCK_STATE
+# endif
+
+#endif /* GC_LOCKS_H */
diff --git a/graphics/asymptote/gc/include/private/gc_pmark.h b/graphics/asymptote/gc/include/private/gc_pmark.h
new file mode 100644
index 0000000000..309c044fc7
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/gc_pmark.h
@@ -0,0 +1,487 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 2001 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* Private declarations of GC marker data structures and macros */
+
+/*
+ * Declarations of mark stack. Needed by marker and client supplied mark
+ * routines. Transitively include gc_priv.h.
+ */
+#ifndef GC_PMARK_H
+#define GC_PMARK_H
+
+#if defined(HAVE_CONFIG_H) && !defined(GC_PRIVATE_H)
+ /* When gc_pmark.h is included from gc_priv.h, some of macros might */
+ /* be undefined in gcconfig.h, so skip config.h in this case. */
+# include "config.h"
+#endif
+
+#ifndef GC_BUILD
+# define GC_BUILD
+#endif
+
+#if (defined(__linux__) || defined(__GLIBC__) || defined(__GNU__)) \
+ && !defined(_GNU_SOURCE) && defined(GC_PTHREADS) \
+ && !defined(GC_NO_PTHREAD_SIGMASK)
+# define _GNU_SOURCE 1
+#endif
+
+#if defined(KEEP_BACK_PTRS) || defined(PRINT_BLACK_LIST)
+# include "dbg_mlc.h"
+#endif
+
+#include "../gc_mark.h"
+#include "gc_priv.h"
+
+EXTERN_C_BEGIN
+
+/* The real declarations of the following is in gc_priv.h, so that */
+/* we can avoid scanning the following table. */
+/*
+mark_proc GC_mark_procs[MAX_MARK_PROCS];
+*/
+
+#ifndef MARK_DESCR_OFFSET
+# define MARK_DESCR_OFFSET sizeof(word)
+#endif
+
+/*
+ * Mark descriptor stuff that should remain private for now, mostly
+ * because it's hard to export WORDSZ without including gcconfig.h.
+ */
+#define BITMAP_BITS (WORDSZ - GC_DS_TAG_BITS)
+#define PROC(descr) \
+ (GC_mark_procs[((descr) >> GC_DS_TAG_BITS) & (GC_MAX_MARK_PROCS-1)])
+#define ENV(descr) \
+ ((descr) >> (GC_DS_TAG_BITS + GC_LOG_MAX_MARK_PROCS))
+#define MAX_ENV \
+ (((word)1 << (WORDSZ - GC_DS_TAG_BITS - GC_LOG_MAX_MARK_PROCS)) - 1)
+
+GC_EXTERN unsigned GC_n_mark_procs;
+
+/* Number of mark stack entries to discard on overflow. */
+#define GC_MARK_STACK_DISCARDS (INITIAL_MARK_STACK_SIZE/8)
+
+#ifdef PARALLEL_MARK
+ /*
+ * Allow multiple threads to participate in the marking process.
+ * This works roughly as follows:
+ * The main mark stack never shrinks, but it can grow.
+ *
+ * The initiating threads holds the GC lock, and sets GC_help_wanted.
+ *
+ * Other threads:
+ * 1) update helper_count (while holding the mark lock).
+ * 2) allocate a local mark stack
+ * repeatedly:
+ * 3) Steal a global mark stack entry by atomically replacing
+ * its descriptor with 0.
+ * 4) Copy it to the local stack.
+ * 5) Mark on the local stack until it is empty, or
+ * it may be profitable to copy it back.
+ * 6) If necessary, copy local stack to global one,
+ * holding mark lock.
+ * 7) Stop when the global mark stack is empty.
+ * 8) decrement helper_count (holding the mark lock).
+ *
+ * This is an experiment to see if we can do something along the lines
+ * of the University of Tokyo SGC in a less intrusive, though probably
+ * also less performant, way.
+ */
+
+ /* GC_mark_stack_top is protected by mark lock. */
+
+ /*
+ * GC_notify_all_marker() is used when GC_help_wanted is first set,
+ * when the last helper becomes inactive,
+ * when something is added to the global mark stack, and just after
+ * GC_mark_no is incremented.
+ * This could be split into multiple CVs (and probably should be to
+ * scale to really large numbers of processors.)
+ */
+#endif /* PARALLEL_MARK */
+
+GC_INNER mse * GC_signal_mark_stack_overflow(mse *msp);
+
+/* Push the object obj with corresponding heap block header hhdr onto */
+/* the mark stack. Returns the updated mark_stack_top value. */
+GC_INLINE mse * GC_push_obj(ptr_t obj, hdr * hhdr, mse * mark_stack_top,
+ mse * mark_stack_limit)
+{
+ word descr = hhdr -> hb_descr;
+
+ GC_ASSERT(!HBLK_IS_FREE(hhdr));
+ if (descr != 0) {
+ mark_stack_top++;
+ if ((word)mark_stack_top >= (word)mark_stack_limit) {
+ mark_stack_top = GC_signal_mark_stack_overflow(mark_stack_top);
+ }
+ mark_stack_top -> mse_start = obj;
+ mark_stack_top -> mse_descr.w = descr;
+ }
+ return mark_stack_top;
+}
+
+/* Push the contents of current onto the mark stack if it is a valid */
+/* ptr to a currently unmarked object. Mark it. */
+#define PUSH_CONTENTS(current, mark_stack_top, mark_stack_limit, source) \
+ do { \
+ hdr * my_hhdr; \
+ HC_GET_HDR(current, my_hhdr, source); /* contains "break" */ \
+ mark_stack_top = GC_push_contents_hdr(current, mark_stack_top, \
+ mark_stack_limit, \
+ source, my_hhdr, TRUE); \
+ } while (0)
+
+/* Set mark bit, exit (using "break" statement) if it is already set. */
+#ifdef USE_MARK_BYTES
+# if defined(PARALLEL_MARK) && defined(AO_HAVE_char_store) \
+ && !defined(BASE_ATOMIC_OPS_EMULATED)
+ /* There is a race here, and we may set the bit twice in the */
+ /* concurrent case. This can result in the object being pushed */
+ /* twice. But that is only a performance issue. */
+# define SET_MARK_BIT_EXIT_IF_SET(hhdr, bit_no) \
+ { /* cannot use do-while(0) here */ \
+ volatile unsigned char * mark_byte_addr = \
+ (unsigned char *)(hhdr)->hb_marks + (bit_no); \
+ /* Unordered atomic load and store are sufficient here. */ \
+ if (AO_char_load(mark_byte_addr) != 0) \
+ break; /* go to the enclosing loop end */ \
+ AO_char_store(mark_byte_addr, 1); \
+ }
+# else
+# define SET_MARK_BIT_EXIT_IF_SET(hhdr, bit_no) \
+ { /* cannot use do-while(0) here */ \
+ char * mark_byte_addr = (char *)(hhdr)->hb_marks + (bit_no); \
+ if (*mark_byte_addr != 0) break; /* go to the enclosing loop end */ \
+ *mark_byte_addr = 1; \
+ }
+# endif /* !PARALLEL_MARK */
+#else
+# ifdef PARALLEL_MARK
+ /* This is used only if we explicitly set USE_MARK_BITS. */
+ /* The following may fail to exit even if the bit was already set. */
+ /* For our uses, that's benign: */
+# ifdef THREAD_SANITIZER
+# define OR_WORD_EXIT_IF_SET(addr, bits) \
+ { /* cannot use do-while(0) here */ \
+ if (!((word)AO_load((volatile AO_t *)(addr)) & (bits))) { \
+ /* Atomic load is just to avoid TSan false positive. */ \
+ AO_or((volatile AO_t *)(addr), (AO_t)(bits)); \
+ } else { \
+ break; /* go to the enclosing loop end */ \
+ } \
+ }
+# else
+# define OR_WORD_EXIT_IF_SET(addr, bits) \
+ { /* cannot use do-while(0) here */ \
+ if (!(*(addr) & (bits))) { \
+ AO_or((volatile AO_t *)(addr), (AO_t)(bits)); \
+ } else { \
+ break; /* go to the enclosing loop end */ \
+ } \
+ }
+# endif /* !THREAD_SANITIZER */
+# else
+# define OR_WORD_EXIT_IF_SET(addr, bits) \
+ { /* cannot use do-while(0) here */ \
+ word old = *(addr); \
+ word my_bits = (bits); \
+ if ((old & my_bits) != 0) \
+ break; /* go to the enclosing loop end */ \
+ *(addr) = old | my_bits; \
+ }
+# endif /* !PARALLEL_MARK */
+# define SET_MARK_BIT_EXIT_IF_SET(hhdr, bit_no) \
+ { /* cannot use do-while(0) here */ \
+ word * mark_word_addr = (hhdr)->hb_marks + divWORDSZ(bit_no); \
+ OR_WORD_EXIT_IF_SET(mark_word_addr, \
+ (word)1 << modWORDSZ(bit_no)); /* contains "break" */ \
+ }
+#endif /* !USE_MARK_BYTES */
+
+#ifdef PARALLEL_MARK
+# define INCR_MARKS(hhdr) \
+ AO_store(&hhdr->hb_n_marks, AO_load(&hhdr->hb_n_marks) + 1)
+#else
+# define INCR_MARKS(hhdr) (void)(++hhdr->hb_n_marks)
+#endif
+
+#ifdef ENABLE_TRACE
+# define TRACE(source, cmd) \
+ if (GC_trace_addr != 0 && (ptr_t)(source) == GC_trace_addr) cmd
+# define TRACE_TARGET(target, cmd) \
+ if (GC_trace_addr != NULL && GC_is_heap_ptr(GC_trace_addr) \
+ && (target) == *(ptr_t *)GC_trace_addr) cmd
+#else
+# define TRACE(source, cmd)
+# define TRACE_TARGET(source, cmd)
+#endif
+
+#if defined(I386) && defined(__GNUC__) && !defined(NACL)
+# define LONG_MULT(hprod, lprod, x, y) \
+ do { \
+ __asm__ __volatile__("mull %2" : "=a"(lprod), "=d"(hprod) \
+ : "r"(y), "0"(x)); \
+ } while (0)
+#else
+# if defined(__int64) && !defined(__GNUC__) && !defined(CPPCHECK)
+# define ULONG_MULT_T unsigned __int64
+# else
+# define ULONG_MULT_T unsigned long long
+# endif
+# define LONG_MULT(hprod, lprod, x, y) \
+ do { \
+ ULONG_MULT_T prod = (ULONG_MULT_T)(x) * (ULONG_MULT_T)(y); \
+ GC_STATIC_ASSERT(sizeof(x) + sizeof(y) <= sizeof(prod)); \
+ hprod = (unsigned32)(prod >> 32); \
+ lprod = (unsigned32)prod; \
+ } while (0)
+#endif /* !I386 */
+
+/* If the mark bit corresponding to current is not set, set it, and */
+/* push the contents of the object on the mark stack. Current points */
+/* to the beginning of the object. We rely on the fact that the */
+/* preceding header calculation will succeed for a pointer past the */
+/* first page of an object, only if it is in fact a valid pointer */
+/* to the object. Thus we can omit the otherwise necessary tests */
+/* here. Note in particular that the "displ" value is the displacement */
+/* from the beginning of the heap block, which may itself be in the */
+/* interior of a large object. */
+GC_INLINE mse * GC_push_contents_hdr(ptr_t current, mse * mark_stack_top,
+ mse * mark_stack_limit, ptr_t source,
+ hdr * hhdr, GC_bool do_offset_check)
+{
+ do {
+ size_t displ = HBLKDISPL(current); /* Displacement in block; in bytes. */
+ /* displ is always within range. If current doesn't point to the */
+ /* first block, then we are in the all_interior_pointers case, and */
+ /* it is safe to use any displacement value. */
+ ptr_t base = current;
+# ifdef MARK_BIT_PER_GRANULE
+ size_t gran_displ = BYTES_TO_GRANULES(displ);
+ size_t gran_offset = hhdr -> hb_map[gran_displ];
+ size_t byte_offset = displ & (GRANULE_BYTES - 1);
+
+ /* The following always fails for large block references. */
+ if (EXPECT((gran_offset | byte_offset) != 0, FALSE))
+# else
+ unsigned32 gran_displ; /* high_prod */
+ unsigned32 inv_sz = hhdr -> hb_inv_sz;
+# endif /* MARK_BIT_PER_OBJ */
+
+ {
+# ifdef MARK_BIT_PER_GRANULE
+ if ((hhdr -> hb_flags & LARGE_BLOCK) != 0)
+# else
+ if (EXPECT(inv_sz == LARGE_INV_SZ, FALSE))
+# endif /* MARK_BIT_PER_OBJ */
+ {
+ /* gran_offset is bogus. */
+ size_t obj_displ;
+
+ base = (ptr_t)hhdr->hb_block;
+ obj_displ = current - base;
+ if (obj_displ != displ) {
+ GC_ASSERT(obj_displ < hhdr -> hb_sz);
+ /* Must be in all_interior_pointer case, not first block */
+ /* already did validity check on cache miss. */
+ } else if (do_offset_check && !GC_valid_offsets[obj_displ]) {
+ GC_ADD_TO_BLACK_LIST_NORMAL(current, source);
+ break;
+ }
+ GC_ASSERT(hhdr -> hb_sz > HBLKSIZE
+ || hhdr -> hb_block == HBLKPTR(current));
+ GC_ASSERT((word)hhdr->hb_block <= (word)current);
+ gran_displ = 0;
+ } else {
+# ifdef MARK_BIT_PER_GRANULE
+ size_t obj_displ = GRANULES_TO_BYTES(gran_offset) + byte_offset;
+# else
+ unsigned32 low_prod;
+
+ LONG_MULT(gran_displ, low_prod, (unsigned32)displ, inv_sz);
+ if ((low_prod >> 16) != 0)
+# endif /* MARK_BIT_PER_OBJ */
+ {
+# if defined(MARK_BIT_PER_OBJ) \
+ && !defined(MARK_BIT_PER_GRANULE) /* for cppcheck */
+ size_t obj_displ;
+
+ /* Accurate enough if HBLKSIZE <= 2**15. */
+ GC_STATIC_ASSERT(HBLKSIZE <= (1 << 15));
+ obj_displ = (((low_prod >> 16) + 1) * (size_t)hhdr->hb_sz) >> 16;
+# endif
+ if (do_offset_check && !GC_valid_offsets[obj_displ]) {
+ GC_ADD_TO_BLACK_LIST_NORMAL(current, source);
+ break;
+ }
+# ifdef MARK_BIT_PER_GRANULE
+ gran_displ -= gran_offset;
+# endif
+ base -= obj_displ;
+ }
+ }
+ }
+# ifdef MARK_BIT_PER_GRANULE
+ GC_ASSERT(hhdr == GC_find_header(base));
+ GC_ASSERT(gran_displ % BYTES_TO_GRANULES(hhdr -> hb_sz) == 0);
+# else
+ /* May get here for pointer to start of block not at the */
+ /* beginning of object. If so, it is valid, and we are fine. */
+ GC_ASSERT(gran_displ <= HBLK_OBJS(hhdr -> hb_sz));
+# endif /* MARK_BIT_PER_OBJ */
+ TRACE(source, GC_log_printf("GC #%lu: passed validity tests\n",
+ (unsigned long)GC_gc_no));
+ SET_MARK_BIT_EXIT_IF_SET(hhdr, gran_displ); /* contains "break" */
+ TRACE(source, GC_log_printf("GC #%lu: previously unmarked\n",
+ (unsigned long)GC_gc_no));
+ TRACE_TARGET(base, GC_log_printf("GC #%lu: marking %p from %p instead\n",
+ (unsigned long)GC_gc_no, (void *)base,
+ (void *)source));
+ INCR_MARKS(hhdr);
+ GC_STORE_BACK_PTR(source, base);
+ mark_stack_top = GC_push_obj(base, hhdr, mark_stack_top,
+ mark_stack_limit);
+ } while (0);
+ return mark_stack_top;
+}
+
+#if defined(PRINT_BLACK_LIST) || defined(KEEP_BACK_PTRS)
+# define PUSH_ONE_CHECKED_STACK(p, source) \
+ GC_mark_and_push_stack((ptr_t)(p), (ptr_t)(source))
+#else
+# define PUSH_ONE_CHECKED_STACK(p, source) \
+ GC_mark_and_push_stack((ptr_t)(p))
+#endif
+
+/*
+ * Push a single value onto mark stack. Mark from the object pointed to by p.
+ * Invoke FIXUP_POINTER() before any further processing.
+ * P is considered valid even if it is an interior pointer.
+ * Previously marked objects are not pushed. Hence we make progress even
+ * if the mark stack overflows.
+ */
+
+#ifdef NEED_FIXUP_POINTER
+ /* Try both the raw version and the fixed up one. */
+# define GC_PUSH_ONE_STACK(p, source) \
+ do { \
+ word pp = (word)(p); \
+ \
+ if ((word)(p) >= (word)GC_least_plausible_heap_addr \
+ && (word)(p) < (word)GC_greatest_plausible_heap_addr) { \
+ PUSH_ONE_CHECKED_STACK(p, source); \
+ } \
+ FIXUP_POINTER(pp); \
+ if (pp >= (word)GC_least_plausible_heap_addr \
+ && pp < (word)GC_greatest_plausible_heap_addr) { \
+ PUSH_ONE_CHECKED_STACK(pp, source); \
+ } \
+ } while (0)
+#else /* !NEED_FIXUP_POINTER */
+# define GC_PUSH_ONE_STACK(p, source) \
+ do { \
+ if ((word)(p) >= (word)GC_least_plausible_heap_addr \
+ && (word)(p) < (word)GC_greatest_plausible_heap_addr) { \
+ PUSH_ONE_CHECKED_STACK(p, source); \
+ } \
+ } while (0)
+#endif
+
+/* As above, but interior pointer recognition as for normal heap pointers. */
+#define GC_PUSH_ONE_HEAP(p,source,mark_stack_top) \
+ do { \
+ FIXUP_POINTER(p); \
+ if ((word)(p) >= (word)GC_least_plausible_heap_addr \
+ && (word)(p) < (word)GC_greatest_plausible_heap_addr) \
+ mark_stack_top = GC_mark_and_push((void *)(p), mark_stack_top, \
+ GC_mark_stack_limit, (void * *)(source)); \
+ } while (0)
+
+/* Mark starting at mark stack entry top (incl.) down to */
+/* mark stack entry bottom (incl.). Stop after performing */
+/* about one page worth of work. Return the new mark stack */
+/* top entry. */
+GC_INNER mse * GC_mark_from(mse * top, mse * bottom, mse *limit);
+
+#define MARK_FROM_MARK_STACK() \
+ GC_mark_stack_top = GC_mark_from(GC_mark_stack_top, \
+ GC_mark_stack, \
+ GC_mark_stack + GC_mark_stack_size);
+
+#define GC_mark_stack_empty() ((word)GC_mark_stack_top < (word)GC_mark_stack)
+
+/*
+ * Mark from one finalizable object using the specified
+ * mark proc. May not mark the object pointed to by
+ * real_ptr. That is the job of the caller, if appropriate.
+ * Note that this is called with the mutator running, but
+ * with us holding the allocation lock. This is safe only if the
+ * mutator needs the allocation lock to reveal hidden pointers.
+ * FIXME: Why do we need the GC_mark_state test below?
+ */
+#define GC_MARK_FO(real_ptr, mark_proc) \
+ do { \
+ (*(mark_proc))(real_ptr); \
+ while (!GC_mark_stack_empty()) MARK_FROM_MARK_STACK(); \
+ if (GC_mark_state != MS_NONE) { \
+ GC_set_mark_bit(real_ptr); \
+ while (!GC_mark_some((ptr_t)0)) { /* empty */ } \
+ } \
+ } while (0)
+
+ /* Current state of marking, as follows.*/
+
+ /* We say something is dirty if it was */
+ /* written since the last time we */
+ /* retrieved dirty bits. We say it's */
+ /* grungy if it was marked dirty in the */
+ /* last set of bits we retrieved. */
+
+ /* Invariant "I": all roots and marked */
+ /* objects p are either dirty, or point */
+ /* to objects q that are either marked */
+ /* or a pointer to q appears in a range */
+ /* on the mark stack. */
+
+#define MS_NONE 0 /* No marking in progress. "I" holds. */
+ /* Mark stack is empty. */
+
+#define MS_PUSH_RESCUERS 1 /* Rescuing objects are currently */
+ /* being pushed. "I" holds, except */
+ /* that grungy roots may point to */
+ /* unmarked objects, as may marked */
+ /* grungy objects above GC_scan_ptr. */
+
+#define MS_PUSH_UNCOLLECTABLE 2 /* "I" holds, except that marked */
+ /* uncollectible objects above */
+ /* GC_scan_ptr may point to unmarked */
+ /* objects. Roots may point to */
+ /* unmarked objects. */
+
+#define MS_ROOTS_PUSHED 3 /* "I" holds, mark stack may be nonempty. */
+
+#define MS_PARTIALLY_INVALID 4 /* "I" may not hold, e.g. because of */
+ /* the mark stack overflow. However, */
+ /* marked heap objects below */
+ /* GC_scan_ptr point to marked or */
+ /* stacked objects. */
+
+#define MS_INVALID 5 /* "I" may not hold. */
+
+EXTERN_C_END
+
+#endif /* GC_PMARK_H */
diff --git a/graphics/asymptote/gc/include/private/gc_priv.h b/graphics/asymptote/gc/include/private/gc_priv.h
new file mode 100644
index 0000000000..a398e48d57
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/gc_priv.h
@@ -0,0 +1,3176 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2008-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_PRIVATE_H
+#define GC_PRIVATE_H
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#if !defined(GC_BUILD) && !defined(NOT_GCBUILD)
+# define GC_BUILD
+#endif
+
+#if (defined(__linux__) || defined(__GLIBC__) || defined(__GNU__) \
+ || defined(__CYGWIN__) || defined(HAVE_DLADDR) \
+ || defined(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID) \
+ || defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG) \
+ || defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID)) && !defined(_GNU_SOURCE)
+ /* Can't test LINUX, since this must be defined before other includes. */
+# define _GNU_SOURCE 1
+#endif
+
+#if defined(__INTERIX) && !defined(_ALL_SOURCE)
+# define _ALL_SOURCE 1
+#endif
+
+#if (defined(DGUX) && defined(GC_THREADS) || defined(DGUX386_THREADS) \
+ || defined(GC_DGUX386_THREADS)) && !defined(_USING_POSIX4A_DRAFT10)
+# define _USING_POSIX4A_DRAFT10 1
+#endif
+
+#if defined(__MINGW32__) && !defined(__MINGW_EXCPT_DEFINE_PSDK) \
+ && defined(__i386__) && defined(GC_EXTERN) /* defined in gc.c */
+ /* See the description in mark.c. */
+# define __MINGW_EXCPT_DEFINE_PSDK 1
+#endif
+
+# if defined(NO_DEBUGGING) && !defined(GC_ASSERTIONS) && !defined(NDEBUG)
+ /* To turn off assertion checking (in atomic_ops.h). */
+# define NDEBUG 1
+# endif
+
+#ifndef GC_H
+# include "../gc.h"
+#endif
+
+#include <stdlib.h>
+#if !defined(sony_news)
+# include <stddef.h>
+#endif
+
+#ifdef DGUX
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+#endif /* DGUX */
+
+#ifdef BSD_TIME
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+#endif /* BSD_TIME */
+
+#ifdef PARALLEL_MARK
+# define AO_REQUIRE_CAS
+# if !defined(__GNUC__) && !defined(AO_ASSUME_WINDOWS98)
+# define AO_ASSUME_WINDOWS98
+# endif
+#endif
+
+#include "../gc_tiny_fl.h"
+#include "../gc_mark.h"
+
+typedef GC_word word;
+typedef GC_signed_word signed_word;
+typedef unsigned int unsigned32;
+
+typedef int GC_bool;
+#define TRUE 1
+#define FALSE 0
+
+#ifndef PTR_T_DEFINED
+ typedef char * ptr_t; /* A generic pointer to which we can add */
+ /* byte displacements and which can be used */
+ /* for address comparisons. */
+# define PTR_T_DEFINED
+#endif
+
+#ifndef SIZE_MAX
+# include <limits.h>
+#endif
+#if defined(SIZE_MAX) && !defined(CPPCHECK)
+# define GC_SIZE_MAX ((size_t)SIZE_MAX)
+ /* Extra cast to workaround some buggy SIZE_MAX definitions. */
+#else
+# define GC_SIZE_MAX (~(size_t)0)
+#endif
+
+#if GC_GNUC_PREREQ(3, 0) && !defined(LINT2)
+# define EXPECT(expr, outcome) __builtin_expect(expr,outcome)
+ /* Equivalent to (expr), but predict that usually (expr)==outcome. */
+#else
+# define EXPECT(expr, outcome) (expr)
+#endif /* __GNUC__ */
+
+/* Saturated addition of size_t values. Used to avoid value wrap */
+/* around on overflow. The arguments should have no side effects. */
+#define SIZET_SAT_ADD(a, b) \
+ (EXPECT((a) < GC_SIZE_MAX - (b), TRUE) ? (a) + (b) : GC_SIZE_MAX)
+
+#include "gcconfig.h"
+
+#if !defined(GC_ATOMIC_UNCOLLECTABLE) && defined(ATOMIC_UNCOLLECTABLE)
+ /* For compatibility with old-style naming. */
+# define GC_ATOMIC_UNCOLLECTABLE
+#endif
+
+#ifndef GC_INNER
+ /* This tagging macro must be used at the start of every variable */
+ /* definition which is declared with GC_EXTERN. Should be also used */
+ /* for the GC-scope function definitions and prototypes. Must not be */
+ /* used in gcconfig.h. Shouldn't be used for the debugging-only */
+ /* functions. Currently, not used for the functions declared in or */
+ /* called from the "dated" source files (located in "extra" folder). */
+# if defined(GC_DLL) && defined(__GNUC__) && !defined(MSWIN32) \
+ && !defined(MSWINCE) && !defined(CYGWIN32)
+# if GC_GNUC_PREREQ(4, 0) && !defined(GC_NO_VISIBILITY)
+ /* See the corresponding GC_API definition. */
+# define GC_INNER __attribute__((__visibility__("hidden")))
+# else
+ /* The attribute is unsupported. */
+# define GC_INNER /* empty */
+# endif
+# else
+# define GC_INNER /* empty */
+# endif
+
+# define GC_EXTERN extern GC_INNER
+ /* Used only for the GC-scope variables (prefixed with "GC_") */
+ /* declared in the header files. Must not be used for thread-local */
+ /* variables. Must not be used in gcconfig.h. Shouldn't be used for */
+ /* the debugging-only or profiling-only variables. Currently, not */
+ /* used for the variables accessed from the "dated" source files */
+ /* (specific.c/h, and in the "extra" folder). */
+ /* The corresponding variable definition must start with GC_INNER. */
+#endif /* !GC_INNER */
+
+#ifdef __cplusplus
+ /* Register storage specifier is deprecated in C++11. */
+# define REGISTER /* empty */
+#else
+ /* Used only for several local variables in the performance-critical */
+ /* functions. Should not be used for new code. */
+# define REGISTER register
+#endif
+
+#if defined(CPPCHECK)
+# define MACRO_BLKSTMT_BEGIN {
+# define MACRO_BLKSTMT_END }
+# define LOCAL_VAR_INIT_OK =0 /* to avoid "uninit var" false positive */
+#else
+# define MACRO_BLKSTMT_BEGIN do {
+# define MACRO_BLKSTMT_END } while (0)
+# define LOCAL_VAR_INIT_OK /* empty */
+#endif
+
+#if defined(M68K) && defined(__GNUC__)
+ /* By default, __alignof__(word) is 2 on m68k. Use this attribute to */
+ /* have proper word alignment (i.e. 4-byte on a 32-bit arch). */
+# define GC_ATTR_WORD_ALIGNED __attribute__((__aligned__(sizeof(word))))
+#else
+# define GC_ATTR_WORD_ALIGNED /* empty */
+#endif
+
+#include "gc_hdrs.h"
+
+#ifndef GC_ATTR_NO_SANITIZE_ADDR
+# ifndef ADDRESS_SANITIZER
+# define GC_ATTR_NO_SANITIZE_ADDR /* empty */
+# elif GC_CLANG_PREREQ(3, 8)
+# define GC_ATTR_NO_SANITIZE_ADDR __attribute__((no_sanitize("address")))
+# else
+# define GC_ATTR_NO_SANITIZE_ADDR __attribute__((no_sanitize_address))
+# endif
+#endif /* !GC_ATTR_NO_SANITIZE_ADDR */
+
+#ifndef GC_ATTR_NO_SANITIZE_MEMORY
+# ifndef MEMORY_SANITIZER
+# define GC_ATTR_NO_SANITIZE_MEMORY /* empty */
+# elif GC_CLANG_PREREQ(3, 8)
+# define GC_ATTR_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
+# else
+# define GC_ATTR_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
+# endif
+#endif /* !GC_ATTR_NO_SANITIZE_MEMORY */
+
+#ifndef GC_ATTR_NO_SANITIZE_THREAD
+# ifndef THREAD_SANITIZER
+# define GC_ATTR_NO_SANITIZE_THREAD /* empty */
+# elif GC_CLANG_PREREQ(3, 8)
+# define GC_ATTR_NO_SANITIZE_THREAD __attribute__((no_sanitize("thread")))
+# else
+ /* It seems that no_sanitize_thread attribute has no effect if the */
+ /* function is inlined (as of gcc 11.1.0, at least). */
+# define GC_ATTR_NO_SANITIZE_THREAD \
+ GC_ATTR_NOINLINE __attribute__((no_sanitize_thread))
+# endif
+#endif /* !GC_ATTR_NO_SANITIZE_THREAD */
+
+#ifndef GC_ATTR_UNUSED
+# if GC_GNUC_PREREQ(3, 4) || defined(__clang__)
+# define GC_ATTR_UNUSED __attribute__((__unused__))
+# else
+# define GC_ATTR_UNUSED /* empty */
+# endif
+#endif /* !GC_ATTR_UNUSED */
+
+#ifdef HAVE_CONFIG_H
+ /* The "inline" keyword is determined by Autoconf AC_C_INLINE. */
+# define GC_INLINE static inline
+#elif defined(_MSC_VER) || defined(__INTEL_COMPILER) || defined(__DMC__) \
+ || (GC_GNUC_PREREQ(3, 0) && defined(__STRICT_ANSI__)) \
+ || defined(__WATCOMC__)
+# define GC_INLINE static __inline
+#elif GC_GNUC_PREREQ(3, 0) || defined(__sun)
+# define GC_INLINE static inline
+#else
+# define GC_INLINE static
+#endif
+
+#ifndef GC_ATTR_NOINLINE
+# if GC_GNUC_PREREQ(4, 0)
+# define GC_ATTR_NOINLINE __attribute__((__noinline__))
+# elif _MSC_VER >= 1400
+# define GC_ATTR_NOINLINE __declspec(noinline)
+# else
+# define GC_ATTR_NOINLINE /* empty */
+# endif
+#endif
+
+#ifndef GC_API_OSCALL
+ /* This is used to identify GC routines called by name from OS. */
+# if defined(__GNUC__)
+# if GC_GNUC_PREREQ(4, 0) && !defined(GC_NO_VISIBILITY)
+ /* Same as GC_API if GC_DLL. */
+# define GC_API_OSCALL extern __attribute__((__visibility__("default")))
+# else
+ /* The attribute is unsupported. */
+# define GC_API_OSCALL extern
+# endif
+# else
+# define GC_API_OSCALL GC_API
+# endif
+#endif
+
+#ifndef GC_API_PRIV
+# define GC_API_PRIV GC_API
+#endif
+
+#if defined(THREADS) && !defined(NN_PLATFORM_CTR)
+# include "gc_atomic_ops.h"
+# ifndef AO_HAVE_compiler_barrier
+# define AO_HAVE_compiler_barrier 1
+# endif
+#endif
+
+#if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+# endif
+# define NOSERVICE
+# include <windows.h>
+# include <winbase.h>
+#endif
+
+#include "gc_locks.h"
+
+#define GC_WORD_MAX (~(word)0)
+
+# ifdef STACK_GROWS_DOWN
+# define COOLER_THAN >
+# define HOTTER_THAN <
+# define MAKE_COOLER(x,y) if ((word)((x) + (y)) > (word)(x)) {(x) += (y);} \
+ else (x) = (ptr_t)GC_WORD_MAX
+# define MAKE_HOTTER(x,y) (x) -= (y)
+# else
+# define COOLER_THAN <
+# define HOTTER_THAN >
+# define MAKE_COOLER(x,y) if ((word)((x) - (y)) < (word)(x)) {(x) -= (y);} \
+ else (x) = 0
+# define MAKE_HOTTER(x,y) (x) += (y)
+# endif
+
+#if defined(AMIGA) && defined(__SASC)
+# define GC_FAR __far
+#else
+# define GC_FAR
+#endif
+
+
+/*********************************/
+/* */
+/* Definitions for conservative */
+/* collector */
+/* */
+/*********************************/
+
+/*********************************/
+/* */
+/* Easily changeable parameters */
+/* */
+/*********************************/
+
+/* #define ALL_INTERIOR_POINTERS */
+ /* Forces all pointers into the interior of an */
+ /* object to be considered valid. Also causes the */
+ /* sizes of all objects to be inflated by at least */
+ /* one byte. This should suffice to guarantee */
+ /* that in the presence of a compiler that does */
+ /* not perform garbage-collector-unsafe */
+ /* optimizations, all portable, strictly ANSI */
+ /* conforming C programs should be safely usable */
+ /* with malloc replaced by GC_malloc and free */
+ /* calls removed. There are several disadvantages: */
+ /* 1. There are probably no interesting, portable, */
+ /* strictly ANSI conforming C programs. */
+ /* 2. This option makes it hard for the collector */
+ /* to allocate space that is not "pointed to" */
+ /* by integers, etc. Under SunOS 4.X with a */
+ /* statically linked libc, we empirically */
+ /* observed that it would be difficult to */
+ /* allocate individual objects > 100 KB. */
+ /* Even if only smaller objects are allocated, */
+ /* more swap space is likely to be needed. */
+ /* Fortunately, much of this will never be */
+ /* touched. */
+ /* If you can easily avoid using this option, do. */
+ /* If not, try to keep individual objects small. */
+ /* This is now really controlled at startup, */
+ /* through GC_all_interior_pointers. */
+
+EXTERN_C_BEGIN
+
+#ifndef GC_NO_FINALIZATION
+# define GC_INVOKE_FINALIZERS() GC_notify_or_invoke_finalizers()
+ GC_INNER void GC_notify_or_invoke_finalizers(void);
+ /* If GC_finalize_on_demand is not set, invoke */
+ /* eligible finalizers. Otherwise: */
+ /* Call *GC_finalizer_notifier if there are */
+ /* finalizers to be run, and we haven't called */
+ /* this procedure yet this GC cycle. */
+
+ GC_INNER void GC_finalize(void);
+ /* Perform all indicated finalization actions */
+ /* on unmarked objects. */
+ /* Unreachable finalizable objects are enqueued */
+ /* for processing by GC_invoke_finalizers. */
+ /* Invoked with lock. */
+
+# ifndef GC_TOGGLE_REFS_NOT_NEEDED
+ GC_INNER void GC_process_togglerefs(void);
+ /* Process the toggle-refs before GC starts. */
+# endif
+# ifndef SMALL_CONFIG
+ GC_INNER void GC_print_finalization_stats(void);
+# endif
+#else
+# define GC_INVOKE_FINALIZERS() (void)0
+#endif /* GC_NO_FINALIZATION */
+
+#if !defined(DONT_ADD_BYTE_AT_END)
+# ifdef LINT2
+ /* Explicitly instruct the code analysis tool that */
+ /* GC_all_interior_pointers is assumed to have only 0 or 1 value. */
+# define EXTRA_BYTES ((size_t)(GC_all_interior_pointers? 1 : 0))
+# else
+# define EXTRA_BYTES (size_t)GC_all_interior_pointers
+# endif
+# define MAX_EXTRA_BYTES 1
+#else
+# define EXTRA_BYTES 0
+# define MAX_EXTRA_BYTES 0
+#endif
+
+
+# ifndef LARGE_CONFIG
+# define MINHINCR 16 /* Minimum heap increment, in blocks of HBLKSIZE */
+ /* Must be multiple of largest page size. */
+# define MAXHINCR 2048 /* Maximum heap increment, in blocks */
+# else
+# define MINHINCR 64
+# define MAXHINCR 4096
+# endif
+
+# define BL_LIMIT GC_black_list_spacing
+ /* If we need a block of N bytes, and we have */
+ /* a block of N + BL_LIMIT bytes available, */
+ /* and N > BL_LIMIT, */
+ /* but all possible positions in it are */
+ /* blacklisted, we just use it anyway (and */
+ /* print a warning, if warnings are enabled). */
+ /* This risks subsequently leaking the block */
+ /* due to a false reference. But not using */
+ /* the block risks unreasonable immediate */
+ /* heap growth. */
+
+/*********************************/
+/* */
+/* Stack saving for debugging */
+/* */
+/*********************************/
+
+#ifdef NEED_CALLINFO
+ struct callinfo {
+ word ci_pc; /* Caller, not callee, pc */
+# if NARGS > 0
+ word ci_arg[NARGS]; /* bit-wise complement to avoid retention */
+# endif
+# if (NFRAMES * (NARGS + 1)) % 2 == 1
+ /* Likely alignment problem. */
+ word ci_dummy;
+# endif
+ };
+#endif
+
+#ifdef SAVE_CALL_CHAIN
+ /* Fill in the pc and argument information for up to NFRAMES of my */
+ /* callers. Ignore my frame and my callers frame. */
+ GC_INNER void GC_save_callers(struct callinfo info[NFRAMES]);
+ GC_INNER void GC_print_callers(struct callinfo info[NFRAMES]);
+#endif
+
+EXTERN_C_END
+
+/*********************************/
+/* */
+/* OS interface routines */
+/* */
+/*********************************/
+
+#ifndef NO_CLOCK
+#ifdef BSD_TIME
+# undef CLOCK_TYPE
+# undef GET_TIME
+# undef MS_TIME_DIFF
+# define CLOCK_TYPE struct timeval
+# define CLOCK_TYPE_INITIALIZER { 0, 0 }
+# define GET_TIME(x) \
+ do { \
+ struct rusage rusage; \
+ getrusage(RUSAGE_SELF, &rusage); \
+ x = rusage.ru_utime; \
+ } while (0)
+# define MS_TIME_DIFF(a,b) ((unsigned long)((long)(a.tv_sec-b.tv_sec) * 1000 \
+ + (long)(a.tv_usec - b.tv_usec) / 1000 \
+ - (a.tv_usec < b.tv_usec \
+ && (long)(a.tv_usec - b.tv_usec) % 1000 != 0 ? 1 : 0)))
+ /* "a" time is expected to be not earlier than */
+ /* "b" one; the result has unsigned long type. */
+# define NS_FRAC_TIME_DIFF(a, b) ((unsigned long) \
+ ((a.tv_usec < b.tv_usec \
+ && (long)(a.tv_usec - b.tv_usec) % 1000 != 0 ? 1000L : 0) \
+ + (long)(a.tv_usec - b.tv_usec) % 1000) * 1000)
+ /* The total time difference could be computed as */
+ /* MS_TIME_DIFF(a,b)*1000000+NS_FRAC_TIME_DIFF(a,b).*/
+
+#elif defined(MSWIN32) || defined(MSWINCE) || defined(WINXP_USE_PERF_COUNTER)
+# if defined(MSWINRT_FLAVOR) || defined(WINXP_USE_PERF_COUNTER)
+# define CLOCK_TYPE ULONGLONG
+# define GET_TIME(x) \
+ do { \
+ LARGE_INTEGER freq, tc; \
+ if (!QueryPerformanceFrequency(&freq)) \
+ ABORT("QueryPerformanceFrequency requires WinXP+"); \
+ /* Note: two standalone if statements are needed to */ \
+ /* avoid MS VC false warning about potentially */ \
+ /* uninitialized tc variable. */ \
+ if (!QueryPerformanceCounter(&tc)) \
+ ABORT("QueryPerformanceCounter failed"); \
+ x = (CLOCK_TYPE)((double)tc.QuadPart/freq.QuadPart * 1e9); \
+ } while (0)
+ /* TODO: Call QueryPerformanceFrequency once at GC init. */
+# define MS_TIME_DIFF(a, b) ((unsigned long)(((a) - (b)) / 1000000UL))
+# define NS_FRAC_TIME_DIFF(a, b) ((unsigned long)(((a) - (b)) % 1000000UL))
+# else
+# define CLOCK_TYPE DWORD
+# define GET_TIME(x) (void)(x = GetTickCount())
+# define MS_TIME_DIFF(a, b) ((unsigned long)((a) - (b)))
+# define NS_FRAC_TIME_DIFF(a, b) 0UL
+# endif /* !WINXP_USE_PERF_COUNTER */
+
+#elif defined(NN_PLATFORM_CTR)
+# define CLOCK_TYPE long long
+ EXTERN_C_BEGIN
+ CLOCK_TYPE n3ds_get_system_tick(void);
+ CLOCK_TYPE n3ds_convert_tick_to_ms(CLOCK_TYPE tick);
+ EXTERN_C_END
+# define GET_TIME(x) (void)(x = n3ds_get_system_tick())
+# define MS_TIME_DIFF(a,b) ((unsigned long)n3ds_convert_tick_to_ms((a)-(b)))
+# define NS_FRAC_TIME_DIFF(a, b) 0UL /* TODO: implement it */
+
+#elif defined(NINTENDO_SWITCH) \
+ || (((defined(LINUX) && defined(__USE_POSIX199309)) \
+ || defined(CYGWIN32)) && defined(_POSIX_TIMERS))
+# include <time.h>
+# define HAVE_CLOCK_GETTIME 1
+# define CLOCK_TYPE struct timespec
+# define CLOCK_TYPE_INITIALIZER { 0, 0 }
+# if defined(_POSIX_MONOTONIC_CLOCK) && !defined(NINTENDO_SWITCH)
+# define GET_TIME(x) \
+ do { \
+ if (clock_gettime(CLOCK_MONOTONIC, &x) == -1) \
+ ABORT("clock_gettime failed"); \
+ } while (0)
+# else
+# define GET_TIME(x) \
+ do { \
+ if (clock_gettime(CLOCK_REALTIME, &x) == -1) \
+ ABORT("clock_gettime failed"); \
+ } while (0)
+# endif
+# define MS_TIME_DIFF(a, b) \
+ /* a.tv_nsec - b.tv_nsec is in range -1e9 to 1e9 exclusively */ \
+ ((unsigned long)((a).tv_nsec + (1000000L*1000 - (b).tv_nsec)) / 1000000UL \
+ + ((unsigned long)((a).tv_sec - (b).tv_sec) * 1000UL) - 1000UL)
+# define NS_FRAC_TIME_DIFF(a, b) \
+ ((unsigned long)((a).tv_nsec + (1000000L*1000 - (b).tv_nsec)) % 1000000UL)
+
+#else /* !BSD_TIME && !LINUX && !NN_PLATFORM_CTR && !MSWIN32 */
+# include <time.h>
+# if defined(FREEBSD) && !defined(CLOCKS_PER_SEC)
+# include <machine/limits.h>
+# define CLOCKS_PER_SEC CLK_TCK
+# endif
+# if !defined(CLOCKS_PER_SEC)
+# define CLOCKS_PER_SEC 1000000
+ /* This is technically a bug in the implementation. */
+ /* ANSI requires that CLOCKS_PER_SEC be defined. But at least */
+ /* under SunOS 4.1.1, it isn't. Also note that the combination of */
+ /* ANSI C and POSIX is incredibly gross here. The type clock_t */
+ /* is used by both clock() and times(). But on some machines */
+ /* these use different notions of a clock tick, CLOCKS_PER_SEC */
+ /* seems to apply only to clock. Hence we use it here. On many */
+ /* machines, including SunOS, clock actually uses units of */
+ /* microseconds (which are not really clock ticks). */
+# endif
+# define CLOCK_TYPE clock_t
+# define GET_TIME(x) (void)(x = clock())
+# define MS_TIME_DIFF(a,b) (CLOCKS_PER_SEC % 1000 == 0 ? \
+ (unsigned long)((a) - (b)) / (unsigned long)(CLOCKS_PER_SEC / 1000) \
+ : ((unsigned long)((a) - (b)) * 1000) / (unsigned long)CLOCKS_PER_SEC)
+ /* Avoid using double type since some targets (like ARM) might */
+ /* require -lm option for double-to-long conversion. */
+# define NS_FRAC_TIME_DIFF(a, b) (CLOCKS_PER_SEC <= 1000 ? 0UL \
+ : (unsigned long)(CLOCKS_PER_SEC <= (clock_t)1000000UL \
+ ? (((a) - (b)) * ((clock_t)1000000UL / CLOCKS_PER_SEC) % 1000) * 1000 \
+ : (CLOCKS_PER_SEC <= (clock_t)1000000UL * 1000 \
+ ? ((a) - (b)) * ((clock_t)1000000UL * 1000 / CLOCKS_PER_SEC) \
+ : (((a) - (b)) * (clock_t)1000000UL * 1000) / CLOCKS_PER_SEC) \
+ % (clock_t)1000000UL))
+#endif /* !BSD_TIME && !MSWIN32 */
+# ifndef CLOCK_TYPE_INITIALIZER
+ /* This is used to initialize CLOCK_TYPE variables (to some value) */
+ /* to avoid "variable might be uninitialized" compiler warnings. */
+# define CLOCK_TYPE_INITIALIZER 0
+# endif
+#endif /* !NO_CLOCK */
+
+/* We use bzero and bcopy internally. They may not be available. */
+# if defined(SPARC) && defined(SUNOS4) \
+ || (defined(M68K) && defined(NEXT)) || defined(VAX)
+# define BCOPY_EXISTS
+# elif defined(AMIGA) || defined(DARWIN)
+# include <string.h>
+# define BCOPY_EXISTS
+# elif defined(MACOS) && defined(POWERPC)
+# include <MacMemory.h>
+# define bcopy(x,y,n) BlockMoveData(x, y, n)
+# define bzero(x,n) BlockZero(x, n)
+# define BCOPY_EXISTS
+# endif
+
+# if !defined(BCOPY_EXISTS) || defined(CPPCHECK)
+# include <string.h>
+# define BCOPY(x,y,n) memcpy(y, x, (size_t)(n))
+# define BZERO(x,n) memset(x, 0, (size_t)(n))
+# else
+# define BCOPY(x,y,n) bcopy((void *)(x),(void *)(y),(size_t)(n))
+# define BZERO(x,n) bzero((void *)(x),(size_t)(n))
+# endif
+
+#ifdef PCR
+# include "th/PCR_ThCtl.h"
+#endif
+
+EXTERN_C_BEGIN
+
+/*
+ * Stop and restart mutator threads.
+ */
+# ifdef PCR
+# define STOP_WORLD() \
+ PCR_ThCtl_SetExclusiveMode(PCR_ThCtl_ExclusiveMode_stopNormal, \
+ PCR_allSigsBlocked, \
+ PCR_waitForever)
+# define START_WORLD() \
+ PCR_ThCtl_SetExclusiveMode(PCR_ThCtl_ExclusiveMode_null, \
+ PCR_allSigsBlocked, \
+ PCR_waitForever)
+# else
+# if defined(NN_PLATFORM_CTR) || defined(NINTENDO_SWITCH) \
+ || defined(GC_WIN32_THREADS) || defined(GC_PTHREADS)
+ GC_INNER void GC_stop_world(void);
+ GC_INNER void GC_start_world(void);
+# define STOP_WORLD() GC_stop_world()
+# define START_WORLD() GC_start_world()
+# else
+ /* Just do a sanity check: we are not inside GC_do_blocking(). */
+# define STOP_WORLD() GC_ASSERT(GC_blocked_sp == NULL)
+# define START_WORLD()
+# endif
+# endif
+
+#ifdef THREADS
+ GC_EXTERN GC_on_thread_event_proc GC_on_thread_event;
+#endif
+
+/* Abandon ship */
+# if defined(SMALL_CONFIG) || defined(PCR)
+# define GC_on_abort(msg) (void)0 /* be silent on abort */
+# else
+ GC_API_PRIV GC_abort_func GC_on_abort;
+# endif
+# if defined(CPPCHECK)
+# define ABORT(msg) { GC_on_abort(msg); abort(); }
+# elif defined(PCR)
+# define ABORT(s) PCR_Base_Panic(s)
+# else
+# if defined(MSWIN_XBOX1) && !defined(DebugBreak)
+# define DebugBreak() __debugbreak()
+# elif defined(MSWINCE) && !defined(DebugBreak) \
+ && (!defined(UNDER_CE) || (defined(__MINGW32CE__) && !defined(ARM32)))
+ /* This simplifies linking for WinCE (and, probably, doesn't */
+ /* hurt debugging much); use -DDebugBreak=DebugBreak to override */
+ /* this behavior if really needed. This is also a workaround for */
+ /* x86mingw32ce toolchain (if it is still declaring DebugBreak() */
+ /* instead of defining it as a macro). */
+# define DebugBreak() _exit(-1) /* there is no abort() in WinCE */
+# endif
+# if defined(MSWIN32) && (defined(NO_DEBUGGING) || defined(LINT2))
+ /* A more user-friendly abort after showing fatal message. */
+# define ABORT(msg) (GC_on_abort(msg), _exit(-1))
+ /* Exit on error without running "at-exit" callbacks. */
+# elif defined(MSWINCE) && defined(NO_DEBUGGING)
+# define ABORT(msg) (GC_on_abort(msg), ExitProcess(-1))
+# elif defined(MSWIN32) || defined(MSWINCE)
+# if defined(_CrtDbgBreak) && defined(_DEBUG) && defined(_MSC_VER)
+# define ABORT(msg) { GC_on_abort(msg); \
+ _CrtDbgBreak() /* __debugbreak() */; }
+# else
+# define ABORT(msg) { GC_on_abort(msg); DebugBreak(); }
+ /* Note that: on a WinCE box, this could be silently */
+ /* ignored (i.e., the program is not aborted); */
+ /* DebugBreak is a statement in some toolchains. */
+# endif
+# else
+# define ABORT(msg) (GC_on_abort(msg), abort())
+# endif /* !MSWIN32 */
+# endif /* !PCR */
+
+/* For abort message with 1-3 arguments. C_msg and C_fmt should be */
+/* literals. C_msg should not contain format specifiers. Arguments */
+/* should match their format specifiers. */
+#define ABORT_ARG1(C_msg, C_fmt, arg1) \
+ MACRO_BLKSTMT_BEGIN \
+ GC_ERRINFO_PRINTF(C_msg /* + */ C_fmt "\n", arg1); \
+ ABORT(C_msg); \
+ MACRO_BLKSTMT_END
+#define ABORT_ARG2(C_msg, C_fmt, arg1, arg2) \
+ MACRO_BLKSTMT_BEGIN \
+ GC_ERRINFO_PRINTF(C_msg /* + */ C_fmt "\n", arg1, arg2); \
+ ABORT(C_msg); \
+ MACRO_BLKSTMT_END
+#define ABORT_ARG3(C_msg, C_fmt, arg1, arg2, arg3) \
+ MACRO_BLKSTMT_BEGIN \
+ GC_ERRINFO_PRINTF(C_msg /* + */ C_fmt "\n", \
+ arg1, arg2, arg3); \
+ ABORT(C_msg); \
+ MACRO_BLKSTMT_END
+
+/* Same as ABORT but does not have 'no-return' attribute. */
+/* ABORT on a dummy condition (which is always true). */
+#define ABORT_RET(msg) \
+ if ((signed_word)GC_current_warn_proc == -1) {} else ABORT(msg)
+
+/* Exit abnormally, but without making a mess (e.g. out of memory) */
+# ifdef PCR
+# define EXIT() PCR_Base_Exit(1,PCR_waitForever)
+# else
+# define EXIT() (GC_on_abort(NULL), exit(1 /* EXIT_FAILURE */))
+# endif
+
+/* Print warning message, e.g. almost out of memory. */
+/* The argument (if any) format specifier should be: */
+/* "%s", "%p", "%"WARN_PRIdPTR or "%"WARN_PRIuPTR. */
+#define WARN(msg, arg) \
+ (*GC_current_warn_proc)((/* no const */ char *)("GC Warning: " msg), \
+ (word)(arg))
+GC_EXTERN GC_warn_proc GC_current_warn_proc;
+
+/* Print format type macro for decimal signed_word value passed WARN(). */
+/* This could be redefined for Win64 or LLP64, but typically should */
+/* not be done as the WARN format string is, possibly, processed on the */
+/* client side, so non-standard print type modifiers (like MS "I64d") */
+/* should be avoided here if possible. */
+#ifndef WARN_PRIdPTR
+ /* Assume sizeof(void *) == sizeof(long) or a little-endian machine. */
+# define WARN_PRIdPTR "ld"
+# define WARN_PRIuPTR "lu"
+#endif
+
+/* A tagging macro (for a code static analyzer) to indicate that the */
+/* string obtained from an untrusted source (e.g., argv[], getenv) is */
+/* safe to use in a vulnerable operation (e.g., open, exec). */
+#define TRUSTED_STRING(s) (char*)COVERT_DATAFLOW(s)
+
+/* Get environment entry */
+#ifdef GC_READ_ENV_FILE
+ GC_INNER char * GC_envfile_getenv(const char *name);
+# define GETENV(name) GC_envfile_getenv(name)
+#elif defined(NO_GETENV) && !defined(CPPCHECK)
+# define GETENV(name) NULL
+#elif defined(EMPTY_GETENV_RESULTS)
+ /* Workaround for a reputed Wine bug. */
+ GC_INLINE char * fixed_getenv(const char *name)
+ {
+ char *value = getenv(name);
+ return value != NULL && *value != '\0' ? value : NULL;
+ }
+# define GETENV(name) fixed_getenv(name)
+#else
+# define GETENV(name) getenv(name)
+#endif
+
+EXTERN_C_END
+
+#if defined(DARWIN)
+# include <mach/thread_status.h>
+# ifndef MAC_OS_X_VERSION_MAX_ALLOWED
+# include <AvailabilityMacros.h>
+ /* Include this header just to import the above macro. */
+# endif
+# if defined(POWERPC)
+# if CPP_WORDSZ == 32
+# define GC_THREAD_STATE_T ppc_thread_state_t
+# else
+# define GC_THREAD_STATE_T ppc_thread_state64_t
+# define GC_MACH_THREAD_STATE PPC_THREAD_STATE64
+# define GC_MACH_THREAD_STATE_COUNT PPC_THREAD_STATE64_COUNT
+# endif
+# elif defined(I386) || defined(X86_64)
+# if CPP_WORDSZ == 32
+# if defined(i386_THREAD_STATE_COUNT) && !defined(x86_THREAD_STATE32_COUNT)
+ /* Use old naming convention for 32-bit x86. */
+# define GC_THREAD_STATE_T i386_thread_state_t
+# define GC_MACH_THREAD_STATE i386_THREAD_STATE
+# define GC_MACH_THREAD_STATE_COUNT i386_THREAD_STATE_COUNT
+# else
+# define GC_THREAD_STATE_T x86_thread_state32_t
+# define GC_MACH_THREAD_STATE x86_THREAD_STATE32
+# define GC_MACH_THREAD_STATE_COUNT x86_THREAD_STATE32_COUNT
+# endif
+# else
+# define GC_THREAD_STATE_T x86_thread_state64_t
+# define GC_MACH_THREAD_STATE x86_THREAD_STATE64
+# define GC_MACH_THREAD_STATE_COUNT x86_THREAD_STATE64_COUNT
+# endif
+# elif defined(ARM32) && defined(ARM_UNIFIED_THREAD_STATE) \
+ && !defined(CPPCHECK)
+# define GC_THREAD_STATE_T arm_unified_thread_state_t
+# define GC_MACH_THREAD_STATE ARM_UNIFIED_THREAD_STATE
+# define GC_MACH_THREAD_STATE_COUNT ARM_UNIFIED_THREAD_STATE_COUNT
+# elif defined(ARM32)
+# define GC_THREAD_STATE_T arm_thread_state_t
+# ifdef ARM_MACHINE_THREAD_STATE_COUNT
+# define GC_MACH_THREAD_STATE ARM_MACHINE_THREAD_STATE
+# define GC_MACH_THREAD_STATE_COUNT ARM_MACHINE_THREAD_STATE_COUNT
+# endif
+# elif defined(AARCH64)
+# define GC_THREAD_STATE_T arm_thread_state64_t
+# define GC_MACH_THREAD_STATE ARM_THREAD_STATE64
+# define GC_MACH_THREAD_STATE_COUNT ARM_THREAD_STATE64_COUNT
+# elif !defined(CPPCHECK)
+# error define GC_THREAD_STATE_T
+# endif
+# ifndef GC_MACH_THREAD_STATE
+# define GC_MACH_THREAD_STATE MACHINE_THREAD_STATE
+# define GC_MACH_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT
+# endif
+
+# if CPP_WORDSZ == 32
+# define GC_MACH_HEADER mach_header
+# define GC_MACH_SECTION section
+# define GC_GETSECTBYNAME getsectbynamefromheader
+# else
+# define GC_MACH_HEADER mach_header_64
+# define GC_MACH_SECTION section_64
+# define GC_GETSECTBYNAME getsectbynamefromheader_64
+# endif
+
+ /* Try to work out the right way to access thread state structure */
+ /* members. The structure has changed its definition in different */
+ /* Darwin versions. This now defaults to the (older) names */
+ /* without __, thus hopefully, not breaking any existing */
+ /* Makefile.direct builds. */
+# if __DARWIN_UNIX03
+# define THREAD_FLD_NAME(x) __ ## x
+# else
+# define THREAD_FLD_NAME(x) x
+# endif
+# if defined(ARM32) && defined(ARM_UNIFIED_THREAD_STATE)
+# define THREAD_FLD(x) ts_32.THREAD_FLD_NAME(x)
+# else
+# define THREAD_FLD(x) THREAD_FLD_NAME(x)
+# endif
+#endif /* DARWIN */
+
+#include <setjmp.h>
+
+#if __STDC_VERSION__ >= 201112L
+# include <assert.h> /* for static_assert */
+#endif
+
+EXTERN_C_BEGIN
+
+/*********************************/
+/* */
+/* Word-size-dependent defines */
+/* */
+/*********************************/
+
+#if CPP_WORDSZ == 32
+# define WORDS_TO_BYTES(x) ((x)<<2)
+# define BYTES_TO_WORDS(x) ((x)>>2)
+# define LOGWL ((word)5) /* log[2] of CPP_WORDSZ */
+# define modWORDSZ(n) ((n) & 0x1f) /* n mod size of word */
+# if ALIGNMENT != 4
+# define UNALIGNED_PTRS
+# endif
+#endif
+
+#if CPP_WORDSZ == 64
+# define WORDS_TO_BYTES(x) ((x)<<3)
+# define BYTES_TO_WORDS(x) ((x)>>3)
+# define LOGWL ((word)6) /* log[2] of CPP_WORDSZ */
+# define modWORDSZ(n) ((n) & 0x3f) /* n mod size of word */
+# if ALIGNMENT != 8
+# define UNALIGNED_PTRS
+# endif
+#endif
+
+/* The first TINY_FREELISTS free lists correspond to the first */
+/* TINY_FREELISTS multiples of GRANULE_BYTES, i.e. we keep */
+/* separate free lists for each multiple of GRANULE_BYTES */
+/* up to (TINY_FREELISTS-1) * GRANULE_BYTES. After that they */
+/* may be spread out further. */
+
+#define GRANULE_BYTES GC_GRANULE_BYTES
+#define TINY_FREELISTS GC_TINY_FREELISTS
+
+#define WORDSZ ((word)CPP_WORDSZ)
+#define SIGNB ((word)1 << (WORDSZ-1))
+#define BYTES_PER_WORD ((word)(sizeof (word)))
+#define divWORDSZ(n) ((n) >> LOGWL) /* divide n by size of word */
+
+#if GRANULE_BYTES == 8
+# define BYTES_TO_GRANULES(n) ((n)>>3)
+# define GRANULES_TO_BYTES(n) ((n)<<3)
+# if CPP_WORDSZ == 64
+# define GRANULES_TO_WORDS(n) (n)
+# elif CPP_WORDSZ == 32
+# define GRANULES_TO_WORDS(n) ((n)<<1)
+# else
+# define GRANULES_TO_WORDS(n) BYTES_TO_WORDS(GRANULES_TO_BYTES(n))
+# endif
+#elif GRANULE_BYTES == 16
+# define BYTES_TO_GRANULES(n) ((n)>>4)
+# define GRANULES_TO_BYTES(n) ((n)<<4)
+# if CPP_WORDSZ == 64
+# define GRANULES_TO_WORDS(n) ((n)<<1)
+# elif CPP_WORDSZ == 32
+# define GRANULES_TO_WORDS(n) ((n)<<2)
+# else
+# define GRANULES_TO_WORDS(n) BYTES_TO_WORDS(GRANULES_TO_BYTES(n))
+# endif
+#else
+# error Bad GRANULE_BYTES value
+#endif
+
+/*********************/
+/* */
+/* Size Parameters */
+/* */
+/*********************/
+
+/* Heap block size, bytes. Should be power of 2. */
+/* Incremental GC with MPROTECT_VDB currently requires the */
+/* page size to be a multiple of HBLKSIZE. Since most modern */
+/* architectures support variable page sizes down to 4 KB, and */
+/* x86 is generally 4 KB, we now default to 4 KB, except for */
+/* Alpha: Seems to be used with 8 KB pages. */
+/* SMALL_CONFIG: Want less block-level fragmentation. */
+#ifndef HBLKSIZE
+# if defined(LARGE_CONFIG) || !defined(SMALL_CONFIG)
+# ifdef ALPHA
+# define CPP_LOG_HBLKSIZE 13
+# elif defined(SN_TARGET_PSP2)
+# define CPP_LOG_HBLKSIZE 16 /* page size is set to 64 KB */
+# else
+# define CPP_LOG_HBLKSIZE 12
+# endif
+# else
+# define CPP_LOG_HBLKSIZE 10
+# endif
+#else
+# if HBLKSIZE == 512
+# define CPP_LOG_HBLKSIZE 9
+# elif HBLKSIZE == 1024
+# define CPP_LOG_HBLKSIZE 10
+# elif HBLKSIZE == 2048
+# define CPP_LOG_HBLKSIZE 11
+# elif HBLKSIZE == 4096
+# define CPP_LOG_HBLKSIZE 12
+# elif HBLKSIZE == 8192
+# define CPP_LOG_HBLKSIZE 13
+# elif HBLKSIZE == 16384
+# define CPP_LOG_HBLKSIZE 14
+# elif !defined(CPPCHECK)
+# error Bad HBLKSIZE value
+# endif
+# undef HBLKSIZE
+#endif
+
+# define CPP_HBLKSIZE (1 << CPP_LOG_HBLKSIZE)
+# define LOG_HBLKSIZE ((size_t)CPP_LOG_HBLKSIZE)
+# define HBLKSIZE ((size_t)CPP_HBLKSIZE)
+
+#define GC_SQRT_SIZE_MAX ((((size_t)1) << (WORDSZ / 2)) - 1)
+
+/* Max size objects supported by freelist (larger objects are */
+/* allocated directly with allchblk(), by rounding to the next */
+/* multiple of HBLKSIZE). */
+#define CPP_MAXOBJBYTES (CPP_HBLKSIZE/2)
+#define MAXOBJBYTES ((size_t)CPP_MAXOBJBYTES)
+#define CPP_MAXOBJWORDS BYTES_TO_WORDS(CPP_MAXOBJBYTES)
+#define MAXOBJWORDS ((size_t)CPP_MAXOBJWORDS)
+#define CPP_MAXOBJGRANULES BYTES_TO_GRANULES(CPP_MAXOBJBYTES)
+#define MAXOBJGRANULES ((size_t)CPP_MAXOBJGRANULES)
+
+# define divHBLKSZ(n) ((n) >> LOG_HBLKSIZE)
+
+# define HBLK_PTR_DIFF(p,q) divHBLKSZ((ptr_t)p - (ptr_t)q)
+ /* Equivalent to subtracting 2 hblk pointers. */
+ /* We do it this way because a compiler should */
+ /* find it hard to use an integer division */
+ /* instead of a shift. The bundled SunOS 4.1 */
+ /* o.w. sometimes pessimizes the subtraction to */
+ /* involve a call to .div. */
+
+# define modHBLKSZ(n) ((n) & (HBLKSIZE-1))
+
+# define HBLKPTR(objptr) ((struct hblk *)(((word)(objptr)) \
+ & ~(word)(HBLKSIZE-1)))
+# define HBLKDISPL(objptr) (((size_t) (objptr)) & (HBLKSIZE-1))
+
+/* Round up allocation size (in bytes) to a multiple of a granule. */
+#define ROUNDUP_GRANULE_SIZE(lb) /* lb should have no side-effect */ \
+ (SIZET_SAT_ADD(lb, GRANULE_BYTES-1) & ~(size_t)(GRANULE_BYTES-1))
+
+/* Round up byte allocation requests to integral number of words, etc. */
+# define ROUNDED_UP_GRANULES(lb) /* lb should have no side-effect */ \
+ BYTES_TO_GRANULES(SIZET_SAT_ADD(lb, GRANULE_BYTES - 1 + EXTRA_BYTES))
+# if MAX_EXTRA_BYTES == 0
+# define SMALL_OBJ(bytes) EXPECT((bytes) <= (MAXOBJBYTES), TRUE)
+# else
+# define SMALL_OBJ(bytes) \
+ (EXPECT((bytes) <= (MAXOBJBYTES - MAX_EXTRA_BYTES), TRUE) \
+ || (bytes) <= MAXOBJBYTES - EXTRA_BYTES)
+ /* This really just tests bytes <= MAXOBJBYTES - EXTRA_BYTES. */
+ /* But we try to avoid looking up EXTRA_BYTES. */
+# endif
+# define ADD_SLOP(lb) /* lb should have no side-effect */ \
+ SIZET_SAT_ADD(lb, EXTRA_BYTES)
+
+/*
+ * Hash table representation of sets of pages.
+ * Implements a map from aligned HBLKSIZE chunks of the address space to one
+ * bit each.
+ * This assumes it is OK to spuriously set bits, e.g. because multiple
+ * addresses are represented by a single location.
+ * Used by black-listing code, and perhaps by dirty bit maintenance code.
+ */
+
+#ifndef LOG_PHT_ENTRIES
+# ifdef LARGE_CONFIG
+# if CPP_WORDSZ == 32
+# define LOG_PHT_ENTRIES 20 /* Collisions likely at 1M blocks, */
+ /* which is >= 4 GB. Each table takes */
+ /* 128 KB, some of which may never be */
+ /* touched. */
+# else
+# define LOG_PHT_ENTRIES 21 /* Collisions likely at 2M blocks, */
+ /* which is >= 8 GB. Each table takes */
+ /* 256 KB, some of which may never be */
+ /* touched. */
+# endif
+# elif !defined(SMALL_CONFIG)
+# define LOG_PHT_ENTRIES 18 /* Collisions are likely if heap grows */
+ /* to more than 256K hblks >= 1 GB. */
+ /* Each hash table occupies 32 KB. */
+ /* Even for somewhat smaller heaps, */
+ /* say half that, collisions may be an */
+ /* issue because we blacklist */
+ /* addresses outside the heap. */
+# else
+# define LOG_PHT_ENTRIES 15 /* Collisions are likely if heap grows */
+ /* to more than 32K hblks (128 MB). */
+ /* Each hash table occupies 4 KB. */
+# endif
+#endif /* !LOG_PHT_ENTRIES */
+
+# define PHT_ENTRIES ((word)1 << LOG_PHT_ENTRIES)
+# define PHT_SIZE (PHT_ENTRIES >> LOGWL)
+typedef word page_hash_table[PHT_SIZE];
+
+# define PHT_HASH(addr) ((((word)(addr)) >> LOG_HBLKSIZE) & (PHT_ENTRIES - 1))
+
+# define get_pht_entry_from_index(bl, index) \
+ (((bl)[divWORDSZ(index)] >> modWORDSZ(index)) & 1)
+# define set_pht_entry_from_index(bl, index) \
+ (void)((bl)[divWORDSZ(index)] |= (word)1 << modWORDSZ(index))
+
+#if defined(THREADS) && defined(AO_HAVE_or)
+ /* And, one more version for GC_add_to_black_list_normal/stack */
+ /* (invoked indirectly by GC_do_local_mark) and */
+ /* async_set_pht_entry_from_index (invoked by GC_dirty or the write */
+ /* fault handler). */
+# define set_pht_entry_from_index_concurrent(bl, index) \
+ AO_or((volatile AO_t *)&(bl)[divWORDSZ(index)], \
+ (AO_t)((word)1 << modWORDSZ(index)))
+#else
+# define set_pht_entry_from_index_concurrent(bl, index) \
+ set_pht_entry_from_index(bl, index)
+#endif
+
+
+/********************************************/
+/* */
+/* H e a p B l o c k s */
+/* */
+/********************************************/
+
+/* heap block header */
+#define HBLKMASK (HBLKSIZE-1)
+
+#define MARK_BITS_PER_HBLK (HBLKSIZE/GRANULE_BYTES)
+ /* upper bound */
+ /* We allocate 1 bit per allocation granule. */
+ /* If MARK_BIT_PER_GRANULE is defined, we use */
+ /* every nth bit, where n is the number of */
+ /* allocation granules per object. If */
+ /* MARK_BIT_PER_OBJ is defined, we only use the */
+ /* initial group of mark bits, and it is safe */
+ /* to allocate smaller header for large objects. */
+
+union word_ptr_ao_u {
+ word w;
+ signed_word sw;
+ void *vp;
+# ifdef PARALLEL_MARK
+ volatile AO_t ao;
+# endif
+};
+
+struct hblkhdr {
+ struct hblk * hb_next; /* Link field for hblk free list */
+ /* and for lists of chunks waiting to be */
+ /* reclaimed. */
+ struct hblk * hb_prev; /* Backwards link for free list. */
+ struct hblk * hb_block; /* The corresponding block. */
+ unsigned char hb_obj_kind;
+ /* Kind of objects in the block. Each kind */
+ /* identifies a mark procedure and a set of */
+ /* list headers. Sometimes called regions. */
+ unsigned char hb_flags;
+# define IGNORE_OFF_PAGE 1 /* Ignore pointers that do not */
+ /* point to the first hblk of */
+ /* this object. */
+# define WAS_UNMAPPED 2 /* This is a free block, which has */
+ /* been unmapped from the address */
+ /* space. */
+ /* GC_remap must be invoked on it */
+ /* before it can be reallocated. */
+ /* Only set with USE_MUNMAP. */
+# define FREE_BLK 4 /* Block is free, i.e. not in use. */
+# ifdef ENABLE_DISCLAIM
+# define HAS_DISCLAIM 8
+ /* This kind has a callback on reclaim. */
+# define MARK_UNCONDITIONALLY 0x10
+ /* Mark from all objects, marked or */
+ /* not. Used to mark objects needed by */
+ /* reclaim notifier. */
+# endif
+# ifdef MARK_BIT_PER_GRANULE
+# define LARGE_BLOCK 0x20
+# endif
+ unsigned short hb_last_reclaimed;
+ /* Value of GC_gc_no when block was */
+ /* last allocated or swept. May wrap. */
+ /* For a free block, this is maintained */
+ /* only for USE_MUNMAP, and indicates */
+ /* when the header was allocated, or */
+ /* when the size of the block last */
+ /* changed. */
+# ifdef MARK_BIT_PER_OBJ
+ unsigned32 hb_inv_sz; /* A good upper bound for 2**32/hb_sz. */
+ /* For large objects, we use */
+ /* LARGE_INV_SZ. */
+# define LARGE_INV_SZ (1 << 16)
+# endif
+ word hb_sz; /* If in use, size in bytes, of objects in the block. */
+ /* if free, the size in bytes of the whole block. */
+ /* We assume that this is convertible to signed_word */
+ /* without generating a negative result. We avoid */
+ /* generating free blocks larger than that. */
+ word hb_descr; /* object descriptor for marking. See */
+ /* gc_mark.h. */
+# ifdef MARK_BIT_PER_GRANULE
+ unsigned short * hb_map; /* Essentially a table of remainders */
+ /* mod BYTES_TO_GRANULES(hb_sz), except */
+ /* for large blocks. See GC_obj_map. */
+# endif
+# ifdef PARALLEL_MARK
+ volatile AO_t hb_n_marks; /* Number of set mark bits, excluding */
+ /* the one always set at the end. */
+ /* Currently it is concurrently */
+ /* updated and hence only approximate. */
+ /* But a zero value does guarantee that */
+ /* the block contains no marked */
+ /* objects. */
+ /* Ensuring this property means that we */
+ /* never decrement it to zero during a */
+ /* collection, and hence the count may */
+ /* be one too high. Due to concurrent */
+ /* updates, an arbitrary number of */
+ /* increments, but not all of them (!) */
+ /* may be lost, hence it may in theory */
+ /* be much too low. */
+ /* The count may also be too high if */
+ /* multiple mark threads mark the */
+ /* same object due to a race. */
+# else
+ size_t hb_n_marks; /* Without parallel marking, the count */
+ /* is accurate. */
+# endif
+# ifdef USE_MARK_BYTES
+# define MARK_BITS_SZ (MARK_BITS_PER_HBLK + 1)
+ /* Unlike the other case, this is in units of bytes. */
+ /* Since we force double-word alignment, we need at most one */
+ /* mark bit per 2 words. But we do allocate and set one */
+ /* extra mark bit to avoid an explicit check for the */
+ /* partial object at the end of each block. */
+ union {
+ char _hb_marks[MARK_BITS_SZ];
+ /* The i'th byte is 1 if the object */
+ /* starting at granule i or object i is */
+ /* marked, 0 o.w. */
+ /* The mark bit for the "one past the */
+ /* end" object is always set to avoid a */
+ /* special case test in the marker. */
+ word dummy; /* Force word alignment of mark bytes. */
+ } _mark_byte_union;
+# define hb_marks _mark_byte_union._hb_marks
+# else
+# define MARK_BITS_SZ (MARK_BITS_PER_HBLK/CPP_WORDSZ + 1)
+ word hb_marks[MARK_BITS_SZ];
+# endif /* !USE_MARK_BYTES */
+};
+
+# define ANY_INDEX 23 /* "Random" mark bit index for assertions */
+
+/* heap block body */
+
+# define HBLK_WORDS (HBLKSIZE/sizeof(word))
+# define HBLK_GRANULES (HBLKSIZE/GRANULE_BYTES)
+
+/* The number of objects in a block dedicated to a certain size. */
+/* may erroneously yield zero (instead of one) for large objects. */
+# define HBLK_OBJS(sz_in_bytes) (HBLKSIZE/(sz_in_bytes))
+
+struct hblk {
+ char hb_body[HBLKSIZE];
+};
+
+# define HBLK_IS_FREE(hdr) (((hdr) -> hb_flags & FREE_BLK) != 0)
+
+# define OBJ_SZ_TO_BLOCKS(lb) divHBLKSZ((lb) + HBLKSIZE-1)
+# define OBJ_SZ_TO_BLOCKS_CHECKED(lb) /* lb should have no side-effect */ \
+ divHBLKSZ(SIZET_SAT_ADD(lb, HBLKSIZE - 1))
+ /* Size of block (in units of HBLKSIZE) needed to hold objects of */
+ /* given lb (in bytes). The checked variant prevents wrap around. */
+
+/* Object free list link */
+# define obj_link(p) (*(void **)(p))
+
+# define LOG_MAX_MARK_PROCS 6
+# define MAX_MARK_PROCS (1 << LOG_MAX_MARK_PROCS)
+
+/* Root sets. Logically private to mark_rts.c. But we don't want the */
+/* tables scanned, so we put them here. */
+/* MAX_ROOT_SETS is the maximum number of ranges that can be */
+/* registered as static roots. */
+# ifdef LARGE_CONFIG
+# define MAX_ROOT_SETS 8192
+# elif !defined(SMALL_CONFIG)
+# define MAX_ROOT_SETS 2048
+# else
+# define MAX_ROOT_SETS 512
+# endif
+
+# define MAX_EXCLUSIONS (MAX_ROOT_SETS/4)
+/* Maximum number of segments that can be excluded from root sets. */
+
+/*
+ * Data structure for excluded static roots.
+ */
+struct exclusion {
+ ptr_t e_start;
+ ptr_t e_end;
+};
+
+/* Data structure for list of root sets. */
+/* We keep a hash table, so that we can filter out duplicate additions. */
+/* Under Win32, we need to do a better job of filtering overlaps, so */
+/* we resort to sequential search, and pay the price. */
+struct roots {
+ ptr_t r_start;/* multiple of word size */
+ ptr_t r_end; /* multiple of word size and greater than r_start */
+# if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ struct roots * r_next;
+# endif
+ GC_bool r_tmp;
+ /* Delete before registering new dynamic libraries */
+};
+
+#if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ /* Size of hash table index to roots. */
+# define LOG_RT_SIZE 6
+# define RT_SIZE (1 << LOG_RT_SIZE) /* Power of 2, may be != MAX_ROOT_SETS */
+#endif
+
+#if (!defined(MAX_HEAP_SECTS) || defined(CPPCHECK)) \
+ && (defined(CYGWIN32) || defined(MSWIN32) || defined(MSWINCE) \
+ || defined(USE_PROC_FOR_LIBRARIES))
+# ifdef LARGE_CONFIG
+# if CPP_WORDSZ > 32
+# define MAX_HEAP_SECTS 81920
+# else
+# define MAX_HEAP_SECTS 7680
+# endif
+# elif defined(SMALL_CONFIG) && !defined(USE_PROC_FOR_LIBRARIES)
+# if defined(PARALLEL_MARK) && (defined(MSWIN32) || defined(CYGWIN32))
+# define MAX_HEAP_SECTS 384
+# else
+# define MAX_HEAP_SECTS 128 /* Roughly 256 MB (128*2048*1024) */
+# endif
+# elif CPP_WORDSZ > 32
+# define MAX_HEAP_SECTS 1024 /* Roughly 8 GB */
+# else
+# define MAX_HEAP_SECTS 512 /* Roughly 4 GB */
+# endif
+#endif /* !MAX_HEAP_SECTS */
+
+typedef struct GC_ms_entry {
+ ptr_t mse_start; /* First word of object, word aligned. */
+ union word_ptr_ao_u mse_descr;
+ /* Descriptor; low order two bits are tags, */
+ /* as described in gc_mark.h. */
+} mse;
+
+typedef int mark_state_t; /* Current state of marking. */
+ /* Used to remember where we are during */
+ /* concurrent marking. */
+
+struct disappearing_link;
+struct finalizable_object;
+
+struct dl_hashtbl_s {
+ struct disappearing_link **head;
+ word entries;
+ unsigned log_size;
+};
+
+struct fnlz_roots_s {
+ struct finalizable_object **fo_head;
+ /* List of objects that should be finalized now: */
+ struct finalizable_object *finalize_now;
+};
+
+union toggle_ref_u {
+ /* The lowest bit is used to distinguish between choices. */
+ void *strong_ref;
+ GC_hidden_pointer weak_ref;
+};
+
+/* Extended descriptors. GC_typed_mark_proc understands these. */
+/* These are used for simple objects that are larger than what */
+/* can be described by a BITMAP_BITS sized bitmap. */
+typedef struct {
+ word ed_bitmap; /* lsb corresponds to first word. */
+ GC_bool ed_continued; /* next entry is continuation. */
+} typed_ext_descr_t;
+
+struct HeapSect {
+ ptr_t hs_start;
+ size_t hs_bytes;
+};
+
+/* Lists of all heap blocks and free lists */
+/* as well as other random data structures */
+/* that should not be scanned by the */
+/* collector. */
+/* These are grouped together in a struct */
+/* so that they can be easily skipped by the */
+/* GC_mark routine. */
+/* The ordering is weird to make GC_malloc */
+/* faster by keeping the important fields */
+/* sufficiently close together that a */
+/* single load of a base register will do. */
+/* Scalars that could easily appear to */
+/* be pointers are also put here. */
+/* The main fields should precede any */
+/* conditionally included fields, so that */
+/* gc_inline.h will work even if a different */
+/* set of macros is defined when the client is */
+/* compiled. */
+
+struct _GC_arrays {
+ word _heapsize; /* Heap size in bytes (value never goes down). */
+ word _requested_heapsize; /* Heap size due to explicit expansion. */
+ ptr_t _last_heap_addr;
+ word _large_free_bytes;
+ /* Total bytes contained in blocks on large object free */
+ /* list. */
+ word _large_allocd_bytes;
+ /* Total number of bytes in allocated large objects blocks. */
+ /* For the purposes of this counter and the next one only, a */
+ /* large object is one that occupies a block of at least */
+ /* 2*HBLKSIZE. */
+ word _max_large_allocd_bytes;
+ /* Maximum number of bytes that were ever allocated in */
+ /* large object blocks. This is used to help decide when it */
+ /* is safe to split up a large block. */
+ word _bytes_allocd_before_gc;
+ /* Number of bytes allocated before this */
+ /* collection cycle. */
+# define GC_our_mem_bytes GC_arrays._our_mem_bytes
+ word _our_mem_bytes;
+# ifndef SEPARATE_GLOBALS
+# define GC_bytes_allocd GC_arrays._bytes_allocd
+ word _bytes_allocd;
+ /* Number of bytes allocated during this collection cycle. */
+# endif
+ word _bytes_dropped;
+ /* Number of black-listed bytes dropped during GC cycle */
+ /* as a result of repeated scanning during allocation */
+ /* attempts. These are treated largely as allocated, */
+ /* even though they are not useful to the client. */
+ word _bytes_finalized;
+ /* Approximate number of bytes in objects (and headers) */
+ /* that became ready for finalization in the last */
+ /* collection. */
+ word _bytes_freed;
+ /* Number of explicitly deallocated bytes of memory */
+ /* since last collection. */
+ word _finalizer_bytes_freed;
+ /* Bytes of memory explicitly deallocated while */
+ /* finalizers were running. Used to approximate memory */
+ /* explicitly deallocated by finalizers. */
+ bottom_index *_all_bottom_indices;
+ /* Pointer to the first (lowest address) bottom_index; */
+ /* assumes the lock is held. */
+ bottom_index *_all_bottom_indices_end;
+ /* Pointer to the last (highest address) bottom_index; */
+ /* assumes the lock is held. */
+ ptr_t _scratch_free_ptr;
+ hdr *_hdr_free_list;
+ ptr_t _scratch_end_ptr;
+ /* GC_scratch_end_ptr is end point of the current scratch area. */
+# if defined(IRIX5) || (defined(USE_PROC_FOR_LIBRARIES) && !defined(LINUX))
+# define USE_SCRATCH_LAST_END_PTR
+# define GC_scratch_last_end_ptr GC_arrays._scratch_last_end_ptr
+ ptr_t _scratch_last_end_ptr;
+ /* GC_scratch_last_end_ptr is the end point of the last */
+ /* obtained scratch area. */
+ /* Used by GC_register_dynamic_libraries(). */
+# endif
+# if defined(GC_ASSERTIONS) || defined(INCLUDE_LINUX_THREAD_DESCR) \
+ || (defined(KEEP_BACK_PTRS) && ALIGNMENT == 1)
+# define SET_REAL_HEAP_BOUNDS
+# define GC_least_real_heap_addr GC_arrays._least_real_heap_addr
+# define GC_greatest_real_heap_addr GC_arrays._greatest_real_heap_addr
+ word _least_real_heap_addr;
+ word _greatest_real_heap_addr;
+ /* Similar to GC_least/greatest_plausible_heap_addr but */
+ /* do not include future (potential) heap expansion. */
+ /* Both variables are zero initially. */
+# endif
+ mse *_mark_stack;
+ /* Limits of stack for GC_mark routine. All ranges */
+ /* between GC_mark_stack (incl.) and GC_mark_stack_top */
+ /* (incl.) still need to be marked from. */
+ mse *_mark_stack_limit;
+# ifdef PARALLEL_MARK
+ mse *volatile _mark_stack_top;
+ /* Updated only with mark lock held, but read asynchronously. */
+ /* TODO: Use union to avoid casts to AO_t */
+# else
+ mse *_mark_stack_top;
+# endif
+ word _composite_in_use; /* Number of bytes in the accessible */
+ /* composite objects. */
+ word _atomic_in_use; /* Number of bytes in the accessible */
+ /* atomic objects. */
+# ifdef USE_MUNMAP
+# define GC_unmapped_bytes GC_arrays._unmapped_bytes
+ word _unmapped_bytes;
+# else
+# define GC_unmapped_bytes 0
+# endif
+# if defined(COUNT_UNMAPPED_REGIONS) && defined(USE_MUNMAP)
+# define GC_num_unmapped_regions GC_arrays._num_unmapped_regions
+ signed_word _num_unmapped_regions;
+# else
+# define GC_num_unmapped_regions 0
+# endif
+ bottom_index * _all_nils;
+# define GC_scan_ptr GC_arrays._scan_ptr
+ struct hblk * _scan_ptr;
+# ifdef PARALLEL_MARK
+# define GC_main_local_mark_stack GC_arrays._main_local_mark_stack
+ mse *_main_local_mark_stack;
+# define GC_first_nonempty GC_arrays._first_nonempty
+ volatile AO_t _first_nonempty;
+ /* Lowest entry on mark stack that may be */
+ /* nonempty. Updated only by initiating thread. */
+# endif
+# define GC_mark_stack_size GC_arrays._mark_stack_size
+ size_t _mark_stack_size;
+# define GC_mark_state GC_arrays._mark_state
+ mark_state_t _mark_state; /* Initialized to MS_NONE (0). */
+# define GC_mark_stack_too_small GC_arrays._mark_stack_too_small
+ GC_bool _mark_stack_too_small;
+ /* We need a larger mark stack. May be set by */
+ /* client supplied mark routines. */
+# define GC_objects_are_marked GC_arrays._objects_are_marked
+ GC_bool _objects_are_marked;
+ /* Are there collectible marked objects in the heap? */
+# ifdef ENABLE_TRACE
+# define GC_trace_addr GC_arrays._trace_addr
+ ptr_t _trace_addr;
+# endif
+# define GC_noop_sink GC_arrays._noop_sink
+ volatile word _noop_sink;
+# define GC_capacity_heap_sects GC_arrays._capacity_heap_sects
+ size_t _capacity_heap_sects;
+# define GC_n_heap_sects GC_arrays._n_heap_sects
+ word _n_heap_sects; /* Number of separately added heap sections. */
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+# define GC_n_heap_bases GC_arrays._n_heap_bases
+ word _n_heap_bases; /* See GC_heap_bases. */
+# endif
+# ifdef USE_PROC_FOR_LIBRARIES
+# define GC_n_memory GC_arrays._n_memory
+ word _n_memory; /* Number of GET_MEM allocated memory sections. */
+# endif
+# ifdef GC_GCJ_SUPPORT
+# define GC_gcjobjfreelist GC_arrays._gcjobjfreelist
+ ptr_t *_gcjobjfreelist;
+# endif
+# define GC_fo_entries GC_arrays._fo_entries
+ word _fo_entries;
+# ifndef GC_NO_FINALIZATION
+# define GC_dl_hashtbl GC_arrays._dl_hashtbl
+# define GC_fnlz_roots GC_arrays._fnlz_roots
+# define GC_log_fo_table_size GC_arrays._log_fo_table_size
+# ifndef GC_LONG_REFS_NOT_NEEDED
+# define GC_ll_hashtbl GC_arrays._ll_hashtbl
+ struct dl_hashtbl_s _ll_hashtbl;
+# endif
+ struct dl_hashtbl_s _dl_hashtbl;
+ struct fnlz_roots_s _fnlz_roots;
+ unsigned _log_fo_table_size;
+# ifndef GC_TOGGLE_REFS_NOT_NEEDED
+# define GC_toggleref_arr GC_arrays._toggleref_arr
+# define GC_toggleref_array_size GC_arrays._toggleref_array_size
+# define GC_toggleref_array_capacity GC_arrays._toggleref_array_capacity
+ union toggle_ref_u *_toggleref_arr;
+ size_t _toggleref_array_size;
+ size_t _toggleref_array_capacity;
+# endif
+# endif
+# ifdef TRACE_BUF
+# define GC_trace_buf_ptr GC_arrays._trace_buf_ptr
+ int _trace_buf_ptr;
+# endif
+# ifdef ENABLE_DISCLAIM
+# define GC_finalized_kind GC_arrays._finalized_kind
+ int _finalized_kind;
+# endif
+# define n_root_sets GC_arrays._n_root_sets
+# define GC_excl_table_entries GC_arrays._excl_table_entries
+ int _n_root_sets; /* GC_static_roots[0..n_root_sets) contains the */
+ /* valid root sets. */
+ size_t _excl_table_entries; /* Number of entries in use. */
+# ifdef THREADS
+# define GC_roots_were_cleared GC_arrays._roots_were_cleared
+ GC_bool _roots_were_cleared;
+# endif
+# define GC_explicit_typing_initialized GC_arrays._explicit_typing_initialized
+# define GC_ed_size GC_arrays._ed_size
+# define GC_avail_descr GC_arrays._avail_descr
+# define GC_ext_descriptors GC_arrays._ext_descriptors
+# ifdef AO_HAVE_load_acquire
+ volatile AO_t _explicit_typing_initialized;
+# else
+ GC_bool _explicit_typing_initialized;
+# endif
+ size_t _ed_size; /* Current size of above arrays. */
+ size_t _avail_descr; /* Next available slot. */
+ typed_ext_descr_t *_ext_descriptors; /* Points to array of extended */
+ /* descriptors. */
+ GC_mark_proc _mark_procs[MAX_MARK_PROCS];
+ /* Table of user-defined mark procedures. There is */
+ /* a small number of these, which can be referenced */
+ /* by DS_PROC mark descriptors. See gc_mark.h. */
+ char _modws_valid_offsets[sizeof(word)];
+ /* GC_valid_offsets[i] ==> */
+ /* GC_modws_valid_offsets[i%sizeof(word)] */
+# if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+# define GC_root_index GC_arrays._root_index
+ struct roots * _root_index[RT_SIZE];
+# endif
+# if defined(SAVE_CALL_CHAIN) && !defined(DONT_SAVE_TO_LAST_STACK) \
+ && (!defined(REDIRECT_MALLOC) || !defined(GC_HAVE_BUILTIN_BACKTRACE))
+ struct callinfo _last_stack[NFRAMES];
+ /* Stack at last garbage collection. Useful for */
+ /* debugging mysterious object disappearances. In the */
+ /* multi-threaded case, we currently only save the */
+ /* calling stack. Not supported in case of malloc */
+ /* redirection because backtrace() may call malloc(). */
+# define SAVE_CALLERS_TO_LAST_STACK() GC_save_callers(GC_arrays._last_stack)
+# else
+# define SAVE_CALLERS_TO_LAST_STACK() (void)0
+# endif
+# ifndef SEPARATE_GLOBALS
+# define GC_objfreelist GC_arrays._objfreelist
+ void *_objfreelist[MAXOBJGRANULES+1];
+ /* free list for objects */
+# define GC_aobjfreelist GC_arrays._aobjfreelist
+ void *_aobjfreelist[MAXOBJGRANULES+1];
+ /* free list for atomic objects */
+# endif
+ void *_uobjfreelist[MAXOBJGRANULES+1];
+ /* Uncollectible but traced objects. */
+ /* Objects on this and _auobjfreelist */
+ /* are always marked, except during */
+ /* garbage collections. */
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+# define GC_auobjfreelist GC_arrays._auobjfreelist
+ void *_auobjfreelist[MAXOBJGRANULES+1];
+ /* Atomic uncollectible but traced objects. */
+# endif
+ size_t _size_map[MAXOBJBYTES+1];
+ /* Number of granules to allocate when asked for a certain */
+ /* number of bytes. Should be accessed with the allocation */
+ /* lock held. */
+# ifdef MARK_BIT_PER_GRANULE
+# define GC_obj_map GC_arrays._obj_map
+ unsigned short * _obj_map[MAXOBJGRANULES + 1];
+ /* If not NULL, then a pointer to a map of valid */
+ /* object addresses. */
+ /* _obj_map[sz_in_granules][i] is */
+ /* i % sz_in_granules. */
+ /* This is now used purely to replace a */
+ /* division in the marker by a table lookup. */
+ /* _obj_map[0] is used for large objects and */
+ /* contains all nonzero entries. This gets us */
+ /* out of the marker fast path without an extra */
+ /* test. */
+# define MAP_LEN BYTES_TO_GRANULES(HBLKSIZE)
+# endif
+# define VALID_OFFSET_SZ HBLKSIZE
+ char _valid_offsets[VALID_OFFSET_SZ];
+ /* GC_valid_offsets[i] == TRUE ==> i */
+ /* is registered as a displacement. */
+# ifndef GC_DISABLE_INCREMENTAL
+# define GC_grungy_pages GC_arrays._grungy_pages
+ page_hash_table _grungy_pages; /* Pages that were dirty at last */
+ /* GC_read_dirty. */
+# define GC_dirty_pages GC_arrays._dirty_pages
+ volatile page_hash_table _dirty_pages;
+ /* Pages dirtied since last GC_read_dirty. */
+# endif
+# if (defined(CHECKSUMS) && (defined(GWW_VDB) || defined(SOFT_VDB))) \
+ || defined(PROC_VDB)
+# define GC_written_pages GC_arrays._written_pages
+ page_hash_table _written_pages; /* Pages ever dirtied */
+# endif
+# define GC_heap_sects GC_arrays._heap_sects
+ struct HeapSect *_heap_sects; /* Heap segments potentially */
+ /* client objects. */
+# if defined(USE_PROC_FOR_LIBRARIES)
+# define GC_our_memory GC_arrays._our_memory
+ struct HeapSect _our_memory[MAX_HEAP_SECTS];
+ /* All GET_MEM allocated */
+ /* memory. Includes block */
+ /* headers and the like. */
+# endif
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+# define GC_heap_bases GC_arrays._heap_bases
+ ptr_t _heap_bases[MAX_HEAP_SECTS];
+ /* Start address of memory regions obtained from kernel. */
+# endif
+# ifdef MSWINCE
+# define GC_heap_lengths GC_arrays._heap_lengths
+ word _heap_lengths[MAX_HEAP_SECTS];
+ /* Committed lengths of memory regions obtained from kernel. */
+# endif
+ struct roots _static_roots[MAX_ROOT_SETS];
+ struct exclusion _excl_table[MAX_EXCLUSIONS];
+ /* Block header index; see gc_headers.h */
+ bottom_index * _top_index[TOP_SZ];
+};
+
+GC_API_PRIV GC_FAR struct _GC_arrays GC_arrays;
+
+#define GC_all_nils GC_arrays._all_nils
+#define GC_atomic_in_use GC_arrays._atomic_in_use
+#define GC_bytes_allocd_before_gc GC_arrays._bytes_allocd_before_gc
+#define GC_bytes_dropped GC_arrays._bytes_dropped
+#define GC_bytes_finalized GC_arrays._bytes_finalized
+#define GC_bytes_freed GC_arrays._bytes_freed
+#define GC_composite_in_use GC_arrays._composite_in_use
+#define GC_excl_table GC_arrays._excl_table
+#define GC_finalizer_bytes_freed GC_arrays._finalizer_bytes_freed
+#define GC_heapsize GC_arrays._heapsize
+#define GC_large_allocd_bytes GC_arrays._large_allocd_bytes
+#define GC_large_free_bytes GC_arrays._large_free_bytes
+#define GC_last_heap_addr GC_arrays._last_heap_addr
+#define GC_mark_stack GC_arrays._mark_stack
+#define GC_mark_stack_limit GC_arrays._mark_stack_limit
+#define GC_mark_stack_top GC_arrays._mark_stack_top
+#define GC_mark_procs GC_arrays._mark_procs
+#define GC_max_large_allocd_bytes GC_arrays._max_large_allocd_bytes
+#define GC_modws_valid_offsets GC_arrays._modws_valid_offsets
+#define GC_requested_heapsize GC_arrays._requested_heapsize
+#define GC_all_bottom_indices GC_arrays._all_bottom_indices
+#define GC_all_bottom_indices_end GC_arrays._all_bottom_indices_end
+#define GC_scratch_free_ptr GC_arrays._scratch_free_ptr
+#define GC_hdr_free_list GC_arrays._hdr_free_list
+#define GC_scratch_end_ptr GC_arrays._scratch_end_ptr
+#define GC_size_map GC_arrays._size_map
+#define GC_static_roots GC_arrays._static_roots
+#define GC_top_index GC_arrays._top_index
+#define GC_uobjfreelist GC_arrays._uobjfreelist
+#define GC_valid_offsets GC_arrays._valid_offsets
+
+#define beginGC_arrays ((ptr_t)(&GC_arrays))
+#define endGC_arrays (((ptr_t)(&GC_arrays)) + (sizeof GC_arrays))
+#define USED_HEAP_SIZE (GC_heapsize - GC_large_free_bytes)
+
+/* Object kinds: */
+#ifndef MAXOBJKINDS
+# define MAXOBJKINDS 16
+#endif
+GC_EXTERN struct obj_kind {
+ void **ok_freelist; /* Array of free list headers for this kind of */
+ /* object. Point either to GC_arrays or to */
+ /* storage allocated with GC_scratch_alloc. */
+ struct hblk **ok_reclaim_list;
+ /* List headers for lists of blocks waiting to */
+ /* be swept. Indexed by object size in */
+ /* granules. */
+ word ok_descriptor; /* Descriptor template for objects in this */
+ /* block. */
+ GC_bool ok_relocate_descr;
+ /* Add object size in bytes to descriptor */
+ /* template to obtain descriptor. Otherwise */
+ /* template is used as is. */
+ GC_bool ok_init; /* Clear objects before putting them on the free list. */
+# ifdef ENABLE_DISCLAIM
+ GC_bool ok_mark_unconditionally;
+ /* Mark from all, including unmarked, objects */
+ /* in block. Used to protect objects reachable */
+ /* from reclaim notifiers. */
+ int (GC_CALLBACK *ok_disclaim_proc)(void * /*obj*/);
+ /* The disclaim procedure is called before obj */
+ /* is reclaimed, but must also tolerate being */
+ /* called with object from freelist. Non-zero */
+ /* exit prevents object from being reclaimed. */
+# define OK_DISCLAIM_INITZ /* comma */, FALSE, 0
+# else
+# define OK_DISCLAIM_INITZ /* empty */
+# endif /* !ENABLE_DISCLAIM */
+} GC_obj_kinds[MAXOBJKINDS];
+
+#define beginGC_obj_kinds ((ptr_t)(&GC_obj_kinds[0]))
+#define endGC_obj_kinds (beginGC_obj_kinds + sizeof(GC_obj_kinds))
+
+/* Variables that used to be in GC_arrays, but need to be accessed by */
+/* inline allocation code. If they were in GC_arrays, the inlined */
+/* allocation code would include GC_arrays offsets (as it did), which */
+/* introduce maintenance problems. */
+
+#ifdef SEPARATE_GLOBALS
+ extern word GC_bytes_allocd;
+ /* Number of bytes allocated during this collection cycle. */
+ extern ptr_t GC_objfreelist[MAXOBJGRANULES+1];
+ /* free list for NORMAL objects */
+# define beginGC_objfreelist ((ptr_t)(&GC_objfreelist[0]))
+# define endGC_objfreelist (beginGC_objfreelist + sizeof(GC_objfreelist))
+
+ extern ptr_t GC_aobjfreelist[MAXOBJGRANULES+1];
+ /* free list for atomic (PTRFREE) objects */
+# define beginGC_aobjfreelist ((ptr_t)(&GC_aobjfreelist[0]))
+# define endGC_aobjfreelist (beginGC_aobjfreelist + sizeof(GC_aobjfreelist))
+#endif /* SEPARATE_GLOBALS */
+
+/* Predefined kinds: */
+#define PTRFREE 0
+#define NORMAL 1
+#define UNCOLLECTABLE 2
+#ifdef GC_ATOMIC_UNCOLLECTABLE
+# define AUNCOLLECTABLE 3
+# define IS_UNCOLLECTABLE(k) (((k) & ~1) == UNCOLLECTABLE)
+# define GC_N_KINDS_INITIAL_VALUE 4
+#else
+# define IS_UNCOLLECTABLE(k) ((k) == UNCOLLECTABLE)
+# define GC_N_KINDS_INITIAL_VALUE 3
+#endif
+
+GC_EXTERN unsigned GC_n_kinds;
+
+GC_EXTERN size_t GC_page_size;
+
+/* Round up allocation size to a multiple of a page size. */
+/* GC_setpagesize() is assumed to be already invoked. */
+#define ROUNDUP_PAGESIZE(lb) /* lb should have no side-effect */ \
+ (SIZET_SAT_ADD(lb, GC_page_size - 1) & ~(GC_page_size - 1))
+
+/* Same as above but used to make GET_MEM() argument safe. */
+#ifdef MMAP_SUPPORTED
+# define ROUNDUP_PAGESIZE_IF_MMAP(lb) ROUNDUP_PAGESIZE(lb)
+#else
+# define ROUNDUP_PAGESIZE_IF_MMAP(lb) (lb)
+#endif
+
+#if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+ GC_EXTERN SYSTEM_INFO GC_sysinfo;
+ GC_INNER GC_bool GC_is_heap_base(void *p);
+#endif
+
+GC_EXTERN word GC_black_list_spacing;
+ /* Average number of bytes between blacklisted */
+ /* blocks. Approximate. */
+ /* Counts only blocks that are */
+ /* "stack-blacklisted", i.e. that are */
+ /* problematic in the interior of an object. */
+
+#ifdef GC_GCJ_SUPPORT
+ extern struct hblk * GC_hblkfreelist[];
+ extern word GC_free_bytes[]; /* Both remain visible to GNU GCJ. */
+#endif
+
+GC_EXTERN word GC_root_size; /* Total size of registered root sections. */
+
+GC_EXTERN GC_bool GC_debugging_started;
+ /* GC_debug_malloc has been called. */
+
+/* This is used by GC_do_blocking[_inner](). */
+struct blocking_data {
+ GC_fn_type fn;
+ void * client_data; /* and result */
+};
+
+/* This is used by GC_call_with_gc_active(), GC_push_all_stack_sections(). */
+struct GC_traced_stack_sect_s {
+ ptr_t saved_stack_ptr;
+# ifdef IA64
+ ptr_t saved_backing_store_ptr;
+ ptr_t backing_store_end;
+# endif
+ struct GC_traced_stack_sect_s *prev;
+};
+
+#ifdef THREADS
+ /* Process all "traced stack sections" - scan entire stack except for */
+ /* frames belonging to the user functions invoked by GC_do_blocking. */
+ GC_INNER void GC_push_all_stack_sections(ptr_t lo, ptr_t hi,
+ struct GC_traced_stack_sect_s *traced_stack_sect);
+ GC_EXTERN word GC_total_stacksize; /* updated on every push_all_stacks */
+# ifdef STACKPTR_CORRECTOR_AVAILABLE
+ GC_EXTERN GC_sp_corrector_proc GC_sp_corrector;
+# endif
+#else
+ GC_EXTERN ptr_t GC_blocked_sp;
+ GC_EXTERN struct GC_traced_stack_sect_s *GC_traced_stack_sect;
+ /* Points to the "frame" data held in stack by */
+ /* the innermost GC_call_with_gc_active(). */
+ /* NULL if no such "frame" active. */
+#endif /* !THREADS */
+
+#if defined(E2K) || defined(IA64)
+ /* Similar to GC_push_all_stack_sections() but for IA-64 registers store. */
+ GC_INNER void GC_push_all_register_sections(ptr_t bs_lo, ptr_t bs_hi,
+ int eager, struct GC_traced_stack_sect_s *traced_stack_sect);
+#endif
+
+/* Marks are in a reserved area in */
+/* each heap block. Each word has one mark bit associated */
+/* with it. Only those corresponding to the beginning of an */
+/* object are used. */
+
+/* Mark bit operations */
+
+/*
+ * Retrieve, set, clear the nth mark bit in a given heap block.
+ *
+ * (Recall that bit n corresponds to nth object or allocation granule
+ * relative to the beginning of the block, including unused words)
+ */
+
+#ifdef USE_MARK_BYTES
+# define mark_bit_from_hdr(hhdr,n) ((hhdr)->hb_marks[n])
+# define set_mark_bit_from_hdr(hhdr,n) ((hhdr)->hb_marks[n] = 1)
+# define clear_mark_bit_from_hdr(hhdr,n) ((hhdr)->hb_marks[n] = 0)
+#else
+/* Set mark bit correctly, even if mark bits may be concurrently */
+/* accessed. */
+# if defined(PARALLEL_MARK) || (defined(THREAD_SANITIZER) && defined(THREADS))
+ /* Workaround TSan false positive: there is no race between */
+ /* mark_bit_from_hdr and set_mark_bit_from_hdr when n is different */
+ /* (alternatively, USE_MARK_BYTES could be used). If TSan is off, */
+ /* AO_or() is used only if we set USE_MARK_BITS explicitly. */
+# define OR_WORD(addr, bits) AO_or((volatile AO_t *)(addr), (AO_t)(bits))
+# else
+# define OR_WORD(addr, bits) (void)(*(addr) |= (bits))
+# endif
+# define mark_bit_from_hdr(hhdr,n) \
+ (((hhdr)->hb_marks[divWORDSZ(n)] >> modWORDSZ(n)) & (word)1)
+# define set_mark_bit_from_hdr(hhdr,n) \
+ OR_WORD((hhdr)->hb_marks+divWORDSZ(n), (word)1 << modWORDSZ(n))
+# define clear_mark_bit_from_hdr(hhdr,n) \
+ ((hhdr)->hb_marks[divWORDSZ(n)] &= ~((word)1 << modWORDSZ(n)))
+#endif /* !USE_MARK_BYTES */
+
+#ifdef MARK_BIT_PER_OBJ
+# define MARK_BIT_NO(offset, sz) (((word)(offset))/(sz))
+ /* Get the mark bit index corresponding to the given byte */
+ /* offset and size (in bytes). */
+# define MARK_BIT_OFFSET(sz) 1
+ /* Spacing between useful mark bits. */
+# define IF_PER_OBJ(x) x
+# define FINAL_MARK_BIT(sz) ((sz) > MAXOBJBYTES? 1 : HBLK_OBJS(sz))
+ /* Position of final, always set, mark bit. */
+#else /* MARK_BIT_PER_GRANULE */
+# define MARK_BIT_NO(offset, sz) BYTES_TO_GRANULES((word)(offset))
+# define MARK_BIT_OFFSET(sz) BYTES_TO_GRANULES(sz)
+# define IF_PER_OBJ(x)
+# define FINAL_MARK_BIT(sz) \
+ ((sz) > MAXOBJBYTES ? MARK_BITS_PER_HBLK \
+ : BYTES_TO_GRANULES((sz) * HBLK_OBJS(sz)))
+#endif
+
+/* Important internal collector routines */
+
+GC_INNER ptr_t GC_approx_sp(void);
+
+GC_INNER GC_bool GC_should_collect(void);
+
+void GC_apply_to_all_blocks(void (*fn)(struct hblk *h, word client_data),
+ word client_data);
+ /* Invoke fn(hbp, client_data) for each */
+ /* allocated heap block. */
+GC_INNER struct hblk * GC_next_block(struct hblk *h, GC_bool allow_free);
+ /* Get the next block whose address is at least */
+ /* h. Returned block is managed by GC. The */
+ /* block must be in use unless allow_free is */
+ /* true. Return 0 if there is no such block. */
+GC_INNER struct hblk * GC_prev_block(struct hblk * h);
+ /* Get the last (highest address) block whose */
+ /* address is at most h. Returned block is */
+ /* managed by GC, but may or may not be in use. */
+ /* Return 0 if there is no such block. */
+GC_INNER void GC_mark_init(void);
+GC_INNER void GC_clear_marks(void);
+ /* Clear mark bits for all heap objects. */
+GC_INNER void GC_invalidate_mark_state(void);
+ /* Tell the marker that marked */
+ /* objects may point to unmarked */
+ /* ones, and roots may point to */
+ /* unmarked objects. Reset mark stack. */
+GC_INNER GC_bool GC_mark_some(ptr_t cold_gc_frame);
+ /* Perform about one page of marking */
+ /* work of whatever kind is needed. Returns */
+ /* quickly if no collection is in progress. */
+ /* Return TRUE if mark phase is finished. */
+GC_INNER void GC_initiate_gc(void);
+ /* Initiate collection. */
+ /* If the mark state is invalid, this */
+ /* becomes full collection. Otherwise */
+ /* it's partial. */
+
+GC_INNER GC_bool GC_collection_in_progress(void);
+ /* Collection is in progress, or was abandoned. */
+
+/* Push contents of the symbol residing in the static roots area */
+/* excluded from scanning by the the collector for a reason. */
+/* Note: it should be used only for symbols of relatively small size */
+/* (one or several words). */
+#define GC_PUSH_ALL_SYM(sym) GC_push_all_eager(&(sym), &(sym) + 1)
+
+GC_INNER void GC_push_all_stack(ptr_t b, ptr_t t);
+ /* As GC_push_all but consider */
+ /* interior pointers as valid. */
+
+#ifdef NO_VDB_FOR_STATIC_ROOTS
+# define GC_push_conditional_static(b, t, all) \
+ ((void)(all), GC_push_all(b, t))
+#else
+ /* Same as GC_push_conditional (does either of GC_push_all or */
+ /* GC_push_selected depending on the third argument) but the caller */
+ /* guarantees the region belongs to the registered static roots. */
+ GC_INNER void GC_push_conditional_static(void *b, void *t, GC_bool all);
+#endif
+
+#if defined(WRAP_MARK_SOME) && defined(PARALLEL_MARK)
+ /* GC_mark_local does not handle memory protection faults yet. So, */
+ /* the static data regions are scanned immediately by GC_push_roots. */
+ GC_INNER void GC_push_conditional_eager(void *bottom, void *top,
+ GC_bool all);
+#endif
+
+ /* In the threads case, we push part of the current thread stack */
+ /* with GC_push_all_eager when we push the registers. This gets the */
+ /* callee-save registers that may disappear. The remainder of the */
+ /* stacks are scheduled for scanning in *GC_push_other_roots, which */
+ /* is thread-package-specific. */
+
+GC_INNER void GC_push_roots(GC_bool all, ptr_t cold_gc_frame);
+ /* Push all or dirty roots. */
+
+GC_API_PRIV GC_push_other_roots_proc GC_push_other_roots;
+ /* Push system or application specific roots */
+ /* onto the mark stack. In some environments */
+ /* (e.g. threads environments) this is */
+ /* predefined to be non-zero. A client */
+ /* supplied replacement should also call the */
+ /* original function. Remains externally */
+ /* visible as used by some well-known 3rd-party */
+ /* software (e.g., ECL) currently. */
+
+#ifdef THREADS
+ void GC_push_thread_structures(void);
+#endif
+GC_EXTERN void (*GC_push_typed_structures)(void);
+ /* A pointer such that we can avoid linking in */
+ /* the typed allocation support if unused. */
+
+GC_INNER void GC_with_callee_saves_pushed(void (*fn)(ptr_t, void *),
+ volatile ptr_t arg);
+
+#if defined(E2K) || defined(IA64) || defined(SPARC)
+ /* Cause all stacked registers to be saved in memory. Return a */
+ /* pointer to the top of the corresponding memory stack. */
+ ptr_t GC_save_regs_in_stack(void);
+#endif
+
+#ifdef E2K
+ /* Copy the full procedure stack to the provided buffer (with the */
+ /* given capacity). Returns either the required buffer size if it */
+ /* is bigger than capacity, otherwise the amount of copied bytes. */
+ /* May be called from a signal handler. */
+ GC_INNER size_t GC_get_procedure_stack(ptr_t, size_t);
+
+# if defined(CPPCHECK)
+# define PS_ALLOCA_BUF(sz) NULL
+# define ALLOCA_SAFE_LIMIT 0
+# else
+# define PS_ALLOCA_BUF(sz) alloca(sz) /* cannot return NULL */
+# ifndef ALLOCA_SAFE_LIMIT
+# define ALLOCA_SAFE_LIMIT (HBLKSIZE*256)
+# endif
+# endif /* !CPPCHECK */
+
+ /* Copy procedure (register) stack to a stack-allocated or */
+ /* memory-mapped buffer. Usable from a signal handler. */
+ /* FREE_PROCEDURE_STACK_LOCAL() must be called with the same */
+ /* *pbuf and *psz values before the caller function returns */
+ /* (thus, the buffer is valid only within the function). */
+# define GET_PROCEDURE_STACK_LOCAL(pbuf, psz) \
+ do { \
+ size_t capacity = 0; \
+ GC_ASSERT(GC_page_size != 0); \
+ for (*(pbuf) = NULL; ; capacity = *(psz)) { \
+ *(psz) = GC_get_procedure_stack(*(pbuf), capacity); \
+ if (*(psz) <= capacity) break; \
+ if (*(psz) > ALLOCA_SAFE_LIMIT \
+ || EXPECT(capacity != 0, FALSE)) { \
+ /* Deallocate old buffer if any. */ \
+ if (EXPECT(capacity > ALLOCA_SAFE_LIMIT, FALSE)) \
+ GC_unmap_procedure_stack_buf(*(pbuf),capacity); \
+ *(psz) = ROUNDUP_PAGESIZE(*(psz)); \
+ *(pbuf) = GC_mmap_procedure_stack_buf(*(psz)); \
+ } else { \
+ /* Allocate buffer on the stack if not large. */ \
+ *(pbuf) = PS_ALLOCA_BUF(*(psz)); \
+ } \
+ } \
+ if (capacity > ALLOCA_SAFE_LIMIT \
+ && EXPECT(((capacity - *(psz)) \
+ & ~(GC_page_size-1)) != 0, FALSE)) { \
+ /* Ensure sz value passed to munmap() later */ \
+ /* matches that passed to mmap() above. */ \
+ *(psz) = capacity - (GC_page_size - 1); \
+ } \
+ } while (0)
+
+ /* Indicate that the buffer with copied procedure stack is not needed. */
+# define FREE_PROCEDURE_STACK_LOCAL(buf, sz) \
+ (void)((sz) > ALLOCA_SAFE_LIMIT \
+ ? (GC_unmap_procedure_stack_buf(buf, sz), 0) : 0)
+
+ GC_INNER ptr_t GC_mmap_procedure_stack_buf(size_t);
+ GC_INNER void GC_unmap_procedure_stack_buf(ptr_t, size_t);
+
+# ifdef THREADS
+ /* Allocate a buffer in the GC heap (as an atomic object) and copy */
+ /* procedure stack there. Assumes the GC allocation lock is held. */
+ /* May trigger a collection (thus, cannot be used in GC_push_roots */
+ /* or in a signal handler). The buffer should be freed with */
+ /* GC_INTERNAL_FREE later when not needed (or, alternatively, it */
+ /* could be just garbage-collected). */
+ /* Similar to GET_PROCEDURE_STACK_LOCAL in other aspects. */
+ GC_INNER size_t GC_alloc_and_get_procedure_stack(ptr_t *pbuf);
+# endif
+
+ /* Load value and get tag of the target memory. */
+# if defined(__ptr64__)
+# define LOAD_TAGGED_VALUE(v, tag, p) \
+ do { \
+ word val; \
+ __asm__ __volatile__ ( \
+ "ldd, sm %[adr], 0x0, %[val]\n\t" \
+ "gettagd %[val], %[tag]\n" \
+ : [val] "=r" (val), \
+ [tag] "=r" (tag) \
+ : [adr] "r" (p)); \
+ v = val; \
+ } while (0)
+# elif !defined(CPPCHECK)
+# error Unsupported -march for e2k target
+# endif
+
+# define LOAD_WORD_OR_CONTINUE(v, p) \
+ { \
+ int tag LOCAL_VAR_INIT_OK; \
+ LOAD_TAGGED_VALUE(v, tag, p); \
+ if (tag != 0) continue; \
+ }
+#else
+# define LOAD_WORD_OR_CONTINUE(v, p) (void)(v = *(word *)(p))
+#endif /* !E2K */
+
+#if defined(AMIGA) || defined(MACOS) || defined(GC_DARWIN_THREADS)
+ void GC_push_one(word p);
+ /* If p points to an object, mark it */
+ /* and push contents on the mark stack */
+ /* Pointer recognition test always */
+ /* accepts interior pointers, i.e. this */
+ /* is appropriate for pointers found on */
+ /* stack. */
+#endif
+
+#ifdef GC_WIN32_THREADS
+ /* Same as GC_push_one but for a sequence of registers. */
+ GC_INNER void GC_push_many_regs(const word *regs, unsigned count);
+#endif
+
+#if defined(PRINT_BLACK_LIST) || defined(KEEP_BACK_PTRS)
+ GC_INNER void GC_mark_and_push_stack(ptr_t p, ptr_t source);
+ /* Ditto, omits plausibility test */
+#else
+ GC_INNER void GC_mark_and_push_stack(ptr_t p);
+#endif
+
+GC_INNER void GC_clear_hdr_marks(hdr * hhdr);
+ /* Clear the mark bits in a header */
+GC_INNER void GC_set_hdr_marks(hdr * hhdr);
+ /* Set the mark bits in a header */
+GC_INNER void GC_set_fl_marks(ptr_t p);
+ /* Set all mark bits associated with */
+ /* a free list. */
+#if defined(GC_ASSERTIONS) && defined(THREAD_LOCAL_ALLOC)
+ void GC_check_fl_marks(void **);
+ /* Check that all mark bits */
+ /* associated with a free list are */
+ /* set. Abort if not. */
+#endif
+void GC_add_roots_inner(ptr_t b, ptr_t e, GC_bool tmp);
+#ifdef USE_PROC_FOR_LIBRARIES
+ GC_INNER void GC_remove_roots_subregion(ptr_t b, ptr_t e);
+#endif
+GC_INNER void GC_exclude_static_roots_inner(void *start, void *finish);
+#if defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(MSWINCE) \
+ || defined(CYGWIN32) || defined(PCR)
+ GC_INNER void GC_register_dynamic_libraries(void);
+ /* Add dynamic library data sections to the root set. */
+#endif
+GC_INNER void GC_cond_register_dynamic_libraries(void);
+ /* Remove and reregister dynamic libraries if we're */
+ /* configured to do that at each GC. */
+
+/* Machine dependent startup routines */
+ptr_t GC_get_main_stack_base(void); /* Cold end of stack. */
+#ifdef IA64
+ GC_INNER ptr_t GC_get_register_stack_base(void);
+ /* Cold end of register stack. */
+#endif
+void GC_register_data_segments(void);
+
+#ifdef THREADS
+ GC_INNER void GC_thr_init(void);
+ GC_INNER void GC_init_parallel(void);
+# ifndef DONT_USE_ATEXIT
+ GC_INNER GC_bool GC_is_main_thread(void);
+# endif
+#else
+ GC_INNER GC_bool GC_is_static_root(void *p);
+ /* Is the address p in one of the registered static */
+ /* root sections? */
+# ifdef TRACE_BUF
+ void GC_add_trace_entry(char *kind, word arg1, word arg2);
+# endif
+#endif /* !THREADS */
+
+/* Black listing: */
+#ifdef PRINT_BLACK_LIST
+ GC_INNER void GC_add_to_black_list_normal(word p, ptr_t source);
+ /* Register bits as a possible future false */
+ /* reference from the heap or static data */
+# define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \
+ if (GC_all_interior_pointers) { \
+ GC_add_to_black_list_stack((word)(bits), (source)); \
+ } else \
+ GC_add_to_black_list_normal((word)(bits), (source))
+ GC_INNER void GC_add_to_black_list_stack(word p, ptr_t source);
+# define GC_ADD_TO_BLACK_LIST_STACK(bits, source) \
+ GC_add_to_black_list_stack((word)(bits), (source))
+#else
+ GC_INNER void GC_add_to_black_list_normal(word p);
+# define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \
+ if (GC_all_interior_pointers) { \
+ GC_add_to_black_list_stack((word)(bits)); \
+ } else \
+ GC_add_to_black_list_normal((word)(bits))
+ GC_INNER void GC_add_to_black_list_stack(word p);
+# define GC_ADD_TO_BLACK_LIST_STACK(bits, source) \
+ GC_add_to_black_list_stack((word)(bits))
+#endif /* PRINT_BLACK_LIST */
+
+struct hblk * GC_is_black_listed(struct hblk * h, word len);
+ /* If there are likely to be false references */
+ /* to a block starting at h of the indicated */
+ /* length, then return the next plausible */
+ /* starting location for h that might avoid */
+ /* these false references. Remains externally */
+ /* visible as used by GNU GCJ currently. */
+
+GC_INNER void GC_promote_black_lists(void);
+ /* Declare an end to a black listing phase. */
+GC_INNER void GC_unpromote_black_lists(void);
+ /* Approximately undo the effect of the above. */
+ /* This actually loses some information, but */
+ /* only in a reasonably safe way. */
+
+GC_INNER ptr_t GC_scratch_alloc(size_t bytes);
+ /* GC internal memory allocation for */
+ /* small objects. Deallocation is not */
+ /* possible. May return NULL. */
+
+#ifdef GWW_VDB
+ /* GC_scratch_recycle_no_gww() not used. */
+#else
+# define GC_scratch_recycle_no_gww GC_scratch_recycle_inner
+#endif
+GC_INNER void GC_scratch_recycle_inner(void *ptr, size_t bytes);
+ /* Reuse the memory region by the heap. */
+
+/* Heap block layout maps: */
+#ifdef MARK_BIT_PER_GRANULE
+ GC_INNER GC_bool GC_add_map_entry(size_t sz);
+ /* Add a heap block map for objects of */
+ /* size sz to obj_map. */
+ /* Return FALSE on failure. */
+#endif
+
+GC_INNER void GC_register_displacement_inner(size_t offset);
+ /* Version of GC_register_displacement */
+ /* that assumes lock is already held. */
+
+/* hblk allocation: */
+GC_INNER void GC_new_hblk(size_t size_in_granules, int kind);
+ /* Allocate a new heap block, and build */
+ /* a free list in it. */
+
+GC_INNER ptr_t GC_build_fl(struct hblk *h, size_t words, GC_bool clear,
+ ptr_t list);
+ /* Build a free list for objects of */
+ /* size sz in block h. Append list to */
+ /* end of the free lists. Possibly */
+ /* clear objects on the list. Normally */
+ /* called by GC_new_hblk, but also */
+ /* called explicitly without GC lock. */
+
+GC_INNER struct hblk * GC_allochblk(size_t size_in_bytes, int kind,
+ unsigned flags);
+ /* Allocate a heap block, inform */
+ /* the marker that block is valid */
+ /* for objects of indicated size. */
+
+GC_INNER ptr_t GC_alloc_large(size_t lb, int k, unsigned flags);
+ /* Allocate a large block of size lb bytes. */
+ /* The block is not cleared. flags argument */
+ /* should be 0 or IGNORE_OFF_PAGE. */
+ /* Calls GC_allochblk to do the actual */
+ /* allocation, but also triggers GC and/or */
+ /* heap expansion as appropriate. */
+ /* Does not update GC_bytes_allocd, but does */
+ /* other accounting. */
+
+GC_INNER void GC_freehblk(struct hblk * p);
+ /* Deallocate a heap block and mark it */
+ /* as invalid. */
+
+/* Miscellaneous GC routines. */
+GC_INNER GC_bool GC_expand_hp_inner(word n);
+GC_INNER void GC_start_reclaim(GC_bool abort_if_found);
+ /* Restore unmarked objects to free */
+ /* lists, or (if abort_if_found is */
+ /* TRUE) report them. */
+ /* Sweeping of small object pages is */
+ /* largely deferred. */
+GC_INNER void GC_continue_reclaim(word sz, int kind);
+ /* Sweep pages of the given size and */
+ /* kind, as long as possible, and */
+ /* as long as the corr. free list is */
+ /* empty. Sz is in granules. */
+
+GC_INNER GC_bool GC_reclaim_all(GC_stop_func stop_func, GC_bool ignore_old);
+ /* Reclaim all blocks. Abort (in a */
+ /* consistent state) if f returns TRUE. */
+GC_INNER ptr_t GC_reclaim_generic(struct hblk * hbp, hdr *hhdr, size_t sz,
+ GC_bool init, ptr_t list,
+ signed_word *count);
+ /* Rebuild free list in hbp with */
+ /* header hhdr, with objects of size sz */
+ /* bytes. Add list to the end of the */
+ /* free list. Add the number of */
+ /* reclaimed bytes to *count. */
+GC_INNER GC_bool GC_block_empty(hdr * hhdr);
+ /* Block completely unmarked? */
+GC_INNER int GC_CALLBACK GC_never_stop_func(void);
+ /* Always returns 0 (FALSE). */
+GC_INNER GC_bool GC_try_to_collect_inner(GC_stop_func f);
+
+ /* Collect; caller must have acquired */
+ /* lock. Collection is aborted if f */
+ /* returns TRUE. Returns TRUE if it */
+ /* completes successfully. */
+#define GC_gcollect_inner() \
+ (void)GC_try_to_collect_inner(GC_never_stop_func)
+
+#ifdef THREADS
+ GC_EXTERN GC_bool GC_in_thread_creation;
+ /* We may currently be in thread creation or destruction. */
+ /* Only set to TRUE while allocation lock is held. */
+ /* When set, it is OK to run GC from unknown thread. */
+#endif
+
+GC_EXTERN GC_bool GC_is_initialized; /* GC_init() has been run. */
+
+GC_INNER void GC_collect_a_little_inner(int n);
+ /* Do n units worth of garbage */
+ /* collection work, if appropriate. */
+ /* A unit is an amount appropriate for */
+ /* HBLKSIZE bytes of allocation. */
+
+GC_INNER void * GC_generic_malloc_inner(size_t lb, int k);
+ /* Allocate an object of the given */
+ /* kind but assuming lock already held. */
+#if defined(DBG_HDRS_ALL) || defined(GC_GCJ_SUPPORT) \
+ || !defined(GC_NO_FINALIZATION)
+ GC_INNER void * GC_generic_malloc_inner_ignore_off_page(size_t lb, int k);
+ /* Allocate an object, where the client */
+ /* guarantees that there will always be */
+ /* a pointer to the beginning (i.e. */
+ /* within the first hblk) of the object */
+ /* while it is live. */
+#endif
+
+GC_INNER GC_bool GC_collect_or_expand(word needed_blocks,
+ GC_bool ignore_off_page, GC_bool retry);
+
+GC_INNER ptr_t GC_allocobj(size_t sz, int kind);
+ /* Make the indicated */
+ /* free list nonempty, and return its */
+ /* head. Sz is in granules. */
+
+#ifdef GC_ADD_CALLER
+ /* GC_DBG_EXTRAS is used by GC debug API functions (unlike GC_EXTRAS */
+ /* used by GC debug API macros) thus GC_RETURN_ADDR_PARENT (pointing */
+ /* to client caller) should be used if possible. */
+# ifdef GC_HAVE_RETURN_ADDR_PARENT
+# define GC_DBG_EXTRAS GC_RETURN_ADDR_PARENT, NULL, 0
+# else
+# define GC_DBG_EXTRAS GC_RETURN_ADDR, NULL, 0
+# endif
+#else
+# define GC_DBG_EXTRAS "unknown", 0
+#endif
+
+#ifdef GC_COLLECT_AT_MALLOC
+ extern size_t GC_dbg_collect_at_malloc_min_lb;
+ /* variable visible outside for debugging */
+# define GC_DBG_COLLECT_AT_MALLOC(lb) \
+ (void)((lb) >= GC_dbg_collect_at_malloc_min_lb ? \
+ (GC_gcollect(), 0) : 0)
+#else
+# define GC_DBG_COLLECT_AT_MALLOC(lb) (void)0
+#endif /* !GC_COLLECT_AT_MALLOC */
+
+/* Allocation routines that bypass the thread local cache. */
+#if defined(THREAD_LOCAL_ALLOC) && defined(GC_GCJ_SUPPORT)
+ GC_INNER void * GC_core_gcj_malloc(size_t, void *);
+#endif
+
+GC_INNER void GC_init_headers(void);
+GC_INNER struct hblkhdr * GC_install_header(struct hblk *h);
+ /* Install a header for block h. */
+ /* Return 0 on failure, or the header */
+ /* otherwise. */
+GC_INNER GC_bool GC_install_counts(struct hblk * h, size_t sz);
+ /* Set up forwarding counts for block */
+ /* h of size sz. */
+ /* Return FALSE on failure. */
+GC_INNER void GC_remove_header(struct hblk * h);
+ /* Remove the header for block h. */
+GC_INNER void GC_remove_counts(struct hblk * h, size_t sz);
+ /* Remove forwarding counts for h. */
+GC_INNER hdr * GC_find_header(ptr_t h);
+
+#ifdef USE_PROC_FOR_LIBRARIES
+ GC_INNER void GC_add_to_our_memory(ptr_t p, size_t bytes);
+ /* Add a chunk to GC_our_memory. */
+#else
+# define GC_add_to_our_memory(p, bytes) \
+ (GC_our_mem_bytes += (bytes), (void)(p))
+#endif
+
+GC_INNER void GC_print_all_errors(void);
+ /* Print smashed and leaked objects, if any. */
+ /* Clear the lists of such objects. */
+
+GC_EXTERN void (*GC_check_heap)(void);
+ /* Check that all objects in the heap with */
+ /* debugging info are intact. */
+ /* Add any that are not to GC_smashed list. */
+GC_EXTERN void (*GC_print_all_smashed)(void);
+ /* Print GC_smashed if it's not empty. */
+ /* Clear GC_smashed list. */
+GC_EXTERN void (*GC_print_heap_obj)(ptr_t p);
+ /* If possible print (using GC_err_printf) */
+ /* a more detailed description (terminated with */
+ /* "\n") of the object referred to by p. */
+
+#if defined(LINUX) && defined(__ELF__) && !defined(SMALL_CONFIG)
+ void GC_print_address_map(void);
+ /* Print an address map of the process. */
+#endif
+
+#ifndef SHORT_DBG_HDRS
+ GC_EXTERN GC_bool GC_findleak_delay_free;
+ /* Do not immediately deallocate object on */
+ /* free() in the leak-finding mode, just mark */
+ /* it as freed (and deallocate it after GC). */
+ GC_INNER GC_bool GC_check_leaked(ptr_t base); /* from dbg_mlc.c */
+#endif
+
+#ifdef AO_HAVE_store
+ GC_EXTERN volatile AO_t GC_have_errors;
+# define GC_SET_HAVE_ERRORS() AO_store(&GC_have_errors, (AO_t)TRUE)
+# define get_have_errors() ((GC_bool)AO_load(&GC_have_errors))
+ /* The barriers are not needed. */
+#else
+ GC_EXTERN GC_bool GC_have_errors;
+# define GC_SET_HAVE_ERRORS() (void)(GC_have_errors = TRUE)
+# define get_have_errors() GC_have_errors
+#endif /* We saw a smashed or leaked object. */
+ /* Call error printing routine */
+ /* occasionally. It is OK to read it */
+ /* without acquiring the lock. */
+ /* If set to true, it is never cleared. */
+
+#define VERBOSE 2
+#if !defined(NO_CLOCK) || !defined(SMALL_CONFIG)
+ /* GC_print_stats should be visible to extra/MacOS.c. */
+ extern int GC_print_stats; /* Nonzero generates basic GC log. */
+ /* VERBOSE generates add'l messages. */
+#else /* SMALL_CONFIG */
+# define GC_print_stats 0
+ /* Will this remove the message character strings from the executable? */
+ /* With a particular level of optimizations, it should... */
+#endif
+
+#ifdef KEEP_BACK_PTRS
+ GC_EXTERN long GC_backtraces;
+#endif
+
+/* A trivial (linear congruential) pseudo-random numbers generator, */
+/* safe for the concurrent usage. */
+#define GC_RAND_MAX ((int)(~0U >> 1))
+#if defined(AO_HAVE_store) && defined(THREAD_SANITIZER)
+# define GC_RAND_STATE_T volatile AO_t
+# define GC_RAND_NEXT(pseed) GC_rand_next(pseed)
+ GC_INLINE int GC_rand_next(GC_RAND_STATE_T *pseed)
+ {
+ AO_t next = (AO_t)((AO_load(pseed) * 1103515245U + 12345)
+ & (unsigned)GC_RAND_MAX);
+ AO_store(pseed, next);
+ return (int)next;
+ }
+#else
+# define GC_RAND_STATE_T unsigned
+# define GC_RAND_NEXT(pseed) /* overflow and race are OK */ \
+ (int)(*(pseed) = (*(pseed) * 1103515245U + 12345) \
+ & (unsigned)GC_RAND_MAX)
+#endif
+
+GC_EXTERN GC_bool GC_print_back_height;
+
+#ifdef MAKE_BACK_GRAPH
+ void GC_print_back_graph_stats(void);
+#endif
+
+#ifdef THREADS
+ GC_INNER void GC_free_inner(void * p);
+#endif
+
+/* Macros used for collector internal allocation. */
+/* These assume the collector lock is held. */
+#ifdef DBG_HDRS_ALL
+ GC_INNER void * GC_debug_generic_malloc_inner(size_t lb, int k);
+ GC_INNER void * GC_debug_generic_malloc_inner_ignore_off_page(size_t lb,
+ int k);
+# define GC_INTERNAL_MALLOC GC_debug_generic_malloc_inner
+# define GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE \
+ GC_debug_generic_malloc_inner_ignore_off_page
+# ifdef THREADS
+ GC_INNER void GC_debug_free_inner(void * p);
+# define GC_INTERNAL_FREE GC_debug_free_inner
+# else
+# define GC_INTERNAL_FREE GC_debug_free
+# endif
+#else
+# define GC_INTERNAL_MALLOC GC_generic_malloc_inner
+# define GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE \
+ GC_generic_malloc_inner_ignore_off_page
+# ifdef THREADS
+# define GC_INTERNAL_FREE GC_free_inner
+# else
+# define GC_INTERNAL_FREE GC_free
+# endif
+#endif /* !DBG_HDRS_ALL */
+
+#ifdef USE_MUNMAP
+ /* Memory unmapping: */
+ GC_INNER void GC_unmap_old(void);
+ GC_INNER void GC_merge_unmapped(void);
+ GC_INNER void GC_unmap(ptr_t start, size_t bytes);
+ GC_INNER void GC_remap(ptr_t start, size_t bytes);
+ GC_INNER void GC_unmap_gap(ptr_t start1, size_t bytes1, ptr_t start2,
+ size_t bytes2);
+
+# ifndef NOT_GCBUILD
+ /* Compute end address for an unmap operation on the indicated block. */
+ GC_INLINE ptr_t GC_unmap_end(ptr_t start, size_t bytes)
+ {
+ return (ptr_t)((word)(start + bytes) & ~(word)(GC_page_size-1));
+ }
+# endif
+#endif /* USE_MUNMAP */
+
+#ifdef CAN_HANDLE_FORK
+ GC_EXTERN int GC_handle_fork;
+ /* Fork-handling mode: */
+ /* 0 means no fork handling requested (but client could */
+ /* anyway call fork() provided it is surrounded with */
+ /* GC_atfork_prepare/parent/child calls); */
+ /* -1 means GC tries to use pthread_at_fork if it is */
+ /* available (if it succeeds then GC_handle_fork value */
+ /* is changed to 1), client should nonetheless surround */
+ /* fork() with GC_atfork_prepare/parent/child (for the */
+ /* case of pthread_at_fork failure or absence); */
+ /* 1 (or other values) means client fully relies on */
+ /* pthread_at_fork (so if it is missing or failed then */
+ /* abort occurs in GC_init), GC_atfork_prepare and the */
+ /* accompanying routines are no-op in such a case. */
+#endif
+
+#ifdef GC_DISABLE_INCREMENTAL
+# define GC_incremental FALSE
+# define GC_auto_incremental FALSE
+# define GC_manual_vdb FALSE
+# define GC_dirty(p) (void)(p)
+# define REACHABLE_AFTER_DIRTY(p) (void)(p)
+
+#else /* !GC_DISABLE_INCREMENTAL */
+ GC_EXTERN GC_bool GC_incremental;
+ /* Using incremental/generational collection. */
+ /* Assumes dirty bits are being maintained. */
+
+ /* Virtual dirty bit implementation: */
+ /* Each implementation exports the following: */
+ GC_INNER void GC_read_dirty(GC_bool output_unneeded);
+ /* Retrieve dirty bits. Set output_unneeded to */
+ /* indicate that reading of the retrieved dirty */
+ /* bits is not planned till the next retrieval. */
+ GC_INNER GC_bool GC_page_was_dirty(struct hblk *h);
+ /* Read retrieved dirty bits. */
+
+ GC_INNER void GC_remove_protection(struct hblk *h, word nblocks,
+ GC_bool pointerfree);
+ /* h is about to be written or allocated. Ensure that */
+ /* it is not write protected by the virtual dirty bit */
+ /* implementation. I.e., this is a call that: */
+ /* - hints that [h, h+nblocks) is about to be written; */
+ /* - guarantees that protection is removed; */
+ /* - may speed up some dirty bit implementations; */
+ /* - may be essential if we need to ensure that */
+ /* pointer-free system call buffers in the heap are */
+ /* not protected. */
+
+# if !defined(NO_VDB_FOR_STATIC_ROOTS) && !defined(PROC_VDB)
+ GC_INNER GC_bool GC_is_vdb_for_static_roots(void);
+ /* Is VDB working for static roots? */
+# endif
+
+# ifdef CAN_HANDLE_FORK
+# if defined(PROC_VDB) || defined(SOFT_VDB) \
+ || (defined(MPROTECT_VDB) && defined(GC_DARWIN_THREADS))
+ GC_INNER void GC_dirty_update_child(void);
+ /* Update pid-specific resources (like /proc file */
+ /* descriptors) needed by the dirty bits implementation */
+ /* after fork in the child process. */
+# else
+# define GC_dirty_update_child() (void)0
+# endif
+# endif /* CAN_HANDLE_FORK */
+
+# if defined(MPROTECT_VDB) && defined(DARWIN)
+ EXTERN_C_END
+# include <pthread.h>
+ EXTERN_C_BEGIN
+# ifdef THREADS
+ GC_INNER int GC_inner_pthread_create(pthread_t *t,
+ GC_PTHREAD_CREATE_CONST pthread_attr_t *a,
+ void *(*fn)(void *), void *arg);
+# else
+# define GC_inner_pthread_create pthread_create
+# endif
+# endif /* MPROTECT_VDB && DARWIN */
+
+ GC_INNER GC_bool GC_dirty_init(void);
+ /* Returns true if dirty bits are maintained (otherwise */
+ /* it is OK to be called again if the client invokes */
+ /* GC_enable_incremental once more). */
+
+ GC_EXTERN GC_bool GC_manual_vdb;
+ /* The incremental collection is in the manual VDB */
+ /* mode. Assumes GC_incremental is true. Should not */
+ /* be modified once GC_incremental is set to true. */
+
+# define GC_auto_incremental (GC_incremental && !GC_manual_vdb)
+
+ GC_INNER void GC_dirty_inner(const void *p); /* does not require locking */
+# define GC_dirty(p) (GC_manual_vdb ? GC_dirty_inner(p) : (void)0)
+# define REACHABLE_AFTER_DIRTY(p) GC_reachable_here(p)
+#endif /* !GC_DISABLE_INCREMENTAL */
+
+#if defined(COUNT_PROTECTED_REGIONS) && defined(MPROTECT_VDB)
+ /* Do actions on heap growth, if needed, to prevent hitting the */
+ /* kernel limit on the VM map regions. */
+ GC_INNER void GC_handle_protected_regions_limit(void);
+#else
+# define GC_handle_protected_regions_limit() (void)0
+#endif
+
+/* Same as GC_base but excepts and returns a pointer to const object. */
+#define GC_base_C(p) ((const void *)GC_base((/* no const */ void *)(p)))
+
+/* Debugging print routines: */
+void GC_print_block_list(void);
+void GC_print_hblkfreelist(void);
+void GC_print_heap_sects(void);
+void GC_print_static_roots(void);
+
+#ifdef KEEP_BACK_PTRS
+ GC_INNER void GC_store_back_pointer(ptr_t source, ptr_t dest);
+ GC_INNER void GC_marked_for_finalization(ptr_t dest);
+# define GC_STORE_BACK_PTR(source, dest) GC_store_back_pointer(source, dest)
+# define GC_MARKED_FOR_FINALIZATION(dest) GC_marked_for_finalization(dest)
+#else
+# define GC_STORE_BACK_PTR(source, dest) (void)(source)
+# define GC_MARKED_FOR_FINALIZATION(dest)
+#endif
+
+/* Make arguments appear live to compiler */
+void GC_noop6(word, word, word, word, word, word);
+
+GC_API void GC_CALL GC_noop1(word);
+
+#ifndef GC_ATTR_FORMAT_PRINTF
+# if GC_GNUC_PREREQ(3, 0)
+# define GC_ATTR_FORMAT_PRINTF(spec_argnum, first_checked) \
+ __attribute__((__format__(__printf__, spec_argnum, first_checked)))
+# else
+# define GC_ATTR_FORMAT_PRINTF(spec_argnum, first_checked)
+# endif
+#endif
+
+/* Logging and diagnostic output: */
+/* GC_printf is used typically on client explicit print requests. */
+/* For all GC_X_printf routines, it is recommended to put "\n" at */
+/* 'format' string end (for output atomicity). */
+GC_API_PRIV void GC_printf(const char * format, ...)
+ GC_ATTR_FORMAT_PRINTF(1, 2);
+ /* A version of printf that doesn't allocate, */
+ /* 1 KB total output length. */
+ /* (We use sprintf. Hopefully that doesn't */
+ /* allocate for long arguments.) */
+GC_API_PRIV void GC_err_printf(const char * format, ...)
+ GC_ATTR_FORMAT_PRINTF(1, 2);
+
+/* Basic logging routine. Typically, GC_log_printf is called directly */
+/* only inside various DEBUG_x blocks. */
+GC_API_PRIV void GC_log_printf(const char * format, ...)
+ GC_ATTR_FORMAT_PRINTF(1, 2);
+
+#ifndef GC_ANDROID_LOG
+# define GC_PRINT_STATS_FLAG (GC_print_stats != 0)
+# define GC_INFOLOG_PRINTF GC_COND_LOG_PRINTF
+ /* GC_verbose_log_printf is called only if GC_print_stats is VERBOSE. */
+# define GC_verbose_log_printf GC_log_printf
+#else
+ extern GC_bool GC_quiet;
+# define GC_PRINT_STATS_FLAG (!GC_quiet)
+ /* INFO/DBG loggers are enabled even if GC_print_stats is off. */
+# ifndef GC_INFOLOG_PRINTF
+# define GC_INFOLOG_PRINTF if (GC_quiet) {} else GC_info_log_printf
+# endif
+ GC_INNER void GC_info_log_printf(const char *format, ...)
+ GC_ATTR_FORMAT_PRINTF(1, 2);
+ GC_INNER void GC_verbose_log_printf(const char *format, ...)
+ GC_ATTR_FORMAT_PRINTF(1, 2);
+#endif /* GC_ANDROID_LOG */
+
+#if defined(SMALL_CONFIG) || defined(GC_ANDROID_LOG)
+# define GC_ERRINFO_PRINTF GC_INFOLOG_PRINTF
+#else
+# define GC_ERRINFO_PRINTF GC_log_printf
+#endif
+
+/* Convenient macros for GC_[verbose_]log_printf invocation. */
+#define GC_COND_LOG_PRINTF \
+ if (EXPECT(!GC_print_stats, TRUE)) {} else GC_log_printf
+#define GC_VERBOSE_LOG_PRINTF \
+ if (EXPECT(GC_print_stats != VERBOSE, TRUE)) {} else GC_verbose_log_printf
+#ifndef GC_DBGLOG_PRINTF
+# define GC_DBGLOG_PRINTF if (!GC_PRINT_STATS_FLAG) {} else GC_log_printf
+#endif
+
+void GC_err_puts(const char *s);
+ /* Write s to stderr, don't buffer, don't add */
+ /* newlines, don't ... */
+
+/* Handy macro for logging size values (of word type) in KiB (rounding */
+/* to nearest value). */
+#define TO_KiB_UL(v) ((unsigned long)(((v) + ((1 << 9) - 1)) >> 10))
+
+GC_EXTERN unsigned GC_fail_count;
+ /* How many consecutive GC/expansion failures? */
+ /* Reset by GC_allochblk(); defined in alloc.c. */
+
+GC_EXTERN long GC_large_alloc_warn_interval; /* defined in misc.c */
+
+GC_EXTERN signed_word GC_bytes_found;
+ /* Number of reclaimed bytes after garbage collection; */
+ /* protected by GC lock; defined in reclaim.c. */
+
+#ifndef GC_GET_HEAP_USAGE_NOT_NEEDED
+ GC_EXTERN word GC_reclaimed_bytes_before_gc;
+ /* Number of bytes reclaimed before this */
+ /* collection cycle; used for statistics only. */
+#endif
+
+#ifdef USE_MUNMAP
+ GC_EXTERN int GC_unmap_threshold; /* defined in allchblk.c */
+ GC_EXTERN GC_bool GC_force_unmap_on_gcollect; /* defined in misc.c */
+#endif
+
+#ifdef MSWIN32
+ GC_EXTERN GC_bool GC_no_win32_dlls; /* defined in os_dep.c */
+ GC_EXTERN GC_bool GC_wnt; /* Is Windows NT derivative; */
+ /* defined and set in os_dep.c. */
+#endif
+
+#ifdef THREADS
+# if (defined(MSWIN32) && !defined(CONSOLE_LOG)) || defined(MSWINCE)
+ GC_EXTERN CRITICAL_SECTION GC_write_cs; /* defined in misc.c */
+# ifdef GC_ASSERTIONS
+ GC_EXTERN GC_bool GC_write_disabled;
+ /* defined in win32_threads.c; */
+ /* protected by GC_write_cs. */
+
+# endif
+# endif /* MSWIN32 || MSWINCE */
+# if defined(GC_DISABLE_INCREMENTAL) || defined(HAVE_LOCKFREE_AO_OR)
+# define GC_acquire_dirty_lock() (void)0
+# define GC_release_dirty_lock() (void)0
+# else
+ /* Acquire the spin lock we use to update dirty bits. */
+ /* Threads should not get stopped holding it. But we may */
+ /* acquire and release it during GC_remove_protection call. */
+# define GC_acquire_dirty_lock() \
+ do { /* empty */ \
+ } while (AO_test_and_set_acquire(&GC_fault_handler_lock) == AO_TS_SET)
+# define GC_release_dirty_lock() AO_CLEAR(&GC_fault_handler_lock)
+ GC_EXTERN volatile AO_TS_t GC_fault_handler_lock;
+ /* defined in os_dep.c */
+# endif
+# ifdef MSWINCE
+ GC_EXTERN GC_bool GC_dont_query_stack_min;
+ /* Defined and set in os_dep.c. */
+# endif
+#elif defined(IA64)
+ GC_EXTERN ptr_t GC_save_regs_ret_val; /* defined in mach_dep.c. */
+ /* Previously set to backing store pointer. */
+#endif /* !THREADS */
+
+#ifdef THREAD_LOCAL_ALLOC
+ GC_EXTERN GC_bool GC_world_stopped; /* defined in alloc.c */
+ GC_INNER void GC_mark_thread_local_free_lists(void);
+#endif
+
+#if defined(GLIBC_2_19_TSX_BUG) && defined(PARALLEL_MARK)
+ /* Parse string like <major>[.<minor>[<tail>]] and return major value. */
+ GC_INNER int GC_parse_version(int *pminor, const char *pverstr);
+#endif
+
+#if defined(MPROTECT_VDB) && defined(GWW_VDB)
+ GC_INNER GC_bool GC_gww_dirty_init(void);
+ /* Returns TRUE if GetWriteWatch is available. */
+ /* May be called repeatedly. */
+#endif
+
+#if defined(CHECKSUMS) || defined(PROC_VDB)
+ GC_INNER GC_bool GC_page_was_ever_dirty(struct hblk * h);
+ /* Could the page contain valid heap pointers? */
+#endif
+
+#ifdef CHECKSUMS
+# ifdef MPROTECT_VDB
+ void GC_record_fault(struct hblk * h);
+# endif
+ void GC_check_dirty(void);
+#endif
+
+GC_INNER void GC_default_print_heap_obj_proc(ptr_t p);
+
+GC_INNER void GC_setpagesize(void);
+
+GC_INNER void GC_initialize_offsets(void); /* defined in obj_map.c */
+
+GC_INNER void GC_bl_init(void);
+GC_INNER void GC_bl_init_no_interiors(void); /* defined in blacklst.c */
+
+GC_INNER void GC_start_debugging_inner(void); /* defined in dbg_mlc.c. */
+ /* Should not be called if GC_debugging_started. */
+
+/* Store debugging info into p. Return displaced pointer. */
+/* Assumes we hold the allocation lock. */
+GC_INNER void *GC_store_debug_info_inner(void *p, word sz, const char *str,
+ int linenum);
+
+#if defined(REDIRECT_MALLOC) && !defined(REDIRECT_MALLOC_IN_HEADER) \
+ && defined(GC_LINUX_THREADS)
+ GC_INNER void GC_init_lib_bounds(void);
+#else
+# define GC_init_lib_bounds() (void)0
+#endif
+
+#ifdef REDIRECT_MALLOC
+# ifdef GC_LINUX_THREADS
+ GC_INNER GC_bool GC_text_mapping(char *nm, ptr_t *startp, ptr_t *endp);
+ /* from os_dep.c */
+# endif
+#elif defined(USE_WINALLOC)
+ GC_INNER void GC_add_current_malloc_heap(void);
+#endif /* !REDIRECT_MALLOC */
+
+#ifdef MAKE_BACK_GRAPH
+ GC_INNER void GC_build_back_graph(void);
+ GC_INNER void GC_traverse_back_graph(void);
+#endif
+
+#ifdef MSWIN32
+ GC_INNER void GC_init_win32(void);
+#endif
+
+#if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ GC_INNER void * GC_roots_present(ptr_t);
+ /* The type is a lie, since the real type doesn't make sense here, */
+ /* and we only test for NULL. */
+#endif
+
+#ifdef GC_WIN32_THREADS
+ GC_INNER void GC_get_next_stack(char *start, char * limit, char **lo,
+ char **hi);
+# if defined(MPROTECT_VDB) && !defined(CYGWIN32)
+ GC_INNER void GC_set_write_fault_handler(void);
+# endif
+# if defined(WRAP_MARK_SOME) && !defined(GC_PTHREADS)
+ GC_INNER GC_bool GC_started_thread_while_stopped(void);
+ /* Did we invalidate mark phase with an unexpected thread start? */
+# endif
+#endif /* GC_WIN32_THREADS */
+
+#ifdef THREADS
+# ifndef GC_NO_FINALIZATION
+ GC_INNER void GC_reset_finalizer_nested(void);
+ GC_INNER unsigned char *GC_check_finalizer_nested(void);
+# endif
+ GC_INNER void GC_do_blocking_inner(ptr_t data, void * context);
+ GC_INNER void GC_push_all_stacks(void);
+# ifdef USE_PROC_FOR_LIBRARIES
+ GC_INNER GC_bool GC_segment_is_thread_stack(ptr_t lo, ptr_t hi);
+# endif
+# if (defined(HAVE_PTHREAD_ATTR_GET_NP) || defined(HAVE_PTHREAD_GETATTR_NP)) \
+ && defined(IA64)
+ GC_INNER ptr_t GC_greatest_stack_base_below(ptr_t bound);
+# endif
+#endif /* THREADS */
+
+#ifdef DYNAMIC_LOADING
+ GC_INNER GC_bool GC_register_main_static_data(void);
+# ifdef DARWIN
+ GC_INNER void GC_init_dyld(void);
+# endif
+#endif /* DYNAMIC_LOADING */
+
+#ifdef SEARCH_FOR_DATA_START
+ GC_INNER void GC_init_linux_data_start(void);
+ void * GC_find_limit(void *, int);
+#endif
+
+#if defined(NETBSD) && defined(__ELF__)
+ GC_INNER void GC_init_netbsd_elf(void);
+ void * GC_find_limit(void *, int);
+#endif
+
+#if defined(UNIX_LIKE) && !defined(NO_DEBUGGING)
+ GC_INNER void GC_set_and_save_fault_handler(void (*handler)(int));
+#endif
+
+#ifdef NEED_PROC_MAPS
+# if defined(DYNAMIC_LOADING) && defined(USE_PROC_FOR_LIBRARIES)
+ GC_INNER const char *GC_parse_map_entry(const char *maps_ptr,
+ ptr_t *start, ptr_t *end,
+ const char **prot,
+ unsigned *maj_dev,
+ const char **mapping_name);
+# endif
+# if defined(IA64) || defined(INCLUDE_LINUX_THREAD_DESCR)
+ GC_INNER GC_bool GC_enclosing_mapping(ptr_t addr,
+ ptr_t *startp, ptr_t *endp);
+# endif
+ GC_INNER const char *GC_get_maps(void);
+#endif /* NEED_PROC_MAPS */
+
+#ifdef GC_ASSERTIONS
+# define GC_ASSERT(expr) \
+ do { \
+ if (!(expr)) { \
+ GC_err_printf("Assertion failure: %s:%d\n", \
+ __FILE__, __LINE__); \
+ ABORT("assertion failure"); \
+ } \
+ } while (0)
+ GC_INNER word GC_compute_large_free_bytes(void);
+ GC_INNER word GC_compute_root_size(void);
+#else
+# define GC_ASSERT(expr)
+#endif
+
+/* Check a compile time assertion at compile time. */
+#if _MSC_VER >= 1700
+# define GC_STATIC_ASSERT(expr) \
+ static_assert(expr, "static assertion failed: " #expr)
+#elif defined(static_assert) && __STDC_VERSION__ >= 201112L
+# define GC_STATIC_ASSERT(expr) static_assert(expr, #expr)
+#elif defined(mips) && !defined(__GNUC__)
+/* DOB: MIPSPro C gets an internal error taking the sizeof an array type.
+ This code works correctly (ugliness is to avoid "unused var" warnings) */
+# define GC_STATIC_ASSERT(expr) \
+ do { if (0) { char j[(expr)? 1 : -1]; j[0]='\0'; j[0]=j[0]; } } while(0)
+#else
+ /* The error message for failure is a bit baroque, but ... */
+# define GC_STATIC_ASSERT(expr) (void)sizeof(char[(expr)? 1 : -1])
+#endif
+
+/* Runtime check for an argument declared as non-null is actually not null. */
+#if GC_GNUC_PREREQ(4, 0)
+ /* Workaround tautological-pointer-compare Clang warning. */
+# define NONNULL_ARG_NOT_NULL(arg) (*(volatile void **)&(arg) != NULL)
+#else
+# define NONNULL_ARG_NOT_NULL(arg) (NULL != (arg))
+#endif
+
+#define COND_DUMP_CHECKS \
+ do { \
+ GC_ASSERT(GC_compute_large_free_bytes() == GC_large_free_bytes); \
+ GC_ASSERT(GC_compute_root_size() == GC_root_size); \
+ } while (0)
+
+#ifndef NO_DEBUGGING
+ GC_EXTERN GC_bool GC_dump_regularly;
+ /* Generate regular debugging dumps. */
+# define COND_DUMP if (EXPECT(GC_dump_regularly, FALSE)) { \
+ GC_dump_named(NULL); \
+ } else COND_DUMP_CHECKS
+#else
+# define COND_DUMP COND_DUMP_CHECKS
+#endif
+
+#if defined(PARALLEL_MARK)
+ /* We need additional synchronization facilities from the thread */
+ /* support. We believe these are less performance critical */
+ /* than the main garbage collector lock; standard pthreads-based */
+ /* implementations should be sufficient. */
+
+# define GC_markers_m1 GC_parallel
+ /* Number of mark threads we would like to have */
+ /* excluding the initiating thread. */
+
+ GC_EXTERN GC_bool GC_parallel_mark_disabled;
+ /* A flag to temporarily avoid parallel marking.*/
+
+ /* The mark lock and condition variable. If the GC lock is also */
+ /* acquired, the GC lock must be acquired first. The mark lock is */
+ /* used to both protect some variables used by the parallel */
+ /* marker, and to protect GC_fl_builder_count, below. */
+ /* GC_notify_all_marker() is called when */
+ /* the state of the parallel marker changes */
+ /* in some significant way (see gc_mark.h for details). The */
+ /* latter set of events includes incrementing GC_mark_no. */
+ /* GC_notify_all_builder() is called when GC_fl_builder_count */
+ /* reaches 0. */
+
+ GC_INNER void GC_wait_for_markers_init(void);
+ GC_INNER void GC_acquire_mark_lock(void);
+ GC_INNER void GC_release_mark_lock(void);
+ GC_INNER void GC_notify_all_builder(void);
+ GC_INNER void GC_wait_for_reclaim(void);
+
+ GC_EXTERN signed_word GC_fl_builder_count; /* Protected by mark lock. */
+
+ GC_INNER void GC_notify_all_marker(void);
+ GC_INNER void GC_wait_marker(void);
+ GC_EXTERN word GC_mark_no; /* Protected by mark lock. */
+
+ GC_INNER void GC_help_marker(word my_mark_no);
+ /* Try to help out parallel marker for mark cycle */
+ /* my_mark_no. Returns if the mark cycle finishes or */
+ /* was already done, or there was nothing to do for */
+ /* some other reason. */
+
+ GC_INNER void GC_start_mark_threads_inner(void);
+#endif /* PARALLEL_MARK */
+
+#if defined(GC_PTHREADS) && !defined(GC_WIN32_THREADS) && !defined(NACL) \
+ && !defined(GC_DARWIN_THREADS) && !defined(SIG_SUSPEND)
+ /* We define the thread suspension signal here, so that we can refer */
+ /* to it in the dirty bit implementation, if necessary. Ideally we */
+ /* would allocate a (real-time?) signal using the standard mechanism. */
+ /* unfortunately, there is no standard mechanism. (There is one */
+ /* in Linux glibc, but it's not exported.) Thus we continue to use */
+ /* the same hard-coded signals we've always used. */
+# ifdef THREAD_SANITIZER
+ /* Unfortunately, use of an asynchronous signal to suspend threads */
+ /* leads to the situation when the signal is not delivered (is */
+ /* stored to pending_signals in TSan runtime actually) while the */
+ /* destination thread is blocked in pthread_mutex_lock. Thus, we */
+ /* use some synchronous one instead (which is again unlikely to be */
+ /* used by clients directly). */
+# define SIG_SUSPEND SIGSYS
+# elif (defined(GC_LINUX_THREADS) || defined(GC_DGUX386_THREADS)) \
+ && !defined(GC_USESIGRT_SIGNALS)
+# if defined(SPARC) && !defined(SIGPWR)
+ /* Linux/SPARC doesn't properly define SIGPWR in <signal.h>. */
+ /* It is aliased to SIGLOST in asm/signal.h, though. */
+# define SIG_SUSPEND SIGLOST
+# else
+ /* Linuxthreads itself uses SIGUSR1 and SIGUSR2. */
+# define SIG_SUSPEND SIGPWR
+# endif
+# elif defined(GC_FREEBSD_THREADS) && defined(__GLIBC__) \
+ && !defined(GC_USESIGRT_SIGNALS)
+# define SIG_SUSPEND (32+6)
+# elif (defined(GC_FREEBSD_THREADS) || defined(HURD) || defined(RTEMS)) \
+ && !defined(GC_USESIGRT_SIGNALS)
+# define SIG_SUSPEND SIGUSR1
+ /* SIGTSTP and SIGCONT could be used alternatively on FreeBSD. */
+# elif defined(GC_OPENBSD_THREADS) && !defined(GC_USESIGRT_SIGNALS)
+# ifndef GC_OPENBSD_UTHREADS
+# define SIG_SUSPEND SIGXFSZ
+# endif
+# elif defined(_SIGRTMIN) && !defined(CPPCHECK)
+# define SIG_SUSPEND _SIGRTMIN + 6
+# else
+# define SIG_SUSPEND SIGRTMIN + 6
+# endif
+#endif /* GC_PTHREADS && !SIG_SUSPEND */
+
+#if defined(GC_PTHREADS) && !defined(GC_SEM_INIT_PSHARED)
+# define GC_SEM_INIT_PSHARED 0
+#endif
+
+/* Some macros for setjmp that works across signal handlers */
+/* were possible, and a couple of routines to facilitate */
+/* catching accesses to bad addresses when that's */
+/* possible/needed. */
+#if (defined(UNIX_LIKE) || (defined(NEED_FIND_LIMIT) && defined(CYGWIN32))) \
+ && !defined(GC_NO_SIGSETJMP)
+# if defined(SUNOS5SIGS) && !defined(FREEBSD) && !defined(LINUX)
+ EXTERN_C_END
+# include <sys/siginfo.h>
+ EXTERN_C_BEGIN
+# endif
+ /* Define SETJMP and friends to be the version that restores */
+ /* the signal mask. */
+# define SETJMP(env) sigsetjmp(env, 1)
+# define LONGJMP(env, val) siglongjmp(env, val)
+# define JMP_BUF sigjmp_buf
+#else
+# ifdef ECOS
+# define SETJMP(env) hal_setjmp(env)
+# else
+# define SETJMP(env) setjmp(env)
+# endif
+# define LONGJMP(env, val) longjmp(env, val)
+# define JMP_BUF jmp_buf
+#endif /* !UNIX_LIKE || GC_NO_SIGSETJMP */
+
+/* Do we need the GC_find_limit machinery to find the end of a */
+/* data segment. */
+#if defined(HEURISTIC2) || defined(SEARCH_FOR_DATA_START) \
+ || ((defined(SVR4) || defined(AIX) || defined(DGUX) \
+ || (defined(LINUX) && defined(SPARC))) && !defined(PCR))
+# define NEED_FIND_LIMIT
+#endif
+
+#if defined(DATASTART_USES_BSDGETDATASTART)
+ EXTERN_C_END
+# include <machine/trap.h>
+ EXTERN_C_BEGIN
+# if !defined(PCR)
+# define NEED_FIND_LIMIT
+# endif
+ GC_INNER ptr_t GC_FreeBSDGetDataStart(size_t, ptr_t);
+# define DATASTART_IS_FUNC
+#endif /* DATASTART_USES_BSDGETDATASTART */
+
+#if ((defined(NETBSD) && defined(__ELF__)) \
+ || (defined(OPENBSD) && !defined(GC_OPENBSD_UTHREADS))) \
+ && !defined(NEED_FIND_LIMIT)
+ /* Used by GC_init_netbsd_elf or GC_register_data_segments in os_dep.c. */
+# define NEED_FIND_LIMIT
+#endif
+
+#if defined(IA64) && !defined(NEED_FIND_LIMIT)
+# define NEED_FIND_LIMIT
+ /* May be needed for register backing store base. */
+#endif
+
+#if defined(NEED_FIND_LIMIT) \
+ || (defined(WRAP_MARK_SOME) && defined(__GNUC__)) \
+ || (defined(USE_PROC_FOR_LIBRARIES) && defined(THREADS))
+ GC_EXTERN JMP_BUF GC_jmp_buf;
+
+ /* Set up a handler for address faults which will longjmp to */
+ /* GC_jmp_buf. */
+ GC_INNER void GC_setup_temporary_fault_handler(void);
+
+ /* Undo the effect of GC_setup_temporary_fault_handler. */
+ GC_INNER void GC_reset_fault_handler(void);
+#endif /* NEED_FIND_LIMIT || USE_PROC_FOR_LIBRARIES */
+
+/* Some convenience macros for cancellation support. */
+#ifdef CANCEL_SAFE
+# if defined(GC_ASSERTIONS) \
+ && (defined(USE_COMPILER_TLS) \
+ || (defined(LINUX) && !defined(ARM32) && GC_GNUC_PREREQ(3, 3) \
+ || defined(HPUX) /* and probably others ... */))
+ extern __thread unsigned char GC_cancel_disable_count;
+# define NEED_CANCEL_DISABLE_COUNT
+# define INCR_CANCEL_DISABLE() ++GC_cancel_disable_count
+# define DECR_CANCEL_DISABLE() --GC_cancel_disable_count
+# define ASSERT_CANCEL_DISABLED() GC_ASSERT(GC_cancel_disable_count > 0)
+# else
+# define INCR_CANCEL_DISABLE()
+# define DECR_CANCEL_DISABLE()
+# define ASSERT_CANCEL_DISABLED() (void)0
+# endif /* !GC_ASSERTIONS */
+# define DISABLE_CANCEL(state) \
+ do { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state); \
+ INCR_CANCEL_DISABLE(); } while (0)
+# define RESTORE_CANCEL(state) \
+ do { ASSERT_CANCEL_DISABLED(); \
+ pthread_setcancelstate(state, NULL); \
+ DECR_CANCEL_DISABLE(); } while (0)
+#else
+# define DISABLE_CANCEL(state) (void)0
+# define RESTORE_CANCEL(state) (void)0
+# define ASSERT_CANCEL_DISABLED() (void)0
+#endif /* !CANCEL_SAFE */
+
+EXTERN_C_END
+
+#endif /* GC_PRIVATE_H */
diff --git a/graphics/asymptote/gc/include/private/gcconfig.h b/graphics/asymptote/gc/include/private/gcconfig.h
new file mode 100644
index 0000000000..c1cf80fb1f
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/gcconfig.h
@@ -0,0 +1,3422 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2000-2004 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2009-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * This header is private to the gc. It is almost always included from
+ * gc_priv.h. However it is possible to include it by itself if just the
+ * configuration macros are needed. In that
+ * case, a few declarations relying on types declared in gc_priv.h will be
+ * omitted.
+ */
+
+#ifndef GCCONFIG_H
+#define GCCONFIG_H
+
+#ifndef GC_H
+# ifdef HAVE_CONFIG_H
+# include "config.h"
+# endif
+# include "../gc.h"
+#endif
+
+#ifdef CPPCHECK
+# undef CLOCKS_PER_SEC
+# undef FIXUP_POINTER
+# undef POINTER_MASK
+# undef POINTER_SHIFT
+# undef REDIRECT_REALLOC
+# undef _MAX_PATH
+#endif
+
+#ifndef PTR_T_DEFINED
+ typedef char * ptr_t;
+# define PTR_T_DEFINED
+#endif
+
+#if !defined(sony_news)
+# include <stddef.h> /* For size_t, etc. */
+#endif
+
+/* Note: Only wrap our own declarations, and not the included headers. */
+/* In this case, wrap our entire file, but temporarily unwrap/rewrap */
+/* around #includes. Types and macros do not need such wrapping, only */
+/* the declared global data and functions. */
+#ifdef __cplusplus
+# define EXTERN_C_BEGIN extern "C" {
+# define EXTERN_C_END } /* extern "C" */
+#else
+# define EXTERN_C_BEGIN /* empty */
+# define EXTERN_C_END /* empty */
+#endif
+
+EXTERN_C_BEGIN
+
+/* Convenient internal macro to test version of Clang. */
+#if defined(__clang__) && defined(__clang_major__)
+# define GC_CLANG_PREREQ(major, minor) \
+ ((__clang_major__ << 16) + __clang_minor__ >= ((major) << 16) + (minor))
+# define GC_CLANG_PREREQ_FULL(major, minor, patchlevel) \
+ (GC_CLANG_PREREQ(major, (minor) + 1) \
+ || (__clang_major__ == (major) && __clang_minor__ == (minor) \
+ && __clang_patchlevel__ >= (patchlevel)))
+#else
+# define GC_CLANG_PREREQ(major, minor) 0 /* FALSE */
+# define GC_CLANG_PREREQ_FULL(major, minor, patchlevel) 0
+#endif
+
+#ifdef LINT2
+ /* A macro (based on a tricky expression) to prevent false warnings */
+ /* like "Array compared to 0", "Comparison of identical expressions", */
+ /* "Untrusted loop bound" output by some static code analysis tools. */
+ /* The argument should not be a literal value. The result is */
+ /* converted to word type. (Actually, GC_word is used instead of */
+ /* word type as the latter might be undefined at the place of use.) */
+# define COVERT_DATAFLOW(w) (~(GC_word)(w)^(~(GC_word)0))
+#else
+# define COVERT_DATAFLOW(w) ((GC_word)(w))
+#endif
+
+/* Machine dependent parameters. Some tuning parameters can be found */
+/* near the top of gc_priv.h. */
+
+/* Machine specific parts contributed by various people. See README file. */
+
+#if defined(__ANDROID__) && !defined(HOST_ANDROID)
+ /* __ANDROID__ macro is defined by Android NDK gcc. */
+# define HOST_ANDROID 1
+#endif
+
+#if defined(TIZEN) && !defined(HOST_TIZEN)
+# define HOST_TIZEN 1
+#endif
+
+#if defined(__SYMBIAN32__) && !defined(SYMBIAN)
+# define SYMBIAN
+# ifdef __WINS__
+# pragma data_seg(".data2")
+# endif
+#endif
+
+/* First a unified test for Linux: */
+# if (defined(linux) || defined(__linux__) || defined(HOST_ANDROID)) \
+ && !defined(LINUX) && !defined(__native_client__)
+# define LINUX
+# endif
+
+/* And one for NetBSD: */
+# if defined(__NetBSD__)
+# define NETBSD
+# endif
+
+/* And one for OpenBSD: */
+# if defined(__OpenBSD__)
+# define OPENBSD
+# endif
+
+/* And one for FreeBSD: */
+# if (defined(__FreeBSD__) || defined(__DragonFly__) \
+ || defined(__FreeBSD_kernel__)) && !defined(FREEBSD) \
+ && !defined(GC_NO_FREEBSD) /* Orbis compiler defines __FreeBSD__ */
+# define FREEBSD
+# endif
+
+/* And one for Darwin: */
+# if defined(macosx) || (defined(__APPLE__) && defined(__MACH__))
+# define DARWIN
+ EXTERN_C_END
+# include <TargetConditionals.h>
+ EXTERN_C_BEGIN
+# endif
+
+/* Determine the machine type: */
+# if defined(__native_client__)
+# define NACL
+# if !defined(__portable_native_client__) && !defined(__arm__)
+# define I386
+# define mach_type_known
+# else
+ /* Here we will rely upon arch-specific defines. */
+# endif
+# endif
+# if defined(__aarch64__)
+# define AARCH64
+# if !defined(LINUX) && !defined(DARWIN) && !defined(FREEBSD) \
+ && !defined(NETBSD) && !defined(NN_BUILD_TARGET_PLATFORM_NX) \
+ && !defined(OPENBSD) && !defined(_WIN32)
+# define NOSYS
+# define mach_type_known
+# endif
+# endif
+# if defined(__arm) || defined(__arm__) || defined(__thumb__)
+# define ARM32
+# if defined(NACL) || defined(SYMBIAN)
+# define mach_type_known
+# elif !defined(LINUX) && !defined(NETBSD) && !defined(FREEBSD) \
+ && !defined(OPENBSD) && !defined(DARWIN) && !defined(_WIN32) \
+ && !defined(__CEGCC__) && !defined(NN_PLATFORM_CTR) \
+ && !defined(GC_NO_NOSYS) && !defined(SN_TARGET_PSP2)
+# define NOSYS
+# define mach_type_known
+# endif
+# endif
+# if defined(sun) && defined(mc68000) && !defined(CPPCHECK)
+# error SUNOS4 no longer supported
+# endif
+# if defined(hp9000s300) && !defined(CPPCHECK)
+# error M68K based HP machines no longer supported
+# endif
+# if defined(OPENBSD) && defined(m68k)
+# define M68K
+# define mach_type_known
+# endif
+# if defined(OPENBSD) && defined(__sparc__)
+# define SPARC
+# define mach_type_known
+# endif
+# if defined(OPENBSD) && defined(__arm__)
+# define ARM32
+# define mach_type_known
+# endif
+# if defined(OPENBSD) && defined(__aarch64__)
+# define AARCH64
+# define mach_type_known
+# endif
+# if defined(OPENBSD) && defined(__sh__)
+# define SH
+# define mach_type_known
+# endif
+# if defined(NETBSD) && (defined(m68k) || defined(__m68k__))
+# define M68K
+# define mach_type_known
+# endif
+# if defined(NETBSD) && defined(__powerpc__)
+# define POWERPC
+# define mach_type_known
+# endif
+# if defined(NETBSD) && (defined(__arm32__) || defined(__arm__))
+# define ARM32
+# define mach_type_known
+# endif
+# if defined(NETBSD) && defined(__aarch64__)
+# define AARCH64
+# define mach_type_known
+# endif
+# if defined(NETBSD) && defined(__sh__)
+# define SH
+# define mach_type_known
+# endif
+# if defined(vax) || defined(__vax__)
+# define VAX
+# ifdef ultrix
+# define ULTRIX
+# else
+# define BSD
+# endif
+# define mach_type_known
+# endif
+# if defined(NETBSD) && defined(__vax__)
+# define VAX
+# define mach_type_known
+# endif
+# if (defined(mips) || defined(__mips) || defined(_mips)) && !defined(__TANDEM)
+# define MIPS
+# if defined(nec_ews) || defined(_nec_ews)
+# define EWS4800
+# endif
+# if !defined(LINUX) && !defined(EWS4800) && !defined(NETBSD) \
+ && !defined(OPENBSD) && !defined(FREEBSD) && !defined(_WIN32_WCE) \
+ && !defined(__CEGCC__) && !defined(__MINGW32CE__)
+# if defined(ultrix) || defined(__ultrix)
+# define ULTRIX
+# else
+# define IRIX5 /* or IRIX 6.X */
+# endif
+# endif /* !LINUX */
+# if defined(NETBSD) && defined(__MIPSEL__)
+# undef ULTRIX
+# endif
+# define mach_type_known
+# endif
+# if defined(__QNX__)
+# define I386
+# define mach_type_known
+# endif
+# if defined(__NIOS2__) || defined(__NIOS2) || defined(__nios2__)
+# define NIOS2 /* Altera NIOS2 */
+# define mach_type_known
+# endif
+# if defined(__or1k__)
+# define OR1K /* OpenRISC/or1k */
+# define mach_type_known
+# endif
+# if defined(DGUX) && (defined(i386) || defined(__i386__))
+# define I386
+# ifndef _USING_DGUX
+# define _USING_DGUX
+# endif
+# define mach_type_known
+# endif
+# if defined(sequent) && (defined(i386) || defined(__i386__))
+# define I386
+# define SEQUENT
+# define mach_type_known
+# endif
+# if (defined(sun) || defined(__sun)) && (defined(i386) || defined(__i386__))
+# define I386
+# define SOLARIS
+# define mach_type_known
+# endif
+# if (defined(sun) || defined(__sun)) && defined(__amd64)
+# define X86_64
+# define SOLARIS
+# define mach_type_known
+# endif
+# if (defined(__OS2__) || defined(__EMX__)) && defined(__32BIT__)
+# define I386
+# define OS2
+# define mach_type_known
+# endif
+# if defined(ibm032) && !defined(CPPCHECK)
+# error IBM PC/RT no longer supported
+# endif
+# if (defined(sun) || defined(__sun)) && (defined(sparc) || defined(__sparc))
+ /* Test for SunOS 5.x */
+ EXTERN_C_END
+# include <errno.h>
+ EXTERN_C_BEGIN
+# define SPARC
+# define SOLARIS
+# define mach_type_known
+# elif defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) \
+ && !defined(FREEBSD) && !defined(NETBSD) && !defined(OPENBSD)
+# define SPARC
+# define DRSNX
+# define mach_type_known
+# endif
+# if defined(_IBMR2)
+# define POWERPC
+# define AIX
+# define mach_type_known
+# endif
+# if defined(NETBSD) && defined(__sparc__)
+# define SPARC
+# define mach_type_known
+# endif
+# if defined(_M_XENIX) && defined(_M_SYSV) && defined(_M_I386)
+ /* The above test may need refinement */
+# define I386
+# if defined(_SCO_ELF)
+# define SCO_ELF
+# else
+# define SCO
+# endif
+# define mach_type_known
+# endif
+# if defined(_AUX_SOURCE) && !defined(CPPCHECK)
+# error A/UX no longer supported
+# endif
+# if defined(_PA_RISC1_0) || defined(_PA_RISC1_1) || defined(_PA_RISC2_0) \
+ || defined(hppa) || defined(__hppa__)
+# define HP_PA
+# if !defined(LINUX) && !defined(HPUX) && !defined(OPENBSD)
+# define HPUX
+# endif
+# define mach_type_known
+# endif
+# if defined(__ia64) && (defined(_HPUX_SOURCE) || defined(__HP_aCC))
+# define IA64
+# ifndef HPUX
+# define HPUX
+# endif
+# define mach_type_known
+# endif
+# if (defined(__BEOS__) || defined(__HAIKU__)) && defined(_X86_)
+# define I386
+# define HAIKU
+# define mach_type_known
+# endif
+# if defined(__HAIKU__) && (defined(__amd64__) || defined(__x86_64__))
+# define X86_64
+# define HAIKU
+# define mach_type_known
+# endif
+# if defined(OPENBSD) && defined(__amd64__)
+# define X86_64
+# define mach_type_known
+# endif
+# if defined(LINUX) && (defined(i386) || defined(__i386__))
+# define I386
+# define mach_type_known
+# endif
+# if defined(LINUX) && defined(__x86_64__)
+# define X86_64
+# define mach_type_known
+# endif
+# if defined(LINUX) && (defined(__ia64__) || defined(__ia64))
+# define IA64
+# define mach_type_known
+# endif
+# if defined(LINUX) && defined(__e2k__)
+# define E2K
+# define mach_type_known
+# endif
+# if defined(LINUX) && defined(__aarch64__)
+# define AARCH64
+# define mach_type_known
+# endif
+# if defined(LINUX) && (defined(__arm) || defined(__arm__))
+# define ARM32
+# define mach_type_known
+# endif
+# if defined(LINUX) && defined(__cris__)
+# ifndef CRIS
+# define CRIS
+# endif
+# define mach_type_known
+# endif
+# if defined(LINUX) && defined(__loongarch__)
+# define LOONGARCH
+# define mach_type_known
+# endif
+# if defined(LINUX) && (defined(powerpc) || defined(__powerpc__) \
+ || defined(powerpc64) || defined(__powerpc64__))
+# define POWERPC
+# define mach_type_known
+# endif
+# if defined(LINUX) && defined(__mc68000__)
+# define M68K
+# define mach_type_known
+# endif
+# if defined(LINUX) && (defined(sparc) || defined(__sparc__))
+# define SPARC
+# define mach_type_known
+# endif
+# if defined(LINUX) && defined(__sh__)
+# define SH
+# define mach_type_known
+# endif
+# if defined(LINUX) && defined(__avr32__)
+# define AVR32
+# define mach_type_known
+# endif
+# if defined(LINUX) && defined(__m32r__)
+# define M32R
+# define mach_type_known
+# endif
+# if defined(__alpha) || defined(__alpha__)
+# define ALPHA
+# if !defined(LINUX) && !defined(NETBSD) && !defined(OPENBSD) \
+ && !defined(FREEBSD)
+# define OSF1 /* a.k.a Digital Unix */
+# endif
+# define mach_type_known
+# endif
+# if defined(_AMIGA) && !defined(AMIGA)
+# define AMIGA
+# endif
+# ifdef AMIGA
+# define M68K
+# define mach_type_known
+# endif
+# if defined(THINK_C) \
+ || (defined(__MWERKS__) && !defined(__powerc) && !defined(SYMBIAN))
+# define M68K
+# define MACOS
+# define mach_type_known
+# endif
+# if defined(__MWERKS__) && defined(__powerc) && !defined(__MACH__) \
+ && !defined(SYMBIAN)
+# define POWERPC
+# define MACOS
+# define mach_type_known
+# endif
+# if defined(OPENBSD) && defined(__powerpc__)
+# define POWERPC
+# define mach_type_known
+# endif
+# if defined(DARWIN)
+# if defined(__ppc__) || defined(__ppc64__)
+# define POWERPC
+# define mach_type_known
+# elif defined(__x86_64__) || defined(__x86_64)
+# define X86_64
+# define mach_type_known
+# elif defined(__i386__)
+# define I386
+# define mach_type_known
+# elif defined(__arm__)
+# define ARM32
+# define mach_type_known
+# elif defined(__aarch64__)
+# define AARCH64
+# define mach_type_known
+# endif
+# endif
+# if defined(__rtems__) && (defined(i386) || defined(__i386__))
+# define I386
+# define RTEMS
+# define mach_type_known
+# endif
+# if defined(NeXT) && defined(mc68000)
+# define M68K
+# define NEXT
+# define mach_type_known
+# endif
+# if defined(NeXT) && (defined(i386) || defined(__i386__))
+# define I386
+# define NEXT
+# define mach_type_known
+# endif
+# if defined(OPENBSD) && (defined(i386) || defined(__i386__))
+# define I386
+# define mach_type_known
+# endif
+# if defined(NETBSD) && (defined(i386) || defined(__i386__))
+# define I386
+# define mach_type_known
+# endif
+# if defined(NETBSD) && defined(__x86_64__)
+# define X86_64
+# define mach_type_known
+# endif
+# if defined(FREEBSD) && (defined(i386) || defined(__i386__))
+# define I386
+# define mach_type_known
+# endif
+# if defined(FREEBSD) && (defined(__amd64__) || defined(__x86_64__))
+# define X86_64
+# define mach_type_known
+# endif
+# if defined(FREEBSD) && defined(__sparc__)
+# define SPARC
+# define mach_type_known
+# endif
+# if defined(FREEBSD) && (defined(powerpc) || defined(__powerpc__))
+# define POWERPC
+# define mach_type_known
+# endif
+# if defined(FREEBSD) && defined(__arm__)
+# define ARM32
+# define mach_type_known
+# endif
+# if defined(FREEBSD) && defined(__aarch64__)
+# define AARCH64
+# define mach_type_known
+# endif
+# if defined(FREEBSD) && (defined(mips) || defined(__mips) || defined(_mips))
+# define MIPS
+# define mach_type_known
+# endif
+# if defined(bsdi) && (defined(i386) || defined(__i386__))
+# define I386
+# define BSDI
+# define mach_type_known
+# endif
+# if !defined(mach_type_known) && defined(__386BSD__)
+# define I386
+# define THREE86BSD
+# define mach_type_known
+# endif
+# if defined(_CX_UX) && defined(_M88K)
+# define M88K
+# define CX_UX
+# define mach_type_known
+# endif
+# if defined(DGUX) && defined(m88k)
+# define M88K
+ /* DGUX defined */
+# define mach_type_known
+# endif
+# if defined(_WIN32_WCE) || defined(__CEGCC__) || defined(__MINGW32CE__)
+ /* SH3, SH4, MIPS already defined for corresponding architectures */
+# if defined(SH3) || defined(SH4)
+# define SH
+# endif
+# if defined(x86) || defined(__i386__)
+# define I386
+# endif
+# if defined(_M_ARM) || defined(ARM) || defined(_ARM_)
+# define ARM32
+# endif
+# define MSWINCE
+# define mach_type_known
+# else
+# if ((defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300)) \
+ || (defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__) \
+ && !defined(__INTERIX) && !defined(SYMBIAN))
+# if defined(__LP64__) || defined(_M_X64)
+# define X86_64
+# elif defined(_M_ARM)
+# define ARM32
+# elif defined(_M_ARM64)
+# define AARCH64
+# else /* _M_IX86 */
+# define I386
+# endif
+# ifdef _XBOX_ONE
+# define MSWIN_XBOX1
+# else
+# ifndef MSWIN32
+# define MSWIN32 /* or Win64 */
+# endif
+# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
+# define MSWINRT_FLAVOR
+# endif
+# endif
+# define mach_type_known
+# endif
+# if defined(_MSC_VER) && defined(_M_IA64)
+# define IA64
+# define MSWIN32 /* Really Win64, but we do not treat 64-bit */
+ /* variants as a different platform. */
+# endif
+# endif
+# if defined(__DJGPP__)
+# define I386
+# ifndef DJGPP
+# define DJGPP /* MSDOS running the DJGPP port of GCC */
+# endif
+# define mach_type_known
+# endif
+# if defined(__CYGWIN32__) || defined(__CYGWIN__)
+# if defined(__LP64__)
+# define X86_64
+# else
+# define I386
+# endif
+# define CYGWIN32
+# define mach_type_known
+# endif
+# if defined(__INTERIX)
+# define I386
+# define INTERIX
+# define mach_type_known
+# endif
+# if defined(__MINGW32__) && !defined(mach_type_known)
+# define I386
+# define MSWIN32
+# define mach_type_known
+# endif
+# if defined(__BORLANDC__)
+# define I386
+# define MSWIN32
+# define mach_type_known
+# endif
+# if defined(_UTS) && !defined(mach_type_known)
+# define S370
+# define UTS4
+# define mach_type_known
+# endif
+# if defined(__pj__) && !defined(CPPCHECK)
+# error PicoJava no longer supported
+ /* The implementation had problems, and I haven't heard of users */
+ /* in ages. If you want it resurrected, let me know. */
+# endif
+# if defined(__embedded__) && defined(PPC)
+# define POWERPC
+# define NOSYS
+# define mach_type_known
+# endif
+
+# if defined(__WATCOMC__) && defined(__386__)
+# define I386
+# if !defined(OS2) && !defined(MSWIN32) && !defined(DOS4GW)
+# if defined(__OS2__)
+# define OS2
+# else
+# if defined(__WINDOWS_386__) || defined(__NT__)
+# define MSWIN32
+# else
+# define DOS4GW
+# endif
+# endif
+# endif
+# define mach_type_known
+# endif
+# if defined(__s390__) && defined(LINUX)
+# define S390
+# define mach_type_known
+# endif
+# if defined(__GNU__)
+# if defined(__i386__)
+/* The Debian Hurd running on generic PC */
+# define HURD
+# define I386
+# define mach_type_known
+# endif
+# endif
+# if defined(__x86_64__) && defined(__GNU__)
+# define HURD
+# define X86_64
+# define mach_type_known
+# endif
+# if defined(__TANDEM)
+ /* Nonstop S-series */
+ /* FIXME: Should recognize Integrity series? */
+# define MIPS
+# define NONSTOP
+# define mach_type_known
+# endif
+# if defined(__arc__) && defined(LINUX)
+# define ARC
+# define mach_type_known
+# endif
+# if defined(__hexagon__) && defined(LINUX)
+# define HEXAGON
+# define mach_type_known
+# endif
+# if defined(__tile__) && defined(LINUX)
+# ifdef __tilegx__
+# define TILEGX
+# else
+# define TILEPRO
+# endif
+# define mach_type_known
+# endif
+# if defined(__riscv) && (defined(FREEBSD) || defined(LINUX) \
+ || defined(NETBSD) || defined(OPENBSD))
+# define RISCV
+# define mach_type_known
+# endif
+
+# if defined(SN_TARGET_PSP2)
+# define mach_type_known
+# endif
+
+# if defined(NN_PLATFORM_CTR)
+# define mach_type_known
+# endif
+
+# if defined(NN_BUILD_TARGET_PLATFORM_NX)
+# define NINTENDO_SWITCH
+# define mach_type_known
+# endif
+
+# if defined(__EMSCRIPTEN__) || defined(EMSCRIPTEN)
+# ifndef EMSCRIPTEN
+# define EMSCRIPTEN
+# endif
+# define I386
+# define mach_type_known
+# endif
+
+/* Feel free to add more clauses here */
+
+/* Or manually define the machine type here. A machine type is */
+/* characterized by the architecture. Some */
+/* machine types are further subdivided by OS. */
+/* Macros such as LINUX, FREEBSD, etc. distinguish them. */
+/* SYSV on an M68K actually means A/UX. */
+/* The distinction in these cases is usually the stack starting address */
+# if !defined(mach_type_known) && !defined(CPPCHECK)
+# error The collector has not been ported to this machine/OS combination
+# endif
+ /* Mapping is: M68K ==> Motorola 680X0 */
+ /* (NEXT, and SYSV (A/UX), */
+ /* MACOS and AMIGA variants) */
+ /* I386 ==> Intel 386 */
+ /* (SEQUENT, OS2, SCO, LINUX, NETBSD, */
+ /* FREEBSD, THREE86BSD, MSWIN32, */
+ /* BSDI, SOLARIS, NEXT and others) */
+ /* NS32K ==> Encore Multimax */
+ /* MIPS ==> R2000 through R14K */
+ /* (many variants) */
+ /* VAX ==> DEC VAX */
+ /* (BSD, ULTRIX variants) */
+ /* HP_PA ==> HP9000/700 & /800 */
+ /* HP/UX, LINUX */
+ /* SPARC ==> SPARC v7/v8/v9 */
+ /* (SOLARIS, LINUX, DRSNX variants) */
+ /* ALPHA ==> DEC Alpha */
+ /* (OSF1 and LINUX variants) */
+ /* LOONGARCH ==> Loongson LoongArch */
+ /* (LINUX 32- and 64-bit variants) */
+ /* M88K ==> Motorola 88XX0 */
+ /* (CX_UX and DGUX) */
+ /* S370 ==> 370-like machine */
+ /* running Amdahl UTS4 */
+ /* S390 ==> 390-like machine */
+ /* running LINUX */
+ /* AARCH64 ==> ARM AArch64 */
+ /* (LP64 and ILP32 variants) */
+ /* E2K ==> Elbrus 2000 */
+ /* running LINUX */
+ /* ARM32 ==> Intel StrongARM */
+ /* (many variants) */
+ /* IA64 ==> Intel IPF */
+ /* (e.g. Itanium) */
+ /* (LINUX and HPUX) */
+ /* SH ==> Hitachi SuperH */
+ /* (LINUX & MSWINCE) */
+ /* X86_64 ==> AMD x86-64 */
+ /* POWERPC ==> IBM/Apple PowerPC */
+ /* (MACOS(<=9),DARWIN(incl.MACOSX),*/
+ /* LINUX, NETBSD, AIX, NOSYS */
+ /* variants) */
+ /* Handles 32 and 64-bit variants. */
+ /* ARC ==> Synopsys ARC */
+ /* AVR32 ==> Atmel RISC 32-bit */
+ /* CRIS ==> Axis Etrax */
+ /* M32R ==> Renesas M32R */
+ /* NIOS2 ==> Altera NIOS2 */
+ /* HEXAGON ==> Qualcomm Hexagon */
+ /* OR1K ==> OpenRISC/or1k */
+ /* RISCV ==> RISC-V 32/64-bit */
+ /* TILEPRO ==> Tilera TILEPro */
+ /* TILEGX ==> Tilera TILE-Gx */
+
+
+/*
+ * For each architecture and OS, the following need to be defined:
+ *
+ * CPP_WORDSZ is a simple integer constant representing the word size.
+ * in bits. We assume byte addressability, where a byte has 8 bits.
+ * We also assume CPP_WORDSZ is either 32 or 64.
+ * (We care about the length of pointers, not hardware
+ * bus widths. Thus a 64 bit processor with a C compiler that uses
+ * 32 bit pointers should use CPP_WORDSZ of 32, not 64. Default is 32.)
+ *
+ * MACH_TYPE is a string representation of the machine type.
+ * OS_TYPE is analogous for the OS.
+ *
+ * ALIGNMENT is the largest N, such that
+ * all pointer are guaranteed to be aligned on N byte boundaries.
+ * defining it to be 1 will always work, but perform poorly.
+ *
+ * DATASTART is the beginning of the data segment.
+ * On some platforms SEARCH_FOR_DATA_START is defined.
+ * The latter will cause GC_data_start to
+ * be set to an address determined by accessing data backwards from _end
+ * until an unmapped page is found. DATASTART will be defined to be
+ * GC_data_start.
+ * On UNIX-like systems, the collector will scan the area between DATASTART
+ * and DATAEND for root pointers.
+ *
+ * DATAEND, if not "end", where "end" is defined as "extern int end[]".
+ * RTH suggests gaining access to linker script synth'd values with
+ * this idiom instead of "&end", where "end" is defined as "extern int end".
+ * Otherwise, "GCC will assume these are in .sdata/.sbss" and it will, e.g.,
+ * cause failures on alpha*-*-* with -msmall-data or -fpic or mips-*-*
+ * without any special options.
+ *
+ * STACKBOTTOM is the cold end of the stack, which is usually the
+ * highest address in the stack.
+ * Under PCR or OS/2, we have other ways of finding thread stacks.
+ * For each machine, the following should:
+ * 1) define STACK_GROWS_UP if the stack grows toward higher addresses, and
+ * 2) define exactly one of
+ * STACKBOTTOM (should be defined to be an expression)
+ * LINUX_STACKBOTTOM
+ * HEURISTIC1
+ * HEURISTIC2
+ * If STACKBOTTOM is defined, then its value will be used directly (as the
+ * stack bottom). If LINUX_STACKBOTTOM is defined, then it will be determined
+ * with a method appropriate for most Linux systems. Currently we look
+ * first for __libc_stack_end (currently only if USE_LIBC_PRIVATES is
+ * defined), and if that fails read it from /proc. (If USE_LIBC_PRIVATES
+ * is not defined and NO_PROC_STAT is defined, we revert to HEURISTIC2.)
+ * If either of the last two macros are defined, then STACKBOTTOM is computed
+ * during collector startup using one of the following two heuristics:
+ * HEURISTIC1: Take an address inside GC_init's frame, and round it up to
+ * the next multiple of STACK_GRAN.
+ * HEURISTIC2: Take an address inside GC_init's frame, increment it repeatedly
+ * in small steps (decrement if STACK_GROWS_UP), and read the value
+ * at each location. Remember the value when the first
+ * Segmentation violation or Bus error is signaled. Round that
+ * to the nearest plausible page boundary, and use that instead
+ * of STACKBOTTOM.
+ *
+ * Gustavo Rodriguez-Rivera points out that on most (all?) Unix machines,
+ * the value of environ is a pointer that can serve as STACKBOTTOM.
+ * I expect that HEURISTIC2 can be replaced by this approach, which
+ * interferes far less with debugging. However it has the disadvantage
+ * that it's confused by a putenv call before the collector is initialized.
+ * This could be dealt with by intercepting putenv ...
+ *
+ * If no expression for STACKBOTTOM can be found, and neither of the above
+ * heuristics are usable, the collector can still be used with all of the above
+ * undefined, provided one of the following is done:
+ * 1) GC_mark_roots can be changed to somehow mark from the correct stack(s)
+ * without reference to STACKBOTTOM. This is appropriate for use in
+ * conjunction with thread packages, since there will be multiple stacks.
+ * (Allocating thread stacks in the heap, and treating them as ordinary
+ * heap data objects is also possible as a last resort. However, this is
+ * likely to introduce significant amounts of excess storage retention
+ * unless the dead parts of the thread stacks are periodically cleared.)
+ * 2) Client code may set GC_stackbottom before calling any GC_ routines.
+ * If the author of the client code controls the main program, this is
+ * easily accomplished by introducing a new main program, setting
+ * GC_stackbottom to the address of a local variable, and then calling
+ * the original main program. The new main program would read something
+ * like (provided real_main() is not inlined by the compiler):
+ *
+ * #include "gc.h"
+ *
+ * main(argc, argv, envp)
+ * int argc;
+ * char **argv, **envp;
+ * {
+ * volatile int dummy;
+ *
+ * GC_stackbottom = (ptr_t)(&dummy);
+ * return(real_main(argc, argv, envp));
+ * }
+ *
+ *
+ * Each architecture may also define the style of virtual dirty bit
+ * implementation to be used:
+ * GWW_VDB: Use Win32 GetWriteWatch primitive.
+ * MPROTECT_VDB: Write protect the heap and catch faults.
+ * PROC_VDB: Use the SVR4 /proc primitives to read dirty bits.
+ * SOFT_VDB: Use the Linux /proc primitives to track dirty bits.
+ *
+ * The first and second one may be combined, in which case a runtime
+ * selection will be made, based on GetWriteWatch availability.
+ *
+ * An architecture may define DYNAMIC_LOADING if dyn_load.c
+ * defined GC_register_dynamic_libraries() for the architecture.
+ *
+ * An architecture may define PREFETCH(x) to preload the cache with *x.
+ * This defaults to GCC built-in operation (or a no-op for other compilers).
+ *
+ * GC_PREFETCH_FOR_WRITE(x) is used if *x is about to be written.
+ *
+ * An architecture may also define CLEAR_DOUBLE(x) to be a fast way to
+ * clear the two words at GC_malloc-aligned address x. By default,
+ * word stores of 0 are used instead.
+ *
+ * HEAP_START may be defined as the initial address hint for mmap-based
+ * allocation.
+ */
+
+/* If available, we can use __builtin_unwind_init() to push the */
+/* relevant registers onto the stack. */
+# if GC_GNUC_PREREQ(2, 8) \
+ && !GC_GNUC_PREREQ(11, 0) /* broken at least in 11.2.0 on cygwin64 */ \
+ && !defined(__INTEL_COMPILER) && !defined(__PATHCC__) \
+ && !defined(__FUJITSU) /* for FX10 system */ \
+ && !(defined(POWERPC) && defined(DARWIN)) /* for MacOS X 10.3.9 */ \
+ && !defined(E2K) && !defined(RTEMS) \
+ && !defined(__ARMCC_VERSION) /* does not exist in armcc gnu emu */ \
+ && (!defined(__clang__) \
+ || GC_CLANG_PREREQ(8, 0) /* was no-op in clang-3 at least */)
+# define HAVE_BUILTIN_UNWIND_INIT
+# endif
+
+/* The common OS-specific definitions (should be applicable to */
+/* all (or most, at least) supported architectures). */
+
+# ifdef CYGWIN32
+# define OS_TYPE "CYGWIN32"
+# define RETRY_GET_THREAD_CONTEXT
+# ifdef USE_WINALLOC
+# define GWW_VDB
+# elif defined(USE_MMAP)
+# define USE_MMAP_ANON
+# endif
+# endif /* CYGWIN32 */
+
+# ifdef DARWIN
+# define OS_TYPE "DARWIN"
+# define DYNAMIC_LOADING
+ /* TODO: see get_end(3), get_etext() and get_end() should not be used. */
+ /* These aren't used when dyld support is enabled (it is by default). */
+# define DATASTART ((ptr_t)get_etext())
+# define DATAEND ((ptr_t)get_end())
+# define USE_MMAP_ANON
+ EXTERN_C_END
+# include <unistd.h>
+ EXTERN_C_BEGIN
+# define GETPAGESIZE() (unsigned)getpagesize()
+ /* There seems to be some issues with trylock hanging on darwin. */
+ /* TODO: This should be looked into some more. */
+# define NO_PTHREAD_TRYLOCK
+# endif /* DARWIN */
+
+# ifdef FREEBSD
+# define OS_TYPE "FREEBSD"
+# define FREEBSD_STACKBOTTOM
+# ifdef __ELF__
+# define DYNAMIC_LOADING
+# endif
+# if !defined(ALPHA) && !defined(SPARC)
+ extern char etext[];
+# define DATASTART GC_FreeBSDGetDataStart(0x1000, (ptr_t)etext)
+# define DATASTART_USES_BSDGETDATASTART
+# ifndef GC_FREEBSD_THREADS
+# define MPROTECT_VDB
+# endif
+# endif
+# endif /* FREEBSD */
+
+# ifdef HAIKU
+# define OS_TYPE "HAIKU"
+# define DYNAMIC_LOADING
+# define MPROTECT_VDB
+ EXTERN_C_END
+# include <OS.h>
+ EXTERN_C_BEGIN
+# define GETPAGESIZE() (unsigned)B_PAGE_SIZE
+# endif /* HAIKU */
+
+# ifdef HPUX
+# define OS_TYPE "HPUX"
+ extern int __data_start[];
+# define DATASTART ((ptr_t)(__data_start))
+# ifdef USE_MMAP
+# define USE_MMAP_ANON
+# endif
+# define DYNAMIC_LOADING
+ EXTERN_C_END
+# include <unistd.h>
+ EXTERN_C_BEGIN
+# define GETPAGESIZE() (unsigned)sysconf(_SC_PAGE_SIZE)
+# endif /* HPUX */
+
+# ifdef LINUX
+# define OS_TYPE "LINUX"
+ EXTERN_C_END
+# include <features.h> /* for __GLIBC__ */
+ EXTERN_C_BEGIN
+# if defined(FORCE_MPROTECT_BEFORE_MADVISE) \
+ || defined(PREFER_MMAP_PROT_NONE)
+# define COUNT_UNMAPPED_REGIONS
+# endif
+# define RETRY_TKILL_ON_EAGAIN
+# if !defined(MIPS) && !defined(POWERPC)
+# define LINUX_STACKBOTTOM
+# endif
+# if defined(__ELF__) && !defined(IA64)
+# define DYNAMIC_LOADING
+# endif
+# if defined(__ELF__) && !defined(ARC) && !defined(RISCV) \
+ && !defined(S390) && !defined(TILEGX) && !defined(TILEPRO)
+ extern int _end[];
+# define DATAEND ((ptr_t)(_end))
+# endif
+# endif /* LINUX */
+
+# ifdef MACOS
+# define OS_TYPE "MACOS"
+# ifndef __LOWMEM__
+ EXTERN_C_END
+# include <LowMem.h>
+ EXTERN_C_BEGIN
+# endif
+ /* See os_dep.c for details of global data segments. */
+# define STACKBOTTOM ((ptr_t)LMGetCurStackBase())
+# define DATAEND /* not needed */
+# endif /* MACOS */
+
+# ifdef MSWIN32
+# define OS_TYPE "MSWIN32"
+ /* STACKBOTTOM and DATASTART are handled specially in os_dep.c. */
+# define DATAEND /* not needed */
+# define GWW_VDB
+# endif
+
+# ifdef MSWINCE
+# define OS_TYPE "MSWINCE"
+# define DATAEND /* not needed */
+# endif
+
+# ifdef NETBSD
+# define OS_TYPE "NETBSD"
+# define HEURISTIC2
+# ifdef __ELF__
+ extern ptr_t GC_data_start;
+# define DATASTART GC_data_start
+# define DYNAMIC_LOADING
+# elif !defined(MIPS) /* TODO: probably do not exclude it */
+ extern char etext[];
+# define DATASTART ((ptr_t)(etext))
+# endif
+# endif /* NETBSD */
+
+# ifdef NEXT
+# define OS_TYPE "NEXT"
+# define DATASTART ((ptr_t)get_etext())
+# define DATASTART_IS_FUNC
+# define DATAEND /* not needed */
+# endif
+
+# ifdef OPENBSD
+# define OS_TYPE "OPENBSD"
+# if !defined(M68K) /* TODO: probably do not exclude it */
+# ifndef GC_OPENBSD_THREADS
+# define HEURISTIC2
+# endif
+ extern int __data_start[];
+# define DATASTART ((ptr_t)__data_start)
+ extern int _end[];
+# define DATAEND ((ptr_t)(&_end))
+# define DYNAMIC_LOADING
+# endif
+# endif /* OPENBSD */
+
+# ifdef SOLARIS
+# define OS_TYPE "SOLARIS"
+ extern int _etext[], _end[];
+ ptr_t GC_SysVGetDataStart(size_t, ptr_t);
+# define DATASTART_IS_FUNC
+# define DATAEND ((ptr_t)(_end))
+# if !defined(USE_MMAP) && defined(REDIRECT_MALLOC)
+# define USE_MMAP 1
+ /* Otherwise we now use calloc. Mmap may result in the */
+ /* heap interleaved with thread stacks, which can result in */
+ /* excessive blacklisting. Sbrk is unusable since it */
+ /* doesn't interact correctly with the system malloc. */
+# endif
+# ifdef USE_MMAP
+# define HEAP_START (ptr_t)0x40000000
+# else
+# define HEAP_START DATAEND
+# endif
+# ifndef GC_THREADS
+# define MPROTECT_VDB
+# endif
+# define DYNAMIC_LOADING
+ /* Define STACKBOTTOM as (ptr_t)_start worked through 2.7, */
+ /* but reportedly breaks under 2.8. It appears that the stack */
+ /* base is a property of the executable, so this should not */
+ /* break old executables. */
+ /* HEURISTIC1 reportedly no longer works under Solaris 2.7. */
+ /* HEURISTIC2 probably works, but this appears to be preferable.*/
+ /* Apparently USRSTACK is defined to be USERLIMIT, but in some */
+ /* installations that's undefined. We work around this with a */
+ /* gross hack: */
+ EXTERN_C_END
+# include <sys/vmparam.h>
+# include <unistd.h>
+ EXTERN_C_BEGIN
+# ifdef USERLIMIT
+ /* This should work everywhere, but doesn't. */
+# define STACKBOTTOM ((ptr_t)USRSTACK)
+# else
+# define HEURISTIC2
+# endif
+# endif /* SOLARIS */
+
+# define STACK_GRAN 0x1000000
+
+# ifdef SYMBIAN
+# define OS_TYPE "SYMBIAN"
+# define ALIGNMENT 4
+# define DATASTART (ptr_t)ALIGNMENT /* cannot be null */
+# define DATAEND (ptr_t)ALIGNMENT
+# ifndef USE_MMAP
+ /* sbrk() is not available. */
+# define USE_MMAP 1
+# endif
+# endif /* SYMBIAN */
+
+# ifdef M68K
+# define MACH_TYPE "M68K"
+# define ALIGNMENT 2
+# ifdef OPENBSD
+# define HEURISTIC2
+# ifdef __ELF__
+ extern ptr_t GC_data_start;
+# define DATASTART GC_data_start
+# define DYNAMIC_LOADING
+# else
+ extern char etext[];
+# define DATASTART ((ptr_t)(etext))
+# endif
+# endif
+# ifdef NETBSD
+ /* Nothing specific. */
+# endif
+# ifdef LINUX
+# if !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+# endif
+# ifdef __ELF__
+# if defined(__GLIBC__) && __GLIBC__ >= 2
+# define SEARCH_FOR_DATA_START
+# else /* !GLIBC2 */
+ extern char **__environ;
+# define DATASTART ((ptr_t)(&__environ))
+ /* hideous kludge: __environ is the first */
+ /* word in crt0.o, and delimits the start */
+ /* of the data segment, no matter which */
+ /* ld options were passed through. */
+ /* We could use _etext instead, but that */
+ /* would include .rodata, which may */
+ /* contain large read-only data tables */
+ /* that we'd rather not scan. */
+# endif /* !GLIBC2 */
+# else
+ extern int etext[];
+# define DATASTART ((ptr_t)((((word)(etext)) + 0xfff) & ~(word)0xfff))
+# endif
+# endif
+# ifdef AMIGA
+# define OS_TYPE "AMIGA"
+ /* STACKBOTTOM and DATASTART handled specially */
+ /* in os_dep.c */
+# define DATAEND /* not needed */
+# define GETPAGESIZE() 4096
+# endif
+# ifdef MACOS
+# define GETPAGESIZE() 4096
+# endif
+# ifdef NEXT
+# define STACKBOTTOM ((ptr_t)0x4000000)
+# endif
+# endif
+
+# ifdef POWERPC
+# define MACH_TYPE "POWERPC"
+# ifdef MACOS
+# define ALIGNMENT 2 /* Still necessary? Could it be 4? */
+# endif
+# ifdef LINUX
+# if defined(__powerpc64__)
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# ifndef HBLKSIZE
+# define HBLKSIZE 4096
+# endif
+# else
+# define ALIGNMENT 4
+# endif
+ /* HEURISTIC1 has been reliably reported to fail for a 32-bit */
+ /* executable on a 64 bit kernel. */
+# if defined(__bg__)
+ /* The Linux Compute Node Kernel (used on BlueGene systems) */
+ /* does not support LINUX_STACKBOTTOM way. */
+# define HEURISTIC2
+# define NO_PTHREAD_GETATTR_NP
+# else
+# define LINUX_STACKBOTTOM
+# endif
+# define SEARCH_FOR_DATA_START
+# if !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+# endif
+# ifndef SOFT_VDB
+# define SOFT_VDB
+# endif
+# endif
+# ifdef DARWIN
+# if defined(__ppc64__)
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# define STACKBOTTOM ((ptr_t)0x7fff5fc00000)
+# define CACHE_LINE_SIZE 64
+# ifndef HBLKSIZE
+# define HBLKSIZE 4096
+# endif
+# else
+# define ALIGNMENT 4
+# define STACKBOTTOM ((ptr_t)0xc0000000)
+# endif
+# define MPROTECT_VDB
+# if defined(USE_PPC_PREFETCH) && defined(__GNUC__)
+ /* The performance impact of prefetches is untested */
+# define PREFETCH(x) \
+ __asm__ __volatile__ ("dcbt 0,%0" : : "r" ((const void *) (x)))
+# define GC_PREFETCH_FOR_WRITE(x) \
+ __asm__ __volatile__ ("dcbtst 0,%0" : : "r" ((const void *) (x)))
+# endif
+# endif
+# ifdef OPENBSD
+# if defined(__powerpc64__)
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# else
+# define ALIGNMENT 4
+# endif
+# endif
+# ifdef FREEBSD
+# if defined(__powerpc64__)
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# ifndef HBLKSIZE
+# define HBLKSIZE 4096
+# endif
+# else
+# define ALIGNMENT 4
+# endif
+# endif
+# ifdef NETBSD
+# define ALIGNMENT 4
+# endif
+# ifdef SN_TARGET_PS3
+# define OS_TYPE "SN_TARGET_PS3"
+# define NO_GETENV
+# define CPP_WORDSZ 32
+# define ALIGNMENT 4
+ extern int _end[];
+ extern int __bss_start;
+# define DATASTART ((ptr_t)(__bss_start))
+# define DATAEND ((ptr_t)(_end))
+# define STACKBOTTOM ((ptr_t)ps3_get_stack_bottom())
+# define NO_PTHREAD_TRYLOCK
+ /* Current GC LOCK() implementation for PS3 explicitly */
+ /* use pthread_mutex_lock for some reason. */
+# endif
+# ifdef AIX
+# define OS_TYPE "AIX"
+# undef ALIGNMENT /* in case it's defined */
+# undef IA64
+ /* DOB: some AIX installs stupidly define IA64 in */
+ /* /usr/include/sys/systemcfg.h */
+# ifdef __64BIT__
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# define STACKBOTTOM ((ptr_t)0x1000000000000000)
+# else
+# define ALIGNMENT 4
+# define CPP_WORDSZ 32
+# define STACKBOTTOM ((ptr_t)((ulong)&errno))
+# endif
+# define USE_MMAP_ANON
+ /* From AIX linker man page:
+ _text Specifies the first location of the program.
+ _etext Specifies the first location after the program.
+ _data Specifies the first location of the data.
+ _edata Specifies the first location after the initialized data
+ _end or end Specifies the first location after all data.
+ */
+ extern int _data[], _end[];
+# define DATASTART ((ptr_t)((ulong)_data))
+# define DATAEND ((ptr_t)((ulong)_end))
+ extern int errno;
+# define DYNAMIC_LOADING
+ /* For really old versions of AIX, this may have to be removed. */
+# endif
+# ifdef NOSYS
+# define OS_TYPE "NOSYS"
+# define ALIGNMENT 4
+ extern void __end[], __dso_handle[];
+# define DATASTART ((ptr_t)__dso_handle) /* OK, that's ugly. */
+# define DATAEND ((ptr_t)(__end))
+ /* Stack starts at 0xE0000000 for the simulator. */
+# undef STACK_GRAN
+# define STACK_GRAN 0x10000000
+# define HEURISTIC1
+# endif
+# endif
+
+# ifdef NACL
+# define OS_TYPE "NACL"
+# if defined(__GLIBC__)
+# define DYNAMIC_LOADING
+# endif
+# define DATASTART ((ptr_t)0x10020000)
+ extern int _end[];
+# define DATAEND ((ptr_t)_end)
+# undef STACK_GRAN
+# define STACK_GRAN 0x10000
+# define HEURISTIC1
+# define NO_PTHREAD_GETATTR_NP
+# define USE_MMAP_ANON
+# define GETPAGESIZE() 65536
+# define MAX_NACL_GC_THREADS 1024
+# endif
+
+# ifdef VAX
+# define MACH_TYPE "VAX"
+# define ALIGNMENT 4 /* Pointers are longword aligned by 4.2 C compiler */
+ extern char etext[];
+# define DATASTART ((ptr_t)(etext))
+# ifdef BSD
+# define OS_TYPE "BSD"
+# define HEURISTIC1
+ /* HEURISTIC2 may be OK, but it's hard to test. */
+# endif
+# ifdef ULTRIX
+# define OS_TYPE "ULTRIX"
+# define STACKBOTTOM ((ptr_t)0x7fffc800)
+# endif
+# endif
+
+# ifdef SPARC
+# define MACH_TYPE "SPARC"
+# if defined(__arch64__) || defined(__sparcv9)
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# define ELF_CLASS ELFCLASS64
+# else
+# define ALIGNMENT 4 /* Required by hardware */
+# define CPP_WORDSZ 32
+# endif
+ /* Don't define USE_ASM_PUSH_REGS. We do use an asm helper, but */
+ /* not to push the registers on the mark stack. */
+# ifdef SOLARIS
+# define DATASTART GC_SysVGetDataStart(0x10000, (ptr_t)_etext)
+# define PROC_VDB
+# define GETPAGESIZE() (unsigned)sysconf(_SC_PAGESIZE)
+ /* getpagesize() appeared to be missing from at least */
+ /* one Solaris 5.4 installation. Weird. */
+# endif
+# ifdef DRSNX
+# define OS_TYPE "DRSNX"
+ extern int etext[];
+ ptr_t GC_SysVGetDataStart(size_t, ptr_t);
+# define DATASTART GC_SysVGetDataStart(0x10000, (ptr_t)etext)
+# define DATASTART_IS_FUNC
+# define MPROTECT_VDB
+# define STACKBOTTOM ((ptr_t)0xdfff0000)
+# define DYNAMIC_LOADING
+# endif
+# ifdef LINUX
+# if !defined(__ELF__) && !defined(CPPCHECK)
+# error Linux SPARC a.out not supported
+# endif
+# define SVR4
+ extern int _etext[];
+ ptr_t GC_SysVGetDataStart(size_t, ptr_t);
+# ifdef __arch64__
+# define DATASTART GC_SysVGetDataStart(0x100000, (ptr_t)_etext)
+# else
+# define DATASTART GC_SysVGetDataStart(0x10000, (ptr_t)_etext)
+# endif
+# define DATASTART_IS_FUNC
+# endif
+# ifdef OPENBSD
+ /* Nothing specific. */
+# endif
+# ifdef NETBSD
+ /* Nothing specific. */
+# endif
+# ifdef FREEBSD
+ extern char etext[];
+ extern char edata[];
+# if !defined(CPPCHECK)
+ extern char end[];
+# endif
+# define NEED_FIND_LIMIT
+# define DATASTART ((ptr_t)(&etext))
+ void * GC_find_limit(void *, int);
+# define DATAEND (ptr_t)GC_find_limit(DATASTART, TRUE)
+# define DATAEND_IS_FUNC
+# define GC_HAVE_DATAREGION2
+# define DATASTART2 ((ptr_t)(&edata))
+# define DATAEND2 ((ptr_t)(&end))
+# endif
+# endif
+
+# ifdef I386
+# define MACH_TYPE "I386"
+# if (defined(__LP64__) || defined(_WIN64)) && !defined(CPPCHECK)
+# error This should be handled as X86_64
+# else
+# define CPP_WORDSZ 32
+# define ALIGNMENT 4
+ /* Appears to hold for all "32 bit" compilers */
+ /* except Borland. The -a4 option fixes */
+ /* Borland. For Watcom the option is -zp4. */
+# endif
+# ifdef SEQUENT
+# define OS_TYPE "SEQUENT"
+ extern int etext[];
+# define DATASTART ((ptr_t)((((word)(etext)) + 0xfff) & ~(word)0xfff))
+# define STACKBOTTOM ((ptr_t)0x3ffff000)
+# endif
+# ifdef EMSCRIPTEN
+# define OS_TYPE "EMSCRIPTEN"
+# define DATASTART (ptr_t)ALIGNMENT
+# define DATAEND (ptr_t)ALIGNMENT
+ /* Emscripten does emulate mmap and munmap, but those should */
+ /* not be used in the collector, since WebAssembly lacks the */
+ /* native support of memory mapping. Use sbrk() instead. */
+# undef USE_MMAP
+# undef USE_MUNMAP
+# define STACK_GROWS_DOWN
+# if defined(GC_THREADS) && !defined(CPPCHECK)
+# error No threads support yet
+# endif
+# endif
+# if defined(__QNX__)
+# define OS_TYPE "QNX"
+# define SA_RESTART 0
+# define HEURISTIC1
+ extern char etext[];
+ extern int _end[];
+# define DATASTART ((ptr_t)etext)
+# define DATAEND ((ptr_t)_end)
+# endif
+# ifdef HAIKU
+ extern int etext[];
+# define DATASTART ((ptr_t)((((word)(etext)) + 0xfff) & ~(word)0xfff))
+# endif
+# ifdef SOLARIS
+# define DATASTART GC_SysVGetDataStart(0x1000, (ptr_t)_etext)
+ /* At least in Solaris 2.5, PROC_VDB gives wrong values for */
+ /* dirty bits. It appears to be fixed in 2.8 and 2.9. */
+# ifdef SOLARIS25_PROC_VDB_BUG_FIXED
+# define PROC_VDB
+# endif
+# endif
+# ifdef SCO
+# define OS_TYPE "SCO"
+ extern int etext[];
+# define DATASTART ((ptr_t)((((word)(etext)) + 0x3fffff) \
+ & ~(word)0x3fffff) \
+ + ((word)(etext) & 0xfff))
+# define STACKBOTTOM ((ptr_t)0x7ffffffc)
+# endif
+# ifdef SCO_ELF
+# define OS_TYPE "SCO_ELF"
+ extern int etext[];
+# define DATASTART ((ptr_t)(etext))
+# define STACKBOTTOM ((ptr_t)0x08048000)
+# define DYNAMIC_LOADING
+# define ELF_CLASS ELFCLASS32
+# endif
+# ifdef DGUX
+# define OS_TYPE "DGUX"
+ extern int _etext, _end;
+ ptr_t GC_SysVGetDataStart(size_t, ptr_t);
+# define DATASTART GC_SysVGetDataStart(0x1000, (ptr_t)(&_etext))
+# define DATASTART_IS_FUNC
+# define DATAEND ((ptr_t)(&_end))
+# define STACK_GROWS_DOWN
+# define HEURISTIC2
+ EXTERN_C_END
+# include <unistd.h>
+ EXTERN_C_BEGIN
+# define GETPAGESIZE() (unsigned)sysconf(_SC_PAGESIZE)
+# define DYNAMIC_LOADING
+# ifndef USE_MMAP
+# define USE_MMAP 1
+# endif
+# define MAP_FAILED (void *) ((word)-1)
+# define HEAP_START (ptr_t)0x40000000
+# endif /* DGUX */
+# ifdef LINUX
+# if !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+# else
+ /* We seem to get random errors in the incremental mode, */
+ /* possibly because the Linux threads implementation */
+ /* itself is a malloc client and cannot deal with the */
+ /* signals. fread() uses malloc too. */
+# endif
+# define HEAP_START (ptr_t)0x1000
+ /* This encourages mmap to give us low addresses, */
+ /* thus allowing the heap to grow to ~3 GB. */
+# ifdef __ELF__
+# if defined(__GLIBC__) && __GLIBC__ >= 2 \
+ || defined(HOST_ANDROID) || defined(HOST_TIZEN)
+# define SEARCH_FOR_DATA_START
+# else
+ extern char **__environ;
+# define DATASTART ((ptr_t)(&__environ))
+ /* hideous kludge: __environ is the first */
+ /* word in crt0.o, and delimits the start */
+ /* of the data segment, no matter which */
+ /* ld options were passed through. */
+ /* We could use _etext instead, but that */
+ /* would include .rodata, which may */
+ /* contain large read-only data tables */
+ /* that we'd rather not scan. */
+# endif
+# if !defined(GC_NO_SIGSETJMP) && (defined(HOST_TIZEN) \
+ || (defined(HOST_ANDROID) \
+ && !(GC_GNUC_PREREQ(4, 8) || GC_CLANG_PREREQ(3, 2) \
+ || __ANDROID_API__ >= 18)))
+ /* Older Android NDK releases lack sigsetjmp in x86 libc */
+ /* (setjmp is used instead to find data_start). The bug */
+ /* is fixed in Android NDK r8e (so, ok to use sigsetjmp */
+ /* if gcc4.8+, clang3.2+ or Android API level 18+). */
+# define GC_NO_SIGSETJMP 1
+# endif
+# else
+ extern int etext[];
+# define DATASTART ((ptr_t)(((word)(etext) + 0xfff) & ~(word)0xfff))
+# endif
+# ifdef USE_I686_PREFETCH
+# define PREFETCH(x) \
+ __asm__ __volatile__ ("prefetchnta %0" : : "m"(*(char *)(x)))
+ /* Empirically prefetcht0 is much more effective at reducing */
+ /* cache miss stalls for the targeted load instructions. But it */
+ /* seems to interfere enough with other cache traffic that the */
+ /* net result is worse than prefetchnta. */
+# ifdef FORCE_WRITE_PREFETCH
+ /* Using prefetches for write seems to have a slight negative */
+ /* impact on performance, at least for a PIII/500. */
+# define GC_PREFETCH_FOR_WRITE(x) \
+ __asm__ __volatile__ ("prefetcht0 %0" : : "m"(*(char *)(x)))
+# else
+# define GC_NO_PREFETCH_FOR_WRITE
+# endif
+# elif defined(USE_3DNOW_PREFETCH)
+# define PREFETCH(x) \
+ __asm__ __volatile__ ("prefetch %0" : : "m"(*(char *)(x)))
+# define GC_PREFETCH_FOR_WRITE(x) \
+ __asm__ __volatile__ ("prefetchw %0" : : "m"(*(char *)(x)))
+# endif
+# if defined(__GLIBC__) && !defined(__UCLIBC__) \
+ && !defined(GLIBC_TSX_BUG_FIXED)
+ /* Workaround lock elision implementation for some glibc. */
+# define GLIBC_2_19_TSX_BUG
+ EXTERN_C_END
+# include <gnu/libc-version.h> /* for gnu_get_libc_version() */
+ EXTERN_C_BEGIN
+# endif
+# ifndef SOFT_VDB
+# define SOFT_VDB
+# endif
+# endif
+# ifdef CYGWIN32
+# define WOW64_THREAD_CONTEXT_WORKAROUND
+# define DATASTART ((ptr_t)GC_DATASTART) /* From gc.h */
+# define DATAEND ((ptr_t)GC_DATAEND)
+# ifndef USE_WINALLOC
+# /* MPROTECT_VDB does not work, it leads to a spurious exit. */
+# ifdef USE_MMAP
+# define NEED_FIND_LIMIT
+# endif
+# endif
+# endif
+# ifdef INTERIX
+# define OS_TYPE "INTERIX"
+ extern int _data_start__[];
+ extern int _bss_end__[];
+# define DATASTART ((ptr_t)_data_start__)
+# define DATAEND ((ptr_t)_bss_end__)
+# define STACKBOTTOM ({ ptr_t rv; \
+ __asm__ __volatile__ ("movl %%fs:4, %%eax" \
+ : "=a" (rv)); \
+ rv; })
+# define USE_MMAP_ANON
+# endif
+# ifdef OS2
+# define OS_TYPE "OS2"
+ /* STACKBOTTOM and DATASTART are handled specially in */
+ /* os_dep.c. OS2 actually has the right */
+ /* system call! */
+# define DATAEND /* not needed */
+# endif
+# ifdef MSWIN32
+# define WOW64_THREAD_CONTEXT_WORKAROUND
+# define RETRY_GET_THREAD_CONTEXT
+# define MPROTECT_VDB
+# endif
+# ifdef MSWINCE
+ /* Nothing specific. */
+# endif
+# ifdef DJGPP
+# define OS_TYPE "DJGPP"
+ EXTERN_C_END
+# include "stubinfo.h"
+ EXTERN_C_BEGIN
+ extern int etext[];
+ extern int _stklen;
+ extern int __djgpp_stack_limit;
+# define DATASTART ((ptr_t)((((word)(etext)) + 0x1ff) & ~(word)0x1ff))
+/* #define STACKBOTTOM ((ptr_t)((word)_stubinfo+_stubinfo->size+_stklen)) */
+# define STACKBOTTOM ((ptr_t)((word)__djgpp_stack_limit + _stklen))
+ /* This may not be right. */
+# endif
+# ifdef OPENBSD
+ /* Nothing specific. */
+# endif
+# ifdef FREEBSD
+# ifdef __GLIBC__
+ extern int _end[];
+# define DATAEND ((ptr_t)(_end))
+# endif
+# endif
+# ifdef NETBSD
+ /* Nothing specific. */
+# endif
+# ifdef THREE86BSD
+# define OS_TYPE "THREE86BSD"
+# define HEURISTIC2
+ extern char etext[];
+# define DATASTART ((ptr_t)(etext))
+# endif
+# ifdef BSDI
+# define OS_TYPE "BSDI"
+# define HEURISTIC2
+ extern char etext[];
+# define DATASTART ((ptr_t)(etext))
+# endif
+# ifdef NEXT
+# define STACKBOTTOM ((ptr_t)0xc0000000)
+# endif
+# ifdef RTEMS
+# define OS_TYPE "RTEMS"
+ EXTERN_C_END
+# include <sys/unistd.h>
+ EXTERN_C_BEGIN
+ extern int etext[];
+ void *rtems_get_stack_bottom(void);
+# define InitStackBottom rtems_get_stack_bottom()
+# define DATASTART ((ptr_t)etext)
+# define STACKBOTTOM ((ptr_t)InitStackBottom)
+# endif
+# ifdef DOS4GW
+# define OS_TYPE "DOS4GW"
+ extern long __nullarea;
+ extern char _end;
+ extern char *_STACKTOP;
+ /* Depending on calling conventions Watcom C either precedes */
+ /* or does not precedes with underscore names of C-variables. */
+ /* Make sure startup code variables always have the same names. */
+ #pragma aux __nullarea "*";
+ #pragma aux _end "*";
+# define STACKBOTTOM ((ptr_t)_STACKTOP)
+ /* confused? me too. */
+# define DATASTART ((ptr_t)(&__nullarea))
+# define DATAEND ((ptr_t)(&_end))
+# endif
+# ifdef HURD
+# define OS_TYPE "HURD"
+# define STACK_GROWS_DOWN
+# define HEURISTIC2
+# define SEARCH_FOR_DATA_START
+ extern int _end[];
+# define DATAEND ((ptr_t)(_end))
+/* # define MPROTECT_VDB Not quite working yet? */
+# define DYNAMIC_LOADING
+# define USE_MMAP_ANON
+# endif
+# ifdef DARWIN
+# define DARWIN_DONT_PARSE_STACK 1
+# define STACKBOTTOM ((ptr_t)0xc0000000)
+# define MPROTECT_VDB
+# if TARGET_OS_IPHONE && !defined(NO_DYLD_BIND_FULLY_IMAGE)
+ /* iPhone/iPad simulator */
+# define NO_DYLD_BIND_FULLY_IMAGE
+# endif
+# endif /* DARWIN */
+# endif
+
+# ifdef NS32K
+# define MACH_TYPE "NS32K"
+# define ALIGNMENT 4
+ extern char **environ;
+# define DATASTART ((ptr_t)(&environ))
+ /* hideous kludge: environ is the first */
+ /* word in crt0.o, and delimits the start */
+ /* of the data segment, no matter which */
+ /* ld options were passed through. */
+# define STACKBOTTOM ((ptr_t)0xfffff000) /* for Encore */
+# endif
+
+# ifdef LOONGARCH
+# define MACH_TYPE "LoongArch"
+# ifdef LINUX
+# pragma weak __data_start
+ extern int __data_start[];
+# define DATASTART ((ptr_t)(__data_start))
+# define CPP_WORDSZ _LOONGARCH_SZPTR
+# define ALIGNMENT (_LOONGARCH_SZPTR/8)
+# endif
+# endif /* LOONGARCH */
+
+# ifdef MIPS
+# define MACH_TYPE "MIPS"
+# ifdef LINUX
+# pragma weak __data_start
+ extern int __data_start[];
+# define DATASTART ((ptr_t)(__data_start))
+# ifdef _MIPS_SZPTR
+# define CPP_WORDSZ _MIPS_SZPTR
+# define ALIGNMENT (_MIPS_SZPTR/8)
+# else
+# define ALIGNMENT 4
+# endif
+# ifndef HBLKSIZE
+# define HBLKSIZE 4096
+# endif
+# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 2 || __GLIBC__ > 2
+# define LINUX_STACKBOTTOM
+# else
+# define STACKBOTTOM ((ptr_t)0x7fff8000)
+# endif
+# endif /* Linux */
+# ifdef EWS4800
+# define OS_TYPE "EWS4800"
+# define HEURISTIC2
+# if defined(_MIPS_SZPTR) && (_MIPS_SZPTR == 64)
+ extern int _fdata[], _end[];
+# define DATASTART ((ptr_t)_fdata)
+# define DATAEND ((ptr_t)_end)
+# define CPP_WORDSZ _MIPS_SZPTR
+# define ALIGNMENT (_MIPS_SZPTR/8)
+# else
+ extern int etext[], edata[];
+# if !defined(CPPCHECK)
+ extern int end[];
+# endif
+ extern int _DYNAMIC_LINKING[], _gp[];
+# define DATASTART ((ptr_t)((((word)(etext) + 0x3ffff) \
+ & ~(word)0x3ffff) \
+ + ((word)(etext) & 0xffff)))
+# define DATAEND ((ptr_t)(edata))
+# define GC_HAVE_DATAREGION2
+# define DATASTART2 (_DYNAMIC_LINKING \
+ ? (ptr_t)(((word)_gp + 0x8000 + 0x3ffff) & ~(word)0x3ffff) \
+ : (ptr_t)edata)
+# define DATAEND2 ((ptr_t)(end))
+# define ALIGNMENT 4
+# endif
+# endif
+# ifdef ULTRIX
+# define OS_TYPE "ULTRIX"
+# define HEURISTIC2
+# define DATASTART ((ptr_t)0x10000000)
+ /* Could probably be slightly higher since */
+ /* startup code allocates lots of stuff. */
+# define ALIGNMENT 4
+# endif
+# ifdef IRIX5
+# define OS_TYPE "IRIX5"
+# define HEURISTIC2
+ extern int _fdata[];
+# define DATASTART ((ptr_t)(_fdata))
+# ifdef USE_MMAP
+# define HEAP_START (ptr_t)0x30000000
+# else
+# define HEAP_START DATASTART
+# endif
+ /* Lowest plausible heap address. */
+ /* In the MMAP case, we map there. */
+ /* In either case it is used to identify */
+ /* heap sections so they're not */
+ /* considered as roots. */
+/*# define MPROTECT_VDB DOB: this should work, but there is evidence */
+/* of recent breakage. */
+# ifdef _MIPS_SZPTR
+# define CPP_WORDSZ _MIPS_SZPTR
+# define ALIGNMENT (_MIPS_SZPTR/8)
+# else
+# define ALIGNMENT 4
+# endif
+# define DYNAMIC_LOADING
+# endif
+# ifdef MSWINCE
+# define ALIGNMENT 4
+# endif
+# ifdef NETBSD
+# define ALIGNMENT 4
+# ifndef __ELF__
+# define DATASTART ((ptr_t)0x10000000)
+# define STACKBOTTOM ((ptr_t)0x7ffff000)
+# endif
+# endif
+# ifdef OPENBSD
+# define CPP_WORDSZ 64 /* all OpenBSD/mips platforms are 64-bit */
+# define ALIGNMENT 8
+# endif
+# ifdef FREEBSD
+# define ALIGNMENT 4
+# endif
+# ifdef NONSTOP
+# define OS_TYPE "NONSTOP"
+# define CPP_WORDSZ 32
+# define ALIGNMENT 4
+# define DATASTART ((ptr_t)0x08000000)
+ extern char **environ;
+# define DATAEND ((ptr_t)(environ - 0x10))
+# define STACKBOTTOM ((ptr_t)0x4fffffff)
+# endif
+# endif
+
+# ifdef NIOS2
+# define CPP_WORDSZ 32
+# define MACH_TYPE "NIOS2"
+# ifdef LINUX
+ extern int __data_start[];
+# define DATASTART ((ptr_t)(__data_start))
+# define ALIGNMENT 4
+# ifndef HBLKSIZE
+# define HBLKSIZE 4096
+# endif
+# endif
+# endif /* NIOS2 */
+
+# ifdef OR1K
+# define CPP_WORDSZ 32
+# define MACH_TYPE "OR1K"
+# ifdef LINUX
+ extern int __data_start[];
+# define DATASTART ((ptr_t)(__data_start))
+# define ALIGNMENT 4
+# ifndef HBLKSIZE
+# define HBLKSIZE 4096
+# endif
+# endif
+# endif /* OR1K */
+
+# ifdef HP_PA
+# define MACH_TYPE "HP_PA"
+# ifdef __LP64__
+# define CPP_WORDSZ 64
+# define ALIGNMENT 8
+# else
+# define CPP_WORDSZ 32
+# define ALIGNMENT 4
+# endif
+# define STACK_GROWS_UP
+# ifdef HPUX
+# ifndef GC_THREADS
+# define MPROTECT_VDB
+# endif
+# ifdef USE_HPUX_FIXED_STACKBOTTOM
+ /* The following appears to work for 7xx systems running HP/UX */
+ /* 9.xx. Furthermore, it might result in much faster */
+ /* collections than HEURISTIC2, which may involve scanning */
+ /* segments that directly precede the stack. It is not the */
+ /* default, since it may not work on older machine/OS */
+ /* combinations. (Thanks to Raymond X.T. Nijssen for uncovering */
+ /* this.) */
+ /* This technique also doesn't work with HP/UX 11.xx. The */
+ /* stack size is settable using the kernel maxssiz variable, */
+ /* and in 11.23 and latter, the size can be set dynamically. */
+ /* It also doesn't handle SHMEM_MAGIC binaries which have */
+ /* stack and data in the first quadrant. */
+# define STACKBOTTOM ((ptr_t)0x7b033000) /* from /etc/conf/h/param.h */
+# elif defined(USE_ENVIRON_POINTER)
+ /* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2 */
+ /* to this. Note that the GC must be initialized before the */
+ /* first putenv call. Unfortunately, some clients do not obey. */
+ extern char ** environ;
+# define STACKBOTTOM ((ptr_t)environ)
+# elif !defined(HEURISTIC2)
+ /* This uses pst_vm_status support. */
+# define HPUX_MAIN_STACKBOTTOM
+# define NEED_FIND_LIMIT
+# endif
+# ifndef __GNUC__
+# define PREFETCH(x) do { \
+ register long addr = (long)(x); \
+ (void) _asm ("LDW", 0, 0, addr, 0); \
+ } while (0)
+# endif
+# endif /* HPUX */
+# ifdef LINUX
+# define SEARCH_FOR_DATA_START
+# endif
+# ifdef OPENBSD
+ /* Nothing specific. */
+# endif
+# endif /* HP_PA */
+
+# ifdef ALPHA
+# define MACH_TYPE "ALPHA"
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# ifdef NETBSD
+# define ELFCLASS32 32
+# define ELFCLASS64 64
+# define ELF_CLASS ELFCLASS64
+# endif
+# ifdef OPENBSD
+ /* Nothing specific. */
+# endif
+# ifdef FREEBSD
+ /* MPROTECT_VDB is not yet supported at all on FreeBSD/alpha. */
+/* Handle unmapped hole alpha*-*-freebsd[45]* puts between etext and edata. */
+ extern char etext[];
+ extern char edata[];
+# if !defined(CPPCHECK)
+ extern char end[];
+# endif
+# define NEED_FIND_LIMIT
+# define DATASTART ((ptr_t)(&etext))
+ void * GC_find_limit(void *, int);
+# define DATAEND (ptr_t)GC_find_limit(DATASTART, TRUE)
+# define DATAEND_IS_FUNC
+# define GC_HAVE_DATAREGION2
+# define DATASTART2 ((ptr_t)(&edata))
+# define DATAEND2 ((ptr_t)(&end))
+# endif
+# ifdef OSF1
+# define OS_TYPE "OSF1"
+# define DATASTART ((ptr_t)0x140000000)
+ extern int _end[];
+# define DATAEND ((ptr_t)(&_end))
+ extern char ** environ;
+ EXTERN_C_END
+# include <unistd.h>
+ EXTERN_C_BEGIN
+ /* round up from the value of environ to the nearest page boundary */
+ /* Probably breaks if putenv is called before collector */
+ /* initialization. */
+# define STACKBOTTOM ((ptr_t)(((word)(environ) | (getpagesize()-1))+1))
+/* # define HEURISTIC2 */
+ /* Normally HEURISTIC2 is too conservative, since */
+ /* the text segment immediately follows the stack. */
+ /* Hence we give an upper pound. */
+ /* This is currently unused, since we disabled HEURISTIC2 */
+ extern int __start[];
+# define HEURISTIC2_LIMIT ((ptr_t)((word)(__start) \
+ & ~(word)(getpagesize()-1)))
+# ifndef GC_OSF1_THREADS
+ /* Unresolved signal issues with threads. */
+# define MPROTECT_VDB
+# endif
+# define DYNAMIC_LOADING
+# endif
+# ifdef LINUX
+# ifdef __ELF__
+# define SEARCH_FOR_DATA_START
+# else
+# define DATASTART ((ptr_t)0x140000000)
+ extern int _end[];
+# define DATAEND ((ptr_t)(_end))
+# endif
+# if !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+ /* Has only been superficially tested. May not */
+ /* work on all versions. */
+# endif
+# endif
+# endif /* ALPHA */
+
+# ifdef IA64
+# define MACH_TYPE "IA64"
+# ifdef HPUX
+# ifdef _ILP32
+# define CPP_WORDSZ 32
+ /* Requires 8 byte alignment for malloc */
+# define ALIGNMENT 4
+# else
+# if !defined(_LP64) && !defined(CPPCHECK)
+# error Unknown ABI
+# endif
+# define CPP_WORDSZ 64
+ /* Requires 16 byte alignment for malloc */
+# define ALIGNMENT 8
+# endif
+ /* Note that the GC must be initialized before the 1st putenv call. */
+ extern char ** environ;
+# define STACKBOTTOM ((ptr_t)environ)
+# define HPUX_STACKBOTTOM
+ /* The following was empirically determined, and is probably */
+ /* not very robust. */
+ /* Note that the backing store base seems to be at a nice */
+ /* address minus one page. */
+# define BACKING_STORE_DISPLACEMENT 0x1000000
+# define BACKING_STORE_ALIGNMENT 0x1000
+ extern ptr_t GC_register_stackbottom;
+# define BACKING_STORE_BASE GC_register_stackbottom
+ /* Known to be wrong for recent HP/UX versions!!! */
+# endif
+# ifdef LINUX
+# define CPP_WORDSZ 64
+# define ALIGNMENT 8
+ /* The following works on NUE and older kernels: */
+ /* define STACKBOTTOM ((ptr_t)0xa000000000000000l) */
+ /* TODO: LINUX_STACKBOTTOM does not work on NUE. */
+ /* We also need the base address of the register stack */
+ /* backing store. */
+ extern ptr_t GC_register_stackbottom;
+# define BACKING_STORE_BASE GC_register_stackbottom
+# define SEARCH_FOR_DATA_START
+# ifdef __GNUC__
+# define DYNAMIC_LOADING
+# else
+ /* In the Intel compiler environment, we seem to end up with */
+ /* statically linked executables and an undefined reference */
+ /* to _DYNAMIC */
+# endif
+# if !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+ /* Requires Linux 2.3.47 or later. */
+# endif
+# ifdef __GNUC__
+# ifndef __INTEL_COMPILER
+# define PREFETCH(x) \
+ __asm__ (" lfetch [%0]": : "r"(x))
+# define GC_PREFETCH_FOR_WRITE(x) \
+ __asm__ (" lfetch.excl [%0]": : "r"(x))
+# define CLEAR_DOUBLE(x) \
+ __asm__ (" stf.spill [%0]=f0": : "r"((void *)(x)))
+# else
+ EXTERN_C_END
+# include <ia64intrin.h>
+ EXTERN_C_BEGIN
+# define PREFETCH(x) __lfetch(__lfhint_none, (x))
+# define GC_PREFETCH_FOR_WRITE(x) __lfetch(__lfhint_nta, (x))
+# define CLEAR_DOUBLE(x) __stf_spill((void *)(x), 0)
+# endif /* __INTEL_COMPILER */
+# endif
+# endif
+# ifdef MSWIN32
+ /* FIXME: This is a very partial guess. There is no port, yet. */
+# if defined(_WIN64)
+# define CPP_WORDSZ 64
+# else
+# define CPP_WORDSZ 32 /* Is this possible? */
+# endif
+# define ALIGNMENT 8
+# endif
+# endif
+
+# ifdef E2K
+# define MACH_TYPE "E2K"
+# define CPP_WORDSZ 64
+# define ALIGNMENT 8
+# ifndef HBLKSIZE
+# define HBLKSIZE 4096
+# endif
+# ifdef LINUX
+ extern int __dso_handle[];
+# define DATASTART ((ptr_t)__dso_handle)
+# endif
+# endif /* E2K */
+
+# ifdef M88K
+# define MACH_TYPE "M88K"
+# define ALIGNMENT 4
+# define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */
+ extern int etext[];
+# ifdef CX_UX
+# define OS_TYPE "CX_UX"
+# define DATASTART ((ptr_t)((((word)(etext) + 0x3fffff) \
+ & ~(word)0x3fffff) \
+ + 0x10000))
+# endif
+# ifdef DGUX
+# define OS_TYPE "DGUX"
+ ptr_t GC_SysVGetDataStart(size_t, ptr_t);
+# define DATASTART GC_SysVGetDataStart(0x10000, (ptr_t)etext)
+# define DATASTART_IS_FUNC
+# endif
+# endif
+
+# ifdef S370
+ /* If this still works, and if anyone cares, this should probably */
+ /* be moved to the S390 category. */
+# define MACH_TYPE "S370"
+# define ALIGNMENT 4 /* Required by hardware */
+# ifdef UTS4
+# define OS_TYPE "UTS4"
+ extern int etext[];
+ extern int _etext[];
+ extern int _end[];
+ ptr_t GC_SysVGetDataStart(size_t, ptr_t);
+# define DATASTART GC_SysVGetDataStart(0x10000, (ptr_t)_etext)
+# define DATASTART_IS_FUNC
+# define DATAEND ((ptr_t)(_end))
+# define HEURISTIC2
+# endif
+# endif
+
+# ifdef S390
+# define MACH_TYPE "S390"
+# ifndef __s390x__
+# define ALIGNMENT 4
+# define CPP_WORDSZ 32
+# else
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# ifndef HBLKSIZE
+# define HBLKSIZE 4096
+# endif
+# endif
+# ifdef LINUX
+ extern int __data_start[] __attribute__((__weak__));
+# define DATASTART ((ptr_t)(__data_start))
+ extern int _end[] __attribute__((__weak__));
+# define DATAEND ((ptr_t)(_end))
+# define CACHE_LINE_SIZE 256
+# define GETPAGESIZE() 4096
+# if !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+# endif
+# ifndef SOFT_VDB
+# define SOFT_VDB
+# endif
+# endif
+# endif /* S390 */
+
+# ifdef AARCH64
+# define MACH_TYPE "AARCH64"
+# ifdef __ILP32__
+# define CPP_WORDSZ 32
+# define ALIGNMENT 4
+# else
+# define CPP_WORDSZ 64
+# define ALIGNMENT 8
+# endif
+# ifndef HBLKSIZE
+# define HBLKSIZE 4096
+# endif
+# ifdef LINUX
+# if !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+# endif
+# if defined(HOST_ANDROID)
+# define SEARCH_FOR_DATA_START
+# else
+ extern int __data_start[] __attribute__((__weak__));
+# define DATASTART ((ptr_t)__data_start)
+# endif
+# endif
+# ifdef DARWIN
+ /* OS X, iOS */
+# define DARWIN_DONT_PARSE_STACK 1
+# define STACKBOTTOM ((ptr_t)0x16fdfffff)
+# if TARGET_OS_IPHONE
+# ifndef NO_DYLD_BIND_FULLY_IMAGE
+# define NO_DYLD_BIND_FULLY_IMAGE
+# endif
+ /* MPROTECT_VDB causes use of non-public API like exc_server, */
+ /* this could be a reason for blocking the client application */
+ /* in the store. */
+# elif TARGET_OS_OSX
+# define MPROTECT_VDB
+# endif
+# endif
+# ifdef FREEBSD
+ /* Nothing specific. */
+# endif
+# ifdef NETBSD
+# define ELF_CLASS ELFCLASS64
+# endif
+# ifdef OPENBSD
+ /* Nothing specific. */
+# endif
+# ifdef NINTENDO_SWITCH
+# define OS_TYPE "NINTENDO_SWITCH"
+ extern int __bss_end[];
+# define NO_HANDLE_FORK 1
+# define DATASTART (ptr_t)ALIGNMENT /* cannot be null */
+# define DATAEND (ptr_t)(&__bss_end)
+ void *switch_get_stack_bottom(void);
+# define STACKBOTTOM ((ptr_t)switch_get_stack_bottom())
+# endif
+# ifdef MSWIN32 /* UWP */
+ /* TODO: Enable MPROTECT_VDB */
+# endif
+# ifdef NOSYS
+# define OS_TYPE "NOSYS"
+ /* __data_start is usually defined in the target linker script. */
+ extern int __data_start[];
+# define DATASTART ((ptr_t)__data_start)
+ extern void *__stack_base__;
+# define STACKBOTTOM ((ptr_t)__stack_base__)
+# endif
+# endif
+
+# ifdef ARM32
+# if defined(NACL)
+# define MACH_TYPE "NACL"
+# else
+# define MACH_TYPE "ARM32"
+# endif
+# define CPP_WORDSZ 32
+# define ALIGNMENT 4
+# ifdef NETBSD
+ /* Nothing specific. */
+# endif
+# ifdef LINUX
+# if !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+# endif
+# if defined(__GLIBC__) && __GLIBC__ >= 2 \
+ || defined(HOST_ANDROID) || defined(HOST_TIZEN)
+# define SEARCH_FOR_DATA_START
+# else
+ extern char **__environ;
+# define DATASTART ((ptr_t)(&__environ))
+ /* hideous kludge: __environ is the first */
+ /* word in crt0.o, and delimits the start */
+ /* of the data segment, no matter which */
+ /* ld options were passed through. */
+ /* We could use _etext instead, but that */
+ /* would include .rodata, which may */
+ /* contain large read-only data tables */
+ /* that we'd rather not scan. */
+# endif
+# endif
+# ifdef MSWINCE
+ /* Nothing specific. */
+# endif
+# ifdef FREEBSD
+ /* Nothing specific. */
+# endif
+# ifdef DARWIN
+ /* iOS */
+# define DARWIN_DONT_PARSE_STACK 1
+# define STACKBOTTOM ((ptr_t)0x30000000)
+ /* MPROTECT_VDB causes use of non-public API. */
+# if TARGET_OS_IPHONE && !defined(NO_DYLD_BIND_FULLY_IMAGE)
+# define NO_DYLD_BIND_FULLY_IMAGE
+# endif
+# endif
+# ifdef OPENBSD
+ /* Nothing specific. */
+# endif
+# ifdef SN_TARGET_PSP2
+# define OS_TYPE "SN_TARGET_PSP2"
+# define NO_HANDLE_FORK 1
+# define DATASTART (ptr_t)ALIGNMENT
+# define DATAEND (ptr_t)ALIGNMENT
+ void *psp2_get_stack_bottom(void);
+# define STACKBOTTOM ((ptr_t)psp2_get_stack_bottom())
+# endif
+# ifdef NN_PLATFORM_CTR
+# define OS_TYPE "NN_PLATFORM_CTR"
+ extern unsigned char Image$$ZI$$ZI$$Base[];
+# define DATASTART (ptr_t)(Image$$ZI$$ZI$$Base)
+ extern unsigned char Image$$ZI$$ZI$$Limit[];
+# define DATAEND (ptr_t)(Image$$ZI$$ZI$$Limit)
+ void *n3ds_get_stack_bottom(void);
+# define STACKBOTTOM ((ptr_t)n3ds_get_stack_bottom())
+# endif
+# ifdef MSWIN32 /* UWP */
+ /* TODO: Enable MPROTECT_VDB */
+# endif
+# ifdef NOSYS
+# define OS_TYPE "NOSYS"
+ /* __data_start is usually defined in the target linker script. */
+ extern int __data_start[];
+# define DATASTART ((ptr_t)(__data_start))
+ /* __stack_base__ is set in newlib/libc/sys/arm/crt0.S */
+ extern void *__stack_base__;
+# define STACKBOTTOM ((ptr_t)(__stack_base__))
+# endif
+# ifdef SYMBIAN
+ /* Nothing specific. */
+# endif
+# endif /* ARM32 */
+
+# ifdef CRIS
+# define MACH_TYPE "CRIS"
+# define CPP_WORDSZ 32
+# define ALIGNMENT 1
+# ifdef LINUX
+# define SEARCH_FOR_DATA_START
+# endif
+# endif /* CRIS */
+
+# if defined(SH) && !defined(SH4)
+# define MACH_TYPE "SH"
+# define ALIGNMENT 4
+# ifdef LINUX
+# define SEARCH_FOR_DATA_START
+# endif
+# ifdef NETBSD
+ /* Nothing specific. */
+# endif
+# ifdef OPENBSD
+ /* Nothing specific. */
+# endif
+# ifdef MSWINCE
+ /* Nothing specific. */
+# endif
+# endif
+
+# ifdef SH4
+# define MACH_TYPE "SH4"
+# define ALIGNMENT 4
+# ifdef MSWINCE
+ /* Nothing specific. */
+# endif
+# endif
+
+# ifdef AVR32
+# define MACH_TYPE "AVR32"
+# define CPP_WORDSZ 32
+# define ALIGNMENT 4
+# ifdef LINUX
+# define SEARCH_FOR_DATA_START
+# endif
+# endif /* AVR32 */
+
+# ifdef M32R
+# define CPP_WORDSZ 32
+# define MACH_TYPE "M32R"
+# define ALIGNMENT 4
+# ifdef LINUX
+# define SEARCH_FOR_DATA_START
+# endif
+# endif /* M32R */
+
+# ifdef X86_64
+# define MACH_TYPE "X86_64"
+# ifdef __ILP32__
+# define ALIGNMENT 4
+# define CPP_WORDSZ 32
+# else
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# endif
+# ifndef HBLKSIZE
+# define HBLKSIZE 4096
+# endif
+# ifndef CACHE_LINE_SIZE
+# define CACHE_LINE_SIZE 64
+# endif
+# ifdef PLATFORM_GETMEM
+# define OS_TYPE "PLATFORM_GETMEM"
+# define DATASTART (ptr_t)ALIGNMENT
+# define DATAEND (ptr_t)ALIGNMENT
+ EXTERN_C_END
+# include <pthread.h>
+ EXTERN_C_BEGIN
+ void *platform_get_stack_bottom(void);
+# define STACKBOTTOM ((ptr_t)platform_get_stack_bottom())
+# endif
+# ifdef LINUX
+# if !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+# else
+ /* We seem to get random errors in the incremental mode, */
+ /* possibly because the Linux threads implementation */
+ /* itself is a malloc client and cannot deal with the */
+ /* signals. fread() uses malloc too. */
+# endif
+# define SEARCH_FOR_DATA_START
+# if defined(__GLIBC__) && !defined(__UCLIBC__)
+ /* A workaround for GCF (Google Cloud Function) which does */
+ /* not support mmap() for "/dev/zero". Should not cause any */
+ /* harm to other targets. */
+# define USE_MMAP_ANON
+# endif
+# if defined(__GLIBC__) && !defined(__UCLIBC__) \
+ && !defined(GETCONTEXT_FPU_BUG_FIXED)
+ /* At present, there's a bug in GLibc getcontext() on */
+ /* Linux/x64 (it clears FPU exception mask). We define this */
+ /* macro to workaround it. */
+ /* TODO: This seems to be fixed in GLibc v2.14. */
+# define GETCONTEXT_FPU_EXCMASK_BUG
+# endif
+# if defined(__GLIBC__) && !defined(__UCLIBC__) \
+ && !defined(GLIBC_TSX_BUG_FIXED)
+ /* Workaround lock elision implementation for some glibc. */
+# define GLIBC_2_19_TSX_BUG
+ EXTERN_C_END
+# include <gnu/libc-version.h> /* for gnu_get_libc_version() */
+ EXTERN_C_BEGIN
+# endif
+# ifndef SOFT_VDB
+# define SOFT_VDB
+# endif
+# endif
+# ifdef DARWIN
+# define DARWIN_DONT_PARSE_STACK 1
+# define STACKBOTTOM ((ptr_t)0x7fff5fc00000)
+# define MPROTECT_VDB
+# if TARGET_OS_IPHONE && !defined(NO_DYLD_BIND_FULLY_IMAGE)
+ /* iPhone/iPad simulator */
+# define NO_DYLD_BIND_FULLY_IMAGE
+# endif
+# endif
+# ifdef FREEBSD
+# ifdef __GLIBC__
+ extern int _end[];
+# define DATAEND ((ptr_t)(_end))
+# endif
+# if defined(__DragonFly__)
+ /* DragonFly BSD still has vm.max_proc_mmap, according to */
+ /* its mmap(2) man page. */
+# define COUNT_UNMAPPED_REGIONS
+# endif
+# endif
+# ifdef NETBSD
+ /* Nothing specific. */
+# endif
+# ifdef OPENBSD
+ /* Nothing specific. */
+# endif
+# ifdef HAIKU
+# define HEURISTIC2
+# define SEARCH_FOR_DATA_START
+# endif
+# ifdef SOLARIS
+# define ELF_CLASS ELFCLASS64
+# define DATASTART GC_SysVGetDataStart(0x1000, (ptr_t)_etext)
+# ifdef SOLARIS25_PROC_VDB_BUG_FIXED
+# define PROC_VDB
+# endif
+# endif
+# ifdef HURD
+# define OS_TYPE "HURD"
+# define HEURISTIC2
+# define SEARCH_FOR_DATA_START
+ extern int _end[];
+# define DATAEND ((ptr_t)(_end))
+# define DYNAMIC_LOADING
+# define USE_MMAP_ANON
+# endif
+# ifdef CYGWIN32
+# ifndef USE_WINALLOC
+# if defined(THREAD_LOCAL_ALLOC)
+ /* TODO: For an unknown reason, thread-local allocations */
+ /* lead to spurious process exit after the fault handler is */
+ /* once invoked. */
+# else
+# define MPROTECT_VDB
+# endif
+# endif
+# endif
+# ifdef MSWIN_XBOX1
+# define OS_TYPE "MSWIN_XBOX1"
+# define NO_GETENV
+# define DATASTART (ptr_t)ALIGNMENT
+# define DATAEND (ptr_t)ALIGNMENT
+ LONG64 durango_get_stack_bottom(void);
+# define STACKBOTTOM ((ptr_t)durango_get_stack_bottom())
+# define GETPAGESIZE() 4096
+# ifndef USE_MMAP
+# define USE_MMAP 1
+# endif
+ /* The following is from sys/mman.h: */
+# define PROT_NONE 0
+# define PROT_READ 1
+# define PROT_WRITE 2
+# define PROT_EXEC 4
+# define MAP_PRIVATE 2
+# define MAP_FIXED 0x10
+# define MAP_FAILED ((void *)-1)
+# endif
+# ifdef MSWIN32
+# define RETRY_GET_THREAD_CONTEXT
+# if !defined(__GNUC__) || defined(__INTEL_COMPILER) \
+ || (GC_GNUC_PREREQ(4, 7) && !defined(__MINGW64__))
+ /* Older GCC and Mingw-w64 (both GCC and Clang) do not */
+ /* support SetUnhandledExceptionFilter() properly on x64. */
+# define MPROTECT_VDB
+# endif
+# endif
+# endif /* X86_64 */
+
+# ifdef ARC
+# define CPP_WORDSZ 32
+# define MACH_TYPE "ARC"
+# define ALIGNMENT 4
+# define CACHE_LINE_SIZE 64
+# ifdef LINUX
+ extern int __data_start[] __attribute__((__weak__));
+# define DATASTART ((ptr_t)__data_start)
+# endif
+# endif /* ARC */
+
+# ifdef HEXAGON
+# define CPP_WORDSZ 32
+# define MACH_TYPE "HEXAGON"
+# define ALIGNMENT 4
+# ifdef LINUX
+# if !defined(REDIRECT_MALLOC)
+# define MPROTECT_VDB
+# endif
+# if defined(__GLIBC__)
+# define SEARCH_FOR_DATA_START
+# elif !defined(CPPCHECK)
+# error Unknown Hexagon libc configuration
+# endif
+# endif
+# endif /* HEXAGON */
+
+# ifdef TILEPRO
+# define CPP_WORDSZ 32
+# define MACH_TYPE "TILEPro"
+# define ALIGNMENT 4
+# define PREFETCH(x) __insn_prefetch(x)
+# define CACHE_LINE_SIZE 64
+# ifdef LINUX
+ extern int __data_start[];
+# define DATASTART ((ptr_t)__data_start)
+# endif
+# endif /* TILEPRO */
+
+# ifdef TILEGX
+# define CPP_WORDSZ (__SIZEOF_POINTER__ * 8)
+# define MACH_TYPE "TILE-Gx"
+# define ALIGNMENT __SIZEOF_POINTER__
+# if CPP_WORDSZ < 64
+# define CLEAR_DOUBLE(x) (*(long long *)(x) = 0)
+# endif
+# define PREFETCH(x) __insn_prefetch_l1(x)
+# define CACHE_LINE_SIZE 64
+# ifdef LINUX
+ extern int __data_start[];
+# define DATASTART ((ptr_t)__data_start)
+# endif
+# endif /* TILEGX */
+
+# ifdef RISCV
+# define MACH_TYPE "RISC-V"
+# define CPP_WORDSZ __riscv_xlen /* 32 or 64 */
+# define ALIGNMENT (CPP_WORDSZ/8)
+# ifdef FREEBSD
+ /* Nothing specific. */
+# endif
+# ifdef LINUX
+ extern int __data_start[] __attribute__((__weak__));
+# define DATASTART ((ptr_t)__data_start)
+# endif
+# ifdef NETBSD
+ /* Nothing specific. */
+# endif
+# ifdef OPENBSD
+ /* Nothing specific. */
+# endif
+# endif /* RISCV */
+
+#if defined(__GLIBC__) && !defined(DONT_USE_LIBC_PRIVATES)
+ /* Use glibc's stack-end marker. */
+# define USE_LIBC_PRIVATES
+#endif
+
+#ifdef NO_RETRY_GET_THREAD_CONTEXT
+# undef RETRY_GET_THREAD_CONTEXT
+#endif
+
+#if defined(LINUX_STACKBOTTOM) && defined(NO_PROC_STAT) \
+ && !defined(USE_LIBC_PRIVATES)
+ /* This combination will fail, since we have no way to get */
+ /* the stack bottom. Use HEURISTIC2 instead. */
+# undef LINUX_STACKBOTTOM
+# define HEURISTIC2
+ /* This may still fail on some architectures like IA64. */
+ /* We tried ... */
+#endif
+
+#if defined(USE_MMAP_ANON) && !defined(USE_MMAP)
+# define USE_MMAP 1
+#elif (defined(LINUX) || defined(OPENBSD)) && defined(USE_MMAP)
+ /* The kernel may do a somewhat better job merging mappings etc. */
+ /* with anonymous mappings. */
+# define USE_MMAP_ANON
+#endif
+
+#if defined(GC_LINUX_THREADS) && defined(REDIRECT_MALLOC) \
+ && !defined(USE_PROC_FOR_LIBRARIES)
+ /* Nptl allocates thread stacks with mmap, which is fine. But it */
+ /* keeps a cache of thread stacks. Thread stacks contain the */
+ /* thread control blocks. These in turn contain a pointer to */
+ /* (sizeof (void *) from the beginning of) the dtv for thread-local */
+ /* storage, which is calloc allocated. If we don't scan the cached */
+ /* thread stacks, we appear to lose the dtv. This tends to */
+ /* result in something that looks like a bogus dtv count, which */
+ /* tends to result in a memset call on a block that is way too */
+ /* large. Sometimes we're lucky and the process just dies ... */
+ /* There seems to be a similar issue with some other memory */
+ /* allocated by the dynamic loader. */
+ /* This should be avoidable by either: */
+ /* - Defining USE_PROC_FOR_LIBRARIES here. */
+ /* That performs very poorly, precisely because we end up */
+ /* scanning cached stacks. */
+ /* - Have calloc look at its callers. */
+ /* In spite of the fact that it is gross and disgusting. */
+ /* In fact neither seems to suffice, probably in part because */
+ /* even with USE_PROC_FOR_LIBRARIES, we don't scan parts of stack */
+ /* segments that appear to be out of bounds. Thus we actually */
+ /* do both, which seems to yield the best results. */
+# define USE_PROC_FOR_LIBRARIES
+#endif
+
+#ifndef STACK_GROWS_UP
+# define STACK_GROWS_DOWN
+#endif
+
+#ifndef CPP_WORDSZ
+# define CPP_WORDSZ 32
+#endif
+
+#ifndef OS_TYPE
+# define OS_TYPE ""
+#endif
+
+#ifndef DATAEND
+# if !defined(CPPCHECK)
+ extern int end[];
+# endif
+# define DATAEND ((ptr_t)(end))
+#endif
+
+/* Workaround for Android NDK clang 3.5+ (as of NDK r10e) which does */
+/* not provide correct _end symbol. Unfortunately, alternate __end__ */
+/* symbol is provided only by NDK "bfd" linker. */
+#if defined(HOST_ANDROID) && defined(__clang__) \
+ && !defined(BROKEN_UUENDUU_SYM)
+# undef DATAEND
+# pragma weak __end__
+ extern int __end__[];
+# define DATAEND (__end__ != 0 ? (ptr_t)__end__ : (ptr_t)_end)
+#endif
+
+#if defined(SOLARIS) || defined(DRSNX) || defined(UTS4)
+ /* OS has SVR4 generic features. */
+ /* Probably others also qualify. */
+# define SVR4
+#endif
+
+#if (defined(HOST_ANDROID) || defined(HOST_TIZEN) \
+ || (defined(LINUX) && defined(SPARC))) \
+ && !defined(GETPAGESIZE)
+ EXTERN_C_END
+# include <unistd.h>
+ EXTERN_C_BEGIN
+# define GETPAGESIZE() (unsigned)sysconf(_SC_PAGESIZE)
+#endif
+
+#ifndef GETPAGESIZE
+# if defined(AIX) || defined(IRIX5) || defined(LINUX) || defined(SOLARIS) \
+ || defined(NETBSD) || defined(FREEBSD) || defined(OPENBSD) \
+ || defined(HPUX)
+ EXTERN_C_END
+# include <unistd.h>
+ EXTERN_C_BEGIN
+# endif
+# define GETPAGESIZE() (unsigned)getpagesize()
+#endif
+
+#if defined(HOST_ANDROID) && !(__ANDROID_API__ >= 23) \
+ && ((defined(MIPS) && (CPP_WORDSZ == 32)) \
+ || defined(ARM32) || defined(I386) /* but not x32 */)
+ /* tkill() exists only on arm32/mips(32)/x86. */
+ /* NDK r11+ deprecates tkill() but keeps it for Mono clients. */
+# define USE_TKILL_ON_ANDROID
+#endif
+
+#if defined(MPROTECT_VDB) && defined(__GLIBC__) \
+ && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 2))
+# error glibc too old?
+#endif
+
+#if defined(SOLARIS) || defined(DRSNX)
+ /* OS has SOLARIS style semi-undocumented interface */
+ /* to dynamic loader. */
+# define SOLARISDL
+ /* OS has SOLARIS style signal handlers. */
+# define SUNOS5SIGS
+#endif
+
+#if defined(HPUX)
+# define SUNOS5SIGS
+#endif
+
+#if defined(FREEBSD) && (defined(__DragonFly__) || __FreeBSD__ >= 4 \
+ || __FreeBSD_kernel__ >= 4 || defined(__GLIBC__))
+# define SUNOS5SIGS
+#endif
+
+#if !defined(GC_EXPLICIT_SIGNALS_UNBLOCK) && defined(SUNOS5SIGS) \
+ && !defined(GC_NO_PTHREAD_SIGMASK)
+# define GC_EXPLICIT_SIGNALS_UNBLOCK
+#endif
+
+#if !defined(NO_SIGNALS_UNBLOCK_IN_MAIN) && defined(GC_NO_PTHREAD_SIGMASK)
+# define NO_SIGNALS_UNBLOCK_IN_MAIN
+#endif
+
+#if defined(PARALLEL_MARK) && defined(GC_PTHREADS) \
+ && !defined(GC_PTHREADS_PARAMARK) && !defined(__MINGW32__)
+ /* Use pthread-based parallel mark implementation. */
+ /* Except for MinGW 32/64 to workaround a deadlock in */
+ /* winpthreads-3.0b internals. */
+# define GC_PTHREADS_PARAMARK
+#endif
+
+#if !defined(NO_MARKER_SPECIAL_SIGMASK) \
+ && (defined(NACL) || defined(GC_WIN32_PTHREADS) \
+ || (defined(GC_PTHREADS_PARAMARK) && defined(GC_WIN32_THREADS)) \
+ || defined(GC_NO_PTHREAD_SIGMASK))
+ /* Either there is no pthread_sigmask(), or GC marker thread cannot */
+ /* steal and drop user signal calls. */
+# define NO_MARKER_SPECIAL_SIGMASK
+#endif
+
+#ifdef GC_NETBSD_THREADS
+# define SIGRTMIN 33
+# define SIGRTMAX 63
+ /* It seems to be necessary to wait until threads have restarted. */
+ /* But it is unclear why that is the case. */
+# define GC_NETBSD_THREADS_WORKAROUND
+#endif
+
+#ifdef GC_OPENBSD_THREADS
+ EXTERN_C_END
+# include <sys/param.h>
+ EXTERN_C_BEGIN
+ /* Prior to 5.2 release, OpenBSD had user threads and required */
+ /* special handling. */
+# if OpenBSD < 201211
+# define GC_OPENBSD_UTHREADS 1
+# endif
+#endif /* GC_OPENBSD_THREADS */
+
+#if defined(SVR4) || defined(LINUX) || defined(IRIX5) || defined(HPUX) \
+ || defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD) \
+ || defined(DGUX) || defined(BSD) || defined(HAIKU) || defined(HURD) \
+ || defined(AIX) || defined(DARWIN) || defined(OSF1)
+# define UNIX_LIKE /* Basic Unix-like system calls work. */
+#endif
+
+#if defined(CPPCHECK)
+# undef CPP_WORDSZ
+# define CPP_WORDSZ (__SIZEOF_POINTER__ * 8)
+#elif CPP_WORDSZ != 32 && CPP_WORDSZ != 64
+# error Bad word size
+#endif
+
+#if !defined(ALIGNMENT) && !defined(CPPCHECK)
+# error Undefined ALIGNMENT
+#endif
+
+#ifdef PCR
+# undef DYNAMIC_LOADING
+# undef STACKBOTTOM
+# undef HEURISTIC1
+# undef HEURISTIC2
+# undef PROC_VDB
+# undef MPROTECT_VDB
+# define PCR_VDB
+#endif
+
+#if !defined(STACKBOTTOM) && (defined(ECOS) || defined(NOSYS)) \
+ && !defined(CPPCHECK)
+# error Undefined STACKBOTTOM
+#endif
+
+#ifdef IGNORE_DYNAMIC_LOADING
+# undef DYNAMIC_LOADING
+#endif
+
+#if defined(SMALL_CONFIG) && !defined(GC_DISABLE_INCREMENTAL)
+ /* Presumably not worth the space it takes. */
+# define GC_DISABLE_INCREMENTAL
+#endif
+
+#if (defined(MSWIN32) || defined(MSWINCE)) && !defined(USE_WINALLOC)
+ /* USE_WINALLOC is only an option for Cygwin. */
+# define USE_WINALLOC 1
+#endif
+
+#ifdef USE_WINALLOC
+# undef USE_MMAP
+#endif
+
+#if defined(DARWIN) || defined(FREEBSD) || defined(HAIKU) \
+ || defined(IRIX5) || defined(LINUX) || defined(NETBSD) \
+ || defined(OPENBSD) || defined(SOLARIS) \
+ || ((defined(CYGWIN32) || defined(USE_MMAP) || defined(USE_MUNMAP)) \
+ && !defined(USE_WINALLOC))
+ /* Try both sbrk and mmap, in that order. */
+# define MMAP_SUPPORTED
+#endif
+
+/* Xbox One (DURANGO) may not need to be this aggressive, but the */
+/* default is likely too lax under heavy allocation pressure. */
+/* The platform does not have a virtual paging system, so it does not */
+/* have a large virtual address space that a standard x64 platform has. */
+#if defined(USE_MUNMAP) && !defined(MUNMAP_THRESHOLD) \
+ && (defined(SN_TARGET_PS3) \
+ || defined(SN_TARGET_PSP2) || defined(MSWIN_XBOX1))
+# define MUNMAP_THRESHOLD 2
+#endif
+
+#if defined(GC_DISABLE_INCREMENTAL) || defined(DEFAULT_VDB)
+# undef GWW_VDB
+# undef MPROTECT_VDB
+# undef PCR_VDB
+# undef PROC_VDB
+# undef SOFT_VDB
+#endif
+
+#ifdef NO_GWW_VDB
+# undef GWW_VDB
+#endif
+
+#ifdef NO_MPROTECT_VDB
+# undef MPROTECT_VDB
+#endif
+
+#ifdef NO_SOFT_VDB
+# undef SOFT_VDB
+#endif
+
+#if defined(SOFT_VDB) && defined(SOFT_VDB_LINUX_VER_STATIC_CHECK)
+ EXTERN_C_END
+# include <linux/version.h> /* for LINUX_VERSION[_CODE] */
+ EXTERN_C_BEGIN
+# if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0)
+ /* Not reliable in kernels prior to v3.18. */
+# undef SOFT_VDB
+# endif
+#endif /* SOFT_VDB */
+
+#ifdef GC_DISABLE_INCREMENTAL
+# undef CHECKSUMS
+#endif
+
+#ifdef USE_GLOBAL_ALLOC
+ /* Cannot pass MEM_WRITE_WATCH to GlobalAlloc(). */
+# undef GWW_VDB
+#endif
+
+#if defined(BASE_ATOMIC_OPS_EMULATED)
+ /* GC_write_fault_handler() cannot use lock-based atomic primitives */
+ /* as this could lead to a deadlock. */
+# undef MPROTECT_VDB
+#endif
+
+#if defined(USE_PROC_FOR_LIBRARIES) && defined(GC_LINUX_THREADS)
+ /* Incremental GC based on mprotect is incompatible with /proc roots. */
+# undef MPROTECT_VDB
+#endif
+
+#if defined(MPROTECT_VDB) && defined(GC_PREFER_MPROTECT_VDB)
+ /* Choose MPROTECT_VDB manually (if multiple strategies available). */
+# undef PCR_VDB
+# undef PROC_VDB
+ /* GWW_VDB, SOFT_VDB are handled in os_dep.c. */
+#endif
+
+#ifdef PROC_VDB
+ /* Mutually exclusive VDB implementations (for now). */
+# undef MPROTECT_VDB
+ /* For a test purpose only. */
+# undef SOFT_VDB
+#endif
+
+#if defined(MPROTECT_VDB) && !defined(MSWIN32) && !defined(MSWINCE)
+ EXTERN_C_END
+# include <signal.h> /* for SA_SIGINFO, SIGBUS */
+ EXTERN_C_BEGIN
+#endif
+
+#if defined(SIGBUS) && !defined(HAVE_SIGBUS) && !defined(CPPCHECK)
+# define HAVE_SIGBUS
+#endif
+
+#ifndef SA_SIGINFO
+# define NO_SA_SIGACTION
+#endif
+
+#if (defined(NO_SA_SIGACTION) || defined(GC_NO_SIGSETJMP)) \
+ && defined(MPROTECT_VDB) && !defined(DARWIN) \
+ && !defined(MSWIN32) && !defined(MSWINCE)
+# undef MPROTECT_VDB
+#endif
+
+#if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB) \
+ && !defined(GWW_VDB) && !defined(SOFT_VDB) && !defined(DEFAULT_VDB) \
+ && !defined(GC_DISABLE_INCREMENTAL)
+# define DEFAULT_VDB
+#endif
+
+#if !defined(PROC_VDB) && !defined(SOFT_VDB) \
+ && !defined(NO_VDB_FOR_STATIC_ROOTS)
+ /* Cannot determine whether a static root page is dirty? */
+# define NO_VDB_FOR_STATIC_ROOTS
+#endif
+
+#if defined(MPROTECT_VDB) && !defined(DONT_COUNT_PROTECTED_REGIONS) \
+ && !defined(COUNT_PROTECTED_REGIONS) \
+ && (defined(LINUX) || defined(__DragonFly__))
+# define COUNT_PROTECTED_REGIONS
+#endif
+
+#if (defined(COUNT_PROTECTED_REGIONS) || defined(COUNT_UNMAPPED_REGIONS)) \
+ && !defined(GC_UNMAPPED_REGIONS_SOFT_LIMIT)
+ /* The default limit of vm.max_map_count on Linux is ~65530. */
+ /* There is approximately one mapped region to every protected or */
+ /* unmapped region. Therefore if we aim to use up to half of */
+ /* vm.max_map_count for the GC (leaving half for the rest of the */
+ /* process) then the number of such regions should be one quarter */
+ /* of vm.max_map_count. */
+# if defined(__DragonFly__)
+# define GC_UNMAPPED_REGIONS_SOFT_LIMIT (1000000 / 4)
+# else
+# define GC_UNMAPPED_REGIONS_SOFT_LIMIT 16384
+# endif
+#endif
+
+#if ((defined(UNIX_LIKE) && (defined(DARWIN) || defined(HAIKU) \
+ || defined(HURD) || defined(OPENBSD) \
+ || defined(ARM32) \
+ || defined(AVR32) || defined(MIPS) \
+ || defined(NIOS2) || defined(OR1K))) \
+ || (defined(LINUX) && !defined(__gnu_linux__)) \
+ || (defined(RTEMS) && defined(I386)) || defined(HOST_ANDROID)) \
+ && !defined(NO_GETCONTEXT)
+# define NO_GETCONTEXT 1
+#endif
+
+#ifndef PREFETCH
+# if GC_GNUC_PREREQ(3, 0) && !defined(NO_PREFETCH)
+# define PREFETCH(x) __builtin_prefetch((x), 0, 0)
+# else
+# define PREFETCH(x) (void)0
+# endif
+#endif
+
+#ifndef GC_PREFETCH_FOR_WRITE
+# if GC_GNUC_PREREQ(3, 0) && !defined(GC_NO_PREFETCH_FOR_WRITE)
+# define GC_PREFETCH_FOR_WRITE(x) __builtin_prefetch((x), 1)
+# else
+# define GC_PREFETCH_FOR_WRITE(x) (void)0
+# endif
+#endif
+
+#ifndef CACHE_LINE_SIZE
+# define CACHE_LINE_SIZE 32 /* Wild guess */
+#endif
+
+#ifndef STATIC
+# ifdef GC_ASSERTIONS
+# define STATIC /* ignore to aid debugging (or profiling) */
+# else
+# define STATIC static
+# endif
+#endif
+
+#if defined(LINUX) && (defined(USE_PROC_FOR_LIBRARIES) || defined(IA64) \
+ || !defined(SMALL_CONFIG))
+# define NEED_PROC_MAPS
+#endif
+
+#if defined(LINUX) || defined(HURD) || defined(__GLIBC__)
+# define REGISTER_LIBRARIES_EARLY
+ /* We sometimes use dl_iterate_phdr, which may acquire an internal */
+ /* lock. This isn't safe after the world has stopped. So we must */
+ /* call GC_register_dynamic_libraries before stopping the world. */
+ /* For performance reasons, this may be beneficial on other */
+ /* platforms as well, though it should be avoided on Windows. */
+#endif /* LINUX */
+
+#if defined(SEARCH_FOR_DATA_START)
+ extern ptr_t GC_data_start;
+# define DATASTART GC_data_start
+#endif
+
+#ifndef HEAP_START
+# define HEAP_START ((ptr_t)0)
+#endif
+
+#ifndef CLEAR_DOUBLE
+# define CLEAR_DOUBLE(x) (((word*)(x))[0] = 0, ((word*)(x))[1] = 0)
+#endif
+
+#if defined(GC_LINUX_THREADS) && defined(REDIRECT_MALLOC) \
+ && !defined(INCLUDE_LINUX_THREAD_DESCR)
+ /* Will not work, since libc and the dynamic loader use thread */
+ /* locals, sometimes as the only reference. */
+# define INCLUDE_LINUX_THREAD_DESCR
+#endif
+
+#if !defined(CPPCHECK)
+# if defined(GC_IRIX_THREADS) && !defined(IRIX5)
+# error Inconsistent configuration
+# endif
+# if defined(GC_LINUX_THREADS) && !defined(LINUX) && !defined(NACL)
+# error Inconsistent configuration
+# endif
+# if defined(GC_NETBSD_THREADS) && !defined(NETBSD)
+# error Inconsistent configuration
+# endif
+# if defined(GC_FREEBSD_THREADS) && !defined(FREEBSD)
+# error Inconsistent configuration
+# endif
+# if defined(GC_SOLARIS_THREADS) && !defined(SOLARIS)
+# error Inconsistent configuration
+# endif
+# if defined(GC_HPUX_THREADS) && !defined(HPUX)
+# error Inconsistent configuration
+# endif
+# if defined(GC_AIX_THREADS) && !defined(_AIX)
+# error Inconsistent configuration
+# endif
+# if defined(GC_WIN32_THREADS) && !defined(CYGWIN32) && !defined(MSWIN32) \
+ && !defined(MSWINCE) && !defined(MSWIN_XBOX1)
+# error Inconsistent configuration
+# endif
+# if defined(GC_WIN32_PTHREADS) && defined(CYGWIN32)
+# error Inconsistent configuration
+# endif
+#endif /* !CPPCHECK */
+
+#if defined(PCR) || defined(GC_WIN32_THREADS) || defined(GC_PTHREADS) \
+ || ((defined(NN_PLATFORM_CTR) || defined(NINTENDO_SWITCH) \
+ || defined(SN_TARGET_PS3) \
+ || defined(SN_TARGET_PSP2)) && defined(GC_THREADS))
+# define THREADS
+#endif
+
+#if defined(PARALLEL_MARK) && !defined(THREADS) && !defined(CPPCHECK)
+# error Invalid config: PARALLEL_MARK requires GC_THREADS
+#endif
+
+#if defined(GWW_VDB) && !defined(USE_WINALLOC) && !defined(CPPCHECK)
+# error Invalid config: GWW_VDB requires USE_WINALLOC
+#endif
+
+#if (defined(MSWIN32) || defined(MSWINCE) \
+ || (defined(USE_PROC_FOR_LIBRARIES) && defined(THREADS))) \
+ && !defined(NO_CRT) && !defined(NO_WRAP_MARK_SOME)
+ /* Under rare conditions, we may end up marking from nonexistent */
+ /* memory. Hence we need to be prepared to recover by running */
+ /* GC_mark_some with a suitable handler in place. */
+ /* TODO: Should we also define it for Cygwin? */
+# define WRAP_MARK_SOME
+#endif
+
+#if defined(PARALLEL_MARK) && !defined(DEFAULT_STACK_MAYBE_SMALL) \
+ && (defined(HPUX) || defined(GC_DGUX386_THREADS) \
+ || defined(NO_GETCONTEXT) /* e.g. musl */)
+ /* TODO: Test default stack size in configure. */
+# define DEFAULT_STACK_MAYBE_SMALL
+#endif
+
+#ifdef PARALLEL_MARK
+ /* The minimum stack size for a marker thread. */
+# define MIN_STACK_SIZE (8 * HBLKSIZE * sizeof(word))
+#endif
+
+#if defined(HOST_ANDROID) && !defined(THREADS) \
+ && !defined(USE_GET_STACKBASE_FOR_MAIN)
+ /* Always use pthread_attr_getstack on Android ("-lpthread" option is */
+ /* not needed to be specified manually) since GC_linux_main_stack_base */
+ /* causes app crash if invoked inside Dalvik VM. */
+# define USE_GET_STACKBASE_FOR_MAIN
+#endif
+
+/* Outline pthread primitives to use in GC_get_[main_]stack_base. */
+#if ((defined(FREEBSD) && defined(__GLIBC__)) /* kFreeBSD */ \
+ || defined(LINUX) || defined(NETBSD)) \
+ && !defined(NO_PTHREAD_GETATTR_NP)
+# define HAVE_PTHREAD_GETATTR_NP 1
+#elif defined(FREEBSD) && !defined(__GLIBC__) \
+ && !defined(NO_PTHREAD_ATTR_GET_NP)
+# define HAVE_PTHREAD_NP_H 1 /* requires include pthread_np.h */
+# define HAVE_PTHREAD_ATTR_GET_NP 1
+#endif
+
+#if defined(GC_PTHREADS) && !defined(E2K) && !defined(IA64) \
+ && (!defined(DARWIN) || defined(DARWIN_DONT_PARSE_STACK)) \
+ && !defined(SN_TARGET_PSP2) && !defined(REDIRECT_MALLOC)
+ /* Note: unimplemented in case of redirection of malloc() because */
+ /* the client-provided function might call some pthreads primitive */
+ /* which, in turn, may use malloc() internally. */
+# define STACKPTR_CORRECTOR_AVAILABLE
+#endif
+
+#if defined(UNIX_LIKE) && defined(THREADS) && !defined(NO_CANCEL_SAFE) \
+ && !defined(HOST_ANDROID)
+ /* Make the code cancellation-safe. This basically means that we */
+ /* ensure that cancellation requests are ignored while we are in */
+ /* the collector. This applies only to Posix deferred cancellation; */
+ /* we don't handle Posix asynchronous cancellation. */
+ /* Note that this only works if pthread_setcancelstate is */
+ /* async-signal-safe, at least in the absence of asynchronous */
+ /* cancellation. This appears to be true for the glibc version, */
+ /* though it is not documented. Without that assumption, there */
+ /* seems to be no way to safely wait in a signal handler, which */
+ /* we need to do for thread suspension. */
+ /* Also note that little other code appears to be cancellation-safe. */
+ /* Hence it may make sense to turn this off for performance. */
+# define CANCEL_SAFE
+#endif
+
+#ifdef CANCEL_SAFE
+# define IF_CANCEL(x) x
+#else
+# define IF_CANCEL(x) /* empty */
+#endif
+
+#if !defined(CAN_HANDLE_FORK) && !defined(NO_HANDLE_FORK) \
+ && !defined(HAVE_NO_FORK) \
+ && ((defined(GC_PTHREADS) && !defined(NACL) \
+ && !defined(GC_WIN32_PTHREADS) && !defined(USE_WINALLOC)) \
+ || (defined(DARWIN) && defined(MPROTECT_VDB) /* && !THREADS */) \
+ || (defined(HANDLE_FORK) && defined(GC_PTHREADS)))
+ /* Attempts (where supported and requested) to make GC_malloc work in */
+ /* a child process fork'ed from a multi-threaded parent. */
+# define CAN_HANDLE_FORK
+#endif
+
+/* Workaround "failed to create new win32 semaphore" Cygwin fatal error */
+/* during semaphores fixup-after-fork. */
+#if defined(CYGWIN32) && defined(GC_WIN32_THREADS) \
+ && defined(CAN_HANDLE_FORK) && !defined(EMULATE_PTHREAD_SEMAPHORE) \
+ && !defined(CYGWIN_SEM_FIXUP_AFTER_FORK_BUG_FIXED)
+# define EMULATE_PTHREAD_SEMAPHORE
+#endif
+
+#if defined(CAN_HANDLE_FORK) && !defined(CAN_CALL_ATFORK) \
+ && !defined(GC_NO_CAN_CALL_ATFORK) && !defined(HOST_TIZEN) \
+ && !defined(HURD) && (!defined(HOST_ANDROID) || __ANDROID_API__ >= 21)
+ /* Have working pthread_atfork(). */
+# define CAN_CALL_ATFORK
+#endif
+
+#if !defined(CAN_HANDLE_FORK) && !defined(HAVE_NO_FORK) \
+ && !(defined(CYGWIN32) || defined(SOLARIS) || defined(UNIX_LIKE))
+# define HAVE_NO_FORK
+#endif
+
+#if !defined(USE_MARK_BITS) && !defined(USE_MARK_BYTES) \
+ && defined(PARALLEL_MARK)
+ /* Minimize compare-and-swap usage. */
+# define USE_MARK_BYTES
+#endif
+
+#if (defined(MSWINCE) && !defined(__CEGCC__) || defined(MSWINRT_FLAVOR)) \
+ && !defined(NO_GETENV)
+# define NO_GETENV
+#endif
+
+#if (defined(NO_GETENV) || defined(MSWINCE)) && !defined(NO_GETENV_WIN32)
+# define NO_GETENV_WIN32
+#endif
+
+#if !defined(MSGBOX_ON_ERROR) && !defined(NO_MSGBOX_ON_ERROR) \
+ && !defined(SMALL_CONFIG) && defined(MSWIN32) \
+ && !defined(MSWINRT_FLAVOR) && !defined(MSWIN_XBOX1)
+ /* Show a Windows message box with "OK" button on a GC fatal error. */
+ /* Client application is terminated once the user clicks the button. */
+# define MSGBOX_ON_ERROR
+#endif
+
+#ifndef STRTOULL
+# if defined(_WIN64) && !defined(__GNUC__)
+# define STRTOULL _strtoui64
+# elif defined(_LLP64) || defined(__LLP64__) || defined(_WIN64)
+# define STRTOULL strtoull
+# else
+ /* strtoul() fits since sizeof(long) >= sizeof(word). */
+# define STRTOULL strtoul
+# endif
+#endif /* !STRTOULL */
+
+#ifndef GC_WORD_C
+# if defined(_WIN64) && !defined(__GNUC__)
+# define GC_WORD_C(val) val##ui64
+# elif defined(_LLP64) || defined(__LLP64__) || defined(_WIN64)
+# define GC_WORD_C(val) val##ULL
+# else
+# define GC_WORD_C(val) ((word)val##UL)
+# endif
+#endif /* !GC_WORD_C */
+
+#if defined(__has_feature)
+ /* __has_feature() is supported. */
+# if __has_feature(address_sanitizer) && !defined(ADDRESS_SANITIZER)
+# define ADDRESS_SANITIZER
+# endif
+# if __has_feature(memory_sanitizer) && !defined(MEMORY_SANITIZER)
+# define MEMORY_SANITIZER
+# endif
+# if __has_feature(thread_sanitizer) && !defined(THREAD_SANITIZER)
+# define THREAD_SANITIZER
+# endif
+#else
+# ifdef __SANITIZE_ADDRESS__
+ /* GCC v4.8+ */
+# define ADDRESS_SANITIZER
+# endif
+#endif /* !__has_feature */
+
+#if defined(SPARC)
+# define ASM_CLEAR_CODE /* Stack clearing is crucial, and we */
+ /* include assembly code to do it well. */
+#endif
+
+/* Can we save call chain in objects for debugging? */
+/* SET NFRAMES (# of saved frames) and NARGS (#of args for each */
+/* frame) to reasonable values for the platform. */
+/* Set SAVE_CALL_CHAIN if we can. SAVE_CALL_COUNT can be specified */
+/* at build time, though we feel free to adjust it slightly. */
+/* Define NEED_CALLINFO if we either save the call stack or */
+/* GC_ADD_CALLER is defined. */
+/* GC_CAN_SAVE_CALL_STACKS is set in gc.h. */
+#if defined(SPARC)
+# define CAN_SAVE_CALL_ARGS
+#endif
+#if (defined(I386) || defined(X86_64)) \
+ && (defined(LINUX) || defined(__GLIBC__))
+ /* SAVE_CALL_CHAIN is supported if the code is compiled to save */
+ /* frame pointers by default, i.e. no -fomit-frame-pointer flag. */
+# define CAN_SAVE_CALL_ARGS
+#endif
+
+#if defined(SAVE_CALL_COUNT) && !defined(GC_ADD_CALLER) \
+ && defined(GC_CAN_SAVE_CALL_STACKS)
+# define SAVE_CALL_CHAIN
+#endif
+#ifdef SAVE_CALL_CHAIN
+# if defined(SAVE_CALL_NARGS) && defined(CAN_SAVE_CALL_ARGS)
+# define NARGS SAVE_CALL_NARGS
+# else
+# define NARGS 0 /* Number of arguments to save for each call. */
+# endif
+#endif
+#ifdef SAVE_CALL_CHAIN
+# if !defined(SAVE_CALL_COUNT) || defined(CPPCHECK)
+# define NFRAMES 6 /* Number of frames to save. Even for */
+ /* alignment reasons. */
+# else
+# define NFRAMES ((SAVE_CALL_COUNT + 1) & ~1)
+# endif
+# define NEED_CALLINFO
+#endif /* SAVE_CALL_CHAIN */
+#ifdef GC_ADD_CALLER
+# define NFRAMES 1
+# define NARGS 0
+# define NEED_CALLINFO
+#endif
+
+#if (defined(FREEBSD) || (defined(DARWIN) && !defined(_POSIX_C_SOURCE)) \
+ || (defined(SOLARIS) && (!defined(_XOPEN_SOURCE) \
+ || defined(__EXTENSIONS__))) \
+ || defined(LINUX)) && !defined(HAVE_DLADDR)
+# define HAVE_DLADDR 1
+#endif
+
+#if defined(MAKE_BACK_GRAPH) && !defined(DBG_HDRS_ALL)
+# define DBG_HDRS_ALL 1
+#endif
+
+#if defined(POINTER_MASK) && !defined(POINTER_SHIFT)
+# define POINTER_SHIFT 0
+#endif
+
+#if defined(POINTER_SHIFT) && !defined(POINTER_MASK)
+# define POINTER_MASK ((word)(signed_word)(-1))
+#endif
+
+#if !defined(FIXUP_POINTER) && defined(POINTER_MASK)
+# define FIXUP_POINTER(p) (p = ((p) & POINTER_MASK) << POINTER_SHIFT)
+#endif
+
+#if defined(FIXUP_POINTER)
+# define NEED_FIXUP_POINTER
+#else
+# define FIXUP_POINTER(p)
+#endif
+
+#if !defined(MARK_BIT_PER_GRANULE) && !defined(MARK_BIT_PER_OBJ)
+# define MARK_BIT_PER_GRANULE /* Usually faster */
+#endif
+
+/* Some static sanity tests. */
+#if !defined(CPPCHECK)
+# if defined(MARK_BIT_PER_GRANULE) && defined(MARK_BIT_PER_OBJ)
+# error Define only one of MARK_BIT_PER_GRANULE and MARK_BIT_PER_OBJ
+# endif
+# if defined(STACK_GROWS_UP) && defined(STACK_GROWS_DOWN)
+# error Only one of STACK_GROWS_UP and STACK_GROWS_DOWN should be defined
+# endif
+# if !defined(STACK_GROWS_UP) && !defined(STACK_GROWS_DOWN)
+# error One of STACK_GROWS_UP and STACK_GROWS_DOWN should be defined
+# endif
+# if defined(REDIRECT_MALLOC) && defined(THREADS) && !defined(LINUX) \
+ && !defined(REDIRECT_MALLOC_IN_HEADER)
+ /* May work on other platforms (e.g. Darwin) provided the client */
+ /* ensures all the client threads are registered with the GC, */
+ /* e.g. by using the preprocessor-based interception of the thread */
+ /* primitives (i.e., define GC_THREADS and include gc.h from all */
+ /* the client files those are using pthread_create and friends). */
+# endif
+#endif /* !CPPCHECK */
+
+#ifdef GC_PRIVATE_H
+ /* This relies on some type definitions from gc_priv.h, from */
+ /* where it's normally included. */
+ /* */
+ /* How to get heap memory from the OS: */
+ /* Note that sbrk()-like allocation is preferred, since it */
+ /* usually makes it possible to merge consecutively allocated */
+ /* chunks. It also avoids unintended recursion with */
+ /* REDIRECT_MALLOC macro defined. */
+ /* GET_MEM() argument should be of size_t type and have */
+ /* no side-effect. GET_MEM() returns HBLKSIZE-aligned chunk; */
+ /* 0 is taken to mean failure. */
+ /* In case of MMAP_SUPPORTED, the argument must also be */
+ /* a multiple of a physical page size. */
+ /* GET_MEM is currently not assumed to retrieve 0 filled space, */
+ /* though we should perhaps take advantage of the case in which */
+ /* does. */
+ struct hblk; /* See gc_priv.h. */
+# if defined(PCR)
+ char * real_malloc(size_t bytes);
+# define GET_MEM(bytes) HBLKPTR(real_malloc(SIZET_SAT_ADD(bytes, \
+ GC_page_size)) \
+ + GC_page_size-1)
+# elif defined(OS2)
+ void * os2_alloc(size_t bytes);
+# define GET_MEM(bytes) HBLKPTR((ptr_t)os2_alloc( \
+ SIZET_SAT_ADD(bytes, \
+ GC_page_size)) \
+ + GC_page_size-1)
+# elif defined(NEXT) || defined(DOS4GW) || defined(NONSTOP) \
+ || (defined(AMIGA) && !defined(GC_AMIGA_FASTALLOC)) \
+ || (defined(SOLARIS) && !defined(USE_MMAP)) || defined(RTEMS) \
+ || defined(__CC_ARM)
+# define GET_MEM(bytes) HBLKPTR((size_t)calloc(1, \
+ SIZET_SAT_ADD(bytes, \
+ GC_page_size)) \
+ + GC_page_size - 1)
+# elif defined(MSWIN_XBOX1)
+ ptr_t GC_durango_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk *)GC_durango_get_mem(bytes)
+# elif defined(MSWIN32) || defined(CYGWIN32)
+ ptr_t GC_win32_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk *)GC_win32_get_mem(bytes)
+# elif defined(MACOS)
+# if defined(USE_TEMPORARY_MEMORY)
+ Ptr GC_MacTemporaryNewPtr(size_t size, Boolean clearMemory);
+# define GET_MEM(bytes) HBLKPTR(GC_MacTemporaryNewPtr( \
+ SIZET_SAT_ADD(bytes, \
+ GC_page_size), true) \
+ + GC_page_size-1)
+# else
+# define GET_MEM(bytes) HBLKPTR(NewPtrClear(SIZET_SAT_ADD(bytes, \
+ GC_page_size)) \
+ + GC_page_size-1)
+# endif
+# elif defined(MSWINCE)
+ ptr_t GC_wince_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk *)GC_wince_get_mem(bytes)
+# elif defined(AMIGA) && defined(GC_AMIGA_FASTALLOC)
+ void *GC_amiga_get_mem(size_t bytes);
+# define GET_MEM(bytes) HBLKPTR((size_t)GC_amiga_get_mem( \
+ SIZET_SAT_ADD(bytes, \
+ GC_page_size)) \
+ + GC_page_size-1)
+# elif defined(PLATFORM_GETMEM)
+ void *platform_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk*)platform_get_mem(bytes)
+# elif defined(SN_TARGET_PS3)
+ void *ps3_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk*)ps3_get_mem(bytes)
+# elif defined(SN_TARGET_PSP2)
+ void *psp2_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk*)psp2_get_mem(bytes)
+# elif defined(NINTENDO_SWITCH)
+ void *switch_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk*)switch_get_mem(bytes)
+# elif defined(HAIKU)
+ ptr_t GC_haiku_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk*)GC_haiku_get_mem(bytes)
+# elif defined(EMSCRIPTEN_TINY)
+ void *emmalloc_memalign(size_t alignment, size_t size);
+# define GET_MEM(bytes) (struct hblk*)emmalloc_memalign(GC_page_size, bytes)
+# else
+ ptr_t GC_unix_get_mem(size_t bytes);
+# define GET_MEM(bytes) (struct hblk *)GC_unix_get_mem(bytes)
+# endif
+#endif /* GC_PRIVATE_H */
+
+EXTERN_C_END
+
+#endif /* GCCONFIG_H */
diff --git a/graphics/asymptote/gc/include/private/msvc_dbg.h b/graphics/asymptote/gc/include/private/msvc_dbg.h
new file mode 100644
index 0000000000..10dd1035c3
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/msvc_dbg.h
@@ -0,0 +1,70 @@
+/*
+ Copyright (c) 2004-2005 Andrei Polushin
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION 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 GC_MSVC_DBG_H
+#define GC_MSVC_DBG_H
+
+#include <stdlib.h>
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#if !MSVC_DBG_DLL
+#define MSVC_DBG_EXPORT
+#elif MSVC_DBG_BUILD
+#define MSVC_DBG_EXPORT __declspec(dllexport)
+#else
+#define MSVC_DBG_EXPORT __declspec(dllimport)
+#endif
+
+#ifndef MAX_SYM_NAME
+#define MAX_SYM_NAME 2000
+#endif
+
+typedef void* HANDLE;
+typedef struct _CONTEXT CONTEXT;
+
+MSVC_DBG_EXPORT size_t GetStackFrames(size_t skip, void* frames[], size_t maxFrames);
+MSVC_DBG_EXPORT size_t GetStackFramesFromContext(HANDLE hProcess, HANDLE hThread, CONTEXT* context, size_t skip, void* frames[], size_t maxFrames);
+
+MSVC_DBG_EXPORT size_t GetModuleNameFromAddress(void* address, char* moduleName, size_t size);
+MSVC_DBG_EXPORT size_t GetModuleNameFromStack(size_t skip, char* moduleName, size_t size);
+
+MSVC_DBG_EXPORT size_t GetSymbolNameFromAddress(void* address, char* symbolName, size_t size, size_t* offsetBytes);
+MSVC_DBG_EXPORT size_t GetSymbolNameFromStack(size_t skip, char* symbolName, size_t size, size_t* offsetBytes);
+
+MSVC_DBG_EXPORT size_t GetFileLineFromAddress(void* address, char* fileName, size_t size, size_t* lineNumber, size_t* offsetBytes);
+MSVC_DBG_EXPORT size_t GetFileLineFromStack(size_t skip, char* fileName, size_t size, size_t* lineNumber, size_t* offsetBytes);
+
+MSVC_DBG_EXPORT size_t GetDescriptionFromAddress(void* address, const char* format, char* description, size_t size);
+MSVC_DBG_EXPORT size_t GetDescriptionFromStack(void*const frames[], size_t count, const char* format, char* description[], size_t size);
+
+/* Compatibility with <execinfo.h> */
+MSVC_DBG_EXPORT int backtrace(void* addresses[], int count);
+MSVC_DBG_EXPORT char** backtrace_symbols(void*const addresses[], int count);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* GC_MSVC_DBG_H */
diff --git a/graphics/asymptote/gc/include/private/pthread_stop_world.h b/graphics/asymptote/gc/include/private/pthread_stop_world.h
new file mode 100644
index 0000000000..ae322fb400
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/pthread_stop_world.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2009 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_PTHREAD_STOP_WORLD_H
+#define GC_PTHREAD_STOP_WORLD_H
+
+EXTERN_C_BEGIN
+
+struct thread_stop_info {
+# if !defined(GC_OPENBSD_UTHREADS) && !defined(NACL) \
+ && !defined(PLATFORM_STOP_WORLD) && !defined(SN_TARGET_PSP2)
+ volatile AO_t last_stop_count;
+ /* The value of GC_stop_count when the thread */
+ /* last successfully handled a suspend signal. */
+# ifdef GC_ENABLE_SUSPEND_THREAD
+ volatile AO_t ext_suspend_cnt;
+ /* An odd value means thread was suspended */
+ /* externally. Incremented on every call of */
+ /* GC_suspend_thread() and GC_resume_thread(). */
+ /* Updated with the GC lock held, but could be */
+ /* read from a signal handler. */
+# endif
+# endif
+
+ ptr_t stack_ptr; /* Valid only when stopped. */
+
+# ifdef NACL
+ /* Grab NACL_GC_REG_STORAGE_SIZE pointers off the stack when */
+ /* going into a syscall. 20 is more than we need, but it's an */
+ /* overestimate in case the instrumented function uses any callee */
+ /* saved registers, they may be pushed to the stack much earlier. */
+ /* Also, on x64 'push' puts 8 bytes on the stack even though */
+ /* our pointers are 4 bytes. */
+# ifdef ARM32
+ /* Space for r4-r8, r10-r12, r14. */
+# define NACL_GC_REG_STORAGE_SIZE 9
+# else
+# define NACL_GC_REG_STORAGE_SIZE 20
+# endif
+ ptr_t reg_storage[NACL_GC_REG_STORAGE_SIZE];
+# elif defined(PLATFORM_HAVE_GC_REG_STORAGE_SIZE)
+ word registers[PLATFORM_GC_REG_STORAGE_SIZE]; /* used externally */
+# endif
+};
+
+GC_INNER void GC_stop_init(void);
+
+EXTERN_C_END
+
+#endif
diff --git a/graphics/asymptote/gc/include/private/pthread_support.h b/graphics/asymptote/gc/include/private/pthread_support.h
new file mode 100644
index 0000000000..fa8f2636c4
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/pthread_support.h
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2009 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef GC_PTHREAD_SUPPORT_H
+#define GC_PTHREAD_SUPPORT_H
+
+#include "private/gc_priv.h"
+
+#if defined(GC_PTHREADS) && !defined(GC_WIN32_THREADS)
+
+#if defined(GC_DARWIN_THREADS)
+# include "private/darwin_stop_world.h"
+#else
+# include "private/pthread_stop_world.h"
+#endif
+
+#ifdef THREAD_LOCAL_ALLOC
+# include "thread_local_alloc.h"
+#endif
+
+#ifdef THREAD_SANITIZER
+# include "dbg_mlc.h" /* for oh type */
+#endif
+
+EXTERN_C_BEGIN
+
+/* We use the allocation lock to protect thread-related data structures. */
+
+/* The set of all known threads. We intercept thread creation and */
+/* joins. */
+/* Protected by allocation/GC lock. */
+/* Some of this should be declared volatile, but that's inconsistent */
+/* with some library routine declarations. */
+typedef struct GC_Thread_Rep {
+# ifdef THREAD_SANITIZER
+ char dummy[sizeof(oh)]; /* A dummy field to avoid TSan false */
+ /* positive about the race between */
+ /* GC_has_other_debug_info and */
+ /* GC_suspend_handler_inner (which */
+ /* sets stop_info.stack_ptr). */
+# endif
+
+ struct GC_Thread_Rep * next; /* More recently allocated threads */
+ /* with a given pthread id come */
+ /* first. (All but the first are */
+ /* guaranteed to be dead, but we may */
+ /* not yet have registered the join.) */
+ pthread_t id;
+# ifdef USE_TKILL_ON_ANDROID
+ pid_t kernel_id;
+# endif
+ /* Extra bookkeeping information the stopping code uses */
+ struct thread_stop_info stop_info;
+
+ unsigned char flags; /* Protected by GC lock. */
+# define FINISHED 1 /* Thread has exited. */
+# define DETACHED 2 /* Thread is treated as detached. */
+ /* Thread may really be detached, or */
+ /* it may have been explicitly */
+ /* registered, in which case we can */
+ /* deallocate its GC_Thread_Rep once */
+ /* it unregisters itself, since it */
+ /* may not return a GC pointer. */
+# define MAIN_THREAD 4 /* True for the original thread only. */
+# define DISABLED_GC 0x10 /* Collections are disabled while the */
+ /* thread is exiting. */
+
+ unsigned char thread_blocked;
+ /* Protected by GC lock. */
+ /* Treated as a boolean value. If set, */
+ /* thread will acquire GC lock before */
+ /* doing any pointer manipulations, and */
+ /* has set its SP value. Thus it does */
+ /* not need to be sent a signal to stop */
+ /* it. */
+
+# ifndef GC_NO_FINALIZATION
+ unsigned short finalizer_skipped;
+ unsigned char finalizer_nested;
+ /* Used by GC_check_finalizer_nested() */
+ /* to minimize the level of recursion */
+ /* when a client finalizer allocates */
+ /* memory (initially both are 0). */
+# endif
+
+ ptr_t stack_end; /* Cold end of the stack (except for */
+ /* main thread). */
+ ptr_t altstack; /* The start of the alt-stack if there */
+ /* is one, NULL otherwise. */
+ word altstack_size; /* The size of the alt-stack if exists. */
+ ptr_t stack; /* The start and size of the normal */
+ /* stack (set by GC_register_altstack). */
+ word stack_size;
+# if defined(GC_DARWIN_THREADS) && !defined(DARWIN_DONT_PARSE_STACK)
+ ptr_t topOfStack; /* Result of GC_FindTopOfStack(0); */
+ /* valid only if the thread is blocked; */
+ /* non-NULL value means already set. */
+# endif
+# if defined(E2K) || defined(IA64)
+ ptr_t backing_store_end; /* Note: may reference data in GC heap */
+ ptr_t backing_store_ptr;
+# endif
+
+ struct GC_traced_stack_sect_s *traced_stack_sect;
+ /* Points to the "frame" data held in stack by */
+ /* the innermost GC_call_with_gc_active() of */
+ /* this thread. May be NULL. */
+
+ void * status; /* The value returned from the thread. */
+ /* Used only to avoid premature */
+ /* reclamation of any data it might */
+ /* reference. */
+ /* This is unfortunately also the */
+ /* reason we need to intercept join */
+ /* and detach. */
+
+# ifdef THREAD_LOCAL_ALLOC
+ struct thread_local_freelists tlfs GC_ATTR_WORD_ALIGNED;
+# endif
+} * GC_thread;
+
+#ifndef THREAD_TABLE_SZ
+# define THREAD_TABLE_SZ 256 /* Power of 2 (for speed). */
+#endif
+
+#if CPP_WORDSZ == 64
+# define THREAD_TABLE_INDEX(id) \
+ (int)(((((NUMERIC_THREAD_ID(id) >> 8) ^ NUMERIC_THREAD_ID(id)) >> 16) \
+ ^ ((NUMERIC_THREAD_ID(id) >> 8) ^ NUMERIC_THREAD_ID(id))) \
+ % THREAD_TABLE_SZ)
+#else
+# define THREAD_TABLE_INDEX(id) \
+ (int)(((NUMERIC_THREAD_ID(id) >> 16) \
+ ^ (NUMERIC_THREAD_ID(id) >> 8) \
+ ^ NUMERIC_THREAD_ID(id)) % THREAD_TABLE_SZ)
+#endif
+
+GC_EXTERN volatile GC_thread GC_threads[THREAD_TABLE_SZ];
+
+GC_EXTERN GC_bool GC_thr_initialized;
+
+GC_INNER GC_thread GC_lookup_thread(pthread_t id);
+
+#ifdef NACL
+ GC_EXTERN __thread GC_thread GC_nacl_gc_thread_self;
+ GC_INNER void GC_nacl_initialize_gc_thread(void);
+ GC_INNER void GC_nacl_shutdown_gc_thread(void);
+#endif
+
+#ifdef GC_EXPLICIT_SIGNALS_UNBLOCK
+ GC_INNER void GC_unblock_gc_signals(void);
+#endif
+
+#if defined(GC_ENABLE_SUSPEND_THREAD) && !defined(GC_DARWIN_THREADS) \
+ && !defined(GC_OPENBSD_UTHREADS) && !defined(NACL) \
+ && !defined(PLATFORM_STOP_WORLD) && !defined(SN_TARGET_PSP2)
+ GC_INNER void GC_suspend_self_inner(GC_thread me, word suspend_cnt);
+
+ GC_INNER void GC_suspend_self_blocked(ptr_t thread_me, void *context);
+ /* Wrapper over GC_suspend_self_inner. */
+#endif
+
+#ifdef GC_PTHREAD_START_STANDALONE
+# define GC_INNER_PTHRSTART /* empty */
+#else
+# define GC_INNER_PTHRSTART GC_INNER
+#endif
+
+GC_INNER_PTHRSTART void * GC_CALLBACK GC_inner_start_routine(
+ struct GC_stack_base *sb, void *arg);
+
+GC_INNER_PTHRSTART GC_thread GC_start_rtn_prepare_thread(
+ void *(**pstart)(void *),
+ void **pstart_arg,
+ struct GC_stack_base *sb, void *arg);
+GC_INNER_PTHRSTART void GC_thread_exit_proc(void *);
+
+EXTERN_C_END
+
+#endif /* GC_PTHREADS && !GC_WIN32_THREADS */
+
+#endif /* GC_PTHREAD_SUPPORT_H */
diff --git a/graphics/asymptote/gc/include/private/specific.h b/graphics/asymptote/gc/include/private/specific.h
new file mode 100644
index 0000000000..3ed75647c4
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/specific.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * This is a reimplementation of a subset of the pthread_getspecific/setspecific
+ * interface. This appears to outperform the standard linuxthreads one
+ * by a significant margin.
+ * The major restriction is that each thread may only make a single
+ * pthread_setspecific call on a single key. (The current data structure
+ * doesn't really require that. The restriction should be easily removable.)
+ * We don't currently support the destruction functions, though that
+ * could be done.
+ * We also currently assume that only one pthread_setspecific call
+ * can be executed at a time, though that assumption would be easy to remove
+ * by adding a lock.
+ */
+
+#ifndef GC_SPECIFIC_H
+#define GC_SPECIFIC_H
+
+#include <errno.h>
+
+EXTERN_C_BEGIN
+
+/* Called during key creation or setspecific. */
+/* For the GC we already hold lock. */
+/* Currently allocated objects leak on thread exit. */
+/* That's hard to fix, but OK if we allocate garbage */
+/* collected memory. */
+#define MALLOC_CLEAR(n) GC_INTERNAL_MALLOC(n, NORMAL)
+
+#define TS_CACHE_SIZE 1024
+#define CACHE_HASH(n) ((((n) >> 8) ^ (n)) & (TS_CACHE_SIZE - 1))
+
+#define TS_HASH_SIZE 1024
+#define HASH(p) \
+ ((unsigned)((((word)(p)) >> 8) ^ (word)(p)) & (TS_HASH_SIZE - 1))
+
+#ifdef GC_ASSERTIONS
+ /* Thread-local storage is not guaranteed to be scanned by GC. */
+ /* We hide values stored in "specific" entries for a test purpose. */
+ typedef GC_hidden_pointer ts_entry_value_t;
+# define TS_HIDE_VALUE(p) GC_HIDE_POINTER(p)
+# define TS_REVEAL_PTR(p) GC_REVEAL_POINTER(p)
+#else
+ typedef void * ts_entry_value_t;
+# define TS_HIDE_VALUE(p) (p)
+# define TS_REVEAL_PTR(p) (p)
+#endif
+
+/* An entry describing a thread-specific value for a given thread. */
+/* All such accessible structures preserve the invariant that if either */
+/* thread is a valid pthread id or qtid is a valid "quick thread id" */
+/* for a thread, then value holds the corresponding thread specific */
+/* value. This invariant must be preserved at ALL times, since */
+/* asynchronous reads are allowed. */
+typedef struct thread_specific_entry {
+ volatile AO_t qtid; /* quick thread id, only for cache */
+ ts_entry_value_t value;
+ struct thread_specific_entry *next;
+ pthread_t thread;
+} tse;
+
+/* We represent each thread-specific datum as two tables. The first is */
+/* a cache, indexed by a "quick thread identifier". The "quick" thread */
+/* identifier is an easy to compute value, which is guaranteed to */
+/* determine the thread, though a thread may correspond to more than */
+/* one value. We typically use the address of a page in the stack. */
+/* The second is a hash table, indexed by pthread_self(). It is used */
+/* only as a backup. */
+
+/* Return the "quick thread id". Default version. Assumes page size, */
+/* or at least thread stack separation, is at least 4 KB. */
+/* Must be defined so that it never returns 0. (Page 0 can't really be */
+/* part of any stack, since that would make 0 a valid stack pointer.) */
+#define quick_thread_id() (((word)GC_approx_sp()) >> 12)
+
+#define INVALID_QTID ((word)0)
+#define INVALID_THREADID ((pthread_t)0)
+
+union ptse_ao_u {
+ tse *p;
+ volatile AO_t ao;
+};
+
+typedef struct thread_specific_data {
+ tse * volatile cache[TS_CACHE_SIZE];
+ /* A faster index to the hash table */
+ union ptse_ao_u hash[TS_HASH_SIZE];
+ pthread_mutex_t lock;
+} tsd;
+
+typedef tsd * GC_key_t;
+
+#define GC_key_create(key, d) GC_key_create_inner(key)
+GC_INNER int GC_key_create_inner(tsd ** key_ptr);
+GC_INNER int GC_setspecific(tsd * key, void * value);
+#define GC_remove_specific(key) \
+ GC_remove_specific_after_fork(key, pthread_self())
+GC_INNER void GC_remove_specific_after_fork(tsd * key, pthread_t t);
+
+/* An internal version of getspecific that assumes a cache miss. */
+GC_INNER void * GC_slow_getspecific(tsd * key, word qtid,
+ tse * volatile * cache_entry);
+
+/* GC_INLINE is defined in gc_priv.h. */
+GC_INLINE void * GC_getspecific(tsd * key)
+{
+ word qtid = quick_thread_id();
+ tse * volatile * entry_ptr = &key->cache[CACHE_HASH(qtid)];
+ tse * entry = *entry_ptr; /* Must be loaded only once. */
+
+ GC_ASSERT(qtid != INVALID_QTID);
+ if (EXPECT(entry -> qtid == qtid, TRUE)) {
+ GC_ASSERT(entry -> thread == pthread_self());
+ return TS_REVEAL_PTR(entry -> value);
+ }
+ return GC_slow_getspecific(key, qtid, entry_ptr);
+}
+
+EXTERN_C_END
+
+#endif /* GC_SPECIFIC_H */
diff --git a/graphics/asymptote/gc/include/private/thread_local_alloc.h b/graphics/asymptote/gc/include/private/thread_local_alloc.h
new file mode 100644
index 0000000000..de9b7ba9c2
--- /dev/null
+++ b/graphics/asymptote/gc/include/private/thread_local_alloc.h
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2000-2005 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* Included indirectly from a thread-library-specific file. */
+/* This is the interface for thread-local allocation, whose */
+/* implementation is mostly thread-library-independent. */
+/* Here we describe only the interface that needs to be known */
+/* and invoked from the thread support layer; the actual */
+/* implementation also exports GC_malloc and friends, which */
+/* are declared in gc.h. */
+
+#ifndef GC_THREAD_LOCAL_ALLOC_H
+#define GC_THREAD_LOCAL_ALLOC_H
+
+#include "private/gc_priv.h"
+
+#ifdef THREAD_LOCAL_ALLOC
+
+#include "gc_inline.h"
+
+#if defined(USE_HPUX_TLS)
+# error USE_HPUX_TLS macro was replaced by USE_COMPILER_TLS
+#endif
+
+#include <stdlib.h>
+
+EXTERN_C_BEGIN
+
+#if !defined(USE_PTHREAD_SPECIFIC) && !defined(USE_WIN32_SPECIFIC) \
+ && !defined(USE_WIN32_COMPILER_TLS) && !defined(USE_COMPILER_TLS) \
+ && !defined(USE_CUSTOM_SPECIFIC)
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+# if defined(CYGWIN32) && GC_GNUC_PREREQ(4, 0)
+# if defined(__clang__)
+ /* As of Cygwin clang3.5.2, thread-local storage is unsupported. */
+# define USE_PTHREAD_SPECIFIC
+# else
+# define USE_COMPILER_TLS
+# endif
+# elif defined(__GNUC__) || defined(MSWINCE)
+# define USE_WIN32_SPECIFIC
+# else
+# define USE_WIN32_COMPILER_TLS
+# endif /* !GNU */
+# elif (defined(LINUX) && !defined(ARM32) && !defined(AVR32) \
+ && GC_GNUC_PREREQ(3, 3) \
+ && !(defined(__clang__) && (defined(HOST_ANDROID) \
+ || (defined(AARCH64) && !GC_CLANG_PREREQ(8, 0))))) \
+ || ((defined(NETBSD) && __NetBSD_Version__ >= 600000000 /* 6.0 */ \
+ || defined(FREEBSD)) \
+ && (GC_GNUC_PREREQ(4, 4) || GC_CLANG_PREREQ(3, 9))) \
+ || (defined(HOST_ANDROID) && defined(ARM32) \
+ && (GC_GNUC_PREREQ(4, 6) || GC_CLANG_PREREQ_FULL(3, 8, 256229)))
+# define USE_COMPILER_TLS
+# elif defined(GC_DGUX386_THREADS) || defined(GC_OSF1_THREADS) \
+ || defined(GC_AIX_THREADS) || defined(GC_DARWIN_THREADS) \
+ || defined(GC_FREEBSD_THREADS) || defined(GC_NETBSD_THREADS) \
+ || defined(GC_LINUX_THREADS) || defined(GC_HAIKU_THREADS) \
+ || defined(GC_RTEMS_PTHREADS)
+# define USE_PTHREAD_SPECIFIC
+# elif defined(GC_HPUX_THREADS)
+# ifdef __GNUC__
+# define USE_PTHREAD_SPECIFIC
+ /* Empirically, as of gcc 3.3, USE_COMPILER_TLS doesn't work. */
+# else
+# define USE_COMPILER_TLS
+# endif
+# else
+# define USE_CUSTOM_SPECIFIC /* Use our own. */
+# endif
+#endif
+
+#ifndef THREAD_FREELISTS_KINDS
+# ifdef ENABLE_DISCLAIM
+# define THREAD_FREELISTS_KINDS (NORMAL+2)
+# else
+# define THREAD_FREELISTS_KINDS (NORMAL+1)
+# endif
+#endif /* !THREAD_FREELISTS_KINDS */
+
+/* One of these should be declared as the tlfs field in the */
+/* structure pointed to by a GC_thread. */
+typedef struct thread_local_freelists {
+ void * _freelists[THREAD_FREELISTS_KINDS][TINY_FREELISTS];
+# define ptrfree_freelists _freelists[PTRFREE]
+# define normal_freelists _freelists[NORMAL]
+ /* Note: Preserve *_freelists names for some clients. */
+# ifdef GC_GCJ_SUPPORT
+ void * gcj_freelists[TINY_FREELISTS];
+# define ERROR_FL ((void *)GC_WORD_MAX)
+ /* Value used for gcj_freelists[-1]; allocation is */
+ /* erroneous. */
+# endif
+ /* Free lists contain either a pointer or a small count */
+ /* reflecting the number of granules allocated at that */
+ /* size. */
+ /* 0 ==> thread-local allocation in use, free list */
+ /* empty. */
+ /* > 0, <= DIRECT_GRANULES ==> Using global allocation, */
+ /* too few objects of this size have been */
+ /* allocated by this thread. */
+ /* >= HBLKSIZE => pointer to nonempty free list. */
+ /* > DIRECT_GRANULES, < HBLKSIZE ==> transition to */
+ /* local alloc, equivalent to 0. */
+# define DIRECT_GRANULES (HBLKSIZE/GRANULE_BYTES)
+ /* Don't use local free lists for up to this much */
+ /* allocation. */
+} *GC_tlfs;
+
+#if defined(USE_PTHREAD_SPECIFIC)
+# define GC_getspecific pthread_getspecific
+# define GC_setspecific pthread_setspecific
+# define GC_key_create pthread_key_create
+# define GC_remove_specific(key) pthread_setspecific(key, NULL)
+ /* Explicitly delete the value to stop the TLS */
+ /* destructor from being called repeatedly. */
+# define GC_remove_specific_after_fork(key, t) (void)0
+ /* Should not need any action. */
+ typedef pthread_key_t GC_key_t;
+#elif defined(USE_COMPILER_TLS) || defined(USE_WIN32_COMPILER_TLS)
+# define GC_getspecific(x) (x)
+# define GC_setspecific(key, v) ((key) = (v), 0)
+# define GC_key_create(key, d) 0
+# define GC_remove_specific(key) /* No need for cleanup on exit. */
+# define GC_remove_specific_after_fork(key, t) (void)0
+ typedef void * GC_key_t;
+#elif defined(USE_WIN32_SPECIFIC)
+# define GC_getspecific TlsGetValue
+# define GC_setspecific(key, v) !TlsSetValue(key, v)
+ /* We assume 0 == success, msft does the opposite. */
+# ifndef TLS_OUT_OF_INDEXES
+ /* this is currently missing in WinCE */
+# define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
+# endif
+# define GC_key_create(key, d) \
+ ((d) != 0 || (*(key) = TlsAlloc()) == TLS_OUT_OF_INDEXES ? -1 : 0)
+# define GC_remove_specific(key) /* No need for cleanup on exit. */
+ /* Need TlsFree on process exit/detach? */
+# define GC_remove_specific_after_fork(key, t) (void)0
+ typedef DWORD GC_key_t;
+#elif defined(USE_CUSTOM_SPECIFIC)
+ EXTERN_C_END
+# include "private/specific.h"
+ EXTERN_C_BEGIN
+#else
+# error implement me
+#endif
+
+/* Each thread structure must be initialized. */
+/* This call must be made from the new thread. */
+/* Caller holds allocation lock. */
+GC_INNER void GC_init_thread_local(GC_tlfs p);
+
+/* Called when a thread is unregistered, or exits. */
+/* We hold the allocator lock. */
+GC_INNER void GC_destroy_thread_local(GC_tlfs p);
+
+/* The thread support layer must arrange to mark thread-local */
+/* free lists explicitly, since the link field is often */
+/* invisible to the marker. It knows how to find all threads; */
+/* we take care of an individual thread freelist structure. */
+GC_INNER void GC_mark_thread_local_fls_for(GC_tlfs p);
+
+#ifdef GC_ASSERTIONS
+ GC_bool GC_is_thread_tsd_valid(void *tsd);
+ void GC_check_tls_for(GC_tlfs p);
+# if defined(USE_CUSTOM_SPECIFIC)
+ void GC_check_tsd_marks(tsd *key);
+# endif
+#endif /* GC_ASSERTIONS */
+
+#ifndef GC_ATTR_TLS_FAST
+# define GC_ATTR_TLS_FAST /* empty */
+#endif
+
+extern
+#if defined(USE_COMPILER_TLS)
+ __thread GC_ATTR_TLS_FAST
+#elif defined(USE_WIN32_COMPILER_TLS)
+ __declspec(thread) GC_ATTR_TLS_FAST
+#endif
+ GC_key_t GC_thread_key;
+/* This is set up by the thread_local_alloc implementation. No need */
+/* for cleanup on thread exit. But the thread support layer makes sure */
+/* that GC_thread_key is traced, if necessary. */
+
+EXTERN_C_END
+
+#endif /* THREAD_LOCAL_ALLOC */
+
+#endif /* GC_THREAD_LOCAL_ALLOC_H */
diff --git a/graphics/asymptote/gc/install-sh b/graphics/asymptote/gc/install-sh
new file mode 100755
index 0000000000..e046efdf0a
--- /dev/null
+++ b/graphics/asymptote/gc/install-sh
@@ -0,0 +1,541 @@
+#!/usr/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2020-11-14.01; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab=' '
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -p pass -p to $cpprog.
+ -s $stripprog installed files.
+ -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
+
+If -S is not specified, no backups are attempted.
+
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -p) cpprog="$cpprog -p";;
+
+ -s) stripcmd=$stripprog;;
+
+ -S) backupsuffix="$2"
+ shift;;
+
+ -t)
+ is_target_a_directory=always
+ dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
+
+ -T) is_target_a_directory=never;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+ if test -n "$dst_arg"; then
+ echo "$0: target directory not allowed when installing a directory." >&2
+ exit 1
+ fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call 'install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
+ if test ! -d "$dst_arg"; then
+ echo "$0: $dst_arg: Is not a directory." >&2
+ exit 1
+ fi
+ fi
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names problematic for 'test' and other utilities.
+ case $src in
+ -* | [=\(\)!]) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ # Don't chown directories that already exist.
+ if test $dstdir_status = 0; then
+ chowncmd=""
+ fi
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+ dst=$dst_arg
+
+ # If destination is a directory, append the input filename.
+ if test -d "$dst"; then
+ if test "$is_target_a_directory" = never; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dstbase=`basename "$src"`
+ case $dst in
+ */) dst=$dst$dstbase;;
+ *) dst=$dst/$dstbase;;
+ esac
+ dstdir_status=0
+ else
+ dstdir=`dirname "$dst"`
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ case $dstdir in
+ */) dstdirslash=$dstdir;;
+ *) dstdirslash=$dstdir/;;
+ esac
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ # The $RANDOM variable is not portable (e.g., dash). Use it
+ # here however when possible just to lower collision chance.
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+ trap '
+ ret=$?
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+ exit $ret
+ ' 0
+
+ # Because "mkdir -p" follows existing symlinks and we likely work
+ # directly in world-writeable /tmp, make sure that the '$tmpdir'
+ # directory is successfully created first before we actually test
+ # 'mkdir -p'.
+ if (umask $mkdir_umask &&
+ $mkdirprog $mkdir_mode "$tmpdir" &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ test_tmpdir="$tmpdir/a"
+ ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+ fi
+ trap '' 0;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ oIFS=$IFS
+ IFS=/
+ set -f
+ set fnord $dstdir
+ shift
+ set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=${dstdirslash}_inst.$$_
+ rmtmp=${dstdirslash}_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask &&
+ { test -z "$stripcmd" || {
+ # Create $dsttmp read-write so that cp doesn't create it read-only,
+ # which would cause strip to fail.
+ if test -z "$doit"; then
+ : >"$dsttmp" # No need to fork-exec 'touch'.
+ else
+ $doit touch "$dsttmp"
+ fi
+ }
+ } &&
+ $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+ set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ set +f &&
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # If $backupsuffix is set, and the file being installed
+ # already exists, attempt a backup. Don't worry if it fails,
+ # e.g., if mv doesn't support -f.
+ if test -n "$backupsuffix" && test -f "$dst"; then
+ $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+ fi
+
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/graphics/asymptote/gc/m4/gc_set_version.m4 b/graphics/asymptote/gc/m4/gc_set_version.m4
new file mode 100644
index 0000000000..465e4f0f9a
--- /dev/null
+++ b/graphics/asymptote/gc/m4/gc_set_version.m4
@@ -0,0 +1,40 @@
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+# GC_SET_VERSION
+# sets and AC_DEFINEs GC_VERSION_MAJOR, GC_VERSION_MINOR and GC_VERSION_MICRO
+# based on the contents of PACKAGE_VERSION; PACKAGE_VERSION must conform to
+# [0-9]+[.][0-9]+[.][0-9]+
+#
+AC_DEFUN([GC_SET_VERSION], [
+ AC_MSG_CHECKING(GC version numbers)
+ GC_VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\([[0-9]][[0-9]]*\)[[.]].*$/\1/g'`
+ GC_VERSION_MINOR=`echo $PACKAGE_VERSION | sed 's/^[[^.]]*[[.]]\([[0-9]][[0-9]]*\).*$/\1/g'`
+ GC_VERSION_MICRO=`echo $PACKAGE_VERSION | sed 's/^[[^.]]*[[.]][[^.]]*[[.]]\([[0-9]][[0-9]]*\)$/\1/g'`
+
+ if test :$GC_VERSION_MAJOR: = :: \
+ -o :$GC_VERSION_MINOR: = :: \
+ -o :$GC_VERSION_MICRO: = :: ;
+ then
+ AC_MSG_RESULT(invalid)
+ AC_MSG_ERROR([nonconforming PACKAGE_VERSION='$PACKAGE_VERSION'])
+ fi
+
+ AC_DEFINE_UNQUOTED([GC_VERSION_MAJOR], $GC_VERSION_MAJOR,
+ [The major version number of this GC release.])
+ AC_DEFINE_UNQUOTED([GC_VERSION_MINOR], $GC_VERSION_MINOR,
+ [The minor version number of this GC release.])
+ AC_DEFINE_UNQUOTED([GC_VERSION_MICRO], $GC_VERSION_MICRO,
+ [The micro version number of this GC release.])
+ AC_MSG_RESULT(major=$GC_VERSION_MAJOR minor=$GC_VERSION_MINOR \
+ micro=$GC_VERSION_MICRO)
+])
+
+sinclude(libtool.m4)
diff --git a/graphics/asymptote/gc/m4/libtool.m4 b/graphics/asymptote/gc/m4/libtool.m4
new file mode 100644
index 0000000000..e3adedad63
--- /dev/null
+++ b/graphics/asymptote/gc/m4/libtool.m4
@@ -0,0 +1,8403 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+# Copyright (C) 1996-2001, 2003-2019, 2021-2022 Free Software
+# Foundation, Inc.
+# Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+])
+
+# serial 59 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+ [m4_default([$3],
+ [m4_fatal([Libtool version $1 or higher is required],
+ 63)])],
+ [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+ *\ * | *\ *)
+ AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+ distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
+m4_defun([_LT_CC_BASENAME],
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_DECL_FILECMD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC and
+# ICC, which need '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ _LT_PATH_MAGIC
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from 'configure', and 'config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain=$ac_aux_dir/ltmain.sh
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the 'libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+ [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+ [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+ [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+ [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+ [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME. Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+ [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+ [m4_ifval([$1], [$1], [$2])])
+ lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+ m4_ifval([$4],
+ [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+ lt_dict_add_subkey([lt_decl_dict], [$2],
+ [tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+ [0], [m4_fatal([$0: too few arguments: $#])],
+ [1], [m4_fatal([$0: too few arguments: $#: $1])],
+ [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+ [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+ [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+ m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+ m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+ m4_if([$2], [],
+ m4_quote(lt_decl_varnames),
+ m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+ lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'. VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly. In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+# <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+ [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags='_LT_TAGS'dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+# # Some comment about what VAR is for.
+# visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+ [description])))[]dnl
+m4_pushdef([_libtool_name],
+ m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+ [0], [_libtool_name=[$]$1],
+ [1], [_libtool_name=$lt_[]$1],
+ [2], [_libtool_name=$lt_[]$1],
+ [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
+# script. Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+ m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+ [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+ [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'. Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+ dnl If the libtool generation code has been placed in $CONFIG_LT,
+ dnl instead of duplicating it all over again into config.status,
+ dnl then we will have config.status run $CONFIG_LT later, so it
+ dnl needs to know what name is stored there:
+ [AC_CONFIG_COMMANDS([libtool],
+ [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+ dnl If the libtool generation code is destined for config.status,
+ dnl expand the accumulated commands and init code now:
+ [AC_CONFIG_COMMANDS([libtool],
+ [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[[\\\\\\\`\\"\\\$]]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[[\\\\\\\`\\"\\\$]]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable. If COMMENT is supplied, it is inserted after the
+# '#!' sequence but before initialization text begins. After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script. The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+ echo
+ AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $[#]
+do
+ case $[1] in
+ --version | --v* | -V )
+ echo "$lt_cl_version"; exit 0 ;;
+ --help | --h* | -h )
+ echo "$lt_cl_help"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --quiet | --q* | --silent | --s* | -q )
+ lt_cl_silent=: ;;
+
+ -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try '$[0] --help' for more information.]) ;;
+
+ *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try '$[0] --help' for more information.]) ;;
+ esac
+ shift
+done
+
+if $lt_cl_silent; then
+ exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure. Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+ lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars. Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+ m4_if(_LT_TAG, [C], [
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+ _LT_PROG_LTMAIN
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ $SED '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+# autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+ [C], [_LT_LANG(C)],
+ [C++], [_LT_LANG(CXX)],
+ [Go], [_LT_LANG(GO)],
+ [Java], [_LT_LANG(GCJ)],
+ [Fortran 77], [_LT_LANG(F77)],
+ [Fortran], [_LT_LANG(FC)],
+ [Windows Resource], [_LT_LANG(RC)],
+ [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+ [_LT_LANG($1)],
+ [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+ [LT_SUPPORTED_TAG([$1])dnl
+ m4_append([_LT_TAGS], [$1 ])dnl
+ m4_define([_LT_LANG_]$1[_enabled], [])dnl
+ _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_GO. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC], [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+ if test -n "$ac_tool_prefix"; then
+ AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+ fi
+fi
+if test -z "$GOC"; then
+ AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [LT_LANG(CXX)],
+ [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+ [LT_LANG(F77)],
+ [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+ [LT_LANG(FC)],
+ [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+ [LT_LANG(GCJ)],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+ [LT_LANG(GCJ)],
+ [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+ [LT_LANG(GCJ)],
+ [m4_ifdef([AC_PROG_GCJ],
+ [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+ m4_ifdef([A][M_PROG_GCJ],
+ [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+ m4_ifdef([LT_PROG_GCJ],
+ [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+ [LT_LANG(GO)],
+ [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+ [LT_LANG(RC)],
+ [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+ case $host_os in
+ rhapsody* | darwin*)
+ AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+ AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+ AC_CHECK_TOOL([LIPO], [lipo], [:])
+ AC_CHECK_TOOL([OTOOL], [otool], [:])
+ AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+ _LT_DECL([], [DSYMUTIL], [1],
+ [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+ _LT_DECL([], [NMEDIT], [1],
+ [Tool to change global to local symbols on Mac OS X])
+ _LT_DECL([], [LIPO], [1],
+ [Tool to manipulate fat objects and archives on Mac OS X])
+ _LT_DECL([], [OTOOL], [1],
+ [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+ _LT_DECL([], [OTOOL64], [1],
+ [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+ AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+ [lt_cv_apple_cc_single_mod=no
+ if test -z "$LT_MULTI_MODULE"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi])
+
+ AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+ [lt_cv_ld_exported_symbols_list],
+ [lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+ [lt_cv_ld_exported_symbols_list=yes],
+ [lt_cv_ld_exported_symbols_list=no])
+ LDFLAGS=$save_LDFLAGS
+ ])
+
+ AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+ [lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+ echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+ $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+ echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+ $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+ ])
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ darwin*)
+ case $MACOSX_DEPLOYMENT_TARGET,$host in
+ 10.[[012]],*|,*powerpc*-darwin[[5-8]]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ *)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+ fi
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+ m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+ m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+ [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+ else
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+ fi
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ _LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ m4_if([$1], [CXX],
+[ if test yes != "$lt_cv_apple_cc_single_mod"; then
+ _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+ fi
+],[])
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+ lt_aix_libpath_sed='[
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }]'
+ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi],[])
+ if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
+ fi
+ ])
+ aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO "$*"
+}
+
+case $ECHO in
+ printf*) AC_MSG_RESULT([printf]) ;;
+ print*) AC_MSG_RESULT([print -r]) ;;
+ *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test "X`printf %s $ECHO`" = "X$ECHO" \
+ || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[m4_require([_LT_DECL_SED])dnl
+AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+ [Search for dependent libraries within DIR (or the compiler's sysroot
+ if not specified).])],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted. We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ AC_MSG_RESULT([$with_sysroot])
+ AC_MSG_ERROR([The sysroot must be an absolute path.])
+ ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and where our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+ [AS_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `$FILECMD conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE=32
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE=64
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ emul=elf
+ case `$FILECMD conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `$FILECMD conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `$FILECMD conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ case `$FILECMD conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_LANG_PUSH(C)
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+ AC_LANG_POP])
+ if test yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `$FILECMD conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks=$enable_libtool_lock
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+_LT_DECL([], [AR], [1], [The archiver])
+
+# Use ARFLAGS variable as AR's operation code to sync the variable naming with
+# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
+# higher priority because thats what people were doing historically (setting
+# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS
+# variable obsoleted/removed.
+
+test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
+lt_ar_flags=$AR_FLAGS
+_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)])
+
+# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override
+# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
+_LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}],
+ [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+ [lt_cv_ar_at_file=no
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+ [echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+ AC_TRY_EVAL([lt_ar_try])
+ if test 0 -eq "$ac_status"; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ AC_TRY_EVAL([lt_ar_try])
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+ ])
+ ])
+
+if test no = "$lt_cv_ar_at_file"; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+ [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+ [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+ [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+ [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ fi
+ $RM conftest*
+])
+
+if test yes = "[$]$2"; then
+ m4_if([$5], , :, [$5])
+else
+ m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $3"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&AS_MESSAGE_LOG_FD
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ else
+ $2=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+])
+
+if test yes = "[$]$2"; then
+ m4_if([$4], , :, [$4])
+else
+ m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[ ]]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+])
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+ AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+ [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test yes = "$cross_compiling"; then :
+ [$4]
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}]
+_LT_EOF
+ if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) $1 ;;
+ x$lt_dlneed_uscore) $2 ;;
+ x$lt_dlunknown|x*) $3 ;;
+ esac
+ else :
+ # compilation failed
+ $3
+ fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ])
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen=shl_load],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen=dlopen],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+ [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+ [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+ [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+ [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+ [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+ fi
+ fi
+ chmod u+w . 2>&AS_MESSAGE_LOG_FD
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+ [Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ AC_MSG_CHECKING([if we can lock with hard links])
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ AC_MSG_RESULT([$hard_links])
+ if test no = "$hard_links"; then
+ AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+ [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+ [Define to the sub-directory where libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+ test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+ test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+ test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
+ # Linking always hardcodes the temporary library directory.
+ _LT_TAGVAR(hardcode_action, $1)=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ _LT_TAGVAR(hardcode_action, $1)=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+ test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+ [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -z "$STRIP"; then
+ AC_MSG_RESULT([no])
+else
+ if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+ else
+ case $host_os in
+ darwin*)
+ # FIXME - insert some real tests, host_os isn't really good enough
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ AC_MSG_RESULT([yes])
+ ;;
+ freebsd*)
+ if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
+ fi
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+ [], [
+if test yes = "$GCC"; then
+ case $host_os in
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary...
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo = "/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+ if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[[4-9]]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[[01]] | aix4.[[01]].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a[(]lib.so.V[)]'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[[45]]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+m4_if([$1], [],[
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC and ICC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[[23]].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[[3-9]]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+ [lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+ [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+ [lt_cv_shlibpath_overrides_runpath=yes])])
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+ ])
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Add ABI-specific directories to the system library path.
+ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+ [Variables whose values should be saved in libtool wrapper scripts and
+ restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+ [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+ [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+ [[List of archive names. First name is the real one, the rest are links.
+ The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+ [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+ [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+ [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+ [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+ [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+ [[As "finish_cmds", except a single script fragment to be evaled but
+ not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+ [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+ [Compile-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+ [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+ [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program that can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] | ?:[\\/]*])
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word. This closes a longstanding sh security hole.
+ ac_dummy="m4_if([$2], , $PATH, [$2])"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$1"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac])
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ AC_MSG_RESULT($MAGIC_CMD)
+else
+ AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+ [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program that can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+ else
+ MAGIC_CMD=:
+ fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+ [AS_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+ [test no = "$withval" || with_gnu_ld=yes],
+ [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi])
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+ lt_cv_ld_reload_flag,
+ [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+ [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[[45]]*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='$FILECMD -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly* | midnightbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=$FILECMD
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[[3-9]]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+ [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+ [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+ [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+ [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi])
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+ AC_SUBST([DUMPBIN])
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+ [lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+ cat conftest.out >&AS_MESSAGE_LOG_FD
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+# -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
+ ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+ [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+ [lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*])
+if test yes != "$lt_cv_path_mainfest_tool"; then
+ MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+ test DEF = "`$SED -n dnl
+ -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace
+ -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments
+ -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl
+ -e q dnl Only consider the first "real" line
+ $1`" dnl
+])# _LT_DLL_DEF_P
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
+ AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, cos, LIBM=-lm)
+ ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test yes = "$GCC"; then
+ case $cc_basename in
+ nvcc*)
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+ esac
+
+ _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+ lt_cv_prog_compiler_rtti_exceptions,
+ [-fno-rtti -fno-exceptions], [],
+ [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+ [Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[[BCDT]]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[[ABCDGISTW]]'
+ ;;
+hpux*)
+ if test ia64 = "$host_cpu"; then
+ symcode='[[ABCDEGRST]]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[[BCDEGRST]]'
+ ;;
+osf*)
+ symcode='[[BCDEGQRST]]'
+ ;;
+solaris*)
+ symcode='[[BDRT]]'
+ ;;
+sco3.2v5*)
+ symcode='[[DT]]'
+ ;;
+sysv4.2uw2*)
+ symcode='[[DT]]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[[ABDT]]'
+ ;;
+sysv4)
+ symcode='[[DFNSTU]]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="$SED -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
+ # Also find C++ and __fastcall symbols from MSVC++ or ICC,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK ['"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx]"
+ else
+ lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT@&t@_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT@&t@_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS=conftstm.$ac_objext
+ CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+ if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test yes = "$pipe_works"; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ AC_MSG_RESULT(failed)
+else
+ AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+ [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+ [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+ [Transform the output of nm into a list of symbols to manually relocate])
+_LT_DECL([global_symbol_to_c_name_address],
+ [lt_cv_sys_global_symbol_to_c_name_address], [1],
+ [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+ [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+ [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+ [The name lister interface])
+_LT_DECL([], [nm_file_list_spec], [1],
+ [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+ # C++ specific cases for pic, static, wl, etc.
+ if test yes = "$GXX"; then
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ m4_if([$1], [GCJ], [],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ case $host_os in
+ os2*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)=
+ ;;
+ interix[[3-9]]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[[4-9]]*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ m4_if([$1], [GCJ], [],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+ if test ia64 != "$host_cpu"; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ fi
+ ;;
+ aCC*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ ecpc* )
+ # old Intel C++ for x86_64, which still supported -KPIC.
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ icpc* )
+ # Intel C++, used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+],
+[
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ m4_if([$1], [GCJ], [],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ case $host_os in
+ os2*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[[3-9]]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+ if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ m4_if([$1], [GCJ], [],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ case $host_os in
+ os2*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+ ;;
+ esac
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC (with -KPIC) is the default.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ # old Intel for x86_64, which still supported -KPIC.
+ ecc*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ ccc*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All Alpha code is PIC.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ *Intel*\ [[CF]]*Compiler*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ *Portland\ Group*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All OSF/1 code is PIC.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ rdos*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ solaris*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ unicos*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+
+ uts4*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *)
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+])
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+ ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+ [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+ [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+ [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+ [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+ [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+ "" | " "*) ;;
+ *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+ esac],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+ [Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+ [How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+ _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+ $lt_tmp_static_flag,
+ [],
+ [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+ [Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+ case $host_os in
+ aix[[4-9]]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
+ ;;
+ cygwin* | mingw* | cegcc*)
+ case $cc_basename in
+ cl* | icl*)
+ _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
+ *)
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+ ;;
+ esac
+ ;;
+ *)
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+], [
+ runpath_var=
+ _LT_TAGVAR(allow_undefined_flag, $1)=
+ _LT_TAGVAR(always_export_symbols, $1)=no
+ _LT_TAGVAR(archive_cmds, $1)=
+ _LT_TAGVAR(archive_expsym_cmds, $1)=
+ _LT_TAGVAR(compiler_needs_object, $1)=no
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(hardcode_automatic, $1)=no
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=
+ _LT_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_TAGVAR(inherit_rpath, $1)=no
+ _LT_TAGVAR(link_all_deplibs, $1)=unknown
+ _LT_TAGVAR(module_cmds, $1)=
+ _LT_TAGVAR(module_expsym_cmds, $1)=
+ _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+ _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+ _LT_TAGVAR(thread_safe_flag_spec, $1)=
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ _LT_TAGVAR(include_expsyms, $1)=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
+ _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ if test yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test yes = "$with_gnu_ld"; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+ *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test yes = "$lt_use_gnu_ld_interface"; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='$wl'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v | $SED -e 's/([[^)]]\+)\s\+//' 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[[3-9]]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test ia64 != "$host_cpu"; then
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)=''
+ ;;
+ m68k)
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=no
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ haiku*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ os2*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ shrext_cmds=.dll
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
+ ;;
+
+ interix[[3-9]]*)
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test linux-dietlibc = "$host_os"; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test no = "$tmp_diet"
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=
+ tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
+ xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ _LT_TAGVAR(compiler_needs_object, $1)=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*) # Sun C 5.9
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ _LT_TAGVAR(compiler_needs_object, $1)=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+ if test yes = "$supports_anon_versioning"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ tcc*)
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+ ;;
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+
+ if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
+ runpath_var=
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ _LT_TAGVAR(hardcode_direct, $1)=unsupported
+ fi
+ ;;
+
+ aix[[4-9]]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_TAGVAR(archive_cmds, $1)=''
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ _LT_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ _LT_SYS_MODULE_PATH_AIX([$1])
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
+ _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ _LT_SYS_MODULE_PATH_AIX([$1])
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ fi
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)=''
+ ;;
+ m68k)
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[[45]]*)
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++ or Intel C++ Compiler.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl* | icl*)
+ # Native MSVC or ICC
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+ _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC and ICC wrapper
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+ # FIXME: Should let the user specify the lib program.
+ _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ _LT_DARWIN_LINKER_FEATURES($1)
+ ;;
+
+ dgux*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly* | midnightbsd*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ hpux9*)
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ fi
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+ ;;
+
+ hpux10*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test no = "$with_gnu_ld"; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ m4_if($1, [], [
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ _LT_LINKER_OPTION([if $CC understands -b],
+ _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+ [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+ [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+ [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+ ;;
+ esac
+ fi
+ if test no = "$with_gnu_ld"; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+ [lt_cv_irix_exported_symbol],
+ [save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+ AC_LINK_IFELSE(
+ [AC_LANG_SOURCE(
+ [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+ [C++], [[int foo (void) { return 0; }]],
+ [Fortran 77], [[
+ subroutine foo
+ end]],
+ [Fortran], [[
+ subroutine foo
+ end]])])],
+ [lt_cv_irix_exported_symbol=yes],
+ [lt_cv_irix_exported_symbol=no])
+ LDFLAGS=$save_LDFLAGS])
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+ fi
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(inherit_rpath, $1)=yes
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ newsos6)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ fi
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ os2*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ shrext_cmds=.dll
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ fi
+ _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ else
+ _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ fi
+ _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ solaris*)
+ _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='$wl'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ else
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ sunos4*)
+ if test sequent = "$host_vendor"; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ ;;
+ motorola)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4.3*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+ _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+
+ if test sni = "$host_vendor"; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+ [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+ # Assume -lc should be added
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $_LT_TAGVAR(archive_cmds, $1) in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+ [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+ [$RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+ pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+ _LT_TAGVAR(allow_undefined_flag, $1)=
+ if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+ then
+ lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+ fi
+ _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+ ])
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+ [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+ [enable_shared_with_static_runtimes], [0],
+ [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+ [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+ [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+ [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+ [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+ [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+ [Commands used to build a loadable module if different from building
+ a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+ [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+ [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+ [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+ [Flag to hardcode $libdir into a binary during linking.
+ This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+ [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+ [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
+ DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+ [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
+ DIR into the resulting binary and the resulting library dependency is
+ "absolute", i.e impossible to change by setting $shlibpath_var if the
+ library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+ [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+ into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+ [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+ into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+ [Set to "yes" if building a shared library automatically hardcodes DIR
+ into the library and all subsequent libraries and executables linked
+ against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+ [Set to yes if linker adds runtime paths of dependent libraries
+ to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+ [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+ [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+ [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+ [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+ [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+ [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+ [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+ [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined. These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC=$CC
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+ _LT_COMPILER_NO_RTTI($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_SYS_DYNAMIC_LINKER($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+ LT_SYS_DLOPEN_SELF
+ _LT_CMD_STRIPLIB
+
+ # Report what library types will actually be built
+ AC_MSG_CHECKING([if libtool supports shared libraries])
+ AC_MSG_RESULT([$can_build_shared])
+
+ AC_MSG_CHECKING([whether to build shared libraries])
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[[4-9]]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ AC_MSG_RESULT([$enable_shared])
+
+ AC_MSG_CHECKING([whether to build static libraries])
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ AC_MSG_RESULT([$enable_static])
+
+ _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC=$lt_save_CC
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined. These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test no != "$CXX" &&
+ ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+ (test g++ != "$CXX"))); then
+ AC_PROG_CXXCPP
+else
+ _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="int some_variable = 0;"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+ _LT_TAG_COMPILER
+
+ # save warnings/boilerplate of simple test code
+ _LT_COMPILER_BOILERPLATE
+ _LT_LINKER_BOILERPLATE
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_CFLAGS=$CFLAGS
+ lt_save_LD=$LD
+ lt_save_GCC=$GCC
+ GCC=$GXX
+ lt_save_with_gnu_ld=$with_gnu_ld
+ lt_save_path_LD=$lt_cv_path_LD
+ if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+ else
+ $as_unset lt_cv_prog_gnu_ld
+ fi
+ if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+ else
+ $as_unset lt_cv_path_LD
+ fi
+ test -z "${LDCXX+set}" || LD=$LDCXX
+ CC=${CXX-"c++"}
+ CFLAGS=$CXXFLAGS
+ compiler=$CC
+ _LT_TAGVAR(compiler, $1)=$CC
+ _LT_CC_BASENAME([$compiler])
+
+ if test -n "$compiler"; then
+ # We don't want -fno-exception when compiling C++ code, so set the
+ # no_builtin_flag separately
+ if test yes = "$GXX"; then
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+ else
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+ fi
+
+ if test yes = "$GXX"; then
+ # Set up default GNU C++ configuration
+
+ LT_PATH_LD
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test yes = "$with_gnu_ld"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='$wl'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+ $GREP 'no-whole-archive' > /dev/null; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+ fi
+
+ # PORTME: fill in a description of your system's C++ link characteristics
+ AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aix[[4-9]]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_TAGVAR(archive_cmds, $1)=''
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+ ;;
+ esac
+
+ if test yes = "$GXX"; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ _LT_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag=$shared_flag' $wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to
+ # export.
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ # The "-G" linker flag allows undefined symbols.
+ _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
+ # Determine the default libpath from the value encoded in an empty
+ # executable.
+ _LT_SYS_MODULE_PATH_AIX([$1])
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
+ _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ _LT_SYS_MODULE_PATH_AIX([$1])
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ fi
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared
+ # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $GXX,$cc_basename in
+ ,cl* | no,cl* | ,icl* | no,icl*)
+ # Native MSVC or ICC
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ # Don't use ranlib
+ _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+ _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # g++
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=no
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+ _LT_DARWIN_LINKER_FEATURES($1)
+ ;;
+
+ os2*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ shrext_cmds=.dll
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ freebsd2.*)
+ # C++ shared libraries reported to be fairly broken before
+ # switch to ELF
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ freebsd-elf*)
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+
+ haiku*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ hpux9*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ hpux10*|hpux11*)
+ if test no = "$with_gnu_ld"; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ interix[[3-9]]*)
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+ fi
+ fi
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+ esac
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_TAGVAR(inherit_rpath, $1)=yes
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc* | ecpc* )
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ case `$CC -V` in
+ *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+ _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+ _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+ $RANLIB $oldlib'
+ _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 6 and above use weak symbols
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+ ;;
+ xl* | mpixl* | bgxl*)
+ # IBM XL 8.0 on PPC, with GNU ld
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ m88k*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+
+ *nto* | *qnx*)
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ _LT_TAGVAR(hardcode_direct, $1)=yes
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ fi
+ output_verbose_link_cmd=func_echo_all
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ case $host in
+ osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+ *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+ esac
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ case $host in
+ osf3*)
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ ;;
+ *)
+ _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+ $RM $lib.exp'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ ;;
+ esac
+
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+ case $host in
+ osf3*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ esac
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ psos*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+ _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
+ if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ else
+ # g++ 2.7 appears to require '-G' NOT '-shared' on this
+ # platform.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ fi
+
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+ _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
+ _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+ '"$_LT_TAGVAR(old_archive_cmds, $1)"
+ _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+ '"$_LT_TAGVAR(reload_cmds, $1)"
+ ;;
+ *)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+
+ AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+ test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
+
+ _LT_TAGVAR(GCC, $1)=$GXX
+ _LT_TAGVAR(LD, $1)=$LD
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ _LT_SYS_HIDDEN_LIBDEPS($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_SYS_DYNAMIC_LINKER($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+ fi # test -n "$compiler"
+
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+ LDCXX=$LD
+ LD=$lt_save_LD
+ GCC=$lt_save_GCC
+ with_gnu_ld=$lt_save_with_gnu_ld
+ lt_cv_path_LDCXX=$lt_cv_path_LD
+ lt_cv_path_LD=$lt_save_path_LD
+ lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+ case @S|@2 in
+ .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+ *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
+ esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library. It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+ subroutine foo
+ implicit none
+ integer*4 a
+ a=0
+ return
+ end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+ subroutine foo
+ implicit none
+ integer a
+ a=0
+ return
+ end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+ private int a;
+ public void bar (void) {
+ a = 0;
+ }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ for p in `eval "$output_verbose_link_cmd"`; do
+ case $prev$p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test x-L = "$p" ||
+ test x-R = "$p"; then
+ prev=$p
+ continue
+ fi
+
+ # Expand the sysroot to ease extracting the directories later.
+ if test -z "$prev"; then
+ case $p in
+ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+ esac
+ fi
+ case $p in
+ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+ esac
+ if test no = "$pre_test_object_deps_done"; then
+ case $prev in
+ -L | -R)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+ _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
+ else
+ _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+ _LT_TAGVAR(postdeps, $1)=$prev$p
+ else
+ _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
+ fi
+ fi
+ prev=
+ ;;
+
+ *.lto.$objext) ;; # Ignore GCC LTO objects
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test no = "$pre_test_object_deps_done"; then
+ if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+ _LT_TAGVAR(predep_objects, $1)=$p
+ else
+ _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+ fi
+ else
+ if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+ _LT_TAGVAR(postdep_objects, $1)=$p
+ else
+ _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ _LT_TAGVAR(predep_objects,$1)=
+ _LT_TAGVAR(postdep_objects,$1)=
+ _LT_TAGVAR(postdeps,$1)=
+ ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+ [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+ [Dependencies to place before and after the objects being linked to
+ create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+ [The library search path used internally by the compiler when linking
+ a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test no = "$F77"; then
+ _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_F77"; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="\
+ subroutine t
+ return
+ end
+"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code="\
+ program t
+ end
+"
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+ _LT_TAG_COMPILER
+
+ # save warnings/boilerplate of simple test code
+ _LT_COMPILER_BOILERPLATE
+ _LT_LINKER_BOILERPLATE
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_GCC=$GCC
+ lt_save_CFLAGS=$CFLAGS
+ CC=${F77-"f77"}
+ CFLAGS=$FFLAGS
+ compiler=$CC
+ _LT_TAGVAR(compiler, $1)=$CC
+ _LT_CC_BASENAME([$compiler])
+ GCC=$G77
+ if test -n "$compiler"; then
+ AC_MSG_CHECKING([if libtool supports shared libraries])
+ AC_MSG_RESULT([$can_build_shared])
+
+ AC_MSG_CHECKING([whether to build shared libraries])
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+ aix[[4-9]]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ AC_MSG_RESULT([$enable_shared])
+
+ AC_MSG_CHECKING([whether to build static libraries])
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ AC_MSG_RESULT([$enable_static])
+
+ _LT_TAGVAR(GCC, $1)=$G77
+ _LT_TAGVAR(LD, $1)=$LD
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_SYS_DYNAMIC_LINKER($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+ fi # test -n "$compiler"
+
+ GCC=$lt_save_GCC
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test no = "$FC"; then
+ _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_FC"; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="\
+ subroutine t
+ return
+ end
+"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code="\
+ program t
+ end
+"
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+ _LT_TAG_COMPILER
+
+ # save warnings/boilerplate of simple test code
+ _LT_COMPILER_BOILERPLATE
+ _LT_LINKER_BOILERPLATE
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_GCC=$GCC
+ lt_save_CFLAGS=$CFLAGS
+ CC=${FC-"f95"}
+ CFLAGS=$FCFLAGS
+ compiler=$CC
+ GCC=$ac_cv_fc_compiler_gnu
+
+ _LT_TAGVAR(compiler, $1)=$CC
+ _LT_CC_BASENAME([$compiler])
+
+ if test -n "$compiler"; then
+ AC_MSG_CHECKING([if libtool supports shared libraries])
+ AC_MSG_RESULT([$can_build_shared])
+
+ AC_MSG_CHECKING([whether to build shared libraries])
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+ aix[[4-9]]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ AC_MSG_RESULT([$enable_shared])
+
+ AC_MSG_CHECKING([whether to build static libraries])
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ AC_MSG_RESULT([$enable_static])
+
+ _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+ _LT_TAGVAR(LD, $1)=$LD
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ _LT_SYS_HIDDEN_LIBDEPS($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_SYS_DYNAMIC_LINKER($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+ fi # test -n "$compiler"
+
+ GCC=$lt_save_GCC
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_FC"
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+ _LT_COMPILER_NO_RTTI($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+ _LT_COMPILER_NO_RTTI($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=$lt_simple_compile_test_code
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+ :
+ _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+ [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+ [AC_CHECK_TOOL(GCJ, gcj,)
+ test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_FILECMD
+# ----------------
+# Check for a file(cmd) program that can be used to detect file type and magic
+m4_defun([_LT_DECL_FILECMD],
+[AC_CHECK_TOOL([FILECMD], [file], [:])
+_LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types])
+])# _LD_DECL_FILECMD
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible. Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+ [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_SED. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f "$lt_ac_sed" && continue
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test 10 -lt "$lt_ac_count" && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test "$lt_ac_count" -gt "$lt_ac_max"; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine what file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path). These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+ [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+ [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/graphics/asymptote/gc/m4/ltoptions.m4 b/graphics/asymptote/gc/m4/ltoptions.m4
new file mode 100644
index 0000000000..b0b5e9c212
--- /dev/null
+++ b/graphics/asymptote/gc/m4/ltoptions.m4
@@ -0,0 +1,437 @@
+# Helper functions for option handling. -*- Autoconf -*-
+#
+# Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2022 Free
+# Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 8 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it. Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+ _LT_MANGLE_DEFUN([$1], [$2]),
+ [m4_warning([Unknown $1 option '$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+ [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+ [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME. If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+ [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+ dnl
+ dnl Simply set some default values (i.e off) if boolean options were not
+ dnl specified:
+ _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+ ])
+ _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+ ])
+ dnl
+ dnl If no reference was made to various pairs of opposing options, then
+ dnl we run the default mode handler for the pair. For example, if neither
+ dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
+ dnl archives by default:
+ _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+ _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+ _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+ _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+ [_LT_ENABLE_FAST_INSTALL])
+ _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+ [_LT_WITH_AIX_SONAME([aix])])
+ ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS], [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+ [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+ [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac],
+ [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+ _LT_DECL([build_libtool_libs], [enable_shared], [0],
+ [Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+ [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+ [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac],
+ [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+ _LT_DECL([build_old_libs], [enable_static], [0],
+ [Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+ [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+ [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac],
+ [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+ [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+ AC_MSG_CHECKING([which variant of shared library versioning to provide])
+ AC_ARG_WITH([aix-soname],
+ [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+ [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+ [case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname],
+ [AC_CACHE_VAL([lt_cv_with_aix_soname],
+ [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+ with_aix_soname=$lt_cv_with_aix_soname])
+ AC_MSG_RESULT([$with_aix_soname])
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+ [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
+# LT_INIT options.
+# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+ [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac],
+ [pic_mode=m4_default([$1], [default])])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+ [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+ [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+ [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+ [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+ [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/graphics/asymptote/gc/m4/ltsugar.m4 b/graphics/asymptote/gc/m4/ltsugar.m4
new file mode 100644
index 0000000000..902508bd93
--- /dev/null
+++ b/graphics/asymptote/gc/m4/ltsugar.m4
@@ -0,0 +1,124 @@
+# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
+#
+# Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2022 Free Software
+# Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+ [$#], [2], [[$2]],
+ [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+ [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59, which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+ [$#], 1, [],
+ [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+ m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+ [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+ [m4_foreach([_Lt_suffix],
+ ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+ [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+ [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+ [lt_append([$1], [$2], [$3])$4],
+ [$5])],
+ [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+ m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+ m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+ [$5],
+ [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+ [lt_join(m4_quote(m4_default([$4], [[, ]])),
+ lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+ [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/graphics/asymptote/gc/m4/ltversion.m4 b/graphics/asymptote/gc/m4/ltversion.m4
new file mode 100644
index 0000000000..b155d0acec
--- /dev/null
+++ b/graphics/asymptote/gc/m4/ltversion.m4
@@ -0,0 +1,24 @@
+# ltversion.m4 -- version numbers -*- Autoconf -*-
+#
+# Copyright (C) 2004, 2011-2019, 2021-2022 Free Software Foundation,
+# Inc.
+# Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 4245 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.7])
+m4_define([LT_PACKAGE_REVISION], [2.4.7])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.7'
+macro_revision='2.4.7'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/graphics/asymptote/gc/m4/lt~obsolete.m4 b/graphics/asymptote/gc/m4/lt~obsolete.m4
new file mode 100644
index 0000000000..0f7a8759da
--- /dev/null
+++ b/graphics/asymptote/gc/m4/lt~obsolete.m4
@@ -0,0 +1,99 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
+#
+# Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2022 Free
+# Software Foundation, Inc.
+# Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else. This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
diff --git a/graphics/asymptote/gc/mach_dep.c b/graphics/asymptote/gc/mach_dep.c
new file mode 100644
index 0000000000..b51f4f661a
--- /dev/null
+++ b/graphics/asymptote/gc/mach_dep.c
@@ -0,0 +1,429 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+#if !defined(PLATFORM_MACH_DEP) && !defined(SN_TARGET_PSP2)
+
+#include <stdio.h>
+
+#ifdef AMIGA
+# ifndef __GNUC__
+# include <dos.h>
+# else
+# include <machine/reg.h>
+# endif
+#endif
+
+#ifdef E2K
+# include <errno.h>
+# include <asm/e2k_syswork.h>
+# include <sys/mman.h>
+# include <sys/syscall.h>
+
+ GC_INNER size_t GC_get_procedure_stack(ptr_t buf, size_t buf_sz) {
+ word new_sz;
+
+ GC_ASSERT(0 == buf_sz || buf != NULL);
+ for (;;) {
+ word stack_ofs;
+
+ new_sz = 0;
+ if (syscall(__NR_access_hw_stacks, E2K_GET_PROCEDURE_STACK_SIZE,
+ NULL, NULL, 0, &new_sz) == -1) {
+ if (errno != EAGAIN)
+ ABORT_ARG1("Cannot get size of procedure stack",
+ ": errno= %d", errno);
+ continue;
+ }
+ GC_ASSERT(new_sz > 0 && new_sz % sizeof(word) == 0);
+ if (new_sz > buf_sz)
+ break;
+ /* Immediately read the stack right after checking its size. */
+ stack_ofs = 0;
+ if (syscall(__NR_access_hw_stacks, E2K_READ_PROCEDURE_STACK_EX,
+ &stack_ofs, buf, new_sz, NULL) != -1)
+ break;
+ if (errno != EAGAIN)
+ ABORT_ARG2("Cannot read procedure stack",
+ ": new_sz= %lu, errno= %d", (unsigned long)new_sz, errno);
+ }
+ return (size_t)new_sz;
+ }
+
+ ptr_t GC_save_regs_in_stack(void) {
+ __asm__ __volatile__ ("flushr");
+ return NULL;
+ }
+
+ GC_INNER ptr_t GC_mmap_procedure_stack_buf(size_t aligned_sz)
+ {
+ void *buf = mmap(NULL, aligned_sz, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANON, 0 /* fd */, 0 /* offset */);
+ if (MAP_FAILED == buf)
+ ABORT_ARG2("Could not map memory for procedure stack",
+ ": requested %lu bytes, errno= %d",
+ (unsigned long)aligned_sz, errno);
+ return (ptr_t)buf;
+ }
+
+ GC_INNER void GC_unmap_procedure_stack_buf(ptr_t buf, size_t sz)
+ {
+ if (munmap(buf, ROUNDUP_PAGESIZE(sz)) == -1)
+ ABORT_ARG1("munmap failed (for procedure stack space)",
+ ": errno= %d", errno);
+ }
+
+# ifdef THREADS
+ GC_INNER size_t GC_alloc_and_get_procedure_stack(ptr_t *pbuf)
+ {
+ /* TODO: support saving from non-zero ofs in stack */
+ ptr_t buf = NULL;
+ size_t new_sz, buf_sz;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ for (buf_sz = 0; ; buf_sz = new_sz) {
+ new_sz = GC_get_procedure_stack(buf, buf_sz);
+ if (new_sz <= buf_sz) break;
+
+ if (EXPECT(buf != NULL, FALSE))
+ GC_INTERNAL_FREE(buf);
+ buf = (ptr_t)GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE(new_sz, PTRFREE);
+ if (NULL == buf)
+ ABORT("Could not allocate memory for procedure stack");
+ }
+ *pbuf = buf;
+ return new_sz;
+ }
+# endif /* THREADS */
+#endif /* E2K */
+
+#if defined(MACOS) && defined(__MWERKS__)
+
+#if defined(POWERPC)
+
+# define NONVOLATILE_GPR_COUNT 19
+ struct ppc_registers {
+ unsigned long gprs[NONVOLATILE_GPR_COUNT]; /* R13-R31 */
+ };
+ typedef struct ppc_registers ppc_registers;
+
+# if defined(CPPCHECK)
+ void getRegisters(ppc_registers* regs);
+# else
+ asm static void getRegisters(register ppc_registers* regs)
+ {
+ stmw r13,regs->gprs /* save R13-R31 */
+ blr
+ }
+# endif
+
+ static void PushMacRegisters(void)
+ {
+ ppc_registers regs;
+ int i;
+ getRegisters(&regs);
+ for (i = 0; i < NONVOLATILE_GPR_COUNT; i++)
+ GC_push_one(regs.gprs[i]);
+ }
+
+#else /* M68K */
+
+ asm static void PushMacRegisters(void)
+ {
+ sub.w #4,sp /* reserve space for one parameter */
+ move.l a2,(sp)
+ jsr GC_push_one
+ move.l a3,(sp)
+ jsr GC_push_one
+ move.l a4,(sp)
+ jsr GC_push_one
+# if !__option(a6frames)
+ /* <pcb> perhaps a6 should be pushed if stack frames are not being used */
+ move.l a6,(sp)
+ jsr GC_push_one
+# endif
+ /* skip a5 (globals), a6 (frame pointer), and a7 (stack pointer) */
+ move.l d2,(sp)
+ jsr GC_push_one
+ move.l d3,(sp)
+ jsr GC_push_one
+ move.l d4,(sp)
+ jsr GC_push_one
+ move.l d5,(sp)
+ jsr GC_push_one
+ move.l d6,(sp)
+ jsr GC_push_one
+ move.l d7,(sp)
+ jsr GC_push_one
+ add.w #4,sp /* fix stack */
+ rts
+ }
+
+#endif /* M68K */
+
+#endif /* MACOS && __MWERKS__ */
+
+# if defined(SPARC) || defined(IA64)
+ /* Value returned from register flushing routine; either sp (SPARC) */
+ /* or ar.bsp (IA64). */
+ GC_INNER ptr_t GC_save_regs_ret_val = NULL;
+# endif
+
+/* Routine to mark from registers that are preserved by the C compiler. */
+/* This must be ported to every new architecture. It is not optional, */
+/* and should not be used on platforms that are either UNIX-like, or */
+/* require thread support. */
+
+#undef HAVE_PUSH_REGS
+
+#if defined(USE_ASM_PUSH_REGS)
+# define HAVE_PUSH_REGS
+#else /* No asm implementation */
+
+# ifdef STACK_NOT_SCANNED
+ void GC_push_regs(void)
+ {
+ /* empty */
+ }
+# define HAVE_PUSH_REGS
+
+# elif defined(M68K) && defined(AMIGA)
+ /* This function is not static because it could also be */
+ /* erroneously defined in .S file, so this error would be caught */
+ /* by the linker. */
+ void GC_push_regs(void)
+ {
+ /* AMIGA - could be replaced by generic code */
+ /* a0, a1, d0 and d1 are caller save */
+
+# ifdef __GNUC__
+ asm("subq.w &0x4,%sp"); /* allocate word on top of stack */
+
+ asm("mov.l %a2,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %a3,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %a4,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %a5,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %a6,(%sp)"); asm("jsr _GC_push_one");
+ /* Skip frame pointer and stack pointer */
+ asm("mov.l %d2,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d3,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d4,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d5,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d6,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d7,(%sp)"); asm("jsr _GC_push_one");
+
+ asm("addq.w &0x4,%sp"); /* put stack back where it was */
+# else /* !__GNUC__ */
+ GC_push_one(getreg(REG_A2));
+ GC_push_one(getreg(REG_A3));
+# ifndef __SASC
+ /* Can probably be changed to #if 0 -Kjetil M. (a4=globals) */
+ GC_push_one(getreg(REG_A4));
+# endif
+ GC_push_one(getreg(REG_A5));
+ GC_push_one(getreg(REG_A6));
+ /* Skip stack pointer */
+ GC_push_one(getreg(REG_D2));
+ GC_push_one(getreg(REG_D3));
+ GC_push_one(getreg(REG_D4));
+ GC_push_one(getreg(REG_D5));
+ GC_push_one(getreg(REG_D6));
+ GC_push_one(getreg(REG_D7));
+# endif /* !__GNUC__ */
+ }
+# define HAVE_PUSH_REGS
+
+# elif defined(MACOS)
+
+# if defined(M68K) && defined(THINK_C) && !defined(CPPCHECK)
+# define PushMacReg(reg) \
+ move.l reg,(sp) \
+ jsr GC_push_one
+ void GC_push_regs(void)
+ {
+ asm {
+ sub.w #4,sp ; reserve space for one parameter.
+ PushMacReg(a2);
+ PushMacReg(a3);
+ PushMacReg(a4);
+ ; skip a5 (globals), a6 (frame pointer), and a7 (stack pointer)
+ PushMacReg(d2);
+ PushMacReg(d3);
+ PushMacReg(d4);
+ PushMacReg(d5);
+ PushMacReg(d6);
+ PushMacReg(d7);
+ add.w #4,sp ; fix stack.
+ }
+ }
+# define HAVE_PUSH_REGS
+# undef PushMacReg
+# elif defined(__MWERKS__)
+ void GC_push_regs(void)
+ {
+ PushMacRegisters();
+ }
+# define HAVE_PUSH_REGS
+# endif /* __MWERKS__ */
+# endif /* MACOS */
+
+#endif /* !USE_ASM_PUSH_REGS */
+
+#if defined(HAVE_PUSH_REGS) && defined(THREADS)
+# error GC_push_regs cannot be used with threads
+ /* Would fail for GC_do_blocking. There are probably other safety */
+ /* issues. */
+# undef HAVE_PUSH_REGS
+#endif
+
+#if !defined(HAVE_PUSH_REGS) && defined(UNIX_LIKE)
+# include <signal.h>
+# ifndef NO_GETCONTEXT
+# if defined(DARWIN) \
+ && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 /*MAC_OS_X_VERSION_10_6*/)
+# include <sys/ucontext.h>
+# else
+# include <ucontext.h>
+# endif /* !DARWIN */
+# ifdef GETCONTEXT_FPU_EXCMASK_BUG
+# include <fenv.h>
+# endif
+# endif
+#endif /* !HAVE_PUSH_REGS */
+
+/* Ensure that either registers are pushed, or callee-save registers */
+/* are somewhere on the stack, and then call fn(arg, ctxt). */
+/* ctxt is either a pointer to a ucontext_t we generated, or NULL. */
+GC_ATTR_NO_SANITIZE_ADDR
+GC_INNER void GC_with_callee_saves_pushed(void (*fn)(ptr_t, void *),
+ volatile ptr_t arg)
+{
+ volatile int dummy;
+ volatile ptr_t context = 0;
+
+# if defined(HAVE_PUSH_REGS)
+ GC_push_regs();
+# elif defined(EMSCRIPTEN)
+ /* No-op, "registers" are pushed in GC_push_other_roots(). */
+# else
+# if defined(UNIX_LIKE) && !defined(NO_GETCONTEXT)
+ /* Older versions of Darwin seem to lack getcontext(). */
+ /* ARM and MIPS Linux often doesn't support a real */
+ /* getcontext(). */
+ static signed char getcontext_works = 0; /* (-1) - broken, 1 - works */
+ ucontext_t ctxt;
+# ifdef GETCONTEXT_FPU_EXCMASK_BUG
+ /* Workaround a bug (clearing the FPU exception mask) in */
+ /* getcontext on Linux/x64. */
+# ifdef X86_64
+ /* We manipulate FPU control word here just not to force the */
+ /* client application to use -lm linker option. */
+ unsigned short old_fcw;
+
+# if defined(CPPCHECK)
+ GC_noop1((word)&old_fcw);
+# endif
+ __asm__ __volatile__ ("fstcw %0" : "=m" (*&old_fcw));
+# else
+ int except_mask = fegetexcept();
+# endif
+# endif
+
+ if (getcontext_works >= 0) {
+ if (getcontext(&ctxt) < 0) {
+ WARN("getcontext failed:"
+ " using another register retrieval method...\n", 0);
+ /* getcontext() is broken, do not try again. */
+ /* E.g., to workaround a bug in Docker ubuntu_32bit. */
+ } else {
+ context = (ptr_t)&ctxt;
+ }
+ if (EXPECT(0 == getcontext_works, FALSE))
+ getcontext_works = context != NULL ? 1 : -1;
+ }
+# ifdef GETCONTEXT_FPU_EXCMASK_BUG
+# ifdef X86_64
+ __asm__ __volatile__ ("fldcw %0" : : "m" (*&old_fcw));
+ {
+ unsigned mxcsr;
+ /* And now correct the exception mask in SSE MXCSR. */
+ __asm__ __volatile__ ("stmxcsr %0" : "=m" (*&mxcsr));
+ mxcsr = (mxcsr & ~(FE_ALL_EXCEPT << 7)) |
+ ((old_fcw & FE_ALL_EXCEPT) << 7);
+ __asm__ __volatile__ ("ldmxcsr %0" : : "m" (*&mxcsr));
+ }
+# else /* !X86_64 */
+ if (feenableexcept(except_mask) < 0)
+ ABORT("feenableexcept failed");
+# endif
+# endif /* GETCONTEXT_FPU_EXCMASK_BUG */
+# if defined(E2K) || defined(IA64) || defined(SPARC)
+ /* On a register window machine, we need to save register */
+ /* contents on the stack for this to work. This may already be */
+ /* subsumed by the getcontext() call. */
+# if defined(IA64) || defined(SPARC)
+ GC_save_regs_ret_val =
+# endif
+ GC_save_regs_in_stack();
+# endif
+ if (NULL == context) /* getcontext failed */
+# endif /* !NO_GETCONTEXT */
+ {
+# if defined(HAVE_BUILTIN_UNWIND_INIT)
+ /* This was suggested by Richard Henderson as the way to */
+ /* force callee-save registers and register windows onto */
+ /* the stack. */
+ __builtin_unwind_init();
+# elif defined(NO_CRT) && defined(MSWIN32)
+ CONTEXT ctx;
+ RtlCaptureContext(&ctx);
+# else
+ /* Generic code */
+ /* The idea is due to Parag Patel at HP. */
+ /* We're not sure whether he would like */
+ /* to be acknowledged for it or not. */
+ jmp_buf regs;
+ word *i = (word *)&regs[0];
+ ptr_t lim = (ptr_t)(&regs[0]) + sizeof(regs);
+
+ /* Setjmp doesn't always clear all of the buffer. */
+ /* That tends to preserve garbage. Clear it. */
+ for (; (word)i < (word)lim; i++) {
+ *i = 0;
+ }
+# if defined(MSWIN32) || defined(MSWINCE) || defined(UTS4) \
+ || defined(OS2) || defined(CX_UX) || defined(__CC_ARM) \
+ || defined(LINUX) || defined(EWS4800) || defined(RTEMS) \
+ || defined(DJGPP)
+ (void) setjmp(regs);
+# else
+ (void) _setjmp(regs);
+ /* We don't want to mess with signals. According to */
+ /* SUSV3, setjmp() may or may not save signal mask. */
+ /* _setjmp won't, but is less portable. */
+# endif
+# endif /* !HAVE_BUILTIN_UNWIND_INIT */
+ }
+# endif /* !HAVE_PUSH_REGS */
+ /* TODO: context here is sometimes just zero. At the moment, the */
+ /* callees don't really need it. */
+ fn(arg, (/* no volatile */ void *)context);
+ /* Strongly discourage the compiler from treating the above */
+ /* as a tail-call, since that would pop the register */
+ /* contents before we get a chance to look at them. */
+ GC_noop1(COVERT_DATAFLOW(&dummy));
+}
+
+#endif /* !PLATFORM_MACH_DEP && !SN_TARGET_PSP2 */
diff --git a/graphics/asymptote/gc/malloc.c b/graphics/asymptote/gc/malloc.c
new file mode 100644
index 0000000000..6abf654eed
--- /dev/null
+++ b/graphics/asymptote/gc/malloc.c
@@ -0,0 +1,727 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+#include "gc_inline.h" /* for GC_malloc_kind */
+
+#include <stdio.h>
+#include <string.h>
+
+/* Allocate reclaim list for kind: */
+/* Return TRUE on success */
+STATIC GC_bool GC_alloc_reclaim_list(struct obj_kind *kind)
+{
+ struct hblk ** result = (struct hblk **)
+ GC_scratch_alloc((MAXOBJGRANULES+1) * sizeof(struct hblk *));
+ if (result == 0) return(FALSE);
+ BZERO(result, (MAXOBJGRANULES+1)*sizeof(struct hblk *));
+ kind -> ok_reclaim_list = result;
+ return(TRUE);
+}
+
+/* Allocate a large block of size lb bytes. The block is not cleared. */
+/* flags argument should be 0 or IGNORE_OFF_PAGE. EXTRA_BYTES value */
+/* was already added to lb. */
+GC_INNER ptr_t GC_alloc_large(size_t lb, int k, unsigned flags)
+{
+ struct hblk * h;
+ word n_blocks;
+ ptr_t result;
+ GC_bool retry = FALSE;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ lb = ROUNDUP_GRANULE_SIZE(lb);
+ n_blocks = OBJ_SZ_TO_BLOCKS_CHECKED(lb);
+ if (!EXPECT(GC_is_initialized, TRUE)) {
+ DCL_LOCK_STATE;
+ UNLOCK(); /* just to unset GC_lock_holder */
+ GC_init();
+ LOCK();
+ }
+ /* Do our share of marking work */
+ if (GC_incremental && !GC_dont_gc) {
+ ENTER_GC();
+ GC_collect_a_little_inner((int)n_blocks);
+ EXIT_GC();
+ }
+ h = GC_allochblk(lb, k, flags);
+# ifdef USE_MUNMAP
+ if (0 == h) {
+ GC_merge_unmapped();
+ h = GC_allochblk(lb, k, flags);
+ }
+# endif
+ while (0 == h && GC_collect_or_expand(n_blocks, flags != 0, retry)) {
+ h = GC_allochblk(lb, k, flags);
+ retry = TRUE;
+ }
+ if (h == 0) {
+ result = 0;
+ } else {
+ size_t total_bytes = n_blocks * HBLKSIZE;
+ if (n_blocks > 1) {
+ GC_large_allocd_bytes += total_bytes;
+ if (GC_large_allocd_bytes > GC_max_large_allocd_bytes)
+ GC_max_large_allocd_bytes = GC_large_allocd_bytes;
+ }
+ /* FIXME: Do we need some way to reset GC_max_large_allocd_bytes? */
+ result = h -> hb_body;
+ }
+ return result;
+}
+
+/* Allocate a large block of size lb bytes. Clear if appropriate. */
+/* EXTRA_BYTES were already added to lb. */
+STATIC ptr_t GC_alloc_large_and_clear(size_t lb, int k, unsigned flags)
+{
+ ptr_t result;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ result = GC_alloc_large(lb, k, flags);
+ if (result != NULL
+ && (GC_debugging_started || GC_obj_kinds[k].ok_init)) {
+ word n_blocks = OBJ_SZ_TO_BLOCKS(lb);
+
+ /* Clear the whole block, in case of GC_realloc call. */
+ BZERO(result, n_blocks * HBLKSIZE);
+ }
+ return result;
+}
+
+/* Fill in additional entries in GC_size_map, including the i-th one. */
+/* Note that a filled in section of the array ending at n always */
+/* has the length of at least n/4. */
+STATIC void GC_extend_size_map(size_t i)
+{
+ size_t orig_granule_sz = ROUNDED_UP_GRANULES(i);
+ size_t granule_sz;
+ size_t byte_sz = GRANULES_TO_BYTES(orig_granule_sz);
+ /* The size we try to preserve. */
+ /* Close to i, unless this would */
+ /* introduce too many distinct sizes. */
+ size_t smaller_than_i = byte_sz - (byte_sz >> 3);
+ size_t low_limit; /* The lowest indexed entry we initialize. */
+ size_t number_of_objs;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_ASSERT(0 == GC_size_map[i]);
+ if (0 == GC_size_map[smaller_than_i]) {
+ low_limit = byte_sz - (byte_sz >> 2); /* much smaller than i */
+ granule_sz = orig_granule_sz;
+ while (GC_size_map[low_limit] != 0)
+ low_limit++;
+ } else {
+ low_limit = smaller_than_i + 1;
+ while (GC_size_map[low_limit] != 0)
+ low_limit++;
+
+ granule_sz = ROUNDED_UP_GRANULES(low_limit);
+ granule_sz += granule_sz >> 3;
+ if (granule_sz < orig_granule_sz)
+ granule_sz = orig_granule_sz;
+ }
+
+ /* For these larger sizes, we use an even number of granules. */
+ /* This makes it easier to, e.g., construct a 16-byte-aligned */
+ /* allocator even if GRANULE_BYTES is 8. */
+ granule_sz = (granule_sz + 1) & ~(size_t)1;
+ if (granule_sz > MAXOBJGRANULES)
+ granule_sz = MAXOBJGRANULES;
+
+ /* If we can fit the same number of larger objects in a block, do so. */
+ number_of_objs = HBLK_GRANULES / granule_sz;
+ GC_ASSERT(number_of_objs != 0);
+ granule_sz = (HBLK_GRANULES / number_of_objs) & ~(size_t)1;
+
+ byte_sz = GRANULES_TO_BYTES(granule_sz) - EXTRA_BYTES;
+ /* We may need one extra byte; do not always */
+ /* fill in GC_size_map[byte_sz]. */
+
+ for (; low_limit <= byte_sz; low_limit++)
+ GC_size_map[low_limit] = granule_sz;
+}
+
+/* Allocate lb bytes for an object of kind k. */
+/* Should not be used to directly allocate objects */
+/* that require special handling on allocation. */
+GC_INNER void * GC_generic_malloc_inner(size_t lb, int k)
+{
+ void *op;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_ASSERT(k < MAXOBJKINDS);
+ if (SMALL_OBJ(lb)) {
+ struct obj_kind * kind = GC_obj_kinds + k;
+ size_t lg = GC_size_map[lb];
+ void ** opp = &(kind -> ok_freelist[lg]);
+
+ op = *opp;
+ if (EXPECT(0 == op, FALSE)) {
+ if (lg == 0) {
+ if (!EXPECT(GC_is_initialized, TRUE)) {
+ DCL_LOCK_STATE;
+ UNLOCK(); /* just to unset GC_lock_holder */
+ GC_init();
+ LOCK();
+ lg = GC_size_map[lb];
+ }
+ if (0 == lg) {
+ GC_extend_size_map(lb);
+ lg = GC_size_map[lb];
+ GC_ASSERT(lg != 0);
+ }
+ /* Retry */
+ opp = &(kind -> ok_freelist[lg]);
+ op = *opp;
+ }
+ if (0 == op) {
+ if (0 == kind -> ok_reclaim_list &&
+ !GC_alloc_reclaim_list(kind))
+ return NULL;
+ op = GC_allocobj(lg, k);
+ if (0 == op)
+ return NULL;
+ }
+ }
+ *opp = obj_link(op);
+ obj_link(op) = 0;
+ GC_bytes_allocd += GRANULES_TO_BYTES((word)lg);
+ } else {
+ size_t lb_adjusted = ADD_SLOP(lb);
+
+ op = (ptr_t)GC_alloc_large_and_clear(lb_adjusted, k, 0 /* flags */);
+ if (op != NULL)
+ GC_bytes_allocd += lb_adjusted;
+ }
+
+ return op;
+}
+
+#if defined(DBG_HDRS_ALL) || defined(GC_GCJ_SUPPORT) \
+ || !defined(GC_NO_FINALIZATION)
+ /* Allocate a composite object of size n bytes. The caller */
+ /* guarantees that pointers past the first hblk are not relevant. */
+ GC_INNER void * GC_generic_malloc_inner_ignore_off_page(size_t lb, int k)
+ {
+ size_t lb_adjusted;
+ void * op;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (lb <= HBLKSIZE)
+ return GC_generic_malloc_inner(lb, k);
+ GC_ASSERT(k < MAXOBJKINDS);
+ lb_adjusted = ADD_SLOP(lb);
+ op = GC_alloc_large_and_clear(lb_adjusted, k, IGNORE_OFF_PAGE);
+ if (op != NULL)
+ GC_bytes_allocd += lb_adjusted;
+ return op;
+ }
+#endif
+
+#ifdef GC_COLLECT_AT_MALLOC
+ /* Parameter to force GC at every malloc of size greater or equal to */
+ /* the given value. This might be handy during debugging. */
+# if defined(CPPCHECK)
+ size_t GC_dbg_collect_at_malloc_min_lb = 16*1024; /* e.g. */
+# else
+ size_t GC_dbg_collect_at_malloc_min_lb = (GC_COLLECT_AT_MALLOC);
+# endif
+#endif
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_generic_malloc(size_t lb, int k)
+{
+ void * result;
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(k < MAXOBJKINDS);
+ if (EXPECT(get_have_errors(), FALSE))
+ GC_print_all_errors();
+ GC_INVOKE_FINALIZERS();
+ GC_DBG_COLLECT_AT_MALLOC(lb);
+ if (SMALL_OBJ(lb)) {
+ LOCK();
+ result = GC_generic_malloc_inner(lb, k);
+ UNLOCK();
+ } else {
+ size_t lg;
+ size_t lb_rounded;
+ word n_blocks;
+ GC_bool init;
+
+ lg = ROUNDED_UP_GRANULES(lb);
+ lb_rounded = GRANULES_TO_BYTES(lg);
+ n_blocks = OBJ_SZ_TO_BLOCKS(lb_rounded);
+ init = GC_obj_kinds[k].ok_init;
+ LOCK();
+ result = (ptr_t)GC_alloc_large(lb_rounded, k, 0);
+ if (0 != result) {
+ if (GC_debugging_started
+# ifndef THREADS
+ || init
+# endif
+ ) {
+ BZERO(result, n_blocks * HBLKSIZE);
+ } else {
+# ifdef THREADS
+ /* Clear any memory that might be used for GC descriptors */
+ /* before we release the lock. */
+ ((word *)result)[0] = 0;
+ ((word *)result)[1] = 0;
+ ((word *)result)[GRANULES_TO_WORDS(lg)-1] = 0;
+ ((word *)result)[GRANULES_TO_WORDS(lg)-2] = 0;
+# endif
+ }
+ GC_bytes_allocd += lb_rounded;
+ }
+ UNLOCK();
+# ifdef THREADS
+ if (init && !GC_debugging_started && result != NULL) {
+ /* Clear the rest (i.e. excluding the initial 2 words). */
+ BZERO((word *)result + 2,
+ n_blocks * HBLKSIZE - 2 * sizeof(word));
+ }
+# endif
+ }
+ if (0 == result) {
+ return((*GC_get_oom_fn())(lb));
+ } else {
+ return(result);
+ }
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_kind_global(size_t lb, int k)
+{
+ GC_ASSERT(k < MAXOBJKINDS);
+ if (SMALL_OBJ(lb)) {
+ void *op;
+ void **opp;
+ size_t lg;
+ DCL_LOCK_STATE;
+
+ GC_DBG_COLLECT_AT_MALLOC(lb);
+ LOCK();
+ lg = GC_size_map[lb];
+ opp = &GC_obj_kinds[k].ok_freelist[lg];
+ op = *opp;
+ if (EXPECT(op != NULL, TRUE)) {
+ if (k == PTRFREE) {
+ *opp = obj_link(op);
+ } else {
+ GC_ASSERT(0 == obj_link(op)
+ || ((word)obj_link(op)
+ <= (word)GC_greatest_plausible_heap_addr
+ && (word)obj_link(op)
+ >= (word)GC_least_plausible_heap_addr));
+ *opp = obj_link(op);
+ obj_link(op) = 0;
+ }
+ GC_bytes_allocd += GRANULES_TO_BYTES((word)lg);
+ UNLOCK();
+ return op;
+ }
+ UNLOCK();
+ }
+
+ /* We make the GC_clear_stack() call a tail one, hoping to get more */
+ /* of the stack. */
+ return GC_clear_stack(GC_generic_malloc(lb, k));
+}
+
+#if defined(THREADS) && !defined(THREAD_LOCAL_ALLOC)
+ GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_kind(size_t lb, int k)
+ {
+ return GC_malloc_kind_global(lb, k);
+ }
+#endif
+
+/* Allocate lb bytes of atomic (pointer-free) data. */
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_atomic(size_t lb)
+{
+ return GC_malloc_kind(lb, PTRFREE);
+}
+
+/* Allocate lb bytes of composite (pointerful) data. */
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc(size_t lb)
+{
+ return GC_malloc_kind(lb, NORMAL);
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_generic_malloc_uncollectable(
+ size_t lb, int k)
+{
+ void *op;
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(k < MAXOBJKINDS);
+ if (SMALL_OBJ(lb)) {
+ void **opp;
+ size_t lg;
+
+ GC_DBG_COLLECT_AT_MALLOC(lb);
+ if (EXTRA_BYTES != 0 && lb != 0) lb--;
+ /* We don't need the extra byte, since this won't be */
+ /* collected anyway. */
+ LOCK();
+ lg = GC_size_map[lb];
+ opp = &GC_obj_kinds[k].ok_freelist[lg];
+ op = *opp;
+ if (EXPECT(op != NULL, TRUE)) {
+ *opp = obj_link(op);
+ obj_link(op) = 0;
+ GC_bytes_allocd += GRANULES_TO_BYTES((word)lg);
+ /* Mark bit was already set on free list. It will be */
+ /* cleared only temporarily during a collection, as a */
+ /* result of the normal free list mark bit clearing. */
+ GC_non_gc_bytes += GRANULES_TO_BYTES((word)lg);
+ UNLOCK();
+ } else {
+ UNLOCK();
+ op = GC_generic_malloc(lb, k);
+ /* For small objects, the free lists are completely marked. */
+ }
+ GC_ASSERT(0 == op || GC_is_marked(op));
+ } else {
+ op = GC_generic_malloc(lb, k);
+ if (op /* != NULL */) { /* CPPCHECK */
+ hdr * hhdr = HDR(op);
+
+ GC_ASSERT(((word)op & (HBLKSIZE - 1)) == 0); /* large block */
+ /* We don't need the lock here, since we have an undisguised */
+ /* pointer. We do need to hold the lock while we adjust */
+ /* mark bits. */
+ LOCK();
+ set_mark_bit_from_hdr(hhdr, 0); /* Only object. */
+# ifndef THREADS
+ GC_ASSERT(hhdr -> hb_n_marks == 0);
+ /* This is not guaranteed in the multi-threaded case */
+ /* because the counter could be updated before locking. */
+# endif
+ hhdr -> hb_n_marks = 1;
+ UNLOCK();
+ }
+ }
+ return op;
+}
+
+/* Allocate lb bytes of pointerful, traced, but not collectible data. */
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_uncollectable(size_t lb)
+{
+ return GC_generic_malloc_uncollectable(lb, UNCOLLECTABLE);
+}
+
+#ifdef GC_ATOMIC_UNCOLLECTABLE
+ /* Allocate lb bytes of pointer-free, untraced, uncollectible data */
+ /* This is normally roughly equivalent to the system malloc. */
+ /* But it may be useful if malloc is redefined. */
+ GC_API GC_ATTR_MALLOC void * GC_CALL
+ GC_malloc_atomic_uncollectable(size_t lb)
+ {
+ return GC_generic_malloc_uncollectable(lb, AUNCOLLECTABLE);
+ }
+#endif /* GC_ATOMIC_UNCOLLECTABLE */
+
+#if defined(REDIRECT_MALLOC) && !defined(REDIRECT_MALLOC_IN_HEADER)
+
+# ifndef MSWINCE
+# include <errno.h>
+# endif
+
+ /* Avoid unnecessary nested procedure calls here, by #defining some */
+ /* malloc replacements. Otherwise we end up saving a meaningless */
+ /* return address in the object. It also speeds things up, but it is */
+ /* admittedly quite ugly. */
+# define GC_debug_malloc_replacement(lb) GC_debug_malloc(lb, GC_DBG_EXTRAS)
+
+# if defined(CPPCHECK)
+# define REDIRECT_MALLOC_F GC_malloc /* e.g. */
+# else
+# define REDIRECT_MALLOC_F REDIRECT_MALLOC
+# endif
+
+ void * malloc(size_t lb)
+ {
+ /* It might help to manually inline the GC_malloc call here. */
+ /* But any decent compiler should reduce the extra procedure call */
+ /* to at most a jump instruction in this case. */
+# if defined(I386) && defined(GC_SOLARIS_THREADS)
+ /* Thread initialization can call malloc before we are ready for. */
+ /* It is not clear that this is enough to help matters. */
+ /* The thread implementation may well call malloc at other */
+ /* inopportune times. */
+ if (!EXPECT(GC_is_initialized, TRUE)) return sbrk(lb);
+# endif
+ return (void *)REDIRECT_MALLOC_F(lb);
+ }
+
+# if defined(GC_LINUX_THREADS)
+ STATIC ptr_t GC_libpthread_start = 0;
+ STATIC ptr_t GC_libpthread_end = 0;
+ STATIC ptr_t GC_libld_start = 0;
+ STATIC ptr_t GC_libld_end = 0;
+ static GC_bool lib_bounds_set = FALSE;
+
+ GC_INNER void GC_init_lib_bounds(void)
+ {
+ IF_CANCEL(int cancel_state;)
+ DCL_LOCK_STATE;
+
+ /* This test does not need to ensure memory visibility, since */
+ /* the bounds will be set when/if we create another thread. */
+ if (EXPECT(lib_bounds_set, TRUE)) return;
+
+ DISABLE_CANCEL(cancel_state);
+ GC_init(); /* if not called yet */
+# if defined(GC_ASSERTIONS) && defined(GC_ALWAYS_MULTITHREADED)
+ LOCK(); /* just to set GC_lock_holder */
+# endif
+ if (!GC_text_mapping("libpthread-",
+ &GC_libpthread_start, &GC_libpthread_end)) {
+ /* Some libc implementations like bionic, musl and glibc 2.34 */
+ /* do not have libpthread.so because the pthreads-related code */
+ /* is located in libc.so, thus potential calloc calls from such */
+ /* code are forwarded to real (libc) calloc without any special */
+ /* handling on the libgc side. Checking glibc version at */
+ /* compile time to turn off the warning seems to be fine. */
+ /* TODO: Remove GC_text_mapping() call for this case. */
+# if defined(__GLIBC__) \
+ && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 34))
+ WARN("Failed to find libpthread.so text mapping: Expect crash\n", 0);
+ /* This might still work with some versions of libpthread, */
+ /* so we do not abort. */
+# endif
+ }
+ if (!GC_text_mapping("ld-", &GC_libld_start, &GC_libld_end)) {
+ WARN("Failed to find ld.so text mapping: Expect crash\n", 0);
+ }
+# if defined(GC_ASSERTIONS) && defined(GC_ALWAYS_MULTITHREADED)
+ UNLOCK();
+# endif
+ RESTORE_CANCEL(cancel_state);
+ lib_bounds_set = TRUE;
+ }
+# endif /* GC_LINUX_THREADS */
+
+ void * calloc(size_t n, size_t lb)
+ {
+ if ((lb | n) > GC_SQRT_SIZE_MAX /* fast initial test */
+ && lb && n > GC_SIZE_MAX / lb)
+ return (*GC_get_oom_fn())(GC_SIZE_MAX); /* n*lb overflow */
+# if defined(GC_LINUX_THREADS)
+ /* libpthread allocated some memory that is only pointed to by */
+ /* mmapped thread stacks. Make sure it is not collectible. */
+ {
+ ptr_t caller = (ptr_t)__builtin_return_address(0);
+
+ GC_init_lib_bounds();
+ if (((word)caller >= (word)GC_libpthread_start
+ && (word)caller < (word)GC_libpthread_end)
+ || ((word)caller >= (word)GC_libld_start
+ && (word)caller < (word)GC_libld_end))
+ return GC_generic_malloc_uncollectable(n * lb, UNCOLLECTABLE);
+ /* The two ranges are actually usually adjacent, so there may */
+ /* be a way to speed this up. */
+ }
+# endif
+ return (void *)REDIRECT_MALLOC_F(n * lb);
+ }
+
+# ifndef strdup
+ char *strdup(const char *s)
+ {
+ size_t lb = strlen(s) + 1;
+ char *result = (char *)REDIRECT_MALLOC_F(lb);
+ if (result == 0) {
+ errno = ENOMEM;
+ return 0;
+ }
+ BCOPY(s, result, lb);
+ return result;
+ }
+# endif /* !defined(strdup) */
+ /* If strdup is macro defined, we assume that it actually calls malloc, */
+ /* and thus the right thing will happen even without overriding it. */
+ /* This seems to be true on most Linux systems. */
+
+# ifndef strndup
+ /* This is similar to strdup(). */
+ char *strndup(const char *str, size_t size)
+ {
+ char *copy;
+ size_t len = strlen(str);
+ if (len > size)
+ len = size;
+ copy = (char *)REDIRECT_MALLOC_F(len + 1);
+ if (copy == NULL) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (EXPECT(len > 0, TRUE))
+ BCOPY(str, copy, len);
+ copy[len] = '\0';
+ return copy;
+ }
+# endif /* !strndup */
+
+# undef GC_debug_malloc_replacement
+
+#endif /* REDIRECT_MALLOC */
+
+/* Explicitly deallocate an object p. */
+GC_API void GC_CALL GC_free(void * p)
+{
+ struct hblk *h;
+ hdr *hhdr;
+ size_t sz; /* In bytes */
+ size_t ngranules; /* sz in granules */
+ int knd;
+ struct obj_kind * ok;
+ DCL_LOCK_STATE;
+
+ if (p /* != NULL */) {
+ /* CPPCHECK */
+ } else {
+ /* Required by ANSI. It's not my fault ... */
+ return;
+ }
+
+# ifdef LOG_ALLOCS
+ GC_log_printf("GC_free(%p) after GC #%lu\n",
+ p, (unsigned long)GC_gc_no);
+# endif
+ h = HBLKPTR(p);
+ hhdr = HDR(h);
+# if defined(REDIRECT_MALLOC) && \
+ ((defined(NEED_CALLINFO) && defined(GC_HAVE_BUILTIN_BACKTRACE)) \
+ || defined(GC_SOLARIS_THREADS) || defined(GC_LINUX_THREADS) \
+ || defined(MSWIN32))
+ /* This might be called indirectly by GC_print_callers to free */
+ /* the result of backtrace_symbols. */
+ /* For Solaris, we have to redirect malloc calls during */
+ /* initialization. For the others, this seems to happen */
+ /* implicitly. */
+ /* Don't try to deallocate that memory. */
+ if (0 == hhdr) return;
+# endif
+ GC_ASSERT(GC_base(p) == p);
+ sz = (size_t)hhdr->hb_sz;
+ ngranules = BYTES_TO_GRANULES(sz);
+ knd = hhdr -> hb_obj_kind;
+ ok = &GC_obj_kinds[knd];
+ if (EXPECT(ngranules <= MAXOBJGRANULES, TRUE)) {
+ void **flh;
+
+ LOCK();
+ GC_bytes_freed += sz;
+ if (IS_UNCOLLECTABLE(knd)) GC_non_gc_bytes -= sz;
+ /* It's unnecessary to clear the mark bit. If the */
+ /* object is reallocated, it doesn't matter. O.w. the */
+ /* collector will do it, since it's on a free list. */
+ if (ok -> ok_init && EXPECT(sz > sizeof(word), TRUE)) {
+ BZERO((word *)p + 1, sz-sizeof(word));
+ }
+ flh = &(ok -> ok_freelist[ngranules]);
+ obj_link(p) = *flh;
+ *flh = (ptr_t)p;
+ UNLOCK();
+ } else {
+ size_t nblocks = OBJ_SZ_TO_BLOCKS(sz);
+
+ LOCK();
+ GC_bytes_freed += sz;
+ if (IS_UNCOLLECTABLE(knd)) GC_non_gc_bytes -= sz;
+ if (nblocks > 1) {
+ GC_large_allocd_bytes -= nblocks * HBLKSIZE;
+ }
+ GC_freehblk(h);
+ UNLOCK();
+ }
+}
+
+/* Explicitly deallocate an object p when we already hold lock. */
+/* Only used for internally allocated objects, so we can take some */
+/* shortcuts. */
+#ifdef THREADS
+ GC_INNER void GC_free_inner(void * p)
+ {
+ struct hblk *h;
+ hdr *hhdr;
+ size_t sz; /* bytes */
+ size_t ngranules; /* sz in granules */
+ int knd;
+ struct obj_kind * ok;
+
+ h = HBLKPTR(p);
+ hhdr = HDR(h);
+ knd = hhdr -> hb_obj_kind;
+ sz = (size_t)hhdr->hb_sz;
+ ngranules = BYTES_TO_GRANULES(sz);
+ ok = &GC_obj_kinds[knd];
+ if (ngranules <= MAXOBJGRANULES) {
+ void ** flh;
+
+ GC_bytes_freed += sz;
+ if (IS_UNCOLLECTABLE(knd)) GC_non_gc_bytes -= sz;
+ if (ok -> ok_init && EXPECT(sz > sizeof(word), TRUE)) {
+ BZERO((word *)p + 1, sz-sizeof(word));
+ }
+ flh = &(ok -> ok_freelist[ngranules]);
+ obj_link(p) = *flh;
+ *flh = (ptr_t)p;
+ } else {
+ size_t nblocks = OBJ_SZ_TO_BLOCKS(sz);
+ GC_bytes_freed += sz;
+ if (IS_UNCOLLECTABLE(knd)) GC_non_gc_bytes -= sz;
+ if (nblocks > 1) {
+ GC_large_allocd_bytes -= nblocks * HBLKSIZE;
+ }
+ GC_freehblk(h);
+ }
+ }
+#endif /* THREADS */
+
+#if defined(REDIRECT_MALLOC) && !defined(REDIRECT_FREE)
+# define REDIRECT_FREE GC_free
+#endif
+
+#if defined(REDIRECT_FREE) && !defined(REDIRECT_MALLOC_IN_HEADER)
+
+# if defined(CPPCHECK)
+# define REDIRECT_FREE_F GC_free /* e.g. */
+# else
+# define REDIRECT_FREE_F REDIRECT_FREE
+# endif
+
+ void free(void * p GC_ATTR_UNUSED)
+ {
+# ifndef IGNORE_FREE
+# if defined(GC_LINUX_THREADS) && !defined(USE_PROC_FOR_LIBRARIES)
+ /* Don't bother with initialization checks. If nothing */
+ /* has been initialized, the check fails, and that's safe, */
+ /* since we have not allocated uncollectible objects neither. */
+ ptr_t caller = (ptr_t)__builtin_return_address(0);
+ /* This test does not need to ensure memory visibility, since */
+ /* the bounds will be set when/if we create another thread. */
+ if (((word)caller >= (word)GC_libpthread_start
+ && (word)caller < (word)GC_libpthread_end)
+ || ((word)caller >= (word)GC_libld_start
+ && (word)caller < (word)GC_libld_end)) {
+ GC_free(p);
+ return;
+ }
+# endif
+ REDIRECT_FREE_F(p);
+# endif
+ }
+#endif /* REDIRECT_FREE */
diff --git a/graphics/asymptote/gc/mallocx.c b/graphics/asymptote/gc/mallocx.c
new file mode 100644
index 0000000000..21c35e317d
--- /dev/null
+++ b/graphics/asymptote/gc/mallocx.c
@@ -0,0 +1,643 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved.
+ * Copyright (c) 2009-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+#include "gc_inline.h" /* for GC_malloc_kind */
+
+/*
+ * These are extra allocation routines which are likely to be less
+ * frequently used than those in malloc.c. They are separate in the
+ * hope that the .o file will be excluded from statically linked
+ * executables. We should probably break this up further.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#ifndef MSWINCE
+# include <errno.h>
+#endif
+
+/* Some externally visible but unadvertised variables to allow access to */
+/* free lists from inlined allocators without including gc_priv.h */
+/* or introducing dependencies on internal data structure layouts. */
+#include "private/gc_alloc_ptrs.h"
+void ** const GC_objfreelist_ptr = GC_objfreelist;
+void ** const GC_aobjfreelist_ptr = GC_aobjfreelist;
+void ** const GC_uobjfreelist_ptr = GC_uobjfreelist;
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+ void ** const GC_auobjfreelist_ptr = GC_auobjfreelist;
+# endif
+
+GC_API int GC_CALL GC_get_kind_and_size(const void * p, size_t * psize)
+{
+ hdr * hhdr = HDR(p);
+
+ if (psize != NULL) {
+ *psize = (size_t)hhdr->hb_sz;
+ }
+ return hhdr -> hb_obj_kind;
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_generic_or_special_malloc(size_t lb,
+ int knd)
+{
+ switch(knd) {
+ case PTRFREE:
+ case NORMAL:
+ return GC_malloc_kind(lb, knd);
+ case UNCOLLECTABLE:
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+ case AUNCOLLECTABLE:
+# endif
+ return GC_generic_malloc_uncollectable(lb, knd);
+ default:
+ return GC_generic_malloc(lb, knd);
+ }
+}
+
+/* Change the size of the block pointed to by p to contain at least */
+/* lb bytes. The object may be (and quite likely will be) moved. */
+/* The kind (e.g. atomic) is the same as that of the old. */
+/* Shrinking of large blocks is not implemented well. */
+GC_API void * GC_CALL GC_realloc(void * p, size_t lb)
+{
+ struct hblk * h;
+ hdr * hhdr;
+ void * result;
+# if defined(_FORTIFY_SOURCE) && defined(__GNUC__) && !defined(__clang__)
+ volatile /* Use cleared_p instead of p as a workaround to avoid */
+ /* passing alloc_size(lb) attribute associated with p */
+ /* to memset (including memset call inside GC_free). */
+# endif
+ word cleared_p = (word)p;
+ size_t sz; /* Current size in bytes */
+ size_t orig_sz; /* Original sz in bytes */
+ int obj_kind;
+
+ if (p == 0) return(GC_malloc(lb)); /* Required by ANSI */
+ if (0 == lb) /* and p != NULL */ {
+# ifndef IGNORE_FREE
+ GC_free(p);
+# endif
+ return NULL;
+ }
+ h = HBLKPTR(p);
+ hhdr = HDR(h);
+ sz = (size_t)hhdr->hb_sz;
+ obj_kind = hhdr -> hb_obj_kind;
+ orig_sz = sz;
+
+ if (sz > MAXOBJBYTES) {
+ /* Round it up to the next whole heap block */
+ word descr = GC_obj_kinds[obj_kind].ok_descriptor;
+
+ sz = (sz + HBLKSIZE-1) & ~HBLKMASK;
+ if (GC_obj_kinds[obj_kind].ok_relocate_descr)
+ descr += sz;
+ /* GC_realloc might be changing the block size while */
+ /* GC_reclaim_block or GC_clear_hdr_marks is examining it. */
+ /* The change to the size field is benign, in that GC_reclaim */
+ /* (and GC_clear_hdr_marks) would work correctly with either */
+ /* value, since we are not changing the number of objects in */
+ /* the block. But seeing a half-updated value (though unlikely */
+ /* to occur in practice) could be probably bad. */
+ /* Using unordered atomic accesses on the size and hb_descr */
+ /* fields would solve the issue. (The alternate solution might */
+ /* be to initially overallocate large objects, so we do not */
+ /* have to adjust the size in GC_realloc, if they still fit. */
+ /* But that is probably more expensive, since we may end up */
+ /* scanning a bunch of zeros during GC.) */
+# ifdef AO_HAVE_store
+ GC_STATIC_ASSERT(sizeof(hhdr->hb_sz) == sizeof(AO_t));
+ AO_store((volatile AO_t *)&hhdr->hb_sz, (AO_t)sz);
+ AO_store((volatile AO_t *)&hhdr->hb_descr, (AO_t)descr);
+# else
+ {
+ DCL_LOCK_STATE;
+
+ LOCK();
+ hhdr -> hb_sz = sz;
+ hhdr -> hb_descr = descr;
+ UNLOCK();
+ }
+# endif
+
+# ifdef MARK_BIT_PER_OBJ
+ GC_ASSERT(hhdr -> hb_inv_sz == LARGE_INV_SZ);
+# endif
+# ifdef MARK_BIT_PER_GRANULE
+ GC_ASSERT((hhdr -> hb_flags & LARGE_BLOCK) != 0
+ && hhdr -> hb_map[ANY_INDEX] == 1);
+# endif
+ if (IS_UNCOLLECTABLE(obj_kind)) GC_non_gc_bytes += (sz - orig_sz);
+ /* Extra area is already cleared by GC_alloc_large_and_clear. */
+ }
+ if (ADD_SLOP(lb) <= sz) {
+ if (lb >= (sz >> 1)) {
+ if (orig_sz > lb) {
+ /* Clear unneeded part of object to avoid bogus pointer */
+ /* tracing. */
+ BZERO((ptr_t)cleared_p + lb, orig_sz - lb);
+ }
+ return(p);
+ }
+ /* shrink */
+ sz = lb;
+ }
+ result = GC_generic_or_special_malloc((word)lb, obj_kind);
+ if (result != NULL) {
+ /* In case of shrink, it could also return original object. */
+ /* But this gives the client warning of imminent disaster. */
+ BCOPY(p, result, sz);
+# ifndef IGNORE_FREE
+ GC_free((ptr_t)cleared_p);
+# endif
+ }
+ return result;
+}
+
+# if defined(REDIRECT_MALLOC) && !defined(REDIRECT_REALLOC)
+# define REDIRECT_REALLOC GC_realloc
+# endif
+
+# ifdef REDIRECT_REALLOC
+
+/* As with malloc, avoid two levels of extra calls here. */
+# define GC_debug_realloc_replacement(p, lb) \
+ GC_debug_realloc(p, lb, GC_DBG_EXTRAS)
+
+# if !defined(REDIRECT_MALLOC_IN_HEADER)
+ void * realloc(void * p, size_t lb)
+ {
+ return(REDIRECT_REALLOC(p, lb));
+ }
+# endif
+
+# undef GC_debug_realloc_replacement
+# endif /* REDIRECT_REALLOC */
+
+/* Allocate memory such that only pointers to near the */
+/* beginning of the object are considered. */
+/* We avoid holding allocation lock while we clear the memory. */
+GC_API GC_ATTR_MALLOC void * GC_CALL
+ GC_generic_malloc_ignore_off_page(size_t lb, int k)
+{
+ void *result;
+ size_t lg;
+ size_t lb_rounded;
+ word n_blocks;
+ GC_bool init;
+ DCL_LOCK_STATE;
+
+ if (SMALL_OBJ(lb))
+ return GC_generic_malloc(lb, k);
+ GC_ASSERT(k < MAXOBJKINDS);
+ lg = ROUNDED_UP_GRANULES(lb);
+ lb_rounded = GRANULES_TO_BYTES(lg);
+ n_blocks = OBJ_SZ_TO_BLOCKS(lb_rounded);
+ init = GC_obj_kinds[k].ok_init;
+ if (EXPECT(get_have_errors(), FALSE))
+ GC_print_all_errors();
+ GC_INVOKE_FINALIZERS();
+ GC_DBG_COLLECT_AT_MALLOC(lb);
+ LOCK();
+ result = (ptr_t)GC_alloc_large(ADD_SLOP(lb), k, IGNORE_OFF_PAGE);
+ if (NULL == result) {
+ GC_oom_func oom_fn = GC_oom_fn;
+ UNLOCK();
+ return (*oom_fn)(lb);
+ }
+
+ if (GC_debugging_started) {
+ BZERO(result, n_blocks * HBLKSIZE);
+ } else {
+# ifdef THREADS
+ /* Clear any memory that might be used for GC descriptors */
+ /* before we release the lock. */
+ ((word *)result)[0] = 0;
+ ((word *)result)[1] = 0;
+ ((word *)result)[GRANULES_TO_WORDS(lg)-1] = 0;
+ ((word *)result)[GRANULES_TO_WORDS(lg)-2] = 0;
+# endif
+ }
+ GC_bytes_allocd += lb_rounded;
+ UNLOCK();
+ if (init && !GC_debugging_started) {
+ BZERO(result, n_blocks * HBLKSIZE);
+ }
+ return(result);
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_ignore_off_page(size_t lb)
+{
+ return GC_generic_malloc_ignore_off_page(lb, NORMAL);
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL
+ GC_malloc_atomic_ignore_off_page(size_t lb)
+{
+ return GC_generic_malloc_ignore_off_page(lb, PTRFREE);
+}
+
+/* Increment GC_bytes_allocd from code that doesn't have direct access */
+/* to GC_arrays. */
+void GC_CALL GC_incr_bytes_allocd(size_t n)
+{
+ GC_bytes_allocd += n;
+}
+
+/* The same for GC_bytes_freed. */
+void GC_CALL GC_incr_bytes_freed(size_t n)
+{
+ GC_bytes_freed += n;
+}
+
+GC_API size_t GC_CALL GC_get_expl_freed_bytes_since_gc(void)
+{
+ return (size_t)GC_bytes_freed;
+}
+
+# ifdef PARALLEL_MARK
+ STATIC volatile AO_t GC_bytes_allocd_tmp = 0;
+ /* Number of bytes of memory allocated since */
+ /* we released the GC lock. Instead of */
+ /* reacquiring the GC lock just to add this in, */
+ /* we add it in the next time we reacquire */
+ /* the lock. (Atomically adding it doesn't */
+ /* work, since we would have to atomically */
+ /* update it in GC_malloc, which is too */
+ /* expensive.) */
+# endif /* PARALLEL_MARK */
+
+/* Return a list of 1 or more objects of the indicated size, linked */
+/* through the first word in the object. This has the advantage that */
+/* it acquires the allocation lock only once, and may greatly reduce */
+/* time wasted contending for the allocation lock. Typical usage would */
+/* be in a thread that requires many items of the same size. It would */
+/* keep its own free list in thread-local storage, and call */
+/* GC_malloc_many or friends to replenish it. (We do not round up */
+/* object sizes, since a call indicates the intention to consume many */
+/* objects of exactly this size.) */
+/* We assume that the size is non-zero and a multiple of */
+/* GRANULE_BYTES, and that it already includes EXTRA_BYTES value. */
+/* We return the free-list by assigning it to *result, since it is */
+/* not safe to return, e.g. a linked list of pointer-free objects, */
+/* since the collector would not retain the entire list if it were */
+/* invoked just as we were returning. */
+/* Note that the client should usually clear the link field. */
+GC_API void GC_CALL GC_generic_malloc_many(size_t lb, int k, void **result)
+{
+ void *op;
+ void *p;
+ void **opp;
+ size_t lw; /* Length in words. */
+ size_t lg; /* Length in granules. */
+ signed_word my_bytes_allocd = 0;
+ struct obj_kind * ok = &(GC_obj_kinds[k]);
+ struct hblk ** rlh;
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(lb != 0 && (lb & (GRANULE_BYTES-1)) == 0);
+ /* Currently a single object is always allocated if manual VDB. */
+ /* TODO: GC_dirty should be called for each linked object (but */
+ /* the last one) to support multiple objects allocation. */
+ if (!EXPECT(lb <= MAXOBJBYTES, TRUE) || GC_manual_vdb) {
+ op = GC_generic_malloc(lb - EXTRA_BYTES, k);
+ if (EXPECT(0 != op, TRUE))
+ obj_link(op) = 0;
+ *result = op;
+# ifndef GC_DISABLE_INCREMENTAL
+ if (GC_manual_vdb && GC_is_heap_ptr(result)) {
+ GC_dirty_inner(result);
+ REACHABLE_AFTER_DIRTY(op);
+ }
+# endif
+ return;
+ }
+ GC_ASSERT(k < MAXOBJKINDS);
+ lw = BYTES_TO_WORDS(lb);
+ lg = BYTES_TO_GRANULES(lb);
+ if (EXPECT(get_have_errors(), FALSE))
+ GC_print_all_errors();
+ GC_INVOKE_FINALIZERS();
+ GC_DBG_COLLECT_AT_MALLOC(lb - EXTRA_BYTES);
+ if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
+ LOCK();
+ /* Do our share of marking work */
+ if (GC_incremental && !GC_dont_gc) {
+ ENTER_GC();
+ GC_collect_a_little_inner(1);
+ EXIT_GC();
+ }
+ /* First see if we can reclaim a page of objects waiting to be */
+ /* reclaimed. */
+ rlh = ok -> ok_reclaim_list;
+ if (rlh != NULL) {
+ struct hblk * hbp;
+ hdr * hhdr;
+
+ while ((hbp = rlh[lg]) != NULL) {
+ hhdr = HDR(hbp);
+ rlh[lg] = hhdr -> hb_next;
+ GC_ASSERT(hhdr -> hb_sz == lb);
+ hhdr -> hb_last_reclaimed = (unsigned short) GC_gc_no;
+# ifdef PARALLEL_MARK
+ if (GC_parallel) {
+ signed_word my_bytes_allocd_tmp =
+ (signed_word)AO_load(&GC_bytes_allocd_tmp);
+ GC_ASSERT(my_bytes_allocd_tmp >= 0);
+ /* We only decrement it while holding the GC lock. */
+ /* Thus we can't accidentally adjust it down in more */
+ /* than one thread simultaneously. */
+
+ if (my_bytes_allocd_tmp != 0) {
+ (void)AO_fetch_and_add(&GC_bytes_allocd_tmp,
+ (AO_t)(-my_bytes_allocd_tmp));
+ GC_bytes_allocd += my_bytes_allocd_tmp;
+ }
+ GC_acquire_mark_lock();
+ ++ GC_fl_builder_count;
+ UNLOCK();
+ GC_release_mark_lock();
+ }
+# endif
+ op = GC_reclaim_generic(hbp, hhdr, lb,
+ ok -> ok_init, 0, &my_bytes_allocd);
+ if (op != 0) {
+# ifdef PARALLEL_MARK
+ if (GC_parallel) {
+ *result = op;
+ (void)AO_fetch_and_add(&GC_bytes_allocd_tmp,
+ (AO_t)my_bytes_allocd);
+ GC_acquire_mark_lock();
+ -- GC_fl_builder_count;
+ if (GC_fl_builder_count == 0) GC_notify_all_builder();
+# ifdef THREAD_SANITIZER
+ GC_release_mark_lock();
+ LOCK();
+ GC_bytes_found += my_bytes_allocd;
+ UNLOCK();
+# else
+ GC_bytes_found += my_bytes_allocd;
+ /* The result may be inaccurate. */
+ GC_release_mark_lock();
+# endif
+ (void) GC_clear_stack(0);
+ return;
+ }
+# endif
+ /* We also reclaimed memory, so we need to adjust */
+ /* that count. */
+ GC_bytes_found += my_bytes_allocd;
+ GC_bytes_allocd += my_bytes_allocd;
+ goto out;
+ }
+# ifdef PARALLEL_MARK
+ if (GC_parallel) {
+ GC_acquire_mark_lock();
+ -- GC_fl_builder_count;
+ if (GC_fl_builder_count == 0) GC_notify_all_builder();
+ GC_release_mark_lock();
+ LOCK();
+ /* GC lock is needed for reclaim list access. We */
+ /* must decrement fl_builder_count before reacquiring */
+ /* the lock. Hopefully this path is rare. */
+
+ rlh = ok -> ok_reclaim_list; /* reload rlh after locking */
+ if (NULL == rlh) break;
+ }
+# endif
+ }
+ }
+ /* Next try to use prefix of global free list if there is one. */
+ /* We don't refill it, but we need to use it up before allocating */
+ /* a new block ourselves. */
+ opp = &(GC_obj_kinds[k].ok_freelist[lg]);
+ if ( (op = *opp) != 0 ) {
+ *opp = 0;
+ my_bytes_allocd = 0;
+ for (p = op; p != 0; p = obj_link(p)) {
+ my_bytes_allocd += lb;
+ if ((word)my_bytes_allocd >= HBLKSIZE) {
+ *opp = obj_link(p);
+ obj_link(p) = 0;
+ break;
+ }
+ }
+ GC_bytes_allocd += my_bytes_allocd;
+ goto out;
+ }
+ /* Next try to allocate a new block worth of objects of this size. */
+ {
+ struct hblk *h = GC_allochblk(lb, k, 0);
+ if (h /* != NULL */) { /* CPPCHECK */
+ if (IS_UNCOLLECTABLE(k)) GC_set_hdr_marks(HDR(h));
+ GC_bytes_allocd += HBLKSIZE - HBLKSIZE % lb;
+# ifdef PARALLEL_MARK
+ if (GC_parallel) {
+ GC_acquire_mark_lock();
+ ++ GC_fl_builder_count;
+ UNLOCK();
+ GC_release_mark_lock();
+
+ op = GC_build_fl(h, lw,
+ (ok -> ok_init || GC_debugging_started), 0);
+
+ *result = op;
+ GC_acquire_mark_lock();
+ -- GC_fl_builder_count;
+ if (GC_fl_builder_count == 0) GC_notify_all_builder();
+ GC_release_mark_lock();
+ (void) GC_clear_stack(0);
+ return;
+ }
+# endif
+ op = GC_build_fl(h, lw, (ok -> ok_init || GC_debugging_started), 0);
+ goto out;
+ }
+ }
+
+ /* As a last attempt, try allocating a single object. Note that */
+ /* this may trigger a collection or expand the heap. */
+ op = GC_generic_malloc_inner(lb - EXTRA_BYTES, k);
+ if (0 != op) obj_link(op) = 0;
+
+ out:
+ *result = op;
+ UNLOCK();
+ (void) GC_clear_stack(0);
+}
+
+/* Note that the "atomic" version of this would be unsafe, since the */
+/* links would not be seen by the collector. */
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_many(size_t lb)
+{
+ void *result;
+
+ /* Add EXTRA_BYTES and round up to a multiple of a granule. */
+ lb = SIZET_SAT_ADD(lb, EXTRA_BYTES + GRANULE_BYTES - 1)
+ & ~(GRANULE_BYTES - 1);
+
+ GC_generic_malloc_many(lb, NORMAL, &result);
+ return result;
+}
+
+#include <limits.h>
+
+/* Debug version is tricky and currently missing. */
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_memalign(size_t align, size_t lb)
+{
+ size_t new_lb;
+ size_t offset;
+ ptr_t result;
+
+ if (align <= GRANULE_BYTES) return GC_malloc(lb);
+ if (align >= HBLKSIZE/2 || lb >= HBLKSIZE/2) {
+ if (align > HBLKSIZE) {
+ return (*GC_get_oom_fn())(LONG_MAX-1024); /* Fail */
+ }
+ return GC_malloc(lb <= HBLKSIZE? HBLKSIZE : lb);
+ /* Will be HBLKSIZE aligned. */
+ }
+ /* We could also try to make sure that the real rounded-up object size */
+ /* is a multiple of align. That would be correct up to HBLKSIZE. */
+ new_lb = SIZET_SAT_ADD(lb, align - 1);
+ result = (ptr_t)GC_malloc(new_lb);
+ /* It is OK not to check result for NULL as in that case */
+ /* GC_memalign returns NULL too since (0 + 0 % align) is 0. */
+ offset = (word)result % align;
+ if (offset != 0) {
+ offset = align - offset;
+ if (!GC_all_interior_pointers) {
+ GC_STATIC_ASSERT(VALID_OFFSET_SZ <= HBLKSIZE);
+ GC_ASSERT(offset < VALID_OFFSET_SZ);
+ GC_register_displacement(offset);
+ }
+ }
+ result += offset;
+ GC_ASSERT((word)result % align == 0);
+ return result;
+}
+
+/* This one exists largely to redirect posix_memalign for leaks finding. */
+GC_API int GC_CALL GC_posix_memalign(void **memptr, size_t align, size_t lb)
+{
+ void *p;
+ size_t align_minus_one = align - 1; /* to workaround a cppcheck warning */
+
+ /* Check alignment properly. */
+ if (align < sizeof(void *) || (align_minus_one & align) != 0) {
+# ifdef MSWINCE
+ return ERROR_INVALID_PARAMETER;
+# else
+ return EINVAL;
+# endif
+ }
+
+ p = GC_memalign(align, lb);
+ if (EXPECT(NULL == p, FALSE)) {
+# ifdef MSWINCE
+ return ERROR_NOT_ENOUGH_MEMORY;
+# else
+ return ENOMEM;
+# endif
+ }
+ *memptr = p;
+ return 0; /* success */
+}
+
+/* provide a version of strdup() that uses the collector to allocate the
+ copy of the string */
+GC_API GC_ATTR_MALLOC char * GC_CALL GC_strdup(const char *s)
+{
+ char *copy;
+ size_t lb;
+ if (s == NULL) return NULL;
+ lb = strlen(s) + 1;
+ copy = (char *)GC_malloc_atomic(lb);
+ if (NULL == copy) {
+# ifndef MSWINCE
+ errno = ENOMEM;
+# endif
+ return NULL;
+ }
+ BCOPY(s, copy, lb);
+ return copy;
+}
+
+GC_API GC_ATTR_MALLOC char * GC_CALL GC_strndup(const char *str, size_t size)
+{
+ char *copy;
+ size_t len = strlen(str); /* str is expected to be non-NULL */
+ if (len > size)
+ len = size;
+ copy = (char *)GC_malloc_atomic(len + 1);
+ if (copy == NULL) {
+# ifndef MSWINCE
+ errno = ENOMEM;
+# endif
+ return NULL;
+ }
+ if (EXPECT(len > 0, TRUE))
+ BCOPY(str, copy, len);
+ copy[len] = '\0';
+ return copy;
+}
+
+#ifdef GC_REQUIRE_WCSDUP
+# include <wchar.h> /* for wcslen() */
+
+ GC_API GC_ATTR_MALLOC wchar_t * GC_CALL GC_wcsdup(const wchar_t *str)
+ {
+ size_t lb = (wcslen(str) + 1) * sizeof(wchar_t);
+ wchar_t *copy = (wchar_t *)GC_malloc_atomic(lb);
+
+ if (copy == NULL) {
+# ifndef MSWINCE
+ errno = ENOMEM;
+# endif
+ return NULL;
+ }
+ BCOPY(str, copy, lb);
+ return copy;
+ }
+#endif /* GC_REQUIRE_WCSDUP */
+
+#ifndef CPPCHECK
+ GC_API void * GC_CALL GC_malloc_stubborn(size_t lb)
+ {
+ return GC_malloc(lb);
+ }
+
+ GC_API void GC_CALL GC_change_stubborn(const void *p GC_ATTR_UNUSED)
+ {
+ /* Empty. */
+ }
+#endif /* !CPPCHECK */
+
+GC_API void GC_CALL GC_end_stubborn_change(const void *p)
+{
+ GC_dirty(p); /* entire object */
+}
+
+GC_API void GC_CALL GC_ptr_store_and_dirty(void *p, const void *q)
+{
+ *(const void **)p = q;
+ GC_dirty(p);
+ REACHABLE_AFTER_DIRTY(q);
+}
diff --git a/graphics/asymptote/gc/mark.c b/graphics/asymptote/gc/mark.c
new file mode 100644
index 0000000000..50e6cfd7ce
--- /dev/null
+++ b/graphics/asymptote/gc/mark.c
@@ -0,0 +1,1953 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved.
+ * Copyright (c) 2008-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#include "private/gc_pmark.h"
+
+#include <stdio.h>
+
+/* Make arguments appear live to compiler. Put here to minimize the */
+/* risk of inlining. Used to minimize junk left in registers. */
+GC_ATTR_NOINLINE
+void GC_noop6(word arg1 GC_ATTR_UNUSED, word arg2 GC_ATTR_UNUSED,
+ word arg3 GC_ATTR_UNUSED, word arg4 GC_ATTR_UNUSED,
+ word arg5 GC_ATTR_UNUSED, word arg6 GC_ATTR_UNUSED)
+{
+ /* Avoid GC_noop6 calls to be optimized away. */
+# if defined(AO_HAVE_compiler_barrier) && !defined(BASE_ATOMIC_OPS_EMULATED)
+ AO_compiler_barrier(); /* to serve as a special side-effect */
+# else
+ GC_noop1(0);
+# endif
+}
+
+/* Single argument version, robust against whole program analysis. */
+GC_ATTR_NO_SANITIZE_THREAD
+GC_API void GC_CALL GC_noop1(word x)
+{
+ GC_noop_sink = x;
+}
+
+/* Initialize GC_obj_kinds properly and standard free lists properly. */
+/* This must be done statically since they may be accessed before */
+/* GC_init is called. */
+/* It's done here, since we need to deal with mark descriptors. */
+GC_INNER struct obj_kind GC_obj_kinds[MAXOBJKINDS] = {
+/* PTRFREE */ { &GC_aobjfreelist[0], 0 /* filled in dynamically */,
+ /* 0 | */ GC_DS_LENGTH, FALSE, FALSE
+ /*, */ OK_DISCLAIM_INITZ },
+/* NORMAL */ { &GC_objfreelist[0], 0,
+ /* 0 | */ GC_DS_LENGTH,
+ /* adjusted in GC_init for EXTRA_BYTES */
+ TRUE /* add length to descr */, TRUE
+ /*, */ OK_DISCLAIM_INITZ },
+/* UNCOLLECTABLE */
+ { &GC_uobjfreelist[0], 0,
+ /* 0 | */ GC_DS_LENGTH, TRUE /* add length to descr */, TRUE
+ /*, */ OK_DISCLAIM_INITZ },
+# ifdef GC_ATOMIC_UNCOLLECTABLE
+ { &GC_auobjfreelist[0], 0,
+ /* 0 | */ GC_DS_LENGTH, FALSE, FALSE
+ /*, */ OK_DISCLAIM_INITZ },
+# endif
+};
+
+# ifndef INITIAL_MARK_STACK_SIZE
+# define INITIAL_MARK_STACK_SIZE (1*HBLKSIZE)
+ /* INITIAL_MARK_STACK_SIZE * sizeof(mse) should be a */
+ /* multiple of HBLKSIZE. */
+ /* The incremental collector actually likes a larger */
+ /* size, since it wants to push all marked dirty */
+ /* objects before marking anything new. Currently we */
+ /* let it grow dynamically. */
+# endif
+
+#if !defined(GC_DISABLE_INCREMENTAL)
+ STATIC word GC_n_rescuing_pages = 0;
+ /* Number of dirty pages we marked from */
+ /* excludes ptrfree pages, etc. */
+ /* Used for logging only. */
+#endif
+
+#ifdef PARALLEL_MARK
+ GC_INNER GC_bool GC_parallel_mark_disabled = FALSE;
+#endif
+
+/* Is a collection in progress? Note that this can return true in the */
+/* non-incremental case, if a collection has been abandoned and the */
+/* mark state is now MS_INVALID. */
+GC_INNER GC_bool GC_collection_in_progress(void)
+{
+ return(GC_mark_state != MS_NONE);
+}
+
+/* Clear all mark bits in the header. */
+GC_INNER void GC_clear_hdr_marks(hdr *hhdr)
+{
+ size_t last_bit;
+
+# ifdef AO_HAVE_load
+ /* Atomic access is used to avoid racing with GC_realloc. */
+ last_bit = FINAL_MARK_BIT((size_t)AO_load((volatile AO_t *)&hhdr->hb_sz));
+# else
+ /* No race as GC_realloc holds the lock while updating hb_sz. */
+ last_bit = FINAL_MARK_BIT((size_t)hhdr->hb_sz);
+# endif
+
+ BZERO(hhdr -> hb_marks, sizeof(hhdr->hb_marks));
+ set_mark_bit_from_hdr(hhdr, last_bit);
+ hhdr -> hb_n_marks = 0;
+}
+
+/* Set all mark bits in the header. Used for uncollectible blocks. */
+GC_INNER void GC_set_hdr_marks(hdr *hhdr)
+{
+ unsigned i;
+ size_t sz = (size_t)hhdr->hb_sz;
+ unsigned n_marks = (unsigned)FINAL_MARK_BIT(sz);
+
+# ifdef USE_MARK_BYTES
+ for (i = 0; i <= n_marks; i += (unsigned)MARK_BIT_OFFSET(sz)) {
+ hhdr -> hb_marks[i] = 1;
+ }
+# else
+ for (i = 0; i < divWORDSZ(n_marks + WORDSZ); ++i) {
+ hhdr -> hb_marks[i] = GC_WORD_MAX;
+ }
+# endif
+# ifdef MARK_BIT_PER_OBJ
+ hhdr -> hb_n_marks = n_marks;
+# else
+ hhdr -> hb_n_marks = HBLK_OBJS(sz);
+# endif
+}
+
+/* Clear all mark bits associated with block h. */
+static void clear_marks_for_block(struct hblk *h, word dummy GC_ATTR_UNUSED)
+{
+ hdr * hhdr = HDR(h);
+
+ if (IS_UNCOLLECTABLE(hhdr -> hb_obj_kind)) return;
+ /* Mark bit for these is cleared only once the object is */
+ /* explicitly deallocated. This either frees the block, or */
+ /* the bit is cleared once the object is on the free list. */
+ GC_clear_hdr_marks(hhdr);
+}
+
+/* Slow but general routines for setting/clearing/asking about mark bits. */
+GC_API void GC_CALL GC_set_mark_bit(const void *p)
+{
+ struct hblk *h = HBLKPTR(p);
+ hdr * hhdr = HDR(h);
+ word bit_no = MARK_BIT_NO((ptr_t)p - (ptr_t)h, hhdr -> hb_sz);
+
+ if (!mark_bit_from_hdr(hhdr, bit_no)) {
+ set_mark_bit_from_hdr(hhdr, bit_no);
+ ++hhdr -> hb_n_marks;
+ }
+}
+
+GC_API void GC_CALL GC_clear_mark_bit(const void *p)
+{
+ struct hblk *h = HBLKPTR(p);
+ hdr * hhdr = HDR(h);
+ word bit_no = MARK_BIT_NO((ptr_t)p - (ptr_t)h, hhdr -> hb_sz);
+
+ if (mark_bit_from_hdr(hhdr, bit_no)) {
+ size_t n_marks = hhdr -> hb_n_marks;
+
+ GC_ASSERT(n_marks != 0);
+ clear_mark_bit_from_hdr(hhdr, bit_no);
+ n_marks--;
+# ifdef PARALLEL_MARK
+ if (n_marks != 0 || !GC_parallel)
+ hhdr -> hb_n_marks = n_marks;
+ /* Don't decrement to zero. The counts are approximate due to */
+ /* concurrency issues, but we need to ensure that a count of */
+ /* zero implies an empty block. */
+# else
+ hhdr -> hb_n_marks = n_marks;
+# endif
+ }
+}
+
+GC_API int GC_CALL GC_is_marked(const void *p)
+{
+ struct hblk *h = HBLKPTR(p);
+ hdr * hhdr = HDR(h);
+ word bit_no = MARK_BIT_NO((ptr_t)p - (ptr_t)h, hhdr -> hb_sz);
+
+ return (int)mark_bit_from_hdr(hhdr, bit_no); /* 0 or 1 */
+}
+
+/* Clear mark bits in all allocated heap blocks. This invalidates the */
+/* marker invariant, and sets GC_mark_state to reflect this. (This */
+/* implicitly starts marking to reestablish the invariant.) */
+GC_INNER void GC_clear_marks(void)
+{
+ GC_apply_to_all_blocks(clear_marks_for_block, (word)0);
+ GC_objects_are_marked = FALSE;
+ GC_mark_state = MS_INVALID;
+ GC_scan_ptr = NULL;
+}
+
+/* Initiate a garbage collection. Initiates a full collection if the */
+/* mark state is invalid. */
+GC_INNER void GC_initiate_gc(void)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+# ifndef GC_DISABLE_INCREMENTAL
+ if (GC_incremental) {
+# ifdef CHECKSUMS
+ GC_read_dirty(FALSE);
+ GC_check_dirty();
+# else
+ GC_read_dirty(GC_mark_state == MS_INVALID);
+# endif
+ }
+ GC_n_rescuing_pages = 0;
+# endif
+ if (GC_mark_state == MS_NONE) {
+ GC_mark_state = MS_PUSH_RESCUERS;
+ } else if (GC_mark_state != MS_INVALID) {
+ ABORT("Unexpected state");
+ } /* Else this is really a full collection, and mark bits are invalid. */
+ GC_scan_ptr = NULL;
+}
+
+#ifdef PARALLEL_MARK
+ STATIC void GC_do_parallel_mark(void); /* Initiate parallel marking. */
+#endif /* PARALLEL_MARK */
+
+#ifdef GC_DISABLE_INCREMENTAL
+# define GC_push_next_marked_dirty(h) GC_push_next_marked(h)
+#else
+ STATIC struct hblk * GC_push_next_marked_dirty(struct hblk *h);
+ /* Invoke GC_push_marked on next dirty block above h. */
+ /* Return a pointer just past the end of this block. */
+#endif /* !GC_DISABLE_INCREMENTAL */
+STATIC struct hblk * GC_push_next_marked(struct hblk *h);
+ /* Ditto, but also mark from clean pages. */
+STATIC struct hblk * GC_push_next_marked_uncollectable(struct hblk *h);
+ /* Ditto, but mark only from uncollectible pages. */
+
+static void alloc_mark_stack(size_t);
+
+/* Perform a small amount of marking. */
+/* We try to touch roughly a page of memory. */
+/* Return TRUE if we just finished a mark phase. */
+/* Cold_gc_frame is an address inside a GC frame that */
+/* remains valid until all marking is complete. */
+/* A zero value indicates that it's OK to miss some */
+/* register values. */
+/* We hold the allocation lock. In the case of */
+/* incremental collection, the world may not be stopped.*/
+#ifdef WRAP_MARK_SOME
+ /* For Win32, this is called after we establish a structured */
+ /* exception (or signal) handler, in case Windows unmaps one */
+ /* of our root segments. See below. In either case, we */
+ /* acquire the allocator lock long before we get here. */
+ /* Note that this code should never generate an incremental */
+ /* GC write fault. */
+ STATIC GC_bool GC_mark_some_inner(ptr_t cold_gc_frame)
+#else
+ GC_INNER GC_bool GC_mark_some(ptr_t cold_gc_frame)
+#endif
+{
+ switch(GC_mark_state) {
+ case MS_NONE:
+ break;
+
+ case MS_PUSH_RESCUERS:
+ if ((word)GC_mark_stack_top
+ >= (word)(GC_mark_stack_limit - INITIAL_MARK_STACK_SIZE/2)) {
+ /* Go ahead and mark, even though that might cause us to */
+ /* see more marked dirty objects later on. Avoid this */
+ /* in the future. */
+ GC_mark_stack_too_small = TRUE;
+ MARK_FROM_MARK_STACK();
+ break;
+ } else {
+ GC_scan_ptr = GC_push_next_marked_dirty(GC_scan_ptr);
+ if (NULL == GC_scan_ptr) {
+# if !defined(GC_DISABLE_INCREMENTAL)
+ GC_COND_LOG_PRINTF("Marked from %lu dirty pages\n",
+ (unsigned long)GC_n_rescuing_pages);
+# endif
+ GC_push_roots(FALSE, cold_gc_frame);
+ GC_objects_are_marked = TRUE;
+ if (GC_mark_state != MS_INVALID) {
+ GC_mark_state = MS_ROOTS_PUSHED;
+ }
+ }
+ }
+ break;
+
+ case MS_PUSH_UNCOLLECTABLE:
+ if ((word)GC_mark_stack_top
+ >= (word)(GC_mark_stack + GC_mark_stack_size/4)) {
+# ifdef PARALLEL_MARK
+ /* Avoid this, since we don't parallelize the marker */
+ /* here. */
+ if (GC_parallel) GC_mark_stack_too_small = TRUE;
+# endif
+ MARK_FROM_MARK_STACK();
+ break;
+ } else {
+ GC_scan_ptr = GC_push_next_marked_uncollectable(GC_scan_ptr);
+ if (NULL == GC_scan_ptr) {
+ GC_push_roots(TRUE, cold_gc_frame);
+ GC_objects_are_marked = TRUE;
+ if (GC_mark_state != MS_INVALID) {
+ GC_mark_state = MS_ROOTS_PUSHED;
+ }
+ }
+ }
+ break;
+
+ case MS_ROOTS_PUSHED:
+# ifdef PARALLEL_MARK
+ /* Eventually, incremental marking should run */
+ /* asynchronously in multiple threads, without grabbing */
+ /* the allocation lock. */
+ /* For now, parallel marker is disabled if there is */
+ /* a chance that marking could be interrupted by */
+ /* a client-supplied time limit or custom stop function. */
+ if (GC_parallel && !GC_parallel_mark_disabled) {
+ GC_do_parallel_mark();
+ GC_ASSERT((word)GC_mark_stack_top < (word)GC_first_nonempty);
+ GC_mark_stack_top = GC_mark_stack - 1;
+ if (GC_mark_stack_too_small) {
+ alloc_mark_stack(2*GC_mark_stack_size);
+ }
+ if (GC_mark_state == MS_ROOTS_PUSHED) {
+ GC_mark_state = MS_NONE;
+ return(TRUE);
+ }
+ break;
+ }
+# endif
+ if ((word)GC_mark_stack_top >= (word)GC_mark_stack) {
+ MARK_FROM_MARK_STACK();
+ break;
+ } else {
+ GC_mark_state = MS_NONE;
+ if (GC_mark_stack_too_small) {
+ alloc_mark_stack(2*GC_mark_stack_size);
+ }
+ return(TRUE);
+ }
+
+ case MS_INVALID:
+ case MS_PARTIALLY_INVALID:
+ if (!GC_objects_are_marked) {
+ GC_mark_state = MS_PUSH_UNCOLLECTABLE;
+ break;
+ }
+ if ((word)GC_mark_stack_top >= (word)GC_mark_stack) {
+ MARK_FROM_MARK_STACK();
+ break;
+ }
+ if (NULL == GC_scan_ptr && GC_mark_state == MS_INVALID) {
+ /* About to start a heap scan for marked objects. */
+ /* Mark stack is empty. OK to reallocate. */
+ if (GC_mark_stack_too_small) {
+ alloc_mark_stack(2*GC_mark_stack_size);
+ }
+ GC_mark_state = MS_PARTIALLY_INVALID;
+ }
+ GC_scan_ptr = GC_push_next_marked(GC_scan_ptr);
+ if (NULL == GC_scan_ptr && GC_mark_state == MS_PARTIALLY_INVALID) {
+ GC_push_roots(TRUE, cold_gc_frame);
+ GC_objects_are_marked = TRUE;
+ if (GC_mark_state != MS_INVALID) {
+ GC_mark_state = MS_ROOTS_PUSHED;
+ }
+ }
+ break;
+
+ default:
+ ABORT("GC_mark_some: bad state");
+ }
+ return(FALSE);
+}
+
+#ifdef WRAP_MARK_SOME
+
+ GC_INNER GC_bool GC_mark_some(ptr_t cold_gc_frame)
+ {
+ GC_bool ret_val;
+
+ /* Windows appears to asynchronously create and remove */
+ /* writable memory mappings, for reasons we haven't yet */
+ /* understood. Since we look for writable regions to */
+ /* determine the root set, we may try to mark from an */
+ /* address range that disappeared since we started the */
+ /* collection. Thus we have to recover from faults here. */
+ /* This code seems to be necessary for WinCE (at least in */
+ /* the case we'd decide to add MEM_PRIVATE sections to */
+ /* data roots in GC_register_dynamic_libraries()). */
+ /* It's conceivable that this is the same issue with */
+ /* terminating threads that we see with Linux and */
+ /* USE_PROC_FOR_LIBRARIES. */
+# if (defined(MSWIN32) || defined(MSWINCE)) && !defined(__GNUC__)
+ __try {
+ ret_val = GC_mark_some_inner(cold_gc_frame);
+ } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
+ EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
+ goto handle_ex;
+ }
+# else
+ /* Here we are handling the case in which /proc is used for root */
+ /* finding, and we have threads. We may find a stack for a */
+ /* thread that is in the process of exiting, and disappears */
+ /* while we are marking it. This seems extremely difficult to */
+ /* avoid otherwise. */
+# if defined(USE_PROC_FOR_LIBRARIES) && !defined(DEFAULT_VDB)
+ if (GC_auto_incremental) {
+ static GC_bool is_warned = FALSE;
+
+ if (!is_warned) {
+ is_warned = TRUE;
+ WARN("Incremental GC incompatible with /proc roots\n", 0);
+ }
+ /* I'm not sure if this could still work ... */
+ }
+# endif
+ GC_setup_temporary_fault_handler();
+ if(SETJMP(GC_jmp_buf) != 0) goto handle_ex;
+ ret_val = GC_mark_some_inner(cold_gc_frame);
+ GC_reset_fault_handler();
+# endif
+
+# if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS)
+ /* With DllMain-based thread tracking, a thread may have */
+ /* started while we were marking. This is logically equivalent */
+ /* to the exception case; our results are invalid and we have */
+ /* to start over. This cannot be prevented since we can't */
+ /* block in DllMain. */
+ if (GC_started_thread_while_stopped())
+ goto handle_thr_start;
+# endif
+ return ret_val;
+
+handle_ex:
+ /* Exception handler starts here for all cases. */
+# if !defined(MSWIN32) && !defined(MSWINCE) || defined(__GNUC__)
+ GC_reset_fault_handler();
+# endif
+ {
+ static word warned_gc_no;
+
+ /* Report caught ACCESS_VIOLATION, once per collection. */
+ if (warned_gc_no != GC_gc_no) {
+ GC_COND_LOG_PRINTF("Memory mapping disappeared at collection #%lu\n",
+ (unsigned long)GC_gc_no + 1);
+ warned_gc_no = GC_gc_no;
+ }
+ }
+# if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS)
+ handle_thr_start:
+# endif
+ /* We have bad roots on the stack. Discard mark stack. */
+ /* Rescan from marked objects. Redetermine roots. */
+# ifdef REGISTER_LIBRARIES_EARLY
+ START_WORLD();
+ GC_cond_register_dynamic_libraries();
+ STOP_WORLD();
+# endif
+ GC_invalidate_mark_state();
+ GC_scan_ptr = NULL;
+ return FALSE;
+ }
+#endif /* WRAP_MARK_SOME */
+
+GC_INNER void GC_invalidate_mark_state(void)
+{
+ GC_mark_state = MS_INVALID;
+ GC_mark_stack_top = GC_mark_stack-1;
+}
+
+GC_INNER mse * GC_signal_mark_stack_overflow(mse *msp)
+{
+ GC_mark_state = MS_INVALID;
+# ifdef PARALLEL_MARK
+ /* We are using a local_mark_stack in parallel mode, so */
+ /* do not signal the global mark stack to be resized. */
+ /* That will be done if required in GC_return_mark_stack. */
+ if (!GC_parallel)
+ GC_mark_stack_too_small = TRUE;
+# else
+ GC_mark_stack_too_small = TRUE;
+# endif
+ GC_COND_LOG_PRINTF("Mark stack overflow; current size: %lu entries\n",
+ (unsigned long)GC_mark_stack_size);
+ return(msp - GC_MARK_STACK_DISCARDS);
+}
+
+/*
+ * Mark objects pointed to by the regions described by
+ * mark stack entries between mark_stack and mark_stack_top,
+ * inclusive. Assumes the upper limit of a mark stack entry
+ * is never 0. A mark stack entry never has size 0.
+ * We try to traverse on the order of a hblk of memory before we return.
+ * Caller is responsible for calling this until the mark stack is empty.
+ * Note that this is the most performance critical routine in the
+ * collector. Hence it contains all sorts of ugly hacks to speed
+ * things up. In particular, we avoid procedure calls on the common
+ * path, we take advantage of peculiarities of the mark descriptor
+ * encoding, we optionally maintain a cache for the block address to
+ * header mapping, we prefetch when an object is "grayed", etc.
+ */
+GC_ATTR_NO_SANITIZE_ADDR GC_ATTR_NO_SANITIZE_MEMORY GC_ATTR_NO_SANITIZE_THREAD
+GC_INNER mse * GC_mark_from(mse *mark_stack_top, mse *mark_stack,
+ mse *mark_stack_limit)
+{
+ signed_word credit = HBLKSIZE; /* Remaining credit for marking work. */
+ ptr_t current_p; /* Pointer to current candidate ptr. */
+ word current; /* Candidate pointer. */
+ ptr_t limit = 0; /* (Incl) limit of current candidate range. */
+ word descr;
+ ptr_t greatest_ha = (ptr_t)GC_greatest_plausible_heap_addr;
+ ptr_t least_ha = (ptr_t)GC_least_plausible_heap_addr;
+ DECLARE_HDR_CACHE;
+
+# define SPLIT_RANGE_WORDS 128 /* Must be power of 2. */
+
+ GC_objects_are_marked = TRUE;
+ INIT_HDR_CACHE;
+# ifdef OS2 /* Use untweaked version to circumvent compiler problem. */
+ while ((word)mark_stack_top >= (word)mark_stack && credit >= 0)
+# else
+ while (((((word)mark_stack_top - (word)mark_stack) | (word)credit)
+ & SIGNB) == 0)
+# endif
+ {
+ current_p = mark_stack_top -> mse_start;
+ descr = mark_stack_top -> mse_descr.w;
+ retry:
+ /* current_p and descr describe the current object. */
+ /* (*mark_stack_top) is vacant. */
+ /* The following is 0 only for small objects described by a simple */
+ /* length descriptor. For many applications this is the common */
+ /* case, so we try to detect it quickly. */
+ if (descr & (~(word)(WORDS_TO_BYTES(SPLIT_RANGE_WORDS)-1) | GC_DS_TAGS)) {
+ word tag = descr & GC_DS_TAGS;
+
+ GC_STATIC_ASSERT(GC_DS_TAGS == 0x3);
+ switch(tag) {
+ case GC_DS_LENGTH:
+ /* Large length. */
+ /* Process part of the range to avoid pushing too much on the */
+ /* stack. */
+ GC_ASSERT(descr < GC_greatest_real_heap_addr-GC_least_real_heap_addr
+ || (word)current_p + descr
+ <= GC_least_real_heap_addr + sizeof(word)
+ || (word)current_p >= GC_greatest_real_heap_addr);
+# ifdef PARALLEL_MARK
+# define SHARE_BYTES 2048
+ if (descr > SHARE_BYTES && GC_parallel
+ && (word)mark_stack_top < (word)(mark_stack_limit - 1)) {
+ word new_size = (descr/2) & ~(word)(sizeof(word)-1);
+
+ mark_stack_top -> mse_start = current_p;
+ mark_stack_top -> mse_descr.w = new_size + sizeof(word);
+ /* Makes sure we handle */
+ /* misaligned pointers. */
+ mark_stack_top++;
+# ifdef ENABLE_TRACE
+ if ((word)GC_trace_addr >= (word)current_p
+ && (word)GC_trace_addr < (word)(current_p + descr)) {
+ GC_log_printf("GC #%lu: large section; start %p, len %lu,"
+ " splitting (parallel) at %p\n",
+ (unsigned long)GC_gc_no, (void *)current_p,
+ (unsigned long)descr,
+ (void *)(current_p + new_size));
+ }
+# endif
+ current_p += new_size;
+ descr -= new_size;
+ goto retry;
+ }
+# endif /* PARALLEL_MARK */
+ mark_stack_top -> mse_start =
+ limit = current_p + WORDS_TO_BYTES(SPLIT_RANGE_WORDS-1);
+ mark_stack_top -> mse_descr.w =
+ descr - WORDS_TO_BYTES(SPLIT_RANGE_WORDS-1);
+# ifdef ENABLE_TRACE
+ if ((word)GC_trace_addr >= (word)current_p
+ && (word)GC_trace_addr < (word)(current_p + descr)) {
+ GC_log_printf("GC #%lu: large section; start %p, len %lu,"
+ " splitting at %p\n",
+ (unsigned long)GC_gc_no, (void *)current_p,
+ (unsigned long)descr, (void *)limit);
+ }
+# endif
+ /* Make sure that pointers overlapping the two ranges are */
+ /* considered. */
+ limit += sizeof(word) - ALIGNMENT;
+ break;
+ case GC_DS_BITMAP:
+ mark_stack_top--;
+# ifdef ENABLE_TRACE
+ if ((word)GC_trace_addr >= (word)current_p
+ && (word)GC_trace_addr < (word)(current_p
+ + WORDS_TO_BYTES(WORDSZ-2))) {
+ GC_log_printf("GC #%lu: tracing from %p bitmap descr %lu\n",
+ (unsigned long)GC_gc_no, (void *)current_p,
+ (unsigned long)descr);
+ }
+# endif /* ENABLE_TRACE */
+ descr &= ~(word)GC_DS_TAGS;
+ credit -= WORDS_TO_BYTES(WORDSZ/2); /* guess */
+ for (; descr != 0; descr <<= 1, current_p += sizeof(word)) {
+ if ((descr & SIGNB) == 0) continue;
+ LOAD_WORD_OR_CONTINUE(current, current_p);
+ FIXUP_POINTER(current);
+ if (current >= (word)least_ha && current < (word)greatest_ha) {
+ PREFETCH((ptr_t)current);
+# ifdef ENABLE_TRACE
+ if (GC_trace_addr == current_p) {
+ GC_log_printf("GC #%lu: considering(3) %p -> %p\n",
+ (unsigned long)GC_gc_no, (void *)current_p,
+ (void *)current);
+ }
+# endif /* ENABLE_TRACE */
+ PUSH_CONTENTS((ptr_t)current, mark_stack_top,
+ mark_stack_limit, current_p);
+ }
+ }
+ continue;
+ case GC_DS_PROC:
+ mark_stack_top--;
+# ifdef ENABLE_TRACE
+ if ((word)GC_trace_addr >= (word)current_p
+ && GC_base(current_p) != 0
+ && GC_base(current_p) == GC_base(GC_trace_addr)) {
+ GC_log_printf("GC #%lu: tracing from %p, proc descr %lu\n",
+ (unsigned long)GC_gc_no, (void *)current_p,
+ (unsigned long)descr);
+ }
+# endif /* ENABLE_TRACE */
+ credit -= GC_PROC_BYTES;
+ mark_stack_top = (*PROC(descr))((word *)current_p, mark_stack_top,
+ mark_stack_limit, ENV(descr));
+ continue;
+ case GC_DS_PER_OBJECT:
+ if ((signed_word)descr >= 0) {
+ /* Descriptor is in the object. */
+ descr = *(word *)(current_p + descr - GC_DS_PER_OBJECT);
+ } else {
+ /* Descriptor is in type descriptor pointed to by first */
+ /* word in object. */
+ ptr_t type_descr = *(ptr_t *)current_p;
+ /* type_descr is either a valid pointer to the descriptor */
+ /* structure, or this object was on a free list. */
+ /* If it was anything but the last object on the free list, */
+ /* we will misinterpret the next object on the free list as */
+ /* the type descriptor, and get a 0 GC descriptor, which */
+ /* is ideal. Unfortunately, we need to check for the last */
+ /* object case explicitly. */
+ if (EXPECT(0 == type_descr, FALSE)) {
+ mark_stack_top--;
+ continue;
+ }
+ descr = *(word *)(type_descr
+ - ((signed_word)descr + (GC_INDIR_PER_OBJ_BIAS
+ - GC_DS_PER_OBJECT)));
+ }
+ if (0 == descr) {
+ /* Can happen either because we generated a 0 descriptor */
+ /* or we saw a pointer to a free object. */
+ mark_stack_top--;
+ continue;
+ }
+ goto retry;
+ }
+ } else {
+ /* Small object with length descriptor. */
+ mark_stack_top--;
+# ifndef SMALL_CONFIG
+ if (descr < sizeof(word))
+ continue;
+# endif
+# ifdef ENABLE_TRACE
+ if ((word)GC_trace_addr >= (word)current_p
+ && (word)GC_trace_addr < (word)(current_p + descr)) {
+ GC_log_printf("GC #%lu: small object; start %p, len %lu\n",
+ (unsigned long)GC_gc_no, (void *)current_p,
+ (unsigned long)descr);
+ }
+# endif
+ limit = current_p + (word)descr;
+ }
+ /* The simple case in which we're scanning a range. */
+ GC_ASSERT(!((word)current_p & (ALIGNMENT-1)));
+ credit -= limit - current_p;
+ limit -= sizeof(word);
+ {
+# define PREF_DIST 4
+
+# if !defined(SMALL_CONFIG) && !defined(E2K)
+ word deferred;
+
+ /* Try to prefetch the next pointer to be examined ASAP. */
+ /* Empirically, this also seems to help slightly without */
+ /* prefetches, at least on linux/x86. Presumably this loop */
+ /* ends up with less register pressure, and gcc thus ends up */
+ /* generating slightly better code. Overall gcc code quality */
+ /* for this loop is still not great. */
+ for(;;) {
+ PREFETCH(limit - PREF_DIST*CACHE_LINE_SIZE);
+ GC_ASSERT((word)limit >= (word)current_p);
+ deferred = *(word *)limit;
+ FIXUP_POINTER(deferred);
+ limit -= ALIGNMENT;
+ if (deferred >= (word)least_ha && deferred < (word)greatest_ha) {
+ PREFETCH((ptr_t)deferred);
+ break;
+ }
+ if ((word)current_p > (word)limit) goto next_object;
+ /* Unroll once, so we don't do too many of the prefetches */
+ /* based on limit. */
+ deferred = *(word *)limit;
+ FIXUP_POINTER(deferred);
+ limit -= ALIGNMENT;
+ if (deferred >= (word)least_ha && deferred < (word)greatest_ha) {
+ PREFETCH((ptr_t)deferred);
+ break;
+ }
+ if ((word)current_p > (word)limit) goto next_object;
+ }
+# endif
+
+ for (; (word)current_p <= (word)limit; current_p += ALIGNMENT) {
+ /* Empirically, unrolling this loop doesn't help a lot. */
+ /* Since PUSH_CONTENTS expands to a lot of code, */
+ /* we don't. */
+ LOAD_WORD_OR_CONTINUE(current, current_p);
+ FIXUP_POINTER(current);
+ PREFETCH(current_p + PREF_DIST*CACHE_LINE_SIZE);
+ if (current >= (word)least_ha && current < (word)greatest_ha) {
+ /* Prefetch the contents of the object we just pushed. It's */
+ /* likely we will need them soon. */
+ PREFETCH((ptr_t)current);
+# ifdef ENABLE_TRACE
+ if (GC_trace_addr == current_p) {
+ GC_log_printf("GC #%lu: considering(1) %p -> %p\n",
+ (unsigned long)GC_gc_no, (void *)current_p,
+ (void *)current);
+ }
+# endif /* ENABLE_TRACE */
+ PUSH_CONTENTS((ptr_t)current, mark_stack_top,
+ mark_stack_limit, current_p);
+ }
+ }
+
+# if !defined(SMALL_CONFIG) && !defined(E2K)
+ /* We still need to mark the entry we previously prefetched. */
+ /* We already know that it passes the preliminary pointer */
+ /* validity test. */
+# ifdef ENABLE_TRACE
+ if (GC_trace_addr == current_p) {
+ GC_log_printf("GC #%lu: considering(2) %p -> %p\n",
+ (unsigned long)GC_gc_no, (void *)current_p,
+ (void *)deferred);
+ }
+# endif /* ENABLE_TRACE */
+ PUSH_CONTENTS((ptr_t)deferred, mark_stack_top,
+ mark_stack_limit, current_p);
+ next_object:;
+# endif
+ }
+ }
+ return mark_stack_top;
+}
+
+#ifdef PARALLEL_MARK
+
+STATIC GC_bool GC_help_wanted = FALSE; /* Protected by mark lock. */
+STATIC unsigned GC_helper_count = 0; /* Number of running helpers. */
+ /* Protected by mark lock. */
+STATIC unsigned GC_active_count = 0; /* Number of active helpers. */
+ /* Protected by mark lock. */
+ /* May increase and decrease */
+ /* within each mark cycle. But */
+ /* once it returns to 0, it */
+ /* stays zero for the cycle. */
+
+GC_INNER word GC_mark_no = 0;
+
+#ifdef LINT2
+# define LOCAL_MARK_STACK_SIZE (HBLKSIZE / 8)
+#else
+# define LOCAL_MARK_STACK_SIZE HBLKSIZE
+ /* Under normal circumstances, this is big enough to guarantee */
+ /* we don't overflow half of it in a single call to */
+ /* GC_mark_from. */
+#endif
+
+/* Wait all markers to finish initialization (i.e. store */
+/* marker_[b]sp, marker_mach_threads, GC_marker_Id). */
+GC_INNER void GC_wait_for_markers_init(void)
+{
+ signed_word count;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (GC_markers_m1 == 0)
+ return;
+
+ /* Allocate the local mark stack for the thread that holds GC lock. */
+# ifndef CAN_HANDLE_FORK
+ GC_ASSERT(NULL == GC_main_local_mark_stack);
+# else
+ if (NULL == GC_main_local_mark_stack)
+# endif
+ {
+ size_t bytes_to_get =
+ ROUNDUP_PAGESIZE_IF_MMAP(LOCAL_MARK_STACK_SIZE * sizeof(mse));
+
+ GC_ASSERT(GC_page_size != 0);
+ GC_main_local_mark_stack = (mse *)GET_MEM(bytes_to_get);
+ if (NULL == GC_main_local_mark_stack)
+ ABORT("Insufficient memory for main local_mark_stack");
+ GC_add_to_our_memory((ptr_t)GC_main_local_mark_stack, bytes_to_get);
+ }
+
+ /* Reuse marker lock and builders count to synchronize */
+ /* marker threads startup. */
+ GC_acquire_mark_lock();
+ GC_fl_builder_count += GC_markers_m1;
+ count = GC_fl_builder_count;
+ GC_release_mark_lock();
+ if (count != 0) {
+ GC_ASSERT(count > 0);
+ GC_wait_for_reclaim();
+ }
+}
+
+/* Steal mark stack entries starting at mse low into mark stack local */
+/* until we either steal mse high, or we have max entries. */
+/* Return a pointer to the top of the local mark stack. */
+/* (*next) is replaced by a pointer to the next unscanned mark stack */
+/* entry. */
+STATIC mse * GC_steal_mark_stack(mse * low, mse * high, mse * local,
+ unsigned max, mse **next)
+{
+ mse *p;
+ mse *top = local - 1;
+ unsigned i = 0;
+
+ GC_ASSERT((word)high >= (word)(low - 1)
+ && (word)(high - low + 1) <= GC_mark_stack_size);
+ for (p = low; (word)p <= (word)high && i <= max; ++p) {
+ word descr = (word)AO_load(&p->mse_descr.ao);
+ if (descr != 0) {
+ /* Must be ordered after read of descr: */
+ AO_store_release_write(&p->mse_descr.ao, 0);
+ /* More than one thread may get this entry, but that's only */
+ /* a minor performance problem. */
+ ++top;
+ top -> mse_descr.w = descr;
+ top -> mse_start = p -> mse_start;
+ GC_ASSERT((descr & GC_DS_TAGS) != GC_DS_LENGTH
+ || descr < GC_greatest_real_heap_addr-GC_least_real_heap_addr
+ || (word)(p -> mse_start + descr)
+ <= GC_least_real_heap_addr + sizeof(word)
+ || (word)(p -> mse_start) >= GC_greatest_real_heap_addr);
+ /* If this is a big object, count it as */
+ /* size/256 + 1 objects. */
+ ++i;
+ if ((descr & GC_DS_TAGS) == GC_DS_LENGTH) i += (int)(descr >> 8);
+ }
+ }
+ *next = p;
+ return top;
+}
+
+/* Copy back a local mark stack. */
+/* low and high are inclusive bounds. */
+STATIC void GC_return_mark_stack(mse * low, mse * high)
+{
+ mse * my_top;
+ mse * my_start;
+ size_t stack_size;
+
+ if ((word)high < (word)low) return;
+ stack_size = high - low + 1;
+ GC_acquire_mark_lock();
+ my_top = GC_mark_stack_top; /* Concurrent modification impossible. */
+ my_start = my_top + 1;
+ if ((word)(my_start - GC_mark_stack + stack_size)
+ > (word)GC_mark_stack_size) {
+ GC_COND_LOG_PRINTF("No room to copy back mark stack\n");
+ GC_mark_state = MS_INVALID;
+ GC_mark_stack_too_small = TRUE;
+ /* We drop the local mark stack. We'll fix things later. */
+ } else {
+ BCOPY(low, my_start, stack_size * sizeof(mse));
+ GC_ASSERT((mse *)AO_load((volatile AO_t *)(&GC_mark_stack_top))
+ == my_top);
+ AO_store_release_write((volatile AO_t *)(&GC_mark_stack_top),
+ (AO_t)(my_top + stack_size));
+ /* Ensures visibility of previously written stack contents. */
+ }
+ GC_release_mark_lock();
+ GC_notify_all_marker();
+}
+
+#ifndef N_LOCAL_ITERS
+# define N_LOCAL_ITERS 1
+#endif
+
+/* This function is only called when the local */
+/* and the main mark stacks are both empty. */
+static GC_bool has_inactive_helpers(void)
+{
+ GC_bool res;
+
+ GC_acquire_mark_lock();
+ res = GC_active_count < GC_helper_count;
+ GC_release_mark_lock();
+ return res;
+}
+
+/* Mark from the local mark stack. */
+/* On return, the local mark stack is empty. */
+/* But this may be achieved by copying the */
+/* local mark stack back into the global one. */
+/* We do not hold the mark lock. */
+STATIC void GC_do_local_mark(mse *local_mark_stack, mse *local_top)
+{
+ unsigned n;
+
+ for (;;) {
+ for (n = 0; n < N_LOCAL_ITERS; ++n) {
+ local_top = GC_mark_from(local_top, local_mark_stack,
+ local_mark_stack + LOCAL_MARK_STACK_SIZE);
+ if ((word)local_top < (word)local_mark_stack) return;
+ if ((word)(local_top - local_mark_stack)
+ >= LOCAL_MARK_STACK_SIZE / 2) {
+ GC_return_mark_stack(local_mark_stack, local_top);
+ return;
+ }
+ }
+ if ((word)AO_load((volatile AO_t *)&GC_mark_stack_top)
+ < (word)AO_load(&GC_first_nonempty)
+ && (word)local_top > (word)(local_mark_stack + 1)
+ && has_inactive_helpers()) {
+ /* Try to share the load, since the main stack is empty, */
+ /* and helper threads are waiting for a refill. */
+ /* The entries near the bottom of the stack are likely */
+ /* to require more work. Thus we return those, even though */
+ /* it's harder. */
+ mse * new_bottom = local_mark_stack
+ + (local_top - local_mark_stack)/2;
+ GC_ASSERT((word)new_bottom > (word)local_mark_stack
+ && (word)new_bottom < (word)local_top);
+ GC_return_mark_stack(local_mark_stack, new_bottom - 1);
+ memmove(local_mark_stack, new_bottom,
+ (local_top - new_bottom + 1) * sizeof(mse));
+ local_top -= (new_bottom - local_mark_stack);
+ }
+ }
+}
+
+#ifndef ENTRIES_TO_GET
+# define ENTRIES_TO_GET 5
+#endif
+
+/* Mark using the local mark stack until the global mark stack is empty */
+/* and there are no active workers. Update GC_first_nonempty to reflect */
+/* progress. Caller holds the mark lock. */
+/* Caller has already incremented GC_helper_count. We decrement it, */
+/* and maintain GC_active_count. */
+STATIC void GC_mark_local(mse *local_mark_stack, int id)
+{
+ mse * my_first_nonempty;
+
+ GC_active_count++;
+ my_first_nonempty = (mse *)AO_load(&GC_first_nonempty);
+ GC_ASSERT((word)GC_mark_stack <= (word)my_first_nonempty);
+ GC_ASSERT((word)my_first_nonempty
+ <= (word)AO_load((volatile AO_t *)&GC_mark_stack_top) + sizeof(mse));
+ GC_VERBOSE_LOG_PRINTF("Starting mark helper %d\n", id);
+ GC_release_mark_lock();
+ for (;;) {
+ size_t n_on_stack;
+ unsigned n_to_get;
+ mse * my_top;
+ mse * local_top;
+ mse * global_first_nonempty = (mse *)AO_load(&GC_first_nonempty);
+
+ GC_ASSERT((word)my_first_nonempty >= (word)GC_mark_stack &&
+ (word)my_first_nonempty <=
+ (word)AO_load((volatile AO_t *)&GC_mark_stack_top)
+ + sizeof(mse));
+ GC_ASSERT((word)global_first_nonempty >= (word)GC_mark_stack);
+ if ((word)my_first_nonempty < (word)global_first_nonempty) {
+ my_first_nonempty = global_first_nonempty;
+ } else if ((word)global_first_nonempty < (word)my_first_nonempty) {
+ (void)AO_compare_and_swap(&GC_first_nonempty,
+ (AO_t)global_first_nonempty,
+ (AO_t)my_first_nonempty);
+ /* If this fails, we just go ahead, without updating */
+ /* GC_first_nonempty. */
+ }
+ /* Perhaps we should also update GC_first_nonempty, if it */
+ /* is less. But that would require using atomic updates. */
+ my_top = (mse *)AO_load_acquire((volatile AO_t *)(&GC_mark_stack_top));
+ if ((word)my_top < (word)my_first_nonempty) {
+ GC_acquire_mark_lock();
+ my_top = GC_mark_stack_top;
+ /* Asynchronous modification impossible here, */
+ /* since we hold mark lock. */
+ n_on_stack = my_top - my_first_nonempty + 1;
+ if (0 == n_on_stack) {
+ GC_active_count--;
+ GC_ASSERT(GC_active_count <= GC_helper_count);
+ /* Other markers may redeposit objects */
+ /* on the stack. */
+ if (0 == GC_active_count) GC_notify_all_marker();
+ while (GC_active_count > 0
+ && (word)AO_load(&GC_first_nonempty)
+ > (word)GC_mark_stack_top) {
+ /* We will be notified if either GC_active_count */
+ /* reaches zero, or if more objects are pushed on */
+ /* the global mark stack. */
+ GC_wait_marker();
+ }
+ if (GC_active_count == 0
+ && (word)AO_load(&GC_first_nonempty)
+ > (word)GC_mark_stack_top) {
+ GC_bool need_to_notify = FALSE;
+ /* The above conditions can't be falsified while we */
+ /* hold the mark lock, since neither */
+ /* GC_active_count nor GC_mark_stack_top can */
+ /* change. GC_first_nonempty can only be */
+ /* incremented asynchronously. Thus we know that */
+ /* both conditions actually held simultaneously. */
+ GC_helper_count--;
+ if (0 == GC_helper_count) need_to_notify = TRUE;
+ GC_VERBOSE_LOG_PRINTF("Finished mark helper %d\n", id);
+ if (need_to_notify) GC_notify_all_marker();
+ return;
+ }
+ /* Else there's something on the stack again, or */
+ /* another helper may push something. */
+ GC_active_count++;
+ GC_ASSERT(GC_active_count > 0);
+ GC_release_mark_lock();
+ continue;
+ } else {
+ GC_release_mark_lock();
+ }
+ } else {
+ n_on_stack = my_top - my_first_nonempty + 1;
+ }
+ n_to_get = ENTRIES_TO_GET;
+ if (n_on_stack < 2 * ENTRIES_TO_GET) n_to_get = 1;
+ local_top = GC_steal_mark_stack(my_first_nonempty, my_top,
+ local_mark_stack, n_to_get,
+ &my_first_nonempty);
+ GC_ASSERT((word)my_first_nonempty >= (word)GC_mark_stack &&
+ (word)my_first_nonempty <=
+ (word)AO_load((volatile AO_t *)&GC_mark_stack_top)
+ + sizeof(mse));
+ GC_do_local_mark(local_mark_stack, local_top);
+ }
+}
+
+/* Perform Parallel mark. */
+/* We hold the GC lock, not the mark lock. */
+/* Currently runs until the mark stack is */
+/* empty. */
+STATIC void GC_do_parallel_mark(void)
+{
+ GC_acquire_mark_lock();
+ GC_ASSERT(I_HOLD_LOCK());
+ /* This could be a GC_ASSERT, but it seems safer to keep it on */
+ /* all the time, especially since it's cheap. */
+ if (GC_help_wanted || GC_active_count != 0 || GC_helper_count != 0)
+ ABORT("Tried to start parallel mark in bad state");
+ GC_VERBOSE_LOG_PRINTF("Starting marking for mark phase number %lu\n",
+ (unsigned long)GC_mark_no);
+ AO_store(&GC_first_nonempty, (AO_t)GC_mark_stack);
+ GC_active_count = 0;
+ GC_helper_count = 1;
+ GC_help_wanted = TRUE;
+ GC_notify_all_marker();
+ /* Wake up potential helpers. */
+ GC_mark_local(GC_main_local_mark_stack, 0);
+ GC_help_wanted = FALSE;
+ /* Done; clean up. */
+ while (GC_helper_count > 0) {
+ GC_wait_marker();
+ }
+ /* GC_helper_count cannot be incremented while not GC_help_wanted. */
+ GC_VERBOSE_LOG_PRINTF("Finished marking for mark phase number %lu\n",
+ (unsigned long)GC_mark_no);
+ GC_mark_no++;
+ GC_release_mark_lock();
+ GC_notify_all_marker();
+}
+
+
+/* Try to help out the marker, if it's running. */
+/* We do not hold the GC lock, but the requestor does. */
+/* And we hold the mark lock. */
+GC_INNER void GC_help_marker(word my_mark_no)
+{
+# define my_id my_id_mse.mse_descr.w
+ mse my_id_mse; /* align local_mark_stack explicitly */
+ mse local_mark_stack[LOCAL_MARK_STACK_SIZE];
+ /* Note: local_mark_stack is quite big (up to 128 KiB). */
+
+ GC_ASSERT(GC_parallel);
+ while (GC_mark_no < my_mark_no
+ || (!GC_help_wanted && GC_mark_no == my_mark_no)) {
+ GC_wait_marker();
+ }
+ my_id = GC_helper_count;
+ if (GC_mark_no != my_mark_no || my_id > (unsigned)GC_markers_m1) {
+ /* Second test is useful only if original threads can also */
+ /* act as helpers. Under Linux they can't. */
+ return;
+ }
+ GC_helper_count = (unsigned)my_id + 1;
+ GC_mark_local(local_mark_stack, (int)my_id);
+ /* GC_mark_local decrements GC_helper_count. */
+# undef my_id
+}
+
+#endif /* PARALLEL_MARK */
+
+/* Allocate or reallocate space for mark stack of size n entries. */
+/* May silently fail. */
+static void alloc_mark_stack(size_t n)
+{
+ mse * new_stack = (mse *)GC_scratch_alloc(n * sizeof(struct GC_ms_entry));
+# ifdef GWW_VDB
+ /* Don't recycle a stack segment obtained with the wrong flags. */
+ /* Win32 GetWriteWatch requires the right kind of memory. */
+ static GC_bool GC_incremental_at_stack_alloc = FALSE;
+ GC_bool recycle_old = !GC_auto_incremental
+ || GC_incremental_at_stack_alloc;
+
+ GC_incremental_at_stack_alloc = GC_auto_incremental;
+# else
+# define recycle_old TRUE
+# endif
+
+ GC_mark_stack_too_small = FALSE;
+ if (GC_mark_stack != NULL) {
+ if (new_stack != 0) {
+ if (recycle_old) {
+ /* Recycle old space. */
+ GC_scratch_recycle_inner(GC_mark_stack,
+ GC_mark_stack_size * sizeof(struct GC_ms_entry));
+ }
+ GC_mark_stack = new_stack;
+ GC_mark_stack_size = n;
+ /* FIXME: Do we need some way to reset GC_mark_stack_size? */
+ GC_mark_stack_limit = new_stack + n;
+ GC_COND_LOG_PRINTF("Grew mark stack to %lu frames\n",
+ (unsigned long)GC_mark_stack_size);
+ } else {
+ WARN("Failed to grow mark stack to %" WARN_PRIuPTR " frames\n", n);
+ }
+ } else if (NULL == new_stack) {
+ GC_err_printf("No space for mark stack\n");
+ EXIT();
+ } else {
+ GC_mark_stack = new_stack;
+ GC_mark_stack_size = n;
+ GC_mark_stack_limit = new_stack + n;
+ }
+ GC_mark_stack_top = GC_mark_stack-1;
+}
+
+GC_INNER void GC_mark_init(void)
+{
+ alloc_mark_stack(INITIAL_MARK_STACK_SIZE);
+}
+
+/*
+ * Push all locations between b and t onto the mark stack.
+ * b is the first location to be checked. t is one past the last
+ * location to be checked.
+ * Should only be used if there is no possibility of mark stack
+ * overflow.
+ */
+GC_API void GC_CALL GC_push_all(void *bottom, void *top)
+{
+ word length;
+
+ bottom = (void *)(((word)bottom + ALIGNMENT-1) & ~(word)(ALIGNMENT-1));
+ top = (void *)((word)top & ~(word)(ALIGNMENT-1));
+ if ((word)bottom >= (word)top) return;
+
+ GC_mark_stack_top++;
+ if ((word)GC_mark_stack_top >= (word)GC_mark_stack_limit) {
+ ABORT("Unexpected mark stack overflow");
+ }
+ length = (word)top - (word)bottom;
+# if GC_DS_TAGS > ALIGNMENT - 1
+ length += GC_DS_TAGS;
+ length &= ~(word)GC_DS_TAGS;
+# endif
+ GC_mark_stack_top -> mse_start = (ptr_t)bottom;
+ GC_mark_stack_top -> mse_descr.w = length;
+}
+
+#ifndef GC_DISABLE_INCREMENTAL
+
+ /* Analogous to the above, but push only those pages h with */
+ /* dirty_fn(h) != 0. We use GC_push_all to actually push the block. */
+ /* Used both to selectively push dirty pages, or to push a block in */
+ /* piecemeal fashion, to allow for more marking concurrency. */
+ /* Will not overflow mark stack if GC_push_all pushes a small fixed */
+ /* number of entries. (This is invoked only if GC_push_all pushes */
+ /* a single entry, or if it marks each object before pushing it, thus */
+ /* ensuring progress in the event of a stack overflow.) */
+ STATIC void GC_push_selected(ptr_t bottom, ptr_t top,
+ GC_bool (*dirty_fn)(struct hblk *))
+ {
+ struct hblk * h;
+
+ bottom = (ptr_t)(((word)bottom + ALIGNMENT-1) & ~(word)(ALIGNMENT-1));
+ top = (ptr_t)((word)top & ~(word)(ALIGNMENT-1));
+ if ((word)bottom >= (word)top) return;
+
+ h = HBLKPTR(bottom + HBLKSIZE);
+ if ((word)top <= (word)h) {
+ if ((*dirty_fn)(h-1)) {
+ GC_push_all(bottom, top);
+ }
+ return;
+ }
+ if ((*dirty_fn)(h-1)) {
+ if ((word)(GC_mark_stack_top - GC_mark_stack)
+ > 3 * GC_mark_stack_size / 4) {
+ GC_push_all(bottom, top);
+ return;
+ }
+ GC_push_all(bottom, h);
+ }
+
+ while ((word)(h+1) <= (word)top) {
+ if ((*dirty_fn)(h)) {
+ if ((word)(GC_mark_stack_top - GC_mark_stack)
+ > 3 * GC_mark_stack_size / 4) {
+ /* Danger of mark stack overflow. */
+ GC_push_all(h, top);
+ return;
+ } else {
+ GC_push_all(h, h + 1);
+ }
+ }
+ h++;
+ }
+
+ if ((ptr_t)h != top && (*dirty_fn)(h)) {
+ GC_push_all(h, top);
+ }
+ }
+
+ GC_API void GC_CALL GC_push_conditional(void *bottom, void *top, int all)
+ {
+ if (!all) {
+ GC_push_selected((ptr_t)bottom, (ptr_t)top, GC_page_was_dirty);
+ } else {
+# ifdef PROC_VDB
+ if (GC_auto_incremental) {
+ /* Pages that were never dirtied cannot contain pointers. */
+ GC_push_selected((ptr_t)bottom, (ptr_t)top, GC_page_was_ever_dirty);
+ } else
+# endif
+ /* else */ {
+ GC_push_all(bottom, top);
+ }
+ }
+ }
+
+# ifndef NO_VDB_FOR_STATIC_ROOTS
+# ifndef PROC_VDB
+ /* Same as GC_page_was_dirty but h is allowed to point to some */
+ /* page in the registered static roots only. Not used if */
+ /* manual VDB is on. */
+ STATIC GC_bool GC_static_page_was_dirty(struct hblk *h)
+ {
+ return get_pht_entry_from_index(GC_grungy_pages, PHT_HASH(h));
+ }
+# endif
+
+ GC_INNER void GC_push_conditional_static(void *bottom, void *top,
+ GC_bool all)
+ {
+# ifdef PROC_VDB
+ /* Just redirect to the generic routine because PROC_VDB */
+ /* implementation gets the dirty bits map for the whole */
+ /* process memory. */
+ GC_push_conditional(bottom, top, all);
+# else
+ if (all || !GC_is_vdb_for_static_roots()) {
+ GC_push_all(bottom, top);
+ } else {
+ GC_push_selected((ptr_t)bottom, (ptr_t)top,
+ GC_static_page_was_dirty);
+ }
+# endif
+ }
+# endif /* !NO_VDB_FOR_STATIC_ROOTS */
+
+#else
+ GC_API void GC_CALL GC_push_conditional(void *bottom, void *top,
+ int all GC_ATTR_UNUSED)
+ {
+ GC_push_all(bottom, top);
+ }
+#endif /* GC_DISABLE_INCREMENTAL */
+
+#if defined(AMIGA) || defined(MACOS) || defined(GC_DARWIN_THREADS)
+ void GC_push_one(word p)
+ {
+ GC_PUSH_ONE_STACK(p, MARKED_FROM_REGISTER);
+ }
+#endif
+
+#ifdef GC_WIN32_THREADS
+ GC_INNER void GC_push_many_regs(const word *regs, unsigned count)
+ {
+ unsigned i;
+ for (i = 0; i < count; i++)
+ GC_PUSH_ONE_STACK(regs[i], MARKED_FROM_REGISTER);
+ }
+#endif
+
+GC_API struct GC_ms_entry * GC_CALL GC_mark_and_push(void *obj,
+ mse *mark_stack_ptr, mse *mark_stack_limit, void **src)
+{
+ hdr * hhdr;
+
+ PREFETCH(obj);
+ GET_HDR(obj, hhdr);
+ if ((EXPECT(IS_FORWARDING_ADDR_OR_NIL(hhdr), FALSE)
+ && (!GC_all_interior_pointers
+ || NULL == (hhdr = GC_find_header((ptr_t)GC_base(obj)))))
+ || EXPECT(HBLK_IS_FREE(hhdr), FALSE)) {
+ GC_ADD_TO_BLACK_LIST_NORMAL(obj, (ptr_t)src);
+ return mark_stack_ptr;
+ }
+ return GC_push_contents_hdr((ptr_t)obj, mark_stack_ptr, mark_stack_limit,
+ (ptr_t)src, hhdr, TRUE);
+}
+
+/* Mark and push (i.e. gray) a single object p onto the main */
+/* mark stack. Consider p to be valid if it is an interior */
+/* pointer. */
+/* The object p has passed a preliminary pointer validity */
+/* test, but we do not definitely know whether it is valid. */
+/* Mark bits are NOT atomically updated. Thus this must be the */
+/* only thread setting them. */
+GC_ATTR_NO_SANITIZE_ADDR
+GC_INNER void
+# if defined(PRINT_BLACK_LIST) || defined(KEEP_BACK_PTRS)
+ GC_mark_and_push_stack(ptr_t p, ptr_t source)
+# else
+ GC_mark_and_push_stack(ptr_t p)
+# define source ((ptr_t)0)
+# endif
+{
+ hdr * hhdr;
+ ptr_t r = p;
+
+ PREFETCH(p);
+ GET_HDR(p, hhdr);
+ if (EXPECT(IS_FORWARDING_ADDR_OR_NIL(hhdr), FALSE)) {
+ if (NULL == hhdr
+ || (r = (ptr_t)GC_base(p)) == NULL
+ || (hhdr = HDR(r)) == NULL) {
+ GC_ADD_TO_BLACK_LIST_STACK(p, source);
+ return;
+ }
+ }
+ if (EXPECT(HBLK_IS_FREE(hhdr), FALSE)) {
+ GC_ADD_TO_BLACK_LIST_NORMAL(p, source);
+ return;
+ }
+# ifdef THREADS
+ /* Pointer is on the stack. We may have dirtied the object */
+ /* it points to, but have not called GC_dirty yet. */
+ GC_dirty(p); /* entire object */
+# endif
+ GC_mark_stack_top = GC_push_contents_hdr(r, GC_mark_stack_top,
+ GC_mark_stack_limit,
+ source, hhdr, FALSE);
+ /* We silently ignore pointers to near the end of a block, */
+ /* which is very mildly suboptimal. */
+ /* FIXME: We should probably add a header word to address */
+ /* this. */
+}
+# undef source
+
+#ifdef TRACE_BUF
+
+# ifndef TRACE_ENTRIES
+# define TRACE_ENTRIES 1000
+# endif
+
+struct trace_entry {
+ char * kind;
+ word gc_no;
+ word bytes_allocd;
+ word arg1;
+ word arg2;
+} GC_trace_buf[TRACE_ENTRIES] = { { NULL, 0, 0, 0, 0 } };
+
+void GC_add_trace_entry(char *kind, word arg1, word arg2)
+{
+ GC_trace_buf[GC_trace_buf_ptr].kind = kind;
+ GC_trace_buf[GC_trace_buf_ptr].gc_no = GC_gc_no;
+ GC_trace_buf[GC_trace_buf_ptr].bytes_allocd = GC_bytes_allocd;
+ GC_trace_buf[GC_trace_buf_ptr].arg1 = arg1 ^ 0x80000000;
+ GC_trace_buf[GC_trace_buf_ptr].arg2 = arg2 ^ 0x80000000;
+ GC_trace_buf_ptr++;
+ if (GC_trace_buf_ptr >= TRACE_ENTRIES) GC_trace_buf_ptr = 0;
+}
+
+GC_API void GC_CALL GC_print_trace_inner(GC_word gc_no)
+{
+ int i;
+
+ for (i = GC_trace_buf_ptr-1;; i--) {
+ struct trace_entry *p;
+
+ if (i < 0) i = TRACE_ENTRIES-1;
+ p = GC_trace_buf + i;
+ /* Compare gc_no values (p->gc_no is less than given gc_no) */
+ /* taking into account that the counter may overflow. */
+ if ((((p -> gc_no) - gc_no) & SIGNB) != 0 || p -> kind == 0) {
+ return;
+ }
+ GC_printf("Trace:%s (gc:%u, bytes:%lu) 0x%lX, 0x%lX\n",
+ p -> kind, (unsigned)(p -> gc_no),
+ (unsigned long)(p -> bytes_allocd),
+ (long)p->arg1 ^ 0x80000000L, (long)p->arg2 ^ 0x80000000L);
+ if (i == GC_trace_buf_ptr) break;
+ }
+ GC_printf("Trace incomplete\n");
+}
+
+GC_API void GC_CALL GC_print_trace(GC_word gc_no)
+{
+ DCL_LOCK_STATE;
+
+ LOCK();
+ GC_print_trace_inner(gc_no);
+ UNLOCK();
+}
+
+#endif /* TRACE_BUF */
+
+/* A version of GC_push_all that treats all interior pointers as valid */
+/* and scans the entire region immediately, in case the contents change.*/
+GC_ATTR_NO_SANITIZE_ADDR GC_ATTR_NO_SANITIZE_MEMORY GC_ATTR_NO_SANITIZE_THREAD
+GC_API void GC_CALL GC_push_all_eager(void *bottom, void *top)
+{
+ word * b = (word *)(((word) bottom + ALIGNMENT-1) & ~(word)(ALIGNMENT-1));
+ word * t = (word *)(((word) top) & ~(word)(ALIGNMENT-1));
+ REGISTER word *p;
+ REGISTER word *lim;
+ REGISTER ptr_t greatest_ha = (ptr_t)GC_greatest_plausible_heap_addr;
+ REGISTER ptr_t least_ha = (ptr_t)GC_least_plausible_heap_addr;
+# define GC_greatest_plausible_heap_addr greatest_ha
+# define GC_least_plausible_heap_addr least_ha
+
+ if (top == 0) return;
+
+ /* Check all pointers in range and push if they appear to be valid. */
+ lim = t - 1 /* longword */;
+ for (p = b; (word)p <= (word)lim;
+ p = (word *)(((ptr_t)p) + ALIGNMENT)) {
+ REGISTER word q;
+
+ LOAD_WORD_OR_CONTINUE(q, p);
+ GC_PUSH_ONE_STACK(q, p);
+ }
+# undef GC_greatest_plausible_heap_addr
+# undef GC_least_plausible_heap_addr
+}
+
+GC_INNER void GC_push_all_stack(ptr_t bottom, ptr_t top)
+{
+# ifndef NEED_FIXUP_POINTER
+ if (GC_all_interior_pointers
+# if defined(THREADS) && defined(MPROTECT_VDB)
+ && !GC_auto_incremental
+# endif
+ && (word)GC_mark_stack_top
+ < (word)(GC_mark_stack_limit - INITIAL_MARK_STACK_SIZE/8)) {
+ GC_push_all(bottom, top);
+ } else
+# endif
+ /* else */ {
+ GC_push_all_eager(bottom, top);
+ }
+}
+
+#if defined(WRAP_MARK_SOME) && defined(PARALLEL_MARK)
+ /* Similar to GC_push_conditional but scans the whole region immediately. */
+ GC_ATTR_NO_SANITIZE_ADDR GC_ATTR_NO_SANITIZE_MEMORY
+ GC_ATTR_NO_SANITIZE_THREAD
+ GC_INNER void GC_push_conditional_eager(void *bottom, void *top,
+ GC_bool all)
+ {
+ word * b = (word *)(((word) bottom + ALIGNMENT-1) & ~(word)(ALIGNMENT-1));
+ word * t = (word *)(((word) top) & ~(word)(ALIGNMENT-1));
+ REGISTER word *p;
+ REGISTER word *lim;
+ REGISTER ptr_t greatest_ha = (ptr_t)GC_greatest_plausible_heap_addr;
+ REGISTER ptr_t least_ha = (ptr_t)GC_least_plausible_heap_addr;
+# define GC_greatest_plausible_heap_addr greatest_ha
+# define GC_least_plausible_heap_addr least_ha
+
+ if (top == NULL)
+ return;
+ (void)all; /* TODO: If !all then scan only dirty pages. */
+
+ lim = t - 1;
+ for (p = b; (word)p <= (word)lim; p = (word *)((ptr_t)p + ALIGNMENT)) {
+ REGISTER word q = *p;
+
+ GC_PUSH_ONE_HEAP(q, p, GC_mark_stack_top);
+ }
+# undef GC_greatest_plausible_heap_addr
+# undef GC_least_plausible_heap_addr
+ }
+#endif /* WRAP_MARK_SOME && PARALLEL_MARK */
+
+#if !defined(SMALL_CONFIG) && !defined(USE_MARK_BYTES) && \
+ defined(MARK_BIT_PER_GRANULE)
+# if GC_GRANULE_WORDS == 1
+# define USE_PUSH_MARKED_ACCELERATORS
+# define PUSH_GRANULE(q) \
+ do { \
+ word qcontents = (q)[0]; \
+ GC_PUSH_ONE_HEAP(qcontents, q, GC_mark_stack_top); \
+ } while (0)
+# elif GC_GRANULE_WORDS == 2
+# define USE_PUSH_MARKED_ACCELERATORS
+# define PUSH_GRANULE(q) \
+ do { \
+ word qcontents = (q)[0]; \
+ GC_PUSH_ONE_HEAP(qcontents, q, GC_mark_stack_top); \
+ qcontents = (q)[1]; \
+ GC_PUSH_ONE_HEAP(qcontents, (q)+1, GC_mark_stack_top); \
+ } while (0)
+# elif GC_GRANULE_WORDS == 4
+# define USE_PUSH_MARKED_ACCELERATORS
+# define PUSH_GRANULE(q) \
+ do { \
+ word qcontents = (q)[0]; \
+ GC_PUSH_ONE_HEAP(qcontents, q, GC_mark_stack_top); \
+ qcontents = (q)[1]; \
+ GC_PUSH_ONE_HEAP(qcontents, (q)+1, GC_mark_stack_top); \
+ qcontents = (q)[2]; \
+ GC_PUSH_ONE_HEAP(qcontents, (q)+2, GC_mark_stack_top); \
+ qcontents = (q)[3]; \
+ GC_PUSH_ONE_HEAP(qcontents, (q)+3, GC_mark_stack_top); \
+ } while (0)
+# endif
+#endif /* !USE_MARK_BYTES && MARK_BIT_PER_GRANULE */
+
+#ifdef USE_PUSH_MARKED_ACCELERATORS
+/* Push all objects reachable from marked objects in the given block */
+/* containing objects of size 1 granule. */
+GC_ATTR_NO_SANITIZE_THREAD
+STATIC void GC_push_marked1(struct hblk *h, hdr *hhdr)
+{
+ word * mark_word_addr = &(hhdr->hb_marks[0]);
+ word *p;
+ word *plim;
+
+ /* Allow registers to be used for some frequently accessed */
+ /* global variables. Otherwise aliasing issues are likely */
+ /* to prevent that. */
+ ptr_t greatest_ha = (ptr_t)GC_greatest_plausible_heap_addr;
+ ptr_t least_ha = (ptr_t)GC_least_plausible_heap_addr;
+ mse * mark_stack_top = GC_mark_stack_top;
+ mse * mark_stack_limit = GC_mark_stack_limit;
+
+# undef GC_mark_stack_top
+# undef GC_mark_stack_limit
+# define GC_mark_stack_top mark_stack_top
+# define GC_mark_stack_limit mark_stack_limit
+# define GC_greatest_plausible_heap_addr greatest_ha
+# define GC_least_plausible_heap_addr least_ha
+
+ p = (word *)(h->hb_body);
+ plim = (word *)(((word)h) + HBLKSIZE);
+
+ /* Go through all words in block. */
+ while ((word)p < (word)plim) {
+ word mark_word = *mark_word_addr++;
+ word *q = p;
+
+ while(mark_word != 0) {
+ if (mark_word & 1) {
+ PUSH_GRANULE(q);
+ }
+ q += GC_GRANULE_WORDS;
+ mark_word >>= 1;
+ }
+ p += WORDSZ*GC_GRANULE_WORDS;
+ }
+
+# undef GC_greatest_plausible_heap_addr
+# undef GC_least_plausible_heap_addr
+# undef GC_mark_stack_top
+# undef GC_mark_stack_limit
+# define GC_mark_stack_limit GC_arrays._mark_stack_limit
+# define GC_mark_stack_top GC_arrays._mark_stack_top
+ GC_mark_stack_top = mark_stack_top;
+}
+
+
+#ifndef UNALIGNED_PTRS
+
+/* Push all objects reachable from marked objects in the given block */
+/* of size 2 (granules) objects. */
+GC_ATTR_NO_SANITIZE_THREAD
+STATIC void GC_push_marked2(struct hblk *h, hdr *hhdr)
+{
+ word * mark_word_addr = &(hhdr->hb_marks[0]);
+ word *p;
+ word *plim;
+
+ ptr_t greatest_ha = (ptr_t)GC_greatest_plausible_heap_addr;
+ ptr_t least_ha = (ptr_t)GC_least_plausible_heap_addr;
+ mse * mark_stack_top = GC_mark_stack_top;
+ mse * mark_stack_limit = GC_mark_stack_limit;
+
+# undef GC_mark_stack_top
+# undef GC_mark_stack_limit
+# define GC_mark_stack_top mark_stack_top
+# define GC_mark_stack_limit mark_stack_limit
+# define GC_greatest_plausible_heap_addr greatest_ha
+# define GC_least_plausible_heap_addr least_ha
+
+ p = (word *)(h->hb_body);
+ plim = (word *)(((word)h) + HBLKSIZE);
+
+ /* Go through all words in block. */
+ while ((word)p < (word)plim) {
+ word mark_word = *mark_word_addr++;
+ word *q = p;
+
+ while(mark_word != 0) {
+ if (mark_word & 1) {
+ PUSH_GRANULE(q);
+ PUSH_GRANULE(q + GC_GRANULE_WORDS);
+ }
+ q += 2 * GC_GRANULE_WORDS;
+ mark_word >>= 2;
+ }
+ p += WORDSZ*GC_GRANULE_WORDS;
+ }
+
+# undef GC_greatest_plausible_heap_addr
+# undef GC_least_plausible_heap_addr
+# undef GC_mark_stack_top
+# undef GC_mark_stack_limit
+# define GC_mark_stack_limit GC_arrays._mark_stack_limit
+# define GC_mark_stack_top GC_arrays._mark_stack_top
+ GC_mark_stack_top = mark_stack_top;
+}
+
+# if GC_GRANULE_WORDS < 4
+/* Push all objects reachable from marked objects in the given block */
+/* of size 4 (granules) objects. */
+/* There is a risk of mark stack overflow here. But we handle that. */
+/* And only unmarked objects get pushed, so it's not very likely. */
+GC_ATTR_NO_SANITIZE_THREAD
+STATIC void GC_push_marked4(struct hblk *h, hdr *hhdr)
+{
+ word * mark_word_addr = &(hhdr->hb_marks[0]);
+ word *p;
+ word *plim;
+
+ ptr_t greatest_ha = (ptr_t)GC_greatest_plausible_heap_addr;
+ ptr_t least_ha = (ptr_t)GC_least_plausible_heap_addr;
+ mse * mark_stack_top = GC_mark_stack_top;
+ mse * mark_stack_limit = GC_mark_stack_limit;
+
+# undef GC_mark_stack_top
+# undef GC_mark_stack_limit
+# define GC_mark_stack_top mark_stack_top
+# define GC_mark_stack_limit mark_stack_limit
+# define GC_greatest_plausible_heap_addr greatest_ha
+# define GC_least_plausible_heap_addr least_ha
+
+ p = (word *)(h->hb_body);
+ plim = (word *)(((word)h) + HBLKSIZE);
+
+ /* Go through all words in block. */
+ while ((word)p < (word)plim) {
+ word mark_word = *mark_word_addr++;
+ word *q = p;
+
+ while(mark_word != 0) {
+ if (mark_word & 1) {
+ PUSH_GRANULE(q);
+ PUSH_GRANULE(q + GC_GRANULE_WORDS);
+ PUSH_GRANULE(q + 2*GC_GRANULE_WORDS);
+ PUSH_GRANULE(q + 3*GC_GRANULE_WORDS);
+ }
+ q += 4 * GC_GRANULE_WORDS;
+ mark_word >>= 4;
+ }
+ p += WORDSZ*GC_GRANULE_WORDS;
+ }
+# undef GC_greatest_plausible_heap_addr
+# undef GC_least_plausible_heap_addr
+# undef GC_mark_stack_top
+# undef GC_mark_stack_limit
+# define GC_mark_stack_limit GC_arrays._mark_stack_limit
+# define GC_mark_stack_top GC_arrays._mark_stack_top
+ GC_mark_stack_top = mark_stack_top;
+}
+
+#endif /* GC_GRANULE_WORDS < 4 */
+
+#endif /* UNALIGNED_PTRS */
+
+#endif /* USE_PUSH_MARKED_ACCELERATORS */
+
+/* Push all objects reachable from marked objects in the given block. */
+STATIC void GC_push_marked(struct hblk *h, hdr *hhdr)
+{
+ word sz = hhdr -> hb_sz;
+ word descr = hhdr -> hb_descr;
+ ptr_t p;
+ word bit_no;
+ ptr_t lim;
+ mse * GC_mark_stack_top_reg;
+ mse * mark_stack_limit = GC_mark_stack_limit;
+
+ /* Some quick shortcuts: */
+ if ((/* 0 | */ GC_DS_LENGTH) == descr) return;
+ if (GC_block_empty(hhdr)/* nothing marked */) return;
+# if !defined(GC_DISABLE_INCREMENTAL)
+ GC_n_rescuing_pages++;
+# endif
+ GC_objects_are_marked = TRUE;
+ if (sz > MAXOBJBYTES) {
+ lim = h -> hb_body;
+ } else {
+ lim = (ptr_t)((word)(h + 1)->hb_body - sz);
+ }
+
+ switch(BYTES_TO_GRANULES(sz)) {
+# if defined(USE_PUSH_MARKED_ACCELERATORS)
+ case 1:
+ GC_push_marked1(h, hhdr);
+ break;
+# if !defined(UNALIGNED_PTRS)
+ case 2:
+ GC_push_marked2(h, hhdr);
+ break;
+# if GC_GRANULE_WORDS < 4
+ case 4:
+ GC_push_marked4(h, hhdr);
+ break;
+# endif
+# endif
+# else
+ case 1: /* to suppress "switch statement contains no case" warning */
+# endif
+ default:
+ GC_mark_stack_top_reg = GC_mark_stack_top;
+ for (p = h -> hb_body, bit_no = 0; (word)p <= (word)lim;
+ p += sz, bit_no += MARK_BIT_OFFSET(sz)) {
+ if (mark_bit_from_hdr(hhdr, bit_no)) {
+ /* Mark from fields inside the object. */
+ GC_mark_stack_top_reg = GC_push_obj(p, hhdr, GC_mark_stack_top_reg,
+ mark_stack_limit);
+ }
+ }
+ GC_mark_stack_top = GC_mark_stack_top_reg;
+ }
+}
+
+#ifdef ENABLE_DISCLAIM
+/* Unconditionally mark from all objects which have not been reclaimed. */
+/* This is useful in order to retain pointers which are reachable from */
+/* the disclaim notifiers. */
+/* To determine whether an object has been reclaimed, we require that */
+/* any live object has a non-zero as one of the two lowest bits of the */
+/* first word. On the other hand, a reclaimed object is a member of */
+/* free-lists, and thus contains a word-aligned next-pointer as the */
+/* first word. */
+ GC_ATTR_NO_SANITIZE_THREAD
+ STATIC void GC_push_unconditionally(struct hblk *h, hdr *hhdr)
+ {
+ word sz = hhdr -> hb_sz;
+ word descr = hhdr -> hb_descr;
+ ptr_t p;
+ ptr_t lim;
+ mse * GC_mark_stack_top_reg;
+ mse * mark_stack_limit = GC_mark_stack_limit;
+
+ if ((/* 0 | */ GC_DS_LENGTH) == descr)
+ return;
+
+# if !defined(GC_DISABLE_INCREMENTAL)
+ GC_n_rescuing_pages++;
+# endif
+ GC_objects_are_marked = TRUE;
+ if (sz > MAXOBJBYTES)
+ lim = h -> hb_body;
+ else
+ lim = (ptr_t)((word)(h + 1)->hb_body - sz);
+
+ GC_mark_stack_top_reg = GC_mark_stack_top;
+ for (p = h -> hb_body; (word)p <= (word)lim; p += sz)
+ if ((*(word *)p & 0x3) != 0)
+ GC_mark_stack_top_reg = GC_push_obj(p, hhdr, GC_mark_stack_top_reg,
+ mark_stack_limit);
+ GC_mark_stack_top = GC_mark_stack_top_reg;
+ }
+#endif /* ENABLE_DISCLAIM */
+
+#ifndef GC_DISABLE_INCREMENTAL
+ /* Test whether any page in the given block is dirty. */
+ STATIC GC_bool GC_block_was_dirty(struct hblk *h, hdr *hhdr)
+ {
+ word sz;
+
+# ifdef AO_HAVE_load
+ /* Atomic access is used to avoid racing with GC_realloc. */
+ sz = (word)AO_load((volatile AO_t *)&(hhdr -> hb_sz));
+# else
+ sz = hhdr -> hb_sz;
+# endif
+ if (sz <= MAXOBJBYTES) {
+ return(GC_page_was_dirty(h));
+ } else {
+ ptr_t p = (ptr_t)h;
+ while ((word)p < (word)h + sz) {
+ if (GC_page_was_dirty((struct hblk *)p)) return(TRUE);
+ p += HBLKSIZE;
+ }
+ return(FALSE);
+ }
+ }
+#endif /* GC_DISABLE_INCREMENTAL */
+
+/* Similar to GC_push_marked, but skip over unallocated blocks */
+/* and return address of next plausible block. */
+STATIC struct hblk * GC_push_next_marked(struct hblk *h)
+{
+ hdr * hhdr = HDR(h);
+
+ if (EXPECT(IS_FORWARDING_ADDR_OR_NIL(hhdr) || HBLK_IS_FREE(hhdr), FALSE)) {
+ h = GC_next_block(h, FALSE);
+ if (NULL == h) return NULL;
+ hhdr = GC_find_header((ptr_t)h);
+ } else {
+# ifdef LINT2
+ if (NULL == h) ABORT("Bad HDR() definition");
+# endif
+ }
+ GC_push_marked(h, hhdr);
+ return(h + OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz));
+}
+
+#ifndef GC_DISABLE_INCREMENTAL
+ /* Identical to above, but mark only from dirty pages. */
+ STATIC struct hblk * GC_push_next_marked_dirty(struct hblk *h)
+ {
+ hdr * hhdr = HDR(h);
+
+ if (!GC_incremental) ABORT("Dirty bits not set up");
+ for (;;) {
+ if (EXPECT(IS_FORWARDING_ADDR_OR_NIL(hhdr)
+ || HBLK_IS_FREE(hhdr), FALSE)) {
+ h = GC_next_block(h, FALSE);
+ if (NULL == h) return NULL;
+ hhdr = GC_find_header((ptr_t)h);
+ } else {
+# ifdef LINT2
+ if (NULL == h) ABORT("Bad HDR() definition");
+# endif
+ }
+ if (GC_block_was_dirty(h, hhdr))
+ break;
+ h += OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz);
+ hhdr = HDR(h);
+ }
+# ifdef ENABLE_DISCLAIM
+ if ((hhdr -> hb_flags & MARK_UNCONDITIONALLY) != 0) {
+ GC_push_unconditionally(h, hhdr);
+
+ /* Then we may ask, why not also add the MARK_UNCONDITIONALLY */
+ /* case to GC_push_next_marked, which is also applied to */
+ /* uncollectible blocks? But it seems to me that the function */
+ /* does not need to scan uncollectible (and unconditionally */
+ /* marked) blocks since those are already handled in the */
+ /* MS_PUSH_UNCOLLECTABLE phase. */
+ } else
+# endif
+ /* else */ {
+ GC_push_marked(h, hhdr);
+ }
+ return(h + OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz));
+ }
+#endif /* !GC_DISABLE_INCREMENTAL */
+
+/* Similar to above, but for uncollectible pages. Needed since we */
+/* do not clear marks for such pages, even for full collections. */
+STATIC struct hblk * GC_push_next_marked_uncollectable(struct hblk *h)
+{
+ hdr * hhdr = HDR(h);
+
+ for (;;) {
+ if (EXPECT(IS_FORWARDING_ADDR_OR_NIL(hhdr)
+ || HBLK_IS_FREE(hhdr), FALSE)) {
+ h = GC_next_block(h, FALSE);
+ if (NULL == h) return NULL;
+ hhdr = GC_find_header((ptr_t)h);
+ } else {
+# ifdef LINT2
+ if (NULL == h) ABORT("Bad HDR() definition");
+# endif
+ }
+ if (hhdr -> hb_obj_kind == UNCOLLECTABLE) {
+ GC_push_marked(h, hhdr);
+ break;
+ }
+# ifdef ENABLE_DISCLAIM
+ if ((hhdr -> hb_flags & MARK_UNCONDITIONALLY) != 0) {
+ GC_push_unconditionally(h, hhdr);
+ break;
+ }
+# endif
+ h += OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz);
+ hhdr = HDR(h);
+ }
+ return(h + OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz));
+}
diff --git a/graphics/asymptote/gc/mark_rts.c b/graphics/asymptote/gc/mark_rts.c
new file mode 100644
index 0000000000..0428d5769f
--- /dev/null
+++ b/graphics/asymptote/gc/mark_rts.c
@@ -0,0 +1,961 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 2009-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+#include <stdio.h>
+
+/* Data structure for list of root sets. */
+/* We keep a hash table, so that we can filter out duplicate additions. */
+/* Under Win32, we need to do a better job of filtering overlaps, so */
+/* we resort to sequential search, and pay the price. */
+/* This is really declared in gc_priv.h:
+struct roots {
+ ptr_t r_start;
+ ptr_t r_end;
+# if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ struct roots * r_next;
+# endif
+ GC_bool r_tmp;
+ -- Delete before registering new dynamic libraries
+};
+
+struct roots GC_static_roots[MAX_ROOT_SETS];
+*/
+
+int GC_no_dls = 0; /* Register dynamic library data segments. */
+
+#if !defined(NO_DEBUGGING) || defined(GC_ASSERTIONS)
+ /* Should return the same value as GC_root_size. */
+ GC_INNER word GC_compute_root_size(void)
+ {
+ int i;
+ word size = 0;
+
+ for (i = 0; i < n_root_sets; i++) {
+ size += GC_static_roots[i].r_end - GC_static_roots[i].r_start;
+ }
+ return size;
+ }
+#endif /* !NO_DEBUGGING || GC_ASSERTIONS */
+
+#if !defined(NO_DEBUGGING)
+ /* For debugging: */
+ void GC_print_static_roots(void)
+ {
+ int i;
+ word size;
+
+ for (i = 0; i < n_root_sets; i++) {
+ GC_printf("From %p to %p%s\n",
+ (void *)GC_static_roots[i].r_start,
+ (void *)GC_static_roots[i].r_end,
+ GC_static_roots[i].r_tmp ? " (temporary)" : "");
+ }
+ GC_printf("GC_root_size= %lu\n", (unsigned long)GC_root_size);
+
+ if ((size = GC_compute_root_size()) != GC_root_size)
+ GC_err_printf("GC_root_size incorrect!! Should be: %lu\n",
+ (unsigned long)size);
+ }
+#endif /* !NO_DEBUGGING */
+
+#ifndef THREADS
+ /* Primarily for debugging support: */
+ /* Is the address p in one of the registered static root sections? */
+ GC_INNER GC_bool GC_is_static_root(void *p)
+ {
+ static int last_root_set = MAX_ROOT_SETS;
+ int i;
+
+ if (last_root_set < n_root_sets
+ && (word)p >= (word)GC_static_roots[last_root_set].r_start
+ && (word)p < (word)GC_static_roots[last_root_set].r_end)
+ return(TRUE);
+ for (i = 0; i < n_root_sets; i++) {
+ if ((word)p >= (word)GC_static_roots[i].r_start
+ && (word)p < (word)GC_static_roots[i].r_end) {
+ last_root_set = i;
+ return(TRUE);
+ }
+ }
+ return(FALSE);
+ }
+#endif /* !THREADS */
+
+#if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+/*
+# define LOG_RT_SIZE 6
+# define RT_SIZE (1 << LOG_RT_SIZE) -- Power of 2, may be != MAX_ROOT_SETS
+
+ struct roots * GC_root_index[RT_SIZE];
+ -- Hash table header. Used only to check whether a range is
+ -- already present.
+ -- really defined in gc_priv.h
+*/
+
+ GC_INLINE int rt_hash(ptr_t addr)
+ {
+ word result = (word) addr;
+# if CPP_WORDSZ > 8*LOG_RT_SIZE
+ result ^= result >> 8*LOG_RT_SIZE;
+# endif
+# if CPP_WORDSZ > 4*LOG_RT_SIZE
+ result ^= result >> 4*LOG_RT_SIZE;
+# endif
+ result ^= result >> 2*LOG_RT_SIZE;
+ result ^= result >> LOG_RT_SIZE;
+ result &= (RT_SIZE-1);
+ return(result);
+ }
+
+ /* Is a range starting at b already in the table? If so return a */
+ /* pointer to it, else NULL. */
+ GC_INNER void * GC_roots_present(ptr_t b)
+ {
+ int h = rt_hash(b);
+ struct roots *p = GC_root_index[h];
+
+ while (p != 0) {
+ if (p -> r_start == (ptr_t)b) return(p);
+ p = p -> r_next;
+ }
+ return NULL;
+ }
+
+ /* Add the given root structure to the index. */
+ GC_INLINE void add_roots_to_index(struct roots *p)
+ {
+ int h = rt_hash(p -> r_start);
+
+ p -> r_next = GC_root_index[h];
+ GC_root_index[h] = p;
+ }
+#endif /* !MSWIN32 && !MSWINCE && !CYGWIN32 */
+
+GC_INNER word GC_root_size = 0;
+
+GC_API void GC_CALL GC_add_roots(void *b, void *e)
+{
+ DCL_LOCK_STATE;
+
+ if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
+ LOCK();
+ GC_add_roots_inner((ptr_t)b, (ptr_t)e, FALSE);
+ UNLOCK();
+}
+
+
+/* Add [b,e) to the root set. Adding the same interval a second time */
+/* is a moderately fast no-op, and hence benign. We do not handle */
+/* different but overlapping intervals efficiently. (We do handle */
+/* them correctly.) */
+/* Tmp specifies that the interval may be deleted before */
+/* re-registering dynamic libraries. */
+void GC_add_roots_inner(ptr_t b, ptr_t e, GC_bool tmp)
+{
+ GC_ASSERT((word)b <= (word)e);
+ b = (ptr_t)(((word)b + (sizeof(word) - 1)) & ~(word)(sizeof(word) - 1));
+ /* round b up to word boundary */
+ e = (ptr_t)((word)e & ~(word)(sizeof(word) - 1));
+ /* round e down to word boundary */
+ if ((word)b >= (word)e) return; /* nothing to do */
+
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+ /* Spend the time to ensure that there are no overlapping */
+ /* or adjacent intervals. */
+ /* This could be done faster with e.g. a */
+ /* balanced tree. But the execution time here is */
+ /* virtually guaranteed to be dominated by the time it */
+ /* takes to scan the roots. */
+ {
+ int i;
+ struct roots * old = NULL; /* initialized to prevent warning. */
+
+ for (i = 0; i < n_root_sets; i++) {
+ old = GC_static_roots + i;
+ if ((word)b <= (word)old->r_end
+ && (word)e >= (word)old->r_start) {
+ if ((word)b < (word)old->r_start) {
+ GC_root_size += old->r_start - b;
+ old -> r_start = b;
+ }
+ if ((word)e > (word)old->r_end) {
+ GC_root_size += e - old->r_end;
+ old -> r_end = e;
+ }
+ old -> r_tmp &= tmp;
+ break;
+ }
+ }
+ if (i < n_root_sets) {
+ /* merge other overlapping intervals */
+ struct roots *other;
+
+ for (i++; i < n_root_sets; i++) {
+ other = GC_static_roots + i;
+ b = other -> r_start;
+ e = other -> r_end;
+ if ((word)b <= (word)old->r_end
+ && (word)e >= (word)old->r_start) {
+ if ((word)b < (word)old->r_start) {
+ GC_root_size += old->r_start - b;
+ old -> r_start = b;
+ }
+ if ((word)e > (word)old->r_end) {
+ GC_root_size += e - old->r_end;
+ old -> r_end = e;
+ }
+ old -> r_tmp &= other -> r_tmp;
+ /* Delete this entry. */
+ GC_root_size -= (other -> r_end - other -> r_start);
+ other -> r_start = GC_static_roots[n_root_sets-1].r_start;
+ other -> r_end = GC_static_roots[n_root_sets-1].r_end;
+ n_root_sets--;
+ }
+ }
+ return;
+ }
+ }
+# else
+ {
+ struct roots * old = (struct roots *)GC_roots_present(b);
+
+ if (old != 0) {
+ if ((word)e <= (word)old->r_end) {
+ old -> r_tmp &= tmp;
+ return; /* already there */
+ }
+ if (old -> r_tmp == tmp || !tmp) {
+ /* Extend the existing root. */
+ GC_root_size += e - old -> r_end;
+ old -> r_end = e;
+ old -> r_tmp = tmp;
+ return;
+ }
+ b = old -> r_end;
+ }
+ }
+# endif
+ if (n_root_sets == MAX_ROOT_SETS) {
+ ABORT("Too many root sets");
+ }
+
+# ifdef DEBUG_ADD_DEL_ROOTS
+ GC_log_printf("Adding data root section %d: %p .. %p%s\n",
+ n_root_sets, (void *)b, (void *)e,
+ tmp ? " (temporary)" : "");
+# endif
+ GC_static_roots[n_root_sets].r_start = (ptr_t)b;
+ GC_static_roots[n_root_sets].r_end = (ptr_t)e;
+ GC_static_roots[n_root_sets].r_tmp = tmp;
+# if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ GC_static_roots[n_root_sets].r_next = 0;
+ add_roots_to_index(GC_static_roots + n_root_sets);
+# endif
+ GC_root_size += e - b;
+ n_root_sets++;
+}
+
+GC_API void GC_CALL GC_clear_roots(void)
+{
+ DCL_LOCK_STATE;
+
+ if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
+ LOCK();
+# ifdef THREADS
+ GC_roots_were_cleared = TRUE;
+# endif
+ n_root_sets = 0;
+ GC_root_size = 0;
+# if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ BZERO(GC_root_index, RT_SIZE * sizeof(void *));
+# endif
+# ifdef DEBUG_ADD_DEL_ROOTS
+ GC_log_printf("Clear all data root sections\n");
+# endif
+ UNLOCK();
+}
+
+/* Internal use only; lock held. */
+STATIC void GC_remove_root_at_pos(int i)
+{
+# ifdef DEBUG_ADD_DEL_ROOTS
+ GC_log_printf("Remove data root section at %d: %p .. %p%s\n",
+ i, (void *)GC_static_roots[i].r_start,
+ (void *)GC_static_roots[i].r_end,
+ GC_static_roots[i].r_tmp ? " (temporary)" : "");
+# endif
+ GC_root_size -= (GC_static_roots[i].r_end - GC_static_roots[i].r_start);
+ GC_static_roots[i].r_start = GC_static_roots[n_root_sets-1].r_start;
+ GC_static_roots[i].r_end = GC_static_roots[n_root_sets-1].r_end;
+ GC_static_roots[i].r_tmp = GC_static_roots[n_root_sets-1].r_tmp;
+ n_root_sets--;
+}
+
+#if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ STATIC void GC_rebuild_root_index(void)
+ {
+ int i;
+ BZERO(GC_root_index, RT_SIZE * sizeof(void *));
+ for (i = 0; i < n_root_sets; i++)
+ add_roots_to_index(GC_static_roots + i);
+ }
+#endif
+
+#if defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(MSWINCE) \
+ || defined(PCR) || defined(CYGWIN32)
+/* Internal use only; lock held. */
+STATIC void GC_remove_tmp_roots(void)
+{
+ int i;
+# if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ int old_n_roots = n_root_sets;
+# endif
+
+ for (i = 0; i < n_root_sets; ) {
+ if (GC_static_roots[i].r_tmp) {
+ GC_remove_root_at_pos(i);
+ } else {
+ i++;
+ }
+ }
+# if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ if (n_root_sets < old_n_roots)
+ GC_rebuild_root_index();
+# endif
+}
+#endif
+
+STATIC void GC_remove_roots_inner(ptr_t b, ptr_t e);
+
+GC_API void GC_CALL GC_remove_roots(void *b, void *e)
+{
+ DCL_LOCK_STATE;
+
+ /* Quick check whether has nothing to do */
+ if ((((word)b + (sizeof(word) - 1)) & ~(word)(sizeof(word) - 1)) >=
+ ((word)e & ~(word)(sizeof(word) - 1)))
+ return;
+
+ LOCK();
+ GC_remove_roots_inner((ptr_t)b, (ptr_t)e);
+ UNLOCK();
+}
+
+/* Should only be called when the lock is held */
+STATIC void GC_remove_roots_inner(ptr_t b, ptr_t e)
+{
+ int i;
+# if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ int old_n_roots = n_root_sets;
+# endif
+
+ for (i = 0; i < n_root_sets; ) {
+ if ((word)GC_static_roots[i].r_start >= (word)b
+ && (word)GC_static_roots[i].r_end <= (word)e) {
+ GC_remove_root_at_pos(i);
+ } else {
+ i++;
+ }
+ }
+# if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
+ if (n_root_sets < old_n_roots)
+ GC_rebuild_root_index();
+# endif
+}
+
+#ifdef USE_PROC_FOR_LIBRARIES
+ /* Exchange the elements of the roots table. Requires rebuild of */
+ /* the roots index table after the swap. */
+ GC_INLINE void swap_static_roots(int i, int j)
+ {
+ ptr_t r_start = GC_static_roots[i].r_start;
+ ptr_t r_end = GC_static_roots[i].r_end;
+ GC_bool r_tmp = GC_static_roots[i].r_tmp;
+
+ GC_static_roots[i].r_start = GC_static_roots[j].r_start;
+ GC_static_roots[i].r_end = GC_static_roots[j].r_end;
+ GC_static_roots[i].r_tmp = GC_static_roots[j].r_tmp;
+ /* No need to swap r_next values. */
+ GC_static_roots[j].r_start = r_start;
+ GC_static_roots[j].r_end = r_end;
+ GC_static_roots[j].r_tmp = r_tmp;
+ }
+
+ /* Remove given range from every static root which intersects with */
+ /* the range. It is assumed GC_remove_tmp_roots is called before */
+ /* this function is called repeatedly by GC_register_map_entries. */
+ GC_INNER void GC_remove_roots_subregion(ptr_t b, ptr_t e)
+ {
+ int i;
+ GC_bool rebuild = FALSE;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_ASSERT((word)b % sizeof(word) == 0 && (word)e % sizeof(word) == 0);
+ for (i = 0; i < n_root_sets; i++) {
+ ptr_t r_start, r_end;
+
+ if (GC_static_roots[i].r_tmp) {
+ /* The remaining roots are skipped as they are all temporary. */
+# ifdef GC_ASSERTIONS
+ int j;
+ for (j = i + 1; j < n_root_sets; j++) {
+ GC_ASSERT(GC_static_roots[j].r_tmp);
+ }
+# endif
+ break;
+ }
+ r_start = GC_static_roots[i].r_start;
+ r_end = GC_static_roots[i].r_end;
+ if (!EXPECT((word)e <= (word)r_start || (word)r_end <= (word)b, TRUE)) {
+# ifdef DEBUG_ADD_DEL_ROOTS
+ GC_log_printf("Removing %p .. %p from root section %d (%p .. %p)\n",
+ (void *)b, (void *)e,
+ i, (void *)r_start, (void *)r_end);
+# endif
+ if ((word)r_start < (word)b) {
+ GC_root_size -= r_end - b;
+ GC_static_roots[i].r_end = b;
+ /* No need to rebuild as hash does not use r_end value. */
+ if ((word)e < (word)r_end) {
+ int j;
+
+ if (rebuild) {
+ GC_rebuild_root_index();
+ rebuild = FALSE;
+ }
+ GC_add_roots_inner(e, r_end, FALSE); /* updates n_root_sets */
+ for (j = i + 1; j < n_root_sets; j++)
+ if (GC_static_roots[j].r_tmp)
+ break;
+ if (j < n_root_sets-1 && !GC_static_roots[n_root_sets-1].r_tmp) {
+ /* Exchange the roots to have all temporary ones at the end. */
+ swap_static_roots(j, n_root_sets - 1);
+ rebuild = TRUE;
+ }
+ }
+ } else {
+ if ((word)e < (word)r_end) {
+ GC_root_size -= e - r_start;
+ GC_static_roots[i].r_start = e;
+ } else {
+ GC_remove_root_at_pos(i);
+ if (i < n_root_sets - 1 && GC_static_roots[i].r_tmp
+ && !GC_static_roots[i + 1].r_tmp) {
+ int j;
+
+ for (j = i + 2; j < n_root_sets; j++)
+ if (GC_static_roots[j].r_tmp)
+ break;
+ /* Exchange the roots to have all temporary ones at the end. */
+ swap_static_roots(i, j - 1);
+ }
+ i--;
+ }
+ rebuild = TRUE;
+ }
+ }
+ }
+ if (rebuild)
+ GC_rebuild_root_index();
+ }
+#endif /* USE_PROC_FOR_LIBRARIES */
+
+#if !defined(NO_DEBUGGING)
+ /* For the debugging purpose only. */
+ /* Workaround for the OS mapping and unmapping behind our back: */
+ /* Is the address p in one of the temporary static root sections? */
+ GC_API int GC_CALL GC_is_tmp_root(void *p)
+ {
+ static int last_root_set = MAX_ROOT_SETS;
+ int i;
+
+ if (last_root_set < n_root_sets
+ && (word)p >= (word)GC_static_roots[last_root_set].r_start
+ && (word)p < (word)GC_static_roots[last_root_set].r_end)
+ return GC_static_roots[last_root_set].r_tmp;
+ for (i = 0; i < n_root_sets; i++) {
+ if ((word)p >= (word)GC_static_roots[i].r_start
+ && (word)p < (word)GC_static_roots[i].r_end) {
+ last_root_set = i;
+ return GC_static_roots[i].r_tmp;
+ }
+ }
+ return(FALSE);
+ }
+#endif /* !NO_DEBUGGING */
+
+GC_INNER ptr_t GC_approx_sp(void)
+{
+ volatile word sp;
+# if ((defined(E2K) && defined(__clang__)) \
+ || (defined(S390) && (__clang_major__ < 8))) && !defined(CPPCHECK)
+ /* Workaround some bugs in clang: */
+ /* "undefined reference to llvm.frameaddress" error (clang-9/e2k); */
+ /* a crash in SystemZTargetLowering of libLLVM-3.8 (S390). */
+ sp = (word)&sp;
+# elif defined(CPPCHECK) || (__GNUC__ >= 4 /* GC_GNUC_PREREQ(4, 0) */ \
+ && !defined(STACK_NOT_SCANNED))
+ /* TODO: Use GC_GNUC_PREREQ after fixing a bug in cppcheck. */
+ sp = (word)__builtin_frame_address(0);
+# else
+ sp = (word)&sp;
+# endif
+ /* Also force stack to grow if necessary. Otherwise the */
+ /* later accesses might cause the kernel to think we're */
+ /* doing something wrong. */
+ return((ptr_t)sp);
+}
+
+/*
+ * Data structure for excluded static roots.
+ * Real declaration is in gc_priv.h.
+
+struct exclusion {
+ ptr_t e_start;
+ ptr_t e_end;
+};
+
+struct exclusion GC_excl_table[MAX_EXCLUSIONS];
+ -- Array of exclusions, ascending
+ -- address order.
+*/
+
+GC_API void GC_CALL GC_clear_exclusion_table(void)
+{
+ GC_excl_table_entries = 0;
+}
+
+/* Return the first exclusion range that includes an address >= start_addr */
+/* Assumes the exclusion table contains at least one entry (namely the */
+/* GC data structures). */
+STATIC struct exclusion * GC_next_exclusion(ptr_t start_addr)
+{
+ size_t low = 0;
+ size_t high;
+
+ GC_ASSERT(GC_excl_table_entries > 0);
+ high = GC_excl_table_entries - 1;
+ while (high > low) {
+ size_t mid = (low + high) >> 1;
+
+ /* low <= mid < high */
+ if ((word) GC_excl_table[mid].e_end <= (word) start_addr) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
+ if ((word) GC_excl_table[low].e_end <= (word) start_addr) return 0;
+ return GC_excl_table + low;
+}
+
+/* Should only be called when the lock is held. The range boundaries */
+/* should be properly aligned and valid. */
+GC_INNER void GC_exclude_static_roots_inner(void *start, void *finish)
+{
+ struct exclusion * next;
+ size_t next_index;
+
+ GC_ASSERT((word)start % sizeof(word) == 0);
+ GC_ASSERT((word)start < (word)finish);
+
+ if (0 == GC_excl_table_entries) {
+ next = 0;
+ } else {
+ next = GC_next_exclusion((ptr_t)start);
+ }
+ if (next != NULL) {
+ if ((word)(next -> e_start) < (word) finish) {
+ /* incomplete error check. */
+ ABORT("Exclusion ranges overlap");
+ }
+ if ((word)(next -> e_start) == (word) finish) {
+ /* extend old range backwards */
+ next -> e_start = (ptr_t)start;
+ return;
+ }
+ }
+
+ next_index = GC_excl_table_entries;
+ if (next_index >= MAX_EXCLUSIONS) ABORT("Too many exclusions");
+ if (next != NULL) {
+ size_t i;
+
+ next_index = (size_t)(next - GC_excl_table);
+ for (i = GC_excl_table_entries; i > next_index; --i) {
+ GC_excl_table[i] = GC_excl_table[i-1];
+ }
+ }
+ GC_excl_table[next_index].e_start = (ptr_t)start;
+ GC_excl_table[next_index].e_end = (ptr_t)finish;
+ ++GC_excl_table_entries;
+}
+
+GC_API void GC_CALL GC_exclude_static_roots(void *b, void *e)
+{
+ DCL_LOCK_STATE;
+
+ if (b == e) return; /* nothing to exclude? */
+
+ /* Round boundaries (in direction reverse to that of GC_add_roots). */
+ b = (void *)((word)b & ~(word)(sizeof(word) - 1));
+ e = (void *)(((word)e + (sizeof(word) - 1)) & ~(word)(sizeof(word) - 1));
+ if (NULL == e)
+ e = (void *)(~(word)(sizeof(word) - 1)); /* handle overflow */
+
+ LOCK();
+ GC_exclude_static_roots_inner(b, e);
+ UNLOCK();
+}
+
+#if defined(WRAP_MARK_SOME) && defined(PARALLEL_MARK)
+# define GC_PUSH_CONDITIONAL(b, t, all) \
+ (GC_parallel \
+ ? GC_push_conditional_eager(b, t, all) \
+ : GC_push_conditional_static(b, t, all))
+#else
+# define GC_PUSH_CONDITIONAL(b, t, all) GC_push_conditional_static(b, t, all)
+#endif
+
+/* Invoke push_conditional on ranges that are not excluded. */
+STATIC void GC_push_conditional_with_exclusions(ptr_t bottom, ptr_t top,
+ GC_bool all)
+{
+ while ((word)bottom < (word)top) {
+ struct exclusion *next = GC_next_exclusion(bottom);
+ ptr_t excl_start;
+
+ if (0 == next
+ || (word)(excl_start = next -> e_start) >= (word)top) {
+ GC_PUSH_CONDITIONAL(bottom, top, all);
+ break;
+ }
+ if ((word)excl_start > (word)bottom)
+ GC_PUSH_CONDITIONAL(bottom, excl_start, all);
+ bottom = next -> e_end;
+ }
+}
+
+#if defined(E2K) || defined(IA64)
+ /* Similar to GC_push_all_stack_sections() but for IA-64 registers store. */
+ GC_INNER void GC_push_all_register_sections(ptr_t bs_lo, ptr_t bs_hi,
+ int eager, struct GC_traced_stack_sect_s *traced_stack_sect)
+ {
+# ifdef E2K
+ (void)traced_stack_sect; /* TODO: Not implemented yet */
+# else
+ while (traced_stack_sect != NULL) {
+ ptr_t frame_bs_lo = traced_stack_sect -> backing_store_end;
+ GC_ASSERT((word)frame_bs_lo <= (word)bs_hi);
+ if (eager) {
+ GC_push_all_eager(frame_bs_lo, bs_hi);
+ } else {
+ GC_push_all_stack(frame_bs_lo, bs_hi);
+ }
+ bs_hi = traced_stack_sect -> saved_backing_store_ptr;
+ traced_stack_sect = traced_stack_sect -> prev;
+ }
+# endif
+ GC_ASSERT((word)bs_lo <= (word)bs_hi);
+ if (eager) {
+ GC_push_all_eager(bs_lo, bs_hi);
+ } else {
+ GC_push_all_stack(bs_lo, bs_hi);
+ }
+ }
+#endif /* E2K || IA64 */
+
+#ifdef THREADS
+
+GC_INNER void GC_push_all_stack_sections(
+ ptr_t lo /* top */, ptr_t hi /* bottom */,
+ struct GC_traced_stack_sect_s *traced_stack_sect)
+{
+ while (traced_stack_sect != NULL) {
+ GC_ASSERT((word)lo HOTTER_THAN (word)traced_stack_sect);
+# ifdef STACK_GROWS_UP
+ GC_push_all_stack((ptr_t)traced_stack_sect, lo);
+# else /* STACK_GROWS_DOWN */
+ GC_push_all_stack(lo, (ptr_t)traced_stack_sect);
+# endif
+ lo = traced_stack_sect -> saved_stack_ptr;
+ GC_ASSERT(lo != NULL);
+ traced_stack_sect = traced_stack_sect -> prev;
+ }
+ GC_ASSERT(!((word)hi HOTTER_THAN (word)lo));
+# ifdef STACK_GROWS_UP
+ /* We got them backwards! */
+ GC_push_all_stack(hi, lo);
+# else /* STACK_GROWS_DOWN */
+ GC_push_all_stack(lo, hi);
+# endif
+}
+
+#else /* !THREADS */
+
+ /* Similar to GC_push_all_eager, but only the */
+ /* part hotter than cold_gc_frame is scanned */
+ /* immediately. Needed to ensure that callee- */
+ /* save registers are not missed. */
+/*
+ * A version of GC_push_all that treats all interior pointers as valid
+ * and scans part of the area immediately, to make sure that saved
+ * register values are not lost.
+ * Cold_gc_frame delimits the stack section that must be scanned
+ * eagerly. A zero value indicates that no eager scanning is needed.
+ * We don't need to worry about the manual VDB case here, since this
+ * is only called in the single-threaded case. We assume that we
+ * cannot collect between an assignment and the corresponding
+ * GC_dirty() call.
+ */
+STATIC void GC_push_all_stack_partially_eager(ptr_t bottom, ptr_t top,
+ ptr_t cold_gc_frame)
+{
+#ifndef NEED_FIXUP_POINTER
+ if (GC_all_interior_pointers) {
+ /* Push the hot end of the stack eagerly, so that register values */
+ /* saved inside GC frames are marked before they disappear. */
+ /* The rest of the marking can be deferred until later. */
+ if (0 == cold_gc_frame) {
+ GC_push_all_stack(bottom, top);
+ return;
+ }
+ GC_ASSERT((word)bottom <= (word)cold_gc_frame
+ && (word)cold_gc_frame <= (word)top);
+# ifdef STACK_GROWS_DOWN
+ GC_push_all(cold_gc_frame - sizeof(ptr_t), top);
+ GC_push_all_eager(bottom, cold_gc_frame);
+# else /* STACK_GROWS_UP */
+ GC_push_all(bottom, cold_gc_frame + sizeof(ptr_t));
+ GC_push_all_eager(cold_gc_frame, top);
+# endif /* STACK_GROWS_UP */
+ } else
+#endif
+ /* else */ {
+ GC_push_all_eager(bottom, top);
+ }
+# ifdef TRACE_BUF
+ GC_add_trace_entry("GC_push_all_stack", (word)bottom, (word)top);
+# endif
+}
+
+/* Similar to GC_push_all_stack_sections() but also uses cold_gc_frame. */
+STATIC void GC_push_all_stack_part_eager_sections(
+ ptr_t lo /* top */, ptr_t hi /* bottom */, ptr_t cold_gc_frame,
+ struct GC_traced_stack_sect_s *traced_stack_sect)
+{
+ GC_ASSERT(traced_stack_sect == NULL || cold_gc_frame == NULL ||
+ (word)cold_gc_frame HOTTER_THAN (word)traced_stack_sect);
+
+ while (traced_stack_sect != NULL) {
+ GC_ASSERT((word)lo HOTTER_THAN (word)traced_stack_sect);
+# ifdef STACK_GROWS_UP
+ GC_push_all_stack_partially_eager((ptr_t)traced_stack_sect, lo,
+ cold_gc_frame);
+# else /* STACK_GROWS_DOWN */
+ GC_push_all_stack_partially_eager(lo, (ptr_t)traced_stack_sect,
+ cold_gc_frame);
+# endif
+ lo = traced_stack_sect -> saved_stack_ptr;
+ GC_ASSERT(lo != NULL);
+ traced_stack_sect = traced_stack_sect -> prev;
+ cold_gc_frame = NULL; /* Use at most once. */
+ }
+
+ GC_ASSERT(!((word)hi HOTTER_THAN (word)lo));
+# ifdef STACK_GROWS_UP
+ /* We got them backwards! */
+ GC_push_all_stack_partially_eager(hi, lo, cold_gc_frame);
+# else /* STACK_GROWS_DOWN */
+ GC_push_all_stack_partially_eager(lo, hi, cold_gc_frame);
+# endif
+}
+
+#endif /* !THREADS */
+
+/* Push enough of the current stack eagerly to ensure that callee-save */
+/* registers saved in GC frames are scanned. In the non-threads case, */
+/* schedule entire stack for scanning. The 2nd argument is a pointer */
+/* to the (possibly null) thread context, for (currently hypothetical) */
+/* more precise stack scanning. In the presence of threads, push */
+/* enough of the current stack to ensure that callee-save registers */
+/* saved in collector frames have been seen. */
+/* TODO: Merge it with per-thread stuff. */
+STATIC void GC_push_current_stack(ptr_t cold_gc_frame,
+ void * context GC_ATTR_UNUSED)
+{
+# if defined(THREADS)
+ /* cold_gc_frame is non-NULL. */
+# ifdef STACK_GROWS_DOWN
+ GC_push_all_eager(GC_approx_sp(), cold_gc_frame);
+ /* For IA64, the register stack backing store is handled */
+ /* in the thread-specific code. */
+# else
+ GC_push_all_eager(cold_gc_frame, GC_approx_sp());
+# endif
+# else
+ GC_push_all_stack_part_eager_sections(GC_approx_sp(), GC_stackbottom,
+ cold_gc_frame, GC_traced_stack_sect);
+# ifdef IA64
+ /* We also need to push the register stack backing store. */
+ /* This should really be done in the same way as the */
+ /* regular stack. For now we fudge it a bit. */
+ /* Note that the backing store grows up, so we can't use */
+ /* GC_push_all_stack_partially_eager. */
+ {
+ ptr_t bsp = GC_save_regs_ret_val;
+ ptr_t cold_gc_bs_pointer = bsp - 2048;
+ if (GC_all_interior_pointers
+ && (word)cold_gc_bs_pointer > (word)BACKING_STORE_BASE) {
+ /* Adjust cold_gc_bs_pointer if below our innermost */
+ /* "traced stack section" in backing store. */
+ if (GC_traced_stack_sect != NULL
+ && (word)cold_gc_bs_pointer
+ < (word)GC_traced_stack_sect->backing_store_end)
+ cold_gc_bs_pointer =
+ GC_traced_stack_sect->backing_store_end;
+ GC_push_all_register_sections(BACKING_STORE_BASE,
+ cold_gc_bs_pointer, FALSE, GC_traced_stack_sect);
+ GC_push_all_eager(cold_gc_bs_pointer, bsp);
+ } else {
+ GC_push_all_register_sections(BACKING_STORE_BASE, bsp,
+ TRUE /* eager */, GC_traced_stack_sect);
+ }
+ /* All values should be sufficiently aligned that we */
+ /* don't have to worry about the boundary. */
+ }
+# elif defined(E2K)
+ /* We also need to push procedure stack store. */
+ /* Procedure stack grows up. */
+ {
+ ptr_t bs_lo;
+ size_t stack_size;
+
+ GET_PROCEDURE_STACK_LOCAL(&bs_lo, &stack_size);
+ GC_push_all_register_sections(bs_lo, bs_lo + stack_size,
+ TRUE /* eager */,
+ GC_traced_stack_sect);
+ FREE_PROCEDURE_STACK_LOCAL(bs_lo, stack_size);
+ }
+# endif
+# endif /* !THREADS */
+}
+
+GC_INNER void (*GC_push_typed_structures)(void) = 0;
+
+GC_INNER void GC_cond_register_dynamic_libraries(void)
+{
+# if (defined(DYNAMIC_LOADING) && !defined(MSWIN_XBOX1)) \
+ || defined(CYGWIN32) || defined(MSWIN32) || defined(MSWINCE) \
+ || defined(PCR)
+ GC_remove_tmp_roots();
+ if (!GC_no_dls) GC_register_dynamic_libraries();
+# else
+ GC_no_dls = TRUE;
+# endif
+}
+
+STATIC void GC_push_regs_and_stack(ptr_t cold_gc_frame)
+{
+# ifdef THREADS
+ if (NULL == cold_gc_frame)
+ return; /* GC_push_all_stacks should push registers and stack */
+# endif
+ GC_with_callee_saves_pushed(GC_push_current_stack, cold_gc_frame);
+}
+
+/* Call the mark routines (GC_push_one for a single pointer, */
+/* GC_push_conditional on groups of pointers) on every top level */
+/* accessible pointer. If all is false, arrange to push only possibly */
+/* altered values. Cold_gc_frame is an address inside a GC frame that */
+/* remains valid until all marking is complete; a NULL value indicates */
+/* that it is OK to miss some register values. Called with the */
+/* allocation lock held. */
+GC_INNER void GC_push_roots(GC_bool all, ptr_t cold_gc_frame GC_ATTR_UNUSED)
+{
+ int i;
+ unsigned kind;
+
+ /* Next push static data. This must happen early on, since it is */
+ /* not robust against mark stack overflow. */
+ /* Re-register dynamic libraries, in case one got added. */
+ /* There is some argument for doing this as late as possible, */
+ /* especially on Win32, where it can change asynchronously. */
+ /* In those cases, we do it here. But on other platforms, it's */
+ /* not safe with the world stopped, so we do it earlier. */
+# if !defined(REGISTER_LIBRARIES_EARLY)
+ GC_cond_register_dynamic_libraries();
+# endif
+
+ /* Mark everything in static data areas. */
+ for (i = 0; i < n_root_sets; i++) {
+ GC_push_conditional_with_exclusions(
+ GC_static_roots[i].r_start,
+ GC_static_roots[i].r_end, all);
+ }
+
+ /* Mark all free list header blocks, if those were allocated from */
+ /* the garbage collected heap. This makes sure they don't */
+ /* disappear if we are not marking from static data. It also */
+ /* saves us the trouble of scanning them, and possibly that of */
+ /* marking the freelists. */
+ for (kind = 0; kind < GC_n_kinds; kind++) {
+ void *base = GC_base(GC_obj_kinds[kind].ok_freelist);
+ if (base != NULL) {
+ GC_set_mark_bit(base);
+ }
+ }
+
+ /* Mark from GC internal roots if those might otherwise have */
+ /* been excluded. */
+# ifndef GC_NO_FINALIZATION
+ GC_push_finalizer_structures();
+# endif
+# ifdef THREADS
+ if (GC_no_dls || GC_roots_were_cleared)
+ GC_push_thread_structures();
+# endif
+ if (GC_push_typed_structures)
+ GC_push_typed_structures();
+
+ /* Mark thread local free lists, even if their mark */
+ /* descriptor excludes the link field. */
+ /* If the world is not stopped, this is unsafe. It is */
+ /* also unnecessary, since we will do this again with the */
+ /* world stopped. */
+# if defined(THREAD_LOCAL_ALLOC)
+ if (GC_world_stopped)
+ GC_mark_thread_local_free_lists();
+# endif
+
+ /* Now traverse stacks, and mark from register contents. */
+ /* These must be done last, since they can legitimately */
+ /* overflow the mark stack. This is usually done by saving */
+ /* the current context on the stack, and then just tracing */
+ /* from the stack. */
+# ifndef STACK_NOT_SCANNED
+ GC_push_regs_and_stack(cold_gc_frame);
+# endif
+
+ if (GC_push_other_roots != 0) {
+ /* In the threads case, this also pushes thread stacks. */
+ /* Note that without interior pointer recognition lots */
+ /* of stuff may have been pushed already, and this */
+ /* should be careful about mark stack overflows. */
+ (*GC_push_other_roots)();
+ }
+}
diff --git a/graphics/asymptote/gc/misc.c b/graphics/asymptote/gc/misc.c
new file mode 100644
index 0000000000..91cb193a04
--- /dev/null
+++ b/graphics/asymptote/gc/misc.c
@@ -0,0 +1,2710 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1999-2001 by Hewlett-Packard Company. All rights reserved.
+ * Copyright (c) 2008-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_pmark.h"
+
+#include <stdio.h>
+#include <limits.h>
+#include <stdarg.h>
+
+#ifndef MSWINCE
+# include <signal.h>
+#endif
+
+#ifdef GC_SOLARIS_THREADS
+# include <sys/syscall.h>
+#endif
+
+#if defined(UNIX_LIKE) || defined(CYGWIN32) || defined(SYMBIAN) \
+ || (defined(CONSOLE_LOG) && defined(MSWIN32))
+# include <fcntl.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif
+
+#if defined(CONSOLE_LOG) && defined(MSWIN32) && !defined(__GNUC__)
+# include <io.h>
+#endif
+
+#ifdef NONSTOP
+# include <floss.h>
+#endif
+
+#ifdef THREADS
+# ifdef PCR
+# include "il/PCR_IL.h"
+ GC_INNER PCR_Th_ML GC_allocate_ml;
+# elif defined(SN_TARGET_PSP2)
+ GC_INNER WapiMutex GC_allocate_ml_PSP2 = { 0, NULL };
+# elif defined(GC_DEFN_ALLOCATE_ML) || defined(SN_TARGET_PS3)
+# include <pthread.h>
+ GC_INNER pthread_mutex_t GC_allocate_ml;
+# endif
+ /* For other platforms with threads, the lock and possibly */
+ /* GC_lock_holder variables are defined in the thread support code. */
+#endif /* THREADS */
+
+#ifdef DYNAMIC_LOADING
+ /* We need to register the main data segment. Returns TRUE unless */
+ /* this is done implicitly as part of dynamic library registration. */
+# define GC_REGISTER_MAIN_STATIC_DATA() GC_register_main_static_data()
+#elif defined(GC_DONT_REGISTER_MAIN_STATIC_DATA)
+# define GC_REGISTER_MAIN_STATIC_DATA() FALSE
+#else
+ /* Don't unnecessarily call GC_register_main_static_data() in case */
+ /* dyn_load.c isn't linked in. */
+# define GC_REGISTER_MAIN_STATIC_DATA() TRUE
+#endif
+
+#ifdef NEED_CANCEL_DISABLE_COUNT
+ __thread unsigned char GC_cancel_disable_count = 0;
+#endif
+
+GC_FAR struct _GC_arrays GC_arrays /* = { 0 } */;
+
+GC_INNER unsigned GC_n_mark_procs = GC_RESERVED_MARK_PROCS;
+
+GC_INNER unsigned GC_n_kinds = GC_N_KINDS_INITIAL_VALUE;
+
+GC_INNER GC_bool GC_debugging_started = FALSE;
+ /* defined here so we don't have to load dbg_mlc.o */
+
+ptr_t GC_stackbottom = 0;
+
+#ifdef IA64
+ ptr_t GC_register_stackbottom = 0;
+#endif
+
+int GC_dont_gc = FALSE;
+
+int GC_dont_precollect = FALSE;
+
+GC_bool GC_quiet = 0; /* used also in pcr_interface.c */
+
+#if !defined(NO_CLOCK) || !defined(SMALL_CONFIG)
+ int GC_print_stats = 0;
+#endif
+
+#ifdef GC_PRINT_BACK_HEIGHT
+ GC_INNER GC_bool GC_print_back_height = TRUE;
+#else
+ GC_INNER GC_bool GC_print_back_height = FALSE;
+#endif
+
+#ifndef NO_DEBUGGING
+# ifdef GC_DUMP_REGULARLY
+ GC_INNER GC_bool GC_dump_regularly = TRUE;
+ /* Generate regular debugging dumps. */
+# else
+ GC_INNER GC_bool GC_dump_regularly = FALSE;
+# endif
+# ifndef NO_CLOCK
+ STATIC CLOCK_TYPE GC_init_time;
+ /* The time that the GC was initialized at. */
+# endif
+#endif /* !NO_DEBUGGING */
+
+#ifdef KEEP_BACK_PTRS
+ GC_INNER long GC_backtraces = 0;
+ /* Number of random backtraces to generate for each GC. */
+#endif
+
+#ifdef FIND_LEAK
+ int GC_find_leak = 1;
+#else
+ int GC_find_leak = 0;
+#endif
+
+#ifndef SHORT_DBG_HDRS
+# ifdef GC_FINDLEAK_DELAY_FREE
+ GC_INNER GC_bool GC_findleak_delay_free = TRUE;
+# else
+ GC_INNER GC_bool GC_findleak_delay_free = FALSE;
+# endif
+#endif /* !SHORT_DBG_HDRS */
+
+#ifdef ALL_INTERIOR_POINTERS
+ int GC_all_interior_pointers = 1;
+#else
+ int GC_all_interior_pointers = 0;
+#endif
+
+#ifdef FINALIZE_ON_DEMAND
+ int GC_finalize_on_demand = 1;
+#else
+ int GC_finalize_on_demand = 0;
+#endif
+
+#ifdef JAVA_FINALIZATION
+ int GC_java_finalization = 1;
+#else
+ int GC_java_finalization = 0;
+#endif
+
+/* All accesses to it should be synchronized to avoid data races. */
+GC_finalizer_notifier_proc GC_finalizer_notifier =
+ (GC_finalizer_notifier_proc)0;
+
+#ifdef GC_FORCE_UNMAP_ON_GCOLLECT
+ /* Has no effect unless USE_MUNMAP. */
+ /* Has no effect on implicitly-initiated garbage collections. */
+ GC_INNER GC_bool GC_force_unmap_on_gcollect = TRUE;
+#else
+ GC_INNER GC_bool GC_force_unmap_on_gcollect = FALSE;
+#endif
+
+#ifndef GC_LARGE_ALLOC_WARN_INTERVAL
+# define GC_LARGE_ALLOC_WARN_INTERVAL 5
+#endif
+GC_INNER long GC_large_alloc_warn_interval = GC_LARGE_ALLOC_WARN_INTERVAL;
+ /* Interval between unsuppressed warnings. */
+
+STATIC void * GC_CALLBACK GC_default_oom_fn(
+ size_t bytes_requested GC_ATTR_UNUSED)
+{
+ return(0);
+}
+
+/* All accesses to it should be synchronized to avoid data races. */
+GC_oom_func GC_oom_fn = GC_default_oom_fn;
+
+#ifdef CAN_HANDLE_FORK
+# ifdef HANDLE_FORK
+ GC_INNER int GC_handle_fork = 1;
+ /* The value is examined by GC_thr_init. */
+# else
+ GC_INNER int GC_handle_fork = FALSE;
+# endif
+
+#elif !defined(HAVE_NO_FORK)
+ GC_API void GC_CALL GC_atfork_prepare(void)
+ {
+# ifdef THREADS
+ ABORT("fork() handling unsupported");
+# endif
+ }
+
+ GC_API void GC_CALL GC_atfork_parent(void)
+ {
+ /* empty */
+ }
+
+ GC_API void GC_CALL GC_atfork_child(void)
+ {
+ /* empty */
+ }
+#endif /* !CAN_HANDLE_FORK && !HAVE_NO_FORK */
+
+/* Overrides the default automatic handle-fork mode. Has effect only */
+/* if called before GC_INIT. */
+GC_API void GC_CALL GC_set_handle_fork(int value GC_ATTR_UNUSED)
+{
+# ifdef CAN_HANDLE_FORK
+ if (!GC_is_initialized)
+ GC_handle_fork = value >= -1 ? value : 1;
+ /* Map all negative values except for -1 to a positive one. */
+# elif defined(THREADS) || (defined(DARWIN) && defined(MPROTECT_VDB))
+ if (!GC_is_initialized && value) {
+# ifndef SMALL_CONFIG
+ GC_init(); /* to initialize GC_manual_vdb and GC_stderr */
+# ifndef THREADS
+ if (GC_manual_vdb)
+ return;
+# endif
+# endif
+ ABORT("fork() handling unsupported");
+ }
+# else
+ /* No at-fork handler is needed in the single-threaded mode. */
+# endif
+}
+
+/* Set things up so that GC_size_map[i] >= granules(i), */
+/* but not too much bigger */
+/* and so that size_map contains relatively few distinct entries */
+/* This was originally stolen from Russ Atkinson's Cedar */
+/* quantization algorithm (but we precompute it). */
+STATIC void GC_init_size_map(void)
+{
+ size_t i;
+
+ /* Map size 0 to something bigger. */
+ /* This avoids problems at lower levels. */
+ GC_size_map[0] = 1;
+ for (i = 1; i <= GRANULES_TO_BYTES(TINY_FREELISTS-1) - EXTRA_BYTES; i++) {
+ GC_size_map[i] = ROUNDED_UP_GRANULES(i);
+# ifndef _MSC_VER
+ GC_ASSERT(GC_size_map[i] < TINY_FREELISTS);
+ /* Seems to tickle bug in VC++ 2008 for x64 */
+# endif
+ }
+ /* We leave the rest of the array to be filled in on demand. */
+}
+
+/*
+ * The following is a gross hack to deal with a problem that can occur
+ * on machines that are sloppy about stack frame sizes, notably SPARC.
+ * Bogus pointers may be written to the stack and not cleared for
+ * a LONG time, because they always fall into holes in stack frames
+ * that are not written. We partially address this by clearing
+ * sections of the stack whenever we get control.
+ */
+
+#ifndef SMALL_CLEAR_SIZE
+# define SMALL_CLEAR_SIZE 256 /* Clear this much every time. */
+#endif
+
+#if defined(ALWAYS_SMALL_CLEAR_STACK) || defined(STACK_NOT_SCANNED)
+ GC_API void * GC_CALL GC_clear_stack(void *arg)
+ {
+# ifndef STACK_NOT_SCANNED
+ word volatile dummy[SMALL_CLEAR_SIZE];
+ BZERO((/* no volatile */ void *)dummy, sizeof(dummy));
+# endif
+ return arg;
+ }
+#else
+
+# ifdef THREADS
+# define BIG_CLEAR_SIZE 2048 /* Clear this much now and then. */
+# else
+ STATIC word GC_stack_last_cleared = 0;
+ /* GC_gc_no value when we last did this. */
+ STATIC ptr_t GC_min_sp = NULL;
+ /* Coolest stack pointer value from which */
+ /* we've already cleared the stack. */
+ STATIC ptr_t GC_high_water = NULL;
+ /* "hottest" stack pointer value we have seen */
+ /* recently. Degrades over time. */
+ STATIC word GC_bytes_allocd_at_reset = 0;
+# define DEGRADE_RATE 50
+# endif
+
+# if defined(ASM_CLEAR_CODE)
+ void *GC_clear_stack_inner(void *, ptr_t);
+# else
+ /* Clear the stack up to about limit. Return arg. This function */
+ /* is not static because it could also be erroneously defined in .S */
+ /* file, so this error would be caught by the linker. */
+ void *GC_clear_stack_inner(void *arg,
+# if defined(__APPLE_CC__) && !GC_CLANG_PREREQ(6, 0)
+ volatile /* to workaround some bug */
+# endif
+ ptr_t limit)
+ {
+# define CLEAR_SIZE 213 /* granularity */
+ volatile word dummy[CLEAR_SIZE];
+
+ BZERO((/* no volatile */ void *)dummy, sizeof(dummy));
+ if ((word)GC_approx_sp() COOLER_THAN (word)limit) {
+ (void)GC_clear_stack_inner(arg, limit);
+ }
+ /* Make sure the recursive call is not a tail call, and the bzero */
+ /* call is not recognized as dead code. */
+# if defined(CPPCHECK)
+ GC_noop1(dummy[0]);
+# else
+ GC_noop1(COVERT_DATAFLOW(dummy));
+# endif
+ return(arg);
+ }
+# endif /* !ASM_CLEAR_CODE */
+
+# ifdef THREADS
+ /* Used to occasionally clear a bigger chunk. */
+ /* TODO: Should be more random than it is ... */
+ GC_ATTR_NO_SANITIZE_THREAD
+ static unsigned next_random_no(void)
+ {
+ static unsigned random_no = 0;
+ return ++random_no % 13;
+ }
+# endif /* THREADS */
+
+/* Clear some of the inaccessible part of the stack. Returns its */
+/* argument, so it can be used in a tail call position, hence clearing */
+/* another frame. */
+ GC_API void * GC_CALL GC_clear_stack(void *arg)
+ {
+ ptr_t sp = GC_approx_sp(); /* Hotter than actual sp */
+# ifdef THREADS
+ word volatile dummy[SMALL_CLEAR_SIZE];
+# endif
+
+# define SLOP 400
+ /* Extra bytes we clear every time. This clears our own */
+ /* activation record, and should cause more frequent */
+ /* clearing near the cold end of the stack, a good thing. */
+# define GC_SLOP 4000
+ /* We make GC_high_water this much hotter than we really saw */
+ /* it, to cover for GC noise etc. above our current frame. */
+# define CLEAR_THRESHOLD 100000
+ /* We restart the clearing process after this many bytes of */
+ /* allocation. Otherwise very heavily recursive programs */
+ /* with sparse stacks may result in heaps that grow almost */
+ /* without bounds. As the heap gets larger, collection */
+ /* frequency decreases, thus clearing frequency would decrease, */
+ /* thus more junk remains accessible, thus the heap gets */
+ /* larger ... */
+# ifdef THREADS
+ if (next_random_no() == 0) {
+ ptr_t limit = sp;
+
+ MAKE_HOTTER(limit, BIG_CLEAR_SIZE*sizeof(word));
+ limit = (ptr_t)((word)limit & ~(word)0xf);
+ /* Make it sufficiently aligned for assembly */
+ /* implementations of GC_clear_stack_inner. */
+ return GC_clear_stack_inner(arg, limit);
+ }
+ BZERO((void *)dummy, SMALL_CLEAR_SIZE*sizeof(word));
+# else
+ if (GC_gc_no != GC_stack_last_cleared) {
+ /* Start things over, so we clear the entire stack again. */
+ if (EXPECT(NULL == GC_high_water, FALSE))
+ GC_high_water = (ptr_t)GC_stackbottom;
+ GC_min_sp = GC_high_water;
+ GC_stack_last_cleared = GC_gc_no;
+ GC_bytes_allocd_at_reset = GC_bytes_allocd;
+ }
+ /* Adjust GC_high_water. */
+ MAKE_COOLER(GC_high_water, WORDS_TO_BYTES(DEGRADE_RATE) + GC_SLOP);
+ if ((word)sp HOTTER_THAN (word)GC_high_water) {
+ GC_high_water = sp;
+ }
+ MAKE_HOTTER(GC_high_water, GC_SLOP);
+ {
+ ptr_t limit = GC_min_sp;
+
+ MAKE_HOTTER(limit, SLOP);
+ if ((word)sp COOLER_THAN (word)limit) {
+ limit = (ptr_t)((word)limit & ~(word)0xf);
+ /* Make it sufficiently aligned for assembly */
+ /* implementations of GC_clear_stack_inner. */
+ GC_min_sp = sp;
+ return GC_clear_stack_inner(arg, limit);
+ }
+ }
+ if (GC_bytes_allocd - GC_bytes_allocd_at_reset > CLEAR_THRESHOLD) {
+ /* Restart clearing process, but limit how much clearing we do. */
+ GC_min_sp = sp;
+ MAKE_HOTTER(GC_min_sp, CLEAR_THRESHOLD/4);
+ if ((word)GC_min_sp HOTTER_THAN (word)GC_high_water)
+ GC_min_sp = GC_high_water;
+ GC_bytes_allocd_at_reset = GC_bytes_allocd;
+ }
+# endif
+ return arg;
+ }
+
+#endif /* !ALWAYS_SMALL_CLEAR_STACK && !STACK_NOT_SCANNED */
+
+/* Return a pointer to the base address of p, given a pointer to a */
+/* an address within an object. Return 0 o.w. */
+GC_API void * GC_CALL GC_base(void * p)
+{
+ ptr_t r;
+ struct hblk *h;
+ bottom_index *bi;
+ hdr *candidate_hdr;
+
+ r = (ptr_t)p;
+ if (!EXPECT(GC_is_initialized, TRUE)) return 0;
+ h = HBLKPTR(r);
+ GET_BI(r, bi);
+ candidate_hdr = HDR_FROM_BI(bi, r);
+ if (candidate_hdr == 0) return(0);
+ /* If it's a pointer to the middle of a large object, move it */
+ /* to the beginning. */
+ while (IS_FORWARDING_ADDR_OR_NIL(candidate_hdr)) {
+ h = FORWARDED_ADDR(h,candidate_hdr);
+ r = (ptr_t)h;
+ candidate_hdr = HDR(h);
+ }
+ if (HBLK_IS_FREE(candidate_hdr)) return(0);
+ /* Make sure r points to the beginning of the object */
+ r = (ptr_t)((word)r & ~(word)(WORDS_TO_BYTES(1)-1));
+ {
+ size_t offset = HBLKDISPL(r);
+ word sz = candidate_hdr -> hb_sz;
+ size_t obj_displ = offset % sz;
+ ptr_t limit;
+
+ r -= obj_displ;
+ limit = r + sz;
+ if ((word)limit > (word)(h + 1) && sz <= HBLKSIZE) {
+ return(0);
+ }
+ if ((word)p >= (word)limit) return(0);
+ }
+ return((void *)r);
+}
+
+/* Return TRUE if and only if p points to somewhere in GC heap. */
+GC_API int GC_CALL GC_is_heap_ptr(const void *p)
+{
+ bottom_index *bi;
+
+ GC_ASSERT(GC_is_initialized);
+ GET_BI(p, bi);
+ return HDR_FROM_BI(bi, p) != 0;
+}
+
+GC_API size_t GC_CALL GC_size(const void * p)
+{
+ hdr *hhdr;
+
+ /* Accept NULL for compatibility with malloc_usable_size(). */
+ if (EXPECT(NULL == p, FALSE)) return 0;
+
+ hhdr = HDR(p);
+ return (size_t)hhdr->hb_sz;
+}
+
+/* These getters remain unsynchronized for compatibility (since some */
+/* clients could call some of them from a GC callback holding the */
+/* allocator lock). */
+
+GC_API size_t GC_CALL GC_get_heap_size(void)
+{
+ /* ignore the memory space returned to OS (i.e. count only the */
+ /* space owned by the garbage collector) */
+ return (size_t)(GC_heapsize - GC_unmapped_bytes);
+}
+
+GC_API size_t GC_CALL GC_get_obtained_from_os_bytes(void)
+{
+ return (size_t)GC_our_mem_bytes;
+}
+
+GC_API size_t GC_CALL GC_get_free_bytes(void)
+{
+ /* ignore the memory space returned to OS */
+ return (size_t)(GC_large_free_bytes - GC_unmapped_bytes);
+}
+
+GC_API size_t GC_CALL GC_get_unmapped_bytes(void)
+{
+ return (size_t)GC_unmapped_bytes;
+}
+
+GC_API size_t GC_CALL GC_get_bytes_since_gc(void)
+{
+ return (size_t)GC_bytes_allocd;
+}
+
+GC_API size_t GC_CALL GC_get_total_bytes(void)
+{
+ return (size_t)(GC_bytes_allocd + GC_bytes_allocd_before_gc);
+}
+
+#ifndef GC_GET_HEAP_USAGE_NOT_NEEDED
+
+GC_API size_t GC_CALL GC_get_size_map_at(int i)
+{
+ if ((unsigned)i > MAXOBJBYTES)
+ return GC_SIZE_MAX;
+ return GRANULES_TO_BYTES(GC_size_map[i]);
+}
+
+/* Return the heap usage information. This is a thread-safe (atomic) */
+/* alternative for the five above getters. NULL pointer is allowed for */
+/* any argument. Returned (filled in) values are of word type. */
+GC_API void GC_CALL GC_get_heap_usage_safe(GC_word *pheap_size,
+ GC_word *pfree_bytes, GC_word *punmapped_bytes,
+ GC_word *pbytes_since_gc, GC_word *ptotal_bytes)
+{
+ DCL_LOCK_STATE;
+
+ LOCK();
+ if (pheap_size != NULL)
+ *pheap_size = GC_heapsize - GC_unmapped_bytes;
+ if (pfree_bytes != NULL)
+ *pfree_bytes = GC_large_free_bytes - GC_unmapped_bytes;
+ if (punmapped_bytes != NULL)
+ *punmapped_bytes = GC_unmapped_bytes;
+ if (pbytes_since_gc != NULL)
+ *pbytes_since_gc = GC_bytes_allocd;
+ if (ptotal_bytes != NULL)
+ *ptotal_bytes = GC_bytes_allocd + GC_bytes_allocd_before_gc;
+ UNLOCK();
+}
+
+ GC_INNER word GC_reclaimed_bytes_before_gc = 0;
+
+ /* Fill in GC statistics provided the destination is of enough size. */
+ static void fill_prof_stats(struct GC_prof_stats_s *pstats)
+ {
+ pstats->heapsize_full = GC_heapsize;
+ pstats->free_bytes_full = GC_large_free_bytes;
+ pstats->unmapped_bytes = GC_unmapped_bytes;
+ pstats->bytes_allocd_since_gc = GC_bytes_allocd;
+ pstats->allocd_bytes_before_gc = GC_bytes_allocd_before_gc;
+ pstats->non_gc_bytes = GC_non_gc_bytes;
+ pstats->gc_no = GC_gc_no; /* could be -1 */
+# ifdef PARALLEL_MARK
+ pstats->markers_m1 = (word)((signed_word)GC_markers_m1);
+# else
+ pstats->markers_m1 = 0; /* one marker */
+# endif
+ pstats->bytes_reclaimed_since_gc = GC_bytes_found > 0 ?
+ (word)GC_bytes_found : 0;
+ pstats->reclaimed_bytes_before_gc = GC_reclaimed_bytes_before_gc;
+ pstats->expl_freed_bytes_since_gc = GC_bytes_freed; /* since gc-7.7 */
+ pstats->obtained_from_os_bytes = GC_our_mem_bytes; /* since gc-8.2 */
+ }
+
+# include <string.h> /* for memset() */
+
+ GC_API size_t GC_CALL GC_get_prof_stats(struct GC_prof_stats_s *pstats,
+ size_t stats_sz)
+ {
+ struct GC_prof_stats_s stats;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ fill_prof_stats(stats_sz >= sizeof(stats) ? pstats : &stats);
+ UNLOCK();
+
+ if (stats_sz == sizeof(stats)) {
+ return sizeof(stats);
+ } else if (stats_sz > sizeof(stats)) {
+ /* Fill in the remaining part with -1. */
+ memset((char *)pstats + sizeof(stats), 0xff, stats_sz - sizeof(stats));
+ return sizeof(stats);
+ } else {
+ if (EXPECT(stats_sz > 0, TRUE))
+ BCOPY(&stats, pstats, stats_sz);
+ return stats_sz;
+ }
+ }
+
+# ifdef THREADS
+ /* The _unsafe version assumes the caller holds the allocation lock. */
+ GC_API size_t GC_CALL GC_get_prof_stats_unsafe(
+ struct GC_prof_stats_s *pstats,
+ size_t stats_sz)
+ {
+ struct GC_prof_stats_s stats;
+
+ if (stats_sz >= sizeof(stats)) {
+ fill_prof_stats(pstats);
+ if (stats_sz > sizeof(stats))
+ memset((char *)pstats + sizeof(stats), 0xff,
+ stats_sz - sizeof(stats));
+ return sizeof(stats);
+ } else {
+ if (EXPECT(stats_sz > 0, TRUE)) {
+ fill_prof_stats(&stats);
+ BCOPY(&stats, pstats, stats_sz);
+ }
+ return stats_sz;
+ }
+ }
+# endif /* THREADS */
+
+#endif /* !GC_GET_HEAP_USAGE_NOT_NEEDED */
+
+#if defined(GC_DARWIN_THREADS) || defined(GC_OPENBSD_UTHREADS) \
+ || defined(GC_WIN32_THREADS) || (defined(NACL) && defined(THREADS))
+ /* GC does not use signals to suspend and restart threads. */
+ GC_API void GC_CALL GC_set_suspend_signal(int sig GC_ATTR_UNUSED)
+ {
+ /* empty */
+ }
+
+ GC_API void GC_CALL GC_set_thr_restart_signal(int sig GC_ATTR_UNUSED)
+ {
+ /* empty */
+ }
+
+ GC_API int GC_CALL GC_get_suspend_signal(void)
+ {
+ return -1;
+ }
+
+ GC_API int GC_CALL GC_get_thr_restart_signal(void)
+ {
+ return -1;
+ }
+#endif /* GC_DARWIN_THREADS || GC_WIN32_THREADS || ... */
+
+#if !defined(_MAX_PATH) && (defined(MSWIN32) || defined(MSWINCE) \
+ || defined(CYGWIN32))
+# define _MAX_PATH MAX_PATH
+#endif
+
+#ifdef GC_READ_ENV_FILE
+ /* This works for Win32/WinCE for now. Really useful only for WinCE. */
+ STATIC char *GC_envfile_content = NULL;
+ /* The content of the GC "env" file with CR and */
+ /* LF replaced to '\0'. NULL if the file is */
+ /* missing or empty. Otherwise, always ends */
+ /* with '\0'. */
+ STATIC unsigned GC_envfile_length = 0;
+ /* Length of GC_envfile_content (if non-NULL). */
+
+# ifndef GC_ENVFILE_MAXLEN
+# define GC_ENVFILE_MAXLEN 0x4000
+# endif
+
+# define GC_ENV_FILE_EXT ".gc.env"
+
+ /* The routine initializes GC_envfile_content from the GC "env" file. */
+ STATIC void GC_envfile_init(void)
+ {
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+ HANDLE hFile;
+ char *content;
+ unsigned ofs;
+ unsigned len;
+ DWORD nBytesRead;
+ TCHAR path[_MAX_PATH + 0x10]; /* buffer for path + ext */
+ size_t bytes_to_get;
+
+ len = (unsigned)GetModuleFileName(NULL /* hModule */, path,
+ _MAX_PATH + 1);
+ /* If GetModuleFileName() has failed then len is 0. */
+ if (len > 4 && path[len - 4] == (TCHAR)'.') {
+ len -= 4; /* strip executable file extension */
+ }
+ BCOPY(TEXT(GC_ENV_FILE_EXT), &path[len], sizeof(TEXT(GC_ENV_FILE_EXT)));
+ hFile = CreateFile(path, GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL /* lpSecurityAttributes */, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL, NULL /* hTemplateFile */);
+ if (hFile == INVALID_HANDLE_VALUE)
+ return; /* the file is absent or the operation is failed */
+ len = (unsigned)GetFileSize(hFile, NULL);
+ if (len <= 1 || len >= GC_ENVFILE_MAXLEN) {
+ CloseHandle(hFile);
+ return; /* invalid file length - ignoring the file content */
+ }
+ /* At this execution point, GC_setpagesize() and GC_init_win32() */
+ /* must already be called (for GET_MEM() to work correctly). */
+ GC_ASSERT(GC_page_size != 0);
+ bytes_to_get = ROUNDUP_PAGESIZE_IF_MMAP((size_t)len + 1);
+ content = (char *)GET_MEM(bytes_to_get);
+ if (content == NULL) {
+ CloseHandle(hFile);
+ return; /* allocation failure */
+ }
+ GC_add_to_our_memory(content, bytes_to_get);
+ ofs = 0;
+ nBytesRead = (DWORD)-1L;
+ /* Last ReadFile() call should clear nBytesRead on success. */
+ while (ReadFile(hFile, content + ofs, len - ofs + 1, &nBytesRead,
+ NULL /* lpOverlapped */) && nBytesRead != 0) {
+ if ((ofs += nBytesRead) > len)
+ break;
+ }
+ CloseHandle(hFile);
+ if (ofs != len || nBytesRead != 0) {
+ /* TODO: recycle content */
+ return; /* read operation is failed - ignoring the file content */
+ }
+ content[ofs] = '\0';
+ while (ofs-- > 0) {
+ if (content[ofs] == '\r' || content[ofs] == '\n')
+ content[ofs] = '\0';
+ }
+ GC_ASSERT(NULL == GC_envfile_content);
+ GC_envfile_length = len + 1;
+ GC_envfile_content = content;
+# endif
+ }
+
+ /* This routine scans GC_envfile_content for the specified */
+ /* environment variable (and returns its value if found). */
+ GC_INNER char * GC_envfile_getenv(const char *name)
+ {
+ char *p;
+ char *end_of_content;
+ size_t namelen;
+
+# ifndef NO_GETENV
+ p = getenv(name); /* try the standard getenv() first */
+ if (p != NULL)
+ return *p != '\0' ? p : NULL;
+# endif
+ p = GC_envfile_content;
+ if (p == NULL)
+ return NULL; /* "env" file is absent (or empty) */
+ namelen = strlen(name);
+ if (namelen == 0) /* a sanity check */
+ return NULL;
+ for (end_of_content = p + GC_envfile_length;
+ p != end_of_content; p += strlen(p) + 1) {
+ if (strncmp(p, name, namelen) == 0 && *(p += namelen) == '=') {
+ p++; /* the match is found; skip '=' */
+ return *p != '\0' ? p : NULL;
+ }
+ /* If not matching then skip to the next line. */
+ }
+ return NULL; /* no match found */
+ }
+#endif /* GC_READ_ENV_FILE */
+
+GC_INNER GC_bool GC_is_initialized = FALSE;
+
+GC_API int GC_CALL GC_is_init_called(void)
+{
+ return GC_is_initialized;
+}
+
+#if defined(GC_WIN32_THREADS) \
+ && ((defined(MSWIN32) && !defined(CONSOLE_LOG)) || defined(MSWINCE))
+ GC_INNER CRITICAL_SECTION GC_write_cs;
+#endif
+
+#ifndef DONT_USE_ATEXIT
+# if !defined(PCR) && !defined(SMALL_CONFIG)
+ /* A dedicated variable to avoid a garbage collection on abort. */
+ /* GC_find_leak cannot be used for this purpose as otherwise */
+ /* TSan finds a data race (between GC_default_on_abort and, e.g., */
+ /* GC_finish_collection). */
+ static GC_bool skip_gc_atexit = FALSE;
+# else
+# define skip_gc_atexit FALSE
+# endif
+
+ STATIC void GC_exit_check(void)
+ {
+ if (GC_find_leak && !skip_gc_atexit) {
+# ifdef THREADS
+ /* Check that the thread executing at-exit functions is */
+ /* the same as the one performed the GC initialization, */
+ /* otherwise the latter thread might already be dead but */
+ /* still registered and this, as a consequence, might */
+ /* cause a signal delivery fail when suspending the threads */
+ /* on platforms that do not guarantee ESRCH returned if */
+ /* the signal is not delivered. */
+ /* It should also prevent "Collecting from unknown thread" */
+ /* abort in GC_push_all_stacks(). */
+ if (!GC_is_main_thread() || !GC_thread_is_registered()) return;
+# endif
+ GC_gcollect();
+ }
+ }
+#endif
+
+#if defined(UNIX_LIKE) && !defined(NO_DEBUGGING)
+ static void looping_handler(int sig)
+ {
+ GC_err_printf("Caught signal %d: looping in handler\n", sig);
+ for (;;) {
+ /* empty */
+ }
+ }
+
+ static GC_bool installed_looping_handler = FALSE;
+
+ static void maybe_install_looping_handler(void)
+ {
+ /* Install looping handler before the write fault handler, so we */
+ /* handle write faults correctly. */
+ if (!installed_looping_handler && 0 != GETENV("GC_LOOP_ON_ABORT")) {
+ GC_set_and_save_fault_handler(looping_handler);
+ installed_looping_handler = TRUE;
+ }
+ }
+
+#else /* !UNIX_LIKE */
+# define maybe_install_looping_handler()
+#endif
+
+#define GC_DEFAULT_STDOUT_FD 1
+#define GC_DEFAULT_STDERR_FD 2
+
+#if !defined(OS2) && !defined(MACOS) && !defined(GC_ANDROID_LOG) \
+ && !defined(NN_PLATFORM_CTR) && !defined(NINTENDO_SWITCH) \
+ && (!defined(MSWIN32) || defined(CONSOLE_LOG)) && !defined(MSWINCE)
+ STATIC int GC_stdout = GC_DEFAULT_STDOUT_FD;
+ STATIC int GC_stderr = GC_DEFAULT_STDERR_FD;
+ STATIC int GC_log = GC_DEFAULT_STDERR_FD;
+
+# ifndef MSWIN32
+ GC_API void GC_CALL GC_set_log_fd(int fd)
+ {
+ GC_log = fd;
+ }
+# endif
+#endif
+
+#ifdef MSGBOX_ON_ERROR
+ STATIC void GC_win32_MessageBoxA(const char *msg, const char *caption,
+ unsigned flags)
+ {
+# ifndef DONT_USE_USER32_DLL
+ /* Use static binding to "user32.dll". */
+ (void)MessageBoxA(NULL, msg, caption, flags);
+# else
+ /* This simplifies linking - resolve "MessageBoxA" at run-time. */
+ HINSTANCE hU32 = LoadLibrary(TEXT("user32.dll"));
+ if (hU32) {
+ FARPROC pfn = GetProcAddress(hU32, "MessageBoxA");
+ if (pfn)
+ (void)(*(int (WINAPI *)(HWND, LPCSTR, LPCSTR, UINT))(word)pfn)(
+ NULL /* hWnd */, msg, caption, flags);
+ (void)FreeLibrary(hU32);
+ }
+# endif
+ }
+#endif /* MSGBOX_ON_ERROR */
+
+#if defined(THREADS) && defined(UNIX_LIKE) && !defined(NO_GETCONTEXT)
+ static void callee_saves_pushed_dummy_fn(ptr_t data GC_ATTR_UNUSED,
+ void * context GC_ATTR_UNUSED) {}
+#endif
+
+#ifndef SMALL_CONFIG
+# ifdef MANUAL_VDB
+ static GC_bool manual_vdb_allowed = TRUE;
+# else
+ static GC_bool manual_vdb_allowed = FALSE;
+# endif
+
+ GC_API void GC_CALL GC_set_manual_vdb_allowed(int value)
+ {
+ manual_vdb_allowed = (GC_bool)value;
+ }
+
+ GC_API int GC_CALL GC_get_manual_vdb_allowed(void)
+ {
+ return (int)manual_vdb_allowed;
+ }
+#endif /* !SMALL_CONFIG */
+
+STATIC word GC_parse_mem_size_arg(const char *str)
+{
+ word result = 0; /* bad value */
+
+ if (*str != '\0') {
+ char *endptr;
+ char ch;
+
+ result = (word)STRTOULL(str, &endptr, 10);
+ ch = *endptr;
+ if (ch != '\0') {
+ if (*(endptr + 1) != '\0')
+ return 0;
+ /* Allow k, M or G suffix. */
+ switch (ch) {
+ case 'K':
+ case 'k':
+ result <<= 10;
+ break;
+ case 'M':
+ case 'm':
+ result <<= 20;
+ break;
+ case 'G':
+ case 'g':
+ result <<= 30;
+ break;
+ default:
+ result = 0;
+ }
+ }
+ }
+ return result;
+}
+
+#define GC_LOG_STD_NAME "gc.log"
+
+GC_API void GC_CALL GC_init(void)
+{
+ /* LOCK(); -- no longer does anything this early. */
+ word initial_heap_sz;
+ IF_CANCEL(int cancel_state;)
+# if defined(GC_ASSERTIONS) && defined(GC_ALWAYS_MULTITHREADED)
+ DCL_LOCK_STATE;
+# endif
+
+ if (EXPECT(GC_is_initialized, TRUE)) return;
+# ifdef REDIRECT_MALLOC
+ {
+ static GC_bool init_started = FALSE;
+ if (init_started)
+ ABORT("Redirected malloc() called during GC init");
+ init_started = TRUE;
+ }
+# endif
+
+# if defined(GC_INITIAL_HEAP_SIZE) && !defined(CPPCHECK)
+ initial_heap_sz = GC_INITIAL_HEAP_SIZE;
+# else
+ initial_heap_sz = MINHINCR * HBLKSIZE;
+# endif
+
+ DISABLE_CANCEL(cancel_state);
+ /* Note that although we are nominally called with the */
+ /* allocation lock held, the allocation lock is now */
+ /* only really acquired once a second thread is forked.*/
+ /* And the initialization code needs to run before */
+ /* then. Thus we really don't hold any locks, and can */
+ /* in fact safely initialize them here. */
+# ifdef THREADS
+# ifndef GC_ALWAYS_MULTITHREADED
+ GC_ASSERT(!GC_need_to_lock);
+# endif
+# ifdef SN_TARGET_PS3
+ {
+ pthread_mutexattr_t mattr;
+
+ if (0 != pthread_mutexattr_init(&mattr)) {
+ ABORT("pthread_mutexattr_init failed");
+ }
+ if (0 != pthread_mutex_init(&GC_allocate_ml, &mattr)) {
+ ABORT("pthread_mutex_init failed");
+ }
+ (void)pthread_mutexattr_destroy(&mattr);
+ }
+# endif
+# endif /* THREADS */
+# if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS)
+# ifndef SPIN_COUNT
+# define SPIN_COUNT 4000
+# endif
+# ifdef MSWINRT_FLAVOR
+ InitializeCriticalSectionAndSpinCount(&GC_allocate_ml, SPIN_COUNT);
+# else
+ {
+# ifndef MSWINCE
+ FARPROC pfn = 0;
+ HMODULE hK32 = GetModuleHandle(TEXT("kernel32.dll"));
+ if (hK32)
+ pfn = GetProcAddress(hK32,
+ "InitializeCriticalSectionAndSpinCount");
+ if (pfn) {
+ (*(BOOL (WINAPI *)(LPCRITICAL_SECTION, DWORD))(word)pfn)(
+ &GC_allocate_ml, SPIN_COUNT);
+ } else
+# endif /* !MSWINCE */
+ /* else */ InitializeCriticalSection(&GC_allocate_ml);
+ }
+# endif
+# endif /* GC_WIN32_THREADS && !GC_PTHREADS */
+# if defined(GC_WIN32_THREADS) \
+ && ((defined(MSWIN32) && !defined(CONSOLE_LOG)) || defined(MSWINCE))
+ InitializeCriticalSection(&GC_write_cs);
+# endif
+ GC_setpagesize();
+# ifdef MSWIN32
+ GC_init_win32();
+# endif
+# ifdef GC_READ_ENV_FILE
+ GC_envfile_init();
+# endif
+# if !defined(NO_CLOCK) || !defined(SMALL_CONFIG)
+# ifdef GC_PRINT_VERBOSE_STATS
+ /* This is useful for debugging and profiling on platforms with */
+ /* missing getenv() (like WinCE). */
+ GC_print_stats = VERBOSE;
+# else
+ if (0 != GETENV("GC_PRINT_VERBOSE_STATS")) {
+ GC_print_stats = VERBOSE;
+ } else if (0 != GETENV("GC_PRINT_STATS")) {
+ GC_print_stats = 1;
+ }
+# endif
+# endif
+# if ((defined(UNIX_LIKE) && !defined(GC_ANDROID_LOG)) \
+ || (defined(CONSOLE_LOG) && defined(MSWIN32)) \
+ || defined(CYGWIN32) || defined(SYMBIAN)) && !defined(SMALL_CONFIG)
+ {
+ char * file_name = TRUSTED_STRING(GETENV("GC_LOG_FILE"));
+# ifdef GC_LOG_TO_FILE_ALWAYS
+ if (NULL == file_name)
+ file_name = GC_LOG_STD_NAME;
+# else
+ if (0 != file_name)
+# endif
+ {
+# if defined(_MSC_VER)
+ int log_d = _open(file_name, O_CREAT | O_WRONLY | O_APPEND);
+# else
+ int log_d = open(file_name, O_CREAT | O_WRONLY | O_APPEND, 0644);
+# endif
+ if (log_d < 0) {
+ GC_err_printf("Failed to open %s as log file\n", file_name);
+ } else {
+ char *str;
+ GC_log = log_d;
+ str = GETENV("GC_ONLY_LOG_TO_FILE");
+# ifdef GC_ONLY_LOG_TO_FILE
+ /* The similar environment variable set to "0" */
+ /* overrides the effect of the macro defined. */
+ if (str != NULL && *str == '0' && *(str + 1) == '\0')
+# else
+ /* Otherwise setting the environment variable */
+ /* to anything other than "0" will prevent from */
+ /* redirecting stdout/err to the log file. */
+ if (str == NULL || (*str == '0' && *(str + 1) == '\0'))
+# endif
+ {
+ GC_stdout = log_d;
+ GC_stderr = log_d;
+ }
+ }
+ }
+ }
+# endif
+# if !defined(NO_DEBUGGING) && !defined(GC_DUMP_REGULARLY)
+ if (0 != GETENV("GC_DUMP_REGULARLY")) {
+ GC_dump_regularly = TRUE;
+ }
+# endif
+# ifdef KEEP_BACK_PTRS
+ {
+ char * backtraces_string = GETENV("GC_BACKTRACES");
+ if (0 != backtraces_string) {
+ GC_backtraces = atol(backtraces_string);
+ if (backtraces_string[0] == '\0') GC_backtraces = 1;
+ }
+ }
+# endif
+ if (0 != GETENV("GC_FIND_LEAK")) {
+ GC_find_leak = 1;
+ }
+# ifndef SHORT_DBG_HDRS
+ if (0 != GETENV("GC_FINDLEAK_DELAY_FREE")) {
+ GC_findleak_delay_free = TRUE;
+ }
+# endif
+ if (0 != GETENV("GC_ALL_INTERIOR_POINTERS")) {
+ GC_all_interior_pointers = 1;
+ }
+ if (0 != GETENV("GC_DONT_GC")) {
+# ifdef LINT2
+ GC_disable();
+# else
+ GC_dont_gc = 1;
+# endif
+ }
+ if (0 != GETENV("GC_PRINT_BACK_HEIGHT")) {
+ GC_print_back_height = TRUE;
+ }
+ if (0 != GETENV("GC_NO_BLACKLIST_WARNING")) {
+ GC_large_alloc_warn_interval = LONG_MAX;
+ }
+ {
+ char * addr_string = GETENV("GC_TRACE");
+ if (0 != addr_string) {
+# ifndef ENABLE_TRACE
+ WARN("Tracing not enabled: Ignoring GC_TRACE value\n", 0);
+# else
+ word addr = (word)STRTOULL(addr_string, NULL, 16);
+ if (addr < 0x1000)
+ WARN("Unlikely trace address: %p\n", (void *)addr);
+ GC_trace_addr = (ptr_t)addr;
+# endif
+ }
+ }
+# ifdef GC_COLLECT_AT_MALLOC
+ {
+ char * string = GETENV("GC_COLLECT_AT_MALLOC");
+ if (0 != string) {
+ size_t min_lb = (size_t)STRTOULL(string, NULL, 10);
+ if (min_lb > 0)
+ GC_dbg_collect_at_malloc_min_lb = min_lb;
+ }
+ }
+# endif
+# if !defined(GC_DISABLE_INCREMENTAL) && !defined(NO_CLOCK)
+ {
+ char * time_limit_string = GETENV("GC_PAUSE_TIME_TARGET");
+ if (0 != time_limit_string) {
+ long time_limit = atol(time_limit_string);
+ if (time_limit > 0) {
+ GC_time_limit = time_limit;
+ }
+ }
+ }
+# endif
+# ifndef SMALL_CONFIG
+ {
+ char * full_freq_string = GETENV("GC_FULL_FREQUENCY");
+ if (full_freq_string != NULL) {
+ int full_freq = atoi(full_freq_string);
+ if (full_freq > 0)
+ GC_full_freq = full_freq;
+ }
+ }
+# endif
+ {
+ char * interval_string = GETENV("GC_LARGE_ALLOC_WARN_INTERVAL");
+ if (0 != interval_string) {
+ long interval = atol(interval_string);
+ if (interval <= 0) {
+ WARN("GC_LARGE_ALLOC_WARN_INTERVAL environment variable has "
+ "bad value: Ignoring\n", 0);
+ } else {
+ GC_large_alloc_warn_interval = interval;
+ }
+ }
+ }
+ {
+ char * space_divisor_string = GETENV("GC_FREE_SPACE_DIVISOR");
+ if (space_divisor_string != NULL) {
+ int space_divisor = atoi(space_divisor_string);
+ if (space_divisor > 0)
+ GC_free_space_divisor = (unsigned)space_divisor;
+ }
+ }
+# ifdef USE_MUNMAP
+ {
+ char * string = GETENV("GC_UNMAP_THRESHOLD");
+ if (string != NULL) {
+ if (*string == '0' && *(string + 1) == '\0') {
+ /* "0" is used to disable unmapping. */
+ GC_unmap_threshold = 0;
+ } else {
+ int unmap_threshold = atoi(string);
+ if (unmap_threshold > 0)
+ GC_unmap_threshold = unmap_threshold;
+ }
+ }
+ }
+ {
+ char * string = GETENV("GC_FORCE_UNMAP_ON_GCOLLECT");
+ if (string != NULL) {
+ if (*string == '0' && *(string + 1) == '\0') {
+ /* "0" is used to turn off the mode. */
+ GC_force_unmap_on_gcollect = FALSE;
+ } else {
+ GC_force_unmap_on_gcollect = TRUE;
+ }
+ }
+ }
+ {
+ char * string = GETENV("GC_USE_ENTIRE_HEAP");
+ if (string != NULL) {
+ if (*string == '0' && *(string + 1) == '\0') {
+ /* "0" is used to turn off the mode. */
+ GC_use_entire_heap = FALSE;
+ } else {
+ GC_use_entire_heap = TRUE;
+ }
+ }
+ }
+# endif
+# if !defined(NO_DEBUGGING) && !defined(NO_CLOCK)
+ GET_TIME(GC_init_time);
+# endif
+ maybe_install_looping_handler();
+# if ALIGNMENT > GC_DS_TAGS
+ /* Adjust normal object descriptor for extra allocation. */
+ if (EXTRA_BYTES != 0)
+ GC_obj_kinds[NORMAL].ok_descriptor =
+ ((~(word)ALIGNMENT) + 1) | GC_DS_LENGTH;
+# endif
+ GC_exclude_static_roots_inner(beginGC_arrays, endGC_arrays);
+ GC_exclude_static_roots_inner(beginGC_obj_kinds, endGC_obj_kinds);
+# ifdef SEPARATE_GLOBALS
+ GC_exclude_static_roots_inner(beginGC_objfreelist, endGC_objfreelist);
+ GC_exclude_static_roots_inner(beginGC_aobjfreelist, endGC_aobjfreelist);
+# endif
+# if defined(USE_PROC_FOR_LIBRARIES) && defined(GC_LINUX_THREADS)
+ WARN("USE_PROC_FOR_LIBRARIES + GC_LINUX_THREADS performs poorly.\n", 0);
+ /* If thread stacks are cached, they tend to be scanned in */
+ /* entirety as part of the root set. This will grow them to */
+ /* maximum size, and is generally not desirable. */
+# endif
+# if !defined(THREADS) || defined(GC_PTHREADS) \
+ || defined(NN_PLATFORM_CTR) || defined(NINTENDO_SWITCH) \
+ || defined(GC_WIN32_THREADS) || defined(GC_SOLARIS_THREADS)
+ if (GC_stackbottom == 0) {
+ GC_stackbottom = GC_get_main_stack_base();
+# if (defined(LINUX) || defined(HPUX)) && defined(IA64)
+ GC_register_stackbottom = GC_get_register_stack_base();
+# endif
+ } else {
+# if (defined(LINUX) || defined(HPUX)) && defined(IA64)
+ if (GC_register_stackbottom == 0) {
+ WARN("GC_register_stackbottom should be set with GC_stackbottom\n", 0);
+ /* The following may fail, since we may rely on */
+ /* alignment properties that may not hold with a user set */
+ /* GC_stackbottom. */
+ GC_register_stackbottom = GC_get_register_stack_base();
+ }
+# endif
+ }
+# endif
+# if !defined(CPPCHECK)
+ GC_STATIC_ASSERT(sizeof(ptr_t) == sizeof(word));
+ GC_STATIC_ASSERT(sizeof(signed_word) == sizeof(word));
+# if !defined(_AUX_SOURCE) || defined(__GNUC__)
+ GC_STATIC_ASSERT((word)(-1) > (word)0);
+ /* word should be unsigned */
+# endif
+ /* We no longer check for ((void*)(-1) > NULL) since all pointers */
+ /* are explicitly cast to word in every less/greater comparison. */
+ GC_STATIC_ASSERT((signed_word)(-1) < (signed_word)0);
+# endif
+ GC_STATIC_ASSERT(sizeof (struct hblk) == HBLKSIZE);
+# ifndef THREADS
+ GC_ASSERT(!((word)GC_stackbottom HOTTER_THAN (word)GC_approx_sp()));
+# endif
+ GC_init_headers();
+# if defined(GC_ASSERTIONS) && defined(GC_ALWAYS_MULTITHREADED) \
+ && (defined(SEARCH_FOR_DATA_START) || defined(NETBSD))
+ LOCK(); /* just to set GC_lock_holder */
+# endif
+# ifdef SEARCH_FOR_DATA_START
+ /* For MPROTECT_VDB, the temporary fault handler should be */
+ /* installed first, before the write fault one in GC_dirty_init. */
+ if (GC_REGISTER_MAIN_STATIC_DATA()) GC_init_linux_data_start();
+# elif defined(NETBSD) && defined(__ELF__)
+ if (GC_REGISTER_MAIN_STATIC_DATA()) GC_init_netbsd_elf();
+# endif
+# if defined(GC_ASSERTIONS) && defined(GC_ALWAYS_MULTITHREADED) \
+ && (defined(SEARCH_FOR_DATA_START) || defined(NETBSD))
+ UNLOCK();
+# endif
+# ifndef GC_DISABLE_INCREMENTAL
+ if (GC_incremental || 0 != GETENV("GC_ENABLE_INCREMENTAL")) {
+# if defined(BASE_ATOMIC_OPS_EMULATED) || defined(CHECKSUMS) \
+ || defined(REDIRECT_MALLOC) || defined(REDIRECT_MALLOC_IN_HEADER) \
+ || defined(SMALL_CONFIG)
+ /* TODO: Implement CHECKSUMS for manual VDB. */
+# else
+ if (manual_vdb_allowed) {
+ GC_manual_vdb = TRUE;
+ GC_incremental = TRUE;
+ } else
+# endif
+ /* else */ {
+ /* For GWW_VDB on Win32, this needs to happen before any */
+ /* heap memory is allocated. */
+ GC_incremental = GC_dirty_init();
+ GC_ASSERT(GC_bytes_allocd == 0);
+ }
+ }
+# endif
+
+ /* Add initial guess of root sets. Do this first, since sbrk(0) */
+ /* might be used. */
+ if (GC_REGISTER_MAIN_STATIC_DATA()) GC_register_data_segments();
+
+ GC_bl_init();
+ GC_mark_init();
+ {
+ char * sz_str = GETENV("GC_INITIAL_HEAP_SIZE");
+ if (sz_str != NULL) {
+ initial_heap_sz = GC_parse_mem_size_arg(sz_str);
+ if (initial_heap_sz <= MINHINCR * HBLKSIZE) {
+ WARN("Bad initial heap size %s - ignoring it.\n", sz_str);
+ }
+ }
+ }
+ {
+ char * sz_str = GETENV("GC_MAXIMUM_HEAP_SIZE");
+ if (sz_str != NULL) {
+ word max_heap_sz = GC_parse_mem_size_arg(sz_str);
+ if (max_heap_sz < initial_heap_sz) {
+ WARN("Bad maximum heap size %s - ignoring it.\n", sz_str);
+ }
+ if (0 == GC_max_retries) GC_max_retries = 2;
+ GC_set_max_heap_size(max_heap_sz);
+ }
+ }
+# if defined(GC_ASSERTIONS) && defined(GC_ALWAYS_MULTITHREADED)
+ LOCK(); /* just to set GC_lock_holder */
+# endif
+ if (!GC_expand_hp_inner(divHBLKSZ(initial_heap_sz))) {
+ GC_err_printf("Can't start up: not enough memory\n");
+ EXIT();
+ } else {
+ GC_requested_heapsize += initial_heap_sz;
+ }
+ if (GC_all_interior_pointers)
+ GC_initialize_offsets();
+ GC_register_displacement_inner(0L);
+# if defined(GC_LINUX_THREADS) && defined(REDIRECT_MALLOC)
+ if (!GC_all_interior_pointers) {
+ /* TLS ABI uses pointer-sized offsets for dtv. */
+ GC_register_displacement_inner(sizeof(void *));
+ }
+# endif
+ GC_init_size_map();
+# ifdef PCR
+ if (PCR_IL_Lock(PCR_Bool_false, PCR_allSigsBlocked, PCR_waitForever)
+ != PCR_ERes_okay) {
+ ABORT("Can't lock load state");
+ } else if (PCR_IL_Unlock() != PCR_ERes_okay) {
+ ABORT("Can't unlock load state");
+ }
+ PCR_IL_Unlock();
+ GC_pcr_install();
+# endif
+ GC_is_initialized = TRUE;
+# if defined(GC_PTHREADS) || defined(GC_WIN32_THREADS)
+# if defined(LINT2) \
+ && !(defined(GC_ASSERTIONS) && defined(GC_ALWAYS_MULTITHREADED))
+ LOCK();
+ GC_thr_init();
+ UNLOCK();
+# else
+ GC_thr_init();
+# endif
+# endif
+ COND_DUMP;
+ /* Get black list set up and/or incremental GC started */
+ if (!GC_dont_precollect || GC_incremental) {
+ GC_gcollect_inner();
+ }
+# if defined(GC_ASSERTIONS) && defined(GC_ALWAYS_MULTITHREADED)
+ UNLOCK();
+# endif
+# if defined(THREADS) && defined(UNIX_LIKE) && !defined(NO_GETCONTEXT)
+ /* Ensure getcontext_works is set to avoid potential data race. */
+ if (GC_dont_gc || GC_dont_precollect)
+ GC_with_callee_saves_pushed(callee_saves_pushed_dummy_fn, NULL);
+# endif
+# ifndef DONT_USE_ATEXIT
+ if (GC_find_leak) {
+ /* This is to give us at least one chance to detect leaks. */
+ /* This may report some very benign leaks, but ... */
+ atexit(GC_exit_check);
+ }
+# endif
+
+ /* The rest of this again assumes we don't really hold */
+ /* the allocation lock. */
+# if defined(PARALLEL_MARK) || defined(THREAD_LOCAL_ALLOC) \
+ || (defined(GC_ALWAYS_MULTITHREADED) && defined(GC_WIN32_THREADS) \
+ && !defined(GC_NO_THREADS_DISCOVERY))
+ /* Make sure thread local allocation is initialized, in */
+ /* case we did not get called from GC_init_parallel(). */
+ GC_init_parallel();
+# endif /* PARALLEL_MARK || THREAD_LOCAL_ALLOC */
+
+# if defined(DYNAMIC_LOADING) && defined(DARWIN)
+ /* This must be called WITHOUT the allocation lock held */
+ /* and before any threads are created. */
+ GC_init_dyld();
+# endif
+ RESTORE_CANCEL(cancel_state);
+}
+
+GC_API void GC_CALL GC_enable_incremental(void)
+{
+# if !defined(GC_DISABLE_INCREMENTAL) && !defined(KEEP_BACK_PTRS)
+ DCL_LOCK_STATE;
+ /* If we are keeping back pointers, the GC itself dirties all */
+ /* pages on which objects have been marked, making */
+ /* incremental GC pointless. */
+ if (!GC_find_leak && 0 == GETENV("GC_DISABLE_INCREMENTAL")) {
+ LOCK();
+ if (!GC_incremental) {
+ GC_setpagesize();
+ /* TODO: Should we skip enabling incremental if win32s? */
+ maybe_install_looping_handler(); /* Before write fault handler! */
+ if (!GC_is_initialized) {
+ UNLOCK();
+ GC_incremental = TRUE; /* indicate intention to turn it on */
+ GC_init();
+ LOCK();
+ } else {
+# if !defined(BASE_ATOMIC_OPS_EMULATED) && !defined(CHECKSUMS) \
+ && !defined(REDIRECT_MALLOC) \
+ && !defined(REDIRECT_MALLOC_IN_HEADER) && !defined(SMALL_CONFIG)
+ if (manual_vdb_allowed) {
+ GC_manual_vdb = TRUE;
+ GC_incremental = TRUE;
+ } else
+# endif
+ /* else */ {
+ GC_incremental = GC_dirty_init();
+ }
+ }
+ if (GC_incremental && !GC_dont_gc) {
+ /* Can't easily do it if GC_dont_gc. */
+ IF_CANCEL(int cancel_state;)
+
+ DISABLE_CANCEL(cancel_state);
+ if (GC_bytes_allocd > 0) {
+ /* There may be unmarked reachable objects. */
+ GC_gcollect_inner();
+ }
+ /* else we're OK in assuming everything's */
+ /* clean since nothing can point to an */
+ /* unmarked object. */
+ GC_read_dirty(FALSE);
+ RESTORE_CANCEL(cancel_state);
+ }
+ }
+ UNLOCK();
+ return;
+ }
+# endif
+ GC_init();
+}
+
+GC_API void GC_CALL GC_start_mark_threads(void)
+{
+# ifdef PARALLEL_MARK
+ IF_CANCEL(int cancel_state;)
+ DCL_LOCK_STATE;
+
+ DISABLE_CANCEL(cancel_state);
+ LOCK();
+ GC_start_mark_threads_inner();
+ UNLOCK();
+ RESTORE_CANCEL(cancel_state);
+# else
+ /* No action since parallel markers are disabled (or no POSIX fork). */
+ GC_ASSERT(I_DONT_HOLD_LOCK());
+# endif
+}
+
+ GC_API void GC_CALL GC_deinit(void)
+ {
+ if (GC_is_initialized) {
+ /* Prevent duplicate resource close. */
+ GC_is_initialized = FALSE;
+# if defined(GC_WIN32_THREADS) && (defined(MSWIN32) || defined(MSWINCE))
+# if !defined(CONSOLE_LOG) || defined(MSWINCE)
+ DeleteCriticalSection(&GC_write_cs);
+# endif
+# ifndef GC_PTHREADS
+ DeleteCriticalSection(&GC_allocate_ml);
+# endif
+# endif
+ }
+ }
+
+#if (defined(MSWIN32) && !defined(CONSOLE_LOG)) || defined(MSWINCE)
+
+# if defined(_MSC_VER) && defined(_DEBUG) && !defined(MSWINCE)
+# include <crtdbg.h>
+# endif
+
+ STATIC HANDLE GC_log = 0;
+
+# ifdef THREADS
+# if defined(PARALLEL_MARK) && !defined(GC_ALWAYS_MULTITHREADED)
+# define IF_NEED_TO_LOCK(x) if (GC_parallel || GC_need_to_lock) x
+# else
+# define IF_NEED_TO_LOCK(x) if (GC_need_to_lock) x
+# endif
+# else
+# define IF_NEED_TO_LOCK(x)
+# endif /* !THREADS */
+
+# ifdef MSWINRT_FLAVOR
+# include <windows.storage.h>
+
+ /* This API is defined in roapi.h, but we cannot include it here */
+ /* since it does not compile in C. */
+ DECLSPEC_IMPORT HRESULT WINAPI RoGetActivationFactory(
+ HSTRING activatableClassId,
+ REFIID iid, void** factory);
+
+ static GC_bool getWinRTLogPath(wchar_t* buf, size_t bufLen)
+ {
+ static const GUID kIID_IApplicationDataStatics = {
+ 0x5612147B, 0xE843, 0x45E3,
+ 0x94, 0xD8, 0x06, 0x16, 0x9E, 0x3C, 0x8E, 0x17
+ };
+ static const GUID kIID_IStorageItem = {
+ 0x4207A996, 0xCA2F, 0x42F7,
+ 0xBD, 0xE8, 0x8B, 0x10, 0x45, 0x7A, 0x7F, 0x30
+ };
+ GC_bool result = FALSE;
+ HSTRING_HEADER appDataClassNameHeader;
+ HSTRING appDataClassName;
+ __x_ABI_CWindows_CStorage_CIApplicationDataStatics* appDataStatics = 0;
+
+ GC_ASSERT(bufLen > 0);
+ if (SUCCEEDED(WindowsCreateStringReference(
+ RuntimeClass_Windows_Storage_ApplicationData,
+ (sizeof(RuntimeClass_Windows_Storage_ApplicationData)-1)
+ / sizeof(wchar_t),
+ &appDataClassNameHeader, &appDataClassName))
+ && SUCCEEDED(RoGetActivationFactory(appDataClassName,
+ &kIID_IApplicationDataStatics,
+ &appDataStatics))) {
+ __x_ABI_CWindows_CStorage_CIApplicationData* appData = NULL;
+ __x_ABI_CWindows_CStorage_CIStorageFolder* tempFolder = NULL;
+ __x_ABI_CWindows_CStorage_CIStorageItem* tempFolderItem = NULL;
+ HSTRING tempPath = NULL;
+
+ if (SUCCEEDED(appDataStatics->lpVtbl->get_Current(appDataStatics,
+ &appData))
+ && SUCCEEDED(appData->lpVtbl->get_TemporaryFolder(appData,
+ &tempFolder))
+ && SUCCEEDED(tempFolder->lpVtbl->QueryInterface(tempFolder,
+ &kIID_IStorageItem,
+ &tempFolderItem))
+ && SUCCEEDED(tempFolderItem->lpVtbl->get_Path(tempFolderItem,
+ &tempPath))) {
+ UINT32 tempPathLen;
+ const wchar_t* tempPathBuf =
+ WindowsGetStringRawBuffer(tempPath, &tempPathLen);
+
+ buf[0] = '\0';
+ if (wcsncat_s(buf, bufLen, tempPathBuf, tempPathLen) == 0
+ && wcscat_s(buf, bufLen, L"\\") == 0
+ && wcscat_s(buf, bufLen, TEXT(GC_LOG_STD_NAME)) == 0)
+ result = TRUE;
+ WindowsDeleteString(tempPath);
+ }
+
+ if (tempFolderItem != NULL)
+ tempFolderItem->lpVtbl->Release(tempFolderItem);
+ if (tempFolder != NULL)
+ tempFolder->lpVtbl->Release(tempFolder);
+ if (appData != NULL)
+ appData->lpVtbl->Release(appData);
+ appDataStatics->lpVtbl->Release(appDataStatics);
+ }
+ return result;
+ }
+# endif /* MSWINRT_FLAVOR */
+
+ STATIC HANDLE GC_CreateLogFile(void)
+ {
+ HANDLE hFile;
+# ifdef MSWINRT_FLAVOR
+ TCHAR pathBuf[_MAX_PATH + 0x10]; /* buffer for path + ext */
+
+ hFile = INVALID_HANDLE_VALUE;
+ if (getWinRTLogPath(pathBuf, _MAX_PATH + 1)) {
+ CREATEFILE2_EXTENDED_PARAMETERS extParams;
+
+ BZERO(&extParams, sizeof(extParams));
+ extParams.dwSize = sizeof(extParams);
+ extParams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
+ extParams.dwFileFlags = GC_print_stats == VERBOSE ? 0
+ : FILE_FLAG_WRITE_THROUGH;
+ hFile = CreateFile2(pathBuf, GENERIC_WRITE, FILE_SHARE_READ,
+ CREATE_ALWAYS, &extParams);
+ }
+
+# else
+ TCHAR *logPath;
+# if defined(NO_GETENV_WIN32) && defined(CPPCHECK)
+# define appendToFile FALSE
+# else
+ BOOL appendToFile = FALSE;
+# endif
+# if !defined(NO_GETENV_WIN32) || !defined(OLD_WIN32_LOG_FILE)
+ TCHAR pathBuf[_MAX_PATH + 0x10]; /* buffer for path + ext */
+
+ logPath = pathBuf;
+# endif
+
+ /* Use GetEnvironmentVariable instead of GETENV() for unicode support. */
+# ifndef NO_GETENV_WIN32
+ if (GetEnvironmentVariable(TEXT("GC_LOG_FILE"), pathBuf,
+ _MAX_PATH + 1) - 1U < (DWORD)_MAX_PATH) {
+ appendToFile = TRUE;
+ } else
+# endif
+ /* else */ {
+ /* Env var not found or its value too long. */
+# ifdef OLD_WIN32_LOG_FILE
+ logPath = TEXT(GC_LOG_STD_NAME);
+# else
+ int len = (int)GetModuleFileName(NULL /* hModule */, pathBuf,
+ _MAX_PATH + 1);
+ /* If GetModuleFileName() has failed then len is 0. */
+ if (len > 4 && pathBuf[len - 4] == (TCHAR)'.') {
+ len -= 4; /* strip executable file extension */
+ }
+ BCOPY(TEXT(".") TEXT(GC_LOG_STD_NAME), &pathBuf[len],
+ sizeof(TEXT(".") TEXT(GC_LOG_STD_NAME)));
+# endif
+ }
+
+ hFile = CreateFile(logPath, GENERIC_WRITE, FILE_SHARE_READ,
+ NULL /* lpSecurityAttributes */,
+ appendToFile ? OPEN_ALWAYS : CREATE_ALWAYS,
+ GC_print_stats == VERBOSE ? FILE_ATTRIBUTE_NORMAL :
+ /* immediately flush writes unless very verbose */
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
+ NULL /* hTemplateFile */);
+
+# ifndef NO_GETENV_WIN32
+ if (appendToFile && hFile != INVALID_HANDLE_VALUE) {
+ LONG posHigh = 0;
+ (void)SetFilePointer(hFile, 0, &posHigh, FILE_END);
+ /* Seek to file end (ignoring any error) */
+ }
+# endif
+# undef appendToFile
+# endif
+ return hFile;
+ }
+
+ STATIC int GC_write(const char *buf, size_t len)
+ {
+ BOOL res;
+ DWORD written;
+# if defined(THREADS) && defined(GC_ASSERTIONS)
+ static GC_bool inside_write = FALSE;
+ /* to prevent infinite recursion at abort. */
+ if (inside_write)
+ return -1;
+# endif
+
+ if (len == 0)
+ return 0;
+ IF_NEED_TO_LOCK(EnterCriticalSection(&GC_write_cs));
+# if defined(THREADS) && defined(GC_ASSERTIONS)
+ if (GC_write_disabled) {
+ inside_write = TRUE;
+ ABORT("Assertion failure: GC_write called with write_disabled");
+ }
+# endif
+ if (GC_log == 0) {
+ GC_log = GC_CreateLogFile();
+ }
+ if (GC_log == INVALID_HANDLE_VALUE) {
+ IF_NEED_TO_LOCK(LeaveCriticalSection(&GC_write_cs));
+# ifdef NO_DEBUGGING
+ /* Ignore open log failure (e.g., it might be caused by */
+ /* read-only folder of the client application). */
+ return 0;
+# else
+ return -1;
+# endif
+ }
+ res = WriteFile(GC_log, buf, (DWORD)len, &written, NULL);
+# if defined(_MSC_VER) && defined(_DEBUG) && !defined(NO_CRT)
+# ifdef MSWINCE
+ /* There is no CrtDbgReport() in WinCE */
+ {
+ WCHAR wbuf[1024];
+ /* Always use Unicode variant of OutputDebugString() */
+ wbuf[MultiByteToWideChar(CP_ACP, 0 /* dwFlags */,
+ buf, len, wbuf,
+ sizeof(wbuf) / sizeof(wbuf[0]) - 1)] = 0;
+ OutputDebugStringW(wbuf);
+ }
+# else
+ _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%.*s", len, buf);
+# endif
+# endif
+ IF_NEED_TO_LOCK(LeaveCriticalSection(&GC_write_cs));
+ return res ? (int)written : -1;
+ }
+
+ /* TODO: This is pretty ugly ... */
+# define WRITE(f, buf, len) GC_write(buf, len)
+
+#elif defined(OS2) || defined(MACOS)
+ STATIC FILE * GC_stdout = NULL;
+ STATIC FILE * GC_stderr = NULL;
+ STATIC FILE * GC_log = NULL;
+
+ /* Initialize GC_log (and the friends) passed to GC_write(). */
+ STATIC void GC_set_files(void)
+ {
+ if (GC_stdout == NULL) {
+ GC_stdout = stdout;
+ }
+ if (GC_stderr == NULL) {
+ GC_stderr = stderr;
+ }
+ if (GC_log == NULL) {
+ GC_log = stderr;
+ }
+ }
+
+ GC_INLINE int GC_write(FILE *f, const char *buf, size_t len)
+ {
+ int res = fwrite(buf, 1, len, f);
+ fflush(f);
+ return res;
+ }
+
+# define WRITE(f, buf, len) (GC_set_files(), GC_write(f, buf, len))
+
+#elif defined(GC_ANDROID_LOG)
+
+# include <android/log.h>
+
+# ifndef GC_ANDROID_LOG_TAG
+# define GC_ANDROID_LOG_TAG "BDWGC"
+# endif
+
+# define GC_stdout ANDROID_LOG_DEBUG
+# define GC_stderr ANDROID_LOG_ERROR
+# define GC_log GC_stdout
+
+# define WRITE(level, buf, unused_len) \
+ __android_log_write(level, GC_ANDROID_LOG_TAG, buf)
+
+#elif defined(NN_PLATFORM_CTR)
+ int n3ds_log_write(const char* text, int length);
+# define WRITE(level, buf, len) n3ds_log_write(buf, len)
+
+#elif defined(NINTENDO_SWITCH)
+ int switch_log_write(const char* text, int length);
+# define WRITE(level, buf, len) switch_log_write(buf, len)
+
+#else
+
+# if !defined(GC_NO_TYPES) && !defined(SN_TARGET_PSP2)
+# if !defined(AMIGA) && !defined(MSWIN32) && !defined(MSWIN_XBOX1) \
+ && !defined(__CC_ARM)
+# include <unistd.h>
+# endif
+# if !defined(ECOS) && !defined(NOSYS)
+# include <errno.h>
+# endif
+# endif /* !GC_NO_TYPES && !SN_TARGET_PSP2 */
+
+ STATIC int GC_write(int fd, const char *buf, size_t len)
+ {
+# if defined(ECOS) || defined(PLATFORM_WRITE) || defined(SN_TARGET_PSP2) \
+ || defined(NOSYS)
+# ifdef ECOS
+ /* FIXME: This seems to be defined nowhere at present. */
+ /* _Jv_diag_write(buf, len); */
+# else
+ /* No writing. */
+# endif
+ return len;
+# else
+ int bytes_written = 0;
+ IF_CANCEL(int cancel_state;)
+
+ DISABLE_CANCEL(cancel_state);
+ while ((unsigned)bytes_written < len) {
+# ifdef GC_SOLARIS_THREADS
+ int result = syscall(SYS_write, fd, buf + bytes_written,
+ len - bytes_written);
+# elif defined(_MSC_VER)
+ int result = _write(fd, buf + bytes_written,
+ (unsigned)(len - bytes_written));
+# else
+ int result = write(fd, buf + bytes_written, len - bytes_written);
+# endif
+
+ if (-1 == result) {
+ if (EAGAIN == errno) /* Resource temporarily unavailable */
+ continue;
+ RESTORE_CANCEL(cancel_state);
+ return(result);
+ }
+ bytes_written += result;
+ }
+ RESTORE_CANCEL(cancel_state);
+ return(bytes_written);
+# endif
+ }
+
+# define WRITE(f, buf, len) GC_write(f, buf, len)
+#endif /* !MSWINCE && !OS2 && !MACOS && !GC_ANDROID_LOG */
+
+#define BUFSZ 1024
+
+#if defined(DJGPP) || defined(__STRICT_ANSI__)
+ /* vsnprintf is missing in DJGPP (v2.0.3) */
+# define GC_VSNPRINTF(buf, bufsz, format, args) vsprintf(buf, format, args)
+#elif defined(_MSC_VER)
+# ifdef MSWINCE
+ /* _vsnprintf is deprecated in WinCE */
+# define GC_VSNPRINTF StringCchVPrintfA
+# else
+# define GC_VSNPRINTF _vsnprintf
+# endif
+#else
+# define GC_VSNPRINTF vsnprintf
+#endif
+
+/* A version of printf that is unlikely to call malloc, and is thus safer */
+/* to call from the collector in case malloc has been bound to GC_malloc. */
+/* Floating point arguments and formats should be avoided, since FP */
+/* conversion is more likely to allocate memory. */
+/* Assumes that no more than BUFSZ-1 characters are written at once. */
+#define GC_PRINTF_FILLBUF(buf, format) \
+ do { \
+ va_list args; \
+ va_start(args, format); \
+ (buf)[sizeof(buf) - 1] = 0x15; /* guard */ \
+ (void)GC_VSNPRINTF(buf, sizeof(buf) - 1, format, args); \
+ va_end(args); \
+ if ((buf)[sizeof(buf) - 1] != 0x15) \
+ ABORT("GC_printf clobbered stack"); \
+ } while (0)
+
+void GC_printf(const char *format, ...)
+{
+ if (!GC_quiet) {
+ char buf[BUFSZ + 1];
+
+ GC_PRINTF_FILLBUF(buf, format);
+# ifdef NACL
+ (void)WRITE(GC_stdout, buf, strlen(buf));
+ /* Ignore errors silently. */
+# else
+ if (WRITE(GC_stdout, buf, strlen(buf)) < 0
+# if defined(CYGWIN32) || (defined(CONSOLE_LOG) && defined(MSWIN32))
+ && GC_stdout != GC_DEFAULT_STDOUT_FD
+# endif
+ ) {
+ ABORT("write to stdout failed");
+ }
+# endif
+ }
+}
+
+void GC_err_printf(const char *format, ...)
+{
+ char buf[BUFSZ + 1];
+
+ GC_PRINTF_FILLBUF(buf, format);
+ GC_err_puts(buf);
+}
+
+void GC_log_printf(const char *format, ...)
+{
+ char buf[BUFSZ + 1];
+
+ GC_PRINTF_FILLBUF(buf, format);
+# ifdef NACL
+ (void)WRITE(GC_log, buf, strlen(buf));
+# else
+ if (WRITE(GC_log, buf, strlen(buf)) < 0
+# if defined(CYGWIN32) || (defined(CONSOLE_LOG) && defined(MSWIN32))
+ && GC_log != GC_DEFAULT_STDERR_FD
+# endif
+ ) {
+ ABORT("write to GC log failed");
+ }
+# endif
+}
+
+#ifndef GC_ANDROID_LOG
+
+# define GC_warn_printf GC_err_printf
+
+#else
+
+ GC_INNER void GC_info_log_printf(const char *format, ...)
+ {
+ char buf[BUFSZ + 1];
+
+ GC_PRINTF_FILLBUF(buf, format);
+ (void)WRITE(ANDROID_LOG_INFO, buf, 0 /* unused */);
+ }
+
+ GC_INNER void GC_verbose_log_printf(const char *format, ...)
+ {
+ char buf[BUFSZ + 1];
+
+ GC_PRINTF_FILLBUF(buf, format);
+ (void)WRITE(ANDROID_LOG_VERBOSE, buf, 0); /* ignore write errors */
+ }
+
+ STATIC void GC_warn_printf(const char *format, ...)
+ {
+ char buf[BUFSZ + 1];
+
+ GC_PRINTF_FILLBUF(buf, format);
+ (void)WRITE(ANDROID_LOG_WARN, buf, 0);
+ }
+
+#endif /* GC_ANDROID_LOG */
+
+void GC_err_puts(const char *s)
+{
+ (void)WRITE(GC_stderr, s, strlen(s)); /* ignore errors */
+}
+
+STATIC void GC_CALLBACK GC_default_warn_proc(char *msg, GC_word arg)
+{
+ /* TODO: Add assertion on arg comply with msg (format). */
+ GC_warn_printf(msg, arg);
+}
+
+GC_INNER GC_warn_proc GC_current_warn_proc = GC_default_warn_proc;
+
+/* This is recommended for production code (release). */
+GC_API void GC_CALLBACK GC_ignore_warn_proc(char *msg, GC_word arg)
+{
+ if (GC_print_stats) {
+ /* Don't ignore warnings if stats printing is on. */
+ GC_default_warn_proc(msg, arg);
+ }
+}
+
+GC_API void GC_CALL GC_set_warn_proc(GC_warn_proc p)
+{
+ DCL_LOCK_STATE;
+ GC_ASSERT(NONNULL_ARG_NOT_NULL(p));
+# ifdef GC_WIN32_THREADS
+# ifdef CYGWIN32
+ /* Need explicit GC_INIT call */
+ GC_ASSERT(GC_is_initialized);
+# else
+ if (!GC_is_initialized) GC_init();
+# endif
+# endif
+ LOCK();
+ GC_current_warn_proc = p;
+ UNLOCK();
+}
+
+GC_API GC_warn_proc GC_CALL GC_get_warn_proc(void)
+{
+ GC_warn_proc result;
+ DCL_LOCK_STATE;
+ LOCK();
+ result = GC_current_warn_proc;
+ UNLOCK();
+ return(result);
+}
+
+#if !defined(PCR) && !defined(SMALL_CONFIG)
+ /* Print (or display) a message before abnormal exit (including */
+ /* abort). Invoked from ABORT(msg) macro (there msg is non-NULL) */
+ /* and from EXIT() macro (msg is NULL in that case). */
+ STATIC void GC_CALLBACK GC_default_on_abort(const char *msg)
+ {
+# ifndef DONT_USE_ATEXIT
+ skip_gc_atexit = TRUE; /* disable at-exit GC_gcollect() */
+# endif
+
+ if (msg != NULL) {
+# ifdef MSGBOX_ON_ERROR
+ GC_win32_MessageBoxA(msg, "Fatal error in GC", MB_ICONERROR | MB_OK);
+ /* Also duplicate msg to GC log file. */
+# endif
+
+# ifndef GC_ANDROID_LOG
+ /* Avoid calling GC_err_printf() here, as GC_on_abort() could be */
+ /* called from it. Note 1: this is not an atomic output. */
+ /* Note 2: possible write errors are ignored. */
+# if defined(GC_WIN32_THREADS) && defined(GC_ASSERTIONS) \
+ && ((defined(MSWIN32) && !defined(CONSOLE_LOG)) || defined(MSWINCE))
+ if (!GC_write_disabled)
+# endif
+ {
+ if (WRITE(GC_stderr, msg, strlen(msg)) >= 0)
+ (void)WRITE(GC_stderr, "\n", 1);
+ }
+# else
+ __android_log_assert("*" /* cond */, GC_ANDROID_LOG_TAG, "%s\n", msg);
+# endif
+ }
+
+# if !defined(NO_DEBUGGING) && !defined(GC_ANDROID_LOG)
+ if (GETENV("GC_LOOP_ON_ABORT") != NULL) {
+ /* In many cases it's easier to debug a running process. */
+ /* It's arguably nicer to sleep, but that makes it harder */
+ /* to look at the thread if the debugger doesn't know much */
+ /* about threads. */
+ for(;;) {
+ /* Empty */
+ }
+ }
+# endif
+ }
+
+ GC_abort_func GC_on_abort = GC_default_on_abort;
+
+ GC_API void GC_CALL GC_set_abort_func(GC_abort_func fn)
+ {
+ DCL_LOCK_STATE;
+ GC_ASSERT(NONNULL_ARG_NOT_NULL(fn));
+ LOCK();
+ GC_on_abort = fn;
+ UNLOCK();
+ }
+
+ GC_API GC_abort_func GC_CALL GC_get_abort_func(void)
+ {
+ GC_abort_func fn;
+ DCL_LOCK_STATE;
+ LOCK();
+ fn = GC_on_abort;
+ UNLOCK();
+ return fn;
+ }
+#endif /* !SMALL_CONFIG */
+
+GC_API void GC_CALL GC_enable(void)
+{
+ DCL_LOCK_STATE;
+
+ LOCK();
+ GC_ASSERT(GC_dont_gc != 0); /* ensure no counter underflow */
+ GC_dont_gc--;
+ UNLOCK();
+}
+
+GC_API void GC_CALL GC_disable(void)
+{
+ DCL_LOCK_STATE;
+ LOCK();
+ GC_dont_gc++;
+ UNLOCK();
+}
+
+GC_API int GC_CALL GC_is_disabled(void)
+{
+ return GC_dont_gc != 0;
+}
+
+/* Helper procedures for new kind creation. */
+GC_API void ** GC_CALL GC_new_free_list_inner(void)
+{
+ void *result;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ result = GC_INTERNAL_MALLOC((MAXOBJGRANULES+1) * sizeof(ptr_t), PTRFREE);
+ if (NULL == result) ABORT("Failed to allocate freelist for new kind");
+ BZERO(result, (MAXOBJGRANULES+1)*sizeof(ptr_t));
+ return (void **)result;
+}
+
+GC_API void ** GC_CALL GC_new_free_list(void)
+{
+ void ** result;
+ DCL_LOCK_STATE;
+ LOCK();
+ result = GC_new_free_list_inner();
+ UNLOCK();
+ return result;
+}
+
+GC_API unsigned GC_CALL GC_new_kind_inner(void **fl, GC_word descr,
+ int adjust, int clear)
+{
+ unsigned result = GC_n_kinds;
+
+ GC_ASSERT(NONNULL_ARG_NOT_NULL(fl));
+ GC_ASSERT(adjust == FALSE || adjust == TRUE);
+ /* If an object is not needed to be cleared (when moved to the */
+ /* free list) then its descriptor should be zero to denote */
+ /* a pointer-free object (and, as a consequence, the size of the */
+ /* object should not be added to the descriptor template). */
+ GC_ASSERT(clear == TRUE
+ || (descr == 0 && adjust == FALSE && clear == FALSE));
+ if (result < MAXOBJKINDS) {
+ GC_ASSERT(result > 0);
+ GC_n_kinds++;
+ GC_obj_kinds[result].ok_freelist = fl;
+ GC_obj_kinds[result].ok_reclaim_list = 0;
+ GC_obj_kinds[result].ok_descriptor = descr;
+ GC_obj_kinds[result].ok_relocate_descr = adjust;
+ GC_obj_kinds[result].ok_init = (GC_bool)clear;
+# ifdef ENABLE_DISCLAIM
+ GC_obj_kinds[result].ok_mark_unconditionally = FALSE;
+ GC_obj_kinds[result].ok_disclaim_proc = 0;
+# endif
+ } else {
+ ABORT("Too many kinds");
+ }
+ return result;
+}
+
+GC_API unsigned GC_CALL GC_new_kind(void **fl, GC_word descr, int adjust,
+ int clear)
+{
+ unsigned result;
+ DCL_LOCK_STATE;
+ LOCK();
+ result = GC_new_kind_inner(fl, descr, adjust, clear);
+ UNLOCK();
+ return result;
+}
+
+GC_API unsigned GC_CALL GC_new_proc_inner(GC_mark_proc proc)
+{
+ unsigned result = GC_n_mark_procs;
+
+ if (result < MAX_MARK_PROCS) {
+ GC_n_mark_procs++;
+ GC_mark_procs[result] = proc;
+ } else {
+ ABORT("Too many mark procedures");
+ }
+ return result;
+}
+
+GC_API unsigned GC_CALL GC_new_proc(GC_mark_proc proc)
+{
+ unsigned result;
+ DCL_LOCK_STATE;
+ LOCK();
+ result = GC_new_proc_inner(proc);
+ UNLOCK();
+ return result;
+}
+
+GC_API void * GC_CALL GC_call_with_alloc_lock(GC_fn_type fn, void *client_data)
+{
+ void * result;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ result = (*fn)(client_data);
+ UNLOCK();
+ return(result);
+}
+
+GC_API void * GC_CALL GC_call_with_stack_base(GC_stack_base_func fn, void *arg)
+{
+ struct GC_stack_base base;
+ void *result;
+
+ base.mem_base = (void *)&base;
+# ifdef IA64
+ base.reg_base = (void *)GC_save_regs_in_stack();
+ /* Unnecessarily flushes register stack, */
+ /* but that probably doesn't hurt. */
+# elif defined(E2K)
+ base.reg_base = NULL; /* not used by GC currently */
+# endif
+ result = fn(&base, arg);
+ /* Strongly discourage the compiler from treating the above */
+ /* as a tail call. */
+ GC_noop1(COVERT_DATAFLOW(&base));
+ return result;
+}
+
+#ifndef THREADS
+
+GC_INNER ptr_t GC_blocked_sp = NULL;
+ /* NULL value means we are not inside GC_do_blocking() call. */
+# ifdef IA64
+ STATIC ptr_t GC_blocked_register_sp = NULL;
+# endif
+
+GC_INNER struct GC_traced_stack_sect_s *GC_traced_stack_sect = NULL;
+
+/* This is nearly the same as in win32_threads.c */
+GC_API void * GC_CALL GC_call_with_gc_active(GC_fn_type fn,
+ void * client_data)
+{
+ struct GC_traced_stack_sect_s stacksect;
+ GC_ASSERT(GC_is_initialized);
+
+ /* Adjust our stack bottom pointer (this could happen if */
+ /* GC_get_main_stack_base() is unimplemented or broken for */
+ /* the platform). */
+ if ((word)GC_stackbottom HOTTER_THAN (word)(&stacksect))
+ GC_stackbottom = (ptr_t)COVERT_DATAFLOW(&stacksect);
+
+ if (GC_blocked_sp == NULL) {
+ /* We are not inside GC_do_blocking() - do nothing more. */
+ client_data = fn(client_data);
+ /* Prevent treating the above as a tail call. */
+ GC_noop1(COVERT_DATAFLOW(&stacksect));
+ return client_data; /* result */
+ }
+
+ /* Setup new "stack section". */
+ stacksect.saved_stack_ptr = GC_blocked_sp;
+# ifdef IA64
+ /* This is the same as in GC_call_with_stack_base(). */
+ stacksect.backing_store_end = GC_save_regs_in_stack();
+ /* Unnecessarily flushes register stack, */
+ /* but that probably doesn't hurt. */
+ stacksect.saved_backing_store_ptr = GC_blocked_register_sp;
+# endif
+ stacksect.prev = GC_traced_stack_sect;
+ GC_blocked_sp = NULL;
+ GC_traced_stack_sect = &stacksect;
+
+ client_data = fn(client_data);
+ GC_ASSERT(GC_blocked_sp == NULL);
+ GC_ASSERT(GC_traced_stack_sect == &stacksect);
+
+# if defined(CPPCHECK)
+ GC_noop1((word)GC_traced_stack_sect - (word)GC_blocked_sp);
+# endif
+ /* Restore original "stack section". */
+ GC_traced_stack_sect = stacksect.prev;
+# ifdef IA64
+ GC_blocked_register_sp = stacksect.saved_backing_store_ptr;
+# endif
+ GC_blocked_sp = stacksect.saved_stack_ptr;
+
+ return client_data; /* result */
+}
+
+/* This is nearly the same as in win32_threads.c */
+STATIC void GC_do_blocking_inner(ptr_t data, void * context GC_ATTR_UNUSED)
+{
+ struct blocking_data * d = (struct blocking_data *) data;
+ GC_ASSERT(GC_is_initialized);
+ GC_ASSERT(GC_blocked_sp == NULL);
+# ifdef SPARC
+ GC_blocked_sp = GC_save_regs_in_stack();
+# else
+ GC_blocked_sp = (ptr_t) &d; /* save approx. sp */
+# ifdef IA64
+ GC_blocked_register_sp = GC_save_regs_in_stack();
+# elif defined(E2K)
+ (void)GC_save_regs_in_stack();
+# endif
+# endif
+
+ d -> client_data = (d -> fn)(d -> client_data);
+
+# ifdef SPARC
+ GC_ASSERT(GC_blocked_sp != NULL);
+# else
+ GC_ASSERT(GC_blocked_sp == (ptr_t)(&d));
+# endif
+# if defined(CPPCHECK)
+ GC_noop1((word)GC_blocked_sp);
+# endif
+ GC_blocked_sp = NULL;
+}
+
+ GC_API void GC_CALL GC_set_stackbottom(void *gc_thread_handle,
+ const struct GC_stack_base *sb)
+ {
+ GC_ASSERT(sb -> mem_base != NULL);
+ GC_ASSERT(NULL == gc_thread_handle || &GC_stackbottom == gc_thread_handle);
+ GC_ASSERT(NULL == GC_blocked_sp
+ && NULL == GC_traced_stack_sect); /* for now */
+ (void)gc_thread_handle;
+
+ GC_stackbottom = (char *)sb->mem_base;
+# ifdef IA64
+ GC_register_stackbottom = (ptr_t)sb->reg_base;
+# endif
+ }
+
+ GC_API void * GC_CALL GC_get_my_stackbottom(struct GC_stack_base *sb)
+ {
+ GC_ASSERT(GC_is_initialized);
+ sb -> mem_base = GC_stackbottom;
+# ifdef IA64
+ sb -> reg_base = GC_register_stackbottom;
+# elif defined(E2K)
+ sb -> reg_base = NULL;
+# endif
+ return &GC_stackbottom; /* gc_thread_handle */
+ }
+#endif /* !THREADS */
+
+GC_API void * GC_CALL GC_do_blocking(GC_fn_type fn, void * client_data)
+{
+ struct blocking_data my_data;
+
+ my_data.fn = fn;
+ my_data.client_data = client_data;
+ GC_with_callee_saves_pushed(GC_do_blocking_inner, (ptr_t)(&my_data));
+ return my_data.client_data; /* result */
+}
+
+#if !defined(NO_DEBUGGING)
+ GC_API void GC_CALL GC_dump(void)
+ {
+ DCL_LOCK_STATE;
+
+ LOCK();
+ GC_dump_named(NULL);
+ UNLOCK();
+ }
+
+ GC_API void GC_CALL GC_dump_named(const char *name)
+ {
+# ifndef NO_CLOCK
+ CLOCK_TYPE current_time;
+
+ GET_TIME(current_time);
+# endif
+ if (name != NULL) {
+ GC_printf("***GC Dump %s\n", name);
+ } else {
+ GC_printf("***GC Dump collection #%lu\n", (unsigned long)GC_gc_no);
+ }
+# ifndef NO_CLOCK
+ /* Note that the time is wrapped in ~49 days if sizeof(long)==4. */
+ GC_printf("Time since GC init: %lu ms\n",
+ MS_TIME_DIFF(current_time, GC_init_time));
+# endif
+
+ GC_printf("\n***Static roots:\n");
+ GC_print_static_roots();
+ GC_printf("\n***Heap sections:\n");
+ GC_print_heap_sects();
+ GC_printf("\n***Free blocks:\n");
+ GC_print_hblkfreelist();
+ GC_printf("\n***Blocks in use:\n");
+ GC_print_block_list();
+ }
+#endif /* !NO_DEBUGGING */
+
+static void block_add_size(struct hblk *h, word pbytes)
+{
+ hdr *hhdr = HDR(h);
+ *(word *)pbytes += (hhdr -> hb_sz + (HBLKSIZE - 1)) & ~(word)(HBLKSIZE - 1);
+}
+
+GC_API size_t GC_CALL GC_get_memory_use(void)
+{
+ word bytes = 0;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ GC_apply_to_all_blocks(block_add_size, (word)(&bytes));
+ UNLOCK();
+ return (size_t)bytes;
+}
+
+/* Getter functions for the public Read-only variables. */
+
+/* GC_get_gc_no() is unsynchronized and should be typically called */
+/* inside the context of GC_call_with_alloc_lock() to prevent data */
+/* races (on multiprocessors). */
+GC_API GC_word GC_CALL GC_get_gc_no(void)
+{
+ return GC_gc_no;
+}
+
+#ifdef THREADS
+ GC_API int GC_CALL GC_get_parallel(void)
+ {
+ return GC_parallel;
+ }
+
+ GC_API void GC_CALL GC_alloc_lock(void)
+ {
+ DCL_LOCK_STATE;
+ LOCK();
+ }
+
+ GC_API void GC_CALL GC_alloc_unlock(void)
+ {
+ /* no DCL_LOCK_STATE */
+ UNLOCK();
+ }
+
+ GC_INNER GC_on_thread_event_proc GC_on_thread_event = 0;
+
+ GC_API void GC_CALL GC_set_on_thread_event(GC_on_thread_event_proc fn)
+ {
+ /* fn may be 0 (means no event notifier). */
+ DCL_LOCK_STATE;
+ LOCK();
+ GC_on_thread_event = fn;
+ UNLOCK();
+ }
+
+ GC_API GC_on_thread_event_proc GC_CALL GC_get_on_thread_event(void)
+ {
+ GC_on_thread_event_proc fn;
+ DCL_LOCK_STATE;
+ LOCK();
+ fn = GC_on_thread_event;
+ UNLOCK();
+ return fn;
+ }
+
+# ifdef STACKPTR_CORRECTOR_AVAILABLE
+ GC_INNER GC_sp_corrector_proc GC_sp_corrector = 0;
+# endif
+
+ GC_API void GC_CALL GC_set_sp_corrector(
+ GC_sp_corrector_proc fn GC_ATTR_UNUSED)
+ {
+# ifdef STACKPTR_CORRECTOR_AVAILABLE
+ DCL_LOCK_STATE;
+
+ LOCK();
+ GC_sp_corrector = fn;
+ UNLOCK();
+# endif
+ }
+
+ GC_API GC_sp_corrector_proc GC_CALL GC_get_sp_corrector(void)
+ {
+# ifdef STACKPTR_CORRECTOR_AVAILABLE
+ GC_sp_corrector_proc fn;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ fn = GC_sp_corrector;
+ UNLOCK();
+ return fn;
+# else
+ return 0; /* unsupported */
+# endif
+ }
+#endif /* THREADS */
+
+/* Setter and getter functions for the public R/W function variables. */
+/* These functions are synchronized (like GC_set_warn_proc() and */
+/* GC_get_warn_proc()). */
+
+GC_API void GC_CALL GC_set_oom_fn(GC_oom_func fn)
+{
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(NONNULL_ARG_NOT_NULL(fn));
+ LOCK();
+ GC_oom_fn = fn;
+ UNLOCK();
+}
+
+GC_API GC_oom_func GC_CALL GC_get_oom_fn(void)
+{
+ GC_oom_func fn;
+ DCL_LOCK_STATE;
+ LOCK();
+ fn = GC_oom_fn;
+ UNLOCK();
+ return fn;
+}
+
+GC_API void GC_CALL GC_set_on_heap_resize(GC_on_heap_resize_proc fn)
+{
+ /* fn may be 0 (means no event notifier). */
+ DCL_LOCK_STATE;
+ LOCK();
+ GC_on_heap_resize = fn;
+ UNLOCK();
+}
+
+GC_API GC_on_heap_resize_proc GC_CALL GC_get_on_heap_resize(void)
+{
+ GC_on_heap_resize_proc fn;
+ DCL_LOCK_STATE;
+ LOCK();
+ fn = GC_on_heap_resize;
+ UNLOCK();
+ return fn;
+}
+
+GC_API void GC_CALL GC_set_finalizer_notifier(GC_finalizer_notifier_proc fn)
+{
+ /* fn may be 0 (means no finalizer notifier). */
+ DCL_LOCK_STATE;
+ LOCK();
+ GC_finalizer_notifier = fn;
+ UNLOCK();
+}
+
+GC_API GC_finalizer_notifier_proc GC_CALL GC_get_finalizer_notifier(void)
+{
+ GC_finalizer_notifier_proc fn;
+ DCL_LOCK_STATE;
+ LOCK();
+ fn = GC_finalizer_notifier;
+ UNLOCK();
+ return fn;
+}
+
+/* Setter and getter functions for the public numeric R/W variables. */
+/* It is safe to call these functions even before GC_INIT(). */
+/* These functions are unsynchronized and should be typically called */
+/* inside the context of GC_call_with_alloc_lock() (if called after */
+/* GC_INIT()) to prevent data races (unless it is guaranteed the */
+/* collector is not multi-threaded at that execution point). */
+
+GC_API void GC_CALL GC_set_find_leak(int value)
+{
+ /* value is of boolean type. */
+ GC_find_leak = value;
+}
+
+GC_API int GC_CALL GC_get_find_leak(void)
+{
+ return GC_find_leak;
+}
+
+GC_API void GC_CALL GC_set_all_interior_pointers(int value)
+{
+ DCL_LOCK_STATE;
+
+ GC_all_interior_pointers = value ? 1 : 0;
+ if (GC_is_initialized) {
+ /* It is not recommended to change GC_all_interior_pointers value */
+ /* after GC is initialized but it seems GC could work correctly */
+ /* even after switching the mode. */
+ LOCK();
+ GC_initialize_offsets(); /* NOTE: this resets manual offsets as well */
+ if (!GC_all_interior_pointers)
+ GC_bl_init_no_interiors();
+ UNLOCK();
+ }
+}
+
+GC_API int GC_CALL GC_get_all_interior_pointers(void)
+{
+ return GC_all_interior_pointers;
+}
+
+GC_API void GC_CALL GC_set_finalize_on_demand(int value)
+{
+ GC_ASSERT(value != -1); /* -1 was used to retrieve old value in gc-7.2 */
+ /* value is of boolean type. */
+ GC_finalize_on_demand = value;
+}
+
+GC_API int GC_CALL GC_get_finalize_on_demand(void)
+{
+ return GC_finalize_on_demand;
+}
+
+GC_API void GC_CALL GC_set_java_finalization(int value)
+{
+ GC_ASSERT(value != -1); /* -1 was used to retrieve old value in gc-7.2 */
+ /* value is of boolean type. */
+ GC_java_finalization = value;
+}
+
+GC_API int GC_CALL GC_get_java_finalization(void)
+{
+ return GC_java_finalization;
+}
+
+GC_API void GC_CALL GC_set_dont_expand(int value)
+{
+ GC_ASSERT(value != -1); /* -1 was used to retrieve old value in gc-7.2 */
+ /* value is of boolean type. */
+ GC_dont_expand = value;
+}
+
+GC_API int GC_CALL GC_get_dont_expand(void)
+{
+ return GC_dont_expand;
+}
+
+GC_API void GC_CALL GC_set_no_dls(int value)
+{
+ GC_ASSERT(value != -1); /* -1 was used to retrieve old value in gc-7.2 */
+ /* value is of boolean type. */
+ GC_no_dls = value;
+}
+
+GC_API int GC_CALL GC_get_no_dls(void)
+{
+ return GC_no_dls;
+}
+
+GC_API void GC_CALL GC_set_non_gc_bytes(GC_word value)
+{
+ GC_non_gc_bytes = value;
+}
+
+GC_API GC_word GC_CALL GC_get_non_gc_bytes(void)
+{
+ return GC_non_gc_bytes;
+}
+
+GC_API void GC_CALL GC_set_free_space_divisor(GC_word value)
+{
+ GC_ASSERT(value > 0);
+ GC_free_space_divisor = value;
+}
+
+GC_API GC_word GC_CALL GC_get_free_space_divisor(void)
+{
+ return GC_free_space_divisor;
+}
+
+GC_API void GC_CALL GC_set_max_retries(GC_word value)
+{
+ GC_ASSERT((GC_signed_word)value != -1);
+ /* -1 was used to retrieve old value in gc-7.2 */
+ GC_max_retries = value;
+}
+
+GC_API GC_word GC_CALL GC_get_max_retries(void)
+{
+ return GC_max_retries;
+}
+
+GC_API void GC_CALL GC_set_dont_precollect(int value)
+{
+ GC_ASSERT(value != -1); /* -1 was used to retrieve old value in gc-7.2 */
+ /* value is of boolean type. */
+ GC_dont_precollect = value;
+}
+
+GC_API int GC_CALL GC_get_dont_precollect(void)
+{
+ return GC_dont_precollect;
+}
+
+GC_API void GC_CALL GC_set_full_freq(int value)
+{
+ GC_ASSERT(value >= 0);
+ GC_full_freq = value;
+}
+
+GC_API int GC_CALL GC_get_full_freq(void)
+{
+ return GC_full_freq;
+}
+
+GC_API void GC_CALL GC_set_time_limit(unsigned long value)
+{
+ GC_ASSERT((long)value != -1L);
+ /* -1 was used to retrieve old value in gc-7.2 */
+ GC_time_limit = value;
+}
+
+GC_API unsigned long GC_CALL GC_get_time_limit(void)
+{
+ return GC_time_limit;
+}
+
+GC_API void GC_CALL GC_set_force_unmap_on_gcollect(int value)
+{
+ GC_force_unmap_on_gcollect = (GC_bool)value;
+}
+
+GC_API int GC_CALL GC_get_force_unmap_on_gcollect(void)
+{
+ return (int)GC_force_unmap_on_gcollect;
+}
+
+GC_API void GC_CALL GC_abort_on_oom(void)
+{
+ GC_err_printf("Insufficient memory for the allocation\n");
+ EXIT();
+}
+
+#ifdef THREADS
+ GC_API void GC_CALL GC_stop_world_external(void)
+ {
+ GC_ASSERT(GC_is_initialized);
+ LOCK();
+# ifdef THREAD_LOCAL_ALLOC
+ GC_ASSERT(!GC_world_stopped);
+# endif
+ STOP_WORLD();
+# ifdef THREAD_LOCAL_ALLOC
+ GC_world_stopped = TRUE;
+# endif
+ }
+
+ GC_API void GC_CALL GC_start_world_external(void)
+ {
+# ifdef THREAD_LOCAL_ALLOC
+ GC_ASSERT(GC_world_stopped);
+ GC_world_stopped = FALSE;
+# else
+ GC_ASSERT(GC_is_initialized);
+# endif
+ START_WORLD();
+ UNLOCK();
+ }
+#endif /* THREADS */
diff --git a/graphics/asymptote/gc/new_hblk.c b/graphics/asymptote/gc/new_hblk.c
new file mode 100644
index 0000000000..ff8f61801a
--- /dev/null
+++ b/graphics/asymptote/gc/new_hblk.c
@@ -0,0 +1,192 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+/*
+ * This file contains the functions:
+ * ptr_t GC_build_flXXX(h, old_fl)
+ * void GC_new_hblk(size, kind)
+ */
+
+#include <stdio.h>
+
+#ifndef SMALL_CONFIG
+ /* Build a free list for size 2 (words) cleared objects inside */
+ /* hblk h. Set the last link to be ofl. Return a pointer to the */
+ /* first free list entry. */
+ STATIC ptr_t GC_build_fl_clear2(struct hblk *h, ptr_t ofl)
+ {
+ word * p = (word *)(h -> hb_body);
+ word * lim = (word *)(h + 1);
+
+ p[0] = (word)ofl;
+ p[1] = 0;
+ p[2] = (word)p;
+ p[3] = 0;
+ p += 4;
+ for (; (word)p < (word)lim; p += 4) {
+ p[0] = (word)(p-2);
+ p[1] = 0;
+ p[2] = (word)p;
+ p[3] = 0;
+ }
+ return((ptr_t)(p-2));
+ }
+
+ /* The same for size 4 cleared objects. */
+ STATIC ptr_t GC_build_fl_clear4(struct hblk *h, ptr_t ofl)
+ {
+ word * p = (word *)(h -> hb_body);
+ word * lim = (word *)(h + 1);
+
+ p[0] = (word)ofl;
+ p[1] = 0;
+ p[2] = 0;
+ p[3] = 0;
+ p += 4;
+ for (; (word)p < (word)lim; p += 4) {
+ GC_PREFETCH_FOR_WRITE((ptr_t)(p + 64));
+ p[0] = (word)(p-4);
+ p[1] = 0;
+ CLEAR_DOUBLE(p+2);
+ }
+ return((ptr_t)(p-4));
+ }
+
+ /* The same for size 2 uncleared objects. */
+ STATIC ptr_t GC_build_fl2(struct hblk *h, ptr_t ofl)
+ {
+ word * p = (word *)(h -> hb_body);
+ word * lim = (word *)(h + 1);
+
+ p[0] = (word)ofl;
+ p[2] = (word)p;
+ p += 4;
+ for (; (word)p < (word)lim; p += 4) {
+ p[0] = (word)(p-2);
+ p[2] = (word)p;
+ }
+ return((ptr_t)(p-2));
+ }
+
+ /* The same for size 4 uncleared objects. */
+ STATIC ptr_t GC_build_fl4(struct hblk *h, ptr_t ofl)
+ {
+ word * p = (word *)(h -> hb_body);
+ word * lim = (word *)(h + 1);
+
+ p[0] = (word)ofl;
+ p[4] = (word)p;
+ p += 8;
+ for (; (word)p < (word)lim; p += 8) {
+ GC_PREFETCH_FOR_WRITE((ptr_t)(p + 64));
+ p[0] = (word)(p-4);
+ p[4] = (word)p;
+ }
+ return((ptr_t)(p-4));
+ }
+#endif /* !SMALL_CONFIG */
+
+/* Build a free list for objects of size sz inside heap block h. */
+/* Clear objects inside h if clear is set. Add list to the end of */
+/* the free list we build. Return the new free list. */
+/* This could be called without the main GC lock, if we ensure that */
+/* there is no concurrent collection which might reclaim objects that */
+/* we have not yet allocated. */
+GC_INNER ptr_t GC_build_fl(struct hblk *h, size_t sz, GC_bool clear,
+ ptr_t list)
+{
+ word *p, *prev;
+ word *last_object; /* points to last object in new hblk */
+
+ /* Do a few prefetches here, just because it's cheap. */
+ /* If we were more serious about it, these should go inside */
+ /* the loops. But write prefetches usually don't seem to */
+ /* matter much. */
+ GC_PREFETCH_FOR_WRITE((ptr_t)h);
+ GC_PREFETCH_FOR_WRITE((ptr_t)h + 128);
+ GC_PREFETCH_FOR_WRITE((ptr_t)h + 256);
+ GC_PREFETCH_FOR_WRITE((ptr_t)h + 378);
+# ifndef SMALL_CONFIG
+ /* Handle small objects sizes more efficiently. For larger objects */
+ /* the difference is less significant. */
+ switch (sz) {
+ case 2: if (clear) {
+ return GC_build_fl_clear2(h, list);
+ } else {
+ return GC_build_fl2(h, list);
+ }
+ case 4: if (clear) {
+ return GC_build_fl_clear4(h, list);
+ } else {
+ return GC_build_fl4(h, list);
+ }
+ default:
+ break;
+ }
+# endif /* !SMALL_CONFIG */
+
+ /* Clear the page if necessary. */
+ if (clear) BZERO(h, HBLKSIZE);
+
+ /* Add objects to free list */
+ p = (word *)(h -> hb_body) + sz; /* second object in *h */
+ prev = (word *)(h -> hb_body); /* One object behind p */
+ last_object = (word *)((char *)h + HBLKSIZE);
+ last_object -= sz;
+ /* Last place for last object to start */
+
+ /* make a list of all objects in *h with head as last object */
+ while ((word)p <= (word)last_object) {
+ /* current object's link points to last object */
+ obj_link(p) = (ptr_t)prev;
+ prev = p;
+ p += sz;
+ }
+ p -= sz; /* p now points to last object */
+
+ /* Put p (which is now head of list of objects in *h) as first */
+ /* pointer in the appropriate free list for this size. */
+ *(ptr_t *)h = list;
+ return ((ptr_t)p);
+}
+
+/* Allocate a new heapblock for small objects of size gran granules. */
+/* Add all of the heapblock's objects to the free list for objects */
+/* of that size. Set all mark bits if objects are uncollectible. */
+/* Will fail to do anything if we are out of memory. */
+GC_INNER void GC_new_hblk(size_t gran, int kind)
+{
+ struct hblk *h; /* the new heap block */
+ GC_bool clear = GC_obj_kinds[kind].ok_init;
+
+ GC_STATIC_ASSERT((sizeof (struct hblk)) == HBLKSIZE);
+ GC_ASSERT(I_HOLD_LOCK());
+
+ if (GC_debugging_started) clear = TRUE;
+
+ /* Allocate a new heap block */
+ h = GC_allochblk(GRANULES_TO_BYTES(gran), kind, 0);
+ if (h == 0) return;
+
+ /* Mark all objects if appropriate. */
+ if (IS_UNCOLLECTABLE(kind)) GC_set_hdr_marks(HDR(h));
+
+ /* Build the free list */
+ GC_obj_kinds[kind].ok_freelist[gran] =
+ GC_build_fl(h, GRANULES_TO_WORDS(gran), clear,
+ (ptr_t)GC_obj_kinds[kind].ok_freelist[gran]);
+}
diff --git a/graphics/asymptote/gc/obj_map.c b/graphics/asymptote/gc/obj_map.c
new file mode 100644
index 0000000000..2468e5bfab
--- /dev/null
+++ b/graphics/asymptote/gc/obj_map.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991, 1992 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1999-2001 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+/* Routines for maintaining maps describing heap block
+ * layouts for various object sizes. Allows fast pointer validity checks
+ * and fast location of object start locations on machines (such as SPARC)
+ * with slow division.
+ */
+
+/* Consider pointers that are offset bytes displaced from the beginning */
+/* of an object to be valid. */
+
+GC_API void GC_CALL GC_register_displacement(size_t offset)
+{
+ DCL_LOCK_STATE;
+
+ LOCK();
+ GC_register_displacement_inner(offset);
+ UNLOCK();
+}
+
+GC_INNER void GC_register_displacement_inner(size_t offset)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+ if (offset >= VALID_OFFSET_SZ) {
+ ABORT("Bad argument to GC_register_displacement");
+ }
+ if (!GC_valid_offsets[offset]) {
+ GC_valid_offsets[offset] = TRUE;
+ GC_modws_valid_offsets[offset % sizeof(word)] = TRUE;
+ }
+}
+
+#ifdef MARK_BIT_PER_GRANULE
+ /* Add a heap block map for objects of size granules to obj_map. */
+ /* A size of 0 is used for large objects. Return FALSE on failure. */
+ GC_INNER GC_bool GC_add_map_entry(size_t granules)
+ {
+ unsigned displ;
+ unsigned short * new_map;
+
+ if (granules > BYTES_TO_GRANULES(MAXOBJBYTES)) granules = 0;
+ if (GC_obj_map[granules] != 0) {
+ return(TRUE);
+ }
+ new_map = (unsigned short *)GC_scratch_alloc(MAP_LEN * sizeof(short));
+ if (new_map == 0) return(FALSE);
+ GC_COND_LOG_PRINTF(
+ "Adding block map for size of %u granules (%u bytes)\n",
+ (unsigned)granules, (unsigned)GRANULES_TO_BYTES(granules));
+ if (granules == 0) {
+ for (displ = 0; displ < BYTES_TO_GRANULES(HBLKSIZE); displ++) {
+ new_map[displ] = 1; /* Nonzero to get us out of marker fast path. */
+ }
+ } else {
+ for (displ = 0; displ < BYTES_TO_GRANULES(HBLKSIZE); displ++) {
+ new_map[displ] = (unsigned short)(displ % granules);
+ }
+ }
+ GC_obj_map[granules] = new_map;
+ return(TRUE);
+ }
+#endif /* MARK_BIT_PER_GRANULE */
+
+GC_INNER void GC_initialize_offsets(void)
+{
+ unsigned i;
+ if (GC_all_interior_pointers) {
+ for (i = 0; i < VALID_OFFSET_SZ; ++i)
+ GC_valid_offsets[i] = TRUE;
+ } else {
+ BZERO(GC_valid_offsets, sizeof(GC_valid_offsets));
+ for (i = 0; i < sizeof(word); ++i)
+ GC_modws_valid_offsets[i] = FALSE;
+ }
+}
diff --git a/graphics/asymptote/gc/os_dep.c b/graphics/asymptote/gc/os_dep.c
new file mode 100644
index 0000000000..e90c772501
--- /dev/null
+++ b/graphics/asymptote/gc/os_dep.c
@@ -0,0 +1,5485 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved.
+ * Copyright (c) 2008-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+#if !defined(OS2) && !defined(PCR) && !defined(AMIGA) && !defined(MACOS) \
+ && !defined(MSWINCE) && !defined(SN_TARGET_ORBIS) \
+ && !defined(SN_TARGET_PSP2) && !defined(__CC_ARM)
+# include <sys/types.h>
+# if !defined(MSWIN32) && !defined(MSWIN_XBOX1)
+# include <unistd.h>
+# endif
+#endif
+
+#include <stdio.h>
+#if defined(MSWINCE) || defined(SN_TARGET_PS3)
+# define SIGSEGV 0 /* value is irrelevant */
+#else
+# include <signal.h>
+#endif
+
+#if defined(UNIX_LIKE) || defined(CYGWIN32) || defined(NACL) \
+ || defined(SYMBIAN)
+# include <fcntl.h>
+#endif
+
+#if defined(LINUX) || defined(LINUX_STACKBOTTOM)
+# include <ctype.h>
+#endif
+
+/* Blatantly OS dependent routines, except for those that are related */
+/* to dynamic loading. */
+
+#ifdef AMIGA
+# define GC_AMIGA_DEF
+# include "extra/AmigaOS.c"
+# undef GC_AMIGA_DEF
+#endif
+
+#ifdef MACOS
+# include <Processes.h>
+#endif
+
+#ifdef IRIX5
+# include <sys/uio.h>
+# include <malloc.h> /* for locking */
+#endif
+
+#if defined(MMAP_SUPPORTED) || defined(ADD_HEAP_GUARD_PAGES)
+# if defined(USE_MUNMAP) && !defined(USE_MMAP) && !defined(CPPCHECK)
+# error Invalid config: USE_MUNMAP requires USE_MMAP
+# endif
+# include <sys/types.h>
+# include <sys/mman.h>
+# include <sys/stat.h>
+#endif
+
+#if defined(ADD_HEAP_GUARD_PAGES) || defined(LINUX_STACKBOTTOM) \
+ || defined(MMAP_SUPPORTED) || defined(NEED_PROC_MAPS)
+# include <errno.h>
+#endif
+
+#ifdef DARWIN
+ /* for get_etext and friends */
+# include <mach-o/getsect.h>
+#endif
+
+#ifdef DJGPP
+ /* Apparently necessary for djgpp 2.01. May cause problems with */
+ /* other versions. */
+ typedef long unsigned int caddr_t;
+#endif
+
+#ifdef PCR
+# include "il/PCR_IL.h"
+# include "th/PCR_ThCtl.h"
+# include "mm/PCR_MM.h"
+#endif
+
+#if defined(GC_DARWIN_THREADS) && defined(MPROTECT_VDB)
+ /* Declare GC_mprotect_stop and GC_mprotect_resume as extern "C". */
+# include "private/darwin_stop_world.h"
+#endif
+
+#if !defined(NO_EXECUTE_PERMISSION)
+ STATIC GC_bool GC_pages_executable = TRUE;
+#else
+ STATIC GC_bool GC_pages_executable = FALSE;
+#endif
+#define IGNORE_PAGES_EXECUTABLE 1
+ /* Undefined on GC_pages_executable real use. */
+
+#if ((defined(LINUX_STACKBOTTOM) || defined(NEED_PROC_MAPS) \
+ || defined(PROC_VDB) || defined(SOFT_VDB)) && !defined(PROC_READ)) \
+ || defined(CPPCHECK)
+# define PROC_READ read
+ /* Should probably call the real read, if read is wrapped. */
+#endif
+
+#if defined(LINUX_STACKBOTTOM) || defined(NEED_PROC_MAPS)
+ /* Repeatedly perform a read call until the buffer is filled */
+ /* up, or we encounter EOF or an error. */
+ STATIC ssize_t GC_repeat_read(int fd, char *buf, size_t count)
+ {
+ size_t num_read = 0;
+
+ ASSERT_CANCEL_DISABLED();
+ while (num_read < count) {
+ ssize_t result = PROC_READ(fd, buf + num_read, count - num_read);
+
+ if (result < 0) return result;
+ if (result == 0) break;
+ num_read += result;
+ }
+ return num_read;
+ }
+#endif /* LINUX_STACKBOTTOM || NEED_PROC_MAPS */
+
+#ifdef NEED_PROC_MAPS
+/* We need to parse /proc/self/maps, either to find dynamic libraries, */
+/* and/or to find the register backing store base (IA64). Do it once */
+/* here. */
+
+#ifdef THREADS
+ /* Determine the length of a file by incrementally reading it into a */
+ /* buffer. This would be silly to use it on a file supporting lseek, */
+ /* but Linux /proc files usually do not. */
+ /* As of Linux 4.15.0, lseek(SEEK_END) fails for /proc/self/maps. */
+ STATIC size_t GC_get_file_len(int f)
+ {
+ size_t total = 0;
+ ssize_t result;
+# define GET_FILE_LEN_BUF_SZ 500
+ char buf[GET_FILE_LEN_BUF_SZ];
+
+ do {
+ result = PROC_READ(f, buf, sizeof(buf));
+ if (result == -1) return 0;
+ total += result;
+ } while (result > 0);
+ return total;
+ }
+
+ STATIC size_t GC_get_maps_len(void)
+ {
+ int f = open("/proc/self/maps", O_RDONLY);
+ size_t result;
+ if (f < 0) return 0; /* treat missing file as empty */
+ result = GC_get_file_len(f);
+ close(f);
+ return result;
+ }
+#endif /* THREADS */
+
+/* Copy the contents of /proc/self/maps to a buffer in our address */
+/* space. Return the address of the buffer. */
+GC_INNER const char * GC_get_maps(void)
+{
+ ssize_t result;
+ static char *maps_buf = NULL;
+ static size_t maps_buf_sz = 1;
+ size_t maps_size;
+# ifdef THREADS
+ size_t old_maps_size = 0;
+# endif
+
+ /* The buffer is essentially static, so there must be a single client. */
+ GC_ASSERT(I_HOLD_LOCK());
+
+ /* Note that in the presence of threads, the maps file can */
+ /* essentially shrink asynchronously and unexpectedly as */
+ /* threads that we already think of as dead release their */
+ /* stacks. And there is no easy way to read the entire */
+ /* file atomically. This is arguably a misfeature of the */
+ /* /proc/self/maps interface. */
+ /* Since we expect the file can grow asynchronously in rare */
+ /* cases, it should suffice to first determine */
+ /* the size (using read), and then to reread the file. */
+ /* If the size is inconsistent we have to retry. */
+ /* This only matters with threads enabled, and if we use */
+ /* this to locate roots (not the default). */
+
+# ifdef THREADS
+ /* Determine the initial size of /proc/self/maps. */
+ maps_size = GC_get_maps_len();
+ if (0 == maps_size)
+ ABORT("Cannot determine length of /proc/self/maps");
+# else
+ maps_size = 4000; /* Guess */
+# endif
+
+ /* Read /proc/self/maps, growing maps_buf as necessary. */
+ /* Note that we may not allocate conventionally, and */
+ /* thus can't use stdio. */
+ do {
+ int f;
+
+ while (maps_size >= maps_buf_sz) {
+# ifdef LINT2
+ /* Workaround passing tainted maps_buf to a tainted sink. */
+ GC_noop1((word)maps_buf);
+# else
+ GC_scratch_recycle_no_gww(maps_buf, maps_buf_sz);
+# endif
+ /* Grow only by powers of 2, since we leak "too small" buffers.*/
+ while (maps_size >= maps_buf_sz) maps_buf_sz *= 2;
+ maps_buf = GC_scratch_alloc(maps_buf_sz);
+ if (NULL == maps_buf)
+ ABORT_ARG1("Insufficient space for /proc/self/maps buffer",
+ ", %lu bytes requested", (unsigned long)maps_buf_sz);
+# ifdef THREADS
+ /* Recompute initial length, since we allocated. */
+ /* This can only happen a few times per program */
+ /* execution. */
+ maps_size = GC_get_maps_len();
+ if (0 == maps_size)
+ ABORT("Cannot determine length of /proc/self/maps");
+# endif
+ }
+ GC_ASSERT(maps_buf_sz >= maps_size + 1);
+ f = open("/proc/self/maps", O_RDONLY);
+ if (-1 == f)
+ ABORT_ARG1("Cannot open /proc/self/maps",
+ ": errno= %d", errno);
+# ifdef THREADS
+ old_maps_size = maps_size;
+# endif
+ maps_size = 0;
+ do {
+ result = GC_repeat_read(f, maps_buf, maps_buf_sz-1);
+ if (result < 0) {
+ ABORT_ARG1("Failed to read /proc/self/maps",
+ ": errno= %d", errno);
+ }
+ maps_size += result;
+ } while ((size_t)result == maps_buf_sz-1);
+ close(f);
+ if (0 == maps_size)
+ ABORT("Empty /proc/self/maps");
+# ifdef THREADS
+ if (maps_size > old_maps_size) {
+ /* This might be caused by e.g. thread creation. */
+ WARN("Unexpected asynchronous /proc/self/maps growth"
+ " (to %" WARN_PRIuPTR " bytes)\n", maps_size);
+ }
+# endif
+ } while (maps_size >= maps_buf_sz
+# ifdef THREADS
+ || maps_size < old_maps_size
+# endif
+ );
+ maps_buf[maps_size] = '\0';
+ return maps_buf;
+}
+
+/*
+ * GC_parse_map_entry parses an entry from /proc/self/maps so we can
+ * locate all writable data segments that belong to shared libraries.
+ * The format of one of these entries and the fields we care about
+ * is as follows:
+ * XXXXXXXX-XXXXXXXX r-xp 00000000 30:05 260537 name of mapping...\n
+ * ^^^^^^^^ ^^^^^^^^ ^^^^ ^^
+ * start end prot maj_dev
+ *
+ * Note that since about august 2003 kernels, the columns no longer have
+ * fixed offsets on 64-bit kernels. Hence we no longer rely on fixed offsets
+ * anywhere, which is safer anyway.
+ */
+
+/* Assign various fields of the first line in maps_ptr to (*start), */
+/* (*end), (*prot), (*maj_dev) and (*mapping_name). mapping_name may */
+/* be NULL. (*prot) and (*mapping_name) are assigned pointers into the */
+/* original buffer. */
+#if (defined(DYNAMIC_LOADING) && defined(USE_PROC_FOR_LIBRARIES)) \
+ || defined(IA64) || defined(INCLUDE_LINUX_THREAD_DESCR) \
+ || (defined(REDIRECT_MALLOC) && defined(GC_LINUX_THREADS))
+ GC_INNER const char *GC_parse_map_entry(const char *maps_ptr,
+ ptr_t *start, ptr_t *end,
+ const char **prot, unsigned *maj_dev,
+ const char **mapping_name)
+ {
+ const unsigned char *start_start, *end_start, *maj_dev_start;
+ const unsigned char *p; /* unsigned for isspace, isxdigit */
+
+ if (maps_ptr == NULL || *maps_ptr == '\0') {
+ return NULL;
+ }
+
+ p = (const unsigned char *)maps_ptr;
+ while (isspace(*p)) ++p;
+ start_start = p;
+ GC_ASSERT(isxdigit(*start_start));
+ *start = (ptr_t)strtoul((const char *)start_start, (char **)&p, 16);
+ GC_ASSERT(*p=='-');
+
+ ++p;
+ end_start = p;
+ GC_ASSERT(isxdigit(*end_start));
+ *end = (ptr_t)strtoul((const char *)end_start, (char **)&p, 16);
+ GC_ASSERT(isspace(*p));
+
+ while (isspace(*p)) ++p;
+ GC_ASSERT(*p == 'r' || *p == '-');
+ *prot = (const char *)p;
+ /* Skip past protection field to offset field */
+ while (!isspace(*p)) ++p;
+ while (isspace(*p)) p++;
+ GC_ASSERT(isxdigit(*p));
+ /* Skip past offset field, which we ignore */
+ while (!isspace(*p)) ++p;
+ while (isspace(*p)) p++;
+ maj_dev_start = p;
+ GC_ASSERT(isxdigit(*maj_dev_start));
+ *maj_dev = strtoul((const char *)maj_dev_start, NULL, 16);
+
+ if (mapping_name != NULL) {
+ while (*p && *p != '\n' && *p != '/' && *p != '[') p++;
+ *mapping_name = (const char *)p;
+ }
+ while (*p && *p++ != '\n');
+ return (const char *)p;
+ }
+#endif /* REDIRECT_MALLOC || DYNAMIC_LOADING || IA64 || ... */
+
+#if defined(IA64) || defined(INCLUDE_LINUX_THREAD_DESCR)
+ /* Try to read the backing store base from /proc/self/maps. */
+ /* Return the bounds of the writable mapping with a 0 major device, */
+ /* which includes the address passed as data. */
+ /* Return FALSE if there is no such mapping. */
+ GC_INNER GC_bool GC_enclosing_mapping(ptr_t addr, ptr_t *startp,
+ ptr_t *endp)
+ {
+ const char *prot;
+ ptr_t my_start, my_end;
+ unsigned int maj_dev;
+ const char *maps_ptr = GC_get_maps();
+
+ for (;;) {
+ maps_ptr = GC_parse_map_entry(maps_ptr, &my_start, &my_end,
+ &prot, &maj_dev, 0);
+ if (NULL == maps_ptr) break;
+
+ if (prot[1] == 'w' && maj_dev == 0
+ && (word)my_end > (word)addr && (word)my_start <= (word)addr) {
+ *startp = my_start;
+ *endp = my_end;
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+#endif /* IA64 || INCLUDE_LINUX_THREAD_DESCR */
+
+#if defined(REDIRECT_MALLOC) && defined(GC_LINUX_THREADS)
+ /* Find the text(code) mapping for the library whose name, after */
+ /* stripping the directory part, starts with nm. */
+ GC_INNER GC_bool GC_text_mapping(char *nm, ptr_t *startp, ptr_t *endp)
+ {
+ size_t nm_len = strlen(nm);
+ const char *prot, *map_path;
+ ptr_t my_start, my_end;
+ unsigned int maj_dev;
+ const char *maps_ptr = GC_get_maps();
+
+ for (;;) {
+ maps_ptr = GC_parse_map_entry(maps_ptr, &my_start, &my_end,
+ &prot, &maj_dev, &map_path);
+ if (NULL == maps_ptr) break;
+
+ if (prot[0] == 'r' && prot[1] == '-' && prot[2] == 'x') {
+ const char *p = map_path;
+
+ /* Set p to point just past last slash, if any. */
+ while (*p != '\0' && *p != '\n' && *p != ' ' && *p != '\t') ++p;
+ while ((word)p >= (word)map_path && *p != '/') --p;
+ ++p;
+ if (strncmp(nm, p, nm_len) == 0) {
+ *startp = my_start;
+ *endp = my_end;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+ }
+#endif /* REDIRECT_MALLOC */
+
+#ifdef IA64
+ static ptr_t backing_store_base_from_proc(void)
+ {
+ ptr_t my_start, my_end;
+ if (!GC_enclosing_mapping(GC_save_regs_in_stack(), &my_start, &my_end)) {
+ GC_COND_LOG_PRINTF("Failed to find backing store base from /proc\n");
+ return 0;
+ }
+ return my_start;
+ }
+#endif
+
+#endif /* NEED_PROC_MAPS */
+
+#if defined(SEARCH_FOR_DATA_START)
+ /* The x86 case can be handled without a search. The Alpha case */
+ /* used to be handled differently as well, but the rules changed */
+ /* for recent Linux versions. This seems to be the easiest way to */
+ /* cover all versions. */
+
+# if defined(LINUX) || defined(HURD)
+ /* Some Linux distributions arrange to define __data_start. Some */
+ /* define data_start as a weak symbol. The latter is technically */
+ /* broken, since the user program may define data_start, in which */
+ /* case we lose. Nonetheless, we try both, preferring __data_start.*/
+ /* We assume gcc-compatible pragmas. */
+ EXTERN_C_BEGIN
+# pragma weak __data_start
+# pragma weak data_start
+ extern int __data_start[], data_start[];
+ EXTERN_C_END
+# endif /* LINUX */
+
+ ptr_t GC_data_start = NULL;
+
+ GC_INNER void GC_init_linux_data_start(void)
+ {
+ ptr_t data_end = DATAEND;
+
+# if (defined(LINUX) || defined(HURD)) && defined(USE_PROG_DATA_START)
+ /* Try the easy approaches first: */
+ /* However, this may lead to wrong data start value if libgc */
+ /* code is put into a shared library (directly or indirectly) */
+ /* which is linked with -Bsymbolic-functions option. Thus, */
+ /* the following is not used by default. */
+ if (COVERT_DATAFLOW(__data_start) != 0) {
+ GC_data_start = (ptr_t)(__data_start);
+ } else {
+ GC_data_start = (ptr_t)(data_start);
+ }
+ if (COVERT_DATAFLOW(GC_data_start) != 0) {
+ if ((word)GC_data_start > (word)data_end)
+ ABORT_ARG2("Wrong __data_start/_end pair",
+ ": %p .. %p", (void *)GC_data_start, (void *)data_end);
+ return;
+ }
+# ifdef DEBUG_ADD_DEL_ROOTS
+ GC_log_printf("__data_start not provided\n");
+# endif
+# endif /* LINUX */
+
+ if (GC_no_dls) {
+ /* Not needed, avoids the SIGSEGV caused by */
+ /* GC_find_limit which complicates debugging. */
+ GC_data_start = data_end; /* set data root size to 0 */
+ return;
+ }
+
+ GC_data_start = (ptr_t)GC_find_limit(data_end, FALSE);
+ }
+#endif /* SEARCH_FOR_DATA_START */
+
+#ifdef ECOS
+
+# ifndef ECOS_GC_MEMORY_SIZE
+# define ECOS_GC_MEMORY_SIZE (448 * 1024)
+# endif /* ECOS_GC_MEMORY_SIZE */
+
+ /* TODO: This is a simple way of allocating memory which is */
+ /* compatible with ECOS early releases. Later releases use a more */
+ /* sophisticated means of allocating memory than this simple static */
+ /* allocator, but this method is at least bound to work. */
+ static char ecos_gc_memory[ECOS_GC_MEMORY_SIZE];
+ static char *ecos_gc_brk = ecos_gc_memory;
+
+ static void *tiny_sbrk(ptrdiff_t increment)
+ {
+ void *p = ecos_gc_brk;
+ ecos_gc_brk += increment;
+ if ((word)ecos_gc_brk > (word)(ecos_gc_memory + sizeof(ecos_gc_memory))) {
+ ecos_gc_brk -= increment;
+ return NULL;
+ }
+ return p;
+ }
+# define sbrk tiny_sbrk
+#endif /* ECOS */
+
+#if defined(NETBSD) && defined(__ELF__)
+ ptr_t GC_data_start = NULL;
+
+ EXTERN_C_BEGIN
+ extern char **environ;
+ EXTERN_C_END
+
+ GC_INNER void GC_init_netbsd_elf(void)
+ {
+ /* This may need to be environ, without the underscore, for */
+ /* some versions. */
+ GC_data_start = (ptr_t)GC_find_limit(&environ, FALSE);
+ }
+#endif /* NETBSD */
+
+#if defined(ADDRESS_SANITIZER) && (defined(UNIX_LIKE) \
+ || defined(NEED_FIND_LIMIT) || defined(MPROTECT_VDB)) \
+ && !defined(CUSTOM_ASAN_DEF_OPTIONS)
+ EXTERN_C_BEGIN
+ GC_API const char *__asan_default_options(void);
+ EXTERN_C_END
+
+ /* To tell ASan to allow GC to use its own SIGBUS/SEGV handlers. */
+ /* The function is exported just to be visible to ASan library. */
+ GC_API const char *__asan_default_options(void)
+ {
+ return "allow_user_segv_handler=1";
+ }
+#endif
+
+#ifdef OPENBSD
+ static struct sigaction old_segv_act;
+ STATIC JMP_BUF GC_jmp_buf_openbsd;
+
+ STATIC void GC_fault_handler_openbsd(int sig GC_ATTR_UNUSED)
+ {
+ LONGJMP(GC_jmp_buf_openbsd, 1);
+ }
+
+# ifdef GC_OPENBSD_UTHREADS
+# include <sys/syscall.h>
+ EXTERN_C_BEGIN
+ extern sigset_t __syscall(quad_t, ...);
+ EXTERN_C_END
+
+ /* Don't use GC_find_limit() because siglongjmp() outside of the */
+ /* signal handler by-passes our userland pthreads lib, leaving */
+ /* SIGSEGV and SIGPROF masked. Instead, use this custom one that */
+ /* works-around the issues. */
+
+ /* Return the first non-addressable location > p or bound. */
+ /* Requires the allocation lock. */
+ STATIC ptr_t GC_find_limit_openbsd(ptr_t p, ptr_t bound)
+ {
+ static volatile ptr_t result;
+ /* Safer if static, since otherwise it may not be */
+ /* preserved across the longjmp. Can safely be */
+ /* static since it's only called with the */
+ /* allocation lock held. */
+
+ struct sigaction act;
+ word pgsz = (word)sysconf(_SC_PAGESIZE);
+
+ GC_ASSERT((word)bound >= pgsz);
+ GC_ASSERT(I_HOLD_LOCK());
+
+ act.sa_handler = GC_fault_handler_openbsd;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = SA_NODEFER | SA_RESTART;
+ /* act.sa_restorer is deprecated and should not be initialized. */
+ sigaction(SIGSEGV, &act, &old_segv_act);
+
+ if (SETJMP(GC_jmp_buf_openbsd) == 0) {
+ result = (ptr_t)((word)p & ~(pgsz-1));
+ for (;;) {
+ if ((word)result >= (word)bound - pgsz) {
+ result = bound;
+ break;
+ }
+ result += pgsz; /* no overflow expected */
+ GC_noop1((word)(*result));
+ }
+ }
+
+# ifdef THREADS
+ /* Due to the siglongjump we need to manually unmask SIGPROF. */
+ __syscall(SYS_sigprocmask, SIG_UNBLOCK, sigmask(SIGPROF));
+# endif
+
+ sigaction(SIGSEGV, &old_segv_act, 0);
+ return(result);
+ }
+# endif /* GC_OPENBSD_UTHREADS */
+
+ static volatile int firstpass;
+
+ /* Return first addressable location > p or bound. */
+ /* Requires the allocation lock. */
+ STATIC ptr_t GC_skip_hole_openbsd(ptr_t p, ptr_t bound)
+ {
+ static volatile ptr_t result;
+
+ struct sigaction act;
+ word pgsz = (word)sysconf(_SC_PAGESIZE);
+
+ GC_ASSERT((word)bound >= pgsz);
+ GC_ASSERT(I_HOLD_LOCK());
+
+ act.sa_handler = GC_fault_handler_openbsd;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = SA_NODEFER | SA_RESTART;
+ /* act.sa_restorer is deprecated and should not be initialized. */
+ sigaction(SIGSEGV, &act, &old_segv_act);
+
+ firstpass = 1;
+ result = (ptr_t)((word)p & ~(pgsz-1));
+ if (SETJMP(GC_jmp_buf_openbsd) != 0 || firstpass) {
+ firstpass = 0;
+ if ((word)result >= (word)bound - pgsz) {
+ result = bound;
+ } else {
+ result += pgsz; /* no overflow expected */
+ GC_noop1((word)(unsigned char)(*result));
+ }
+ }
+
+ sigaction(SIGSEGV, &old_segv_act, 0);
+ return(result);
+ }
+#endif /* OPENBSD */
+
+# ifdef OS2
+
+# include <stddef.h>
+
+# if !defined(__IBMC__) && !defined(__WATCOMC__) /* e.g. EMX */
+
+struct exe_hdr {
+ unsigned short magic_number;
+ unsigned short padding[29];
+ long new_exe_offset;
+};
+
+#define E_MAGIC(x) (x).magic_number
+#define EMAGIC 0x5A4D
+#define E_LFANEW(x) (x).new_exe_offset
+
+struct e32_exe {
+ unsigned char magic_number[2];
+ unsigned char byte_order;
+ unsigned char word_order;
+ unsigned long exe_format_level;
+ unsigned short cpu;
+ unsigned short os;
+ unsigned long padding1[13];
+ unsigned long object_table_offset;
+ unsigned long object_count;
+ unsigned long padding2[31];
+};
+
+#define E32_MAGIC1(x) (x).magic_number[0]
+#define E32MAGIC1 'L'
+#define E32_MAGIC2(x) (x).magic_number[1]
+#define E32MAGIC2 'X'
+#define E32_BORDER(x) (x).byte_order
+#define E32LEBO 0
+#define E32_WORDER(x) (x).word_order
+#define E32LEWO 0
+#define E32_CPU(x) (x).cpu
+#define E32CPU286 1
+#define E32_OBJTAB(x) (x).object_table_offset
+#define E32_OBJCNT(x) (x).object_count
+
+struct o32_obj {
+ unsigned long size;
+ unsigned long base;
+ unsigned long flags;
+ unsigned long pagemap;
+ unsigned long mapsize;
+ unsigned long reserved;
+};
+
+#define O32_FLAGS(x) (x).flags
+#define OBJREAD 0x0001L
+#define OBJWRITE 0x0002L
+#define OBJINVALID 0x0080L
+#define O32_SIZE(x) (x).size
+#define O32_BASE(x) (x).base
+
+# else /* IBM's compiler */
+
+/* A kludge to get around what appears to be a header file bug */
+# ifndef WORD
+# define WORD unsigned short
+# endif
+# ifndef DWORD
+# define DWORD unsigned long
+# endif
+
+# define EXE386 1
+# include <newexe.h>
+# include <exe386.h>
+
+# endif /* __IBMC__ */
+
+# define INCL_DOSEXCEPTIONS
+# define INCL_DOSPROCESS
+# define INCL_DOSERRORS
+# define INCL_DOSMODULEMGR
+# define INCL_DOSMEMMGR
+# include <os2.h>
+
+# endif /* OS/2 */
+
+/* Find the page size */
+GC_INNER size_t GC_page_size = 0;
+
+#if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+# ifndef VER_PLATFORM_WIN32_CE
+# define VER_PLATFORM_WIN32_CE 3
+# endif
+
+# if defined(MSWINCE) && defined(THREADS)
+ GC_INNER GC_bool GC_dont_query_stack_min = FALSE;
+# endif
+
+ GC_INNER SYSTEM_INFO GC_sysinfo;
+
+ GC_INNER void GC_setpagesize(void)
+ {
+ GetSystemInfo(&GC_sysinfo);
+# if defined(CYGWIN32) && (defined(MPROTECT_VDB) || defined(USE_MUNMAP))
+ /* Allocations made with mmap() are aligned to the allocation */
+ /* granularity, which (at least on Win64) is not the */
+ /* same as the page size. Probably a separate variable could */
+ /* be added to distinguish the allocation granularity from the */
+ /* actual page size, but in practice there is no good reason to */
+ /* make allocations smaller than dwAllocationGranularity, so we */
+ /* just use it instead of the actual page size here (as Cygwin */
+ /* itself does in many cases). */
+ GC_page_size = (size_t)GC_sysinfo.dwAllocationGranularity;
+ GC_ASSERT(GC_page_size >= (size_t)GC_sysinfo.dwPageSize);
+# else
+ GC_page_size = (size_t)GC_sysinfo.dwPageSize;
+# endif
+# if defined(MSWINCE) && !defined(_WIN32_WCE_EMULATION)
+ {
+ OSVERSIONINFO verInfo;
+ /* Check the current WinCE version. */
+ verInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ if (!GetVersionEx(&verInfo))
+ ABORT("GetVersionEx failed");
+ if (verInfo.dwPlatformId == VER_PLATFORM_WIN32_CE &&
+ verInfo.dwMajorVersion < 6) {
+ /* Only the first 32 MB of address space belongs to the */
+ /* current process (unless WinCE 6.0+ or emulation). */
+ GC_sysinfo.lpMaximumApplicationAddress = (LPVOID)((word)32 << 20);
+# ifdef THREADS
+ /* On some old WinCE versions, it's observed that */
+ /* VirtualQuery calls don't work properly when used to */
+ /* get thread current stack committed minimum. */
+ if (verInfo.dwMajorVersion < 5)
+ GC_dont_query_stack_min = TRUE;
+# endif
+ }
+ }
+# endif
+ }
+
+# ifndef CYGWIN32
+# define is_writable(prot) ((prot) == PAGE_READWRITE \
+ || (prot) == PAGE_WRITECOPY \
+ || (prot) == PAGE_EXECUTE_READWRITE \
+ || (prot) == PAGE_EXECUTE_WRITECOPY)
+ /* Return the number of bytes that are writable starting at p. */
+ /* The pointer p is assumed to be page aligned. */
+ /* If base is not 0, *base becomes the beginning of the */
+ /* allocation region containing p. */
+ STATIC word GC_get_writable_length(ptr_t p, ptr_t *base)
+ {
+ MEMORY_BASIC_INFORMATION buf;
+ word result;
+ word protect;
+
+ result = VirtualQuery(p, &buf, sizeof(buf));
+ if (result != sizeof(buf)) ABORT("Weird VirtualQuery result");
+ if (base != 0) *base = (ptr_t)(buf.AllocationBase);
+ protect = buf.Protect & ~(word)(PAGE_GUARD | PAGE_NOCACHE);
+ if (!is_writable(protect)) {
+ return(0);
+ }
+ if (buf.State != MEM_COMMIT) return(0);
+ return(buf.RegionSize);
+ }
+
+ GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb)
+ {
+ ptr_t trunc_sp;
+ word size;
+
+ /* Set page size if it is not ready (so client can use this */
+ /* function even before GC is initialized). */
+ if (!GC_page_size) GC_setpagesize();
+
+ trunc_sp = (ptr_t)((word)GC_approx_sp() & ~(word)(GC_page_size-1));
+ /* FIXME: This won't work if called from a deeply recursive */
+ /* client code (and the committed stack space has grown). */
+ size = GC_get_writable_length(trunc_sp, 0);
+ GC_ASSERT(size != 0);
+ sb -> mem_base = trunc_sp + size;
+ return GC_SUCCESS;
+ }
+# else /* CYGWIN32 */
+ /* An alternate version for Cygwin (adapted from Dave Korn's */
+ /* gcc version of boehm-gc). */
+ GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb)
+ {
+# ifdef X86_64
+ sb -> mem_base = ((NT_TIB*)NtCurrentTeb())->StackBase;
+# else
+ void * _tlsbase;
+
+ __asm__ ("movl %%fs:4, %0"
+ : "=r" (_tlsbase));
+ sb -> mem_base = _tlsbase;
+# endif
+ return GC_SUCCESS;
+ }
+# endif /* CYGWIN32 */
+# define HAVE_GET_STACK_BASE
+
+#else /* !MSWIN32 */
+ GC_INNER void GC_setpagesize(void)
+ {
+# if defined(MPROTECT_VDB) || defined(PROC_VDB) || defined(SOFT_VDB) \
+ || defined(USE_MMAP)
+ GC_page_size = (size_t)GETPAGESIZE();
+# if !defined(CPPCHECK)
+ if (0 == GC_page_size)
+ ABORT("getpagesize failed");
+# endif
+# else
+ /* It's acceptable to fake it. */
+ GC_page_size = HBLKSIZE;
+# endif
+ }
+#endif /* !MSWIN32 */
+
+#ifdef HAIKU
+# include <kernel/OS.h>
+
+ GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb)
+ {
+ thread_info th;
+ get_thread_info(find_thread(NULL),&th);
+ sb->mem_base = th.stack_end;
+ return GC_SUCCESS;
+ }
+# define HAVE_GET_STACK_BASE
+#endif /* HAIKU */
+
+#ifdef OS2
+ GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb)
+ {
+ PTIB ptib; /* thread information block */
+ PPIB ppib;
+ if (DosGetInfoBlocks(&ptib, &ppib) != NO_ERROR) {
+ WARN("DosGetInfoBlocks failed\n", 0);
+ return GC_UNIMPLEMENTED;
+ }
+ sb->mem_base = ptib->tib_pstacklimit;
+ return GC_SUCCESS;
+ }
+# define HAVE_GET_STACK_BASE
+#endif /* OS2 */
+
+# ifdef AMIGA
+# define GC_AMIGA_SB
+# include "extra/AmigaOS.c"
+# undef GC_AMIGA_SB
+# define GET_MAIN_STACKBASE_SPECIAL
+# endif /* AMIGA */
+
+# if defined(NEED_FIND_LIMIT) \
+ || (defined(UNIX_LIKE) && !defined(NO_DEBUGGING)) \
+ || (defined(USE_PROC_FOR_LIBRARIES) && defined(THREADS)) \
+ || (defined(WRAP_MARK_SOME) && defined(__GNUC__))
+
+ typedef void (*GC_fault_handler_t)(int);
+
+# if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) \
+ || defined(HAIKU) || defined(HURD) || defined(FREEBSD) \
+ || defined(NETBSD)
+ static struct sigaction old_segv_act;
+# if defined(_sigargs) /* !Irix6.x */ || defined(HPUX) \
+ || defined(HURD) || defined(NETBSD) || defined(FREEBSD)
+ static struct sigaction old_bus_act;
+# endif
+# elif !defined(OPENBSD)
+ static GC_fault_handler_t old_segv_handler;
+# ifdef HAVE_SIGBUS
+ static GC_fault_handler_t old_bus_handler;
+# endif
+# endif
+
+ GC_INNER void GC_set_and_save_fault_handler(GC_fault_handler_t h)
+ {
+# if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) \
+ || defined(HAIKU) || defined(HURD) || defined(FREEBSD) \
+ || defined(NETBSD) || defined(OPENBSD)
+ struct sigaction act;
+
+ act.sa_handler = h;
+# ifdef SIGACTION_FLAGS_NODEFER_HACK
+ /* Was necessary for Solaris 2.3 and very temporary */
+ /* NetBSD bugs. */
+ act.sa_flags = SA_RESTART | SA_NODEFER;
+# else
+ act.sa_flags = SA_RESTART;
+# endif
+
+ (void) sigemptyset(&act.sa_mask);
+ /* act.sa_restorer is deprecated and should not be initialized. */
+# ifdef GC_IRIX_THREADS
+ /* Older versions have a bug related to retrieving and */
+ /* and setting a handler at the same time. */
+ (void) sigaction(SIGSEGV, 0, &old_segv_act);
+ (void) sigaction(SIGSEGV, &act, 0);
+# else
+ (void) sigaction(SIGSEGV, &act, &old_segv_act);
+# if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \
+ || defined(HPUX) || defined(HURD) || defined(NETBSD) \
+ || defined(FREEBSD)
+ /* Under Irix 5.x or HP/UX, we may get SIGBUS. */
+ /* Pthreads doesn't exist under Irix 5.x, so we */
+ /* don't have to worry in the threads case. */
+ (void) sigaction(SIGBUS, &act, &old_bus_act);
+# endif
+# endif /* !GC_IRIX_THREADS */
+# else
+ old_segv_handler = signal(SIGSEGV, h);
+# ifdef HAVE_SIGBUS
+ old_bus_handler = signal(SIGBUS, h);
+# endif
+# endif
+# if defined(CPPCHECK) && defined(ADDRESS_SANITIZER)
+ GC_noop1((word)&__asan_default_options);
+# endif
+ }
+# endif /* NEED_FIND_LIMIT || UNIX_LIKE */
+
+# if defined(NEED_FIND_LIMIT) \
+ || (defined(WRAP_MARK_SOME) && defined(__GNUC__)) \
+ || (defined(USE_PROC_FOR_LIBRARIES) && defined(THREADS))
+ /* Some tools to implement HEURISTIC2 */
+# define MIN_PAGE_SIZE 256 /* Smallest conceivable page size, bytes */
+
+ GC_INNER JMP_BUF GC_jmp_buf;
+
+ STATIC void GC_fault_handler(int sig GC_ATTR_UNUSED)
+ {
+ LONGJMP(GC_jmp_buf, 1);
+ }
+
+ GC_INNER void GC_setup_temporary_fault_handler(void)
+ {
+ /* Handler is process-wide, so this should only happen in */
+ /* one thread at a time. */
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_set_and_save_fault_handler(GC_fault_handler);
+ }
+
+ GC_INNER void GC_reset_fault_handler(void)
+ {
+# if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) \
+ || defined(HAIKU) || defined(HURD) || defined(FREEBSD) \
+ || defined(NETBSD) || defined(OPENBSD)
+ (void) sigaction(SIGSEGV, &old_segv_act, 0);
+# if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \
+ || defined(HPUX) || defined(HURD) || defined(NETBSD) \
+ || defined(FREEBSD)
+ (void) sigaction(SIGBUS, &old_bus_act, 0);
+# endif
+# else
+ (void) signal(SIGSEGV, old_segv_handler);
+# ifdef HAVE_SIGBUS
+ (void) signal(SIGBUS, old_bus_handler);
+# endif
+# endif
+ }
+
+ /* Return the first non-addressable location > p (up) or */
+ /* the smallest location q s.t. [q,p) is addressable (!up). */
+ /* We assume that p (up) or p-1 (!up) is addressable. */
+ /* Requires allocation lock. */
+ GC_ATTR_NO_SANITIZE_ADDR
+ STATIC ptr_t GC_find_limit_with_bound(ptr_t p, GC_bool up, ptr_t bound)
+ {
+ static volatile ptr_t result;
+ /* Safer if static, since otherwise it may not be */
+ /* preserved across the longjmp. Can safely be */
+ /* static since it's only called with the */
+ /* allocation lock held. */
+
+ GC_ASSERT(up ? (word)bound >= MIN_PAGE_SIZE
+ : (word)bound <= ~(word)MIN_PAGE_SIZE);
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_setup_temporary_fault_handler();
+ if (SETJMP(GC_jmp_buf) == 0) {
+ result = (ptr_t)((word)p & ~(word)(MIN_PAGE_SIZE-1));
+ for (;;) {
+ if (up) {
+ if ((word)result >= (word)bound - MIN_PAGE_SIZE) {
+ result = bound;
+ break;
+ }
+ result += MIN_PAGE_SIZE; /* no overflow expected */
+ } else {
+ if ((word)result <= (word)bound + MIN_PAGE_SIZE) {
+ result = bound - MIN_PAGE_SIZE;
+ /* This is to compensate */
+ /* further result increment (we */
+ /* do not modify "up" variable */
+ /* since it might be clobbered */
+ /* by setjmp otherwise). */
+ break;
+ }
+ result -= MIN_PAGE_SIZE; /* no underflow expected */
+ }
+ GC_noop1((word)(unsigned char)(*result));
+ }
+ }
+ GC_reset_fault_handler();
+ if (!up) {
+ result += MIN_PAGE_SIZE;
+ }
+ return(result);
+ }
+
+ void * GC_find_limit(void * p, int up)
+ {
+ return GC_find_limit_with_bound((ptr_t)p, (GC_bool)up,
+ up ? (ptr_t)GC_WORD_MAX : 0);
+ }
+# endif /* NEED_FIND_LIMIT || USE_PROC_FOR_LIBRARIES */
+
+#ifdef HPUX_MAIN_STACKBOTTOM
+# include <sys/param.h>
+# include <sys/pstat.h>
+
+ STATIC ptr_t GC_hpux_main_stack_base(void)
+ {
+ struct pst_vm_status vm_status;
+ int i = 0;
+
+ while (pstat_getprocvm(&vm_status, sizeof(vm_status), 0, i++) == 1) {
+ if (vm_status.pst_type == PS_STACK)
+ return (ptr_t)vm_status.pst_vaddr;
+ }
+
+ /* Old way to get the stack bottom. */
+# ifdef STACK_GROWS_UP
+ return (ptr_t)GC_find_limit(GC_approx_sp(), /* up= */ FALSE);
+# else /* not HP_PA */
+ return (ptr_t)GC_find_limit(GC_approx_sp(), TRUE);
+# endif
+ }
+#endif /* HPUX_MAIN_STACKBOTTOM */
+
+#ifdef HPUX_STACKBOTTOM
+
+#include <sys/param.h>
+#include <sys/pstat.h>
+
+ GC_INNER ptr_t GC_get_register_stack_base(void)
+ {
+ struct pst_vm_status vm_status;
+
+ int i = 0;
+ while (pstat_getprocvm(&vm_status, sizeof(vm_status), 0, i++) == 1) {
+ if (vm_status.pst_type == PS_RSESTACK) {
+ return (ptr_t) vm_status.pst_vaddr;
+ }
+ }
+
+ /* old way to get the register stackbottom */
+ return (ptr_t)(((word)GC_stackbottom - BACKING_STORE_DISPLACEMENT - 1)
+ & ~(word)(BACKING_STORE_ALIGNMENT-1));
+ }
+
+#endif /* HPUX_STACK_BOTTOM */
+
+#ifdef LINUX_STACKBOTTOM
+
+# include <sys/types.h>
+# include <sys/stat.h>
+
+# define STAT_SKIP 27 /* Number of fields preceding startstack */
+ /* field in /proc/self/stat */
+
+# ifdef USE_LIBC_PRIVATES
+ EXTERN_C_BEGIN
+# pragma weak __libc_stack_end
+ extern ptr_t __libc_stack_end;
+# ifdef IA64
+# pragma weak __libc_ia64_register_backing_store_base
+ extern ptr_t __libc_ia64_register_backing_store_base;
+# endif
+ EXTERN_C_END
+# endif
+
+# ifdef IA64
+ GC_INNER ptr_t GC_get_register_stack_base(void)
+ {
+ ptr_t result;
+
+# ifdef USE_LIBC_PRIVATES
+ if (0 != &__libc_ia64_register_backing_store_base
+ && 0 != __libc_ia64_register_backing_store_base) {
+ /* Glibc 2.2.4 has a bug such that for dynamically linked */
+ /* executables __libc_ia64_register_backing_store_base is */
+ /* defined but uninitialized during constructor calls. */
+ /* Hence we check for both nonzero address and value. */
+ return __libc_ia64_register_backing_store_base;
+ }
+# endif
+ result = backing_store_base_from_proc();
+ if (0 == result) {
+ result = (ptr_t)GC_find_limit(GC_save_regs_in_stack(), FALSE);
+ /* This works better than a constant displacement heuristic. */
+ }
+ return result;
+ }
+# endif /* IA64 */
+
+ STATIC ptr_t GC_linux_main_stack_base(void)
+ {
+ /* We read the stack bottom value from /proc/self/stat. We do this */
+ /* using direct I/O system calls in order to avoid calling malloc */
+ /* in case REDIRECT_MALLOC is defined. */
+# define STAT_BUF_SIZE 4096
+ char stat_buf[STAT_BUF_SIZE];
+ int f;
+ word result;
+ ssize_t i, buf_offset = 0, len;
+
+ /* First try the easy way. This should work for glibc 2.2 */
+ /* This fails in a prelinked ("prelink" command) executable */
+ /* since the correct value of __libc_stack_end never */
+ /* becomes visible to us. The second test works around */
+ /* this. */
+# ifdef USE_LIBC_PRIVATES
+ if (0 != &__libc_stack_end && 0 != __libc_stack_end ) {
+# if defined(IA64)
+ /* Some versions of glibc set the address 16 bytes too */
+ /* low while the initialization code is running. */
+ if (((word)__libc_stack_end & 0xfff) + 0x10 < 0x1000) {
+ return __libc_stack_end + 0x10;
+ } /* Otherwise it's not safe to add 16 bytes and we fall */
+ /* back to using /proc. */
+# elif defined(SPARC)
+ /* Older versions of glibc for 64-bit SPARC do not set this */
+ /* variable correctly, it gets set to either zero or one. */
+ if (__libc_stack_end != (ptr_t) (unsigned long)0x1)
+ return __libc_stack_end;
+# else
+ return __libc_stack_end;
+# endif
+ }
+# endif
+
+ f = open("/proc/self/stat", O_RDONLY);
+ if (-1 == f)
+ ABORT_ARG1("Could not open /proc/self/stat", ": errno= %d", errno);
+ len = GC_repeat_read(f, stat_buf, sizeof(stat_buf));
+ if (len < 0)
+ ABORT_ARG1("Failed to read /proc/self/stat",
+ ": errno= %d", errno);
+ close(f);
+
+ /* Skip the required number of fields. This number is hopefully */
+ /* constant across all Linux implementations. */
+ for (i = 0; i < STAT_SKIP; ++i) {
+ while (buf_offset < len && isspace(stat_buf[buf_offset++])) {
+ /* empty */
+ }
+ while (buf_offset < len && !isspace(stat_buf[buf_offset++])) {
+ /* empty */
+ }
+ }
+ /* Skip spaces. */
+ while (buf_offset < len && isspace(stat_buf[buf_offset])) {
+ buf_offset++;
+ }
+ /* Find the end of the number and cut the buffer there. */
+ for (i = 0; buf_offset + i < len; i++) {
+ if (!isdigit(stat_buf[buf_offset + i])) break;
+ }
+ if (buf_offset + i >= len) ABORT("Could not parse /proc/self/stat");
+ stat_buf[buf_offset + i] = '\0';
+
+ result = (word)STRTOULL(&stat_buf[buf_offset], NULL, 10);
+ if (result < 0x100000 || (result & (sizeof(word) - 1)) != 0)
+ ABORT_ARG1("Absurd stack bottom value",
+ ": 0x%lx", (unsigned long)result);
+ return (ptr_t)result;
+ }
+#endif /* LINUX_STACKBOTTOM */
+
+#ifdef FREEBSD_STACKBOTTOM
+ /* This uses an undocumented sysctl call, but at least one expert */
+ /* believes it will stay. */
+
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/sysctl.h>
+
+ STATIC ptr_t GC_freebsd_main_stack_base(void)
+ {
+ int nm[2] = {CTL_KERN, KERN_USRSTACK};
+ ptr_t base;
+ size_t len = sizeof(ptr_t);
+ int r = sysctl(nm, 2, &base, &len, NULL, 0);
+ if (r) ABORT("Error getting main stack base");
+ return base;
+ }
+#endif /* FREEBSD_STACKBOTTOM */
+
+#if defined(ECOS) || defined(NOSYS)
+ ptr_t GC_get_main_stack_base(void)
+ {
+ return STACKBOTTOM;
+ }
+# define GET_MAIN_STACKBASE_SPECIAL
+#elif defined(SYMBIAN)
+ EXTERN_C_BEGIN
+ extern int GC_get_main_symbian_stack_base(void);
+ EXTERN_C_END
+
+ ptr_t GC_get_main_stack_base(void)
+ {
+ return (ptr_t)GC_get_main_symbian_stack_base();
+ }
+# define GET_MAIN_STACKBASE_SPECIAL
+#elif defined(EMSCRIPTEN)
+
+# if defined(USE_EMSCRIPTEN_SCAN_STACK) && defined(EMSCRIPTEN_ASYNCIFY)
+ /* According to the documentation, emscripten_scan_stack() is only */
+ /* guaranteed to be available when building with ASYNCIFY. */
+# include <emscripten.h>
+
+ static void *emscripten_stack_base;
+
+ static void scan_stack_cb(void *begin, void *end)
+ {
+ (void)begin;
+ emscripten_stack_base = end;
+ }
+# else
+# include <emscripten/stack.h>
+# endif
+
+ ptr_t GC_get_main_stack_base(void)
+ {
+# if defined(USE_EMSCRIPTEN_SCAN_STACK) && defined(EMSCRIPTEN_ASYNCIFY)
+ emscripten_scan_stack(scan_stack_cb);
+ return (ptr_t)emscripten_stack_base;
+# else
+ return (ptr_t)emscripten_stack_get_base();
+# endif
+ }
+# define GET_MAIN_STACKBASE_SPECIAL
+#elif !defined(AMIGA) && !defined(HAIKU) && !defined(OS2) \
+ && !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32) \
+ && !defined(GC_OPENBSD_THREADS) \
+ && (!defined(GC_SOLARIS_THREADS) || defined(_STRICT_STDC))
+
+# if (defined(HAVE_PTHREAD_ATTR_GET_NP) || defined(HAVE_PTHREAD_GETATTR_NP)) \
+ && (defined(THREADS) || defined(USE_GET_STACKBASE_FOR_MAIN))
+# include <pthread.h>
+# ifdef HAVE_PTHREAD_NP_H
+# include <pthread_np.h> /* for pthread_attr_get_np() */
+# endif
+# elif defined(DARWIN) && !defined(NO_PTHREAD_GET_STACKADDR_NP)
+ /* We could use pthread_get_stackaddr_np even in case of a */
+ /* single-threaded gclib (there is no -lpthread on Darwin). */
+# include <pthread.h>
+# undef STACKBOTTOM
+# define STACKBOTTOM (ptr_t)pthread_get_stackaddr_np(pthread_self())
+# endif
+
+ ptr_t GC_get_main_stack_base(void)
+ {
+ ptr_t result;
+# if (defined(HAVE_PTHREAD_ATTR_GET_NP) \
+ || defined(HAVE_PTHREAD_GETATTR_NP)) \
+ && (defined(USE_GET_STACKBASE_FOR_MAIN) \
+ || (defined(THREADS) && !defined(REDIRECT_MALLOC)))
+ pthread_attr_t attr;
+ void *stackaddr;
+ size_t size;
+
+# ifdef HAVE_PTHREAD_ATTR_GET_NP
+ if (pthread_attr_init(&attr) == 0
+ && (pthread_attr_get_np(pthread_self(), &attr) == 0
+ ? TRUE : (pthread_attr_destroy(&attr), FALSE)))
+# else /* HAVE_PTHREAD_GETATTR_NP */
+ if (pthread_getattr_np(pthread_self(), &attr) == 0)
+# endif
+ {
+ if (pthread_attr_getstack(&attr, &stackaddr, &size) == 0
+ && stackaddr != NULL) {
+ (void)pthread_attr_destroy(&attr);
+# ifdef STACK_GROWS_DOWN
+ stackaddr = (char *)stackaddr + size;
+# endif
+ return (ptr_t)stackaddr;
+ }
+ (void)pthread_attr_destroy(&attr);
+ }
+ WARN("pthread_getattr_np or pthread_attr_getstack failed"
+ " for main thread\n", 0);
+# endif
+# ifdef STACKBOTTOM
+ result = STACKBOTTOM;
+# else
+# ifdef HEURISTIC1
+# define STACKBOTTOM_ALIGNMENT_M1 ((word)STACK_GRAN - 1)
+# ifdef STACK_GROWS_DOWN
+ result = (ptr_t)(((word)GC_approx_sp() + STACKBOTTOM_ALIGNMENT_M1)
+ & ~(word)STACKBOTTOM_ALIGNMENT_M1);
+# else
+ result = (ptr_t)((word)GC_approx_sp()
+ & ~(word)STACKBOTTOM_ALIGNMENT_M1);
+# endif
+# elif defined(HPUX_MAIN_STACKBOTTOM)
+ result = GC_hpux_main_stack_base();
+# elif defined(LINUX_STACKBOTTOM)
+ result = GC_linux_main_stack_base();
+# elif defined(FREEBSD_STACKBOTTOM)
+ result = GC_freebsd_main_stack_base();
+# elif defined(HEURISTIC2)
+ {
+ ptr_t sp = GC_approx_sp();
+# ifdef STACK_GROWS_DOWN
+ result = (ptr_t)GC_find_limit(sp, TRUE);
+# if defined(HEURISTIC2_LIMIT) && !defined(CPPCHECK)
+ if ((word)result > (word)HEURISTIC2_LIMIT
+ && (word)sp < (word)HEURISTIC2_LIMIT) {
+ result = HEURISTIC2_LIMIT;
+ }
+# endif
+# else
+ result = (ptr_t)GC_find_limit(sp, FALSE);
+# if defined(HEURISTIC2_LIMIT) && !defined(CPPCHECK)
+ if ((word)result < (word)HEURISTIC2_LIMIT
+ && (word)sp > (word)HEURISTIC2_LIMIT) {
+ result = HEURISTIC2_LIMIT;
+ }
+# endif
+# endif
+ }
+# elif defined(STACK_NOT_SCANNED) || defined(CPPCHECK)
+ result = NULL;
+# else
+# error None of HEURISTIC* and *STACKBOTTOM defined!
+# endif
+# if defined(STACK_GROWS_DOWN) && !defined(CPPCHECK)
+ if (result == 0)
+ result = (ptr_t)(signed_word)(-sizeof(ptr_t));
+# endif
+# endif
+# if !defined(CPPCHECK)
+ GC_ASSERT((word)GC_approx_sp() HOTTER_THAN (word)result);
+# endif
+ return(result);
+ }
+# define GET_MAIN_STACKBASE_SPECIAL
+#endif /* !AMIGA, !HAIKU, !OPENBSD, !OS2, !Windows */
+
+#if (defined(HAVE_PTHREAD_ATTR_GET_NP) || defined(HAVE_PTHREAD_GETATTR_NP)) \
+ && defined(THREADS) && !defined(HAVE_GET_STACK_BASE)
+# include <pthread.h>
+# ifdef HAVE_PTHREAD_NP_H
+# include <pthread_np.h>
+# endif
+
+ GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *b)
+ {
+ pthread_attr_t attr;
+ size_t size;
+# ifdef IA64
+ DCL_LOCK_STATE;
+# endif
+
+# ifdef HAVE_PTHREAD_ATTR_GET_NP
+ if (pthread_attr_init(&attr) != 0)
+ ABORT("pthread_attr_init failed");
+ if (pthread_attr_get_np(pthread_self(), &attr) != 0) {
+ WARN("pthread_attr_get_np failed\n", 0);
+ (void)pthread_attr_destroy(&attr);
+ return GC_UNIMPLEMENTED;
+ }
+# else /* HAVE_PTHREAD_GETATTR_NP */
+ if (pthread_getattr_np(pthread_self(), &attr) != 0) {
+ WARN("pthread_getattr_np failed\n", 0);
+ return GC_UNIMPLEMENTED;
+ }
+# endif
+ if (pthread_attr_getstack(&attr, &(b -> mem_base), &size) != 0) {
+ ABORT("pthread_attr_getstack failed");
+ }
+ (void)pthread_attr_destroy(&attr);
+# ifdef STACK_GROWS_DOWN
+ b -> mem_base = (char *)(b -> mem_base) + size;
+# endif
+# ifdef IA64
+ /* We could try backing_store_base_from_proc, but that's safe */
+ /* only if no mappings are being asynchronously created. */
+ /* Subtracting the size from the stack base doesn't work for at */
+ /* least the main thread. */
+ LOCK();
+ {
+ IF_CANCEL(int cancel_state;)
+ ptr_t bsp;
+ ptr_t next_stack;
+
+ DISABLE_CANCEL(cancel_state);
+ bsp = GC_save_regs_in_stack();
+ next_stack = GC_greatest_stack_base_below(bsp);
+ if (0 == next_stack) {
+ b -> reg_base = GC_find_limit(bsp, FALSE);
+ } else {
+ /* Avoid walking backwards into preceding memory stack and */
+ /* growing it. */
+ b -> reg_base = GC_find_limit_with_bound(bsp, FALSE, next_stack);
+ }
+ RESTORE_CANCEL(cancel_state);
+ }
+ UNLOCK();
+# elif defined(E2K)
+ b -> reg_base = NULL;
+# endif
+ return GC_SUCCESS;
+ }
+# define HAVE_GET_STACK_BASE
+#endif /* THREADS && (HAVE_PTHREAD_ATTR_GET_NP || HAVE_PTHREAD_GETATTR_NP) */
+
+#if defined(GC_DARWIN_THREADS) && !defined(NO_PTHREAD_GET_STACKADDR_NP)
+# include <pthread.h>
+
+ GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *b)
+ {
+ /* pthread_get_stackaddr_np() should return stack bottom (highest */
+ /* stack address plus 1). */
+ b->mem_base = pthread_get_stackaddr_np(pthread_self());
+ GC_ASSERT((word)GC_approx_sp() HOTTER_THAN (word)b->mem_base);
+ return GC_SUCCESS;
+ }
+# define HAVE_GET_STACK_BASE
+#endif /* GC_DARWIN_THREADS */
+
+#ifdef GC_OPENBSD_THREADS
+# include <sys/signal.h>
+# include <pthread.h>
+# include <pthread_np.h>
+
+ /* Find the stack using pthread_stackseg_np(). */
+ GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb)
+ {
+ stack_t stack;
+ if (pthread_stackseg_np(pthread_self(), &stack))
+ ABORT("pthread_stackseg_np(self) failed");
+ sb->mem_base = stack.ss_sp;
+ return GC_SUCCESS;
+ }
+# define HAVE_GET_STACK_BASE
+#endif /* GC_OPENBSD_THREADS */
+
+#if defined(GC_SOLARIS_THREADS) && !defined(_STRICT_STDC)
+
+# include <thread.h>
+# include <signal.h>
+# include <pthread.h>
+
+ /* These variables are used to cache ss_sp value for the primordial */
+ /* thread (it's better not to call thr_stksegment() twice for this */
+ /* thread - see JDK bug #4352906). */
+ static pthread_t stackbase_main_self = 0;
+ /* 0 means stackbase_main_ss_sp value is unset. */
+ static void *stackbase_main_ss_sp = NULL;
+
+ GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *b)
+ {
+ stack_t s;
+ pthread_t self = pthread_self();
+
+ if (self == stackbase_main_self)
+ {
+ /* If the client calls GC_get_stack_base() from the main thread */
+ /* then just return the cached value. */
+ b -> mem_base = stackbase_main_ss_sp;
+ GC_ASSERT(b -> mem_base != NULL);
+ return GC_SUCCESS;
+ }
+
+ if (thr_stksegment(&s)) {
+ /* According to the manual, the only failure error code returned */
+ /* is EAGAIN meaning "the information is not available due to the */
+ /* thread is not yet completely initialized or it is an internal */
+ /* thread" - this shouldn't happen here. */
+ ABORT("thr_stksegment failed");
+ }
+ /* s.ss_sp holds the pointer to the stack bottom. */
+ GC_ASSERT((word)GC_approx_sp() HOTTER_THAN (word)s.ss_sp);
+
+ if (!stackbase_main_self && thr_main() != 0)
+ {
+ /* Cache the stack bottom pointer for the primordial thread */
+ /* (this is done during GC_init, so there is no race). */
+ stackbase_main_ss_sp = s.ss_sp;
+ stackbase_main_self = self;
+ }
+
+ b -> mem_base = s.ss_sp;
+ return GC_SUCCESS;
+ }
+# define HAVE_GET_STACK_BASE
+#endif /* GC_SOLARIS_THREADS */
+
+#ifdef GC_RTEMS_PTHREADS
+ GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb)
+ {
+ sb->mem_base = rtems_get_stack_bottom();
+ return GC_SUCCESS;
+ }
+# define HAVE_GET_STACK_BASE
+#endif /* GC_RTEMS_PTHREADS */
+
+#ifndef HAVE_GET_STACK_BASE
+# ifdef NEED_FIND_LIMIT
+ /* Retrieve the stack bottom. */
+ /* Using the GC_find_limit version is risky. */
+ /* On IA64, for example, there is no guard page between the */
+ /* stack of one thread and the register backing store of the */
+ /* next. Thus this is likely to identify way too large a */
+ /* "stack" and thus at least result in disastrous performance. */
+ /* TODO: Implement better strategies here. */
+ GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *b)
+ {
+ IF_CANCEL(int cancel_state;)
+ DCL_LOCK_STATE;
+
+ LOCK();
+ DISABLE_CANCEL(cancel_state); /* May be unnecessary? */
+# ifdef STACK_GROWS_DOWN
+ b -> mem_base = GC_find_limit(GC_approx_sp(), TRUE);
+# else
+ b -> mem_base = GC_find_limit(GC_approx_sp(), FALSE);
+# endif
+# ifdef IA64
+ b -> reg_base = GC_find_limit(GC_save_regs_in_stack(), FALSE);
+# elif defined(E2K)
+ b -> reg_base = NULL;
+# endif
+ RESTORE_CANCEL(cancel_state);
+ UNLOCK();
+ return GC_SUCCESS;
+ }
+# else
+ GC_API int GC_CALL GC_get_stack_base(
+ struct GC_stack_base *b GC_ATTR_UNUSED)
+ {
+# if defined(GET_MAIN_STACKBASE_SPECIAL) && !defined(THREADS) \
+ && !defined(IA64)
+ b->mem_base = GC_get_main_stack_base();
+ return GC_SUCCESS;
+# else
+ return GC_UNIMPLEMENTED;
+# endif
+ }
+# endif /* !NEED_FIND_LIMIT */
+#endif /* !HAVE_GET_STACK_BASE */
+
+#ifndef GET_MAIN_STACKBASE_SPECIAL
+ /* This is always called from the main thread. Default implementation. */
+ ptr_t GC_get_main_stack_base(void)
+ {
+ struct GC_stack_base sb;
+
+ if (GC_get_stack_base(&sb) != GC_SUCCESS)
+ ABORT("GC_get_stack_base failed");
+ GC_ASSERT((word)GC_approx_sp() HOTTER_THAN (word)sb.mem_base);
+ return (ptr_t)sb.mem_base;
+ }
+#endif /* !GET_MAIN_STACKBASE_SPECIAL */
+
+/* Register static data segment(s) as roots. If more data segments are */
+/* added later then they need to be registered at that point (as we do */
+/* with SunOS dynamic loading), or GC_mark_roots needs to check for */
+/* them (as we do with PCR). Called with allocator lock held. */
+# ifdef OS2
+
+void GC_register_data_segments(void)
+{
+ PTIB ptib;
+ PPIB ppib;
+ HMODULE module_handle;
+# define PBUFSIZ 512
+ UCHAR path[PBUFSIZ];
+ FILE * myexefile;
+ struct exe_hdr hdrdos; /* MSDOS header. */
+ struct e32_exe hdr386; /* Real header for my executable */
+ struct o32_obj seg; /* Current segment */
+ int nsegs;
+
+# if defined(CPPCHECK)
+ hdrdos.padding[0] = 0; /* to prevent "field unused" warnings */
+ hdr386.exe_format_level = 0;
+ hdr386.os = 0;
+ hdr386.padding1[0] = 0;
+ hdr386.padding2[0] = 0;
+ seg.pagemap = 0;
+ seg.mapsize = 0;
+ seg.reserved = 0;
+# endif
+ if (DosGetInfoBlocks(&ptib, &ppib) != NO_ERROR) {
+ ABORT("DosGetInfoBlocks failed");
+ }
+ module_handle = ppib -> pib_hmte;
+ if (DosQueryModuleName(module_handle, PBUFSIZ, path) != NO_ERROR) {
+ ABORT("DosQueryModuleName failed");
+ }
+ myexefile = fopen(path, "rb");
+ if (myexefile == 0) {
+ ABORT_ARG1("Failed to open executable", ": %s", path);
+ }
+ if (fread((char *)(&hdrdos), 1, sizeof(hdrdos), myexefile)
+ < sizeof(hdrdos)) {
+ ABORT_ARG1("Could not read MSDOS header", " from: %s", path);
+ }
+ if (E_MAGIC(hdrdos) != EMAGIC) {
+ ABORT_ARG1("Bad DOS magic number", " in file: %s", path);
+ }
+ if (fseek(myexefile, E_LFANEW(hdrdos), SEEK_SET) != 0) {
+ ABORT_ARG1("Bad DOS magic number", " in file: %s", path);
+ }
+ if (fread((char *)(&hdr386), 1, sizeof(hdr386), myexefile)
+ < sizeof(hdr386)) {
+ ABORT_ARG1("Could not read OS/2 header", " from: %s", path);
+ }
+ if (E32_MAGIC1(hdr386) != E32MAGIC1 || E32_MAGIC2(hdr386) != E32MAGIC2) {
+ ABORT_ARG1("Bad OS/2 magic number", " in file: %s", path);
+ }
+ if (E32_BORDER(hdr386) != E32LEBO || E32_WORDER(hdr386) != E32LEWO) {
+ ABORT_ARG1("Bad byte order in executable", " file: %s", path);
+ }
+ if (E32_CPU(hdr386) == E32CPU286) {
+ ABORT_ARG1("GC cannot handle 80286 executables", ": %s", path);
+ }
+ if (fseek(myexefile, E_LFANEW(hdrdos) + E32_OBJTAB(hdr386),
+ SEEK_SET) != 0) {
+ ABORT_ARG1("Seek to object table failed", " in file: %s", path);
+ }
+ for (nsegs = E32_OBJCNT(hdr386); nsegs > 0; nsegs--) {
+ int flags;
+ if (fread((char *)(&seg), 1, sizeof(seg), myexefile) < sizeof(seg)) {
+ ABORT_ARG1("Could not read obj table entry", " from file: %s", path);
+ }
+ flags = O32_FLAGS(seg);
+ if (!(flags & OBJWRITE)) continue;
+ if (!(flags & OBJREAD)) continue;
+ if (flags & OBJINVALID) {
+ GC_err_printf("Object with invalid pages?\n");
+ continue;
+ }
+ GC_add_roots_inner((ptr_t)O32_BASE(seg),
+ (ptr_t)(O32_BASE(seg)+O32_SIZE(seg)), FALSE);
+ }
+ (void)fclose(myexefile);
+}
+
+# else /* !OS2 */
+
+# if defined(GWW_VDB)
+# ifndef MEM_WRITE_WATCH
+# define MEM_WRITE_WATCH 0x200000
+# endif
+# ifndef WRITE_WATCH_FLAG_RESET
+# define WRITE_WATCH_FLAG_RESET 1
+# endif
+
+ /* Since we can't easily check whether ULONG_PTR and SIZE_T are */
+ /* defined in Win32 basetsd.h, we define own ULONG_PTR. */
+# define GC_ULONG_PTR word
+
+ typedef UINT (WINAPI * GetWriteWatch_type)(
+ DWORD, PVOID, GC_ULONG_PTR /* SIZE_T */,
+ PVOID *, GC_ULONG_PTR *, PULONG);
+ static FARPROC GetWriteWatch_func;
+ static DWORD GetWriteWatch_alloc_flag;
+
+# define GC_GWW_AVAILABLE() (GetWriteWatch_func != 0)
+
+ static void detect_GetWriteWatch(void)
+ {
+ static GC_bool done;
+ HMODULE hK32;
+ if (done)
+ return;
+
+# if defined(MPROTECT_VDB)
+ {
+ char * str = GETENV("GC_USE_GETWRITEWATCH");
+# if defined(GC_PREFER_MPROTECT_VDB)
+ if (str == NULL || (*str == '0' && *(str + 1) == '\0')) {
+ /* GC_USE_GETWRITEWATCH is unset or set to "0". */
+ done = TRUE; /* falling back to MPROTECT_VDB strategy. */
+ /* This should work as if GWW_VDB is undefined. */
+ return;
+ }
+# else
+ if (str != NULL && *str == '0' && *(str + 1) == '\0') {
+ /* GC_USE_GETWRITEWATCH is set "0". */
+ done = TRUE; /* falling back to MPROTECT_VDB strategy. */
+ return;
+ }
+# endif
+ }
+# endif
+
+# ifdef MSWINRT_FLAVOR
+ {
+ MEMORY_BASIC_INFORMATION memInfo;
+ SIZE_T result = VirtualQuery((void*)(word)GetProcAddress,
+ &memInfo, sizeof(memInfo));
+ if (result != sizeof(memInfo))
+ ABORT("Weird VirtualQuery result");
+ hK32 = (HMODULE)memInfo.AllocationBase;
+ }
+# else
+ hK32 = GetModuleHandle(TEXT("kernel32.dll"));
+# endif
+ if (hK32 != (HMODULE)0 &&
+ (GetWriteWatch_func = GetProcAddress(hK32, "GetWriteWatch")) != 0) {
+ /* Also check whether VirtualAlloc accepts MEM_WRITE_WATCH, */
+ /* as some versions of kernel32.dll have one but not the */
+ /* other, making the feature completely broken. */
+ void * page;
+
+ GC_ASSERT(GC_page_size != 0);
+ page = VirtualAlloc(NULL, GC_page_size, MEM_WRITE_WATCH | MEM_RESERVE,
+ PAGE_READWRITE);
+ if (page != NULL) {
+ PVOID pages[16];
+ GC_ULONG_PTR count = 16;
+ DWORD page_size;
+ /* Check that it actually works. In spite of some */
+ /* documentation it actually seems to exist on Win2K. */
+ /* This test may be unnecessary, but ... */
+ if ((*(GetWriteWatch_type)(word)GetWriteWatch_func)(
+ WRITE_WATCH_FLAG_RESET, page,
+ GC_page_size, pages, &count,
+ &page_size) != 0) {
+ /* GetWriteWatch always fails. */
+ GetWriteWatch_func = 0;
+ } else {
+ GetWriteWatch_alloc_flag = MEM_WRITE_WATCH;
+ }
+ VirtualFree(page, 0 /* dwSize */, MEM_RELEASE);
+ } else {
+ /* GetWriteWatch will be useless. */
+ GetWriteWatch_func = 0;
+ }
+ }
+ done = TRUE;
+ }
+
+# else
+# define GetWriteWatch_alloc_flag 0
+# endif /* !GWW_VDB */
+
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+
+# ifdef MSWIN32
+ /* Unfortunately, we have to handle win32s very differently from NT, */
+ /* Since VirtualQuery has very different semantics. In particular, */
+ /* under win32s a VirtualQuery call on an unmapped page returns an */
+ /* invalid result. Under NT, GC_register_data_segments is a no-op */
+ /* and all real work is done by GC_register_dynamic_libraries. Under */
+ /* win32s, we cannot find the data segments associated with dll's. */
+ /* We register the main data segment here. */
+ GC_INNER GC_bool GC_no_win32_dlls = FALSE;
+ /* This used to be set for gcc, to avoid dealing with */
+ /* the structured exception handling issues. But we now have */
+ /* assembly code to do that right. */
+
+ GC_INNER GC_bool GC_wnt = FALSE;
+ /* This is a Windows NT derivative, i.e. NT, Win2K, XP or later. */
+
+ GC_INNER void GC_init_win32(void)
+ {
+# if defined(_WIN64) || (defined(_MSC_VER) && _MSC_VER >= 1800)
+ /* MS Visual Studio 2013 deprecates GetVersion, but on the other */
+ /* hand it cannot be used to target pre-Win2K. */
+ GC_wnt = TRUE;
+# else
+ /* Set GC_wnt. If we're running under win32s, assume that no */
+ /* DLLs will be loaded. I doubt anyone still runs win32s, but... */
+ DWORD v = GetVersion();
+
+ GC_wnt = !(v & 0x80000000);
+ GC_no_win32_dlls |= ((!GC_wnt) && (v & 0xff) <= 3);
+# endif
+# ifdef USE_MUNMAP
+ if (GC_no_win32_dlls) {
+ /* Turn off unmapping for safety (since may not work well with */
+ /* GlobalAlloc). */
+ GC_unmap_threshold = 0;
+ }
+# endif
+ }
+
+ /* Return the smallest address a such that VirtualQuery */
+ /* returns correct results for all addresses between a and start. */
+ /* Assumes VirtualQuery returns correct information for start. */
+ STATIC ptr_t GC_least_described_address(ptr_t start)
+ {
+ MEMORY_BASIC_INFORMATION buf;
+ LPVOID limit = GC_sysinfo.lpMinimumApplicationAddress;
+ ptr_t p = (ptr_t)((word)start & ~(word)(GC_page_size-1));
+
+ GC_ASSERT(GC_page_size != 0);
+ for (;;) {
+ size_t result;
+ LPVOID q = (LPVOID)(p - GC_page_size);
+
+ if ((word)q > (word)p /* underflow */ || (word)q < (word)limit) break;
+ result = VirtualQuery(q, &buf, sizeof(buf));
+ if (result != sizeof(buf) || buf.AllocationBase == 0) break;
+ p = (ptr_t)(buf.AllocationBase);
+ }
+ return p;
+ }
+# endif /* MSWIN32 */
+
+# if defined(USE_WINALLOC) && !defined(REDIRECT_MALLOC)
+ /* We maintain a linked list of AllocationBase values that we know */
+ /* correspond to malloc heap sections. Currently this is only called */
+ /* during a GC. But there is some hope that for long running */
+ /* programs we will eventually see most heap sections. */
+
+ /* In the long run, it would be more reliable to occasionally walk */
+ /* the malloc heap with HeapWalk on the default heap. But that */
+ /* apparently works only for NT-based Windows. */
+
+ STATIC size_t GC_max_root_size = 100000; /* Appr. largest root size. */
+
+ /* In the long run, a better data structure would also be nice ... */
+ STATIC struct GC_malloc_heap_list {
+ void * allocation_base;
+ struct GC_malloc_heap_list *next;
+ } *GC_malloc_heap_l = 0;
+
+ /* Is p the base of one of the malloc heap sections we already know */
+ /* about? */
+ STATIC GC_bool GC_is_malloc_heap_base(void *p)
+ {
+ struct GC_malloc_heap_list *q = GC_malloc_heap_l;
+
+ while (0 != q) {
+ if (q -> allocation_base == p) return TRUE;
+ q = q -> next;
+ }
+ return FALSE;
+ }
+
+ STATIC void *GC_get_allocation_base(void *p)
+ {
+ MEMORY_BASIC_INFORMATION buf;
+ size_t result = VirtualQuery(p, &buf, sizeof(buf));
+ if (result != sizeof(buf)) {
+ ABORT("Weird VirtualQuery result");
+ }
+ return buf.AllocationBase;
+ }
+
+ GC_INNER void GC_add_current_malloc_heap(void)
+ {
+ struct GC_malloc_heap_list *new_l = (struct GC_malloc_heap_list *)
+ malloc(sizeof(struct GC_malloc_heap_list));
+ void *candidate;
+
+ if (NULL == new_l) return;
+ new_l -> allocation_base = NULL;
+ /* to suppress maybe-uninitialized gcc warning */
+
+ candidate = GC_get_allocation_base(new_l);
+ if (GC_is_malloc_heap_base(candidate)) {
+ /* Try a little harder to find malloc heap. */
+ size_t req_size = 10000;
+ do {
+ void *p = malloc(req_size);
+ if (0 == p) {
+ free(new_l);
+ return;
+ }
+ candidate = GC_get_allocation_base(p);
+ free(p);
+ req_size *= 2;
+ } while (GC_is_malloc_heap_base(candidate)
+ && req_size < GC_max_root_size/10 && req_size < 500000);
+ if (GC_is_malloc_heap_base(candidate)) {
+ free(new_l);
+ return;
+ }
+ }
+ GC_COND_LOG_PRINTF("Found new system malloc AllocationBase at %p\n",
+ candidate);
+ new_l -> allocation_base = candidate;
+ new_l -> next = GC_malloc_heap_l;
+ GC_malloc_heap_l = new_l;
+ }
+
+ /* Free all the linked list nodes. Could be invoked at process exit */
+ /* to avoid memory leak complains of a dynamic code analysis tool. */
+ STATIC void GC_free_malloc_heap_list(void)
+ {
+ struct GC_malloc_heap_list *q = GC_malloc_heap_l;
+
+ GC_malloc_heap_l = NULL;
+ while (q != NULL) {
+ struct GC_malloc_heap_list *next = q -> next;
+ free(q);
+ q = next;
+ }
+ }
+# endif /* USE_WINALLOC && !REDIRECT_MALLOC */
+
+ /* Is p the start of either the malloc heap, or of one of our */
+ /* heap sections? */
+ GC_INNER GC_bool GC_is_heap_base(void *p)
+ {
+ int i;
+
+# if defined(USE_WINALLOC) && !defined(REDIRECT_MALLOC)
+ if (GC_root_size > GC_max_root_size)
+ GC_max_root_size = GC_root_size;
+ if (GC_is_malloc_heap_base(p))
+ return TRUE;
+# endif
+ for (i = 0; i < (int)GC_n_heap_bases; i++) {
+ if (GC_heap_bases[i] == p) return TRUE;
+ }
+ return FALSE;
+ }
+
+#ifdef MSWIN32
+ STATIC void GC_register_root_section(ptr_t static_root)
+ {
+ MEMORY_BASIC_INFORMATION buf;
+ LPVOID p;
+ char * base;
+ char * limit;
+
+ if (!GC_no_win32_dlls) return;
+ p = base = limit = GC_least_described_address(static_root);
+ while ((word)p < (word)GC_sysinfo.lpMaximumApplicationAddress) {
+ size_t result = VirtualQuery(p, &buf, sizeof(buf));
+ DWORD protect;
+
+ if (result != sizeof(buf) || buf.AllocationBase == 0
+ || GC_is_heap_base(buf.AllocationBase)) break;
+ if ((word)p > GC_WORD_MAX - buf.RegionSize) break; /* overflow */
+ protect = buf.Protect;
+ if (buf.State == MEM_COMMIT
+ && is_writable(protect)) {
+ if ((char *)p != limit) {
+ if (base != limit) GC_add_roots_inner(base, limit, FALSE);
+ base = (char *)p;
+ }
+ limit = (char *)p + buf.RegionSize;
+ }
+ p = (char *)p + buf.RegionSize;
+ }
+ if (base != limit) GC_add_roots_inner(base, limit, FALSE);
+ }
+#endif /* MSWIN32 */
+
+ void GC_register_data_segments(void)
+ {
+# ifdef MSWIN32
+ GC_register_root_section((ptr_t)&GC_pages_executable);
+ /* any other GC global variable would fit too. */
+# endif
+ }
+
+# else /* !OS2 && !Windows */
+
+# if (defined(SVR4) || defined(AIX) || defined(DGUX) \
+ || (defined(LINUX) && defined(SPARC))) && !defined(PCR)
+ ptr_t GC_SysVGetDataStart(size_t max_page_size, ptr_t etext_addr)
+ {
+ word text_end = ((word)(etext_addr) + sizeof(word) - 1)
+ & ~(word)(sizeof(word) - 1);
+ /* etext rounded to word boundary */
+ word next_page = ((text_end + (word)max_page_size - 1)
+ & ~((word)max_page_size - 1));
+ word page_offset = (text_end & ((word)max_page_size - 1));
+ volatile ptr_t result = (char *)(next_page + page_offset);
+ /* Note that this isn't equivalent to just adding */
+ /* max_page_size to &etext if &etext is at a page boundary */
+
+ GC_setup_temporary_fault_handler();
+ if (SETJMP(GC_jmp_buf) == 0) {
+ /* Try writing to the address. */
+# ifdef AO_HAVE_fetch_and_add
+ volatile AO_t zero = 0;
+ (void)AO_fetch_and_add((volatile AO_t *)result, zero);
+# else
+ /* Fallback to non-atomic fetch-and-store. */
+ char v = *result;
+# if defined(CPPCHECK)
+ GC_noop1((word)&v);
+# endif
+ *result = v;
+# endif
+ GC_reset_fault_handler();
+ } else {
+ GC_reset_fault_handler();
+ /* We got here via a longjmp. The address is not readable. */
+ /* This is known to happen under Solaris 2.4 + gcc, which */
+ /* places string constants in the text segment, but after */
+ /* etext. Use plan B. Note that we now know there is a gap */
+ /* between text and data segments, so plan A brought us */
+ /* something. */
+ result = (char *)GC_find_limit(DATAEND, FALSE);
+ }
+ return (/* no volatile */ ptr_t)result;
+ }
+# endif
+
+#ifdef DATASTART_USES_BSDGETDATASTART
+/* It's unclear whether this should be identical to the above, or */
+/* whether it should apply to non-x86 architectures. */
+/* For now we don't assume that there is always an empty page after */
+/* etext. But in some cases there actually seems to be slightly more. */
+/* This also deals with holes between read-only data and writable data. */
+ GC_INNER ptr_t GC_FreeBSDGetDataStart(size_t max_page_size,
+ ptr_t etext_addr)
+ {
+ word text_end = ((word)(etext_addr) + sizeof(word) - 1)
+ & ~(word)(sizeof(word) - 1);
+ /* etext rounded to word boundary */
+ volatile word next_page = (text_end + (word)max_page_size - 1)
+ & ~((word)max_page_size - 1);
+ volatile ptr_t result = (ptr_t)text_end;
+ GC_setup_temporary_fault_handler();
+ if (SETJMP(GC_jmp_buf) == 0) {
+ /* Try reading at the address. */
+ /* This should happen before there is another thread. */
+ for (; next_page < (word)DATAEND; next_page += (word)max_page_size)
+ GC_noop1((word)(*(volatile unsigned char *)next_page));
+ GC_reset_fault_handler();
+ } else {
+ GC_reset_fault_handler();
+ /* As above, we go to plan B */
+ result = (ptr_t)GC_find_limit(DATAEND, FALSE);
+ }
+ return(result);
+ }
+#endif /* DATASTART_USES_BSDGETDATASTART */
+
+#ifdef AMIGA
+
+# define GC_AMIGA_DS
+# include "extra/AmigaOS.c"
+# undef GC_AMIGA_DS
+
+#elif defined(OPENBSD)
+
+/* Depending on arch alignment, there can be multiple holes */
+/* between DATASTART and DATAEND. Scan in DATASTART .. DATAEND */
+/* and register each region. */
+void GC_register_data_segments(void)
+{
+ ptr_t region_start = DATASTART;
+
+ if ((word)region_start - 1U >= (word)DATAEND)
+ ABORT_ARG2("Wrong DATASTART/END pair",
+ ": %p .. %p", (void *)region_start, (void *)DATAEND);
+ for (;;) {
+# ifdef GC_OPENBSD_UTHREADS
+ ptr_t region_end = GC_find_limit_openbsd(region_start, DATAEND);
+# else
+ ptr_t region_end = GC_find_limit_with_bound(region_start, TRUE, DATAEND);
+# endif
+
+ GC_add_roots_inner(region_start, region_end, FALSE);
+ if ((word)region_end >= (word)DATAEND)
+ break;
+ region_start = GC_skip_hole_openbsd(region_end, DATAEND);
+ }
+}
+
+# else /* !OS2 && !Windows && !AMIGA && !OPENBSD */
+
+# if !defined(PCR) && !defined(MACOS) && defined(REDIRECT_MALLOC) \
+ && defined(GC_SOLARIS_THREADS)
+ EXTERN_C_BEGIN
+ extern caddr_t sbrk(int);
+ EXTERN_C_END
+# endif
+
+ void GC_register_data_segments(void)
+ {
+# if !defined(DYNAMIC_LOADING) && defined(GC_DONT_REGISTER_MAIN_STATIC_DATA)
+ /* Avoid even referencing DATASTART and DATAEND as they are */
+ /* unnecessary and cause linker errors when bitcode is enabled. */
+ /* GC_register_data_segments() is not called anyway. */
+# elif !defined(PCR) && !defined(MACOS)
+# if defined(REDIRECT_MALLOC) && defined(GC_SOLARIS_THREADS)
+ /* As of Solaris 2.3, the Solaris threads implementation */
+ /* allocates the data structure for the initial thread with */
+ /* sbrk at process startup. It needs to be scanned, so that */
+ /* we don't lose some malloc allocated data structures */
+ /* hanging from it. We're on thin ice here ... */
+ GC_ASSERT(DATASTART);
+ {
+ ptr_t p = (ptr_t)sbrk(0);
+ if ((word)DATASTART < (word)p)
+ GC_add_roots_inner(DATASTART, p, FALSE);
+ }
+# else
+ if ((word)DATASTART - 1U >= (word)DATAEND) {
+ /* Subtract one to check also for NULL */
+ /* without a compiler warning. */
+ ABORT_ARG2("Wrong DATASTART/END pair",
+ ": %p .. %p", (void *)DATASTART, (void *)DATAEND);
+ }
+ GC_add_roots_inner(DATASTART, DATAEND, FALSE);
+# ifdef GC_HAVE_DATAREGION2
+ if ((word)DATASTART2 - 1U >= (word)DATAEND2)
+ ABORT_ARG2("Wrong DATASTART/END2 pair",
+ ": %p .. %p", (void *)DATASTART2, (void *)DATAEND2);
+ GC_add_roots_inner(DATASTART2, DATAEND2, FALSE);
+# endif
+# endif
+# endif
+# if defined(MACOS)
+ {
+# if defined(THINK_C)
+ extern void* GC_MacGetDataStart(void);
+ /* globals begin above stack and end at a5. */
+ GC_add_roots_inner((ptr_t)GC_MacGetDataStart(),
+ (ptr_t)LMGetCurrentA5(), FALSE);
+# else
+# if defined(__MWERKS__)
+# if !__POWERPC__
+ extern void* GC_MacGetDataStart(void);
+ /* MATTHEW: Function to handle Far Globals (CW Pro 3) */
+# if __option(far_data)
+ extern void* GC_MacGetDataEnd(void);
+# endif
+ /* globals begin above stack and end at a5. */
+ GC_add_roots_inner((ptr_t)GC_MacGetDataStart(),
+ (ptr_t)LMGetCurrentA5(), FALSE);
+ /* MATTHEW: Handle Far Globals */
+# if __option(far_data)
+ /* Far globals follow the QD globals: */
+ GC_add_roots_inner((ptr_t)LMGetCurrentA5(),
+ (ptr_t)GC_MacGetDataEnd(), FALSE);
+# endif
+# else
+ extern char __data_start__[], __data_end__[];
+ GC_add_roots_inner((ptr_t)&__data_start__,
+ (ptr_t)&__data_end__, FALSE);
+# endif /* __POWERPC__ */
+# endif /* __MWERKS__ */
+# endif /* !THINK_C */
+ }
+# endif /* MACOS */
+
+ /* Dynamic libraries are added at every collection, since they may */
+ /* change. */
+ }
+
+# endif /* !AMIGA */
+# endif /* !MSWIN32 && !MSWINCE */
+# endif /* !OS2 */
+
+/*
+ * Auxiliary routines for obtaining memory from OS.
+ */
+
+# if !defined(OS2) && !defined(PCR) && !defined(AMIGA) \
+ && !defined(USE_WINALLOC) && !defined(MACOS) && !defined(DOS4GW) \
+ && !defined(NINTENDO_SWITCH) && !defined(NONSTOP) \
+ && !defined(SN_TARGET_ORBIS) && !defined(SN_TARGET_PS3) \
+ && !defined(SN_TARGET_PSP2) && !defined(RTEMS) && !defined(__CC_ARM)
+
+# define SBRK_ARG_T ptrdiff_t
+
+#if defined(MMAP_SUPPORTED)
+
+#ifdef USE_MMAP_FIXED
+# define GC_MMAP_FLAGS MAP_FIXED | MAP_PRIVATE
+ /* Seems to yield better performance on Solaris 2, but can */
+ /* be unreliable if something is already mapped at the address. */
+#else
+# define GC_MMAP_FLAGS MAP_PRIVATE
+#endif
+
+#ifdef USE_MMAP_ANON
+# define zero_fd -1
+# if defined(MAP_ANONYMOUS) && !defined(CPPCHECK)
+# define OPT_MAP_ANON MAP_ANONYMOUS
+# else
+# define OPT_MAP_ANON MAP_ANON
+# endif
+#else
+ static int zero_fd = -1;
+# define OPT_MAP_ANON 0
+#endif
+
+# ifndef MSWIN_XBOX1
+# if defined(SYMBIAN) && !defined(USE_MMAP_ANON)
+ EXTERN_C_BEGIN
+ extern char *GC_get_private_path_and_zero_file(void);
+ EXTERN_C_END
+# endif
+
+ STATIC ptr_t GC_unix_mmap_get_mem(size_t bytes)
+ {
+ void *result;
+ static ptr_t last_addr = HEAP_START;
+
+# ifndef USE_MMAP_ANON
+ static GC_bool initialized = FALSE;
+
+ if (!EXPECT(initialized, TRUE)) {
+# ifdef SYMBIAN
+ char *path = GC_get_private_path_and_zero_file();
+ if (path != NULL) {
+ zero_fd = open(path, O_RDWR | O_CREAT, 0644);
+ free(path);
+ }
+# else
+ zero_fd = open("/dev/zero", O_RDONLY);
+# endif
+ if (zero_fd == -1)
+ ABORT("Could not open /dev/zero");
+ if (fcntl(zero_fd, F_SETFD, FD_CLOEXEC) == -1)
+ WARN("Could not set FD_CLOEXEC for /dev/zero\n", 0);
+
+ initialized = TRUE;
+ }
+# endif
+
+ GC_ASSERT(GC_page_size != 0);
+ if (bytes & (GC_page_size - 1)) ABORT("Bad GET_MEM arg");
+ result = mmap(last_addr, bytes, (PROT_READ | PROT_WRITE)
+ | (GC_pages_executable ? PROT_EXEC : 0),
+ GC_MMAP_FLAGS | OPT_MAP_ANON, zero_fd, 0/* offset */);
+# undef IGNORE_PAGES_EXECUTABLE
+
+ if (EXPECT(MAP_FAILED == result, FALSE)) {
+ if (HEAP_START == last_addr && GC_pages_executable
+ && (EACCES == errno || EPERM == errno))
+ ABORT("Cannot allocate executable pages");
+ return NULL;
+ }
+ last_addr = (ptr_t)(((word)result + bytes + GC_page_size - 1)
+ & ~(word)(GC_page_size - 1));
+# if !defined(LINUX)
+ if (last_addr == 0) {
+ /* Oops. We got the end of the address space. This isn't */
+ /* usable by arbitrary C code, since one-past-end pointers */
+ /* don't work, so we discard it and try again. */
+ munmap(result, ~GC_page_size - (size_t)result + 1);
+ /* Leave last page mapped, so we can't repeat. */
+ return GC_unix_mmap_get_mem(bytes);
+ }
+# else
+ GC_ASSERT(last_addr != 0);
+# endif
+ if (((word)result % HBLKSIZE) != 0)
+ ABORT(
+ "GC_unix_get_mem: Memory returned by mmap is not aligned to HBLKSIZE.");
+ return((ptr_t)result);
+ }
+# endif /* !MSWIN_XBOX1 */
+
+#endif /* MMAP_SUPPORTED */
+
+#if defined(USE_MMAP)
+ ptr_t GC_unix_get_mem(size_t bytes)
+ {
+ return GC_unix_mmap_get_mem(bytes);
+ }
+#else /* !USE_MMAP */
+
+STATIC ptr_t GC_unix_sbrk_get_mem(size_t bytes)
+{
+ ptr_t result;
+# ifdef IRIX5
+ /* Bare sbrk isn't thread safe. Play by malloc rules. */
+ /* The equivalent may be needed on other systems as well. */
+ __LOCK_MALLOC();
+# endif
+ {
+ ptr_t cur_brk = (ptr_t)sbrk(0);
+ SBRK_ARG_T lsbs = (word)cur_brk & (GC_page_size-1);
+
+ GC_ASSERT(GC_page_size != 0);
+ if ((SBRK_ARG_T)bytes < 0) {
+ result = 0; /* too big */
+ goto out;
+ }
+ if (lsbs != 0) {
+ if ((ptr_t)sbrk((SBRK_ARG_T)GC_page_size - lsbs) == (ptr_t)(-1)) {
+ result = 0;
+ goto out;
+ }
+ }
+# ifdef ADD_HEAP_GUARD_PAGES
+ /* This is useful for catching severe memory overwrite problems that */
+ /* span heap sections. It shouldn't otherwise be turned on. */
+ {
+ ptr_t guard = (ptr_t)sbrk((SBRK_ARG_T)GC_page_size);
+ if (mprotect(guard, GC_page_size, PROT_NONE) != 0)
+ ABORT("ADD_HEAP_GUARD_PAGES: mprotect failed");
+ }
+# endif /* ADD_HEAP_GUARD_PAGES */
+ result = (ptr_t)sbrk((SBRK_ARG_T)bytes);
+ if (result == (ptr_t)(-1)) result = 0;
+ }
+ out:
+# ifdef IRIX5
+ __UNLOCK_MALLOC();
+# endif
+ return(result);
+}
+
+ptr_t GC_unix_get_mem(size_t bytes)
+{
+# if defined(MMAP_SUPPORTED)
+ /* By default, we try both sbrk and mmap, in that order. */
+ static GC_bool sbrk_failed = FALSE;
+ ptr_t result = 0;
+
+ if (GC_pages_executable) {
+ /* If the allocated memory should have the execute permission */
+ /* then sbrk() cannot be used. */
+ return GC_unix_mmap_get_mem(bytes);
+ }
+ if (!sbrk_failed) result = GC_unix_sbrk_get_mem(bytes);
+ if (0 == result) {
+ sbrk_failed = TRUE;
+ result = GC_unix_mmap_get_mem(bytes);
+ }
+ if (0 == result) {
+ /* Try sbrk again, in case sbrk memory became available. */
+ result = GC_unix_sbrk_get_mem(bytes);
+ }
+ return result;
+# else /* !MMAP_SUPPORTED */
+ return GC_unix_sbrk_get_mem(bytes);
+# endif
+}
+
+#endif /* !USE_MMAP */
+
+# endif /* UN*X */
+
+# ifdef OS2
+
+void * os2_alloc(size_t bytes)
+{
+ void * result;
+
+ if (DosAllocMem(&result, bytes, (PAG_READ | PAG_WRITE | PAG_COMMIT)
+ | (GC_pages_executable ? PAG_EXECUTE : 0))
+ != NO_ERROR) {
+ return(0);
+ }
+ /* FIXME: What's the purpose of this recursion? (Probably, if */
+ /* DosAllocMem returns memory at 0 address then just retry once.) */
+ if (result == 0) return(os2_alloc(bytes));
+ return(result);
+}
+
+# endif /* OS2 */
+
+#ifdef MSWIN_XBOX1
+ ptr_t GC_durango_get_mem(size_t bytes)
+ {
+ if (0 == bytes) return NULL;
+ return (ptr_t)VirtualAlloc(NULL, bytes, MEM_COMMIT | MEM_TOP_DOWN,
+ PAGE_READWRITE);
+ }
+#elif defined(MSWINCE)
+ ptr_t GC_wince_get_mem(size_t bytes)
+ {
+ ptr_t result = 0; /* initialized to prevent warning. */
+ word i;
+
+ GC_ASSERT(GC_page_size != 0);
+ bytes = ROUNDUP_PAGESIZE(bytes);
+
+ /* Try to find reserved, uncommitted pages */
+ for (i = 0; i < GC_n_heap_bases; i++) {
+ if (((word)(-(signed_word)GC_heap_lengths[i])
+ & (GC_sysinfo.dwAllocationGranularity-1))
+ >= bytes) {
+ result = GC_heap_bases[i] + GC_heap_lengths[i];
+ break;
+ }
+ }
+
+ if (i == GC_n_heap_bases) {
+ /* Reserve more pages */
+ size_t res_bytes =
+ SIZET_SAT_ADD(bytes, (size_t)GC_sysinfo.dwAllocationGranularity-1)
+ & ~((size_t)GC_sysinfo.dwAllocationGranularity-1);
+ /* If we ever support MPROTECT_VDB here, we will probably need to */
+ /* ensure that res_bytes is strictly > bytes, so that VirtualProtect */
+ /* never spans regions. It seems to be OK for a VirtualFree */
+ /* argument to span regions, so we should be OK for now. */
+ result = (ptr_t) VirtualAlloc(NULL, res_bytes,
+ MEM_RESERVE | MEM_TOP_DOWN,
+ GC_pages_executable ? PAGE_EXECUTE_READWRITE :
+ PAGE_READWRITE);
+ if (HBLKDISPL(result) != 0) ABORT("Bad VirtualAlloc result");
+ /* If I read the documentation correctly, this can */
+ /* only happen if HBLKSIZE > 64 KB or not a power of 2. */
+ if (GC_n_heap_bases >= MAX_HEAP_SECTS) ABORT("Too many heap sections");
+ if (result == NULL) return NULL;
+ GC_heap_bases[GC_n_heap_bases] = result;
+ GC_heap_lengths[GC_n_heap_bases] = 0;
+ GC_n_heap_bases++;
+ }
+
+ /* Commit pages */
+ result = (ptr_t) VirtualAlloc(result, bytes, MEM_COMMIT,
+ GC_pages_executable ? PAGE_EXECUTE_READWRITE :
+ PAGE_READWRITE);
+# undef IGNORE_PAGES_EXECUTABLE
+
+ if (result != NULL) {
+ if (HBLKDISPL(result) != 0) ABORT("Bad VirtualAlloc result");
+ GC_heap_lengths[i] += bytes;
+ }
+
+ return(result);
+ }
+
+#elif defined(USE_WINALLOC) /* && !MSWIN_XBOX1 */ || defined(CYGWIN32)
+
+# ifdef USE_GLOBAL_ALLOC
+# define GLOBAL_ALLOC_TEST 1
+# else
+# define GLOBAL_ALLOC_TEST GC_no_win32_dlls
+# endif
+
+# if (defined(GC_USE_MEM_TOP_DOWN) && defined(USE_WINALLOC)) \
+ || defined(CPPCHECK)
+ DWORD GC_mem_top_down = MEM_TOP_DOWN;
+ /* Use GC_USE_MEM_TOP_DOWN for better 64-bit */
+ /* testing. Otherwise all addresses tend to */
+ /* end up in first 4 GB, hiding bugs. */
+# else
+# define GC_mem_top_down 0
+# endif /* !GC_USE_MEM_TOP_DOWN */
+
+ ptr_t GC_win32_get_mem(size_t bytes)
+ {
+ ptr_t result;
+
+# ifndef USE_WINALLOC
+ result = GC_unix_get_mem(bytes);
+# else
+# if defined(MSWIN32) && !defined(MSWINRT_FLAVOR)
+ if (GLOBAL_ALLOC_TEST) {
+ /* VirtualAlloc doesn't like PAGE_EXECUTE_READWRITE. */
+ /* There are also unconfirmed rumors of other */
+ /* problems, so we dodge the issue. */
+ result = (ptr_t)GlobalAlloc(0, SIZET_SAT_ADD(bytes, HBLKSIZE));
+ /* Align it at HBLKSIZE boundary. */
+ result = (ptr_t)(((word)result + HBLKSIZE - 1)
+ & ~(word)(HBLKSIZE - 1));
+ } else
+# endif
+ /* else */ {
+ /* VirtualProtect only works on regions returned by a */
+ /* single VirtualAlloc call. Thus we allocate one */
+ /* extra page, which will prevent merging of blocks */
+ /* in separate regions, and eliminate any temptation */
+ /* to call VirtualProtect on a range spanning regions. */
+ /* This wastes a small amount of memory, and risks */
+ /* increased fragmentation. But better alternatives */
+ /* would require effort. */
+# ifdef MPROTECT_VDB
+ /* We can't check for GC_incremental here (because */
+ /* GC_enable_incremental() might be called some time */
+ /* later after the GC initialization). */
+# ifdef GWW_VDB
+# define VIRTUAL_ALLOC_PAD (GC_GWW_AVAILABLE() ? 0 : 1)
+# else
+# define VIRTUAL_ALLOC_PAD 1
+# endif
+# else
+# define VIRTUAL_ALLOC_PAD 0
+# endif
+ /* Pass the MEM_WRITE_WATCH only if GetWriteWatch-based */
+ /* VDBs are enabled and the GetWriteWatch function is */
+ /* available. Otherwise we waste resources or possibly */
+ /* cause VirtualAlloc to fail (observed in Windows 2000 */
+ /* SP2). */
+ result = (ptr_t) VirtualAlloc(NULL,
+ SIZET_SAT_ADD(bytes, VIRTUAL_ALLOC_PAD),
+ GetWriteWatch_alloc_flag
+ | (MEM_COMMIT | MEM_RESERVE)
+ | GC_mem_top_down,
+ GC_pages_executable ? PAGE_EXECUTE_READWRITE :
+ PAGE_READWRITE);
+# undef IGNORE_PAGES_EXECUTABLE
+ }
+# endif /* USE_WINALLOC */
+ if (HBLKDISPL(result) != 0) ABORT("Bad VirtualAlloc result");
+ /* If I read the documentation correctly, this can */
+ /* only happen if HBLKSIZE > 64 KB or not a power of 2. */
+ if (GC_n_heap_bases >= MAX_HEAP_SECTS) ABORT("Too many heap sections");
+ if (0 != result) GC_heap_bases[GC_n_heap_bases++] = result;
+ return(result);
+ }
+#endif /* USE_WINALLOC || CYGWIN32 */
+
+#if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32) \
+ || defined(MSWIN_XBOX1)
+ GC_API void GC_CALL GC_win32_free_heap(void)
+ {
+# if defined(USE_WINALLOC) && !defined(REDIRECT_MALLOC) \
+ && !defined(MSWIN_XBOX1)
+ GC_free_malloc_heap_list();
+# endif
+# if (defined(USE_WINALLOC) && !defined(MSWIN_XBOX1) \
+ && !defined(MSWINCE)) || defined(CYGWIN32)
+# ifndef MSWINRT_FLAVOR
+# ifndef CYGWIN32
+ if (GLOBAL_ALLOC_TEST)
+# endif
+ {
+ while (GC_n_heap_bases-- > 0) {
+# ifdef CYGWIN32
+ /* FIXME: Is it OK to use non-GC free() here? */
+# else
+ GlobalFree(GC_heap_bases[GC_n_heap_bases]);
+# endif
+ GC_heap_bases[GC_n_heap_bases] = 0;
+ }
+ return;
+ }
+# endif /* !MSWINRT_FLAVOR */
+# ifndef CYGWIN32
+ /* Avoiding VirtualAlloc leak. */
+ while (GC_n_heap_bases > 0) {
+ VirtualFree(GC_heap_bases[--GC_n_heap_bases], 0, MEM_RELEASE);
+ GC_heap_bases[GC_n_heap_bases] = 0;
+ }
+# endif
+# endif /* USE_WINALLOC || CYGWIN32 */
+ }
+#endif /* Windows */
+
+#ifdef AMIGA
+# define GC_AMIGA_AM
+# include "extra/AmigaOS.c"
+# undef GC_AMIGA_AM
+#endif
+
+#if defined(HAIKU)
+# include <stdlib.h>
+ ptr_t GC_haiku_get_mem(size_t bytes)
+ {
+ void* mem;
+
+ GC_ASSERT(GC_page_size != 0);
+ if (posix_memalign(&mem, GC_page_size, bytes) == 0)
+ return mem;
+ return NULL;
+ }
+#endif /* HAIKU */
+
+#if (defined(USE_MUNMAP) || defined(MPROTECT_VDB)) && !defined(USE_WINALLOC)
+# define ABORT_ON_REMAP_FAIL(C_msg_prefix, start_addr, len) \
+ ABORT_ARG3(C_msg_prefix " failed", \
+ " at %p (length %lu), errno= %d", \
+ (void *)(start_addr), (unsigned long)(len), errno)
+#endif
+
+#ifdef USE_MUNMAP
+
+/* For now, this only works on Win32/WinCE and some Unix-like */
+/* systems. If you have something else, don't define */
+/* USE_MUNMAP. */
+
+#if !defined(NN_PLATFORM_CTR) && !defined(MSWIN32) && !defined(MSWINCE) \
+ && !defined(MSWIN_XBOX1)
+# include <unistd.h>
+# ifdef SN_TARGET_PS3
+# include <sys/memory.h>
+# else
+# include <sys/mman.h>
+# endif
+# include <sys/stat.h>
+# include <sys/types.h>
+#endif
+
+/* Compute a page aligned starting address for the unmap */
+/* operation on a block of size bytes starting at start. */
+/* Return 0 if the block is too small to make this feasible. */
+STATIC ptr_t GC_unmap_start(ptr_t start, size_t bytes)
+{
+ ptr_t result = (ptr_t)(((word)start + GC_page_size - 1)
+ & ~(word)(GC_page_size - 1));
+
+ GC_ASSERT(GC_page_size != 0);
+ if ((word)(result + GC_page_size) > (word)(start + bytes)) return 0;
+ return result;
+}
+
+/* Under Win32/WinCE we commit (map) and decommit (unmap) */
+/* memory using VirtualAlloc and VirtualFree. These functions */
+/* work on individual allocations of virtual memory, made */
+/* previously using VirtualAlloc with the MEM_RESERVE flag. */
+/* The ranges we need to (de)commit may span several of these */
+/* allocations; therefore we use VirtualQuery to check */
+/* allocation lengths, and split up the range as necessary. */
+
+/* We assume that GC_remap is called on exactly the same range */
+/* as a previous call to GC_unmap. It is safe to consistently */
+/* round the endpoints in both places. */
+
+static void block_unmap_inner(ptr_t start_addr, size_t len)
+{
+ if (0 == start_addr) return;
+
+# ifdef USE_WINALLOC
+ while (len != 0) {
+ MEMORY_BASIC_INFORMATION mem_info;
+ word free_len;
+
+ if (VirtualQuery(start_addr, &mem_info, sizeof(mem_info))
+ != sizeof(mem_info))
+ ABORT("Weird VirtualQuery result");
+ free_len = (len < mem_info.RegionSize) ? len : mem_info.RegionSize;
+ if (!VirtualFree(start_addr, free_len, MEM_DECOMMIT))
+ ABORT("VirtualFree failed");
+ GC_unmapped_bytes += free_len;
+ start_addr += free_len;
+ len -= free_len;
+ }
+# else
+ /* We immediately remap it to prevent an intervening mmap from */
+ /* accidentally grabbing the same address space. */
+ if (len != 0) {
+# ifdef SN_TARGET_PS3
+ ps3_free_mem(start_addr, len);
+# elif defined(AIX) || defined(CYGWIN32) || defined(HAIKU) \
+ || (defined(LINUX) && !defined(PREFER_MMAP_PROT_NONE)) \
+ || defined(HPUX)
+ /* On AIX, mmap(PROT_NONE) fails with ENOMEM unless the */
+ /* environment variable XPG_SUS_ENV is set to ON. */
+ /* On Cygwin, calling mmap() with the new protection flags on */
+ /* an existing memory map with MAP_FIXED is broken. */
+ /* However, calling mprotect() on the given address range */
+ /* with PROT_NONE seems to work fine. */
+ /* On Linux, low RLIMIT_AS value may lead to mmap failure. */
+# if defined(LINUX) && !defined(FORCE_MPROTECT_BEFORE_MADVISE)
+ /* On Linux, at least, madvise() should be sufficient. */
+# else
+ if (mprotect(start_addr, len, PROT_NONE))
+ ABORT_ON_REMAP_FAIL("unmap: mprotect", start_addr, len);
+# endif
+# if !defined(CYGWIN32)
+ /* On Linux (and some other platforms probably), */
+ /* mprotect(PROT_NONE) is just disabling access to */
+ /* the pages but not returning them to OS. */
+ if (madvise(start_addr, len, MADV_DONTNEED) == -1)
+ ABORT_ON_REMAP_FAIL("unmap: madvise", start_addr, len);
+# endif
+# elif defined(EMSCRIPTEN)
+ /* Nothing to do, mmap(PROT_NONE) is not supported and */
+ /* mprotect() is just a no-op. */
+# else
+ void * result = mmap(start_addr, len, PROT_NONE,
+ MAP_PRIVATE | MAP_FIXED | OPT_MAP_ANON,
+ zero_fd, 0/* offset */);
+
+ if (EXPECT(MAP_FAILED == result, FALSE))
+ ABORT_ON_REMAP_FAIL("unmap: mmap", start_addr, len);
+ if (result != (void *)start_addr)
+ ABORT("unmap: mmap() result differs from start_addr");
+# if defined(CPPCHECK) || defined(LINT2)
+ /* Explicitly store the resource handle to a global variable. */
+ GC_noop1((word)result);
+# endif
+# endif
+ GC_unmapped_bytes += len;
+ }
+# endif
+}
+
+GC_INNER void GC_unmap(ptr_t start, size_t bytes)
+{
+ ptr_t start_addr = GC_unmap_start(start, bytes);
+ ptr_t end_addr = GC_unmap_end(start, bytes);
+
+ block_unmap_inner(start_addr, (size_t)(end_addr - start_addr));
+}
+
+GC_INNER void GC_remap(ptr_t start, size_t bytes)
+{
+ ptr_t start_addr = GC_unmap_start(start, bytes);
+ ptr_t end_addr = GC_unmap_end(start, bytes);
+ word len = end_addr - start_addr;
+ if (0 == start_addr) return;
+
+ /* FIXME: Handle out-of-memory correctly (at least for Win32) */
+# ifdef USE_WINALLOC
+ while (len != 0) {
+ MEMORY_BASIC_INFORMATION mem_info;
+ word alloc_len;
+ ptr_t result;
+
+ if (VirtualQuery(start_addr, &mem_info, sizeof(mem_info))
+ != sizeof(mem_info))
+ ABORT("Weird VirtualQuery result");
+ alloc_len = (len < mem_info.RegionSize) ? len : mem_info.RegionSize;
+ result = (ptr_t)VirtualAlloc(start_addr, alloc_len, MEM_COMMIT,
+ GC_pages_executable
+ ? PAGE_EXECUTE_READWRITE
+ : PAGE_READWRITE);
+ if (result != start_addr) {
+ if (GetLastError() == ERROR_NOT_ENOUGH_MEMORY ||
+ GetLastError() == ERROR_OUTOFMEMORY) {
+ ABORT("Not enough memory to process remapping");
+ } else {
+ ABORT("VirtualAlloc remapping failed");
+ }
+ }
+# ifdef LINT2
+ GC_noop1((word)result);
+# endif
+ GC_unmapped_bytes -= alloc_len;
+ start_addr += alloc_len;
+ len -= alloc_len;
+ }
+# undef IGNORE_PAGES_EXECUTABLE
+# else
+ /* It was already remapped with PROT_NONE. */
+ {
+# if !defined(SN_TARGET_PS3) && !defined(FORCE_MPROTECT_BEFORE_MADVISE) \
+ && defined(LINUX) && !defined(PREFER_MMAP_PROT_NONE)
+ /* Nothing to unprotect as madvise() is just a hint. */
+# elif defined(NACL) || defined(NETBSD)
+ /* NaCl does not expose mprotect, but mmap should work fine. */
+ /* In case of NetBSD, mprotect fails (unlike mmap) even */
+ /* without PROT_EXEC if PaX MPROTECT feature is enabled. */
+ void *result = mmap(start_addr, len, (PROT_READ | PROT_WRITE)
+ | (GC_pages_executable ? PROT_EXEC : 0),
+ MAP_PRIVATE | MAP_FIXED | OPT_MAP_ANON,
+ zero_fd, 0 /* offset */);
+ if (EXPECT(MAP_FAILED == result, FALSE))
+ ABORT_ON_REMAP_FAIL("remap: mmap", start_addr, len);
+ if (result != (void *)start_addr)
+ ABORT("remap: mmap() result differs from start_addr");
+# if defined(CPPCHECK) || defined(LINT2)
+ GC_noop1((word)result);
+# endif
+# undef IGNORE_PAGES_EXECUTABLE
+# else
+ if (mprotect(start_addr, len, (PROT_READ | PROT_WRITE)
+ | (GC_pages_executable ? PROT_EXEC : 0)))
+ ABORT_ON_REMAP_FAIL("remap: mprotect", start_addr, len);
+# undef IGNORE_PAGES_EXECUTABLE
+# endif /* !NACL */
+ }
+ GC_unmapped_bytes -= len;
+# endif
+}
+
+/* Two adjacent blocks have already been unmapped and are about to */
+/* be merged. Unmap the whole block. This typically requires */
+/* that we unmap a small section in the middle that was not previously */
+/* unmapped due to alignment constraints. */
+GC_INNER void GC_unmap_gap(ptr_t start1, size_t bytes1, ptr_t start2,
+ size_t bytes2)
+{
+ ptr_t start1_addr = GC_unmap_start(start1, bytes1);
+ ptr_t end1_addr = GC_unmap_end(start1, bytes1);
+ ptr_t start2_addr = GC_unmap_start(start2, bytes2);
+ ptr_t start_addr = end1_addr;
+ ptr_t end_addr = start2_addr;
+
+ GC_ASSERT(start1 + bytes1 == start2);
+ if (0 == start1_addr) start_addr = GC_unmap_start(start1, bytes1 + bytes2);
+ if (0 == start2_addr) end_addr = GC_unmap_end(start1, bytes1 + bytes2);
+ block_unmap_inner(start_addr, (size_t)(end_addr - start_addr));
+}
+
+#endif /* USE_MUNMAP */
+
+/* Routine for pushing any additional roots. In THREADS */
+/* environment, this is also responsible for marking from */
+/* thread stacks. */
+#ifndef THREADS
+
+# if defined(EMSCRIPTEN) && defined(EMSCRIPTEN_ASYNCIFY)
+# include <emscripten.h>
+
+ static void scan_regs_cb(void *begin, void *end)
+ {
+ GC_push_all_stack((ptr_t)begin, (ptr_t)end);
+ }
+
+ STATIC void GC_CALLBACK GC_default_push_other_roots(void)
+ {
+ /* Note: this needs -sASYNCIFY linker flag. */
+ emscripten_scan_registers(scan_regs_cb);
+ }
+
+# else
+# define GC_default_push_other_roots 0
+# endif
+
+#else /* THREADS */
+
+# ifdef PCR
+PCR_ERes GC_push_thread_stack(PCR_Th_T *t, PCR_Any dummy)
+{
+ struct PCR_ThCtl_TInfoRep info;
+ PCR_ERes result;
+
+ info.ti_stkLow = info.ti_stkHi = 0;
+ result = PCR_ThCtl_GetInfo(t, &info);
+ GC_push_all_stack((ptr_t)(info.ti_stkLow), (ptr_t)(info.ti_stkHi));
+ return(result);
+}
+
+/* Push the contents of an old object. We treat this as stack */
+/* data only because that makes it robust against mark stack */
+/* overflow. */
+PCR_ERes GC_push_old_obj(void *p, size_t size, PCR_Any data)
+{
+ GC_push_all_stack((ptr_t)p, (ptr_t)p + size);
+ return(PCR_ERes_okay);
+}
+
+extern struct PCR_MM_ProcsRep * GC_old_allocator;
+ /* defined in pcr_interface.c. */
+
+STATIC void GC_CALLBACK GC_default_push_other_roots(void)
+{
+ /* Traverse data allocated by previous memory managers. */
+ if ((*(GC_old_allocator->mmp_enumerate))(PCR_Bool_false,
+ GC_push_old_obj, 0)
+ != PCR_ERes_okay) {
+ ABORT("Old object enumeration failed");
+ }
+ /* Traverse all thread stacks. */
+ if (PCR_ERes_IsErr(
+ PCR_ThCtl_ApplyToAllOtherThreads(GC_push_thread_stack,0))
+ || PCR_ERes_IsErr(GC_push_thread_stack(PCR_Th_CurrThread(), 0))) {
+ ABORT("Thread stack marking failed");
+ }
+}
+
+# elif defined(SN_TARGET_PS3)
+ STATIC void GC_CALLBACK GC_default_push_other_roots(void)
+ {
+ ABORT("GC_default_push_other_roots is not implemented");
+ }
+
+ void GC_push_thread_structures(void)
+ {
+ ABORT("GC_push_thread_structures is not implemented");
+ }
+
+# else /* GC_PTHREADS, or GC_WIN32_THREADS, etc. */
+ STATIC void GC_CALLBACK GC_default_push_other_roots(void)
+ {
+ GC_push_all_stacks();
+ }
+# endif
+
+#endif /* THREADS */
+
+GC_push_other_roots_proc GC_push_other_roots = GC_default_push_other_roots;
+
+GC_API void GC_CALL GC_set_push_other_roots(GC_push_other_roots_proc fn)
+{
+ GC_push_other_roots = fn;
+}
+
+GC_API GC_push_other_roots_proc GC_CALL GC_get_push_other_roots(void)
+{
+ return GC_push_other_roots;
+}
+
+#if defined(SOFT_VDB) && !defined(NO_SOFT_VDB_LINUX_VER_RUNTIME_CHECK) \
+ || (defined(GLIBC_2_19_TSX_BUG) && defined(PARALLEL_MARK))
+ GC_INNER int GC_parse_version(int *pminor, const char *pverstr) {
+ char *endp;
+ unsigned long value = strtoul(pverstr, &endp, 10);
+ int major = (int)value;
+
+ if (major < 0 || (char *)pverstr == endp || (unsigned)major != value) {
+ /* Parse error. */
+ return -1;
+ }
+ if (*endp != '.') {
+ /* No minor part. */
+ *pminor = -1;
+ } else {
+ value = strtoul(endp + 1, &endp, 10);
+ *pminor = (int)value;
+ if (*pminor < 0 || (unsigned)(*pminor) != value) {
+ return -1;
+ }
+ }
+ return major;
+ }
+#endif
+
+/*
+ * Routines for accessing dirty bits on virtual pages.
+ * There are six ways to maintain this information:
+ * DEFAULT_VDB: A simple dummy implementation that treats every page
+ * as possibly dirty. This makes incremental collection
+ * useless, but the implementation is still correct.
+ * Manual VDB: Stacks and static data are always considered dirty.
+ * Heap pages are considered dirty if GC_dirty(p) has been
+ * called on some pointer p pointing to somewhere inside
+ * an object on that page. A GC_dirty() call on a large
+ * object directly dirties only a single page, but for the
+ * manual VDB we are careful to treat an object with a dirty
+ * page as completely dirty.
+ * In order to avoid races, an object must be marked dirty
+ * after it is written, and a reference to the object
+ * must be kept on a stack or in a register in the interim.
+ * With threads enabled, an object directly reachable from the
+ * stack at the time of a collection is treated as dirty.
+ * In single-threaded mode, it suffices to ensure that no
+ * collection can take place between the pointer assignment
+ * and the GC_dirty() call.
+ * PCR_VDB: Use PPCRs virtual dirty bit facility.
+ * PROC_VDB: Use the /proc facility for reading dirty bits. Only
+ * works under some SVR4 variants. Even then, it may be
+ * too slow to be entirely satisfactory. Requires reading
+ * dirty bits for entire address space. Implementations tend
+ * to assume that the client is a (slow) debugger.
+ * SOFT_VDB: Use the /proc facility for reading soft-dirty PTEs.
+ * Works on Linux 3.18+ if the kernel is properly configured.
+ * The proposed implementation iterates over GC_heap_sects and
+ * GC_static_roots examining the soft-dirty bit of the words
+ * in /proc/self/pagemap corresponding to the pages of the
+ * sections; finally all soft-dirty bits of the process are
+ * cleared (by writing some special value to
+ * /proc/self/clear_refs file). In case the soft-dirty bit is
+ * not supported by the kernel, MPROTECT_VDB may be defined as
+ * a fallback strategy.
+ * MPROTECT_VDB:Protect pages and then catch the faults to keep track of
+ * dirtied pages. The implementation (and implementability)
+ * is highly system dependent. This usually fails when system
+ * calls write to a protected page. We prevent the read system
+ * call from doing so. It is the clients responsibility to
+ * make sure that other system calls are similarly protected
+ * or write only to the stack.
+ * GWW_VDB: Use the Win32 GetWriteWatch functions, if available, to
+ * read dirty bits. In case it is not available (because we
+ * are running on Windows 95, Windows 2000 or earlier),
+ * MPROTECT_VDB may be defined as a fallback strategy.
+ */
+
+#if (defined(CHECKSUMS) && (defined(GWW_VDB) || defined(SOFT_VDB))) \
+ || defined(PROC_VDB)
+ /* Add all pages in pht2 to pht1. */
+ STATIC void GC_or_pages(page_hash_table pht1, page_hash_table pht2)
+ {
+ unsigned i;
+ for (i = 0; i < PHT_SIZE; i++) pht1[i] |= pht2[i];
+ }
+#endif /* CHECKSUMS && (GWW_VDB || SOFT_VDB) || PROC_VDB */
+
+#ifdef GWW_VDB
+
+# define GC_GWW_BUF_LEN (MAXHINCR * HBLKSIZE / 4096 /* x86 page size */)
+ /* Still susceptible to overflow, if there are very large allocations, */
+ /* and everything is dirty. */
+ static PVOID gww_buf[GC_GWW_BUF_LEN];
+
+# ifndef MPROTECT_VDB
+# define GC_gww_dirty_init GC_dirty_init
+# endif
+
+ GC_INNER GC_bool GC_gww_dirty_init(void)
+ {
+ detect_GetWriteWatch();
+ return GC_GWW_AVAILABLE();
+ }
+
+ GC_INLINE void GC_gww_read_dirty(GC_bool output_unneeded)
+ {
+ word i;
+
+ if (!output_unneeded)
+ BZERO(GC_grungy_pages, sizeof(GC_grungy_pages));
+
+ for (i = 0; i != GC_n_heap_sects; ++i) {
+ GC_ULONG_PTR count;
+
+ do {
+ PVOID * pages = gww_buf;
+ DWORD page_size;
+
+ count = GC_GWW_BUF_LEN;
+ /* GetWriteWatch is documented as returning non-zero when it */
+ /* fails, but the documentation doesn't explicitly say why it */
+ /* would fail or what its behavior will be if it fails. It */
+ /* does appear to fail, at least on recent Win2K instances, if */
+ /* the underlying memory was not allocated with the appropriate */
+ /* flag. This is common if GC_enable_incremental is called */
+ /* shortly after GC initialization. To avoid modifying the */
+ /* interface, we silently work around such a failure, it only */
+ /* affects the initial (small) heap allocation. If there are */
+ /* more dirty pages than will fit in the buffer, this is not */
+ /* treated as a failure; we must check the page count in the */
+ /* loop condition. Since each partial call will reset the */
+ /* status of some pages, this should eventually terminate even */
+ /* in the overflow case. */
+ if ((*(GetWriteWatch_type)(word)GetWriteWatch_func)(
+ WRITE_WATCH_FLAG_RESET,
+ GC_heap_sects[i].hs_start,
+ GC_heap_sects[i].hs_bytes,
+ pages, &count, &page_size) != 0) {
+ static int warn_count = 0;
+ struct hblk * start = (struct hblk *)GC_heap_sects[i].hs_start;
+ static struct hblk *last_warned = 0;
+ size_t nblocks = divHBLKSZ(GC_heap_sects[i].hs_bytes);
+
+ if (i != 0 && last_warned != start && warn_count++ < 5) {
+ last_warned = start;
+ WARN("GC_gww_read_dirty unexpectedly failed at %p: "
+ "Falling back to marking all pages dirty\n", start);
+ }
+ if (!output_unneeded) {
+ unsigned j;
+
+ for (j = 0; j < nblocks; ++j) {
+ word hash = PHT_HASH(start + j);
+ set_pht_entry_from_index(GC_grungy_pages, hash);
+ }
+ }
+ count = 1; /* Done with this section. */
+ } else /* succeeded */ if (!output_unneeded) {
+ PVOID * pages_end = pages + count;
+
+ while (pages != pages_end) {
+ struct hblk * h = (struct hblk *) *pages++;
+ struct hblk * h_end = (struct hblk *) ((char *) h + page_size);
+ do {
+ set_pht_entry_from_index(GC_grungy_pages, PHT_HASH(h));
+ } while ((word)(++h) < (word)h_end);
+ }
+ }
+ } while (count == GC_GWW_BUF_LEN);
+ /* FIXME: It's unclear from Microsoft's documentation if this loop */
+ /* is useful. We suspect the call just fails if the buffer fills */
+ /* up. But that should still be handled correctly. */
+ }
+
+# ifdef CHECKSUMS
+ GC_ASSERT(!output_unneeded);
+ GC_or_pages(GC_written_pages, GC_grungy_pages);
+# endif
+ }
+
+#elif defined(SOFT_VDB)
+ static int clear_refs_fd = -1;
+# define GC_GWW_AVAILABLE() (clear_refs_fd != -1)
+#else
+# define GC_GWW_AVAILABLE() FALSE
+#endif /* !GWW_VDB && !SOFT_VDB */
+
+#ifdef DEFAULT_VDB
+ /* All of the following assume the allocation lock is held. */
+
+ /* The client asserts that unallocated pages in the heap are never */
+ /* written. */
+
+ /* Initialize virtual dirty bit implementation. */
+ GC_INNER GC_bool GC_dirty_init(void)
+ {
+ GC_VERBOSE_LOG_PRINTF("Initializing DEFAULT_VDB...\n");
+ /* GC_dirty_pages and GC_grungy_pages are already cleared. */
+ return TRUE;
+ }
+#endif /* DEFAULT_VDB */
+
+#ifndef GC_DISABLE_INCREMENTAL
+# if !defined(THREADS) || defined(HAVE_LOCKFREE_AO_OR)
+# define async_set_pht_entry_from_index(db, index) \
+ set_pht_entry_from_index_concurrent(db, index)
+# elif defined(AO_HAVE_test_and_set_acquire)
+ /* We need to lock around the bitmap update (in the write fault */
+ /* handler or GC_dirty) in order to avoid the risk of losing a bit. */
+ /* We do this with a test-and-set spin lock if possible. */
+ GC_INNER volatile AO_TS_t GC_fault_handler_lock = AO_TS_INITIALIZER;
+
+ static void async_set_pht_entry_from_index(volatile page_hash_table db,
+ size_t index)
+ {
+ GC_acquire_dirty_lock();
+ set_pht_entry_from_index(db, index);
+ GC_release_dirty_lock();
+ }
+# else
+# error No test_and_set operation: Introduces a race.
+# endif /* THREADS && !AO_HAVE_test_and_set_acquire */
+#endif /* !GC_DISABLE_INCREMENTAL */
+
+#ifdef MPROTECT_VDB
+ /*
+ * This implementation maintains dirty bits itself by catching write
+ * faults and keeping track of them. We assume nobody else catches
+ * SIGBUS or SIGSEGV. We assume no write faults occur in system calls.
+ * This means that clients must ensure that system calls don't write
+ * to the write-protected heap. Probably the best way to do this is to
+ * ensure that system calls write at most to pointer-free objects in the
+ * heap, and do even that only if we are on a platform on which those
+ * are not protected.
+ * We assume the page size is a multiple of HBLKSIZE.
+ * We prefer them to be the same. We avoid protecting pointer-free
+ * objects only if they are the same.
+ */
+# ifdef DARWIN
+ /* Using vm_protect (mach syscall) over mprotect (BSD syscall) seems to
+ decrease the likelihood of some of the problems described below. */
+# include <mach/vm_map.h>
+ STATIC mach_port_t GC_task_self = 0;
+# define PROTECT_INNER(addr, len, allow_write, C_msg_prefix) \
+ if (vm_protect(GC_task_self, (vm_address_t)(addr), (vm_size_t)(len), \
+ FALSE, VM_PROT_READ \
+ | ((allow_write) ? VM_PROT_WRITE : 0) \
+ | (GC_pages_executable ? VM_PROT_EXECUTE : 0)) \
+ == KERN_SUCCESS) {} else ABORT(C_msg_prefix \
+ "vm_protect() failed")
+
+# elif !defined(USE_WINALLOC)
+# include <sys/mman.h>
+# include <signal.h>
+# if !defined(CYGWIN32) && !defined(HAIKU)
+# include <sys/syscall.h>
+# endif
+
+# define PROTECT_INNER(addr, len, allow_write, C_msg_prefix) \
+ if (mprotect((caddr_t)(addr), (size_t)(len), \
+ PROT_READ | ((allow_write) ? PROT_WRITE : 0) \
+ | (GC_pages_executable ? PROT_EXEC : 0)) >= 0) { \
+ } else if (GC_pages_executable) { \
+ ABORT_ON_REMAP_FAIL(C_msg_prefix \
+ "mprotect vdb executable pages", \
+ addr, len); \
+ } else ABORT_ON_REMAP_FAIL(C_msg_prefix "mprotect vdb", addr, len)
+# undef IGNORE_PAGES_EXECUTABLE
+
+# else /* USE_WINALLOC */
+# ifndef MSWINCE
+# include <signal.h>
+# endif
+
+ static DWORD protect_junk;
+# define PROTECT_INNER(addr, len, allow_write, C_msg_prefix) \
+ if (VirtualProtect(addr, len, \
+ GC_pages_executable ? \
+ ((allow_write) ? PAGE_EXECUTE_READWRITE : \
+ PAGE_EXECUTE_READ) : \
+ (allow_write) ? PAGE_READWRITE : \
+ PAGE_READONLY, \
+ &protect_junk)) { \
+ } else ABORT_ARG1(C_msg_prefix "VirtualProtect failed", \
+ ": errcode= 0x%X", (unsigned)GetLastError())
+# endif /* USE_WINALLOC */
+
+# define PROTECT(addr, len) PROTECT_INNER(addr, len, FALSE, "")
+# define UNPROTECT(addr, len) PROTECT_INNER(addr, len, TRUE, "un-")
+
+# if defined(MSWIN32)
+ typedef LPTOP_LEVEL_EXCEPTION_FILTER SIG_HNDLR_PTR;
+# undef SIG_DFL
+# define SIG_DFL (LPTOP_LEVEL_EXCEPTION_FILTER)((signed_word)-1)
+# elif defined(MSWINCE)
+ typedef LONG (WINAPI *SIG_HNDLR_PTR)(struct _EXCEPTION_POINTERS *);
+# undef SIG_DFL
+# define SIG_DFL (SIG_HNDLR_PTR) (-1)
+# elif defined(DARWIN)
+ typedef void (* SIG_HNDLR_PTR)();
+# else
+ typedef void (* SIG_HNDLR_PTR)(int, siginfo_t *, void *);
+ typedef void (* PLAIN_HNDLR_PTR)(int);
+# endif
+
+#ifndef DARWIN
+ STATIC SIG_HNDLR_PTR GC_old_segv_handler = 0;
+ /* Also old MSWIN32 ACCESS_VIOLATION filter */
+# if defined(FREEBSD) || defined(HPUX) || defined(HURD) || defined(LINUX)
+ STATIC SIG_HNDLR_PTR GC_old_bus_handler = 0;
+# ifndef LINUX
+ STATIC GC_bool GC_old_bus_handler_used_si = FALSE;
+# endif
+# endif
+# if !defined(MSWIN32) && !defined(MSWINCE)
+ STATIC GC_bool GC_old_segv_handler_used_si = FALSE;
+# endif /* !MSWIN32 */
+#endif /* !DARWIN */
+
+#ifdef THREADS
+ /* This function is used only by the fault handler. Potential data */
+ /* race between this function and GC_install_header, GC_remove_header */
+ /* should not be harmful because the added or removed header should */
+ /* be already unprotected. */
+ GC_ATTR_NO_SANITIZE_THREAD
+ static GC_bool is_header_found_async(void *addr)
+ {
+# ifdef HASH_TL
+ hdr *result;
+ GET_HDR((ptr_t)addr, result);
+ return result != NULL;
+# else
+ return HDR_INNER(addr) != NULL;
+# endif
+ }
+#else
+# define is_header_found_async(addr) (HDR(addr) != NULL)
+#endif /* !THREADS */
+
+#ifndef DARWIN
+
+# if !defined(MSWIN32) && !defined(MSWINCE)
+# include <errno.h>
+# if defined(FREEBSD) || defined(HURD) || defined(HPUX)
+# define SIG_OK (sig == SIGBUS || sig == SIGSEGV)
+# else
+# define SIG_OK (sig == SIGSEGV)
+ /* Catch SIGSEGV but ignore SIGBUS. */
+# endif
+# if defined(FREEBSD)
+# ifndef SEGV_ACCERR
+# define SEGV_ACCERR 2
+# endif
+# if defined(AARCH64) || defined(ARM32) || defined(MIPS) \
+ || __FreeBSD__ >= 7
+# define CODE_OK (si -> si_code == SEGV_ACCERR)
+# elif defined(POWERPC)
+# define AIM /* Pretend that we're AIM. */
+# include <machine/trap.h>
+# define CODE_OK (si -> si_code == EXC_DSI \
+ || si -> si_code == SEGV_ACCERR)
+# else
+# define CODE_OK (si -> si_code == BUS_PAGE_FAULT \
+ || si -> si_code == SEGV_ACCERR)
+# endif
+# elif defined(OSF1)
+# define CODE_OK (si -> si_code == 2 /* experimentally determined */)
+# elif defined(IRIX5)
+# define CODE_OK (si -> si_code == EACCES)
+# elif defined(CYGWIN32) || defined(HAIKU) || defined(HURD)
+# define CODE_OK TRUE
+# elif defined(LINUX)
+# define CODE_OK TRUE
+ /* Empirically c.trapno == 14, on IA32, but is that useful? */
+ /* Should probably consider alignment issues on other */
+ /* architectures. */
+# elif defined(HPUX)
+# define CODE_OK (si -> si_code == SEGV_ACCERR \
+ || si -> si_code == BUS_ADRERR \
+ || si -> si_code == BUS_UNKNOWN \
+ || si -> si_code == SEGV_UNKNOWN \
+ || si -> si_code == BUS_OBJERR)
+# elif defined(SUNOS5SIGS)
+# define CODE_OK (si -> si_code == SEGV_ACCERR)
+# endif
+# ifndef NO_GETCONTEXT
+# include <ucontext.h>
+# endif
+ STATIC void GC_write_fault_handler(int sig, siginfo_t *si, void *raw_sc)
+# else
+# define SIG_OK (exc_info -> ExceptionRecord -> ExceptionCode \
+ == STATUS_ACCESS_VIOLATION)
+# define CODE_OK (exc_info -> ExceptionRecord -> ExceptionInformation[0] \
+ == 1) /* Write fault */
+ STATIC LONG WINAPI GC_write_fault_handler(
+ struct _EXCEPTION_POINTERS *exc_info)
+# endif /* MSWIN32 || MSWINCE */
+ {
+# if !defined(MSWIN32) && !defined(MSWINCE)
+ char *addr = (char *)si->si_addr;
+# else
+ char * addr = (char *) (exc_info -> ExceptionRecord
+ -> ExceptionInformation[1]);
+# endif
+
+ if (SIG_OK && CODE_OK) {
+ struct hblk * h = (struct hblk *)((word)addr
+ & ~(word)(GC_page_size-1));
+ GC_bool in_allocd_block;
+ size_t i;
+
+ GC_ASSERT(GC_page_size != 0);
+# ifdef CHECKSUMS
+ GC_record_fault(h);
+# endif
+# ifdef SUNOS5SIGS
+ /* Address is only within the correct physical page. */
+ in_allocd_block = FALSE;
+ for (i = 0; i < divHBLKSZ(GC_page_size); i++) {
+ if (is_header_found_async(&h[i])) {
+ in_allocd_block = TRUE;
+ break;
+ }
+ }
+# else
+ in_allocd_block = is_header_found_async(addr);
+# endif
+ if (!in_allocd_block) {
+ /* FIXME - We should make sure that we invoke the */
+ /* old handler with the appropriate calling */
+ /* sequence, which often depends on SA_SIGINFO. */
+
+ /* Heap blocks now begin and end on page boundaries */
+ SIG_HNDLR_PTR old_handler;
+
+# if defined(MSWIN32) || defined(MSWINCE)
+ old_handler = GC_old_segv_handler;
+# else
+ GC_bool used_si;
+
+# if defined(FREEBSD) || defined(HURD) || defined(HPUX)
+ if (sig == SIGBUS) {
+ old_handler = GC_old_bus_handler;
+ used_si = GC_old_bus_handler_used_si;
+ } else
+# endif
+ /* else */ {
+ old_handler = GC_old_segv_handler;
+ used_si = GC_old_segv_handler_used_si;
+ }
+# endif
+
+ if (old_handler == (SIG_HNDLR_PTR)(signed_word)SIG_DFL) {
+# if !defined(MSWIN32) && !defined(MSWINCE)
+ ABORT_ARG1("Unexpected bus error or segmentation fault",
+ " at %p", (void *)addr);
+# else
+ return(EXCEPTION_CONTINUE_SEARCH);
+# endif
+ } else {
+ /*
+ * FIXME: This code should probably check if the
+ * old signal handler used the traditional style and
+ * if so call it using that style.
+ */
+# if defined(MSWIN32) || defined(MSWINCE)
+ return((*old_handler)(exc_info));
+# else
+ if (used_si)
+ ((SIG_HNDLR_PTR)old_handler) (sig, si, raw_sc);
+ else
+ /* FIXME: should pass nonstandard args as well. */
+ ((PLAIN_HNDLR_PTR)(signed_word)old_handler)(sig);
+ return;
+# endif
+ }
+ }
+ UNPROTECT(h, GC_page_size);
+ /* We need to make sure that no collection occurs between */
+ /* the UNPROTECT and the setting of the dirty bit. Otherwise */
+ /* a write by a third thread might go unnoticed. Reversing */
+ /* the order is just as bad, since we would end up unprotecting */
+ /* a page in a GC cycle during which it's not marked. */
+ /* Currently we do this by disabling the thread stopping */
+ /* signals while this handler is running. An alternative might */
+ /* be to record the fact that we're about to unprotect, or */
+ /* have just unprotected a page in the GC's thread structure, */
+ /* and then to have the thread stopping code set the dirty */
+ /* flag, if necessary. */
+ for (i = 0; i < divHBLKSZ(GC_page_size); i++) {
+ word index = PHT_HASH(h+i);
+
+ async_set_pht_entry_from_index(GC_dirty_pages, index);
+ }
+ /* The write may not take place before dirty bits are read. */
+ /* But then we'll fault again ... */
+# if defined(MSWIN32) || defined(MSWINCE)
+ return(EXCEPTION_CONTINUE_EXECUTION);
+# else
+ return;
+# endif
+ }
+# if defined(MSWIN32) || defined(MSWINCE)
+ return EXCEPTION_CONTINUE_SEARCH;
+# else
+ ABORT_ARG1("Unexpected bus error or segmentation fault",
+ " at %p", (void *)addr);
+# endif
+ }
+
+# if defined(GC_WIN32_THREADS) && !defined(CYGWIN32)
+ GC_INNER void GC_set_write_fault_handler(void)
+ {
+ SetUnhandledExceptionFilter(GC_write_fault_handler);
+ }
+# endif
+
+# ifdef SOFT_VDB
+ static GC_bool soft_dirty_init(void);
+# endif
+
+ GC_INNER GC_bool GC_dirty_init(void)
+ {
+# if !defined(MSWIN32) && !defined(MSWINCE)
+ struct sigaction act, oldact;
+# endif
+
+# ifdef COUNT_PROTECTED_REGIONS
+ GC_ASSERT(GC_page_size != 0);
+ if ((signed_word)(GC_heapsize / (word)GC_page_size)
+ >= ((signed_word)GC_UNMAPPED_REGIONS_SOFT_LIMIT
+ - GC_num_unmapped_regions) * 2) {
+ GC_COND_LOG_PRINTF("Cannot turn on GC incremental mode"
+ " as heap contains too many pages\n");
+ return FALSE;
+ }
+# endif
+# if !defined(MSWIN32) && !defined(MSWINCE)
+ act.sa_flags = SA_RESTART | SA_SIGINFO;
+ act.sa_sigaction = GC_write_fault_handler;
+ (void)sigemptyset(&act.sa_mask);
+# if defined(THREADS) && !defined(GC_OPENBSD_UTHREADS) \
+ && !defined(GC_WIN32_THREADS) && !defined(NACL)
+ /* Arrange to postpone the signal while we are in a write fault */
+ /* handler. This effectively makes the handler atomic w.r.t. */
+ /* stopping the world for GC. */
+ (void)sigaddset(&act.sa_mask, GC_get_suspend_signal());
+# endif
+# endif /* !MSWIN32 */
+ GC_VERBOSE_LOG_PRINTF(
+ "Initializing mprotect virtual dirty bit implementation\n");
+ if (GC_page_size % HBLKSIZE != 0) {
+ ABORT("Page size not multiple of HBLKSIZE");
+ }
+# ifdef GWW_VDB
+ if (GC_gww_dirty_init()) {
+ GC_COND_LOG_PRINTF("Using GetWriteWatch()\n");
+ return TRUE;
+ }
+# elif defined(SOFT_VDB)
+ if (soft_dirty_init()) {
+ GC_COND_LOG_PRINTF("Using soft-dirty bit feature\n");
+ return TRUE;
+ }
+# endif
+# ifdef MSWIN32
+ GC_old_segv_handler = SetUnhandledExceptionFilter(
+ GC_write_fault_handler);
+ if (GC_old_segv_handler != NULL) {
+ GC_COND_LOG_PRINTF("Replaced other UnhandledExceptionFilter\n");
+ } else {
+ GC_old_segv_handler = SIG_DFL;
+ }
+# elif defined(MSWINCE)
+ /* MPROTECT_VDB is unsupported for WinCE at present. */
+ /* FIXME: implement it (if possible). */
+# else
+ /* act.sa_restorer is deprecated and should not be initialized. */
+# if defined(GC_IRIX_THREADS)
+ sigaction(SIGSEGV, 0, &oldact);
+ sigaction(SIGSEGV, &act, 0);
+# else
+ {
+ int res = sigaction(SIGSEGV, &act, &oldact);
+ if (res != 0) ABORT("Sigaction failed");
+ }
+# endif
+ if (oldact.sa_flags & SA_SIGINFO) {
+ GC_old_segv_handler = oldact.sa_sigaction;
+ GC_old_segv_handler_used_si = TRUE;
+ } else {
+ GC_old_segv_handler = (SIG_HNDLR_PTR)(signed_word)oldact.sa_handler;
+ GC_old_segv_handler_used_si = FALSE;
+ }
+ if (GC_old_segv_handler == (SIG_HNDLR_PTR)(signed_word)SIG_IGN) {
+ WARN("Previously ignored segmentation violation!?\n", 0);
+ GC_old_segv_handler = (SIG_HNDLR_PTR)(signed_word)SIG_DFL;
+ }
+ if (GC_old_segv_handler != (SIG_HNDLR_PTR)(signed_word)SIG_DFL) {
+ GC_VERBOSE_LOG_PRINTF("Replaced other SIGSEGV handler\n");
+ }
+# if defined(HPUX) || defined(LINUX) || defined(HURD) \
+ || (defined(FREEBSD) && defined(SUNOS5SIGS))
+ sigaction(SIGBUS, &act, &oldact);
+ if ((oldact.sa_flags & SA_SIGINFO) != 0) {
+ GC_old_bus_handler = oldact.sa_sigaction;
+# if !defined(LINUX)
+ GC_old_bus_handler_used_si = TRUE;
+# endif
+ } else {
+ GC_old_bus_handler = (SIG_HNDLR_PTR)(signed_word)oldact.sa_handler;
+ }
+ if (GC_old_bus_handler == (SIG_HNDLR_PTR)(signed_word)SIG_IGN) {
+ WARN("Previously ignored bus error!?\n", 0);
+# if !defined(LINUX)
+ GC_old_bus_handler = (SIG_HNDLR_PTR)(signed_word)SIG_DFL;
+# else
+ /* GC_old_bus_handler is not used by GC_write_fault_handler. */
+# endif
+ } else if (GC_old_bus_handler != (SIG_HNDLR_PTR)(signed_word)SIG_DFL) {
+ GC_VERBOSE_LOG_PRINTF("Replaced other SIGBUS handler\n");
+ }
+# endif /* HPUX || LINUX || HURD || (FREEBSD && SUNOS5SIGS) */
+# endif /* !MSWIN32 && !MSWINCE */
+# if defined(CPPCHECK) && defined(ADDRESS_SANITIZER)
+ GC_noop1((word)&__asan_default_options);
+# endif
+ return TRUE;
+ }
+#endif /* !DARWIN */
+
+GC_API int GC_CALL GC_incremental_protection_needs(void)
+{
+ GC_ASSERT(GC_is_initialized);
+# if defined(GWW_VDB) || defined(SOFT_VDB)
+ /* Only if the incremental mode is already switched on. */
+ if (GC_GWW_AVAILABLE())
+ return GC_PROTECTS_NONE;
+# endif
+ if (GC_page_size == HBLKSIZE) {
+ return GC_PROTECTS_POINTER_HEAP;
+ } else {
+ return GC_PROTECTS_POINTER_HEAP | GC_PROTECTS_PTRFREE_HEAP;
+ }
+}
+#define HAVE_INCREMENTAL_PROTECTION_NEEDS
+
+#define IS_PTRFREE(hhdr) ((hhdr)->hb_descr == 0)
+#define PAGE_ALIGNED(x) !((word)(x) & (GC_page_size - 1))
+
+STATIC void GC_protect_heap(void)
+{
+ unsigned i;
+ GC_bool protect_all =
+ (0 != (GC_incremental_protection_needs() & GC_PROTECTS_PTRFREE_HEAP));
+
+ GC_ASSERT(GC_page_size != 0);
+ for (i = 0; i < GC_n_heap_sects; i++) {
+ ptr_t start = GC_heap_sects[i].hs_start;
+ size_t len = GC_heap_sects[i].hs_bytes;
+
+ if (protect_all) {
+ PROTECT(start, len);
+ } else {
+ struct hblk * current;
+ struct hblk * current_start; /* Start of block to be protected. */
+ struct hblk * limit;
+
+ GC_ASSERT(PAGE_ALIGNED(len));
+ GC_ASSERT(PAGE_ALIGNED(start));
+ current_start = current = (struct hblk *)start;
+ limit = (struct hblk *)(start + len);
+ while ((word)current < (word)limit) {
+ hdr * hhdr;
+ word nhblks;
+ GC_bool is_ptrfree;
+
+ GC_ASSERT(PAGE_ALIGNED(current));
+ GET_HDR(current, hhdr);
+ if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ /* This can happen only if we're at the beginning of a */
+ /* heap segment, and a block spans heap segments. */
+ /* We will handle that block as part of the preceding */
+ /* segment. */
+ GC_ASSERT(current_start == current);
+ current_start = ++current;
+ continue;
+ }
+ if (HBLK_IS_FREE(hhdr)) {
+ GC_ASSERT(PAGE_ALIGNED(hhdr -> hb_sz));
+ nhblks = divHBLKSZ(hhdr -> hb_sz);
+ is_ptrfree = TRUE; /* dirty on alloc */
+ } else {
+ nhblks = OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz);
+ is_ptrfree = IS_PTRFREE(hhdr);
+ }
+ if (is_ptrfree) {
+ if ((word)current_start < (word)current) {
+ PROTECT(current_start, (ptr_t)current - (ptr_t)current_start);
+ }
+ current_start = (current += nhblks);
+ } else {
+ current += nhblks;
+ }
+ }
+ if ((word)current_start < (word)current) {
+ PROTECT(current_start, (ptr_t)current - (ptr_t)current_start);
+ }
+ }
+ }
+}
+
+# if defined(CAN_HANDLE_FORK) && defined(DARWIN) && defined(THREADS) \
+ || defined(COUNT_PROTECTED_REGIONS)
+ /* Remove protection for the entire heap not updating GC_dirty_pages. */
+ STATIC void GC_unprotect_all_heap(void)
+ {
+ unsigned i;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_ASSERT(GC_auto_incremental);
+ for (i = 0; i < GC_n_heap_sects; i++) {
+ UNPROTECT(GC_heap_sects[i].hs_start, GC_heap_sects[i].hs_bytes);
+ }
+ }
+# endif /* CAN_HANDLE_FORK && DARWIN && THREADS || COUNT_PROTECTED_REGIONS */
+
+# ifdef COUNT_PROTECTED_REGIONS
+ GC_INNER void GC_handle_protected_regions_limit(void)
+ {
+ GC_ASSERT(GC_page_size != 0);
+ /* To prevent exceeding the limit of vm.max_map_count, the most */
+ /* trivial (though highly restrictive) way is to turn off the */
+ /* incremental collection mode (based on mprotect) once the */
+ /* number of pages in the heap reaches that limit. */
+ if (GC_auto_incremental && !GC_GWW_AVAILABLE()
+ && (signed_word)(GC_heapsize / (word)GC_page_size)
+ >= ((signed_word)GC_UNMAPPED_REGIONS_SOFT_LIMIT
+ - GC_num_unmapped_regions) * 2) {
+ GC_unprotect_all_heap();
+# ifdef DARWIN
+ GC_task_self = 0;
+# endif
+ GC_incremental = FALSE;
+ WARN("GC incremental mode is turned off"
+ " to prevent hitting VM maps limit\n", 0);
+ }
+ }
+# endif /* COUNT_PROTECTED_REGIONS */
+
+#endif /* MPROTECT_VDB */
+
+#if !defined(THREADS) && (defined(PROC_VDB) || defined(SOFT_VDB))
+ static pid_t saved_proc_pid; /* pid used to compose /proc file names */
+#endif
+
+#ifdef PROC_VDB
+/* This implementation assumes a Solaris 2.X like /proc */
+/* pseudo-file-system from which we can read page modified bits. This */
+/* facility is far from optimal (e.g. we would like to get the info for */
+/* only some of the address space), but it avoids intercepting system */
+/* calls. */
+
+# include <errno.h>
+# include <sys/types.h>
+# include <sys/signal.h>
+# include <sys/syscall.h>
+# include <sys/stat.h>
+
+# ifdef GC_NO_SYS_FAULT_H
+ /* This exists only to check PROC_VDB code compilation (on Linux). */
+# define PG_MODIFIED 1
+ struct prpageheader {
+ int dummy[2]; /* pr_tstamp */
+ unsigned long pr_nmap;
+ unsigned long pr_npage;
+ };
+ struct prasmap {
+ char *pr_vaddr;
+ size_t pr_npage;
+ char dummy1[64+8]; /* pr_mapname, pr_offset */
+ unsigned pr_mflags;
+ unsigned pr_pagesize;
+ int dummy2[2];
+ };
+# else
+# include <sys/fault.h>
+# include <sys/procfs.h>
+# endif
+
+# define INITIAL_BUF_SZ 16384
+ STATIC size_t GC_proc_buf_size = INITIAL_BUF_SZ;
+ STATIC char *GC_proc_buf = NULL;
+ STATIC int GC_proc_fd = -1;
+
+ static GC_bool proc_dirty_open_files(void)
+ {
+ char buf[40];
+ pid_t pid = getpid();
+
+ (void)snprintf(buf, sizeof(buf), "/proc/%ld/pagedata", (long)pid);
+ buf[sizeof(buf) - 1] = '\0';
+ GC_proc_fd = open(buf, O_RDONLY);
+ if (-1 == GC_proc_fd) {
+ WARN("/proc open failed; cannot enable GC incremental mode\n", 0);
+ return FALSE;
+ }
+ if (syscall(SYS_fcntl, GC_proc_fd, F_SETFD, FD_CLOEXEC) == -1)
+ WARN("Could not set FD_CLOEXEC for /proc\n", 0);
+# ifndef THREADS
+ saved_proc_pid = pid; /* updated on success only */
+# endif
+ return TRUE;
+ }
+
+# ifdef CAN_HANDLE_FORK
+ GC_INNER void GC_dirty_update_child(void)
+ {
+ if (-1 == GC_proc_fd)
+ return; /* GC incremental mode is off */
+
+ close(GC_proc_fd);
+ if (!proc_dirty_open_files())
+ GC_incremental = FALSE; /* should be safe to turn it off */
+ }
+# endif /* CAN_HANDLE_FORK */
+
+GC_INNER GC_bool GC_dirty_init(void)
+{
+ if (GC_bytes_allocd != 0 || GC_bytes_allocd_before_gc != 0) {
+ memset(GC_written_pages, 0xff, sizeof(page_hash_table));
+ GC_VERBOSE_LOG_PRINTF(
+ "Allocated %lu bytes: all pages may have been written\n",
+ (unsigned long)(GC_bytes_allocd + GC_bytes_allocd_before_gc));
+ }
+ if (!proc_dirty_open_files())
+ return FALSE;
+ GC_proc_buf = GC_scratch_alloc(GC_proc_buf_size);
+ if (GC_proc_buf == NULL)
+ ABORT("Insufficient space for /proc read");
+ return TRUE;
+}
+
+GC_INLINE void GC_proc_read_dirty(GC_bool output_unneeded)
+{
+ int nmaps;
+ char * bufp = GC_proc_buf;
+ int i;
+
+# ifndef THREADS
+ /* If the current pid differs from the saved one, then we are in */
+ /* the forked (child) process, the current /proc file should be */
+ /* closed, the new one should be opened with the updated path. */
+ /* Note, this is not needed for multi-threaded case because */
+ /* fork_child_proc() reopens the file right after fork. */
+ if (getpid() != saved_proc_pid
+ && (-1 == GC_proc_fd /* no need to retry */
+ || (close(GC_proc_fd), !proc_dirty_open_files()))) {
+ /* Failed to reopen the file. Punt! */
+ if (!output_unneeded)
+ memset(GC_grungy_pages, 0xff, sizeof(page_hash_table));
+ memset(GC_written_pages, 0xff, sizeof(page_hash_table));
+ return;
+ }
+# endif
+
+ BZERO(GC_grungy_pages, sizeof(GC_grungy_pages));
+ if (PROC_READ(GC_proc_fd, bufp, GC_proc_buf_size) <= 0) {
+ /* Retry with larger buffer. */
+ size_t new_size = 2 * GC_proc_buf_size;
+ char *new_buf;
+
+ WARN("/proc read failed: GC_proc_buf_size= %" WARN_PRIuPTR "\n",
+ GC_proc_buf_size);
+ new_buf = GC_scratch_alloc(new_size);
+ if (new_buf != 0) {
+ GC_scratch_recycle_no_gww(bufp, GC_proc_buf_size);
+ GC_proc_buf = bufp = new_buf;
+ GC_proc_buf_size = new_size;
+ }
+ if (PROC_READ(GC_proc_fd, bufp, GC_proc_buf_size) <= 0) {
+ WARN("Insufficient space for /proc read\n", 0);
+ /* Punt: */
+ if (!output_unneeded)
+ memset(GC_grungy_pages, 0xff, sizeof (page_hash_table));
+ memset(GC_written_pages, 0xff, sizeof(page_hash_table));
+ return;
+ }
+ }
+
+ /* Copy dirty bits into GC_grungy_pages */
+ nmaps = ((struct prpageheader *)bufp) -> pr_nmap;
+# ifdef DEBUG_DIRTY_BITS
+ GC_log_printf("Proc VDB read: pr_nmap= %u, pr_npage= %lu\n",
+ nmaps, ((struct prpageheader *)bufp)->pr_npage);
+# endif
+# if defined(GC_NO_SYS_FAULT_H) && defined(CPPCHECK)
+ GC_noop1(((struct prpageheader *)bufp)->dummy[0]);
+# endif
+ bufp += sizeof(struct prpageheader);
+ for (i = 0; i < nmaps; i++) {
+ struct prasmap * map = (struct prasmap *)bufp;
+ ptr_t vaddr = (ptr_t)(map -> pr_vaddr);
+ unsigned long npages = map -> pr_npage;
+ unsigned pagesize = map -> pr_pagesize;
+ ptr_t limit;
+
+# if defined(GC_NO_SYS_FAULT_H) && defined(CPPCHECK)
+ GC_noop1(map->dummy1[0] + map->dummy2[0]);
+# endif
+# ifdef DEBUG_DIRTY_BITS
+ GC_log_printf(
+ "pr_vaddr= %p, npage= %lu, mflags= 0x%x, pagesize= 0x%x\n",
+ (void *)vaddr, npages, map->pr_mflags, pagesize);
+# endif
+
+ bufp += sizeof(struct prasmap);
+ limit = vaddr + pagesize * npages;
+ for (; (word)vaddr < (word)limit; vaddr += pagesize) {
+ if ((*bufp++) & PG_MODIFIED) {
+ struct hblk * h;
+ ptr_t next_vaddr = vaddr + pagesize;
+# ifdef DEBUG_DIRTY_BITS
+ GC_log_printf("dirty page at: %p\n", (void *)vaddr);
+# endif
+ for (h = (struct hblk *)vaddr;
+ (word)h < (word)next_vaddr; h++) {
+ word index = PHT_HASH(h);
+
+ set_pht_entry_from_index(GC_grungy_pages, index);
+ }
+ }
+ }
+ bufp = (char *)(((word)bufp + (sizeof(long)-1))
+ & ~(word)(sizeof(long)-1));
+ }
+# ifdef DEBUG_DIRTY_BITS
+ GC_log_printf("Proc VDB read done\n");
+# endif
+
+ /* Update GC_written_pages (even if output_unneeded). */
+ GC_or_pages(GC_written_pages, GC_grungy_pages);
+}
+
+#endif /* PROC_VDB */
+
+#ifdef SOFT_VDB
+# ifndef VDB_BUF_SZ
+# define VDB_BUF_SZ 16384
+# endif
+
+ static int open_proc_fd(pid_t pid, const char *proc_filename, int mode)
+ {
+ int f;
+ char buf[40];
+
+ (void)snprintf(buf, sizeof(buf), "/proc/%ld/%s", (long)pid,
+ proc_filename);
+ buf[sizeof(buf) - 1] = '\0';
+ f = open(buf, mode);
+ if (-1 == f) {
+ WARN("/proc/self/%s open failed; cannot enable GC incremental mode\n",
+ proc_filename);
+ } else if (fcntl(f, F_SETFD, FD_CLOEXEC) == -1) {
+ WARN("Could not set FD_CLOEXEC for /proc\n", 0);
+ }
+ return f;
+ }
+
+# include <stdint.h> /* for uint64_t */
+
+ typedef uint64_t pagemap_elem_t;
+
+ static pagemap_elem_t *soft_vdb_buf;
+ static int pagemap_fd;
+
+ static GC_bool soft_dirty_open_files(void)
+ {
+ pid_t pid = getpid();
+
+ clear_refs_fd = open_proc_fd(pid, "clear_refs", O_WRONLY);
+ if (-1 == clear_refs_fd)
+ return FALSE;
+ pagemap_fd = open_proc_fd(pid, "pagemap", O_RDONLY);
+ if (-1 == pagemap_fd) {
+ close(clear_refs_fd);
+ clear_refs_fd = -1;
+ return FALSE;
+ }
+# ifndef THREADS
+ saved_proc_pid = pid; /* updated on success only */
+# endif
+ return TRUE;
+ }
+
+# ifdef CAN_HANDLE_FORK
+ GC_INNER void GC_dirty_update_child(void)
+ {
+ if (-1 == clear_refs_fd)
+ return; /* GC incremental mode is off */
+
+ close(clear_refs_fd);
+ close(pagemap_fd);
+ if (!soft_dirty_open_files())
+ GC_incremental = FALSE;
+ }
+# endif /* CAN_HANDLE_FORK */
+
+ /* Clear soft-dirty bits from the task's PTEs. */
+ static void clear_soft_dirty_bits(void)
+ {
+ ssize_t res = write(clear_refs_fd, "4\n", 2);
+
+ if (res != 2)
+ ABORT_ARG1("Failed to write to /proc/self/clear_refs",
+ ": errno= %d", res < 0 ? errno : 0);
+ }
+
+ /* The bit 55 of the 64-bit qword of pagemap file is the soft-dirty one. */
+# define PM_SOFTDIRTY_MASK ((pagemap_elem_t)1 << 55)
+
+ static GC_bool detect_soft_dirty_supported(ptr_t vaddr)
+ {
+ off_t fpos;
+ pagemap_elem_t buf[1];
+
+ GC_ASSERT(GC_page_size != 0);
+ *vaddr = 1; /* make it dirty */
+ fpos = (off_t)((word)vaddr / GC_page_size * sizeof(pagemap_elem_t));
+
+ for (;;) {
+ /* Read the relevant PTE from the pagemap file. */
+ if (lseek(pagemap_fd, fpos, SEEK_SET) == (off_t)(-1))
+ return FALSE;
+ if (PROC_READ(pagemap_fd, buf, sizeof(buf)) != (int)sizeof(buf))
+ return FALSE;
+
+ /* Is the soft-dirty bit unset? */
+ if ((buf[0] & PM_SOFTDIRTY_MASK) == 0) return FALSE;
+
+ if (0 == *vaddr) break;
+ /* Retry to check that writing to clear_refs works as expected. */
+ /* This malfunction of the soft-dirty bits implementation is */
+ /* observed on some Linux kernels on Power9 (e.g. in Fedora 36). */
+ clear_soft_dirty_bits();
+ *vaddr = 0;
+ }
+ return TRUE; /* success */
+ }
+
+# ifndef NO_SOFT_VDB_LINUX_VER_RUNTIME_CHECK
+# include <sys/utsname.h>
+# include <string.h> /* for strcmp() */
+
+ /* Ensure the linux (kernel) major/minor version is as given or higher. */
+ static GC_bool ensure_min_linux_ver(int major, int minor) {
+ struct utsname info;
+ int actual_major;
+ int actual_minor = -1;
+
+ if (uname(&info) == -1) {
+ return FALSE; /* uname() failed, should not happen actually. */
+ }
+ if (strcmp(info.sysname, "Linux")) {
+ WARN("Cannot ensure Linux version as running on other OS: %s\n",
+ info.sysname);
+ return FALSE;
+ }
+ actual_major = GC_parse_version(&actual_minor, info.release);
+ return actual_major > major
+ || (actual_major == major && actual_minor >= minor);
+ }
+# endif
+
+# ifdef MPROTECT_VDB
+ static GC_bool soft_dirty_init(void)
+# else
+ GC_INNER GC_bool GC_dirty_init(void)
+# endif
+ {
+# ifdef MPROTECT_VDB
+ char * str = GETENV("GC_USE_GETWRITEWATCH");
+
+# ifdef GC_PREFER_MPROTECT_VDB
+ if (str == NULL || (*str == '0' && *(str + 1) == '\0'))
+ return FALSE; /* the environment variable is unset or set to "0" */
+# else
+ if (str != NULL && *str == '0' && *(str + 1) == '\0')
+ return FALSE; /* the environment variable is set "0" */
+# endif
+# endif
+ GC_ASSERT(NULL == soft_vdb_buf);
+# ifndef NO_SOFT_VDB_LINUX_VER_RUNTIME_CHECK
+ if (!ensure_min_linux_ver(3, 18)) {
+ GC_COND_LOG_PRINTF(
+ "Running on old kernel lacking correct soft-dirty bit support\n");
+ return FALSE;
+ }
+# endif
+ if (!soft_dirty_open_files())
+ return FALSE;
+ soft_vdb_buf = (pagemap_elem_t *)GC_scratch_alloc(VDB_BUF_SZ);
+ if (NULL == soft_vdb_buf)
+ ABORT("Insufficient space for /proc pagemap buffer");
+ if (!detect_soft_dirty_supported((ptr_t)soft_vdb_buf)) {
+ GC_COND_LOG_PRINTF("Soft-dirty bit is not supported by kernel\n");
+ /* Release the resources. */
+ GC_scratch_recycle_no_gww(soft_vdb_buf, VDB_BUF_SZ);
+ soft_vdb_buf = NULL;
+ close(clear_refs_fd);
+ clear_refs_fd = -1;
+ close(pagemap_fd);
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ static off_t pagemap_buf_fpos; /* valid only if pagemap_buf_len > 0 */
+ static size_t pagemap_buf_len;
+
+ /* Read bytes from /proc/self/pagemap at given file position. */
+ /* len - the maximum number of bytes to read; (*pres) - amount of */
+ /* bytes actually read, always bigger than 0 but never exceeds len; */
+ /* next_fpos_hint - the file position of the next bytes block to read */
+ /* ahead if possible (0 means no information provided). */
+ static const pagemap_elem_t *pagemap_buffered_read(size_t *pres,
+ off_t fpos, size_t len,
+ off_t next_fpos_hint)
+ {
+ ssize_t res;
+ size_t ofs;
+
+ GC_ASSERT(len > 0);
+ if (pagemap_buf_fpos <= fpos
+ && fpos < pagemap_buf_fpos + (off_t)pagemap_buf_len) {
+ /* The requested data is already in the buffer. */
+ ofs = (size_t)(fpos - pagemap_buf_fpos);
+ res = (ssize_t)(pagemap_buf_fpos + pagemap_buf_len - fpos);
+ } else {
+ off_t aligned_pos = fpos & ~(off_t)(GC_page_size < VDB_BUF_SZ
+ ? GC_page_size-1 : VDB_BUF_SZ-1);
+
+ for (;;) {
+ size_t count;
+
+ if ((0 == pagemap_buf_len
+ || pagemap_buf_fpos + (off_t)pagemap_buf_len != aligned_pos)
+ && lseek(pagemap_fd, aligned_pos, SEEK_SET) == (off_t)(-1))
+ ABORT_ARG2("Failed to lseek /proc/self/pagemap",
+ ": offset= %lu, errno= %d", (unsigned long)fpos, errno);
+
+ /* How much to read at once? */
+ ofs = (size_t)(fpos - aligned_pos);
+ GC_ASSERT(ofs < VDB_BUF_SZ);
+ if (next_fpos_hint > aligned_pos
+ && next_fpos_hint - aligned_pos < VDB_BUF_SZ) {
+ count = VDB_BUF_SZ;
+ } else {
+ count = len + ofs;
+ if (count > VDB_BUF_SZ)
+ count = VDB_BUF_SZ;
+ }
+
+ GC_ASSERT(count % sizeof(pagemap_elem_t) == 0);
+ res = PROC_READ(pagemap_fd, soft_vdb_buf, count);
+ if (res > (ssize_t)ofs)
+ break;
+ if (res <= 0)
+ ABORT_ARG1("Failed to read /proc/self/pagemap",
+ ": errno= %d", res < 0 ? errno : 0);
+ /* Retry (once) w/o page-alignment. */
+ aligned_pos = fpos;
+ }
+
+ /* Save the buffer (file window) position and size. */
+ pagemap_buf_fpos = aligned_pos;
+ pagemap_buf_len = (size_t)res;
+ res -= (ssize_t)ofs;
+ }
+
+ GC_ASSERT(ofs % sizeof(pagemap_elem_t) == 0);
+ *pres = (size_t)res < len ? (size_t)res : len;
+ return &soft_vdb_buf[ofs / sizeof(pagemap_elem_t)];
+ }
+
+ static void soft_set_grungy_pages(ptr_t start, ptr_t limit,
+ ptr_t next_start_hint)
+ {
+ word vaddr = (word)start & ~(word)(GC_page_size-1);
+ off_t next_fpos_hint;
+
+ GC_ASSERT(modHBLKSZ((word)start) == 0);
+ GC_ASSERT(GC_page_size != 0);
+ next_fpos_hint = (off_t)((word)next_start_hint / GC_page_size
+ * sizeof(pagemap_elem_t));
+ while (vaddr < (word)limit) {
+ size_t res;
+ word limit_buf;
+ const pagemap_elem_t *bufp = pagemap_buffered_read(&res,
+ (off_t)(vaddr / GC_page_size * sizeof(pagemap_elem_t)),
+ (size_t)(((word)limit - vaddr + GC_page_size-1) / GC_page_size
+ * sizeof(pagemap_elem_t)),
+ next_fpos_hint);
+
+ if (res % sizeof(pagemap_elem_t) != 0) {
+ /* Punt: */
+ memset(GC_grungy_pages, 0xff, sizeof(page_hash_table));
+ WARN("Incomplete read of pagemap, not multiple of entry size\n", 0);
+ break;
+ }
+
+ limit_buf = vaddr + (res / sizeof(pagemap_elem_t)) * GC_page_size;
+ for (; vaddr < limit_buf; vaddr += GC_page_size, bufp++)
+ if ((*bufp & PM_SOFTDIRTY_MASK) != 0) {
+ struct hblk * h;
+ word next_vaddr = vaddr + GC_page_size;
+
+ if (EXPECT(next_vaddr > (word)limit, FALSE))
+ next_vaddr = (word)limit;
+ /* If the bit is set, the respective PTE was written to */
+ /* since clearing the soft-dirty bits. */
+# ifdef DEBUG_DIRTY_BITS
+ GC_log_printf("dirty page at: %p\n", (void *)vaddr);
+# endif
+ h = (struct hblk *)vaddr;
+ if (EXPECT(vaddr < (word)start, FALSE))
+ h = (struct hblk *)start;
+ for (; (word)h < next_vaddr; h++) {
+ word index = PHT_HASH(h);
+ set_pht_entry_from_index(GC_grungy_pages, index);
+ }
+ }
+ /* Read the next portion of pagemap file if incomplete. */
+ }
+ }
+
+ GC_INLINE void GC_soft_read_dirty(GC_bool output_unneeded)
+ {
+# ifndef THREADS
+ /* Similar as for GC_proc_read_dirty. */
+ if (getpid() != saved_proc_pid
+ && (-1 == clear_refs_fd /* no need to retry */
+ || (close(clear_refs_fd), close(pagemap_fd),
+ !soft_dirty_open_files()))) {
+ /* Failed to reopen the files. */
+ if (!output_unneeded) {
+ /* Punt: */
+ memset(GC_grungy_pages, 0xff, sizeof(page_hash_table));
+# ifdef CHECKSUMS
+ memset(GC_written_pages, 0xff, sizeof(page_hash_table));
+# endif
+ }
+ return;
+ }
+# endif
+
+ if (!output_unneeded) {
+ word i;
+
+ BZERO(GC_grungy_pages, sizeof(GC_grungy_pages));
+ pagemap_buf_len = 0; /* invalidate soft_vdb_buf */
+
+ for (i = 0; i != GC_n_heap_sects; ++i) {
+ ptr_t start = GC_heap_sects[i].hs_start;
+
+ soft_set_grungy_pages(start, start + GC_heap_sects[i].hs_bytes,
+ i < GC_n_heap_sects-1 ?
+ GC_heap_sects[i+1].hs_start : NULL);
+ }
+# ifdef CHECKSUMS
+ GC_or_pages(GC_written_pages, GC_grungy_pages);
+# endif
+
+# ifndef NO_VDB_FOR_STATIC_ROOTS
+ for (i = 0; (int)i < n_root_sets; ++i) {
+ soft_set_grungy_pages((ptr_t)HBLKPTR(GC_static_roots[i].r_start),
+ GC_static_roots[i].r_end,
+ (int)i < n_root_sets-1 ?
+ GC_static_roots[i+1].r_start : NULL);
+ }
+# endif
+ }
+
+ clear_soft_dirty_bits();
+ }
+#endif /* SOFT_VDB */
+
+#ifdef PCR_VDB
+
+# include "vd/PCR_VD.h"
+
+# define NPAGES (32*1024) /* 128 MB */
+
+PCR_VD_DB GC_grungy_bits[NPAGES];
+
+STATIC ptr_t GC_vd_base = NULL;
+ /* Address corresponding to GC_grungy_bits[0] */
+ /* HBLKSIZE aligned. */
+
+GC_INNER GC_bool GC_dirty_init(void)
+{
+ /* For the time being, we assume the heap generally grows up */
+ GC_vd_base = GC_heap_sects[0].hs_start;
+ if (GC_vd_base == 0) {
+ ABORT("Bad initial heap segment");
+ }
+ if (PCR_VD_Start(HBLKSIZE, GC_vd_base, NPAGES*HBLKSIZE)
+ != PCR_ERes_okay) {
+ ABORT("Dirty bit initialization failed");
+ }
+ return TRUE;
+}
+#endif /* PCR_VDB */
+
+#ifndef GC_DISABLE_INCREMENTAL
+ GC_INNER GC_bool GC_manual_vdb = FALSE;
+
+ /* Manually mark the page containing p as dirty. Logically, this */
+ /* dirties the entire object. */
+ GC_INNER void GC_dirty_inner(const void *p)
+ {
+ word index = PHT_HASH(p);
+
+# if defined(MPROTECT_VDB)
+ /* Do not update GC_dirty_pages if it should be followed by the */
+ /* page unprotection. */
+ GC_ASSERT(GC_manual_vdb);
+# endif
+ async_set_pht_entry_from_index(GC_dirty_pages, index);
+ }
+
+ /* Retrieve system dirty bits for the heap to a local buffer (unless */
+ /* output_unneeded). Restore the systems notion of which pages are */
+ /* dirty. We assume that either the world is stopped or it is OK to */
+ /* lose dirty bits while it's happening (as in GC_enable_incremental).*/
+ GC_INNER void GC_read_dirty(GC_bool output_unneeded)
+ {
+ if (GC_manual_vdb
+# if defined(MPROTECT_VDB)
+ || !GC_GWW_AVAILABLE()
+# endif
+ ) {
+ if (!output_unneeded)
+ BCOPY((/* no volatile */ void *)GC_dirty_pages, GC_grungy_pages,
+ sizeof(GC_dirty_pages));
+ BZERO((/* no volatile */ void *)GC_dirty_pages,
+ sizeof(GC_dirty_pages));
+# ifdef MPROTECT_VDB
+ if (!GC_manual_vdb)
+ GC_protect_heap();
+# endif
+ return;
+ }
+
+# ifdef GWW_VDB
+ GC_gww_read_dirty(output_unneeded);
+# elif defined(PROC_VDB)
+ GC_proc_read_dirty(output_unneeded);
+# elif defined(SOFT_VDB)
+ GC_soft_read_dirty(output_unneeded);
+# elif defined(PCR_VDB)
+ /* lazily enable dirty bits on newly added heap sects */
+ {
+ static int onhs = 0;
+ int nhs = GC_n_heap_sects;
+ for (; onhs < nhs; onhs++) {
+ PCR_VD_WriteProtectEnable(
+ GC_heap_sects[onhs].hs_start,
+ GC_heap_sects[onhs].hs_bytes);
+ }
+ }
+ if (PCR_VD_Clear(GC_vd_base, NPAGES*HBLKSIZE, GC_grungy_bits)
+ != PCR_ERes_okay) {
+ ABORT("Dirty bit read failed");
+ }
+# endif
+ }
+
+# if !defined(NO_VDB_FOR_STATIC_ROOTS) && !defined(PROC_VDB)
+ GC_INNER GC_bool GC_is_vdb_for_static_roots(void)
+ {
+ if (GC_manual_vdb) return FALSE;
+# if defined(MPROTECT_VDB)
+ /* Currently used only in conjunction with SOFT_VDB. */
+ return GC_GWW_AVAILABLE();
+# else
+ GC_ASSERT(GC_incremental);
+ return TRUE;
+# endif
+ }
+# endif
+
+ /* Is the HBLKSIZE sized page at h marked dirty in the local buffer? */
+ /* If the actual page size is different, this returns TRUE if any */
+ /* of the pages overlapping h are dirty. This routine may err on the */
+ /* side of labeling pages as dirty (and this implementation does). */
+ GC_INNER GC_bool GC_page_was_dirty(struct hblk *h)
+ {
+ word index;
+
+# ifdef PCR_VDB
+ if (!GC_manual_vdb) {
+ if ((word)h < (word)GC_vd_base
+ || (word)h >= (word)(GC_vd_base + NPAGES * HBLKSIZE)) {
+ return TRUE;
+ }
+ return GC_grungy_bits[h-(struct hblk*)GC_vd_base] & PCR_VD_DB_dirtyBit;
+ }
+# elif defined(DEFAULT_VDB)
+ if (!GC_manual_vdb)
+ return TRUE;
+# elif defined(PROC_VDB)
+ /* Unless manual VDB is on, the bitmap covers all process memory. */
+ if (GC_manual_vdb)
+# endif
+ {
+ if (NULL == HDR(h))
+ return TRUE;
+ }
+ index = PHT_HASH(h);
+ return get_pht_entry_from_index(GC_grungy_pages, index);
+ }
+
+# if defined(CHECKSUMS) || defined(PROC_VDB)
+ /* Could any valid GC heap pointer ever have been written to this page? */
+ GC_INNER GC_bool GC_page_was_ever_dirty(struct hblk *h)
+ {
+# if defined(GWW_VDB) || defined(PROC_VDB) || defined(SOFT_VDB)
+ word index;
+
+# ifdef MPROTECT_VDB
+ if (!GC_GWW_AVAILABLE())
+ return TRUE;
+# endif
+# if defined(PROC_VDB)
+ if (GC_manual_vdb)
+# endif
+ {
+ if (NULL == HDR(h))
+ return TRUE;
+ }
+ index = PHT_HASH(h);
+ return get_pht_entry_from_index(GC_written_pages, index);
+# else
+ /* TODO: implement me for MANUAL_VDB. */
+ (void)h;
+ return TRUE;
+# endif
+ }
+# endif /* CHECKSUMS || PROC_VDB */
+
+ /* We expect block h to be written shortly. Ensure that all pages */
+ /* containing any part of the n hblks starting at h are no longer */
+ /* protected. If is_ptrfree is false, also ensure that they will */
+ /* subsequently appear to be dirty. Not allowed to call GC_printf */
+ /* (and the friends) here, see Win32 GC_stop_world for the details. */
+ GC_INNER void GC_remove_protection(struct hblk *h, word nblocks,
+ GC_bool is_ptrfree)
+ {
+# ifdef PCR_VDB
+ (void)is_ptrfree;
+ if (!GC_auto_incremental)
+ return;
+ PCR_VD_WriteProtectDisable(h, nblocks*HBLKSIZE);
+ PCR_VD_WriteProtectEnable(h, nblocks*HBLKSIZE);
+# elif defined(MPROTECT_VDB)
+ struct hblk * h_trunc; /* Truncated to page boundary */
+ struct hblk * h_end; /* Page boundary following block end */
+ struct hblk * current;
+
+ if (!GC_auto_incremental || GC_GWW_AVAILABLE())
+ return;
+ GC_ASSERT(GC_page_size != 0);
+ h_trunc = (struct hblk *)((word)h & ~(word)(GC_page_size-1));
+ h_end = (struct hblk *)(((word)(h + nblocks) + GC_page_size - 1)
+ & ~(word)(GC_page_size - 1));
+ /* Note that we cannot examine GC_dirty_pages to check */
+ /* whether the page at h_trunc has already been marked */
+ /* dirty as there could be a hash collision. */
+ for (current = h_trunc; (word)current < (word)h_end; ++current) {
+ word index = PHT_HASH(current);
+
+ if (!is_ptrfree || (word)current < (word)h
+ || (word)current >= (word)(h + nblocks)) {
+ async_set_pht_entry_from_index(GC_dirty_pages, index);
+ }
+ }
+ UNPROTECT(h_trunc, (ptr_t)h_end - (ptr_t)h_trunc);
+# else
+ /* Ignore write hints. They don't help us here. */
+ (void)h; (void)nblocks; (void)is_ptrfree;
+# endif
+ }
+#endif /* !GC_DISABLE_INCREMENTAL */
+
+#if defined(MPROTECT_VDB) && defined(DARWIN)
+/* The following sources were used as a "reference" for this exception
+ handling code:
+ 1. Apple's mach/xnu documentation
+ 2. Timothy J. Wood's "Mach Exception Handlers 101" post to the
+ omnigroup's macosx-dev list.
+ www.omnigroup.com/mailman/archive/macosx-dev/2000-June/014178.html
+ 3. macosx-nat.c from Apple's GDB source code.
+*/
+
+/* The bug that caused all this trouble should now be fixed. This should
+ eventually be removed if all goes well. */
+
+/* #define BROKEN_EXCEPTION_HANDLING */
+
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+
+EXTERN_C_BEGIN
+
+/* Some of the following prototypes are missing in any header, although */
+/* they are documented. Some are in mach/exc.h file. */
+extern boolean_t
+exc_server(mach_msg_header_t *, mach_msg_header_t *);
+
+extern kern_return_t
+exception_raise(mach_port_t, mach_port_t, mach_port_t, exception_type_t,
+ exception_data_t, mach_msg_type_number_t);
+
+extern kern_return_t
+exception_raise_state(mach_port_t, mach_port_t, mach_port_t, exception_type_t,
+ exception_data_t, mach_msg_type_number_t,
+ thread_state_flavor_t*, thread_state_t,
+ mach_msg_type_number_t, thread_state_t,
+ mach_msg_type_number_t*);
+
+extern kern_return_t
+exception_raise_state_identity(mach_port_t, mach_port_t, mach_port_t,
+ exception_type_t, exception_data_t,
+ mach_msg_type_number_t, thread_state_flavor_t*,
+ thread_state_t, mach_msg_type_number_t,
+ thread_state_t, mach_msg_type_number_t*);
+
+GC_API_OSCALL kern_return_t
+catch_exception_raise(mach_port_t exception_port, mach_port_t thread,
+ mach_port_t task, exception_type_t exception,
+ exception_data_t code,
+ mach_msg_type_number_t code_count);
+
+GC_API_OSCALL kern_return_t
+catch_exception_raise_state(mach_port_name_t exception_port,
+ int exception, exception_data_t code,
+ mach_msg_type_number_t codeCnt, int flavor,
+ thread_state_t old_state, int old_stateCnt,
+ thread_state_t new_state, int new_stateCnt);
+
+GC_API_OSCALL kern_return_t
+catch_exception_raise_state_identity(mach_port_name_t exception_port,
+ mach_port_t thread, mach_port_t task, int exception,
+ exception_data_t code, mach_msg_type_number_t codeCnt,
+ int flavor, thread_state_t old_state, int old_stateCnt,
+ thread_state_t new_state, int new_stateCnt);
+
+EXTERN_C_END
+
+/* These should never be called, but just in case... */
+GC_API_OSCALL kern_return_t
+catch_exception_raise_state(mach_port_name_t exception_port GC_ATTR_UNUSED,
+ int exception GC_ATTR_UNUSED, exception_data_t code GC_ATTR_UNUSED,
+ mach_msg_type_number_t codeCnt GC_ATTR_UNUSED, int flavor GC_ATTR_UNUSED,
+ thread_state_t old_state GC_ATTR_UNUSED, int old_stateCnt GC_ATTR_UNUSED,
+ thread_state_t new_state GC_ATTR_UNUSED, int new_stateCnt GC_ATTR_UNUSED)
+{
+ ABORT_RET("Unexpected catch_exception_raise_state invocation");
+ return(KERN_INVALID_ARGUMENT);
+}
+
+GC_API_OSCALL kern_return_t
+catch_exception_raise_state_identity(
+ mach_port_name_t exception_port GC_ATTR_UNUSED,
+ mach_port_t thread GC_ATTR_UNUSED, mach_port_t task GC_ATTR_UNUSED,
+ int exception GC_ATTR_UNUSED, exception_data_t code GC_ATTR_UNUSED,
+ mach_msg_type_number_t codeCnt GC_ATTR_UNUSED, int flavor GC_ATTR_UNUSED,
+ thread_state_t old_state GC_ATTR_UNUSED, int old_stateCnt GC_ATTR_UNUSED,
+ thread_state_t new_state GC_ATTR_UNUSED, int new_stateCnt GC_ATTR_UNUSED)
+{
+ ABORT_RET("Unexpected catch_exception_raise_state_identity invocation");
+ return(KERN_INVALID_ARGUMENT);
+}
+
+#define MAX_EXCEPTION_PORTS 16
+
+static struct {
+ mach_msg_type_number_t count;
+ exception_mask_t masks[MAX_EXCEPTION_PORTS];
+ exception_handler_t ports[MAX_EXCEPTION_PORTS];
+ exception_behavior_t behaviors[MAX_EXCEPTION_PORTS];
+ thread_state_flavor_t flavors[MAX_EXCEPTION_PORTS];
+} GC_old_exc_ports;
+
+STATIC struct ports_s {
+ void (*volatile os_callback[3])(void);
+ mach_port_t exception;
+# if defined(THREADS)
+ mach_port_t reply;
+# endif
+} GC_ports = {
+ {
+ /* This is to prevent stripping these routines as dead. */
+ (void (*)(void))catch_exception_raise,
+ (void (*)(void))catch_exception_raise_state,
+ (void (*)(void))catch_exception_raise_state_identity
+ },
+# ifdef THREADS
+ 0, /* for 'exception' */
+# endif
+ 0
+};
+
+typedef struct {
+ mach_msg_header_t head;
+} GC_msg_t;
+
+typedef enum {
+ GC_MP_NORMAL,
+ GC_MP_DISCARDING,
+ GC_MP_STOPPED
+} GC_mprotect_state_t;
+
+#ifdef THREADS
+ /* FIXME: 1 and 2 seem to be safe to use in the msgh_id field, but it */
+ /* is not documented. Use the source and see if they should be OK. */
+# define ID_STOP 1
+# define ID_RESUME 2
+
+ /* This value is only used on the reply port. */
+# define ID_ACK 3
+
+ STATIC GC_mprotect_state_t GC_mprotect_state = GC_MP_NORMAL;
+
+ /* The following should ONLY be called when the world is stopped. */
+ STATIC void GC_mprotect_thread_notify(mach_msg_id_t id)
+ {
+ struct buf_s {
+ GC_msg_t msg;
+ mach_msg_trailer_t trailer;
+ } buf;
+ mach_msg_return_t r;
+
+ /* remote, local */
+ buf.msg.head.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_MAKE_SEND, 0);
+ buf.msg.head.msgh_size = sizeof(buf.msg);
+ buf.msg.head.msgh_remote_port = GC_ports.exception;
+ buf.msg.head.msgh_local_port = MACH_PORT_NULL;
+ buf.msg.head.msgh_id = id;
+
+ r = mach_msg(&buf.msg.head, MACH_SEND_MSG | MACH_RCV_MSG | MACH_RCV_LARGE,
+ sizeof(buf.msg), sizeof(buf), GC_ports.reply,
+ MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+ if (r != MACH_MSG_SUCCESS)
+ ABORT("mach_msg failed in GC_mprotect_thread_notify");
+ if (buf.msg.head.msgh_id != ID_ACK)
+ ABORT("Invalid ack in GC_mprotect_thread_notify");
+ }
+
+ /* Should only be called by the mprotect thread */
+ STATIC void GC_mprotect_thread_reply(void)
+ {
+ GC_msg_t msg;
+ mach_msg_return_t r;
+ /* remote, local */
+
+ msg.head.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_MAKE_SEND, 0);
+ msg.head.msgh_size = sizeof(msg);
+ msg.head.msgh_remote_port = GC_ports.reply;
+ msg.head.msgh_local_port = MACH_PORT_NULL;
+ msg.head.msgh_id = ID_ACK;
+
+ r = mach_msg(&msg.head, MACH_SEND_MSG, sizeof(msg), 0, MACH_PORT_NULL,
+ MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+ if (r != MACH_MSG_SUCCESS)
+ ABORT("mach_msg failed in GC_mprotect_thread_reply");
+ }
+
+ GC_INNER void GC_mprotect_stop(void)
+ {
+ GC_mprotect_thread_notify(ID_STOP);
+ }
+
+ GC_INNER void GC_mprotect_resume(void)
+ {
+ GC_mprotect_thread_notify(ID_RESUME);
+ }
+
+# ifdef CAN_HANDLE_FORK
+ GC_INNER void GC_dirty_update_child(void)
+ {
+ GC_ASSERT(I_HOLD_LOCK());
+ if (0 == GC_task_self) return; /* GC incremental mode is off */
+
+ GC_ASSERT(GC_mprotect_state == GC_MP_NORMAL);
+ GC_task_self = mach_task_self(); /* needed by UNPROTECT() */
+ GC_unprotect_all_heap();
+
+ /* Restore the old task exception ports. */
+ /* TODO: Should we do it in fork_prepare/parent_proc? */
+ if (GC_old_exc_ports.count > 0) {
+ /* TODO: Should we check GC_old_exc_ports.count<=1? */
+ if (task_set_exception_ports(GC_task_self, GC_old_exc_ports.masks[0],
+ GC_old_exc_ports.ports[0], GC_old_exc_ports.behaviors[0],
+ GC_old_exc_ports.flavors[0]) != KERN_SUCCESS)
+ ABORT("task_set_exception_ports failed (in child)");
+ }
+
+ /* TODO: Re-enable incremental mode in child. */
+ GC_task_self = 0;
+ GC_incremental = FALSE;
+ }
+# endif /* CAN_HANDLE_FORK */
+
+#else
+ /* The compiler should optimize away any GC_mprotect_state computations */
+# define GC_mprotect_state GC_MP_NORMAL
+#endif /* !THREADS */
+
+struct mp_reply_s {
+ mach_msg_header_t head;
+ char data[256];
+};
+
+struct mp_msg_s {
+ mach_msg_header_t head;
+ mach_msg_body_t msgh_body;
+ char data[1024];
+};
+
+STATIC void *GC_mprotect_thread(void *arg)
+{
+ mach_msg_return_t r;
+ /* These two structures contain some private kernel data. We don't */
+ /* need to access any of it so we don't bother defining a proper */
+ /* struct. The correct definitions are in the xnu source code. */
+ struct mp_reply_s reply;
+ struct mp_msg_s msg;
+ mach_msg_id_t id;
+
+ if ((word)arg == GC_WORD_MAX) return 0; /* to prevent a compiler warning */
+# if defined(CPPCHECK)
+ reply.data[0] = 0; /* to prevent "field unused" warnings */
+ msg.data[0] = 0;
+# endif
+
+# if defined(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID)
+ (void)pthread_setname_np("GC-mprotect");
+# endif
+# if defined(THREADS) && !defined(GC_NO_THREADS_DISCOVERY)
+ GC_darwin_register_mach_handler_thread(mach_thread_self());
+# endif
+
+ for (;;) {
+ r = mach_msg(&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE |
+ (GC_mprotect_state == GC_MP_DISCARDING ? MACH_RCV_TIMEOUT
+ : 0), 0, sizeof(msg), GC_ports.exception,
+ GC_mprotect_state == GC_MP_DISCARDING ? 0
+ : MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+ id = r == MACH_MSG_SUCCESS ? msg.head.msgh_id : -1;
+
+# if defined(THREADS)
+ if (GC_mprotect_state == GC_MP_DISCARDING) {
+ if (r == MACH_RCV_TIMED_OUT) {
+ GC_mprotect_state = GC_MP_STOPPED;
+ GC_mprotect_thread_reply();
+ continue;
+ }
+ if (r == MACH_MSG_SUCCESS && (id == ID_STOP || id == ID_RESUME))
+ ABORT("Out of order mprotect thread request");
+ }
+# endif /* THREADS */
+
+ if (r != MACH_MSG_SUCCESS) {
+ ABORT_ARG2("mach_msg failed",
+ ": errcode= %d (%s)", (int)r, mach_error_string(r));
+ }
+
+ switch (id) {
+# if defined(THREADS)
+ case ID_STOP:
+ if (GC_mprotect_state != GC_MP_NORMAL)
+ ABORT("Called mprotect_stop when state wasn't normal");
+ GC_mprotect_state = GC_MP_DISCARDING;
+ break;
+ case ID_RESUME:
+ if (GC_mprotect_state != GC_MP_STOPPED)
+ ABORT("Called mprotect_resume when state wasn't stopped");
+ GC_mprotect_state = GC_MP_NORMAL;
+ GC_mprotect_thread_reply();
+ break;
+# endif /* THREADS */
+ default:
+ /* Handle the message (calls catch_exception_raise) */
+ if (!exc_server(&msg.head, &reply.head))
+ ABORT("exc_server failed");
+ /* Send the reply */
+ r = mach_msg(&reply.head, MACH_SEND_MSG, reply.head.msgh_size, 0,
+ MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE,
+ MACH_PORT_NULL);
+ if (r != MACH_MSG_SUCCESS) {
+ /* This will fail if the thread dies, but the thread */
+ /* shouldn't die... */
+# ifdef BROKEN_EXCEPTION_HANDLING
+ GC_err_printf("mach_msg failed with %d %s while sending "
+ "exc reply\n", (int)r, mach_error_string(r));
+# else
+ ABORT("mach_msg failed while sending exception reply");
+# endif
+ }
+ } /* switch */
+ } /* for */
+}
+
+/* All this SIGBUS code shouldn't be necessary. All protection faults should
+ be going through the mach exception handler. However, it seems a SIGBUS is
+ occasionally sent for some unknown reason. Even more odd, it seems to be
+ meaningless and safe to ignore. */
+#ifdef BROKEN_EXCEPTION_HANDLING
+
+ /* Updates to this aren't atomic, but the SIGBUS'es seem pretty rare. */
+ /* Even if this doesn't get updated property, it isn't really a problem. */
+ STATIC int GC_sigbus_count = 0;
+
+ STATIC void GC_darwin_sigbus(int num, siginfo_t *sip, void *context)
+ {
+ if (num != SIGBUS)
+ ABORT("Got a non-sigbus signal in the sigbus handler");
+
+ /* Ugh... some seem safe to ignore, but too many in a row probably means
+ trouble. GC_sigbus_count is reset for each mach exception that is
+ handled */
+ if (GC_sigbus_count >= 8) {
+ ABORT("Got more than 8 SIGBUSs in a row!");
+ } else {
+ GC_sigbus_count++;
+ WARN("Ignoring SIGBUS\n", 0);
+ }
+ }
+#endif /* BROKEN_EXCEPTION_HANDLING */
+
+GC_INNER GC_bool GC_dirty_init(void)
+{
+ kern_return_t r;
+ mach_port_t me;
+ pthread_t thread;
+ pthread_attr_t attr;
+ exception_mask_t mask;
+
+# if defined(CAN_HANDLE_FORK) && !defined(THREADS)
+ if (GC_handle_fork) {
+ /* To both support GC incremental mode and GC functions usage in */
+ /* the forked child, pthread_atfork should be used to install */
+ /* handlers that switch off GC_incremental in the child */
+ /* gracefully (unprotecting all pages and clearing */
+ /* GC_mach_handler_thread). For now, we just disable incremental */
+ /* mode if fork() handling is requested by the client. */
+ WARN("Can't turn on GC incremental mode as fork()"
+ " handling requested\n", 0);
+ return FALSE;
+ }
+# endif
+
+ GC_VERBOSE_LOG_PRINTF("Initializing mach/darwin mprotect"
+ " virtual dirty bit implementation\n");
+# ifdef BROKEN_EXCEPTION_HANDLING
+ WARN("Enabling workarounds for various darwin "
+ "exception handling bugs\n", 0);
+# endif
+ if (GC_page_size % HBLKSIZE != 0) {
+ ABORT("Page size not multiple of HBLKSIZE");
+ }
+
+ GC_task_self = me = mach_task_self();
+ GC_ASSERT(me != 0);
+
+ r = mach_port_allocate(me, MACH_PORT_RIGHT_RECEIVE, &GC_ports.exception);
+ /* TODO: WARN and return FALSE in case of a failure. */
+ if (r != KERN_SUCCESS)
+ ABORT("mach_port_allocate failed (exception port)");
+
+ r = mach_port_insert_right(me, GC_ports.exception, GC_ports.exception,
+ MACH_MSG_TYPE_MAKE_SEND);
+ if (r != KERN_SUCCESS)
+ ABORT("mach_port_insert_right failed (exception port)");
+
+# if defined(THREADS)
+ r = mach_port_allocate(me, MACH_PORT_RIGHT_RECEIVE, &GC_ports.reply);
+ if(r != KERN_SUCCESS)
+ ABORT("mach_port_allocate failed (reply port)");
+# endif
+
+ /* The exceptions we want to catch. */
+ mask = EXC_MASK_BAD_ACCESS;
+ r = task_get_exception_ports(me, mask, GC_old_exc_ports.masks,
+ &GC_old_exc_ports.count, GC_old_exc_ports.ports,
+ GC_old_exc_ports.behaviors,
+ GC_old_exc_ports.flavors);
+ if (r != KERN_SUCCESS)
+ ABORT("task_get_exception_ports failed");
+
+ r = task_set_exception_ports(me, mask, GC_ports.exception, EXCEPTION_DEFAULT,
+ GC_MACH_THREAD_STATE);
+ if (r != KERN_SUCCESS)
+ ABORT("task_set_exception_ports failed");
+
+ if (pthread_attr_init(&attr) != 0)
+ ABORT("pthread_attr_init failed");
+ if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0)
+ ABORT("pthread_attr_setdetachedstate failed");
+ /* This will call the real pthread function, not our wrapper. */
+ if (GC_inner_pthread_create(&thread, &attr, GC_mprotect_thread, NULL) != 0)
+ ABORT("pthread_create failed");
+ (void)pthread_attr_destroy(&attr);
+
+ /* Setup the sigbus handler for ignoring the meaningless SIGBUSs */
+# ifdef BROKEN_EXCEPTION_HANDLING
+ {
+ struct sigaction sa, oldsa;
+ sa.sa_handler = (SIG_HNDLR_PTR)GC_darwin_sigbus;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_RESTART|SA_SIGINFO;
+ /* sa.sa_restorer is deprecated and should not be initialized. */
+ if (sigaction(SIGBUS, &sa, &oldsa) < 0)
+ ABORT("sigaction failed");
+ if (oldsa.sa_handler != (SIG_HNDLR_PTR)(signed_word)SIG_DFL) {
+ GC_VERBOSE_LOG_PRINTF("Replaced other SIGBUS handler\n");
+ }
+ }
+# endif /* BROKEN_EXCEPTION_HANDLING */
+# if defined(CPPCHECK)
+ GC_noop1((word)GC_ports.os_callback[0]);
+# endif
+ return TRUE;
+}
+
+/* The source code for Apple's GDB was used as a reference for the */
+/* exception forwarding code. This code is similar to be GDB code only */
+/* because there is only one way to do it. */
+STATIC kern_return_t GC_forward_exception(mach_port_t thread, mach_port_t task,
+ exception_type_t exception,
+ exception_data_t data,
+ mach_msg_type_number_t data_count)
+{
+ unsigned int i;
+ kern_return_t r;
+ mach_port_t port;
+ exception_behavior_t behavior;
+ thread_state_flavor_t flavor;
+
+ thread_state_data_t thread_state;
+ mach_msg_type_number_t thread_state_count = THREAD_STATE_MAX;
+
+ for (i = 0; i < GC_old_exc_ports.count; i++) {
+ if ((GC_old_exc_ports.masks[i] & ((exception_mask_t)1 << exception)) != 0)
+ break;
+ }
+ if (i == GC_old_exc_ports.count)
+ ABORT("No handler for exception!");
+
+ port = GC_old_exc_ports.ports[i];
+ behavior = GC_old_exc_ports.behaviors[i];
+ flavor = GC_old_exc_ports.flavors[i];
+
+ if (behavior == EXCEPTION_STATE || behavior == EXCEPTION_STATE_IDENTITY) {
+ r = thread_get_state(thread, flavor, thread_state, &thread_state_count);
+ if (r != KERN_SUCCESS)
+ ABORT("thread_get_state failed in forward_exception");
+ }
+
+ switch (behavior) {
+ case EXCEPTION_STATE:
+ r = exception_raise_state(port, thread, task, exception, data,
+ data_count, &flavor, thread_state,
+ thread_state_count, thread_state,
+ &thread_state_count);
+ break;
+ case EXCEPTION_STATE_IDENTITY:
+ r = exception_raise_state_identity(port, thread, task, exception, data,
+ data_count, &flavor, thread_state,
+ thread_state_count, thread_state,
+ &thread_state_count);
+ break;
+ /* case EXCEPTION_DEFAULT: */ /* default signal handlers */
+ default: /* user-supplied signal handlers */
+ r = exception_raise(port, thread, task, exception, data, data_count);
+ }
+
+ if (behavior == EXCEPTION_STATE || behavior == EXCEPTION_STATE_IDENTITY) {
+ r = thread_set_state(thread, flavor, thread_state, thread_state_count);
+ if (r != KERN_SUCCESS)
+ ABORT("thread_set_state failed in forward_exception");
+ }
+ return r;
+}
+
+#define FWD() GC_forward_exception(thread, task, exception, code, code_count)
+
+#ifdef ARM32
+# define DARWIN_EXC_STATE ARM_EXCEPTION_STATE
+# define DARWIN_EXC_STATE_COUNT ARM_EXCEPTION_STATE_COUNT
+# define DARWIN_EXC_STATE_T arm_exception_state_t
+# define DARWIN_EXC_STATE_DAR THREAD_FLD_NAME(far)
+#elif defined(AARCH64)
+# define DARWIN_EXC_STATE ARM_EXCEPTION_STATE64
+# define DARWIN_EXC_STATE_COUNT ARM_EXCEPTION_STATE64_COUNT
+# define DARWIN_EXC_STATE_T arm_exception_state64_t
+# define DARWIN_EXC_STATE_DAR THREAD_FLD_NAME(far)
+#elif defined(POWERPC)
+# if CPP_WORDSZ == 32
+# define DARWIN_EXC_STATE PPC_EXCEPTION_STATE
+# define DARWIN_EXC_STATE_COUNT PPC_EXCEPTION_STATE_COUNT
+# define DARWIN_EXC_STATE_T ppc_exception_state_t
+# else
+# define DARWIN_EXC_STATE PPC_EXCEPTION_STATE64
+# define DARWIN_EXC_STATE_COUNT PPC_EXCEPTION_STATE64_COUNT
+# define DARWIN_EXC_STATE_T ppc_exception_state64_t
+# endif
+# define DARWIN_EXC_STATE_DAR THREAD_FLD_NAME(dar)
+#elif defined(I386) || defined(X86_64)
+# if CPP_WORDSZ == 32
+# if defined(i386_EXCEPTION_STATE_COUNT) \
+ && !defined(x86_EXCEPTION_STATE32_COUNT)
+ /* Use old naming convention for 32-bit x86. */
+# define DARWIN_EXC_STATE i386_EXCEPTION_STATE
+# define DARWIN_EXC_STATE_COUNT i386_EXCEPTION_STATE_COUNT
+# define DARWIN_EXC_STATE_T i386_exception_state_t
+# else
+# define DARWIN_EXC_STATE x86_EXCEPTION_STATE32
+# define DARWIN_EXC_STATE_COUNT x86_EXCEPTION_STATE32_COUNT
+# define DARWIN_EXC_STATE_T x86_exception_state32_t
+# endif
+# else
+# define DARWIN_EXC_STATE x86_EXCEPTION_STATE64
+# define DARWIN_EXC_STATE_COUNT x86_EXCEPTION_STATE64_COUNT
+# define DARWIN_EXC_STATE_T x86_exception_state64_t
+# endif
+# define DARWIN_EXC_STATE_DAR THREAD_FLD_NAME(faultvaddr)
+#elif !defined(CPPCHECK)
+# error FIXME for non-arm/ppc/x86 darwin
+#endif
+
+/* This violates the namespace rules but there isn't anything that can */
+/* be done about it. The exception handling stuff is hard coded to */
+/* call this. catch_exception_raise, catch_exception_raise_state and */
+/* and catch_exception_raise_state_identity are called from OS. */
+GC_API_OSCALL kern_return_t
+catch_exception_raise(mach_port_t exception_port GC_ATTR_UNUSED,
+ mach_port_t thread, mach_port_t task GC_ATTR_UNUSED,
+ exception_type_t exception, exception_data_t code,
+ mach_msg_type_number_t code_count GC_ATTR_UNUSED)
+{
+ kern_return_t r;
+ char *addr;
+ thread_state_flavor_t flavor = DARWIN_EXC_STATE;
+ mach_msg_type_number_t exc_state_count = DARWIN_EXC_STATE_COUNT;
+ DARWIN_EXC_STATE_T exc_state;
+
+ if (exception != EXC_BAD_ACCESS || code[0] != KERN_PROTECTION_FAILURE) {
+# ifdef DEBUG_EXCEPTION_HANDLING
+ /* We aren't interested, pass it on to the old handler */
+ GC_log_printf("Exception: 0x%x Code: 0x%x 0x%x in catch...\n",
+ exception, code_count > 0 ? code[0] : -1,
+ code_count > 1 ? code[1] : -1);
+# endif
+ return FWD();
+ }
+
+ r = thread_get_state(thread, flavor, (natural_t*)&exc_state,
+ &exc_state_count);
+ if (r != KERN_SUCCESS) {
+ /* The thread is supposed to be suspended while the exception */
+ /* handler is called. This shouldn't fail. */
+# ifdef BROKEN_EXCEPTION_HANDLING
+ GC_err_printf("thread_get_state failed in catch_exception_raise\n");
+ return KERN_SUCCESS;
+# else
+ ABORT("thread_get_state failed in catch_exception_raise");
+# endif
+ }
+
+ /* This is the address that caused the fault */
+ addr = (char*) exc_state.DARWIN_EXC_STATE_DAR;
+ if (!is_header_found_async(addr)) {
+ /* Ugh... just like the SIGBUS problem above, it seems we get */
+ /* a bogus KERN_PROTECTION_FAILURE every once and a while. We wait */
+ /* till we get a bunch in a row before doing anything about it. */
+ /* If a "real" fault ever occurs it'll just keep faulting over and */
+ /* over and we'll hit the limit pretty quickly. */
+# ifdef BROKEN_EXCEPTION_HANDLING
+ static char *last_fault;
+ static int last_fault_count;
+
+ if (addr != last_fault) {
+ last_fault = addr;
+ last_fault_count = 0;
+ }
+ if (++last_fault_count < 32) {
+ if (last_fault_count == 1)
+ WARN("Ignoring KERN_PROTECTION_FAILURE at %p\n", addr);
+ return KERN_SUCCESS;
+ }
+
+ GC_err_printf("Unexpected KERN_PROTECTION_FAILURE at %p; aborting...\n",
+ (void *)addr);
+ /* Can't pass it along to the signal handler because that is */
+ /* ignoring SIGBUS signals. We also shouldn't call ABORT here as */
+ /* signals don't always work too well from the exception handler. */
+ EXIT();
+# else /* BROKEN_EXCEPTION_HANDLING */
+ /* Pass it along to the next exception handler
+ (which should call SIGBUS/SIGSEGV) */
+ return FWD();
+# endif /* !BROKEN_EXCEPTION_HANDLING */
+ }
+
+# ifdef BROKEN_EXCEPTION_HANDLING
+ /* Reset the number of consecutive SIGBUSs */
+ GC_sigbus_count = 0;
+# endif
+
+ GC_ASSERT(GC_page_size != 0);
+ if (GC_mprotect_state == GC_MP_NORMAL) { /* common case */
+ struct hblk * h = (struct hblk *)((word)addr & ~(word)(GC_page_size-1));
+ size_t i;
+
+# ifdef CHECKSUMS
+ GC_record_fault(h);
+# endif
+ UNPROTECT(h, GC_page_size);
+ for (i = 0; i < divHBLKSZ(GC_page_size); i++) {
+ word index = PHT_HASH(h+i);
+ async_set_pht_entry_from_index(GC_dirty_pages, index);
+ }
+ } else if (GC_mprotect_state == GC_MP_DISCARDING) {
+ /* Lie to the thread for now. No sense UNPROTECT()ing the memory
+ when we're just going to PROTECT() it again later. The thread
+ will just fault again once it resumes */
+ } else {
+ /* Shouldn't happen, i don't think */
+ GC_err_printf("KERN_PROTECTION_FAILURE while world is stopped\n");
+ return FWD();
+ }
+ return KERN_SUCCESS;
+}
+#undef FWD
+
+#ifndef NO_DESC_CATCH_EXCEPTION_RAISE
+ /* These symbols should have REFERENCED_DYNAMICALLY (0x10) bit set to */
+ /* let strip know they are not to be stripped. */
+ __asm__(".desc _catch_exception_raise, 0x10");
+ __asm__(".desc _catch_exception_raise_state, 0x10");
+ __asm__(".desc _catch_exception_raise_state_identity, 0x10");
+#endif
+
+#endif /* DARWIN && MPROTECT_VDB */
+
+#ifndef HAVE_INCREMENTAL_PROTECTION_NEEDS
+ GC_API int GC_CALL GC_incremental_protection_needs(void)
+ {
+ GC_ASSERT(GC_is_initialized);
+ return GC_PROTECTS_NONE;
+ }
+#endif /* !HAVE_INCREMENTAL_PROTECTION_NEEDS */
+
+#ifdef ECOS
+ /* Undo sbrk() redirection. */
+# undef sbrk
+#endif
+
+/* If value is non-zero then allocate executable memory. */
+GC_API void GC_CALL GC_set_pages_executable(int value)
+{
+ GC_ASSERT(!GC_is_initialized);
+ /* Even if IGNORE_PAGES_EXECUTABLE is defined, GC_pages_executable is */
+ /* touched here to prevent a compiler warning. */
+ GC_pages_executable = (GC_bool)(value != 0);
+}
+
+/* Returns non-zero if the GC-allocated memory is executable. */
+/* GC_get_pages_executable is defined after all the places */
+/* where GC_get_pages_executable is undefined. */
+GC_API int GC_CALL GC_get_pages_executable(void)
+{
+# ifdef IGNORE_PAGES_EXECUTABLE
+ return 1; /* Always allocate executable memory. */
+# else
+ return (int)GC_pages_executable;
+# endif
+}
+
+/* Call stack save code for debugging. Should probably be in */
+/* mach_dep.c, but that requires reorganization. */
+
+/* I suspect the following works for most *nix x86 variants, so */
+/* long as the frame pointer is explicitly stored. In the case of gcc, */
+/* compiler flags (e.g. -fomit-frame-pointer) determine whether it is. */
+#if defined(I386) && defined(LINUX) && defined(SAVE_CALL_CHAIN)
+# include <features.h>
+
+ struct frame {
+ struct frame *fr_savfp;
+ long fr_savpc;
+# if NARGS > 0
+ long fr_arg[NARGS]; /* All the arguments go here. */
+# endif
+ };
+#endif
+
+#if defined(SPARC)
+# if defined(LINUX)
+# include <features.h>
+
+# if defined(SAVE_CALL_CHAIN)
+ struct frame {
+ long fr_local[8];
+ long fr_arg[6];
+ struct frame *fr_savfp;
+ long fr_savpc;
+# ifndef __arch64__
+ char *fr_stret;
+# endif
+ long fr_argd[6];
+ long fr_argx[0];
+ };
+# endif
+# elif defined (DRSNX)
+# include <sys/sparc/frame.h>
+# elif defined(OPENBSD)
+# include <frame.h>
+# elif defined(FREEBSD) || defined(NETBSD)
+# include <machine/frame.h>
+# else
+# include <sys/frame.h>
+# endif
+# if NARGS > 6
+# error We only know how to get the first 6 arguments
+# endif
+#endif /* SPARC */
+
+#ifdef NEED_CALLINFO
+/* Fill in the pc and argument information for up to NFRAMES of my */
+/* callers. Ignore my frame and my callers frame. */
+
+#ifdef LINUX
+# include <unistd.h>
+#endif
+
+#endif /* NEED_CALLINFO */
+
+#if defined(GC_HAVE_BUILTIN_BACKTRACE)
+# ifdef _MSC_VER
+# include "private/msvc_dbg.h"
+# else
+# include <execinfo.h>
+# endif
+#endif
+
+#ifdef SAVE_CALL_CHAIN
+
+#if NARGS == 0 && NFRAMES % 2 == 0 /* No padding */ \
+ && defined(GC_HAVE_BUILTIN_BACKTRACE)
+
+#ifdef REDIRECT_MALLOC
+ /* Deal with possible malloc calls in backtrace by omitting */
+ /* the infinitely recursing backtrace. */
+# ifdef THREADS
+ __thread /* If your compiler doesn't understand this */
+ /* you could use something like pthread_getspecific. */
+# endif
+ GC_bool GC_in_save_callers = FALSE;
+
+# if defined(THREADS) && defined(DBG_HDRS_ALL)
+# include "private/dbg_mlc.h"
+
+ /* A dummy version of GC_save_callers() which does not call */
+ /* backtrace(). */
+ GC_INNER void GC_save_callers_no_unlock(struct callinfo info[NFRAMES])
+ {
+ GC_ASSERT(I_HOLD_LOCK());
+ info[0].ci_pc = (word)(&GC_save_callers_no_unlock);
+ BZERO(&info[1], sizeof(void *) * (NFRAMES - 1));
+ }
+# endif
+#endif /* REDIRECT_MALLOC */
+
+GC_INNER void GC_save_callers(struct callinfo info[NFRAMES])
+{
+ void * tmp_info[NFRAMES + 1];
+ int npcs, i;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ /* backtrace may call dl_iterate_phdr which is also */
+ /* used by GC_register_dynamic_libraries, and */
+ /* dl_iterate_phdr is not guaranteed to be reentrant. */
+
+ GC_STATIC_ASSERT(sizeof(struct callinfo) == sizeof(void *));
+# ifdef REDIRECT_MALLOC
+ if (GC_in_save_callers) {
+ info[0].ci_pc = (word)(&GC_save_callers);
+ for (i = 1; i < NFRAMES; ++i) info[i].ci_pc = 0;
+ return;
+ }
+ GC_in_save_callers = TRUE;
+ /* backtrace() might call a redirected malloc. */
+ UNLOCK();
+ npcs = backtrace((void **)tmp_info, NFRAMES + 1);
+ LOCK();
+# else
+ npcs = backtrace((void **)tmp_info, NFRAMES + 1);
+# endif
+ /* We retrieve NFRAMES+1 pc values, but discard the first one, since */
+ /* it points to our own frame. */
+ i = 0;
+ if (npcs > 1) {
+ i = npcs - 1;
+ BCOPY(&tmp_info[1], info, (unsigned)i * sizeof(void *));
+ }
+ for (; i < NFRAMES; ++i) info[i].ci_pc = 0;
+# ifdef REDIRECT_MALLOC
+ GC_in_save_callers = FALSE;
+# endif
+}
+
+#else /* No builtin backtrace; do it ourselves */
+
+#if (defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD)) && defined(SPARC)
+# define FR_SAVFP fr_fp
+# define FR_SAVPC fr_pc
+#else
+# define FR_SAVFP fr_savfp
+# define FR_SAVPC fr_savpc
+#endif
+
+#if defined(SPARC) && (defined(__arch64__) || defined(__sparcv9))
+# define BIAS 2047
+#else
+# define BIAS 0
+#endif
+
+GC_INNER void GC_save_callers(struct callinfo info[NFRAMES])
+{
+ struct frame *frame;
+ struct frame *fp;
+ int nframes = 0;
+# ifdef I386
+ /* We assume this is turned on only with gcc as the compiler. */
+ asm("movl %%ebp,%0" : "=r"(frame));
+ fp = frame;
+# else
+ frame = (struct frame *)GC_save_regs_in_stack();
+ fp = (struct frame *)((long) frame -> FR_SAVFP + BIAS);
+#endif
+
+ for (; !((word)fp HOTTER_THAN (word)frame)
+# ifndef THREADS
+ && !((word)GC_stackbottom HOTTER_THAN (word)fp)
+# elif defined(STACK_GROWS_UP)
+ && fp != NULL
+# endif
+ && nframes < NFRAMES;
+ fp = (struct frame *)((long) fp -> FR_SAVFP + BIAS), nframes++) {
+# if NARGS > 0
+ int i;
+# endif
+
+ info[nframes].ci_pc = fp->FR_SAVPC;
+# if NARGS > 0
+ for (i = 0; i < NARGS; i++) {
+ info[nframes].ci_arg[i] = ~(fp->fr_arg[i]);
+ }
+# endif /* NARGS > 0 */
+ }
+ if (nframes < NFRAMES) info[nframes].ci_pc = 0;
+}
+
+#endif /* No builtin backtrace */
+
+#endif /* SAVE_CALL_CHAIN */
+
+#ifdef NEED_CALLINFO
+
+/* Print info to stderr. We do NOT hold the allocation lock */
+GC_INNER void GC_print_callers(struct callinfo info[NFRAMES])
+{
+ int i;
+ static int reentry_count = 0;
+ DCL_LOCK_STATE;
+
+ /* FIXME: This should probably use a different lock, so that we */
+ /* become callable with or without the allocation lock. */
+ LOCK();
+ ++reentry_count;
+ UNLOCK();
+
+# if NFRAMES == 1
+ GC_err_printf("\tCaller at allocation:\n");
+# else
+ GC_err_printf("\tCall chain at allocation:\n");
+# endif
+ for (i = 0; i < NFRAMES; i++) {
+# if defined(LINUX) && !defined(SMALL_CONFIG)
+ GC_bool stop = FALSE;
+# endif
+
+ if (0 == info[i].ci_pc)
+ break;
+# if NARGS > 0
+ {
+ int j;
+
+ GC_err_printf("\t\targs: ");
+ for (j = 0; j < NARGS; j++) {
+ if (j != 0) GC_err_printf(", ");
+ GC_err_printf("%d (0x%X)", ~(info[i].ci_arg[j]),
+ ~(info[i].ci_arg[j]));
+ }
+ GC_err_printf("\n");
+ }
+# endif
+ if (reentry_count > 1) {
+ /* We were called during an allocation during */
+ /* a previous GC_print_callers call; punt. */
+ GC_err_printf("\t\t##PC##= 0x%lx\n",
+ (unsigned long)info[i].ci_pc);
+ continue;
+ }
+ {
+ char buf[40];
+ char *name;
+# if defined(GC_HAVE_BUILTIN_BACKTRACE) \
+ && !defined(GC_BACKTRACE_SYMBOLS_BROKEN)
+ char **sym_name =
+ backtrace_symbols((void **)(&(info[i].ci_pc)), 1);
+ if (sym_name != NULL) {
+ name = sym_name[0];
+ } else
+# endif
+ /* else */ {
+ (void)snprintf(buf, sizeof(buf), "##PC##= 0x%lx",
+ (unsigned long)info[i].ci_pc);
+ buf[sizeof(buf) - 1] = '\0';
+ name = buf;
+ }
+# if defined(LINUX) && !defined(SMALL_CONFIG)
+ /* Try for a line number. */
+ do {
+ FILE *pipe;
+# define EXE_SZ 100
+ static char exe_name[EXE_SZ];
+# define CMD_SZ 200
+ char cmd_buf[CMD_SZ];
+# define RESULT_SZ 200
+ static char result_buf[RESULT_SZ];
+ size_t result_len;
+ char *old_preload;
+# define PRELOAD_SZ 200
+ char preload_buf[PRELOAD_SZ];
+ static GC_bool found_exe_name = FALSE;
+ static GC_bool will_fail = FALSE;
+
+ /* Try to get it via a hairy and expensive scheme. */
+ /* First we get the name of the executable: */
+ if (will_fail)
+ break;
+ if (!found_exe_name) {
+ int ret_code = readlink("/proc/self/exe", exe_name, EXE_SZ);
+
+ if (ret_code < 0 || ret_code >= EXE_SZ
+ || exe_name[0] != '/') {
+ will_fail = TRUE; /* Don't try again. */
+ break;
+ }
+ exe_name[ret_code] = '\0';
+ found_exe_name = TRUE;
+ }
+ /* Then we use popen to start addr2line -e <exe> <addr> */
+ /* There are faster ways to do this, but hopefully this */
+ /* isn't time critical. */
+ (void)snprintf(cmd_buf, sizeof(cmd_buf),
+ "/usr/bin/addr2line -f -e %s 0x%lx",
+ exe_name, (unsigned long)info[i].ci_pc);
+ cmd_buf[sizeof(cmd_buf) - 1] = '\0';
+ old_preload = GETENV("LD_PRELOAD");
+ if (0 != old_preload) {
+ size_t old_len = strlen(old_preload);
+ if (old_len >= PRELOAD_SZ) {
+ will_fail = TRUE;
+ break;
+ }
+ BCOPY(old_preload, preload_buf, old_len + 1);
+ unsetenv ("LD_PRELOAD");
+ }
+ pipe = popen(cmd_buf, "r");
+ if (0 != old_preload
+ && 0 != setenv ("LD_PRELOAD", preload_buf, 0)) {
+ WARN("Failed to reset LD_PRELOAD\n", 0);
+ }
+ if (NULL == pipe) {
+ will_fail = TRUE;
+ break;
+ }
+ result_len = fread(result_buf, 1, RESULT_SZ - 1, pipe);
+ (void)pclose(pipe);
+ if (0 == result_len) {
+ will_fail = TRUE;
+ break;
+ }
+ if (result_buf[result_len - 1] == '\n') --result_len;
+ result_buf[result_len] = 0;
+ if (result_buf[0] == '?'
+ || (result_buf[result_len-2] == ':'
+ && result_buf[result_len-1] == '0'))
+ break;
+ /* Get rid of embedded newline, if any. Test for "main" */
+ {
+ char * nl = strchr(result_buf, '\n');
+ if (nl != NULL
+ && (word)nl < (word)(result_buf + result_len)) {
+ *nl = ':';
+ }
+ if (strncmp(result_buf, "main",
+ nl != NULL
+ ? (size_t)((word)nl /* a cppcheck workaround */
+ - COVERT_DATAFLOW(result_buf))
+ : result_len) == 0) {
+ stop = TRUE;
+ }
+ }
+ if (result_len < RESULT_SZ - 25) {
+ /* Add in hex address */
+ (void)snprintf(&result_buf[result_len],
+ sizeof(result_buf) - result_len,
+ " [0x%lx]", (unsigned long)info[i].ci_pc);
+ result_buf[sizeof(result_buf) - 1] = '\0';
+ }
+# if defined(CPPCHECK)
+ GC_noop1((unsigned char)name[0]);
+ /* name computed previously is discarded */
+# endif
+ name = result_buf;
+ } while (0);
+# endif /* LINUX */
+ GC_err_printf("\t\t%s\n", name);
+# if defined(GC_HAVE_BUILTIN_BACKTRACE) \
+ && !defined(GC_BACKTRACE_SYMBOLS_BROKEN)
+ if (sym_name != NULL)
+ free(sym_name); /* May call GC_[debug_]free; that's OK */
+# endif
+ }
+# if defined(LINUX) && !defined(SMALL_CONFIG)
+ if (stop)
+ break;
+# endif
+ }
+ LOCK();
+ --reentry_count;
+ UNLOCK();
+}
+
+#endif /* NEED_CALLINFO */
+
+#if defined(LINUX) && defined(__ELF__) && !defined(SMALL_CONFIG)
+ /* Dump /proc/self/maps to GC_stderr, to enable looking up names for */
+ /* addresses in FIND_LEAK output. */
+ void GC_print_address_map(void)
+ {
+ const char *maps = GC_get_maps();
+
+ GC_err_printf("---------- Begin address map ----------\n");
+ GC_err_puts(maps);
+ GC_err_printf("---------- End address map ----------\n");
+ }
+#endif /* LINUX && ELF */
diff --git a/graphics/asymptote/gc/pthread_start.c b/graphics/asymptote/gc/pthread_start.c
new file mode 100644
index 0000000000..202dfeea88
--- /dev/null
+++ b/graphics/asymptote/gc/pthread_start.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2010 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* We want to make sure that GC_thread_exit_proc() is unconditionally */
+/* invoked, even if the client is not compiled with -fexceptions, but */
+/* the GC is. The workaround is to put GC_inner_start_routine() in its */
+/* own file (pthread_start.c), and undefine __EXCEPTIONS in the GCC */
+/* case at the top of the file. FIXME: it's still unclear whether this */
+/* will actually cause the exit handler to be invoked last when */
+/* thread_exit is called (and if -fexceptions is used). */
+#if !defined(DONT_UNDEF_EXCEPTIONS) && defined(__GNUC__) && defined(__linux__)
+ /* We undefine __EXCEPTIONS to avoid using GCC __cleanup__ attribute. */
+ /* The current NPTL implementation of pthread_cleanup_push uses */
+ /* __cleanup__ attribute when __EXCEPTIONS is defined (-fexceptions). */
+ /* The stack unwinding and cleanup with __cleanup__ attributes work */
+ /* correctly when everything is compiled with -fexceptions, but it is */
+ /* not the requirement for this library clients to use -fexceptions */
+ /* everywhere. With __EXCEPTIONS undefined, the cleanup routines are */
+ /* registered with __pthread_register_cancel thus should work anyway. */
+# undef __EXCEPTIONS
+#endif
+
+#include "private/pthread_support.h"
+
+#if defined(GC_PTHREADS) && !defined(GC_WIN32_THREADS)
+
+#include <pthread.h>
+#include <sched.h>
+
+/* Invoked from GC_start_routine(). */
+GC_INNER_PTHRSTART void * GC_CALLBACK GC_inner_start_routine(
+ struct GC_stack_base *sb, void *arg)
+{
+ void * (*start)(void *);
+ void * start_arg;
+ void * result;
+ volatile GC_thread me =
+ GC_start_rtn_prepare_thread(&start, &start_arg, sb, arg);
+
+# ifndef NACL
+ pthread_cleanup_push(GC_thread_exit_proc, me);
+# endif
+ result = (*start)(start_arg);
+# if defined(DEBUG_THREADS) && !defined(GC_PTHREAD_START_STANDALONE)
+ GC_log_printf("Finishing thread %p\n", (void *)pthread_self());
+# endif
+ me -> status = result;
+ GC_end_stubborn_change(me); /* cannot use GC_dirty */
+ /* Cleanup acquires lock, ensuring that we can't exit while */
+ /* a collection that thinks we're alive is trying to stop us. */
+# ifdef NACL
+ GC_thread_exit_proc((void *)me);
+# else
+ pthread_cleanup_pop(1);
+# endif
+ return result;
+}
+
+#endif /* GC_PTHREADS */
diff --git a/graphics/asymptote/gc/pthread_stop_world.c b/graphics/asymptote/gc/pthread_stop_world.c
new file mode 100644
index 0000000000..f903f6fe2c
--- /dev/null
+++ b/graphics/asymptote/gc/pthread_stop_world.c
@@ -0,0 +1,1472 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2009 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ * Copyright (c) 2008-2020 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/pthread_support.h"
+
+#if defined(GC_PTHREADS) && !defined(GC_WIN32_THREADS) && \
+ !defined(GC_DARWIN_THREADS) && !defined(PLATFORM_STOP_WORLD) \
+ && !defined(SN_TARGET_PSP2)
+
+#ifdef NACL
+# include <unistd.h>
+# include <sys/time.h>
+#elif defined(GC_OPENBSD_UTHREADS)
+# include <pthread_np.h>
+#else
+# include <signal.h>
+# include <semaphore.h>
+# include <errno.h>
+# include <time.h> /* for nanosleep() */
+# include <unistd.h>
+#endif /* !GC_OPENBSD_UTHREADS && !NACL */
+
+#ifndef GC_OPENBSD_UTHREADS
+ GC_INLINE void GC_usleep(unsigned us)
+ {
+# if defined(LINT2) || defined(THREAD_SANITIZER)
+ /* Workaround "waiting while holding a lock" static analyzer warning. */
+ /* Workaround a rare hang in usleep() trying to acquire TSan Lock. */
+ while (us-- > 0)
+ sched_yield(); /* pretending it takes 1us */
+# elif defined(CPPCHECK) /* || _POSIX_C_SOURCE >= 199309L */
+ struct timespec ts;
+
+ ts.tv_sec = 0;
+ ts.tv_nsec = us * 1000;
+ /* This requires _POSIX_TIMERS feature. */
+ (void)nanosleep(&ts, NULL);
+# else
+ usleep(us);
+# endif
+ }
+#endif /* !GC_OPENBSD_UTHREADS */
+
+#ifdef NACL
+
+ STATIC int GC_nacl_num_gc_threads = 0;
+ STATIC __thread int GC_nacl_thread_idx = -1;
+ STATIC volatile int GC_nacl_park_threads_now = 0;
+ STATIC volatile pthread_t GC_nacl_thread_parker = -1;
+
+ GC_INNER __thread GC_thread GC_nacl_gc_thread_self = NULL;
+
+ volatile int GC_nacl_thread_parked[MAX_NACL_GC_THREADS];
+ int GC_nacl_thread_used[MAX_NACL_GC_THREADS];
+
+#elif !defined(GC_OPENBSD_UTHREADS)
+
+#if (!defined(AO_HAVE_load_acquire) || !defined(AO_HAVE_store_release)) \
+ && !defined(CPPCHECK)
+# error AO_load_acquire and/or AO_store_release are missing;
+# error please define AO_REQUIRE_CAS manually
+#endif
+
+/* It's safe to call original pthread_sigmask() here. */
+#undef pthread_sigmask
+
+#ifdef DEBUG_THREADS
+# ifndef NSIG
+# ifdef CPPCHECK
+# define NSIG 32
+# elif defined(MAXSIG)
+# define NSIG (MAXSIG+1)
+# elif defined(_NSIG)
+# define NSIG _NSIG
+# elif defined(__SIGRTMAX)
+# define NSIG (__SIGRTMAX+1)
+# else
+# error define NSIG
+# endif
+# endif /* !NSIG */
+
+ void GC_print_sig_mask(void)
+ {
+ sigset_t blocked;
+ int i;
+
+ if (pthread_sigmask(SIG_BLOCK, NULL, &blocked) != 0)
+ ABORT("pthread_sigmask failed");
+ for (i = 1; i < NSIG; i++) {
+ if (sigismember(&blocked, i))
+ GC_printf("Signal blocked: %d\n", i);
+ }
+ }
+#endif /* DEBUG_THREADS */
+
+/* Remove the signals that we want to allow in thread stopping */
+/* handler from a set. */
+STATIC void GC_remove_allowed_signals(sigset_t *set)
+{
+ if (sigdelset(set, SIGINT) != 0
+ || sigdelset(set, SIGQUIT) != 0
+ || sigdelset(set, SIGABRT) != 0
+ || sigdelset(set, SIGTERM) != 0) {
+ ABORT("sigdelset failed");
+ }
+
+# ifdef MPROTECT_VDB
+ /* Handlers write to the thread structure, which is in the heap, */
+ /* and hence can trigger a protection fault. */
+ if (sigdelset(set, SIGSEGV) != 0
+# ifdef HAVE_SIGBUS
+ || sigdelset(set, SIGBUS) != 0
+# endif
+ ) {
+ ABORT("sigdelset failed");
+ }
+# endif
+}
+
+static sigset_t suspend_handler_mask;
+
+#define THREAD_RESTARTED 0x1
+
+STATIC volatile AO_t GC_stop_count = 0;
+ /* Incremented by two (not to alter */
+ /* THREAD_RESTARTED bit) at the beginning of */
+ /* GC_stop_world. */
+
+STATIC volatile AO_t GC_world_is_stopped = FALSE;
+ /* FALSE ==> it is safe for threads to restart, */
+ /* i.e. they will see another suspend signal */
+ /* before they are expected to stop (unless */
+ /* they have stopped voluntarily). */
+
+#ifndef NO_RETRY_SIGNALS
+ /* Any platform could lose signals, so let's be conservative and */
+ /* always enable signals retry logic. */
+ STATIC GC_bool GC_retry_signals = TRUE;
+#else
+ STATIC GC_bool GC_retry_signals = FALSE;
+#endif
+
+/*
+ * We use signals to stop threads during GC.
+ *
+ * Suspended threads wait in signal handler for SIG_THR_RESTART.
+ * That's more portable than semaphores or condition variables.
+ * (We do use sem_post from a signal handler, but that should be portable.)
+ *
+ * The thread suspension signal SIG_SUSPEND is now defined in gc_priv.h.
+ * Note that we can't just stop a thread; we need it to save its stack
+ * pointer(s) and acknowledge.
+ */
+#ifndef SIG_THR_RESTART
+# if defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS) \
+ || defined(GC_NETBSD_THREADS) || defined(GC_USESIGRT_SIGNALS)
+# if defined(_SIGRTMIN) && !defined(CPPCHECK)
+# define SIG_THR_RESTART _SIGRTMIN + 5
+# else
+# define SIG_THR_RESTART SIGRTMIN + 5
+# endif
+# elif defined(GC_FREEBSD_THREADS) && defined(__GLIBC__)
+# define SIG_THR_RESTART (32+5)
+# elif defined(GC_FREEBSD_THREADS) || defined(HURD) || defined(RTEMS)
+# define SIG_THR_RESTART SIGUSR2
+# else
+# define SIG_THR_RESTART SIGXCPU
+# endif
+#endif
+
+#define SIGNAL_UNSET (-1)
+ /* Since SIG_SUSPEND and/or SIG_THR_RESTART could represent */
+ /* a non-constant expression (e.g., in case of SIGRTMIN), */
+ /* actual signal numbers are determined by GC_stop_init() */
+ /* unless manually set (before GC initialization). */
+STATIC int GC_sig_suspend = SIGNAL_UNSET;
+STATIC int GC_sig_thr_restart = SIGNAL_UNSET;
+
+GC_API void GC_CALL GC_set_suspend_signal(int sig)
+{
+ if (GC_is_initialized) return;
+
+ GC_sig_suspend = sig;
+}
+
+GC_API void GC_CALL GC_set_thr_restart_signal(int sig)
+{
+ if (GC_is_initialized) return;
+
+ GC_sig_thr_restart = sig;
+}
+
+GC_API int GC_CALL GC_get_suspend_signal(void)
+{
+ return GC_sig_suspend != SIGNAL_UNSET ? GC_sig_suspend : SIG_SUSPEND;
+}
+
+GC_API int GC_CALL GC_get_thr_restart_signal(void)
+{
+ return GC_sig_thr_restart != SIGNAL_UNSET
+ ? GC_sig_thr_restart : SIG_THR_RESTART;
+}
+
+#if defined(GC_EXPLICIT_SIGNALS_UNBLOCK) \
+ || !defined(NO_SIGNALS_UNBLOCK_IN_MAIN)
+ /* Some targets (e.g., Solaris) might require this to be called when */
+ /* doing thread registering from the thread destructor. */
+ GC_INNER void GC_unblock_gc_signals(void)
+ {
+ sigset_t set;
+ sigemptyset(&set);
+ GC_ASSERT(GC_sig_suspend != SIGNAL_UNSET);
+ GC_ASSERT(GC_sig_thr_restart != SIGNAL_UNSET);
+ sigaddset(&set, GC_sig_suspend);
+ sigaddset(&set, GC_sig_thr_restart);
+ if (pthread_sigmask(SIG_UNBLOCK, &set, NULL) != 0)
+ ABORT("pthread_sigmask failed");
+ }
+#endif /* GC_EXPLICIT_SIGNALS_UNBLOCK */
+
+STATIC sem_t GC_suspend_ack_sem; /* also used to acknowledge restart */
+
+STATIC void GC_suspend_handler_inner(ptr_t dummy, void *context);
+
+#ifndef NO_SA_SIGACTION
+ STATIC void GC_suspend_handler(int sig, siginfo_t * info GC_ATTR_UNUSED,
+ void * context GC_ATTR_UNUSED)
+#else
+ STATIC void GC_suspend_handler(int sig)
+#endif
+{
+ int old_errno = errno;
+
+ if (sig != GC_sig_suspend) {
+# if defined(GC_FREEBSD_THREADS)
+ /* Workaround "deferred signal handling" bug in FreeBSD 9.2. */
+ if (0 == sig) return;
+# endif
+ ABORT("Bad signal in suspend_handler");
+ }
+
+# if defined(E2K) || defined(HP_PA) || defined(IA64) || defined(M68K) \
+ || defined(NO_SA_SIGACTION)
+ GC_with_callee_saves_pushed(GC_suspend_handler_inner, NULL);
+# else
+ /* We believe that in this case the full context is already */
+ /* in the signal handler frame. */
+ GC_suspend_handler_inner(NULL, context);
+# endif
+ errno = old_errno;
+}
+
+#ifdef BASE_ATOMIC_OPS_EMULATED
+ /* The AO primitives emulated with locks cannot be used inside signal */
+ /* handlers as this could cause a deadlock or a double lock. */
+ /* The following "async" macro definitions are correct only for */
+ /* an uniprocessor case and are provided for a test purpose. */
+# define ao_load_acquire_async(p) (*(p))
+# define ao_load_async(p) ao_load_acquire_async(p)
+# define ao_store_release_async(p, v) (void)(*(p) = (v))
+# define ao_store_async(p, v) ao_store_release_async(p, v)
+#else
+# define ao_load_acquire_async(p) AO_load_acquire(p)
+# define ao_load_async(p) AO_load(p)
+# define ao_store_release_async(p, v) AO_store_release(p, v)
+# define ao_store_async(p, v) AO_store(p, v)
+#endif /* !BASE_ATOMIC_OPS_EMULATED */
+
+/* The lookup here is safe, since this is done on behalf */
+/* of a thread which holds the allocation lock in order */
+/* to stop the world. Thus concurrent modification of the */
+/* data structure is impossible. Unfortunately, we have to */
+/* instruct TSan that the lookup is safe. */
+#ifdef THREAD_SANITIZER
+ /* The implementation of the function is the same as that of */
+ /* GC_lookup_thread except for the attribute added here. */
+ GC_ATTR_NO_SANITIZE_THREAD
+ static GC_thread GC_lookup_thread_async(pthread_t id)
+ {
+ GC_thread p = GC_threads[THREAD_TABLE_INDEX(id)];
+
+ while (p != NULL && !THREAD_EQUAL(p->id, id))
+ p = p->next;
+ return p;
+ }
+#else
+# define GC_lookup_thread_async GC_lookup_thread
+#endif
+
+GC_INLINE void GC_store_stack_ptr(GC_thread me)
+{
+ /* There is no data race between the suspend handler (storing */
+ /* stack_ptr) and GC_push_all_stacks (fetching stack_ptr) because */
+ /* GC_push_all_stacks is executed after GC_stop_world exits and the */
+ /* latter runs sem_wait repeatedly waiting for all the suspended */
+ /* threads to call sem_post. Nonetheless, stack_ptr is stored (here) */
+ /* and fetched (by GC_push_all_stacks) using the atomic primitives to */
+ /* avoid the related TSan warning. */
+# ifdef SPARC
+ ao_store_async((volatile AO_t *)&me->stop_info.stack_ptr,
+ (AO_t)GC_save_regs_in_stack());
+ /* TODO: regs saving already done by GC_with_callee_saves_pushed */
+# else
+# ifdef IA64
+ me -> backing_store_ptr = GC_save_regs_in_stack();
+# endif
+ ao_store_async((volatile AO_t *)&me->stop_info.stack_ptr,
+ (AO_t)GC_approx_sp());
+# endif
+}
+
+STATIC void GC_suspend_handler_inner(ptr_t dummy GC_ATTR_UNUSED,
+ void * context GC_ATTR_UNUSED)
+{
+ pthread_t self = pthread_self();
+ GC_thread me;
+# ifdef E2K
+ ptr_t bs_lo;
+ size_t stack_size;
+# endif
+ IF_CANCEL(int cancel_state;)
+# ifdef GC_ENABLE_SUSPEND_THREAD
+ word suspend_cnt;
+# endif
+ AO_t my_stop_count = ao_load_acquire_async(&GC_stop_count);
+ /* After the barrier, this thread should see */
+ /* the actual content of GC_threads. */
+
+ DISABLE_CANCEL(cancel_state);
+ /* pthread_setcancelstate is not defined to be async-signal-safe. */
+ /* But the glibc version appears to be in the absence of */
+ /* asynchronous cancellation. And since this signal handler */
+ /* to block on sigsuspend, which is both async-signal-safe */
+ /* and a cancellation point, there seems to be no obvious way */
+ /* out of it. In fact, it looks to me like an async-signal-safe */
+ /* cancellation point is inherently a problem, unless there is */
+ /* some way to disable cancellation in the handler. */
+# ifdef DEBUG_THREADS
+ GC_log_printf("Suspending %p\n", (void *)self);
+# endif
+ GC_ASSERT(((word)my_stop_count & THREAD_RESTARTED) == 0);
+
+ me = GC_lookup_thread_async(self);
+
+# ifdef GC_ENABLE_SUSPEND_THREAD
+# if defined(__GNUC__) && !defined(__clang__)
+ /* Workaround "writing 8 bytes into a region of size 0" bogus */
+ /* gcc warning (produced by gcc-12.2.0/aarch64, at least). */
+ if (NULL == me) ABORT("Lookup self failed");
+# endif
+ suspend_cnt = (word)ao_load_async(&(me -> stop_info.ext_suspend_cnt));
+# endif
+ if (((word)me->stop_info.last_stop_count & ~(word)THREAD_RESTARTED)
+ == (word)my_stop_count
+# ifdef GC_ENABLE_SUSPEND_THREAD
+ && (suspend_cnt & 1) == 0
+# endif
+ ) {
+ /* Duplicate signal. OK if we are retrying. */
+ if (!GC_retry_signals) {
+ WARN("Duplicate suspend signal in thread %p\n", self);
+ }
+ RESTORE_CANCEL(cancel_state);
+ return;
+ }
+ GC_store_stack_ptr(me);
+# ifdef E2K
+ GC_ASSERT(NULL == me -> backing_store_end);
+ GET_PROCEDURE_STACK_LOCAL(&bs_lo, &stack_size);
+ me -> backing_store_end = bs_lo;
+ me -> backing_store_ptr = bs_lo + stack_size;
+# endif
+
+ /* Tell the thread that wants to stop the world that this */
+ /* thread has been stopped. Note that sem_post() is */
+ /* the only async-signal-safe primitive in LinuxThreads. */
+ sem_post(&GC_suspend_ack_sem);
+ ao_store_release_async(&me->stop_info.last_stop_count, my_stop_count);
+
+ /* Wait until that thread tells us to restart by sending */
+ /* this thread a GC_sig_thr_restart signal (should be masked */
+ /* at this point thus there is no race). */
+ /* We do not continue until we receive that signal, */
+ /* but we do not take that as authoritative. (We may be */
+ /* accidentally restarted by one of the user signals we */
+ /* don't block.) After we receive the signal, we use a */
+ /* primitive and expensive mechanism to wait until it's */
+ /* really safe to proceed. Under normal circumstances, */
+ /* this code should not be executed. */
+ do {
+ sigsuspend(&suspend_handler_mask);
+ /* Iterate while not restarting the world or thread is suspended. */
+ } while ((ao_load_acquire_async(&GC_world_is_stopped)
+ && ao_load_async(&GC_stop_count) == my_stop_count)
+# ifdef GC_ENABLE_SUSPEND_THREAD
+ || ((suspend_cnt & 1) != 0
+ && (word)ao_load_async(&(me -> stop_info.ext_suspend_cnt))
+ == suspend_cnt)
+# endif
+ );
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Continuing %p\n", (void *)self);
+# endif
+# ifdef E2K
+ GC_ASSERT(me -> backing_store_end == bs_lo);
+ FREE_PROCEDURE_STACK_LOCAL(bs_lo, stack_size);
+ me -> backing_store_ptr = NULL;
+ me -> backing_store_end = NULL;
+# endif
+# ifndef GC_NETBSD_THREADS_WORKAROUND
+ if (GC_retry_signals)
+# endif
+ {
+ /* If the RESTART signal loss is possible (though it should be */
+ /* less likely than losing the SUSPEND signal as we do not do */
+ /* much between the first sem_post and sigsuspend calls), more */
+ /* handshaking is provided to work around it. */
+ sem_post(&GC_suspend_ack_sem);
+# ifdef GC_NETBSD_THREADS_WORKAROUND
+ if (GC_retry_signals)
+# endif
+ {
+ /* Set the flag that the thread has been restarted. */
+ ao_store_release_async(&me->stop_info.last_stop_count,
+ (AO_t)((word)my_stop_count | THREAD_RESTARTED));
+ }
+ }
+ RESTORE_CANCEL(cancel_state);
+}
+
+static void suspend_restart_barrier(int n_live_threads)
+{
+ int i;
+
+ for (i = 0; i < n_live_threads; i++) {
+ while (0 != sem_wait(&GC_suspend_ack_sem)) {
+ /* On Linux, sem_wait is documented to always return zero. */
+ /* But the documentation appears to be incorrect. */
+ /* EINTR seems to happen with some versions of gdb. */
+ if (errno != EINTR)
+ ABORT("sem_wait failed");
+ }
+ }
+# ifdef GC_ASSERTIONS
+ sem_getvalue(&GC_suspend_ack_sem, &i);
+ GC_ASSERT(0 == i);
+# endif
+}
+
+# define WAIT_UNIT 3000 /* us */
+
+static int resend_lost_signals(int n_live_threads,
+ int (*suspend_restart_all)(void))
+{
+# define RETRY_INTERVAL 100000 /* us */
+# define RESEND_SIGNALS_LIMIT 150
+
+ if (n_live_threads > 0) {
+ unsigned long wait_usecs = 0; /* Total wait since retry. */
+ int retry = 0;
+ int prev_sent = 0;
+
+ for (;;) {
+ int ack_count;
+
+ sem_getvalue(&GC_suspend_ack_sem, &ack_count);
+ if (ack_count == n_live_threads)
+ break;
+ if (wait_usecs > RETRY_INTERVAL) {
+ int newly_sent = suspend_restart_all();
+
+ if (newly_sent != prev_sent) {
+ retry = 0; /* restart the counter */
+ } else if (++retry >= RESEND_SIGNALS_LIMIT) /* no progress */
+ ABORT_ARG1("Signals delivery fails constantly",
+ " at GC #%lu", (unsigned long)GC_gc_no);
+
+ GC_COND_LOG_PRINTF("Resent %d signals after timeout, retry: %d\n",
+ newly_sent, retry);
+ sem_getvalue(&GC_suspend_ack_sem, &ack_count);
+ if (newly_sent < n_live_threads - ack_count) {
+ WARN("Lost some threads while stopping or starting world?!\n", 0);
+ n_live_threads = ack_count + newly_sent;
+ }
+ prev_sent = newly_sent;
+ wait_usecs = 0;
+ }
+ GC_usleep(WAIT_UNIT);
+ wait_usecs += WAIT_UNIT;
+ }
+ }
+ return n_live_threads;
+}
+
+#ifdef HAVE_CLOCK_GETTIME
+# define TS_NSEC_ADD(ts, ns) \
+ (ts.tv_nsec += (ns), \
+ (void)(ts.tv_nsec >= 1000000L*1000 ? \
+ (ts.tv_nsec -= 1000000L*1000, ts.tv_sec++, 0) : 0))
+#endif
+
+static void resend_lost_signals_retry(int n_live_threads,
+ int (*suspend_restart_all)(void))
+{
+# if defined(HAVE_CLOCK_GETTIME) && !defined(DONT_TIMEDWAIT_ACK_SEM)
+# define TIMEOUT_BEFORE_RESEND 10000 /* us */
+ struct timespec ts;
+
+ if (n_live_threads > 0 && clock_gettime(CLOCK_REALTIME, &ts) == 0) {
+ int i;
+
+ TS_NSEC_ADD(ts, TIMEOUT_BEFORE_RESEND * 1000);
+ /* First, try to wait for the semaphore with some timeout. */
+ /* On failure, fallback to WAIT_UNIT pause and resend of the signal. */
+ for (i = 0; i < n_live_threads; i++) {
+ if (0 != sem_timedwait(&GC_suspend_ack_sem, &ts))
+ break; /* Wait timed out or any other error. */
+ }
+ /* Update the count of threads to wait the ack from. */
+ n_live_threads -= i;
+ }
+# endif
+ n_live_threads = resend_lost_signals(n_live_threads, suspend_restart_all);
+ suspend_restart_barrier(n_live_threads);
+}
+
+STATIC void GC_restart_handler(int sig)
+{
+# if defined(DEBUG_THREADS)
+ int old_errno = errno; /* Preserve errno value. */
+# endif
+
+ if (sig != GC_sig_thr_restart)
+ ABORT("Bad signal in restart handler");
+
+ /*
+ ** Note: even if we don't do anything useful here,
+ ** it would still be necessary to have a signal handler,
+ ** rather than ignoring the signals, otherwise
+ ** the signals will not be delivered at all, and
+ ** will thus not interrupt the sigsuspend() above.
+ */
+# ifdef DEBUG_THREADS
+ GC_log_printf("In GC_restart_handler for %p\n", (void *)pthread_self());
+ errno = old_errno;
+# endif
+}
+
+# ifdef USE_TKILL_ON_ANDROID
+ EXTERN_C_BEGIN
+ extern int tkill(pid_t tid, int sig); /* from sys/linux-unistd.h */
+ EXTERN_C_END
+# define THREAD_SYSTEM_ID(t) (t)->kernel_id
+# else
+# define THREAD_SYSTEM_ID(t) (t)->id
+# endif
+
+# ifndef RETRY_TKILL_EAGAIN_LIMIT
+# define RETRY_TKILL_EAGAIN_LIMIT 16
+# endif
+
+ static int raise_signal(GC_thread p, int sig)
+ {
+ int res;
+# ifdef RETRY_TKILL_ON_EAGAIN
+ int retry;
+
+ for (retry = 0; ; retry++)
+# endif
+ {
+# ifdef USE_TKILL_ON_ANDROID
+ int old_errno = errno;
+
+ res = tkill(THREAD_SYSTEM_ID(p), sig);
+ if (res < 0) {
+ res = errno;
+ errno = old_errno;
+ }
+# else
+ res = pthread_kill(THREAD_SYSTEM_ID(p), sig);
+# endif
+# ifdef RETRY_TKILL_ON_EAGAIN
+ if (res != EAGAIN || retry >= RETRY_TKILL_EAGAIN_LIMIT) break;
+ /* A temporal overflow of the real-time signal queue. */
+ GC_usleep(WAIT_UNIT);
+# endif
+ }
+ return res;
+ }
+
+# ifdef GC_ENABLE_SUSPEND_THREAD
+# include <sys/time.h>
+# include "javaxfc.h" /* to get the prototypes as extern "C" */
+
+ STATIC void GC_brief_async_signal_safe_sleep(void)
+ {
+ struct timeval tv;
+ tv.tv_sec = 0;
+# if defined(GC_TIME_LIMIT) && !defined(CPPCHECK)
+ tv.tv_usec = 1000 * GC_TIME_LIMIT / 2;
+# else
+ tv.tv_usec = 1000 * 50 / 2;
+# endif
+ (void)select(0, 0, 0, 0, &tv);
+ }
+
+ GC_INNER void GC_suspend_self_inner(GC_thread me, word suspend_cnt) {
+ IF_CANCEL(int cancel_state;)
+
+ GC_ASSERT((suspend_cnt & 1) != 0);
+ DISABLE_CANCEL(cancel_state);
+# ifdef DEBUG_THREADS
+ GC_log_printf("Suspend self: %p\n", (void *)(me -> id));
+# endif
+ while ((word)ao_load_acquire_async(&(me -> stop_info.ext_suspend_cnt))
+ == suspend_cnt) {
+ /* TODO: Use sigsuspend() even for self-suspended threads. */
+ GC_brief_async_signal_safe_sleep();
+ }
+# ifdef DEBUG_THREADS
+ GC_log_printf("Resume self: %p\n", (void *)(me -> id));
+# endif
+ RESTORE_CANCEL(cancel_state);
+ }
+
+ GC_API void GC_CALL GC_suspend_thread(GC_SUSPEND_THREAD_ID thread) {
+ GC_thread t;
+ word suspend_cnt;
+ IF_CANCEL(int cancel_state;)
+ DCL_LOCK_STATE;
+
+ LOCK();
+ t = GC_lookup_thread((pthread_t)thread);
+ if (NULL == t) {
+ UNLOCK();
+ return;
+ }
+ suspend_cnt = (word)(t -> stop_info.ext_suspend_cnt);
+ if ((suspend_cnt & 1) != 0) /* already suspended? */ {
+ GC_ASSERT(!THREAD_EQUAL((pthread_t)thread, pthread_self()));
+ UNLOCK();
+ return;
+ }
+ if ((t -> flags & FINISHED) != 0 || t -> thread_blocked) {
+ t -> stop_info.ext_suspend_cnt = (AO_t)(suspend_cnt | 1); /* suspend */
+ /* Terminated but not joined yet, or in do-blocking state. */
+ UNLOCK();
+ return;
+ }
+
+ if (THREAD_EQUAL((pthread_t)thread, pthread_self())) {
+ t -> stop_info.ext_suspend_cnt = (AO_t)(suspend_cnt | 1);
+ GC_with_callee_saves_pushed(GC_suspend_self_blocked, (ptr_t)t);
+ UNLOCK();
+ return;
+ }
+
+ DISABLE_CANCEL(cancel_state);
+ /* GC_suspend_thread is not a cancellation point. */
+# ifdef PARALLEL_MARK
+ /* Ensure we do not suspend a thread while it is rebuilding */
+ /* a free list, otherwise such a dead-lock is possible: */
+ /* thread 1 is blocked in GC_wait_for_reclaim holding */
+ /* the allocation lock, thread 2 is suspended in */
+ /* GC_reclaim_generic invoked from GC_generic_malloc_many */
+ /* (with GC_fl_builder_count > 0), and thread 3 is blocked */
+ /* acquiring the allocation lock in GC_resume_thread. */
+ if (GC_parallel)
+ GC_wait_for_reclaim();
+# endif
+
+ if (GC_manual_vdb) {
+ /* See the relevant comment in GC_stop_world. */
+ GC_acquire_dirty_lock();
+ }
+ /* Else do not acquire the lock as the write fault handler might */
+ /* be trying to acquire this lock too, and the suspend handler */
+ /* execution is deferred until the write fault handler completes. */
+
+ /* Set the flag making the change visible to the signal handler. */
+ AO_store_release(&(t -> stop_info.ext_suspend_cnt),
+ (AO_t)(suspend_cnt | 1));
+
+ /* TODO: Support GC_retry_signals (not needed for TSan) */
+ switch (raise_signal(t, GC_sig_suspend)) {
+ /* ESRCH cannot happen as terminated threads are handled above. */
+ case 0:
+ break;
+ default:
+ ABORT("pthread_kill failed");
+ }
+
+ /* Wait for the thread to complete threads table lookup and */
+ /* stack_ptr assignment. */
+ GC_ASSERT(GC_thr_initialized);
+ suspend_restart_barrier(1);
+ if (GC_manual_vdb)
+ GC_release_dirty_lock();
+ RESTORE_CANCEL(cancel_state);
+ UNLOCK();
+ }
+
+ GC_API void GC_CALL GC_resume_thread(GC_SUSPEND_THREAD_ID thread) {
+ GC_thread t;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ t = GC_lookup_thread((pthread_t)thread);
+ if (t != NULL) {
+ word suspend_cnt = (word)(t -> stop_info.ext_suspend_cnt);
+
+ if ((suspend_cnt & 1) != 0) /* is suspended? */ {
+ /* Mark the thread as not suspended - it will be resumed shortly. */
+ AO_store(&(t -> stop_info.ext_suspend_cnt), (AO_t)(suspend_cnt + 1));
+
+ if ((t -> flags & FINISHED) == 0 && !(t -> thread_blocked)) {
+ int result = raise_signal(t, GC_sig_thr_restart);
+
+ /* TODO: Support signal resending on GC_retry_signals */
+ if (result != 0)
+ ABORT_ARG1("pthread_kill failed in GC_resume_thread",
+ ": errcode= %d", result);
+# ifndef GC_NETBSD_THREADS_WORKAROUND
+ if (GC_retry_signals)
+# endif
+ {
+ IF_CANCEL(int cancel_state;)
+
+ DISABLE_CANCEL(cancel_state);
+ suspend_restart_barrier(1);
+ RESTORE_CANCEL(cancel_state);
+ }
+ }
+ }
+ }
+ UNLOCK();
+ }
+
+ GC_API int GC_CALL GC_is_thread_suspended(GC_SUSPEND_THREAD_ID thread) {
+ GC_thread t;
+ int is_suspended = 0;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ t = GC_lookup_thread((pthread_t)thread);
+ if (t != NULL && (t -> stop_info.ext_suspend_cnt & 1) != 0)
+ is_suspended = (int)TRUE;
+ UNLOCK();
+ return is_suspended;
+ }
+# endif /* GC_ENABLE_SUSPEND_THREAD */
+
+# undef ao_load_acquire_async
+# undef ao_load_async
+# undef ao_store_async
+# undef ao_store_release_async
+#endif /* !GC_OPENBSD_UTHREADS && !NACL */
+
+/* We hold allocation lock. Should do exactly the right thing if the */
+/* world is stopped. Should not fail if it isn't. */
+GC_INNER void GC_push_all_stacks(void)
+{
+ GC_bool found_me = FALSE;
+ size_t nthreads = 0;
+ int i;
+ GC_thread p;
+ ptr_t lo; /* stack top (sp) */
+ ptr_t hi; /* bottom */
+# if defined(E2K) || defined(IA64)
+ /* We also need to scan the register backing store. */
+ ptr_t bs_lo, bs_hi;
+# endif
+ struct GC_traced_stack_sect_s *traced_stack_sect;
+ pthread_t self = pthread_self();
+ word total_size = 0;
+# ifdef E2K
+ GC_bool is_stopped = (GC_bool)GC_world_is_stopped;
+# endif
+
+ if (!EXPECT(GC_thr_initialized, TRUE))
+ GC_thr_init();
+# ifdef DEBUG_THREADS
+ GC_log_printf("Pushing stacks from thread %p\n", (void *)self);
+# endif
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (p -> flags & FINISHED) continue;
+ ++nthreads;
+ traced_stack_sect = p -> traced_stack_sect;
+ if (THREAD_EQUAL(p -> id, self)) {
+ GC_ASSERT(!p->thread_blocked);
+# ifdef SPARC
+ lo = GC_save_regs_in_stack();
+# else
+ lo = GC_approx_sp();
+# ifdef IA64
+ bs_hi = GC_save_regs_in_stack();
+# elif defined(E2K)
+ GC_ASSERT(NULL == p -> backing_store_end);
+ (void)GC_save_regs_in_stack();
+ {
+ size_t stack_size;
+ GET_PROCEDURE_STACK_LOCAL(&bs_lo, &stack_size);
+ bs_hi = bs_lo + stack_size;
+ }
+# endif
+# endif
+ found_me = TRUE;
+ } else {
+ lo = (ptr_t)AO_load((volatile AO_t *)&p->stop_info.stack_ptr);
+# ifdef IA64
+ bs_hi = p -> backing_store_ptr;
+# elif defined(E2K)
+ bs_lo = p -> backing_store_end;
+ bs_hi = p -> backing_store_ptr;
+# endif
+ if (traced_stack_sect != NULL
+ && traced_stack_sect->saved_stack_ptr == lo) {
+ /* If the thread has never been stopped since the recent */
+ /* GC_call_with_gc_active invocation then skip the top */
+ /* "stack section" as stack_ptr already points to. */
+ traced_stack_sect = traced_stack_sect->prev;
+ }
+ }
+ if ((p -> flags & MAIN_THREAD) == 0) {
+ hi = p -> stack_end;
+# ifdef IA64
+ bs_lo = p -> backing_store_end;
+# endif
+ } else {
+ /* The original stack. */
+ hi = GC_stackbottom;
+# ifdef IA64
+ bs_lo = BACKING_STORE_BASE;
+# endif
+ }
+# ifdef DEBUG_THREADS
+# ifdef STACK_GROWS_UP
+ GC_log_printf("Stack for thread %p is (%p,%p]\n",
+ (void *)(p -> id), (void *)hi, (void *)lo);
+# else
+ GC_log_printf("Stack for thread %p is [%p,%p)\n",
+ (void *)(p -> id), (void *)lo, (void *)hi);
+# endif
+# endif
+ if (0 == lo) ABORT("GC_push_all_stacks: sp not set!");
+ if (p->altstack != NULL && (word)p->altstack <= (word)lo
+ && (word)lo <= (word)p->altstack + p->altstack_size) {
+# ifdef STACK_GROWS_UP
+ hi = p->altstack;
+# else
+ hi = p->altstack + p->altstack_size;
+# endif
+ /* FIXME: Need to scan the normal stack too, but how ? */
+ }
+# ifdef STACKPTR_CORRECTOR_AVAILABLE
+ if (GC_sp_corrector != 0)
+ GC_sp_corrector((void **)&lo, (void *)(p -> id));
+# endif
+ GC_push_all_stack_sections(lo, hi, traced_stack_sect);
+# ifdef STACK_GROWS_UP
+ total_size += lo - hi;
+# else
+ total_size += hi - lo; /* lo <= hi */
+# endif
+# ifdef NACL
+ /* Push reg_storage as roots, this will cover the reg context. */
+ GC_push_all_stack((ptr_t)p -> stop_info.reg_storage,
+ (ptr_t)(p -> stop_info.reg_storage + NACL_GC_REG_STORAGE_SIZE));
+ total_size += NACL_GC_REG_STORAGE_SIZE * sizeof(ptr_t);
+# endif
+# ifdef E2K
+ if (!is_stopped && !p->thread_blocked
+# ifdef GC_ENABLE_SUSPEND_THREAD
+ && (p -> stop_info.ext_suspend_cnt & 1) == 0
+# endif
+ && !THREAD_EQUAL(p -> id, self))
+ continue; /* procedure stack buffer has already been freed */
+# endif
+# if defined(E2K) || defined(IA64)
+# ifdef DEBUG_THREADS
+ GC_log_printf("Reg stack for thread %p is [%p,%p)\n",
+ (void *)(p -> id), (void *)bs_lo, (void *)bs_hi);
+# endif
+ GC_ASSERT(bs_lo != NULL && bs_hi != NULL);
+ /* FIXME: This (if p->id==self) may add an unbounded number of */
+ /* entries, and hence overflow the mark stack, which is bad. */
+ GC_push_all_register_sections(bs_lo, bs_hi,
+ THREAD_EQUAL(p -> id, self),
+ traced_stack_sect);
+ total_size += bs_hi - bs_lo; /* bs_lo <= bs_hi */
+# endif
+# ifdef E2K
+ if (THREAD_EQUAL(p -> id, self))
+ FREE_PROCEDURE_STACK_LOCAL(bs_lo, (size_t)(bs_hi - bs_lo));
+# endif
+ }
+ }
+ GC_VERBOSE_LOG_PRINTF("Pushed %d thread stacks\n", (int)nthreads);
+ if (!found_me && !GC_in_thread_creation)
+ ABORT("Collecting from unknown thread");
+ GC_total_stacksize = total_size;
+}
+
+#ifdef DEBUG_THREADS
+ /* There seems to be a very rare thread stopping problem. To help us */
+ /* debug that, we save the ids of the stopping thread. */
+ pthread_t GC_stopping_thread;
+ int GC_stopping_pid = 0;
+#endif
+
+/* We hold the allocation lock. Suspend all threads that might */
+/* still be running. Return the number of suspend signals that */
+/* were sent. */
+STATIC int GC_suspend_all(void)
+{
+ int n_live_threads = 0;
+ int i;
+# ifndef NACL
+ GC_thread p;
+# ifndef GC_OPENBSD_UTHREADS
+ int result;
+# endif
+ pthread_t self = pthread_self();
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (!THREAD_EQUAL(p -> id, self)) {
+ if ((p -> flags & FINISHED) != 0) continue;
+ if (p -> thread_blocked) /* Will wait */ continue;
+# ifndef GC_OPENBSD_UTHREADS
+# ifdef GC_ENABLE_SUSPEND_THREAD
+ if ((p -> stop_info.ext_suspend_cnt & 1) != 0) continue;
+# endif
+ if (AO_load(&p->stop_info.last_stop_count) == GC_stop_count)
+ continue; /* matters only if GC_retry_signals */
+ n_live_threads++;
+# endif
+# ifdef DEBUG_THREADS
+ GC_log_printf("Sending suspend signal to %p\n", (void *)p->id);
+# endif
+
+# ifdef GC_OPENBSD_UTHREADS
+ {
+ stack_t stack;
+
+ GC_acquire_dirty_lock();
+ if (pthread_suspend_np(p -> id) != 0)
+ ABORT("pthread_suspend_np failed");
+ GC_release_dirty_lock();
+ if (pthread_stackseg_np(p->id, &stack))
+ ABORT("pthread_stackseg_np failed");
+ p -> stop_info.stack_ptr = (ptr_t)stack.ss_sp - stack.ss_size;
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_SUSPENDED,
+ (void *)p->id);
+ }
+# else
+ /* The synchronization between GC_dirty (based on */
+ /* test-and-set) and the signal-based thread suspension */
+ /* is performed in GC_stop_world because */
+ /* GC_release_dirty_lock cannot be called before */
+ /* acknowledging the thread is really suspended. */
+ result = raise_signal(p, GC_sig_suspend);
+ switch(result) {
+ case ESRCH:
+ /* Not really there anymore. Possible? */
+ n_live_threads--;
+ break;
+ case 0:
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_SUSPENDED,
+ (void *)(word)THREAD_SYSTEM_ID(p));
+ /* Note: thread id might be truncated. */
+ break;
+ default:
+ ABORT_ARG1("pthread_kill failed at suspend",
+ ": errcode= %d", result);
+ }
+# endif
+ }
+ }
+ }
+
+# else /* NACL */
+# ifndef NACL_PARK_WAIT_USEC
+# define NACL_PARK_WAIT_USEC 100 /* us */
+# endif
+ unsigned long num_sleeps = 0;
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("pthread_stop_world: number of threads: %d\n",
+ GC_nacl_num_gc_threads - 1);
+# endif
+ GC_nacl_thread_parker = pthread_self();
+ GC_nacl_park_threads_now = 1;
+
+ if (GC_manual_vdb)
+ GC_acquire_dirty_lock();
+ for (;;) {
+ int num_threads_parked = 0;
+ int num_used = 0;
+
+ /* Check the 'parked' flag for each thread the GC knows about. */
+ for (i = 0; i < MAX_NACL_GC_THREADS
+ && num_used < GC_nacl_num_gc_threads; i++) {
+ if (GC_nacl_thread_used[i] == 1) {
+ num_used++;
+ if (GC_nacl_thread_parked[i] == 1) {
+ num_threads_parked++;
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_SUSPENDED, (void *)(word)i);
+ }
+ }
+ }
+ /* -1 for the current thread. */
+ if (num_threads_parked >= GC_nacl_num_gc_threads - 1)
+ break;
+# ifdef DEBUG_THREADS
+ GC_log_printf("Sleep waiting for %d threads to park...\n",
+ GC_nacl_num_gc_threads - num_threads_parked - 1);
+# endif
+ GC_usleep(NACL_PARK_WAIT_USEC);
+ if (++num_sleeps > (1000 * 1000) / NACL_PARK_WAIT_USEC) {
+ WARN("GC appears stalled waiting for %" WARN_PRIdPTR
+ " threads to park...\n",
+ GC_nacl_num_gc_threads - num_threads_parked - 1);
+ num_sleeps = 0;
+ }
+ }
+ if (GC_manual_vdb)
+ GC_release_dirty_lock();
+# endif /* NACL */
+ return n_live_threads;
+}
+
+GC_INNER void GC_stop_world(void)
+{
+# if !defined(GC_OPENBSD_UTHREADS) && !defined(NACL)
+ int n_live_threads;
+# endif
+ GC_ASSERT(I_HOLD_LOCK());
+# ifdef DEBUG_THREADS
+ GC_stopping_thread = pthread_self();
+ GC_stopping_pid = getpid();
+ GC_log_printf("Stopping the world from %p\n", (void *)GC_stopping_thread);
+# endif
+
+ /* Make sure all free list construction has stopped before we start. */
+ /* No new construction can start, since free list construction is */
+ /* required to acquire and release the GC lock before it starts, */
+ /* and we have the lock. */
+# ifdef PARALLEL_MARK
+ if (GC_parallel) {
+ GC_acquire_mark_lock();
+ GC_ASSERT(GC_fl_builder_count == 0);
+ /* We should have previously waited for it to become zero. */
+ }
+# endif /* PARALLEL_MARK */
+
+# if defined(GC_OPENBSD_UTHREADS) || defined(NACL)
+ (void)GC_suspend_all();
+# else
+ AO_store(&GC_stop_count,
+ (AO_t)((word)GC_stop_count + (THREAD_RESTARTED+1)));
+ /* Only concurrent reads are possible. */
+ if (GC_manual_vdb) {
+ GC_acquire_dirty_lock();
+ /* The write fault handler cannot be called if GC_manual_vdb */
+ /* (thus double-locking should not occur in */
+ /* async_set_pht_entry_from_index based on test-and-set). */
+ }
+ AO_store_release(&GC_world_is_stopped, TRUE);
+ n_live_threads = GC_suspend_all();
+ if (GC_retry_signals) {
+ resend_lost_signals_retry(n_live_threads, GC_suspend_all);
+ } else {
+ suspend_restart_barrier(n_live_threads);
+ }
+ if (GC_manual_vdb)
+ GC_release_dirty_lock(); /* cannot be done in GC_suspend_all */
+# endif
+
+# ifdef PARALLEL_MARK
+ if (GC_parallel)
+ GC_release_mark_lock();
+# endif
+# ifdef DEBUG_THREADS
+ GC_log_printf("World stopped from %p\n", (void *)pthread_self());
+ GC_stopping_thread = 0;
+# endif
+}
+
+#ifdef NACL
+# if defined(__x86_64__)
+# define NACL_STORE_REGS() \
+ do { \
+ __asm__ __volatile__ ("push %rbx"); \
+ __asm__ __volatile__ ("push %rbp"); \
+ __asm__ __volatile__ ("push %r12"); \
+ __asm__ __volatile__ ("push %r13"); \
+ __asm__ __volatile__ ("push %r14"); \
+ __asm__ __volatile__ ("push %r15"); \
+ __asm__ __volatile__ ("mov %%esp, %0" \
+ : "=m" (GC_nacl_gc_thread_self->stop_info.stack_ptr)); \
+ BCOPY(GC_nacl_gc_thread_self->stop_info.stack_ptr, \
+ GC_nacl_gc_thread_self->stop_info.reg_storage, \
+ NACL_GC_REG_STORAGE_SIZE * sizeof(ptr_t)); \
+ __asm__ __volatile__ ("naclasp $48, %r15"); \
+ } while (0)
+# elif defined(__i386__)
+# define NACL_STORE_REGS() \
+ do { \
+ __asm__ __volatile__ ("push %ebx"); \
+ __asm__ __volatile__ ("push %ebp"); \
+ __asm__ __volatile__ ("push %esi"); \
+ __asm__ __volatile__ ("push %edi"); \
+ __asm__ __volatile__ ("mov %%esp, %0" \
+ : "=m" (GC_nacl_gc_thread_self->stop_info.stack_ptr)); \
+ BCOPY(GC_nacl_gc_thread_self->stop_info.stack_ptr, \
+ GC_nacl_gc_thread_self->stop_info.reg_storage, \
+ NACL_GC_REG_STORAGE_SIZE * sizeof(ptr_t));\
+ __asm__ __volatile__ ("add $16, %esp"); \
+ } while (0)
+# elif defined(__arm__)
+# define NACL_STORE_REGS() \
+ do { \
+ __asm__ __volatile__ ("push {r4-r8,r10-r12,lr}"); \
+ __asm__ __volatile__ ("mov r0, %0" \
+ : : "r" (&GC_nacl_gc_thread_self->stop_info.stack_ptr)); \
+ __asm__ __volatile__ ("bic r0, r0, #0xc0000000"); \
+ __asm__ __volatile__ ("str sp, [r0]"); \
+ BCOPY(GC_nacl_gc_thread_self->stop_info.stack_ptr, \
+ GC_nacl_gc_thread_self->stop_info.reg_storage, \
+ NACL_GC_REG_STORAGE_SIZE * sizeof(ptr_t)); \
+ __asm__ __volatile__ ("add sp, sp, #40"); \
+ __asm__ __volatile__ ("bic sp, sp, #0xc0000000"); \
+ } while (0)
+# else
+# error TODO Please port NACL_STORE_REGS
+# endif
+
+ GC_API_OSCALL void nacl_pre_syscall_hook(void)
+ {
+ if (GC_nacl_thread_idx != -1) {
+ NACL_STORE_REGS();
+ GC_nacl_gc_thread_self->stop_info.stack_ptr = GC_approx_sp();
+ GC_nacl_thread_parked[GC_nacl_thread_idx] = 1;
+ }
+ }
+
+ GC_API_OSCALL void __nacl_suspend_thread_if_needed(void)
+ {
+ if (GC_nacl_park_threads_now) {
+ pthread_t self = pthread_self();
+
+ /* Don't try to park the thread parker. */
+ if (GC_nacl_thread_parker == self)
+ return;
+
+ /* This can happen when a thread is created outside of the GC */
+ /* system (wthread mostly). */
+ if (GC_nacl_thread_idx < 0)
+ return;
+
+ /* If it was already 'parked', we're returning from a syscall, */
+ /* so don't bother storing registers again, the GC has a set. */
+ if (!GC_nacl_thread_parked[GC_nacl_thread_idx]) {
+ NACL_STORE_REGS();
+ GC_nacl_gc_thread_self->stop_info.stack_ptr = GC_approx_sp();
+ }
+ GC_nacl_thread_parked[GC_nacl_thread_idx] = 1;
+ while (GC_nacl_park_threads_now) {
+ /* Just spin. */
+ }
+ GC_nacl_thread_parked[GC_nacl_thread_idx] = 0;
+
+ /* Clear out the reg storage for next suspend. */
+ BZERO(GC_nacl_gc_thread_self->stop_info.reg_storage,
+ NACL_GC_REG_STORAGE_SIZE * sizeof(ptr_t));
+ }
+ }
+
+ GC_API_OSCALL void nacl_post_syscall_hook(void)
+ {
+ /* Calling __nacl_suspend_thread_if_needed right away should */
+ /* guarantee we don't mutate the GC set. */
+ __nacl_suspend_thread_if_needed();
+ if (GC_nacl_thread_idx != -1) {
+ GC_nacl_thread_parked[GC_nacl_thread_idx] = 0;
+ }
+ }
+
+ STATIC GC_bool GC_nacl_thread_parking_inited = FALSE;
+ STATIC pthread_mutex_t GC_nacl_thread_alloc_lock = PTHREAD_MUTEX_INITIALIZER;
+
+ struct nacl_irt_blockhook {
+ int (*register_block_hooks)(void (*pre)(void), void (*post)(void));
+ };
+
+ EXTERN_C_BEGIN
+ extern size_t nacl_interface_query(const char *interface_ident,
+ void *table, size_t tablesize);
+ EXTERN_C_END
+
+ GC_INNER void GC_nacl_initialize_gc_thread(void)
+ {
+ int i;
+ static struct nacl_irt_blockhook gc_hook;
+
+ pthread_mutex_lock(&GC_nacl_thread_alloc_lock);
+ if (!EXPECT(GC_nacl_thread_parking_inited, TRUE)) {
+ BZERO(GC_nacl_thread_parked, sizeof(GC_nacl_thread_parked));
+ BZERO(GC_nacl_thread_used, sizeof(GC_nacl_thread_used));
+ /* TODO: replace with public 'register hook' function when */
+ /* available from glibc. */
+ nacl_interface_query("nacl-irt-blockhook-0.1",
+ &gc_hook, sizeof(gc_hook));
+ gc_hook.register_block_hooks(nacl_pre_syscall_hook,
+ nacl_post_syscall_hook);
+ GC_nacl_thread_parking_inited = TRUE;
+ }
+ GC_ASSERT(GC_nacl_num_gc_threads <= MAX_NACL_GC_THREADS);
+ for (i = 0; i < MAX_NACL_GC_THREADS; i++) {
+ if (GC_nacl_thread_used[i] == 0) {
+ GC_nacl_thread_used[i] = 1;
+ GC_nacl_thread_idx = i;
+ GC_nacl_num_gc_threads++;
+ break;
+ }
+ }
+ pthread_mutex_unlock(&GC_nacl_thread_alloc_lock);
+ }
+
+ GC_INNER void GC_nacl_shutdown_gc_thread(void)
+ {
+ pthread_mutex_lock(&GC_nacl_thread_alloc_lock);
+ GC_ASSERT(GC_nacl_thread_idx >= 0);
+ GC_ASSERT(GC_nacl_thread_idx < MAX_NACL_GC_THREADS);
+ GC_ASSERT(GC_nacl_thread_used[GC_nacl_thread_idx] != 0);
+ GC_nacl_thread_used[GC_nacl_thread_idx] = 0;
+ GC_nacl_thread_idx = -1;
+ GC_nacl_num_gc_threads--;
+ pthread_mutex_unlock(&GC_nacl_thread_alloc_lock);
+ }
+
+#else /* !NACL */
+
+# ifndef GC_OPENBSD_UTHREADS
+ static GC_bool in_resend_restart_signals;
+# endif
+
+ /* Restart all threads that were suspended by the collector. */
+ /* Return the number of restart signals that were sent. */
+ STATIC int GC_restart_all(void)
+ {
+ int n_live_threads = 0;
+ int i;
+ pthread_t self = pthread_self();
+ GC_thread p;
+# ifndef GC_OPENBSD_UTHREADS
+ int result;
+# endif
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != NULL; p = p -> next) {
+ if (!THREAD_EQUAL(p -> id, self)) {
+ if ((p -> flags & FINISHED) != 0) continue;
+ if (p -> thread_blocked) continue;
+# ifndef GC_OPENBSD_UTHREADS
+# ifdef GC_ENABLE_SUSPEND_THREAD
+ if ((p -> stop_info.ext_suspend_cnt & 1) != 0) continue;
+# endif
+ if (GC_retry_signals
+ && AO_load(&p->stop_info.last_stop_count)
+ == (AO_t)((word)GC_stop_count | THREAD_RESTARTED)) {
+ /* The thread has been restarted. */
+ if (!in_resend_restart_signals) {
+ /* Some user signal (which we do not block, e.g. SIGQUIT) */
+ /* has already restarted the thread, but nonetheless we */
+ /* need to count the thread in n_live_threads, so that */
+ /* to decrement the semaphore's value proper amount of */
+ /* times. (We are also sending the restart signal to the */
+ /* thread, it is not needed actually but does not hurt.) */
+ } else {
+ continue;
+ /* FIXME: Still, an extremely low chance exists that the */
+ /* user signal restarts the thread after the restart */
+ /* signal has been lost (causing sem_timedwait() to fail) */
+ /* while retrying, causing finally a mismatch between */
+ /* GC_suspend_ack_sem and n_live_threads. */
+ }
+ }
+ n_live_threads++;
+# endif
+# ifdef DEBUG_THREADS
+ GC_log_printf("Sending restart signal to %p\n", (void *)p->id);
+# endif
+# ifdef GC_OPENBSD_UTHREADS
+ if (pthread_resume_np(p -> id) != 0)
+ ABORT("pthread_resume_np failed");
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_UNSUSPENDED, (void *)p->id);
+# else
+ result = raise_signal(p, GC_sig_thr_restart);
+ switch(result) {
+ case ESRCH:
+ /* Not really there anymore. Possible? */
+ n_live_threads--;
+ break;
+ case 0:
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_UNSUSPENDED,
+ (void *)(word)THREAD_SYSTEM_ID(p));
+ break;
+ default:
+ ABORT_ARG1("pthread_kill failed at resume",
+ ": errcode= %d", result);
+ }
+# endif
+ }
+ }
+ }
+ return n_live_threads;
+ }
+#endif /* !NACL */
+
+/* Caller holds allocation lock, and has held it continuously since */
+/* the world stopped. */
+GC_INNER void GC_start_world(void)
+{
+# ifndef NACL
+ int n_live_threads;
+
+ GC_ASSERT(I_HOLD_LOCK());
+# ifdef DEBUG_THREADS
+ GC_log_printf("World starting\n");
+# endif
+# ifndef GC_OPENBSD_UTHREADS
+ AO_store_release(&GC_world_is_stopped, FALSE);
+ /* The updated value should now be visible to the */
+ /* signal handler (note that pthread_kill is not on */
+ /* the list of functions which synchronize memory). */
+ GC_ASSERT(!in_resend_restart_signals);
+# endif
+ n_live_threads = GC_restart_all();
+# ifdef GC_OPENBSD_UTHREADS
+ (void)n_live_threads;
+# else
+ if (GC_retry_signals) {
+ in_resend_restart_signals = TRUE;
+ resend_lost_signals_retry(n_live_threads, GC_restart_all);
+ in_resend_restart_signals = FALSE;
+ } /* else */
+# ifdef GC_NETBSD_THREADS_WORKAROUND
+ else {
+ suspend_restart_barrier(n_live_threads);
+ }
+# endif
+# endif
+# ifdef DEBUG_THREADS
+ GC_log_printf("World started\n");
+# endif
+# else /* NACL */
+# ifdef DEBUG_THREADS
+ GC_log_printf("World starting...\n");
+# endif
+ GC_nacl_park_threads_now = 0;
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_UNSUSPENDED, NULL);
+ /* TODO: Send event for every unsuspended thread. */
+# endif
+}
+
+GC_INNER void GC_stop_init(void)
+{
+# if !defined(GC_OPENBSD_UTHREADS) && !defined(NACL)
+ struct sigaction act;
+ char *str;
+
+ if (SIGNAL_UNSET == GC_sig_suspend)
+ GC_sig_suspend = SIG_SUSPEND;
+ if (SIGNAL_UNSET == GC_sig_thr_restart)
+ GC_sig_thr_restart = SIG_THR_RESTART;
+ if (GC_sig_suspend == GC_sig_thr_restart)
+ ABORT("Cannot use same signal for thread suspend and resume");
+
+ if (sem_init(&GC_suspend_ack_sem, GC_SEM_INIT_PSHARED, 0) != 0)
+ ABORT("sem_init failed");
+
+# ifdef SA_RESTART
+ act.sa_flags = SA_RESTART
+# else
+ act.sa_flags = 0
+# endif
+# ifndef NO_SA_SIGACTION
+ | SA_SIGINFO
+# endif
+ ;
+ if (sigfillset(&act.sa_mask) != 0) {
+ ABORT("sigfillset failed");
+ }
+# ifdef GC_RTEMS_PTHREADS
+ if(sigprocmask(SIG_UNBLOCK, &act.sa_mask, NULL) != 0) {
+ ABORT("sigprocmask failed");
+ }
+# endif
+ GC_remove_allowed_signals(&act.sa_mask);
+ /* GC_sig_thr_restart is set in the resulting mask. */
+ /* It is unmasked by the handler when necessary. */
+# ifndef NO_SA_SIGACTION
+ act.sa_sigaction = GC_suspend_handler;
+# else
+ act.sa_handler = GC_suspend_handler;
+# endif
+ /* act.sa_restorer is deprecated and should not be initialized. */
+ if (sigaction(GC_sig_suspend, &act, NULL) != 0) {
+ ABORT("Cannot set SIG_SUSPEND handler");
+ }
+
+# ifndef NO_SA_SIGACTION
+ act.sa_flags &= ~SA_SIGINFO;
+# endif
+ act.sa_handler = GC_restart_handler;
+ if (sigaction(GC_sig_thr_restart, &act, NULL) != 0) {
+ ABORT("Cannot set SIG_THR_RESTART handler");
+ }
+
+ /* Initialize suspend_handler_mask (excluding GC_sig_thr_restart). */
+ if (sigfillset(&suspend_handler_mask) != 0) ABORT("sigfillset failed");
+ GC_remove_allowed_signals(&suspend_handler_mask);
+ if (sigdelset(&suspend_handler_mask, GC_sig_thr_restart) != 0)
+ ABORT("sigdelset failed");
+
+ /* Override the default value of GC_retry_signals. */
+ str = GETENV("GC_RETRY_SIGNALS");
+ if (str != NULL) {
+ if (*str == '0' && *(str + 1) == '\0') {
+ /* Do not retry if the environment variable is set to "0". */
+ GC_retry_signals = FALSE;
+ } else {
+ GC_retry_signals = TRUE;
+ }
+ }
+ if (GC_retry_signals) {
+ GC_COND_LOG_PRINTF(
+ "Will retry suspend and restart signals if necessary\n");
+ }
+# ifndef NO_SIGNALS_UNBLOCK_IN_MAIN
+ /* Explicitly unblock the signals once before new threads creation. */
+ GC_unblock_gc_signals();
+# endif
+# endif /* !GC_OPENBSD_UTHREADS && !NACL */
+}
+
+#endif /* GC_PTHREADS && !GC_DARWIN_THREADS && !GC_WIN32_THREADS */
diff --git a/graphics/asymptote/gc/pthread_support.c b/graphics/asymptote/gc/pthread_support.c
new file mode 100644
index 0000000000..6075d50c2d
--- /dev/null
+++ b/graphics/asymptote/gc/pthread_support.c
@@ -0,0 +1,2660 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2005 by Hewlett-Packard Company. All rights reserved.
+ * Copyright (c) 2008-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/pthread_support.h"
+
+/*
+ * Support code originally for LinuxThreads, the clone()-based kernel
+ * thread package for Linux which is included in libc6.
+ *
+ * This code no doubt makes some assumptions beyond what is
+ * guaranteed by the pthread standard, though it now does
+ * very little of that. It now also supports NPTL, and many
+ * other Posix thread implementations. We are trying to merge
+ * all flavors of pthread support code into this file.
+ */
+
+#if defined(GC_PTHREADS) && !defined(GC_WIN32_THREADS)
+
+# include <stdlib.h>
+# include <pthread.h>
+# include <sched.h>
+# include <time.h>
+# include <errno.h>
+# include <unistd.h>
+# if !defined(SN_TARGET_ORBIS) && !defined(SN_TARGET_PSP2)
+# if !defined(GC_RTEMS_PTHREADS)
+# include <sys/mman.h>
+# endif
+# include <sys/time.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <fcntl.h>
+# endif
+# include <signal.h>
+
+# include "gc_inline.h"
+
+#if defined(GC_DARWIN_THREADS)
+# include "private/darwin_semaphore.h"
+#else
+# include <semaphore.h>
+#endif /* !GC_DARWIN_THREADS */
+
+#if defined(GC_DARWIN_THREADS) || defined(GC_FREEBSD_THREADS)
+# include <sys/sysctl.h>
+#endif /* GC_DARWIN_THREADS */
+
+#if defined(GC_NETBSD_THREADS) || defined(GC_OPENBSD_THREADS)
+# include <sys/param.h>
+# include <sys/sysctl.h>
+#endif /* GC_NETBSD_THREADS */
+
+/* Allocator lock definitions. */
+#if !defined(USE_SPIN_LOCK)
+ GC_INNER pthread_mutex_t GC_allocate_ml = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+#ifdef GC_ASSERTIONS
+ GC_INNER unsigned long GC_lock_holder = NO_THREAD;
+ /* Used only for assertions. */
+#endif
+
+#if defined(GC_DGUX386_THREADS)
+# include <sys/dg_sys_info.h>
+# include <sys/_int_psem.h>
+ /* sem_t is an uint in DG/UX */
+ typedef unsigned int sem_t;
+#endif /* GC_DGUX386_THREADS */
+
+/* Undefine macros used to redirect pthread primitives. */
+# undef pthread_create
+# ifndef GC_NO_PTHREAD_SIGMASK
+# undef pthread_sigmask
+# endif
+# ifndef GC_NO_PTHREAD_CANCEL
+# undef pthread_cancel
+# endif
+# ifdef GC_HAVE_PTHREAD_EXIT
+# undef pthread_exit
+# endif
+# undef pthread_join
+# undef pthread_detach
+# if defined(GC_OSF1_THREADS) && defined(_PTHREAD_USE_MANGLED_NAMES_) \
+ && !defined(_PTHREAD_USE_PTDNAM_)
+ /* Restore the original mangled names on Tru64 UNIX. */
+# define pthread_create __pthread_create
+# define pthread_join __pthread_join
+# define pthread_detach __pthread_detach
+# ifndef GC_NO_PTHREAD_CANCEL
+# define pthread_cancel __pthread_cancel
+# endif
+# ifdef GC_HAVE_PTHREAD_EXIT
+# define pthread_exit __pthread_exit
+# endif
+# endif
+
+#ifdef GC_USE_LD_WRAP
+# define WRAP_FUNC(f) __wrap_##f
+# define REAL_FUNC(f) __real_##f
+ int REAL_FUNC(pthread_create)(pthread_t *,
+ GC_PTHREAD_CREATE_CONST pthread_attr_t *,
+ void *(*start_routine)(void *), void *);
+ int REAL_FUNC(pthread_join)(pthread_t, void **);
+ int REAL_FUNC(pthread_detach)(pthread_t);
+# ifndef GC_NO_PTHREAD_SIGMASK
+ int REAL_FUNC(pthread_sigmask)(int, const sigset_t *, sigset_t *);
+# endif
+# ifndef GC_NO_PTHREAD_CANCEL
+ int REAL_FUNC(pthread_cancel)(pthread_t);
+# endif
+# ifdef GC_HAVE_PTHREAD_EXIT
+ void REAL_FUNC(pthread_exit)(void *) GC_PTHREAD_EXIT_ATTRIBUTE;
+# endif
+#else
+# ifdef GC_USE_DLOPEN_WRAP
+# include <dlfcn.h>
+# define WRAP_FUNC(f) f
+# define REAL_FUNC(f) GC_real_##f
+ /* We define both GC_f and plain f to be the wrapped function. */
+ /* In that way plain calls work, as do calls from files that */
+ /* included gc.h, which redefined f to GC_f. */
+ /* FIXME: Needs work for DARWIN and True64 (OSF1) */
+ typedef int (* GC_pthread_create_t)(pthread_t *,
+ GC_PTHREAD_CREATE_CONST pthread_attr_t *,
+ void * (*)(void *), void *);
+ static GC_pthread_create_t REAL_FUNC(pthread_create);
+# ifndef GC_NO_PTHREAD_SIGMASK
+ typedef int (* GC_pthread_sigmask_t)(int, const sigset_t *,
+ sigset_t *);
+ static GC_pthread_sigmask_t REAL_FUNC(pthread_sigmask);
+# endif
+ typedef int (* GC_pthread_join_t)(pthread_t, void **);
+ static GC_pthread_join_t REAL_FUNC(pthread_join);
+ typedef int (* GC_pthread_detach_t)(pthread_t);
+ static GC_pthread_detach_t REAL_FUNC(pthread_detach);
+# ifndef GC_NO_PTHREAD_CANCEL
+ typedef int (* GC_pthread_cancel_t)(pthread_t);
+ static GC_pthread_cancel_t REAL_FUNC(pthread_cancel);
+# endif
+# ifdef GC_HAVE_PTHREAD_EXIT
+ typedef void (* GC_pthread_exit_t)(void *) GC_PTHREAD_EXIT_ATTRIBUTE;
+ static GC_pthread_exit_t REAL_FUNC(pthread_exit);
+# endif
+# else
+# define WRAP_FUNC(f) GC_##f
+# if !defined(GC_DGUX386_THREADS)
+# define REAL_FUNC(f) f
+# else /* GC_DGUX386_THREADS */
+# define REAL_FUNC(f) __d10_##f
+# endif /* GC_DGUX386_THREADS */
+# endif
+#endif
+
+#if defined(GC_USE_LD_WRAP) || defined(GC_USE_DLOPEN_WRAP)
+ /* Define GC_ functions as aliases for the plain ones, which will */
+ /* be intercepted. This allows files which include gc.h, and hence */
+ /* generate references to the GC_ symbols, to see the right symbols. */
+ GC_API int GC_pthread_create(pthread_t * t,
+ GC_PTHREAD_CREATE_CONST pthread_attr_t *a,
+ void * (* fn)(void *), void * arg)
+ {
+ return pthread_create(t, a, fn, arg);
+ }
+
+# ifndef GC_NO_PTHREAD_SIGMASK
+ GC_API int GC_pthread_sigmask(int how, const sigset_t *mask,
+ sigset_t *old)
+ {
+ return pthread_sigmask(how, mask, old);
+ }
+# endif /* !GC_NO_PTHREAD_SIGMASK */
+
+ GC_API int GC_pthread_join(pthread_t t, void **res)
+ {
+ return pthread_join(t, res);
+ }
+
+ GC_API int GC_pthread_detach(pthread_t t)
+ {
+ return pthread_detach(t);
+ }
+
+# ifndef GC_NO_PTHREAD_CANCEL
+ GC_API int GC_pthread_cancel(pthread_t t)
+ {
+ return pthread_cancel(t);
+ }
+# endif /* !GC_NO_PTHREAD_CANCEL */
+
+# ifdef GC_HAVE_PTHREAD_EXIT
+ GC_API GC_PTHREAD_EXIT_ATTRIBUTE void GC_pthread_exit(void *retval)
+ {
+ pthread_exit(retval);
+ }
+# endif
+#endif /* Linker-based interception. */
+
+#ifdef GC_USE_DLOPEN_WRAP
+ STATIC GC_bool GC_syms_initialized = FALSE;
+
+ STATIC void GC_init_real_syms(void)
+ {
+ void *dl_handle;
+
+ if (GC_syms_initialized) return;
+# ifdef RTLD_NEXT
+ dl_handle = RTLD_NEXT;
+# else
+ dl_handle = dlopen("libpthread.so.0", RTLD_LAZY);
+ if (NULL == dl_handle) {
+ dl_handle = dlopen("libpthread.so", RTLD_LAZY); /* without ".0" */
+ }
+ if (NULL == dl_handle) ABORT("Couldn't open libpthread");
+# endif
+ REAL_FUNC(pthread_create) = (GC_pthread_create_t)(word)
+ dlsym(dl_handle, "pthread_create");
+# ifdef RTLD_NEXT
+ if (REAL_FUNC(pthread_create) == 0)
+ ABORT("pthread_create not found"
+ " (probably -lgc is specified after -lpthread)");
+# endif
+# ifndef GC_NO_PTHREAD_SIGMASK
+ REAL_FUNC(pthread_sigmask) = (GC_pthread_sigmask_t)(word)
+ dlsym(dl_handle, "pthread_sigmask");
+# endif
+ REAL_FUNC(pthread_join) = (GC_pthread_join_t)(word)
+ dlsym(dl_handle, "pthread_join");
+ REAL_FUNC(pthread_detach) = (GC_pthread_detach_t)(word)
+ dlsym(dl_handle, "pthread_detach");
+# ifndef GC_NO_PTHREAD_CANCEL
+ REAL_FUNC(pthread_cancel) = (GC_pthread_cancel_t)(word)
+ dlsym(dl_handle, "pthread_cancel");
+# endif
+# ifdef GC_HAVE_PTHREAD_EXIT
+ REAL_FUNC(pthread_exit) = (GC_pthread_exit_t)(word)
+ dlsym(dl_handle, "pthread_exit");
+# endif
+ GC_syms_initialized = TRUE;
+ }
+
+# define INIT_REAL_SYMS() if (EXPECT(GC_syms_initialized, TRUE)) {} \
+ else GC_init_real_syms()
+#else
+# define INIT_REAL_SYMS() (void)0
+#endif
+
+static GC_bool parallel_initialized = FALSE;
+
+#if defined(MPROTECT_VDB) && defined(DARWIN)
+ GC_INNER int GC_inner_pthread_create(pthread_t *t,
+ GC_PTHREAD_CREATE_CONST pthread_attr_t *a,
+ void *(*fn)(void *), void *arg)
+ {
+ INIT_REAL_SYMS();
+ return REAL_FUNC(pthread_create)(t, a, fn, arg);
+ }
+#endif
+
+#ifndef GC_ALWAYS_MULTITHREADED
+ GC_INNER GC_bool GC_need_to_lock = FALSE;
+#endif
+
+STATIC int GC_nprocs = 1;
+ /* Number of processors. We may not have */
+ /* access to all of them, but this is as good */
+ /* a guess as any ... */
+
+#ifdef THREAD_LOCAL_ALLOC
+ /* We must explicitly mark ptrfree and gcj free lists, since the free */
+ /* list links wouldn't otherwise be found. We also set them in the */
+ /* normal free lists, since that involves touching less memory than */
+ /* if we scanned them normally. */
+ GC_INNER void GC_mark_thread_local_free_lists(void)
+ {
+ int i;
+ GC_thread p;
+
+ for (i = 0; i < THREAD_TABLE_SZ; ++i) {
+ for (p = GC_threads[i]; 0 != p; p = p -> next) {
+ if (!(p -> flags & FINISHED))
+ GC_mark_thread_local_fls_for(&(p->tlfs));
+ }
+ }
+ }
+
+# if defined(GC_ASSERTIONS)
+ /* Check that all thread-local free-lists are completely marked. */
+ /* Also check that thread-specific-data structures are marked. */
+ void GC_check_tls(void)
+ {
+ int i;
+ GC_thread p;
+
+ for (i = 0; i < THREAD_TABLE_SZ; ++i) {
+ for (p = GC_threads[i]; 0 != p; p = p -> next) {
+ if (!(p -> flags & FINISHED))
+ GC_check_tls_for(&(p->tlfs));
+ }
+ }
+# if defined(USE_CUSTOM_SPECIFIC)
+ if (GC_thread_key != 0)
+ GC_check_tsd_marks(GC_thread_key);
+# endif
+ }
+# endif /* GC_ASSERTIONS */
+
+#endif /* THREAD_LOCAL_ALLOC */
+
+# ifndef MAX_MARKERS
+# define MAX_MARKERS 16
+# endif
+
+#ifdef PARALLEL_MARK
+
+static ptr_t marker_sp[MAX_MARKERS - 1] = {0};
+#ifdef IA64
+ static ptr_t marker_bsp[MAX_MARKERS - 1] = {0};
+#endif
+
+#if defined(GC_DARWIN_THREADS) && !defined(GC_NO_THREADS_DISCOVERY)
+ static mach_port_t marker_mach_threads[MAX_MARKERS - 1] = {0};
+
+ /* Used only by GC_suspend_thread_list(). */
+ GC_INNER GC_bool GC_is_mach_marker(thread_act_t thread)
+ {
+ int i;
+ for (i = 0; i < GC_markers_m1; i++) {
+ if (marker_mach_threads[i] == thread)
+ return TRUE;
+ }
+ return FALSE;
+ }
+#endif /* GC_DARWIN_THREADS */
+
+#ifdef HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG /* NetBSD */
+ static void set_marker_thread_name(unsigned id)
+ {
+ int err = pthread_setname_np(pthread_self(), "GC-marker-%zu",
+ (void*)(size_t)id);
+ if (err != 0)
+ WARN("pthread_setname_np failed, errno= %" WARN_PRIdPTR "\n",
+ (signed_word)err);
+ }
+#elif defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID) \
+ || defined(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID)
+ static void set_marker_thread_name(unsigned id)
+ {
+ char name_buf[16]; /* pthread_setname_np may fail for longer names */
+ int len = sizeof("GC-marker-") - 1;
+
+ /* Compose the name manually as snprintf may be unavailable or */
+ /* "%u directive output may be truncated" warning may occur. */
+ BCOPY("GC-marker-", name_buf, len);
+ if (id >= 10)
+ name_buf[len++] = (char)('0' + (id / 10) % 10);
+ name_buf[len] = (char)('0' + id % 10);
+ name_buf[len + 1] = '\0';
+
+# ifdef HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID /* iOS, OS X */
+ (void)pthread_setname_np(name_buf);
+# else /* Linux, Solaris, etc. */
+ if (pthread_setname_np(pthread_self(), name_buf) != 0)
+ WARN("pthread_setname_np failed\n", 0);
+# endif
+ }
+#else
+# define set_marker_thread_name(id) (void)(id)
+#endif
+
+STATIC void * GC_mark_thread(void * id)
+{
+ word my_mark_no = 0;
+ IF_CANCEL(int cancel_state;)
+
+ if ((word)id == GC_WORD_MAX) return 0; /* to prevent a compiler warning */
+ DISABLE_CANCEL(cancel_state);
+ /* Mark threads are not cancellable; they */
+ /* should be invisible to client. */
+ set_marker_thread_name((unsigned)(word)id);
+ marker_sp[(word)id] = GC_approx_sp();
+# ifdef IA64
+ marker_bsp[(word)id] = GC_save_regs_in_stack();
+# endif
+# if defined(GC_DARWIN_THREADS) && !defined(GC_NO_THREADS_DISCOVERY)
+ marker_mach_threads[(word)id] = mach_thread_self();
+# endif
+
+ /* Inform GC_start_mark_threads about completion of marker data init. */
+ GC_acquire_mark_lock();
+ if (0 == --GC_fl_builder_count) /* count may have a negative value */
+ GC_notify_all_builder();
+
+ for (;; ++my_mark_no) {
+ /* GC_mark_no is passed only to allow GC_help_marker to terminate */
+ /* promptly. This is important if it were called from the signal */
+ /* handler or from the GC lock acquisition code. Under Linux, it's */
+ /* not safe to call it from a signal handler, since it uses mutexes */
+ /* and condition variables. Since it is called only here, the */
+ /* argument is unnecessary. */
+ if (my_mark_no < GC_mark_no || my_mark_no > GC_mark_no + 2) {
+ /* resynchronize if we get far off, e.g. because GC_mark_no */
+ /* wrapped. */
+ my_mark_no = GC_mark_no;
+ }
+# ifdef DEBUG_THREADS
+ GC_log_printf("Starting mark helper for mark number %lu\n",
+ (unsigned long)my_mark_no);
+# endif
+ GC_help_marker(my_mark_no);
+ }
+}
+
+STATIC pthread_t GC_mark_threads[MAX_MARKERS];
+
+#ifdef GLIBC_2_1_MUTEX_HACK
+ /* Ugly workaround for a linux threads bug in the final versions */
+ /* of glibc2.1. Pthread_mutex_trylock sets the mutex owner */
+ /* field even when it fails to acquire the mutex. This causes */
+ /* pthread_cond_wait to die. Remove for glibc2.2. */
+ /* According to the man page, we should use */
+ /* PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, but that isn't actually */
+ /* defined. */
+ static pthread_mutex_t mark_mutex =
+ {0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, {0, 0}};
+#else
+ static pthread_mutex_t mark_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+static int available_markers_m1 = 0;
+
+#ifdef CAN_HANDLE_FORK
+ static pthread_cond_t mark_cv;
+ /* initialized by GC_start_mark_threads_inner */
+#else
+ static pthread_cond_t mark_cv = PTHREAD_COND_INITIALIZER;
+#endif
+
+STATIC void GC_wait_for_gc_completion(GC_bool wait_for_all);
+
+GC_INNER void GC_start_mark_threads_inner(void)
+{
+ int i;
+ pthread_attr_t attr;
+# ifndef NO_MARKER_SPECIAL_SIGMASK
+ sigset_t set, oldset;
+# endif
+
+ GC_ASSERT(I_HOLD_LOCK());
+ ASSERT_CANCEL_DISABLED();
+ if (available_markers_m1 <= 0 || GC_parallel) return;
+ /* Skip if parallel markers disabled or already started. */
+ GC_wait_for_gc_completion(TRUE);
+
+# ifdef CAN_HANDLE_FORK
+ /* Initialize mark_cv (for the first time), or cleanup its value */
+ /* after forking in the child process. All the marker threads in */
+ /* the parent process were blocked on this variable at fork, so */
+ /* pthread_cond_wait() malfunction (hang) is possible in the */
+ /* child process without such a cleanup. */
+ /* TODO: This is not portable, it is better to shortly unblock */
+ /* all marker threads in the parent process at fork. */
+ {
+ pthread_cond_t mark_cv_local = PTHREAD_COND_INITIALIZER;
+ BCOPY(&mark_cv_local, &mark_cv, sizeof(mark_cv));
+ }
+# endif
+
+ GC_ASSERT(GC_fl_builder_count == 0);
+ INIT_REAL_SYMS(); /* for pthread_create */
+ if (0 != pthread_attr_init(&attr)) ABORT("pthread_attr_init failed");
+ if (0 != pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED))
+ ABORT("pthread_attr_setdetachstate failed");
+
+# ifdef DEFAULT_STACK_MAYBE_SMALL
+ /* Default stack size is usually too small: increase it. */
+ /* Otherwise marker threads or GC may run out of space. */
+ {
+ size_t old_size;
+
+ if (pthread_attr_getstacksize(&attr, &old_size) != 0)
+ ABORT("pthread_attr_getstacksize failed");
+ if (old_size < MIN_STACK_SIZE
+ && old_size != 0 /* stack size is known */) {
+ if (pthread_attr_setstacksize(&attr, MIN_STACK_SIZE) != 0)
+ ABORT("pthread_attr_setstacksize failed");
+ }
+ }
+# endif /* DEFAULT_STACK_MAYBE_SMALL */
+
+# ifndef NO_MARKER_SPECIAL_SIGMASK
+ /* Apply special signal mask to GC marker threads, and don't drop */
+ /* user defined signals by GC marker threads. */
+ if (sigfillset(&set) != 0)
+ ABORT("sigfillset failed");
+
+# if !defined(GC_DARWIN_THREADS) && !defined(GC_OPENBSD_UTHREADS) \
+ && !defined(NACL)
+ /* These are used by GC to stop and restart the world. */
+ if (sigdelset(&set, GC_get_suspend_signal()) != 0
+ || sigdelset(&set, GC_get_thr_restart_signal()) != 0)
+ ABORT("sigdelset failed");
+# endif
+
+ if (REAL_FUNC(pthread_sigmask)(SIG_BLOCK, &set, &oldset) < 0) {
+ WARN("pthread_sigmask set failed, no markers started\n", 0);
+ GC_markers_m1 = 0;
+ (void)pthread_attr_destroy(&attr);
+ return;
+ }
+# endif /* !NO_MARKER_SPECIAL_SIGMASK */
+
+ /* To have proper GC_parallel value in GC_help_marker. */
+ GC_markers_m1 = available_markers_m1;
+
+ for (i = 0; i < available_markers_m1; ++i) {
+ if (0 != REAL_FUNC(pthread_create)(GC_mark_threads + i, &attr,
+ GC_mark_thread, (void *)(word)i)) {
+ WARN("Marker thread creation failed\n", 0);
+ /* Don't try to create other marker threads. */
+ GC_markers_m1 = i;
+ break;
+ }
+ }
+
+# ifndef NO_MARKER_SPECIAL_SIGMASK
+ /* Restore previous signal mask. */
+ if (REAL_FUNC(pthread_sigmask)(SIG_SETMASK, &oldset, NULL) < 0) {
+ WARN("pthread_sigmask restore failed\n", 0);
+ }
+# endif
+
+ (void)pthread_attr_destroy(&attr);
+ GC_wait_for_markers_init();
+ GC_COND_LOG_PRINTF("Started %d mark helper threads\n", GC_markers_m1);
+}
+
+#endif /* PARALLEL_MARK */
+
+GC_INNER GC_bool GC_thr_initialized = FALSE;
+
+GC_INNER volatile GC_thread GC_threads[THREAD_TABLE_SZ] = {0};
+
+/* It may not be safe to allocate when we register the first thread. */
+/* As "next" and "status" fields are unused, no need to push this */
+/* (but "backing_store_end" field should be pushed on E2K). */
+static struct GC_Thread_Rep first_thread;
+
+void GC_push_thread_structures(void)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_push_all((/* no volatile */ void *)&GC_threads,
+ (ptr_t)(&GC_threads) + sizeof(GC_threads));
+# ifdef E2K
+ GC_PUSH_ALL_SYM(first_thread.backing_store_end);
+# endif
+# if defined(THREAD_LOCAL_ALLOC) && defined(USE_CUSTOM_SPECIFIC)
+ GC_PUSH_ALL_SYM(GC_thread_key);
+# endif
+}
+
+#ifdef DEBUG_THREADS
+ STATIC int GC_count_threads(void)
+ {
+ int i;
+ int count = 0;
+ GC_ASSERT(I_HOLD_LOCK());
+ for (i = 0; i < THREAD_TABLE_SZ; ++i) {
+ GC_thread th = GC_threads[i];
+ while (th) {
+ if (!(th->flags & FINISHED))
+ ++count;
+ th = th->next;
+ }
+ }
+ return count;
+ }
+#endif /* DEBUG_THREADS */
+
+/* Add a thread to GC_threads. We assume it wasn't already there. */
+/* Caller holds allocation lock. */
+STATIC GC_thread GC_new_thread(pthread_t id)
+{
+ int hv = THREAD_TABLE_INDEX(id);
+ GC_thread result;
+ static GC_bool first_thread_used = FALSE;
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Creating thread %p\n", (void *)id);
+ for (result = GC_threads[hv]; result != NULL; result = result->next)
+ if (!THREAD_EQUAL(result->id, id)) {
+ GC_log_printf("Hash collision at GC_threads[%d]\n", hv);
+ break;
+ }
+# endif
+ GC_ASSERT(I_HOLD_LOCK());
+ if (!EXPECT(first_thread_used, TRUE)) {
+ result = &first_thread;
+ first_thread_used = TRUE;
+ GC_ASSERT(NULL == GC_threads[hv]);
+# if defined(THREAD_SANITIZER) && defined(CPPCHECK)
+ GC_noop1((unsigned char)result->dummy[0]);
+# endif
+ } else {
+ result = (struct GC_Thread_Rep *)
+ GC_INTERNAL_MALLOC(sizeof(struct GC_Thread_Rep), NORMAL);
+ if (result == 0) return(0);
+ }
+ result -> id = id;
+# ifdef USE_TKILL_ON_ANDROID
+ result -> kernel_id = gettid();
+# endif
+ result -> next = GC_threads[hv];
+ GC_threads[hv] = result;
+# ifdef NACL
+ GC_nacl_gc_thread_self = result;
+ GC_nacl_initialize_gc_thread();
+# endif
+ GC_ASSERT(result -> flags == 0 && result -> thread_blocked == 0);
+ if (EXPECT(result != &first_thread, TRUE))
+ GC_dirty(result);
+ return(result);
+}
+
+/* Delete a thread from GC_threads. We assume it is there. */
+/* (The code intentionally traps if it wasn't.) */
+/* It is safe to delete the main thread. */
+STATIC void GC_delete_thread(pthread_t id)
+{
+ int hv = THREAD_TABLE_INDEX(id);
+ GC_thread p = GC_threads[hv];
+ GC_thread prev = NULL;
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Deleting thread %p, n_threads= %d\n",
+ (void *)id, GC_count_threads());
+# endif
+ GC_ASSERT(I_HOLD_LOCK());
+ while (!THREAD_EQUAL(p -> id, id)) {
+ prev = p;
+ p = p -> next;
+ }
+ if (prev == 0) {
+ GC_threads[hv] = p -> next;
+ } else {
+ GC_ASSERT(prev != &first_thread);
+ prev -> next = p -> next;
+ GC_dirty(prev);
+ }
+ if (p != &first_thread) {
+# ifdef GC_DARWIN_THREADS
+ mach_port_deallocate(mach_task_self(), p->stop_info.mach_thread);
+# endif
+ GC_INTERNAL_FREE(p);
+ }
+}
+
+/* If a thread has been joined, but we have not yet */
+/* been notified, then there may be more than one thread */
+/* in the table with the same pthread id. */
+/* This is OK, but we need a way to delete a specific one. */
+STATIC void GC_delete_gc_thread(GC_thread t)
+{
+ pthread_t id = t -> id;
+ int hv = THREAD_TABLE_INDEX(id);
+ GC_thread p = GC_threads[hv];
+ GC_thread prev = NULL;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ while (p != t) {
+ prev = p;
+ p = p -> next;
+ }
+ if (prev == 0) {
+ GC_threads[hv] = p -> next;
+ } else {
+ GC_ASSERT(prev != &first_thread);
+ prev -> next = p -> next;
+ GC_dirty(prev);
+ }
+# ifdef GC_DARWIN_THREADS
+ mach_port_deallocate(mach_task_self(), p->stop_info.mach_thread);
+# endif
+ GC_INTERNAL_FREE(p);
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Deleted thread %p, n_threads= %d\n",
+ (void *)id, GC_count_threads());
+# endif
+}
+
+/* Return a GC_thread corresponding to a given pthread_t. */
+/* Returns 0 if it's not there. */
+/* Caller holds allocation lock or otherwise inhibits */
+/* updates. */
+/* If there is more than one thread with the given id we */
+/* return the most recent one. */
+GC_INNER GC_thread GC_lookup_thread(pthread_t id)
+{
+ GC_thread p = GC_threads[THREAD_TABLE_INDEX(id)];
+
+ while (p != 0 && !THREAD_EQUAL(p -> id, id)) p = p -> next;
+ return(p);
+}
+
+#ifndef GC_NO_FINALIZATION
+ /* Called by GC_finalize() (in case of an allocation failure observed). */
+ GC_INNER void GC_reset_finalizer_nested(void)
+ {
+ GC_thread me = GC_lookup_thread(pthread_self());
+
+ me->finalizer_nested = 0;
+ }
+
+ /* Checks and updates the thread-local level of finalizers recursion. */
+ /* Returns NULL if GC_invoke_finalizers() should not be called by the */
+ /* collector (to minimize the risk of a deep finalizers recursion), */
+ /* otherwise returns a pointer to the thread-local finalizer_nested. */
+ /* Called by GC_notify_or_invoke_finalizers() only (the GC lock is */
+ /* held). */
+ GC_INNER unsigned char *GC_check_finalizer_nested(void)
+ {
+ GC_thread me = GC_lookup_thread(pthread_self());
+ unsigned nesting_level;
+
+# if defined(INCLUDE_LINUX_THREAD_DESCR) && defined(REDIRECT_MALLOC)
+ /* As noted in GC_start_routine, an allocation may happen in */
+ /* GC_get_stack_base, causing GC_notify_or_invoke_finalizers */
+ /* to be called before the thread gets registered. */
+ if (EXPECT(NULL == me, FALSE)) return NULL;
+# endif
+ nesting_level = me->finalizer_nested;
+ if (nesting_level) {
+ /* We are inside another GC_invoke_finalizers(). */
+ /* Skip some implicitly-called GC_invoke_finalizers() */
+ /* depending on the nesting (recursion) level. */
+ if (++me->finalizer_skipped < (1U << nesting_level)) return NULL;
+ me->finalizer_skipped = 0;
+ }
+ me->finalizer_nested = (unsigned char)(nesting_level + 1);
+ return &me->finalizer_nested;
+ }
+#endif /* !GC_NO_FINALIZATION */
+
+#if defined(GC_ASSERTIONS) && defined(THREAD_LOCAL_ALLOC)
+ /* This is called from thread-local GC_malloc(). */
+ GC_bool GC_is_thread_tsd_valid(void *tsd)
+ {
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ me = GC_lookup_thread(pthread_self());
+ UNLOCK();
+ return (word)tsd >= (word)(&me->tlfs)
+ && (word)tsd < (word)(&me->tlfs) + sizeof(me->tlfs);
+ }
+#endif /* GC_ASSERTIONS && THREAD_LOCAL_ALLOC */
+
+GC_API int GC_CALL GC_thread_is_registered(void)
+{
+ pthread_t self = pthread_self();
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ me = GC_lookup_thread(self);
+ UNLOCK();
+ return me != NULL && !(me -> flags & FINISHED);
+}
+
+static pthread_t main_pthread_id;
+static void *main_stack, *main_altstack;
+static word main_stack_size, main_altstack_size;
+
+GC_API void GC_CALL GC_register_altstack(void *stack, GC_word stack_size,
+ void *altstack,
+ GC_word altstack_size)
+{
+ GC_thread me;
+ pthread_t self = pthread_self();
+ DCL_LOCK_STATE;
+
+ LOCK();
+ me = GC_lookup_thread(self);
+ if (me != NULL) {
+ me->stack = (ptr_t)stack;
+ me->stack_size = stack_size;
+ me->altstack = (ptr_t)altstack;
+ me->altstack_size = altstack_size;
+ } else {
+ /* This happens if we are called before GC_thr_init. */
+ main_pthread_id = self;
+ main_stack = stack;
+ main_stack_size = stack_size;
+ main_altstack = altstack;
+ main_altstack_size = altstack_size;
+ }
+ UNLOCK();
+}
+
+#ifdef CAN_HANDLE_FORK
+
+ /* Prevent TSan false positive about the race during items removal */
+ /* from GC_threads. (The race cannot happen since only one thread */
+ /* survives in the child.) */
+# ifdef CAN_CALL_ATFORK
+ GC_ATTR_NO_SANITIZE_THREAD
+# endif
+ static void store_to_threads_table(int hv, GC_thread me)
+ {
+ GC_threads[hv] = me;
+ }
+
+/* Remove all entries from the GC_threads table, except the */
+/* one for the current thread. We need to do this in the child */
+/* process after a fork(), since only the current thread */
+/* survives in the child. */
+STATIC void GC_remove_all_threads_but_me(void)
+{
+ pthread_t self = pthread_self();
+ int hv;
+
+ for (hv = 0; hv < THREAD_TABLE_SZ; ++hv) {
+ GC_thread p, next;
+ GC_thread me = NULL;
+
+ for (p = GC_threads[hv]; 0 != p; p = next) {
+ next = p -> next;
+ if (THREAD_EQUAL(p -> id, self)
+ && me == NULL) { /* ignore dead threads with the same id */
+ me = p;
+ p -> next = 0;
+# ifdef GC_DARWIN_THREADS
+ /* Update thread Id after fork (it is OK to call */
+ /* GC_destroy_thread_local and GC_free_inner */
+ /* before update). */
+ me -> stop_info.mach_thread = mach_thread_self();
+# endif
+# ifdef USE_TKILL_ON_ANDROID
+ me -> kernel_id = gettid();
+# endif
+# if defined(THREAD_LOCAL_ALLOC) && !defined(USE_CUSTOM_SPECIFIC)
+ {
+ int res;
+
+ /* Some TLS implementations might be not fork-friendly, so */
+ /* we re-assign thread-local pointer to 'tlfs' for safety */
+ /* instead of the assertion check (again, it is OK to call */
+ /* GC_destroy_thread_local and GC_free_inner before). */
+ res = GC_setspecific(GC_thread_key, &me->tlfs);
+ if (COVERT_DATAFLOW(res) != 0)
+ ABORT("GC_setspecific failed (in child)");
+ }
+# endif
+ } else {
+# ifdef THREAD_LOCAL_ALLOC
+ if (!(p -> flags & FINISHED)) {
+ /* Cannot call GC_destroy_thread_local here. The free */
+ /* lists may be in an inconsistent state (as thread p may */
+ /* be updating one of the lists by GC_generic_malloc_many */
+ /* or GC_FAST_MALLOC_GRANS when fork is invoked). */
+ /* This should not be a problem because the lost elements */
+ /* of the free lists will be collected during GC. */
+ GC_remove_specific_after_fork(GC_thread_key, p -> id);
+ }
+# endif
+ /* TODO: To avoid TSan hang (when updating GC_bytes_freed), */
+ /* we just skip explicit freeing of GC_threads entries. */
+# if !defined(THREAD_SANITIZER) || !defined(CAN_CALL_ATFORK)
+ if (p != &first_thread) GC_INTERNAL_FREE(p);
+# endif
+ }
+ }
+ store_to_threads_table(hv, me);
+ }
+}
+#endif /* CAN_HANDLE_FORK */
+
+#ifdef USE_PROC_FOR_LIBRARIES
+ GC_INNER GC_bool GC_segment_is_thread_stack(ptr_t lo, ptr_t hi)
+ {
+ int i;
+ GC_thread p;
+
+ GC_ASSERT(I_HOLD_LOCK());
+# ifdef PARALLEL_MARK
+ for (i = 0; i < GC_markers_m1; ++i) {
+ if ((word)marker_sp[i] > (word)lo && (word)marker_sp[i] < (word)hi)
+ return TRUE;
+# ifdef IA64
+ if ((word)marker_bsp[i] > (word)lo
+ && (word)marker_bsp[i] < (word)hi)
+ return TRUE;
+# endif
+ }
+# endif
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (0 != p -> stack_end) {
+# ifdef STACK_GROWS_UP
+ if ((word)p->stack_end >= (word)lo
+ && (word)p->stack_end < (word)hi)
+ return TRUE;
+# else /* STACK_GROWS_DOWN */
+ if ((word)p->stack_end > (word)lo
+ && (word)p->stack_end <= (word)hi)
+ return TRUE;
+# endif
+ }
+ }
+ }
+ return FALSE;
+ }
+#endif /* USE_PROC_FOR_LIBRARIES */
+
+#if (defined(HAVE_PTHREAD_ATTR_GET_NP) || defined(HAVE_PTHREAD_GETATTR_NP)) \
+ && defined(IA64)
+ /* Find the largest stack_base smaller than bound. May be used */
+ /* to find the boundary between a register stack and adjacent */
+ /* immediately preceding memory stack. */
+ GC_INNER ptr_t GC_greatest_stack_base_below(ptr_t bound)
+ {
+ int i;
+ GC_thread p;
+ ptr_t result = 0;
+
+ GC_ASSERT(I_HOLD_LOCK());
+# ifdef PARALLEL_MARK
+ for (i = 0; i < GC_markers_m1; ++i) {
+ if ((word)marker_sp[i] > (word)result
+ && (word)marker_sp[i] < (word)bound)
+ result = marker_sp[i];
+ }
+# endif
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if ((word)p->stack_end > (word)result
+ && (word)p->stack_end < (word)bound) {
+ result = p -> stack_end;
+ }
+ }
+ }
+ return result;
+ }
+#endif /* IA64 */
+
+#ifndef STAT_READ
+# define STAT_READ read
+ /* If read is wrapped, this may need to be redefined to call */
+ /* the real one. */
+#endif
+
+#ifdef GC_HPUX_THREADS
+# define GC_get_nprocs() pthread_num_processors_np()
+
+#elif defined(GC_OSF1_THREADS) || defined(GC_AIX_THREADS) \
+ || defined(GC_HAIKU_THREADS) || defined(GC_SOLARIS_THREADS) \
+ || defined(HURD) || defined(HOST_ANDROID) || defined(NACL)
+ GC_INLINE int GC_get_nprocs(void)
+ {
+ int nprocs = (int)sysconf(_SC_NPROCESSORS_ONLN);
+ return nprocs > 0 ? nprocs : 1; /* ignore error silently */
+ }
+
+#elif defined(GC_IRIX_THREADS)
+ GC_INLINE int GC_get_nprocs(void)
+ {
+ int nprocs = (int)sysconf(_SC_NPROC_ONLN);
+ return nprocs > 0 ? nprocs : 1; /* ignore error silently */
+ }
+
+#elif defined(GC_LINUX_THREADS) /* && !HOST_ANDROID && !NACL */
+ /* Return the number of processors. */
+ STATIC int GC_get_nprocs(void)
+ {
+ /* Should be "return sysconf(_SC_NPROCESSORS_ONLN);" but that */
+ /* appears to be buggy in many cases. */
+ /* We look for lines "cpu<n>" in /proc/stat. */
+# define PROC_STAT_BUF_SZ ((1 + MAX_MARKERS) * 100) /* should be enough */
+ /* No need to read the entire /proc/stat to get maximum cpu<N> as */
+ /* - the requested lines are located at the beginning of the file; */
+ /* - the lines with cpu<N> where N > MAX_MARKERS are not needed. */
+ char stat_buf[PROC_STAT_BUF_SZ+1];
+ int f;
+ int result, i, len;
+
+ f = open("/proc/stat", O_RDONLY);
+ if (f < 0) {
+ WARN("Could not open /proc/stat\n", 0);
+ return 1; /* assume an uniprocessor */
+ }
+ len = STAT_READ(f, stat_buf, sizeof(stat_buf)-1);
+ /* Unlikely that we need to retry because of an incomplete read here. */
+ if (len < 0) {
+ WARN("Failed to read /proc/stat, errno= %" WARN_PRIdPTR "\n",
+ (signed_word)errno);
+ close(f);
+ return 1;
+ }
+ stat_buf[len] = '\0'; /* to avoid potential buffer overrun by atoi() */
+ close(f);
+
+ result = 1;
+ /* Some old kernels only have a single "cpu nnnn ..." */
+ /* entry in /proc/stat. We identify those as */
+ /* uniprocessors. */
+
+ for (i = 0; i < len - 4; ++i) {
+ if (stat_buf[i] == '\n' && stat_buf[i+1] == 'c'
+ && stat_buf[i+2] == 'p' && stat_buf[i+3] == 'u') {
+ int cpu_no = atoi(&stat_buf[i + 4]);
+ if (cpu_no >= result)
+ result = cpu_no + 1;
+ }
+ }
+ return result;
+ }
+
+#elif defined(GC_DGUX386_THREADS)
+ /* Return the number of processors, or i <= 0 if it can't be determined. */
+ STATIC int GC_get_nprocs(void)
+ {
+ int numCpus;
+ struct dg_sys_info_pm_info pm_sysinfo;
+ int status = 0;
+
+ status = dg_sys_info((long int *) &pm_sysinfo,
+ DG_SYS_INFO_PM_INFO_TYPE, DG_SYS_INFO_PM_CURRENT_VERSION);
+ if (status < 0)
+ /* set -1 for error */
+ numCpus = -1;
+ else
+ /* Active CPUs */
+ numCpus = pm_sysinfo.idle_vp_count;
+ return(numCpus);
+ }
+
+#elif defined(GC_DARWIN_THREADS) || defined(GC_FREEBSD_THREADS) \
+ || defined(GC_NETBSD_THREADS) || defined(GC_OPENBSD_THREADS)
+ STATIC int GC_get_nprocs(void)
+ {
+ int mib[] = {CTL_HW,HW_NCPU};
+ int res;
+ size_t len = sizeof(res);
+
+ sysctl(mib, sizeof(mib)/sizeof(int), &res, &len, NULL, 0);
+ return res;
+ }
+
+#else
+ /* E.g., GC_RTEMS_PTHREADS */
+# define GC_get_nprocs() 1 /* not implemented */
+#endif /* !GC_LINUX_THREADS && !GC_DARWIN_THREADS && ... */
+
+#if defined(ARM32) && defined(GC_LINUX_THREADS) && !defined(NACL)
+ /* Some buggy Linux/arm kernels show only non-sleeping CPUs in */
+ /* /proc/stat (and /proc/cpuinfo), so another data system source is */
+ /* tried first. Result <= 0 on error. */
+ STATIC int GC_get_nprocs_present(void)
+ {
+ char stat_buf[16];
+ int f;
+ int len;
+
+ f = open("/sys/devices/system/cpu/present", O_RDONLY);
+ if (f < 0)
+ return -1; /* cannot open the file */
+
+ len = STAT_READ(f, stat_buf, sizeof(stat_buf));
+ close(f);
+
+ /* Recognized file format: "0\n" or "0-<max_cpu_id>\n" */
+ /* The file might probably contain a comma-separated list */
+ /* but we do not need to handle it (just silently ignore). */
+ if (len < 2 || stat_buf[0] != '0' || stat_buf[len - 1] != '\n') {
+ return 0; /* read error or unrecognized content */
+ } else if (len == 2) {
+ return 1; /* an uniprocessor */
+ } else if (stat_buf[1] != '-') {
+ return 0; /* unrecognized content */
+ }
+
+ stat_buf[len - 1] = '\0'; /* terminate the string */
+ return atoi(&stat_buf[2]) + 1; /* skip "0-" and parse max_cpu_num */
+ }
+#endif /* ARM32 && GC_LINUX_THREADS && !NACL */
+
+#if defined(CAN_HANDLE_FORK) && defined(THREAD_SANITIZER)
+# include "private/gc_pmark.h" /* for MS_NONE */
+
+ /* Workaround for TSan which does not notice that the GC lock */
+ /* is acquired in fork_prepare_proc(). */
+ GC_ATTR_NO_SANITIZE_THREAD
+ static GC_bool collection_in_progress(void)
+ {
+ return GC_mark_state != MS_NONE;
+ }
+#else
+# define collection_in_progress() GC_collection_in_progress()
+#endif
+
+/* We hold the GC lock. Wait until an in-progress GC has finished. */
+/* Repeatedly RELEASES GC LOCK in order to wait. */
+/* If wait_for_all is true, then we exit with the GC lock held and no */
+/* collection in progress; otherwise we just wait for the current GC */
+/* to finish. */
+STATIC void GC_wait_for_gc_completion(GC_bool wait_for_all)
+{
+ DCL_LOCK_STATE;
+# if !defined(THREAD_SANITIZER) || !defined(CAN_CALL_ATFORK)
+ /* GC_lock_holder is accessed with the lock held, so there is no */
+ /* data race actually (unlike what is reported by TSan). */
+ GC_ASSERT(I_HOLD_LOCK());
+# endif
+ ASSERT_CANCEL_DISABLED();
+ if (GC_incremental && collection_in_progress()) {
+ word old_gc_no = GC_gc_no;
+
+ /* Make sure that no part of our stack is still on the mark stack, */
+ /* since it's about to be unmapped. */
+ while (GC_incremental && collection_in_progress()
+ && (wait_for_all || old_gc_no == GC_gc_no)) {
+ ENTER_GC();
+ GC_in_thread_creation = TRUE;
+ GC_collect_a_little_inner(1);
+ GC_in_thread_creation = FALSE;
+ EXIT_GC();
+ UNLOCK();
+ sched_yield();
+ LOCK();
+ }
+ }
+}
+
+#ifdef CAN_HANDLE_FORK
+/* Procedures called before and after a fork. The goal here is to make */
+/* it safe to call GC_malloc() in a forked child. It's unclear that is */
+/* attainable, since the single UNIX spec seems to imply that one */
+/* should only call async-signal-safe functions, and we probably can't */
+/* quite guarantee that. But we give it our best shot. (That same */
+/* spec also implies that it's not safe to call the system malloc */
+/* between fork() and exec(). Thus we're doing no worse than it.) */
+
+IF_CANCEL(static int fork_cancel_state;)
+ /* protected by allocation lock. */
+
+# ifdef PARALLEL_MARK
+# ifdef THREAD_SANITIZER
+# if defined(GC_ASSERTIONS) && defined(CAN_CALL_ATFORK)
+ STATIC void GC_generic_lock(pthread_mutex_t *);
+# endif
+ GC_ATTR_NO_SANITIZE_THREAD
+ static void wait_for_reclaim_atfork(void);
+# else
+# define wait_for_reclaim_atfork() GC_wait_for_reclaim()
+# endif
+# endif /* PARALLEL_MARK */
+
+/* Called before a fork() */
+#if defined(GC_ASSERTIONS) && defined(CAN_CALL_ATFORK)
+ /* GC_lock_holder is updated safely (no data race actually). */
+ GC_ATTR_NO_SANITIZE_THREAD
+#endif
+static void fork_prepare_proc(void)
+{
+ /* Acquire all relevant locks, so that after releasing the locks */
+ /* the child will see a consistent state in which monitor */
+ /* invariants hold. Unfortunately, we can't acquire libc locks */
+ /* we might need, and there seems to be no guarantee that libc */
+ /* must install a suitable fork handler. */
+ /* Wait for an ongoing GC to finish, since we can't finish it in */
+ /* the (one remaining thread in) the child. */
+ LOCK();
+ DISABLE_CANCEL(fork_cancel_state);
+ /* Following waits may include cancellation points. */
+# if defined(PARALLEL_MARK)
+ if (GC_parallel)
+ wait_for_reclaim_atfork();
+# endif
+ GC_wait_for_gc_completion(TRUE);
+# if defined(PARALLEL_MARK)
+ if (GC_parallel) {
+# if defined(THREAD_SANITIZER) && defined(GC_ASSERTIONS) \
+ && defined(CAN_CALL_ATFORK)
+ /* Prevent TSan false positive about the data race */
+ /* when updating GC_mark_lock_holder. */
+ GC_generic_lock(&mark_mutex);
+# else
+ GC_acquire_mark_lock();
+# endif
+ }
+# endif
+ GC_acquire_dirty_lock();
+}
+
+/* Called in parent after a fork() (even if the latter failed). */
+#if defined(GC_ASSERTIONS) && defined(CAN_CALL_ATFORK)
+ GC_ATTR_NO_SANITIZE_THREAD
+#endif
+static void fork_parent_proc(void)
+{
+ GC_release_dirty_lock();
+# if defined(PARALLEL_MARK)
+ if (GC_parallel) {
+# if defined(THREAD_SANITIZER) && defined(GC_ASSERTIONS) \
+ && defined(CAN_CALL_ATFORK)
+ /* To match that in fork_prepare_proc. */
+ (void)pthread_mutex_unlock(&mark_mutex);
+# else
+ GC_release_mark_lock();
+# endif
+ }
+# endif
+ RESTORE_CANCEL(fork_cancel_state);
+ UNLOCK();
+}
+
+/* Called in child after a fork() */
+#if defined(GC_ASSERTIONS) && defined(CAN_CALL_ATFORK)
+ GC_ATTR_NO_SANITIZE_THREAD
+#endif
+static void fork_child_proc(void)
+{
+ GC_release_dirty_lock();
+# ifndef GC_DISABLE_INCREMENTAL
+ GC_dirty_update_child();
+# endif
+# ifdef PARALLEL_MARK
+ if (GC_parallel) {
+# if defined(THREAD_SANITIZER) && defined(GC_ASSERTIONS) \
+ && defined(CAN_CALL_ATFORK)
+ (void)pthread_mutex_unlock(&mark_mutex);
+# else
+ GC_release_mark_lock();
+# endif
+ /* Turn off parallel marking in the child, since we are probably */
+ /* just going to exec, and we would have to restart mark threads. */
+ GC_parallel = FALSE;
+ }
+# ifdef THREAD_SANITIZER
+ /* TSan does not support threads creation in the child process. */
+ available_markers_m1 = 0;
+# endif
+# endif
+ /* Clean up the thread table, so that just our thread is left. */
+ GC_remove_all_threads_but_me();
+ RESTORE_CANCEL(fork_cancel_state);
+ UNLOCK();
+ /* Even though after a fork the child only inherits the single */
+ /* thread that called the fork(), if another thread in the parent */
+ /* was attempting to lock the mutex while being held in */
+ /* fork_child_prepare(), the mutex will be left in an inconsistent */
+ /* state in the child after the UNLOCK. This is the case, at */
+ /* least, in Mac OS X and leads to an unusable GC in the child */
+ /* which will block when attempting to perform any GC operation */
+ /* that acquires the allocation mutex. */
+# ifdef USE_PTHREAD_LOCKS
+ GC_ASSERT(I_DONT_HOLD_LOCK());
+ /* Reinitialize the mutex. It should be safe since we are */
+ /* running this in the child which only inherits a single thread. */
+ /* mutex_destroy() may return EBUSY, which makes no sense, but */
+ /* that is the reason for the need of the reinitialization. */
+ (void)pthread_mutex_destroy(&GC_allocate_ml);
+ /* TODO: Probably some targets might need the default mutex */
+ /* attribute to be passed instead of NULL. */
+ if (0 != pthread_mutex_init(&GC_allocate_ml, NULL))
+ ABORT("pthread_mutex_init failed (in child)");
+# endif
+}
+
+ /* Routines for fork handling by client (no-op if pthread_atfork works). */
+ GC_API void GC_CALL GC_atfork_prepare(void)
+ {
+ if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
+ if (GC_handle_fork <= 0)
+ fork_prepare_proc();
+ }
+
+ GC_API void GC_CALL GC_atfork_parent(void)
+ {
+ if (GC_handle_fork <= 0)
+ fork_parent_proc();
+ }
+
+ GC_API void GC_CALL GC_atfork_child(void)
+ {
+ if (GC_handle_fork <= 0)
+ fork_child_proc();
+ }
+#endif /* CAN_HANDLE_FORK */
+
+#ifdef INCLUDE_LINUX_THREAD_DESCR
+ __thread int GC_dummy_thread_local;
+#endif
+
+#ifdef PARALLEL_MARK
+ static void setup_mark_lock(void);
+
+ static unsigned required_markers_cnt = 0;
+ /* The default value (0) means the number of */
+ /* markers should be selected automatically. */
+#endif /* PARALLEL_MARK */
+
+GC_API void GC_CALL GC_set_markers_count(unsigned markers GC_ATTR_UNUSED)
+{
+# ifdef PARALLEL_MARK
+ required_markers_cnt = markers < MAX_MARKERS ? markers : MAX_MARKERS;
+# endif
+}
+
+#ifndef DONT_USE_ATEXIT
+ STATIC pthread_t GC_main_thread_id;
+
+ GC_INNER GC_bool GC_is_main_thread(void)
+ {
+ GC_ASSERT(GC_thr_initialized);
+ return THREAD_EQUAL(GC_main_thread_id, pthread_self());
+ }
+#endif /* !DONT_USE_ATEXIT */
+
+GC_INNER void GC_thr_init(void)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+ if (GC_thr_initialized) return;
+ GC_thr_initialized = TRUE;
+
+ GC_ASSERT((word)&GC_threads % sizeof(word) == 0);
+# ifdef CAN_HANDLE_FORK
+ /* Prepare for forks if requested. */
+ if (GC_handle_fork) {
+# ifdef CAN_CALL_ATFORK
+ if (pthread_atfork(fork_prepare_proc, fork_parent_proc,
+ fork_child_proc) == 0) {
+ /* Handlers successfully registered. */
+ GC_handle_fork = 1;
+ } else
+# endif
+ /* else */ if (GC_handle_fork != -1)
+ ABORT("pthread_atfork failed");
+ }
+# endif
+# ifdef INCLUDE_LINUX_THREAD_DESCR
+ /* Explicitly register the region including the address */
+ /* of a thread local variable. This should include thread */
+ /* locals for the main thread, except for those allocated */
+ /* in response to dlopen calls. */
+ {
+ ptr_t thread_local_addr = (ptr_t)(&GC_dummy_thread_local);
+ ptr_t main_thread_start, main_thread_end;
+ if (!GC_enclosing_mapping(thread_local_addr, &main_thread_start,
+ &main_thread_end)) {
+ ABORT("Failed to find mapping for main thread thread locals");
+ } else {
+ /* main_thread_start and main_thread_end are initialized. */
+ GC_add_roots_inner(main_thread_start, main_thread_end, FALSE);
+ }
+ }
+# endif
+ /* Add the initial thread, so we can stop it. */
+ {
+ pthread_t self = pthread_self();
+ GC_thread t = GC_new_thread(self);
+
+ if (t == NULL)
+ ABORT("Failed to allocate memory for the initial thread");
+# ifdef GC_DARWIN_THREADS
+ t -> stop_info.mach_thread = mach_thread_self();
+# else
+ t -> stop_info.stack_ptr = GC_approx_sp();
+# endif
+# ifndef DONT_USE_ATEXIT
+ GC_main_thread_id = self;
+# endif
+ t -> flags = DETACHED | MAIN_THREAD;
+ if (THREAD_EQUAL(self, main_pthread_id)) {
+ t -> stack = (ptr_t)main_stack;
+ t -> stack_size = main_stack_size;
+ t -> altstack = (ptr_t)main_altstack;
+ t -> altstack_size = main_altstack_size;
+ }
+ }
+
+ /* Set GC_nprocs and available_markers_m1. */
+ {
+ char * nprocs_string = GETENV("GC_NPROCS");
+ GC_nprocs = -1;
+ if (nprocs_string != NULL) GC_nprocs = atoi(nprocs_string);
+ }
+ if (GC_nprocs <= 0
+# if defined(ARM32) && defined(GC_LINUX_THREADS) && !defined(NACL)
+ && (GC_nprocs = GC_get_nprocs_present()) <= 1
+ /* Workaround for some Linux/arm kernels */
+# endif
+ )
+ {
+ GC_nprocs = GC_get_nprocs();
+ }
+ if (GC_nprocs <= 0) {
+ WARN("GC_get_nprocs() returned %" WARN_PRIdPTR "\n",
+ (signed_word)GC_nprocs);
+ GC_nprocs = 2; /* assume dual-core */
+# ifdef PARALLEL_MARK
+ available_markers_m1 = 0; /* but use only one marker */
+# endif
+ } else {
+# ifdef PARALLEL_MARK
+ {
+ char * markers_string = GETENV("GC_MARKERS");
+ int markers = required_markers_cnt;
+
+ if (markers_string != NULL) {
+ markers = atoi(markers_string);
+ if (markers <= 0 || markers > MAX_MARKERS) {
+ WARN("Too big or invalid number of mark threads: %" WARN_PRIdPTR
+ "; using maximum threads\n", (signed_word)markers);
+ markers = MAX_MARKERS;
+ }
+ } else if (0 == markers) {
+ /* Unless the client sets the desired number of */
+ /* parallel markers, it is determined based on the */
+ /* number of CPU cores. */
+ markers = GC_nprocs;
+# if defined(GC_MIN_MARKERS) && !defined(CPPCHECK)
+ /* This is primarily for targets without getenv(). */
+ if (markers < GC_MIN_MARKERS)
+ markers = GC_MIN_MARKERS;
+# endif
+ if (markers > MAX_MARKERS)
+ markers = MAX_MARKERS; /* silently limit the value */
+ }
+ available_markers_m1 = markers - 1;
+ }
+# endif
+ }
+ GC_COND_LOG_PRINTF("Number of processors: %d\n", GC_nprocs);
+
+# if defined(BASE_ATOMIC_OPS_EMULATED) && !defined(GC_DARWIN_THREADS) \
+ && !defined(GC_OPENBSD_UTHREADS) && !defined(NACL) \
+ && !defined(PLATFORM_STOP_WORLD) && !defined(SN_TARGET_PSP2)
+ /* Ensure the process is running on just one CPU core. */
+ /* This is needed because the AO primitives emulated with */
+ /* locks cannot be used inside signal handlers. */
+ {
+ cpu_set_t mask;
+ int cpu_set_cnt = 0;
+ int cpu_lowest_set = 0;
+ int i = GC_nprocs > 1 ? GC_nprocs : 2; /* check at least 2 cores */
+
+ if (sched_getaffinity(0 /* current process */,
+ sizeof(mask), &mask) == -1)
+ ABORT_ARG1("sched_getaffinity failed", ": errno= %d", errno);
+ while (i-- > 0)
+ if (CPU_ISSET(i, &mask)) {
+ cpu_lowest_set = i;
+ cpu_set_cnt++;
+ }
+ if (0 == cpu_set_cnt)
+ ABORT("sched_getaffinity returned empty mask");
+ if (cpu_set_cnt > 1) {
+ CPU_ZERO(&mask);
+ CPU_SET(cpu_lowest_set, &mask); /* select just one CPU */
+ if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
+ ABORT_ARG1("sched_setaffinity failed", ": errno= %d", errno);
+ WARN("CPU affinity mask is set to %p\n", (word)1 << cpu_lowest_set);
+ }
+ }
+# endif /* BASE_ATOMIC_OPS_EMULATED */
+
+# ifndef GC_DARWIN_THREADS
+ GC_stop_init();
+# endif
+
+# ifdef PARALLEL_MARK
+ if (available_markers_m1 <= 0) {
+ /* Disable parallel marking. */
+ GC_parallel = FALSE;
+ GC_COND_LOG_PRINTF(
+ "Single marker thread, turning off parallel marking\n");
+ } else {
+ setup_mark_lock();
+ }
+# endif
+}
+
+/* Perform all initializations, including those that */
+/* may require allocation. */
+/* Called without allocation lock. */
+/* Must be called before a second thread is created. */
+/* Did we say it's called without the allocation lock? */
+GC_INNER void GC_init_parallel(void)
+{
+# if defined(THREAD_LOCAL_ALLOC)
+ DCL_LOCK_STATE;
+# endif
+ if (parallel_initialized) return;
+ parallel_initialized = TRUE;
+
+ /* GC_init() calls us back, so set flag first. */
+ if (!GC_is_initialized) GC_init();
+ /* Initialize thread local free lists if used. */
+# if defined(THREAD_LOCAL_ALLOC)
+ LOCK();
+ GC_init_thread_local(&(GC_lookup_thread(pthread_self())->tlfs));
+ UNLOCK();
+# endif
+}
+
+#ifndef GC_NO_PTHREAD_SIGMASK
+ GC_API int WRAP_FUNC(pthread_sigmask)(int how, const sigset_t *set,
+ sigset_t *oset)
+ {
+ sigset_t fudged_set;
+
+ INIT_REAL_SYMS();
+ if (set != NULL && (how == SIG_BLOCK || how == SIG_SETMASK)) {
+ int sig_suspend = GC_get_suspend_signal();
+
+ fudged_set = *set;
+ GC_ASSERT(sig_suspend >= 0);
+ if (sigdelset(&fudged_set, sig_suspend) != 0)
+ ABORT("sigdelset failed");
+ set = &fudged_set;
+ }
+ return(REAL_FUNC(pthread_sigmask)(how, set, oset));
+ }
+#endif /* !GC_NO_PTHREAD_SIGMASK */
+
+static GC_bool do_blocking_enter(GC_thread me)
+{
+# if defined(SPARC) || defined(IA64)
+ ptr_t stack_ptr = GC_save_regs_in_stack();
+ /* TODO: regs saving already done by GC_with_callee_saves_pushed */
+# elif defined(E2K)
+ size_t stack_size;
+# endif
+ GC_bool topOfStackUnset = FALSE;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_ASSERT(!(me -> thread_blocked));
+# ifdef SPARC
+ me -> stop_info.stack_ptr = stack_ptr;
+# else
+ me -> stop_info.stack_ptr = GC_approx_sp();
+# endif
+# if defined(GC_DARWIN_THREADS) && !defined(DARWIN_DONT_PARSE_STACK)
+ if (me -> topOfStack == NULL) {
+ /* GC_do_blocking_inner is not called recursively, */
+ /* so topOfStack should be computed now. */
+ topOfStackUnset = TRUE;
+ me -> topOfStack = GC_FindTopOfStack(0);
+ }
+# endif
+# ifdef IA64
+ me -> backing_store_ptr = stack_ptr;
+# elif defined(E2K)
+ GC_ASSERT(NULL == me -> backing_store_end);
+ stack_size = GC_alloc_and_get_procedure_stack(&me->backing_store_end);
+ me->backing_store_ptr = me->backing_store_end + stack_size;
+# endif
+ me -> thread_blocked = (unsigned char)TRUE;
+ /* Save context here if we want to support precise stack marking */
+ return topOfStackUnset;
+}
+
+static void do_blocking_leave(GC_thread me, GC_bool topOfStackUnset)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+# if defined(CPPCHECK)
+ GC_noop1((word)&me->thread_blocked);
+# endif
+ me -> thread_blocked = FALSE;
+# ifdef E2K
+ GC_ASSERT(me -> backing_store_end != NULL);
+ /* Note that me->backing_store_end value here may differ from */
+ /* the one stored in this function previously. */
+ GC_INTERNAL_FREE(me -> backing_store_end);
+ me -> backing_store_ptr = NULL;
+ me -> backing_store_end = NULL;
+# endif
+# if defined(GC_DARWIN_THREADS) && !defined(DARWIN_DONT_PARSE_STACK)
+ if (topOfStackUnset)
+ me -> topOfStack = NULL; /* make topOfStack unset again */
+# else
+ (void)topOfStackUnset;
+# endif
+}
+
+/* Wrapper for functions that are likely to block for an appreciable */
+/* length of time. */
+GC_INNER void GC_do_blocking_inner(ptr_t data, void * context GC_ATTR_UNUSED)
+{
+ struct blocking_data *d = (struct blocking_data *)data;
+ GC_thread me;
+ GC_bool topOfStackUnset;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ me = GC_lookup_thread(pthread_self());
+ topOfStackUnset = do_blocking_enter(me);
+ UNLOCK();
+
+ d -> client_data = (d -> fn)(d -> client_data);
+
+ LOCK(); /* This will block if the world is stopped. */
+# ifdef LINT2
+ {
+# ifdef GC_ASSERTIONS
+ GC_thread saved_me = me;
+# endif
+
+ /* The pointer to the GC thread descriptor should not be */
+ /* changed while the thread is registered but a static */
+ /* analysis tool might complain that this pointer value */
+ /* (obtained in the first locked section) is unreliable in */
+ /* the second locked section. */
+ me = GC_lookup_thread(pthread_self());
+ GC_ASSERT(me == saved_me);
+ }
+# endif
+# if defined(GC_ENABLE_SUSPEND_THREAD) && !defined(GC_DARWIN_THREADS) \
+ && !defined(GC_OPENBSD_UTHREADS) && !defined(NACL) \
+ && !defined(PLATFORM_STOP_WORLD) && !defined(SN_TARGET_PSP2)
+ /* Note: this code cannot be moved into do_blocking_leave() */
+ /* otherwise there could be a static analysis tool warning */
+ /* (false positive) about unlock without a matching lock. */
+ while (EXPECT((me -> stop_info.ext_suspend_cnt & 1) != 0, FALSE)) {
+ word suspend_cnt = (word)(me -> stop_info.ext_suspend_cnt);
+ /* read suspend counter (number) before unlocking */
+
+ UNLOCK();
+ GC_suspend_self_inner(me, suspend_cnt);
+ LOCK();
+ }
+# endif
+ do_blocking_leave(me, topOfStackUnset);
+ UNLOCK();
+}
+
+#if defined(GC_ENABLE_SUSPEND_THREAD) && !defined(GC_DARWIN_THREADS) \
+ && !defined(GC_OPENBSD_UTHREADS) && !defined(NACL) \
+ && !defined(PLATFORM_STOP_WORLD) && !defined(SN_TARGET_PSP2)
+ /* Similar to GC_do_blocking_inner() but assuming the GC lock is held */
+ /* and fn is GC_suspend_self_inner. */
+ GC_INNER void GC_suspend_self_blocked(ptr_t thread_me,
+ void * context GC_ATTR_UNUSED)
+ {
+ GC_thread me = (GC_thread)thread_me;
+ GC_bool topOfStackUnset;
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ topOfStackUnset = do_blocking_enter(me);
+ while ((me -> stop_info.ext_suspend_cnt & 1) != 0) {
+ word suspend_cnt = (word)(me -> stop_info.ext_suspend_cnt);
+
+ UNLOCK();
+ GC_suspend_self_inner(me, suspend_cnt);
+ LOCK();
+ }
+ do_blocking_leave(me, topOfStackUnset);
+ }
+#endif
+
+GC_API void GC_CALL GC_set_stackbottom(void *gc_thread_handle,
+ const struct GC_stack_base *sb)
+{
+ GC_thread t = (GC_thread)gc_thread_handle;
+
+ GC_ASSERT(sb -> mem_base != NULL);
+ if (!EXPECT(GC_is_initialized, TRUE)) {
+ GC_ASSERT(NULL == t);
+ } else {
+ GC_ASSERT(I_HOLD_LOCK());
+ if (NULL == t) /* current thread? */
+ t = GC_lookup_thread(pthread_self());
+ GC_ASSERT((t -> flags & FINISHED) == 0);
+ GC_ASSERT(!(t -> thread_blocked)
+ && NULL == t -> traced_stack_sect); /* for now */
+
+ if ((t -> flags & MAIN_THREAD) == 0) {
+ t -> stack_end = (ptr_t)sb->mem_base;
+# ifdef IA64
+ t -> backing_store_end = (ptr_t)sb->reg_base;
+# endif
+ return;
+ }
+ /* Otherwise alter the stack bottom of the primordial thread. */
+ }
+
+ GC_stackbottom = (char*)sb->mem_base;
+# ifdef IA64
+ GC_register_stackbottom = (ptr_t)sb->reg_base;
+# endif
+}
+
+GC_API void * GC_CALL GC_get_my_stackbottom(struct GC_stack_base *sb)
+{
+ pthread_t self = pthread_self();
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ me = GC_lookup_thread(self);
+ /* The thread is assumed to be registered. */
+ if ((me -> flags & MAIN_THREAD) == 0) {
+ sb -> mem_base = me -> stack_end;
+# ifdef IA64
+ sb -> reg_base = me -> backing_store_end;
+# elif defined(E2K)
+ sb -> reg_base = NULL;
+# endif
+ } else {
+ sb -> mem_base = GC_stackbottom;
+# ifdef IA64
+ sb -> reg_base = GC_register_stackbottom;
+# elif defined(E2K)
+ sb -> reg_base = NULL;
+# endif
+ }
+ UNLOCK();
+ return (void *)me; /* gc_thread_handle */
+}
+
+/* GC_call_with_gc_active() has the opposite to GC_do_blocking() */
+/* functionality. It might be called from a user function invoked by */
+/* GC_do_blocking() to temporarily back allow calling any GC function */
+/* and/or manipulating pointers to the garbage collected heap. */
+GC_API void * GC_CALL GC_call_with_gc_active(GC_fn_type fn,
+ void * client_data)
+{
+ struct GC_traced_stack_sect_s stacksect;
+ pthread_t self = pthread_self();
+ GC_thread me;
+# ifdef E2K
+ size_t stack_size;
+# endif
+ DCL_LOCK_STATE;
+
+ LOCK(); /* This will block if the world is stopped. */
+ me = GC_lookup_thread(self);
+
+ /* Adjust our stack bottom value (this could happen unless */
+ /* GC_get_stack_base() was used which returned GC_SUCCESS). */
+ if ((me -> flags & MAIN_THREAD) == 0) {
+ GC_ASSERT(me -> stack_end != NULL);
+ if ((word)me->stack_end HOTTER_THAN (word)(&stacksect))
+ me -> stack_end = (ptr_t)(&stacksect);
+ } else {
+ /* The original stack. */
+ if ((word)GC_stackbottom HOTTER_THAN (word)(&stacksect))
+ GC_stackbottom = (ptr_t)COVERT_DATAFLOW(&stacksect);
+ }
+
+ if (!me->thread_blocked) {
+ /* We are not inside GC_do_blocking() - do nothing more. */
+ UNLOCK();
+ client_data = fn(client_data);
+ /* Prevent treating the above as a tail call. */
+ GC_noop1(COVERT_DATAFLOW(&stacksect));
+ return client_data; /* result */
+ }
+
+# if defined(GC_ENABLE_SUSPEND_THREAD) && !defined(GC_DARWIN_THREADS) \
+ && !defined(GC_OPENBSD_UTHREADS) && !defined(NACL) \
+ && !defined(PLATFORM_STOP_WORLD) && !defined(SN_TARGET_PSP2)
+ while (EXPECT((me -> stop_info.ext_suspend_cnt & 1) != 0, FALSE)) {
+ word suspend_cnt = (word)(me -> stop_info.ext_suspend_cnt);
+ UNLOCK();
+ GC_suspend_self_inner(me, suspend_cnt);
+ LOCK();
+ }
+# endif
+
+ /* Setup new "stack section". */
+ stacksect.saved_stack_ptr = me -> stop_info.stack_ptr;
+# ifdef IA64
+ /* This is the same as in GC_call_with_stack_base(). */
+ stacksect.backing_store_end = GC_save_regs_in_stack();
+ /* Unnecessarily flushes register stack, */
+ /* but that probably doesn't hurt. */
+ stacksect.saved_backing_store_ptr = me -> backing_store_ptr;
+# elif defined(E2K)
+ GC_ASSERT(me -> backing_store_end != NULL);
+ GC_INTERNAL_FREE(me -> backing_store_end);
+ me -> backing_store_ptr = NULL;
+ me -> backing_store_end = NULL;
+# endif
+ stacksect.prev = me -> traced_stack_sect;
+ me -> thread_blocked = FALSE;
+ me -> traced_stack_sect = &stacksect;
+
+ UNLOCK();
+ client_data = fn(client_data);
+ GC_ASSERT(me -> thread_blocked == FALSE);
+ GC_ASSERT(me -> traced_stack_sect == &stacksect);
+
+ /* Restore original "stack section". */
+# if defined(CPPCHECK)
+ GC_noop1((word)me->traced_stack_sect);
+# endif
+# ifdef E2K
+ (void)GC_save_regs_in_stack();
+# endif
+ LOCK();
+ me -> traced_stack_sect = stacksect.prev;
+# ifdef IA64
+ me -> backing_store_ptr = stacksect.saved_backing_store_ptr;
+# elif defined(E2K)
+ GC_ASSERT(NULL == me -> backing_store_end);
+ stack_size = GC_alloc_and_get_procedure_stack(&me->backing_store_end);
+ me->backing_store_ptr = me->backing_store_end + stack_size;
+# endif
+ me -> thread_blocked = (unsigned char)TRUE;
+ me -> stop_info.stack_ptr = stacksect.saved_stack_ptr;
+ UNLOCK();
+
+ return client_data; /* result */
+}
+
+STATIC void GC_unregister_my_thread_inner(GC_thread me)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+# ifdef DEBUG_THREADS
+ GC_log_printf(
+ "Unregistering thread %p, gc_thread= %p, n_threads= %d\n",
+ (void *)me->id, (void *)me, GC_count_threads());
+# endif
+ GC_ASSERT(!(me -> flags & FINISHED));
+# if defined(THREAD_LOCAL_ALLOC)
+ GC_ASSERT(GC_getspecific(GC_thread_key) == &me->tlfs);
+ GC_destroy_thread_local(&(me->tlfs));
+# endif
+# ifdef NACL
+ GC_nacl_shutdown_gc_thread();
+ GC_nacl_gc_thread_self = NULL;
+# endif
+# if defined(GC_HAVE_PTHREAD_EXIT) || !defined(GC_NO_PTHREAD_CANCEL)
+ /* Handle DISABLED_GC flag which is set by the */
+ /* intercepted pthread_cancel or pthread_exit. */
+ if ((me -> flags & DISABLED_GC) != 0) {
+ GC_dont_gc--;
+ }
+# endif
+ if (me -> flags & DETACHED) {
+ GC_delete_thread(pthread_self());
+ } else {
+ me -> flags |= FINISHED;
+ }
+# if defined(THREAD_LOCAL_ALLOC)
+ /* It is required to call remove_specific defined in specific.c. */
+ GC_remove_specific(GC_thread_key);
+# endif
+}
+
+GC_API int GC_CALL GC_unregister_my_thread(void)
+{
+ pthread_t self = pthread_self();
+ GC_thread me;
+ IF_CANCEL(int cancel_state;)
+ DCL_LOCK_STATE;
+
+ LOCK();
+ DISABLE_CANCEL(cancel_state);
+ /* Wait for any GC that may be marking from our stack to */
+ /* complete before we remove this thread. */
+ GC_wait_for_gc_completion(FALSE);
+ me = GC_lookup_thread(self);
+# ifdef DEBUG_THREADS
+ GC_log_printf(
+ "Called GC_unregister_my_thread on %p, gc_thread= %p\n",
+ (void *)self, (void *)me);
+# endif
+ GC_ASSERT(THREAD_EQUAL(me->id, self));
+ GC_unregister_my_thread_inner(me);
+ RESTORE_CANCEL(cancel_state);
+ UNLOCK();
+ return GC_SUCCESS;
+}
+
+/* Called at thread exit. */
+/* Never called for main thread. That's OK, since it */
+/* results in at most a tiny one-time leak. And */
+/* linuxthreads doesn't reclaim the main threads */
+/* resources or id anyway. */
+GC_INNER_PTHRSTART void GC_thread_exit_proc(void *arg)
+{
+ IF_CANCEL(int cancel_state;)
+ DCL_LOCK_STATE;
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Called GC_thread_exit_proc on %p, gc_thread= %p\n",
+ (void *)((GC_thread)arg)->id, arg);
+# endif
+ LOCK();
+ DISABLE_CANCEL(cancel_state);
+ GC_wait_for_gc_completion(FALSE);
+ GC_unregister_my_thread_inner((GC_thread)arg);
+ RESTORE_CANCEL(cancel_state);
+ UNLOCK();
+}
+
+#if !defined(SN_TARGET_ORBIS) && !defined(SN_TARGET_PSP2)
+ GC_API int WRAP_FUNC(pthread_join)(pthread_t thread, void **retval)
+ {
+ int result;
+ GC_thread t;
+ DCL_LOCK_STATE;
+
+ INIT_REAL_SYMS();
+ LOCK();
+ t = (GC_thread)COVERT_DATAFLOW(GC_lookup_thread(thread));
+ /* This is guaranteed to be the intended one, since the thread id */
+ /* can't have been recycled by pthreads. */
+ UNLOCK();
+ result = REAL_FUNC(pthread_join)(thread, retval);
+# if defined(GC_FREEBSD_THREADS)
+ /* On FreeBSD, the wrapped pthread_join() sometimes returns (what
+ appears to be) a spurious EINTR which caused the test and real code
+ to gratuitously fail. Having looked at system pthread library source
+ code, I see how this return code may be generated. In one path of
+ code, pthread_join() just returns the errno setting of the thread
+ being joined. This does not match the POSIX specification or the
+ local man pages thus I have taken the liberty to catch this one
+ spurious return value properly conditionalized on GC_FREEBSD_THREADS. */
+ if (result == EINTR) result = 0;
+# endif
+ if (result == 0) {
+ LOCK();
+ /* Here the pthread thread id may have been recycled. */
+ /* Delete the thread from GC_threads (unless it has been */
+ /* registered again from the client thread key destructor). */
+ if ((t -> flags & FINISHED) != 0)
+ GC_delete_gc_thread(t);
+ UNLOCK();
+ }
+ return result;
+ }
+
+ GC_API int WRAP_FUNC(pthread_detach)(pthread_t thread)
+ {
+ int result;
+ GC_thread t;
+ DCL_LOCK_STATE;
+
+ INIT_REAL_SYMS();
+ LOCK();
+ t = (GC_thread)COVERT_DATAFLOW(GC_lookup_thread(thread));
+ UNLOCK();
+ result = REAL_FUNC(pthread_detach)(thread);
+ if (result == 0) {
+ LOCK();
+ t -> flags |= DETACHED;
+ /* Here the pthread thread id may have been recycled. */
+ if ((t -> flags & FINISHED) != 0) {
+ GC_delete_gc_thread(t);
+ }
+ UNLOCK();
+ }
+ return result;
+ }
+#endif /* !SN_TARGET_ORBIS && !SN_TARGET_PSP2 */
+
+#ifndef GC_NO_PTHREAD_CANCEL
+ /* We should deal with the fact that apparently on Solaris and, */
+ /* probably, on some Linux we can't collect while a thread is */
+ /* exiting, since signals aren't handled properly. This currently */
+ /* gives rise to deadlocks. The only workaround seen is to intercept */
+ /* pthread_cancel() and pthread_exit(), and disable the collections */
+ /* until the thread exit handler is called. That's ugly, because we */
+ /* risk growing the heap unnecessarily. But it seems that we don't */
+ /* really have an option in that the process is not in a fully */
+ /* functional state while a thread is exiting. */
+ GC_API int WRAP_FUNC(pthread_cancel)(pthread_t thread)
+ {
+# ifdef CANCEL_SAFE
+ GC_thread t;
+ DCL_LOCK_STATE;
+# endif
+
+ INIT_REAL_SYMS();
+# ifdef CANCEL_SAFE
+ LOCK();
+ t = GC_lookup_thread(thread);
+ /* We test DISABLED_GC because pthread_exit could be called at */
+ /* the same time. (If t is NULL then pthread_cancel should */
+ /* return ESRCH.) */
+ if (t != NULL && (t -> flags & DISABLED_GC) == 0) {
+ t -> flags |= DISABLED_GC;
+ GC_dont_gc++;
+ }
+ UNLOCK();
+# endif
+ return REAL_FUNC(pthread_cancel)(thread);
+ }
+#endif /* !GC_NO_PTHREAD_CANCEL */
+
+#ifdef GC_HAVE_PTHREAD_EXIT
+ GC_API GC_PTHREAD_EXIT_ATTRIBUTE void WRAP_FUNC(pthread_exit)(void *retval)
+ {
+ pthread_t self = pthread_self();
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+ INIT_REAL_SYMS();
+ LOCK();
+ me = GC_lookup_thread(self);
+ /* We test DISABLED_GC because someone else could call */
+ /* pthread_cancel at the same time. */
+ if (me != 0 && (me -> flags & DISABLED_GC) == 0) {
+ me -> flags |= DISABLED_GC;
+ GC_dont_gc++;
+ }
+ UNLOCK();
+
+ REAL_FUNC(pthread_exit)(retval);
+ }
+#endif /* GC_HAVE_PTHREAD_EXIT */
+
+GC_INNER GC_bool GC_in_thread_creation = FALSE;
+ /* Protected by allocation lock. */
+
+GC_INLINE void GC_record_stack_base(GC_thread me,
+ const struct GC_stack_base *sb)
+{
+# ifndef GC_DARWIN_THREADS
+ me -> stop_info.stack_ptr = (ptr_t)sb->mem_base;
+# endif
+ me -> stack_end = (ptr_t)sb->mem_base;
+ if (me -> stack_end == NULL)
+ ABORT("Bad stack base in GC_register_my_thread");
+# ifdef IA64
+ me -> backing_store_end = (ptr_t)sb->reg_base;
+# endif
+}
+
+STATIC GC_thread GC_register_my_thread_inner(const struct GC_stack_base *sb,
+ pthread_t my_pthread)
+{
+ GC_thread me;
+
+ GC_in_thread_creation = TRUE; /* OK to collect from unknown thread. */
+ me = GC_new_thread(my_pthread);
+ GC_in_thread_creation = FALSE;
+ if (me == 0)
+ ABORT("Failed to allocate memory for thread registering");
+# ifdef GC_DARWIN_THREADS
+ me -> stop_info.mach_thread = mach_thread_self();
+# endif
+ GC_record_stack_base(me, sb);
+# ifdef GC_EXPLICIT_SIGNALS_UNBLOCK
+ /* Since this could be executed from a detached thread */
+ /* destructor, our signals might already be blocked. */
+ GC_unblock_gc_signals();
+# endif
+ return me;
+}
+
+GC_API void GC_CALL GC_allow_register_threads(void)
+{
+# ifdef GC_ASSERTIONS
+ DCL_LOCK_STATE;
+
+ /* Check GC is initialized and the current thread is registered. */
+ LOCK(); /* just to match that in win32_threads.c */
+ GC_ASSERT(GC_lookup_thread(pthread_self()) != 0);
+ UNLOCK();
+# endif
+ INIT_REAL_SYMS(); /* to initialize symbols while single-threaded */
+ GC_init_lib_bounds();
+ GC_start_mark_threads();
+ set_need_to_lock();
+}
+
+GC_API int GC_CALL GC_register_my_thread(const struct GC_stack_base *sb)
+{
+ pthread_t self = pthread_self();
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+ if (GC_need_to_lock == FALSE)
+ ABORT("Threads explicit registering is not previously enabled");
+
+ LOCK();
+ me = GC_lookup_thread(self);
+ if (0 == me) {
+ me = GC_register_my_thread_inner(sb, self);
+# if defined(CPPCHECK)
+ GC_noop1(me->flags);
+# endif
+ me -> flags |= DETACHED;
+ /* Treat as detached, since we do not need to worry about */
+ /* pointer results. */
+# if defined(THREAD_LOCAL_ALLOC)
+ GC_init_thread_local(&(me->tlfs));
+# endif
+ UNLOCK();
+ return GC_SUCCESS;
+ } else if ((me -> flags & FINISHED) != 0) {
+ /* This code is executed when a thread is registered from the */
+ /* client thread key destructor. */
+# ifdef NACL
+ GC_nacl_gc_thread_self = me;
+ GC_nacl_initialize_gc_thread();
+# endif
+# ifdef GC_DARWIN_THREADS
+ /* Reinitialize mach_thread to avoid thread_suspend fail */
+ /* with MACH_SEND_INVALID_DEST error. */
+ me -> stop_info.mach_thread = mach_thread_self();
+# endif
+ GC_record_stack_base(me, sb);
+ me -> flags &= ~FINISHED; /* but not DETACHED */
+# ifdef GC_EXPLICIT_SIGNALS_UNBLOCK
+ /* Since this could be executed from a thread destructor, */
+ /* our signals might be blocked. */
+ GC_unblock_gc_signals();
+# endif
+# if defined(THREAD_LOCAL_ALLOC)
+ GC_init_thread_local(&(me->tlfs));
+# endif
+# if defined(GC_ENABLE_SUSPEND_THREAD) && !defined(GC_DARWIN_THREADS) \
+ && !defined(GC_OPENBSD_UTHREADS) && !defined(NACL) \
+ && !defined(PLATFORM_STOP_WORLD) && !defined(SN_TARGET_PSP2)
+ if ((me -> stop_info.ext_suspend_cnt & 1) != 0) {
+ GC_with_callee_saves_pushed(GC_suspend_self_blocked, (ptr_t)me);
+ }
+# endif
+ UNLOCK();
+ return GC_SUCCESS;
+ } else {
+ UNLOCK();
+ return GC_DUPLICATE;
+ }
+}
+
+struct start_info {
+ void *(*start_routine)(void *);
+ void *arg;
+ word flags;
+ sem_t registered; /* 1 ==> in our thread table, but */
+ /* parent hasn't yet noticed. */
+};
+
+/* Called from GC_inner_start_routine(). Defined in this file to */
+/* minimize the number of include files in pthread_start.c (because */
+/* sem_t and sem_post() are not used in that file directly). */
+GC_INNER_PTHRSTART GC_thread GC_start_rtn_prepare_thread(
+ void *(**pstart)(void *),
+ void **pstart_arg,
+ struct GC_stack_base *sb, void *arg)
+{
+ struct start_info * si = (struct start_info *)arg;
+ pthread_t self = pthread_self();
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Starting thread %p, pid= %ld, sp= %p\n",
+ (void *)self, (long)getpid(), (void *)&arg);
+# endif
+ LOCK();
+ me = GC_register_my_thread_inner(sb, self);
+ me -> flags = si -> flags;
+# if defined(THREAD_LOCAL_ALLOC)
+ GC_init_thread_local(&(me->tlfs));
+# endif
+ UNLOCK();
+ *pstart = si -> start_routine;
+# ifdef DEBUG_THREADS
+ GC_log_printf("start_routine= %p\n", (void *)(signed_word)(*pstart));
+# endif
+ *pstart_arg = si -> arg;
+ sem_post(&(si -> registered)); /* Last action on si. */
+ /* OK to deallocate. */
+ return me;
+}
+
+#if !defined(SN_TARGET_ORBIS) && !defined(SN_TARGET_PSP2)
+ STATIC void * GC_start_routine(void * arg)
+ {
+# ifdef INCLUDE_LINUX_THREAD_DESCR
+ struct GC_stack_base sb;
+
+# ifdef REDIRECT_MALLOC
+ /* GC_get_stack_base may call pthread_getattr_np, which can */
+ /* unfortunately call realloc, which may allocate from an */
+ /* unregistered thread. This is unpleasant, since it might */
+ /* force heap growth (or, even, heap overflow). */
+ GC_disable();
+# endif
+ if (GC_get_stack_base(&sb) != GC_SUCCESS)
+ ABORT("Failed to get thread stack base");
+# ifdef REDIRECT_MALLOC
+ GC_enable();
+# endif
+ return GC_inner_start_routine(&sb, arg);
+# else
+ return GC_call_with_stack_base(GC_inner_start_routine, arg);
+# endif
+ }
+
+ GC_API int WRAP_FUNC(pthread_create)(pthread_t *new_thread,
+ GC_PTHREAD_CREATE_CONST pthread_attr_t *attr,
+ void *(*start_routine)(void *), void *arg)
+ {
+ int result;
+ int detachstate;
+ word my_flags = 0;
+ struct start_info si;
+ DCL_LOCK_STATE;
+ /* This is otherwise saved only in an area mmapped by the thread */
+ /* library, which isn't visible to the collector. */
+
+ /* We resist the temptation to muck with the stack size here, */
+ /* even if the default is unreasonably small. That's the client's */
+ /* responsibility. */
+
+ INIT_REAL_SYMS();
+ if (!EXPECT(parallel_initialized, TRUE))
+ GC_init_parallel();
+ GC_init_lib_bounds();
+ if (sem_init(&si.registered, GC_SEM_INIT_PSHARED, 0) != 0)
+ ABORT("sem_init failed");
+
+ si.start_routine = start_routine;
+ si.arg = arg;
+ LOCK();
+ if (!EXPECT(GC_thr_initialized, TRUE))
+ GC_thr_init();
+# ifdef GC_ASSERTIONS
+ {
+ size_t stack_size = 0;
+ if (NULL != attr) {
+ if (pthread_attr_getstacksize(attr, &stack_size) != 0)
+ ABORT("pthread_attr_getstacksize failed");
+ }
+ if (0 == stack_size) {
+ pthread_attr_t my_attr;
+
+ if (pthread_attr_init(&my_attr) != 0)
+ ABORT("pthread_attr_init failed");
+ if (pthread_attr_getstacksize(&my_attr, &stack_size) != 0)
+ ABORT("pthread_attr_getstacksize failed");
+ (void)pthread_attr_destroy(&my_attr);
+ }
+ /* On Solaris 10, with default attr initialization, */
+ /* stack_size remains 0. Fudge it. */
+ if (0 == stack_size) {
+# ifndef SOLARIS
+ WARN("Failed to get stack size for assertion checking\n", 0);
+# endif
+ stack_size = 1000000;
+ }
+ GC_ASSERT(stack_size >= 65536);
+ /* Our threads may need to do some work for the GC. */
+ /* Ridiculously small threads won't work, and they */
+ /* probably wouldn't work anyway. */
+ }
+# endif
+ if (NULL == attr) {
+ detachstate = PTHREAD_CREATE_JOINABLE;
+ } else {
+ if (pthread_attr_getdetachstate(attr, &detachstate) != 0)
+ ABORT("pthread_attr_getdetachstate failed");
+ }
+ if (PTHREAD_CREATE_DETACHED == detachstate) my_flags |= DETACHED;
+ si.flags = my_flags;
+ UNLOCK();
+# ifdef DEBUG_THREADS
+ GC_log_printf("About to start new thread from thread %p\n",
+ (void *)pthread_self());
+# endif
+# ifdef PARALLEL_MARK
+ if (EXPECT(!GC_parallel && available_markers_m1 > 0, FALSE))
+ GC_start_mark_threads();
+# endif
+ set_need_to_lock();
+ result = REAL_FUNC(pthread_create)(new_thread, attr, GC_start_routine,
+ &si);
+
+ /* Wait until child has been added to the thread table. */
+ /* This also ensures that we hold onto the stack-allocated si until */
+ /* the child is done with it. */
+ if (0 == result) {
+ IF_CANCEL(int cancel_state;)
+
+# ifdef DEBUG_THREADS
+ /* new_thread is non-NULL because pthread_create requires it. */
+ GC_log_printf("Started thread %p\n", (void *)(*new_thread));
+# endif
+ DISABLE_CANCEL(cancel_state);
+ /* pthread_create is not a cancellation point. */
+ while (0 != sem_wait(&si.registered)) {
+# if defined(GC_HAIKU_THREADS)
+ /* To workaround some bug in Haiku semaphores. */
+ if (EACCES == errno) continue;
+# endif
+ if (EINTR != errno) ABORT("sem_wait failed");
+ }
+ RESTORE_CANCEL(cancel_state);
+ }
+ sem_destroy(&si.registered);
+ return(result);
+ }
+#endif /* !SN_TARGET_ORBIS && !SN_TARGET_PSP2 */
+
+#if defined(USE_SPIN_LOCK) || !defined(NO_PTHREAD_TRYLOCK)
+/* Spend a few cycles in a way that can't introduce contention with */
+/* other threads. */
+#define GC_PAUSE_SPIN_CYCLES 10
+STATIC void GC_pause(void)
+{
+ int i;
+
+ for (i = 0; i < GC_PAUSE_SPIN_CYCLES; ++i) {
+ /* Something that's unlikely to be optimized away. */
+# if defined(AO_HAVE_compiler_barrier) \
+ && !defined(BASE_ATOMIC_OPS_EMULATED)
+ AO_compiler_barrier();
+# else
+ GC_noop1(i);
+# endif
+ }
+}
+#endif
+
+#ifndef SPIN_MAX
+# define SPIN_MAX 128 /* Maximum number of calls to GC_pause before */
+ /* give up. */
+#endif
+
+GC_INNER volatile GC_bool GC_collecting = FALSE;
+ /* A hint that we're in the collector and */
+ /* holding the allocation lock for an */
+ /* extended period. */
+
+#if (!defined(USE_SPIN_LOCK) && !defined(NO_PTHREAD_TRYLOCK)) \
+ || defined(PARALLEL_MARK)
+/* If we don't want to use the below spinlock implementation, either */
+/* because we don't have a GC_test_and_set implementation, or because */
+/* we don't want to risk sleeping, we can still try spinning on */
+/* pthread_mutex_trylock for a while. This appears to be very */
+/* beneficial in many cases. */
+/* I suspect that under high contention this is nearly always better */
+/* than the spin lock. But it's a bit slower on a uniprocessor. */
+/* Hence we still default to the spin lock. */
+/* This is also used to acquire the mark lock for the parallel */
+/* marker. */
+
+/* Here we use a strict exponential backoff scheme. I don't know */
+/* whether that's better or worse than the above. We eventually */
+/* yield by calling pthread_mutex_lock(); it never makes sense to */
+/* explicitly sleep. */
+
+/* #define LOCK_STATS */
+/* Note that LOCK_STATS requires AO_HAVE_test_and_set. */
+#ifdef LOCK_STATS
+ volatile AO_t GC_spin_count = 0;
+ volatile AO_t GC_block_count = 0;
+ volatile AO_t GC_unlocked_count = 0;
+#endif
+
+STATIC void GC_generic_lock(pthread_mutex_t * lock)
+{
+#ifndef NO_PTHREAD_TRYLOCK
+ unsigned pause_length = 1;
+ unsigned i;
+
+ if (0 == pthread_mutex_trylock(lock)) {
+# ifdef LOCK_STATS
+ (void)AO_fetch_and_add1(&GC_unlocked_count);
+# endif
+ return;
+ }
+ for (; pause_length <= SPIN_MAX; pause_length <<= 1) {
+ for (i = 0; i < pause_length; ++i) {
+ GC_pause();
+ }
+ switch(pthread_mutex_trylock(lock)) {
+ case 0:
+# ifdef LOCK_STATS
+ (void)AO_fetch_and_add1(&GC_spin_count);
+# endif
+ return;
+ case EBUSY:
+ break;
+ default:
+ ABORT("Unexpected error from pthread_mutex_trylock");
+ }
+ }
+#endif /* !NO_PTHREAD_TRYLOCK */
+# ifdef LOCK_STATS
+ (void)AO_fetch_and_add1(&GC_block_count);
+# endif
+ pthread_mutex_lock(lock);
+}
+
+#endif /* !USE_SPIN_LOCK || ... */
+
+#if defined(AO_HAVE_char_load) && !defined(BASE_ATOMIC_OPS_EMULATED)
+# define is_collecting() \
+ ((GC_bool)AO_char_load((unsigned char *)&GC_collecting))
+#else
+ /* GC_collecting is a hint, a potential data race between */
+ /* GC_lock() and ENTER/EXIT_GC() is OK to ignore. */
+# define is_collecting() GC_collecting
+#endif
+
+#if defined(USE_SPIN_LOCK)
+
+/* Reasonably fast spin locks. Basically the same implementation */
+/* as STL alloc.h. This isn't really the right way to do this. */
+/* but until the POSIX scheduling mess gets straightened out ... */
+
+GC_INNER volatile AO_TS_t GC_allocate_lock = AO_TS_INITIALIZER;
+
+# define low_spin_max 30 /* spin cycles if we suspect uniprocessor */
+# define high_spin_max SPIN_MAX /* spin cycles for multiprocessor */
+
+ static volatile AO_t spin_max = low_spin_max;
+ static volatile AO_t last_spins = 0;
+ /* A potential data race between */
+ /* threads invoking GC_lock which reads */
+ /* and updates spin_max and last_spins */
+ /* could be ignored because these */
+ /* variables are hints only. */
+
+GC_INNER void GC_lock(void)
+{
+ unsigned my_spin_max;
+ unsigned my_last_spins;
+ unsigned i;
+
+ if (AO_test_and_set_acquire(&GC_allocate_lock) == AO_TS_CLEAR) {
+ return;
+ }
+ my_spin_max = (unsigned)AO_load(&spin_max);
+ my_last_spins = (unsigned)AO_load(&last_spins);
+ for (i = 0; i < my_spin_max; i++) {
+ if (is_collecting() || GC_nprocs == 1)
+ goto yield;
+ if (i < my_last_spins/2) {
+ GC_pause();
+ continue;
+ }
+ if (AO_test_and_set_acquire(&GC_allocate_lock) == AO_TS_CLEAR) {
+ /*
+ * got it!
+ * Spinning worked. Thus we're probably not being scheduled
+ * against the other process with which we were contending.
+ * Thus it makes sense to spin longer the next time.
+ */
+ AO_store(&last_spins, (AO_t)i);
+ AO_store(&spin_max, (AO_t)high_spin_max);
+ return;
+ }
+ }
+ /* We are probably being scheduled against the other process. Sleep. */
+ AO_store(&spin_max, (AO_t)low_spin_max);
+yield:
+ for (i = 0;; ++i) {
+ if (AO_test_and_set_acquire(&GC_allocate_lock) == AO_TS_CLEAR) {
+ return;
+ }
+# define SLEEP_THRESHOLD 12
+ /* Under Linux very short sleeps tend to wait until */
+ /* the current time quantum expires. On old Linux */
+ /* kernels nanosleep (<= 2 ms) just spins. */
+ /* (Under 2.4, this happens only for real-time */
+ /* processes.) We want to minimize both behaviors */
+ /* here. */
+ if (i < SLEEP_THRESHOLD) {
+ sched_yield();
+ } else {
+ struct timespec ts;
+
+ if (i > 24) i = 24;
+ /* Don't wait for more than about 15 ms, */
+ /* even under extreme contention. */
+ ts.tv_sec = 0;
+ ts.tv_nsec = 1 << i;
+ nanosleep(&ts, 0);
+ }
+ }
+}
+
+#elif defined(USE_PTHREAD_LOCKS)
+
+# ifndef NO_PTHREAD_TRYLOCK
+ GC_INNER void GC_lock(void)
+ {
+ if (1 == GC_nprocs || is_collecting()) {
+ pthread_mutex_lock(&GC_allocate_ml);
+ } else {
+ GC_generic_lock(&GC_allocate_ml);
+ }
+ }
+# elif defined(GC_ASSERTIONS)
+ GC_INNER void GC_lock(void)
+ {
+ pthread_mutex_lock(&GC_allocate_ml);
+ }
+# endif
+
+#endif /* !USE_SPIN_LOCK && USE_PTHREAD_LOCKS */
+
+#ifdef PARALLEL_MARK
+
+# ifdef GC_ASSERTIONS
+ STATIC unsigned long GC_mark_lock_holder = NO_THREAD;
+# define SET_MARK_LOCK_HOLDER \
+ (void)(GC_mark_lock_holder = NUMERIC_THREAD_ID(pthread_self()))
+# define UNSET_MARK_LOCK_HOLDER \
+ do { \
+ GC_ASSERT(GC_mark_lock_holder \
+ == NUMERIC_THREAD_ID(pthread_self())); \
+ GC_mark_lock_holder = NO_THREAD; \
+ } while (0)
+# else
+# define SET_MARK_LOCK_HOLDER (void)0
+# define UNSET_MARK_LOCK_HOLDER (void)0
+# endif /* !GC_ASSERTIONS */
+
+static pthread_cond_t builder_cv = PTHREAD_COND_INITIALIZER;
+
+static void setup_mark_lock(void)
+{
+# ifdef GLIBC_2_19_TSX_BUG
+ pthread_mutexattr_t mattr;
+ int glibc_minor = -1;
+ int glibc_major = GC_parse_version(&glibc_minor, gnu_get_libc_version());
+
+ if (glibc_major > 2 || (glibc_major == 2 && glibc_minor >= 19)) {
+ /* TODO: disable this workaround for glibc with fixed TSX */
+ /* This disables lock elision to workaround a bug in glibc 2.19+ */
+ if (0 != pthread_mutexattr_init(&mattr)) {
+ ABORT("pthread_mutexattr_init failed");
+ }
+ if (0 != pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_NORMAL)) {
+ ABORT("pthread_mutexattr_settype failed");
+ }
+ if (0 != pthread_mutex_init(&mark_mutex, &mattr)) {
+ ABORT("pthread_mutex_init failed");
+ }
+ (void)pthread_mutexattr_destroy(&mattr);
+ }
+# endif
+}
+
+GC_INNER void GC_acquire_mark_lock(void)
+{
+# if defined(NUMERIC_THREAD_ID_UNIQUE) && !defined(THREAD_SANITIZER)
+ GC_ASSERT(GC_mark_lock_holder != NUMERIC_THREAD_ID(pthread_self()));
+# endif
+ GC_generic_lock(&mark_mutex);
+ SET_MARK_LOCK_HOLDER;
+}
+
+GC_INNER void GC_release_mark_lock(void)
+{
+ UNSET_MARK_LOCK_HOLDER;
+ if (pthread_mutex_unlock(&mark_mutex) != 0) {
+ ABORT("pthread_mutex_unlock failed");
+ }
+}
+
+/* Collector must wait for a freelist builders for 2 reasons: */
+/* 1) Mark bits may still be getting examined without lock. */
+/* 2) Partial free lists referenced only by locals may not be scanned */
+/* correctly, e.g. if they contain "pointer-free" objects, since the */
+/* free-list link may be ignored. */
+STATIC void GC_wait_builder(void)
+{
+ ASSERT_CANCEL_DISABLED();
+ UNSET_MARK_LOCK_HOLDER;
+ if (pthread_cond_wait(&builder_cv, &mark_mutex) != 0) {
+ ABORT("pthread_cond_wait failed");
+ }
+ GC_ASSERT(GC_mark_lock_holder == NO_THREAD);
+ SET_MARK_LOCK_HOLDER;
+}
+
+GC_INNER void GC_wait_for_reclaim(void)
+{
+ GC_acquire_mark_lock();
+ while (GC_fl_builder_count > 0) {
+ GC_wait_builder();
+ }
+ GC_release_mark_lock();
+}
+
+# if defined(CAN_HANDLE_FORK) && defined(THREAD_SANITIZER)
+ /* Identical to GC_wait_for_reclaim() but with the no_sanitize */
+ /* attribute as a workaround for TSan which does not notice that */
+ /* the GC lock is acquired in fork_prepare_proc(). */
+ GC_ATTR_NO_SANITIZE_THREAD
+ static void wait_for_reclaim_atfork(void)
+ {
+ GC_acquire_mark_lock();
+ while (GC_fl_builder_count > 0)
+ GC_wait_builder();
+ GC_release_mark_lock();
+ }
+# endif /* CAN_HANDLE_FORK && THREAD_SANITIZER */
+
+GC_INNER void GC_notify_all_builder(void)
+{
+ GC_ASSERT(GC_mark_lock_holder == NUMERIC_THREAD_ID(pthread_self()));
+ if (pthread_cond_broadcast(&builder_cv) != 0) {
+ ABORT("pthread_cond_broadcast failed");
+ }
+}
+
+GC_INNER void GC_wait_marker(void)
+{
+ ASSERT_CANCEL_DISABLED();
+ GC_ASSERT(GC_parallel);
+ UNSET_MARK_LOCK_HOLDER;
+ if (pthread_cond_wait(&mark_cv, &mark_mutex) != 0) {
+ ABORT("pthread_cond_wait failed");
+ }
+ GC_ASSERT(GC_mark_lock_holder == NO_THREAD);
+ SET_MARK_LOCK_HOLDER;
+}
+
+GC_INNER void GC_notify_all_marker(void)
+{
+ GC_ASSERT(GC_parallel);
+ if (pthread_cond_broadcast(&mark_cv) != 0) {
+ ABORT("pthread_cond_broadcast failed");
+ }
+}
+
+#endif /* PARALLEL_MARK */
+
+#ifdef PTHREAD_REGISTER_CANCEL_WEAK_STUBS
+ /* Workaround "undefined reference" linkage errors on some targets. */
+ EXTERN_C_BEGIN
+ extern void __pthread_register_cancel(void) __attribute__((__weak__));
+ extern void __pthread_unregister_cancel(void) __attribute__((__weak__));
+ EXTERN_C_END
+
+ void __pthread_register_cancel(void) {}
+ void __pthread_unregister_cancel(void) {}
+#endif
+
+#endif /* GC_PTHREADS */
diff --git a/graphics/asymptote/gc/ptr_chck.c b/graphics/asymptote/gc/ptr_chck.c
new file mode 100644
index 0000000000..2d8e9b46c3
--- /dev/null
+++ b/graphics/asymptote/gc/ptr_chck.c
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_pmark.h"
+
+/*
+ * These are checking routines calls to which could be inserted by a
+ * preprocessor to validate C pointer arithmetic.
+ */
+
+STATIC void GC_CALLBACK GC_default_same_obj_print_proc(void * p, void * q)
+{
+ ABORT_ARG2("GC_same_obj test failed",
+ ": %p and %p are not in the same object", p, q);
+}
+
+void (GC_CALLBACK *GC_same_obj_print_proc) (void *, void *)
+ = GC_default_same_obj_print_proc;
+
+/* Check that p and q point to the same object. Call */
+/* *GC_same_obj_print_proc if they don't. */
+/* Returns the first argument. (Return value may be hard */
+/* to use due to typing issues. But if we had a suitable */
+/* preprocessor...) */
+/* Succeeds if neither p nor q points to the heap. */
+/* We assume this is performance critical. (It shouldn't */
+/* be called by production code, but this can easily make */
+/* debugging intolerably slow.) */
+GC_API void * GC_CALL GC_same_obj(void *p, void *q)
+{
+ struct hblk *h;
+ hdr *hhdr;
+ ptr_t base, limit;
+ word sz;
+
+ if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
+ hhdr = HDR((word)p);
+ if (hhdr == 0) {
+ if (divHBLKSZ((word)p) != divHBLKSZ((word)q)
+ && HDR((word)q) != 0) {
+ goto fail;
+ }
+ return(p);
+ }
+ /* If it's a pointer to the middle of a large object, move it */
+ /* to the beginning. */
+ if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ h = HBLKPTR(p) - (word)hhdr;
+ hhdr = HDR(h);
+ while (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ h = FORWARDED_ADDR(h, hhdr);
+ hhdr = HDR(h);
+ }
+ limit = (ptr_t)h + hhdr -> hb_sz;
+ if ((word)p >= (word)limit || (word)q >= (word)limit
+ || (word)q < (word)h) {
+ goto fail;
+ }
+ return(p);
+ }
+ sz = hhdr -> hb_sz;
+ if (sz > MAXOBJBYTES) {
+ base = (ptr_t)HBLKPTR(p);
+ limit = base + sz;
+ if ((word)p >= (word)limit) {
+ goto fail;
+ }
+ } else {
+ size_t offset;
+ size_t pdispl = HBLKDISPL(p);
+
+ offset = pdispl % sz;
+ if (HBLKPTR(p) != HBLKPTR(q)) goto fail;
+ /* W/o this check, we might miss an error if */
+ /* q points to the first object on a page, and */
+ /* points just before the page. */
+ base = (ptr_t)p - offset;
+ limit = base + sz;
+ }
+ /* [base, limit) delimits the object containing p, if any. */
+ /* If p is not inside a valid object, then either q is */
+ /* also outside any valid object, or it is outside */
+ /* [base, limit). */
+ if ((word)q >= (word)limit || (word)q < (word)base) {
+ goto fail;
+ }
+ return(p);
+fail:
+ (*GC_same_obj_print_proc)((ptr_t)p, (ptr_t)q);
+ return(p);
+}
+
+STATIC void GC_CALLBACK GC_default_is_valid_displacement_print_proc (void *p)
+{
+ ABORT_ARG1("GC_is_valid_displacement test failed", ": %p not valid", p);
+}
+
+void (GC_CALLBACK *GC_is_valid_displacement_print_proc)(void *) =
+ GC_default_is_valid_displacement_print_proc;
+
+/* Check that if p is a pointer to a heap page, then it points to */
+/* a valid displacement within a heap object. */
+/* Uninteresting with GC_all_interior_pointers. */
+/* Always returns its argument. */
+/* Note that we don't lock, since nothing relevant about the header */
+/* should change while we have a valid object pointer to the block. */
+GC_API void * GC_CALL GC_is_valid_displacement(void *p)
+{
+ hdr *hhdr;
+ word pdispl;
+ word offset;
+ struct hblk *h;
+ word sz;
+
+ if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
+ if (NULL == p) return NULL;
+ hhdr = HDR((word)p);
+ if (hhdr == 0) return(p);
+ h = HBLKPTR(p);
+ if (GC_all_interior_pointers) {
+ while (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ h = FORWARDED_ADDR(h, hhdr);
+ hhdr = HDR(h);
+ }
+ } else if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ goto fail;
+ }
+ sz = hhdr -> hb_sz;
+ pdispl = HBLKDISPL(p);
+ offset = pdispl % sz;
+ if ((sz > MAXOBJBYTES && (word)p >= (word)h + sz)
+ || !GC_valid_offsets[offset]
+ || ((word)p + (sz - offset) > (word)(h + 1)
+ && !IS_FORWARDING_ADDR_OR_NIL(HDR(h + 1)))) {
+ goto fail;
+ }
+ return(p);
+fail:
+ (*GC_is_valid_displacement_print_proc)((ptr_t)p);
+ return(p);
+}
+
+STATIC void GC_CALLBACK GC_default_is_visible_print_proc(void * p)
+{
+ ABORT_ARG1("GC_is_visible test failed", ": %p not GC-visible", p);
+}
+
+void (GC_CALLBACK *GC_is_visible_print_proc)(void * p) =
+ GC_default_is_visible_print_proc;
+
+#ifndef THREADS
+/* Could p be a stack address? */
+ STATIC GC_bool GC_on_stack(void *p)
+ {
+# ifdef STACK_GROWS_DOWN
+ if ((word)p >= (word)GC_approx_sp()
+ && (word)p < (word)GC_stackbottom) {
+ return(TRUE);
+ }
+# else
+ if ((word)p <= (word)GC_approx_sp()
+ && (word)p > (word)GC_stackbottom) {
+ return(TRUE);
+ }
+# endif
+ return(FALSE);
+ }
+#endif
+
+/* Check that p is visible */
+/* to the collector as a possibly pointer containing location. */
+/* If it isn't, invoke *GC_is_visible_print_proc. */
+/* Returns the argument in all cases. May erroneously succeed */
+/* in hard cases. (This is intended for debugging use with */
+/* untyped allocations. The idea is that it should be possible, though */
+/* slow, to add such a call to all indirect pointer stores.) */
+/* Currently useless for the multi-threaded worlds. */
+GC_API void * GC_CALL GC_is_visible(void *p)
+{
+ hdr *hhdr;
+
+ if ((word)p & (ALIGNMENT - 1)) goto fail;
+ if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
+# ifdef THREADS
+ hhdr = HDR((word)p);
+ if (hhdr != 0 && GC_base(p) == 0) {
+ goto fail;
+ } else {
+ /* May be inside thread stack. We can't do much. */
+ return(p);
+ }
+# else
+ /* Check stack first: */
+ if (GC_on_stack(p)) return(p);
+ hhdr = HDR((word)p);
+ if (hhdr == 0) {
+ if (GC_is_static_root(p)) return(p);
+ /* Else do it again correctly: */
+# if defined(DYNAMIC_LOADING) || defined(MSWIN32) \
+ || defined(MSWINCE) || defined(CYGWIN32) || defined(PCR)
+ if (!GC_no_dls) {
+ GC_register_dynamic_libraries();
+ if (GC_is_static_root(p)) return p;
+ }
+# endif
+ goto fail;
+ } else {
+ /* p points to the heap. */
+ word descr;
+ ptr_t base = (ptr_t)GC_base(p);
+ /* TODO: should GC_base be manually inlined? */
+
+ if (NULL == base) goto fail;
+ if (HBLKPTR(base) != HBLKPTR(p))
+ hhdr = HDR(base);
+ descr = hhdr -> hb_descr;
+ retry:
+ switch(descr & GC_DS_TAGS) {
+ case GC_DS_LENGTH:
+ if ((word)p - (word)base >= descr) goto fail;
+ break;
+ case GC_DS_BITMAP:
+ if ((word)p - (word)base >= WORDS_TO_BYTES(BITMAP_BITS)
+ || ((word)p & (sizeof(word) - 1))) goto fail;
+ if (!(((word)1 << (WORDSZ - ((ptr_t)p - (ptr_t)base) - 1))
+ & descr)) goto fail;
+ break;
+ case GC_DS_PROC:
+ /* We could try to decipher this partially. */
+ /* For now we just punt. */
+ break;
+ case GC_DS_PER_OBJECT:
+ if ((signed_word)descr >= 0) {
+ descr = *(word *)((ptr_t)base
+ + (descr & ~(word)GC_DS_TAGS));
+ } else {
+ ptr_t type_descr = *(ptr_t *)base;
+
+ if (EXPECT(NULL == type_descr, FALSE))
+ goto fail; /* see comment in GC_mark_from */
+ descr = *(word *)(type_descr
+ - (descr - (word)(GC_DS_PER_OBJECT
+ - GC_INDIR_PER_OBJ_BIAS)));
+ }
+ goto retry;
+ }
+ return(p);
+ }
+# endif
+fail:
+ (*GC_is_visible_print_proc)((ptr_t)p);
+ return(p);
+}
+
+GC_API void * GC_CALL GC_pre_incr (void **p, ptrdiff_t how_much)
+{
+ void * initial = *p;
+ void * result = GC_same_obj((void *)((ptr_t)initial + how_much), initial);
+
+ if (!GC_all_interior_pointers) {
+ (void) GC_is_valid_displacement(result);
+ }
+ return (*p = result);
+}
+
+GC_API void * GC_CALL GC_post_incr (void **p, ptrdiff_t how_much)
+{
+ void * initial = *p;
+ void * result = GC_same_obj((void *)((ptr_t)initial + how_much), initial);
+
+ if (!GC_all_interior_pointers) {
+ (void) GC_is_valid_displacement(result);
+ }
+ *p = result;
+ return(initial);
+}
diff --git a/graphics/asymptote/gc/reclaim.c b/graphics/asymptote/gc/reclaim.c
new file mode 100644
index 0000000000..926d4b6414
--- /dev/null
+++ b/graphics/asymptote/gc/reclaim.c
@@ -0,0 +1,855 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1996 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2009-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+#ifdef ENABLE_DISCLAIM
+# include "gc_disclaim.h"
+#endif
+
+#include <stdio.h>
+
+GC_INNER signed_word GC_bytes_found = 0;
+ /* Number of bytes of memory reclaimed */
+ /* minus the number of bytes originally */
+ /* on free lists which we had to drop. */
+
+#if defined(PARALLEL_MARK)
+ GC_INNER signed_word GC_fl_builder_count = 0;
+ /* Number of threads currently building free lists without */
+ /* holding GC lock. It is not safe to collect if this is */
+ /* nonzero. Also, together with the mark lock, it is used as */
+ /* a semaphore during marker threads startup. */
+#endif /* PARALLEL_MARK */
+
+/* We defer printing of leaked objects until we're done with the GC */
+/* cycle, since the routine for printing objects needs to run outside */
+/* the collector, e.g. without the allocation lock. */
+#ifndef MAX_LEAKED
+# define MAX_LEAKED 40
+#endif
+STATIC ptr_t GC_leaked[MAX_LEAKED] = { NULL };
+STATIC unsigned GC_n_leaked = 0;
+
+#ifdef AO_HAVE_store
+ GC_INNER volatile AO_t GC_have_errors = 0;
+#else
+ GC_INNER GC_bool GC_have_errors = FALSE;
+#endif
+
+#if !defined(EAGER_SWEEP) && defined(ENABLE_DISCLAIM)
+ STATIC void GC_reclaim_unconditionally_marked(void);
+#endif
+
+GC_INLINE void GC_add_leaked(ptr_t leaked)
+{
+# ifndef SHORT_DBG_HDRS
+ if (GC_findleak_delay_free && !GC_check_leaked(leaked))
+ return;
+# endif
+
+ GC_SET_HAVE_ERRORS();
+ if (GC_n_leaked < MAX_LEAKED) {
+ GC_leaked[GC_n_leaked++] = leaked;
+ /* Make sure it's not reclaimed this cycle */
+ GC_set_mark_bit(leaked);
+ }
+}
+
+/* Print all objects on the list after printing any smashed objects. */
+/* Clear both lists. Called without the allocation lock held. */
+GC_INNER void GC_print_all_errors(void)
+{
+ static GC_bool printing_errors = FALSE;
+ GC_bool have_errors;
+ unsigned i, n_leaked;
+ ptr_t leaked[MAX_LEAKED];
+ DCL_LOCK_STATE;
+
+ LOCK();
+ if (printing_errors) {
+ UNLOCK();
+ return;
+ }
+ have_errors = get_have_errors();
+ printing_errors = TRUE;
+ n_leaked = GC_n_leaked;
+ if (n_leaked > 0) {
+ GC_ASSERT(n_leaked <= MAX_LEAKED);
+ BCOPY(GC_leaked, leaked, n_leaked * sizeof(ptr_t));
+ GC_n_leaked = 0;
+ BZERO(GC_leaked, n_leaked * sizeof(ptr_t));
+ }
+ UNLOCK();
+
+ if (GC_debugging_started) {
+ GC_print_all_smashed();
+ } else {
+ have_errors = FALSE;
+ }
+
+ if (n_leaked > 0) {
+ GC_err_printf("Found %u leaked objects:\n", n_leaked);
+ have_errors = TRUE;
+ }
+ for (i = 0; i < n_leaked; i++) {
+ ptr_t p = leaked[i];
+# ifndef SKIP_LEAKED_OBJECTS_PRINTING
+ GC_print_heap_obj(p);
+# endif
+ GC_free(p);
+ }
+
+ if (have_errors
+# ifndef GC_ABORT_ON_LEAK
+ && GETENV("GC_ABORT_ON_LEAK") != NULL
+# endif
+ ) {
+ ABORT("Leaked or smashed objects encountered");
+ }
+
+ LOCK();
+ printing_errors = FALSE;
+ UNLOCK();
+}
+
+
+/*
+ * reclaim phase
+ *
+ */
+
+/* Test whether a block is completely empty, i.e. contains no marked */
+/* objects. This does not require the block to be in physical memory. */
+GC_INNER GC_bool GC_block_empty(hdr *hhdr)
+{
+ return (hhdr -> hb_n_marks == 0);
+}
+
+STATIC GC_bool GC_block_nearly_full(hdr *hhdr, word sz)
+{
+ return hhdr -> hb_n_marks > HBLK_OBJS(sz) * 7 / 8;
+}
+
+/* TODO: This should perhaps again be specialized for USE_MARK_BYTES */
+/* and USE_MARK_BITS cases. */
+
+GC_INLINE word *GC_clear_block(word *p, word sz, signed_word *count)
+{
+ word *q = (word *)((ptr_t)p + sz);
+
+ /* Clear object, advance p to next object in the process. */
+# ifdef USE_MARK_BYTES
+ GC_ASSERT((sz & 1) == 0);
+ GC_ASSERT(((word)p & (2 * sizeof(word) - 1)) == 0);
+ p[1] = 0;
+ p += 2;
+ while ((word)p < (word)q) {
+ CLEAR_DOUBLE(p);
+ p += 2;
+ }
+# else
+ p++; /* Skip link field */
+ while ((word)p < (word)q) {
+ *p++ = 0;
+ }
+# endif
+ *count += sz;
+ return p;
+}
+
+/*
+ * Restore unmarked small objects in h of size sz to the object
+ * free list. Returns the new list.
+ * Clears unmarked objects. Sz is in bytes.
+ */
+STATIC ptr_t GC_reclaim_clear(struct hblk *hbp, hdr *hhdr, word sz,
+ ptr_t list, signed_word *count)
+{
+ word bit_no = 0;
+ ptr_t p, plim;
+
+ GC_ASSERT(hhdr == GC_find_header((ptr_t)hbp));
+# ifndef THREADS
+ GC_ASSERT(sz == hhdr -> hb_sz);
+# else
+ /* Skip the assertion because of a potential race with GC_realloc. */
+# endif
+ GC_ASSERT((sz & (BYTES_PER_WORD-1)) == 0);
+ p = hbp->hb_body;
+ plim = p + HBLKSIZE - sz;
+
+ /* go through all words in block */
+ while ((word)p <= (word)plim) {
+ if (mark_bit_from_hdr(hhdr, bit_no)) {
+ p += sz;
+ } else {
+ /* Object is available - put it on list. */
+ obj_link(p) = list;
+ list = p;
+
+ p = (ptr_t)GC_clear_block((word *)p, sz, count);
+ }
+ bit_no += MARK_BIT_OFFSET(sz);
+ }
+ return list;
+}
+
+/* The same thing, but don't clear objects: */
+STATIC ptr_t GC_reclaim_uninit(struct hblk *hbp, hdr *hhdr, word sz,
+ ptr_t list, signed_word *count)
+{
+ word bit_no = 0;
+ word *p, *plim;
+ signed_word n_bytes_found = 0;
+
+# ifndef THREADS
+ GC_ASSERT(sz == hhdr -> hb_sz);
+# endif
+ p = (word *)(hbp->hb_body);
+ plim = (word *)((ptr_t)hbp + HBLKSIZE - sz);
+
+ /* go through all words in block */
+ while ((word)p <= (word)plim) {
+ if (!mark_bit_from_hdr(hhdr, bit_no)) {
+ n_bytes_found += sz;
+ /* object is available - put on list */
+ obj_link(p) = list;
+ list = ((ptr_t)p);
+ }
+ p = (word *)((ptr_t)p + sz);
+ bit_no += MARK_BIT_OFFSET(sz);
+ }
+ *count += n_bytes_found;
+ return(list);
+}
+
+#ifdef ENABLE_DISCLAIM
+ /* Call reclaim notifier for block's kind on each unmarked object in */
+ /* block, all within a pair of corresponding enter/leave callbacks. */
+ STATIC ptr_t GC_disclaim_and_reclaim(struct hblk *hbp, hdr *hhdr, word sz,
+ ptr_t list, signed_word *count)
+ {
+ word bit_no = 0;
+ ptr_t p, plim;
+ struct obj_kind *ok = &GC_obj_kinds[hhdr->hb_obj_kind];
+ int (GC_CALLBACK *disclaim)(void *) = ok->ok_disclaim_proc;
+
+ GC_ASSERT(disclaim != 0);
+# ifndef THREADS
+ GC_ASSERT(sz == hhdr -> hb_sz);
+# endif
+ p = hbp->hb_body;
+ plim = p + HBLKSIZE - sz;
+
+ for (; (word)p <= (word)plim; bit_no += MARK_BIT_OFFSET(sz)) {
+ if (mark_bit_from_hdr(hhdr, bit_no)) {
+ p += sz;
+ } else if ((*disclaim)(p)) {
+ set_mark_bit_from_hdr(hhdr, bit_no);
+ hhdr -> hb_n_marks++;
+ p += sz;
+ } else {
+ obj_link(p) = list;
+ list = p;
+ p = (ptr_t)GC_clear_block((word *)p, sz, count);
+ }
+ }
+ return list;
+ }
+#endif /* ENABLE_DISCLAIM */
+
+/* Don't really reclaim objects, just check for unmarked ones: */
+STATIC void GC_reclaim_check(struct hblk *hbp, hdr *hhdr, word sz)
+{
+ word bit_no;
+ ptr_t p, plim;
+
+# ifndef THREADS
+ GC_ASSERT(sz == hhdr -> hb_sz);
+# endif
+ /* go through all words in block */
+ p = hbp->hb_body;
+ plim = p + HBLKSIZE - sz;
+ for (bit_no = 0; (word)p <= (word)plim;
+ p += sz, bit_no += MARK_BIT_OFFSET(sz)) {
+ if (!mark_bit_from_hdr(hhdr, bit_no)) {
+ GC_add_leaked(p);
+ }
+ }
+}
+
+/* Is a pointer-free block? Same as IS_PTRFREE macro (in os_dep.c) but */
+/* uses unordered atomic access to avoid racing with GC_realloc. */
+#ifdef AO_HAVE_load
+# define IS_PTRFREE_SAFE(hhdr) \
+ (AO_load((volatile AO_t *)&(hhdr)->hb_descr) == 0)
+#else
+ /* No race as GC_realloc holds the lock while updating hb_descr. */
+# define IS_PTRFREE_SAFE(hhdr) ((hhdr)->hb_descr == 0)
+#endif
+
+/*
+ * Generic procedure to rebuild a free list in hbp.
+ * Also called directly from GC_malloc_many.
+ * Sz is now in bytes.
+ */
+GC_INNER ptr_t GC_reclaim_generic(struct hblk * hbp, hdr *hhdr, size_t sz,
+ GC_bool init, ptr_t list,
+ signed_word *count)
+{
+ ptr_t result;
+
+ GC_ASSERT(GC_find_header((ptr_t)hbp) == hhdr);
+# ifndef GC_DISABLE_INCREMENTAL
+ GC_remove_protection(hbp, 1, IS_PTRFREE_SAFE(hhdr));
+# endif
+# ifdef ENABLE_DISCLAIM
+ if ((hhdr -> hb_flags & HAS_DISCLAIM) != 0) {
+ result = GC_disclaim_and_reclaim(hbp, hhdr, sz, list, count);
+ } else
+# endif
+ /* else */ if (init || GC_debugging_started) {
+ result = GC_reclaim_clear(hbp, hhdr, sz, list, count);
+ } else {
+ GC_ASSERT(IS_PTRFREE_SAFE(hhdr));
+ result = GC_reclaim_uninit(hbp, hhdr, sz, list, count);
+ }
+ if (IS_UNCOLLECTABLE(hhdr -> hb_obj_kind)) GC_set_hdr_marks(hhdr);
+ return result;
+}
+
+/*
+ * Restore unmarked small objects in the block pointed to by hbp
+ * to the appropriate object free list.
+ * If entirely empty blocks are to be completely deallocated, then
+ * caller should perform that check.
+ */
+STATIC void GC_reclaim_small_nonempty_block(struct hblk *hbp, word sz,
+ GC_bool report_if_found)
+{
+ hdr *hhdr = HDR(hbp);
+ struct obj_kind * ok = &GC_obj_kinds[hhdr -> hb_obj_kind];
+ void **flh = &(ok -> ok_freelist[BYTES_TO_GRANULES(sz)]);
+
+ hhdr -> hb_last_reclaimed = (unsigned short) GC_gc_no;
+
+ if (report_if_found) {
+ GC_reclaim_check(hbp, hhdr, sz);
+ } else {
+ *flh = GC_reclaim_generic(hbp, hhdr, sz, ok -> ok_init,
+ (ptr_t)(*flh), &GC_bytes_found);
+ }
+}
+
+#ifdef ENABLE_DISCLAIM
+ STATIC void GC_disclaim_and_reclaim_or_free_small_block(struct hblk *hbp)
+ {
+ hdr *hhdr = HDR(hbp);
+ word sz = hhdr -> hb_sz;
+ struct obj_kind * ok = &GC_obj_kinds[hhdr -> hb_obj_kind];
+ void **flh = &(ok -> ok_freelist[BYTES_TO_GRANULES(sz)]);
+ void *flh_next;
+
+ hhdr -> hb_last_reclaimed = (unsigned short) GC_gc_no;
+ flh_next = GC_reclaim_generic(hbp, hhdr, sz, ok -> ok_init,
+ (ptr_t)(*flh), &GC_bytes_found);
+ if (hhdr -> hb_n_marks)
+ *flh = flh_next;
+ else {
+ GC_bytes_found += HBLKSIZE;
+ GC_freehblk(hbp);
+ }
+ }
+#endif /* ENABLE_DISCLAIM */
+
+/*
+ * Restore an unmarked large object or an entirely empty blocks of small objects
+ * to the heap block free list.
+ * Otherwise enqueue the block for later processing
+ * by GC_reclaim_small_nonempty_block.
+ * If report_if_found is TRUE, then process any block immediately, and
+ * simply report free objects; do not actually reclaim them.
+ */
+STATIC void GC_reclaim_block(struct hblk *hbp, word report_if_found)
+{
+ hdr * hhdr = HDR(hbp);
+ word sz; /* size of objects in current block */
+ struct obj_kind * ok = &GC_obj_kinds[hhdr -> hb_obj_kind];
+
+# ifdef AO_HAVE_load
+ /* Atomic access is used to avoid racing with GC_realloc. */
+ sz = (word)AO_load((volatile AO_t *)&hhdr->hb_sz);
+# else
+ /* No race as GC_realloc holds the lock while updating hb_sz. */
+ sz = hhdr -> hb_sz;
+# endif
+ if( sz > MAXOBJBYTES ) { /* 1 big object */
+ if( !mark_bit_from_hdr(hhdr, 0) ) {
+ if (report_if_found) {
+ GC_add_leaked((ptr_t)hbp);
+ } else {
+ word blocks;
+
+# ifdef ENABLE_DISCLAIM
+ if (EXPECT(hhdr->hb_flags & HAS_DISCLAIM, 0)) {
+ if ((*ok->ok_disclaim_proc)(hbp)) {
+ /* Not disclaimed => resurrect the object. */
+ set_mark_bit_from_hdr(hhdr, 0);
+ goto in_use;
+ }
+ }
+# endif
+ blocks = OBJ_SZ_TO_BLOCKS(sz);
+# if defined(CPPCHECK)
+ GC_noop1((word)&blocks);
+# endif
+ if (blocks > 1) {
+ GC_large_allocd_bytes -= blocks * HBLKSIZE;
+ }
+ GC_bytes_found += sz;
+ GC_freehblk(hbp);
+ }
+ } else {
+# ifdef ENABLE_DISCLAIM
+ in_use:
+# endif
+ if (IS_PTRFREE_SAFE(hhdr)) {
+ GC_atomic_in_use += sz;
+ } else {
+ GC_composite_in_use += sz;
+ }
+ }
+ } else {
+ GC_bool empty = GC_block_empty(hhdr);
+# ifdef PARALLEL_MARK
+ /* Count can be low or one too high because we sometimes */
+ /* have to ignore decrements. Objects can also potentially */
+ /* be repeatedly marked by each marker. */
+ /* Here we assume 3 markers at most, but this is extremely */
+ /* unlikely to fail spuriously with more. And if it does, it */
+ /* should be looked at. */
+ GC_ASSERT(sz != 0 && (GC_markers_m1 > 1 ? 3 : GC_markers_m1 + 1)
+ * (HBLKSIZE/sz + 1) + 16 >= hhdr->hb_n_marks);
+# else
+ GC_ASSERT(sz * hhdr -> hb_n_marks <= HBLKSIZE);
+# endif
+ if (report_if_found) {
+ GC_reclaim_small_nonempty_block(hbp, sz,
+ TRUE /* report_if_found */);
+ } else if (empty) {
+# ifdef ENABLE_DISCLAIM
+ if ((hhdr -> hb_flags & HAS_DISCLAIM) != 0) {
+ GC_disclaim_and_reclaim_or_free_small_block(hbp);
+ } else
+# endif
+ /* else */ {
+ GC_bytes_found += HBLKSIZE;
+ GC_freehblk(hbp);
+ }
+ } else if (GC_find_leak || !GC_block_nearly_full(hhdr, sz)) {
+ /* group of smaller objects, enqueue the real work */
+ struct hblk **rlh = ok -> ok_reclaim_list;
+
+ if (rlh != NULL) {
+ rlh += BYTES_TO_GRANULES(sz);
+ hhdr -> hb_next = *rlh;
+ *rlh = hbp;
+ }
+ } /* else not worth salvaging. */
+ /* We used to do the nearly_full check later, but we */
+ /* already have the right cache context here. Also */
+ /* doing it here avoids some silly lock contention in */
+ /* GC_malloc_many. */
+ if (IS_PTRFREE_SAFE(hhdr)) {
+ GC_atomic_in_use += sz * hhdr -> hb_n_marks;
+ } else {
+ GC_composite_in_use += sz * hhdr -> hb_n_marks;
+ }
+ }
+}
+
+#if !defined(NO_DEBUGGING)
+/* Routines to gather and print heap block info */
+/* intended for debugging. Otherwise should be called */
+/* with lock. */
+
+struct Print_stats
+{
+ size_t number_of_blocks;
+ size_t total_bytes;
+};
+
+#ifdef USE_MARK_BYTES
+
+/* Return the number of set mark bits in the given header. */
+/* Remains externally visible as used by GNU GCJ currently. */
+unsigned GC_n_set_marks(hdr *hhdr)
+{
+ unsigned result = 0;
+ word i;
+ word sz = hhdr -> hb_sz;
+ word offset = MARK_BIT_OFFSET(sz);
+ word limit = FINAL_MARK_BIT(sz);
+
+ for (i = 0; i < limit; i += offset) {
+ result += hhdr -> hb_marks[i];
+ }
+ GC_ASSERT(hhdr -> hb_marks[limit]);
+ return(result);
+}
+
+#else
+
+/* Number of set bits in a word. Not performance critical. */
+static unsigned set_bits(word n)
+{
+ word m = n;
+ unsigned result = 0;
+
+ while (m > 0) {
+ if (m & 1) result++;
+ m >>= 1;
+ }
+ return(result);
+}
+
+unsigned GC_n_set_marks(hdr *hhdr)
+{
+ unsigned result = 0;
+ word i;
+ word n_mark_words;
+# ifdef MARK_BIT_PER_OBJ
+ word n_objs = HBLK_OBJS(hhdr -> hb_sz);
+
+ if (0 == n_objs) n_objs = 1;
+ n_mark_words = divWORDSZ(n_objs + WORDSZ - 1);
+# else /* MARK_BIT_PER_GRANULE */
+ n_mark_words = MARK_BITS_SZ;
+# endif
+ for (i = 0; i < n_mark_words - 1; i++) {
+ result += set_bits(hhdr -> hb_marks[i]);
+ }
+# ifdef MARK_BIT_PER_OBJ
+ result += set_bits((hhdr -> hb_marks[n_mark_words - 1])
+ << (n_mark_words * WORDSZ - n_objs));
+# else
+ result += set_bits(hhdr -> hb_marks[n_mark_words - 1]);
+# endif
+ return result; /* the number of set bits excluding the one past the end */
+}
+
+#endif /* !USE_MARK_BYTES */
+
+STATIC void GC_print_block_descr(struct hblk *h,
+ word /* struct PrintStats */ raw_ps)
+{
+ hdr * hhdr = HDR(h);
+ size_t bytes = hhdr -> hb_sz;
+ struct Print_stats *ps;
+ unsigned n_marks = GC_n_set_marks(hhdr);
+ unsigned n_objs = (unsigned)HBLK_OBJS(bytes);
+
+ if (0 == n_objs) n_objs = 1;
+ if (hhdr -> hb_n_marks != n_marks) {
+ GC_printf("%u,%u,%u!=%u,%u\n", hhdr->hb_obj_kind, (unsigned)bytes,
+ (unsigned)hhdr->hb_n_marks, n_marks, n_objs);
+ } else {
+ GC_printf("%u,%u,%u,%u\n", hhdr->hb_obj_kind, (unsigned)bytes,
+ n_marks, n_objs);
+ }
+
+ ps = (struct Print_stats *)raw_ps;
+ ps->total_bytes +=
+ (bytes + HBLKSIZE-1) & ~(word)(HBLKSIZE-1); /* round up */
+ ps->number_of_blocks++;
+}
+
+void GC_print_block_list(void)
+{
+ struct Print_stats pstats;
+
+ GC_printf("kind(0=ptrfree,1=normal,2=unc.),"
+ "size_in_bytes,#_marks_set,#objs\n");
+ pstats.number_of_blocks = 0;
+ pstats.total_bytes = 0;
+ GC_apply_to_all_blocks(GC_print_block_descr, (word)&pstats);
+ GC_printf("blocks= %lu, bytes= %lu\n",
+ (unsigned long)pstats.number_of_blocks,
+ (unsigned long)pstats.total_bytes);
+}
+
+#include "gc_inline.h" /* for GC_print_free_list prototype */
+
+/* Currently for debugger use only: */
+GC_API void GC_CALL GC_print_free_list(int kind, size_t sz_in_granules)
+{
+ void *flh_next;
+ int n;
+
+ GC_ASSERT(kind < MAXOBJKINDS);
+ GC_ASSERT(sz_in_granules <= MAXOBJGRANULES);
+ flh_next = GC_obj_kinds[kind].ok_freelist[sz_in_granules];
+ for (n = 0; flh_next; n++) {
+ GC_printf("Free object in heap block %p [%d]: %p\n",
+ (void *)HBLKPTR(flh_next), n, flh_next);
+ flh_next = obj_link(flh_next);
+ }
+}
+
+#endif /* !NO_DEBUGGING */
+
+/*
+ * Clear all obj_link pointers in the list of free objects *flp.
+ * Clear *flp.
+ * This must be done before dropping a list of free gcj-style objects,
+ * since may otherwise end up with dangling "descriptor" pointers.
+ * It may help for other pointer-containing objects.
+ */
+STATIC void GC_clear_fl_links(void **flp)
+{
+ void *next = *flp;
+
+ while (0 != next) {
+ *flp = 0;
+ flp = &(obj_link(next));
+ next = *flp;
+ }
+}
+
+/*
+ * Perform GC_reclaim_block on the entire heap, after first clearing
+ * small object free lists (if we are not just looking for leaks).
+ */
+GC_INNER void GC_start_reclaim(GC_bool report_if_found)
+{
+ unsigned kind;
+
+# if defined(PARALLEL_MARK)
+ GC_ASSERT(0 == GC_fl_builder_count);
+# endif
+ /* Reset in use counters. GC_reclaim_block recomputes them. */
+ GC_composite_in_use = 0;
+ GC_atomic_in_use = 0;
+ /* Clear reclaim- and free-lists */
+ for (kind = 0; kind < GC_n_kinds; kind++) {
+ struct hblk ** rlist = GC_obj_kinds[kind].ok_reclaim_list;
+ GC_bool should_clobber = (GC_obj_kinds[kind].ok_descriptor != 0);
+
+ if (rlist == 0) continue; /* This kind not used. */
+ if (!report_if_found) {
+ void **fop;
+ void **lim = &(GC_obj_kinds[kind].ok_freelist[MAXOBJGRANULES+1]);
+
+ for (fop = GC_obj_kinds[kind].ok_freelist;
+ (word)fop < (word)lim; (*(word **)&fop)++) {
+ if (*fop != 0) {
+ if (should_clobber) {
+ GC_clear_fl_links(fop);
+ } else {
+ *fop = 0;
+ }
+ }
+ }
+ } /* otherwise free list objects are marked, */
+ /* and it's safe to leave them. */
+ BZERO(rlist, (MAXOBJGRANULES + 1) * sizeof(void *));
+ }
+
+
+ /* Go through all heap blocks (in hblklist) and reclaim unmarked objects */
+ /* or enqueue the block for later processing. */
+ GC_apply_to_all_blocks(GC_reclaim_block, (word)report_if_found);
+
+# ifdef EAGER_SWEEP
+ /* This is a very stupid thing to do. We make it possible anyway, */
+ /* so that you can convince yourself that it really is very stupid. */
+ GC_reclaim_all((GC_stop_func)0, FALSE);
+# elif defined(ENABLE_DISCLAIM)
+ /* However, make sure to clear reclaimable objects of kinds with */
+ /* unconditional marking enabled before we do any significant */
+ /* marking work. */
+ GC_reclaim_unconditionally_marked();
+# endif
+# if defined(PARALLEL_MARK)
+ GC_ASSERT(0 == GC_fl_builder_count);
+# endif
+
+}
+
+/*
+ * Sweep blocks of the indicated object size and kind until either the
+ * appropriate free list is nonempty, or there are no more blocks to
+ * sweep.
+ */
+GC_INNER void GC_continue_reclaim(word sz /* granules */, int kind)
+{
+ hdr * hhdr;
+ struct hblk * hbp;
+ struct obj_kind * ok = &(GC_obj_kinds[kind]);
+ struct hblk ** rlh = ok -> ok_reclaim_list;
+ void **flh = &(ok -> ok_freelist[sz]);
+
+ if (NULL == rlh)
+ return; /* No blocks of this kind. */
+
+ for (rlh += sz; (hbp = *rlh) != NULL; ) {
+ hhdr = HDR(hbp);
+ *rlh = hhdr -> hb_next;
+ GC_reclaim_small_nonempty_block(hbp, hhdr -> hb_sz, FALSE);
+ if (*flh != 0)
+ break;
+ }
+}
+
+/*
+ * Reclaim all small blocks waiting to be reclaimed.
+ * Abort and return FALSE when/if (*stop_func)() returns TRUE.
+ * If this returns TRUE, then it's safe to restart the world
+ * with incorrectly cleared mark bits.
+ * If ignore_old is TRUE, then reclaim only blocks that have been
+ * recently reclaimed, and discard the rest.
+ * Stop_func may be 0.
+ */
+GC_INNER GC_bool GC_reclaim_all(GC_stop_func stop_func, GC_bool ignore_old)
+{
+ word sz;
+ unsigned kind;
+ hdr * hhdr;
+ struct hblk * hbp;
+ struct obj_kind * ok;
+ struct hblk ** rlp;
+ struct hblk ** rlh;
+# ifndef NO_CLOCK
+ CLOCK_TYPE start_time = CLOCK_TYPE_INITIALIZER;
+
+ if (GC_print_stats == VERBOSE)
+ GET_TIME(start_time);
+# endif
+
+ for (kind = 0; kind < GC_n_kinds; kind++) {
+ ok = &(GC_obj_kinds[kind]);
+ rlp = ok -> ok_reclaim_list;
+ if (rlp == 0) continue;
+ for (sz = 1; sz <= MAXOBJGRANULES; sz++) {
+ for (rlh = rlp + sz; (hbp = *rlh) != NULL; ) {
+ if (stop_func != (GC_stop_func)0 && (*stop_func)()) {
+ return(FALSE);
+ }
+ hhdr = HDR(hbp);
+ *rlh = hhdr -> hb_next;
+ if (!ignore_old
+ || (word)hhdr->hb_last_reclaimed == GC_gc_no - 1) {
+ /* It's likely we'll need it this time, too */
+ /* It's been touched recently, so this */
+ /* shouldn't trigger paging. */
+ GC_reclaim_small_nonempty_block(hbp, hhdr->hb_sz, FALSE);
+ }
+ }
+ }
+ }
+# ifndef NO_CLOCK
+ if (GC_print_stats == VERBOSE) {
+ CLOCK_TYPE done_time;
+
+ GET_TIME(done_time);
+ GC_verbose_log_printf(
+ "Disposing of reclaim lists took %lu ms %lu ns\n",
+ MS_TIME_DIFF(done_time, start_time),
+ NS_FRAC_TIME_DIFF(done_time, start_time));
+ }
+# endif
+ return(TRUE);
+}
+
+#if !defined(EAGER_SWEEP) && defined(ENABLE_DISCLAIM)
+/* We do an eager sweep on heap blocks where unconditional marking has */
+/* been enabled, so that any reclaimable objects have been reclaimed */
+/* before we start marking. This is a simplified GC_reclaim_all */
+/* restricted to kinds where ok_mark_unconditionally is true. */
+ STATIC void GC_reclaim_unconditionally_marked(void)
+ {
+ word sz;
+ unsigned kind;
+ hdr * hhdr;
+ struct hblk * hbp;
+ struct obj_kind * ok;
+ struct hblk ** rlp;
+ struct hblk ** rlh;
+
+ for (kind = 0; kind < GC_n_kinds; kind++) {
+ ok = &(GC_obj_kinds[kind]);
+ if (!ok->ok_mark_unconditionally)
+ continue;
+ rlp = ok->ok_reclaim_list;
+ if (rlp == 0)
+ continue;
+ for (sz = 1; sz <= MAXOBJGRANULES; sz++) {
+ rlh = rlp + sz;
+ while ((hbp = *rlh) != 0) {
+ hhdr = HDR(hbp);
+ *rlh = hhdr->hb_next;
+ GC_reclaim_small_nonempty_block(hbp, hhdr->hb_sz, FALSE);
+ }
+ }
+ }
+ }
+#endif /* !EAGER_SWEEP && ENABLE_DISCLAIM */
+
+struct enumerate_reachable_s {
+ GC_reachable_object_proc proc;
+ void *client_data;
+};
+
+STATIC void GC_do_enumerate_reachable_objects(struct hblk *hbp, word ped)
+{
+ struct hblkhdr *hhdr = HDR(hbp);
+ size_t sz = (size_t)hhdr->hb_sz;
+ size_t bit_no;
+ char *p, *plim;
+
+ if (GC_block_empty(hhdr)) {
+ return;
+ }
+
+ p = hbp->hb_body;
+ if (sz > MAXOBJBYTES) { /* one big object */
+ plim = p;
+ } else {
+ plim = hbp->hb_body + HBLKSIZE - sz;
+ }
+ /* Go through all words in block. */
+ for (bit_no = 0; (word)p <= (word)plim;
+ bit_no += MARK_BIT_OFFSET(sz), p += sz) {
+ if (mark_bit_from_hdr(hhdr, bit_no)) {
+ ((struct enumerate_reachable_s *)ped)->proc(p, sz,
+ ((struct enumerate_reachable_s *)ped)->client_data);
+ }
+ }
+}
+
+GC_API void GC_CALL GC_enumerate_reachable_objects_inner(
+ GC_reachable_object_proc proc,
+ void *client_data)
+{
+ struct enumerate_reachable_s ed;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ ed.proc = proc;
+ ed.client_data = client_data;
+ GC_apply_to_all_blocks(GC_do_enumerate_reachable_objects, (word)&ed);
+}
diff --git a/graphics/asymptote/gc/sparc_mach_dep.S b/graphics/asymptote/gc/sparc_mach_dep.S
new file mode 100644
index 0000000000..d204dc4368
--- /dev/null
+++ b/graphics/asymptote/gc/sparc_mach_dep.S
@@ -0,0 +1,61 @@
+! SPARCompiler 3.0 and later apparently no longer handles
+! asm outside functions. So we need a separate .s file
+! This is only set up for SunOS 5, not SunOS 4.
+! Assumes this is called before the stack contents are
+! examined.
+
+ .seg "text"
+ .globl GC_save_regs_in_stack
+GC_save_regs_in_stack:
+#if defined(__arch64__) || defined(__sparcv9)
+ save %sp,-128,%sp
+ flushw
+ ret
+ restore %sp,2047+128,%o0
+#else /* 32 bit SPARC */
+ ta 0x3 ! ST_FLUSH_WINDOWS
+ mov %sp,%o0
+ retl
+ nop
+#endif /* 32 bit SPARC */
+.GC_save_regs_in_stack_end:
+ .size GC_save_regs_in_stack,.GC_save_regs_in_stack_end-GC_save_regs_in_stack
+
+! GC_clear_stack_inner(arg, limit) clears stack area up to limit and
+! returns arg. Stack clearing is crucial on SPARC, so we supply
+! an assembly version that s more careful. Assumes limit is hotter
+! than sp, and limit is 8 byte aligned.
+ .globl GC_clear_stack_inner
+GC_clear_stack_inner:
+#if defined(__arch64__) || defined(__sparcv9)
+ mov %sp,%o2 ! Save sp
+ add %sp,2047-8,%o3 ! p = sp+bias-8
+ add %o1,-2047-192,%sp ! Move sp out of the way,
+ ! so that traps still work.
+ ! Includes some extra words
+ ! so we can be sloppy below.
+loop:
+ stx %g0,[%o3] ! *(long *)p = 0
+ cmp %o3,%o1
+ bgu,pt %xcc, loop ! if (p > limit) goto loop
+ add %o3,-8,%o3 ! p -= 8 (delay slot)
+ retl
+ mov %o2,%sp ! Restore sp., delay slot
+#else /* 32 bit SPARC */
+ mov %sp,%o2 ! Save sp
+ add %sp,-8,%o3 ! p = sp-8
+ clr %g1 ! [g0,g1] = 0
+ add %o1,-0x60,%sp ! Move sp out of the way,
+ ! so that traps still work.
+ ! Includes some extra words
+ ! so we can be sloppy below.
+loop:
+ std %g0,[%o3] ! *(long long *)p = 0
+ cmp %o3,%o1
+ bgu loop ! if (p > limit) goto loop
+ add %o3,-8,%o3 ! p -= 8 (delay slot)
+ retl
+ mov %o2,%sp ! Restore sp., delay slot
+#endif /* 32 bit SPARC */
+.GC_clear_stack_inner_end:
+ .size GC_clear_stack_inner,.GC_clear_stack_inner_end-GC_clear_stack_inner
diff --git a/graphics/asymptote/gc/sparc_netbsd_mach_dep.s b/graphics/asymptote/gc/sparc_netbsd_mach_dep.s
new file mode 100644
index 0000000000..14feb15eea
--- /dev/null
+++ b/graphics/asymptote/gc/sparc_netbsd_mach_dep.s
@@ -0,0 +1,34 @@
+! SPARCompiler 3.0 and later apparently no longer handles
+! asm outside functions. So we need a separate .s file
+! This is only set up for SunOS 4.
+! Assumes this is called before the stack contents are
+! examined.
+
+#include "machine/asm.h"
+
+ .seg "text"
+ .globl _C_LABEL(GC_save_regs_in_stack)
+ .globl _C_LABEL(GC_push_regs)
+_C_LABEL(GC_save_regs_in_stack):
+_C_LABEL(GC_push_regs):
+ ta 0x3 ! ST_FLUSH_WINDOWS
+ mov %sp,%o0
+ retl
+ nop
+
+ .globl _C_LABEL(GC_clear_stack_inner)
+_C_LABEL(GC_clear_stack_inner):
+ mov %sp,%o2 ! Save sp
+ add %sp,-8,%o3 ! p = sp-8
+ clr %g1 ! [g0,g1] = 0
+ add %o1,-0x60,%sp ! Move sp out of the way,
+ ! so that traps still work.
+ ! Includes some extra words
+ ! so we can be sloppy below.
+loop:
+ std %g0,[%o3] ! *(long long *)p = 0
+ cmp %o3,%o1
+ bgu loop ! if (p > limit) goto loop
+ add %o3,-8,%o3 ! p -= 8 (delay slot)
+ retl
+ mov %o2,%sp ! Restore sp., delay slot
diff --git a/graphics/asymptote/gc/specific.c b/graphics/asymptote/gc/specific.c
new file mode 100644
index 0000000000..6dae5d4637
--- /dev/null
+++ b/graphics/asymptote/gc/specific.c
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/thread_local_alloc.h"
+ /* To determine type of tsd impl. */
+ /* Includes private/specific.h */
+ /* if needed. */
+
+#if defined(USE_CUSTOM_SPECIFIC)
+
+static const tse invalid_tse = {INVALID_QTID, 0, 0, INVALID_THREADID};
+ /* A thread-specific data entry which will never */
+ /* appear valid to a reader. Used to fill in empty */
+ /* cache entries to avoid a check for 0. */
+
+GC_INNER int GC_key_create_inner(tsd ** key_ptr)
+{
+ int i;
+ int ret;
+ tsd * result;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ /* A quick alignment check, since we need atomic stores */
+ GC_ASSERT((word)(&invalid_tse.next) % sizeof(tse *) == 0);
+ result = (tsd *)MALLOC_CLEAR(sizeof(tsd));
+ if (NULL == result) return ENOMEM;
+ ret = pthread_mutex_init(&result->lock, NULL);
+ if (ret != 0) return ret;
+ for (i = 0; i < TS_CACHE_SIZE; ++i) {
+ result -> cache[i] = (/* no const */ tse *)&invalid_tse;
+ }
+# ifdef GC_ASSERTIONS
+ for (i = 0; i < TS_HASH_SIZE; ++i) {
+ GC_ASSERT(result -> hash[i].p == 0);
+ }
+# endif
+ *key_ptr = result;
+ return 0;
+}
+
+GC_INNER int GC_setspecific(tsd * key, void * value)
+{
+ pthread_t self = pthread_self();
+ unsigned hash_val = HASH(self);
+ volatile tse * entry;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_ASSERT(self != INVALID_THREADID);
+ GC_dont_gc++; /* disable GC */
+ entry = (volatile tse *)MALLOC_CLEAR(sizeof(tse));
+ GC_dont_gc--;
+ if (0 == entry) return ENOMEM;
+
+ pthread_mutex_lock(&(key -> lock));
+ /* Could easily check for an existing entry here. */
+ entry -> next = key->hash[hash_val].p;
+ entry -> thread = self;
+ entry -> value = TS_HIDE_VALUE(value);
+ GC_ASSERT(entry -> qtid == INVALID_QTID);
+ /* There can only be one writer at a time, but this needs to be */
+ /* atomic with respect to concurrent readers. */
+ AO_store_release(&key->hash[hash_val].ao, (AO_t)entry);
+ GC_dirty((/* no volatile */ void *)entry);
+ GC_dirty(key->hash + hash_val);
+ if (pthread_mutex_unlock(&key->lock) != 0)
+ ABORT("pthread_mutex_unlock failed (setspecific)");
+ return 0;
+}
+
+/* Remove thread-specific data for a given thread. This function is */
+/* called at fork from the child process for all threads except for the */
+/* survived one. GC_remove_specific() should be called on thread exit. */
+GC_INNER void GC_remove_specific_after_fork(tsd * key, pthread_t t)
+{
+ unsigned hash_val = HASH(t);
+ tse *entry;
+ tse *prev = NULL;
+
+# ifdef CAN_HANDLE_FORK
+ /* Both GC_setspecific and GC_remove_specific should be called */
+ /* with the allocation lock held to ensure the consistency of */
+ /* the hash table in the forked child. */
+ GC_ASSERT(I_HOLD_LOCK());
+# endif
+ pthread_mutex_lock(&(key -> lock));
+ entry = key->hash[hash_val].p;
+ while (entry != NULL && !THREAD_EQUAL(entry->thread, t)) {
+ prev = entry;
+ entry = entry->next;
+ }
+ /* Invalidate qtid field, since qtids may be reused, and a later */
+ /* cache lookup could otherwise find this entry. */
+ if (entry != NULL) {
+ entry -> qtid = INVALID_QTID;
+ if (NULL == prev) {
+ key->hash[hash_val].p = entry->next;
+ GC_dirty(key->hash + hash_val);
+ } else {
+ prev->next = entry->next;
+ GC_dirty(prev);
+ }
+ /* Atomic! concurrent accesses still work. */
+ /* They must, since readers don't lock. */
+ /* We shouldn't need a volatile access here, */
+ /* since both this and the preceding write */
+ /* should become visible no later than */
+ /* the pthread_mutex_unlock() call. */
+ }
+ /* If we wanted to deallocate the entry, we'd first have to clear */
+ /* any cache entries pointing to it. That probably requires */
+ /* additional synchronization, since we can't prevent a concurrent */
+ /* cache lookup, which should still be examining deallocated memory.*/
+ /* This can only happen if the concurrent access is from another */
+ /* thread, and hence has missed the cache, but still... */
+# ifdef LINT2
+ GC_noop1((word)entry);
+# endif
+
+ /* With GC, we're done, since the pointers from the cache will */
+ /* be overwritten, all local pointers to the entries will be */
+ /* dropped, and the entry will then be reclaimed. */
+ if (pthread_mutex_unlock(&key->lock) != 0)
+ ABORT("pthread_mutex_unlock failed (remove_specific after fork)");
+}
+
+/* Note that even the slow path doesn't lock. */
+GC_INNER void * GC_slow_getspecific(tsd * key, word qtid,
+ tse * volatile * cache_ptr)
+{
+ pthread_t self = pthread_self();
+ tse *entry = key->hash[HASH(self)].p;
+
+ GC_ASSERT(qtid != INVALID_QTID);
+ while (entry != NULL && !THREAD_EQUAL(entry->thread, self)) {
+ entry = entry -> next;
+ }
+ if (entry == NULL) return NULL;
+ /* Set cache_entry. */
+ AO_store(&(entry -> qtid), qtid);
+ /* It's safe to do this asynchronously. Either value */
+ /* is safe, though may produce spurious misses. */
+ /* We're replacing one qtid with another one for the */
+ /* same thread. */
+ AO_store((volatile AO_t *)cache_ptr, (AO_t)entry);
+ return TS_REVEAL_PTR(entry -> value);
+}
+
+#ifdef GC_ASSERTIONS
+ /* Check that that all elements of the data structure associated */
+ /* with key are marked. */
+ void GC_check_tsd_marks(tsd *key)
+ {
+ int i;
+ tse *p;
+
+ if (!GC_is_marked(GC_base(key))) {
+ ABORT("Unmarked thread-specific-data table");
+ }
+ for (i = 0; i < TS_HASH_SIZE; ++i) {
+ for (p = key->hash[i].p; p != 0; p = p -> next) {
+ if (!GC_is_marked(GC_base(p))) {
+ ABORT_ARG1("Unmarked thread-specific-data entry",
+ " at %p", (void *)p);
+ }
+ }
+ }
+ for (i = 0; i < TS_CACHE_SIZE; ++i) {
+ p = key -> cache[i];
+ if (p != &invalid_tse && !GC_is_marked(GC_base(p))) {
+ ABORT_ARG1("Unmarked cached thread-specific-data entry",
+ " at %p", (void *)p);
+ }
+ }
+ }
+#endif /* GC_ASSERTIONS */
+
+#endif /* USE_CUSTOM_SPECIFIC */
diff --git a/graphics/asymptote/gc/tests/disclaim_bench.c b/graphics/asymptote/gc/tests/disclaim_bench.c
new file mode 100644
index 0000000000..3dcf321607
--- /dev/null
+++ b/graphics/asymptote/gc/tests/disclaim_bench.c
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2011 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gc_disclaim.h"
+
+#define NOT_GCBUILD
+#include "private/gc_priv.h"
+
+#undef rand
+static GC_RAND_STATE_T seed;
+#define rand() GC_RAND_NEXT(&seed)
+
+#define my_assert(e) \
+ if (!(e)) { \
+ fprintf(stderr, "Assertion failure, line %d: " #e "\n", __LINE__); \
+ exit(-1); \
+ }
+
+static int free_count = 0;
+
+struct testobj_s {
+ struct testobj_s *keep_link;
+ int i;
+};
+
+typedef struct testobj_s *testobj_t;
+
+void GC_CALLBACK testobj_finalize(void *obj, void *carg)
+{
+ ++*(int *)carg;
+ my_assert(((testobj_t)obj)->i == 109);
+ ((testobj_t)obj)->i = 110;
+}
+
+static const struct GC_finalizer_closure fclos = {
+ testobj_finalize,
+ &free_count
+};
+
+testobj_t testobj_new(int model)
+{
+ testobj_t obj;
+ switch (model) {
+# ifndef GC_NO_FINALIZATION
+ case 0:
+ obj = (struct testobj_s *)GC_malloc(sizeof(struct testobj_s));
+ if (obj != NULL)
+ GC_register_finalizer_no_order(obj, testobj_finalize,
+ &free_count, NULL, NULL);
+ break;
+# endif
+ case 1:
+ obj = (testobj_t)GC_finalized_malloc(sizeof(struct testobj_s),
+ &fclos);
+ break;
+ case 2:
+ obj = (struct testobj_s *)GC_malloc(sizeof(struct testobj_s));
+ break;
+ default:
+ exit(-1);
+ }
+ if (obj == NULL) {
+ fprintf(stderr, "Out of memory!\n");
+ exit(3);
+ }
+ my_assert(obj->i == 0 && obj->keep_link == NULL);
+ obj->i = 109;
+ return obj;
+}
+
+#define ALLOC_CNT (4*1024*1024)
+#define KEEP_CNT (32*1024)
+
+static char const *model_str[3] = {
+ "regular finalization",
+ "finalize on reclaim",
+ "no finalization"
+};
+
+int main(int argc, char **argv)
+{
+ int i;
+ int model, model_min, model_max;
+ testobj_t *keep_arr;
+
+ GC_INIT();
+ GC_init_finalized_malloc();
+ if (argc == 2 && strcmp(argv[1], "--help") == 0) {
+ fprintf(stderr,
+ "Usage: %s [FINALIZATION_MODEL]\n"
+ "\t0 -- original finalization\n"
+ "\t1 -- finalization on reclaim\n"
+ "\t2 -- no finalization\n", argv[0]);
+ return 1;
+ }
+ if (argc == 2) {
+ model_min = model_max = (int)COVERT_DATAFLOW(atoi(argv[1]));
+ if (model_min < 0 || model_max > 2)
+ exit(2);
+ } else {
+# ifndef GC_NO_FINALIZATION
+ model_min = 0;
+# else
+ model_min = 1;
+# endif
+ model_max = 2;
+ }
+ if (GC_get_find_leak())
+ printf("This test program is not designed for leak detection mode\n");
+
+ keep_arr = (testobj_t *)GC_malloc(sizeof(void *) * KEEP_CNT);
+ if (NULL == keep_arr) {
+ fprintf(stderr, "Out of memory!\n");
+ exit(3);
+ }
+
+ printf("\t\t\tfin. ratio time/s time/fin.\n");
+ for (model = model_min; model <= model_max; ++model) {
+ double t = 0.0;
+# ifndef NO_CLOCK
+ CLOCK_TYPE tI, tF;
+
+ GET_TIME(tI);
+# endif
+ free_count = 0;
+ for (i = 0; i < ALLOC_CNT; ++i) {
+ int k = rand() % KEEP_CNT;
+ keep_arr[k] = testobj_new(model);
+ }
+ GC_gcollect();
+# ifndef NO_CLOCK
+ GET_TIME(tF);
+ t = MS_TIME_DIFF(tF, tI)*1e-3;
+# endif
+
+ if (model < 2 && free_count > 0)
+ printf("%20s: %12.4f %12g %12g\n", model_str[model],
+ free_count/(double)ALLOC_CNT, t, t/free_count);
+ else
+ printf("%20s: %12.4f %12g %12s\n",
+ model_str[model], 0.0, t, "N/A");
+ }
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/disclaim_test.c b/graphics/asymptote/gc/tests/disclaim_test.c
new file mode 100644
index 0000000000..22a969c7a3
--- /dev/null
+++ b/graphics/asymptote/gc/tests/disclaim_test.c
@@ -0,0 +1,273 @@
+/*
+ * Copyright (c) 2011 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* Test that objects reachable from an object allocated with */
+/* GC_malloc_with_finalizer is not reclaimable before the finalizer */
+/* is called. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+ /* For GC_[P]THREADS */
+# include "config.h"
+#endif
+
+#undef GC_NO_THREAD_REDIRECTS
+#include "gc_disclaim.h"
+
+#define NOT_GCBUILD
+#include "private/gc_priv.h"
+ /* Redefine the standard rand() with a trivial (yet sufficient for */
+ /* the test purpose) implementation to avoid crashes inside rand() */
+ /* on some hosts (e.g. FreeBSD 13.0) when used concurrently. */
+ /* The standard specifies rand() as not a thread-safe API function. */
+ /* On other hosts (e.g. OpenBSD 7.3), use of the standard rand() */
+ /* causes "rand() may return deterministic values" warning. */
+#undef rand
+static GC_RAND_STATE_T seed; /* concurrent update does not hurt the test */
+#define rand() GC_RAND_NEXT(&seed)
+
+#define my_assert(e) \
+ if (!(e)) { \
+ fflush(stdout); \
+ fprintf(stderr, "Assertion failure, line %d: " #e "\n", __LINE__); \
+ exit(-1); \
+ }
+
+int memeq(void *s, int c, size_t len)
+{
+ while (len--) {
+ if (*(char *)s != c)
+ return 0;
+ s = (char *)s + 1;
+ }
+ return 1;
+}
+
+void GC_CALLBACK misc_sizes_dct(void *obj, void *cd)
+{
+ unsigned log_size = *(unsigned char *)obj;
+ size_t size;
+
+ my_assert(log_size < sizeof(size_t) * 8);
+ my_assert(cd == NULL);
+ size = (size_t)1 << log_size;
+ my_assert(memeq((char *)obj + 1, 0x56, size - 1));
+}
+
+void test_misc_sizes(void)
+{
+ static const struct GC_finalizer_closure fc = { misc_sizes_dct, NULL };
+ int i;
+ for (i = 1; i <= 20; ++i) { /* Up to 1 MiB. */
+ void *p = GC_finalized_malloc((size_t)1 << i, &fc);
+ if (p == NULL) {
+ fprintf(stderr, "Out of memory!\n");
+ exit(3);
+ }
+ my_assert(memeq(p, 0, (size_t)1 << i));
+ memset(p, 0x56, (size_t)1 << i);
+ *(unsigned char *)p = (unsigned char)i;
+ }
+}
+
+typedef struct pair_s *pair_t;
+
+struct pair_s {
+ char magic[16];
+ int checksum;
+ pair_t car;
+ pair_t cdr;
+};
+
+static const char * const pair_magic = "PAIR_MAGIC_BYTES";
+
+int is_pair(pair_t p)
+{
+ return memcmp(p->magic, pair_magic, sizeof(p->magic)) == 0;
+}
+
+#define PTR_HASH(p) (GC_HIDE_POINTER(p) >> 4)
+
+void GC_CALLBACK pair_dct(void *obj, void *cd)
+{
+ pair_t p = (pair_t)obj;
+ int checksum;
+
+ my_assert(cd == (void *)PTR_HASH(p));
+ /* Check that obj and its car and cdr are not trashed. */
+# ifdef DEBUG_DISCLAIM_DESTRUCT
+ printf("Destruct %p: (car= %p, cdr= %p)\n",
+ (void *)p, (void *)p->car, (void *)p->cdr);
+# endif
+ my_assert(GC_base(obj));
+ my_assert(is_pair(p));
+ my_assert(!p->car || is_pair(p->car));
+ my_assert(!p->cdr || is_pair(p->cdr));
+ checksum = 782;
+ if (p->car) checksum += p->car->checksum;
+ if (p->cdr) checksum += p->cdr->checksum;
+ my_assert(p->checksum == checksum);
+
+ /* Invalidate it. */
+ memset(p->magic, '*', sizeof(p->magic));
+ p->checksum = 0;
+ p->car = NULL;
+ p->cdr = NULL;
+}
+
+pair_t
+pair_new(pair_t car, pair_t cdr)
+{
+ pair_t p;
+ struct GC_finalizer_closure *pfc =
+ GC_NEW_ATOMIC(struct GC_finalizer_closure);
+
+ if (NULL == pfc) {
+ fprintf(stderr, "Out of memory!\n");
+ exit(3);
+ }
+ pfc->proc = pair_dct;
+ p = (pair_t)GC_finalized_malloc(sizeof(struct pair_s), pfc);
+ if (p == NULL) {
+ fprintf(stderr, "Out of memory!\n");
+ exit(3);
+ }
+ pfc->cd = (void *)PTR_HASH(p);
+ my_assert(!is_pair(p));
+ my_assert(memeq(p, 0, sizeof(struct pair_s)));
+ memcpy(p->magic, pair_magic, sizeof(p->magic));
+ p->checksum = 782 + (car? car->checksum : 0) + (cdr? cdr->checksum : 0);
+ p->car = car;
+ GC_ptr_store_and_dirty(&p->cdr, cdr);
+ GC_reachable_here(car);
+# ifdef DEBUG_DISCLAIM_DESTRUCT
+ printf("Construct %p: (car= %p, cdr= %p)\n",
+ (void *)p, (void *)p->car, (void *)p->cdr);
+# endif
+ return p;
+}
+
+void
+pair_check_rec(pair_t p)
+{
+ while (p) {
+ int checksum = 782;
+ if (p->car) checksum += p->car->checksum;
+ if (p->cdr) checksum += p->cdr->checksum;
+ my_assert(p->checksum == checksum);
+ if (rand() % 2)
+ p = p->car;
+ else
+ p = p->cdr;
+ }
+}
+
+#ifdef GC_PTHREADS
+# ifndef NTHREADS
+# define NTHREADS 6
+# endif
+# include <errno.h> /* for EAGAIN */
+# include <pthread.h>
+#else
+# undef NTHREADS
+# define NTHREADS 1
+#endif
+
+#define POP_SIZE 1000
+#if NTHREADS > 1
+# define MUTATE_CNT (2000000/NTHREADS)
+#else
+# define MUTATE_CNT 10000000
+#endif
+#define GROW_LIMIT (MUTATE_CNT/10)
+
+void *test(void *data)
+{
+ int i;
+ pair_t pop[POP_SIZE];
+ memset(pop, 0, sizeof(pop));
+ for (i = 0; i < MUTATE_CNT; ++i) {
+ int t = rand() % POP_SIZE;
+ int j;
+
+ switch (rand() % (i > GROW_LIMIT? 5 : 3)) {
+ case 0: case 3:
+ if (pop[t])
+ pop[t] = pop[t]->car;
+ break;
+ case 1: case 4:
+ if (pop[t])
+ pop[t] = pop[t]->cdr;
+ break;
+ case 2:
+ j = rand() % POP_SIZE;
+ pop[t] = pair_new(pop[j], pop[rand() % POP_SIZE]);
+ break;
+ }
+ if (rand() % 8 == 1)
+ pair_check_rec(pop[rand() % POP_SIZE]);
+ }
+ return data;
+}
+
+int main(void)
+{
+# if NTHREADS > 1
+ pthread_t th[NTHREADS];
+ int i, n;
+# endif
+
+ GC_set_all_interior_pointers(0); /* for a stricter test */
+# ifdef TEST_MANUAL_VDB
+ GC_set_manual_vdb_allowed(1);
+# endif
+ GC_INIT();
+ GC_init_finalized_malloc();
+# ifndef NO_INCREMENTAL
+ GC_enable_incremental();
+# endif
+ if (GC_get_find_leak())
+ printf("This test program is not designed for leak detection mode\n");
+
+ test_misc_sizes();
+
+# if NTHREADS > 1
+ printf("Threaded disclaim test.\n");
+ for (i = 0; i < NTHREADS; ++i) {
+ int err = pthread_create(&th[i], NULL, test, NULL);
+ if (err) {
+ fprintf(stderr, "Failed to create thread #%d: %s\n", i,
+ strerror(err));
+ if (i > 1 && EAGAIN == err) break;
+ exit(1);
+ }
+ }
+ n = i;
+ for (i = 0; i < n; ++i) {
+ int err = pthread_join(th[i], NULL);
+ if (err) {
+ fprintf(stderr, "Failed to join thread #%d: %s\n", i,
+ strerror(err));
+ exit(69);
+ }
+ }
+# else
+ printf("Unthreaded disclaim test.\n");
+ test(NULL);
+# endif
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/disclaim_weakmap_test.c b/graphics/asymptote/gc/tests/disclaim_weakmap_test.c
new file mode 100644
index 0000000000..84201e2abd
--- /dev/null
+++ b/graphics/asymptote/gc/tests/disclaim_weakmap_test.c
@@ -0,0 +1,464 @@
+/*
+ * Copyright (c) 2018 Petter A. Urkedal
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* This tests a case where disclaim notifiers sometimes return non-zero */
+/* in order to protect objects from collection. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+ /* For GC_[P]THREADS */
+# include "config.h"
+#endif
+
+#include "gc_disclaim.h" /* includes gc.h */
+
+#define NOT_GCBUILD
+#include "private/gc_priv.h"
+#undef rand
+static GC_RAND_STATE_T seed; /* concurrent update does not hurt the test */
+#define rand() GC_RAND_NEXT(&seed)
+
+#include "gc_mark.h" /* should not precede include gc_priv.h */
+
+#ifdef GC_PTHREADS
+# ifndef NTHREADS
+# define NTHREADS 8
+# endif
+# include <errno.h> /* for EAGAIN, EBUSY */
+# include <pthread.h>
+# include "private/gc_atomic_ops.h" /* for AO_t and AO_fetch_and_add1 */
+#else
+# undef NTHREADS
+# define NTHREADS 1
+# ifndef AO_HAVE_compiler_barrier
+# define AO_t GC_word
+# endif
+#endif
+
+#define POP_SIZE 200
+#define MUTATE_CNT (5000000 / NTHREADS)
+#define GROW_LIMIT (MUTATE_CNT / 10)
+
+#define WEAKMAP_CAPACITY 256
+#define WEAKMAP_MUTEX_COUNT 32
+
+/* FINALIZER_CLOSURE_FLAG definition matches the one in fnlz_mlc.c. */
+#if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH)
+# define FINALIZER_CLOSURE_FLAG 0x2
+# define INVALIDATE_FLAG 0x1
+#else
+# define FINALIZER_CLOSURE_FLAG 0x1
+# define INVALIDATE_FLAG 0x2
+#endif
+
+#define my_assert(e) \
+ if (!(e)) { \
+ fflush(stdout); \
+ fprintf(stderr, "Assertion failure, line %d: %s\n", __LINE__, #e); \
+ exit(70); \
+ }
+
+#define CHECK_OOM(p) \
+ do { \
+ if (NULL == (p)) { \
+ fprintf(stderr, "Out of memory\n"); \
+ exit(69); \
+ } \
+ } while (0)
+
+#ifndef AO_HAVE_fetch_and_add1
+# define AO_fetch_and_add1(p) ((*(p))++)
+ /* This is used only to update counters. */
+#endif
+
+unsigned memhash(void *src, size_t len)
+{
+ unsigned acc = 0;
+ size_t i;
+
+ my_assert(len % sizeof(GC_word) == 0);
+ for (i = 0; i < len / sizeof(GC_word); ++i) {
+ acc = (unsigned)((2003 * (GC_word)acc + ((GC_word *)src)[i]) / 3);
+ }
+ return acc;
+}
+
+static volatile AO_t stat_added;
+static volatile AO_t stat_found;
+static volatile AO_t stat_removed;
+static volatile AO_t stat_skip_locked;
+static volatile AO_t stat_skip_marked;
+
+struct weakmap_link {
+ GC_hidden_pointer obj;
+ struct weakmap_link *next;
+};
+
+struct weakmap {
+# ifdef GC_PTHREADS
+ pthread_mutex_t mutex[WEAKMAP_MUTEX_COUNT];
+# endif
+ size_t key_size;
+ size_t obj_size;
+ size_t capacity;
+ unsigned weakobj_kind;
+ struct weakmap_link **links; /* NULL means weakmap is destroyed */
+};
+
+void weakmap_lock(struct weakmap *wm, unsigned h)
+{
+# ifdef GC_PTHREADS
+ int err = pthread_mutex_lock(&wm->mutex[h % WEAKMAP_MUTEX_COUNT]);
+ my_assert(0 == err);
+# else
+ (void)wm; (void)h;
+# endif
+}
+
+int weakmap_trylock(struct weakmap *wm, unsigned h)
+{
+# ifdef GC_PTHREADS
+ int err = pthread_mutex_trylock(&wm->mutex[h % WEAKMAP_MUTEX_COUNT]);
+ if (err != 0 && err != EBUSY) {
+ fprintf(stderr, "pthread_mutex_trylock: %s\n", strerror(err));
+ exit(69);
+ }
+ return err;
+# else
+ (void)wm; (void)h;
+ return 0;
+# endif
+}
+
+void weakmap_unlock(struct weakmap *wm, unsigned h)
+{
+# ifdef GC_PTHREADS
+ int err = pthread_mutex_unlock(&wm->mutex[h % WEAKMAP_MUTEX_COUNT]);
+ my_assert(0 == err);
+# else
+ (void)wm; (void)h;
+# endif
+}
+
+void *GC_CALLBACK set_mark_bit(void *obj)
+{
+ GC_set_mark_bit(obj);
+ return NULL;
+}
+
+void *weakmap_add(struct weakmap *wm, void *obj, size_t obj_size)
+{
+ struct weakmap_link *link, *new_link, **first;
+ GC_word *new_base;
+ void *new_obj;
+ unsigned h;
+ size_t key_size = wm->key_size;
+
+ /* Lock and look for an existing entry. */
+ my_assert(key_size <= obj_size);
+ h = memhash(obj, key_size);
+ first = &wm->links[h % wm->capacity];
+ weakmap_lock(wm, h);
+
+ for (link = *first; link != NULL; link = link->next) {
+ void *old_obj = GC_get_find_leak() ? (void *)link->obj
+ : GC_REVEAL_POINTER(link->obj);
+
+ if (memcmp(old_obj, obj, key_size) == 0) {
+ GC_call_with_alloc_lock(set_mark_bit, (GC_word *)old_obj - 1);
+ /* Pointers in the key part may have been freed and reused, */
+ /* changing the keys without memcmp noticing. This is okay */
+ /* as long as we update the mapped value. */
+ if (memcmp((char *)old_obj + key_size, (char *)obj + key_size,
+ wm->obj_size - key_size) != 0) {
+ memcpy((char *)old_obj + key_size, (char *)obj + key_size,
+ wm->obj_size - key_size);
+ GC_end_stubborn_change((char *)old_obj + key_size);
+ }
+ weakmap_unlock(wm, h);
+ AO_fetch_and_add1(&stat_found);
+# ifdef DEBUG_DISCLAIM_WEAKMAP
+ printf("Found %p, hash= %p\n", old_obj, (void *)(GC_word)h);
+# endif
+ return old_obj;
+ }
+ }
+
+ /* Create new object. */
+ new_base = (GC_word *)GC_generic_malloc(sizeof(GC_word) + wm->obj_size,
+ wm->weakobj_kind);
+ CHECK_OOM(new_base);
+ *new_base = (GC_word)wm | FINALIZER_CLOSURE_FLAG;
+ new_obj = (void *)(new_base + 1);
+ memcpy(new_obj, obj, wm->obj_size);
+ GC_end_stubborn_change(new_base);
+
+ /* Add the object to the map. */
+ new_link = (struct weakmap_link *)GC_malloc(sizeof(struct weakmap_link));
+ CHECK_OOM(new_link);
+ new_link->obj = GC_get_find_leak() ? (GC_word)new_obj
+ : GC_HIDE_POINTER(new_obj);
+ new_link->next = *first;
+ GC_END_STUBBORN_CHANGE(new_link);
+ GC_ptr_store_and_dirty(first, new_link);
+ weakmap_unlock(wm, h);
+ AO_fetch_and_add1(&stat_added);
+# ifdef DEBUG_DISCLAIM_WEAKMAP
+ printf("Added %p, hash= %p\n", new_obj, (void *)(GC_word)h);
+# endif
+ return new_obj;
+}
+
+int GC_CALLBACK weakmap_disclaim(void *obj_base)
+{
+ struct weakmap *wm;
+ struct weakmap_link **link;
+ GC_word hdr;
+ void *obj;
+ unsigned h;
+
+ /* Decode header word. */
+ hdr = *(GC_word *)obj_base;
+ if ((hdr & FINALIZER_CLOSURE_FLAG) == 0)
+ return 0; /* on GC free list, ignore it. */
+
+ my_assert((hdr & INVALIDATE_FLAG) == 0);
+ wm = (struct weakmap *)(hdr & ~(GC_word)FINALIZER_CLOSURE_FLAG);
+ if (NULL == wm->links)
+ return 0; /* weakmap has been already destroyed */
+ obj = (GC_word *)obj_base + 1;
+
+ /* Lock and check for mark. */
+ h = memhash(obj, wm->key_size);
+ if (weakmap_trylock(wm, h) != 0) {
+ AO_fetch_and_add1(&stat_skip_locked);
+# ifdef DEBUG_DISCLAIM_WEAKMAP
+ printf("Skipping locked %p, hash= %p\n", obj, (void *)(GC_word)h);
+# endif
+ return 1;
+ }
+ if (GC_is_marked(obj_base)) {
+ weakmap_unlock(wm, h);
+ AO_fetch_and_add1(&stat_skip_marked);
+# ifdef DEBUG_DISCLAIM_WEAKMAP
+ printf("Skipping marked %p, hash= %p\n", obj, (void *)(GC_word)h);
+# endif
+ return 1;
+ }
+
+ /* Remove obj from wm. */
+ AO_fetch_and_add1(&stat_removed);
+# ifdef DEBUG_DISCLAIM_WEAKMAP
+ printf("Removing %p, hash= %p\n", obj, (void *)(GC_word)h);
+# endif
+ *(GC_word *)obj_base |= INVALIDATE_FLAG;
+ for (link = &wm->links[h % wm->capacity];; link = &(*link)->next) {
+ void *old_obj;
+
+ if (NULL == *link) {
+ fprintf(stderr, "Did not find %p\n", obj);
+ exit(70);
+ }
+ old_obj = GC_get_find_leak() ? (void *)(*link)->obj
+ : GC_REVEAL_POINTER((*link)->obj);
+ if (old_obj == obj)
+ break;
+ my_assert(memcmp(old_obj, obj, wm->key_size) != 0);
+ }
+ GC_ptr_store_and_dirty(link, (*link)->next);
+ weakmap_unlock(wm, h);
+ return 0;
+}
+
+struct weakmap *weakmap_new(size_t capacity, size_t key_size, size_t obj_size,
+ unsigned weakobj_kind)
+{
+ struct weakmap *wm = (struct weakmap *)GC_malloc(sizeof(struct weakmap));
+
+ CHECK_OOM(wm);
+# ifdef GC_PTHREADS
+ {
+ int i;
+ for (i = 0; i < WEAKMAP_MUTEX_COUNT; ++i) {
+ int err = pthread_mutex_init(&wm->mutex[i], NULL);
+ my_assert(err == 0);
+ }
+ }
+# endif
+ wm->key_size = key_size;
+ wm->obj_size = obj_size;
+ wm->capacity = capacity;
+ wm->weakobj_kind = weakobj_kind;
+ GC_ptr_store_and_dirty(&wm->links,
+ GC_malloc(sizeof(struct weakmap_link *) * capacity));
+ CHECK_OOM(wm->links);
+ return wm;
+}
+
+void weakmap_destroy(struct weakmap *wm)
+{
+# ifdef GC_PTHREADS
+ int i;
+
+ for (i = 0; i < WEAKMAP_MUTEX_COUNT; ++i) {
+ (void)pthread_mutex_destroy(&wm->mutex[i]);
+ }
+# endif
+ wm->links = NULL; /* weakmap is destroyed */
+}
+
+struct weakmap *pair_hcset;
+
+#define PAIR_MAGIC_SIZE 16 /* should not exceed sizeof(pair_magic) */
+
+struct pair_key {
+ struct pair *car, *cdr;
+};
+
+struct pair {
+ struct pair *car;
+ struct pair *cdr;
+ char magic[PAIR_MAGIC_SIZE];
+ int checksum;
+};
+
+static const char * const pair_magic = "PAIR_MAGIC_BYTES";
+
+struct pair *pair_new(struct pair *car, struct pair *cdr)
+{
+ struct pair tmpl;
+
+ memset(&tmpl, 0, sizeof(tmpl)); /* To clear the paddings (to avoid */
+ /* a compiler warning). */
+ tmpl.car = car;
+ tmpl.cdr = cdr;
+ memcpy(tmpl.magic, pair_magic, PAIR_MAGIC_SIZE);
+ tmpl.checksum = 782 + (car? car->checksum : 0) + (cdr? cdr->checksum : 0);
+ return (struct pair *)weakmap_add(pair_hcset, &tmpl, sizeof(tmpl));
+}
+
+void pair_check_rec(struct pair *p, int line)
+{
+ while (p != NULL) {
+ int checksum = 782;
+
+ if (memcmp(p->magic, pair_magic, PAIR_MAGIC_SIZE) != 0) {
+ fprintf(stderr, "Magic bytes wrong for %p at %d\n", (void *)p, line);
+ exit(70);
+ }
+ if (p->car != NULL)
+ checksum += p->car->checksum;
+ if (p->cdr != NULL)
+ checksum += p->cdr->checksum;
+ if (p->checksum != checksum) {
+ fprintf(stderr, "Checksum failure for %p: (car= %p, cdr= %p) at %d\n",
+ (void *)p, (void *)p->car, (void *)p->cdr, line);
+ exit(70);
+ }
+ p = (rand() & 1) != 0 ? p->cdr : p->car;
+ }
+}
+
+void *test(void *data)
+{
+ int i;
+ struct pair *p0, *p1;
+ struct pair *pop[POP_SIZE];
+
+ memset(pop, 0, sizeof(pop));
+ for (i = 0; i < MUTATE_CNT; ++i) {
+ int bits = rand();
+ int t = (bits >> 3) % POP_SIZE;
+
+ switch (bits % (i > GROW_LIMIT ? 5 : 3)) {
+ case 0:
+ case 3:
+ if (pop[t] != NULL)
+ pop[t] = pop[t]->car;
+ break;
+ case 1:
+ case 4:
+ if (pop[t] != NULL)
+ pop[t] = pop[t]->cdr;
+ break;
+ case 2:
+ p0 = pop[rand() % POP_SIZE];
+ p1 = pop[rand() % POP_SIZE];
+ pop[t] = pair_new(p0, p1);
+ my_assert(pair_new(p0, p1) == pop[t]);
+ my_assert(pop[t]->car == p0);
+ my_assert(pop[t]->cdr == p1);
+ break;
+ }
+ pair_check_rec(pop[rand() % POP_SIZE], __LINE__);
+ }
+ return data;
+}
+
+int main(void)
+{
+ unsigned weakobj_kind;
+# ifdef GC_PTHREADS
+ int i, n;
+ pthread_t th[NTHREADS];
+# endif
+
+ GC_set_all_interior_pointers(0); /* for a stricter test */
+# ifdef TEST_MANUAL_VDB
+ GC_set_manual_vdb_allowed(1);
+# endif
+ GC_INIT();
+ GC_init_finalized_malloc(); /* to register the displacements */
+# ifndef NO_INCREMENTAL
+ GC_enable_incremental();
+# endif
+ if (GC_get_find_leak())
+ printf("This test program is not designed for leak detection mode\n");
+ weakobj_kind = GC_new_kind(GC_new_free_list(), /* 0 | */ GC_DS_LENGTH,
+ 1 /* adjust */, 1 /* clear */);
+ GC_register_disclaim_proc(weakobj_kind, weakmap_disclaim,
+ 1 /* mark_unconditionally */);
+ pair_hcset = weakmap_new(WEAKMAP_CAPACITY, sizeof(struct pair_key),
+ sizeof(struct pair), weakobj_kind);
+
+# ifdef GC_PTHREADS
+ for (i = 0; i < NTHREADS; ++i) {
+ int err = pthread_create(&th[i], NULL, test, NULL);
+ if (err != 0) {
+ fprintf(stderr, "Failed to create thread #%d: %s\n",
+ i, strerror(err));
+ if (i > 1 && EAGAIN == err) break;
+ exit(1);
+ }
+ }
+ n = i;
+ for (i = 0; i < n; ++i) {
+ int err = pthread_join(th[i], NULL);
+ if (err != 0) {
+ fprintf(stderr, "Failed to join thread #%d: %s\n", i, strerror(err));
+ exit(69);
+ }
+ }
+# else
+ (void)test(NULL);
+# endif
+ weakmap_destroy(pair_hcset);
+ printf("%u added, %u found; %u removed, %u locked, %u marked; %u remains\n",
+ (unsigned)stat_added, (unsigned)stat_found, (unsigned)stat_removed,
+ (unsigned)stat_skip_locked, (unsigned)stat_skip_marked,
+ (unsigned)stat_added - (unsigned)stat_removed);
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/huge_test.c b/graphics/asymptote/gc/tests/huge_test.c
new file mode 100644
index 0000000000..8bb8bd3289
--- /dev/null
+++ b/graphics/asymptote/gc/tests/huge_test.c
@@ -0,0 +1,67 @@
+
+#include <stdlib.h>
+#include <limits.h>
+#include <stdio.h>
+
+#ifndef GC_IGNORE_WARN
+ /* Ignore misleading "Out of Memory!" warning (which is printed on */
+ /* every GC_MALLOC call below) by defining this macro before "gc.h" */
+ /* inclusion. */
+# define GC_IGNORE_WARN
+#endif
+
+#ifndef GC_MAXIMUM_HEAP_SIZE
+# define GC_MAXIMUM_HEAP_SIZE (100 * 1024 * 1024)
+# define GC_INITIAL_HEAP_SIZE (GC_MAXIMUM_HEAP_SIZE / 20)
+ /* Otherwise heap expansion aborts when deallocating large block. */
+ /* That's OK. We test this corner case mostly to make sure that */
+ /* it fails predictably. */
+#endif
+
+#ifndef GC_ATTR_ALLOC_SIZE
+ /* Omit alloc_size attribute to avoid compiler warnings about */
+ /* exceeding maximum object size when values close to GC_SWORD_MAX */
+ /* are passed to GC_MALLOC. */
+# define GC_ATTR_ALLOC_SIZE(argnum) /* empty */
+#endif
+
+#include "gc.h"
+
+/*
+ * Check that very large allocation requests fail. "Success" would usually
+ * indicate that the size was somehow converted to a negative
+ * number. Clients shouldn't do this, but we should fail in the
+ * expected manner.
+ */
+
+#define CHECK_ALLOC_FAILED(r, sz_str) \
+ do { \
+ if (NULL != (r)) { \
+ fprintf(stderr, \
+ "Size " sz_str " allocation unexpectedly succeeded\n"); \
+ exit(1); \
+ } \
+ } while (0)
+
+#define GC_WORD_MAX ((GC_word)-1)
+#define GC_SWORD_MAX ((GC_signed_word)(GC_WORD_MAX >> 1))
+
+int main(void)
+{
+ GC_INIT();
+
+ CHECK_ALLOC_FAILED(GC_MALLOC(GC_SWORD_MAX - 1024), "SWORD_MAX-1024");
+ CHECK_ALLOC_FAILED(GC_MALLOC(GC_SWORD_MAX), "SWORD_MAX");
+ /* Skip other checks to avoid "exceeds maximum object size" gcc warning. */
+# if !defined(_FORTIFY_SOURCE)
+ CHECK_ALLOC_FAILED(GC_MALLOC((GC_word)GC_SWORD_MAX + 1), "SWORD_MAX+1");
+ CHECK_ALLOC_FAILED(GC_MALLOC((GC_word)GC_SWORD_MAX + 1024),
+ "SWORD_MAX+1024");
+ CHECK_ALLOC_FAILED(GC_MALLOC(GC_WORD_MAX - 1024), "WORD_MAX-1024");
+ CHECK_ALLOC_FAILED(GC_MALLOC(GC_WORD_MAX - 16), "WORD_MAX-16");
+ CHECK_ALLOC_FAILED(GC_MALLOC(GC_WORD_MAX - 8), "WORD_MAX-8");
+ CHECK_ALLOC_FAILED(GC_MALLOC(GC_WORD_MAX - 4), "WORD_MAX-4");
+ CHECK_ALLOC_FAILED(GC_MALLOC(GC_WORD_MAX), "WORD_MAX");
+# endif
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/initsecondarythread.c b/graphics/asymptote/gc/tests/initsecondarythread.c
new file mode 100644
index 0000000000..a2438475a7
--- /dev/null
+++ b/graphics/asymptote/gc/tests/initsecondarythread.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2011 Ludovic Courtes
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* Make sure 'GC_INIT' can be called from threads other than the initial
+ * thread.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef GC_THREADS
+# define GC_THREADS
+#endif
+
+#define GC_NO_THREAD_REDIRECTS 1
+ /* Do not redirect thread creation and join calls. */
+
+#include "gc.h"
+
+#ifdef GC_PTHREADS
+# include <pthread.h>
+#else
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+# endif
+# define NOSERVICE
+# include <windows.h>
+#endif /* !GC_PTHREADS */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#define CHECK_OUT_OF_MEMORY(p) \
+ do { \
+ if (NULL == (p)) { \
+ fprintf(stderr, "Out of memory\n"); \
+ exit(69); \
+ } \
+ } while (0)
+
+#ifdef GC_PTHREADS
+ static void *thread(void *arg)
+#else
+ static DWORD WINAPI thread(LPVOID arg)
+#endif
+{
+ GC_INIT();
+ CHECK_OUT_OF_MEMORY(GC_MALLOC(123));
+ CHECK_OUT_OF_MEMORY(GC_MALLOC(12345));
+# ifdef GC_PTHREADS
+ return arg;
+# else
+ return (DWORD)(GC_word)arg;
+# endif
+}
+
+#include "private/gcconfig.h"
+
+int main(void)
+{
+# ifdef GC_PTHREADS
+ int code;
+ pthread_t t;
+
+# ifdef LINT2
+ t = pthread_self(); /* explicitly initialize to some value */
+# endif
+# else
+ HANDLE t;
+ DWORD thread_id;
+# endif
+# if !(defined(BEOS) || defined(MSWIN32) || defined(MSWINCE) \
+ || defined(CYGWIN32) || defined(GC_OPENBSD_UTHREADS) \
+ || (defined(DARWIN) && !defined(NO_PTHREAD_GET_STACKADDR_NP)) \
+ || ((defined(FREEBSD) || defined(LINUX) || defined(NETBSD) \
+ || defined(HOST_ANDROID)) && !defined(NO_PTHREAD_GETATTR_NP) \
+ && !defined(NO_PTHREAD_ATTR_GET_NP)) \
+ || (defined(GC_SOLARIS_THREADS) && !defined(_STRICT_STDC)) \
+ || (!defined(STACKBOTTOM) && (defined(HEURISTIC1) \
+ || (!defined(LINUX_STACKBOTTOM) && !defined(FREEBSD_STACKBOTTOM)))))
+ /* GC_INIT() must be called from main thread only. */
+ GC_INIT();
+# endif
+ (void)GC_get_parallel(); /* linking fails if no threads support */
+ if (GC_get_find_leak())
+ printf("This test program is not designed for leak detection mode\n");
+# ifdef GC_PTHREADS
+ if ((code = pthread_create (&t, NULL, thread, NULL)) != 0) {
+ fprintf(stderr, "Thread creation failed, errno= %d\n", code);
+ return 1;
+ }
+ if ((code = pthread_join (t, NULL)) != 0) {
+ fprintf(stderr, "Thread join failed, errno= %d\n", code);
+ return 1;
+ }
+# else
+ t = CreateThread(NULL, 0, thread, 0, 0, &thread_id);
+ if (t == NULL) {
+ fprintf(stderr, "Thread creation failed, errcode= %d\n",
+ (int)GetLastError());
+ return 1;
+ }
+ if (WaitForSingleObject(t, INFINITE) != WAIT_OBJECT_0) {
+ fprintf(stderr, "Thread join failed, errcode= %d\n",
+ (int)GetLastError());
+ CloseHandle(t);
+ return 1;
+ }
+ CloseHandle(t);
+# endif
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/leak_test.c b/graphics/asymptote/gc/tests/leak_test.c
new file mode 100644
index 0000000000..f13d08138b
--- /dev/null
+++ b/graphics/asymptote/gc/tests/leak_test.c
@@ -0,0 +1,40 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "leak_detector.h"
+
+#define CHECK_OUT_OF_MEMORY(p) \
+ do { \
+ if (NULL == (p)) { \
+ fprintf(stderr, "Out of memory\n"); \
+ exit(69); \
+ } \
+ } while (0)
+
+int main(void) {
+ char *p[10];
+ int i;
+ GC_set_find_leak(1); /* for new collect versions not compiled */
+ /* with -DFIND_LEAK. */
+
+ GC_INIT(); /* Needed if thread-local allocation is enabled. */
+ /* FIXME: This is not ideal. */
+ for (i = 0; i < 10; ++i) {
+ p[i] = (char*)malloc(sizeof(int)+i);
+ CHECK_OUT_OF_MEMORY(p[i]);
+ (void)malloc_usable_size(p[i]);
+ }
+ CHECK_LEAKS();
+ for (i = 1; i < 10; ++i) {
+ free(p[i]);
+ }
+ for (i = 0; i < 9; ++i) {
+ p[i] = (char*)malloc(sizeof(int)+i);
+ CHECK_OUT_OF_MEMORY(p[i]);
+ }
+ CHECK_LEAKS();
+ CHECK_LEAKS();
+ CHECK_LEAKS();
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/middle.c b/graphics/asymptote/gc/tests/middle.c
new file mode 100644
index 0000000000..18f90199a8
--- /dev/null
+++ b/graphics/asymptote/gc/tests/middle.c
@@ -0,0 +1,43 @@
+/*
+ * Test at the boundary between small and large objects.
+ * Inspired by a test case from Zoltan Varga.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "gc.h"
+
+#define CHECK_OUT_OF_MEMORY(p) \
+ do { \
+ if (NULL == (p)) { \
+ fprintf(stderr, "Out of memory\n"); \
+ exit(69); \
+ } \
+ } while (0)
+
+int main (void)
+{
+ int i;
+
+ GC_set_all_interior_pointers(0);
+ GC_INIT();
+ if (GC_get_find_leak())
+ printf("This test program is not designed for leak detection mode\n");
+
+ for (i = 0; i < 20000; ++i) {
+ CHECK_OUT_OF_MEMORY(GC_malloc_atomic(4096));
+ CHECK_OUT_OF_MEMORY(GC_malloc(4096));
+ }
+
+ /* Test delayed start of marker threads, if they are enabled. */
+ GC_start_mark_threads();
+
+ for (i = 0; i < 20000; ++i) {
+ CHECK_OUT_OF_MEMORY(GC_malloc_atomic(2048));
+ CHECK_OUT_OF_MEMORY(GC_malloc(2048));
+ }
+
+ printf("Final heap size is %lu\n", (unsigned long)GC_get_heap_size());
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/realloc_test.c b/graphics/asymptote/gc/tests/realloc_test.c
new file mode 100644
index 0000000000..c19d7d53d2
--- /dev/null
+++ b/graphics/asymptote/gc/tests/realloc_test.c
@@ -0,0 +1,50 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "gc.h"
+
+#define COUNT 10000000
+
+#define CHECK_OUT_OF_MEMORY(p) \
+ do { \
+ if (NULL == (p)) { \
+ fprintf(stderr, "Out of memory\n"); \
+ exit(69); \
+ } \
+ } while (0)
+
+int main(void) {
+ int i;
+ unsigned long last_heap_size = 0;
+
+ GC_INIT();
+ if (GC_get_find_leak())
+ printf("This test program is not designed for leak detection mode\n");
+
+ for (i = 0; i < COUNT; i++) {
+ int **p = GC_NEW(int *);
+ int *q;
+
+ CHECK_OUT_OF_MEMORY(p);
+ q = (int *)GC_MALLOC_ATOMIC(sizeof(int));
+ CHECK_OUT_OF_MEMORY(q);
+ if (*p != NULL) {
+ fprintf(stderr, "GC_malloc returned garbage (or NULL)\n");
+ exit(1);
+ }
+
+ *p = (int *)GC_REALLOC(q, 2 * sizeof(int));
+ CHECK_OUT_OF_MEMORY(*p);
+
+ if (i % 10 == 0) {
+ unsigned long heap_size = (unsigned long)GC_get_heap_size();
+
+ if (heap_size != last_heap_size) {
+ printf("Heap size: %lu\n", heap_size);
+ last_heap_size = heap_size;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/smash_test.c b/graphics/asymptote/gc/tests/smash_test.c
new file mode 100644
index 0000000000..ed484265c2
--- /dev/null
+++ b/graphics/asymptote/gc/tests/smash_test.c
@@ -0,0 +1,49 @@
+/* Test that overwrite error detection works reasonably. */
+
+#ifndef GC_DEBUG
+# define GC_DEBUG
+#endif
+
+#include "gc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define COUNT 7000
+#define SIZE 40
+
+#define CHECK_OUT_OF_MEMORY(p) \
+ do { \
+ if (NULL == (p)) { \
+ fprintf(stderr, "Out of memory\n"); \
+ exit(69); \
+ } \
+ } while (0)
+
+char * A[COUNT];
+
+char * volatile q;
+
+int main(void)
+{
+ int i;
+ char *p;
+
+ GC_INIT();
+ for (i = 0; i < COUNT; ++i) {
+ A[i] = p = (char *)GC_MALLOC(SIZE);
+ CHECK_OUT_OF_MEMORY(p);
+ if (i % 3000 == 0) {
+ q = NULL;
+ GC_gcollect();
+ } else if (i % 5678 == 0) {
+ /* Write a byte past the end of the allocated object */
+ /* but not beyond the last word of the object's memory. */
+ /* A volatile intermediate pointer variable is used to */
+ /* avoid a compiler complain of out-of-bounds access. */
+ q = &p[(SIZE + i / 2000) /* 42 */];
+ *q = 42;
+ }
+ }
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/staticrootslib.c b/graphics/asymptote/gc/tests/staticrootslib.c
new file mode 100644
index 0000000000..ad323a665e
--- /dev/null
+++ b/graphics/asymptote/gc/tests/staticrootslib.c
@@ -0,0 +1,86 @@
+
+/* This test file is intended to be compiled into a DLL. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef GC_DEBUG
+# define GC_DEBUG
+#endif
+
+#include "gc.h"
+
+#ifndef GC_TEST_EXPORT_API
+# if defined(GC_VISIBILITY_HIDDEN_SET) \
+ && !defined(__CEGCC__) && !defined(__CYGWIN__) && !defined(__MINGW32__)
+# define GC_TEST_EXPORT_API \
+ extern __attribute__((__visibility__("default")))
+# else
+# define GC_TEST_EXPORT_API extern
+# endif
+#endif
+
+#define CHECK_OUT_OF_MEMORY(p) \
+ do { \
+ if (NULL == (p)) { \
+ fprintf(stderr, "Out of memory\n"); \
+ exit(69); \
+ } \
+ } while (0)
+
+struct treenode {
+ struct treenode *x;
+ struct treenode *y;
+};
+
+static struct treenode *root[10] = { 0 };
+static struct treenode *root_nz[10] = { (struct treenode *)(GC_word)2 };
+
+#ifdef STATICROOTSLIB2
+# define libsrl_getpelem libsrl_getpelem2
+#else
+
+ GC_TEST_EXPORT_API struct treenode * libsrl_mktree(int i)
+ {
+ struct treenode *r = GC_NEW(struct treenode);
+ struct treenode *x, *y;
+
+ CHECK_OUT_OF_MEMORY(r);
+ if (0 == i)
+ return 0;
+ if (1 == i) {
+ r = (struct treenode *)GC_MALLOC_ATOMIC(sizeof(struct treenode));
+ CHECK_OUT_OF_MEMORY(r);
+ }
+ x = libsrl_mktree(i - 1);
+ y = libsrl_mktree(i - 1);
+ r -> x = x;
+ r -> y = y;
+ if (i != 1) {
+ GC_END_STUBBORN_CHANGE(r);
+ GC_reachable_here(x);
+ GC_reachable_here(y);
+ }
+ return r;
+ }
+
+ GC_TEST_EXPORT_API void * libsrl_init(void)
+ {
+# ifdef TEST_MANUAL_VDB
+ GC_set_manual_vdb_allowed(1);
+# endif
+# ifndef STATICROOTSLIB_INIT_IN_MAIN
+ GC_INIT();
+# endif
+# ifndef NO_INCREMENTAL
+ GC_enable_incremental();
+# endif
+ return GC_MALLOC(sizeof(struct treenode));
+ }
+
+#endif /* !STATICROOTSLIB2 */
+
+GC_TEST_EXPORT_API struct treenode ** libsrl_getpelem(int i, int j)
+{
+ return &((j & 1) != 0 ? root_nz : root)[i];
+}
diff --git a/graphics/asymptote/gc/tests/staticrootstest.c b/graphics/asymptote/gc/tests/staticrootstest.c
new file mode 100644
index 0000000000..66aca2997a
--- /dev/null
+++ b/graphics/asymptote/gc/tests/staticrootstest.c
@@ -0,0 +1,77 @@
+
+#include <stdio.h>
+#include <string.h>
+
+#ifndef GC_DEBUG
+# define GC_DEBUG
+#endif
+
+#include "gc.h"
+#include "gc_backptr.h"
+
+#ifndef GC_TEST_IMPORT_API
+# define GC_TEST_IMPORT_API extern
+#endif
+
+/* Should match that in staticrootslib.c. */
+struct treenode {
+ struct treenode *x;
+ struct treenode *y;
+};
+
+struct treenode *root[10] = { NULL };
+
+/* Same as "root" variable but initialized to some non-zero value (to */
+/* be placed to .data section instead of .bss). */
+struct treenode *root_nz[10] = { (struct treenode *)(GC_word)1 };
+
+static char *staticroot; /* intentionally static */
+
+GC_TEST_IMPORT_API struct treenode * libsrl_mktree(int i);
+GC_TEST_IMPORT_API void * libsrl_init(void);
+GC_TEST_IMPORT_API struct treenode ** libsrl_getpelem(int i, int j);
+
+GC_TEST_IMPORT_API struct treenode ** libsrl_getpelem2(int i, int j);
+
+void init_staticroot(void)
+{
+ /* Intentionally put staticroot initialization in a function other */
+ /* than main to prevent CSA warning that staticroot variable can be */
+ /* changed to be a local one). */
+ staticroot = (char *)libsrl_init();
+}
+
+int main(void)
+{
+ int i, j;
+
+# ifdef STATICROOTSLIB_INIT_IN_MAIN
+ GC_INIT();
+# endif
+ init_staticroot();
+ if (GC_get_find_leak())
+ printf("This test program is not designed for leak detection mode\n");
+ if (NULL == staticroot) {
+ fprintf(stderr, "GC_malloc returned NULL\n");
+ return 2;
+ }
+ memset(staticroot, 0x42, sizeof(struct treenode));
+ GC_gcollect();
+ for (j = 0; j < 4; j++) {
+ for (i = 0; i < (int)(sizeof(root) / sizeof(root[0])); ++i) {
+# ifdef STATICROOTSLIB2
+ *libsrl_getpelem2(i, j) = libsrl_mktree(12);
+# endif
+ *libsrl_getpelem(i, j) = libsrl_mktree(12);
+ ((j & 1) != 0 ? root_nz : root)[i] = libsrl_mktree(12);
+ GC_gcollect();
+ }
+ for (i = 0; i < (int)sizeof(struct treenode); ++i) {
+ if (staticroot[i] != 0x42) {
+ fprintf(stderr, "Memory check failed\n");
+ return -1;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/subthread_create.c b/graphics/asymptote/gc/tests/subthread_create.c
new file mode 100644
index 0000000000..8fc28c9333
--- /dev/null
+++ b/graphics/asymptote/gc/tests/subthread_create.c
@@ -0,0 +1,183 @@
+
+#ifdef HAVE_CONFIG_H
+ /* For GC_THREADS and PARALLEL_MARK */
+# include "config.h"
+#endif
+
+#ifdef GC_THREADS
+# include "gc.h"
+
+# ifdef PARALLEL_MARK
+# define AO_REQUIRE_CAS
+# endif
+# include "private/gc_atomic_ops.h"
+#endif /* GC_THREADS */
+
+#include <stdio.h>
+
+#ifdef AO_HAVE_fetch_and_add1
+
+#ifdef GC_PTHREADS
+# include <errno.h> /* for EAGAIN */
+# include <pthread.h>
+#else
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+# endif
+# define NOSERVICE
+# include <windows.h>
+#endif /* !GC_PTHREADS */
+
+#if defined(__HAIKU__)
+# include <errno.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef NTHREADS
+# define NTHREADS 5
+#endif
+
+#define NTHREADS_INNER (NTHREADS * 6) /* number of threads to create */
+
+#ifndef MAX_SUBTHREAD_DEPTH
+# define MAX_ALIVE_THREAD_COUNT 55
+# define MAX_SUBTHREAD_DEPTH 7
+# define MAX_SUBTHREAD_COUNT 200
+#endif
+
+#ifndef DECAY_NUMER
+# define DECAY_NUMER 15
+# define DECAY_DENOM 16
+#endif
+
+volatile AO_t thread_created_cnt = 0;
+volatile AO_t thread_ended_cnt = 0;
+
+#ifdef GC_PTHREADS
+ void *entry(void *arg)
+#else
+ DWORD WINAPI entry(LPVOID arg)
+#endif
+{
+ int thread_num = (int)AO_fetch_and_add1(&thread_created_cnt);
+ GC_word my_depth = (GC_word)arg + 1;
+
+ if (my_depth <= MAX_SUBTHREAD_DEPTH
+ && thread_num < MAX_SUBTHREAD_COUNT
+ && (thread_num % DECAY_DENOM) < DECAY_NUMER
+ && thread_num - (int)AO_load(&thread_ended_cnt)
+ <= MAX_ALIVE_THREAD_COUNT) {
+# ifdef GC_PTHREADS
+ int err;
+ pthread_t th;
+
+ err = pthread_create(&th, NULL, entry, (void *)my_depth);
+ if (err != 0) {
+ fprintf(stderr, "Thread #%d creation failed, error: %s\n",
+ thread_num, strerror(err));
+ if (err != EAGAIN)
+ exit(2);
+ } else {
+ err = pthread_detach(th);
+ if (err != 0) {
+ fprintf(stderr, "Thread #%d detach failed, error: %s\n",
+ thread_num, strerror(err));
+ exit(2);
+ }
+ }
+# else
+ HANDLE th;
+ DWORD thread_id;
+
+ th = CreateThread(NULL, 0, entry, (LPVOID)my_depth, 0, &thread_id);
+ if (th == NULL) {
+ fprintf(stderr, "Thread #%d creation failed, errcode= %d\n",
+ thread_num, (int)GetLastError());
+ exit(2);
+ }
+ CloseHandle(th);
+# endif
+ }
+
+ (void)AO_fetch_and_add1(&thread_ended_cnt);
+ return 0;
+}
+
+int main(void)
+{
+#if NTHREADS > 0
+ int i, n;
+# ifdef GC_PTHREADS
+ int err;
+ pthread_t th[NTHREADS_INNER];
+# else
+ HANDLE th[NTHREADS_INNER];
+# endif
+
+ GC_INIT();
+ for (i = 0; i < NTHREADS_INNER; ++i) {
+# ifdef GC_PTHREADS
+ err = pthread_create(&th[i], NULL, entry, 0);
+ if (err) {
+ fprintf(stderr, "Thread creation failed, error: %s\n",
+ strerror(err));
+ if (i > 0 && EAGAIN == err) break;
+ exit(1);
+ }
+# else
+ {
+ DWORD thread_id;
+
+ th[i] = CreateThread(NULL, 0, entry, 0, 0, &thread_id);
+ }
+ if (th[i] == NULL) {
+ fprintf(stderr, "Thread creation failed, errcode= %d\n",
+ (int)GetLastError());
+ exit(1);
+ }
+# endif
+ }
+ n = i;
+ for (i = 0; i < n; ++i) {
+# ifdef GC_PTHREADS
+ void *res;
+
+ err = pthread_join(th[i], &res);
+ if (err) {
+ fprintf(stderr, "Failed to join thread, error: %s\n",
+ strerror(err));
+# if defined(__HAIKU__)
+ /* The error is just ignored (and the test is ended) to */
+ /* workaround some bug in Haiku pthread_join. */
+ /* TODO: The thread is not deleted from GC_threads. */
+ if (ESRCH == err) break;
+# endif
+ exit(1);
+ }
+# else
+ if (WaitForSingleObject(th[i], INFINITE) != WAIT_OBJECT_0) {
+ fprintf(stderr, "Failed to join thread, errcode= %d\n",
+ (int)GetLastError());
+ CloseHandle(th[i]);
+ exit(1);
+ }
+ CloseHandle(th[i]);
+# endif
+ }
+#endif
+ printf("subthread_create: created %d threads (%d ended)\n",
+ (int)AO_load(&thread_created_cnt), (int)AO_load(&thread_ended_cnt));
+ return 0;
+}
+
+#else
+
+int main(void)
+{
+ printf("subthread_create test skipped\n");
+ return 0;
+}
+
+#endif /* !AO_HAVE_fetch_and_add1 */
diff --git a/graphics/asymptote/gc/tests/test.c b/graphics/asymptote/gc/tests/test.c
new file mode 100644
index 0000000000..529ca33d8c
--- /dev/null
+++ b/graphics/asymptote/gc/tests/test.c
@@ -0,0 +1,2540 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2009-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* An incomplete test for the garbage collector. */
+/* Some more obscure entry points are not tested at all. */
+/* This must be compiled with the same flags used to build the */
+/* GC. It uses GC internals to allow more precise results */
+/* checking for some of the tests. */
+
+# ifdef HAVE_CONFIG_H
+# include "config.h"
+# endif
+
+# undef GC_BUILD
+
+#if (defined(DBG_HDRS_ALL) || defined(MAKE_BACK_GRAPH)) \
+ && !defined(GC_DEBUG) && !defined(CPPCHECK)
+# define GC_DEBUG
+#endif
+
+#ifdef DEFAULT_VDB /* specified manually (e.g. passed to CFLAGS) */
+# define TEST_DEFAULT_VDB
+#endif
+
+#if defined(CPPCHECK) && defined(GC_PTHREADS) && !defined(_GNU_SOURCE)
+# define _GNU_SOURCE 1
+#endif
+#ifdef GC_NO_THREADS_DISCOVERY
+# undef GC_NO_THREAD_REDIRECTS
+#endif
+#include "gc.h"
+
+#ifndef NTHREADS /* Number of additional threads to fork. */
+# define NTHREADS 5 /* Excludes main thread, which also runs a test. */
+ /* In the single-threaded case, the number of times to rerun it. */
+ /* Not respected by PCR test. */
+#endif
+
+# if defined(mips) && defined(SYSTYPE_BSD43)
+ /* MIPS RISCOS 4 */
+# else
+# include <stdlib.h>
+# endif
+# include <stdio.h>
+# if defined(_WIN32_WCE) && !defined(__GNUC__)
+# include <winbase.h>
+/* # define assert ASSERT */
+# else
+# include <assert.h> /* Not normally used, but handy for debugging. */
+# endif
+
+#if defined(GC_NO_FINALIZATION) && !defined(NO_TYPED_TEST)
+# define NO_TYPED_TEST
+#endif
+
+#ifndef NO_TYPED_TEST
+# include "gc_typed.h"
+#endif
+
+#define NOT_GCBUILD
+#include "private/gc_priv.h" /* For output, locking, */
+ /* some statistics and gcconfig.h. */
+
+#if defined(GC_PRINT_VERBOSE_STATS) || defined(GCTEST_PRINT_VERBOSE)
+# define print_stats VERBOSE
+# define INIT_PRINT_STATS /* empty */
+#else
+ /* Use own variable as GC_print_stats might not be exported. */
+ static int print_stats = 0;
+# ifdef GC_READ_ENV_FILE
+ /* GETENV uses GC internal function in this case. */
+# define INIT_PRINT_STATS /* empty */
+# else
+# define INIT_PRINT_STATS \
+ { \
+ if (0 != GETENV("GC_PRINT_VERBOSE_STATS")) \
+ print_stats = VERBOSE; \
+ else if (0 != GETENV("GC_PRINT_STATS")) \
+ print_stats = 1; \
+ }
+# endif
+#endif /* !GC_PRINT_VERBOSE_STATS */
+
+# ifdef PCR
+# include "th/PCR_ThCrSec.h"
+# include "th/PCR_Th.h"
+# define GC_printf printf
+# endif
+
+# if defined(GC_PTHREADS) && !defined(GC_WIN32_PTHREADS)
+# include <pthread.h>
+# endif
+
+# if ((defined(DARWIN) && defined(MPROTECT_VDB) && !defined(THREADS) \
+ && !defined(MAKE_BACK_GRAPH) && !defined(TEST_HANDLE_FORK)) \
+ || (defined(THREADS) && !defined(CAN_HANDLE_FORK)) \
+ || defined(HAVE_NO_FORK) || defined(USE_WINALLOC)) \
+ && !defined(NO_TEST_HANDLE_FORK)
+# define NO_TEST_HANDLE_FORK
+# endif
+
+# ifndef NO_TEST_HANDLE_FORK
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# if defined(HANDLE_FORK) && defined(CAN_CALL_ATFORK)
+# define INIT_FORK_SUPPORT GC_set_handle_fork(1)
+ /* Causes abort in GC_init on pthread_atfork failure. */
+# elif !defined(TEST_FORK_WITHOUT_ATFORK)
+# define INIT_FORK_SUPPORT GC_set_handle_fork(-1)
+ /* Passing -1 implies fork() should be as well manually */
+ /* surrounded with GC_atfork_prepare/parent/child. */
+# endif
+# endif
+
+# ifndef INIT_FORK_SUPPORT
+# define INIT_FORK_SUPPORT /* empty */
+# endif
+
+#ifdef PCR
+# define FINALIZER_LOCK() PCR_ThCrSec_EnterSys()
+# define FINALIZER_UNLOCK() PCR_ThCrSec_ExitSys()
+#elif defined(GC_PTHREADS)
+ static pthread_mutex_t incr_lock = PTHREAD_MUTEX_INITIALIZER;
+# define FINALIZER_LOCK() pthread_mutex_lock(&incr_lock)
+# define FINALIZER_UNLOCK() pthread_mutex_unlock(&incr_lock)
+#elif defined(GC_WIN32_THREADS)
+ static CRITICAL_SECTION incr_cs;
+# define FINALIZER_LOCK() EnterCriticalSection(&incr_cs)
+# define FINALIZER_UNLOCK() LeaveCriticalSection(&incr_cs)
+#else
+# define FINALIZER_LOCK() (void)0
+# define FINALIZER_UNLOCK() (void)0
+#endif /* !THREADS */
+
+#include <stdarg.h>
+
+#ifdef TEST_MANUAL_VDB
+# define INIT_MANUAL_VDB_ALLOWED GC_set_manual_vdb_allowed(1)
+#elif !defined(SMALL_CONFIG)
+# define INIT_MANUAL_VDB_ALLOWED GC_set_manual_vdb_allowed(0)
+#else
+# define INIT_MANUAL_VDB_ALLOWED /* empty */
+#endif
+
+#ifdef TEST_PAGES_EXECUTABLE
+# define INIT_PAGES_EXECUTABLE GC_set_pages_executable(1)
+#else
+# define INIT_PAGES_EXECUTABLE (void)0
+#endif
+
+#define CHECK_GCLIB_VERSION \
+ if (GC_get_version() != ((GC_VERSION_MAJOR<<16) \
+ | (GC_VERSION_MINOR<<8) \
+ | GC_VERSION_MICRO)) { \
+ GC_printf("libgc version mismatch\n"); \
+ exit(1); \
+ }
+
+/* Call GC_INIT only on platforms on which we think we really need it, */
+/* so that we can test automatic initialization on the rest. */
+#if defined(TEST_EXPLICIT_GC_INIT) || defined(AIX) || defined(CYGWIN32) \
+ || defined(DARWIN) || defined(HOST_ANDROID) \
+ || (defined(MSWINCE) && !defined(GC_WINMAIN_REDIRECT))
+# define GC_OPT_INIT GC_INIT()
+#else
+# define GC_OPT_INIT /* empty */
+#endif
+
+#define INIT_FIND_LEAK \
+ if (!GC_get_find_leak()) {} else \
+ GC_printf("This test program is not designed for leak detection mode\n")
+
+#ifdef NO_CLOCK
+# define INIT_PERF_MEASUREMENT (void)0
+#else
+# define INIT_PERF_MEASUREMENT GC_start_performance_measurement()
+#endif
+
+#define GC_COND_INIT() \
+ INIT_FORK_SUPPORT; INIT_MANUAL_VDB_ALLOWED; INIT_PAGES_EXECUTABLE; \
+ GC_OPT_INIT; CHECK_GCLIB_VERSION; \
+ INIT_PRINT_STATS; INIT_FIND_LEAK; INIT_PERF_MEASUREMENT
+
+#define CHECK_OUT_OF_MEMORY(p) \
+ if ((p) == NULL) { \
+ GC_printf("Out of memory\n"); \
+ exit(1); \
+ }
+
+static void *checkOOM(void *p)
+{
+ CHECK_OUT_OF_MEMORY(p);
+ return p;
+}
+
+/* Define AO primitives for a single-threaded mode. */
+#ifndef AO_HAVE_compiler_barrier
+ /* AO_t not defined. */
+# define AO_t GC_word
+#endif
+#ifndef AO_HAVE_load_acquire
+ static AO_t AO_load_acquire(const volatile AO_t *addr)
+ {
+ AO_t result;
+
+ FINALIZER_LOCK();
+ result = *addr;
+ FINALIZER_UNLOCK();
+ return result;
+ }
+#endif
+#ifndef AO_HAVE_store_release
+ /* Not a macro as new_val argument should be evaluated before the lock. */
+ static void AO_store_release(volatile AO_t *addr, AO_t new_val)
+ {
+ FINALIZER_LOCK();
+ *addr = new_val;
+ FINALIZER_UNLOCK();
+ }
+#endif
+#ifndef AO_HAVE_fetch_and_add1
+# define AO_fetch_and_add1(p) ((*(p))++)
+ /* This is used only to update counters. */
+#endif
+
+/* Allocation Statistics. Synchronization is not strictly necessary. */
+volatile AO_t uncollectable_count = 0;
+volatile AO_t collectable_count = 0;
+volatile AO_t atomic_count = 0;
+volatile AO_t realloc_count = 0;
+
+volatile AO_t extra_count = 0; /* Amount of space wasted in cons node; */
+ /* also used in gcj_cons, mktree and */
+ /* chktree (for other purposes). */
+
+#if defined(GC_AMIGA_FASTALLOC) && defined(AMIGA)
+ EXTERN_C_BEGIN
+ void GC_amiga_free_all_mem(void);
+ EXTERN_C_END
+
+ void Amiga_Fail(void){GC_amiga_free_all_mem();abort();}
+# define FAIL Amiga_Fail()
+#ifndef NO_TYPED_TEST
+ void *GC_amiga_gctest_malloc_explicitly_typed(size_t lb, GC_descr d){
+ void *ret=GC_malloc_explicitly_typed(lb,d);
+ if(ret==NULL){
+ GC_gcollect();
+ ret=GC_malloc_explicitly_typed(lb,d);
+ if(ret==NULL){
+ GC_printf("Out of memory, (typed allocations are not directly "
+ "supported with the GC_AMIGA_FASTALLOC option.)\n");
+ FAIL;
+ }
+ }
+ return ret;
+ }
+ void *GC_amiga_gctest_calloc_explicitly_typed(size_t a,size_t lb, GC_descr d){
+ void *ret=GC_calloc_explicitly_typed(a,lb,d);
+ if(ret==NULL){
+ GC_gcollect();
+ ret=GC_calloc_explicitly_typed(a,lb,d);
+ if(ret==NULL){
+ GC_printf("Out of memory, (typed allocations are not directly "
+ "supported with the GC_AMIGA_FASTALLOC option.)\n");
+ FAIL;
+ }
+ }
+ return ret;
+ }
+# define GC_malloc_explicitly_typed(a,b) GC_amiga_gctest_malloc_explicitly_typed(a,b)
+# define GC_calloc_explicitly_typed(a,b,c) GC_amiga_gctest_calloc_explicitly_typed(a,b,c)
+#endif /* !NO_TYPED_TEST */
+
+#else /* !AMIGA_FASTALLOC */
+
+# if defined(PCR) || defined(LINT2)
+# define FAIL abort()
+# else
+# define FAIL ABORT("Test failed")
+# endif
+
+#endif /* !AMIGA_FASTALLOC */
+
+/* AT_END may be defined to exercise the interior pointer test */
+/* if the collector is configured with ALL_INTERIOR_POINTERS. */
+/* As it stands, this test should succeed with either */
+/* configuration. In the FIND_LEAK configuration, it should */
+/* find lots of leaks, since we free almost nothing. */
+
+struct SEXPR {
+ struct SEXPR * sexpr_car;
+ struct SEXPR * sexpr_cdr;
+};
+
+
+typedef struct SEXPR * sexpr;
+
+# define INT_TO_SEXPR(x) ((sexpr)(GC_word)(x))
+# define SEXPR_TO_INT(x) ((int)(GC_word)(x))
+
+# undef nil
+# define nil (INT_TO_SEXPR(0))
+# define car(x) ((x) -> sexpr_car)
+# define cdr(x) ((x) -> sexpr_cdr)
+# define is_nil(x) ((x) == nil)
+
+/* Silly implementation of Lisp cons. Intentionally wastes lots of space */
+/* to test collector. */
+# ifdef VERY_SMALL_CONFIG
+# define cons small_cons
+# else
+sexpr cons (sexpr x, sexpr y)
+{
+ sexpr r;
+ int *p;
+ unsigned my_extra = (unsigned)AO_fetch_and_add1(&extra_count) % 5000;
+
+ r = (sexpr)GC_MALLOC(sizeof(struct SEXPR) + my_extra);
+ CHECK_OUT_OF_MEMORY(r);
+ AO_fetch_and_add1(&collectable_count);
+ for (p = (int *)r;
+ (word)p < (word)r + my_extra + sizeof(struct SEXPR); p++) {
+ if (*p) {
+ GC_printf("Found nonzero at %p - allocator is broken\n",
+ (void *)p);
+ FAIL;
+ }
+ *p = (int)((13 << 12) + ((p - (int *)r) & 0xfff));
+ }
+# ifdef AT_END
+ r = (sexpr)((char *)r + (my_extra & ~7));
+# endif
+ r -> sexpr_car = x;
+ GC_PTR_STORE_AND_DIRTY(&r->sexpr_cdr, y);
+ GC_reachable_here(x);
+ return r;
+}
+# endif
+
+#include "gc_mark.h"
+
+#ifdef GC_GCJ_SUPPORT
+
+#include "gc_gcj.h"
+
+/* The following struct emulates the vtable in gcj. */
+/* This assumes the default value of MARK_DESCR_OFFSET. */
+struct fake_vtable {
+ void * dummy; /* class pointer in real gcj. */
+ GC_word descr;
+};
+
+struct fake_vtable gcj_class_struct1 = { 0, sizeof(struct SEXPR)
+ + sizeof(struct fake_vtable *) };
+ /* length based descriptor. */
+struct fake_vtable gcj_class_struct2 =
+ { 0, ((GC_word)3 << (CPP_WORDSZ - 3)) | GC_DS_BITMAP};
+ /* Bitmap based descriptor. */
+
+struct GC_ms_entry * fake_gcj_mark_proc(word * addr,
+ struct GC_ms_entry *mark_stack_ptr,
+ struct GC_ms_entry *mark_stack_limit,
+ word env )
+{
+ sexpr x;
+ if (1 == env) {
+ /* Object allocated with debug allocator. */
+ addr = (word *)GC_USR_PTR_FROM_BASE(addr);
+ }
+ x = (sexpr)(addr + 1); /* Skip the vtable pointer. */
+ mark_stack_ptr = GC_MARK_AND_PUSH(
+ (void *)(x -> sexpr_cdr), mark_stack_ptr,
+ mark_stack_limit, (void * *)&(x -> sexpr_cdr));
+ mark_stack_ptr = GC_MARK_AND_PUSH(
+ (void *)(x -> sexpr_car), mark_stack_ptr,
+ mark_stack_limit, (void * *)&(x -> sexpr_car));
+ return(mark_stack_ptr);
+}
+
+#endif /* GC_GCJ_SUPPORT */
+
+
+sexpr small_cons (sexpr x, sexpr y)
+{
+ sexpr r = GC_NEW(struct SEXPR);
+
+ CHECK_OUT_OF_MEMORY(r);
+ AO_fetch_and_add1(&collectable_count);
+ r -> sexpr_car = x;
+ GC_PTR_STORE_AND_DIRTY(&r->sexpr_cdr, y);
+ GC_reachable_here(x);
+ return r;
+}
+
+#ifdef NO_CONS_ATOMIC_LEAF
+# define small_cons_leaf(x) small_cons(INT_TO_SEXPR(x), nil)
+#else
+ sexpr small_cons_leaf(int x)
+ {
+ sexpr r = (sexpr)GC_MALLOC_ATOMIC(sizeof(struct SEXPR));
+
+ CHECK_OUT_OF_MEMORY(r);
+ AO_fetch_and_add1(&atomic_count);
+ r -> sexpr_car = INT_TO_SEXPR(x);
+ r -> sexpr_cdr = nil;
+ return r;
+ }
+#endif
+
+sexpr small_cons_uncollectable (sexpr x, sexpr y)
+{
+ sexpr r = (sexpr)GC_MALLOC_UNCOLLECTABLE(sizeof(struct SEXPR));
+
+ CHECK_OUT_OF_MEMORY(r);
+ AO_fetch_and_add1(&uncollectable_count);
+ r -> sexpr_cdr = (sexpr)(~(GC_word)y);
+ GC_PTR_STORE_AND_DIRTY(&r->sexpr_car, x);
+ return r;
+}
+
+#ifdef GC_GCJ_SUPPORT
+ sexpr gcj_cons(sexpr x, sexpr y)
+ {
+ sexpr result;
+ GC_word * r = (GC_word *)GC_GCJ_MALLOC(
+ sizeof(struct SEXPR) + sizeof(struct fake_vtable*),
+ (AO_fetch_and_add1(&extra_count) & 1) != 0
+ ? &gcj_class_struct1
+ : &gcj_class_struct2);
+
+ CHECK_OUT_OF_MEMORY(r);
+ AO_fetch_and_add1(&collectable_count);
+ result = (sexpr)(r + 1);
+ result -> sexpr_car = x;
+ GC_PTR_STORE_AND_DIRTY(&result->sexpr_cdr, y);
+ GC_reachable_here(x);
+ return result;
+ }
+#endif /* GC_GCJ_SUPPORT */
+
+/* Return reverse(x) concatenated with y */
+sexpr reverse1(sexpr x, sexpr y)
+{
+ if (is_nil(x)) {
+ return(y);
+ } else {
+ return( reverse1(cdr(x), cons(car(x), y)) );
+ }
+}
+
+sexpr reverse(sexpr x)
+{
+# ifdef TEST_WITH_SYSTEM_MALLOC
+ GC_noop1(GC_HIDE_POINTER(checkOOM(malloc(100000))));
+# endif
+ return( reverse1(x, nil) );
+}
+
+sexpr ints(int low, int up)
+{
+ if (low > up) {
+ return(nil);
+ } else {
+ return small_cons(small_cons_leaf(low), ints(low + 1, up));
+ }
+}
+
+#ifdef GC_GCJ_SUPPORT
+/* Return reverse(x) concatenated with y */
+sexpr gcj_reverse1(sexpr x, sexpr y)
+{
+ if (is_nil(x)) {
+ return(y);
+ } else {
+ return( gcj_reverse1(cdr(x), gcj_cons(car(x), y)) );
+ }
+}
+
+sexpr gcj_reverse(sexpr x)
+{
+ return( gcj_reverse1(x, nil) );
+}
+
+sexpr gcj_ints(int low, int up)
+{
+ if (low > up) {
+ return(nil);
+ } else {
+ return(gcj_cons(gcj_cons(INT_TO_SEXPR(low), nil), gcj_ints(low+1, up)));
+ }
+}
+#endif /* GC_GCJ_SUPPORT */
+
+/* To check uncollectible allocation we build lists with disguised cdr */
+/* pointers, and make sure they don't go away. */
+sexpr uncollectable_ints(int low, int up)
+{
+ if (low > up) {
+ return(nil);
+ } else {
+ return(small_cons_uncollectable(small_cons_leaf(low),
+ uncollectable_ints(low+1, up)));
+ }
+}
+
+void check_ints(sexpr list, int low, int up)
+{
+ if (is_nil(list)) {
+ GC_printf("list is nil\n");
+ FAIL;
+ }
+ if (SEXPR_TO_INT(car(car(list))) != low) {
+ GC_printf(
+ "List reversal produced incorrect list - collector is broken\n");
+ FAIL;
+ }
+ if (low == up) {
+ if (cdr(list) != nil) {
+ GC_printf("List too long - collector is broken\n");
+ FAIL;
+ }
+ } else {
+ check_ints(cdr(list), low+1, up);
+ }
+}
+
+# define UNCOLLECTABLE_CDR(x) (sexpr)(~(GC_word)(cdr(x)))
+
+void check_uncollectable_ints(sexpr list, int low, int up)
+{
+ if (SEXPR_TO_INT(car(car(list))) != low) {
+ GC_printf("Uncollectable list corrupted - collector is broken\n");
+ FAIL;
+ }
+ if (low == up) {
+ if (UNCOLLECTABLE_CDR(list) != nil) {
+ GC_printf("Uncollectable list too long - collector is broken\n");
+ FAIL;
+ }
+ } else {
+ check_uncollectable_ints(UNCOLLECTABLE_CDR(list), low+1, up);
+ }
+}
+
+/* Not used, but useful for debugging: */
+void print_int_list(sexpr x)
+{
+ if (is_nil(x)) {
+ GC_printf("NIL\n");
+ } else {
+ GC_printf("(%d)", SEXPR_TO_INT(car(car(x))));
+ if (!is_nil(cdr(x))) {
+ GC_printf(", ");
+ print_int_list(cdr(x));
+ } else {
+ GC_printf("\n");
+ }
+ }
+}
+
+/* ditto: */
+void check_marks_int_list(sexpr x)
+{
+ if (!GC_is_marked(x))
+ GC_printf("[unm:%p]", (void *)x);
+ else
+ GC_printf("[mkd:%p]", (void *)x);
+ if (is_nil(x)) {
+ GC_printf("NIL\n");
+ } else {
+ if (!GC_is_marked(car(x)))
+ GC_printf("[unm car:%p]", (void *)car(x));
+ GC_printf("(%d)", SEXPR_TO_INT(car(car(x))));
+ if (!is_nil(cdr(x))) {
+ GC_printf(", ");
+ check_marks_int_list(cdr(x));
+ } else {
+ GC_printf("\n");
+ }
+ }
+}
+
+/*
+ * A tiny list reversal test to check thread creation.
+ */
+#ifdef THREADS
+
+# ifdef VERY_SMALL_CONFIG
+# define TINY_REVERSE_UPPER_VALUE 4
+# else
+# define TINY_REVERSE_UPPER_VALUE 10
+# endif
+
+# if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS)
+ DWORD __stdcall tiny_reverse_test(void * arg GC_ATTR_UNUSED)
+# else
+ void * tiny_reverse_test(void * arg GC_ATTR_UNUSED)
+# endif
+{
+ int i;
+ for (i = 0; i < 5; ++i) {
+ check_ints(reverse(reverse(ints(1, TINY_REVERSE_UPPER_VALUE))),
+ 1, TINY_REVERSE_UPPER_VALUE);
+ }
+# if defined(GC_ENABLE_SUSPEND_THREAD)
+ /* Force collection from a thread. */
+ GC_gcollect();
+# endif
+ return 0;
+}
+
+# if defined(GC_PTHREADS)
+# if defined(GC_ENABLE_SUSPEND_THREAD)
+# include "javaxfc.h"
+# endif
+
+ void fork_a_thread(void)
+ {
+ pthread_t t;
+ int code;
+
+ code = pthread_create(&t, NULL, tiny_reverse_test, 0);
+ if (code != 0) {
+ GC_printf("Small thread creation failed %d\n", code);
+ FAIL;
+ }
+# if defined(GC_ENABLE_SUSPEND_THREAD) && !defined(GC_DARWIN_THREADS) \
+ && !defined(GC_OPENBSD_UTHREADS) && !defined(GC_WIN32_THREADS) \
+ && !defined(NACL) && !defined(GC_OSF1_THREADS)
+ if (GC_is_thread_suspended(t)) {
+ GC_printf("Running thread should be not suspended\n");
+ FAIL;
+ }
+ /* Thread could be running or already terminated (but not joined). */
+ GC_suspend_thread(t);
+ if (!GC_is_thread_suspended(t)) {
+ GC_printf("Thread expected to be suspended\n");
+ FAIL;
+ }
+ GC_suspend_thread(t); /* should be no-op */
+ GC_resume_thread(t);
+ if (GC_is_thread_suspended(t)) {
+ GC_printf("Resumed thread should be not suspended\n");
+ FAIL;
+ }
+ GC_resume_thread(t); /* should be no-op */
+# endif
+ if ((code = pthread_join(t, 0)) != 0) {
+ GC_printf("Small thread join failed %d\n", code);
+ FAIL;
+ }
+ }
+
+# elif defined(GC_WIN32_THREADS)
+ void fork_a_thread(void)
+ {
+ DWORD thread_id;
+ HANDLE h;
+ h = CreateThread((SECURITY_ATTRIBUTES *)NULL, (word)0,
+ tiny_reverse_test, NULL, (DWORD)0, &thread_id);
+ /* Explicitly specify types of the */
+ /* arguments to test the prototype. */
+ if (h == (HANDLE)NULL) {
+ GC_printf("Small thread creation failed, errcode= %d\n",
+ (int)GetLastError());
+ FAIL;
+ }
+ if (WaitForSingleObject(h, INFINITE) != WAIT_OBJECT_0) {
+ GC_printf("Small thread wait failed, errcode= %d\n",
+ (int)GetLastError());
+ FAIL;
+ }
+ }
+
+# endif
+
+#endif
+
+void test_generic_malloc_or_special(void *p) {
+ size_t size;
+ int kind;
+ void *p2;
+
+ CHECK_OUT_OF_MEMORY(p);
+ kind = GC_get_kind_and_size(p, &size);
+ if (size != GC_size(p)) {
+ GC_printf("GC_get_kind_and_size returned size not matching GC_size\n");
+ FAIL;
+ }
+ p2 = GC_GENERIC_OR_SPECIAL_MALLOC(10, kind);
+ CHECK_OUT_OF_MEMORY(p2);
+ if (GC_get_kind_and_size(p2, NULL) != kind) {
+ GC_printf("GC_generic_or_special_malloc:"
+ " unexpected kind of returned object\n");
+ FAIL;
+ }
+ GC_FREE(p2);
+}
+
+/* Try to force a to be strangely aligned */
+volatile struct A_s {
+ char dummy;
+ AO_t aa;
+} A;
+#define a_set(p) AO_store_release(&A.aa, (AO_t)(p))
+#define a_get() (sexpr)AO_load_acquire(&A.aa)
+
+/*
+ * Repeatedly reverse lists built out of very different sized cons cells.
+ * Check that we didn't lose anything.
+ */
+void *GC_CALLBACK reverse_test_inner(void *data)
+{
+ int i;
+ sexpr b;
+ sexpr c;
+ sexpr d;
+ sexpr e;
+ sexpr *f, *g, *h;
+
+ if (data == 0) {
+ /* This stack frame is not guaranteed to be scanned. */
+ return GC_call_with_gc_active(reverse_test_inner, (void*)(word)1);
+ }
+
+# ifndef BIG
+# if defined(MACOS) \
+ || (defined(UNIX_LIKE) && defined(NO_GETCONTEXT)) /* e.g. musl */
+ /* Assume 128 KB stacks at least. */
+# if defined(__s390x__)
+# define BIG 600
+# else
+# define BIG 1000
+# endif
+# elif defined(PCR)
+ /* PCR default stack is 100 KB. Stack frames are up to 120 bytes. */
+# define BIG 700
+# elif defined(MSWINCE) || defined(RTEMS)
+ /* WinCE only allows 64 KB stacks. */
+# define BIG 500
+# elif defined(EMSCRIPTEN) || defined(OSF1)
+ /* Wasm reports "Maximum call stack size exceeded" error otherwise. */
+ /* OSF has limited stack space by default, and large frames. */
+# define BIG 200
+# elif defined(__MACH__) && defined(__ppc64__)
+# define BIG 2500
+# else
+# define BIG 4500
+# endif
+# endif
+
+ a_set(ints(1, 49));
+ b = ints(1, 50);
+ c = ints(1, BIG);
+ d = uncollectable_ints(1, 100);
+ test_generic_malloc_or_special(d);
+ e = uncollectable_ints(1, 1);
+ /* Check that realloc updates object descriptors correctly */
+ AO_fetch_and_add1(&collectable_count);
+ f = (sexpr *)checkOOM(GC_MALLOC(4 * sizeof(sexpr)));
+ f = (sexpr *)GC_REALLOC((void *)f, 6 * sizeof(sexpr));
+ CHECK_OUT_OF_MEMORY(f);
+ AO_fetch_and_add1(&realloc_count);
+ GC_PTR_STORE_AND_DIRTY(f + 5, ints(1, 17));
+ AO_fetch_and_add1(&collectable_count);
+ g = (sexpr *)GC_MALLOC(513 * sizeof(sexpr));
+ test_generic_malloc_or_special(g);
+ g = (sexpr *)GC_REALLOC((void *)g, 800 * sizeof(sexpr));
+ CHECK_OUT_OF_MEMORY(g);
+ AO_fetch_and_add1(&realloc_count);
+ GC_PTR_STORE_AND_DIRTY(g + 799, ints(1, 18));
+ AO_fetch_and_add1(&collectable_count);
+ h = (sexpr *)checkOOM(GC_MALLOC(1025 * sizeof(sexpr)));
+ h = (sexpr *)GC_REALLOC((void *)h, 2000 * sizeof(sexpr));
+ CHECK_OUT_OF_MEMORY(h);
+ AO_fetch_and_add1(&realloc_count);
+# ifdef GC_GCJ_SUPPORT
+ GC_PTR_STORE_AND_DIRTY(h + 1999, gcj_ints(1, 200));
+ for (i = 0; i < 51; ++i) {
+ GC_PTR_STORE_AND_DIRTY(h + 1999, gcj_reverse(h[1999]));
+ }
+ /* Leave it as the reversed list for now. */
+# else
+ GC_PTR_STORE_AND_DIRTY(h + 1999, ints(1, 200));
+# endif
+ /* Try to force some collections and reuse of small list elements */
+ for (i = 0; i < 10; i++) {
+ (void)ints(1, BIG);
+ }
+ /* Superficially test interior pointer recognition on stack */
+ c = (sexpr)((char *)c + sizeof(char *));
+ d = (sexpr)((char *)d + sizeof(char *));
+
+ GC_FREE((void *)e);
+
+ check_ints(b,1,50);
+# ifndef EMSCRIPTEN
+ check_ints(a_get(),1,49);
+# else
+ /* FIXME: gctest fails unless check_ints(a_get(), ...) are skipped. */
+# endif
+ for (i = 0; i < 50; i++) {
+ check_ints(b,1,50);
+ b = reverse(reverse(b));
+ }
+ check_ints(b,1,50);
+# ifndef EMSCRIPTEN
+ check_ints(a_get(),1,49);
+# endif
+ for (i = 0; i < 10 * (NTHREADS+1); i++) {
+# if (defined(GC_PTHREADS) || defined(GC_WIN32_THREADS)) \
+ && (NTHREADS > 0)
+ if (i % 10 == 0) fork_a_thread();
+# endif
+ /* This maintains the invariant that a always points to a list */
+ /* of 49 integers. Thus, this is thread safe without locks, */
+ /* assuming acquire/release barriers in a_get/set() and atomic */
+ /* pointer assignments (otherwise, e.g., check_ints() may see */
+ /* an uninitialized object returned by GC_MALLOC). */
+ a_set(reverse(reverse(a_get())));
+# if !defined(AT_END) && !defined(THREADS)
+ /* This is not thread safe, since realloc explicitly deallocates */
+ a_set(checkOOM(GC_REALLOC(a_get(), (i & 1) != 0 ? 500 : 8200)));
+ AO_fetch_and_add1(&realloc_count);
+# endif
+ }
+# ifndef EMSCRIPTEN
+ check_ints(a_get(),1,49);
+# endif
+ check_ints(b,1,50);
+
+ /* Restore c and d values. */
+ c = (sexpr)((char *)c - sizeof(char *));
+ d = (sexpr)((char *)d - sizeof(char *));
+
+ check_ints(c,1,BIG);
+ check_uncollectable_ints(d, 1, 100);
+ check_ints(f[5], 1,17);
+ check_ints(g[799], 1,18);
+# ifdef GC_GCJ_SUPPORT
+ GC_PTR_STORE_AND_DIRTY(h + 1999, gcj_reverse(h[1999]));
+# endif
+ check_ints(h[1999], 1,200);
+# ifndef THREADS
+ a_set(NULL);
+# endif
+ *(sexpr volatile *)&b = 0;
+ *(sexpr volatile *)&c = 0;
+ return 0;
+}
+
+void reverse_test(void)
+{
+ /* Test GC_do_blocking/GC_call_with_gc_active. */
+ (void)GC_do_blocking(reverse_test_inner, 0);
+}
+
+/*
+ * The rest of this builds balanced binary trees, checks that they don't
+ * disappear, and tests finalization.
+ */
+typedef struct treenode {
+ int level;
+ struct treenode * lchild;
+ struct treenode * rchild;
+} tn;
+
+#ifndef GC_NO_FINALIZATION
+ int finalizable_count = 0;
+#endif
+
+int finalized_count = 0;
+int dropped_something = 0;
+
+void GC_CALLBACK finalizer(void * obj, void * client_data)
+{
+ tn * t = (tn *)obj;
+
+ FINALIZER_LOCK();
+ if ((int)(GC_word)client_data != t -> level) {
+ GC_printf("Wrong finalization data - collector is broken\n");
+ FAIL;
+ }
+ finalized_count++;
+ t -> level = -1; /* detect duplicate finalization immediately */
+ FINALIZER_UNLOCK();
+}
+
+# define MAX_FINALIZED ((NTHREADS+1)*4000)
+
+# if !defined(MACOS)
+ GC_FAR GC_word live_indicators[MAX_FINALIZED] = {0};
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_FAR void *live_long_refs[MAX_FINALIZED] = { NULL };
+# endif
+#else
+ /* Too big for THINK_C. have to allocate it dynamically. */
+ GC_word *live_indicators = 0;
+# ifndef GC_LONG_REFS_NOT_NEEDED
+# define GC_LONG_REFS_NOT_NEEDED
+# endif
+#endif
+
+int live_indicators_count = 0;
+
+tn * mktree(int n)
+{
+ tn * result = GC_NEW(tn);
+ tn * left, * right;
+
+ CHECK_OUT_OF_MEMORY(result);
+ AO_fetch_and_add1(&collectable_count);
+# if defined(MACOS)
+ /* get around static data limitations. */
+ if (!live_indicators) {
+ live_indicators =
+ (GC_word*)NewPtrClear(MAX_FINALIZED * sizeof(GC_word));
+ CHECK_OUT_OF_MEMORY(live_indicators);
+ }
+# endif
+ if (n == 0) return(0);
+ result -> level = n;
+ result -> lchild = left = mktree(n - 1);
+ result -> rchild = right = mktree(n - 1);
+ if (AO_fetch_and_add1(&extra_count) % 17 == 0 && n >= 2) {
+ tn * tmp;
+
+ CHECK_OUT_OF_MEMORY(left);
+ tmp = left -> rchild;
+ CHECK_OUT_OF_MEMORY(right);
+ GC_PTR_STORE_AND_DIRTY(&left->rchild, right->lchild);
+ GC_PTR_STORE_AND_DIRTY(&right->lchild, tmp);
+ }
+ if (AO_fetch_and_add1(&extra_count) % 119 == 0) {
+# ifndef GC_NO_FINALIZATION
+ int my_index;
+ void **new_link = GC_NEW(void *);
+
+ CHECK_OUT_OF_MEMORY(new_link);
+ AO_fetch_and_add1(&collectable_count);
+# endif
+ {
+ FINALIZER_LOCK();
+ /* Losing a count here causes erroneous report of failure. */
+# ifndef GC_NO_FINALIZATION
+ finalizable_count++;
+ my_index = live_indicators_count++;
+# endif
+ FINALIZER_UNLOCK();
+ }
+
+# ifndef GC_NO_FINALIZATION
+ if (!GC_get_find_leak()) {
+ GC_REGISTER_FINALIZER((void *)result, finalizer, (void *)(GC_word)n,
+ (GC_finalization_proc *)0, (void * *)0);
+ if (my_index >= MAX_FINALIZED) {
+ GC_printf("live_indicators overflowed\n");
+ FAIL;
+ }
+ live_indicators[my_index] = 13;
+ if (GC_GENERAL_REGISTER_DISAPPEARING_LINK(
+ (void * *)(&(live_indicators[my_index])), result) != 0) {
+ GC_printf("GC_general_register_disappearing_link failed\n");
+ FAIL;
+ }
+ if (GC_move_disappearing_link((void **)(&(live_indicators[my_index])),
+ (void **)(&(live_indicators[my_index]))) != GC_SUCCESS) {
+ GC_printf("GC_move_disappearing_link(link,link) failed\n");
+ FAIL;
+ }
+ *new_link = (void *)live_indicators[my_index];
+ if (GC_move_disappearing_link((void **)(&(live_indicators[my_index])),
+ new_link) != GC_SUCCESS) {
+ GC_printf("GC_move_disappearing_link(new_link) failed\n");
+ FAIL;
+ }
+ /* Note: if other thread is performing fork at this moment, */
+ /* then the stack of the current thread is dropped (together */
+ /* with new_link variable) in the child process, and */
+ /* GC_dl_hashtbl entry with the link equal to new_link will be */
+ /* removed when a collection occurs (as expected). */
+ if (GC_unregister_disappearing_link(new_link) == 0) {
+ GC_printf("GC_unregister_disappearing_link failed\n");
+ FAIL;
+ }
+ if (GC_move_disappearing_link((void **)(&(live_indicators[my_index])),
+ new_link) != GC_NOT_FOUND) {
+ GC_printf("GC_move_disappearing_link(new_link) failed 2\n");
+ FAIL;
+ }
+ if (GC_GENERAL_REGISTER_DISAPPEARING_LINK(
+ (void * *)(&(live_indicators[my_index])), result) != 0) {
+ GC_printf("GC_general_register_disappearing_link failed 2\n");
+ FAIL;
+ }
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ if (GC_REGISTER_LONG_LINK(&live_long_refs[my_index], result) != 0) {
+ GC_printf("GC_register_long_link failed\n");
+ FAIL;
+ }
+ if (GC_move_long_link(&live_long_refs[my_index],
+ &live_long_refs[my_index]) != GC_SUCCESS) {
+ GC_printf("GC_move_long_link(link,link) failed\n");
+ FAIL;
+ }
+ *new_link = live_long_refs[my_index];
+ if (GC_move_long_link(&live_long_refs[my_index],
+ new_link) != GC_SUCCESS) {
+ GC_printf("GC_move_long_link(new_link) failed\n");
+ FAIL;
+ }
+ if (GC_unregister_long_link(new_link) == 0) {
+ GC_printf("GC_unregister_long_link failed\n");
+ FAIL;
+ }
+ if (GC_move_long_link(&live_long_refs[my_index],
+ new_link) != GC_NOT_FOUND) {
+ GC_printf("GC_move_long_link(new_link) failed 2\n");
+ FAIL;
+ }
+ if (GC_REGISTER_LONG_LINK(&live_long_refs[my_index], result) != 0) {
+ GC_printf("GC_register_long_link failed 2\n");
+ FAIL;
+ }
+# endif
+ }
+# endif
+ GC_reachable_here(result);
+ }
+ GC_END_STUBBORN_CHANGE(result);
+ GC_reachable_here(left);
+ GC_reachable_here(right);
+ return(result);
+}
+
+void chktree(tn *t, int n)
+{
+ if (0 == n) {
+ if (NULL == t) /* is a leaf? */
+ return;
+ GC_printf("Clobbered a leaf - collector is broken\n");
+ FAIL;
+ }
+ if (t -> level != n) {
+ GC_printf("Lost a node at level %d - collector is broken\n", n);
+ FAIL;
+ }
+ if (AO_fetch_and_add1(&extra_count) % 373 == 0) {
+ (void)checkOOM(GC_MALLOC(
+ (unsigned)AO_fetch_and_add1(&extra_count) % 5001));
+ AO_fetch_and_add1(&collectable_count);
+ }
+ chktree(t -> lchild, n-1);
+ if (AO_fetch_and_add1(&extra_count) % 73 == 0) {
+ (void)checkOOM(GC_MALLOC(
+ (unsigned)AO_fetch_and_add1(&extra_count) % 373));
+ AO_fetch_and_add1(&collectable_count);
+ }
+ chktree(t -> rchild, n-1);
+}
+
+#ifndef VERY_SMALL_CONFIG
+# if defined(GC_PTHREADS)
+ pthread_key_t fl_key;
+# endif
+
+ void * alloc8bytes(void)
+ {
+# ifndef GC_PTHREADS
+ AO_fetch_and_add1(&atomic_count);
+ return GC_MALLOC_ATOMIC(8);
+# elif defined(SMALL_CONFIG) || defined(GC_DEBUG)
+ AO_fetch_and_add1(&collectable_count);
+ return GC_MALLOC(8);
+# else
+ void ** my_free_list_ptr;
+ void * my_free_list;
+ void * next;
+
+ my_free_list_ptr = (void **)pthread_getspecific(fl_key);
+ if (NULL == my_free_list_ptr) {
+ my_free_list_ptr = GC_NEW_UNCOLLECTABLE(void *);
+ if (NULL == my_free_list_ptr) return NULL;
+ AO_fetch_and_add1(&uncollectable_count);
+ if (pthread_setspecific(fl_key, my_free_list_ptr) != 0) {
+ GC_printf("pthread_setspecific failed\n");
+ FAIL;
+ }
+ }
+ my_free_list = *my_free_list_ptr;
+ if (NULL == my_free_list) {
+ my_free_list = GC_malloc_many(8);
+ if (NULL == my_free_list) return NULL;
+ }
+ next = GC_NEXT(my_free_list);
+ GC_PTR_STORE_AND_DIRTY(my_free_list_ptr, next);
+ GC_NEXT(my_free_list) = NULL;
+ AO_fetch_and_add1(&collectable_count);
+ return my_free_list;
+# endif
+ }
+
+ void alloc_small(int n)
+ {
+ int i;
+
+ for (i = 0; i < n; i += 8) {
+ void *p = alloc8bytes();
+
+ CHECK_OUT_OF_MEMORY(p);
+ }
+ }
+#endif /* !VERY_SMALL_CONFIG */
+
+#include "gc_inline.h"
+
+void test_tinyfl(void)
+{
+ void *results[3];
+ void *tfls[3][GC_TINY_FREELISTS];
+
+# ifndef DONT_ADD_BYTE_AT_END
+ if (GC_get_all_interior_pointers()) return; /* skip */
+# endif
+ BZERO(tfls, sizeof(tfls));
+ /* TODO: Improve testing of FAST_MALLOC functionality. */
+ GC_MALLOC_WORDS(results[0], 11, tfls[0]);
+ CHECK_OUT_OF_MEMORY(results[0]);
+ GC_MALLOC_ATOMIC_WORDS(results[1], 20, tfls[1]);
+ CHECK_OUT_OF_MEMORY(results[1]);
+ GC_CONS(results[2], results[0], results[1], tfls[2]);
+ CHECK_OUT_OF_MEMORY(results[2]);
+}
+
+# if defined(THREADS) && defined(GC_DEBUG)
+# ifdef VERY_SMALL_CONFIG
+# define TREE_HEIGHT 12
+# else
+# define TREE_HEIGHT 15
+# endif
+# else
+# ifdef VERY_SMALL_CONFIG
+# define TREE_HEIGHT 13
+# else
+# define TREE_HEIGHT 16
+# endif
+# endif
+void tree_test(void)
+{
+ tn * root;
+ int i;
+
+ root = mktree(TREE_HEIGHT);
+# ifndef VERY_SMALL_CONFIG
+ alloc_small(5000000);
+# endif
+ chktree(root, TREE_HEIGHT);
+ FINALIZER_LOCK();
+ if (finalized_count && !dropped_something) {
+ GC_printf("Premature finalization - collector is broken\n");
+ FAIL;
+ }
+ dropped_something = 1;
+ FINALIZER_UNLOCK();
+ GC_reachable_here(root); /* Root needs to remain live until */
+ /* dropped_something is set. */
+ root = mktree(TREE_HEIGHT);
+ chktree(root, TREE_HEIGHT);
+ for (i = TREE_HEIGHT; i >= 0; i--) {
+ root = mktree(i);
+ chktree(root, i);
+ }
+# ifndef VERY_SMALL_CONFIG
+ alloc_small(5000000);
+# endif
+}
+
+unsigned n_tests = 0;
+
+#ifndef NO_TYPED_TEST
+const GC_word bm_huge[320 / CPP_WORDSZ] = {
+# if CPP_WORDSZ == 32
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+# endif
+ (GC_word)((GC_signed_word)-1),
+ (GC_word)((GC_signed_word)-1),
+ (GC_word)((GC_signed_word)-1),
+ (GC_word)((GC_signed_word)-1),
+ ((GC_word)((GC_signed_word)-1)) >> 8 /* highest byte is zero */
+};
+
+/* A very simple test of explicitly typed allocation */
+void typed_test(void)
+{
+ GC_word * old, * newP;
+ GC_word bm3[1] = {0};
+ GC_word bm2[1] = {0};
+ GC_word bm_large[1] = { 0xf7ff7fff };
+ GC_descr d1;
+ GC_descr d2;
+ GC_descr d3 = GC_make_descriptor(bm_large, 32);
+ GC_descr d4 = GC_make_descriptor(bm_huge, 320);
+ GC_word * x = (GC_word *)checkOOM(GC_MALLOC_EXPLICITLY_TYPED(
+ 320 * sizeof(GC_word) + 123, d4));
+ int i;
+
+ AO_fetch_and_add1(&collectable_count);
+ (void)GC_make_descriptor(bm_large, 32);
+ if (GC_get_bit(bm_huge, 32) == 0 || GC_get_bit(bm_huge, 311) == 0
+ || GC_get_bit(bm_huge, 319) != 0) {
+ GC_printf("Bad GC_get_bit() or bm_huge initialization\n");
+ FAIL;
+ }
+ GC_set_bit(bm3, 0);
+ GC_set_bit(bm3, 1);
+ d1 = GC_make_descriptor(bm3, 2);
+ GC_set_bit(bm2, 1);
+ d2 = GC_make_descriptor(bm2, 2);
+ old = 0;
+ for (i = 0; i < 4000; i++) {
+ newP = (GC_word *)GC_MALLOC_EXPLICITLY_TYPED(4 * sizeof(GC_word), d1);
+ CHECK_OUT_OF_MEMORY(newP);
+ AO_fetch_and_add1(&collectable_count);
+ if (newP[0] != 0 || newP[1] != 0) {
+ GC_printf("Bad initialization by GC_malloc_explicitly_typed\n");
+ FAIL;
+ }
+ newP[0] = 17;
+ GC_PTR_STORE_AND_DIRTY(newP + 1, old);
+ old = newP;
+ AO_fetch_and_add1(&collectable_count);
+ newP = (GC_word *)GC_MALLOC_EXPLICITLY_TYPED(4 * sizeof(GC_word), d2);
+ CHECK_OUT_OF_MEMORY(newP);
+ newP[0] = 17;
+ GC_PTR_STORE_AND_DIRTY(newP + 1, old);
+ old = newP;
+ AO_fetch_and_add1(&collectable_count);
+ newP = (GC_word*)GC_MALLOC_EXPLICITLY_TYPED(33 * sizeof(GC_word), d3);
+ CHECK_OUT_OF_MEMORY(newP);
+ newP[0] = 17;
+ GC_PTR_STORE_AND_DIRTY(newP + 1, old);
+ old = newP;
+ AO_fetch_and_add1(&collectable_count);
+ newP = (GC_word *)GC_CALLOC_EXPLICITLY_TYPED(4, 2 * sizeof(GC_word),
+ d1);
+ CHECK_OUT_OF_MEMORY(newP);
+ newP[0] = 17;
+ GC_PTR_STORE_AND_DIRTY(newP + 1, old);
+ old = newP;
+ AO_fetch_and_add1(&collectable_count);
+ if (i & 0xff) {
+ newP = (GC_word *)GC_CALLOC_EXPLICITLY_TYPED(7, 3 * sizeof(GC_word),
+ d2);
+ } else {
+ newP = (GC_word *)GC_CALLOC_EXPLICITLY_TYPED(1001,
+ 3 * sizeof(GC_word),
+ d2);
+ if (newP != NULL && (newP[0] != 0 || newP[1] != 0)) {
+ GC_printf("Bad initialization by GC_malloc_explicitly_typed\n");
+ FAIL;
+ }
+ }
+ CHECK_OUT_OF_MEMORY(newP);
+ newP[0] = 17;
+ GC_PTR_STORE_AND_DIRTY(newP + 1, old);
+ old = newP;
+ }
+ for (i = 0; i < 20000; i++) {
+ if (newP[0] != 17) {
+ GC_printf("Typed alloc failed at %d\n", i);
+ FAIL;
+ }
+ newP[0] = 0;
+ old = newP;
+ newP = (GC_word *)old[1];
+ }
+ GC_gcollect();
+ GC_noop1((word)x);
+}
+#endif /* !NO_TYPED_TEST */
+
+#ifdef DBG_HDRS_ALL
+# define set_print_procs() (void)(A.dummy = 17)
+#else
+ volatile AO_t fail_count = 0;
+
+ void GC_CALLBACK fail_proc1(void *x GC_ATTR_UNUSED)
+ {
+ AO_fetch_and_add1(&fail_count);
+ }
+
+ void set_print_procs(void)
+ {
+ /* Set these global variables just once to avoid TSan false positives. */
+ A.dummy = 17;
+ GC_is_valid_displacement_print_proc = fail_proc1;
+ GC_is_visible_print_proc = fail_proc1;
+ }
+
+# ifdef THREADS
+# define TEST_FAIL_COUNT(n) 1
+# else
+# define TEST_FAIL_COUNT(n) (fail_count >= (AO_t)(n))
+# endif
+#endif /* !DBG_HDRS_ALL */
+
+static void uniq(void *p, ...) {
+ va_list a;
+ void *q[100];
+ int n = 0, i, j;
+ q[n++] = p;
+ va_start(a,p);
+ for (;(q[n] = va_arg(a,void *)) != NULL;n++) ;
+ va_end(a);
+ for (i=0; i<n; i++)
+ for (j=0; j<i; j++)
+ if (q[i] == q[j]) {
+ GC_printf(
+ "Apparently failed to mark from some function arguments.\n"
+ "Perhaps GC_push_regs was configured incorrectly?\n"
+ );
+ FAIL;
+ }
+}
+
+#include "private/gc_alloc_ptrs.h"
+
+void * GC_CALLBACK inc_int_counter(void *pcounter)
+{
+ ++(*(int *)pcounter);
+
+ /* Dummy checking of API functions while GC lock is held. */
+ GC_incr_bytes_allocd(0);
+ GC_incr_bytes_freed(0);
+
+ return NULL;
+}
+
+struct thr_hndl_sb_s {
+ void *gc_thread_handle;
+ struct GC_stack_base sb;
+};
+
+void * GC_CALLBACK set_stackbottom(void *cd)
+{
+ GC_set_stackbottom(((struct thr_hndl_sb_s *)cd)->gc_thread_handle,
+ &((struct thr_hndl_sb_s *)cd)->sb);
+ return NULL;
+}
+
+#ifndef MIN_WORDS
+# define MIN_WORDS 2
+#endif
+
+void run_one_test(void)
+{
+# ifndef DBG_HDRS_ALL
+ char *x, *y;
+ char **z;
+# endif
+# ifndef NO_CLOCK
+ CLOCK_TYPE start_time;
+ CLOCK_TYPE reverse_time;
+ unsigned long time_diff;
+# endif
+# ifndef NO_TEST_HANDLE_FORK
+ pid_t pid;
+ int wstatus;
+# endif
+ struct thr_hndl_sb_s thr_hndl_sb;
+
+ GC_FREE(0);
+# ifdef THREADS
+ if (!GC_thread_is_registered() && GC_is_init_called()) {
+ GC_printf("Current thread is not registered with GC\n");
+ FAIL;
+ }
+# endif
+ test_tinyfl();
+# ifndef DBG_HDRS_ALL
+ AO_fetch_and_add1(&collectable_count);
+ x = (char*)GC_malloc(7);
+ CHECK_OUT_OF_MEMORY(x);
+ AO_fetch_and_add1(&collectable_count);
+ y = (char*)GC_malloc(7);
+ CHECK_OUT_OF_MEMORY(y);
+ if (GC_size(x) != 8 && GC_size(y) != MIN_WORDS * sizeof(GC_word)) {
+ GC_printf("GC_size produced unexpected results\n");
+ FAIL;
+ }
+ AO_fetch_and_add1(&collectable_count);
+ x = (char*)GC_malloc(15);
+ CHECK_OUT_OF_MEMORY(x);
+ if (GC_size(x) != 16) {
+ GC_printf("GC_size produced unexpected results 2\n");
+ FAIL;
+ }
+ AO_fetch_and_add1(&collectable_count);
+ x = (char*)GC_malloc(0);
+ CHECK_OUT_OF_MEMORY(x);
+ if (GC_size(x) != MIN_WORDS * sizeof(GC_word)) {
+ GC_printf("GC_malloc(0) failed: GC_size returns %lu\n",
+ (unsigned long)GC_size(x));
+ FAIL;
+ }
+ AO_fetch_and_add1(&uncollectable_count);
+ x = (char*)GC_malloc_uncollectable(0);
+ CHECK_OUT_OF_MEMORY(x);
+ if (GC_size(x) != MIN_WORDS * sizeof(GC_word)) {
+ GC_printf("GC_malloc_uncollectable(0) failed\n");
+ FAIL;
+ }
+ AO_fetch_and_add1(&collectable_count);
+ x = (char*)GC_malloc(16);
+ CHECK_OUT_OF_MEMORY(x);
+ if (GC_base(GC_PTR_ADD(x, 13)) != x) {
+ GC_printf("GC_base(heap ptr) produced incorrect result\n");
+ FAIL;
+ }
+ if (!GC_is_heap_ptr(x)) {
+ GC_printf("GC_is_heap_ptr(heap_ptr) produced incorrect result\n");
+ FAIL;
+ }
+ if (GC_is_heap_ptr(&x)) {
+ GC_printf("GC_is_heap_ptr(&local_var) produced incorrect result\n");
+ FAIL;
+ }
+ if (GC_is_heap_ptr((void *)&fail_count) || GC_is_heap_ptr(NULL)) {
+ GC_printf("GC_is_heap_ptr(&global_var) produced incorrect result\n");
+ FAIL;
+ }
+ (void)GC_PRE_INCR(x, 0);
+ (void)GC_POST_INCR(x);
+ (void)GC_POST_DECR(x);
+ if (GC_base(x) != x) {
+ GC_printf("Bad INCR/DECR result\n");
+ FAIL;
+ }
+ y = (char *)(GC_word)fail_proc1;
+# ifndef PCR
+ if (GC_base(y) != 0) {
+ GC_printf("GC_base(fn_ptr) produced incorrect result\n");
+ FAIL;
+ }
+# endif
+ if (GC_same_obj(x+5, x) != x + 5) {
+ GC_printf("GC_same_obj produced incorrect result\n");
+ FAIL;
+ }
+ if (GC_is_visible(y) != y || GC_is_visible(x) != x) {
+ GC_printf("GC_is_visible produced incorrect result\n");
+ FAIL;
+ }
+ z = (char**)GC_malloc(8);
+ CHECK_OUT_OF_MEMORY(z);
+ AO_fetch_and_add1(&collectable_count);
+ GC_PTR_STORE(z, x);
+ GC_end_stubborn_change(z);
+ if (*z != x) {
+ GC_printf("GC_PTR_STORE failed: %p != %p\n", (void *)(*z), (void *)x);
+ FAIL;
+ }
+# if !defined(IA64) && !defined(POWERPC)
+ if (!TEST_FAIL_COUNT(1)) {
+ /* On POWERPCs function pointers point to a descriptor in the */
+ /* data segment, so there should have been no failures. */
+ /* The same applies to IA64. */
+ GC_printf("GC_is_visible produced wrong failure indication\n");
+ FAIL;
+ }
+# endif
+ if (GC_is_valid_displacement(y) != y
+ || GC_is_valid_displacement(x) != x
+ || GC_is_valid_displacement(x + 3) != x + 3) {
+ GC_printf("GC_is_valid_displacement produced incorrect result\n");
+ FAIL;
+ }
+ {
+ size_t i;
+
+ (void)GC_malloc(17);
+ AO_fetch_and_add1(&collectable_count);
+ for (i = sizeof(GC_word); i < 512; i *= 2) {
+ GC_word result = (GC_word) GC_memalign(i, 17);
+ if (result % i != 0 || result == 0 || *(int *)result != 0) FAIL;
+ }
+ }
+# ifndef ALL_INTERIOR_POINTERS
+# if defined(POWERPC)
+ if (!TEST_FAIL_COUNT(1))
+# else
+ if (!TEST_FAIL_COUNT(GC_get_all_interior_pointers() ? 1 : 2))
+# endif
+ {
+ GC_printf(
+ "GC_is_valid_displacement produced wrong failure indication\n");
+ FAIL;
+ }
+# endif
+# endif /* DBG_HDRS_ALL */
+ /* Test floating point alignment */
+ {
+ double *dp = GC_NEW(double);
+ CHECK_OUT_OF_MEMORY(dp);
+ AO_fetch_and_add1(&collectable_count);
+ *dp = 1.0;
+ dp = GC_NEW(double);
+ CHECK_OUT_OF_MEMORY(dp);
+ AO_fetch_and_add1(&collectable_count);
+ *dp = 1.0;
+ }
+ /* Test size 0 allocation a bit more */
+ {
+ size_t i;
+ for (i = 0; i < 10000; ++i) {
+ (void)checkOOM(GC_MALLOC(0));
+ AO_fetch_and_add1(&collectable_count);
+ GC_FREE(checkOOM(GC_MALLOC(0)));
+ (void)checkOOM(GC_MALLOC_ATOMIC(0));
+ AO_fetch_and_add1(&atomic_count);
+ GC_FREE(checkOOM(GC_MALLOC_ATOMIC(0)));
+ test_generic_malloc_or_special(GC_malloc_atomic(1));
+ AO_fetch_and_add1(&atomic_count);
+ GC_FREE(checkOOM(GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(1)));
+ GC_FREE(checkOOM(GC_MALLOC_IGNORE_OFF_PAGE(2)));
+ }
+ }
+ thr_hndl_sb.gc_thread_handle = GC_get_my_stackbottom(&thr_hndl_sb.sb);
+# ifdef GC_GCJ_SUPPORT
+ GC_REGISTER_DISPLACEMENT(sizeof(struct fake_vtable *));
+ GC_init_gcj_malloc(0, (void *)(GC_word)fake_gcj_mark_proc);
+# endif
+ /* Make sure that fn arguments are visible to the collector. */
+ uniq(
+ GC_malloc(12), GC_malloc(12), GC_malloc(12),
+ (GC_gcollect(),GC_malloc(12)),
+ GC_malloc(12), GC_malloc(12), GC_malloc(12),
+ (GC_gcollect(),GC_malloc(12)),
+ GC_malloc(12), GC_malloc(12), GC_malloc(12),
+ (GC_gcollect(),GC_malloc(12)),
+ GC_malloc(12), GC_malloc(12), GC_malloc(12),
+ (GC_gcollect(),GC_malloc(12)),
+ GC_malloc(12), GC_malloc(12), GC_malloc(12),
+ (GC_gcollect(),GC_malloc(12)),
+ (void *)0);
+ /* GC_malloc(0) must return NULL or something we can deallocate. */
+ GC_free(checkOOM(GC_malloc(0)));
+ GC_free(checkOOM(GC_malloc_atomic(0)));
+ GC_free(checkOOM(GC_malloc(0)));
+ GC_free(checkOOM(GC_malloc_atomic(0)));
+# ifndef NO_TEST_HANDLE_FORK
+ GC_atfork_prepare();
+ pid = fork();
+ if (pid != 0) {
+ GC_atfork_parent();
+ if (pid == -1) {
+ GC_printf("Process fork failed\n");
+ FAIL;
+ }
+ if (print_stats)
+ GC_log_printf("Forked child process, pid= %ld\n", (long)pid);
+ if (waitpid(pid, &wstatus, 0) == -1) {
+ GC_printf("Wait for child process failed\n");
+ FAIL;
+ }
+ if (!WIFEXITED(wstatus) || WEXITSTATUS(wstatus) != 0) {
+ GC_printf("Child process failed, pid= %ld, status= 0x%x\n",
+ (long)pid, wstatus);
+ FAIL;
+ }
+ } else {
+ pid_t child_pid = getpid();
+
+ GC_atfork_child();
+ if (print_stats)
+ GC_log_printf("Started a child process, pid= %ld\n",
+ (long)child_pid);
+# ifdef PARALLEL_MARK
+ GC_gcollect(); /* no parallel markers */
+# endif
+ GC_start_mark_threads();
+ GC_gcollect();
+# ifdef THREADS
+ /* Skip "Premature finalization" check in the */
+ /* child process because there could be a chance */
+ /* that some other thread of the parent was */
+ /* executing mktree at the moment of fork. */
+ dropped_something = 1;
+# endif
+ tree_test();
+# if !defined(DBG_HDRS_ALL) && !defined(NO_TYPED_TEST)
+ typed_test();
+# endif
+# ifdef THREADS
+ if (print_stats)
+ GC_log_printf("Starting tiny reverse test, pid= %ld\n",
+ (long)child_pid);
+ tiny_reverse_test(0);
+ GC_gcollect();
+# endif
+ if (print_stats)
+ GC_log_printf("Finished a child process, pid= %ld\n",
+ (long)child_pid);
+ exit(0);
+ }
+# endif
+ (void)GC_call_with_alloc_lock(set_stackbottom, &thr_hndl_sb);
+
+ /* Repeated list reversal test. */
+# ifndef NO_CLOCK
+ GET_TIME(start_time);
+# endif
+ reverse_test();
+# ifndef NO_CLOCK
+ if (print_stats) {
+ GET_TIME(reverse_time);
+ time_diff = MS_TIME_DIFF(reverse_time, start_time);
+ GC_log_printf("Finished reverse_test at time %u (%p)\n",
+ (unsigned) time_diff, (void *)&start_time);
+ }
+# endif
+# if !defined(DBG_HDRS_ALL) && !defined(NO_TYPED_TEST)
+ typed_test();
+# ifndef NO_CLOCK
+ if (print_stats) {
+ CLOCK_TYPE typed_time;
+
+ GET_TIME(typed_time);
+ time_diff = MS_TIME_DIFF(typed_time, start_time);
+ GC_log_printf("Finished typed_test at time %u (%p)\n",
+ (unsigned) time_diff, (void *)&start_time);
+ }
+# endif
+# endif /* DBG_HDRS_ALL */
+ tree_test();
+# ifdef TEST_WITH_SYSTEM_MALLOC
+ free(checkOOM(calloc(1,1)));
+ free(checkOOM(realloc(NULL, 64)));
+# endif
+# ifndef NO_CLOCK
+ if (print_stats) {
+ CLOCK_TYPE tree_time;
+
+ GET_TIME(tree_time);
+ time_diff = MS_TIME_DIFF(tree_time, start_time);
+ GC_log_printf("Finished tree_test at time %u (%p)\n",
+ (unsigned) time_diff, (void *)&start_time);
+ }
+# endif
+ /* Run reverse_test a second time, so we hopefully notice corruption. */
+ reverse_test();
+# ifndef NO_CLOCK
+ if (print_stats) {
+ GET_TIME(reverse_time);
+ time_diff = MS_TIME_DIFF(reverse_time, start_time);
+ GC_log_printf("Finished second reverse_test at time %u (%p)\n",
+ (unsigned)time_diff, (void *)&start_time);
+ }
+# endif
+ /* GC_allocate_ml and GC_need_to_lock are no longer exported, and */
+ /* AO_fetch_and_add1() may be unavailable to update a counter. */
+ (void)GC_call_with_alloc_lock(inc_int_counter, &n_tests);
+# ifndef NO_CLOCK
+ if (print_stats)
+ GC_log_printf("Finished %p\n", (void *)&start_time);
+# endif
+}
+
+/* Execute some tests after termination of other test threads (if any). */
+void run_single_threaded_test(void) {
+ GC_disable();
+ GC_FREE(checkOOM(GC_MALLOC(100)));
+ GC_enable();
+}
+
+void GC_CALLBACK reachable_objs_counter(void *obj, size_t size,
+ void *pcounter)
+{
+ if (0 == size) {
+ GC_printf("Reachable object has zero size\n");
+ FAIL;
+ }
+ if (GC_base(obj) != obj) {
+ GC_printf("Invalid reachable object base passed by enumerator: %p\n",
+ obj);
+ FAIL;
+ }
+ if (GC_size(obj) != size) {
+ GC_printf("Invalid reachable object size passed by enumerator: %lu\n",
+ (unsigned long)size);
+ FAIL;
+ }
+ (*(unsigned *)pcounter)++;
+}
+
+#define NUMBER_ROUND_UP(v, bound) ((((v) + (bound) - 1) / (bound)) * (bound))
+
+void check_heap_stats(void)
+{
+ size_t max_heap_sz;
+ int i;
+# ifndef GC_NO_FINALIZATION
+# ifdef FINALIZE_ON_DEMAND
+ int late_finalize_count = 0;
+# endif
+# endif
+ unsigned obj_count = 0;
+
+ if (!GC_is_init_called()) {
+ GC_printf("GC should be initialized!\n");
+ FAIL;
+ }
+
+ /* The upper bounds are a guess, which has been empirically */
+ /* adjusted. On low-end uniprocessors with incremental GC */
+ /* these may be particularly dubious, since empirically the */
+ /* heap tends to grow largely as a result of the GC not */
+ /* getting enough cycles. */
+# if CPP_WORDSZ == 64
+ max_heap_sz = 26000000;
+# else
+ max_heap_sz = 16000000;
+# endif
+# ifdef VERY_SMALL_CONFIG
+ max_heap_sz /= 4;
+# endif
+# ifdef GC_DEBUG
+ max_heap_sz *= 2;
+# ifdef SAVE_CALL_CHAIN
+ max_heap_sz *= 3;
+# ifdef SAVE_CALL_COUNT
+ max_heap_sz += max_heap_sz * NFRAMES / 4;
+# endif
+# endif
+# endif
+# if defined(ADDRESS_SANITIZER) && !defined(__clang__)
+ max_heap_sz = max_heap_sz * 2 - max_heap_sz / 3;
+# endif
+# ifdef MEMORY_SANITIZER
+ max_heap_sz += max_heap_sz / 4;
+# endif
+ max_heap_sz *= n_tests;
+# if defined(USE_MMAP) || defined(MSWIN32)
+ max_heap_sz = NUMBER_ROUND_UP(max_heap_sz, 4 * 1024 * 1024);
+# endif
+ /* Garbage collect repeatedly so that all inaccessible objects */
+ /* can be finalized. */
+ if (!GC_is_disabled())
+ while (GC_collect_a_little()) { }
+ for (i = 0; i < 16; i++) {
+ GC_gcollect();
+# ifndef GC_NO_FINALIZATION
+# ifdef FINALIZE_ON_DEMAND
+ late_finalize_count +=
+# endif
+ GC_invoke_finalizers();
+# endif
+ }
+ if (print_stats) {
+ struct GC_stack_base sb;
+ int res = GC_get_stack_base(&sb);
+
+ if (res == GC_SUCCESS) {
+ GC_log_printf("Primordial thread stack bottom: %p\n", sb.mem_base);
+ } else if (res == GC_UNIMPLEMENTED) {
+ GC_log_printf("GC_get_stack_base() unimplemented\n");
+ } else {
+ GC_printf("GC_get_stack_base() failed: %d\n", res);
+ FAIL;
+ }
+ }
+ GC_alloc_lock();
+ GC_enumerate_reachable_objects_inner(reachable_objs_counter, &obj_count);
+ GC_alloc_unlock();
+ GC_printf("Completed %u tests\n", n_tests);
+ GC_printf("Allocated %d collectable objects\n", (int)collectable_count);
+ GC_printf("Allocated %d uncollectable objects\n",
+ (int)uncollectable_count);
+ GC_printf("Allocated %d atomic objects\n", (int)atomic_count);
+ GC_printf("Reallocated %d objects\n", (int)realloc_count);
+# ifndef NO_TEST_HANDLE_FORK
+ GC_printf("Garbage collection after fork is tested too\n");
+# endif
+# ifndef GC_NO_FINALIZATION
+ if (!GC_get_find_leak()) {
+ int still_live = 0;
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ int still_long_live = 0;
+# endif
+
+# ifdef FINALIZE_ON_DEMAND
+ if (finalized_count != late_finalize_count) {
+ GC_printf("Finalized %d/%d objects - demand finalization error\n",
+ finalized_count, finalizable_count);
+ FAIL;
+ }
+# endif
+ if (finalized_count > finalizable_count
+ || finalized_count < finalizable_count/2) {
+ GC_printf("Finalized %d/%d objects - "
+ "finalization is probably broken\n",
+ finalized_count, finalizable_count);
+ FAIL;
+ } else {
+ GC_printf("Finalized %d/%d objects - finalization is probably OK\n",
+ finalized_count, finalizable_count);
+ }
+ for (i = 0; i < MAX_FINALIZED; i++) {
+ if (live_indicators[i] != 0) {
+ still_live++;
+ }
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ if (live_long_refs[i] != NULL) {
+ still_long_live++;
+ }
+# endif
+ }
+ i = finalizable_count - finalized_count - still_live;
+ if (0 != i) {
+ GC_printf("%d disappearing links remain and %d more objects "
+ "were not finalized\n", still_live, i);
+ if (i > 10) {
+ GC_printf("\tVery suspicious!\n");
+ } else {
+ GC_printf("\tSlightly suspicious, but probably OK\n");
+ }
+ }
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ if (0 != still_long_live) {
+ GC_printf("%d 'long' links remain\n", still_long_live);
+ }
+# endif
+ }
+# endif
+ GC_printf("Total number of bytes allocated is %lu\n",
+ (unsigned long)GC_get_total_bytes());
+ GC_printf("Total memory use by allocated blocks is %lu bytes\n",
+ (unsigned long)GC_get_memory_use());
+ GC_printf("Final heap size is %lu bytes\n",
+ (unsigned long)GC_get_heap_size());
+ if (GC_get_total_bytes() < (size_t)n_tests *
+# ifdef VERY_SMALL_CONFIG
+ 2700000
+# else
+ 33500000
+# endif
+ ) {
+ GC_printf("Incorrect execution - missed some allocations\n");
+ FAIL;
+ }
+ if (GC_get_heap_size() + GC_get_unmapped_bytes() > max_heap_sz
+ && !GC_get_find_leak()) {
+ GC_printf("Unexpected heap growth - collector may be broken"
+ " (heapsize: %lu, expected: %lu)\n",
+ (unsigned long)(GC_get_heap_size() + GC_get_unmapped_bytes()),
+ (unsigned long)max_heap_sz);
+ FAIL;
+ }
+# ifdef USE_MUNMAP
+ GC_printf("Obtained %lu bytes from OS (of which %lu bytes unmapped)\n",
+ (unsigned long)GC_get_obtained_from_os_bytes(),
+ (unsigned long)GC_get_unmapped_bytes());
+# else
+ GC_printf("Obtained %lu bytes from OS\n",
+ (unsigned long)GC_get_obtained_from_os_bytes());
+# endif
+ GC_printf("Final number of reachable objects is %u\n", obj_count);
+
+# ifndef GC_GET_HEAP_USAGE_NOT_NEEDED
+ /* Get global counters (just to check the functions work). */
+ GC_get_heap_usage_safe(NULL, NULL, NULL, NULL, NULL);
+ {
+ struct GC_prof_stats_s stats;
+ (void)GC_get_prof_stats(&stats, sizeof(stats));
+# ifdef THREADS
+ (void)GC_get_prof_stats_unsafe(&stats, sizeof(stats));
+# endif
+ }
+ (void)GC_get_size_map_at(-1);
+ (void)GC_get_size_map_at(1);
+# endif
+ if (GC_size(NULL) != 0) {
+ GC_printf("GC_size(NULL) failed\n");
+ FAIL;
+ }
+
+# ifdef NO_CLOCK
+ GC_printf("Completed %u collections\n", (unsigned)GC_get_gc_no());
+# elif !defined(PARALLEL_MARK)
+ GC_printf("Completed %u collections in %lu ms\n",
+ (unsigned)GC_get_gc_no(), GC_get_full_gc_total_time());
+# else
+ GC_printf("Completed %u collections in %lu ms"
+ " (using %d marker threads)\n",
+ (unsigned)GC_get_gc_no(), GC_get_full_gc_total_time(),
+ GC_get_parallel() + 1);
+# endif
+ GC_printf("Collector appears to work\n");
+}
+
+#if defined(MACOS)
+void SetMinimumStack(long minSize)
+{
+ if (minSize > LMGetDefltStack())
+ {
+ long newApplLimit = (long) GetApplLimit()
+ - (minSize - LMGetDefltStack());
+ SetApplLimit((Ptr) newApplLimit);
+ MaxApplZone();
+ }
+}
+
+#define cMinStackSpace (512L * 1024L)
+
+#endif
+
+void GC_CALLBACK warn_proc(char *msg, GC_word p)
+{
+ GC_printf(msg, (unsigned long)p);
+ /*FAIL;*/
+}
+
+void enable_incremental_mode(void)
+{
+# if (defined(TEST_DEFAULT_VDB) || defined(TEST_MANUAL_VDB) \
+ || !defined(DEFAULT_VDB)) && !defined(GC_DISABLE_INCREMENTAL)
+# if !defined(MAKE_BACK_GRAPH) && !defined(NO_INCREMENTAL) \
+ && !defined(REDIRECT_MALLOC) && !defined(USE_PROC_FOR_LIBRARIES)
+ GC_enable_incremental();
+# endif
+ if (GC_is_incremental_mode()) {
+# ifndef SMALL_CONFIG
+ if (GC_get_manual_vdb_allowed()) {
+ GC_printf("Switched to incremental mode (manual VDB)\n");
+ } else
+# endif
+ /* else */ {
+ GC_printf("Switched to incremental mode\n");
+ if (GC_incremental_protection_needs() == GC_PROTECTS_NONE) {
+# if defined(PROC_VDB) || defined(SOFT_VDB)
+ GC_printf("Reading dirty bits from /proc\n");
+# elif defined(GWW_VDB)
+ GC_printf("Using GetWriteWatch-based implementation\n");
+# endif
+ } else {
+ GC_printf("Emulating dirty bits with mprotect/signals\n");
+ }
+ }
+ }
+# endif
+}
+
+#if defined(CPPCHECK)
+# include "javaxfc.h" /* for GC_finalize_all */
+# define UNTESTED(sym) GC_noop1((word)&sym)
+#endif
+
+#if defined(MSWINCE) && defined(UNDER_CE)
+# define WINMAIN_LPTSTR LPWSTR
+#else
+# define WINMAIN_LPTSTR LPSTR
+#endif
+
+#if !defined(PCR) && !defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS)
+
+#if defined(CPPCHECK) && defined(_MSC_VER) && !defined(_M_ARM) \
+ && !defined(_M_ARM64) && !defined(_M_X64)
+# include "private/msvc_dbg.h"
+#endif
+
+#if defined(_DEBUG) && (_MSC_VER >= 1900) /* VS 2015+ */
+# ifndef _CRTDBG_MAP_ALLOC
+# define _CRTDBG_MAP_ALLOC
+# endif
+# include <crtdbg.h>
+ /* Ensure that there is no system-malloc-allocated objects at normal */
+ /* exit (i.e. no such memory leaked). */
+# define CRTMEM_CHECK_INIT() \
+ (void)_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF)
+# define CRTMEM_DUMP_LEAKS() \
+ do { \
+ if (_CrtDumpMemoryLeaks()) { \
+ GC_printf("System-malloc-allocated memory leaked\n"); \
+ FAIL; \
+ } \
+ } while (0)
+#else
+# define CRTMEM_CHECK_INIT() (void)0
+# define CRTMEM_DUMP_LEAKS() (void)0
+#endif /* !_MSC_VER */
+
+#if ((defined(MSWIN32) && !defined(__MINGW32__)) || defined(MSWINCE)) \
+ && !defined(NO_WINMAIN_ENTRY)
+ int APIENTRY WinMain(HINSTANCE instance GC_ATTR_UNUSED,
+ HINSTANCE prev GC_ATTR_UNUSED,
+ WINMAIN_LPTSTR cmd GC_ATTR_UNUSED,
+ int n GC_ATTR_UNUSED)
+#elif defined(RTEMS)
+# include <bsp.h>
+# define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+# define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+# define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+# define CONFIGURE_MAXIMUM_TASKS 1
+# define CONFIGURE_INIT
+# define CONFIGURE_INIT_TASK_STACK_SIZE (64*1024)
+# include <rtems/confdefs.h>
+ rtems_task Init(rtems_task_argument ignord)
+#else
+ int main(void)
+#endif
+{
+ CRTMEM_CHECK_INIT();
+# if defined(CPPCHECK) && !defined(NO_WINMAIN_ENTRY) \
+ && ((defined(MSWIN32) && !defined(__MINGW32__)) || defined(MSWINCE))
+ GC_noop1((GC_word)&WinMain);
+# elif defined(CPPCHECK) && defined(RTEMS)
+ GC_noop1((GC_word)&Init);
+# endif
+ n_tests = 0;
+ GC_clear_exclusion_table(); /* no-op as called before GC init */
+# if defined(MACOS)
+ /* Make sure we have lots and lots of stack space. */
+ SetMinimumStack(cMinStackSpace);
+ /* Cheat and let stdio initialize toolbox for us. */
+ printf("Testing GC Macintosh port\n");
+# endif
+ GC_COND_INIT();
+ GC_set_warn_proc(warn_proc);
+ enable_incremental_mode();
+ set_print_procs();
+ GC_start_incremental_collection();
+ run_one_test();
+# if NTHREADS > 0
+ {
+ int i;
+ for (i = 0; i < NTHREADS; i++)
+ run_one_test();
+ }
+# endif
+ run_single_threaded_test();
+ check_heap_stats();
+# ifndef MSWINCE
+ fflush(stdout);
+# endif
+# if defined(CPPCHECK)
+ /* Entry points we should be testing, but aren't. */
+# ifndef GC_DEBUG
+ UNTESTED(GC_debug_generic_or_special_malloc);
+ UNTESTED(GC_debug_register_displacement);
+ UNTESTED(GC_post_incr);
+ UNTESTED(GC_pre_incr);
+# ifdef GC_GCJ_SUPPORT
+ UNTESTED(GC_debug_gcj_malloc);
+# endif
+# endif
+# ifdef AMIGA
+# ifdef GC_AMIGA_FASTALLOC
+ UNTESTED(GC_amiga_get_mem);
+# endif
+# ifndef GC_AMIGA_ONLYFAST
+ UNTESTED(GC_amiga_set_toany);
+# endif
+# endif
+# if defined(MACOS) && defined(USE_TEMPORARY_MEMORY)
+ UNTESTED(GC_MacTemporaryNewPtr);
+# endif
+# if !defined(_M_ARM) && !defined(_M_ARM64) \
+ && !defined(_M_X64) && defined(_MSC_VER)
+ UNTESTED(GetFileLineFromStack);
+ UNTESTED(GetModuleNameFromStack);
+ UNTESTED(GetSymbolNameFromStack);
+# endif
+ UNTESTED(GC_abort_on_oom);
+ UNTESTED(GC_malloc_explicitly_typed_ignore_off_page);
+ UNTESTED(GC_debug_strndup);
+ UNTESTED(GC_deinit);
+ UNTESTED(GC_strndup);
+ UNTESTED(GC_posix_memalign);
+ UNTESTED(GC_new_proc);
+ UNTESTED(GC_clear_roots);
+ UNTESTED(GC_exclude_static_roots);
+ UNTESTED(GC_expand_hp);
+ UNTESTED(GC_register_describe_type_fn);
+ UNTESTED(GC_register_has_static_roots_callback);
+# ifdef GC_GCJ_SUPPORT
+ UNTESTED(GC_gcj_malloc_ignore_off_page);
+# endif
+# ifndef NO_DEBUGGING
+ UNTESTED(GC_dump);
+ UNTESTED(GC_dump_regions);
+ UNTESTED(GC_is_tmp_root);
+ UNTESTED(GC_print_free_list);
+# endif
+# ifdef TRACE_BUF
+ UNTESTED(GC_print_trace);
+# endif
+# ifndef GC_NO_FINALIZATION
+ UNTESTED(GC_debug_register_finalizer_unreachable);
+ UNTESTED(GC_register_disappearing_link);
+ UNTESTED(GC_should_invoke_finalizers);
+# ifndef JAVA_FINALIZATION_NOT_NEEDED
+ UNTESTED(GC_finalize_all);
+# endif
+# ifndef NO_DEBUGGING
+ UNTESTED(GC_dump_finalization);
+# endif
+# ifndef GC_TOGGLE_REFS_NOT_NEEDED
+ UNTESTED(GC_toggleref_add);
+# endif
+# endif
+# if !defined(OS2) && !defined(MACOS) && !defined(GC_ANDROID_LOG) \
+ && !defined(MSWIN32) && !defined(MSWINCE)
+ UNTESTED(GC_set_log_fd);
+# endif
+# ifndef REDIRECT_MALLOC_IN_HEADER
+# ifdef REDIRECT_MALLOC
+# ifndef strndup
+ UNTESTED(strndup);
+# endif
+# ifndef strdup
+ UNTESTED(strdup);
+# endif
+# endif
+# ifdef REDIRECT_REALLOC
+ UNTESTED(realloc);
+# endif
+# endif /* !REDIRECT_MALLOC_IN_HEADER */
+# ifdef GC_REQUIRE_WCSDUP
+ UNTESTED(GC_wcsdup);
+ UNTESTED(GC_debug_wcsdup);
+# endif
+# endif
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+ GC_win32_free_heap();
+# endif
+ CRTMEM_DUMP_LEAKS();
+# ifdef RTEMS
+ exit(0);
+# else
+ return(0);
+# endif
+}
+# endif /* !GC_WIN32_THREADS && !GC_PTHREADS */
+
+#if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS)
+
+DWORD __stdcall thr_run_one_test(void * arg GC_ATTR_UNUSED)
+{
+ run_one_test();
+ return 0;
+}
+
+#ifdef MSWINCE
+HANDLE win_created_h;
+HWND win_handle;
+
+LRESULT CALLBACK window_proc(HWND hwnd, UINT uMsg, WPARAM wParam,
+ LPARAM lParam)
+{
+ LRESULT ret = 0;
+ switch (uMsg) {
+ case WM_HIBERNATE:
+ GC_printf("Received WM_HIBERNATE, calling GC_gcollect\n");
+ /* Force "unmap as much memory as possible" mode. */
+ GC_gcollect_and_unmap();
+ break;
+ case WM_CLOSE:
+ GC_printf("Received WM_CLOSE, closing window\n");
+ DestroyWindow(hwnd);
+ break;
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ break;
+ default:
+ ret = DefWindowProc(hwnd, uMsg, wParam, lParam);
+ break;
+ }
+ return ret;
+}
+
+DWORD __stdcall thr_window(void * arg GC_ATTR_UNUSED)
+{
+ WNDCLASS win_class = {
+ CS_NOCLOSE,
+ window_proc,
+ 0,
+ 0,
+ GetModuleHandle(NULL),
+ NULL,
+ NULL,
+ (HBRUSH)(COLOR_APPWORKSPACE+1),
+ NULL,
+ TEXT("GCtestWindow")
+ };
+ MSG msg;
+
+ if (!RegisterClass(&win_class))
+ FAIL;
+
+ win_handle = CreateWindowEx(
+ 0,
+ TEXT("GCtestWindow"),
+ TEXT("GCtest"),
+ 0,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ NULL,
+ NULL,
+ GetModuleHandle(NULL),
+ NULL);
+
+ if (win_handle == NULL)
+ FAIL;
+
+ SetEvent(win_created_h);
+
+ ShowWindow(win_handle, SW_SHOW);
+ UpdateWindow(win_handle);
+
+ while (GetMessage(&msg, NULL, 0, 0)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ return 0;
+}
+#endif
+
+#if !defined(NO_WINMAIN_ENTRY)
+ int APIENTRY WinMain(HINSTANCE instance GC_ATTR_UNUSED,
+ HINSTANCE prev GC_ATTR_UNUSED,
+ WINMAIN_LPTSTR cmd GC_ATTR_UNUSED,
+ int n GC_ATTR_UNUSED)
+#else
+ int main(void)
+#endif
+{
+# if NTHREADS > 0
+ HANDLE h[NTHREADS];
+ int i;
+# endif
+# ifdef MSWINCE
+ HANDLE win_thr_h;
+# endif
+ DWORD thread_id;
+
+# if defined(CPPCHECK) && !defined(NO_WINMAIN_ENTRY)
+ GC_noop1((GC_word)&WinMain);
+# endif
+# if defined(GC_DLL) && !defined(GC_NO_THREADS_DISCOVERY) \
+ && !defined(MSWINCE) && !defined(THREAD_LOCAL_ALLOC)
+ GC_use_threads_discovery();
+ /* Test with implicit thread registration if possible. */
+ GC_printf("Using DllMain to track threads\n");
+# endif
+ GC_COND_INIT();
+ enable_incremental_mode();
+ InitializeCriticalSection(&incr_cs);
+ GC_set_warn_proc(warn_proc);
+# ifdef MSWINCE
+ win_created_h = CreateEvent(NULL, FALSE, FALSE, NULL);
+ if (win_created_h == (HANDLE)NULL) {
+ GC_printf("Event creation failed, errcode= %d\n", (int)GetLastError());
+ FAIL;
+ }
+ win_thr_h = CreateThread(NULL, 0, thr_window, 0, 0, &thread_id);
+ if (win_thr_h == (HANDLE)NULL) {
+ GC_printf("Thread creation failed, errcode= %d\n", (int)GetLastError());
+ FAIL;
+ }
+ if (WaitForSingleObject(win_created_h, INFINITE) != WAIT_OBJECT_0)
+ FAIL;
+ CloseHandle(win_created_h);
+# endif
+ set_print_procs();
+# if NTHREADS > 0
+ for (i = 0; i < NTHREADS; i++) {
+ h[i] = CreateThread(NULL, 0, thr_run_one_test, 0, 0, &thread_id);
+ if (h[i] == (HANDLE)NULL) {
+ GC_printf("Thread creation failed, errcode= %d\n", (int)GetLastError());
+ FAIL;
+ }
+ }
+# endif /* NTHREADS > 0 */
+ run_one_test();
+# if NTHREADS > 0
+ for (i = 0; i < NTHREADS; i++) {
+ if (WaitForSingleObject(h[i], INFINITE) != WAIT_OBJECT_0) {
+ GC_printf("Thread wait failed, errcode= %d\n", (int)GetLastError());
+ FAIL;
+ }
+ }
+# endif /* NTHREADS > 0 */
+# ifdef MSWINCE
+ PostMessage(win_handle, WM_CLOSE, 0, 0);
+ if (WaitForSingleObject(win_thr_h, INFINITE) != WAIT_OBJECT_0)
+ FAIL;
+# endif
+ run_single_threaded_test();
+ check_heap_stats();
+# if defined(CPPCHECK) && defined(GC_WIN32_THREADS)
+ UNTESTED(GC_ExitThread);
+# if !defined(MSWINCE) && !defined(CYGWIN32)
+ UNTESTED(GC_beginthreadex);
+ UNTESTED(GC_endthreadex);
+# endif
+# endif
+ (void)GC_unregister_my_thread(); /* just to check it works (for main) */
+ return(0);
+}
+
+#endif /* GC_WIN32_THREADS */
+
+
+#ifdef PCR
+int test(void)
+{
+ PCR_Th_T * th1;
+ PCR_Th_T * th2;
+ int code;
+
+# if defined(CPPCHECK)
+ GC_noop1((word)&PCR_GC_Run);
+ GC_noop1((word)&PCR_GC_Setup);
+ GC_noop1((word)&test);
+# endif
+ n_tests = 0;
+ /* GC_enable_incremental(); */
+ GC_set_warn_proc(warn_proc);
+ set_print_procs();
+ th1 = PCR_Th_Fork(run_one_test, 0);
+ th2 = PCR_Th_Fork(run_one_test, 0);
+ run_one_test();
+ if (PCR_Th_T_Join(th1, &code, NIL, PCR_allSigsBlocked, PCR_waitForever)
+ != PCR_ERes_okay || code != 0) {
+ GC_printf("Thread 1 failed\n");
+ }
+ if (PCR_Th_T_Join(th2, &code, NIL, PCR_allSigsBlocked, PCR_waitForever)
+ != PCR_ERes_okay || code != 0) {
+ GC_printf("Thread 2 failed\n");
+ }
+ run_single_threaded_test();
+ check_heap_stats();
+ return(0);
+}
+#endif
+
+#if defined(GC_PTHREADS)
+# include <errno.h> /* for EAGAIN */
+
+void * thr_run_one_test(void * arg GC_ATTR_UNUSED)
+{
+ run_one_test();
+ return(0);
+}
+
+#ifdef GC_DEBUG
+# define GC_free GC_debug_free
+#endif
+
+int main(void)
+{
+# if NTHREADS > 0
+ pthread_t th[NTHREADS];
+ int i, nthreads;
+# endif
+ pthread_attr_t attr;
+ int code;
+# ifdef GC_IRIX_THREADS
+ /* Force a larger stack to be preallocated */
+ /* Since the initial can't always grow later. */
+ *((volatile char *)&code - 1024*1024) = 0; /* Require 1 MB */
+# endif /* GC_IRIX_THREADS */
+# if defined(GC_HPUX_THREADS)
+ /* Default stack size is too small, especially with the 64 bit ABI */
+ /* Increase it. */
+ if (pthread_default_stacksize_np(1024*1024, 0) != 0) {
+ GC_printf("pthread_default_stacksize_np failed\n");
+ }
+# endif /* GC_HPUX_THREADS */
+# ifdef PTW32_STATIC_LIB
+ pthread_win32_process_attach_np ();
+ pthread_win32_thread_attach_np ();
+# endif
+# if defined(GC_DARWIN_THREADS) && !defined(GC_NO_THREADS_DISCOVERY) \
+ && !defined(DARWIN_DONT_PARSE_STACK) && !defined(THREAD_LOCAL_ALLOC)
+ /* Test with the Darwin implicit thread registration. */
+ GC_use_threads_discovery();
+ GC_printf("Using Darwin task-threads-based world stop and push\n");
+# endif
+ GC_set_markers_count(0);
+ GC_COND_INIT();
+
+ if ((code = pthread_attr_init(&attr)) != 0) {
+ GC_printf("pthread_attr_init failed, errno= %d\n", code);
+ FAIL;
+ }
+# if defined(GC_IRIX_THREADS) || defined(GC_FREEBSD_THREADS) \
+ || defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS) \
+ || defined(GC_OPENBSD_THREADS)
+ if ((code = pthread_attr_setstacksize(&attr, 1000 * 1024)) != 0) {
+ GC_printf("pthread_attr_setstacksize failed, errno= %d\n", code);
+ FAIL;
+ }
+# endif
+ n_tests = 0;
+ enable_incremental_mode();
+ GC_set_min_bytes_allocd(1);
+ if (GC_get_min_bytes_allocd() != 1)
+ FAIL;
+ GC_set_rate(10);
+ GC_set_max_prior_attempts(1);
+ if (GC_get_rate() != 10 || GC_get_max_prior_attempts() != 1)
+ FAIL;
+ GC_set_warn_proc(warn_proc);
+# ifndef VERY_SMALL_CONFIG
+ if ((code = pthread_key_create(&fl_key, 0)) != 0) {
+ GC_printf("Key creation failed, errno= %d\n", code);
+ FAIL;
+ }
+# endif
+ set_print_procs();
+# if NTHREADS > 0
+ for (i = 0; i < NTHREADS; ++i) {
+ if ((code = pthread_create(th+i, &attr, thr_run_one_test, 0)) != 0) {
+ GC_printf("Thread %d creation failed, errno= %d\n", i, code);
+ if (i > 0 && EAGAIN == code)
+ break; /* Resource temporarily unavailable */
+ FAIL;
+ }
+ }
+ nthreads = i;
+ for (; i <= NTHREADS; i++)
+ run_one_test();
+ for (i = 0; i < nthreads; ++i) {
+ if ((code = pthread_join(th[i], 0)) != 0) {
+ GC_printf("Thread %d join failed, errno= %d\n", i, code);
+ FAIL;
+ }
+ }
+# else
+ run_one_test();
+# endif
+ run_single_threaded_test();
+ check_heap_stats();
+ (void)fflush(stdout);
+ (void)pthread_attr_destroy(&attr);
+
+ /* Dummy checking of various getters and setters. */
+ (void)GC_get_bytes_since_gc();
+ (void)GC_get_free_bytes();
+ (void)GC_get_pages_executable();
+ (void)GC_get_warn_proc();
+ (void)GC_is_disabled();
+ GC_set_allocd_bytes_per_finalizer(GC_get_allocd_bytes_per_finalizer());
+ GC_set_disable_automatic_collection(GC_get_disable_automatic_collection());
+ GC_set_dont_expand(GC_get_dont_expand());
+ GC_set_dont_precollect(GC_get_dont_precollect());
+ GC_set_finalize_on_demand(GC_get_finalize_on_demand());
+ GC_set_finalizer_notifier(GC_get_finalizer_notifier());
+ GC_set_force_unmap_on_gcollect(GC_get_force_unmap_on_gcollect());
+ GC_set_free_space_divisor(GC_get_free_space_divisor());
+ GC_set_full_freq(GC_get_full_freq());
+ GC_set_java_finalization(GC_get_java_finalization());
+ GC_set_max_retries(GC_get_max_retries());
+ GC_set_no_dls(GC_get_no_dls());
+ GC_set_non_gc_bytes(GC_get_non_gc_bytes());
+ GC_set_on_collection_event(GC_get_on_collection_event());
+ GC_set_on_heap_resize(GC_get_on_heap_resize());
+ GC_set_on_thread_event(GC_get_on_thread_event());
+ GC_set_oom_fn(GC_get_oom_fn());
+ GC_set_push_other_roots(GC_get_push_other_roots());
+ GC_set_sp_corrector(GC_get_sp_corrector());
+ GC_set_start_callback(GC_get_start_callback());
+ GC_set_stop_func(GC_get_stop_func());
+ GC_set_suspend_signal(GC_get_suspend_signal());
+ GC_set_thr_restart_signal(GC_get_thr_restart_signal());
+ GC_set_time_limit(GC_get_time_limit());
+# if !defined(PCR) && !defined(SMALL_CONFIG)
+ GC_set_abort_func(GC_get_abort_func());
+# endif
+# ifndef NO_CLOCK
+ GC_set_time_limit_tv(GC_get_time_limit_tv());
+# endif
+# ifndef GC_NO_FINALIZATION
+ GC_set_await_finalize_proc(GC_get_await_finalize_proc());
+# ifndef GC_TOGGLE_REFS_NOT_NEEDED
+ GC_set_toggleref_func(GC_get_toggleref_func());
+# endif
+# endif
+# if defined(CPPCHECK)
+ UNTESTED(GC_allow_register_threads);
+ UNTESTED(GC_register_altstack);
+ UNTESTED(GC_stop_world_external);
+ UNTESTED(GC_start_world_external);
+# ifndef GC_NO_DLOPEN
+ UNTESTED(GC_dlopen);
+# endif
+# ifndef GC_NO_PTHREAD_CANCEL
+ UNTESTED(GC_pthread_cancel);
+# endif
+# ifdef GC_HAVE_PTHREAD_EXIT
+ UNTESTED(GC_pthread_exit);
+# endif
+# ifndef GC_NO_PTHREAD_SIGMASK
+ UNTESTED(GC_pthread_sigmask);
+# endif
+# ifdef NO_TEST_HANDLE_FORK
+ UNTESTED(GC_atfork_child);
+ UNTESTED(GC_atfork_parent);
+ UNTESTED(GC_atfork_prepare);
+ UNTESTED(GC_set_handle_fork);
+ UNTESTED(GC_start_mark_threads);
+# endif
+# endif /* CPPCHECK */
+# ifdef PTW32_STATIC_LIB
+ pthread_win32_thread_detach_np ();
+ pthread_win32_process_detach_np ();
+# else
+ (void)GC_unregister_my_thread();
+# endif
+ return(0);
+}
+#endif /* GC_PTHREADS */
diff --git a/graphics/asymptote/gc/tests/test_atomic_ops.c b/graphics/asymptote/gc/tests/test_atomic_ops.c
new file mode 100644
index 0000000000..23bb405b70
--- /dev/null
+++ b/graphics/asymptote/gc/tests/test_atomic_ops.c
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2017 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* Minimal testing of atomic operations used by the BDWGC. Primary use */
+/* is to determine whether compiler atomic intrinsics can be relied on. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+
+#if defined(GC_BUILTIN_ATOMIC) || defined(GC_THREADS)
+
+# include <stdlib.h>
+
+# ifdef PARALLEL_MARK
+# define AO_REQUIRE_CAS
+# endif
+
+# include "private/gc_atomic_ops.h"
+
+# define TA_assert(e) \
+ if (!(e)) { \
+ fprintf(stderr, "Assertion failure, line %d: " #e "\n", __LINE__); \
+ exit(-1); \
+ }
+
+ int main(void) {
+ AO_t x = 13;
+# if defined(AO_HAVE_char_load) || defined(AO_HAVE_char_store)
+ unsigned char c = 117;
+# endif
+# ifdef AO_HAVE_test_and_set_acquire
+ AO_TS_t z = AO_TS_INITIALIZER;
+
+ TA_assert(AO_test_and_set_acquire(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_set_acquire(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# endif
+ AO_compiler_barrier();
+# ifdef AO_HAVE_nop_full
+ AO_nop_full();
+# endif
+# ifdef AO_HAVE_char_load
+ TA_assert(AO_char_load(&c) == 117);
+# endif
+# ifdef AO_HAVE_char_store
+ AO_char_store(&c, 119);
+ TA_assert(c == 119);
+# endif
+# ifdef AO_HAVE_load_acquire
+ TA_assert(AO_load_acquire(&x) == 13);
+# endif
+# if defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_fetch_and_add1)
+ TA_assert(AO_fetch_and_add(&x, 42) == 13);
+ TA_assert(AO_fetch_and_add(&x, (AO_t)(-43)) == 55);
+ TA_assert(AO_fetch_and_add1(&x) == 12);
+# endif
+# ifdef AO_HAVE_compare_and_swap_release
+ TA_assert(!AO_compare_and_swap(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swap_release(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ if (*(volatile AO_t *)&x == 13)
+ *(volatile AO_t *)&x = 42;
+# endif
+# ifdef AO_HAVE_or
+ AO_or(&x, 66);
+ TA_assert(x == 106);
+# endif
+# ifdef AO_HAVE_store_release
+ AO_store_release(&x, 113);
+ TA_assert(x == 113);
+# endif
+ return 0;
+ }
+
+#else
+
+ int main(void)
+ {
+ printf("test_atomic_ops skipped\n");
+ return 0;
+ }
+
+#endif
diff --git a/graphics/asymptote/gc/tests/test_cpp.cc b/graphics/asymptote/gc/tests/test_cpp.cc
new file mode 100644
index 0000000000..6599089324
--- /dev/null
+++ b/graphics/asymptote/gc/tests/test_cpp.cc
@@ -0,0 +1,425 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/****************************************************************************
+usage: test_cpp number-of-iterations
+
+This program tries to test the specific C++ functionality provided by
+gc_cpp.h that isn't tested by the more general test routines of the
+collector.
+
+A recommended value for number-of-iterations is 10, which will take a
+few minutes to complete.
+
+***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#undef GC_BUILD
+
+#define GC_DONT_INCL_WINDOWS_H
+#include "gc_cpp.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gc_allocator.h"
+
+# include "private/gcconfig.h"
+
+# ifndef GC_API_PRIV
+# define GC_API_PRIV GC_API
+# endif
+extern "C" {
+ GC_API_PRIV void GC_printf(const char * format, ...);
+ /* Use GC private output to reach the same log file. */
+ /* Don't include gc_priv.h, since that may include Windows system */
+ /* header files that don't take kindly to this context. */
+}
+
+#ifdef MSWIN32
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+# endif
+# define NOSERVICE
+# include <windows.h>
+#endif
+
+#ifdef GC_NAME_CONFLICT
+# define USE_GC GC_NS_QUALIFY(UseGC)
+ struct foo * GC;
+#else
+# define USE_GC GC_NS_QUALIFY(GC)
+#endif
+
+#define my_assert( e ) \
+ if (! (e)) { \
+ GC_printf( "Assertion failure in " __FILE__ ", line %d: " #e "\n", \
+ __LINE__ ); \
+ exit( 1 ); }
+
+#if defined(__powerpc64__) && !defined(__clang__) && GC_GNUC_PREREQ(10, 0)
+ /* Suppress "layout of aggregates ... has changed" GCC note. */
+# define A_I_TYPE short
+#else
+# define A_I_TYPE int
+#endif
+
+class A {public:
+ /* An uncollectible class. */
+
+ GC_ATTR_EXPLICIT A( int iArg ): i((A_I_TYPE)iArg) {}
+ void Test( int iArg ) {
+ my_assert( i == iArg );}
+ virtual ~A() {}
+ A_I_TYPE i; };
+
+
+class B: public GC_NS_QUALIFY(gc), public A { public:
+ /* A collectible class. */
+
+ GC_ATTR_EXPLICIT B( int j ): A( j ) {}
+ virtual ~B() {
+ my_assert( deleting );}
+ static void Deleting( int on ) {
+ deleting = on;}
+ static int deleting;};
+
+int B::deleting = 0;
+
+#define C_INIT_LEFT_RIGHT(arg_l, arg_r) \
+ { \
+ C *l = new C(arg_l); \
+ C *r = new C(arg_r); \
+ left = l; \
+ right = r; \
+ if (GC_is_heap_ptr(this)) { \
+ GC_END_STUBBORN_CHANGE(this); \
+ GC_reachable_here(l); \
+ GC_reachable_here(r); \
+ } \
+ }
+
+class C: public GC_NS_QUALIFY(gc_cleanup), public A { public:
+ /* A collectible class with cleanup and virtual multiple inheritance. */
+
+ // The class uses dynamic memory/resource allocation, so provide both
+ // a copy constructor and an assignment operator to workaround a cppcheck
+ // warning.
+ C(const C& c) : A(c.i), level(c.level), left(0), right(0) {
+ if (level > 0)
+ C_INIT_LEFT_RIGHT(*c.left, *c.right);
+ }
+
+ C& operator=(const C& c) {
+ if (this != &c) {
+ delete left;
+ delete right;
+ i = c.i;
+ level = c.level;
+ left = 0;
+ right = 0;
+ if (level > 0)
+ C_INIT_LEFT_RIGHT(*c.left, *c.right);
+ }
+ return *this;
+ }
+
+ GC_ATTR_EXPLICIT C( int levelArg ): A( levelArg ), level( levelArg ) {
+ nAllocated++;
+ if (level > 0) {
+ C_INIT_LEFT_RIGHT(level - 1, level - 1);
+ } else {
+ left = right = 0;}}
+ ~C() {
+ this->A::Test( level );
+ nFreed++;
+ my_assert( level == 0 ?
+ left == 0 && right == 0 :
+ level == left->level + 1 && level == right->level + 1 );
+ left = right = 0;
+ level = -123456;}
+ static void Test() {
+ if (GC_is_incremental_mode() && nFreed < (nAllocated / 5) * 4) {
+ // An explicit GC might be needed to reach the expected number
+ // of the finalized objects.
+ GC_gcollect();
+ }
+ my_assert(nFreed <= nAllocated);
+# ifndef GC_NO_FINALIZATION
+ my_assert(nFreed >= (nAllocated / 5) * 4 || GC_get_find_leak());
+# endif
+ }
+
+ static int nFreed;
+ static int nAllocated;
+ int level;
+ C* left;
+ C* right;};
+
+int C::nFreed = 0;
+int C::nAllocated = 0;
+
+
+class D: public GC_NS_QUALIFY(gc) { public:
+ /* A collectible class with a static member function to be used as
+ an explicit clean-up function supplied to ::new. */
+
+ GC_ATTR_EXPLICIT D( int iArg ): i( iArg ) {
+ nAllocated++;}
+ static void CleanUp( void* obj, void* data ) {
+ D* self = static_cast<D*>(obj);
+ nFreed++;
+ my_assert( (GC_word)self->i == (GC_word)data );}
+ static void Test() {
+# ifndef GC_NO_FINALIZATION
+ my_assert(nFreed >= (nAllocated / 5) * 4 || GC_get_find_leak());
+# endif
+ }
+
+ int i;
+ static int nFreed;
+ static int nAllocated;};
+
+int D::nFreed = 0;
+int D::nAllocated = 0;
+
+
+class E: public GC_NS_QUALIFY(gc_cleanup) { public:
+ /* A collectible class with clean-up for use by F. */
+
+ E() {
+ nAllocated++;}
+ ~E() {
+ nFreed++;}
+
+ static int nFreed;
+ static int nAllocated;};
+
+int E::nFreed = 0;
+int E::nAllocated = 0;
+
+
+class F: public E {public:
+ /* A collectible class with clean-up, a base with clean-up, and a
+ member with clean-up. */
+
+ F() {
+ nAllocatedF++;
+ }
+
+ ~F() {
+ nFreedF++;
+ }
+
+ static void Test() {
+# ifndef GC_NO_FINALIZATION
+ my_assert(nFreedF >= (nAllocatedF / 5) * 4 || GC_get_find_leak());
+# endif
+ my_assert(2 * nFreedF == nFreed);
+ }
+
+ E e;
+ static int nFreedF;
+ static int nAllocatedF;
+};
+
+int F::nFreedF = 0;
+int F::nAllocatedF = 0;
+
+
+GC_word Disguise( void* p ) {
+ return ~ (GC_word) p;}
+
+void* Undisguise( GC_word i ) {
+ return (void*) ~ i;}
+
+#define GC_CHECKED_DELETE(p) \
+ { \
+ size_t freed_before = GC_get_expl_freed_bytes_since_gc(); \
+ delete p; /* the operator should invoke GC_FREE() */ \
+ size_t freed_after = GC_get_expl_freed_bytes_since_gc(); \
+ my_assert(freed_before != freed_after); \
+ }
+
+#if ((defined(MSWIN32) && !defined(__MINGW32__)) || defined(MSWINCE)) \
+ && !defined(NO_WINMAIN_ENTRY)
+ int APIENTRY WinMain( HINSTANCE /* instance */, HINSTANCE /* prev */,
+ LPSTR cmd, int /* cmdShow */)
+ {
+ int argc = 0;
+ char* argv[ 3 ];
+
+# if defined(CPPCHECK)
+ GC_noop1((GC_word)&WinMain);
+# endif
+ if (cmd != 0)
+ for (argc = 1; argc < (int)(sizeof(argv) / sizeof(argv[0])); argc++) {
+ // Parse the command-line string. Non-reentrant strtok() is not used
+ // to avoid complains of static analysis tools. (And, strtok_r() is
+ // not available on some platforms.) The code is equivalent to:
+ // if (!(argv[argc] = strtok(argc == 1 ? cmd : 0, " \t"))) break;
+ if (NULL == cmd) {
+ argv[argc] = NULL;
+ break;
+ }
+ for (; *cmd != '\0'; cmd++) {
+ if (*cmd != ' ' && *cmd != '\t')
+ break;
+ }
+ if ('\0' == *cmd) {
+ argv[argc] = NULL;
+ break;
+ }
+ argv[argc] = cmd;
+ while (*(++cmd) != '\0') {
+ if (*cmd == ' ' || *cmd == '\t')
+ break;
+ }
+ if (*cmd != '\0') {
+ *(cmd++) = '\0';
+ } else {
+ cmd = NULL;
+ }
+ }
+#elif defined(MACOS)
+ int main() {
+ char* argv_[] = {"test_cpp", "10"}; // MacOS doesn't have a command line
+ argv = argv_;
+ argc = sizeof(argv_)/sizeof(argv_[0]);
+#else
+ int main( int argc, char* argv[] ) {
+#endif
+
+ GC_set_all_interior_pointers(1);
+ /* needed due to C++ multiple inheritance used */
+
+# ifdef TEST_MANUAL_VDB
+ GC_set_manual_vdb_allowed(1);
+# endif
+ GC_INIT();
+# ifndef NO_INCREMENTAL
+ GC_enable_incremental();
+# endif
+ if (GC_get_find_leak())
+ GC_printf("This test program is not designed for leak detection mode\n");
+
+ int i, iters, n;
+ int *x = gc_allocator<int>().allocate(1);
+ int *xio;
+ xio = gc_allocator_ignore_off_page<int>().allocate(1);
+ GC_reachable_here(xio);
+ int **xptr = traceable_allocator<int *>().allocate(1);
+ *x = 29;
+ if (!xptr) {
+ fprintf(stderr, "Out of memory!\n");
+ exit(3);
+ }
+ GC_PTR_STORE_AND_DIRTY(xptr, x);
+ x = 0;
+ if (argc != 2
+ || (n = atoi(argv[1])) <= 0) {
+ GC_printf("usage: test_cpp number-of-iterations\n"
+ "Assuming 10 iters\n");
+ n = 10;
+ }
+# ifdef LINT2
+ if (n > 100 * 1000) n = 100 * 1000;
+# endif
+
+ for (iters = 1; iters <= n; iters++) {
+ GC_printf( "Starting iteration %d\n", iters );
+
+ /* Allocate some uncollectible As and disguise their pointers.
+ Later we'll check to see if the objects are still there. We're
+ checking to make sure these objects really are uncollectible. */
+ GC_word as[ 1000 ];
+ GC_word bs[ 1000 ];
+ for (i = 0; i < 1000; i++) {
+ as[ i ] = Disguise( new (GC_NS_QUALIFY(NoGC)) A(i) );
+ bs[ i ] = Disguise( new (GC_NS_QUALIFY(NoGC)) B(i) ); }
+
+ /* Allocate a fair number of finalizable Cs, Ds, and Fs.
+ Later we'll check to make sure they've gone away. */
+ for (i = 0; i < 1000; i++) {
+ C* c = new C( 2 );
+ C c1( 2 ); /* stack allocation should work too */
+ D* d;
+ F* f;
+ d = ::new (USE_GC, D::CleanUp, (void*)(GC_word)i) D( i );
+ GC_reachable_here(d);
+ f = new F;
+ F** fa = new F*[1];
+ fa[0] = f;
+ (void)fa;
+ delete[] fa;
+ if (0 == i % 10)
+ GC_CHECKED_DELETE(c);
+ }
+
+ /* Allocate a very large number of collectible As and Bs and
+ drop the references to them immediately, forcing many
+ collections. */
+ for (i = 0; i < 1000000; i++) {
+ A* a;
+ a = new (USE_GC) A( i );
+ GC_reachable_here(a);
+ B* b;
+ b = new B( i );
+ (void)b;
+ b = new (USE_GC) B( i );
+ if (0 == i % 10) {
+ B::Deleting( 1 );
+ GC_CHECKED_DELETE(b);
+ B::Deleting( 0 );}
+# if defined(FINALIZE_ON_DEMAND) && !defined(GC_NO_FINALIZATION)
+ GC_invoke_finalizers();
+# endif
+ }
+
+ /* Make sure the uncollectible As and Bs are still there. */
+ for (i = 0; i < 1000; i++) {
+ A* a = static_cast<A*>(Undisguise(as[i]));
+ B* b = static_cast<B*>(Undisguise(bs[i]));
+ a->Test( i );
+# if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER)
+ // Workaround for ASan/MSan: the linker uses operator delete
+ // implementation from libclang_rt instead of gc_cpp (thus
+ // causing incompatible alloc/free).
+ GC_FREE(a);
+# else
+ GC_CHECKED_DELETE(a);
+# endif
+ b->Test( i );
+ B::Deleting( 1 );
+ GC_CHECKED_DELETE(b);
+ B::Deleting( 0 );
+# if defined(FINALIZE_ON_DEMAND) && !defined(GC_NO_FINALIZATION)
+ GC_invoke_finalizers();
+# endif
+ }
+
+ /* Make sure most of the finalizable Cs, Ds, and Fs have
+ gone away. */
+ C::Test();
+ D::Test();
+ F::Test();}
+
+ x = *xptr;
+ my_assert (29 == x[0]);
+ GC_printf( "The test appears to have succeeded.\n" );
+ return( 0 );
+}
diff --git a/graphics/asymptote/gc/tests/tests.am b/graphics/asymptote/gc/tests/tests.am
new file mode 100644
index 0000000000..fddbab17f8
--- /dev/null
+++ b/graphics/asymptote/gc/tests/tests.am
@@ -0,0 +1,179 @@
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+# Common libs to _LDADD for all tests.
+test_ldadd = $(nodist_libgc_la_OBJECTS) $(top_builddir)/libgc.la \
+ $(EXTRA_TEST_LIBS)
+
+TESTS += gctest$(EXEEXT)
+check_PROGRAMS += gctest
+gctest_SOURCES = tests/test.c
+gctest_LDADD = $(test_ldadd)
+if THREADS
+gctest_LDADD += $(THREADDLLIBS)
+endif
+gctest_DEPENDENCIES = $(top_builddir)/libgc.la
+
+if EMSCRIPTEN
+# Note: because of libtool, you'll need to point your browser to
+# .libs/gctest.html, not gctest.html at topdir.
+check_PROGRAMS += gctest.html
+gctest_html_SOURCES = $(gctest_SOURCES)
+gctest_html_LDADD = $(gctest_LDADD)
+# Bug in the linker not being able to determine that _memalign and _memset
+# are needed? it's part of mmap.
+gctest_html_LDFLAGS = -s "EXPORTED_FUNCTIONS=['_memalign', '_main', '_memset']"
+endif
+
+TESTS += leaktest$(EXEEXT)
+check_PROGRAMS += leaktest
+leaktest_SOURCES = tests/leak_test.c
+leaktest_LDADD = $(test_ldadd)
+
+TESTS += middletest$(EXEEXT)
+check_PROGRAMS += middletest
+middletest_SOURCES = tests/middle.c
+middletest_LDADD = $(test_ldadd)
+
+TESTS += smashtest$(EXEEXT)
+check_PROGRAMS += smashtest
+smashtest_SOURCES = tests/smash_test.c
+smashtest_LDADD = $(test_ldadd)
+
+TESTS += hugetest$(EXEEXT)
+check_PROGRAMS += hugetest
+hugetest_SOURCES = tests/huge_test.c
+hugetest_LDADD = $(test_ldadd)
+
+TESTS += realloc_test$(EXEEXT)
+check_PROGRAMS += realloc_test
+realloc_test_SOURCES = tests/realloc_test.c
+realloc_test_LDADD = $(test_ldadd)
+
+TESTS += staticrootstest$(EXEEXT)
+check_PROGRAMS += staticrootstest
+staticrootstest_SOURCES = tests/staticrootstest.c
+staticrootstest_CFLAGS = -DSTATICROOTSLIB2
+staticrootstest_LDADD = $(nodist_libgc_la_OBJECTS) $(EXTRA_TEST_LIBS) \
+ libstaticrootslib_test.la libstaticrootslib2_test.la
+check_LTLIBRARIES += libstaticrootslib_test.la libstaticrootslib2_test.la
+libstaticrootslib_test_la_SOURCES = tests/staticrootslib.c
+libstaticrootslib_test_la_LIBADD = $(test_ldadd)
+libstaticrootslib_test_la_LDFLAGS = -no-undefined -rpath /nowhere
+libstaticrootslib_test_la_DEPENDENCIES = $(top_builddir)/libgc.la
+libstaticrootslib2_test_la_SOURCES = tests/staticrootslib.c
+libstaticrootslib2_test_la_LIBADD = $(test_ldadd)
+libstaticrootslib2_test_la_CFLAGS = -DSTATICROOTSLIB2
+libstaticrootslib2_test_la_LDFLAGS = -no-undefined -rpath /nowhere
+if ENABLE_SHARED
+staticrootstest_LDADD += $(top_builddir)/libgc.la
+endif
+
+if KEEP_BACK_PTRS
+TESTS += tracetest$(EXEEXT)
+check_PROGRAMS += tracetest
+tracetest_SOURCES = tests/trace_test.c
+tracetest_LDADD = $(test_ldadd)
+endif
+
+if THREADS
+
+TESTS += test_atomic_ops$(EXEEXT)
+check_PROGRAMS += test_atomic_ops
+test_atomic_ops_SOURCES = tests/test_atomic_ops.c
+# Really should need only $(ATOMIC_OPS_LIBS)
+test_atomic_ops_LDADD = $(test_ldadd) $(THREADDLLIBS)
+
+TESTS += threadleaktest$(EXEEXT)
+check_PROGRAMS += threadleaktest
+threadleaktest_SOURCES = tests/thread_leak_test.c
+threadleaktest_LDADD = $(test_ldadd) $(THREADDLLIBS)
+
+TESTS += threadkey_test$(EXEEXT)
+check_PROGRAMS += threadkey_test
+threadkey_test_SOURCES = tests/threadkey_test.c
+threadkey_test_LDADD = $(test_ldadd) $(THREADDLLIBS)
+
+TESTS += subthreadcreate_test$(EXEEXT)
+check_PROGRAMS += subthreadcreate_test
+subthreadcreate_test_SOURCES = tests/subthread_create.c
+subthreadcreate_test_LDADD = $(test_ldadd) $(THREADDLLIBS)
+
+TESTS += initsecondarythread_test$(EXEEXT)
+check_PROGRAMS += initsecondarythread_test
+initsecondarythread_test_SOURCES = tests/initsecondarythread.c
+initsecondarythread_test_LDADD = $(test_ldadd) $(THREADDLLIBS)
+
+endif
+
+if CPLUSPLUS
+TESTS += test_cpp$(EXEEXT)
+check_PROGRAMS += test_cpp
+test_cpp_SOURCES = tests/test_cpp.cc
+if AVOID_CPP_LIB
+test_cpp_LDADD = gc_badalc.o gc_cpp.o $(test_ldadd) $(CXXLIBS)
+else
+test_cpp_LDADD = libgccpp.la $(nodist_libgc_la_OBJECTS) \
+ $(EXTRA_TEST_LIBS) $(CXXLIBS)
+## In case of static libraries build, libgc.a is already referenced in
+## dependency_libs attribute of libgccpp.la file.
+if ENABLE_SHARED
+test_cpp_LDADD += $(top_builddir)/libgc.la
+endif
+endif
+endif
+
+if ENABLE_DISCLAIM
+
+TESTS += disclaim_test$(EXEEXT)
+check_PROGRAMS += disclaim_test
+disclaim_test_SOURCES = tests/disclaim_test.c
+disclaim_test_LDADD = $(test_ldadd)
+if THREADS
+disclaim_test_LDADD += $(THREADDLLIBS)
+endif
+
+TESTS += disclaim_bench$(EXEEXT)
+check_PROGRAMS += disclaim_bench
+disclaim_bench_SOURCES = tests/disclaim_bench.c
+disclaim_bench_LDADD = $(test_ldadd)
+
+TESTS += disclaim_weakmap_test$(EXEEXT)
+check_PROGRAMS += disclaim_weakmap_test
+disclaim_weakmap_test_SOURCES = tests/disclaim_weakmap_test.c
+disclaim_weakmap_test_LDADD = $(test_ldadd)
+if THREADS
+disclaim_weakmap_test_LDADD += $(THREADDLLIBS)
+endif
+
+endif
+
+# Run the tests directly (without test-driver):
+.PHONY: check-without-test-driver
+check-without-test-driver: $(TESTS)
+ ./gctest$(EXEEXT)
+ ./hugetest$(EXEEXT)
+ ./leaktest$(EXEEXT)
+ ./middletest$(EXEEXT)
+ ./realloc_test$(EXEEXT)
+ ./smashtest$(EXEEXT)
+ ./staticrootstest$(EXEEXT)
+ test ! -f disclaim_bench$(EXEEXT) || ./disclaim_bench$(EXEEXT)
+ test ! -f disclaim_test$(EXEEXT) || ./disclaim_test$(EXEEXT)
+ test ! -f disclaim_weakmap_test$(EXEEXT) || ./disclaim_weakmap_test$(EXEEXT)
+ test ! -f initsecondarythread_test$(EXEEXT) \
+ || ./initsecondarythread_test$(EXEEXT)
+ test ! -f test_atomic_ops$(EXEEXT) || ./test_atomic_ops$(EXEEXT)
+ test ! -f threadkey_test$(EXEEXT) || ./threadkey_test$(EXEEXT)
+ test ! -f threadleaktest$(EXEEXT) || ./threadleaktest$(EXEEXT)
+ test ! -f subthreadcreate_test$(EXEEXT) || ./subthreadcreate_test$(EXEEXT)
+ test ! -f test_cpp$(EXEEXT) || ./test_cpp$(EXEEXT)
+ test ! -f tracetest$(EXEEXT) || ./tracetest$(EXEEXT)
+ ./cordtest$(EXEEXT)
diff --git a/graphics/asymptote/gc/tests/thread_leak_test.c b/graphics/asymptote/gc/tests/thread_leak_test.c
new file mode 100644
index 0000000000..84fd79cd0f
--- /dev/null
+++ b/graphics/asymptote/gc/tests/thread_leak_test.c
@@ -0,0 +1,113 @@
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef GC_THREADS
+# define GC_THREADS
+#endif
+
+#undef GC_NO_THREAD_REDIRECTS
+#include "leak_detector.h"
+
+#ifdef GC_PTHREADS
+# include <errno.h> /* for EAGAIN */
+# include <pthread.h>
+#else
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+# endif
+# define NOSERVICE
+# include <windows.h>
+#endif /* !GC_PTHREADS */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define CHECK_OUT_OF_MEMORY(p) \
+ do { \
+ if (NULL == (p)) { \
+ fprintf(stderr, "Out of memory\n"); \
+ exit(69); \
+ } \
+ } while (0)
+
+#ifdef GC_PTHREADS
+ void * test(void * arg)
+#else
+ DWORD WINAPI test(LPVOID arg)
+#endif
+{
+ int *p[10];
+ int i;
+ for (i = 0; i < 10; ++i) {
+ p[i] = (int *)malloc(sizeof(int) + i);
+ CHECK_OUT_OF_MEMORY(p[i]);
+ }
+ CHECK_LEAKS();
+ for (i = 1; i < 10; ++i) {
+ free(p[i]);
+ }
+# ifdef GC_PTHREADS
+ return arg;
+# else
+ return (DWORD)(GC_word)arg;
+# endif
+}
+
+#ifndef NTHREADS
+# define NTHREADS 5
+#endif
+
+int main(void) {
+# if NTHREADS > 0
+ int i, n;
+# ifdef GC_PTHREADS
+ pthread_t t[NTHREADS];
+# else
+ HANDLE t[NTHREADS];
+ DWORD thread_id;
+# endif
+ int code;
+# endif
+
+ GC_set_find_leak(1); /* for new collect versions not compiled */
+ /* with -DFIND_LEAK. */
+ GC_INIT();
+
+# if NTHREADS > 0
+ for (i = 0; i < NTHREADS; ++i) {
+# ifdef GC_PTHREADS
+ code = pthread_create(t + i, 0, test, 0);
+# else
+ t[i] = CreateThread(NULL, 0, test, 0, 0, &thread_id);
+ code = t[i] != NULL ? 0 : (int)GetLastError();
+# endif
+ if (code != 0) {
+ fprintf(stderr, "Thread creation failed, errcode= %d\n", code);
+# ifdef GC_PTHREADS
+ if (i > 1 && EAGAIN == code) break;
+# endif
+ exit(2);
+ }
+ }
+ n = i;
+ for (i = 0; i < n; ++i) {
+# ifdef GC_PTHREADS
+ code = pthread_join(t[i], 0);
+# else
+ code = WaitForSingleObject(t[i], INFINITE) == WAIT_OBJECT_0 ? 0 :
+ (int)GetLastError();
+# endif
+ if (code != 0) {
+ fprintf(stderr, "Thread join failed, errcode= %d\n", code);
+ exit(2);
+ }
+ }
+# endif
+
+ CHECK_LEAKS();
+ CHECK_LEAKS();
+ CHECK_LEAKS();
+ return 0;
+}
diff --git a/graphics/asymptote/gc/tests/threadkey_test.c b/graphics/asymptote/gc/tests/threadkey_test.c
new file mode 100644
index 0000000000..ac01ccf7e4
--- /dev/null
+++ b/graphics/asymptote/gc/tests/threadkey_test.c
@@ -0,0 +1,119 @@
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef GC_THREADS
+# define GC_THREADS
+#endif
+
+#define GC_NO_THREAD_REDIRECTS 1
+
+#include "gc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if (!defined(GC_PTHREADS) || defined(GC_SOLARIS_THREADS) \
+ || defined(__native_client__)) && !defined(SKIP_THREADKEY_TEST)
+ /* FIXME: Skip this test on Solaris for now. The test may fail on */
+ /* other targets as well. Currently, tested only on Linux, Cygwin */
+ /* and Darwin. */
+# define SKIP_THREADKEY_TEST
+#endif
+
+#ifdef SKIP_THREADKEY_TEST
+
+int main(void)
+{
+ printf("threadkey_test skipped\n");
+ return 0;
+}
+
+#else
+
+#include <pthread.h>
+
+pthread_key_t key;
+
+#ifdef GC_SOLARIS_THREADS
+ /* pthread_once_t key_once = { PTHREAD_ONCE_INIT }; */
+#else
+ pthread_once_t key_once = PTHREAD_ONCE_INIT;
+#endif
+
+void * entry (void *arg)
+{
+ pthread_setspecific(key,
+ (void *)GC_HIDE_POINTER(GC_STRDUP("hello, world")));
+ return arg;
+}
+
+void * GC_CALLBACK on_thread_exit_inner (struct GC_stack_base * sb, void * arg)
+{
+ int res = GC_register_my_thread (sb);
+ pthread_t t;
+ int creation_res; /* Used to suppress a warning about */
+ /* unchecked pthread_create() result. */
+ pthread_attr_t attr;
+
+ if (pthread_attr_init(&attr) != 0
+ || pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0) {
+ fprintf(stderr, "Thread attribute init or setdetachstate failed\n");
+ exit(2);
+ }
+ creation_res = GC_pthread_create(&t, &attr, entry, NULL);
+ (void)pthread_attr_destroy(&attr);
+ if (res == GC_SUCCESS)
+ GC_unregister_my_thread ();
+
+ return arg ? (void*)(GC_word)creation_res : 0;
+}
+
+void on_thread_exit (void *v)
+{
+ GC_call_with_stack_base (on_thread_exit_inner, v);
+}
+
+void make_key (void)
+{
+ pthread_key_create (&key, on_thread_exit);
+}
+
+#ifndef NTHREADS
+# define NTHREADS 5
+#endif
+
+#define NTHREADS_INNER (NTHREADS * 6) /* number of threads to create */
+
+int main(void)
+{
+ int i;
+
+ GC_INIT();
+ if (GC_get_find_leak())
+ printf("This test program is not designed for leak detection mode\n");
+# ifdef GC_SOLARIS_THREADS
+ make_key();
+# else
+ pthread_once (&key_once, make_key);
+# endif
+ for (i = 0; i < NTHREADS_INNER; i++) {
+ pthread_t t;
+
+ if (GC_pthread_create(&t, NULL, entry, NULL) == 0) {
+ void *res;
+ int code = (i & 1) != 0 ? GC_pthread_join(t, &res)
+ : GC_pthread_detach(t);
+
+ if (code != 0) {
+ fprintf(stderr, "Thread %s failed, errno= %d\n",
+ (i & 1) != 0 ? "join" : "detach", code);
+ exit(2);
+ }
+ }
+ }
+ return 0;
+}
+
+#endif /* !SKIP_THREADKEY_TEST */
diff --git a/graphics/asymptote/gc/tests/trace_test.c b/graphics/asymptote/gc/tests/trace_test.c
new file mode 100644
index 0000000000..5db68e32a3
--- /dev/null
+++ b/graphics/asymptote/gc/tests/trace_test.c
@@ -0,0 +1,62 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef GC_DEBUG
+# define GC_DEBUG
+#endif
+
+#include "gc.h"
+#include "gc_backptr.h"
+
+#define CHECK_OUT_OF_MEMORY(p) \
+ do { \
+ if (NULL == (p)) { \
+ fprintf(stderr, "Out of memory\n"); \
+ exit(69); \
+ } \
+ } while (0)
+
+struct treenode {
+ struct treenode *x;
+ struct treenode *y;
+} *root[10];
+
+struct treenode * mktree(int i) {
+ struct treenode * r = GC_NEW(struct treenode);
+ struct treenode *x, *y;
+
+ CHECK_OUT_OF_MEMORY(r);
+ if (0 == i)
+ return NULL;
+ if (1 == i) {
+ r = (struct treenode *)GC_MALLOC_ATOMIC(sizeof(struct treenode));
+ CHECK_OUT_OF_MEMORY(r);
+ }
+ x = mktree(i - 1);
+ y = mktree(i - 1);
+ r -> x = x;
+ r -> y = y;
+ if (i != 1) {
+ GC_END_STUBBORN_CHANGE(r);
+ GC_reachable_here(x);
+ GC_reachable_here(y);
+ }
+ return r;
+}
+
+int main(void)
+{
+ int i;
+
+ GC_INIT();
+ if (GC_get_find_leak())
+ printf("This test program is not designed for leak detection mode\n");
+ for (i = 0; i < 10; ++i) {
+ root[i] = mktree(12);
+ }
+ GC_generate_random_backtrace();
+ GC_generate_random_backtrace();
+ GC_generate_random_backtrace();
+ GC_generate_random_backtrace();
+ return 0;
+}
diff --git a/graphics/asymptote/gc/thread_local_alloc.c b/graphics/asymptote/gc/thread_local_alloc.c
new file mode 100644
index 0000000000..5d07f08e06
--- /dev/null
+++ b/graphics/asymptote/gc/thread_local_alloc.c
@@ -0,0 +1,310 @@
+/*
+ * Copyright (c) 2000-2005 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+#if defined(THREAD_LOCAL_ALLOC)
+
+#ifndef THREADS
+# error "invalid config - THREAD_LOCAL_ALLOC requires GC_THREADS"
+#endif
+
+#include "private/thread_local_alloc.h"
+
+#include <stdlib.h>
+
+#if defined(USE_COMPILER_TLS)
+ __thread GC_ATTR_TLS_FAST
+#elif defined(USE_WIN32_COMPILER_TLS)
+ __declspec(thread) GC_ATTR_TLS_FAST
+#endif
+GC_key_t GC_thread_key;
+
+static GC_bool keys_initialized;
+
+/* Return a single nonempty freelist fl to the global one pointed to */
+/* by gfl. */
+
+static void return_single_freelist(void *fl, void **gfl)
+{
+ if (*gfl == 0) {
+ *gfl = fl;
+ } else {
+ void *q, **qptr;
+
+ GC_ASSERT(GC_size(fl) == GC_size(*gfl));
+ /* Concatenate: */
+ qptr = &(obj_link(fl));
+ while ((word)(q = *qptr) >= HBLKSIZE)
+ qptr = &(obj_link(q));
+ GC_ASSERT(0 == q);
+ *qptr = *gfl;
+ *gfl = fl;
+ }
+}
+
+/* Recover the contents of the freelist array fl into the global one gfl.*/
+/* We hold the allocator lock. */
+static void return_freelists(void **fl, void **gfl)
+{
+ int i;
+
+ for (i = 1; i < TINY_FREELISTS; ++i) {
+ if ((word)(fl[i]) >= HBLKSIZE) {
+ return_single_freelist(fl[i], &gfl[i]);
+ }
+ /* Clear fl[i], since the thread structure may hang around. */
+ /* Do it in a way that is likely to trap if we access it. */
+ fl[i] = (ptr_t)HBLKSIZE;
+ }
+ /* The 0 granule freelist really contains 1 granule objects. */
+# ifdef GC_GCJ_SUPPORT
+ if (fl[0] == ERROR_FL) return;
+# endif
+ if ((word)(fl[0]) >= HBLKSIZE) {
+ return_single_freelist(fl[0], &gfl[1]);
+ }
+}
+
+#ifdef USE_PTHREAD_SPECIFIC
+ /* Re-set the TLS value on thread cleanup to allow thread-local */
+ /* allocations to happen in the TLS destructors. */
+ /* GC_unregister_my_thread (and similar routines) will finally set */
+ /* the GC_thread_key to NULL preventing this destructor from being */
+ /* called repeatedly. */
+ static void reset_thread_key(void* v) {
+ pthread_setspecific(GC_thread_key, v);
+ }
+#else
+# define reset_thread_key 0
+#endif
+
+/* Each thread structure must be initialized. */
+/* This call must be made from the new thread. */
+GC_INNER void GC_init_thread_local(GC_tlfs p)
+{
+ int i, j, res;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (!EXPECT(keys_initialized, TRUE)) {
+# ifdef USE_CUSTOM_SPECIFIC
+ /* Ensure proper alignment of a "pushed" GC symbol. */
+ GC_ASSERT((word)&GC_thread_key % sizeof(word) == 0);
+# endif
+ res = GC_key_create(&GC_thread_key, reset_thread_key);
+ if (COVERT_DATAFLOW(res) != 0) {
+ ABORT("Failed to create key for local allocator");
+ }
+ keys_initialized = TRUE;
+ }
+ res = GC_setspecific(GC_thread_key, p);
+ if (COVERT_DATAFLOW(res) != 0) {
+ ABORT("Failed to set thread specific allocation pointers");
+ }
+ for (j = 0; j < TINY_FREELISTS; ++j) {
+ for (i = 0; i < THREAD_FREELISTS_KINDS; ++i) {
+ p -> _freelists[i][j] = (void *)(word)1;
+ }
+# ifdef GC_GCJ_SUPPORT
+ p -> gcj_freelists[j] = (void *)(word)1;
+# endif
+ }
+ /* The size 0 free lists are handled like the regular free lists, */
+ /* to ensure that the explicit deallocation works. However, */
+ /* allocation of a size 0 "gcj" object is always an error. */
+# ifdef GC_GCJ_SUPPORT
+ p -> gcj_freelists[0] = ERROR_FL;
+# endif
+}
+
+/* We hold the allocator lock. */
+GC_INNER void GC_destroy_thread_local(GC_tlfs p)
+{
+ int k;
+
+ /* We currently only do this from the thread itself. */
+ GC_STATIC_ASSERT(THREAD_FREELISTS_KINDS <= MAXOBJKINDS);
+ for (k = 0; k < THREAD_FREELISTS_KINDS; ++k) {
+ if (k == (int)GC_n_kinds)
+ break; /* kind is not created */
+ return_freelists(p -> _freelists[k], GC_obj_kinds[k].ok_freelist);
+ }
+# ifdef GC_GCJ_SUPPORT
+ return_freelists(p -> gcj_freelists, (void **)GC_gcjobjfreelist);
+# endif
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_kind(size_t bytes, int kind)
+{
+ size_t granules;
+ void *tsd;
+ void *result;
+
+# if MAXOBJKINDS > THREAD_FREELISTS_KINDS
+ if (EXPECT(kind >= THREAD_FREELISTS_KINDS, FALSE)) {
+ return GC_malloc_kind_global(bytes, kind);
+ }
+# endif
+# if !defined(USE_PTHREAD_SPECIFIC) && !defined(USE_WIN32_SPECIFIC)
+ {
+ GC_key_t k = GC_thread_key;
+
+ if (EXPECT(0 == k, FALSE)) {
+ /* We haven't yet run GC_init_parallel. That means */
+ /* we also aren't locking, so this is fairly cheap. */
+ return GC_malloc_kind_global(bytes, kind);
+ }
+ tsd = GC_getspecific(k);
+ }
+# else
+ if (!EXPECT(keys_initialized, TRUE))
+ return GC_malloc_kind_global(bytes, kind);
+ tsd = GC_getspecific(GC_thread_key);
+# endif
+# if !defined(USE_COMPILER_TLS) && !defined(USE_WIN32_COMPILER_TLS)
+ if (EXPECT(0 == tsd, FALSE)) {
+ return GC_malloc_kind_global(bytes, kind);
+ }
+# endif
+ GC_ASSERT(GC_is_initialized);
+ GC_ASSERT(GC_is_thread_tsd_valid(tsd));
+ granules = ROUNDED_UP_GRANULES(bytes);
+# if defined(CPPCHECK)
+# define MALLOC_KIND_PTRFREE_INIT (void*)1
+# else
+# define MALLOC_KIND_PTRFREE_INIT NULL
+# endif
+ GC_FAST_MALLOC_GRANS(result, granules,
+ ((GC_tlfs)tsd) -> _freelists[kind], DIRECT_GRANULES,
+ kind, GC_malloc_kind_global(bytes, kind),
+ (void)(kind == PTRFREE ? MALLOC_KIND_PTRFREE_INIT
+ : (obj_link(result) = 0)));
+# ifdef LOG_ALLOCS
+ GC_log_printf("GC_malloc_kind(%lu, %d) returned %p, recent GC #%lu\n",
+ (unsigned long)bytes, kind, result,
+ (unsigned long)GC_gc_no);
+# endif
+ return result;
+}
+
+#ifdef GC_GCJ_SUPPORT
+
+# include "gc_gcj.h"
+
+/* Gcj-style allocation without locks is extremely tricky. The */
+/* fundamental issue is that we may end up marking a free list, which */
+/* has freelist links instead of "vtable" pointers. That is usually */
+/* OK, since the next object on the free list will be cleared, and */
+/* will thus be interpreted as containing a zero descriptor. That's */
+/* fine if the object has not yet been initialized. But there are */
+/* interesting potential races. */
+/* In the case of incremental collection, this seems hopeless, since */
+/* the marker may run asynchronously, and may pick up the pointer to */
+/* the next freelist entry (which it thinks is a vtable pointer), get */
+/* suspended for a while, and then see an allocated object instead */
+/* of the vtable. This may be avoidable with either a handshake with */
+/* the collector or, probably more easily, by moving the free list */
+/* links to the second word of each object. The latter isn't a */
+/* universal win, since on architecture like Itanium, nonzero offsets */
+/* are not necessarily free. And there may be cache fill order issues. */
+/* For now, we punt with incremental GC. This probably means that */
+/* incremental GC should be enabled before we fork a second thread. */
+/* Unlike the other thread local allocation calls, we assume that the */
+/* collector has been explicitly initialized. */
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_gcj_malloc(size_t bytes,
+ void * ptr_to_struct_containing_descr)
+{
+ if (EXPECT(GC_incremental, FALSE)) {
+ return GC_core_gcj_malloc(bytes, ptr_to_struct_containing_descr);
+ } else {
+ size_t granules = ROUNDED_UP_GRANULES(bytes);
+ void *result;
+ void **tiny_fl;
+
+ GC_ASSERT(GC_gcjobjfreelist != NULL);
+ tiny_fl = ((GC_tlfs)GC_getspecific(GC_thread_key))->gcj_freelists;
+ GC_FAST_MALLOC_GRANS(result, granules, tiny_fl, DIRECT_GRANULES,
+ GC_gcj_kind,
+ GC_core_gcj_malloc(bytes,
+ ptr_to_struct_containing_descr),
+ {AO_compiler_barrier();
+ *(void **)result = ptr_to_struct_containing_descr;});
+ /* This forces the initialization of the "method ptr". */
+ /* This is necessary to ensure some very subtle properties */
+ /* required if a GC is run in the middle of such an allocation. */
+ /* Here we implicitly also assume atomicity for the free list. */
+ /* and method pointer assignments. */
+ /* We must update the freelist before we store the pointer. */
+ /* Otherwise a GC at this point would see a corrupted */
+ /* free list. */
+ /* A real memory barrier is not needed, since the */
+ /* action of stopping this thread will cause prior writes */
+ /* to complete. */
+ /* We assert that any concurrent marker will stop us. */
+ /* Thus it is impossible for a mark procedure to see the */
+ /* allocation of the next object, but to see this object */
+ /* still containing a free list pointer. Otherwise the */
+ /* marker, by misinterpreting the freelist link as a vtable */
+ /* pointer, might find a random "mark descriptor" in the next */
+ /* object. */
+ return result;
+ }
+}
+
+#endif /* GC_GCJ_SUPPORT */
+
+/* The thread support layer must arrange to mark thread-local */
+/* free lists explicitly, since the link field is often */
+/* invisible to the marker. It knows how to find all threads; */
+/* we take care of an individual thread freelist structure. */
+GC_INNER void GC_mark_thread_local_fls_for(GC_tlfs p)
+{
+ ptr_t q;
+ int i, j;
+
+ for (j = 0; j < TINY_FREELISTS; ++j) {
+ for (i = 0; i < THREAD_FREELISTS_KINDS; ++i) {
+ /* Load the pointer atomically as it might be updated */
+ /* concurrently by GC_FAST_MALLOC_GRANS. */
+ q = (ptr_t)AO_load((volatile AO_t *)&p->_freelists[i][j]);
+ if ((word)q > HBLKSIZE)
+ GC_set_fl_marks(q);
+ }
+# ifdef GC_GCJ_SUPPORT
+ if (EXPECT(j > 0, TRUE)) {
+ q = (ptr_t)AO_load((volatile AO_t *)&p->gcj_freelists[j]);
+ if ((word)q > HBLKSIZE)
+ GC_set_fl_marks(q);
+ }
+# endif
+ }
+}
+
+#if defined(GC_ASSERTIONS)
+ /* Check that all thread-local free-lists in p are completely marked. */
+ void GC_check_tls_for(GC_tlfs p)
+ {
+ int i, j;
+
+ for (j = 1; j < TINY_FREELISTS; ++j) {
+ for (i = 0; i < THREAD_FREELISTS_KINDS; ++i) {
+ GC_check_fl_marks(&p->_freelists[i][j]);
+ }
+# ifdef GC_GCJ_SUPPORT
+ GC_check_fl_marks(&p->gcj_freelists[j]);
+# endif
+ }
+ }
+#endif /* GC_ASSERTIONS */
+
+#endif /* THREAD_LOCAL_ALLOC */
diff --git a/graphics/asymptote/gc/tools/callprocs.sh b/graphics/asymptote/gc/tools/callprocs.sh
new file mode 100755
index 0000000000..a8793f0b72
--- /dev/null
+++ b/graphics/asymptote/gc/tools/callprocs.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+GC_DEBUG=1
+export GC_DEBUG
+$* 2>&1 | awk '{print "0x3e=c\""$0"\""};/^\t##PC##=/ {if ($2 != 0) {print $2"?i"}}' | adb $1 | sed "s/^ >/>/"
diff --git a/graphics/asymptote/gc/tools/if_mach.c b/graphics/asymptote/gc/tools/if_mach.c
new file mode 100644
index 0000000000..2ddad6f2e3
--- /dev/null
+++ b/graphics/asymptote/gc/tools/if_mach.c
@@ -0,0 +1,32 @@
+/* Conditionally execute a command based on machine and OS from gcconfig.h */
+
+# include "private/gc_priv.h"
+# include <stdio.h>
+# include <string.h>
+# include <unistd.h>
+
+#ifdef __cplusplus
+# define EXECV_ARGV_T char**
+#else
+ /* The 2nd argument of execvp() prototype may be either char**, or */
+ /* char* const*, or const char* const*. */
+# define EXECV_ARGV_T void*
+#endif
+
+int main(int argc, char **argv)
+{
+ if (argc < 4) goto Usage;
+ if (strcmp(MACH_TYPE, argv[1]) != 0) return(0);
+ if (strlen(OS_TYPE) > 0 && strlen(argv[2]) > 0
+ && strcmp(OS_TYPE, argv[2]) != 0) return(0);
+ fprintf(stderr, "^^^^Starting command^^^^\n");
+ fflush(stdout);
+ execvp(TRUSTED_STRING(argv[3]), (EXECV_ARGV_T)(argv + 3));
+ perror("Couldn't execute");
+
+Usage:
+ fprintf(stderr, "Usage: %s mach_type os_type command\n", argv[0]);
+ fprintf(stderr, "Currently mach_type = %s, os_type = %s\n",
+ MACH_TYPE, OS_TYPE);
+ return(1);
+}
diff --git a/graphics/asymptote/gc/tools/if_not_there.c b/graphics/asymptote/gc/tools/if_not_there.c
new file mode 100644
index 0000000000..d388d04b58
--- /dev/null
+++ b/graphics/asymptote/gc/tools/if_not_there.c
@@ -0,0 +1,58 @@
+/* Conditionally execute the command argv[2] based if the file argv[1] */
+/* does not exist. If the command is omitted (and the file does not */
+/* exist) then just exit with a non-zero code. */
+
+# include "private/gc_priv.h"
+# include <stdio.h>
+# include <stdlib.h>
+# include <unistd.h>
+#ifdef __DJGPP__
+#include <dirent.h>
+#endif /* __DJGPP__ */
+
+#ifdef __cplusplus
+# define EXECV_ARGV_T char**
+#else
+# define EXECV_ARGV_T void* /* see the comment in if_mach.c */
+#endif
+
+int main(int argc, char **argv)
+{
+ FILE * f;
+#ifdef __DJGPP__
+ DIR * d;
+#endif /* __DJGPP__ */
+ char *fname;
+
+ if (argc < 2 || argc > 3)
+ goto Usage;
+
+ fname = TRUSTED_STRING(argv[1]);
+ f = fopen(fname, "rb");
+ if (f != NULL) {
+ fclose(f);
+ return(0);
+ }
+ f = fopen(fname, "r");
+ if (f != NULL) {
+ fclose(f);
+ return(0);
+ }
+#ifdef __DJGPP__
+ if ((d = opendir(fname)) != 0) {
+ closedir(d);
+ return(0);
+ }
+#endif
+ printf("^^^^Starting command^^^^\n");
+ fflush(stdout);
+ if (argc == 2)
+ return(2); /* the file does not exist but no command is given */
+
+ execvp(TRUSTED_STRING(argv[2]), (EXECV_ARGV_T)(argv + 2));
+ exit(1);
+
+Usage:
+ fprintf(stderr, "Usage: %s file_name [command]\n", argv[0]);
+ return(1);
+}
diff --git a/graphics/asymptote/gc/tools/setjmp_t.c b/graphics/asymptote/gc/tools/setjmp_t.c
new file mode 100644
index 0000000000..b2ae60d5c5
--- /dev/null
+++ b/graphics/asymptote/gc/tools/setjmp_t.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/* Check whether setjmp actually saves registers in jmp_buf. */
+/* If it doesn't, the generic mark_regs code won't work. */
+/* Compilers vary as to whether they will put x in a */
+/* (callee-save) register without -O. The code is */
+/* contrived such that any decent compiler should put x in */
+/* a callee-save register with -O. Thus it is */
+/* recommended that this be run optimized. (If the machine */
+/* has no callee-save registers, then the generic code is */
+/* safe, but this will not be noticed by this piece of */
+/* code.) This test appears to be far from perfect. */
+#include <stdio.h>
+#include <setjmp.h>
+#include <string.h>
+#include "private/gc_priv.h"
+
+#ifdef OS2
+/* GETPAGESIZE() is set to getpagesize() by default, but that */
+/* doesn't really exist, and the collector doesn't need it. */
+#define INCL_DOSFILEMGR
+#define INCL_DOSMISC
+#define INCL_DOSERRORS
+#include <os2.h>
+
+int getpagesize(void)
+{
+ ULONG result[1];
+
+ if (DosQuerySysInfo(QSV_PAGE_SIZE, QSV_PAGE_SIZE,
+ (void *)result, sizeof(ULONG)) != NO_ERROR) {
+ fprintf(stderr, "DosQuerySysInfo failed\n");
+ result[0] = 4096;
+ }
+ return((int)(result[0]));
+}
+
+#elif defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
+ int getpagesize(void)
+ {
+ SYSTEM_INFO sysinfo;
+ GetSystemInfo(&sysinfo);
+ return sysinfo.dwPageSize;
+ }
+#endif
+
+struct a_s {
+ char a_a;
+ char * a_b;
+} a;
+
+word nested_sp(void)
+{
+# if GC_GNUC_PREREQ(4, 0)
+ return (word)__builtin_frame_address(0);
+# else
+ volatile word sp;
+ sp = (word)(&sp);
+ return sp;
+# endif
+}
+
+/* To prevent nested_sp inlining. */
+word (*volatile nested_sp_fn)(void) = nested_sp;
+
+int g(int x);
+
+#if defined(CPPCHECK) || !defined(__cplusplus)
+ const char *a_str = "a";
+#else
+# define a_str "a"
+#endif
+
+int main(void)
+{
+ volatile word sp;
+ unsigned ps = GETPAGESIZE();
+ JMP_BUF b;
+# if (!defined(__cplusplus) || __cplusplus < 201703L /* before c++17 */) \
+ && (!defined(__GNUC__) || defined(__OPTIMIZE__))
+ register
+# endif
+ int x = (int)strlen(a_str); /* 1, slightly disguised */
+ static volatile int y = 0;
+
+ sp = (word)(&sp);
+ printf("This appears to be a %s running %s\n", MACH_TYPE, OS_TYPE);
+# if defined(CPPCHECK)
+ (void)nested_sp(); /* to workaround a bug in cppcheck */
+# endif
+ if (nested_sp_fn() < sp) {
+ printf("Stack appears to grow down, which is the default.\n");
+ printf("A good guess for STACKBOTTOM on this machine is 0x%lx.\n",
+ ((unsigned long)sp + ps) & ~(unsigned long)(ps-1));
+ } else {
+ printf("Stack appears to grow up.\n");
+ printf("Define STACK_GROWS_UP in gc_priv.h\n");
+ printf("A good guess for STACKBOTTOM on this machine is 0x%lx.\n",
+ (unsigned long)sp & ~(unsigned long)(ps-1)); /* round down */
+ }
+ printf("Note that this may vary between machines of ostensibly\n");
+ printf("the same architecture (e.g. Sun 3/50s and 3/80s).\n");
+ printf("On many machines the value is not fixed.\n");
+ printf("A good guess for ALIGNMENT on this machine is %lu.\n",
+ (unsigned long)((word)(&(a.a_b)) - (word)(&a)));
+
+ printf("The following is a very dubious test of one root marking"
+ " strategy.\n");
+ printf("Results may not be accurate/useful:\n");
+ /* Encourage the compiler to keep x in a callee-save register */
+ x = 2*x-1;
+ printf("\n");
+ x = 2*x-1;
+ (void)SETJMP(b);
+ if (y == 1) {
+ if (x == 2) {
+ printf("Setjmp-based generic mark_regs code probably won't work.\n");
+ printf("But we rarely try that anymore. If you have getcontect()\n");
+ printf("this probably doesn't matter.\n");
+ } else if (x == 1) {
+ printf("Setjmp-based register marking code may work.\n");
+ } else {
+ printf("Very strange setjmp implementation.\n");
+ }
+ }
+ y++;
+ x = 2;
+ if (y == 1) LONGJMP(b, 1);
+ printf("Some GC internal configuration stuff: \n");
+ printf("\tWORDSZ = %lu, ALIGNMENT = %d, GC_GRANULE_BYTES = %d\n",
+ (unsigned long)WORDSZ, ALIGNMENT, GC_GRANULE_BYTES);
+ printf("\tUsing one mark ");
+# if defined(USE_MARK_BYTES)
+ printf("byte");
+# else
+ printf("bit");
+# endif
+ printf(" per ");
+# if defined(MARK_BIT_PER_OBJ)
+ printf("object.\n");
+# elif defined(MARK_BIT_PER_GRANULE)
+ printf("granule.\n");
+# endif
+# ifdef THREAD_LOCAL_ALLOC
+ printf("Thread local allocation enabled.\n");
+# endif
+# ifdef PARALLEL_MARK
+ printf("Parallel marking enabled.\n");
+# endif
+ (void)g(x);
+ return(0);
+}
+
+int g(int x)
+{
+ return(x);
+}
diff --git a/graphics/asymptote/gc/tools/threadlibs.c b/graphics/asymptote/gc/tools/threadlibs.c
new file mode 100644
index 0000000000..983b487e0d
--- /dev/null
+++ b/graphics/asymptote/gc/tools/threadlibs.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2010 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+# include "private/gc_priv.h"
+
+# include <stdio.h>
+
+int main(void)
+{
+# if defined(GC_USE_LD_WRAP)
+ printf("-Wl,--wrap -Wl,dlopen "
+ "-Wl,--wrap -Wl,pthread_create -Wl,--wrap -Wl,pthread_join "
+ "-Wl,--wrap -Wl,pthread_detach -Wl,--wrap -Wl,pthread_sigmask "
+ "-Wl,--wrap -Wl,pthread_exit -Wl,--wrap -Wl,pthread_cancel\n");
+# endif
+# if (defined(GC_LINUX_THREADS) && !defined(HOST_ANDROID)) \
+ || defined(GC_IRIX_THREADS) || defined(GC_DARWIN_THREADS) \
+ || defined(GC_AIX_THREADS) || (defined(HURD) && defined(GC_THREADS))
+# ifdef GC_USE_DLOPEN_WRAP
+ printf("-ldl ");
+# endif
+ printf("-lpthread\n");
+# endif
+# if defined(GC_OPENBSD_THREADS)
+ printf("-pthread\n");
+# endif
+# if defined(GC_FREEBSD_THREADS)
+# ifdef GC_USE_DLOPEN_WRAP
+ printf("-ldl ");
+# endif
+# if (__FREEBSD_version < 500000)
+ printf("-pthread\n");
+# else /* __FREEBSD__ || __DragonFly__ */
+ printf("-lpthread\n");
+# endif
+# endif
+# if defined(GC_NETBSD_THREADS)
+ printf("-lpthread -lrt\n");
+# endif
+
+# if defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS)
+ printf("-lpthread -lrt\n");
+# endif
+# if defined(GC_SOLARIS_THREADS)
+ printf("-lthread -lposix4\n");
+ /* Is this right for recent versions? */
+# endif
+# if defined(GC_WIN32_THREADS) && defined(CYGWIN32)
+ printf("-lpthread\n");
+# endif
+# if defined(GC_WIN32_PTHREADS)
+# ifdef PTW32_STATIC_LIB
+ /* assume suffix s for static version of the pthreads-win32 library */
+ printf("-lpthreadGC2s -lws2_32\n");
+# else
+ printf("-lpthreadGC2\n");
+# endif
+# endif
+# if defined(GC_OSF1_THREADS)
+ printf("-pthread -lrt\n"); /* DOB: must be -pthread, not -lpthread */
+# endif
+ /* You need GCC 3.0.3 to build this one! */
+ /* DG/UX native gcc doesn't know what "-pthread" is */
+# if defined(GC_DGUX386_THREADS)
+ printf("-ldl -pthread\n");
+# endif
+ return 0;
+}
diff --git a/graphics/asymptote/gc/typd_mlc.c b/graphics/asymptote/gc/typd_mlc.c
new file mode 100644
index 0000000000..c5b8ae0e8e
--- /dev/null
+++ b/graphics/asymptote/gc/typd_mlc.c
@@ -0,0 +1,730 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1999-2000 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#include "private/gc_pmark.h"
+#include "gc_inline.h" /* for GC_malloc_kind */
+
+/*
+ * Some simple primitives for allocation with explicit type information.
+ * Simple objects are allocated such that they contain a GC_descr at the
+ * end (in the last allocated word). This descriptor may be a procedure
+ * which then examines an extended descriptor passed as its environment.
+ *
+ * Arrays are treated as simple objects if they have sufficiently simple
+ * structure. Otherwise they are allocated from an array kind that supplies
+ * a special mark procedure. These arrays contain a pointer to a
+ * complex_descriptor as their last word.
+ * This is done because the environment field is too small, and the collector
+ * must trace the complex_descriptor.
+ *
+ * Note that descriptors inside objects may appear cleared, if we encounter a
+ * false reference to an object on a free list. In the GC_descr case, this
+ * is OK, since a 0 descriptor corresponds to examining no fields.
+ * In the complex_descriptor case, we explicitly check for that case.
+ *
+ * MAJOR PARTS OF THIS CODE HAVE NOT BEEN TESTED AT ALL and are not testable,
+ * since they are not accessible through the current interface.
+ */
+
+#include "gc_typed.h"
+
+#define TYPD_EXTRA_BYTES (sizeof(word) - EXTRA_BYTES)
+
+STATIC int GC_explicit_kind = 0;
+ /* Object kind for objects with indirect */
+ /* (possibly extended) descriptors. */
+
+STATIC int GC_array_kind = 0;
+ /* Object kind for objects with complex */
+ /* descriptors and GC_array_mark_proc. */
+
+/* Array descriptors. GC_array_mark_proc understands these. */
+/* We may eventually need to add provisions for headers and */
+/* trailers. Hence we provide for tree structured descriptors, */
+/* though we don't really use them currently. */
+
+struct LeafDescriptor { /* Describes simple array. */
+ word ld_tag;
+# define LEAF_TAG 1
+ size_t ld_size; /* bytes per element */
+ /* multiple of ALIGNMENT. */
+ size_t ld_nelements; /* Number of elements. */
+ GC_descr ld_descriptor; /* A simple length, bitmap, */
+ /* or procedure descriptor. */
+};
+
+struct ComplexArrayDescriptor {
+ word ad_tag;
+# define ARRAY_TAG 2
+ size_t ad_nelements;
+ union ComplexDescriptor * ad_element_descr;
+};
+
+struct SequenceDescriptor {
+ word sd_tag;
+# define SEQUENCE_TAG 3
+ union ComplexDescriptor * sd_first;
+ union ComplexDescriptor * sd_second;
+};
+
+typedef union ComplexDescriptor {
+ struct LeafDescriptor ld;
+ struct ComplexArrayDescriptor ad;
+ struct SequenceDescriptor sd;
+} complex_descriptor;
+#define TAG ad.ad_tag
+
+#define ED_INITIAL_SIZE 100
+
+STATIC int GC_typed_mark_proc_index = 0; /* Indices of my mark */
+STATIC int GC_array_mark_proc_index = 0; /* procedures. */
+
+STATIC void GC_push_typed_structures_proc(void)
+{
+ GC_PUSH_ALL_SYM(GC_ext_descriptors);
+}
+
+/* Add a multiword bitmap to GC_ext_descriptors arrays. Return */
+/* starting index. */
+/* Returns -1 on failure. */
+/* Caller does not hold allocation lock. */
+STATIC signed_word GC_add_ext_descriptor(const word * bm, word nbits)
+{
+ size_t nwords = divWORDSZ(nbits + WORDSZ-1);
+ signed_word result;
+ size_t i;
+ word last_part;
+ size_t extra_bits;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ while (GC_avail_descr + nwords >= GC_ed_size) {
+ typed_ext_descr_t *newExtD;
+ size_t new_size;
+ word ed_size = GC_ed_size;
+
+ if (ed_size == 0) {
+ GC_ASSERT((word)(&GC_ext_descriptors) % sizeof(word) == 0);
+ GC_push_typed_structures = GC_push_typed_structures_proc;
+ UNLOCK();
+ new_size = ED_INITIAL_SIZE;
+ } else {
+ UNLOCK();
+ new_size = 2 * ed_size;
+ if (new_size > MAX_ENV) return(-1);
+ }
+ newExtD = (typed_ext_descr_t*)GC_malloc_atomic(new_size
+ * sizeof(typed_ext_descr_t));
+ if (NULL == newExtD)
+ return -1;
+ LOCK();
+ if (ed_size == GC_ed_size) {
+ if (GC_avail_descr != 0) {
+ BCOPY(GC_ext_descriptors, newExtD,
+ GC_avail_descr * sizeof(typed_ext_descr_t));
+ }
+ GC_ed_size = new_size;
+ GC_ext_descriptors = newExtD;
+ } /* else another thread already resized it in the meantime */
+ }
+ result = GC_avail_descr;
+ for (i = 0; i < nwords-1; i++) {
+ GC_ext_descriptors[result + i].ed_bitmap = bm[i];
+ GC_ext_descriptors[result + i].ed_continued = TRUE;
+ }
+ last_part = bm[i];
+ /* Clear irrelevant bits. */
+ extra_bits = nwords * WORDSZ - nbits;
+ last_part <<= extra_bits;
+ last_part >>= extra_bits;
+ GC_ext_descriptors[result + i].ed_bitmap = last_part;
+ GC_ext_descriptors[result + i].ed_continued = FALSE;
+ GC_avail_descr += nwords;
+ UNLOCK();
+ return(result);
+}
+
+/* Table of bitmap descriptors for n word long all pointer objects. */
+STATIC GC_descr GC_bm_table[WORDSZ/2];
+
+/* Return a descriptor for the concatenation of 2 nwords long objects, */
+/* each of which is described by descriptor. */
+/* The result is known to be short enough to fit into a bitmap */
+/* descriptor. */
+/* Descriptor is a GC_DS_LENGTH or GC_DS_BITMAP descriptor. */
+STATIC GC_descr GC_double_descr(GC_descr descriptor, word nwords)
+{
+ if ((descriptor & GC_DS_TAGS) == GC_DS_LENGTH) {
+ descriptor = GC_bm_table[BYTES_TO_WORDS((word)descriptor)];
+ }
+ descriptor |= (descriptor & ~(GC_descr)GC_DS_TAGS) >> nwords;
+ return(descriptor);
+}
+
+STATIC complex_descriptor *
+GC_make_sequence_descriptor(complex_descriptor *first,
+ complex_descriptor *second);
+
+/* Build a descriptor for an array with nelements elements, */
+/* each of which can be described by a simple descriptor. */
+/* We try to optimize some common cases. */
+/* If the result is COMPLEX, then a complex_descr* is returned */
+/* in *complex_d. */
+/* If the result is LEAF, then we built a LeafDescriptor in */
+/* the structure pointed to by leaf. */
+/* The tag in the leaf structure is not set. */
+/* If the result is SIMPLE, then a GC_descr */
+/* is returned in *simple_d. */
+/* If the result is NO_MEM, then */
+/* we failed to allocate the descriptor. */
+/* The implementation knows that GC_DS_LENGTH is 0. */
+/* *leaf, *complex_d, and *simple_d may be used as temporaries */
+/* during the construction. */
+#define COMPLEX 2
+#define LEAF 1
+#define SIMPLE 0
+#define NO_MEM (-1)
+STATIC int GC_make_array_descriptor(size_t nelements, size_t size,
+ GC_descr descriptor, GC_descr *simple_d,
+ complex_descriptor **complex_d,
+ struct LeafDescriptor * leaf)
+{
+# define OPT_THRESHOLD 50
+ /* For larger arrays, we try to combine descriptors of adjacent */
+ /* descriptors to speed up marking, and to reduce the amount */
+ /* of space needed on the mark stack. */
+ if ((descriptor & GC_DS_TAGS) == GC_DS_LENGTH) {
+ if (descriptor == (GC_descr)size) {
+ *simple_d = nelements * descriptor; /* no overflow */
+ return(SIMPLE);
+ } else if ((word)descriptor == 0) {
+ *simple_d = (GC_descr)0;
+ return(SIMPLE);
+ }
+ }
+ if (nelements <= OPT_THRESHOLD) {
+ if (nelements <= 1) {
+ if (nelements == 1) {
+ *simple_d = descriptor;
+ return(SIMPLE);
+ } else {
+ *simple_d = (GC_descr)0;
+ return(SIMPLE);
+ }
+ }
+ } else if (size <= BITMAP_BITS/2
+ && (descriptor & GC_DS_TAGS) != GC_DS_PROC
+ && (size & (sizeof(word)-1)) == 0) {
+ int result =
+ GC_make_array_descriptor(nelements/2, 2*size,
+ GC_double_descr(descriptor,
+ BYTES_TO_WORDS(size)),
+ simple_d, complex_d, leaf);
+ if ((nelements & 1) == 0) {
+ return(result);
+ } else {
+ struct LeafDescriptor * one_element =
+ (struct LeafDescriptor *)
+ GC_malloc_atomic(sizeof(struct LeafDescriptor));
+
+ if (result == NO_MEM || one_element == 0) return(NO_MEM);
+ one_element -> ld_tag = LEAF_TAG;
+ one_element -> ld_size = size;
+ one_element -> ld_nelements = 1;
+ one_element -> ld_descriptor = descriptor;
+ switch(result) {
+ case SIMPLE:
+ {
+ struct LeafDescriptor * beginning =
+ (struct LeafDescriptor *)
+ GC_malloc_atomic(sizeof(struct LeafDescriptor));
+ if (beginning == 0) return(NO_MEM);
+ beginning -> ld_tag = LEAF_TAG;
+ beginning -> ld_size = size;
+ beginning -> ld_nelements = 1;
+ beginning -> ld_descriptor = *simple_d;
+ *complex_d = GC_make_sequence_descriptor(
+ (complex_descriptor *)beginning,
+ (complex_descriptor *)one_element);
+ break;
+ }
+ case LEAF:
+ {
+ struct LeafDescriptor * beginning =
+ (struct LeafDescriptor *)
+ GC_malloc_atomic(sizeof(struct LeafDescriptor));
+ if (beginning == 0) return(NO_MEM);
+ beginning -> ld_tag = LEAF_TAG;
+ beginning -> ld_size = leaf -> ld_size;
+ beginning -> ld_nelements = leaf -> ld_nelements;
+ beginning -> ld_descriptor = leaf -> ld_descriptor;
+ *complex_d = GC_make_sequence_descriptor(
+ (complex_descriptor *)beginning,
+ (complex_descriptor *)one_element);
+ break;
+ }
+ case COMPLEX:
+ *complex_d = GC_make_sequence_descriptor(
+ *complex_d,
+ (complex_descriptor *)one_element);
+ break;
+ }
+ if (EXPECT(NULL == *complex_d, FALSE)) return NO_MEM;
+
+ return(COMPLEX);
+ }
+ }
+
+ leaf -> ld_size = size;
+ leaf -> ld_nelements = nelements;
+ leaf -> ld_descriptor = descriptor;
+ return(LEAF);
+}
+
+STATIC complex_descriptor *
+GC_make_sequence_descriptor(complex_descriptor *first,
+ complex_descriptor *second)
+{
+ struct SequenceDescriptor * result =
+ (struct SequenceDescriptor *)
+ GC_malloc(sizeof(struct SequenceDescriptor));
+ /* Can't result in overly conservative marking, since tags are */
+ /* very small integers. Probably faster than maintaining type */
+ /* info. */
+ if (result != 0) {
+ result -> sd_tag = SEQUENCE_TAG;
+ result -> sd_first = first;
+ result -> sd_second = second;
+ GC_dirty(result);
+ REACHABLE_AFTER_DIRTY(first);
+ REACHABLE_AFTER_DIRTY(second);
+ }
+ return((complex_descriptor *)result);
+}
+
+STATIC mse * GC_typed_mark_proc(word * addr, mse * mark_stack_ptr,
+ mse * mark_stack_limit, word env);
+
+STATIC mse * GC_array_mark_proc(word * addr, mse * mark_stack_ptr,
+ mse * mark_stack_limit, word env);
+
+STATIC void GC_init_explicit_typing(void)
+{
+ unsigned i;
+
+ GC_STATIC_ASSERT(sizeof(struct LeafDescriptor) % sizeof(word) == 0);
+ /* Set up object kind with simple indirect descriptor. */
+ GC_explicit_kind = GC_new_kind_inner(GC_new_free_list_inner(),
+ (WORDS_TO_BYTES((word)-1) | GC_DS_PER_OBJECT),
+ TRUE, TRUE);
+ /* Descriptors are in the last word of the object. */
+ GC_typed_mark_proc_index = GC_new_proc_inner(GC_typed_mark_proc);
+ /* Set up object kind with array descriptor. */
+ GC_array_mark_proc_index = GC_new_proc_inner(GC_array_mark_proc);
+ GC_array_kind = GC_new_kind_inner(GC_new_free_list_inner(),
+ GC_MAKE_PROC(GC_array_mark_proc_index, 0),
+ FALSE, TRUE);
+ GC_bm_table[0] = GC_DS_BITMAP;
+ for (i = 1; i < WORDSZ/2; i++) {
+ GC_bm_table[i] = (((word)-1) << (WORDSZ - i)) | GC_DS_BITMAP;
+ }
+}
+
+STATIC mse * GC_typed_mark_proc(word * addr, mse * mark_stack_ptr,
+ mse * mark_stack_limit, word env)
+{
+ word bm = GC_ext_descriptors[env].ed_bitmap;
+ word * current_p = addr;
+ word current;
+ ptr_t greatest_ha = (ptr_t)GC_greatest_plausible_heap_addr;
+ ptr_t least_ha = (ptr_t)GC_least_plausible_heap_addr;
+ DECLARE_HDR_CACHE;
+
+ INIT_HDR_CACHE;
+ for (; bm != 0; bm >>= 1, current_p++) {
+ if (bm & 1) {
+ current = *current_p;
+ FIXUP_POINTER(current);
+ if (current >= (word)least_ha && current <= (word)greatest_ha) {
+ PUSH_CONTENTS((ptr_t)current, mark_stack_ptr,
+ mark_stack_limit, (ptr_t)current_p);
+ }
+ }
+ }
+ if (GC_ext_descriptors[env].ed_continued) {
+ /* Push an entry with the rest of the descriptor back onto the */
+ /* stack. Thus we never do too much work at once. Note that */
+ /* we also can't overflow the mark stack unless we actually */
+ /* mark something. */
+ mark_stack_ptr++;
+ if ((word)mark_stack_ptr >= (word)mark_stack_limit) {
+ mark_stack_ptr = GC_signal_mark_stack_overflow(mark_stack_ptr);
+ }
+ mark_stack_ptr -> mse_start = (ptr_t)(addr + WORDSZ);
+ mark_stack_ptr -> mse_descr.w =
+ GC_MAKE_PROC(GC_typed_mark_proc_index, env + 1);
+ }
+ return(mark_stack_ptr);
+}
+
+/* Return the size of the object described by d. It would be faster to */
+/* store this directly, or to compute it as part of */
+/* GC_push_complex_descriptor, but hopefully it doesn't matter. */
+STATIC word GC_descr_obj_size(complex_descriptor *d)
+{
+ switch(d -> TAG) {
+ case LEAF_TAG:
+ return(d -> ld.ld_nelements * d -> ld.ld_size);
+ case ARRAY_TAG:
+ return(d -> ad.ad_nelements
+ * GC_descr_obj_size(d -> ad.ad_element_descr));
+ case SEQUENCE_TAG:
+ return(GC_descr_obj_size(d -> sd.sd_first)
+ + GC_descr_obj_size(d -> sd.sd_second));
+ default:
+ ABORT_RET("Bad complex descriptor");
+ return 0;
+ }
+}
+
+/* Push descriptors for the object at addr with complex descriptor d */
+/* onto the mark stack. Return 0 if the mark stack overflowed. */
+STATIC mse * GC_push_complex_descriptor(word *addr, complex_descriptor *d,
+ mse *msp, mse *msl)
+{
+ ptr_t current = (ptr_t)addr;
+ word nelements;
+ word sz;
+ word i;
+
+ switch(d -> TAG) {
+ case LEAF_TAG:
+ {
+ GC_descr descr = d -> ld.ld_descriptor;
+
+ nelements = d -> ld.ld_nelements;
+ if (msl - msp <= (ptrdiff_t)nelements) return(0);
+ sz = d -> ld.ld_size;
+ for (i = 0; i < nelements; i++) {
+ msp++;
+ msp -> mse_start = current;
+ msp -> mse_descr.w = descr;
+ current += sz;
+ }
+ return(msp);
+ }
+ case ARRAY_TAG:
+ {
+ complex_descriptor *descr = d -> ad.ad_element_descr;
+
+ nelements = d -> ad.ad_nelements;
+ sz = GC_descr_obj_size(descr);
+ for (i = 0; i < nelements; i++) {
+ msp = GC_push_complex_descriptor((word *)current, descr,
+ msp, msl);
+ if (msp == 0) return(0);
+ current += sz;
+ }
+ return(msp);
+ }
+ case SEQUENCE_TAG:
+ {
+ sz = GC_descr_obj_size(d -> sd.sd_first);
+ msp = GC_push_complex_descriptor((word *)current, d -> sd.sd_first,
+ msp, msl);
+ if (msp == 0) return(0);
+ current += sz;
+ msp = GC_push_complex_descriptor((word *)current, d -> sd.sd_second,
+ msp, msl);
+ return(msp);
+ }
+ default:
+ ABORT_RET("Bad complex descriptor");
+ return 0;
+ }
+}
+
+GC_ATTR_NO_SANITIZE_THREAD
+static complex_descriptor *get_complex_descr(word *addr, word nwords)
+{
+ return (complex_descriptor *)addr[nwords - 1];
+}
+
+#ifdef AO_HAVE_store_release
+# define set_obj_descr(op, nwords, d) \
+ AO_store_release((volatile AO_t *)(op) + (nwords) - 1, (AO_t)(d))
+#else
+# define set_obj_descr(op, nwords, d) \
+ (void)(((word *)(op))[(nwords) - 1] = (word)(d))
+#endif
+
+STATIC mse * GC_array_mark_proc(word * addr, mse * mark_stack_ptr,
+ mse * mark_stack_limit,
+ word env GC_ATTR_UNUSED)
+{
+ hdr * hhdr = HDR(addr);
+ word sz = hhdr -> hb_sz;
+ word nwords = BYTES_TO_WORDS(sz);
+ complex_descriptor *descr = get_complex_descr(addr, nwords);
+ mse * orig_mark_stack_ptr = mark_stack_ptr;
+ mse * new_mark_stack_ptr;
+
+ if (descr == 0) {
+ /* Found a reference to a free list entry. Ignore it. */
+ return(orig_mark_stack_ptr);
+ }
+ /* In use counts were already updated when array descriptor was */
+ /* pushed. Here we only replace it by subobject descriptors, so */
+ /* no update is necessary. */
+ new_mark_stack_ptr = GC_push_complex_descriptor(addr, descr,
+ mark_stack_ptr,
+ mark_stack_limit-1);
+ if (new_mark_stack_ptr == 0) {
+ /* Explicitly instruct Clang Static Analyzer that ptr is non-null. */
+ if (NULL == mark_stack_ptr) ABORT("Bad mark_stack_ptr");
+
+ /* Doesn't fit. Conservatively push the whole array as a unit */
+ /* and request a mark stack expansion. */
+ /* This cannot cause a mark stack overflow, since it replaces */
+ /* the original array entry. */
+# ifdef PARALLEL_MARK
+ /* We might be using a local_mark_stack in parallel mode. */
+ if (GC_mark_stack + GC_mark_stack_size == mark_stack_limit)
+# endif
+ {
+ GC_mark_stack_too_small = TRUE;
+ }
+ new_mark_stack_ptr = orig_mark_stack_ptr + 1;
+ new_mark_stack_ptr -> mse_start = (ptr_t)addr;
+ new_mark_stack_ptr -> mse_descr.w = sz | GC_DS_LENGTH;
+ } else {
+ /* Push descriptor itself */
+ new_mark_stack_ptr++;
+ new_mark_stack_ptr -> mse_start = (ptr_t)(addr + nwords - 1);
+ new_mark_stack_ptr -> mse_descr.w = sizeof(word) | GC_DS_LENGTH;
+ }
+ return new_mark_stack_ptr;
+}
+
+GC_API GC_descr GC_CALL GC_make_descriptor(const GC_word * bm, size_t len)
+{
+ signed_word last_set_bit = (signed_word)len - 1;
+ GC_descr result;
+ DCL_LOCK_STATE;
+
+# if defined(AO_HAVE_load_acquire) && defined(AO_HAVE_store_release)
+ if (!EXPECT(AO_load_acquire(&GC_explicit_typing_initialized), TRUE)) {
+ LOCK();
+ if (!GC_explicit_typing_initialized) {
+ GC_init_explicit_typing();
+ AO_store_release(&GC_explicit_typing_initialized, TRUE);
+ }
+ UNLOCK();
+ }
+# else
+ LOCK();
+ if (!EXPECT(GC_explicit_typing_initialized, TRUE)) {
+ GC_init_explicit_typing();
+ GC_explicit_typing_initialized = TRUE;
+ }
+ UNLOCK();
+# endif
+
+ while (last_set_bit >= 0 && !GC_get_bit(bm, last_set_bit))
+ last_set_bit--;
+ if (last_set_bit < 0) return(0 /* no pointers */);
+
+# if ALIGNMENT == CPP_WORDSZ/8
+ {
+ signed_word i;
+
+ for (i = 0; i < last_set_bit; i++) {
+ if (!GC_get_bit(bm, i)) {
+ break;
+ }
+ }
+ if (i == last_set_bit) {
+ /* An initial section contains all pointers. Use length descriptor. */
+ return (WORDS_TO_BYTES(last_set_bit+1) | GC_DS_LENGTH);
+ }
+ }
+# endif
+ if ((word)last_set_bit < BITMAP_BITS) {
+ signed_word i;
+
+ /* Hopefully the common case. */
+ /* Build bitmap descriptor (with bits reversed) */
+ result = SIGNB;
+ for (i = last_set_bit - 1; i >= 0; i--) {
+ result >>= 1;
+ if (GC_get_bit(bm, i)) result |= SIGNB;
+ }
+ result |= GC_DS_BITMAP;
+ } else {
+ signed_word index = GC_add_ext_descriptor(bm, (word)last_set_bit + 1);
+ if (index == -1) return(WORDS_TO_BYTES(last_set_bit+1) | GC_DS_LENGTH);
+ /* Out of memory: use conservative */
+ /* approximation. */
+ result = GC_MAKE_PROC(GC_typed_mark_proc_index, index);
+ }
+ return result;
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_explicitly_typed(size_t lb,
+ GC_descr d)
+{
+ word *op;
+ size_t lg;
+
+ GC_ASSERT(GC_explicit_typing_initialized);
+ if (EXPECT(0 == lb, FALSE)) lb = 1; /* ensure nwords > 1 */
+ lb = SIZET_SAT_ADD(lb, TYPD_EXTRA_BYTES);
+ op = (word *)GC_malloc_kind(lb, GC_explicit_kind);
+ if (EXPECT(NULL == op, FALSE))
+ return NULL;
+ /* It is not safe to use GC_size_map[lb] to compute lg here as */
+ /* the former might be updated asynchronously. */
+ lg = BYTES_TO_GRANULES(GC_size(op));
+ set_obj_descr(op, GRANULES_TO_WORDS(lg), d);
+ return op;
+}
+
+/* We make the GC_clear_stack() call a tail one, hoping to get more of */
+/* the stack. */
+#define GENERAL_MALLOC_IOP(lb, k) \
+ GC_clear_stack(GC_generic_malloc_ignore_off_page(lb, k))
+
+GC_API GC_ATTR_MALLOC void * GC_CALL
+ GC_malloc_explicitly_typed_ignore_off_page(size_t lb, GC_descr d)
+{
+ ptr_t op;
+ size_t lg;
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(GC_explicit_typing_initialized);
+ if (EXPECT(0 == lb, FALSE)) lb = 1;
+ lb = SIZET_SAT_ADD(lb, TYPD_EXTRA_BYTES);
+ if (SMALL_OBJ(lb)) {
+ void **opp;
+
+ GC_DBG_COLLECT_AT_MALLOC(lb);
+ LOCK();
+ lg = GC_size_map[lb];
+ opp = &GC_obj_kinds[GC_explicit_kind].ok_freelist[lg];
+ op = (ptr_t)(*opp);
+ if (EXPECT(0 == op, FALSE)) {
+ UNLOCK();
+ op = (ptr_t)GENERAL_MALLOC_IOP(lb, GC_explicit_kind);
+ if (0 == op) return 0;
+ /* See the comment in GC_malloc_explicitly_typed. */
+ lg = BYTES_TO_GRANULES(GC_size(op));
+ } else {
+ *opp = obj_link(op);
+ obj_link(op) = 0;
+ GC_bytes_allocd += GRANULES_TO_BYTES((word)lg);
+ UNLOCK();
+ }
+ } else {
+ op = (ptr_t)GENERAL_MALLOC_IOP(lb, GC_explicit_kind);
+ if (NULL == op) return NULL;
+ lg = BYTES_TO_GRANULES(GC_size(op));
+ }
+ set_obj_descr(op, GRANULES_TO_WORDS(lg), d);
+ return op;
+}
+
+GC_API GC_ATTR_MALLOC void * GC_CALL GC_calloc_explicitly_typed(size_t n,
+ size_t lb, GC_descr d)
+{
+ word *op;
+ size_t lg;
+ GC_descr simple_descr;
+ complex_descriptor *complex_descr;
+ int descr_type;
+ struct LeafDescriptor leaf;
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(GC_explicit_typing_initialized);
+ if (EXPECT(0 == lb || 0 == n, FALSE)) lb = n = 1;
+ if ((lb | n) > GC_SQRT_SIZE_MAX /* fast initial check */
+ && n > GC_SIZE_MAX / lb)
+ return (*GC_get_oom_fn())(GC_SIZE_MAX); /* n*lb overflow */
+
+ descr_type = GC_make_array_descriptor((word)n, (word)lb, d, &simple_descr,
+ &complex_descr, &leaf);
+ lb *= n;
+ switch(descr_type) {
+ case NO_MEM:
+ return (*GC_get_oom_fn())(lb);
+ case SIMPLE:
+ return GC_malloc_explicitly_typed(lb, simple_descr);
+ case LEAF:
+ lb = SIZET_SAT_ADD(lb,
+ sizeof(struct LeafDescriptor) + TYPD_EXTRA_BYTES);
+ break;
+ case COMPLEX:
+ lb = SIZET_SAT_ADD(lb, TYPD_EXTRA_BYTES);
+ break;
+ }
+ op = (word *)GC_malloc_kind(lb, GC_array_kind);
+ if (EXPECT(NULL == op, FALSE))
+ return NULL;
+ lg = BYTES_TO_GRANULES(GC_size(op));
+ if (descr_type == LEAF) {
+ /* Set up the descriptor inside the object itself. */
+ struct LeafDescriptor * lp =
+ (struct LeafDescriptor *)
+ (op + GRANULES_TO_WORDS(lg)
+ - (BYTES_TO_WORDS(sizeof(struct LeafDescriptor)) + 1));
+
+ lp -> ld_tag = LEAF_TAG;
+ lp -> ld_size = leaf.ld_size;
+ lp -> ld_nelements = leaf.ld_nelements;
+ lp -> ld_descriptor = leaf.ld_descriptor;
+ /* Hold the allocation lock while writing the descriptor word */
+ /* to the object to ensure that the descriptor contents are */
+ /* seen by GC_array_mark_proc as expected. */
+ /* TODO: It should be possible to replace locking with the */
+ /* atomic operations (with the release barrier here) but, in */
+ /* this case, avoiding the acquire barrier in */
+ /* GC_array_mark_proc seems to be tricky as GC_mark_some might */
+ /* be invoked with the world running. */
+ LOCK();
+ op[GRANULES_TO_WORDS(lg) - 1] = (word)lp;
+ UNLOCK();
+ } else {
+# ifndef GC_NO_FINALIZATION
+ size_t lw = GRANULES_TO_WORDS(lg);
+
+ LOCK();
+ op[lw - 1] = (word)complex_descr;
+ UNLOCK();
+
+ GC_dirty(op + lw - 1);
+ REACHABLE_AFTER_DIRTY(complex_descr);
+
+ /* Make sure the descriptor is cleared once there is any danger */
+ /* it may have been collected. */
+ if (EXPECT(GC_general_register_disappearing_link(
+ (void **)(op + lw - 1), op)
+ == GC_NO_MEMORY, FALSE))
+# endif
+ {
+ /* Couldn't register it due to lack of memory. Punt. */
+ return (*GC_get_oom_fn())(lb);
+ }
+ }
+ return op;
+}
diff --git a/graphics/asymptote/gc/win32_threads.c b/graphics/asymptote/gc/win32_threads.c
new file mode 100644
index 0000000000..99d3613c87
--- /dev/null
+++ b/graphics/asymptote/gc/win32_threads.c
@@ -0,0 +1,3375 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ * Copyright (c) 2000-2008 by Hewlett-Packard Development Company.
+ * All rights reserved.
+ * Copyright (c) 2008-2021 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "private/gc_priv.h"
+
+#if defined(GC_WIN32_THREADS)
+
+#ifdef THREAD_LOCAL_ALLOC
+# include "private/thread_local_alloc.h"
+#endif /* THREAD_LOCAL_ALLOC */
+
+/* Allocation lock declarations. */
+#if !defined(USE_PTHREAD_LOCKS)
+ GC_INNER CRITICAL_SECTION GC_allocate_ml;
+# ifdef GC_ASSERTIONS
+ GC_INNER DWORD GC_lock_holder = NO_THREAD;
+ /* Thread id for current holder of allocation lock */
+# endif
+#else
+ GC_INNER pthread_mutex_t GC_allocate_ml = PTHREAD_MUTEX_INITIALIZER;
+# ifdef GC_ASSERTIONS
+ GC_INNER unsigned long GC_lock_holder = NO_THREAD;
+# endif
+#endif
+
+#undef CreateThread
+#undef ExitThread
+#undef _beginthreadex
+#undef _endthreadex
+
+#ifdef GC_PTHREADS
+# include <errno.h> /* for EINTR */
+
+ /* Cygwin-specific forward decls */
+# undef pthread_create
+# undef pthread_join
+# undef pthread_detach
+
+# ifndef GC_NO_PTHREAD_SIGMASK
+# undef pthread_sigmask
+# endif
+
+ STATIC void * GC_pthread_start(void * arg);
+ STATIC void GC_thread_exit_proc(void *arg);
+
+# include <pthread.h>
+# ifdef CAN_CALL_ATFORK
+# include <unistd.h>
+# endif
+
+# ifdef EMULATE_PTHREAD_SEMAPHORE
+# include "private/darwin_semaphore.h"
+# else
+# include <semaphore.h>
+# endif
+
+#elif !defined(MSWINCE)
+# include <process.h> /* For _beginthreadex, _endthreadex */
+# include <errno.h> /* for errno, EAGAIN */
+
+#endif /* !GC_PTHREADS && !MSWINCE */
+
+/* PUSHED_REGS_COUNT is the number of copied registers in copy_ptr_regs. */
+static ptr_t copy_ptr_regs(word *regs, const CONTEXT *pcontext);
+#if defined(I386)
+# ifdef WOW64_THREAD_CONTEXT_WORKAROUND
+# define PUSHED_REGS_COUNT 9
+# else
+# define PUSHED_REGS_COUNT 7
+# endif
+#elif defined(X86_64)
+# ifdef XMM_CANT_STORE_PTRS
+ /* If pointers can't be located in Xmm registers. */
+# define PUSHED_REGS_COUNT 15
+# else
+ /* gcc-13 may store pointers into SIMD registers when */
+ /* certain compiler optimizations are enabled. */
+# define PUSHED_REGS_COUNT (15+32)
+# endif
+#elif defined(SHx)
+# define PUSHED_REGS_COUNT 15
+#elif defined(ARM32)
+# define PUSHED_REGS_COUNT 13
+#elif defined(AARCH64)
+# define PUSHED_REGS_COUNT 30
+#elif defined(MIPS) || defined(ALPHA)
+# define PUSHED_REGS_COUNT 28
+#elif defined(PPC)
+# define PUSHED_REGS_COUNT 29
+#endif
+
+/* DllMain-based thread registration is currently incompatible */
+/* with thread-local allocation, pthreads and WinCE. */
+#if (defined(GC_DLL) || defined(GC_INSIDE_DLL)) && !defined(NO_CRT) \
+ && !defined(GC_NO_THREADS_DISCOVERY) && !defined(MSWINCE) \
+ && !defined(THREAD_LOCAL_ALLOC) && !defined(GC_PTHREADS)
+
+ /* This code operates in two distinct modes, depending on */
+ /* the setting of GC_win32_dll_threads. */
+ /* If GC_win32_dll_threads is set, all threads in the process */
+ /* are implicitly registered with the GC by DllMain. */
+ /* No explicit registration is required, and attempts at */
+ /* explicit registration are ignored. This mode is */
+ /* very different from the Posix operation of the collector. */
+ /* In this mode access to the thread table is lock-free. */
+ /* Hence there is a static limit on the number of threads. */
+
+# ifdef GC_DISCOVER_TASK_THREADS
+ /* GC_DISCOVER_TASK_THREADS should be used if DllMain-based */
+ /* thread registration is required but it is impossible to */
+ /* call GC_use_threads_discovery before other GC routines. */
+# define GC_win32_dll_threads TRUE
+# else
+ STATIC GC_bool GC_win32_dll_threads = FALSE;
+ /* GC_win32_dll_threads must be set (if needed) at the */
+ /* application initialization time, i.e. before any */
+ /* collector or thread calls. We make it a "dynamic" */
+ /* option only to avoid multiple library versions. */
+# endif
+
+#else
+ /* If GC_win32_dll_threads is FALSE (or the collector is */
+ /* built without GC_DLL defined), things operate in a way */
+ /* that is very similar to Posix platforms, and new threads */
+ /* must be registered with the collector, e.g. by using */
+ /* preprocessor-based interception of the thread primitives. */
+ /* In this case, we use a real data structure for the thread */
+ /* table. Note that there is no equivalent of linker-based */
+ /* call interception, since we don't have ELF-like */
+ /* facilities. The Windows analog appears to be "API */
+ /* hooking", which really seems to be a standard way to */
+ /* do minor binary rewriting (?). I'd prefer not to have */
+ /* the basic collector rely on such facilities, but an */
+ /* optional package that intercepts thread calls this way */
+ /* would probably be nice. */
+# ifndef GC_NO_THREADS_DISCOVERY
+# define GC_NO_THREADS_DISCOVERY
+# endif
+# define GC_win32_dll_threads FALSE
+# undef MAX_THREADS
+# define MAX_THREADS 1 /* dll_thread_table[] is always empty. */
+#endif /* GC_NO_THREADS_DISCOVERY */
+
+/* We have two versions of the thread table. Which one */
+/* we use depends on whether GC_win32_dll_threads */
+/* is set. Note that before initialization, we don't */
+/* add any entries to either table, even if DllMain is */
+/* called. The main thread will be added on */
+/* initialization. */
+
+/* The type of the first argument to InterlockedExchange. */
+/* Documented to be LONG volatile *, but at least gcc likes */
+/* this better. */
+typedef LONG * IE_t;
+
+STATIC GC_bool GC_thr_initialized = FALSE;
+
+#ifndef GC_ALWAYS_MULTITHREADED
+ GC_INNER GC_bool GC_need_to_lock = FALSE;
+#endif
+
+static GC_bool parallel_initialized = FALSE;
+
+/* GC_use_threads_discovery() is currently incompatible with pthreads */
+/* and WinCE. It might be possible to get DllMain-based thread */
+/* registration to work with Cygwin, but if you try it then you are on */
+/* your own. */
+GC_API void GC_CALL GC_use_threads_discovery(void)
+{
+# ifdef GC_NO_THREADS_DISCOVERY
+ ABORT("GC DllMain-based thread registration unsupported");
+# else
+ /* Turn on GC_win32_dll_threads. */
+ GC_ASSERT(!parallel_initialized);
+ /* Note that GC_use_threads_discovery is expected to be called by */
+ /* the client application (not from DllMain) at start-up. */
+# ifndef GC_DISCOVER_TASK_THREADS
+ GC_win32_dll_threads = TRUE;
+# endif
+ GC_init_parallel();
+# endif
+}
+
+#define ADDR_LIMIT ((ptr_t)GC_WORD_MAX)
+
+struct GC_Thread_Rep {
+ union {
+# ifndef GC_NO_THREADS_DISCOVERY
+ volatile AO_t in_use;
+ /* Updated without lock. */
+ /* We assert that unused */
+ /* entries have invalid ids of */
+ /* zero and zero stack fields. */
+ /* Used only with GC_win32_dll_threads. */
+ LONG long_in_use; /* The same but of the type that */
+ /* matches the first argument of */
+ /* InterlockedExchange(); volatile is */
+ /* omitted because the ancient version */
+ /* of the prototype lacks the qualifier.*/
+# endif
+ struct GC_Thread_Rep * next;
+ /* Hash table link without */
+ /* GC_win32_dll_threads. */
+ /* More recently allocated threads */
+ /* with a given pthread id come */
+ /* first. (All but the first are */
+ /* guaranteed to be dead, but we may */
+ /* not yet have registered the join.) */
+ } tm; /* table_management */
+ DWORD id;
+
+# ifdef MSWINCE
+ /* According to MSDN specs for WinCE targets: */
+ /* - DuplicateHandle() is not applicable to thread handles; and */
+ /* - the value returned by GetCurrentThreadId() could be used as */
+ /* a "real" thread handle (for SuspendThread(), ResumeThread() and */
+ /* GetThreadContext()). */
+# define THREAD_HANDLE(t) (HANDLE)(word)(t)->id
+# else
+ HANDLE handle;
+# define THREAD_HANDLE(t) (t)->handle
+# endif
+
+ ptr_t stack_base; /* The cold end of the stack. */
+ /* 0 ==> entry not valid. */
+ /* !in_use ==> stack_base == 0 */
+ ptr_t last_stack_min; /* Last known minimum (hottest) address */
+ /* in stack or ADDR_LIMIT if unset */
+# ifdef IA64
+ ptr_t backing_store_end;
+ ptr_t backing_store_ptr;
+# elif defined(I386)
+ ptr_t initial_stack_base;
+ /* The cold end of the stack saved by */
+ /* GC_record_stack_base (never modified */
+ /* by GC_set_stackbottom). */
+# endif
+
+ ptr_t thread_blocked_sp; /* Protected by GC lock. */
+ /* NULL value means thread unblocked. */
+ /* If set to non-NULL, thread will */
+ /* acquire GC lock before doing any */
+ /* pointer manipulations. Thus it does */
+ /* not need to stop this thread. */
+
+ struct GC_traced_stack_sect_s *traced_stack_sect;
+ /* Points to the "stack section" data */
+ /* held in stack by the innermost */
+ /* GC_call_with_gc_active() of this */
+ /* thread. May be NULL. */
+
+# ifndef GC_NO_FINALIZATION
+ unsigned short finalizer_skipped;
+ unsigned char finalizer_nested;
+ /* Used by GC_check_finalizer_nested() */
+ /* to minimize the level of recursion */
+ /* when a client finalizer allocates */
+ /* memory (initially both are 0). */
+# endif
+
+ unsigned char suspended; /* really of GC_bool type */
+
+# ifdef GC_PTHREADS
+ unsigned char flags; /* Protected by GC lock. */
+# define FINISHED 1 /* Thread has exited. */
+# define DETACHED 2 /* Thread is intended to be detached. */
+# define KNOWN_FINISHED(t) (((t) -> flags) & FINISHED)
+ pthread_t pthread_id;
+ void *status; /* hold exit value until join in case it's a pointer */
+# else
+# define KNOWN_FINISHED(t) 0
+# endif
+
+# ifdef THREAD_LOCAL_ALLOC
+ struct thread_local_freelists tlfs;
+# endif
+
+# if defined(WOW64_THREAD_CONTEXT_WORKAROUND) && defined(MSWINRT_FLAVOR)
+ PNT_TIB tib;
+# endif
+
+# ifdef RETRY_GET_THREAD_CONTEXT
+ ptr_t context_sp;
+ word context_regs[PUSHED_REGS_COUNT];
+ /* Populated as part of GC_suspend() as */
+ /* resume/suspend loop may be needed for the */
+ /* call to GetThreadContext() to succeed. */
+# endif
+};
+
+typedef struct GC_Thread_Rep * GC_thread;
+typedef volatile struct GC_Thread_Rep * GC_vthread;
+
+STATIC DWORD GC_main_thread;
+
+#ifndef GC_NO_THREADS_DISCOVERY
+ /* We track thread attachments while the world is supposed to be */
+ /* stopped. Unfortunately, we cannot stop them from starting, since */
+ /* blocking in DllMain seems to cause the world to deadlock. Thus, */
+ /* we have to recover if we notice this in the middle of marking. */
+ STATIC volatile AO_t GC_attached_thread = FALSE;
+
+ /* We assumed that volatile ==> memory ordering, at least among */
+ /* volatiles. This code should consistently use atomic_ops. */
+ STATIC volatile GC_bool GC_please_stop = FALSE;
+#elif defined(GC_ASSERTIONS)
+ STATIC GC_bool GC_please_stop = FALSE;
+#endif /* GC_NO_THREADS_DISCOVERY && GC_ASSERTIONS */
+
+#if defined(WRAP_MARK_SOME) && !defined(GC_PTHREADS)
+ /* Return TRUE if an thread was attached since we last asked or */
+ /* since GC_attached_thread was explicitly reset. */
+ GC_INNER GC_bool GC_started_thread_while_stopped(void)
+ {
+# ifndef GC_NO_THREADS_DISCOVERY
+ if (GC_win32_dll_threads) {
+# ifdef AO_HAVE_compare_and_swap_release
+ if (AO_compare_and_swap_release(&GC_attached_thread, TRUE,
+ FALSE /* stored */))
+ return TRUE;
+# else
+ AO_nop_full(); /* Prior heap reads need to complete earlier. */
+ if (AO_load(&GC_attached_thread)) {
+ AO_store(&GC_attached_thread, FALSE);
+ return TRUE;
+ }
+# endif
+ }
+# endif
+ return FALSE;
+ }
+#endif /* WRAP_MARK_SOME */
+
+/* Thread table used if GC_win32_dll_threads is set. */
+/* This is a fixed size array. */
+/* Since we use runtime conditionals, both versions */
+/* are always defined. */
+# ifndef MAX_THREADS
+# define MAX_THREADS 512
+# endif
+
+/* Things may get quite slow for large numbers of threads, */
+/* since we look them up with sequential search. */
+volatile struct GC_Thread_Rep dll_thread_table[MAX_THREADS];
+
+STATIC volatile LONG GC_max_thread_index = 0;
+ /* Largest index in dll_thread_table */
+ /* that was ever used. */
+
+/* And now the version used if GC_win32_dll_threads is not set. */
+/* This is a chained hash table, with much of the code borrowed */
+/* from the Posix implementation. */
+#ifndef THREAD_TABLE_SZ
+# define THREAD_TABLE_SZ 256 /* Power of 2 (for speed). */
+#endif
+#define THREAD_TABLE_INDEX(id) /* id is of DWORD type */ \
+ (int)((((id) >> 8) ^ (id)) % THREAD_TABLE_SZ)
+STATIC GC_thread GC_threads[THREAD_TABLE_SZ];
+
+/* It may not be safe to allocate when we register the first thread. */
+/* Thus we allocated one statically. It does not contain any pointer */
+/* field we need to push ("next" and "status" fields are unused). */
+static struct GC_Thread_Rep first_thread;
+static GC_bool first_thread_used = FALSE;
+
+/* Add a thread to GC_threads. We assume it wasn't already there. */
+/* Caller holds allocation lock. */
+/* Unlike the pthreads version, the id field is set by the caller. */
+STATIC GC_thread GC_new_thread(DWORD id)
+{
+ int hv = THREAD_TABLE_INDEX(id);
+ GC_thread result;
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Creating thread 0x%lx\n", (long)id);
+ if (GC_threads[hv] != NULL)
+ GC_log_printf("Hash collision at GC_threads[%d]\n", hv);
+# endif
+ GC_ASSERT(I_HOLD_LOCK());
+ if (!EXPECT(first_thread_used, TRUE)) {
+ result = &first_thread;
+ first_thread_used = TRUE;
+ GC_ASSERT(NULL == GC_threads[hv]);
+ } else {
+ GC_ASSERT(!GC_win32_dll_threads);
+ result = (struct GC_Thread_Rep *)
+ GC_INTERNAL_MALLOC(sizeof(struct GC_Thread_Rep), NORMAL);
+ if (result == 0) return(0);
+ }
+ /* result -> id = id; Done by caller. */
+ result -> tm.next = GC_threads[hv];
+ GC_threads[hv] = result;
+# ifdef GC_PTHREADS
+ GC_ASSERT(result -> flags == 0);
+# endif
+ GC_ASSERT(result -> thread_blocked_sp == NULL);
+ if (EXPECT(result != &first_thread, TRUE))
+ GC_dirty(result);
+ return(result);
+}
+
+GC_INNER GC_bool GC_in_thread_creation = FALSE;
+ /* Protected by allocation lock. */
+
+GC_INLINE void GC_record_stack_base(GC_vthread me,
+ const struct GC_stack_base *sb)
+{
+ me -> stack_base = (ptr_t)sb->mem_base;
+# ifdef IA64
+ me -> backing_store_end = (ptr_t)sb->reg_base;
+# elif defined(I386)
+ me -> initial_stack_base = (ptr_t)sb->mem_base;
+# endif
+ if (me -> stack_base == NULL)
+ ABORT("Bad stack base in GC_register_my_thread");
+}
+
+/* This may be called from DllMain, and hence operates under unusual */
+/* constraints. In particular, it must be lock-free if */
+/* GC_win32_dll_threads is set. Always called from the thread being */
+/* added. If GC_win32_dll_threads is not set, we already hold the */
+/* allocation lock except possibly during single-threaded startup code. */
+/* Does not initialize thread local free lists. */
+STATIC GC_thread GC_register_my_thread_inner(const struct GC_stack_base *sb,
+ DWORD thread_id)
+{
+ GC_vthread me;
+
+ /* The following should be a no-op according to the Win32 */
+ /* documentation. There is empirical evidence that it */
+ /* isn't. - HB */
+# if defined(MPROTECT_VDB) && !defined(CYGWIN32)
+ if (GC_auto_incremental
+# ifdef GWW_VDB
+ && !GC_gww_dirty_init()
+# endif
+ )
+ GC_set_write_fault_handler();
+# endif
+
+# ifndef GC_NO_THREADS_DISCOVERY
+ if (GC_win32_dll_threads) {
+ int i;
+ /* It appears to be unsafe to acquire a lock here, since this */
+ /* code is apparently not preemptible on some systems. */
+ /* (This is based on complaints, not on Microsoft's official */
+ /* documentation, which says this should perform "only simple */
+ /* initialization tasks".) */
+ /* Hence we make do with nonblocking synchronization. */
+ /* It has been claimed that DllMain is really only executed with */
+ /* a particular system lock held, and thus careful use of locking */
+ /* around code that doesn't call back into the system libraries */
+ /* might be OK. But this has not been tested across all Win32 */
+ /* variants. */
+ for (i = 0;
+ InterlockedExchange(&dll_thread_table[i].tm.long_in_use, 1) != 0;
+ i++) {
+ /* Compare-and-swap would make this cleaner, but that's not */
+ /* supported before Windows 98 and NT 4.0. In Windows 2000, */
+ /* InterlockedExchange is supposed to be replaced by */
+ /* InterlockedExchangePointer, but that's not really what I */
+ /* want here. */
+ /* FIXME: We should eventually declare Windows 95 dead and use */
+ /* AO_ primitives here. */
+ if (i == MAX_THREADS - 1)
+ ABORT("Too many threads");
+ }
+ /* Update GC_max_thread_index if necessary. The following is */
+ /* safe, and unlike CompareExchange-based solutions seems to work */
+ /* on all Windows95 and later platforms. */
+ /* Unfortunately, GC_max_thread_index may be temporarily out of */
+ /* bounds, so readers have to compensate. */
+ while (i > GC_max_thread_index) {
+ InterlockedIncrement((IE_t)&GC_max_thread_index);
+ }
+ if (GC_max_thread_index >= MAX_THREADS) {
+ /* We overshot due to simultaneous increments. */
+ /* Setting it to MAX_THREADS-1 is always safe. */
+ GC_max_thread_index = MAX_THREADS - 1;
+ }
+ me = dll_thread_table + i;
+ } else
+# endif
+ /* else */ /* Not using DllMain */ {
+ GC_ASSERT(I_HOLD_LOCK());
+ GC_in_thread_creation = TRUE; /* OK to collect from unknown thread. */
+ me = GC_new_thread(thread_id);
+ GC_in_thread_creation = FALSE;
+ if (me == 0)
+ ABORT("Failed to allocate memory for thread registering");
+ }
+# ifdef GC_PTHREADS
+ /* me can be NULL -> segfault */
+ me -> pthread_id = pthread_self();
+# endif
+# ifndef MSWINCE
+ /* GetCurrentThread() returns a pseudohandle (a const value). */
+ if (!DuplicateHandle(GetCurrentProcess(), GetCurrentThread(),
+ GetCurrentProcess(),
+ (HANDLE*)&(me -> handle),
+ 0 /* dwDesiredAccess */, FALSE /* bInheritHandle */,
+ DUPLICATE_SAME_ACCESS)) {
+ ABORT_ARG1("DuplicateHandle failed",
+ ": errcode= 0x%X", (unsigned)GetLastError());
+ }
+# endif
+# if defined(WOW64_THREAD_CONTEXT_WORKAROUND) && defined(MSWINRT_FLAVOR)
+ /* Lookup TIB value via a call to NtCurrentTeb() on thread */
+ /* registration rather than calling GetThreadSelectorEntry() which */
+ /* is not available on UWP. */
+ me -> tib = (PNT_TIB)NtCurrentTeb();
+# endif
+ me -> last_stack_min = ADDR_LIMIT;
+ GC_record_stack_base(me, sb);
+ /* Up until this point, GC_push_all_stacks considers this thread */
+ /* invalid. */
+ /* Up until this point, this entry is viewed as reserved but invalid */
+ /* by GC_delete_thread. */
+ me -> id = thread_id;
+# ifndef GC_NO_THREADS_DISCOVERY
+ if (GC_win32_dll_threads) {
+ if (GC_please_stop) {
+ AO_store(&GC_attached_thread, TRUE);
+ AO_nop_full(); /* Later updates must become visible after this. */
+ }
+ /* We'd like to wait here, but can't, since waiting in DllMain */
+ /* provokes deadlocks. */
+ /* Thus we force marking to be restarted instead. */
+ } else
+# endif
+ /* else */ {
+ GC_ASSERT(!GC_please_stop);
+ /* Otherwise both we and the thread stopping code would be */
+ /* holding the allocation lock. */
+ }
+ return (GC_thread)(me);
+}
+
+/*
+ * GC_max_thread_index may temporarily be larger than MAX_THREADS.
+ * To avoid subscript errors, we check on access.
+ */
+GC_INLINE LONG GC_get_max_thread_index(void)
+{
+ LONG my_max = GC_max_thread_index;
+ if (my_max >= MAX_THREADS) return MAX_THREADS - 1;
+ return my_max;
+}
+
+/* Return the GC_thread corresponding to a thread id. May be called */
+/* without a lock, but should be called in contexts in which the */
+/* requested thread cannot be asynchronously deleted, e.g. from the */
+/* thread itself. */
+/* This version assumes that either GC_win32_dll_threads is set, or */
+/* we hold the allocator lock. */
+/* Also used (for assertion checking only) from thread_local_alloc.c. */
+STATIC GC_thread GC_lookup_thread_inner(DWORD thread_id)
+{
+# ifndef GC_NO_THREADS_DISCOVERY
+ if (GC_win32_dll_threads) {
+ int i;
+ LONG my_max = GC_get_max_thread_index();
+ for (i = 0; i <= my_max &&
+ (!AO_load_acquire(&dll_thread_table[i].tm.in_use)
+ || dll_thread_table[i].id != thread_id);
+ /* Must still be in_use, since nobody else can store our */
+ /* thread_id. */
+ i++) {
+ /* empty */
+ }
+ return i <= my_max ? (GC_thread)(dll_thread_table + i) : NULL;
+ } else
+# endif
+ /* else */ {
+ GC_thread p = GC_threads[THREAD_TABLE_INDEX(thread_id)];
+
+ GC_ASSERT(I_HOLD_LOCK());
+ while (p != 0 && p -> id != thread_id) p = p -> tm.next;
+ return(p);
+ }
+}
+
+#ifdef LINT2
+# define CHECK_LOOKUP_MY_THREAD(me) \
+ if (!(me)) ABORT("GC_lookup_thread_inner(GetCurrentThreadId) failed")
+#else
+# define CHECK_LOOKUP_MY_THREAD(me) /* empty */
+#endif
+
+#ifndef GC_NO_FINALIZATION
+ /* Called by GC_finalize() (in case of an allocation failure observed). */
+ /* GC_reset_finalizer_nested() is the same as in pthread_support.c. */
+ GC_INNER void GC_reset_finalizer_nested(void)
+ {
+ GC_thread me = GC_lookup_thread_inner(GetCurrentThreadId());
+
+ CHECK_LOOKUP_MY_THREAD(me);
+ me->finalizer_nested = 0;
+ }
+
+ /* GC_check_finalizer_nested() is the same as in pthread_support.c. */
+ GC_INNER unsigned char *GC_check_finalizer_nested(void)
+ {
+ GC_thread me = GC_lookup_thread_inner(GetCurrentThreadId());
+ unsigned nesting_level;
+
+ CHECK_LOOKUP_MY_THREAD(me);
+ nesting_level = me->finalizer_nested;
+ if (nesting_level) {
+ /* We are inside another GC_invoke_finalizers(). */
+ /* Skip some implicitly-called GC_invoke_finalizers() */
+ /* depending on the nesting (recursion) level. */
+ if (++me->finalizer_skipped < (1U << nesting_level)) return NULL;
+ me->finalizer_skipped = 0;
+ }
+ me->finalizer_nested = (unsigned char)(nesting_level + 1);
+ return &me->finalizer_nested;
+ }
+#endif /* !GC_NO_FINALIZATION */
+
+#if defined(GC_ASSERTIONS) && defined(THREAD_LOCAL_ALLOC)
+ /* This is called from thread-local GC_malloc(). */
+ GC_bool GC_is_thread_tsd_valid(void *tsd)
+ {
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ me = GC_lookup_thread_inner(GetCurrentThreadId());
+ UNLOCK();
+ return (word)tsd >= (word)(&me->tlfs)
+ && (word)tsd < (word)(&me->tlfs) + sizeof(me->tlfs);
+ }
+#endif /* GC_ASSERTIONS && THREAD_LOCAL_ALLOC */
+
+GC_API int GC_CALL GC_thread_is_registered(void)
+{
+ DWORD thread_id = GetCurrentThreadId();
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ me = GC_lookup_thread_inner(thread_id);
+ UNLOCK();
+ return me != NULL && !KNOWN_FINISHED(me);
+}
+
+GC_API void GC_CALL GC_register_altstack(void *stack GC_ATTR_UNUSED,
+ GC_word stack_size GC_ATTR_UNUSED,
+ void *altstack GC_ATTR_UNUSED,
+ GC_word altstack_size GC_ATTR_UNUSED)
+{
+ /* TODO: Implement */
+}
+
+/* Make sure thread descriptor t is not protected by the VDB */
+/* implementation. */
+/* Used to prevent write faults when the world is (partially) stopped, */
+/* since it may have been stopped with a system lock held, and that */
+/* lock may be required for fault handling. */
+#if defined(MPROTECT_VDB)
+# define UNPROTECT_THREAD(t) \
+ if (!GC_win32_dll_threads && GC_auto_incremental \
+ && t != &first_thread) { \
+ GC_ASSERT(SMALL_OBJ(GC_size(t))); \
+ GC_remove_protection(HBLKPTR(t), 1, FALSE); \
+ } else (void)0
+#else
+# define UNPROTECT_THREAD(t) (void)0
+#endif
+
+#ifdef CYGWIN32
+# define GC_PTHREAD_PTRVAL(pthread_id) pthread_id
+#elif defined(GC_WIN32_PTHREADS) || defined(GC_PTHREADS_PARAMARK)
+# include <pthread.h> /* to check for winpthreads */
+# if defined(__WINPTHREADS_VERSION_MAJOR)
+# define GC_PTHREAD_PTRVAL(pthread_id) pthread_id
+# else
+# define GC_PTHREAD_PTRVAL(pthread_id) pthread_id.p
+# endif
+#endif
+
+/* If a thread has been joined, but we have not yet */
+/* been notified, then there may be more than one thread */
+/* in the table with the same Win32 thread id. */
+/* This is OK, but we need a way to delete a specific one. */
+/* Assumes we hold the allocation lock unless */
+/* GC_win32_dll_threads is set. Does not actually free */
+/* GC_thread entry (only unlinks it). */
+/* If GC_win32_dll_threads is set it should be called from the */
+/* thread being deleted. */
+STATIC void GC_delete_gc_thread_no_free(GC_vthread t)
+{
+# ifndef MSWINCE
+ CloseHandle(t->handle);
+# endif
+# ifndef GC_NO_THREADS_DISCOVERY
+ if (GC_win32_dll_threads) {
+ /* This is intended to be lock-free. */
+ /* It is either called synchronously from the thread being */
+ /* deleted, or by the joining thread. */
+ /* In this branch asynchronous changes to (*t) are possible. */
+ /* It's not allowed to call GC_printf (and the friends) here, */
+ /* see GC_stop_world() for the information. */
+ t -> stack_base = 0;
+ t -> id = 0;
+ t -> suspended = FALSE;
+# ifdef RETRY_GET_THREAD_CONTEXT
+ t -> context_sp = NULL;
+# endif
+ AO_store_release(&t->tm.in_use, FALSE);
+ } else
+# endif
+ /* else */ {
+ DWORD id = ((GC_thread)t) -> id;
+ /* Cast away volatile qualifier, since we have lock. */
+ int hv = THREAD_TABLE_INDEX(id);
+ GC_thread p = GC_threads[hv];
+ GC_thread prev = NULL;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ while (p != (GC_thread)t) {
+ prev = p;
+ p = p -> tm.next;
+ }
+ if (prev == 0) {
+ GC_threads[hv] = p -> tm.next;
+ } else {
+ GC_ASSERT(prev != &first_thread);
+ prev -> tm.next = p -> tm.next;
+ GC_dirty(prev);
+ }
+ }
+}
+
+/* Delete a thread from GC_threads. We assume it is there. */
+/* (The code intentionally traps if it wasn't.) Assumes we */
+/* hold the allocation lock unless GC_win32_dll_threads is set. */
+/* If GC_win32_dll_threads is set then it should be called from */
+/* the thread being deleted. It is also safe to delete the */
+/* main thread (unless GC_win32_dll_threads). */
+STATIC void GC_delete_thread(DWORD id)
+{
+ if (GC_win32_dll_threads) {
+ GC_vthread t = GC_lookup_thread_inner(id);
+
+ if (0 == t) {
+ WARN("Removing nonexistent thread, id= %" WARN_PRIuPTR "\n", id);
+ } else {
+ GC_delete_gc_thread_no_free(t);
+ }
+ } else {
+ int hv = THREAD_TABLE_INDEX(id);
+ GC_thread p = GC_threads[hv];
+ GC_thread prev = NULL;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ while (p -> id != id) {
+ prev = p;
+ p = p -> tm.next;
+ }
+# ifndef MSWINCE
+ CloseHandle(p->handle);
+# endif
+ if (prev == 0) {
+ GC_threads[hv] = p -> tm.next;
+ } else {
+ GC_ASSERT(prev != &first_thread);
+ prev -> tm.next = p -> tm.next;
+ GC_dirty(prev);
+ }
+ if (EXPECT(p != &first_thread, TRUE)) {
+ GC_INTERNAL_FREE(p);
+ }
+ }
+}
+
+GC_API void GC_CALL GC_allow_register_threads(void)
+{
+# ifdef GC_ASSERTIONS
+ DCL_LOCK_STATE;
+
+ /* Check GC is initialized and the current thread is registered. */
+ LOCK();
+ GC_ASSERT(GC_lookup_thread_inner(GetCurrentThreadId()) != 0);
+ UNLOCK();
+# endif
+# if !defined(GC_ALWAYS_MULTITHREADED) && !defined(PARALLEL_MARK) \
+ && !defined(GC_NO_THREADS_DISCOVERY)
+ /* GC_init() does not call GC_init_parallel() in this case. */
+ parallel_initialized = TRUE;
+# endif
+ GC_start_mark_threads();
+ set_need_to_lock();
+}
+
+GC_API int GC_CALL GC_register_my_thread(const struct GC_stack_base *sb)
+{
+ GC_thread me;
+ DWORD thread_id = GetCurrentThreadId();
+ DCL_LOCK_STATE;
+
+ if (GC_need_to_lock == FALSE)
+ ABORT("Threads explicit registering is not previously enabled");
+
+ /* We lock here, since we want to wait for an ongoing GC. */
+ LOCK();
+ me = GC_lookup_thread_inner(thread_id);
+ if (me == 0) {
+ me = GC_register_my_thread_inner(sb, thread_id);
+# ifdef GC_PTHREADS
+# if defined(CPPCHECK)
+ GC_noop1(me->flags);
+# endif
+ me -> flags |= DETACHED;
+ /* Treat as detached, since we do not need to worry about */
+ /* pointer results. */
+# else
+ (void)me;
+# endif
+ } else
+# ifdef GC_PTHREADS
+ /* else */ if ((me -> flags & FINISHED) != 0) {
+ GC_record_stack_base(me, sb);
+ me -> flags &= ~FINISHED; /* but not DETACHED */
+ } else
+# endif
+ /* else */ {
+ UNLOCK();
+ return GC_DUPLICATE;
+ }
+
+# ifdef THREAD_LOCAL_ALLOC
+ GC_init_thread_local(&me->tlfs);
+# endif
+ UNLOCK();
+ return GC_SUCCESS;
+}
+
+#ifdef GC_DISABLE_INCREMENTAL
+# define GC_wait_for_gc_completion(wait_for_all) (void)(wait_for_all)
+#else
+/* Similar to that in pthread_support.c. */
+STATIC void GC_wait_for_gc_completion(GC_bool wait_for_all)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+ if (GC_incremental && GC_collection_in_progress()) {
+ word old_gc_no = GC_gc_no;
+
+ /* Make sure that no part of our stack is still on the mark stack, */
+ /* since it's about to be unmapped. */
+ do {
+ ENTER_GC();
+ GC_in_thread_creation = TRUE;
+ GC_collect_a_little_inner(1);
+ GC_in_thread_creation = FALSE;
+ EXIT_GC();
+
+ UNLOCK();
+ Sleep(0); /* yield */
+ LOCK();
+ } while (GC_incremental && GC_collection_in_progress()
+ && (wait_for_all || old_gc_no == GC_gc_no));
+ }
+}
+#endif /* !GC_DISABLE_INCREMENTAL */
+
+GC_API int GC_CALL GC_unregister_my_thread(void)
+{
+ DCL_LOCK_STATE;
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Unregistering thread 0x%lx\n", (long)GetCurrentThreadId());
+# endif
+
+ if (GC_win32_dll_threads) {
+# if defined(THREAD_LOCAL_ALLOC)
+ /* Can't happen: see GC_use_threads_discovery(). */
+ GC_ASSERT(FALSE);
+# else
+ /* FIXME: Should we just ignore this? */
+ GC_delete_thread(GetCurrentThreadId());
+# endif
+ } else {
+# if defined(THREAD_LOCAL_ALLOC) || defined(GC_PTHREADS)
+ GC_thread me;
+# endif
+ DWORD thread_id = GetCurrentThreadId();
+
+ LOCK();
+ GC_wait_for_gc_completion(FALSE);
+# if defined(THREAD_LOCAL_ALLOC) || defined(GC_PTHREADS)
+ me = GC_lookup_thread_inner(thread_id);
+ CHECK_LOOKUP_MY_THREAD(me);
+ GC_ASSERT(!KNOWN_FINISHED(me));
+# endif
+# if defined(THREAD_LOCAL_ALLOC)
+ GC_ASSERT(GC_getspecific(GC_thread_key) == &me->tlfs);
+ GC_destroy_thread_local(&(me->tlfs));
+# endif
+# ifdef GC_PTHREADS
+ if ((me -> flags & DETACHED) == 0) {
+ me -> flags |= FINISHED;
+ } else
+# endif
+ /* else */ {
+ GC_delete_thread(thread_id);
+ }
+# if defined(THREAD_LOCAL_ALLOC)
+ /* It is required to call remove_specific defined in specific.c. */
+ GC_remove_specific(GC_thread_key);
+# endif
+ UNLOCK();
+ }
+ return GC_SUCCESS;
+}
+
+/* Wrapper for functions that are likely to block for an appreciable */
+/* length of time. */
+
+/* GC_do_blocking_inner() is nearly the same as in pthread_support.c */
+GC_INNER void GC_do_blocking_inner(ptr_t data, void * context GC_ATTR_UNUSED)
+{
+ struct blocking_data * d = (struct blocking_data *) data;
+ DWORD thread_id = GetCurrentThreadId();
+ GC_thread me;
+# ifdef IA64
+ ptr_t stack_ptr = GC_save_regs_in_stack();
+# endif
+ DCL_LOCK_STATE;
+
+ LOCK();
+ me = GC_lookup_thread_inner(thread_id);
+ CHECK_LOOKUP_MY_THREAD(me);
+ GC_ASSERT(me -> thread_blocked_sp == NULL);
+# ifdef IA64
+ me -> backing_store_ptr = stack_ptr;
+# endif
+ me -> thread_blocked_sp = (ptr_t) &d; /* save approx. sp */
+ /* Save context here if we want to support precise stack marking */
+ UNLOCK();
+ d -> client_data = (d -> fn)(d -> client_data);
+ LOCK(); /* This will block if the world is stopped. */
+# if defined(CPPCHECK)
+ GC_noop1((word)me->thread_blocked_sp);
+# endif
+ me -> thread_blocked_sp = NULL;
+ UNLOCK();
+}
+
+/* GC_call_with_gc_active() has the opposite to GC_do_blocking() */
+/* functionality. It might be called from a user function invoked by */
+/* GC_do_blocking() to temporarily back allow calling any GC function */
+/* and/or manipulating pointers to the garbage collected heap. */
+GC_API void * GC_CALL GC_call_with_gc_active(GC_fn_type fn,
+ void * client_data)
+{
+ struct GC_traced_stack_sect_s stacksect;
+ DWORD thread_id = GetCurrentThreadId();
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+ LOCK(); /* This will block if the world is stopped. */
+ me = GC_lookup_thread_inner(thread_id);
+ CHECK_LOOKUP_MY_THREAD(me);
+ /* Adjust our stack bottom pointer (this could happen unless */
+ /* GC_get_stack_base() was used which returned GC_SUCCESS). */
+ GC_ASSERT(me -> stack_base != NULL);
+ if ((word)me->stack_base < (word)(&stacksect)) {
+ me -> stack_base = (ptr_t)(&stacksect);
+# if defined(I386)
+ me -> initial_stack_base = me -> stack_base;
+# endif
+ }
+
+ if (me -> thread_blocked_sp == NULL) {
+ /* We are not inside GC_do_blocking() - do nothing more. */
+ UNLOCK();
+ client_data = fn(client_data);
+ /* Prevent treating the above as a tail call. */
+ GC_noop1(COVERT_DATAFLOW(&stacksect));
+ return client_data; /* result */
+ }
+
+ /* Setup new "stack section". */
+ stacksect.saved_stack_ptr = me -> thread_blocked_sp;
+# ifdef IA64
+ /* This is the same as in GC_call_with_stack_base(). */
+ stacksect.backing_store_end = GC_save_regs_in_stack();
+ /* Unnecessarily flushes register stack, */
+ /* but that probably doesn't hurt. */
+ stacksect.saved_backing_store_ptr = me -> backing_store_ptr;
+# endif
+ stacksect.prev = me -> traced_stack_sect;
+ me -> thread_blocked_sp = NULL;
+ me -> traced_stack_sect = &stacksect;
+
+ UNLOCK();
+ client_data = fn(client_data);
+ GC_ASSERT(me -> thread_blocked_sp == NULL);
+ GC_ASSERT(me -> traced_stack_sect == &stacksect);
+
+ /* Restore original "stack section". */
+ LOCK();
+# if defined(CPPCHECK)
+ GC_noop1((word)me->traced_stack_sect);
+# endif
+ me -> traced_stack_sect = stacksect.prev;
+# ifdef IA64
+ me -> backing_store_ptr = stacksect.saved_backing_store_ptr;
+# endif
+ me -> thread_blocked_sp = stacksect.saved_stack_ptr;
+ UNLOCK();
+
+ return client_data; /* result */
+}
+
+GC_API void GC_CALL GC_set_stackbottom(void *gc_thread_handle,
+ const struct GC_stack_base *sb)
+{
+ GC_thread t = (GC_thread)gc_thread_handle;
+
+ GC_ASSERT(sb -> mem_base != NULL);
+ if (!EXPECT(GC_is_initialized, TRUE)) {
+ GC_ASSERT(NULL == t);
+ GC_stackbottom = (char *)sb->mem_base;
+# ifdef IA64
+ GC_register_stackbottom = (ptr_t)sb->reg_base;
+# endif
+ return;
+ }
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (NULL == t) { /* current thread? */
+ t = GC_lookup_thread_inner(GetCurrentThreadId());
+ CHECK_LOOKUP_MY_THREAD(t);
+ }
+ GC_ASSERT(!KNOWN_FINISHED(t));
+ GC_ASSERT(NULL == t -> thread_blocked_sp
+ && NULL == t -> traced_stack_sect); /* for now */
+ t -> stack_base = (ptr_t)sb->mem_base;
+ t -> last_stack_min = ADDR_LIMIT; /* reset the known minimum */
+# ifdef IA64
+ t -> backing_store_end = (ptr_t)sb->reg_base;
+# endif
+}
+
+GC_API void * GC_CALL GC_get_my_stackbottom(struct GC_stack_base *sb)
+{
+ DWORD thread_id = GetCurrentThreadId();
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ me = GC_lookup_thread_inner(thread_id);
+ CHECK_LOOKUP_MY_THREAD(me); /* the thread is assumed to be registered */
+ sb -> mem_base = me -> stack_base;
+# ifdef IA64
+ sb -> reg_base = me -> backing_store_end;
+# endif
+ UNLOCK();
+ return (void *)me; /* gc_thread_handle */
+}
+
+#ifdef GC_PTHREADS
+
+ /* A quick-and-dirty cache of the mapping between pthread_t */
+ /* and Win32 thread id. */
+# define PTHREAD_MAP_SIZE 512
+ DWORD GC_pthread_map_cache[PTHREAD_MAP_SIZE] = {0};
+# define PTHREAD_MAP_INDEX(pthread_id) \
+ ((NUMERIC_THREAD_ID(pthread_id) >> 5) % PTHREAD_MAP_SIZE)
+ /* It appears pthread_t is really a pointer type ... */
+# define SET_PTHREAD_MAP_CACHE(pthread_id, win32_id) \
+ (void)(GC_pthread_map_cache[PTHREAD_MAP_INDEX(pthread_id)] = (win32_id))
+# define GET_PTHREAD_MAP_CACHE(pthread_id) \
+ GC_pthread_map_cache[PTHREAD_MAP_INDEX(pthread_id)]
+
+ /* Return a GC_thread corresponding to a given pthread_t. */
+ /* Returns 0 if it's not there. */
+ /* We assume that this is only called for pthread ids that */
+ /* have not yet terminated or are still joinable, and */
+ /* cannot be concurrently terminated. */
+ /* Assumes we do NOT hold the allocation lock. */
+ STATIC GC_thread GC_lookup_pthread(pthread_t id)
+ {
+# ifndef GC_NO_THREADS_DISCOVERY
+ if (GC_win32_dll_threads) {
+ int i;
+ LONG my_max = GC_get_max_thread_index();
+
+ for (i = 0; i <= my_max &&
+ (!AO_load_acquire(&dll_thread_table[i].tm.in_use)
+ || !THREAD_EQUAL(dll_thread_table[i].pthread_id, id));
+ /* Must still be in_use, since nobody else can */
+ /* store our thread_id. */
+ i++) {
+ /* empty */
+ }
+ return i <= my_max ? (GC_thread)(dll_thread_table + i) : NULL;
+ } else
+# endif
+ /* else */ {
+ /* We first try the cache. If that fails, we use a very slow */
+ /* approach. */
+ DWORD win32_id = GET_PTHREAD_MAP_CACHE(id);
+ int hv_guess = THREAD_TABLE_INDEX(win32_id);
+ int hv;
+ GC_thread p;
+ DCL_LOCK_STATE;
+
+ LOCK();
+ for (p = GC_threads[hv_guess]; 0 != p; p = p -> tm.next) {
+ if (THREAD_EQUAL(p -> pthread_id, id))
+ goto foundit;
+ }
+ for (hv = 0; hv < THREAD_TABLE_SZ; ++hv) {
+ for (p = GC_threads[hv]; 0 != p; p = p -> tm.next) {
+ if (THREAD_EQUAL(p -> pthread_id, id))
+ goto foundit;
+ }
+ }
+ p = 0;
+ foundit:
+ UNLOCK();
+ return p;
+ }
+ }
+
+#endif /* GC_PTHREADS */
+
+#ifdef CAN_HANDLE_FORK
+ /* Similar to that in pthread_support.c but also rehashes the table */
+ /* since hash map key (thread_id) differs from that in the parent. */
+ STATIC void GC_remove_all_threads_but_me(void)
+ {
+ int hv;
+ GC_thread me = NULL;
+ DWORD thread_id;
+ pthread_t pthread_id = pthread_self(); /* same as in parent */
+
+ GC_ASSERT(!GC_win32_dll_threads);
+ for (hv = 0; hv < THREAD_TABLE_SZ; ++hv) {
+ GC_thread p, next;
+
+ for (p = GC_threads[hv]; 0 != p; p = next) {
+ next = p -> tm.next;
+ if (THREAD_EQUAL(p -> pthread_id, pthread_id)
+ && me == NULL) { /* ignore dead threads with the same id */
+ me = p;
+ p -> tm.next = 0;
+ } else {
+# ifdef THREAD_LOCAL_ALLOC
+ if ((p -> flags & FINISHED) == 0) {
+ /* Cannot call GC_destroy_thread_local here (see the */
+ /* corresponding comment in pthread_support.c). */
+ GC_remove_specific_after_fork(GC_thread_key, p -> pthread_id);
+ }
+# endif
+ if (&first_thread != p)
+ GC_INTERNAL_FREE(p);
+ }
+ }
+ GC_threads[hv] = NULL;
+ }
+
+ /* Put "me" back to GC_threads. */
+ GC_ASSERT(me != NULL);
+ thread_id = GetCurrentThreadId(); /* differs from that in parent */
+ GC_threads[THREAD_TABLE_INDEX(thread_id)] = me;
+
+ /* Update Win32 thread Id and handle. */
+ me -> id = thread_id;
+# ifndef MSWINCE
+ if (!DuplicateHandle(GetCurrentProcess(), GetCurrentThread(),
+ GetCurrentProcess(), (HANDLE *)&me->handle,
+ 0 /* dwDesiredAccess */, FALSE /* bInheritHandle */,
+ DUPLICATE_SAME_ACCESS))
+ ABORT("DuplicateHandle failed");
+# endif
+
+# if defined(THREAD_LOCAL_ALLOC) && !defined(USE_CUSTOM_SPECIFIC)
+ /* For Cygwin, we need to re-assign thread-local pointer to */
+ /* 'tlfs' (it is OK to call GC_destroy_thread_local and */
+ /* GC_free_inner before this action). */
+ if (GC_setspecific(GC_thread_key, &me->tlfs) != 0)
+ ABORT("GC_setspecific failed (in child)");
+# endif
+ }
+
+ static void fork_prepare_proc(void)
+ {
+ LOCK();
+# ifdef PARALLEL_MARK
+ if (GC_parallel)
+ GC_wait_for_reclaim();
+# endif
+ GC_wait_for_gc_completion(TRUE);
+# ifdef PARALLEL_MARK
+ if (GC_parallel)
+ GC_acquire_mark_lock();
+# endif
+ }
+
+ static void fork_parent_proc(void)
+ {
+# ifdef PARALLEL_MARK
+ if (GC_parallel)
+ GC_release_mark_lock();
+# endif
+ UNLOCK();
+ }
+
+ static void fork_child_proc(void)
+ {
+# ifdef PARALLEL_MARK
+ if (GC_parallel) {
+ GC_release_mark_lock();
+ GC_parallel = FALSE; /* or GC_markers_m1 = 0 */
+ /* Turn off parallel marking in the child, since we are */
+ /* probably just going to exec, and we would have to */
+ /* restart mark threads. */
+ }
+# endif
+ GC_remove_all_threads_but_me();
+ UNLOCK();
+ }
+
+ /* Routines for fork handling by client (no-op if pthread_atfork works). */
+ GC_API void GC_CALL GC_atfork_prepare(void)
+ {
+ if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
+ if (GC_handle_fork <= 0)
+ fork_prepare_proc();
+ }
+
+ GC_API void GC_CALL GC_atfork_parent(void)
+ {
+ if (GC_handle_fork <= 0)
+ fork_parent_proc();
+ }
+
+ GC_API void GC_CALL GC_atfork_child(void)
+ {
+ if (GC_handle_fork <= 0)
+ fork_child_proc();
+ }
+#endif /* CAN_HANDLE_FORK */
+
+void GC_push_thread_structures(void)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+# ifndef GC_NO_THREADS_DISCOVERY
+ if (GC_win32_dll_threads) {
+ /* Unlike the other threads implementations, the thread table */
+ /* here contains no pointers to the collectible heap (note also */
+ /* that GC_PTHREADS is incompatible with DllMain-based thread */
+ /* registration). Thus we have no private structures we need */
+ /* to preserve. */
+ } else
+# endif
+ /* else */ {
+ GC_push_all(&GC_threads, (ptr_t)(&GC_threads) + sizeof(GC_threads));
+ }
+# if defined(THREAD_LOCAL_ALLOC) && defined(USE_CUSTOM_SPECIFIC)
+ GC_PUSH_ALL_SYM(GC_thread_key);
+ /* Just in case we ever use our own TLS implementation. */
+# endif
+}
+
+#ifdef WOW64_THREAD_CONTEXT_WORKAROUND
+# ifndef CONTEXT_EXCEPTION_ACTIVE
+# define CONTEXT_EXCEPTION_ACTIVE 0x08000000
+# define CONTEXT_EXCEPTION_REQUEST 0x40000000
+# define CONTEXT_EXCEPTION_REPORTING 0x80000000
+# endif
+ static GC_bool isWow64; /* Is running 32-bit code on Win64? */
+# define GET_THREAD_CONTEXT_FLAGS (isWow64 \
+ ? CONTEXT_INTEGER | CONTEXT_CONTROL \
+ | CONTEXT_EXCEPTION_REQUEST | CONTEXT_SEGMENTS \
+ : CONTEXT_INTEGER | CONTEXT_CONTROL)
+#elif defined(I386) || defined(XMM_CANT_STORE_PTRS)
+# define GET_THREAD_CONTEXT_FLAGS (CONTEXT_INTEGER | CONTEXT_CONTROL)
+#else
+# define GET_THREAD_CONTEXT_FLAGS (CONTEXT_INTEGER | CONTEXT_CONTROL \
+ | CONTEXT_FLOATING_POINT)
+#endif /* !WOW64_THREAD_CONTEXT_WORKAROUND && !I386 */
+
+/* Suspend the given thread, if it's still active. */
+STATIC void GC_suspend(GC_thread t)
+{
+# ifndef MSWINCE
+ DWORD exitCode;
+# ifdef RETRY_GET_THREAD_CONTEXT
+ int retry_cnt;
+# define MAX_SUSPEND_THREAD_RETRIES (1000 * 1000)
+# endif
+# endif
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("Suspending 0x%x\n", (int)t->id);
+# endif
+ UNPROTECT_THREAD(t);
+ GC_acquire_dirty_lock();
+
+# ifdef MSWINCE
+ /* SuspendThread() will fail if thread is running kernel code. */
+ while (SuspendThread(THREAD_HANDLE(t)) == (DWORD)-1) {
+ GC_release_dirty_lock();
+ Sleep(10); /* in millis */
+ GC_acquire_dirty_lock();
+ }
+# elif defined(RETRY_GET_THREAD_CONTEXT)
+ for (retry_cnt = 0;;) {
+ /* Apparently the Windows 95 GetOpenFileName call creates */
+ /* a thread that does not properly get cleaned up, and */
+ /* SuspendThread on its descriptor may provoke a crash. */
+ /* This reduces the probability of that event, though it still */
+ /* appears there is a race here. */
+ if (GetExitCodeThread(t -> handle, &exitCode)
+ && exitCode != STILL_ACTIVE) {
+ GC_release_dirty_lock();
+# ifdef GC_PTHREADS
+ t -> stack_base = 0; /* prevent stack from being pushed */
+# else
+ /* This breaks pthread_join on Cygwin, which is guaranteed to */
+ /* only see user threads. */
+ GC_ASSERT(GC_win32_dll_threads);
+ GC_delete_gc_thread_no_free(t);
+# endif
+ return;
+ }
+
+ if (SuspendThread(t->handle) != (DWORD)-1) {
+ CONTEXT context;
+
+ context.ContextFlags = GET_THREAD_CONTEXT_FLAGS;
+ if (GetThreadContext(t->handle, &context)) {
+ /* TODO: WoW64 extra workaround: if CONTEXT_EXCEPTION_ACTIVE */
+ /* then Sleep(1) and retry. */
+ t->context_sp = copy_ptr_regs(t->context_regs, &context);
+ break; /* success; the context pointer registers are saved */
+ }
+
+ /* Resume the thread, try to suspend it in a better location. */
+ if (ResumeThread(t->handle) == (DWORD)-1)
+ ABORT("ResumeThread failed in suspend loop");
+ }
+ if (retry_cnt > 1) {
+ GC_release_dirty_lock();
+ Sleep(0); /* yield */
+ GC_acquire_dirty_lock();
+ }
+ if (++retry_cnt >= MAX_SUSPEND_THREAD_RETRIES)
+ ABORT("SuspendThread loop failed"); /* something must be wrong */
+ }
+# else
+ if (GetExitCodeThread(t -> handle, &exitCode)
+ && exitCode != STILL_ACTIVE) {
+ GC_release_dirty_lock();
+# ifdef GC_PTHREADS
+ t -> stack_base = 0; /* prevent stack from being pushed */
+# else
+ GC_ASSERT(GC_win32_dll_threads);
+ GC_delete_gc_thread_no_free(t);
+# endif
+ return;
+ }
+ if (SuspendThread(t -> handle) == (DWORD)-1)
+ ABORT("SuspendThread failed");
+# endif
+ t -> suspended = (unsigned char)TRUE;
+ GC_release_dirty_lock();
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_SUSPENDED, THREAD_HANDLE(t));
+}
+
+#if defined(GC_ASSERTIONS) \
+ && ((defined(MSWIN32) && !defined(CONSOLE_LOG)) || defined(MSWINCE))
+ GC_INNER GC_bool GC_write_disabled = FALSE;
+ /* TRUE only if GC_stop_world() acquired GC_write_cs. */
+#endif
+
+GC_INNER void GC_stop_world(void)
+{
+ DWORD thread_id = GetCurrentThreadId();
+
+ if (!GC_thr_initialized)
+ ABORT("GC_stop_world() called before GC_thr_init()");
+ GC_ASSERT(I_HOLD_LOCK());
+
+ /* This code is the same as in pthread_stop_world.c */
+# ifdef PARALLEL_MARK
+ if (GC_parallel) {
+ GC_acquire_mark_lock();
+ GC_ASSERT(GC_fl_builder_count == 0);
+ /* We should have previously waited for it to become zero. */
+ }
+# endif /* PARALLEL_MARK */
+
+# if !defined(GC_NO_THREADS_DISCOVERY) || defined(GC_ASSERTIONS)
+ GC_please_stop = TRUE;
+# endif
+# if (defined(MSWIN32) && !defined(CONSOLE_LOG)) || defined(MSWINCE)
+ GC_ASSERT(!GC_write_disabled);
+ EnterCriticalSection(&GC_write_cs);
+ /* It's not allowed to call GC_printf() (and friends) here down to */
+ /* LeaveCriticalSection (same applies recursively to GC_suspend, */
+ /* GC_delete_gc_thread_no_free, GC_get_max_thread_index, GC_size */
+ /* and GC_remove_protection). */
+# ifdef GC_ASSERTIONS
+ GC_write_disabled = TRUE;
+# endif
+# endif
+# ifndef GC_NO_THREADS_DISCOVERY
+ if (GC_win32_dll_threads) {
+ int i;
+ int my_max;
+ /* Any threads being created during this loop will end up setting */
+ /* GC_attached_thread when they start. This will force marking */
+ /* to restart. This is not ideal, but hopefully correct. */
+ AO_store(&GC_attached_thread, FALSE);
+ my_max = (int)GC_get_max_thread_index();
+ for (i = 0; i <= my_max; i++) {
+ GC_vthread t = dll_thread_table + i;
+ if (t -> stack_base != 0 && t -> thread_blocked_sp == NULL
+ && t -> id != thread_id) {
+ GC_suspend((GC_thread)t);
+ }
+ }
+ } else
+# endif
+ /* else */ {
+ GC_thread t;
+ int i;
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (t = GC_threads[i]; t != 0; t = t -> tm.next) {
+ if (t -> stack_base != 0 && t -> thread_blocked_sp == NULL
+ && !KNOWN_FINISHED(t) && t -> id != thread_id) {
+ GC_suspend(t);
+ }
+ }
+ }
+ }
+# if (defined(MSWIN32) && !defined(CONSOLE_LOG)) || defined(MSWINCE)
+# ifdef GC_ASSERTIONS
+ GC_write_disabled = FALSE;
+# endif
+ LeaveCriticalSection(&GC_write_cs);
+# endif
+# ifdef PARALLEL_MARK
+ if (GC_parallel)
+ GC_release_mark_lock();
+# endif
+}
+
+GC_INNER void GC_start_world(void)
+{
+# ifdef GC_ASSERTIONS
+ DWORD thread_id = GetCurrentThreadId();
+# endif
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (GC_win32_dll_threads) {
+ LONG my_max = GC_get_max_thread_index();
+ int i;
+
+ for (i = 0; i <= my_max; i++) {
+ GC_thread t = (GC_thread)(dll_thread_table + i);
+ if (t -> suspended) {
+# ifdef DEBUG_THREADS
+ GC_log_printf("Resuming 0x%x\n", (int)t->id);
+# endif
+ GC_ASSERT(t -> stack_base != 0 && t -> id != thread_id);
+ if (ResumeThread(THREAD_HANDLE(t)) == (DWORD)-1)
+ ABORT("ResumeThread failed");
+ t -> suspended = FALSE;
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_UNSUSPENDED, THREAD_HANDLE(t));
+ }
+ /* Else thread is unregistered or not suspended. */
+ }
+ } else {
+ GC_thread t;
+ int i;
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (t = GC_threads[i]; t != 0; t = t -> tm.next) {
+ if (t -> suspended) {
+# ifdef DEBUG_THREADS
+ GC_log_printf("Resuming 0x%x\n", (int)t->id);
+# endif
+ GC_ASSERT(t -> stack_base != 0 && t -> id != thread_id);
+ if (ResumeThread(THREAD_HANDLE(t)) == (DWORD)-1)
+ ABORT("ResumeThread failed");
+ UNPROTECT_THREAD(t);
+ t -> suspended = FALSE;
+ if (GC_on_thread_event)
+ GC_on_thread_event(GC_EVENT_THREAD_UNSUSPENDED, THREAD_HANDLE(t));
+ } else {
+# ifdef DEBUG_THREADS
+ GC_log_printf("Not resuming thread 0x%x as it is not suspended\n",
+ (int)t->id);
+# endif
+ }
+ }
+ }
+ }
+# if !defined(GC_NO_THREADS_DISCOVERY) || defined(GC_ASSERTIONS)
+ GC_please_stop = FALSE;
+# endif
+}
+
+#ifdef MSWINCE
+ /* The VirtualQuery calls below won't work properly on some old WinCE */
+ /* versions, but since each stack is restricted to an aligned 64 KiB */
+ /* region of virtual memory we can just take the next lowest multiple */
+ /* of 64 KiB. The result of this macro must not be used as its */
+ /* argument later and must not be used as the lower bound for sp */
+ /* check (since the stack may be bigger than 64 KiB). */
+# define GC_wince_evaluate_stack_min(s) \
+ (ptr_t)(((word)(s) - 1) & ~(word)0xFFFF)
+#elif defined(GC_ASSERTIONS)
+# define GC_dont_query_stack_min FALSE
+#endif
+
+/* A cache holding the results of the recent VirtualQuery call. */
+/* Protected by the allocation lock. */
+static ptr_t last_address = 0;
+static MEMORY_BASIC_INFORMATION last_info;
+
+/* Probe stack memory region (starting at "s") to find out its */
+/* lowest address (i.e. stack top). */
+/* S must be a mapped address inside the region, NOT the first */
+/* unmapped address. */
+STATIC ptr_t GC_get_stack_min(ptr_t s)
+{
+ ptr_t bottom;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (s != last_address) {
+ VirtualQuery(s, &last_info, sizeof(last_info));
+ last_address = s;
+ }
+ do {
+ bottom = (ptr_t)last_info.BaseAddress;
+ VirtualQuery(bottom - 1, &last_info, sizeof(last_info));
+ last_address = bottom - 1;
+ } while ((last_info.Protect & PAGE_READWRITE)
+ && !(last_info.Protect & PAGE_GUARD));
+ return(bottom);
+}
+
+/* Return true if the page at s has protections appropriate */
+/* for a stack page. */
+static GC_bool may_be_in_stack(ptr_t s)
+{
+ GC_ASSERT(I_HOLD_LOCK());
+ if (s != last_address) {
+ VirtualQuery(s, &last_info, sizeof(last_info));
+ last_address = s;
+ }
+ return (last_info.Protect & PAGE_READWRITE)
+ && !(last_info.Protect & PAGE_GUARD);
+}
+
+/* Copy all registers that might point into the heap. Frame */
+/* pointer registers are included in case client code was */
+/* compiled with the 'omit frame pointer' optimization. */
+/* The context register values are stored to regs argument */
+/* which is expected to be of PUSHED_REGS_COUNT length exactly. */
+/* The functions returns the context stack pointer value. */
+static ptr_t copy_ptr_regs(word *regs, const CONTEXT *pcontext) {
+ ptr_t sp;
+ int cnt = 0;
+# define context (*pcontext)
+# define PUSH1(reg) (regs[cnt++] = (word)pcontext->reg)
+# define PUSH2(r1,r2) (PUSH1(r1), PUSH1(r2))
+# define PUSH4(r1,r2,r3,r4) (PUSH2(r1,r2), PUSH2(r3,r4))
+# define PUSH8_LH(r1,r2,r3,r4) (PUSH4(r1.Low,r1.High,r2.Low,r2.High), \
+ PUSH4(r3.Low,r3.High,r4.Low,r4.High))
+# if defined(I386)
+# ifdef WOW64_THREAD_CONTEXT_WORKAROUND
+ PUSH2(ContextFlags, SegFs); /* cannot contain pointers */
+# endif
+ PUSH4(Edi,Esi,Ebx,Edx), PUSH2(Ecx,Eax), PUSH1(Ebp);
+ sp = (ptr_t)context.Esp;
+# elif defined(X86_64)
+ PUSH4(Rax,Rcx,Rdx,Rbx); PUSH2(Rbp, Rsi); PUSH1(Rdi);
+ PUSH4(R8, R9, R10, R11); PUSH4(R12, R13, R14, R15);
+# ifndef XMM_CANT_STORE_PTRS
+ PUSH8_LH(Xmm0, Xmm1, Xmm2, Xmm3);
+ PUSH8_LH(Xmm4, Xmm5, Xmm6, Xmm7);
+ PUSH8_LH(Xmm8, Xmm9, Xmm10, Xmm11);
+ PUSH8_LH(Xmm12, Xmm13, Xmm14, Xmm15);
+# endif
+ sp = (ptr_t)context.Rsp;
+# elif defined(ARM32)
+ PUSH4(R0,R1,R2,R3),PUSH4(R4,R5,R6,R7),PUSH4(R8,R9,R10,R11);
+ PUSH1(R12);
+ sp = (ptr_t)context.Sp;
+# elif defined(AARCH64)
+ PUSH4(X0,X1,X2,X3),PUSH4(X4,X5,X6,X7),PUSH4(X8,X9,X10,X11);
+ PUSH4(X12,X13,X14,X15),PUSH4(X16,X17,X18,X19),PUSH4(X20,X21,X22,X23);
+ PUSH4(X24,X25,X26,X27),PUSH1(X28);
+ PUSH1(Lr);
+ sp = (ptr_t)context.Sp;
+# elif defined(SHx)
+ PUSH4(R0,R1,R2,R3), PUSH4(R4,R5,R6,R7), PUSH4(R8,R9,R10,R11);
+ PUSH2(R12,R13), PUSH1(R14);
+ sp = (ptr_t)context.R15;
+# elif defined(MIPS)
+ PUSH4(IntAt,IntV0,IntV1,IntA0), PUSH4(IntA1,IntA2,IntA3,IntT0);
+ PUSH4(IntT1,IntT2,IntT3,IntT4), PUSH4(IntT5,IntT6,IntT7,IntS0);
+ PUSH4(IntS1,IntS2,IntS3,IntS4), PUSH4(IntS5,IntS6,IntS7,IntT8);
+ PUSH4(IntT9,IntK0,IntK1,IntS8);
+ sp = (ptr_t)context.IntSp;
+# elif defined(PPC)
+ PUSH4(Gpr0, Gpr3, Gpr4, Gpr5), PUSH4(Gpr6, Gpr7, Gpr8, Gpr9);
+ PUSH4(Gpr10,Gpr11,Gpr12,Gpr14), PUSH4(Gpr15,Gpr16,Gpr17,Gpr18);
+ PUSH4(Gpr19,Gpr20,Gpr21,Gpr22), PUSH4(Gpr23,Gpr24,Gpr25,Gpr26);
+ PUSH4(Gpr27,Gpr28,Gpr29,Gpr30), PUSH1(Gpr31);
+ sp = (ptr_t)context.Gpr1;
+# elif defined(ALPHA)
+ PUSH4(IntV0,IntT0,IntT1,IntT2), PUSH4(IntT3,IntT4,IntT5,IntT6);
+ PUSH4(IntT7,IntS0,IntS1,IntS2), PUSH4(IntS3,IntS4,IntS5,IntFp);
+ PUSH4(IntA0,IntA1,IntA2,IntA3), PUSH4(IntA4,IntA5,IntT8,IntT9);
+ PUSH4(IntT10,IntT11,IntT12,IntAt);
+ sp = (ptr_t)context.IntSp;
+# elif defined(CPPCHECK)
+ sp = (ptr_t)(word)cnt; /* to workaround "cnt not used" false positive */
+# else
+# error Architecture is not supported
+# endif
+# undef context
+ GC_ASSERT(cnt == PUSHED_REGS_COUNT);
+ return sp;
+}
+
+STATIC word GC_push_stack_for(GC_thread thread, DWORD me)
+{
+ ptr_t sp, stack_min;
+
+ struct GC_traced_stack_sect_s *traced_stack_sect =
+ thread -> traced_stack_sect;
+ if (thread -> id == me) {
+ GC_ASSERT(thread -> thread_blocked_sp == NULL);
+ sp = GC_approx_sp();
+ } else if ((sp = thread -> thread_blocked_sp) == NULL) {
+ /* Use saved sp value for blocked threads. */
+# ifdef RETRY_GET_THREAD_CONTEXT
+ /* We cache context when suspending the thread since it may */
+ /* require looping. */
+ word *regs = thread->context_regs;
+
+ if (thread->suspended) {
+ sp = thread->context_sp;
+ } else
+# else
+ word regs[PUSHED_REGS_COUNT];
+# endif
+
+ /* else */ {
+ CONTEXT context;
+
+ /* For unblocked threads call GetThreadContext(). */
+ context.ContextFlags = GET_THREAD_CONTEXT_FLAGS;
+ if (GetThreadContext(THREAD_HANDLE(thread), &context)) {
+ sp = copy_ptr_regs(regs, &context);
+ } else {
+# ifdef RETRY_GET_THREAD_CONTEXT
+ /* At least, try to use the stale context if saved. */
+ sp = thread->context_sp;
+ if (NULL == sp) {
+ /* Skip the current thread, anyway its stack will */
+ /* be pushed when the world is stopped. */
+ return 0;
+ }
+# else
+ ABORT("GetThreadContext failed");
+# endif
+ }
+ }
+# ifdef THREAD_LOCAL_ALLOC
+ GC_ASSERT(thread->suspended || !GC_world_stopped);
+# endif
+
+# ifndef WOW64_THREAD_CONTEXT_WORKAROUND
+ GC_push_many_regs(regs, PUSHED_REGS_COUNT);
+# else
+ GC_push_many_regs(regs + 2, PUSHED_REGS_COUNT - 2);
+ /* skip ContextFlags and SegFs */
+
+ /* WoW64 workaround. */
+ if (isWow64) {
+ DWORD ContextFlags = (DWORD)regs[0];
+
+ if ((ContextFlags & CONTEXT_EXCEPTION_REPORTING) != 0
+ && (ContextFlags & (CONTEXT_EXCEPTION_ACTIVE
+ /* | CONTEXT_SERVICE_ACTIVE */)) != 0) {
+ PNT_TIB tib;
+
+# ifdef MSWINRT_FLAVOR
+ tib = thread -> tib;
+# else
+ WORD SegFs = (WORD)regs[1];
+ LDT_ENTRY selector;
+
+ if (!GetThreadSelectorEntry(THREAD_HANDLE(thread), SegFs,
+ &selector))
+ ABORT("GetThreadSelectorEntry failed");
+ tib = (PNT_TIB)(selector.BaseLow
+ | (selector.HighWord.Bits.BaseMid << 16)
+ | (selector.HighWord.Bits.BaseHi << 24));
+# endif
+# ifdef DEBUG_THREADS
+ GC_log_printf("TIB stack limit/base: %p .. %p\n",
+ (void *)tib->StackLimit, (void *)tib->StackBase);
+# endif
+ GC_ASSERT(!((word)thread->stack_base
+ COOLER_THAN (word)tib->StackBase));
+ if (thread->stack_base != thread->initial_stack_base
+ /* We are in a coroutine. */
+ && ((word)thread->stack_base <= (word)tib->StackLimit
+ || (word)tib->StackBase < (word)thread->stack_base)) {
+ /* The coroutine stack is not within TIB stack. */
+ WARN("GetThreadContext might return stale register values"
+ " including ESP= %p\n", sp);
+ /* TODO: Because of WoW64 bug, there is no guarantee that */
+ /* sp really points to the stack top but, for now, we do */
+ /* our best as the TIB stack limit/base cannot be used */
+ /* while we are inside a coroutine. */
+ } else {
+ /* GetThreadContext() might return stale register values, */
+ /* so we scan the entire stack region (down to the stack */
+ /* limit). There is no 100% guarantee that all the */
+ /* registers are pushed but we do our best (the proper */
+ /* solution would be to fix it inside Windows). */
+ sp = (ptr_t)tib->StackLimit;
+ }
+ } /* else */
+# ifdef DEBUG_THREADS
+ else {
+ static GC_bool logged;
+ if (!logged
+ && (ContextFlags & CONTEXT_EXCEPTION_REPORTING) == 0) {
+ GC_log_printf("CONTEXT_EXCEPTION_REQUEST not supported\n");
+ logged = TRUE;
+ }
+ }
+# endif
+ }
+# endif /* WOW64_THREAD_CONTEXT_WORKAROUND */
+ } /* ! current thread */
+# ifdef STACKPTR_CORRECTOR_AVAILABLE
+ if (GC_sp_corrector != 0)
+ GC_sp_corrector((void **)&sp, (void *)(thread -> pthread_id));
+# endif
+
+ /* Set stack_min to the lowest address in the thread stack, */
+ /* or to an address in the thread stack no larger than sp, */
+ /* taking advantage of the old value to avoid slow traversals */
+ /* of large stacks. */
+ if (thread -> last_stack_min == ADDR_LIMIT) {
+# ifdef MSWINCE
+ if (GC_dont_query_stack_min) {
+ stack_min = GC_wince_evaluate_stack_min(traced_stack_sect != NULL ?
+ (ptr_t)traced_stack_sect : thread -> stack_base);
+ /* Keep last_stack_min value unmodified. */
+ } else
+# endif
+ /* else */ {
+ stack_min = GC_get_stack_min(traced_stack_sect != NULL ?
+ (ptr_t)traced_stack_sect : thread -> stack_base);
+ UNPROTECT_THREAD(thread);
+ thread -> last_stack_min = stack_min;
+ }
+ } else {
+ /* First, adjust the latest known minimum stack address if we */
+ /* are inside GC_call_with_gc_active(). */
+ if (traced_stack_sect != NULL &&
+ (word)thread->last_stack_min > (word)traced_stack_sect) {
+ UNPROTECT_THREAD(thread);
+ thread -> last_stack_min = (ptr_t)traced_stack_sect;
+ }
+
+ if ((word)sp < (word)thread->stack_base
+ && (word)sp >= (word)thread->last_stack_min) {
+ stack_min = sp;
+ } else {
+ /* In the current thread it is always safe to use sp value. */
+ if (may_be_in_stack(thread -> id == me &&
+ (word)sp < (word)thread->last_stack_min ?
+ sp : thread -> last_stack_min)) {
+ stack_min = (ptr_t)last_info.BaseAddress;
+ /* Do not probe rest of the stack if sp is correct. */
+ if ((word)sp < (word)stack_min
+ || (word)sp >= (word)thread->stack_base)
+ stack_min = GC_get_stack_min(thread -> last_stack_min);
+ } else {
+ /* Stack shrunk? Is this possible? */
+ stack_min = GC_get_stack_min(thread -> stack_base);
+ }
+ UNPROTECT_THREAD(thread);
+ thread -> last_stack_min = stack_min;
+ }
+ }
+
+ GC_ASSERT(GC_dont_query_stack_min
+ || stack_min == GC_get_stack_min(thread -> stack_base)
+ || ((word)sp >= (word)stack_min
+ && (word)stack_min < (word)thread->stack_base
+ && (word)stack_min
+ > (word)GC_get_stack_min(thread -> stack_base)));
+
+ if ((word)sp >= (word)stack_min && (word)sp < (word)thread->stack_base) {
+# ifdef DEBUG_THREADS
+ GC_log_printf("Pushing stack for 0x%x from sp %p to %p from 0x%x\n",
+ (int)thread->id, (void *)sp, (void *)thread->stack_base,
+ (int)me);
+# endif
+ GC_push_all_stack_sections(sp, thread->stack_base, traced_stack_sect);
+ } else {
+ /* If not current thread then it is possible for sp to point to */
+ /* the guarded (untouched yet) page just below the current */
+ /* stack_min of the thread. */
+ if (thread -> id == me || (word)sp >= (word)thread->stack_base
+ || (word)(sp + GC_page_size) < (word)stack_min)
+ WARN("Thread stack pointer %p out of range, pushing everything\n",
+ sp);
+# ifdef DEBUG_THREADS
+ GC_log_printf("Pushing stack for 0x%x from (min) %p to %p from 0x%x\n",
+ (int)thread->id, (void *)stack_min,
+ (void *)thread->stack_base, (int)me);
+# endif
+ /* Push everything - ignore "traced stack section" data. */
+ GC_push_all_stack(stack_min, thread->stack_base);
+ }
+ return thread->stack_base - sp; /* stack grows down */
+}
+
+/* We hold allocation lock. Should do exactly the right thing if the */
+/* world is stopped. Should not fail if it isn't. */
+GC_INNER void GC_push_all_stacks(void)
+{
+ DWORD thread_id = GetCurrentThreadId();
+ GC_bool found_me = FALSE;
+# ifndef SMALL_CONFIG
+ unsigned nthreads = 0;
+# endif
+ word total_size = 0;
+# ifndef GC_NO_THREADS_DISCOVERY
+ if (GC_win32_dll_threads) {
+ int i;
+ LONG my_max = GC_get_max_thread_index();
+
+ for (i = 0; i <= my_max; i++) {
+ GC_thread t = (GC_thread)(dll_thread_table + i);
+ if (t -> tm.in_use && t -> stack_base) {
+# ifndef SMALL_CONFIG
+ ++nthreads;
+# endif
+ total_size += GC_push_stack_for(t, thread_id);
+ if (t -> id == thread_id) found_me = TRUE;
+ }
+ }
+ } else
+# endif
+ /* else */ {
+ int i;
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ GC_thread t;
+ for (t = GC_threads[i]; t != 0; t = t -> tm.next) {
+ if (!KNOWN_FINISHED(t) && t -> stack_base) {
+# ifndef SMALL_CONFIG
+ ++nthreads;
+# endif
+ total_size += GC_push_stack_for(t, thread_id);
+ if (t -> id == thread_id) found_me = TRUE;
+ }
+ }
+ }
+ }
+# ifndef SMALL_CONFIG
+ GC_VERBOSE_LOG_PRINTF("Pushed %d thread stacks%s\n", nthreads,
+ GC_win32_dll_threads ?
+ " based on DllMain thread tracking" : "");
+# endif
+ if (!found_me && !GC_in_thread_creation)
+ ABORT("Collecting from unknown thread");
+ GC_total_stacksize = total_size;
+}
+
+#ifdef PARALLEL_MARK
+
+# ifndef MAX_MARKERS
+# define MAX_MARKERS 16
+# endif
+
+ static ptr_t marker_sp[MAX_MARKERS - 1]; /* The cold end of the stack */
+ /* for markers. */
+# ifdef IA64
+ static ptr_t marker_bsp[MAX_MARKERS - 1];
+# endif
+
+ static ptr_t marker_last_stack_min[MAX_MARKERS - 1];
+ /* Last known minimum (hottest) address */
+ /* in stack (or ADDR_LIMIT if unset) */
+ /* for markers. */
+
+#endif /* PARALLEL_MARK */
+
+/* Find stack with the lowest address which overlaps the */
+/* interval [start, limit). */
+/* Return stack bounds in *lo and *hi. If no such stack */
+/* is found, both *hi and *lo will be set to an address */
+/* higher than limit. */
+GC_INNER void GC_get_next_stack(char *start, char *limit,
+ char **lo, char **hi)
+{
+ int i;
+ char * current_min = ADDR_LIMIT; /* Least in-range stack base */
+ ptr_t *plast_stack_min = NULL; /* Address of last_stack_min */
+ /* field for thread corresponding */
+ /* to current_min. */
+ GC_thread thread = NULL; /* Either NULL or points to the */
+ /* thread's hash table entry */
+ /* containing *plast_stack_min. */
+
+ /* First set current_min, ignoring limit. */
+ if (GC_win32_dll_threads) {
+ LONG my_max = GC_get_max_thread_index();
+
+ for (i = 0; i <= my_max; i++) {
+ ptr_t s = (ptr_t)(dll_thread_table[i].stack_base);
+
+ if ((word)s > (word)start && (word)s < (word)current_min) {
+ /* Update address of last_stack_min. */
+ plast_stack_min = (ptr_t * /* no volatile */)
+ &dll_thread_table[i].last_stack_min;
+ current_min = s;
+# if defined(CPPCHECK)
+ /* To avoid a warning that thread is always null. */
+ thread = (GC_thread)&dll_thread_table[i];
+# endif
+ }
+ }
+ } else {
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ GC_thread t;
+
+ for (t = GC_threads[i]; t != 0; t = t -> tm.next) {
+ ptr_t s = t -> stack_base;
+
+ if ((word)s > (word)start && (word)s < (word)current_min) {
+ /* Update address of last_stack_min. */
+ plast_stack_min = &t -> last_stack_min;
+ thread = t; /* Remember current thread to unprotect. */
+ current_min = s;
+ }
+ }
+ }
+# ifdef PARALLEL_MARK
+ for (i = 0; i < GC_markers_m1; ++i) {
+ ptr_t s = marker_sp[i];
+# ifdef IA64
+ /* FIXME: not implemented */
+# endif
+ if ((word)s > (word)start && (word)s < (word)current_min) {
+ GC_ASSERT(marker_last_stack_min[i] != NULL);
+ plast_stack_min = &marker_last_stack_min[i];
+ current_min = s;
+ thread = NULL; /* Not a thread's hash table entry. */
+ }
+ }
+# endif
+ }
+
+ *hi = current_min;
+ if (current_min == ADDR_LIMIT) {
+ *lo = ADDR_LIMIT;
+ return;
+ }
+
+ GC_ASSERT((word)current_min > (word)start && plast_stack_min != NULL);
+# ifdef MSWINCE
+ if (GC_dont_query_stack_min) {
+ *lo = GC_wince_evaluate_stack_min(current_min);
+ /* Keep last_stack_min value unmodified. */
+ return;
+ }
+# endif
+
+ if ((word)current_min > (word)limit && !may_be_in_stack(limit)) {
+ /* Skip the rest since the memory region at limit address is */
+ /* not a stack (so the lowest address of the found stack would */
+ /* be above the limit value anyway). */
+ *lo = ADDR_LIMIT;
+ return;
+ }
+
+ /* Get the minimum address of the found stack by probing its memory */
+ /* region starting from the recent known minimum (if set). */
+ if (*plast_stack_min == ADDR_LIMIT
+ || !may_be_in_stack(*plast_stack_min)) {
+ /* Unsafe to start from last_stack_min value. */
+ *lo = GC_get_stack_min(current_min);
+ } else {
+ /* Use the recent value to optimize search for min address. */
+ *lo = GC_get_stack_min(*plast_stack_min);
+ }
+
+ /* Remember current stack_min value. */
+ if (thread != NULL) {
+ UNPROTECT_THREAD(thread);
+ }
+ *plast_stack_min = *lo;
+}
+
+#ifdef PARALLEL_MARK
+
+# if !defined(GC_PTHREADS_PARAMARK)
+ STATIC HANDLE GC_marker_cv[MAX_MARKERS - 1] = {0};
+ /* Events with manual reset (one for each */
+ /* mark helper). */
+
+ STATIC DWORD GC_marker_Id[MAX_MARKERS - 1] = {0};
+ /* This table is used for mapping helper */
+ /* threads ID to mark helper index (linear */
+ /* search is used since the mapping contains */
+ /* only a few entries). */
+# endif
+
+# if defined(GC_PTHREADS) && defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID)
+ static void set_marker_thread_name(unsigned id)
+ {
+ /* This code is the same as in pthread_support.c. */
+ char name_buf[16]; /* pthread_setname_np may fail for longer names */
+ int len = sizeof("GC-marker-") - 1;
+
+ /* Compose the name manually as snprintf may be unavailable or */
+ /* "%u directive output may be truncated" warning may occur. */
+ BCOPY("GC-marker-", name_buf, len);
+ if (id >= 10)
+ name_buf[len++] = (char)('0' + (id / 10) % 10);
+ name_buf[len] = (char)('0' + id % 10);
+ name_buf[len + 1] = '\0';
+
+ if (pthread_setname_np(pthread_self(), name_buf) != 0)
+ WARN("pthread_setname_np failed\n", 0);
+ }
+
+# elif !defined(MSWINCE)
+ /* A pointer to SetThreadDescription() which is available since */
+ /* Windows 10. The function prototype is in processthreadsapi.h. */
+ static FARPROC setThreadDescription_fn;
+
+ static void set_marker_thread_name(unsigned id)
+ {
+ WCHAR name_buf[16];
+ int len = sizeof(L"GC-marker-") / sizeof(WCHAR) - 1;
+ HRESULT hr;
+
+ if (!setThreadDescription_fn) return; /* missing SetThreadDescription */
+
+ /* Compose the name manually as swprintf may be unavailable. */
+ BCOPY(L"GC-marker-", name_buf, len * sizeof(WCHAR));
+ if (id >= 10)
+ name_buf[len++] = (WCHAR)('0' + (id / 10) % 10);
+ name_buf[len] = (WCHAR)('0' + id % 10);
+ name_buf[len + 1] = 0;
+
+ /* Invoke SetThreadDescription(). Cast the function pointer to word */
+ /* first to avoid "incompatible function types" compiler warning. */
+ hr = (*(HRESULT (WINAPI *)(HANDLE, const WCHAR *))
+ (word)setThreadDescription_fn)(GetCurrentThread(), name_buf);
+ if (FAILED(hr))
+ WARN("SetThreadDescription failed\n", 0);
+ }
+# else
+# define set_marker_thread_name(id) (void)(id)
+# endif
+
+ /* GC_mark_thread() is the same as in pthread_support.c */
+# ifdef GC_PTHREADS_PARAMARK
+ STATIC void * GC_mark_thread(void * id)
+# elif defined(MSWINCE)
+ STATIC DWORD WINAPI GC_mark_thread(LPVOID id)
+# else
+ STATIC unsigned __stdcall GC_mark_thread(void * id)
+# endif
+ {
+ word my_mark_no = 0;
+
+ if ((word)id == GC_WORD_MAX) return 0; /* to prevent a compiler warning */
+ set_marker_thread_name((unsigned)(word)id);
+ marker_sp[(word)id] = GC_approx_sp();
+# ifdef IA64
+ marker_bsp[(word)id] = GC_save_regs_in_stack();
+# endif
+# if !defined(GC_PTHREADS_PARAMARK)
+ GC_marker_Id[(word)id] = GetCurrentThreadId();
+# endif
+
+ /* Inform GC_start_mark_threads about completion of marker data init. */
+ GC_acquire_mark_lock();
+ if (0 == --GC_fl_builder_count) /* count may have a negative value */
+ GC_notify_all_builder();
+
+ for (;; ++my_mark_no) {
+ if (my_mark_no - GC_mark_no > (word)2) {
+ /* resynchronize if we get far off, e.g. because GC_mark_no */
+ /* wrapped. */
+ my_mark_no = GC_mark_no;
+ }
+# ifdef DEBUG_THREADS
+ GC_log_printf("Starting mark helper for mark number %lu\n",
+ (unsigned long)my_mark_no);
+# endif
+ GC_help_marker(my_mark_no);
+ }
+ }
+
+# ifndef GC_ASSERTIONS
+# define SET_MARK_LOCK_HOLDER (void)0
+# define UNSET_MARK_LOCK_HOLDER (void)0
+# endif
+
+ /* GC_mark_threads[] is unused here unlike that in pthread_support.c */
+
+ static int available_markers_m1 = 0;
+
+# ifdef GC_PTHREADS_PARAMARK
+# include <pthread.h>
+
+# if defined(GC_ASSERTIONS) && !defined(NUMERIC_THREAD_ID)
+# define NUMERIC_THREAD_ID(id) (unsigned long)(word)GC_PTHREAD_PTRVAL(id)
+ /* Id not guaranteed to be unique. */
+# endif
+
+# ifdef CAN_HANDLE_FORK
+ static pthread_cond_t mark_cv;
+ /* initialized by GC_start_mark_threads_inner */
+# else
+ static pthread_cond_t mark_cv = PTHREAD_COND_INITIALIZER;
+# endif
+
+ /* GC_start_mark_threads is the same as in pthread_support.c except */
+ /* for thread stack that is assumed to be large enough. */
+
+ GC_INNER void GC_start_mark_threads_inner(void)
+ {
+ int i;
+ pthread_attr_t attr;
+ pthread_t new_thread;
+# ifndef NO_MARKER_SPECIAL_SIGMASK
+ sigset_t set, oldset;
+# endif
+
+ GC_ASSERT(I_HOLD_LOCK());
+ ASSERT_CANCEL_DISABLED();
+ if (available_markers_m1 <= 0 || GC_parallel) return;
+ /* Skip if parallel markers disabled or already started. */
+ GC_wait_for_gc_completion(TRUE);
+
+# ifdef CAN_HANDLE_FORK
+ /* Reset mark_cv state after forking (as in pthread_support.c). */
+ {
+ pthread_cond_t mark_cv_local = PTHREAD_COND_INITIALIZER;
+ BCOPY(&mark_cv_local, &mark_cv, sizeof(mark_cv));
+ }
+# endif
+
+ GC_ASSERT(GC_fl_builder_count == 0);
+ if (0 != pthread_attr_init(&attr)) ABORT("pthread_attr_init failed");
+ if (0 != pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED))
+ ABORT("pthread_attr_setdetachstate failed");
+
+# ifndef NO_MARKER_SPECIAL_SIGMASK
+ /* Apply special signal mask to GC marker threads, and don't drop */
+ /* user defined signals by GC marker threads. */
+ if (sigfillset(&set) != 0)
+ ABORT("sigfillset failed");
+ if (pthread_sigmask(SIG_BLOCK, &set, &oldset) < 0) {
+ WARN("pthread_sigmask set failed, no markers started\n", 0);
+ GC_markers_m1 = 0;
+ (void)pthread_attr_destroy(&attr);
+ return;
+ }
+# endif /* !NO_MARKER_SPECIAL_SIGMASK */
+
+ /* To have proper GC_parallel value in GC_help_marker. */
+ GC_markers_m1 = available_markers_m1;
+
+ for (i = 0; i < available_markers_m1; ++i) {
+ marker_last_stack_min[i] = ADDR_LIMIT;
+ if (0 != pthread_create(&new_thread, &attr,
+ GC_mark_thread, (void *)(word)i)) {
+ WARN("Marker thread creation failed\n", 0);
+ /* Don't try to create other marker threads. */
+ GC_markers_m1 = i;
+ break;
+ }
+ }
+
+# ifndef NO_MARKER_SPECIAL_SIGMASK
+ /* Restore previous signal mask. */
+ if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) < 0) {
+ WARN("pthread_sigmask restore failed\n", 0);
+ }
+# endif
+
+ (void)pthread_attr_destroy(&attr);
+ GC_wait_for_markers_init();
+ GC_COND_LOG_PRINTF("Started %d mark helper threads\n", GC_markers_m1);
+ }
+
+# ifdef GC_ASSERTIONS
+ STATIC unsigned long GC_mark_lock_holder = NO_THREAD;
+# define SET_MARK_LOCK_HOLDER \
+ (void)(GC_mark_lock_holder = NUMERIC_THREAD_ID(pthread_self()))
+# define UNSET_MARK_LOCK_HOLDER \
+ do { \
+ GC_ASSERT(GC_mark_lock_holder \
+ == NUMERIC_THREAD_ID(pthread_self())); \
+ GC_mark_lock_holder = NO_THREAD; \
+ } while (0)
+# endif /* GC_ASSERTIONS */
+
+ static pthread_mutex_t mark_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+ static pthread_cond_t builder_cv = PTHREAD_COND_INITIALIZER;
+
+ /* GC_acquire/release_mark_lock(), GC_wait_builder/marker(), */
+ /* GC_wait_for_reclaim(), GC_notify_all_builder/marker() are the same */
+ /* as in pthread_support.c except that GC_generic_lock() is not used. */
+
+# ifdef LOCK_STATS
+ volatile AO_t GC_block_count = 0;
+# endif
+
+ GC_INNER void GC_acquire_mark_lock(void)
+ {
+# ifdef NUMERIC_THREAD_ID_UNIQUE
+ GC_ASSERT(GC_mark_lock_holder != NUMERIC_THREAD_ID(pthread_self()));
+# endif
+ if (pthread_mutex_lock(&mark_mutex) != 0) {
+ ABORT("pthread_mutex_lock failed");
+ }
+# ifdef LOCK_STATS
+ (void)AO_fetch_and_add1(&GC_block_count);
+# endif
+ /* GC_generic_lock(&mark_mutex); */
+ SET_MARK_LOCK_HOLDER;
+ }
+
+ GC_INNER void GC_release_mark_lock(void)
+ {
+ UNSET_MARK_LOCK_HOLDER;
+ if (pthread_mutex_unlock(&mark_mutex) != 0) {
+ ABORT("pthread_mutex_unlock failed");
+ }
+ }
+
+ /* Collector must wait for a freelist builders for 2 reasons: */
+ /* 1) Mark bits may still be getting examined without lock. */
+ /* 2) Partial free lists referenced only by locals may not be */
+ /* scanned correctly, e.g. if they contain "pointer-free" objects, */
+ /* since the free-list link may be ignored. */
+ STATIC void GC_wait_builder(void)
+ {
+ UNSET_MARK_LOCK_HOLDER;
+ if (pthread_cond_wait(&builder_cv, &mark_mutex) != 0) {
+ ABORT("pthread_cond_wait failed");
+ }
+ GC_ASSERT(GC_mark_lock_holder == NO_THREAD);
+ SET_MARK_LOCK_HOLDER;
+ }
+
+ GC_INNER void GC_wait_for_reclaim(void)
+ {
+ GC_acquire_mark_lock();
+ while (GC_fl_builder_count > 0) {
+ GC_wait_builder();
+ }
+ GC_release_mark_lock();
+ }
+
+ GC_INNER void GC_notify_all_builder(void)
+ {
+ GC_ASSERT(GC_mark_lock_holder == NUMERIC_THREAD_ID(pthread_self()));
+ if (pthread_cond_broadcast(&builder_cv) != 0) {
+ ABORT("pthread_cond_broadcast failed");
+ }
+ }
+
+ GC_INNER void GC_wait_marker(void)
+ {
+ GC_ASSERT(GC_parallel);
+ UNSET_MARK_LOCK_HOLDER;
+ if (pthread_cond_wait(&mark_cv, &mark_mutex) != 0) {
+ ABORT("pthread_cond_wait failed");
+ }
+ GC_ASSERT(GC_mark_lock_holder == NO_THREAD);
+ SET_MARK_LOCK_HOLDER;
+ }
+
+ GC_INNER void GC_notify_all_marker(void)
+ {
+ GC_ASSERT(GC_parallel);
+ if (pthread_cond_broadcast(&mark_cv) != 0) {
+ ABORT("pthread_cond_broadcast failed");
+ }
+ }
+
+# else /* ! GC_PTHREADS_PARAMARK */
+
+# ifndef MARK_THREAD_STACK_SIZE
+# define MARK_THREAD_STACK_SIZE 0 /* default value */
+# endif
+
+ /* mark_mutex_event, builder_cv, mark_cv are initialized in GC_thr_init */
+ static HANDLE mark_mutex_event = (HANDLE)0; /* Event with auto-reset. */
+ static HANDLE builder_cv = (HANDLE)0; /* Event with manual reset. */
+ static HANDLE mark_cv = (HANDLE)0; /* Event with manual reset. */
+
+ GC_INNER void GC_start_mark_threads_inner(void)
+ {
+ int i;
+
+ GC_ASSERT(I_HOLD_LOCK());
+ ASSERT_CANCEL_DISABLED();
+ if (available_markers_m1 <= 0 || GC_parallel) return;
+ GC_wait_for_gc_completion(TRUE);
+
+ GC_ASSERT(GC_fl_builder_count == 0);
+ /* Initialize GC_marker_cv[] fully before starting the */
+ /* first helper thread. */
+ GC_markers_m1 = available_markers_m1;
+ for (i = 0; i < GC_markers_m1; ++i) {
+ if ((GC_marker_cv[i] = CreateEvent(NULL /* attrs */,
+ TRUE /* isManualReset */,
+ FALSE /* initialState */,
+ NULL /* name (A/W) */)) == (HANDLE)0)
+ ABORT("CreateEvent failed");
+ }
+
+ for (i = 0; i < GC_markers_m1; ++i) {
+# if defined(MSWINCE) || defined(MSWIN_XBOX1)
+ HANDLE handle;
+ DWORD thread_id;
+
+ marker_last_stack_min[i] = ADDR_LIMIT;
+ /* There is no _beginthreadex() in WinCE. */
+ handle = CreateThread(NULL /* lpsa */,
+ MARK_THREAD_STACK_SIZE /* ignored */,
+ GC_mark_thread, (LPVOID)(word)i,
+ 0 /* fdwCreate */, &thread_id);
+ if (handle == NULL) {
+ WARN("Marker thread creation failed\n", 0);
+ /* The most probable failure reason is "not enough memory". */
+ /* Don't try to create other marker threads. */
+ break;
+ } else {
+ /* It's safe to detach the thread. */
+ CloseHandle(handle);
+ }
+# else
+ GC_uintptr_t handle;
+ unsigned thread_id;
+
+ marker_last_stack_min[i] = ADDR_LIMIT;
+ handle = _beginthreadex(NULL /* security_attr */,
+ MARK_THREAD_STACK_SIZE, GC_mark_thread,
+ (void *)(word)i, 0 /* flags */, &thread_id);
+ if (!handle || handle == (GC_uintptr_t)-1L) {
+ WARN("Marker thread creation failed\n", 0);
+ /* Don't try to create other marker threads. */
+ break;
+ } else {/* We may detach the thread (if handle is of HANDLE type) */
+ /* CloseHandle((HANDLE)handle); */
+ }
+# endif
+ }
+
+ /* Adjust GC_markers_m1 (and free unused resources) if failed. */
+ while (GC_markers_m1 > i) {
+ GC_markers_m1--;
+ CloseHandle(GC_marker_cv[GC_markers_m1]);
+ }
+ GC_wait_for_markers_init();
+ GC_COND_LOG_PRINTF("Started %d mark helper threads\n", GC_markers_m1);
+ if (i == 0) {
+ CloseHandle(mark_cv);
+ CloseHandle(builder_cv);
+ CloseHandle(mark_mutex_event);
+ }
+ }
+
+# ifdef GC_ASSERTIONS
+ STATIC DWORD GC_mark_lock_holder = NO_THREAD;
+# define SET_MARK_LOCK_HOLDER \
+ (void)(GC_mark_lock_holder = GetCurrentThreadId())
+# define UNSET_MARK_LOCK_HOLDER \
+ do { \
+ GC_ASSERT(GC_mark_lock_holder == GetCurrentThreadId()); \
+ GC_mark_lock_holder = NO_THREAD; \
+ } while (0)
+# endif /* GC_ASSERTIONS */
+
+ STATIC /* volatile */ LONG GC_mark_mutex_state = 0;
+ /* Mutex state: 0 - unlocked, */
+ /* 1 - locked and no other waiters, */
+ /* -1 - locked and waiters may exist. */
+ /* Accessed by InterlockedExchange(). */
+
+ /* #define LOCK_STATS */
+# ifdef LOCK_STATS
+ volatile AO_t GC_block_count = 0;
+ volatile AO_t GC_unlocked_count = 0;
+# endif
+
+ GC_INNER void GC_acquire_mark_lock(void)
+ {
+ GC_ASSERT(GC_mark_lock_holder != GetCurrentThreadId());
+ if (InterlockedExchange(&GC_mark_mutex_state, 1 /* locked */) != 0) {
+# ifdef LOCK_STATS
+ (void)AO_fetch_and_add1(&GC_block_count);
+# endif
+ /* Repeatedly reset the state and wait until acquire the lock. */
+ while (InterlockedExchange(&GC_mark_mutex_state,
+ -1 /* locked_and_has_waiters */) != 0) {
+ if (WaitForSingleObject(mark_mutex_event, INFINITE) == WAIT_FAILED)
+ ABORT("WaitForSingleObject failed");
+ }
+ }
+# ifdef LOCK_STATS
+ else {
+ (void)AO_fetch_and_add1(&GC_unlocked_count);
+ }
+# endif
+
+ GC_ASSERT(GC_mark_lock_holder == NO_THREAD);
+ SET_MARK_LOCK_HOLDER;
+ }
+
+ GC_INNER void GC_release_mark_lock(void)
+ {
+ UNSET_MARK_LOCK_HOLDER;
+ if (InterlockedExchange(&GC_mark_mutex_state, 0 /* unlocked */) < 0) {
+ /* wake a waiter */
+ if (SetEvent(mark_mutex_event) == FALSE)
+ ABORT("SetEvent failed");
+ }
+ }
+
+ /* In GC_wait_for_reclaim/GC_notify_all_builder() we emulate POSIX */
+ /* cond_wait/cond_broadcast() primitives with WinAPI Event object */
+ /* (working in "manual reset" mode). This works here because */
+ /* GC_notify_all_builder() is always called holding lock on */
+ /* mark_mutex and the checked condition (GC_fl_builder_count == 0) */
+ /* is the only one for which broadcasting on builder_cv is performed. */
+
+ GC_INNER void GC_wait_for_reclaim(void)
+ {
+ GC_ASSERT(builder_cv != 0);
+ for (;;) {
+ GC_acquire_mark_lock();
+ if (GC_fl_builder_count == 0)
+ break;
+ if (ResetEvent(builder_cv) == FALSE)
+ ABORT("ResetEvent failed");
+ GC_release_mark_lock();
+ if (WaitForSingleObject(builder_cv, INFINITE) == WAIT_FAILED)
+ ABORT("WaitForSingleObject failed");
+ }
+ GC_release_mark_lock();
+ }
+
+ GC_INNER void GC_notify_all_builder(void)
+ {
+ GC_ASSERT(GC_mark_lock_holder == GetCurrentThreadId());
+ GC_ASSERT(builder_cv != 0);
+ GC_ASSERT(GC_fl_builder_count == 0);
+ if (SetEvent(builder_cv) == FALSE)
+ ABORT("SetEvent failed");
+ }
+
+ /* mark_cv is used (for waiting) by a non-helper thread. */
+
+ GC_INNER void GC_wait_marker(void)
+ {
+ HANDLE event = mark_cv;
+ DWORD thread_id = GetCurrentThreadId();
+ int i = GC_markers_m1;
+
+ while (i-- > 0) {
+ if (GC_marker_Id[i] == thread_id) {
+ event = GC_marker_cv[i];
+ break;
+ }
+ }
+
+ if (ResetEvent(event) == FALSE)
+ ABORT("ResetEvent failed");
+ GC_release_mark_lock();
+ if (WaitForSingleObject(event, INFINITE) == WAIT_FAILED)
+ ABORT("WaitForSingleObject failed");
+ GC_acquire_mark_lock();
+ }
+
+ GC_INNER void GC_notify_all_marker(void)
+ {
+ DWORD thread_id = GetCurrentThreadId();
+ int i = GC_markers_m1;
+
+ while (i-- > 0) {
+ /* Notify every marker ignoring self (for efficiency). */
+ if (SetEvent(GC_marker_Id[i] != thread_id ? GC_marker_cv[i] :
+ mark_cv) == FALSE)
+ ABORT("SetEvent failed");
+ }
+ }
+
+# endif /* ! GC_PTHREADS_PARAMARK */
+
+ static unsigned required_markers_cnt = 0;
+ /* The default value (0) means the number of */
+ /* markers should be selected automatically. */
+
+# define START_MARK_THREADS() \
+ if (EXPECT(GC_parallel || available_markers_m1 <= 0, TRUE)) {} \
+ else GC_start_mark_threads()
+#else
+
+# define START_MARK_THREADS() (void)0
+#endif /* !PARALLEL_MARK */
+
+ /* We have no DllMain to take care of new threads. Thus we */
+ /* must properly intercept thread creation. */
+
+ typedef struct {
+ LPTHREAD_START_ROUTINE start;
+ LPVOID param;
+ } thread_args;
+
+ STATIC void * GC_CALLBACK GC_win32_start_inner(struct GC_stack_base *sb,
+ void *arg)
+ {
+ void * ret;
+ LPTHREAD_START_ROUTINE start = ((thread_args *)arg)->start;
+ LPVOID param = ((thread_args *)arg)->param;
+
+ GC_register_my_thread(sb); /* This waits for an in-progress GC. */
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("thread 0x%lx starting...\n", (long)GetCurrentThreadId());
+# endif
+
+ GC_free(arg);
+
+ /* Clear the thread entry even if we exit with an exception. */
+ /* This is probably pointless, since an uncaught exception is */
+ /* supposed to result in the process being killed. */
+# if !defined(__GNUC__) && !defined(NO_CRT)
+ ret = NULL; /* to suppress "might be uninitialized" compiler warning */
+ __try
+# endif
+ {
+ ret = (void *)(word)(*start)(param);
+ }
+# if !defined(__GNUC__) && !defined(NO_CRT)
+ __finally
+# endif
+ {
+ GC_unregister_my_thread();
+ }
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("thread 0x%lx returned from start routine\n",
+ (long)GetCurrentThreadId());
+# endif
+ return ret;
+ }
+
+ STATIC DWORD WINAPI GC_win32_start(LPVOID arg)
+ {
+ return (DWORD)(word)GC_call_with_stack_base(GC_win32_start_inner, arg);
+ }
+
+ GC_API HANDLE WINAPI GC_CreateThread(
+ LPSECURITY_ATTRIBUTES lpThreadAttributes,
+ GC_WIN32_SIZE_T dwStackSize,
+ LPTHREAD_START_ROUTINE lpStartAddress,
+ LPVOID lpParameter, DWORD dwCreationFlags,
+ LPDWORD lpThreadId)
+ {
+ if (!EXPECT(parallel_initialized, TRUE))
+ GC_init_parallel();
+ /* make sure GC is initialized (i.e. main thread is */
+ /* attached, tls initialized). */
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("About to create a thread from 0x%lx\n",
+ (long)GetCurrentThreadId());
+# endif
+ if (GC_win32_dll_threads) {
+ return CreateThread(lpThreadAttributes, dwStackSize, lpStartAddress,
+ lpParameter, dwCreationFlags, lpThreadId);
+ } else {
+ thread_args *args =
+ (thread_args *)GC_malloc_uncollectable(sizeof(thread_args));
+ /* Handed off to and deallocated by child thread. */
+ HANDLE thread_h;
+
+ if (NULL == args) {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return NULL;
+ }
+
+ /* set up thread arguments */
+ args -> start = lpStartAddress;
+ args -> param = lpParameter;
+ GC_dirty(args);
+ REACHABLE_AFTER_DIRTY(lpParameter);
+
+ START_MARK_THREADS();
+ set_need_to_lock();
+ thread_h = CreateThread(lpThreadAttributes, dwStackSize, GC_win32_start,
+ args, dwCreationFlags, lpThreadId);
+ if (thread_h == 0) GC_free(args);
+ return thread_h;
+ }
+ }
+
+ GC_API DECLSPEC_NORETURN void WINAPI GC_ExitThread(DWORD dwExitCode)
+ {
+ GC_unregister_my_thread();
+ ExitThread(dwExitCode);
+ }
+
+# if !defined(CYGWIN32) && !defined(MSWINCE) && !defined(MSWIN_XBOX1) \
+ && !defined(NO_CRT)
+ GC_API GC_uintptr_t GC_CALL GC_beginthreadex(
+ void *security, unsigned stack_size,
+ unsigned (__stdcall *start_address)(void *),
+ void *arglist, unsigned initflag,
+ unsigned *thrdaddr)
+ {
+ if (!EXPECT(parallel_initialized, TRUE))
+ GC_init_parallel();
+ /* make sure GC is initialized (i.e. main thread is */
+ /* attached, tls initialized). */
+# ifdef DEBUG_THREADS
+ GC_log_printf("About to create a thread from 0x%lx\n",
+ (long)GetCurrentThreadId());
+# endif
+
+ if (GC_win32_dll_threads) {
+ return _beginthreadex(security, stack_size, start_address,
+ arglist, initflag, thrdaddr);
+ } else {
+ GC_uintptr_t thread_h;
+ thread_args *args =
+ (thread_args *)GC_malloc_uncollectable(sizeof(thread_args));
+ /* Handed off to and deallocated by child thread. */
+
+ if (NULL == args) {
+ /* MSDN docs say _beginthreadex() returns 0 on error and sets */
+ /* errno to either EAGAIN (too many threads) or EINVAL (the */
+ /* argument is invalid or the stack size is incorrect), so we */
+ /* set errno to EAGAIN on "not enough memory". */
+ errno = EAGAIN;
+ return 0;
+ }
+
+ /* set up thread arguments */
+ args -> start = (LPTHREAD_START_ROUTINE)start_address;
+ args -> param = arglist;
+ GC_dirty(args);
+ REACHABLE_AFTER_DIRTY(arglist);
+
+ START_MARK_THREADS();
+ set_need_to_lock();
+ thread_h = _beginthreadex(security, stack_size,
+ (unsigned (__stdcall *)(void *))GC_win32_start,
+ args, initflag, thrdaddr);
+ if (thread_h == 0) GC_free(args);
+ return thread_h;
+ }
+ }
+
+ GC_API void GC_CALL GC_endthreadex(unsigned retval)
+ {
+ GC_unregister_my_thread();
+ _endthreadex(retval);
+ }
+# endif /* !CYGWIN32 && !MSWINCE && !MSWIN_XBOX1 && !NO_CRT */
+
+#ifdef GC_WINMAIN_REDIRECT
+ /* This might be useful on WinCE. Shouldn't be used with GC_DLL. */
+
+# if defined(MSWINCE) && defined(UNDER_CE)
+# define WINMAIN_LPTSTR LPWSTR
+# else
+# define WINMAIN_LPTSTR LPSTR
+# endif
+
+ /* This is defined in gc.h. */
+# undef WinMain
+
+ /* Defined outside GC by an application. */
+ int WINAPI GC_WinMain(HINSTANCE, HINSTANCE, WINMAIN_LPTSTR, int);
+
+ typedef struct {
+ HINSTANCE hInstance;
+ HINSTANCE hPrevInstance;
+ WINMAIN_LPTSTR lpCmdLine;
+ int nShowCmd;
+ } main_thread_args;
+
+ static DWORD WINAPI main_thread_start(LPVOID arg)
+ {
+ main_thread_args * args = (main_thread_args *) arg;
+ return (DWORD)GC_WinMain(args->hInstance, args->hPrevInstance,
+ args->lpCmdLine, args->nShowCmd);
+ }
+
+ STATIC void *GC_CALLBACK GC_waitForSingleObjectInfinite(void *handle)
+ {
+ return (void *)(word)WaitForSingleObject((HANDLE)handle, INFINITE);
+ }
+
+# ifndef WINMAIN_THREAD_STACK_SIZE
+# define WINMAIN_THREAD_STACK_SIZE 0 /* default value */
+# endif
+
+ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
+ WINMAIN_LPTSTR lpCmdLine, int nShowCmd)
+ {
+ DWORD exit_code = 1;
+
+ main_thread_args args = {
+ hInstance, hPrevInstance, lpCmdLine, nShowCmd
+ };
+ HANDLE thread_h;
+ DWORD thread_id;
+
+ /* initialize everything */
+ GC_INIT();
+
+ /* start the main thread */
+ thread_h = GC_CreateThread(NULL /* lpsa */,
+ WINMAIN_THREAD_STACK_SIZE /* ignored on WinCE */,
+ main_thread_start, &args, 0 /* fdwCreate */,
+ &thread_id);
+
+ if (thread_h != NULL) {
+ if ((DWORD)(word)GC_do_blocking(GC_waitForSingleObjectInfinite,
+ (void *)thread_h) == WAIT_FAILED)
+ ABORT("WaitForSingleObject(main_thread) failed");
+ GetExitCodeThread (thread_h, &exit_code);
+ CloseHandle (thread_h);
+ } else {
+ ABORT("GC_CreateThread(main_thread) failed");
+ }
+
+# ifdef MSWINCE
+ GC_deinit();
+# endif
+ return (int) exit_code;
+ }
+
+#endif /* GC_WINMAIN_REDIRECT */
+
+GC_API void GC_CALL GC_set_markers_count(unsigned markers GC_ATTR_UNUSED)
+{
+ /* The same implementation as in pthread_support.c. */
+# ifdef PARALLEL_MARK
+ required_markers_cnt = markers < MAX_MARKERS ? markers : MAX_MARKERS;
+# endif
+}
+
+#ifdef WOW64_THREAD_CONTEXT_WORKAROUND
+# ifdef MSWINRT_FLAVOR
+ /* Available on WinRT but we have to declare it manually. */
+ __declspec(dllimport) HMODULE WINAPI GetModuleHandleW(LPCWSTR);
+# endif
+
+ static GC_bool is_wow64_process(HMODULE hK32 GC_ATTR_UNUSED)
+ {
+ BOOL is_wow64;
+# ifdef MSWINRT_FLAVOR
+ /* Try to use IsWow64Process2 as it handles different WoW64 cases. */
+ HMODULE hWow64 = GetModuleHandleW(L"api-ms-win-core-wow64-l1-1-1.dll");
+
+ if (hWow64) {
+ FARPROC pfn2 = GetProcAddress(hWow64, "IsWow64Process2");
+ USHORT process_machine, native_machine;
+
+ if (pfn2
+ && (*(BOOL (WINAPI*)(HANDLE, USHORT*, USHORT*))(word)pfn2)(
+ GetCurrentProcess(), &process_machine, &native_machine))
+ return process_machine != native_machine;
+ }
+ if (IsWow64Process(GetCurrentProcess(), &is_wow64))
+ return (GC_bool)is_wow64;
+# else
+ if (hK32) {
+ FARPROC pfn = GetProcAddress(hK32, "IsWow64Process");
+
+ if (pfn
+ && (*(BOOL (WINAPI*)(HANDLE, BOOL*))(word)pfn)(
+ GetCurrentProcess(), &is_wow64))
+ return (GC_bool)is_wow64;
+ }
+# endif
+ return FALSE; /* IsWow64Process failed */
+ }
+#endif /* WOW64_THREAD_CONTEXT_WORKAROUND */
+
+#ifndef DONT_USE_ATEXIT
+ GC_INNER GC_bool GC_is_main_thread(void)
+ {
+ GC_ASSERT(GC_thr_initialized);
+ return GC_main_thread == GetCurrentThreadId();
+ }
+#endif /* !DONT_USE_ATEXIT */
+
+GC_INNER void GC_thr_init(void)
+{
+ struct GC_stack_base sb;
+# if (!defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID) && !defined(MSWINCE) \
+ && defined(PARALLEL_MARK)) || defined(WOW64_THREAD_CONTEXT_WORKAROUND)
+ HMODULE hK32;
+# ifdef MSWINRT_FLAVOR
+ MEMORY_BASIC_INFORMATION memInfo;
+
+ if (VirtualQuery((void*)(word)GetProcAddress, &memInfo, sizeof(memInfo))
+ != sizeof(memInfo))
+ ABORT("Weird VirtualQuery result");
+ hK32 = (HMODULE)memInfo.AllocationBase;
+# else
+ hK32 = GetModuleHandle(TEXT("kernel32.dll"));
+# endif
+# endif
+
+ GC_ASSERT(I_HOLD_LOCK());
+ if (GC_thr_initialized) return;
+
+ GC_ASSERT((word)&GC_threads % sizeof(word) == 0);
+ GC_main_thread = GetCurrentThreadId();
+ GC_thr_initialized = TRUE;
+
+# ifdef CAN_HANDLE_FORK
+ /* Prepare for forks if requested. */
+ if (GC_handle_fork) {
+# ifdef CAN_CALL_ATFORK
+ if (pthread_atfork(fork_prepare_proc, fork_parent_proc,
+ fork_child_proc) == 0) {
+ /* Handlers successfully registered. */
+ GC_handle_fork = 1;
+ } else
+# endif
+ /* else */ if (GC_handle_fork != -1)
+ ABORT("pthread_atfork failed");
+ }
+# endif
+# ifdef WOW64_THREAD_CONTEXT_WORKAROUND
+ /* Set isWow64 flag. */
+ isWow64 = is_wow64_process(hK32);
+# endif
+ /* Add the initial thread, so we can stop it. */
+ sb.mem_base = GC_stackbottom;
+ GC_ASSERT(sb.mem_base != NULL);
+# ifdef IA64
+ sb.reg_base = GC_register_stackbottom;
+# endif
+
+# if defined(PARALLEL_MARK)
+ {
+ char * markers_string = GETENV("GC_MARKERS");
+ int markers = required_markers_cnt;
+
+ if (markers_string != NULL) {
+ markers = atoi(markers_string);
+ if (markers <= 0 || markers > MAX_MARKERS) {
+ WARN("Too big or invalid number of mark threads: %" WARN_PRIdPTR
+ "; using maximum threads\n", (signed_word)markers);
+ markers = MAX_MARKERS;
+ }
+ } else if (0 == markers) {
+ /* Unless the client sets the desired number of */
+ /* parallel markers, it is determined based on the */
+ /* number of CPU cores. */
+# ifdef MSWINCE
+ /* There is no GetProcessAffinityMask() in WinCE. */
+ /* GC_sysinfo is already initialized. */
+ markers = (int)GC_sysinfo.dwNumberOfProcessors;
+# else
+# ifdef _WIN64
+ DWORD_PTR procMask = 0;
+ DWORD_PTR sysMask;
+# else
+ DWORD procMask = 0;
+ DWORD sysMask;
+# endif
+ int ncpu = 0;
+ if (
+# ifdef __cplusplus
+ GetProcessAffinityMask(GetCurrentProcess(), &procMask, &sysMask)
+# else
+ /* Cast args to void* for compatibility with some old SDKs. */
+ GetProcessAffinityMask(GetCurrentProcess(),
+ (void *)&procMask, (void *)&sysMask)
+# endif
+ && procMask) {
+ do {
+ ncpu++;
+ } while ((procMask &= procMask - 1) != 0);
+ }
+ markers = ncpu;
+# endif
+# if defined(GC_MIN_MARKERS) && !defined(CPPCHECK)
+ /* This is primarily for testing on systems without getenv(). */
+ if (markers < GC_MIN_MARKERS)
+ markers = GC_MIN_MARKERS;
+# endif
+ if (markers > MAX_MARKERS)
+ markers = MAX_MARKERS; /* silently limit the value */
+ }
+ available_markers_m1 = markers - 1;
+ }
+
+ /* Check whether parallel mode could be enabled. */
+ if (GC_win32_dll_threads || available_markers_m1 <= 0) {
+ /* Disable parallel marking. */
+ GC_parallel = FALSE;
+ GC_COND_LOG_PRINTF(
+ "Single marker thread, turning off parallel marking\n");
+ } else {
+# ifndef GC_PTHREADS_PARAMARK
+ /* Initialize Win32 event objects for parallel marking. */
+ mark_mutex_event = CreateEvent(NULL /* attrs */,
+ FALSE /* isManualReset */,
+ FALSE /* initialState */, NULL /* name */);
+ builder_cv = CreateEvent(NULL /* attrs */,
+ TRUE /* isManualReset */,
+ FALSE /* initialState */, NULL /* name */);
+ mark_cv = CreateEvent(NULL /* attrs */, TRUE /* isManualReset */,
+ FALSE /* initialState */, NULL /* name */);
+ if (mark_mutex_event == (HANDLE)0 || builder_cv == (HANDLE)0
+ || mark_cv == (HANDLE)0)
+ ABORT("CreateEvent failed");
+# endif
+# if !defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID) && !defined(MSWINCE)
+ if (hK32)
+ setThreadDescription_fn = GetProcAddress(hK32,
+ "SetThreadDescription");
+# endif
+ }
+# endif /* PARALLEL_MARK */
+
+ GC_ASSERT(0 == GC_lookup_thread_inner(GC_main_thread));
+ GC_register_my_thread_inner(&sb, GC_main_thread);
+}
+
+#ifdef GC_PTHREADS
+
+ struct start_info {
+ void *(*start_routine)(void *);
+ void *arg;
+ sem_t registered; /* 1 ==> in our thread table, but */
+ /* parent hasn't yet noticed. */
+ int detached;
+ };
+
+ GC_API int GC_pthread_join(pthread_t pthread_id, void **retval)
+ {
+ int result;
+ GC_thread t;
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(!GC_win32_dll_threads);
+# ifdef DEBUG_THREADS
+ GC_log_printf("thread %p(0x%lx) is joining thread %p\n",
+ (void *)GC_PTHREAD_PTRVAL(pthread_self()),
+ (long)GetCurrentThreadId(),
+ (void *)GC_PTHREAD_PTRVAL(pthread_id));
+# endif
+
+ /* After the join, thread id may have been recycled. */
+ t = GC_lookup_pthread(pthread_id);
+ result = pthread_join(pthread_id, retval);
+ if (0 == result) {
+ LOCK();
+ if ((t -> flags & FINISHED) != 0) {
+ GC_delete_gc_thread_no_free(t);
+ GC_INTERNAL_FREE(t);
+ }
+ UNLOCK();
+ }
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("thread %p(0x%lx) join with thread %p %s\n",
+ (void *)GC_PTHREAD_PTRVAL(pthread_self()),
+ (long)GetCurrentThreadId(),
+ (void *)GC_PTHREAD_PTRVAL(pthread_id),
+ result != 0 ? "failed" : "succeeded");
+# endif
+ return result;
+ }
+
+ /* Cygwin-pthreads calls CreateThread internally, but it's not easily */
+ /* interceptable by us..., so intercept pthread_create instead. */
+ GC_API int GC_pthread_create(pthread_t *new_thread,
+ GC_PTHREAD_CREATE_CONST pthread_attr_t *attr,
+ void *(*start_routine)(void *), void *arg)
+ {
+ int result;
+ struct start_info si;
+
+ if (!EXPECT(parallel_initialized, TRUE))
+ GC_init_parallel();
+ /* make sure GC is initialized (i.e. main thread is attached) */
+ GC_ASSERT(!GC_win32_dll_threads);
+
+ if (sem_init(&si.registered, GC_SEM_INIT_PSHARED, 0) != 0)
+ ABORT("sem_init failed");
+
+ si.start_routine = start_routine;
+ si.arg = arg;
+ si.detached = 0;
+ if (attr != NULL
+ && pthread_attr_getdetachstate(attr, &si.detached) != 0)
+ ABORT("pthread_attr_getdetachstate failed");
+# ifdef DEBUG_THREADS
+ GC_log_printf("About to create a thread from %p(0x%lx)\n",
+ (void *)GC_PTHREAD_PTRVAL(pthread_self()),
+ (long)GetCurrentThreadId());
+# endif
+ START_MARK_THREADS();
+ set_need_to_lock();
+ result = pthread_create(new_thread, attr, GC_pthread_start, &si);
+
+ /* Wait until child has been added to the thread table. */
+ /* This also ensures that we hold onto the stack-allocated si */
+ /* until the child is done with it. */
+ if (0 == result) {
+ while (0 != sem_wait(&si.registered)) {
+ if (EINTR != errno) ABORT("sem_wait failed");
+ }
+ }
+ sem_destroy(&si.registered);
+ return(result);
+ }
+
+ STATIC void * GC_CALLBACK GC_pthread_start_inner(struct GC_stack_base *sb,
+ void * arg)
+ {
+ struct start_info * si = (struct start_info *)arg;
+ void * result;
+ void *(*start)(void *);
+ void *start_arg;
+ DWORD thread_id = GetCurrentThreadId();
+ pthread_t pthread_id = pthread_self();
+ GC_thread me;
+ DCL_LOCK_STATE;
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("thread %p(0x%x) starting...\n",
+ (void *)GC_PTHREAD_PTRVAL(pthread_id), (int)thread_id);
+# endif
+
+ GC_ASSERT(!GC_win32_dll_threads);
+ /* If a GC occurs before the thread is registered, that GC will */
+ /* ignore this thread. That's fine, since it will block trying to */
+ /* acquire the allocation lock, and won't yet hold interesting */
+ /* pointers. */
+ LOCK();
+ /* We register the thread here instead of in the parent, so that */
+ /* we don't need to hold the allocation lock during pthread_create. */
+ me = GC_register_my_thread_inner(sb, thread_id);
+ SET_PTHREAD_MAP_CACHE(pthread_id, thread_id);
+ GC_ASSERT(me != &first_thread);
+ me -> pthread_id = pthread_id;
+ if (si->detached) me -> flags |= DETACHED;
+# ifdef THREAD_LOCAL_ALLOC
+ GC_init_thread_local(&me->tlfs);
+# endif
+ UNLOCK();
+
+ start = si -> start_routine;
+ start_arg = si -> arg;
+ sem_post(&(si -> registered)); /* Last action on si. */
+ /* OK to deallocate. */
+
+ pthread_cleanup_push(GC_thread_exit_proc, (void *)me);
+ result = (*start)(start_arg);
+ me -> status = result;
+ GC_dirty(me);
+ pthread_cleanup_pop(1);
+
+# ifdef DEBUG_THREADS
+ GC_log_printf("thread %p(0x%x) returned from start routine\n",
+ (void *)GC_PTHREAD_PTRVAL(pthread_id), (int)thread_id);
+# endif
+ return(result);
+ }
+
+ STATIC void * GC_pthread_start(void * arg)
+ {
+ return GC_call_with_stack_base(GC_pthread_start_inner, arg);
+ }
+
+ STATIC void GC_thread_exit_proc(void *arg)
+ {
+ GC_thread me = (GC_thread)arg;
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(!GC_win32_dll_threads);
+# ifdef DEBUG_THREADS
+ GC_log_printf("thread %p(0x%lx) called pthread_exit()\n",
+ (void *)GC_PTHREAD_PTRVAL(pthread_self()),
+ (long)GetCurrentThreadId());
+# endif
+
+ LOCK();
+ GC_wait_for_gc_completion(FALSE);
+# if defined(THREAD_LOCAL_ALLOC)
+ GC_ASSERT(GC_getspecific(GC_thread_key) == &me->tlfs);
+ GC_destroy_thread_local(&(me->tlfs));
+# endif
+ if (me -> flags & DETACHED) {
+ GC_delete_thread(GetCurrentThreadId());
+ } else {
+ /* deallocate it as part of join */
+ me -> flags |= FINISHED;
+ }
+# if defined(THREAD_LOCAL_ALLOC)
+ /* It is required to call remove_specific defined in specific.c. */
+ GC_remove_specific(GC_thread_key);
+# endif
+ UNLOCK();
+ }
+
+# ifndef GC_NO_PTHREAD_SIGMASK
+ /* pthreads-win32 does not support sigmask. */
+ /* So, nothing required here... */
+ GC_API int GC_pthread_sigmask(int how, const sigset_t *set,
+ sigset_t *oset)
+ {
+ return pthread_sigmask(how, set, oset);
+ }
+# endif /* !GC_NO_PTHREAD_SIGMASK */
+
+ GC_API int GC_pthread_detach(pthread_t thread)
+ {
+ int result;
+ GC_thread t;
+ DCL_LOCK_STATE;
+
+ GC_ASSERT(!GC_win32_dll_threads);
+ t = GC_lookup_pthread(thread);
+ result = pthread_detach(thread);
+ if (result == 0) {
+ LOCK();
+ t -> flags |= DETACHED;
+ /* Here the pthread thread id may have been recycled. */
+ if ((t -> flags & FINISHED) != 0) {
+ GC_delete_gc_thread_no_free(t);
+ GC_INTERNAL_FREE(t);
+ }
+ UNLOCK();
+ }
+ return result;
+ }
+
+#elif !defined(GC_NO_THREADS_DISCOVERY)
+ /* We avoid acquiring locks here, since this doesn't seem to be */
+ /* preemptible. This may run with an uninitialized collector, in */
+ /* which case we don't do much. This implies that no threads other */
+ /* than the main one should be created with an uninitialized */
+ /* collector. (The alternative of initializing the collector here */
+ /* seems dangerous, since DllMain is limited in what it can do.) */
+
+# ifdef GC_INSIDE_DLL
+ /* Export only if needed by client. */
+ GC_API
+# else
+# define GC_DllMain DllMain
+# endif
+ BOOL WINAPI GC_DllMain(HINSTANCE inst GC_ATTR_UNUSED, ULONG reason,
+ LPVOID reserved GC_ATTR_UNUSED)
+ {
+ DWORD thread_id;
+
+ /* Note that GC_use_threads_discovery should be called by the */
+ /* client application at start-up to activate automatic thread */
+ /* registration (it is the default GC behavior); */
+ /* to always have automatic thread registration turned on, the GC */
+ /* should be compiled with -D GC_DISCOVER_TASK_THREADS. */
+ if (!GC_win32_dll_threads && parallel_initialized) return TRUE;
+
+ switch (reason) {
+ case DLL_THREAD_ATTACH:
+# ifdef PARALLEL_MARK
+ /* Don't register marker threads. */
+ if (GC_parallel) {
+ /* We could reach here only if parallel_initialized == FALSE. */
+ break;
+ }
+# endif
+ /* FALLTHRU */
+ case DLL_PROCESS_ATTACH:
+ /* This may run with the collector uninitialized. */
+ thread_id = GetCurrentThreadId();
+ if (parallel_initialized && GC_main_thread != thread_id) {
+ struct GC_stack_base sb;
+ /* Don't lock here. */
+# ifdef GC_ASSERTIONS
+ int sb_result =
+# endif
+ GC_get_stack_base(&sb);
+ GC_ASSERT(sb_result == GC_SUCCESS);
+ GC_register_my_thread_inner(&sb, thread_id);
+ } /* o.w. we already did it during GC_thr_init, called by GC_init */
+ break;
+
+ case DLL_THREAD_DETACH:
+ /* We are hopefully running in the context of the exiting thread. */
+ if (GC_win32_dll_threads) {
+ GC_delete_thread(GetCurrentThreadId());
+ }
+ break;
+
+ case DLL_PROCESS_DETACH:
+ if (GC_win32_dll_threads) {
+ int i;
+ int my_max = (int)GC_get_max_thread_index();
+
+ for (i = 0; i <= my_max; ++i) {
+ if (AO_load(&(dll_thread_table[i].tm.in_use)))
+ GC_delete_gc_thread_no_free(&dll_thread_table[i]);
+ }
+ GC_deinit();
+ }
+ break;
+ }
+ return TRUE;
+ }
+#endif /* !GC_NO_THREADS_DISCOVERY && !GC_PTHREADS */
+
+/* Perform all initializations, including those that */
+/* may require allocation. */
+/* Called without allocation lock. */
+/* Must be called before a second thread is created. */
+GC_INNER void GC_init_parallel(void)
+{
+# if defined(THREAD_LOCAL_ALLOC)
+ GC_thread me;
+ DCL_LOCK_STATE;
+# endif
+
+ if (parallel_initialized) return;
+ parallel_initialized = TRUE;
+ /* GC_init() calls us back, so set flag first. */
+
+ if (!GC_is_initialized) GC_init();
+# if defined(CPPCHECK) && !defined(GC_NO_THREADS_DISCOVERY)
+ GC_noop1((word)&GC_DllMain);
+# endif
+ if (GC_win32_dll_threads) {
+ set_need_to_lock();
+ /* Cannot intercept thread creation. Hence we don't know if */
+ /* other threads exist. However, client is not allowed to */
+ /* create other threads before collector initialization. */
+ /* Thus it's OK not to lock before this. */
+ }
+ /* Initialize thread local free lists if used. */
+# if defined(THREAD_LOCAL_ALLOC)
+ LOCK();
+ me = GC_lookup_thread_inner(GetCurrentThreadId());
+ CHECK_LOOKUP_MY_THREAD(me);
+ GC_init_thread_local(&me->tlfs);
+ UNLOCK();
+# endif
+}
+
+#if defined(USE_PTHREAD_LOCKS)
+ /* Support for pthread locking code. */
+ /* pthread_mutex_trylock may not win here, */
+ /* due to builtin support for spinning first? */
+
+ GC_INNER void GC_lock(void)
+ {
+ pthread_mutex_lock(&GC_allocate_ml);
+ }
+#endif /* USE_PTHREAD_LOCKS */
+
+#if defined(THREAD_LOCAL_ALLOC)
+
+ /* Add thread-local allocation support. VC++ uses __declspec(thread). */
+
+ /* We must explicitly mark ptrfree and gcj free lists, since the free */
+ /* list links wouldn't otherwise be found. We also set them in the */
+ /* normal free lists, since that involves touching less memory than if */
+ /* we scanned them normally. */
+ GC_INNER void GC_mark_thread_local_free_lists(void)
+ {
+ int i;
+ GC_thread p;
+
+ for (i = 0; i < THREAD_TABLE_SZ; ++i) {
+ for (p = GC_threads[i]; 0 != p; p = p -> tm.next) {
+ if (!KNOWN_FINISHED(p)) {
+# ifdef DEBUG_THREADS
+ GC_log_printf("Marking thread locals for 0x%x\n", (int)p -> id);
+# endif
+ GC_mark_thread_local_fls_for(&(p->tlfs));
+ }
+ }
+ }
+ }
+
+# if defined(GC_ASSERTIONS)
+ /* Check that all thread-local free-lists are completely marked. */
+ /* also check that thread-specific-data structures are marked. */
+ void GC_check_tls(void)
+ {
+ int i;
+ GC_thread p;
+
+ for (i = 0; i < THREAD_TABLE_SZ; ++i) {
+ for (p = GC_threads[i]; 0 != p; p = p -> tm.next) {
+ if (!KNOWN_FINISHED(p))
+ GC_check_tls_for(&(p->tlfs));
+ }
+ }
+# if defined(USE_CUSTOM_SPECIFIC)
+ if (GC_thread_key != 0)
+ GC_check_tsd_marks(GC_thread_key);
+# endif
+ }
+# endif /* GC_ASSERTIONS */
+
+#endif /* THREAD_LOCAL_ALLOC ... */
+
+# ifndef GC_NO_THREAD_REDIRECTS
+ /* Restore thread calls redirection. */
+# define CreateThread GC_CreateThread
+# define ExitThread GC_ExitThread
+# undef _beginthreadex
+# define _beginthreadex GC_beginthreadex
+# undef _endthreadex
+# define _endthreadex GC_endthreadex
+# endif /* !GC_NO_THREAD_REDIRECTS */
+
+#endif /* GC_WIN32_THREADS */
diff --git a/graphics/asymptote/gen_preprocessed_depfile.py b/graphics/asymptote/gen_preprocessed_depfile.py
new file mode 100644
index 0000000000..2e68e8fc8e
--- /dev/null
+++ b/graphics/asymptote/gen_preprocessed_depfile.py
@@ -0,0 +1,261 @@
+#!/usr/bin/env python3
+import io
+import json
+import shlex
+import subprocess as sp
+import sys
+import tempfile
+from argparse import ArgumentParser
+from typing import List, Optional
+
+
+def execute_and_report_err(args: List[str], error_heading="Error"):
+ try:
+ return sp.run(
+ args, stdout=sp.PIPE, stderr=sp.PIPE, universal_newlines=True, check=True
+ )
+ except sp.CalledProcessError as e:
+ sys.stderr.write(f"{error_heading}\n")
+ sys.stderr.write(e.stderr)
+ sys.stderr.write(f"stdout:\n{e.stdout}")
+ sys.stderr.write("\n")
+ sys.stderr.flush()
+ raise
+
+
+def parse_args():
+ args_parser = ArgumentParser()
+ args_parser.add_argument(
+ "--out-i-file", type=str, required=True, help="Output for preprocessed file"
+ )
+
+ args_parser.add_argument(
+ "--out-dep-file",
+ type=str,
+ required=False,
+ help="Location of output depfile. Optional when used with gcc. "
+ + "If not given, will not output dep file",
+ )
+
+ args_parser.add_argument(
+ "--in-src-file",
+ type=str,
+ required=True,
+ help="Location of source file to process",
+ )
+
+ args_parser.add_argument(
+ "--cxx-compiler", type=str, required=True, help="C++ compiler to use"
+ )
+
+ args_parser.add_argument("--msvc", action="store_true")
+
+ args_parser.add_argument(
+ "--include-dirs", type=str, help="Include directories separated by semicolon"
+ )
+
+ args_parser.add_argument(
+ "--additional-raw-arguments",
+ type=str,
+ help="Additional arguments to pass to the compiler. "
+ + "Only for use on UNIX systems",
+ )
+
+ args_parser.add_argument(
+ "--macro-defs",
+ type=str,
+ help="Macro definitions in the form VALA=CONTENTA or VALB",
+ )
+
+ args_parser.add_argument(
+ "--cxx-standard",
+ type=str,
+ )
+
+ args_parser.add_argument(
+ "--dep-file-only",
+ action="store_true",
+ help="If given, will only generate dependency file without preprocessed file."
+ + "For gcc usage only.",
+ )
+ return args_parser.parse_args()
+
+
+class CompileOptions:
+ def __init__(
+ self,
+ compiler: str,
+ include_dirs: Optional[List[str]] = None,
+ macros: Optional[List[str]] = None,
+ **kwargs,
+ ):
+ """
+ :param compiler: C++ compiler to use for preprocessing
+ :param include_dirs: List of include directories to pass to C++ compiler for
+ preprocessing
+ :param macros: List of macros to pass to the C++ compiler for preprocessing.
+ Must be in 'MACRO' or 'MACRO=VALUE' form.
+ :param kwargs: Accepts two extra arguments:
+ - "extra_flags": Extra flags to pass to compiler for preprocessing
+ - "standard": C++ standard to use.
+ This is passed to the compiler as "-std=c++<standard>".
+ """
+ self._compiler = compiler
+ self._include_dirs = include_dirs or []
+ self._macros = macros or []
+ self._extra_flags: List[str] = kwargs.get("extra_flags") or []
+ self._standard: str = kwargs.get("standard") or "17"
+
+ @property
+ def compiler(self):
+ return self._compiler
+
+ def build_args_for_gcc(
+ self,
+ src_file: str,
+ out_file: Optional[str],
+ addr_flags: Optional[List[str]] = None,
+ ):
+ base_args = (
+ [f"-I{include_dir}" for include_dir in self._include_dirs]
+ + [f"-D{macro}" for macro in self._macros]
+ + [f"-std=c++{self._standard}"]
+ + self._extra_flags
+ )
+
+ if addr_flags:
+ base_args.extend(addr_flags)
+
+ if out_file:
+ base_args.extend(["-o", out_file])
+
+ base_args.append(src_file)
+ return base_args
+
+ def build_args_for_msvc(
+ self,
+ src_file: str,
+ out_file: Optional[str],
+ addr_flags: Optional[List[str]] = None,
+ ):
+ base_args = (
+ [f"/I{include_dir}" for include_dir in self._include_dirs]
+ + [f"/D{macro}" for macro in self._macros]
+ + [f"/std:c++{self._standard}", "/Zc:__cplusplus"]
+ + self._extra_flags
+ )
+ if addr_flags:
+ base_args.extend(addr_flags)
+
+ if out_file:
+ base_args.extend(["/F", out_file])
+ base_args.append(src_file)
+ return base_args
+
+
+def compile_for_depfile_gcc(
+ compile_opt: CompileOptions, src_in: str, src_out: str, depfile_out: str
+):
+ args = [compile_opt.compiler] + compile_opt.build_args_for_gcc(
+ src_in,
+ None,
+ ["-DDEPEND", "-DNOSYM", "-M", "-MG", "-O0", "-MT", src_out, "-MF", depfile_out],
+ )
+ try:
+ sp.run(args, check=True, stdout=sp.PIPE, stderr=sp.PIPE, text=True)
+ except sp.CalledProcessError as e:
+ sys.stderr.write("Process stderr:\n")
+ sys.stderr.write(e.stderr)
+ sys.stderr.write("Process output:\n")
+ sys.stderr.write(e.stdout)
+ sys.stderr.flush()
+ raise
+
+
+def compile_for_preproc_gcc(compile_opt: CompileOptions, src_in: str, preproc_out: str):
+ args = [compile_opt.compiler] + compile_opt.build_args_for_gcc(
+ src_in, preproc_out, ["-E", "-DNOSYM"]
+ )
+ try:
+ sp.run(args, check=True, stdout=sp.PIPE, stderr=sp.PIPE, text=True)
+ except sp.CalledProcessError as e:
+ sys.stderr.write("Process stderr:\n")
+ sys.stderr.write(e.stderr)
+ sys.stderr.write("Process out:\n")
+ sys.stderr.write(e.stdout)
+ sys.stderr.flush()
+ raise
+
+
+def escape_windows_path(raw_path: str) -> str:
+ escape_chars = {" ", "$", "#"}
+ with io.StringIO() as ret_str_io:
+ for char in raw_path:
+ if char in escape_chars:
+ ret_str_io.write("\\")
+ ret_str_io.write(char)
+ return ret_str_io.getvalue()
+
+
+def compile_for_preproc_and_depfile_msvc(
+ compile_opt: CompileOptions, src_in: str, preproc_out: str, depfile_out: str
+):
+ with tempfile.TemporaryDirectory() as td:
+ args = [compile_opt.compiler] + compile_opt.build_args_for_msvc(
+ src_in,
+ None,
+ [
+ "/DNOSYM",
+ "/DDEPEND",
+ "/P",
+ f"/Fi{preproc_out}",
+ "/sourceDependencies",
+ f"{td}/srcdep.json",
+ ],
+ )
+ execute_and_report_err(args, "MSVC Error")
+ with open(f"{td}/srcdep.json", "r", encoding="utf-8") as fread:
+ dep_data = json.load(fread)
+
+ include_fil_str = " ".join(
+ escape_windows_path(include_fil)
+ for include_fil in dep_data["Data"].get("Includes", [])
+ )
+
+ with open(depfile_out, "w", encoding="utf-8") as depfile_writer:
+ depfile_writer.write(escape_windows_path(preproc_out))
+ depfile_writer.write(": ")
+ depfile_writer.write(include_fil_str)
+
+
+def main():
+ args = parse_args()
+ opt = CompileOptions(
+ args.cxx_compiler,
+ args.include_dirs.split(";") if args.include_dirs else None,
+ args.macro_defs.split(";") if args.macro_defs else None,
+ extra_flags=(
+ shlex.split(args.additional_raw_arguments)
+ if args.additional_raw_arguments
+ else None
+ ),
+ standard=args.cxx_standard,
+ )
+
+ if args.msvc:
+ compile_for_preproc_and_depfile_msvc(
+ opt, args.in_src_file, args.out_i_file, args.out_dep_file
+ )
+ else:
+ if not args.out_dep_file and args.dep_file_only:
+ raise RuntimeError("Dependency file output must be given")
+ if args.out_dep_file:
+ compile_for_depfile_gcc(
+ opt, args.in_src_file, args.out_i_file, args.out_dep_file
+ )
+ if not args.dep_file_only:
+ compile_for_preproc_gcc(opt, args.in_src_file, args.out_i_file)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/graphics/asymptote/generate_asy_list_file.py b/graphics/asymptote/generate_asy_list_file.py
new file mode 100644
index 0000000000..e28191590e
--- /dev/null
+++ b/graphics/asymptote/generate_asy_list_file.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python3
+__doc__ = """
+Script to generate asy.list file. Equivalent to Makefile's asy-list.el file's logic
+to generate asy.list.
+"""
+
+import argparse
+import pathlib
+import subprocess as sp
+from typing import Optional
+
+
+def parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--asy-executable", required=True, help="Asymptote executable")
+ parser.add_argument("--asy-base-dir", required=True, help="Asymptote base dir")
+ parser.add_argument("--output-file", required=True, help="Output file")
+ return parser.parse_args()
+
+
+def run_asy_list(asy_exec: str, base_dir: pathlib.Path, asy_file: Optional[str] = None):
+ base_args = [asy_exec, "-dir", str(base_dir), "-config", '""', "-render", "0", "-l"]
+ if asy_file is not None:
+ base_args.append(asy_file)
+ out_data = sp.run(
+ base_args,
+ stdout=sp.PIPE,
+ stderr=sp.PIPE,
+ universal_newlines=True,
+ check=True,
+ )
+ return out_data.stdout
+
+
+def base_file_to_be_included_in_list_file(base_file_name: str):
+ if base_file_name.startswith("plain") or base_file_name.startswith("three_"):
+ return False
+ if "map" in base_file_name:
+ return False
+ return True
+
+
+def main():
+ args = parse_args()
+ base_dir = pathlib.Path(args.asy_base_dir)
+ base_asy_list = run_asy_list(args.asy_executable, base_dir)
+
+ base_file: pathlib.Path
+ base_files_to_generate_list = [
+ base_file
+ for base_file in base_dir.glob("*.asy")
+ if base_file_to_be_included_in_list_file(base_file.name)
+ ]
+ base_file_asy_lists = [
+ run_asy_list(args.asy_executable, base_dir, str(base_file))
+ for base_file in base_files_to_generate_list
+ ]
+ with open(args.output_file, "w", encoding="utf-8") as fil:
+ fil.write(base_asy_list)
+ for asy_list_info in base_file_asy_lists:
+ fil.write(asy_list_info)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/graphics/asymptote/generate_asy_ver_info.py b/graphics/asymptote/generate_asy_ver_info.py
new file mode 100644
index 0000000000..2f55501453
--- /dev/null
+++ b/graphics/asymptote/generate_asy_ver_info.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+
+__doc__ = """
+Determines asymptote version for release, or with git info for development
+"""
+__author__ = "Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>"
+
+import pathlib
+import re
+import subprocess
+from argparse import ArgumentParser
+from subprocess import CalledProcessError
+
+from determine_pkg_info import determine_asy_pkg_info
+
+
+def parse_args():
+ parser = ArgumentParser()
+ parser.add_argument(
+ "--base-version",
+ type=str,
+ help="Base version string. If blank, this information is "
+ + "fetched from configure.ac",
+ )
+ version_mode = parser.add_mutually_exclusive_group()
+ version_mode.add_argument("--version-for-release", action="store_true")
+ version_mode.add_argument(
+ "--version-with-git-info",
+ action="store_true",
+ help="Includes number of commits since last tag, if directory is a git repo. "
+ + "If commit information cannot be determined, reverts to baseline version",
+ )
+
+ return parser.parse_args()
+
+
+def determine_version_for_release(version_base: str):
+ git_string = "git"
+ if version_base.endswith("git"):
+ return version_base[: -len(git_string)]
+ return version_base
+
+
+def determine_version_with_git_info(version_base: str):
+ try:
+ long_description = subprocess.run(
+ ["git", "describe", "--long"],
+ cwd=pathlib.Path(__file__).parent,
+ check=True,
+ stderr=subprocess.DEVNULL,
+ stdout=subprocess.PIPE,
+ text=True,
+ )
+ except CalledProcessError:
+ return version_base
+
+ first_version_base = re.sub(r"git-([0-9]*)-g.*", r"-\1", long_description.stdout)
+ return re.sub(r"-0-g.*", r"", first_version_base)
+
+
+def main():
+ args = parse_args()
+ version_base = args.base_version or determine_asy_pkg_info()["version-base"]
+
+ if args.version_for_release:
+ version = determine_version_for_release(version_base)
+ elif args.version_with_git_info:
+ version = determine_version_with_git_info(version_base)
+ else:
+ version = version_base
+
+ print(version, end="")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/graphics/asymptote/generate_enums.py b/graphics/asymptote/generate_enums.py
index 2843b9c3fe..389eaec46a 100755..100644
--- a/graphics/asymptote/generate_enums.py
+++ b/graphics/asymptote/generate_enums.py
@@ -1,4 +1,5 @@
#!/usr/bin/env python3
+# pylint: disable=too-many-locals,unused-argument,keyword-arg-before-vararg
# A script to generate enums in different languages from a CSV file.
# A CSV File contains
@@ -10,40 +11,42 @@
#
# Written by Supakorn "Jamie" Rassameemasmuang <jamievlin@outlook.com>
-from typing import List, Tuple, Any, Union
-from datetime import datetime, timezone
-import io
import argparse
+import io
import os
+import re
import sys
import time
-import re
+from datetime import datetime, timezone
+from typing import List, Tuple, Union
+
def cleanComment(s):
- return re.sub(r' *#',' ',s)
+ return re.sub(r" *#", " ", s)
+
def parse_args():
parser = argparse.ArgumentParser()
- parser.add_argument('-language', '--language', type=str, required=True)
- parser.add_argument('-o', '--output', type=str, required=True)
- parser.add_argument('-i', '--input', type=str, required=True)
- parser.add_argument('-name', '--name', type=str, required=True)
- parser.add_argument('-xopt', '--xopt', type=str, nargs='*')
+ parser.add_argument("-language", "--language", type=str, required=True)
+ parser.add_argument("-o", "--output", type=str, required=True)
+ parser.add_argument("-i", "--input", type=str, required=True)
+ parser.add_argument("-name", "--name", type=str, required=True)
+ parser.add_argument("-xopt", "--xopt", type=str, nargs="*")
return parser.parse_args()
def create_enums(filename: str) -> List[Union[Tuple[str, int, str], Tuple[str, int]]]:
- final_list=[]
- with io.open(filename,newline='') as rawfile:
+ final_list = []
+ with io.open(filename, newline="", encoding="utf-8") as rawfile:
for line in rawfile.readlines():
- if line.startswith('#') or line.strip() == '':
+ if line.startswith("#") or line.strip() == "":
continue
- raw_line=line.strip().split(',')
- raw_str, raw_number=raw_line[0:2]
- comment=None
- if len(raw_line)>=3:
- comment=raw_line[-1]
- final_list.append((raw_str.strip(), int(raw_number.strip()),comment))
+ raw_line = line.strip().split(",")
+ raw_str, raw_number = raw_line[0:2]
+ comment = None
+ if len(raw_line) >= 3:
+ comment = raw_line[-1]
+ final_list.append((raw_str.strip(), int(raw_number.strip()), comment))
else:
final_list.append((raw_str.strip(), int(raw_number.strip())))
return final_list
@@ -51,139 +54,137 @@ def create_enums(filename: str) -> List[Union[Tuple[str, int, str], Tuple[str, i
def datetime_now():
return datetime.fromtimestamp(
- int(os.environ.get('SOURCE_DATE_EPOCH', time.time())),tz=timezone.utc)
+ int(os.environ.get("SOURCE_DATE_EPOCH", time.time())), tz=timezone.utc
+ )
+
def generate_enum_cpp(outname, enums, name, comment=None, *args, **kwargs):
- with io.open(outname, 'w') as fil:
- fil.write('// Enum class for {0}\n'.format(name))
+ with io.open(outname, "w", encoding="utf-8") as fil:
+ fil.write(f"// Enum class for {name}\n")
if comment is not None:
- fil.write('// {0}\n'.format(comment))
- fil.write('// Generated at {0}\n\n'.format(datetime_now()))
- if 'namespace' in kwargs:
- fil.write('namespace {0}\n'.format(kwargs['namespace']))
- fil.write('{\n')
+ fil.write(f"// {comment}\n")
+ if "namespace" in kwargs:
+ fil.write(f"namespace {kwargs['namespace']}\n")
+ fil.write("{\n")
- fil.write('enum {0} : uint32_t\n'.format(name))
- fil.write('{\n')
+ fil.write(f"enum {name} : uint32_t\n")
+ fil.write("{\n")
for enumTxt, enumNum, *ar in enums:
- fil.write('{0}={1},\n'.format(enumTxt, enumNum))
if len(ar) > 0:
- comment=cleanComment(ar[-1])
+ comment = cleanComment(ar[-1])
if comment is not None:
- fil.write('// {0}\n\n'.format(comment.strip()))
+ fil.write(f"// {comment.strip()}\n")
+ fil.write(f"{enumTxt}={enumNum},\n\n")
- fil.write('};\n\n')
+ fil.write("};\n\n")
- if 'namespace' in kwargs:
- fil.write('}} // namespace {0}\n'.format(kwargs['namespace']))
- fil.write('// End of File\n')
+ if "namespace" in kwargs:
+ fil.write(f"}} // namespace {kwargs['namespace']}\n")
+ fil.write("// End of File\n")
def generate_enum_java(outname, enums, name, comment=None, *args, **kwargs):
- with io.open(outname, 'w') as fil:
- fil.write('// Enum class for {0}\n'.format(name))
+ with io.open(outname, "w", encoding="utf-8") as fil:
+ fil.write(f"// Enum class for {name}\n")
if comment is not None:
- fil.write('// {0}\n'.format(comment))
- fil.write('// Generated at {0}\n\n'.format(datetime_now()))
+ fil.write(f"// {comment}\n")
+ if "package" in kwargs:
+ fil.write(f"package {kwargs['package']};\n")
+ fil.write("\n")
- if 'package' in kwargs:
- fil.write('package {0};\n'.format(kwargs['package']))
- fil.write('\n')
+ fil.write(f"public enum {name} {{\n")
- fil.write('public enum {0} {{\n'.format(name))
+ spaces = kwargs.get("spaces", 4)
+ spaces_tab = " " * spaces
- spaces = kwargs.get('spaces', 4)
- spaces_tab=' '*spaces
-
- for i in range(len(enums)):
- enumTxt, enumNum, *ar = enums[i]
- endsep=',' if i < len(enums) - 1 else ';'
- fil.write('{2}{0}({1}){3}\n'.format(enumTxt,enumNum,spaces_tab,endsep))
+ for i, enum in enumerate(enums):
+ enumTxt, enumNum, *ar = enum
+ endsep = "," if i < len(enums) - 1 else ";"
+ fil.write(f"{spaces_tab}{enumTxt}({enumNum}){endsep}\n")
if len(ar) > 0:
- comment=cleanComment(ar[-1])
+ comment = cleanComment(ar[-1])
if comment is not None:
- fil.write('// {0}\n\n'.format(comment.strip()))
-
- out_lines=[
- '',
- '{0}(int value) {{'.format(name),
- '{0}this.value=value;'.format(spaces_tab),
- '}',
- 'public String toString() {',
- '{0}return Integer.toString(value);'.format(spaces_tab),
- '}',
- 'private int value;']
+ fil.write(f"// {comment.strip()}\n\n")
+
+ out_lines = [
+ "",
+ f"{name}(int value) {{",
+ f"{spaces_tab}this.value=value;",
+ "}",
+ "public String toString() {",
+ f"{spaces_tab}return Integer.toString(value);",
+ "}",
+ "private int value;",
+ ]
for line in out_lines:
fil.write(spaces_tab)
fil.write(line)
- fil.write('\n')
- fil.write('};\n\n')
- fil.write('// End of File\n')
+ fil.write("\n")
+ fil.write("};\n\n")
+ fil.write("// End of File\n")
def generate_enum_asy(outname, enums, name, comment=None, *args, **kwargs):
- with io.open(outname, 'w') as fil:
- fil.write('// Enum class for {0}\n'.format(name))
+ with io.open(outname, "w", encoding="utf-8") as fil:
+ fil.write(f"// Enum class for {name}\n")
if comment is not None:
- fil.write('// {0}\n'.format(comment))
- fil.write('// Generated at {0}\n\n'.format(datetime_now()))
-
- fil.write('struct {0}\n'.format(name))
- fil.write('{\n')
+ fil.write(f"// {comment}\n")
+ fil.write(f"struct {name}\n")
+ fil.write("{\n")
for enumTxt, enumNum, *ar in enums:
- fil.write(' int {0}={1};\n'.format(enumTxt, enumNum))
+ fil.write(f" int {enumTxt}={enumNum};\n")
if len(ar) > 0:
- comment=cleanComment(ar[-1])
+ comment = cleanComment(ar[-1])
if comment is not None:
- fil.write('// {0}\n\n'.format(comment.strip()))
- fil.write('};\n\n')
- fil.write('{0} {0};'.format(name))
+ fil.write(f"// {comment.strip()}\n\n")
+ fil.write("};\n\n")
+ fil.write(f"{name} {name};")
- fil.write('// End of File\n')
+ fil.write("// End of File\n")
def generate_enum_py(outname, enums, name, comment=None, *args, **kwargs):
- with io.open(outname, 'w') as fil:
- fil.write('#!/usr/bin/env python3\n')
- fil.write('# Enum class for {0}\n'.format(name))
+ with io.open(outname, "w", encoding="utf-8") as fil:
+ fil.write("#!/usr/bin/env python3\n")
+ fil.write(f"# Enum class for {name}\n")
if comment is not None:
- fil.write('""" {0} """\n'.format(comment))
- fil.write('# Generated at {0}\n\n'.format(datetime_now()))
- fil.write('class {0}:\n'.format(name))
+ fil.write(f'""" {comment} """\n')
+ fil.write(f"class {name}:\n")
for enumTxt, enumNum, *ar in enums:
- fil.write(' {0}_{2}={1}\n'.format(name, enumNum, enumTxt))
+ fil.write(f" {name}_{enumTxt}={enumNum}\n")
if len(ar) > 0:
- comment=cleanComment(ar[-1])
+ comment = cleanComment(ar[-1])
if comment is not None:
- fil.write(' # {0}\n\n'.format(comment.strip()))
- fil.write('# End of File\n')
+ fil.write(f" # {comment.strip()}\n\n")
+ fil.write("# End of File\n")
def main():
arg = parse_args()
- if arg.language in {'python', 'py'}:
+ if arg.language in {"python", "py"}:
fn = generate_enum_py
- elif arg.language in {'cxx', 'c++', 'cpp'}:
+ elif arg.language in {"cxx", "c++", "cpp"}:
fn = generate_enum_cpp
- elif arg.language in {'asy', 'asymptote'}:
+ elif arg.language in {"asy", "asymptote"}:
fn = generate_enum_asy
- elif arg.language in {'java'}:
+ elif arg.language in {"java"}:
fn = generate_enum_java
else:
return 1
- custom_args = dict()
+ custom_args = {}
if arg.xopt is not None:
for xopt in arg.xopt:
- key, val = xopt.split('=')
+ key, val = xopt.split("=")
custom_args[key] = val
enums = create_enums(arg.input)
- fn(arg.output, enums, arg.name, 'AUTO-GENERATED from '+arg.input, **custom_args)
+ fn(arg.output, enums, arg.name, "AUTO-GENERATED from " + arg.input, **custom_args)
+ return 0
-if __name__ == '__main__':
+if __name__ == "__main__":
sys.exit(main() or 0)
diff --git a/graphics/asymptote/genv.cc b/graphics/asymptote/genv.cc
index 65e132ef56..9f28d553e4 100644
--- a/graphics/asymptote/genv.cc
+++ b/graphics/asymptote/genv.cc
@@ -13,8 +13,58 @@
* in env.h.
*****/
+/* Implementation of templated modules:
+ *
+ * Translating an access declaration:
+ *
+ * access Map(Key=A, Value=B) as MapAB;
+ *
+ * run encodeLevel for both A and B
+ * this should give the parent records for each struct
+ * encode pushing the *number* of parents on the stack (i.e., push a
+ * single int)
+ * encode pushing the string "Map/1234567" on the stack
+ * encode call to builtin loadTemplatedModule
+ * also save into MapAB (varinit)
+ *
+ * build list of types (or tyEntry?)
+ *
+ * also ensure names match
+ *
+ * *****
+ *
+ * At runtime, loadTemplatedModule pops the string
+ *
+ * if the module is already loaded, it pops the levels
+ * and returns the already loaded module.
+ *
+ * if the module is not loaded, it leaves the levels on the stack
+ * and calls the initializer for the templated module
+ *
+ * it might be easiest to give the number of pushed params as an argument
+ * to loadTemplatedModule (ints and strings have no push/pop)
+ *
+ * *****
+ *
+ * Translating a templated module
+ *
+ * we start translating a file with a list of (name, type) pairs
+ *
+ * for each record type,
+ * build variables for each parent level
+ * and encode bytecode to pop the parents off the stack into these vars
+ *
+ * build tyEntry for each templated type
+ * if its a record, then use the above variables as ent->v
+ *
+ * from here,
+ * translate the file as a module as usual
+ *
+ *
+ */
+
#include <sstream>
-#include <unistd.h>
+
#include <algorithm>
#include "genv.h"
@@ -24,20 +74,19 @@
#include "types.h"
#include "settings.h"
#include "runtime.h"
-#include "parser.h"
+#include "asyparser.h"
#include "locate.h"
#include "interact.h"
#include "builtin.h"
+#if !defined(_WIN32)
+#include <unistd.h>
+#endif
+
using namespace types;
using settings::getSetting;
using settings::Setting;
-// Dynamic loading of external libraries.
-types::record *transExternalModule(
- trans::genv& ge, string filename, symbol id
-);
-
namespace trans {
genv::genv()
@@ -67,13 +116,6 @@ bool endswith(string suffix, string str)
}
record *genv::loadModule(symbol id, string filename) {
- // Hackish way to load an external library.
-#if 0
- if (endswith(".so", filename)) {
- return transExternalModule(*this, filename, id);
- }
-#endif
-
// Get the abstract syntax tree.
absyntax::file *ast = parser::parseFile(filename,"Loading");
@@ -91,15 +133,8 @@ record *genv::loadModule(symbol id, string filename) {
record *genv::loadTemplatedModule(
symbol id,
string filename,
- mem::vector<absyntax::namedTyEntry*> *args,
- coenv& e
+ mem::vector<absyntax::namedTy*> *args
) {
- // Hackish way to load an external library.
-#if 0
- if (endswith(".so", filename)) {
- return transExternalModule(*this, filename, id);
- }
-#endif
// Get the abstract syntax tree.
absyntax::file *ast = parser::parseFile(filename,"Loading");
@@ -108,7 +143,7 @@ record *genv::loadTemplatedModule(
em.sync();
- record *r=ast->transAsTemplatedFile(*this, id, args, e);
+ record *r=ast->transAsTemplatedFile(*this, id, args);
inTranslation.remove(filename);
@@ -121,7 +156,7 @@ void genv::checkRecursion(string filename) {
inTranslation.end()) {
em.sync();
em << "error: recursive loading of module '" << filename << "'\n";
- em.sync();
+ em.sync(true);
throw handled_error();
}
}
@@ -134,7 +169,7 @@ record *genv::getModule(symbol id, string filename) {
if (r)
return r;
else {
- record *r=loadModule(id, filename);
+ r=loadModule(id, filename);
// Don't add an erroneous module to the dictionary in interactive mode, as
// the user may try to load it again.
if (!interact::interactive || !em.errors()) {
@@ -146,18 +181,26 @@ record *genv::getModule(symbol id, string filename) {
}
record *genv::getTemplatedModule(
- symbol index,
string filename,
- mem::vector<absyntax::namedTyEntry*>* args,
- coenv& e
+ mem::vector<absyntax::namedTy*>* args
) {
checkRecursion(filename);
+ types::signature* sig = new types::signature();
+ stringstream buf;
+ buf << filename << "/";
+ for (auto arg : *args) {
+ sig->add(formal(arg->t, arg->dest));
+ buf << arg->dest << "/";
+ }
+ buf << sig->handle() << "/";
+ symbol index=symbol::literalTrans(buf.str());
+
record *r=imap[index];
if (r)
return r;
else {
- record *r=loadTemplatedModule(index, filename, args, e);
+ r=loadTemplatedModule(index, filename, args);
// Don't add an erroneous module to the dictionary in interactive mode, as
// the user may try to load it again.
if (!interact::interactive || !em.errors()) {
diff --git a/graphics/asymptote/genv.h b/graphics/asymptote/genv.h
index f78e9c59f2..cf6f5404e0 100644
--- a/graphics/asymptote/genv.h
+++ b/graphics/asymptote/genv.h
@@ -21,7 +21,6 @@
#include "record.h"
#include "absyn.h"
#include "access.h"
-#include "coenv.h"
#include "stack.h"
using types::record;
@@ -43,12 +42,11 @@ class genv : public gc {
void checkRecursion(string filename);
// Translate a module to build the record type.
- record *loadModule(symbol name, string s);
+ record *loadModule(symbol name, string filename);
record *loadTemplatedModule(
symbol id,
string filename,
- mem::vector<absyntax::namedTyEntry*> *args,
- coenv& e
+ mem::vector<absyntax::namedTy*> *args
);
public:
@@ -57,10 +55,8 @@ public:
// Get an imported module, translating if necessary.
record *getModule(symbol name, string filename);
record *getTemplatedModule(
- symbol index,
string filename,
- mem::vector<absyntax::namedTyEntry*> *args,
- coenv& e
+ mem::vector<absyntax::namedTy*> *args
);
record *getLoadedModule(symbol index);
diff --git a/graphics/asymptote/glew.c b/graphics/asymptote/glew.c
index a6009a40e8..a73295622d 100644
--- a/graphics/asymptote/glew.c
+++ b/graphics/asymptote/glew.c
@@ -1,13 +1,11 @@
+// this file is not used by cmake build.
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#ifdef __MSDOS__
-#define _WIN32
-#endif
-
#ifndef GLEW_INCLUDE
-#include <GL/glew.h>
+#include "GL/glew.h"
#else
#include GLEW_INCLUDE
#endif
@@ -18,5 +16,5 @@
#define APIENTRY
#endif
-#include "GL/glew.c"
+#include "backports/glew/src/glew.c"
#endif /* HAVE_LIBGL */
diff --git a/graphics/asymptote/glrender.cc b/graphics/asymptote/glrender.cc
index c64dc26d0d..d6da531413 100644
--- a/graphics/asymptote/glrender.cc
+++ b/graphics/asymptote/glrender.cc
@@ -11,8 +11,14 @@
#include <stdlib.h>
#include <fstream>
#include <cstring>
+#include <cmath>
+#include <chrono>
+#include <thread>
+
+#if !defined(_WIN32)
#include <sys/time.h>
#include <unistd.h>
+#endif
#include "common.h"
#include "locate.h"
@@ -64,10 +70,6 @@ pthread_t mainthread;
#include "GLTextures.h"
#include "EXRFiles.h"
-#ifdef HAVE_LIBOPENIMAGEIO
-#include <OpenImageIO/imageio.h>
-#endif
-
using settings::locateFile;
using utils::stopWatch;
@@ -234,6 +236,7 @@ double ymin,ymax;
double Xmin,Xmax;
double Ymin,Ymax;
double Zmin,Zmax;
+bool haveScene;
pair Shift;
pair Margin;
@@ -377,8 +380,10 @@ void ortho(GLdouble left, GLdouble right, GLdouble bottom,
void setProjection()
{
setDimensions(Width,Height,X,Y);
- if(orthographic) ortho(xmin,xmax,ymin,ymax,-Zmax,-Zmin);
- else frustum(xmin,xmax,ymin,ymax,-Zmax,-Zmin);
+ if(haveScene) {
+ if(orthographic) ortho(xmin,xmax,ymin,ymax,-Zmax,-Zmin);
+ else frustum(xmin,xmax,ymin,ymax,-Zmax,-Zmin);
+ }
}
void updateModelViewData()
@@ -439,6 +444,7 @@ void home(bool webgl=false)
}
double T[16];
+double Tup[16];
#ifdef HAVE_GL
@@ -481,7 +487,11 @@ GLTexture3<float,GL_FLOAT> fromEXR3(
std::copy(fil3.getData(),fil3.getData()+imSize,std::back_inserter(data));
}
- return GLTexture3<float,GL_FLOAT> {data.data(),std::tuple<int,int,int>(wi,ht,count),textureNumber,fmt};
+ return GLTexture3<float,GL_FLOAT> {
+ data.data(),
+ std::tuple<int,int,int>(wi,ht,static_cast<int>(count)),textureNumber,
+ fmt
+ };
}
void initIBL()
@@ -568,7 +578,7 @@ void initComputeShaders()
shaderParams.push_back(s.str().c_str());
s2 << "BLOCKSIZE " << gl::blockSize << "u" << endl;
shaderParams.push_back(s2.str().c_str());
- GLuint rc=compileAndLinkShader(shaders,shaderParams,true,false,true);
+ GLuint rc=compileAndLinkShader(shaders,shaderParams,true,false,true,true);
if(rc == 0) {
GPUindexing=false; // Compute shaders are unavailable.
if(settings::verbose > 2)
@@ -662,7 +672,8 @@ void initShaders()
if(GPUcompress)
shaderParams.push_back("GPUCOMPRESS");
shaders[1]=ShaderfileModePair(count.c_str(),GL_FRAGMENT_SHADER);
- camp::countShader=compileAndLinkShader(shaders,shaderParams,true);
+ camp::countShader=compileAndLinkShader(shaders,shaderParams,
+ true,false,false,true);
if(camp::countShader)
shaderParams.push_back("HAVE_SSBO");
#else
@@ -697,8 +708,8 @@ void initShaders()
shaderParams.push_back("NORMAL");
if(interlock) shaderParams.push_back("HAVE_INTERLOCK");
- camp::materialShader[0]=compileAndLinkShader(shaders,shaderParams,ssbo,
- interlock);
+ camp::materialShader[0]=compileAndLinkShader(shaders,shaderParams,
+ ssbo,interlock,false,true);
if(interlock && !camp::materialShader[0]) {
shaderParams.pop_back();
interlock=false;
@@ -843,6 +854,8 @@ void drawscene(int Width, int Height)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ if(xmin >= xmax || ymin >= ymax || Zmin >= Zmax) return;
+
triple m(xmin,ymin,Zmin);
triple M(xmax,ymax,Zmax);
double perspective=orthographic ? 0.0 : 1.0/Zmax;
@@ -894,33 +907,44 @@ void Export()
trImageBuffer(tr,GL_RGB,GL_UNSIGNED_BYTE,data);
setDimensions(fullWidth,fullHeight,X/Width*fullWidth,Y/Width*fullWidth);
- (orthographic ? trOrtho : trFrustum)(tr,xmin,xmax,ymin,ymax,-Zmax,-Zmin);
size_t count=0;
- do {
- trBeginTile(tr);
- remesh=true;
+ if(haveScene) {
+ (orthographic ? trOrtho : trFrustum)(tr,xmin,xmax,ymin,ymax,-Zmax,-Zmin);
+ do {
+ trBeginTile(tr);
+ remesh=true;
+ drawscene(fullWidth,fullHeight);
+ gl::lastshader=-1;
+ ++count;
+ } while (trEndTile(tr));
+ } else {// clear screen and return
drawscene(fullWidth,fullHeight);
- gl::lastshader=-1;
- ++count;
- } while (trEndTile(tr));
+ }
+
if(settings::verbose > 1)
cout << count << " tile" << (count != 1 ? "s" : "") << " drawn" << endl;
trDelete(tr);
picture pic;
- double w=oWidth;
- double h=oHeight;
- double Aspect=((double) fullWidth)/fullHeight;
- if(w > h*Aspect) w=(int) (h*Aspect+0.5);
- else h=(int) (w/Aspect+0.5);
- // Render an antialiased image.
- drawRawImage *Image=new drawRawImage(data,fullWidth,fullHeight,
- transform(0.0,0.0,w,0.0,0.0,h),
- antialias);
- pic.append(Image);
+ drawRawImage *Image=NULL;
+ if(haveScene) {
+ double w=oWidth;
+ double h=oHeight;
+ double Aspect=((double) fullWidth)/fullHeight;
+ if(w > h*Aspect) w=(int) (h*Aspect+0.5);
+ else h=(int) (w/Aspect+0.5);
+ // Render an antialiased image.
+
+ Image=new drawRawImage(data,fullWidth,fullHeight,
+ transform(0.0,0.0,w,0.0,0.0,h),
+ antialias);
+ pic.append(Image);
+ }
+
pic.shipout(NULL,Prefix,Format,false,ViewExport);
- delete Image;
+ if(Image)
+ delete Image;
delete[] data;
}
} catch(handled_error const&) {
@@ -1188,12 +1212,7 @@ void nextframe()
double seconds=frameTimer.seconds(true);
delay -= seconds;
if(delay > 0) {
- timespec req;
- timespec rem;
- req.tv_sec=(unsigned int) delay;
- req.tv_nsec=(unsigned int) (1.0e9*(delay-req.tv_sec));
- while(nanosleep(&req,&rem) < 0 && errno == EINTR)
- req=rem;
+ std::this_thread::sleep_for(std::chrono::duration<double>(delay));
}
if(Step) Animate=false;
}
@@ -1237,10 +1256,12 @@ void display()
queueExport=false;
}
if(!glthread) {
+#if !defined(_WIN32)
if(Oldpid != 0 && waitpid(Oldpid,NULL,WNOHANG) != Oldpid) {
kill(Oldpid,SIGHUP);
Oldpid=0;
}
+#endif
}
}
@@ -1305,7 +1326,9 @@ void reshape(int width, int height)
static bool initialize=true;
if(initialize) {
initialize=false;
+#if !defined(_WIN32)
Signal(SIGUSR1,updateHandler);
+#endif
}
}
@@ -1660,7 +1683,9 @@ void showCamera()
cout << "," << endl << indent << "angle=" << P.angle;
if(P.viewportshift != pair(0.0,0.0))
cout << "," << endl << indent << "viewportshift=" << P.viewportshift*Zoom;
- if(!orthographic)
+ if(orthographic)
+ cout << ",center=false";
+ else
cout << "," << endl << indent << "autoadjust=false";
cout << ");" << endl;
}
@@ -1781,7 +1806,7 @@ projection camera(bool user)
double R3=Rotate[j4+3];
double T4ij=T[i4+j];
sumCamera += T4ij*(R3-cx*R0-cy*R1-cz*R2);
- sumUp += T4ij*R1;
+ sumUp += Tup[i4+j]*R1;
sumTarget += T4ij*(R3-cx*R0-cy*R1);
}
vCamera[i]=sumCamera;
@@ -1904,42 +1929,38 @@ bool NVIDIA()
#endif /* HAVE_GL */
// angle=0 means orthographic.
-void glrender(const string& prefix, const picture *pic, const string& format,
- double width, double height, double angle, double zoom,
- const triple& m, const triple& M, const pair& shift,
- const pair& margin, double *t,
- double *background, size_t nlightsin, triple *lights,
- double *diffuse, double *specular, bool view, int oldpid)
+void glrender(GLRenderArgs const& args, int oldpid)
{
Iconify=getSetting<bool>("iconify");
- if(zoom == 0.0) zoom=1.0;
+ auto zoomVal=std::fpclassify(args.zoom) == FP_NORMAL ? args.zoom : 1.0;
- Prefix=prefix;
- Picture=pic;
- Format=format;
+ Prefix=args.prefix;
+ Picture=args.pic;
+ Format=args.format;
- nlights0=nlights=nlightsin;
+ nlights0=nlights=args.nlights;
- Lights=lights;
- Diffuse=diffuse;
- Specular=specular;
- View=view;
- Angle=angle*radians;
- Zoom0=zoom;
+ Lights=args.lights;
+ Diffuse=args.diffuse;
+ Specular=args.specular;
+ View=args.view;
+ Angle=args.angle*radians;
+ Zoom0=zoomVal;
Oldpid=oldpid;
- Shift=shift/zoom;
- Margin=margin;
+ Shift=args.shift/zoomVal;
+ Margin=args.margin;
for(size_t i=0; i < 4; ++i)
- Background[i]=background[i];
+ Background[i]=args.background[i];
- Xmin=m.getx();
- Xmax=M.getx();
- Ymin=m.gety();
- Ymax=M.gety();
- Zmin=m.getz();
- Zmax=M.getz();
+ Xmin=args.m.getx();
+ Xmax=args.M.getx();
+ Ymin=args.m.gety();
+ Ymax=args.M.gety();
+ Zmin=args.m.getz();
+ Zmax=args.M.getz();
+ haveScene=Xmin < Xmax && Ymin < Ymax && Zmin < Zmax;
orthographic=Angle == 0.0;
H=orthographic ? 0.0 : -tan(0.5*Angle)*Zmax;
@@ -1952,8 +1973,8 @@ void glrender(const string& prefix, const picture *pic, const string& format,
if(maxTileWidth <= 0) maxTileWidth=1024;
if(maxTileHeight <= 0) maxTileHeight=768;
- bool v3d=format == "v3d";
- bool webgl=format == "html";
+ bool v3d=args.format == "v3d";
+ bool webgl=args.format == "html";
bool format3d=webgl || v3d;
#ifdef HAVE_GL
@@ -1985,7 +2006,10 @@ void glrender(const string& prefix, const picture *pic, const string& format,
#endif
for(int i=0; i < 16; ++i)
- T[i]=t[i];
+ T[i]=args.t[i];
+
+ for(int i=0; i < 16; ++i)
+ Tup[i]=args.tup[i];
static bool initialized=false;
@@ -2002,9 +2026,9 @@ void glrender(const string& prefix, const picture *pic, const string& format,
if(antialias) expand *= 2.0;
}
- oWidth=width;
- oHeight=height;
- Aspect=width/height;
+ oWidth=args.width;
+ oHeight=args.height;
+ Aspect=args.width/args.height;
// Force a hard viewport limit to work around direct rendering bugs.
// Alternatively, one can use -glOptions=-indirect (with a performance
@@ -2022,8 +2046,8 @@ void glrender(const string& prefix, const picture *pic, const string& format,
if(screenHeight <= 0) screenHeight=maxHeight;
else screenHeight=min(screenHeight,maxHeight);
- fullWidth=(int) ceil(expand*width);
- fullHeight=(int) ceil(expand*height);
+ fullWidth=(int) ceil(expand*args.width);
+ fullHeight=(int) ceil(expand*args.height);
if(format3d) {
Width=fullWidth;
@@ -2117,7 +2141,7 @@ void glrender(const string& prefix, const picture *pic, const string& format,
glutSetOption(GLUT_MULTISAMPLE,multisample);
#endif
#endif
- string title=string(settings::PROGRAM)+": "+prefix;
+ string title=string(PACKAGE_NAME)+": "+args.prefix;
fpu_trap(false); // Work around FE_INVALID
window=glutCreateWindow(title.c_str());
fpu_trap(settings::trap());
@@ -2206,7 +2230,7 @@ void glrender(const string& prefix, const picture *pic, const string& format,
setBuffers();
}
- glClearColor(background[0],background[1],background[2],background[3]);
+ glClearColor(args.background[0],args.background[1],args.background[2],args.background[3]);
#ifdef HAVE_LIBGLUT
#ifndef HAVE_LIBOSMESA
@@ -2265,12 +2289,16 @@ void glrender(const string& prefix, const picture *pic, const string& format,
if(havewindow) {
readyAfterExport=true;
#ifdef HAVE_PTHREAD
+#if !defined(_WIN32)
pthread_kill(mainthread,SIGUSR1);
#endif
+#endif
} else {
initialized=true;
readyAfterExport=true;
+#if !defined(_WIN32)
Signal(SIGUSR1,exportHandler);
+#endif
exportHandler();
}
} else {
diff --git a/graphics/asymptote/glrender.h b/graphics/asymptote/glrender.h
index 1c140584a9..175f59bd14 100644
--- a/graphics/asymptote/glrender.h
+++ b/graphics/asymptote/glrender.h
@@ -21,15 +21,7 @@
#ifdef HAVE_GL
#include <csignal>
-
-#define GLEW_NO_GLU
-
-#ifdef __MSDOS__
-#define GLEW_STATIC
-#define _WIN32
-#endif
-
-#include "GL/glew.h"
+#include <GL/glew.h>
#ifdef __APPLE__
#define GL_SILENCE_DEPRECATION
@@ -47,18 +39,15 @@
#ifndef APIENTRY
#define APIENTRY
#endif
+#ifndef GLAPI
+#define GLAPI
+#endif
+#define GLEW_OSMESA
#include <GL/osmesa.h>
#endif
#else
-#ifdef __MSDOS__
-#undef _WIN32
-#include <GL/gl.h>
-#include <GL/wglew.h>
-#include <GL/wglext.h>
-#endif
-
#ifdef HAVE_LIBGLUT
#include <GL/glut.h>
#endif
@@ -67,6 +56,9 @@
#ifndef APIENTRY
#define APIENTRY
#endif
+#ifndef GLAPI
+#define GLAPI
+#endif
#include <GL/osmesa.h>
#endif
@@ -168,12 +160,30 @@ GLuint initHDR();
projection camera(bool user=true);
-void glrender(const string& prefix, const camp::picture* pic,
- const string& format, double width, double height, double angle,
- double zoom, const camp::triple& m, const camp::triple& M,
- const camp::pair& shift, const camp::pair& margin, double *t,
- double *background, size_t nlights, camp::triple *lights,
- double *diffuse, double *specular, bool view, int oldpid=0);
+struct GLRenderArgs
+{
+ string prefix;
+ camp::picture* pic;
+ string format;
+ double width;
+ double height;
+ double angle;
+ double zoom;
+ camp::triple m;
+ camp::triple M;
+ camp::pair shift;
+ camp::pair margin;
+ double *t;
+ double *tup;
+ double *background;
+ size_t nlights;
+ camp::triple *lights;
+ double *diffuse;
+ double *specular;
+ bool view;
+};
+
+void glrender(GLRenderArgs const& args, int oldpid=0);
extern const double *dprojView;
extern const double *dView;
diff --git a/graphics/asymptote/gsl.cc b/graphics/asymptote/gsl.cc
index f058773624..55a625e8fa 100644
--- a/graphics/asymptote/gsl.cc
+++ b/graphics/asymptote/gsl.cc
@@ -5,7 +5,9 @@
* Initialize gsl builtins.
*****/
+#if defined(HAVE_CONFIG_H)
#include "config.h"
+#endif
#ifdef HAVE_LIBGSL
diff --git a/graphics/asymptote/impdatum.cc b/graphics/asymptote/impdatum.cc
index 9a4d09d1bf..5597b3ee95 100644
--- a/graphics/asymptote/impdatum.cc
+++ b/graphics/asymptote/impdatum.cc
@@ -401,7 +401,8 @@ ImpDatum *callDatum(ImpDatum *callee, ImpArguments *args)
types::ty *t = callex.getType(e);
if (t->isError()) {
// Run for errors.
- runExp(&callex); em.sync();
+ runExp(&callex);
+ em.sync(true);
return datumError("invalid call");
}
diff --git a/graphics/asymptote/install-sh b/graphics/asymptote/install-sh
index 5222b344c8..ec298b5374 100755
--- a/graphics/asymptote/install-sh
+++ b/graphics/asymptote/install-sh
@@ -1,7 +1,7 @@
#!/bin/sh
# install - install a program, script, or datafile
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2020-11-14.01; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
@@ -35,25 +35,21 @@ scriptversion=2009-04-28.21; # UTC
# FSF changes to this file are in the public domain.
#
# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
+# 'make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch.
+tab=' '
nl='
'
-IFS=" "" $nl"
+IFS=" $tab$nl"
-# set DOITPROG to echo to test this script
+# Set DOITPROG to "echo" to test this script.
-# Don't use :- since 4.3BSD and earlier shells don't like it.
doit=${DOITPROG-}
-if test -z "$doit"; then
- doit_exec=exec
-else
- doit_exec=$doit
-fi
+doit_exec=${doit:-exec}
# Put in absolute file names if you don't have them in your path;
# or use environment vars.
@@ -68,22 +64,16 @@ mvprog=${MVPROG-mv}
rmprog=${RMPROG-rm}
stripprog=${STRIPPROG-strip}
-posix_glob='?'
-initialize_posix_glob='
- test "$posix_glob" != "?" || {
- if (set -f) 2>/dev/null; then
- posix_glob=
- else
- posix_glob=:
- fi
- }
-'
-
posix_mkdir=
# Desired mode of installed file.
mode=0755
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
chgrpcmd=
chmodcmd=$chmodprog
chowncmd=
@@ -97,7 +87,7 @@ dir_arg=
dst_arg=
copy_on_change=false
-no_target_directory=
+is_target_a_directory=possibly
usage="\
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -114,18 +104,28 @@ Options:
--version display version info and exit.
-c (ignored)
- -C install only if different (preserve the last data modification time)
+ -C install only if different (preserve data modification time)
-d create directories instead of installing files.
-g GROUP $chgrpprog installed files to GROUP.
-m MODE $chmodprog installed files to MODE.
-o USER $chownprog installed files to USER.
+ -p pass -p to $cpprog.
-s $stripprog installed files.
+ -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
-t DIRECTORY install into DIRECTORY.
-T report an error if DSTFILE is a directory.
Environment variables override the default commands:
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
RMPROG STRIPPROG
+
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
+
+If -S is not specified, no backups are attempted.
+
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
"
while test $# -ne 0; do
@@ -137,42 +137,62 @@ while test $# -ne 0; do
-d) dir_arg=true;;
-g) chgrpcmd="$chgrpprog $2"
- shift;;
+ shift;;
--help) echo "$usage"; exit $?;;
-m) mode=$2
- case $mode in
- *' '* | *' '* | *'
-'* | *'*'* | *'?'* | *'['*)
- echo "$0: invalid mode: $mode" >&2
- exit 1;;
- esac
- shift;;
+ case $mode in
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
-o) chowncmd="$chownprog $2"
- shift;;
+ shift;;
+
+ -p) cpprog="$cpprog -p";;
-s) stripcmd=$stripprog;;
- -t) dst_arg=$2
- shift;;
+ -S) backupsuffix="$2"
+ shift;;
- -T) no_target_directory=true;;
+ -t)
+ is_target_a_directory=always
+ dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
+
+ -T) is_target_a_directory=never;;
--version) echo "$0 $scriptversion"; exit $?;;
- --) shift
- break;;
+ --) shift
+ break;;
- -*) echo "$0: invalid option: $1" >&2
- exit 1;;
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
*) break;;
esac
shift
done
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+ if test -n "$dst_arg"; then
+ echo "$0: target directory not allowed when installing a directory." >&2
+ exit 1
+ fi
+fi
+
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
# When -d is used, all remaining arguments are directories to create.
# When -t is used, the destination is already specified.
@@ -186,6 +206,10 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
fi
shift # arg
dst_arg=$arg
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
done
fi
@@ -194,13 +218,26 @@ if test $# -eq 0; then
echo "$0: no input file specified." >&2
exit 1
fi
- # It's OK to call `install-sh -d' without argument.
+ # It's OK to call 'install-sh -d' without argument.
# This can happen when creating conditional directories.
exit 0
fi
if test -z "$dir_arg"; then
- trap '(exit $?); exit' 1 2 13 15
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
+ if test ! -d "$dst_arg"; then
+ echo "$0: $dst_arg: Is not a directory." >&2
+ exit 1
+ fi
+ fi
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
# Set umask so as not to create temps with too-generous modes.
# However, 'strip' requires both read and write access to temps.
@@ -211,16 +248,16 @@ if test -z "$dir_arg"; then
*[0-7])
if test -z "$stripcmd"; then
- u_plus_rw=
+ u_plus_rw=
else
- u_plus_rw='% 200'
+ u_plus_rw='% 200'
fi
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
*)
if test -z "$stripcmd"; then
- u_plus_rw=
+ u_plus_rw=
else
- u_plus_rw=,u+rw
+ u_plus_rw=,u+rw
fi
cp_umask=$mode$u_plus_rw;;
esac
@@ -228,9 +265,9 @@ fi
for src
do
- # Protect names starting with `-'.
+ # Protect names problematic for 'test' and other utilities.
case $src in
- -*) src=./$src;;
+ -* | [=\(\)!]) src=./$src;;
esac
if test -n "$dir_arg"; then
@@ -238,6 +275,10 @@ do
dstdir=$dst
test -d "$dstdir"
dstdir_status=$?
+ # Don't chown directories that already exist.
+ if test $dstdir_status = 0; then
+ chowncmd=""
+ fi
else
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
@@ -252,185 +293,150 @@ do
echo "$0: no destination specified." >&2
exit 1
fi
-
dst=$dst_arg
- # Protect names starting with `-'.
- case $dst in
- -*) dst=./$dst;;
- esac
- # If destination is a directory, append the input filename; won't work
- # if double slashes aren't ignored.
+ # If destination is a directory, append the input filename.
if test -d "$dst"; then
- if test -n "$no_target_directory"; then
- echo "$0: $dst_arg: Is a directory" >&2
- exit 1
+ if test "$is_target_a_directory" = never; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
fi
dstdir=$dst
- dst=$dstdir/`basename "$src"`
+ dstbase=`basename "$src"`
+ case $dst in
+ */) dst=$dst$dstbase;;
+ *) dst=$dst/$dstbase;;
+ esac
dstdir_status=0
else
- # Prefer dirname, but fall back on a substitute if dirname fails.
- dstdir=`
- (dirname "$dst") 2>/dev/null ||
- expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$dst" : 'X\(//\)[^/]' \| \
- X"$dst" : 'X\(//\)$' \| \
- X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
- echo X"$dst" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'
- `
-
+ dstdir=`dirname "$dst"`
test -d "$dstdir"
dstdir_status=$?
fi
fi
+ case $dstdir in
+ */) dstdirslash=$dstdir;;
+ *) dstdirslash=$dstdir/;;
+ esac
+
obsolete_mkdir_used=false
if test $dstdir_status != 0; then
case $posix_mkdir in
'')
- # Create intermediate dirs using mode 755 as modified by the umask.
- # This is like FreeBSD 'install' as of 1997-10-28.
- umask=`umask`
- case $stripcmd.$umask in
- # Optimize common cases.
- *[2367][2367]) mkdir_umask=$umask;;
- .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
- *[0-7])
- mkdir_umask=`expr $umask + 22 \
- - $umask % 100 % 40 + $umask % 20 \
- - $umask % 10 % 4 + $umask % 2
- `;;
- *) mkdir_umask=$umask,go-w;;
- esac
-
- # With -d, create the new directory with the user-specified mode.
- # Otherwise, rely on $mkdir_umask.
- if test -n "$dir_arg"; then
- mkdir_mode=-m$mode
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ # The $RANDOM variable is not portable (e.g., dash). Use it
+ # here however when possible just to lower collision chance.
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+ trap '
+ ret=$?
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+ exit $ret
+ ' 0
+
+ # Because "mkdir -p" follows existing symlinks and we likely work
+ # directly in world-writeable /tmp, make sure that the '$tmpdir'
+ # directory is successfully created first before we actually test
+ # 'mkdir -p'.
+ if (umask $mkdir_umask &&
+ $mkdirprog $mkdir_mode "$tmpdir" &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ test_tmpdir="$tmpdir/a"
+ ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
else
- mkdir_mode=
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
fi
-
- posix_mkdir=false
- case $umask in
- *[123567][0-7][0-7])
- # POSIX mkdir -p sets u+wx bits regardless of umask, which
- # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
- ;;
- *)
- tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
- trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
- if (umask $mkdir_umask &&
- exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
- then
- if test -z "$dir_arg" || {
- # Check for POSIX incompatibilities with -m.
- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
- # other-writeable bit of parent directory when it shouldn't.
- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
- ls_ld_tmpdir=`ls -ld "$tmpdir"`
- case $ls_ld_tmpdir in
- d????-?r-*) different_mode=700;;
- d????-?--*) different_mode=755;;
- *) false;;
- esac &&
- $mkdirprog -m$different_mode -p -- "$tmpdir" && {
- ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
- test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
- }
- }
- then posix_mkdir=:
- fi
- rmdir "$tmpdir/d" "$tmpdir"
- else
- # Remove any dirs left behind by ancient mkdir implementations.
- rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
- fi
- trap '' 0;;
- esac;;
+ trap '' 0;;
esac
if
$posix_mkdir && (
- umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
)
then :
else
- # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # mkdir does not conform to POSIX,
# or it failed possibly due to a race condition. Create the
# directory the slow way, step by step, checking for races as we go.
case $dstdir in
- /*) prefix='/';;
- -*) prefix='./';;
- *) prefix='';;
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
esac
- eval "$initialize_posix_glob"
-
oIFS=$IFS
IFS=/
- $posix_glob set -f
+ set -f
set fnord $dstdir
shift
- $posix_glob set +f
+ set +f
IFS=$oIFS
prefixes=
for d
do
- test -z "$d" && continue
-
- prefix=$prefix$d
- if test -d "$prefix"; then
- prefixes=
- else
- if $posix_mkdir; then
- (umask=$mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
- # Don't fail if two instances are running concurrently.
- test -d "$prefix" || exit 1
- else
- case $prefix in
- *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
- *) qprefix=$prefix;;
- esac
- prefixes="$prefixes '$qprefix'"
- fi
- fi
- prefix=$prefix/
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
done
if test -n "$prefixes"; then
- # Don't fail if two instances are running concurrently.
- (umask $mkdir_umask &&
- eval "\$doit_exec \$mkdirprog $prefixes") ||
- test -d "$dstdir" || exit 1
- obsolete_mkdir_used=true
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
fi
fi
fi
@@ -443,14 +449,25 @@ do
else
# Make a couple of temp file names in the proper directory.
- dsttmp=$dstdir/_inst.$$_
- rmtmp=$dstdir/_rm.$$_
+ dsttmp=${dstdirslash}_inst.$$_
+ rmtmp=${dstdirslash}_rm.$$_
# Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
# Copy the file name to the temp name.
- (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+ (umask $cp_umask &&
+ { test -z "$stripcmd" || {
+ # Create $dsttmp read-write so that cp doesn't create it read-only,
+ # which would cause strip to fail.
+ if test -z "$doit"; then
+ : >"$dsttmp" # No need to fork-exec 'touch'.
+ else
+ $doit touch "$dsttmp"
+ fi
+ }
+ } &&
+ $doit_exec $cpprog "$src" "$dsttmp") &&
# and set any options; do chmod last to preserve setuid bits.
#
@@ -465,66 +482,6 @@ do
# If -C, don't bother to copy if it wouldn't change the file.
if $copy_on_change &&
- old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
- new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
-
- eval "$initialize_posix_glob" &&
- $posix_glob set -f &&
- set X $old && old=:$2:$4:$5:$6 &&
- set X $new && new=:$2:$4:$5:$6 &&
- $posix_glob set +f &&
-
- test "$old" = "$new" &&
- $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
- then
- rm -f "$dsttmp"
- else
- # Rename the file to the real destination.
- $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
- # The rename failed, perhaps because mv can't rename something else
- # to itself, or perhaps because mv is so ancient that it does not
- # support -f.
- {
- # Now remove or move aside any old file at destination location.
- # We try this two ways since rm can't unlink itself on some
- # systems and the destination file might be busy for other
- # reasons. In this case, the final cleanup might fail but the new
- # file should still install successfully.
- {
- test ! -f "$dst" ||
- $doit $rmcmd -f "$dst" 2>/dev/null ||
- { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
- } ||
- { echo "$0: cannot unlink or rename $dst" >&2
- (exit 1); exit 1
- }
- } &&
-
- # Now rename the file to the real destination.
- $doit $mvcmd "$dsttmp" "$dst"
- }
- fi || exit 1
-
- trap '' 0
- fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
-est -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
- { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
- { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
- # If -C, don't bother to copy if it wouldn't change the file.
- if $copy_on_change &&
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
set -f &&
@@ -536,6 +493,13 @@ est -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
then
rm -f "$dsttmp"
else
+ # If $backupsuffix is set, and the file being installed
+ # already exists, attempt a backup. Don't worry if it fails,
+ # e.g., if mv doesn't support -f.
+ if test -n "$backupsuffix" && test -f "$dst"; then
+ $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+ fi
+
# Rename the file to the real destination.
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
@@ -550,9 +514,9 @@ est -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
# file should still install successfully.
{
test ! -f "$dst" ||
- $doit $rmcmd -f "$dst" 2>/dev/null ||
+ $doit $rmcmd "$dst" 2>/dev/null ||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
} ||
{ echo "$0: cannot unlink or rename $dst" >&2
(exit 1); exit 1
diff --git a/graphics/asymptote/interact.cc b/graphics/asymptote/interact.cc
index 1009b1d477..b7290d3ec7 100644
--- a/graphics/asymptote/interact.cc
+++ b/graphics/asymptote/interact.cc
@@ -8,38 +8,30 @@
#include <cassert>
#include <iostream>
#include <sstream>
-#include <sys/wait.h>
#include <sys/types.h>
-#include <unistd.h>
#include <csignal>
#include <cstdio>
#include <cstring>
-#include "interact.h"
-#include "runhistory.h"
-
-#ifdef HAVE_LIBCURSES
-#ifdef HAVE_LIBREADLINE
-#include <readline/readline.h>
-#include <readline/history.h>
-#else
-#ifdef HAVE_LIBEDIT
-// Work around incorrect declaration in NetBSD readline.h v1.33
-#define rl_completion_entry_function rl_completion_entry_function_declaration
-#ifdef HAVE_EDITLINE_READLINE_H
-#include <editline/readline.h>
+#if !defined(_WIN32)
+#include <sys/wait.h>
+#include <unistd.h>
#else
-#include <readline/readline.h>
-#endif
-#undef rl_completion_entry_function
-extern "C" rl_compentry_func_t *rl_completion_entry_function;
-#endif
-#endif
+#include <Windows.h>
+#include <io.h>
+#define isatty _isatty
#endif
+#include "interact.h"
+#include "runhistory.h"
+
#include "util.h"
#include "errormsg.h"
+#if !defined(_WIN32)
+#define _fdopen fdopen
+#endif
+
using namespace settings;
namespace run {
@@ -122,7 +114,10 @@ void pre_readline()
{
int fd=intcast(settings::getSetting<Int>("inpipe"));
if(fd >= 0) {
- if(!fin) fin=fdopen(fd,"r");
+ if(!fin)
+ {
+ fin=_fdopen(fd,"r");
+ }
if(!fin) {
cerr << "Cannot open inpipe " << fd << endl;
exit(-1);
@@ -147,7 +142,7 @@ void init_readline(bool tabcompletion)
void init_interactive()
{
- if(getSetting<bool>("xasy")) tty=false;
+ if(settings::xasy) tty=false;
#if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES)
if(tty) {
init_completion();
@@ -183,7 +178,7 @@ string simpleline(string prompt) {
#endif
{
cout << endl;
- throw eof();
+ throw EofException();
}
return "";
}
diff --git a/graphics/asymptote/interact.h b/graphics/asymptote/interact.h
index 4b7550986e..b6588e7d2a 100644
--- a/graphics/asymptote/interact.h
+++ b/graphics/asymptote/interact.h
@@ -9,6 +9,25 @@
#include "common.h"
+#ifdef HAVE_LIBCURSES
+#ifdef HAVE_LIBREADLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+#else
+#ifdef HAVE_LIBEDIT
+// Work around incorrect declaration in NetBSD readline.h v1.33
+#define rl_completion_entry_function rl_completion_entry_function_declaration
+#ifdef HAVE_EDITLINE_READLINE_H
+#include <editline/readline.h>
+#else
+#include <readline/readline.h>
+#endif
+#undef rl_completion_entry_function
+extern "C" rl_compentry_func_t *rl_completion_entry_function;
+#endif
+#endif
+#endif
+
void interruptHandler(int);
namespace interact {
diff --git a/graphics/asymptote/jsfile.cc b/graphics/asymptote/jsfile.cc
index 7dc95c9bb6..6afbd9efc7 100644
--- a/graphics/asymptote/jsfile.cc
+++ b/graphics/asymptote/jsfile.cc
@@ -207,9 +207,10 @@ void jsfile::finish(string name)
size_t ncenters=drawElement::centers.size();
if(ncenters > 0) {
out << s << "Centers=[";
- for(size_t i=0; i < ncenters; ++i)
+ size_t last=ncenters-1;
+ for(size_t i=0; i < last; ++i)
out << newl << drawElement::centers[i] << ",";
- out << newl << "];" << newl;
+ out << newl << drawElement::centers[last] << newl << "];" << newl;
}
out << "</script>"
<< newl << "</head>"
@@ -235,21 +236,23 @@ void jsfile::addIndices(const uint32_t *I)
void jsfile::addRawPatch(triple const* controls, size_t n,
const prc::RGBAColour *c, size_t nc)
{
- out << "patch([" << newl;
- size_t last=n-1;
- for(size_t i=0; i < last; ++i)
- out << controls[i] << "," << newl;
- out << controls[last] << newl << "],"
- << drawElement::centerIndex << "," << materialIndex;
- if(c) {
- out << ",[" << newl;
- for(size_t i=0; i < nc; ++i) {
- addColor(c[i]);
- out << "," << newl;
+ if(n) {
+ out << "patch([" << newl;
+ size_t last=n-1;
+ for(size_t i=0; i < last; ++i)
+ out << controls[i] << "," << newl;
+ out << controls[last] << newl << "],"
+ << drawElement::centerIndex << "," << materialIndex;
+ if(c) {
+ out << ",[" << newl;
+ for(size_t i=0; i < nc; ++i) {
+ addColor(c[i]);
+ out << "," << newl;
+ }
+ out << "]";
}
- out << "]";
+ out << ");" << newl << newl;
}
- out << ");" << newl << newl;
}
void jsfile::addCurve(const triple& z0, const triple& c0,
@@ -294,35 +297,60 @@ void jsfile::addTriangles(size_t nP, const triple* P, size_t nN,
size_t nI, const uint32_t (*PI)[3],
const uint32_t (*NI)[3], const uint32_t (*CI)[3])
{
- for(size_t i=0; i < nP; ++i)
- out << "Positions.push(" << P[i] << ");" << newl;
-
- for(size_t i=0; i < nN; ++i)
- out << "Normals.push(" << N[i] << ");" << newl;
+ if(nP) {
+ out << "Positions=[";
+ size_t last=nP-1;
+ for(size_t i=0; i < last; ++i)
+ out << newl << P[i] << ",";
+ out << newl << P[last] << newl << "];" << newl;
+ }
- for(size_t i=0; i < nC; ++i) {
- out << "Colors.push(";
- addColor(C[i]);
- out << ");" << newl;
+ if(nN) {
+ size_t last=nN-1;
+ out << "Normals=[";
+ for(size_t i=0; i < last; ++i)
+ out << newl << N[i] << ",";
+ out << newl << N[last] << newl << "];" << newl;
}
- for(size_t i=0; i < nI; ++i) {
- out << "Indices.push([";
- const uint32_t *PIi=PI[i];
- const uint32_t *NIi=NI[i];
- bool keepNI=distinct(NIi,PIi);
- bool keepCI=nC && distinct(CI[i],PIi);
- addIndices(PIi);
- if(keepNI || keepCI) {
+ if(nC) {
+ size_t last=nC-1;
+ out << "Colors=[";
+ for(size_t i=0; i < last; ++i) {
+ out << newl;
+ addColor(C[i]);
out << ",";
- if(keepNI) addIndices(NIi);
}
- if(keepCI) {
- out << ",";
- addIndices(CI[i]);
+ out << newl;
+ addColor(C[last]);
+ out << newl << "];" << newl;
+ }
+
+ if(nI) {
+ out << "Indices=[";
+ size_t last=nI-1;
+ for(size_t i=0; i < nI; ++i) {
+ const uint32_t *PIi=PI[i];
+ const uint32_t *NIi=NI[i];
+ bool keepNI=distinct(NIi,PIi);
+ bool keepCI=nC && distinct(CI[i],PIi);
+ out << newl << "[";
+ addIndices(PIi);
+ if(keepNI || keepCI) {
+ out << ",";
+ if(keepNI) addIndices(NIi);
+ }
+ if(keepCI) {
+ out << ",";
+ addIndices(CI[i]);
+ }
+ out << "]";
+ if(i < last)
+ out << ",";
}
- out << "]);" << newl;
+ out << newl << "];" << newl;
}
+
out << "triangles("
<< drawElement::centerIndex << "," << materialIndex
<< ");" << newl << newl;
diff --git a/graphics/asymptote/keywords.cc b/graphics/asymptote/keywords.h
index 19c9bbe4df..53db9ed6ec 100644
--- a/graphics/asymptote/keywords.cc
+++ b/graphics/asymptote/keywords.h
@@ -1,5 +1,5 @@
/*****
- * This file is automatically generated by keywords.pl.
+ * This file is automatically generated by keywords.py.
* Changes will be overwritten.
*****/
@@ -18,6 +18,7 @@ ADD(break);
ADD(continue);
ADD(struct);
ADD(typedef);
+ADD(using);
ADD(new);
ADD(access);
ADD(import);
@@ -26,6 +27,7 @@ ADD(from);
ADD(include);
ADD(quote);
ADD(static);
+ADD(autounravel);
ADD(public);
ADD(private);
ADD(restricted);
diff --git a/graphics/asymptote/keywords.pl b/graphics/asymptote/keywords.pl
deleted file mode 100755
index d3b48c5220..0000000000
--- a/graphics/asymptote/keywords.pl
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env perl
-#####
-# keywords.pl
-# Andy Hammerlindl 2006/07/31
-#
-# Extract keywords from camp.l and list them in a keywords file. These
-# keywords are used in autocompletion at the interactive prompt.
-#####
-
-# Extra keywords to add that aren't automatically extracted, currently none.
-@extrawords = ();
-
-
-open(keywords, ">keywords.cc") ||
- die("Couldn't open keywords.out for writing.");
-
-print keywords <<END;
-/*****
- * This file is automatically generated by keywords.pl.
- * Changes will be overwritten.
- *****/
-
-END
-
-sub add {
- print keywords "ADD(".$_[0].");\n";
-}
-
-foreach $word (@extrawords) {
- add($word);
-}
-
-open(camp, "camp.l") || die("Couldn't open camp.l");
-
-# Search for the %% separator, after which the definitions start.
-while (<camp>) {
- if (/^%%\s*$/) {
- last; # Break out of the loop.
- }
-}
-
-# Grab simple keyword definitions from camp.l
-while (<camp>) {
- if (/^%%\s*$/) {
- last; # A second %% indicates the end of definitions.
- }
- if (/^([A-Za-z_][A-Za-z0-9_]*)\s*\{/) {
- add($1);
- }
-}
-
-# Grab the special commands from the interactive prompt.
-open(process, "process.cc") || dir("Couldn't open process.cc");
-
-while (<process>) {
- if (/^\s*ADDCOMMAND\(\s*([A-Za-z_][A-Za-z0-9_]*),/) {
- add($1);
- }
-}
-
diff --git a/graphics/asymptote/keywords.py b/graphics/asymptote/keywords.py
new file mode 100644
index 0000000000..0a40f74855
--- /dev/null
+++ b/graphics/asymptote/keywords.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+#####
+# keywords.py
+# Translated from keywords.pl
+#
+# Extract keywords from camp.l and list them in a keywords file. These
+# keywords are used in autocompletion at the interactive prompt.
+#####
+
+import argparse
+import re
+import textwrap
+from typing import List
+
+parser = argparse.ArgumentParser()
+parser.add_argument("--camplfile", required=True)
+parser.add_argument("--output", required=True)
+parser.add_argument("--process-file", required=True)
+args = parser.parse_args()
+
+camplfile = args.camplfile
+output_keywords_file = args.output
+process_file = args.process_file
+
+# Extra keywords to add that aren't automatically extracted, currently none.
+extrawords: List[str] = []
+
+with open(output_keywords_file, "w", encoding="utf-8") as keywords:
+
+ keywords.write(
+ textwrap.dedent(
+ """\
+ /*****
+ * This file is automatically generated by keywords.py.
+ * Changes will be overwritten.
+ *****/
+
+ """
+ )
+ )
+
+ def add(word): # pylint: disable=redefined-outer-name
+ keywords.write(f"ADD({word});\n")
+
+ for word in extrawords:
+ add(word)
+
+ with open(camplfile, encoding="utf-8") as camp:
+ # Search for the %% separator, after which the definitions start.
+ for line in camp:
+ if re.search(r"^%%\s*$", line):
+ break
+
+ # Grab simple keyword definitions from camp.l
+ for line in camp:
+ if re.search(r"^%%\s*$", line):
+ break # A second %% indicates the end of definitions.
+ match = re.search(r"^([A-Za-z_][A-Za-z0-9_]*)\s*\{", line)
+ if match:
+ add(match.group(1))
+
+ # Grab the special commands from the interactive prompt.
+ with open(process_file, encoding="utf-8") as process:
+ for line in process:
+ match = re.search(
+ r"^\s*ADDCOMMAND\(\s*([A-Za-z_][A-Za-z0-9_]*),",
+ line,
+ )
+ if match:
+ add(match.group(1))
diff --git a/graphics/asymptote/lex.yy.cc b/graphics/asymptote/lex.yy.cc
index 0f0ea99214..f4cc668a24 100644
--- a/graphics/asymptote/lex.yy.cc
+++ b/graphics/asymptote/lex.yy.cc
@@ -430,8 +430,8 @@ static void yynoreturn yy_fatal_error ( const char* msg );
/* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
(yy_c_buf_p) = yy_cp;
/* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 124
-#define YY_END_OF_BUFFER 125
+#define YY_NUM_RULES 126
+#define YY_END_OF_BUFFER 127
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -439,45 +439,46 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static const flex_int16_t yy_accept[337] =
+static const flex_int16_t yy_accept[351] =
{ 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 125, 123, 28, 29, 29, 60, 121, 46,
- 69, 47, 67, 122, 34, 35, 44, 42, 31, 43,
- 40, 45, 105, 32, 33, 54, 51, 56, 50, 69,
- 119, 36, 123, 37, 48, 119, 119, 119, 119, 119,
- 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
- 119, 38, 68, 39, 69, 4, 3, 3, 4, 4,
+ 0, 0, 127, 125, 28, 29, 29, 60, 123, 46,
+ 69, 47, 67, 124, 34, 35, 44, 42, 31, 43,
+ 40, 45, 107, 32, 33, 54, 51, 56, 50, 69,
+ 121, 36, 125, 37, 48, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 38, 68, 39, 69, 4, 3, 3, 4, 4,
10, 7, 7, 6, 10, 27, 13, 13, 12, 27,
- 124, 118, 113, 114, 113, 116, 116, 116, 116, 116,
- 116, 118, 118, 116, 118, 116, 116, 117, 118, 116,
-
- 116, 29, 53, 74, 69, 75, 58, 49, 72, 63,
- 70, 65, 71, 64, 106, 120, 30, 73, 106, 105,
- 0, 62, 55, 52, 57, 119, 29, 76, 61, 119,
- 119, 119, 119, 119, 119, 119, 86, 119, 119, 119,
- 119, 119, 82, 119, 119, 119, 119, 119, 119, 119,
- 119, 119, 119, 119, 119, 119, 119, 119, 119, 59,
- 3, 2, 1, 7, 0, 0, 5, 0, 7, 9,
- 8, 13, 0, 0, 11, 0, 13, 14, 22, 22,
- 15, 16, 17, 18, 19, 20, 21, 0, 114, 116,
- 116, 115, 116, 117, 114, 66, 41, 0, 30, 0,
-
- 106, 0, 0, 106, 119, 77, 119, 119, 119, 119,
- 119, 119, 119, 119, 85, 119, 119, 119, 92, 119,
- 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
- 119, 119, 119, 119, 0, 0, 23, 23, 25, 0,
- 0, 106, 119, 119, 119, 119, 81, 119, 83, 119,
- 119, 96, 119, 119, 119, 109, 119, 119, 119, 119,
- 119, 119, 119, 119, 119, 103, 107, 119, 119, 119,
- 24, 26, 0, 106, 119, 119, 88, 119, 119, 110,
- 119, 108, 119, 119, 119, 119, 119, 119, 98, 119,
- 119, 119, 119, 119, 119, 119, 84, 93, 119, 119,
-
- 119, 119, 94, 119, 119, 119, 119, 100, 119, 87,
- 99, 90, 119, 119, 119, 80, 119, 119, 119, 97,
- 119, 119, 101, 119, 79, 91, 95, 89, 78, 104,
- 111, 112, 119, 119, 102, 0
+ 126, 120, 115, 116, 115, 118, 118, 118, 118, 118,
+ 118, 120, 120, 118, 120, 118, 118, 119, 120, 118,
+
+ 118, 29, 53, 74, 69, 75, 58, 49, 72, 63,
+ 70, 65, 71, 64, 108, 122, 30, 73, 108, 107,
+ 0, 62, 55, 52, 57, 121, 29, 76, 61, 121,
+ 121, 121, 121, 121, 121, 121, 121, 86, 121, 121,
+ 121, 121, 121, 82, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 59, 3, 2, 1, 7, 0, 0, 5, 0,
+ 7, 9, 8, 13, 0, 0, 11, 0, 13, 14,
+ 22, 22, 15, 16, 17, 18, 19, 20, 21, 0,
+ 116, 118, 118, 117, 118, 119, 116, 66, 41, 0,
+
+ 30, 0, 108, 0, 0, 108, 121, 77, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 85, 121, 121,
+ 121, 93, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 0, 0,
+ 23, 23, 25, 0, 0, 108, 121, 121, 121, 121,
+ 121, 81, 121, 83, 121, 121, 97, 121, 121, 121,
+ 111, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 105, 109, 121, 121, 121, 121, 24, 26, 0, 108,
+ 121, 121, 121, 88, 121, 121, 112, 121, 110, 121,
+ 121, 121, 121, 121, 121, 99, 121, 121, 121, 121,
+
+ 121, 121, 121, 92, 84, 94, 121, 121, 121, 121,
+ 121, 95, 121, 121, 121, 121, 102, 121, 87, 100,
+ 90, 121, 121, 121, 80, 121, 121, 121, 121, 98,
+ 121, 121, 103, 121, 79, 91, 96, 121, 89, 78,
+ 106, 113, 114, 121, 121, 121, 121, 104, 101, 0
} ;
static const YY_CHAR yy_ec[256] =
@@ -493,9 +494,9 @@ static const YY_CHAR yy_ec[256] =
31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
32, 33, 34, 35, 31, 1, 36, 37, 38, 39,
- 40, 41, 31, 42, 43, 31, 44, 45, 46, 47,
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
- 58, 31, 59, 60, 61, 62, 1, 1, 1, 1,
+ 40, 41, 42, 43, 44, 31, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
+ 59, 31, 60, 61, 62, 63, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -512,173 +513,177 @@ static const YY_CHAR yy_ec[256] =
1, 1, 1, 1, 1
} ;
-static const YY_CHAR yy_meta[63] =
+static const YY_CHAR yy_meta[64] =
{ 0,
1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
3, 3, 1, 1, 1, 1, 1, 1, 1, 3,
3, 1, 1, 1, 1, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 1, 1,
- 1, 1
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1,
+ 1, 1, 1
} ;
-static const flex_int16_t yy_base[344] =
+static const flex_int16_t yy_base[358] =
{ 0,
- 0, 0, 60, 62, 64, 69, 74, 79, 0, 0,
- 112, 0, 541, 542, 542, 542, 537, 513, 542, 512,
- 529, 510, 525, 542, 542, 542, 66, 69, 542, 70,
- 83, 72, 157, 511, 542, 83, 507, 62, 542, 503,
- 0, 542, 90, 542, 150, 142, 480, 133, 482, 54,
- 148, 147, 146, 480, 147, 474, 487, 473, 162, 478,
- 482, 542, 463, 542, 542, 542, 542, 519, 502, 506,
- 542, 542, 516, 203, 212, 542, 542, 515, 219, 250,
- 542, 542, 542, 542, 514, 490, 542, 507, 500, 498,
- 495, 493, 487, 185, 483, 156, 479, 0, 223, 472,
-
- 542, 542, 542, 542, 542, 542, 542, 542, 542, 542,
- 542, 489, 542, 211, 217, 542, 0, 542, 222, 228,
- 243, 542, 542, 542, 542, 0, 502, 542, 542, 466,
- 464, 457, 461, 453, 448, 460, 0, 445, 447, 450,
- 443, 445, 0, 443, 453, 434, 444, 448, 444, 449,
- 437, 182, 215, 437, 440, 428, 432, 429, 436, 542,
- 542, 542, 542, 542, 271, 306, 542, 276, 475, 542,
- 542, 542, 312, 318, 542, 281, 474, 542, 268, 272,
- 542, 542, 542, 542, 542, 542, 542, 310, 542, 542,
- 542, 542, 459, 0, 472, 542, 278, 313, 0, 326,
-
- 316, 337, 345, 321, 434, 0, 433, 436, 418, 425,
- 424, 428, 422, 414, 0, 419, 416, 418, 421, 416,
- 409, 404, 413, 404, 403, 401, 401, 399, 400, 399,
- 410, 409, 412, 402, 366, 372, 274, 542, 364, 375,
- 386, 367, 394, 409, 400, 204, 0, 403, 0, 399,
- 401, 0, 389, 385, 387, 0, 401, 400, 392, 393,
- 362, 361, 367, 366, 359, 0, 0, 361, 343, 353,
- 542, 542, 394, 397, 339, 330, 0, 334, 331, 0,
- 335, 0, 318, 325, 327, 308, 302, 312, 0, 306,
- 281, 289, 272, 271, 273, 271, 0, 0, 253, 248,
-
- 245, 238, 0, 236, 226, 221, 227, 0, 221, 0,
- 0, 0, 194, 187, 179, 0, 179, 165, 155, 0,
- 163, 141, 0, 137, 0, 0, 0, 0, 0, 0,
- 0, 0, 66, 61, 0, 542, 419, 422, 425, 428,
- 68, 66, 431
+ 0, 0, 61, 63, 65, 70, 75, 80, 0, 0,
+ 113, 0, 557, 558, 558, 558, 553, 529, 558, 528,
+ 545, 526, 541, 558, 558, 558, 67, 70, 558, 71,
+ 84, 73, 159, 527, 558, 84, 523, 63, 558, 519,
+ 0, 558, 91, 558, 152, 146, 495, 133, 497, 54,
+ 153, 149, 143, 495, 151, 489, 503, 488, 164, 138,
+ 498, 558, 479, 558, 558, 558, 558, 536, 519, 523,
+ 558, 558, 533, 206, 215, 558, 558, 532, 222, 253,
+ 558, 558, 558, 558, 531, 507, 558, 524, 517, 515,
+ 512, 510, 504, 188, 500, 203, 496, 0, 228, 489,
+
+ 558, 558, 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 506, 558, 216, 220, 558, 0, 558, 225, 231,
+ 246, 558, 558, 558, 558, 0, 519, 558, 558, 483,
+ 481, 473, 464, 477, 468, 463, 476, 0, 460, 462,
+ 465, 458, 460, 0, 458, 469, 449, 459, 464, 459,
+ 465, 452, 216, 159, 452, 455, 443, 447, 444, 451,
+ 450, 558, 558, 558, 558, 558, 273, 289, 558, 279,
+ 490, 558, 558, 558, 310, 321, 558, 284, 489, 558,
+ 276, 278, 558, 558, 558, 558, 558, 558, 558, 314,
+ 558, 558, 558, 558, 474, 0, 487, 558, 297, 317,
+
+ 0, 327, 320, 341, 349, 282, 449, 0, 448, 438,
+ 450, 431, 438, 437, 442, 435, 427, 0, 432, 429,
+ 431, 435, 429, 422, 417, 426, 417, 416, 414, 414,
+ 412, 413, 412, 424, 423, 426, 413, 414, 370, 376,
+ 308, 558, 368, 379, 390, 330, 406, 422, 402, 411,
+ 141, 0, 415, 0, 410, 413, 0, 400, 396, 398,
+ 0, 413, 412, 403, 406, 393, 392, 399, 404, 397,
+ 0, 0, 401, 383, 396, 397, 558, 558, 398, 371,
+ 383, 381, 369, 0, 368, 365, 0, 370, 0, 352,
+ 365, 366, 343, 341, 348, 0, 341, 335, 339, 321,
+
+ 319, 327, 325, 0, 0, 0, 305, 303, 298, 300,
+ 289, 0, 291, 279, 271, 270, 0, 270, 0, 0,
+ 0, 237, 239, 232, 0, 236, 222, 205, 200, 0,
+ 210, 192, 0, 181, 0, 0, 0, 171, 0, 0,
+ 0, 0, 0, 182, 180, 68, 55, 0, 0, 558,
+ 420, 423, 426, 429, 69, 67, 432
} ;
-static const flex_int16_t yy_def[344] =
+static const flex_int16_t yy_def[358] =
{ 0,
- 336, 1, 337, 337, 338, 338, 339, 339, 340, 340,
- 336, 11, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 341, 336, 336, 336, 336, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 342, 336, 336,
-
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 343, 336, 336, 336,
- 336, 336, 336, 336, 336, 341, 336, 336, 336, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 342, 336, 336, 336, 336, 343, 336,
-
- 336, 336, 336, 336, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 336, 336, 336, 336, 336, 336,
- 336, 336, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 336, 336, 336, 336, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
-
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 0, 336, 336, 336, 336,
- 336, 336, 336
+ 350, 1, 351, 351, 352, 352, 353, 353, 354, 354,
+ 350, 11, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 355, 350, 350, 350, 350, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 356, 350, 350,
+
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 357, 350, 350, 350,
+ 350, 350, 350, 350, 350, 355, 350, 350, 350, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 356, 350, 350, 350, 350,
+
+ 357, 350, 350, 350, 350, 350, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 350, 350,
+ 350, 350, 350, 350, 350, 350, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 350, 350, 350, 350,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 0,
+ 350, 350, 350, 350, 350, 350, 350
} ;
-static const flex_int16_t yy_nxt[605] =
+static const flex_int16_t yy_nxt[622] =
{ 0,
14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
33, 33, 34, 35, 36, 37, 38, 39, 40, 41,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
- 51, 41, 52, 41, 41, 41, 53, 54, 55, 56,
- 57, 58, 59, 60, 41, 61, 41, 41, 62, 63,
- 64, 65, 67, 68, 67, 68, 72, 73, 194, 74,
- 126, 72, 73, 69, 74, 69, 77, 78, 70, 108,
- 70, 77, 78, 110, 79, 116, 112, 125, 105, 79,
- 117, 109, 102, 127, 111, 113, 75, 118, 138, 335,
-
- 114, 75, 115, 115, 115, 334, 80, 105, 123, 105,
- 139, 80, 82, 83, 84, 85, 86, 82, 87, 88,
- 87, 87, 82, 82, 82, 89, 90, 82, 91, 92,
- 87, 82, 82, 82, 93, 82, 94, 95, 96, 82,
- 97, 98, 98, 82, 99, 82, 100, 98, 98, 98,
+ 51, 41, 41, 52, 41, 41, 41, 53, 54, 55,
+ 56, 57, 58, 59, 60, 41, 61, 41, 41, 62,
+ 63, 64, 65, 67, 68, 67, 68, 72, 73, 196,
+ 74, 126, 72, 73, 69, 74, 69, 77, 78, 70,
+ 108, 70, 77, 78, 110, 79, 116, 112, 125, 105,
+ 79, 117, 109, 102, 127, 111, 113, 75, 118, 139,
+
+ 349, 114, 75, 115, 115, 115, 348, 80, 105, 123,
+ 105, 140, 80, 82, 83, 84, 85, 86, 82, 87,
+ 88, 87, 87, 82, 82, 82, 89, 90, 82, 91,
+ 92, 87, 82, 82, 82, 93, 82, 94, 95, 96,
+ 82, 97, 98, 98, 82, 99, 82, 100, 98, 98,
98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
- 82, 87, 82, 101, 119, 128, 120, 120, 120, 130,
- 134, 190, 191, 140, 129, 146, 135, 143, 131, 333,
- 136, 332, 144, 145, 132, 141, 121, 149, 142, 147,
-
- 150, 154, 331, 155, 165, 165, 166, 330, 167, 191,
- 190, 191, 156, 167, 164, 169, 329, 170, 328, 157,
- 173, 173, 174, 327, 175, 189, 195, 326, 197, 175,
- 198, 198, 198, 225, 226, 168, 115, 115, 115, 200,
- 325, 201, 201, 201, 171, 119, 278, 120, 120, 120,
- 227, 176, 172, 177, 279, 178, 121, 203, 324, 203,
- 178, 202, 204, 204, 204, 228, 323, 121, 322, 179,
- 180, 321, 165, 165, 166, 320, 167, 178, 165, 166,
- 319, 167, 178, 173, 174, 181, 182, 237, 237, 318,
- 183, 238, 238, 271, 271, 200, 184, 198, 198, 198,
-
- 185, 317, 186, 168, 187, 316, 188, 165, 235, 166,
- 315, 167, 314, 173, 173, 174, 167, 175, 313, 173,
- 236, 174, 175, 175, 312, 239, 311, 310, 175, 239,
- 239, 239, 198, 198, 198, 201, 201, 201, 168, 239,
- 204, 204, 204, 200, 176, 198, 198, 198, 309, 308,
- 176, 241, 121, 241, 307, 240, 242, 242, 242, 203,
- 306, 203, 305, 304, 204, 204, 204, 165, 165, 166,
- 303, 167, 302, 173, 173, 174, 167, 175, 301, 272,
- 300, 299, 175, 272, 272, 272, 242, 242, 242, 273,
- 298, 273, 297, 272, 274, 274, 274, 296, 168, 295,
-
- 241, 294, 241, 293, 176, 242, 242, 242, 273, 292,
- 273, 291, 290, 274, 274, 274, 274, 274, 274, 66,
- 66, 66, 71, 71, 71, 76, 76, 76, 81, 81,
- 81, 199, 289, 199, 288, 287, 286, 285, 284, 283,
- 282, 281, 280, 277, 276, 275, 270, 269, 268, 267,
- 266, 265, 264, 263, 262, 261, 260, 259, 258, 257,
- 256, 255, 254, 253, 252, 251, 250, 249, 248, 247,
- 246, 245, 244, 243, 189, 190, 172, 164, 234, 233,
- 232, 231, 230, 229, 224, 223, 222, 221, 220, 219,
- 218, 217, 216, 215, 214, 213, 212, 211, 210, 209,
-
- 208, 207, 206, 205, 102, 196, 190, 191, 190, 190,
- 190, 193, 190, 192, 191, 190, 189, 172, 164, 163,
- 162, 161, 160, 159, 158, 153, 152, 151, 148, 137,
- 133, 105, 124, 122, 107, 106, 105, 104, 103, 102,
- 336, 13, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
-
- 336, 336, 336, 336
+ 98, 98, 82, 87, 82, 101, 119, 128, 120, 120,
+ 120, 135, 147, 130, 285, 159, 129, 136, 141, 144,
+ 160, 137, 286, 131, 230, 145, 146, 148, 121, 132,
+
+ 133, 142, 150, 155, 143, 151, 156, 167, 167, 168,
+ 231, 169, 193, 192, 193, 157, 169, 166, 171, 347,
+ 172, 346, 158, 175, 175, 176, 345, 177, 192, 193,
+ 191, 197, 177, 199, 344, 200, 200, 200, 170, 115,
+ 115, 115, 202, 343, 203, 203, 203, 173, 119, 342,
+ 120, 120, 120, 341, 178, 174, 179, 340, 180, 121,
+ 205, 339, 205, 180, 204, 206, 206, 206, 228, 229,
+ 121, 338, 181, 182, 167, 167, 168, 337, 169, 336,
+ 180, 167, 168, 169, 335, 180, 175, 176, 183, 184,
+ 167, 239, 168, 185, 169, 241, 241, 242, 242, 169,
+
+ 186, 206, 206, 206, 187, 170, 188, 334, 189, 333,
+ 190, 175, 175, 176, 202, 177, 200, 200, 200, 332,
+ 177, 170, 175, 240, 176, 331, 177, 277, 277, 243,
+ 330, 177, 329, 243, 243, 243, 200, 200, 200, 203,
+ 203, 203, 178, 243, 202, 328, 200, 200, 200, 246,
+ 246, 246, 327, 178, 326, 245, 121, 245, 325, 244,
+ 246, 246, 246, 205, 324, 205, 323, 322, 206, 206,
+ 206, 167, 167, 168, 321, 169, 320, 175, 175, 176,
+ 169, 177, 319, 278, 318, 317, 177, 278, 278, 278,
+ 280, 280, 280, 279, 316, 279, 315, 278, 280, 280,
+
+ 280, 314, 170, 313, 245, 312, 245, 311, 178, 246,
+ 246, 246, 279, 310, 279, 309, 308, 280, 280, 280,
+ 66, 66, 66, 71, 71, 71, 76, 76, 76, 81,
+ 81, 81, 201, 307, 201, 306, 305, 304, 303, 302,
+ 301, 300, 299, 298, 297, 296, 295, 294, 293, 292,
+ 291, 290, 289, 288, 287, 284, 283, 282, 281, 276,
+ 275, 274, 273, 272, 271, 270, 269, 268, 267, 266,
+ 265, 264, 263, 262, 261, 260, 259, 258, 257, 256,
+ 255, 254, 253, 252, 251, 250, 249, 248, 247, 191,
+ 192, 174, 166, 238, 237, 236, 235, 234, 233, 232,
+
+ 227, 226, 225, 224, 223, 222, 221, 220, 219, 218,
+ 217, 216, 215, 214, 213, 212, 211, 210, 209, 208,
+ 207, 102, 198, 192, 193, 192, 192, 192, 195, 192,
+ 194, 193, 192, 191, 174, 166, 165, 164, 163, 162,
+ 161, 154, 153, 152, 149, 138, 134, 105, 124, 122,
+ 107, 106, 105, 104, 103, 102, 350, 13, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350
} ;
-static const flex_int16_t yy_chk[605] =
+static const flex_int16_t yy_chk[622] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -686,67 +691,69 @@ static const flex_int16_t yy_chk[605] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 3, 3, 4, 4, 5, 5, 342, 5,
- 341, 6, 6, 3, 6, 4, 7, 7, 3, 27,
- 4, 8, 8, 28, 7, 32, 30, 38, 38, 8,
- 32, 27, 43, 43, 28, 30, 5, 32, 50, 334,
+ 1, 1, 1, 3, 3, 4, 4, 5, 5, 356,
+ 5, 355, 6, 6, 3, 6, 4, 7, 7, 3,
+ 27, 4, 8, 8, 28, 7, 32, 30, 38, 38,
+ 8, 32, 27, 43, 43, 28, 30, 5, 32, 50,
- 31, 6, 31, 31, 31, 333, 7, 36, 36, 36,
- 50, 8, 11, 11, 11, 11, 11, 11, 11, 11,
+ 347, 31, 6, 31, 31, 31, 346, 7, 36, 36,
+ 36, 50, 8, 11, 11, 11, 11, 11, 11, 11,
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 33, 45, 33, 33, 33, 46,
- 48, 96, 96, 51, 45, 53, 48, 52, 46, 324,
- 48, 322, 52, 52, 46, 51, 33, 55, 51, 53,
-
- 55, 59, 321, 59, 74, 74, 74, 319, 74, 94,
- 94, 94, 59, 74, 75, 75, 318, 75, 317, 59,
- 79, 79, 79, 315, 79, 99, 99, 314, 114, 79,
- 114, 114, 114, 152, 152, 74, 115, 115, 115, 119,
- 313, 119, 119, 119, 75, 120, 246, 120, 120, 120,
- 153, 79, 80, 80, 246, 80, 115, 121, 309, 121,
- 80, 119, 121, 121, 121, 153, 307, 120, 306, 80,
- 80, 305, 165, 165, 165, 304, 165, 80, 168, 168,
- 302, 165, 80, 176, 176, 80, 80, 179, 179, 301,
- 80, 180, 180, 237, 237, 197, 80, 197, 197, 197,
-
- 80, 300, 80, 165, 80, 299, 80, 166, 166, 166,
- 296, 166, 295, 173, 173, 173, 166, 173, 294, 174,
- 174, 174, 173, 174, 293, 188, 292, 291, 174, 188,
- 188, 188, 198, 198, 198, 201, 201, 201, 166, 188,
- 204, 204, 204, 200, 173, 200, 200, 200, 290, 288,
- 174, 202, 198, 202, 287, 201, 202, 202, 202, 203,
- 286, 203, 285, 284, 203, 203, 203, 235, 235, 235,
- 283, 235, 281, 236, 236, 236, 235, 236, 279, 239,
- 278, 276, 236, 239, 239, 239, 242, 242, 242, 240,
- 275, 240, 270, 239, 240, 240, 240, 269, 235, 268,
-
- 241, 265, 241, 264, 236, 241, 241, 241, 273, 263,
- 273, 262, 261, 273, 273, 273, 274, 274, 274, 337,
- 337, 337, 338, 338, 338, 339, 339, 339, 340, 340,
- 340, 343, 260, 343, 259, 258, 257, 255, 254, 253,
- 251, 250, 248, 245, 244, 243, 234, 233, 232, 231,
- 230, 229, 228, 227, 226, 225, 224, 223, 222, 221,
- 220, 219, 218, 217, 216, 214, 213, 212, 211, 210,
- 209, 208, 207, 205, 195, 193, 177, 169, 159, 158,
- 157, 156, 155, 154, 151, 150, 149, 148, 147, 146,
- 145, 144, 142, 141, 140, 139, 138, 136, 135, 134,
-
- 133, 132, 131, 130, 127, 112, 100, 97, 95, 93,
- 92, 91, 90, 89, 88, 86, 85, 78, 73, 70,
- 69, 68, 63, 61, 60, 58, 57, 56, 54, 49,
- 47, 40, 37, 34, 23, 22, 21, 20, 18, 17,
- 13, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
-
- 336, 336, 336, 336
+ 11, 11, 11, 11, 11, 11, 33, 45, 33, 33,
+ 33, 48, 53, 46, 251, 60, 45, 48, 51, 52,
+ 60, 48, 251, 46, 154, 52, 52, 53, 33, 46,
+
+ 46, 51, 55, 59, 51, 55, 59, 74, 74, 74,
+ 154, 74, 94, 94, 94, 59, 74, 75, 75, 345,
+ 75, 344, 59, 79, 79, 79, 338, 79, 96, 96,
+ 99, 99, 79, 114, 334, 114, 114, 114, 74, 115,
+ 115, 115, 119, 332, 119, 119, 119, 75, 120, 331,
+ 120, 120, 120, 329, 79, 80, 80, 328, 80, 115,
+ 121, 327, 121, 80, 119, 121, 121, 121, 153, 153,
+ 120, 326, 80, 80, 167, 167, 167, 324, 167, 323,
+ 80, 170, 170, 167, 322, 80, 178, 178, 80, 80,
+ 168, 168, 168, 80, 168, 181, 181, 182, 182, 168,
+
+ 80, 206, 206, 206, 80, 167, 80, 318, 80, 316,
+ 80, 175, 175, 175, 199, 175, 199, 199, 199, 315,
+ 175, 168, 176, 176, 176, 314, 176, 241, 241, 190,
+ 313, 176, 311, 190, 190, 190, 200, 200, 200, 203,
+ 203, 203, 175, 190, 202, 310, 202, 202, 202, 246,
+ 246, 246, 309, 176, 308, 204, 200, 204, 307, 203,
+ 204, 204, 204, 205, 303, 205, 302, 301, 205, 205,
+ 205, 239, 239, 239, 300, 239, 299, 240, 240, 240,
+ 239, 240, 298, 243, 297, 295, 240, 243, 243, 243,
+ 280, 280, 280, 244, 294, 244, 293, 243, 244, 244,
+
+ 244, 292, 239, 291, 245, 290, 245, 288, 240, 245,
+ 245, 245, 279, 286, 279, 285, 283, 279, 279, 279,
+ 351, 351, 351, 352, 352, 352, 353, 353, 353, 354,
+ 354, 354, 357, 282, 357, 281, 276, 275, 274, 273,
+ 270, 269, 268, 267, 266, 265, 264, 263, 262, 260,
+ 259, 258, 256, 255, 253, 250, 249, 248, 247, 238,
+ 237, 236, 235, 234, 233, 232, 231, 230, 229, 228,
+ 227, 226, 225, 224, 223, 222, 221, 220, 219, 217,
+ 216, 215, 214, 213, 212, 211, 210, 209, 207, 197,
+ 195, 179, 171, 161, 160, 159, 158, 157, 156, 155,
+
+ 152, 151, 150, 149, 148, 147, 146, 145, 143, 142,
+ 141, 140, 139, 137, 136, 135, 134, 133, 132, 131,
+ 130, 127, 112, 100, 97, 95, 93, 92, 91, 90,
+ 89, 88, 86, 85, 78, 73, 70, 69, 68, 63,
+ 61, 58, 57, 56, 54, 49, 47, 40, 37, 34,
+ 23, 22, 21, 20, 18, 17, 13, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350
} ;
static yy_state_type yy_last_accepting_state;
@@ -755,7 +762,7 @@ static char *yy_last_accepting_cpos;
extern int yy_flex_debug;
int yy_flex_debug = 1;
-static const flex_int16_t yy_rule_linenum[124] =
+static const flex_int16_t yy_rule_linenum[126] =
{ 0,
214, 215, 217, 223, 227, 228, 238, 239, 240, 241,
245, 246, 256, 257, 258, 259, 260, 261, 262, 263,
@@ -766,11 +773,11 @@ static const flex_int16_t yy_rule_linenum[124] =
332, 333, 334, 335, 336, 337, 338, 339, 340, 342,
343, 344, 345, 346, 347, 348, 350, 351, 352, 353,
354, 356, 357, 358, 359, 360, 361, 362, 363, 364,
- 365, 366, 367, 368, 369, 370, 371, 372, 373, 375,
+ 365, 366, 367, 368, 369, 370, 371, 372, 373, 374,
- 376, 377, 378, 379, 382, 389, 396, 398, 400, 402,
- 404, 407, 409, 410, 416, 420, 424, 428, 431, 435,
- 436, 437, 441
+ 376, 378, 379, 380, 381, 382, 385, 392, 399, 401,
+ 403, 405, 407, 410, 412, 413, 419, 423, 427, 431,
+ 434, 438, 439, 440, 444
} ;
/* The intent behind this definition is that it'll catch
@@ -823,7 +830,7 @@ Int tokPos;
Int charPos;
//int commentDepth = 0;
-bool eof;
+bool isEof;
string eofMessage;
extern errorstream em;
@@ -846,7 +853,7 @@ void setlexer(input_f input, string filename)
yy_input = input;
tokPos = charPos = 1;
- eof=false;
+ isEof=false;
eofMessage="<no eof>";
}
@@ -885,7 +892,7 @@ void savesymbol(symbol name)
* etc. Following the Don't Repeat Yourself principle, the mapping from
* strings to names is defined only here in camp.l (because we can't produce
* lex rules from a C style macro).
- * The script opsymbols.pl reads this file scanning for rules using DEFSYMBOL
+ * The script opsymbols.py reads this file scanning for rules using DEFSYMBOL
* and creates opsymbols.h which defines the names for use in C++ code.
*/
#define DEFSYMBOL(name) \
@@ -935,7 +942,7 @@ void error(void)
// the error message that should be reported, and may differ if, say the input
// ends in the middle of a string or comment.
void setEOF(string message) {
- eof=true;
+ isEof=true;
eofMessage=message;
}
@@ -943,16 +950,16 @@ void setEOF(string message) {
// running out of input.
bool lexerEOF()
{
- return eof;
+ return isEof;
}
// Called by code outside of the lexer when it wants to report the unexpected
// eof as an error (instead of looking for more input).
void reportEOF() {
- assert(eof);
+ assert(isEof);
error();
em << eofMessage;
- em.sync();
+ em.sync(true);
}
position stringpos; // The position of the start of the string.
@@ -979,9 +986,9 @@ void getstring(void)
}
}
-#line 982 "lex.yy.cc"
+#line 989 "lex.yy.cc"
-#line 984 "lex.yy.cc"
+#line 991 "lex.yy.cc"
#define INITIAL 0
#define lexcomment 1
@@ -1269,7 +1276,7 @@ YY_DECL
#line 211 "camp.l"
-#line 1272 "lex.yy.cc"
+#line 1279 "lex.yy.cc"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
@@ -1298,13 +1305,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 337 )
+ if ( yy_current_state >= 351 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 542 );
+ while ( yy_base[yy_current_state] != 558 );
yy_find_action:
/* %% [10.0] code to find the action number goes here */
@@ -1327,13 +1334,13 @@ do_action: /* This label is used only to access EOF actions. */
{
if ( yy_act == 0 )
fprintf( stderr, "--scanner backing up\n" );
- else if ( yy_act < 124 )
+ else if ( yy_act < 126 )
fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
(long)yy_rule_linenum[yy_act], yytext );
- else if ( yy_act == 124 )
+ else if ( yy_act == 126 )
fprintf( stderr, "--accepting default rule (\"%s\")\n",
yytext );
- else if ( yy_act == 125 )
+ else if ( yy_act == 127 )
fprintf( stderr, "--(end of buffer or a NUL)\n" );
else
fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -1884,72 +1891,83 @@ YY_RULE_SETUP
case 92:
YY_RULE_SETUP
#line 366 "camp.l"
-{adjust(); return NEW; }
+{adjust(); return USING; }
YY_BREAK
case 93:
YY_RULE_SETUP
#line 367 "camp.l"
-{adjust(); return ACCESS; }
+{adjust(); return NEW; }
YY_BREAK
case 94:
YY_RULE_SETUP
#line 368 "camp.l"
-{adjust(); return IMPORT; }
+{adjust(); return ACCESS; }
YY_BREAK
case 95:
YY_RULE_SETUP
#line 369 "camp.l"
-{adjust(); return UNRAVEL; }
+{adjust(); return IMPORT; }
YY_BREAK
case 96:
YY_RULE_SETUP
#line 370 "camp.l"
-{adjust(); return FROM; }
+{adjust(); return UNRAVEL; }
YY_BREAK
case 97:
YY_RULE_SETUP
#line 371 "camp.l"
-{adjust(); return INCLUDE; }
+{adjust(); return FROM; }
YY_BREAK
case 98:
YY_RULE_SETUP
#line 372 "camp.l"
-{adjust(); return QUOTE; }
+{adjust(); return INCLUDE; }
YY_BREAK
case 99:
YY_RULE_SETUP
#line 373 "camp.l"
-{adjust(); makemod(trans::EXPLICIT_STATIC);
- return MODIFIER; }
+{adjust(); return QUOTE; }
YY_BREAK
case 100:
YY_RULE_SETUP
-#line 375 "camp.l"
-{adjust(); makeperm(trans::PUBLIC); return PERM; }
+#line 374 "camp.l"
+{adjust(); makemod(trans::EXPLICIT_STATIC);
+ return MODIFIER; }
YY_BREAK
case 101:
YY_RULE_SETUP
#line 376 "camp.l"
-{adjust(); makeperm(trans::PRIVATE); return PERM; }
+{adjust(); makemod(trans::AUTOUNRAVEL);
+ return MODIFIER; }
YY_BREAK
case 102:
YY_RULE_SETUP
-#line 377 "camp.l"
-{adjust(); makeperm(trans::RESTRICTED); return PERM; }
+#line 378 "camp.l"
+{adjust(); makeperm(trans::PUBLIC); return PERM; }
YY_BREAK
case 103:
YY_RULE_SETUP
-#line 378 "camp.l"
-{adjust(); return THIS; }
+#line 379 "camp.l"
+{adjust(); makeperm(trans::PRIVATE); return PERM; }
YY_BREAK
case 104:
YY_RULE_SETUP
-#line 379 "camp.l"
-{adjust(); return EXPLICIT; }
+#line 380 "camp.l"
+{adjust(); makeperm(trans::RESTRICTED); return PERM; }
YY_BREAK
case 105:
YY_RULE_SETUP
+#line 381 "camp.l"
+{adjust(); return THIS_TOK; }
+ YY_BREAK
+case 106:
+YY_RULE_SETUP
#line 382 "camp.l"
+{adjust(); return EXPLICIT; }
+ YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 385 "camp.l"
try {
adjust(); yylval.e= new intExp(here(), lexical::cast<Int>(yytext));
} catch (lexical::bad_cast&) {
@@ -1958,9 +1976,9 @@ try {
yylval.e= new intExp(here(), 0);
} return LIT;
YY_BREAK
-case 106:
+case 108:
YY_RULE_SETUP
-#line 389 "camp.l"
+#line 392 "camp.l"
try {
adjust(); yylval.e= new realExp(here(), lexical::cast<double>(yytext));
} catch (lexical::bad_cast&) {
@@ -1969,121 +1987,121 @@ try {
yylval.e= new realExp(here(), 0);
} return LIT;
YY_BREAK
-case 107:
+case 109:
YY_RULE_SETUP
-#line 396 "camp.l"
+#line 399 "camp.l"
{
adjust(); yylval.e= new booleanExp(here(), true); return LIT; }
YY_BREAK
-case 108:
+case 110:
YY_RULE_SETUP
-#line 398 "camp.l"
+#line 401 "camp.l"
{
adjust(); yylval.e= new booleanExp(here(), false); return LIT; }
YY_BREAK
-case 109:
+case 111:
YY_RULE_SETUP
-#line 400 "camp.l"
+#line 403 "camp.l"
{
adjust(); yylval.e= new nullExp(here()); return LIT; }
YY_BREAK
-case 110:
+case 112:
YY_RULE_SETUP
-#line 402 "camp.l"
+#line 405 "camp.l"
{
adjust(); yylval.e= new cycleExp(here()); return LIT; }
YY_BREAK
-case 111:
+case 113:
YY_RULE_SETUP
-#line 404 "camp.l"
+#line 407 "camp.l"
{
adjust(); yylval.e= new newPictureExp(here()); return LIT; }
YY_BREAK
-case 112:
+case 114:
YY_RULE_SETUP
-#line 407 "camp.l"
+#line 410 "camp.l"
{adjust(); BEGIN opname; }
YY_BREAK
-case 113:
+case 115:
YY_RULE_SETUP
-#line 409 "camp.l"
+#line 412 "camp.l"
{adjust(); continue;}
YY_BREAK
-case 114:
-/* rule 114 can match eol */
+case 116:
+/* rule 116 can match eol */
YY_RULE_SETUP
-#line 410 "camp.l"
+#line 413 "camp.l"
{adjust(); newline(); continue;}
YY_BREAK
case YY_STATE_EOF(opname):
-#line 411 "camp.l"
+#line 414 "camp.l"
{adjust();
setEOF("missing operator name");
BEGIN INITIAL;
return GARBAGE;
}
YY_BREAK
-case 115:
+case 117:
YY_RULE_SETUP
-#line 416 "camp.l"
+#line 419 "camp.l"
{ savesymbol(SYM_CARET);
BEGIN INITIAL;
return ID;
}
YY_BREAK
-case 116:
+case 118:
YY_RULE_SETUP
-#line 420 "camp.l"
+#line 423 "camp.l"
{
makeopsymbol();
BEGIN INITIAL;
return ID;}
YY_BREAK
-case 117:
+case 119:
YY_RULE_SETUP
-#line 424 "camp.l"
+#line 427 "camp.l"
{
makeopsymbol();
BEGIN INITIAL;
return ID; }
YY_BREAK
-case 118:
+case 120:
YY_RULE_SETUP
-#line 428 "camp.l"
+#line 431 "camp.l"
{}
YY_BREAK
-case 119:
+case 121:
YY_RULE_SETUP
-#line 431 "camp.l"
+#line 434 "camp.l"
{
makesymbol();
return ID; }
YY_BREAK
-case 120:
+case 122:
YY_RULE_SETUP
-#line 435 "camp.l"
+#line 438 "camp.l"
{adjust(); /*commentDepth = 1;*/ BEGIN lexcomment; }
YY_BREAK
-case 121:
+case 123:
YY_RULE_SETUP
-#line 436 "camp.l"
+#line 439 "camp.l"
{startstring(); BEGIN texstring; }
YY_BREAK
-case 122:
+case 124:
YY_RULE_SETUP
-#line 437 "camp.l"
+#line 440 "camp.l"
{startstring(); BEGIN cstring; }
YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(lexformat):
-#line 439 "camp.l"
+#line 442 "camp.l"
{ setEOF("unexpected end of input"); yyterminate(); }
YY_BREAK
-case 123:
+case 125:
YY_RULE_SETUP
-#line 441 "camp.l"
+#line 444 "camp.l"
{adjust();
error();
em << "invalid token";
@@ -2091,12 +2109,12 @@ YY_RULE_SETUP
em << " '" << yytext[0] << "'";
}
YY_BREAK
-case 124:
+case 126:
YY_RULE_SETUP
-#line 447 "camp.l"
+#line 450 "camp.l"
ECHO;
YY_BREAK
-#line 2099 "lex.yy.cc"
+#line 2117 "lex.yy.cc"
case YY_END_OF_BUFFER:
{
@@ -2414,7 +2432,7 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 337 )
+ if ( yy_current_state >= 351 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -2447,11 +2465,11 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 337 )
+ if ( yy_current_state >= 351 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
- yy_is_jam = (yy_current_state == 336);
+ yy_is_jam = (yy_current_state == 350);
return yy_is_jam ? 0 : yy_current_state;
}
@@ -3243,4 +3261,4 @@ void yyfree (void * ptr )
/* %ok-for-header */
-#line 447 "camp.l"
+#line 450 "camp.l"
diff --git a/graphics/asymptote/libatomic_ops/AUTHORS b/graphics/asymptote/libatomic_ops/AUTHORS
new file mode 100644
index 0000000000..0077812ec5
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/AUTHORS
@@ -0,0 +1,60 @@
+Originally written by Hans Boehm, with some platform-dependent code
+imported from the Boehm-Demers-Weiser GC, where it was contributed
+by many others.
+Currently maintained by Ivan Maidanski.
+
+Alexey Pavlov <alexpux@gmail.com>
+Andreas Tobler <andreastt@gmail.com>
+Andrew Agno <agno+boehmgc@agno.net>
+Andy Li <andy@onthewings.net>
+Bradley Smith <brad@brad-smith.co.uk>
+Bruce Mitchener <bruce.mitchener@gmail.com>
+Carlos O'Donell <carlos@baldric.uwo.ca>
+Chris Metcalf <cmetcalf@mellanox.com>
+Daniel Grayson <dan@math.uiuc.edu>
+David Mosberger <davidm@hpl.hp.com>
+Doug Lea <dl@cs.oswego.edu>
+Earl Chew <earl_chew@agilent.com>
+Emmanuel Stapf <manus@eiffel.com>
+Fabrizio Fabbri <ffabbri4@bloomberg.net>
+Frank Schaefer <kelledin@gmail.com>
+Frederic Recoules <frederic.recoules@orange.fr>
+George Koehler <kernigh@gmail.com>
+Gilles Talis <gilles.talis@gmail.com>
+Gregory Farnum <gregory.farnum@dreamhost.com>
+H.J. Lu <hjl.tools@gmail.com>
+Hans Boehm <boehm@acm.org>
+Hans-Peter Nilsson <hp@axis.com>
+Ian Wienand <ian@wienand.org>
+Ivan Maidanski <ivmai@mail.ru>
+James Cowgill <james410@cowgill.org.uk>
+Jean Girardet <jean.girardet@atos.net>
+Jeremy Huddleston <jeremyhu@apple.com>
+Jim Marshall <jim.marshall@wbemsolutions.com>
+Joerg Wagner <wagner@it.neclab.eu>
+Linas Vepstas <linasvepstas@gmail.com>
+Luca Barbato <lu_zero@gentoo.org>
+Kochin Chang <kochinc@outlook.com>
+Maged Michael <michael@cs.rochester.edu>
+Manuel Serrano <Manuel.Serrano@inria.fr>
+Marek Vasut <marex@denx.de>
+Max Horn <max@quendi.de>
+Michael Hope <michael.hope@linaro.org>
+Mikael Urankar <mikael.urankar@gipsa-lab.grenoble-inp.fr>
+Patrick Marlier <patrick.marlier@unine.ch>
+Pavel Raiskup <praiskup@redhat.com>
+Petter Urkedal <urkedal@nbi.dk>
+Philipp Zambelli <pzamb@iicm.edu>
+Ranko Zivojnovic <ranko@spidernet.net>
+Roger Hoover <roger.hoover@gmail.com>
+Sebastian Siewior <sebastian@breakpoint.cc>
+Shea Levy <shea@shealevy.com>
+Steve Capper <steve.capper@linaro.org>
+Takashi Yoshii <takashi.yoshii.zj@renesas.com>
+Tautvydas Zilys <tautvydas.zilys@gmail.com>
+Thiemo Seufer <ica2_ts@csv.ica.uni-stuttgart.de>
+Thorsten Glaser <tg@debian.org>
+Tobias Leich <email@froggs.de>
+Tony Mantler <nicoya@ubb.ca>
+YunQiang Su <wzssyqa@gmail.com>
+Yvan Roux <yvan.roux@linaro.org>
diff --git a/graphics/asymptote/libatomic_ops/CMakeLists.txt b/graphics/asymptote/libatomic_ops/CMakeLists.txt
new file mode 100644
index 0000000000..498d28a28e
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/CMakeLists.txt
@@ -0,0 +1,380 @@
+#
+# Copyright (c) 2021-2022 Ivan Maidanski
+##
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+##
+
+cmake_minimum_required(VERSION 3.5)
+
+set(PACKAGE_VERSION 7.8.2)
+# Version must match that in AC_INIT of configure.ac and that in README.
+# Version must conform to: [0-9]+[.][0-9]+[.][0-9]+
+
+# Info (current:revision:age) for the Libtool versioning system.
+# These values should match those in src/Makefile.am.
+set(LIBATOMIC_OPS_VER_INFO 3:0:2)
+set(LIBATOMIC_OPS_GPL_VER_INFO 3:1:2)
+
+project(libatomic_ops C)
+
+if (POLICY CMP0057)
+ # Required for CheckLinkerFlag, at least.
+ cmake_policy(SET CMP0057 NEW)
+endif()
+
+include(CheckCCompilerFlag)
+include(CheckFunctionExists)
+include(CMakePackageConfigHelpers)
+include(CTest)
+include(GNUInstallDirs)
+
+if (NOT (${CMAKE_VERSION} VERSION_LESS "3.18.0"))
+ include(CheckLinkerFlag)
+endif()
+
+# Customize the build by passing "-D<option_name>=ON|OFF" in the command line.
+option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
+option(build_tests "Build tests" OFF)
+option(enable_assertions "Enable assertion checking" OFF)
+option(enable_werror "Treat warnings as errors" OFF)
+option(enable_atomic_intrinsics "Use GCC atomic intrinsics" ON)
+option(enable_docs "Build and install documentation" ON)
+option(enable_gpl "Build atomic_ops_gpl library" ON)
+option(install_headers "Install header and pkg-config metadata files" ON)
+
+# Override the default build type to RelWithDebInfo (this instructs cmake to
+# pass -O2 -g -DNDEBUG options to the compiler).
+if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE
+ STRING "Choose the type of build." FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
+ STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel")
+endif()
+
+# Convert VER_INFO values to [SO]VERSION ones.
+if (BUILD_SHARED_LIBS)
+ # atomic_ops:
+ string(REGEX REPLACE "(.+):.+:.+" "\\1" ao_cur ${LIBATOMIC_OPS_VER_INFO})
+ string(REGEX REPLACE ".+:(.+):.+" "\\1" ao_rev ${LIBATOMIC_OPS_VER_INFO})
+ string(REGEX REPLACE ".+:.+:(.+)$" "\\1" ao_age ${LIBATOMIC_OPS_VER_INFO})
+ math(EXPR AO_SOVERSION "${ao_cur} - ${ao_age}")
+ set(AO_VERSION_PROP "${AO_SOVERSION}.${ao_age}.${ao_rev}")
+ message(STATUS "AO_VERSION_PROP = ${AO_VERSION_PROP}")
+ # atomic_ops_gpl:
+ string(REGEX REPLACE "(.+):.+:.+" "\\1" ao_gpl_cur
+ ${LIBATOMIC_OPS_GPL_VER_INFO})
+ string(REGEX REPLACE ".+:(.+):.+" "\\1" ao_gpl_rev
+ ${LIBATOMIC_OPS_GPL_VER_INFO})
+ string(REGEX REPLACE ".+:.+:(.+)$" "\\1" ao_gpl_age
+ ${LIBATOMIC_OPS_GPL_VER_INFO})
+ math(EXPR AO_GPL_SOVERSION "${ao_gpl_cur} - ${ao_gpl_age}")
+ set(AO_GPL_VERSION_PROP "${AO_GPL_SOVERSION}.${ao_gpl_age}.${ao_gpl_rev}")
+ message(STATUS "AO_GPL_VERSION_PROP = ${AO_GPL_VERSION_PROP}")
+endif(BUILD_SHARED_LIBS)
+
+# Output all warnings.
+if (MSVC)
+ # All warnings but ignoring "conditional expression is constant" ones.
+ add_compile_options(/W4 /wd4127)
+else()
+ # TODO: add -[W]pedantic -Wno-long-long
+ add_compile_options(-Wall -Wextra)
+endif()
+
+find_package(Threads REQUIRED)
+message(STATUS "Thread library: ${CMAKE_THREAD_LIBS_INIT}")
+include_directories(${Threads_INCLUDE_DIR})
+set(THREADDLLIBS_LIST ${CMAKE_THREAD_LIBS_INIT})
+
+if (CMAKE_USE_PTHREADS_INIT)
+ # Required define if using POSIX threads.
+ add_compile_options(-D_REENTRANT)
+else()
+ # No pthreads library available.
+ add_compile_options(-DAO_NO_PTHREADS)
+endif()
+
+if (enable_assertions)
+ # In case NDEBUG macro is defined e.g. by cmake -DCMAKE_BUILD_TYPE=Release.
+ add_compile_options(-UNDEBUG)
+else()
+ # Define to disable assertion checking.
+ add_compile_options(-DNDEBUG)
+endif()
+
+if (NOT enable_atomic_intrinsics)
+ # Define to avoid GCC atomic intrinsics even if available.
+ add_compile_options(-DAO_DISABLE_GCC_ATOMICS)
+endif()
+
+# AO API symbols export control.
+if (BUILD_SHARED_LIBS)
+ add_compile_options(-DAO_DLL)
+endif()
+
+if (enable_werror)
+ if (MSVC)
+ add_compile_options(/WX)
+ else()
+ add_compile_options(-Werror)
+ endif()
+endif(enable_werror)
+
+# Extra user-defined flags to pass to the C compiler.
+if (DEFINED CFLAGS_EXTRA)
+ separate_arguments(CFLAGS_EXTRA_LIST UNIX_COMMAND "${CFLAGS_EXTRA}")
+ add_compile_options(${CFLAGS_EXTRA_LIST})
+endif()
+
+set(SRC src/atomic_ops.c)
+
+if (CMAKE_C_COMPILER_ID STREQUAL "SunPro")
+ # SunCC compiler on SunOS (Solaris).
+ set(SRC ${SRC} src/atomic_ops_sysdeps.S)
+endif()
+
+add_library(atomic_ops ${SRC})
+target_link_libraries(atomic_ops PRIVATE ${THREADDLLIBS_LIST})
+target_include_directories(atomic_ops
+ PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
+ INTERFACE "$<INSTALL_INTERFACE:include>")
+
+if (enable_gpl)
+ set(AO_GPL_SRC src/atomic_ops_malloc.c src/atomic_ops_stack.c)
+ add_library(atomic_ops_gpl ${AO_GPL_SRC})
+ check_function_exists(mmap HAVE_MMAP)
+ if (HAVE_MMAP)
+ target_compile_definitions(atomic_ops_gpl PRIVATE HAVE_MMAP)
+ endif()
+ target_link_libraries(atomic_ops_gpl PRIVATE atomic_ops)
+ target_include_directories(atomic_ops_gpl
+ PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
+ INTERFACE "$<INSTALL_INTERFACE:include>")
+ if (BUILD_SHARED_LIBS)
+ set_property(TARGET atomic_ops_gpl PROPERTY VERSION ${AO_GPL_VERSION_PROP})
+ set_property(TARGET atomic_ops_gpl PROPERTY SOVERSION ${AO_GPL_SOVERSION})
+ endif()
+ install(TARGETS atomic_ops_gpl EXPORT Atomic_opsTargets
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+endif(enable_gpl)
+
+if (BUILD_SHARED_LIBS)
+ if (NOT (${CMAKE_SYSTEM_NAME} MATCHES "BSD"))
+ if (${CMAKE_VERSION} VERSION_LESS "3.18.0")
+ set(WL_NO_UNDEFINED_OPT "-Wl,--no-undefined")
+ check_c_compiler_flag(${WL_NO_UNDEFINED_OPT} HAVE_FLAG_WL_NO_UNDEFINED)
+ else()
+ set(WL_NO_UNDEFINED_OPT "LINKER:--no-undefined")
+ check_linker_flag(C "${WL_NO_UNDEFINED_OPT}" HAVE_FLAG_WL_NO_UNDEFINED)
+ endif()
+ if (HAVE_FLAG_WL_NO_UNDEFINED)
+ # Declare that the libraries do not refer to external symbols.
+ if (${CMAKE_VERSION} VERSION_LESS "3.13.0")
+ target_link_libraries(atomic_ops PRIVATE ${WL_NO_UNDEFINED_OPT})
+ if (enable_gpl)
+ target_link_libraries(atomic_ops_gpl PRIVATE ${WL_NO_UNDEFINED_OPT})
+ endif(enable_gpl)
+ else()
+ target_link_options(atomic_ops PRIVATE ${WL_NO_UNDEFINED_OPT})
+ if (enable_gpl)
+ target_link_options(atomic_ops_gpl PRIVATE ${WL_NO_UNDEFINED_OPT})
+ endif(enable_gpl)
+ endif()
+ endif(HAVE_FLAG_WL_NO_UNDEFINED)
+ endif()
+ set_property(TARGET atomic_ops PROPERTY VERSION ${AO_VERSION_PROP})
+ set_property(TARGET atomic_ops PROPERTY SOVERSION ${AO_SOVERSION})
+endif(BUILD_SHARED_LIBS)
+
+install(TARGETS atomic_ops EXPORT Atomic_opsTargets
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+
+if (install_headers)
+ install(FILES src/atomic_ops.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+ if (enable_gpl)
+ install(FILES src/atomic_ops_malloc.h
+ src/atomic_ops_stack.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+ endif()
+
+ install(FILES src/atomic_ops/ao_version.h
+ src/atomic_ops/generalize-arithm.h
+ src/atomic_ops/generalize-small.h
+ src/atomic_ops/generalize.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops")
+
+ install(FILES src/atomic_ops/sysdeps/all_acquire_release_volatile.h
+ src/atomic_ops/sysdeps/all_aligned_atomic_load_store.h
+ src/atomic_ops/sysdeps/all_atomic_load_store.h
+ src/atomic_ops/sysdeps/all_atomic_only_load.h
+ src/atomic_ops/sysdeps/ao_t_is_int.h
+ src/atomic_ops/sysdeps/emul_cas.h
+ src/atomic_ops/sysdeps/generic_pthread.h
+ src/atomic_ops/sysdeps/ordered.h
+ src/atomic_ops/sysdeps/ordered_except_wr.h
+ src/atomic_ops/sysdeps/read_ordered.h
+ src/atomic_ops/sysdeps/standard_ao_double_t.h
+ src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h
+ src/atomic_ops/sysdeps/test_and_set_t_is_char.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps")
+
+ install(FILES src/atomic_ops/sysdeps/armcc/arm_v6.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/armcc")
+ install(FILES src/atomic_ops/sysdeps/gcc/aarch64.h
+ src/atomic_ops/sysdeps/gcc/alpha.h
+ src/atomic_ops/sysdeps/gcc/arm.h
+ src/atomic_ops/sysdeps/gcc/avr32.h
+ src/atomic_ops/sysdeps/gcc/cris.h
+ src/atomic_ops/sysdeps/gcc/e2k.h
+ src/atomic_ops/sysdeps/gcc/generic-arithm.h
+ src/atomic_ops/sysdeps/gcc/generic-small.h
+ src/atomic_ops/sysdeps/gcc/generic.h
+ src/atomic_ops/sysdeps/gcc/hexagon.h
+ src/atomic_ops/sysdeps/gcc/hppa.h
+ src/atomic_ops/sysdeps/gcc/ia64.h
+ src/atomic_ops/sysdeps/gcc/m68k.h
+ src/atomic_ops/sysdeps/gcc/mips.h
+ src/atomic_ops/sysdeps/gcc/powerpc.h
+ src/atomic_ops/sysdeps/gcc/riscv.h
+ src/atomic_ops/sysdeps/gcc/s390.h
+ src/atomic_ops/sysdeps/gcc/sh.h
+ src/atomic_ops/sysdeps/gcc/sparc.h
+ src/atomic_ops/sysdeps/gcc/tile.h
+ src/atomic_ops/sysdeps/gcc/x86.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/gcc")
+
+ install(FILES src/atomic_ops/sysdeps/hpc/hppa.h
+ src/atomic_ops/sysdeps/hpc/ia64.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/hpc")
+ install(FILES src/atomic_ops/sysdeps/ibmc/powerpc.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/ibmc")
+ install(FILES src/atomic_ops/sysdeps/icc/ia64.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/icc")
+
+ install(FILES src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.h
+ src/atomic_ops/sysdeps/loadstore/atomic_load.h
+ src/atomic_ops/sysdeps/loadstore/atomic_store.h
+ src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h
+ src/atomic_ops/sysdeps/loadstore/char_atomic_load.h
+ src/atomic_ops/sysdeps/loadstore/char_atomic_store.h
+ src/atomic_ops/sysdeps/loadstore/double_atomic_load_store.h
+ src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h
+ src/atomic_ops/sysdeps/loadstore/int_atomic_load.h
+ src/atomic_ops/sysdeps/loadstore/int_atomic_store.h
+ src/atomic_ops/sysdeps/loadstore/ordered_loads_only.h
+ src/atomic_ops/sysdeps/loadstore/ordered_stores_only.h
+ src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h
+ src/atomic_ops/sysdeps/loadstore/short_atomic_load.h
+ src/atomic_ops/sysdeps/loadstore/short_atomic_store.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/loadstore")
+
+ install(FILES src/atomic_ops/sysdeps/msftc/arm.h
+ src/atomic_ops/sysdeps/msftc/arm64.h
+ src/atomic_ops/sysdeps/msftc/common32_defs.h
+ src/atomic_ops/sysdeps/msftc/x86.h
+ src/atomic_ops/sysdeps/msftc/x86_64.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/msftc")
+ install(FILES src/atomic_ops/sysdeps/sunc/sparc.h
+ src/atomic_ops/sysdeps/sunc/x86.h
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/atomic_ops/sysdeps/sunc")
+
+ # Provide pkg-config metadata.
+ set(prefix "${CMAKE_INSTALL_PREFIX}")
+ set(exec_prefix \${prefix})
+ set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
+ set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
+ string(REPLACE ";" " " THREADDLLIBS "${THREADDLLIBS_LIST}")
+ # PACKAGE_VERSION is defined above.
+ configure_file(pkgconfig/atomic_ops.pc.in pkgconfig/atomic_ops.pc @ONLY)
+ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/atomic_ops.pc"
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+ # TODO: handle atomic_ops-uninstalled.pc.in
+endif(install_headers)
+
+if (build_tests)
+ add_executable(test_atomic tests/test_atomic.c)
+ target_link_libraries(test_atomic PRIVATE atomic_ops ${THREADDLLIBS_LIST})
+ add_test(NAME test_atomic COMMAND test_atomic)
+
+ add_executable(test_atomic_generalized tests/test_atomic.c)
+ target_compile_definitions(test_atomic_generalized
+ PRIVATE AO_PREFER_GENERALIZED AO_TEST_EMULATION)
+ target_link_libraries(test_atomic_generalized
+ PRIVATE atomic_ops ${THREADDLLIBS_LIST})
+ add_test(NAME test_atomic_generalized COMMAND test_atomic_generalized)
+
+ if (CMAKE_USE_PTHREADS_INIT)
+ add_executable(test_atomic_pthreads tests/test_atomic.c)
+ target_compile_definitions(test_atomic_pthreads
+ PRIVATE AO_USE_PTHREAD_DEFS)
+ target_link_libraries(test_atomic_pthreads
+ PRIVATE atomic_ops ${THREADDLLIBS_LIST})
+ add_test(NAME test_atomic_pthreads COMMAND test_atomic_pthreads)
+ endif()
+
+ if (enable_gpl)
+ add_executable(test_stack tests/test_stack.c)
+ target_link_libraries(test_stack
+ PRIVATE atomic_ops atomic_ops_gpl ${THREADDLLIBS_LIST})
+ add_test(NAME test_stack COMMAND test_stack)
+
+ add_executable(test_malloc tests/test_malloc.c)
+ target_link_libraries(test_malloc
+ PRIVATE atomic_ops atomic_ops_gpl ${THREADDLLIBS_LIST})
+ add_test(NAME test_malloc COMMAND test_malloc)
+ endif()
+endif(build_tests)
+
+if (enable_docs)
+ install(FILES AUTHORS ChangeLog LICENSE README.md
+ README_details.txt README_win32.txt
+ DESTINATION "${CMAKE_INSTALL_DOCDIR}")
+ if (enable_gpl)
+ install(FILES COPYING README_malloc.txt README_stack.txt
+ DESTINATION "${CMAKE_INSTALL_DOCDIR}")
+ endif()
+endif(enable_docs)
+
+# CMake config/targets files.
+install(EXPORT Atomic_opsTargets FILE Atomic_opsTargets.cmake
+ NAMESPACE Atomic_ops::
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/atomic_ops")
+
+configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/Atomic_opsConfig.cmake"
+ INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/atomic_ops"
+ NO_SET_AND_CHECK_MACRO)
+
+write_basic_package_version_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/Atomic_opsConfigVersion.cmake"
+ VERSION "${PACKAGE_VERSION}" COMPATIBILITY AnyNewerVersion)
+
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Atomic_opsConfig.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/Atomic_opsConfigVersion.cmake"
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/atomic_ops")
+
+export(EXPORT Atomic_opsTargets
+ FILE "${CMAKE_CURRENT_BINARY_DIR}/Atomic_opsTargets.cmake")
diff --git a/graphics/asymptote/libatomic_ops/COPYING b/graphics/asymptote/libatomic_ops/COPYING
new file mode 100644
index 0000000000..d159169d10
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 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.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/graphics/asymptote/libatomic_ops/ChangeLog b/graphics/asymptote/libatomic_ops/ChangeLog
new file mode 100644
index 0000000000..6c03d71415
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/ChangeLog
@@ -0,0 +1,765 @@
+
+== [7.8.2] 2023-12-15 ==
+
+* Eliminate 'atomic_thread_fence is unsupported with tsan' gcc-11 warning
+* Eliminate 'comparing signed/unsigned values' lcc warning in add_chunk_as
+* Fix 'undefined reference to AO_pt_lock' if configure is using clang-16
+* Fix 'undefined reference to __atomic_load/store/cas_16' Mingw64-gcc error
+* Fix 'undefined reference' linker errors if shared build on OpenBSD (CMake)
+* Fix get_chunk for case of mmap area is located before AO_initial_heap
+* Fix typo in AO_HAVE_compare_and_swap_double name in atomic_ops_stack.h
+* Fix typo in comment of run_one_test of test_stack
+* Fix typos in comments of atomic_ops_malloc.c and atomic_ops_stack.c/h
+* Update cmake minimum required version to 3.5
+
+
+== [7.8.0] 2023-03-26 ==
+
+* Add AUTHORS file to the list of installed documentation
+* Add goal to Makefile.msft to build all tests but not execute them
+* Allocate marks[] dynamically and report all found errors in test_stack
+* Always export stack_init/push_release/pop_acquire from atomic_ops_gpl
+* Always use 'mfence' for nop_full if target CPU supports SSE2 (MS VC/x86)
+* Avoid 'cast increases required alignment' warnings in atomic_ops_malloc.c
+* Avoid breaking strict-aliasing rules in test_malloc and test_stack
+* Avoid code duplication in AO_stack_push_explicit_aux_release
+* Better document test_stack internals
+* Build atomic_ops.lib by Makefile.msft (MS VC)
+* Build test object and executable files in tests folder (MS VC)
+* Define AO_stack_t uniformly
+* Define double_compare_and_swap_full if MS VS 2017+ (x86)
+* Do not expose AO_REAL_HEAD/NEXT_PTR implementation in header by default
+* Document config macros in README_win32 and remove them from configure
+* Eliminate 'function is never used' cppcheck warning for AO_stack_init
+* Enforce most strict level of compiler warnings (MS VC)
+* Ensure atomic_ops.c global symbols are always declared as extern 'C'
+* Explicitly outline symbols exported in AO shared libraries with AO_API
+* Hide AO_free_list symbol
+* Implement AO_stack_init using memset
+* Implement AO_test_and_set using InterlockedExchange8 (MS VC)
+* Implement and/or/xor for AO_t, short and int types (MS VC)
+* Implement nf/acq/rel variants of primitives on Windows RT (MS VC)
+* Mention MIT near core library licensing terms in LICENSE file
+* Move all README_*.txt and license files to the top folder
+* Move all non-double intrinsic-based primitives to msftc/common32_defs.h
+* Move gcc-4/alpha workaround outside AO_stack_pop_explicit_aux_acquire
+* New AO_stack_is_lock_free API function
+* New configure option (--disable-gpl) to skip building of libatomic_ops_gpl
+* Print message of almost-lock-free implementation in test_stack if used
+* Refine LICENSE and README about code parts covered by MIT and GPL-2.0
+* Refine copyright terms in GPL source files
+* Reformat atomic_ops_stack.c/h files
+* Remove 'lib' prefix for atomic_ops_gpl.lib in Makefile.msft
+* Remove redundant assert in AO_stack_pop_explicit_aux_acquire
+* Remove redundant cast to AO_t in lock-free AO_stack_pop_acquire
+* Rename LICENSING.txt to LICENSE file
+* Rename VERBOSE macro to VERBOSE_STACK in test_stack (refactoring)
+* Rename fetch_and_add to fetch_then_add in test_stack (refactoring)
+* Replace obsolete AC_HELP_STRING with AS_HELP_STRING in configure
+* Replace obsolete AC_TRY_COMPILE with AC_COMPILE_IFELSE in configure
+* Split test_stack main into several functions (refactoring)
+* Support Elbrus 2000 (gcc/e2k)
+* Support build with CMake
+* Support double-wide CAS on armv7+ and UWP/arm64 (MS VC)
+* Support test_atomic with MS build w/o the need to run GNU make first
+* Update autotools for release tarball preparation (ac-2.71, m4-1.4.19)
+* Use GCC atomic intrinsics for SPARC
+* Use builtin_expect in AO_stack_push_explicit_aux_release
+
+
+== [7.6.16] 2023-12-15 ==
+
+* Eliminate 'atomic_thread_fence is unsupported with tsan' gcc-11 warning
+* Eliminate 'comparing signed/unsigned values' lcc warning in add_chunk_as
+* Fix 'undefined reference to AO_pt_lock' if configure is using clang-16
+* Fix 'undefined reference to __atomic_load/store/cas_16' Mingw64-gcc error
+* Fix get_chunk for case of mmap area is located before AO_initial_heap
+* Fix typo in AO_HAVE_compare_and_swap_double name in atomic_ops_stack.h
+* Fix typos in comments of atomic_ops_malloc.c and atomic_ops_stack.c/h
+
+
+== [7.6.14] 2022-08-25 ==
+
+* Add note to README that AO malloc code has same license as AO stack
+* Adjust/reformat content of LICENSING.txt
+* Avoid AO_stack_t to cross CPU cache line boundary
+* Do not assume 'ordered except earlier write' for UWP/arm64
+* Do not name GCC intrinsics as C11 ones in ChangeLog and configure
+* Eliminate '-pedantic is not option that controls warnings' GCC-6.3 message
+* Ensure result of AO_test_and_set is always AO_TS_CLEAR or AO_TS_SET
+* Fix 'AO_malloc redefinition' MS VC warning caused by attributes mismatch
+* Fix 'use of undeclared SIG_BLOCK' Clang error if -std=c89 on Cygwin
+* Fix AO_compare_and_swap_full asm code for clang on sparc
+* Fix a typo in comment of AO_stack_push_explicit_aux_release
+* Fix code indentation in main() of test_stack.c
+* Refine AO_UNIPROCESSOR macro description in configure
+* Remove outdated comment about unsupported Win64 in atomic_ops_stack.h
+* Repeat black list check on CAS fail in stack_push_explicit_aux_release
+
+
+== [7.6.12] 2021-09-13 ==
+
+* Allow to generalize bool-CAS for sparc (gcc)
+* Declare argument of AO_load_next with const in atomic_ops_stack
+* Describe double_compare_and_swap operation in README_details
+* Document CAS operations better in README_details
+* Fix gcc/sunc x86 AO_compare_double_and_swap_double missing side effect
+* Fix library name in README_details
+* Fix link fail caused by missing GCC char/short atomic primitives on riscv64
+* Fix size of local variable passed to cas[x] (gcc/sparc)
+* Implement fetch-CAS for sparc (gcc)
+* Refactor gcc x86 memory constraints
+* Refine and reformat description of size prefix in README_details
+* Remove outdated notes in README_details
+* Replace x86 setz instruction by asm flag output operand (gcc)
+* Support MSYS host (configure)
+* Turn off compare_double_and_swap_double_full PIC hack for GCC 5+ (x86)
+* Update README_win32 to match Makefile.msft
+* Use GCC atomic intrinsics for s390x (clang 8.0+ and gcc 5.4+)
+* Use __alignof__ instead of sizeof in atomic variable alignment assertions
+* Workaround assertion violation in AO_load/store on m68k
+
+
+== [7.6.10] 2019-03-01 ==
+
+* Eliminate 'my_chunk_ptr-AO_initial_heap out of bounds' cppcheck warning
+* Fix 'AO_*_TS_T is not defined' compiler warnings (GCC-8)
+* Fix 'duplicate symbol' error for test_malloc/stack with static libs (OS X)
+* Workaround 'argument to function assert is always 1' cppcheck warnings
+
+
+== [7.6.8] 2018-12-11 ==
+
+* Eliminate 'casting signed to bigger unsigned int' CSA warning (test_stack)
+* Eliminate 'redundant blank line at start/end of block' CodeFactor warning
+* Fix 'Cannot implement CAS_full on this architecture' build error (nios2)
+* Fix a typo in arm_v6.h
+* Support aarch64-ilp32 (GCC) and UWP/arm64 (MS VC) targets
+* Undefine AO_ARM_HAVE_* private macros after their usage
+* Use standalone private macro to guard against AO_GCC_BARRIER redefinition
+* Workaround 'condition my_chunk_ptr is always false' cppcheck false positive
+
+
+== [7.6.6] 2018-08-07 ==
+
+* COPYING: sync with FSF's gpl-2.0.txt
+* Fix 'undefined reference to __atomic_load/store/cas_16' error (gcc-7/x64)
+* Fix a typo in the overview section of README
+* Fix comments style in configure.ac and Makefile.am
+* Update copyright information in README and some header files
+
+
+== [7.6.4] 2018-03-27 ==
+
+* Add RISC-V support
+* Convert atomic_ops_malloc.c and tests to valid C++ code
+* Eliminate 'function is never used' cppcheck warning for load_before_cas
+* Eliminate 'using argument that points at uninitialized var' cppcheck error
+* Fix 'AO_pt_lock undefined' error if cross-compiling manually (MinGW)
+* Fix public headers inclusion from clients C++ code
+* Remove gcc/nios2.h file (include gcc/generic.h directly for nios2)
+* Support MIPS rel6
+
+
+== [7.6.2] 2017-12-24 ==
+
+* Allow to alter DEFAULT/MAX_NTHREADS values in test_malloc/stack
+* Allow to select almost-non-blocking stack implementation explicitly
+* Annotate AO_malloc with 'alloc_size' and 'malloc' attributes
+* Avoid misleading 'AO_t undefined' error if wrong atomic_ops.h included
+* Define AO_TS_SET to 1 (true) if GCC atomic_test_and_set is used
+* Disable workaround in stack_pop_acquire that was needed for ancient Clang
+* Do not define AO_GCC_FORCE_HAVE_CAS for Clang 3.8+ (Aarch64)
+* Do not disallow to define double_load using built-in atomics (Aarch64)
+* Do not expose AO_GCC_FORCE_HAVE_CAS macro to client code (GCC)
+* Do not install documentation if configure --disable-docs (new option)
+* Do not produce .tar.bz2 distribution file (configure)
+* Eliminate '-pedantic is not an option that controls warnings' GCC message
+* Eliminate data race in cons() of test_malloc
+* Eliminate GCC-5 ASan global-buffer-overflow false positive for AO_stack_bl
+* Fill in allocated memory with values depending on thread id (test_malloc)
+* Fix 'bad register name %sil' assembler error (GCC-4.4/x86)
+* Fix 'unknown attribute no_sanitize' compiler warning for GCC
+* Fix AO_malloc for sizes near CHUNK_SIZE
+* Fix memory leak in test_malloc
+* Fix test failures for Clang-3.8 and older (Aarch64)
+* Fix test_stack failure if AO_PREFER_BUILTIN_ATOMICS (GCC/Aarch64)
+* Fix typo in AO_REAL_NEXT_PTR comment
+* Increase the default number of threads to 16 in test_malloc/stack
+* Mark unallocated/freed memory as inaccessible using ASan functionality
+* New macro (DONT_USE_MMAP) to support testing as if mmap() is unavailable
+* New macro to select stack implementation based on CAS-double
+* Place no_sanitize attributes in a GCC-compliant way
+* Prevent too long run of test_atomic_generalized (especially with TSan)
+* Simplify '#if' expressions in gcc/x86.h (code refactoring)
+* Test smallest allocation of large type (test_malloc)
+* Use __builtin_expect in atomic_ops_malloc
+* Use built-in atomics for load/store/CAS for Clang by default (Aarch64)
+* Use double-word atomic intrinsics for recent Clang versions (gcc/x86.h)
+* Use GCC atomic intrinsics for Hexagon (clang 3.9+)
+* Use generalized double-wide load/store if AO_PREFER_GENERALIZED (Aarch64)
+* Workaround 'unused result' code defects in atomic_ops.c, list_atomic
+* Workaround Thread Sanitizer (TSan) false positive warnings
+Also, includes 7.4.8 changes
+
+
+== [7.6.0] 2017-05-19 ==
+
+* Add *_and/or/xor* and *_[fetch_]compare_and_swap* tests to test_atomic
+* Add asm-based and/or/xor implementation for char/short/int (gcc/x86)
+* Add asm-based char/short/int CAS implementation for gcc/x86[_64]
+* Add configure '--disable-atomic-intrinsics' option
+* Add dd_acquire_read case to test_atomic
+* Add initial nios2 architecture support
+* Add Makefile target (check-nolink) to compile all source without linking
+* Add Makefile target to run all tests without test-driver
+* Add test_atomic_generalized to Makefile and Makefile.msft
+* Allow alternate CC (CROSS_CC) for AC_TRY_COMPILE (configure)
+* Always define word-wide CAS for x86 (MS VC++ 8+)
+* Avoid atomic_compare_exchange_n if no __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n
+* Avoid extra nop_full in stack_pop_acquire if atomic intrinsics used (x86)
+* Basic support of TILE-Gx and TILEPro CPUs
+* Code refactoring of int-wide primitives in gcc/x86.h
+* Define AO_TS_SET as __GCC_ATOMIC_TEST_AND_SET_TRUEVAL if applicable
+* Define CLANG/GNUC_PREREQ macros to check gcc/clang minimum version
+* Do not define print_list() unless used (tests)
+* Eliminate 'condition sizeof(long)>4 is always true' cppcheck style warning
+* Eliminate 'ISO C90 does not support long long' compiler pedantic warning
+* Eliminate 'scope of variable can be reduced' cppcheck warnings
+* Eliminate redundant lwsync 2nd call in CAS_full on fail (gcc/PowerPC)
+* Fix 'unknown attribute no_sanitize' compiler warning (clang prior to v3.8)
+* Fix 'variable new value is never used' cppcheck style warning
+* Fix missing double_compare_and_swap_dd_acquire_read
+* Fix reporting about missing and/or/xor_dd_acquire_read (test_atomic)
+* Hide AO_locks symbol
+* Implement AO_CLEAR using atomic intrinsic (GCC)
+* Implement CAS_acquire/release/full using __atomic_compare_exchange_n (gcc)
+* Implement char and/or/xor and short CAS for msftc ARM and X86[_64]
+* Implement char CAS and char/short add for msftc X86[_64] (VS 2013+)
+* Implement compiler_barrier using __atomic_signal_fence (GCC)
+* Implement int CAS/inc/dec for msftc/x86_64
+* Implement short inc/dec directly for msftc ARM and X86[_64]
+* Initial ibmc/powerpc (xlc) support
+* New configure option (--enable-werror) to treat warnings as compiler errors
+* New macro AO_PREFER_BUILTIN_ATOMICS to rely on GCC atomics fully (AArch64)
+* Refine AO_nop_write comment for ARM big.LITTLE architecture
+* Refine configure messages when checking for compiler options
+* Refine documentation about _full memory ordering suffix
+* Refine README how to build the library source from the repository
+* Relax shareability domain for dmb st in AO_nop_write (ARM/AArch64)
+* Remove redundant include windows.h from headers (msftc/x86[_64])
+* Remove spaces at EOLn in asm code
+* Report gcc/clang pedantic warnings (configure)
+* Support NaCl/arm
+* Suppress 'ISO C does not support __int128 type' GCC/Clang pedantic warning
+* Test store/CAS emulation explicitly
+* Update shared libraries version info to 2:0:1
+* Use GCC atomic intrinsics for PowerPC 32/64 (GCC 4.8+ and clang 3.8+)
+* Use GCC atomic intrinsics for x86, x64, ARM, MIPS (gcc 4.9+, clang 3.5+)
+* Use generalized double-wide load/store if AO_PREFER_GENERALIZED (gcc/x86)
+* Workaround '#error' cppcheck error messages
+* Workaround 'condition always true', 'unused stored value' cppcheck warnings
+* Workaround 'function is never used' cppcheck style warnings
+* Workaround 'obsolescent ftime called' cppcheck style warning (POSIX)
+* Workaround 'overflow in pointer subtraction' cppcheck warning
+* Workaround 'shifting 32-bit value by 32 bits undefined' cppcheck warning
+* Workaround 'uninitialized memory use' code analyzer false warning (tests)
+* Workaround 'uninitialized variable' cppcheck error in hpc/hppa.h
+* Workaround 'value of macro is unknown' cppcheck information messages
+* Workaround a bug in double-wide intrinsics of Clang/x64 with ASan enabled
+* Workaround MSan warning about uninitialized data read by generalized store
+Also, includes 7.4.6 changes
+
+
+== [7.4.20] 2023-12-15 ==
+
+* Eliminate 'comparing signed/unsigned values' lcc warning in add_chunk_as
+* Fix get_chunk for case of mmap area is located before AO_initial_heap
+* Fix typo in AO_HAVE_compare_and_swap_double name in atomic_ops_stack.h
+* Fix typos in comments of atomic_ops_malloc.c and atomic_ops_stack.c/h
+
+
+== [7.4.18] 2022-08-25 ==
+
+* Avoid AO_stack_t to cross CPU cache line boundary
+* Do not assume 'ordered except earlier write' for UWP/arm64
+* Ensure result of AO_test_and_set is always AO_TS_CLEAR or AO_TS_SET
+* Fix 'use of undeclared SIG_BLOCK' Clang error if -std=c89 on Cygwin
+* Fix a typo in comment of AO_stack_push_explicit_aux_release
+* Fix code indentation in main of test_stack.c
+* Remove outdated comment about unsupported Win64 in atomic_ops_stack.h
+* Repeat black list check on CAS fail in stack_push_explicit_aux_release
+
+
+== [7.4.16] 2021-09-13 ==
+
+* Fix gcc/sunc x86 AO_compare_double_and_swap_double missing side effect
+* Fix library name in README_details
+* Fix size of local variable passed to cas[x] (gcc/sparc)
+* Workaround assertion violation in AO_load/store on m68k
+
+
+== [7.4.14] 2019-03-01 ==
+
+* Fix 'AO_*_TS_T is not defined' compiler warnings (GCC-8)
+
+
+== [7.4.12] 2018-12-11 ==
+
+* COPYING: sync with FSF's gpl-2.0.txt
+* Fix a typo in arm_v6.h
+* Fix a typo in the overview section of README
+* Support ILP32 in AArch64 assembly routines (GCC)
+* Support UWP/arm64 target
+
+
+== [7.4.10] 2017-12-22 ==
+
+* Fix AO_malloc for sizes near CHUNK_SIZE
+* Fix memory leak in test_malloc
+* Fix typo in AO_REAL_NEXT_PTR comment
+
+
+== [7.4.8] 2017-10-18 ==
+
+* Fix 'missing select.h', 'undefined sigprocmask' compiler errors (Hexagon)
+* Update README about bugs reporting and new releases notification
+* Workaround misspelling in GCC to detect ARMv6KZ platform
+
+
+== [7.4.6] 2017-05-18 ==
+
+* Add assertion that double-wide CAS target is aligned (msftc/x86[_64])
+* Add configure --enable-gcov option (enable code coverage analysis)
+* Code refactoring of gcc/powerpc.h to avoid code duplication
+* Eliminate 'cast to long from void*' compiler warning in test_atomic
+* Eliminate 'implicit declaration of close' warning in 'strict ANSI' mode
+* Eliminate 'missing braces around initializer' gcc warning (hppa)
+* Eliminate 'printf format specifies type void*' GCC pedantic warnings
+* Eliminate 'value shift followed by expansion' false code defect warning
+* Enable limited testing in Makefile.msft without Cygwin
+* Fix (delete) comment for AO_and_full (x86)
+* Fix block_all_signals compilation in 'strict ANSI' mode
+* Fix missing .exe for test filenames in Makefile (MinGW)
+* Fix missing printed value names (test_stack)
+* Implement fetch-CAS for s390[x] (gcc)
+* Move libraries version info to the beginning of Makefile.am
+* Refine documentation in Makefile.msft how to run all tests (MS VC)
+* Refine README about library downloading
+* Rename doc/README.txt to doc/README_details.txt
+* Support AIX/ppc (gcc)
+* Support CFLAGS_EXTRA to pass extra user-defined compiler flags (make)
+* Support n32 ABI for mips64
+* Update shared libraries version info for 7.4.6+ (to 1:4:0)
+* Use 'inline code' format for commands in README.md
+* Use LLD and SCD instructions on mips64
+* Workaround 'resource leak' false positives in AO_malloc, add_elements
+* Workaround 'uninitialized memory use' MemorySanitizer warning (test_atomic)
+Also, includes 7.2h changes
+
+
+== [7.4.4] 2016-05-24 ==
+
+* Eliminate 'signed-to-unsigned value extension' compiler warning in malloc
+* Eliminate 'variable set but not used' Cppcheck warnings in test_stack
+* Fix GCC 5.x compatibility for AArch64 double-wide primitives
+* Fix makefile preventing AO_pause undefined in libatomic_ops_gpl
+* Fix missing casts to match printf format specifier in test_atomic
+* Fix missing output folder on making auto-generated test files (Automake)
+* Fix typo in configure.ac (in description of AO_ASM_X64_AVAILABLE)
+* Minor fix of code alignment in mips AO_compare_and_swap
+* Remove TODO file
+* Restore contribution info in ChangeLog for authors not listed in git log
+Also, includes 7.2g changes
+
+
+== [7.4.2] 2014-05-02 ==
+
+* Fix a typo in doc/README.txt (remove redundant "an" article)
+* Update emails/links due to project site transition
+Also, includes 7.2f changes
+
+
+== [7.4.0] 2013-11-17 ==
+
+* Add and/or/xor entries to list_atomic (tests)
+* Add char/short/int/AO_double_t and dd_acquire cases to list_atomic (tests)
+* Add compile-time assertion for size of 'standard' AO_double_t
+* Add double_store pthread-based implementation and tests
+* Add generalized CAS primitives of char/short/int size
+* Add generalized atomic and/or/xor operations for char/short/int types
+* Add generalized fetch_and_add_acquire/release (for ARMv6+)
+* Add generic implementation of double_load primitives
+* Add information about AO_ASSUME_VISTA to README_win32
+* Add internal header containing only char/short/int/AO_t atomic loads
+* Add load/store primitives generalization based on CAS
+* Add lock-based implementation of char/short/int_fetch_compare_and_swap
+* Add makefile rule to test list_atomic.template syntax (tests)
+* Add missing 'const' in aligned-atomic XSIZE_load implementation
+* Add missing double_compare_and_swap to generalization
+* Add missing generalization of no-barrier CAS in template
+* Add negative double-CAS test cases to test_atomic_include (tests)
+* Add test_stack to Makefile.msft (tests)
+* Adjust fprintf arguments type matching specifier in test_stack (tests)
+* Adjust included filenames in atomic_ops_malloc and test_stack
+* Adjust quotes in echo command of Makefile.msft (Win32)
+* Always use 'mfence' for nop_full if target CPU supports SSE2 (gcc/x86)
+* Better document configure THREADDLLIBS variable
+* Cast away volatile on dereference in CAS-based generalization primitives
+* Change policy regarding version numbers ("micro" part instead of "alpha")
+* Convert README to Markdown format
+* Define AO_NO_PTHREADS in configure if no pthreads (Win32 and VxWorks)
+* Define AO_int_X operations for ARM and avr32
+* Define double-wide ordered loads/stores for x86
+* Define int_and/or/xor primitives in ao_t_is_int header
+* Define nop_full as compiler barrier for pre-ARMv6 single-core case
+* Do not duplicate BUILT_SOURCES entries in nobase_private_HEADERS (Makefile)
+* Do not include standard_ao_double_t.h where double-CAS is unimplemented
+* Do not report absence of meaningless nop, load and store in test_atomic
+* Do not use deprecated AO_T and AO_TS_T (tests)
+* Eliminate 'missing initializer' warning for AO_stack_t value initializer
+* Eliminate 64-bit compiler warnings in atomic_ops_malloc
+* Eliminate arithmetic shifts in double-CAS (gcc/arm, msftc/x86)
+* Eliminate warning for fetch_and_add argument in test_atomic_include (tests)
+* Enable Makefile.msft for Win64
+* Enable build using toolchain without pthreads
+* Enable double_compare_and_swap for non-cpp code (msftc/x86.h)
+* Enable generalization of all variants of CAS via fetch_compare_and_swap
+* Enable test_stack for pthreads-w32 and Win32 with native threads
+* Fix generalized AO_char/short_compare_and_swap args (missing 'unsigned')
+* Fix makefile sed rule for list_atomic (tests)
+* Fix missing abort() usage in atomic_ops_malloc and tests on WinCE
+* Generalize compare_double_and_swap_double using double_compare_and_swap
+* Generalize double_load/store for x86_64 (GCC)
+* Generate ao_t_is_int, 'loadstore' headers from templates
+* Generate generalized AO_t load/store/fetch_and_add primitives from template
+* Generate ordered_loads/stores_only headers from templates
+* Group all X_acquire_release_volatile.h and X_[aligned_]atomic_load_store.h
+* Implement and/or/xor, AO_double_load for ARM
+* Implement atomic store using direct write by default on ARMv6+
+* Implement char/short/int-wide primitives using GCC built-in atomic/sync
+* Implement char/short/int_fetch_and_add for msftc/x86[_64] (Win32)
+* Implement char/short_fetch_and_add, char/short_load for ARMv6+ (GCC)
+* Implement char/short_store primitives at aligned addresses for ARM
+* Implement compare_double_and_swap_double for SunCC/x86
+* Implement double_load/store based on guaranteed x86 access atomicity
+* Implement double_store for ARMv7 using LDREXD/STREXD
+* Implement load/store via simple LDR/STR for ARMv6+ (msftc)
+* Implement nop_full/write using 'dmb' instruction if available (gcc/arm)
+* Improve debug printing in test_stack (tests)
+* Log messages to stdout instead of stderr (tests)
+* Make AO_ASSUME_VISTA also enables Win98 code in msftc/x86.h (Win32)
+* Minimize gcc/generic-arithm template by factoring out barriers
+* Move 'unsigned' keyword to XCTYPE in generalize-small template
+* Move default compiler options to CFLAGS in Makefile.msft (Win32)
+* Move definitions of ordered loads/stores to inner separate headers
+* Move gcc-generic AO_t-wide primitives to generic-small/arithm headers
+* Move generalized arithmetical primitives to 'generalize-arithm' template
+* Optimize AO_spin manually to minimize compiler influence on its duration
+* Parameterize list_atomic template with XSIZE (tests)
+* Perform only few list reversals in test_malloc if AO based on pthreads
+* Put autogen.sh to 'dist' package (Automake)
+* Remote duplicate definition of test_and_set_acquire in generalize.h
+* Remove X_aligned_atomic_load_store headers and template
+* Remove duplicate AO_spin and AO_pause definition in atomic_ops_stack
+* Remove gcc/x86_64.h eliminating code duplication of gcc/x86.h
+* Remove nested AO_USE_PTHREAD_DEFS macro check in atomic_ops.h (gcc/arm)
+* Remove redundant 'cc' clobber for LDREXD instruction (gcc/arm)
+* Remove store_full from msftc/arm.h in favor of generalized primitive
+* Remove sunc/x86_64.h eliminating code duplication of sunc/x86.h
+* Remove unsafe emulation-based implementation of double CAS (SunCC/x86_64)
+* Remove useless 'perror' call in run_parallel.h (tests)
+* Reorder AO_double_t union elements for AO_DOUBLE_T_INITIALIZER portability
+* Replace atomic_load_store.template with atomic_load and atomic_store ones
+* Replace some FIXME items with TODO in atomic_ops.c and sysdeps headers
+* Specify fetch_and_add/sub1 result as unused in test_atomic (tests)
+* Support AArch64 (64-bit ARM) target (GCC)
+* Support ARMv8 target (gcc/arm)
+* Test double_compare_and_swap in test_atomic (tests)
+* Use AO_ prefix for internal functions in arm_v6.h, hppa.h
+* Use __atomic GCC built-in to implement generic double-wide CAS
+* Use built-in __sync CAS for double-CAS if AO_USE_SYNC_CAS_BUILTIN for x86
+* Workaround GCC 4.4.3 warning reported for 'val' of list_atomic.c (tests)
+Also, includes 7.2e changes
+
+
+== [7.3alpha2] 2012-05-11 ==
+
+* Add '-no-undefined' to LDFLAGS in src/Makefile.am
+* Add AO_and, AO_xor atomic operations
+* Add AO_fetch_compare_and_swap primitives
+* Add and fill in AUTHORS, TODO files
+* Add autogen.sh file
+* Adjust AO_..._H macros in public headers
+* Code refactoring of gcc/arm.h by introducing AO_ARM_HAVE_x macros
+* Define AO macros for libatomic_ops version identification
+* Do not define NDEBUG if '--enable-assertions' passed to configure
+* Eliminate compiler warnings in various functions and macros
+* Generalize AO_compare_and_swap primitives via AO_fetch_compare_and_swap
+* Generalize acquire/release/full CAS primitives for MIPS
+* Implement fetch_and_add, test_and_set primitives for MIPS
+* Improve Makefile for MS VC++; pass '-W3' option to MS compiler
+* Include ao_t_is_int.h from atomic_ops.h after first generalization pass
+* Merge all Makefile.am files in src tree
+* Minor code refactoring of atomic_ops.c, generic_pthread.h
+* Minor configure build improvements (e.g., ensure proper autoconf version)
+* Place only major per-release changes description to ChangeLog (this file)
+* Recognize AO_PREFER_GENERALIZED macro to favor generalization over assembly
+* Remove all auto-generated files except for generalize-small.h from the repo
+* Remove duplicate doc/COPYING and empty NEWS files
+* Replace atomic_ops_malloc static mmap-related empty functions with macros
+* Replace pointer relational comparisons with non-pointer ones
+* Require autoconf 2.61 instead of v2.64
+* Show extra compiler warnings (GCC only)
+* Turn off AO primitives inlining if AO_NO_INLINE defined
+* Use __builtin_expect in CAS failure loop condition checks (GCC only)
+Also, includes 7.2 changes
+
+
+== [7.2l] 2023-12-15 ==
+
+* Fix get_chunk for case of mmap area is located before AO_initial_heap
+* Fix typo in AO_HAVE_compare_and_swap_double name in atomic_ops_stack.h
+* Fix typos in comments of atomic_ops_malloc.c and atomic_ops_stack.c/h
+
+
+== [7.2k] 2022-08-24 ==
+
+* Avoid AO_stack_t to cross CPU cache line boundary
+* Fix a typo in comment of AO_stack_push_explicit_aux_release
+* Fix code indentation in main of test_stack.c
+* Remove outdated comment about unsupported Win64 in atomic_ops_stack.h
+* Repeat black list check on CAS fail in stack_push_explicit_aux_release
+
+
+== [7.2j] 2021-09-12 ==
+
+* Fix a typo in arm_v6.h
+* Fix asm constraints of primitives in sunc/x86_64.h
+* Fix gcc/sunc x86 AO_compare_double_and_swap_double missing side effect
+* Fix library name in README details
+* Fix size of local variable passed to cas[x] (gcc/sparc)
+* Workaround assertion violation in AO_load/store on m68k
+
+
+== [7.2i] 2017-12-21 ==
+
+* Fix 'missing select.h', 'undefined sigprocmask' compiler errors (Hexagon)
+* Fix AO_malloc for sizes near CHUNK_SIZE
+* Fix typo in AO_REAL_NEXT_PTR comment
+
+
+== [7.2h] 2017-05-17 ==
+
+* Add 'clean' target to Makefile.msft
+* Enable Makefile.msft for Win64
+* Exclude 'check' from nmake all (Makefile.msft)
+* Fix 'Cannot implement CAS_full on this architecture' build error (cris)
+* Fix 'doc' files installation folder
+* Fix (improve) AO_REQUIRE_CAS description in README
+* Fix AO_SIZE_MAX definition (Linux/musl-gcc)
+* Fix assertions style in test_atomic_include
+* Fix size value wrap around in AO_malloc_large
+* Fix test_atomic failure caused unaligned AO_double_t access (x86)
+* Fix type of general AO_TS_INITIALIZER
+* Fix typo in comments in gcc/arm.h
+* Fix typos in 'error' pragma messages
+* Workaround test_stack failure on AIX/ppc
+
+
+== [7.2g] 2016-05-23 ==
+
+* Add disclaimer to README to favor C11/C++14 atomics over libatomic_ops use
+* Regenerate configure files using official libtool release (v2.4.2)
+* Remove inclusion of acquire_release_volatile.h on MIPS
+* Remove obsolete information from README about C++0x standard future
+* Update links due to project site transition
+
+
+== [7.2f] 2014-05-02 ==
+
+* Fix a typo in doc/README.txt (remove redundant "an" article)
+* Regenerate configure files by new automake (v1.14.1), libtool (v2.4.2.418)
+
+
+== [7.2e] 2013-11-10 ==
+
+* Fix (remove) invalid include of read_ordered.h for ARM
+* Fix AM_CONFIG_HEADER in configure for autoconf-2.69-1
+* Fix AO_pause sleep delay for particular argument values (Win32)
+* Fix ARMv7 LDREXD/STREXD double-wide operand specification (GCC/Clang)
+* Fix LDREXD/STREXD use for pre-Clang3.3/arm
+* Fix README regarding _acquire_read barrier
+* Fix XSIZE_load/store definition order in generalize-small template
+* Fix asm constraint of CAS memory operand for gcc/alpha, clang-3.1/mips
+* Fix asm constraints of primitives in sunc/x86.h
+* Fix cmpxchg16b-based compare_double_and_swap_double for SunCC/x86_64
+* Fix compare_double_and_swap_double and double_ptr_storage for gcc/x32
+* Fix compare_double_and_swap_double for clang3.0/x86 in PIC mode
+* Fix compare_double_and_swap_double_full definition condition in emul_cas
+* Fix generalize-small template adding missed CAS-based fetch_and_add
+* Fix generalized fetch_and_add function
+* Fix missing compiler barrier in nop_full for uniprocessor ARM
+* Fix ordered_except_wr header inclusion for s390
+* Fix return type of AO_int_X primitives defined in ao_t_is_int header
+* Fix return type of char/short/int_load_read() in read_ordered.h
+* Fix template-based headers regeneration order in src/Makefile
+* Fix typos in ao_t_is_int, atomic_ops.h, generalize.h, msftc/arm.h comments
+* Fix variable type to match printf format specifier in test_stack
+* Fix visibility and initial value of 'dummy' variable in atomic_ops_stack
+* Terminate tests with abort after error reported
+
+
+== [7.2d] 2012-08-09 ==
+
+* Fix AO_compare_double_and_swap_double_full for gcc-4.2.1/x86 in PIC mode
+* Fix AO_compiler_barrier missing parentheses
+* Fix missing 'unsigned' for generalized AO_char/short_fetch_and_add result
+
+
+== [7.2] 2012-05-11 ==
+
+* Add atomic_ops.pc.in and atomic_ops-uninstalled.pc.in to pkgconfig folder
+* Define and use AO_PTRDIFF_T in tests for casts between pointer and integer
+* Fix AO_compare_and_swap return type for s390 and PowerPC
+* Fix AO_compare_double_and_swap_double_full for gcc/x86 (PIC mode)
+* Fix AO_stack_push_release to workaround bug in clang-1.1/x86 compiler
+* Fix AO_test_and_setXX in tests/list_atomic.template
+* Fix AO_test_and_set_full (gcc/x86[_64].h) to work-around a bug in LLVM v2.7
+* Fix AO_test_and_set_full on m68k
+* Fix __ARM_ARCH_5__ macro handling for Android NDK (ARMv7)
+* Fix configure for Cygwin, mingw-w64/32
+* Fix configure to define __PIC__ macro explicitly if needed (GCC)
+* Fix double_ptr_storage definition for GCC pre-v4 (x86_64)
+* Fix for x32 by removing 'q' suffix in x86-64 instructions
+* Fix generalization for IA-64 (regarding AO_or, AO_..._read/write primitives)
+* Fix generalized AO_<type>_fetch_and_add() return type
+* Fix test_atomic_include for the case of missing CAS primitive
+* Fix test_malloc - allocate less memory in case of missing mmap
+* Implement the basic atomic primitives for the hexagon CPU
+
+
+== [7.2alpha6] 2011-06-14 ==
+
+* Add missing AO_HAVE_ macros
+* Add support of avr32 CPU
+* Better support of various models of ARM
+* Disable AO_compare_double_and_swap_double_full for SunCC x86 as not working
+* Enable ARM Thumb-2 mode
+* Fix AO_test_and_set_full for SunCC (x86)
+* Fix bugs in tests
+* Fix clobbers in AO_compare_and_swap_full (x86.h)
+* Fix typos in identifiers and comments
+* Improve AO_sync for PowerPC
+* Improve make scripts (configure.ac)
+* Make get_mmaped() in atomic_ops_malloc.c more portable
+* Support Intel compiler
+* Support NaCl target
+* Suppress compiler warnings in various places
+* Test more predefined macros (ARM, PowerPC)
+* Use assembly code only for MS VC if available (x86_64)
+* Use built-in __sync_bool_compare_and_swap if available (x86_64)
+* Workaround bugs in LLVM GCC and SunCC regarding XCHG (x86, x86_64)
+
+
+== [7.2alpha4] 2009-12-02 ==
+
+* Fix typos in comments, identifiers and documentation
+* Implement AO_compare_and_swap_full for SPARC
+* Refine ARM-specific code
+* Refine code and comments for MS VC
+* Regenerate make scripts
+* Share common code for all 32-bit CPUs (MS VC)
+* Support DigitalMars and Watcom compilers
+* Support MS VC for ARM (WinCE)
+* Support SH CPU
+* Support win32-pthreads
+* Support x86 and x86_64 for SunCC compiler
+
+
+== [7.2alpha2] 2009-05-27 ==
+
+* Add MIPS support
+* Add better support for m68k
+* Add "const" to first parameter of load calls
+* Add parentheses around address argument for various macros
+* Add some platform-specific documentation to INSTALL
+* Add untested 64-bit support for PowerPC
+* Fix AO_compare_and_swap_double_acquire
+* Fix AO_int_fetch_and_add_full (x86_64)
+* Fix comments
+* Fix s390 include paths
+* Fix use of lwz instruction (PowerPC)
+* Refine clobbers (PowerPC)
+* Remove outdated info about Windows support in README
+* Replace K&R-style function definition with ANSI C one
+* add AO_compare_double_and_swap_double for ARMv6
+* gcc/powerpc.h: Consider __NO_LWSYNC__
+
+
+== [7.1] 2008-02-11 ==
+
+* Add test_and_set, AO_double_compare_and_swap generalizations
+* Conditionally add compare_double_and_swap_double (x86)
+* Conditionally add compare_double_and_swap_double (x86)
+* Fix AO_compare_double_and_swap_double_full (x86) for PIC mode
+* Fix AO_load_acquire for PowerPC
+* Fix double-width CAS (x86)
+* Refine README (add more warnings about data dependencies)
+* Refine double_ptr_storage type definition
+* Support ARMv6+ in GCC
+* Support ArmCC compiler
+* Use _InterlockedExchangeAdd for MS VC (x86)
+
+
+== [7.0] 2007-06-28 ==
+
+* Add 64-bit version of AO_load_acquire for PowerPC (by Luca Barbato)
+* Add support of x86 and x86_64 for MS VC
+* Do not assume that "mfence" is always present (x86.h)
+* Fix ARM AO_test_and_set_full
+* Include windows.h (MS VC)
+* Update README to reflect C++0x effort
+
+
+== [1.2] 2006-07-11 ==
+
+* Add prototypes to suppress compiler warnings
+* Add simple VxWorks support
+* Fix InterlockedCompareExchange proto usage
+* Fix typos (ia64)
+* Include all_acquire_release_volatile.h and all_atomic_load_store.h (ia64)
+* Initial support for 64-bit targets
+* Use "=q" for AO_test_and_set_full (x86)
+* Use inline assembler to generate "mfence" and byte sized XCHG
+* Use new intrinsics available in MSVC 2003 and MSVC 2005
+
+
+== [1.1] 2005-09-27 ==
+
+* Add and use read_ordered.h
+* Change function naming from "byte" to "char"
+* Fix AO_test_and_set for ARM; define AO_CAN_EMUL_CAS
+
+
+== [1.0] 2005-03-21 ==
+
+* Add atomic_ops primitives for different sized data
+* Add compare_double_and_swap_double and compare_and_swap_double
+* Add gcc/cris.h (originally comes from Hans-Peter Nilsson)
+* Add gcc/m68k.h (contributed by Tony Mantler)
+* Add gcc/powerpc.h (with help of Maged Michael, Doug Lea, Roger Hoover)
+* Add initial support for atomic_ops for VC++/Windows/X86 and HP/UX
+* Add minimal support for the Sun SPARC compiler
+* Add support for platforms that require out-of-line assembly code
+* Add support of int-wide operations on platforms with int-sized pointers
+* Added libatomic_ops_gpl library with support for lock-free stack and malloc
+* Change atomic_ops include file structure
+* Change most platforms to use byte-wide test-and-set locations
+* Define AO_CLEAR, __ldcw[_align] macros in gcc/hppa.h (by Carlos O'Donell)
+* Fix various bugs
+* Install under "atomic_ops" instead of "ao"
+* Remove compiler_barrier workaround for gcc 3.4+
+* Renamed various types to end in _t
+* Replace AO_HAVE_NOP_FULL with AO_HAVE_nop_full (by Ranko Zivojnovic)
+* Use autoconf, automake
diff --git a/graphics/asymptote/libatomic_ops/Config.cmake.in b/graphics/asymptote/libatomic_ops/Config.cmake.in
new file mode 100644
index 0000000000..034b456cea
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/Config.cmake.in
@@ -0,0 +1,5 @@
+# The Atomic_ops CMake configuration file.
+
+@PACKAGE_INIT@
+include("${CMAKE_CURRENT_LIST_DIR}/Atomic_opsTargets.cmake")
+check_required_components(libatomic_ops)
diff --git a/graphics/asymptote/libatomic_ops/LICENSE b/graphics/asymptote/libatomic_ops/LICENSE
new file mode 100644
index 0000000000..aff4d002db
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/LICENSE
@@ -0,0 +1,76 @@
+MIT License (core library) / GPL-2.0 (gpl extension library)
+
+Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+Copyright (c) 1999-2011 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2005, 2007 Thiemo Seufer
+Copyright (c) 2007 by NEC LE-IT. All rights reserved.
+Copyright (c) 2008-2022 Ivan Maidanski
+Copyright (c) 2009 Bradley Smith
+Copyright (c) 2009 by Takashi Yoshii. All rights reserved.
+
+
+Our intent is to make it easy to use libatomic_ops, in both free and
+proprietary software. Hence most of code (core library) that we expect to
+be linked into a client application is covered by a MIT or MIT-style license.
+
+However, a few library routines (the gpl extension library) are covered by
+the GNU General Public License. These are put into a separate library,
+libatomic_ops_gpl.a file.
+
+Most of the test code is covered by the GNU General Public License too.
+
+
+The low-level (core) part of the library (libatomic_ops.a) is mostly covered
+by the MIT license:
+
+----------------------------------------
+
+Copyright (c) ...
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--------------------------------
+
+
+Some files in the atomic_ops/sysdeps directory (part of core library) were
+inherited in part from the Boehm-Demers-Weiser conservative garbage collector,
+and are covered by its license, which is similar in spirit to MIT license:
+
+--------------------------------
+
+Copyright (c) ...
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program
+for any purpose, provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is granted,
+provided the above notices are retained, and a notice that the code was
+modified is included with the above copyright notice.
+
+----------------------------------
+
+
+A few files are covered by the GNU General Public License. (See file
+"COPYING".) This applies only to the test code and the atomic_ops_gpl
+portion of the library. Thus, atomic_ops_gpl should generally not be
+linked into proprietary code. (This distinction was motivated by patent
+considerations.)
diff --git a/graphics/asymptote/libatomic_ops/Makefile.am b/graphics/asymptote/libatomic_ops/Makefile.am
new file mode 100644
index 0000000000..fbb40231fb
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/Makefile.am
@@ -0,0 +1,29 @@
+SUBDIRS = src tests
+
+ACLOCAL_AMFLAGS = -I m4
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = pkgconfig/atomic_ops.pc
+noinst_DATA = pkgconfig/atomic_ops-uninstalled.pc
+
+# Installed documentation.
+if ENABLE_DOCS
+dist_doc_DATA = AUTHORS ChangeLog LICENSE README.md README_details.txt \
+ README_win32.txt
+if ENABLE_GPL
+dist_doc_DATA += COPYING README_malloc.txt README_stack.txt
+endif
+endif
+
+EXTRA_DIST = autogen.sh CMakeLists.txt Config.cmake.in
+
+## TODO: After migration to autoconf-1.13+, remove check-nolink definition
+## from this Makefile.am and add AM_EXTRA_RECURSIVE_TARGETS([check-nolink])
+## back to configure.ac file.
+.PHONY: check-nolink check-nolink-local
+check-nolink: check-nolink-local
+ $(MAKE) --directory tests $(AM_MAKEFLAGS) check-nolink-local
+
+check-nolink-local: all
+
+#distclean-local:
diff --git a/graphics/asymptote/libatomic_ops/README.md b/graphics/asymptote/libatomic_ops/README.md
new file mode 100644
index 0000000000..1e96a70bc2
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/README.md
@@ -0,0 +1,130 @@
+# The atomic_ops library (`libatomic_ops`)
+
+IN NEW CODE, PLEASE USE C11 OR C++14 STANDARD ATOMICS INSTEAD OF THE CORE
+LIBRARY IN THIS PACKAGE.
+
+This is version 7.8.2 of libatomic_ops.
+
+License: [MIT](LICENSE) for core library / [GPL-2.0](COPYING) for gpl
+extension.
+
+
+## Download
+
+You might find a more recent/stable version on the
+[Download](https://github.com/ivmai/libatomic_ops/wiki/Download) page, or
+[BDWGC site](http://www.hboehm.info/gc/).
+
+Also, the latest bug fixes and new features are available in the
+[development repository](https://github.com/ivmai/libatomic_ops).
+
+
+## Overview
+
+This package provides semi-portable access to hardware-provided
+atomic memory update operations on a number of architectures. These might
+allow you to write code:
+
+* That does more interesting things in signal handlers.
+
+* Makes more effective use of multiprocessors by allowing you to write
+ clever lock-free code. Note that such code is very difficult to get
+ right, and will unavoidably be less portable than lock-based code. It
+ is also not always faster than lock-based code. But it may occasionally
+ be a large performance win.
+
+* To experiment with new and much better thread programming paradigms, etc.
+
+Please see other README files for the details:
+
+* [README_details.txt](README_details.txt) - details about atomic_ops.h
+
+* [README_malloc.txt](README_malloc.txt) - a simple almost-lock-free malloc
+ implementation (part of libatomic_ops_gpl)
+
+* [README_stack.txt](README_stack.txt) - an almost lock-free LIFO linked
+ lists (stack) implementation (part of libatomic_ops_gpl)
+
+
+## Installation and Usage
+
+The configuration and build scripts for this package were generated by
+Automake/Autoconf. `./configure; make; sudo make install` in this
+directory should work. For a more customized build, see the output of
+`./configure --help`. To build it from the development repository,
+`./autogen.sh` should be executed first.
+
+Alternatively, CMake could be use to build this package, e.g.
+`cmake . && cmake --build .` in this directory should work.
+
+Note that much of the content of this library is in the header files.
+However, two small libraries are built and installed:
+
+* `libatomic_ops.a` is a support (core) library, which is not needed on some
+ platforms. This is intended to be usable, under some mild restrictions,
+ in free or proprietary code, as are all the header files.
+ See [LICENSE](LICENSE) for more details about the licensing.
+
+* `libatomic_ops_gpl.a` is a so called gpl extension library containing some
+ higher level facilities. This code is covered by the GPL. The contents
+ correspond to the headers `atomic_ops_malloc.h` and `atomic_ops_stack.h`.
+ Not built and not installed if `--disable-gpl` option is passed to
+ `configure` (or if `-Denable_gpl=OFF` option is passed to `cmake` if the
+ latter is used to build the package). The licensing details are given in
+ [COPYING](COPYING) and [LICENSE](LICENSE) files.
+
+
+## Platform Specific Notes
+
+Win32/64: src/Makefile.msft contains a very simple Makefile for building
+and running tests and building the gpl library. The core `libatomic_ops`
+implementation is entirely in header files (libatomic_ops.lib is built anyway
+to match that of the configure-based build process, but libatomic_ops.lib has
+only the implementation of the internal AO_pause() used by the gpl library).
+More information is provided in [README_win32.txt](README_win32.txt) file.
+
+HP-UX/PA-RISC: `aCC -Ae` won't work as a C compiler, since it doesn't support
+inline assembly code. Use cc.
+
+
+## Feedback, Contribution, Questions and Notifications
+
+Please address bug reports and new feature ideas to
+[GitHub issues](https://github.com/ivmai/libatomic_ops/issues). Before the
+submission please check that it has not been done yet by someone else.
+
+If you want to contribute, submit
+a [pull request](https://github.com/ivmai/libatomic_ops/pulls) to GitHub.
+
+If you need help, use
+[Stack Overflow](https://stackoverflow.com/questions/tagged/atomic-ops).
+Older questions on the site can be found by
+[this query](https://stackoverflow.com/search?q=atomic_ops).
+Older technical discussions are also available in `bdwgc` mailing list
+archive - it can be downloaded as a
+[compressed file](https://github.com/ivmai/bdwgc/files/1038163/bdwgc-mailing-list-archive-2017_04.tar.gz)
+or browsed at [Narkive](http://bdwgc.opendylan.narkive.com) (please search
+for _atomic_ keyword).
+
+To get new release announcements, subscribe to
+[RSS feed](https://github.com/ivmai/libatomic_ops/releases.atom).
+(To receive the notifications by email, a 3rd-party free service like
+[IFTTT RSS Feed](https://ifttt.com/feed) can be setup.)
+To be notified on all issues, please
+[watch](https://github.com/ivmai/libatomic_ops/watchers) the project on
+GitHub.
+
+
+## Copyright & Warranty, Contributors
+
+Please be aware of the dual nature of the license of libatomic_ops:
+
+* the core part (implementing semi-portable access to hardware-provided
+ atomic memory operations) is released under MIT license
+
+* the gpl extension (almost lock-free malloc and stack implementations) and
+ the tests are released under GPL-2.0 license
+
+The exact licensing information is provided in [LICENSE](LICENSE) file.
+
+The library contributors are listed in [AUTHORS](AUTHORS) file.
diff --git a/graphics/asymptote/libatomic_ops/README_details.txt b/graphics/asymptote/libatomic_ops/README_details.txt
new file mode 100644
index 0000000000..43f2531e80
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/README_details.txt
@@ -0,0 +1,254 @@
+Usage:
+
+0) If possible, do this on a multiprocessor, especially if you are planning
+on modifying or enhancing the package. It will work on a uniprocessor,
+but the tests are much more likely to pass in the presence of serious problems.
+
+1) Type ./configure --prefix=<install dir>; make; make check
+in the directory containing unpacked source. The usual GNU build machinery
+is used, except that only static, but position-independent, libraries
+are normally built. On Windows, follow README_win32.txt to use
+src/Makefile.msft instead of the above sequence.
+
+Alternatively, the libraries could be built with CMake, even for Windows,
+like this:
+> mkdir out
+> cd out
+> cmake -Dbuild_tests=ON ..
+> cmake --build . --config Release
+> ctest --build-config Release
+
+The available options in the CMake script to customize the build is roughly
+the same as those in the configure one, please see the exact option list in
+CMakeLists.txt file.
+
+2) Applications should include atomic_ops.h. Nearly all operations
+are implemented by header files included from it. It is sometimes
+necessary, and always recommended to also link against libatomic_ops.a.
+To use the almost non-blocking stack or malloc implementations,
+see the corresponding README files, and also link against libatomic_ops_gpl.a
+before linking against libatomic_ops.a.
+
+OVERVIEW:
+Atomic_ops.h defines a large collection of operations, each one of which is
+a combination of an (optional) atomic memory operation, and a memory barrier.
+Also defines associated feature-test macros to determine whether a particular
+operation is available on the current target hardware (either directly or
+by synthesis). This is an attempt to replace various existing files with
+similar goals, since they usually do not handle differences in memory
+barrier styles with sufficient generality.
+
+If this is included after defining AO_REQUIRE_CAS, then the package makes
+an attempt to emulate [fetch_]compare_and_swap* (single-width) in a way that,
+at least on Linux, should still be async-signal-safe. As a result, most
+other atomic operations may then be defined using the compare-and-swap
+emulation. This emulation is slow, since it needs to disable signals.
+And it needs to block in case of contention. If you care about performance
+on a platform that can't directly provide compare-and-swap, there are
+probably better alternatives. But this allows easy ports to some such
+platforms (e.g. PA_RISC). The option is ignored if compare-and-swap
+can be implemented directly.
+
+If atomic_ops.h is included after defining AO_USE_PTHREAD_DEFS, then all
+atomic operations will be emulated with pthread locking. This is NOT
+async-signal-safe. And it is slow. It is intended primarily for debugging
+of the atomic_ops package itself.
+
+Note that the implementation reflects our understanding of real processor
+behavior. This occasionally diverges from the documented behavior. (E.g.
+the documented X86 behavior seems to be weak enough that it is impractical
+to use. Current real implementations appear to be much better behaved.)
+We of course are in no position to guarantee that future processors
+(even HPs) will continue to behave this way, though we hope they will.
+
+Corrections/additions for other platforms are greatly appreciated.
+
+OPERATIONS:
+
+Most operations handle values of type AO_t, which are unsigned integers
+whose size matches that of pointers on the given architecture. Additionally,
+on most supported architectures the operations are also implemented to handle
+smaller integers types; such operations are indicated by the appropriate size
+prefix:
+- char_... Operates on unsigned char values;
+- short_... Operates on unsigned short values;
+- int_... Operates on unsigned int values.
+
+The notable exception is AO_test_and_set operating only on AO_TS_t, which is
+whatever size the hardware supports with good performance. In some cases this
+is the length of a cache line, in some other cases it is a byte. In many
+cases AO_TS_t is equivalent to AO_t.
+
+The defined operations are all of the form AO_[<size>]<op><barrier>(<args>).
+
+The <op> component specifies an atomic memory operation. It may be
+one of the following, where the corresponding argument and result types
+are also specified:
+
+void nop()
+ No atomic operation. The barrier may still be useful.
+AO_t load(const volatile AO_t * addr)
+ Atomic load of *addr.
+void store(volatile AO_t * addr, AO_t new_val)
+ Atomically store new_val to *addr.
+AO_t fetch_and_add(volatile AO_t *addr, AO_t incr)
+ Atomically add incr to *addr, and return the original value of *addr.
+AO_t fetch_and_add1(volatile AO_t *addr)
+ Equivalent to AO_fetch_and_add(addr, 1).
+AO_t fetch_and_sub1(volatile AO_t *addr)
+ Equivalent to AO_fetch_and_add(addr, (AO_t)(-1)).
+void and(volatile AO_t *addr, AO_t value)
+ Atomically 'and' value into *addr.
+void or(volatile AO_t *addr, AO_t value)
+ Atomically 'or' value into *addr.
+void xor(volatile AO_t *addr, AO_t value)
+ Atomically 'xor' value into *addr.
+int compare_and_swap(volatile AO_t * addr, AO_t old_val, AO_t new_val)
+ Atomically compare *addr to old_val, and replace *addr by new_val
+ if the first comparison succeeds; returns nonzero if the comparison
+ succeeded and *addr was updated; cannot fail spuriously.
+AO_t fetch_compare_and_swap(volatile AO_t * addr, AO_t old_val, AO_t new_val)
+ Atomically compare *addr to old_val, and replace *addr by new_val
+ if the first comparison succeeds; returns the original value of *addr;
+ cannot fail spuriously.
+AO_TS_VAL_t test_and_set(volatile AO_TS_t * addr)
+ Atomically read the binary value at *addr, and set it. AO_TS_VAL_t
+ is an enumeration type which includes two values AO_TS_SET and
+ AO_TS_CLEAR. An AO_TS_t location is capable of holding an
+ AO_TS_VAL_t, but may be much larger, as dictated by hardware
+ constraints. Test_and_set logically sets the value to AO_TS_SET.
+ It may be reset to AO_TS_CLEAR with the AO_CLEAR(AO_TS_t *) macro.
+ AO_TS_t locations should be initialized to AO_TS_INITIALIZER.
+ The values of AO_TS_SET and AO_TS_CLEAR are hardware dependent.
+ (On PA-RISC, AO_TS_SET is zero!)
+
+Test_and_set is a more limited version of compare_and_swap. Its only
+advantage is that it is more easily implementable on some hardware. It
+should thus be used if only binary test-and-set functionality is needed.
+
+If available, we also provide compare_and_swap operations that operate
+on wider values. Since standard data types for double width values
+may not be available, these explicitly take pairs of arguments for the
+new and/or old value. Unfortunately, there are two common variants,
+neither of which can easily and efficiently emulate the other.
+The first performs a comparison against the entire value being replaced,
+where the second replaces a double-width replacement, but performs
+a single-width comparison:
+
+int compare_double_and_swap_double(volatile AO_double_t * addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2);
+
+int compare_and_swap_double(volatile AO_double_t * addr,
+ AO_t old_val1,
+ AO_t new_val1, AO_t new_val2);
+
+where AO_double_t is a structure containing AO_val1 and AO_val2 fields,
+both of type AO_t. For compare_and_swap_double, we compare against
+the val1 field. AO_double_t exists only if AO_HAVE_double_t
+is defined. If this type is available then the following operation is
+provided for convenience, fully equivalent to compare_double_and_swap_double:
+
+int double_compare_and_swap(volatile AO_double_t * addr,
+ AO_double_t old_val, AO_double_t new_val)
+
+Please note that AO_double_t (and AO_stack_t) variables should be properly
+aligned (8-byte alignment on 32-bit targets, 16-byte alignment on 64-bit ones)
+otherwise the behavior of a double-wide atomic primitive might be undefined
+(or an assertion violation might occur) if such a misaligned variable is
+passed (as a reference) to the primitive. Global and static variables should
+already have proper alignment automatically but automatic variables (i.e.
+located on the stack) might be misaligned because the stack might be
+word-aligned (e.g. 4-byte stack alignment is the default one for x86).
+Luckily, stack-allocated AO variables operated atomically are used rarely
+in practice.
+
+ORDERING CONSTRAINTS:
+
+Each operation name also includes a suffix that specifies the associated
+ordering semantics. The ordering constraint limits reordering of this
+operation with respect to other atomic operations and ordinary memory
+references. The current implementation assumes that all memory references
+are to ordinary cacheable memory; the ordering guarantee is with respect
+to other threads or processes, not I/O devices. (Whether or not this
+distinction is important is platform-dependent.)
+
+Ordering suffixes are one of the following:
+
+<none>: No memory barrier. A plain AO_nop() really does nothing.
+_release: Earlier operations must become visible to other threads
+ before the atomic operation.
+_acquire: Later operations must become visible after this operation.
+_read: Subsequent reads must become visible after reads included in
+ the atomic operation or preceding it. Rarely useful for clients?
+_write: Earlier writes become visible before writes during or after
+ the atomic operation. Rarely useful for clients?
+_full: The associated operation is ordered with respect to both earlier and
+ later memory ops. If the associated operation is nop, then this orders
+ all earlier memory operations with respect to subsequent ones.
+ AO_store_full or AO_nop_full are the normal ways to force a store
+ to be ordered with respect to a later load.
+_release_write: Ordered with respect to earlier writes. This is
+ normally implemented as either a _write or _release
+ barrier.
+_acquire_read: Ordered with respect to later reads. This is
+ normally implemented as either a _read or _acquire barrier.
+_dd_acquire_read: Ordered with respect to later reads that are data
+ dependent on this one. This is needed on
+ a pointer read, which is later dereferenced to read a
+ second value, with the expectation that the second
+ read is ordered after the first one. On most architectures,
+ this is equivalent to no barrier. (This is very
+ hard to define precisely. It should probably be avoided.
+ A major problem is that optimizers tend to try to
+ eliminate dependencies from the generated code, since
+ dependencies force the hardware to execute the code
+ serially.)
+
+We assume that if a store is data-dependent on a previous load, then
+the two are always implicitly ordered.
+
+It is possible to test whether AO_[<size>]<op><barrier> is available on the
+target platform by checking whether AO_HAVE_[<size>]<op><barrier> is defined
+as a macro.
+
+Note that we generally don't implement operations that are either
+meaningless (e.g. AO_nop_acquire, AO_nop_release) or which appear to
+have no clear use (e.g. AO_load_release, AO_store_acquire, AO_load_write,
+AO_store_read). On some platforms (e.g. PA-RISC) many operations
+will remain undefined unless AO_REQUIRE_CAS is defined before including
+the package.
+
+When typed in the package build directory, the following command
+will print operations that are unimplemented on the platform:
+
+make test_atomic; ./test_atomic
+
+The following command generates a file "list_atomic.i" containing the
+macro expansions of all implemented operations on the platform:
+
+make list_atomic.i
+
+Known issues include:
+
+We should be more precise in defining the semantics of the ordering
+constraints, and if and how we can guarantee sequential consistency.
+
+Dd_acquire_read is very hard or impossible to define in a way that cannot
+be invalidated by reasonably standard compiler transformations.
+
+Example:
+
+If you want to initialize an object, and then "publish" a pointer to it
+in a global location p, such that other threads reading the new value of
+p are guaranteed to see an initialized object, it suffices to use
+AO_release_write(p, ...) to write the pointer to the object, and to
+retrieve it in other threads with AO_acquire_read(p).
+
+Platform notes:
+
+All X86: We quietly assume 486 or better.
+
+Gcc on x86:
+Define AO_USE_PENTIUM4_INSTRS to use the Pentium 4 mfence instruction.
+Currently this is appears to be of marginal benefit.
diff --git a/graphics/asymptote/libatomic_ops/README_malloc.txt b/graphics/asymptote/libatomic_ops/README_malloc.txt
new file mode 100644
index 0000000000..7f741f2fce
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/README_malloc.txt
@@ -0,0 +1,60 @@
+The atomic_ops_gpl includes a simple almost-lock-free malloc implementation.
+
+Note that the AO malloc implementation is licensed under the GPL, unlike the
+lower level routines.
+
+This is intended as a safe way to allocate memory from a signal handler,
+or to allocate memory in the context of a library that does not know what
+thread library it will be used with. In either case locking is impossible.
+
+Note that the operations are only guaranteed to be 1-lock-free, i.e. a
+single blocked thread will not prevent progress, but multiple blocked
+threads may. To safely use these operations in a signal handler,
+the handler should be non-reentrant, i.e. it should not be interruptable
+by another handler using these operations. Furthermore use outside
+of signal handlers in a multithreaded application should be protected
+by a lock, so that at most one invocation may be interrupted by a signal.
+The header will define the macro "AO_MALLOC_IS_LOCK_FREE" on platforms
+on which malloc is completely lock-free, and hence these restrictions
+do not apply.
+
+In the presence of threads, but absence of contention, the time performance
+of this package should be as good, or slightly better than, most system
+malloc implementations. Its space performance
+is theoretically optimal (to within a constant factor), but probably
+quite poor in practice. In particular, no attempt is made to
+coalesce free small memory blocks. Something like Doug Lea's malloc is
+likely to use significantly less memory for complex applications.
+
+Performance on platforms without an efficient compare-and-swap implementation
+will be poor.
+
+This package was not designed for processor-scalability in the face of
+high allocation rates. If all threads happen to allocate different-sized
+objects, you might get lucky. Otherwise expect contention and false-sharing
+problems. If this is an issue, something like Maged Michael's algorithm
+(PLDI 2004) would be technically a far better choice. If you are concerned
+only with scalability, and not signal-safety, you might also consider
+using Hoard instead. We have seen a factor of 3 to 4 slowdown from the
+standard glibc malloc implementation with contention, even when the
+performance without contention was faster. (To make the implementation
+more scalable, one would need to replicate at least the free list headers,
+so that concurrent access is possible without cache conflicts.)
+
+Unfortunately there is no portable async-signal-safe way to obtain large
+chunks of memory from the OS. Based on reading of the source code,
+mmap-based allocation appears safe under Linux, and probably BSD variants.
+It is probably unsafe for operating systems built on Mach, such as
+Apple's Darwin. Without use of mmap, the allocator is
+limited to a fixed size, statically preallocated heap (2MB by default),
+and will fail to allocate objects above a certain size (just under 64K
+by default). Use of mmap to circumvent these limitations requires an
+explicit call.
+
+The entire interface to the AO_malloc package currently consists of:
+
+#include <atomic_ops_malloc.h> /* includes atomic_ops.h */
+
+void *AO_malloc(size_t sz);
+void AO_free(void *p);
+void AO_malloc_enable_mmap(void);
diff --git a/graphics/asymptote/libatomic_ops/README_stack.txt b/graphics/asymptote/libatomic_ops/README_stack.txt
new file mode 100644
index 0000000000..a3c8e00cd5
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/README_stack.txt
@@ -0,0 +1,78 @@
+Note that the AO_stack implementation is licensed under the GPL,
+unlike the lower level routines.
+
+The header file atomic_ops_stack.h defines a linked stack abstraction.
+Stacks may be accessed by multiple concurrent threads. The implementation
+is 1-lock-free, i.e. it will continue to make progress if at most one
+thread becomes inactive while operating on the data structure.
+
+(The implementation can be built to be N-lock-free for any given N. But that
+seems to rarely be useful, especially since larger N involve some slowdown.)
+
+This makes it safe to access these data structures from non-reentrant
+signal handlers, provided at most one non-signal-handler thread is
+accessing the data structure at once. This latter condition can be
+ensured by acquiring an ordinary lock around the non-handler accesses
+to the data structure.
+
+For details see:
+
+Hans-J. Boehm, "An Almost Non-Blocking Stack", PODC 2004,
+http://portal.acm.org/citation.cfm?doid=1011767.1011774
+(This is not exactly the implementation described there, since the
+interface was cleaned up in the interim. But it should perform
+very similarly.)
+
+We use a fully lock-free implementation when the underlying hardware
+makes that less expensive, i.e. when we have a double-wide compare-and-swap
+operation available. (The fully lock-free implementation uses an AO_t-
+sized version count, and assumes it does not wrap during the time any
+given operation is active. This seems reasonably safe on 32-bit hardware,
+and very safe on 64-bit hardware.) If a fully lock-free implementation,
+AO_stack_is_lock_free() returns 1 (also, the macro AO_STACK_IS_LOCK_FREE is
+defined in this case but its usage by client is deprecated).
+
+The implementation is interesting only because it allows reuse of
+existing nodes. This is necessary, for example, to implement a memory
+allocator.
+
+Since we want to leave the precise stack node type up to the client,
+we insist only that each stack node contains a link field of type AO_t.
+When a new node is pushed on the stack, the push operation expects to be
+passed the pointer to this link field, which will then be overwritten by
+this link field. Similarly, the pop operation returns a pointer to the
+link field of the object that previously was on the top of the stack.
+
+The cleanest way to use these routines is probably to define the stack node
+type with an initial AO_t link field, so that the conversion between the
+link-field pointer and the stack element pointer is just a compile-time
+cast. But other possibilities exist. (This would be cleaner in C++ with
+templates.)
+
+A stack is represented by an AO_stack_t structure. (This is normally
+2 or 3 times the size of a pointer.) It may be statically initialized
+by setting it to AO_STACK_INITIALIZER, or dynamically initialized to
+an empty stack with AO_stack_init. There are only three operations for
+accessing stacks:
+
+void AO_stack_init(AO_stack_t *list);
+void AO_stack_push_release(AO_stack_t *list, AO_t *new_element);
+AO_t * AO_stack_pop_acquire(volatile AO_stack_t *list);
+
+We require that the objects pushed as list elements remain addressable
+as long as any push or pop operation are in progress. (It is OK for an object
+to be "popped" off a stack and "deallocated" with a concurrent "pop" on
+the same stack still in progress, but only if "deallocation" leaves the
+object addressable. The second "pop" may still read the object, but
+the value it reads will not matter.)
+
+We require that the headers (AO_stack objects) remain allocated and
+valid as long as any operations on them are still in-flight.
+
+We also provide macros AO_REAL_HEAD_PTR that converts an AO_stack_t
+to a pointer to the link field in the next element, and AO_REAL_NEXT_PTR
+that converts a link field to a real, dereferencable, pointer to the link field
+in the next element. This is intended only for debugging, or to traverse
+the list after modification has ceased. There is otherwise no guarantee that
+walking a stack using this macro will produce any kind of consistent
+picture of the data structure.
diff --git a/graphics/asymptote/libatomic_ops/README_win32.txt b/graphics/asymptote/libatomic_ops/README_win32.txt
new file mode 100644
index 0000000000..40735e786f
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/README_win32.txt
@@ -0,0 +1,46 @@
+Most of the atomic_ops functionality is available under Win32 with
+the Microsoft tools, but the build process is somewhat different from
+that on Linux/Unix platforms.
+
+To build and test the package:
+1) Make sure the Microsoft command-line tools (e.g. nmake) are available.
+2) Go to the src directory in the distribution and run
+"nmake -f Makefile.msft check". This should build atomic_ops.lib and
+atomic_ops_gpl.lib, and execute some tests.
+Alternatively, CMake could be used (e.g., see how to in README_details.txt).
+
+To compile applications, you will need to retain or copy the following
+pieces from the resulting src directory contents:
+ "atomic_ops.h" - Header file defining low-level primitives. This
+ includes files from the following folder.
+ "atomic_ops" - Subdirectory containing implementation header files.
+ The atomic_ops.h implementation is entirely in the
+ header files in Win32.
+ "atomic_ops.lib" - Library containing implementation of AO_pause()
+ defined in atomic_ops.c (AO_pause is needed for
+ the almost lock-free stack implementation).
+ "atomic_ops_stack.h" - Header file describing almost lock-free stack.
+ "atomic_ops_malloc.h" - Header file describing almost lock-free malloc.
+ "atomic_ops_gpl.lib" - Library containing implementation of the
+ above two.
+
+Note that atomic_ops_gpl.lib is covered by the GNU General Public License,
+while the top 3 of these pieces allow use in proprietary code.
+
+There are several macros a client could use to configure the build with the
+Microsoft tools (except for AO_CMPXCHG16B_AVAILABLE one, others should be
+rarely needed in practice):
+* AO_ASM_X64_AVAILABLE - inline assembly available (only x86_64)
+* AO_ASSUME_VISTA - assume Windows Server 2003, Vista or later target (only
+ x86, implied if Visual Studio 2015 or older)
+* AO_CMPXCHG16B_AVAILABLE - assume target is not old AMD Opteron chip (only
+ x86_64)
+* AO_OLD_STYLE_INTERLOCKED_COMPARE_EXCHANGE - assume ancient MS VS Win32
+ headers (only arm and x86)
+* AO_PREFER_GENERALIZED - prefer generalized definitions to direct
+ assembly-based ones
+* AO_UNIPROCESSOR - assume single-core target (only arm)
+* AO_USE_INTERLOCKED_INTRINSICS - assume Win32 _Interlocked* primitives
+ available as intrinsics (only arm)
+* AO_USE_PENTIUM4_INSTRS - use mfence instruction instead of xchg (only x86,
+ implied if SSE2 is available)
diff --git a/graphics/asymptote/libatomic_ops/autogen.sh b/graphics/asymptote/libatomic_ops/autogen.sh
new file mode 100755
index 0000000000..98b91da932
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/autogen.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+set -e
+
+# This script creates (or regenerates) configure (as well as aclocal.m4,
+# config.h.in, Makefile.in, etc.) missing in the source repository.
+
+autoreconf -i
+
+echo
+echo "Ready to run './configure'."
diff --git a/graphics/asymptote/libatomic_ops/configure.ac b/graphics/asymptote/libatomic_ops/configure.ac
new file mode 100644
index 0000000000..f70921f898
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/configure.ac
@@ -0,0 +1,261 @@
+# Copyright (c) 2005-2006 Hewlett-Packard Development Company, L.P.
+# Copyright (c) 2009-2021 Ivan Maidanski
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program
+# for any purpose, provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is granted,
+# provided the above notices are retained, and a notice that the code was
+# modified is included with the above copyright notice.
+
+dnl Process this file with autoconf to produce configure.
+
+AC_INIT([libatomic_ops],[7.8.2],https://github.com/ivmai/libatomic_ops/issues)
+
+AC_PREREQ(2.61)
+AC_CANONICAL_TARGET([])
+AC_CONFIG_SRCDIR(src/atomic_ops.c)
+AC_CONFIG_MACRO_DIR([m4])
+AM_INIT_AUTOMAKE([foreign nostdinc])
+AM_MAINTAINER_MODE
+
+AC_CONFIG_HEADERS([src/config.h])
+
+dnl Checks for programs.
+AM_PROG_CC_C_O
+AM_PROG_AS
+AC_PROG_INSTALL
+LT_INIT([disable-shared])
+
+dnl Checks for functions.
+AC_FUNC_MMAP
+
+# Determine PIC flag.
+need_asm=false
+PICFLAG=
+AC_MSG_CHECKING(for PIC compiler flag)
+if test "$GCC" = yes; then
+ old_CC="$CC"
+ if test -n "$CROSS_CC"; then
+ CC="$CROSS_CC"
+ fi
+
+ case "$host" in
+ *-*-cygwin* | *-*-mingw* | *-*-msys*)
+ # Cygwin and Mingw[-w32/64] do not need -fPIC.
+ AC_MSG_RESULT([not needed])
+ ;;
+ *)
+ AC_MSG_RESULT(-fPIC)
+ PICFLAG=-fPIC
+ AC_MSG_CHECKING(whether -fPIC compiler option causes __PIC__ definition)
+ # Workaround: at least GCC 3.4.6 (Solaris) does not define this macro.
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="$PICFLAG $CFLAGS"
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE([
+ #ifndef __PIC__
+ # error
+ #endif
+ ])], [ac_cv_pic_macro=yes], [ac_cv_pic_macro=no])
+ CFLAGS="$old_CFLAGS"
+ AC_MSG_RESULT($ac_cv_pic_macro)
+ AS_IF([test "$ac_cv_pic_macro" = yes], [],
+ [PICFLAG="-D__PIC__=1 $PICFLAG"])
+ ;;
+ esac
+
+ # Output all warnings.
+ AC_MSG_CHECKING([whether compiler supports -Wextra])
+ old_CFLAGS="$CFLAGS"
+ CFLAGS="-Wextra $CFLAGS"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([])],
+ [ac_cv_cc_wextra=yes], [ac_cv_cc_wextra=no])
+ CFLAGS="$old_CFLAGS"
+ AC_MSG_RESULT($ac_cv_cc_wextra)
+ AS_IF([test "$ac_cv_cc_wextra" = yes], [WEXTRA="-Wextra"], [WEXTRA="-W"])
+ AC_MSG_CHECKING([whether compiler supports -Wpedantic])
+ CFLAGS="-Wpedantic -Wno-long-long $CFLAGS"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+extern int quiet;
+ ])], [ac_cv_cc_pedantic=yes], [ac_cv_cc_pedantic=no])
+ CFLAGS="$old_CFLAGS"
+ AC_MSG_RESULT($ac_cv_cc_pedantic)
+ WPEDANTIC=
+ AS_IF([test "$ac_cv_cc_pedantic" = yes],
+ [WPEDANTIC="-Wpedantic -Wno-long-long"])
+ CFLAGS="-Wall $WEXTRA $WPEDANTIC $CFLAGS"
+
+ CC="$old_CC"
+else
+ case "$host" in
+ *-*-hpux*)
+ AC_MSG_RESULT([+Z])
+ PICFLAG="+Z"
+ CFLAGS="+O2 -mt $CFLAGS"
+ ;;
+ *-*-solaris*)
+ AC_MSG_RESULT(-Kpic)
+ PICFLAG=-Kpic
+ CFLAGS="-O $CFLAGS"
+ need_asm=true
+ ;;
+ *-*-linux*)
+ AC_MSG_RESULT(-fPIC)
+ PICFLAG=-fPIC
+ # Any Linux compiler had better be gcc compatible.
+ ;;
+ *)
+ AC_MSG_RESULT([none])
+ ;;
+ esac
+fi
+
+AC_ARG_ENABLE(assertions,
+ [AS_HELP_STRING([--enable-assertions], [Assertion checking])])
+if test "$enable_assertions" != yes; then
+ AC_DEFINE([NDEBUG], 1, [Define to disable assertion checking.])
+fi
+
+AC_ARG_ENABLE(atomic-intrinsics,
+ [AS_HELP_STRING([--disable-atomic-intrinsics],
+ [Do not use GCC atomic intrinsics])])
+if test "$enable_atomic_intrinsics" = no; then
+ AC_DEFINE([AO_DISABLE_GCC_ATOMICS], 1,
+ [Define to avoid GCC atomic intrinsics even if available.])
+fi
+
+AC_ARG_ENABLE(gcov, AS_HELP_STRING([--enable-gcov],
+ [Turn on code coverage analysis]))
+if test "$enable_gcov" = "yes"; then
+ CFLAGS="$CFLAGS --coverage"
+ # Turn off code optimization to get accurate line numbers.
+ CFLAGS=`echo "$CFLAGS" | sed -e 's/-O\(1\|2\|3\|4\|s\|fast\)\?//g'`
+fi
+
+AC_ARG_ENABLE(gpl,
+ [AS_HELP_STRING([--disable-gpl],
+ [Do not build atomic_ops_gpl library])])
+AM_CONDITIONAL(ENABLE_GPL, test x$enable_gpl != xno)
+
+AC_ARG_ENABLE(docs,
+ [AS_HELP_STRING([--disable-docs],
+ [Do not build and install documentation])])
+AM_CONDITIONAL(ENABLE_DOCS, test x$enable_docs != xno)
+
+AC_SUBST(PICFLAG)
+AC_SUBST(DEFS)
+
+dnl Extra user-defined C flags.
+AC_SUBST([CFLAGS_EXTRA])
+
+AH_TEMPLATE([_PTHREADS], [Indicates the use of pthreads (NetBSD).])
+
+AH_TEMPLATE([AO_USE_NANOSLEEP],
+ [Use nanosleep() instead of select() (only if atomic operations \
+ are emulated)])
+AH_TEMPLATE([AO_USE_NO_SIGNALS],
+ [Do not block signals in compare_and_swap (only if atomic operations \
+ are emulated)])
+AH_TEMPLATE([AO_USE_WIN32_PTHREADS],
+ [Use Win32 Sleep() instead of select() (only if atomic operations \
+ are emulated)])
+AH_TEMPLATE([AO_TRACE_MALLOC], [Trace AO_malloc/free calls (for debug only)])
+
+dnl These macros are tested in public headers.
+AH_TEMPLATE([AO_GENERALIZE_ASM_BOOL_CAS],
+ [Force compare_and_swap definition via fetch_compare_and_swap])
+AH_TEMPLATE([AO_PREFER_GENERALIZED],
+ [Prefer generalized definitions to direct assembly-based ones])
+AH_TEMPLATE([AO_USE_PTHREAD_DEFS],
+ [Emulate atomic operations via slow and async-signal-unsafe \
+ pthread locking])
+AH_TEMPLATE([AO_CMPXCHG16B_AVAILABLE],
+ [Assume target is not old AMD Opteron chip (only x86_64)])
+AH_TEMPLATE([AO_FORCE_USE_SWP],
+ [Force test_and_set to use SWP instruction instead of LDREX/STREX \
+ (only arm v6+)])
+AH_TEMPLATE([AO_NO_SPARC_V9], [Assume target is not sparc v9+ (only sparc)])
+AH_TEMPLATE([AO_UNIPROCESSOR],
+ [Assume single-core target (only arm v6+ or GCC intrinsics)])
+AH_TEMPLATE([AO_USE_PENTIUM4_INSTRS],
+ [Use Pentium 4 'mfence' instruction (only x86)])
+AH_TEMPLATE([AO_USE_SYNC_CAS_BUILTIN],
+ [Prefer GCC built-in CAS intrinsics in favor of inline assembly \
+ (only gcc/x86, gcc/x86_64)])
+AH_TEMPLATE([AO_WEAK_DOUBLE_CAS_EMULATION],
+ [Emulate double-width CAS via pthread locking in case of no hardware \
+ support (only gcc/x86_64, the emulation is unsafe)])
+AH_TEMPLATE([AO_PREFER_BUILTIN_ATOMICS],
+ [Prefer GCC atomic intrinsics over assembly-based implementation \
+ even in case of inefficient implementation (do not use assembly for \
+ any atomic_ops primitive if the atomic intrinsics are available)])
+
+AC_DEFINE(_REENTRANT, 1, [Required define if using POSIX threads.])
+
+# Libraries needed to support threads (if any).
+have_pthreads=false
+AC_CHECK_LIB(pthread, pthread_self, have_pthreads=true)
+if test x$have_pthreads = xtrue; then
+ THREADDLLIBS=-lpthread
+ case "$host" in
+ *-*-netbsd*)
+ # Indicates the use of pthreads.
+ AC_DEFINE(_PTHREADS)
+ ;;
+ *-*-openbsd* | *-*-kfreebsd*-gnu | *-*-dgux*)
+ THREADDLLIBS=-pthread
+ ;;
+ *-*-cygwin* | *-*-darwin*)
+ # Cygwin does not have a real libpthread, so Libtool cannot link
+ # against it.
+ THREADDLLIBS=
+ ;;
+ *-*-mingw* | *-*-msys*)
+ # Use Win32 threads for tests anyway.
+ THREADDLLIBS=
+ # Skip test_atomic_pthreads.
+ have_pthreads=false
+ ;;
+ esac
+else
+ AC_DEFINE([AO_NO_PTHREADS], 1, [No pthreads library available])
+ # Assume VxWorks or Win32.
+ THREADDLLIBS=
+fi
+AC_SUBST(THREADDLLIBS)
+
+# AO API symbols export control.
+# Compile with AO_DLL defined unless building static libraries.
+if test x$enable_shared = xyes -a x$enable_static = xno; then
+ CFLAGS="-DAO_DLL $CFLAGS"
+fi
+
+# Turn compiler warnings into errors, if requested.
+# Note: this check is placed after AC_CHECK_LIB(pthread) to workaround
+# a missing void in pthread_self declaration generated by autoconf.
+AC_ARG_ENABLE(werror, [AS_HELP_STRING([--enable-werror],
+ [Pass -Werror to the C compiler])])
+if test "$enable_werror" = yes -a "$GCC" = yes; then
+ CFLAGS="-Werror $CFLAGS"
+fi
+
+AM_CONDITIONAL(ENABLE_SHARED, test x$enable_shared = xyes)
+AM_CONDITIONAL(HAVE_PTHREAD_H, test x$have_pthreads = xtrue)
+AM_CONDITIONAL(NEED_ASM, test x$need_asm = xtrue)
+
+AC_CONFIG_FILES([
+ Makefile
+ src/Makefile
+ tests/Makefile
+ pkgconfig/atomic_ops.pc
+ pkgconfig/atomic_ops-uninstalled.pc ])
+
+AC_CONFIG_COMMANDS([default],[[]],[[
+PICFLAG="${PICFLAG}"
+CC="${CC}"
+DEFS="${DEFS}"
+]])
+AC_OUTPUT
diff --git a/graphics/asymptote/libatomic_ops/pkgconfig/atomic_ops-uninstalled.pc.in b/graphics/asymptote/libatomic_ops/pkgconfig/atomic_ops-uninstalled.pc.in
new file mode 100644
index 0000000000..3618f75b97
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/pkgconfig/atomic_ops-uninstalled.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+top_builddir=@abs_top_builddir@
+top_srcdir=@abs_top_srcdir@
+
+Name: The atomic_ops library (uninstalled)
+Description: Atomic memory update operations
+Version: @PACKAGE_VERSION@
+Libs: ${top_builddir}/src/libatomic_ops.la
+Cflags: -I${top_builddir}/src -I${top_srcdir}/src
diff --git a/graphics/asymptote/libatomic_ops/pkgconfig/atomic_ops.pc.in b/graphics/asymptote/libatomic_ops/pkgconfig/atomic_ops.pc.in
new file mode 100644
index 0000000000..73cc499c3c
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/pkgconfig/atomic_ops.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: The atomic_ops library
+Description: Atomic memory update operations portable implementation
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -latomic_ops
+Cflags: -I${includedir}
diff --git a/graphics/asymptote/libatomic_ops/src/Makefile.am b/graphics/asymptote/libatomic_ops/src/Makefile.am
new file mode 100644
index 0000000000..43daa5ddd6
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/Makefile.am
@@ -0,0 +1,268 @@
+
+# Info (current:revision:age) for the Libtool versioning system.
+# These numbers should be updated at most once just before the release,
+# and, optionally, at most once during the development (after the release).
+LIBATOMIC_OPS_VER_INFO = 3:0:2
+LIBATOMIC_OPS_GPL_VER_INFO = 3:1:2
+
+AM_CFLAGS=@PICFLAG@
+AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src
+
+CFLAGS += $(CFLAGS_EXTRA)
+
+include_HEADERS = atomic_ops.h
+lib_LTLIBRARIES = libatomic_ops.la
+if NEED_ASM
+libatomic_ops_la_SOURCES = atomic_ops.c atomic_ops_sysdeps.S
+else
+libatomic_ops_la_SOURCES = atomic_ops.c
+endif
+libatomic_ops_la_LDFLAGS = -version-info $(LIBATOMIC_OPS_VER_INFO) \
+ -no-undefined
+
+if ENABLE_GPL
+include_HEADERS += atomic_ops_malloc.h atomic_ops_stack.h
+lib_LTLIBRARIES += libatomic_ops_gpl.la
+libatomic_ops_gpl_la_SOURCES = atomic_ops_stack.c atomic_ops_malloc.c
+libatomic_ops_gpl_la_LDFLAGS = -version-info $(LIBATOMIC_OPS_GPL_VER_INFO) \
+ -no-undefined
+libatomic_ops_gpl_la_LIBADD = libatomic_ops.la
+endif
+
+EXTRA_DIST = Makefile.msft atomic_ops/sysdeps/README \
+ atomic_ops/generalize-arithm.template \
+ atomic_ops/generalize-small.template \
+ atomic_ops/sysdeps/ao_t_is_int.template \
+ atomic_ops/sysdeps/gcc/generic-arithm.template \
+ atomic_ops/sysdeps/gcc/generic-small.template \
+ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template \
+ atomic_ops/sysdeps/loadstore/atomic_load.template \
+ atomic_ops/sysdeps/loadstore/atomic_store.template \
+ atomic_ops/sysdeps/loadstore/ordered_loads_only.template \
+ atomic_ops/sysdeps/loadstore/ordered_stores_only.template \
+ atomic_ops/sysdeps/sunc/sparc.S
+
+BUILT_SOURCES = atomic_ops/generalize-arithm.h \
+ atomic_ops/generalize-small.h \
+ atomic_ops/sysdeps/ao_t_is_int.h \
+ atomic_ops/sysdeps/gcc/generic-arithm.h \
+ atomic_ops/sysdeps/gcc/generic-small.h \
+ atomic_ops/sysdeps/loadstore/acquire_release_volatile.h \
+ atomic_ops/sysdeps/loadstore/atomic_load.h \
+ atomic_ops/sysdeps/loadstore/atomic_store.h \
+ atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h \
+ atomic_ops/sysdeps/loadstore/char_atomic_load.h \
+ atomic_ops/sysdeps/loadstore/char_atomic_store.h \
+ atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h \
+ atomic_ops/sysdeps/loadstore/int_atomic_load.h \
+ atomic_ops/sysdeps/loadstore/int_atomic_store.h \
+ atomic_ops/sysdeps/loadstore/ordered_loads_only.h \
+ atomic_ops/sysdeps/loadstore/ordered_stores_only.h \
+ atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h \
+ atomic_ops/sysdeps/loadstore/short_atomic_load.h \
+ atomic_ops/sysdeps/loadstore/short_atomic_store.h
+
+#Private Headers
+privatedir=${includedir}/
+nobase_private_HEADERS = atomic_ops/ao_version.h \
+ atomic_ops/generalize.h \
+ $(BUILT_SOURCES) \
+ \
+ atomic_ops/sysdeps/all_acquire_release_volatile.h \
+ atomic_ops/sysdeps/all_aligned_atomic_load_store.h \
+ atomic_ops/sysdeps/all_atomic_load_store.h \
+ atomic_ops/sysdeps/all_atomic_only_load.h \
+ atomic_ops/sysdeps/emul_cas.h \
+ atomic_ops/sysdeps/generic_pthread.h \
+ atomic_ops/sysdeps/ordered.h \
+ atomic_ops/sysdeps/ordered_except_wr.h \
+ atomic_ops/sysdeps/read_ordered.h \
+ atomic_ops/sysdeps/standard_ao_double_t.h \
+ atomic_ops/sysdeps/test_and_set_t_is_ao_t.h \
+ atomic_ops/sysdeps/test_and_set_t_is_char.h \
+ \
+ atomic_ops/sysdeps/armcc/arm_v6.h \
+ \
+ atomic_ops/sysdeps/gcc/aarch64.h \
+ atomic_ops/sysdeps/gcc/alpha.h \
+ atomic_ops/sysdeps/gcc/arm.h \
+ atomic_ops/sysdeps/gcc/avr32.h \
+ atomic_ops/sysdeps/gcc/cris.h \
+ atomic_ops/sysdeps/gcc/e2k.h \
+ atomic_ops/sysdeps/gcc/generic.h \
+ atomic_ops/sysdeps/gcc/hexagon.h \
+ atomic_ops/sysdeps/gcc/hppa.h \
+ atomic_ops/sysdeps/gcc/ia64.h \
+ atomic_ops/sysdeps/gcc/m68k.h \
+ atomic_ops/sysdeps/gcc/mips.h \
+ atomic_ops/sysdeps/gcc/powerpc.h \
+ atomic_ops/sysdeps/gcc/riscv.h \
+ atomic_ops/sysdeps/gcc/s390.h \
+ atomic_ops/sysdeps/gcc/sh.h \
+ atomic_ops/sysdeps/gcc/sparc.h \
+ atomic_ops/sysdeps/gcc/tile.h \
+ atomic_ops/sysdeps/gcc/x86.h \
+ \
+ atomic_ops/sysdeps/hpc/hppa.h \
+ atomic_ops/sysdeps/hpc/ia64.h \
+ \
+ atomic_ops/sysdeps/ibmc/powerpc.h \
+ \
+ atomic_ops/sysdeps/icc/ia64.h \
+ \
+ atomic_ops/sysdeps/loadstore/double_atomic_load_store.h \
+ \
+ atomic_ops/sysdeps/msftc/arm.h \
+ atomic_ops/sysdeps/msftc/arm64.h \
+ atomic_ops/sysdeps/msftc/common32_defs.h \
+ atomic_ops/sysdeps/msftc/x86.h \
+ atomic_ops/sysdeps/msftc/x86_64.h \
+ \
+ atomic_ops/sysdeps/sunc/sparc.h \
+ atomic_ops/sysdeps/sunc/x86.h
+
+atomic_ops/generalize-small.h: atomic_ops/generalize-small.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@
+
+atomic_ops/generalize-arithm.h: atomic_ops/generalize-arithm.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@
+
+atomic_ops/sysdeps/ao_t_is_int.h: atomic_ops/sysdeps/ao_t_is_int.template
+ mkdir -p `dirname $@`
+ sed -e s:_XBAR::g $? > $@
+ sed -e s:XBAR:full:g $? >> $@
+ sed -e s:XBAR:acquire:g $? >> $@
+ sed -e s:XBAR:release:g $? >> $@
+ sed -e s:XBAR:write:g $? >> $@
+ sed -e s:XBAR:read:g $? >> $@
+
+atomic_ops/sysdeps/gcc/generic-arithm.h: \
+ atomic_ops/sysdeps/gcc/generic-arithm.template
+ mkdir -p `dirname $@`
+ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \
+ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@
+ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \
+ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@
+ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \
+ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@
+ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \
+ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@
+ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \
+ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@
+ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \
+ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@
+ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \
+ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@
+ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \
+ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@
+ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \
+ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@
+ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \
+ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@
+ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \
+ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@
+ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \
+ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@
+ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \
+ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@
+ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \
+ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@
+ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \
+ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@
+ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \
+ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@
+
+atomic_ops/sysdeps/gcc/generic-small.h: \
+ atomic_ops/sysdeps/gcc/generic-small.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@
+
+atomic_ops/sysdeps/loadstore/ordered_loads_only.h: \
+ atomic_ops/sysdeps/loadstore/ordered_loads_only.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@
+
+atomic_ops/sysdeps/loadstore/ordered_stores_only.h: \
+ atomic_ops/sysdeps/loadstore/ordered_stores_only.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@
+
+atomic_ops/sysdeps/loadstore/acquire_release_volatile.h: \
+ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@
+
+atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h: \
+ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@
+
+atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h: \
+ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@
+
+atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h: \
+ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@
+
+atomic_ops/sysdeps/loadstore/atomic_load.h: \
+ atomic_ops/sysdeps/loadstore/atomic_load.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@
+
+atomic_ops/sysdeps/loadstore/char_atomic_load.h: \
+ atomic_ops/sysdeps/loadstore/atomic_load.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@
+
+atomic_ops/sysdeps/loadstore/int_atomic_load.h: \
+ atomic_ops/sysdeps/loadstore/atomic_load.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@
+
+atomic_ops/sysdeps/loadstore/short_atomic_load.h: \
+ atomic_ops/sysdeps/loadstore/atomic_load.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@
+
+atomic_ops/sysdeps/loadstore/atomic_store.h: \
+ atomic_ops/sysdeps/loadstore/atomic_store.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@
+
+atomic_ops/sysdeps/loadstore/char_atomic_store.h: \
+ atomic_ops/sysdeps/loadstore/atomic_store.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@
+
+atomic_ops/sysdeps/loadstore/int_atomic_store.h: \
+ atomic_ops/sysdeps/loadstore/atomic_store.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@
+
+atomic_ops/sysdeps/loadstore/short_atomic_store.h: \
+ atomic_ops/sysdeps/loadstore/atomic_store.template
+ mkdir -p `dirname $@`
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@
diff --git a/graphics/asymptote/libatomic_ops/src/Makefile.msft b/graphics/asymptote/libatomic_ops/src/Makefile.msft
new file mode 100644
index 0000000000..c684a72bc0
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/Makefile.msft
@@ -0,0 +1,72 @@
+#
+# Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P.
+#
+# The really trivial win32/VC++ Makefile. Note that atomic_ops.c defines
+# only AO_pause (used by atomic_ops_stack).
+# And we rely on a pre-built test_atomic_include.h and generalize-small.h,
+# since we can't rely on sed. To run all the tests, type:
+# nmake -f Makefile.msft check
+# To install, copy atomic_ops.h and the atomic_ops/... tree to your favorite
+# include directory.
+
+#!include <ntwin32.mak>
+
+CFLAGS_EXTRA=
+CFLAGS=-O2 -W4 $(CFLAGS_EXTRA)
+
+LIB_OBJS=atomic_ops.obj
+LIB_GPL_OBJS=atomic_ops_malloc.obj atomic_ops_stack.obj
+
+all-disable-gpl: atomic_ops.lib
+
+all: all-disable-gpl atomic_ops_gpl.lib
+
+atomic_ops.obj:
+ cl $(CFLAGS) -c atomic_ops.c
+
+atomic_ops_stack.obj:
+ cl $(CFLAGS) -c atomic_ops_stack.c
+
+atomic_ops_malloc.obj:
+ cl $(CFLAGS) /wd4127 -c atomic_ops_malloc.c
+
+atomic_ops.lib: $(LIB_OBJS)
+ lib /out:atomic_ops.lib $(LIB_OBJS)
+
+atomic_ops_gpl.lib: $(LIB_GPL_OBJS)
+ lib /out:atomic_ops_gpl.lib $(LIB_GPL_OBJS)
+
+..\tests\test_atomic: ..\tests\test_atomic.c ..\tests\test_atomic_include.h
+ cl $(CFLAGS) -I. ..\tests\test_atomic.c \
+ /Fo..\tests\test_atomic /Fe..\tests\test_atomic
+
+..\tests\test_atomic_generalized: ..\tests\test_atomic.c \
+ ..\tests\test_atomic_include.h
+ cl $(CFLAGS) -DAO_PREFER_GENERALIZED -I. ..\tests\test_atomic.c \
+ /Fo..\tests\test_atomic_generalized \
+ /Fe..\tests\test_atomic_generalized
+
+..\tests\test_malloc: ..\tests\test_malloc.c atomic_ops.lib atomic_ops_gpl.lib
+ cl $(CFLAGS) -I. ..\tests\test_malloc.c /Fo..\tests\test_malloc \
+ /Fe..\tests\test_malloc atomic_ops.lib atomic_ops_gpl.lib
+
+..\tests\test_stack: ..\tests\test_stack.c atomic_ops.lib atomic_ops_gpl.lib
+ cl $(CFLAGS) -I. ..\tests\test_stack.c /Fo..\tests\test_stack \
+ /Fe..\tests\test_stack atomic_ops.lib atomic_ops_gpl.lib
+
+check-deps: check-noautogen-deps ..\tests\test_atomic \
+ ..\tests\test_atomic_generalized
+
+check: check-deps check-noautogen
+ @echo "The following will print some 'Missing ...' messages"
+ ..\tests\test_atomic
+ ..\tests\test_atomic_generalized
+
+check-noautogen-deps: ..\tests\test_malloc ..\tests\test_stack
+
+check-noautogen: check-noautogen-deps
+ ..\tests\test_malloc
+ ..\tests\test_stack
+
+clean:
+ del *.obj atomic_ops*.lib ..\tests\*.obj ..\tests\*.exe
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops.c b/graphics/asymptote/libatomic_ops/src/atomic_ops.c
new file mode 100644
index 0000000000..e1dfdb79ee
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops.c
@@ -0,0 +1,301 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * Initialized data and out-of-line functions to support atomic_ops.h
+ * go here. Currently this is needed only for pthread-based atomics
+ * emulation, or for compare-and-swap emulation.
+ * Pthreads emulation isn't useful on a native Windows platform, and
+ * cas emulation is not needed. Thus we skip this on Windows.
+ */
+
+#if defined(HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+#if (defined(__hexagon__) || defined(__native_client__)) \
+ && !defined(AO_USE_NO_SIGNALS) && !defined(AO_USE_NANOSLEEP)
+ /* Hexagon QuRT does not have sigprocmask (but Hexagon does not need */
+ /* emulation, so it is OK not to bother about signals blocking). */
+ /* Since NaCl is not recognized by configure yet, we do it here. */
+# define AO_USE_NO_SIGNALS
+# define AO_USE_NANOSLEEP
+#endif
+
+#if defined(AO_USE_WIN32_PTHREADS) && !defined(AO_USE_NO_SIGNALS)
+# define AO_USE_NO_SIGNALS
+#endif
+
+#if (defined(__CYGWIN__) || defined(__GLIBC__) || defined(__GNU__) \
+ || defined(__linux__)) \
+ && !defined(AO_USE_NO_SIGNALS) && !defined(_GNU_SOURCE)
+# define _GNU_SOURCE 1
+#endif
+
+#ifndef AO_BUILD
+# define AO_BUILD
+#endif
+
+#undef AO_REQUIRE_CAS
+#include "atomic_ops.h" /* Without cas emulation! */
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+AO_API void AO_pause(int); /* defined below */
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__BORLANDC__) \
+ || defined(AO_USE_NO_SIGNALS)
+
+#ifndef AO_NO_PTHREADS
+# include <pthread.h>
+#endif
+
+#ifndef AO_USE_NO_SIGNALS
+# include <signal.h>
+#endif
+
+#ifdef AO_USE_NANOSLEEP
+ /* This requires _POSIX_TIMERS feature. */
+# include <sys/time.h>
+# include <time.h>
+#elif defined(AO_USE_WIN32_PTHREADS)
+# include <windows.h> /* for Sleep() */
+#elif defined(_HPUX_SOURCE)
+# include <sys/time.h>
+#else
+# include <sys/select.h>
+#endif
+
+#ifndef AO_HAVE_double_t
+# include "atomic_ops/sysdeps/standard_ao_double_t.h"
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+AO_API AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val);
+
+AO_API int
+AO_compare_double_and_swap_double_emulation(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2);
+
+AO_API void AO_store_full_emulation(volatile AO_t *addr, AO_t val);
+
+/* Lock for pthreads-based implementation. */
+#ifndef AO_NO_PTHREADS
+ AO_API pthread_mutex_t AO_pt_lock;
+#endif
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#ifndef AO_NO_PTHREADS
+ pthread_mutex_t AO_pt_lock = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+/*
+ * Out of line compare-and-swap emulation based on test and set.
+ *
+ * We use a small table of locks for different compare_and_swap locations.
+ * Before we update perform a compare-and-swap, we grab the corresponding
+ * lock. Different locations may hash to the same lock, but since we
+ * never acquire more than one lock at a time, this can't deadlock.
+ * We explicitly disable signals while we perform this operation.
+ *
+ * TODO: Probably also support emulation based on Lamport
+ * locks, since we may not have test_and_set either.
+ */
+#define AO_HASH_SIZE 16
+
+#define AO_HASH(x) (((unsigned long)(x) >> 12) & (AO_HASH_SIZE-1))
+
+static AO_TS_t AO_locks[AO_HASH_SIZE] = {
+ AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER,
+ AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER,
+ AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER,
+ AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER,
+};
+
+static void lock_ool(volatile AO_TS_t *l)
+{
+ int i = 0;
+
+ while (AO_test_and_set_acquire(l) == AO_TS_SET)
+ AO_pause(++i);
+}
+
+AO_INLINE void lock(volatile AO_TS_t *l)
+{
+ if (AO_EXPECT_FALSE(AO_test_and_set_acquire(l) == AO_TS_SET))
+ lock_ool(l);
+}
+
+AO_INLINE void unlock(volatile AO_TS_t *l)
+{
+ AO_CLEAR(l);
+}
+
+#ifndef AO_USE_NO_SIGNALS
+ static sigset_t all_sigs;
+ static volatile AO_t initialized = 0;
+ static volatile AO_TS_t init_lock = AO_TS_INITIALIZER;
+
+ AO_INLINE void block_all_signals(sigset_t *old_sigs_ptr)
+ {
+ if (AO_EXPECT_FALSE(!AO_load_acquire(&initialized)))
+ {
+ lock(&init_lock);
+ if (!initialized)
+ sigfillset(&all_sigs);
+ unlock(&init_lock);
+ AO_store_release(&initialized, 1);
+ }
+ sigprocmask(SIG_BLOCK, &all_sigs, old_sigs_ptr);
+ /* Neither sigprocmask nor pthread_sigmask is 100% */
+ /* guaranteed to work here. Sigprocmask is not */
+ /* guaranteed be thread safe, and pthread_sigmask */
+ /* is not async-signal-safe. Under linuxthreads, */
+ /* sigprocmask may block some pthreads-internal */
+ /* signals. So long as we do that for short periods, */
+ /* we should be OK. */
+ }
+#endif /* !AO_USE_NO_SIGNALS */
+
+AO_API AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+{
+ AO_TS_t *my_lock = AO_locks + AO_HASH(addr);
+ AO_t fetched_val;
+
+# ifndef AO_USE_NO_SIGNALS
+ sigset_t old_sigs;
+ block_all_signals(&old_sigs);
+# endif
+ lock(my_lock);
+ fetched_val = *addr;
+ if (fetched_val == old_val)
+ *addr = new_val;
+ unlock(my_lock);
+# ifndef AO_USE_NO_SIGNALS
+ sigprocmask(SIG_SETMASK, &old_sigs, NULL);
+# endif
+ return fetched_val;
+}
+
+AO_API int
+AO_compare_double_and_swap_double_emulation(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+{
+ AO_TS_t *my_lock = AO_locks + AO_HASH(addr);
+ int result;
+
+# ifndef AO_USE_NO_SIGNALS
+ sigset_t old_sigs;
+ block_all_signals(&old_sigs);
+# endif
+ lock(my_lock);
+ if (addr -> AO_val1 == old_val1 && addr -> AO_val2 == old_val2)
+ {
+ addr -> AO_val1 = new_val1;
+ addr -> AO_val2 = new_val2;
+ result = 1;
+ }
+ else
+ result = 0;
+ unlock(my_lock);
+# ifndef AO_USE_NO_SIGNALS
+ sigprocmask(SIG_SETMASK, &old_sigs, NULL);
+# endif
+ return result;
+}
+
+AO_API void AO_store_full_emulation(volatile AO_t *addr, AO_t val)
+{
+ AO_TS_t *my_lock = AO_locks + AO_HASH(addr);
+ lock(my_lock);
+ *addr = val;
+ unlock(my_lock);
+}
+
+#else /* Non-posix platform */
+
+# include <windows.h>
+
+# define AO_USE_WIN32_PTHREADS
+ /* define to use Sleep() */
+
+ extern int AO_non_posix_implementation_is_entirely_in_headers;
+
+#endif
+
+static AO_t spin_dummy = 1;
+
+/* Spin for 2**n units. */
+static void AO_spin(int n)
+{
+ AO_t j = AO_load(&spin_dummy);
+ int i = 2 << n;
+
+ while (i-- > 0)
+ j += (j - 1) << 2;
+ /* Given 'spin_dummy' is initialized to 1, j is 1 after the loop. */
+ AO_store(&spin_dummy, j);
+}
+
+AO_API void AO_pause(int n)
+{
+ if (n < 12)
+ AO_spin(n);
+ else
+ {
+# ifdef AO_USE_NANOSLEEP
+ struct timespec ts;
+ ts.tv_sec = 0;
+ ts.tv_nsec = n > 28 ? 100000L * 1000 : 1L << (n - 2);
+ nanosleep(&ts, 0);
+# elif defined(AO_USE_WIN32_PTHREADS)
+ Sleep(n > 28 ? 100 /* millis */
+ : n < 22 ? 1 : (DWORD)1 << (n - 22));
+# else
+ struct timeval tv;
+ /* Short async-signal-safe sleep. */
+ int usec = n > 28 ? 100000 : 1 << (n - 12);
+ /* Use an intermediate variable (of int type) to avoid */
+ /* "shift followed by widening conversion" warning. */
+
+ tv.tv_sec = 0;
+ tv.tv_usec = usec;
+ (void)select(0, 0, 0, 0, &tv);
+# endif
+ }
+}
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops.h b/graphics/asymptote/libatomic_ops/src/atomic_ops.h
new file mode 100644
index 0000000000..a2545a3727
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops.h
@@ -0,0 +1,509 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2008-2022 Ivan Maidanski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 AO_ATOMIC_OPS_H
+#define AO_ATOMIC_OPS_H
+
+#include "atomic_ops/ao_version.h"
+ /* Define version numbers here to allow */
+ /* test on build machines for cross-builds. */
+
+#include <assert.h>
+#include <stddef.h>
+
+/* We define various atomic operations on memory in a */
+/* machine-specific way. Unfortunately, this is complicated */
+/* by the fact that these may or may not be combined with */
+/* various memory barriers. Thus the actual operations we */
+/* define have the form AO_<atomic-op>_<barrier>, for all */
+/* plausible combinations of <atomic-op> and <barrier>. */
+/* This of course results in a mild combinatorial explosion. */
+/* To deal with it, we try to generate derived */
+/* definitions for as many of the combinations as we can, as */
+/* automatically as possible. */
+/* */
+/* Our assumption throughout is that the programmer will */
+/* specify the least demanding operation and memory barrier */
+/* that will guarantee correctness for the implementation. */
+/* Our job is to find the least expensive way to implement it */
+/* on the applicable hardware. In many cases that will */
+/* involve, for example, a stronger memory barrier, or a */
+/* combination of hardware primitives. */
+/* */
+/* Conventions: */
+/* "plain" atomic operations are not guaranteed to include */
+/* a barrier. The suffix in the name specifies the barrier */
+/* type. Suffixes are: */
+/* _release: Earlier operations may not be delayed past it. */
+/* _acquire: Later operations may not move ahead of it. */
+/* _read: Subsequent reads must follow this operation and */
+/* preceding reads. */
+/* _write: Earlier writes precede both this operation and */
+/* later writes. */
+/* _full: Ordered with respect to both earlier and later memory */
+/* operations. */
+/* _release_write: Ordered with respect to earlier writes. */
+/* _acquire_read: Ordered with respect to later reads. */
+/* */
+/* Currently we try to define the following atomic memory */
+/* operations, in combination with the above barriers: */
+/* AO_nop */
+/* AO_load */
+/* AO_store */
+/* AO_test_and_set (binary) */
+/* AO_fetch_and_add */
+/* AO_fetch_and_add1 */
+/* AO_fetch_and_sub1 */
+/* AO_and */
+/* AO_or */
+/* AO_xor */
+/* AO_compare_and_swap */
+/* AO_fetch_compare_and_swap */
+/* */
+/* Note that atomicity guarantees are valid only if both */
+/* readers and writers use AO_ operations to access the */
+/* shared value, while ordering constraints are intended to */
+/* apply all memory operations. If a location can potentially */
+/* be accessed simultaneously from multiple threads, and one of */
+/* those accesses may be a write access, then all such */
+/* accesses to that location should be through AO_ primitives. */
+/* However if AO_ operations enforce sufficient ordering to */
+/* ensure that a location x cannot be accessed concurrently, */
+/* or can only be read concurrently, then x can be accessed */
+/* via ordinary references and assignments. */
+/* */
+/* AO_compare_and_swap takes an address and an expected old */
+/* value and a new value, and returns an int. Non-zero result */
+/* indicates that it succeeded. */
+/* AO_fetch_compare_and_swap takes an address and an expected */
+/* old value and a new value, and returns the real old value. */
+/* The operation succeeded if and only if the expected old */
+/* value matches the old value returned. */
+/* */
+/* Test_and_set takes an address, atomically replaces it by */
+/* AO_TS_SET, and returns the prior value. */
+/* An AO_TS_t location can be reset with the */
+/* AO_CLEAR macro, which normally uses AO_store_release. */
+/* AO_fetch_and_add takes an address and an AO_t increment */
+/* value. The AO_fetch_and_add1 and AO_fetch_and_sub1 variants */
+/* are provided, since they allow faster implementations on */
+/* some hardware. AO_and, AO_or, AO_xor do atomically and, or, */
+/* xor (respectively) an AO_t value into a memory location, */
+/* but do not provide access to the original. */
+/* */
+/* We expect this list to grow slowly over time. */
+/* */
+/* Note that AO_nop_full is a full memory barrier. */
+/* */
+/* Note that if some data is initialized with */
+/* data.x = ...; data.y = ...; ... */
+/* AO_store_release_write(&data_is_initialized, 1) */
+/* then data is guaranteed to be initialized after the test */
+/* if (AO_load_acquire_read(&data_is_initialized)) ... */
+/* succeeds. Furthermore, this should generate near-optimal */
+/* code on all common platforms. */
+/* */
+/* All operations operate on unsigned AO_t, which */
+/* is the natural word size, and usually unsigned long. */
+/* It is possible to check whether a particular operation op */
+/* is available on a particular platform by checking whether */
+/* AO_HAVE_op is defined. We make heavy use of these macros */
+/* internally. */
+
+/* The rest of this file basically has three sections: */
+/* */
+/* Some utility and default definitions. */
+/* */
+/* The architecture dependent section: */
+/* This defines atomic operations that have direct hardware */
+/* support on a particular platform, mostly by including the */
+/* appropriate compiler- and hardware-dependent file. */
+/* */
+/* The synthesis section: */
+/* This tries to define other atomic operations in terms of */
+/* those that are explicitly available on the platform. */
+/* This section is hardware independent. */
+/* We make no attempt to synthesize operations in ways that */
+/* effectively introduce locks, except for the debugging/demo */
+/* pthread-based implementation at the beginning. A more */
+/* realistic implementation that falls back to locks could be */
+/* added as a higher layer. But that would sacrifice */
+/* usability from signal handlers. */
+/* The synthesis section is implemented almost entirely in */
+/* atomic_ops/generalize.h. */
+
+/* Some common defaults. Overridden for some architectures. */
+#define AO_t size_t
+
+/* The test_and_set primitive returns an AO_TS_VAL_t value. */
+/* AO_TS_t is the type of an in-memory test-and-set location. */
+
+#define AO_TS_INITIALIZER ((AO_TS_t)AO_TS_CLEAR)
+
+/* Convenient internal macro to test version of GCC. */
+#if defined(__GNUC__) && defined(__GNUC_MINOR__)
+# define AO_GNUC_PREREQ(major, minor) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((major) << 16) + (minor))
+#else
+# define AO_GNUC_PREREQ(major, minor) 0 /* false */
+#endif
+
+/* Convenient internal macro to test version of Clang. */
+#if defined(__clang__) && defined(__clang_major__)
+# define AO_CLANG_PREREQ(major, minor) \
+ ((__clang_major__ << 16) + __clang_minor__ >= ((major) << 16) + (minor))
+#else
+# define AO_CLANG_PREREQ(major, minor) 0 /* false */
+#endif
+
+/* Platform-dependent stuff: */
+#if (defined(__GNUC__) || defined(_MSC_VER) || defined(__INTEL_COMPILER) \
+ || defined(__DMC__) || defined(__WATCOMC__)) && !defined(AO_NO_INLINE)
+# define AO_INLINE static __inline
+#elif defined(__sun) && !defined(AO_NO_INLINE)
+# define AO_INLINE static inline
+#else
+# define AO_INLINE static
+#endif
+
+#if AO_GNUC_PREREQ(3, 0) && !defined(LINT2)
+# define AO_EXPECT_FALSE(expr) __builtin_expect(expr, 0)
+ /* Equivalent to (expr) but predict that usually (expr) == 0. */
+#else
+# define AO_EXPECT_FALSE(expr) (expr)
+#endif /* !__GNUC__ */
+
+#if defined(__has_feature)
+ /* __has_feature() is supported. */
+# if __has_feature(address_sanitizer)
+# define AO_ADDRESS_SANITIZER
+# endif
+# if __has_feature(memory_sanitizer)
+# define AO_MEMORY_SANITIZER
+# endif
+# if __has_feature(thread_sanitizer)
+# define AO_THREAD_SANITIZER
+# endif
+#else
+# ifdef __SANITIZE_ADDRESS__
+ /* GCC v4.8+ */
+# define AO_ADDRESS_SANITIZER
+# endif
+#endif /* !__has_feature */
+
+#ifndef AO_ATTR_NO_SANITIZE_MEMORY
+# ifndef AO_MEMORY_SANITIZER
+# define AO_ATTR_NO_SANITIZE_MEMORY /* empty */
+# elif AO_CLANG_PREREQ(3, 8)
+# define AO_ATTR_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
+# else
+# define AO_ATTR_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
+# endif
+#endif /* !AO_ATTR_NO_SANITIZE_MEMORY */
+
+#ifndef AO_ATTR_NO_SANITIZE_THREAD
+# ifndef AO_THREAD_SANITIZER
+# define AO_ATTR_NO_SANITIZE_THREAD /* empty */
+# elif AO_CLANG_PREREQ(3, 8)
+# define AO_ATTR_NO_SANITIZE_THREAD __attribute__((no_sanitize("thread")))
+# else
+# define AO_ATTR_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread))
+# endif
+#endif /* !AO_ATTR_NO_SANITIZE_THREAD */
+
+#if (AO_GNUC_PREREQ(7, 5) || __STDC_VERSION__ >= 201112L) && !defined(LINT2)
+# define AO_ALIGNOF_SUPPORTED 1
+#endif
+
+#if defined(AO_DLL) && !defined(AO_API)
+# ifdef AO_BUILD
+# if defined(__CEGCC__) || (defined(__MINGW32__) && !defined(__cplusplus))
+# define AO_API __declspec(dllexport)
+# elif defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CYGWIN__) \
+ || defined(__DMC__) || defined(__MINGW32__) || defined(__WATCOMC__)
+# define AO_API extern __declspec(dllexport)
+# endif
+# else
+# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CEGCC__) \
+ || defined(__CYGWIN__) || defined(__DMC__)
+# define AO_API __declspec(dllimport)
+# elif defined(__MINGW32_DELAY_LOAD__)
+# define AO_API __declspec(dllexport)
+# elif defined(__MINGW32__) || defined(__WATCOMC__)
+# define AO_API extern __declspec(dllimport)
+# endif
+# endif
+#endif /* AO_DLL */
+
+#ifndef AO_API
+# define AO_API extern
+#endif
+
+#ifdef AO_ALIGNOF_SUPPORTED
+# define AO_ASSERT_ADDR_ALIGNED(addr) \
+ assert(((size_t)(addr) & (__alignof__(*(addr)) - 1)) == 0)
+#else
+# define AO_ASSERT_ADDR_ALIGNED(addr) \
+ assert(((size_t)(addr) & (sizeof(*(addr)) - 1)) == 0)
+#endif /* !AO_ALIGNOF_SUPPORTED */
+
+#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
+# define AO_compiler_barrier() __asm__ __volatile__("" : : : "memory")
+#elif defined(_MSC_VER) || defined(__DMC__) || defined(__BORLANDC__) \
+ || defined(__WATCOMC__)
+# if defined(_AMD64_) || defined(_M_X64) || _MSC_VER >= 1400
+# if defined(_WIN32_WCE)
+/* # include <cmnintrin.h> */
+# elif defined(_MSC_VER)
+# include <intrin.h>
+# endif
+# pragma intrinsic(_ReadWriteBarrier)
+# define AO_compiler_barrier() _ReadWriteBarrier()
+ /* We assume this does not generate a fence instruction. */
+ /* The documentation is a bit unclear. */
+# else
+# define AO_compiler_barrier() __asm { }
+ /* The preceding implementation may be preferable here too. */
+ /* But the documentation warns about VC++ 2003 and earlier. */
+# endif
+#elif defined(__INTEL_COMPILER)
+# define AO_compiler_barrier() __memory_barrier()
+ /* FIXME: Too strong? IA64-only? */
+#elif defined(_HPUX_SOURCE)
+# if defined(__ia64)
+# include <machine/sys/inline.h>
+# define AO_compiler_barrier() _Asm_sched_fence()
+# else
+ /* FIXME - We do not know how to do this. This is a guess. */
+ /* And probably a bad one. */
+ static volatile int AO_barrier_dummy;
+# define AO_compiler_barrier() (void)(AO_barrier_dummy = AO_barrier_dummy)
+# endif
+#else
+ /* We conjecture that the following usually gives us the right */
+ /* semantics or an error. */
+# define AO_compiler_barrier() asm("")
+#endif
+
+#if defined(AO_USE_PTHREAD_DEFS)
+# include "atomic_ops/sysdeps/generic_pthread.h"
+#endif /* AO_USE_PTHREAD_DEFS */
+
+#if (defined(__CC_ARM) || defined(__ARMCC__)) && !defined(__GNUC__) \
+ && !defined(AO_USE_PTHREAD_DEFS)
+# include "atomic_ops/sysdeps/armcc/arm_v6.h"
+# define AO_GENERALIZE_TWICE
+#endif
+
+#if defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS) \
+ && !defined(__INTEL_COMPILER)
+# if defined(__i386__)
+ /* We don't define AO_USE_SYNC_CAS_BUILTIN for x86 here because */
+ /* it might require specifying additional options (like -march) */
+ /* or additional link libraries (if -march is not specified). */
+# include "atomic_ops/sysdeps/gcc/x86.h"
+# elif defined(__x86_64__)
+# if AO_GNUC_PREREQ(4, 2) && !defined(AO_USE_SYNC_CAS_BUILTIN)
+ /* It is safe to use __sync CAS built-in on this architecture. */
+# define AO_USE_SYNC_CAS_BUILTIN
+# endif
+# include "atomic_ops/sysdeps/gcc/x86.h"
+# elif defined(__ia64__)
+# include "atomic_ops/sysdeps/gcc/ia64.h"
+# define AO_GENERALIZE_TWICE
+# elif defined(__hppa__)
+# include "atomic_ops/sysdeps/gcc/hppa.h"
+# define AO_CAN_EMUL_CAS
+# elif defined(__alpha__)
+# include "atomic_ops/sysdeps/gcc/alpha.h"
+# define AO_GENERALIZE_TWICE
+# elif defined(__s390__)
+# include "atomic_ops/sysdeps/gcc/s390.h"
+# elif defined(__sparc__)
+# include "atomic_ops/sysdeps/gcc/sparc.h"
+# define AO_CAN_EMUL_CAS
+# elif defined(__m68k__)
+# include "atomic_ops/sysdeps/gcc/m68k.h"
+# elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) \
+ || defined(__powerpc64__) || defined(__ppc64__) || defined(_ARCH_PPC)
+# include "atomic_ops/sysdeps/gcc/powerpc.h"
+# elif defined(__aarch64__)
+# include "atomic_ops/sysdeps/gcc/aarch64.h"
+# define AO_CAN_EMUL_CAS
+# elif defined(__arm__)
+# include "atomic_ops/sysdeps/gcc/arm.h"
+# define AO_CAN_EMUL_CAS
+# elif defined(__cris__) || defined(CRIS)
+# include "atomic_ops/sysdeps/gcc/cris.h"
+# define AO_CAN_EMUL_CAS
+# define AO_GENERALIZE_TWICE
+# elif defined(__mips__)
+# include "atomic_ops/sysdeps/gcc/mips.h"
+# elif defined(__sh__) || defined(SH4)
+# include "atomic_ops/sysdeps/gcc/sh.h"
+# define AO_CAN_EMUL_CAS
+# elif defined(__avr32__)
+# include "atomic_ops/sysdeps/gcc/avr32.h"
+# elif defined(__e2k__)
+# include "atomic_ops/sysdeps/gcc/e2k.h"
+# elif defined(__hexagon__)
+# include "atomic_ops/sysdeps/gcc/hexagon.h"
+# elif defined(__nios2__)
+# include "atomic_ops/sysdeps/gcc/generic.h"
+# define AO_CAN_EMUL_CAS
+# elif defined(__riscv)
+# include "atomic_ops/sysdeps/gcc/riscv.h"
+# elif defined(__tile__)
+# include "atomic_ops/sysdeps/gcc/tile.h"
+# else /* etc. */
+# include "atomic_ops/sysdeps/gcc/generic.h"
+# endif
+#endif /* __GNUC__ && !AO_USE_PTHREAD_DEFS */
+
+#if (defined(__IBMC__) || defined(__IBMCPP__)) && !defined(__GNUC__) \
+ && !defined(AO_USE_PTHREAD_DEFS)
+# if defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) \
+ || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) \
+ || defined(_ARCH_PWR)
+# include "atomic_ops/sysdeps/ibmc/powerpc.h"
+# define AO_GENERALIZE_TWICE
+# endif
+#endif
+
+#if defined(__INTEL_COMPILER) && !defined(AO_USE_PTHREAD_DEFS)
+# if defined(__ia64__)
+# include "atomic_ops/sysdeps/icc/ia64.h"
+# define AO_GENERALIZE_TWICE
+# endif
+# if defined(__GNUC__)
+ /* Intel Compiler in GCC compatible mode */
+# if defined(__i386__)
+# include "atomic_ops/sysdeps/gcc/x86.h"
+# endif /* __i386__ */
+# if defined(__x86_64__)
+# if (__INTEL_COMPILER > 1110) && !defined(AO_USE_SYNC_CAS_BUILTIN)
+# define AO_USE_SYNC_CAS_BUILTIN
+# endif
+# include "atomic_ops/sysdeps/gcc/x86.h"
+# endif /* __x86_64__ */
+# endif
+#endif
+
+#if defined(_HPUX_SOURCE) && !defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS)
+# if defined(__ia64)
+# include "atomic_ops/sysdeps/hpc/ia64.h"
+# define AO_GENERALIZE_TWICE
+# else
+# include "atomic_ops/sysdeps/hpc/hppa.h"
+# define AO_CAN_EMUL_CAS
+# endif
+#endif
+
+#if defined(_MSC_VER) || defined(__DMC__) || defined(__BORLANDC__) \
+ || (defined(__WATCOMC__) && defined(__NT__))
+# if defined(_AMD64_) || defined(_M_X64)
+# include "atomic_ops/sysdeps/msftc/x86_64.h"
+# elif defined(_M_ARM64)
+# include "atomic_ops/sysdeps/msftc/arm64.h"
+# elif defined(_M_IX86) || defined(x86)
+# include "atomic_ops/sysdeps/msftc/x86.h"
+# elif defined(_M_ARM) || defined(ARM) || defined(_ARM_)
+# include "atomic_ops/sysdeps/msftc/arm.h"
+# define AO_GENERALIZE_TWICE
+# endif
+#endif
+
+#if defined(__sun) && !defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS)
+ /* Note: use -DAO_USE_PTHREAD_DEFS if Sun CC does not handle inline asm. */
+# if defined(__i386) || defined(__x86_64) || defined(__amd64)
+# include "atomic_ops/sysdeps/sunc/x86.h"
+# endif
+#endif
+
+#if !defined(__GNUC__) && (defined(sparc) || defined(__sparc)) \
+ && !defined(AO_USE_PTHREAD_DEFS)
+# include "atomic_ops/sysdeps/sunc/sparc.h"
+# define AO_CAN_EMUL_CAS
+#endif
+
+#if (defined(AO_REQUIRE_CAS) && !defined(AO_HAVE_compare_and_swap) \
+ && !defined(AO_HAVE_fetch_compare_and_swap) \
+ && !defined(AO_HAVE_compare_and_swap_full) \
+ && !defined(AO_HAVE_fetch_compare_and_swap_full) \
+ && !defined(AO_HAVE_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_fetch_compare_and_swap_acquire)) || defined(CPPCHECK)
+# if defined(AO_CAN_EMUL_CAS)
+# include "atomic_ops/sysdeps/emul_cas.h"
+# elif !defined(CPPCHECK)
+# error Cannot implement AO_compare_and_swap_full on this architecture.
+# endif
+#endif /* AO_REQUIRE_CAS && !AO_HAVE_compare_and_swap ... */
+
+/* The most common way to clear a test-and-set location */
+/* at the end of a critical section. */
+#if defined(AO_AO_TS_T) && !defined(AO_HAVE_CLEAR)
+# define AO_CLEAR(addr) AO_store_release((AO_TS_t *)(addr), AO_TS_CLEAR)
+# define AO_HAVE_CLEAR
+#endif
+#if defined(AO_CHAR_TS_T) && !defined(AO_HAVE_CLEAR)
+# define AO_CLEAR(addr) AO_char_store_release((AO_TS_t *)(addr), AO_TS_CLEAR)
+# define AO_HAVE_CLEAR
+#endif
+
+/* The generalization section. */
+#if !defined(AO_GENERALIZE_TWICE) && defined(AO_CAN_EMUL_CAS) \
+ && !defined(AO_HAVE_compare_and_swap_full) \
+ && !defined(AO_HAVE_fetch_compare_and_swap_full)
+# define AO_GENERALIZE_TWICE
+#endif
+
+/* Theoretically we should repeatedly include atomic_ops/generalize.h. */
+/* In fact, we observe that this converges after a small fixed number */
+/* of iterations, usually one. */
+#include "atomic_ops/generalize.h"
+
+#if !defined(AO_GENERALIZE_TWICE) \
+ && defined(AO_HAVE_compare_double_and_swap_double) \
+ && (!defined(AO_HAVE_double_load) || !defined(AO_HAVE_double_store))
+# define AO_GENERALIZE_TWICE
+#endif
+
+#ifdef AO_T_IS_INT
+ /* Included after the first generalization pass. */
+# include "atomic_ops/sysdeps/ao_t_is_int.h"
+# ifndef AO_GENERALIZE_TWICE
+ /* Always generalize again. */
+# define AO_GENERALIZE_TWICE
+# endif
+#endif /* AO_T_IS_INT */
+
+#ifdef AO_GENERALIZE_TWICE
+# include "atomic_ops/generalize.h"
+#endif
+
+/* For compatibility with version 0.4 and earlier */
+#define AO_TS_T AO_TS_t
+#define AO_T AO_t
+#define AO_TS_VAL AO_TS_VAL_t
+
+#endif /* !AO_ATOMIC_OPS_H */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/ao_version.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/ao_version.h
new file mode 100644
index 0000000000..913e62a349
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/ao_version.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2011-2018 Ivan Maidanski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 AO_ATOMIC_OPS_H
+# error This file should not be included directly.
+#endif
+
+/* The policy regarding version numbers: development code has odd */
+/* "minor" number (and "micro" part is 0); when development is finished */
+/* and a release is prepared, "minor" number is incremented (keeping */
+/* "micro" number still zero), whenever a defect is fixed a new release */
+/* is prepared incrementing "micro" part to odd value (the most stable */
+/* release has the biggest "micro" number). */
+
+/* The version here should match that in configure.ac and README. */
+#define AO_VERSION_MAJOR 7
+#define AO_VERSION_MINOR 8
+#define AO_VERSION_MICRO 2 /* 7.8.2 */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-arithm.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-arithm.h
new file mode 100644
index 0000000000..515f52e9e1
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-arithm.h
@@ -0,0 +1,3408 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* char_compare_and_swap (based on fetch_compare_and_swap) */
+#if defined(AO_HAVE_char_fetch_compare_and_swap_full) \
+ && !defined(AO_HAVE_char_compare_and_swap_full)
+ AO_INLINE int
+ AO_char_compare_and_swap_full(volatile unsigned/**/char *addr, unsigned/**/char old_val,
+ unsigned/**/char new_val)
+ {
+ return AO_char_fetch_compare_and_swap_full(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_char_compare_and_swap_full
+#endif
+
+#if defined(AO_HAVE_char_fetch_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_char_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_char_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old_val,
+ unsigned/**/char new_val)
+ {
+ return AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_char_compare_and_swap_acquire
+#endif
+
+#if defined(AO_HAVE_char_fetch_compare_and_swap_release) \
+ && !defined(AO_HAVE_char_compare_and_swap_release)
+ AO_INLINE int
+ AO_char_compare_and_swap_release(volatile unsigned/**/char *addr, unsigned/**/char old_val,
+ unsigned/**/char new_val)
+ {
+ return AO_char_fetch_compare_and_swap_release(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_char_compare_and_swap_release
+#endif
+
+#if defined(AO_HAVE_char_fetch_compare_and_swap_write) \
+ && !defined(AO_HAVE_char_compare_and_swap_write)
+ AO_INLINE int
+ AO_char_compare_and_swap_write(volatile unsigned/**/char *addr, unsigned/**/char old_val,
+ unsigned/**/char new_val)
+ {
+ return AO_char_fetch_compare_and_swap_write(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_char_compare_and_swap_write
+#endif
+
+#if defined(AO_HAVE_char_fetch_compare_and_swap_read) \
+ && !defined(AO_HAVE_char_compare_and_swap_read)
+ AO_INLINE int
+ AO_char_compare_and_swap_read(volatile unsigned/**/char *addr, unsigned/**/char old_val,
+ unsigned/**/char new_val)
+ {
+ return AO_char_fetch_compare_and_swap_read(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_char_compare_and_swap_read
+#endif
+
+#if defined(AO_HAVE_char_fetch_compare_and_swap) \
+ && !defined(AO_HAVE_char_compare_and_swap)
+ AO_INLINE int
+ AO_char_compare_and_swap(volatile unsigned/**/char *addr, unsigned/**/char old_val,
+ unsigned/**/char new_val)
+ {
+ return AO_char_fetch_compare_and_swap(addr, old_val, new_val) == old_val;
+ }
+# define AO_HAVE_char_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \
+ && !defined(AO_HAVE_char_compare_and_swap_release_write)
+ AO_INLINE int
+ AO_char_compare_and_swap_release_write(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ return AO_char_fetch_compare_and_swap_release_write(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_char_compare_and_swap_release_write
+#endif
+
+#if defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \
+ && !defined(AO_HAVE_char_compare_and_swap_acquire_read)
+ AO_INLINE int
+ AO_char_compare_and_swap_acquire_read(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ return AO_char_fetch_compare_and_swap_acquire_read(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_char_compare_and_swap_acquire_read
+#endif
+
+#if defined(AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read) \
+ && !defined(AO_HAVE_char_compare_and_swap_dd_acquire_read)
+ AO_INLINE int
+ AO_char_compare_and_swap_dd_acquire_read(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ return AO_char_fetch_compare_and_swap_dd_acquire_read(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_char_compare_and_swap_dd_acquire_read
+#endif
+
+/* char_fetch_and_add */
+/* We first try to implement fetch_and_add variants in terms of the */
+/* corresponding compare_and_swap variants to minimize adding barriers. */
+#if defined(AO_HAVE_char_compare_and_swap_full) \
+ && !defined(AO_HAVE_char_fetch_and_add_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_and_add_full(volatile unsigned/**/char *addr, unsigned/**/char incr)
+ {
+ unsigned/**/char old;
+
+ do
+ {
+ old = *(unsigned/**/char *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_char_fetch_and_add_full
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_char_fetch_and_add_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_and_add_acquire(volatile unsigned/**/char *addr, unsigned/**/char incr)
+ {
+ unsigned/**/char old;
+
+ do
+ {
+ old = *(unsigned/**/char *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_acquire(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_char_fetch_and_add_acquire
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap_release) \
+ && !defined(AO_HAVE_char_fetch_and_add_release)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_and_add_release(volatile unsigned/**/char *addr, unsigned/**/char incr)
+ {
+ unsigned/**/char old;
+
+ do
+ {
+ old = *(unsigned/**/char *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_release(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_char_fetch_and_add_release
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap) \
+ && !defined(AO_HAVE_char_fetch_and_add)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_and_add(volatile unsigned/**/char *addr, unsigned/**/char incr)
+ {
+ unsigned/**/char old;
+
+ do
+ {
+ old = *(unsigned/**/char *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_char_compare_and_swap(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_char_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_char_fetch_and_add_full)
+# if !defined(AO_HAVE_char_fetch_and_add_release)
+# define AO_char_fetch_and_add_release(addr, val) \
+ AO_char_fetch_and_add_full(addr, val)
+# define AO_HAVE_char_fetch_and_add_release
+# endif
+# if !defined(AO_HAVE_char_fetch_and_add_acquire)
+# define AO_char_fetch_and_add_acquire(addr, val) \
+ AO_char_fetch_and_add_full(addr, val)
+# define AO_HAVE_char_fetch_and_add_acquire
+# endif
+# if !defined(AO_HAVE_char_fetch_and_add_write)
+# define AO_char_fetch_and_add_write(addr, val) \
+ AO_char_fetch_and_add_full(addr, val)
+# define AO_HAVE_char_fetch_and_add_write
+# endif
+# if !defined(AO_HAVE_char_fetch_and_add_read)
+# define AO_char_fetch_and_add_read(addr, val) \
+ AO_char_fetch_and_add_full(addr, val)
+# define AO_HAVE_char_fetch_and_add_read
+# endif
+#endif /* AO_HAVE_char_fetch_and_add_full */
+
+#if defined(AO_HAVE_char_fetch_and_add) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_fetch_and_add_acquire)
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_and_add_acquire(volatile unsigned/**/char *addr, unsigned/**/char incr)
+ {
+ unsigned/**/char result = AO_char_fetch_and_add(addr, incr);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_char_fetch_and_add_acquire
+#endif
+#if defined(AO_HAVE_char_fetch_and_add) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_fetch_and_add_release)
+# define AO_char_fetch_and_add_release(addr, incr) \
+ (AO_nop_full(), AO_char_fetch_and_add(addr, incr))
+# define AO_HAVE_char_fetch_and_add_release
+#endif
+
+#if !defined(AO_HAVE_char_fetch_and_add) \
+ && defined(AO_HAVE_char_fetch_and_add_release)
+# define AO_char_fetch_and_add(addr, val) \
+ AO_char_fetch_and_add_release(addr, val)
+# define AO_HAVE_char_fetch_and_add
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add) \
+ && defined(AO_HAVE_char_fetch_and_add_acquire)
+# define AO_char_fetch_and_add(addr, val) \
+ AO_char_fetch_and_add_acquire(addr, val)
+# define AO_HAVE_char_fetch_and_add
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add) \
+ && defined(AO_HAVE_char_fetch_and_add_write)
+# define AO_char_fetch_and_add(addr, val) \
+ AO_char_fetch_and_add_write(addr, val)
+# define AO_HAVE_char_fetch_and_add
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add) \
+ && defined(AO_HAVE_char_fetch_and_add_read)
+# define AO_char_fetch_and_add(addr, val) \
+ AO_char_fetch_and_add_read(addr, val)
+# define AO_HAVE_char_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_char_fetch_and_add_acquire) \
+ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_char_fetch_and_add_full)
+# define AO_char_fetch_and_add_full(addr, val) \
+ (AO_nop_full(), AO_char_fetch_and_add_acquire(addr, val))
+# define AO_HAVE_char_fetch_and_add_full
+#endif
+
+#if !defined(AO_HAVE_char_fetch_and_add_release_write) \
+ && defined(AO_HAVE_char_fetch_and_add_write)
+# define AO_char_fetch_and_add_release_write(addr, val) \
+ AO_char_fetch_and_add_write(addr, val)
+# define AO_HAVE_char_fetch_and_add_release_write
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add_release_write) \
+ && defined(AO_HAVE_char_fetch_and_add_release)
+# define AO_char_fetch_and_add_release_write(addr, val) \
+ AO_char_fetch_and_add_release(addr, val)
+# define AO_HAVE_char_fetch_and_add_release_write
+#endif
+
+#if !defined(AO_HAVE_char_fetch_and_add_acquire_read) \
+ && defined(AO_HAVE_char_fetch_and_add_read)
+# define AO_char_fetch_and_add_acquire_read(addr, val) \
+ AO_char_fetch_and_add_read(addr, val)
+# define AO_HAVE_char_fetch_and_add_acquire_read
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add_acquire_read) \
+ && defined(AO_HAVE_char_fetch_and_add_acquire)
+# define AO_char_fetch_and_add_acquire_read(addr, val) \
+ AO_char_fetch_and_add_acquire(addr, val)
+# define AO_HAVE_char_fetch_and_add_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_char_fetch_and_add_acquire_read)
+# define AO_char_fetch_and_add_dd_acquire_read(addr, val) \
+ AO_char_fetch_and_add_acquire_read(addr, val)
+# define AO_HAVE_char_fetch_and_add_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_char_fetch_and_add)
+# define AO_char_fetch_and_add_dd_acquire_read(addr, val) \
+ AO_char_fetch_and_add(addr, val)
+# define AO_HAVE_char_fetch_and_add_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* char_fetch_and_add1 */
+#if defined(AO_HAVE_char_fetch_and_add_full) \
+ && !defined(AO_HAVE_char_fetch_and_add1_full)
+# define AO_char_fetch_and_add1_full(addr) \
+ AO_char_fetch_and_add_full(addr, 1)
+# define AO_HAVE_char_fetch_and_add1_full
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_release) \
+ && !defined(AO_HAVE_char_fetch_and_add1_release)
+# define AO_char_fetch_and_add1_release(addr) \
+ AO_char_fetch_and_add_release(addr, 1)
+# define AO_HAVE_char_fetch_and_add1_release
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_char_fetch_and_add1_acquire)
+# define AO_char_fetch_and_add1_acquire(addr) \
+ AO_char_fetch_and_add_acquire(addr, 1)
+# define AO_HAVE_char_fetch_and_add1_acquire
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_write) \
+ && !defined(AO_HAVE_char_fetch_and_add1_write)
+# define AO_char_fetch_and_add1_write(addr) \
+ AO_char_fetch_and_add_write(addr, 1)
+# define AO_HAVE_char_fetch_and_add1_write
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_read) \
+ && !defined(AO_HAVE_char_fetch_and_add1_read)
+# define AO_char_fetch_and_add1_read(addr) \
+ AO_char_fetch_and_add_read(addr, 1)
+# define AO_HAVE_char_fetch_and_add1_read
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_release_write) \
+ && !defined(AO_HAVE_char_fetch_and_add1_release_write)
+# define AO_char_fetch_and_add1_release_write(addr) \
+ AO_char_fetch_and_add_release_write(addr, 1)
+# define AO_HAVE_char_fetch_and_add1_release_write
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_acquire_read) \
+ && !defined(AO_HAVE_char_fetch_and_add1_acquire_read)
+# define AO_char_fetch_and_add1_acquire_read(addr) \
+ AO_char_fetch_and_add_acquire_read(addr, 1)
+# define AO_HAVE_char_fetch_and_add1_acquire_read
+#endif
+#if defined(AO_HAVE_char_fetch_and_add) \
+ && !defined(AO_HAVE_char_fetch_and_add1)
+# define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add(addr, 1)
+# define AO_HAVE_char_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_char_fetch_and_add1_full)
+# if !defined(AO_HAVE_char_fetch_and_add1_release)
+# define AO_char_fetch_and_add1_release(addr) \
+ AO_char_fetch_and_add1_full(addr)
+# define AO_HAVE_char_fetch_and_add1_release
+# endif
+# if !defined(AO_HAVE_char_fetch_and_add1_acquire)
+# define AO_char_fetch_and_add1_acquire(addr) \
+ AO_char_fetch_and_add1_full(addr)
+# define AO_HAVE_char_fetch_and_add1_acquire
+# endif
+# if !defined(AO_HAVE_char_fetch_and_add1_write)
+# define AO_char_fetch_and_add1_write(addr) \
+ AO_char_fetch_and_add1_full(addr)
+# define AO_HAVE_char_fetch_and_add1_write
+# endif
+# if !defined(AO_HAVE_char_fetch_and_add1_read)
+# define AO_char_fetch_and_add1_read(addr) \
+ AO_char_fetch_and_add1_full(addr)
+# define AO_HAVE_char_fetch_and_add1_read
+# endif
+#endif /* AO_HAVE_char_fetch_and_add1_full */
+
+#if !defined(AO_HAVE_char_fetch_and_add1) \
+ && defined(AO_HAVE_char_fetch_and_add1_release)
+# define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_release(addr)
+# define AO_HAVE_char_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add1) \
+ && defined(AO_HAVE_char_fetch_and_add1_acquire)
+# define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_acquire(addr)
+# define AO_HAVE_char_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add1) \
+ && defined(AO_HAVE_char_fetch_and_add1_write)
+# define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_write(addr)
+# define AO_HAVE_char_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add1) \
+ && defined(AO_HAVE_char_fetch_and_add1_read)
+# define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_read(addr)
+# define AO_HAVE_char_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_char_fetch_and_add1_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_fetch_and_add1_full)
+# define AO_char_fetch_and_add1_full(addr) \
+ (AO_nop_full(), AO_char_fetch_and_add1_acquire(addr))
+# define AO_HAVE_char_fetch_and_add1_full
+#endif
+
+#if !defined(AO_HAVE_char_fetch_and_add1_release_write) \
+ && defined(AO_HAVE_char_fetch_and_add1_write)
+# define AO_char_fetch_and_add1_release_write(addr) \
+ AO_char_fetch_and_add1_write(addr)
+# define AO_HAVE_char_fetch_and_add1_release_write
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add1_release_write) \
+ && defined(AO_HAVE_char_fetch_and_add1_release)
+# define AO_char_fetch_and_add1_release_write(addr) \
+ AO_char_fetch_and_add1_release(addr)
+# define AO_HAVE_char_fetch_and_add1_release_write
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add1_acquire_read) \
+ && defined(AO_HAVE_char_fetch_and_add1_read)
+# define AO_char_fetch_and_add1_acquire_read(addr) \
+ AO_char_fetch_and_add1_read(addr)
+# define AO_HAVE_char_fetch_and_add1_acquire_read
+#endif
+#if !defined(AO_HAVE_char_fetch_and_add1_acquire_read) \
+ && defined(AO_HAVE_char_fetch_and_add1_acquire)
+# define AO_char_fetch_and_add1_acquire_read(addr) \
+ AO_char_fetch_and_add1_acquire(addr)
+# define AO_HAVE_char_fetch_and_add1_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_char_fetch_and_add1_acquire_read)
+# define AO_char_fetch_and_add1_dd_acquire_read(addr) \
+ AO_char_fetch_and_add1_acquire_read(addr)
+# define AO_HAVE_char_fetch_and_add1_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_char_fetch_and_add1)
+# define AO_char_fetch_and_add1_dd_acquire_read(addr) \
+ AO_char_fetch_and_add1(addr)
+# define AO_HAVE_char_fetch_and_add1_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* char_fetch_and_sub1 */
+#if defined(AO_HAVE_char_fetch_and_add_full) \
+ && !defined(AO_HAVE_char_fetch_and_sub1_full)
+# define AO_char_fetch_and_sub1_full(addr) \
+ AO_char_fetch_and_add_full(addr, (unsigned/**/char)(-1))
+# define AO_HAVE_char_fetch_and_sub1_full
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_release) \
+ && !defined(AO_HAVE_char_fetch_and_sub1_release)
+# define AO_char_fetch_and_sub1_release(addr) \
+ AO_char_fetch_and_add_release(addr, (unsigned/**/char)(-1))
+# define AO_HAVE_char_fetch_and_sub1_release
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_char_fetch_and_sub1_acquire)
+# define AO_char_fetch_and_sub1_acquire(addr) \
+ AO_char_fetch_and_add_acquire(addr, (unsigned/**/char)(-1))
+# define AO_HAVE_char_fetch_and_sub1_acquire
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_write) \
+ && !defined(AO_HAVE_char_fetch_and_sub1_write)
+# define AO_char_fetch_and_sub1_write(addr) \
+ AO_char_fetch_and_add_write(addr, (unsigned/**/char)(-1))
+# define AO_HAVE_char_fetch_and_sub1_write
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_read) \
+ && !defined(AO_HAVE_char_fetch_and_sub1_read)
+# define AO_char_fetch_and_sub1_read(addr) \
+ AO_char_fetch_and_add_read(addr, (unsigned/**/char)(-1))
+# define AO_HAVE_char_fetch_and_sub1_read
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_release_write) \
+ && !defined(AO_HAVE_char_fetch_and_sub1_release_write)
+# define AO_char_fetch_and_sub1_release_write(addr) \
+ AO_char_fetch_and_add_release_write(addr, (unsigned/**/char)(-1))
+# define AO_HAVE_char_fetch_and_sub1_release_write
+#endif
+#if defined(AO_HAVE_char_fetch_and_add_acquire_read) \
+ && !defined(AO_HAVE_char_fetch_and_sub1_acquire_read)
+# define AO_char_fetch_and_sub1_acquire_read(addr) \
+ AO_char_fetch_and_add_acquire_read(addr, (unsigned/**/char)(-1))
+# define AO_HAVE_char_fetch_and_sub1_acquire_read
+#endif
+#if defined(AO_HAVE_char_fetch_and_add) \
+ && !defined(AO_HAVE_char_fetch_and_sub1)
+# define AO_char_fetch_and_sub1(addr) \
+ AO_char_fetch_and_add(addr, (unsigned/**/char)(-1))
+# define AO_HAVE_char_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_char_fetch_and_sub1_full)
+# if !defined(AO_HAVE_char_fetch_and_sub1_release)
+# define AO_char_fetch_and_sub1_release(addr) \
+ AO_char_fetch_and_sub1_full(addr)
+# define AO_HAVE_char_fetch_and_sub1_release
+# endif
+# if !defined(AO_HAVE_char_fetch_and_sub1_acquire)
+# define AO_char_fetch_and_sub1_acquire(addr) \
+ AO_char_fetch_and_sub1_full(addr)
+# define AO_HAVE_char_fetch_and_sub1_acquire
+# endif
+# if !defined(AO_HAVE_char_fetch_and_sub1_write)
+# define AO_char_fetch_and_sub1_write(addr) \
+ AO_char_fetch_and_sub1_full(addr)
+# define AO_HAVE_char_fetch_and_sub1_write
+# endif
+# if !defined(AO_HAVE_char_fetch_and_sub1_read)
+# define AO_char_fetch_and_sub1_read(addr) \
+ AO_char_fetch_and_sub1_full(addr)
+# define AO_HAVE_char_fetch_and_sub1_read
+# endif
+#endif /* AO_HAVE_char_fetch_and_sub1_full */
+
+#if !defined(AO_HAVE_char_fetch_and_sub1) \
+ && defined(AO_HAVE_char_fetch_and_sub1_release)
+# define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_release(addr)
+# define AO_HAVE_char_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_char_fetch_and_sub1) \
+ && defined(AO_HAVE_char_fetch_and_sub1_acquire)
+# define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_acquire(addr)
+# define AO_HAVE_char_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_char_fetch_and_sub1) \
+ && defined(AO_HAVE_char_fetch_and_sub1_write)
+# define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_write(addr)
+# define AO_HAVE_char_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_char_fetch_and_sub1) \
+ && defined(AO_HAVE_char_fetch_and_sub1_read)
+# define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_read(addr)
+# define AO_HAVE_char_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_char_fetch_and_sub1_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_fetch_and_sub1_full)
+# define AO_char_fetch_and_sub1_full(addr) \
+ (AO_nop_full(), AO_char_fetch_and_sub1_acquire(addr))
+# define AO_HAVE_char_fetch_and_sub1_full
+#endif
+
+#if !defined(AO_HAVE_char_fetch_and_sub1_release_write) \
+ && defined(AO_HAVE_char_fetch_and_sub1_write)
+# define AO_char_fetch_and_sub1_release_write(addr) \
+ AO_char_fetch_and_sub1_write(addr)
+# define AO_HAVE_char_fetch_and_sub1_release_write
+#endif
+#if !defined(AO_HAVE_char_fetch_and_sub1_release_write) \
+ && defined(AO_HAVE_char_fetch_and_sub1_release)
+# define AO_char_fetch_and_sub1_release_write(addr) \
+ AO_char_fetch_and_sub1_release(addr)
+# define AO_HAVE_char_fetch_and_sub1_release_write
+#endif
+#if !defined(AO_HAVE_char_fetch_and_sub1_acquire_read) \
+ && defined(AO_HAVE_char_fetch_and_sub1_read)
+# define AO_char_fetch_and_sub1_acquire_read(addr) \
+ AO_char_fetch_and_sub1_read(addr)
+# define AO_HAVE_char_fetch_and_sub1_acquire_read
+#endif
+#if !defined(AO_HAVE_char_fetch_and_sub1_acquire_read) \
+ && defined(AO_HAVE_char_fetch_and_sub1_acquire)
+# define AO_char_fetch_and_sub1_acquire_read(addr) \
+ AO_char_fetch_and_sub1_acquire(addr)
+# define AO_HAVE_char_fetch_and_sub1_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_char_fetch_and_sub1_acquire_read)
+# define AO_char_fetch_and_sub1_dd_acquire_read(addr) \
+ AO_char_fetch_and_sub1_acquire_read(addr)
+# define AO_HAVE_char_fetch_and_sub1_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_char_fetch_and_sub1)
+# define AO_char_fetch_and_sub1_dd_acquire_read(addr) \
+ AO_char_fetch_and_sub1(addr)
+# define AO_HAVE_char_fetch_and_sub1_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* char_and */
+#if defined(AO_HAVE_char_compare_and_swap_full) \
+ && !defined(AO_HAVE_char_and_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_char_and_full(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ unsigned/**/char old;
+
+ do
+ {
+ old = *(unsigned/**/char *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old,
+ old & value)));
+ }
+# define AO_HAVE_char_and_full
+#endif
+
+#if defined(AO_HAVE_char_and_full)
+# if !defined(AO_HAVE_char_and_release)
+# define AO_char_and_release(addr, val) AO_char_and_full(addr, val)
+# define AO_HAVE_char_and_release
+# endif
+# if !defined(AO_HAVE_char_and_acquire)
+# define AO_char_and_acquire(addr, val) AO_char_and_full(addr, val)
+# define AO_HAVE_char_and_acquire
+# endif
+# if !defined(AO_HAVE_char_and_write)
+# define AO_char_and_write(addr, val) AO_char_and_full(addr, val)
+# define AO_HAVE_char_and_write
+# endif
+# if !defined(AO_HAVE_char_and_read)
+# define AO_char_and_read(addr, val) AO_char_and_full(addr, val)
+# define AO_HAVE_char_and_read
+# endif
+#endif /* AO_HAVE_char_and_full */
+
+#if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_release)
+# define AO_char_and(addr, val) AO_char_and_release(addr, val)
+# define AO_HAVE_char_and
+#endif
+#if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_acquire)
+# define AO_char_and(addr, val) AO_char_and_acquire(addr, val)
+# define AO_HAVE_char_and
+#endif
+#if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_write)
+# define AO_char_and(addr, val) AO_char_and_write(addr, val)
+# define AO_HAVE_char_and
+#endif
+#if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_read)
+# define AO_char_and(addr, val) AO_char_and_read(addr, val)
+# define AO_HAVE_char_and
+#endif
+
+#if defined(AO_HAVE_char_and_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_and_full)
+# define AO_char_and_full(addr, val) \
+ (AO_nop_full(), AO_char_and_acquire(addr, val))
+# define AO_HAVE_char_and_full
+#endif
+
+#if !defined(AO_HAVE_char_and_release_write) \
+ && defined(AO_HAVE_char_and_write)
+# define AO_char_and_release_write(addr, val) AO_char_and_write(addr, val)
+# define AO_HAVE_char_and_release_write
+#endif
+#if !defined(AO_HAVE_char_and_release_write) \
+ && defined(AO_HAVE_char_and_release)
+# define AO_char_and_release_write(addr, val) AO_char_and_release(addr, val)
+# define AO_HAVE_char_and_release_write
+#endif
+#if !defined(AO_HAVE_char_and_acquire_read) \
+ && defined(AO_HAVE_char_and_read)
+# define AO_char_and_acquire_read(addr, val) AO_char_and_read(addr, val)
+# define AO_HAVE_char_and_acquire_read
+#endif
+#if !defined(AO_HAVE_char_and_acquire_read) \
+ && defined(AO_HAVE_char_and_acquire)
+# define AO_char_and_acquire_read(addr, val) AO_char_and_acquire(addr, val)
+# define AO_HAVE_char_and_acquire_read
+#endif
+
+/* char_or */
+#if defined(AO_HAVE_char_compare_and_swap_full) \
+ && !defined(AO_HAVE_char_or_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_char_or_full(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ unsigned/**/char old;
+
+ do
+ {
+ old = *(unsigned/**/char *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old,
+ old | value)));
+ }
+# define AO_HAVE_char_or_full
+#endif
+
+#if defined(AO_HAVE_char_or_full)
+# if !defined(AO_HAVE_char_or_release)
+# define AO_char_or_release(addr, val) AO_char_or_full(addr, val)
+# define AO_HAVE_char_or_release
+# endif
+# if !defined(AO_HAVE_char_or_acquire)
+# define AO_char_or_acquire(addr, val) AO_char_or_full(addr, val)
+# define AO_HAVE_char_or_acquire
+# endif
+# if !defined(AO_HAVE_char_or_write)
+# define AO_char_or_write(addr, val) AO_char_or_full(addr, val)
+# define AO_HAVE_char_or_write
+# endif
+# if !defined(AO_HAVE_char_or_read)
+# define AO_char_or_read(addr, val) AO_char_or_full(addr, val)
+# define AO_HAVE_char_or_read
+# endif
+#endif /* AO_HAVE_char_or_full */
+
+#if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_release)
+# define AO_char_or(addr, val) AO_char_or_release(addr, val)
+# define AO_HAVE_char_or
+#endif
+#if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_acquire)
+# define AO_char_or(addr, val) AO_char_or_acquire(addr, val)
+# define AO_HAVE_char_or
+#endif
+#if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_write)
+# define AO_char_or(addr, val) AO_char_or_write(addr, val)
+# define AO_HAVE_char_or
+#endif
+#if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_read)
+# define AO_char_or(addr, val) AO_char_or_read(addr, val)
+# define AO_HAVE_char_or
+#endif
+
+#if defined(AO_HAVE_char_or_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_or_full)
+# define AO_char_or_full(addr, val) \
+ (AO_nop_full(), AO_char_or_acquire(addr, val))
+# define AO_HAVE_char_or_full
+#endif
+
+#if !defined(AO_HAVE_char_or_release_write) \
+ && defined(AO_HAVE_char_or_write)
+# define AO_char_or_release_write(addr, val) AO_char_or_write(addr, val)
+# define AO_HAVE_char_or_release_write
+#endif
+#if !defined(AO_HAVE_char_or_release_write) \
+ && defined(AO_HAVE_char_or_release)
+# define AO_char_or_release_write(addr, val) AO_char_or_release(addr, val)
+# define AO_HAVE_char_or_release_write
+#endif
+#if !defined(AO_HAVE_char_or_acquire_read) && defined(AO_HAVE_char_or_read)
+# define AO_char_or_acquire_read(addr, val) AO_char_or_read(addr, val)
+# define AO_HAVE_char_or_acquire_read
+#endif
+#if !defined(AO_HAVE_char_or_acquire_read) \
+ && defined(AO_HAVE_char_or_acquire)
+# define AO_char_or_acquire_read(addr, val) AO_char_or_acquire(addr, val)
+# define AO_HAVE_char_or_acquire_read
+#endif
+
+/* char_xor */
+#if defined(AO_HAVE_char_compare_and_swap_full) \
+ && !defined(AO_HAVE_char_xor_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_char_xor_full(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ unsigned/**/char old;
+
+ do
+ {
+ old = *(unsigned/**/char *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old,
+ old ^ value)));
+ }
+# define AO_HAVE_char_xor_full
+#endif
+
+#if defined(AO_HAVE_char_xor_full)
+# if !defined(AO_HAVE_char_xor_release)
+# define AO_char_xor_release(addr, val) AO_char_xor_full(addr, val)
+# define AO_HAVE_char_xor_release
+# endif
+# if !defined(AO_HAVE_char_xor_acquire)
+# define AO_char_xor_acquire(addr, val) AO_char_xor_full(addr, val)
+# define AO_HAVE_char_xor_acquire
+# endif
+# if !defined(AO_HAVE_char_xor_write)
+# define AO_char_xor_write(addr, val) AO_char_xor_full(addr, val)
+# define AO_HAVE_char_xor_write
+# endif
+# if !defined(AO_HAVE_char_xor_read)
+# define AO_char_xor_read(addr, val) AO_char_xor_full(addr, val)
+# define AO_HAVE_char_xor_read
+# endif
+#endif /* AO_HAVE_char_xor_full */
+
+#if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_release)
+# define AO_char_xor(addr, val) AO_char_xor_release(addr, val)
+# define AO_HAVE_char_xor
+#endif
+#if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_acquire)
+# define AO_char_xor(addr, val) AO_char_xor_acquire(addr, val)
+# define AO_HAVE_char_xor
+#endif
+#if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_write)
+# define AO_char_xor(addr, val) AO_char_xor_write(addr, val)
+# define AO_HAVE_char_xor
+#endif
+#if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_read)
+# define AO_char_xor(addr, val) AO_char_xor_read(addr, val)
+# define AO_HAVE_char_xor
+#endif
+
+#if defined(AO_HAVE_char_xor_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_xor_full)
+# define AO_char_xor_full(addr, val) \
+ (AO_nop_full(), AO_char_xor_acquire(addr, val))
+# define AO_HAVE_char_xor_full
+#endif
+
+#if !defined(AO_HAVE_char_xor_release_write) \
+ && defined(AO_HAVE_char_xor_write)
+# define AO_char_xor_release_write(addr, val) AO_char_xor_write(addr, val)
+# define AO_HAVE_char_xor_release_write
+#endif
+#if !defined(AO_HAVE_char_xor_release_write) \
+ && defined(AO_HAVE_char_xor_release)
+# define AO_char_xor_release_write(addr, val) AO_char_xor_release(addr, val)
+# define AO_HAVE_char_xor_release_write
+#endif
+#if !defined(AO_HAVE_char_xor_acquire_read) \
+ && defined(AO_HAVE_char_xor_read)
+# define AO_char_xor_acquire_read(addr, val) AO_char_xor_read(addr, val)
+# define AO_HAVE_char_xor_acquire_read
+#endif
+#if !defined(AO_HAVE_char_xor_acquire_read) \
+ && defined(AO_HAVE_char_xor_acquire)
+# define AO_char_xor_acquire_read(addr, val) AO_char_xor_acquire(addr, val)
+# define AO_HAVE_char_xor_acquire_read
+#endif
+
+/* char_and/or/xor_dd_acquire_read are meaningless. */
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* short_compare_and_swap (based on fetch_compare_and_swap) */
+#if defined(AO_HAVE_short_fetch_compare_and_swap_full) \
+ && !defined(AO_HAVE_short_compare_and_swap_full)
+ AO_INLINE int
+ AO_short_compare_and_swap_full(volatile unsigned/**/short *addr, unsigned/**/short old_val,
+ unsigned/**/short new_val)
+ {
+ return AO_short_fetch_compare_and_swap_full(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_short_compare_and_swap_full
+#endif
+
+#if defined(AO_HAVE_short_fetch_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_short_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_short_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old_val,
+ unsigned/**/short new_val)
+ {
+ return AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_short_compare_and_swap_acquire
+#endif
+
+#if defined(AO_HAVE_short_fetch_compare_and_swap_release) \
+ && !defined(AO_HAVE_short_compare_and_swap_release)
+ AO_INLINE int
+ AO_short_compare_and_swap_release(volatile unsigned/**/short *addr, unsigned/**/short old_val,
+ unsigned/**/short new_val)
+ {
+ return AO_short_fetch_compare_and_swap_release(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_short_compare_and_swap_release
+#endif
+
+#if defined(AO_HAVE_short_fetch_compare_and_swap_write) \
+ && !defined(AO_HAVE_short_compare_and_swap_write)
+ AO_INLINE int
+ AO_short_compare_and_swap_write(volatile unsigned/**/short *addr, unsigned/**/short old_val,
+ unsigned/**/short new_val)
+ {
+ return AO_short_fetch_compare_and_swap_write(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_short_compare_and_swap_write
+#endif
+
+#if defined(AO_HAVE_short_fetch_compare_and_swap_read) \
+ && !defined(AO_HAVE_short_compare_and_swap_read)
+ AO_INLINE int
+ AO_short_compare_and_swap_read(volatile unsigned/**/short *addr, unsigned/**/short old_val,
+ unsigned/**/short new_val)
+ {
+ return AO_short_fetch_compare_and_swap_read(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_short_compare_and_swap_read
+#endif
+
+#if defined(AO_HAVE_short_fetch_compare_and_swap) \
+ && !defined(AO_HAVE_short_compare_and_swap)
+ AO_INLINE int
+ AO_short_compare_and_swap(volatile unsigned/**/short *addr, unsigned/**/short old_val,
+ unsigned/**/short new_val)
+ {
+ return AO_short_fetch_compare_and_swap(addr, old_val, new_val) == old_val;
+ }
+# define AO_HAVE_short_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \
+ && !defined(AO_HAVE_short_compare_and_swap_release_write)
+ AO_INLINE int
+ AO_short_compare_and_swap_release_write(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ return AO_short_fetch_compare_and_swap_release_write(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_short_compare_and_swap_release_write
+#endif
+
+#if defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \
+ && !defined(AO_HAVE_short_compare_and_swap_acquire_read)
+ AO_INLINE int
+ AO_short_compare_and_swap_acquire_read(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ return AO_short_fetch_compare_and_swap_acquire_read(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_short_compare_and_swap_acquire_read
+#endif
+
+#if defined(AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read) \
+ && !defined(AO_HAVE_short_compare_and_swap_dd_acquire_read)
+ AO_INLINE int
+ AO_short_compare_and_swap_dd_acquire_read(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ return AO_short_fetch_compare_and_swap_dd_acquire_read(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_short_compare_and_swap_dd_acquire_read
+#endif
+
+/* short_fetch_and_add */
+/* We first try to implement fetch_and_add variants in terms of the */
+/* corresponding compare_and_swap variants to minimize adding barriers. */
+#if defined(AO_HAVE_short_compare_and_swap_full) \
+ && !defined(AO_HAVE_short_fetch_and_add_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_and_add_full(volatile unsigned/**/short *addr, unsigned/**/short incr)
+ {
+ unsigned/**/short old;
+
+ do
+ {
+ old = *(unsigned/**/short *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_short_fetch_and_add_full
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_short_fetch_and_add_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_and_add_acquire(volatile unsigned/**/short *addr, unsigned/**/short incr)
+ {
+ unsigned/**/short old;
+
+ do
+ {
+ old = *(unsigned/**/short *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_acquire(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_short_fetch_and_add_acquire
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap_release) \
+ && !defined(AO_HAVE_short_fetch_and_add_release)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_and_add_release(volatile unsigned/**/short *addr, unsigned/**/short incr)
+ {
+ unsigned/**/short old;
+
+ do
+ {
+ old = *(unsigned/**/short *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_release(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_short_fetch_and_add_release
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap) \
+ && !defined(AO_HAVE_short_fetch_and_add)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_and_add(volatile unsigned/**/short *addr, unsigned/**/short incr)
+ {
+ unsigned/**/short old;
+
+ do
+ {
+ old = *(unsigned/**/short *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_short_compare_and_swap(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_short_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_short_fetch_and_add_full)
+# if !defined(AO_HAVE_short_fetch_and_add_release)
+# define AO_short_fetch_and_add_release(addr, val) \
+ AO_short_fetch_and_add_full(addr, val)
+# define AO_HAVE_short_fetch_and_add_release
+# endif
+# if !defined(AO_HAVE_short_fetch_and_add_acquire)
+# define AO_short_fetch_and_add_acquire(addr, val) \
+ AO_short_fetch_and_add_full(addr, val)
+# define AO_HAVE_short_fetch_and_add_acquire
+# endif
+# if !defined(AO_HAVE_short_fetch_and_add_write)
+# define AO_short_fetch_and_add_write(addr, val) \
+ AO_short_fetch_and_add_full(addr, val)
+# define AO_HAVE_short_fetch_and_add_write
+# endif
+# if !defined(AO_HAVE_short_fetch_and_add_read)
+# define AO_short_fetch_and_add_read(addr, val) \
+ AO_short_fetch_and_add_full(addr, val)
+# define AO_HAVE_short_fetch_and_add_read
+# endif
+#endif /* AO_HAVE_short_fetch_and_add_full */
+
+#if defined(AO_HAVE_short_fetch_and_add) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_fetch_and_add_acquire)
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_and_add_acquire(volatile unsigned/**/short *addr, unsigned/**/short incr)
+ {
+ unsigned/**/short result = AO_short_fetch_and_add(addr, incr);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_short_fetch_and_add_acquire
+#endif
+#if defined(AO_HAVE_short_fetch_and_add) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_fetch_and_add_release)
+# define AO_short_fetch_and_add_release(addr, incr) \
+ (AO_nop_full(), AO_short_fetch_and_add(addr, incr))
+# define AO_HAVE_short_fetch_and_add_release
+#endif
+
+#if !defined(AO_HAVE_short_fetch_and_add) \
+ && defined(AO_HAVE_short_fetch_and_add_release)
+# define AO_short_fetch_and_add(addr, val) \
+ AO_short_fetch_and_add_release(addr, val)
+# define AO_HAVE_short_fetch_and_add
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add) \
+ && defined(AO_HAVE_short_fetch_and_add_acquire)
+# define AO_short_fetch_and_add(addr, val) \
+ AO_short_fetch_and_add_acquire(addr, val)
+# define AO_HAVE_short_fetch_and_add
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add) \
+ && defined(AO_HAVE_short_fetch_and_add_write)
+# define AO_short_fetch_and_add(addr, val) \
+ AO_short_fetch_and_add_write(addr, val)
+# define AO_HAVE_short_fetch_and_add
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add) \
+ && defined(AO_HAVE_short_fetch_and_add_read)
+# define AO_short_fetch_and_add(addr, val) \
+ AO_short_fetch_and_add_read(addr, val)
+# define AO_HAVE_short_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_short_fetch_and_add_acquire) \
+ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_short_fetch_and_add_full)
+# define AO_short_fetch_and_add_full(addr, val) \
+ (AO_nop_full(), AO_short_fetch_and_add_acquire(addr, val))
+# define AO_HAVE_short_fetch_and_add_full
+#endif
+
+#if !defined(AO_HAVE_short_fetch_and_add_release_write) \
+ && defined(AO_HAVE_short_fetch_and_add_write)
+# define AO_short_fetch_and_add_release_write(addr, val) \
+ AO_short_fetch_and_add_write(addr, val)
+# define AO_HAVE_short_fetch_and_add_release_write
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add_release_write) \
+ && defined(AO_HAVE_short_fetch_and_add_release)
+# define AO_short_fetch_and_add_release_write(addr, val) \
+ AO_short_fetch_and_add_release(addr, val)
+# define AO_HAVE_short_fetch_and_add_release_write
+#endif
+
+#if !defined(AO_HAVE_short_fetch_and_add_acquire_read) \
+ && defined(AO_HAVE_short_fetch_and_add_read)
+# define AO_short_fetch_and_add_acquire_read(addr, val) \
+ AO_short_fetch_and_add_read(addr, val)
+# define AO_HAVE_short_fetch_and_add_acquire_read
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add_acquire_read) \
+ && defined(AO_HAVE_short_fetch_and_add_acquire)
+# define AO_short_fetch_and_add_acquire_read(addr, val) \
+ AO_short_fetch_and_add_acquire(addr, val)
+# define AO_HAVE_short_fetch_and_add_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_short_fetch_and_add_acquire_read)
+# define AO_short_fetch_and_add_dd_acquire_read(addr, val) \
+ AO_short_fetch_and_add_acquire_read(addr, val)
+# define AO_HAVE_short_fetch_and_add_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_short_fetch_and_add)
+# define AO_short_fetch_and_add_dd_acquire_read(addr, val) \
+ AO_short_fetch_and_add(addr, val)
+# define AO_HAVE_short_fetch_and_add_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* short_fetch_and_add1 */
+#if defined(AO_HAVE_short_fetch_and_add_full) \
+ && !defined(AO_HAVE_short_fetch_and_add1_full)
+# define AO_short_fetch_and_add1_full(addr) \
+ AO_short_fetch_and_add_full(addr, 1)
+# define AO_HAVE_short_fetch_and_add1_full
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_release) \
+ && !defined(AO_HAVE_short_fetch_and_add1_release)
+# define AO_short_fetch_and_add1_release(addr) \
+ AO_short_fetch_and_add_release(addr, 1)
+# define AO_HAVE_short_fetch_and_add1_release
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_short_fetch_and_add1_acquire)
+# define AO_short_fetch_and_add1_acquire(addr) \
+ AO_short_fetch_and_add_acquire(addr, 1)
+# define AO_HAVE_short_fetch_and_add1_acquire
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_write) \
+ && !defined(AO_HAVE_short_fetch_and_add1_write)
+# define AO_short_fetch_and_add1_write(addr) \
+ AO_short_fetch_and_add_write(addr, 1)
+# define AO_HAVE_short_fetch_and_add1_write
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_read) \
+ && !defined(AO_HAVE_short_fetch_and_add1_read)
+# define AO_short_fetch_and_add1_read(addr) \
+ AO_short_fetch_and_add_read(addr, 1)
+# define AO_HAVE_short_fetch_and_add1_read
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_release_write) \
+ && !defined(AO_HAVE_short_fetch_and_add1_release_write)
+# define AO_short_fetch_and_add1_release_write(addr) \
+ AO_short_fetch_and_add_release_write(addr, 1)
+# define AO_HAVE_short_fetch_and_add1_release_write
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_acquire_read) \
+ && !defined(AO_HAVE_short_fetch_and_add1_acquire_read)
+# define AO_short_fetch_and_add1_acquire_read(addr) \
+ AO_short_fetch_and_add_acquire_read(addr, 1)
+# define AO_HAVE_short_fetch_and_add1_acquire_read
+#endif
+#if defined(AO_HAVE_short_fetch_and_add) \
+ && !defined(AO_HAVE_short_fetch_and_add1)
+# define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add(addr, 1)
+# define AO_HAVE_short_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_short_fetch_and_add1_full)
+# if !defined(AO_HAVE_short_fetch_and_add1_release)
+# define AO_short_fetch_and_add1_release(addr) \
+ AO_short_fetch_and_add1_full(addr)
+# define AO_HAVE_short_fetch_and_add1_release
+# endif
+# if !defined(AO_HAVE_short_fetch_and_add1_acquire)
+# define AO_short_fetch_and_add1_acquire(addr) \
+ AO_short_fetch_and_add1_full(addr)
+# define AO_HAVE_short_fetch_and_add1_acquire
+# endif
+# if !defined(AO_HAVE_short_fetch_and_add1_write)
+# define AO_short_fetch_and_add1_write(addr) \
+ AO_short_fetch_and_add1_full(addr)
+# define AO_HAVE_short_fetch_and_add1_write
+# endif
+# if !defined(AO_HAVE_short_fetch_and_add1_read)
+# define AO_short_fetch_and_add1_read(addr) \
+ AO_short_fetch_and_add1_full(addr)
+# define AO_HAVE_short_fetch_and_add1_read
+# endif
+#endif /* AO_HAVE_short_fetch_and_add1_full */
+
+#if !defined(AO_HAVE_short_fetch_and_add1) \
+ && defined(AO_HAVE_short_fetch_and_add1_release)
+# define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_release(addr)
+# define AO_HAVE_short_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add1) \
+ && defined(AO_HAVE_short_fetch_and_add1_acquire)
+# define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_acquire(addr)
+# define AO_HAVE_short_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add1) \
+ && defined(AO_HAVE_short_fetch_and_add1_write)
+# define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_write(addr)
+# define AO_HAVE_short_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add1) \
+ && defined(AO_HAVE_short_fetch_and_add1_read)
+# define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_read(addr)
+# define AO_HAVE_short_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_short_fetch_and_add1_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_fetch_and_add1_full)
+# define AO_short_fetch_and_add1_full(addr) \
+ (AO_nop_full(), AO_short_fetch_and_add1_acquire(addr))
+# define AO_HAVE_short_fetch_and_add1_full
+#endif
+
+#if !defined(AO_HAVE_short_fetch_and_add1_release_write) \
+ && defined(AO_HAVE_short_fetch_and_add1_write)
+# define AO_short_fetch_and_add1_release_write(addr) \
+ AO_short_fetch_and_add1_write(addr)
+# define AO_HAVE_short_fetch_and_add1_release_write
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add1_release_write) \
+ && defined(AO_HAVE_short_fetch_and_add1_release)
+# define AO_short_fetch_and_add1_release_write(addr) \
+ AO_short_fetch_and_add1_release(addr)
+# define AO_HAVE_short_fetch_and_add1_release_write
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add1_acquire_read) \
+ && defined(AO_HAVE_short_fetch_and_add1_read)
+# define AO_short_fetch_and_add1_acquire_read(addr) \
+ AO_short_fetch_and_add1_read(addr)
+# define AO_HAVE_short_fetch_and_add1_acquire_read
+#endif
+#if !defined(AO_HAVE_short_fetch_and_add1_acquire_read) \
+ && defined(AO_HAVE_short_fetch_and_add1_acquire)
+# define AO_short_fetch_and_add1_acquire_read(addr) \
+ AO_short_fetch_and_add1_acquire(addr)
+# define AO_HAVE_short_fetch_and_add1_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_short_fetch_and_add1_acquire_read)
+# define AO_short_fetch_and_add1_dd_acquire_read(addr) \
+ AO_short_fetch_and_add1_acquire_read(addr)
+# define AO_HAVE_short_fetch_and_add1_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_short_fetch_and_add1)
+# define AO_short_fetch_and_add1_dd_acquire_read(addr) \
+ AO_short_fetch_and_add1(addr)
+# define AO_HAVE_short_fetch_and_add1_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* short_fetch_and_sub1 */
+#if defined(AO_HAVE_short_fetch_and_add_full) \
+ && !defined(AO_HAVE_short_fetch_and_sub1_full)
+# define AO_short_fetch_and_sub1_full(addr) \
+ AO_short_fetch_and_add_full(addr, (unsigned/**/short)(-1))
+# define AO_HAVE_short_fetch_and_sub1_full
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_release) \
+ && !defined(AO_HAVE_short_fetch_and_sub1_release)
+# define AO_short_fetch_and_sub1_release(addr) \
+ AO_short_fetch_and_add_release(addr, (unsigned/**/short)(-1))
+# define AO_HAVE_short_fetch_and_sub1_release
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_short_fetch_and_sub1_acquire)
+# define AO_short_fetch_and_sub1_acquire(addr) \
+ AO_short_fetch_and_add_acquire(addr, (unsigned/**/short)(-1))
+# define AO_HAVE_short_fetch_and_sub1_acquire
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_write) \
+ && !defined(AO_HAVE_short_fetch_and_sub1_write)
+# define AO_short_fetch_and_sub1_write(addr) \
+ AO_short_fetch_and_add_write(addr, (unsigned/**/short)(-1))
+# define AO_HAVE_short_fetch_and_sub1_write
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_read) \
+ && !defined(AO_HAVE_short_fetch_and_sub1_read)
+# define AO_short_fetch_and_sub1_read(addr) \
+ AO_short_fetch_and_add_read(addr, (unsigned/**/short)(-1))
+# define AO_HAVE_short_fetch_and_sub1_read
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_release_write) \
+ && !defined(AO_HAVE_short_fetch_and_sub1_release_write)
+# define AO_short_fetch_and_sub1_release_write(addr) \
+ AO_short_fetch_and_add_release_write(addr, (unsigned/**/short)(-1))
+# define AO_HAVE_short_fetch_and_sub1_release_write
+#endif
+#if defined(AO_HAVE_short_fetch_and_add_acquire_read) \
+ && !defined(AO_HAVE_short_fetch_and_sub1_acquire_read)
+# define AO_short_fetch_and_sub1_acquire_read(addr) \
+ AO_short_fetch_and_add_acquire_read(addr, (unsigned/**/short)(-1))
+# define AO_HAVE_short_fetch_and_sub1_acquire_read
+#endif
+#if defined(AO_HAVE_short_fetch_and_add) \
+ && !defined(AO_HAVE_short_fetch_and_sub1)
+# define AO_short_fetch_and_sub1(addr) \
+ AO_short_fetch_and_add(addr, (unsigned/**/short)(-1))
+# define AO_HAVE_short_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_short_fetch_and_sub1_full)
+# if !defined(AO_HAVE_short_fetch_and_sub1_release)
+# define AO_short_fetch_and_sub1_release(addr) \
+ AO_short_fetch_and_sub1_full(addr)
+# define AO_HAVE_short_fetch_and_sub1_release
+# endif
+# if !defined(AO_HAVE_short_fetch_and_sub1_acquire)
+# define AO_short_fetch_and_sub1_acquire(addr) \
+ AO_short_fetch_and_sub1_full(addr)
+# define AO_HAVE_short_fetch_and_sub1_acquire
+# endif
+# if !defined(AO_HAVE_short_fetch_and_sub1_write)
+# define AO_short_fetch_and_sub1_write(addr) \
+ AO_short_fetch_and_sub1_full(addr)
+# define AO_HAVE_short_fetch_and_sub1_write
+# endif
+# if !defined(AO_HAVE_short_fetch_and_sub1_read)
+# define AO_short_fetch_and_sub1_read(addr) \
+ AO_short_fetch_and_sub1_full(addr)
+# define AO_HAVE_short_fetch_and_sub1_read
+# endif
+#endif /* AO_HAVE_short_fetch_and_sub1_full */
+
+#if !defined(AO_HAVE_short_fetch_and_sub1) \
+ && defined(AO_HAVE_short_fetch_and_sub1_release)
+# define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_release(addr)
+# define AO_HAVE_short_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_short_fetch_and_sub1) \
+ && defined(AO_HAVE_short_fetch_and_sub1_acquire)
+# define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_acquire(addr)
+# define AO_HAVE_short_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_short_fetch_and_sub1) \
+ && defined(AO_HAVE_short_fetch_and_sub1_write)
+# define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_write(addr)
+# define AO_HAVE_short_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_short_fetch_and_sub1) \
+ && defined(AO_HAVE_short_fetch_and_sub1_read)
+# define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_read(addr)
+# define AO_HAVE_short_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_short_fetch_and_sub1_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_fetch_and_sub1_full)
+# define AO_short_fetch_and_sub1_full(addr) \
+ (AO_nop_full(), AO_short_fetch_and_sub1_acquire(addr))
+# define AO_HAVE_short_fetch_and_sub1_full
+#endif
+
+#if !defined(AO_HAVE_short_fetch_and_sub1_release_write) \
+ && defined(AO_HAVE_short_fetch_and_sub1_write)
+# define AO_short_fetch_and_sub1_release_write(addr) \
+ AO_short_fetch_and_sub1_write(addr)
+# define AO_HAVE_short_fetch_and_sub1_release_write
+#endif
+#if !defined(AO_HAVE_short_fetch_and_sub1_release_write) \
+ && defined(AO_HAVE_short_fetch_and_sub1_release)
+# define AO_short_fetch_and_sub1_release_write(addr) \
+ AO_short_fetch_and_sub1_release(addr)
+# define AO_HAVE_short_fetch_and_sub1_release_write
+#endif
+#if !defined(AO_HAVE_short_fetch_and_sub1_acquire_read) \
+ && defined(AO_HAVE_short_fetch_and_sub1_read)
+# define AO_short_fetch_and_sub1_acquire_read(addr) \
+ AO_short_fetch_and_sub1_read(addr)
+# define AO_HAVE_short_fetch_and_sub1_acquire_read
+#endif
+#if !defined(AO_HAVE_short_fetch_and_sub1_acquire_read) \
+ && defined(AO_HAVE_short_fetch_and_sub1_acquire)
+# define AO_short_fetch_and_sub1_acquire_read(addr) \
+ AO_short_fetch_and_sub1_acquire(addr)
+# define AO_HAVE_short_fetch_and_sub1_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_short_fetch_and_sub1_acquire_read)
+# define AO_short_fetch_and_sub1_dd_acquire_read(addr) \
+ AO_short_fetch_and_sub1_acquire_read(addr)
+# define AO_HAVE_short_fetch_and_sub1_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_short_fetch_and_sub1)
+# define AO_short_fetch_and_sub1_dd_acquire_read(addr) \
+ AO_short_fetch_and_sub1(addr)
+# define AO_HAVE_short_fetch_and_sub1_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* short_and */
+#if defined(AO_HAVE_short_compare_and_swap_full) \
+ && !defined(AO_HAVE_short_and_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_short_and_full(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ unsigned/**/short old;
+
+ do
+ {
+ old = *(unsigned/**/short *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old,
+ old & value)));
+ }
+# define AO_HAVE_short_and_full
+#endif
+
+#if defined(AO_HAVE_short_and_full)
+# if !defined(AO_HAVE_short_and_release)
+# define AO_short_and_release(addr, val) AO_short_and_full(addr, val)
+# define AO_HAVE_short_and_release
+# endif
+# if !defined(AO_HAVE_short_and_acquire)
+# define AO_short_and_acquire(addr, val) AO_short_and_full(addr, val)
+# define AO_HAVE_short_and_acquire
+# endif
+# if !defined(AO_HAVE_short_and_write)
+# define AO_short_and_write(addr, val) AO_short_and_full(addr, val)
+# define AO_HAVE_short_and_write
+# endif
+# if !defined(AO_HAVE_short_and_read)
+# define AO_short_and_read(addr, val) AO_short_and_full(addr, val)
+# define AO_HAVE_short_and_read
+# endif
+#endif /* AO_HAVE_short_and_full */
+
+#if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_release)
+# define AO_short_and(addr, val) AO_short_and_release(addr, val)
+# define AO_HAVE_short_and
+#endif
+#if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_acquire)
+# define AO_short_and(addr, val) AO_short_and_acquire(addr, val)
+# define AO_HAVE_short_and
+#endif
+#if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_write)
+# define AO_short_and(addr, val) AO_short_and_write(addr, val)
+# define AO_HAVE_short_and
+#endif
+#if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_read)
+# define AO_short_and(addr, val) AO_short_and_read(addr, val)
+# define AO_HAVE_short_and
+#endif
+
+#if defined(AO_HAVE_short_and_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_and_full)
+# define AO_short_and_full(addr, val) \
+ (AO_nop_full(), AO_short_and_acquire(addr, val))
+# define AO_HAVE_short_and_full
+#endif
+
+#if !defined(AO_HAVE_short_and_release_write) \
+ && defined(AO_HAVE_short_and_write)
+# define AO_short_and_release_write(addr, val) AO_short_and_write(addr, val)
+# define AO_HAVE_short_and_release_write
+#endif
+#if !defined(AO_HAVE_short_and_release_write) \
+ && defined(AO_HAVE_short_and_release)
+# define AO_short_and_release_write(addr, val) AO_short_and_release(addr, val)
+# define AO_HAVE_short_and_release_write
+#endif
+#if !defined(AO_HAVE_short_and_acquire_read) \
+ && defined(AO_HAVE_short_and_read)
+# define AO_short_and_acquire_read(addr, val) AO_short_and_read(addr, val)
+# define AO_HAVE_short_and_acquire_read
+#endif
+#if !defined(AO_HAVE_short_and_acquire_read) \
+ && defined(AO_HAVE_short_and_acquire)
+# define AO_short_and_acquire_read(addr, val) AO_short_and_acquire(addr, val)
+# define AO_HAVE_short_and_acquire_read
+#endif
+
+/* short_or */
+#if defined(AO_HAVE_short_compare_and_swap_full) \
+ && !defined(AO_HAVE_short_or_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_short_or_full(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ unsigned/**/short old;
+
+ do
+ {
+ old = *(unsigned/**/short *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old,
+ old | value)));
+ }
+# define AO_HAVE_short_or_full
+#endif
+
+#if defined(AO_HAVE_short_or_full)
+# if !defined(AO_HAVE_short_or_release)
+# define AO_short_or_release(addr, val) AO_short_or_full(addr, val)
+# define AO_HAVE_short_or_release
+# endif
+# if !defined(AO_HAVE_short_or_acquire)
+# define AO_short_or_acquire(addr, val) AO_short_or_full(addr, val)
+# define AO_HAVE_short_or_acquire
+# endif
+# if !defined(AO_HAVE_short_or_write)
+# define AO_short_or_write(addr, val) AO_short_or_full(addr, val)
+# define AO_HAVE_short_or_write
+# endif
+# if !defined(AO_HAVE_short_or_read)
+# define AO_short_or_read(addr, val) AO_short_or_full(addr, val)
+# define AO_HAVE_short_or_read
+# endif
+#endif /* AO_HAVE_short_or_full */
+
+#if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_release)
+# define AO_short_or(addr, val) AO_short_or_release(addr, val)
+# define AO_HAVE_short_or
+#endif
+#if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_acquire)
+# define AO_short_or(addr, val) AO_short_or_acquire(addr, val)
+# define AO_HAVE_short_or
+#endif
+#if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_write)
+# define AO_short_or(addr, val) AO_short_or_write(addr, val)
+# define AO_HAVE_short_or
+#endif
+#if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_read)
+# define AO_short_or(addr, val) AO_short_or_read(addr, val)
+# define AO_HAVE_short_or
+#endif
+
+#if defined(AO_HAVE_short_or_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_or_full)
+# define AO_short_or_full(addr, val) \
+ (AO_nop_full(), AO_short_or_acquire(addr, val))
+# define AO_HAVE_short_or_full
+#endif
+
+#if !defined(AO_HAVE_short_or_release_write) \
+ && defined(AO_HAVE_short_or_write)
+# define AO_short_or_release_write(addr, val) AO_short_or_write(addr, val)
+# define AO_HAVE_short_or_release_write
+#endif
+#if !defined(AO_HAVE_short_or_release_write) \
+ && defined(AO_HAVE_short_or_release)
+# define AO_short_or_release_write(addr, val) AO_short_or_release(addr, val)
+# define AO_HAVE_short_or_release_write
+#endif
+#if !defined(AO_HAVE_short_or_acquire_read) && defined(AO_HAVE_short_or_read)
+# define AO_short_or_acquire_read(addr, val) AO_short_or_read(addr, val)
+# define AO_HAVE_short_or_acquire_read
+#endif
+#if !defined(AO_HAVE_short_or_acquire_read) \
+ && defined(AO_HAVE_short_or_acquire)
+# define AO_short_or_acquire_read(addr, val) AO_short_or_acquire(addr, val)
+# define AO_HAVE_short_or_acquire_read
+#endif
+
+/* short_xor */
+#if defined(AO_HAVE_short_compare_and_swap_full) \
+ && !defined(AO_HAVE_short_xor_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_short_xor_full(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ unsigned/**/short old;
+
+ do
+ {
+ old = *(unsigned/**/short *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old,
+ old ^ value)));
+ }
+# define AO_HAVE_short_xor_full
+#endif
+
+#if defined(AO_HAVE_short_xor_full)
+# if !defined(AO_HAVE_short_xor_release)
+# define AO_short_xor_release(addr, val) AO_short_xor_full(addr, val)
+# define AO_HAVE_short_xor_release
+# endif
+# if !defined(AO_HAVE_short_xor_acquire)
+# define AO_short_xor_acquire(addr, val) AO_short_xor_full(addr, val)
+# define AO_HAVE_short_xor_acquire
+# endif
+# if !defined(AO_HAVE_short_xor_write)
+# define AO_short_xor_write(addr, val) AO_short_xor_full(addr, val)
+# define AO_HAVE_short_xor_write
+# endif
+# if !defined(AO_HAVE_short_xor_read)
+# define AO_short_xor_read(addr, val) AO_short_xor_full(addr, val)
+# define AO_HAVE_short_xor_read
+# endif
+#endif /* AO_HAVE_short_xor_full */
+
+#if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_release)
+# define AO_short_xor(addr, val) AO_short_xor_release(addr, val)
+# define AO_HAVE_short_xor
+#endif
+#if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_acquire)
+# define AO_short_xor(addr, val) AO_short_xor_acquire(addr, val)
+# define AO_HAVE_short_xor
+#endif
+#if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_write)
+# define AO_short_xor(addr, val) AO_short_xor_write(addr, val)
+# define AO_HAVE_short_xor
+#endif
+#if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_read)
+# define AO_short_xor(addr, val) AO_short_xor_read(addr, val)
+# define AO_HAVE_short_xor
+#endif
+
+#if defined(AO_HAVE_short_xor_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_xor_full)
+# define AO_short_xor_full(addr, val) \
+ (AO_nop_full(), AO_short_xor_acquire(addr, val))
+# define AO_HAVE_short_xor_full
+#endif
+
+#if !defined(AO_HAVE_short_xor_release_write) \
+ && defined(AO_HAVE_short_xor_write)
+# define AO_short_xor_release_write(addr, val) AO_short_xor_write(addr, val)
+# define AO_HAVE_short_xor_release_write
+#endif
+#if !defined(AO_HAVE_short_xor_release_write) \
+ && defined(AO_HAVE_short_xor_release)
+# define AO_short_xor_release_write(addr, val) AO_short_xor_release(addr, val)
+# define AO_HAVE_short_xor_release_write
+#endif
+#if !defined(AO_HAVE_short_xor_acquire_read) \
+ && defined(AO_HAVE_short_xor_read)
+# define AO_short_xor_acquire_read(addr, val) AO_short_xor_read(addr, val)
+# define AO_HAVE_short_xor_acquire_read
+#endif
+#if !defined(AO_HAVE_short_xor_acquire_read) \
+ && defined(AO_HAVE_short_xor_acquire)
+# define AO_short_xor_acquire_read(addr, val) AO_short_xor_acquire(addr, val)
+# define AO_HAVE_short_xor_acquire_read
+#endif
+
+/* short_and/or/xor_dd_acquire_read are meaningless. */
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* int_compare_and_swap (based on fetch_compare_and_swap) */
+#if defined(AO_HAVE_int_fetch_compare_and_swap_full) \
+ && !defined(AO_HAVE_int_compare_and_swap_full)
+ AO_INLINE int
+ AO_int_compare_and_swap_full(volatile unsigned *addr, unsigned old_val,
+ unsigned new_val)
+ {
+ return AO_int_fetch_compare_and_swap_full(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_int_compare_and_swap_full
+#endif
+
+#if defined(AO_HAVE_int_fetch_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_int_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_int_compare_and_swap_acquire(volatile unsigned *addr, unsigned old_val,
+ unsigned new_val)
+ {
+ return AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_int_compare_and_swap_acquire
+#endif
+
+#if defined(AO_HAVE_int_fetch_compare_and_swap_release) \
+ && !defined(AO_HAVE_int_compare_and_swap_release)
+ AO_INLINE int
+ AO_int_compare_and_swap_release(volatile unsigned *addr, unsigned old_val,
+ unsigned new_val)
+ {
+ return AO_int_fetch_compare_and_swap_release(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_int_compare_and_swap_release
+#endif
+
+#if defined(AO_HAVE_int_fetch_compare_and_swap_write) \
+ && !defined(AO_HAVE_int_compare_and_swap_write)
+ AO_INLINE int
+ AO_int_compare_and_swap_write(volatile unsigned *addr, unsigned old_val,
+ unsigned new_val)
+ {
+ return AO_int_fetch_compare_and_swap_write(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_int_compare_and_swap_write
+#endif
+
+#if defined(AO_HAVE_int_fetch_compare_and_swap_read) \
+ && !defined(AO_HAVE_int_compare_and_swap_read)
+ AO_INLINE int
+ AO_int_compare_and_swap_read(volatile unsigned *addr, unsigned old_val,
+ unsigned new_val)
+ {
+ return AO_int_fetch_compare_and_swap_read(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_int_compare_and_swap_read
+#endif
+
+#if defined(AO_HAVE_int_fetch_compare_and_swap) \
+ && !defined(AO_HAVE_int_compare_and_swap)
+ AO_INLINE int
+ AO_int_compare_and_swap(volatile unsigned *addr, unsigned old_val,
+ unsigned new_val)
+ {
+ return AO_int_fetch_compare_and_swap(addr, old_val, new_val) == old_val;
+ }
+# define AO_HAVE_int_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \
+ && !defined(AO_HAVE_int_compare_and_swap_release_write)
+ AO_INLINE int
+ AO_int_compare_and_swap_release_write(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ return AO_int_fetch_compare_and_swap_release_write(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_int_compare_and_swap_release_write
+#endif
+
+#if defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \
+ && !defined(AO_HAVE_int_compare_and_swap_acquire_read)
+ AO_INLINE int
+ AO_int_compare_and_swap_acquire_read(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ return AO_int_fetch_compare_and_swap_acquire_read(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_int_compare_and_swap_acquire_read
+#endif
+
+#if defined(AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read) \
+ && !defined(AO_HAVE_int_compare_and_swap_dd_acquire_read)
+ AO_INLINE int
+ AO_int_compare_and_swap_dd_acquire_read(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ return AO_int_fetch_compare_and_swap_dd_acquire_read(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_int_compare_and_swap_dd_acquire_read
+#endif
+
+/* int_fetch_and_add */
+/* We first try to implement fetch_and_add variants in terms of the */
+/* corresponding compare_and_swap variants to minimize adding barriers. */
+#if defined(AO_HAVE_int_compare_and_swap_full) \
+ && !defined(AO_HAVE_int_fetch_and_add_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned
+ AO_int_fetch_and_add_full(volatile unsigned *addr, unsigned incr)
+ {
+ unsigned old;
+
+ do
+ {
+ old = *(unsigned *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_int_fetch_and_add_full
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_int_fetch_and_add_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned
+ AO_int_fetch_and_add_acquire(volatile unsigned *addr, unsigned incr)
+ {
+ unsigned old;
+
+ do
+ {
+ old = *(unsigned *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_acquire(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_int_fetch_and_add_acquire
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap_release) \
+ && !defined(AO_HAVE_int_fetch_and_add_release)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned
+ AO_int_fetch_and_add_release(volatile unsigned *addr, unsigned incr)
+ {
+ unsigned old;
+
+ do
+ {
+ old = *(unsigned *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_release(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_int_fetch_and_add_release
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap) \
+ && !defined(AO_HAVE_int_fetch_and_add)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned
+ AO_int_fetch_and_add(volatile unsigned *addr, unsigned incr)
+ {
+ unsigned old;
+
+ do
+ {
+ old = *(unsigned *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_int_compare_and_swap(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_int_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_int_fetch_and_add_full)
+# if !defined(AO_HAVE_int_fetch_and_add_release)
+# define AO_int_fetch_and_add_release(addr, val) \
+ AO_int_fetch_and_add_full(addr, val)
+# define AO_HAVE_int_fetch_and_add_release
+# endif
+# if !defined(AO_HAVE_int_fetch_and_add_acquire)
+# define AO_int_fetch_and_add_acquire(addr, val) \
+ AO_int_fetch_and_add_full(addr, val)
+# define AO_HAVE_int_fetch_and_add_acquire
+# endif
+# if !defined(AO_HAVE_int_fetch_and_add_write)
+# define AO_int_fetch_and_add_write(addr, val) \
+ AO_int_fetch_and_add_full(addr, val)
+# define AO_HAVE_int_fetch_and_add_write
+# endif
+# if !defined(AO_HAVE_int_fetch_and_add_read)
+# define AO_int_fetch_and_add_read(addr, val) \
+ AO_int_fetch_and_add_full(addr, val)
+# define AO_HAVE_int_fetch_and_add_read
+# endif
+#endif /* AO_HAVE_int_fetch_and_add_full */
+
+#if defined(AO_HAVE_int_fetch_and_add) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_fetch_and_add_acquire)
+ AO_INLINE unsigned
+ AO_int_fetch_and_add_acquire(volatile unsigned *addr, unsigned incr)
+ {
+ unsigned result = AO_int_fetch_and_add(addr, incr);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_int_fetch_and_add_acquire
+#endif
+#if defined(AO_HAVE_int_fetch_and_add) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_fetch_and_add_release)
+# define AO_int_fetch_and_add_release(addr, incr) \
+ (AO_nop_full(), AO_int_fetch_and_add(addr, incr))
+# define AO_HAVE_int_fetch_and_add_release
+#endif
+
+#if !defined(AO_HAVE_int_fetch_and_add) \
+ && defined(AO_HAVE_int_fetch_and_add_release)
+# define AO_int_fetch_and_add(addr, val) \
+ AO_int_fetch_and_add_release(addr, val)
+# define AO_HAVE_int_fetch_and_add
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add) \
+ && defined(AO_HAVE_int_fetch_and_add_acquire)
+# define AO_int_fetch_and_add(addr, val) \
+ AO_int_fetch_and_add_acquire(addr, val)
+# define AO_HAVE_int_fetch_and_add
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add) \
+ && defined(AO_HAVE_int_fetch_and_add_write)
+# define AO_int_fetch_and_add(addr, val) \
+ AO_int_fetch_and_add_write(addr, val)
+# define AO_HAVE_int_fetch_and_add
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add) \
+ && defined(AO_HAVE_int_fetch_and_add_read)
+# define AO_int_fetch_and_add(addr, val) \
+ AO_int_fetch_and_add_read(addr, val)
+# define AO_HAVE_int_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_int_fetch_and_add_acquire) \
+ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_int_fetch_and_add_full)
+# define AO_int_fetch_and_add_full(addr, val) \
+ (AO_nop_full(), AO_int_fetch_and_add_acquire(addr, val))
+# define AO_HAVE_int_fetch_and_add_full
+#endif
+
+#if !defined(AO_HAVE_int_fetch_and_add_release_write) \
+ && defined(AO_HAVE_int_fetch_and_add_write)
+# define AO_int_fetch_and_add_release_write(addr, val) \
+ AO_int_fetch_and_add_write(addr, val)
+# define AO_HAVE_int_fetch_and_add_release_write
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add_release_write) \
+ && defined(AO_HAVE_int_fetch_and_add_release)
+# define AO_int_fetch_and_add_release_write(addr, val) \
+ AO_int_fetch_and_add_release(addr, val)
+# define AO_HAVE_int_fetch_and_add_release_write
+#endif
+
+#if !defined(AO_HAVE_int_fetch_and_add_acquire_read) \
+ && defined(AO_HAVE_int_fetch_and_add_read)
+# define AO_int_fetch_and_add_acquire_read(addr, val) \
+ AO_int_fetch_and_add_read(addr, val)
+# define AO_HAVE_int_fetch_and_add_acquire_read
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add_acquire_read) \
+ && defined(AO_HAVE_int_fetch_and_add_acquire)
+# define AO_int_fetch_and_add_acquire_read(addr, val) \
+ AO_int_fetch_and_add_acquire(addr, val)
+# define AO_HAVE_int_fetch_and_add_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_int_fetch_and_add_acquire_read)
+# define AO_int_fetch_and_add_dd_acquire_read(addr, val) \
+ AO_int_fetch_and_add_acquire_read(addr, val)
+# define AO_HAVE_int_fetch_and_add_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_int_fetch_and_add)
+# define AO_int_fetch_and_add_dd_acquire_read(addr, val) \
+ AO_int_fetch_and_add(addr, val)
+# define AO_HAVE_int_fetch_and_add_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* int_fetch_and_add1 */
+#if defined(AO_HAVE_int_fetch_and_add_full) \
+ && !defined(AO_HAVE_int_fetch_and_add1_full)
+# define AO_int_fetch_and_add1_full(addr) \
+ AO_int_fetch_and_add_full(addr, 1)
+# define AO_HAVE_int_fetch_and_add1_full
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_release) \
+ && !defined(AO_HAVE_int_fetch_and_add1_release)
+# define AO_int_fetch_and_add1_release(addr) \
+ AO_int_fetch_and_add_release(addr, 1)
+# define AO_HAVE_int_fetch_and_add1_release
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_int_fetch_and_add1_acquire)
+# define AO_int_fetch_and_add1_acquire(addr) \
+ AO_int_fetch_and_add_acquire(addr, 1)
+# define AO_HAVE_int_fetch_and_add1_acquire
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_write) \
+ && !defined(AO_HAVE_int_fetch_and_add1_write)
+# define AO_int_fetch_and_add1_write(addr) \
+ AO_int_fetch_and_add_write(addr, 1)
+# define AO_HAVE_int_fetch_and_add1_write
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_read) \
+ && !defined(AO_HAVE_int_fetch_and_add1_read)
+# define AO_int_fetch_and_add1_read(addr) \
+ AO_int_fetch_and_add_read(addr, 1)
+# define AO_HAVE_int_fetch_and_add1_read
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_release_write) \
+ && !defined(AO_HAVE_int_fetch_and_add1_release_write)
+# define AO_int_fetch_and_add1_release_write(addr) \
+ AO_int_fetch_and_add_release_write(addr, 1)
+# define AO_HAVE_int_fetch_and_add1_release_write
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_acquire_read) \
+ && !defined(AO_HAVE_int_fetch_and_add1_acquire_read)
+# define AO_int_fetch_and_add1_acquire_read(addr) \
+ AO_int_fetch_and_add_acquire_read(addr, 1)
+# define AO_HAVE_int_fetch_and_add1_acquire_read
+#endif
+#if defined(AO_HAVE_int_fetch_and_add) \
+ && !defined(AO_HAVE_int_fetch_and_add1)
+# define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add(addr, 1)
+# define AO_HAVE_int_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_int_fetch_and_add1_full)
+# if !defined(AO_HAVE_int_fetch_and_add1_release)
+# define AO_int_fetch_and_add1_release(addr) \
+ AO_int_fetch_and_add1_full(addr)
+# define AO_HAVE_int_fetch_and_add1_release
+# endif
+# if !defined(AO_HAVE_int_fetch_and_add1_acquire)
+# define AO_int_fetch_and_add1_acquire(addr) \
+ AO_int_fetch_and_add1_full(addr)
+# define AO_HAVE_int_fetch_and_add1_acquire
+# endif
+# if !defined(AO_HAVE_int_fetch_and_add1_write)
+# define AO_int_fetch_and_add1_write(addr) \
+ AO_int_fetch_and_add1_full(addr)
+# define AO_HAVE_int_fetch_and_add1_write
+# endif
+# if !defined(AO_HAVE_int_fetch_and_add1_read)
+# define AO_int_fetch_and_add1_read(addr) \
+ AO_int_fetch_and_add1_full(addr)
+# define AO_HAVE_int_fetch_and_add1_read
+# endif
+#endif /* AO_HAVE_int_fetch_and_add1_full */
+
+#if !defined(AO_HAVE_int_fetch_and_add1) \
+ && defined(AO_HAVE_int_fetch_and_add1_release)
+# define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_release(addr)
+# define AO_HAVE_int_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add1) \
+ && defined(AO_HAVE_int_fetch_and_add1_acquire)
+# define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_acquire(addr)
+# define AO_HAVE_int_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add1) \
+ && defined(AO_HAVE_int_fetch_and_add1_write)
+# define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_write(addr)
+# define AO_HAVE_int_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add1) \
+ && defined(AO_HAVE_int_fetch_and_add1_read)
+# define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_read(addr)
+# define AO_HAVE_int_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_int_fetch_and_add1_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_fetch_and_add1_full)
+# define AO_int_fetch_and_add1_full(addr) \
+ (AO_nop_full(), AO_int_fetch_and_add1_acquire(addr))
+# define AO_HAVE_int_fetch_and_add1_full
+#endif
+
+#if !defined(AO_HAVE_int_fetch_and_add1_release_write) \
+ && defined(AO_HAVE_int_fetch_and_add1_write)
+# define AO_int_fetch_and_add1_release_write(addr) \
+ AO_int_fetch_and_add1_write(addr)
+# define AO_HAVE_int_fetch_and_add1_release_write
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add1_release_write) \
+ && defined(AO_HAVE_int_fetch_and_add1_release)
+# define AO_int_fetch_and_add1_release_write(addr) \
+ AO_int_fetch_and_add1_release(addr)
+# define AO_HAVE_int_fetch_and_add1_release_write
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add1_acquire_read) \
+ && defined(AO_HAVE_int_fetch_and_add1_read)
+# define AO_int_fetch_and_add1_acquire_read(addr) \
+ AO_int_fetch_and_add1_read(addr)
+# define AO_HAVE_int_fetch_and_add1_acquire_read
+#endif
+#if !defined(AO_HAVE_int_fetch_and_add1_acquire_read) \
+ && defined(AO_HAVE_int_fetch_and_add1_acquire)
+# define AO_int_fetch_and_add1_acquire_read(addr) \
+ AO_int_fetch_and_add1_acquire(addr)
+# define AO_HAVE_int_fetch_and_add1_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_int_fetch_and_add1_acquire_read)
+# define AO_int_fetch_and_add1_dd_acquire_read(addr) \
+ AO_int_fetch_and_add1_acquire_read(addr)
+# define AO_HAVE_int_fetch_and_add1_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_int_fetch_and_add1)
+# define AO_int_fetch_and_add1_dd_acquire_read(addr) \
+ AO_int_fetch_and_add1(addr)
+# define AO_HAVE_int_fetch_and_add1_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* int_fetch_and_sub1 */
+#if defined(AO_HAVE_int_fetch_and_add_full) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_full)
+# define AO_int_fetch_and_sub1_full(addr) \
+ AO_int_fetch_and_add_full(addr, (unsigned)(-1))
+# define AO_HAVE_int_fetch_and_sub1_full
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_release) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_release)
+# define AO_int_fetch_and_sub1_release(addr) \
+ AO_int_fetch_and_add_release(addr, (unsigned)(-1))
+# define AO_HAVE_int_fetch_and_sub1_release
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_acquire)
+# define AO_int_fetch_and_sub1_acquire(addr) \
+ AO_int_fetch_and_add_acquire(addr, (unsigned)(-1))
+# define AO_HAVE_int_fetch_and_sub1_acquire
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_write) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_write)
+# define AO_int_fetch_and_sub1_write(addr) \
+ AO_int_fetch_and_add_write(addr, (unsigned)(-1))
+# define AO_HAVE_int_fetch_and_sub1_write
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_read) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_read)
+# define AO_int_fetch_and_sub1_read(addr) \
+ AO_int_fetch_and_add_read(addr, (unsigned)(-1))
+# define AO_HAVE_int_fetch_and_sub1_read
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_release_write) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_release_write)
+# define AO_int_fetch_and_sub1_release_write(addr) \
+ AO_int_fetch_and_add_release_write(addr, (unsigned)(-1))
+# define AO_HAVE_int_fetch_and_sub1_release_write
+#endif
+#if defined(AO_HAVE_int_fetch_and_add_acquire_read) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_acquire_read)
+# define AO_int_fetch_and_sub1_acquire_read(addr) \
+ AO_int_fetch_and_add_acquire_read(addr, (unsigned)(-1))
+# define AO_HAVE_int_fetch_and_sub1_acquire_read
+#endif
+#if defined(AO_HAVE_int_fetch_and_add) \
+ && !defined(AO_HAVE_int_fetch_and_sub1)
+# define AO_int_fetch_and_sub1(addr) \
+ AO_int_fetch_and_add(addr, (unsigned)(-1))
+# define AO_HAVE_int_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_int_fetch_and_sub1_full)
+# if !defined(AO_HAVE_int_fetch_and_sub1_release)
+# define AO_int_fetch_and_sub1_release(addr) \
+ AO_int_fetch_and_sub1_full(addr)
+# define AO_HAVE_int_fetch_and_sub1_release
+# endif
+# if !defined(AO_HAVE_int_fetch_and_sub1_acquire)
+# define AO_int_fetch_and_sub1_acquire(addr) \
+ AO_int_fetch_and_sub1_full(addr)
+# define AO_HAVE_int_fetch_and_sub1_acquire
+# endif
+# if !defined(AO_HAVE_int_fetch_and_sub1_write)
+# define AO_int_fetch_and_sub1_write(addr) \
+ AO_int_fetch_and_sub1_full(addr)
+# define AO_HAVE_int_fetch_and_sub1_write
+# endif
+# if !defined(AO_HAVE_int_fetch_and_sub1_read)
+# define AO_int_fetch_and_sub1_read(addr) \
+ AO_int_fetch_and_sub1_full(addr)
+# define AO_HAVE_int_fetch_and_sub1_read
+# endif
+#endif /* AO_HAVE_int_fetch_and_sub1_full */
+
+#if !defined(AO_HAVE_int_fetch_and_sub1) \
+ && defined(AO_HAVE_int_fetch_and_sub1_release)
+# define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_release(addr)
+# define AO_HAVE_int_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_int_fetch_and_sub1) \
+ && defined(AO_HAVE_int_fetch_and_sub1_acquire)
+# define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_acquire(addr)
+# define AO_HAVE_int_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_int_fetch_and_sub1) \
+ && defined(AO_HAVE_int_fetch_and_sub1_write)
+# define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_write(addr)
+# define AO_HAVE_int_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_int_fetch_and_sub1) \
+ && defined(AO_HAVE_int_fetch_and_sub1_read)
+# define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_read(addr)
+# define AO_HAVE_int_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_int_fetch_and_sub1_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_full)
+# define AO_int_fetch_and_sub1_full(addr) \
+ (AO_nop_full(), AO_int_fetch_and_sub1_acquire(addr))
+# define AO_HAVE_int_fetch_and_sub1_full
+#endif
+
+#if !defined(AO_HAVE_int_fetch_and_sub1_release_write) \
+ && defined(AO_HAVE_int_fetch_and_sub1_write)
+# define AO_int_fetch_and_sub1_release_write(addr) \
+ AO_int_fetch_and_sub1_write(addr)
+# define AO_HAVE_int_fetch_and_sub1_release_write
+#endif
+#if !defined(AO_HAVE_int_fetch_and_sub1_release_write) \
+ && defined(AO_HAVE_int_fetch_and_sub1_release)
+# define AO_int_fetch_and_sub1_release_write(addr) \
+ AO_int_fetch_and_sub1_release(addr)
+# define AO_HAVE_int_fetch_and_sub1_release_write
+#endif
+#if !defined(AO_HAVE_int_fetch_and_sub1_acquire_read) \
+ && defined(AO_HAVE_int_fetch_and_sub1_read)
+# define AO_int_fetch_and_sub1_acquire_read(addr) \
+ AO_int_fetch_and_sub1_read(addr)
+# define AO_HAVE_int_fetch_and_sub1_acquire_read
+#endif
+#if !defined(AO_HAVE_int_fetch_and_sub1_acquire_read) \
+ && defined(AO_HAVE_int_fetch_and_sub1_acquire)
+# define AO_int_fetch_and_sub1_acquire_read(addr) \
+ AO_int_fetch_and_sub1_acquire(addr)
+# define AO_HAVE_int_fetch_and_sub1_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_int_fetch_and_sub1_acquire_read)
+# define AO_int_fetch_and_sub1_dd_acquire_read(addr) \
+ AO_int_fetch_and_sub1_acquire_read(addr)
+# define AO_HAVE_int_fetch_and_sub1_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_int_fetch_and_sub1)
+# define AO_int_fetch_and_sub1_dd_acquire_read(addr) \
+ AO_int_fetch_and_sub1(addr)
+# define AO_HAVE_int_fetch_and_sub1_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* int_and */
+#if defined(AO_HAVE_int_compare_and_swap_full) \
+ && !defined(AO_HAVE_int_and_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_int_and_full(volatile unsigned *addr, unsigned value)
+ {
+ unsigned old;
+
+ do
+ {
+ old = *(unsigned *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old,
+ old & value)));
+ }
+# define AO_HAVE_int_and_full
+#endif
+
+#if defined(AO_HAVE_int_and_full)
+# if !defined(AO_HAVE_int_and_release)
+# define AO_int_and_release(addr, val) AO_int_and_full(addr, val)
+# define AO_HAVE_int_and_release
+# endif
+# if !defined(AO_HAVE_int_and_acquire)
+# define AO_int_and_acquire(addr, val) AO_int_and_full(addr, val)
+# define AO_HAVE_int_and_acquire
+# endif
+# if !defined(AO_HAVE_int_and_write)
+# define AO_int_and_write(addr, val) AO_int_and_full(addr, val)
+# define AO_HAVE_int_and_write
+# endif
+# if !defined(AO_HAVE_int_and_read)
+# define AO_int_and_read(addr, val) AO_int_and_full(addr, val)
+# define AO_HAVE_int_and_read
+# endif
+#endif /* AO_HAVE_int_and_full */
+
+#if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_release)
+# define AO_int_and(addr, val) AO_int_and_release(addr, val)
+# define AO_HAVE_int_and
+#endif
+#if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_acquire)
+# define AO_int_and(addr, val) AO_int_and_acquire(addr, val)
+# define AO_HAVE_int_and
+#endif
+#if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_write)
+# define AO_int_and(addr, val) AO_int_and_write(addr, val)
+# define AO_HAVE_int_and
+#endif
+#if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_read)
+# define AO_int_and(addr, val) AO_int_and_read(addr, val)
+# define AO_HAVE_int_and
+#endif
+
+#if defined(AO_HAVE_int_and_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_and_full)
+# define AO_int_and_full(addr, val) \
+ (AO_nop_full(), AO_int_and_acquire(addr, val))
+# define AO_HAVE_int_and_full
+#endif
+
+#if !defined(AO_HAVE_int_and_release_write) \
+ && defined(AO_HAVE_int_and_write)
+# define AO_int_and_release_write(addr, val) AO_int_and_write(addr, val)
+# define AO_HAVE_int_and_release_write
+#endif
+#if !defined(AO_HAVE_int_and_release_write) \
+ && defined(AO_HAVE_int_and_release)
+# define AO_int_and_release_write(addr, val) AO_int_and_release(addr, val)
+# define AO_HAVE_int_and_release_write
+#endif
+#if !defined(AO_HAVE_int_and_acquire_read) \
+ && defined(AO_HAVE_int_and_read)
+# define AO_int_and_acquire_read(addr, val) AO_int_and_read(addr, val)
+# define AO_HAVE_int_and_acquire_read
+#endif
+#if !defined(AO_HAVE_int_and_acquire_read) \
+ && defined(AO_HAVE_int_and_acquire)
+# define AO_int_and_acquire_read(addr, val) AO_int_and_acquire(addr, val)
+# define AO_HAVE_int_and_acquire_read
+#endif
+
+/* int_or */
+#if defined(AO_HAVE_int_compare_and_swap_full) \
+ && !defined(AO_HAVE_int_or_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_int_or_full(volatile unsigned *addr, unsigned value)
+ {
+ unsigned old;
+
+ do
+ {
+ old = *(unsigned *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old,
+ old | value)));
+ }
+# define AO_HAVE_int_or_full
+#endif
+
+#if defined(AO_HAVE_int_or_full)
+# if !defined(AO_HAVE_int_or_release)
+# define AO_int_or_release(addr, val) AO_int_or_full(addr, val)
+# define AO_HAVE_int_or_release
+# endif
+# if !defined(AO_HAVE_int_or_acquire)
+# define AO_int_or_acquire(addr, val) AO_int_or_full(addr, val)
+# define AO_HAVE_int_or_acquire
+# endif
+# if !defined(AO_HAVE_int_or_write)
+# define AO_int_or_write(addr, val) AO_int_or_full(addr, val)
+# define AO_HAVE_int_or_write
+# endif
+# if !defined(AO_HAVE_int_or_read)
+# define AO_int_or_read(addr, val) AO_int_or_full(addr, val)
+# define AO_HAVE_int_or_read
+# endif
+#endif /* AO_HAVE_int_or_full */
+
+#if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_release)
+# define AO_int_or(addr, val) AO_int_or_release(addr, val)
+# define AO_HAVE_int_or
+#endif
+#if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_acquire)
+# define AO_int_or(addr, val) AO_int_or_acquire(addr, val)
+# define AO_HAVE_int_or
+#endif
+#if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_write)
+# define AO_int_or(addr, val) AO_int_or_write(addr, val)
+# define AO_HAVE_int_or
+#endif
+#if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_read)
+# define AO_int_or(addr, val) AO_int_or_read(addr, val)
+# define AO_HAVE_int_or
+#endif
+
+#if defined(AO_HAVE_int_or_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_or_full)
+# define AO_int_or_full(addr, val) \
+ (AO_nop_full(), AO_int_or_acquire(addr, val))
+# define AO_HAVE_int_or_full
+#endif
+
+#if !defined(AO_HAVE_int_or_release_write) \
+ && defined(AO_HAVE_int_or_write)
+# define AO_int_or_release_write(addr, val) AO_int_or_write(addr, val)
+# define AO_HAVE_int_or_release_write
+#endif
+#if !defined(AO_HAVE_int_or_release_write) \
+ && defined(AO_HAVE_int_or_release)
+# define AO_int_or_release_write(addr, val) AO_int_or_release(addr, val)
+# define AO_HAVE_int_or_release_write
+#endif
+#if !defined(AO_HAVE_int_or_acquire_read) && defined(AO_HAVE_int_or_read)
+# define AO_int_or_acquire_read(addr, val) AO_int_or_read(addr, val)
+# define AO_HAVE_int_or_acquire_read
+#endif
+#if !defined(AO_HAVE_int_or_acquire_read) \
+ && defined(AO_HAVE_int_or_acquire)
+# define AO_int_or_acquire_read(addr, val) AO_int_or_acquire(addr, val)
+# define AO_HAVE_int_or_acquire_read
+#endif
+
+/* int_xor */
+#if defined(AO_HAVE_int_compare_and_swap_full) \
+ && !defined(AO_HAVE_int_xor_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_int_xor_full(volatile unsigned *addr, unsigned value)
+ {
+ unsigned old;
+
+ do
+ {
+ old = *(unsigned *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old,
+ old ^ value)));
+ }
+# define AO_HAVE_int_xor_full
+#endif
+
+#if defined(AO_HAVE_int_xor_full)
+# if !defined(AO_HAVE_int_xor_release)
+# define AO_int_xor_release(addr, val) AO_int_xor_full(addr, val)
+# define AO_HAVE_int_xor_release
+# endif
+# if !defined(AO_HAVE_int_xor_acquire)
+# define AO_int_xor_acquire(addr, val) AO_int_xor_full(addr, val)
+# define AO_HAVE_int_xor_acquire
+# endif
+# if !defined(AO_HAVE_int_xor_write)
+# define AO_int_xor_write(addr, val) AO_int_xor_full(addr, val)
+# define AO_HAVE_int_xor_write
+# endif
+# if !defined(AO_HAVE_int_xor_read)
+# define AO_int_xor_read(addr, val) AO_int_xor_full(addr, val)
+# define AO_HAVE_int_xor_read
+# endif
+#endif /* AO_HAVE_int_xor_full */
+
+#if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_release)
+# define AO_int_xor(addr, val) AO_int_xor_release(addr, val)
+# define AO_HAVE_int_xor
+#endif
+#if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_acquire)
+# define AO_int_xor(addr, val) AO_int_xor_acquire(addr, val)
+# define AO_HAVE_int_xor
+#endif
+#if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_write)
+# define AO_int_xor(addr, val) AO_int_xor_write(addr, val)
+# define AO_HAVE_int_xor
+#endif
+#if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_read)
+# define AO_int_xor(addr, val) AO_int_xor_read(addr, val)
+# define AO_HAVE_int_xor
+#endif
+
+#if defined(AO_HAVE_int_xor_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_xor_full)
+# define AO_int_xor_full(addr, val) \
+ (AO_nop_full(), AO_int_xor_acquire(addr, val))
+# define AO_HAVE_int_xor_full
+#endif
+
+#if !defined(AO_HAVE_int_xor_release_write) \
+ && defined(AO_HAVE_int_xor_write)
+# define AO_int_xor_release_write(addr, val) AO_int_xor_write(addr, val)
+# define AO_HAVE_int_xor_release_write
+#endif
+#if !defined(AO_HAVE_int_xor_release_write) \
+ && defined(AO_HAVE_int_xor_release)
+# define AO_int_xor_release_write(addr, val) AO_int_xor_release(addr, val)
+# define AO_HAVE_int_xor_release_write
+#endif
+#if !defined(AO_HAVE_int_xor_acquire_read) \
+ && defined(AO_HAVE_int_xor_read)
+# define AO_int_xor_acquire_read(addr, val) AO_int_xor_read(addr, val)
+# define AO_HAVE_int_xor_acquire_read
+#endif
+#if !defined(AO_HAVE_int_xor_acquire_read) \
+ && defined(AO_HAVE_int_xor_acquire)
+# define AO_int_xor_acquire_read(addr, val) AO_int_xor_acquire(addr, val)
+# define AO_HAVE_int_xor_acquire_read
+#endif
+
+/* int_and/or/xor_dd_acquire_read are meaningless. */
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* compare_and_swap (based on fetch_compare_and_swap) */
+#if defined(AO_HAVE_fetch_compare_and_swap_full) \
+ && !defined(AO_HAVE_compare_and_swap_full)
+ AO_INLINE int
+ AO_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_full(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_compare_and_swap_full
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_compare_and_swap_acquire
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_release) \
+ && !defined(AO_HAVE_compare_and_swap_release)
+ AO_INLINE int
+ AO_compare_and_swap_release(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_release(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_compare_and_swap_release
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_write) \
+ && !defined(AO_HAVE_compare_and_swap_write)
+ AO_INLINE int
+ AO_compare_and_swap_write(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_write(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_compare_and_swap_write
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_read) \
+ && !defined(AO_HAVE_compare_and_swap_read)
+ AO_INLINE int
+ AO_compare_and_swap_read(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_read(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_compare_and_swap_read
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap) \
+ && !defined(AO_HAVE_compare_and_swap)
+ AO_INLINE int
+ AO_compare_and_swap(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap(addr, old_val, new_val) == old_val;
+ }
+# define AO_HAVE_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_release_write) \
+ && !defined(AO_HAVE_compare_and_swap_release_write)
+ AO_INLINE int
+ AO_compare_and_swap_release_write(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_release_write(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_compare_and_swap_release_write
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \
+ && !defined(AO_HAVE_compare_and_swap_acquire_read)
+ AO_INLINE int
+ AO_compare_and_swap_acquire_read(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_acquire_read(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_compare_and_swap_acquire_read
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_dd_acquire_read) \
+ && !defined(AO_HAVE_compare_and_swap_dd_acquire_read)
+ AO_INLINE int
+ AO_compare_and_swap_dd_acquire_read(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_dd_acquire_read(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_compare_and_swap_dd_acquire_read
+#endif
+
+/* fetch_and_add */
+/* We first try to implement fetch_and_add variants in terms of the */
+/* corresponding compare_and_swap variants to minimize adding barriers. */
+#if defined(AO_HAVE_compare_and_swap_full) \
+ && !defined(AO_HAVE_fetch_and_add_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_t
+ AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr)
+ {
+ AO_t old;
+
+ do
+ {
+ old = *(AO_t *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_fetch_and_add_full
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_fetch_and_add_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_t
+ AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr)
+ {
+ AO_t old;
+
+ do
+ {
+ old = *(AO_t *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_compare_and_swap_acquire(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_fetch_and_add_acquire
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_release) \
+ && !defined(AO_HAVE_fetch_and_add_release)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_t
+ AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr)
+ {
+ AO_t old;
+
+ do
+ {
+ old = *(AO_t *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_compare_and_swap_release(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_fetch_and_add_release
+#endif
+
+#if defined(AO_HAVE_compare_and_swap) \
+ && !defined(AO_HAVE_fetch_and_add)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_t
+ AO_fetch_and_add(volatile AO_t *addr, AO_t incr)
+ {
+ AO_t old;
+
+ do
+ {
+ old = *(AO_t *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_compare_and_swap(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_fetch_and_add_full)
+# if !defined(AO_HAVE_fetch_and_add_release)
+# define AO_fetch_and_add_release(addr, val) \
+ AO_fetch_and_add_full(addr, val)
+# define AO_HAVE_fetch_and_add_release
+# endif
+# if !defined(AO_HAVE_fetch_and_add_acquire)
+# define AO_fetch_and_add_acquire(addr, val) \
+ AO_fetch_and_add_full(addr, val)
+# define AO_HAVE_fetch_and_add_acquire
+# endif
+# if !defined(AO_HAVE_fetch_and_add_write)
+# define AO_fetch_and_add_write(addr, val) \
+ AO_fetch_and_add_full(addr, val)
+# define AO_HAVE_fetch_and_add_write
+# endif
+# if !defined(AO_HAVE_fetch_and_add_read)
+# define AO_fetch_and_add_read(addr, val) \
+ AO_fetch_and_add_full(addr, val)
+# define AO_HAVE_fetch_and_add_read
+# endif
+#endif /* AO_HAVE_fetch_and_add_full */
+
+#if defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_fetch_and_add_acquire)
+ AO_INLINE AO_t
+ AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr)
+ {
+ AO_t result = AO_fetch_and_add(addr, incr);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_fetch_and_add_acquire
+#endif
+#if defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_fetch_and_add_release)
+# define AO_fetch_and_add_release(addr, incr) \
+ (AO_nop_full(), AO_fetch_and_add(addr, incr))
+# define AO_HAVE_fetch_and_add_release
+#endif
+
+#if !defined(AO_HAVE_fetch_and_add) \
+ && defined(AO_HAVE_fetch_and_add_release)
+# define AO_fetch_and_add(addr, val) \
+ AO_fetch_and_add_release(addr, val)
+# define AO_HAVE_fetch_and_add
+#endif
+#if !defined(AO_HAVE_fetch_and_add) \
+ && defined(AO_HAVE_fetch_and_add_acquire)
+# define AO_fetch_and_add(addr, val) \
+ AO_fetch_and_add_acquire(addr, val)
+# define AO_HAVE_fetch_and_add
+#endif
+#if !defined(AO_HAVE_fetch_and_add) \
+ && defined(AO_HAVE_fetch_and_add_write)
+# define AO_fetch_and_add(addr, val) \
+ AO_fetch_and_add_write(addr, val)
+# define AO_HAVE_fetch_and_add
+#endif
+#if !defined(AO_HAVE_fetch_and_add) \
+ && defined(AO_HAVE_fetch_and_add_read)
+# define AO_fetch_and_add(addr, val) \
+ AO_fetch_and_add_read(addr, val)
+# define AO_HAVE_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_fetch_and_add_acquire) \
+ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_fetch_and_add_full)
+# define AO_fetch_and_add_full(addr, val) \
+ (AO_nop_full(), AO_fetch_and_add_acquire(addr, val))
+# define AO_HAVE_fetch_and_add_full
+#endif
+
+#if !defined(AO_HAVE_fetch_and_add_release_write) \
+ && defined(AO_HAVE_fetch_and_add_write)
+# define AO_fetch_and_add_release_write(addr, val) \
+ AO_fetch_and_add_write(addr, val)
+# define AO_HAVE_fetch_and_add_release_write
+#endif
+#if !defined(AO_HAVE_fetch_and_add_release_write) \
+ && defined(AO_HAVE_fetch_and_add_release)
+# define AO_fetch_and_add_release_write(addr, val) \
+ AO_fetch_and_add_release(addr, val)
+# define AO_HAVE_fetch_and_add_release_write
+#endif
+
+#if !defined(AO_HAVE_fetch_and_add_acquire_read) \
+ && defined(AO_HAVE_fetch_and_add_read)
+# define AO_fetch_and_add_acquire_read(addr, val) \
+ AO_fetch_and_add_read(addr, val)
+# define AO_HAVE_fetch_and_add_acquire_read
+#endif
+#if !defined(AO_HAVE_fetch_and_add_acquire_read) \
+ && defined(AO_HAVE_fetch_and_add_acquire)
+# define AO_fetch_and_add_acquire_read(addr, val) \
+ AO_fetch_and_add_acquire(addr, val)
+# define AO_HAVE_fetch_and_add_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_fetch_and_add_acquire_read)
+# define AO_fetch_and_add_dd_acquire_read(addr, val) \
+ AO_fetch_and_add_acquire_read(addr, val)
+# define AO_HAVE_fetch_and_add_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_fetch_and_add)
+# define AO_fetch_and_add_dd_acquire_read(addr, val) \
+ AO_fetch_and_add(addr, val)
+# define AO_HAVE_fetch_and_add_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* fetch_and_add1 */
+#if defined(AO_HAVE_fetch_and_add_full) \
+ && !defined(AO_HAVE_fetch_and_add1_full)
+# define AO_fetch_and_add1_full(addr) \
+ AO_fetch_and_add_full(addr, 1)
+# define AO_HAVE_fetch_and_add1_full
+#endif
+#if defined(AO_HAVE_fetch_and_add_release) \
+ && !defined(AO_HAVE_fetch_and_add1_release)
+# define AO_fetch_and_add1_release(addr) \
+ AO_fetch_and_add_release(addr, 1)
+# define AO_HAVE_fetch_and_add1_release
+#endif
+#if defined(AO_HAVE_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_fetch_and_add1_acquire)
+# define AO_fetch_and_add1_acquire(addr) \
+ AO_fetch_and_add_acquire(addr, 1)
+# define AO_HAVE_fetch_and_add1_acquire
+#endif
+#if defined(AO_HAVE_fetch_and_add_write) \
+ && !defined(AO_HAVE_fetch_and_add1_write)
+# define AO_fetch_and_add1_write(addr) \
+ AO_fetch_and_add_write(addr, 1)
+# define AO_HAVE_fetch_and_add1_write
+#endif
+#if defined(AO_HAVE_fetch_and_add_read) \
+ && !defined(AO_HAVE_fetch_and_add1_read)
+# define AO_fetch_and_add1_read(addr) \
+ AO_fetch_and_add_read(addr, 1)
+# define AO_HAVE_fetch_and_add1_read
+#endif
+#if defined(AO_HAVE_fetch_and_add_release_write) \
+ && !defined(AO_HAVE_fetch_and_add1_release_write)
+# define AO_fetch_and_add1_release_write(addr) \
+ AO_fetch_and_add_release_write(addr, 1)
+# define AO_HAVE_fetch_and_add1_release_write
+#endif
+#if defined(AO_HAVE_fetch_and_add_acquire_read) \
+ && !defined(AO_HAVE_fetch_and_add1_acquire_read)
+# define AO_fetch_and_add1_acquire_read(addr) \
+ AO_fetch_and_add_acquire_read(addr, 1)
+# define AO_HAVE_fetch_and_add1_acquire_read
+#endif
+#if defined(AO_HAVE_fetch_and_add) \
+ && !defined(AO_HAVE_fetch_and_add1)
+# define AO_fetch_and_add1(addr) AO_fetch_and_add(addr, 1)
+# define AO_HAVE_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_fetch_and_add1_full)
+# if !defined(AO_HAVE_fetch_and_add1_release)
+# define AO_fetch_and_add1_release(addr) \
+ AO_fetch_and_add1_full(addr)
+# define AO_HAVE_fetch_and_add1_release
+# endif
+# if !defined(AO_HAVE_fetch_and_add1_acquire)
+# define AO_fetch_and_add1_acquire(addr) \
+ AO_fetch_and_add1_full(addr)
+# define AO_HAVE_fetch_and_add1_acquire
+# endif
+# if !defined(AO_HAVE_fetch_and_add1_write)
+# define AO_fetch_and_add1_write(addr) \
+ AO_fetch_and_add1_full(addr)
+# define AO_HAVE_fetch_and_add1_write
+# endif
+# if !defined(AO_HAVE_fetch_and_add1_read)
+# define AO_fetch_and_add1_read(addr) \
+ AO_fetch_and_add1_full(addr)
+# define AO_HAVE_fetch_and_add1_read
+# endif
+#endif /* AO_HAVE_fetch_and_add1_full */
+
+#if !defined(AO_HAVE_fetch_and_add1) \
+ && defined(AO_HAVE_fetch_and_add1_release)
+# define AO_fetch_and_add1(addr) AO_fetch_and_add1_release(addr)
+# define AO_HAVE_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_fetch_and_add1) \
+ && defined(AO_HAVE_fetch_and_add1_acquire)
+# define AO_fetch_and_add1(addr) AO_fetch_and_add1_acquire(addr)
+# define AO_HAVE_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_fetch_and_add1) \
+ && defined(AO_HAVE_fetch_and_add1_write)
+# define AO_fetch_and_add1(addr) AO_fetch_and_add1_write(addr)
+# define AO_HAVE_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_fetch_and_add1) \
+ && defined(AO_HAVE_fetch_and_add1_read)
+# define AO_fetch_and_add1(addr) AO_fetch_and_add1_read(addr)
+# define AO_HAVE_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_fetch_and_add1_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_fetch_and_add1_full)
+# define AO_fetch_and_add1_full(addr) \
+ (AO_nop_full(), AO_fetch_and_add1_acquire(addr))
+# define AO_HAVE_fetch_and_add1_full
+#endif
+
+#if !defined(AO_HAVE_fetch_and_add1_release_write) \
+ && defined(AO_HAVE_fetch_and_add1_write)
+# define AO_fetch_and_add1_release_write(addr) \
+ AO_fetch_and_add1_write(addr)
+# define AO_HAVE_fetch_and_add1_release_write
+#endif
+#if !defined(AO_HAVE_fetch_and_add1_release_write) \
+ && defined(AO_HAVE_fetch_and_add1_release)
+# define AO_fetch_and_add1_release_write(addr) \
+ AO_fetch_and_add1_release(addr)
+# define AO_HAVE_fetch_and_add1_release_write
+#endif
+#if !defined(AO_HAVE_fetch_and_add1_acquire_read) \
+ && defined(AO_HAVE_fetch_and_add1_read)
+# define AO_fetch_and_add1_acquire_read(addr) \
+ AO_fetch_and_add1_read(addr)
+# define AO_HAVE_fetch_and_add1_acquire_read
+#endif
+#if !defined(AO_HAVE_fetch_and_add1_acquire_read) \
+ && defined(AO_HAVE_fetch_and_add1_acquire)
+# define AO_fetch_and_add1_acquire_read(addr) \
+ AO_fetch_and_add1_acquire(addr)
+# define AO_HAVE_fetch_and_add1_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_fetch_and_add1_acquire_read)
+# define AO_fetch_and_add1_dd_acquire_read(addr) \
+ AO_fetch_and_add1_acquire_read(addr)
+# define AO_HAVE_fetch_and_add1_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_fetch_and_add1)
+# define AO_fetch_and_add1_dd_acquire_read(addr) \
+ AO_fetch_and_add1(addr)
+# define AO_HAVE_fetch_and_add1_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* fetch_and_sub1 */
+#if defined(AO_HAVE_fetch_and_add_full) \
+ && !defined(AO_HAVE_fetch_and_sub1_full)
+# define AO_fetch_and_sub1_full(addr) \
+ AO_fetch_and_add_full(addr, (AO_t)(-1))
+# define AO_HAVE_fetch_and_sub1_full
+#endif
+#if defined(AO_HAVE_fetch_and_add_release) \
+ && !defined(AO_HAVE_fetch_and_sub1_release)
+# define AO_fetch_and_sub1_release(addr) \
+ AO_fetch_and_add_release(addr, (AO_t)(-1))
+# define AO_HAVE_fetch_and_sub1_release
+#endif
+#if defined(AO_HAVE_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_fetch_and_sub1_acquire)
+# define AO_fetch_and_sub1_acquire(addr) \
+ AO_fetch_and_add_acquire(addr, (AO_t)(-1))
+# define AO_HAVE_fetch_and_sub1_acquire
+#endif
+#if defined(AO_HAVE_fetch_and_add_write) \
+ && !defined(AO_HAVE_fetch_and_sub1_write)
+# define AO_fetch_and_sub1_write(addr) \
+ AO_fetch_and_add_write(addr, (AO_t)(-1))
+# define AO_HAVE_fetch_and_sub1_write
+#endif
+#if defined(AO_HAVE_fetch_and_add_read) \
+ && !defined(AO_HAVE_fetch_and_sub1_read)
+# define AO_fetch_and_sub1_read(addr) \
+ AO_fetch_and_add_read(addr, (AO_t)(-1))
+# define AO_HAVE_fetch_and_sub1_read
+#endif
+#if defined(AO_HAVE_fetch_and_add_release_write) \
+ && !defined(AO_HAVE_fetch_and_sub1_release_write)
+# define AO_fetch_and_sub1_release_write(addr) \
+ AO_fetch_and_add_release_write(addr, (AO_t)(-1))
+# define AO_HAVE_fetch_and_sub1_release_write
+#endif
+#if defined(AO_HAVE_fetch_and_add_acquire_read) \
+ && !defined(AO_HAVE_fetch_and_sub1_acquire_read)
+# define AO_fetch_and_sub1_acquire_read(addr) \
+ AO_fetch_and_add_acquire_read(addr, (AO_t)(-1))
+# define AO_HAVE_fetch_and_sub1_acquire_read
+#endif
+#if defined(AO_HAVE_fetch_and_add) \
+ && !defined(AO_HAVE_fetch_and_sub1)
+# define AO_fetch_and_sub1(addr) \
+ AO_fetch_and_add(addr, (AO_t)(-1))
+# define AO_HAVE_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_fetch_and_sub1_full)
+# if !defined(AO_HAVE_fetch_and_sub1_release)
+# define AO_fetch_and_sub1_release(addr) \
+ AO_fetch_and_sub1_full(addr)
+# define AO_HAVE_fetch_and_sub1_release
+# endif
+# if !defined(AO_HAVE_fetch_and_sub1_acquire)
+# define AO_fetch_and_sub1_acquire(addr) \
+ AO_fetch_and_sub1_full(addr)
+# define AO_HAVE_fetch_and_sub1_acquire
+# endif
+# if !defined(AO_HAVE_fetch_and_sub1_write)
+# define AO_fetch_and_sub1_write(addr) \
+ AO_fetch_and_sub1_full(addr)
+# define AO_HAVE_fetch_and_sub1_write
+# endif
+# if !defined(AO_HAVE_fetch_and_sub1_read)
+# define AO_fetch_and_sub1_read(addr) \
+ AO_fetch_and_sub1_full(addr)
+# define AO_HAVE_fetch_and_sub1_read
+# endif
+#endif /* AO_HAVE_fetch_and_sub1_full */
+
+#if !defined(AO_HAVE_fetch_and_sub1) \
+ && defined(AO_HAVE_fetch_and_sub1_release)
+# define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_release(addr)
+# define AO_HAVE_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_fetch_and_sub1) \
+ && defined(AO_HAVE_fetch_and_sub1_acquire)
+# define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_acquire(addr)
+# define AO_HAVE_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_fetch_and_sub1) \
+ && defined(AO_HAVE_fetch_and_sub1_write)
+# define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_write(addr)
+# define AO_HAVE_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_fetch_and_sub1) \
+ && defined(AO_HAVE_fetch_and_sub1_read)
+# define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_read(addr)
+# define AO_HAVE_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_fetch_and_sub1_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_fetch_and_sub1_full)
+# define AO_fetch_and_sub1_full(addr) \
+ (AO_nop_full(), AO_fetch_and_sub1_acquire(addr))
+# define AO_HAVE_fetch_and_sub1_full
+#endif
+
+#if !defined(AO_HAVE_fetch_and_sub1_release_write) \
+ && defined(AO_HAVE_fetch_and_sub1_write)
+# define AO_fetch_and_sub1_release_write(addr) \
+ AO_fetch_and_sub1_write(addr)
+# define AO_HAVE_fetch_and_sub1_release_write
+#endif
+#if !defined(AO_HAVE_fetch_and_sub1_release_write) \
+ && defined(AO_HAVE_fetch_and_sub1_release)
+# define AO_fetch_and_sub1_release_write(addr) \
+ AO_fetch_and_sub1_release(addr)
+# define AO_HAVE_fetch_and_sub1_release_write
+#endif
+#if !defined(AO_HAVE_fetch_and_sub1_acquire_read) \
+ && defined(AO_HAVE_fetch_and_sub1_read)
+# define AO_fetch_and_sub1_acquire_read(addr) \
+ AO_fetch_and_sub1_read(addr)
+# define AO_HAVE_fetch_and_sub1_acquire_read
+#endif
+#if !defined(AO_HAVE_fetch_and_sub1_acquire_read) \
+ && defined(AO_HAVE_fetch_and_sub1_acquire)
+# define AO_fetch_and_sub1_acquire_read(addr) \
+ AO_fetch_and_sub1_acquire(addr)
+# define AO_HAVE_fetch_and_sub1_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_fetch_and_sub1_acquire_read)
+# define AO_fetch_and_sub1_dd_acquire_read(addr) \
+ AO_fetch_and_sub1_acquire_read(addr)
+# define AO_HAVE_fetch_and_sub1_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_fetch_and_sub1)
+# define AO_fetch_and_sub1_dd_acquire_read(addr) \
+ AO_fetch_and_sub1(addr)
+# define AO_HAVE_fetch_and_sub1_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* and */
+#if defined(AO_HAVE_compare_and_swap_full) \
+ && !defined(AO_HAVE_and_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_and_full(volatile AO_t *addr, AO_t value)
+ {
+ AO_t old;
+
+ do
+ {
+ old = *(AO_t *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old,
+ old & value)));
+ }
+# define AO_HAVE_and_full
+#endif
+
+#if defined(AO_HAVE_and_full)
+# if !defined(AO_HAVE_and_release)
+# define AO_and_release(addr, val) AO_and_full(addr, val)
+# define AO_HAVE_and_release
+# endif
+# if !defined(AO_HAVE_and_acquire)
+# define AO_and_acquire(addr, val) AO_and_full(addr, val)
+# define AO_HAVE_and_acquire
+# endif
+# if !defined(AO_HAVE_and_write)
+# define AO_and_write(addr, val) AO_and_full(addr, val)
+# define AO_HAVE_and_write
+# endif
+# if !defined(AO_HAVE_and_read)
+# define AO_and_read(addr, val) AO_and_full(addr, val)
+# define AO_HAVE_and_read
+# endif
+#endif /* AO_HAVE_and_full */
+
+#if !defined(AO_HAVE_and) && defined(AO_HAVE_and_release)
+# define AO_and(addr, val) AO_and_release(addr, val)
+# define AO_HAVE_and
+#endif
+#if !defined(AO_HAVE_and) && defined(AO_HAVE_and_acquire)
+# define AO_and(addr, val) AO_and_acquire(addr, val)
+# define AO_HAVE_and
+#endif
+#if !defined(AO_HAVE_and) && defined(AO_HAVE_and_write)
+# define AO_and(addr, val) AO_and_write(addr, val)
+# define AO_HAVE_and
+#endif
+#if !defined(AO_HAVE_and) && defined(AO_HAVE_and_read)
+# define AO_and(addr, val) AO_and_read(addr, val)
+# define AO_HAVE_and
+#endif
+
+#if defined(AO_HAVE_and_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_and_full)
+# define AO_and_full(addr, val) \
+ (AO_nop_full(), AO_and_acquire(addr, val))
+# define AO_HAVE_and_full
+#endif
+
+#if !defined(AO_HAVE_and_release_write) \
+ && defined(AO_HAVE_and_write)
+# define AO_and_release_write(addr, val) AO_and_write(addr, val)
+# define AO_HAVE_and_release_write
+#endif
+#if !defined(AO_HAVE_and_release_write) \
+ && defined(AO_HAVE_and_release)
+# define AO_and_release_write(addr, val) AO_and_release(addr, val)
+# define AO_HAVE_and_release_write
+#endif
+#if !defined(AO_HAVE_and_acquire_read) \
+ && defined(AO_HAVE_and_read)
+# define AO_and_acquire_read(addr, val) AO_and_read(addr, val)
+# define AO_HAVE_and_acquire_read
+#endif
+#if !defined(AO_HAVE_and_acquire_read) \
+ && defined(AO_HAVE_and_acquire)
+# define AO_and_acquire_read(addr, val) AO_and_acquire(addr, val)
+# define AO_HAVE_and_acquire_read
+#endif
+
+/* or */
+#if defined(AO_HAVE_compare_and_swap_full) \
+ && !defined(AO_HAVE_or_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_or_full(volatile AO_t *addr, AO_t value)
+ {
+ AO_t old;
+
+ do
+ {
+ old = *(AO_t *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old,
+ old | value)));
+ }
+# define AO_HAVE_or_full
+#endif
+
+#if defined(AO_HAVE_or_full)
+# if !defined(AO_HAVE_or_release)
+# define AO_or_release(addr, val) AO_or_full(addr, val)
+# define AO_HAVE_or_release
+# endif
+# if !defined(AO_HAVE_or_acquire)
+# define AO_or_acquire(addr, val) AO_or_full(addr, val)
+# define AO_HAVE_or_acquire
+# endif
+# if !defined(AO_HAVE_or_write)
+# define AO_or_write(addr, val) AO_or_full(addr, val)
+# define AO_HAVE_or_write
+# endif
+# if !defined(AO_HAVE_or_read)
+# define AO_or_read(addr, val) AO_or_full(addr, val)
+# define AO_HAVE_or_read
+# endif
+#endif /* AO_HAVE_or_full */
+
+#if !defined(AO_HAVE_or) && defined(AO_HAVE_or_release)
+# define AO_or(addr, val) AO_or_release(addr, val)
+# define AO_HAVE_or
+#endif
+#if !defined(AO_HAVE_or) && defined(AO_HAVE_or_acquire)
+# define AO_or(addr, val) AO_or_acquire(addr, val)
+# define AO_HAVE_or
+#endif
+#if !defined(AO_HAVE_or) && defined(AO_HAVE_or_write)
+# define AO_or(addr, val) AO_or_write(addr, val)
+# define AO_HAVE_or
+#endif
+#if !defined(AO_HAVE_or) && defined(AO_HAVE_or_read)
+# define AO_or(addr, val) AO_or_read(addr, val)
+# define AO_HAVE_or
+#endif
+
+#if defined(AO_HAVE_or_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_or_full)
+# define AO_or_full(addr, val) \
+ (AO_nop_full(), AO_or_acquire(addr, val))
+# define AO_HAVE_or_full
+#endif
+
+#if !defined(AO_HAVE_or_release_write) \
+ && defined(AO_HAVE_or_write)
+# define AO_or_release_write(addr, val) AO_or_write(addr, val)
+# define AO_HAVE_or_release_write
+#endif
+#if !defined(AO_HAVE_or_release_write) \
+ && defined(AO_HAVE_or_release)
+# define AO_or_release_write(addr, val) AO_or_release(addr, val)
+# define AO_HAVE_or_release_write
+#endif
+#if !defined(AO_HAVE_or_acquire_read) && defined(AO_HAVE_or_read)
+# define AO_or_acquire_read(addr, val) AO_or_read(addr, val)
+# define AO_HAVE_or_acquire_read
+#endif
+#if !defined(AO_HAVE_or_acquire_read) \
+ && defined(AO_HAVE_or_acquire)
+# define AO_or_acquire_read(addr, val) AO_or_acquire(addr, val)
+# define AO_HAVE_or_acquire_read
+#endif
+
+/* xor */
+#if defined(AO_HAVE_compare_and_swap_full) \
+ && !defined(AO_HAVE_xor_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_xor_full(volatile AO_t *addr, AO_t value)
+ {
+ AO_t old;
+
+ do
+ {
+ old = *(AO_t *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old,
+ old ^ value)));
+ }
+# define AO_HAVE_xor_full
+#endif
+
+#if defined(AO_HAVE_xor_full)
+# if !defined(AO_HAVE_xor_release)
+# define AO_xor_release(addr, val) AO_xor_full(addr, val)
+# define AO_HAVE_xor_release
+# endif
+# if !defined(AO_HAVE_xor_acquire)
+# define AO_xor_acquire(addr, val) AO_xor_full(addr, val)
+# define AO_HAVE_xor_acquire
+# endif
+# if !defined(AO_HAVE_xor_write)
+# define AO_xor_write(addr, val) AO_xor_full(addr, val)
+# define AO_HAVE_xor_write
+# endif
+# if !defined(AO_HAVE_xor_read)
+# define AO_xor_read(addr, val) AO_xor_full(addr, val)
+# define AO_HAVE_xor_read
+# endif
+#endif /* AO_HAVE_xor_full */
+
+#if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_release)
+# define AO_xor(addr, val) AO_xor_release(addr, val)
+# define AO_HAVE_xor
+#endif
+#if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_acquire)
+# define AO_xor(addr, val) AO_xor_acquire(addr, val)
+# define AO_HAVE_xor
+#endif
+#if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_write)
+# define AO_xor(addr, val) AO_xor_write(addr, val)
+# define AO_HAVE_xor
+#endif
+#if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_read)
+# define AO_xor(addr, val) AO_xor_read(addr, val)
+# define AO_HAVE_xor
+#endif
+
+#if defined(AO_HAVE_xor_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_xor_full)
+# define AO_xor_full(addr, val) \
+ (AO_nop_full(), AO_xor_acquire(addr, val))
+# define AO_HAVE_xor_full
+#endif
+
+#if !defined(AO_HAVE_xor_release_write) \
+ && defined(AO_HAVE_xor_write)
+# define AO_xor_release_write(addr, val) AO_xor_write(addr, val)
+# define AO_HAVE_xor_release_write
+#endif
+#if !defined(AO_HAVE_xor_release_write) \
+ && defined(AO_HAVE_xor_release)
+# define AO_xor_release_write(addr, val) AO_xor_release(addr, val)
+# define AO_HAVE_xor_release_write
+#endif
+#if !defined(AO_HAVE_xor_acquire_read) \
+ && defined(AO_HAVE_xor_read)
+# define AO_xor_acquire_read(addr, val) AO_xor_read(addr, val)
+# define AO_HAVE_xor_acquire_read
+#endif
+#if !defined(AO_HAVE_xor_acquire_read) \
+ && defined(AO_HAVE_xor_acquire)
+# define AO_xor_acquire_read(addr, val) AO_xor_acquire(addr, val)
+# define AO_HAVE_xor_acquire_read
+#endif
+
+/* and/or/xor_dd_acquire_read are meaningless. */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-arithm.template b/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-arithm.template
new file mode 100644
index 0000000000..0a21ec234b
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-arithm.template
@@ -0,0 +1,852 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* XSIZE_compare_and_swap (based on fetch_compare_and_swap) */
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_full)
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_full(volatile XCTYPE *addr, XCTYPE old_val,
+ XCTYPE new_val)
+ {
+ return AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_full
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old_val,
+ XCTYPE new_val)
+ {
+ return AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_acquire
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_release)
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_release(volatile XCTYPE *addr, XCTYPE old_val,
+ XCTYPE new_val)
+ {
+ return AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_release
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_write)
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_write(volatile XCTYPE *addr, XCTYPE old_val,
+ XCTYPE new_val)
+ {
+ return AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_write
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_read)
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_read(volatile XCTYPE *addr, XCTYPE old_val,
+ XCTYPE new_val)
+ {
+ return AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_read
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap)
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap(volatile XCTYPE *addr, XCTYPE old_val,
+ XCTYPE new_val)
+ {
+ return AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) == old_val;
+ }
+# define AO_HAVE_XSIZE_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_release_write)
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_release_write(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ return AO_XSIZE_fetch_compare_and_swap_release_write(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_release_write
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read)
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_acquire_read(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ return AO_XSIZE_fetch_compare_and_swap_acquire_read(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_acquire_read
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read)
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_dd_acquire_read(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ return AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr, old_val,
+ new_val) == old_val;
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read
+#endif
+
+/* XSIZE_fetch_and_add */
+/* We first try to implement fetch_and_add variants in terms of the */
+/* corresponding compare_and_swap variants to minimize adding barriers. */
+#if defined(AO_HAVE_XSIZE_compare_and_swap_full) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_and_add_full(volatile XCTYPE *addr, XCTYPE incr)
+ {
+ XCTYPE old;
+
+ do
+ {
+ old = *(XCTYPE *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_XSIZE_fetch_and_add_full
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_and_add_acquire(volatile XCTYPE *addr, XCTYPE incr)
+ {
+ XCTYPE old;
+
+ do
+ {
+ old = *(XCTYPE *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_acquire(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_XSIZE_fetch_and_add_acquire
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap_release) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add_release)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_and_add_release(volatile XCTYPE *addr, XCTYPE incr)
+ {
+ XCTYPE old;
+
+ do
+ {
+ old = *(XCTYPE *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_release(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_XSIZE_fetch_and_add_release
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_and_add(volatile XCTYPE *addr, XCTYPE incr)
+ {
+ XCTYPE old;
+
+ do
+ {
+ old = *(XCTYPE *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap(addr, old,
+ old + incr)));
+ return old;
+ }
+# define AO_HAVE_XSIZE_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_and_add_full)
+# if !defined(AO_HAVE_XSIZE_fetch_and_add_release)
+# define AO_XSIZE_fetch_and_add_release(addr, val) \
+ AO_XSIZE_fetch_and_add_full(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add_release
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire)
+# define AO_XSIZE_fetch_and_add_acquire(addr, val) \
+ AO_XSIZE_fetch_and_add_full(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add_acquire
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_and_add_write)
+# define AO_XSIZE_fetch_and_add_write(addr, val) \
+ AO_XSIZE_fetch_and_add_full(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add_write
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_and_add_read)
+# define AO_XSIZE_fetch_and_add_read(addr, val) \
+ AO_XSIZE_fetch_and_add_full(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add_read
+# endif
+#endif /* AO_HAVE_XSIZE_fetch_and_add_full */
+
+#if defined(AO_HAVE_XSIZE_fetch_and_add) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add_acquire)
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_and_add_acquire(volatile XCTYPE *addr, XCTYPE incr)
+ {
+ XCTYPE result = AO_XSIZE_fetch_and_add(addr, incr);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_XSIZE_fetch_and_add_acquire
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add_release)
+# define AO_XSIZE_fetch_and_add_release(addr, incr) \
+ (AO_nop_full(), AO_XSIZE_fetch_and_add(addr, incr))
+# define AO_HAVE_XSIZE_fetch_and_add_release
+#endif
+
+#if !defined(AO_HAVE_XSIZE_fetch_and_add) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add_release)
+# define AO_XSIZE_fetch_and_add(addr, val) \
+ AO_XSIZE_fetch_and_add_release(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add_acquire)
+# define AO_XSIZE_fetch_and_add(addr, val) \
+ AO_XSIZE_fetch_and_add_acquire(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add_write)
+# define AO_XSIZE_fetch_and_add(addr, val) \
+ AO_XSIZE_fetch_and_add_write(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add_read)
+# define AO_XSIZE_fetch_and_add(addr, val) \
+ AO_XSIZE_fetch_and_add_read(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \
+ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_XSIZE_fetch_and_add_full)
+# define AO_XSIZE_fetch_and_add_full(addr, val) \
+ (AO_nop_full(), AO_XSIZE_fetch_and_add_acquire(addr, val))
+# define AO_HAVE_XSIZE_fetch_and_add_full
+#endif
+
+#if !defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add_write)
+# define AO_XSIZE_fetch_and_add_release_write(addr, val) \
+ AO_XSIZE_fetch_and_add_write(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add_release)
+# define AO_XSIZE_fetch_and_add_release_write(addr, val) \
+ AO_XSIZE_fetch_and_add_release(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add_release_write
+#endif
+
+#if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add_read)
+# define AO_XSIZE_fetch_and_add_acquire_read(addr, val) \
+ AO_XSIZE_fetch_and_add_read(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add_acquire_read
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add_acquire)
+# define AO_XSIZE_fetch_and_add_acquire_read(addr, val) \
+ AO_XSIZE_fetch_and_add_acquire(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read)
+# define AO_XSIZE_fetch_and_add_dd_acquire_read(addr, val) \
+ AO_XSIZE_fetch_and_add_acquire_read(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_XSIZE_fetch_and_add)
+# define AO_XSIZE_fetch_and_add_dd_acquire_read(addr, val) \
+ AO_XSIZE_fetch_and_add(addr, val)
+# define AO_HAVE_XSIZE_fetch_and_add_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* XSIZE_fetch_and_add1 */
+#if defined(AO_HAVE_XSIZE_fetch_and_add_full) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add1_full)
+# define AO_XSIZE_fetch_and_add1_full(addr) \
+ AO_XSIZE_fetch_and_add_full(addr, 1)
+# define AO_HAVE_XSIZE_fetch_and_add1_full
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_release) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add1_release)
+# define AO_XSIZE_fetch_and_add1_release(addr) \
+ AO_XSIZE_fetch_and_add_release(addr, 1)
+# define AO_HAVE_XSIZE_fetch_and_add1_release
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire)
+# define AO_XSIZE_fetch_and_add1_acquire(addr) \
+ AO_XSIZE_fetch_and_add_acquire(addr, 1)
+# define AO_HAVE_XSIZE_fetch_and_add1_acquire
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_write) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add1_write)
+# define AO_XSIZE_fetch_and_add1_write(addr) \
+ AO_XSIZE_fetch_and_add_write(addr, 1)
+# define AO_HAVE_XSIZE_fetch_and_add1_write
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_read) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add1_read)
+# define AO_XSIZE_fetch_and_add1_read(addr) \
+ AO_XSIZE_fetch_and_add_read(addr, 1)
+# define AO_HAVE_XSIZE_fetch_and_add1_read
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write)
+# define AO_XSIZE_fetch_and_add1_release_write(addr) \
+ AO_XSIZE_fetch_and_add_release_write(addr, 1)
+# define AO_HAVE_XSIZE_fetch_and_add1_release_write
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read)
+# define AO_XSIZE_fetch_and_add1_acquire_read(addr) \
+ AO_XSIZE_fetch_and_add_acquire_read(addr, 1)
+# define AO_HAVE_XSIZE_fetch_and_add1_acquire_read
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add1)
+# define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add(addr, 1)
+# define AO_HAVE_XSIZE_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_and_add1_full)
+# if !defined(AO_HAVE_XSIZE_fetch_and_add1_release)
+# define AO_XSIZE_fetch_and_add1_release(addr) \
+ AO_XSIZE_fetch_and_add1_full(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1_release
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire)
+# define AO_XSIZE_fetch_and_add1_acquire(addr) \
+ AO_XSIZE_fetch_and_add1_full(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1_acquire
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_and_add1_write)
+# define AO_XSIZE_fetch_and_add1_write(addr) \
+ AO_XSIZE_fetch_and_add1_full(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1_write
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_and_add1_read)
+# define AO_XSIZE_fetch_and_add1_read(addr) \
+ AO_XSIZE_fetch_and_add1_full(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1_read
+# endif
+#endif /* AO_HAVE_XSIZE_fetch_and_add1_full */
+
+#if !defined(AO_HAVE_XSIZE_fetch_and_add1) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add1_release)
+# define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_release(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add1) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add1_acquire)
+# define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_acquire(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add1) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add1_write)
+# define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_write(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add1) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add1_read)
+# define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_read(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_add1_full)
+# define AO_XSIZE_fetch_and_add1_full(addr) \
+ (AO_nop_full(), AO_XSIZE_fetch_and_add1_acquire(addr))
+# define AO_HAVE_XSIZE_fetch_and_add1_full
+#endif
+
+#if !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add1_write)
+# define AO_XSIZE_fetch_and_add1_release_write(addr) \
+ AO_XSIZE_fetch_and_add1_write(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add1_release)
+# define AO_XSIZE_fetch_and_add1_release_write(addr) \
+ AO_XSIZE_fetch_and_add1_release(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add1_read)
+# define AO_XSIZE_fetch_and_add1_acquire_read(addr) \
+ AO_XSIZE_fetch_and_add1_read(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1_acquire_read
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) \
+ && defined(AO_HAVE_XSIZE_fetch_and_add1_acquire)
+# define AO_XSIZE_fetch_and_add1_acquire_read(addr) \
+ AO_XSIZE_fetch_and_add1_acquire(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read)
+# define AO_XSIZE_fetch_and_add1_dd_acquire_read(addr) \
+ AO_XSIZE_fetch_and_add1_acquire_read(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_XSIZE_fetch_and_add1)
+# define AO_XSIZE_fetch_and_add1_dd_acquire_read(addr) \
+ AO_XSIZE_fetch_and_add1(addr)
+# define AO_HAVE_XSIZE_fetch_and_add1_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* XSIZE_fetch_and_sub1 */
+#if defined(AO_HAVE_XSIZE_fetch_and_add_full) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_full)
+# define AO_XSIZE_fetch_and_sub1_full(addr) \
+ AO_XSIZE_fetch_and_add_full(addr, (XCTYPE)(-1))
+# define AO_HAVE_XSIZE_fetch_and_sub1_full
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_release) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_release)
+# define AO_XSIZE_fetch_and_sub1_release(addr) \
+ AO_XSIZE_fetch_and_add_release(addr, (XCTYPE)(-1))
+# define AO_HAVE_XSIZE_fetch_and_sub1_release
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire)
+# define AO_XSIZE_fetch_and_sub1_acquire(addr) \
+ AO_XSIZE_fetch_and_add_acquire(addr, (XCTYPE)(-1))
+# define AO_HAVE_XSIZE_fetch_and_sub1_acquire
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_write) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_write)
+# define AO_XSIZE_fetch_and_sub1_write(addr) \
+ AO_XSIZE_fetch_and_add_write(addr, (XCTYPE)(-1))
+# define AO_HAVE_XSIZE_fetch_and_sub1_write
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_read) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_read)
+# define AO_XSIZE_fetch_and_sub1_read(addr) \
+ AO_XSIZE_fetch_and_add_read(addr, (XCTYPE)(-1))
+# define AO_HAVE_XSIZE_fetch_and_sub1_read
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write)
+# define AO_XSIZE_fetch_and_sub1_release_write(addr) \
+ AO_XSIZE_fetch_and_add_release_write(addr, (XCTYPE)(-1))
+# define AO_HAVE_XSIZE_fetch_and_sub1_release_write
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read)
+# define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \
+ AO_XSIZE_fetch_and_add_acquire_read(addr, (XCTYPE)(-1))
+# define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_and_add) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_sub1)
+# define AO_XSIZE_fetch_and_sub1(addr) \
+ AO_XSIZE_fetch_and_add(addr, (XCTYPE)(-1))
+# define AO_HAVE_XSIZE_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_and_sub1_full)
+# if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release)
+# define AO_XSIZE_fetch_and_sub1_release(addr) \
+ AO_XSIZE_fetch_and_sub1_full(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1_release
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire)
+# define AO_XSIZE_fetch_and_sub1_acquire(addr) \
+ AO_XSIZE_fetch_and_sub1_full(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1_acquire
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_and_sub1_write)
+# define AO_XSIZE_fetch_and_sub1_write(addr) \
+ AO_XSIZE_fetch_and_sub1_full(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1_write
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_and_sub1_read)
+# define AO_XSIZE_fetch_and_sub1_read(addr) \
+ AO_XSIZE_fetch_and_sub1_full(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1_read
+# endif
+#endif /* AO_HAVE_XSIZE_fetch_and_sub1_full */
+
+#if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \
+ && defined(AO_HAVE_XSIZE_fetch_and_sub1_release)
+# define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_release(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \
+ && defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire)
+# define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_acquire(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \
+ && defined(AO_HAVE_XSIZE_fetch_and_sub1_write)
+# define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_write(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \
+ && defined(AO_HAVE_XSIZE_fetch_and_sub1_read)
+# define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_read(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_full)
+# define AO_XSIZE_fetch_and_sub1_full(addr) \
+ (AO_nop_full(), AO_XSIZE_fetch_and_sub1_acquire(addr))
+# define AO_HAVE_XSIZE_fetch_and_sub1_full
+#endif
+
+#if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write) \
+ && defined(AO_HAVE_XSIZE_fetch_and_sub1_write)
+# define AO_XSIZE_fetch_and_sub1_release_write(addr) \
+ AO_XSIZE_fetch_and_sub1_write(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write) \
+ && defined(AO_HAVE_XSIZE_fetch_and_sub1_release)
+# define AO_XSIZE_fetch_and_sub1_release_write(addr) \
+ AO_XSIZE_fetch_and_sub1_release(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) \
+ && defined(AO_HAVE_XSIZE_fetch_and_sub1_read)
+# define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \
+ AO_XSIZE_fetch_and_sub1_read(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) \
+ && defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire)
+# define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \
+ AO_XSIZE_fetch_and_sub1_acquire(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read)
+# define AO_XSIZE_fetch_and_sub1_dd_acquire_read(addr) \
+ AO_XSIZE_fetch_and_sub1_acquire_read(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_XSIZE_fetch_and_sub1)
+# define AO_XSIZE_fetch_and_sub1_dd_acquire_read(addr) \
+ AO_XSIZE_fetch_and_sub1(addr)
+# define AO_HAVE_XSIZE_fetch_and_sub1_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* XSIZE_and */
+#if defined(AO_HAVE_XSIZE_compare_and_swap_full) \
+ && !defined(AO_HAVE_XSIZE_and_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_XSIZE_and_full(volatile XCTYPE *addr, XCTYPE value)
+ {
+ XCTYPE old;
+
+ do
+ {
+ old = *(XCTYPE *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old,
+ old & value)));
+ }
+# define AO_HAVE_XSIZE_and_full
+#endif
+
+#if defined(AO_HAVE_XSIZE_and_full)
+# if !defined(AO_HAVE_XSIZE_and_release)
+# define AO_XSIZE_and_release(addr, val) AO_XSIZE_and_full(addr, val)
+# define AO_HAVE_XSIZE_and_release
+# endif
+# if !defined(AO_HAVE_XSIZE_and_acquire)
+# define AO_XSIZE_and_acquire(addr, val) AO_XSIZE_and_full(addr, val)
+# define AO_HAVE_XSIZE_and_acquire
+# endif
+# if !defined(AO_HAVE_XSIZE_and_write)
+# define AO_XSIZE_and_write(addr, val) AO_XSIZE_and_full(addr, val)
+# define AO_HAVE_XSIZE_and_write
+# endif
+# if !defined(AO_HAVE_XSIZE_and_read)
+# define AO_XSIZE_and_read(addr, val) AO_XSIZE_and_full(addr, val)
+# define AO_HAVE_XSIZE_and_read
+# endif
+#endif /* AO_HAVE_XSIZE_and_full */
+
+#if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_release)
+# define AO_XSIZE_and(addr, val) AO_XSIZE_and_release(addr, val)
+# define AO_HAVE_XSIZE_and
+#endif
+#if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_acquire)
+# define AO_XSIZE_and(addr, val) AO_XSIZE_and_acquire(addr, val)
+# define AO_HAVE_XSIZE_and
+#endif
+#if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_write)
+# define AO_XSIZE_and(addr, val) AO_XSIZE_and_write(addr, val)
+# define AO_HAVE_XSIZE_and
+#endif
+#if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_read)
+# define AO_XSIZE_and(addr, val) AO_XSIZE_and_read(addr, val)
+# define AO_HAVE_XSIZE_and
+#endif
+
+#if defined(AO_HAVE_XSIZE_and_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_and_full)
+# define AO_XSIZE_and_full(addr, val) \
+ (AO_nop_full(), AO_XSIZE_and_acquire(addr, val))
+# define AO_HAVE_XSIZE_and_full
+#endif
+
+#if !defined(AO_HAVE_XSIZE_and_release_write) \
+ && defined(AO_HAVE_XSIZE_and_write)
+# define AO_XSIZE_and_release_write(addr, val) AO_XSIZE_and_write(addr, val)
+# define AO_HAVE_XSIZE_and_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_and_release_write) \
+ && defined(AO_HAVE_XSIZE_and_release)
+# define AO_XSIZE_and_release_write(addr, val) AO_XSIZE_and_release(addr, val)
+# define AO_HAVE_XSIZE_and_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_and_acquire_read) \
+ && defined(AO_HAVE_XSIZE_and_read)
+# define AO_XSIZE_and_acquire_read(addr, val) AO_XSIZE_and_read(addr, val)
+# define AO_HAVE_XSIZE_and_acquire_read
+#endif
+#if !defined(AO_HAVE_XSIZE_and_acquire_read) \
+ && defined(AO_HAVE_XSIZE_and_acquire)
+# define AO_XSIZE_and_acquire_read(addr, val) AO_XSIZE_and_acquire(addr, val)
+# define AO_HAVE_XSIZE_and_acquire_read
+#endif
+
+/* XSIZE_or */
+#if defined(AO_HAVE_XSIZE_compare_and_swap_full) \
+ && !defined(AO_HAVE_XSIZE_or_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_XSIZE_or_full(volatile XCTYPE *addr, XCTYPE value)
+ {
+ XCTYPE old;
+
+ do
+ {
+ old = *(XCTYPE *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old,
+ old | value)));
+ }
+# define AO_HAVE_XSIZE_or_full
+#endif
+
+#if defined(AO_HAVE_XSIZE_or_full)
+# if !defined(AO_HAVE_XSIZE_or_release)
+# define AO_XSIZE_or_release(addr, val) AO_XSIZE_or_full(addr, val)
+# define AO_HAVE_XSIZE_or_release
+# endif
+# if !defined(AO_HAVE_XSIZE_or_acquire)
+# define AO_XSIZE_or_acquire(addr, val) AO_XSIZE_or_full(addr, val)
+# define AO_HAVE_XSIZE_or_acquire
+# endif
+# if !defined(AO_HAVE_XSIZE_or_write)
+# define AO_XSIZE_or_write(addr, val) AO_XSIZE_or_full(addr, val)
+# define AO_HAVE_XSIZE_or_write
+# endif
+# if !defined(AO_HAVE_XSIZE_or_read)
+# define AO_XSIZE_or_read(addr, val) AO_XSIZE_or_full(addr, val)
+# define AO_HAVE_XSIZE_or_read
+# endif
+#endif /* AO_HAVE_XSIZE_or_full */
+
+#if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_release)
+# define AO_XSIZE_or(addr, val) AO_XSIZE_or_release(addr, val)
+# define AO_HAVE_XSIZE_or
+#endif
+#if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_acquire)
+# define AO_XSIZE_or(addr, val) AO_XSIZE_or_acquire(addr, val)
+# define AO_HAVE_XSIZE_or
+#endif
+#if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_write)
+# define AO_XSIZE_or(addr, val) AO_XSIZE_or_write(addr, val)
+# define AO_HAVE_XSIZE_or
+#endif
+#if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_read)
+# define AO_XSIZE_or(addr, val) AO_XSIZE_or_read(addr, val)
+# define AO_HAVE_XSIZE_or
+#endif
+
+#if defined(AO_HAVE_XSIZE_or_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_or_full)
+# define AO_XSIZE_or_full(addr, val) \
+ (AO_nop_full(), AO_XSIZE_or_acquire(addr, val))
+# define AO_HAVE_XSIZE_or_full
+#endif
+
+#if !defined(AO_HAVE_XSIZE_or_release_write) \
+ && defined(AO_HAVE_XSIZE_or_write)
+# define AO_XSIZE_or_release_write(addr, val) AO_XSIZE_or_write(addr, val)
+# define AO_HAVE_XSIZE_or_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_or_release_write) \
+ && defined(AO_HAVE_XSIZE_or_release)
+# define AO_XSIZE_or_release_write(addr, val) AO_XSIZE_or_release(addr, val)
+# define AO_HAVE_XSIZE_or_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_or_acquire_read) && defined(AO_HAVE_XSIZE_or_read)
+# define AO_XSIZE_or_acquire_read(addr, val) AO_XSIZE_or_read(addr, val)
+# define AO_HAVE_XSIZE_or_acquire_read
+#endif
+#if !defined(AO_HAVE_XSIZE_or_acquire_read) \
+ && defined(AO_HAVE_XSIZE_or_acquire)
+# define AO_XSIZE_or_acquire_read(addr, val) AO_XSIZE_or_acquire(addr, val)
+# define AO_HAVE_XSIZE_or_acquire_read
+#endif
+
+/* XSIZE_xor */
+#if defined(AO_HAVE_XSIZE_compare_and_swap_full) \
+ && !defined(AO_HAVE_XSIZE_xor_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_XSIZE_xor_full(volatile XCTYPE *addr, XCTYPE value)
+ {
+ XCTYPE old;
+
+ do
+ {
+ old = *(XCTYPE *)addr;
+ }
+ while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old,
+ old ^ value)));
+ }
+# define AO_HAVE_XSIZE_xor_full
+#endif
+
+#if defined(AO_HAVE_XSIZE_xor_full)
+# if !defined(AO_HAVE_XSIZE_xor_release)
+# define AO_XSIZE_xor_release(addr, val) AO_XSIZE_xor_full(addr, val)
+# define AO_HAVE_XSIZE_xor_release
+# endif
+# if !defined(AO_HAVE_XSIZE_xor_acquire)
+# define AO_XSIZE_xor_acquire(addr, val) AO_XSIZE_xor_full(addr, val)
+# define AO_HAVE_XSIZE_xor_acquire
+# endif
+# if !defined(AO_HAVE_XSIZE_xor_write)
+# define AO_XSIZE_xor_write(addr, val) AO_XSIZE_xor_full(addr, val)
+# define AO_HAVE_XSIZE_xor_write
+# endif
+# if !defined(AO_HAVE_XSIZE_xor_read)
+# define AO_XSIZE_xor_read(addr, val) AO_XSIZE_xor_full(addr, val)
+# define AO_HAVE_XSIZE_xor_read
+# endif
+#endif /* AO_HAVE_XSIZE_xor_full */
+
+#if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_release)
+# define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_release(addr, val)
+# define AO_HAVE_XSIZE_xor
+#endif
+#if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_acquire)
+# define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_acquire(addr, val)
+# define AO_HAVE_XSIZE_xor
+#endif
+#if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_write)
+# define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_write(addr, val)
+# define AO_HAVE_XSIZE_xor
+#endif
+#if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_read)
+# define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_read(addr, val)
+# define AO_HAVE_XSIZE_xor
+#endif
+
+#if defined(AO_HAVE_XSIZE_xor_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_xor_full)
+# define AO_XSIZE_xor_full(addr, val) \
+ (AO_nop_full(), AO_XSIZE_xor_acquire(addr, val))
+# define AO_HAVE_XSIZE_xor_full
+#endif
+
+#if !defined(AO_HAVE_XSIZE_xor_release_write) \
+ && defined(AO_HAVE_XSIZE_xor_write)
+# define AO_XSIZE_xor_release_write(addr, val) AO_XSIZE_xor_write(addr, val)
+# define AO_HAVE_XSIZE_xor_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_xor_release_write) \
+ && defined(AO_HAVE_XSIZE_xor_release)
+# define AO_XSIZE_xor_release_write(addr, val) AO_XSIZE_xor_release(addr, val)
+# define AO_HAVE_XSIZE_xor_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_xor_acquire_read) \
+ && defined(AO_HAVE_XSIZE_xor_read)
+# define AO_XSIZE_xor_acquire_read(addr, val) AO_XSIZE_xor_read(addr, val)
+# define AO_HAVE_XSIZE_xor_acquire_read
+#endif
+#if !defined(AO_HAVE_XSIZE_xor_acquire_read) \
+ && defined(AO_HAVE_XSIZE_xor_acquire)
+# define AO_XSIZE_xor_acquire_read(addr, val) AO_XSIZE_xor_acquire(addr, val)
+# define AO_HAVE_XSIZE_xor_acquire_read
+#endif
+
+/* XSIZE_and/or/xor_dd_acquire_read are meaningless. */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-small.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-small.h
new file mode 100644
index 0000000000..d93d0e827b
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-small.h
@@ -0,0 +1,2640 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* char_fetch_compare_and_swap */
+#if defined(AO_HAVE_char_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_fetch_compare_and_swap_acquire)
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_compare_and_swap_acquire(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ unsigned/**/char result = AO_char_fetch_compare_and_swap(addr, old_val, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_char_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_fetch_compare_and_swap_release)
+# define AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_char_fetch_compare_and_swap(addr, old_val, new_val))
+# define AO_HAVE_char_fetch_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_char_fetch_compare_and_swap_full)
+# if !defined(AO_HAVE_char_fetch_compare_and_swap_release)
+# define AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire)
+# define AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) \
+ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_char_fetch_compare_and_swap_write)
+# define AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) \
+ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_char_fetch_compare_and_swap_read)
+# define AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) \
+ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_char_fetch_compare_and_swap_full */
+
+#if !defined(AO_HAVE_char_fetch_compare_and_swap) \
+ && defined(AO_HAVE_char_fetch_compare_and_swap_release)
+# define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_char_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_char_fetch_compare_and_swap) \
+ && defined(AO_HAVE_char_fetch_compare_and_swap_acquire)
+# define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_char_fetch_compare_and_swap) \
+ && defined(AO_HAVE_char_fetch_compare_and_swap_write)
+# define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_char_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_char_fetch_compare_and_swap) \
+ && defined(AO_HAVE_char_fetch_compare_and_swap_read)
+# define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_char_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_char_fetch_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_fetch_compare_and_swap_full)
+# define AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val))
+# define AO_HAVE_char_fetch_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_char_fetch_compare_and_swap_write)
+# define AO_char_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_char_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_char_fetch_compare_and_swap_release)
+# define AO_char_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_char_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_char_fetch_compare_and_swap_read)
+# define AO_char_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_char_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_char_fetch_compare_and_swap_acquire)
+# define AO_char_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read)
+# define AO_char_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_char_fetch_compare_and_swap_acquire_read(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_char_fetch_compare_and_swap)
+# define AO_char_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_char_fetch_compare_and_swap(addr, old_val, new_val)
+# define AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* char_compare_and_swap */
+#if defined(AO_HAVE_char_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_char_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old,
+ unsigned/**/char new_val)
+ {
+ int result = AO_char_compare_and_swap(addr, old, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_char_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_char_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_compare_and_swap_release)
+# define AO_char_compare_and_swap_release(addr, old, new_val) \
+ (AO_nop_full(), AO_char_compare_and_swap(addr, old, new_val))
+# define AO_HAVE_char_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_char_compare_and_swap_full)
+# if !defined(AO_HAVE_char_compare_and_swap_release)
+# define AO_char_compare_and_swap_release(addr, old, new_val) \
+ AO_char_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_char_compare_and_swap_acquire)
+# define AO_char_compare_and_swap_acquire(addr, old, new_val) \
+ AO_char_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_char_compare_and_swap_write)
+# define AO_char_compare_and_swap_write(addr, old, new_val) \
+ AO_char_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_char_compare_and_swap_read)
+# define AO_char_compare_and_swap_read(addr, old, new_val) \
+ AO_char_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_char_compare_and_swap_full */
+
+#if !defined(AO_HAVE_char_compare_and_swap) \
+ && defined(AO_HAVE_char_compare_and_swap_release)
+# define AO_char_compare_and_swap(addr, old, new_val) \
+ AO_char_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap
+#endif
+#if !defined(AO_HAVE_char_compare_and_swap) \
+ && defined(AO_HAVE_char_compare_and_swap_acquire)
+# define AO_char_compare_and_swap(addr, old, new_val) \
+ AO_char_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap
+#endif
+#if !defined(AO_HAVE_char_compare_and_swap) \
+ && defined(AO_HAVE_char_compare_and_swap_write)
+# define AO_char_compare_and_swap(addr, old, new_val) \
+ AO_char_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap
+#endif
+#if !defined(AO_HAVE_char_compare_and_swap) \
+ && defined(AO_HAVE_char_compare_and_swap_read)
+# define AO_char_compare_and_swap(addr, old, new_val) \
+ AO_char_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_compare_and_swap_full)
+# define AO_char_compare_and_swap_full(addr, old, new_val) \
+ (AO_nop_full(), \
+ AO_char_compare_and_swap_acquire(addr, old, new_val))
+# define AO_HAVE_char_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_char_compare_and_swap_release_write) \
+ && defined(AO_HAVE_char_compare_and_swap_write)
+# define AO_char_compare_and_swap_release_write(addr, old, new_val) \
+ AO_char_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_char_compare_and_swap_release_write) \
+ && defined(AO_HAVE_char_compare_and_swap_release)
+# define AO_char_compare_and_swap_release_write(addr, old, new_val) \
+ AO_char_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_char_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_char_compare_and_swap_read)
+# define AO_char_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_char_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_char_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_char_compare_and_swap_acquire)
+# define AO_char_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_char_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_char_compare_and_swap_acquire_read)
+# define AO_char_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_char_compare_and_swap_acquire_read(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_char_compare_and_swap)
+# define AO_char_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_char_compare_and_swap(addr, old, new_val)
+# define AO_HAVE_char_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* char_load */
+#if defined(AO_HAVE_char_load_full) && !defined(AO_HAVE_char_load_acquire)
+# define AO_char_load_acquire(addr) AO_char_load_full(addr)
+# define AO_HAVE_char_load_acquire
+#endif
+
+#if defined(AO_HAVE_char_load_acquire) && !defined(AO_HAVE_char_load)
+# define AO_char_load(addr) AO_char_load_acquire(addr)
+# define AO_HAVE_char_load
+#endif
+
+#if defined(AO_HAVE_char_load_full) && !defined(AO_HAVE_char_load_read)
+# define AO_char_load_read(addr) AO_char_load_full(addr)
+# define AO_HAVE_char_load_read
+#endif
+
+#if !defined(AO_HAVE_char_load_acquire_read) \
+ && defined(AO_HAVE_char_load_acquire)
+# define AO_char_load_acquire_read(addr) AO_char_load_acquire(addr)
+# define AO_HAVE_char_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_char_load) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_load_acquire)
+ AO_INLINE unsigned/**/char
+ AO_char_load_acquire(const volatile unsigned/**/char *addr)
+ {
+ unsigned/**/char result = AO_char_load(addr);
+
+ /* Acquire barrier would be useless, since the load could be delayed */
+ /* beyond it. */
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_char_load_acquire
+#endif
+
+#if defined(AO_HAVE_char_load) && defined(AO_HAVE_nop_read) \
+ && !defined(AO_HAVE_char_load_read)
+ AO_INLINE unsigned/**/char
+ AO_char_load_read(const volatile unsigned/**/char *addr)
+ {
+ unsigned/**/char result = AO_char_load(addr);
+
+ AO_nop_read();
+ return result;
+ }
+# define AO_HAVE_char_load_read
+#endif
+
+#if defined(AO_HAVE_char_load_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_load_full)
+# define AO_char_load_full(addr) (AO_nop_full(), AO_char_load_acquire(addr))
+# define AO_HAVE_char_load_full
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap_read) \
+ && !defined(AO_HAVE_char_load_read)
+# define AO_char_CAS_BASED_LOAD_READ
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/char
+ AO_char_load_read(const volatile unsigned/**/char *addr)
+ {
+ unsigned/**/char result;
+
+ do {
+ result = *(const unsigned/**/char *)addr;
+ } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_read(
+ (volatile unsigned/**/char *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_char_load_read
+#endif
+
+#if !defined(AO_HAVE_char_load_acquire_read) \
+ && defined(AO_HAVE_char_load_read)
+# define AO_char_load_acquire_read(addr) AO_char_load_read(addr)
+# define AO_HAVE_char_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_char_load_acquire_read) && !defined(AO_HAVE_char_load) \
+ && (!defined(AO_char_CAS_BASED_LOAD_READ) \
+ || !defined(AO_HAVE_char_compare_and_swap))
+# define AO_char_load(addr) AO_char_load_acquire_read(addr)
+# define AO_HAVE_char_load
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap_full) \
+ && !defined(AO_HAVE_char_load_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/char
+ AO_char_load_full(const volatile unsigned/**/char *addr)
+ {
+ unsigned/**/char result;
+
+ do {
+ result = *(const unsigned/**/char *)addr;
+ } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(
+ (volatile unsigned/**/char *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_char_load_full
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_char_load_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/char
+ AO_char_load_acquire(const volatile unsigned/**/char *addr)
+ {
+ unsigned/**/char result;
+
+ do {
+ result = *(const unsigned/**/char *)addr;
+ } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_acquire(
+ (volatile unsigned/**/char *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_char_load_acquire
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap) && !defined(AO_HAVE_char_load)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/char
+ AO_char_load(const volatile unsigned/**/char *addr)
+ {
+ unsigned/**/char result;
+
+ do {
+ result = *(const unsigned/**/char *)addr;
+ } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap(
+ (volatile unsigned/**/char *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_char_load
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_char_load_acquire_read)
+# define AO_char_load_dd_acquire_read(addr) \
+ AO_char_load_acquire_read(addr)
+# define AO_HAVE_char_load_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_char_load)
+# define AO_char_load_dd_acquire_read(addr) AO_char_load(addr)
+# define AO_HAVE_char_load_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* char_store */
+#if defined(AO_HAVE_char_store_full) && !defined(AO_HAVE_char_store_release)
+# define AO_char_store_release(addr, val) AO_char_store_full(addr, val)
+# define AO_HAVE_char_store_release
+#endif
+
+#if defined(AO_HAVE_char_store_release) && !defined(AO_HAVE_char_store)
+# define AO_char_store(addr, val) AO_char_store_release(addr, val)
+# define AO_HAVE_char_store
+#endif
+
+#if defined(AO_HAVE_char_store_full) && !defined(AO_HAVE_char_store_write)
+# define AO_char_store_write(addr, val) AO_char_store_full(addr, val)
+# define AO_HAVE_char_store_write
+#endif
+
+#if defined(AO_HAVE_char_store_release) \
+ && !defined(AO_HAVE_char_store_release_write)
+# define AO_char_store_release_write(addr, val) \
+ AO_char_store_release(addr, val)
+# define AO_HAVE_char_store_release_write
+#endif
+
+#if defined(AO_HAVE_char_store_write) && !defined(AO_HAVE_char_store)
+# define AO_char_store(addr, val) AO_char_store_write(addr, val)
+# define AO_HAVE_char_store
+#endif
+
+#if defined(AO_HAVE_char_store) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_store_release)
+# define AO_char_store_release(addr, val) \
+ (AO_nop_full(), AO_char_store(addr, val))
+# define AO_HAVE_char_store_release
+#endif
+
+#if defined(AO_HAVE_char_store) && defined(AO_HAVE_nop_write) \
+ && !defined(AO_HAVE_char_store_write)
+# define AO_char_store_write(addr, val) \
+ (AO_nop_write(), AO_char_store(addr, val))
+# define AO_HAVE_char_store_write
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap_write) \
+ && !defined(AO_HAVE_char_store_write)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_char_store_write(volatile unsigned/**/char *addr, unsigned/**/char new_val)
+ {
+ unsigned/**/char old_val;
+
+ do {
+ old_val = *(unsigned/**/char *)addr;
+ } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_write(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_char_store_write
+#endif
+
+#if defined(AO_HAVE_char_store_write) \
+ && !defined(AO_HAVE_char_store_release_write)
+# define AO_char_store_release_write(addr, val) \
+ AO_char_store_write(addr, val)
+# define AO_HAVE_char_store_release_write
+#endif
+
+#if defined(AO_HAVE_char_store_release) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_char_store_full)
+# define AO_char_store_full(addr, val) \
+ (AO_char_store_release(addr, val), \
+ AO_nop_full())
+# define AO_HAVE_char_store_full
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap) && !defined(AO_HAVE_char_store)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_char_store(volatile unsigned/**/char *addr, unsigned/**/char new_val)
+ {
+ unsigned/**/char old_val;
+
+ do {
+ old_val = *(unsigned/**/char *)addr;
+ } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap(addr,
+ old_val, new_val)));
+ }
+# define AO_HAVE_char_store
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap_release) \
+ && !defined(AO_HAVE_char_store_release)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_char_store_release(volatile unsigned/**/char *addr, unsigned/**/char new_val)
+ {
+ unsigned/**/char old_val;
+
+ do {
+ old_val = *(unsigned/**/char *)addr;
+ } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_release(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_char_store_release
+#endif
+
+#if defined(AO_HAVE_char_compare_and_swap_full) \
+ && !defined(AO_HAVE_char_store_full)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_char_store_full(volatile unsigned/**/char *addr, unsigned/**/char new_val)
+ {
+ unsigned/**/char old_val;
+
+ do {
+ old_val = *(unsigned/**/char *)addr;
+ } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_char_store_full
+#endif
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* short_fetch_compare_and_swap */
+#if defined(AO_HAVE_short_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_fetch_compare_and_swap_acquire)
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_compare_and_swap_acquire(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ unsigned/**/short result = AO_short_fetch_compare_and_swap(addr, old_val, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_short_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_fetch_compare_and_swap_release)
+# define AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_short_fetch_compare_and_swap(addr, old_val, new_val))
+# define AO_HAVE_short_fetch_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_short_fetch_compare_and_swap_full)
+# if !defined(AO_HAVE_short_fetch_compare_and_swap_release)
+# define AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire)
+# define AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) \
+ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_short_fetch_compare_and_swap_write)
+# define AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) \
+ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_short_fetch_compare_and_swap_read)
+# define AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) \
+ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_short_fetch_compare_and_swap_full */
+
+#if !defined(AO_HAVE_short_fetch_compare_and_swap) \
+ && defined(AO_HAVE_short_fetch_compare_and_swap_release)
+# define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_short_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_short_fetch_compare_and_swap) \
+ && defined(AO_HAVE_short_fetch_compare_and_swap_acquire)
+# define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_short_fetch_compare_and_swap) \
+ && defined(AO_HAVE_short_fetch_compare_and_swap_write)
+# define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_short_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_short_fetch_compare_and_swap) \
+ && defined(AO_HAVE_short_fetch_compare_and_swap_read)
+# define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_short_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_short_fetch_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_fetch_compare_and_swap_full)
+# define AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val))
+# define AO_HAVE_short_fetch_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_short_fetch_compare_and_swap_write)
+# define AO_short_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_short_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_short_fetch_compare_and_swap_release)
+# define AO_short_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_short_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_short_fetch_compare_and_swap_read)
+# define AO_short_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_short_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_short_fetch_compare_and_swap_acquire)
+# define AO_short_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read)
+# define AO_short_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_short_fetch_compare_and_swap_acquire_read(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_short_fetch_compare_and_swap)
+# define AO_short_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_short_fetch_compare_and_swap(addr, old_val, new_val)
+# define AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* short_compare_and_swap */
+#if defined(AO_HAVE_short_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_short_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old,
+ unsigned/**/short new_val)
+ {
+ int result = AO_short_compare_and_swap(addr, old, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_short_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_short_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_compare_and_swap_release)
+# define AO_short_compare_and_swap_release(addr, old, new_val) \
+ (AO_nop_full(), AO_short_compare_and_swap(addr, old, new_val))
+# define AO_HAVE_short_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_short_compare_and_swap_full)
+# if !defined(AO_HAVE_short_compare_and_swap_release)
+# define AO_short_compare_and_swap_release(addr, old, new_val) \
+ AO_short_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_short_compare_and_swap_acquire)
+# define AO_short_compare_and_swap_acquire(addr, old, new_val) \
+ AO_short_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_short_compare_and_swap_write)
+# define AO_short_compare_and_swap_write(addr, old, new_val) \
+ AO_short_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_short_compare_and_swap_read)
+# define AO_short_compare_and_swap_read(addr, old, new_val) \
+ AO_short_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_short_compare_and_swap_full */
+
+#if !defined(AO_HAVE_short_compare_and_swap) \
+ && defined(AO_HAVE_short_compare_and_swap_release)
+# define AO_short_compare_and_swap(addr, old, new_val) \
+ AO_short_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap
+#endif
+#if !defined(AO_HAVE_short_compare_and_swap) \
+ && defined(AO_HAVE_short_compare_and_swap_acquire)
+# define AO_short_compare_and_swap(addr, old, new_val) \
+ AO_short_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap
+#endif
+#if !defined(AO_HAVE_short_compare_and_swap) \
+ && defined(AO_HAVE_short_compare_and_swap_write)
+# define AO_short_compare_and_swap(addr, old, new_val) \
+ AO_short_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap
+#endif
+#if !defined(AO_HAVE_short_compare_and_swap) \
+ && defined(AO_HAVE_short_compare_and_swap_read)
+# define AO_short_compare_and_swap(addr, old, new_val) \
+ AO_short_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_compare_and_swap_full)
+# define AO_short_compare_and_swap_full(addr, old, new_val) \
+ (AO_nop_full(), \
+ AO_short_compare_and_swap_acquire(addr, old, new_val))
+# define AO_HAVE_short_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_short_compare_and_swap_release_write) \
+ && defined(AO_HAVE_short_compare_and_swap_write)
+# define AO_short_compare_and_swap_release_write(addr, old, new_val) \
+ AO_short_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_short_compare_and_swap_release_write) \
+ && defined(AO_HAVE_short_compare_and_swap_release)
+# define AO_short_compare_and_swap_release_write(addr, old, new_val) \
+ AO_short_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_short_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_short_compare_and_swap_read)
+# define AO_short_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_short_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_short_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_short_compare_and_swap_acquire)
+# define AO_short_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_short_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_short_compare_and_swap_acquire_read)
+# define AO_short_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_short_compare_and_swap_acquire_read(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_short_compare_and_swap)
+# define AO_short_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_short_compare_and_swap(addr, old, new_val)
+# define AO_HAVE_short_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* short_load */
+#if defined(AO_HAVE_short_load_full) && !defined(AO_HAVE_short_load_acquire)
+# define AO_short_load_acquire(addr) AO_short_load_full(addr)
+# define AO_HAVE_short_load_acquire
+#endif
+
+#if defined(AO_HAVE_short_load_acquire) && !defined(AO_HAVE_short_load)
+# define AO_short_load(addr) AO_short_load_acquire(addr)
+# define AO_HAVE_short_load
+#endif
+
+#if defined(AO_HAVE_short_load_full) && !defined(AO_HAVE_short_load_read)
+# define AO_short_load_read(addr) AO_short_load_full(addr)
+# define AO_HAVE_short_load_read
+#endif
+
+#if !defined(AO_HAVE_short_load_acquire_read) \
+ && defined(AO_HAVE_short_load_acquire)
+# define AO_short_load_acquire_read(addr) AO_short_load_acquire(addr)
+# define AO_HAVE_short_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_short_load) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_load_acquire)
+ AO_INLINE unsigned/**/short
+ AO_short_load_acquire(const volatile unsigned/**/short *addr)
+ {
+ unsigned/**/short result = AO_short_load(addr);
+
+ /* Acquire barrier would be useless, since the load could be delayed */
+ /* beyond it. */
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_short_load_acquire
+#endif
+
+#if defined(AO_HAVE_short_load) && defined(AO_HAVE_nop_read) \
+ && !defined(AO_HAVE_short_load_read)
+ AO_INLINE unsigned/**/short
+ AO_short_load_read(const volatile unsigned/**/short *addr)
+ {
+ unsigned/**/short result = AO_short_load(addr);
+
+ AO_nop_read();
+ return result;
+ }
+# define AO_HAVE_short_load_read
+#endif
+
+#if defined(AO_HAVE_short_load_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_load_full)
+# define AO_short_load_full(addr) (AO_nop_full(), AO_short_load_acquire(addr))
+# define AO_HAVE_short_load_full
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap_read) \
+ && !defined(AO_HAVE_short_load_read)
+# define AO_short_CAS_BASED_LOAD_READ
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/short
+ AO_short_load_read(const volatile unsigned/**/short *addr)
+ {
+ unsigned/**/short result;
+
+ do {
+ result = *(const unsigned/**/short *)addr;
+ } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_read(
+ (volatile unsigned/**/short *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_short_load_read
+#endif
+
+#if !defined(AO_HAVE_short_load_acquire_read) \
+ && defined(AO_HAVE_short_load_read)
+# define AO_short_load_acquire_read(addr) AO_short_load_read(addr)
+# define AO_HAVE_short_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_short_load_acquire_read) && !defined(AO_HAVE_short_load) \
+ && (!defined(AO_short_CAS_BASED_LOAD_READ) \
+ || !defined(AO_HAVE_short_compare_and_swap))
+# define AO_short_load(addr) AO_short_load_acquire_read(addr)
+# define AO_HAVE_short_load
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap_full) \
+ && !defined(AO_HAVE_short_load_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/short
+ AO_short_load_full(const volatile unsigned/**/short *addr)
+ {
+ unsigned/**/short result;
+
+ do {
+ result = *(const unsigned/**/short *)addr;
+ } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(
+ (volatile unsigned/**/short *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_short_load_full
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_short_load_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/short
+ AO_short_load_acquire(const volatile unsigned/**/short *addr)
+ {
+ unsigned/**/short result;
+
+ do {
+ result = *(const unsigned/**/short *)addr;
+ } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_acquire(
+ (volatile unsigned/**/short *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_short_load_acquire
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap) && !defined(AO_HAVE_short_load)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned/**/short
+ AO_short_load(const volatile unsigned/**/short *addr)
+ {
+ unsigned/**/short result;
+
+ do {
+ result = *(const unsigned/**/short *)addr;
+ } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap(
+ (volatile unsigned/**/short *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_short_load
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_short_load_acquire_read)
+# define AO_short_load_dd_acquire_read(addr) \
+ AO_short_load_acquire_read(addr)
+# define AO_HAVE_short_load_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_short_load)
+# define AO_short_load_dd_acquire_read(addr) AO_short_load(addr)
+# define AO_HAVE_short_load_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* short_store */
+#if defined(AO_HAVE_short_store_full) && !defined(AO_HAVE_short_store_release)
+# define AO_short_store_release(addr, val) AO_short_store_full(addr, val)
+# define AO_HAVE_short_store_release
+#endif
+
+#if defined(AO_HAVE_short_store_release) && !defined(AO_HAVE_short_store)
+# define AO_short_store(addr, val) AO_short_store_release(addr, val)
+# define AO_HAVE_short_store
+#endif
+
+#if defined(AO_HAVE_short_store_full) && !defined(AO_HAVE_short_store_write)
+# define AO_short_store_write(addr, val) AO_short_store_full(addr, val)
+# define AO_HAVE_short_store_write
+#endif
+
+#if defined(AO_HAVE_short_store_release) \
+ && !defined(AO_HAVE_short_store_release_write)
+# define AO_short_store_release_write(addr, val) \
+ AO_short_store_release(addr, val)
+# define AO_HAVE_short_store_release_write
+#endif
+
+#if defined(AO_HAVE_short_store_write) && !defined(AO_HAVE_short_store)
+# define AO_short_store(addr, val) AO_short_store_write(addr, val)
+# define AO_HAVE_short_store
+#endif
+
+#if defined(AO_HAVE_short_store) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_store_release)
+# define AO_short_store_release(addr, val) \
+ (AO_nop_full(), AO_short_store(addr, val))
+# define AO_HAVE_short_store_release
+#endif
+
+#if defined(AO_HAVE_short_store) && defined(AO_HAVE_nop_write) \
+ && !defined(AO_HAVE_short_store_write)
+# define AO_short_store_write(addr, val) \
+ (AO_nop_write(), AO_short_store(addr, val))
+# define AO_HAVE_short_store_write
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap_write) \
+ && !defined(AO_HAVE_short_store_write)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_short_store_write(volatile unsigned/**/short *addr, unsigned/**/short new_val)
+ {
+ unsigned/**/short old_val;
+
+ do {
+ old_val = *(unsigned/**/short *)addr;
+ } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_write(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_short_store_write
+#endif
+
+#if defined(AO_HAVE_short_store_write) \
+ && !defined(AO_HAVE_short_store_release_write)
+# define AO_short_store_release_write(addr, val) \
+ AO_short_store_write(addr, val)
+# define AO_HAVE_short_store_release_write
+#endif
+
+#if defined(AO_HAVE_short_store_release) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_short_store_full)
+# define AO_short_store_full(addr, val) \
+ (AO_short_store_release(addr, val), \
+ AO_nop_full())
+# define AO_HAVE_short_store_full
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap) && !defined(AO_HAVE_short_store)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_short_store(volatile unsigned/**/short *addr, unsigned/**/short new_val)
+ {
+ unsigned/**/short old_val;
+
+ do {
+ old_val = *(unsigned/**/short *)addr;
+ } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap(addr,
+ old_val, new_val)));
+ }
+# define AO_HAVE_short_store
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap_release) \
+ && !defined(AO_HAVE_short_store_release)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_short_store_release(volatile unsigned/**/short *addr, unsigned/**/short new_val)
+ {
+ unsigned/**/short old_val;
+
+ do {
+ old_val = *(unsigned/**/short *)addr;
+ } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_release(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_short_store_release
+#endif
+
+#if defined(AO_HAVE_short_compare_and_swap_full) \
+ && !defined(AO_HAVE_short_store_full)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_short_store_full(volatile unsigned/**/short *addr, unsigned/**/short new_val)
+ {
+ unsigned/**/short old_val;
+
+ do {
+ old_val = *(unsigned/**/short *)addr;
+ } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_short_store_full
+#endif
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* int_fetch_compare_and_swap */
+#if defined(AO_HAVE_int_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_fetch_compare_and_swap_acquire)
+ AO_INLINE unsigned
+ AO_int_fetch_compare_and_swap_acquire(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ unsigned result = AO_int_fetch_compare_and_swap(addr, old_val, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_int_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_fetch_compare_and_swap_release)
+# define AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_int_fetch_compare_and_swap(addr, old_val, new_val))
+# define AO_HAVE_int_fetch_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_int_fetch_compare_and_swap_full)
+# if !defined(AO_HAVE_int_fetch_compare_and_swap_release)
+# define AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire)
+# define AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) \
+ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_int_fetch_compare_and_swap_write)
+# define AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) \
+ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_int_fetch_compare_and_swap_read)
+# define AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) \
+ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_int_fetch_compare_and_swap_full */
+
+#if !defined(AO_HAVE_int_fetch_compare_and_swap) \
+ && defined(AO_HAVE_int_fetch_compare_and_swap_release)
+# define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_int_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_int_fetch_compare_and_swap) \
+ && defined(AO_HAVE_int_fetch_compare_and_swap_acquire)
+# define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_int_fetch_compare_and_swap) \
+ && defined(AO_HAVE_int_fetch_compare_and_swap_write)
+# define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_int_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_int_fetch_compare_and_swap) \
+ && defined(AO_HAVE_int_fetch_compare_and_swap_read)
+# define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_int_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_int_fetch_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_fetch_compare_and_swap_full)
+# define AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val))
+# define AO_HAVE_int_fetch_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_int_fetch_compare_and_swap_write)
+# define AO_int_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_int_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_int_fetch_compare_and_swap_release)
+# define AO_int_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_int_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_int_fetch_compare_and_swap_read)
+# define AO_int_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_int_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_int_fetch_compare_and_swap_acquire)
+# define AO_int_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read)
+# define AO_int_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_int_fetch_compare_and_swap_acquire_read(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_int_fetch_compare_and_swap)
+# define AO_int_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_int_fetch_compare_and_swap(addr, old_val, new_val)
+# define AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* int_compare_and_swap */
+#if defined(AO_HAVE_int_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_int_compare_and_swap_acquire(volatile unsigned *addr, unsigned old,
+ unsigned new_val)
+ {
+ int result = AO_int_compare_and_swap(addr, old, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_int_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_int_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_compare_and_swap_release)
+# define AO_int_compare_and_swap_release(addr, old, new_val) \
+ (AO_nop_full(), AO_int_compare_and_swap(addr, old, new_val))
+# define AO_HAVE_int_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_int_compare_and_swap_full)
+# if !defined(AO_HAVE_int_compare_and_swap_release)
+# define AO_int_compare_and_swap_release(addr, old, new_val) \
+ AO_int_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_int_compare_and_swap_acquire)
+# define AO_int_compare_and_swap_acquire(addr, old, new_val) \
+ AO_int_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_int_compare_and_swap_write)
+# define AO_int_compare_and_swap_write(addr, old, new_val) \
+ AO_int_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_int_compare_and_swap_read)
+# define AO_int_compare_and_swap_read(addr, old, new_val) \
+ AO_int_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_int_compare_and_swap_full */
+
+#if !defined(AO_HAVE_int_compare_and_swap) \
+ && defined(AO_HAVE_int_compare_and_swap_release)
+# define AO_int_compare_and_swap(addr, old, new_val) \
+ AO_int_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap
+#endif
+#if !defined(AO_HAVE_int_compare_and_swap) \
+ && defined(AO_HAVE_int_compare_and_swap_acquire)
+# define AO_int_compare_and_swap(addr, old, new_val) \
+ AO_int_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap
+#endif
+#if !defined(AO_HAVE_int_compare_and_swap) \
+ && defined(AO_HAVE_int_compare_and_swap_write)
+# define AO_int_compare_and_swap(addr, old, new_val) \
+ AO_int_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap
+#endif
+#if !defined(AO_HAVE_int_compare_and_swap) \
+ && defined(AO_HAVE_int_compare_and_swap_read)
+# define AO_int_compare_and_swap(addr, old, new_val) \
+ AO_int_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_compare_and_swap_full)
+# define AO_int_compare_and_swap_full(addr, old, new_val) \
+ (AO_nop_full(), \
+ AO_int_compare_and_swap_acquire(addr, old, new_val))
+# define AO_HAVE_int_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_int_compare_and_swap_release_write) \
+ && defined(AO_HAVE_int_compare_and_swap_write)
+# define AO_int_compare_and_swap_release_write(addr, old, new_val) \
+ AO_int_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_int_compare_and_swap_release_write) \
+ && defined(AO_HAVE_int_compare_and_swap_release)
+# define AO_int_compare_and_swap_release_write(addr, old, new_val) \
+ AO_int_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_int_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_int_compare_and_swap_read)
+# define AO_int_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_int_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_int_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_int_compare_and_swap_acquire)
+# define AO_int_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_int_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_int_compare_and_swap_acquire_read)
+# define AO_int_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_int_compare_and_swap_acquire_read(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_int_compare_and_swap)
+# define AO_int_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_int_compare_and_swap(addr, old, new_val)
+# define AO_HAVE_int_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* int_load */
+#if defined(AO_HAVE_int_load_full) && !defined(AO_HAVE_int_load_acquire)
+# define AO_int_load_acquire(addr) AO_int_load_full(addr)
+# define AO_HAVE_int_load_acquire
+#endif
+
+#if defined(AO_HAVE_int_load_acquire) && !defined(AO_HAVE_int_load)
+# define AO_int_load(addr) AO_int_load_acquire(addr)
+# define AO_HAVE_int_load
+#endif
+
+#if defined(AO_HAVE_int_load_full) && !defined(AO_HAVE_int_load_read)
+# define AO_int_load_read(addr) AO_int_load_full(addr)
+# define AO_HAVE_int_load_read
+#endif
+
+#if !defined(AO_HAVE_int_load_acquire_read) \
+ && defined(AO_HAVE_int_load_acquire)
+# define AO_int_load_acquire_read(addr) AO_int_load_acquire(addr)
+# define AO_HAVE_int_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_int_load) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_load_acquire)
+ AO_INLINE unsigned
+ AO_int_load_acquire(const volatile unsigned *addr)
+ {
+ unsigned result = AO_int_load(addr);
+
+ /* Acquire barrier would be useless, since the load could be delayed */
+ /* beyond it. */
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_int_load_acquire
+#endif
+
+#if defined(AO_HAVE_int_load) && defined(AO_HAVE_nop_read) \
+ && !defined(AO_HAVE_int_load_read)
+ AO_INLINE unsigned
+ AO_int_load_read(const volatile unsigned *addr)
+ {
+ unsigned result = AO_int_load(addr);
+
+ AO_nop_read();
+ return result;
+ }
+# define AO_HAVE_int_load_read
+#endif
+
+#if defined(AO_HAVE_int_load_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_load_full)
+# define AO_int_load_full(addr) (AO_nop_full(), AO_int_load_acquire(addr))
+# define AO_HAVE_int_load_full
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap_read) \
+ && !defined(AO_HAVE_int_load_read)
+# define AO_int_CAS_BASED_LOAD_READ
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned
+ AO_int_load_read(const volatile unsigned *addr)
+ {
+ unsigned result;
+
+ do {
+ result = *(const unsigned *)addr;
+ } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_read(
+ (volatile unsigned *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_int_load_read
+#endif
+
+#if !defined(AO_HAVE_int_load_acquire_read) \
+ && defined(AO_HAVE_int_load_read)
+# define AO_int_load_acquire_read(addr) AO_int_load_read(addr)
+# define AO_HAVE_int_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_int_load_acquire_read) && !defined(AO_HAVE_int_load) \
+ && (!defined(AO_int_CAS_BASED_LOAD_READ) \
+ || !defined(AO_HAVE_int_compare_and_swap))
+# define AO_int_load(addr) AO_int_load_acquire_read(addr)
+# define AO_HAVE_int_load
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap_full) \
+ && !defined(AO_HAVE_int_load_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned
+ AO_int_load_full(const volatile unsigned *addr)
+ {
+ unsigned result;
+
+ do {
+ result = *(const unsigned *)addr;
+ } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(
+ (volatile unsigned *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_int_load_full
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_int_load_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned
+ AO_int_load_acquire(const volatile unsigned *addr)
+ {
+ unsigned result;
+
+ do {
+ result = *(const unsigned *)addr;
+ } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_acquire(
+ (volatile unsigned *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_int_load_acquire
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap) && !defined(AO_HAVE_int_load)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE unsigned
+ AO_int_load(const volatile unsigned *addr)
+ {
+ unsigned result;
+
+ do {
+ result = *(const unsigned *)addr;
+ } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap(
+ (volatile unsigned *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_int_load
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_int_load_acquire_read)
+# define AO_int_load_dd_acquire_read(addr) \
+ AO_int_load_acquire_read(addr)
+# define AO_HAVE_int_load_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_int_load)
+# define AO_int_load_dd_acquire_read(addr) AO_int_load(addr)
+# define AO_HAVE_int_load_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* int_store */
+#if defined(AO_HAVE_int_store_full) && !defined(AO_HAVE_int_store_release)
+# define AO_int_store_release(addr, val) AO_int_store_full(addr, val)
+# define AO_HAVE_int_store_release
+#endif
+
+#if defined(AO_HAVE_int_store_release) && !defined(AO_HAVE_int_store)
+# define AO_int_store(addr, val) AO_int_store_release(addr, val)
+# define AO_HAVE_int_store
+#endif
+
+#if defined(AO_HAVE_int_store_full) && !defined(AO_HAVE_int_store_write)
+# define AO_int_store_write(addr, val) AO_int_store_full(addr, val)
+# define AO_HAVE_int_store_write
+#endif
+
+#if defined(AO_HAVE_int_store_release) \
+ && !defined(AO_HAVE_int_store_release_write)
+# define AO_int_store_release_write(addr, val) \
+ AO_int_store_release(addr, val)
+# define AO_HAVE_int_store_release_write
+#endif
+
+#if defined(AO_HAVE_int_store_write) && !defined(AO_HAVE_int_store)
+# define AO_int_store(addr, val) AO_int_store_write(addr, val)
+# define AO_HAVE_int_store
+#endif
+
+#if defined(AO_HAVE_int_store) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_store_release)
+# define AO_int_store_release(addr, val) \
+ (AO_nop_full(), AO_int_store(addr, val))
+# define AO_HAVE_int_store_release
+#endif
+
+#if defined(AO_HAVE_int_store) && defined(AO_HAVE_nop_write) \
+ && !defined(AO_HAVE_int_store_write)
+# define AO_int_store_write(addr, val) \
+ (AO_nop_write(), AO_int_store(addr, val))
+# define AO_HAVE_int_store_write
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap_write) \
+ && !defined(AO_HAVE_int_store_write)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_int_store_write(volatile unsigned *addr, unsigned new_val)
+ {
+ unsigned old_val;
+
+ do {
+ old_val = *(unsigned *)addr;
+ } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_write(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_int_store_write
+#endif
+
+#if defined(AO_HAVE_int_store_write) \
+ && !defined(AO_HAVE_int_store_release_write)
+# define AO_int_store_release_write(addr, val) \
+ AO_int_store_write(addr, val)
+# define AO_HAVE_int_store_release_write
+#endif
+
+#if defined(AO_HAVE_int_store_release) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_int_store_full)
+# define AO_int_store_full(addr, val) \
+ (AO_int_store_release(addr, val), \
+ AO_nop_full())
+# define AO_HAVE_int_store_full
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap) && !defined(AO_HAVE_int_store)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_int_store(volatile unsigned *addr, unsigned new_val)
+ {
+ unsigned old_val;
+
+ do {
+ old_val = *(unsigned *)addr;
+ } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap(addr,
+ old_val, new_val)));
+ }
+# define AO_HAVE_int_store
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap_release) \
+ && !defined(AO_HAVE_int_store_release)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_int_store_release(volatile unsigned *addr, unsigned new_val)
+ {
+ unsigned old_val;
+
+ do {
+ old_val = *(unsigned *)addr;
+ } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_release(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_int_store_release
+#endif
+
+#if defined(AO_HAVE_int_compare_and_swap_full) \
+ && !defined(AO_HAVE_int_store_full)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_int_store_full(volatile unsigned *addr, unsigned new_val)
+ {
+ unsigned old_val;
+
+ do {
+ old_val = *(unsigned *)addr;
+ } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_int_store_full
+#endif
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* fetch_compare_and_swap */
+#if defined(AO_HAVE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_fetch_compare_and_swap_acquire)
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_acquire(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_fetch_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_fetch_compare_and_swap_release)
+# define AO_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_fetch_compare_and_swap(addr, old_val, new_val))
+# define AO_HAVE_fetch_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_fetch_compare_and_swap_full)
+# if !defined(AO_HAVE_fetch_compare_and_swap_release)
+# define AO_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ AO_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_fetch_compare_and_swap_acquire)
+# define AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) \
+ AO_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_fetch_compare_and_swap_write)
+# define AO_fetch_compare_and_swap_write(addr, old_val, new_val) \
+ AO_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_fetch_compare_and_swap_read)
+# define AO_fetch_compare_and_swap_read(addr, old_val, new_val) \
+ AO_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_fetch_compare_and_swap_full */
+
+#if !defined(AO_HAVE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_fetch_compare_and_swap_release)
+# define AO_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_fetch_compare_and_swap_acquire)
+# define AO_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_fetch_compare_and_swap_write)
+# define AO_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_fetch_compare_and_swap_read)
+# define AO_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_fetch_compare_and_swap_full)
+# define AO_fetch_compare_and_swap_full(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_fetch_compare_and_swap_acquire(addr, old_val, new_val))
+# define AO_HAVE_fetch_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_fetch_compare_and_swap_write)
+# define AO_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_fetch_compare_and_swap_release)
+# define AO_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_fetch_compare_and_swap_read)
+# define AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_fetch_compare_and_swap_acquire)
+# define AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_fetch_compare_and_swap_acquire_read)
+# define AO_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_fetch_compare_and_swap_acquire_read(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_fetch_compare_and_swap)
+# define AO_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_fetch_compare_and_swap(addr, old_val, new_val)
+# define AO_HAVE_fetch_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* compare_and_swap */
+#if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old,
+ AO_t new_val)
+ {
+ int result = AO_compare_and_swap(addr, old, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_compare_and_swap_release)
+# define AO_compare_and_swap_release(addr, old, new_val) \
+ (AO_nop_full(), AO_compare_and_swap(addr, old, new_val))
+# define AO_HAVE_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_compare_and_swap_full)
+# if !defined(AO_HAVE_compare_and_swap_release)
+# define AO_compare_and_swap_release(addr, old, new_val) \
+ AO_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_compare_and_swap_acquire)
+# define AO_compare_and_swap_acquire(addr, old, new_val) \
+ AO_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_compare_and_swap_write)
+# define AO_compare_and_swap_write(addr, old, new_val) \
+ AO_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_compare_and_swap_read)
+# define AO_compare_and_swap_read(addr, old, new_val) \
+ AO_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_compare_and_swap_full */
+
+#if !defined(AO_HAVE_compare_and_swap) \
+ && defined(AO_HAVE_compare_and_swap_release)
+# define AO_compare_and_swap(addr, old, new_val) \
+ AO_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_compare_and_swap
+#endif
+#if !defined(AO_HAVE_compare_and_swap) \
+ && defined(AO_HAVE_compare_and_swap_acquire)
+# define AO_compare_and_swap(addr, old, new_val) \
+ AO_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_compare_and_swap
+#endif
+#if !defined(AO_HAVE_compare_and_swap) \
+ && defined(AO_HAVE_compare_and_swap_write)
+# define AO_compare_and_swap(addr, old, new_val) \
+ AO_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_compare_and_swap
+#endif
+#if !defined(AO_HAVE_compare_and_swap) \
+ && defined(AO_HAVE_compare_and_swap_read)
+# define AO_compare_and_swap(addr, old, new_val) \
+ AO_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_compare_and_swap_full)
+# define AO_compare_and_swap_full(addr, old, new_val) \
+ (AO_nop_full(), \
+ AO_compare_and_swap_acquire(addr, old, new_val))
+# define AO_HAVE_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_compare_and_swap_release_write) \
+ && defined(AO_HAVE_compare_and_swap_write)
+# define AO_compare_and_swap_release_write(addr, old, new_val) \
+ AO_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_compare_and_swap_release_write) \
+ && defined(AO_HAVE_compare_and_swap_release)
+# define AO_compare_and_swap_release_write(addr, old, new_val) \
+ AO_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_compare_and_swap_read)
+# define AO_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_compare_and_swap_acquire)
+# define AO_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_compare_and_swap_acquire_read)
+# define AO_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_compare_and_swap_acquire_read(addr, old, new_val)
+# define AO_HAVE_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_compare_and_swap)
+# define AO_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_compare_and_swap(addr, old, new_val)
+# define AO_HAVE_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* load */
+#if defined(AO_HAVE_load_full) && !defined(AO_HAVE_load_acquire)
+# define AO_load_acquire(addr) AO_load_full(addr)
+# define AO_HAVE_load_acquire
+#endif
+
+#if defined(AO_HAVE_load_acquire) && !defined(AO_HAVE_load)
+# define AO_load(addr) AO_load_acquire(addr)
+# define AO_HAVE_load
+#endif
+
+#if defined(AO_HAVE_load_full) && !defined(AO_HAVE_load_read)
+# define AO_load_read(addr) AO_load_full(addr)
+# define AO_HAVE_load_read
+#endif
+
+#if !defined(AO_HAVE_load_acquire_read) \
+ && defined(AO_HAVE_load_acquire)
+# define AO_load_acquire_read(addr) AO_load_acquire(addr)
+# define AO_HAVE_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_load) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_load_acquire)
+ AO_INLINE AO_t
+ AO_load_acquire(const volatile AO_t *addr)
+ {
+ AO_t result = AO_load(addr);
+
+ /* Acquire barrier would be useless, since the load could be delayed */
+ /* beyond it. */
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_load_acquire
+#endif
+
+#if defined(AO_HAVE_load) && defined(AO_HAVE_nop_read) \
+ && !defined(AO_HAVE_load_read)
+ AO_INLINE AO_t
+ AO_load_read(const volatile AO_t *addr)
+ {
+ AO_t result = AO_load(addr);
+
+ AO_nop_read();
+ return result;
+ }
+# define AO_HAVE_load_read
+#endif
+
+#if defined(AO_HAVE_load_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_load_full)
+# define AO_load_full(addr) (AO_nop_full(), AO_load_acquire(addr))
+# define AO_HAVE_load_full
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_read) \
+ && !defined(AO_HAVE_load_read)
+# define AO_CAS_BASED_LOAD_READ
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_t
+ AO_load_read(const volatile AO_t *addr)
+ {
+ AO_t result;
+
+ do {
+ result = *(const AO_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_compare_and_swap_read(
+ (volatile AO_t *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_load_read
+#endif
+
+#if !defined(AO_HAVE_load_acquire_read) \
+ && defined(AO_HAVE_load_read)
+# define AO_load_acquire_read(addr) AO_load_read(addr)
+# define AO_HAVE_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_load_acquire_read) && !defined(AO_HAVE_load) \
+ && (!defined(AO_CAS_BASED_LOAD_READ) \
+ || !defined(AO_HAVE_compare_and_swap))
+# define AO_load(addr) AO_load_acquire_read(addr)
+# define AO_HAVE_load
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_full) \
+ && !defined(AO_HAVE_load_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_t
+ AO_load_full(const volatile AO_t *addr)
+ {
+ AO_t result;
+
+ do {
+ result = *(const AO_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(
+ (volatile AO_t *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_load_full
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_load_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_t
+ AO_load_acquire(const volatile AO_t *addr)
+ {
+ AO_t result;
+
+ do {
+ result = *(const AO_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_compare_and_swap_acquire(
+ (volatile AO_t *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_load_acquire
+#endif
+
+#if defined(AO_HAVE_compare_and_swap) && !defined(AO_HAVE_load)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_t
+ AO_load(const volatile AO_t *addr)
+ {
+ AO_t result;
+
+ do {
+ result = *(const AO_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_compare_and_swap(
+ (volatile AO_t *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_load
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_load_acquire_read)
+# define AO_load_dd_acquire_read(addr) \
+ AO_load_acquire_read(addr)
+# define AO_HAVE_load_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_load)
+# define AO_load_dd_acquire_read(addr) AO_load(addr)
+# define AO_HAVE_load_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* store */
+#if defined(AO_HAVE_store_full) && !defined(AO_HAVE_store_release)
+# define AO_store_release(addr, val) AO_store_full(addr, val)
+# define AO_HAVE_store_release
+#endif
+
+#if defined(AO_HAVE_store_release) && !defined(AO_HAVE_store)
+# define AO_store(addr, val) AO_store_release(addr, val)
+# define AO_HAVE_store
+#endif
+
+#if defined(AO_HAVE_store_full) && !defined(AO_HAVE_store_write)
+# define AO_store_write(addr, val) AO_store_full(addr, val)
+# define AO_HAVE_store_write
+#endif
+
+#if defined(AO_HAVE_store_release) \
+ && !defined(AO_HAVE_store_release_write)
+# define AO_store_release_write(addr, val) \
+ AO_store_release(addr, val)
+# define AO_HAVE_store_release_write
+#endif
+
+#if defined(AO_HAVE_store_write) && !defined(AO_HAVE_store)
+# define AO_store(addr, val) AO_store_write(addr, val)
+# define AO_HAVE_store
+#endif
+
+#if defined(AO_HAVE_store) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_store_release)
+# define AO_store_release(addr, val) \
+ (AO_nop_full(), AO_store(addr, val))
+# define AO_HAVE_store_release
+#endif
+
+#if defined(AO_HAVE_store) && defined(AO_HAVE_nop_write) \
+ && !defined(AO_HAVE_store_write)
+# define AO_store_write(addr, val) \
+ (AO_nop_write(), AO_store(addr, val))
+# define AO_HAVE_store_write
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_write) \
+ && !defined(AO_HAVE_store_write)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_store_write(volatile AO_t *addr, AO_t new_val)
+ {
+ AO_t old_val;
+
+ do {
+ old_val = *(AO_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_compare_and_swap_write(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_store_write
+#endif
+
+#if defined(AO_HAVE_store_write) \
+ && !defined(AO_HAVE_store_release_write)
+# define AO_store_release_write(addr, val) \
+ AO_store_write(addr, val)
+# define AO_HAVE_store_release_write
+#endif
+
+#if defined(AO_HAVE_store_release) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_store_full)
+# define AO_store_full(addr, val) \
+ (AO_store_release(addr, val), \
+ AO_nop_full())
+# define AO_HAVE_store_full
+#endif
+
+#if defined(AO_HAVE_compare_and_swap) && !defined(AO_HAVE_store)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_store(volatile AO_t *addr, AO_t new_val)
+ {
+ AO_t old_val;
+
+ do {
+ old_val = *(AO_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_compare_and_swap(addr,
+ old_val, new_val)));
+ }
+# define AO_HAVE_store
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_release) \
+ && !defined(AO_HAVE_store_release)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_store_release(volatile AO_t *addr, AO_t new_val)
+ {
+ AO_t old_val;
+
+ do {
+ old_val = *(AO_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_compare_and_swap_release(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_store_release
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_full) \
+ && !defined(AO_HAVE_store_full)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_store_full(volatile AO_t *addr, AO_t new_val)
+ {
+ AO_t old_val;
+
+ do {
+ old_val = *(AO_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_store_full
+#endif
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* double_fetch_compare_and_swap */
+#if defined(AO_HAVE_double_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_double_fetch_compare_and_swap_acquire)
+ AO_INLINE AO_double_t
+ AO_double_fetch_compare_and_swap_acquire(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ AO_double_t result = AO_double_fetch_compare_and_swap(addr, old_val, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_double_fetch_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_double_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_double_fetch_compare_and_swap_release)
+# define AO_double_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_double_fetch_compare_and_swap(addr, old_val, new_val))
+# define AO_HAVE_double_fetch_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_double_fetch_compare_and_swap_full)
+# if !defined(AO_HAVE_double_fetch_compare_and_swap_release)
+# define AO_double_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_double_fetch_compare_and_swap_acquire)
+# define AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val) \
+ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_double_fetch_compare_and_swap_write)
+# define AO_double_fetch_compare_and_swap_write(addr, old_val, new_val) \
+ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_double_fetch_compare_and_swap_read)
+# define AO_double_fetch_compare_and_swap_read(addr, old_val, new_val) \
+ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_double_fetch_compare_and_swap_full */
+
+#if !defined(AO_HAVE_double_fetch_compare_and_swap) \
+ && defined(AO_HAVE_double_fetch_compare_and_swap_release)
+# define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_double_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_double_fetch_compare_and_swap) \
+ && defined(AO_HAVE_double_fetch_compare_and_swap_acquire)
+# define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_double_fetch_compare_and_swap) \
+ && defined(AO_HAVE_double_fetch_compare_and_swap_write)
+# define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_double_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_double_fetch_compare_and_swap) \
+ && defined(AO_HAVE_double_fetch_compare_and_swap_read)
+# define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_double_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_double_fetch_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_double_fetch_compare_and_swap_full)
+# define AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val))
+# define AO_HAVE_double_fetch_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_double_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_double_fetch_compare_and_swap_write)
+# define AO_double_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_double_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_double_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_double_fetch_compare_and_swap_release)
+# define AO_double_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_double_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_double_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_double_fetch_compare_and_swap_read)
+# define AO_double_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_double_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_double_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_double_fetch_compare_and_swap_acquire)
+# define AO_double_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_double_fetch_compare_and_swap_acquire_read)
+# define AO_double_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_double_fetch_compare_and_swap_acquire_read(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_double_fetch_compare_and_swap)
+# define AO_double_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_double_fetch_compare_and_swap(addr, old_val, new_val)
+# define AO_HAVE_double_fetch_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* double_compare_and_swap */
+#if defined(AO_HAVE_double_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_double_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old,
+ AO_double_t new_val)
+ {
+ int result = AO_double_compare_and_swap(addr, old, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_double_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_double_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_double_compare_and_swap_release)
+# define AO_double_compare_and_swap_release(addr, old, new_val) \
+ (AO_nop_full(), AO_double_compare_and_swap(addr, old, new_val))
+# define AO_HAVE_double_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_double_compare_and_swap_full)
+# if !defined(AO_HAVE_double_compare_and_swap_release)
+# define AO_double_compare_and_swap_release(addr, old, new_val) \
+ AO_double_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_double_compare_and_swap_acquire)
+# define AO_double_compare_and_swap_acquire(addr, old, new_val) \
+ AO_double_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_double_compare_and_swap_write)
+# define AO_double_compare_and_swap_write(addr, old, new_val) \
+ AO_double_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_double_compare_and_swap_read)
+# define AO_double_compare_and_swap_read(addr, old, new_val) \
+ AO_double_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_double_compare_and_swap_full */
+
+#if !defined(AO_HAVE_double_compare_and_swap) \
+ && defined(AO_HAVE_double_compare_and_swap_release)
+# define AO_double_compare_and_swap(addr, old, new_val) \
+ AO_double_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap
+#endif
+#if !defined(AO_HAVE_double_compare_and_swap) \
+ && defined(AO_HAVE_double_compare_and_swap_acquire)
+# define AO_double_compare_and_swap(addr, old, new_val) \
+ AO_double_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap
+#endif
+#if !defined(AO_HAVE_double_compare_and_swap) \
+ && defined(AO_HAVE_double_compare_and_swap_write)
+# define AO_double_compare_and_swap(addr, old, new_val) \
+ AO_double_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap
+#endif
+#if !defined(AO_HAVE_double_compare_and_swap) \
+ && defined(AO_HAVE_double_compare_and_swap_read)
+# define AO_double_compare_and_swap(addr, old, new_val) \
+ AO_double_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_double_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_double_compare_and_swap_full)
+# define AO_double_compare_and_swap_full(addr, old, new_val) \
+ (AO_nop_full(), \
+ AO_double_compare_and_swap_acquire(addr, old, new_val))
+# define AO_HAVE_double_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_double_compare_and_swap_release_write) \
+ && defined(AO_HAVE_double_compare_and_swap_write)
+# define AO_double_compare_and_swap_release_write(addr, old, new_val) \
+ AO_double_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_double_compare_and_swap_release_write) \
+ && defined(AO_HAVE_double_compare_and_swap_release)
+# define AO_double_compare_and_swap_release_write(addr, old, new_val) \
+ AO_double_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_double_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_double_compare_and_swap_read)
+# define AO_double_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_double_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_double_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_double_compare_and_swap_acquire)
+# define AO_double_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_double_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_double_compare_and_swap_acquire_read)
+# define AO_double_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_double_compare_and_swap_acquire_read(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_double_compare_and_swap)
+# define AO_double_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_double_compare_and_swap(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* double_load */
+#if defined(AO_HAVE_double_load_full) && !defined(AO_HAVE_double_load_acquire)
+# define AO_double_load_acquire(addr) AO_double_load_full(addr)
+# define AO_HAVE_double_load_acquire
+#endif
+
+#if defined(AO_HAVE_double_load_acquire) && !defined(AO_HAVE_double_load)
+# define AO_double_load(addr) AO_double_load_acquire(addr)
+# define AO_HAVE_double_load
+#endif
+
+#if defined(AO_HAVE_double_load_full) && !defined(AO_HAVE_double_load_read)
+# define AO_double_load_read(addr) AO_double_load_full(addr)
+# define AO_HAVE_double_load_read
+#endif
+
+#if !defined(AO_HAVE_double_load_acquire_read) \
+ && defined(AO_HAVE_double_load_acquire)
+# define AO_double_load_acquire_read(addr) AO_double_load_acquire(addr)
+# define AO_HAVE_double_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_double_load) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_double_load_acquire)
+ AO_INLINE AO_double_t
+ AO_double_load_acquire(const volatile AO_double_t *addr)
+ {
+ AO_double_t result = AO_double_load(addr);
+
+ /* Acquire barrier would be useless, since the load could be delayed */
+ /* beyond it. */
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_double_load_acquire
+#endif
+
+#if defined(AO_HAVE_double_load) && defined(AO_HAVE_nop_read) \
+ && !defined(AO_HAVE_double_load_read)
+ AO_INLINE AO_double_t
+ AO_double_load_read(const volatile AO_double_t *addr)
+ {
+ AO_double_t result = AO_double_load(addr);
+
+ AO_nop_read();
+ return result;
+ }
+# define AO_HAVE_double_load_read
+#endif
+
+#if defined(AO_HAVE_double_load_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_double_load_full)
+# define AO_double_load_full(addr) (AO_nop_full(), AO_double_load_acquire(addr))
+# define AO_HAVE_double_load_full
+#endif
+
+#if defined(AO_HAVE_double_compare_and_swap_read) \
+ && !defined(AO_HAVE_double_load_read)
+# define AO_double_CAS_BASED_LOAD_READ
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_double_t
+ AO_double_load_read(const volatile AO_double_t *addr)
+ {
+ AO_double_t result;
+
+ do {
+ result = *(const AO_double_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_read(
+ (volatile AO_double_t *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_double_load_read
+#endif
+
+#if !defined(AO_HAVE_double_load_acquire_read) \
+ && defined(AO_HAVE_double_load_read)
+# define AO_double_load_acquire_read(addr) AO_double_load_read(addr)
+# define AO_HAVE_double_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_double_load_acquire_read) && !defined(AO_HAVE_double_load) \
+ && (!defined(AO_double_CAS_BASED_LOAD_READ) \
+ || !defined(AO_HAVE_double_compare_and_swap))
+# define AO_double_load(addr) AO_double_load_acquire_read(addr)
+# define AO_HAVE_double_load
+#endif
+
+#if defined(AO_HAVE_double_compare_and_swap_full) \
+ && !defined(AO_HAVE_double_load_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_double_t
+ AO_double_load_full(const volatile AO_double_t *addr)
+ {
+ AO_double_t result;
+
+ do {
+ result = *(const AO_double_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_full(
+ (volatile AO_double_t *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_double_load_full
+#endif
+
+#if defined(AO_HAVE_double_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_double_load_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_double_t
+ AO_double_load_acquire(const volatile AO_double_t *addr)
+ {
+ AO_double_t result;
+
+ do {
+ result = *(const AO_double_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_acquire(
+ (volatile AO_double_t *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_double_load_acquire
+#endif
+
+#if defined(AO_HAVE_double_compare_and_swap) && !defined(AO_HAVE_double_load)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE AO_double_t
+ AO_double_load(const volatile AO_double_t *addr)
+ {
+ AO_double_t result;
+
+ do {
+ result = *(const AO_double_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap(
+ (volatile AO_double_t *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_double_load
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_double_load_acquire_read)
+# define AO_double_load_dd_acquire_read(addr) \
+ AO_double_load_acquire_read(addr)
+# define AO_HAVE_double_load_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_double_load)
+# define AO_double_load_dd_acquire_read(addr) AO_double_load(addr)
+# define AO_HAVE_double_load_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* double_store */
+#if defined(AO_HAVE_double_store_full) && !defined(AO_HAVE_double_store_release)
+# define AO_double_store_release(addr, val) AO_double_store_full(addr, val)
+# define AO_HAVE_double_store_release
+#endif
+
+#if defined(AO_HAVE_double_store_release) && !defined(AO_HAVE_double_store)
+# define AO_double_store(addr, val) AO_double_store_release(addr, val)
+# define AO_HAVE_double_store
+#endif
+
+#if defined(AO_HAVE_double_store_full) && !defined(AO_HAVE_double_store_write)
+# define AO_double_store_write(addr, val) AO_double_store_full(addr, val)
+# define AO_HAVE_double_store_write
+#endif
+
+#if defined(AO_HAVE_double_store_release) \
+ && !defined(AO_HAVE_double_store_release_write)
+# define AO_double_store_release_write(addr, val) \
+ AO_double_store_release(addr, val)
+# define AO_HAVE_double_store_release_write
+#endif
+
+#if defined(AO_HAVE_double_store_write) && !defined(AO_HAVE_double_store)
+# define AO_double_store(addr, val) AO_double_store_write(addr, val)
+# define AO_HAVE_double_store
+#endif
+
+#if defined(AO_HAVE_double_store) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_double_store_release)
+# define AO_double_store_release(addr, val) \
+ (AO_nop_full(), AO_double_store(addr, val))
+# define AO_HAVE_double_store_release
+#endif
+
+#if defined(AO_HAVE_double_store) && defined(AO_HAVE_nop_write) \
+ && !defined(AO_HAVE_double_store_write)
+# define AO_double_store_write(addr, val) \
+ (AO_nop_write(), AO_double_store(addr, val))
+# define AO_HAVE_double_store_write
+#endif
+
+#if defined(AO_HAVE_double_compare_and_swap_write) \
+ && !defined(AO_HAVE_double_store_write)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_double_store_write(volatile AO_double_t *addr, AO_double_t new_val)
+ {
+ AO_double_t old_val;
+
+ do {
+ old_val = *(AO_double_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_write(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_double_store_write
+#endif
+
+#if defined(AO_HAVE_double_store_write) \
+ && !defined(AO_HAVE_double_store_release_write)
+# define AO_double_store_release_write(addr, val) \
+ AO_double_store_write(addr, val)
+# define AO_HAVE_double_store_release_write
+#endif
+
+#if defined(AO_HAVE_double_store_release) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_double_store_full)
+# define AO_double_store_full(addr, val) \
+ (AO_double_store_release(addr, val), \
+ AO_nop_full())
+# define AO_HAVE_double_store_full
+#endif
+
+#if defined(AO_HAVE_double_compare_and_swap) && !defined(AO_HAVE_double_store)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_double_store(volatile AO_double_t *addr, AO_double_t new_val)
+ {
+ AO_double_t old_val;
+
+ do {
+ old_val = *(AO_double_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap(addr,
+ old_val, new_val)));
+ }
+# define AO_HAVE_double_store
+#endif
+
+#if defined(AO_HAVE_double_compare_and_swap_release) \
+ && !defined(AO_HAVE_double_store_release)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_double_store_release(volatile AO_double_t *addr, AO_double_t new_val)
+ {
+ AO_double_t old_val;
+
+ do {
+ old_val = *(AO_double_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_release(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_double_store_release
+#endif
+
+#if defined(AO_HAVE_double_compare_and_swap_full) \
+ && !defined(AO_HAVE_double_store_full)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_double_store_full(volatile AO_double_t *addr, AO_double_t new_val)
+ {
+ AO_double_t old_val;
+
+ do {
+ old_val = *(AO_double_t *)addr;
+ } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_full(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_double_store_full
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-small.template b/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-small.template
new file mode 100644
index 0000000000..d3490f87b0
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize-small.template
@@ -0,0 +1,528 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* XSIZE_fetch_compare_and_swap */
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire)
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_compare_and_swap_acquire(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ XCTYPE result = AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release)
+# define AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val))
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full)
+# if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release)
+# define AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) \
+ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire)
+# define AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) \
+ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write)
+# define AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) \
+ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read)
+# define AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) \
+ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_XSIZE_fetch_compare_and_swap_full */
+
+#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release)
+# define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire)
+# define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write)
+# define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \
+ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read)
+# define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \
+ AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full)
+# define AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) \
+ (AO_nop_full(), \
+ AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val))
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write)
+# define AO_XSIZE_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \
+ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release)
+# define AO_XSIZE_fetch_compare_and_swap_release_write(addr,old_val,new_val) \
+ AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read)
+# define AO_XSIZE_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire)
+# define AO_XSIZE_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \
+ AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read)
+# define AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_XSIZE_fetch_compare_and_swap_acquire_read(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_XSIZE_fetch_compare_and_swap)
+# define AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \
+ AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val)
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* XSIZE_compare_and_swap */
+#if defined(AO_HAVE_XSIZE_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old,
+ XCTYPE new_val)
+ {
+ int result = AO_XSIZE_compare_and_swap(addr, old, new_val);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_XSIZE_compare_and_swap) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_release)
+# define AO_XSIZE_compare_and_swap_release(addr, old, new_val) \
+ (AO_nop_full(), AO_XSIZE_compare_and_swap(addr, old, new_val))
+# define AO_HAVE_XSIZE_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_XSIZE_compare_and_swap_full)
+# if !defined(AO_HAVE_XSIZE_compare_and_swap_release)
+# define AO_XSIZE_compare_and_swap_release(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap_release
+# endif
+# if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire)
+# define AO_XSIZE_compare_and_swap_acquire(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap_acquire
+# endif
+# if !defined(AO_HAVE_XSIZE_compare_and_swap_write)
+# define AO_XSIZE_compare_and_swap_write(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap_write
+# endif
+# if !defined(AO_HAVE_XSIZE_compare_and_swap_read)
+# define AO_XSIZE_compare_and_swap_read(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_full(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap_read
+# endif
+#endif /* AO_HAVE_XSIZE_compare_and_swap_full */
+
+#if !defined(AO_HAVE_XSIZE_compare_and_swap) \
+ && defined(AO_HAVE_XSIZE_compare_and_swap_release)
+# define AO_XSIZE_compare_and_swap(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap
+#endif
+#if !defined(AO_HAVE_XSIZE_compare_and_swap) \
+ && defined(AO_HAVE_XSIZE_compare_and_swap_acquire)
+# define AO_XSIZE_compare_and_swap(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap
+#endif
+#if !defined(AO_HAVE_XSIZE_compare_and_swap) \
+ && defined(AO_HAVE_XSIZE_compare_and_swap_write)
+# define AO_XSIZE_compare_and_swap(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap
+#endif
+#if !defined(AO_HAVE_XSIZE_compare_and_swap) \
+ && defined(AO_HAVE_XSIZE_compare_and_swap_read)
+# define AO_XSIZE_compare_and_swap(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_compare_and_swap_full)
+# define AO_XSIZE_compare_and_swap_full(addr, old, new_val) \
+ (AO_nop_full(), \
+ AO_XSIZE_compare_and_swap_acquire(addr, old, new_val))
+# define AO_HAVE_XSIZE_compare_and_swap_full
+#endif
+
+#if !defined(AO_HAVE_XSIZE_compare_and_swap_release_write) \
+ && defined(AO_HAVE_XSIZE_compare_and_swap_write)
+# define AO_XSIZE_compare_and_swap_release_write(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_write(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_compare_and_swap_release_write) \
+ && defined(AO_HAVE_XSIZE_compare_and_swap_release)
+# define AO_XSIZE_compare_and_swap_release_write(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_release(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap_release_write
+#endif
+#if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_XSIZE_compare_and_swap_read)
+# define AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_read(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap_acquire_read
+#endif
+#if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) \
+ && defined(AO_HAVE_XSIZE_compare_and_swap_acquire)
+# define AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_acquire(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read)
+# define AO_XSIZE_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_XSIZE_compare_and_swap)
+# define AO_XSIZE_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_XSIZE_compare_and_swap(addr, old, new_val)
+# define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* XSIZE_load */
+#if defined(AO_HAVE_XSIZE_load_full) && !defined(AO_HAVE_XSIZE_load_acquire)
+# define AO_XSIZE_load_acquire(addr) AO_XSIZE_load_full(addr)
+# define AO_HAVE_XSIZE_load_acquire
+#endif
+
+#if defined(AO_HAVE_XSIZE_load_acquire) && !defined(AO_HAVE_XSIZE_load)
+# define AO_XSIZE_load(addr) AO_XSIZE_load_acquire(addr)
+# define AO_HAVE_XSIZE_load
+#endif
+
+#if defined(AO_HAVE_XSIZE_load_full) && !defined(AO_HAVE_XSIZE_load_read)
+# define AO_XSIZE_load_read(addr) AO_XSIZE_load_full(addr)
+# define AO_HAVE_XSIZE_load_read
+#endif
+
+#if !defined(AO_HAVE_XSIZE_load_acquire_read) \
+ && defined(AO_HAVE_XSIZE_load_acquire)
+# define AO_XSIZE_load_acquire_read(addr) AO_XSIZE_load_acquire(addr)
+# define AO_HAVE_XSIZE_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_XSIZE_load) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_load_acquire)
+ AO_INLINE XCTYPE
+ AO_XSIZE_load_acquire(const volatile XCTYPE *addr)
+ {
+ XCTYPE result = AO_XSIZE_load(addr);
+
+ /* Acquire barrier would be useless, since the load could be delayed */
+ /* beyond it. */
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_XSIZE_load_acquire
+#endif
+
+#if defined(AO_HAVE_XSIZE_load) && defined(AO_HAVE_nop_read) \
+ && !defined(AO_HAVE_XSIZE_load_read)
+ AO_INLINE XCTYPE
+ AO_XSIZE_load_read(const volatile XCTYPE *addr)
+ {
+ XCTYPE result = AO_XSIZE_load(addr);
+
+ AO_nop_read();
+ return result;
+ }
+# define AO_HAVE_XSIZE_load_read
+#endif
+
+#if defined(AO_HAVE_XSIZE_load_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_load_full)
+# define AO_XSIZE_load_full(addr) (AO_nop_full(), AO_XSIZE_load_acquire(addr))
+# define AO_HAVE_XSIZE_load_full
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap_read) \
+ && !defined(AO_HAVE_XSIZE_load_read)
+# define AO_XSIZE_CAS_BASED_LOAD_READ
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE XCTYPE
+ AO_XSIZE_load_read(const volatile XCTYPE *addr)
+ {
+ XCTYPE result;
+
+ do {
+ result = *(const XCTYPE *)addr;
+ } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_read(
+ (volatile XCTYPE *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_XSIZE_load_read
+#endif
+
+#if !defined(AO_HAVE_XSIZE_load_acquire_read) \
+ && defined(AO_HAVE_XSIZE_load_read)
+# define AO_XSIZE_load_acquire_read(addr) AO_XSIZE_load_read(addr)
+# define AO_HAVE_XSIZE_load_acquire_read
+#endif
+
+#if defined(AO_HAVE_XSIZE_load_acquire_read) && !defined(AO_HAVE_XSIZE_load) \
+ && (!defined(AO_XSIZE_CAS_BASED_LOAD_READ) \
+ || !defined(AO_HAVE_XSIZE_compare_and_swap))
+# define AO_XSIZE_load(addr) AO_XSIZE_load_acquire_read(addr)
+# define AO_HAVE_XSIZE_load
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap_full) \
+ && !defined(AO_HAVE_XSIZE_load_full)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE XCTYPE
+ AO_XSIZE_load_full(const volatile XCTYPE *addr)
+ {
+ XCTYPE result;
+
+ do {
+ result = *(const XCTYPE *)addr;
+ } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(
+ (volatile XCTYPE *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_XSIZE_load_full
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_XSIZE_load_acquire)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE XCTYPE
+ AO_XSIZE_load_acquire(const volatile XCTYPE *addr)
+ {
+ XCTYPE result;
+
+ do {
+ result = *(const XCTYPE *)addr;
+ } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_acquire(
+ (volatile XCTYPE *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_XSIZE_load_acquire
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap) && !defined(AO_HAVE_XSIZE_load)
+ AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE XCTYPE
+ AO_XSIZE_load(const volatile XCTYPE *addr)
+ {
+ XCTYPE result;
+
+ do {
+ result = *(const XCTYPE *)addr;
+ } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap(
+ (volatile XCTYPE *)addr,
+ result, result)));
+ return result;
+ }
+# define AO_HAVE_XSIZE_load
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_XSIZE_load_acquire_read)
+# define AO_XSIZE_load_dd_acquire_read(addr) \
+ AO_XSIZE_load_acquire_read(addr)
+# define AO_HAVE_XSIZE_load_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_XSIZE_load)
+# define AO_XSIZE_load_dd_acquire_read(addr) AO_XSIZE_load(addr)
+# define AO_HAVE_XSIZE_load_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* XSIZE_store */
+#if defined(AO_HAVE_XSIZE_store_full) && !defined(AO_HAVE_XSIZE_store_release)
+# define AO_XSIZE_store_release(addr, val) AO_XSIZE_store_full(addr, val)
+# define AO_HAVE_XSIZE_store_release
+#endif
+
+#if defined(AO_HAVE_XSIZE_store_release) && !defined(AO_HAVE_XSIZE_store)
+# define AO_XSIZE_store(addr, val) AO_XSIZE_store_release(addr, val)
+# define AO_HAVE_XSIZE_store
+#endif
+
+#if defined(AO_HAVE_XSIZE_store_full) && !defined(AO_HAVE_XSIZE_store_write)
+# define AO_XSIZE_store_write(addr, val) AO_XSIZE_store_full(addr, val)
+# define AO_HAVE_XSIZE_store_write
+#endif
+
+#if defined(AO_HAVE_XSIZE_store_release) \
+ && !defined(AO_HAVE_XSIZE_store_release_write)
+# define AO_XSIZE_store_release_write(addr, val) \
+ AO_XSIZE_store_release(addr, val)
+# define AO_HAVE_XSIZE_store_release_write
+#endif
+
+#if defined(AO_HAVE_XSIZE_store_write) && !defined(AO_HAVE_XSIZE_store)
+# define AO_XSIZE_store(addr, val) AO_XSIZE_store_write(addr, val)
+# define AO_HAVE_XSIZE_store
+#endif
+
+#if defined(AO_HAVE_XSIZE_store) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_store_release)
+# define AO_XSIZE_store_release(addr, val) \
+ (AO_nop_full(), AO_XSIZE_store(addr, val))
+# define AO_HAVE_XSIZE_store_release
+#endif
+
+#if defined(AO_HAVE_XSIZE_store) && defined(AO_HAVE_nop_write) \
+ && !defined(AO_HAVE_XSIZE_store_write)
+# define AO_XSIZE_store_write(addr, val) \
+ (AO_nop_write(), AO_XSIZE_store(addr, val))
+# define AO_HAVE_XSIZE_store_write
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap_write) \
+ && !defined(AO_HAVE_XSIZE_store_write)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_XSIZE_store_write(volatile XCTYPE *addr, XCTYPE new_val)
+ {
+ XCTYPE old_val;
+
+ do {
+ old_val = *(XCTYPE *)addr;
+ } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_write(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_XSIZE_store_write
+#endif
+
+#if defined(AO_HAVE_XSIZE_store_write) \
+ && !defined(AO_HAVE_XSIZE_store_release_write)
+# define AO_XSIZE_store_release_write(addr, val) \
+ AO_XSIZE_store_write(addr, val)
+# define AO_HAVE_XSIZE_store_release_write
+#endif
+
+#if defined(AO_HAVE_XSIZE_store_release) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_XSIZE_store_full)
+# define AO_XSIZE_store_full(addr, val) \
+ (AO_XSIZE_store_release(addr, val), \
+ AO_nop_full())
+# define AO_HAVE_XSIZE_store_full
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap) && !defined(AO_HAVE_XSIZE_store)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_XSIZE_store(volatile XCTYPE *addr, XCTYPE new_val)
+ {
+ XCTYPE old_val;
+
+ do {
+ old_val = *(XCTYPE *)addr;
+ } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap(addr,
+ old_val, new_val)));
+ }
+# define AO_HAVE_XSIZE_store
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap_release) \
+ && !defined(AO_HAVE_XSIZE_store_release)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_XSIZE_store_release(volatile XCTYPE *addr, XCTYPE new_val)
+ {
+ XCTYPE old_val;
+
+ do {
+ old_val = *(XCTYPE *)addr;
+ } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_release(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_XSIZE_store_release
+#endif
+
+#if defined(AO_HAVE_XSIZE_compare_and_swap_full) \
+ && !defined(AO_HAVE_XSIZE_store_full)
+ AO_ATTR_NO_SANITIZE_MEMORY AO_ATTR_NO_SANITIZE_THREAD
+ AO_INLINE void
+ AO_XSIZE_store_full(volatile XCTYPE *addr, XCTYPE new_val)
+ {
+ XCTYPE old_val;
+
+ do {
+ old_val = *(XCTYPE *)addr;
+ } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old_val,
+ new_val)));
+ }
+# define AO_HAVE_XSIZE_store_full
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize.h
new file mode 100644
index 0000000000..73b06ed103
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/generalize.h
@@ -0,0 +1,729 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * Generalize atomic operations for atomic_ops.h.
+ * Should not be included directly.
+ *
+ * We make no attempt to define useless operations, such as
+ * AO_nop_acquire
+ * AO_nop_release
+ *
+ * We have also so far neglected to define some others, which
+ * do not appear likely to be useful, e.g. stores with acquire
+ * or read barriers.
+ *
+ * This file is sometimes included twice by atomic_ops.h.
+ * All definitions include explicit checks that we are not replacing
+ * an earlier definition. In general, more desirable expansions
+ * appear earlier so that we are more likely to use them.
+ *
+ * We only make safe generalizations, except that by default we define
+ * the ...dd_acquire_read operations to be equivalent to those without
+ * a barrier. On platforms for which this is unsafe, the platform-specific
+ * file must define AO_NO_DD_ORDERING.
+ */
+
+#ifndef AO_ATOMIC_OPS_H
+# error This file should not be included directly.
+#endif
+
+/* Generate test_and_set_full, if necessary and possible. */
+#if !defined(AO_HAVE_test_and_set) && !defined(AO_HAVE_test_and_set_release) \
+ && !defined(AO_HAVE_test_and_set_acquire) \
+ && !defined(AO_HAVE_test_and_set_read) \
+ && !defined(AO_HAVE_test_and_set_full)
+
+ /* Emulate AO_compare_and_swap() via AO_fetch_compare_and_swap(). */
+# if defined(AO_HAVE_fetch_compare_and_swap) \
+ && !defined(AO_HAVE_compare_and_swap)
+ AO_INLINE int
+ AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap(addr, old_val, new_val) == old_val;
+ }
+# define AO_HAVE_compare_and_swap
+# endif
+
+# if defined(AO_HAVE_fetch_compare_and_swap_full) \
+ && !defined(AO_HAVE_compare_and_swap_full)
+ AO_INLINE int
+ AO_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_full(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_compare_and_swap_full
+# endif
+
+# if defined(AO_HAVE_fetch_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_acquire(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_compare_and_swap_acquire
+# endif
+
+# if defined(AO_HAVE_fetch_compare_and_swap_release) \
+ && !defined(AO_HAVE_compare_and_swap_release)
+ AO_INLINE int
+ AO_compare_and_swap_release(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+ return AO_fetch_compare_and_swap_release(addr, old_val, new_val)
+ == old_val;
+ }
+# define AO_HAVE_compare_and_swap_release
+# endif
+
+# if defined(AO_CHAR_TS_T)
+# define AO_TS_COMPARE_AND_SWAP_FULL(a,o,n) \
+ AO_char_compare_and_swap_full(a,o,n)
+# define AO_TS_COMPARE_AND_SWAP_ACQUIRE(a,o,n) \
+ AO_char_compare_and_swap_acquire(a,o,n)
+# define AO_TS_COMPARE_AND_SWAP_RELEASE(a,o,n) \
+ AO_char_compare_and_swap_release(a,o,n)
+# define AO_TS_COMPARE_AND_SWAP(a,o,n) AO_char_compare_and_swap(a,o,n)
+# endif
+
+# if defined(AO_AO_TS_T)
+# define AO_TS_COMPARE_AND_SWAP_FULL(a,o,n) AO_compare_and_swap_full(a,o,n)
+# define AO_TS_COMPARE_AND_SWAP_ACQUIRE(a,o,n) \
+ AO_compare_and_swap_acquire(a,o,n)
+# define AO_TS_COMPARE_AND_SWAP_RELEASE(a,o,n) \
+ AO_compare_and_swap_release(a,o,n)
+# define AO_TS_COMPARE_AND_SWAP(a,o,n) AO_compare_and_swap(a,o,n)
+# endif
+
+# if (defined(AO_AO_TS_T) && defined(AO_HAVE_compare_and_swap_full)) \
+ || (defined(AO_CHAR_TS_T) && defined(AO_HAVE_char_compare_and_swap_full))
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_full(volatile AO_TS_t *addr)
+ {
+ if (AO_TS_COMPARE_AND_SWAP_FULL(addr, AO_TS_CLEAR, AO_TS_SET))
+ return AO_TS_CLEAR;
+ else
+ return AO_TS_SET;
+ }
+# define AO_HAVE_test_and_set_full
+# endif /* AO_HAVE_compare_and_swap_full */
+
+# if (defined(AO_AO_TS_T) && defined(AO_HAVE_compare_and_swap_acquire)) \
+ || (defined(AO_CHAR_TS_T) \
+ && defined(AO_HAVE_char_compare_and_swap_acquire))
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_acquire(volatile AO_TS_t *addr)
+ {
+ if (AO_TS_COMPARE_AND_SWAP_ACQUIRE(addr, AO_TS_CLEAR, AO_TS_SET))
+ return AO_TS_CLEAR;
+ else
+ return AO_TS_SET;
+ }
+# define AO_HAVE_test_and_set_acquire
+# endif /* AO_HAVE_compare_and_swap_acquire */
+
+# if (defined(AO_AO_TS_T) && defined(AO_HAVE_compare_and_swap_release)) \
+ || (defined(AO_CHAR_TS_T) \
+ && defined(AO_HAVE_char_compare_and_swap_release))
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_release(volatile AO_TS_t *addr)
+ {
+ if (AO_TS_COMPARE_AND_SWAP_RELEASE(addr, AO_TS_CLEAR, AO_TS_SET))
+ return AO_TS_CLEAR;
+ else
+ return AO_TS_SET;
+ }
+# define AO_HAVE_test_and_set_release
+# endif /* AO_HAVE_compare_and_swap_release */
+
+# if (defined(AO_AO_TS_T) && defined(AO_HAVE_compare_and_swap)) \
+ || (defined(AO_CHAR_TS_T) && defined(AO_HAVE_char_compare_and_swap))
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set(volatile AO_TS_t *addr)
+ {
+ if (AO_TS_COMPARE_AND_SWAP(addr, AO_TS_CLEAR, AO_TS_SET))
+ return AO_TS_CLEAR;
+ else
+ return AO_TS_SET;
+ }
+# define AO_HAVE_test_and_set
+# endif /* AO_HAVE_compare_and_swap */
+#endif /* No prior test and set */
+
+/* Nop */
+#if !defined(AO_HAVE_nop)
+ AO_INLINE void AO_nop(void) {}
+# define AO_HAVE_nop
+#endif
+
+#if defined(AO_HAVE_test_and_set_full) && !defined(AO_HAVE_nop_full)
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ AO_TS_t dummy = AO_TS_INITIALIZER;
+ AO_test_and_set_full(&dummy);
+ }
+# define AO_HAVE_nop_full
+#endif
+
+#if defined(AO_HAVE_nop_acquire) && !defined(CPPCHECK)
+# error AO_nop_acquire is useless: do not define.
+#endif
+
+#if defined(AO_HAVE_nop_release) && !defined(CPPCHECK)
+# error AO_nop_release is useless: do not define.
+#endif
+
+#if defined(AO_HAVE_nop_full) && !defined(AO_HAVE_nop_read)
+# define AO_nop_read() AO_nop_full()
+# define AO_HAVE_nop_read
+#endif
+
+#if defined(AO_HAVE_nop_full) && !defined(AO_HAVE_nop_write)
+# define AO_nop_write() AO_nop_full()
+# define AO_HAVE_nop_write
+#endif
+
+/* Test_and_set */
+#if defined(AO_HAVE_test_and_set) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_test_and_set_release)
+# define AO_test_and_set_release(addr) (AO_nop_full(), AO_test_and_set(addr))
+# define AO_HAVE_test_and_set_release
+#endif
+
+#if defined(AO_HAVE_test_and_set) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_test_and_set_acquire)
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_acquire(volatile AO_TS_t *addr)
+ {
+ AO_TS_VAL_t result = AO_test_and_set(addr);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_test_and_set_acquire
+#endif
+
+#if defined(AO_HAVE_test_and_set_full)
+# if !defined(AO_HAVE_test_and_set_release)
+# define AO_test_and_set_release(addr) AO_test_and_set_full(addr)
+# define AO_HAVE_test_and_set_release
+# endif
+# if !defined(AO_HAVE_test_and_set_acquire)
+# define AO_test_and_set_acquire(addr) AO_test_and_set_full(addr)
+# define AO_HAVE_test_and_set_acquire
+# endif
+# if !defined(AO_HAVE_test_and_set_write)
+# define AO_test_and_set_write(addr) AO_test_and_set_full(addr)
+# define AO_HAVE_test_and_set_write
+# endif
+# if !defined(AO_HAVE_test_and_set_read)
+# define AO_test_and_set_read(addr) AO_test_and_set_full(addr)
+# define AO_HAVE_test_and_set_read
+# endif
+#endif /* AO_HAVE_test_and_set_full */
+
+#if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_release)
+# define AO_test_and_set(addr) AO_test_and_set_release(addr)
+# define AO_HAVE_test_and_set
+#endif
+#if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_acquire)
+# define AO_test_and_set(addr) AO_test_and_set_acquire(addr)
+# define AO_HAVE_test_and_set
+#endif
+#if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_write)
+# define AO_test_and_set(addr) AO_test_and_set_write(addr)
+# define AO_HAVE_test_and_set
+#endif
+#if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_read)
+# define AO_test_and_set(addr) AO_test_and_set_read(addr)
+# define AO_HAVE_test_and_set
+#endif
+
+#if defined(AO_HAVE_test_and_set_acquire) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_test_and_set_full)
+# define AO_test_and_set_full(addr) \
+ (AO_nop_full(), AO_test_and_set_acquire(addr))
+# define AO_HAVE_test_and_set_full
+#endif
+
+#if !defined(AO_HAVE_test_and_set_release_write) \
+ && defined(AO_HAVE_test_and_set_write)
+# define AO_test_and_set_release_write(addr) AO_test_and_set_write(addr)
+# define AO_HAVE_test_and_set_release_write
+#endif
+#if !defined(AO_HAVE_test_and_set_release_write) \
+ && defined(AO_HAVE_test_and_set_release)
+# define AO_test_and_set_release_write(addr) AO_test_and_set_release(addr)
+# define AO_HAVE_test_and_set_release_write
+#endif
+#if !defined(AO_HAVE_test_and_set_acquire_read) \
+ && defined(AO_HAVE_test_and_set_read)
+# define AO_test_and_set_acquire_read(addr) AO_test_and_set_read(addr)
+# define AO_HAVE_test_and_set_acquire_read
+#endif
+#if !defined(AO_HAVE_test_and_set_acquire_read) \
+ && defined(AO_HAVE_test_and_set_acquire)
+# define AO_test_and_set_acquire_read(addr) AO_test_and_set_acquire(addr)
+# define AO_HAVE_test_and_set_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_test_and_set_acquire_read)
+# define AO_test_and_set_dd_acquire_read(addr) \
+ AO_test_and_set_acquire_read(addr)
+# define AO_HAVE_test_and_set_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_test_and_set)
+# define AO_test_and_set_dd_acquire_read(addr) AO_test_and_set(addr)
+# define AO_HAVE_test_and_set_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+#include "generalize-small.h"
+
+#include "generalize-arithm.h"
+
+/* Compare_double_and_swap_double based on double_compare_and_swap. */
+#ifdef AO_HAVE_DOUBLE_PTR_STORAGE
+# if defined(AO_HAVE_double_compare_and_swap) \
+ && !defined(AO_HAVE_compare_double_and_swap_double)
+ AO_INLINE int
+ AO_compare_double_and_swap_double(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ AO_double_t old_w;
+ AO_double_t new_w;
+ old_w.AO_val1 = old_val1;
+ old_w.AO_val2 = old_val2;
+ new_w.AO_val1 = new_val1;
+ new_w.AO_val2 = new_val2;
+ return AO_double_compare_and_swap(addr, old_w, new_w);
+ }
+# define AO_HAVE_compare_double_and_swap_double
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_compare_double_and_swap_double_acquire)
+ AO_INLINE int
+ AO_compare_double_and_swap_double_acquire(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ AO_double_t old_w;
+ AO_double_t new_w;
+ old_w.AO_val1 = old_val1;
+ old_w.AO_val2 = old_val2;
+ new_w.AO_val1 = new_val1;
+ new_w.AO_val2 = new_val2;
+ return AO_double_compare_and_swap_acquire(addr, old_w, new_w);
+ }
+# define AO_HAVE_compare_double_and_swap_double_acquire
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_release) \
+ && !defined(AO_HAVE_compare_double_and_swap_double_release)
+ AO_INLINE int
+ AO_compare_double_and_swap_double_release(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ AO_double_t old_w;
+ AO_double_t new_w;
+ old_w.AO_val1 = old_val1;
+ old_w.AO_val2 = old_val2;
+ new_w.AO_val1 = new_val1;
+ new_w.AO_val2 = new_val2;
+ return AO_double_compare_and_swap_release(addr, old_w, new_w);
+ }
+# define AO_HAVE_compare_double_and_swap_double_release
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_full) \
+ && !defined(AO_HAVE_compare_double_and_swap_double_full)
+ AO_INLINE int
+ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ AO_double_t old_w;
+ AO_double_t new_w;
+ old_w.AO_val1 = old_val1;
+ old_w.AO_val2 = old_val2;
+ new_w.AO_val1 = new_val1;
+ new_w.AO_val2 = new_val2;
+ return AO_double_compare_and_swap_full(addr, old_w, new_w);
+ }
+# define AO_HAVE_compare_double_and_swap_double_full
+# endif
+#endif /* AO_HAVE_DOUBLE_PTR_STORAGE */
+
+/* Compare_double_and_swap_double */
+#if defined(AO_HAVE_compare_double_and_swap_double) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_compare_double_and_swap_double_acquire)
+ AO_INLINE int
+ AO_compare_double_and_swap_double_acquire(volatile AO_double_t *addr,
+ AO_t o1, AO_t o2,
+ AO_t n1, AO_t n2)
+ {
+ int result = AO_compare_double_and_swap_double(addr, o1, o2, n1, n2);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_compare_double_and_swap_double_acquire
+#endif
+#if defined(AO_HAVE_compare_double_and_swap_double) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_compare_double_and_swap_double_release)
+# define AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) \
+ (AO_nop_full(), AO_compare_double_and_swap_double(addr,o1,o2,n1,n2))
+# define AO_HAVE_compare_double_and_swap_double_release
+#endif
+#if defined(AO_HAVE_compare_double_and_swap_double_full)
+# if !defined(AO_HAVE_compare_double_and_swap_double_release)
+# define AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double_release
+# endif
+# if !defined(AO_HAVE_compare_double_and_swap_double_acquire)
+# define AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double_acquire
+# endif
+# if !defined(AO_HAVE_compare_double_and_swap_double_write)
+# define AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double_write
+# endif
+# if !defined(AO_HAVE_compare_double_and_swap_double_read)
+# define AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double_read
+# endif
+#endif /* AO_HAVE_compare_double_and_swap_double_full */
+
+#if !defined(AO_HAVE_compare_double_and_swap_double) \
+ && defined(AO_HAVE_compare_double_and_swap_double_release)
+# define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double
+#endif
+#if !defined(AO_HAVE_compare_double_and_swap_double) \
+ && defined(AO_HAVE_compare_double_and_swap_double_acquire)
+# define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double
+#endif
+#if !defined(AO_HAVE_compare_double_and_swap_double) \
+ && defined(AO_HAVE_compare_double_and_swap_double_write)
+# define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double
+#endif
+#if !defined(AO_HAVE_compare_double_and_swap_double) \
+ && defined(AO_HAVE_compare_double_and_swap_double_read)
+# define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double
+#endif
+
+#if defined(AO_HAVE_compare_double_and_swap_double_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_compare_double_and_swap_double_full)
+# define AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) \
+ (AO_nop_full(), \
+ AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2))
+# define AO_HAVE_compare_double_and_swap_double_full
+#endif
+
+#if !defined(AO_HAVE_compare_double_and_swap_double_release_write) \
+ && defined(AO_HAVE_compare_double_and_swap_double_write)
+# define AO_compare_double_and_swap_double_release_write(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double_release_write
+#endif
+#if !defined(AO_HAVE_compare_double_and_swap_double_release_write) \
+ && defined(AO_HAVE_compare_double_and_swap_double_release)
+# define AO_compare_double_and_swap_double_release_write(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double_release_write
+#endif
+#if !defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \
+ && defined(AO_HAVE_compare_double_and_swap_double_read)
+# define AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double_acquire_read
+#endif
+#if !defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \
+ && defined(AO_HAVE_compare_double_and_swap_double_acquire)
+# define AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_compare_double_and_swap_double_acquire_read)
+# define AO_compare_double_and_swap_double_dd_acquire_read(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_compare_double_and_swap_double)
+# define AO_compare_double_and_swap_double_dd_acquire_read(addr,o1,o2,n1,n2) \
+ AO_compare_double_and_swap_double(addr,o1,o2,n1,n2)
+# define AO_HAVE_compare_double_and_swap_double_dd_acquire_read
+# endif
+#endif /* !AO_NO_DD_ORDERING */
+
+/* Compare_and_swap_double */
+#if defined(AO_HAVE_compare_and_swap_double) && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_compare_and_swap_double_acquire)
+ AO_INLINE int
+ AO_compare_and_swap_double_acquire(volatile AO_double_t *addr,
+ AO_t o1,
+ AO_t n1, AO_t n2)
+ {
+ int result = AO_compare_and_swap_double(addr, o1, n1, n2);
+ AO_nop_full();
+ return result;
+ }
+# define AO_HAVE_compare_and_swap_double_acquire
+#endif
+#if defined(AO_HAVE_compare_and_swap_double) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_compare_and_swap_double_release)
+# define AO_compare_and_swap_double_release(addr,o1,n1,n2) \
+ (AO_nop_full(), AO_compare_and_swap_double(addr,o1,n1,n2))
+# define AO_HAVE_compare_and_swap_double_release
+#endif
+#if defined(AO_HAVE_compare_and_swap_double_full)
+# if !defined(AO_HAVE_compare_and_swap_double_release)
+# define AO_compare_and_swap_double_release(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_full(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double_release
+# endif
+# if !defined(AO_HAVE_compare_and_swap_double_acquire)
+# define AO_compare_and_swap_double_acquire(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_full(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double_acquire
+# endif
+# if !defined(AO_HAVE_compare_and_swap_double_write)
+# define AO_compare_and_swap_double_write(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_full(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double_write
+# endif
+# if !defined(AO_HAVE_compare_and_swap_double_read)
+# define AO_compare_and_swap_double_read(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_full(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double_read
+# endif
+#endif /* AO_HAVE_compare_and_swap_double_full */
+
+#if !defined(AO_HAVE_compare_and_swap_double) \
+ && defined(AO_HAVE_compare_and_swap_double_release)
+# define AO_compare_and_swap_double(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_release(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double
+#endif
+#if !defined(AO_HAVE_compare_and_swap_double) \
+ && defined(AO_HAVE_compare_and_swap_double_acquire)
+# define AO_compare_and_swap_double(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_acquire(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double
+#endif
+#if !defined(AO_HAVE_compare_and_swap_double) \
+ && defined(AO_HAVE_compare_and_swap_double_write)
+# define AO_compare_and_swap_double(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_write(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double
+#endif
+#if !defined(AO_HAVE_compare_and_swap_double) \
+ && defined(AO_HAVE_compare_and_swap_double_read)
+# define AO_compare_and_swap_double(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_read(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_double_acquire) \
+ && defined(AO_HAVE_nop_full) \
+ && !defined(AO_HAVE_compare_and_swap_double_full)
+# define AO_compare_and_swap_double_full(addr,o1,n1,n2) \
+ (AO_nop_full(), AO_compare_and_swap_double_acquire(addr,o1,n1,n2))
+# define AO_HAVE_compare_and_swap_double_full
+#endif
+
+#if !defined(AO_HAVE_compare_and_swap_double_release_write) \
+ && defined(AO_HAVE_compare_and_swap_double_write)
+# define AO_compare_and_swap_double_release_write(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_write(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double_release_write
+#endif
+#if !defined(AO_HAVE_compare_and_swap_double_release_write) \
+ && defined(AO_HAVE_compare_and_swap_double_release)
+# define AO_compare_and_swap_double_release_write(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_release(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double_release_write
+#endif
+#if !defined(AO_HAVE_compare_and_swap_double_acquire_read) \
+ && defined(AO_HAVE_compare_and_swap_double_read)
+# define AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_read(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double_acquire_read
+#endif
+#if !defined(AO_HAVE_compare_and_swap_double_acquire_read) \
+ && defined(AO_HAVE_compare_and_swap_double_acquire)
+# define AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_acquire(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double_acquire_read
+#endif
+
+#ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_compare_and_swap_double_acquire_read)
+# define AO_compare_and_swap_double_dd_acquire_read(addr,o1,n1,n2) \
+ AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double_dd_acquire_read
+# endif
+#else
+# if defined(AO_HAVE_compare_and_swap_double)
+# define AO_compare_and_swap_double_dd_acquire_read(addr,o1,n1,n2) \
+ AO_compare_and_swap_double(addr,o1,n1,n2)
+# define AO_HAVE_compare_and_swap_double_dd_acquire_read
+# endif
+#endif
+
+/* Convenience functions for AO_double compare-and-swap which types and */
+/* reads easier in code. */
+#if defined(AO_HAVE_compare_double_and_swap_double) \
+ && !defined(AO_HAVE_double_compare_and_swap)
+ AO_INLINE int
+ AO_double_compare_and_swap(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ return AO_compare_double_and_swap_double(addr,
+ old_val.AO_val1, old_val.AO_val2,
+ new_val.AO_val1, new_val.AO_val2);
+ }
+# define AO_HAVE_double_compare_and_swap
+#endif
+#if defined(AO_HAVE_compare_double_and_swap_double_release) \
+ && !defined(AO_HAVE_double_compare_and_swap_release)
+ AO_INLINE int
+ AO_double_compare_and_swap_release(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ return AO_compare_double_and_swap_double_release(addr,
+ old_val.AO_val1, old_val.AO_val2,
+ new_val.AO_val1, new_val.AO_val2);
+ }
+# define AO_HAVE_double_compare_and_swap_release
+#endif
+#if defined(AO_HAVE_compare_double_and_swap_double_acquire) \
+ && !defined(AO_HAVE_double_compare_and_swap_acquire)
+ AO_INLINE int
+ AO_double_compare_and_swap_acquire(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ return AO_compare_double_and_swap_double_acquire(addr,
+ old_val.AO_val1, old_val.AO_val2,
+ new_val.AO_val1, new_val.AO_val2);
+ }
+# define AO_HAVE_double_compare_and_swap_acquire
+#endif
+#if defined(AO_HAVE_compare_double_and_swap_double_read) \
+ && !defined(AO_HAVE_double_compare_and_swap_read)
+ AO_INLINE int
+ AO_double_compare_and_swap_read(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ return AO_compare_double_and_swap_double_read(addr,
+ old_val.AO_val1, old_val.AO_val2,
+ new_val.AO_val1, new_val.AO_val2);
+ }
+# define AO_HAVE_double_compare_and_swap_read
+#endif
+#if defined(AO_HAVE_compare_double_and_swap_double_write) \
+ && !defined(AO_HAVE_double_compare_and_swap_write)
+ AO_INLINE int
+ AO_double_compare_and_swap_write(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ return AO_compare_double_and_swap_double_write(addr,
+ old_val.AO_val1, old_val.AO_val2,
+ new_val.AO_val1, new_val.AO_val2);
+ }
+# define AO_HAVE_double_compare_and_swap_write
+#endif
+#if defined(AO_HAVE_compare_double_and_swap_double_release_write) \
+ && !defined(AO_HAVE_double_compare_and_swap_release_write)
+ AO_INLINE int
+ AO_double_compare_and_swap_release_write(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ return AO_compare_double_and_swap_double_release_write(addr,
+ old_val.AO_val1, old_val.AO_val2,
+ new_val.AO_val1, new_val.AO_val2);
+ }
+# define AO_HAVE_double_compare_and_swap_release_write
+#endif
+#if defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \
+ && !defined(AO_HAVE_double_compare_and_swap_acquire_read)
+ AO_INLINE int
+ AO_double_compare_and_swap_acquire_read(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ return AO_compare_double_and_swap_double_acquire_read(addr,
+ old_val.AO_val1, old_val.AO_val2,
+ new_val.AO_val1, new_val.AO_val2);
+ }
+# define AO_HAVE_double_compare_and_swap_acquire_read
+#endif
+#if defined(AO_HAVE_compare_double_and_swap_double_full) \
+ && !defined(AO_HAVE_double_compare_and_swap_full)
+ AO_INLINE int
+ AO_double_compare_and_swap_full(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ return AO_compare_double_and_swap_double_full(addr,
+ old_val.AO_val1, old_val.AO_val2,
+ new_val.AO_val1, new_val.AO_val2);
+ }
+# define AO_HAVE_double_compare_and_swap_full
+#endif
+
+#ifndef AO_HAVE_double_compare_and_swap_dd_acquire_read
+ /* Duplicated from generalize-small because double CAS might be */
+ /* defined after the include. */
+# ifdef AO_NO_DD_ORDERING
+# if defined(AO_HAVE_double_compare_and_swap_acquire_read)
+# define AO_double_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_double_compare_and_swap_acquire_read(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_dd_acquire_read
+# endif
+# elif defined(AO_HAVE_double_compare_and_swap)
+# define AO_double_compare_and_swap_dd_acquire_read(addr, old, new_val) \
+ AO_double_compare_and_swap(addr, old, new_val)
+# define AO_HAVE_double_compare_and_swap_dd_acquire_read
+# endif /* !AO_NO_DD_ORDERING */
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/README b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/README
new file mode 100644
index 0000000000..605699fe45
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/README
@@ -0,0 +1,7 @@
+There are two kinds of entities in this directory:
+
+- Subdirectories corresponding to specific compilers (or compiler/OS combinations).
+ Each of these includes one or more architecture-specific headers.
+
+- More generic header files corresponding to a particular ordering and/or
+ atomicity property that might be shared by multiple hardware platforms.
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_acquire_release_volatile.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_acquire_release_volatile.h
new file mode 100644
index 0000000000..f0240e4e67
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_acquire_release_volatile.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Describes architectures on which volatile AO_t, unsigned char, */
+/* unsigned short, and unsigned int loads and stores have */
+/* acquire/release semantics for all normally legal alignments. */
+
+#include "loadstore/acquire_release_volatile.h"
+#include "loadstore/char_acquire_release_volatile.h"
+#include "loadstore/short_acquire_release_volatile.h"
+#include "loadstore/int_acquire_release_volatile.h"
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_aligned_atomic_load_store.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_aligned_atomic_load_store.h
new file mode 100644
index 0000000000..7bcaa99bdb
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_aligned_atomic_load_store.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Describes architectures on which AO_t, unsigned char, unsigned */
+/* short, and unsigned int loads and stores are atomic but only if data */
+/* is suitably aligned. */
+
+#if defined(__m68k__) && !defined(AO_ALIGNOF_SUPPORTED)
+ /* Even though AO_t is redefined in m68k.h, some clients use AO */
+ /* pointer size primitives to access variables not declared as AO_t. */
+ /* Such variables may have 2-byte alignment, while their sizeof is 4. */
+#else
+# define AO_ACCESS_CHECK_ALIGNED
+#endif
+
+/* Check for char type is a misnomer. */
+#define AO_ACCESS_short_CHECK_ALIGNED
+#define AO_ACCESS_int_CHECK_ALIGNED
+#include "all_atomic_load_store.h"
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_load_store.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_load_store.h
new file mode 100644
index 0000000000..b9e414f782
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_load_store.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Describes architectures on which AO_t, unsigned char, unsigned */
+/* short, and unsigned int loads and stores are atomic for all normally */
+/* legal alignments. */
+
+#include "all_atomic_only_load.h"
+
+#include "loadstore/atomic_store.h"
+#include "loadstore/char_atomic_store.h"
+#include "loadstore/short_atomic_store.h"
+#include "loadstore/int_atomic_store.h"
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_only_load.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_only_load.h
new file mode 100644
index 0000000000..695f6b8026
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_only_load.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Describes architectures on which AO_t, unsigned char, unsigned */
+/* short, and unsigned int loads are atomic for all normally legal */
+/* alignments. */
+
+#include "loadstore/atomic_load.h"
+#include "loadstore/char_atomic_load.h"
+#include "loadstore/short_atomic_load.h"
+#include "loadstore/int_atomic_load.h"
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.h
new file mode 100644
index 0000000000..295998ef2c
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.h
@@ -0,0 +1,552 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Inclusion of this file signifies that AO_t is in fact int. */
+/* Hence any AO_... operation can also serve as AO_int_... operation. */
+
+#if defined(AO_HAVE_load) && !defined(AO_HAVE_int_load)
+# define AO_int_load(addr) \
+ (unsigned)AO_load((const volatile AO_t *)(addr))
+# define AO_HAVE_int_load
+#endif
+
+#if defined(AO_HAVE_store) && !defined(AO_HAVE_int_store)
+# define AO_int_store(addr, val) \
+ AO_store((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_store
+#endif
+
+#if defined(AO_HAVE_fetch_and_add) \
+ && !defined(AO_HAVE_int_fetch_and_add)
+# define AO_int_fetch_and_add(addr, incr) \
+ (unsigned)AO_fetch_and_add((volatile AO_t *)(addr), \
+ (AO_t)(incr))
+# define AO_HAVE_int_fetch_and_add
+#endif
+
+#if defined(AO_HAVE_fetch_and_add1) \
+ && !defined(AO_HAVE_int_fetch_and_add1)
+# define AO_int_fetch_and_add1(addr) \
+ (unsigned)AO_fetch_and_add1((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_add1
+#endif
+
+#if defined(AO_HAVE_fetch_and_sub1) \
+ && !defined(AO_HAVE_int_fetch_and_sub1)
+# define AO_int_fetch_and_sub1(addr) \
+ (unsigned)AO_fetch_and_sub1((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_sub1
+#endif
+
+#if defined(AO_HAVE_and) && !defined(AO_HAVE_int_and)
+# define AO_int_and(addr, val) \
+ AO_and((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_and
+#endif
+
+#if defined(AO_HAVE_or) && !defined(AO_HAVE_int_or)
+# define AO_int_or(addr, val) \
+ AO_or((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_or
+#endif
+
+#if defined(AO_HAVE_xor) && !defined(AO_HAVE_int_xor)
+# define AO_int_xor(addr, val) \
+ AO_xor((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_xor
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap) \
+ && !defined(AO_HAVE_int_fetch_compare_and_swap)
+# define AO_int_fetch_compare_and_swap(addr, old, new_val) \
+ (unsigned)AO_fetch_compare_and_swap((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_fetch_compare_and_swap
+#endif
+
+#if defined(AO_HAVE_compare_and_swap) \
+ && !defined(AO_HAVE_int_compare_and_swap)
+# define AO_int_compare_and_swap(addr, old, new_val) \
+ AO_compare_and_swap((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_compare_and_swap
+#endif
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Inclusion of this file signifies that AO_t is in fact int. */
+/* Hence any AO_... operation can also serve as AO_int_... operation. */
+
+#if defined(AO_HAVE_load_full) && !defined(AO_HAVE_int_load_full)
+# define AO_int_load_full(addr) \
+ (unsigned)AO_load_full((const volatile AO_t *)(addr))
+# define AO_HAVE_int_load_full
+#endif
+
+#if defined(AO_HAVE_store_full) && !defined(AO_HAVE_int_store_full)
+# define AO_int_store_full(addr, val) \
+ AO_store_full((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_store_full
+#endif
+
+#if defined(AO_HAVE_fetch_and_add_full) \
+ && !defined(AO_HAVE_int_fetch_and_add_full)
+# define AO_int_fetch_and_add_full(addr, incr) \
+ (unsigned)AO_fetch_and_add_full((volatile AO_t *)(addr), \
+ (AO_t)(incr))
+# define AO_HAVE_int_fetch_and_add_full
+#endif
+
+#if defined(AO_HAVE_fetch_and_add1_full) \
+ && !defined(AO_HAVE_int_fetch_and_add1_full)
+# define AO_int_fetch_and_add1_full(addr) \
+ (unsigned)AO_fetch_and_add1_full((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_add1_full
+#endif
+
+#if defined(AO_HAVE_fetch_and_sub1_full) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_full)
+# define AO_int_fetch_and_sub1_full(addr) \
+ (unsigned)AO_fetch_and_sub1_full((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_sub1_full
+#endif
+
+#if defined(AO_HAVE_and_full) && !defined(AO_HAVE_int_and_full)
+# define AO_int_and_full(addr, val) \
+ AO_and_full((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_and_full
+#endif
+
+#if defined(AO_HAVE_or_full) && !defined(AO_HAVE_int_or_full)
+# define AO_int_or_full(addr, val) \
+ AO_or_full((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_or_full
+#endif
+
+#if defined(AO_HAVE_xor_full) && !defined(AO_HAVE_int_xor_full)
+# define AO_int_xor_full(addr, val) \
+ AO_xor_full((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_xor_full
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_full) \
+ && !defined(AO_HAVE_int_fetch_compare_and_swap_full)
+# define AO_int_fetch_compare_and_swap_full(addr, old, new_val) \
+ (unsigned)AO_fetch_compare_and_swap_full((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_fetch_compare_and_swap_full
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_full) \
+ && !defined(AO_HAVE_int_compare_and_swap_full)
+# define AO_int_compare_and_swap_full(addr, old, new_val) \
+ AO_compare_and_swap_full((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_compare_and_swap_full
+#endif
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Inclusion of this file signifies that AO_t is in fact int. */
+/* Hence any AO_... operation can also serve as AO_int_... operation. */
+
+#if defined(AO_HAVE_load_acquire) && !defined(AO_HAVE_int_load_acquire)
+# define AO_int_load_acquire(addr) \
+ (unsigned)AO_load_acquire((const volatile AO_t *)(addr))
+# define AO_HAVE_int_load_acquire
+#endif
+
+#if defined(AO_HAVE_store_acquire) && !defined(AO_HAVE_int_store_acquire)
+# define AO_int_store_acquire(addr, val) \
+ AO_store_acquire((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_store_acquire
+#endif
+
+#if defined(AO_HAVE_fetch_and_add_acquire) \
+ && !defined(AO_HAVE_int_fetch_and_add_acquire)
+# define AO_int_fetch_and_add_acquire(addr, incr) \
+ (unsigned)AO_fetch_and_add_acquire((volatile AO_t *)(addr), \
+ (AO_t)(incr))
+# define AO_HAVE_int_fetch_and_add_acquire
+#endif
+
+#if defined(AO_HAVE_fetch_and_add1_acquire) \
+ && !defined(AO_HAVE_int_fetch_and_add1_acquire)
+# define AO_int_fetch_and_add1_acquire(addr) \
+ (unsigned)AO_fetch_and_add1_acquire((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_add1_acquire
+#endif
+
+#if defined(AO_HAVE_fetch_and_sub1_acquire) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_acquire)
+# define AO_int_fetch_and_sub1_acquire(addr) \
+ (unsigned)AO_fetch_and_sub1_acquire((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_sub1_acquire
+#endif
+
+#if defined(AO_HAVE_and_acquire) && !defined(AO_HAVE_int_and_acquire)
+# define AO_int_and_acquire(addr, val) \
+ AO_and_acquire((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_and_acquire
+#endif
+
+#if defined(AO_HAVE_or_acquire) && !defined(AO_HAVE_int_or_acquire)
+# define AO_int_or_acquire(addr, val) \
+ AO_or_acquire((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_or_acquire
+#endif
+
+#if defined(AO_HAVE_xor_acquire) && !defined(AO_HAVE_int_xor_acquire)
+# define AO_int_xor_acquire(addr, val) \
+ AO_xor_acquire((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_xor_acquire
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_int_fetch_compare_and_swap_acquire)
+# define AO_int_fetch_compare_and_swap_acquire(addr, old, new_val) \
+ (unsigned)AO_fetch_compare_and_swap_acquire((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_fetch_compare_and_swap_acquire
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_acquire) \
+ && !defined(AO_HAVE_int_compare_and_swap_acquire)
+# define AO_int_compare_and_swap_acquire(addr, old, new_val) \
+ AO_compare_and_swap_acquire((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_compare_and_swap_acquire
+#endif
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Inclusion of this file signifies that AO_t is in fact int. */
+/* Hence any AO_... operation can also serve as AO_int_... operation. */
+
+#if defined(AO_HAVE_load_release) && !defined(AO_HAVE_int_load_release)
+# define AO_int_load_release(addr) \
+ (unsigned)AO_load_release((const volatile AO_t *)(addr))
+# define AO_HAVE_int_load_release
+#endif
+
+#if defined(AO_HAVE_store_release) && !defined(AO_HAVE_int_store_release)
+# define AO_int_store_release(addr, val) \
+ AO_store_release((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_store_release
+#endif
+
+#if defined(AO_HAVE_fetch_and_add_release) \
+ && !defined(AO_HAVE_int_fetch_and_add_release)
+# define AO_int_fetch_and_add_release(addr, incr) \
+ (unsigned)AO_fetch_and_add_release((volatile AO_t *)(addr), \
+ (AO_t)(incr))
+# define AO_HAVE_int_fetch_and_add_release
+#endif
+
+#if defined(AO_HAVE_fetch_and_add1_release) \
+ && !defined(AO_HAVE_int_fetch_and_add1_release)
+# define AO_int_fetch_and_add1_release(addr) \
+ (unsigned)AO_fetch_and_add1_release((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_add1_release
+#endif
+
+#if defined(AO_HAVE_fetch_and_sub1_release) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_release)
+# define AO_int_fetch_and_sub1_release(addr) \
+ (unsigned)AO_fetch_and_sub1_release((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_sub1_release
+#endif
+
+#if defined(AO_HAVE_and_release) && !defined(AO_HAVE_int_and_release)
+# define AO_int_and_release(addr, val) \
+ AO_and_release((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_and_release
+#endif
+
+#if defined(AO_HAVE_or_release) && !defined(AO_HAVE_int_or_release)
+# define AO_int_or_release(addr, val) \
+ AO_or_release((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_or_release
+#endif
+
+#if defined(AO_HAVE_xor_release) && !defined(AO_HAVE_int_xor_release)
+# define AO_int_xor_release(addr, val) \
+ AO_xor_release((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_xor_release
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_release) \
+ && !defined(AO_HAVE_int_fetch_compare_and_swap_release)
+# define AO_int_fetch_compare_and_swap_release(addr, old, new_val) \
+ (unsigned)AO_fetch_compare_and_swap_release((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_fetch_compare_and_swap_release
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_release) \
+ && !defined(AO_HAVE_int_compare_and_swap_release)
+# define AO_int_compare_and_swap_release(addr, old, new_val) \
+ AO_compare_and_swap_release((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_compare_and_swap_release
+#endif
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Inclusion of this file signifies that AO_t is in fact int. */
+/* Hence any AO_... operation can also serve as AO_int_... operation. */
+
+#if defined(AO_HAVE_load_write) && !defined(AO_HAVE_int_load_write)
+# define AO_int_load_write(addr) \
+ (unsigned)AO_load_write((const volatile AO_t *)(addr))
+# define AO_HAVE_int_load_write
+#endif
+
+#if defined(AO_HAVE_store_write) && !defined(AO_HAVE_int_store_write)
+# define AO_int_store_write(addr, val) \
+ AO_store_write((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_store_write
+#endif
+
+#if defined(AO_HAVE_fetch_and_add_write) \
+ && !defined(AO_HAVE_int_fetch_and_add_write)
+# define AO_int_fetch_and_add_write(addr, incr) \
+ (unsigned)AO_fetch_and_add_write((volatile AO_t *)(addr), \
+ (AO_t)(incr))
+# define AO_HAVE_int_fetch_and_add_write
+#endif
+
+#if defined(AO_HAVE_fetch_and_add1_write) \
+ && !defined(AO_HAVE_int_fetch_and_add1_write)
+# define AO_int_fetch_and_add1_write(addr) \
+ (unsigned)AO_fetch_and_add1_write((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_add1_write
+#endif
+
+#if defined(AO_HAVE_fetch_and_sub1_write) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_write)
+# define AO_int_fetch_and_sub1_write(addr) \
+ (unsigned)AO_fetch_and_sub1_write((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_sub1_write
+#endif
+
+#if defined(AO_HAVE_and_write) && !defined(AO_HAVE_int_and_write)
+# define AO_int_and_write(addr, val) \
+ AO_and_write((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_and_write
+#endif
+
+#if defined(AO_HAVE_or_write) && !defined(AO_HAVE_int_or_write)
+# define AO_int_or_write(addr, val) \
+ AO_or_write((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_or_write
+#endif
+
+#if defined(AO_HAVE_xor_write) && !defined(AO_HAVE_int_xor_write)
+# define AO_int_xor_write(addr, val) \
+ AO_xor_write((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_xor_write
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_write) \
+ && !defined(AO_HAVE_int_fetch_compare_and_swap_write)
+# define AO_int_fetch_compare_and_swap_write(addr, old, new_val) \
+ (unsigned)AO_fetch_compare_and_swap_write((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_fetch_compare_and_swap_write
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_write) \
+ && !defined(AO_HAVE_int_compare_and_swap_write)
+# define AO_int_compare_and_swap_write(addr, old, new_val) \
+ AO_compare_and_swap_write((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_compare_and_swap_write
+#endif
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Inclusion of this file signifies that AO_t is in fact int. */
+/* Hence any AO_... operation can also serve as AO_int_... operation. */
+
+#if defined(AO_HAVE_load_read) && !defined(AO_HAVE_int_load_read)
+# define AO_int_load_read(addr) \
+ (unsigned)AO_load_read((const volatile AO_t *)(addr))
+# define AO_HAVE_int_load_read
+#endif
+
+#if defined(AO_HAVE_store_read) && !defined(AO_HAVE_int_store_read)
+# define AO_int_store_read(addr, val) \
+ AO_store_read((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_store_read
+#endif
+
+#if defined(AO_HAVE_fetch_and_add_read) \
+ && !defined(AO_HAVE_int_fetch_and_add_read)
+# define AO_int_fetch_and_add_read(addr, incr) \
+ (unsigned)AO_fetch_and_add_read((volatile AO_t *)(addr), \
+ (AO_t)(incr))
+# define AO_HAVE_int_fetch_and_add_read
+#endif
+
+#if defined(AO_HAVE_fetch_and_add1_read) \
+ && !defined(AO_HAVE_int_fetch_and_add1_read)
+# define AO_int_fetch_and_add1_read(addr) \
+ (unsigned)AO_fetch_and_add1_read((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_add1_read
+#endif
+
+#if defined(AO_HAVE_fetch_and_sub1_read) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_read)
+# define AO_int_fetch_and_sub1_read(addr) \
+ (unsigned)AO_fetch_and_sub1_read((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_sub1_read
+#endif
+
+#if defined(AO_HAVE_and_read) && !defined(AO_HAVE_int_and_read)
+# define AO_int_and_read(addr, val) \
+ AO_and_read((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_and_read
+#endif
+
+#if defined(AO_HAVE_or_read) && !defined(AO_HAVE_int_or_read)
+# define AO_int_or_read(addr, val) \
+ AO_or_read((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_or_read
+#endif
+
+#if defined(AO_HAVE_xor_read) && !defined(AO_HAVE_int_xor_read)
+# define AO_int_xor_read(addr, val) \
+ AO_xor_read((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_xor_read
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_read) \
+ && !defined(AO_HAVE_int_fetch_compare_and_swap_read)
+# define AO_int_fetch_compare_and_swap_read(addr, old, new_val) \
+ (unsigned)AO_fetch_compare_and_swap_read((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_fetch_compare_and_swap_read
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_read) \
+ && !defined(AO_HAVE_int_compare_and_swap_read)
+# define AO_int_compare_and_swap_read(addr, old, new_val) \
+ AO_compare_and_swap_read((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_compare_and_swap_read
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.template b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.template
new file mode 100644
index 0000000000..620faeabc8
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.template
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Inclusion of this file signifies that AO_t is in fact int. */
+/* Hence any AO_... operation can also serve as AO_int_... operation. */
+
+#if defined(AO_HAVE_load_XBAR) && !defined(AO_HAVE_int_load_XBAR)
+# define AO_int_load_XBAR(addr) \
+ (unsigned)AO_load_XBAR((const volatile AO_t *)(addr))
+# define AO_HAVE_int_load_XBAR
+#endif
+
+#if defined(AO_HAVE_store_XBAR) && !defined(AO_HAVE_int_store_XBAR)
+# define AO_int_store_XBAR(addr, val) \
+ AO_store_XBAR((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_store_XBAR
+#endif
+
+#if defined(AO_HAVE_fetch_and_add_XBAR) \
+ && !defined(AO_HAVE_int_fetch_and_add_XBAR)
+# define AO_int_fetch_and_add_XBAR(addr, incr) \
+ (unsigned)AO_fetch_and_add_XBAR((volatile AO_t *)(addr), \
+ (AO_t)(incr))
+# define AO_HAVE_int_fetch_and_add_XBAR
+#endif
+
+#if defined(AO_HAVE_fetch_and_add1_XBAR) \
+ && !defined(AO_HAVE_int_fetch_and_add1_XBAR)
+# define AO_int_fetch_and_add1_XBAR(addr) \
+ (unsigned)AO_fetch_and_add1_XBAR((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_add1_XBAR
+#endif
+
+#if defined(AO_HAVE_fetch_and_sub1_XBAR) \
+ && !defined(AO_HAVE_int_fetch_and_sub1_XBAR)
+# define AO_int_fetch_and_sub1_XBAR(addr) \
+ (unsigned)AO_fetch_and_sub1_XBAR((volatile AO_t *)(addr))
+# define AO_HAVE_int_fetch_and_sub1_XBAR
+#endif
+
+#if defined(AO_HAVE_and_XBAR) && !defined(AO_HAVE_int_and_XBAR)
+# define AO_int_and_XBAR(addr, val) \
+ AO_and_XBAR((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_and_XBAR
+#endif
+
+#if defined(AO_HAVE_or_XBAR) && !defined(AO_HAVE_int_or_XBAR)
+# define AO_int_or_XBAR(addr, val) \
+ AO_or_XBAR((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_or_XBAR
+#endif
+
+#if defined(AO_HAVE_xor_XBAR) && !defined(AO_HAVE_int_xor_XBAR)
+# define AO_int_xor_XBAR(addr, val) \
+ AO_xor_XBAR((volatile AO_t *)(addr), (AO_t)(val))
+# define AO_HAVE_int_xor_XBAR
+#endif
+
+#if defined(AO_HAVE_fetch_compare_and_swap_XBAR) \
+ && !defined(AO_HAVE_int_fetch_compare_and_swap_XBAR)
+# define AO_int_fetch_compare_and_swap_XBAR(addr, old, new_val) \
+ (unsigned)AO_fetch_compare_and_swap_XBAR((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_fetch_compare_and_swap_XBAR
+#endif
+
+#if defined(AO_HAVE_compare_and_swap_XBAR) \
+ && !defined(AO_HAVE_int_compare_and_swap_XBAR)
+# define AO_int_compare_and_swap_XBAR(addr, old, new_val) \
+ AO_compare_and_swap_XBAR((volatile AO_t *)(addr), \
+ (AO_t)(old), (AO_t)(new_val))
+# define AO_HAVE_int_compare_and_swap_XBAR
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/armcc/arm_v6.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/armcc/arm_v6.h
new file mode 100644
index 0000000000..3c3beb463c
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/armcc/arm_v6.h
@@ -0,0 +1,264 @@
+/*
+ * Copyright (c) 2007 by NEC LE-IT: All rights reserved.
+ * A transcription of ARMv6 atomic operations for the ARM Realview Toolchain.
+ * This code works with armcc from RVDS 3.1
+ * This is based on work in gcc/arm.h by
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#include "../test_and_set_t_is_ao_t.h" /* Probably suboptimal */
+
+#if __TARGET_ARCH_ARM < 6
+# if !defined(CPPCHECK)
+# error Do not use with ARM instruction sets lower than v6
+# endif
+#else
+
+#define AO_ACCESS_CHECK_ALIGNED
+#define AO_ACCESS_short_CHECK_ALIGNED
+#define AO_ACCESS_int_CHECK_ALIGNED
+#include "../all_atomic_only_load.h"
+
+#include "../standard_ao_double_t.h"
+
+/* NEC LE-IT: ARMv6 is the first architecture providing support for simple LL/SC
+ * A data memory barrier must be raised via CP15 command (see documentation).
+ *
+ * ARMv7 is compatible to ARMv6 but has a simpler command for issuing a
+ * memory barrier (DMB). Raising it via CP15 should still work as told me by the
+ * support engineers. If it turns out to be much quicker than we should implement
+ * custom code for ARMv7 using the asm { dmb } command.
+ *
+ * If only a single processor is used, we can define AO_UNIPROCESSOR
+ * and do not need to access CP15 for ensuring a DMB at all.
+*/
+
+AO_INLINE void
+AO_nop_full(void)
+{
+# ifndef AO_UNIPROCESSOR
+ unsigned int dest=0;
+ /* Issue a data memory barrier (keeps ordering of memory transactions */
+ /* before and after this operation). */
+ __asm {
+ mcr p15,0,dest,c7,c10,5
+ };
+# else
+ AO_compiler_barrier();
+# endif
+}
+#define AO_HAVE_nop_full
+
+/* NEC LE-IT: atomic "store" - according to ARM documentation this is
+ * the only safe way to set variables also used in LL/SC environment.
+ * A direct write won't be recognized by the LL/SC construct in other CPUs.
+ *
+ * HB: Based on subsequent discussion, I think it would be OK to use an
+ * ordinary store here if we knew that interrupt handlers always cleared
+ * the reservation. They should, but there is some doubt that this is
+ * currently always the case for e.g. Linux.
+*/
+AO_INLINE void AO_store(volatile AO_t *addr, AO_t value)
+{
+ unsigned long tmp;
+
+retry:
+__asm {
+ ldrex tmp, [addr]
+ strex tmp, value, [addr]
+ teq tmp, #0
+ bne retry
+ };
+}
+#define AO_HAVE_store
+
+/* NEC LE-IT: replace the SWAP as recommended by ARM:
+
+ "Applies to: ARM11 Cores
+ Though the SWP instruction will still work with ARM V6 cores, it is recommended
+ to use the new V6 synchronization instructions. The SWP instruction produces
+ locked read and write accesses which are atomic, i.e. another operation cannot
+ be done between these locked accesses which ties up external bus (AHB,AXI)
+ bandwidth and can increase worst case interrupt latencies. LDREX,STREX are
+ more flexible, other instructions can be done between the LDREX and STREX accesses.
+ "
+*/
+#ifndef AO_PREFER_GENERALIZED
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set(volatile AO_TS_t *addr) {
+ AO_TS_VAL_t oldval;
+ unsigned long tmp;
+ unsigned long one = 1;
+retry:
+__asm {
+ ldrex oldval, [addr]
+ strex tmp, one, [addr]
+ teq tmp, #0
+ bne retry
+ }
+
+ return oldval;
+}
+#define AO_HAVE_test_and_set
+
+AO_INLINE AO_t
+AO_fetch_and_add(volatile AO_t *p, AO_t incr)
+{
+ unsigned long tmp,tmp2;
+ AO_t result;
+
+retry:
+__asm {
+ ldrex result, [p]
+ add tmp, incr, result
+ strex tmp2, tmp, [p]
+ teq tmp2, #0
+ bne retry
+ }
+
+ return result;
+}
+#define AO_HAVE_fetch_and_add
+
+AO_INLINE AO_t
+AO_fetch_and_add1(volatile AO_t *p)
+{
+ unsigned long tmp,tmp2;
+ AO_t result;
+
+retry:
+__asm {
+ ldrex result, [p]
+ add tmp, result, #1
+ strex tmp2, tmp, [p]
+ teq tmp2, #0
+ bne retry
+ }
+
+ return result;
+}
+#define AO_HAVE_fetch_and_add1
+
+AO_INLINE AO_t
+AO_fetch_and_sub1(volatile AO_t *p)
+{
+ unsigned long tmp,tmp2;
+ AO_t result;
+
+retry:
+__asm {
+ ldrex result, [p]
+ sub tmp, result, #1
+ strex tmp2, tmp, [p]
+ teq tmp2, #0
+ bne retry
+ }
+
+ return result;
+}
+#define AO_HAVE_fetch_and_sub1
+#endif /* !AO_PREFER_GENERALIZED */
+
+#ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ /* Returns nonzero if the comparison succeeded. */
+ AO_INLINE int
+ AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+ {
+ AO_t result, tmp;
+
+ retry:
+ __asm__ {
+ mov result, #2
+ ldrex tmp, [addr]
+ teq tmp, old_val
+# ifdef __thumb__
+ it eq
+# endif
+ strexeq result, new_val, [addr]
+ teq result, #1
+ beq retry
+ }
+ return !(result&2);
+ }
+# define AO_HAVE_compare_and_swap
+#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+{
+ AO_t fetched_val, tmp;
+
+retry:
+__asm__ {
+ mov tmp, #2
+ ldrex fetched_val, [addr]
+ teq fetched_val, old_val
+# ifdef __thumb__
+ it eq
+# endif
+ strexeq tmp, new_val, [addr]
+ teq tmp, #1
+ beq retry
+ }
+ return fetched_val;
+}
+#define AO_HAVE_fetch_compare_and_swap
+
+/* helper functions for the Realview compiler: LDREXD is not usable
+ * with inline assembler, so use the "embedded" assembler as
+ * suggested by ARM Dev. support (June 2008). */
+__asm inline double_ptr_storage AO_load_ex(const volatile AO_double_t *addr) {
+ LDREXD r0,r1,[r0]
+}
+
+__asm inline int AO_store_ex(AO_t val1, AO_t val2, volatile AO_double_t *addr) {
+ STREXD r3,r0,r1,[r2]
+ MOV r0,r3
+}
+
+AO_INLINE AO_double_t
+AO_double_load(const volatile AO_double_t *addr)
+{
+ AO_double_t result;
+
+ result.AO_whole = AO_load_ex(addr);
+ return result;
+}
+#define AO_HAVE_double_load
+
+AO_INLINE int
+AO_compare_double_and_swap_double(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+{
+ double_ptr_storage old_val =
+ ((double_ptr_storage)old_val2 << 32) | old_val1;
+ double_ptr_storage tmp;
+ int result;
+
+ while(1) {
+ tmp = AO_load_ex(addr);
+ if(tmp != old_val) return 0;
+ result = AO_store_ex(new_val1, new_val2, addr);
+ if(!result) return 1;
+ }
+}
+#define AO_HAVE_compare_double_and_swap_double
+
+#endif /* __TARGET_ARCH_ARM >= 6 */
+
+#define AO_T_IS_INT
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/emul_cas.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/emul_cas.h
new file mode 100644
index 0000000000..c322a5b2e2
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/emul_cas.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * Ensure, if at all possible, that AO_compare_and_swap_full() is
+ * available. The emulation should be brute-force signal-safe, even
+ * though it actually blocks.
+ * Including this file will generate an error if AO_compare_and_swap_full()
+ * cannot be made available.
+ * This will be included from platform-specific atomic_ops files
+ * if appropriate, and if AO_REQUIRE_CAS is defined. It should not be
+ * included directly, especially since it affects the implementation
+ * of other atomic update primitives.
+ * The implementation assumes that only AO_store_XXX and AO_test_and_set_XXX
+ * variants are defined, and that AO_test_and_set_XXX is not used to
+ * operate on compare_and_swap locations.
+ */
+
+#ifndef AO_ATOMIC_OPS_H
+# error This file should not be included directly.
+#endif
+
+#ifndef AO_HAVE_double_t
+# include "standard_ao_double_t.h"
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+AO_API AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val);
+
+AO_API int
+AO_compare_double_and_swap_double_emulation(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2);
+
+AO_API void AO_store_full_emulation(volatile AO_t *addr, AO_t val);
+
+#ifndef AO_HAVE_fetch_compare_and_swap_full
+# define AO_fetch_compare_and_swap_full(addr, old, newval) \
+ AO_fetch_compare_and_swap_emulation(addr, old, newval)
+# define AO_HAVE_fetch_compare_and_swap_full
+#endif
+
+#ifndef AO_HAVE_compare_double_and_swap_double_full
+# define AO_compare_double_and_swap_double_full(addr, old1, old2, \
+ newval1, newval2) \
+ AO_compare_double_and_swap_double_emulation(addr, old1, old2, \
+ newval1, newval2)
+# define AO_HAVE_compare_double_and_swap_double_full
+#endif
+
+#undef AO_store
+#undef AO_HAVE_store
+#undef AO_store_write
+#undef AO_HAVE_store_write
+#undef AO_store_release
+#undef AO_HAVE_store_release
+#undef AO_store_full
+#undef AO_HAVE_store_full
+#define AO_store_full(addr, val) AO_store_full_emulation(addr, val)
+#define AO_HAVE_store_full
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/aarch64.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/aarch64.h
new file mode 100644
index 0000000000..7ba6bb7bce
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/aarch64.h
@@ -0,0 +1,282 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
+ * Copyright (c) 2013-2017 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* As of clang-5.0 (and gcc-5.4), __atomic_thread_fence is always */
+/* translated to DMB (which is inefficient for AO_nop_write). */
+/* TODO: Update it for newer Clang and GCC releases. */
+#if !defined(AO_PREFER_BUILTIN_ATOMICS) && !defined(AO_THREAD_SANITIZER) \
+ && !defined(AO_UNIPROCESSOR)
+ AO_INLINE void
+ AO_nop_write(void)
+ {
+ __asm__ __volatile__("dmb ishst" : : : "memory");
+ }
+# define AO_HAVE_nop_write
+#endif
+
+/* There were some bugs in the older clang releases (related to */
+/* optimization of functions dealing with __int128 values, supposedly), */
+/* so even asm-based implementation did not work correctly. */
+#if !defined(__clang__) || AO_CLANG_PREREQ(3, 9)
+
+# include "../standard_ao_double_t.h"
+
+/* As of gcc-5.4, all built-in load/store and CAS atomics for double */
+/* word require -latomic, are not lock-free and cause test_stack */
+/* failure, so the asm-based implementation is used for now. */
+/* TODO: Update it for newer GCC releases. */
+#if (!defined(__ILP32__) && !defined(__clang__)) \
+ || defined(AO_AARCH64_ASM_LOAD_STORE_CAS)
+
+# ifndef AO_PREFER_GENERALIZED
+ AO_INLINE AO_double_t
+ AO_double_load(const volatile AO_double_t *addr)
+ {
+ AO_double_t result;
+ int status;
+
+ /* Note that STXP cannot be discarded because LD[A]XP is not */
+ /* single-copy atomic (unlike LDREXD for 32-bit ARM). */
+ do {
+ __asm__ __volatile__("//AO_double_load\n"
+# ifdef __ILP32__
+ " ldxp %w0, %w1, %3\n"
+ " stxp %w2, %w0, %w1, %3"
+# else
+ " ldxp %0, %1, %3\n"
+ " stxp %w2, %0, %1, %3"
+# endif
+ : "=&r" (result.AO_val1), "=&r" (result.AO_val2), "=&r" (status)
+ : "Q" (*addr));
+ } while (AO_EXPECT_FALSE(status));
+ return result;
+ }
+# define AO_HAVE_double_load
+
+ AO_INLINE AO_double_t
+ AO_double_load_acquire(const volatile AO_double_t *addr)
+ {
+ AO_double_t result;
+ int status;
+
+ do {
+ __asm__ __volatile__("//AO_double_load_acquire\n"
+# ifdef __ILP32__
+ " ldaxp %w0, %w1, %3\n"
+ " stxp %w2, %w0, %w1, %3"
+# else
+ " ldaxp %0, %1, %3\n"
+ " stxp %w2, %0, %1, %3"
+# endif
+ : "=&r" (result.AO_val1), "=&r" (result.AO_val2), "=&r" (status)
+ : "Q" (*addr));
+ } while (AO_EXPECT_FALSE(status));
+ return result;
+ }
+# define AO_HAVE_double_load_acquire
+
+ AO_INLINE void
+ AO_double_store(volatile AO_double_t *addr, AO_double_t value)
+ {
+ AO_double_t old_val;
+ int status;
+
+ do {
+ __asm__ __volatile__("//AO_double_store\n"
+# ifdef __ILP32__
+ " ldxp %w0, %w1, %3\n"
+ " stxp %w2, %w4, %w5, %3"
+# else
+ " ldxp %0, %1, %3\n"
+ " stxp %w2, %4, %5, %3"
+# endif
+ : "=&r" (old_val.AO_val1), "=&r" (old_val.AO_val2), "=&r" (status),
+ "=Q" (*addr)
+ : "r" (value.AO_val1), "r" (value.AO_val2));
+ /* Compared to the arm.h implementation, the 'cc' (flags) are */
+ /* not clobbered because A64 has no concept of conditional */
+ /* execution. */
+ } while (AO_EXPECT_FALSE(status));
+ }
+# define AO_HAVE_double_store
+
+ AO_INLINE void
+ AO_double_store_release(volatile AO_double_t *addr, AO_double_t value)
+ {
+ AO_double_t old_val;
+ int status;
+
+ do {
+ __asm__ __volatile__("//AO_double_store_release\n"
+# ifdef __ILP32__
+ " ldxp %w0, %w1, %3\n"
+ " stlxp %w2, %w4, %w5, %3"
+# else
+ " ldxp %0, %1, %3\n"
+ " stlxp %w2, %4, %5, %3"
+# endif
+ : "=&r" (old_val.AO_val1), "=&r" (old_val.AO_val2), "=&r" (status),
+ "=Q" (*addr)
+ : "r" (value.AO_val1), "r" (value.AO_val2));
+ } while (AO_EXPECT_FALSE(status));
+ }
+# define AO_HAVE_double_store_release
+# endif /* !AO_PREFER_GENERALIZED */
+
+ AO_INLINE int
+ AO_double_compare_and_swap(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ AO_double_t tmp;
+ int result = 1;
+
+ do {
+ __asm__ __volatile__("//AO_double_compare_and_swap\n"
+# ifdef __ILP32__
+ " ldxp %w0, %w1, %2\n"
+# else
+ " ldxp %0, %1, %2\n"
+# endif
+ : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2)
+ : "Q" (*addr));
+ if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2)
+ break;
+ __asm__ __volatile__(
+# ifdef __ILP32__
+ " stxp %w0, %w2, %w3, %1\n"
+# else
+ " stxp %w0, %2, %3, %1\n"
+# endif
+ : "=&r" (result), "=Q" (*addr)
+ : "r" (new_val.AO_val1), "r" (new_val.AO_val2));
+ } while (AO_EXPECT_FALSE(result));
+ return !result;
+ }
+# define AO_HAVE_double_compare_and_swap
+
+ AO_INLINE int
+ AO_double_compare_and_swap_acquire(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ AO_double_t tmp;
+ int result = 1;
+
+ do {
+ __asm__ __volatile__("//AO_double_compare_and_swap_acquire\n"
+# ifdef __ILP32__
+ " ldaxp %w0, %w1, %2\n"
+# else
+ " ldaxp %0, %1, %2\n"
+# endif
+ : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2)
+ : "Q" (*addr));
+ if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2)
+ break;
+ __asm__ __volatile__(
+# ifdef __ILP32__
+ " stxp %w0, %w2, %w3, %1\n"
+# else
+ " stxp %w0, %2, %3, %1\n"
+# endif
+ : "=&r" (result), "=Q" (*addr)
+ : "r" (new_val.AO_val1), "r" (new_val.AO_val2));
+ } while (AO_EXPECT_FALSE(result));
+ return !result;
+ }
+# define AO_HAVE_double_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_double_compare_and_swap_release(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ AO_double_t tmp;
+ int result = 1;
+
+ do {
+ __asm__ __volatile__("//AO_double_compare_and_swap_release\n"
+# ifdef __ILP32__
+ " ldxp %w0, %w1, %2\n"
+# else
+ " ldxp %0, %1, %2\n"
+# endif
+ : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2)
+ : "Q" (*addr));
+ if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2)
+ break;
+ __asm__ __volatile__(
+# ifdef __ILP32__
+ " stlxp %w0, %w2, %w3, %1\n"
+# else
+ " stlxp %w0, %2, %3, %1\n"
+# endif
+ : "=&r" (result), "=Q" (*addr)
+ : "r" (new_val.AO_val1), "r" (new_val.AO_val2));
+ } while (AO_EXPECT_FALSE(result));
+ return !result;
+ }
+# define AO_HAVE_double_compare_and_swap_release
+
+ AO_INLINE int
+ AO_double_compare_and_swap_full(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ AO_double_t tmp;
+ int result = 1;
+
+ do {
+ __asm__ __volatile__("//AO_double_compare_and_swap_full\n"
+# ifdef __ILP32__
+ " ldaxp %w0, %w1, %2\n"
+# else
+ " ldaxp %0, %1, %2\n"
+# endif
+ : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2)
+ : "Q" (*addr));
+ if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2)
+ break;
+ __asm__ __volatile__(
+# ifdef __ILP32__
+ " stlxp %w0, %w2, %w3, %1\n"
+# else
+ " stlxp %w0, %2, %3, %1\n"
+# endif
+ : "=&r" (result), "=Q" (*addr)
+ : "r" (new_val.AO_val1), "r" (new_val.AO_val2));
+ } while (AO_EXPECT_FALSE(result));
+ return !result;
+ }
+# define AO_HAVE_double_compare_and_swap_full
+
+#endif /* !__ILP32__ && !__clang__ || AO_AARCH64_ASM_LOAD_STORE_CAS */
+
+/* As of clang-5.0 and gcc-8.1, __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 */
+/* macro is still missing (while the double-word CAS is available). */
+# ifndef __ILP32__
+# define AO_GCC_HAVE_double_SYNC_CAS
+# endif
+
+#endif /* !__clang__ || AO_CLANG_PREREQ(3, 9) */
+
+#if (defined(__clang__) && !AO_CLANG_PREREQ(3, 8)) || defined(__APPLE_CC__)
+ /* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n macros are missing. */
+# define AO_GCC_FORCE_HAVE_CAS
+#endif
+
+#include "generic.h"
+
+#undef AO_GCC_FORCE_HAVE_CAS
+#undef AO_GCC_HAVE_double_SYNC_CAS
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/alpha.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/alpha.h
new file mode 100644
index 0000000000..59c669e0bb
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/alpha.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#include "../loadstore/atomic_load.h"
+#include "../loadstore/atomic_store.h"
+
+#include "../test_and_set_t_is_ao_t.h"
+
+#define AO_NO_DD_ORDERING
+ /* Data dependence does not imply read ordering. */
+
+AO_INLINE void
+AO_nop_full(void)
+{
+ __asm__ __volatile__("mb" : : : "memory");
+}
+#define AO_HAVE_nop_full
+
+AO_INLINE void
+AO_nop_write(void)
+{
+ __asm__ __volatile__("wmb" : : : "memory");
+}
+#define AO_HAVE_nop_write
+
+/* mb should be used for AO_nop_read(). That's the default. */
+
+/* TODO: implement AO_fetch_and_add explicitly. */
+
+/* We believe that ldq_l ... stq_c does not imply any memory barrier. */
+AO_INLINE int
+AO_compare_and_swap(volatile AO_t *addr,
+ AO_t old, AO_t new_val)
+{
+ unsigned long was_equal;
+ unsigned long temp;
+
+ __asm__ __volatile__(
+ "1: ldq_l %0,%1\n"
+ " cmpeq %0,%4,%2\n"
+ " mov %3,%0\n"
+ " beq %2,2f\n"
+ " stq_c %0,%1\n"
+ " beq %0,1b\n"
+ "2:\n"
+ : "=&r" (temp), "+m" (*addr), "=&r" (was_equal)
+ : "r" (new_val), "Ir" (old)
+ :"memory");
+ return (int)was_equal;
+}
+#define AO_HAVE_compare_and_swap
+
+/* TODO: implement AO_fetch_compare_and_swap */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/arm.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/arm.h
new file mode 100644
index 0000000000..e02aad17cb
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/arm.h
@@ -0,0 +1,742 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
+ * Copyright (c) 2008-2017 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#if (AO_GNUC_PREREQ(4, 8) || AO_CLANG_PREREQ(3, 5)) \
+ && !defined(AO_DISABLE_GCC_ATOMICS)
+ /* Probably, it could be enabled even for earlier gcc/clang versions. */
+# define AO_GCC_ATOMIC_TEST_AND_SET
+#endif
+
+#ifdef __native_client__
+ /* Mask instruction should immediately precede access instruction. */
+# define AO_MASK_PTR(reg) " bical " reg ", " reg ", #0xc0000000\n"
+# define AO_BR_ALIGN " .align 4\n"
+#else
+# define AO_MASK_PTR(reg) /* empty */
+# define AO_BR_ALIGN /* empty */
+#endif
+
+#if defined(__thumb__) && !defined(__thumb2__)
+ /* Thumb One mode does not have ARM "mcr", "swp" and some load/store */
+ /* instructions, so we temporarily switch to ARM mode and go back */
+ /* afterwards (clobbering "r3" register). */
+# define AO_THUMB_GO_ARM \
+ " adr r3, 4f\n" \
+ " bx r3\n" \
+ " .align\n" \
+ " .arm\n" \
+ AO_BR_ALIGN \
+ "4:\n"
+# define AO_THUMB_RESTORE_MODE \
+ " adr r3, 5f + 1\n" \
+ " bx r3\n" \
+ " .thumb\n" \
+ AO_BR_ALIGN \
+ "5:\n"
+# define AO_THUMB_SWITCH_CLOBBERS "r3",
+#else
+# define AO_THUMB_GO_ARM /* empty */
+# define AO_THUMB_RESTORE_MODE /* empty */
+# define AO_THUMB_SWITCH_CLOBBERS /* empty */
+#endif /* !__thumb__ */
+
+/* NEC LE-IT: gcc has no way to easily check the arm architecture */
+/* but it defines only one (or several) of __ARM_ARCH_x__ to be true. */
+#if !defined(__ARM_ARCH_2__) && !defined(__ARM_ARCH_3__) \
+ && !defined(__ARM_ARCH_3M__) && !defined(__ARM_ARCH_4__) \
+ && !defined(__ARM_ARCH_4T__) \
+ && ((!defined(__ARM_ARCH_5__) && !defined(__ARM_ARCH_5E__) \
+ && !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) \
+ && !defined(__ARM_ARCH_5TEJ__) && !defined(__ARM_ARCH_6M__)) \
+ || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
+ || defined(__ARM_ARCH_8A__))
+# define AO_ARM_HAVE_LDREX
+# if !defined(__ARM_ARCH_6__) && !defined(__ARM_ARCH_6J__) \
+ && !defined(__ARM_ARCH_6T2__)
+ /* LDREXB/STREXB and LDREXH/STREXH are present in ARMv6K/Z+. */
+# define AO_ARM_HAVE_LDREXBH
+# endif
+# if !defined(__ARM_ARCH_6__) && !defined(__ARM_ARCH_6J__) \
+ && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6Z__) \
+ && !defined(__ARM_ARCH_6ZT2__)
+# if !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6KZ__) \
+ && !defined(__ARM_ARCH_6ZK__)
+ /* DMB is present in ARMv6M and ARMv7+. */
+# define AO_ARM_HAVE_DMB
+# endif
+# if (!defined(__thumb__) \
+ || (defined(__thumb2__) && !defined(__ARM_ARCH_7__) \
+ && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__))) \
+ && (!defined(__clang__) || AO_CLANG_PREREQ(3, 3))
+ /* LDREXD/STREXD present in ARMv6K/M+ (see gas/config/tc-arm.c). */
+ /* In the Thumb mode, this works only starting from ARMv7 (except */
+ /* for the base and 'M' models). Clang3.2 (and earlier) does not */
+ /* allocate register pairs for LDREXD/STREXD properly (besides, */
+ /* Clang3.1 does not support "%H<r>" operand specification). */
+# define AO_ARM_HAVE_LDREXD
+# endif /* !thumb || ARMv7A || ARMv7R+ */
+# endif /* ARMv7+ */
+#endif /* ARMv6+ */
+
+#if !defined(__ARM_ARCH_2__) && !defined(__ARM_ARCH_6M__) \
+ && !defined(__ARM_ARCH_8A__) && !defined(__thumb2__)
+# define AO_ARM_HAVE_SWP
+ /* Note: ARMv6M is excluded due to no ARM mode support. */
+ /* Also, SWP is obsoleted for ARMv8+. */
+#endif /* !__thumb2__ */
+
+#if !defined(AO_UNIPROCESSOR) && defined(AO_ARM_HAVE_DMB) \
+ && !defined(AO_PREFER_BUILTIN_ATOMICS)
+ AO_INLINE void
+ AO_nop_write(void)
+ {
+ /* AO_THUMB_GO_ARM is empty. */
+ /* This will target the system domain and thus be overly */
+ /* conservative as the CPUs (even in case of big.LITTLE SoC) will */
+ /* occupy the inner shareable domain. */
+ /* The plain variant (dmb st) is theoretically slower, and should */
+ /* not be needed. That said, with limited experimentation, a CPU */
+ /* implementation for which it actually matters has not been found */
+ /* yet, though they should already exist. */
+ /* Anyway, note that the "st" and "ishst" barriers are actually */
+ /* quite weak and, as the libatomic_ops documentation states, */
+ /* usually not what you really want. */
+ __asm__ __volatile__("dmb ishst" : : : "memory");
+ }
+# define AO_HAVE_nop_write
+#endif /* AO_ARM_HAVE_DMB */
+
+#ifndef AO_GCC_ATOMIC_TEST_AND_SET
+
+#ifdef AO_UNIPROCESSOR
+ /* If only a single processor (core) is used, AO_UNIPROCESSOR could */
+ /* be defined by the client to avoid unnecessary memory barrier. */
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ AO_compiler_barrier();
+ }
+# define AO_HAVE_nop_full
+
+#elif defined(AO_ARM_HAVE_DMB)
+ /* ARMv7 is compatible to ARMv6 but has a simpler command for issuing */
+ /* a memory barrier (DMB). Raising it via CP15 should still work */
+ /* (but slightly less efficient because it requires the use of */
+ /* a general-purpose register). */
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ /* AO_THUMB_GO_ARM is empty. */
+ __asm__ __volatile__("dmb" : : : "memory");
+ }
+# define AO_HAVE_nop_full
+
+#elif defined(AO_ARM_HAVE_LDREX)
+ /* ARMv6 is the first architecture providing support for a simple */
+ /* LL/SC. A data memory barrier must be raised via CP15 command. */
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ unsigned dest = 0;
+
+ /* Issue a data memory barrier (keeps ordering of memory */
+ /* transactions before and after this operation). */
+ __asm__ __volatile__("@AO_nop_full\n"
+ AO_THUMB_GO_ARM
+ " mcr p15,0,%0,c7,c10,5\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r"(dest)
+ : /* empty */
+ : AO_THUMB_SWITCH_CLOBBERS "memory");
+ }
+# define AO_HAVE_nop_full
+
+#else
+ /* AO_nop_full() is emulated using AO_test_and_set_full(). */
+#endif /* !AO_UNIPROCESSOR && !AO_ARM_HAVE_LDREX */
+
+#endif /* !AO_GCC_ATOMIC_TEST_AND_SET */
+
+#ifdef AO_ARM_HAVE_LDREX
+
+ /* "ARM Architecture Reference Manual" (chapter A3.5.3) says that the */
+ /* single-copy atomic processor accesses are all byte accesses, all */
+ /* halfword accesses to halfword-aligned locations, all word accesses */
+ /* to word-aligned locations. */
+ /* There is only a single concern related to AO store operations: */
+ /* a direct write (by STR[B/H] instruction) will not be recognized */
+ /* by the LL/SC construct on the same CPU (i.e., according to ARM */
+ /* documentation, e.g., see CortexA8 TRM reference, point 8.5, */
+ /* atomic "store" (using LDREX/STREX[B/H]) is the only safe way to */
+ /* set variables also used in LL/SC environment). */
+ /* This is only a problem if interrupt handlers do not clear the */
+ /* reservation (by CLREX instruction or a dummy STREX one), as they */
+ /* almost certainly should (e.g., see restore_user_regs defined in */
+ /* arch/arm/kernel/entry-header.S of Linux. Nonetheless, there is */
+ /* a doubt this was properly implemented in some ancient OS releases. */
+# ifdef AO_BROKEN_TASKSWITCH_CLREX
+
+# define AO_SKIPATOMIC_store
+# define AO_SKIPATOMIC_store_release
+# define AO_SKIPATOMIC_char_store
+# define AO_SKIPATOMIC_char_store_release
+# define AO_SKIPATOMIC_short_store
+# define AO_SKIPATOMIC_short_store_release
+# define AO_SKIPATOMIC_int_store
+# define AO_SKIPATOMIC_int_store_release
+
+# ifndef AO_PREFER_BUILTIN_ATOMICS
+
+ AO_INLINE void AO_store(volatile AO_t *addr, AO_t value)
+ {
+ int flag;
+
+ __asm__ __volatile__("@AO_store\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%2")
+ " ldrex %0, [%2]\n"
+ AO_MASK_PTR("%2")
+ " strex %0, %3, [%2]\n"
+ " teq %0, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r" (flag), "+m" (*addr)
+ : "r" (addr), "r" (value)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ }
+# define AO_HAVE_store
+
+# ifdef AO_ARM_HAVE_LDREXBH
+ AO_INLINE void AO_char_store(volatile unsigned char *addr,
+ unsigned char value)
+ {
+ int flag;
+
+ __asm__ __volatile__("@AO_char_store\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%2")
+ " ldrexb %0, [%2]\n"
+ AO_MASK_PTR("%2")
+ " strexb %0, %3, [%2]\n"
+ " teq %0, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r" (flag), "+m" (*addr)
+ : "r" (addr), "r" (value)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ }
+# define AO_HAVE_char_store
+
+ AO_INLINE void AO_short_store(volatile unsigned short *addr,
+ unsigned short value)
+ {
+ int flag;
+
+ __asm__ __volatile__("@AO_short_store\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%2")
+ " ldrexh %0, [%2]\n"
+ AO_MASK_PTR("%2")
+ " strexh %0, %3, [%2]\n"
+ " teq %0, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r" (flag), "+m" (*addr)
+ : "r" (addr), "r" (value)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ }
+# define AO_HAVE_short_store
+# endif /* AO_ARM_HAVE_LDREXBH */
+
+# endif /* !AO_PREFER_BUILTIN_ATOMICS */
+
+# elif !defined(AO_GCC_ATOMIC_TEST_AND_SET)
+# include "../loadstore/atomic_store.h"
+ /* AO_int_store is defined in ao_t_is_int.h. */
+# endif /* !AO_BROKEN_TASKSWITCH_CLREX */
+
+#endif /* AO_ARM_HAVE_LDREX */
+
+#ifndef AO_GCC_ATOMIC_TEST_AND_SET
+
+# include "../test_and_set_t_is_ao_t.h" /* Probably suboptimal */
+
+#ifdef AO_ARM_HAVE_LDREX
+
+ /* AO_t/char/short/int load is simple reading. */
+ /* Unaligned accesses are not guaranteed to be atomic. */
+# define AO_ACCESS_CHECK_ALIGNED
+# define AO_ACCESS_short_CHECK_ALIGNED
+# define AO_ACCESS_int_CHECK_ALIGNED
+# include "../all_atomic_only_load.h"
+
+# ifndef AO_HAVE_char_store
+# include "../loadstore/char_atomic_store.h"
+# include "../loadstore/short_atomic_store.h"
+# endif
+
+/* NEC LE-IT: replace the SWAP as recommended by ARM:
+ "Applies to: ARM11 Cores
+ Though the SWP instruction will still work with ARM V6 cores, it is
+ recommended to use the new V6 synchronization instructions. The SWP
+ instruction produces 'locked' read and write accesses which are atomic,
+ i.e. another operation cannot be done between these locked accesses which
+ ties up external bus (AHB, AXI) bandwidth and can increase worst case
+ interrupt latencies. LDREX, STREX are more flexible, other instructions
+ can be done between the LDREX and STREX accesses."
+*/
+#ifndef AO_PREFER_GENERALIZED
+#if !defined(AO_FORCE_USE_SWP) || !defined(AO_ARM_HAVE_SWP)
+ /* But, on the other hand, there could be a considerable performance */
+ /* degradation in case of a race. Eg., test_atomic.c executing */
+ /* test_and_set test on a dual-core ARMv7 processor using LDREX/STREX */
+ /* showed around 35 times lower performance than that using SWP. */
+ /* To force use of SWP instruction, use -D AO_FORCE_USE_SWP option */
+ /* (the latter is ignored if SWP instruction is unsupported). */
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set(volatile AO_TS_t *addr)
+ {
+ AO_TS_VAL_t oldval;
+ int flag;
+
+ __asm__ __volatile__("@AO_test_and_set\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%3")
+ " ldrex %0, [%3]\n"
+ AO_MASK_PTR("%3")
+ " strex %1, %4, [%3]\n"
+ " teq %1, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r"(oldval), "=&r"(flag), "+m"(*addr)
+ : "r"(addr), "r"(1)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ return oldval;
+ }
+# define AO_HAVE_test_and_set
+#endif /* !AO_FORCE_USE_SWP */
+
+AO_INLINE AO_t
+AO_fetch_and_add(volatile AO_t *p, AO_t incr)
+{
+ AO_t result, tmp;
+ int flag;
+
+ __asm__ __volatile__("@AO_fetch_and_add\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%5")
+ " ldrex %0, [%5]\n" /* get original */
+ " add %2, %0, %4\n" /* sum up in incr */
+ AO_MASK_PTR("%5")
+ " strex %1, %2, [%5]\n" /* store them */
+ " teq %1, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r"(result), "=&r"(flag), "=&r"(tmp), "+m"(*p) /* 0..3 */
+ : "r"(incr), "r"(p) /* 4..5 */
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ return result;
+}
+#define AO_HAVE_fetch_and_add
+
+AO_INLINE AO_t
+AO_fetch_and_add1(volatile AO_t *p)
+{
+ AO_t result, tmp;
+ int flag;
+
+ __asm__ __volatile__("@AO_fetch_and_add1\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%4")
+ " ldrex %0, [%4]\n" /* get original */
+ " add %1, %0, #1\n" /* increment */
+ AO_MASK_PTR("%4")
+ " strex %2, %1, [%4]\n" /* store them */
+ " teq %2, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r"(result), "=&r"(tmp), "=&r"(flag), "+m"(*p)
+ : "r"(p)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ return result;
+}
+#define AO_HAVE_fetch_and_add1
+
+AO_INLINE AO_t
+AO_fetch_and_sub1(volatile AO_t *p)
+{
+ AO_t result, tmp;
+ int flag;
+
+ __asm__ __volatile__("@AO_fetch_and_sub1\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%4")
+ " ldrex %0, [%4]\n" /* get original */
+ " sub %1, %0, #1\n" /* decrement */
+ AO_MASK_PTR("%4")
+ " strex %2, %1, [%4]\n" /* store them */
+ " teq %2, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r"(result), "=&r"(tmp), "=&r"(flag), "+m"(*p)
+ : "r"(p)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ return result;
+}
+#define AO_HAVE_fetch_and_sub1
+
+AO_INLINE void
+AO_and(volatile AO_t *p, AO_t value)
+{
+ AO_t tmp, result;
+
+ __asm__ __volatile__("@AO_and\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%4")
+ " ldrex %0, [%4]\n"
+ " and %1, %0, %3\n"
+ AO_MASK_PTR("%4")
+ " strex %0, %1, [%4]\n"
+ " teq %0, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r" (tmp), "=&r" (result), "+m" (*p)
+ : "r" (value), "r" (p)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+}
+#define AO_HAVE_and
+
+AO_INLINE void
+AO_or(volatile AO_t *p, AO_t value)
+{
+ AO_t tmp, result;
+
+ __asm__ __volatile__("@AO_or\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%4")
+ " ldrex %0, [%4]\n"
+ " orr %1, %0, %3\n"
+ AO_MASK_PTR("%4")
+ " strex %0, %1, [%4]\n"
+ " teq %0, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r" (tmp), "=&r" (result), "+m" (*p)
+ : "r" (value), "r" (p)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+}
+#define AO_HAVE_or
+
+AO_INLINE void
+AO_xor(volatile AO_t *p, AO_t value)
+{
+ AO_t tmp, result;
+
+ __asm__ __volatile__("@AO_xor\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%4")
+ " ldrex %0, [%4]\n"
+ " eor %1, %0, %3\n"
+ AO_MASK_PTR("%4")
+ " strex %0, %1, [%4]\n"
+ " teq %0, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r" (tmp), "=&r" (result), "+m" (*p)
+ : "r" (value), "r" (p)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+}
+#define AO_HAVE_xor
+#endif /* !AO_PREFER_GENERALIZED */
+
+#ifdef AO_ARM_HAVE_LDREXBH
+ AO_INLINE unsigned char
+ AO_char_fetch_and_add(volatile unsigned char *p, unsigned char incr)
+ {
+ unsigned result, tmp;
+ int flag;
+
+ __asm__ __volatile__("@AO_char_fetch_and_add\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%5")
+ " ldrexb %0, [%5]\n"
+ " add %2, %0, %4\n"
+ AO_MASK_PTR("%5")
+ " strexb %1, %2, [%5]\n"
+ " teq %1, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r" (result), "=&r" (flag), "=&r" (tmp), "+m" (*p)
+ : "r" ((unsigned)incr), "r" (p)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ return (unsigned char)result;
+ }
+# define AO_HAVE_char_fetch_and_add
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add(volatile unsigned short *p, unsigned short incr)
+ {
+ unsigned result, tmp;
+ int flag;
+
+ __asm__ __volatile__("@AO_short_fetch_and_add\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: " AO_MASK_PTR("%5")
+ " ldrexh %0, [%5]\n"
+ " add %2, %0, %4\n"
+ AO_MASK_PTR("%5")
+ " strexh %1, %2, [%5]\n"
+ " teq %1, #0\n"
+ " bne 1b\n"
+ AO_THUMB_RESTORE_MODE
+ : "=&r" (result), "=&r" (flag), "=&r" (tmp), "+m" (*p)
+ : "r" ((unsigned)incr), "r" (p)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ return (unsigned short)result;
+ }
+# define AO_HAVE_short_fetch_and_add
+#endif /* AO_ARM_HAVE_LDREXBH */
+
+#ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ /* Returns nonzero if the comparison succeeded. */
+ AO_INLINE int
+ AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+ {
+ AO_t result, tmp;
+
+ __asm__ __volatile__("@AO_compare_and_swap\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: mov %0, #2\n" /* store a flag */
+ AO_MASK_PTR("%3")
+ " ldrex %1, [%3]\n" /* get original */
+ " teq %1, %4\n" /* see if match */
+ AO_MASK_PTR("%3")
+# ifdef __thumb2__
+ /* TODO: Eliminate warning: it blocks containing wide Thumb */
+ /* instructions are deprecated in ARMv8. */
+ " it eq\n"
+# endif
+ " strexeq %0, %5, [%3]\n" /* store new one if matched */
+ " teq %0, #1\n"
+ " beq 1b\n" /* if update failed, repeat */
+ AO_THUMB_RESTORE_MODE
+ : "=&r"(result), "=&r"(tmp), "+m"(*addr)
+ : "r"(addr), "r"(old_val), "r"(new_val)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ return !(result&2); /* if succeeded then return 1 else 0 */
+ }
+# define AO_HAVE_compare_and_swap
+#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+{
+ AO_t fetched_val;
+ int flag;
+
+ __asm__ __volatile__("@AO_fetch_compare_and_swap\n"
+ AO_THUMB_GO_ARM
+ AO_BR_ALIGN
+ "1: mov %0, #2\n" /* store a flag */
+ AO_MASK_PTR("%3")
+ " ldrex %1, [%3]\n" /* get original */
+ " teq %1, %4\n" /* see if match */
+ AO_MASK_PTR("%3")
+# ifdef __thumb2__
+ " it eq\n"
+# endif
+ " strexeq %0, %5, [%3]\n" /* store new one if matched */
+ " teq %0, #1\n"
+ " beq 1b\n" /* if update failed, repeat */
+ AO_THUMB_RESTORE_MODE
+ : "=&r"(flag), "=&r"(fetched_val), "+m"(*addr)
+ : "r"(addr), "r"(old_val), "r"(new_val)
+ : AO_THUMB_SWITCH_CLOBBERS "cc");
+ return fetched_val;
+}
+#define AO_HAVE_fetch_compare_and_swap
+
+#ifdef AO_ARM_HAVE_LDREXD
+# include "../standard_ao_double_t.h"
+
+ /* "ARM Architecture Reference Manual ARMv7-A/R edition" (chapter */
+ /* A3.5.3) says that memory accesses caused by LDREXD and STREXD */
+ /* instructions to doubleword-aligned locations are single-copy */
+ /* atomic; accesses to 64-bit elements by other instructions might */
+ /* not be single-copy atomic as they are executed as a sequence of */
+ /* 32-bit accesses. */
+ AO_INLINE AO_double_t
+ AO_double_load(const volatile AO_double_t *addr)
+ {
+ AO_double_t result;
+
+ /* AO_THUMB_GO_ARM is empty. */
+ __asm__ __volatile__("@AO_double_load\n"
+ AO_MASK_PTR("%1")
+ " ldrexd %0, %H0, [%1]"
+ : "=&r" (result.AO_whole)
+ : "r" (addr)
+ /* : no clobber */);
+ return result;
+ }
+# define AO_HAVE_double_load
+
+ AO_INLINE void
+ AO_double_store(volatile AO_double_t *addr, AO_double_t new_val)
+ {
+ AO_double_t old_val;
+ int status;
+
+ do {
+ /* AO_THUMB_GO_ARM is empty. */
+ __asm__ __volatile__("@AO_double_store\n"
+ AO_MASK_PTR("%3")
+ " ldrexd %0, %H0, [%3]\n"
+ AO_MASK_PTR("%3")
+ " strexd %1, %4, %H4, [%3]"
+ : "=&r" (old_val.AO_whole), "=&r" (status), "+m" (*addr)
+ : "r" (addr), "r" (new_val.AO_whole)
+ : "cc");
+ } while (AO_EXPECT_FALSE(status));
+ }
+# define AO_HAVE_double_store
+
+ AO_INLINE int
+ AO_double_compare_and_swap(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ double_ptr_storage tmp;
+ int result = 1;
+
+ do {
+ /* AO_THUMB_GO_ARM is empty. */
+ __asm__ __volatile__("@AO_double_compare_and_swap\n"
+ AO_MASK_PTR("%1")
+ " ldrexd %0, %H0, [%1]\n" /* get original to r1 & r2 */
+ : "=&r"(tmp)
+ : "r"(addr)
+ /* : no clobber */);
+ if (tmp != old_val.AO_whole)
+ break;
+ __asm__ __volatile__(
+ AO_MASK_PTR("%2")
+ " strexd %0, %3, %H3, [%2]\n" /* store new one if matched */
+ : "=&r"(result), "+m"(*addr)
+ : "r" (addr), "r" (new_val.AO_whole)
+ : "cc");
+ } while (AO_EXPECT_FALSE(result));
+ return !result; /* if succeeded then return 1 else 0 */
+ }
+# define AO_HAVE_double_compare_and_swap
+#endif /* AO_ARM_HAVE_LDREXD */
+
+#else
+/* pre ARMv6 architectures ... */
+
+/* I found a slide set that, if I read it correctly, claims that */
+/* Loads followed by either a Load or Store are ordered, but nothing */
+/* else is. */
+/* It appears that SWP is the only simple memory barrier. */
+#include "../all_aligned_atomic_load_store.h"
+
+/* The code should run correctly on a multi-core ARMv6+ as well. */
+
+#endif /* !AO_ARM_HAVE_LDREX */
+
+#if !defined(AO_HAVE_test_and_set_full) && !defined(AO_HAVE_test_and_set) \
+ && defined (AO_ARM_HAVE_SWP) && (!defined(AO_PREFER_GENERALIZED) \
+ || !defined(AO_HAVE_fetch_compare_and_swap))
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_full(volatile AO_TS_t *addr)
+ {
+ AO_TS_VAL_t oldval;
+ /* SWP on ARM is very similar to XCHG on x86. */
+ /* The first operand is the result, the second the value */
+ /* to be stored. Both registers must be different from addr. */
+ /* Make the address operand an early clobber output so it */
+ /* doesn't overlap with the other operands. The early clobber */
+ /* on oldval is necessary to prevent the compiler allocating */
+ /* them to the same register if they are both unused. */
+
+ __asm__ __volatile__("@AO_test_and_set_full\n"
+ AO_THUMB_GO_ARM
+ AO_MASK_PTR("%3")
+ " swp %0, %2, [%3]\n"
+ /* Ignore GCC "SWP is deprecated for this architecture" */
+ /* warning here (for ARMv6+). */
+ AO_THUMB_RESTORE_MODE
+ : "=&r"(oldval), "=&r"(addr)
+ : "r"(1), "1"(addr)
+ : AO_THUMB_SWITCH_CLOBBERS "memory");
+ return oldval;
+ }
+# define AO_HAVE_test_and_set_full
+#endif /* !AO_HAVE_test_and_set[_full] && AO_ARM_HAVE_SWP */
+
+#define AO_T_IS_INT
+
+#else /* AO_GCC_ATOMIC_TEST_AND_SET */
+
+# if defined(__clang__) && !defined(AO_ARM_HAVE_LDREX)
+ /* As of clang-3.8, it cannot compile __atomic_and/or/xor_fetch */
+ /* library calls yet for pre ARMv6. */
+# define AO_SKIPATOMIC_ANY_and_ANY
+# define AO_SKIPATOMIC_ANY_or_ANY
+# define AO_SKIPATOMIC_ANY_xor_ANY
+# endif
+
+# ifdef AO_ARM_HAVE_LDREXD
+# include "../standard_ao_double_t.h"
+# endif
+# include "generic.h"
+
+#endif /* AO_GCC_ATOMIC_TEST_AND_SET */
+
+#undef AO_ARM_HAVE_DMB
+#undef AO_ARM_HAVE_LDREX
+#undef AO_ARM_HAVE_LDREXBH
+#undef AO_ARM_HAVE_LDREXD
+#undef AO_ARM_HAVE_SWP
+#undef AO_BR_ALIGN
+#undef AO_MASK_PTR
+#undef AO_SKIPATOMIC_ANY_and_ANY
+#undef AO_SKIPATOMIC_ANY_or_ANY
+#undef AO_SKIPATOMIC_ANY_xor_ANY
+#undef AO_SKIPATOMIC_char_store
+#undef AO_SKIPATOMIC_char_store_release
+#undef AO_SKIPATOMIC_int_store
+#undef AO_SKIPATOMIC_int_store_release
+#undef AO_SKIPATOMIC_short_store
+#undef AO_SKIPATOMIC_short_store_release
+#undef AO_SKIPATOMIC_store
+#undef AO_SKIPATOMIC_store_release
+#undef AO_THUMB_GO_ARM
+#undef AO_THUMB_RESTORE_MODE
+#undef AO_THUMB_SWITCH_CLOBBERS
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/avr32.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/avr32.h
new file mode 100644
index 0000000000..b0c52c70ec
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/avr32.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2009 Bradley Smith <brad@brad-smith.co.uk>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 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 "../all_atomic_load_store.h"
+
+#include "../ordered.h" /* There are no multiprocessor implementations. */
+
+#include "../test_and_set_t_is_ao_t.h"
+
+#ifndef AO_PREFER_GENERALIZED
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_full(volatile AO_TS_t *addr)
+ {
+ register long ret;
+
+ __asm__ __volatile__(
+ "xchg %[oldval], %[mem], %[newval]"
+ : [oldval] "=&r"(ret)
+ : [mem] "r"(addr), [newval] "r"(1)
+ : "memory");
+
+ return (AO_TS_VAL_t)ret;
+ }
+# define AO_HAVE_test_and_set_full
+#endif /* !AO_PREFER_GENERALIZED */
+
+AO_INLINE int
+AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val)
+{
+ register long ret;
+
+ __asm__ __volatile__(
+ "1: ssrf 5\n"
+ " ld.w %[res], %[mem]\n"
+ " eor %[res], %[oldval]\n"
+ " brne 2f\n"
+ " stcond %[mem], %[newval]\n"
+ " brne 1b\n"
+ "2:\n"
+ : [res] "=&r"(ret), [mem] "=m"(*addr)
+ : "m"(*addr), [newval] "r"(new_val), [oldval] "r"(old)
+ : "cc", "memory");
+
+ return (int)ret;
+}
+#define AO_HAVE_compare_and_swap_full
+
+/* TODO: implement AO_fetch_compare_and_swap. */
+
+#define AO_T_IS_INT
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/cris.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/cris.h
new file mode 100644
index 0000000000..f31c21eb2b
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/cris.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* FIXME: seems to be untested. */
+
+#include "../all_atomic_load_store.h"
+
+#include "../ordered.h" /* There are no multiprocessor implementations. */
+
+#include "../test_and_set_t_is_ao_t.h"
+
+/*
+ * The architecture apparently supports an "f" flag which is
+ * set on preemption. This essentially gives us load-locked,
+ * store-conditional primitives, though I'm not quite sure how
+ * this would work on a hypothetical multiprocessor. -HB
+ *
+ * For details, see
+ * http://developer.axis.com/doc/hardware/etrax100lx/prog_man/
+ * 1_architectural_description.pdf
+ *
+ * TODO: Presumably many other primitives (notably CAS, including the double-
+ * width versions) could be implemented in this manner, if someone got
+ * around to it.
+ */
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t *addr) {
+ /* Ripped from linuxthreads/sysdeps/cris/pt-machine.h */
+ register unsigned long int ret;
+
+ /* Note the use of a dummy output of *addr to expose the write. The
+ memory barrier is to stop *other* writes being moved past this code. */
+ __asm__ __volatile__("clearf\n"
+ "0:\n\t"
+ "movu.b [%2],%0\n\t"
+ "ax\n\t"
+ "move.b %3,[%2]\n\t"
+ "bwf 0b\n\t"
+ "clearf"
+ : "=&r" (ret), "=m" (*addr)
+ : "r" (addr), "r" ((int) 1), "m" (*addr)
+ : "memory");
+ return ret;
+}
+#define AO_HAVE_test_and_set_full
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/e2k.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/e2k.h
new file mode 100644
index 0000000000..087584b304
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/e2k.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2022 Ivan Maidanski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* As of clang-9, all __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n are missing. */
+#define AO_GCC_FORCE_HAVE_CAS
+
+#include "generic.h"
+
+#undef AO_GCC_FORCE_HAVE_CAS
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.h
new file mode 100644
index 0000000000..268832836a
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.h
@@ -0,0 +1,864 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_char_ARITHM
+
+AO_INLINE unsigned/**/char
+AO_char_fetch_and_add(volatile unsigned/**/char *addr, unsigned/**/char incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_char_fetch_and_add
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_char_and(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_char_and
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_char_or(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_char_or
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_char_xor(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_char_xor
+#endif
+
+#endif /* !AO_NO_char_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_short_ARITHM
+
+AO_INLINE unsigned/**/short
+AO_short_fetch_and_add(volatile unsigned/**/short *addr, unsigned/**/short incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_short_fetch_and_add
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_short_and(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_short_and
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_short_or(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_short_or
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_short_xor(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_short_xor
+#endif
+
+#endif /* !AO_NO_short_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_int_ARITHM
+
+AO_INLINE unsigned
+AO_int_fetch_and_add(volatile unsigned *addr, unsigned incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_int_fetch_and_add
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_int_and(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_int_and
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_int_or(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_int_or
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_int_xor(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_int_xor
+#endif
+
+#endif /* !AO_NO_int_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_ARITHM
+
+AO_INLINE AO_t
+AO_fetch_and_add(volatile AO_t *addr, AO_t incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_fetch_and_add
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_and(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_and
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_or(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_or
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_xor(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_xor
+#endif
+
+#endif /* !AO_NO_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_char_ARITHM
+
+AO_INLINE unsigned/**/char
+AO_char_fetch_and_add_acquire(volatile unsigned/**/char *addr, unsigned/**/char incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_char_fetch_and_add_acquire
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_char_and_acquire(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_char_and_acquire
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_char_or_acquire(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_char_or_acquire
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_char_xor_acquire(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_char_xor_acquire
+#endif
+
+#endif /* !AO_NO_char_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_short_ARITHM
+
+AO_INLINE unsigned/**/short
+AO_short_fetch_and_add_acquire(volatile unsigned/**/short *addr, unsigned/**/short incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_short_fetch_and_add_acquire
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_short_and_acquire(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_short_and_acquire
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_short_or_acquire(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_short_or_acquire
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_short_xor_acquire(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_short_xor_acquire
+#endif
+
+#endif /* !AO_NO_short_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_int_ARITHM
+
+AO_INLINE unsigned
+AO_int_fetch_and_add_acquire(volatile unsigned *addr, unsigned incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_int_fetch_and_add_acquire
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_int_and_acquire(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_int_and_acquire
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_int_or_acquire(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_int_or_acquire
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_int_xor_acquire(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_int_xor_acquire
+#endif
+
+#endif /* !AO_NO_int_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_ARITHM
+
+AO_INLINE AO_t
+AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_fetch_and_add_acquire
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_and_acquire(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_and_acquire
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_or_acquire(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_or_acquire
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_xor_acquire(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_xor_acquire
+#endif
+
+#endif /* !AO_NO_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_char_ARITHM
+
+AO_INLINE unsigned/**/char
+AO_char_fetch_and_add_release(volatile unsigned/**/char *addr, unsigned/**/char incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE);
+}
+#define AO_HAVE_char_fetch_and_add_release
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_char_and_release(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_char_and_release
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_char_or_release(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_char_or_release
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_char_xor_release(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_char_xor_release
+#endif
+
+#endif /* !AO_NO_char_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_short_ARITHM
+
+AO_INLINE unsigned/**/short
+AO_short_fetch_and_add_release(volatile unsigned/**/short *addr, unsigned/**/short incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE);
+}
+#define AO_HAVE_short_fetch_and_add_release
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_short_and_release(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_short_and_release
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_short_or_release(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_short_or_release
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_short_xor_release(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_short_xor_release
+#endif
+
+#endif /* !AO_NO_short_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_int_ARITHM
+
+AO_INLINE unsigned
+AO_int_fetch_and_add_release(volatile unsigned *addr, unsigned incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE);
+}
+#define AO_HAVE_int_fetch_and_add_release
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_int_and_release(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_int_and_release
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_int_or_release(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_int_or_release
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_int_xor_release(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_int_xor_release
+#endif
+
+#endif /* !AO_NO_int_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_ARITHM
+
+AO_INLINE AO_t
+AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE);
+}
+#define AO_HAVE_fetch_and_add_release
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_and_release(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_and_release
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_or_release(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_or_release
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_xor_release(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_xor_release
+#endif
+
+#endif /* !AO_NO_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_char_ARITHM
+
+AO_INLINE unsigned/**/char
+AO_char_fetch_and_add_full(volatile unsigned/**/char *addr, unsigned/**/char incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST);
+}
+#define AO_HAVE_char_fetch_and_add_full
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_char_and_full(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_char_and_full
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_char_or_full(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_char_or_full
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_char_xor_full(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_char_xor_full
+#endif
+
+#endif /* !AO_NO_char_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_short_ARITHM
+
+AO_INLINE unsigned/**/short
+AO_short_fetch_and_add_full(volatile unsigned/**/short *addr, unsigned/**/short incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST);
+}
+#define AO_HAVE_short_fetch_and_add_full
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_short_and_full(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_short_and_full
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_short_or_full(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_short_or_full
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_short_xor_full(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_short_xor_full
+#endif
+
+#endif /* !AO_NO_short_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_int_ARITHM
+
+AO_INLINE unsigned
+AO_int_fetch_and_add_full(volatile unsigned *addr, unsigned incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST);
+}
+#define AO_HAVE_int_fetch_and_add_full
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_int_and_full(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_int_and_full
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_int_or_full(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_int_or_full
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_int_xor_full(volatile unsigned *addr, unsigned value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_int_xor_full
+#endif
+
+#endif /* !AO_NO_int_ARITHM */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_ARITHM
+
+AO_INLINE AO_t
+AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST);
+}
+#define AO_HAVE_fetch_and_add_full
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_and_full(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_and_full
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_or_full(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_or_full
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_xor_full(volatile AO_t *addr, AO_t value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_xor_full
+#endif
+
+#endif /* !AO_NO_ARITHM */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.template b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.template
new file mode 100644
index 0000000000..916d133818
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.template
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef AO_NO_XSIZE_ARITHM
+
+AO_INLINE XCTYPE
+AO_XSIZE_fetch_and_add_XBAR(volatile XCTYPE *addr, XCTYPE incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_XGCCBAR);
+}
+#define AO_HAVE_XSIZE_fetch_and_add_XBAR
+
+#ifndef AO_SKIPATOMIC_ANY_and_ANY
+ AO_INLINE void
+ AO_XSIZE_and_XBAR(volatile XCTYPE *addr, XCTYPE value)
+ {
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_XGCCBAR);
+ }
+# define AO_HAVE_XSIZE_and_XBAR
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_or_ANY
+ AO_INLINE void
+ AO_XSIZE_or_XBAR(volatile XCTYPE *addr, XCTYPE value)
+ {
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_XGCCBAR);
+ }
+# define AO_HAVE_XSIZE_or_XBAR
+#endif
+
+#ifndef AO_SKIPATOMIC_ANY_xor_ANY
+ AO_INLINE void
+ AO_XSIZE_xor_XBAR(volatile XCTYPE *addr, XCTYPE value)
+ {
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_XGCCBAR);
+ }
+# define AO_HAVE_XSIZE_xor_XBAR
+#endif
+
+#endif /* !AO_NO_XSIZE_ARITHM */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.h
new file mode 100644
index 0000000000..fb78a75b87
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.h
@@ -0,0 +1,632 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#if !defined(AO_GCC_HAVE_char_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED)
+
+AO_INLINE unsigned/**/char
+AO_char_load(const volatile unsigned/**/char *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_char_load
+
+AO_INLINE unsigned/**/char
+AO_char_load_acquire(const volatile unsigned/**/char *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_char_load_acquire
+
+/* char_load_read is defined using load and nop_read. */
+/* TODO: Map it to ACQUIRE. We should be strengthening the read and */
+/* write stuff to the more general acquire/release versions. It almost */
+/* never makes a difference and is much less error-prone. */
+
+/* char_load_full is generalized using load and nop_full. */
+/* TODO: Map it to SEQ_CST and clarify the documentation. */
+
+/* TODO: Map load_dd_acquire_read to ACQUIRE. Ideally it should be */
+/* mapped to CONSUME, but the latter is currently broken. */
+
+/* char_store_full definition is omitted similar to load_full reason. */
+
+/* TODO: Map store_write to RELEASE. */
+
+#ifndef AO_SKIPATOMIC_char_store
+ AO_INLINE void
+ AO_char_store(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ __atomic_store_n(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_char_store
+#endif
+
+#ifndef AO_SKIPATOMIC_char_store_release
+ AO_INLINE void
+ AO_char_store_release(volatile unsigned/**/char *addr, unsigned/**/char value)
+ {
+ __atomic_store_n(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_char_store_release
+#endif
+
+#endif /* !AO_GCC_HAVE_char_SYNC_CAS || !AO_PREFER_GENERALIZED */
+
+#ifdef AO_GCC_HAVE_char_SYNC_CAS
+
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_compare_and_swap(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr,
+ &old_val /* p_expected */,
+ new_val /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_char_fetch_compare_and_swap
+
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_compare_and_swap_acquire(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ return old_val;
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_acquire
+
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_compare_and_swap_release(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_release
+
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_compare_and_swap_full(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_full
+
+# ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ AO_INLINE int
+ AO_char_compare_and_swap(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_char_compare_and_swap
+
+ AO_INLINE int
+ AO_char_compare_and_swap_acquire(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_char_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_char_compare_and_swap_release(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_char_compare_and_swap_release
+
+ AO_INLINE int
+ AO_char_compare_and_swap_full(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_char_compare_and_swap_full
+
+# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+#endif /* AO_GCC_HAVE_char_SYNC_CAS */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#if !defined(AO_GCC_HAVE_short_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED)
+
+AO_INLINE unsigned/**/short
+AO_short_load(const volatile unsigned/**/short *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_short_load
+
+AO_INLINE unsigned/**/short
+AO_short_load_acquire(const volatile unsigned/**/short *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_short_load_acquire
+
+/* short_load_read is defined using load and nop_read. */
+/* TODO: Map it to ACQUIRE. We should be strengthening the read and */
+/* write stuff to the more general acquire/release versions. It almost */
+/* never makes a difference and is much less error-prone. */
+
+/* short_load_full is generalized using load and nop_full. */
+/* TODO: Map it to SEQ_CST and clarify the documentation. */
+
+/* TODO: Map load_dd_acquire_read to ACQUIRE. Ideally it should be */
+/* mapped to CONSUME, but the latter is currently broken. */
+
+/* short_store_full definition is omitted similar to load_full reason. */
+
+/* TODO: Map store_write to RELEASE. */
+
+#ifndef AO_SKIPATOMIC_short_store
+ AO_INLINE void
+ AO_short_store(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ __atomic_store_n(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_short_store
+#endif
+
+#ifndef AO_SKIPATOMIC_short_store_release
+ AO_INLINE void
+ AO_short_store_release(volatile unsigned/**/short *addr, unsigned/**/short value)
+ {
+ __atomic_store_n(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_short_store_release
+#endif
+
+#endif /* !AO_GCC_HAVE_short_SYNC_CAS || !AO_PREFER_GENERALIZED */
+
+#ifdef AO_GCC_HAVE_short_SYNC_CAS
+
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_compare_and_swap(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr,
+ &old_val /* p_expected */,
+ new_val /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_short_fetch_compare_and_swap
+
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_compare_and_swap_acquire(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ return old_val;
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_acquire
+
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_compare_and_swap_release(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_release
+
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_compare_and_swap_full(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_full
+
+# ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ AO_INLINE int
+ AO_short_compare_and_swap(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_short_compare_and_swap
+
+ AO_INLINE int
+ AO_short_compare_and_swap_acquire(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_short_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_short_compare_and_swap_release(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_short_compare_and_swap_release
+
+ AO_INLINE int
+ AO_short_compare_and_swap_full(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_short_compare_and_swap_full
+
+# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+#endif /* AO_GCC_HAVE_short_SYNC_CAS */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#if !defined(AO_GCC_HAVE_int_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED)
+
+AO_INLINE unsigned
+AO_int_load(const volatile unsigned *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_int_load
+
+AO_INLINE unsigned
+AO_int_load_acquire(const volatile unsigned *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_int_load_acquire
+
+/* int_load_read is defined using load and nop_read. */
+/* TODO: Map it to ACQUIRE. We should be strengthening the read and */
+/* write stuff to the more general acquire/release versions. It almost */
+/* never makes a difference and is much less error-prone. */
+
+/* int_load_full is generalized using load and nop_full. */
+/* TODO: Map it to SEQ_CST and clarify the documentation. */
+
+/* TODO: Map load_dd_acquire_read to ACQUIRE. Ideally it should be */
+/* mapped to CONSUME, but the latter is currently broken. */
+
+/* int_store_full definition is omitted similar to load_full reason. */
+
+/* TODO: Map store_write to RELEASE. */
+
+#ifndef AO_SKIPATOMIC_int_store
+ AO_INLINE void
+ AO_int_store(volatile unsigned *addr, unsigned value)
+ {
+ __atomic_store_n(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_int_store
+#endif
+
+#ifndef AO_SKIPATOMIC_int_store_release
+ AO_INLINE void
+ AO_int_store_release(volatile unsigned *addr, unsigned value)
+ {
+ __atomic_store_n(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_int_store_release
+#endif
+
+#endif /* !AO_GCC_HAVE_int_SYNC_CAS || !AO_PREFER_GENERALIZED */
+
+#ifdef AO_GCC_HAVE_int_SYNC_CAS
+
+ AO_INLINE unsigned
+ AO_int_fetch_compare_and_swap(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr,
+ &old_val /* p_expected */,
+ new_val /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_int_fetch_compare_and_swap
+
+ AO_INLINE unsigned
+ AO_int_fetch_compare_and_swap_acquire(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ return old_val;
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_acquire
+
+ AO_INLINE unsigned
+ AO_int_fetch_compare_and_swap_release(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_release
+
+ AO_INLINE unsigned
+ AO_int_fetch_compare_and_swap_full(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_full
+
+# ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ AO_INLINE int
+ AO_int_compare_and_swap(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_int_compare_and_swap
+
+ AO_INLINE int
+ AO_int_compare_and_swap_acquire(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_int_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_int_compare_and_swap_release(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_int_compare_and_swap_release
+
+ AO_INLINE int
+ AO_int_compare_and_swap_full(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_int_compare_and_swap_full
+
+# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+#endif /* AO_GCC_HAVE_int_SYNC_CAS */
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#if !defined(AO_GCC_HAVE_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED)
+
+AO_INLINE AO_t
+AO_load(const volatile AO_t *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_load
+
+AO_INLINE AO_t
+AO_load_acquire(const volatile AO_t *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_load_acquire
+
+/* load_read is defined using load and nop_read. */
+/* TODO: Map it to ACQUIRE. We should be strengthening the read and */
+/* write stuff to the more general acquire/release versions. It almost */
+/* never makes a difference and is much less error-prone. */
+
+/* load_full is generalized using load and nop_full. */
+/* TODO: Map it to SEQ_CST and clarify the documentation. */
+
+/* TODO: Map load_dd_acquire_read to ACQUIRE. Ideally it should be */
+/* mapped to CONSUME, but the latter is currently broken. */
+
+/* store_full definition is omitted similar to load_full reason. */
+
+/* TODO: Map store_write to RELEASE. */
+
+#ifndef AO_SKIPATOMIC_store
+ AO_INLINE void
+ AO_store(volatile AO_t *addr, AO_t value)
+ {
+ __atomic_store_n(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_store
+#endif
+
+#ifndef AO_SKIPATOMIC_store_release
+ AO_INLINE void
+ AO_store_release(volatile AO_t *addr, AO_t value)
+ {
+ __atomic_store_n(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_store_release
+#endif
+
+#endif /* !AO_GCC_HAVE_SYNC_CAS || !AO_PREFER_GENERALIZED */
+
+#ifdef AO_GCC_HAVE_SYNC_CAS
+
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr,
+ &old_val /* p_expected */,
+ new_val /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_fetch_compare_and_swap
+
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_acquire(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ return old_val;
+ }
+# define AO_HAVE_fetch_compare_and_swap_acquire
+
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_release(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_fetch_compare_and_swap_release
+
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_full(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_fetch_compare_and_swap_full
+
+# ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ AO_INLINE int
+ AO_compare_and_swap(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_compare_and_swap
+
+ AO_INLINE int
+ AO_compare_and_swap_acquire(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_compare_and_swap_release(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_compare_and_swap_release
+
+ AO_INLINE int
+ AO_compare_and_swap_full(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_compare_and_swap_full
+
+# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+#endif /* AO_GCC_HAVE_SYNC_CAS */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.template b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.template
new file mode 100644
index 0000000000..7c2f738f34
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.template
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#if !defined(AO_GCC_HAVE_XSIZE_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED)
+
+AO_INLINE XCTYPE
+AO_XSIZE_load(const volatile XCTYPE *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_XSIZE_load
+
+AO_INLINE XCTYPE
+AO_XSIZE_load_acquire(const volatile XCTYPE *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_XSIZE_load_acquire
+
+/* XSIZE_load_read is defined using load and nop_read. */
+/* TODO: Map it to ACQUIRE. We should be strengthening the read and */
+/* write stuff to the more general acquire/release versions. It almost */
+/* never makes a difference and is much less error-prone. */
+
+/* XSIZE_load_full is generalized using load and nop_full. */
+/* TODO: Map it to SEQ_CST and clarify the documentation. */
+
+/* TODO: Map load_dd_acquire_read to ACQUIRE. Ideally it should be */
+/* mapped to CONSUME, but the latter is currently broken. */
+
+/* XSIZE_store_full definition is omitted similar to load_full reason. */
+
+/* TODO: Map store_write to RELEASE. */
+
+#ifndef AO_SKIPATOMIC_XSIZE_store
+ AO_INLINE void
+ AO_XSIZE_store(volatile XCTYPE *addr, XCTYPE value)
+ {
+ __atomic_store_n(addr, value, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_XSIZE_store
+#endif
+
+#ifndef AO_SKIPATOMIC_XSIZE_store_release
+ AO_INLINE void
+ AO_XSIZE_store_release(volatile XCTYPE *addr, XCTYPE value)
+ {
+ __atomic_store_n(addr, value, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_XSIZE_store_release
+#endif
+
+#endif /* !AO_GCC_HAVE_XSIZE_SYNC_CAS || !AO_PREFER_GENERALIZED */
+
+#ifdef AO_GCC_HAVE_XSIZE_SYNC_CAS
+
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_compare_and_swap(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr,
+ &old_val /* p_expected */,
+ new_val /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_XSIZE_fetch_compare_and_swap
+
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_compare_and_swap_acquire(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ return old_val;
+ }
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire
+
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_compare_and_swap_release(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_release
+
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_compare_and_swap_full(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_full
+
+# ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_XSIZE_compare_and_swap
+
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_acquire(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_release(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_release
+
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_full(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_full
+
+# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+#endif /* AO_GCC_HAVE_XSIZE_SYNC_CAS */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic.h
new file mode 100644
index 0000000000..032990ca52
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic.h
@@ -0,0 +1,247 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2013-2017 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* The following implementation assumes GCC 4.7 or later. */
+/* For the details, see GNU Manual, chapter 6.52 (Built-in functions */
+/* for memory model aware atomic operations). */
+
+#define AO_GCC_ATOMIC_TEST_AND_SET
+#include "../test_and_set_t_is_char.h"
+
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) \
+ || defined(AO_GCC_FORCE_HAVE_CAS)
+# define AO_GCC_HAVE_char_SYNC_CAS
+#endif
+
+#if (__SIZEOF_SHORT__ == 2 && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)) \
+ || defined(AO_GCC_FORCE_HAVE_CAS)
+# define AO_GCC_HAVE_short_SYNC_CAS
+#endif
+
+#if (__SIZEOF_INT__ == 4 && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)) \
+ || (__SIZEOF_INT__ == 8 && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)) \
+ || defined(AO_GCC_FORCE_HAVE_CAS)
+# define AO_GCC_HAVE_int_SYNC_CAS
+#endif
+
+#if (__SIZEOF_SIZE_T__ == 4 && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)) \
+ || (__SIZEOF_SIZE_T__ == 8 \
+ && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)) \
+ || defined(AO_GCC_FORCE_HAVE_CAS)
+# define AO_GCC_HAVE_SYNC_CAS
+#endif
+
+#undef AO_compiler_barrier
+#define AO_compiler_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)
+
+#ifdef AO_UNIPROCESSOR
+ /* If only a single processor (core) is used, AO_UNIPROCESSOR could */
+ /* be defined by the client to avoid unnecessary memory barrier. */
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ AO_compiler_barrier();
+ }
+# define AO_HAVE_nop_full
+
+#elif defined(AO_THREAD_SANITIZER) && !defined(AO_USE_ATOMIC_THREAD_FENCE)
+ /* Workaround a compiler warning (reported by gcc-11, at least) */
+ /* that atomic_thread_fence is unsupported with thread sanitizer. */
+
+#else
+ AO_INLINE void
+ AO_nop_read(void)
+ {
+ __atomic_thread_fence(__ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_nop_read
+
+# ifndef AO_HAVE_nop_write
+ AO_INLINE void
+ AO_nop_write(void)
+ {
+ __atomic_thread_fence(__ATOMIC_RELEASE);
+ }
+# define AO_HAVE_nop_write
+# endif
+
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ /* __sync_synchronize() could be used instead. */
+ __atomic_thread_fence(__ATOMIC_SEQ_CST);
+ }
+# define AO_HAVE_nop_full
+#endif /* !AO_UNIPROCESSOR && !AO_THREAD_SANITIZER */
+
+#include "generic-small.h"
+
+#ifndef AO_PREFER_GENERALIZED
+# include "generic-arithm.h"
+
+# define AO_CLEAR(addr) __atomic_clear(addr, __ATOMIC_RELEASE)
+# define AO_HAVE_CLEAR
+
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set(volatile AO_TS_t *addr)
+ {
+ return (AO_TS_VAL_t)(__atomic_test_and_set(addr, __ATOMIC_RELAXED)
+ ? AO_TS_SET : AO_TS_CLEAR);
+ }
+# define AO_HAVE_test_and_set
+
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_acquire(volatile AO_TS_t *addr)
+ {
+ return (AO_TS_VAL_t)(__atomic_test_and_set(addr, __ATOMIC_ACQUIRE)
+ ? AO_TS_SET : AO_TS_CLEAR);
+ }
+# define AO_HAVE_test_and_set_acquire
+
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_release(volatile AO_TS_t *addr)
+ {
+ return (AO_TS_VAL_t)(__atomic_test_and_set(addr, __ATOMIC_RELEASE)
+ ? AO_TS_SET : AO_TS_CLEAR);
+ }
+# define AO_HAVE_test_and_set_release
+
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_full(volatile AO_TS_t *addr)
+ {
+ return (AO_TS_VAL_t)(__atomic_test_and_set(addr, __ATOMIC_SEQ_CST)
+ ? AO_TS_SET : AO_TS_CLEAR);
+ }
+# define AO_HAVE_test_and_set_full
+#endif /* !AO_PREFER_GENERALIZED */
+
+#ifdef AO_HAVE_DOUBLE_PTR_STORAGE
+
+# if ((__SIZEOF_SIZE_T__ == 4 \
+ && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)) \
+ || (__SIZEOF_SIZE_T__ == 8 /* half of AO_double_t */ \
+ && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16))) \
+ && !defined(AO_SKIPATOMIC_double_compare_and_swap_ANY)
+# define AO_GCC_HAVE_double_SYNC_CAS
+# endif
+
+# if !defined(AO_GCC_HAVE_double_SYNC_CAS) || !defined(AO_PREFER_GENERALIZED)
+
+# if !defined(AO_HAVE_double_load) && !defined(AO_SKIPATOMIC_double_load)
+ AO_INLINE AO_double_t
+ AO_double_load(const volatile AO_double_t *addr)
+ {
+ AO_double_t result;
+
+ result.AO_whole = __atomic_load_n(&addr->AO_whole, __ATOMIC_RELAXED);
+ return result;
+ }
+# define AO_HAVE_double_load
+# endif
+
+# if !defined(AO_HAVE_double_load_acquire) \
+ && !defined(AO_SKIPATOMIC_double_load_acquire)
+ AO_INLINE AO_double_t
+ AO_double_load_acquire(const volatile AO_double_t *addr)
+ {
+ AO_double_t result;
+
+ result.AO_whole = __atomic_load_n(&addr->AO_whole, __ATOMIC_ACQUIRE);
+ return result;
+ }
+# define AO_HAVE_double_load_acquire
+# endif
+
+# if !defined(AO_HAVE_double_store) && !defined(AO_SKIPATOMIC_double_store)
+ AO_INLINE void
+ AO_double_store(volatile AO_double_t *addr, AO_double_t value)
+ {
+ __atomic_store_n(&addr->AO_whole, value.AO_whole, __ATOMIC_RELAXED);
+ }
+# define AO_HAVE_double_store
+# endif
+
+# if !defined(AO_HAVE_double_store_release) \
+ && !defined(AO_SKIPATOMIC_double_store_release)
+ AO_INLINE void
+ AO_double_store_release(volatile AO_double_t *addr, AO_double_t value)
+ {
+ __atomic_store_n(&addr->AO_whole, value.AO_whole, __ATOMIC_RELEASE);
+ }
+# define AO_HAVE_double_store_release
+# endif
+
+#endif /* !AO_GCC_HAVE_double_SYNC_CAS || !AO_PREFER_GENERALIZED */
+
+#endif /* AO_HAVE_DOUBLE_PTR_STORAGE */
+
+#ifdef AO_GCC_HAVE_double_SYNC_CAS
+# ifndef AO_HAVE_double_compare_and_swap
+ AO_INLINE int
+ AO_double_compare_and_swap(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(&addr->AO_whole,
+ &old_val.AO_whole /* p_expected */,
+ new_val.AO_whole /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_double_compare_and_swap
+# endif
+
+# ifndef AO_HAVE_double_compare_and_swap_acquire
+ AO_INLINE int
+ AO_double_compare_and_swap_acquire(volatile AO_double_t *addr,
+ AO_double_t old_val,
+ AO_double_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(&addr->AO_whole,
+ &old_val.AO_whole, new_val.AO_whole, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_double_compare_and_swap_acquire
+# endif
+
+# ifndef AO_HAVE_double_compare_and_swap_release
+ AO_INLINE int
+ AO_double_compare_and_swap_release(volatile AO_double_t *addr,
+ AO_double_t old_val,
+ AO_double_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(&addr->AO_whole,
+ &old_val.AO_whole, new_val.AO_whole, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_double_compare_and_swap_release
+# endif
+
+# ifndef AO_HAVE_double_compare_and_swap_full
+ AO_INLINE int
+ AO_double_compare_and_swap_full(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(&addr->AO_whole,
+ &old_val.AO_whole, new_val.AO_whole, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_double_compare_and_swap_full
+# endif
+#endif /* AO_GCC_HAVE_double_SYNC_CAS */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/hexagon.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/hexagon.h
new file mode 100644
index 0000000000..cffffe81bf
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/hexagon.h
@@ -0,0 +1,140 @@
+/*
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#if AO_CLANG_PREREQ(3, 9) && !defined(AO_DISABLE_GCC_ATOMICS)
+ /* Probably, it could be enabled for earlier clang versions as well. */
+
+ /* As of clang-3.9, __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n are missing. */
+# define AO_GCC_FORCE_HAVE_CAS
+
+# define AO_GCC_HAVE_double_SYNC_CAS
+# include "../standard_ao_double_t.h"
+
+# include "generic.h"
+
+#else /* AO_DISABLE_GCC_ATOMICS */
+
+#include "../all_aligned_atomic_load_store.h"
+
+#include "../test_and_set_t_is_ao_t.h"
+
+/* There's also "isync" and "barrier"; however, for all current CPU */
+/* versions, "syncht" should suffice. Likewise, it seems that the */
+/* auto-defined versions of *_acquire, *_release or *_full suffice for */
+/* all current ISA implementations. */
+AO_INLINE void
+AO_nop_full(void)
+{
+ __asm__ __volatile__("syncht" : : : "memory");
+}
+#define AO_HAVE_nop_full
+
+/* The Hexagon has load-locked, store-conditional primitives, and so */
+/* resulting code is very nearly identical to that of PowerPC. */
+
+#ifndef AO_PREFER_GENERALIZED
+AO_INLINE AO_t
+AO_fetch_and_add(volatile AO_t *addr, AO_t incr)
+{
+ AO_t oldval;
+ AO_t newval;
+ __asm__ __volatile__(
+ "1:\n"
+ " %0 = memw_locked(%3);\n" /* load and reserve */
+ " %1 = add (%0,%4);\n" /* increment */
+ " memw_locked(%3,p1) = %1;\n" /* store conditional */
+ " if (!p1) jump 1b;\n" /* retry if lost reservation */
+ : "=&r"(oldval), "=&r"(newval), "+m"(*addr)
+ : "r"(addr), "r"(incr)
+ : "memory", "p1");
+ return oldval;
+}
+#define AO_HAVE_fetch_and_add
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set(volatile AO_TS_t *addr)
+{
+ int oldval;
+ int locked_value = 1;
+
+ __asm__ __volatile__(
+ "1:\n"
+ " %0 = memw_locked(%2);\n" /* load and reserve */
+ " {\n"
+ " p2 = cmp.eq(%0,#0);\n" /* if load is not zero, */
+ " if (!p2.new) jump:nt 2f;\n" /* we are done */
+ " }\n"
+ " memw_locked(%2,p1) = %3;\n" /* else store conditional */
+ " if (!p1) jump 1b;\n" /* retry if lost reservation */
+ "2:\n" /* oldval is zero if we set */
+ : "=&r"(oldval), "+m"(*addr)
+ : "r"(addr), "r"(locked_value)
+ : "memory", "p1", "p2");
+ return (AO_TS_VAL_t)oldval;
+}
+#define AO_HAVE_test_and_set
+#endif /* !AO_PREFER_GENERALIZED */
+
+#ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ AO_INLINE int
+ AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val)
+ {
+ AO_t __oldval;
+ int result = 0;
+ __asm__ __volatile__(
+ "1:\n"
+ " %0 = memw_locked(%3);\n" /* load and reserve */
+ " {\n"
+ " p2 = cmp.eq(%0,%4);\n" /* if load is not equal to */
+ " if (!p2.new) jump:nt 2f;\n" /* old, fail */
+ " }\n"
+ " memw_locked(%3,p1) = %5;\n" /* else store conditional */
+ " if (!p1) jump 1b;\n" /* retry if lost reservation */
+ " %1 = #1\n" /* success, result = 1 */
+ "2:\n"
+ : "=&r" (__oldval), "+r" (result), "+m"(*addr)
+ : "r" (addr), "r" (old), "r" (new_val)
+ : "p1", "p2", "memory"
+ );
+ return result;
+ }
+# define AO_HAVE_compare_and_swap
+#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+{
+ AO_t __oldval;
+
+ __asm__ __volatile__(
+ "1:\n"
+ " %0 = memw_locked(%2);\n" /* load and reserve */
+ " {\n"
+ " p2 = cmp.eq(%0,%3);\n" /* if load is not equal to */
+ " if (!p2.new) jump:nt 2f;\n" /* old_val, fail */
+ " }\n"
+ " memw_locked(%2,p1) = %4;\n" /* else store conditional */
+ " if (!p1) jump 1b;\n" /* retry if lost reservation */
+ "2:\n"
+ : "=&r" (__oldval), "+m"(*addr)
+ : "r" (addr), "r" (old_val), "r" (new_val)
+ : "p1", "p2", "memory"
+ );
+ return __oldval;
+}
+#define AO_HAVE_fetch_compare_and_swap
+
+#define AO_T_IS_INT
+
+#endif /* AO_DISABLE_GCC_ATOMICS */
+
+#undef AO_GCC_FORCE_HAVE_CAS
+#undef AO_GCC_HAVE_double_SYNC_CAS
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/hppa.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/hppa.h
new file mode 100644
index 0000000000..2d0c491c3b
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/hppa.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 "../all_atomic_load_store.h"
+
+/* Some architecture set descriptions include special "ordered" memory */
+/* operations. As far as we can tell, no existing processors actually */
+/* require those. Nor does it appear likely that future processors */
+/* will. */
+#include "../ordered.h"
+
+/* GCC will not guarantee the alignment we need, use four lock words */
+/* and select the correctly aligned datum. See the glibc 2.3.2 */
+/* linuxthread port for the original implementation. */
+struct AO_pa_clearable_loc {
+ int data[4];
+};
+
+#undef AO_TS_INITIALIZER
+#define AO_TS_t struct AO_pa_clearable_loc
+#define AO_TS_INITIALIZER { { 1, 1, 1, 1 } }
+/* Switch meaning of set and clear, since we only have an atomic clear */
+/* instruction. */
+typedef enum {AO_PA_TS_set = 0, AO_PA_TS_clear = 1} AO_PA_TS_val;
+#define AO_TS_VAL_t AO_PA_TS_val
+#define AO_TS_CLEAR AO_PA_TS_clear
+#define AO_TS_SET AO_PA_TS_set
+
+/* The hppa only has one atomic read and modify memory operation, */
+/* load and clear, so hppa spinlocks must use zero to signify that */
+/* someone is holding the lock. The address used for the ldcw */
+/* semaphore must be 16-byte aligned. */
+#define AO_ldcw(a, ret) \
+ __asm__ __volatile__("ldcw 0(%2), %0" \
+ : "=r" (ret), "=m" (*(a)) : "r" (a))
+
+/* Because malloc only guarantees 8-byte alignment for malloc'd data, */
+/* and GCC only guarantees 8-byte alignment for stack locals, we can't */
+/* be assured of 16-byte alignment for atomic lock data even if we */
+/* specify "__attribute ((aligned(16)))" in the type declaration. So, */
+/* we use a struct containing an array of four ints for the atomic lock */
+/* type and dynamically select the 16-byte aligned int from the array */
+/* for the semaphore. */
+#define AO_PA_LDCW_ALIGNMENT 16
+#define AO_ldcw_align(addr) \
+ ((volatile unsigned *)(((unsigned long)(addr) \
+ + (AO_PA_LDCW_ALIGNMENT - 1)) \
+ & ~(AO_PA_LDCW_ALIGNMENT - 1)))
+
+/* Works on PA 1.1 and PA 2.0 systems */
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t * addr)
+{
+ volatile unsigned int ret;
+ volatile unsigned *a = AO_ldcw_align(addr);
+
+ AO_ldcw(a, ret);
+ return (AO_TS_VAL_t)ret;
+}
+#define AO_HAVE_test_and_set_full
+
+AO_INLINE void
+AO_pa_clear(volatile AO_TS_t * addr)
+{
+ volatile unsigned *a = AO_ldcw_align(addr);
+
+ AO_compiler_barrier();
+ *a = 1;
+}
+#define AO_CLEAR(addr) AO_pa_clear(addr)
+#define AO_HAVE_CLEAR
+
+#undef AO_PA_LDCW_ALIGNMENT
+#undef AO_ldcw
+#undef AO_ldcw_align
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/ia64.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/ia64.h
new file mode 100644
index 0000000000..98627d53bd
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/ia64.h
@@ -0,0 +1,287 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 "../all_atomic_load_store.h"
+
+#include "../all_acquire_release_volatile.h"
+
+#include "../test_and_set_t_is_char.h"
+
+#ifdef _ILP32
+ /* 32-bit HP/UX code. */
+ /* This requires pointer "swizzling". Pointers need to be expanded */
+ /* to 64 bits using the addp4 instruction before use. This makes it */
+ /* hard to share code, but we try anyway. */
+# define AO_LEN "4"
+ /* We assume that addr always appears in argument position 1 in asm */
+ /* code. If it is clobbered due to swizzling, we also need it in */
+ /* second position. Any later arguments are referenced symbolically, */
+ /* so that we don't have to worry about their position. This requires*/
+ /* gcc 3.1, but you shouldn't be using anything older than that on */
+ /* IA64 anyway. */
+ /* The AO_MASK macro is a workaround for the fact that HP/UX gcc */
+ /* appears to otherwise store 64-bit pointers in ar.ccv, i.e. it */
+ /* doesn't appear to clear high bits in a pointer value we pass into */
+ /* assembly code, even if it is supposedly of type AO_t. */
+# define AO_IN_ADDR "1"(addr)
+# define AO_OUT_ADDR , "=r"(addr)
+# define AO_SWIZZLE "addp4 %1=0,%1;;\n"
+# define AO_MASK(ptr) __asm__ __volatile__("zxt4 %1=%1": "=r"(ptr) : "0"(ptr))
+#else
+# define AO_LEN "8"
+# define AO_IN_ADDR "r"(addr)
+# define AO_OUT_ADDR
+# define AO_SWIZZLE
+# define AO_MASK(ptr) /* empty */
+#endif /* !_ILP32 */
+
+AO_INLINE void
+AO_nop_full(void)
+{
+ __asm__ __volatile__("mf" : : : "memory");
+}
+#define AO_HAVE_nop_full
+
+#ifndef AO_PREFER_GENERALIZED
+AO_INLINE AO_t
+AO_fetch_and_add1_acquire (volatile AO_t *addr)
+{
+ AO_t result;
+
+ __asm__ __volatile__ (AO_SWIZZLE
+ "fetchadd" AO_LEN ".acq %0=[%1],1":
+ "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory");
+ return result;
+}
+#define AO_HAVE_fetch_and_add1_acquire
+
+AO_INLINE AO_t
+AO_fetch_and_add1_release (volatile AO_t *addr)
+{
+ AO_t result;
+
+ __asm__ __volatile__ (AO_SWIZZLE
+ "fetchadd" AO_LEN ".rel %0=[%1],1":
+ "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory");
+ return result;
+}
+#define AO_HAVE_fetch_and_add1_release
+
+AO_INLINE AO_t
+AO_fetch_and_sub1_acquire (volatile AO_t *addr)
+{
+ AO_t result;
+
+ __asm__ __volatile__ (AO_SWIZZLE
+ "fetchadd" AO_LEN ".acq %0=[%1],-1":
+ "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory");
+ return result;
+}
+#define AO_HAVE_fetch_and_sub1_acquire
+
+AO_INLINE AO_t
+AO_fetch_and_sub1_release (volatile AO_t *addr)
+{
+ AO_t result;
+
+ __asm__ __volatile__ (AO_SWIZZLE
+ "fetchadd" AO_LEN ".rel %0=[%1],-1":
+ "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory");
+ return result;
+}
+#define AO_HAVE_fetch_and_sub1_release
+#endif /* !AO_PREFER_GENERALIZED */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val)
+{
+ AO_t fetched_val;
+ AO_MASK(old);
+ __asm__ __volatile__(AO_SWIZZLE
+ "mov ar.ccv=%[old] ;; cmpxchg" AO_LEN
+ ".acq %0=[%1],%[new_val],ar.ccv"
+ : "=r"(fetched_val) AO_OUT_ADDR
+ : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"(old)
+ : "memory");
+ return fetched_val;
+}
+#define AO_HAVE_fetch_compare_and_swap_acquire
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val)
+{
+ AO_t fetched_val;
+ AO_MASK(old);
+ __asm__ __volatile__(AO_SWIZZLE
+ "mov ar.ccv=%[old] ;; cmpxchg" AO_LEN
+ ".rel %0=[%1],%[new_val],ar.ccv"
+ : "=r"(fetched_val) AO_OUT_ADDR
+ : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"(old)
+ : "memory");
+ return fetched_val;
+}
+#define AO_HAVE_fetch_compare_and_swap_release
+
+AO_INLINE unsigned char
+AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr,
+ unsigned char old, unsigned char new_val)
+{
+ unsigned char fetched_val;
+ __asm__ __volatile__(AO_SWIZZLE
+ "mov ar.ccv=%[old] ;; cmpxchg1.acq %0=[%1],%[new_val],ar.ccv"
+ : "=r"(fetched_val) AO_OUT_ADDR
+ : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old)
+ : "memory");
+ return fetched_val;
+}
+#define AO_HAVE_char_fetch_compare_and_swap_acquire
+
+AO_INLINE unsigned char
+AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr,
+ unsigned char old, unsigned char new_val)
+{
+ unsigned char fetched_val;
+ __asm__ __volatile__(AO_SWIZZLE
+ "mov ar.ccv=%[old] ;; cmpxchg1.rel %0=[%1],%[new_val],ar.ccv"
+ : "=r"(fetched_val) AO_OUT_ADDR
+ : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old)
+ : "memory");
+ return fetched_val;
+}
+#define AO_HAVE_char_fetch_compare_and_swap_release
+
+AO_INLINE unsigned short
+AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr,
+ unsigned short old, unsigned short new_val)
+{
+ unsigned short fetched_val;
+ __asm__ __volatile__(AO_SWIZZLE
+ "mov ar.ccv=%[old] ;; cmpxchg2.acq %0=[%1],%[new_val],ar.ccv"
+ : "=r"(fetched_val) AO_OUT_ADDR
+ : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old)
+ : "memory");
+ return fetched_val;
+}
+#define AO_HAVE_short_fetch_compare_and_swap_acquire
+
+AO_INLINE unsigned short
+AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr,
+ unsigned short old, unsigned short new_val)
+{
+ unsigned short fetched_val;
+ __asm__ __volatile__(AO_SWIZZLE
+ "mov ar.ccv=%[old] ;; cmpxchg2.rel %0=[%1],%[new_val],ar.ccv"
+ : "=r"(fetched_val) AO_OUT_ADDR
+ : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old)
+ : "memory");
+ return fetched_val;
+}
+#define AO_HAVE_short_fetch_compare_and_swap_release
+
+#ifdef _ILP32
+
+# define AO_T_IS_INT
+
+ /* TODO: Add compare_double_and_swap_double for the _ILP32 case. */
+#else
+
+# ifndef AO_PREFER_GENERALIZED
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add1_acquire(volatile unsigned int *addr)
+ {
+ unsigned int result;
+ __asm__ __volatile__("fetchadd4.acq %0=[%1],1"
+ : "=r" (result) : AO_IN_ADDR
+ : "memory");
+ return result;
+ }
+# define AO_HAVE_int_fetch_and_add1_acquire
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add1_release(volatile unsigned int *addr)
+ {
+ unsigned int result;
+ __asm__ __volatile__("fetchadd4.rel %0=[%1],1"
+ : "=r" (result) : AO_IN_ADDR
+ : "memory");
+ return result;
+ }
+# define AO_HAVE_int_fetch_and_add1_release
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_sub1_acquire(volatile unsigned int *addr)
+ {
+ unsigned int result;
+ __asm__ __volatile__("fetchadd4.acq %0=[%1],-1"
+ : "=r" (result) : AO_IN_ADDR
+ : "memory");
+ return result;
+ }
+# define AO_HAVE_int_fetch_and_sub1_acquire
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_sub1_release(volatile unsigned int *addr)
+ {
+ unsigned int result;
+ __asm__ __volatile__("fetchadd4.rel %0=[%1],-1"
+ : "=r" (result) : AO_IN_ADDR
+ : "memory");
+ return result;
+ }
+# define AO_HAVE_int_fetch_and_sub1_release
+# endif /* !AO_PREFER_GENERALIZED */
+
+ AO_INLINE unsigned int
+ AO_int_fetch_compare_and_swap_acquire(volatile unsigned int *addr,
+ unsigned int old, unsigned int new_val)
+ {
+ unsigned int fetched_val;
+ __asm__ __volatile__("mov ar.ccv=%3 ;; cmpxchg4.acq %0=[%1],%2,ar.ccv"
+ : "=r"(fetched_val)
+ : AO_IN_ADDR, "r"(new_val), "r"((AO_t)old)
+ : "memory");
+ return fetched_val;
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_acquire
+
+ AO_INLINE unsigned int
+ AO_int_fetch_compare_and_swap_release(volatile unsigned int *addr,
+ unsigned int old, unsigned int new_val)
+ {
+ unsigned int fetched_val;
+ __asm__ __volatile__("mov ar.ccv=%3 ;; cmpxchg4.rel %0=[%1],%2,ar.ccv"
+ : "=r"(fetched_val)
+ : AO_IN_ADDR, "r"(new_val), "r"((AO_t)old)
+ : "memory");
+ return fetched_val;
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_release
+#endif /* !_ILP32 */
+
+/* TODO: Add compare_and_swap_double as soon as there is widely */
+/* available hardware that implements it. */
+
+#undef AO_IN_ADDR
+#undef AO_LEN
+#undef AO_MASK
+#undef AO_OUT_ADDR
+#undef AO_SWIZZLE
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/m68k.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/m68k.h
new file mode 100644
index 0000000000..27e62f6db8
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/m68k.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* The cas instruction causes an emulation trap for the */
+/* 060 with a misaligned pointer, so let's avoid this. */
+#undef AO_t
+typedef unsigned long AO_t __attribute__((__aligned__(4)));
+
+/* FIXME. Very incomplete. */
+#include "../all_aligned_atomic_load_store.h"
+
+/* Are there any m68k multiprocessors still around? */
+/* AFAIK, Alliants were sequentially consistent. */
+#include "../ordered.h"
+
+#include "../test_and_set_t_is_char.h"
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t *addr) {
+ AO_TS_t oldval;
+
+ /* The value at addr is semi-phony. */
+ /* 'tas' sets bit 7 while the return */
+ /* value pretends all bits were set, */
+ /* which at least matches AO_TS_SET. */
+ __asm__ __volatile__(
+ "tas %1; sne %0"
+ : "=d" (oldval), "=m" (*addr)
+ : "m" (*addr)
+ : "memory");
+ /* This cast works due to the above. */
+ return (AO_TS_VAL_t)oldval;
+}
+#define AO_HAVE_test_and_set_full
+
+/* Returns nonzero if the comparison succeeded. */
+AO_INLINE int
+AO_compare_and_swap_full(volatile AO_t *addr,
+ AO_t old, AO_t new_val)
+{
+ char result;
+
+ __asm__ __volatile__(
+ "cas.l %3,%4,%1; seq %0"
+ : "=d" (result), "=m" (*addr)
+ : "m" (*addr), "d" (old), "d" (new_val)
+ : "memory");
+ return -result;
+}
+#define AO_HAVE_compare_and_swap_full
+
+/* TODO: implement AO_fetch_compare_and_swap. */
+
+#define AO_T_IS_INT
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/mips.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/mips.h
new file mode 100644
index 0000000000..94c4e24d81
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/mips.h
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2005,2007 Thiemo Seufer <ths@networkno.de>
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * FIXME: This should probably make finer distinctions. SGI MIPS is
+ * much more strongly ordered, and in fact closer to sequentially
+ * consistent. This is really aimed at modern embedded implementations.
+ */
+
+/* Data dependence does not imply read ordering. */
+#define AO_NO_DD_ORDERING
+
+/* #include "../standard_ao_double_t.h" */
+/* TODO: Implement double-wide operations if available. */
+
+#if (AO_GNUC_PREREQ(4, 9) || AO_CLANG_PREREQ(3, 5)) \
+ && !defined(AO_DISABLE_GCC_ATOMICS)
+ /* Probably, it could be enabled even for earlier gcc/clang versions. */
+
+ /* As of clang-3.6/mips[64], __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n missing. */
+# if defined(__clang__)
+# define AO_GCC_FORCE_HAVE_CAS
+# endif
+
+# include "generic.h"
+
+#else /* AO_DISABLE_GCC_ATOMICS */
+
+# include "../test_and_set_t_is_ao_t.h"
+# include "../all_aligned_atomic_load_store.h"
+
+# if !defined(_ABI64) || _MIPS_SIM != _ABI64
+# define AO_T_IS_INT
+# if __mips_isa_rev >= 6
+ /* Encoding of ll/sc in mips rel6 differs from that of mips2/3. */
+# define AO_MIPS_SET_ISA ""
+# else
+# define AO_MIPS_SET_ISA " .set mips2\n"
+# endif
+# define AO_MIPS_LL_1(args) " ll " args "\n"
+# define AO_MIPS_SC(args) " sc " args "\n"
+# else
+# if __mips_isa_rev >= 6
+# define AO_MIPS_SET_ISA ""
+# else
+# define AO_MIPS_SET_ISA " .set mips3\n"
+# endif
+# define AO_MIPS_LL_1(args) " lld " args "\n"
+# define AO_MIPS_SC(args) " scd " args "\n"
+# endif /* _MIPS_SIM == _ABI64 */
+
+#ifdef AO_ICE9A1_LLSC_WAR
+ /* ICE9 rev A1 chip (used in very few systems) is reported to */
+ /* have a low-frequency bug that causes LL to fail. */
+ /* To workaround, just issue the second 'LL'. */
+# define AO_MIPS_LL(args) AO_MIPS_LL_1(args) AO_MIPS_LL_1(args)
+#else
+# define AO_MIPS_LL(args) AO_MIPS_LL_1(args)
+#endif
+
+AO_INLINE void
+AO_nop_full(void)
+{
+ __asm__ __volatile__(
+ " .set push\n"
+ AO_MIPS_SET_ISA
+ " .set noreorder\n"
+ " .set nomacro\n"
+ " sync\n"
+ " .set pop"
+ : : : "memory");
+}
+#define AO_HAVE_nop_full
+
+#ifndef AO_PREFER_GENERALIZED
+AO_INLINE AO_t
+AO_fetch_and_add(volatile AO_t *addr, AO_t incr)
+{
+ register int result;
+ register int temp;
+
+ __asm__ __volatile__(
+ " .set push\n"
+ AO_MIPS_SET_ISA
+ " .set noreorder\n"
+ " .set nomacro\n"
+ "1: "
+ AO_MIPS_LL("%0, %2")
+ " addu %1, %0, %3\n"
+ AO_MIPS_SC("%1, %2")
+ " beqz %1, 1b\n"
+ " nop\n"
+ " .set pop"
+ : "=&r" (result), "=&r" (temp), "+m" (*addr)
+ : "Ir" (incr)
+ : "memory");
+ return (AO_t)result;
+}
+#define AO_HAVE_fetch_and_add
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set(volatile AO_TS_t *addr)
+{
+ register int oldval;
+ register int temp;
+
+ __asm__ __volatile__(
+ " .set push\n"
+ AO_MIPS_SET_ISA
+ " .set noreorder\n"
+ " .set nomacro\n"
+ "1: "
+ AO_MIPS_LL("%0, %2")
+ " move %1, %3\n"
+ AO_MIPS_SC("%1, %2")
+ " beqz %1, 1b\n"
+ " nop\n"
+ " .set pop"
+ : "=&r" (oldval), "=&r" (temp), "+m" (*addr)
+ : "r" (1)
+ : "memory");
+ return (AO_TS_VAL_t)oldval;
+}
+#define AO_HAVE_test_and_set
+
+ /* TODO: Implement AO_and/or/xor primitives directly. */
+#endif /* !AO_PREFER_GENERALIZED */
+
+#ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ AO_INLINE int
+ AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val)
+ {
+ register int was_equal = 0;
+ register int temp;
+
+ __asm__ __volatile__(
+ " .set push\n"
+ AO_MIPS_SET_ISA
+ " .set noreorder\n"
+ " .set nomacro\n"
+ "1: "
+ AO_MIPS_LL("%0, %1")
+ " bne %0, %4, 2f\n"
+ " move %0, %3\n"
+ AO_MIPS_SC("%0, %1")
+ " .set pop\n"
+ " beqz %0, 1b\n"
+ " li %2, 1\n"
+ "2:"
+ : "=&r" (temp), "+m" (*addr), "+r" (was_equal)
+ : "r" (new_val), "r" (old)
+ : "memory");
+ return was_equal;
+ }
+# define AO_HAVE_compare_and_swap
+#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val)
+{
+ register int fetched_val;
+ register int temp;
+
+ __asm__ __volatile__(
+ " .set push\n"
+ AO_MIPS_SET_ISA
+ " .set noreorder\n"
+ " .set nomacro\n"
+ "1: "
+ AO_MIPS_LL("%0, %2")
+ " bne %0, %4, 2f\n"
+ " move %1, %3\n"
+ AO_MIPS_SC("%1, %2")
+ " beqz %1, 1b\n"
+ " nop\n"
+ " .set pop\n"
+ "2:"
+ : "=&r" (fetched_val), "=&r" (temp), "+m" (*addr)
+ : "r" (new_val), "Jr" (old)
+ : "memory");
+ return (AO_t)fetched_val;
+}
+#define AO_HAVE_fetch_compare_and_swap
+
+#endif /* AO_DISABLE_GCC_ATOMICS */
+
+/* CAS primitives with acquire, release and full semantics are */
+/* generated automatically (and AO_int_... primitives are */
+/* defined properly after the first generalization pass). */
+
+#undef AO_GCC_FORCE_HAVE_CAS
+#undef AO_MIPS_LL
+#undef AO_MIPS_LL_1
+#undef AO_MIPS_SC
+#undef AO_MIPS_SET_ISA
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/powerpc.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/powerpc.h
new file mode 100644
index 0000000000..509dd800ca
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/powerpc.h
@@ -0,0 +1,348 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* Memory model documented at http://www-106.ibm.com/developerworks/ */
+/* eserver/articles/archguide.html and (clearer) */
+/* http://www-106.ibm.com/developerworks/eserver/articles/powerpc.html. */
+/* There appears to be no implicit ordering between any kind of */
+/* independent memory references. */
+
+/* TODO: Implement double-wide operations if available. */
+
+#if (AO_GNUC_PREREQ(4, 8) || AO_CLANG_PREREQ(3, 8)) \
+ && !defined(AO_DISABLE_GCC_ATOMICS)
+ /* Probably, it could be enabled even for earlier gcc/clang versions. */
+
+ /* TODO: As of clang-3.8.1, it emits lwsync in AO_load_acquire */
+ /* (i.e., the code is less efficient than the one given below). */
+
+# include "generic.h"
+
+#else /* AO_DISABLE_GCC_ATOMICS */
+
+/* Architecture enforces some ordering based on control dependence. */
+/* I don't know if that could help. */
+/* Data-dependent loads are always ordered. */
+/* Based on the above references, eieio is intended for use on */
+/* uncached memory, which we don't support. It does not order loads */
+/* from cached memory. */
+
+#include "../all_aligned_atomic_load_store.h"
+
+#include "../test_and_set_t_is_ao_t.h"
+ /* There seems to be no byte equivalent of lwarx, so this */
+ /* may really be what we want, at least in the 32-bit case. */
+
+AO_INLINE void
+AO_nop_full(void)
+{
+ __asm__ __volatile__("sync" : : : "memory");
+}
+#define AO_HAVE_nop_full
+
+/* lwsync apparently works for everything but a StoreLoad barrier. */
+AO_INLINE void
+AO_lwsync(void)
+{
+#ifdef __NO_LWSYNC__
+ __asm__ __volatile__("sync" : : : "memory");
+#else
+ __asm__ __volatile__("lwsync" : : : "memory");
+#endif
+}
+
+#define AO_nop_write() AO_lwsync()
+#define AO_HAVE_nop_write
+
+#define AO_nop_read() AO_lwsync()
+#define AO_HAVE_nop_read
+
+#if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__)
+ /* ppc64 uses ld not lwz */
+# define AO_PPC_LD "ld"
+# define AO_PPC_LxARX "ldarx"
+# define AO_PPC_CMPx "cmpd"
+# define AO_PPC_STxCXd "stdcx."
+# define AO_PPC_LOAD_CLOBBER "cr0"
+#else
+# define AO_PPC_LD "lwz"
+# define AO_PPC_LxARX "lwarx"
+# define AO_PPC_CMPx "cmpw"
+# define AO_PPC_STxCXd "stwcx."
+# define AO_PPC_LOAD_CLOBBER "cc"
+ /* FIXME: We should get gcc to allocate one of the condition */
+ /* registers. I always got "impossible constraint" when I */
+ /* tried the "y" constraint. */
+# define AO_T_IS_INT
+#endif
+
+#ifdef _AIX
+ /* Labels are not supported on AIX. */
+ /* ppc64 has same size of instructions as 32-bit one. */
+# define AO_PPC_L(label) /* empty */
+# define AO_PPC_BR_A(labelBF, addr) addr
+#else
+# define AO_PPC_L(label) label ": "
+# define AO_PPC_BR_A(labelBF, addr) labelBF
+#endif
+
+/* We explicitly specify load_acquire, since it is important, and can */
+/* be implemented relatively cheaply. It could be implemented */
+/* with an ordinary load followed by a lwsync. But the general wisdom */
+/* seems to be that a data dependent branch followed by an isync is */
+/* cheaper. And the documentation is fairly explicit that this also */
+/* has acquire semantics. */
+AO_INLINE AO_t
+AO_load_acquire(const volatile AO_t *addr)
+{
+ AO_t result;
+
+ __asm__ __volatile__ (
+ AO_PPC_LD "%U1%X1 %0,%1\n"
+ "cmpw %0,%0\n"
+ "bne- " AO_PPC_BR_A("1f", "$+4") "\n"
+ AO_PPC_L("1") "isync\n"
+ : "=r" (result)
+ : "m"(*addr) : "memory", AO_PPC_LOAD_CLOBBER);
+ return result;
+}
+#define AO_HAVE_load_acquire
+
+/* We explicitly specify store_release, since it relies */
+/* on the fact that lwsync is also a LoadStore barrier. */
+AO_INLINE void
+AO_store_release(volatile AO_t *addr, AO_t value)
+{
+ AO_lwsync();
+ *addr = value;
+}
+#define AO_HAVE_store_release
+
+#ifndef AO_PREFER_GENERALIZED
+/* This is similar to the code in the garbage collector. Deleting */
+/* this and having it synthesized from compare_and_swap would probably */
+/* only cost us a load immediate instruction. */
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set(volatile AO_TS_t *addr) {
+ /* TODO: And we should be using smaller objects anyway. */
+ AO_t oldval;
+ AO_t temp = 1; /* locked value */
+
+ __asm__ __volatile__(
+ AO_PPC_L("1") AO_PPC_LxARX " %0,0,%1\n"
+ /* load and reserve */
+ AO_PPC_CMPx "i %0, 0\n" /* if load is */
+ "bne " AO_PPC_BR_A("2f", "$+12") "\n"
+ /* non-zero, return already set */
+ AO_PPC_STxCXd " %2,0,%1\n" /* else store conditional */
+ "bne- " AO_PPC_BR_A("1b", "$-16") "\n"
+ /* retry if lost reservation */
+ AO_PPC_L("2") "\n" /* oldval is zero if we set */
+ : "=&r"(oldval)
+ : "r"(addr), "r"(temp)
+ : "memory", "cr0");
+ return (AO_TS_VAL_t)oldval;
+}
+#define AO_HAVE_test_and_set
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_acquire(volatile AO_TS_t *addr) {
+ AO_TS_VAL_t result = AO_test_and_set(addr);
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_test_and_set_acquire
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_release(volatile AO_TS_t *addr) {
+ AO_lwsync();
+ return AO_test_and_set(addr);
+}
+#define AO_HAVE_test_and_set_release
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t *addr) {
+ AO_TS_VAL_t result;
+ AO_lwsync();
+ result = AO_test_and_set(addr);
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_test_and_set_full
+#endif /* !AO_PREFER_GENERALIZED */
+
+#ifndef AO_GENERALIZE_ASM_BOOL_CAS
+
+ AO_INLINE int
+ AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val)
+ {
+ AO_t oldval;
+ int result = 0;
+
+ __asm__ __volatile__(
+ AO_PPC_L("1") AO_PPC_LxARX " %0,0,%2\n" /* load and reserve */
+ AO_PPC_CMPx " %0, %4\n" /* if load is not equal to */
+ "bne " AO_PPC_BR_A("2f", "$+16") "\n" /* old, fail */
+ AO_PPC_STxCXd " %3,0,%2\n" /* else store conditional */
+ "bne- " AO_PPC_BR_A("1b", "$-16") "\n"
+ /* retry if lost reservation */
+ "li %1,1\n" /* result = 1; */
+ AO_PPC_L("2") "\n"
+ : "=&r"(oldval), "=&r"(result)
+ : "r"(addr), "r"(new_val), "r"(old), "1"(result)
+ : "memory", "cr0");
+ return result;
+ }
+# define AO_HAVE_compare_and_swap
+
+ AO_INLINE int
+ AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val)
+ {
+ int result = AO_compare_and_swap(addr, old, new_val);
+ AO_lwsync();
+ return result;
+ }
+# define AO_HAVE_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val)
+ {
+ AO_lwsync();
+ return AO_compare_and_swap(addr, old, new_val);
+ }
+# define AO_HAVE_compare_and_swap_release
+
+ AO_INLINE int
+ AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val)
+ {
+ int result;
+ AO_lwsync();
+ result = AO_compare_and_swap(addr, old, new_val);
+ if (result)
+ AO_lwsync();
+ return result;
+ }
+# define AO_HAVE_compare_and_swap_full
+
+#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+{
+ AO_t fetched_val;
+
+ __asm__ __volatile__(
+ AO_PPC_L("1") AO_PPC_LxARX " %0,0,%1\n" /* load and reserve */
+ AO_PPC_CMPx " %0, %3\n" /* if load is not equal to */
+ "bne " AO_PPC_BR_A("2f", "$+12") "\n" /* old_val, fail */
+ AO_PPC_STxCXd " %2,0,%1\n" /* else store conditional */
+ "bne- " AO_PPC_BR_A("1b", "$-16") "\n"
+ /* retry if lost reservation */
+ AO_PPC_L("2") "\n"
+ : "=&r"(fetched_val)
+ : "r"(addr), "r"(new_val), "r"(old_val)
+ : "memory", "cr0");
+ return fetched_val;
+}
+#define AO_HAVE_fetch_compare_and_swap
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val);
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_fetch_compare_and_swap_acquire
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ AO_lwsync();
+ return AO_fetch_compare_and_swap(addr, old_val, new_val);
+}
+#define AO_HAVE_fetch_compare_and_swap_release
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ AO_t result;
+ AO_lwsync();
+ result = AO_fetch_compare_and_swap(addr, old_val, new_val);
+ if (result == old_val)
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_fetch_compare_and_swap_full
+
+#ifndef AO_PREFER_GENERALIZED
+AO_INLINE AO_t
+AO_fetch_and_add(volatile AO_t *addr, AO_t incr) {
+ AO_t oldval;
+ AO_t newval;
+
+ __asm__ __volatile__(
+ AO_PPC_L("1") AO_PPC_LxARX " %0,0,%2\n" /* load and reserve */
+ "add %1,%0,%3\n" /* increment */
+ AO_PPC_STxCXd " %1,0,%2\n" /* store conditional */
+ "bne- " AO_PPC_BR_A("1b", "$-12") "\n"
+ /* retry if lost reservation */
+ : "=&r"(oldval), "=&r"(newval)
+ : "r"(addr), "r"(incr)
+ : "memory", "cr0");
+ return oldval;
+}
+#define AO_HAVE_fetch_and_add
+
+AO_INLINE AO_t
+AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr) {
+ AO_t result = AO_fetch_and_add(addr, incr);
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_fetch_and_add_acquire
+
+AO_INLINE AO_t
+AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr) {
+ AO_lwsync();
+ return AO_fetch_and_add(addr, incr);
+}
+#define AO_HAVE_fetch_and_add_release
+
+AO_INLINE AO_t
+AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr) {
+ AO_t result;
+ AO_lwsync();
+ result = AO_fetch_and_add(addr, incr);
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_fetch_and_add_full
+#endif /* !AO_PREFER_GENERALIZED */
+
+#undef AO_PPC_BR_A
+#undef AO_PPC_CMPx
+#undef AO_PPC_L
+#undef AO_PPC_LD
+#undef AO_PPC_LOAD_CLOBBER
+#undef AO_PPC_LxARX
+#undef AO_PPC_STxCXd
+
+#endif /* AO_DISABLE_GCC_ATOMICS */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/riscv.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/riscv.h
new file mode 100644
index 0000000000..ad6c67e86a
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/riscv.h
@@ -0,0 +1,32 @@
+/*
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#if defined(__clang__) || defined(AO_PREFER_BUILTIN_ATOMICS)
+ /* All __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n macros are still missing. */
+ /* The operations are lock-free even for the types smaller than word. */
+# define AO_GCC_FORCE_HAVE_CAS
+#else
+
+ /* As of gcc-7.5, CAS and arithmetic atomic operations for char and */
+ /* short are supported by the compiler but require -latomic flag. */
+# if !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)
+# define AO_NO_char_ARITHM
+# endif
+# if !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)
+# define AO_NO_short_ARITHM
+# endif
+#endif /* !__clang__ */
+
+#include "generic.h"
+
+#undef AO_GCC_FORCE_HAVE_CAS
+#undef AO_NO_char_ARITHM
+#undef AO_NO_short_ARITHM
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/s390.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/s390.h
new file mode 100644
index 0000000000..a302b7ab8a
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/s390.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#if (AO_GNUC_PREREQ(5, 4) || AO_CLANG_PREREQ(8, 0)) && defined(__s390x__) \
+ && !defined(AO_DISABLE_GCC_ATOMICS)
+ /* Probably, it could be enabled for earlier clang/gcc versions. */
+ /* But, e.g., clang-3.8.0 produces a backend error for AtomicFence. */
+
+# include "generic.h"
+
+#else /* AO_DISABLE_GCC_ATOMICS */
+
+/* The relevant documentation appears to be at */
+/* http://publibz.boulder.ibm.com/epubs/pdf/dz9zr003.pdf */
+/* around page 5-96. Apparently: */
+/* - Memory references in general are atomic only for a single */
+/* byte. But it appears that the most common load/store */
+/* instructions also guarantee atomicity for aligned */
+/* operands of standard types. WE FOOLISHLY ASSUME that */
+/* compilers only generate those. If that turns out to be */
+/* wrong, we need inline assembly code for AO_load and */
+/* AO_store. */
+/* - A store followed by a load is unordered since the store */
+/* may be delayed. Otherwise everything is ordered. */
+/* - There is a hardware compare-and-swap (CS) instruction. */
+
+#include "../all_aligned_atomic_load_store.h"
+
+#include "../ordered_except_wr.h"
+
+#include "../test_and_set_t_is_ao_t.h"
+/* TODO: Is there a way to do byte-sized test-and-set? */
+
+/* TODO: AO_nop_full should probably be implemented directly. */
+/* It appears that certain BCR instructions have that effect. */
+/* Presumably they're cheaper than CS? */
+
+#ifndef AO_GENERALIZE_ASM_BOOL_CAS
+AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr,
+ AO_t old, AO_t new_val)
+{
+ int retval;
+ __asm__ __volatile__ (
+# ifndef __s390x__
+ " cs %1,%2,0(%3)\n"
+# else
+ " csg %1,%2,0(%3)\n"
+# endif
+ " ipm %0\n"
+ " srl %0,28\n"
+ : "=&d" (retval), "+d" (old)
+ : "d" (new_val), "a" (addr)
+ : "cc", "memory");
+ return retval == 0;
+}
+#define AO_HAVE_compare_and_swap_full
+#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_full(volatile AO_t *addr,
+ AO_t old, AO_t new_val)
+{
+ __asm__ __volatile__ (
+# ifndef __s390x__
+ " cs %0,%2,%1\n"
+# else
+ " csg %0,%2,%1\n"
+# endif
+ : "+d" (old), "=Q" (*addr)
+ : "d" (new_val), "m" (*addr)
+ : "cc", "memory");
+ return old;
+}
+#define AO_HAVE_fetch_compare_and_swap_full
+
+#endif /* AO_DISABLE_GCC_ATOMICS */
+
+/* TODO: Add double-wide operations for 32-bit executables. */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/sh.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/sh.h
new file mode 100644
index 0000000000..8534038cf9
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/sh.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2009 by Takashi YOSHII. All rights reserved.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include "../all_atomic_load_store.h"
+#include "../ordered.h"
+
+/* sh has tas.b(byte) only */
+#include "../test_and_set_t_is_char.h"
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t *addr)
+{
+ int oldval;
+ __asm__ __volatile__(
+ "tas.b @%1; movt %0"
+ : "=r" (oldval)
+ : "r" (addr)
+ : "t", "memory");
+ return oldval? AO_TS_CLEAR : AO_TS_SET;
+}
+#define AO_HAVE_test_and_set_full
+
+/* TODO: Very incomplete. */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h
new file mode 100644
index 0000000000..3f107d8f45
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#if (AO_GNUC_PREREQ(12, 0) || AO_CLANG_PREREQ(13, 0)) \
+ && !defined(AO_DISABLE_GCC_ATOMICS)
+ /* Probably, it could be enabled for earlier compiler versions as well. */
+
+# include "generic.h"
+
+#else /* AO_DISABLE_GCC_ATOMICS */
+
+#include "../all_atomic_load_store.h"
+
+/* Real SPARC code uses TSO: */
+#include "../ordered_except_wr.h"
+
+/* Test_and_set location is just a byte. */
+#include "../test_and_set_t_is_char.h"
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t *addr) {
+ AO_TS_VAL_t oldval;
+
+ __asm__ __volatile__("ldstub %1,%0"
+ : "=r"(oldval), "=m"(*addr)
+ : "m"(*addr) : "memory");
+ return oldval;
+}
+#define AO_HAVE_test_and_set_full
+
+#ifndef AO_NO_SPARC_V9
+
+# ifndef AO_GENERALIZE_ASM_BOOL_CAS
+/* Returns nonzero if the comparison succeeded. */
+AO_INLINE int
+AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) {
+ __asm__ __volatile__ ("membar #StoreLoad | #LoadLoad\n\t"
+# if defined(__arch64__)
+ "casx [%1],%2,%0\n\t"
+# else
+ "cas [%1],%2,%0\n\t" /* 32-bit version */
+# endif
+ "membar #StoreLoad | #StoreStore\n\t"
+ : "+r" (new_val)
+ : "r" (addr), "r" (old)
+ : "memory");
+ return new_val == old;
+}
+# define AO_HAVE_compare_and_swap_full
+# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) {
+ __asm__ __volatile__ ("membar #StoreLoad | #LoadLoad\n\t"
+# if defined(__arch64__)
+ "casx [%1],%2,%0\n\t"
+# else
+ "cas [%1],%2,%0\n\t" /* 32-bit version */
+# endif
+ "membar #StoreLoad | #StoreStore\n\t"
+ : "+r" (new_val)
+ : "r" (addr), "r" (old)
+ : "memory");
+ return new_val;
+}
+#define AO_HAVE_fetch_compare_and_swap_full
+
+#endif /* !AO_NO_SPARC_V9 */
+
+/* TODO: Extend this for SPARC v8 and v9 (V8 also has swap, V9 has CAS, */
+/* there are barriers like membar #LoadStore, CASA (32-bit) and */
+/* CASXA (64-bit) instructions added in V9). */
+
+#endif /* AO_DISABLE_GCC_ATOMICS */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/tile.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/tile.h
new file mode 100644
index 0000000000..6d284b1ae0
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/tile.h
@@ -0,0 +1,48 @@
+/*
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#if (AO_GNUC_PREREQ(4, 8) || AO_CLANG_PREREQ(3, 4)) \
+ && !defined(AO_DISABLE_GCC_ATOMICS)
+
+# include "generic.h"
+
+#else /* AO_DISABLE_GCC_ATOMICS */
+
+ /* Minimal support for tile. */
+
+# include "../all_atomic_load_store.h"
+
+# include "../test_and_set_t_is_ao_t.h"
+
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ __sync_synchronize();
+ }
+# define AO_HAVE_nop_full
+
+ AO_INLINE AO_t
+ AO_fetch_and_add_full(volatile AO_t *p, AO_t incr)
+ {
+ return __sync_fetch_and_add(p, incr);
+ }
+# define AO_HAVE_fetch_and_add_full
+
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+ return __sync_val_compare_and_swap(addr, old_val, new_val
+ /* empty protection list */);
+ }
+# define AO_HAVE_fetch_compare_and_swap_full
+
+#endif /* AO_DISABLE_GCC_ATOMICS */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/x86.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/x86.h
new file mode 100644
index 0000000000..13f4a7cc5a
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/gcc/x86.h
@@ -0,0 +1,657 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
+ * Copyright (c) 2008-2018 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * Some of the machine specific code was borrowed from our GC distribution.
+ */
+
+#if (AO_GNUC_PREREQ(4, 8) || AO_CLANG_PREREQ(3, 4)) \
+ && !defined(__INTEL_COMPILER) /* TODO: test and enable icc */ \
+ && !defined(AO_DISABLE_GCC_ATOMICS)
+# define AO_GCC_ATOMIC_TEST_AND_SET
+
+# if defined(__APPLE_CC__)
+ /* OS X 10.7 clang-425 lacks __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n */
+ /* predefined macro (unlike e.g. OS X 10.11 clang-703). */
+# define AO_GCC_FORCE_HAVE_CAS
+
+# ifdef __x86_64__
+# if !AO_CLANG_PREREQ(9, 0) /* < Apple clang-900 */
+ /* Older Apple clang (e.g., clang-600 based on LLVM 3.5svn) had */
+ /* some bug in the double word CAS implementation for x64. */
+# define AO_SKIPATOMIC_double_compare_and_swap_ANY
+# endif
+
+# elif defined(__MACH__)
+ /* OS X 10.8 lacks __atomic_load/store symbols for arch i386 */
+ /* (even with a non-Apple clang). */
+# ifndef MAC_OS_X_VERSION_MIN_REQUIRED
+ /* Include this header just to import the version macro. */
+# include <AvailabilityMacros.h>
+# endif
+# if MAC_OS_X_VERSION_MIN_REQUIRED < 1090 /* MAC_OS_X_VERSION_10_9 */
+# define AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY
+# endif
+# endif /* __i386__ */
+
+# elif defined(__clang__)
+# if !defined(__x86_64__)
+# if !defined(AO_PREFER_BUILTIN_ATOMICS) && !defined(__CYGWIN__) \
+ && !AO_CLANG_PREREQ(5, 0)
+ /* At least clang-3.8/i686 (from NDK r11c) required to specify */
+ /* -latomic in case of a double-word atomic operation use. */
+# define AO_SKIPATOMIC_double_compare_and_swap_ANY
+# define AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY
+# endif /* !AO_PREFER_BUILTIN_ATOMICS */
+
+# elif !defined(__ILP32__)
+# if (!AO_CLANG_PREREQ(3, 5) && !defined(AO_PREFER_BUILTIN_ATOMICS)) \
+ || (!AO_CLANG_PREREQ(4, 0) && defined(AO_ADDRESS_SANITIZER)) \
+ || defined(AO_THREAD_SANITIZER)
+ /* clang-3.4/x64 required -latomic. clang-3.9/x64 seems to */
+ /* pass double-wide arguments to atomic operations incorrectly */
+ /* in case of ASan/TSan. */
+ /* TODO: As of clang-4.0, lock-free test_stack fails if TSan. */
+# define AO_SKIPATOMIC_double_compare_and_swap_ANY
+# define AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY
+# endif
+# endif /* __x86_64__ */
+
+# elif defined(__x86_64__) && !defined(AO_PREFER_BUILTIN_ATOMICS) \
+ && !defined(AO_THREAD_SANITIZER)
+ /* gcc/x64 (as of gcc-12.2) requires -latomic flag in case */
+ /* of double-word atomic operations use (but not in case of TSan). */
+ /* TODO: Revise it for the future gcc releases. */
+# define AO_SKIPATOMIC_double_compare_and_swap_ANY
+# define AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY
+# endif /* __x86_64__ && !__clang__ */
+
+# ifdef AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY
+# define AO_SKIPATOMIC_double_load
+# define AO_SKIPATOMIC_double_load_acquire
+# define AO_SKIPATOMIC_double_store
+# define AO_SKIPATOMIC_double_store_release
+# undef AO_SKIPATOMIC_DOUBLE_LOAD_STORE_ANY
+# endif
+
+#else /* AO_DISABLE_GCC_ATOMICS */
+
+/* The following really assume we have a 486 or better. Unfortunately */
+/* gcc doesn't define a suitable feature test macro based on command */
+/* line options. */
+/* We should perhaps test dynamically. */
+
+#include "../all_aligned_atomic_load_store.h"
+
+#include "../test_and_set_t_is_char.h"
+
+#if defined(__SSE2__) && !defined(AO_USE_PENTIUM4_INSTRS)
+ /* "mfence" is a part of SSE2 set (introduced on Intel Pentium 4). */
+# define AO_USE_PENTIUM4_INSTRS
+#endif
+
+#if defined(AO_USE_PENTIUM4_INSTRS)
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ __asm__ __volatile__("mfence" : : : "memory");
+ }
+# define AO_HAVE_nop_full
+
+#else
+ /* We could use the cpuid instruction. But that seems to be slower */
+ /* than the default implementation based on test_and_set_full. Thus */
+ /* we omit that bit of misinformation here. */
+#endif /* !AO_USE_PENTIUM4_INSTRS */
+
+/* As far as we can tell, the lfence and sfence instructions are not */
+/* currently needed or useful for cached memory accesses. */
+
+/* Really only works for 486 and later */
+#ifndef AO_PREFER_GENERALIZED
+ AO_INLINE AO_t
+ AO_fetch_and_add_full (volatile AO_t *p, AO_t incr)
+ {
+ AO_t result;
+
+ __asm__ __volatile__ ("lock; xadd %0, %1"
+ : "=r" (result), "+m" (*p)
+ : "0" (incr)
+ : "memory");
+ return result;
+ }
+# define AO_HAVE_fetch_and_add_full
+#endif /* !AO_PREFER_GENERALIZED */
+
+AO_INLINE unsigned char
+AO_char_fetch_and_add_full (volatile unsigned char *p, unsigned char incr)
+{
+ unsigned char result;
+
+ __asm__ __volatile__ ("lock; xaddb %0, %1"
+ : "=q" (result), "+m" (*p)
+ : "0" (incr)
+ : "memory");
+ return result;
+}
+#define AO_HAVE_char_fetch_and_add_full
+
+AO_INLINE unsigned short
+AO_short_fetch_and_add_full (volatile unsigned short *p, unsigned short incr)
+{
+ unsigned short result;
+
+ __asm__ __volatile__ ("lock; xaddw %0, %1"
+ : "=r" (result), "+m" (*p)
+ : "0" (incr)
+ : "memory");
+ return result;
+}
+#define AO_HAVE_short_fetch_and_add_full
+
+#ifndef AO_PREFER_GENERALIZED
+ AO_INLINE void
+ AO_and_full (volatile AO_t *p, AO_t value)
+ {
+ __asm__ __volatile__ ("lock; and %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+ }
+# define AO_HAVE_and_full
+
+ AO_INLINE void
+ AO_or_full (volatile AO_t *p, AO_t value)
+ {
+ __asm__ __volatile__ ("lock; or %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+ }
+# define AO_HAVE_or_full
+
+ AO_INLINE void
+ AO_xor_full (volatile AO_t *p, AO_t value)
+ {
+ __asm__ __volatile__ ("lock; xor %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+ }
+# define AO_HAVE_xor_full
+
+ /* AO_store_full could be implemented directly using "xchg" but it */
+ /* could be generalized efficiently as an ordinary store accomplished */
+ /* with AO_nop_full ("mfence" instruction). */
+
+AO_INLINE void
+AO_char_and_full (volatile unsigned char *p, unsigned char value)
+{
+ __asm__ __volatile__ ("lock; andb %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+}
+#define AO_HAVE_char_and_full
+
+AO_INLINE void
+AO_char_or_full (volatile unsigned char *p, unsigned char value)
+{
+ __asm__ __volatile__ ("lock; orb %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+}
+#define AO_HAVE_char_or_full
+
+AO_INLINE void
+AO_char_xor_full (volatile unsigned char *p, unsigned char value)
+{
+ __asm__ __volatile__ ("lock; xorb %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+}
+#define AO_HAVE_char_xor_full
+
+AO_INLINE void
+AO_short_and_full (volatile unsigned short *p, unsigned short value)
+{
+ __asm__ __volatile__ ("lock; andw %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+}
+#define AO_HAVE_short_and_full
+
+AO_INLINE void
+AO_short_or_full (volatile unsigned short *p, unsigned short value)
+{
+ __asm__ __volatile__ ("lock; orw %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+}
+#define AO_HAVE_short_or_full
+
+AO_INLINE void
+AO_short_xor_full (volatile unsigned short *p, unsigned short value)
+{
+ __asm__ __volatile__ ("lock; xorw %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+}
+#define AO_HAVE_short_xor_full
+#endif /* !AO_PREFER_GENERALIZED */
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t *addr)
+{
+ unsigned char oldval;
+ /* Note: the "xchg" instruction does not need a "lock" prefix */
+ __asm__ __volatile__ ("xchgb %0, %1"
+ : "=q" (oldval), "+m" (*addr)
+ : "0" ((unsigned char)0xff)
+ : "memory");
+ return (AO_TS_VAL_t)oldval;
+}
+#define AO_HAVE_test_and_set_full
+
+#ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ /* Returns nonzero if the comparison succeeded. */
+ AO_INLINE int
+ AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val)
+ {
+# ifdef AO_USE_SYNC_CAS_BUILTIN
+ return (int)__sync_bool_compare_and_swap(addr, old, new_val
+ /* empty protection list */);
+ /* Note: an empty list of variables protected by the */
+ /* memory barrier should mean all globally accessible */
+ /* variables are protected. */
+# else
+ char result;
+# if defined(__GCC_ASM_FLAG_OUTPUTS__)
+ AO_t dummy;
+
+ __asm__ __volatile__ ("lock; cmpxchg %3, %0"
+ : "+m" (*addr), "=@ccz" (result), "=a" (dummy)
+ : "r" (new_val), "a" (old)
+ : "memory");
+# else
+ __asm__ __volatile__ ("lock; cmpxchg %2, %0; setz %1"
+ : "+m" (*addr), "=a" (result)
+ : "r" (new_val), "a" (old)
+ : "memory");
+# endif
+ return (int)result;
+# endif
+ }
+# define AO_HAVE_compare_and_swap_full
+#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+# ifdef AO_USE_SYNC_CAS_BUILTIN
+ return __sync_val_compare_and_swap(addr, old_val, new_val
+ /* empty protection list */);
+# else
+ AO_t fetched_val;
+ __asm__ __volatile__ ("lock; cmpxchg %3, %1"
+ : "=a" (fetched_val), "+m" (*addr)
+ : "a" (old_val), "r" (new_val)
+ : "memory");
+ return fetched_val;
+# endif
+}
+#define AO_HAVE_fetch_compare_and_swap_full
+
+ AO_INLINE unsigned char
+ AO_char_fetch_compare_and_swap_full(volatile unsigned char *addr,
+ unsigned char old_val,
+ unsigned char new_val)
+ {
+# ifdef AO_USE_SYNC_CAS_BUILTIN
+ return __sync_val_compare_and_swap(addr, old_val, new_val
+ /* empty protection list */);
+# else
+ unsigned char fetched_val;
+
+ __asm__ __volatile__ ("lock; cmpxchgb %3, %1"
+ : "=a" (fetched_val), "+m" (*addr)
+ : "a" (old_val), "q" (new_val)
+ : "memory");
+ return fetched_val;
+# endif
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_full
+
+ AO_INLINE unsigned short
+ AO_short_fetch_compare_and_swap_full(volatile unsigned short *addr,
+ unsigned short old_val,
+ unsigned short new_val)
+ {
+# ifdef AO_USE_SYNC_CAS_BUILTIN
+ return __sync_val_compare_and_swap(addr, old_val, new_val
+ /* empty protection list */);
+# else
+ unsigned short fetched_val;
+
+ __asm__ __volatile__ ("lock; cmpxchgw %3, %1"
+ : "=a" (fetched_val), "+m" (*addr)
+ : "a" (old_val), "r" (new_val)
+ : "memory");
+ return fetched_val;
+# endif
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_full
+
+# if defined(__x86_64__) && !defined(__ILP32__)
+ AO_INLINE unsigned int
+ AO_int_fetch_compare_and_swap_full(volatile unsigned int *addr,
+ unsigned int old_val,
+ unsigned int new_val)
+ {
+# ifdef AO_USE_SYNC_CAS_BUILTIN
+ return __sync_val_compare_and_swap(addr, old_val, new_val
+ /* empty protection list */);
+# else
+ unsigned int fetched_val;
+
+ __asm__ __volatile__ ("lock; cmpxchgl %3, %1"
+ : "=a" (fetched_val), "+m" (*addr)
+ : "a" (old_val), "r" (new_val)
+ : "memory");
+ return fetched_val;
+# endif
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_full
+
+# ifndef AO_PREFER_GENERALIZED
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add_full (volatile unsigned int *p, unsigned int incr)
+ {
+ unsigned int result;
+
+ __asm__ __volatile__ ("lock; xaddl %0, %1"
+ : "=r" (result), "+m" (*p)
+ : "0" (incr)
+ : "memory");
+ return result;
+ }
+# define AO_HAVE_int_fetch_and_add_full
+
+ AO_INLINE void
+ AO_int_and_full (volatile unsigned int *p, unsigned int value)
+ {
+ __asm__ __volatile__ ("lock; andl %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+ }
+# define AO_HAVE_int_and_full
+
+ AO_INLINE void
+ AO_int_or_full (volatile unsigned int *p, unsigned int value)
+ {
+ __asm__ __volatile__ ("lock; orl %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+ }
+# define AO_HAVE_int_or_full
+
+ AO_INLINE void
+ AO_int_xor_full (volatile unsigned int *p, unsigned int value)
+ {
+ __asm__ __volatile__ ("lock; xorl %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+ }
+# define AO_HAVE_int_xor_full
+# endif /* !AO_PREFER_GENERALIZED */
+
+# else
+# define AO_T_IS_INT
+# endif /* !x86_64 || ILP32 */
+
+ /* Real X86 implementations, except for some old 32-bit WinChips, */
+ /* appear to enforce ordering between memory operations, EXCEPT that */
+ /* a later read can pass earlier writes, presumably due to the */
+ /* visible presence of store buffers. */
+ /* We ignore both the WinChips and the fact that the official specs */
+ /* seem to be much weaker (and arguably too weak to be usable). */
+# include "../ordered_except_wr.h"
+
+#endif /* AO_DISABLE_GCC_ATOMICS */
+
+#if defined(AO_GCC_ATOMIC_TEST_AND_SET) \
+ && !defined(AO_SKIPATOMIC_double_compare_and_swap_ANY)
+
+# if defined(__ILP32__) || !defined(__x86_64__) /* 32-bit AO_t */ \
+ || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16) /* 64-bit AO_t */
+# include "../standard_ao_double_t.h"
+# endif
+
+#elif !defined(__x86_64__) && (!defined(AO_USE_SYNC_CAS_BUILTIN) \
+ || defined(AO_GCC_ATOMIC_TEST_AND_SET))
+# include "../standard_ao_double_t.h"
+
+ /* Reading or writing a quadword aligned on a 64-bit boundary is */
+ /* always carried out atomically on at least a Pentium according to */
+ /* Chapter 8.1.1 of Volume 3A Part 1 of Intel processor manuals. */
+# ifndef AO_PREFER_GENERALIZED
+# define AO_ACCESS_double_CHECK_ALIGNED
+# include "../loadstore/double_atomic_load_store.h"
+# endif
+
+ /* Returns nonzero if the comparison succeeded. */
+ /* Really requires at least a Pentium. */
+ AO_INLINE int
+ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ char result;
+# if defined(__PIC__) && !(AO_GNUC_PREREQ(5, 1) || AO_CLANG_PREREQ(4, 0))
+ AO_t saved_ebx;
+ AO_t dummy;
+
+ /* The following applies to an ancient GCC (and, probably, it was */
+ /* never needed for Clang): */
+ /* If PIC is turned on, we cannot use ebx as it is reserved for the */
+ /* GOT pointer. We should save and restore ebx. The proposed */
+ /* solution is not so efficient as the older alternatives using */
+ /* push ebx or edi as new_val1 (w/o clobbering edi and temporary */
+ /* local variable usage) but it is more portable (it works even if */
+ /* ebx is not used as GOT pointer, and it works for the buggy GCC */
+ /* releases that incorrectly evaluate memory operands offset in the */
+ /* inline assembly after push). */
+# ifdef __OPTIMIZE__
+ __asm__ __volatile__("mov %%ebx, %2\n\t" /* save ebx */
+ "lea %0, %%edi\n\t" /* in case addr is in ebx */
+ "mov %7, %%ebx\n\t" /* load new_val1 */
+ "lock; cmpxchg8b (%%edi)\n\t"
+ "mov %2, %%ebx\n\t" /* restore ebx */
+ "setz %1"
+ : "+m" (*addr), "=a" (result),
+ "=m" (saved_ebx), "=d" (dummy)
+ : "d" (old_val2), "a" (old_val1),
+ "c" (new_val2), "m" (new_val1)
+ : "%edi", "memory");
+# else
+ /* A less-efficient code manually preserving edi if GCC invoked */
+ /* with -O0 option (otherwise it fails while finding a register */
+ /* in class 'GENERAL_REGS'). */
+ AO_t saved_edi;
+ __asm__ __volatile__("mov %%edi, %3\n\t" /* save edi */
+ "mov %%ebx, %2\n\t" /* save ebx */
+ "lea %0, %%edi\n\t" /* in case addr is in ebx */
+ "mov %8, %%ebx\n\t" /* load new_val1 */
+ "lock; cmpxchg8b (%%edi)\n\t"
+ "mov %2, %%ebx\n\t" /* restore ebx */
+ "mov %3, %%edi\n\t" /* restore edi */
+ "setz %1"
+ : "+m" (*addr), "=a" (result),
+ "=m" (saved_ebx), "=m" (saved_edi), "=d" (dummy)
+ : "d" (old_val2), "a" (old_val1),
+ "c" (new_val2), "m" (new_val1)
+ : "memory");
+# endif
+# else
+ /* For non-PIC mode, this operation could be simplified (and be */
+ /* faster) by using ebx as new_val1. Reuse of the PIC hard */
+ /* register, instead of using a fixed register, is implemented */
+ /* in Clang and GCC 5.1+, at least. (Older GCC refused to compile */
+ /* such code for PIC mode). */
+# if defined(__GCC_ASM_FLAG_OUTPUTS__)
+ __asm__ __volatile__ ("lock; cmpxchg8b %0"
+ : "+m" (*addr), "=@ccz" (result),
+ "+d" (old_val2), "+a" (old_val1)
+ : "c" (new_val2), "b" (new_val1)
+ : "memory");
+# else
+ AO_t dummy; /* an output for clobbered edx */
+
+ __asm__ __volatile__ ("lock; cmpxchg8b %0; setz %1"
+ : "+m" (*addr), "=a" (result), "=d" (dummy)
+ : "d" (old_val2), "a" (old_val1),
+ "c" (new_val2), "b" (new_val1)
+ : "memory");
+# endif
+# endif
+ return (int) result;
+ }
+# define AO_HAVE_compare_double_and_swap_double_full
+
+#elif defined(__ILP32__) || !defined(__x86_64__)
+# include "../standard_ao_double_t.h"
+
+ /* Reading or writing a quadword aligned on a 64-bit boundary is */
+ /* always carried out atomically (requires at least a Pentium). */
+# ifndef AO_PREFER_GENERALIZED
+# define AO_ACCESS_double_CHECK_ALIGNED
+# include "../loadstore/double_atomic_load_store.h"
+# endif
+
+ /* X32 has native support for 64-bit integer operations (AO_double_t */
+ /* is a 64-bit integer and we could use 64-bit cmpxchg). */
+ /* This primitive is used by compare_double_and_swap_double_full. */
+ AO_INLINE int
+ AO_double_compare_and_swap_full(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ /* It is safe to use __sync CAS built-in here. */
+ return __sync_bool_compare_and_swap(&addr->AO_whole,
+ old_val.AO_whole, new_val.AO_whole
+ /* empty protection list */);
+ }
+# define AO_HAVE_double_compare_and_swap_full
+
+#elif defined(AO_CMPXCHG16B_AVAILABLE) \
+ || (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16) \
+ && !defined(AO_THREAD_SANITIZER))
+# include "../standard_ao_double_t.h"
+
+ /* The Intel and AMD Architecture Programmer Manuals state roughly */
+ /* the following: */
+ /* - CMPXCHG16B (with a LOCK prefix) can be used to perform 16-byte */
+ /* atomic accesses in 64-bit mode (with certain alignment */
+ /* restrictions); */
+ /* - SSE instructions that access data larger than a quadword (like */
+ /* MOVDQA) may be implemented using multiple memory accesses; */
+ /* - LOCK prefix causes an invalid-opcode exception when used with */
+ /* 128-bit media (SSE) instructions. */
+ /* Thus, currently, the only way to implement lock-free double_load */
+ /* and double_store on x86_64 is to use CMPXCHG16B (if available). */
+
+ /* NEC LE-IT: older AMD Opterons are missing this instruction. */
+ /* On these machines SIGILL will be thrown. */
+ /* Define AO_WEAK_DOUBLE_CAS_EMULATION to have an emulated (lock */
+ /* based) version available. */
+ /* HB: Changed this to not define either by default. There are */
+ /* enough machines and tool chains around on which cmpxchg16b */
+ /* doesn't work. And the emulation is unsafe by our usual rules. */
+ /* However both are clearly useful in certain cases. */
+
+ AO_INLINE int
+ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ char result;
+
+# if defined(__GCC_ASM_FLAG_OUTPUTS__)
+ __asm__ __volatile__("lock; cmpxchg16b %0"
+ : "+m" (*addr), "=@ccz" (result),
+ "+d" (old_val2), "+a" (old_val1)
+ : "c" (new_val2), "b" (new_val1)
+ : "memory");
+# else
+ AO_t dummy; /* an output for clobbered rdx */
+
+ __asm__ __volatile__("lock; cmpxchg16b %0; setz %1"
+ : "+m" (*addr), "=a" (result), "=d" (dummy)
+ : "d" (old_val2), "a" (old_val1),
+ "c" (new_val2), "b" (new_val1)
+ : "memory");
+# endif
+ return (int) result;
+ }
+# define AO_HAVE_compare_double_and_swap_double_full
+
+#elif defined(AO_WEAK_DOUBLE_CAS_EMULATION)
+# include "../standard_ao_double_t.h"
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+
+ /* This one provides spinlock based emulation of CAS implemented in */
+ /* atomic_ops.c. We probably do not want to do this here, since it */
+ /* is not atomic with respect to other kinds of updates of *addr. */
+ /* On the other hand, this may be a useful facility on occasion. */
+ int AO_compare_double_and_swap_double_emulation(
+ volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2);
+
+# ifdef __cplusplus
+ } /* extern "C" */
+# endif
+
+ AO_INLINE int
+ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ return AO_compare_double_and_swap_double_emulation(addr,
+ old_val1, old_val2, new_val1, new_val2);
+ }
+# define AO_HAVE_compare_double_and_swap_double_full
+#endif /* x86_64 && !ILP32 && CAS_EMULATION && !AO_CMPXCHG16B_AVAILABLE */
+
+#ifdef AO_GCC_ATOMIC_TEST_AND_SET
+# include "generic.h"
+#endif
+
+#undef AO_GCC_FORCE_HAVE_CAS
+#undef AO_SKIPATOMIC_double_compare_and_swap_ANY
+#undef AO_SKIPATOMIC_double_load
+#undef AO_SKIPATOMIC_double_load_acquire
+#undef AO_SKIPATOMIC_double_store
+#undef AO_SKIPATOMIC_double_store_release
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/generic_pthread.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/generic_pthread.h
new file mode 100644
index 0000000000..724b148b0c
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/generic_pthread.h
@@ -0,0 +1,442 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 following is useful primarily for debugging and documentation. */
+/* We define various atomic operations by acquiring a global pthread */
+/* lock. The resulting implementation will perform poorly, but should */
+/* be correct unless it is used from signal handlers. */
+/* We assume that all pthread operations act like full memory barriers. */
+/* (We believe that is the intent of the specification.) */
+
+#include <pthread.h>
+
+#include "test_and_set_t_is_ao_t.h"
+ /* This is not necessarily compatible with the native */
+ /* implementation. But those can't be safely mixed anyway. */
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* We define only the full barrier variants, and count on the */
+/* generalization section below to fill in the rest. */
+AO_API pthread_mutex_t AO_pt_lock;
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+AO_INLINE void
+AO_nop_full(void)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_nop_full
+
+AO_INLINE AO_t
+AO_load_full(const volatile AO_t *addr)
+{
+ AO_t result;
+ pthread_mutex_lock(&AO_pt_lock);
+ result = *addr;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return result;
+}
+#define AO_HAVE_load_full
+
+AO_INLINE void
+AO_store_full(volatile AO_t *addr, AO_t val)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *addr = val;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_store_full
+
+AO_INLINE unsigned char
+AO_char_load_full(const volatile unsigned char *addr)
+{
+ unsigned char result;
+ pthread_mutex_lock(&AO_pt_lock);
+ result = *addr;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return result;
+}
+#define AO_HAVE_char_load_full
+
+AO_INLINE void
+AO_char_store_full(volatile unsigned char *addr, unsigned char val)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *addr = val;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_char_store_full
+
+AO_INLINE unsigned short
+AO_short_load_full(const volatile unsigned short *addr)
+{
+ unsigned short result;
+ pthread_mutex_lock(&AO_pt_lock);
+ result = *addr;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return result;
+}
+#define AO_HAVE_short_load_full
+
+AO_INLINE void
+AO_short_store_full(volatile unsigned short *addr, unsigned short val)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *addr = val;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_short_store_full
+
+AO_INLINE unsigned int
+AO_int_load_full(const volatile unsigned int *addr)
+{
+ unsigned int result;
+ pthread_mutex_lock(&AO_pt_lock);
+ result = *addr;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return result;
+}
+#define AO_HAVE_int_load_full
+
+AO_INLINE void
+AO_int_store_full(volatile unsigned int *addr, unsigned int val)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *addr = val;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_int_store_full
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t *addr)
+{
+ AO_TS_VAL_t result;
+ pthread_mutex_lock(&AO_pt_lock);
+ result = (AO_TS_VAL_t)(*addr);
+ *addr = AO_TS_SET;
+ pthread_mutex_unlock(&AO_pt_lock);
+ assert(result == AO_TS_SET || result == AO_TS_CLEAR);
+ return result;
+}
+#define AO_HAVE_test_and_set_full
+
+AO_INLINE AO_t
+AO_fetch_and_add_full(volatile AO_t *p, AO_t incr)
+{
+ AO_t old_val;
+
+ pthread_mutex_lock(&AO_pt_lock);
+ old_val = *p;
+ *p = old_val + incr;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return old_val;
+}
+#define AO_HAVE_fetch_and_add_full
+
+AO_INLINE unsigned char
+AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr)
+{
+ unsigned char old_val;
+
+ pthread_mutex_lock(&AO_pt_lock);
+ old_val = *p;
+ *p = old_val + incr;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return old_val;
+}
+#define AO_HAVE_char_fetch_and_add_full
+
+AO_INLINE unsigned short
+AO_short_fetch_and_add_full(volatile unsigned short *p, unsigned short incr)
+{
+ unsigned short old_val;
+
+ pthread_mutex_lock(&AO_pt_lock);
+ old_val = *p;
+ *p = old_val + incr;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return old_val;
+}
+#define AO_HAVE_short_fetch_and_add_full
+
+AO_INLINE unsigned int
+AO_int_fetch_and_add_full(volatile unsigned int *p, unsigned int incr)
+{
+ unsigned int old_val;
+
+ pthread_mutex_lock(&AO_pt_lock);
+ old_val = *p;
+ *p = old_val + incr;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return old_val;
+}
+#define AO_HAVE_int_fetch_and_add_full
+
+AO_INLINE void
+AO_and_full(volatile AO_t *p, AO_t value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p &= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_and_full
+
+AO_INLINE void
+AO_or_full(volatile AO_t *p, AO_t value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p |= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_or_full
+
+AO_INLINE void
+AO_xor_full(volatile AO_t *p, AO_t value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p ^= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_xor_full
+
+AO_INLINE void
+AO_char_and_full(volatile unsigned char *p, unsigned char value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p &= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_char_and_full
+
+AO_INLINE void
+AO_char_or_full(volatile unsigned char *p, unsigned char value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p |= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_char_or_full
+
+AO_INLINE void
+AO_char_xor_full(volatile unsigned char *p, unsigned char value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p ^= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_char_xor_full
+
+AO_INLINE void
+AO_short_and_full(volatile unsigned short *p, unsigned short value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p &= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_short_and_full
+
+AO_INLINE void
+AO_short_or_full(volatile unsigned short *p, unsigned short value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p |= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_short_or_full
+
+AO_INLINE void
+AO_short_xor_full(volatile unsigned short *p, unsigned short value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p ^= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_short_xor_full
+
+AO_INLINE void
+AO_int_and_full(volatile unsigned *p, unsigned value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p &= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_int_and_full
+
+AO_INLINE void
+AO_int_or_full(volatile unsigned *p, unsigned value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p |= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_int_or_full
+
+AO_INLINE void
+AO_int_xor_full(volatile unsigned *p, unsigned value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ *p ^= value;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_int_xor_full
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ AO_t fetched_val;
+
+ pthread_mutex_lock(&AO_pt_lock);
+ fetched_val = *addr;
+ if (fetched_val == old_val)
+ *addr = new_val;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return fetched_val;
+}
+#define AO_HAVE_fetch_compare_and_swap_full
+
+AO_INLINE unsigned char
+AO_char_fetch_compare_and_swap_full(volatile unsigned char *addr,
+ unsigned char old_val,
+ unsigned char new_val)
+{
+ unsigned char fetched_val;
+
+ pthread_mutex_lock(&AO_pt_lock);
+ fetched_val = *addr;
+ if (fetched_val == old_val)
+ *addr = new_val;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return fetched_val;
+}
+#define AO_HAVE_char_fetch_compare_and_swap_full
+
+AO_INLINE unsigned short
+AO_short_fetch_compare_and_swap_full(volatile unsigned short *addr,
+ unsigned short old_val,
+ unsigned short new_val)
+{
+ unsigned short fetched_val;
+
+ pthread_mutex_lock(&AO_pt_lock);
+ fetched_val = *addr;
+ if (fetched_val == old_val)
+ *addr = new_val;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return fetched_val;
+}
+#define AO_HAVE_short_fetch_compare_and_swap_full
+
+AO_INLINE unsigned
+AO_int_fetch_compare_and_swap_full(volatile unsigned *addr, unsigned old_val,
+ unsigned new_val)
+{
+ unsigned fetched_val;
+
+ pthread_mutex_lock(&AO_pt_lock);
+ fetched_val = *addr;
+ if (fetched_val == old_val)
+ *addr = new_val;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return fetched_val;
+}
+#define AO_HAVE_int_fetch_compare_and_swap_full
+
+/* Unlike real architectures, we define both double-width CAS variants. */
+
+typedef struct {
+ AO_t AO_val1;
+ AO_t AO_val2;
+} AO_double_t;
+#define AO_HAVE_double_t
+
+#define AO_DOUBLE_T_INITIALIZER { (AO_t)0, (AO_t)0 }
+
+AO_INLINE AO_double_t
+AO_double_load_full(const volatile AO_double_t *addr)
+{
+ AO_double_t result;
+
+ pthread_mutex_lock(&AO_pt_lock);
+ result.AO_val1 = addr->AO_val1;
+ result.AO_val2 = addr->AO_val2;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return result;
+}
+#define AO_HAVE_double_load_full
+
+AO_INLINE void
+AO_double_store_full(volatile AO_double_t *addr, AO_double_t value)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ addr->AO_val1 = value.AO_val1;
+ addr->AO_val2 = value.AO_val2;
+ pthread_mutex_unlock(&AO_pt_lock);
+}
+#define AO_HAVE_double_store_full
+
+AO_INLINE int
+AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
+ AO_t old1, AO_t old2,
+ AO_t new1, AO_t new2)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ if (addr -> AO_val1 == old1 && addr -> AO_val2 == old2)
+ {
+ addr -> AO_val1 = new1;
+ addr -> AO_val2 = new2;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return 1;
+ }
+ else
+ pthread_mutex_unlock(&AO_pt_lock);
+ return 0;
+}
+#define AO_HAVE_compare_double_and_swap_double_full
+
+AO_INLINE int
+AO_compare_and_swap_double_full(volatile AO_double_t *addr,
+ AO_t old1, AO_t new1, AO_t new2)
+{
+ pthread_mutex_lock(&AO_pt_lock);
+ if (addr -> AO_val1 == old1)
+ {
+ addr -> AO_val1 = new1;
+ addr -> AO_val2 = new2;
+ pthread_mutex_unlock(&AO_pt_lock);
+ return 1;
+ }
+ else
+ pthread_mutex_unlock(&AO_pt_lock);
+ return 0;
+}
+#define AO_HAVE_compare_and_swap_double_full
+
+/* We can't use hardware loads and stores, since they don't */
+/* interact correctly with atomic updates. */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/hpc/hppa.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/hpc/hppa.h
new file mode 100644
index 0000000000..f0da9480d7
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/hpc/hppa.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Derived from the corresponding header file for gcc.
+ */
+
+#include "../loadstore/atomic_load.h"
+#include "../loadstore/atomic_store.h"
+
+/* Some architecture set descriptions include special "ordered" memory */
+/* operations. As far as we can tell, no existing processors actually */
+/* require those. Nor does it appear likely that future processors */
+/* will. */
+/* FIXME: The PA emulator on Itanium may obey weaker restrictions. */
+/* There should be a mode in which we don't assume sequential */
+/* consistency here. */
+#include "../ordered.h"
+
+#include <machine/inline.h>
+
+/* GCC will not guarantee the alignment we need, use four lock words */
+/* and select the correctly aligned datum. See the glibc 2.3.2 */
+/* linuxthread port for the original implementation. */
+struct AO_pa_clearable_loc {
+ int data[4];
+};
+
+#undef AO_TS_INITIALIZER
+#define AO_TS_t struct AO_pa_clearable_loc
+#define AO_TS_INITIALIZER {1,1,1,1}
+/* Switch meaning of set and clear, since we only have an atomic clear */
+/* instruction. */
+typedef enum {AO_PA_TS_set = 0, AO_PA_TS_clear = 1} AO_PA_TS_val;
+#define AO_TS_VAL_t AO_PA_TS_val
+#define AO_TS_CLEAR AO_PA_TS_clear
+#define AO_TS_SET AO_PA_TS_set
+
+/* The hppa only has one atomic read and modify memory operation, */
+/* load and clear, so hppa spinlocks must use zero to signify that */
+/* someone is holding the lock. The address used for the ldcw */
+/* semaphore must be 16-byte aligned. */
+#define AO_ldcw(a, ret) \
+ _LDCWX(0 /* index */, 0 /* s */, a /* base */, ret)
+
+/* Because malloc only guarantees 8-byte alignment for malloc'd data, */
+/* and GCC only guarantees 8-byte alignment for stack locals, we can't */
+/* be assured of 16-byte alignment for atomic lock data even if we */
+/* specify "__attribute ((aligned(16)))" in the type declaration. So, */
+/* we use a struct containing an array of four ints for the atomic lock */
+/* type and dynamically select the 16-byte aligned int from the array */
+/* for the semaphore. */
+#define AO_PA_LDCW_ALIGNMENT 16
+#define AO_ldcw_align(addr) \
+ ((volatile unsigned *)(((unsigned long)(addr) \
+ + (AO_PA_LDCW_ALIGNMENT - 1)) \
+ & ~(AO_PA_LDCW_ALIGNMENT - 1)))
+
+/* Works on PA 1.1 and PA 2.0 systems */
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t * addr)
+{
+ register unsigned int ret;
+ register unsigned long a = (unsigned long)AO_ldcw_align(addr);
+
+# if defined(CPPCHECK)
+ ret = 0; /* to void 'uninitialized variable' warning */
+# endif
+ AO_ldcw(a, ret);
+ return (AO_TS_VAL_t)ret;
+}
+#define AO_HAVE_test_and_set_full
+
+AO_INLINE void
+AO_pa_clear(volatile AO_TS_t * addr)
+{
+ volatile unsigned *a = AO_ldcw_align(addr);
+
+ AO_compiler_barrier();
+ *a = 1;
+}
+#define AO_CLEAR(addr) AO_pa_clear(addr)
+#define AO_HAVE_CLEAR
+
+#undef AO_PA_LDCW_ALIGNMENT
+#undef AO_ldcw
+#undef AO_ldcw_align
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/hpc/ia64.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/hpc/ia64.h
new file mode 100644
index 0000000000..061e55b3e9
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/hpc/ia64.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 specifies Itanimum primitives for use with the HP compiler
+ * under HP/UX. We use intrinsics instead of the inline assembly code in the
+ * gcc file.
+ */
+
+#include "../all_atomic_load_store.h"
+
+#include "../all_acquire_release_volatile.h"
+
+#include "../test_and_set_t_is_char.h"
+
+#include <machine/sys/inline.h>
+
+#ifdef __LP64__
+# define AO_T_FASIZE _FASZ_D
+# define AO_T_SIZE _SZ_D
+#else
+# define AO_T_FASIZE _FASZ_W
+# define AO_T_SIZE _SZ_W
+#endif
+
+AO_INLINE void
+AO_nop_full(void)
+{
+ _Asm_mf();
+}
+#define AO_HAVE_nop_full
+
+#ifndef AO_PREFER_GENERALIZED
+AO_INLINE AO_t
+AO_fetch_and_add1_acquire (volatile AO_t *p)
+{
+ return _Asm_fetchadd(AO_T_FASIZE, _SEM_ACQ, p, 1,
+ _LDHINT_NONE, _DOWN_MEM_FENCE);
+}
+#define AO_HAVE_fetch_and_add1_acquire
+
+AO_INLINE AO_t
+AO_fetch_and_add1_release (volatile AO_t *p)
+{
+ return _Asm_fetchadd(AO_T_FASIZE, _SEM_REL, p, 1,
+ _LDHINT_NONE, _UP_MEM_FENCE);
+}
+#define AO_HAVE_fetch_and_add1_release
+
+AO_INLINE AO_t
+AO_fetch_and_sub1_acquire (volatile AO_t *p)
+{
+ return _Asm_fetchadd(AO_T_FASIZE, _SEM_ACQ, p, -1,
+ _LDHINT_NONE, _DOWN_MEM_FENCE);
+}
+#define AO_HAVE_fetch_and_sub1_acquire
+
+AO_INLINE AO_t
+AO_fetch_and_sub1_release (volatile AO_t *p)
+{
+ return _Asm_fetchadd(AO_T_FASIZE, _SEM_REL, p, -1,
+ _LDHINT_NONE, _UP_MEM_FENCE);
+}
+#define AO_HAVE_fetch_and_sub1_release
+#endif /* !AO_PREFER_GENERALIZED */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ _Asm_mov_to_ar(_AREG_CCV, old_val, _DOWN_MEM_FENCE);
+ return _Asm_cmpxchg(AO_T_SIZE, _SEM_ACQ, addr,
+ new_val, _LDHINT_NONE, _DOWN_MEM_FENCE);
+}
+#define AO_HAVE_fetch_compare_and_swap_acquire
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ _Asm_mov_to_ar(_AREG_CCV, old_val, _UP_MEM_FENCE);
+ return _Asm_cmpxchg(AO_T_SIZE, _SEM_REL, addr,
+ new_val, _LDHINT_NONE, _UP_MEM_FENCE);
+}
+#define AO_HAVE_fetch_compare_and_swap_release
+
+AO_INLINE unsigned char
+AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr,
+ unsigned char old_val, unsigned char new_val)
+{
+ _Asm_mov_to_ar(_AREG_CCV, old_val, _DOWN_MEM_FENCE);
+ return _Asm_cmpxchg(_SZ_B, _SEM_ACQ, addr,
+ new_val, _LDHINT_NONE, _DOWN_MEM_FENCE);
+}
+#define AO_HAVE_char_fetch_compare_and_swap_acquire
+
+AO_INLINE unsigned char
+AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr,
+ unsigned char old_val, unsigned char new_val)
+{
+ _Asm_mov_to_ar(_AREG_CCV, old_val, _UP_MEM_FENCE);
+ return _Asm_cmpxchg(_SZ_B, _SEM_REL, addr,
+ new_val, _LDHINT_NONE, _UP_MEM_FENCE);
+}
+#define AO_HAVE_char_fetch_compare_and_swap_release
+
+AO_INLINE unsigned short
+AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr,
+ unsigned short old_val,
+ unsigned short new_val)
+{
+ _Asm_mov_to_ar(_AREG_CCV, old_val, _DOWN_MEM_FENCE);
+ return _Asm_cmpxchg(_SZ_B, _SEM_ACQ, addr,
+ new_val, _LDHINT_NONE, _DOWN_MEM_FENCE);
+}
+#define AO_HAVE_short_fetch_compare_and_swap_acquire
+
+AO_INLINE unsigned short
+AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr,
+ unsigned short old_val,
+ unsigned short new_val)
+{
+ _Asm_mov_to_ar(_AREG_CCV, old_val, _UP_MEM_FENCE);
+ return _Asm_cmpxchg(_SZ_B, _SEM_REL, addr,
+ new_val, _LDHINT_NONE, _UP_MEM_FENCE);
+}
+#define AO_HAVE_short_fetch_compare_and_swap_release
+
+#ifndef __LP64__
+# define AO_T_IS_INT
+#endif
+
+#undef AO_T_FASIZE
+#undef AO_T_SIZE
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ibmc/powerpc.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ibmc/powerpc.h
new file mode 100644
index 0000000000..a930b16794
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ibmc/powerpc.h
@@ -0,0 +1,183 @@
+
+/* Memory model documented at http://www-106.ibm.com/developerworks/ */
+/* eserver/articles/archguide.html and (clearer) */
+/* http://www-106.ibm.com/developerworks/eserver/articles/powerpc.html. */
+/* There appears to be no implicit ordering between any kind of */
+/* independent memory references. */
+/* Architecture enforces some ordering based on control dependence. */
+/* I don't know if that could help. */
+/* Data-dependent loads are always ordered. */
+/* Based on the above references, eieio is intended for use on */
+/* uncached memory, which we don't support. It does not order loads */
+/* from cached memory. */
+/* Thanks to Maged Michael, Doug Lea, and Roger Hoover for helping to */
+/* track some of this down and correcting my misunderstandings. -HB */
+
+#include "../all_aligned_atomic_load_store.h"
+
+#include "../test_and_set_t_is_ao_t.h"
+
+void AO_sync(void);
+#pragma mc_func AO_sync { "7c0004ac" }
+
+#ifdef __NO_LWSYNC__
+# define AO_lwsync AO_sync
+#else
+ void AO_lwsync(void);
+#pragma mc_func AO_lwsync { "7c2004ac" }
+#endif
+
+#define AO_nop_write() AO_lwsync()
+#define AO_HAVE_nop_write
+
+#define AO_nop_read() AO_lwsync()
+#define AO_HAVE_nop_read
+
+/* We explicitly specify load_acquire and store_release, since these */
+/* rely on the fact that lwsync is also a LoadStore barrier. */
+AO_INLINE AO_t
+AO_load_acquire(const volatile AO_t *addr)
+{
+ AO_t result = *addr;
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_load_acquire
+
+AO_INLINE void
+AO_store_release(volatile AO_t *addr, AO_t value)
+{
+ AO_lwsync();
+ *addr = value;
+}
+#define AO_HAVE_store_release
+
+#ifndef AO_PREFER_GENERALIZED
+/* This is similar to the code in the garbage collector. Deleting */
+/* this and having it synthesized from compare_and_swap would probably */
+/* only cost us a load immediate instruction. */
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set(volatile AO_TS_t *addr) {
+#if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__)
+/* Completely untested. And we should be using smaller objects anyway. */
+ unsigned long oldval;
+ unsigned long temp = 1; /* locked value */
+
+ __asm__ __volatile__(
+ "1:ldarx %0,0,%1\n" /* load and reserve */
+ "cmpdi %0, 0\n" /* if load is */
+ "bne 2f\n" /* non-zero, return already set */
+ "stdcx. %2,0,%1\n" /* else store conditional */
+ "bne- 1b\n" /* retry if lost reservation */
+ "2:\n" /* oldval is zero if we set */
+ : "=&r"(oldval)
+ : "r"(addr), "r"(temp)
+ : "memory", "cr0");
+#else
+ int oldval;
+ int temp = 1; /* locked value */
+
+ __asm__ __volatile__(
+ "1:lwarx %0,0,%1\n" /* load and reserve */
+ "cmpwi %0, 0\n" /* if load is */
+ "bne 2f\n" /* non-zero, return already set */
+ "stwcx. %2,0,%1\n" /* else store conditional */
+ "bne- 1b\n" /* retry if lost reservation */
+ "2:\n" /* oldval is zero if we set */
+ : "=&r"(oldval)
+ : "r"(addr), "r"(temp)
+ : "memory", "cr0");
+#endif
+ return (AO_TS_VAL_t)oldval;
+}
+#define AO_HAVE_test_and_set
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_acquire(volatile AO_TS_t *addr) {
+ AO_TS_VAL_t result = AO_test_and_set(addr);
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_test_and_set_acquire
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_release(volatile AO_TS_t *addr) {
+ AO_lwsync();
+ return AO_test_and_set(addr);
+}
+#define AO_HAVE_test_and_set_release
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t *addr) {
+ AO_TS_VAL_t result;
+ AO_lwsync();
+ result = AO_test_and_set(addr);
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_test_and_set_full
+#endif /* !AO_PREFER_GENERALIZED */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+{
+ AO_t fetched_val;
+# if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__)
+ __asm__ __volatile__(
+ "1:ldarx %0,0,%1\n" /* load and reserve */
+ "cmpd %0, %3\n" /* if load is not equal to */
+ "bne 2f\n" /* old_val, fail */
+ "stdcx. %2,0,%1\n" /* else store conditional */
+ "bne- 1b\n" /* retry if lost reservation */
+ "2:\n"
+ : "=&r"(fetched_val)
+ : "r"(addr), "r"(new_val), "r"(old_val)
+ : "memory", "cr0");
+# else
+ __asm__ __volatile__(
+ "1:lwarx %0,0,%1\n" /* load and reserve */
+ "cmpw %0, %3\n" /* if load is not equal to */
+ "bne 2f\n" /* old_val, fail */
+ "stwcx. %2,0,%1\n" /* else store conditional */
+ "bne- 1b\n" /* retry if lost reservation */
+ "2:\n"
+ : "=&r"(fetched_val)
+ : "r"(addr), "r"(new_val), "r"(old_val)
+ : "memory", "cr0");
+# endif
+ return fetched_val;
+}
+#define AO_HAVE_fetch_compare_and_swap
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val);
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_fetch_compare_and_swap_acquire
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ AO_lwsync();
+ return AO_fetch_compare_and_swap(addr, old_val, new_val);
+}
+#define AO_HAVE_fetch_compare_and_swap_release
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ AO_t result;
+ AO_lwsync();
+ result = AO_fetch_compare_and_swap(addr, old_val, new_val);
+ AO_lwsync();
+ return result;
+}
+#define AO_HAVE_fetch_compare_and_swap_full
+
+/* TODO: Implement AO_fetch_and_add, AO_and/or/xor directly. */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/icc/ia64.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/icc/ia64.h
new file mode 100644
index 0000000000..6654209dd4
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/icc/ia64.h
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 specifies Itanimum primitives for use with the Intel (ecc)
+ * compiler. We use intrinsics instead of the inline assembly code in the
+ * gcc file.
+ */
+
+#include "../all_atomic_load_store.h"
+
+#include "../test_and_set_t_is_char.h"
+
+#include <ia64intrin.h>
+
+/* The acquire release semantics of volatile can be turned off. And volatile */
+/* operations in icc9 don't imply ordering with respect to other nonvolatile */
+/* operations. */
+
+#define AO_INTEL_PTR_t void *
+
+AO_INLINE AO_t
+AO_load_acquire(const volatile AO_t *p)
+{
+ return (AO_t)(__ld8_acq((AO_INTEL_PTR_t)p));
+}
+#define AO_HAVE_load_acquire
+
+AO_INLINE void
+AO_store_release(volatile AO_t *p, AO_t val)
+{
+ __st8_rel((AO_INTEL_PTR_t)p, (__int64)val);
+}
+#define AO_HAVE_store_release
+
+AO_INLINE unsigned char
+AO_char_load_acquire(const volatile unsigned char *p)
+{
+ /* A normal volatile load generates an ld.acq */
+ return (__ld1_acq((AO_INTEL_PTR_t)p));
+}
+#define AO_HAVE_char_load_acquire
+
+AO_INLINE void
+AO_char_store_release(volatile unsigned char *p, unsigned char val)
+{
+ __st1_rel((AO_INTEL_PTR_t)p, val);
+}
+#define AO_HAVE_char_store_release
+
+AO_INLINE unsigned short
+AO_short_load_acquire(const volatile unsigned short *p)
+{
+ /* A normal volatile load generates an ld.acq */
+ return (__ld2_acq((AO_INTEL_PTR_t)p));
+}
+#define AO_HAVE_short_load_acquire
+
+AO_INLINE void
+AO_short_store_release(volatile unsigned short *p, unsigned short val)
+{
+ __st2_rel((AO_INTEL_PTR_t)p, val);
+}
+#define AO_HAVE_short_store_release
+
+AO_INLINE unsigned int
+AO_int_load_acquire(const volatile unsigned int *p)
+{
+ /* A normal volatile load generates an ld.acq */
+ return (__ld4_acq((AO_INTEL_PTR_t)p));
+}
+#define AO_HAVE_int_load_acquire
+
+AO_INLINE void
+AO_int_store_release(volatile unsigned int *p, unsigned int val)
+{
+ __st4_rel((AO_INTEL_PTR_t)p, val);
+}
+#define AO_HAVE_int_store_release
+
+AO_INLINE void
+AO_nop_full(void)
+{
+ __mf();
+}
+#define AO_HAVE_nop_full
+
+#ifndef AO_PREFER_GENERALIZED
+AO_INLINE AO_t
+AO_fetch_and_add1_acquire(volatile AO_t *p)
+{
+ return __fetchadd8_acq((unsigned __int64 *)p, 1);
+}
+#define AO_HAVE_fetch_and_add1_acquire
+
+AO_INLINE AO_t
+AO_fetch_and_add1_release(volatile AO_t *p)
+{
+ return __fetchadd8_rel((unsigned __int64 *)p, 1);
+}
+#define AO_HAVE_fetch_and_add1_release
+
+AO_INLINE AO_t
+AO_fetch_and_sub1_acquire(volatile AO_t *p)
+{
+ return __fetchadd8_acq((unsigned __int64 *)p, -1);
+}
+#define AO_HAVE_fetch_and_sub1_acquire
+
+AO_INLINE AO_t
+AO_fetch_and_sub1_release(volatile AO_t *p)
+{
+ return __fetchadd8_rel((unsigned __int64 *)p, -1);
+}
+#define AO_HAVE_fetch_and_sub1_release
+#endif /* !AO_PREFER_GENERALIZED */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ return _InterlockedCompareExchange64_acq(addr, new_val, old_val);
+}
+#define AO_HAVE_fetch_compare_and_swap_acquire
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ return _InterlockedCompareExchange64_rel(addr, new_val, old_val);
+}
+#define AO_HAVE_fetch_compare_and_swap_release
+
+AO_INLINE unsigned char
+AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr,
+ unsigned char old_val,
+ unsigned char new_val)
+{
+ return _InterlockedCompareExchange8_acq(addr, new_val, old_val);
+}
+#define AO_HAVE_char_fetch_compare_and_swap_acquire
+
+AO_INLINE unsigned char
+AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr,
+ unsigned char old_val,
+ unsigned char new_val)
+{
+ return _InterlockedCompareExchange8_rel(addr, new_val, old_val);
+}
+#define AO_HAVE_char_fetch_compare_and_swap_release
+
+AO_INLINE unsigned short
+AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr,
+ unsigned short old_val,
+ unsigned short new_val)
+{
+ return _InterlockedCompareExchange16_acq(addr, new_val, old_val);
+}
+#define AO_HAVE_short_fetch_compare_and_swap_acquire
+
+AO_INLINE unsigned short
+AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr,
+ unsigned short old_val,
+ unsigned short new_val)
+{
+ return _InterlockedCompareExchange16_rel(addr, new_val, old_val);
+}
+#define AO_HAVE_short_fetch_compare_and_swap_release
+
+AO_INLINE unsigned int
+AO_int_fetch_compare_and_swap_acquire(volatile unsigned int *addr,
+ unsigned int old_val,
+ unsigned int new_val)
+{
+ return _InterlockedCompareExchange_acq(addr, new_val, old_val);
+}
+#define AO_HAVE_int_fetch_compare_and_swap_acquire
+
+AO_INLINE unsigned int
+AO_int_fetch_compare_and_swap_release(volatile unsigned int *addr,
+ unsigned int old_val,
+ unsigned int new_val)
+{
+ return _InterlockedCompareExchange_rel(addr, new_val, old_val);
+}
+#define AO_HAVE_int_fetch_compare_and_swap_release
+
+#undef AO_INTEL_PTR_t
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.h
new file mode 100644
index 0000000000..2dd40ec9a3
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 adds definitions appropriate for environments in which */
+/* volatile load of a given type has acquire semantics, and volatile */
+/* store of a given type has release semantics. This is arguably */
+/* supposed to be true with the standard Itanium software conventions. */
+/* Empirically gcc/ia64 does some reordering of ordinary operations */
+/* around volatiles even when we think it should not. GCC v3.3 and */
+/* earlier could reorder a volatile store with another store. As of */
+/* March 2005, gcc pre-4 reuses some previously computed common */
+/* subexpressions across a volatile load; hence, we now add compiler */
+/* barriers for gcc. */
+
+#ifndef AO_HAVE_GCC_BARRIER
+ /* TODO: Check GCC version (if workaround not needed for modern GCC). */
+# if defined(__GNUC__)
+# define AO_GCC_BARRIER() AO_compiler_barrier()
+# else
+# define AO_GCC_BARRIER() (void)0
+# endif
+# define AO_HAVE_GCC_BARRIER
+#endif
+
+AO_INLINE AO_t
+AO_load_acquire(const volatile AO_t *addr)
+{
+ AO_t result = *addr;
+
+ /* A normal volatile load generates an ld.acq (on IA-64). */
+ AO_GCC_BARRIER();
+ return result;
+}
+#define AO_HAVE_load_acquire
+
+AO_INLINE void
+AO_store_release(volatile AO_t *addr, AO_t new_val)
+{
+ AO_GCC_BARRIER();
+ /* A normal volatile store generates an st.rel (on IA-64). */
+ *addr = new_val;
+}
+#define AO_HAVE_store_release
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.template b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.template
new file mode 100644
index 0000000000..0d83b530af
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.template
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 adds definitions appropriate for environments in which */
+/* volatile load of a given type has acquire semantics, and volatile */
+/* store of a given type has release semantics. This is arguably */
+/* supposed to be true with the standard Itanium software conventions. */
+/* Empirically gcc/ia64 does some reordering of ordinary operations */
+/* around volatiles even when we think it should not. GCC v3.3 and */
+/* earlier could reorder a volatile store with another store. As of */
+/* March 2005, gcc pre-4 reuses some previously computed common */
+/* subexpressions across a volatile load; hence, we now add compiler */
+/* barriers for gcc. */
+
+#ifndef AO_HAVE_GCC_BARRIER
+ /* TODO: Check GCC version (if workaround not needed for modern GCC). */
+# if defined(__GNUC__)
+# define AO_GCC_BARRIER() AO_compiler_barrier()
+# else
+# define AO_GCC_BARRIER() (void)0
+# endif
+# define AO_HAVE_GCC_BARRIER
+#endif
+
+AO_INLINE XCTYPE
+AO_XSIZE_load_acquire(const volatile XCTYPE *addr)
+{
+ XCTYPE result = *addr;
+
+ /* A normal volatile load generates an ld.acq (on IA-64). */
+ AO_GCC_BARRIER();
+ return result;
+}
+#define AO_HAVE_XSIZE_load_acquire
+
+AO_INLINE void
+AO_XSIZE_store_release(volatile XCTYPE *addr, XCTYPE new_val)
+{
+ AO_GCC_BARRIER();
+ /* A normal volatile store generates an st.rel (on IA-64). */
+ *addr = new_val;
+}
+#define AO_HAVE_XSIZE_store_release
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.h
new file mode 100644
index 0000000000..38c23e4090
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which loads of given type are */
+/* atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE AO_t
+AO_load(const volatile AO_t *addr)
+{
+# ifdef AO_ACCESS_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ /* Cast away the volatile for architectures like IA64 where */
+ /* volatile adds barrier (fence) semantics. */
+ return *(const AO_t *)addr;
+}
+#define AO_HAVE_load
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.template b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.template
new file mode 100644
index 0000000000..26b7e4e312
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.template
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which loads of given type are */
+/* atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE XCTYPE
+AO_XSIZE_load(const volatile XCTYPE *addr)
+{
+# ifdef AO_ACCESS_XSIZE_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ /* Cast away the volatile for architectures like IA64 where */
+ /* volatile adds barrier (fence) semantics. */
+ return *(const XCTYPE *)addr;
+}
+#define AO_HAVE_XSIZE_load
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.h
new file mode 100644
index 0000000000..9d5cf554f0
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which stores of given type are */
+/* atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE void
+AO_store(volatile AO_t *addr, AO_t new_val)
+{
+# ifdef AO_ACCESS_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ *(AO_t *)addr = new_val;
+}
+#define AO_HAVE_store
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.template b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.template
new file mode 100644
index 0000000000..56bba45df9
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.template
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which stores of given type are */
+/* atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE void
+AO_XSIZE_store(volatile XCTYPE *addr, XCTYPE new_val)
+{
+# ifdef AO_ACCESS_XSIZE_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ *(XCTYPE *)addr = new_val;
+}
+#define AO_HAVE_XSIZE_store
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h
new file mode 100644
index 0000000000..9c78b8561b
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 adds definitions appropriate for environments in which */
+/* volatile load of a given type has acquire semantics, and volatile */
+/* store of a given type has release semantics. This is arguably */
+/* supposed to be true with the standard Itanium software conventions. */
+/* Empirically gcc/ia64 does some reordering of ordinary operations */
+/* around volatiles even when we think it should not. GCC v3.3 and */
+/* earlier could reorder a volatile store with another store. As of */
+/* March 2005, gcc pre-4 reuses some previously computed common */
+/* subexpressions across a volatile load; hence, we now add compiler */
+/* barriers for gcc. */
+
+#ifndef AO_HAVE_GCC_BARRIER
+ /* TODO: Check GCC version (if workaround not needed for modern GCC). */
+# if defined(__GNUC__)
+# define AO_GCC_BARRIER() AO_compiler_barrier()
+# else
+# define AO_GCC_BARRIER() (void)0
+# endif
+# define AO_HAVE_GCC_BARRIER
+#endif
+
+AO_INLINE unsigned/**/char
+AO_char_load_acquire(const volatile unsigned/**/char *addr)
+{
+ unsigned/**/char result = *addr;
+
+ /* A normal volatile load generates an ld.acq (on IA-64). */
+ AO_GCC_BARRIER();
+ return result;
+}
+#define AO_HAVE_char_load_acquire
+
+AO_INLINE void
+AO_char_store_release(volatile unsigned/**/char *addr, unsigned/**/char new_val)
+{
+ AO_GCC_BARRIER();
+ /* A normal volatile store generates an st.rel (on IA-64). */
+ *addr = new_val;
+}
+#define AO_HAVE_char_store_release
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_load.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_load.h
new file mode 100644
index 0000000000..8927b7d5e6
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_load.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which loads of given type are */
+/* atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE unsigned/**/char
+AO_char_load(const volatile unsigned/**/char *addr)
+{
+# ifdef AO_ACCESS_char_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ /* Cast away the volatile for architectures like IA64 where */
+ /* volatile adds barrier (fence) semantics. */
+ return *(const unsigned/**/char *)addr;
+}
+#define AO_HAVE_char_load
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_store.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_store.h
new file mode 100644
index 0000000000..f1fa8954d4
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_store.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which stores of given type are */
+/* atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE void
+AO_char_store(volatile unsigned/**/char *addr, unsigned/**/char new_val)
+{
+# ifdef AO_ACCESS_char_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ *(unsigned/**/char *)addr = new_val;
+}
+#define AO_HAVE_char_store
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/double_atomic_load_store.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/double_atomic_load_store.h
new file mode 100644
index 0000000000..85debd056d
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/double_atomic_load_store.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2013 Ivan Maidanski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which AO_double_t loads and stores */
+/* are atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE AO_double_t
+AO_double_load(const volatile AO_double_t *addr)
+{
+ AO_double_t result;
+
+# ifdef AO_ACCESS_double_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ /* Cast away the volatile in case it adds fence semantics. */
+ result.AO_whole = ((const AO_double_t *)addr)->AO_whole;
+ return result;
+}
+#define AO_HAVE_double_load
+
+AO_INLINE void
+AO_double_store(volatile AO_double_t *addr, AO_double_t new_val)
+{
+# ifdef AO_ACCESS_double_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ ((AO_double_t *)addr)->AO_whole = new_val.AO_whole;
+}
+#define AO_HAVE_double_store
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h
new file mode 100644
index 0000000000..13f2fe65d7
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 adds definitions appropriate for environments in which */
+/* volatile load of a given type has acquire semantics, and volatile */
+/* store of a given type has release semantics. This is arguably */
+/* supposed to be true with the standard Itanium software conventions. */
+/* Empirically gcc/ia64 does some reordering of ordinary operations */
+/* around volatiles even when we think it should not. GCC v3.3 and */
+/* earlier could reorder a volatile store with another store. As of */
+/* March 2005, gcc pre-4 reuses some previously computed common */
+/* subexpressions across a volatile load; hence, we now add compiler */
+/* barriers for gcc. */
+
+#ifndef AO_HAVE_GCC_BARRIER
+ /* TODO: Check GCC version (if workaround not needed for modern GCC). */
+# if defined(__GNUC__)
+# define AO_GCC_BARRIER() AO_compiler_barrier()
+# else
+# define AO_GCC_BARRIER() (void)0
+# endif
+# define AO_HAVE_GCC_BARRIER
+#endif
+
+AO_INLINE unsigned
+AO_int_load_acquire(const volatile unsigned *addr)
+{
+ unsigned result = *addr;
+
+ /* A normal volatile load generates an ld.acq (on IA-64). */
+ AO_GCC_BARRIER();
+ return result;
+}
+#define AO_HAVE_int_load_acquire
+
+AO_INLINE void
+AO_int_store_release(volatile unsigned *addr, unsigned new_val)
+{
+ AO_GCC_BARRIER();
+ /* A normal volatile store generates an st.rel (on IA-64). */
+ *addr = new_val;
+}
+#define AO_HAVE_int_store_release
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_load.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_load.h
new file mode 100644
index 0000000000..ecc4b3a7cf
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_load.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which loads of given type are */
+/* atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE unsigned
+AO_int_load(const volatile unsigned *addr)
+{
+# ifdef AO_ACCESS_int_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ /* Cast away the volatile for architectures like IA64 where */
+ /* volatile adds barrier (fence) semantics. */
+ return *(const unsigned *)addr;
+}
+#define AO_HAVE_int_load
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_store.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_store.h
new file mode 100644
index 0000000000..3c32b306e7
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_store.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which stores of given type are */
+/* atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE void
+AO_int_store(volatile unsigned *addr, unsigned new_val)
+{
+# ifdef AO_ACCESS_int_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ *(unsigned *)addr = new_val;
+}
+#define AO_HAVE_int_store
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.h
new file mode 100644
index 0000000000..a64cfafc7e
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_char_load
+ /* char_load_read is defined in generalize-small. */
+# define AO_char_load_acquire(addr) AO_char_load_read(addr)
+# define AO_HAVE_char_load_acquire
+#endif
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_short_load
+ /* short_load_read is defined in generalize-small. */
+# define AO_short_load_acquire(addr) AO_short_load_read(addr)
+# define AO_HAVE_short_load_acquire
+#endif
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_int_load
+ /* int_load_read is defined in generalize-small. */
+# define AO_int_load_acquire(addr) AO_int_load_read(addr)
+# define AO_HAVE_int_load_acquire
+#endif
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_load
+ /* load_read is defined in generalize-small. */
+# define AO_load_acquire(addr) AO_load_read(addr)
+# define AO_HAVE_load_acquire
+#endif
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_double_load
+ /* double_load_read is defined in generalize-small. */
+# define AO_double_load_acquire(addr) AO_double_load_read(addr)
+# define AO_HAVE_double_load_acquire
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.template b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.template
new file mode 100644
index 0000000000..45c5c1d581
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.template
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_XSIZE_load
+ /* XSIZE_load_read is defined in generalize-small. */
+# define AO_XSIZE_load_acquire(addr) AO_XSIZE_load_read(addr)
+# define AO_HAVE_XSIZE_load_acquire
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.h
new file mode 100644
index 0000000000..a427f3bd85
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_char_store
+# define AO_char_store_release(addr, val) \
+ (AO_nop_write(), AO_char_store(addr, val))
+# define AO_HAVE_char_store_release
+#endif
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_short_store
+# define AO_short_store_release(addr, val) \
+ (AO_nop_write(), AO_short_store(addr, val))
+# define AO_HAVE_short_store_release
+#endif
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_int_store
+# define AO_int_store_release(addr, val) \
+ (AO_nop_write(), AO_int_store(addr, val))
+# define AO_HAVE_int_store_release
+#endif
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_store
+# define AO_store_release(addr, val) \
+ (AO_nop_write(), AO_store(addr, val))
+# define AO_HAVE_store_release
+#endif
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_double_store
+# define AO_double_store_release(addr, val) \
+ (AO_nop_write(), AO_double_store(addr, val))
+# define AO_HAVE_double_store_release
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.template b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.template
new file mode 100644
index 0000000000..c51abc5d2e
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.template
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifdef AO_HAVE_XSIZE_store
+# define AO_XSIZE_store_release(addr, val) \
+ (AO_nop_write(), AO_XSIZE_store(addr, val))
+# define AO_HAVE_XSIZE_store_release
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h
new file mode 100644
index 0000000000..a7a611f0ff
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 adds definitions appropriate for environments in which */
+/* volatile load of a given type has acquire semantics, and volatile */
+/* store of a given type has release semantics. This is arguably */
+/* supposed to be true with the standard Itanium software conventions. */
+/* Empirically gcc/ia64 does some reordering of ordinary operations */
+/* around volatiles even when we think it should not. GCC v3.3 and */
+/* earlier could reorder a volatile store with another store. As of */
+/* March 2005, gcc pre-4 reuses some previously computed common */
+/* subexpressions across a volatile load; hence, we now add compiler */
+/* barriers for gcc. */
+
+#ifndef AO_HAVE_GCC_BARRIER
+ /* TODO: Check GCC version (if workaround not needed for modern GCC). */
+# if defined(__GNUC__)
+# define AO_GCC_BARRIER() AO_compiler_barrier()
+# else
+# define AO_GCC_BARRIER() (void)0
+# endif
+# define AO_HAVE_GCC_BARRIER
+#endif
+
+AO_INLINE unsigned/**/short
+AO_short_load_acquire(const volatile unsigned/**/short *addr)
+{
+ unsigned/**/short result = *addr;
+
+ /* A normal volatile load generates an ld.acq (on IA-64). */
+ AO_GCC_BARRIER();
+ return result;
+}
+#define AO_HAVE_short_load_acquire
+
+AO_INLINE void
+AO_short_store_release(volatile unsigned/**/short *addr, unsigned/**/short new_val)
+{
+ AO_GCC_BARRIER();
+ /* A normal volatile store generates an st.rel (on IA-64). */
+ *addr = new_val;
+}
+#define AO_HAVE_short_store_release
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_load.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_load.h
new file mode 100644
index 0000000000..2370540ba4
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_load.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which loads of given type are */
+/* atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE unsigned/**/short
+AO_short_load(const volatile unsigned/**/short *addr)
+{
+# ifdef AO_ACCESS_short_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ /* Cast away the volatile for architectures like IA64 where */
+ /* volatile adds barrier (fence) semantics. */
+ return *(const unsigned/**/short *)addr;
+}
+#define AO_HAVE_short_load
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_store.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_store.h
new file mode 100644
index 0000000000..b9a9dc6e8e
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_store.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Definitions for architectures on which stores of given type are */
+/* atomic (either for suitably aligned data only or for any legal */
+/* alignment). */
+
+AO_INLINE void
+AO_short_store(volatile unsigned/**/short *addr, unsigned/**/short new_val)
+{
+# ifdef AO_ACCESS_short_CHECK_ALIGNED
+ AO_ASSERT_ADDR_ALIGNED(addr);
+# endif
+ *(unsigned/**/short *)addr = new_val;
+}
+#define AO_HAVE_short_store
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm.h
new file mode 100644
index 0000000000..0458cddcbe
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2009-2021 Ivan Maidanski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Some ARM slide set, if it has been read correctly, claims that Loads */
+/* followed by either a Load or a Store are ordered, but nothing else. */
+/* It is assumed that Windows interrupt handlers clear the LL/SC flag. */
+/* Unaligned accesses are not guaranteed to be atomic. */
+#include "../all_aligned_atomic_load_store.h"
+
+#define AO_T_IS_INT
+
+#ifndef AO_ASSUME_WINDOWS98
+ /* CAS is always available */
+# define AO_ASSUME_WINDOWS98
+#endif
+#include "common32_defs.h"
+
+/* If only a single processor is used, we can define AO_UNIPROCESSOR. */
+#ifdef AO_UNIPROCESSOR
+ AO_INLINE void AO_nop_full(void)
+ {
+ AO_compiler_barrier();
+ }
+# define AO_HAVE_nop_full
+#else
+ /* AO_nop_full() is emulated using AO_test_and_set_full(). */
+#endif
+
+#ifndef AO_HAVE_test_and_set_full
+# include "../test_and_set_t_is_ao_t.h"
+ /* AO_test_and_set_full() is emulated. */
+#endif
+
+#if _M_ARM >= 7 && !defined(AO_NO_DOUBLE_CAS)
+
+# include "../standard_ao_double_t.h"
+
+/* These intrinsics are supposed to use LDREXD/STREXD. */
+# pragma intrinsic (_InterlockedCompareExchange64)
+# pragma intrinsic (_InterlockedCompareExchange64_acq)
+# pragma intrinsic (_InterlockedCompareExchange64_nf)
+# pragma intrinsic (_InterlockedCompareExchange64_rel)
+
+ AO_INLINE int
+ AO_double_compare_and_swap(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ AO_ASSERT_ADDR_ALIGNED(addr);
+ return (double_ptr_storage)_InterlockedCompareExchange64_nf(
+ (__int64 volatile *)addr,
+ new_val.AO_whole /* exchange */,
+ old_val.AO_whole) == old_val.AO_whole;
+ }
+# define AO_HAVE_double_compare_and_swap
+
+ AO_INLINE int
+ AO_double_compare_and_swap_acquire(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ AO_ASSERT_ADDR_ALIGNED(addr);
+ return (double_ptr_storage)_InterlockedCompareExchange64_acq(
+ (__int64 volatile *)addr,
+ new_val.AO_whole /* exchange */,
+ old_val.AO_whole) == old_val.AO_whole;
+ }
+# define AO_HAVE_double_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_double_compare_and_swap_release(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ AO_ASSERT_ADDR_ALIGNED(addr);
+ return (double_ptr_storage)_InterlockedCompareExchange64_rel(
+ (__int64 volatile *)addr,
+ new_val.AO_whole /* exchange */,
+ old_val.AO_whole) == old_val.AO_whole;
+ }
+# define AO_HAVE_double_compare_and_swap_release
+
+ AO_INLINE int
+ AO_double_compare_and_swap_full(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ AO_ASSERT_ADDR_ALIGNED(addr);
+ return (double_ptr_storage)_InterlockedCompareExchange64(
+ (__int64 volatile *)addr,
+ new_val.AO_whole /* exchange */,
+ old_val.AO_whole) == old_val.AO_whole;
+ }
+# define AO_HAVE_double_compare_and_swap_full
+
+#endif /* _M_ARM >= 7 && !AO_NO_DOUBLE_CAS */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm64.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm64.h
new file mode 100644
index 0000000000..367042af6c
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm64.h
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2021 Ivan Maidanski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 "../all_aligned_atomic_load_store.h"
+
+#ifndef AO_ASSUME_WINDOWS98
+# define AO_ASSUME_WINDOWS98
+#endif
+#ifndef AO_USE_INTERLOCKED_INTRINSICS
+# define AO_USE_INTERLOCKED_INTRINSICS
+#endif
+#include "common32_defs.h"
+
+#ifndef AO_HAVE_test_and_set_full
+# include "../test_and_set_t_is_ao_t.h"
+ /* AO_test_and_set_full() is emulated using word-wide CAS. */
+#endif
+
+#ifndef AO_NO_DOUBLE_CAS
+
+# include "../standard_ao_double_t.h"
+
+# pragma intrinsic (_InterlockedCompareExchange128)
+# pragma intrinsic (_InterlockedCompareExchange128_acq)
+# pragma intrinsic (_InterlockedCompareExchange128_nf)
+# pragma intrinsic (_InterlockedCompareExchange128_rel)
+
+ AO_INLINE int
+ AO_compare_double_and_swap_double(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ __int64 comparandResult[2];
+
+ AO_ASSERT_ADDR_ALIGNED(addr);
+ comparandResult[0] = old_val1; /* low */
+ comparandResult[1] = old_val2; /* high */
+ return _InterlockedCompareExchange128_nf((volatile __int64 *)addr,
+ new_val2 /* high */,
+ new_val1 /* low */,
+ comparandResult);
+ }
+# define AO_HAVE_compare_double_and_swap_double
+
+ AO_INLINE int
+ AO_compare_double_and_swap_double_acquire(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ __int64 comparandResult[2];
+
+ AO_ASSERT_ADDR_ALIGNED(addr);
+ comparandResult[0] = old_val1; /* low */
+ comparandResult[1] = old_val2; /* high */
+ return _InterlockedCompareExchange128_acq((volatile __int64 *)addr,
+ new_val2 /* high */,
+ new_val1 /* low */,
+ comparandResult);
+ }
+# define AO_HAVE_compare_double_and_swap_double_acquire
+
+ AO_INLINE int
+ AO_compare_double_and_swap_double_release(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ __int64 comparandResult[2];
+
+ AO_ASSERT_ADDR_ALIGNED(addr);
+ comparandResult[0] = old_val1; /* low */
+ comparandResult[1] = old_val2; /* high */
+ return _InterlockedCompareExchange128_rel((volatile __int64 *)addr,
+ new_val2 /* high */,
+ new_val1 /* low */,
+ comparandResult);
+ }
+# define AO_HAVE_compare_double_and_swap_double_release
+
+ AO_INLINE int
+ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ __int64 comparandResult[2];
+
+ AO_ASSERT_ADDR_ALIGNED(addr);
+ comparandResult[0] = old_val1; /* low */
+ comparandResult[1] = old_val2; /* high */
+ return _InterlockedCompareExchange128((volatile __int64 *)addr,
+ new_val2 /* high */,
+ new_val1 /* low */,
+ comparandResult);
+ }
+# define AO_HAVE_compare_double_and_swap_double_full
+
+#endif /* !AO_NO_DOUBLE_CAS */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/common32_defs.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/common32_defs.h
new file mode 100644
index 0000000000..ece41f743e
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/common32_defs.h
@@ -0,0 +1,1197 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2009-2021 Ivan Maidanski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 contains AO primitives based on VC++ built-in intrinsic */
+/* functions commonly available across 32- and 64-bit architectures. */
+
+/* This file should be included from arch-specific header files. */
+/* Define AO_USE_INTERLOCKED_INTRINSICS if _Interlocked primitives */
+/* (used below) are available as intrinsic ones for a target arch */
+/* (otherwise "Interlocked" functions family is used instead). */
+/* Define AO_ASSUME_WINDOWS98 if CAS is available. */
+
+#if _MSC_VER <= 1400 || !defined(AO_USE_INTERLOCKED_INTRINSICS) \
+ || defined(_WIN32_WCE)
+# include <windows.h>
+ /* Seems like over-kill, but that's what MSDN recommends. */
+ /* And apparently winbase.h is not always self-contained. */
+ /* Optionally, client could define WIN32_LEAN_AND_MEAN before */
+ /* include atomic_ops.h to reduce amount of Windows internal */
+ /* headers included by windows.h one. */
+#endif
+
+#if _MSC_VER < 1310 || !defined(AO_USE_INTERLOCKED_INTRINSICS)
+
+# define _InterlockedIncrement InterlockedIncrement
+# define _InterlockedDecrement InterlockedDecrement
+# define _InterlockedExchangeAdd InterlockedExchangeAdd
+# define _InterlockedCompareExchange InterlockedCompareExchange
+
+# define AO_INTERLOCKED_VOLATILE /**/
+
+#else /* elif _MSC_VER >= 1310 */
+
+# if _MSC_VER >= 1400
+# ifndef _WIN32_WCE
+# include <intrin.h>
+# endif
+
+# else /* elif _MSC_VER < 1400 */
+# ifdef __cplusplus
+ extern "C" {
+# endif
+ LONG __cdecl _InterlockedIncrement(LONG volatile *);
+ LONG __cdecl _InterlockedDecrement(LONG volatile *);
+ LONG __cdecl _InterlockedExchangeAdd(LONG volatile *, LONG);
+ LONG __cdecl _InterlockedCompareExchange(LONG volatile *,
+ LONG /* Exchange */, LONG /* Comp */);
+# ifdef __cplusplus
+ } /* extern "C" */
+# endif
+# endif /* _MSC_VER < 1400 */
+
+# if !defined(AO_PREFER_GENERALIZED) || !defined(AO_ASSUME_WINDOWS98)
+# pragma intrinsic (_InterlockedIncrement)
+# pragma intrinsic (_InterlockedDecrement)
+# pragma intrinsic (_InterlockedExchangeAdd)
+# ifndef AO_T_IS_INT
+# pragma intrinsic (_InterlockedIncrement64)
+# pragma intrinsic (_InterlockedDecrement64)
+# pragma intrinsic (_InterlockedExchangeAdd64)
+# endif
+# endif /* !AO_PREFER_GENERALIZED */
+
+# pragma intrinsic (_InterlockedCompareExchange)
+# ifndef AO_T_IS_INT
+# pragma intrinsic (_InterlockedCompareExchange64)
+# endif
+
+# define AO_INTERLOCKED_VOLATILE volatile
+
+#endif /* _MSC_VER >= 1310 */
+
+#if !defined(AO_PREFER_GENERALIZED) || !defined(AO_ASSUME_WINDOWS98)
+ AO_INLINE AO_t
+ AO_fetch_and_add_full(volatile AO_t *p, AO_t incr)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedExchangeAdd((long AO_INTERLOCKED_VOLATILE *)p, incr);
+# else
+ return _InterlockedExchangeAdd64((__int64 volatile *)p, incr);
+# endif
+ }
+# define AO_HAVE_fetch_and_add_full
+
+ AO_INLINE AO_t
+ AO_fetch_and_add1_full(volatile AO_t *p)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedIncrement((long AO_INTERLOCKED_VOLATILE *)p) - 1;
+# else
+ return _InterlockedIncrement64((__int64 volatile *)p) - 1;
+# endif
+ }
+# define AO_HAVE_fetch_and_add1_full
+
+ AO_INLINE AO_t
+ AO_fetch_and_sub1_full(volatile AO_t *p)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedDecrement((long AO_INTERLOCKED_VOLATILE *)p) + 1;
+# else
+ return _InterlockedDecrement64((__int64 volatile *)p) + 1;
+# endif
+ }
+# define AO_HAVE_fetch_and_sub1_full
+
+# ifndef AO_T_IS_INT
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add_full(volatile unsigned int *p, unsigned int incr)
+ {
+ return _InterlockedExchangeAdd((long volatile *)p, incr);
+ }
+# define AO_HAVE_int_fetch_and_add_full
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add1_full(volatile unsigned int *p)
+ {
+ return _InterlockedIncrement((long volatile *)p) - 1;
+ }
+# define AO_HAVE_int_fetch_and_add1_full
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_sub1_full(volatile unsigned int *p)
+ {
+ return _InterlockedDecrement((long volatile *)p) + 1;
+ }
+# define AO_HAVE_int_fetch_and_sub1_full
+# endif /* !AO_T_IS_INT */
+#endif /* !AO_PREFER_GENERALIZED */
+
+#ifdef AO_ASSUME_WINDOWS98
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+# ifndef AO_T_IS_INT
+ return (AO_t)_InterlockedCompareExchange64((__int64 volatile *)addr,
+ new_val, old_val);
+# elif defined(AO_OLD_STYLE_INTERLOCKED_COMPARE_EXCHANGE)
+ return (AO_t)_InterlockedCompareExchange(
+ (void *AO_INTERLOCKED_VOLATILE *)addr,
+ (void *)new_val, (void *)old_val);
+# else
+ return _InterlockedCompareExchange((long AO_INTERLOCKED_VOLATILE *)addr,
+ new_val, old_val);
+# endif
+ }
+# define AO_HAVE_fetch_compare_and_swap_full
+
+# ifndef AO_T_IS_INT
+ AO_INLINE unsigned int
+ AO_int_fetch_compare_and_swap_full(volatile unsigned int *addr,
+ unsigned int old_val,
+ unsigned int new_val)
+ {
+ return _InterlockedCompareExchange((long volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_full
+# endif /* !AO_T_IS_INT */
+#endif /* AO_ASSUME_WINDOWS98 */
+
+#if (_MSC_VER > 1400) && (!defined(_M_ARM) || _MSC_VER >= 1800)
+
+# if _MSC_VER < 1800 || !defined(AO_PREFER_GENERALIZED)
+# pragma intrinsic (_InterlockedAnd8)
+# pragma intrinsic (_InterlockedOr8)
+# pragma intrinsic (_InterlockedXor8)
+
+ AO_INLINE void
+ AO_char_and_full(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedAnd8((char volatile *)p, value);
+ }
+# define AO_HAVE_char_and_full
+
+ AO_INLINE void
+ AO_char_or_full(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedOr8((char volatile *)p, value);
+ }
+# define AO_HAVE_char_or_full
+
+ AO_INLINE void
+ AO_char_xor_full(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedXor8((char volatile *)p, value);
+ }
+# define AO_HAVE_char_xor_full
+# endif /* _MSC_VER < 1800 || !AO_PREFER_GENERALIZED */
+
+# pragma intrinsic (_InterlockedCompareExchange16)
+
+ AO_INLINE unsigned short
+ AO_short_fetch_compare_and_swap_full(volatile unsigned short *addr,
+ unsigned short old_val,
+ unsigned short new_val)
+ {
+ return _InterlockedCompareExchange16((short volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_full
+
+# ifndef AO_PREFER_GENERALIZED
+# pragma intrinsic (_InterlockedIncrement16)
+# pragma intrinsic (_InterlockedDecrement16)
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add1_full(volatile unsigned short *p)
+ {
+ return _InterlockedIncrement16((short volatile *)p) - 1;
+ }
+# define AO_HAVE_short_fetch_and_add1_full
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_sub1_full(volatile unsigned short *p)
+ {
+ return _InterlockedDecrement16((short volatile *)p) + 1;
+ }
+# define AO_HAVE_short_fetch_and_sub1_full
+# endif /* !AO_PREFER_GENERALIZED */
+
+#endif /* _MSC_VER > 1400 */
+
+#if _MSC_VER >= 1800 /* Visual Studio 2013+ */
+
+# ifndef AO_PREFER_GENERALIZED
+# pragma intrinsic (_InterlockedAnd16)
+# pragma intrinsic (_InterlockedOr16)
+# pragma intrinsic (_InterlockedXor16)
+
+ AO_INLINE void
+ AO_short_and_full(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedAnd16((short volatile *)p, value);
+ }
+# define AO_HAVE_short_and_full
+
+ AO_INLINE void
+ AO_short_or_full(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedOr16((short volatile *)p, value);
+ }
+# define AO_HAVE_short_or_full
+
+ AO_INLINE void
+ AO_short_xor_full(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedXor16((short volatile *)p, value);
+ }
+# define AO_HAVE_short_xor_full
+
+# pragma intrinsic (_InterlockedAnd)
+# pragma intrinsic (_InterlockedOr)
+# pragma intrinsic (_InterlockedXor)
+
+# ifndef AO_T_IS_INT
+ AO_INLINE void
+ AO_int_and_full(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedAnd((long volatile *)p, value);
+ }
+# define AO_HAVE_int_and_full
+
+ AO_INLINE void
+ AO_int_or_full(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedOr((long volatile *)p, value);
+ }
+# define AO_HAVE_int_or_full
+
+ AO_INLINE void
+ AO_int_xor_full(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedXor((long volatile *)p, value);
+ }
+# define AO_HAVE_int_xor_full
+
+# pragma intrinsic (_InterlockedAnd64)
+# pragma intrinsic (_InterlockedOr64)
+# pragma intrinsic (_InterlockedXor64)
+# endif /* !AO_T_IS_INT */
+
+ AO_INLINE void
+ AO_and_full(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedAnd((long volatile *)p, value);
+# else
+ (void)_InterlockedAnd64((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_and_full
+
+ AO_INLINE void
+ AO_or_full(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedOr((long volatile *)p, value);
+# else
+ (void)_InterlockedOr64((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_or_full
+
+ AO_INLINE void
+ AO_xor_full(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedXor((long volatile *)p, value);
+# else
+ (void)_InterlockedXor64((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_xor_full
+# endif /* !AO_PREFER_GENERALIZED */
+
+# if !defined(AO_PREFER_GENERALIZED) && (defined(_M_ARM) || defined(_M_ARM64))
+# pragma intrinsic (_InterlockedAnd8_acq)
+# pragma intrinsic (_InterlockedAnd8_nf)
+# pragma intrinsic (_InterlockedAnd8_rel)
+# pragma intrinsic (_InterlockedOr8_acq)
+# pragma intrinsic (_InterlockedOr8_nf)
+# pragma intrinsic (_InterlockedOr8_rel)
+# pragma intrinsic (_InterlockedXor8_acq)
+# pragma intrinsic (_InterlockedXor8_nf)
+# pragma intrinsic (_InterlockedXor8_rel)
+
+ AO_INLINE void
+ AO_char_and(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedAnd8_nf((char volatile *)p, value);
+ }
+# define AO_HAVE_char_and
+
+ AO_INLINE void
+ AO_char_or(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedOr8_nf((char volatile *)p, value);
+ }
+# define AO_HAVE_char_or
+
+ AO_INLINE void
+ AO_char_xor(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedXor8_nf((char volatile *)p, value);
+ }
+# define AO_HAVE_char_xor
+
+ AO_INLINE void
+ AO_char_and_acquire(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedAnd8_acq((char volatile *)p, value);
+ }
+# define AO_HAVE_char_and_acquire
+
+ AO_INLINE void
+ AO_char_or_acquire(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedOr8_acq((char volatile *)p, value);
+ }
+# define AO_HAVE_char_or_acquire
+
+ AO_INLINE void
+ AO_char_xor_acquire(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedXor8_acq((char volatile *)p, value);
+ }
+# define AO_HAVE_char_xor_acquire
+
+ AO_INLINE void
+ AO_char_and_release(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedAnd8_rel((char volatile *)p, value);
+ }
+# define AO_HAVE_char_and_release
+
+ AO_INLINE void
+ AO_char_or_release(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedOr8_rel((char volatile *)p, value);
+ }
+# define AO_HAVE_char_or_release
+
+ AO_INLINE void
+ AO_char_xor_release(volatile unsigned char *p, unsigned char value)
+ {
+ _InterlockedXor8_rel((char volatile *)p, value);
+ }
+# define AO_HAVE_char_xor_release
+
+# pragma intrinsic (_InterlockedAnd16_acq)
+# pragma intrinsic (_InterlockedAnd16_nf)
+# pragma intrinsic (_InterlockedAnd16_rel)
+# pragma intrinsic (_InterlockedOr16_acq)
+# pragma intrinsic (_InterlockedOr16_nf)
+# pragma intrinsic (_InterlockedOr16_rel)
+# pragma intrinsic (_InterlockedXor16_acq)
+# pragma intrinsic (_InterlockedXor16_nf)
+# pragma intrinsic (_InterlockedXor16_rel)
+
+ AO_INLINE void
+ AO_short_and(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedAnd16_nf((short volatile *)p, value);
+ }
+# define AO_HAVE_short_and
+
+ AO_INLINE void
+ AO_short_or(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedOr16_nf((short volatile *)p, value);
+ }
+# define AO_HAVE_short_or
+
+ AO_INLINE void
+ AO_short_xor(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedXor16_nf((short volatile *)p, value);
+ }
+# define AO_HAVE_short_xor
+
+ AO_INLINE void
+ AO_short_and_acquire(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedAnd16_acq((short volatile *)p, value);
+ }
+# define AO_HAVE_short_and_acquire
+
+ AO_INLINE void
+ AO_short_or_acquire(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedOr16_acq((short volatile *)p, value);
+ }
+# define AO_HAVE_short_or_acquire
+
+ AO_INLINE void
+ AO_short_xor_acquire(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedXor16_acq((short volatile *)p, value);
+ }
+# define AO_HAVE_short_xor_acquire
+
+ AO_INLINE void
+ AO_short_and_release(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedAnd16_rel((short volatile *)p, value);
+ }
+# define AO_HAVE_short_and_release
+
+ AO_INLINE void
+ AO_short_or_release(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedOr16_rel((short volatile *)p, value);
+ }
+# define AO_HAVE_short_or_release
+
+ AO_INLINE void
+ AO_short_xor_release(volatile unsigned short *p, unsigned short value)
+ {
+ (void)_InterlockedXor16_rel((short volatile *)p, value);
+ }
+# define AO_HAVE_short_xor_release
+
+# pragma intrinsic (_InterlockedAnd_acq)
+# pragma intrinsic (_InterlockedAnd_nf)
+# pragma intrinsic (_InterlockedAnd_rel)
+# pragma intrinsic (_InterlockedOr_acq)
+# pragma intrinsic (_InterlockedOr_nf)
+# pragma intrinsic (_InterlockedOr_rel)
+# pragma intrinsic (_InterlockedXor_acq)
+# pragma intrinsic (_InterlockedXor_nf)
+# pragma intrinsic (_InterlockedXor_rel)
+
+# ifndef AO_T_IS_INT
+ AO_INLINE void
+ AO_int_and(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedAnd_nf((long volatile *)p, value);
+ }
+# define AO_HAVE_int_and
+
+ AO_INLINE void
+ AO_int_or(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedOr_nf((long volatile *)p, value);
+ }
+# define AO_HAVE_int_or
+
+ AO_INLINE void
+ AO_int_xor(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedXor_nf((long volatile *)p, value);
+ }
+# define AO_HAVE_int_xor
+
+ AO_INLINE void
+ AO_int_and_acquire(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedAnd_acq((long volatile *)p, value);
+ }
+# define AO_HAVE_int_and_acquire
+
+ AO_INLINE void
+ AO_int_or_acquire(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedOr_acq((long volatile *)p, value);
+ }
+# define AO_HAVE_int_or_acquire
+
+ AO_INLINE void
+ AO_int_xor_acquire(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedXor_acq((long volatile *)p, value);
+ }
+# define AO_HAVE_int_xor_acquire
+
+ AO_INLINE void
+ AO_int_and_release(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedAnd_rel((long volatile *)p, value);
+ }
+# define AO_HAVE_int_and_release
+
+ AO_INLINE void
+ AO_int_or_release(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedOr_rel((long volatile *)p, value);
+ }
+# define AO_HAVE_int_or_release
+
+ AO_INLINE void
+ AO_int_xor_release(volatile unsigned int *p, unsigned int value)
+ {
+ (void)_InterlockedXor_rel((long volatile *)p, value);
+ }
+# define AO_HAVE_int_xor_release
+
+# pragma intrinsic (_InterlockedAnd64_acq)
+# pragma intrinsic (_InterlockedAnd64_nf)
+# pragma intrinsic (_InterlockedAnd64_rel)
+# pragma intrinsic (_InterlockedOr64_acq)
+# pragma intrinsic (_InterlockedOr64_nf)
+# pragma intrinsic (_InterlockedOr64_rel)
+# pragma intrinsic (_InterlockedXor64_acq)
+# pragma intrinsic (_InterlockedXor64_nf)
+# pragma intrinsic (_InterlockedXor64_rel)
+# endif /* !AO_T_IS_INT */
+
+ AO_INLINE void
+ AO_and(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedAnd_nf((long volatile *)p, value);
+# else
+ (void)_InterlockedAnd64_nf((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_and
+
+ AO_INLINE void
+ AO_or(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedOr_nf((long volatile *)p, value);
+# else
+ (void)_InterlockedOr64_nf((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_or
+
+ AO_INLINE void
+ AO_xor(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedXor_nf((long volatile *)p, value);
+# else
+ (void)_InterlockedXor64_nf((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_xor
+
+ AO_INLINE void
+ AO_and_acquire(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedAnd_acq((long volatile *)p, value);
+# else
+ (void)_InterlockedAnd64_acq((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_and_acquire
+
+ AO_INLINE void
+ AO_or_acquire(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedOr_acq((long volatile *)p, value);
+# else
+ (void)_InterlockedOr64_acq((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_or_acquire
+
+ AO_INLINE void
+ AO_xor_acquire(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedXor_acq((long volatile *)p, value);
+# else
+ (void)_InterlockedXor64_acq((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_xor_acquire
+
+ AO_INLINE void
+ AO_and_release(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedAnd_rel((long volatile *)p, value);
+# else
+ (void)_InterlockedAnd64_rel((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_and_release
+
+ AO_INLINE void
+ AO_or_release(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedOr_rel((long volatile *)p, value);
+# else
+ (void)_InterlockedOr64_rel((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_or_release
+
+ AO_INLINE void
+ AO_xor_release(volatile AO_t *p, AO_t value)
+ {
+# ifdef AO_T_IS_INT
+ (void)_InterlockedXor_rel((long volatile *)p, value);
+# else
+ (void)_InterlockedXor64_rel((__int64 volatile *)p, value);
+# endif
+ }
+# define AO_HAVE_xor_release
+
+# pragma intrinsic (_InterlockedDecrement16_acq)
+# pragma intrinsic (_InterlockedDecrement16_nf)
+# pragma intrinsic (_InterlockedDecrement16_rel)
+# pragma intrinsic (_InterlockedIncrement16_acq)
+# pragma intrinsic (_InterlockedIncrement16_nf)
+# pragma intrinsic (_InterlockedIncrement16_rel)
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add1(volatile unsigned short *p)
+ {
+ return _InterlockedIncrement16_nf((short volatile *)p) - 1;
+ }
+# define AO_HAVE_short_fetch_and_add1
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_sub1(volatile unsigned short *p)
+ {
+ return _InterlockedDecrement16_nf((short volatile *)p) + 1;
+ }
+# define AO_HAVE_short_fetch_and_sub1
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add1_acquire(volatile unsigned short *p)
+ {
+ return _InterlockedIncrement16_acq((short volatile *)p) - 1;
+ }
+# define AO_HAVE_short_fetch_and_add1_acquire
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_sub1_acquire(volatile unsigned short *p)
+ {
+ return _InterlockedDecrement16_acq((short volatile *)p) + 1;
+ }
+# define AO_HAVE_short_fetch_and_sub1_acquire
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add1_release(volatile unsigned short *p)
+ {
+ return _InterlockedIncrement16_rel((short volatile *)p) - 1;
+ }
+# define AO_HAVE_short_fetch_and_add1_release
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_sub1_release(volatile unsigned short *p)
+ {
+ return _InterlockedDecrement16_rel((short volatile *)p) + 1;
+ }
+# define AO_HAVE_short_fetch_and_sub1_release
+
+# pragma intrinsic (_InterlockedExchangeAdd_acq)
+# pragma intrinsic (_InterlockedExchangeAdd_nf)
+# pragma intrinsic (_InterlockedExchangeAdd_rel)
+
+# pragma intrinsic (_InterlockedDecrement_acq)
+# pragma intrinsic (_InterlockedDecrement_nf)
+# pragma intrinsic (_InterlockedDecrement_rel)
+# pragma intrinsic (_InterlockedIncrement_acq)
+# pragma intrinsic (_InterlockedIncrement_nf)
+# pragma intrinsic (_InterlockedIncrement_rel)
+
+# ifndef AO_T_IS_INT
+# pragma intrinsic (_InterlockedExchangeAdd64_acq)
+# pragma intrinsic (_InterlockedExchangeAdd64_nf)
+# pragma intrinsic (_InterlockedExchangeAdd64_rel)
+
+# pragma intrinsic (_InterlockedDecrement64_acq)
+# pragma intrinsic (_InterlockedDecrement64_nf)
+# pragma intrinsic (_InterlockedDecrement64_rel)
+# pragma intrinsic (_InterlockedIncrement64_acq)
+# pragma intrinsic (_InterlockedIncrement64_nf)
+# pragma intrinsic (_InterlockedIncrement64_rel)
+# endif
+
+ AO_INLINE AO_t
+ AO_fetch_and_add(volatile AO_t *p, AO_t incr)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedExchangeAdd_nf((long volatile *)p, incr);
+# else
+ return _InterlockedExchangeAdd64_nf((__int64 volatile *)p, incr);
+# endif
+ }
+# define AO_HAVE_fetch_and_add
+
+ AO_INLINE AO_t
+ AO_fetch_and_add1(volatile AO_t *p)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedIncrement_nf((long volatile *)p) - 1;
+# else
+ return _InterlockedIncrement64_nf((__int64 volatile *)p) - 1;
+# endif
+ }
+# define AO_HAVE_fetch_and_add1
+
+ AO_INLINE AO_t
+ AO_fetch_and_sub1(volatile AO_t *p)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedDecrement_nf((long volatile *)p) + 1;
+# else
+ return _InterlockedDecrement64_nf((__int64 volatile *)p) + 1;
+# endif
+ }
+# define AO_HAVE_fetch_and_sub1
+
+ AO_INLINE AO_t
+ AO_fetch_and_add_acquire(volatile AO_t *p, AO_t incr)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedExchangeAdd_acq((long volatile *)p, incr);
+# else
+ return _InterlockedExchangeAdd64_acq((__int64 volatile *)p, incr);
+# endif
+ }
+# define AO_HAVE_fetch_and_add_acquire
+
+ AO_INLINE AO_t
+ AO_fetch_and_add1_acquire(volatile AO_t *p)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedIncrement_acq((long volatile *)p) - 1;
+# else
+ return _InterlockedIncrement64_acq((__int64 volatile *)p) - 1;
+# endif
+ }
+# define AO_HAVE_fetch_and_add1_acquire
+
+ AO_INLINE AO_t
+ AO_fetch_and_sub1_acquire(volatile AO_t *p)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedDecrement_acq((long volatile *)p) + 1;
+# else
+ return _InterlockedDecrement64_acq((__int64 volatile *)p) + 1;
+# endif
+ }
+# define AO_HAVE_fetch_and_sub1_acquire
+
+ AO_INLINE AO_t
+ AO_fetch_and_add_release(volatile AO_t *p, AO_t incr)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedExchangeAdd_rel((long volatile *)p, incr);
+# else
+ return _InterlockedExchangeAdd64_rel((__int64 volatile *)p, incr);
+# endif
+ }
+# define AO_HAVE_fetch_and_add_release
+
+ AO_INLINE AO_t
+ AO_fetch_and_add1_release(volatile AO_t *p)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedIncrement_rel((long volatile *)p) - 1;
+# else
+ return _InterlockedIncrement64_rel((__int64 volatile *)p) - 1;
+# endif
+ }
+# define AO_HAVE_fetch_and_add1_release
+
+ AO_INLINE AO_t
+ AO_fetch_and_sub1_release(volatile AO_t *p)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedDecrement_rel((long volatile *)p) + 1;
+# else
+ return _InterlockedDecrement64_rel((__int64 volatile *)p) + 1;
+# endif
+ }
+# define AO_HAVE_fetch_and_sub1_release
+
+# ifndef AO_T_IS_INT
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add(volatile unsigned int *p, unsigned int incr)
+ {
+ return _InterlockedExchangeAdd_nf((long volatile *)p, incr);
+ }
+# define AO_HAVE_int_fetch_and_add
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add1(volatile unsigned int *p)
+ {
+ return _InterlockedIncrement_nf((long volatile *)p) - 1;
+ }
+# define AO_HAVE_int_fetch_and_add1
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_sub1(volatile unsigned int *p)
+ {
+ return _InterlockedDecrement_nf((long volatile *)p) + 1;
+ }
+# define AO_HAVE_int_fetch_and_sub1
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add_acquire(volatile unsigned int *p,
+ unsigned int incr)
+ {
+ return _InterlockedExchangeAdd_acq((long volatile *)p, incr);
+ }
+# define AO_HAVE_int_fetch_and_add_acquire
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add1_acquire(volatile unsigned int *p)
+ {
+ return _InterlockedIncrement_acq((long volatile *)p) - 1;
+ }
+# define AO_HAVE_int_fetch_and_add1_acquire
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_sub1_acquire(volatile unsigned int *p)
+ {
+ return _InterlockedDecrement_acq((long volatile *)p) + 1;
+ }
+# define AO_HAVE_int_fetch_and_sub1_acquire
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add_release(volatile unsigned int *p,
+ unsigned int incr)
+ {
+ return _InterlockedExchangeAdd_rel((long volatile *)p, incr);
+ }
+# define AO_HAVE_int_fetch_and_add_release
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add1_release(volatile unsigned int *p)
+ {
+ return _InterlockedIncrement_rel((long volatile *)p) - 1;
+ }
+# define AO_HAVE_int_fetch_and_add1_release
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_sub1_release(volatile unsigned int *p)
+ {
+ return _InterlockedDecrement_rel((long volatile *)p) + 1;
+ }
+# define AO_HAVE_int_fetch_and_sub1_release
+# endif /* !AO_T_IS_INT */
+
+# endif /* !AO_PREFER_GENERALIZED && (_M_ARM || _M_ARM64) */
+
+# pragma intrinsic (_InterlockedCompareExchange8)
+
+ AO_INLINE unsigned char
+ AO_char_fetch_compare_and_swap_full(volatile unsigned char *addr,
+ unsigned char old_val,
+ unsigned char new_val)
+ {
+ return _InterlockedCompareExchange8((char volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_full
+
+# if defined(_M_ARM) || defined(_M_ARM64)
+
+# pragma intrinsic (_InterlockedCompareExchange_acq)
+# pragma intrinsic (_InterlockedCompareExchange_nf)
+# pragma intrinsic (_InterlockedCompareExchange_rel)
+# ifndef AO_T_IS_INT
+# pragma intrinsic (_InterlockedCompareExchange64_acq)
+# pragma intrinsic (_InterlockedCompareExchange64_nf)
+# pragma intrinsic (_InterlockedCompareExchange64_rel)
+# endif
+
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedCompareExchange_nf((long volatile *)addr,
+ new_val, old_val);
+# else
+ return (AO_t)_InterlockedCompareExchange64_nf(
+ (__int64 volatile *)addr, new_val, old_val);
+# endif
+ }
+# define AO_HAVE_fetch_compare_and_swap
+
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedCompareExchange_acq((long volatile *)addr,
+ new_val, old_val);
+# else
+ return (AO_t)_InterlockedCompareExchange64_acq(
+ (__int64 volatile *)addr, new_val, old_val);
+# endif
+ }
+# define AO_HAVE_fetch_compare_and_swap_acquire
+
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+ {
+# ifdef AO_T_IS_INT
+ return _InterlockedCompareExchange_rel((long volatile *)addr,
+ new_val, old_val);
+# else
+ return (AO_t)_InterlockedCompareExchange64_rel(
+ (__int64 volatile *)addr, new_val, old_val);
+# endif
+ }
+# define AO_HAVE_fetch_compare_and_swap_release
+
+# ifndef AO_T_IS_INT
+ AO_INLINE unsigned int
+ AO_int_fetch_compare_and_swap(volatile unsigned int *addr,
+ unsigned int old_val,
+ unsigned int new_val)
+ {
+ return _InterlockedCompareExchange_nf((long volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_int_fetch_compare_and_swap
+
+ AO_INLINE unsigned int
+ AO_int_fetch_compare_and_swap_acquire(volatile unsigned int *addr,
+ unsigned int old_val,
+ unsigned int new_val)
+ {
+ return _InterlockedCompareExchange_acq((long volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_acquire
+
+ AO_INLINE unsigned int
+ AO_int_fetch_compare_and_swap_release(volatile unsigned int *addr,
+ unsigned int old_val,
+ unsigned int new_val)
+ {
+ return _InterlockedCompareExchange_rel((long volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_release
+# endif /* !AO_T_IS_INT */
+
+# pragma intrinsic (_InterlockedCompareExchange16_acq)
+# pragma intrinsic (_InterlockedCompareExchange16_nf)
+# pragma intrinsic (_InterlockedCompareExchange16_rel)
+# pragma intrinsic (_InterlockedCompareExchange8_acq)
+# pragma intrinsic (_InterlockedCompareExchange8_nf)
+# pragma intrinsic (_InterlockedCompareExchange8_rel)
+
+ AO_INLINE unsigned short
+ AO_short_fetch_compare_and_swap(volatile unsigned short *addr,
+ unsigned short old_val,
+ unsigned short new_val)
+ {
+ return _InterlockedCompareExchange16_nf((short volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_short_fetch_compare_and_swap
+
+ AO_INLINE unsigned short
+ AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr,
+ unsigned short old_val,
+ unsigned short new_val)
+ {
+ return _InterlockedCompareExchange16_acq((short volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_acquire
+
+ AO_INLINE unsigned short
+ AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr,
+ unsigned short old_val,
+ unsigned short new_val)
+ {
+ return _InterlockedCompareExchange16_rel((short volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_release
+
+ AO_INLINE unsigned char
+ AO_char_fetch_compare_and_swap(volatile unsigned char *addr,
+ unsigned char old_val,
+ unsigned char new_val)
+ {
+ return _InterlockedCompareExchange8_nf((char volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_char_fetch_compare_and_swap
+
+ AO_INLINE unsigned char
+ AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr,
+ unsigned char old_val,
+ unsigned char new_val)
+ {
+ return _InterlockedCompareExchange8_acq((char volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_acquire
+
+ AO_INLINE unsigned char
+ AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr,
+ unsigned char old_val,
+ unsigned char new_val)
+ {
+ return _InterlockedCompareExchange8_rel((char volatile *)addr,
+ new_val, old_val);
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_release
+# endif /* _M_ARM || _M_ARM64 */
+
+# if !defined(AO_PREFER_GENERALIZED) && !defined(_M_ARM)
+# pragma intrinsic (_InterlockedExchangeAdd16)
+# pragma intrinsic (_InterlockedExchangeAdd8)
+
+ AO_INLINE unsigned char
+ AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr)
+ {
+ return _InterlockedExchangeAdd8((char volatile *)p, incr);
+ }
+# define AO_HAVE_char_fetch_and_add_full
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add_full(volatile unsigned short *p,
+ unsigned short incr)
+ {
+ return _InterlockedExchangeAdd16((short volatile *)p, incr);
+ }
+# define AO_HAVE_short_fetch_and_add_full
+
+# if defined(_M_ARM64)
+# pragma intrinsic (_InterlockedExchangeAdd16_acq)
+# pragma intrinsic (_InterlockedExchangeAdd16_nf)
+# pragma intrinsic (_InterlockedExchangeAdd16_rel)
+# pragma intrinsic (_InterlockedExchangeAdd8_acq)
+# pragma intrinsic (_InterlockedExchangeAdd8_nf)
+# pragma intrinsic (_InterlockedExchangeAdd8_rel)
+
+ AO_INLINE unsigned char
+ AO_char_fetch_and_add(volatile unsigned char *p, unsigned char incr)
+ {
+ return _InterlockedExchangeAdd8_nf((char volatile *)p, incr);
+ }
+# define AO_HAVE_char_fetch_and_add
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add(volatile unsigned short *p, unsigned short incr)
+ {
+ return _InterlockedExchangeAdd16_nf((short volatile *)p, incr);
+ }
+# define AO_HAVE_short_fetch_and_add
+
+ AO_INLINE unsigned char
+ AO_char_fetch_and_add_acquire(volatile unsigned char *p,
+ unsigned char incr)
+ {
+ return _InterlockedExchangeAdd8_acq((char volatile *)p, incr);
+ }
+# define AO_HAVE_char_fetch_and_add_acquire
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add_acquire(volatile unsigned short *p,
+ unsigned short incr)
+ {
+ return _InterlockedExchangeAdd16_acq((short volatile *)p, incr);
+ }
+# define AO_HAVE_short_fetch_and_add_acquire
+
+ AO_INLINE unsigned char
+ AO_char_fetch_and_add_release(volatile unsigned char *p,
+ unsigned char incr)
+ {
+ return _InterlockedExchangeAdd8_rel((char volatile *)p, incr);
+ }
+# define AO_HAVE_char_fetch_and_add_release
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add_release(volatile unsigned short *p,
+ unsigned short incr)
+ {
+ return _InterlockedExchangeAdd16_rel((short volatile *)p, incr);
+ }
+# define AO_HAVE_short_fetch_and_add_release
+# endif /* _M_ARM64 */
+
+# endif /* !AO_PREFER_GENERALIZED && !_M_ARM */
+
+# if !defined(_M_ARM) || _M_ARM >= 6
+# include "../test_and_set_t_is_char.h"
+
+# pragma intrinsic (_InterlockedExchange8)
+
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_full(volatile AO_TS_t *addr)
+ {
+ return (AO_TS_VAL_t)(_InterlockedExchange8((char volatile *)addr,
+ (AO_TS_t)AO_TS_SET) & 0xff);
+ /* Note: bitwise "and 0xff" is applied to the result because cast */
+ /* to unsigned char does not work properly (for a reason) if /J */
+ /* option is passed to the MS VC compiler. */
+ }
+# define AO_HAVE_test_and_set_full
+# endif /* !_M_ARM || _M_ARM >= 6 */
+
+# if _M_ARM >= 6 || defined(_M_ARM64)
+# pragma intrinsic (_InterlockedExchange8_acq)
+# pragma intrinsic (_InterlockedExchange8_nf)
+# pragma intrinsic (_InterlockedExchange8_rel)
+
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set(volatile AO_TS_t *addr)
+ {
+ return (AO_TS_VAL_t)(_InterlockedExchange8_nf((char volatile *)addr,
+ (AO_TS_t)AO_TS_SET) & 0xff);
+ }
+# define AO_HAVE_test_and_set
+
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_acquire(volatile AO_TS_t *addr)
+ {
+ return (AO_TS_VAL_t)(_InterlockedExchange8_acq((char volatile *)addr,
+ (AO_TS_t)AO_TS_SET) & 0xff);
+ }
+# define AO_HAVE_test_and_set_acquire
+
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_release(volatile AO_TS_t *addr)
+ {
+ return (AO_TS_VAL_t)(_InterlockedExchange8_rel((char volatile *)addr,
+ (AO_TS_t)AO_TS_SET) & 0xff);
+ }
+# define AO_HAVE_test_and_set_release
+# endif /* _M_ARM >= 6 || _M_ARM64 */
+
+#endif /* _MSC_VER >= 1800 */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86.h
new file mode 100644
index 0000000000..ba2400a502
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86.h
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2009-2021 Ivan Maidanski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 "../all_aligned_atomic_load_store.h"
+
+#if !defined(AO_ASSUME_VISTA) && _MSC_VER >= 1910
+ /* Visual Studio 2017 (15.0) discontinued support of Windows XP. */
+ /* We assume Windows Server 2003, Vista or later. */
+# define AO_ASSUME_VISTA
+#endif
+
+#if !defined(AO_ASSUME_WINDOWS98) \
+ && (defined(AO_ASSUME_VISTA) || _MSC_VER >= 1400)
+ /* Visual Studio 2005 (MS VC++ 8.0) discontinued support of Windows 95. */
+# define AO_ASSUME_WINDOWS98
+#endif
+
+#if !defined(AO_USE_PENTIUM4_INSTRS) && _M_IX86_FP >= 2 /* SSE2 */
+ /* "mfence" is a part of SSE2 set (introduced on Intel Pentium 4). */
+# define AO_USE_PENTIUM4_INSTRS
+#endif
+
+#define AO_T_IS_INT
+
+#ifndef AO_USE_INTERLOCKED_INTRINSICS
+ /* _Interlocked primitives (Inc, Dec, Xchg, Add) are always available */
+# define AO_USE_INTERLOCKED_INTRINSICS
+#endif
+#include "common32_defs.h"
+
+/* As far as we can tell, the lfence and sfence instructions are not */
+/* currently needed or useful for cached memory accesses. */
+
+/* Unfortunately mfence doesn't exist everywhere. */
+/* IsProcessorFeaturePresent(PF_COMPARE_EXCHANGE128) is */
+/* probably a conservative test for it? */
+
+#if defined(AO_USE_PENTIUM4_INSTRS)
+
+AO_INLINE void
+AO_nop_full(void)
+{
+ __asm { mfence }
+}
+#define AO_HAVE_nop_full
+
+#else
+
+/* We could use the cpuid instruction. But that seems to be slower */
+/* than the default implementation based on test_and_set_full. Thus */
+/* we omit that bit of misinformation here. */
+
+#endif
+
+#if !defined(AO_NO_ASM_XADD) && !defined(AO_HAVE_char_fetch_and_add_full)
+ AO_INLINE unsigned char
+ AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr)
+ {
+ __asm
+ {
+ mov al, incr
+ mov ebx, p
+ lock xadd byte ptr [ebx], al
+ }
+ /* Ignore possible "missing return value" warning here. */
+ }
+# define AO_HAVE_char_fetch_and_add_full
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add_full(volatile unsigned short *p, unsigned short incr)
+ {
+ __asm
+ {
+ mov ax, incr
+ mov ebx, p
+ lock xadd word ptr [ebx], ax
+ }
+ /* Ignore possible "missing return value" warning here. */
+ }
+# define AO_HAVE_short_fetch_and_add_full
+#endif /* !AO_NO_ASM_XADD */
+
+#ifndef AO_HAVE_test_and_set_full
+# include "../test_and_set_t_is_char.h"
+
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_full(volatile AO_TS_t *addr)
+ {
+ __asm
+ {
+ mov eax,0xff ; /* AO_TS_SET */
+ mov ebx,addr ;
+ xchg byte ptr [ebx],al ;
+ }
+ /* Ignore possible "missing return value" warning here. */
+ }
+# define AO_HAVE_test_and_set_full
+#endif
+
+#if defined(_WIN64) && !defined(CPPCHECK)
+# error wrong architecture
+#endif
+
+#ifdef AO_ASSUME_VISTA
+# include "../standard_ao_double_t.h"
+
+ /* Reading or writing a quadword aligned on a 64-bit boundary is */
+ /* always carried out atomically (requires at least a Pentium). */
+# define AO_ACCESS_double_CHECK_ALIGNED
+# include "../loadstore/double_atomic_load_store.h"
+
+ /* Whenever we run on a Pentium class machine, we have that certain */
+ /* function. */
+# pragma intrinsic (_InterlockedCompareExchange64)
+
+ /* Returns nonzero if the comparison succeeded. */
+ AO_INLINE int
+ AO_double_compare_and_swap_full(volatile AO_double_t *addr,
+ AO_double_t old_val, AO_double_t new_val)
+ {
+ AO_ASSERT_ADDR_ALIGNED(addr);
+ return (double_ptr_storage)_InterlockedCompareExchange64(
+ (__int64 volatile *)addr,
+ new_val.AO_whole /* exchange */,
+ old_val.AO_whole) == old_val.AO_whole;
+ }
+# define AO_HAVE_double_compare_and_swap_full
+#endif /* AO_ASSUME_VISTA */
+
+/* Real X86 implementations, except for some old WinChips, appear */
+/* to enforce ordering between memory operations, EXCEPT that a later */
+/* read can pass earlier writes, presumably due to the visible */
+/* presence of store buffers. */
+/* We ignore both the WinChips, and the fact that the official specs */
+/* seem to be much weaker (and arguably too weak to be usable). */
+#include "../ordered_except_wr.h"
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86_64.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86_64.h
new file mode 100644
index 0000000000..ad98f0b19f
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86_64.h
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2009-2021 Ivan Maidanski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 "../all_aligned_atomic_load_store.h"
+
+/* Real X86 implementations appear */
+/* to enforce ordering between memory operations, EXCEPT that a later */
+/* read can pass earlier writes, presumably due to the visible */
+/* presence of store buffers. */
+/* We ignore the fact that the official specs */
+/* seem to be much weaker (and arguably too weak to be usable). */
+#include "../ordered_except_wr.h"
+
+#ifndef AO_ASSUME_WINDOWS98
+ /* CAS is always available */
+# define AO_ASSUME_WINDOWS98
+#endif
+#ifndef AO_USE_INTERLOCKED_INTRINSICS
+# define AO_USE_INTERLOCKED_INTRINSICS
+#endif
+#include "common32_defs.h"
+
+#ifdef AO_ASM_X64_AVAILABLE
+
+#if _MSC_VER < 1800
+ AO_INLINE unsigned char
+ AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr)
+ {
+ __asm
+ {
+ mov al, incr
+ mov rbx, p
+ lock xadd byte ptr [rbx], al
+ }
+ }
+# define AO_HAVE_char_fetch_and_add_full
+
+ AO_INLINE unsigned short
+ AO_short_fetch_and_add_full(volatile unsigned short *p, unsigned short incr)
+ {
+ __asm
+ {
+ mov ax, incr
+ mov rbx, p
+ lock xadd word ptr [rbx], ax
+ }
+ }
+# define AO_HAVE_short_fetch_and_add_full
+#endif /* _MSC_VER < 1800 */
+
+ /* As far as we can tell, the lfence and sfence instructions are not */
+ /* currently needed or useful for cached memory accesses. */
+
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ /* Note: "mfence" (SSE2) is supported on all x86_64/amd64 chips. */
+ __asm { mfence }
+ }
+# define AO_HAVE_nop_full
+
+# ifndef AO_HAVE_test_and_set_full
+# include "../test_and_set_t_is_char.h"
+
+ AO_INLINE AO_TS_VAL_t
+ AO_test_and_set_full(volatile AO_TS_t *addr)
+ {
+ __asm
+ {
+ mov rax,AO_TS_SET ;
+ mov rbx,addr ;
+ xchg byte ptr [rbx],al ;
+ }
+ }
+# define AO_HAVE_test_and_set_full
+# endif
+
+#endif /* AO_ASM_X64_AVAILABLE */
+
+#ifndef AO_HAVE_test_and_set_full
+# include "../test_and_set_t_is_ao_t.h"
+ /* AO_test_and_set_full() is emulated using word-wide CAS. */
+#endif
+
+#ifdef AO_CMPXCHG16B_AVAILABLE
+
+# if _MSC_VER >= 1500
+# include "../standard_ao_double_t.h"
+# pragma intrinsic (_InterlockedCompareExchange128)
+
+ AO_INLINE int
+ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ __int64 comparandResult[2];
+
+ AO_ASSERT_ADDR_ALIGNED(addr);
+ comparandResult[0] = old_val1; /* low */
+ comparandResult[1] = old_val2; /* high */
+ return _InterlockedCompareExchange128((volatile __int64 *)addr,
+ new_val2 /* high */,
+ new_val1 /* low */,
+ comparandResult);
+ }
+# define AO_HAVE_compare_double_and_swap_double_full
+
+# elif defined(AO_ASM_X64_AVAILABLE)
+# include "../standard_ao_double_t.h"
+
+ /* If there is no intrinsic _InterlockedCompareExchange128 then we */
+ /* need basically what's given below. */
+ AO_INLINE int
+ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ __asm
+ {
+ mov rdx,QWORD PTR [old_val2] ;
+ mov rax,QWORD PTR [old_val1] ;
+ mov rcx,QWORD PTR [new_val2] ;
+ mov rbx,QWORD PTR [new_val1] ;
+ lock cmpxchg16b [addr] ;
+ setz rax ;
+ }
+ }
+# define AO_HAVE_compare_double_and_swap_double_full
+# endif /* AO_ASM_X64_AVAILABLE && (_MSC_VER < 1500) */
+
+#endif /* AO_CMPXCHG16B_AVAILABLE */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ordered.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ordered.h
new file mode 100644
index 0000000000..ba9822d3fd
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ordered.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* These are common definitions for architectures that provide */
+/* processor ordered memory operations. */
+
+#include "ordered_except_wr.h"
+
+AO_INLINE void
+AO_nop_full(void)
+{
+ AO_compiler_barrier();
+}
+#define AO_HAVE_nop_full
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ordered_except_wr.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ordered_except_wr.h
new file mode 100644
index 0000000000..78f447175b
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/ordered_except_wr.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * These are common definitions for architectures that provide processor
+ * ordered memory operations except that a later read may pass an
+ * earlier write. Real x86 implementations seem to be in this category,
+ * except apparently for some IDT WinChips, which we ignore.
+ */
+
+#include "read_ordered.h"
+
+AO_INLINE void
+AO_nop_write(void)
+{
+ /* AO_nop_write implementation is the same as of AO_nop_read. */
+ AO_compiler_barrier();
+ /* sfence according to Intel docs. Pentium 3 and up. */
+ /* Unnecessary for cached accesses? */
+}
+#define AO_HAVE_nop_write
+
+#include "loadstore/ordered_stores_only.h"
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/read_ordered.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/read_ordered.h
new file mode 100644
index 0000000000..420cd9705c
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/read_ordered.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * These are common definitions for architectures that provide processor
+ * ordered memory operations except that a later read may pass an
+ * earlier write. Real x86 implementations seem to be in this category,
+ * except apparently for some IDT WinChips, which we ignore.
+ */
+
+AO_INLINE void
+AO_nop_read(void)
+{
+ AO_compiler_barrier();
+}
+#define AO_HAVE_nop_read
+
+#include "loadstore/ordered_loads_only.h"
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h
new file mode 100644
index 0000000000..757fe79ece
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2004-2011 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2012-2021 Ivan Maidanski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* For 64-bit systems, we expect the double type to hold two int64's. */
+
+#if ((defined(__x86_64__) && defined(AO_GCC_ATOMIC_TEST_AND_SET)) \
+ || defined(__aarch64__)) && !defined(__ILP32__)
+ /* x86-64: __m128 is not applicable to atomic intrinsics. */
+# if AO_GNUC_PREREQ(4, 7) || AO_CLANG_PREREQ(3, 6)
+# pragma GCC diagnostic push
+ /* Suppress warning about __int128 type. */
+# if defined(__clang__) || AO_GNUC_PREREQ(6, 0)
+# pragma GCC diagnostic ignored "-Wpedantic"
+# else
+ /* GCC before ~4.8 does not accept "-Wpedantic" quietly. */
+# pragma GCC diagnostic ignored "-pedantic"
+# endif
+ typedef unsigned __int128 double_ptr_storage;
+# pragma GCC diagnostic pop
+# else /* pragma diagnostic is not supported */
+ typedef unsigned __int128 double_ptr_storage;
+# endif
+#elif defined(_M_ARM64) && defined(_MSC_VER)
+ /* __int128 does not seem to be available. */
+ typedef __declspec(align(16)) unsigned __int64 double_ptr_storage[2];
+#elif ((defined(__x86_64__) && AO_GNUC_PREREQ(4, 0)) || defined(_WIN64)) \
+ && !defined(__ILP32__)
+ /* x86-64 (except for x32): __m128 serves as a placeholder which also */
+ /* requires the compiler to align it on 16-byte boundary (as required */
+ /* by cmpxchg16b). */
+ /* Similar things could be done for PPC 64-bit using a VMX data type. */
+# include <xmmintrin.h>
+ typedef __m128 double_ptr_storage;
+#elif defined(_WIN32) && !defined(__GNUC__)
+ typedef unsigned __int64 double_ptr_storage;
+#elif defined(__i386__) && defined(__GNUC__)
+ typedef unsigned long long double_ptr_storage
+ __attribute__((__aligned__(8)));
+#else
+ typedef unsigned long long double_ptr_storage;
+#endif
+# define AO_HAVE_DOUBLE_PTR_STORAGE
+
+typedef union {
+ struct { AO_t AO_v1; AO_t AO_v2; } AO_parts;
+ /* Note that AO_v1 corresponds to the low or the high part of */
+ /* AO_whole depending on the machine endianness. */
+ double_ptr_storage AO_whole;
+ /* AO_whole is now (starting from v7.3alpha3) the 2nd element */
+ /* of this union to make AO_DOUBLE_T_INITIALIZER portable */
+ /* (because __m128 definition could vary from a primitive type */
+ /* to a structure or array/vector). */
+} AO_double_t;
+#define AO_HAVE_double_t
+
+/* Note: AO_double_t volatile variables are not intended to be local */
+/* ones (at least those which are passed to AO double-wide primitives */
+/* as the first argument), otherwise it is the client responsibility to */
+/* ensure they have double-word alignment. */
+
+/* Dummy declaration as a compile-time assertion for AO_double_t size. */
+struct AO_double_t_size_static_assert {
+ char dummy[sizeof(AO_double_t) == 2 * sizeof(AO_t) ? 1 : -1];
+};
+
+#define AO_DOUBLE_T_INITIALIZER { { (AO_t)0, (AO_t)0 } }
+
+#define AO_val1 AO_parts.AO_v1
+#define AO_val2 AO_parts.AO_v2
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.S b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.S
new file mode 100644
index 0000000000..4001a6762f
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.S
@@ -0,0 +1,5 @@
+ .seg "text"
+ .globl AO_test_and_set_full
+AO_test_and_set_full:
+ retl
+ ldstub [%o0],%o0
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.h
new file mode 100644
index 0000000000..5530fd0ee8
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 "../all_atomic_load_store.h"
+
+/* Real SPARC code uses TSO: */
+#include "../ordered_except_wr.h"
+
+/* Test_and_set location is just a byte. */
+#include "../test_and_set_t_is_char.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+extern AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t *addr);
+/* Implemented in separate .S file, for now. */
+#define AO_HAVE_test_and_set_full
+
+/* TODO: Like the gcc version, extend this for V8 and V9. */
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/x86.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/x86.h
new file mode 100644
index 0000000000..5efda2503b
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/sunc/x86.h
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
+ * Copyright (c) 2009-2016 Ivan Maidanski
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * Some of the machine specific code was borrowed from our GC distribution.
+ */
+
+/* The following really assume we have a 486 or better. */
+
+#include "../all_aligned_atomic_load_store.h"
+
+#include "../test_and_set_t_is_char.h"
+
+#if !defined(AO_USE_PENTIUM4_INSTRS) && !defined(__i386)
+ /* "mfence" (SSE2) is supported on all x86_64/amd64 chips. */
+# define AO_USE_PENTIUM4_INSTRS
+#endif
+
+#if defined(AO_USE_PENTIUM4_INSTRS)
+ AO_INLINE void
+ AO_nop_full(void)
+ {
+ __asm__ __volatile__ ("mfence" : : : "memory");
+ }
+# define AO_HAVE_nop_full
+
+#else
+ /* We could use the cpuid instruction. But that seems to be slower */
+ /* than the default implementation based on test_and_set_full. Thus */
+ /* we omit that bit of misinformation here. */
+#endif /* !AO_USE_PENTIUM4_INSTRS */
+
+/* As far as we can tell, the lfence and sfence instructions are not */
+/* currently needed or useful for cached memory accesses. */
+
+/* Really only works for 486 and later */
+#ifndef AO_PREFER_GENERALIZED
+ AO_INLINE AO_t
+ AO_fetch_and_add_full (volatile AO_t *p, AO_t incr)
+ {
+ AO_t result;
+
+ __asm__ __volatile__ ("lock; xadd %0, %1"
+ : "=r" (result), "+m" (*p)
+ : "0" (incr)
+ : "memory");
+ return result;
+ }
+# define AO_HAVE_fetch_and_add_full
+#endif /* !AO_PREFER_GENERALIZED */
+
+AO_INLINE unsigned char
+AO_char_fetch_and_add_full (volatile unsigned char *p, unsigned char incr)
+{
+ unsigned char result;
+
+ __asm__ __volatile__ ("lock; xaddb %0, %1"
+ : "=q" (result), "+m" (*p)
+ : "0" (incr)
+ : "memory");
+ return result;
+}
+#define AO_HAVE_char_fetch_and_add_full
+
+AO_INLINE unsigned short
+AO_short_fetch_and_add_full (volatile unsigned short *p, unsigned short incr)
+{
+ unsigned short result;
+
+ __asm__ __volatile__ ("lock; xaddw %0, %1"
+ : "=r" (result), "+m" (*p)
+ : "0" (incr)
+ : "memory");
+ return result;
+}
+#define AO_HAVE_short_fetch_and_add_full
+
+#ifndef AO_PREFER_GENERALIZED
+ AO_INLINE void
+ AO_and_full (volatile AO_t *p, AO_t value)
+ {
+ __asm__ __volatile__ ("lock; and %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+ }
+# define AO_HAVE_and_full
+
+ AO_INLINE void
+ AO_or_full (volatile AO_t *p, AO_t value)
+ {
+ __asm__ __volatile__ ("lock; or %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+ }
+# define AO_HAVE_or_full
+
+ AO_INLINE void
+ AO_xor_full (volatile AO_t *p, AO_t value)
+ {
+ __asm__ __volatile__ ("lock; xor %1, %0"
+ : "+m" (*p)
+ : "r" (value)
+ : "memory");
+ }
+# define AO_HAVE_xor_full
+#endif /* !AO_PREFER_GENERALIZED */
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full (volatile AO_TS_t *addr)
+{
+ AO_TS_t oldval;
+ /* Note: the "xchg" instruction does not need a "lock" prefix */
+ __asm__ __volatile__ ("xchg %b0, %1"
+ : "=q" (oldval), "+m" (*addr)
+ : "0" (0xff)
+ : "memory");
+ return (AO_TS_VAL_t)oldval;
+}
+#define AO_HAVE_test_and_set_full
+
+#ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ /* Returns nonzero if the comparison succeeded. */
+ AO_INLINE int
+ AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val)
+ {
+ char result;
+ __asm__ __volatile__ ("lock; cmpxchg %2, %0; setz %1"
+ : "+m" (*addr), "=a" (result)
+ : "r" (new_val), "a" (old)
+ : "memory");
+ return (int) result;
+ }
+# define AO_HAVE_compare_and_swap_full
+#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
+ AO_t new_val)
+{
+ AO_t fetched_val;
+ __asm__ __volatile__ ("lock; cmpxchg %2, %0"
+ : "+m" (*addr), "=a" (fetched_val)
+ : "r" (new_val), "a" (old_val)
+ : "memory");
+ return fetched_val;
+}
+#define AO_HAVE_fetch_compare_and_swap_full
+
+#if defined(__i386)
+
+# ifndef AO_NO_CMPXCHG8B
+# include "../standard_ao_double_t.h"
+
+ /* Reading or writing a quadword aligned on a 64-bit boundary is */
+ /* always carried out atomically (requires at least a Pentium). */
+# define AO_ACCESS_double_CHECK_ALIGNED
+# include "../loadstore/double_atomic_load_store.h"
+
+ /* Returns nonzero if the comparison succeeded. */
+ /* Really requires at least a Pentium. */
+ AO_INLINE int
+ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ AO_t dummy; /* an output for clobbered edx */
+ char result;
+
+ __asm__ __volatile__ ("lock; cmpxchg8b %0; setz %1"
+ : "+m" (*addr), "=a" (result), "=d" (dummy)
+ : "d" (old_val2), "a" (old_val1),
+ "c" (new_val2), "b" (new_val1)
+ : "memory");
+ return (int) result;
+ }
+# define AO_HAVE_compare_double_and_swap_double_full
+# endif /* !AO_NO_CMPXCHG8B */
+
+# define AO_T_IS_INT
+
+#else /* x64 */
+
+ AO_INLINE unsigned int
+ AO_int_fetch_and_add_full (volatile unsigned int *p, unsigned int incr)
+ {
+ unsigned int result;
+
+ __asm__ __volatile__ ("lock; xaddl %0, %1"
+ : "=r" (result), "+m" (*p)
+ : "0" (incr)
+ : "memory");
+ return result;
+ }
+# define AO_HAVE_int_fetch_and_add_full
+
+# ifdef AO_CMPXCHG16B_AVAILABLE
+# include "../standard_ao_double_t.h"
+
+ /* Older AMD Opterons are missing this instruction (SIGILL should */
+ /* be thrown in this case). */
+ AO_INLINE int
+ AO_compare_double_and_swap_double_full (volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
+ {
+ AO_t dummy;
+ char result;
+
+ __asm__ __volatile__ ("lock; cmpxchg16b %0; setz %1"
+ : "+m" (*addr), "=a" (result), "=d" (dummy)
+ : "d" (old_val2), "a" (old_val1),
+ "c" (new_val2), "b" (new_val1)
+ : "memory");
+ return (int) result;
+ }
+# define AO_HAVE_compare_double_and_swap_double_full
+# endif /* !AO_CMPXCHG16B_AVAILABLE */
+
+#endif /* x64 */
+
+/* Real X86 implementations, except for some old 32-bit WinChips, */
+/* appear to enforce ordering between memory operations, EXCEPT that */
+/* a later read can pass earlier writes, presumably due to the visible */
+/* presence of store buffers. */
+/* We ignore both the WinChips and the fact that the official specs */
+/* seem to be much weaker (and arguably too weak to be usable). */
+#include "../ordered_except_wr.h"
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h
new file mode 100644
index 0000000000..606f7ac6b2
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * These are common definitions for architectures on which test_and_set
+ * operates on pointer-sized quantities, the "clear" value contains
+ * all zeroes, and the "set" value contains only one lowest bit set.
+ * This can be used if test_and_set is synthesized from compare_and_swap.
+ */
+typedef enum {AO_TS_clear = 0, AO_TS_set = 1} AO_TS_val;
+#define AO_TS_VAL_t AO_TS_val
+#define AO_TS_CLEAR AO_TS_clear
+#define AO_TS_SET AO_TS_set
+
+#define AO_TS_t AO_t
+
+#define AO_AO_TS_T 1
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_char.h b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_char.h
new file mode 100644
index 0000000000..9eb250ccdd
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_char.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * These are common definitions for architectures on which test_and_set
+ * operates on byte sized quantities, the "clear" value contains
+ * all zeroes, and the "set" value contains all ones typically.
+ */
+
+#ifndef AO_GCC_ATOMIC_TEST_AND_SET
+# define AO_TS_SET_TRUEVAL 0xff
+#elif defined(__GCC_ATOMIC_TEST_AND_SET_TRUEVAL) \
+ && !defined(AO_PREFER_GENERALIZED)
+# define AO_TS_SET_TRUEVAL __GCC_ATOMIC_TEST_AND_SET_TRUEVAL
+#else
+# define AO_TS_SET_TRUEVAL 1 /* true */
+#endif
+
+typedef enum {
+ AO_BYTE_TS_clear = 0,
+ AO_BYTE_TS_set = AO_TS_SET_TRUEVAL
+} AO_BYTE_TS_val;
+
+#define AO_TS_VAL_t AO_BYTE_TS_val
+#define AO_TS_CLEAR AO_BYTE_TS_clear
+#define AO_TS_SET AO_BYTE_TS_set
+
+#define AO_TS_t unsigned char
+
+#define AO_CHAR_TS_T 1
+
+#undef AO_TS_SET_TRUEVAL
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops_malloc.c b/graphics/asymptote/libatomic_ops/src/atomic_ops_malloc.c
new file mode 100644
index 0000000000..23d2518fa9
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops_malloc.c
@@ -0,0 +1,385 @@
+/*
+ * Copyright (c) 2005 Hewlett-Packard Development Company, L.P.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#if defined(HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+#ifdef DONT_USE_MMAP /* for testing */
+# undef HAVE_MMAP
+#endif
+
+#ifndef AO_BUILD
+# define AO_BUILD
+#endif
+
+#define AO_REQUIRE_CAS
+#include "atomic_ops_malloc.h"
+
+#include <string.h> /* for ffs, which is assumed reentrant. */
+#include <stdlib.h>
+#include <assert.h>
+
+#ifdef AO_TRACE_MALLOC
+# include <stdio.h>
+# include <pthread.h>
+#endif
+
+#if defined(AO_ADDRESS_SANITIZER) && !defined(AO_NO_MALLOC_POISON)
+ /* #include "sanitizer/asan_interface.h" */
+ void __asan_poison_memory_region(void *, size_t);
+ void __asan_unpoison_memory_region(void *, size_t);
+# define ASAN_POISON_MEMORY_REGION(addr, size) \
+ __asan_poison_memory_region(addr, size)
+# define ASAN_UNPOISON_MEMORY_REGION(addr, size) \
+ __asan_unpoison_memory_region(addr, size)
+#else
+# define ASAN_POISON_MEMORY_REGION(addr, size) (void)0
+# define ASAN_UNPOISON_MEMORY_REGION(addr, size) (void)0
+#endif /* !AO_ADDRESS_SANITIZER */
+
+#if (defined(_WIN32_WCE) || defined(__MINGW32CE__)) && !defined(AO_HAVE_abort)
+# define abort() _exit(-1) /* there is no abort() in WinCE */
+#endif
+
+/*
+ * We round up each allocation request to the next power of two
+ * minus one word.
+ * We keep one stack of free objects for each size. Each object
+ * has an initial word (offset -sizeof(AO_t) from the visible pointer)
+ * which contains either
+ * The binary log of the object size in bytes (small objects)
+ * The object size (a multiple of CHUNK_SIZE) for large objects.
+ * The second case only arises if mmap-based allocation is supported.
+ * We align the user-visible part of each object on an ALIGNMENT
+ * byte boundary. That means that the actual (hidden) start of
+ * the object starts a word before this boundary.
+ */
+
+#ifndef LOG_MAX_SIZE
+# define LOG_MAX_SIZE 16
+ /* We assume that 2**LOG_MAX_SIZE is a multiple of page size. */
+#endif
+
+#ifndef ALIGNMENT
+# define ALIGNMENT 16
+ /* Assumed to be at least sizeof(AO_t). */
+#endif
+
+#define CHUNK_SIZE (1 << LOG_MAX_SIZE)
+
+#ifndef AO_INITIAL_HEAP_SIZE
+# define AO_INITIAL_HEAP_SIZE (2*(LOG_MAX_SIZE+1)*CHUNK_SIZE)
+#endif
+
+char AO_initial_heap[AO_INITIAL_HEAP_SIZE];
+
+static volatile AO_t initial_heap_ptr = (AO_t)AO_initial_heap;
+
+#if defined(HAVE_MMAP)
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if defined(MAP_ANONYMOUS) || defined(MAP_ANON)
+# define USE_MMAP_ANON
+#endif
+
+#ifdef USE_MMAP_FIXED
+# define GC_MMAP_FLAGS (MAP_FIXED | MAP_PRIVATE)
+ /* Seems to yield better performance on Solaris 2, but can */
+ /* be unreliable if something is already mapped at the address. */
+#else
+# define GC_MMAP_FLAGS MAP_PRIVATE
+#endif
+
+#ifdef USE_MMAP_ANON
+# if defined(CPPCHECK)
+# define OPT_MAP_ANON 0x20 /* taken from linux */
+# elif defined(MAP_ANONYMOUS)
+# define OPT_MAP_ANON MAP_ANONYMOUS
+# else
+# define OPT_MAP_ANON MAP_ANON
+# endif
+#else
+# include <unistd.h> /* for close() */
+# define OPT_MAP_ANON 0
+#endif
+
+static volatile AO_t mmap_enabled = 0;
+
+AO_API void
+AO_malloc_enable_mmap(void)
+{
+# if defined(__sun)
+ AO_store_release(&mmap_enabled, 1);
+ /* Workaround for Sun CC */
+# else
+ AO_store(&mmap_enabled, 1);
+# endif
+}
+
+static char *get_mmaped(size_t sz)
+{
+ char * result;
+# ifdef USE_MMAP_ANON
+# define zero_fd -1
+# else
+ int zero_fd;
+# endif
+
+ assert(!(sz & (CHUNK_SIZE - 1)));
+ if (!mmap_enabled)
+ return 0;
+
+# ifndef USE_MMAP_ANON
+ zero_fd = open("/dev/zero", O_RDONLY);
+ if (zero_fd == -1)
+ return 0;
+# endif
+ result = (char *)mmap(0, sz, PROT_READ | PROT_WRITE,
+ GC_MMAP_FLAGS | OPT_MAP_ANON,
+ zero_fd, 0 /* offset */);
+# ifndef USE_MMAP_ANON
+ close(zero_fd);
+# endif
+ if (AO_EXPECT_FALSE(result == MAP_FAILED))
+ result = NULL;
+ return result;
+}
+
+#ifndef SIZE_MAX
+# include <limits.h>
+#endif
+#if defined(SIZE_MAX) && !defined(CPPCHECK)
+# define AO_SIZE_MAX ((size_t)SIZE_MAX)
+ /* Extra cast to workaround some buggy SIZE_MAX definitions. */
+#else
+# define AO_SIZE_MAX (~(size_t)0)
+#endif
+
+/* Saturated addition of size_t values. Used to avoid value wrap */
+/* around on overflow. The arguments should have no side effects. */
+#define SIZET_SAT_ADD(a, b) \
+ (AO_EXPECT_FALSE((a) >= AO_SIZE_MAX - (b)) ? AO_SIZE_MAX : (a) + (b))
+
+/* Allocate an object of size (incl. header) of size > CHUNK_SIZE. */
+/* sz includes space for an AO_t-sized header. */
+static char *
+AO_malloc_large(size_t sz)
+{
+ void *result;
+
+ /* The header will force us to waste ALIGNMENT bytes, incl. header. */
+ /* Round to multiple of CHUNK_SIZE. */
+ sz = SIZET_SAT_ADD(sz, ALIGNMENT + CHUNK_SIZE - 1) & ~(CHUNK_SIZE - 1);
+ assert(sz > LOG_MAX_SIZE);
+ result = get_mmaped(sz);
+ if (AO_EXPECT_FALSE(NULL == result))
+ return NULL;
+
+ result = (AO_t *)result + ALIGNMENT / sizeof(AO_t);
+ ((AO_t *)result)[-1] = (AO_t)sz;
+ return (char *)result;
+}
+
+static void
+AO_free_large(void *p)
+{
+ AO_t sz = ((AO_t *)p)[-1];
+ if (munmap((AO_t *)p - ALIGNMENT / sizeof(AO_t), (size_t)sz) != 0)
+ abort(); /* Programmer error. Not really async-signal-safe, but ... */
+}
+
+
+#else /* No MMAP */
+
+AO_API void
+AO_malloc_enable_mmap(void)
+{
+}
+
+#define get_mmaped(sz) ((char*)0)
+#define AO_malloc_large(sz) ((char*)0)
+#define AO_free_large(p) abort()
+ /* Programmer error. Not really async-signal-safe, but ... */
+
+#endif /* No MMAP */
+
+static char *
+get_chunk(void)
+{
+ char *my_chunk_ptr;
+
+ for (;;) {
+ char *initial_ptr = (char *)AO_load(&initial_heap_ptr);
+
+ my_chunk_ptr = (char *)(((AO_t)initial_ptr + (ALIGNMENT - 1))
+ & ~(ALIGNMENT - 1));
+ if (initial_ptr != my_chunk_ptr)
+ {
+ /* Align correctly. If this fails, someone else did it for us. */
+ (void)AO_compare_and_swap_acquire(&initial_heap_ptr,
+ (AO_t)initial_ptr, (AO_t)my_chunk_ptr);
+ }
+
+ if (AO_EXPECT_FALSE((AO_t)my_chunk_ptr - (AO_t)AO_initial_heap
+ > (size_t)(AO_INITIAL_HEAP_SIZE - CHUNK_SIZE))) {
+ /* We failed. The initial heap is used up. */
+ my_chunk_ptr = get_mmaped(CHUNK_SIZE);
+# if !defined(CPPCHECK)
+ assert(((AO_t)my_chunk_ptr & (ALIGNMENT-1)) == 0);
+# endif
+ break;
+ }
+ if (AO_compare_and_swap(&initial_heap_ptr, (AO_t)my_chunk_ptr,
+ (AO_t)(my_chunk_ptr + CHUNK_SIZE))) {
+ break;
+ }
+ }
+ return my_chunk_ptr;
+}
+
+/* Object free lists. Ith entry corresponds to objects */
+/* of total size 2**i bytes. */
+static AO_stack_t AO_free_list[LOG_MAX_SIZE+1];
+
+/* Break up the chunk, and add it to the object free list for */
+/* the given size. We have exclusive access to chunk. */
+static void add_chunk_as(void * chunk, unsigned log_sz)
+{
+ size_t ofs, limit;
+ size_t sz = (size_t)1 << log_sz;
+
+ assert((size_t)CHUNK_SIZE >= sz);
+ assert(sz % sizeof(AO_t) == 0);
+ limit = (size_t)CHUNK_SIZE - sz;
+ for (ofs = ALIGNMENT - sizeof(AO_t); ofs <= limit; ofs += sz) {
+ ASAN_POISON_MEMORY_REGION((char *)chunk + ofs + sizeof(AO_t),
+ sz - sizeof(AO_t));
+ AO_stack_push(&AO_free_list[log_sz], (AO_t *)chunk + ofs / sizeof(AO_t));
+ }
+}
+
+static const unsigned char msbs[16] = {
+ 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4
+};
+
+/* Return the position of the most significant set bit in the */
+/* argument. */
+/* We follow the conventions of ffs(), i.e. the least */
+/* significant bit is number one. */
+static unsigned msb(size_t s)
+{
+ unsigned result = 0;
+ if ((s & 0xff) != s) {
+# if (__SIZEOF_SIZE_T__ == 8) && !defined(CPPCHECK)
+ unsigned v = (unsigned)(s >> 32);
+ if (AO_EXPECT_FALSE(v != 0))
+ {
+ s = v;
+ result += 32;
+ }
+# elif __SIZEOF_SIZE_T__ == 4
+ /* No op. */
+# else
+ unsigned v;
+ /* The following is a tricky code ought to be equivalent to */
+ /* "(v = s >> 32) != 0" but suppresses warnings on 32-bit arch's. */
+# define SIZEOF_SIZE_T_GT_4 (sizeof(size_t) > 4)
+ if (SIZEOF_SIZE_T_GT_4
+ && (v = (unsigned)(s >> (SIZEOF_SIZE_T_GT_4 ? 32 : 0))) != 0)
+ {
+ s = v;
+ result += 32;
+ }
+# endif /* !defined(__SIZEOF_SIZE_T__) */
+ if (AO_EXPECT_FALSE((s >> 16) != 0))
+ {
+ s >>= 16;
+ result += 16;
+ }
+ if ((s >> 8) != 0)
+ {
+ s >>= 8;
+ result += 8;
+ }
+ }
+ if (s > 15)
+ {
+ s >>= 4;
+ result += 4;
+ }
+ result += msbs[s];
+ return result;
+}
+
+AO_API AO_ATTR_MALLOC AO_ATTR_ALLOC_SIZE(1)
+void *
+AO_malloc(size_t sz)
+{
+ AO_t *result;
+ unsigned log_sz;
+
+ if (AO_EXPECT_FALSE(sz > CHUNK_SIZE - sizeof(AO_t)))
+ return AO_malloc_large(sz);
+ log_sz = msb(sz + (sizeof(AO_t) - 1));
+ assert(log_sz <= LOG_MAX_SIZE);
+ assert(((size_t)1 << log_sz) >= sz + sizeof(AO_t));
+ result = AO_stack_pop(AO_free_list+log_sz);
+ while (AO_EXPECT_FALSE(NULL == result)) {
+ void * chunk = get_chunk();
+
+ if (AO_EXPECT_FALSE(NULL == chunk))
+ return NULL;
+ add_chunk_as(chunk, log_sz);
+ result = AO_stack_pop(AO_free_list+log_sz);
+ }
+ *result = log_sz;
+# ifdef AO_TRACE_MALLOC
+ fprintf(stderr, "%p: AO_malloc(%lu) = %p\n",
+ (void *)pthread_self(), (unsigned long)sz, (void *)(result + 1));
+# endif
+ ASAN_UNPOISON_MEMORY_REGION(result + 1, sz);
+ return result + 1;
+}
+
+AO_API void
+AO_free(void *p)
+{
+ AO_t *base;
+ int log_sz;
+
+ if (AO_EXPECT_FALSE(NULL == p))
+ return;
+
+ base = (AO_t *)p - 1;
+ log_sz = (int)(*base);
+# ifdef AO_TRACE_MALLOC
+ fprintf(stderr, "%p: AO_free(%p sz:%lu)\n", (void *)pthread_self(), p,
+ log_sz > LOG_MAX_SIZE ? (unsigned)log_sz : 1UL << log_sz);
+# endif
+ if (AO_EXPECT_FALSE(log_sz > LOG_MAX_SIZE)) {
+ AO_free_large(p);
+ } else {
+ ASAN_POISON_MEMORY_REGION(base + 1, ((size_t)1 << log_sz) - sizeof(AO_t));
+ AO_stack_push(AO_free_list + log_sz, base);
+ }
+}
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops_malloc.h b/graphics/asymptote/libatomic_ops/src/atomic_ops_malloc.h
new file mode 100644
index 0000000000..be997f5bb4
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops_malloc.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2005 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* Almost lock-free malloc implementation based on stack implementation. */
+/* See README_malloc.txt file for detailed usage rules. */
+
+#ifndef AO_MALLOC_H
+#define AO_MALLOC_H
+
+#include "atomic_ops_stack.h"
+
+#include <stddef.h> /* for size_t */
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifdef AO_STACK_IS_LOCK_FREE
+# define AO_MALLOC_IS_LOCK_FREE
+#endif
+
+#ifndef AO_ATTR_MALLOC
+# if AO_GNUC_PREREQ(3, 1)
+# define AO_ATTR_MALLOC __attribute__((__malloc__))
+# elif defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(__EDG__)
+# define AO_ATTR_MALLOC \
+ __declspec(allocator) __declspec(noalias) __declspec(restrict)
+# elif defined(_MSC_VER) && _MSC_VER >= 1400
+# define AO_ATTR_MALLOC __declspec(noalias) __declspec(restrict)
+# else
+# define AO_ATTR_MALLOC /* empty */
+# endif
+#endif
+
+#ifndef AO_ATTR_ALLOC_SIZE
+# ifdef __clang__
+# if __has_attribute(__alloc_size__)
+# define AO_ATTR_ALLOC_SIZE(argnum) \
+ __attribute__((__alloc_size__(argnum)))
+# else
+# define AO_ATTR_ALLOC_SIZE(argnum) /* empty */
+# endif
+# elif AO_GNUC_PREREQ(4, 3) && !defined(__ICC)
+# define AO_ATTR_ALLOC_SIZE(argnum) __attribute__((__alloc_size__(argnum)))
+# else
+# define AO_ATTR_ALLOC_SIZE(argnum) /* empty */
+# endif
+#endif
+
+AO_API void AO_free(void *);
+
+AO_API AO_ATTR_MALLOC AO_ATTR_ALLOC_SIZE(1)
+void * AO_malloc(size_t);
+
+/* Allow use of mmap to grow the heap. No-op on some platforms. */
+AO_API void AO_malloc_enable_mmap(void);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* !AO_MALLOC_H */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops_stack.c b/graphics/asymptote/libatomic_ops/src/atomic_ops_stack.c
new file mode 100644
index 0000000000..3a8c1f8e2f
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops_stack.c
@@ -0,0 +1,380 @@
+/*
+ * Copyright (c) 2005 Hewlett-Packard Development Company, L.P.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#if defined(HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#ifndef AO_BUILD
+# define AO_BUILD
+#endif
+
+#ifndef AO_REAL_PTR_AS_MACRO
+# define AO_REAL_PTR_AS_MACRO
+#endif
+
+#define AO_REQUIRE_CAS
+#include "atomic_ops_stack.h"
+
+AO_API void AO_stack_init(AO_stack_t *list)
+{
+ memset(list, 0, sizeof(AO_stack_t));
+}
+
+AO_API int AO_stack_is_lock_free(void)
+{
+# ifdef AO_USE_ALMOST_LOCK_FREE
+ return 0;
+# else
+ return 1;
+# endif
+}
+
+AO_API AO_t *AO_stack_head_ptr(const AO_stack_t *list)
+{
+ return AO_REAL_HEAD_PTR(*list);
+}
+
+AO_API AO_t *AO_stack_next_ptr(AO_t next)
+{
+ return AO_REAL_NEXT_PTR(next);
+}
+
+/* This function call must be a part of a do-while loop with a CAS */
+/* designating the condition of the loop (see the use cases below). */
+#ifdef AO_THREAD_SANITIZER
+ AO_ATTR_NO_SANITIZE_THREAD
+ static void store_before_cas(AO_t *addr, AO_t value)
+ {
+ *addr = value;
+ }
+#else
+# define store_before_cas(addr, value) (void)(*(addr) = (value))
+#endif
+
+#ifdef AO_USE_ALMOST_LOCK_FREE
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+ AO_API void AO_pause(int); /* defined in atomic_ops.c */
+# ifdef __cplusplus
+ } /* extern "C" */
+# endif
+
+# if defined(__alpha__) && (__GNUC__ == 4)
+ /* Workaround __builtin_expect bug found in */
+ /* gcc-4.6.3/alpha causing test_stack failure. */
+# undef AO_EXPECT_FALSE
+# define AO_EXPECT_FALSE(expr) (expr)
+# endif
+
+ /* LIFO linked lists based on compare-and-swap. We need to avoid */
+ /* the case of a node deletion and reinsertion while I'm deleting */
+ /* it, since that may cause my CAS to succeed eventhough the next */
+ /* pointer is now wrong. Our solution is not fully lock-free, but it */
+ /* is good enough for signal handlers, provided we have a suitably */
+ /* low bound on the number of recursive signal handler reentries. */
+ /* A list consists of a first pointer and a blacklist of pointer */
+ /* values that are currently being removed. No list element on */
+ /* the blacklist may be inserted. If we would otherwise do so, we */
+ /* are allowed to insert a variant that differs only in the least */
+ /* significant, ignored, bits. If the list is full, we wait. */
+
+ /* Crucial observation: A particular padded pointer x (i.e. pointer */
+ /* plus arbitrary low order bits) can never be newly inserted into */
+ /* a list while it's in the corresponding auxiliary data structure. */
+
+ /* The second argument is a pointer to the link field of the element */
+ /* to be inserted. */
+ /* Both list headers and link fields contain "perturbed" pointers, */
+ /* i.e. pointers with extra bits or'ed into the low order bits. */
+ AO_API void AO_stack_push_explicit_aux_release(volatile AO_t *list, AO_t *x,
+ AO_stack_aux *a)
+ {
+ AO_t x_bits = (AO_t)x;
+ AO_t next;
+
+ /* No deletions of x can start here, since x is not */
+ /* currently in the list. */
+ retry:
+ do {
+ next = AO_load_acquire(list);
+ store_before_cas(x, next);
+ {
+# if AO_BL_SIZE == 2
+ /* Start all loads as close to concurrently as possible. */
+ AO_t entry1 = AO_load(&a->AO_stack_bl[0]);
+ AO_t entry2 = AO_load(&a->AO_stack_bl[1]);
+ if (AO_EXPECT_FALSE(entry1 == x_bits || entry2 == x_bits))
+# else
+ int i;
+ for (i = 0; i < AO_BL_SIZE; ++i)
+ if (AO_EXPECT_FALSE(AO_load(&a->AO_stack_bl[i]) == x_bits))
+# endif
+ {
+ /* Entry is currently being removed. Change it a little. */
+ ++x_bits;
+ if ((x_bits & AO_BIT_MASK) == 0)
+ /* Version count overflowed; EXTREMELY unlikely, but possible. */
+ x_bits = (AO_t)x;
+ goto retry;
+ }
+ }
+
+ /* x_bits value is not currently being deleted. */
+ } while (AO_EXPECT_FALSE(!AO_compare_and_swap_release(list, next,
+ x_bits)));
+ }
+
+ /* I concluded experimentally that checking a value first before */
+ /* performing a compare-and-swap is usually beneficial on x86, but */
+ /* slows things down appreciably with contention on Itanium. */
+ /* Since the Itanium behavior makes more sense to me (more cache line */
+ /* movement unless we're mostly reading, but back-off should guard */
+ /* against that), we take Itanium as the default. Measurements on */
+ /* other multiprocessor architectures would be useful. */
+ /* (On a uniprocessor, the initial check is almost certainly a very */
+ /* small loss.) - HB */
+# ifdef __i386__
+# define PRECHECK(a) (a) == 0 &&
+# else
+# define PRECHECK(a)
+# endif
+
+ /* This function is used before CAS in the below AO_stack_pop and the */
+ /* data race (reported by TSan) is OK because it results in a retry. */
+# ifdef AO_THREAD_SANITIZER
+ AO_ATTR_NO_SANITIZE_THREAD
+ static AO_t AO_load_next(const volatile AO_t *first_ptr)
+ {
+ /* Assuming an architecture on which loads of word type are */
+ /* atomic. AO_load cannot be used here because it cannot be */
+ /* instructed to suppress the warning about the race. */
+ return *first_ptr;
+ }
+# else
+# define AO_load_next AO_load
+# endif
+
+ AO_API AO_t *AO_stack_pop_explicit_aux_acquire(volatile AO_t *list,
+ AO_stack_aux *a)
+ {
+ unsigned i;
+ int j = 0;
+ AO_t first;
+ AO_t * first_ptr;
+ AO_t next;
+
+ retry:
+ first = AO_load(list);
+ if (0 == first) return 0;
+ /* Insert first into aux black list. */
+ /* This may spin if more than AO_BL_SIZE removals using auxiliary */
+ /* structure a are currently in progress. */
+ for (i = 0; ; )
+ {
+ if (PRECHECK(a -> AO_stack_bl[i])
+ AO_compare_and_swap_acquire(a->AO_stack_bl+i, 0, first))
+ break;
+ if (++i >= AO_BL_SIZE)
+ {
+ i = 0;
+ AO_pause(++j);
+ }
+ }
+# ifndef AO_THREAD_SANITIZER
+ assert(a -> AO_stack_bl[i] == first);
+ /* No actual race with the above CAS. */
+# endif
+ /* first is on the auxiliary black list. It may be removed by */
+ /* another thread before we get to it, but a new insertion of x */
+ /* cannot be started here. Only we can remove it from the black */
+ /* list. We need to make sure that first is still the first entry */
+ /* on the list. Otherwise it is possible that a reinsertion of it */
+ /* was already started before we added the black list entry. */
+ if (AO_EXPECT_FALSE(first != AO_load_acquire(list)))
+ /* Workaround test failure on AIX, at least, by */
+ /* using acquire ordering semantics for this */
+ /* load. Probably, it is not the right fix. */
+ {
+ AO_store_release(a->AO_stack_bl+i, 0);
+ goto retry;
+ }
+ first_ptr = AO_REAL_NEXT_PTR(first);
+ next = AO_load_next(first_ptr);
+ if (AO_EXPECT_FALSE(!AO_compare_and_swap_release(list, first, next)))
+ {
+ AO_store_release(a->AO_stack_bl+i, 0);
+ goto retry;
+ }
+# ifndef AO_THREAD_SANITIZER
+ assert(*list != first); /* No actual race with the above CAS. */
+# endif
+ /* Since we never insert an entry on the black list, this cannot */
+ /* have succeeded unless first remained on the list while we were */
+ /* running. Thus, its next link cannot have changed out from under */
+ /* us, and we removed exactly one entry and preserved the rest of */
+ /* the list. Note that it is quite possible that an additional */
+ /* entry was inserted and removed while we were running; this is OK */
+ /* since the part of the list following first must have remained */
+ /* unchanged, and first must again have been at the head of the */
+ /* list when the compare_and_swap succeeded. */
+ AO_store_release(a->AO_stack_bl+i, 0);
+ return first_ptr;
+ }
+
+ AO_API void AO_stack_push_release(AO_stack_t *list, AO_t *x)
+ {
+ AO_stack_push_explicit_aux_release(&list->AO_pa.AO_ptr, x,
+ &list->AO_pa.AO_aux);
+ }
+
+ AO_API AO_t *AO_stack_pop_acquire(AO_stack_t *list)
+ {
+ return AO_stack_pop_explicit_aux_acquire(&list->AO_pa.AO_ptr,
+ &list->AO_pa.AO_aux);
+ }
+
+#else /* !AO_USE_ALMOST_LOCK_FREE */
+
+ /* The functionality is the same as of AO_load_next but the atomicity */
+ /* is not needed. The usage is similar to that of store_before_cas. */
+# if defined(AO_THREAD_SANITIZER) \
+ && (defined(AO_HAVE_compare_and_swap_double) \
+ || defined(AO_HAVE_compare_double_and_swap_double))
+ /* TODO: If compiled by Clang (as of clang-4.0) with -O3 flag, */
+ /* no_sanitize attribute is ignored unless the argument is volatile.*/
+# if defined(__clang__)
+# define LOAD_BEFORE_CAS_VOLATILE volatile
+# else
+# define LOAD_BEFORE_CAS_VOLATILE /* empty */
+# endif
+ AO_ATTR_NO_SANITIZE_THREAD
+ static AO_t load_before_cas(const LOAD_BEFORE_CAS_VOLATILE AO_t *addr)
+ {
+ return *addr;
+ }
+# else
+# define load_before_cas(addr) (*(addr))
+# endif /* !AO_THREAD_SANITIZER */
+
+ /* Better names for fields in AO_stack_t. */
+# define version AO_vp.AO_val1
+# define ptr AO_vp.AO_val2
+
+# if defined(AO_HAVE_compare_double_and_swap_double) \
+ && !(defined(AO_STACK_PREFER_CAS_DOUBLE) \
+ && defined(AO_HAVE_compare_and_swap_double))
+
+# ifdef LINT2
+ volatile /* non-static */ AO_t AO_noop_sink;
+# endif
+
+ AO_API void AO_stack_push_release(AO_stack_t *list, AO_t *element)
+ {
+ AO_t next;
+
+ do {
+ next = AO_load(&list->ptr);
+ store_before_cas(element, next);
+ } while (AO_EXPECT_FALSE(!AO_compare_and_swap_release(&list->ptr, next,
+ (AO_t)element)));
+ /* This uses a narrow CAS here, an old optimization suggested */
+ /* by Treiber. Pop is still safe, since we run into the ABA */
+ /* problem only if there were both intervening pops and pushes. */
+ /* In that case we still see a change in the version number. */
+# ifdef LINT2
+ /* Instruct static analyzer that element is not lost. */
+ AO_noop_sink = (AO_t)element;
+# endif
+ }
+
+ AO_API AO_t *AO_stack_pop_acquire(AO_stack_t *list)
+ {
+# if defined(__clang__) && !AO_CLANG_PREREQ(3, 5)
+ AO_t *volatile cptr;
+ /* Use volatile to workaround a bug in */
+ /* clang-1.1/x86 causing test_stack failure. */
+# else
+ AO_t *cptr;
+# endif
+ AO_t next;
+ AO_t cversion;
+
+ do {
+ /* Version must be loaded first. */
+ cversion = AO_load_acquire(&list->version);
+ cptr = (AO_t *)AO_load(&list->ptr);
+ if (NULL == cptr)
+ return NULL;
+ next = load_before_cas((/* no volatile */ AO_t *)cptr);
+ } while (AO_EXPECT_FALSE(!AO_compare_double_and_swap_double_release(
+ &list->AO_vp, cversion, (AO_t)cptr,
+ cversion+1, next)));
+ return cptr;
+ }
+
+# elif defined(AO_HAVE_compare_and_swap_double)
+
+ /* Needed for future IA64 processors. No current clients? */
+ /* TODO: Not tested thoroughly. */
+
+ /* We have a wide CAS, but only does an AO_t-wide comparison. */
+ /* We cannot use the Treiber optimization, since we only check */
+ /* for an unchanged version number, not an unchanged pointer. */
+ AO_API void AO_stack_push_release(AO_stack_t *list, AO_t *element)
+ {
+ AO_t cversion;
+
+ do {
+ AO_t next_ptr;
+
+ /* Again version must be loaded first, for different reason. */
+ cversion = AO_load_acquire(&list->version);
+ next_ptr = AO_load(&list->ptr);
+ store_before_cas(element, next_ptr);
+ } while (!AO_compare_and_swap_double_release(&list->AO_vp, cversion,
+ cversion+1, (AO_t)element));
+ }
+
+ AO_API AO_t *AO_stack_pop_acquire(AO_stack_t *list)
+ {
+ AO_t *cptr;
+ AO_t next;
+ AO_t cversion;
+
+ do {
+ cversion = AO_load_acquire(&list->version);
+ cptr = (AO_t *)AO_load(&list->ptr);
+ if (NULL == cptr)
+ return NULL;
+ next = load_before_cas(cptr);
+ } while (!AO_compare_double_and_swap_double_release(&list->AO_vp,
+ cversion, (AO_t)cptr, cversion+1, next));
+ return cptr;
+ }
+# endif /* AO_HAVE_compare_and_swap_double */
+
+# undef ptr
+# undef version
+#endif /* !AO_USE_ALMOST_LOCK_FREE */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops_stack.h b/graphics/asymptote/libatomic_ops/src/atomic_ops_stack.h
new file mode 100644
index 0000000000..5efea4e670
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops_stack.h
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 2005 Hewlett-Packard Development Company, L.P.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION 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 implementation of the routines described here is covered by the GPL.
+ * This header file is covered by the above license.
+ */
+
+/* Almost lock-free LIFO linked lists (linked stacks). */
+#ifndef AO_STACK_H
+#define AO_STACK_H
+
+#include "atomic_ops.h"
+
+#ifndef AO_HAVE_double_t
+ /* Can happen if we are using CAS emulation, since we do not want to */
+ /* force that here, in case other atomic_ops clients do not want it. */
+# include "atomic_ops/sysdeps/standard_ao_double_t.h"
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifdef AO_USE_ALMOST_LOCK_FREE
+ /* Use the almost-non-blocking implementation regardless of the */
+ /* double-word CAS availability. */
+#elif !defined(AO_HAVE_compare_double_and_swap_double) \
+ && !defined(AO_HAVE_compare_and_swap_double) \
+ && defined(AO_HAVE_compare_and_swap)
+# define AO_USE_ALMOST_LOCK_FREE
+#else
+ /* If we have no compare-and-swap operation defined, we assume */
+ /* that we will actually be using CAS emulation. If we do that, */
+ /* it's cheaper to use the version-based implementation. */
+# define AO_STACK_IS_LOCK_FREE
+#endif
+
+/*
+ * These are not guaranteed to be completely lock-free.
+ * List insertion may spin under extremely unlikely conditions.
+ * It cannot deadlock due to recursive reentry unless AO_list_remove
+ * is called while at least AO_BL_SIZE activations of
+ * AO_list_remove are currently active in the same thread, i.e.
+ * we must have at least AO_BL_SIZE recursive signal handler
+ * invocations.
+ *
+ * All operations take an AO_list_aux argument. It is safe to
+ * share a single AO_list_aux structure among all lists, but that
+ * may increase contention. Any given list must always be accessed
+ * with the same AO_list_aux structure.
+ *
+ * We make some machine-dependent assumptions:
+ * - We have a compare-and-swap operation.
+ * - At least AO_N_BITS low order bits in pointers are
+ * zero and normally unused.
+ * - size_t and pointers have the same size.
+ *
+ * We do use a fully lock-free implementation if double-width
+ * compare-and-swap operations are available.
+ */
+
+/* AO_stack_aux should be treated as opaque. It is fully defined */
+/* here, so it can be allocated, and also to facilitate debugging. */
+/* Note: changing the value of AO_BL_SIZE leads to the ABI change. */
+#ifndef AO_BL_SIZE
+# define AO_BL_SIZE 2
+#endif
+
+/* The number of low order pointer bits we can use for a small */
+/* version number. */
+#if defined(__LP64__) || defined(_LP64) || defined(_WIN64)
+# define AO_N_BITS 3
+#else
+# define AO_N_BITS 2
+#endif
+
+#define AO_BIT_MASK ((1 << AO_N_BITS) - 1)
+
+#if AO_BL_SIZE > (1 << AO_N_BITS)
+# error AO_BL_SIZE too big
+#endif
+
+#ifndef AO_STACK_ATTR_ALLIGNED
+ /* Enforce proper alignment of AO_stack_t.AO_pa to avoid the */
+ /* structure value to cross the CPU cache line boundary. */
+ /* A workaround for almost-lock-free push/pop test failures */
+ /* on aarch64, at least. */
+# if AO_BL_SIZE == 1
+ /* AO_vp is double-word aligned, so no extra align of AO_pa is needed. */
+# define AO_STACK_ATTR_ALLIGNED /* empty */
+# elif AO_GNUC_PREREQ(3, 1)
+# define AO_STACK_LOG_BL_SZP1 (AO_BL_SIZE > 7 ? 4 : AO_BL_SIZE > 3 ? 3 : 2)
+# define AO_STACK_ATTR_ALLIGNED \
+ __attribute__((__aligned__(sizeof(AO_t) << AO_STACK_LOG_BL_SZP1)))
+# elif defined(_MSC_VER) && _MSC_VER >= 1400 /* Visual Studio 2005+ */
+ /* MS compiler accepts only a literal number in align, not expression. */
+ /* AO_STACK_ALLIGN_N is 1 << (AO_N_BITS + AO_STACK_LOG_BL_SZP1). */
+# if AO_N_BITS > 2 && AO_BL_SIZE > 7
+# define AO_STACK_ALLIGN_N 128
+# elif (AO_N_BITS > 2 && AO_BL_SIZE > 3) || AO_BL_SIZE > 7
+# define AO_STACK_ALLIGN_N 64
+# elif AO_N_BITS > 2 || AO_BL_SIZE > 3
+# define AO_STACK_ALLIGN_N 32
+# else
+# define AO_STACK_ALLIGN_N 16
+# endif
+# define AO_STACK_ATTR_ALLIGNED __declspec(align(AO_STACK_ALLIGN_N))
+# else
+# define AO_STACK_ATTR_ALLIGNED /* TODO: alignment is not enforced */
+# endif
+#endif /* !AO_STACK_ATTR_ALLIGNED */
+
+typedef struct AO__stack_aux {
+ volatile AO_t AO_stack_bl[AO_BL_SIZE];
+} AO_stack_aux;
+
+struct AO__stack_ptr_aux {
+ volatile AO_t AO_ptr;
+ AO_stack_aux AO_aux;
+};
+
+/* The AO stack type. Should be treated as opaque. */
+/* Note: AO_stack_t variables are not intended to be local ones, */
+/* otherwise it is the client responsibility to ensure they have */
+/* double-word alignment. */
+typedef union AO__stack {
+ AO_STACK_ATTR_ALLIGNED struct AO__stack_ptr_aux AO_pa;
+ volatile AO_double_t AO_vp;
+} AO_stack_t;
+
+/* The static initializer of the AO stack type. */
+#define AO_STACK_INITIALIZER { /* .AO_pa= */ { 0, { {0} } } }
+
+#ifdef AO_USE_ALMOST_LOCK_FREE
+ /* The following two routines should not normally be used directly. */
+ /* We make them visible here for the rare cases in which it makes */
+ /* sense to share the AO_stack_aux between stacks. */
+
+ AO_API void
+ AO_stack_push_explicit_aux_release(volatile AO_t *list, AO_t *new_element,
+ AO_stack_aux *);
+
+ AO_API AO_t *
+ AO_stack_pop_explicit_aux_acquire(volatile AO_t *list, AO_stack_aux *);
+#endif /* AO_USE_ALMOST_LOCK_FREE */
+
+#ifndef AO_REAL_PTR_AS_MACRO
+ /* The stack implementation knows only about the location of */
+ /* link fields in nodes, and nothing about the rest of the */
+ /* stack elements. Link fields hold an AO_t, which is not */
+ /* necessarily a real pointer. This converts the AO_t to a */
+ /* real (AO_t *) which is either NULL, or points at the link */
+ /* field in the next node. */
+# define AO_REAL_NEXT_PTR(x) AO_stack_next_ptr(x)
+
+ /* Convert an AO_stack_t to a pointer to the link field in */
+ /* the first element. */
+# define AO_REAL_HEAD_PTR(x) AO_stack_head_ptr(&(x))
+
+#elif defined(AO_USE_ALMOST_LOCK_FREE)
+# define AO_REAL_NEXT_PTR(x) (AO_t *)((x) & ~AO_BIT_MASK)
+# define AO_REAL_HEAD_PTR(x) AO_REAL_NEXT_PTR((x).AO_pa.AO_ptr)
+#else
+# define AO_REAL_NEXT_PTR(x) (AO_t *)(x)
+# define AO_REAL_HEAD_PTR(x) (AO_t *)((x).AO_vp.AO_val2 /* ptr */)
+#endif /* AO_REAL_PTR_AS_MACRO && !AO_USE_ALMOST_LOCK_FREE */
+
+AO_API void AO_stack_push_release(AO_stack_t *list, AO_t *new_element);
+#define AO_HAVE_stack_push_release
+
+#define AO_stack_push(l, e) AO_stack_push_release(l, e)
+#define AO_HAVE_stack_push
+
+AO_API AO_t *AO_stack_pop_acquire(AO_stack_t *list);
+#define AO_HAVE_stack_pop_acquire
+
+#define AO_stack_pop(l) AO_stack_pop_acquire(l)
+#define AO_HAVE_stack_pop
+
+AO_API void AO_stack_init(AO_stack_t *list);
+AO_API int AO_stack_is_lock_free(void);
+
+AO_API AO_t *AO_stack_head_ptr(const AO_stack_t *list);
+AO_API AO_t *AO_stack_next_ptr(AO_t /* next */);
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* !AO_STACK_H */
diff --git a/graphics/asymptote/libatomic_ops/src/atomic_ops_sysdeps.S b/graphics/asymptote/libatomic_ops/src/atomic_ops_sysdeps.S
new file mode 100644
index 0000000000..f586f23bae
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/src/atomic_ops_sysdeps.S
@@ -0,0 +1,9 @@
+/*
+ * Include the appropriate system-dependent assembly file, if any.
+ * This is used only if the platform supports neither inline assembly
+ * code, nor appropriate compiler intrinsics.
+ */
+
+#if !defined(__GNUC__) && (defined(sparc) || defined(__sparc))
+# include "atomic_ops/sysdeps/sunc/sparc.S"
+#endif
diff --git a/graphics/asymptote/libatomic_ops/tests/Makefile.am b/graphics/asymptote/libatomic_ops/tests/Makefile.am
new file mode 100644
index 0000000000..60b739be7d
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/tests/Makefile.am
@@ -0,0 +1,148 @@
+EXTRA_DIST=test_atomic_include.template list_atomic.template run_parallel.h \
+ test_atomic_include.h list_atomic.c
+# We distribute test_atomic_include.h and list_atomic.c, since it is hard
+# to regenerate them on Windows without sed.
+
+BUILT_SOURCES = test_atomic_include.h list_atomic.i list_atomic.o
+CLEANFILES = list_atomic.i list_atomic.o
+
+AM_CPPFLAGS = \
+ -I$(top_builddir)/src -I$(top_srcdir)/src \
+ -I$(top_builddir)/tests -I$(top_srcdir)/tests
+
+CFLAGS += $(CFLAGS_EXTRA)
+
+TESTS = test_atomic$(EXEEXT) test_atomic_generalized$(EXEEXT)
+TEST_OBJS = test_atomic.o test_atomic_generalized-test_atomic.o
+check_PROGRAMS = test_atomic test_atomic_generalized
+
+if HAVE_PTHREAD_H
+TESTS += test_atomic_pthreads$(EXEEXT)
+TEST_OBJS += test_atomic_pthreads-test_atomic.o
+check_PROGRAMS += test_atomic_pthreads
+test_atomic_pthreads_SOURCES=$(test_atomic_SOURCES)
+test_atomic_pthreads_CPPFLAGS=-DAO_USE_PTHREAD_DEFS $(AM_CPPFLAGS)
+test_atomic_pthreads_LDADD=$(test_atomic_LDADD)
+endif
+
+test_atomic_SOURCES=test_atomic.c
+test_atomic_LDADD = $(THREADDLLIBS) $(top_builddir)/src/libatomic_ops.la
+
+test_atomic_generalized_SOURCES=$(test_atomic_SOURCES)
+test_atomic_generalized_CPPFLAGS= \
+ -DAO_PREFER_GENERALIZED -DAO_TEST_EMULATION $(AM_CPPFLAGS)
+test_atomic_generalized_LDADD=$(test_atomic_LDADD)
+
+if ENABLE_GPL
+
+TESTS += test_malloc$(EXEEXT) test_stack$(EXEEXT)
+TEST_OBJS += test_malloc.o test_stack.o
+check_PROGRAMS += test_malloc test_stack
+
+test_stack_SOURCES=test_stack.c
+test_stack_LDADD = $(THREADDLLIBS) \
+ $(top_builddir)/src/libatomic_ops_gpl.la
+
+test_malloc_SOURCES=test_malloc.c
+test_malloc_LDADD = $(THREADDLLIBS) \
+ $(top_builddir)/src/libatomic_ops_gpl.la
+
+## In case of static libraries build, libatomic_ops.a is already referenced
+## in dependency_libs attribute of libatomic_ops_gpl.la file.
+if ENABLE_SHARED
+test_malloc_LDADD += $(top_builddir)/src/libatomic_ops.la
+test_stack_LDADD += $(top_builddir)/src/libatomic_ops.la
+endif
+
+check-gpl-without-test-driver: test_malloc$(EXEEXT) test_stack$(EXEEXT)
+ ./test_stack$(EXEEXT)
+ ./test_malloc$(EXEEXT)
+
+else
+
+# Nothing to do.
+check-gpl-without-test-driver:
+
+endif
+
+.PHONY: check-gpl-without-test-driver
+
+# Run the tests directly (without test-driver):
+.PHONY: check-without-test-driver
+check-without-test-driver: $(TESTS) check-gpl-without-test-driver
+ @echo "The following will print some 'Missing ...' messages"
+ ./test_atomic$(EXEEXT)
+ ./test_atomic_generalized$(EXEEXT)
+ test ! -f test_atomic_pthreads$(EXEEXT) || ./test_atomic_pthreads$(EXEEXT)
+
+test_atomic_include.h: test_atomic_include.template
+ mkdir -p `dirname $@`
+ sed -e s:XX::g $? > $@
+ sed -e s:XX:_release:g $? >> $@
+ sed -e s:XX:_acquire:g $? >> $@
+ sed -e s:XX:_read:g $? >> $@
+ sed -e s:XX:_write:g $? >> $@
+ sed -e s:XX:_full:g $? >> $@
+ sed -e s:XX:_release_write:g $? >> $@
+ sed -e s:XX:_acquire_read:g $? >> $@
+ sed -e s:XX:_dd_acquire_read:g $? >> $@
+
+list_atomic.c: list_atomic.template
+ mkdir -p `dirname $@`
+ echo "#include \"atomic_ops.h\"" > $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX::g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_release:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_acquire:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_read:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_write:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_full:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_release_write:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_acquire_read:g $? >> $@
+ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g -e s:XX:_dd_acquire_read:g $? >> $@
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX::g $? >> $@
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_release:g $? >> $@
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_acquire:g $? >> $@
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_read:g $? >> $@
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_write:g $? >> $@
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_full:g $? >> $@
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_release_write:g $? >> $@
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_acquire_read:g $? >> $@
+ sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g -e s:XX:_dd_acquire_read:g $? >> $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX::g $? >> $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_release:g $? >> $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_acquire:g $? >> $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_read:g $? >> $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_write:g $? >> $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_full:g $? >> $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_release_write:g $? >> $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_acquire_read:g $? >> $@
+ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g -e s:XX:_dd_acquire_read:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX::g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_release:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_acquire:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_read:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_write:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_full:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_release_write:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_acquire_read:g $? >> $@
+ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g -e s:XX:_dd_acquire_read:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX::g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_release:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_acquire:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_read:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_write:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_full:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_release_write:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_acquire_read:g $? >> $@
+ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g -e s:XX:_dd_acquire_read:g $? >> $@
+
+list_atomic.i: list_atomic.c
+ mkdir -p `dirname $@`
+ $(COMPILE) $? -E > $@
+
+# Verify list_atomic.c syntax:
+list_atomic.o: list_atomic.c
+ $(COMPILE) -c -o $@ $?
+
+# Just compile all tests (without linking and execution):
+check-nolink-local: $(TEST_OBJS)
diff --git a/graphics/asymptote/libatomic_ops/tests/list_atomic.template b/graphics/asymptote/libatomic_ops/tests/list_atomic.template
new file mode 100644
index 0000000000..dbdc231cf0
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/tests/list_atomic.template
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* This generates a compilable program. But it is really meant to be */
+/* be used only with cc -E, to inspect the expensions generated by */
+/* primitives. */
+
+/* The result will not link or run. */
+
+#include <stdlib.h> /* for exit() */
+
+void XSIZE_list_atomicXX(void)
+{
+# if defined(AO_HAVE_XSIZE_loadXX) || defined(AO_HAVE_XSIZE_storeXX) \
+ || defined(AO_HAVE_XSIZE_fetch_and_addXX) \
+ || defined(AO_HAVE_XSIZE_fetch_and_add1XX) \
+ || defined(AO_HAVE_XSIZE_andXX) \
+ || defined(AO_HAVE_XSIZE_compare_and_swapXX) \
+ || defined(AO_HAVE_XSIZE_fetch_compare_and_swapXX)
+ static volatile XCTYPE val /* = 0 */;
+# endif
+# if defined(AO_HAVE_XSIZE_compare_and_swapXX) \
+ || defined(AO_HAVE_XSIZE_fetch_compare_and_swapXX)
+ static XCTYPE oldval /* = 0 */;
+# endif
+# if defined(AO_HAVE_XSIZE_storeXX) \
+ || defined(AO_HAVE_XSIZE_compare_and_swapXX) \
+ || defined(AO_HAVE_XSIZE_fetch_compare_and_swapXX)
+ static XCTYPE newval /* = 0 */;
+# endif
+# if defined(AO_HAVE_test_and_setXX)
+ AO_TS_t ts = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_XSIZE_fetch_and_addXX) || defined(AO_HAVE_XSIZE_andXX) \
+ || defined(AO_HAVE_XSIZE_orXX) || defined(AO_HAVE_XSIZE_xorXX)
+ static XCTYPE incr /* = 0 */;
+# endif
+
+# if defined(AO_HAVE_nopXX)
+ (void)"AO_nopXX(): ";
+ AO_nopXX();
+# else
+ (void)"No AO_nopXX";
+# endif
+
+# ifdef AO_HAVE_XSIZE_loadXX
+ (void)"AO_XSIZE_loadXX(&val):";
+ (void)AO_XSIZE_loadXX(&val);
+# else
+ (void)"No AO_XSIZE_loadXX";
+# endif
+# ifdef AO_HAVE_XSIZE_storeXX
+ (void)"AO_XSIZE_storeXX(&val, newval):";
+ AO_XSIZE_storeXX(&val, newval);
+# else
+ (void)"No AO_XSIZE_storeXX";
+# endif
+# ifdef AO_HAVE_XSIZE_fetch_and_addXX
+ (void)"AO_XSIZE_fetch_and_addXX(&val, incr):";
+ (void)AO_XSIZE_fetch_and_addXX(&val, incr);
+# else
+ (void)"No AO_XSIZE_fetch_and_addXX";
+# endif
+# ifdef AO_HAVE_XSIZE_fetch_and_add1XX
+ (void)"AO_XSIZE_fetch_and_add1XX(&val):";
+ (void)AO_XSIZE_fetch_and_add1XX(&val);
+# else
+ (void)"No AO_XSIZE_fetch_and_add1XX";
+# endif
+# ifdef AO_HAVE_XSIZE_fetch_and_sub1XX
+ (void)"AO_XSIZE_fetch_and_sub1XX(&val):";
+ (void)AO_XSIZE_fetch_and_sub1XX(&val);
+# else
+ (void)"No AO_XSIZE_fetch_and_sub1XX";
+# endif
+# ifdef AO_HAVE_XSIZE_andXX
+ (void)"AO_XSIZE_andXX(&val, incr):";
+ AO_XSIZE_andXX(&val, incr);
+# else
+ (void)"No AO_XSIZE_andXX";
+# endif
+# ifdef AO_HAVE_XSIZE_orXX
+ (void)"AO_XSIZE_orXX(&val, incr):";
+ AO_XSIZE_orXX(&val, incr);
+# else
+ (void)"No AO_XSIZE_orXX";
+# endif
+# ifdef AO_HAVE_XSIZE_xorXX
+ (void)"AO_XSIZE_xorXX(&val, incr):";
+ AO_XSIZE_xorXX(&val, incr);
+# else
+ (void)"No AO_XSIZE_xorXX";
+# endif
+# ifdef AO_HAVE_XSIZE_compare_and_swapXX
+ (void)"AO_XSIZE_compare_and_swapXX(&val, oldval, newval):";
+ if (!AO_XSIZE_compare_and_swapXX(&val, oldval, newval))
+ exit(1);
+# else
+ (void)"No AO_XSIZE_compare_and_swapXX";
+# endif
+ /* TODO: Add AO_compare_double_and_swap_doubleXX */
+ /* TODO: Add AO_compare_and_swap_doubleXX */
+# ifdef AO_HAVE_XSIZE_fetch_compare_and_swapXX
+ (void)"AO_XSIZE_fetch_compare_and_swapXX(&val, oldval, newval):";
+ if (AO_XSIZE_fetch_compare_and_swapXX(&val, oldval, newval) != oldval)
+ exit(1);
+# else
+ (void)"No AO_XSIZE_fetch_compare_and_swapXX";
+# endif
+
+# if defined(AO_HAVE_test_and_setXX)
+ (void)"AO_test_and_setXX(&ts):";
+ (void)AO_test_and_setXX(&ts);
+# else
+ (void)"No AO_test_and_setXX";
+# endif
+}
diff --git a/graphics/asymptote/libatomic_ops/tests/run_parallel.h b/graphics/asymptote/libatomic_ops/tests/run_parallel.h
new file mode 100644
index 0000000000..97e29cbe64
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/tests/run_parallel.h
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#if defined(_MSC_VER) || \
+ defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__) || \
+ defined(_WIN32_WINCE)
+# define USE_WINTHREADS
+#elif defined(__vxworks)
+# define USE_VXTHREADS
+#else
+# define USE_PTHREADS
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef USE_PTHREADS
+# include <pthread.h>
+#endif
+
+#ifdef USE_VXTHREADS
+# include <vxworks.h>
+# include <taskLib.h>
+#endif
+
+#ifdef USE_WINTHREADS
+# include <windows.h>
+#endif
+
+#include "atomic_ops.h"
+
+#if !defined(AO_ATOMIC_OPS_H) && !defined(CPPCHECK)
+# error Wrong atomic_ops.h included.
+#endif
+
+#if (defined(_WIN32_WCE) || defined(__MINGW32CE__)) && !defined(AO_HAVE_abort)
+# define abort() _exit(-1) /* there is no abort() in WinCE */
+#endif
+
+#ifndef AO_PTRDIFF_T
+# define AO_PTRDIFF_T ptrdiff_t
+#endif
+
+#ifndef MAX_NTHREADS
+# define MAX_NTHREADS 100
+#endif
+
+typedef void * (* thr_func)(void *);
+
+typedef int (* test_func)(void); /* Returns != 0 on success */
+
+void * run_parallel(int nthreads, thr_func f1, test_func t, const char *name);
+
+#ifdef USE_PTHREADS
+void * run_parallel(int nthreads, thr_func f1, test_func t, const char *name)
+{
+ pthread_attr_t attr;
+ pthread_t thr[MAX_NTHREADS];
+ int i;
+
+ printf("Testing %s\n", name);
+ if (nthreads > MAX_NTHREADS)
+ {
+ fprintf(stderr, "run_parallel: requested too many threads\n");
+ abort();
+ }
+
+# ifdef _HPUX_SOURCE
+ /* Default stack size is too small, especially with the 64 bit ABI */
+ /* Increase it. */
+ if (pthread_default_stacksize_np(1024*1024, 0) != 0)
+ {
+ fprintf(stderr, "pthread_default_stacksize_np failed. "
+ "OK after first call.\n");
+ }
+# endif
+
+ pthread_attr_init(&attr);
+
+ for (i = 0; i < nthreads; ++i)
+ {
+ int code = pthread_create(thr + i, &attr, f1, (void *)(long)i);
+ if (code != 0)
+ {
+ fprintf(stderr, "pthread_create returned %d, thread %d\n", code, i);
+ abort();
+ }
+ }
+ for (i = 0; i < nthreads; ++i)
+ {
+ int code = pthread_join(thr[i], NULL);
+ if (code != 0)
+ {
+ fprintf(stderr, "pthread_join returned %d, thread %d\n", code, i);
+ abort();
+ }
+ }
+ if (t())
+ {
+ printf("Succeeded\n");
+ }
+ else
+ {
+ fprintf(stderr, "Failed\n");
+ abort();
+ }
+ return 0;
+}
+#endif /* USE_PTHREADS */
+
+#ifdef USE_VXTHREADS
+void * run_parallel(int nthreads, thr_func f1, test_func t, const char *name)
+{
+ int thr[MAX_NTHREADS];
+ int i;
+
+ printf("Testing %s\n", name);
+ if (nthreads > MAX_NTHREADS)
+ {
+ fprintf(stderr, "run_parallel: requested too many threads\n");
+ taskSuspend(0);
+ }
+
+ for (i = 0; i < nthreads; ++i)
+ {
+ thr[i] = taskSpawn((char*) name, 180, 0, 32768, (FUNCPTR) f1, i,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9);
+ if (thr[i] == ERROR)
+ {
+ fprintf(stderr, "taskSpawn failed with %d, thread %d\n",
+ errno, i);
+ taskSuspend(0);
+ }
+ }
+ for (i = 0; i < nthreads; ++i)
+ {
+ while (taskIdVerify(thr[i]) == OK)
+ taskDelay(60);
+ }
+ if (t())
+ {
+ printf("Succeeded\n");
+ }
+ else
+ {
+ fprintf(stderr, "Failed\n");
+ taskSuspend(0);
+ }
+ return 0;
+}
+#endif /* USE_VXTHREADS */
+
+#ifdef USE_WINTHREADS
+
+struct tramp_args {
+ thr_func fn;
+ long arg;
+};
+
+DWORD WINAPI tramp(LPVOID param)
+{
+ struct tramp_args *args = (struct tramp_args *)param;
+
+ return (DWORD)(AO_PTRDIFF_T)(*args->fn)((LPVOID)(AO_PTRDIFF_T)args->arg);
+}
+
+void * run_parallel(int nthreads, thr_func f1, test_func t, const char *name)
+{
+ HANDLE thr[MAX_NTHREADS];
+ struct tramp_args args[MAX_NTHREADS];
+ int i;
+
+ printf("Testing %s\n", name);
+ if (nthreads > MAX_NTHREADS)
+ {
+ fprintf(stderr, "run_parallel: requested too many threads\n");
+ abort();
+ }
+
+ for (i = 0; i < nthreads; ++i)
+ {
+ args[i].fn = f1;
+ args[i].arg = i;
+ if ((thr[i] = CreateThread(NULL, 0, tramp, (LPVOID)(args+i), 0, NULL))
+ == NULL)
+ {
+ fprintf(stderr, "CreateThread failed with %lu, thread %d\n",
+ (unsigned long)GetLastError(), i);
+ abort();
+ }
+ }
+ for (i = 0; i < nthreads; ++i)
+ {
+ DWORD code = WaitForSingleObject(thr[i], INFINITE);
+ if (code != WAIT_OBJECT_0)
+ {
+ fprintf(stderr, "WaitForSingleObject returned %lu, thread %d\n",
+ (unsigned long)code, i);
+ abort();
+ }
+ }
+ if (t())
+ {
+ printf("Succeeded\n");
+ }
+ else
+ {
+ fprintf(stderr, "Failed\n");
+ abort();
+ }
+ return 0;
+}
+#endif /* USE_WINTHREADS */
diff --git a/graphics/asymptote/libatomic_ops/tests/test_atomic.c b/graphics/asymptote/libatomic_ops/tests/test_atomic.c
new file mode 100644
index 0000000000..e773b266a2
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/tests/test_atomic.c
@@ -0,0 +1,267 @@
+/*
+ * Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#if defined(HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+#if (defined(AO_NO_PTHREADS) || defined(__MINGW32__)) \
+ && defined(AO_USE_PTHREAD_DEFS)
+# include <stdio.h>
+
+ int main(void)
+ {
+ printf("test skipped\n");
+ return 0;
+ }
+
+#else
+
+#include "run_parallel.h"
+
+#include "test_atomic_include.h"
+
+#if defined(AO_USE_PTHREAD_DEFS) || defined(AO_PREFER_GENERALIZED)
+# define NITERS 100000
+#else
+# define NITERS 10000000
+#endif
+
+void * add1sub1_thr(void * id);
+int add1sub1_test(void);
+void * acqrel_thr(void *id);
+int acqrel_test(void);
+void * test_and_set_thr(void * id);
+int test_and_set_test(void);
+
+#if defined(AO_HAVE_fetch_and_add1) && defined(AO_HAVE_fetch_and_sub1)
+
+AO_t counter = 0;
+
+void * add1sub1_thr(void * id)
+{
+ int me = (int)(AO_PTRDIFF_T)id;
+
+ int i;
+
+ for (i = 0; i < NITERS; ++i)
+ if ((me & 1) != 0) {
+ (void)AO_fetch_and_sub1(&counter);
+ } else {
+ (void)AO_fetch_and_add1(&counter);
+ }
+ return 0;
+}
+
+int add1sub1_test(void)
+{
+ return counter == 0;
+}
+
+#endif /* defined(AO_HAVE_fetch_and_add1) && defined(AO_HAVE_fetch_and_sub1) */
+
+#if defined(AO_HAVE_store_release_write) && defined(AO_HAVE_load_acquire_read)
+
+/* Invariant: counter1 >= counter2 */
+AO_t counter1 = 0;
+AO_t counter2 = 0;
+
+void * acqrel_thr(void *id)
+{
+ int me = (int)(AO_PTRDIFF_T)id;
+
+ int i;
+
+ for (i = 0; i < NITERS; ++i)
+ if (me & 1)
+ {
+ AO_t my_counter1;
+ if (me != 1)
+ {
+ fprintf(stderr, "acqrel test: too many threads\n");
+ abort();
+ }
+ my_counter1 = AO_load(&counter1);
+ AO_store(&counter1, my_counter1 + 1);
+ AO_store_release_write(&counter2, my_counter1 + 1);
+ }
+ else
+ {
+ AO_t my_counter1a, my_counter2a;
+ AO_t my_counter1b, my_counter2b;
+
+ my_counter2a = AO_load_acquire_read(&counter2);
+ my_counter1a = AO_load(&counter1);
+ /* Redo this, to make sure that the second load of counter1 */
+ /* is not viewed as a common subexpression. */
+ my_counter2b = AO_load_acquire_read(&counter2);
+ my_counter1b = AO_load(&counter1);
+ if (my_counter1a < my_counter2a)
+ {
+ fprintf(stderr, "Saw release store out of order: %lu < %lu\n",
+ (unsigned long)my_counter1a, (unsigned long)my_counter2a);
+ abort();
+ }
+ if (my_counter1b < my_counter2b)
+ {
+ fprintf(stderr,
+ "Saw release store out of order (bad CSE?): %lu < %lu\n",
+ (unsigned long)my_counter1b, (unsigned long)my_counter2b);
+ abort();
+ }
+ }
+
+ return 0;
+}
+
+int acqrel_test(void)
+{
+ return counter1 == NITERS && counter2 == NITERS;
+}
+
+#endif /* AO_HAVE_store_release_write && AO_HAVE_load_acquire_read */
+
+#if defined(AO_HAVE_test_and_set_acquire)
+
+AO_TS_t lock = AO_TS_INITIALIZER;
+
+unsigned long locked_counter;
+volatile unsigned long junk = 13;
+
+AO_ATTR_NO_SANITIZE_THREAD
+void do_junk(void)
+{
+ junk *= 17;
+ junk *= 19;
+}
+
+void * test_and_set_thr(void * id)
+{
+ unsigned long i;
+
+ for (i = 0; i < NITERS/10; ++i)
+ {
+ while (AO_test_and_set_acquire(&lock) != AO_TS_CLEAR);
+ ++locked_counter;
+ if (locked_counter != 1)
+ {
+ fprintf(stderr, "Test and set failure 1, counter = %ld, id = %d\n",
+ (long)locked_counter, (int)(AO_PTRDIFF_T)id);
+ abort();
+ }
+ locked_counter *= 2;
+ locked_counter -= 1;
+ locked_counter *= 5;
+ locked_counter -= 4;
+ if (locked_counter != 1)
+ {
+ fprintf(stderr, "Test and set failure 2, counter = %ld, id = %d\n",
+ (long)locked_counter, (int)(AO_PTRDIFF_T)id);
+ abort();
+ }
+ --locked_counter;
+ AO_CLEAR(&lock);
+ /* Spend a bit of time outside the lock. */
+ do_junk();
+ }
+ return 0;
+}
+
+int test_and_set_test(void)
+{
+ return locked_counter == 0;
+}
+
+#endif /* defined(AO_HAVE_test_and_set_acquire) */
+
+#if (!defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__BORLANDC__) \
+ || defined(AO_USE_NO_SIGNALS) || defined(AO_USE_WIN32_PTHREADS)) \
+ && defined(AO_TEST_EMULATION)
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+
+ AO_API void AO_store_full_emulation(volatile AO_t *addr, AO_t val);
+ AO_API AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val);
+# ifdef AO_HAVE_double_t
+ AO_API int
+ AO_compare_double_and_swap_double_emulation(volatile AO_double_t *,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2);
+# endif
+
+# ifdef __cplusplus
+ } /* extern "C" */
+# endif
+
+ void test_atomic_emulation(void)
+ {
+ AO_t x;
+# ifdef AO_HAVE_double_t
+ AO_double_t w; /* double-word alignment not needed */
+
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+ TA_assert(!AO_compare_double_and_swap_double_emulation(&w, 4116, 2121,
+ 8537, 6410));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_double_emulation(&w, 0, 0,
+ 8537, 6410));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+# endif
+ AO_store_full_emulation(&x, 1314);
+ TA_assert(x == 1314);
+ TA_assert(AO_fetch_compare_and_swap_emulation(&x, 14, 13117) == 1314);
+ TA_assert(x == 1314);
+ TA_assert(AO_fetch_compare_and_swap_emulation(&x, 1314, 14117) == 1314);
+ TA_assert(x == 14117);
+ }
+
+#else
+# define test_atomic_emulation() (void)0
+#endif /* _MSC_VER && !AO_USE_NO_SIGNALS || !AO_TEST_EMULATION */
+
+int main(void)
+{
+ test_atomic();
+ test_atomic_acquire();
+ test_atomic_release();
+ test_atomic_read();
+ test_atomic_write();
+ test_atomic_full();
+ test_atomic_release_write();
+ test_atomic_acquire_read();
+ test_atomic_dd_acquire_read();
+# if defined(AO_HAVE_fetch_and_add1) && defined(AO_HAVE_fetch_and_sub1)
+ run_parallel(4, add1sub1_thr, add1sub1_test, "add1/sub1");
+# endif
+# if defined(AO_HAVE_store_release_write) && defined(AO_HAVE_load_acquire_read)
+ run_parallel(3, acqrel_thr, acqrel_test,
+ "store_release_write/load_acquire_read");
+# endif
+# if defined(AO_HAVE_test_and_set_acquire)
+ run_parallel(5, test_and_set_thr, test_and_set_test,
+ "test_and_set");
+# endif
+ test_atomic_emulation();
+ return 0;
+}
+
+#endif /* !AO_NO_PTHREADS || !AO_USE_PTHREAD_DEFS */
diff --git a/graphics/asymptote/libatomic_ops/tests/test_atomic_include.h b/graphics/asymptote/libatomic_ops/tests/test_atomic_include.h
new file mode 100644
index 0000000000..a60bbb975d
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/tests/test_atomic_include.h
@@ -0,0 +1,5364 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Some basic sanity tests. These do not test the barrier semantics. */
+
+#undef TA_assert
+#define TA_assert(e) \
+ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: )\n", \
+ __FILE__, __LINE__), exit(1); }
+
+#undef MISSING
+#define MISSING(name) \
+ printf("Missing: %s\n", #name "")
+
+#if defined(CPPCHECK)
+ void list_atomic(void);
+ void char_list_atomic(void);
+ void short_list_atomic(void);
+ void int_list_atomic(void);
+ void double_list_atomic(void);
+#endif
+
+void test_atomic(void)
+{
+ AO_t x;
+ unsigned char b;
+ unsigned short s;
+ unsigned int zz;
+# if defined(AO_HAVE_test_and_set)
+ AO_TS_t z = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_double_compare_and_swap) \
+ || defined(AO_HAVE_double_load) \
+ || defined(AO_HAVE_double_store)
+ static AO_double_t old_w; /* static to avoid misalignment */
+ AO_double_t new_w;
+# endif
+# if defined(AO_HAVE_compare_and_swap_double) \
+ || defined(AO_HAVE_compare_double_and_swap_double) \
+ || defined(AO_HAVE_double_compare_and_swap)
+ static AO_double_t w; /* static to avoid misalignment */
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+# endif
+
+# if defined(CPPCHECK)
+ list_atomic();
+ char_list_atomic();
+ short_list_atomic();
+ int_list_atomic();
+ double_list_atomic();
+# endif
+# if defined(AO_HAVE_nop)
+ AO_nop();
+# elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \
+ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write)
+ MISSING(AO_nop);
+# endif
+# if defined(AO_HAVE_store)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */
+# endif
+ AO_store(&x, 13);
+ TA_assert(x == 13);
+# else
+# if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \
+ || !defined(AO_HAVE_store_release) \
+ || !defined(AO_HAVE_store_release_write) \
+ || !defined(AO_HAVE_store_write)
+ MISSING(AO_store);
+# endif
+ x = 13;
+# endif
+# if defined(AO_HAVE_load)
+ TA_assert(AO_load(&x) == 13);
+# elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \
+ || !defined(AO_HAVE_load_acquire_read) \
+ || !defined(AO_HAVE_load_dd_acquire_read) \
+ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read)
+ MISSING(AO_load);
+# endif
+# if defined(AO_HAVE_test_and_set)
+ TA_assert(AO_test_and_set(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_set(&z) == AO_TS_SET);
+ TA_assert(AO_test_and_set(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# else
+ MISSING(AO_test_and_set);
+# endif
+# if defined(AO_HAVE_fetch_and_add)
+ TA_assert(AO_fetch_and_add(&x, 42) == 13);
+ TA_assert(AO_fetch_and_add(&x, (AO_t)(-42)) == 55);
+# else
+ MISSING(AO_fetch_and_add);
+# endif
+# if defined(AO_HAVE_fetch_and_add1)
+ TA_assert(AO_fetch_and_add1(&x) == 13);
+# else
+ MISSING(AO_fetch_and_add1);
+ ++x;
+# endif
+# if defined(AO_HAVE_fetch_and_sub1)
+ TA_assert(AO_fetch_and_sub1(&x) == 14);
+# else
+ MISSING(AO_fetch_and_sub1);
+ --x;
+# endif
+# if defined(AO_HAVE_short_store)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile short *)&s = 0;
+# endif
+ AO_short_store(&s, 13);
+# else
+# if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \
+ || !defined(AO_HAVE_short_store_release) \
+ || !defined(AO_HAVE_short_store_release_write) \
+ || !defined(AO_HAVE_short_store_write)
+ MISSING(AO_short_store);
+# endif
+ s = 13;
+# endif
+# if defined(AO_HAVE_short_load)
+ TA_assert(AO_short_load(&s) == 13);
+# elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \
+ || !defined(AO_HAVE_short_load_acquire_read) \
+ || !defined(AO_HAVE_short_load_dd_acquire_read) \
+ || !defined(AO_HAVE_short_load_full) \
+ || !defined(AO_HAVE_short_load_read)
+ MISSING(AO_short_load);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add)
+ TA_assert(AO_short_fetch_and_add(&s, 42) == 13);
+ TA_assert(AO_short_fetch_and_add(&s, (unsigned short)-42) == 55);
+# else
+ MISSING(AO_short_fetch_and_add);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add1)
+ TA_assert(AO_short_fetch_and_add1(&s) == 13);
+# else
+ MISSING(AO_short_fetch_and_add1);
+ ++s;
+# endif
+# if defined(AO_HAVE_short_fetch_and_sub1)
+ TA_assert(AO_short_fetch_and_sub1(&s) == 14);
+# else
+ MISSING(AO_short_fetch_and_sub1);
+ --s;
+# endif
+ TA_assert(*(volatile short *)&s == 13);
+# if defined(AO_HAVE_char_store)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile char *)&b = 0;
+# endif
+ AO_char_store(&b, 13);
+# else
+# if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \
+ || !defined(AO_HAVE_char_store_release) \
+ || !defined(AO_HAVE_char_store_release_write) \
+ || !defined(AO_HAVE_char_store_write)
+ MISSING(AO_char_store);
+# endif
+ b = 13;
+# endif
+# if defined(AO_HAVE_char_load)
+ TA_assert(AO_char_load(&b) == 13);
+# elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \
+ || !defined(AO_HAVE_char_load_acquire_read) \
+ || !defined(AO_HAVE_char_load_dd_acquire_read) \
+ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read)
+ MISSING(AO_char_load);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add)
+ TA_assert(AO_char_fetch_and_add(&b, 42) == 13);
+ TA_assert(AO_char_fetch_and_add(&b, (unsigned char)-42) == 55);
+# else
+ MISSING(AO_char_fetch_and_add);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add1)
+ TA_assert(AO_char_fetch_and_add1(&b) == 13);
+# else
+ MISSING(AO_char_fetch_and_add1);
+ ++b;
+# endif
+# if defined(AO_HAVE_char_fetch_and_sub1)
+ TA_assert(AO_char_fetch_and_sub1(&b) == 14);
+# else
+ MISSING(AO_char_fetch_and_sub1);
+ --b;
+# endif
+ TA_assert(*(volatile char *)&b == 13);
+# if defined(AO_HAVE_int_store)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile int *)&zz = 0;
+# endif
+ AO_int_store(&zz, 13);
+# else
+# if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \
+ || !defined(AO_HAVE_int_store_release) \
+ || !defined(AO_HAVE_int_store_release_write) \
+ || !defined(AO_HAVE_int_store_write)
+ MISSING(AO_int_store);
+# endif
+ zz = 13;
+# endif
+# if defined(AO_HAVE_int_load)
+ TA_assert(AO_int_load(&zz) == 13);
+# elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \
+ || !defined(AO_HAVE_int_load_acquire_read) \
+ || !defined(AO_HAVE_int_load_dd_acquire_read) \
+ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read)
+ MISSING(AO_int_load);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add)
+ TA_assert(AO_int_fetch_and_add(&zz, 42) == 13);
+ TA_assert(AO_int_fetch_and_add(&zz, (unsigned int)-42) == 55);
+# else
+ MISSING(AO_int_fetch_and_add);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add1)
+ TA_assert(AO_int_fetch_and_add1(&zz) == 13);
+# else
+ MISSING(AO_int_fetch_and_add1);
+ ++zz;
+# endif
+# if defined(AO_HAVE_int_fetch_and_sub1)
+ TA_assert(AO_int_fetch_and_sub1(&zz) == 14);
+# else
+ MISSING(AO_int_fetch_and_sub1);
+ --zz;
+# endif
+ TA_assert(*(volatile int *)&zz == 13);
+# if defined(AO_HAVE_compare_and_swap)
+ TA_assert(!AO_compare_and_swap(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swap(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ MISSING(AO_compare_and_swap);
+ if (*(volatile AO_t *)&x == 13) x = 42;
+# endif
+# if defined(AO_HAVE_or)
+ AO_or(&x, 66);
+ TA_assert(x == 106);
+# else
+# if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \
+ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \
+ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \
+ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write)
+ MISSING(AO_or);
+# endif
+ x |= 66;
+# endif
+# if defined(AO_HAVE_xor)
+ AO_xor(&x, 181);
+ TA_assert(x == 223);
+# else
+# if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \
+ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \
+ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \
+ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write)
+ MISSING(AO_xor);
+# endif
+ x ^= 181;
+# endif
+# if defined(AO_HAVE_and)
+ AO_and(&x, 57);
+ TA_assert(x == 25);
+# else
+# if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \
+ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \
+ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \
+ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write)
+ MISSING(AO_and);
+# endif
+ x &= 57;
+# endif
+# if defined(AO_HAVE_fetch_compare_and_swap)
+ TA_assert(AO_fetch_compare_and_swap(&x, 14, 117) == 25);
+ TA_assert(x == 25);
+ TA_assert(AO_fetch_compare_and_swap(&x, 25, 117) == 25);
+# else
+ MISSING(AO_fetch_compare_and_swap);
+ if (x == 25) x = 117;
+# endif
+ TA_assert(x == 117);
+# if defined(AO_HAVE_short_compare_and_swap)
+ TA_assert(!AO_short_compare_and_swap(&s, 14, 42));
+ TA_assert(s == 13);
+ TA_assert(AO_short_compare_and_swap(&s, 13, 42));
+ TA_assert(s == 42);
+# else
+ MISSING(AO_short_compare_and_swap);
+ if (*(volatile short *)&s == 13) s = 42;
+# endif
+# if defined(AO_HAVE_short_or)
+ AO_short_or(&s, 66);
+ TA_assert(s == 106);
+# else
+# if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \
+ || !defined(AO_HAVE_short_or_acquire_read) \
+ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \
+ || !defined(AO_HAVE_short_or_release) \
+ || !defined(AO_HAVE_short_or_release_write) \
+ || !defined(AO_HAVE_short_or_write)
+ MISSING(AO_short_or);
+# endif
+ s |= 66;
+# endif
+# if defined(AO_HAVE_short_xor)
+ AO_short_xor(&s, 181);
+ TA_assert(s == 223);
+# else
+# if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \
+ || !defined(AO_HAVE_short_xor_acquire_read) \
+ || !defined(AO_HAVE_short_xor_full) \
+ || !defined(AO_HAVE_short_xor_read) \
+ || !defined(AO_HAVE_short_xor_release) \
+ || !defined(AO_HAVE_short_xor_release_write) \
+ || !defined(AO_HAVE_short_xor_write)
+ MISSING(AO_short_xor);
+# endif
+ s ^= 181;
+# endif
+# if defined(AO_HAVE_short_and)
+ AO_short_and(&s, 57);
+ TA_assert(s == 25);
+# else
+# if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \
+ || !defined(AO_HAVE_short_and_acquire_read) \
+ || !defined(AO_HAVE_short_and_full) \
+ || !defined(AO_HAVE_short_and_read) \
+ || !defined(AO_HAVE_short_and_release) \
+ || !defined(AO_HAVE_short_and_release_write) \
+ || !defined(AO_HAVE_short_and_write)
+ MISSING(AO_short_and);
+# endif
+ s &= 57;
+# endif
+# if defined(AO_HAVE_short_fetch_compare_and_swap)
+ TA_assert(AO_short_fetch_compare_and_swap(&s, 14, 117) == 25);
+ TA_assert(s == 25);
+ TA_assert(AO_short_fetch_compare_and_swap(&s, 25, 117) == 25);
+# else
+ MISSING(AO_short_fetch_compare_and_swap);
+ if (s == 25) s = 117;
+# endif
+ TA_assert(s == 117);
+# if defined(AO_HAVE_char_compare_and_swap)
+ TA_assert(!AO_char_compare_and_swap(&b, 14, 42));
+ TA_assert(b == 13);
+ TA_assert(AO_char_compare_and_swap(&b, 13, 42));
+ TA_assert(b == 42);
+# else
+ MISSING(AO_char_compare_and_swap);
+ if (*(volatile char *)&b == 13) b = 42;
+# endif
+# if defined(AO_HAVE_char_or)
+ AO_char_or(&b, 66);
+ TA_assert(b == 106);
+# else
+# if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \
+ || !defined(AO_HAVE_char_or_acquire_read) \
+ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \
+ || !defined(AO_HAVE_char_or_release) \
+ || !defined(AO_HAVE_char_or_release_write) \
+ || !defined(AO_HAVE_char_or_write)
+ MISSING(AO_char_or);
+# endif
+ b |= 66;
+# endif
+# if defined(AO_HAVE_char_xor)
+ AO_char_xor(&b, 181);
+ TA_assert(b == 223);
+# else
+# if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \
+ || !defined(AO_HAVE_char_xor_acquire_read) \
+ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \
+ || !defined(AO_HAVE_char_xor_release) \
+ || !defined(AO_HAVE_char_xor_release_write) \
+ || !defined(AO_HAVE_char_xor_write)
+ MISSING(AO_char_xor);
+# endif
+ b ^= 181;
+# endif
+# if defined(AO_HAVE_char_and)
+ AO_char_and(&b, 57);
+ TA_assert(b == 25);
+# else
+# if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \
+ || !defined(AO_HAVE_char_and_acquire_read) \
+ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \
+ || !defined(AO_HAVE_char_and_release) \
+ || !defined(AO_HAVE_char_and_release_write) \
+ || !defined(AO_HAVE_char_and_write)
+ MISSING(AO_char_and);
+# endif
+ b &= 57;
+# endif
+# if defined(AO_HAVE_char_fetch_compare_and_swap)
+ TA_assert(AO_char_fetch_compare_and_swap(&b, 14, 117) == 25);
+ TA_assert(b == 25);
+ TA_assert(AO_char_fetch_compare_and_swap(&b, 25, 117) == 25);
+# else
+ MISSING(AO_char_fetch_compare_and_swap);
+ if (b == 25) b = 117;
+# endif
+ TA_assert(b == 117);
+# if defined(AO_HAVE_int_compare_and_swap)
+ TA_assert(!AO_int_compare_and_swap(&zz, 14, 42));
+ TA_assert(zz == 13);
+ TA_assert(AO_int_compare_and_swap(&zz, 13, 42));
+ TA_assert(zz == 42);
+# else
+ MISSING(AO_int_compare_and_swap);
+ if (*(volatile int *)&zz == 13) zz = 42;
+# endif
+# if defined(AO_HAVE_int_or)
+ AO_int_or(&zz, 66);
+ TA_assert(zz == 106);
+# else
+# if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \
+ || !defined(AO_HAVE_int_or_acquire_read) \
+ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \
+ || !defined(AO_HAVE_int_or_release) \
+ || !defined(AO_HAVE_int_or_release_write) \
+ || !defined(AO_HAVE_int_or_write)
+ MISSING(AO_int_or);
+# endif
+ zz |= 66;
+# endif
+# if defined(AO_HAVE_int_xor)
+ AO_int_xor(&zz, 181);
+ TA_assert(zz == 223);
+# else
+# if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \
+ || !defined(AO_HAVE_int_xor_acquire_read) \
+ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \
+ || !defined(AO_HAVE_int_xor_release) \
+ || !defined(AO_HAVE_int_xor_release_write) \
+ || !defined(AO_HAVE_int_xor_write)
+ MISSING(AO_int_xor);
+# endif
+ zz ^= 181;
+# endif
+# if defined(AO_HAVE_int_and)
+ AO_int_and(&zz, 57);
+ TA_assert(zz == 25);
+# else
+# if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \
+ || !defined(AO_HAVE_int_and_acquire_read) \
+ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \
+ || !defined(AO_HAVE_int_and_release) \
+ || !defined(AO_HAVE_int_and_release_write) \
+ || !defined(AO_HAVE_int_and_write)
+ MISSING(AO_int_and);
+# endif
+ zz &= 57;
+# endif
+# if defined(AO_HAVE_int_fetch_compare_and_swap)
+ TA_assert(AO_int_fetch_compare_and_swap(&zz, 14, 117) == 25);
+ TA_assert(zz == 25);
+ TA_assert(AO_int_fetch_compare_and_swap(&zz, 25, 117) == 25);
+# else
+ MISSING(AO_int_fetch_compare_and_swap);
+ if (zz == 25) zz = 117;
+# endif
+ TA_assert(zz == 117);
+# if defined(AO_HAVE_double_load) || defined(AO_HAVE_double_store)
+ /* Initialize old_w even for store to workaround MSan warning. */
+ old_w.AO_val1 = 3316;
+ old_w.AO_val2 = 2921;
+# endif
+# if defined(AO_HAVE_double_load)
+ new_w = AO_double_load(&old_w);
+ TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921);
+# elif !defined(AO_HAVE_double_load) \
+ || !defined(AO_HAVE_double_load_acquire) \
+ || !defined(AO_HAVE_double_load_acquire_read) \
+ || !defined(AO_HAVE_double_load_dd_acquire_read) \
+ || !defined(AO_HAVE_double_load_full) \
+ || !defined(AO_HAVE_double_load_read)
+ MISSING(AO_double_load);
+# endif
+# if defined(AO_HAVE_double_store)
+ new_w.AO_val1 = 1375;
+ new_w.AO_val2 = 8243;
+ AO_double_store(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ AO_double_store(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ new_w.AO_val1 ^= old_w.AO_val1;
+ new_w.AO_val2 ^= old_w.AO_val2;
+ AO_double_store(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0);
+# elif !defined(AO_HAVE_double_store) \
+ || !defined(AO_HAVE_double_store_full) \
+ || !defined(AO_HAVE_double_store_release) \
+ || !defined(AO_HAVE_double_store_release_write) \
+ || !defined(AO_HAVE_double_store_write)
+ MISSING(AO_double_store);
+# endif
+# if defined(AO_HAVE_compare_double_and_swap_double)
+ TA_assert(!AO_compare_double_and_swap_double(&w, 17, 42, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_double(&w, 0, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double(&w, 12, 14, 64, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double(&w, 11, 13, 85, 82));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double(&w, 13, 12, 17, 42));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_double_and_swap_double(&w, 12, 13, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_double_and_swap_double(&w, 17, 42, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_double_and_swap_double);
+# endif
+# if defined(AO_HAVE_compare_and_swap_double)
+ TA_assert(!AO_compare_and_swap_double(&w, 17, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_and_swap_double(&w, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double(&w, 13, 12, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double(&w, 1213, 48, 86));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_and_swap_double(&w, 12, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_and_swap_double(&w, 17, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_and_swap_double);
+# endif
+# if defined(AO_HAVE_double_compare_and_swap)
+ old_w.AO_val1 = 4116;
+ old_w.AO_val2 = 2121;
+ new_w.AO_val1 = 8537;
+ new_w.AO_val2 = 6410;
+ TA_assert(!AO_double_compare_and_swap(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_double_compare_and_swap(&w, w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = 29;
+ new_w.AO_val1 = 820;
+ new_w.AO_val2 = 5917;
+ TA_assert(!AO_double_compare_and_swap(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = 11;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 3552;
+ new_w.AO_val2 = 1746;
+ TA_assert(!AO_double_compare_and_swap(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 8537;
+ new_w.AO_val1 = 4116;
+ new_w.AO_val2 = 2121;
+ TA_assert(!AO_double_compare_and_swap(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 1;
+ TA_assert(AO_double_compare_and_swap(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = w.AO_val2;
+ new_w.AO_val1--;
+ new_w.AO_val2 = 0;
+ TA_assert(AO_double_compare_and_swap(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_double_compare_and_swap);
+# endif
+}
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Some basic sanity tests. These do not test the barrier semantics. */
+
+#undef TA_assert
+#define TA_assert(e) \
+ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _release)\n", \
+ __FILE__, __LINE__), exit(1); }
+
+#undef MISSING
+#define MISSING(name) \
+ printf("Missing: %s\n", #name "_release")
+
+#if defined(CPPCHECK)
+ void list_atomic_release(void);
+ void char_list_atomic_release(void);
+ void short_list_atomic_release(void);
+ void int_list_atomic_release(void);
+ void double_list_atomic_release(void);
+#endif
+
+void test_atomic_release(void)
+{
+ AO_t x;
+ unsigned char b;
+ unsigned short s;
+ unsigned int zz;
+# if defined(AO_HAVE_test_and_set_release)
+ AO_TS_t z = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_release) \
+ || defined(AO_HAVE_double_load_release) \
+ || defined(AO_HAVE_double_store_release)
+ static AO_double_t old_w; /* static to avoid misalignment */
+ AO_double_t new_w;
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_release) \
+ || defined(AO_HAVE_compare_double_and_swap_double_release) \
+ || defined(AO_HAVE_double_compare_and_swap_release)
+ static AO_double_t w; /* static to avoid misalignment */
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+# endif
+
+# if defined(CPPCHECK)
+ list_atomic_release();
+ char_list_atomic_release();
+ short_list_atomic_release();
+ int_list_atomic_release();
+ double_list_atomic_release();
+# endif
+# if defined(AO_HAVE_nop_release)
+ AO_nop_release();
+# elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \
+ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write)
+ MISSING(AO_nop);
+# endif
+# if defined(AO_HAVE_store_release)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */
+# endif
+ AO_store_release(&x, 13);
+ TA_assert(x == 13);
+# else
+# if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \
+ || !defined(AO_HAVE_store_release) \
+ || !defined(AO_HAVE_store_release_write) \
+ || !defined(AO_HAVE_store_write)
+ MISSING(AO_store);
+# endif
+ x = 13;
+# endif
+# if defined(AO_HAVE_load_release)
+ TA_assert(AO_load_release(&x) == 13);
+# elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \
+ || !defined(AO_HAVE_load_acquire_read) \
+ || !defined(AO_HAVE_load_dd_acquire_read) \
+ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read)
+ MISSING(AO_load);
+# endif
+# if defined(AO_HAVE_test_and_set_release)
+ TA_assert(AO_test_and_set_release(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_set_release(&z) == AO_TS_SET);
+ TA_assert(AO_test_and_set_release(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# else
+ MISSING(AO_test_and_set);
+# endif
+# if defined(AO_HAVE_fetch_and_add_release)
+ TA_assert(AO_fetch_and_add_release(&x, 42) == 13);
+ TA_assert(AO_fetch_and_add_release(&x, (AO_t)(-42)) == 55);
+# else
+ MISSING(AO_fetch_and_add);
+# endif
+# if defined(AO_HAVE_fetch_and_add1_release)
+ TA_assert(AO_fetch_and_add1_release(&x) == 13);
+# else
+ MISSING(AO_fetch_and_add1);
+ ++x;
+# endif
+# if defined(AO_HAVE_fetch_and_sub1_release)
+ TA_assert(AO_fetch_and_sub1_release(&x) == 14);
+# else
+ MISSING(AO_fetch_and_sub1);
+ --x;
+# endif
+# if defined(AO_HAVE_short_store_release)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile short *)&s = 0;
+# endif
+ AO_short_store_release(&s, 13);
+# else
+# if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \
+ || !defined(AO_HAVE_short_store_release) \
+ || !defined(AO_HAVE_short_store_release_write) \
+ || !defined(AO_HAVE_short_store_write)
+ MISSING(AO_short_store);
+# endif
+ s = 13;
+# endif
+# if defined(AO_HAVE_short_load_release)
+ TA_assert(AO_short_load(&s) == 13);
+# elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \
+ || !defined(AO_HAVE_short_load_acquire_read) \
+ || !defined(AO_HAVE_short_load_dd_acquire_read) \
+ || !defined(AO_HAVE_short_load_full) \
+ || !defined(AO_HAVE_short_load_read)
+ MISSING(AO_short_load);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add_release)
+ TA_assert(AO_short_fetch_and_add_release(&s, 42) == 13);
+ TA_assert(AO_short_fetch_and_add_release(&s, (unsigned short)-42) == 55);
+# else
+ MISSING(AO_short_fetch_and_add);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add1_release)
+ TA_assert(AO_short_fetch_and_add1_release(&s) == 13);
+# else
+ MISSING(AO_short_fetch_and_add1);
+ ++s;
+# endif
+# if defined(AO_HAVE_short_fetch_and_sub1_release)
+ TA_assert(AO_short_fetch_and_sub1_release(&s) == 14);
+# else
+ MISSING(AO_short_fetch_and_sub1);
+ --s;
+# endif
+ TA_assert(*(volatile short *)&s == 13);
+# if defined(AO_HAVE_char_store_release)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile char *)&b = 0;
+# endif
+ AO_char_store_release(&b, 13);
+# else
+# if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \
+ || !defined(AO_HAVE_char_store_release) \
+ || !defined(AO_HAVE_char_store_release_write) \
+ || !defined(AO_HAVE_char_store_write)
+ MISSING(AO_char_store);
+# endif
+ b = 13;
+# endif
+# if defined(AO_HAVE_char_load_release)
+ TA_assert(AO_char_load(&b) == 13);
+# elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \
+ || !defined(AO_HAVE_char_load_acquire_read) \
+ || !defined(AO_HAVE_char_load_dd_acquire_read) \
+ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read)
+ MISSING(AO_char_load);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add_release)
+ TA_assert(AO_char_fetch_and_add_release(&b, 42) == 13);
+ TA_assert(AO_char_fetch_and_add_release(&b, (unsigned char)-42) == 55);
+# else
+ MISSING(AO_char_fetch_and_add);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add1_release)
+ TA_assert(AO_char_fetch_and_add1_release(&b) == 13);
+# else
+ MISSING(AO_char_fetch_and_add1);
+ ++b;
+# endif
+# if defined(AO_HAVE_char_fetch_and_sub1_release)
+ TA_assert(AO_char_fetch_and_sub1_release(&b) == 14);
+# else
+ MISSING(AO_char_fetch_and_sub1);
+ --b;
+# endif
+ TA_assert(*(volatile char *)&b == 13);
+# if defined(AO_HAVE_int_store_release)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile int *)&zz = 0;
+# endif
+ AO_int_store_release(&zz, 13);
+# else
+# if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \
+ || !defined(AO_HAVE_int_store_release) \
+ || !defined(AO_HAVE_int_store_release_write) \
+ || !defined(AO_HAVE_int_store_write)
+ MISSING(AO_int_store);
+# endif
+ zz = 13;
+# endif
+# if defined(AO_HAVE_int_load_release)
+ TA_assert(AO_int_load(&zz) == 13);
+# elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \
+ || !defined(AO_HAVE_int_load_acquire_read) \
+ || !defined(AO_HAVE_int_load_dd_acquire_read) \
+ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read)
+ MISSING(AO_int_load);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add_release)
+ TA_assert(AO_int_fetch_and_add_release(&zz, 42) == 13);
+ TA_assert(AO_int_fetch_and_add_release(&zz, (unsigned int)-42) == 55);
+# else
+ MISSING(AO_int_fetch_and_add);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add1_release)
+ TA_assert(AO_int_fetch_and_add1_release(&zz) == 13);
+# else
+ MISSING(AO_int_fetch_and_add1);
+ ++zz;
+# endif
+# if defined(AO_HAVE_int_fetch_and_sub1_release)
+ TA_assert(AO_int_fetch_and_sub1_release(&zz) == 14);
+# else
+ MISSING(AO_int_fetch_and_sub1);
+ --zz;
+# endif
+ TA_assert(*(volatile int *)&zz == 13);
+# if defined(AO_HAVE_compare_and_swap_release)
+ TA_assert(!AO_compare_and_swap_release(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swap_release(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ MISSING(AO_compare_and_swap);
+ if (*(volatile AO_t *)&x == 13) x = 42;
+# endif
+# if defined(AO_HAVE_or_release)
+ AO_or_release(&x, 66);
+ TA_assert(x == 106);
+# else
+# if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \
+ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \
+ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \
+ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write)
+ MISSING(AO_or);
+# endif
+ x |= 66;
+# endif
+# if defined(AO_HAVE_xor_release)
+ AO_xor_release(&x, 181);
+ TA_assert(x == 223);
+# else
+# if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \
+ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \
+ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \
+ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write)
+ MISSING(AO_xor);
+# endif
+ x ^= 181;
+# endif
+# if defined(AO_HAVE_and_release)
+ AO_and_release(&x, 57);
+ TA_assert(x == 25);
+# else
+# if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \
+ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \
+ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \
+ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write)
+ MISSING(AO_and);
+# endif
+ x &= 57;
+# endif
+# if defined(AO_HAVE_fetch_compare_and_swap_release)
+ TA_assert(AO_fetch_compare_and_swap_release(&x, 14, 117) == 25);
+ TA_assert(x == 25);
+ TA_assert(AO_fetch_compare_and_swap_release(&x, 25, 117) == 25);
+# else
+ MISSING(AO_fetch_compare_and_swap);
+ if (x == 25) x = 117;
+# endif
+ TA_assert(x == 117);
+# if defined(AO_HAVE_short_compare_and_swap_release)
+ TA_assert(!AO_short_compare_and_swap_release(&s, 14, 42));
+ TA_assert(s == 13);
+ TA_assert(AO_short_compare_and_swap_release(&s, 13, 42));
+ TA_assert(s == 42);
+# else
+ MISSING(AO_short_compare_and_swap);
+ if (*(volatile short *)&s == 13) s = 42;
+# endif
+# if defined(AO_HAVE_short_or_release)
+ AO_short_or_release(&s, 66);
+ TA_assert(s == 106);
+# else
+# if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \
+ || !defined(AO_HAVE_short_or_acquire_read) \
+ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \
+ || !defined(AO_HAVE_short_or_release) \
+ || !defined(AO_HAVE_short_or_release_write) \
+ || !defined(AO_HAVE_short_or_write)
+ MISSING(AO_short_or);
+# endif
+ s |= 66;
+# endif
+# if defined(AO_HAVE_short_xor_release)
+ AO_short_xor_release(&s, 181);
+ TA_assert(s == 223);
+# else
+# if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \
+ || !defined(AO_HAVE_short_xor_acquire_read) \
+ || !defined(AO_HAVE_short_xor_full) \
+ || !defined(AO_HAVE_short_xor_read) \
+ || !defined(AO_HAVE_short_xor_release) \
+ || !defined(AO_HAVE_short_xor_release_write) \
+ || !defined(AO_HAVE_short_xor_write)
+ MISSING(AO_short_xor);
+# endif
+ s ^= 181;
+# endif
+# if defined(AO_HAVE_short_and_release)
+ AO_short_and_release(&s, 57);
+ TA_assert(s == 25);
+# else
+# if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \
+ || !defined(AO_HAVE_short_and_acquire_read) \
+ || !defined(AO_HAVE_short_and_full) \
+ || !defined(AO_HAVE_short_and_read) \
+ || !defined(AO_HAVE_short_and_release) \
+ || !defined(AO_HAVE_short_and_release_write) \
+ || !defined(AO_HAVE_short_and_write)
+ MISSING(AO_short_and);
+# endif
+ s &= 57;
+# endif
+# if defined(AO_HAVE_short_fetch_compare_and_swap_release)
+ TA_assert(AO_short_fetch_compare_and_swap_release(&s, 14, 117) == 25);
+ TA_assert(s == 25);
+ TA_assert(AO_short_fetch_compare_and_swap_release(&s, 25, 117) == 25);
+# else
+ MISSING(AO_short_fetch_compare_and_swap);
+ if (s == 25) s = 117;
+# endif
+ TA_assert(s == 117);
+# if defined(AO_HAVE_char_compare_and_swap_release)
+ TA_assert(!AO_char_compare_and_swap_release(&b, 14, 42));
+ TA_assert(b == 13);
+ TA_assert(AO_char_compare_and_swap_release(&b, 13, 42));
+ TA_assert(b == 42);
+# else
+ MISSING(AO_char_compare_and_swap);
+ if (*(volatile char *)&b == 13) b = 42;
+# endif
+# if defined(AO_HAVE_char_or_release)
+ AO_char_or_release(&b, 66);
+ TA_assert(b == 106);
+# else
+# if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \
+ || !defined(AO_HAVE_char_or_acquire_read) \
+ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \
+ || !defined(AO_HAVE_char_or_release) \
+ || !defined(AO_HAVE_char_or_release_write) \
+ || !defined(AO_HAVE_char_or_write)
+ MISSING(AO_char_or);
+# endif
+ b |= 66;
+# endif
+# if defined(AO_HAVE_char_xor_release)
+ AO_char_xor_release(&b, 181);
+ TA_assert(b == 223);
+# else
+# if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \
+ || !defined(AO_HAVE_char_xor_acquire_read) \
+ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \
+ || !defined(AO_HAVE_char_xor_release) \
+ || !defined(AO_HAVE_char_xor_release_write) \
+ || !defined(AO_HAVE_char_xor_write)
+ MISSING(AO_char_xor);
+# endif
+ b ^= 181;
+# endif
+# if defined(AO_HAVE_char_and_release)
+ AO_char_and_release(&b, 57);
+ TA_assert(b == 25);
+# else
+# if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \
+ || !defined(AO_HAVE_char_and_acquire_read) \
+ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \
+ || !defined(AO_HAVE_char_and_release) \
+ || !defined(AO_HAVE_char_and_release_write) \
+ || !defined(AO_HAVE_char_and_write)
+ MISSING(AO_char_and);
+# endif
+ b &= 57;
+# endif
+# if defined(AO_HAVE_char_fetch_compare_and_swap_release)
+ TA_assert(AO_char_fetch_compare_and_swap_release(&b, 14, 117) == 25);
+ TA_assert(b == 25);
+ TA_assert(AO_char_fetch_compare_and_swap_release(&b, 25, 117) == 25);
+# else
+ MISSING(AO_char_fetch_compare_and_swap);
+ if (b == 25) b = 117;
+# endif
+ TA_assert(b == 117);
+# if defined(AO_HAVE_int_compare_and_swap_release)
+ TA_assert(!AO_int_compare_and_swap_release(&zz, 14, 42));
+ TA_assert(zz == 13);
+ TA_assert(AO_int_compare_and_swap_release(&zz, 13, 42));
+ TA_assert(zz == 42);
+# else
+ MISSING(AO_int_compare_and_swap);
+ if (*(volatile int *)&zz == 13) zz = 42;
+# endif
+# if defined(AO_HAVE_int_or_release)
+ AO_int_or_release(&zz, 66);
+ TA_assert(zz == 106);
+# else
+# if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \
+ || !defined(AO_HAVE_int_or_acquire_read) \
+ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \
+ || !defined(AO_HAVE_int_or_release) \
+ || !defined(AO_HAVE_int_or_release_write) \
+ || !defined(AO_HAVE_int_or_write)
+ MISSING(AO_int_or);
+# endif
+ zz |= 66;
+# endif
+# if defined(AO_HAVE_int_xor_release)
+ AO_int_xor_release(&zz, 181);
+ TA_assert(zz == 223);
+# else
+# if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \
+ || !defined(AO_HAVE_int_xor_acquire_read) \
+ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \
+ || !defined(AO_HAVE_int_xor_release) \
+ || !defined(AO_HAVE_int_xor_release_write) \
+ || !defined(AO_HAVE_int_xor_write)
+ MISSING(AO_int_xor);
+# endif
+ zz ^= 181;
+# endif
+# if defined(AO_HAVE_int_and_release)
+ AO_int_and_release(&zz, 57);
+ TA_assert(zz == 25);
+# else
+# if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \
+ || !defined(AO_HAVE_int_and_acquire_read) \
+ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \
+ || !defined(AO_HAVE_int_and_release) \
+ || !defined(AO_HAVE_int_and_release_write) \
+ || !defined(AO_HAVE_int_and_write)
+ MISSING(AO_int_and);
+# endif
+ zz &= 57;
+# endif
+# if defined(AO_HAVE_int_fetch_compare_and_swap_release)
+ TA_assert(AO_int_fetch_compare_and_swap_release(&zz, 14, 117) == 25);
+ TA_assert(zz == 25);
+ TA_assert(AO_int_fetch_compare_and_swap_release(&zz, 25, 117) == 25);
+# else
+ MISSING(AO_int_fetch_compare_and_swap);
+ if (zz == 25) zz = 117;
+# endif
+ TA_assert(zz == 117);
+# if defined(AO_HAVE_double_load_release) || defined(AO_HAVE_double_store_release)
+ /* Initialize old_w even for store to workaround MSan warning. */
+ old_w.AO_val1 = 3316;
+ old_w.AO_val2 = 2921;
+# endif
+# if defined(AO_HAVE_double_load_release)
+ new_w = AO_double_load_release(&old_w);
+ TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921);
+# elif !defined(AO_HAVE_double_load) \
+ || !defined(AO_HAVE_double_load_acquire) \
+ || !defined(AO_HAVE_double_load_acquire_read) \
+ || !defined(AO_HAVE_double_load_dd_acquire_read) \
+ || !defined(AO_HAVE_double_load_full) \
+ || !defined(AO_HAVE_double_load_read)
+ MISSING(AO_double_load);
+# endif
+# if defined(AO_HAVE_double_store_release)
+ new_w.AO_val1 = 1375;
+ new_w.AO_val2 = 8243;
+ AO_double_store_release(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ AO_double_store_release(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ new_w.AO_val1 ^= old_w.AO_val1;
+ new_w.AO_val2 ^= old_w.AO_val2;
+ AO_double_store_release(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0);
+# elif !defined(AO_HAVE_double_store) \
+ || !defined(AO_HAVE_double_store_full) \
+ || !defined(AO_HAVE_double_store_release) \
+ || !defined(AO_HAVE_double_store_release_write) \
+ || !defined(AO_HAVE_double_store_write)
+ MISSING(AO_double_store);
+# endif
+# if defined(AO_HAVE_compare_double_and_swap_double_release)
+ TA_assert(!AO_compare_double_and_swap_double_release(&w, 17, 42, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_double_release(&w, 0, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_release(&w, 12, 14, 64, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_release(&w, 11, 13, 85, 82));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_release(&w, 13, 12, 17, 42));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_double_and_swap_double_release(&w, 12, 13, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_double_and_swap_double_release(&w, 17, 42, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_double_and_swap_double);
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_release)
+ TA_assert(!AO_compare_and_swap_double_release(&w, 17, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_and_swap_double_release(&w, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_release(&w, 13, 12, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_release(&w, 1213, 48, 86));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_and_swap_double_release(&w, 12, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_and_swap_double_release(&w, 17, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_and_swap_double);
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_release)
+ old_w.AO_val1 = 4116;
+ old_w.AO_val2 = 2121;
+ new_w.AO_val1 = 8537;
+ new_w.AO_val2 = 6410;
+ TA_assert(!AO_double_compare_and_swap_release(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_double_compare_and_swap_release(&w, w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = 29;
+ new_w.AO_val1 = 820;
+ new_w.AO_val2 = 5917;
+ TA_assert(!AO_double_compare_and_swap_release(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = 11;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 3552;
+ new_w.AO_val2 = 1746;
+ TA_assert(!AO_double_compare_and_swap_release(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 8537;
+ new_w.AO_val1 = 4116;
+ new_w.AO_val2 = 2121;
+ TA_assert(!AO_double_compare_and_swap_release(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 1;
+ TA_assert(AO_double_compare_and_swap_release(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = w.AO_val2;
+ new_w.AO_val1--;
+ new_w.AO_val2 = 0;
+ TA_assert(AO_double_compare_and_swap_release(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_double_compare_and_swap);
+# endif
+}
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Some basic sanity tests. These do not test the barrier semantics. */
+
+#undef TA_assert
+#define TA_assert(e) \
+ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _acquire)\n", \
+ __FILE__, __LINE__), exit(1); }
+
+#undef MISSING
+#define MISSING(name) \
+ printf("Missing: %s\n", #name "_acquire")
+
+#if defined(CPPCHECK)
+ void list_atomic_acquire(void);
+ void char_list_atomic_acquire(void);
+ void short_list_atomic_acquire(void);
+ void int_list_atomic_acquire(void);
+ void double_list_atomic_acquire(void);
+#endif
+
+void test_atomic_acquire(void)
+{
+ AO_t x;
+ unsigned char b;
+ unsigned short s;
+ unsigned int zz;
+# if defined(AO_HAVE_test_and_set_acquire)
+ AO_TS_t z = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_acquire) \
+ || defined(AO_HAVE_double_load_acquire) \
+ || defined(AO_HAVE_double_store_acquire)
+ static AO_double_t old_w; /* static to avoid misalignment */
+ AO_double_t new_w;
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_acquire) \
+ || defined(AO_HAVE_compare_double_and_swap_double_acquire) \
+ || defined(AO_HAVE_double_compare_and_swap_acquire)
+ static AO_double_t w; /* static to avoid misalignment */
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+# endif
+
+# if defined(CPPCHECK)
+ list_atomic_acquire();
+ char_list_atomic_acquire();
+ short_list_atomic_acquire();
+ int_list_atomic_acquire();
+ double_list_atomic_acquire();
+# endif
+# if defined(AO_HAVE_nop_acquire)
+ AO_nop_acquire();
+# elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \
+ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write)
+ MISSING(AO_nop);
+# endif
+# if defined(AO_HAVE_store_acquire)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */
+# endif
+ AO_store_acquire(&x, 13);
+ TA_assert(x == 13);
+# else
+# if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \
+ || !defined(AO_HAVE_store_release) \
+ || !defined(AO_HAVE_store_release_write) \
+ || !defined(AO_HAVE_store_write)
+ MISSING(AO_store);
+# endif
+ x = 13;
+# endif
+# if defined(AO_HAVE_load_acquire)
+ TA_assert(AO_load_acquire(&x) == 13);
+# elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \
+ || !defined(AO_HAVE_load_acquire_read) \
+ || !defined(AO_HAVE_load_dd_acquire_read) \
+ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read)
+ MISSING(AO_load);
+# endif
+# if defined(AO_HAVE_test_and_set_acquire)
+ TA_assert(AO_test_and_set_acquire(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_set_acquire(&z) == AO_TS_SET);
+ TA_assert(AO_test_and_set_acquire(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# else
+ MISSING(AO_test_and_set);
+# endif
+# if defined(AO_HAVE_fetch_and_add_acquire)
+ TA_assert(AO_fetch_and_add_acquire(&x, 42) == 13);
+ TA_assert(AO_fetch_and_add_acquire(&x, (AO_t)(-42)) == 55);
+# else
+ MISSING(AO_fetch_and_add);
+# endif
+# if defined(AO_HAVE_fetch_and_add1_acquire)
+ TA_assert(AO_fetch_and_add1_acquire(&x) == 13);
+# else
+ MISSING(AO_fetch_and_add1);
+ ++x;
+# endif
+# if defined(AO_HAVE_fetch_and_sub1_acquire)
+ TA_assert(AO_fetch_and_sub1_acquire(&x) == 14);
+# else
+ MISSING(AO_fetch_and_sub1);
+ --x;
+# endif
+# if defined(AO_HAVE_short_store_acquire)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile short *)&s = 0;
+# endif
+ AO_short_store_acquire(&s, 13);
+# else
+# if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \
+ || !defined(AO_HAVE_short_store_release) \
+ || !defined(AO_HAVE_short_store_release_write) \
+ || !defined(AO_HAVE_short_store_write)
+ MISSING(AO_short_store);
+# endif
+ s = 13;
+# endif
+# if defined(AO_HAVE_short_load_acquire)
+ TA_assert(AO_short_load(&s) == 13);
+# elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \
+ || !defined(AO_HAVE_short_load_acquire_read) \
+ || !defined(AO_HAVE_short_load_dd_acquire_read) \
+ || !defined(AO_HAVE_short_load_full) \
+ || !defined(AO_HAVE_short_load_read)
+ MISSING(AO_short_load);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add_acquire)
+ TA_assert(AO_short_fetch_and_add_acquire(&s, 42) == 13);
+ TA_assert(AO_short_fetch_and_add_acquire(&s, (unsigned short)-42) == 55);
+# else
+ MISSING(AO_short_fetch_and_add);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add1_acquire)
+ TA_assert(AO_short_fetch_and_add1_acquire(&s) == 13);
+# else
+ MISSING(AO_short_fetch_and_add1);
+ ++s;
+# endif
+# if defined(AO_HAVE_short_fetch_and_sub1_acquire)
+ TA_assert(AO_short_fetch_and_sub1_acquire(&s) == 14);
+# else
+ MISSING(AO_short_fetch_and_sub1);
+ --s;
+# endif
+ TA_assert(*(volatile short *)&s == 13);
+# if defined(AO_HAVE_char_store_acquire)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile char *)&b = 0;
+# endif
+ AO_char_store_acquire(&b, 13);
+# else
+# if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \
+ || !defined(AO_HAVE_char_store_release) \
+ || !defined(AO_HAVE_char_store_release_write) \
+ || !defined(AO_HAVE_char_store_write)
+ MISSING(AO_char_store);
+# endif
+ b = 13;
+# endif
+# if defined(AO_HAVE_char_load_acquire)
+ TA_assert(AO_char_load(&b) == 13);
+# elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \
+ || !defined(AO_HAVE_char_load_acquire_read) \
+ || !defined(AO_HAVE_char_load_dd_acquire_read) \
+ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read)
+ MISSING(AO_char_load);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add_acquire)
+ TA_assert(AO_char_fetch_and_add_acquire(&b, 42) == 13);
+ TA_assert(AO_char_fetch_and_add_acquire(&b, (unsigned char)-42) == 55);
+# else
+ MISSING(AO_char_fetch_and_add);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add1_acquire)
+ TA_assert(AO_char_fetch_and_add1_acquire(&b) == 13);
+# else
+ MISSING(AO_char_fetch_and_add1);
+ ++b;
+# endif
+# if defined(AO_HAVE_char_fetch_and_sub1_acquire)
+ TA_assert(AO_char_fetch_and_sub1_acquire(&b) == 14);
+# else
+ MISSING(AO_char_fetch_and_sub1);
+ --b;
+# endif
+ TA_assert(*(volatile char *)&b == 13);
+# if defined(AO_HAVE_int_store_acquire)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile int *)&zz = 0;
+# endif
+ AO_int_store_acquire(&zz, 13);
+# else
+# if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \
+ || !defined(AO_HAVE_int_store_release) \
+ || !defined(AO_HAVE_int_store_release_write) \
+ || !defined(AO_HAVE_int_store_write)
+ MISSING(AO_int_store);
+# endif
+ zz = 13;
+# endif
+# if defined(AO_HAVE_int_load_acquire)
+ TA_assert(AO_int_load(&zz) == 13);
+# elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \
+ || !defined(AO_HAVE_int_load_acquire_read) \
+ || !defined(AO_HAVE_int_load_dd_acquire_read) \
+ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read)
+ MISSING(AO_int_load);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add_acquire)
+ TA_assert(AO_int_fetch_and_add_acquire(&zz, 42) == 13);
+ TA_assert(AO_int_fetch_and_add_acquire(&zz, (unsigned int)-42) == 55);
+# else
+ MISSING(AO_int_fetch_and_add);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add1_acquire)
+ TA_assert(AO_int_fetch_and_add1_acquire(&zz) == 13);
+# else
+ MISSING(AO_int_fetch_and_add1);
+ ++zz;
+# endif
+# if defined(AO_HAVE_int_fetch_and_sub1_acquire)
+ TA_assert(AO_int_fetch_and_sub1_acquire(&zz) == 14);
+# else
+ MISSING(AO_int_fetch_and_sub1);
+ --zz;
+# endif
+ TA_assert(*(volatile int *)&zz == 13);
+# if defined(AO_HAVE_compare_and_swap_acquire)
+ TA_assert(!AO_compare_and_swap_acquire(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swap_acquire(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ MISSING(AO_compare_and_swap);
+ if (*(volatile AO_t *)&x == 13) x = 42;
+# endif
+# if defined(AO_HAVE_or_acquire)
+ AO_or_acquire(&x, 66);
+ TA_assert(x == 106);
+# else
+# if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \
+ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \
+ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \
+ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write)
+ MISSING(AO_or);
+# endif
+ x |= 66;
+# endif
+# if defined(AO_HAVE_xor_acquire)
+ AO_xor_acquire(&x, 181);
+ TA_assert(x == 223);
+# else
+# if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \
+ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \
+ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \
+ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write)
+ MISSING(AO_xor);
+# endif
+ x ^= 181;
+# endif
+# if defined(AO_HAVE_and_acquire)
+ AO_and_acquire(&x, 57);
+ TA_assert(x == 25);
+# else
+# if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \
+ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \
+ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \
+ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write)
+ MISSING(AO_and);
+# endif
+ x &= 57;
+# endif
+# if defined(AO_HAVE_fetch_compare_and_swap_acquire)
+ TA_assert(AO_fetch_compare_and_swap_acquire(&x, 14, 117) == 25);
+ TA_assert(x == 25);
+ TA_assert(AO_fetch_compare_and_swap_acquire(&x, 25, 117) == 25);
+# else
+ MISSING(AO_fetch_compare_and_swap);
+ if (x == 25) x = 117;
+# endif
+ TA_assert(x == 117);
+# if defined(AO_HAVE_short_compare_and_swap_acquire)
+ TA_assert(!AO_short_compare_and_swap_acquire(&s, 14, 42));
+ TA_assert(s == 13);
+ TA_assert(AO_short_compare_and_swap_acquire(&s, 13, 42));
+ TA_assert(s == 42);
+# else
+ MISSING(AO_short_compare_and_swap);
+ if (*(volatile short *)&s == 13) s = 42;
+# endif
+# if defined(AO_HAVE_short_or_acquire)
+ AO_short_or_acquire(&s, 66);
+ TA_assert(s == 106);
+# else
+# if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \
+ || !defined(AO_HAVE_short_or_acquire_read) \
+ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \
+ || !defined(AO_HAVE_short_or_release) \
+ || !defined(AO_HAVE_short_or_release_write) \
+ || !defined(AO_HAVE_short_or_write)
+ MISSING(AO_short_or);
+# endif
+ s |= 66;
+# endif
+# if defined(AO_HAVE_short_xor_acquire)
+ AO_short_xor_acquire(&s, 181);
+ TA_assert(s == 223);
+# else
+# if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \
+ || !defined(AO_HAVE_short_xor_acquire_read) \
+ || !defined(AO_HAVE_short_xor_full) \
+ || !defined(AO_HAVE_short_xor_read) \
+ || !defined(AO_HAVE_short_xor_release) \
+ || !defined(AO_HAVE_short_xor_release_write) \
+ || !defined(AO_HAVE_short_xor_write)
+ MISSING(AO_short_xor);
+# endif
+ s ^= 181;
+# endif
+# if defined(AO_HAVE_short_and_acquire)
+ AO_short_and_acquire(&s, 57);
+ TA_assert(s == 25);
+# else
+# if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \
+ || !defined(AO_HAVE_short_and_acquire_read) \
+ || !defined(AO_HAVE_short_and_full) \
+ || !defined(AO_HAVE_short_and_read) \
+ || !defined(AO_HAVE_short_and_release) \
+ || !defined(AO_HAVE_short_and_release_write) \
+ || !defined(AO_HAVE_short_and_write)
+ MISSING(AO_short_and);
+# endif
+ s &= 57;
+# endif
+# if defined(AO_HAVE_short_fetch_compare_and_swap_acquire)
+ TA_assert(AO_short_fetch_compare_and_swap_acquire(&s, 14, 117) == 25);
+ TA_assert(s == 25);
+ TA_assert(AO_short_fetch_compare_and_swap_acquire(&s, 25, 117) == 25);
+# else
+ MISSING(AO_short_fetch_compare_and_swap);
+ if (s == 25) s = 117;
+# endif
+ TA_assert(s == 117);
+# if defined(AO_HAVE_char_compare_and_swap_acquire)
+ TA_assert(!AO_char_compare_and_swap_acquire(&b, 14, 42));
+ TA_assert(b == 13);
+ TA_assert(AO_char_compare_and_swap_acquire(&b, 13, 42));
+ TA_assert(b == 42);
+# else
+ MISSING(AO_char_compare_and_swap);
+ if (*(volatile char *)&b == 13) b = 42;
+# endif
+# if defined(AO_HAVE_char_or_acquire)
+ AO_char_or_acquire(&b, 66);
+ TA_assert(b == 106);
+# else
+# if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \
+ || !defined(AO_HAVE_char_or_acquire_read) \
+ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \
+ || !defined(AO_HAVE_char_or_release) \
+ || !defined(AO_HAVE_char_or_release_write) \
+ || !defined(AO_HAVE_char_or_write)
+ MISSING(AO_char_or);
+# endif
+ b |= 66;
+# endif
+# if defined(AO_HAVE_char_xor_acquire)
+ AO_char_xor_acquire(&b, 181);
+ TA_assert(b == 223);
+# else
+# if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \
+ || !defined(AO_HAVE_char_xor_acquire_read) \
+ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \
+ || !defined(AO_HAVE_char_xor_release) \
+ || !defined(AO_HAVE_char_xor_release_write) \
+ || !defined(AO_HAVE_char_xor_write)
+ MISSING(AO_char_xor);
+# endif
+ b ^= 181;
+# endif
+# if defined(AO_HAVE_char_and_acquire)
+ AO_char_and_acquire(&b, 57);
+ TA_assert(b == 25);
+# else
+# if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \
+ || !defined(AO_HAVE_char_and_acquire_read) \
+ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \
+ || !defined(AO_HAVE_char_and_release) \
+ || !defined(AO_HAVE_char_and_release_write) \
+ || !defined(AO_HAVE_char_and_write)
+ MISSING(AO_char_and);
+# endif
+ b &= 57;
+# endif
+# if defined(AO_HAVE_char_fetch_compare_and_swap_acquire)
+ TA_assert(AO_char_fetch_compare_and_swap_acquire(&b, 14, 117) == 25);
+ TA_assert(b == 25);
+ TA_assert(AO_char_fetch_compare_and_swap_acquire(&b, 25, 117) == 25);
+# else
+ MISSING(AO_char_fetch_compare_and_swap);
+ if (b == 25) b = 117;
+# endif
+ TA_assert(b == 117);
+# if defined(AO_HAVE_int_compare_and_swap_acquire)
+ TA_assert(!AO_int_compare_and_swap_acquire(&zz, 14, 42));
+ TA_assert(zz == 13);
+ TA_assert(AO_int_compare_and_swap_acquire(&zz, 13, 42));
+ TA_assert(zz == 42);
+# else
+ MISSING(AO_int_compare_and_swap);
+ if (*(volatile int *)&zz == 13) zz = 42;
+# endif
+# if defined(AO_HAVE_int_or_acquire)
+ AO_int_or_acquire(&zz, 66);
+ TA_assert(zz == 106);
+# else
+# if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \
+ || !defined(AO_HAVE_int_or_acquire_read) \
+ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \
+ || !defined(AO_HAVE_int_or_release) \
+ || !defined(AO_HAVE_int_or_release_write) \
+ || !defined(AO_HAVE_int_or_write)
+ MISSING(AO_int_or);
+# endif
+ zz |= 66;
+# endif
+# if defined(AO_HAVE_int_xor_acquire)
+ AO_int_xor_acquire(&zz, 181);
+ TA_assert(zz == 223);
+# else
+# if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \
+ || !defined(AO_HAVE_int_xor_acquire_read) \
+ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \
+ || !defined(AO_HAVE_int_xor_release) \
+ || !defined(AO_HAVE_int_xor_release_write) \
+ || !defined(AO_HAVE_int_xor_write)
+ MISSING(AO_int_xor);
+# endif
+ zz ^= 181;
+# endif
+# if defined(AO_HAVE_int_and_acquire)
+ AO_int_and_acquire(&zz, 57);
+ TA_assert(zz == 25);
+# else
+# if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \
+ || !defined(AO_HAVE_int_and_acquire_read) \
+ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \
+ || !defined(AO_HAVE_int_and_release) \
+ || !defined(AO_HAVE_int_and_release_write) \
+ || !defined(AO_HAVE_int_and_write)
+ MISSING(AO_int_and);
+# endif
+ zz &= 57;
+# endif
+# if defined(AO_HAVE_int_fetch_compare_and_swap_acquire)
+ TA_assert(AO_int_fetch_compare_and_swap_acquire(&zz, 14, 117) == 25);
+ TA_assert(zz == 25);
+ TA_assert(AO_int_fetch_compare_and_swap_acquire(&zz, 25, 117) == 25);
+# else
+ MISSING(AO_int_fetch_compare_and_swap);
+ if (zz == 25) zz = 117;
+# endif
+ TA_assert(zz == 117);
+# if defined(AO_HAVE_double_load_acquire) || defined(AO_HAVE_double_store_acquire)
+ /* Initialize old_w even for store to workaround MSan warning. */
+ old_w.AO_val1 = 3316;
+ old_w.AO_val2 = 2921;
+# endif
+# if defined(AO_HAVE_double_load_acquire)
+ new_w = AO_double_load_acquire(&old_w);
+ TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921);
+# elif !defined(AO_HAVE_double_load) \
+ || !defined(AO_HAVE_double_load_acquire) \
+ || !defined(AO_HAVE_double_load_acquire_read) \
+ || !defined(AO_HAVE_double_load_dd_acquire_read) \
+ || !defined(AO_HAVE_double_load_full) \
+ || !defined(AO_HAVE_double_load_read)
+ MISSING(AO_double_load);
+# endif
+# if defined(AO_HAVE_double_store_acquire)
+ new_w.AO_val1 = 1375;
+ new_w.AO_val2 = 8243;
+ AO_double_store_acquire(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ AO_double_store_acquire(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ new_w.AO_val1 ^= old_w.AO_val1;
+ new_w.AO_val2 ^= old_w.AO_val2;
+ AO_double_store_acquire(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0);
+# elif !defined(AO_HAVE_double_store) \
+ || !defined(AO_HAVE_double_store_full) \
+ || !defined(AO_HAVE_double_store_release) \
+ || !defined(AO_HAVE_double_store_release_write) \
+ || !defined(AO_HAVE_double_store_write)
+ MISSING(AO_double_store);
+# endif
+# if defined(AO_HAVE_compare_double_and_swap_double_acquire)
+ TA_assert(!AO_compare_double_and_swap_double_acquire(&w, 17, 42, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_double_acquire(&w, 0, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_acquire(&w, 12, 14, 64, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_acquire(&w, 11, 13, 85, 82));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_acquire(&w, 13, 12, 17, 42));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_double_and_swap_double_acquire(&w, 12, 13, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_double_and_swap_double_acquire(&w, 17, 42, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_double_and_swap_double);
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_acquire)
+ TA_assert(!AO_compare_and_swap_double_acquire(&w, 17, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_and_swap_double_acquire(&w, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_acquire(&w, 13, 12, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_acquire(&w, 1213, 48, 86));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_and_swap_double_acquire(&w, 12, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_and_swap_double_acquire(&w, 17, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_and_swap_double);
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_acquire)
+ old_w.AO_val1 = 4116;
+ old_w.AO_val2 = 2121;
+ new_w.AO_val1 = 8537;
+ new_w.AO_val2 = 6410;
+ TA_assert(!AO_double_compare_and_swap_acquire(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_double_compare_and_swap_acquire(&w, w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = 29;
+ new_w.AO_val1 = 820;
+ new_w.AO_val2 = 5917;
+ TA_assert(!AO_double_compare_and_swap_acquire(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = 11;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 3552;
+ new_w.AO_val2 = 1746;
+ TA_assert(!AO_double_compare_and_swap_acquire(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 8537;
+ new_w.AO_val1 = 4116;
+ new_w.AO_val2 = 2121;
+ TA_assert(!AO_double_compare_and_swap_acquire(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 1;
+ TA_assert(AO_double_compare_and_swap_acquire(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = w.AO_val2;
+ new_w.AO_val1--;
+ new_w.AO_val2 = 0;
+ TA_assert(AO_double_compare_and_swap_acquire(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_double_compare_and_swap);
+# endif
+}
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Some basic sanity tests. These do not test the barrier semantics. */
+
+#undef TA_assert
+#define TA_assert(e) \
+ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _read)\n", \
+ __FILE__, __LINE__), exit(1); }
+
+#undef MISSING
+#define MISSING(name) \
+ printf("Missing: %s\n", #name "_read")
+
+#if defined(CPPCHECK)
+ void list_atomic_read(void);
+ void char_list_atomic_read(void);
+ void short_list_atomic_read(void);
+ void int_list_atomic_read(void);
+ void double_list_atomic_read(void);
+#endif
+
+void test_atomic_read(void)
+{
+ AO_t x;
+ unsigned char b;
+ unsigned short s;
+ unsigned int zz;
+# if defined(AO_HAVE_test_and_set_read)
+ AO_TS_t z = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_read) \
+ || defined(AO_HAVE_double_load_read) \
+ || defined(AO_HAVE_double_store_read)
+ static AO_double_t old_w; /* static to avoid misalignment */
+ AO_double_t new_w;
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_read) \
+ || defined(AO_HAVE_compare_double_and_swap_double_read) \
+ || defined(AO_HAVE_double_compare_and_swap_read)
+ static AO_double_t w; /* static to avoid misalignment */
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+# endif
+
+# if defined(CPPCHECK)
+ list_atomic_read();
+ char_list_atomic_read();
+ short_list_atomic_read();
+ int_list_atomic_read();
+ double_list_atomic_read();
+# endif
+# if defined(AO_HAVE_nop_read)
+ AO_nop_read();
+# elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \
+ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write)
+ MISSING(AO_nop);
+# endif
+# if defined(AO_HAVE_store_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */
+# endif
+ AO_store_read(&x, 13);
+ TA_assert(x == 13);
+# else
+# if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \
+ || !defined(AO_HAVE_store_release) \
+ || !defined(AO_HAVE_store_release_write) \
+ || !defined(AO_HAVE_store_write)
+ MISSING(AO_store);
+# endif
+ x = 13;
+# endif
+# if defined(AO_HAVE_load_read)
+ TA_assert(AO_load_read(&x) == 13);
+# elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \
+ || !defined(AO_HAVE_load_acquire_read) \
+ || !defined(AO_HAVE_load_dd_acquire_read) \
+ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read)
+ MISSING(AO_load);
+# endif
+# if defined(AO_HAVE_test_and_set_read)
+ TA_assert(AO_test_and_set_read(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_set_read(&z) == AO_TS_SET);
+ TA_assert(AO_test_and_set_read(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# else
+ MISSING(AO_test_and_set);
+# endif
+# if defined(AO_HAVE_fetch_and_add_read)
+ TA_assert(AO_fetch_and_add_read(&x, 42) == 13);
+ TA_assert(AO_fetch_and_add_read(&x, (AO_t)(-42)) == 55);
+# else
+ MISSING(AO_fetch_and_add);
+# endif
+# if defined(AO_HAVE_fetch_and_add1_read)
+ TA_assert(AO_fetch_and_add1_read(&x) == 13);
+# else
+ MISSING(AO_fetch_and_add1);
+ ++x;
+# endif
+# if defined(AO_HAVE_fetch_and_sub1_read)
+ TA_assert(AO_fetch_and_sub1_read(&x) == 14);
+# else
+ MISSING(AO_fetch_and_sub1);
+ --x;
+# endif
+# if defined(AO_HAVE_short_store_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile short *)&s = 0;
+# endif
+ AO_short_store_read(&s, 13);
+# else
+# if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \
+ || !defined(AO_HAVE_short_store_release) \
+ || !defined(AO_HAVE_short_store_release_write) \
+ || !defined(AO_HAVE_short_store_write)
+ MISSING(AO_short_store);
+# endif
+ s = 13;
+# endif
+# if defined(AO_HAVE_short_load_read)
+ TA_assert(AO_short_load(&s) == 13);
+# elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \
+ || !defined(AO_HAVE_short_load_acquire_read) \
+ || !defined(AO_HAVE_short_load_dd_acquire_read) \
+ || !defined(AO_HAVE_short_load_full) \
+ || !defined(AO_HAVE_short_load_read)
+ MISSING(AO_short_load);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add_read)
+ TA_assert(AO_short_fetch_and_add_read(&s, 42) == 13);
+ TA_assert(AO_short_fetch_and_add_read(&s, (unsigned short)-42) == 55);
+# else
+ MISSING(AO_short_fetch_and_add);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add1_read)
+ TA_assert(AO_short_fetch_and_add1_read(&s) == 13);
+# else
+ MISSING(AO_short_fetch_and_add1);
+ ++s;
+# endif
+# if defined(AO_HAVE_short_fetch_and_sub1_read)
+ TA_assert(AO_short_fetch_and_sub1_read(&s) == 14);
+# else
+ MISSING(AO_short_fetch_and_sub1);
+ --s;
+# endif
+ TA_assert(*(volatile short *)&s == 13);
+# if defined(AO_HAVE_char_store_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile char *)&b = 0;
+# endif
+ AO_char_store_read(&b, 13);
+# else
+# if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \
+ || !defined(AO_HAVE_char_store_release) \
+ || !defined(AO_HAVE_char_store_release_write) \
+ || !defined(AO_HAVE_char_store_write)
+ MISSING(AO_char_store);
+# endif
+ b = 13;
+# endif
+# if defined(AO_HAVE_char_load_read)
+ TA_assert(AO_char_load(&b) == 13);
+# elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \
+ || !defined(AO_HAVE_char_load_acquire_read) \
+ || !defined(AO_HAVE_char_load_dd_acquire_read) \
+ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read)
+ MISSING(AO_char_load);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add_read)
+ TA_assert(AO_char_fetch_and_add_read(&b, 42) == 13);
+ TA_assert(AO_char_fetch_and_add_read(&b, (unsigned char)-42) == 55);
+# else
+ MISSING(AO_char_fetch_and_add);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add1_read)
+ TA_assert(AO_char_fetch_and_add1_read(&b) == 13);
+# else
+ MISSING(AO_char_fetch_and_add1);
+ ++b;
+# endif
+# if defined(AO_HAVE_char_fetch_and_sub1_read)
+ TA_assert(AO_char_fetch_and_sub1_read(&b) == 14);
+# else
+ MISSING(AO_char_fetch_and_sub1);
+ --b;
+# endif
+ TA_assert(*(volatile char *)&b == 13);
+# if defined(AO_HAVE_int_store_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile int *)&zz = 0;
+# endif
+ AO_int_store_read(&zz, 13);
+# else
+# if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \
+ || !defined(AO_HAVE_int_store_release) \
+ || !defined(AO_HAVE_int_store_release_write) \
+ || !defined(AO_HAVE_int_store_write)
+ MISSING(AO_int_store);
+# endif
+ zz = 13;
+# endif
+# if defined(AO_HAVE_int_load_read)
+ TA_assert(AO_int_load(&zz) == 13);
+# elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \
+ || !defined(AO_HAVE_int_load_acquire_read) \
+ || !defined(AO_HAVE_int_load_dd_acquire_read) \
+ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read)
+ MISSING(AO_int_load);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add_read)
+ TA_assert(AO_int_fetch_and_add_read(&zz, 42) == 13);
+ TA_assert(AO_int_fetch_and_add_read(&zz, (unsigned int)-42) == 55);
+# else
+ MISSING(AO_int_fetch_and_add);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add1_read)
+ TA_assert(AO_int_fetch_and_add1_read(&zz) == 13);
+# else
+ MISSING(AO_int_fetch_and_add1);
+ ++zz;
+# endif
+# if defined(AO_HAVE_int_fetch_and_sub1_read)
+ TA_assert(AO_int_fetch_and_sub1_read(&zz) == 14);
+# else
+ MISSING(AO_int_fetch_and_sub1);
+ --zz;
+# endif
+ TA_assert(*(volatile int *)&zz == 13);
+# if defined(AO_HAVE_compare_and_swap_read)
+ TA_assert(!AO_compare_and_swap_read(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swap_read(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ MISSING(AO_compare_and_swap);
+ if (*(volatile AO_t *)&x == 13) x = 42;
+# endif
+# if defined(AO_HAVE_or_read)
+ AO_or_read(&x, 66);
+ TA_assert(x == 106);
+# else
+# if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \
+ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \
+ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \
+ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write)
+ MISSING(AO_or);
+# endif
+ x |= 66;
+# endif
+# if defined(AO_HAVE_xor_read)
+ AO_xor_read(&x, 181);
+ TA_assert(x == 223);
+# else
+# if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \
+ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \
+ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \
+ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write)
+ MISSING(AO_xor);
+# endif
+ x ^= 181;
+# endif
+# if defined(AO_HAVE_and_read)
+ AO_and_read(&x, 57);
+ TA_assert(x == 25);
+# else
+# if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \
+ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \
+ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \
+ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write)
+ MISSING(AO_and);
+# endif
+ x &= 57;
+# endif
+# if defined(AO_HAVE_fetch_compare_and_swap_read)
+ TA_assert(AO_fetch_compare_and_swap_read(&x, 14, 117) == 25);
+ TA_assert(x == 25);
+ TA_assert(AO_fetch_compare_and_swap_read(&x, 25, 117) == 25);
+# else
+ MISSING(AO_fetch_compare_and_swap);
+ if (x == 25) x = 117;
+# endif
+ TA_assert(x == 117);
+# if defined(AO_HAVE_short_compare_and_swap_read)
+ TA_assert(!AO_short_compare_and_swap_read(&s, 14, 42));
+ TA_assert(s == 13);
+ TA_assert(AO_short_compare_and_swap_read(&s, 13, 42));
+ TA_assert(s == 42);
+# else
+ MISSING(AO_short_compare_and_swap);
+ if (*(volatile short *)&s == 13) s = 42;
+# endif
+# if defined(AO_HAVE_short_or_read)
+ AO_short_or_read(&s, 66);
+ TA_assert(s == 106);
+# else
+# if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \
+ || !defined(AO_HAVE_short_or_acquire_read) \
+ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \
+ || !defined(AO_HAVE_short_or_release) \
+ || !defined(AO_HAVE_short_or_release_write) \
+ || !defined(AO_HAVE_short_or_write)
+ MISSING(AO_short_or);
+# endif
+ s |= 66;
+# endif
+# if defined(AO_HAVE_short_xor_read)
+ AO_short_xor_read(&s, 181);
+ TA_assert(s == 223);
+# else
+# if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \
+ || !defined(AO_HAVE_short_xor_acquire_read) \
+ || !defined(AO_HAVE_short_xor_full) \
+ || !defined(AO_HAVE_short_xor_read) \
+ || !defined(AO_HAVE_short_xor_release) \
+ || !defined(AO_HAVE_short_xor_release_write) \
+ || !defined(AO_HAVE_short_xor_write)
+ MISSING(AO_short_xor);
+# endif
+ s ^= 181;
+# endif
+# if defined(AO_HAVE_short_and_read)
+ AO_short_and_read(&s, 57);
+ TA_assert(s == 25);
+# else
+# if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \
+ || !defined(AO_HAVE_short_and_acquire_read) \
+ || !defined(AO_HAVE_short_and_full) \
+ || !defined(AO_HAVE_short_and_read) \
+ || !defined(AO_HAVE_short_and_release) \
+ || !defined(AO_HAVE_short_and_release_write) \
+ || !defined(AO_HAVE_short_and_write)
+ MISSING(AO_short_and);
+# endif
+ s &= 57;
+# endif
+# if defined(AO_HAVE_short_fetch_compare_and_swap_read)
+ TA_assert(AO_short_fetch_compare_and_swap_read(&s, 14, 117) == 25);
+ TA_assert(s == 25);
+ TA_assert(AO_short_fetch_compare_and_swap_read(&s, 25, 117) == 25);
+# else
+ MISSING(AO_short_fetch_compare_and_swap);
+ if (s == 25) s = 117;
+# endif
+ TA_assert(s == 117);
+# if defined(AO_HAVE_char_compare_and_swap_read)
+ TA_assert(!AO_char_compare_and_swap_read(&b, 14, 42));
+ TA_assert(b == 13);
+ TA_assert(AO_char_compare_and_swap_read(&b, 13, 42));
+ TA_assert(b == 42);
+# else
+ MISSING(AO_char_compare_and_swap);
+ if (*(volatile char *)&b == 13) b = 42;
+# endif
+# if defined(AO_HAVE_char_or_read)
+ AO_char_or_read(&b, 66);
+ TA_assert(b == 106);
+# else
+# if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \
+ || !defined(AO_HAVE_char_or_acquire_read) \
+ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \
+ || !defined(AO_HAVE_char_or_release) \
+ || !defined(AO_HAVE_char_or_release_write) \
+ || !defined(AO_HAVE_char_or_write)
+ MISSING(AO_char_or);
+# endif
+ b |= 66;
+# endif
+# if defined(AO_HAVE_char_xor_read)
+ AO_char_xor_read(&b, 181);
+ TA_assert(b == 223);
+# else
+# if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \
+ || !defined(AO_HAVE_char_xor_acquire_read) \
+ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \
+ || !defined(AO_HAVE_char_xor_release) \
+ || !defined(AO_HAVE_char_xor_release_write) \
+ || !defined(AO_HAVE_char_xor_write)
+ MISSING(AO_char_xor);
+# endif
+ b ^= 181;
+# endif
+# if defined(AO_HAVE_char_and_read)
+ AO_char_and_read(&b, 57);
+ TA_assert(b == 25);
+# else
+# if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \
+ || !defined(AO_HAVE_char_and_acquire_read) \
+ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \
+ || !defined(AO_HAVE_char_and_release) \
+ || !defined(AO_HAVE_char_and_release_write) \
+ || !defined(AO_HAVE_char_and_write)
+ MISSING(AO_char_and);
+# endif
+ b &= 57;
+# endif
+# if defined(AO_HAVE_char_fetch_compare_and_swap_read)
+ TA_assert(AO_char_fetch_compare_and_swap_read(&b, 14, 117) == 25);
+ TA_assert(b == 25);
+ TA_assert(AO_char_fetch_compare_and_swap_read(&b, 25, 117) == 25);
+# else
+ MISSING(AO_char_fetch_compare_and_swap);
+ if (b == 25) b = 117;
+# endif
+ TA_assert(b == 117);
+# if defined(AO_HAVE_int_compare_and_swap_read)
+ TA_assert(!AO_int_compare_and_swap_read(&zz, 14, 42));
+ TA_assert(zz == 13);
+ TA_assert(AO_int_compare_and_swap_read(&zz, 13, 42));
+ TA_assert(zz == 42);
+# else
+ MISSING(AO_int_compare_and_swap);
+ if (*(volatile int *)&zz == 13) zz = 42;
+# endif
+# if defined(AO_HAVE_int_or_read)
+ AO_int_or_read(&zz, 66);
+ TA_assert(zz == 106);
+# else
+# if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \
+ || !defined(AO_HAVE_int_or_acquire_read) \
+ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \
+ || !defined(AO_HAVE_int_or_release) \
+ || !defined(AO_HAVE_int_or_release_write) \
+ || !defined(AO_HAVE_int_or_write)
+ MISSING(AO_int_or);
+# endif
+ zz |= 66;
+# endif
+# if defined(AO_HAVE_int_xor_read)
+ AO_int_xor_read(&zz, 181);
+ TA_assert(zz == 223);
+# else
+# if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \
+ || !defined(AO_HAVE_int_xor_acquire_read) \
+ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \
+ || !defined(AO_HAVE_int_xor_release) \
+ || !defined(AO_HAVE_int_xor_release_write) \
+ || !defined(AO_HAVE_int_xor_write)
+ MISSING(AO_int_xor);
+# endif
+ zz ^= 181;
+# endif
+# if defined(AO_HAVE_int_and_read)
+ AO_int_and_read(&zz, 57);
+ TA_assert(zz == 25);
+# else
+# if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \
+ || !defined(AO_HAVE_int_and_acquire_read) \
+ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \
+ || !defined(AO_HAVE_int_and_release) \
+ || !defined(AO_HAVE_int_and_release_write) \
+ || !defined(AO_HAVE_int_and_write)
+ MISSING(AO_int_and);
+# endif
+ zz &= 57;
+# endif
+# if defined(AO_HAVE_int_fetch_compare_and_swap_read)
+ TA_assert(AO_int_fetch_compare_and_swap_read(&zz, 14, 117) == 25);
+ TA_assert(zz == 25);
+ TA_assert(AO_int_fetch_compare_and_swap_read(&zz, 25, 117) == 25);
+# else
+ MISSING(AO_int_fetch_compare_and_swap);
+ if (zz == 25) zz = 117;
+# endif
+ TA_assert(zz == 117);
+# if defined(AO_HAVE_double_load_read) || defined(AO_HAVE_double_store_read)
+ /* Initialize old_w even for store to workaround MSan warning. */
+ old_w.AO_val1 = 3316;
+ old_w.AO_val2 = 2921;
+# endif
+# if defined(AO_HAVE_double_load_read)
+ new_w = AO_double_load_read(&old_w);
+ TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921);
+# elif !defined(AO_HAVE_double_load) \
+ || !defined(AO_HAVE_double_load_acquire) \
+ || !defined(AO_HAVE_double_load_acquire_read) \
+ || !defined(AO_HAVE_double_load_dd_acquire_read) \
+ || !defined(AO_HAVE_double_load_full) \
+ || !defined(AO_HAVE_double_load_read)
+ MISSING(AO_double_load);
+# endif
+# if defined(AO_HAVE_double_store_read)
+ new_w.AO_val1 = 1375;
+ new_w.AO_val2 = 8243;
+ AO_double_store_read(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ AO_double_store_read(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ new_w.AO_val1 ^= old_w.AO_val1;
+ new_w.AO_val2 ^= old_w.AO_val2;
+ AO_double_store_read(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0);
+# elif !defined(AO_HAVE_double_store) \
+ || !defined(AO_HAVE_double_store_full) \
+ || !defined(AO_HAVE_double_store_release) \
+ || !defined(AO_HAVE_double_store_release_write) \
+ || !defined(AO_HAVE_double_store_write)
+ MISSING(AO_double_store);
+# endif
+# if defined(AO_HAVE_compare_double_and_swap_double_read)
+ TA_assert(!AO_compare_double_and_swap_double_read(&w, 17, 42, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_double_read(&w, 0, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_read(&w, 12, 14, 64, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_read(&w, 11, 13, 85, 82));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_read(&w, 13, 12, 17, 42));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_double_and_swap_double_read(&w, 12, 13, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_double_and_swap_double_read(&w, 17, 42, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_double_and_swap_double);
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_read)
+ TA_assert(!AO_compare_and_swap_double_read(&w, 17, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_and_swap_double_read(&w, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_read(&w, 13, 12, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_read(&w, 1213, 48, 86));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_and_swap_double_read(&w, 12, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_and_swap_double_read(&w, 17, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_and_swap_double);
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_read)
+ old_w.AO_val1 = 4116;
+ old_w.AO_val2 = 2121;
+ new_w.AO_val1 = 8537;
+ new_w.AO_val2 = 6410;
+ TA_assert(!AO_double_compare_and_swap_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_double_compare_and_swap_read(&w, w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = 29;
+ new_w.AO_val1 = 820;
+ new_w.AO_val2 = 5917;
+ TA_assert(!AO_double_compare_and_swap_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = 11;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 3552;
+ new_w.AO_val2 = 1746;
+ TA_assert(!AO_double_compare_and_swap_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 8537;
+ new_w.AO_val1 = 4116;
+ new_w.AO_val2 = 2121;
+ TA_assert(!AO_double_compare_and_swap_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 1;
+ TA_assert(AO_double_compare_and_swap_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = w.AO_val2;
+ new_w.AO_val1--;
+ new_w.AO_val2 = 0;
+ TA_assert(AO_double_compare_and_swap_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_double_compare_and_swap);
+# endif
+}
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Some basic sanity tests. These do not test the barrier semantics. */
+
+#undef TA_assert
+#define TA_assert(e) \
+ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _write)\n", \
+ __FILE__, __LINE__), exit(1); }
+
+#undef MISSING
+#define MISSING(name) \
+ printf("Missing: %s\n", #name "_write")
+
+#if defined(CPPCHECK)
+ void list_atomic_write(void);
+ void char_list_atomic_write(void);
+ void short_list_atomic_write(void);
+ void int_list_atomic_write(void);
+ void double_list_atomic_write(void);
+#endif
+
+void test_atomic_write(void)
+{
+ AO_t x;
+ unsigned char b;
+ unsigned short s;
+ unsigned int zz;
+# if defined(AO_HAVE_test_and_set_write)
+ AO_TS_t z = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_write) \
+ || defined(AO_HAVE_double_load_write) \
+ || defined(AO_HAVE_double_store_write)
+ static AO_double_t old_w; /* static to avoid misalignment */
+ AO_double_t new_w;
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_write) \
+ || defined(AO_HAVE_compare_double_and_swap_double_write) \
+ || defined(AO_HAVE_double_compare_and_swap_write)
+ static AO_double_t w; /* static to avoid misalignment */
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+# endif
+
+# if defined(CPPCHECK)
+ list_atomic_write();
+ char_list_atomic_write();
+ short_list_atomic_write();
+ int_list_atomic_write();
+ double_list_atomic_write();
+# endif
+# if defined(AO_HAVE_nop_write)
+ AO_nop_write();
+# elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \
+ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write)
+ MISSING(AO_nop);
+# endif
+# if defined(AO_HAVE_store_write)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */
+# endif
+ AO_store_write(&x, 13);
+ TA_assert(x == 13);
+# else
+# if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \
+ || !defined(AO_HAVE_store_release) \
+ || !defined(AO_HAVE_store_release_write) \
+ || !defined(AO_HAVE_store_write)
+ MISSING(AO_store);
+# endif
+ x = 13;
+# endif
+# if defined(AO_HAVE_load_write)
+ TA_assert(AO_load_write(&x) == 13);
+# elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \
+ || !defined(AO_HAVE_load_acquire_read) \
+ || !defined(AO_HAVE_load_dd_acquire_read) \
+ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read)
+ MISSING(AO_load);
+# endif
+# if defined(AO_HAVE_test_and_set_write)
+ TA_assert(AO_test_and_set_write(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_set_write(&z) == AO_TS_SET);
+ TA_assert(AO_test_and_set_write(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# else
+ MISSING(AO_test_and_set);
+# endif
+# if defined(AO_HAVE_fetch_and_add_write)
+ TA_assert(AO_fetch_and_add_write(&x, 42) == 13);
+ TA_assert(AO_fetch_and_add_write(&x, (AO_t)(-42)) == 55);
+# else
+ MISSING(AO_fetch_and_add);
+# endif
+# if defined(AO_HAVE_fetch_and_add1_write)
+ TA_assert(AO_fetch_and_add1_write(&x) == 13);
+# else
+ MISSING(AO_fetch_and_add1);
+ ++x;
+# endif
+# if defined(AO_HAVE_fetch_and_sub1_write)
+ TA_assert(AO_fetch_and_sub1_write(&x) == 14);
+# else
+ MISSING(AO_fetch_and_sub1);
+ --x;
+# endif
+# if defined(AO_HAVE_short_store_write)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile short *)&s = 0;
+# endif
+ AO_short_store_write(&s, 13);
+# else
+# if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \
+ || !defined(AO_HAVE_short_store_release) \
+ || !defined(AO_HAVE_short_store_release_write) \
+ || !defined(AO_HAVE_short_store_write)
+ MISSING(AO_short_store);
+# endif
+ s = 13;
+# endif
+# if defined(AO_HAVE_short_load_write)
+ TA_assert(AO_short_load(&s) == 13);
+# elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \
+ || !defined(AO_HAVE_short_load_acquire_read) \
+ || !defined(AO_HAVE_short_load_dd_acquire_read) \
+ || !defined(AO_HAVE_short_load_full) \
+ || !defined(AO_HAVE_short_load_read)
+ MISSING(AO_short_load);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add_write)
+ TA_assert(AO_short_fetch_and_add_write(&s, 42) == 13);
+ TA_assert(AO_short_fetch_and_add_write(&s, (unsigned short)-42) == 55);
+# else
+ MISSING(AO_short_fetch_and_add);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add1_write)
+ TA_assert(AO_short_fetch_and_add1_write(&s) == 13);
+# else
+ MISSING(AO_short_fetch_and_add1);
+ ++s;
+# endif
+# if defined(AO_HAVE_short_fetch_and_sub1_write)
+ TA_assert(AO_short_fetch_and_sub1_write(&s) == 14);
+# else
+ MISSING(AO_short_fetch_and_sub1);
+ --s;
+# endif
+ TA_assert(*(volatile short *)&s == 13);
+# if defined(AO_HAVE_char_store_write)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile char *)&b = 0;
+# endif
+ AO_char_store_write(&b, 13);
+# else
+# if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \
+ || !defined(AO_HAVE_char_store_release) \
+ || !defined(AO_HAVE_char_store_release_write) \
+ || !defined(AO_HAVE_char_store_write)
+ MISSING(AO_char_store);
+# endif
+ b = 13;
+# endif
+# if defined(AO_HAVE_char_load_write)
+ TA_assert(AO_char_load(&b) == 13);
+# elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \
+ || !defined(AO_HAVE_char_load_acquire_read) \
+ || !defined(AO_HAVE_char_load_dd_acquire_read) \
+ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read)
+ MISSING(AO_char_load);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add_write)
+ TA_assert(AO_char_fetch_and_add_write(&b, 42) == 13);
+ TA_assert(AO_char_fetch_and_add_write(&b, (unsigned char)-42) == 55);
+# else
+ MISSING(AO_char_fetch_and_add);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add1_write)
+ TA_assert(AO_char_fetch_and_add1_write(&b) == 13);
+# else
+ MISSING(AO_char_fetch_and_add1);
+ ++b;
+# endif
+# if defined(AO_HAVE_char_fetch_and_sub1_write)
+ TA_assert(AO_char_fetch_and_sub1_write(&b) == 14);
+# else
+ MISSING(AO_char_fetch_and_sub1);
+ --b;
+# endif
+ TA_assert(*(volatile char *)&b == 13);
+# if defined(AO_HAVE_int_store_write)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile int *)&zz = 0;
+# endif
+ AO_int_store_write(&zz, 13);
+# else
+# if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \
+ || !defined(AO_HAVE_int_store_release) \
+ || !defined(AO_HAVE_int_store_release_write) \
+ || !defined(AO_HAVE_int_store_write)
+ MISSING(AO_int_store);
+# endif
+ zz = 13;
+# endif
+# if defined(AO_HAVE_int_load_write)
+ TA_assert(AO_int_load(&zz) == 13);
+# elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \
+ || !defined(AO_HAVE_int_load_acquire_read) \
+ || !defined(AO_HAVE_int_load_dd_acquire_read) \
+ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read)
+ MISSING(AO_int_load);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add_write)
+ TA_assert(AO_int_fetch_and_add_write(&zz, 42) == 13);
+ TA_assert(AO_int_fetch_and_add_write(&zz, (unsigned int)-42) == 55);
+# else
+ MISSING(AO_int_fetch_and_add);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add1_write)
+ TA_assert(AO_int_fetch_and_add1_write(&zz) == 13);
+# else
+ MISSING(AO_int_fetch_and_add1);
+ ++zz;
+# endif
+# if defined(AO_HAVE_int_fetch_and_sub1_write)
+ TA_assert(AO_int_fetch_and_sub1_write(&zz) == 14);
+# else
+ MISSING(AO_int_fetch_and_sub1);
+ --zz;
+# endif
+ TA_assert(*(volatile int *)&zz == 13);
+# if defined(AO_HAVE_compare_and_swap_write)
+ TA_assert(!AO_compare_and_swap_write(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swap_write(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ MISSING(AO_compare_and_swap);
+ if (*(volatile AO_t *)&x == 13) x = 42;
+# endif
+# if defined(AO_HAVE_or_write)
+ AO_or_write(&x, 66);
+ TA_assert(x == 106);
+# else
+# if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \
+ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \
+ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \
+ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write)
+ MISSING(AO_or);
+# endif
+ x |= 66;
+# endif
+# if defined(AO_HAVE_xor_write)
+ AO_xor_write(&x, 181);
+ TA_assert(x == 223);
+# else
+# if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \
+ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \
+ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \
+ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write)
+ MISSING(AO_xor);
+# endif
+ x ^= 181;
+# endif
+# if defined(AO_HAVE_and_write)
+ AO_and_write(&x, 57);
+ TA_assert(x == 25);
+# else
+# if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \
+ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \
+ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \
+ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write)
+ MISSING(AO_and);
+# endif
+ x &= 57;
+# endif
+# if defined(AO_HAVE_fetch_compare_and_swap_write)
+ TA_assert(AO_fetch_compare_and_swap_write(&x, 14, 117) == 25);
+ TA_assert(x == 25);
+ TA_assert(AO_fetch_compare_and_swap_write(&x, 25, 117) == 25);
+# else
+ MISSING(AO_fetch_compare_and_swap);
+ if (x == 25) x = 117;
+# endif
+ TA_assert(x == 117);
+# if defined(AO_HAVE_short_compare_and_swap_write)
+ TA_assert(!AO_short_compare_and_swap_write(&s, 14, 42));
+ TA_assert(s == 13);
+ TA_assert(AO_short_compare_and_swap_write(&s, 13, 42));
+ TA_assert(s == 42);
+# else
+ MISSING(AO_short_compare_and_swap);
+ if (*(volatile short *)&s == 13) s = 42;
+# endif
+# if defined(AO_HAVE_short_or_write)
+ AO_short_or_write(&s, 66);
+ TA_assert(s == 106);
+# else
+# if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \
+ || !defined(AO_HAVE_short_or_acquire_read) \
+ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \
+ || !defined(AO_HAVE_short_or_release) \
+ || !defined(AO_HAVE_short_or_release_write) \
+ || !defined(AO_HAVE_short_or_write)
+ MISSING(AO_short_or);
+# endif
+ s |= 66;
+# endif
+# if defined(AO_HAVE_short_xor_write)
+ AO_short_xor_write(&s, 181);
+ TA_assert(s == 223);
+# else
+# if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \
+ || !defined(AO_HAVE_short_xor_acquire_read) \
+ || !defined(AO_HAVE_short_xor_full) \
+ || !defined(AO_HAVE_short_xor_read) \
+ || !defined(AO_HAVE_short_xor_release) \
+ || !defined(AO_HAVE_short_xor_release_write) \
+ || !defined(AO_HAVE_short_xor_write)
+ MISSING(AO_short_xor);
+# endif
+ s ^= 181;
+# endif
+# if defined(AO_HAVE_short_and_write)
+ AO_short_and_write(&s, 57);
+ TA_assert(s == 25);
+# else
+# if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \
+ || !defined(AO_HAVE_short_and_acquire_read) \
+ || !defined(AO_HAVE_short_and_full) \
+ || !defined(AO_HAVE_short_and_read) \
+ || !defined(AO_HAVE_short_and_release) \
+ || !defined(AO_HAVE_short_and_release_write) \
+ || !defined(AO_HAVE_short_and_write)
+ MISSING(AO_short_and);
+# endif
+ s &= 57;
+# endif
+# if defined(AO_HAVE_short_fetch_compare_and_swap_write)
+ TA_assert(AO_short_fetch_compare_and_swap_write(&s, 14, 117) == 25);
+ TA_assert(s == 25);
+ TA_assert(AO_short_fetch_compare_and_swap_write(&s, 25, 117) == 25);
+# else
+ MISSING(AO_short_fetch_compare_and_swap);
+ if (s == 25) s = 117;
+# endif
+ TA_assert(s == 117);
+# if defined(AO_HAVE_char_compare_and_swap_write)
+ TA_assert(!AO_char_compare_and_swap_write(&b, 14, 42));
+ TA_assert(b == 13);
+ TA_assert(AO_char_compare_and_swap_write(&b, 13, 42));
+ TA_assert(b == 42);
+# else
+ MISSING(AO_char_compare_and_swap);
+ if (*(volatile char *)&b == 13) b = 42;
+# endif
+# if defined(AO_HAVE_char_or_write)
+ AO_char_or_write(&b, 66);
+ TA_assert(b == 106);
+# else
+# if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \
+ || !defined(AO_HAVE_char_or_acquire_read) \
+ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \
+ || !defined(AO_HAVE_char_or_release) \
+ || !defined(AO_HAVE_char_or_release_write) \
+ || !defined(AO_HAVE_char_or_write)
+ MISSING(AO_char_or);
+# endif
+ b |= 66;
+# endif
+# if defined(AO_HAVE_char_xor_write)
+ AO_char_xor_write(&b, 181);
+ TA_assert(b == 223);
+# else
+# if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \
+ || !defined(AO_HAVE_char_xor_acquire_read) \
+ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \
+ || !defined(AO_HAVE_char_xor_release) \
+ || !defined(AO_HAVE_char_xor_release_write) \
+ || !defined(AO_HAVE_char_xor_write)
+ MISSING(AO_char_xor);
+# endif
+ b ^= 181;
+# endif
+# if defined(AO_HAVE_char_and_write)
+ AO_char_and_write(&b, 57);
+ TA_assert(b == 25);
+# else
+# if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \
+ || !defined(AO_HAVE_char_and_acquire_read) \
+ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \
+ || !defined(AO_HAVE_char_and_release) \
+ || !defined(AO_HAVE_char_and_release_write) \
+ || !defined(AO_HAVE_char_and_write)
+ MISSING(AO_char_and);
+# endif
+ b &= 57;
+# endif
+# if defined(AO_HAVE_char_fetch_compare_and_swap_write)
+ TA_assert(AO_char_fetch_compare_and_swap_write(&b, 14, 117) == 25);
+ TA_assert(b == 25);
+ TA_assert(AO_char_fetch_compare_and_swap_write(&b, 25, 117) == 25);
+# else
+ MISSING(AO_char_fetch_compare_and_swap);
+ if (b == 25) b = 117;
+# endif
+ TA_assert(b == 117);
+# if defined(AO_HAVE_int_compare_and_swap_write)
+ TA_assert(!AO_int_compare_and_swap_write(&zz, 14, 42));
+ TA_assert(zz == 13);
+ TA_assert(AO_int_compare_and_swap_write(&zz, 13, 42));
+ TA_assert(zz == 42);
+# else
+ MISSING(AO_int_compare_and_swap);
+ if (*(volatile int *)&zz == 13) zz = 42;
+# endif
+# if defined(AO_HAVE_int_or_write)
+ AO_int_or_write(&zz, 66);
+ TA_assert(zz == 106);
+# else
+# if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \
+ || !defined(AO_HAVE_int_or_acquire_read) \
+ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \
+ || !defined(AO_HAVE_int_or_release) \
+ || !defined(AO_HAVE_int_or_release_write) \
+ || !defined(AO_HAVE_int_or_write)
+ MISSING(AO_int_or);
+# endif
+ zz |= 66;
+# endif
+# if defined(AO_HAVE_int_xor_write)
+ AO_int_xor_write(&zz, 181);
+ TA_assert(zz == 223);
+# else
+# if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \
+ || !defined(AO_HAVE_int_xor_acquire_read) \
+ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \
+ || !defined(AO_HAVE_int_xor_release) \
+ || !defined(AO_HAVE_int_xor_release_write) \
+ || !defined(AO_HAVE_int_xor_write)
+ MISSING(AO_int_xor);
+# endif
+ zz ^= 181;
+# endif
+# if defined(AO_HAVE_int_and_write)
+ AO_int_and_write(&zz, 57);
+ TA_assert(zz == 25);
+# else
+# if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \
+ || !defined(AO_HAVE_int_and_acquire_read) \
+ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \
+ || !defined(AO_HAVE_int_and_release) \
+ || !defined(AO_HAVE_int_and_release_write) \
+ || !defined(AO_HAVE_int_and_write)
+ MISSING(AO_int_and);
+# endif
+ zz &= 57;
+# endif
+# if defined(AO_HAVE_int_fetch_compare_and_swap_write)
+ TA_assert(AO_int_fetch_compare_and_swap_write(&zz, 14, 117) == 25);
+ TA_assert(zz == 25);
+ TA_assert(AO_int_fetch_compare_and_swap_write(&zz, 25, 117) == 25);
+# else
+ MISSING(AO_int_fetch_compare_and_swap);
+ if (zz == 25) zz = 117;
+# endif
+ TA_assert(zz == 117);
+# if defined(AO_HAVE_double_load_write) || defined(AO_HAVE_double_store_write)
+ /* Initialize old_w even for store to workaround MSan warning. */
+ old_w.AO_val1 = 3316;
+ old_w.AO_val2 = 2921;
+# endif
+# if defined(AO_HAVE_double_load_write)
+ new_w = AO_double_load_write(&old_w);
+ TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921);
+# elif !defined(AO_HAVE_double_load) \
+ || !defined(AO_HAVE_double_load_acquire) \
+ || !defined(AO_HAVE_double_load_acquire_read) \
+ || !defined(AO_HAVE_double_load_dd_acquire_read) \
+ || !defined(AO_HAVE_double_load_full) \
+ || !defined(AO_HAVE_double_load_read)
+ MISSING(AO_double_load);
+# endif
+# if defined(AO_HAVE_double_store_write)
+ new_w.AO_val1 = 1375;
+ new_w.AO_val2 = 8243;
+ AO_double_store_write(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ AO_double_store_write(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ new_w.AO_val1 ^= old_w.AO_val1;
+ new_w.AO_val2 ^= old_w.AO_val2;
+ AO_double_store_write(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0);
+# elif !defined(AO_HAVE_double_store) \
+ || !defined(AO_HAVE_double_store_full) \
+ || !defined(AO_HAVE_double_store_release) \
+ || !defined(AO_HAVE_double_store_release_write) \
+ || !defined(AO_HAVE_double_store_write)
+ MISSING(AO_double_store);
+# endif
+# if defined(AO_HAVE_compare_double_and_swap_double_write)
+ TA_assert(!AO_compare_double_and_swap_double_write(&w, 17, 42, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_double_write(&w, 0, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_write(&w, 12, 14, 64, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_write(&w, 11, 13, 85, 82));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_write(&w, 13, 12, 17, 42));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_double_and_swap_double_write(&w, 12, 13, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_double_and_swap_double_write(&w, 17, 42, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_double_and_swap_double);
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_write)
+ TA_assert(!AO_compare_and_swap_double_write(&w, 17, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_and_swap_double_write(&w, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_write(&w, 13, 12, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_write(&w, 1213, 48, 86));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_and_swap_double_write(&w, 12, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_and_swap_double_write(&w, 17, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_and_swap_double);
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_write)
+ old_w.AO_val1 = 4116;
+ old_w.AO_val2 = 2121;
+ new_w.AO_val1 = 8537;
+ new_w.AO_val2 = 6410;
+ TA_assert(!AO_double_compare_and_swap_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_double_compare_and_swap_write(&w, w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = 29;
+ new_w.AO_val1 = 820;
+ new_w.AO_val2 = 5917;
+ TA_assert(!AO_double_compare_and_swap_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = 11;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 3552;
+ new_w.AO_val2 = 1746;
+ TA_assert(!AO_double_compare_and_swap_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 8537;
+ new_w.AO_val1 = 4116;
+ new_w.AO_val2 = 2121;
+ TA_assert(!AO_double_compare_and_swap_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 1;
+ TA_assert(AO_double_compare_and_swap_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = w.AO_val2;
+ new_w.AO_val1--;
+ new_w.AO_val2 = 0;
+ TA_assert(AO_double_compare_and_swap_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_double_compare_and_swap);
+# endif
+}
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Some basic sanity tests. These do not test the barrier semantics. */
+
+#undef TA_assert
+#define TA_assert(e) \
+ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _full)\n", \
+ __FILE__, __LINE__), exit(1); }
+
+#undef MISSING
+#define MISSING(name) \
+ printf("Missing: %s\n", #name "_full")
+
+#if defined(CPPCHECK)
+ void list_atomic_full(void);
+ void char_list_atomic_full(void);
+ void short_list_atomic_full(void);
+ void int_list_atomic_full(void);
+ void double_list_atomic_full(void);
+#endif
+
+void test_atomic_full(void)
+{
+ AO_t x;
+ unsigned char b;
+ unsigned short s;
+ unsigned int zz;
+# if defined(AO_HAVE_test_and_set_full)
+ AO_TS_t z = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_full) \
+ || defined(AO_HAVE_double_load_full) \
+ || defined(AO_HAVE_double_store_full)
+ static AO_double_t old_w; /* static to avoid misalignment */
+ AO_double_t new_w;
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_full) \
+ || defined(AO_HAVE_compare_double_and_swap_double_full) \
+ || defined(AO_HAVE_double_compare_and_swap_full)
+ static AO_double_t w; /* static to avoid misalignment */
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+# endif
+
+# if defined(CPPCHECK)
+ list_atomic_full();
+ char_list_atomic_full();
+ short_list_atomic_full();
+ int_list_atomic_full();
+ double_list_atomic_full();
+# endif
+# if defined(AO_HAVE_nop_full)
+ AO_nop_full();
+# elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \
+ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write)
+ MISSING(AO_nop);
+# endif
+# if defined(AO_HAVE_store_full)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */
+# endif
+ AO_store_full(&x, 13);
+ TA_assert(x == 13);
+# else
+# if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \
+ || !defined(AO_HAVE_store_release) \
+ || !defined(AO_HAVE_store_release_write) \
+ || !defined(AO_HAVE_store_write)
+ MISSING(AO_store);
+# endif
+ x = 13;
+# endif
+# if defined(AO_HAVE_load_full)
+ TA_assert(AO_load_full(&x) == 13);
+# elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \
+ || !defined(AO_HAVE_load_acquire_read) \
+ || !defined(AO_HAVE_load_dd_acquire_read) \
+ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read)
+ MISSING(AO_load);
+# endif
+# if defined(AO_HAVE_test_and_set_full)
+ TA_assert(AO_test_and_set_full(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_set_full(&z) == AO_TS_SET);
+ TA_assert(AO_test_and_set_full(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# else
+ MISSING(AO_test_and_set);
+# endif
+# if defined(AO_HAVE_fetch_and_add_full)
+ TA_assert(AO_fetch_and_add_full(&x, 42) == 13);
+ TA_assert(AO_fetch_and_add_full(&x, (AO_t)(-42)) == 55);
+# else
+ MISSING(AO_fetch_and_add);
+# endif
+# if defined(AO_HAVE_fetch_and_add1_full)
+ TA_assert(AO_fetch_and_add1_full(&x) == 13);
+# else
+ MISSING(AO_fetch_and_add1);
+ ++x;
+# endif
+# if defined(AO_HAVE_fetch_and_sub1_full)
+ TA_assert(AO_fetch_and_sub1_full(&x) == 14);
+# else
+ MISSING(AO_fetch_and_sub1);
+ --x;
+# endif
+# if defined(AO_HAVE_short_store_full)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile short *)&s = 0;
+# endif
+ AO_short_store_full(&s, 13);
+# else
+# if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \
+ || !defined(AO_HAVE_short_store_release) \
+ || !defined(AO_HAVE_short_store_release_write) \
+ || !defined(AO_HAVE_short_store_write)
+ MISSING(AO_short_store);
+# endif
+ s = 13;
+# endif
+# if defined(AO_HAVE_short_load_full)
+ TA_assert(AO_short_load(&s) == 13);
+# elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \
+ || !defined(AO_HAVE_short_load_acquire_read) \
+ || !defined(AO_HAVE_short_load_dd_acquire_read) \
+ || !defined(AO_HAVE_short_load_full) \
+ || !defined(AO_HAVE_short_load_read)
+ MISSING(AO_short_load);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add_full)
+ TA_assert(AO_short_fetch_and_add_full(&s, 42) == 13);
+ TA_assert(AO_short_fetch_and_add_full(&s, (unsigned short)-42) == 55);
+# else
+ MISSING(AO_short_fetch_and_add);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add1_full)
+ TA_assert(AO_short_fetch_and_add1_full(&s) == 13);
+# else
+ MISSING(AO_short_fetch_and_add1);
+ ++s;
+# endif
+# if defined(AO_HAVE_short_fetch_and_sub1_full)
+ TA_assert(AO_short_fetch_and_sub1_full(&s) == 14);
+# else
+ MISSING(AO_short_fetch_and_sub1);
+ --s;
+# endif
+ TA_assert(*(volatile short *)&s == 13);
+# if defined(AO_HAVE_char_store_full)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile char *)&b = 0;
+# endif
+ AO_char_store_full(&b, 13);
+# else
+# if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \
+ || !defined(AO_HAVE_char_store_release) \
+ || !defined(AO_HAVE_char_store_release_write) \
+ || !defined(AO_HAVE_char_store_write)
+ MISSING(AO_char_store);
+# endif
+ b = 13;
+# endif
+# if defined(AO_HAVE_char_load_full)
+ TA_assert(AO_char_load(&b) == 13);
+# elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \
+ || !defined(AO_HAVE_char_load_acquire_read) \
+ || !defined(AO_HAVE_char_load_dd_acquire_read) \
+ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read)
+ MISSING(AO_char_load);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add_full)
+ TA_assert(AO_char_fetch_and_add_full(&b, 42) == 13);
+ TA_assert(AO_char_fetch_and_add_full(&b, (unsigned char)-42) == 55);
+# else
+ MISSING(AO_char_fetch_and_add);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add1_full)
+ TA_assert(AO_char_fetch_and_add1_full(&b) == 13);
+# else
+ MISSING(AO_char_fetch_and_add1);
+ ++b;
+# endif
+# if defined(AO_HAVE_char_fetch_and_sub1_full)
+ TA_assert(AO_char_fetch_and_sub1_full(&b) == 14);
+# else
+ MISSING(AO_char_fetch_and_sub1);
+ --b;
+# endif
+ TA_assert(*(volatile char *)&b == 13);
+# if defined(AO_HAVE_int_store_full)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile int *)&zz = 0;
+# endif
+ AO_int_store_full(&zz, 13);
+# else
+# if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \
+ || !defined(AO_HAVE_int_store_release) \
+ || !defined(AO_HAVE_int_store_release_write) \
+ || !defined(AO_HAVE_int_store_write)
+ MISSING(AO_int_store);
+# endif
+ zz = 13;
+# endif
+# if defined(AO_HAVE_int_load_full)
+ TA_assert(AO_int_load(&zz) == 13);
+# elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \
+ || !defined(AO_HAVE_int_load_acquire_read) \
+ || !defined(AO_HAVE_int_load_dd_acquire_read) \
+ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read)
+ MISSING(AO_int_load);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add_full)
+ TA_assert(AO_int_fetch_and_add_full(&zz, 42) == 13);
+ TA_assert(AO_int_fetch_and_add_full(&zz, (unsigned int)-42) == 55);
+# else
+ MISSING(AO_int_fetch_and_add);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add1_full)
+ TA_assert(AO_int_fetch_and_add1_full(&zz) == 13);
+# else
+ MISSING(AO_int_fetch_and_add1);
+ ++zz;
+# endif
+# if defined(AO_HAVE_int_fetch_and_sub1_full)
+ TA_assert(AO_int_fetch_and_sub1_full(&zz) == 14);
+# else
+ MISSING(AO_int_fetch_and_sub1);
+ --zz;
+# endif
+ TA_assert(*(volatile int *)&zz == 13);
+# if defined(AO_HAVE_compare_and_swap_full)
+ TA_assert(!AO_compare_and_swap_full(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swap_full(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ MISSING(AO_compare_and_swap);
+ if (*(volatile AO_t *)&x == 13) x = 42;
+# endif
+# if defined(AO_HAVE_or_full)
+ AO_or_full(&x, 66);
+ TA_assert(x == 106);
+# else
+# if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \
+ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \
+ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \
+ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write)
+ MISSING(AO_or);
+# endif
+ x |= 66;
+# endif
+# if defined(AO_HAVE_xor_full)
+ AO_xor_full(&x, 181);
+ TA_assert(x == 223);
+# else
+# if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \
+ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \
+ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \
+ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write)
+ MISSING(AO_xor);
+# endif
+ x ^= 181;
+# endif
+# if defined(AO_HAVE_and_full)
+ AO_and_full(&x, 57);
+ TA_assert(x == 25);
+# else
+# if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \
+ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \
+ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \
+ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write)
+ MISSING(AO_and);
+# endif
+ x &= 57;
+# endif
+# if defined(AO_HAVE_fetch_compare_and_swap_full)
+ TA_assert(AO_fetch_compare_and_swap_full(&x, 14, 117) == 25);
+ TA_assert(x == 25);
+ TA_assert(AO_fetch_compare_and_swap_full(&x, 25, 117) == 25);
+# else
+ MISSING(AO_fetch_compare_and_swap);
+ if (x == 25) x = 117;
+# endif
+ TA_assert(x == 117);
+# if defined(AO_HAVE_short_compare_and_swap_full)
+ TA_assert(!AO_short_compare_and_swap_full(&s, 14, 42));
+ TA_assert(s == 13);
+ TA_assert(AO_short_compare_and_swap_full(&s, 13, 42));
+ TA_assert(s == 42);
+# else
+ MISSING(AO_short_compare_and_swap);
+ if (*(volatile short *)&s == 13) s = 42;
+# endif
+# if defined(AO_HAVE_short_or_full)
+ AO_short_or_full(&s, 66);
+ TA_assert(s == 106);
+# else
+# if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \
+ || !defined(AO_HAVE_short_or_acquire_read) \
+ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \
+ || !defined(AO_HAVE_short_or_release) \
+ || !defined(AO_HAVE_short_or_release_write) \
+ || !defined(AO_HAVE_short_or_write)
+ MISSING(AO_short_or);
+# endif
+ s |= 66;
+# endif
+# if defined(AO_HAVE_short_xor_full)
+ AO_short_xor_full(&s, 181);
+ TA_assert(s == 223);
+# else
+# if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \
+ || !defined(AO_HAVE_short_xor_acquire_read) \
+ || !defined(AO_HAVE_short_xor_full) \
+ || !defined(AO_HAVE_short_xor_read) \
+ || !defined(AO_HAVE_short_xor_release) \
+ || !defined(AO_HAVE_short_xor_release_write) \
+ || !defined(AO_HAVE_short_xor_write)
+ MISSING(AO_short_xor);
+# endif
+ s ^= 181;
+# endif
+# if defined(AO_HAVE_short_and_full)
+ AO_short_and_full(&s, 57);
+ TA_assert(s == 25);
+# else
+# if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \
+ || !defined(AO_HAVE_short_and_acquire_read) \
+ || !defined(AO_HAVE_short_and_full) \
+ || !defined(AO_HAVE_short_and_read) \
+ || !defined(AO_HAVE_short_and_release) \
+ || !defined(AO_HAVE_short_and_release_write) \
+ || !defined(AO_HAVE_short_and_write)
+ MISSING(AO_short_and);
+# endif
+ s &= 57;
+# endif
+# if defined(AO_HAVE_short_fetch_compare_and_swap_full)
+ TA_assert(AO_short_fetch_compare_and_swap_full(&s, 14, 117) == 25);
+ TA_assert(s == 25);
+ TA_assert(AO_short_fetch_compare_and_swap_full(&s, 25, 117) == 25);
+# else
+ MISSING(AO_short_fetch_compare_and_swap);
+ if (s == 25) s = 117;
+# endif
+ TA_assert(s == 117);
+# if defined(AO_HAVE_char_compare_and_swap_full)
+ TA_assert(!AO_char_compare_and_swap_full(&b, 14, 42));
+ TA_assert(b == 13);
+ TA_assert(AO_char_compare_and_swap_full(&b, 13, 42));
+ TA_assert(b == 42);
+# else
+ MISSING(AO_char_compare_and_swap);
+ if (*(volatile char *)&b == 13) b = 42;
+# endif
+# if defined(AO_HAVE_char_or_full)
+ AO_char_or_full(&b, 66);
+ TA_assert(b == 106);
+# else
+# if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \
+ || !defined(AO_HAVE_char_or_acquire_read) \
+ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \
+ || !defined(AO_HAVE_char_or_release) \
+ || !defined(AO_HAVE_char_or_release_write) \
+ || !defined(AO_HAVE_char_or_write)
+ MISSING(AO_char_or);
+# endif
+ b |= 66;
+# endif
+# if defined(AO_HAVE_char_xor_full)
+ AO_char_xor_full(&b, 181);
+ TA_assert(b == 223);
+# else
+# if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \
+ || !defined(AO_HAVE_char_xor_acquire_read) \
+ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \
+ || !defined(AO_HAVE_char_xor_release) \
+ || !defined(AO_HAVE_char_xor_release_write) \
+ || !defined(AO_HAVE_char_xor_write)
+ MISSING(AO_char_xor);
+# endif
+ b ^= 181;
+# endif
+# if defined(AO_HAVE_char_and_full)
+ AO_char_and_full(&b, 57);
+ TA_assert(b == 25);
+# else
+# if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \
+ || !defined(AO_HAVE_char_and_acquire_read) \
+ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \
+ || !defined(AO_HAVE_char_and_release) \
+ || !defined(AO_HAVE_char_and_release_write) \
+ || !defined(AO_HAVE_char_and_write)
+ MISSING(AO_char_and);
+# endif
+ b &= 57;
+# endif
+# if defined(AO_HAVE_char_fetch_compare_and_swap_full)
+ TA_assert(AO_char_fetch_compare_and_swap_full(&b, 14, 117) == 25);
+ TA_assert(b == 25);
+ TA_assert(AO_char_fetch_compare_and_swap_full(&b, 25, 117) == 25);
+# else
+ MISSING(AO_char_fetch_compare_and_swap);
+ if (b == 25) b = 117;
+# endif
+ TA_assert(b == 117);
+# if defined(AO_HAVE_int_compare_and_swap_full)
+ TA_assert(!AO_int_compare_and_swap_full(&zz, 14, 42));
+ TA_assert(zz == 13);
+ TA_assert(AO_int_compare_and_swap_full(&zz, 13, 42));
+ TA_assert(zz == 42);
+# else
+ MISSING(AO_int_compare_and_swap);
+ if (*(volatile int *)&zz == 13) zz = 42;
+# endif
+# if defined(AO_HAVE_int_or_full)
+ AO_int_or_full(&zz, 66);
+ TA_assert(zz == 106);
+# else
+# if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \
+ || !defined(AO_HAVE_int_or_acquire_read) \
+ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \
+ || !defined(AO_HAVE_int_or_release) \
+ || !defined(AO_HAVE_int_or_release_write) \
+ || !defined(AO_HAVE_int_or_write)
+ MISSING(AO_int_or);
+# endif
+ zz |= 66;
+# endif
+# if defined(AO_HAVE_int_xor_full)
+ AO_int_xor_full(&zz, 181);
+ TA_assert(zz == 223);
+# else
+# if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \
+ || !defined(AO_HAVE_int_xor_acquire_read) \
+ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \
+ || !defined(AO_HAVE_int_xor_release) \
+ || !defined(AO_HAVE_int_xor_release_write) \
+ || !defined(AO_HAVE_int_xor_write)
+ MISSING(AO_int_xor);
+# endif
+ zz ^= 181;
+# endif
+# if defined(AO_HAVE_int_and_full)
+ AO_int_and_full(&zz, 57);
+ TA_assert(zz == 25);
+# else
+# if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \
+ || !defined(AO_HAVE_int_and_acquire_read) \
+ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \
+ || !defined(AO_HAVE_int_and_release) \
+ || !defined(AO_HAVE_int_and_release_write) \
+ || !defined(AO_HAVE_int_and_write)
+ MISSING(AO_int_and);
+# endif
+ zz &= 57;
+# endif
+# if defined(AO_HAVE_int_fetch_compare_and_swap_full)
+ TA_assert(AO_int_fetch_compare_and_swap_full(&zz, 14, 117) == 25);
+ TA_assert(zz == 25);
+ TA_assert(AO_int_fetch_compare_and_swap_full(&zz, 25, 117) == 25);
+# else
+ MISSING(AO_int_fetch_compare_and_swap);
+ if (zz == 25) zz = 117;
+# endif
+ TA_assert(zz == 117);
+# if defined(AO_HAVE_double_load_full) || defined(AO_HAVE_double_store_full)
+ /* Initialize old_w even for store to workaround MSan warning. */
+ old_w.AO_val1 = 3316;
+ old_w.AO_val2 = 2921;
+# endif
+# if defined(AO_HAVE_double_load_full)
+ new_w = AO_double_load_full(&old_w);
+ TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921);
+# elif !defined(AO_HAVE_double_load) \
+ || !defined(AO_HAVE_double_load_acquire) \
+ || !defined(AO_HAVE_double_load_acquire_read) \
+ || !defined(AO_HAVE_double_load_dd_acquire_read) \
+ || !defined(AO_HAVE_double_load_full) \
+ || !defined(AO_HAVE_double_load_read)
+ MISSING(AO_double_load);
+# endif
+# if defined(AO_HAVE_double_store_full)
+ new_w.AO_val1 = 1375;
+ new_w.AO_val2 = 8243;
+ AO_double_store_full(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ AO_double_store_full(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ new_w.AO_val1 ^= old_w.AO_val1;
+ new_w.AO_val2 ^= old_w.AO_val2;
+ AO_double_store_full(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0);
+# elif !defined(AO_HAVE_double_store) \
+ || !defined(AO_HAVE_double_store_full) \
+ || !defined(AO_HAVE_double_store_release) \
+ || !defined(AO_HAVE_double_store_release_write) \
+ || !defined(AO_HAVE_double_store_write)
+ MISSING(AO_double_store);
+# endif
+# if defined(AO_HAVE_compare_double_and_swap_double_full)
+ TA_assert(!AO_compare_double_and_swap_double_full(&w, 17, 42, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_double_full(&w, 0, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_full(&w, 12, 14, 64, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_full(&w, 11, 13, 85, 82));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_full(&w, 13, 12, 17, 42));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_double_and_swap_double_full(&w, 12, 13, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_double_and_swap_double_full(&w, 17, 42, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_double_and_swap_double);
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_full)
+ TA_assert(!AO_compare_and_swap_double_full(&w, 17, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_and_swap_double_full(&w, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_full(&w, 13, 12, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_full(&w, 1213, 48, 86));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_and_swap_double_full(&w, 12, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_and_swap_double_full(&w, 17, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_and_swap_double);
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_full)
+ old_w.AO_val1 = 4116;
+ old_w.AO_val2 = 2121;
+ new_w.AO_val1 = 8537;
+ new_w.AO_val2 = 6410;
+ TA_assert(!AO_double_compare_and_swap_full(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_double_compare_and_swap_full(&w, w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = 29;
+ new_w.AO_val1 = 820;
+ new_w.AO_val2 = 5917;
+ TA_assert(!AO_double_compare_and_swap_full(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = 11;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 3552;
+ new_w.AO_val2 = 1746;
+ TA_assert(!AO_double_compare_and_swap_full(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 8537;
+ new_w.AO_val1 = 4116;
+ new_w.AO_val2 = 2121;
+ TA_assert(!AO_double_compare_and_swap_full(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 1;
+ TA_assert(AO_double_compare_and_swap_full(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = w.AO_val2;
+ new_w.AO_val1--;
+ new_w.AO_val2 = 0;
+ TA_assert(AO_double_compare_and_swap_full(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_double_compare_and_swap);
+# endif
+}
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Some basic sanity tests. These do not test the barrier semantics. */
+
+#undef TA_assert
+#define TA_assert(e) \
+ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _release_write)\n", \
+ __FILE__, __LINE__), exit(1); }
+
+#undef MISSING
+#define MISSING(name) \
+ printf("Missing: %s\n", #name "_release_write")
+
+#if defined(CPPCHECK)
+ void list_atomic_release_write(void);
+ void char_list_atomic_release_write(void);
+ void short_list_atomic_release_write(void);
+ void int_list_atomic_release_write(void);
+ void double_list_atomic_release_write(void);
+#endif
+
+void test_atomic_release_write(void)
+{
+ AO_t x;
+ unsigned char b;
+ unsigned short s;
+ unsigned int zz;
+# if defined(AO_HAVE_test_and_set_release_write)
+ AO_TS_t z = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_release_write) \
+ || defined(AO_HAVE_double_load_release_write) \
+ || defined(AO_HAVE_double_store_release_write)
+ static AO_double_t old_w; /* static to avoid misalignment */
+ AO_double_t new_w;
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_release_write) \
+ || defined(AO_HAVE_compare_double_and_swap_double_release_write) \
+ || defined(AO_HAVE_double_compare_and_swap_release_write)
+ static AO_double_t w; /* static to avoid misalignment */
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+# endif
+
+# if defined(CPPCHECK)
+ list_atomic_release_write();
+ char_list_atomic_release_write();
+ short_list_atomic_release_write();
+ int_list_atomic_release_write();
+ double_list_atomic_release_write();
+# endif
+# if defined(AO_HAVE_nop_release_write)
+ AO_nop_release_write();
+# elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \
+ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write)
+ MISSING(AO_nop);
+# endif
+# if defined(AO_HAVE_store_release_write)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */
+# endif
+ AO_store_release_write(&x, 13);
+ TA_assert(x == 13);
+# else
+# if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \
+ || !defined(AO_HAVE_store_release) \
+ || !defined(AO_HAVE_store_release_write) \
+ || !defined(AO_HAVE_store_write)
+ MISSING(AO_store);
+# endif
+ x = 13;
+# endif
+# if defined(AO_HAVE_load_release_write)
+ TA_assert(AO_load_release_write(&x) == 13);
+# elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \
+ || !defined(AO_HAVE_load_acquire_read) \
+ || !defined(AO_HAVE_load_dd_acquire_read) \
+ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read)
+ MISSING(AO_load);
+# endif
+# if defined(AO_HAVE_test_and_set_release_write)
+ TA_assert(AO_test_and_set_release_write(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_set_release_write(&z) == AO_TS_SET);
+ TA_assert(AO_test_and_set_release_write(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# else
+ MISSING(AO_test_and_set);
+# endif
+# if defined(AO_HAVE_fetch_and_add_release_write)
+ TA_assert(AO_fetch_and_add_release_write(&x, 42) == 13);
+ TA_assert(AO_fetch_and_add_release_write(&x, (AO_t)(-42)) == 55);
+# else
+ MISSING(AO_fetch_and_add);
+# endif
+# if defined(AO_HAVE_fetch_and_add1_release_write)
+ TA_assert(AO_fetch_and_add1_release_write(&x) == 13);
+# else
+ MISSING(AO_fetch_and_add1);
+ ++x;
+# endif
+# if defined(AO_HAVE_fetch_and_sub1_release_write)
+ TA_assert(AO_fetch_and_sub1_release_write(&x) == 14);
+# else
+ MISSING(AO_fetch_and_sub1);
+ --x;
+# endif
+# if defined(AO_HAVE_short_store_release_write)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile short *)&s = 0;
+# endif
+ AO_short_store_release_write(&s, 13);
+# else
+# if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \
+ || !defined(AO_HAVE_short_store_release) \
+ || !defined(AO_HAVE_short_store_release_write) \
+ || !defined(AO_HAVE_short_store_write)
+ MISSING(AO_short_store);
+# endif
+ s = 13;
+# endif
+# if defined(AO_HAVE_short_load_release_write)
+ TA_assert(AO_short_load(&s) == 13);
+# elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \
+ || !defined(AO_HAVE_short_load_acquire_read) \
+ || !defined(AO_HAVE_short_load_dd_acquire_read) \
+ || !defined(AO_HAVE_short_load_full) \
+ || !defined(AO_HAVE_short_load_read)
+ MISSING(AO_short_load);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add_release_write)
+ TA_assert(AO_short_fetch_and_add_release_write(&s, 42) == 13);
+ TA_assert(AO_short_fetch_and_add_release_write(&s, (unsigned short)-42) == 55);
+# else
+ MISSING(AO_short_fetch_and_add);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add1_release_write)
+ TA_assert(AO_short_fetch_and_add1_release_write(&s) == 13);
+# else
+ MISSING(AO_short_fetch_and_add1);
+ ++s;
+# endif
+# if defined(AO_HAVE_short_fetch_and_sub1_release_write)
+ TA_assert(AO_short_fetch_and_sub1_release_write(&s) == 14);
+# else
+ MISSING(AO_short_fetch_and_sub1);
+ --s;
+# endif
+ TA_assert(*(volatile short *)&s == 13);
+# if defined(AO_HAVE_char_store_release_write)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile char *)&b = 0;
+# endif
+ AO_char_store_release_write(&b, 13);
+# else
+# if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \
+ || !defined(AO_HAVE_char_store_release) \
+ || !defined(AO_HAVE_char_store_release_write) \
+ || !defined(AO_HAVE_char_store_write)
+ MISSING(AO_char_store);
+# endif
+ b = 13;
+# endif
+# if defined(AO_HAVE_char_load_release_write)
+ TA_assert(AO_char_load(&b) == 13);
+# elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \
+ || !defined(AO_HAVE_char_load_acquire_read) \
+ || !defined(AO_HAVE_char_load_dd_acquire_read) \
+ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read)
+ MISSING(AO_char_load);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add_release_write)
+ TA_assert(AO_char_fetch_and_add_release_write(&b, 42) == 13);
+ TA_assert(AO_char_fetch_and_add_release_write(&b, (unsigned char)-42) == 55);
+# else
+ MISSING(AO_char_fetch_and_add);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add1_release_write)
+ TA_assert(AO_char_fetch_and_add1_release_write(&b) == 13);
+# else
+ MISSING(AO_char_fetch_and_add1);
+ ++b;
+# endif
+# if defined(AO_HAVE_char_fetch_and_sub1_release_write)
+ TA_assert(AO_char_fetch_and_sub1_release_write(&b) == 14);
+# else
+ MISSING(AO_char_fetch_and_sub1);
+ --b;
+# endif
+ TA_assert(*(volatile char *)&b == 13);
+# if defined(AO_HAVE_int_store_release_write)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile int *)&zz = 0;
+# endif
+ AO_int_store_release_write(&zz, 13);
+# else
+# if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \
+ || !defined(AO_HAVE_int_store_release) \
+ || !defined(AO_HAVE_int_store_release_write) \
+ || !defined(AO_HAVE_int_store_write)
+ MISSING(AO_int_store);
+# endif
+ zz = 13;
+# endif
+# if defined(AO_HAVE_int_load_release_write)
+ TA_assert(AO_int_load(&zz) == 13);
+# elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \
+ || !defined(AO_HAVE_int_load_acquire_read) \
+ || !defined(AO_HAVE_int_load_dd_acquire_read) \
+ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read)
+ MISSING(AO_int_load);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add_release_write)
+ TA_assert(AO_int_fetch_and_add_release_write(&zz, 42) == 13);
+ TA_assert(AO_int_fetch_and_add_release_write(&zz, (unsigned int)-42) == 55);
+# else
+ MISSING(AO_int_fetch_and_add);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add1_release_write)
+ TA_assert(AO_int_fetch_and_add1_release_write(&zz) == 13);
+# else
+ MISSING(AO_int_fetch_and_add1);
+ ++zz;
+# endif
+# if defined(AO_HAVE_int_fetch_and_sub1_release_write)
+ TA_assert(AO_int_fetch_and_sub1_release_write(&zz) == 14);
+# else
+ MISSING(AO_int_fetch_and_sub1);
+ --zz;
+# endif
+ TA_assert(*(volatile int *)&zz == 13);
+# if defined(AO_HAVE_compare_and_swap_release_write)
+ TA_assert(!AO_compare_and_swap_release_write(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swap_release_write(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ MISSING(AO_compare_and_swap);
+ if (*(volatile AO_t *)&x == 13) x = 42;
+# endif
+# if defined(AO_HAVE_or_release_write)
+ AO_or_release_write(&x, 66);
+ TA_assert(x == 106);
+# else
+# if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \
+ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \
+ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \
+ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write)
+ MISSING(AO_or);
+# endif
+ x |= 66;
+# endif
+# if defined(AO_HAVE_xor_release_write)
+ AO_xor_release_write(&x, 181);
+ TA_assert(x == 223);
+# else
+# if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \
+ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \
+ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \
+ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write)
+ MISSING(AO_xor);
+# endif
+ x ^= 181;
+# endif
+# if defined(AO_HAVE_and_release_write)
+ AO_and_release_write(&x, 57);
+ TA_assert(x == 25);
+# else
+# if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \
+ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \
+ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \
+ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write)
+ MISSING(AO_and);
+# endif
+ x &= 57;
+# endif
+# if defined(AO_HAVE_fetch_compare_and_swap_release_write)
+ TA_assert(AO_fetch_compare_and_swap_release_write(&x, 14, 117) == 25);
+ TA_assert(x == 25);
+ TA_assert(AO_fetch_compare_and_swap_release_write(&x, 25, 117) == 25);
+# else
+ MISSING(AO_fetch_compare_and_swap);
+ if (x == 25) x = 117;
+# endif
+ TA_assert(x == 117);
+# if defined(AO_HAVE_short_compare_and_swap_release_write)
+ TA_assert(!AO_short_compare_and_swap_release_write(&s, 14, 42));
+ TA_assert(s == 13);
+ TA_assert(AO_short_compare_and_swap_release_write(&s, 13, 42));
+ TA_assert(s == 42);
+# else
+ MISSING(AO_short_compare_and_swap);
+ if (*(volatile short *)&s == 13) s = 42;
+# endif
+# if defined(AO_HAVE_short_or_release_write)
+ AO_short_or_release_write(&s, 66);
+ TA_assert(s == 106);
+# else
+# if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \
+ || !defined(AO_HAVE_short_or_acquire_read) \
+ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \
+ || !defined(AO_HAVE_short_or_release) \
+ || !defined(AO_HAVE_short_or_release_write) \
+ || !defined(AO_HAVE_short_or_write)
+ MISSING(AO_short_or);
+# endif
+ s |= 66;
+# endif
+# if defined(AO_HAVE_short_xor_release_write)
+ AO_short_xor_release_write(&s, 181);
+ TA_assert(s == 223);
+# else
+# if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \
+ || !defined(AO_HAVE_short_xor_acquire_read) \
+ || !defined(AO_HAVE_short_xor_full) \
+ || !defined(AO_HAVE_short_xor_read) \
+ || !defined(AO_HAVE_short_xor_release) \
+ || !defined(AO_HAVE_short_xor_release_write) \
+ || !defined(AO_HAVE_short_xor_write)
+ MISSING(AO_short_xor);
+# endif
+ s ^= 181;
+# endif
+# if defined(AO_HAVE_short_and_release_write)
+ AO_short_and_release_write(&s, 57);
+ TA_assert(s == 25);
+# else
+# if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \
+ || !defined(AO_HAVE_short_and_acquire_read) \
+ || !defined(AO_HAVE_short_and_full) \
+ || !defined(AO_HAVE_short_and_read) \
+ || !defined(AO_HAVE_short_and_release) \
+ || !defined(AO_HAVE_short_and_release_write) \
+ || !defined(AO_HAVE_short_and_write)
+ MISSING(AO_short_and);
+# endif
+ s &= 57;
+# endif
+# if defined(AO_HAVE_short_fetch_compare_and_swap_release_write)
+ TA_assert(AO_short_fetch_compare_and_swap_release_write(&s, 14, 117) == 25);
+ TA_assert(s == 25);
+ TA_assert(AO_short_fetch_compare_and_swap_release_write(&s, 25, 117) == 25);
+# else
+ MISSING(AO_short_fetch_compare_and_swap);
+ if (s == 25) s = 117;
+# endif
+ TA_assert(s == 117);
+# if defined(AO_HAVE_char_compare_and_swap_release_write)
+ TA_assert(!AO_char_compare_and_swap_release_write(&b, 14, 42));
+ TA_assert(b == 13);
+ TA_assert(AO_char_compare_and_swap_release_write(&b, 13, 42));
+ TA_assert(b == 42);
+# else
+ MISSING(AO_char_compare_and_swap);
+ if (*(volatile char *)&b == 13) b = 42;
+# endif
+# if defined(AO_HAVE_char_or_release_write)
+ AO_char_or_release_write(&b, 66);
+ TA_assert(b == 106);
+# else
+# if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \
+ || !defined(AO_HAVE_char_or_acquire_read) \
+ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \
+ || !defined(AO_HAVE_char_or_release) \
+ || !defined(AO_HAVE_char_or_release_write) \
+ || !defined(AO_HAVE_char_or_write)
+ MISSING(AO_char_or);
+# endif
+ b |= 66;
+# endif
+# if defined(AO_HAVE_char_xor_release_write)
+ AO_char_xor_release_write(&b, 181);
+ TA_assert(b == 223);
+# else
+# if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \
+ || !defined(AO_HAVE_char_xor_acquire_read) \
+ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \
+ || !defined(AO_HAVE_char_xor_release) \
+ || !defined(AO_HAVE_char_xor_release_write) \
+ || !defined(AO_HAVE_char_xor_write)
+ MISSING(AO_char_xor);
+# endif
+ b ^= 181;
+# endif
+# if defined(AO_HAVE_char_and_release_write)
+ AO_char_and_release_write(&b, 57);
+ TA_assert(b == 25);
+# else
+# if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \
+ || !defined(AO_HAVE_char_and_acquire_read) \
+ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \
+ || !defined(AO_HAVE_char_and_release) \
+ || !defined(AO_HAVE_char_and_release_write) \
+ || !defined(AO_HAVE_char_and_write)
+ MISSING(AO_char_and);
+# endif
+ b &= 57;
+# endif
+# if defined(AO_HAVE_char_fetch_compare_and_swap_release_write)
+ TA_assert(AO_char_fetch_compare_and_swap_release_write(&b, 14, 117) == 25);
+ TA_assert(b == 25);
+ TA_assert(AO_char_fetch_compare_and_swap_release_write(&b, 25, 117) == 25);
+# else
+ MISSING(AO_char_fetch_compare_and_swap);
+ if (b == 25) b = 117;
+# endif
+ TA_assert(b == 117);
+# if defined(AO_HAVE_int_compare_and_swap_release_write)
+ TA_assert(!AO_int_compare_and_swap_release_write(&zz, 14, 42));
+ TA_assert(zz == 13);
+ TA_assert(AO_int_compare_and_swap_release_write(&zz, 13, 42));
+ TA_assert(zz == 42);
+# else
+ MISSING(AO_int_compare_and_swap);
+ if (*(volatile int *)&zz == 13) zz = 42;
+# endif
+# if defined(AO_HAVE_int_or_release_write)
+ AO_int_or_release_write(&zz, 66);
+ TA_assert(zz == 106);
+# else
+# if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \
+ || !defined(AO_HAVE_int_or_acquire_read) \
+ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \
+ || !defined(AO_HAVE_int_or_release) \
+ || !defined(AO_HAVE_int_or_release_write) \
+ || !defined(AO_HAVE_int_or_write)
+ MISSING(AO_int_or);
+# endif
+ zz |= 66;
+# endif
+# if defined(AO_HAVE_int_xor_release_write)
+ AO_int_xor_release_write(&zz, 181);
+ TA_assert(zz == 223);
+# else
+# if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \
+ || !defined(AO_HAVE_int_xor_acquire_read) \
+ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \
+ || !defined(AO_HAVE_int_xor_release) \
+ || !defined(AO_HAVE_int_xor_release_write) \
+ || !defined(AO_HAVE_int_xor_write)
+ MISSING(AO_int_xor);
+# endif
+ zz ^= 181;
+# endif
+# if defined(AO_HAVE_int_and_release_write)
+ AO_int_and_release_write(&zz, 57);
+ TA_assert(zz == 25);
+# else
+# if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \
+ || !defined(AO_HAVE_int_and_acquire_read) \
+ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \
+ || !defined(AO_HAVE_int_and_release) \
+ || !defined(AO_HAVE_int_and_release_write) \
+ || !defined(AO_HAVE_int_and_write)
+ MISSING(AO_int_and);
+# endif
+ zz &= 57;
+# endif
+# if defined(AO_HAVE_int_fetch_compare_and_swap_release_write)
+ TA_assert(AO_int_fetch_compare_and_swap_release_write(&zz, 14, 117) == 25);
+ TA_assert(zz == 25);
+ TA_assert(AO_int_fetch_compare_and_swap_release_write(&zz, 25, 117) == 25);
+# else
+ MISSING(AO_int_fetch_compare_and_swap);
+ if (zz == 25) zz = 117;
+# endif
+ TA_assert(zz == 117);
+# if defined(AO_HAVE_double_load_release_write) || defined(AO_HAVE_double_store_release_write)
+ /* Initialize old_w even for store to workaround MSan warning. */
+ old_w.AO_val1 = 3316;
+ old_w.AO_val2 = 2921;
+# endif
+# if defined(AO_HAVE_double_load_release_write)
+ new_w = AO_double_load_release_write(&old_w);
+ TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921);
+# elif !defined(AO_HAVE_double_load) \
+ || !defined(AO_HAVE_double_load_acquire) \
+ || !defined(AO_HAVE_double_load_acquire_read) \
+ || !defined(AO_HAVE_double_load_dd_acquire_read) \
+ || !defined(AO_HAVE_double_load_full) \
+ || !defined(AO_HAVE_double_load_read)
+ MISSING(AO_double_load);
+# endif
+# if defined(AO_HAVE_double_store_release_write)
+ new_w.AO_val1 = 1375;
+ new_w.AO_val2 = 8243;
+ AO_double_store_release_write(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ AO_double_store_release_write(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ new_w.AO_val1 ^= old_w.AO_val1;
+ new_w.AO_val2 ^= old_w.AO_val2;
+ AO_double_store_release_write(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0);
+# elif !defined(AO_HAVE_double_store) \
+ || !defined(AO_HAVE_double_store_full) \
+ || !defined(AO_HAVE_double_store_release) \
+ || !defined(AO_HAVE_double_store_release_write) \
+ || !defined(AO_HAVE_double_store_write)
+ MISSING(AO_double_store);
+# endif
+# if defined(AO_HAVE_compare_double_and_swap_double_release_write)
+ TA_assert(!AO_compare_double_and_swap_double_release_write(&w, 17, 42, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_double_release_write(&w, 0, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_release_write(&w, 12, 14, 64, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_release_write(&w, 11, 13, 85, 82));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_release_write(&w, 13, 12, 17, 42));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_double_and_swap_double_release_write(&w, 12, 13, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_double_and_swap_double_release_write(&w, 17, 42, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_double_and_swap_double);
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_release_write)
+ TA_assert(!AO_compare_and_swap_double_release_write(&w, 17, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_and_swap_double_release_write(&w, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_release_write(&w, 13, 12, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_release_write(&w, 1213, 48, 86));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_and_swap_double_release_write(&w, 12, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_and_swap_double_release_write(&w, 17, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_and_swap_double);
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_release_write)
+ old_w.AO_val1 = 4116;
+ old_w.AO_val2 = 2121;
+ new_w.AO_val1 = 8537;
+ new_w.AO_val2 = 6410;
+ TA_assert(!AO_double_compare_and_swap_release_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_double_compare_and_swap_release_write(&w, w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = 29;
+ new_w.AO_val1 = 820;
+ new_w.AO_val2 = 5917;
+ TA_assert(!AO_double_compare_and_swap_release_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = 11;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 3552;
+ new_w.AO_val2 = 1746;
+ TA_assert(!AO_double_compare_and_swap_release_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 8537;
+ new_w.AO_val1 = 4116;
+ new_w.AO_val2 = 2121;
+ TA_assert(!AO_double_compare_and_swap_release_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 1;
+ TA_assert(AO_double_compare_and_swap_release_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = w.AO_val2;
+ new_w.AO_val1--;
+ new_w.AO_val2 = 0;
+ TA_assert(AO_double_compare_and_swap_release_write(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_double_compare_and_swap);
+# endif
+}
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Some basic sanity tests. These do not test the barrier semantics. */
+
+#undef TA_assert
+#define TA_assert(e) \
+ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _acquire_read)\n", \
+ __FILE__, __LINE__), exit(1); }
+
+#undef MISSING
+#define MISSING(name) \
+ printf("Missing: %s\n", #name "_acquire_read")
+
+#if defined(CPPCHECK)
+ void list_atomic_acquire_read(void);
+ void char_list_atomic_acquire_read(void);
+ void short_list_atomic_acquire_read(void);
+ void int_list_atomic_acquire_read(void);
+ void double_list_atomic_acquire_read(void);
+#endif
+
+void test_atomic_acquire_read(void)
+{
+ AO_t x;
+ unsigned char b;
+ unsigned short s;
+ unsigned int zz;
+# if defined(AO_HAVE_test_and_set_acquire_read)
+ AO_TS_t z = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_acquire_read) \
+ || defined(AO_HAVE_double_load_acquire_read) \
+ || defined(AO_HAVE_double_store_acquire_read)
+ static AO_double_t old_w; /* static to avoid misalignment */
+ AO_double_t new_w;
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_acquire_read) \
+ || defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \
+ || defined(AO_HAVE_double_compare_and_swap_acquire_read)
+ static AO_double_t w; /* static to avoid misalignment */
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+# endif
+
+# if defined(CPPCHECK)
+ list_atomic_acquire_read();
+ char_list_atomic_acquire_read();
+ short_list_atomic_acquire_read();
+ int_list_atomic_acquire_read();
+ double_list_atomic_acquire_read();
+# endif
+# if defined(AO_HAVE_nop_acquire_read)
+ AO_nop_acquire_read();
+# elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \
+ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write)
+ MISSING(AO_nop);
+# endif
+# if defined(AO_HAVE_store_acquire_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */
+# endif
+ AO_store_acquire_read(&x, 13);
+ TA_assert(x == 13);
+# else
+# if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \
+ || !defined(AO_HAVE_store_release) \
+ || !defined(AO_HAVE_store_release_write) \
+ || !defined(AO_HAVE_store_write)
+ MISSING(AO_store);
+# endif
+ x = 13;
+# endif
+# if defined(AO_HAVE_load_acquire_read)
+ TA_assert(AO_load_acquire_read(&x) == 13);
+# elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \
+ || !defined(AO_HAVE_load_acquire_read) \
+ || !defined(AO_HAVE_load_dd_acquire_read) \
+ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read)
+ MISSING(AO_load);
+# endif
+# if defined(AO_HAVE_test_and_set_acquire_read)
+ TA_assert(AO_test_and_set_acquire_read(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_set_acquire_read(&z) == AO_TS_SET);
+ TA_assert(AO_test_and_set_acquire_read(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# else
+ MISSING(AO_test_and_set);
+# endif
+# if defined(AO_HAVE_fetch_and_add_acquire_read)
+ TA_assert(AO_fetch_and_add_acquire_read(&x, 42) == 13);
+ TA_assert(AO_fetch_and_add_acquire_read(&x, (AO_t)(-42)) == 55);
+# else
+ MISSING(AO_fetch_and_add);
+# endif
+# if defined(AO_HAVE_fetch_and_add1_acquire_read)
+ TA_assert(AO_fetch_and_add1_acquire_read(&x) == 13);
+# else
+ MISSING(AO_fetch_and_add1);
+ ++x;
+# endif
+# if defined(AO_HAVE_fetch_and_sub1_acquire_read)
+ TA_assert(AO_fetch_and_sub1_acquire_read(&x) == 14);
+# else
+ MISSING(AO_fetch_and_sub1);
+ --x;
+# endif
+# if defined(AO_HAVE_short_store_acquire_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile short *)&s = 0;
+# endif
+ AO_short_store_acquire_read(&s, 13);
+# else
+# if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \
+ || !defined(AO_HAVE_short_store_release) \
+ || !defined(AO_HAVE_short_store_release_write) \
+ || !defined(AO_HAVE_short_store_write)
+ MISSING(AO_short_store);
+# endif
+ s = 13;
+# endif
+# if defined(AO_HAVE_short_load_acquire_read)
+ TA_assert(AO_short_load(&s) == 13);
+# elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \
+ || !defined(AO_HAVE_short_load_acquire_read) \
+ || !defined(AO_HAVE_short_load_dd_acquire_read) \
+ || !defined(AO_HAVE_short_load_full) \
+ || !defined(AO_HAVE_short_load_read)
+ MISSING(AO_short_load);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add_acquire_read)
+ TA_assert(AO_short_fetch_and_add_acquire_read(&s, 42) == 13);
+ TA_assert(AO_short_fetch_and_add_acquire_read(&s, (unsigned short)-42) == 55);
+# else
+ MISSING(AO_short_fetch_and_add);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add1_acquire_read)
+ TA_assert(AO_short_fetch_and_add1_acquire_read(&s) == 13);
+# else
+ MISSING(AO_short_fetch_and_add1);
+ ++s;
+# endif
+# if defined(AO_HAVE_short_fetch_and_sub1_acquire_read)
+ TA_assert(AO_short_fetch_and_sub1_acquire_read(&s) == 14);
+# else
+ MISSING(AO_short_fetch_and_sub1);
+ --s;
+# endif
+ TA_assert(*(volatile short *)&s == 13);
+# if defined(AO_HAVE_char_store_acquire_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile char *)&b = 0;
+# endif
+ AO_char_store_acquire_read(&b, 13);
+# else
+# if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \
+ || !defined(AO_HAVE_char_store_release) \
+ || !defined(AO_HAVE_char_store_release_write) \
+ || !defined(AO_HAVE_char_store_write)
+ MISSING(AO_char_store);
+# endif
+ b = 13;
+# endif
+# if defined(AO_HAVE_char_load_acquire_read)
+ TA_assert(AO_char_load(&b) == 13);
+# elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \
+ || !defined(AO_HAVE_char_load_acquire_read) \
+ || !defined(AO_HAVE_char_load_dd_acquire_read) \
+ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read)
+ MISSING(AO_char_load);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add_acquire_read)
+ TA_assert(AO_char_fetch_and_add_acquire_read(&b, 42) == 13);
+ TA_assert(AO_char_fetch_and_add_acquire_read(&b, (unsigned char)-42) == 55);
+# else
+ MISSING(AO_char_fetch_and_add);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add1_acquire_read)
+ TA_assert(AO_char_fetch_and_add1_acquire_read(&b) == 13);
+# else
+ MISSING(AO_char_fetch_and_add1);
+ ++b;
+# endif
+# if defined(AO_HAVE_char_fetch_and_sub1_acquire_read)
+ TA_assert(AO_char_fetch_and_sub1_acquire_read(&b) == 14);
+# else
+ MISSING(AO_char_fetch_and_sub1);
+ --b;
+# endif
+ TA_assert(*(volatile char *)&b == 13);
+# if defined(AO_HAVE_int_store_acquire_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile int *)&zz = 0;
+# endif
+ AO_int_store_acquire_read(&zz, 13);
+# else
+# if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \
+ || !defined(AO_HAVE_int_store_release) \
+ || !defined(AO_HAVE_int_store_release_write) \
+ || !defined(AO_HAVE_int_store_write)
+ MISSING(AO_int_store);
+# endif
+ zz = 13;
+# endif
+# if defined(AO_HAVE_int_load_acquire_read)
+ TA_assert(AO_int_load(&zz) == 13);
+# elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \
+ || !defined(AO_HAVE_int_load_acquire_read) \
+ || !defined(AO_HAVE_int_load_dd_acquire_read) \
+ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read)
+ MISSING(AO_int_load);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add_acquire_read)
+ TA_assert(AO_int_fetch_and_add_acquire_read(&zz, 42) == 13);
+ TA_assert(AO_int_fetch_and_add_acquire_read(&zz, (unsigned int)-42) == 55);
+# else
+ MISSING(AO_int_fetch_and_add);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add1_acquire_read)
+ TA_assert(AO_int_fetch_and_add1_acquire_read(&zz) == 13);
+# else
+ MISSING(AO_int_fetch_and_add1);
+ ++zz;
+# endif
+# if defined(AO_HAVE_int_fetch_and_sub1_acquire_read)
+ TA_assert(AO_int_fetch_and_sub1_acquire_read(&zz) == 14);
+# else
+ MISSING(AO_int_fetch_and_sub1);
+ --zz;
+# endif
+ TA_assert(*(volatile int *)&zz == 13);
+# if defined(AO_HAVE_compare_and_swap_acquire_read)
+ TA_assert(!AO_compare_and_swap_acquire_read(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swap_acquire_read(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ MISSING(AO_compare_and_swap);
+ if (*(volatile AO_t *)&x == 13) x = 42;
+# endif
+# if defined(AO_HAVE_or_acquire_read)
+ AO_or_acquire_read(&x, 66);
+ TA_assert(x == 106);
+# else
+# if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \
+ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \
+ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \
+ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write)
+ MISSING(AO_or);
+# endif
+ x |= 66;
+# endif
+# if defined(AO_HAVE_xor_acquire_read)
+ AO_xor_acquire_read(&x, 181);
+ TA_assert(x == 223);
+# else
+# if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \
+ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \
+ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \
+ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write)
+ MISSING(AO_xor);
+# endif
+ x ^= 181;
+# endif
+# if defined(AO_HAVE_and_acquire_read)
+ AO_and_acquire_read(&x, 57);
+ TA_assert(x == 25);
+# else
+# if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \
+ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \
+ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \
+ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write)
+ MISSING(AO_and);
+# endif
+ x &= 57;
+# endif
+# if defined(AO_HAVE_fetch_compare_and_swap_acquire_read)
+ TA_assert(AO_fetch_compare_and_swap_acquire_read(&x, 14, 117) == 25);
+ TA_assert(x == 25);
+ TA_assert(AO_fetch_compare_and_swap_acquire_read(&x, 25, 117) == 25);
+# else
+ MISSING(AO_fetch_compare_and_swap);
+ if (x == 25) x = 117;
+# endif
+ TA_assert(x == 117);
+# if defined(AO_HAVE_short_compare_and_swap_acquire_read)
+ TA_assert(!AO_short_compare_and_swap_acquire_read(&s, 14, 42));
+ TA_assert(s == 13);
+ TA_assert(AO_short_compare_and_swap_acquire_read(&s, 13, 42));
+ TA_assert(s == 42);
+# else
+ MISSING(AO_short_compare_and_swap);
+ if (*(volatile short *)&s == 13) s = 42;
+# endif
+# if defined(AO_HAVE_short_or_acquire_read)
+ AO_short_or_acquire_read(&s, 66);
+ TA_assert(s == 106);
+# else
+# if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \
+ || !defined(AO_HAVE_short_or_acquire_read) \
+ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \
+ || !defined(AO_HAVE_short_or_release) \
+ || !defined(AO_HAVE_short_or_release_write) \
+ || !defined(AO_HAVE_short_or_write)
+ MISSING(AO_short_or);
+# endif
+ s |= 66;
+# endif
+# if defined(AO_HAVE_short_xor_acquire_read)
+ AO_short_xor_acquire_read(&s, 181);
+ TA_assert(s == 223);
+# else
+# if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \
+ || !defined(AO_HAVE_short_xor_acquire_read) \
+ || !defined(AO_HAVE_short_xor_full) \
+ || !defined(AO_HAVE_short_xor_read) \
+ || !defined(AO_HAVE_short_xor_release) \
+ || !defined(AO_HAVE_short_xor_release_write) \
+ || !defined(AO_HAVE_short_xor_write)
+ MISSING(AO_short_xor);
+# endif
+ s ^= 181;
+# endif
+# if defined(AO_HAVE_short_and_acquire_read)
+ AO_short_and_acquire_read(&s, 57);
+ TA_assert(s == 25);
+# else
+# if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \
+ || !defined(AO_HAVE_short_and_acquire_read) \
+ || !defined(AO_HAVE_short_and_full) \
+ || !defined(AO_HAVE_short_and_read) \
+ || !defined(AO_HAVE_short_and_release) \
+ || !defined(AO_HAVE_short_and_release_write) \
+ || !defined(AO_HAVE_short_and_write)
+ MISSING(AO_short_and);
+# endif
+ s &= 57;
+# endif
+# if defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read)
+ TA_assert(AO_short_fetch_compare_and_swap_acquire_read(&s, 14, 117) == 25);
+ TA_assert(s == 25);
+ TA_assert(AO_short_fetch_compare_and_swap_acquire_read(&s, 25, 117) == 25);
+# else
+ MISSING(AO_short_fetch_compare_and_swap);
+ if (s == 25) s = 117;
+# endif
+ TA_assert(s == 117);
+# if defined(AO_HAVE_char_compare_and_swap_acquire_read)
+ TA_assert(!AO_char_compare_and_swap_acquire_read(&b, 14, 42));
+ TA_assert(b == 13);
+ TA_assert(AO_char_compare_and_swap_acquire_read(&b, 13, 42));
+ TA_assert(b == 42);
+# else
+ MISSING(AO_char_compare_and_swap);
+ if (*(volatile char *)&b == 13) b = 42;
+# endif
+# if defined(AO_HAVE_char_or_acquire_read)
+ AO_char_or_acquire_read(&b, 66);
+ TA_assert(b == 106);
+# else
+# if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \
+ || !defined(AO_HAVE_char_or_acquire_read) \
+ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \
+ || !defined(AO_HAVE_char_or_release) \
+ || !defined(AO_HAVE_char_or_release_write) \
+ || !defined(AO_HAVE_char_or_write)
+ MISSING(AO_char_or);
+# endif
+ b |= 66;
+# endif
+# if defined(AO_HAVE_char_xor_acquire_read)
+ AO_char_xor_acquire_read(&b, 181);
+ TA_assert(b == 223);
+# else
+# if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \
+ || !defined(AO_HAVE_char_xor_acquire_read) \
+ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \
+ || !defined(AO_HAVE_char_xor_release) \
+ || !defined(AO_HAVE_char_xor_release_write) \
+ || !defined(AO_HAVE_char_xor_write)
+ MISSING(AO_char_xor);
+# endif
+ b ^= 181;
+# endif
+# if defined(AO_HAVE_char_and_acquire_read)
+ AO_char_and_acquire_read(&b, 57);
+ TA_assert(b == 25);
+# else
+# if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \
+ || !defined(AO_HAVE_char_and_acquire_read) \
+ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \
+ || !defined(AO_HAVE_char_and_release) \
+ || !defined(AO_HAVE_char_and_release_write) \
+ || !defined(AO_HAVE_char_and_write)
+ MISSING(AO_char_and);
+# endif
+ b &= 57;
+# endif
+# if defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read)
+ TA_assert(AO_char_fetch_compare_and_swap_acquire_read(&b, 14, 117) == 25);
+ TA_assert(b == 25);
+ TA_assert(AO_char_fetch_compare_and_swap_acquire_read(&b, 25, 117) == 25);
+# else
+ MISSING(AO_char_fetch_compare_and_swap);
+ if (b == 25) b = 117;
+# endif
+ TA_assert(b == 117);
+# if defined(AO_HAVE_int_compare_and_swap_acquire_read)
+ TA_assert(!AO_int_compare_and_swap_acquire_read(&zz, 14, 42));
+ TA_assert(zz == 13);
+ TA_assert(AO_int_compare_and_swap_acquire_read(&zz, 13, 42));
+ TA_assert(zz == 42);
+# else
+ MISSING(AO_int_compare_and_swap);
+ if (*(volatile int *)&zz == 13) zz = 42;
+# endif
+# if defined(AO_HAVE_int_or_acquire_read)
+ AO_int_or_acquire_read(&zz, 66);
+ TA_assert(zz == 106);
+# else
+# if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \
+ || !defined(AO_HAVE_int_or_acquire_read) \
+ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \
+ || !defined(AO_HAVE_int_or_release) \
+ || !defined(AO_HAVE_int_or_release_write) \
+ || !defined(AO_HAVE_int_or_write)
+ MISSING(AO_int_or);
+# endif
+ zz |= 66;
+# endif
+# if defined(AO_HAVE_int_xor_acquire_read)
+ AO_int_xor_acquire_read(&zz, 181);
+ TA_assert(zz == 223);
+# else
+# if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \
+ || !defined(AO_HAVE_int_xor_acquire_read) \
+ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \
+ || !defined(AO_HAVE_int_xor_release) \
+ || !defined(AO_HAVE_int_xor_release_write) \
+ || !defined(AO_HAVE_int_xor_write)
+ MISSING(AO_int_xor);
+# endif
+ zz ^= 181;
+# endif
+# if defined(AO_HAVE_int_and_acquire_read)
+ AO_int_and_acquire_read(&zz, 57);
+ TA_assert(zz == 25);
+# else
+# if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \
+ || !defined(AO_HAVE_int_and_acquire_read) \
+ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \
+ || !defined(AO_HAVE_int_and_release) \
+ || !defined(AO_HAVE_int_and_release_write) \
+ || !defined(AO_HAVE_int_and_write)
+ MISSING(AO_int_and);
+# endif
+ zz &= 57;
+# endif
+# if defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read)
+ TA_assert(AO_int_fetch_compare_and_swap_acquire_read(&zz, 14, 117) == 25);
+ TA_assert(zz == 25);
+ TA_assert(AO_int_fetch_compare_and_swap_acquire_read(&zz, 25, 117) == 25);
+# else
+ MISSING(AO_int_fetch_compare_and_swap);
+ if (zz == 25) zz = 117;
+# endif
+ TA_assert(zz == 117);
+# if defined(AO_HAVE_double_load_acquire_read) || defined(AO_HAVE_double_store_acquire_read)
+ /* Initialize old_w even for store to workaround MSan warning. */
+ old_w.AO_val1 = 3316;
+ old_w.AO_val2 = 2921;
+# endif
+# if defined(AO_HAVE_double_load_acquire_read)
+ new_w = AO_double_load_acquire_read(&old_w);
+ TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921);
+# elif !defined(AO_HAVE_double_load) \
+ || !defined(AO_HAVE_double_load_acquire) \
+ || !defined(AO_HAVE_double_load_acquire_read) \
+ || !defined(AO_HAVE_double_load_dd_acquire_read) \
+ || !defined(AO_HAVE_double_load_full) \
+ || !defined(AO_HAVE_double_load_read)
+ MISSING(AO_double_load);
+# endif
+# if defined(AO_HAVE_double_store_acquire_read)
+ new_w.AO_val1 = 1375;
+ new_w.AO_val2 = 8243;
+ AO_double_store_acquire_read(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ AO_double_store_acquire_read(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ new_w.AO_val1 ^= old_w.AO_val1;
+ new_w.AO_val2 ^= old_w.AO_val2;
+ AO_double_store_acquire_read(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0);
+# elif !defined(AO_HAVE_double_store) \
+ || !defined(AO_HAVE_double_store_full) \
+ || !defined(AO_HAVE_double_store_release) \
+ || !defined(AO_HAVE_double_store_release_write) \
+ || !defined(AO_HAVE_double_store_write)
+ MISSING(AO_double_store);
+# endif
+# if defined(AO_HAVE_compare_double_and_swap_double_acquire_read)
+ TA_assert(!AO_compare_double_and_swap_double_acquire_read(&w, 17, 42, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_double_acquire_read(&w, 0, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_acquire_read(&w, 12, 14, 64, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_acquire_read(&w, 11, 13, 85, 82));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_acquire_read(&w, 13, 12, 17, 42));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_double_and_swap_double_acquire_read(&w, 12, 13, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_double_and_swap_double_acquire_read(&w, 17, 42, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_double_and_swap_double);
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_acquire_read)
+ TA_assert(!AO_compare_and_swap_double_acquire_read(&w, 17, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_and_swap_double_acquire_read(&w, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_acquire_read(&w, 13, 12, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_acquire_read(&w, 1213, 48, 86));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_and_swap_double_acquire_read(&w, 12, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_and_swap_double_acquire_read(&w, 17, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_and_swap_double);
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_acquire_read)
+ old_w.AO_val1 = 4116;
+ old_w.AO_val2 = 2121;
+ new_w.AO_val1 = 8537;
+ new_w.AO_val2 = 6410;
+ TA_assert(!AO_double_compare_and_swap_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_double_compare_and_swap_acquire_read(&w, w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = 29;
+ new_w.AO_val1 = 820;
+ new_w.AO_val2 = 5917;
+ TA_assert(!AO_double_compare_and_swap_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = 11;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 3552;
+ new_w.AO_val2 = 1746;
+ TA_assert(!AO_double_compare_and_swap_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 8537;
+ new_w.AO_val1 = 4116;
+ new_w.AO_val2 = 2121;
+ TA_assert(!AO_double_compare_and_swap_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 1;
+ TA_assert(AO_double_compare_and_swap_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = w.AO_val2;
+ new_w.AO_val1--;
+ new_w.AO_val2 = 0;
+ TA_assert(AO_double_compare_and_swap_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_double_compare_and_swap);
+# endif
+}
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Some basic sanity tests. These do not test the barrier semantics. */
+
+#undef TA_assert
+#define TA_assert(e) \
+ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: _dd_acquire_read)\n", \
+ __FILE__, __LINE__), exit(1); }
+
+#undef MISSING
+#define MISSING(name) \
+ printf("Missing: %s\n", #name "_dd_acquire_read")
+
+#if defined(CPPCHECK)
+ void list_atomic_dd_acquire_read(void);
+ void char_list_atomic_dd_acquire_read(void);
+ void short_list_atomic_dd_acquire_read(void);
+ void int_list_atomic_dd_acquire_read(void);
+ void double_list_atomic_dd_acquire_read(void);
+#endif
+
+void test_atomic_dd_acquire_read(void)
+{
+ AO_t x;
+ unsigned char b;
+ unsigned short s;
+ unsigned int zz;
+# if defined(AO_HAVE_test_and_set_dd_acquire_read)
+ AO_TS_t z = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_dd_acquire_read) \
+ || defined(AO_HAVE_double_load_dd_acquire_read) \
+ || defined(AO_HAVE_double_store_dd_acquire_read)
+ static AO_double_t old_w; /* static to avoid misalignment */
+ AO_double_t new_w;
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_dd_acquire_read) \
+ || defined(AO_HAVE_compare_double_and_swap_double_dd_acquire_read) \
+ || defined(AO_HAVE_double_compare_and_swap_dd_acquire_read)
+ static AO_double_t w; /* static to avoid misalignment */
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+# endif
+
+# if defined(CPPCHECK)
+ list_atomic_dd_acquire_read();
+ char_list_atomic_dd_acquire_read();
+ short_list_atomic_dd_acquire_read();
+ int_list_atomic_dd_acquire_read();
+ double_list_atomic_dd_acquire_read();
+# endif
+# if defined(AO_HAVE_nop_dd_acquire_read)
+ AO_nop_dd_acquire_read();
+# elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \
+ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write)
+ MISSING(AO_nop);
+# endif
+# if defined(AO_HAVE_store_dd_acquire_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */
+# endif
+ AO_store_dd_acquire_read(&x, 13);
+ TA_assert(x == 13);
+# else
+# if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \
+ || !defined(AO_HAVE_store_release) \
+ || !defined(AO_HAVE_store_release_write) \
+ || !defined(AO_HAVE_store_write)
+ MISSING(AO_store);
+# endif
+ x = 13;
+# endif
+# if defined(AO_HAVE_load_dd_acquire_read)
+ TA_assert(AO_load_dd_acquire_read(&x) == 13);
+# elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \
+ || !defined(AO_HAVE_load_acquire_read) \
+ || !defined(AO_HAVE_load_dd_acquire_read) \
+ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read)
+ MISSING(AO_load);
+# endif
+# if defined(AO_HAVE_test_and_set_dd_acquire_read)
+ TA_assert(AO_test_and_set_dd_acquire_read(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_set_dd_acquire_read(&z) == AO_TS_SET);
+ TA_assert(AO_test_and_set_dd_acquire_read(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# else
+ MISSING(AO_test_and_set);
+# endif
+# if defined(AO_HAVE_fetch_and_add_dd_acquire_read)
+ TA_assert(AO_fetch_and_add_dd_acquire_read(&x, 42) == 13);
+ TA_assert(AO_fetch_and_add_dd_acquire_read(&x, (AO_t)(-42)) == 55);
+# else
+ MISSING(AO_fetch_and_add);
+# endif
+# if defined(AO_HAVE_fetch_and_add1_dd_acquire_read)
+ TA_assert(AO_fetch_and_add1_dd_acquire_read(&x) == 13);
+# else
+ MISSING(AO_fetch_and_add1);
+ ++x;
+# endif
+# if defined(AO_HAVE_fetch_and_sub1_dd_acquire_read)
+ TA_assert(AO_fetch_and_sub1_dd_acquire_read(&x) == 14);
+# else
+ MISSING(AO_fetch_and_sub1);
+ --x;
+# endif
+# if defined(AO_HAVE_short_store_dd_acquire_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile short *)&s = 0;
+# endif
+ AO_short_store_dd_acquire_read(&s, 13);
+# else
+# if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \
+ || !defined(AO_HAVE_short_store_release) \
+ || !defined(AO_HAVE_short_store_release_write) \
+ || !defined(AO_HAVE_short_store_write)
+ MISSING(AO_short_store);
+# endif
+ s = 13;
+# endif
+# if defined(AO_HAVE_short_load_dd_acquire_read)
+ TA_assert(AO_short_load(&s) == 13);
+# elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \
+ || !defined(AO_HAVE_short_load_acquire_read) \
+ || !defined(AO_HAVE_short_load_dd_acquire_read) \
+ || !defined(AO_HAVE_short_load_full) \
+ || !defined(AO_HAVE_short_load_read)
+ MISSING(AO_short_load);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add_dd_acquire_read)
+ TA_assert(AO_short_fetch_and_add_dd_acquire_read(&s, 42) == 13);
+ TA_assert(AO_short_fetch_and_add_dd_acquire_read(&s, (unsigned short)-42) == 55);
+# else
+ MISSING(AO_short_fetch_and_add);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add1_dd_acquire_read)
+ TA_assert(AO_short_fetch_and_add1_dd_acquire_read(&s) == 13);
+# else
+ MISSING(AO_short_fetch_and_add1);
+ ++s;
+# endif
+# if defined(AO_HAVE_short_fetch_and_sub1_dd_acquire_read)
+ TA_assert(AO_short_fetch_and_sub1_dd_acquire_read(&s) == 14);
+# else
+ MISSING(AO_short_fetch_and_sub1);
+ --s;
+# endif
+ TA_assert(*(volatile short *)&s == 13);
+# if defined(AO_HAVE_char_store_dd_acquire_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile char *)&b = 0;
+# endif
+ AO_char_store_dd_acquire_read(&b, 13);
+# else
+# if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \
+ || !defined(AO_HAVE_char_store_release) \
+ || !defined(AO_HAVE_char_store_release_write) \
+ || !defined(AO_HAVE_char_store_write)
+ MISSING(AO_char_store);
+# endif
+ b = 13;
+# endif
+# if defined(AO_HAVE_char_load_dd_acquire_read)
+ TA_assert(AO_char_load(&b) == 13);
+# elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \
+ || !defined(AO_HAVE_char_load_acquire_read) \
+ || !defined(AO_HAVE_char_load_dd_acquire_read) \
+ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read)
+ MISSING(AO_char_load);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add_dd_acquire_read)
+ TA_assert(AO_char_fetch_and_add_dd_acquire_read(&b, 42) == 13);
+ TA_assert(AO_char_fetch_and_add_dd_acquire_read(&b, (unsigned char)-42) == 55);
+# else
+ MISSING(AO_char_fetch_and_add);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add1_dd_acquire_read)
+ TA_assert(AO_char_fetch_and_add1_dd_acquire_read(&b) == 13);
+# else
+ MISSING(AO_char_fetch_and_add1);
+ ++b;
+# endif
+# if defined(AO_HAVE_char_fetch_and_sub1_dd_acquire_read)
+ TA_assert(AO_char_fetch_and_sub1_dd_acquire_read(&b) == 14);
+# else
+ MISSING(AO_char_fetch_and_sub1);
+ --b;
+# endif
+ TA_assert(*(volatile char *)&b == 13);
+# if defined(AO_HAVE_int_store_dd_acquire_read)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile int *)&zz = 0;
+# endif
+ AO_int_store_dd_acquire_read(&zz, 13);
+# else
+# if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \
+ || !defined(AO_HAVE_int_store_release) \
+ || !defined(AO_HAVE_int_store_release_write) \
+ || !defined(AO_HAVE_int_store_write)
+ MISSING(AO_int_store);
+# endif
+ zz = 13;
+# endif
+# if defined(AO_HAVE_int_load_dd_acquire_read)
+ TA_assert(AO_int_load(&zz) == 13);
+# elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \
+ || !defined(AO_HAVE_int_load_acquire_read) \
+ || !defined(AO_HAVE_int_load_dd_acquire_read) \
+ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read)
+ MISSING(AO_int_load);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add_dd_acquire_read)
+ TA_assert(AO_int_fetch_and_add_dd_acquire_read(&zz, 42) == 13);
+ TA_assert(AO_int_fetch_and_add_dd_acquire_read(&zz, (unsigned int)-42) == 55);
+# else
+ MISSING(AO_int_fetch_and_add);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add1_dd_acquire_read)
+ TA_assert(AO_int_fetch_and_add1_dd_acquire_read(&zz) == 13);
+# else
+ MISSING(AO_int_fetch_and_add1);
+ ++zz;
+# endif
+# if defined(AO_HAVE_int_fetch_and_sub1_dd_acquire_read)
+ TA_assert(AO_int_fetch_and_sub1_dd_acquire_read(&zz) == 14);
+# else
+ MISSING(AO_int_fetch_and_sub1);
+ --zz;
+# endif
+ TA_assert(*(volatile int *)&zz == 13);
+# if defined(AO_HAVE_compare_and_swap_dd_acquire_read)
+ TA_assert(!AO_compare_and_swap_dd_acquire_read(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swap_dd_acquire_read(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ MISSING(AO_compare_and_swap);
+ if (*(volatile AO_t *)&x == 13) x = 42;
+# endif
+# if defined(AO_HAVE_or_dd_acquire_read)
+ AO_or_dd_acquire_read(&x, 66);
+ TA_assert(x == 106);
+# else
+# if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \
+ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \
+ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \
+ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write)
+ MISSING(AO_or);
+# endif
+ x |= 66;
+# endif
+# if defined(AO_HAVE_xor_dd_acquire_read)
+ AO_xor_dd_acquire_read(&x, 181);
+ TA_assert(x == 223);
+# else
+# if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \
+ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \
+ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \
+ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write)
+ MISSING(AO_xor);
+# endif
+ x ^= 181;
+# endif
+# if defined(AO_HAVE_and_dd_acquire_read)
+ AO_and_dd_acquire_read(&x, 57);
+ TA_assert(x == 25);
+# else
+# if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \
+ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \
+ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \
+ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write)
+ MISSING(AO_and);
+# endif
+ x &= 57;
+# endif
+# if defined(AO_HAVE_fetch_compare_and_swap_dd_acquire_read)
+ TA_assert(AO_fetch_compare_and_swap_dd_acquire_read(&x, 14, 117) == 25);
+ TA_assert(x == 25);
+ TA_assert(AO_fetch_compare_and_swap_dd_acquire_read(&x, 25, 117) == 25);
+# else
+ MISSING(AO_fetch_compare_and_swap);
+ if (x == 25) x = 117;
+# endif
+ TA_assert(x == 117);
+# if defined(AO_HAVE_short_compare_and_swap_dd_acquire_read)
+ TA_assert(!AO_short_compare_and_swap_dd_acquire_read(&s, 14, 42));
+ TA_assert(s == 13);
+ TA_assert(AO_short_compare_and_swap_dd_acquire_read(&s, 13, 42));
+ TA_assert(s == 42);
+# else
+ MISSING(AO_short_compare_and_swap);
+ if (*(volatile short *)&s == 13) s = 42;
+# endif
+# if defined(AO_HAVE_short_or_dd_acquire_read)
+ AO_short_or_dd_acquire_read(&s, 66);
+ TA_assert(s == 106);
+# else
+# if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \
+ || !defined(AO_HAVE_short_or_acquire_read) \
+ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \
+ || !defined(AO_HAVE_short_or_release) \
+ || !defined(AO_HAVE_short_or_release_write) \
+ || !defined(AO_HAVE_short_or_write)
+ MISSING(AO_short_or);
+# endif
+ s |= 66;
+# endif
+# if defined(AO_HAVE_short_xor_dd_acquire_read)
+ AO_short_xor_dd_acquire_read(&s, 181);
+ TA_assert(s == 223);
+# else
+# if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \
+ || !defined(AO_HAVE_short_xor_acquire_read) \
+ || !defined(AO_HAVE_short_xor_full) \
+ || !defined(AO_HAVE_short_xor_read) \
+ || !defined(AO_HAVE_short_xor_release) \
+ || !defined(AO_HAVE_short_xor_release_write) \
+ || !defined(AO_HAVE_short_xor_write)
+ MISSING(AO_short_xor);
+# endif
+ s ^= 181;
+# endif
+# if defined(AO_HAVE_short_and_dd_acquire_read)
+ AO_short_and_dd_acquire_read(&s, 57);
+ TA_assert(s == 25);
+# else
+# if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \
+ || !defined(AO_HAVE_short_and_acquire_read) \
+ || !defined(AO_HAVE_short_and_full) \
+ || !defined(AO_HAVE_short_and_read) \
+ || !defined(AO_HAVE_short_and_release) \
+ || !defined(AO_HAVE_short_and_release_write) \
+ || !defined(AO_HAVE_short_and_write)
+ MISSING(AO_short_and);
+# endif
+ s &= 57;
+# endif
+# if defined(AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read)
+ TA_assert(AO_short_fetch_compare_and_swap_dd_acquire_read(&s, 14, 117) == 25);
+ TA_assert(s == 25);
+ TA_assert(AO_short_fetch_compare_and_swap_dd_acquire_read(&s, 25, 117) == 25);
+# else
+ MISSING(AO_short_fetch_compare_and_swap);
+ if (s == 25) s = 117;
+# endif
+ TA_assert(s == 117);
+# if defined(AO_HAVE_char_compare_and_swap_dd_acquire_read)
+ TA_assert(!AO_char_compare_and_swap_dd_acquire_read(&b, 14, 42));
+ TA_assert(b == 13);
+ TA_assert(AO_char_compare_and_swap_dd_acquire_read(&b, 13, 42));
+ TA_assert(b == 42);
+# else
+ MISSING(AO_char_compare_and_swap);
+ if (*(volatile char *)&b == 13) b = 42;
+# endif
+# if defined(AO_HAVE_char_or_dd_acquire_read)
+ AO_char_or_dd_acquire_read(&b, 66);
+ TA_assert(b == 106);
+# else
+# if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \
+ || !defined(AO_HAVE_char_or_acquire_read) \
+ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \
+ || !defined(AO_HAVE_char_or_release) \
+ || !defined(AO_HAVE_char_or_release_write) \
+ || !defined(AO_HAVE_char_or_write)
+ MISSING(AO_char_or);
+# endif
+ b |= 66;
+# endif
+# if defined(AO_HAVE_char_xor_dd_acquire_read)
+ AO_char_xor_dd_acquire_read(&b, 181);
+ TA_assert(b == 223);
+# else
+# if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \
+ || !defined(AO_HAVE_char_xor_acquire_read) \
+ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \
+ || !defined(AO_HAVE_char_xor_release) \
+ || !defined(AO_HAVE_char_xor_release_write) \
+ || !defined(AO_HAVE_char_xor_write)
+ MISSING(AO_char_xor);
+# endif
+ b ^= 181;
+# endif
+# if defined(AO_HAVE_char_and_dd_acquire_read)
+ AO_char_and_dd_acquire_read(&b, 57);
+ TA_assert(b == 25);
+# else
+# if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \
+ || !defined(AO_HAVE_char_and_acquire_read) \
+ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \
+ || !defined(AO_HAVE_char_and_release) \
+ || !defined(AO_HAVE_char_and_release_write) \
+ || !defined(AO_HAVE_char_and_write)
+ MISSING(AO_char_and);
+# endif
+ b &= 57;
+# endif
+# if defined(AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read)
+ TA_assert(AO_char_fetch_compare_and_swap_dd_acquire_read(&b, 14, 117) == 25);
+ TA_assert(b == 25);
+ TA_assert(AO_char_fetch_compare_and_swap_dd_acquire_read(&b, 25, 117) == 25);
+# else
+ MISSING(AO_char_fetch_compare_and_swap);
+ if (b == 25) b = 117;
+# endif
+ TA_assert(b == 117);
+# if defined(AO_HAVE_int_compare_and_swap_dd_acquire_read)
+ TA_assert(!AO_int_compare_and_swap_dd_acquire_read(&zz, 14, 42));
+ TA_assert(zz == 13);
+ TA_assert(AO_int_compare_and_swap_dd_acquire_read(&zz, 13, 42));
+ TA_assert(zz == 42);
+# else
+ MISSING(AO_int_compare_and_swap);
+ if (*(volatile int *)&zz == 13) zz = 42;
+# endif
+# if defined(AO_HAVE_int_or_dd_acquire_read)
+ AO_int_or_dd_acquire_read(&zz, 66);
+ TA_assert(zz == 106);
+# else
+# if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \
+ || !defined(AO_HAVE_int_or_acquire_read) \
+ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \
+ || !defined(AO_HAVE_int_or_release) \
+ || !defined(AO_HAVE_int_or_release_write) \
+ || !defined(AO_HAVE_int_or_write)
+ MISSING(AO_int_or);
+# endif
+ zz |= 66;
+# endif
+# if defined(AO_HAVE_int_xor_dd_acquire_read)
+ AO_int_xor_dd_acquire_read(&zz, 181);
+ TA_assert(zz == 223);
+# else
+# if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \
+ || !defined(AO_HAVE_int_xor_acquire_read) \
+ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \
+ || !defined(AO_HAVE_int_xor_release) \
+ || !defined(AO_HAVE_int_xor_release_write) \
+ || !defined(AO_HAVE_int_xor_write)
+ MISSING(AO_int_xor);
+# endif
+ zz ^= 181;
+# endif
+# if defined(AO_HAVE_int_and_dd_acquire_read)
+ AO_int_and_dd_acquire_read(&zz, 57);
+ TA_assert(zz == 25);
+# else
+# if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \
+ || !defined(AO_HAVE_int_and_acquire_read) \
+ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \
+ || !defined(AO_HAVE_int_and_release) \
+ || !defined(AO_HAVE_int_and_release_write) \
+ || !defined(AO_HAVE_int_and_write)
+ MISSING(AO_int_and);
+# endif
+ zz &= 57;
+# endif
+# if defined(AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read)
+ TA_assert(AO_int_fetch_compare_and_swap_dd_acquire_read(&zz, 14, 117) == 25);
+ TA_assert(zz == 25);
+ TA_assert(AO_int_fetch_compare_and_swap_dd_acquire_read(&zz, 25, 117) == 25);
+# else
+ MISSING(AO_int_fetch_compare_and_swap);
+ if (zz == 25) zz = 117;
+# endif
+ TA_assert(zz == 117);
+# if defined(AO_HAVE_double_load_dd_acquire_read) || defined(AO_HAVE_double_store_dd_acquire_read)
+ /* Initialize old_w even for store to workaround MSan warning. */
+ old_w.AO_val1 = 3316;
+ old_w.AO_val2 = 2921;
+# endif
+# if defined(AO_HAVE_double_load_dd_acquire_read)
+ new_w = AO_double_load_dd_acquire_read(&old_w);
+ TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921);
+# elif !defined(AO_HAVE_double_load) \
+ || !defined(AO_HAVE_double_load_acquire) \
+ || !defined(AO_HAVE_double_load_acquire_read) \
+ || !defined(AO_HAVE_double_load_dd_acquire_read) \
+ || !defined(AO_HAVE_double_load_full) \
+ || !defined(AO_HAVE_double_load_read)
+ MISSING(AO_double_load);
+# endif
+# if defined(AO_HAVE_double_store_dd_acquire_read)
+ new_w.AO_val1 = 1375;
+ new_w.AO_val2 = 8243;
+ AO_double_store_dd_acquire_read(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ AO_double_store_dd_acquire_read(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ new_w.AO_val1 ^= old_w.AO_val1;
+ new_w.AO_val2 ^= old_w.AO_val2;
+ AO_double_store_dd_acquire_read(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0);
+# elif !defined(AO_HAVE_double_store) \
+ || !defined(AO_HAVE_double_store_full) \
+ || !defined(AO_HAVE_double_store_release) \
+ || !defined(AO_HAVE_double_store_release_write) \
+ || !defined(AO_HAVE_double_store_write)
+ MISSING(AO_double_store);
+# endif
+# if defined(AO_HAVE_compare_double_and_swap_double_dd_acquire_read)
+ TA_assert(!AO_compare_double_and_swap_double_dd_acquire_read(&w, 17, 42, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_double_dd_acquire_read(&w, 0, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_dd_acquire_read(&w, 12, 14, 64, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_dd_acquire_read(&w, 11, 13, 85, 82));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_double_dd_acquire_read(&w, 13, 12, 17, 42));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_double_and_swap_double_dd_acquire_read(&w, 12, 13, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_double_and_swap_double_dd_acquire_read(&w, 17, 42, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_double_and_swap_double);
+# endif
+# if defined(AO_HAVE_compare_and_swap_double_dd_acquire_read)
+ TA_assert(!AO_compare_and_swap_double_dd_acquire_read(&w, 17, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_and_swap_double_dd_acquire_read(&w, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_dd_acquire_read(&w, 13, 12, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_double_dd_acquire_read(&w, 1213, 48, 86));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_and_swap_double_dd_acquire_read(&w, 12, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_and_swap_double_dd_acquire_read(&w, 17, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_and_swap_double);
+# endif
+# if defined(AO_HAVE_double_compare_and_swap_dd_acquire_read)
+ old_w.AO_val1 = 4116;
+ old_w.AO_val2 = 2121;
+ new_w.AO_val1 = 8537;
+ new_w.AO_val2 = 6410;
+ TA_assert(!AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_double_compare_and_swap_dd_acquire_read(&w, w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = 29;
+ new_w.AO_val1 = 820;
+ new_w.AO_val2 = 5917;
+ TA_assert(!AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = 11;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 3552;
+ new_w.AO_val2 = 1746;
+ TA_assert(!AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 8537;
+ new_w.AO_val1 = 4116;
+ new_w.AO_val2 = 2121;
+ TA_assert(!AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 1;
+ TA_assert(AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = w.AO_val2;
+ new_w.AO_val1--;
+ new_w.AO_val2 = 0;
+ TA_assert(AO_double_compare_and_swap_dd_acquire_read(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_double_compare_and_swap);
+# endif
+}
diff --git a/graphics/asymptote/libatomic_ops/tests/test_atomic_include.template b/graphics/asymptote/libatomic_ops/tests/test_atomic_include.template
new file mode 100644
index 0000000000..fc2c470cad
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/tests/test_atomic_include.template
@@ -0,0 +1,596 @@
+/*
+ * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Some basic sanity tests. These do not test the barrier semantics. */
+
+#undef TA_assert
+#define TA_assert(e) \
+ if (!(e)) { fprintf(stderr, "Assertion failed %s:%d (barrier: XX)\n", \
+ __FILE__, __LINE__), exit(1); }
+
+#undef MISSING
+#define MISSING(name) \
+ printf("Missing: %s\n", #name "XX")
+
+#if defined(CPPCHECK)
+ void list_atomicXX(void);
+ void char_list_atomicXX(void);
+ void short_list_atomicXX(void);
+ void int_list_atomicXX(void);
+ void double_list_atomicXX(void);
+#endif
+
+void test_atomicXX(void)
+{
+ AO_t x;
+ unsigned char b;
+ unsigned short s;
+ unsigned int zz;
+# if defined(AO_HAVE_test_and_setXX)
+ AO_TS_t z = AO_TS_INITIALIZER;
+# endif
+# if defined(AO_HAVE_double_compare_and_swapXX) \
+ || defined(AO_HAVE_double_loadXX) \
+ || defined(AO_HAVE_double_storeXX)
+ static AO_double_t old_w; /* static to avoid misalignment */
+ AO_double_t new_w;
+# endif
+# if defined(AO_HAVE_compare_and_swap_doubleXX) \
+ || defined(AO_HAVE_compare_double_and_swap_doubleXX) \
+ || defined(AO_HAVE_double_compare_and_swapXX)
+ static AO_double_t w; /* static to avoid misalignment */
+ w.AO_val1 = 0;
+ w.AO_val2 = 0;
+# endif
+
+# if defined(CPPCHECK)
+ list_atomicXX();
+ char_list_atomicXX();
+ short_list_atomicXX();
+ int_list_atomicXX();
+ double_list_atomicXX();
+# endif
+# if defined(AO_HAVE_nopXX)
+ AO_nopXX();
+# elif !defined(AO_HAVE_nop) || !defined(AO_HAVE_nop_full) \
+ || !defined(AO_HAVE_nop_read) || !defined(AO_HAVE_nop_write)
+ MISSING(AO_nop);
+# endif
+# if defined(AO_HAVE_storeXX)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile AO_t *)&x = 0; /* initialize to avoid false warning */
+# endif
+ AO_storeXX(&x, 13);
+ TA_assert(x == 13);
+# else
+# if !defined(AO_HAVE_store) || !defined(AO_HAVE_store_full) \
+ || !defined(AO_HAVE_store_release) \
+ || !defined(AO_HAVE_store_release_write) \
+ || !defined(AO_HAVE_store_write)
+ MISSING(AO_store);
+# endif
+ x = 13;
+# endif
+# if defined(AO_HAVE_loadXX)
+ TA_assert(AO_loadXX(&x) == 13);
+# elif !defined(AO_HAVE_load) || !defined(AO_HAVE_load_acquire) \
+ || !defined(AO_HAVE_load_acquire_read) \
+ || !defined(AO_HAVE_load_dd_acquire_read) \
+ || !defined(AO_HAVE_load_full) || !defined(AO_HAVE_load_read)
+ MISSING(AO_load);
+# endif
+# if defined(AO_HAVE_test_and_setXX)
+ TA_assert(AO_test_and_setXX(&z) == AO_TS_CLEAR);
+ TA_assert(AO_test_and_setXX(&z) == AO_TS_SET);
+ TA_assert(AO_test_and_setXX(&z) == AO_TS_SET);
+ AO_CLEAR(&z);
+# else
+ MISSING(AO_test_and_set);
+# endif
+# if defined(AO_HAVE_fetch_and_addXX)
+ TA_assert(AO_fetch_and_addXX(&x, 42) == 13);
+ TA_assert(AO_fetch_and_addXX(&x, (AO_t)(-42)) == 55);
+# else
+ MISSING(AO_fetch_and_add);
+# endif
+# if defined(AO_HAVE_fetch_and_add1XX)
+ TA_assert(AO_fetch_and_add1XX(&x) == 13);
+# else
+ MISSING(AO_fetch_and_add1);
+ ++x;
+# endif
+# if defined(AO_HAVE_fetch_and_sub1XX)
+ TA_assert(AO_fetch_and_sub1XX(&x) == 14);
+# else
+ MISSING(AO_fetch_and_sub1);
+ --x;
+# endif
+# if defined(AO_HAVE_short_storeXX)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile short *)&s = 0;
+# endif
+ AO_short_storeXX(&s, 13);
+# else
+# if !defined(AO_HAVE_short_store) || !defined(AO_HAVE_short_store_full) \
+ || !defined(AO_HAVE_short_store_release) \
+ || !defined(AO_HAVE_short_store_release_write) \
+ || !defined(AO_HAVE_short_store_write)
+ MISSING(AO_short_store);
+# endif
+ s = 13;
+# endif
+# if defined(AO_HAVE_short_loadXX)
+ TA_assert(AO_short_load(&s) == 13);
+# elif !defined(AO_HAVE_short_load) || !defined(AO_HAVE_short_load_acquire) \
+ || !defined(AO_HAVE_short_load_acquire_read) \
+ || !defined(AO_HAVE_short_load_dd_acquire_read) \
+ || !defined(AO_HAVE_short_load_full) \
+ || !defined(AO_HAVE_short_load_read)
+ MISSING(AO_short_load);
+# endif
+# if defined(AO_HAVE_short_fetch_and_addXX)
+ TA_assert(AO_short_fetch_and_addXX(&s, 42) == 13);
+ TA_assert(AO_short_fetch_and_addXX(&s, (unsigned short)-42) == 55);
+# else
+ MISSING(AO_short_fetch_and_add);
+# endif
+# if defined(AO_HAVE_short_fetch_and_add1XX)
+ TA_assert(AO_short_fetch_and_add1XX(&s) == 13);
+# else
+ MISSING(AO_short_fetch_and_add1);
+ ++s;
+# endif
+# if defined(AO_HAVE_short_fetch_and_sub1XX)
+ TA_assert(AO_short_fetch_and_sub1XX(&s) == 14);
+# else
+ MISSING(AO_short_fetch_and_sub1);
+ --s;
+# endif
+ TA_assert(*(volatile short *)&s == 13);
+# if defined(AO_HAVE_char_storeXX)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile char *)&b = 0;
+# endif
+ AO_char_storeXX(&b, 13);
+# else
+# if !defined(AO_HAVE_char_store) || !defined(AO_HAVE_char_store_full) \
+ || !defined(AO_HAVE_char_store_release) \
+ || !defined(AO_HAVE_char_store_release_write) \
+ || !defined(AO_HAVE_char_store_write)
+ MISSING(AO_char_store);
+# endif
+ b = 13;
+# endif
+# if defined(AO_HAVE_char_loadXX)
+ TA_assert(AO_char_load(&b) == 13);
+# elif !defined(AO_HAVE_char_load) || !defined(AO_HAVE_char_load_acquire) \
+ || !defined(AO_HAVE_char_load_acquire_read) \
+ || !defined(AO_HAVE_char_load_dd_acquire_read) \
+ || !defined(AO_HAVE_char_load_full) || !defined(AO_HAVE_char_load_read)
+ MISSING(AO_char_load);
+# endif
+# if defined(AO_HAVE_char_fetch_and_addXX)
+ TA_assert(AO_char_fetch_and_addXX(&b, 42) == 13);
+ TA_assert(AO_char_fetch_and_addXX(&b, (unsigned char)-42) == 55);
+# else
+ MISSING(AO_char_fetch_and_add);
+# endif
+# if defined(AO_HAVE_char_fetch_and_add1XX)
+ TA_assert(AO_char_fetch_and_add1XX(&b) == 13);
+# else
+ MISSING(AO_char_fetch_and_add1);
+ ++b;
+# endif
+# if defined(AO_HAVE_char_fetch_and_sub1XX)
+ TA_assert(AO_char_fetch_and_sub1XX(&b) == 14);
+# else
+ MISSING(AO_char_fetch_and_sub1);
+ --b;
+# endif
+ TA_assert(*(volatile char *)&b == 13);
+# if defined(AO_HAVE_int_storeXX)
+# if (defined(AO_MEMORY_SANITIZER) || defined(LINT2)) \
+ && defined(AO_PREFER_GENERALIZED)
+ *(volatile int *)&zz = 0;
+# endif
+ AO_int_storeXX(&zz, 13);
+# else
+# if !defined(AO_HAVE_int_store) || !defined(AO_HAVE_int_store_full) \
+ || !defined(AO_HAVE_int_store_release) \
+ || !defined(AO_HAVE_int_store_release_write) \
+ || !defined(AO_HAVE_int_store_write)
+ MISSING(AO_int_store);
+# endif
+ zz = 13;
+# endif
+# if defined(AO_HAVE_int_loadXX)
+ TA_assert(AO_int_load(&zz) == 13);
+# elif !defined(AO_HAVE_int_load) || !defined(AO_HAVE_int_load_acquire) \
+ || !defined(AO_HAVE_int_load_acquire_read) \
+ || !defined(AO_HAVE_int_load_dd_acquire_read) \
+ || !defined(AO_HAVE_int_load_full) || !defined(AO_HAVE_int_load_read)
+ MISSING(AO_int_load);
+# endif
+# if defined(AO_HAVE_int_fetch_and_addXX)
+ TA_assert(AO_int_fetch_and_addXX(&zz, 42) == 13);
+ TA_assert(AO_int_fetch_and_addXX(&zz, (unsigned int)-42) == 55);
+# else
+ MISSING(AO_int_fetch_and_add);
+# endif
+# if defined(AO_HAVE_int_fetch_and_add1XX)
+ TA_assert(AO_int_fetch_and_add1XX(&zz) == 13);
+# else
+ MISSING(AO_int_fetch_and_add1);
+ ++zz;
+# endif
+# if defined(AO_HAVE_int_fetch_and_sub1XX)
+ TA_assert(AO_int_fetch_and_sub1XX(&zz) == 14);
+# else
+ MISSING(AO_int_fetch_and_sub1);
+ --zz;
+# endif
+ TA_assert(*(volatile int *)&zz == 13);
+# if defined(AO_HAVE_compare_and_swapXX)
+ TA_assert(!AO_compare_and_swapXX(&x, 14, 42));
+ TA_assert(x == 13);
+ TA_assert(AO_compare_and_swapXX(&x, 13, 42));
+ TA_assert(x == 42);
+# else
+ MISSING(AO_compare_and_swap);
+ if (*(volatile AO_t *)&x == 13) x = 42;
+# endif
+# if defined(AO_HAVE_orXX)
+ AO_orXX(&x, 66);
+ TA_assert(x == 106);
+# else
+# if !defined(AO_HAVE_or) || !defined(AO_HAVE_or_acquire) \
+ || !defined(AO_HAVE_or_acquire_read) || !defined(AO_HAVE_or_full) \
+ || !defined(AO_HAVE_or_read) || !defined(AO_HAVE_or_release) \
+ || !defined(AO_HAVE_or_release_write) || !defined(AO_HAVE_or_write)
+ MISSING(AO_or);
+# endif
+ x |= 66;
+# endif
+# if defined(AO_HAVE_xorXX)
+ AO_xorXX(&x, 181);
+ TA_assert(x == 223);
+# else
+# if !defined(AO_HAVE_xor) || !defined(AO_HAVE_xor_acquire) \
+ || !defined(AO_HAVE_xor_acquire_read) || !defined(AO_HAVE_xor_full) \
+ || !defined(AO_HAVE_xor_read) || !defined(AO_HAVE_xor_release) \
+ || !defined(AO_HAVE_xor_release_write) || !defined(AO_HAVE_xor_write)
+ MISSING(AO_xor);
+# endif
+ x ^= 181;
+# endif
+# if defined(AO_HAVE_andXX)
+ AO_andXX(&x, 57);
+ TA_assert(x == 25);
+# else
+# if !defined(AO_HAVE_and) || !defined(AO_HAVE_and_acquire) \
+ || !defined(AO_HAVE_and_acquire_read) || !defined(AO_HAVE_and_full) \
+ || !defined(AO_HAVE_and_read) || !defined(AO_HAVE_and_release) \
+ || !defined(AO_HAVE_and_release_write) || !defined(AO_HAVE_and_write)
+ MISSING(AO_and);
+# endif
+ x &= 57;
+# endif
+# if defined(AO_HAVE_fetch_compare_and_swapXX)
+ TA_assert(AO_fetch_compare_and_swapXX(&x, 14, 117) == 25);
+ TA_assert(x == 25);
+ TA_assert(AO_fetch_compare_and_swapXX(&x, 25, 117) == 25);
+# else
+ MISSING(AO_fetch_compare_and_swap);
+ if (x == 25) x = 117;
+# endif
+ TA_assert(x == 117);
+# if defined(AO_HAVE_short_compare_and_swapXX)
+ TA_assert(!AO_short_compare_and_swapXX(&s, 14, 42));
+ TA_assert(s == 13);
+ TA_assert(AO_short_compare_and_swapXX(&s, 13, 42));
+ TA_assert(s == 42);
+# else
+ MISSING(AO_short_compare_and_swap);
+ if (*(volatile short *)&s == 13) s = 42;
+# endif
+# if defined(AO_HAVE_short_orXX)
+ AO_short_orXX(&s, 66);
+ TA_assert(s == 106);
+# else
+# if !defined(AO_HAVE_short_or) || !defined(AO_HAVE_short_or_acquire) \
+ || !defined(AO_HAVE_short_or_acquire_read) \
+ || !defined(AO_HAVE_short_or_full) || !defined(AO_HAVE_short_or_read) \
+ || !defined(AO_HAVE_short_or_release) \
+ || !defined(AO_HAVE_short_or_release_write) \
+ || !defined(AO_HAVE_short_or_write)
+ MISSING(AO_short_or);
+# endif
+ s |= 66;
+# endif
+# if defined(AO_HAVE_short_xorXX)
+ AO_short_xorXX(&s, 181);
+ TA_assert(s == 223);
+# else
+# if !defined(AO_HAVE_short_xor) || !defined(AO_HAVE_short_xor_acquire) \
+ || !defined(AO_HAVE_short_xor_acquire_read) \
+ || !defined(AO_HAVE_short_xor_full) \
+ || !defined(AO_HAVE_short_xor_read) \
+ || !defined(AO_HAVE_short_xor_release) \
+ || !defined(AO_HAVE_short_xor_release_write) \
+ || !defined(AO_HAVE_short_xor_write)
+ MISSING(AO_short_xor);
+# endif
+ s ^= 181;
+# endif
+# if defined(AO_HAVE_short_andXX)
+ AO_short_andXX(&s, 57);
+ TA_assert(s == 25);
+# else
+# if !defined(AO_HAVE_short_and) || !defined(AO_HAVE_short_and_acquire) \
+ || !defined(AO_HAVE_short_and_acquire_read) \
+ || !defined(AO_HAVE_short_and_full) \
+ || !defined(AO_HAVE_short_and_read) \
+ || !defined(AO_HAVE_short_and_release) \
+ || !defined(AO_HAVE_short_and_release_write) \
+ || !defined(AO_HAVE_short_and_write)
+ MISSING(AO_short_and);
+# endif
+ s &= 57;
+# endif
+# if defined(AO_HAVE_short_fetch_compare_and_swapXX)
+ TA_assert(AO_short_fetch_compare_and_swapXX(&s, 14, 117) == 25);
+ TA_assert(s == 25);
+ TA_assert(AO_short_fetch_compare_and_swapXX(&s, 25, 117) == 25);
+# else
+ MISSING(AO_short_fetch_compare_and_swap);
+ if (s == 25) s = 117;
+# endif
+ TA_assert(s == 117);
+# if defined(AO_HAVE_char_compare_and_swapXX)
+ TA_assert(!AO_char_compare_and_swapXX(&b, 14, 42));
+ TA_assert(b == 13);
+ TA_assert(AO_char_compare_and_swapXX(&b, 13, 42));
+ TA_assert(b == 42);
+# else
+ MISSING(AO_char_compare_and_swap);
+ if (*(volatile char *)&b == 13) b = 42;
+# endif
+# if defined(AO_HAVE_char_orXX)
+ AO_char_orXX(&b, 66);
+ TA_assert(b == 106);
+# else
+# if !defined(AO_HAVE_char_or) || !defined(AO_HAVE_char_or_acquire) \
+ || !defined(AO_HAVE_char_or_acquire_read) \
+ || !defined(AO_HAVE_char_or_full) || !defined(AO_HAVE_char_or_read) \
+ || !defined(AO_HAVE_char_or_release) \
+ || !defined(AO_HAVE_char_or_release_write) \
+ || !defined(AO_HAVE_char_or_write)
+ MISSING(AO_char_or);
+# endif
+ b |= 66;
+# endif
+# if defined(AO_HAVE_char_xorXX)
+ AO_char_xorXX(&b, 181);
+ TA_assert(b == 223);
+# else
+# if !defined(AO_HAVE_char_xor) || !defined(AO_HAVE_char_xor_acquire) \
+ || !defined(AO_HAVE_char_xor_acquire_read) \
+ || !defined(AO_HAVE_char_xor_full) || !defined(AO_HAVE_char_xor_read) \
+ || !defined(AO_HAVE_char_xor_release) \
+ || !defined(AO_HAVE_char_xor_release_write) \
+ || !defined(AO_HAVE_char_xor_write)
+ MISSING(AO_char_xor);
+# endif
+ b ^= 181;
+# endif
+# if defined(AO_HAVE_char_andXX)
+ AO_char_andXX(&b, 57);
+ TA_assert(b == 25);
+# else
+# if !defined(AO_HAVE_char_and) || !defined(AO_HAVE_char_and_acquire) \
+ || !defined(AO_HAVE_char_and_acquire_read) \
+ || !defined(AO_HAVE_char_and_full) || !defined(AO_HAVE_char_and_read) \
+ || !defined(AO_HAVE_char_and_release) \
+ || !defined(AO_HAVE_char_and_release_write) \
+ || !defined(AO_HAVE_char_and_write)
+ MISSING(AO_char_and);
+# endif
+ b &= 57;
+# endif
+# if defined(AO_HAVE_char_fetch_compare_and_swapXX)
+ TA_assert(AO_char_fetch_compare_and_swapXX(&b, 14, 117) == 25);
+ TA_assert(b == 25);
+ TA_assert(AO_char_fetch_compare_and_swapXX(&b, 25, 117) == 25);
+# else
+ MISSING(AO_char_fetch_compare_and_swap);
+ if (b == 25) b = 117;
+# endif
+ TA_assert(b == 117);
+# if defined(AO_HAVE_int_compare_and_swapXX)
+ TA_assert(!AO_int_compare_and_swapXX(&zz, 14, 42));
+ TA_assert(zz == 13);
+ TA_assert(AO_int_compare_and_swapXX(&zz, 13, 42));
+ TA_assert(zz == 42);
+# else
+ MISSING(AO_int_compare_and_swap);
+ if (*(volatile int *)&zz == 13) zz = 42;
+# endif
+# if defined(AO_HAVE_int_orXX)
+ AO_int_orXX(&zz, 66);
+ TA_assert(zz == 106);
+# else
+# if !defined(AO_HAVE_int_or) || !defined(AO_HAVE_int_or_acquire) \
+ || !defined(AO_HAVE_int_or_acquire_read) \
+ || !defined(AO_HAVE_int_or_full) || !defined(AO_HAVE_int_or_read) \
+ || !defined(AO_HAVE_int_or_release) \
+ || !defined(AO_HAVE_int_or_release_write) \
+ || !defined(AO_HAVE_int_or_write)
+ MISSING(AO_int_or);
+# endif
+ zz |= 66;
+# endif
+# if defined(AO_HAVE_int_xorXX)
+ AO_int_xorXX(&zz, 181);
+ TA_assert(zz == 223);
+# else
+# if !defined(AO_HAVE_int_xor) || !defined(AO_HAVE_int_xor_acquire) \
+ || !defined(AO_HAVE_int_xor_acquire_read) \
+ || !defined(AO_HAVE_int_xor_full) || !defined(AO_HAVE_int_xor_read) \
+ || !defined(AO_HAVE_int_xor_release) \
+ || !defined(AO_HAVE_int_xor_release_write) \
+ || !defined(AO_HAVE_int_xor_write)
+ MISSING(AO_int_xor);
+# endif
+ zz ^= 181;
+# endif
+# if defined(AO_HAVE_int_andXX)
+ AO_int_andXX(&zz, 57);
+ TA_assert(zz == 25);
+# else
+# if !defined(AO_HAVE_int_and) || !defined(AO_HAVE_int_and_acquire) \
+ || !defined(AO_HAVE_int_and_acquire_read) \
+ || !defined(AO_HAVE_int_and_full) || !defined(AO_HAVE_int_and_read) \
+ || !defined(AO_HAVE_int_and_release) \
+ || !defined(AO_HAVE_int_and_release_write) \
+ || !defined(AO_HAVE_int_and_write)
+ MISSING(AO_int_and);
+# endif
+ zz &= 57;
+# endif
+# if defined(AO_HAVE_int_fetch_compare_and_swapXX)
+ TA_assert(AO_int_fetch_compare_and_swapXX(&zz, 14, 117) == 25);
+ TA_assert(zz == 25);
+ TA_assert(AO_int_fetch_compare_and_swapXX(&zz, 25, 117) == 25);
+# else
+ MISSING(AO_int_fetch_compare_and_swap);
+ if (zz == 25) zz = 117;
+# endif
+ TA_assert(zz == 117);
+# if defined(AO_HAVE_double_loadXX) || defined(AO_HAVE_double_storeXX)
+ /* Initialize old_w even for store to workaround MSan warning. */
+ old_w.AO_val1 = 3316;
+ old_w.AO_val2 = 2921;
+# endif
+# if defined(AO_HAVE_double_loadXX)
+ new_w = AO_double_loadXX(&old_w);
+ TA_assert(new_w.AO_val1 == 3316 && new_w.AO_val2 == 2921);
+# elif !defined(AO_HAVE_double_load) \
+ || !defined(AO_HAVE_double_load_acquire) \
+ || !defined(AO_HAVE_double_load_acquire_read) \
+ || !defined(AO_HAVE_double_load_dd_acquire_read) \
+ || !defined(AO_HAVE_double_load_full) \
+ || !defined(AO_HAVE_double_load_read)
+ MISSING(AO_double_load);
+# endif
+# if defined(AO_HAVE_double_storeXX)
+ new_w.AO_val1 = 1375;
+ new_w.AO_val2 = 8243;
+ AO_double_storeXX(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ AO_double_storeXX(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 1375 && old_w.AO_val2 == 8243);
+ new_w.AO_val1 ^= old_w.AO_val1;
+ new_w.AO_val2 ^= old_w.AO_val2;
+ AO_double_storeXX(&old_w, new_w);
+ TA_assert(old_w.AO_val1 == 0 && old_w.AO_val2 == 0);
+# elif !defined(AO_HAVE_double_store) \
+ || !defined(AO_HAVE_double_store_full) \
+ || !defined(AO_HAVE_double_store_release) \
+ || !defined(AO_HAVE_double_store_release_write) \
+ || !defined(AO_HAVE_double_store_write)
+ MISSING(AO_double_store);
+# endif
+# if defined(AO_HAVE_compare_double_and_swap_doubleXX)
+ TA_assert(!AO_compare_double_and_swap_doubleXX(&w, 17, 42, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_double_and_swap_doubleXX(&w, 0, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_doubleXX(&w, 12, 14, 64, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_doubleXX(&w, 11, 13, 85, 82));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_double_and_swap_doubleXX(&w, 13, 12, 17, 42));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_double_and_swap_doubleXX(&w, 12, 13, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_double_and_swap_doubleXX(&w, 17, 42, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_double_and_swap_double);
+# endif
+# if defined(AO_HAVE_compare_and_swap_doubleXX)
+ TA_assert(!AO_compare_and_swap_doubleXX(&w, 17, 12, 13));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_compare_and_swap_doubleXX(&w, 0, 12, 13));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_doubleXX(&w, 13, 12, 33));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(!AO_compare_and_swap_doubleXX(&w, 1213, 48, 86));
+ TA_assert(w.AO_val1 == 12 && w.AO_val2 == 13);
+ TA_assert(AO_compare_and_swap_doubleXX(&w, 12, 17, 42));
+ TA_assert(w.AO_val1 == 17 && w.AO_val2 == 42);
+ TA_assert(AO_compare_and_swap_doubleXX(&w, 17, 0, 0));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_compare_and_swap_double);
+# endif
+# if defined(AO_HAVE_double_compare_and_swapXX)
+ old_w.AO_val1 = 4116;
+ old_w.AO_val2 = 2121;
+ new_w.AO_val1 = 8537;
+ new_w.AO_val2 = 6410;
+ TA_assert(!AO_double_compare_and_swapXX(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+ TA_assert(AO_double_compare_and_swapXX(&w, w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = 29;
+ new_w.AO_val1 = 820;
+ new_w.AO_val2 = 5917;
+ TA_assert(!AO_double_compare_and_swapXX(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = 11;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 3552;
+ new_w.AO_val2 = 1746;
+ TA_assert(!AO_double_compare_and_swapXX(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 8537;
+ new_w.AO_val1 = 4116;
+ new_w.AO_val2 = 2121;
+ TA_assert(!AO_double_compare_and_swapXX(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 8537 && w.AO_val2 == 6410);
+ old_w.AO_val1 = old_w.AO_val2;
+ old_w.AO_val2 = 6410;
+ new_w.AO_val1 = 1;
+ TA_assert(AO_double_compare_and_swapXX(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 1 && w.AO_val2 == 2121);
+ old_w.AO_val1 = new_w.AO_val1;
+ old_w.AO_val2 = w.AO_val2;
+ new_w.AO_val1--;
+ new_w.AO_val2 = 0;
+ TA_assert(AO_double_compare_and_swapXX(&w, old_w, new_w));
+ TA_assert(w.AO_val1 == 0 && w.AO_val2 == 0);
+# else
+ MISSING(AO_double_compare_and_swap);
+# endif
+}
diff --git a/graphics/asymptote/libatomic_ops/tests/test_malloc.c b/graphics/asymptote/libatomic_ops/tests/test_malloc.c
new file mode 100644
index 0000000000..7a0b421f52
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/tests/test_malloc.c
@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 2005 Hewlett-Packard Development Company, L.P.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#if defined(HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+#ifdef DONT_USE_MMAP
+# undef HAVE_MMAP
+#endif
+
+#include "run_parallel.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "atomic_ops_malloc.h"
+
+#ifndef DEFAULT_NTHREADS
+# ifdef HAVE_MMAP
+# define DEFAULT_NTHREADS 16 /* must be <= MAX_NTHREADS */
+# else
+# define DEFAULT_NTHREADS 3
+# endif
+#endif
+
+#ifndef N_REVERSALS
+# ifdef AO_USE_PTHREAD_DEFS
+# define N_REVERSALS 4
+# else
+# define N_REVERSALS 1000 /* must be even */
+# endif
+#endif
+
+#ifndef LIST_LENGTH
+# ifdef HAVE_MMAP
+# define LIST_LENGTH 1000
+# else
+# define LIST_LENGTH 100
+# endif
+#endif
+
+#ifndef LARGE_OBJ_SIZE
+# ifdef HAVE_MMAP
+# define LARGE_OBJ_SIZE 200000
+# else
+# define LARGE_OBJ_SIZE 20000
+# endif
+#endif
+
+#ifdef USE_STANDARD_MALLOC
+# define AO_malloc(n) malloc(n)
+# define AO_free(p) free(p)
+# define AO_malloc_enable_mmap()
+#endif
+
+typedef struct list_node {
+ struct list_node *next;
+ int data;
+} ln;
+
+ln *cons(int d, ln *tail)
+{
+# ifdef AO_HAVE_fetch_and_add1
+ static volatile AO_t extra = 0;
+ size_t my_extra = (size_t)AO_fetch_and_add1(&extra) % 101;
+# else
+ static size_t extra = 0; /* data race in extra is OK */
+ size_t my_extra = (extra++) % 101;
+# endif
+ ln *result;
+ char *extras;
+ unsigned i;
+
+ result = (ln *)AO_malloc(sizeof(ln) + sizeof(int)*my_extra);
+ if (result == 0)
+ {
+ fprintf(stderr, "Out of memory\n");
+ /* Normal for more than about 10 threads without mmap? */
+ exit(2);
+ }
+
+ result -> data = d;
+ result -> next = tail;
+ extras = (char *)(result+1);
+ for (i = 0; i < my_extra; ++i)
+ extras[i*sizeof(int)] = 42;
+ return result;
+}
+
+#ifdef DEBUG_RUN_ONE_TEST
+void print_list(ln *l)
+{
+ ln *p;
+
+ for (p = l; p != 0; p = p -> next)
+ {
+ printf("%d, ", p -> data);
+ }
+ printf("\n");
+}
+#endif /* DEBUG_RUN_ONE_TEST */
+
+/* Check that l contains numbers from m to n inclusive in ascending order */
+void check_list(ln *l, int m, int n)
+{
+ ln *p;
+ int i;
+
+ for (p = l, i = m; p != 0 && i <= n; p = p -> next, ++i)
+ {
+ if (i != p -> data)
+ {
+ fprintf(stderr, "Found %d, expected %d\n", p -> data, i);
+ abort();
+ }
+ }
+ if (i <= n)
+ {
+ fprintf(stderr, "Number not found: %d\n", i);
+ abort();
+ }
+ if (p != 0)
+ {
+ fprintf(stderr, "Found unexpected number: %d\n", i);
+ abort();
+ }
+}
+
+/* Create a list of integers from m to n */
+ln *
+make_list(int m, int n)
+{
+ if (m > n) return 0;
+ return cons(m, make_list(m+1, n));
+}
+
+void free_list(ln *x)
+{
+ while (x != NULL) {
+ ln *next = x -> next;
+ AO_free(x);
+ x = next;
+ }
+}
+
+/* Reverse list x, and concatenate it to y, deallocating no longer needed */
+/* nodes in x. */
+ln *
+reverse(ln *x, ln *y)
+{
+ ln * result;
+
+ if (x == 0) return y;
+ result = reverse(x -> next, cons(x -> data, y));
+ AO_free(x);
+ return result;
+}
+
+int dummy_test(void) { return 1; }
+
+void * run_one_test(void * arg) {
+ ln * x = make_list(1, LIST_LENGTH);
+ int i;
+ char *p = (char *)AO_malloc(LARGE_OBJ_SIZE);
+ char *q;
+ char a = 'a' + ((int)((AO_PTRDIFF_T)arg) * 2) % ('z' - 'a' + 1);
+ char b = a + 1;
+
+ if (0 == p) {
+# ifdef HAVE_MMAP
+ fprintf(stderr, "AO_malloc(%d) failed\n", LARGE_OBJ_SIZE);
+ abort();
+# else
+ fprintf(stderr, "AO_malloc(%d) failed: This is normal without mmap\n",
+ LARGE_OBJ_SIZE);
+# endif
+ } else {
+ p[0] = p[LARGE_OBJ_SIZE/2] = p[LARGE_OBJ_SIZE-1] = a;
+ q = (char *)AO_malloc(LARGE_OBJ_SIZE);
+ if (q == 0)
+ {
+ fprintf(stderr, "Out of memory\n");
+ /* Normal for more than about 10 threads without mmap? */
+ exit(2);
+ }
+ q[0] = q[LARGE_OBJ_SIZE/2] = q[LARGE_OBJ_SIZE-1] = b;
+ if (p[0] != a || p[LARGE_OBJ_SIZE/2] != a || p[LARGE_OBJ_SIZE-1] != a) {
+ fprintf(stderr, "First large allocation smashed\n");
+ abort();
+ }
+ AO_free(p);
+ if (q[0] != b || q[LARGE_OBJ_SIZE/2] != b || q[LARGE_OBJ_SIZE-1] != b) {
+ fprintf(stderr, "Second large allocation smashed\n");
+ abort();
+ }
+ AO_free(q);
+ }
+# ifdef DEBUG_RUN_ONE_TEST
+ x = reverse(x, 0);
+ print_list(x);
+ x = reverse(x, 0);
+ print_list(x);
+# endif
+ for (i = 0; i < N_REVERSALS; ++i) {
+ x = reverse(x, 0);
+ }
+ check_list(x, 1, LIST_LENGTH);
+ free_list(x);
+ return NULL;
+}
+
+#ifndef LOG_MAX_SIZE
+# define LOG_MAX_SIZE 16
+#endif
+
+#define CHUNK_SIZE (1 << LOG_MAX_SIZE)
+
+int main(int argc, char **argv) {
+ int nthreads;
+
+ if (1 == argc) {
+ nthreads = DEFAULT_NTHREADS;
+ } else if (2 == argc) {
+ nthreads = atoi(argv[1]);
+ if (nthreads < 1 || nthreads > MAX_NTHREADS) {
+ fprintf(stderr, "Invalid # of threads argument\n");
+ exit(1);
+ }
+ } else {
+ fprintf(stderr, "Usage: %s [# of threads]\n", argv[0]);
+ exit(1);
+ }
+ printf("Performing %d reversals of %d element lists in %d threads\n",
+ N_REVERSALS, LIST_LENGTH, nthreads);
+ AO_malloc_enable_mmap();
+
+ /* Test various corner cases. */
+ AO_free(NULL);
+ AO_free(AO_malloc(0));
+# ifdef HAVE_MMAP
+ AO_free(AO_malloc(CHUNK_SIZE - (sizeof(AO_t)-1))); /* large alloc */
+# endif
+
+ run_parallel(nthreads, run_one_test, dummy_test, "AO_malloc/AO_free");
+ return 0;
+}
diff --git a/graphics/asymptote/libatomic_ops/tests/test_stack.c b/graphics/asymptote/libatomic_ops/tests/test_stack.c
new file mode 100644
index 0000000000..7231aeb640
--- /dev/null
+++ b/graphics/asymptote/libatomic_ops/tests/test_stack.c
@@ -0,0 +1,402 @@
+/*
+ * Copyright (c) 2005 Hewlett-Packard Development Company, L.P.
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#if defined(HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+#include <stdio.h>
+
+#if defined(__vxworks)
+
+ int main(void)
+ {
+ printf("test skipped\n");
+ return 0;
+ }
+
+#else
+
+#if ((defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)) \
+ || defined(_MSC_VER) || defined(_WIN32_WINCE)) \
+ && !defined(AO_USE_WIN32_PTHREADS)
+# define USE_WINTHREADS
+#endif
+
+#ifdef USE_WINTHREADS
+# include <windows.h>
+#else
+# include <pthread.h>
+#endif
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "atomic_ops_stack.h" /* includes atomic_ops.h as well */
+
+#if (defined(_WIN32_WCE) || defined(__MINGW32CE__)) && !defined(AO_HAVE_abort)
+# define abort() _exit(-1) /* there is no abort() in WinCE */
+#endif
+
+#ifndef MAX_NTHREADS
+# define MAX_NTHREADS 100
+#endif
+
+#ifndef DEFAULT_NTHREADS
+# define DEFAULT_NTHREADS 16 /* must be <= MAX_NTHREADS */
+#endif
+
+#ifdef NO_TIMES
+# define get_msecs() 0
+#elif (defined(USE_WINTHREADS) || defined(AO_USE_WIN32_PTHREADS)) \
+ && !defined(CPPCHECK)
+# include <sys/timeb.h>
+ unsigned long get_msecs(void)
+ {
+ struct timeb tb;
+
+ ftime(&tb);
+ return (unsigned long)tb.time * 1000 + tb.millitm;
+ }
+#else /* Unix */
+# include <time.h>
+# include <sys/time.h>
+ unsigned long get_msecs(void)
+ {
+ struct timeval tv;
+
+ gettimeofday(&tv, 0);
+ return (unsigned long)tv.tv_sec * 1000 + tv.tv_usec/1000;
+ }
+#endif /* !NO_TIMES */
+
+struct le {
+ AO_t next; /* must be the first field */
+ int data;
+};
+
+typedef union le_u {
+ AO_t next;
+ struct le e;
+} list_element;
+
+#if defined(CPPCHECK)
+ AO_stack_t the_list; /* to test AO_stack_init() */
+#else
+ AO_stack_t the_list = AO_STACK_INITIALIZER;
+#endif
+
+/* Add elements from 1 to n to the list (1 is pushed first). */
+/* This is called from a single thread only. */
+void add_elements(int n)
+{
+ list_element * le;
+ if (n == 0) return;
+ add_elements(n-1);
+ le = (list_element *)malloc(sizeof(list_element));
+ if (le == 0)
+ {
+ fprintf(stderr, "Out of memory\n");
+ exit(2);
+ }
+# if defined(CPPCHECK)
+ le->e.next = 0; /* mark field as used */
+# endif
+ le->e.data = n;
+ AO_stack_push(&the_list, &le->next);
+}
+
+#ifdef VERBOSE_STACK
+void print_list(void)
+{
+ AO_t *p;
+
+ for (p = AO_REAL_HEAD_PTR(the_list);
+ p != 0; p = AO_REAL_NEXT_PTR(*p))
+ printf("%d\n", ((list_element*)p)->e.data);
+}
+#endif /* VERBOSE_STACK */
+
+/* Check that the list contains only values from 1 to n, in any order, */
+/* w/o duplications. Executed when the list mutation is finished. */
+void check_list(int n)
+{
+ AO_t *p;
+ int i;
+ int err_cnt = 0;
+ char *marks = (char*)calloc(n + 1, 1);
+
+ if (0 == marks)
+ {
+ fprintf(stderr, "Out of memory (marks)\n");
+ exit(2);
+ }
+
+ for (p = AO_REAL_HEAD_PTR(the_list);
+ p != 0; p = AO_REAL_NEXT_PTR(*p))
+ {
+ i = ((list_element*)p)->e.data;
+ if (i > n || i <= 0)
+ {
+ fprintf(stderr, "Found erroneous list element %d\n", i);
+ err_cnt++;
+ }
+ else if (marks[i] != 0)
+ {
+ fprintf(stderr, "Found duplicate list element %d\n", i);
+ abort();
+ }
+ else marks[i] = 1;
+ }
+
+ for (i = 1; i <= n; ++i)
+ if (marks[i] != 1)
+ {
+ fprintf(stderr, "Missing list element %d\n", i);
+ err_cnt++;
+ }
+
+ free(marks);
+ if (err_cnt > 0) abort();
+}
+
+volatile AO_t ops_performed = 0;
+
+#ifndef LIMIT
+ /* Total number of push/pop ops in all threads per test. */
+# ifdef AO_USE_PTHREAD_DEFS
+# define LIMIT 20000
+# else
+# define LIMIT 1000000
+# endif
+#endif
+
+#ifdef AO_HAVE_fetch_and_add
+# define fetch_then_add(addr, val) AO_fetch_and_add(addr, val)
+#else
+ /* OK to perform it in two atomic steps, but really quite */
+ /* unacceptable for timing purposes. */
+ AO_INLINE AO_t fetch_then_add(volatile AO_t * addr, AO_t val)
+ {
+ AO_t result = AO_load(addr);
+ AO_store(addr, result + val);
+ return result;
+ }
+#endif
+
+#ifdef USE_WINTHREADS
+ DWORD WINAPI run_one_test(LPVOID arg)
+#else
+ void * run_one_test(void * arg)
+#endif
+{
+ AO_t *t[MAX_NTHREADS + 1];
+ unsigned index = (unsigned)(size_t)arg;
+ unsigned i;
+# ifdef VERBOSE_STACK
+ unsigned j = 0;
+
+ printf("starting thread %u\n", index);
+# endif
+ assert(index <= MAX_NTHREADS);
+ while (fetch_then_add(&ops_performed, index + 1) + index + 1 < LIMIT)
+ {
+ /* Pop index+1 elements (where index is the thread's one), then */
+ /* push them back (in the same order of operations). */
+ /* Note that this is done in parallel by many threads. */
+ for (i = 0; i <= index; ++i)
+ {
+ t[i] = AO_stack_pop(&the_list);
+ if (0 == t[i])
+ {
+ /* This should not happen as at most n*(n+1)/2 elements */
+ /* could be popped off at a time. */
+ fprintf(stderr, "Failed - nothing to pop\n");
+ abort();
+ }
+ }
+ for (i = 0; i <= index; ++i)
+ {
+ AO_stack_push(&the_list, t[i]);
+ }
+# ifdef VERBOSE_STACK
+ j += index + 1;
+# endif
+ }
+ /* Repeat until LIMIT push/pop operations are performed (by all */
+ /* the threads simultaneously). */
+# ifdef VERBOSE_STACK
+ printf("finished thread %u: %u total ops\n", index, j);
+# endif
+ return 0;
+}
+
+#ifndef N_EXPERIMENTS
+# define N_EXPERIMENTS 1
+#endif
+
+unsigned long times[MAX_NTHREADS + 1][N_EXPERIMENTS];
+
+void run_one_experiment(int max_nthreads, int exper_n)
+{
+ int nthreads;
+
+ assert(max_nthreads <= MAX_NTHREADS);
+ assert(exper_n < N_EXPERIMENTS);
+ for (nthreads = 1; nthreads <= max_nthreads; ++nthreads) {
+ unsigned i;
+# ifdef USE_WINTHREADS
+ DWORD thread_id;
+ HANDLE thread[MAX_NTHREADS];
+# else
+ pthread_t thread[MAX_NTHREADS];
+# endif
+ int list_length = nthreads*(nthreads+1)/2;
+ unsigned long start_time;
+ AO_t *le;
+
+# ifdef VERBOSE_STACK
+ printf("Before add_elements: exper_n=%d, nthreads=%d,"
+ " max_nthreads=%d, list_length=%d\n",
+ exper_n, nthreads, max_nthreads, list_length);
+# endif
+ /* Create a list with n*(n+1)/2 elements. */
+ assert(0 == AO_REAL_HEAD_PTR(the_list));
+ add_elements(list_length);
+# ifdef VERBOSE_STACK
+ printf("Initial list (nthreads = %d):\n", nthreads);
+ print_list();
+# endif
+ ops_performed = 0;
+ start_time = get_msecs();
+ /* Start n-1 threads to run_one_test in parallel. */
+ for (i = 1; (int)i < nthreads; ++i) {
+ int code;
+
+# ifdef USE_WINTHREADS
+ thread[i] = CreateThread(NULL, 0, run_one_test, (LPVOID)(size_t)i,
+ 0, &thread_id);
+ code = thread[i] != NULL ? 0 : (int)GetLastError();
+# else
+ code = pthread_create(&thread[i], 0, run_one_test,
+ (void *)(size_t)i);
+# endif
+ if (code != 0) {
+ fprintf(stderr, "Thread creation failed %u\n", (unsigned)code);
+ exit(3);
+ }
+ }
+ /* We use the main thread to run one test. This allows */
+ /* gprof profiling to work, for example. */
+ run_one_test(0);
+ /* Wait for all the threads to complete. */
+ for (i = 1; (int)i < nthreads; ++i) {
+ int code;
+
+# ifdef USE_WINTHREADS
+ code = WaitForSingleObject(thread[i], INFINITE) == WAIT_OBJECT_0 ?
+ 0 : (int)GetLastError();
+# else
+ code = pthread_join(thread[i], 0);
+# endif
+ if (code != 0) {
+ fprintf(stderr, "Thread join failed %u\n", (unsigned)code);
+ abort();
+ }
+ }
+ times[nthreads][exper_n] = get_msecs() - start_time;
+# ifdef VERBOSE_STACK
+ printf("nthreads=%d, time_ms=%lu\n",
+ nthreads, times[nthreads][exper_n]);
+ printf("final list (should be reordered initial list):\n");
+ print_list();
+# endif
+ /* Ensure that no element is lost or duplicated. */
+ check_list(list_length);
+ /* And, free the entire list. */
+ while ((le = AO_stack_pop(&the_list)) != 0)
+ free(le);
+ /* Retry with larger n values. */
+ }
+}
+
+void run_all_experiments(int max_nthreads)
+{
+ int exper_n;
+
+ for (exper_n = 0; exper_n < N_EXPERIMENTS; ++exper_n)
+ run_one_experiment(max_nthreads, exper_n);
+}
+
+/* Output the performance statistic. */
+void output_stat(int max_nthreads)
+{
+ int nthreads;
+
+ assert(max_nthreads <= MAX_NTHREADS);
+ for (nthreads = 1; nthreads <= max_nthreads; ++nthreads) {
+# ifndef NO_TIMES
+ int exper_n;
+ unsigned long sum = 0;
+# endif
+
+ printf("About %d pushes + %d pops in %d threads:",
+ LIMIT, LIMIT, nthreads);
+# ifndef NO_TIMES
+ for (exper_n = 0; exper_n < N_EXPERIMENTS; ++exper_n) {
+# ifdef VERBOSE_STACK
+ printf(" [%lums]", times[nthreads][exper_n]);
+# endif
+ sum += times[nthreads][exper_n];
+ }
+ printf(" %lu msecs\n", (sum + N_EXPERIMENTS/2)/N_EXPERIMENTS);
+# else
+ printf(" completed\n");
+# endif
+ }
+}
+
+int main(int argc, char **argv)
+{
+ int max_nthreads = DEFAULT_NTHREADS;
+
+ if (2 == argc)
+ {
+ max_nthreads = atoi(argv[1]);
+ if (max_nthreads < 1 || max_nthreads > MAX_NTHREADS)
+ {
+ fprintf(stderr, "Invalid max # of threads argument\n");
+ exit(1);
+ }
+ }
+ else if (argc > 2)
+ {
+ fprintf(stderr, "Usage: %s [max # of threads]\n", argv[0]);
+ exit(1);
+ }
+ if (!AO_stack_is_lock_free())
+ printf("Use almost-lock-free implementation\n");
+# if defined(CPPCHECK)
+ AO_stack_init(&the_list);
+# endif
+ run_all_experiments(max_nthreads);
+ output_stat(max_nthreads);
+ return 0;
+}
+
+#endif
diff --git a/graphics/asymptote/locate.cc b/graphics/asymptote/locate.cc
index d1c11a1f27..afea7272d0 100644
--- a/graphics/asymptote/locate.cc
+++ b/graphics/asymptote/locate.cc
@@ -5,14 +5,11 @@
* Locate files in search path.
*****/
-#include <unistd.h>
-
#include "settings.h"
#include "util.h"
#include "locate.h"
-
namespace settings {
namespace fs {
@@ -28,7 +25,7 @@ string extension(string name)
bool exists(string filename)
{
- return ::access(filename.c_str(), R_OK) == 0;
+ return fileExists(filename);
}
} // namespace fs
@@ -66,28 +63,14 @@ string locateFile(string id, bool full, string suffix)
{
if(id.empty()) return "";
file_list_t filenames = mungeFileName(id,suffix);
- for (file_list_t::iterator leaf = filenames.begin();
- leaf != filenames.end();
- ++leaf) {
-#ifdef __MSDOS__
- size_t p;
- while ((p=leaf->find('\\')) < string::npos)
- (*leaf)[p]='/';
- if ((p=leaf->find(':')) < string::npos && p > 0) {
- (*leaf)[p]='/';
- leaf->insert(0,"/cygdrive/");
- }
-#endif
-
- if ((*leaf)[0] == '/') {
- string file = *leaf;
+ for (auto const& leaf : filenames) {
+ if (leaf[0] == '/') { // FIXME: Add windows path check
+ string file = leaf;
if (fs::exists(file))
return file;
} else {
- for (file_list_t::iterator dir = searchPath.begin();
- dir != searchPath.end();
- ++dir) {
- string file = join(*dir,*leaf,full);
+ for (auto const& dir : searchPath) {
+ string file = join(dir,leaf,full);
if (fs::exists(file))
return file;
}
@@ -97,5 +80,3 @@ string locateFile(string id, bool full, string suffix)
}
} // namespace settings
-
-
diff --git a/graphics/asymptote/lspdec.cc b/graphics/asymptote/lspdec.cc
new file mode 100644
index 0000000000..a6bb2a077c
--- /dev/null
+++ b/graphics/asymptote/lspdec.cc
@@ -0,0 +1,233 @@
+/**
+ * @file lspdec.cc
+ * @brief For createSymMap and other functions specific to Lsp in *dec classes.
+ * @author Supakorn 'Jamie' Rassameemasmuang (jamievlin at outlook.com)
+ */
+
+#include "common.h"
+#include "dec.h"
+
+
+#ifdef HAVE_LSP
+# include "locate.h"
+#endif
+
+#define DEC_CREATE_SYM_MAP_FUNCTION_DEF(derived_class) \
+ void derived_class::createSymMap(AsymptoteLsp::SymbolContext* symContext)
+
+
+namespace absyntax
+{
+
+#ifdef HAVE_LSP
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(unraveldec)
+{
+ std::string fileName= static_cast<std::string>(id->getName());
+ if (not AsymptoteLsp::isVirtualFile(fileName)) {
+ symContext->extRefs.addUnravelVal(fileName);
+ }
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(fromaccessdec)
+{
+ // filename is id;
+ std::string idStr(id);
+ symContext->extRefs.addEmptyExtRef(idStr);
+
+ auto* f= this->fields;
+ if (f) {
+ // add [dest] -> [src, filename] to fromAccessDecls;
+ f->processListFn([&symContext,
+ &idStr](symbol const& src, symbol const& dest) {
+ std::string srcId(src);
+ std::string destId(dest);
+ symContext->extRefs.addFromAccessVal(idStr, srcId, destId);
+ });
+ }
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(importdec) { base.createSymMap(symContext); }
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(includedec)
+{
+ std::string fullname(
+ (std::string) settings::locateFile(filename, true).c_str()
+ );
+ if (not AsymptoteLsp::isVirtualFile(fullname)) {
+ symContext->addEmptyExtRef(fullname);
+ symContext->extRefs.includeVals.emplace(fullname);
+ }
+}
+
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(recorddec)
+{
+ auto* newCtx= symContext->newContext(getPos().LineColumn());
+ auto* structTyInfo= symContext->newTypeDec<AsymptoteLsp::StructDecs>(
+ static_cast<std::string>(id), getPos().LineColumn()
+ );
+ if (structTyInfo != nullptr) {
+ structTyInfo->ctx= newCtx;
+ body->createSymMap(newCtx);
+ } else {
+ cerr << "Cannot create new struct context" << endl;
+ }
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(block)
+{
+ for (auto const& p : stms) {
+ p->createSymMap(symContext);
+ }
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(decidstart)
+{
+ std::string name(static_cast<std::string>(getName()));
+ AsymptoteLsp::posInFile pos(getPos().LineColumn());
+ if (auto decCtx= dynamic_cast<AsymptoteLsp::AddDeclContexts*>(symContext)) {
+ decCtx->additionalDecs.emplace(
+ std::piecewise_construct, std::forward_as_tuple(name),
+ std::forward_as_tuple(name, pos)
+ );
+ } else {
+ symContext->symMap.varDec[name]= AsymptoteLsp::SymbolInfo(name, pos);
+ }
+}
+
+
+void decidstart::createSymMapWType(
+ AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base
+)
+{
+ std::string name(static_cast<std::string>(getName()));
+ AsymptoteLsp::posInFile pos(getPos().LineColumn());
+ if (auto decCtx= dynamic_cast<AsymptoteLsp::AddDeclContexts*>(symContext)) {
+ if (base == nullptr) {
+ decCtx->additionalDecs.emplace(
+ std::piecewise_construct, std::forward_as_tuple(name),
+ std::forward_as_tuple(name, pos)
+ );
+ } else {
+ decCtx->additionalDecs.emplace(
+ std::piecewise_construct, std::forward_as_tuple(name),
+ std::forward_as_tuple(name, static_cast<std::string>(*base), pos)
+ );
+ }
+ } else {
+ symContext->symMap.varDec[name]=
+ base == nullptr ? AsymptoteLsp::SymbolInfo(name, pos)
+ : AsymptoteLsp::SymbolInfo(
+ name, static_cast<std::string>(*base), pos
+ );
+ }
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(decid)
+{
+ start->createSymMap(symContext);
+ if (init) {
+ init->createSymMap(symContext);
+ }
+}
+
+void decid::createSymMapWType(
+ AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base
+)
+{
+ start->createSymMapWType(symContext, base);
+ if (init) {
+ init->createSymMap(symContext);
+ }
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(decidlist)
+{
+ for (auto const& p : decs) {
+ p->createSymMap(symContext);
+ }
+}
+
+void decidlist::createSymMapWType(
+ AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base
+)
+{
+ for (auto const& p : decs) {
+ p->createSymMapWType(symContext, base);
+ }
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(vardec)
+{
+ decs->createSymMapWType(symContext, base);
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(idpair)
+{
+ if (valid) {
+ string fullSrc(settings::locateFile(src, true));
+ if (not AsymptoteLsp::isVirtualFile((std::string) (fullSrc.c_str()))) {
+ if (not fullSrc.empty()) {
+ symContext->addEmptyExtRef((std::string) (fullSrc.c_str()));
+ }
+
+ // add (dest, source) to reference map.
+ auto s= symContext->extRefs.fileIdPair.emplace(
+ dest, (std::string) fullSrc.c_str()
+ );
+ auto it= std::get<0>(s);
+ auto success= std::get<1>(s);
+ if (not success) {
+ it->second= (std::string) (fullSrc.c_str());
+ }
+
+ symContext->extRefs.addAccessVal(static_cast<std::string>(dest));
+ }
+ }
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(accessdec) { base->createSymMap(symContext); }
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF(idpairlist)
+{
+ for (auto& idp : base) {
+ idp->createSymMap(symContext);
+ }
+}
+
+#else
+
+# define DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(derived_class) \
+ DEC_CREATE_SYM_MAP_FUNCTION_DEF(derived_class) {}
+
+void decidstart::createSymMapWType(
+ AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base
+)
+{}
+
+void decid::createSymMapWType(
+ AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base
+)
+{}
+
+void decidlist::createSymMapWType(
+ AsymptoteLsp::SymbolContext* symContext, absyntax::astType* base
+)
+{}
+
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(unraveldec)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(fromaccessdec)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(importdec)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(includedec)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(recorddec)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(block)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(decidstart)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(decid)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(decidlist)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(vardec)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(idpair)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(accessdec)
+DEC_CREATE_SYM_MAP_FUNCTION_DEF_EMPTY(idpairlist)
+
+#endif
+}// namespace absyntax
diff --git a/graphics/asymptote/lspexp.cc b/graphics/asymptote/lspexp.cc
new file mode 100644
index 0000000000..4eeeb0a0b2
--- /dev/null
+++ b/graphics/asymptote/lspexp.cc
@@ -0,0 +1,148 @@
+/**
+ * @file lspexp.cc
+ * @brief For createSymMap and other lsp-related functions
+ * specific to Lsp in *exp classes.
+ * @author Supakorn 'Jamie' Rassameemasmuang (jamievlin at outlook.com)
+ */
+
+#include "common.h"
+#include "exp.h"
+
+#define DEC_CREATE_SYM_MAP_EXP(derived_class) \
+ void derived_class::createSymMap(AsymptoteLsp::SymbolContext* symContext)
+
+
+namespace absyntax
+{
+
+#ifdef HAVE_LSP
+
+DEC_CREATE_SYM_MAP_EXP(nameExp)
+{
+ AsymptoteLsp::SymbolLit accessedName(value->getLit());
+ position basePos= getPos();
+ AsymptoteLsp::filePos castedPos=
+ dynamic_cast<qualifiedName*>(value)
+ ? std::make_pair(
+ mem::stdString(basePos.filename()),
+ std::make_pair(basePos.Line(), basePos.Column() + 1)
+ )
+ : static_cast<AsymptoteLsp::filePos>(basePos);
+
+ auto varUsageIt= symContext->symMap.varUsage.find(accessedName);
+ if (varUsageIt == symContext->symMap.varUsage.end()) {
+ symContext->symMap.varUsage.emplace(accessedName, castedPos);
+ } else {
+ varUsageIt->second.add(castedPos);
+ }
+
+ symContext->symMap.usageByLines.emplace_back(castedPos.second, accessedName);
+}
+
+DEC_CREATE_SYM_MAP_EXP(argument) { val->createSymMap(symContext); }
+
+DEC_CREATE_SYM_MAP_EXP(arglist)
+{
+ for (auto& p : args) {
+ p.createSymMap(symContext);
+ }
+}
+
+DEC_CREATE_SYM_MAP_EXP(callExp)
+{
+ callee->createSymMap(symContext);
+ args->createSymMap(symContext);
+
+ if (auto col= getColorInformation()) {
+ auto const& v= col.value();
+ auto const& colVal= std::get<0>(v);
+ auto const& alpha= std::get<1>(v);
+ auto const& beginArgPos= std::get<2>(v);
+ auto const& lastArgPos= std::get<3>(v);
+ if (alpha.has_value()) {
+
+ auto const& red= std::get<0>(colVal);
+ auto const& green= std::get<1>(colVal);
+ auto const& blue= std::get<2>(colVal);
+ std::tuple<double, double, double, double> rgba(
+ red, green, blue, alpha.value()
+ );
+
+ symContext->addRGBAColor(rgba, beginArgPos, lastArgPos);
+ } else {
+ symContext->addRGBColor(colVal, beginArgPos, lastArgPos);
+ }
+ }
+}
+
+DEC_CREATE_SYM_MAP_EXP(castExp) { castee->createSymMap(symContext); }
+
+DEC_CREATE_SYM_MAP_EXP(assignExp)
+{
+ dest->createSymMap(symContext);
+ value->createSymMap(symContext);
+}
+
+optional<std::tuple<
+ callExp::colorInfo, optional<double>, AsymptoteLsp::posInFile,
+ AsymptoteLsp::posInFile>>
+callExp::getColorInformation()
+{
+ auto* namedCallee= dynamic_cast<nameExp*>(callee);
+ if (namedCallee == nullptr) {
+ return nullopt;
+ }
+
+ std::string calleeName= static_cast<std::string>(namedCallee->getName());
+ std::vector<double> colors;
+
+ auto getLineColumn= [&argsval= args->args](int const& idx) {
+ return argsval[idx].val->getPos().LineColumn();
+ };
+
+ if (calleeName == "rgb" || calleeName == "rgba") {
+ for (auto const& expVec : args->args) {
+ if (auto* valExp= dynamic_cast<realExp*>(expVec.val)) {
+ colors.push_back(valExp->getValue<double>());
+ } else if (auto* valExpI= dynamic_cast<intExp*>(expVec.val)) {
+ colors.push_back(valExpI->getValue<double>());
+ }
+ }
+ }
+ if (calleeName == "rgb" && colors.size() == 3) {
+ callExp::colorInfo col(colors[0], colors[1], colors[2]);
+ return std::make_tuple(
+ col, optional<double>(), callee->getPos().LineColumn(),
+ getLineColumn(2)
+ );
+ } else if (calleeName == "rgba" && colors.size() == 4) {
+ callExp::colorInfo col(colors[0], colors[1], colors[2]);
+ return std::make_tuple(
+ col, optional<double>(colors[3]), callee->getPos().LineColumn(),
+ getLineColumn(3)
+ );
+ }
+ return nullopt;
+}
+
+#else
+
+# define DEC_CREATE_SYM_MAP_EXP_EMPTY(derived_class) \
+ DEC_CREATE_SYM_MAP_EXP(derived_class) {}
+
+DEC_CREATE_SYM_MAP_EXP_EMPTY(nameExp)
+DEC_CREATE_SYM_MAP_EXP_EMPTY(argument)
+DEC_CREATE_SYM_MAP_EXP_EMPTY(arglist)
+DEC_CREATE_SYM_MAP_EXP_EMPTY(callExp)
+DEC_CREATE_SYM_MAP_EXP_EMPTY(castExp)
+DEC_CREATE_SYM_MAP_EXP_EMPTY(assignExp)
+
+optional<std::tuple<
+ callExp::colorInfo, optional<double>, AsymptoteLsp::posInFile,
+ AsymptoteLsp::posInFile>>
+callExp::getColorInformation()
+{
+ return nullopt;
+}
+#endif
+}// namespace absyntax
diff --git a/graphics/asymptote/lspfundec.cc b/graphics/asymptote/lspfundec.cc
new file mode 100644
index 0000000000..92b03aa631
--- /dev/null
+++ b/graphics/asymptote/lspfundec.cc
@@ -0,0 +1,108 @@
+/**
+ * @file lspfundec.cc
+ * @brief For createSymMap and other lsp-related functions
+ * specific to Lsp in *fundef classes.
+ * @author Supakorn 'Jamie' Rassameemasmuang (jamievlin at outlook.com)
+ */
+
+#include "common.h"
+#include "fundec.h"
+#include "stm.h"
+
+#define DEC_CREATE_SYM_MAP_FUNDEC(derived_class) \
+ void derived_class::createSymMap(AsymptoteLsp::SymbolContext* symContext)
+
+namespace absyntax
+{
+#ifdef HAVE_LSP
+
+DEC_CREATE_SYM_MAP_FUNDEC(formals)
+{
+ for (auto& field : fields) {
+ field->createSymMap(symContext);
+ }
+
+ if (rest) {
+ rest->createSymMap(symContext);
+ }
+}
+
+void formals::addArgumentsToFnInfo(AsymptoteLsp::FunctionInfo& fnInfo)
+{
+ for (auto const& field : fields) {
+ fnInfo.arguments.emplace_back(field->fnInfo());
+ }
+
+ if (rest) {
+ fnInfo.restArgs= rest->fnInfo();
+ }
+ // handle rest case as well
+}
+
+void fundef::addArgumentsToFnInfo(AsymptoteLsp::FunctionInfo& fnInfo)
+{
+ params->addArgumentsToFnInfo(fnInfo);
+ // handle rest case as well
+}
+
+
+DEC_CREATE_SYM_MAP_FUNDEC(fundef)
+{
+ auto* declCtx(symContext->newContext<AsymptoteLsp::AddDeclContexts>(
+ getPos().LineColumn()
+ ));
+ params->createSymMap(declCtx);
+ body->createSymMap(declCtx);
+}
+
+DEC_CREATE_SYM_MAP_FUNDEC(fundec)
+{
+ AsymptoteLsp::FunctionInfo& fnInfo= symContext->symMap.addFunDef(
+ static_cast<std::string>(id), getPos().LineColumn(),
+ static_cast<std::string>(*fun.result)
+ );
+ fun.addArgumentsToFnInfo(fnInfo);
+ fun.createSymMap(symContext);
+}
+
+DEC_CREATE_SYM_MAP_FUNDEC(formal)
+{
+ if (start) {
+ start->createSymMap(symContext);
+ }
+}
+
+std::pair<std::string, optional<std::string>> formal::fnInfo() const
+{
+ std::string typeName(static_cast<std::string>(*base));
+ return start != nullptr
+ ? std::make_pair(
+ typeName,
+ make_optional(
+ static_cast<std::string>(start->getName())
+ )
+ )
+ : std::make_pair(typeName, nullopt);
+}
+
+#else
+
+# define DEC_CREATE_SYM_MAP_FUNDEC_EMPTY(derived_class) \
+ DEC_CREATE_SYM_MAP_FUNDEC(derived_class) {}
+
+DEC_CREATE_SYM_MAP_FUNDEC_EMPTY(formals)
+DEC_CREATE_SYM_MAP_FUNDEC_EMPTY(fundef)
+DEC_CREATE_SYM_MAP_FUNDEC_EMPTY(fundec)
+DEC_CREATE_SYM_MAP_FUNDEC_EMPTY(formal)
+
+void formals::addArgumentsToFnInfo(AsymptoteLsp::FunctionInfo& fnInfo) {}
+void fundef::addArgumentsToFnInfo(AsymptoteLsp::FunctionInfo& fnInfo) {}
+
+std::pair<std::string, optional<std::string>> formal::fnInfo() const
+{
+ return std::make_pair("", nullopt);
+}
+
+#endif
+
+}// namespace absyntax
diff --git a/graphics/asymptote/lspserv.cc b/graphics/asymptote/lspserv.cc
index 6ec74e2ccf..afdf957681 100644
--- a/graphics/asymptote/lspserv.cc
+++ b/graphics/asymptote/lspserv.cc
@@ -2,10 +2,11 @@
// Created by Supakorn on 5/13/2021.
//
-#include "common.h"
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
#ifdef HAVE_LSP
-
#include "lspserv.h"
#include <LibLsp/JsonRpc/stream.h>
@@ -18,8 +19,9 @@
#include <thread>
+#include "common.h"
#include "dec.h"
-#include "process.h"
+#include "asyprocess.h"
#include "locate.h"
#define REGISTER_REQ_FN(typ, fn) remoteEndPoint->registerHandler(\
@@ -56,6 +58,7 @@ namespace AsymptoteLsp
std::string wslDos2Unix(std::string const& dosPath)
{
+#ifndef _WIN32
bool isDrivePath=false;
char drive;
if (dosPath.length() >= 3)
@@ -73,13 +76,15 @@ std::string wslDos2Unix(std::string const& dosPath)
sstream << "/mnt/" << (char) tolower(drive) << dosPath.substr(3);
return sstream.str();
} else
+#endif
{
- return std::string(dosPath);
+ return dosPath;
}
}
std::string wslUnix2Dos(std::string const& unixPath)
{
+#ifndef _WIN32
bool isMntPath=false;
char drive;
@@ -107,8 +112,11 @@ std::string wslUnix2Dos(std::string const& unixPath)
return sstream.str();
} else
{
- return std::string(fullPath);
+ return fullPath;
}
+#else
+ return unixPath;
+#endif
}
TextDocumentHover::Either fromString(std::string const& str)
@@ -151,8 +159,8 @@ std::string wslUnix2Dos(std::string const& unixPath)
std::string getDocIdentifierRawPath(lsTextDocumentIdentifier const& textDocIdentifier)
{
lsDocumentUri fileUri(textDocIdentifier.uri);
- std::string rawPath=settings::getSetting<bool>("wsl") ?
- wslDos2Unix(fileUri.GetRawPath()) : std::string(fileUri.GetRawPath());
+ std::string rawPath=std::string(fileUri.GetRawPath());
+ if(settings::getSetting<bool>("wsl")) rawPath=wslDos2Unix(rawPath);
return static_cast<std::string>(rawPath);
}
@@ -588,7 +596,8 @@ std::string wslUnix2Dos(std::string const& unixPath)
lsRange rng(toLsPosition(posBegin), toLsPosition(posEnd));
std::string filReturn(
- settings::getSetting<bool>("wsl") ? static_cast<std::string>(wslUnix2Dos(fil)) : fil);
+ settings::getSetting<bool>("wsl") ?
+ static_cast<std::string>(wslUnix2Dos(fil)) : fil);
lsDocumentUri uri(filReturn);
return lsLocation(uri, rng);
@@ -599,7 +608,8 @@ std::string wslUnix2Dos(std::string const& unixPath)
//#pragma endregion
void AsymptoteLspServer::reloadFile(std::string const& filename)
{
- std::string rawPath=settings::getSetting<bool>("wsl") ? wslDos2Unix(filename) : std::string(filename);
+ std::string rawPath(filename);
+ if(settings::getSetting<bool>("wsl")) rawPath=wslDos2Unix(filename);
reloadFileRaw(static_cast<std::string>(rawPath));
}
diff --git a/graphics/asymptote/lspserv.h b/graphics/asymptote/lspserv.h
index 44f6b8978e..286c75b6c8 100644
--- a/graphics/asymptote/lspserv.h
+++ b/graphics/asymptote/lspserv.h
@@ -1,6 +1,4 @@
#pragma once
-#include "common.h"
-#include "symbolmaps.h"
#include "LibLsp/lsp/ProtocolJsonHandler.h"
#include "LibLsp/lsp/AbsolutePath.h"
@@ -23,12 +21,16 @@
#include "LibLsp/lsp/textDocument/did_change.h"
#include "LibLsp/lsp/textDocument/did_save.h"
#include "LibLsp/lsp/textDocument/did_close.h"
+#include "LibLsp/JsonRpc/stream.h"
+
+
+#include "common.h"
+#include "symbolmaps.h"
//everything else
#include <functional>
#include <cctype>
#include <unordered_map>
-#include "LibLsp/JsonRpc/stream.h"
namespace absyntax
{
@@ -81,8 +83,11 @@ namespace AsymptoteLsp
TextDocumentHover::Either fromMarkedStr(std::vector<std::string> const& stringList,
std::string const& language="asymptote");
+#if defined(LINUX_SYSTEM)
+ // these functions have no use for apple or windows builds
std::string wslDos2Unix(std::string const& dosPath);
std::string wslUnix2Dos(std::string const& unixPath);
+#endif
std::string getDocIdentifierRawPath(lsTextDocumentIdentifier const&);
typedef std::unordered_map<std::string, std::unique_ptr<SymbolContext>> SymContextFilemap;
diff --git a/graphics/asymptote/lspstm.cc b/graphics/asymptote/lspstm.cc
new file mode 100644
index 0000000000..a1d3e4aa80
--- /dev/null
+++ b/graphics/asymptote/lspstm.cc
@@ -0,0 +1,124 @@
+/**
+ * @file lspstm.cc
+ * @brief For createSymMap and other functions specific to Lsp in *stm classes.
+ * @author Supakorn 'Jamie' Rassameemasmuang (jamievlin at outlook.com)
+ */
+
+#include "common.h"
+#include "exp.h"
+#include "stm.h"
+
+#define DEC_CREATE_SYM_MAP_FUNCTION_STM(derived_class) \
+ void derived_class::createSymMap(AsymptoteLsp::SymbolContext* symContext)
+
+
+namespace absyntax
+{
+#ifdef HAVE_LSP
+
+DEC_CREATE_SYM_MAP_FUNCTION_STM(forStm)
+{
+
+ AsymptoteLsp::SymbolContext* ctx(symContext);
+ if (init) {
+ auto* declCtx(symContext->newContext(getPos().LineColumn()));
+ init->createSymMap(declCtx);
+ ctx= declCtx;
+ }
+ if (test) {
+ test->createSymMap(ctx);
+ }
+ if (update) {
+ update->createSymMap(ctx);
+ }
+ body->createSymMap(ctx);
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_STM(extendedForStm)
+{
+
+ auto* declCtx(symContext->newContext(getPos().LineColumn()));
+
+ std::string varName(var);
+
+ // FIXME: How do we get the position of the actual variable name?
+ // Right now, we only get the starting position of the type declaration
+ declCtx->symMap.varDec.emplace(
+ std::piecewise_construct, std::forward_as_tuple(varName),
+ std::forward_as_tuple(
+ varName, static_cast<std::string>(*start),
+ start->getPos().LineColumn()
+ )
+ );
+ set->createSymMap(symContext);
+ body->createSymMap(declCtx);
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_STM(returnStm)
+{
+
+ if (value) {
+ value->createSymMap(symContext);
+ }
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_STM(blockStm)
+{
+
+ base->createSymMap(symContext->newContext(getPos().LineColumn()));
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_STM(expStm) { body->createSymMap(symContext); }
+DEC_CREATE_SYM_MAP_FUNCTION_STM(ifStm)
+{
+
+ test->createSymMap(symContext);
+ onTrue->createSymMap(symContext);
+
+ if (onFalse) {
+ onFalse->createSymMap(symContext);
+ }
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_STM(whileStm)
+{
+
+ // while (<xyz>) { <body> }
+ // the <xyz> part belongs in the main context as the while statement,
+ // as it cannot declare new variables and only knows the symbols from that
+ // context.
+
+ test->createSymMap(symContext);
+
+ // for the body part, { <body> } are encapsulated in
+ // the blockStm, while <body> are direct statements.
+ // If the while block does not use { <body> }, then the body
+ // can be considered the same context as it cannot declare new variables and
+ // again, can only uses the variable already known before this while
+ // statement.
+
+ body->createSymMap(symContext);
+}
+
+DEC_CREATE_SYM_MAP_FUNCTION_STM(doStm)
+{
+
+ body->createSymMap(symContext);
+ test->createSymMap(symContext);
+}
+
+#else
+# define DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(derived_class) \
+ DEC_CREATE_SYM_MAP_FUNCTION_STM(derived_class) {}
+
+DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(forStm)
+DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(extendedForStm)
+DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(returnStm)
+DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(blockStm)
+DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(expStm)
+DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(ifStm)
+DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(whileStm)
+DEC_CREATE_SYM_MAP_FUNCTION_STM_EMPTY(doStm)
+
+#endif
+}// namespace absyntax
diff --git a/graphics/asymptote/ltmain.sh b/graphics/asymptote/ltmain.sh
new file mode 100644
index 0000000000..49fcad1365
--- /dev/null
+++ b/graphics/asymptote/ltmain.sh
@@ -0,0 +1,11429 @@
+#! /usr/bin/env sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+## by inline-source v2019-02-19.15
+
+# libtool (GNU libtool) 2.4.7
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996-2019, 2021-2022 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION=2.4.7
+package_revision=2.4.7
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2019-02-19.15; # UTC
+
+# General shell script boiler plate, and helper functions.
+# Written by Gary V. Vaughan, 2004
+
+# This is free software. There is NO warranty; not even for
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Copyright (C) 2004-2019, 2021 Bootstrap Authors
+#
+# This file is dual licensed under the terms of the MIT license
+# <https://opensource.org/license/MIT>, and GPL version 2 or later
+# <http://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of
+# these licenses when using or redistributing this software or any of
+# the files within it. See the URLs above, or the file `LICENSE`
+# included in the Bootstrap distribution for the full license texts.
+
+# Please report bugs or propose patches to:
+# <https://github.com/gnulib-modules/bootstrap/issues>
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
+fi
+
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+ eval "if test set = \"\${$_G_var+set}\"; then
+ save_$_G_var=\$$_G_var
+ $_G_var=C
+ export $_G_var
+ _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+ _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
+ fi"
+done
+# These NLS vars are set unconditionally (bootstrap issue #24). Unset those
+# in case the environment reset is needed later and the $save_* variant is not
+# defined (see the code above).
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp $nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# func_unset VAR
+# --------------
+# Portably unset VAR.
+# In some shells, an 'unset VAR' statement leaves a non-zero return
+# status if VAR is already unset, which might be problematic if the
+# statement is used at the end of a function (thus poisoning its return
+# value) or when 'set -e' is active (causing even a spurious abort of
+# the script in this case).
+func_unset ()
+{
+ { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; }
+}
+
+
+# Make sure CDPATH doesn't cause `cd` commands to output the target dir.
+func_unset CDPATH
+
+# Make sure ${,E,F}GREP behave sanely.
+func_unset GREP_OPTIONS
+
+
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+
+
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+ _G_progs_list=$1
+ _G_check_func=$2
+ _G_PATH=${3-"$PATH"}
+
+ _G_path_prog_max=0
+ _G_path_prog_found=false
+ _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+ for _G_dir in $_G_PATH; do
+ IFS=$_G_save_IFS
+ test -z "$_G_dir" && _G_dir=.
+ for _G_prog_name in $_G_progs_list; do
+ for _exeext in '' .EXE; do
+ _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+ func_executable_p "$_G_path_prog" || continue
+ case `"$_G_path_prog" --version 2>&1` in
+ *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+ *) $_G_check_func $_G_path_prog
+ func_path_progs_result=$func_check_prog_result
+ ;;
+ esac
+ $_G_path_prog_found && break 3
+ done
+ done
+ done
+ IFS=$_G_save_IFS
+ test -z "$func_path_progs_result" && {
+ echo "no acceptable sed could be found in \$PATH" >&2
+ exit 1
+ }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+ _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for _G_i in 1 2 3 4 5 6 7; do
+ _G_sed_script=$_G_sed_script$nl$_G_sed_script
+ done
+ echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+ _G_sed_script=
+
+ func_check_prog_sed ()
+ {
+ _G_path_prog=$1
+
+ _G_count=0
+ printf 0123456789 >conftest.in
+ while :
+ do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo '' >> conftest.nl
+ "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+ diff conftest.out conftest.nl >/dev/null 2>&1 || break
+ _G_count=`expr $_G_count + 1`
+ if test "$_G_count" -gt "$_G_path_prog_max"; then
+ # Best one so far, save it but keep looking for a better one
+ func_check_prog_result=$_G_path_prog
+ _G_path_prog_max=$_G_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test 10 -lt "$_G_count" && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out
+ }
+
+ func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin"
+ rm -f conftest.sed
+ SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+ func_check_prog_grep ()
+ {
+ _G_path_prog=$1
+
+ _G_count=0
+ _G_path_prog_max=0
+ printf 0123456789 >conftest.in
+ while :
+ do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo 'GREP' >> conftest.nl
+ "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+ diff conftest.out conftest.nl >/dev/null 2>&1 || break
+ _G_count=`expr $_G_count + 1`
+ if test "$_G_count" -gt "$_G_path_prog_max"; then
+ # Best one so far, save it but keep looking for a better one
+ func_check_prog_result=$_G_path_prog
+ _G_path_prog_max=$_G_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test 10 -lt "$_G_count" && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out
+ }
+
+ func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin"
+ GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables. These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
+
+: ${CP="cp -f"}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+
+
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
+
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
+
+# Same as above, but do not quote variable references.
+sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
+
+# Sed substitution that converts a w32 file name or path
+# that contains forward slashes, into one that contains
+# (escaped) backslashes. A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same. If an odd number of '\' preceded a
+# '$' in input to sed_double_quote_subst, that '$' was protected from
+# expansion. Since each input '\' is now two '\'s, look for any number
+# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+ s/$_G_bs4/&\\
+/g
+ s/^$_G_bs2$_G_dollar/$_G_bs&/
+ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+ s/\n//g"
+
+# require_check_ifs_backslash
+# ---------------------------
+# Check if we can use backslash as IFS='\' separator, and set
+# $check_ifs_backshlash_broken to ':' or 'false'.
+require_check_ifs_backslash=func_require_check_ifs_backslash
+func_require_check_ifs_backslash ()
+{
+ _G_save_IFS=$IFS
+ IFS='\'
+ _G_check_ifs_backshlash='a\\b'
+ for _G_i in $_G_check_ifs_backshlash
+ do
+ case $_G_i in
+ a)
+ check_ifs_backshlash_broken=false
+ ;;
+ '')
+ break
+ ;;
+ *)
+ check_ifs_backshlash_broken=:
+ break
+ ;;
+ esac
+ done
+ IFS=$_G_save_IFS
+ require_check_ifs_backslash=:
+}
+
+
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
+
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake.
+
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
+
+# By convention, finish your script with:
+#
+# exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath=$0
+
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
+
+# Make sure we have an absolute progpath for reexecution:
+case $progpath in
+ [\\/]*|[A-Za-z]:\\*) ;;
+ *[\\/]*)
+ progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
+ progdir=`cd "$progdir" && pwd`
+ progpath=$progdir/$progname
+ ;;
+ *)
+ _G_IFS=$IFS
+ IFS=${PATH_SEPARATOR-:}
+ for progdir in $PATH; do
+ IFS=$_G_IFS
+ test -x "$progdir/$progname" && break
+ done
+ IFS=$_G_IFS
+ test -n "$progdir" || progdir=`pwd`
+ progpath=$progdir/$progname
+ ;;
+esac
+
+
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
+
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
+
+opt_dry_run=false
+opt_quiet=false
+opt_verbose=false
+
+# Categories 'all' and 'none' are always available. Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
+
+# By default, display warnings according to 'opt_warning_types'. Set
+# 'warning_func' to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
+
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
+
+
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
+
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
+
+
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
+{
+ $debug_cmd
+
+ test -t 1 && {
+ # COLORTERM and USE_ANSI_COLORS environment variables take
+ # precedence, because most terminfo databases neglect to describe
+ # whether color sequences are supported.
+ test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+ if test 1 = "$USE_ANSI_COLORS"; then
+ # Standard ANSI escape sequences
+ tc_reset=''
+ tc_bold=''; tc_standout=''
+ tc_red=''; tc_green=''
+ tc_blue=''; tc_cyan=''
+ else
+ # Otherwise trust the terminfo database after all.
+ test -n "`tput sgr0 2>/dev/null`" && {
+ tc_reset=`tput sgr0`
+ test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+ tc_standout=$tc_bold
+ test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+ test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+ test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+ test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+ test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+ }
+ fi
+ }
+
+ require_term_colors=:
+}
+
+
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+ # We should try to minimise forks, especially on Windows where they are
+ # unreasonably slow, so skip the feature probes when bash or zsh are
+ # being used:
+ if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+ : ${_G_HAVE_ARITH_OP="yes"}
+ : ${_G_HAVE_XSI_OPS="yes"}
+ # The += operator was introduced in bash 3.1
+ case $BASH_VERSION in
+ [12].* | 3.0 | 3.0*) ;;
+ *)
+ : ${_G_HAVE_PLUSEQ_OP="yes"}
+ ;;
+ esac
+ fi
+
+ # _G_HAVE_PLUSEQ_OP
+ # Can be empty, in which case the shell is probed, "yes" if += is
+ # useable or anything else if it does not work.
+ test -z "$_G_HAVE_PLUSEQ_OP" \
+ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+ && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+ # This is an XSI compatible shell, allowing a faster implementation...
+ eval 'func_append ()
+ {
+ $debug_cmd
+
+ eval "$1+=\$2"
+ }'
+else
+ # ...otherwise fall back to using expr, which is often a shell builtin.
+ func_append ()
+ {
+ $debug_cmd
+
+ eval "$1=\$$1\$2"
+ }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+ eval 'func_append_quoted ()
+ {
+ $debug_cmd
+
+ func_quote_arg pretty "$2"
+ eval "$1+=\\ \$func_quote_arg_result"
+ }'
+else
+ func_append_quoted ()
+ {
+ $debug_cmd
+
+ func_quote_arg pretty "$2"
+ eval "$1=\$$1\\ \$func_quote_arg_result"
+ }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE. For example:
+#
+# func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
+{
+ $debug_cmd
+
+ eval _G_current_value='`$ECHO $'$1'`'
+ _G_delim=`expr "$2" : '\(.\)'`
+
+ case $_G_delim$_G_current_value$_G_delim in
+ *"$2$_G_delim"*) ;;
+ *) func_append "$@" ;;
+ esac
+}
+
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+ test -z "$_G_HAVE_ARITH_OP" \
+ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+ && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+ eval 'func_arith ()
+ {
+ $debug_cmd
+
+ func_arith_result=$(( $* ))
+ }'
+else
+ func_arith ()
+ {
+ $debug_cmd
+
+ func_arith_result=`expr "$@"`
+ }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ # If this shell supports suffix pattern removal, then use it to avoid
+ # forking. Hide the definitions single quotes in case the shell chokes
+ # on unsupported syntax...
+ _b='func_basename_result=${1##*/}'
+ _d='case $1 in
+ */*) func_dirname_result=${1%/*}$2 ;;
+ * ) func_dirname_result=$3 ;;
+ esac'
+
+else
+ # ...otherwise fall back to using sed.
+ _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+ _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"`
+ if test "X$func_dirname_result" = "X$1"; then
+ func_dirname_result=$3
+ else
+ func_append func_dirname_result "$2"
+ fi'
+fi
+
+eval 'func_basename ()
+{
+ $debug_cmd
+
+ '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE. If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+ $debug_cmd
+
+ '"$_d"'
+}'
+
+
+# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
+# --------------------------------------------------------
+# Perform func_basename and func_dirname in a single function
+# call:
+# dirname: Compute the dirname of FILE. If nonempty,
+# add APPEND to the result, otherwise set result
+# to NONDIR_REPLACEMENT.
+# value returned in "$func_dirname_result"
+# basename: Compute filename of FILE.
+# value retuned in "$func_basename_result"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+ $debug_cmd
+
+ '"$_b"'
+ '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+ $debug_cmd
+
+ _G_message=$*
+
+ func_echo_IFS=$IFS
+ IFS=$nl
+ for _G_line in $_G_message; do
+ IFS=$func_echo_IFS
+ $ECHO "$progname: $_G_line"
+ done
+ IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO "$*"
+}
+
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
+{
+ $debug_cmd
+
+ $require_term_colors
+
+ _G_infix=$1; shift
+ _G_indent=$_G_infix
+ _G_prefix="$progname: $_G_infix: "
+ _G_message=$*
+
+ # Strip color escape sequences before counting printable length
+ for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+ do
+ test -n "$_G_tc" && {
+ _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+ _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+ }
+ done
+ _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes
+
+ func_echo_infix_1_IFS=$IFS
+ IFS=$nl
+ for _G_line in $_G_message; do
+ IFS=$func_echo_infix_1_IFS
+ $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+ _G_prefix=$_G_indent
+ done
+ IFS=$func_echo_infix_1_IFS
+}
+
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+ $debug_cmd
+
+ $require_term_colors
+
+ func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2
+}
+
+
+# func_fatal_error ARG...
+# -----------------------
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+ $debug_cmd
+
+ func_error "$*"
+ exit $EXIT_FAILURE
+}
+
+
+# func_grep EXPRESSION FILENAME
+# -----------------------------
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+ $debug_cmd
+
+ $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+ test -z "$_G_HAVE_XSI_OPS" \
+ && (eval 'x=a/b/c;
+ test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+ && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ eval 'func_len ()
+ {
+ $debug_cmd
+
+ func_len_result=${#1}
+ }'
+else
+ func_len ()
+ {
+ $debug_cmd
+
+ func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+ }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+ $debug_cmd
+
+ _G_directory_path=$1
+ _G_dir_list=
+
+ if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
+
+ # Protect directory names starting with '-'
+ case $_G_directory_path in
+ -*) _G_directory_path=./$_G_directory_path ;;
+ esac
+
+ # While some portion of DIR does not yet exist...
+ while test ! -d "$_G_directory_path"; do
+ # ...make a list in topmost first order. Use a colon delimited
+ # list incase some portion of path contains whitespace.
+ _G_dir_list=$_G_directory_path:$_G_dir_list
+
+ # If the last portion added has no slash in it, the list is done
+ case $_G_directory_path in */*) ;; *) break ;; esac
+
+ # ...otherwise throw away the child directory and loop
+ _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
+ done
+ _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
+
+ func_mkdir_p_IFS=$IFS; IFS=:
+ for _G_dir in $_G_dir_list; do
+ IFS=$func_mkdir_p_IFS
+ # mkdir can fail with a 'File exist' error if two processes
+ # try to create one of the directories concurrently. Don't
+ # stop in that case!
+ $MKDIR "$_G_dir" 2>/dev/null || :
+ done
+ IFS=$func_mkdir_p_IFS
+
+ # Bail out if we (or some other process) failed to create a directory.
+ test -d "$_G_directory_path" || \
+ func_fatal_error "Failed to create '$1'"
+ fi
+}
+
+
+# func_mktempdir [BASENAME]
+# -------------------------
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible. If
+# given, BASENAME is the basename for that directory.
+func_mktempdir ()
+{
+ $debug_cmd
+
+ _G_template=${TMPDIR-/tmp}/${1-$progname}
+
+ if test : = "$opt_dry_run"; then
+ # Return a directory name, but don't create it in dry-run mode
+ _G_tmpdir=$_G_template-$$
+ else
+
+ # If mktemp works, use that first and foremost
+ _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
+
+ if test ! -d "$_G_tmpdir"; then
+ # Failing that, at least try and use $RANDOM to avoid a race
+ _G_tmpdir=$_G_template-${RANDOM-0}$$
+
+ func_mktempdir_umask=`umask`
+ umask 0077
+ $MKDIR "$_G_tmpdir"
+ umask $func_mktempdir_umask
+ fi
+
+ # If we're not in dry-run mode, bomb out on failure
+ test -d "$_G_tmpdir" || \
+ func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
+ fi
+
+ $ECHO "$_G_tmpdir"
+}
+
+
+# func_normal_abspath PATH
+# ------------------------
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+func_normal_abspath ()
+{
+ $debug_cmd
+
+ # These SED scripts presuppose an absolute path with a trailing slash.
+ _G_pathcar='s|^/\([^/]*\).*$|\1|'
+ _G_pathcdr='s|^/[^/]*||'
+ _G_removedotparts=':dotsl
+ s|/\./|/|g
+ t dotsl
+ s|/\.$|/|'
+ _G_collapseslashes='s|/\{1,\}|/|g'
+ _G_finalslash='s|/*$|/|'
+
+ # Start from root dir and reassemble the path.
+ func_normal_abspath_result=
+ func_normal_abspath_tpath=$1
+ func_normal_abspath_altnamespace=
+ case $func_normal_abspath_tpath in
+ "")
+ # Empty path, that just means $cwd.
+ func_stripname '' '/' "`pwd`"
+ func_normal_abspath_result=$func_stripname_result
+ return
+ ;;
+ # The next three entries are used to spot a run of precisely
+ # two leading slashes without using negated character classes;
+ # we take advantage of case's first-match behaviour.
+ ///*)
+ # Unusual form of absolute path, do nothing.
+ ;;
+ //*)
+ # Not necessarily an ordinary path; POSIX reserves leading '//'
+ # and for example Cygwin uses it to access remote file shares
+ # over CIFS/SMB, so we conserve a leading double slash if found.
+ func_normal_abspath_altnamespace=/
+ ;;
+ /*)
+ # Absolute path, do nothing.
+ ;;
+ *)
+ # Relative path, prepend $cwd.
+ func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+ ;;
+ esac
+
+ # Cancel out all the simple stuff to save iterations. We also want
+ # the path to end with a slash for ease of parsing, so make sure
+ # there is one (and only one) here.
+ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
+ while :; do
+ # Processed it all yet?
+ if test / = "$func_normal_abspath_tpath"; then
+ # If we ascended to the root using ".." the result may be empty now.
+ if test -z "$func_normal_abspath_result"; then
+ func_normal_abspath_result=/
+ fi
+ break
+ fi
+ func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$_G_pathcar"`
+ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$_G_pathcdr"`
+ # Figure out what to do with it
+ case $func_normal_abspath_tcomponent in
+ "")
+ # Trailing empty path component, ignore it.
+ ;;
+ ..)
+ # Parent dir; strip last assembled component from result.
+ func_dirname "$func_normal_abspath_result"
+ func_normal_abspath_result=$func_dirname_result
+ ;;
+ *)
+ # Actual path component, append it.
+ func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
+ ;;
+ esac
+ done
+ # Restore leading double-slash if one was found on entry.
+ func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+
+# func_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+ $debug_cmd
+
+ $opt_quiet || func_echo ${1+"$@"}
+
+ # A bug in bash halts the script if the last line of a function
+ # fails when set -e is in force, so we need another command to
+ # work around that:
+ :
+}
+
+
+# func_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+ $debug_cmd
+
+ func_relative_path_result=
+ func_normal_abspath "$1"
+ func_relative_path_tlibdir=$func_normal_abspath_result
+ func_normal_abspath "$2"
+ func_relative_path_tbindir=$func_normal_abspath_result
+
+ # Ascend the tree starting from libdir
+ while :; do
+ # check if we have found a prefix of bindir
+ case $func_relative_path_tbindir in
+ $func_relative_path_tlibdir)
+ # found an exact match
+ func_relative_path_tcancelled=
+ break
+ ;;
+ $func_relative_path_tlibdir*)
+ # found a matching prefix
+ func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+ func_relative_path_tcancelled=$func_stripname_result
+ if test -z "$func_relative_path_result"; then
+ func_relative_path_result=.
+ fi
+ break
+ ;;
+ *)
+ func_dirname $func_relative_path_tlibdir
+ func_relative_path_tlibdir=$func_dirname_result
+ if test -z "$func_relative_path_tlibdir"; then
+ # Have to descend all the way to the root!
+ func_relative_path_result=../$func_relative_path_result
+ func_relative_path_tcancelled=$func_relative_path_tbindir
+ break
+ fi
+ func_relative_path_result=../$func_relative_path_result
+ ;;
+ esac
+ done
+
+ # Now calculate path; take care to avoid doubling-up slashes.
+ func_stripname '' '/' "$func_relative_path_result"
+ func_relative_path_result=$func_stripname_result
+ func_stripname '/' '/' "$func_relative_path_tcancelled"
+ if test -n "$func_stripname_result"; then
+ func_append func_relative_path_result "/$func_stripname_result"
+ fi
+
+ # Normalisation. If bindir is libdir, return '.' else relative path.
+ if test -n "$func_relative_path_result"; then
+ func_stripname './' '' "$func_relative_path_result"
+ func_relative_path_result=$func_stripname_result
+ fi
+
+ test -n "$func_relative_path_result" || func_relative_path_result=.
+
+ :
+}
+
+
+# func_quote_portable EVAL ARG
+# ----------------------------
+# Internal function to portably implement func_quote_arg. Note that we still
+# keep attention to performance here so we as much as possible try to avoid
+# calling sed binary (so far O(N) complexity as long as func_append is O(1)).
+func_quote_portable ()
+{
+ $debug_cmd
+
+ $require_check_ifs_backslash
+
+ func_quote_portable_result=$2
+
+ # one-time-loop (easy break)
+ while true
+ do
+ if $1; then
+ func_quote_portable_result=`$ECHO "$2" | $SED \
+ -e "$sed_double_quote_subst" -e "$sed_double_backslash"`
+ break
+ fi
+
+ # Quote for eval.
+ case $func_quote_portable_result in
+ *[\\\`\"\$]*)
+ # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string
+ # contains the shell wildcard characters.
+ case $check_ifs_backshlash_broken$func_quote_portable_result in
+ :*|*[\[\*\?]*)
+ func_quote_portable_result=`$ECHO "$func_quote_portable_result" \
+ | $SED "$sed_quote_subst"`
+ break
+ ;;
+ esac
+
+ func_quote_portable_old_IFS=$IFS
+ for _G_char in '\' '`' '"' '$'
+ do
+ # STATE($1) PREV($2) SEPARATOR($3)
+ set start "" ""
+ func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy
+ IFS=$_G_char
+ for _G_part in $func_quote_portable_result
+ do
+ case $1 in
+ quote)
+ func_append func_quote_portable_result "$3$2"
+ set quote "$_G_part" "\\$_G_char"
+ ;;
+ start)
+ set first "" ""
+ func_quote_portable_result=
+ ;;
+ first)
+ set quote "$_G_part" ""
+ ;;
+ esac
+ done
+ done
+ IFS=$func_quote_portable_old_IFS
+ ;;
+ *) ;;
+ esac
+ break
+ done
+
+ func_quote_portable_unquoted_result=$func_quote_portable_result
+ case $func_quote_portable_result in
+ # double-quote args containing shell metacharacters to delay
+ # word splitting, command substitution and variable expansion
+ # for a subsequent eval.
+ # many bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ func_quote_portable_result=\"$func_quote_portable_result\"
+ ;;
+ esac
+}
+
+
+# func_quotefast_eval ARG
+# -----------------------
+# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG',
+# but optimized for speed. Result is stored in $func_quotefast_eval.
+if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then
+ printf -v _GL_test_printf_tilde %q '~'
+ if test '\~' = "$_GL_test_printf_tilde"; then
+ func_quotefast_eval ()
+ {
+ printf -v func_quotefast_eval_result %q "$1"
+ }
+ else
+ # Broken older Bash implementations. Make those faster too if possible.
+ func_quotefast_eval ()
+ {
+ case $1 in
+ '~'*)
+ func_quote_portable false "$1"
+ func_quotefast_eval_result=$func_quote_portable_result
+ ;;
+ *)
+ printf -v func_quotefast_eval_result %q "$1"
+ ;;
+ esac
+ }
+ fi
+else
+ func_quotefast_eval ()
+ {
+ func_quote_portable false "$1"
+ func_quotefast_eval_result=$func_quote_portable_result
+ }
+fi
+
+
+# func_quote_arg MODEs ARG
+# ------------------------
+# Quote one ARG to be evaled later. MODEs argument may contain zero or more
+# specifiers listed below separated by ',' character. This function returns two
+# values:
+# i) func_quote_arg_result
+# double-quoted (when needed), suitable for a subsequent eval
+# ii) func_quote_arg_unquoted_result
+# has all characters that are still active within double
+# quotes backslashified. Available only if 'unquoted' is specified.
+#
+# Available modes:
+# ----------------
+# 'eval' (default)
+# - escape shell special characters
+# 'expand'
+# - the same as 'eval'; but do not quote variable references
+# 'pretty'
+# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might
+# be used later in func_quote to get output like: 'echo "a b"' instead
+# of 'echo a\ b'. This is slower than default on some shells.
+# 'unquoted'
+# - produce also $func_quote_arg_unquoted_result which does not contain
+# wrapping double-quotes.
+#
+# Examples for 'func_quote_arg pretty,unquoted string':
+#
+# string | *_result | *_unquoted_result
+# ------------+-----------------------+-------------------
+# " | \" | \"
+# a b | "a b" | a b
+# "a b" | "\"a b\"" | \"a b\"
+# * | "*" | *
+# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\"
+#
+# Examples for 'func_quote_arg pretty,unquoted,expand string':
+#
+# string | *_result | *_unquoted_result
+# --------------+---------------------+--------------------
+# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\"
+func_quote_arg ()
+{
+ _G_quote_expand=false
+ case ,$1, in
+ *,expand,*)
+ _G_quote_expand=:
+ ;;
+ esac
+
+ case ,$1, in
+ *,pretty,*|*,expand,*|*,unquoted,*)
+ func_quote_portable $_G_quote_expand "$2"
+ func_quote_arg_result=$func_quote_portable_result
+ func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result
+ ;;
+ *)
+ # Faster quote-for-eval for some shells.
+ func_quotefast_eval "$2"
+ func_quote_arg_result=$func_quotefast_eval_result
+ ;;
+ esac
+}
+
+
+# func_quote MODEs ARGs...
+# ------------------------
+# Quote all ARGs to be evaled later and join them into single command. See
+# func_quote_arg's description for more info.
+func_quote ()
+{
+ $debug_cmd
+ _G_func_quote_mode=$1 ; shift
+ func_quote_result=
+ while test 0 -lt $#; do
+ func_quote_arg "$_G_func_quote_mode" "$1"
+ if test -n "$func_quote_result"; then
+ func_append func_quote_result " $func_quote_arg_result"
+ else
+ func_append func_quote_result "$func_quote_arg_result"
+ fi
+ shift
+ done
+}
+
+
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ eval 'func_stripname ()
+ {
+ $debug_cmd
+
+ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+ # positional parameters, so assign one to ordinary variable first.
+ func_stripname_result=$3
+ func_stripname_result=${func_stripname_result#"$1"}
+ func_stripname_result=${func_stripname_result%"$2"}
+ }'
+else
+ func_stripname ()
+ {
+ $debug_cmd
+
+ case $2 in
+ .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+ *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+ esac
+ }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is
+# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+ $debug_cmd
+
+ _G_cmd=$1
+ _G_fail_exp=${2-':'}
+
+ func_quote_arg pretty,expand "$_G_cmd"
+ eval "func_notquiet $func_quote_arg_result"
+
+ $opt_dry_run || {
+ eval "$_G_cmd"
+ _G_status=$?
+ if test 0 -ne "$_G_status"; then
+ eval "(exit $_G_status); $_G_fail_exp"
+ fi
+ }
+}
+
+
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is
+# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it. Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+ $debug_cmd
+
+ _G_cmd=$1
+ _G_fail_exp=${2-':'}
+
+ $opt_quiet || {
+ func_quote_arg expand,pretty "$_G_cmd"
+ eval "func_echo $func_quote_arg_result"
+ }
+
+ $opt_dry_run || {
+ eval "$_G_user_locale
+ $_G_cmd"
+ _G_status=$?
+ eval "$_G_safe_locale"
+ if test 0 -ne "$_G_status"; then
+ eval "(exit $_G_status); $_G_fail_exp"
+ fi
+ }
+}
+
+
+# func_tr_sh
+# ----------
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result. All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+ $debug_cmd
+
+ case $1 in
+ [0-9]* | *[!a-zA-Z0-9_]*)
+ func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+ ;;
+ * )
+ func_tr_sh_result=$1
+ ;;
+ esac
+}
+
+
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+ $debug_cmd
+
+ $opt_verbose && func_echo "$*"
+
+ :
+}
+
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
+{
+ $debug_cmd
+
+ $require_term_colors
+
+ func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+ $debug_cmd
+
+ # CATEGORY must be in the warning_categories list!
+ case " $warning_categories " in
+ *" $1 "*) ;;
+ *) func_internal_error "invalid warning category '$1'" ;;
+ esac
+
+ _G_category=$1
+ shift
+
+ case " $opt_warning_types " in
+ *" $_G_category "*) $warning_func ${1+"$@"} ;;
+ esac
+}
+
+
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+ $debug_cmd
+
+ printf '%s\n%s\n' "$1" "$2" \
+ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false. Use it like this:
+#
+# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+ $debug_cmd
+
+ test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+#! /bin/sh
+
+# A portable, pluggable option parser for Bourne shell.
+# Written by Gary V. Vaughan, 2010
+
+# This is free software. There is NO warranty; not even for
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Copyright (C) 2010-2019, 2021 Bootstrap Authors
+#
+# This file is dual licensed under the terms of the MIT license
+# <https://opensource.org/license/MIT>, and GPL version 2 or later
+# <http://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of
+# these licenses when using or redistributing this software or any of
+# the files within it. See the URLs above, or the file `LICENSE`
+# included in the Bootstrap distribution for the full license texts.
+
+# Please report bugs or propose patches to:
+# <https://github.com/gnulib-modules/bootstrap/issues>
+
+# Set a version string for this script.
+scriptversion=2019-02-19.15; # UTC
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+# #!/bin/sh
+# . relative/path/to/funclib.sh
+# . relative/path/to/options-parser
+# scriptversion=1.0
+# func_options ${1+"$@"}
+# eval set dummy "$func_options_result"; shift
+# ...rest of your script...
+#
+# In order for the '--version' option to work, you will need to have a
+# suitably formatted comment like the one at the top of this file
+# starting with '# Written by ' and ending with '# Copyright'.
+#
+# For '-h' and '--help' to work, you will also need a one line
+# description of your script's purpose in a comment directly above the
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug in processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'. Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+ --debug enable verbose shell tracing
+ -W, --warnings=CATEGORY
+ report the warnings falling in CATEGORY [all]
+ -v, --verbose verbosely report processing
+ --version print version information and exit
+ -h, --help print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+ 'all' show all warnings
+ 'none' turn off all the warnings
+ 'error' warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# This section contains functions for adding, removing, and running hooks
+# in the main code. A hook is just a list of function names that can be
+# run in order later on.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+ $debug_cmd
+
+ func_append hookable_fns " $1"
+}
+
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+ $debug_cmd
+
+ case " $hookable_fns " in
+ *" $1 "*) ;;
+ *) func_fatal_error "'$1' does not accept hook functions." ;;
+ esac
+
+ eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of hook functions to be called by
+# FUNC_NAME.
+func_remove_hook ()
+{
+ $debug_cmd
+
+ eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# func_propagate_result FUNC_NAME_A FUNC_NAME_B
+# ---------------------------------------------
+# If the *_result variable of FUNC_NAME_A _is set_, assign its value to
+# *_result variable of FUNC_NAME_B.
+func_propagate_result ()
+{
+ $debug_cmd
+
+ func_propagate_result_result=:
+ if eval "test \"\${${1}_result+set}\" = set"
+ then
+ eval "${2}_result=\$${1}_result"
+ else
+ func_propagate_result_result=false
+ fi
+}
+
+
+# func_run_hooks FUNC_NAME [ARG]...
+# ---------------------------------
+# Run all hook functions registered to FUNC_NAME.
+# It's assumed that the list of hook functions contains nothing more
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+ $debug_cmd
+
+ case " $hookable_fns " in
+ *" $1 "*) ;;
+ *) func_fatal_error "'$1' does not support hook functions." ;;
+ esac
+
+ eval _G_hook_fns=\$$1_hooks; shift
+
+ for _G_hook in $_G_hook_fns; do
+ func_unset "${_G_hook}_result"
+ eval $_G_hook '${1+"$@"}'
+ func_propagate_result $_G_hook func_run_hooks
+ if $func_propagate_result_result; then
+ eval set dummy "$func_run_hooks_result"; shift
+ fi
+ done
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# In order to add your own option parsing hooks, you must accept the
+# full positional parameter list from your hook function. You may remove
+# or edit any options that you action, and then pass back the remaining
+# unprocessed options in '<hooked_function_name>_result', escaped
+# suitably for 'eval'.
+#
+# The '<hooked_function_name>_result' variable is automatically unset
+# before your hook gets called; for best performance, only set the
+# *_result variable when necessary (i.e. don't call the 'func_quote'
+# function unnecessarily because it can be an expensive operation on some
+# machines).
+#
+# Like this:
+#
+# my_options_prep ()
+# {
+# $debug_cmd
+#
+# # Extend the existing usage message.
+# usage_message=$usage_message'
+# -s, --silent don'\''t print informational messages
+# '
+# # No change in '$@' (ignored completely by this hook). Leave
+# # my_options_prep_result variable intact.
+# }
+# func_add_hook func_options_prep my_options_prep
+#
+#
+# my_silent_option ()
+# {
+# $debug_cmd
+#
+# args_changed=false
+#
+# # Note that, for efficiency, we parse as many options as we can
+# # recognise in a loop before passing the remainder back to the
+# # caller on the first unrecognised argument we encounter.
+# while test $# -gt 0; do
+# opt=$1; shift
+# case $opt in
+# --silent|-s) opt_silent=:
+# args_changed=:
+# ;;
+# # Separate non-argument short options:
+# -s*) func_split_short_opt "$_G_opt"
+# set dummy "$func_split_short_opt_name" \
+# "-$func_split_short_opt_arg" ${1+"$@"}
+# shift
+# args_changed=:
+# ;;
+# *) # Make sure the first unrecognised option "$_G_opt"
+# # is added back to "$@" in case we need it later,
+# # if $args_changed was set to 'true'.
+# set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+# esac
+# done
+#
+# # Only call 'func_quote' here if we processed at least one argument.
+# if $args_changed; then
+# func_quote eval ${1+"$@"}
+# my_silent_option_result=$func_quote_result
+# fi
+# }
+# func_add_hook func_parse_options my_silent_option
+#
+#
+# my_option_validation ()
+# {
+# $debug_cmd
+#
+# $opt_silent && $opt_verbose && func_fatal_help "\
+# '--silent' and '--verbose' options are mutually exclusive."
+# }
+# func_add_hook func_validate_options my_option_validation
+#
+# You'll also need to manually amend $usage_message to reflect the extra
+# options you parse. It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options_finish [ARG]...
+# ----------------------------
+# Finishing the option parse loop (call 'func_options' hooks ATM).
+func_options_finish ()
+{
+ $debug_cmd
+
+ func_run_hooks func_options ${1+"$@"}
+ func_propagate_result func_run_hooks func_options_finish
+}
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+func_options ()
+{
+ $debug_cmd
+
+ _G_options_quoted=false
+
+ for my_func in options_prep parse_options validate_options options_finish
+ do
+ func_unset func_${my_func}_result
+ func_unset func_run_hooks_result
+ eval func_$my_func '${1+"$@"}'
+ func_propagate_result func_$my_func func_options
+ if $func_propagate_result_result; then
+ eval set dummy "$func_options_result"; shift
+ _G_options_quoted=:
+ fi
+ done
+
+ $_G_options_quoted || {
+ # As we (func_options) are top-level options-parser function and
+ # nobody quoted "$@" for us yet, we need to do it explicitly for
+ # caller.
+ func_quote eval ${1+"$@"}
+ func_options_result=$func_quote_result
+ }
+}
+
+
+# func_options_prep [ARG]...
+# --------------------------
+# All initialisations required before starting the option parse loop.
+# Note that when calling hook functions, we pass through the list of
+# positional parameters. If a hook function modifies that list, and
+# needs to propagate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before returning.
+func_hookable func_options_prep
+func_options_prep ()
+{
+ $debug_cmd
+
+ # Option defaults:
+ opt_verbose=false
+ opt_warning_types=
+
+ func_run_hooks func_options_prep ${1+"$@"}
+ func_propagate_result func_run_hooks func_options_prep
+}
+
+
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
+{
+ $debug_cmd
+
+ _G_parse_options_requote=false
+ # this just eases exit handling
+ while test $# -gt 0; do
+ # Defer to hook functions for initial option parsing, so they
+ # get priority in the event of reusing an option name.
+ func_run_hooks func_parse_options ${1+"$@"}
+ func_propagate_result func_run_hooks func_parse_options
+ if $func_propagate_result_result; then
+ eval set dummy "$func_parse_options_result"; shift
+ # Even though we may have changed "$@", we passed the "$@" array
+ # down into the hook and it quoted it for us (because we are in
+ # this if-branch). No need to quote it again.
+ _G_parse_options_requote=false
+ fi
+
+ # Break out of the loop if we already parsed every option.
+ test $# -gt 0 || break
+
+ # We expect that one of the options parsed in this function matches
+ # and thus we remove _G_opt from "$@" and need to re-quote.
+ _G_match_parse_options=:
+ _G_opt=$1
+ shift
+ case $_G_opt in
+ --debug|-x) debug_cmd='set -x'
+ func_echo "enabling shell trace mode" >&2
+ $debug_cmd
+ ;;
+
+ --no-warnings|--no-warning|--no-warn)
+ set dummy --warnings none ${1+"$@"}
+ shift
+ ;;
+
+ --warnings|--warning|-W)
+ if test $# = 0 && func_missing_arg $_G_opt; then
+ _G_parse_options_requote=:
+ break
+ fi
+ case " $warning_categories $1" in
+ *" $1 "*)
+ # trailing space prevents matching last $1 above
+ func_append_uniq opt_warning_types " $1"
+ ;;
+ *all)
+ opt_warning_types=$warning_categories
+ ;;
+ *none)
+ opt_warning_types=none
+ warning_func=:
+ ;;
+ *error)
+ opt_warning_types=$warning_categories
+ warning_func=func_fatal_error
+ ;;
+ *)
+ func_fatal_error \
+ "unsupported warning category: '$1'"
+ ;;
+ esac
+ shift
+ ;;
+
+ --verbose|-v) opt_verbose=: ;;
+ --version) func_version ;;
+ -\?|-h) func_usage ;;
+ --help) func_help ;;
+
+ # Separate optargs to long options (plugins may need this):
+ --*=*) func_split_equals "$_G_opt"
+ set dummy "$func_split_equals_lhs" \
+ "$func_split_equals_rhs" ${1+"$@"}
+ shift
+ ;;
+
+ # Separate optargs to short options:
+ -W*)
+ func_split_short_opt "$_G_opt"
+ set dummy "$func_split_short_opt_name" \
+ "$func_split_short_opt_arg" ${1+"$@"}
+ shift
+ ;;
+
+ # Separate non-argument short options:
+ -\?*|-h*|-v*|-x*)
+ func_split_short_opt "$_G_opt"
+ set dummy "$func_split_short_opt_name" \
+ "-$func_split_short_opt_arg" ${1+"$@"}
+ shift
+ ;;
+
+ --) _G_parse_options_requote=: ; break ;;
+ -*) func_fatal_help "unrecognised option: '$_G_opt'" ;;
+ *) set dummy "$_G_opt" ${1+"$@"}; shift
+ _G_match_parse_options=false
+ break
+ ;;
+ esac
+
+ if $_G_match_parse_options; then
+ _G_parse_options_requote=:
+ fi
+ done
+
+ if $_G_parse_options_requote; then
+ # save modified positional parameters for caller
+ func_quote eval ${1+"$@"}
+ func_parse_options_result=$func_quote_result
+ fi
+}
+
+
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
+{
+ $debug_cmd
+
+ # Display all warnings if -W was not given.
+ test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
+
+ func_run_hooks func_validate_options ${1+"$@"}
+ func_propagate_result func_run_hooks func_validate_options
+
+ # Bail if the options were screwed!
+ $exit_cmd $EXIT_FAILURE
+}
+
+
+
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
+
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+ $debug_cmd
+
+ eval \$ECHO \""Usage: $usage"\"
+ eval \$ECHO \""$fatal_help"\"
+ func_error ${1+"$@"}
+ exit $EXIT_FAILURE
+}
+
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
+func_help ()
+{
+ $debug_cmd
+
+ func_usage_message
+ $ECHO "$long_help_message"
+ exit 0
+}
+
+
+# func_missing_arg ARGNAME
+# ------------------------
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+ $debug_cmd
+
+ func_error "Missing argument for '$1'."
+ exit_cmd=exit
+}
+
+
+# func_split_equals STRING
+# ------------------------
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables
+# after splitting STRING at the '=' sign.
+test -z "$_G_HAVE_XSI_OPS" \
+ && (eval 'x=a/b/c;
+ test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+ && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+ # This is an XSI compatible shell, allowing a faster implementation...
+ eval 'func_split_equals ()
+ {
+ $debug_cmd
+
+ func_split_equals_lhs=${1%%=*}
+ func_split_equals_rhs=${1#*=}
+ if test "x$func_split_equals_lhs" = "x$1"; then
+ func_split_equals_rhs=
+ fi
+ }'
+else
+ # ...otherwise fall back to using expr, which is often a shell builtin.
+ func_split_equals ()
+ {
+ $debug_cmd
+
+ func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+ func_split_equals_rhs=
+ test "x$func_split_equals_lhs=" = "x$1" \
+ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+ }
+fi #func_split_equals
+
+
+# func_split_short_opt SHORTOPT
+# -----------------------------
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+ # This is an XSI compatible shell, allowing a faster implementation...
+ eval 'func_split_short_opt ()
+ {
+ $debug_cmd
+
+ func_split_short_opt_arg=${1#??}
+ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+ }'
+else
+ # ...otherwise fall back to using expr, which is often a shell builtin.
+ func_split_short_opt ()
+ {
+ $debug_cmd
+
+ func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'`
+ func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+ }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+ $debug_cmd
+
+ func_usage_message
+ $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+ exit 0
+}
+
+
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
+{
+ $debug_cmd
+
+ eval \$ECHO \""Usage: $usage"\"
+ echo
+ $SED -n 's|^# ||
+ /^Written by/{
+ x;p;x
+ }
+ h
+ /^Written by/q' < "$progpath"
+ echo
+ eval \$ECHO \""$usage_message"\"
+}
+
+
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+# The version message is extracted from the calling file's header
+# comments, with leading '# ' stripped:
+# 1. First display the progname and version
+# 2. Followed by the header comment line matching /^# Written by /
+# 3. Then a blank line followed by the first following line matching
+# /^# Copyright /
+# 4. Immediately followed by any lines between the previous matches,
+# except lines preceding the intervening completely blank line.
+# For example, see the header comments of this file.
+func_version ()
+{
+ $debug_cmd
+
+ printf '%s\n' "$progname $scriptversion"
+ $SED -n '
+ /^# Written by /!b
+ s|^# ||; p; n
+
+ :fwd2blnk
+ /./ {
+ n
+ b fwd2blnk
+ }
+ p; n
+
+ :holdwrnt
+ s|^# ||
+ s|^# *$||
+ /^Copyright /!{
+ /./H
+ n
+ b holdwrnt
+ }
+
+ s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+ G
+ s|\(\n\)\n*|\1|g
+ p; q' < "$progpath"
+
+ exit $?
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.7'
+
+
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
+{
+ $debug_cmd
+
+ _G_message=$*
+
+ func_echo_IFS=$IFS
+ IFS=$nl
+ for _G_line in $_G_message; do
+ IFS=$func_echo_IFS
+ $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+ done
+ IFS=$func_echo_IFS
+}
+
+
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
+{
+ $debug_cmd
+
+ $warning_func ${1+"$@"}
+}
+
+
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+ --config show all configuration variables
+ --debug enable verbose shell tracing
+ -n, --dry-run display commands without modifying any files
+ --features display basic configuration information and exit
+ --mode=MODE use operation mode MODE
+ --no-warnings equivalent to '-Wnone'
+ --preserve-dup-deps don't remove duplicate dependency libraries
+ --quiet, --silent don't print informational messages
+ --tag=TAG use configuration variables from tag TAG
+ -v, --verbose print more informational messages than default
+ --version print version information
+ -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all]
+ -h, --help, --help-all print short, long, or detailed help message
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
+{
+ $debug_cmd
+
+ func_usage_message
+ $ECHO "$long_help_message
+
+MODE must be one of the following:
+
+ clean remove files from the build directory
+ compile compile a source file into a libtool object
+ execute automatically set library path, then run a program
+ finish complete the installation of libtool libraries
+ install install libraries or executables
+ link create a library or an executable
+ uninstall remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE. When passed as first option,
+'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+Try '$progname --help --mode=MODE' for a more detailed description of MODE.
+
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+
+ host-triplet: $host
+ shell: $SHELL
+ compiler: $LTCC
+ compiler flags: $LTCFLAGS
+ linker: $LD (gnu? $with_gnu_ld)
+ version: $progname (GNU libtool) 2.4.7
+ automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
+ autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`
+
+Report bugs to <bug-libtool@gnu.org>.
+GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+ exit 0
+}
+
+
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
+
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ eval 'func_lo2o ()
+ {
+ case $1 in
+ *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+ * ) func_lo2o_result=$1 ;;
+ esac
+ }'
+
+ # func_xform LIBOBJ-OR-SOURCE
+ # ---------------------------
+ # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+ # suffix to a '.lo' libtool-object suffix.
+ eval 'func_xform ()
+ {
+ func_xform_result=${1%.*}.lo
+ }'
+else
+ # ...otherwise fall back to using sed.
+ func_lo2o ()
+ {
+ func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+ }
+
+ func_xform ()
+ {
+ func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+ }
+fi
+
+
+# func_fatal_configuration ARG...
+# -------------------------------
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+ func_fatal_error ${1+"$@"} \
+ "See the $PACKAGE documentation for more information." \
+ "Fatal configuration error."
+}
+
+
+# func_config
+# -----------
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+ re_begincf='^# ### BEGIN LIBTOOL'
+ re_endcf='^# ### END LIBTOOL'
+
+ # Default configuration.
+ $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+ # Now print the configurations for the tags.
+ for tagname in $taglist; do
+ $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+ done
+
+ exit $?
+}
+
+
+# func_features
+# -------------
+# Display the features supported by this script.
+func_features ()
+{
+ echo "host: $host"
+ if test yes = "$build_libtool_libs"; then
+ echo "enable shared libraries"
+ else
+ echo "disable shared libraries"
+ fi
+ if test yes = "$build_old_libs"; then
+ echo "enable static libraries"
+ else
+ echo "disable static libraries"
+ fi
+
+ exit $?
+}
+
+
+# func_enable_tag TAGNAME
+# -----------------------
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag. We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+ # Global variable:
+ tagname=$1
+
+ re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+ re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+ sed_extractcf=/$re_begincf/,/$re_endcf/p
+
+ # Validate tagname.
+ case $tagname in
+ *[!-_A-Za-z0-9,/]*)
+ func_fatal_error "invalid tag name: $tagname"
+ ;;
+ esac
+
+ # Don't test for the "default" C tag, as we know it's
+ # there but not specially marked.
+ case $tagname in
+ CC) ;;
+ *)
+ if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+ taglist="$taglist $tagname"
+
+ # Evaluate the configuration. Be careful to quote the path
+ # and the sed script, to avoid splitting on whitespace, but
+ # also don't use non-portable quotes within backquotes within
+ # quotes we have to do it in 2 steps:
+ extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+ eval "$extractedcf"
+ else
+ func_error "ignoring unknown tag $tagname"
+ fi
+ ;;
+ esac
+}
+
+
+# func_check_version_match
+# ------------------------
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+ if test "$package_revision" != "$macro_revision"; then
+ if test "$VERSION" != "$macro_version"; then
+ if test -z "$macro_version"; then
+ cat >&2 <<_LT_EOF
+$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+ else
+ cat >&2 <<_LT_EOF
+$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+ fi
+ else
+ cat >&2 <<_LT_EOF
+$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+ fi
+
+ exit $EXIT_MISMATCH
+ fi
+}
+
+
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+ $debug_mode
+
+ # Option defaults:
+ opt_config=false
+ opt_dlopen=
+ opt_dry_run=false
+ opt_help=false
+ opt_mode=
+ opt_preserve_dup_deps=false
+ opt_quiet=false
+
+ nonopt=
+ preserve_args=
+
+ _G_rc_lt_options_prep=:
+
+ # Shorthand for --mode=foo, only valid as the first argument
+ case $1 in
+ clean|clea|cle|cl)
+ shift; set dummy --mode clean ${1+"$@"}; shift
+ ;;
+ compile|compil|compi|comp|com|co|c)
+ shift; set dummy --mode compile ${1+"$@"}; shift
+ ;;
+ execute|execut|execu|exec|exe|ex|e)
+ shift; set dummy --mode execute ${1+"$@"}; shift
+ ;;
+ finish|finis|fini|fin|fi|f)
+ shift; set dummy --mode finish ${1+"$@"}; shift
+ ;;
+ install|instal|insta|inst|ins|in|i)
+ shift; set dummy --mode install ${1+"$@"}; shift
+ ;;
+ link|lin|li|l)
+ shift; set dummy --mode link ${1+"$@"}; shift
+ ;;
+ uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+ shift; set dummy --mode uninstall ${1+"$@"}; shift
+ ;;
+ *)
+ _G_rc_lt_options_prep=false
+ ;;
+ esac
+
+ if $_G_rc_lt_options_prep; then
+ # Pass back the list of options.
+ func_quote eval ${1+"$@"}
+ libtool_options_prep_result=$func_quote_result
+ fi
+}
+func_add_hook func_options_prep libtool_options_prep
+
+
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
+{
+ $debug_cmd
+
+ _G_rc_lt_parse_options=false
+
+ # Perform our own loop to consume as many options as possible in
+ # each iteration.
+ while test $# -gt 0; do
+ _G_match_lt_parse_options=:
+ _G_opt=$1
+ shift
+ case $_G_opt in
+ --dry-run|--dryrun|-n)
+ opt_dry_run=:
+ ;;
+
+ --config) func_config ;;
+
+ --dlopen|-dlopen)
+ opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+ shift
+ ;;
+
+ --preserve-dup-deps)
+ opt_preserve_dup_deps=: ;;
+
+ --features) func_features ;;
+
+ --finish) set dummy --mode finish ${1+"$@"}; shift ;;
+
+ --help) opt_help=: ;;
+
+ --help-all) opt_help=': help-all' ;;
+
+ --mode) test $# = 0 && func_missing_arg $_G_opt && break
+ opt_mode=$1
+ case $1 in
+ # Valid mode arguments:
+ clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+ # Catch anything else as an error
+ *) func_error "invalid argument for $_G_opt"
+ exit_cmd=exit
+ break
+ ;;
+ esac
+ shift
+ ;;
+
+ --no-silent|--no-quiet)
+ opt_quiet=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --no-warnings|--no-warning|--no-warn)
+ opt_warning=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --no-verbose)
+ opt_verbose=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --silent|--quiet)
+ opt_quiet=:
+ opt_verbose=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --tag) test $# = 0 && func_missing_arg $_G_opt && break
+ opt_tag=$1
+ func_append preserve_args " $_G_opt $1"
+ func_enable_tag "$1"
+ shift
+ ;;
+
+ --verbose|-v) opt_quiet=false
+ opt_verbose=:
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ # An option not handled by this hook function:
+ *) set dummy "$_G_opt" ${1+"$@"} ; shift
+ _G_match_lt_parse_options=false
+ break
+ ;;
+ esac
+ $_G_match_lt_parse_options && _G_rc_lt_parse_options=:
+ done
+
+ if $_G_rc_lt_parse_options; then
+ # save modified positional parameters for caller
+ func_quote eval ${1+"$@"}
+ libtool_parse_options_result=$func_quote_result
+ fi
+}
+func_add_hook func_parse_options libtool_parse_options
+
+
+
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+ # save first non-option argument
+ if test 0 -lt $#; then
+ nonopt=$1
+ shift
+ fi
+
+ # preserve --debug
+ test : = "$debug_cmd" || func_append preserve_args " --debug"
+
+ # Keeping compiler generated duplicates in $postdeps and $predeps is not
+ # harmful, and is necessary in a majority of systems that use it to satisfy
+ # symbol dependencies.
+ opt_duplicate_compiler_generated_deps=:
+
+ $opt_help || {
+ # Sanity checks first:
+ func_check_version_match
+
+ test yes != "$build_libtool_libs" \
+ && test yes != "$build_old_libs" \
+ && func_fatal_configuration "not configured to build any kind of library"
+
+ # Darwin sucks
+ eval std_shrext=\"$shrext_cmds\"
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
+ func_error "unrecognized option '-dlopen'"
+ $ECHO "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help=$help
+ help="Try '$progname --help --mode=$opt_mode' for more information."
+ }
+
+ # Pass back the unparsed argument list
+ func_quote eval ${1+"$@"}
+ libtool_validate_options_result=$func_quote_result
+}
+func_add_hook func_validate_options libtool_validate_options
+
+
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
+
+
+
+## ----------- ##
+## Main. ##
+## ----------- ##
+
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end. This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+ $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_p file
+# True iff FILE is a libtool '.la' library or '.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+ test -f "$1" &&
+ $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool '.la' library or '.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs. To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway. Works if 'file' does not exist.
+func_lalib_unsafe_p ()
+{
+ lalib_p=no
+ if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+ for lalib_p_l in 1 2 3 4
+ do
+ read lalib_p_line
+ case $lalib_p_line in
+ \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+ esac
+ done
+ exec 0<&5 5<&-
+ fi
+ test yes = "$lalib_p"
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+ test -f "$1" &&
+ $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+ func_ltwrapper_exec_suffix=
+ case $1 in
+ *.exe) ;;
+ *) func_ltwrapper_exec_suffix=.exe ;;
+ esac
+ $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+ func_dirname_and_basename "$1" "" "."
+ func_stripname '' '.exe' "$func_basename_result"
+ func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+ func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+ $debug_cmd
+
+ save_ifs=$IFS; IFS='~'
+ for cmd in $1; do
+ IFS=$sp$nl
+ eval cmd=\"$cmd\"
+ IFS=$save_ifs
+ func_show_eval "$cmd" "${2-:}"
+ done
+ IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)! Also, sourcing
+# 'FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+ $debug_cmd
+
+ case $1 in
+ */* | *\\*) . "$1" ;;
+ *) . "./$1" ;;
+ esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot. Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+ func_resolve_sysroot_result=$1
+ case $func_resolve_sysroot_result in
+ =*)
+ func_stripname '=' '' "$func_resolve_sysroot_result"
+ func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+ ;;
+ esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+ case $lt_sysroot:$1 in
+ ?*:"$lt_sysroot"*)
+ func_stripname "$lt_sysroot" '' "$1"
+ func_replace_sysroot_result='='$func_stripname_result
+ ;;
+ *)
+ # Including no sysroot.
+ func_replace_sysroot_result=$1
+ ;;
+ esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+ $debug_cmd
+
+ if test -n "$available_tags" && test -z "$tagname"; then
+ CC_quoted=
+ for arg in $CC; do
+ func_append_quoted CC_quoted "$arg"
+ done
+ CC_expanded=`func_echo_all $CC`
+ CC_quoted_expanded=`func_echo_all $CC_quoted`
+ case $@ in
+ # Blanks in the command may have been stripped by the calling shell,
+ # but not from the CC environment variable when configure was run.
+ " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+ # Blanks at the start of $base_compile will cause this to fail
+ # if we don't check for them as well.
+ *)
+ for z in $available_tags; do
+ if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+ # Evaluate the configuration.
+ eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+ CC_quoted=
+ for arg in $CC; do
+ # Double-quote args containing other shell metacharacters.
+ func_append_quoted CC_quoted "$arg"
+ done
+ CC_expanded=`func_echo_all $CC`
+ CC_quoted_expanded=`func_echo_all $CC_quoted`
+ case "$@ " in
+ " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+ # The compiler in the base compile command matches
+ # the one in the tagged configuration.
+ # Assume this is the tagged configuration we want.
+ tagname=$z
+ break
+ ;;
+ esac
+ fi
+ done
+ # If $tagname still isn't set, then no tagged configuration
+ # was found and let the user know that the "--tag" command
+ # line option must be used.
+ if test -z "$tagname"; then
+ func_echo "unable to infer tagged configuration"
+ func_fatal_error "specify a tag with '--tag'"
+# else
+# func_verbose "using $tagname tagged configuration"
+ fi
+ ;;
+ esac
+ fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+ write_libobj=$1
+ if test yes = "$build_libtool_libs"; then
+ write_lobj=\'$2\'
+ else
+ write_lobj=none
+ fi
+
+ if test yes = "$build_old_libs"; then
+ write_oldobj=\'$3\'
+ else
+ write_oldobj=none
+ fi
+
+ $opt_dry_run || {
+ cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+ $MV "${write_libobj}T" "$write_libobj"
+ }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+ $debug_cmd
+
+ func_convert_core_file_wine_to_w32_result=$1
+ if test -n "$1"; then
+ # Unfortunately, winepath does not exit with a non-zero error code, so we
+ # are forced to check the contents of stdout. On the other hand, if the
+ # command is not found, the shell will set an exit code of 127 and print
+ # *an error message* to stdout. So we must check for both error code of
+ # zero AND non-empty stdout, which explains the odd construction:
+ func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+ if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
+ func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+ $SED -e "$sed_naive_backslashify"`
+ else
+ func_convert_core_file_wine_to_w32_result=
+ fi
+ fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+ $debug_cmd
+
+ # unfortunately, winepath doesn't convert paths, only file names
+ func_convert_core_path_wine_to_w32_result=
+ if test -n "$1"; then
+ oldIFS=$IFS
+ IFS=:
+ for func_convert_core_path_wine_to_w32_f in $1; do
+ IFS=$oldIFS
+ func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+ if test -n "$func_convert_core_file_wine_to_w32_result"; then
+ if test -z "$func_convert_core_path_wine_to_w32_result"; then
+ func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
+ else
+ func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+ fi
+ fi
+ done
+ IFS=$oldIFS
+ fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+ $debug_cmd
+
+ if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+ func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+ if test "$?" -ne 0; then
+ # on failure, ensure result is empty
+ func_cygpath_result=
+ fi
+ else
+ func_cygpath_result=
+ func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
+ fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format. Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+ $debug_cmd
+
+ # awkward: cmd appends spaces to result
+ func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+ $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+ $debug_cmd
+
+ if test -z "$2" && test -n "$1"; then
+ func_error "Could not determine host file name corresponding to"
+ func_error " '$1'"
+ func_error "Continuing, but uninstalled executables may not work."
+ # Fallback:
+ func_to_host_file_result=$1
+ fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+ $debug_cmd
+
+ if test -z "$4" && test -n "$3"; then
+ func_error "Could not determine the host path corresponding to"
+ func_error " '$3'"
+ func_error "Continuing, but uninstalled executables may not work."
+ # Fallback. This is a deliberately simplistic "conversion" and
+ # should not be "improved". See libtool.info.
+ if test "x$1" != "x$2"; then
+ lt_replace_pathsep_chars="s|$1|$2|g"
+ func_to_host_path_result=`echo "$3" |
+ $SED -e "$lt_replace_pathsep_chars"`
+ else
+ func_to_host_path_result=$3
+ fi
+ fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+ $debug_cmd
+
+ case $4 in
+ $1 ) func_to_host_path_result=$3$func_to_host_path_result
+ ;;
+ esac
+ case $4 in
+ $2 ) func_append func_to_host_path_result "$3"
+ ;;
+ esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via '$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+ $debug_cmd
+
+ $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result. If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+ $debug_cmd
+
+ case ,$2, in
+ *,"$to_tool_file_cmd",*)
+ func_to_tool_file_result=$1
+ ;;
+ *)
+ $to_tool_file_cmd "$1"
+ func_to_tool_file_result=$func_to_host_file_result
+ ;;
+ esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+ func_to_host_file_result=$1
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper. Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+ $debug_cmd
+
+ func_to_host_file_result=$1
+ if test -n "$1"; then
+ func_convert_core_msys_to_w32 "$1"
+ func_to_host_file_result=$func_convert_core_msys_to_w32_result
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format. Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+ $debug_cmd
+
+ func_to_host_file_result=$1
+ if test -n "$1"; then
+ # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+ # LT_CYGPATH in this case.
+ func_to_host_file_result=`cygpath -m "$1"`
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format. Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+ $debug_cmd
+
+ func_to_host_file_result=$1
+ if test -n "$1"; then
+ func_convert_core_file_wine_to_w32 "$1"
+ func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+ $debug_cmd
+
+ func_to_host_file_result=$1
+ if test -n "$1"; then
+ func_convert_core_msys_to_w32 "$1"
+ func_cygpath -u "$func_convert_core_msys_to_w32_result"
+ func_to_host_file_result=$func_cygpath_result
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set. Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+ $debug_cmd
+
+ func_to_host_file_result=$1
+ if test -n "$1"; then
+ # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+ func_convert_core_file_wine_to_w32 "$1"
+ func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+ func_to_host_file_result=$func_cygpath_result
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via '$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format. If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+# file name conversion function : func_convert_file_X_to_Y ()
+# path conversion function : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same. If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+ $debug_cmd
+
+ if test -z "$to_host_path_cmd"; then
+ func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+ to_host_path_cmd=func_convert_path_$func_stripname_result
+ fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+ $debug_cmd
+
+ func_init_to_host_path_cmd
+ $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+ func_to_host_path_result=$1
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper. Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+ $debug_cmd
+
+ func_to_host_path_result=$1
+ if test -n "$1"; then
+ # Remove leading and trailing path separator characters from ARG. MSYS
+ # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+ # and winepath ignores them completely.
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+ func_to_host_path_result=$func_convert_core_msys_to_w32_result
+ func_convert_path_check : ";" \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+ fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format. Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+ $debug_cmd
+
+ func_to_host_path_result=$1
+ if test -n "$1"; then
+ # See func_convert_path_msys_to_w32:
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+ func_convert_path_check : ";" \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+ fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format. Requires a wine environment and
+# a working winepath. Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+ $debug_cmd
+
+ func_to_host_path_result=$1
+ if test -n "$1"; then
+ # See func_convert_path_msys_to_w32:
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+ func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
+ func_convert_path_check : ";" \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+ fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+ $debug_cmd
+
+ func_to_host_path_result=$1
+ if test -n "$1"; then
+ # See func_convert_path_msys_to_w32:
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+ func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+ func_to_host_path_result=$func_cygpath_result
+ func_convert_path_check : : \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+ fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set. Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+ $debug_cmd
+
+ func_to_host_path_result=$1
+ if test -n "$1"; then
+ # Remove leading and trailing path separator characters from
+ # ARG. msys behavior is inconsistent here, cygpath turns them
+ # into '.;' and ';.', and winepath ignores them completely.
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+ func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+ func_to_host_path_result=$func_cygpath_result
+ func_convert_path_check : : \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+ fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+ $debug_cmd
+
+ func_dll_def_p_tmp=`$SED -n \
+ -e 's/^[ ]*//' \
+ -e '/^\(;.*\)*$/d' \
+ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \
+ -e q \
+ "$1"`
+ test DEF = "$func_dll_def_p_tmp"
+}
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+ $debug_cmd
+
+ # Get the compilation command and the source file.
+ base_compile=
+ srcfile=$nonopt # always keep a non-empty value in "srcfile"
+ suppress_opt=yes
+ suppress_output=
+ arg_mode=normal
+ libobj=
+ later=
+ pie_flag=
+
+ for arg
+ do
+ case $arg_mode in
+ arg )
+ # do not "continue". Instead, add this to base_compile
+ lastarg=$arg
+ arg_mode=normal
+ ;;
+
+ target )
+ libobj=$arg
+ arg_mode=normal
+ continue
+ ;;
+
+ normal )
+ # Accept any command-line options.
+ case $arg in
+ -o)
+ test -n "$libobj" && \
+ func_fatal_error "you cannot specify '-o' more than once"
+ arg_mode=target
+ continue
+ ;;
+
+ -pie | -fpie | -fPIE)
+ func_append pie_flag " $arg"
+ continue
+ ;;
+
+ -shared | -static | -prefer-pic | -prefer-non-pic)
+ func_append later " $arg"
+ continue
+ ;;
+
+ -no-suppress)
+ suppress_opt=no
+ continue
+ ;;
+
+ -Xcompiler)
+ arg_mode=arg # the next one goes into the "base_compile" arg list
+ continue # The current "srcfile" will either be retained or
+ ;; # replaced later. I would guess that would be a bug.
+
+ -Wc,*)
+ func_stripname '-Wc,' '' "$arg"
+ args=$func_stripname_result
+ lastarg=
+ save_ifs=$IFS; IFS=,
+ for arg in $args; do
+ IFS=$save_ifs
+ func_append_quoted lastarg "$arg"
+ done
+ IFS=$save_ifs
+ func_stripname ' ' '' "$lastarg"
+ lastarg=$func_stripname_result
+
+ # Add the arguments to base_compile.
+ func_append base_compile " $lastarg"
+ continue
+ ;;
+
+ *)
+ # Accept the current argument as the source file.
+ # The previous "srcfile" becomes the current argument.
+ #
+ lastarg=$srcfile
+ srcfile=$arg
+ ;;
+ esac # case $arg
+ ;;
+ esac # case $arg_mode
+
+ # Aesthetically quote the previous argument.
+ func_append_quoted base_compile "$lastarg"
+ done # for arg
+
+ case $arg_mode in
+ arg)
+ func_fatal_error "you must specify an argument for -Xcompile"
+ ;;
+ target)
+ func_fatal_error "you must specify a target with '-o'"
+ ;;
+ *)
+ # Get the name of the library object.
+ test -z "$libobj" && {
+ func_basename "$srcfile"
+ libobj=$func_basename_result
+ }
+ ;;
+ esac
+
+ # Recognize several different file suffixes.
+ # If the user specifies -o file.o, it is replaced with file.lo
+ case $libobj in
+ *.[cCFSifmso] | \
+ *.ada | *.adb | *.ads | *.asm | \
+ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+ func_xform "$libobj"
+ libobj=$func_xform_result
+ ;;
+ esac
+
+ case $libobj in
+ *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+ *)
+ func_fatal_error "cannot determine name of library object from '$libobj'"
+ ;;
+ esac
+
+ func_infer_tag $base_compile
+
+ for arg in $later; do
+ case $arg in
+ -shared)
+ test yes = "$build_libtool_libs" \
+ || func_fatal_configuration "cannot build a shared library"
+ build_old_libs=no
+ continue
+ ;;
+
+ -static)
+ build_libtool_libs=no
+ build_old_libs=yes
+ continue
+ ;;
+
+ -prefer-pic)
+ pic_mode=yes
+ continue
+ ;;
+
+ -prefer-non-pic)
+ pic_mode=no
+ continue
+ ;;
+ esac
+ done
+
+ func_quote_arg pretty "$libobj"
+ test "X$libobj" != "X$func_quote_arg_result" \
+ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \
+ && func_warning "libobj name '$libobj' may not contain shell special characters."
+ func_dirname_and_basename "$obj" "/" ""
+ objname=$func_basename_result
+ xdir=$func_dirname_result
+ lobj=$xdir$objdir/$objname
+
+ test -z "$base_compile" && \
+ func_fatal_help "you must specify a compilation command"
+
+ # Delete any leftover library objects.
+ if test yes = "$build_old_libs"; then
+ removelist="$obj $lobj $libobj ${libobj}T"
+ else
+ removelist="$lobj $libobj ${libobj}T"
+ fi
+
+ # On Cygwin there's no "real" PIC flag so we must build both object types
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2* | cegcc*)
+ pic_mode=default
+ ;;
+ esac
+ if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
+ # non-PIC code in shared libraries is not supported
+ pic_mode=default
+ fi
+
+ # Calculate the filename of the output object if compiler does
+ # not support -o with -c
+ if test no = "$compiler_c_o"; then
+ output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
+ lockfile=$output_obj.lock
+ else
+ output_obj=
+ need_locks=no
+ lockfile=
+ fi
+
+ # Lock this critical section if it is needed
+ # We use this script file to make the link, it avoids creating a new file
+ if test yes = "$need_locks"; then
+ until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+ func_echo "Waiting for $lockfile to be removed"
+ sleep 2
+ done
+ elif test warn = "$need_locks"; then
+ if test -f "$lockfile"; then
+ $ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $opt_dry_run || $RM $removelist
+ exit $EXIT_FAILURE
+ fi
+ func_append removelist " $output_obj"
+ $ECHO "$srcfile" > "$lockfile"
+ fi
+
+ $opt_dry_run || $RM $removelist
+ func_append removelist " $lockfile"
+ trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+ func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+ srcfile=$func_to_tool_file_result
+ func_quote_arg pretty "$srcfile"
+ qsrcfile=$func_quote_arg_result
+
+ # Only build a PIC object if we are building libtool libraries.
+ if test yes = "$build_libtool_libs"; then
+ # Without this assignment, base_compile gets emptied.
+ fbsd_hideous_sh_bug=$base_compile
+
+ if test no != "$pic_mode"; then
+ command="$base_compile $qsrcfile $pic_flag"
+ else
+ # Don't build PIC code
+ command="$base_compile $qsrcfile"
+ fi
+
+ func_mkdir_p "$xdir$objdir"
+
+ if test -z "$output_obj"; then
+ # Place PIC objects in $objdir
+ func_append command " -o $lobj"
+ fi
+
+ func_show_eval_locale "$command" \
+ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+ if test warn = "$need_locks" &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $opt_dry_run || $RM $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed, then go on to compile the next one
+ if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+ func_show_eval '$MV "$output_obj" "$lobj"' \
+ 'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+ fi
+
+ # Allow error messages only from the first compilation.
+ if test yes = "$suppress_opt"; then
+ suppress_output=' >/dev/null 2>&1'
+ fi
+ fi
+
+ # Only build a position-dependent object if we build old libraries.
+ if test yes = "$build_old_libs"; then
+ if test yes != "$pic_mode"; then
+ # Don't build PIC code
+ command="$base_compile $qsrcfile$pie_flag"
+ else
+ command="$base_compile $qsrcfile $pic_flag"
+ fi
+ if test yes = "$compiler_c_o"; then
+ func_append command " -o $obj"
+ fi
+
+ # Suppress compiler output if we already did a PIC compilation.
+ func_append command "$suppress_output"
+ func_show_eval_locale "$command" \
+ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+ if test warn = "$need_locks" &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $opt_dry_run || $RM $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed
+ if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+ func_show_eval '$MV "$output_obj" "$obj"' \
+ 'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+ fi
+ fi
+
+ $opt_dry_run || {
+ func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+ # Unlock the critical section if it was locked
+ if test no != "$need_locks"; then
+ removelist=$lockfile
+ $RM "$lockfile"
+ fi
+ }
+
+ exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+ test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+ # We need to display help for each of the modes.
+ case $opt_mode in
+ "")
+ # Generic help is extracted from the usage comments
+ # at the start of this file.
+ func_help
+ ;;
+
+ clean)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+ compile)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+ -o OUTPUT-FILE set the output file name to OUTPUT-FILE
+ -no-suppress do not suppress compiler output for multiple passes
+ -prefer-pic try to build PIC objects only
+ -prefer-non-pic try to build non-PIC objects only
+ -shared do not build a '.o' file suitable for static linking
+ -static only build a '.o' file suitable for static linking
+ -Wc,FLAG
+ -Xcompiler FLAG pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a 'standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix '.c' with the
+library object suffix, '.lo'."
+ ;;
+
+ execute)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+ -dlopen FILE add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to '-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+ ;;
+
+ finish)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges. Use
+the '--dry-run' option if you just want to see what would be executed."
+ ;;
+
+ install)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command. The first component should be
+either the 'install' or 'cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+ -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+ ;;
+
+ link)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+ -all-static do not do any dynamic linking at all
+ -avoid-version do not add a version suffix if possible
+ -bindir BINDIR specify path to binaries directory (for systems where
+ libraries must be found in the PATH setting at runtime)
+ -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime
+ -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
+ -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+ -export-symbols SYMFILE
+ try to export only the symbols listed in SYMFILE
+ -export-symbols-regex REGEX
+ try to export only the symbols matching REGEX
+ -LLIBDIR search LIBDIR for required installed libraries
+ -lNAME OUTPUT-FILE requires the installed library libNAME
+ -module build a library that can dlopened
+ -no-fast-install disable the fast-install mode
+ -no-install link a not-installable executable
+ -no-undefined declare that a library does not refer to external symbols
+ -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
+ -objectlist FILE use a list of object files found in FILE to specify objects
+ -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes)
+ -precious-files-regex REGEX
+ don't remove output files matching REGEX
+ -release RELEASE specify package release information
+ -rpath LIBDIR the created library will eventually be installed in LIBDIR
+ -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
+ -shared only do dynamic linking of libtool libraries
+ -shrext SUFFIX override the standard shared library file extension
+ -static do not do any dynamic linking of uninstalled libtool libraries
+ -static-libtool-libs
+ do not do any dynamic linking of libtool libraries
+ -version-info CURRENT[:REVISION[:AGE]]
+ specify library version info [each variable defaults to 0]
+ -weak LIBNAME declare that the target provides the LIBNAME interface
+ -Wc,FLAG
+ -Xcompiler FLAG pass linker-specific FLAG directly to the compiler
+ -Wa,FLAG
+ -Xassembler FLAG pass linker-specific FLAG directly to the assembler
+ -Wl,FLAG
+ -Xlinker FLAG pass linker-specific FLAG directly to the linker
+ -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with '-') are ignored.
+
+Every other argument is treated as a filename. Files ending in '.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in '.la', then a libtool library is created,
+only library objects ('.lo' files) may be specified, and '-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
+using 'ar' and 'ranlib', or on Windows using 'lib'.
+
+If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
+is created, otherwise an executable program is created."
+ ;;
+
+ uninstall)
+ $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+ *)
+ func_fatal_help "invalid operation mode '$opt_mode'"
+ ;;
+ esac
+
+ echo
+ $ECHO "Try '$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+ if test : = "$opt_help"; then
+ func_mode_help
+ else
+ {
+ func_help noexit
+ for opt_mode in compile link execute install finish uninstall clean; do
+ func_mode_help
+ done
+ } | $SED -n '1p; 2,$s/^Usage:/ or: /p'
+ {
+ func_help noexit
+ for opt_mode in compile link execute install finish uninstall clean; do
+ echo
+ func_mode_help
+ done
+ } |
+ $SED '1d
+ /^When reporting/,/^Report/{
+ H
+ d
+ }
+ $x
+ /information about other modes/d
+ /more detailed .*MODE/d
+ s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+ fi
+ exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+ $debug_cmd
+
+ # The first argument is the command name.
+ cmd=$nonopt
+ test -z "$cmd" && \
+ func_fatal_help "you must specify a COMMAND"
+
+ # Handle -dlopen flags immediately.
+ for file in $opt_dlopen; do
+ test -f "$file" \
+ || func_fatal_help "'$file' is not a file"
+
+ dir=
+ case $file in
+ *.la)
+ func_resolve_sysroot "$file"
+ file=$func_resolve_sysroot_result
+
+ # Check to see that this really is a libtool archive.
+ func_lalib_unsafe_p "$file" \
+ || func_fatal_help "'$lib' is not a valid libtool archive"
+
+ # Read the libtool library.
+ dlname=
+ library_names=
+ func_source "$file"
+
+ # Skip this library if it cannot be dlopened.
+ if test -z "$dlname"; then
+ # Warn if it was a shared library.
+ test -n "$library_names" && \
+ func_warning "'$file' was not linked with '-export-dynamic'"
+ continue
+ fi
+
+ func_dirname "$file" "" "."
+ dir=$func_dirname_result
+
+ if test -f "$dir/$objdir/$dlname"; then
+ func_append dir "/$objdir"
+ else
+ if test ! -f "$dir/$dlname"; then
+ func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
+ fi
+ fi
+ ;;
+
+ *.lo)
+ # Just add the directory containing the .lo file.
+ func_dirname "$file" "" "."
+ dir=$func_dirname_result
+ ;;
+
+ *)
+ func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
+ continue
+ ;;
+ esac
+
+ # Get the absolute pathname.
+ absdir=`cd "$dir" && pwd`
+ test -n "$absdir" && dir=$absdir
+
+ # Now add the directory to shlibpath_var.
+ if eval "test -z \"\$$shlibpath_var\""; then
+ eval "$shlibpath_var=\"\$dir\""
+ else
+ eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+ fi
+ done
+
+ # This variable tells wrapper scripts just to set shlibpath_var
+ # rather than running their programs.
+ libtool_execute_magic=$magic
+
+ # Check if any of the arguments is a wrapper script.
+ args=
+ for file
+ do
+ case $file in
+ -* | *.la | *.lo ) ;;
+ *)
+ # Do a test to see if this is really a libtool program.
+ if func_ltwrapper_script_p "$file"; then
+ func_source "$file"
+ # Transform arg to wrapped name.
+ file=$progdir/$program
+ elif func_ltwrapper_executable_p "$file"; then
+ func_ltwrapper_scriptname "$file"
+ func_source "$func_ltwrapper_scriptname_result"
+ # Transform arg to wrapped name.
+ file=$progdir/$program
+ fi
+ ;;
+ esac
+ # Quote arguments (to preserve shell metacharacters).
+ func_append_quoted args "$file"
+ done
+
+ if $opt_dry_run; then
+ # Display what would be done.
+ if test -n "$shlibpath_var"; then
+ eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+ echo "export $shlibpath_var"
+ fi
+ $ECHO "$cmd$args"
+ exit $EXIT_SUCCESS
+ else
+ if test -n "$shlibpath_var"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+ fi
+
+ # Restore saved environment variables
+ for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+ do
+ eval "if test \"\${save_$lt_var+set}\" = set; then
+ $lt_var=\$save_$lt_var; export $lt_var
+ else
+ $lt_unset $lt_var
+ fi"
+ done
+
+ # Now prepare to actually exec the command.
+ exec_cmd=\$cmd$args
+ fi
+}
+
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+ $debug_cmd
+
+ libs=
+ libdirs=
+ admincmds=
+
+ for opt in "$nonopt" ${1+"$@"}
+ do
+ if test -d "$opt"; then
+ func_append libdirs " $opt"
+
+ elif test -f "$opt"; then
+ if func_lalib_unsafe_p "$opt"; then
+ func_append libs " $opt"
+ else
+ func_warning "'$opt' is not a valid libtool archive"
+ fi
+
+ else
+ func_fatal_error "invalid argument '$opt'"
+ fi
+ done
+
+ if test -n "$libs"; then
+ if test -n "$lt_sysroot"; then
+ sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+ sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+ else
+ sysroot_cmd=
+ fi
+
+ # Remove sysroot references
+ if $opt_dry_run; then
+ for lib in $libs; do
+ echo "removing references to $lt_sysroot and '=' prefixes from $lib"
+ done
+ else
+ tmpdir=`func_mktempdir`
+ for lib in $libs; do
+ $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+ > $tmpdir/tmp-la
+ mv -f $tmpdir/tmp-la $lib
+ done
+ ${RM}r "$tmpdir"
+ fi
+ fi
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for libdir in $libdirs; do
+ if test -n "$finish_cmds"; then
+ # Do each command in the finish commands.
+ func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+ fi
+ if test -n "$finish_eval"; then
+ # Do the single finish_eval.
+ eval cmds=\"$finish_eval\"
+ $opt_dry_run || eval "$cmds" || func_append admincmds "
+ $cmds"
+ fi
+ done
+ fi
+
+ # Exit here if they wanted silent mode.
+ $opt_quiet && exit $EXIT_SUCCESS
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ echo "----------------------------------------------------------------------"
+ echo "Libraries have been installed in:"
+ for libdir in $libdirs; do
+ $ECHO " $libdir"
+ done
+ echo
+ echo "If you ever happen to want to link against installed libraries"
+ echo "in a given directory, LIBDIR, you must either use libtool, and"
+ echo "specify the full pathname of the library, or use the '-LLIBDIR'"
+ echo "flag during linking and do at least one of the following:"
+ if test -n "$shlibpath_var"; then
+ echo " - add LIBDIR to the '$shlibpath_var' environment variable"
+ echo " during execution"
+ fi
+ if test -n "$runpath_var"; then
+ echo " - add LIBDIR to the '$runpath_var' environment variable"
+ echo " during linking"
+ fi
+ if test -n "$hardcode_libdir_flag_spec"; then
+ libdir=LIBDIR
+ eval flag=\"$hardcode_libdir_flag_spec\"
+
+ $ECHO " - use the '$flag' linker flag"
+ fi
+ if test -n "$admincmds"; then
+ $ECHO " - have your system administrator run these commands:$admincmds"
+ fi
+ if test -f /etc/ld.so.conf; then
+ echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
+ fi
+ echo
+
+ echo "See any operating system documentation about shared libraries for"
+ case $host in
+ solaris2.[6789]|solaris2.1[0-9])
+ echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+ echo "pages."
+ ;;
+ *)
+ echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ ;;
+ esac
+ echo "----------------------------------------------------------------------"
+ fi
+ exit $EXIT_SUCCESS
+}
+
+test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+ $debug_cmd
+
+ # There may be an optional sh(1) argument at the beginning of
+ # install_prog (especially on Windows NT).
+ if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
+ # Allow the use of GNU shtool's install command.
+ case $nonopt in *shtool*) :;; *) false;; esac
+ then
+ # Aesthetically quote it.
+ func_quote_arg pretty "$nonopt"
+ install_prog="$func_quote_arg_result "
+ arg=$1
+ shift
+ else
+ install_prog=
+ arg=$nonopt
+ fi
+
+ # The real first argument should be the name of the installation program.
+ # Aesthetically quote it.
+ func_quote_arg pretty "$arg"
+ func_append install_prog "$func_quote_arg_result"
+ install_shared_prog=$install_prog
+ case " $install_prog " in
+ *[\\\ /]cp\ *) install_cp=: ;;
+ *) install_cp=false ;;
+ esac
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=false
+ stripme=
+ no_mode=:
+ for arg
+ do
+ arg2=
+ if test -n "$dest"; then
+ func_append files " $dest"
+ dest=$arg
+ continue
+ fi
+
+ case $arg in
+ -d) isdir=: ;;
+ -f)
+ if $install_cp; then :; else
+ prev=$arg
+ fi
+ ;;
+ -g | -m | -o)
+ prev=$arg
+ ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*)
+ ;;
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ if test X-m = "X$prev" && test -n "$install_override_mode"; then
+ arg2=$install_override_mode
+ no_mode=false
+ fi
+ prev=
+ else
+ dest=$arg
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ func_quote_arg pretty "$arg"
+ func_append install_prog " $func_quote_arg_result"
+ if test -n "$arg2"; then
+ func_quote_arg pretty "$arg2"
+ fi
+ func_append install_shared_prog " $func_quote_arg_result"
+ done
+
+ test -z "$install_prog" && \
+ func_fatal_help "you must specify an install program"
+
+ test -n "$prev" && \
+ func_fatal_help "the '$prev' option requires an argument"
+
+ if test -n "$install_override_mode" && $no_mode; then
+ if $install_cp; then :; else
+ func_quote_arg pretty "$install_override_mode"
+ func_append install_shared_prog " -m $func_quote_arg_result"
+ fi
+ fi
+
+ if test -z "$files"; then
+ if test -z "$dest"; then
+ func_fatal_help "no file or destination specified"
+ else
+ func_fatal_help "you must specify a destination"
+ fi
+ fi
+
+ # Strip any trailing slash from the destination.
+ func_stripname '' '/' "$dest"
+ dest=$func_stripname_result
+
+ # Check to see that the destination is a directory.
+ test -d "$dest" && isdir=:
+ if $isdir; then
+ destdir=$dest
+ destname=
+ else
+ func_dirname_and_basename "$dest" "" "."
+ destdir=$func_dirname_result
+ destname=$func_basename_result
+
+ # Not a directory, so check to see that there is only one file specified.
+ set dummy $files; shift
+ test "$#" -gt 1 && \
+ func_fatal_help "'$dest' is not a directory"
+ fi
+ case $destdir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ for file in $files; do
+ case $file in
+ *.lo) ;;
+ *)
+ func_fatal_help "'$destdir' must be an absolute directory name"
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic=$magic
+
+ staticlibs=
+ future_libdirs=
+ current_libdirs=
+ for file in $files; do
+
+ # Do each installation.
+ case $file in
+ *.$libext)
+ # Do the static libraries later.
+ func_append staticlibs " $file"
+ ;;
+
+ *.la)
+ func_resolve_sysroot "$file"
+ file=$func_resolve_sysroot_result
+
+ # Check to see that this really is a libtool archive.
+ func_lalib_unsafe_p "$file" \
+ || func_fatal_help "'$file' is not a valid libtool archive"
+
+ library_names=
+ old_library=
+ relink_command=
+ func_source "$file"
+
+ # Add the libdir to current_libdirs if it is the destination.
+ if test "X$destdir" = "X$libdir"; then
+ case "$current_libdirs " in
+ *" $libdir "*) ;;
+ *) func_append current_libdirs " $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) func_append future_libdirs " $libdir" ;;
+ esac
+ fi
+
+ func_dirname "$file" "/" ""
+ dir=$func_dirname_result
+ func_append dir "$objdir"
+
+ if test -n "$relink_command"; then
+ # Determine the prefix the user has applied to our future dir.
+ inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+ # Don't allow the user to place us outside of our expected
+ # location b/c this prevents finding dependent libraries that
+ # are installed to the same prefix.
+ # At present, this check doesn't affect windows .dll's that
+ # are installed into $libdir/../bin (currently, that works fine)
+ # but it's something to keep an eye on.
+ test "$inst_prefix_dir" = "$destdir" && \
+ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
+
+ if test -n "$inst_prefix_dir"; then
+ # Stick the inst_prefix_dir data into the link command.
+ relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+ else
+ relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+ fi
+
+ func_warning "relinking '$file'"
+ func_show_eval "$relink_command" \
+ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
+ fi
+
+ # See the names of the shared library.
+ set dummy $library_names; shift
+ if test -n "$1"; then
+ realname=$1
+ shift
+
+ srcname=$realname
+ test -n "$relink_command" && srcname=${realname}T
+
+ # Install the shared library and build the symlinks.
+ func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+ 'exit $?'
+ tstripme=$stripme
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $realname in
+ *.dll.a)
+ tstripme=
+ ;;
+ esac
+ ;;
+ os2*)
+ case $realname in
+ *_dll.a)
+ tstripme=
+ ;;
+ esac
+ ;;
+ esac
+ if test -n "$tstripme" && test -n "$striplib"; then
+ func_show_eval "$striplib $destdir/$realname" 'exit $?'
+ fi
+
+ if test "$#" -gt 0; then
+ # Delete the old symlinks, and create new ones.
+ # Try 'ln -sf' first, because the 'ln' binary might depend on
+ # the symlink we replace! Solaris /bin/ln does not understand -f,
+ # so we also need to try rm && ln -s.
+ for linkname
+ do
+ test "$linkname" != "$realname" \
+ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+ done
+ fi
+
+ # Do each command in the postinstall commands.
+ lib=$destdir/$realname
+ func_execute_cmds "$postinstall_cmds" 'exit $?'
+ fi
+
+ # Install the pseudo-library for information purposes.
+ func_basename "$file"
+ name=$func_basename_result
+ instname=$dir/${name}i
+ func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+ # Maybe install the static library, too.
+ test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+ ;;
+
+ *.lo)
+ # Install (i.e. copy) a libtool object.
+
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile=$destdir/$destname
+ else
+ func_basename "$file"
+ destfile=$func_basename_result
+ destfile=$destdir/$destfile
+ fi
+
+ # Deduce the name of the destination old-style object file.
+ case $destfile in
+ *.lo)
+ func_lo2o "$destfile"
+ staticdest=$func_lo2o_result
+ ;;
+ *.$objext)
+ staticdest=$destfile
+ destfile=
+ ;;
+ *)
+ func_fatal_help "cannot copy a libtool object to '$destfile'"
+ ;;
+ esac
+
+ # Install the libtool object if requested.
+ test -n "$destfile" && \
+ func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+ # Install the old object if enabled.
+ if test yes = "$build_old_libs"; then
+ # Deduce the name of the old-style object file.
+ func_lo2o "$file"
+ staticobj=$func_lo2o_result
+ func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+
+ *)
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile=$destdir/$destname
+ else
+ func_basename "$file"
+ destfile=$func_basename_result
+ destfile=$destdir/$destfile
+ fi
+
+ # If the file is missing, and there is a .exe on the end, strip it
+ # because it is most likely a libtool script we actually want to
+ # install
+ stripped_ext=
+ case $file in
+ *.exe)
+ if test ! -f "$file"; then
+ func_stripname '' '.exe' "$file"
+ file=$func_stripname_result
+ stripped_ext=.exe
+ fi
+ ;;
+ esac
+
+ # Do a test to see if this is really a libtool program.
+ case $host in
+ *cygwin* | *mingw*)
+ if func_ltwrapper_executable_p "$file"; then
+ func_ltwrapper_scriptname "$file"
+ wrapper=$func_ltwrapper_scriptname_result
+ else
+ func_stripname '' '.exe' "$file"
+ wrapper=$func_stripname_result
+ fi
+ ;;
+ *)
+ wrapper=$file
+ ;;
+ esac
+ if func_ltwrapper_script_p "$wrapper"; then
+ notinst_deplibs=
+ relink_command=
+
+ func_source "$wrapper"
+
+ # Check the variables that should have been set.
+ test -z "$generated_by_libtool_version" && \
+ func_fatal_error "invalid libtool wrapper script '$wrapper'"
+
+ finalize=:
+ for lib in $notinst_deplibs; do
+ # Check to see that each library is installed.
+ libdir=
+ if test -f "$lib"; then
+ func_source "$lib"
+ fi
+ libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
+ if test -n "$libdir" && test ! -f "$libfile"; then
+ func_warning "'$lib' has not been installed in '$libdir'"
+ finalize=false
+ fi
+ done
+
+ relink_command=
+ func_source "$wrapper"
+
+ outputname=
+ if test no = "$fast_install" && test -n "$relink_command"; then
+ $opt_dry_run || {
+ if $finalize; then
+ tmpdir=`func_mktempdir`
+ func_basename "$file$stripped_ext"
+ file=$func_basename_result
+ outputname=$tmpdir/$file
+ # Replace the output file specification.
+ relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+ $opt_quiet || {
+ func_quote_arg expand,pretty "$relink_command"
+ eval "func_echo $func_quote_arg_result"
+ }
+ if eval "$relink_command"; then :
+ else
+ func_error "error: relink '$file' with the above command before installing it"
+ $opt_dry_run || ${RM}r "$tmpdir"
+ continue
+ fi
+ file=$outputname
+ else
+ func_warning "cannot relink '$file'"
+ fi
+ }
+ else
+ # Install the binary that we compiled earlier.
+ file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+ fi
+ fi
+
+ # remove .exe since cygwin /usr/bin/install will append another
+ # one anyway
+ case $install_prog,$host in
+ */usr/bin/install*,*cygwin*)
+ case $file:$destfile in
+ *.exe:*.exe)
+ # this is ok
+ ;;
+ *.exe:*)
+ destfile=$destfile.exe
+ ;;
+ *:*.exe)
+ func_stripname '' '.exe' "$destfile"
+ destfile=$func_stripname_result
+ ;;
+ esac
+ ;;
+ esac
+ func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+ $opt_dry_run || if test -n "$outputname"; then
+ ${RM}r "$tmpdir"
+ fi
+ ;;
+ esac
+ done
+
+ for file in $staticlibs; do
+ func_basename "$file"
+ name=$func_basename_result
+
+ # Set up the ranlib parameters.
+ oldlib=$destdir/$name
+ func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+ tool_oldlib=$func_to_tool_file_result
+
+ func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+ if test -n "$stripme" && test -n "$old_striplib"; then
+ func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+ fi
+
+ # Do each command in the postinstall commands.
+ func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+ done
+
+ test -n "$future_libdirs" && \
+ func_warning "remember to run '$progname --finish$future_libdirs'"
+
+ if test -n "$current_libdirs"; then
+ # Maybe just do a dry run.
+ $opt_dry_run && current_libdirs=" -n$current_libdirs"
+ exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
+ else
+ exit $EXIT_SUCCESS
+ fi
+}
+
+test install = "$opt_mode" && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+ $debug_cmd
+
+ my_outputname=$1
+ my_originator=$2
+ my_pic_p=${3-false}
+ my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
+ my_dlsyms=
+
+ if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+ if test -n "$NM" && test -n "$global_symbol_pipe"; then
+ my_dlsyms=${my_outputname}S.c
+ else
+ func_error "not configured to extract global symbols from dlpreopened files"
+ fi
+ fi
+
+ if test -n "$my_dlsyms"; then
+ case $my_dlsyms in
+ "") ;;
+ *.c)
+ # Discover the nlist of each of the dlfiles.
+ nlist=$output_objdir/$my_outputname.nm
+
+ func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+ # Parse the name list into a source file.
+ func_verbose "creating $output_objdir/$my_dlsyms"
+
+ $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test yes = "$dlself"; then
+ func_verbose "generating symbol list for '$output'"
+
+ $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+ # Add our own program objects to the symbol list.
+ progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+ for progfile in $progfiles; do
+ func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+ func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
+ $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -n "$exclude_expsyms"; then
+ $opt_dry_run || {
+ eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+ eval '$MV "$nlist"T "$nlist"'
+ }
+ fi
+
+ if test -n "$export_symbols_regex"; then
+ $opt_dry_run || {
+ eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+ eval '$MV "$nlist"T "$nlist"'
+ }
+ fi
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ export_symbols=$output_objdir/$outputname.exp
+ $opt_dry_run || {
+ $RM $export_symbols
+ eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+ case $host in
+ *cygwin* | *mingw* | *cegcc* )
+ eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ }
+ else
+ $opt_dry_run || {
+ eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+ eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+ eval '$MV "$nlist"T "$nlist"'
+ case $host in
+ *cygwin* | *mingw* | *cegcc* )
+ eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ }
+ fi
+ fi
+
+ for dlprefile in $dlprefiles; do
+ func_verbose "extracting global C symbols from '$dlprefile'"
+ func_basename "$dlprefile"
+ name=$func_basename_result
+ case $host in
+ *cygwin* | *mingw* | *cegcc* )
+ # if an import library, we need to obtain dlname
+ if func_win32_import_lib_p "$dlprefile"; then
+ func_tr_sh "$dlprefile"
+ eval "curr_lafile=\$libfile_$func_tr_sh_result"
+ dlprefile_dlbasename=
+ if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+ # Use subshell, to avoid clobbering current variable values
+ dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+ if test -n "$dlprefile_dlname"; then
+ func_basename "$dlprefile_dlname"
+ dlprefile_dlbasename=$func_basename_result
+ else
+ # no lafile. user explicitly requested -dlpreopen <import library>.
+ $sharedlib_from_linklib_cmd "$dlprefile"
+ dlprefile_dlbasename=$sharedlib_from_linklib_result
+ fi
+ fi
+ $opt_dry_run || {
+ if test -n "$dlprefile_dlbasename"; then
+ eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+ else
+ func_warning "Could not compute DLL name from $name"
+ eval '$ECHO ": $name " >> "$nlist"'
+ fi
+ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+ $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+ }
+ else # not an import lib
+ $opt_dry_run || {
+ eval '$ECHO ": $name " >> "$nlist"'
+ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+ }
+ fi
+ ;;
+ *)
+ $opt_dry_run || {
+ eval '$ECHO ": $name " >> "$nlist"'
+ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+ }
+ ;;
+ esac
+ done
+
+ $opt_dry_run || {
+ # Make sure we have at least an empty file.
+ test -f "$nlist" || : > "$nlist"
+
+ if test -n "$exclude_expsyms"; then
+ $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+ $MV "$nlist"T "$nlist"
+ fi
+
+ # Try sorting and uniquifying the output.
+ if $GREP -v "^: " < "$nlist" |
+ if sort -k 3 </dev/null >/dev/null 2>&1; then
+ sort -k 3
+ else
+ sort +2
+ fi |
+ uniq > "$nlist"S; then
+ :
+ else
+ $GREP -v "^: " < "$nlist" > "$nlist"S
+ fi
+
+ if test -f "$nlist"S; then
+ eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+ else
+ echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+ fi
+
+ func_show_eval '$RM "${nlist}I"'
+ if test -n "$global_symbol_to_import"; then
+ eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+ fi
+
+ echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols. */
+typedef struct {
+ const char *name;
+ void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];\
+"
+
+ if test -s "$nlist"I; then
+ echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+ LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+ for (; symbol->name; ++symbol)
+ {"
+ $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+ echo >> "$output_objdir/$my_dlsyms" "\
+ }
+}"
+ fi
+ echo >> "$output_objdir/$my_dlsyms" "\
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{ {\"$my_originator\", (void *) 0},"
+
+ if test -s "$nlist"I; then
+ echo >> "$output_objdir/$my_dlsyms" "\
+ {\"@INIT@\", (void *) &lt_syminit},"
+ fi
+
+ case $need_lib_prefix in
+ no)
+ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+ ;;
+ *)
+ eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+ ;;
+ esac
+ echo >> "$output_objdir/$my_dlsyms" "\
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+ } # !$opt_dry_run
+
+ pic_flag_for_symtable=
+ case "$compile_command " in
+ *" -static "*) ;;
+ *)
+ case $host in
+ # compiling the symbol table file with pic_flag works around
+ # a FreeBSD bug that causes programs to crash when -lm is
+ # linked before any other PIC object. But we must not use
+ # pic_flag when linking with -static. The problem exists in
+ # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+ *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+ pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+ *-*-hpux*)
+ pic_flag_for_symtable=" $pic_flag" ;;
+ *)
+ $my_pic_p && pic_flag_for_symtable=" $pic_flag"
+ ;;
+ esac
+ ;;
+ esac
+ symtab_cflags=
+ for arg in $LTCFLAGS; do
+ case $arg in
+ -pie | -fpie | -fPIE) ;;
+ *) func_append symtab_cflags " $arg" ;;
+ esac
+ done
+
+ # Now compile the dynamic symbol file.
+ func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+ # Clean up the generated files.
+ func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
+
+ # Transform the symbol file into the correct name.
+ symfileobj=$output_objdir/${my_outputname}S.$objext
+ case $host in
+ *cygwin* | *mingw* | *cegcc* )
+ if test -f "$output_objdir/$my_outputname.def"; then
+ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+ else
+ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+ fi
+ ;;
+ *)
+ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+ ;;
+ esac
+ ;;
+ *)
+ func_fatal_error "unknown suffix for '$my_dlsyms'"
+ ;;
+ esac
+ else
+ # We keep going just in case the user didn't refer to
+ # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
+ # really was required.
+
+ # Nullify the symbol file.
+ compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+ fi
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+ $debug_cmd
+
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+ test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+ $debug_cmd
+
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+ test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+ $debug_cmd
+
+ win32_libid_type=unknown
+ win32_fileres=`file -L $1 2>/dev/null`
+ case $win32_fileres in
+ *ar\ archive\ import\ library*) # definitely import
+ win32_libid_type="x86 archive import"
+ ;;
+ *ar\ archive*) # could be an import, or static
+ # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+ $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+ case $nm_interface in
+ "MS dumpbin")
+ if func_cygming_ms_implib_p "$1" ||
+ func_cygming_gnu_implib_p "$1"
+ then
+ win32_nmres=import
+ else
+ win32_nmres=
+ fi
+ ;;
+ *)
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+ $SED -n -e '
+ 1,100{
+ / I /{
+ s|.*|import|
+ p
+ q
+ }
+ }'`
+ ;;
+ esac
+ case $win32_nmres in
+ import*) win32_libid_type="x86 archive import";;
+ *) win32_libid_type="x86 archive static";;
+ esac
+ fi
+ ;;
+ *DLL*)
+ win32_libid_type="x86 DLL"
+ ;;
+ *executable*) # but shell scripts are "executable" too...
+ case $win32_fileres in
+ *MS\ Windows\ PE\ Intel*)
+ win32_libid_type="x86 DLL"
+ ;;
+ esac
+ ;;
+ esac
+ $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+# $sharedlib_from_linklib_cmd
+# Result is available in the variable
+# $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+ $debug_cmd
+
+ sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+ $debug_cmd
+
+ match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+ $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+ $SED '/^Contents of section '"$match_literal"':/{
+ # Place marker at beginning of archive member dllname section
+ s/.*/====MARK====/
+ p
+ d
+ }
+ # These lines can sometimes be longer than 43 characters, but
+ # are always uninteresting
+ /:[ ]*file format pe[i]\{,1\}-/d
+ /^In archive [^:]*:/d
+ # Ensure marker is printed
+ /^====MARK====/p
+ # Remove all lines with less than 43 characters
+ /^.\{43\}/!d
+ # From remaining lines, remove first 43 characters
+ s/^.\{43\}//' |
+ $SED -n '
+ # Join marker and all lines until next marker into a single line
+ /^====MARK====/ b para
+ H
+ $ b para
+ b
+ :para
+ x
+ s/\n//g
+ # Remove the marker
+ s/^====MARK====//
+ # Remove trailing dots and whitespace
+ s/[\. \t]*$//
+ # Print
+ /./p' |
+ # we now have a list, one entry per line, of the stringified
+ # contents of the appropriate section of all members of the
+ # archive that possess that section. Heuristic: eliminate
+ # all those that have a first or second character that is
+ # a '.' (that is, objdump's representation of an unprintable
+ # character.) This should work for all archives with less than
+ # 0x302f exports -- but will fail for DLLs whose name actually
+ # begins with a literal '.' or a single character followed by
+ # a '.'.
+ #
+ # Of those that remain, print the first one.
+ $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+# $sharedlib_from_linklib_cmd
+# Result is available in the variable
+# $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+ $debug_cmd
+
+ if func_cygming_gnu_implib_p "$1"; then
+ # binutils import library
+ sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+ elif func_cygming_ms_implib_p "$1"; then
+ # ms-generated import library
+ sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+ else
+ # unknown
+ sharedlib_from_linklib_result=
+ fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+ $debug_cmd
+
+ f_ex_an_ar_dir=$1; shift
+ f_ex_an_ar_oldlib=$1
+ if test yes = "$lock_old_archive_extraction"; then
+ lockfile=$f_ex_an_ar_oldlib.lock
+ until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+ func_echo "Waiting for $lockfile to be removed"
+ sleep 2
+ done
+ fi
+ func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+ 'stat=$?; rm -f "$lockfile"; exit $stat'
+ if test yes = "$lock_old_archive_extraction"; then
+ $opt_dry_run || rm -f "$lockfile"
+ fi
+ if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+ fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+ $debug_cmd
+
+ my_gentop=$1; shift
+ my_oldlibs=${1+"$@"}
+ my_oldobjs=
+ my_xlib=
+ my_xabs=
+ my_xdir=
+
+ for my_xlib in $my_oldlibs; do
+ # Extract the objects.
+ case $my_xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
+ *) my_xabs=`pwd`"/$my_xlib" ;;
+ esac
+ func_basename "$my_xlib"
+ my_xlib=$func_basename_result
+ my_xlib_u=$my_xlib
+ while :; do
+ case " $extracted_archives " in
+ *" $my_xlib_u "*)
+ func_arith $extracted_serial + 1
+ extracted_serial=$func_arith_result
+ my_xlib_u=lt$extracted_serial-$my_xlib ;;
+ *) break ;;
+ esac
+ done
+ extracted_archives="$extracted_archives $my_xlib_u"
+ my_xdir=$my_gentop/$my_xlib_u
+
+ func_mkdir_p "$my_xdir"
+
+ case $host in
+ *-darwin*)
+ func_verbose "Extracting $my_xabs"
+ # Do not bother doing anything if just a dry run
+ $opt_dry_run || {
+ darwin_orig_dir=`pwd`
+ cd $my_xdir || exit $?
+ darwin_archive=$my_xabs
+ darwin_curdir=`pwd`
+ func_basename "$darwin_archive"
+ darwin_base_archive=$func_basename_result
+ darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+ if test -n "$darwin_arches"; then
+ darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+ darwin_arch=
+ func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+ for darwin_arch in $darwin_arches; do
+ func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
+ $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
+ cd "unfat-$$/$darwin_base_archive-$darwin_arch"
+ func_extract_an_archive "`pwd`" "$darwin_base_archive"
+ cd "$darwin_curdir"
+ $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
+ done # $darwin_arches
+ ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+ darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
+ darwin_file=
+ darwin_files=
+ for darwin_file in $darwin_filelist; do
+ darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+ $LIPO -create -output "$darwin_file" $darwin_files
+ done # $darwin_filelist
+ $RM -rf unfat-$$
+ cd "$darwin_orig_dir"
+ else
+ cd $darwin_orig_dir
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ fi # $darwin_arches
+ } # !$opt_dry_run
+ ;;
+ *)
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ ;;
+ esac
+ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+ done
+
+ func_extract_archives_result=$my_oldobjs
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable. Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take. If 'yes', then the emitted script
+# will assume that the directory where it is stored is
+# the $objdir directory. This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+ func_emit_wrapper_arg1=${1-no}
+
+ $ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+ # install mode needs the following variables:
+ generated_by_libtool_version='$macro_version'
+ notinst_deplibs='$notinst_deplibs'
+else
+ # When we are sourced in execute mode, \$file and \$ECHO are already set.
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ file=\"\$0\""
+
+ func_quote_arg pretty "$ECHO"
+ qECHO=$func_quote_arg_result
+ $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+ ECHO=$qECHO
+ fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ that is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options that match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+ lt_script_arg0=\$0
+ shift
+ for lt_opt
+ do
+ case \"\$lt_opt\" in
+ --lt-debug) lt_option_debug=1 ;;
+ --lt-dump-script)
+ lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+ test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+ lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+ cat \"\$lt_dump_D/\$lt_dump_F\"
+ exit 0
+ ;;
+ --lt-*)
+ \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+
+ # Print the debug banner immediately:
+ if test -n \"\$lt_option_debug\"; then
+ echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
+ fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+ lt_dump_args_N=1;
+ for lt_arg
+ do
+ \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
+ lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+ done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+ case $host in
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2* | *-cegcc*)
+ $ECHO "\
+ if test -n \"\$lt_option_debug\"; then
+ \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
+ func_lt_dump_args \${1+\"\$@\"} 1>&2
+ fi
+ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $ECHO "\
+ if test -n \"\$lt_option_debug\"; then
+ \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
+ func_lt_dump_args \${1+\"\$@\"} 1>&2
+ fi
+ exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $ECHO "\
+ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+ exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+ case \" \$* \" in
+ *\\ --lt-*)
+ for lt_wr_arg
+ do
+ case \$lt_wr_arg in
+ --lt-*) ;;
+ *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+ esac
+ shift
+ done ;;
+ esac
+ func_exec_program_core \${1+\"\$@\"}
+}
+
+ # Parse options
+ func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+ test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+ while test -n \"\$file\"; do
+ destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+ # If there was a directory component, then change thisdir.
+ if test \"x\$destdir\" != \"x\$file\"; then
+ case \"\$destdir\" in
+ [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+ *) thisdir=\"\$thisdir/\$destdir\" ;;
+ esac
+ fi
+
+ file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+ done
+
+ # Usually 'no', except on cygwin/mingw when embedded into
+ # the cwrapper.
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+ if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+ # special case for '.'
+ if test \"\$thisdir\" = \".\"; then
+ thisdir=\`pwd\`
+ fi
+ # remove .libs from thisdir
+ case \"\$thisdir\" in
+ *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+ $objdir ) thisdir=. ;;
+ esac
+ fi
+
+ # Try to get the absolute directory name.
+ absdir=\`cd \"\$thisdir\" && pwd\`
+ test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+ if test yes = "$fast_install"; then
+ $ECHO "\
+ program=lt-'$outputname'$exeext
+ progdir=\"\$thisdir/$objdir\"
+
+ if test ! -f \"\$progdir/\$program\" ||
+ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
+ test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+ file=\"\$\$-\$program\"
+
+ if test ! -d \"\$progdir\"; then
+ $MKDIR \"\$progdir\"
+ else
+ $RM \"\$progdir/\$file\"
+ fi"
+
+ $ECHO "\
+
+ # relink executable if necessary
+ if test -n \"\$relink_command\"; then
+ if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+ else
+ \$ECHO \"\$relink_command_output\" >&2
+ $RM \"\$progdir/\$file\"
+ exit 1
+ fi
+ fi
+
+ $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+ { $RM \"\$progdir/\$program\";
+ $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+ $RM \"\$progdir/\$file\"
+ fi"
+ else
+ $ECHO "\
+ program='$outputname'
+ progdir=\"\$thisdir/$objdir\"
+"
+ fi
+
+ $ECHO "\
+
+ if test -f \"\$progdir/\$program\"; then"
+
+ # fixup the dll searchpath if we need to.
+ #
+ # Fix the DLL searchpath if we need to. Do this before prepending
+ # to shlibpath, because on Windows, both are PATH and uninstalled
+ # libraries must come first.
+ if test -n "$dllsearchpath"; then
+ $ECHO "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
+ # Export our shlibpath_var if we have one.
+ if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ $ECHO "\
+ # Add our own library path to $shlibpath_var
+ $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+ # Some systems cannot cope with colon-terminated $shlibpath_var
+ # The second colon is a workaround for a bug in BeOS R4 sed
+ $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ $ECHO "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+ func_exec_program \${1+\"\$@\"}
+ fi
+ else
+ # The program doesn't exist.
+ \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
+ \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+ \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+ exit 1
+ fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+ cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+
+ The $output program cannot be directly executed until all the libtool
+ libraries that it depends on are installed.
+
+ This wrapper executable should never be moved out of the build directory.
+ If it is, it will not operate correctly.
+*/
+EOF
+ cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+# include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
+/* declarations of non-ANSI functions */
+#if defined __MINGW32__
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined __CYGWIN__
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined other_platform || defined ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined _MSC_VER
+# define setmode _setmode
+# define stat _stat
+# define chmod _chmod
+# define getcwd _getcwd
+# define putenv _putenv
+# define S_IXUSR _S_IEXEC
+#elif defined __MINGW32__
+# define setmode _setmode
+# define stat _stat
+# define chmod _chmod
+# define getcwd _getcwd
+# define putenv _putenv
+#elif defined __CYGWIN__
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined other platforms ... */
+#endif
+
+#if defined PATH_MAX
+# define LT_PATHMAX PATH_MAX
+#elif defined MAXPATHLEN
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
+ defined __OS2__
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+# define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+# define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free (stale); stale = 0; } \
+} while (0)
+
+#if defined LT_DEBUGWRAPPER
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+ cat <<EOF
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+ if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ func_to_host_path "$temp_rpath"
+ cat <<EOF
+const char * LIB_PATH_VALUE = "$func_to_host_path_result";
+EOF
+ else
+ cat <<"EOF"
+const char * LIB_PATH_VALUE = "";
+EOF
+ fi
+
+ if test -n "$dllsearchpath"; then
+ func_to_host_path "$dllsearchpath:"
+ cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE = "$func_to_host_path_result";
+EOF
+ else
+ cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE = "";
+EOF
+ fi
+
+ if test yes = "$fast_install"; then
+ cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+ else
+ cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+ fi
+
+
+ cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int newargc;
+ char *tmp_pathspec;
+ char *actual_cwrapper_path;
+ char *actual_cwrapper_name;
+ char *target_name;
+ char *lt_argv_zero;
+ int rval = 127;
+
+ int i;
+
+ program_name = (char *) xstrdup (base_name (argv[0]));
+ newargz = XMALLOC (char *, (size_t) argc + 1);
+
+ /* very simple arg parsing; don't want to rely on getopt
+ * also, copy all non cwrapper options to newargz, except
+ * argz[0], which is handled differently
+ */
+ newargc=0;
+ for (i = 1; i < argc; i++)
+ {
+ if (STREQ (argv[i], dumpscript_opt))
+ {
+EOF
+ case $host in
+ *mingw* | *cygwin* )
+ # make stdout use "unix" line endings
+ echo " setmode(1,_O_BINARY);"
+ ;;
+ esac
+
+ cat <<"EOF"
+ lt_dump_script (stdout);
+ return 0;
+ }
+ if (STREQ (argv[i], debug_opt))
+ {
+ lt_debug = 1;
+ continue;
+ }
+ if (STREQ (argv[i], ltwrapper_option_prefix))
+ {
+ /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+ namespace, but it is not one of the ones we know about and
+ have already dealt with, above (inluding dump-script), then
+ report an error. Otherwise, targets might begin to believe
+ they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+ namespace. The first time any user complains about this, we'll
+ need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+ or a configure.ac-settable value.
+ */
+ lt_fatal (__FILE__, __LINE__,
+ "unrecognized %s option: '%s'",
+ ltwrapper_option_prefix, argv[i]);
+ }
+ /* otherwise ... */
+ newargz[++newargc] = xstrdup (argv[i]);
+ }
+ newargz[++newargc] = NULL;
+
+EOF
+ cat <<EOF
+ /* The GNU banner must be the first non-error debug message */
+ lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
+EOF
+ cat <<"EOF"
+ lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+ lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+ tmp_pathspec = find_executable (argv[0]);
+ if (tmp_pathspec == NULL)
+ lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) found exe (before symlink chase) at: %s\n",
+ tmp_pathspec);
+
+ actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) found exe (after symlink chase) at: %s\n",
+ actual_cwrapper_path);
+ XFREE (tmp_pathspec);
+
+ actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+ strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+ /* wrapper name transforms */
+ strendzap (actual_cwrapper_name, ".exe");
+ tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+ XFREE (actual_cwrapper_name);
+ actual_cwrapper_name = tmp_pathspec;
+ tmp_pathspec = 0;
+
+ /* target_name transforms -- use actual target program name; might have lt- prefix */
+ target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+ strendzap (target_name, ".exe");
+ tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+ XFREE (target_name);
+ target_name = tmp_pathspec;
+ tmp_pathspec = 0;
+
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) libtool target name: %s\n",
+ target_name);
+EOF
+
+ cat <<EOF
+ newargz[0] =
+ XMALLOC (char, (strlen (actual_cwrapper_path) +
+ strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+ strcpy (newargz[0], actual_cwrapper_path);
+ strcat (newargz[0], "$objdir");
+ strcat (newargz[0], "/");
+EOF
+
+ cat <<"EOF"
+ /* stop here, and copy so we don't have to do this twice */
+ tmp_pathspec = xstrdup (newargz[0]);
+
+ /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+ strcat (newargz[0], actual_cwrapper_name);
+
+ /* DO want the lt- prefix here if it exists, so use target_name */
+ lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+ XFREE (tmp_pathspec);
+ tmp_pathspec = NULL;
+EOF
+
+ case $host_os in
+ mingw*)
+ cat <<"EOF"
+ {
+ char* p;
+ while ((p = strchr (newargz[0], '\\')) != NULL)
+ {
+ *p = '/';
+ }
+ while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+ {
+ *p = '/';
+ }
+ }
+EOF
+ ;;
+ esac
+
+ cat <<"EOF"
+ XFREE (target_name);
+ XFREE (actual_cwrapper_path);
+ XFREE (actual_cwrapper_name);
+
+ lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+ lt_setenv ("DUALCASE", "1"); /* for MSK sh */
+ /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must
+ be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+ because on Windows, both *_VARNAMEs are PATH but uninstalled
+ libraries must come first. */
+ lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+ lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+ lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+ nonnull (lt_argv_zero));
+ for (i = 0; i < newargc; i++)
+ {
+ lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+ i, nonnull (newargz[i]));
+ }
+
+EOF
+
+ case $host_os in
+ mingw*)
+ cat <<"EOF"
+ /* execv doesn't actually work on mingw as expected on unix */
+ newargz = prepare_spawn (newargz);
+ rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+ if (rval == -1)
+ {
+ /* failed to start process */
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) failed to launch target \"%s\": %s\n",
+ lt_argv_zero, nonnull (strerror (errno)));
+ return 127;
+ }
+ return rval;
+EOF
+ ;;
+ *)
+ cat <<"EOF"
+ execv (lt_argv_zero, newargz);
+ return rval; /* =127, but avoids unused variable warning */
+EOF
+ ;;
+ esac
+
+ cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+ void *p = (void *) malloc (num);
+ if (!p)
+ lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+ return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+ string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+ const char *base;
+
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+ /* Skip over the disk name in MSDOS pathnames. */
+ if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+ return base;
+}
+
+int
+check_executable (const char *path)
+{
+ struct stat st;
+
+ lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+ nonempty (path));
+ if ((!path) || (!*path))
+ return 0;
+
+ if ((stat (path, &st) >= 0)
+ && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+ return 1;
+ else
+ return 0;
+}
+
+int
+make_executable (const char *path)
+{
+ int rval = 0;
+ struct stat st;
+
+ lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+ nonempty (path));
+ if ((!path) || (!*path))
+ return 0;
+
+ if (stat (path, &st) >= 0)
+ {
+ rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+ }
+ return rval;
+}
+
+/* Searches for the full path of the wrapper. Returns
+ newly allocated full path name if found, NULL otherwise
+ Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+ int has_slash = 0;
+ const char *p;
+ const char *p_next;
+ /* static buffer for getcwd */
+ char tmp[LT_PATHMAX + 1];
+ size_t tmp_len;
+ char *concat_name;
+
+ lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+ nonempty (wrapper));
+
+ if ((wrapper == NULL) || (*wrapper == '\0'))
+ return NULL;
+
+ /* Absolute path? */
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+ if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+ {
+ concat_name = xstrdup (wrapper);
+ if (check_executable (concat_name))
+ return concat_name;
+ XFREE (concat_name);
+ }
+ else
+ {
+#endif
+ if (IS_DIR_SEPARATOR (wrapper[0]))
+ {
+ concat_name = xstrdup (wrapper);
+ if (check_executable (concat_name))
+ return concat_name;
+ XFREE (concat_name);
+ }
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+ }
+#endif
+
+ for (p = wrapper; *p; p++)
+ if (*p == '/')
+ {
+ has_slash = 1;
+ break;
+ }
+ if (!has_slash)
+ {
+ /* no slashes; search PATH */
+ const char *path = getenv ("PATH");
+ if (path != NULL)
+ {
+ for (p = path; *p; p = p_next)
+ {
+ const char *q;
+ size_t p_len;
+ for (q = p; *q; q++)
+ if (IS_PATH_SEPARATOR (*q))
+ break;
+ p_len = (size_t) (q - p);
+ p_next = (*q == '\0' ? q : q + 1);
+ if (p_len == 0)
+ {
+ /* empty path: current directory */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+ nonnull (strerror (errno)));
+ tmp_len = strlen (tmp);
+ concat_name =
+ XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+ memcpy (concat_name, tmp, tmp_len);
+ concat_name[tmp_len] = '/';
+ strcpy (concat_name + tmp_len + 1, wrapper);
+ }
+ else
+ {
+ concat_name =
+ XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+ memcpy (concat_name, p, p_len);
+ concat_name[p_len] = '/';
+ strcpy (concat_name + p_len + 1, wrapper);
+ }
+ if (check_executable (concat_name))
+ return concat_name;
+ XFREE (concat_name);
+ }
+ }
+ /* not found in PATH; assume curdir */
+ }
+ /* Relative path | not found in path: prepend cwd */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+ nonnull (strerror (errno)));
+ tmp_len = strlen (tmp);
+ concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+ memcpy (concat_name, tmp, tmp_len);
+ concat_name[tmp_len] = '/';
+ strcpy (concat_name + tmp_len + 1, wrapper);
+
+ if (check_executable (concat_name))
+ return concat_name;
+ XFREE (concat_name);
+ return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+ return xstrdup (pathspec);
+#else
+ char buf[LT_PATHMAX];
+ struct stat s;
+ char *tmp_pathspec = xstrdup (pathspec);
+ char *p;
+ int has_symlinks = 0;
+ while (strlen (tmp_pathspec) && !has_symlinks)
+ {
+ lt_debugprintf (__FILE__, __LINE__,
+ "checking path component for symlinks: %s\n",
+ tmp_pathspec);
+ if (lstat (tmp_pathspec, &s) == 0)
+ {
+ if (S_ISLNK (s.st_mode) != 0)
+ {
+ has_symlinks = 1;
+ break;
+ }
+
+ /* search backwards for last DIR_SEPARATOR */
+ p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+ while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+ p--;
+ if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+ {
+ /* no more DIR_SEPARATORS left */
+ break;
+ }
+ *p = '\0';
+ }
+ else
+ {
+ lt_fatal (__FILE__, __LINE__,
+ "error accessing file \"%s\": %s",
+ tmp_pathspec, nonnull (strerror (errno)));
+ }
+ }
+ XFREE (tmp_pathspec);
+
+ if (!has_symlinks)
+ {
+ return xstrdup (pathspec);
+ }
+
+ tmp_pathspec = realpath (pathspec, buf);
+ if (tmp_pathspec == 0)
+ {
+ lt_fatal (__FILE__, __LINE__,
+ "could not follow symlinks for %s", pathspec);
+ }
+ return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+ size_t len, patlen;
+
+ assert (str != NULL);
+ assert (pat != NULL);
+
+ len = strlen (str);
+ patlen = strlen (pat);
+
+ if (patlen <= len)
+ {
+ str += len - patlen;
+ if (STREQ (str, pat))
+ *str = '\0';
+ }
+ return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+ va_list args;
+ if (lt_debug)
+ {
+ (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+ va_start (args, fmt);
+ (void) vfprintf (stderr, fmt, args);
+ va_end (args);
+ }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+ int line, const char *mode,
+ const char *message, va_list ap)
+{
+ fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+ va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+ return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+ return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+ lt_debugprintf (__FILE__, __LINE__,
+ "(lt_setenv) setting '%s' to '%s'\n",
+ nonnull (name), nonnull (value));
+ {
+#ifdef HAVE_SETENV
+ /* always make a copy, for consistency with !HAVE_SETENV */
+ char *str = xstrdup (value);
+ setenv (name, str, 1);
+#else
+ size_t len = strlen (name) + 1 + strlen (value) + 1;
+ char *str = XMALLOC (char, len);
+ sprintf (str, "%s=%s", name, value);
+ if (putenv (str) != EXIT_SUCCESS)
+ {
+ XFREE (str);
+ }
+#endif
+ }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+ char *new_value;
+ if (orig_value && *orig_value)
+ {
+ size_t orig_value_len = strlen (orig_value);
+ size_t add_len = strlen (add);
+ new_value = XMALLOC (char, add_len + orig_value_len + 1);
+ if (to_end)
+ {
+ strcpy (new_value, orig_value);
+ strcpy (new_value + orig_value_len, add);
+ }
+ else
+ {
+ strcpy (new_value, add);
+ strcpy (new_value + add_len, orig_value);
+ }
+ }
+ else
+ {
+ new_value = xstrdup (add);
+ }
+ return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+ lt_debugprintf (__FILE__, __LINE__,
+ "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+ nonnull (name), nonnull (value));
+
+ if (name && *name && value && *value)
+ {
+ char *new_value = lt_extend_str (getenv (name), value, 0);
+ /* some systems can't cope with a ':'-terminated path #' */
+ size_t len = strlen (new_value);
+ while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+ {
+ new_value[--len] = '\0';
+ }
+ lt_setenv (name, new_value);
+ XFREE (new_value);
+ }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+ lt_debugprintf (__FILE__, __LINE__,
+ "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+ nonnull (name), nonnull (value));
+
+ if (name && *name && value && *value)
+ {
+ char *new_value = lt_extend_str (getenv (name), value, 0);
+ lt_setenv (name, new_value);
+ XFREE (new_value);
+ }
+}
+
+EOF
+ case $host_os in
+ mingw*)
+ cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+ Note that spawn() does not by itself call the command interpreter
+ (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+ ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&v);
+ v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+ }) ? "cmd.exe" : "command.com").
+ Instead it simply concatenates the arguments, separated by ' ', and calls
+ CreateProcess(). We must quote the arguments since Win32 CreateProcess()
+ interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+ special way:
+ - Space and tab are interpreted as delimiters. They are not treated as
+ delimiters if they are surrounded by double quotes: "...".
+ - Unescaped double quotes are removed from the input. Their only effect is
+ that within double quotes, space and tab are treated like normal
+ characters.
+ - Backslashes not followed by double quotes are not special.
+ - But 2*n+1 backslashes followed by a double quote become
+ n backslashes followed by a double quote (n >= 0):
+ \" -> "
+ \\\" -> \"
+ \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+ size_t argc;
+ char **new_argv;
+ size_t i;
+
+ /* Count number of arguments. */
+ for (argc = 0; argv[argc] != NULL; argc++)
+ ;
+
+ /* Allocate new argument vector. */
+ new_argv = XMALLOC (char *, argc + 1);
+
+ /* Put quoted arguments into the new argument vector. */
+ for (i = 0; i < argc; i++)
+ {
+ const char *string = argv[i];
+
+ if (string[0] == '\0')
+ new_argv[i] = xstrdup ("\"\"");
+ else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+ {
+ int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+ size_t length;
+ unsigned int backslashes;
+ const char *s;
+ char *quoted_string;
+ char *p;
+
+ length = 0;
+ backslashes = 0;
+ if (quote_around)
+ length++;
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ length += backslashes + 1;
+ length++;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ length += backslashes + 1;
+
+ quoted_string = XMALLOC (char, length + 1);
+
+ p = quoted_string;
+ backslashes = 0;
+ if (quote_around)
+ *p++ = '"';
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ {
+ unsigned int j;
+ for (j = backslashes + 1; j > 0; j--)
+ *p++ = '\\';
+ }
+ *p++ = c;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ {
+ unsigned int j;
+ for (j = backslashes; j > 0; j--)
+ *p++ = '\\';
+ *p++ = '"';
+ }
+ *p = '\0';
+
+ new_argv[i] = quoted_string;
+ }
+ else
+ new_argv[i] = (char *) string;
+ }
+ new_argv[argc] = NULL;
+
+ return new_argv;
+}
+EOF
+ ;;
+ esac
+
+ cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+ func_emit_wrapper yes |
+ $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/ fputs ("\1", f);/p
+g
+D'
+ cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+ $debug_cmd
+
+ case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+ *import*) : ;;
+ *) false ;;
+ esac
+}
+
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+ $debug_cmd
+
+ case " $compile_command " in
+ *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+ suncc_use_cstd_abi=no
+ ;;
+ *)
+ suncc_use_cstd_abi=yes
+ ;;
+ esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+ $debug_cmd
+
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ # It is impossible to link a dll without this setting, and
+ # we shouldn't force the makefile maintainer to figure out
+ # what system we are compiling for in order to pass an extra
+ # flag for every libtool invocation.
+ # allow_undefined=no
+
+ # FIXME: Unfortunately, there are problems with the above when trying
+ # to make a dll that has undefined symbols, in which case not
+ # even a static library is built. For now, we need to specify
+ # -no-undefined on the libtool link line when we can be certain
+ # that all symbols are satisfied, otherwise we get a static library.
+ allow_undefined=yes
+ ;;
+ *)
+ allow_undefined=yes
+ ;;
+ esac
+ libtool_args=$nonopt
+ base_compile="$nonopt $@"
+ compile_command=$nonopt
+ finalize_command=$nonopt
+
+ compile_rpath=
+ finalize_rpath=
+ compile_shlibpath=
+ finalize_shlibpath=
+ convenience=
+ old_convenience=
+ deplibs=
+ old_deplibs=
+ compiler_flags=
+ linker_flags=
+ dllsearchpath=
+ lib_search_path=`pwd`
+ inst_prefix_dir=
+ new_inherited_linker_flags=
+
+ avoid_version=no
+ bindir=
+ dlfiles=
+ dlprefiles=
+ dlself=no
+ export_dynamic=no
+ export_symbols=
+ export_symbols_regex=
+ generated=
+ libobjs=
+ ltlibs=
+ module=no
+ no_install=no
+ objs=
+ os2dllname=
+ non_pic_objects=
+ precious_files_regex=
+ prefer_static_libs=no
+ preload=false
+ prev=
+ prevarg=
+ release=
+ rpath=
+ xrpath=
+ perm_rpath=
+ temp_rpath=
+ thread_safe=no
+ vinfo=
+ vinfo_number=no
+ weak_libs=
+ single_module=$wl-single_module
+ func_infer_tag $base_compile
+
+ # We need to know -static, to get the right output filenames.
+ for arg
+ do
+ case $arg in
+ -shared)
+ test yes != "$build_libtool_libs" \
+ && func_fatal_configuration "cannot build a shared library"
+ build_old_libs=no
+ break
+ ;;
+ -all-static | -static | -static-libtool-libs)
+ case $arg in
+ -all-static)
+ if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
+ func_warning "complete static linking is impossible in this configuration"
+ fi
+ if test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=yes
+ ;;
+ -static)
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=built
+ ;;
+ -static-libtool-libs)
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=yes
+ ;;
+ esac
+ build_libtool_libs=no
+ build_old_libs=yes
+ break
+ ;;
+ esac
+ done
+
+ # See if our shared archives depend on static archives.
+ test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+ # Go through the arguments, transforming them on the way.
+ while test "$#" -gt 0; do
+ arg=$1
+ shift
+ func_quote_arg pretty,unquoted "$arg"
+ qarg=$func_quote_arg_unquoted_result
+ func_append libtool_args " $func_quote_arg_result"
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ output)
+ func_append compile_command " @OUTPUT@"
+ func_append finalize_command " @OUTPUT@"
+ ;;
+ esac
+
+ case $prev in
+ bindir)
+ bindir=$arg
+ prev=
+ continue
+ ;;
+ dlfiles|dlprefiles)
+ $preload || {
+ # Add the symbol object into the linking commands.
+ func_append compile_command " @SYMFILE@"
+ func_append finalize_command " @SYMFILE@"
+ preload=:
+ }
+ case $arg in
+ *.la | *.lo) ;; # We handle these cases below.
+ force)
+ if test no = "$dlself"; then
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ self)
+ if test dlprefiles = "$prev"; then
+ dlself=yes
+ elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
+ dlself=yes
+ else
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ *)
+ if test dlfiles = "$prev"; then
+ func_append dlfiles " $arg"
+ else
+ func_append dlprefiles " $arg"
+ fi
+ prev=
+ continue
+ ;;
+ esac
+ ;;
+ expsyms)
+ export_symbols=$arg
+ test -f "$arg" \
+ || func_fatal_error "symbol file '$arg' does not exist"
+ prev=
+ continue
+ ;;
+ expsyms_regex)
+ export_symbols_regex=$arg
+ prev=
+ continue
+ ;;
+ framework)
+ case $host in
+ *-*-darwin*)
+ case "$deplibs " in
+ *" $qarg.ltframework "*) ;;
+ *) func_append deplibs " $qarg.ltframework" # this is fixed later
+ ;;
+ esac
+ ;;
+ esac
+ prev=
+ continue
+ ;;
+ inst_prefix)
+ inst_prefix_dir=$arg
+ prev=
+ continue
+ ;;
+ mllvm)
+ # Clang does not use LLVM to link, so we can simply discard any
+ # '-mllvm $arg' options when doing the link step.
+ prev=
+ continue
+ ;;
+ objectlist)
+ if test -f "$arg"; then
+ save_arg=$arg
+ moreargs=
+ for fil in `cat "$save_arg"`
+ do
+# func_append moreargs " $fil"
+ arg=$fil
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if func_lalib_unsafe_p "$arg"; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ func_source "$arg"
+
+ if test -z "$pic_object" ||
+ test -z "$non_pic_object" ||
+ test none = "$pic_object" &&
+ test none = "$non_pic_object"; then
+ func_fatal_error "cannot find name of object for '$arg'"
+ fi
+
+ # Extract subdirectory from the argument.
+ func_dirname "$arg" "/" ""
+ xdir=$func_dirname_result
+
+ if test none != "$pic_object"; then
+ # Prepend the subdirectory the object is found in.
+ pic_object=$xdir$pic_object
+
+ if test dlfiles = "$prev"; then
+ if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
+ func_append dlfiles " $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test dlprefiles = "$prev"; then
+ # Preload the old-style object.
+ func_append dlprefiles " $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ func_append libobjs " $pic_object"
+ arg=$pic_object
+ fi
+
+ # Non-PIC object.
+ if test none != "$non_pic_object"; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object=$xdir$non_pic_object
+
+ # A standard non-PIC object
+ func_append non_pic_objects " $non_pic_object"
+ if test -z "$pic_object" || test none = "$pic_object"; then
+ arg=$non_pic_object
+ fi
+ else
+ # If the PIC object exists, use it instead.
+ # $xdir was prepended to $pic_object above.
+ non_pic_object=$pic_object
+ func_append non_pic_objects " $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if $opt_dry_run; then
+ # Extract subdirectory from the argument.
+ func_dirname "$arg" "/" ""
+ xdir=$func_dirname_result
+
+ func_lo2o "$arg"
+ pic_object=$xdir$objdir/$func_lo2o_result
+ non_pic_object=$xdir$func_lo2o_result
+ func_append libobjs " $pic_object"
+ func_append non_pic_objects " $non_pic_object"
+ else
+ func_fatal_error "'$arg' is not a valid libtool object"
+ fi
+ fi
+ done
+ else
+ func_fatal_error "link input file '$arg' does not exist"
+ fi
+ arg=$save_arg
+ prev=
+ continue
+ ;;
+ os2dllname)
+ os2dllname=$arg
+ prev=
+ continue
+ ;;
+ precious_regex)
+ precious_files_regex=$arg
+ prev=
+ continue
+ ;;
+ release)
+ release=-$arg
+ prev=
+ continue
+ ;;
+ rpath | xrpath)
+ # We need an absolute path.
+ case $arg in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ func_fatal_error "only absolute run-paths are allowed"
+ ;;
+ esac
+ if test rpath = "$prev"; then
+ case "$rpath " in
+ *" $arg "*) ;;
+ *) func_append rpath " $arg" ;;
+ esac
+ else
+ case "$xrpath " in
+ *" $arg "*) ;;
+ *) func_append xrpath " $arg" ;;
+ esac
+ fi
+ prev=
+ continue
+ ;;
+ shrext)
+ shrext_cmds=$arg
+ prev=
+ continue
+ ;;
+ weak)
+ func_append weak_libs " $arg"
+ prev=
+ continue
+ ;;
+ xassembler)
+ func_append compiler_flags " -Xassembler $qarg"
+ prev=
+ func_append compile_command " -Xassembler $qarg"
+ func_append finalize_command " -Xassembler $qarg"
+ continue
+ ;;
+ xcclinker)
+ func_append linker_flags " $qarg"
+ func_append compiler_flags " $qarg"
+ prev=
+ func_append compile_command " $qarg"
+ func_append finalize_command " $qarg"
+ continue
+ ;;
+ xcompiler)
+ func_append compiler_flags " $qarg"
+ prev=
+ func_append compile_command " $qarg"
+ func_append finalize_command " $qarg"
+ continue
+ ;;
+ xlinker)
+ func_append linker_flags " $qarg"
+ func_append compiler_flags " $wl$qarg"
+ prev=
+ func_append compile_command " $wl$qarg"
+ func_append finalize_command " $wl$qarg"
+ continue
+ ;;
+ *)
+ eval "$prev=\"\$arg\""
+ prev=
+ continue
+ ;;
+ esac
+ fi # test -n "$prev"
+
+ prevarg=$arg
+
+ case $arg in
+ -all-static)
+ if test -n "$link_static_flag"; then
+ # See comment for -static flag below, for more details.
+ func_append compile_command " $link_static_flag"
+ func_append finalize_command " $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -allow-undefined)
+ # FIXME: remove this flag sometime in the future.
+ func_fatal_error "'-allow-undefined' must not be used because it is the default"
+ ;;
+
+ -avoid-version)
+ avoid_version=yes
+ continue
+ ;;
+
+ -bindir)
+ prev=bindir
+ continue
+ ;;
+
+ -dlopen)
+ prev=dlfiles
+ continue
+ ;;
+
+ -dlpreopen)
+ prev=dlprefiles
+ continue
+ ;;
+
+ -export-dynamic)
+ export_dynamic=yes
+ continue
+ ;;
+
+ -export-symbols | -export-symbols-regex)
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ func_fatal_error "more than one -exported-symbols argument is not allowed"
+ fi
+ if test X-export-symbols = "X$arg"; then
+ prev=expsyms
+ else
+ prev=expsyms_regex
+ fi
+ continue
+ ;;
+
+ -framework)
+ prev=framework
+ continue
+ ;;
+
+ -inst-prefix-dir)
+ prev=inst_prefix
+ continue
+ ;;
+
+ # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+ # so, if we see these flags be careful not to treat them like -L
+ -L[A-Z][A-Z]*:*)
+ case $with_gcc/$host in
+ no/*-*-irix* | /*-*-irix*)
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ ;;
+ esac
+ continue
+ ;;
+
+ -L*)
+ func_stripname "-L" '' "$arg"
+ if test -z "$func_stripname_result"; then
+ if test "$#" -gt 0; then
+ func_fatal_error "require no space between '-L' and '$1'"
+ else
+ func_fatal_error "need path for '-L' option"
+ fi
+ fi
+ func_resolve_sysroot "$func_stripname_result"
+ dir=$func_resolve_sysroot_result
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ test -z "$absdir" && \
+ func_fatal_error "cannot determine absolute directory name of '$dir'"
+ dir=$absdir
+ ;;
+ esac
+ case "$deplibs " in
+ *" -L$dir "* | *" $arg "*)
+ # Will only happen for absolute or sysroot arguments
+ ;;
+ *)
+ # Preserve sysroot, but never include relative directories
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+ *) func_append deplibs " -L$dir" ;;
+ esac
+ func_append lib_search_path " $dir"
+ ;;
+ esac
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$dir:"*) ;;
+ ::) dllsearchpath=$dir;;
+ *) func_append dllsearchpath ":$dir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ ::) dllsearchpath=$testbindir;;
+ *) func_append dllsearchpath ":$testbindir";;
+ esac
+ ;;
+ esac
+ continue
+ ;;
+
+ -l*)
+ if test X-lc = "X$arg" || test X-lm = "X$arg"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+ # These systems don't actually have a C or math library (as such)
+ continue
+ ;;
+ *-*-os2*)
+ # These systems don't actually have a C library (as such)
+ test X-lc = "X$arg" && continue
+ ;;
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*)
+ # Do not include libc due to us having libc/libc_r.
+ test X-lc = "X$arg" && continue
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C and math libraries are in the System framework
+ func_append deplibs " System.ltframework"
+ continue
+ ;;
+ *-*-sco3.2v5* | *-*-sco5v6*)
+ # Causes problems with __ctype
+ test X-lc = "X$arg" && continue
+ ;;
+ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+ # Compiler inserts libc in the correct place for threads to work
+ test X-lc = "X$arg" && continue
+ ;;
+ esac
+ elif test X-lc_r = "X$arg"; then
+ case $host in
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*)
+ # Do not include libc_r directly, use -pthread flag.
+ continue
+ ;;
+ esac
+ fi
+ func_append deplibs " $arg"
+ continue
+ ;;
+
+ -mllvm)
+ prev=mllvm
+ continue
+ ;;
+
+ -module)
+ module=yes
+ continue
+ ;;
+
+ # Tru64 UNIX uses -model [arg] to determine the layout of C++
+ # classes, name mangling, and exception handling.
+ # Darwin uses the -arch flag to determine output architecture.
+ -model|-arch|-isysroot|--sysroot)
+ func_append compiler_flags " $arg"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ prev=xcompiler
+ continue
+ ;;
+ # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199.
+ -pthread)
+ case $host in
+ *solaris2*) ;;
+ *)
+ case "$new_inherited_linker_flags " in
+ *" $arg "*) ;;
+ * ) func_append new_inherited_linker_flags " $arg" ;;
+ esac
+ ;;
+ esac
+ continue
+ ;;
+ -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ func_append compiler_flags " $arg"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ case "$new_inherited_linker_flags " in
+ *" $arg "*) ;;
+ * ) func_append new_inherited_linker_flags " $arg" ;;
+ esac
+ continue
+ ;;
+
+ -multi_module)
+ single_module=$wl-multi_module
+ continue
+ ;;
+
+ -no-fast-install)
+ fast_install=no
+ continue
+ ;;
+
+ -no-install)
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+ # The PATH hackery in wrapper scripts is required on Windows
+ # and Darwin in order for the loader to find any dlls it needs.
+ func_warning "'-no-install' is ignored for $host"
+ func_warning "assuming '-no-fast-install' instead"
+ fast_install=no
+ ;;
+ *) no_install=yes ;;
+ esac
+ continue
+ ;;
+
+ -no-undefined)
+ allow_undefined=no
+ continue
+ ;;
+
+ -objectlist)
+ prev=objectlist
+ continue
+ ;;
+
+ -os2dllname)
+ prev=os2dllname
+ continue
+ ;;
+
+ -o) prev=output ;;
+
+ -precious-files-regex)
+ prev=precious_regex
+ continue
+ ;;
+
+ -release)
+ prev=release
+ continue
+ ;;
+
+ -rpath)
+ prev=rpath
+ continue
+ ;;
+
+ -R)
+ prev=xrpath
+ continue
+ ;;
+
+ -R*)
+ func_stripname '-R' '' "$arg"
+ dir=$func_stripname_result
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ =*)
+ func_stripname '=' '' "$dir"
+ dir=$lt_sysroot$func_stripname_result
+ ;;
+ *)
+ func_fatal_error "only absolute run-paths are allowed"
+ ;;
+ esac
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) func_append xrpath " $dir" ;;
+ esac
+ continue
+ ;;
+
+ -shared)
+ # The effects of -shared are defined in a previous loop.
+ continue
+ ;;
+
+ -shrext)
+ prev=shrext
+ continue
+ ;;
+
+ -static | -static-libtool-libs)
+ # The effects of -static are defined in a previous loop.
+ # We used to do the same as -all-static on platforms that
+ # didn't have a PIC flag, but the assumption that the effects
+ # would be equivalent was wrong. It would break on at least
+ # Digital Unix and AIX.
+ continue
+ ;;
+
+ -thread-safe)
+ thread_safe=yes
+ continue
+ ;;
+
+ -version-info)
+ prev=vinfo
+ continue
+ ;;
+
+ -version-number)
+ prev=vinfo
+ vinfo_number=yes
+ continue
+ ;;
+
+ -weak)
+ prev=weak
+ continue
+ ;;
+
+ -Wc,*)
+ func_stripname '-Wc,' '' "$arg"
+ args=$func_stripname_result
+ arg=
+ save_ifs=$IFS; IFS=,
+ for flag in $args; do
+ IFS=$save_ifs
+ func_quote_arg pretty "$flag"
+ func_append arg " $func_quote_arg_result"
+ func_append compiler_flags " $func_quote_arg_result"
+ done
+ IFS=$save_ifs
+ func_stripname ' ' '' "$arg"
+ arg=$func_stripname_result
+ ;;
+
+ -Wl,*)
+ func_stripname '-Wl,' '' "$arg"
+ args=$func_stripname_result
+ arg=
+ save_ifs=$IFS; IFS=,
+ for flag in $args; do
+ IFS=$save_ifs
+ func_quote_arg pretty "$flag"
+ func_append arg " $wl$func_quote_arg_result"
+ func_append compiler_flags " $wl$func_quote_arg_result"
+ func_append linker_flags " $func_quote_arg_result"
+ done
+ IFS=$save_ifs
+ func_stripname ' ' '' "$arg"
+ arg=$func_stripname_result
+ ;;
+
+ -Xassembler)
+ prev=xassembler
+ continue
+ ;;
+
+ -Xcompiler)
+ prev=xcompiler
+ continue
+ ;;
+
+ -Xlinker)
+ prev=xlinker
+ continue
+ ;;
+
+ -XCClinker)
+ prev=xcclinker
+ continue
+ ;;
+
+ # -msg_* for osf cc
+ -msg_*)
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
+ ;;
+
+ # Flags to be passed through unchanged, with rationale:
+ # -64, -mips[0-9] enable 64-bit mode for the SGI compiler
+ # -r[0-9][0-9]* specify processor for the SGI compiler
+ # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+ # +DA*, +DD* enable 64-bit mode for the HP compiler
+ # -q* compiler args for the IBM compiler
+ # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+ # -F/path path to uninstalled frameworks, gcc on darwin
+ # -p, -pg, --coverage, -fprofile-* profiling flags for GCC
+ # -fstack-protector* stack protector flags for GCC
+ # @file GCC response files
+ # -tp=* Portland pgcc target processor selection
+ # --sysroot=* for sysroot support
+ # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+ # -specs=* GCC specs files
+ # -stdlib=* select c++ std lib with clang
+ # -fsanitize=* Clang/GCC memory and address sanitizer
+ # -fuse-ld=* Linker select flags for GCC
+ # -Wa,* Pass flags directly to the assembler
+ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+ -specs=*|-fsanitize=*|-fuse-ld=*|-Wa,*)
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ func_append compiler_flags " $arg"
+ continue
+ ;;
+
+ -Z*)
+ if test os2 = "`expr $host : '.*\(os2\)'`"; then
+ # OS/2 uses -Zxxx to specify OS/2-specific options
+ compiler_flags="$compiler_flags $arg"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ case $arg in
+ -Zlinker | -Zstack)
+ prev=xcompiler
+ ;;
+ esac
+ continue
+ else
+ # Otherwise treat like 'Some other compiler flag' below
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
+ fi
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
+ ;;
+
+ *.$objext)
+ # A standard object.
+ func_append objs " $arg"
+ ;;
+
+ *.lo)
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if func_lalib_unsafe_p "$arg"; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ func_source "$arg"
+
+ if test -z "$pic_object" ||
+ test -z "$non_pic_object" ||
+ test none = "$pic_object" &&
+ test none = "$non_pic_object"; then
+ func_fatal_error "cannot find name of object for '$arg'"
+ fi
+
+ # Extract subdirectory from the argument.
+ func_dirname "$arg" "/" ""
+ xdir=$func_dirname_result
+
+ test none = "$pic_object" || {
+ # Prepend the subdirectory the object is found in.
+ pic_object=$xdir$pic_object
+
+ if test dlfiles = "$prev"; then
+ if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
+ func_append dlfiles " $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test dlprefiles = "$prev"; then
+ # Preload the old-style object.
+ func_append dlprefiles " $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ func_append libobjs " $pic_object"
+ arg=$pic_object
+ }
+
+ # Non-PIC object.
+ if test none != "$non_pic_object"; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object=$xdir$non_pic_object
+
+ # A standard non-PIC object
+ func_append non_pic_objects " $non_pic_object"
+ if test -z "$pic_object" || test none = "$pic_object"; then
+ arg=$non_pic_object
+ fi
+ else
+ # If the PIC object exists, use it instead.
+ # $xdir was prepended to $pic_object above.
+ non_pic_object=$pic_object
+ func_append non_pic_objects " $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if $opt_dry_run; then
+ # Extract subdirectory from the argument.
+ func_dirname "$arg" "/" ""
+ xdir=$func_dirname_result
+
+ func_lo2o "$arg"
+ pic_object=$xdir$objdir/$func_lo2o_result
+ non_pic_object=$xdir$func_lo2o_result
+ func_append libobjs " $pic_object"
+ func_append non_pic_objects " $non_pic_object"
+ else
+ func_fatal_error "'$arg' is not a valid libtool object"
+ fi
+ fi
+ ;;
+
+ *.$libext)
+ # An archive.
+ func_append deplibs " $arg"
+ func_append old_deplibs " $arg"
+ continue
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ func_resolve_sysroot "$arg"
+ if test dlfiles = "$prev"; then
+ # This library was specified with -dlopen.
+ func_append dlfiles " $func_resolve_sysroot_result"
+ prev=
+ elif test dlprefiles = "$prev"; then
+ # The library was specified with -dlpreopen.
+ func_append dlprefiles " $func_resolve_sysroot_result"
+ prev=
+ else
+ func_append deplibs " $func_resolve_sysroot_result"
+ fi
+ continue
+ ;;
+
+ # Some other compiler argument.
+ *)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
+ ;;
+ esac # arg
+
+ # Now actually substitute the argument into the commands.
+ if test -n "$arg"; then
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ fi
+ done # argument parsing loop
+
+ test -n "$prev" && \
+ func_fatal_help "the '$prevarg' option requires an argument"
+
+ if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ fi
+
+ oldlibs=
+ # calculate the name of the file, without its directory
+ func_basename "$output"
+ outputname=$func_basename_result
+ libobjs_save=$libobjs
+
+ if test -n "$shlibpath_var"; then
+ # get the directories listed in $shlibpath_var
+ eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
+ else
+ shlib_search_path=
+ fi
+ eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+ eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+ # Definition is injected by LT_CONFIG during libtool generation.
+ func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
+ func_dirname "$output" "/" ""
+ output_objdir=$func_dirname_result$objdir
+ func_to_tool_file "$output_objdir/"
+ tool_output_objdir=$func_to_tool_file_result
+ # Create the object directory.
+ func_mkdir_p "$output_objdir"
+
+ # Determine the type of output
+ case $output in
+ "")
+ func_fatal_help "you must specify an output file"
+ ;;
+ *.$libext) linkmode=oldlib ;;
+ *.lo | *.$objext) linkmode=obj ;;
+ *.la) linkmode=lib ;;
+ *) linkmode=prog ;; # Anything else should be a program.
+ esac
+
+ specialdeplibs=
+
+ libs=
+ # Find all interdependent deplibs by searching for libraries
+ # that are linked more than once (e.g. -la -lb -la)
+ for deplib in $deplibs; do
+ if $opt_preserve_dup_deps; then
+ case "$libs " in
+ *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+ esac
+ fi
+ func_append libs " $deplib"
+ done
+
+ if test lib = "$linkmode"; then
+ libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+ # Compute libraries that are listed more than once in $predeps
+ # $postdeps and mark them as special (i.e., whose duplicates are
+ # not to be eliminated).
+ pre_post_deps=
+ if $opt_duplicate_compiler_generated_deps; then
+ for pre_post_dep in $predeps $postdeps; do
+ case "$pre_post_deps " in
+ *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+ esac
+ func_append pre_post_deps " $pre_post_dep"
+ done
+ fi
+ pre_post_deps=
+ fi
+
+ deplibs=
+ newdependency_libs=
+ newlib_search_path=
+ need_relink=no # whether we're linking any uninstalled libtool libraries
+ notinst_deplibs= # not-installed libtool libraries
+ notinst_path= # paths that contain not-installed libtool libraries
+
+ case $linkmode in
+ lib)
+ passes="conv dlpreopen link"
+ for file in $dlfiles $dlprefiles; do
+ case $file in
+ *.la) ;;
+ *)
+ func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
+ ;;
+ esac
+ done
+ ;;
+ prog)
+ compile_deplibs=
+ finalize_deplibs=
+ alldeplibs=false
+ newdlfiles=
+ newdlprefiles=
+ passes="conv scan dlopen dlpreopen link"
+ ;;
+ *) passes="conv"
+ ;;
+ esac
+
+ for pass in $passes; do
+ # The preopen pass in lib mode reverses $deplibs; put it back here
+ # so that -L comes before libs that need it for instance...
+ if test lib,link = "$linkmode,$pass"; then
+ ## FIXME: Find the place where the list is rebuilt in the wrong
+ ## order, and fix it there properly
+ tmp_deplibs=
+ for deplib in $deplibs; do
+ tmp_deplibs="$deplib $tmp_deplibs"
+ done
+ deplibs=$tmp_deplibs
+ fi
+
+ if test lib,link = "$linkmode,$pass" ||
+ test prog,scan = "$linkmode,$pass"; then
+ libs=$deplibs
+ deplibs=
+ fi
+ if test prog = "$linkmode"; then
+ case $pass in
+ dlopen) libs=$dlfiles ;;
+ dlpreopen) libs=$dlprefiles ;;
+ link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+ esac
+ fi
+ if test lib,dlpreopen = "$linkmode,$pass"; then
+ # Collect and forward deplibs of preopened libtool libs
+ for lib in $dlprefiles; do
+ # Ignore non-libtool-libs
+ dependency_libs=
+ func_resolve_sysroot "$lib"
+ case $lib in
+ *.la) func_source "$func_resolve_sysroot_result" ;;
+ esac
+
+ # Collect preopened libtool deplibs, except any this library
+ # has declared as weak libs
+ for deplib in $dependency_libs; do
+ func_basename "$deplib"
+ deplib_base=$func_basename_result
+ case " $weak_libs " in
+ *" $deplib_base "*) ;;
+ *) func_append deplibs " $deplib" ;;
+ esac
+ done
+ done
+ libs=$dlprefiles
+ fi
+ if test dlopen = "$pass"; then
+ # Collect dlpreopened libraries
+ save_deplibs=$deplibs
+ deplibs=
+ fi
+
+ for deplib in $libs; do
+ lib=
+ found=false
+ case $deplib in
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ if test prog,link = "$linkmode,$pass"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ func_append compiler_flags " $deplib"
+ if test lib = "$linkmode"; then
+ case "$new_inherited_linker_flags " in
+ *" $deplib "*) ;;
+ * ) func_append new_inherited_linker_flags " $deplib" ;;
+ esac
+ fi
+ fi
+ continue
+ ;;
+ -l*)
+ if test lib != "$linkmode" && test prog != "$linkmode"; then
+ func_warning "'-l' is ignored for archives/objects"
+ continue
+ fi
+ func_stripname '-l' '' "$deplib"
+ name=$func_stripname_result
+ if test lib = "$linkmode"; then
+ searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+ else
+ searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+ fi
+ for searchdir in $searchdirs; do
+ for search_ext in .la $std_shrext .so .a; do
+ # Search the libtool library
+ lib=$searchdir/lib$name$search_ext
+ if test -f "$lib"; then
+ if test .la = "$search_ext"; then
+ found=:
+ else
+ found=false
+ fi
+ break 2
+ fi
+ done
+ done
+ if $found; then
+ # deplib is a libtool library
+ # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+ # We need to do some special things here, and not later.
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+ case " $predeps $postdeps " in
+ *" $deplib "*)
+ if func_lalib_p "$lib"; then
+ library_names=
+ old_library=
+ func_source "$lib"
+ for l in $old_library $library_names; do
+ ll=$l
+ done
+ if test "X$ll" = "X$old_library"; then # only static version available
+ found=false
+ func_dirname "$lib" "" "."
+ ladir=$func_dirname_result
+ lib=$ladir/$old_library
+ if test prog,link = "$linkmode,$pass"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ fi
+ fi
+ ;;
+ *) ;;
+ esac
+ fi
+ else
+ # deplib doesn't seem to be a libtool library
+ if test prog,link = "$linkmode,$pass"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ fi
+ ;; # -l
+ *.ltframework)
+ if test prog,link = "$linkmode,$pass"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ if test lib = "$linkmode"; then
+ case "$new_inherited_linker_flags " in
+ *" $deplib "*) ;;
+ * ) func_append new_inherited_linker_flags " $deplib" ;;
+ esac
+ fi
+ fi
+ continue
+ ;;
+ -L*)
+ case $linkmode in
+ lib)
+ deplibs="$deplib $deplibs"
+ test conv = "$pass" && continue
+ newdependency_libs="$deplib $newdependency_libs"
+ func_stripname '-L' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result"
+ func_append newlib_search_path " $func_resolve_sysroot_result"
+ ;;
+ prog)
+ if test conv = "$pass"; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ if test scan = "$pass"; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ func_stripname '-L' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result"
+ func_append newlib_search_path " $func_resolve_sysroot_result"
+ ;;
+ *)
+ func_warning "'-L' is ignored for archives/objects"
+ ;;
+ esac # linkmode
+ continue
+ ;; # -L
+ -R*)
+ if test link = "$pass"; then
+ func_stripname '-R' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result"
+ dir=$func_resolve_sysroot_result
+ # Make sure the xrpath contains only unique directories.
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) func_append xrpath " $dir" ;;
+ esac
+ fi
+ deplibs="$deplib $deplibs"
+ continue
+ ;;
+ *.la)
+ func_resolve_sysroot "$deplib"
+ lib=$func_resolve_sysroot_result
+ ;;
+ *.$libext)
+ if test conv = "$pass"; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ case $linkmode in
+ lib)
+ # Linking convenience modules into shared libraries is allowed,
+ # but linking other static libraries is non-portable.
+ case " $dlpreconveniencelibs " in
+ *" $deplib "*) ;;
+ *)
+ valid_a_lib=false
+ case $deplibs_check_method in
+ match_pattern*)
+ set dummy $deplibs_check_method; shift
+ match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+ if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+ | $EGREP "$match_pattern_regex" > /dev/null; then
+ valid_a_lib=:
+ fi
+ ;;
+ pass_all)
+ valid_a_lib=:
+ ;;
+ esac
+ if $valid_a_lib; then
+ echo
+ $ECHO "*** Warning: Linking the shared library $output against the"
+ $ECHO "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ else
+ echo
+ $ECHO "*** Warning: Trying to link with static lib archive $deplib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because the file extensions .$libext of this argument makes me believe"
+ echo "*** that it is just a static archive that I should not use here."
+ fi
+ ;;
+ esac
+ continue
+ ;;
+ prog)
+ if test link != "$pass"; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ continue
+ ;;
+ esac # linkmode
+ ;; # *.$libext
+ *.lo | *.$objext)
+ if test conv = "$pass"; then
+ deplibs="$deplib $deplibs"
+ elif test prog = "$linkmode"; then
+ if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
+ # If there is no dlopen support or we're linking statically,
+ # we need to preload.
+ func_append newdlprefiles " $deplib"
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ func_append newdlfiles " $deplib"
+ fi
+ fi
+ continue
+ ;;
+ %DEPLIBS%)
+ alldeplibs=:
+ continue
+ ;;
+ esac # case $deplib
+
+ $found || test -f "$lib" \
+ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
+
+ # Check to see that this really is a libtool archive.
+ func_lalib_unsafe_p "$lib" \
+ || func_fatal_error "'$lib' is not a valid libtool archive"
+
+ func_dirname "$lib" "" "."
+ ladir=$func_dirname_result
+
+ dlname=
+ dlopen=
+ dlpreopen=
+ libdir=
+ library_names=
+ old_library=
+ inherited_linker_flags=
+ # If the library was installed with an old release of libtool,
+ # it will not redefine variables installed, or shouldnotlink
+ installed=yes
+ shouldnotlink=no
+ avoidtemprpath=
+
+
+ # Read the .la file
+ func_source "$lib"
+
+ # Convert "-framework foo" to "foo.ltframework"
+ if test -n "$inherited_linker_flags"; then
+ tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+ for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+ case " $new_inherited_linker_flags " in
+ *" $tmp_inherited_linker_flag "*) ;;
+ *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+ esac
+ done
+ fi
+ dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ if test lib,link = "$linkmode,$pass" ||
+ test prog,scan = "$linkmode,$pass" ||
+ { test prog != "$linkmode" && test lib != "$linkmode"; }; then
+ test -n "$dlopen" && func_append dlfiles " $dlopen"
+ test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+ fi
+
+ if test conv = "$pass"; then
+ # Only check for convenience libraries
+ deplibs="$lib $deplibs"
+ if test -z "$libdir"; then
+ if test -z "$old_library"; then
+ func_fatal_error "cannot find name of link library for '$lib'"
+ fi
+ # It is a libtool convenience library, so add in its objects.
+ func_append convenience " $ladir/$objdir/$old_library"
+ func_append old_convenience " $ladir/$objdir/$old_library"
+ elif test prog != "$linkmode" && test lib != "$linkmode"; then
+ func_fatal_error "'$lib' is not a convenience library"
+ fi
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ if $opt_preserve_dup_deps; then
+ case "$tmp_libs " in
+ *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+ esac
+ fi
+ func_append tmp_libs " $deplib"
+ done
+ continue
+ fi # $pass = conv
+
+
+ # Get the name of the library we link against.
+ linklib=
+ if test -n "$old_library" &&
+ { test yes = "$prefer_static_libs" ||
+ test built,no = "$prefer_static_libs,$installed"; }; then
+ linklib=$old_library
+ else
+ for l in $old_library $library_names; do
+ linklib=$l
+ done
+ fi
+ if test -z "$linklib"; then
+ func_fatal_error "cannot find name of link library for '$lib'"
+ fi
+
+ # This library was specified with -dlopen.
+ if test dlopen = "$pass"; then
+ test -z "$libdir" \
+ && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
+ if test -z "$dlname" ||
+ test yes != "$dlopen_support" ||
+ test no = "$build_libtool_libs"
+ then
+ # If there is no dlname, no dlopen support or we're linking
+ # statically, we need to preload. We also need to preload any
+ # dependent libraries so libltdl's deplib preloader doesn't
+ # bomb out in the load deplibs phase.
+ func_append dlprefiles " $lib $dependency_libs"
+ else
+ func_append newdlfiles " $lib"
+ fi
+ continue
+ fi # $pass = dlopen
+
+ # We need an absolute path.
+ case $ladir in
+ [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
+ *)
+ abs_ladir=`cd "$ladir" && pwd`
+ if test -z "$abs_ladir"; then
+ func_warning "cannot determine absolute directory name of '$ladir'"
+ func_warning "passing it literally to the linker, although it might fail"
+ abs_ladir=$ladir
+ fi
+ ;;
+ esac
+ func_basename "$lib"
+ laname=$func_basename_result
+
+ # Find the relevant object directory and library name.
+ if test yes = "$installed"; then
+ if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ func_warning "library '$lib' was moved."
+ dir=$ladir
+ absdir=$abs_ladir
+ libdir=$abs_ladir
+ else
+ dir=$lt_sysroot$libdir
+ absdir=$lt_sysroot$libdir
+ fi
+ test yes = "$hardcode_automatic" && avoidtemprpath=yes
+ else
+ if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ dir=$ladir
+ absdir=$abs_ladir
+ # Remove this search path later
+ func_append notinst_path " $abs_ladir"
+ else
+ dir=$ladir/$objdir
+ absdir=$abs_ladir/$objdir
+ # Remove this search path later
+ func_append notinst_path " $abs_ladir"
+ fi
+ fi # $installed = yes
+ func_stripname 'lib' '.la' "$laname"
+ name=$func_stripname_result
+
+ # This library was specified with -dlpreopen.
+ if test dlpreopen = "$pass"; then
+ if test -z "$libdir" && test prog = "$linkmode"; then
+ func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
+ fi
+ case $host in
+ # special handling for platforms with PE-DLLs.
+ *cygwin* | *mingw* | *cegcc* )
+ # Linker will automatically link against shared library if both
+ # static and shared are present. Therefore, ensure we extract
+ # symbols from the import library if a shared library is present
+ # (otherwise, the dlopen module name will be incorrect). We do
+ # this by putting the import library name into $newdlprefiles.
+ # We recover the dlopen module name by 'saving' the la file
+ # name in a special purpose variable, and (later) extracting the
+ # dlname from the la file.
+ if test -n "$dlname"; then
+ func_tr_sh "$dir/$linklib"
+ eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+ func_append newdlprefiles " $dir/$linklib"
+ else
+ func_append newdlprefiles " $dir/$old_library"
+ # Keep a list of preopened convenience libraries to check
+ # that they are being used correctly in the link pass.
+ test -z "$libdir" && \
+ func_append dlpreconveniencelibs " $dir/$old_library"
+ fi
+ ;;
+ * )
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ func_append newdlprefiles " $dir/$old_library"
+ # Keep a list of preopened convenience libraries to check
+ # that they are being used correctly in the link pass.
+ test -z "$libdir" && \
+ func_append dlpreconveniencelibs " $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ func_append newdlprefiles " $dir/$dlname"
+ else
+ func_append newdlprefiles " $dir/$linklib"
+ fi
+ ;;
+ esac
+ fi # $pass = dlpreopen
+
+ if test -z "$libdir"; then
+ # Link the convenience library
+ if test lib = "$linkmode"; then
+ deplibs="$dir/$old_library $deplibs"
+ elif test prog,link = "$linkmode,$pass"; then
+ compile_deplibs="$dir/$old_library $compile_deplibs"
+ finalize_deplibs="$dir/$old_library $finalize_deplibs"
+ else
+ deplibs="$lib $deplibs" # used for prog,scan pass
+ fi
+ continue
+ fi
+
+
+ if test prog = "$linkmode" && test link != "$pass"; then
+ func_append newlib_search_path " $ladir"
+ deplibs="$lib $deplibs"
+
+ linkalldeplibs=false
+ if test no != "$link_all_deplibs" || test -z "$library_names" ||
+ test no = "$build_libtool_libs"; then
+ linkalldeplibs=:
+ fi
+
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) func_stripname '-L' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result"
+ func_append newlib_search_path " $func_resolve_sysroot_result"
+ ;;
+ esac
+ # Need to link against all dependency_libs?
+ if $linkalldeplibs; then
+ deplibs="$deplib $deplibs"
+ else
+ # Need to hardcode shared library paths
+ # or/and link against static libraries
+ newdependency_libs="$deplib $newdependency_libs"
+ fi
+ if $opt_preserve_dup_deps; then
+ case "$tmp_libs " in
+ *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+ esac
+ fi
+ func_append tmp_libs " $deplib"
+ done # for deplib
+ continue
+ fi # $linkmode = prog...
+
+ if test prog,link = "$linkmode,$pass"; then
+ if test -n "$library_names" &&
+ { { test no = "$prefer_static_libs" ||
+ test built,yes = "$prefer_static_libs,$installed"; } ||
+ test -z "$old_library"; }; then
+ # We need to hardcode the library path
+ if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
+ # Make sure the rpath contains only unique directories.
+ case $temp_rpath: in
+ *"$absdir:"*) ;;
+ *) func_append temp_rpath "$absdir:" ;;
+ esac
+ fi
+
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) func_append compile_rpath " $absdir" ;;
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) func_append finalize_rpath " $libdir" ;;
+ esac
+ ;;
+ esac
+ fi # $linkmode,$pass = prog,link...
+
+ if $alldeplibs &&
+ { test pass_all = "$deplibs_check_method" ||
+ { test yes = "$build_libtool_libs" &&
+ test -n "$library_names"; }; }; then
+ # We only need to search for static libraries
+ continue
+ fi
+ fi
+
+ link_static=no # Whether the deplib will be linked statically
+ use_static_libs=$prefer_static_libs
+ if test built = "$use_static_libs" && test yes = "$installed"; then
+ use_static_libs=no
+ fi
+ if test -n "$library_names" &&
+ { test no = "$use_static_libs" || test -z "$old_library"; }; then
+ case $host in
+ *cygwin* | *mingw* | *cegcc* | *os2*)
+ # No point in relinking DLLs because paths are not encoded
+ func_append notinst_deplibs " $lib"
+ need_relink=no
+ ;;
+ *)
+ if test no = "$installed"; then
+ func_append notinst_deplibs " $lib"
+ need_relink=yes
+ fi
+ ;;
+ esac
+ # This is a shared library
+
+ # Warn about portability, can't link against -module's on some
+ # systems (darwin). Don't bleat about dlopened modules though!
+ dlopenmodule=
+ for dlpremoduletest in $dlprefiles; do
+ if test "X$dlpremoduletest" = "X$lib"; then
+ dlopenmodule=$dlpremoduletest
+ break
+ fi
+ done
+ if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
+ echo
+ if test prog = "$linkmode"; then
+ $ECHO "*** Warning: Linking the executable $output against the loadable module"
+ else
+ $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+ fi
+ $ECHO "*** $linklib is not portable!"
+ fi
+ if test lib = "$linkmode" &&
+ test yes = "$hardcode_into_libs"; then
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) func_append compile_rpath " $absdir" ;;
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) func_append finalize_rpath " $libdir" ;;
+ esac
+ ;;
+ esac
+ fi
+
+ if test -n "$old_archive_from_expsyms_cmds"; then
+ # figure out the soname
+ set dummy $library_names
+ shift
+ realname=$1
+ shift
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ # use dlname if we got it. it's perfectly good, no?
+ if test -n "$dlname"; then
+ soname=$dlname
+ elif test -n "$soname_spec"; then
+ # bleh windows
+ case $host in
+ *cygwin* | mingw* | *cegcc* | *os2*)
+ func_arith $current - $age
+ major=$func_arith_result
+ versuffix=-$major
+ ;;
+ esac
+ eval soname=\"$soname_spec\"
+ else
+ soname=$realname
+ fi
+
+ # Make a new name for the extract_expsyms_cmds to use
+ soroot=$soname
+ func_basename "$soroot"
+ soname=$func_basename_result
+ func_stripname 'lib' '.dll' "$soname"
+ newlib=libimp-$func_stripname_result.a
+
+ # If the library has no export list, then create one now
+ if test -f "$output_objdir/$soname-def"; then :
+ else
+ func_verbose "extracting exported symbol list from '$soname'"
+ func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+ fi
+
+ # Create $newlib
+ if test -f "$output_objdir/$newlib"; then :; else
+ func_verbose "generating import library for '$soname'"
+ func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+ fi
+ # make sure the library variables are pointing to the new library
+ dir=$output_objdir
+ linklib=$newlib
+ fi # test -n "$old_archive_from_expsyms_cmds"
+
+ if test prog = "$linkmode" || test relink != "$opt_mode"; then
+ add_shlibpath=
+ add_dir=
+ add=
+ lib_linked=yes
+ case $hardcode_action in
+ immediate | unsupported)
+ if test no = "$hardcode_direct"; then
+ add=$dir/$linklib
+ case $host in
+ *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
+ *-*-sysv4*uw2*) add_dir=-L$dir ;;
+ *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+ *-*-unixware7*) add_dir=-L$dir ;;
+ *-*-darwin* )
+ # if the lib is a (non-dlopened) module then we cannot
+ # link against it, someone is ignoring the earlier warnings
+ if /usr/bin/file -L $add 2> /dev/null |
+ $GREP ": [^:]* bundle" >/dev/null; then
+ if test "X$dlopenmodule" != "X$lib"; then
+ $ECHO "*** Warning: lib $linklib is a module, not a shared library"
+ if test -z "$old_library"; then
+ echo
+ echo "*** And there doesn't seem to be a static archive available"
+ echo "*** The link will probably fail, sorry"
+ else
+ add=$dir/$old_library
+ fi
+ elif test -n "$old_library"; then
+ add=$dir/$old_library
+ fi
+ fi
+ esac
+ elif test no = "$hardcode_minus_L"; then
+ case $host in
+ *-*-sunos*) add_shlibpath=$dir ;;
+ esac
+ add_dir=-L$dir
+ add=-l$name
+ elif test no = "$hardcode_shlibpath_var"; then
+ add_shlibpath=$dir
+ add=-l$name
+ else
+ lib_linked=no
+ fi
+ ;;
+ relink)
+ if test yes = "$hardcode_direct" &&
+ test no = "$hardcode_direct_absolute"; then
+ add=$dir/$linklib
+ elif test yes = "$hardcode_minus_L"; then
+ add_dir=-L$absdir
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ func_append add_dir " -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add=-l$name
+ elif test yes = "$hardcode_shlibpath_var"; then
+ add_shlibpath=$dir
+ add=-l$name
+ else
+ lib_linked=no
+ fi
+ ;;
+ *) lib_linked=no ;;
+ esac
+
+ if test yes != "$lib_linked"; then
+ func_fatal_configuration "unsupported hardcode properties"
+ fi
+
+ if test -n "$add_shlibpath"; then
+ case :$compile_shlibpath: in
+ *":$add_shlibpath:"*) ;;
+ *) func_append compile_shlibpath "$add_shlibpath:" ;;
+ esac
+ fi
+ if test prog = "$linkmode"; then
+ test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+ test -n "$add" && compile_deplibs="$add $compile_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ if test yes != "$hardcode_direct" &&
+ test yes != "$hardcode_minus_L" &&
+ test yes = "$hardcode_shlibpath_var"; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) func_append finalize_shlibpath "$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test prog = "$linkmode" || test relink = "$opt_mode"; then
+ add_shlibpath=
+ add_dir=
+ add=
+ # Finalize command for both is simple: just hardcode it.
+ if test yes = "$hardcode_direct" &&
+ test no = "$hardcode_direct_absolute"; then
+ add=$libdir/$linklib
+ elif test yes = "$hardcode_minus_L"; then
+ add_dir=-L$libdir
+ add=-l$name
+ elif test yes = "$hardcode_shlibpath_var"; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) func_append finalize_shlibpath "$libdir:" ;;
+ esac
+ add=-l$name
+ elif test yes = "$hardcode_automatic"; then
+ if test -n "$inst_prefix_dir" &&
+ test -f "$inst_prefix_dir$libdir/$linklib"; then
+ add=$inst_prefix_dir$libdir/$linklib
+ else
+ add=$libdir/$linklib
+ fi
+ else
+ # We cannot seem to hardcode it, guess we'll fake it.
+ add_dir=-L$libdir
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ func_append add_dir " -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add=-l$name
+ fi
+
+ if test prog = "$linkmode"; then
+ test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+ test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ fi
+ fi
+ elif test prog = "$linkmode"; then
+ # Here we assume that one of hardcode_direct or hardcode_minus_L
+ # is not unsupported. This is valid on all known static and
+ # shared platforms.
+ if test unsupported != "$hardcode_direct"; then
+ test -n "$old_library" && linklib=$old_library
+ compile_deplibs="$dir/$linklib $compile_deplibs"
+ finalize_deplibs="$dir/$linklib $finalize_deplibs"
+ else
+ compile_deplibs="-l$name -L$dir $compile_deplibs"
+ finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+ fi
+ elif test yes = "$build_libtool_libs"; then
+ # Not a shared library
+ if test pass_all != "$deplibs_check_method"; then
+ # We're trying link a shared library against a static one
+ # but the system doesn't support it.
+
+ # Just print a warning and add the library to dependency_libs so
+ # that the program can be linked against the static library.
+ echo
+ $ECHO "*** Warning: This system cannot link to static lib archive $lib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have."
+ if test yes = "$module"; then
+ echo "*** But as you try to build a module library, libtool will still create "
+ echo "*** a static module, that should work as long as the dlopening application"
+ echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+ if test -z "$global_symbol_pipe"; then
+ echo
+ echo "*** However, this would only work if libtool was able to extract symbol"
+ echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
+ echo "*** not find such a program. So, this module is probably useless."
+ echo "*** 'nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test no = "$build_old_libs"; then
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ else
+ deplibs="$dir/$old_library $deplibs"
+ link_static=yes
+ fi
+ fi # link shared/static library?
+
+ if test lib = "$linkmode"; then
+ if test -n "$dependency_libs" &&
+ { test yes != "$hardcode_into_libs" ||
+ test yes = "$build_old_libs" ||
+ test yes = "$link_static"; }; then
+ # Extract -R from dependency_libs
+ temp_deplibs=
+ for libdir in $dependency_libs; do
+ case $libdir in
+ -R*) func_stripname '-R' '' "$libdir"
+ temp_xrpath=$func_stripname_result
+ case " $xrpath " in
+ *" $temp_xrpath "*) ;;
+ *) func_append xrpath " $temp_xrpath";;
+ esac;;
+ *) func_append temp_deplibs " $libdir";;
+ esac
+ done
+ dependency_libs=$temp_deplibs
+ fi
+
+ func_append newlib_search_path " $absdir"
+ # Link against this library
+ test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+ # ... and its dependency_libs
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ newdependency_libs="$deplib $newdependency_libs"
+ case $deplib in
+ -L*) func_stripname '-L' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result";;
+ *) func_resolve_sysroot "$deplib" ;;
+ esac
+ if $opt_preserve_dup_deps; then
+ case "$tmp_libs " in
+ *" $func_resolve_sysroot_result "*)
+ func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+ esac
+ fi
+ func_append tmp_libs " $func_resolve_sysroot_result"
+ done
+
+ if test no != "$link_all_deplibs"; then
+ # Add the search paths of all dependency libraries
+ for deplib in $dependency_libs; do
+ path=
+ case $deplib in
+ -L*) path=$deplib ;;
+ *.la)
+ func_resolve_sysroot "$deplib"
+ deplib=$func_resolve_sysroot_result
+ func_dirname "$deplib" "" "."
+ dir=$func_dirname_result
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ func_warning "cannot determine absolute directory name of '$dir'"
+ absdir=$dir
+ fi
+ ;;
+ esac
+ if $GREP "^installed=no" $deplib > /dev/null; then
+ case $host in
+ *-*-darwin*)
+ depdepl=
+ eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+ if test -n "$deplibrary_names"; then
+ for tmp in $deplibrary_names; do
+ depdepl=$tmp
+ done
+ if test -f "$absdir/$objdir/$depdepl"; then
+ depdepl=$absdir/$objdir/$depdepl
+ darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+ if test -z "$darwin_install_name"; then
+ darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+ fi
+ func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
+ func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
+ path=
+ fi
+ fi
+ ;;
+ *)
+ path=-L$absdir/$objdir
+ ;;
+ esac
+ else
+ eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ test -z "$libdir" && \
+ func_fatal_error "'$deplib' is not a valid libtool archive"
+ test "$absdir" != "$libdir" && \
+ func_warning "'$deplib' seems to be moved"
+
+ path=-L$absdir
+ fi
+ ;;
+ esac
+ case " $deplibs " in
+ *" $path "*) ;;
+ *) deplibs="$path $deplibs" ;;
+ esac
+ done
+ fi # link_all_deplibs != no
+ fi # linkmode = lib
+ done # for deplib in $libs
+ if test link = "$pass"; then
+ if test prog = "$linkmode"; then
+ compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+ finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+ else
+ compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ fi
+ fi
+ dependency_libs=$newdependency_libs
+ if test dlpreopen = "$pass"; then
+ # Link the dlpreopened libraries before other libraries
+ for deplib in $save_deplibs; do
+ deplibs="$deplib $deplibs"
+ done
+ fi
+ if test dlopen != "$pass"; then
+ test conv = "$pass" || {
+ # Make sure lib_search_path contains only unique directories.
+ lib_search_path=
+ for dir in $newlib_search_path; do
+ case "$lib_search_path " in
+ *" $dir "*) ;;
+ *) func_append lib_search_path " $dir" ;;
+ esac
+ done
+ newlib_search_path=
+ }
+
+ if test prog,link = "$linkmode,$pass"; then
+ vars="compile_deplibs finalize_deplibs"
+ else
+ vars=deplibs
+ fi
+ for var in $vars dependency_libs; do
+ # Add libraries to $var in reverse order
+ eval tmp_libs=\"\$$var\"
+ new_libs=
+ for deplib in $tmp_libs; do
+ # FIXME: Pedantically, this is the right thing to do, so
+ # that some nasty dependency loop isn't accidentally
+ # broken:
+ #new_libs="$deplib $new_libs"
+ # Pragmatically, this seems to cause very few problems in
+ # practice:
+ case $deplib in
+ -L*) new_libs="$deplib $new_libs" ;;
+ -R*) ;;
+ *)
+ # And here is the reason: when a library appears more
+ # than once as an explicit dependence of a library, or
+ # is implicitly linked in more than once by the
+ # compiler, it is considered special, and multiple
+ # occurrences thereof are not removed. Compare this
+ # with having the same library being listed as a
+ # dependency of multiple other libraries: in this case,
+ # we know (pedantically, we assume) the library does not
+ # need to be listed more than once, so we keep only the
+ # last copy. This is not always right, but it is rare
+ # enough that we require users that really mean to play
+ # such unportable linking tricks to link the library
+ # using -Wl,-lname, so that libtool does not consider it
+ # for duplicate removal.
+ case " $specialdeplibs " in
+ *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ *)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$deplib $new_libs" ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ done
+ tmp_libs=
+ for deplib in $new_libs; do
+ case $deplib in
+ -L*)
+ case " $tmp_libs " in
+ *" $deplib "*) ;;
+ *) func_append tmp_libs " $deplib" ;;
+ esac
+ ;;
+ *) func_append tmp_libs " $deplib" ;;
+ esac
+ done
+ eval $var=\"$tmp_libs\"
+ done # for var
+ fi
+
+ # Add Sun CC postdeps if required:
+ test CXX = "$tagname" && {
+ case $host_os in
+ linux*)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*) # Sun C++ 5.9
+ func_suncc_cstd_abi
+
+ if test no != "$suncc_use_cstd_abi"; then
+ func_append postdeps ' -library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ func_cc_basename "$CC"
+ case $func_cc_basename_result in
+ CC* | sunCC*)
+ func_suncc_cstd_abi
+
+ if test no != "$suncc_use_cstd_abi"; then
+ func_append postdeps ' -library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ }
+
+ # Last step: remove runtime libs from dependency_libs
+ # (they stay in deplibs)
+ tmp_libs=
+ for i in $dependency_libs; do
+ case " $predeps $postdeps $compiler_lib_search_path " in
+ *" $i "*)
+ i=
+ ;;
+ esac
+ if test -n "$i"; then
+ func_append tmp_libs " $i"
+ fi
+ done
+ dependency_libs=$tmp_libs
+ done # for pass
+ if test prog = "$linkmode"; then
+ dlfiles=$newdlfiles
+ fi
+ if test prog = "$linkmode" || test lib = "$linkmode"; then
+ dlprefiles=$newdlprefiles
+ fi
+
+ case $linkmode in
+ oldlib)
+ if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+ func_warning "'-dlopen' is ignored for archives"
+ fi
+
+ case " $deplibs" in
+ *\ -l* | *\ -L*)
+ func_warning "'-l' and '-L' are ignored for archives" ;;
+ esac
+
+ test -n "$rpath" && \
+ func_warning "'-rpath' is ignored for archives"
+
+ test -n "$xrpath" && \
+ func_warning "'-R' is ignored for archives"
+
+ test -n "$vinfo" && \
+ func_warning "'-version-info/-version-number' is ignored for archives"
+
+ test -n "$release" && \
+ func_warning "'-release' is ignored for archives"
+
+ test -n "$export_symbols$export_symbols_regex" && \
+ func_warning "'-export-symbols' is ignored for archives"
+
+ # Now set the variables for building old libraries.
+ build_libtool_libs=no
+ oldlibs=$output
+ func_append objs "$old_deplibs"
+ ;;
+
+ lib)
+ # Make sure we only generate libraries of the form 'libNAME.la'.
+ case $outputname in
+ lib*)
+ func_stripname 'lib' '.la' "$outputname"
+ name=$func_stripname_result
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ ;;
+ *)
+ test no = "$module" \
+ && func_fatal_help "libtool library '$output' must begin with 'lib'"
+
+ if test no != "$need_lib_prefix"; then
+ # Add the "lib" prefix for modules if required
+ func_stripname '' '.la' "$outputname"
+ name=$func_stripname_result
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ else
+ func_stripname '' '.la' "$outputname"
+ libname=$func_stripname_result
+ fi
+ ;;
+ esac
+
+ if test -n "$objs"; then
+ if test pass_all != "$deplibs_check_method"; then
+ func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
+ else
+ echo
+ $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+ $ECHO "*** objects $objs is not portable!"
+ func_append libobjs " $objs"
+ fi
+ fi
+
+ test no = "$dlself" \
+ || func_warning "'-dlopen self' is ignored for libtool libraries"
+
+ set dummy $rpath
+ shift
+ test 1 -lt "$#" \
+ && func_warning "ignoring multiple '-rpath's for a libtool library"
+
+ install_libdir=$1
+
+ oldlibs=
+ if test -z "$rpath"; then
+ if test yes = "$build_libtool_libs"; then
+ # Building a libtool convenience library.
+ # Some compilers have problems with a '.al' extension so
+ # convenience libraries should have the same extension an
+ # archive normally would.
+ oldlibs="$output_objdir/$libname.$libext $oldlibs"
+ build_libtool_libs=convenience
+ build_old_libs=yes
+ fi
+
+ test -n "$vinfo" && \
+ func_warning "'-version-info/-version-number' is ignored for convenience libraries"
+
+ test -n "$release" && \
+ func_warning "'-release' is ignored for convenience libraries"
+ else
+
+ # Parse the version information argument.
+ save_ifs=$IFS; IFS=:
+ set dummy $vinfo 0 0 0
+ shift
+ IFS=$save_ifs
+
+ test -n "$7" && \
+ func_fatal_help "too many parameters to '-version-info'"
+
+ # convert absolute version numbers to libtool ages
+ # this retains compatibility with .la files and attempts
+ # to make the code below a bit more comprehensible
+
+ case $vinfo_number in
+ yes)
+ number_major=$1
+ number_minor=$2
+ number_revision=$3
+ #
+ # There are really only two kinds -- those that
+ # use the current revision as the major version
+ # and those that subtract age and use age as
+ # a minor version. But, then there is irix
+ # that has an extra 1 added just for fun
+ #
+ case $version_type in
+ # correct linux to gnu/linux during the next big refactor
+ darwin|freebsd-elf|linux|midnightbsd-elf|osf|windows|none)
+ func_arith $number_major + $number_minor
+ current=$func_arith_result
+ age=$number_minor
+ revision=$number_revision
+ ;;
+ freebsd-aout|qnx|sunos)
+ current=$number_major
+ revision=$number_minor
+ age=0
+ ;;
+ irix|nonstopux)
+ func_arith $number_major + $number_minor
+ current=$func_arith_result
+ age=$number_minor
+ revision=$number_minor
+ lt_irix_increment=no
+ ;;
+ esac
+ ;;
+ no)
+ current=$1
+ revision=$2
+ age=$3
+ ;;
+ esac
+
+ # Check that each of the things are valid numbers.
+ case $current in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ func_error "CURRENT '$current' must be a nonnegative integer"
+ func_fatal_error "'$vinfo' is not valid version information"
+ ;;
+ esac
+
+ case $revision in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ func_error "REVISION '$revision' must be a nonnegative integer"
+ func_fatal_error "'$vinfo' is not valid version information"
+ ;;
+ esac
+
+ case $age in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ func_error "AGE '$age' must be a nonnegative integer"
+ func_fatal_error "'$vinfo' is not valid version information"
+ ;;
+ esac
+
+ if test "$age" -gt "$current"; then
+ func_error "AGE '$age' is greater than the current interface number '$current'"
+ func_fatal_error "'$vinfo' is not valid version information"
+ fi
+
+ # Calculate the version variables.
+ major=
+ versuffix=
+ verstring=
+ case $version_type in
+ none) ;;
+
+ darwin)
+ # Like Linux, but with the current version available in
+ # verstring for coding it into the library header
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix=$major.$age.$revision
+ # Darwin ld doesn't like 0 for these options...
+ func_arith $current + 1
+ minor_current=$func_arith_result
+ xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+ verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+ # On Darwin other compilers
+ case $CC in
+ nagfor*)
+ verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+ ;;
+ *)
+ verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+ ;;
+ esac
+ ;;
+
+ freebsd-aout)
+ major=.$current
+ versuffix=.$current.$revision
+ ;;
+
+ freebsd-elf | midnightbsd-elf)
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix=$major.$age.$revision
+ ;;
+
+ irix | nonstopux)
+ if test no = "$lt_irix_increment"; then
+ func_arith $current - $age
+ else
+ func_arith $current - $age + 1
+ fi
+ major=$func_arith_result
+
+ case $version_type in
+ nonstopux) verstring_prefix=nonstopux ;;
+ *) verstring_prefix=sgi ;;
+ esac
+ verstring=$verstring_prefix$major.$revision
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$revision
+ while test 0 -ne "$loop"; do
+ func_arith $revision - $loop
+ iface=$func_arith_result
+ func_arith $loop - 1
+ loop=$func_arith_result
+ verstring=$verstring_prefix$major.$iface:$verstring
+ done
+
+ # Before this point, $major must not contain '.'.
+ major=.$major
+ versuffix=$major.$revision
+ ;;
+
+ linux) # correct to gnu/linux during the next big refactor
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix=$major.$age.$revision
+ ;;
+
+ osf)
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix=.$current.$age.$revision
+ verstring=$current.$age.$revision
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$age
+ while test 0 -ne "$loop"; do
+ func_arith $current - $loop
+ iface=$func_arith_result
+ func_arith $loop - 1
+ loop=$func_arith_result
+ verstring=$verstring:$iface.0
+ done
+
+ # Make executables depend on our current version.
+ func_append verstring ":$current.0"
+ ;;
+
+ qnx)
+ major=.$current
+ versuffix=.$current
+ ;;
+
+ sco)
+ major=.$current
+ versuffix=.$current
+ ;;
+
+ sunos)
+ major=.$current
+ versuffix=.$current.$revision
+ ;;
+
+ windows)
+ # Use '-' rather than '.', since we only want one
+ # extension on DOS 8.3 file systems.
+ func_arith $current - $age
+ major=$func_arith_result
+ versuffix=-$major
+ ;;
+
+ *)
+ func_fatal_configuration "unknown library version type '$version_type'"
+ ;;
+ esac
+
+ # Clear the version info if we defaulted, and they specified a release.
+ if test -z "$vinfo" && test -n "$release"; then
+ major=
+ case $version_type in
+ darwin)
+ # we can't check for "0.0" in archive_cmds due to quoting
+ # problems, so we reset it completely
+ verstring=
+ ;;
+ *)
+ verstring=0.0
+ ;;
+ esac
+ if test no = "$need_version"; then
+ versuffix=
+ else
+ versuffix=.0.0
+ fi
+ fi
+
+ # Remove version info from name if versioning should be avoided
+ if test yes,no = "$avoid_version,$need_version"; then
+ major=
+ versuffix=
+ verstring=
+ fi
+
+ # Check to see if the archive will have undefined symbols.
+ if test yes = "$allow_undefined"; then
+ if test unsupported = "$allow_undefined_flag"; then
+ if test yes = "$build_old_libs"; then
+ func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+ build_libtool_libs=no
+ else
+ func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+ fi
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag=$no_undefined_flag
+ fi
+
+ fi
+
+ func_generate_dlsyms "$libname" "$libname" :
+ func_append libobjs " $symfileobj"
+ test " " = "$libobjs" && libobjs=
+
+ if test relink != "$opt_mode"; then
+ # Remove our outputs, but don't remove object files since they
+ # may have been created when compiling PIC objects.
+ removelist=
+ tempremovelist=`$ECHO "$output_objdir/*"`
+ for p in $tempremovelist; do
+ case $p in
+ *.$objext | *.gcno)
+ ;;
+ $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
+ if test -n "$precious_files_regex"; then
+ if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+ then
+ continue
+ fi
+ fi
+ func_append removelist " $p"
+ ;;
+ *) ;;
+ esac
+ done
+ test -n "$removelist" && \
+ func_show_eval "${RM}r \$removelist"
+ fi
+
+ # Now set the variables for building old libraries.
+ if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
+ func_append oldlibs " $output_objdir/$libname.$libext"
+
+ # Transform .lo files to .o files.
+ oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
+ fi
+
+ # Eliminate all temporary directories.
+ #for path in $notinst_path; do
+ # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+ # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+ # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+ #done
+
+ if test -n "$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ temp_xrpath=
+ for libdir in $xrpath; do
+ func_replace_sysroot "$libdir"
+ func_append temp_xrpath " -R$func_replace_sysroot_result"
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) func_append finalize_rpath " $libdir" ;;
+ esac
+ done
+ if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
+ dependency_libs="$temp_xrpath $dependency_libs"
+ fi
+ fi
+
+ # Make sure dlfiles contains only unique files that won't be dlpreopened
+ old_dlfiles=$dlfiles
+ dlfiles=
+ for lib in $old_dlfiles; do
+ case " $dlprefiles $dlfiles " in
+ *" $lib "*) ;;
+ *) func_append dlfiles " $lib" ;;
+ esac
+ done
+
+ # Make sure dlprefiles contains only unique files
+ old_dlprefiles=$dlprefiles
+ dlprefiles=
+ for lib in $old_dlprefiles; do
+ case "$dlprefiles " in
+ *" $lib "*) ;;
+ *) func_append dlprefiles " $lib" ;;
+ esac
+ done
+
+ if test yes = "$build_libtool_libs"; then
+ if test -n "$rpath"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+ # these systems don't actually have a c library (as such)!
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C library is in the System framework
+ func_append deplibs " System.ltframework"
+ ;;
+ *-*-netbsd*)
+ # Don't link with libc until the a.out ld.so is fixed.
+ ;;
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*)
+ # Do not include libc due to us having libc/libc_r.
+ ;;
+ *-*-sco3.2v5* | *-*-sco5v6*)
+ # Causes problems with __ctype
+ ;;
+ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+ # Compiler inserts libc in the correct place for threads to work
+ ;;
+ *)
+ # Add libc to deplibs on all other systems if necessary.
+ if test yes = "$build_libtool_need_lc"; then
+ func_append deplibs " -lc"
+ fi
+ ;;
+ esac
+ fi
+
+ # Transform deplibs into only deplibs that can be linked in shared.
+ name_save=$name
+ libname_save=$libname
+ release_save=$release
+ versuffix_save=$versuffix
+ major_save=$major
+ # I'm not sure if I'm treating the release correctly. I think
+ # release should show up in the -l (ie -lgmp5) so we don't want to
+ # add it in twice. Is that correct?
+ release=
+ versuffix=
+ major=
+ newdeplibs=
+ droppeddeps=no
+ case $deplibs_check_method in
+ pass_all)
+ # Don't check for shared/static. Everything works.
+ # This might be a little naive. We might want to check
+ # whether the library exists or not. But this is on
+ # osf3 & osf4 and I'm not really sure... Just
+ # implementing what was already the behavior.
+ newdeplibs=$deplibs
+ ;;
+ test_compile)
+ # This code stresses the "libraries are programs" paradigm to its
+ # limits. Maybe even breaks it. We compile a program, linking it
+ # against the deplibs as a proxy for the library. Then we can check
+ # whether they linked in statically or dynamically with ldd.
+ $opt_dry_run || $RM conftest.c
+ cat > conftest.c <<EOF
+ int main() { return 0; }
+EOF
+ $opt_dry_run || $RM conftest
+ if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+ ldd_output=`ldd conftest`
+ for i in $deplibs; do
+ case $i in
+ -l*)
+ func_stripname -l '' "$i"
+ name=$func_stripname_result
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ func_append newdeplibs " $i"
+ i=
+ ;;
+ esac
+ fi
+ if test -n "$i"; then
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+ set dummy $deplib_matches; shift
+ deplib_match=$1
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
+ func_append newdeplibs " $i"
+ else
+ droppeddeps=yes
+ echo
+ $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which I believe you do not have"
+ echo "*** because a test_compile did reveal that the linker did not use it for"
+ echo "*** its dynamic dependency list that programs get resolved with at runtime."
+ fi
+ fi
+ ;;
+ *)
+ func_append newdeplibs " $i"
+ ;;
+ esac
+ done
+ else
+ # Error occurred in the first compile. Let's try to salvage
+ # the situation: Compile a separate program for each library.
+ for i in $deplibs; do
+ case $i in
+ -l*)
+ func_stripname -l '' "$i"
+ name=$func_stripname_result
+ $opt_dry_run || $RM conftest
+ if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+ ldd_output=`ldd conftest`
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ func_append newdeplibs " $i"
+ i=
+ ;;
+ esac
+ fi
+ if test -n "$i"; then
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+ set dummy $deplib_matches; shift
+ deplib_match=$1
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
+ func_append newdeplibs " $i"
+ else
+ droppeddeps=yes
+ echo
+ $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because a test_compile did reveal that the linker did not use this one"
+ echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+ fi
+ fi
+ else
+ droppeddeps=yes
+ echo
+ $ECHO "*** Warning! Library $i is needed by this library but I was not able to"
+ echo "*** make it link in! You will probably need to install it or some"
+ echo "*** library that it depends on before this library will be fully"
+ echo "*** functional. Installing it before continuing would be even better."
+ fi
+ ;;
+ *)
+ func_append newdeplibs " $i"
+ ;;
+ esac
+ done
+ fi
+ ;;
+ file_magic*)
+ set dummy $deplibs_check_method; shift
+ file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+ for a_deplib in $deplibs; do
+ case $a_deplib in
+ -l*)
+ func_stripname -l '' "$a_deplib"
+ name=$func_stripname_result
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ func_append newdeplibs " $a_deplib"
+ a_deplib=
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib"; then
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ if test -n "$file_magic_glob"; then
+ libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+ else
+ libnameglob=$libname
+ fi
+ test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ if test yes = "$want_nocaseglob"; then
+ shopt -s nocaseglob
+ potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+ $nocaseglob
+ else
+ potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+ fi
+ for potent_lib in $potential_libs; do
+ # Follow soft links.
+ if ls -lLd "$potent_lib" 2>/dev/null |
+ $GREP " -> " >/dev/null; then
+ continue
+ fi
+ # The statement above tries to avoid entering an
+ # endless loop below, in case of cyclic links.
+ # We might still enter an endless loop, since a link
+ # loop can be closed while we follow links,
+ # but so what?
+ potlib=$potent_lib
+ while test -h "$potlib" 2>/dev/null; do
+ potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
+ case $potliblink in
+ [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
+ *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
+ esac
+ done
+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+ $SED -e 10q |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ func_append newdeplibs " $a_deplib"
+ a_deplib=
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib"; then
+ droppeddeps=yes
+ echo
+ $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib"; then
+ $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+ else
+ $ECHO "*** with $libname and none of the candidates passed a file format test"
+ $ECHO "*** using a file magic. Last file checked: $potlib"
+ fi
+ fi
+ ;;
+ *)
+ # Add a -L argument.
+ func_append newdeplibs " $a_deplib"
+ ;;
+ esac
+ done # Gone through all deplibs.
+ ;;
+ match_pattern*)
+ set dummy $deplibs_check_method; shift
+ match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+ for a_deplib in $deplibs; do
+ case $a_deplib in
+ -l*)
+ func_stripname -l '' "$a_deplib"
+ name=$func_stripname_result
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ func_append newdeplibs " $a_deplib"
+ a_deplib=
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib"; then
+ libname=`eval "\\$ECHO \"$libname_spec\""`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ potlib=$potent_lib # see symlink-check above in file_magic test
+ if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+ $EGREP "$match_pattern_regex" > /dev/null; then
+ func_append newdeplibs " $a_deplib"
+ a_deplib=
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib"; then
+ droppeddeps=yes
+ echo
+ $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib"; then
+ $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+ else
+ $ECHO "*** with $libname and none of the candidates passed a file format test"
+ $ECHO "*** using a regex pattern. Last file checked: $potlib"
+ fi
+ fi
+ ;;
+ *)
+ # Add a -L argument.
+ func_append newdeplibs " $a_deplib"
+ ;;
+ esac
+ done # Gone through all deplibs.
+ ;;
+ none | unknown | *)
+ newdeplibs=
+ tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+ for i in $predeps $postdeps; do
+ # can't use Xsed below, because $i might contain '/'
+ tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
+ done
+ fi
+ case $tmp_deplibs in
+ *[!\ \ ]*)
+ echo
+ if test none = "$deplibs_check_method"; then
+ echo "*** Warning: inter-library dependencies are not supported in this platform."
+ else
+ echo "*** Warning: inter-library dependencies are not known to be supported."
+ fi
+ echo "*** All declared inter-library dependencies are being dropped."
+ droppeddeps=yes
+ ;;
+ esac
+ ;;
+ esac
+ versuffix=$versuffix_save
+ major=$major_save
+ release=$release_save
+ libname=$libname_save
+ name=$name_save
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library with the System framework
+ newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+ ;;
+ esac
+
+ if test yes = "$droppeddeps"; then
+ if test yes = "$module"; then
+ echo
+ echo "*** Warning: libtool could not satisfy all declared inter-library"
+ $ECHO "*** dependencies of module $libname. Therefore, libtool will create"
+ echo "*** a static module, that should work as long as the dlopening"
+ echo "*** application is linked with the -dlopen flag."
+ if test -z "$global_symbol_pipe"; then
+ echo
+ echo "*** However, this would only work if libtool was able to extract symbol"
+ echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
+ echo "*** not find such a program. So, this module is probably useless."
+ echo "*** 'nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test no = "$build_old_libs"; then
+ oldlibs=$output_objdir/$libname.$libext
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ else
+ echo "*** The inter-library dependencies that have been dropped here will be"
+ echo "*** automatically added whenever a program is linked with this library"
+ echo "*** or is declared to -dlopen it."
+
+ if test no = "$allow_undefined"; then
+ echo
+ echo "*** Since this library must not contain undefined symbols,"
+ echo "*** because either the platform does not support them or"
+ echo "*** it was explicitly requested with -no-undefined,"
+ echo "*** libtool will only create a static version of it."
+ if test no = "$build_old_libs"; then
+ oldlibs=$output_objdir/$libname.$libext
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ fi
+ fi
+ # Done checking deplibs!
+ deplibs=$newdeplibs
+ fi
+ # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+ case $host in
+ *-*-darwin*)
+ newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ ;;
+ esac
+
+ # move library search paths that coincide with paths to not yet
+ # installed libraries to the beginning of the library search list
+ new_libs=
+ for path in $notinst_path; do
+ case " $new_libs " in
+ *" -L$path/$objdir "*) ;;
+ *)
+ case " $deplibs " in
+ *" -L$path/$objdir "*)
+ func_append new_libs " -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) func_append new_libs " $deplib" ;;
+ esac
+ ;;
+ *) func_append new_libs " $deplib" ;;
+ esac
+ done
+ deplibs=$new_libs
+
+ # All the library-specific variables (install_libdir is set above).
+ library_names=
+ old_library=
+ dlname=
+
+ # Test again, we may have decided not to build it any more
+ if test yes = "$build_libtool_libs"; then
+ # Remove $wl instances when linking with ld.
+ # FIXME: should test the right _cmds variable.
+ case $archive_cmds in
+ *\$LD\ *) wl= ;;
+ esac
+ if test yes = "$hardcode_into_libs"; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath=$finalize_rpath
+ test relink = "$opt_mode" || rpath=$compile_rpath$rpath
+ for libdir in $rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ func_replace_sysroot "$libdir"
+ libdir=$func_replace_sysroot_result
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs=$libdir
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ func_append dep_rpath " $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) func_append perm_rpath " $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir=$hardcode_libdirs
+ eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+ fi
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ func_append rpath "$dir:"
+ done
+ eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+ fi
+ test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+ fi
+
+ shlibpath=$finalize_shlibpath
+ test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
+ if test -n "$shlibpath"; then
+ eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+ fi
+
+ # Get the real and link names of the library.
+ eval shared_ext=\"$shrext_cmds\"
+ eval library_names=\"$library_names_spec\"
+ set dummy $library_names
+ shift
+ realname=$1
+ shift
+
+ if test -n "$soname_spec"; then
+ eval soname=\"$soname_spec\"
+ else
+ soname=$realname
+ fi
+ if test -z "$dlname"; then
+ dlname=$soname
+ fi
+
+ lib=$output_objdir/$realname
+ linknames=
+ for link
+ do
+ func_append linknames " $link"
+ done
+
+ # Use standard objects if they are pic
+ test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+ test "X$libobjs" = "X " && libobjs=
+
+ delfiles=
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+ export_symbols=$output_objdir/$libname.uexp
+ func_append delfiles " $export_symbols"
+ fi
+
+ orig_export_symbols=
+ case $host_os in
+ cygwin* | mingw* | cegcc*)
+ if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+ # exporting using user supplied symfile
+ func_dll_def_p "$export_symbols" || {
+ # and it's NOT already a .def file. Must figure out
+ # which of the given symbols are data symbols and tag
+ # them as such. So, trigger use of export_symbols_cmds.
+ # export_symbols gets reassigned inside the "prepare
+ # the list of exported symbols" if statement, so the
+ # include_expsyms logic still works.
+ orig_export_symbols=$export_symbols
+ export_symbols=
+ always_export_symbols=yes
+ }
+ fi
+ ;;
+ esac
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
+ func_verbose "generating symbol list for '$libname.la'"
+ export_symbols=$output_objdir/$libname.exp
+ $opt_dry_run || $RM $export_symbols
+ cmds=$export_symbols_cmds
+ save_ifs=$IFS; IFS='~'
+ for cmd1 in $cmds; do
+ IFS=$save_ifs
+ # Take the normal branch if the nm_file_list_spec branch
+ # doesn't work or if tool conversion is not needed.
+ case $nm_file_list_spec~$to_tool_file_cmd in
+ *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+ try_normal_branch=yes
+ eval cmd=\"$cmd1\"
+ func_len " $cmd"
+ len=$func_len_result
+ ;;
+ *)
+ try_normal_branch=no
+ ;;
+ esac
+ if test yes = "$try_normal_branch" \
+ && { test "$len" -lt "$max_cmd_len" \
+ || test "$max_cmd_len" -le -1; }
+ then
+ func_show_eval "$cmd" 'exit $?'
+ skipped_export=false
+ elif test -n "$nm_file_list_spec"; then
+ func_basename "$output"
+ output_la=$func_basename_result
+ save_libobjs=$libobjs
+ save_output=$output
+ output=$output_objdir/$output_la.nm
+ func_to_tool_file "$output"
+ libobjs=$nm_file_list_spec$func_to_tool_file_result
+ func_append delfiles " $output"
+ func_verbose "creating $NM input file list: $output"
+ for obj in $save_libobjs; do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result"
+ done > "$output"
+ eval cmd=\"$cmd1\"
+ func_show_eval "$cmd" 'exit $?'
+ output=$save_output
+ libobjs=$save_libobjs
+ skipped_export=false
+ else
+ # The command line is too long to execute in one step.
+ func_verbose "using reloadable object file for export list..."
+ skipped_export=:
+ # Break out early, otherwise skipped_export may be
+ # set to false by a later but shorter cmd.
+ break
+ fi
+ done
+ IFS=$save_ifs
+ if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
+ func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+ fi
+
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ tmp_export_symbols=$export_symbols
+ test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
+ $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+ fi
+
+ if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
+ # The given exports_symbols file has to be filtered, so filter it.
+ func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
+ # FIXME: $output_objdir/$libname.filter potentially contains lots of
+ # 's' commands, which not all seds can handle. GNU sed should be fine
+ # though. Also, the filter scales superlinearly with the number of
+ # global variables. join(1) would be nice here, but unfortunately
+ # isn't a blessed tool.
+ $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+ func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+ export_symbols=$output_objdir/$libname.def
+ $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+ fi
+
+ tmp_deplibs=
+ for test_deplib in $deplibs; do
+ case " $convenience " in
+ *" $test_deplib "*) ;;
+ *)
+ func_append tmp_deplibs " $test_deplib"
+ ;;
+ esac
+ done
+ deplibs=$tmp_deplibs
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec" &&
+ test yes = "$compiler_needs_object" &&
+ test -z "$libobjs"; then
+ # extract the archives, so we have objects to list.
+ # TODO: could optimize this to just extract one archive.
+ whole_archive_flag_spec=
+ fi
+ if test -n "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ test "X$libobjs" = "X " && libobjs=
+ else
+ gentop=$output_objdir/${outputname}x
+ func_append generated " $gentop"
+
+ func_extract_archives $gentop $convenience
+ func_append libobjs " $func_extract_archives_result"
+ test "X$libobjs" = "X " && libobjs=
+ fi
+ fi
+
+ if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
+ eval flag=\"$thread_safe_flag_spec\"
+ func_append linker_flags " $flag"
+ fi
+
+ # Make a backup of the uninstalled library when relinking
+ if test relink = "$opt_mode"; then
+ $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+ fi
+
+ # Do each of the archive commands.
+ if test yes = "$module" && test -n "$module_cmds"; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ eval test_cmds=\"$module_expsym_cmds\"
+ cmds=$module_expsym_cmds
+ else
+ eval test_cmds=\"$module_cmds\"
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ eval test_cmds=\"$archive_expsym_cmds\"
+ cmds=$archive_expsym_cmds
+ else
+ eval test_cmds=\"$archive_cmds\"
+ cmds=$archive_cmds
+ fi
+ fi
+
+ if test : != "$skipped_export" &&
+ func_len " $test_cmds" &&
+ len=$func_len_result &&
+ test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ :
+ else
+ # The command line is too long to link in one step, link piecewise
+ # or, if using GNU ld and skipped_export is not :, use a linker
+ # script.
+
+ # Save the value of $output and $libobjs because we want to
+ # use them later. If we have whole_archive_flag_spec, we
+ # want to use save_libobjs as it was before
+ # whole_archive_flag_spec was expanded, because we can't
+ # assume the linker understands whole_archive_flag_spec.
+ # This may have to be revisited, in case too many
+ # convenience libraries get linked in and end up exceeding
+ # the spec.
+ if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ fi
+ save_output=$output
+ func_basename "$output"
+ output_la=$func_basename_result
+
+ # Clear the reloadable object creation command queue and
+ # initialize k to one.
+ test_cmds=
+ concat_cmds=
+ objlist=
+ last_robj=
+ k=1
+
+ if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+ output=$output_objdir/$output_la.lnkscript
+ func_verbose "creating GNU ld script: $output"
+ echo 'INPUT (' > $output
+ for obj in $save_libobjs
+ do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result" >> $output
+ done
+ echo ')' >> $output
+ func_append delfiles " $output"
+ func_to_tool_file "$output"
+ output=$func_to_tool_file_result
+ elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+ output=$output_objdir/$output_la.lnk
+ func_verbose "creating linker input file list: $output"
+ : > $output
+ set x $save_libobjs
+ shift
+ firstobj=
+ if test yes = "$compiler_needs_object"; then
+ firstobj="$1 "
+ shift
+ fi
+ for obj
+ do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result" >> $output
+ done
+ func_append delfiles " $output"
+ func_to_tool_file "$output"
+ output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+ else
+ if test -n "$save_libobjs"; then
+ func_verbose "creating reloadable object files..."
+ output=$output_objdir/$output_la-$k.$objext
+ eval test_cmds=\"$reload_cmds\"
+ func_len " $test_cmds"
+ len0=$func_len_result
+ len=$len0
+
+ # Loop over the list of objects to be linked.
+ for obj in $save_libobjs
+ do
+ func_len " $obj"
+ func_arith $len + $func_len_result
+ len=$func_arith_result
+ if test -z "$objlist" ||
+ test "$len" -lt "$max_cmd_len"; then
+ func_append objlist " $obj"
+ else
+ # The command $test_cmds is almost too long, add a
+ # command to the queue.
+ if test 1 -eq "$k"; then
+ # The first file doesn't have a previous command to add.
+ reload_objs=$objlist
+ eval concat_cmds=\"$reload_cmds\"
+ else
+ # All subsequent reloadable object files will link in
+ # the last one created.
+ reload_objs="$objlist $last_robj"
+ eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+ fi
+ last_robj=$output_objdir/$output_la-$k.$objext
+ func_arith $k + 1
+ k=$func_arith_result
+ output=$output_objdir/$output_la-$k.$objext
+ objlist=" $obj"
+ func_len " $last_robj"
+ func_arith $len0 + $func_len_result
+ len=$func_arith_result
+ fi
+ done
+ # Handle the remaining objects by creating one last
+ # reloadable object file. All subsequent reloadable object
+ # files will link in the last one created.
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ reload_objs="$objlist $last_robj"
+ eval concat_cmds=\"\$concat_cmds$reload_cmds\"
+ if test -n "$last_robj"; then
+ eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+ fi
+ func_append delfiles " $output"
+
+ else
+ output=
+ fi
+
+ ${skipped_export-false} && {
+ func_verbose "generating symbol list for '$libname.la'"
+ export_symbols=$output_objdir/$libname.exp
+ $opt_dry_run || $RM $export_symbols
+ libobjs=$output
+ # Append the command to create the export file.
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+ if test -n "$last_robj"; then
+ eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+ fi
+ }
+
+ test -n "$save_libobjs" &&
+ func_verbose "creating a temporary reloadable object file: $output"
+
+ # Loop through the commands generated above and execute them.
+ save_ifs=$IFS; IFS='~'
+ for cmd in $concat_cmds; do
+ IFS=$save_ifs
+ $opt_quiet || {
+ func_quote_arg expand,pretty "$cmd"
+ eval "func_echo $func_quote_arg_result"
+ }
+ $opt_dry_run || eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test relink = "$opt_mode"; then
+ ( cd "$output_objdir" && \
+ $RM "${realname}T" && \
+ $MV "${realname}U" "$realname" )
+ fi
+
+ exit $lt_exit
+ }
+ done
+ IFS=$save_ifs
+
+ if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+ func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+
+ ${skipped_export-false} && {
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ tmp_export_symbols=$export_symbols
+ test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
+ $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+ fi
+
+ if test -n "$orig_export_symbols"; then
+ # The given exports_symbols file has to be filtered, so filter it.
+ func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
+ # FIXME: $output_objdir/$libname.filter potentially contains lots of
+ # 's' commands, which not all seds can handle. GNU sed should be fine
+ # though. Also, the filter scales superlinearly with the number of
+ # global variables. join(1) would be nice here, but unfortunately
+ # isn't a blessed tool.
+ $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+ func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+ export_symbols=$output_objdir/$libname.def
+ $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+ fi
+ }
+
+ libobjs=$output
+ # Restore the value of output.
+ output=$save_output
+
+ if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ test "X$libobjs" = "X " && libobjs=
+ fi
+ # Expand the library linking commands again to reset the
+ # value of $libobjs for piecewise linking.
+
+ # Do each of the archive commands.
+ if test yes = "$module" && test -n "$module_cmds"; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ cmds=$module_expsym_cmds
+ else
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ cmds=$archive_expsym_cmds
+ else
+ cmds=$archive_cmds
+ fi
+ fi
+ fi
+
+ if test -n "$delfiles"; then
+ # Append the command to remove temporary files to $cmds.
+ eval cmds=\"\$cmds~\$RM $delfiles\"
+ fi
+
+ # Add any objects from preloaded convenience libraries
+ if test -n "$dlprefiles"; then
+ gentop=$output_objdir/${outputname}x
+ func_append generated " $gentop"
+
+ func_extract_archives $gentop $dlprefiles
+ func_append libobjs " $func_extract_archives_result"
+ test "X$libobjs" = "X " && libobjs=
+ fi
+
+ save_ifs=$IFS; IFS='~'
+ for cmd in $cmds; do
+ IFS=$sp$nl
+ eval cmd=\"$cmd\"
+ IFS=$save_ifs
+ $opt_quiet || {
+ func_quote_arg expand,pretty "$cmd"
+ eval "func_echo $func_quote_arg_result"
+ }
+ $opt_dry_run || eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test relink = "$opt_mode"; then
+ ( cd "$output_objdir" && \
+ $RM "${realname}T" && \
+ $MV "${realname}U" "$realname" )
+ fi
+
+ exit $lt_exit
+ }
+ done
+ IFS=$save_ifs
+
+ # Restore the uninstalled library and exit
+ if test relink = "$opt_mode"; then
+ $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+ if test -n "$convenience"; then
+ if test -z "$whole_archive_flag_spec"; then
+ func_show_eval '${RM}r "$gentop"'
+ fi
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ # Create links to the real library.
+ for linkname in $linknames; do
+ if test "$realname" != "$linkname"; then
+ func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+ fi
+ done
+
+ # If -module or -export-dynamic was specified, set the dlname.
+ if test yes = "$module" || test yes = "$export_dynamic"; then
+ # On all known operating systems, these are identical.
+ dlname=$soname
+ fi
+ fi
+ ;;
+
+ obj)
+ if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+ func_warning "'-dlopen' is ignored for objects"
+ fi
+
+ case " $deplibs" in
+ *\ -l* | *\ -L*)
+ func_warning "'-l' and '-L' are ignored for objects" ;;
+ esac
+
+ test -n "$rpath" && \
+ func_warning "'-rpath' is ignored for objects"
+
+ test -n "$xrpath" && \
+ func_warning "'-R' is ignored for objects"
+
+ test -n "$vinfo" && \
+ func_warning "'-version-info' is ignored for objects"
+
+ test -n "$release" && \
+ func_warning "'-release' is ignored for objects"
+
+ case $output in
+ *.lo)
+ test -n "$objs$old_deplibs" && \
+ func_fatal_error "cannot build library object '$output' from non-libtool objects"
+
+ libobj=$output
+ func_lo2o "$libobj"
+ obj=$func_lo2o_result
+ ;;
+ *)
+ libobj=
+ obj=$output
+ ;;
+ esac
+
+ # Delete the old objects.
+ $opt_dry_run || $RM $obj $libobj
+
+ # Objects from convenience libraries. This assumes
+ # single-version convenience libraries. Whenever we create
+ # different ones for PIC/non-PIC, this we'll have to duplicate
+ # the extraction.
+ reload_conv_objs=
+ gentop=
+ # if reload_cmds runs $LD directly, get rid of -Wl from
+ # whole_archive_flag_spec and hope we can get by with turning comma
+ # into space.
+ case $reload_cmds in
+ *\$LD[\ \$]*) wl= ;;
+ esac
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+ test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+ reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
+ else
+ gentop=$output_objdir/${obj}x
+ func_append generated " $gentop"
+
+ func_extract_archives $gentop $convenience
+ reload_conv_objs="$reload_objs $func_extract_archives_result"
+ fi
+ fi
+
+ # If we're not building shared, we need to use non_pic_objs
+ test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
+
+ # Create the old-style object.
+ reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
+
+ output=$obj
+ func_execute_cmds "$reload_cmds" 'exit $?'
+
+ # Exit if we aren't doing a library object file.
+ if test -z "$libobj"; then
+ if test -n "$gentop"; then
+ func_show_eval '${RM}r "$gentop"'
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ test yes = "$build_libtool_libs" || {
+ if test -n "$gentop"; then
+ func_show_eval '${RM}r "$gentop"'
+ fi
+
+ # Create an invalid libtool object if no PIC, so that we don't
+ # accidentally link it into a program.
+ # $show "echo timestamp > $libobj"
+ # $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+ exit $EXIT_SUCCESS
+ }
+
+ if test -n "$pic_flag" || test default != "$pic_mode"; then
+ # Only do commands if we really have different PIC objects.
+ reload_objs="$libobjs $reload_conv_objs"
+ output=$libobj
+ func_execute_cmds "$reload_cmds" 'exit $?'
+ fi
+
+ if test -n "$gentop"; then
+ func_show_eval '${RM}r "$gentop"'
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ prog)
+ case $host in
+ *cygwin*) func_stripname '' '.exe' "$output"
+ output=$func_stripname_result.exe;;
+ esac
+ test -n "$vinfo" && \
+ func_warning "'-version-info' is ignored for programs"
+
+ test -n "$release" && \
+ func_warning "'-release' is ignored for programs"
+
+ $preload \
+ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+ finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+ ;;
+ esac
+
+ case $host in
+ *-*-darwin*)
+ # Don't allow lazy linking, it breaks C++ global constructors
+ # But is supposedly fixed on 10.4 or later (yay!).
+ if test CXX = "$tagname"; then
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+ 10.[0123])
+ func_append compile_command " $wl-bind_at_load"
+ func_append finalize_command " $wl-bind_at_load"
+ ;;
+ esac
+ fi
+ # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+ compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ ;;
+ esac
+
+
+ # move library search paths that coincide with paths to not yet
+ # installed libraries to the beginning of the library search list
+ new_libs=
+ for path in $notinst_path; do
+ case " $new_libs " in
+ *" -L$path/$objdir "*) ;;
+ *)
+ case " $compile_deplibs " in
+ *" -L$path/$objdir "*)
+ func_append new_libs " -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $compile_deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) func_append new_libs " $deplib" ;;
+ esac
+ ;;
+ *) func_append new_libs " $deplib" ;;
+ esac
+ done
+ compile_deplibs=$new_libs
+
+
+ func_append compile_command " $compile_deplibs"
+ func_append finalize_command " $finalize_deplibs"
+
+ if test -n "$rpath$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ for libdir in $rpath $xrpath; do
+ # This is the magic to use -rpath.
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) func_append finalize_rpath " $libdir" ;;
+ esac
+ done
+ fi
+
+ # Now hardcode the library paths
+ rpath=
+ hardcode_libdirs=
+ for libdir in $compile_rpath $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs=$libdir
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ func_append rpath " $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) func_append perm_rpath " $libdir" ;;
+ esac
+ fi
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$libdir:"*) ;;
+ ::) dllsearchpath=$libdir;;
+ *) func_append dllsearchpath ":$libdir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ ::) dllsearchpath=$testbindir;;
+ *) func_append dllsearchpath ":$testbindir";;
+ esac
+ ;;
+ esac
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir=$hardcode_libdirs
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ compile_rpath=$rpath
+
+ rpath=
+ hardcode_libdirs=
+ for libdir in $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs=$libdir
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ func_append rpath " $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$finalize_perm_rpath " in
+ *" $libdir "*) ;;
+ *) func_append finalize_perm_rpath " $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir=$hardcode_libdirs
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ finalize_rpath=$rpath
+
+ if test -n "$libobjs" && test yes = "$build_old_libs"; then
+ # Transform all the library objects into standard objects.
+ compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+ finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+ fi
+
+ func_generate_dlsyms "$outputname" "@PROGRAM@" false
+
+ # template prelinking step
+ if test -n "$prelink_cmds"; then
+ func_execute_cmds "$prelink_cmds" 'exit $?'
+ fi
+
+ wrappers_required=:
+ case $host in
+ *cegcc* | *mingw32ce*)
+ # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+ wrappers_required=false
+ ;;
+ *cygwin* | *mingw* )
+ test yes = "$build_libtool_libs" || wrappers_required=false
+ ;;
+ *)
+ if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+ wrappers_required=false
+ fi
+ ;;
+ esac
+ $wrappers_required || {
+ # Replace the output file specification.
+ compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+ link_command=$compile_command$compile_rpath
+
+ # We have no uninstalled library dependencies, so finalize right now.
+ exit_status=0
+ func_show_eval "$link_command" 'exit_status=$?'
+
+ if test -n "$postlink_cmds"; then
+ func_to_tool_file "$output"
+ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+ func_execute_cmds "$postlink_cmds" 'exit $?'
+ fi
+
+ # Delete the generated files.
+ if test -f "$output_objdir/${outputname}S.$objext"; then
+ func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
+ fi
+
+ exit $exit_status
+ }
+
+ if test -n "$compile_shlibpath$finalize_shlibpath"; then
+ compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+ fi
+ if test -n "$finalize_shlibpath"; then
+ finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+ fi
+
+ compile_var=
+ finalize_var=
+ if test -n "$runpath_var"; then
+ if test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ func_append rpath "$dir:"
+ done
+ compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ if test -n "$finalize_perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $finalize_perm_rpath; do
+ func_append rpath "$dir:"
+ done
+ finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ fi
+
+ if test yes = "$no_install"; then
+ # We don't need to create a wrapper script.
+ link_command=$compile_var$compile_command$compile_rpath
+ # Replace the output file specification.
+ link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+ # Delete the old output file.
+ $opt_dry_run || $RM $output
+ # Link the executable and exit
+ func_show_eval "$link_command" 'exit $?'
+
+ if test -n "$postlink_cmds"; then
+ func_to_tool_file "$output"
+ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+ func_execute_cmds "$postlink_cmds" 'exit $?'
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ case $hardcode_action,$fast_install in
+ relink,*)
+ # Fast installation is not supported
+ link_command=$compile_var$compile_command$compile_rpath
+ relink_command=$finalize_var$finalize_command$finalize_rpath
+
+ func_warning "this platform does not like uninstalled shared libraries"
+ func_warning "'$output' will be relinked during installation"
+ ;;
+ *,yes)
+ link_command=$finalize_var$compile_command$finalize_rpath
+ relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+ ;;
+ *,no)
+ link_command=$compile_var$compile_command$compile_rpath
+ relink_command=$finalize_var$finalize_command$finalize_rpath
+ ;;
+ *,needless)
+ link_command=$finalize_var$compile_command$finalize_rpath
+ relink_command=
+ ;;
+ esac
+
+ # Replace the output file specification.
+ link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+ # Delete the old output files.
+ $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+ func_show_eval "$link_command" 'exit $?'
+
+ if test -n "$postlink_cmds"; then
+ func_to_tool_file "$output_objdir/$outputname"
+ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+ func_execute_cmds "$postlink_cmds" 'exit $?'
+ fi
+
+ # Now create the wrapper script.
+ func_verbose "creating $output"
+
+ # Quote the relink command for shipping.
+ if test -n "$relink_command"; then
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ func_quote_arg pretty "$var_value"
+ relink_command="$var=$func_quote_arg_result; export $var; $relink_command"
+ fi
+ done
+ func_quote eval cd "`pwd`"
+ func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)"
+ relink_command=$func_quote_arg_unquoted_result
+ fi
+
+ # Only actually do things if not in dry run mode.
+ $opt_dry_run || {
+ # win32 will think the script is a binary if it has
+ # a .exe suffix, so we strip it off here.
+ case $output in
+ *.exe) func_stripname '' '.exe' "$output"
+ output=$func_stripname_result ;;
+ esac
+ # test for cygwin because mv fails w/o .exe extensions
+ case $host in
+ *cygwin*)
+ exeext=.exe
+ func_stripname '' '.exe' "$outputname"
+ outputname=$func_stripname_result ;;
+ *) exeext= ;;
+ esac
+ case $host in
+ *cygwin* | *mingw* )
+ func_dirname_and_basename "$output" "" "."
+ output_name=$func_basename_result
+ output_path=$func_dirname_result
+ cwrappersource=$output_path/$objdir/lt-$output_name.c
+ cwrapper=$output_path/$output_name.exe
+ $RM $cwrappersource $cwrapper
+ trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+ func_emit_cwrapperexe_src > $cwrappersource
+
+ # The wrapper executable is built using the $host compiler,
+ # because it contains $host paths and files. If cross-
+ # compiling, it, like the target executable, must be
+ # executed on the $host or under an emulation environment.
+ $opt_dry_run || {
+ $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+ $STRIP $cwrapper
+ }
+
+ # Now, create the wrapper script for func_source use:
+ func_ltwrapper_scriptname $cwrapper
+ $RM $func_ltwrapper_scriptname_result
+ trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+ $opt_dry_run || {
+ # note: this script will not be executed, so do not chmod.
+ if test "x$build" = "x$host"; then
+ $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+ else
+ func_emit_wrapper no > $func_ltwrapper_scriptname_result
+ fi
+ }
+ ;;
+ * )
+ $RM $output
+ trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+ func_emit_wrapper no > $output
+ chmod +x $output
+ ;;
+ esac
+ }
+ exit $EXIT_SUCCESS
+ ;;
+ esac
+
+ # See if we need to build an old-fashioned archive.
+ for oldlib in $oldlibs; do
+
+ case $build_libtool_libs in
+ convenience)
+ oldobjs="$libobjs_save $symfileobj"
+ addlibs=$convenience
+ build_libtool_libs=no
+ ;;
+ module)
+ oldobjs=$libobjs_save
+ addlibs=$old_convenience
+ build_libtool_libs=no
+ ;;
+ *)
+ oldobjs="$old_deplibs $non_pic_objects"
+ $preload && test -f "$symfileobj" \
+ && func_append oldobjs " $symfileobj"
+ addlibs=$old_convenience
+ ;;
+ esac
+
+ if test -n "$addlibs"; then
+ gentop=$output_objdir/${outputname}x
+ func_append generated " $gentop"
+
+ func_extract_archives $gentop $addlibs
+ func_append oldobjs " $func_extract_archives_result"
+ fi
+
+ # Do each command in the archive commands.
+ if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
+ cmds=$old_archive_from_new_cmds
+ else
+
+ # Add any objects from preloaded convenience libraries
+ if test -n "$dlprefiles"; then
+ gentop=$output_objdir/${outputname}x
+ func_append generated " $gentop"
+
+ func_extract_archives $gentop $dlprefiles
+ func_append oldobjs " $func_extract_archives_result"
+ fi
+
+ # POSIX demands no paths to be encoded in archives. We have
+ # to avoid creating archives with duplicate basenames if we
+ # might have to extract them afterwards, e.g., when creating a
+ # static archive out of a convenience library, or when linking
+ # the entirety of a libtool archive into another (currently
+ # not supported by libtool).
+ if (for obj in $oldobjs
+ do
+ func_basename "$obj"
+ $ECHO "$func_basename_result"
+ done | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ echo "copying selected object files to avoid basename conflicts..."
+ gentop=$output_objdir/${outputname}x
+ func_append generated " $gentop"
+ func_mkdir_p "$gentop"
+ save_oldobjs=$oldobjs
+ oldobjs=
+ counter=1
+ for obj in $save_oldobjs
+ do
+ func_basename "$obj"
+ objbase=$func_basename_result
+ case " $oldobjs " in
+ " ") oldobjs=$obj ;;
+ *[\ /]"$objbase "*)
+ while :; do
+ # Make sure we don't pick an alternate name that also
+ # overlaps.
+ newobj=lt$counter-$objbase
+ func_arith $counter + 1
+ counter=$func_arith_result
+ case " $oldobjs " in
+ *[\ /]"$newobj "*) ;;
+ *) if test ! -f "$gentop/$newobj"; then break; fi ;;
+ esac
+ done
+ func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+ func_append oldobjs " $gentop/$newobj"
+ ;;
+ *) func_append oldobjs " $obj" ;;
+ esac
+ done
+ fi
+ func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+ tool_oldlib=$func_to_tool_file_result
+ eval cmds=\"$old_archive_cmds\"
+
+ func_len " $cmds"
+ len=$func_len_result
+ if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ cmds=$old_archive_cmds
+ elif test -n "$archiver_list_spec"; then
+ func_verbose "using command file archive linking..."
+ for obj in $oldobjs
+ do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result"
+ done > $output_objdir/$libname.libcmd
+ func_to_tool_file "$output_objdir/$libname.libcmd"
+ oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+ cmds=$old_archive_cmds
+ else
+ # the command line is too long to link in one step, link in parts
+ func_verbose "using piecewise archive linking..."
+ save_RANLIB=$RANLIB
+ RANLIB=:
+ objlist=
+ concat_cmds=
+ save_oldobjs=$oldobjs
+ oldobjs=
+ # Is there a better way of finding the last object in the list?
+ for obj in $save_oldobjs
+ do
+ last_oldobj=$obj
+ done
+ eval test_cmds=\"$old_archive_cmds\"
+ func_len " $test_cmds"
+ len0=$func_len_result
+ len=$len0
+ for obj in $save_oldobjs
+ do
+ func_len " $obj"
+ func_arith $len + $func_len_result
+ len=$func_arith_result
+ func_append objlist " $obj"
+ if test "$len" -lt "$max_cmd_len"; then
+ :
+ else
+ # the above command should be used before it gets too long
+ oldobjs=$objlist
+ if test "$obj" = "$last_oldobj"; then
+ RANLIB=$save_RANLIB
+ fi
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
+ objlist=
+ len=$len0
+ fi
+ done
+ RANLIB=$save_RANLIB
+ oldobjs=$objlist
+ if test -z "$oldobjs"; then
+ eval cmds=\"\$concat_cmds\"
+ else
+ eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+ fi
+ fi
+ fi
+ func_execute_cmds "$cmds" 'exit $?'
+ done
+
+ test -n "$generated" && \
+ func_show_eval "${RM}r$generated"
+
+ # Now create the libtool archive.
+ case $output in
+ *.la)
+ old_library=
+ test yes = "$build_old_libs" && old_library=$libname.$libext
+ func_verbose "creating $output"
+
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ func_quote_arg pretty,unquoted "$var_value"
+ relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command"
+ fi
+ done
+ # Quote the link command for shipping.
+ func_quote eval cd "`pwd`"
+ relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+ func_quote_arg pretty,unquoted "$relink_command"
+ relink_command=$func_quote_arg_unquoted_result
+ if test yes = "$hardcode_automatic"; then
+ relink_command=
+ fi
+
+ # Only create the output if not a dry run.
+ $opt_dry_run || {
+ for installed in no yes; do
+ if test yes = "$installed"; then
+ if test -z "$install_libdir"; then
+ break
+ fi
+ output=$output_objdir/${outputname}i
+ # Replace all uninstalled libtool libraries with the installed ones
+ newdependency_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ *.la)
+ func_basename "$deplib"
+ name=$func_basename_result
+ func_resolve_sysroot "$deplib"
+ eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+ test -z "$libdir" && \
+ func_fatal_error "'$deplib' is not a valid libtool archive"
+ func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+ ;;
+ -L*)
+ func_stripname -L '' "$deplib"
+ func_replace_sysroot "$func_stripname_result"
+ func_append newdependency_libs " -L$func_replace_sysroot_result"
+ ;;
+ -R*)
+ func_stripname -R '' "$deplib"
+ func_replace_sysroot "$func_stripname_result"
+ func_append newdependency_libs " -R$func_replace_sysroot_result"
+ ;;
+ *) func_append newdependency_libs " $deplib" ;;
+ esac
+ done
+ dependency_libs=$newdependency_libs
+ newdlfiles=
+
+ for lib in $dlfiles; do
+ case $lib in
+ *.la)
+ func_basename "$lib"
+ name=$func_basename_result
+ eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ test -z "$libdir" && \
+ func_fatal_error "'$lib' is not a valid libtool archive"
+ func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+ ;;
+ *) func_append newdlfiles " $lib" ;;
+ esac
+ done
+ dlfiles=$newdlfiles
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ *.la)
+ # Only pass preopened files to the pseudo-archive (for
+ # eventual linking with the app. that links it) if we
+ # didn't already link the preopened objects directly into
+ # the library:
+ func_basename "$lib"
+ name=$func_basename_result
+ eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ test -z "$libdir" && \
+ func_fatal_error "'$lib' is not a valid libtool archive"
+ func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+ ;;
+ esac
+ done
+ dlprefiles=$newdlprefiles
+ else
+ newdlfiles=
+ for lib in $dlfiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ func_append newdlfiles " $abs"
+ done
+ dlfiles=$newdlfiles
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ func_append newdlprefiles " $abs"
+ done
+ dlprefiles=$newdlprefiles
+ fi
+ $RM $output
+ # place dlname in correct position for cygwin
+ # In fact, it would be nice if we could use this code for all target
+ # systems that can't hard-code library paths into their executables
+ # and that have no shared library path variable independent of PATH,
+ # but it turns out we can't easily determine that from inspecting
+ # libtool variables, so we have to hard-code the OSs to which it
+ # applies here; at the moment, that means platforms that use the PE
+ # object format with DLL files. See the long comment at the top of
+ # tests/bindir.at for full details.
+ tdlname=$dlname
+ case $host,$output,$installed,$module,$dlname in
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+ # If a -bindir argument was supplied, place the dll there.
+ if test -n "$bindir"; then
+ func_relative_path "$install_libdir" "$bindir"
+ tdlname=$func_relative_path_result/$dlname
+ else
+ # Otherwise fall back on heuristic.
+ tdlname=../bin/$dlname
+ fi
+ ;;
+ esac
+ $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that cannot go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+ if test no,yes = "$installed,$need_relink"; then
+ $ECHO >> $output "\
+relink_command=\"$relink_command\""
+ fi
+ done
+ }
+
+ # Do a symbolic link so that the libtool archive can be found in
+ # LD_LIBRARY_PATH before the program is installed.
+ func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+ ;;
+ esac
+ exit $EXIT_SUCCESS
+}
+
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+ func_mode_link ${1+"$@"}
+fi
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+ $debug_cmd
+
+ RM=$nonopt
+ files=
+ rmforce=false
+ exit_status=0
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic=$magic
+
+ for arg
+ do
+ case $arg in
+ -f) func_append RM " $arg"; rmforce=: ;;
+ -*) func_append RM " $arg" ;;
+ *) func_append files " $arg" ;;
+ esac
+ done
+
+ test -z "$RM" && \
+ func_fatal_help "you must specify an RM program"
+
+ rmdirs=
+
+ for file in $files; do
+ func_dirname "$file" "" "."
+ dir=$func_dirname_result
+ if test . = "$dir"; then
+ odir=$objdir
+ else
+ odir=$dir/$objdir
+ fi
+ func_basename "$file"
+ name=$func_basename_result
+ test uninstall = "$opt_mode" && odir=$dir
+
+ # Remember odir for removal later, being careful to avoid duplicates
+ if test clean = "$opt_mode"; then
+ case " $rmdirs " in
+ *" $odir "*) ;;
+ *) func_append rmdirs " $odir" ;;
+ esac
+ fi
+
+ # Don't error if the file doesn't exist and rm -f was used.
+ if { test -L "$file"; } >/dev/null 2>&1 ||
+ { test -h "$file"; } >/dev/null 2>&1 ||
+ test -f "$file"; then
+ :
+ elif test -d "$file"; then
+ exit_status=1
+ continue
+ elif $rmforce; then
+ continue
+ fi
+
+ rmfiles=$file
+
+ case $name in
+ *.la)
+ # Possibly a libtool archive, so verify it.
+ if func_lalib_p "$file"; then
+ func_source $dir/$name
+
+ # Delete the libtool libraries and symlinks.
+ for n in $library_names; do
+ func_append rmfiles " $odir/$n"
+ done
+ test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+ case $opt_mode in
+ clean)
+ case " $library_names " in
+ *" $dlname "*) ;;
+ *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+ esac
+ test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+ ;;
+ uninstall)
+ if test -n "$library_names"; then
+ # Do each command in the postuninstall commands.
+ func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
+ fi
+ # FIXME: should reinstall the best remaining shared library.
+ ;;
+ esac
+ fi
+ ;;
+
+ *.lo)
+ # Possibly a libtool object, so verify it.
+ if func_lalib_p "$file"; then
+
+ # Read the .lo file
+ func_source $dir/$name
+
+ # Add PIC object to the list of files to remove.
+ if test -n "$pic_object" && test none != "$pic_object"; then
+ func_append rmfiles " $dir/$pic_object"
+ fi
+
+ # Add non-PIC object to the list of files to remove.
+ if test -n "$non_pic_object" && test none != "$non_pic_object"; then
+ func_append rmfiles " $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ if test clean = "$opt_mode"; then
+ noexename=$name
+ case $file in
+ *.exe)
+ func_stripname '' '.exe' "$file"
+ file=$func_stripname_result
+ func_stripname '' '.exe' "$name"
+ noexename=$func_stripname_result
+ # $file with .exe has already been added to rmfiles,
+ # add $file without .exe
+ func_append rmfiles " $file"
+ ;;
+ esac
+ # Do a test to see if this is a libtool program.
+ if func_ltwrapper_p "$file"; then
+ if func_ltwrapper_executable_p "$file"; then
+ func_ltwrapper_scriptname "$file"
+ relink_command=
+ func_source $func_ltwrapper_scriptname_result
+ func_append rmfiles " $func_ltwrapper_scriptname_result"
+ else
+ relink_command=
+ func_source $dir/$noexename
+ fi
+
+ # note $name still contains .exe if it was in $file originally
+ # as does the version of $file that was added into $rmfiles
+ func_append rmfiles " $odir/$name $odir/${name}S.$objext"
+ if test yes = "$fast_install" && test -n "$relink_command"; then
+ func_append rmfiles " $odir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name"; then
+ func_append rmfiles " $odir/lt-$noexename.c"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ func_show_eval "$RM $rmfiles" 'exit_status=1'
+ done
+
+ # Try to remove the $objdir's in the directories where we deleted files
+ for dir in $rmdirs; do
+ if test -d "$dir"; then
+ func_show_eval "rmdir $dir >/dev/null 2>&1"
+ fi
+ done
+
+ exit $exit_status
+}
+
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+ func_mode_uninstall ${1+"$@"}
+fi
+
+test -z "$opt_mode" && {
+ help=$generic_help
+ func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+ func_fatal_help "invalid operation mode '$opt_mode'"
+
+if test -n "$exec_cmd"; then
+ eval exec "$exec_cmd"
+ exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# where we disable both kinds of libraries. Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them. This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration. But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/graphics/asymptote/main.cc b/graphics/asymptote/main.cc
index 5f440c24c7..bbb664c1b4 100644
--- a/graphics/asymptote/main.cc
+++ b/graphics/asymptote/main.cc
@@ -26,10 +26,11 @@
#include <iostream>
#include <cstdlib>
#include <cerrno>
-#include <sys/wait.h>
#include <sys/types.h>
-#define GC_PTHREAD_SIGMASK_NEEDED
+#if !defined(_WIN32)
+#include <sys/wait.h>
+#endif
#include "common.h"
@@ -37,29 +38,31 @@
#include <sigsegv.h>
#endif
+#define GC_PTHREAD_SIGMASK_NEEDED
+
+#ifdef HAVE_LSP
+#include "lspserv.h"
+#endif
+
+#include "exithandlers.h"
#include "errormsg.h"
#include "fpu.h"
#include "settings.h"
#include "locate.h"
#include "interact.h"
#include "fileio.h"
+#include "stack.h"
#ifdef HAVE_LIBFFTW3
#include "fftw++.h"
#endif
-#ifdef HAVE_LSP
-#include "lspserv.h"
+#if defined(_WIN32)
+#include <combaseapi.h>
#endif
#include "stack.h"
-#ifdef HAVE_LIBCURSES
-#ifdef HAVE_LIBREADLINE
-#include <readline/readline.h>
-#endif
-#endif
-
using namespace settings;
using interact::interactive;
@@ -109,31 +112,10 @@ void setsignal(void (*handler)(int))
mystack,sizeof (mystack));
sigsegv_install_handler(&sigsegv_handler);
#endif
+#if !defined(_WIN32)
Signal(SIGBUS,handler);
- Signal(SIGFPE,handler);
-}
-
-void signalHandler(int)
-{
- // Print the position and trust the shell to print an error message.
- em.runtime(vm::getPos());
-
- Signal(SIGBUS,SIG_DFL);
- Signal(SIGFPE,SIG_DFL);
-}
-
-void interruptHandler(int)
-{
-#ifdef HAVE_LIBFFTW3
- fftwpp::saveWisdom();
#endif
- em.Interrupt(true);
-}
-
-bool hangup=false;
-void hangup_handler(int sig)
-{
- hangup=true;
+ Signal(SIGFPE,handler);
}
struct Args
@@ -143,11 +125,6 @@ struct Args
Args(int argc, char **argv) : argc(argc), argv(argv) {}
};
-int returnCode()
-{
- return em.processStatus() || interact::interactive ? 0 : 1;
-}
-
void *asymain(void *A)
{
setsignal(signalHandler);
@@ -157,6 +134,11 @@ void *asymain(void *A)
fftwpp::wisdomName=".wisdom";
#endif
+#if defined(_WIN32)
+ // see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecuteexa
+ CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
+#endif
+
if(interactive) {
Signal(SIGINT,interruptHandler);
#ifdef HAVE_LSP
@@ -191,8 +173,11 @@ void *asymain(void *A)
int n=numArgs();
if(n == 0) {
int inpipe=intcast(settings::getSetting<Int>("inpipe"));
- if(inpipe >= 0) {
+ bool hasInpipe=inpipe >= 0;
+ if(hasInpipe) {
+#if !defined(_WIN32)
Signal(SIGHUP,hangup_handler);
+#endif
camp::openpipeout();
fprintf(camp::pipeout,"\n");
fflush(camp::pipeout);
@@ -231,8 +216,12 @@ void *asymain(void *A)
#endif
if(getSetting<bool>("wait")) {
+#if defined(_WIN32)
+#pragma message("TODO: wait option not implement yet")
+#else
int status;
while(wait(&status) > 0);
+#endif
}
#ifdef HAVE_GL
#ifdef HAVE_PTHREAD
@@ -249,20 +238,17 @@ void *asymain(void *A)
exit(returnCode());
}
-void exitHandler(int)
-{
-#if defined(HAVE_READLINE) && defined(HAVE_LIBCURSES)
- rl_cleanup_after_signal();
-#endif
- exit(returnCode());
-}
-
int main(int argc, char *argv[])
{
#ifdef HAVE_LIBGSL
+#if defined(_WIN32)
+ _putenv("GSL_RNG_SEED=");
+ _putenv("GSL_RNG_TYPE=");
+#else
unsetenv("GSL_RNG_SEED");
unsetenv("GSL_RNG_TYPE");
#endif
+#endif
setsignal(signalHandler);
try {
@@ -273,7 +259,12 @@ int main(int argc, char *argv[])
Args args(argc,argv);
#ifdef HAVE_GL
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(_WIN32)
+
+#if defined(_WIN32)
+#pragma message("TODO: Check if (1) we need detach-based gl renderer")
+#endif
+
bool usethreads=true;
#else
bool usethreads=view();
@@ -284,14 +275,36 @@ int main(int argc, char *argv[])
if(gl::glthread) {
pthread_t thread;
try {
- if(pthread_create(&thread,NULL,asymain,&args) == 0) {
+#if defined(_WIN32)
+ auto asymainPtr = [](void* args) -> void*
+ {
+#if defined(USEGC)
+ GC_stack_base gsb {};
+ GC_get_stack_base(&gsb);
+ GC_register_my_thread(&gsb);
+#endif
+ auto* ret = asymain(args);
+
+#if defined(USEGC)
+ GC_unregister_my_thread();
+#endif
+ return reinterpret_cast<void*>(ret);
+ };
+#else
+ auto* asymainPtr = asymain;
+#endif
+ if(pthread_create(&thread,NULL,asymainPtr,&args) == 0) {
gl::mainthread=pthread_self();
+#if !defined(_WIN32)
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
pthread_sigmask(SIG_BLOCK, &set, NULL);
+#endif
for(;;) {
+#if !defined(_WIN32)
Signal(SIGURG,exitHandler);
+#endif
camp::glrenderWrapper();
gl::initialize=true;
}
@@ -306,9 +319,3 @@ int main(int argc, char *argv[])
#endif
asymain(&args);
}
-
-#ifdef USEGC
-GC_API void GC_CALL GC_throw_bad_alloc() {
- std::bad_alloc();
-}
-#endif
diff --git a/graphics/asymptote/mathop.h b/graphics/asymptote/mathop.h
index d51c5741eb..0b4438aacb 100644
--- a/graphics/asymptote/mathop.h
+++ b/graphics/asymptote/mathop.h
@@ -242,6 +242,14 @@ struct mod {
}
};
+template <>
+struct mod<Int> {
+ Int operator() (Int x, Int y, size_t i=0) {
+ if(y == 0) dividebyzero(i);
+ return imod(x,y);
+ }
+};
+
template <typename>
struct quotient {
Int operator() (Int x, Int y, size_t i=0) {
diff --git a/graphics/asymptote/memory.cc b/graphics/asymptote/memory.cc
new file mode 100644
index 0000000000..8715483a85
--- /dev/null
+++ b/graphics/asymptote/memory.cc
@@ -0,0 +1,74 @@
+/**
+ * @file memory.cc
+ * @brief Implementation of certain gc-related functions
+ */
+
+#if defined(HAVE_CONFIG_H)
+#include "config.h"
+#endif
+
+#include "memory.h"
+#include <memory>
+
+// asy_malloc functions + GC_throw_bad_alloc
+
+#if defined(USEGC)
+
+void* asy_malloc(size_t n)
+{
+#ifdef GC_DEBUG
+ if(void *mem=GC_debug_malloc_ignore_off_page(n, GC_EXTRAS))
+#else
+ if(void *mem=GC_malloc_ignore_off_page(n))
+#endif
+ return mem;
+ throw std::bad_alloc();
+}
+
+void* asy_malloc_atomic(size_t n)
+{
+#ifdef GC_DEBUG
+ if(void *mem=GC_debug_malloc_atomic_ignore_off_page(n, GC_EXTRAS))
+#else
+ if(void *mem=GC_malloc_atomic_ignore_off_page(n))
+#endif
+ return mem;
+ throw std::bad_alloc();
+}
+
+#if !defined(_WIN32)
+GC_API void GC_CALL GC_throw_bad_alloc()
+{
+ throw std::bad_alloc();
+}
+#endif
+
+#endif // defined(USEGC)
+
+// compact & stdString functions
+
+namespace mem
+{
+#if defined(USEGC)
+
+void compact(int x)
+{
+ GC_set_dont_expand(x);
+}
+
+std::string stdString(string s)
+{
+ return std::string(s.c_str());
+}
+
+#else // defined(USEGC)
+
+std::string stdString(string s)
+{
+ return s;
+}
+
+#endif // defined(USEGC)
+}
+
+// throw bad alloc
diff --git a/graphics/asymptote/memory.h b/graphics/asymptote/memory.h
index 3ddc2aaea1..4e60712e88 100644
--- a/graphics/asymptote/memory.h
+++ b/graphics/asymptote/memory.h
@@ -60,27 +60,8 @@ extern "C" {
}
#endif
-inline void *asy_malloc(size_t n)
-{
-#ifdef GC_DEBUG
- if(void *mem=GC_debug_malloc_ignore_off_page(n, GC_EXTRAS))
-#else
- if(void *mem=GC_malloc_ignore_off_page(n))
-#endif
- return mem;
- throw std::bad_alloc();
-}
-
-inline void *asy_malloc_atomic(size_t n)
-{
-#ifdef GC_DEBUG
- if(void *mem=GC_debug_malloc_atomic_ignore_off_page(n, GC_EXTRAS))
-#else
- if(void *mem=GC_malloc_atomic_ignore_off_page(n))
-#endif
- return mem;
- throw std::bad_alloc();
-}
+void* asy_malloc(size_t n);
+void* asy_malloc_atomic(size_t n);
#undef GC_MALLOC
#undef GC_MALLOC_ATOMIC
@@ -191,8 +172,8 @@ typedef std::basic_ostringstream<char,std::char_traits<char>,
gc_allocator<char> > ostringstream;
typedef std::basic_stringbuf<char,std::char_traits<char>,
gc_allocator<char> > stringbuf;
-inline void compact(int x) {GC_set_dont_expand(x);}
-inline std::string stdString(string s) {return std::string(s.c_str());}
+
+void compact(int x);
#else
inline void compact(int) {}
typedef std::string string;
@@ -200,9 +181,10 @@ typedef std::stringstream stringstream;
typedef std::istringstream istringstream;
typedef std::ostringstream ostringstream;
typedef std::stringbuf stringbuf;
-inline std::string stdString(string s) {return s;}
#endif // USEGC
+std::string stdString(string s);
+
} // namespace mem
#endif
diff --git a/graphics/asymptote/aspy.py b/graphics/asymptote/misc/aspy.py
index 6c657c7bde..6c657c7bde 100644
--- a/graphics/asymptote/aspy.py
+++ b/graphics/asymptote/misc/aspy.py
diff --git a/graphics/asymptote/misc/format_nongui_py_files b/graphics/asymptote/misc/format_nongui_py_files
new file mode 100644
index 0000000000..ea9a961dca
--- /dev/null
+++ b/graphics/asymptote/misc/format_nongui_py_files
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+
+SCRIPT_ROOT_DIR=$(dirname "$0")
+black $(python3 "$SCRIPT_ROOT_DIR/print_non_gui_py_files_for_linting.py")
diff --git a/graphics/asymptote/misc/format_nongui_py_files.ps1 b/graphics/asymptote/misc/format_nongui_py_files.ps1
new file mode 100644
index 0000000000..e54344082f
--- /dev/null
+++ b/graphics/asymptote/misc/format_nongui_py_files.ps1
@@ -0,0 +1,4 @@
+#!/usr/bin/env pwsh
+$lintable_files=$(python "$PSScriptRoot/print_non_gui_py_files_for_linting.py")
+isort --settings-file="$PSScriptRoot/../.isort.cfg" $lintable_files
+black $lintable_files
diff --git a/graphics/asymptote/misc/lint_nongui_py_files b/graphics/asymptote/misc/lint_nongui_py_files
new file mode 100644
index 0000000000..4e5ce977a1
--- /dev/null
+++ b/graphics/asymptote/misc/lint_nongui_py_files
@@ -0,0 +1,7 @@
+#!/usr/bin/env sh
+
+SCRIPT_ROOT_DIR=$(dirname "$0")
+FILES_TO_LINT=$(python3 "$SCRIPT_ROOT_DIR/print_non_gui_py_files_for_linting.py")
+
+isort --settings-file "$SCRIPT_ROOT_DIR/../.isort.cfg" --check $FILES_TO_LINT
+pylint --rcfile "$SCRIPT_ROOT_DIR/../.pylintrc" $FILES_TO_LINT
diff --git a/graphics/asymptote/misc/lint_nongui_py_files.ps1 b/graphics/asymptote/misc/lint_nongui_py_files.ps1
new file mode 100644
index 0000000000..4ccf9b790e
--- /dev/null
+++ b/graphics/asymptote/misc/lint_nongui_py_files.ps1
@@ -0,0 +1,5 @@
+#!/usr/bin/env pwsh
+$lintable_files=$(python "$PSScriptRoot/print_non_gui_py_files_for_linting.py")
+
+isort --settings-file="$PSScriptRoot/../.isort.cfg" --check $lintable_files
+pylint --rcfile="$PSScriptRoot/../.pylintrc" $lintable_files
diff --git a/graphics/asymptote/misc/print_non_gui_py_files_for_linting.py b/graphics/asymptote/misc/print_non_gui_py_files_for_linting.py
new file mode 100644
index 0000000000..dd1d3fc61c
--- /dev/null
+++ b/graphics/asymptote/misc/print_non_gui_py_files_for_linting.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+import pathlib
+
+REPO_ROOT = pathlib.Path(__file__).parents[1]
+
+EXCLUDED_ROOT_FOLDERS = [
+ "cmake-build-*",
+ "cmake-install-*",
+ ".git",
+ ".vs",
+ ".fleet",
+ ".idea",
+ ".vscode",
+ "__pycache__",
+ "GUI",
+ "asydoc",
+ "extfiles",
+ "tools-cache",
+ "vcpkg_installed",
+ "LspCpp",
+ "tinyexr",
+]
+
+EXCLUDED_FILE_GLOB_PATTERNS = [
+ "base/asymptote.py",
+ "misc/aspy.py",
+ "misc/profile.py",
+ "base/asymptote.pdf",
+]
+
+
+def print_subdirectory(subdirectory: pathlib.Path):
+ for py_file in subdirectory.rglob("*.py"):
+ if any(py_file.match(pattern) for pattern in EXCLUDED_FILE_GLOB_PATTERNS):
+ continue
+ print(py_file)
+
+
+def print_non_gui_py_files_for_linting():
+ for py_file in REPO_ROOT.glob("*.py"):
+ if any(py_file.match(pattern) for pattern in EXCLUDED_FILE_GLOB_PATTERNS):
+ continue
+ print(py_file)
+
+ for path in REPO_ROOT.iterdir():
+ if not path.is_dir():
+ continue
+ if any(path.match(pattern) for pattern in EXCLUDED_ROOT_FOLDERS):
+ continue
+ print_subdirectory(path)
+
+
+if __name__ == "__main__":
+ print_non_gui_py_files_for_linting()
diff --git a/graphics/asymptote/profile.py b/graphics/asymptote/misc/profile.py
index bfdd52015b..bfdd52015b 100644
--- a/graphics/asymptote/profile.py
+++ b/graphics/asymptote/misc/profile.py
diff --git a/graphics/asymptote/testv3d.asy b/graphics/asymptote/misc/testv3d.asy
index ab558f7fd4..ab558f7fd4 100644
--- a/graphics/asymptote/testv3d.asy
+++ b/graphics/asymptote/misc/testv3d.asy
diff --git a/graphics/asymptote/missing b/graphics/asymptote/missing
new file mode 100755
index 0000000000..1fe1611f18
--- /dev/null
+++ b/graphics/asymptote/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# 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
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+fi
+
+case $1 in
+
+ --is-lightweight)
+ # Used by our autoconf macros to check whether the available missing
+ # script is modern enough.
+ exit 0
+ ;;
+
+ --run)
+ # Back-compat with the calling convention used by older automake.
+ shift
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+
+Supported PROGRAM values:
+ aclocal autoconf autoheader autom4te automake makeinfo
+ bison yacc flex lex help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: unknown '$1' option"
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch. This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+ msg="probably too old"
+elif test $st -eq 127; then
+ # Program was missing.
+ msg="missing on your system"
+else
+ # Program was found and executed, but failed. Give up.
+ exit $st
+fi
+
+perl_URL=https://www.perl.org/
+flex_URL=https://github.com/westes/flex
+gnu_software_URL=https://www.gnu.org/software
+
+program_details ()
+{
+ case $1 in
+ aclocal|automake)
+ echo "The '$1' program is part of the GNU Automake package:"
+ echo "<$gnu_software_URL/automake>"
+ echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/autoconf>"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ autoconf|autom4te|autoheader)
+ echo "The '$1' program is part of the GNU Autoconf package:"
+ echo "<$gnu_software_URL/autoconf/>"
+ echo "It also requires GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ esac
+}
+
+give_advice ()
+{
+ # Normalize program name to check for.
+ normalized_program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
+ printf '%s\n' "'$1' is $msg."
+
+ configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+ case $normalized_program in
+ autoconf*)
+ echo "You should only need it if you modified 'configure.ac',"
+ echo "or m4 files included by it."
+ program_details 'autoconf'
+ ;;
+ autoheader*)
+ echo "You should only need it if you modified 'acconfig.h' or"
+ echo "$configure_deps."
+ program_details 'autoheader'
+ ;;
+ automake*)
+ echo "You should only need it if you modified 'Makefile.am' or"
+ echo "$configure_deps."
+ program_details 'automake'
+ ;;
+ aclocal*)
+ echo "You should only need it if you modified 'acinclude.m4' or"
+ echo "$configure_deps."
+ program_details 'aclocal'
+ ;;
+ autom4te*)
+ echo "You might have modified some maintainer files that require"
+ echo "the 'autom4te' program to be rebuilt."
+ program_details 'autom4te'
+ ;;
+ bison*|yacc*)
+ echo "You should only need it if you modified a '.y' file."
+ echo "You may want to install the GNU Bison package:"
+ echo "<$gnu_software_URL/bison/>"
+ ;;
+ lex*|flex*)
+ echo "You should only need it if you modified a '.l' file."
+ echo "You may want to install the Fast Lexical Analyzer package:"
+ echo "<$flex_URL>"
+ ;;
+ help2man*)
+ echo "You should only need it if you modified a dependency" \
+ "of a man page."
+ echo "You may want to install the GNU Help2man package:"
+ echo "<$gnu_software_URL/help2man/>"
+ ;;
+ makeinfo*)
+ echo "You should only need it if you modified a '.texi' file, or"
+ echo "any other file indirectly affecting the aspect of the manual."
+ echo "You might want to install the Texinfo package:"
+ echo "<$gnu_software_URL/texinfo/>"
+ echo "The spurious makeinfo call might also be the consequence of"
+ echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+ echo "want to install GNU make:"
+ echo "<$gnu_software_URL/make/>"
+ ;;
+ *)
+ echo "You might have modified some files without having the proper"
+ echo "tools for further handling them. Check the 'README' file, it"
+ echo "often tells you about the needed prerequisites for installing"
+ echo "this package. You may also peek at any GNU archive site, in"
+ echo "case some other package contains this missing '$1' program."
+ ;;
+ esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+ -e '2,$s/^/ /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/graphics/asymptote/mod.h b/graphics/asymptote/mod.h
index b441d08b7c..7452590914 100644
--- a/graphics/asymptote/mod.h
+++ b/graphics/asymptote/mod.h
@@ -20,22 +20,25 @@ inline double Mod(double x, double y) {return fmod(x,y);}
template<typename T>
inline T portableMod(T x,T y)
{
-// Implementation-independent definition of mod; ensure that result has
+// Implementation-independent definition of mod; ensure result has
// same sign as divisor
T val=Mod(x,y);
- if((y > 0 && val < 0) || (y < 0 && val > 0)) val += y;
- return val;
+ return ((y > 0 && val >= 0) || (y < 0 && val <= 0)) ? val : val+y;
}
-inline Int imod(Int x, Int y)
-{
- return portableMod<Int>(x,y);
+inline Int imod(Int x, size_t y) {
+ if((y & (y-1)) == 0)
+ return x & (y-1); // Use mask if y is a power of two
+ x %= (Int) y;
+ return (x >= 0) ? x : x+(Int) y;
}
-inline Int imod(Int i, size_t n) {
- i %= (Int) n;
- if(i < 0) i += (Int) n;
- return i;
+inline Int imod(Int x, Int y)
+{
+ if(y > 0)
+ return imod(x,(size_t) y);
+ else
+ return portableMod<Int>(x,y);
}
#endif
diff --git a/graphics/asymptote/modifier.h b/graphics/asymptote/modifier.h
index 856da9d5c0..1cd6c5f954 100644
--- a/graphics/asymptote/modifier.h
+++ b/graphics/asymptote/modifier.h
@@ -30,7 +30,8 @@ enum modifier {
DEFAULT_STATIC,
DEFAULT_DYNAMIC,
EXPLICIT_STATIC,
- EXPLICIT_DYNAMIC
+ EXPLICIT_DYNAMIC,
+ AUTOUNRAVEL,
};
} // namespace trans
diff --git a/graphics/asymptote/name.cc b/graphics/asymptote/name.cc
index 04e3552c68..38456fe8c4 100644
--- a/graphics/asymptote/name.cc
+++ b/graphics/asymptote/name.cc
@@ -73,8 +73,16 @@ types::ty *name::getType(coenv &e, bool tacit)
varEntry *simpleName::getVarEntry(coenv &e)
{
+ // If the name refers to a signatureless variable,
+ // return its varEntry.
types::ty *t=signatureless(varGetType(e));
- return t ? e.e.lookupVarByType(id, t) : 0;
+ if (t)
+ return e.e.lookupVarByType(id, t);
+
+ // Otherwise, the name refers to a type.
+ // Return its varEntry.
+ tyEntry *ent = e.e.lookupTyEntry(id);
+ return ent ? ent->v : 0;
}
void simpleName::varTrans(action act, coenv &e, types::ty *target)
@@ -123,7 +131,7 @@ tyEntry *simpleName::tyEntryTrans(coenv &e)
if (!ent) {
em.error(getPos());
em << "no type of name \'" << id << "\'";
- return new tyEntry(primError(), 0, 0, position());
+ return new tyEntry(primError(), nullptr, nullptr, nullPos);
}
return ent;
}
@@ -290,14 +298,14 @@ tyEntry *qualifiedName::tyEntryTrans(coenv &e)
record *r = castToRecord(rt, false);
if (!r)
- return new tyEntry(primError(), 0, 0, position());
+ return new tyEntry(primError(), nullptr, nullptr, nullPos);
tyEntry *ent = r->e.lookupTyEntry(id);
if (!ent) {
em.error(getPos());
em << "no matching type of name \'" << id << "\' in \'"
<< *r << "\'";
- return new tyEntry(primError(), 0, 0, position());
+ return new tyEntry(primError(), nullptr, nullptr, nullPos);
}
ent->reportPerm(READ, getPos(), e.c);
diff --git a/graphics/asymptote/newexp.cc b/graphics/asymptote/newexp.cc
index 7d8efbd138..ea33313bca 100644
--- a/graphics/asymptote/newexp.cc
+++ b/graphics/asymptote/newexp.cc
@@ -34,40 +34,6 @@ void newRecordExp::prettyprint(ostream &out, Int indent) {
prettyname(out, "newRecordExp", indent, getPos());
}
-bool newRecordExp::encodeLevel(position pos, coenv &e, trans::tyEntry *ent)
-{
- record *r = dynamic_cast<record *>(ent->t);
- assert(r);
-
- // The level needed on which to allocate the record.
- frame *level = r->getLevel()->getParent();
-
- if (ent->v) {
- // Put the record on the stack. For instance, in code like
- // access imp;
- // new imp.t;
- // we are putting the instance of imp on the stack, so we can use it to
- // allocate an instance of imp.t.
- ent->v->getLocation()->encode(trans::READ, pos, e.c);
-
- // Adjust to the right frame. For instance, in the last new in
- // struct A {
- // struct B {
- // static struct C {}
- // }
- // B b=new B;
- // }
- // A a=new A;
- // new a.b.C;
- // we push a.b onto the stack, but need a as the enclosing frame for
- // allocating an instance of C.
- record *q = dynamic_cast<record *>(ent->v->getType());
- return e.c.encode(level, q->getLevel());
- }
- else
- return e.c.encode(level);
-}
-
types::ty *newRecordExp::transFromTyEntry(position pos, coenv &e,
trans::tyEntry *ent)
{
@@ -81,7 +47,7 @@ types::ty *newRecordExp::transFromTyEntry(position pos, coenv &e,
}
// Put the enclosing frame on the stack.
- if (!encodeLevel(pos, e, ent)) {
+ if (!e.c.encodeParent(pos, ent)) {
em.error(pos);
em << "allocation of struct '" << *t << "' is not in a valid scope";
return primError();
diff --git a/graphics/asymptote/newexp.h b/graphics/asymptote/newexp.h
index cec21abf7b..c1c9886d52 100644
--- a/graphics/asymptote/newexp.h
+++ b/graphics/asymptote/newexp.h
@@ -22,7 +22,6 @@ class newRecordExp : public exp {
astType *result;
public:
- static bool encodeLevel(position pos, coenv &e, trans::tyEntry *ent);
newRecordExp(position pos, astType *result)
: exp(pos), result(result) {}
diff --git a/graphics/asymptote/opsymbols.pl b/graphics/asymptote/opsymbols.pl
deleted file mode 100755
index 06491ad1c6..0000000000
--- a/graphics/asymptote/opsymbols.pl
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env perl
-#####
-# opsymbols.pl
-# Andy Hammerlindl 2010/06/01
-#
-# Extract mapping such as '+' --> SYM_PLUS from camp.l
-#####
-
-open(header, ">opsymbols.h") ||
- die("Couldn't open opsymbols.h for writing");
-
-print header <<END;
-/*****
- * This file is automatically generated by opsymbols.pl
- * Changes will be overwritten.
- *****/
-
-// If the OPSYMBOL macro is not defined for a specific purpose, define it with
-// the default purpose of using SYM_PLUS etc. as external pre-translated
-// symbols.
-
-#ifndef OPSYMBOL
-#define OPSYMBOL(str, name) extern sym::symbol name
-#endif
-
-END
-
-sub add {
- print header "OPSYMBOL(\"".$_[0]."\", " . $_[1] . ");\n";
-}
-
-open(lexer, "camp.l") ||
- die("Couldn't open camp.l");
-
-while (<lexer>) {
- if (m/^"(\S+)"\s*{\s*DEFSYMBOL\((\w+)\);/) {
- add($1, $2);
- }
- if (m/^(\w+)\s*{\s*DEFSYMBOL\((\w+)\);/) {
- add($1, $2);
- }
- if (m/^\s*EXTRASYMBOL\(\s*(\w+)\s*,\s*(\w+)\s*\)/) {
- add($1, $2);
- }
-}
-
-print header <<END
-
-/* This file is automatically generated. */
-END
diff --git a/graphics/asymptote/opsymbols.py b/graphics/asymptote/opsymbols.py
new file mode 100644
index 0000000000..13ec68afad
--- /dev/null
+++ b/graphics/asymptote/opsymbols.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+"""
+opsymbols.py
+Andy Hammerlindl 2010/06/01
+
+Extract mapping such as '+' --> SYM_PLUS from camp.l
+"""
+
+import argparse
+import re
+import textwrap
+
+# Parse command-line arguments
+parser = argparse.ArgumentParser(description="Extract operator symbols.")
+parser.add_argument("--campfile", required=True, help="Input lex file (camp.l)")
+parser.add_argument("--output", required=True, help="Output header file")
+args = parser.parse_args()
+
+# Open output file and write header
+with open(args.output, "w", encoding="utf-8") as header:
+ header.write(
+ # pylint: disable=line-too-long
+ textwrap.dedent(
+ """\
+ /*****
+ * This file is automatically generated by opsymbols.py
+ * Changes will be overwritten.
+ *****/
+
+ // If the OPSYMBOL macro is not defined for a specific purpose, define it with
+ // the default purpose of using SYM_PLUS etc. as external pre-translated
+ // symbols.
+
+ #ifndef OPSYMBOL
+ #define OPSYMBOL(str, name) extern sym::symbol name
+ #endif
+
+ """
+ )
+ )
+
+ # Define add function
+ def add(symbol, name):
+ header.write(f'OPSYMBOL("{symbol}", {name});\n')
+
+ # Open and process campfile
+ with open(args.campfile, "r", encoding="utf-8") as lexer:
+ for line in lexer:
+ match = re.search(r'^"(\S+)"\s*{\s*DEFSYMBOL\((\w+)\);', line)
+ if match:
+ add(match.group(1), match.group(2))
+ continue
+ match = re.search(r"^(\w+)\s*{\s*DEFSYMBOL\((\w+)\);", line)
+ if match:
+ add(match.group(1), match.group(2))
+ continue
+ match = re.search(r"^\s*EXTRASYMBOL\(\s*(\w+)\s*,\s*(\w+)\s*\)", line)
+ if match:
+ add(match.group(1), match.group(2))
+ continue
+
+ # Write closing comments
+ header.write("\n/* This file is automatically generated. */\n")
diff --git a/graphics/asymptote/patches/cygwin_freeglut-3.0.0.patch b/graphics/asymptote/patches/cygwin_freeglut-3.0.0.patch
deleted file mode 100644
index bd27dfe356..0000000000
--- a/graphics/asymptote/patches/cygwin_freeglut-3.0.0.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-diff -ru freeglut-3.0.0/CMakeLists.txt freeglut-3.0.0J/CMakeLists.txt
---- freeglut-3.0.0/CMakeLists.txt 2015-02-17 23:59:57.000000000 -0500
-+++ freeglut-3.0.0J/CMakeLists.txt 2019-01-20 22:15:55.410415400 -0500
-@@ -20,7 +20,7 @@
- set(VERSION_MAJOR 3)
- set(VERSION_MINOR 0)
- set(VERSION_PATCH 0)
--
-+set(WIN32 1)
- # Update fg_version.h to match the versions number here in cmake
- CONFIGURE_FILE(src/fg_version.h.in src/fg_version.h)
-
-@@ -32,7 +32,7 @@
- # FREEGLUT_BUILD_SHARED_LIBS is already a standard CMake variable, but we need to
- # re-declare it here so it will show up in the GUI.
- # by default, we want to build both
--OPTION(FREEGLUT_BUILD_SHARED_LIBS "Build FreeGLUT shared library." ON)
-+OPTION(FREEGLUT_BUILD_SHARED_LIBS "Build FreeGLUT shared library." OFF)
- OPTION(FREEGLUT_BUILD_STATIC_LIBS "Build FreeGLUT static library." ON)
-
- # option for whether warnings and errors should be printed
-@@ -439,7 +439,7 @@
-
-
- # Optionally build demos, on by default.
--option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." ON )
-+option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." OFF )
-
- SET(DEMO_LIBS ${OPENGL_glu_LIBRARY} ${LIBS})
- # lib m for math, not needed on windows
-Only in freeglut-3.0.0J: CMakeLists.txt~
-diff -ru freeglut-3.0.0/src/fg_internal.h freeglut-3.0.0J/src/fg_internal.h
---- freeglut-3.0.0/src/fg_internal.h 2014-12-22 11:27:02.000000000 -0500
-+++ freeglut-3.0.0J/src/fg_internal.h 2019-01-20 22:13:40.317578700 -0500
-@@ -24,6 +24,13 @@
- * IN AN ACTION 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 FREEGLUT_EXPORTS 1
-+
-+#define TARGET_HOST_MS_WINDOWS 1
-+
-+#define GCL_HCURSOR (-12)
-+#define _snprintf snprintf
-+
-
- #ifndef FREEGLUT_INTERNAL_H
- #define FREEGLUT_INTERNAL_H
diff --git a/graphics/asymptote/path3.h b/graphics/asymptote/path3.h
index 095d4698af..df4837912a 100644
--- a/graphics/asymptote/path3.h
+++ b/graphics/asymptote/path3.h
@@ -17,10 +17,6 @@
#include "path.h"
#include "arrayop.h"
-// For CYGWIN
-#undef near
-#undef far
-
namespace camp {
void checkEmpty3(Int n);
@@ -287,13 +283,13 @@ public:
triple mintimes() const {
checkEmpty3(n);
bounds();
- return camp::triple(times.left,times.bottom,times.near);
+ return camp::triple(times.leftBound,times.bottomBound,times.nearBound);
}
triple maxtimes() const {
checkEmpty3(n);
bounds();
- return camp::triple(times.right,times.top,times.far);
+ return camp::triple(times.rightBound,times.topBound,times.farBound);
}
template<class T>
diff --git a/graphics/asymptote/picture.cc b/graphics/asymptote/picture.cc
index 8ea6e3bf86..8374804aa1 100644
--- a/graphics/asymptote/picture.cc
+++ b/graphics/asymptote/picture.cc
@@ -16,11 +16,18 @@
#include "drawlayer.h"
#include "drawsurface.h"
#include "drawpath3.h"
+#include "win32helpers.h"
-#ifdef __MSDOS__
-#include "sys/cygwin.h"
+#if defined(_WIN32)
+#include <Windows.h>
+#include <shellapi.h>
+#include <cstdio>
+#define unlink _unlink
#endif
+#include <thread>
+#include <chrono>
+
using std::ifstream;
using std::ofstream;
using vm::array;
@@ -518,7 +525,15 @@ bool picture::texprocess(const string& texname, const string& outname,
string dvipsrc=getSetting<string>("dir");
if(dvipsrc.empty()) dvipsrc=systemDir;
dvipsrc += dirsep+"nopapersize.ps";
+#if !defined(_WIN32)
setenv("DVIPSRC",dvipsrc.c_str(),1);
+#else
+ auto setEnvResult = SetEnvironmentVariableA("DVIPSRC",dvipsrc.c_str());
+ if (!setEnvResult)
+ {
+ camp::reportError("Cannot set DVIPSRC environment variable");
+ }
+#endif
string papertype=getSetting<string>("papertype") == "letter" ?
"letterSize" : "a4size";
cmd.push_back(getSetting<string>("dvips"));
@@ -786,21 +801,44 @@ int picture::epstosvg(const string& epsname, const string& outname,
void htmlView(string name)
{
- mem::vector<string> cmd;
- push_command(cmd,getSetting<string>("htmlviewer"));
-#ifdef __MSDOS__
- ssize_t size=cygwin_conv_path(CCP_POSIX_TO_WIN_A,
- locateFile(name,true).c_str(),NULL,0);
- if(size <= 0) return;
- char filename[size];
- size=cygwin_conv_path(CCP_POSIX_TO_WIN_A,locateFile(name,true).c_str(),
- filename,size);
- cmd.push_back("file://"+string(filename));
+ string const browser=getSetting<string>("htmlviewer");
+ string const htmlFile=locateFile(name, true);
+
+ if (browser.empty())
+ {
+#if defined(_WIN32)
+ // for windows, no browser means to use the windows' default
+ auto const result = reinterpret_cast<INT_PTR>(
+ ShellExecuteA(
+ nullptr,
+ "open",
+ htmlFile.c_str(),
+ nullptr,
+ nullptr,
+ SW_SHOWNORMAL
+ ));
+ // see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutea
+ if (result <= 32)
+ {
+ // error code should be stored in GetLastError
+ w32::reportAndFailWithLastError( "Cannot open browser for viewing");
+ }
#else
- cmd.push_back(locateFile(name,true));
+ reportError("No browser specified; please specify your browser in htmlviewer");
#endif
- push_split(cmd,getSetting<string>("htmlviewerOptions"));
- System(cmd,2,false);
+ }
+ else
+ {
+ string const browserOptions= getSetting<string>("htmlviewerOptions");
+ mem::vector<string> cmd;
+ push_command(cmd, browser);
+ cmd.push_back(htmlFile);
+ if (browserOptions.empty())
+ {
+ push_split(cmd, browserOptions);
+ }
+ System(cmd, 2, false);
+ }
}
bool picture::postprocess(const string& prename, const string& outname,
@@ -849,23 +887,21 @@ bool picture::postprocess(const string& prename, const string& outname,
cmd.push_back("-sOutputFile="+outname);
cmd.push_back(prename);
status=System(cmd,0,true,"gs","Ghostscript");
- } else if(!svg && !getSetting<bool>("xasy")) {
+ } else if(!svg && !xasy) {
double expand=antialias;
if(expand < 2.0) expand=1.0;
res *= expand;
string s=getSetting<string>("convert");
cmd.push_back(s);
- if(s != "convert")
- cmd.push_back("convert");
cmd.push_back("-density");
cmd.push_back(String(res)+"x"+String(res));
+ cmd.push_back(prename);
if(expand == 1.0)
cmd.push_back("+antialias");
push_split(cmd,getSetting<string>("convertOptions"));
cmd.push_back("-resize");
cmd.push_back(String(100.0/expand)+"%x");
if(outputformat == "jpg") cmd.push_back("-flatten");
- cmd.push_back(prename);
cmd.push_back(outputformat+":"+outname);
status=System(cmd,0,true,"convert");
}
@@ -884,55 +920,127 @@ bool picture::postprocess(const string& prename, const string& outname,
bool picture::display(const string& outname, const string& outputformat,
bool wait, bool view, bool epsformat)
{
- int status=0;
static mem::map<CONST string,int> pids;
- bool View=settings::view() && view;
+ if (settings::view() && view)
+ {
+ int status;
- if(View) {
- bool pdf=settings::pdf(getSetting<string>("tex"));
- bool pdfformat=(pdf && outputformat == "") || outputformat == "pdf";
+ bool const pdf=settings::pdf(getSetting<string>("tex"));
+ bool pdfformat=(pdf && outputformat.empty()) || outputformat == "pdf";
if(epsformat || pdfformat) {
// Check to see if there is an existing viewer for this outname.
- mem::map<CONST string,int>::iterator p=pids.find(outname);
+ mem::map<CONST string,int>::iterator const p=pids.find(outname);
bool running=(p != pids.end());
- string Viewer=pdfformat ? getSetting<string>("pdfviewer") :
- getSetting<string>("psviewer");
+ string Viewer=
+ pdfformat ?
+ getSetting<string>("pdfviewer") : getSetting<string>("psviewer");
int pid;
if(running) {
pid=p->second;
if(pid)
- running=(waitpid(pid, &status, WNOHANG) != pid);
+ {
+#if defined(_WIN32)
+ running=w32::isProcessRunning(pid);
+#else
+ running= (waitpid(pid, &status, WNOHANG) != pid);
+#endif
+ }
}
bool pdfreload=pdfformat && getSetting<bool>("pdfreload");
if(running) {
+#if defined(_WIN32)
+ if (pdfreload)
+ {
+ reloadPDF(Viewer,outname);
+ }
+#else // win32 does not support reload by sighup
// Tell gv/acroread to reread file.
- if(Viewer == "gv") kill(pid,SIGHUP);
+ if(Viewer == "gv")
+ {
+ kill(pid,SIGHUP);
+ }
else if(pdfreload)
+ {
reloadPDF(Viewer,outname);
+ }
+#endif
} else {
- mem::vector<string> cmd;
- push_command(cmd,Viewer);
- string viewerOptions=getSetting<string>(pdfformat ?
- "pdfviewerOptions" :
- "psviewerOptions");
- if(!viewerOptions.empty())
- push_split(cmd,viewerOptions);
- cmd.push_back(outname);
- status=System(cmd,0,wait,
- pdfformat ? "pdfviewer" : "psviewer",
- pdfformat ? "your PDF viewer" : "your PostScript viewer",
- &pid);
- if(status != 0) return false;
+ // start new process
+ if (Viewer.empty())
+ {
+#if defined(_WIN32)
+ // no viewer, use default
+
+ string const fullOutFilePath= locateFile(outname, true);
+ SHELLEXECUTEINFOA execInfo = {};
+ execInfo.cbSize= sizeof(execInfo);
+ execInfo.hwnd = nullptr;
+ execInfo.lpVerb= "open";
+ execInfo.lpFile= fullOutFilePath.c_str();
+ execInfo.lpDirectory = nullptr;
+ execInfo.nShow= SW_SHOWNORMAL;
+ execInfo.fMask= SEE_MASK_NOCLOSEPROCESS;
+
+ if (!ShellExecuteExA(&execInfo))
+ {
+ return false;
+ }
+
+ if (!w32::checkShellExecuteResult(reinterpret_cast<INT_PTR>(execInfo.hInstApp),false))
+ {
+ // see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/ns-shellapi-shellexecuteinfoa
+ return false;
+ }
+
+ if (execInfo.hProcess!=nullptr)
+ {
+ // wait option does not always work, especially if a new process is not created
+ // for example, if an existing PDF viewer with multiple tabs open is the viewer,
+ // asymptote thinks no process is being created;
+ // in this case, treat it as "no wait"
+ pid=static_cast<int>(GetProcessId(execInfo.hProcess));
+ CloseHandle(execInfo.hProcess);
+ }
+#else
+ cerr << "No viewer specified" << endl;
+ return false;
+#endif
+ }
+ else
+ {
+ string viewerOptions= getSetting<string>(pdfformat ? "pdfviewerOptions" : "psviewerOptions");
+ mem::vector<string> cmd;
+
+ push_command(cmd, Viewer);
+ if (!viewerOptions.empty()) push_split(cmd, viewerOptions);
+ cmd.push_back(outname);
+
+ status=System(cmd,
+ 0,
+ wait,
+ pdfformat ? "pdfviewer" : "psviewer",
+ pdfformat ? "your PDF viewer" : "your PostScript viewer",
+ &pid);
+
+ if (status != 0) return false;
+ }
if(!wait) pids[outname]=pid;
if(pdfreload) {
// Work around race conditions in acroread initialization script
- usleep(getSetting<Int>("pdfreloaddelay"));
- // Only reload if pdf viewer process is already running.
- if(waitpid(pid, &status, WNOHANG) == pid)
+ std::this_thread::sleep_for(std::chrono::microseconds(
+ getSetting<Int>("pdfreloaddelay")
+ ));
+ // Only reload if pdf viewer process is already running
+#if defined(_WIN32)
+ bool processRunning=w32::isProcessRunning(pid);
+#else
+ bool processRunning= waitpid(pid, &status, WNOHANG) == pid;
+#endif
+ if (processRunning)
reloadPDF(Viewer,outname);
}
}
@@ -940,16 +1048,39 @@ bool picture::display(const string& outname, const string& outputformat,
if(outputformat == "svg" || outputformat == "html")
htmlView(outname);
else {
- mem::vector<string> cmd;
- push_command(cmd,getSetting<string>("display"));
- cmd.push_back(outname);
- string application="your "+outputformat+" viewer";
- status=System(cmd,0,wait,"display",application.c_str());
- if(status != 0) return false;
+ string displayProgram=getSetting<string>("display");
+ if (displayProgram.empty())
+ {
+#if defined(_WIN32)
+
+ auto const result = reinterpret_cast<INT_PTR>(ShellExecuteA(
+ nullptr,
+ "open",
+ outname.c_str(), nullptr,
+ nullptr, SW_SHOWNORMAL));
+
+ if (result <= 32)
+ {
+ cerr << "Cannot start display viewer" << endl;
+ return false;
+ }
+#else
+ cerr << "No viewer specified; please specify a viewer in 'display' setting" << endl;
+ return false;
+#endif
+ }
+ else
+ {
+ mem::vector<string> cmd;
+ push_command(cmd, displayProgram);
+ cmd.push_back(outname);
+ string const application= "your " + outputformat + " viewer";
+ status= System(cmd, 0, wait, "display", application.c_str());
+ if (status != 0) return false;
+ }
}
}
}
-
return true;
}
@@ -1310,26 +1441,7 @@ void picture::render(double size2, const triple& Min, const triple& Max,
#endif
}
-struct Communicate : public gc {
- string prefix;
- picture* pic;
- string format;
- double width;
- double height;
- double angle;
- double zoom;
- triple m;
- triple M;
- pair shift;
- pair margin;
- double *t;
- double *background;
- size_t nlights;
- triple *lights;
- double *diffuse;
- double *specular;
- bool view;
-};
+typedef gl::GLRenderArgs Communicate;
Communicate com;
@@ -1343,16 +1455,15 @@ void glrenderWrapper()
endwait(initSignal,initLock);
#endif
if(allowRender)
- glrender(com.prefix,com.pic,com.format,com.width,com.height,com.angle,
- com.zoom,com.m,com.M,com.shift,com.margin,com.t,com.background,
- com.nlights,com.lights,com.diffuse,com.specular,com.view);
+ glrender(com);
#endif
}
bool picture::shipout3(const string& prefix, const string& format,
double width, double height, double angle, double zoom,
const triple& m, const triple& M, const pair& shift,
- const pair& margin, double *t, double *background,
+ const pair& margin, double *t, double *tup,
+ double *background,
size_t nlights, triple *lights, double *diffuse,
double *specular, bool view)
{
@@ -1444,6 +1555,7 @@ bool picture::shipout3(const string& prefix, const string& format,
com.shift=shift;
com.margin=margin;
com.t=t;
+ com.tup=tup;
com.background=background;
com.nlights=nlights;
com.lights=lights;
@@ -1470,6 +1582,7 @@ bool picture::shipout3(const string& prefix, const string& format,
pthread_mutex_lock(&readyLock);
#endif
} else {
+#if !defined(_WIN32)
int pid=fork();
if(pid == -1)
camp::reportError("Cannot fork process");
@@ -1478,13 +1591,36 @@ bool picture::shipout3(const string& prefix, const string& format,
waitpid(pid,NULL,interact::interactive && View ? WNOHANG : 0);
return true;
}
+#else
+#pragma message("TODO: Check if (1) we need detach-based gl renderer")
+#endif
}
#endif
}
#if HAVE_LIBGLM
- glrender(prefix,pic,outputformat,width,height,angle,zoom,m,M,shift,margin,t,
- background,nlights,lights,diffuse,specular,View,oldpid);
+ gl::GLRenderArgs args;
+ args.prefix=prefix;
+ args.pic=pic;
+ args.format=outputformat;
+ args.width=width;
+ args.height=height;
+ args.angle=angle;
+ args.zoom=zoom;
+ args.m=m;
+ args.M=M;
+ args.shift=shift;
+ args.margin=margin;
+ args.t=t;
+ args.tup=tup;
+ args.background=background;
+ args.nlights=nlights;
+ args.lights=lights;
+ args.diffuse=diffuse;
+ args.specular=specular;
+ args.view=View;
+
+ glrender(args,oldpid);
if(format3d) {
string name=buildname(prefix,format);
diff --git a/graphics/asymptote/picture.h b/graphics/asymptote/picture.h
index 61b3bd8c4f..b0a60be566 100644
--- a/graphics/asymptote/picture.h
+++ b/graphics/asymptote/picture.h
@@ -91,7 +91,7 @@ public:
bool shipout3(const string& prefix, const string& format,
double width, double height, double angle, double zoom,
const triple& m, const triple& M, const pair& shift,
- const pair& margin, double *t,
+ const pair& margin, double *t, double *tup,
double *background, size_t nlights, triple *lights,
double *diffuse, double *specular, bool view);
diff --git a/graphics/asymptote/pipestream.cc b/graphics/asymptote/pipestream.cc
index bdde519e86..c17e7168a9 100644
--- a/graphics/asymptote/pipestream.cc
+++ b/graphics/asymptote/pipestream.cc
@@ -16,11 +16,14 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+#if !defined(_WIN32)
+
#include <iostream>
#include <cstring>
#include <cerrno>
#include <sstream>
-#include <signal.h>
+#include <csignal>
+#include <fcntl.h>
#include "pipestream.h"
#include "common.h"
@@ -222,3 +225,5 @@ void iopipestream::Write(const string &s)
camp::reportFatal("write to pipe failed");
}
}
+
+#endif
diff --git a/graphics/asymptote/pipestream.h b/graphics/asymptote/pipestream.h
index eedad63f6b..1ccab7ecde 100644
--- a/graphics/asymptote/pipestream.h
+++ b/graphics/asymptote/pipestream.h
@@ -19,11 +19,15 @@
#ifndef PIPESTREAM_H
#define PIPESTREAM_H
+#if defined(_WIN32)
+
+#include "win32pipestream.h"
+typedef w32::Win32IoPipeStream iopipestream;
+
+#else
#include <sys/wait.h>
#include <unistd.h>
-#include <fcntl.h>
-
#include "common.h"
// bidirectional stream for reading and writing to pipes
@@ -103,3 +107,4 @@ public:
};
#endif
+#endif
diff --git a/graphics/asymptote/pkg-info.cmake b/graphics/asymptote/pkg-info.cmake
new file mode 100644
index 0000000000..c1f1761318
--- /dev/null
+++ b/graphics/asymptote/pkg-info.cmake
@@ -0,0 +1,16 @@
+# ASY_VERSION is set by base version + suffix, if present
+
+execute_process(
+ COMMAND ${PY3_INTERPRETER} ${CMAKE_CURRENT_LIST_DIR}/determine_pkg_info.py
+ OUTPUT_VARIABLE ASY_VERSION_INFO_RAW_OUTPUT
+) # name, version-base, issue-url, asygl
+
+macro(SET_ASY_VERSION_INFO INDEX OUTPUT_VAR_NAME)
+ list(GET ASY_VERSION_INFO_RAW_OUTPUT ${INDEX} ${OUTPUT_VAR_NAME})
+ message(STATUS "package info: ${OUTPUT_VAR_NAME} = ${${OUTPUT_VAR_NAME}}")
+endmacro()
+
+SET_ASY_VERSION_INFO(0 ASY_PACKAGE_NAME)
+SET_ASY_VERSION_INFO(1 ASY_VERSION_BASE)
+SET_ASY_VERSION_INFO(2 ASY_BUGREPORT)
+SET_ASY_VERSION_INFO(3 ASY_GL_VERSION)
diff --git a/graphics/asymptote/prc/CMakeLists.txt b/graphics/asymptote/prc/CMakeLists.txt
new file mode 100644
index 0000000000..dd9fa5287d
--- /dev/null
+++ b/graphics/asymptote/prc/CMakeLists.txt
@@ -0,0 +1,27 @@
+cmake_minimum_required(VERSION 3.27)
+project(PRC)
+
+add_library(PRC
+ ${CMAKE_CURRENT_LIST_DIR}/oPRCFile.cc
+ ${CMAKE_CURRENT_LIST_DIR}/PRCbitStream.cc
+ ${CMAKE_CURRENT_LIST_DIR}/PRCdouble.cc
+ ${CMAKE_CURRENT_LIST_DIR}/writePRC.cc
+)
+find_package(ZLIB REQUIRED)
+
+if (CMAKE_CXX_BYTE_ORDER EQUAL BIG_ENDIAN)
+ target_compile_definitions(PRC PUBLIC WORDS_BIGENDIAN=1)
+elseif (NOT CMAKE_CXX_BYTE_ORDER) # only on apple platforms
+ message(STATUS "Targeting multiple platforms with different endianness")
+ target_compile_definitions(PRC PUBLIC UNIVERSAL_ENDIAN_BUILD)
+endif()
+
+target_include_directories(
+ PRC
+ PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include
+)
+
+target_link_libraries(
+ PRC
+ PRIVATE ZLIB::ZLIB
+)
diff --git a/graphics/asymptote/prc/Makefile b/graphics/asymptote/prc/Makefile
deleted file mode 100644
index 23dd32aa3b..0000000000
--- a/graphics/asymptote/prc/Makefile
+++ /dev/null
@@ -1,42 +0,0 @@
-# Makefile.
-
-CFLAGS = -O3 -g -Wall
-CXX = g++
-
-MAKEDEPEND = $(CFLAGS) -O0 -M -DDEPEND
-
-FILES = PRCbitStream oPRCFile PRCdouble writePRC
-
-all: $(FILES:=.o)
-
-#test: $(FILES:=.o) test.o
-# $(CXX) $(CFLAGS) -o test $(FILES:=.o) test.o -lz
-
-#test_tess: $(FILES:=.o) test_tess.o
-# $(CXX) $(CFLAGS) -o test_tess $(FILES:=.o) test_tess.o -lz
-
-#test_mesh: $(FILES:=.o) test_mesh.o
-# $(CXX) $(CFLAGS) -o test_mesh $(FILES:=.o) test_mesh.o -lz
-
-.SUFFIXES: .c .cc .o .d
-.cc.o:
- $(CXX) $(CFLAGS) $(INCL) -o $@ -c $<
-.cc.d:
- @echo Creating $@; \
- rm -f $@; \
- ${CXX} $(MAKEDEPEND) $(INCL) $(MDOPTS) $< > $@.$$$$ 2>/dev/null && \
- sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
- rm -f $@.$$$$
-.c.d:
- @echo Creating $@; \
- rm -f $@; \
- ${CC} $(MAKEDEPEND) $(INCL) $(MDOPTS) $< > $@.$$$$ 2>/dev/null && \
- sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
- rm -f $@.$$$$
-
-ifeq (,$(findstring clean,${MAKECMDGOALS}))
--include $(FILES:=.d)
-endif
-
-clean:
- rm -f *.o *.d test test_tess
diff --git a/graphics/asymptote/prc/PRCTools/bitData.cc b/graphics/asymptote/prc/PRCTools/bitData.cc
index 9fba0eb0b1..5314ec3176 100644
--- a/graphics/asymptote/prc/PRCTools/bitData.cc
+++ b/graphics/asymptote/prc/PRCTools/bitData.cc
@@ -18,9 +18,9 @@
*
*************/
-#include "../PRC.h"
-#include "../PRCdouble.h"
#include "bitData.h"
+#include "../include/prc/PRC.h"
+#include "../include/prc/PRCdouble.h"
using std::cout; using std::endl; using std::hex; using std::cerr;
diff --git a/graphics/asymptote/prc/PRCTools/describePRC.cc b/graphics/asymptote/prc/PRCTools/describePRC.cc
index 1efedecb72..2e9ee65f2c 100644
--- a/graphics/asymptote/prc/PRCTools/describePRC.cc
+++ b/graphics/asymptote/prc/PRCTools/describePRC.cc
@@ -24,7 +24,7 @@
#include <string>
#include <sstream>
-#include "../PRC.h"
+#include "../include/prc/PRC.h"
#include "describePRC.h"
using std::ostringstream; using std::cout; using std::endl;
@@ -374,7 +374,7 @@ void describeModelFileData(BitByBitData &mData,
// subsections
// void describe(BitByBitData &mData)
// {
-//
+//
// }
void describeLight(BitByBitData &mData)
@@ -646,7 +646,7 @@ void describeCurvPolyLine(BitByBitData &mData)
unsigned int number_of_points = mData.readUnsignedInt();
cout << getIndent() << "number_of_points " << number_of_points << endl;
-
+
indent();
for(unsigned int i = 0; i < number_of_points; ++i)
{
@@ -785,7 +785,7 @@ void describeTopoLoop(BitByBitData &mData)
indent();
describeBaseTopology(mData);
-
+
cout << getIndent() << "orientation_with_surface "
<< static_cast<unsigned int>(mData.readChar()) << endl;
unsigned int number_of_coedge = mData.readUnsignedInt();
@@ -1089,7 +1089,7 @@ void describeBody(BitByBitData &mData)
describeObject(mData); // curve
break;
- }
+ }
case PRC_TYPE_TOPO_BrepDataCompress:
case PRC_TYPE_TOPO_SingleWireBodyCompress:
cout << getIndent() << "TODO: Unhandled body type " << type << endl;
@@ -1838,7 +1838,7 @@ void describeTextureDefinition(BitByBitData &mData)
cout << getIndent() << "--Texture Definition--" << endl;
if(!checkSectionCode(mData,PRC_TYPE_GRAPH_TextureDefinition))
return;
-
+
cout << getIndent() << "TODO: Can't describe textures yet." << endl;
}
@@ -1913,7 +1913,7 @@ void describeCategory1LineStyle(BitByBitData &mData)
indent();
// This was missing from the docs!!!!! argh!
- describeContentPRCBase(mData,true);
+ describeContentPRCBase(mData,true);
cout << getIndent() << "line_width " << mData.readDouble() << " mm" << endl;
diff --git a/graphics/asymptote/prc/PRCTools/iPRCFile.h b/graphics/asymptote/prc/PRCTools/iPRCFile.h
index 2622cb966d..a66c94a2ec 100644
--- a/graphics/asymptote/prc/PRCTools/iPRCFile.h
+++ b/graphics/asymptote/prc/PRCTools/iPRCFile.h
@@ -21,14 +21,14 @@
#ifndef __READPRC_H
#define __READPRC_H
-#include <iostream>
+#include "../include/prc/PRC.h"
+#include "inflation.h"
#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
#include <string>
#include <vector>
-#include <sstream>
-#include <iomanip>
-#include "../PRC.h"
-#include "inflation.h"
struct FileStructureInformation
{
diff --git a/graphics/asymptote/prc/PRCTools/makePRC.cc b/graphics/asymptote/prc/PRCTools/makePRC.cc
index f757300020..7d57e102c4 100644
--- a/graphics/asymptote/prc/PRCTools/makePRC.cc
+++ b/graphics/asymptote/prc/PRCTools/makePRC.cc
@@ -18,12 +18,12 @@
*
*************/
-#include <iostream>
-#include <iomanip>
+#include "../include/prc/oPRCFile.h"
+#include <cstdlib>
#include <fstream>
+#include <iomanip>
+#include <iostream>
#include <unistd.h>
-#include <cstdlib>
-#include "../oPRCFile.h"
using namespace std;
diff --git a/graphics/asymptote/prc/PRCbitStream.cc b/graphics/asymptote/prc/PRCbitStream.cc
index 9b18186a46..15f5ca6cff 100644
--- a/graphics/asymptote/prc/PRCbitStream.cc
+++ b/graphics/asymptote/prc/PRCbitStream.cc
@@ -19,13 +19,13 @@
*
*************/
+#include "prc/PRCbitStream.h"
+#include "prc/PRCdouble.h"
+#include <cassert>
#include <iostream>
-#include <zlib.h>
#include <stdlib.h>
#include <string.h>
-#include <cassert>
-#include "PRCbitStream.h"
-#include "PRCdouble.h"
+#include <zlib.h>
using std::string;
using std::cerr;
diff --git a/graphics/asymptote/prc/PRCdouble.cc b/graphics/asymptote/prc/PRCdouble.cc
index 69d4b02f16..aaf5a8d58d 100644
--- a/graphics/asymptote/prc/PRCdouble.cc
+++ b/graphics/asymptote/prc/PRCdouble.cc
@@ -1,4 +1,4 @@
-#include "PRCdouble.h"
+#include "prc/PRCdouble.h"
// from Adobe's documentation
diff --git a/graphics/asymptote/prc/PRC.h b/graphics/asymptote/prc/include/prc/PRC.h
index 9ce6ea70e0..acb0a44ec6 100644
--- a/graphics/asymptote/prc/PRC.h
+++ b/graphics/asymptote/prc/include/prc/PRC.h
@@ -1,6 +1,8 @@
#ifndef __PRC_H
#define __PRC_H
+#include "PRCuniversalendianness.h"
+
#ifdef _MSC_VER
#if _MSC_VER >= 1600
#include <stdint.h>
@@ -25,8 +27,8 @@ const uint32_t PRCVersion=8137; // For Adobe Reader 9 or later
#define PRC_TYPE_ROOT 0 // This type does not correspond to any entity
-#define PRC_TYPE_ROOT_PRCBase ( PRC_TYPE_ROOT + 1 ) // Abstract root type for any PRC entity.
-#define PRC_TYPE_ROOT_PRCBaseWithGraphics ( PRC_TYPE_ROOT + 2 ) // Abstract root type for any PRC entity which can bear graphics.
+#define PRC_TYPE_ROOT_PRCBase ( PRC_TYPE_ROOT + 1 ) // Abstract root type for any PRC entity.
+#define PRC_TYPE_ROOT_PRCBaseWithGraphics ( PRC_TYPE_ROOT + 2 ) // Abstract root type for any PRC entity which can bear graphics.
#define PRC_TYPE_CRV ( PRC_TYPE_ROOT + 10 ) // Types for PRC geometrical curves
#define PRC_TYPE_SURF ( PRC_TYPE_ROOT + 75 ) // Types for PRC geometrical surfaces
@@ -39,44 +41,44 @@ const uint32_t PRCVersion=8137; // For Adobe Reader 9 or later
#define PRC_TYPE_GRAPH ( PRC_TYPE_ROOT + 700 ) // Types for PRC graphics
#define PRC_TYPE_MATH ( PRC_TYPE_ROOT + 900 ) // Types for PRC mathematical operators
-#define PRC_TYPE_CRV_Base ( PRC_TYPE_CRV + 1 ) // Abstract type for all geometric curves.
-#define PRC_TYPE_CRV_Blend02Boundary ( PRC_TYPE_CRV + 2 ) // Boundary Curve.
-#define PRC_TYPE_CRV_NURBS ( PRC_TYPE_CRV + 3 ) // Non Uniform BSpline curve.
-#define PRC_TYPE_CRV_Circle ( PRC_TYPE_CRV + 4 ) // Circle.
-#define PRC_TYPE_CRV_Composite ( PRC_TYPE_CRV + 5 ) // Array of oriented curves.
-#define PRC_TYPE_CRV_OnSurf ( PRC_TYPE_CRV + 6 ) // Curve defined by a UV curve on a surface.
-#define PRC_TYPE_CRV_Ellipse ( PRC_TYPE_CRV + 7 ) // Ellipse.
-#define PRC_TYPE_CRV_Equation ( PRC_TYPE_CRV + 8 ) // curve described by specific law elements
-#define PRC_TYPE_CRV_Helix ( PRC_TYPE_CRV + 9 ) // Helix curve.
-#define PRC_TYPE_CRV_Hyperbola ( PRC_TYPE_CRV + 10 ) // Hyperbola.
-#define PRC_TYPE_CRV_Intersection ( PRC_TYPE_CRV + 11 ) // Intersection between 2 surfaces.
-#define PRC_TYPE_CRV_Line ( PRC_TYPE_CRV + 12 ) // Line.
-#define PRC_TYPE_CRV_Offset ( PRC_TYPE_CRV + 13 ) // Offset curve.
-#define PRC_TYPE_CRV_Parabola ( PRC_TYPE_CRV + 14 ) // Parabola.
-#define PRC_TYPE_CRV_PolyLine ( PRC_TYPE_CRV + 15 ) // Polyedric curve.
-#define PRC_TYPE_CRV_Transform ( PRC_TYPE_CRV + 16 ) // Transformed curve.
-
-#define PRC_TYPE_SURF_Base ( PRC_TYPE_SURF + 1 ) // Abstract type for all geometric surfaces.
-#define PRC_TYPE_SURF_Blend01 ( PRC_TYPE_SURF + 2 ) // Blend surface.
-#define PRC_TYPE_SURF_Blend02 ( PRC_TYPE_SURF + 3 ) // Blend Surface.
-#define PRC_TYPE_SURF_Blend03 ( PRC_TYPE_SURF + 4 ) // Blend Surface.
-#define PRC_TYPE_SURF_NURBS ( PRC_TYPE_SURF + 5 ) // Non Uniform BSpline surface.
-#define PRC_TYPE_SURF_Cone ( PRC_TYPE_SURF + 6 ) // Cone.
-#define PRC_TYPE_SURF_Cylinder ( PRC_TYPE_SURF + 7 ) // Cylinder.
-#define PRC_TYPE_SURF_Cylindrical ( PRC_TYPE_SURF + 8 ) // Surface who is defined in cylindrical space.
-#define PRC_TYPE_SURF_Offset ( PRC_TYPE_SURF + 9 ) // Offset surface.
-#define PRC_TYPE_SURF_Pipe ( PRC_TYPE_SURF + 10 ) // Pipe.
-#define PRC_TYPE_SURF_Plane ( PRC_TYPE_SURF + 11 ) // Plane.
-#define PRC_TYPE_SURF_Ruled ( PRC_TYPE_SURF + 12 ) // Ruled surface.
-#define PRC_TYPE_SURF_Sphere ( PRC_TYPE_SURF + 13 ) // Sphere.
-#define PRC_TYPE_SURF_Revolution ( PRC_TYPE_SURF + 14 ) // Surface of revolution.
-#define PRC_TYPE_SURF_Extrusion ( PRC_TYPE_SURF + 15 ) // Surface of extrusion.
-#define PRC_TYPE_SURF_FromCurves ( PRC_TYPE_SURF + 16 ) // Surface from two curves.
-#define PRC_TYPE_SURF_Torus ( PRC_TYPE_SURF + 17 ) // Torus.
-#define PRC_TYPE_SURF_Transform ( PRC_TYPE_SURF + 18 ) // Transformed surface.
-#define PRC_TYPE_SURF_Blend04 ( PRC_TYPE_SURF + 19 ) // defined for future use.
-
-#define PRC_TYPE_TOPO_Context ( PRC_TYPE_TOPO + 1 ) // Self-containing set of topological entities.
+#define PRC_TYPE_CRV_Base ( PRC_TYPE_CRV + 1 ) // Abstract type for all geometric curves.
+#define PRC_TYPE_CRV_Blend02Boundary ( PRC_TYPE_CRV + 2 ) // Boundary Curve.
+#define PRC_TYPE_CRV_NURBS ( PRC_TYPE_CRV + 3 ) // Non Uniform BSpline curve.
+#define PRC_TYPE_CRV_Circle ( PRC_TYPE_CRV + 4 ) // Circle.
+#define PRC_TYPE_CRV_Composite ( PRC_TYPE_CRV + 5 ) // Array of oriented curves.
+#define PRC_TYPE_CRV_OnSurf ( PRC_TYPE_CRV + 6 ) // Curve defined by a UV curve on a surface.
+#define PRC_TYPE_CRV_Ellipse ( PRC_TYPE_CRV + 7 ) // Ellipse.
+#define PRC_TYPE_CRV_Equation ( PRC_TYPE_CRV + 8 ) // curve described by specific law elements
+#define PRC_TYPE_CRV_Helix ( PRC_TYPE_CRV + 9 ) // Helix curve.
+#define PRC_TYPE_CRV_Hyperbola ( PRC_TYPE_CRV + 10 ) // Hyperbola.
+#define PRC_TYPE_CRV_Intersection ( PRC_TYPE_CRV + 11 ) // Intersection between 2 surfaces.
+#define PRC_TYPE_CRV_Line ( PRC_TYPE_CRV + 12 ) // Line.
+#define PRC_TYPE_CRV_Offset ( PRC_TYPE_CRV + 13 ) // Offset curve.
+#define PRC_TYPE_CRV_Parabola ( PRC_TYPE_CRV + 14 ) // Parabola.
+#define PRC_TYPE_CRV_PolyLine ( PRC_TYPE_CRV + 15 ) // Polyedric curve.
+#define PRC_TYPE_CRV_Transform ( PRC_TYPE_CRV + 16 ) // Transformed curve.
+
+#define PRC_TYPE_SURF_Base ( PRC_TYPE_SURF + 1 ) // Abstract type for all geometric surfaces.
+#define PRC_TYPE_SURF_Blend01 ( PRC_TYPE_SURF + 2 ) // Blend surface.
+#define PRC_TYPE_SURF_Blend02 ( PRC_TYPE_SURF + 3 ) // Blend Surface.
+#define PRC_TYPE_SURF_Blend03 ( PRC_TYPE_SURF + 4 ) // Blend Surface.
+#define PRC_TYPE_SURF_NURBS ( PRC_TYPE_SURF + 5 ) // Non Uniform BSpline surface.
+#define PRC_TYPE_SURF_Cone ( PRC_TYPE_SURF + 6 ) // Cone.
+#define PRC_TYPE_SURF_Cylinder ( PRC_TYPE_SURF + 7 ) // Cylinder.
+#define PRC_TYPE_SURF_Cylindrical ( PRC_TYPE_SURF + 8 ) // Surface who is defined in cylindrical space.
+#define PRC_TYPE_SURF_Offset ( PRC_TYPE_SURF + 9 ) // Offset surface.
+#define PRC_TYPE_SURF_Pipe ( PRC_TYPE_SURF + 10 ) // Pipe.
+#define PRC_TYPE_SURF_Plane ( PRC_TYPE_SURF + 11 ) // Plane.
+#define PRC_TYPE_SURF_Ruled ( PRC_TYPE_SURF + 12 ) // Ruled surface.
+#define PRC_TYPE_SURF_Sphere ( PRC_TYPE_SURF + 13 ) // Sphere.
+#define PRC_TYPE_SURF_Revolution ( PRC_TYPE_SURF + 14 ) // Surface of revolution.
+#define PRC_TYPE_SURF_Extrusion ( PRC_TYPE_SURF + 15 ) // Surface of extrusion.
+#define PRC_TYPE_SURF_FromCurves ( PRC_TYPE_SURF + 16 ) // Surface from two curves.
+#define PRC_TYPE_SURF_Torus ( PRC_TYPE_SURF + 17 ) // Torus.
+#define PRC_TYPE_SURF_Transform ( PRC_TYPE_SURF + 18 ) // Transformed surface.
+#define PRC_TYPE_SURF_Blend04 ( PRC_TYPE_SURF + 19 ) // defined for future use.
+
+#define PRC_TYPE_TOPO_Context ( PRC_TYPE_TOPO + 1 ) // Self-containing set of topological entities.
#define PRC_TYPE_TOPO_Item ( PRC_TYPE_TOPO + 2 ) // Abstract root type for any topological entity (body or single item).
#define PRC_TYPE_TOPO_MultipleVertex ( PRC_TYPE_TOPO + 3 ) // Vertex whose position is the average of all edges' extremity positions to whom it belongs.
#define PRC_TYPE_TOPO_UniqueVertex ( PRC_TYPE_TOPO + 4 ) // Vertex with one set of coordinates (absolute position).
@@ -86,86 +88,86 @@ const uint32_t PRCVersion=8137; // For Adobe Reader 9 or later
#define PRC_TYPE_TOPO_Loop ( PRC_TYPE_TOPO + 8 ) // Array of co edges which delimits a face.
#define PRC_TYPE_TOPO_Face ( PRC_TYPE_TOPO + 9 ) // Topological face delimiting a shell.
#define PRC_TYPE_TOPO_Shell ( PRC_TYPE_TOPO + 10 ) // Topological shell (open or closed).
-#define PRC_TYPE_TOPO_Connex ( PRC_TYPE_TOPO + 11 ) // Topological region delimited by one or several shells.
+#define PRC_TYPE_TOPO_Connex ( PRC_TYPE_TOPO + 11 ) // Topological region delimited by one or several shells.
#define PRC_TYPE_TOPO_Body ( PRC_TYPE_TOPO + 12 ) // Abstract root type for any topological body.
#define PRC_TYPE_TOPO_SingleWireBody ( PRC_TYPE_TOPO + 13 ) // Single wire body.
#define PRC_TYPE_TOPO_BrepData ( PRC_TYPE_TOPO + 14 ) // Main entry to solid and surface topology (regular form).
#define PRC_TYPE_TOPO_SingleWireBodyCompress ( PRC_TYPE_TOPO + 15 ) // Single wire body. (ultra compressed form).
#define PRC_TYPE_TOPO_BrepDataCompress ( PRC_TYPE_TOPO + 16 ) // Main entry to solid and surface topology (ultra compressed form).
-#define PRC_TYPE_TOPO_WireBody ( PRC_TYPE_TOPO + 17 ) // This type is the main entry to wire topology.
-
-#define PRC_TYPE_TESS_Base ( PRC_TYPE_TESS + 1 ) // Abstract root type for any tessellated entity.
-#define PRC_TYPE_TESS_3D ( PRC_TYPE_TESS + 2 ) // Tessellated faceted data; regular form.
-#define PRC_TYPE_TESS_3D_Compressed ( PRC_TYPE_TESS + 3 ) // Tessellated faceted data; highly compressed form.
-#define PRC_TYPE_TESS_Face ( PRC_TYPE_TESS + 4 ) // Tessellated face.
-#define PRC_TYPE_TESS_3D_Wire ( PRC_TYPE_TESS + 5 ) // Tessellated wireframe.
-#define PRC_TYPE_TESS_Markup ( PRC_TYPE_TESS + 6 ) // Tessellated markup.
-
-#define PRC_TYPE_MISC_Attribute ( PRC_TYPE_MISC + 1 ) // Entity attribute.
-#define PRC_TYPE_MISC_CartesianTransformation ( PRC_TYPE_MISC + 2 ) // Cartesian transformation.
-#define PRC_TYPE_MISC_EntityReference ( PRC_TYPE_MISC + 3 ) // Entity reference.
-#define PRC_TYPE_MISC_MarkupLinkedItem ( PRC_TYPE_MISC + 4 ) // Link between a markup and an entity.
-#define PRC_TYPE_MISC_ReferenceOnPRCBase ( PRC_TYPE_MISC + 5 ) // Reference pointing on a regular entity (not topological).
-#define PRC_TYPE_MISC_ReferenceOnTopology ( PRC_TYPE_MISC + 6 ) // Reference pointing on a topological entity.
+#define PRC_TYPE_TOPO_WireBody ( PRC_TYPE_TOPO + 17 ) // This type is the main entry to wire topology.
+
+#define PRC_TYPE_TESS_Base ( PRC_TYPE_TESS + 1 ) // Abstract root type for any tessellated entity.
+#define PRC_TYPE_TESS_3D ( PRC_TYPE_TESS + 2 ) // Tessellated faceted data; regular form.
+#define PRC_TYPE_TESS_3D_Compressed ( PRC_TYPE_TESS + 3 ) // Tessellated faceted data; highly compressed form.
+#define PRC_TYPE_TESS_Face ( PRC_TYPE_TESS + 4 ) // Tessellated face.
+#define PRC_TYPE_TESS_3D_Wire ( PRC_TYPE_TESS + 5 ) // Tessellated wireframe.
+#define PRC_TYPE_TESS_Markup ( PRC_TYPE_TESS + 6 ) // Tessellated markup.
+
+#define PRC_TYPE_MISC_Attribute ( PRC_TYPE_MISC + 1 ) // Entity attribute.
+#define PRC_TYPE_MISC_CartesianTransformation ( PRC_TYPE_MISC + 2 ) // Cartesian transformation.
+#define PRC_TYPE_MISC_EntityReference ( PRC_TYPE_MISC + 3 ) // Entity reference.
+#define PRC_TYPE_MISC_MarkupLinkedItem ( PRC_TYPE_MISC + 4 ) // Link between a markup and an entity.
+#define PRC_TYPE_MISC_ReferenceOnPRCBase ( PRC_TYPE_MISC + 5 ) // Reference pointing on a regular entity (not topological).
+#define PRC_TYPE_MISC_ReferenceOnTopology ( PRC_TYPE_MISC + 6 ) // Reference pointing on a topological entity.
#define PRC_TYPE_MISC_GeneralTransformation ( PRC_TYPE_MISC + 7 ) // General transformation.
-#define PRC_TYPE_RI_RepresentationItem ( PRC_TYPE_RI + 1 ) // Basic abstract type for representation items.
-#define PRC_TYPE_RI_BrepModel ( PRC_TYPE_RI + 2 ) // Basic type for surfaces and solids.
-#define PRC_TYPE_RI_Curve ( PRC_TYPE_RI + 3 ) // Basic type for curves.
-#define PRC_TYPE_RI_Direction ( PRC_TYPE_RI + 4 ) // Optional point + vector.
-#define PRC_TYPE_RI_Plane ( PRC_TYPE_RI + 5 ) // Construction plane, as opposed to planar surface.
-#define PRC_TYPE_RI_PointSet ( PRC_TYPE_RI + 6 ) // Set of points.
-#define PRC_TYPE_RI_PolyBrepModel ( PRC_TYPE_RI + 7 ) // Basic type to polyhedral surfaces and solids.
-#define PRC_TYPE_RI_PolyWire ( PRC_TYPE_RI + 8 ) // Polyedric wireframe entity.
-#define PRC_TYPE_RI_Set ( PRC_TYPE_RI + 9 ) // Logical grouping of arbitrary number of representation items.
-#define PRC_TYPE_RI_CoordinateSystem ( PRC_TYPE_RI + 10 ) // Coordinate system.
-
-#define PRC_TYPE_ASM_ModelFile ( PRC_TYPE_ASM + 1 ) // Basic entry type for PRC.
-#define PRC_TYPE_ASM_FileStructure ( PRC_TYPE_ASM + 2 ) // Basic structure for PRC files.
-#define PRC_TYPE_ASM_FileStructureGlobals ( PRC_TYPE_ASM + 3 ) // Basic structure for PRC files : globals.
-#define PRC_TYPE_ASM_FileStructureTree ( PRC_TYPE_ASM + 4 ) // Basic structure for PRC files : tree.
-#define PRC_TYPE_ASM_FileStructureTessellation ( PRC_TYPE_ASM + 5 ) // Basic structure for PRC files : tessellation.
-#define PRC_TYPE_ASM_FileStructureGeometry ( PRC_TYPE_ASM + 6 ) // Basic structure for PRC files : geometry.
+#define PRC_TYPE_RI_RepresentationItem ( PRC_TYPE_RI + 1 ) // Basic abstract type for representation items.
+#define PRC_TYPE_RI_BrepModel ( PRC_TYPE_RI + 2 ) // Basic type for surfaces and solids.
+#define PRC_TYPE_RI_Curve ( PRC_TYPE_RI + 3 ) // Basic type for curves.
+#define PRC_TYPE_RI_Direction ( PRC_TYPE_RI + 4 ) // Optional point + vector.
+#define PRC_TYPE_RI_Plane ( PRC_TYPE_RI + 5 ) // Construction plane, as opposed to planar surface.
+#define PRC_TYPE_RI_PointSet ( PRC_TYPE_RI + 6 ) // Set of points.
+#define PRC_TYPE_RI_PolyBrepModel ( PRC_TYPE_RI + 7 ) // Basic type to polyhedral surfaces and solids.
+#define PRC_TYPE_RI_PolyWire ( PRC_TYPE_RI + 8 ) // Polyedric wireframe entity.
+#define PRC_TYPE_RI_Set ( PRC_TYPE_RI + 9 ) // Logical grouping of arbitrary number of representation items.
+#define PRC_TYPE_RI_CoordinateSystem ( PRC_TYPE_RI + 10 ) // Coordinate system.
+
+#define PRC_TYPE_ASM_ModelFile ( PRC_TYPE_ASM + 1 ) // Basic entry type for PRC.
+#define PRC_TYPE_ASM_FileStructure ( PRC_TYPE_ASM + 2 ) // Basic structure for PRC files.
+#define PRC_TYPE_ASM_FileStructureGlobals ( PRC_TYPE_ASM + 3 ) // Basic structure for PRC files : globals.
+#define PRC_TYPE_ASM_FileStructureTree ( PRC_TYPE_ASM + 4 ) // Basic structure for PRC files : tree.
+#define PRC_TYPE_ASM_FileStructureTessellation ( PRC_TYPE_ASM + 5 ) // Basic structure for PRC files : tessellation.
+#define PRC_TYPE_ASM_FileStructureGeometry ( PRC_TYPE_ASM + 6 ) // Basic structure for PRC files : geometry.
#define PRC_TYPE_ASM_FileStructureExtraGeometry ( PRC_TYPE_ASM + 7 ) // Basic structure for PRC files : extra geometry data.
-#define PRC_TYPE_ASM_ProductOccurence ( PRC_TYPE_ASM + 10 ) // Basic contruct for assemblies.
-#define PRC_TYPE_ASM_PartDefinition ( PRC_TYPE_ASM + 11 ) // Basic construct for parts.
+#define PRC_TYPE_ASM_ProductOccurence ( PRC_TYPE_ASM + 10 ) // Basic contruct for assemblies.
+#define PRC_TYPE_ASM_PartDefinition ( PRC_TYPE_ASM + 11 ) // Basic construct for parts.
#define PRC_TYPE_ASM_Filter ( PRC_TYPE_ASM + 20 )
-#define PRC_TYPE_MKP_View ( PRC_TYPE_MKP + 1 ) // Grouping of markup by views.
-#define PRC_TYPE_MKP_Markup ( PRC_TYPE_MKP + 2 ) // Basic type for simple markups.
-#define PRC_TYPE_MKP_Leader ( PRC_TYPE_MKP + 3 ) // basic type for markup leader
+#define PRC_TYPE_MKP_View ( PRC_TYPE_MKP + 1 ) // Grouping of markup by views.
+#define PRC_TYPE_MKP_Markup ( PRC_TYPE_MKP + 2 ) // Basic type for simple markups.
+#define PRC_TYPE_MKP_Leader ( PRC_TYPE_MKP + 3 ) // basic type for markup leader
#define PRC_TYPE_MKP_AnnotationItem ( PRC_TYPE_MKP + 4 ) // Usage of a markup.
#define PRC_TYPE_MKP_AnnotationSet ( PRC_TYPE_MKP + 5 ) // Group of annotations.
#define PRC_TYPE_MKP_AnnotationReference ( PRC_TYPE_MKP + 6 ) // Logical grouping of annotations for reference.
-#define PRC_TYPE_GRAPH_Style ( PRC_TYPE_GRAPH + 1 ) // Display style.
-#define PRC_TYPE_GRAPH_Material ( PRC_TYPE_GRAPH + 2 ) // Display material properties.
-#define PRC_TYPE_GRAPH_Picture ( PRC_TYPE_GRAPH + 3 ) // Picture.
-#define PRC_TYPE_GRAPH_TextureApplication ( PRC_TYPE_GRAPH + 11 ) // Texture application.
-#define PRC_TYPE_GRAPH_TextureDefinition ( PRC_TYPE_GRAPH + 12 ) // Texture definition.
-#define PRC_TYPE_GRAPH_TextureTransformation ( PRC_TYPE_GRAPH + 13 ) // Texture transformation.
-#define PRC_TYPE_GRAPH_LinePattern ( PRC_TYPE_GRAPH + 21 ) // One dimensional display style.
-#define PRC_TYPE_GRAPH_FillPattern ( PRC_TYPE_GRAPH + 22 ) // Abstract class for two-dimensional display style.
-#define PRC_TYPE_GRAPH_DottingPattern ( PRC_TYPE_GRAPH + 23 ) // Two-dimensional filling with dots.
-#define PRC_TYPE_GRAPH_HatchingPattern ( PRC_TYPE_GRAPH + 24 ) // Two-dimensional filling with hatches.
-#define PRC_TYPE_GRAPH_SolidPattern ( PRC_TYPE_GRAPH + 25 ) // Two-dimensional filling with particular style (color, material, texture).
-#define PRC_TYPE_GRAPH_VPicturePattern ( PRC_TYPE_GRAPH + 26 ) // Two-dimensional filling with vectorised picture.
-#define PRC_TYPE_GRAPH_AmbientLight ( PRC_TYPE_GRAPH + 31 ) // Scene ambient illumination.
-#define PRC_TYPE_GRAPH_PointLight ( PRC_TYPE_GRAPH + 32 ) // Scene point illumination.
-#define PRC_TYPE_GRAPH_DirectionalLight ( PRC_TYPE_GRAPH + 33 ) // Scene directional illumination.
-#define PRC_TYPE_GRAPH_SpotLight ( PRC_TYPE_GRAPH + 34 ) // Scene spot illumination.
-#define PRC_TYPE_GRAPH_SceneDisplayParameters ( PRC_TYPE_GRAPH + 41 ) // Parameters for scene visualisation.
-#define PRC_TYPE_GRAPH_Camera ( PRC_TYPE_GRAPH + 42 ) //
-
-#define PRC_TYPE_MATH_FCT_1D ( PRC_TYPE_MATH + 1 ) // Basic type for one degree equation object.
-#define PRC_TYPE_MATH_FCT_1D_Polynom ( PRC_TYPE_MATH_FCT_1D + 1 ) // Polynomial equation.
-#define PRC_TYPE_MATH_FCT_1D_Trigonometric ( PRC_TYPE_MATH_FCT_1D + 2 ) // Cosinus based equation.
-#define PRC_TYPE_MATH_FCT_1D_Fraction ( PRC_TYPE_MATH_FCT_1D + 3 ) // Fraction between 2 one degree equation object.
-#define PRC_TYPE_MATH_FCT_1D_ArctanCos ( PRC_TYPE_MATH_FCT_1D + 4 ) // Specific equation.
-#define PRC_TYPE_MATH_FCT_1D_Combination ( PRC_TYPE_MATH_FCT_1D + 5 ) // Combination of one degree equation object.
-#define PRC_TYPE_MATH_FCT_3D ( PRC_TYPE_MATH + 10 ) // Basic type for 3rd degree equation object.
-#define PRC_TYPE_MATH_FCT_3D_Linear ( PRC_TYPE_MATH_FCT_3D + 1 ) // Linear transformation ( with a matrix ).
-#define PRC_TYPE_MATH_FCT_3D_NonLinear ( PRC_TYPE_MATH_FCT_3D + 2 ) // Specific transformation.
+#define PRC_TYPE_GRAPH_Style ( PRC_TYPE_GRAPH + 1 ) // Display style.
+#define PRC_TYPE_GRAPH_Material ( PRC_TYPE_GRAPH + 2 ) // Display material properties.
+#define PRC_TYPE_GRAPH_Picture ( PRC_TYPE_GRAPH + 3 ) // Picture.
+#define PRC_TYPE_GRAPH_TextureApplication ( PRC_TYPE_GRAPH + 11 ) // Texture application.
+#define PRC_TYPE_GRAPH_TextureDefinition ( PRC_TYPE_GRAPH + 12 ) // Texture definition.
+#define PRC_TYPE_GRAPH_TextureTransformation ( PRC_TYPE_GRAPH + 13 ) // Texture transformation.
+#define PRC_TYPE_GRAPH_LinePattern ( PRC_TYPE_GRAPH + 21 ) // One dimensional display style.
+#define PRC_TYPE_GRAPH_FillPattern ( PRC_TYPE_GRAPH + 22 ) // Abstract class for two-dimensional display style.
+#define PRC_TYPE_GRAPH_DottingPattern ( PRC_TYPE_GRAPH + 23 ) // Two-dimensional filling with dots.
+#define PRC_TYPE_GRAPH_HatchingPattern ( PRC_TYPE_GRAPH + 24 ) // Two-dimensional filling with hatches.
+#define PRC_TYPE_GRAPH_SolidPattern ( PRC_TYPE_GRAPH + 25 ) // Two-dimensional filling with particular style (color, material, texture).
+#define PRC_TYPE_GRAPH_VPicturePattern ( PRC_TYPE_GRAPH + 26 ) // Two-dimensional filling with vectorised picture.
+#define PRC_TYPE_GRAPH_AmbientLight ( PRC_TYPE_GRAPH + 31 ) // Scene ambient illumination.
+#define PRC_TYPE_GRAPH_PointLight ( PRC_TYPE_GRAPH + 32 ) // Scene point illumination.
+#define PRC_TYPE_GRAPH_DirectionalLight ( PRC_TYPE_GRAPH + 33 ) // Scene directional illumination.
+#define PRC_TYPE_GRAPH_SpotLight ( PRC_TYPE_GRAPH + 34 ) // Scene spot illumination.
+#define PRC_TYPE_GRAPH_SceneDisplayParameters ( PRC_TYPE_GRAPH + 41 ) // Parameters for scene visualisation.
+#define PRC_TYPE_GRAPH_Camera ( PRC_TYPE_GRAPH + 42 ) //
+
+#define PRC_TYPE_MATH_FCT_1D ( PRC_TYPE_MATH + 1 ) // Basic type for one degree equation object.
+#define PRC_TYPE_MATH_FCT_1D_Polynom ( PRC_TYPE_MATH_FCT_1D + 1 ) // Polynomial equation.
+#define PRC_TYPE_MATH_FCT_1D_Trigonometric ( PRC_TYPE_MATH_FCT_1D + 2 ) // Cosinus based equation.
+#define PRC_TYPE_MATH_FCT_1D_Fraction ( PRC_TYPE_MATH_FCT_1D + 3 ) // Fraction between 2 one degree equation object.
+#define PRC_TYPE_MATH_FCT_1D_ArctanCos ( PRC_TYPE_MATH_FCT_1D + 4 ) // Specific equation.
+#define PRC_TYPE_MATH_FCT_1D_Combination ( PRC_TYPE_MATH_FCT_1D + 5 ) // Combination of one degree equation object.
+#define PRC_TYPE_MATH_FCT_3D ( PRC_TYPE_MATH + 10 ) // Basic type for 3rd degree equation object.
+#define PRC_TYPE_MATH_FCT_3D_Linear ( PRC_TYPE_MATH_FCT_3D + 1 ) // Linear transformation ( with a matrix ).
+#define PRC_TYPE_MATH_FCT_3D_NonLinear ( PRC_TYPE_MATH_FCT_3D + 2 ) // Specific transformation.
#define PRC_PRODUCT_FLAG_DEFAULT 0x0001
#define PRC_PRODUCT_FLAG_INTERNAL 0x0002
@@ -253,7 +255,7 @@ enum EPRCProductLoadStatus {
KEPRCProductLoadStatus_Loaded
};
-enum EPRCExtendType {
+enum EPRCExtendType {
KEPRCExtendTypeNone = 0, // Discontinuous position.
KEPRCExtendTypeExt1 = 2, // Same as EPRCExtendTypeCInfinity.
KEPRCExtendTypeExt2 = 4, // Same as EPRCExtendTypeG1R for surface, and EPRCExtendTypeG1 for curve.
@@ -386,7 +388,7 @@ enum EPRCMarkupType {
KEPRCMarkupType_Roughness,
KEPRCMarkupType_Welding,
KEPRCMarkupType_Table,
- KEPRCMarkupType_Other
+ KEPRCMarkupType_Other
};
enum EPRCMarkupSubType {
@@ -394,7 +396,7 @@ enum EPRCMarkupSubType {
KEPRCMarkupSubType_EnumMax,
KEPRCMarkupSubType_Datum_Ident = 1 ,
- KEPRCMarkupSubType_Datum_EnumMax,
+ KEPRCMarkupSubType_Datum_EnumMax,
KEPRCMarkupSubType_Dimension_Distance = 1,
KEPRCMarkupSubType_Dimension_Radius_Tangent,
@@ -403,7 +405,7 @@ enum EPRCMarkupSubType {
KEPRCMarkupSubType_Dimension_Diameter,
KEPRCMarkupSubType_Dimension_Diameter_Tangent,
KEPRCMarkupSubType_Dimension_Diameter_Cylinder,
- KEPRCMarkupSubType_Dimension_Diameter_Edge,
+ KEPRCMarkupSubType_Dimension_Diameter_Edge,
KEPRCMarkupSubType_Dimension_Diameter_Cone,
KEPRCMarkupSubType_Dimension_Length,
KEPRCMarkupSubType_Dimension_Length_Curvilinear,
@@ -418,7 +420,7 @@ enum EPRCMarkupSubType {
KEPRCMarkupSubType_Welding_EnumMax,
KEPRCMarkupSubType_Other_Symbol_User = 1,
- KEPRCMarkupSubType_Other_EnumMax
+ KEPRCMarkupSubType_Other_EnumMax
};
#define PRC_MARKUP_IsHidden 0x01 // The tessellation is hidden.
@@ -501,12 +503,12 @@ enum EPRCCharSet
#define PRC_Font_Wired 0x80 /*!< Wired. Indicates that the original font is a wirefame font. */
#define PRC_Font_FixedWidth 0x100 /*!< Fixed width. Indicates that the original font is not proportional (each glyph has the same width). */
-#define PRC_CONTEXT_OuterLoopFirst 0x0001 // Outer loops are always first loops (specific to PRC_TYPE_TOPO_BrepData).
-#define PRC_CONTEXT_NoClamp 0x0002 // UV curves are clamped on the surface (specific to PRC_TYPE_TOPO_BrepData).
-#define PRC_CONTEXT_NoSplit 0x0004 // Faces are split (specific to PRC_TYPE_TOPO_BrepData).
+#define PRC_CONTEXT_OuterLoopFirst 0x0001 // Outer loops are always first loops (specific to PRC_TYPE_TOPO_BrepData).
+#define PRC_CONTEXT_NoClamp 0x0002 // UV curves are clamped on the surface (specific to PRC_TYPE_TOPO_BrepData).
+#define PRC_CONTEXT_NoSplit 0x0004 // Faces are split (specific to PRC_TYPE_TOPO_BrepData).
-#define PRC_BODY_BBOX_Evaluation 0x0001 // Bounding box based on geometry.
-#define PRC_BODY_BBOX_Precise 0x0002 // Bounding box based on tessellation.
-#define PRC_BODY_BBOX_CADData 0x0003 // Bounding box given by a CAD data file.
+#define PRC_BODY_BBOX_Evaluation 0x0001 // Bounding box based on geometry.
+#define PRC_BODY_BBOX_Precise 0x0002 // Bounding box based on tessellation.
+#define PRC_BODY_BBOX_CADData 0x0003 // Bounding box given by a CAD data file.
#endif // __PRC_H
diff --git a/graphics/asymptote/prc/PRCbitStream.h b/graphics/asymptote/prc/include/prc/PRCbitStream.h
index 5f189e428b..012234983c 100644
--- a/graphics/asymptote/prc/PRCbitStream.h
+++ b/graphics/asymptote/prc/include/prc/PRCbitStream.h
@@ -22,6 +22,8 @@
#ifndef __PRC_BIT_STREAM_H
#define __PRC_BIT_STREAM_H
+#include "PRCuniversalendianness.h"
+
#ifdef _MSC_VER
#include <stdio.h>
#if _MSC_VER >= 1600
diff --git a/graphics/asymptote/prc/PRCdouble.h b/graphics/asymptote/prc/include/prc/PRCdouble.h
index 4a3a79dccc..ed96715974 100644
--- a/graphics/asymptote/prc/PRCdouble.h
+++ b/graphics/asymptote/prc/include/prc/PRCdouble.h
@@ -9,16 +9,7 @@
#include "config.h"
#endif
-#ifdef BYTE_ORDER
-# undef WORDS_BIG_ENDIAN
-# undef WORDS_LITTLE_ENDIAN
-# if BYTE_ORDER == BIG_ENDIAN
-# define WORDS_BIG_ENDIAN 1
-# endif
-# if BYTE_ORDER == LITTLE_ENDIAN
-# define WORDS_LITTLE_ENDIAN 1
-# endif
-#endif
+#include "PRCuniversalendianness.h"
// from Adobe's documentation
@@ -118,7 +109,7 @@ extern PRCdword stadwZero[2],stadwNegativeZero[2];
#define NUMBEROFELEMENTINACOFDOE (2077)
#ifdef WORDS_BIGENDIAN
-# define DOUBLEWITHTWODWORDINTREE(upper,lower) {upper,lower}
+# define DOUBLEWITHTWODWORDINTREE(upper,lower) {upper,lower}
#else
# define DOUBLEWITHTWODWORDINTREE(upper,lower) {lower,upper}
#endif
diff --git a/graphics/asymptote/prc/include/prc/PRCuniversalendianness.h b/graphics/asymptote/prc/include/prc/PRCuniversalendianness.h
new file mode 100644
index 0000000000..18e0ece623
--- /dev/null
+++ b/graphics/asymptote/prc/include/prc/PRCuniversalendianness.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#if defined(UNIVERSAL_ENDIAN_BUILD)
+#if defined(__BIG_ENDIAN__)
+#define WORDS_BIGENDIAN 1
+#endif // defined(__BIG_ENDIAN__)
+#else // defined(UNIVERSAL_ENDIAN_BUILD)
+#ifndef WORDS_BIGENDIAN
+#undef WORDS_BIGENDIAN
+#endif // !defined(WORDS_BIGENDIAN)
+#endif // defined(UNIVERSAL_ENDIAN_BUILD)
diff --git a/graphics/asymptote/prc/oPRCFile.h b/graphics/asymptote/prc/include/prc/oPRCFile.h
index e5f7dc9d4f..64770b18cd 100644
--- a/graphics/asymptote/prc/oPRCFile.h
+++ b/graphics/asymptote/prc/include/prc/oPRCFile.h
@@ -36,9 +36,11 @@
#include "config.h"
#endif
+
#include "PRC.h"
#include "PRCbitStream.h"
#include "writePRC.h"
+#include "PRCuniversalendianness.h"
#ifdef HAVE_LIBTIRPC
diff --git a/graphics/asymptote/prc/writePRC.h b/graphics/asymptote/prc/include/prc/writePRC.h
index 7a9313e45c..f017a7d092 100644
--- a/graphics/asymptote/prc/writePRC.h
+++ b/graphics/asymptote/prc/include/prc/writePRC.h
@@ -26,11 +26,12 @@
#include <deque>
#include <list>
-#include <map>
-#include <iostream>
-#include "PRCbitStream.h"
+#include "PRCuniversalendianness.h"
#include "PRC.h"
+#include "PRCbitStream.h"
#include <float.h>
+#include <iostream>
+#include <map>
#include <math.h>
static const uint32_t m1=(uint32_t)-1;
@@ -164,7 +165,7 @@ class PRCSingleAttribute : public PRCAttributeEntry
PRCSingleAttribute(uint32_t time) : PRCAttributeEntry(), type(KEPRCModellerAttributeTypeTime)
{
value.time = time;
- }
+ }
PRCSingleAttribute(const std::string &text) : PRCAttributeEntry(), type(KEPRCModellerAttributeTypeString)
{
value_text = text;}
@@ -179,7 +180,7 @@ class PRCSingleAttribute : public PRCAttributeEntry
PRCSingleAttribute(uint32_t title, uint32_t time) : PRCAttributeEntry(title), type(KEPRCModellerAttributeTypeTime)
{
value.time = time;
- }
+ }
PRCSingleAttribute(uint32_t title, const std::string &text) : PRCAttributeEntry(title), type(KEPRCModellerAttributeTypeString)
{
value_text = text;
@@ -195,7 +196,7 @@ class PRCSingleAttribute : public PRCAttributeEntry
PRCSingleAttribute(const std::string title, uint32_t time) : PRCAttributeEntry(title), type(KEPRCModellerAttributeTypeTime)
{
value.time = time;
- }
+ }
PRCSingleAttribute(const std::string title, const std::string &text) : PRCAttributeEntry(title), type(KEPRCModellerAttributeTypeString)
{
value_text = text;
@@ -333,14 +334,14 @@ struct PRCVector2d
x(c?c[0]:fx), y(c?c[1]:fy) {}
PRCVector2d(const PRCVector2d& sVector2d) :
x(sVector2d.x), y(sVector2d.y) {}
-
+
void Set(double fx, double fy)
{ x = fx; y = fy; }
double Dot(const PRCVector2d & sPt) const
{ return(x*sPt.x)+(y*sPt.y); }
double LengthSquared()
{ return(x*x+y*y); }
-
+
friend PRCVector2d operator + (const PRCVector2d& a, const PRCVector2d& b)
{ return PRCVector2d(a.x+b.x,a.y+b.y); }
friend PRCVector2d operator - (const PRCVector2d& a)
@@ -353,10 +354,10 @@ struct PRCVector2d
{ return PRCVector2d(a.x*d,a.y*d); }
friend PRCVector2d operator / (const PRCVector2d& a, const double d)
{ return PRCVector2d(a.x/d,a.y/d); }
-
+
double Length();
bool Normalize();
-
+
bool operator==(const PRCVector2d &v) const
{
return x==v.x && y==v.y;
@@ -426,7 +427,7 @@ class PRCMaterialGeneric : public ContentPRCBase, public PRCMaterial
public:
PRCMaterialGeneric(std::string n="") :
ContentPRCBase(PRC_TYPE_GRAPH_Material,n),
- ambient(m1), diffuse(m1), emissive(m1), specular(m1),
+ ambient(m1), diffuse(m1), emissive(m1), specular(m1),
shininess(0.0),
ambient_alpha(1.0), diffuse_alpha(1.0), emissive_alpha(1.0), specular_alpha(1.0)
{}
@@ -503,7 +504,7 @@ class PRCTessFace
public:
PRCTessFace() :
start_wire(0), used_entities_flag(0),
- start_triangulated(0), number_of_texture_coordinate_indexes(0),
+ start_triangulated(0), number_of_texture_coordinate_indexes(0),
is_rgba(false), behaviour(PRC_GRAPHICS_Show)
{}
void serializeTessFace(PRCbitStream&);
@@ -742,7 +743,7 @@ public:
{
set(t);
}
-
+
void serializeGeneralTransformation3d(PRCbitStream&) const;
void serializeTransformation3d(PRCbitStream& pbs) const { serializeGeneralTransformation3d(pbs); }
double mat[4][4];
@@ -766,7 +767,7 @@ public:
}
void set(const double t[])
{
- if(t!=NULL)
+ if(t!=NULL)
for (size_t i=0;i<4;i++)
for (size_t j=0;j<4;j++)
mat[i][j]=t[4*i+j];
@@ -861,8 +862,8 @@ public:
~PRCCoordinateSystem() { delete axis_set; }
void serializeCoordinateSystem(PRCbitStream&);
void serializeRepresentationItem(PRCbitStream &pbs) { serializeCoordinateSystem(pbs); }
- void setAxisSet(PRCGeneralTransformation3d*& transform) { axis_set = transform; transform = NULL; }
- void setAxisSet(PRCCartesianTransformation3d*& transform) { axis_set = transform; transform = NULL; }
+ void setAxisSet(PRCGeneralTransformation3d*& transform) { axis_set = transform; transform = NULL; }
+ void setAxisSet(PRCCartesianTransformation3d*& transform) { axis_set = transform; transform = NULL; }
PRCTransformation3d *axis_set;
bool operator==(const PRCCoordinateSystem &t) const
{
@@ -873,9 +874,9 @@ public:
PRCCartesianTransformation3d* axis_set_cartesian = dynamic_cast<PRCCartesianTransformation3d*>(axis_set);
PRCCartesianTransformation3d* t_axis_set_cartesian = dynamic_cast<PRCCartesianTransformation3d*>(t.axis_set);
if(axis_set_general!=NULL)
- return (t_axis_set_general!=NULL?(*axis_set_general==*t_axis_set_general):false);
+ return (t_axis_set_general!=NULL?(*axis_set_general==*t_axis_set_general):false);
if(axis_set_cartesian!=NULL)
- return (t_axis_set_cartesian!=NULL?(*axis_set_cartesian==*t_axis_set_cartesian):false);
+ return (t_axis_set_cartesian!=NULL?(*axis_set_cartesian==*t_axis_set_cartesian):false);
return false;
}
};
@@ -988,7 +989,7 @@ public:
PRCContentSurface() :
PRCBaseGeometry(), extend_info(KEPRCExtendTypeNone) {}
PRCContentSurface(std::string n) :
- PRCBaseGeometry(n,makeCADID()),extend_info(KEPRCExtendTypeNone) {}
+ PRCBaseGeometry(n,makeCADID()),extend_info(KEPRCExtendTypeNone) {}
void serializeContentSurface(PRCbitStream&);
EPRCExtendType extend_info;
};
@@ -1029,7 +1030,7 @@ public:
PRCContentCurve() :
PRCBaseGeometry(), extend_info(KEPRCExtendTypeNone), is_3d(true) {}
PRCContentCurve(std::string n) :
- PRCBaseGeometry(n,makeCADID()),extend_info(KEPRCExtendTypeNone), is_3d(true) {}
+ PRCBaseGeometry(n,makeCADID()),extend_info(KEPRCExtendTypeNone), is_3d(true) {}
void serializeContentCurve(PRCbitStream&);
EPRCExtendType extend_info;
bool is_3d;
@@ -1241,7 +1242,7 @@ public:
PRCContentWireEdge() :
PRCBaseTopology(), curve_3d(NULL), has_curve_trim_interval(false) {}
PRCContentWireEdge(std::string n) :
- PRCBaseTopology(n,makeCADID()), curve_3d(NULL), has_curve_trim_interval(false) {}
+ PRCBaseTopology(n,makeCADID()), curve_3d(NULL), has_curve_trim_interval(false) {}
~PRCContentWireEdge() { delete curve_3d; }
void serializeContentWireEdge(PRCbitStream &pbs);
// void setCurve(PRCCurve*& curve) { curve_3d = curve; curve = NULL; }
@@ -1267,7 +1268,7 @@ public:
~PRCSingleWireBody() { delete wire_edge; }
void serializeSingleWireBody(PRCbitStream &pbs);
void serializeBody(PRCbitStream &pbs) { serializeSingleWireBody(pbs); }
- void setWireEdge(PRCWireEdge*& wireEdge) { wire_edge = wireEdge; wireEdge = NULL; }
+ void setWireEdge(PRCWireEdge*& wireEdge) { wire_edge = wireEdge; wireEdge = NULL; }
PRCWireEdge* wire_edge;
};
@@ -1277,7 +1278,7 @@ public:
PRCFace() :
PRCBaseTopology(), base_surface(NULL), have_surface_trim_domain(false), have_tolerance(false), tolerance(0), number_of_loop(0), outer_loop_index(-1) {}
PRCFace(std::string n) :
- PRCBaseTopology(n,makeCADID()), base_surface(NULL), have_surface_trim_domain(false), have_tolerance(false), tolerance(0), number_of_loop(0), outer_loop_index(-1) {}
+ PRCBaseTopology(n,makeCADID()), base_surface(NULL), have_surface_trim_domain(false), have_tolerance(false), tolerance(0), number_of_loop(0), outer_loop_index(-1) {}
~PRCFace() { delete base_surface; }
void serializeFace(PRCbitStream &pbs);
void serializeTopoItem(PRCbitStream &pbs) { serializeFace(pbs); }
@@ -1316,7 +1317,7 @@ public:
PRCConnex() :
PRCBaseTopology() {}
PRCConnex(std::string n) :
- PRCBaseTopology(n,makeCADID()) {}
+ PRCBaseTopology(n,makeCADID()) {}
~PRCConnex() { for(PRCShellList::iterator it=shell.begin(); it!=shell.end(); ++it) delete *it; }
void serializeConnex(PRCbitStream &pbs);
void serializeTopoItem(PRCbitStream &pbs) { serializeConnex(pbs); }
@@ -1346,7 +1347,7 @@ public:
PRCCompressedFace() :
PRCBaseTopology(), orientation_surface_with_shell(true), degree(0) {}
PRCCompressedFace(std::string n) :
- PRCBaseTopology(n,makeCADID()), orientation_surface_with_shell(true), degree(0) {}
+ PRCBaseTopology(n,makeCADID()), orientation_surface_with_shell(true), degree(0) {}
void serializeCompressedFace(PRCbitStream &pbs, double brep_data_compressed_tolerance);
void serializeContentCompressedFace(PRCbitStream &pbs);
void serializeCompressedAnaNurbs(PRCbitStream &pbs, double brep_data_compressed_tolerance);
diff --git a/graphics/asymptote/prc/oPRCFile.cc b/graphics/asymptote/prc/oPRCFile.cc
index 859d6597c0..56f164793e 100644
--- a/graphics/asymptote/prc/oPRCFile.cc
+++ b/graphics/asymptote/prc/oPRCFile.cc
@@ -19,13 +19,13 @@
*
*************/
-#include "oPRCFile.h"
-#include <time.h>
-#include <sstream>
-#include <iostream>
+#include "prc/oPRCFile.h"
+#include <cstring>
#include <fstream>
#include <iomanip>
-#include <cstring>
+#include <iostream>
+#include <sstream>
+#include <time.h>
#include <zlib.h>
namespace prc {
@@ -154,7 +154,7 @@ void PRCFileStructure::serializeFileStructureTree(PRCbitStream &out)
WriteUnsignedInteger (number_of_part_definitions)
for (size_t i=0;i<number_of_part_definitions;i++)
SerializePartDefinition (part_definitions[i])
-
+
const size_t number_of_product_occurrences = product_occurrences.size();
WriteUnsignedInteger (number_of_product_occurrences)
for (size_t i=0;i<number_of_product_occurrences;i++)
@@ -556,7 +556,7 @@ void oPRCFile::doGroup(PRCgroup& group)
break;
}
}
-
+
for(PRCtessquadList::const_iterator qit=group.quads.begin(); qit!=group.quads.end(); qit++)
{
const RGBAColour* C = qit->colours;
@@ -588,13 +588,13 @@ void oPRCFile::doGroup(PRCgroup& group)
tessFace->rgba_vertices.push_back(byte(C[1].B));
if(tessFace->is_rgba)
tessFace->rgba_vertices.push_back(byte(C[1].A));
-
+
tessFace->rgba_vertices.push_back(byte(C[2].R));
tessFace->rgba_vertices.push_back(byte(C[2].G));
tessFace->rgba_vertices.push_back(byte(C[2].B));
if(tessFace->is_rgba)
tessFace->rgba_vertices.push_back(byte(C[2].A));
-
+
tessFace->rgba_vertices.push_back(byte(C[3].R));
tessFace->rgba_vertices.push_back(byte(C[3].G));
tessFace->rgba_vertices.push_back(byte(C[3].B));
@@ -615,13 +615,13 @@ void oPRCFile::doGroup(PRCgroup& group)
tessFace->rgba_vertices.push_back(byte(C[0].B));
if(tessFace->is_rgba)
tessFace->rgba_vertices.push_back(byte(C[0].A));
-
+
tessFace->rgba_vertices.push_back(byte(C[2].R));
tessFace->rgba_vertices.push_back(byte(C[2].G));
tessFace->rgba_vertices.push_back(byte(C[2].B));
if(tessFace->is_rgba)
tessFace->rgba_vertices.push_back(byte(C[2].A));
-
+
tessFace->rgba_vertices.push_back(byte(C[3].R));
tessFace->rgba_vertices.push_back(byte(C[3].G));
tessFace->rgba_vertices.push_back(byte(C[3].B));
@@ -639,13 +639,13 @@ void oPRCFile::doGroup(PRCgroup& group)
tessFace->rgba_vertices.push_back(byte(C[3].B));
if(tessFace->is_rgba)
tessFace->rgba_vertices.push_back(byte(C[3].A));
-
+
tessFace->rgba_vertices.push_back(byte(C[1].R));
tessFace->rgba_vertices.push_back(byte(C[1].G));
tessFace->rgba_vertices.push_back(byte(C[1].B));
if(tessFace->is_rgba)
tessFace->rgba_vertices.push_back(byte(C[1].A));
-
+
tessFace->rgba_vertices.push_back(byte(C[0].R));
tessFace->rgba_vertices.push_back(byte(C[0].G));
tessFace->rgba_vertices.push_back(byte(C[0].B));
@@ -857,7 +857,7 @@ void oPRCFile::doGroup(PRCgroup& group)
}
// Simplify and reduce to as simple entities as possible
- // products with named representation items can not be reduced to sets, since
+ // products with named representation items can not be reduced to sets, since
// outside references are already set
bool nonamedparts = true;
for(PRCRepresentationItemList::const_iterator it=part_definition->representation_item.begin(); it!=part_definition->representation_item.end(); it++)
@@ -963,7 +963,7 @@ std::string oPRCFile::calculate_unique_name(const ContentPRCBase *prc_entity,con
serialization << prc_entity->getPRCID();
if (prc_occurence)
{
-// serialization_buffer = Flush serialization (serialization)
+// serialization_buffer = Flush serialization (serialization)
{
const uint32_t size_serialization = serialization.getSize();
while(size_serialization == serialization.getSize())
diff --git a/graphics/asymptote/prc/test.cc b/graphics/asymptote/prc/test.cc
index baf942fc7d..0f8e0bdb4a 100644
--- a/graphics/asymptote/prc/test.cc
+++ b/graphics/asymptote/prc/test.cc
@@ -19,12 +19,12 @@
*
*************/
-#include <iostream>
-#include <iomanip>
-#include <fstream>
+#include "include/prc/oPRCFile.h"
#include <cmath>
+#include <fstream>
+#include <iomanip>
+#include <iostream>
#include <string>
-#include "oPRCFile.h"
using namespace std;
@@ -51,7 +51,7 @@ int main()
colours[i%N_COLOURS].B = 0.95;
colours[i%N_COLOURS].A = 0.75;
}
-
+
PRCmaterial materials[N_COLOURS];
for(size_t i = 0; i < N_COLOURS; ++i)
{
@@ -74,12 +74,12 @@ int main()
materials[i%N_COLOURS].alpha = 0.75;
materials[i%N_COLOURS].shininess = 0.1;
}
-
+
if(1) {
double knotsU[] = {1,1,1,1,2,2,2,2};
double knotsV[] = {1,1,1,1,2,2,2,2};
const size_t NUMBER_OF_PATCHES = 32;
- double controlPoints[NUMBER_OF_PATCHES][16][3] =
+ double controlPoints[NUMBER_OF_PATCHES][16][3] =
{
{ // Patch 0
{1.4,0,2.4},{1.4,-0.784,2.4},{0.784,-1.4,2.4},{0,-1.4,2.4},
@@ -300,7 +300,7 @@ int main()
}
file.endgroup();
}
-
+
const size_t NUMBER_OF_POINTS = 31;
double points[NUMBER_OF_POINTS][3];
for(size_t i = 0; i < NUMBER_OF_POINTS; ++i)
@@ -742,11 +742,11 @@ int main()
// following box examples show a) different ways to represent a surface consisting of flat rectangles
// b) that the only way to have almost working transparency is a set of NURBS bodies.
// (Or may be other topology types like plane also work
-// demonstration how non-transparent materials work the same for all kinds of objects
+// demonstration how non-transparent materials work the same for all kinds of objects
- if(1) { // demonstration how non-transparent materials work the same for all kinds of objects
+ if(1) { // demonstration how non-transparent materials work the same for all kinds of objects
const size_t NUMBER_OF_PATCHES = 6;
- double vertices[NUMBER_OF_PATCHES][4][3] =
+ double vertices[NUMBER_OF_PATCHES][4][3] =
{
{ // Patch 0
{-1,-1,-1},
@@ -951,4 +951,3 @@ int main()
#endif
return 0;
}
-
diff --git a/graphics/asymptote/prc/writePRC.cc b/graphics/asymptote/prc/writePRC.cc
index a2877b0899..739c758374 100644
--- a/graphics/asymptote/prc/writePRC.cc
+++ b/graphics/asymptote/prc/writePRC.cc
@@ -19,9 +19,9 @@
*
*************/
-#include "writePRC.h"
-#include <climits>
+#include "prc/writePRC.h"
#include <cassert>
+#include <climits>
// debug print includes
#include <iostream>
@@ -40,7 +40,7 @@ using namespace std;
#endif
// Count leading zeros.
-uint32_t CLZ(uint32_t a)
+uint32_t CLZ(uint32_t a)
{
#if __GNUC_PREREQ(3,4)
return __builtin_clz(a);
@@ -51,7 +51,7 @@ uint32_t CLZ(uint32_t a)
8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};
- a |= a >> 1; // first round down to one less than a power of 2
+ a |= a >> 1; // first round down to one less than a power of 2
a |= a >> 2;
a |= a >> 4;
a |= a >> 8;
@@ -62,7 +62,7 @@ uint32_t CLZ(uint32_t a)
}
// Portable integer implementation of ceil(log2(x)).
-uint32_t Log2(uint32_t x)
+uint32_t Log2(uint32_t x)
{
assert(x != 0);
uint32_t L=31-CLZ(x);
@@ -243,10 +243,10 @@ void UserData::write(PRCbitStream &pbs)
void PRCAttributeEntry::serializeAttributeEntry(PRCbitStream &pbs) const
{
- WriteBoolean (title_is_integer)
+ WriteBoolean (title_is_integer)
if (title_is_integer)
WriteUnsignedInteger (title_integer)
- else
+ else
WriteString (title_text)
}
@@ -267,7 +267,7 @@ void PRCSingleAttribute::serializeSingleAttribute(PRCbitStream &pbs) const
break;
case KEPRCModellerAttributeTypeString:
WriteString (value_text)
- break;
+ break;
default:
break;
}
@@ -275,24 +275,24 @@ void PRCSingleAttribute::serializeSingleAttribute(PRCbitStream &pbs) const
void PRCAttribute::serializeAttribute(PRCbitStream &pbs) const
{
- WriteUnsignedInteger (PRC_TYPE_MISC_Attribute)
-
+ WriteUnsignedInteger (PRC_TYPE_MISC_Attribute)
+
SerializeAttributeEntry
const uint32_t size_of_attribute_keys = attribute_keys.size();
- WriteUnsignedInteger (size_of_attribute_keys)
- for(uint32_t i=0;i<size_of_attribute_keys;i++)
- SerializeContentSingleAttribute (attribute_keys[i])
+ WriteUnsignedInteger (size_of_attribute_keys)
+ for(uint32_t i=0;i<size_of_attribute_keys;i++)
+ SerializeContentSingleAttribute (attribute_keys[i])
}
void PRCAttributes::serializeAttributes(PRCbitStream &pbs) const
{
if (attributes.empty()) { // shortcut for most typical case
const uint32_t number_of_attributes = 0;
- WriteUnsignedInteger (number_of_attributes)
+ WriteUnsignedInteger (number_of_attributes)
return;
}
const uint32_t number_of_attributes = attributes.size();
- WriteUnsignedInteger (number_of_attributes)
+ WriteUnsignedInteger (number_of_attributes)
for(PRCAttributeList::const_iterator it = attributes.begin(); it != attributes.end(); ++it)
{
SerializeAttribute(*it)
@@ -356,7 +356,7 @@ void PRCTextureDefinition::serializeTextureDefinition(PRCbitStream &pbs)
const uint32_t size_texture_mapping_attributes_components = 1;
const uint8_t *texture_mapping_attributes_components = &texture_mapping_attribute_components;
const EPRCTextureMappingType eMappingType = KEPRCTextureMappingType_Stored;
-
+
const double red = 1.0;
const double green = 1.0;
const double blue = 1.0;
@@ -374,8 +374,8 @@ void PRCTextureDefinition::serializeTextureDefinition(PRCbitStream &pbs)
SerializeContentPRCBase
- WriteUnsignedInteger (picture_index+1)
- WriteCharacter (texture_dimension)
+ WriteUnsignedInteger (picture_index+1)
+ WriteCharacter (texture_dimension)
// SerializeTextureMappingType
WriteInteger (eMappingType) // Texture mapping type
@@ -384,19 +384,19 @@ void PRCTextureDefinition::serializeTextureDefinition(PRCbitStream &pbs)
// WriteInteger (eMappingOperator) // Texture mapping operator
// WriteInteger (transformation)
// if (transformation)
- // SerializeCartesianTransformation3d (transformation)
+ // SerializeCartesianTransformation3d (transformation)
// }
- WriteUnsignedInteger (texture_mapping_attributes) // Texture mapping attributes
+ WriteUnsignedInteger (texture_mapping_attributes) // Texture mapping attributes
WriteUnsignedInteger (size_texture_mapping_attributes_intensities)
for (i=0;i<size_texture_mapping_attributes_intensities;i++)
WriteDouble (texture_mapping_attributes_intensities[i])
WriteUnsignedInteger (size_texture_mapping_attributes_components)
for (i=0;i<size_texture_mapping_attributes_components;i++)
- WriteCharacter (texture_mapping_attributes_components[i])
+ WriteCharacter (texture_mapping_attributes_components[i])
WriteInteger (texture_function)
- // reserved for future use; see Texture function
+ // reserved for future use; see Texture function
if (texture_function == KEPRCTextureFunction_Blend)
{
WriteDouble (red) // blend color component in the range [0.0,1.0]
@@ -405,20 +405,20 @@ void PRCTextureDefinition::serializeTextureDefinition(PRCbitStream &pbs)
WriteDouble (alpha) // blend color component in the range [0.0,1.0]
}
- WriteInteger (blend_src_rgb) // Texture blend parameter
- // reserved for future use; see Texture blend parameter
+ WriteInteger (blend_src_rgb) // Texture blend parameter
+ // reserved for future use; see Texture blend parameter
if (blend_src_rgb != KEPRCTextureBlendParameter_Unknown)
- WriteInteger (blend_dst_rgb) // Texture blend parameter
+ WriteInteger (blend_dst_rgb) // Texture blend parameter
- WriteInteger (blend_src_alpha) // Texture blend parameter
- // reserved for future use; see Texture blend parameter
+ WriteInteger (blend_src_alpha) // Texture blend parameter
+ // reserved for future use; see Texture blend parameter
if (blend_src_alpha != KEPRCTextureBlendParameter_Unknown)
- WriteInteger (blend_dst_alpha) // Texture blend parameter
+ WriteInteger (blend_dst_alpha) // Texture blend parameter
- WriteCharacter (texture_applying_mode) // Texture applying mode
+ WriteCharacter (texture_applying_mode) // Texture applying mode
if (texture_applying_mode & PRC_TEXTURE_APPLYING_MODE_ALPHATEST)
{
- WriteInteger (alpha_test) // Texture alpha test
+ WriteInteger (alpha_test) // Texture alpha test
WriteDouble (alpha_test_reference)
}
@@ -448,14 +448,14 @@ void PRCMaterialGeneric::serializeMaterialGeneric(PRCbitStream &pbs)
WriteDouble (specular_alpha)
}
-void PRCTextureApplication::serializeTextureApplication(PRCbitStream &pbs)
+void PRCTextureApplication::serializeTextureApplication(PRCbitStream &pbs)
{
WriteUnsignedInteger (PRC_TYPE_GRAPH_TextureApplication)
SerializeContentPRCBase
- WriteUnsignedInteger (material_generic_index+1)
- WriteUnsignedInteger (texture_definition_index+1)
- WriteUnsignedInteger (next_texture_index+1)
+ WriteUnsignedInteger (material_generic_index+1)
+ WriteUnsignedInteger (texture_definition_index+1)
+ WriteUnsignedInteger (next_texture_index+1)
WriteUnsignedInteger (UV_coordinates_index+1)
}
@@ -464,7 +464,7 @@ void PRCLinePattern::serializeLinePattern(PRCbitStream &pbs)
uint32_t i = 0;
WriteUnsignedInteger (PRC_TYPE_GRAPH_LinePattern)
SerializeContentPRCBase
-
+
const uint32_t size_lengths = lengths.size();
WriteUnsignedInteger (size_lengths)
for (i=0;i<size_lengths;i++)
@@ -599,19 +599,19 @@ void resetGraphicsAndName()
void PRCMarkup::serializeMarkup(PRCbitStream &pbs)
{
WriteUnsignedInteger (PRC_TYPE_MKP_Markup)
- SerializeContentPRCBase
+ SerializeContentPRCBase
SerializeGraphics
- WriteUnsignedInteger (type)
- WriteUnsignedInteger (sub_type)
+ WriteUnsignedInteger (type)
+ WriteUnsignedInteger (sub_type)
const uint32_t number_of_linked_items = 0;
- WriteUnsignedInteger (number_of_linked_items)
-// for (i=0;i<number_of_linked_items;i++)
+ WriteUnsignedInteger (number_of_linked_items)
+// for (i=0;i<number_of_linked_items;i++)
// SerializeReferenceUniqueIdentifier (linked_items[i])
const uint32_t number_of_leaders = 0;
- WriteUnsignedInteger (number_of_leaders)
-// for (i=0;i<number_of_leaders;i++)
+ WriteUnsignedInteger (number_of_leaders)
+// for (i=0;i<number_of_leaders;i++)
// SerializeReferenceUniqueIdentifier (leaders[i])
- WriteUnsignedInteger (index_tessellation + 1)
+ WriteUnsignedInteger (index_tessellation + 1)
SerializeUserData
}
@@ -621,7 +621,7 @@ void PRCAnnotationItem::serializeAnnotationItem(PRCbitStream &pbs)
// group___tf_annotation_item_____serialize_content2.html
// group___tf_annotation_entity_____serialize_content2.html
WriteUnsignedInteger (PRC_TYPE_MKP_AnnotationItem)
- SerializeContentPRCBase
+ SerializeContentPRCBase
SerializeGraphics
SerializeReferenceUniqueIdentifier (markup)
SerializeUserData
@@ -629,7 +629,7 @@ void PRCAnnotationItem::serializeAnnotationItem(PRCbitStream &pbs)
void PRCRepresentationItemContent::serializeRepresentationItemContent(PRCbitStream &pbs)
{
- SerializeContentPRCBase
+ SerializeContentPRCBase
SerializeGraphics
WriteUnsignedInteger (index_local_coordinate_system + 1)
WriteUnsignedInteger (index_tessellation + 1)
@@ -639,7 +639,7 @@ void PRCBrepModel::serializeBrepModel(PRCbitStream &pbs)
{
WriteUnsignedInteger (PRC_TYPE_RI_BrepModel)
- SerializeRepresentationItemContent
+ SerializeRepresentationItemContent
WriteBit (has_brep_data)
if (has_brep_data)
{
@@ -654,7 +654,7 @@ void PRCPolyBrepModel::serializePolyBrepModel(PRCbitStream &pbs)
{
WriteUnsignedInteger (PRC_TYPE_RI_PolyBrepModel)
- SerializeRepresentationItemContent
+ SerializeRepresentationItemContent
WriteBoolean (is_closed)
SerializeUserData
}
@@ -663,7 +663,7 @@ void PRCPointSet::serializePointSet(PRCbitStream &pbs)
{
WriteUnsignedInteger (PRC_TYPE_RI_PointSet)
- SerializeRepresentationItemContent
+ SerializeRepresentationItemContent
const uint32_t number_of_points = point.size();
WriteUnsignedInteger (number_of_points)
@@ -678,7 +678,7 @@ void PRCSet::serializeSet(PRCbitStream &pbs)
{
WriteUnsignedInteger (PRC_TYPE_RI_Set)
- SerializeRepresentationItemContent
+ SerializeRepresentationItemContent
const uint32_t number_of_elements = elements.size();
WriteUnsignedInteger (number_of_elements)
@@ -742,7 +742,7 @@ void PRCWire::serializeWire(PRCbitStream &pbs)
{
WriteUnsignedInteger (PRC_TYPE_RI_Curve)
- SerializeRepresentationItemContent
+ SerializeRepresentationItemContent
WriteBit (has_wire_body)
if (has_wire_body)
{
@@ -757,7 +757,7 @@ void PRCPolyWire::serializePolyWire(PRCbitStream &pbs)
{
WriteUnsignedInteger (PRC_TYPE_RI_PolyWire)
- SerializeRepresentationItemContent
+ SerializeRepresentationItemContent
SerializeUserData
}
@@ -767,7 +767,7 @@ void PRCGeneralTransformation3d::serializeGeneralTransformation3d(PRCbitStream
// Like Fortran, PRC uses transposed (column-major) format!
for (int j=0;j<4;j++)
for (int i=0;i<4;i++)
- WriteDouble(mat[i][j]);
+ WriteDouble(mat[i][j]);
}
void PRCCartesianTransformation3d::serializeCartesianTransformation3d(PRCbitStream &pbs) const
@@ -807,7 +807,7 @@ void PRCCartesianTransformation3d::serializeCartesianTransformation3d(PRCbitStr
}
void PRCTransformation::serializeTransformation(PRCbitStream &pbs)
-{
+{
WriteBit ( has_transformation )
if (has_transformation)
{
@@ -842,7 +842,7 @@ void PRCCoordinateSystem::serializeCoordinateSystem(PRCbitStream &pbs)
{
WriteUnsignedInteger (PRC_TYPE_RI_CoordinateSystem)
- SerializeRepresentationItemContent
+ SerializeRepresentationItemContent
axis_set->serializeTransformation3d(pbs);
SerializeUserData
}
@@ -871,10 +871,10 @@ void SerializeArrayRGBA (const std::vector<uint8_t> &rgba_vertices,const bool is
const std::vector<uint8_t> &vector_color = rgba_vertices;
const uint32_t number_of_colors=vector_color.size();
const uint32_t number_of_vectors=number_of_colors / number_by_vector;
- // first one
+ // first one
for (i=0;i<number_by_vector;i++)
WriteCharacter (vector_color[i])
-
+
for (i=1;i<number_of_vectors;i++)
{
bool b_same = true;
@@ -901,22 +901,22 @@ void PRCTessFace::serializeTessFace(PRCbitStream &pbs)
WriteUnsignedInteger (PRC_TYPE_TESS_Face)
const uint32_t size_of_line_attributes=line_attributes.size();
- WriteUnsignedInteger (size_of_line_attributes)
- for (i=0;i<size_of_line_attributes;i++)
+ WriteUnsignedInteger (size_of_line_attributes)
+ for (i=0;i<size_of_line_attributes;i++)
SerializeLineAttr (line_attributes[i])
- WriteUnsignedInteger (start_wire)
+ WriteUnsignedInteger (start_wire)
const uint32_t size_of_sizes_wire=sizes_wire.size();
- WriteUnsignedInteger (size_of_sizes_wire)
- for (i=0;i<size_of_sizes_wire;i++)
+ WriteUnsignedInteger (size_of_sizes_wire)
+ for (i=0;i<size_of_sizes_wire;i++)
WriteUnsignedInteger (sizes_wire[i])
- WriteUnsignedInteger (used_entities_flag)
+ WriteUnsignedInteger (used_entities_flag)
- WriteUnsignedInteger (start_triangulated)
+ WriteUnsignedInteger (start_triangulated)
const uint32_t size_of_sizes_triangulated=sizes_triangulated.size();
- WriteUnsignedInteger (size_of_sizes_triangulated)
- for (i=0;i<size_of_sizes_triangulated;i++)
+ WriteUnsignedInteger (size_of_sizes_triangulated)
+ for (i=0;i<size_of_sizes_triangulated;i++)
WriteUnsignedInteger (sizes_triangulated[i])
if(number_of_texture_coordinate_indexes==0 &&
@@ -932,7 +932,7 @@ void PRCTessFace::serializeTessFace(PRCbitStream &pbs)
PRC_FACETESSDATA_TriangleStripeOneNormalTextured
))
WriteUnsignedInteger (1) // workaround for error of not setting number_of_texture_coordinate_indexes
- else
+ else
WriteUnsignedInteger (number_of_texture_coordinate_indexes)
const bool has_vertex_colors = !rgba_vertices.empty();
@@ -951,7 +951,7 @@ void PRCTessFace::serializeTessFace(PRCbitStream &pbs)
// not described
}
}
- if (size_of_line_attributes)
+ if (size_of_line_attributes)
WriteUnsignedInteger (behaviour)
}
@@ -969,7 +969,7 @@ void PRC3DTess::serialize3DTess(PRCbitStream &pbs)
{
uint32_t i=0; // universal index for PRC standart compatibility
WriteUnsignedInteger (PRC_TYPE_TESS_3D)
- SerializeContentBaseTessData
+ SerializeContentBaseTessData
WriteBoolean (has_faces)
WriteBoolean (has_loops)
const bool must_recalculate_normals=normal_coordinate.empty();
@@ -982,28 +982,28 @@ void PRC3DTess::serialize3DTess(PRCbitStream &pbs)
// definition similar to VRML
WriteDouble (crease_angle)
}
-
+
const uint32_t number_of_normal_coordinates=normal_coordinate.size();
WriteUnsignedInteger (number_of_normal_coordinates)
for (i=0;i<number_of_normal_coordinates;i++)
WriteDouble (normal_coordinate[i])
-
+
const uint32_t number_of_wire_indices=wire_index.size();
WriteUnsignedInteger (number_of_wire_indices)
for (i=0;i<number_of_wire_indices;i++)
WriteUnsignedInteger (wire_index[i])
-
+
// note : those can be single triangles, triangle fans or stripes
const uint32_t number_of_triangulated_indices=triangulated_index.size();
WriteUnsignedInteger (number_of_triangulated_indices)
for (i=0;i<number_of_triangulated_indices;i++)
WriteUnsignedInteger (triangulated_index[i])
-
+
const uint32_t number_of_face_tessellation=face_tessellation.size();
WriteUnsignedInteger (number_of_face_tessellation)
for (i=0;i<number_of_face_tessellation;i++)
SerializeTessFace (face_tessellation[i])
-
+
const uint32_t number_of_texture_coordinates=texture_coordinate.size();
WriteUnsignedInteger (number_of_texture_coordinates)
for (i=0;i<number_of_texture_coordinates;i++)
@@ -1022,12 +1022,12 @@ void PRC3DWireTess::serialize3DWireTess(PRCbitStream &pbs)
// group___tf3_d_wire_tess_data_____serialize_content2.html
uint32_t i=0; // universal index for PRC standart compatibility
WriteUnsignedInteger (PRC_TYPE_TESS_3D_Wire)
- SerializeContentBaseTessData
+ SerializeContentBaseTessData
const uint32_t number_of_wire_indexes=wire_indexes.size();
WriteUnsignedInteger (number_of_wire_indexes)
for (i=0;i<number_of_wire_indexes;i++)
WriteUnsignedInteger (wire_indexes[i])
-
+
const bool has_vertex_colors = !rgba_vertices.empty();
WriteBoolean (has_vertex_colors)
if (has_vertex_colors)
@@ -1053,7 +1053,7 @@ void PRCMarkupTess::serializeMarkupTess(PRCbitStream &pbs)
// group___tf_markup_tess_data_____serialize_content2.html
uint32_t i=0; // universal index for PRC standart compatibility
WriteUnsignedInteger (PRC_TYPE_TESS_Markup)
- SerializeContentBaseTessData
+ SerializeContentBaseTessData
const uint32_t number_of_codes=codes.size();
WriteUnsignedInteger (number_of_codes)
@@ -1150,12 +1150,12 @@ void PRCContentSurface::serializeContentSurface(PRCbitStream &pbs)
}
void PRCNURBSSurface::serializeNURBSSurface(PRCbitStream &pbs)
-{
+{
uint32_t i=0;
// uint32_t i=0, j=0;
- WriteUnsignedInteger (PRC_TYPE_SURF_NURBS)
+ WriteUnsignedInteger (PRC_TYPE_SURF_NURBS)
- SerializeContentSurface
+ SerializeContentSurface
WriteBoolean ( is_rational )
WriteUnsignedInteger ( degree_in_u )
WriteUnsignedInteger ( degree_in_v )
@@ -1202,7 +1202,7 @@ void writeUnsignedIntegerWithVariableBitNumber(PRCbitStream &pbs, uint32_t value
if( value >= 1u<<(bit_number - 1 - i) )
{
WriteBoolean (true)
-
+
value -= 1u<<(bit_number - 1 - i);
}
else
@@ -1214,7 +1214,7 @@ void writeUnsignedIntegerWithVariableBitNumber(PRCbitStream &pbs, uint32_t value
#define WriteUnsignedIntegerWithVariableBitNumber( value, bit_number ) writeUnsignedIntegerWithVariableBitNumber( pbs, (value), (bit_number) );
void writeIntegerWithVariableBitNumber(PRCbitStream &pbs, int32_t iValue, uint32_t uBitNumber)
-{
+{
WriteBoolean(iValue<0);
WriteUnsignedIntegerWithVariableBitNumber(abs(iValue), uBitNumber - 1);
}
@@ -1259,7 +1259,7 @@ int32_t intdiv(double dValue, double dTolerance)
assert(ratio <= INT_MAX);
int32_t iTempValue=(int32_t) ratio;
if(ratio - iTempValue >= 0.5) iTempValue++;
- if(dValue < 0)
+ if(dValue < 0)
return -iTempValue;
else
return iTempValue;
@@ -1331,7 +1331,7 @@ void PRCCompressedFace::serializeCompressedAnaNurbs(PRCbitStream &pbs, double b
{
// WriteCompressedEntityType ( PRC_HCG_AnaNurbs )
const bool is_a_curve = false;
- WriteBoolean ( is_a_curve )
+ WriteBoolean ( is_a_curve )
WriteUnsignedIntegerWithVariableBitNumber (13 , 4)
serializeContentCompressedFace( pbs );
serializeCompressedNurbs( pbs, brep_data_compressed_tolerance );
@@ -1342,7 +1342,7 @@ void PRCCompressedFace::serializeCompressedNurbs(PRCbitStream &pbs, double brep
const double nurbs_tolerance = 0.2*brep_data_compressed_tolerance;
const uint32_t degree_in_u = degree;
const uint32_t degree_in_v = degree;
-
+
WriteUnsignedIntegerWithVariableBitNumber ( degree_in_u, 5)
WriteUnsignedIntegerWithVariableBitNumber ( degree_in_v, 5)
@@ -1358,10 +1358,10 @@ void PRCCompressedFace::serializeCompressedNurbs(PRCbitStream &pbs, double brep
WriteBoolean (false) // Multiplicity_is_already_stored - no
WriteUnsignedIntegerWithVariableBitNumber( degree_in_v+1,number_bit)
WriteBoolean (true) // Multiplicity_is_already_stored - yes
-
- const bool is_closed_u = false;
+
+ const bool is_closed_u = false;
WriteBoolean ( is_closed_u )
- const bool is_closed_v = false;
+ const bool is_closed_v = false;
WriteBoolean ( is_closed_v )
const uint32_t number_of_control_point_in_u = degree_in_u + 1;
@@ -1375,7 +1375,7 @@ void PRCCompressedFace::serializeCompressedNurbs(PRCbitStream &pbs, double brep
for(uint32_t i=0;i<number_of_control_point_in_u;i++)
for(uint32_t j=0;j<number_of_control_point_in_v;j++)
P[i][j] = control_point[i*number_of_control_point_in_v+j];
-#ifdef __GNUC__
+#if defined(__GNUC__) && !defined(__clang__)
itriple compressed_control_point[number_of_control_point_in_u][number_of_control_point_in_v];
uint32_t control_point_type[number_of_control_point_in_u][number_of_control_point_in_v];
#else
@@ -1385,7 +1385,7 @@ void PRCCompressedFace::serializeCompressedNurbs(PRCbitStream &pbs, double brep
uint32_t number_of_bits_for_isomin = 1;
uint32_t number_of_bits_for_rest = 1;
-
+
for(uint32_t j = 1; j < number_of_control_point_in_v; j++)
{
compressed_control_point[0][j] = iroundto(P[0][j]-P[0][j-1], nurbs_tolerance );
@@ -1410,7 +1410,7 @@ void PRCCompressedFace::serializeCompressedNurbs(PRCbitStream &pbs, double brep
compressed_control_point[i][j].x = 0;
compressed_control_point[i][j].y = 0;
compressed_control_point[i][j].z = 0;
-
+
PRCVector3d V = P[i-1][j] - P[i-1][j-1];
PRCVector3d U = P[i][j-1] - P[i-1][j-1];
PRCVector3d Pc = P[i][j] - (P[i-1][j-1] + U + V);
@@ -1420,7 +1420,7 @@ void PRCCompressedFace::serializeCompressedNurbs(PRCbitStream &pbs, double brep
control_point_type[i][j] = 0;
P[i][j] = P[i-1][j-1] + U + V;
}
- else
+ else
{
PRCVector3d N = U*V;
PRCVector3d Ue = U;
@@ -1473,27 +1473,27 @@ void PRCCompressedFace::serializeCompressedNurbs(PRCbitStream &pbs, double brep
WriteDouble ( P[0][0].x )
WriteDouble ( P[0][0].y )
WriteDouble ( P[0][0].z )
-
+
for(uint32_t j = 1; j < number_of_control_point_in_v; j++)
{
WriteIntegerWithVariableBitNumber(compressed_control_point[0][j].x, number_of_bits_for_isomin+1)
WriteIntegerWithVariableBitNumber(compressed_control_point[0][j].y, number_of_bits_for_isomin+1)
WriteIntegerWithVariableBitNumber(compressed_control_point[0][j].z, number_of_bits_for_isomin+1)
}
-
+
for(uint32_t i = 1; i < number_of_control_point_in_u; i++)
{
WriteIntegerWithVariableBitNumber(compressed_control_point[i][0].x, number_of_bits_for_isomin+1)
WriteIntegerWithVariableBitNumber(compressed_control_point[i][0].y, number_of_bits_for_isomin+1)
WriteIntegerWithVariableBitNumber(compressed_control_point[i][0].z, number_of_bits_for_isomin+1)
}
-
+
for(uint32_t i = 1; i < number_of_control_point_in_u; i++)
{
for(uint32_t j = 1; j < number_of_control_point_in_v; j++)
{
WriteUnsignedIntegerWithVariableBitNumber ( control_point_type[i][j], 2 )
-
+
if(control_point_type[i][j] == 1)
{
WriteIntegerWithVariableBitNumber ( compressed_control_point[i][j].z, number_of_bits_for_rest+1 )
@@ -1511,7 +1511,7 @@ void PRCCompressedFace::serializeCompressedNurbs(PRCbitStream &pbs, double brep
}
}
}
-
+
const uint32_t type_param_u = 0;
WriteBoolean( type_param_u == 0 )
const uint32_t type_param_v = 0;
@@ -1528,10 +1528,10 @@ void PRCCompressedBrepData::serializeCompressedShell(PRCbitStream &pbs)
if( number_of_face != 1 )
WriteNumberOfBitsThenUnsignedInteger (number_of_face)
-
+
for( i=0; i < number_of_face; i++)
SerializeCompressedFace ( face[i] )
-
+
const bool is_an_iso_face = false;
for( i=0; i < number_of_face; i++)
WriteBoolean ( is_an_iso_face )
@@ -1541,7 +1541,7 @@ void PRCCompressedBrepData::serializeCompressedBrepData(PRCbitStream &pbs)
{
WriteUnsignedInteger ( PRC_TYPE_TOPO_BrepDataCompress )
SerializeContentBody
-
+
WriteDouble ( brep_data_compressed_tolerance )
const uint32_t number_of_bits_to_store_reference = 1;
WriteNumberOfBitsThenUnsignedInteger ( number_of_bits_to_store_reference )
@@ -1549,7 +1549,7 @@ void PRCCompressedBrepData::serializeCompressedBrepData(PRCbitStream &pbs)
WriteUnsignedIntegerWithVariableBitNumber ( number_vertex_iso, number_of_bits_to_store_reference )
const uint32_t number_edge_iso = 0;
WriteUnsignedIntegerWithVariableBitNumber ( number_edge_iso, number_of_bits_to_store_reference )
-
+
const uint32_t number_of_shell = 1;
const uint32_t number_of_connex = 1;
WriteBoolean ( number_of_shell == 1 && number_of_connex == 1 )
@@ -1562,31 +1562,31 @@ void PRCCompressedBrepData::serializeCompressedBrepData(PRCbitStream &pbs)
}
void PRCBlend01::serializeBlend01(PRCbitStream &pbs)
-{
- WriteUnsignedInteger (PRC_TYPE_SURF_Blend01)
+{
+ WriteUnsignedInteger (PRC_TYPE_SURF_Blend01)
SerializeContentSurface
SerializeTransformation
SerializeUVParameterization
- SerializePtrCurve ( center_curve )
- SerializePtrCurve ( origin_curve )
- SerializePtrCurve ( tangent_curve )
+ SerializePtrCurve ( center_curve )
+ SerializePtrCurve ( origin_curve )
+ SerializePtrCurve ( tangent_curve )
}
void PRCRuled::serializeRuled(PRCbitStream &pbs)
-{
- WriteUnsignedInteger (PRC_TYPE_SURF_Ruled)
+{
+ WriteUnsignedInteger (PRC_TYPE_SURF_Ruled)
SerializeContentSurface
SerializeTransformation
SerializeUVParameterization
- SerializePtrCurve ( first_curve )
- SerializePtrCurve ( second_curve )
+ SerializePtrCurve ( first_curve )
+ SerializePtrCurve ( second_curve )
}
void PRCSphere::serializeSphere(PRCbitStream &pbs)
-{
- WriteUnsignedInteger (PRC_TYPE_SURF_Sphere)
+{
+ WriteUnsignedInteger (PRC_TYPE_SURF_Sphere)
SerializeContentSurface
SerializeTransformation
@@ -1595,8 +1595,8 @@ void PRCSphere::serializeSphere(PRCbitStream &pbs)
}
void PRCCone::serializeCone(PRCbitStream &pbs)
-{
- WriteUnsignedInteger (PRC_TYPE_SURF_Cone)
+{
+ WriteUnsignedInteger (PRC_TYPE_SURF_Cone)
SerializeContentSurface
SerializeTransformation
@@ -1606,8 +1606,8 @@ void PRCCone::serializeCone(PRCbitStream &pbs)
}
void PRCCylinder::serializeCylinder(PRCbitStream &pbs)
-{
- WriteUnsignedInteger (PRC_TYPE_SURF_Cylinder)
+{
+ WriteUnsignedInteger (PRC_TYPE_SURF_Cylinder)
SerializeContentSurface
SerializeTransformation
@@ -1616,8 +1616,8 @@ void PRCCylinder::serializeCylinder(PRCbitStream &pbs)
}
void PRCTorus::serializeTorus(PRCbitStream &pbs)
-{
- WriteUnsignedInteger (PRC_TYPE_SURF_Torus)
+{
+ WriteUnsignedInteger (PRC_TYPE_SURF_Torus)
SerializeContentSurface
SerializeTransformation
@@ -1627,18 +1627,18 @@ void PRCTorus::serializeTorus(PRCbitStream &pbs)
}
void PRCFace::serializeFace(PRCbitStream &pbs)
-{
+{
uint32_t i = 0;
- WriteUnsignedInteger (PRC_TYPE_TOPO_Face)
+ WriteUnsignedInteger (PRC_TYPE_TOPO_Face)
SerializeBaseTopology
SerializePtrSurface ( base_surface )
WriteBit ( have_surface_trim_domain )
if ( have_surface_trim_domain )
- SerializeDomain ( surface_trim_domain )
+ SerializeDomain ( surface_trim_domain )
WriteBit ( have_tolerance )
if ( have_tolerance )
- WriteDouble ( tolerance )
+ WriteDouble ( tolerance )
WriteUnsignedInteger ( number_of_loop )
WriteInteger ( outer_loop_index )
for (i=0;i<number_of_loop;i++)
@@ -1648,14 +1648,14 @@ void PRCFace::serializeFace(PRCbitStream &pbs)
}
void PRCShell::serializeShell(PRCbitStream &pbs)
-{
+{
uint32_t i = 0;
- WriteUnsignedInteger (PRC_TYPE_TOPO_Shell)
+ WriteUnsignedInteger (PRC_TYPE_TOPO_Shell)
SerializeBaseTopology
WriteBoolean ( shell_is_closed )
uint32_t number_of_face = face.size();
- WriteUnsignedInteger ( number_of_face )
+ WriteUnsignedInteger ( number_of_face )
for (i=0;i<number_of_face;i++)
{
SerializePtrTopology ( face[i] )
@@ -1671,13 +1671,13 @@ void PRCShell::addFace(PRCFace*& pFace, uint8_t orientation)
}
void PRCConnex::serializeConnex(PRCbitStream &pbs)
-{
+{
uint32_t i = 0;
- WriteUnsignedInteger (PRC_TYPE_TOPO_Connex)
+ WriteUnsignedInteger (PRC_TYPE_TOPO_Connex)
SerializeBaseTopology
uint32_t number_of_shell = shell.size();
- WriteUnsignedInteger ( number_of_shell )
+ WriteUnsignedInteger ( number_of_shell )
for (i=0;i<number_of_shell;i++)
{
SerializePtrTopology ( shell[i] )
@@ -1694,11 +1694,11 @@ void PRCConnex::addShell(PRCShell*& pShell)
void PRCBrepData::serializeBrepData(PRCbitStream &pbs)
{
uint32_t i = 0;
- WriteUnsignedInteger ( PRC_TYPE_TOPO_BrepData)
+ WriteUnsignedInteger ( PRC_TYPE_TOPO_BrepData)
- SerializeContentBody
+ SerializeContentBody
uint32_t number_of_connex = connex.size();
- WriteUnsignedInteger ( number_of_connex )
+ WriteUnsignedInteger ( number_of_connex )
for ( i=0; i<number_of_connex; i++)
{
SerializePtrTopology ( connex[i] )
@@ -1725,8 +1725,8 @@ void PRCContentWireEdge::serializeContentWireEdge(PRCbitStream &pbs)
void PRCWireEdge::serializeWireEdge(PRCbitStream &pbs)
{
- WriteUnsignedInteger (PRC_TYPE_TOPO_WireEdge)
- SerializeContentWireEdge
+ WriteUnsignedInteger (PRC_TYPE_TOPO_WireEdge)
+ SerializeContentWireEdge
}
void PRCContentCurve::serializeContentCurve(PRCbitStream &pbs)
@@ -1737,11 +1737,11 @@ void PRCContentCurve::serializeContentCurve(PRCbitStream &pbs)
}
void PRCNURBSCurve::serializeNURBSCurve(PRCbitStream &pbs)
-{
+{
uint32_t i=0;
- WriteUnsignedInteger (PRC_TYPE_CRV_NURBS)
+ WriteUnsignedInteger (PRC_TYPE_CRV_NURBS)
- SerializeContentCurve
+ SerializeContentCurve
WriteBoolean ( is_rational )
WriteUnsignedInteger ( degree )
uint32_t highest_index_of_control_point = control_point.size()-1;
@@ -1764,16 +1764,16 @@ void PRCNURBSCurve::serializeNURBSCurve(PRCbitStream &pbs)
}
void PRCPolyLine::serializePolyLine(PRCbitStream &pbs)
-{
+{
uint32_t i=0;
- WriteUnsignedInteger (PRC_TYPE_CRV_PolyLine)
+ WriteUnsignedInteger (PRC_TYPE_CRV_PolyLine)
- SerializeContentCurve
+ SerializeContentCurve
SerializeTransformation
SerializeParameterization
uint32_t number_of_point = point.size();
- WriteUnsignedInteger ( number_of_point )
- for (i=0; i<number_of_point; i++)
+ WriteUnsignedInteger ( number_of_point )
+ for (i=0; i<number_of_point; i++)
{
if (is_3d)
SerializeVector3d ( point[i] )
@@ -1783,26 +1783,26 @@ void PRCPolyLine::serializePolyLine(PRCbitStream &pbs)
}
void PRCCircle::serializeCircle(PRCbitStream &pbs)
-{
- WriteUnsignedInteger (PRC_TYPE_CRV_Circle)
+{
+ WriteUnsignedInteger (PRC_TYPE_CRV_Circle)
- SerializeContentCurve
+ SerializeContentCurve
SerializeTransformation
SerializeParameterization
WriteDouble ( radius )
}
void PRCComposite::serializeComposite(PRCbitStream &pbs)
-{
+{
uint32_t i=0;
- WriteUnsignedInteger (PRC_TYPE_CRV_Composite)
+ WriteUnsignedInteger (PRC_TYPE_CRV_Composite)
- SerializeContentCurve
+ SerializeContentCurve
SerializeTransformation
SerializeParameterization
uint32_t number_of_curves = base_curve.size();
- WriteUnsignedInteger ( number_of_curves )
- for (i=0; i<number_of_curves; i++)
+ WriteUnsignedInteger ( number_of_curves )
+ for (i=0; i<number_of_curves; i++)
{
SerializePtrCurve ( base_curve[i] )
WriteBoolean ( base_sense[i] )
@@ -1811,8 +1811,8 @@ void PRCComposite::serializeComposite(PRCbitStream &pbs)
}
void PRCTopoContext::serializeTopoContext(PRCbitStream &pbs)
-{
- WriteUnsignedInteger (PRC_TYPE_TOPO_Context)
+{
+ WriteUnsignedInteger (PRC_TYPE_TOPO_Context)
SerializeContentPRCBase
WriteCharacter ( behaviour )
@@ -1827,32 +1827,32 @@ void PRCTopoContext::serializeTopoContext(PRCbitStream &pbs)
}
void PRCTopoContext::serializeContextAndBodies(PRCbitStream &pbs)
-{
+{
uint32_t i=0;
- SerializeTopoContext
+ SerializeTopoContext
uint32_t number_of_bodies = body.size();
- WriteUnsignedInteger (number_of_bodies)
- for (i=0;i<number_of_bodies;i++)
- SerializeBody (body[i])
+ WriteUnsignedInteger (number_of_bodies)
+ for (i=0;i<number_of_bodies;i++)
+ SerializeBody (body[i])
}
void PRCTopoContext::serializeGeometrySummary(PRCbitStream &pbs)
-{
+{
uint32_t i=0;
uint32_t number_of_bodies = body.size();
- WriteUnsignedInteger (number_of_bodies)
- for (i=0;i<number_of_bodies;i++)
+ WriteUnsignedInteger (number_of_bodies)
+ for (i=0;i<number_of_bodies;i++)
{
- WriteUnsignedInteger ( body[i]->serialType() )
+ WriteUnsignedInteger ( body[i]->serialType() )
if ( IsCompressedType(body[i]->serialType()) )
{
- WriteDouble ( body[i]->serialTolerance() )
+ WriteDouble ( body[i]->serialTolerance() )
}
}
}
void PRCTopoContext::serializeContextGraphics(PRCbitStream &pbs)
-{
+{
uint32_t i=0, j=0, k=0, l=0;
ResetCurrentGraphics
uint32_t number_of_body = body.size();
@@ -1888,17 +1888,17 @@ void PRCTopoContext::serializeContextGraphics(PRCbitStream &pbs)
uint32_t number_of_treat_type = 0;
if (has_graphics && !element.empty())
number_of_treat_type = 1;
- WriteUnsignedInteger (number_of_treat_type)
- for (i=0;i<number_of_treat_type;i++)
+ WriteUnsignedInteger (number_of_treat_type)
+ for (i=0;i<number_of_treat_type;i++)
{
const uint32_t element_type = PRC_TYPE_TOPO_Face;
- WriteUnsignedInteger (element_type)
+ WriteUnsignedInteger (element_type)
const uint32_t number_of_element = element.size();
- WriteUnsignedInteger (number_of_element)
- for (j=0;j<number_of_element;j++)
+ WriteUnsignedInteger (number_of_element)
+ for (j=0;j<number_of_element;j++)
{
- WriteBoolean ( element[j]->has_graphics() )
- if (element[j]->has_graphics())
+ WriteBoolean ( element[j]->has_graphics() )
+ if (element[j]->has_graphics())
{
element[j]->serializeGraphics(pbs);
}
@@ -1929,26 +1929,26 @@ uint32_t PRCTopoContext::addCompressedBrepData(PRCCompressedBrepData*& pCompress
void PRCSingleWireBody::serializeSingleWireBody(PRCbitStream &pbs)
{
- WriteUnsignedInteger ( PRC_TYPE_TOPO_SingleWireBody)
+ WriteUnsignedInteger ( PRC_TYPE_TOPO_SingleWireBody)
- SerializeContentBody
+ SerializeContentBody
SerializePtrTopology ( wire_edge )
}
void PRCUniqueId::serializeCompressedUniqueId(PRCbitStream &pbs) const
{
- WriteUnsignedInteger (id0)
- WriteUnsignedInteger (id1)
- WriteUnsignedInteger (id2)
- WriteUnsignedInteger (id3)
+ WriteUnsignedInteger (id0)
+ WriteUnsignedInteger (id1)
+ WriteUnsignedInteger (id2)
+ WriteUnsignedInteger (id3)
}
void PRCUniqueId::serializeFileStructureUncompressedUniqueId(std::ostream& out) const
{
- WriteUncompressedUnsignedInteger (id0)
- WriteUncompressedUnsignedInteger (id1)
- WriteUncompressedUnsignedInteger (id2)
- WriteUncompressedUnsignedInteger (id3)
+ WriteUncompressedUnsignedInteger (id0)
+ WriteUncompressedUnsignedInteger (id1)
+ WriteUncompressedUnsignedInteger (id2)
+ WriteUncompressedUnsignedInteger (id3)
}
void PRCUnit::serializeUnit(PRCbitStream &pbs)
@@ -1959,11 +1959,11 @@ void PRCUnit::serializeUnit(PRCbitStream &pbs)
void PRCProductOccurrence::serializeProductOccurrence(PRCbitStream &pbs)
{
- WriteUnsignedInteger ( PRC_TYPE_ASM_ProductOccurence )
+ WriteUnsignedInteger ( PRC_TYPE_ASM_ProductOccurence )
- SerializePRCBaseWithGraphics
+ SerializePRCBaseWithGraphics
-// SerializeReferencesOfProductOccurrence
+// SerializeReferencesOfProductOccurrence
WriteUnsignedInteger (index_part+1)
WriteUnsignedInteger (index_prototype+1)
if (index_prototype != m1)
@@ -1995,16 +1995,16 @@ void PRCProductOccurrence::serializeProductOccurrence(PRCbitStream &pbs)
WriteBit (has_location)
if (has_location)
location->serializeTransformation3d (pbs);
-
+
WriteUnsignedInteger (0) // number_of_references
-
+
// SerializeMarkups (markups)
- WriteUnsignedInteger (0) // number_of_linked_items
- WriteUnsignedInteger (0) // number_of_leaders
- WriteUnsignedInteger (0) // number_of_markups
- WriteUnsignedInteger (0) // number_of_annotation_entities
+ WriteUnsignedInteger (0) // number_of_linked_items
+ WriteUnsignedInteger (0) // number_of_leaders
+ WriteUnsignedInteger (0) // number_of_markups
+ WriteUnsignedInteger (0) // number_of_annotation_entities
+
-
WriteUnsignedInteger (0) // number_of_views
WriteBit (false) // has_entity_filter
WriteUnsignedInteger (0) // number_of_display_filters
@@ -2064,8 +2064,8 @@ uint32_t PRCPartDefinition::addRepresentationItem(PRCRepresentationItem*& pRepre
void PRCPartDefinition::serializePartDefinition(PRCbitStream &pbs)
{
- WriteUnsignedInteger ( PRC_TYPE_ASM_PartDefinition )
-
+ WriteUnsignedInteger ( PRC_TYPE_ASM_PartDefinition )
+
SerializePRCBaseWithGraphics
SerializeBoundingBox
@@ -2073,13 +2073,13 @@ void PRCPartDefinition::serializePartDefinition(PRCbitStream &pbs)
WriteUnsignedInteger (number_of_representation_items)
for (uint32_t i=0;i<number_of_representation_items;i++)
SerializeRepresentationItem (representation_item[i])
-
+
// SerializeMarkups (markups)
- WriteUnsignedInteger (0) // number_of_linked_items
- WriteUnsignedInteger (0) // number_of_leaders
- WriteUnsignedInteger (0) // number_of_markups
- WriteUnsignedInteger (0) // number_of_annotation_entities
+ WriteUnsignedInteger (0) // number_of_linked_items
+ WriteUnsignedInteger (0) // number_of_leaders
+ WriteUnsignedInteger (0) // number_of_markups
+ WriteUnsignedInteger (0) // number_of_annotation_entities
WriteUnsignedInteger (0) // number_of_views
SerializeUserData
-}
+}
diff --git a/graphics/asymptote/primitives.h b/graphics/asymptote/primitives.h
index 1d9f88e2d6..cbf37601c7 100644
--- a/graphics/asymptote/primitives.h
+++ b/graphics/asymptote/primitives.h
@@ -35,7 +35,7 @@ PRIMITIVE(path3,Path3,path3)
PRIMITIVE(cycleToken,CycleToken,cycleToken)
PRIMITIVE(tensionSpecifier,TensionSpecifier,tensionSpecifier)
PRIMITIVE(curlSpecifier,CurlSpecifier,curlSpecifier)
- PRIMITIVE(pen,Pen,pen)
+PRIMITIVE(pen,Pen,pen)
PRIMITIVE(picture,Picture,frame)
PRIMITIVE(file,File,file)
PRIMITIVE(code,Code,code)
diff --git a/graphics/asymptote/profiler.h b/graphics/asymptote/profiler.h
index 4c69d8d7f6..b799e6ba25 100644
--- a/graphics/asymptote/profiler.h
+++ b/graphics/asymptote/profiler.h
@@ -8,7 +8,9 @@
#ifndef PROFILER_H
#define PROFILER_H
+#if !defined(_WIN32)
#include <sys/time.h>
+#endif
#include <iostream>
@@ -23,13 +25,13 @@ string lookupBltin(bltin b);
inline position positionFromLambda(lambda *func) {
if (func == 0)
- return position();
+ return nullPos;
program& code = *func->code;
// Check for empty program.
if (code.begin() == code.end())
- return position();
+ return nullPos;
return code.begin()->pos;
}
diff --git a/graphics/asymptote/psfile.cc b/graphics/asymptote/psfile.cc
index 60152e8d18..39ab4f12ed 100644
--- a/graphics/asymptote/psfile.cc
+++ b/graphics/asymptote/psfile.cc
@@ -122,7 +122,9 @@ void psfile::close()
if(out) {
out->flush();
if(!filename.empty()) {
-#ifdef __MSDOS__
+#if defined(_MSC_VER)
+
+#else
chmod(filename.c_str(),~settings::mask & 0777);
#endif
if(!out->good())
@@ -152,8 +154,7 @@ void psfile::prologue(const bbox& box)
{
header(true);
BoundingBox(box);
- *out << "%%Creator: " << settings::PROGRAM << " " << settings::VERSION
- << REVISION << newl;
+ *out << "%%Creator: " << PACKAGE_NAME << " " << REVISION << newl;
time_t t; time(&t);
struct tm *tt = localtime(&t);
diff --git a/graphics/asymptote/quick-start-win32.ps1 b/graphics/asymptote/quick-start-win32.ps1
new file mode 100644
index 0000000000..c29cfc78d5
--- /dev/null
+++ b/graphics/asymptote/quick-start-win32.ps1
@@ -0,0 +1,60 @@
+#!/usr/bin/env pwsh
+
+# Windows check
+if ($PSVersionTable.PSVersion.Major -gt 5)
+{
+ if (-Not $IsWindows)
+ {
+ Write-Output "This script is only for windows."
+ Break
+ }
+}
+
+# check for vcpkg
+$vcpkgDefaultLoc = "$env:USERPROFILE/.vcpkg"
+if (-Not $env:VCPKG_ROOT)
+{
+ Write-Host "VCPKG_ROOT Not found, checking for $vcpkgDefaultLoc"
+ if (-Not (Test-Path $vcpkgDefaultLoc/vcpkg.exe))
+ {
+ Write-Host "vcpkg not found; will clone vcpkg"
+ Remove-Item -Force -Recurse $vcpkgDefaultLoc
+ git clone https://github.com/microsoft/vcpkg.git "$vcpkgDefaultLoc"
+
+ Push-Location "$vcpkgDefaultLoc"
+ & ./bootstrap-vcpkg.bat
+ Pop-Location
+ }
+ else
+ {
+ Write-Host "vcpkg.exe found, will pull to latest"
+ Push-Location "$vcpkgDefaultLoc"
+ git pull --autostash
+ Pop-Location
+ }
+
+ $env:VCPKG_ROOT = $vcpkgDefaultLoc
+}
+else
+{
+ Write-Host "Using VCPKG_ROOT at $($env:VCPKG_ROOT)"
+}
+
+# check for visual studio
+$vsInfo = Get-CimInstance MSFT_VSInstance -Namespace root/cimv2/vs
+if ($vsInfo -eq $null)
+{
+ Write-Output "Visual Studio not found. Please install visual studio."
+ Break
+}
+
+Write-Output "Using $($vsInfo.Name) at $($vsInfo.InstallLocation)"
+& "$($vsInfo.InstallLocation)\Common7\Tools\Launch-VsDevShell.ps1" -Arch amd64 -HostArch amd64 -SkipAutomaticLocation
+
+cmake --preset msvc/release
+
+Write-Output "Configuration done. Please run
+cmake --build --preset msvc/release --target asy-with-basefiles
+to build Asymptote."
+
+Exit-PSSession
diff --git a/graphics/asymptote/record.cc b/graphics/asymptote/record.cc
index 380490c100..2da10ca40a 100644
--- a/graphics/asymptote/record.cc
+++ b/graphics/asymptote/record.cc
@@ -68,7 +68,7 @@ dummyRecord::dummyRecord(string s)
void dummyRecord::add(string name, ty *t, trans::access *a,
trans::permission perm) {
e.addVar(symbol::trans(name),
- new trans::varEntry(t, a, perm, this, this, position()));
+ new trans::varEntry(t, a, perm, this, this, nullPos));
}
void dummyRecord::add(string name, function *t, vm::bltin f,
diff --git a/graphics/asymptote/record.h b/graphics/asymptote/record.h
index 323a3d5878..cd57716198 100644
--- a/graphics/asymptote/record.h
+++ b/graphics/asymptote/record.h
@@ -52,6 +52,10 @@ public:
return name;
}
+ symbol getTemplateIndex() {
+ return getName(); // May change in the future.
+ }
+
bool isReference() {
return true;
}
diff --git a/graphics/asymptote/requirements.lint.txt b/graphics/asymptote/requirements.lint.txt
new file mode 100644
index 0000000000..1608735be1
--- /dev/null
+++ b/graphics/asymptote/requirements.lint.txt
@@ -0,0 +1,3 @@
+black~=24.8.0
+isort~=5.13.2
+pylint~=3.3.1
diff --git a/graphics/asymptote/revision.cc b/graphics/asymptote/revision.cc
index 7f032d5189..618eb8f59e 100644
--- a/graphics/asymptote/revision.cc
+++ b/graphics/asymptote/revision.cc
@@ -1,2 +1,2 @@
-const char *REVISION="2.90";
+const char *REVISION="3.00";
const char *AsyGLVersion="1.02";
diff --git a/graphics/asymptote/rounding.h b/graphics/asymptote/rounding.h
index 4c02d0042a..57f565199d 100644
--- a/graphics/asymptote/rounding.h
+++ b/graphics/asymptote/rounding.h
@@ -51,11 +51,16 @@ static fpu_control_t fpu_init;
# else /* not __FreeBSD__ */
# ifdef WIN32
# ifdef _MSC_VER
-# include <float.h>
+# ifdef _M_IX86 /* only supported on x86 systems (not 64 bit) */
+# include <float.h>
static unsigned int fpu_init;
-# define FPU_ROUND_DOUBLE (fpu_init = _controlfp (0, 0), \
- _controlfp (_PC_53, MCW_PC))
-# define FPU_RESTORE (_controlfp (fpu_init, 0xfffff))
+# define FPU_ROUND_DOUBLE (fpu_init = _controlfp (0, 0), \
+ _controlfp (_PC_53, MCW_PC))
+# define FPU_RESTORE (_controlfp (fpu_init, 0xfffff))
+# else /* _M_X64 */
+# define FPU_ROUND_DOUBLE
+# define FPU_RESTORE
+# endif /* _M_X64 */
# elif __MINGW32__
# include <float.h>
static unsigned int fpu_init;
diff --git a/graphics/asymptote/runarray.cc b/graphics/asymptote/runarray.cc
index f841e0f522..fd3425e71d 100644
--- a/graphics/asymptote/runarray.cc
+++ b/graphics/asymptote/runarray.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runarray.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runarray.in"
+#line 1 "./runarray.in"
/*****
* runarray.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -655,10 +655,10 @@ void integeroverflow(size_t i)
#endif
namespace run {
// Create an empty array.
-#line 610 "runarray.in"
+#line 610 "./runarray.in"
void emptyArray(stack *Stack)
{
-#line 611 "runarray.in"
+#line 611 "./runarray.in"
{Stack->push<array*>(new array(0)); return;}
}
@@ -667,11 +667,11 @@ void emptyArray(stack *Stack)
// is popped off the stack, followed by each dimension in reverse order.
// The array itself is technically a one dimensional array of one
// dimension arrays and so on.
-#line 620 "runarray.in"
+#line 620 "./runarray.in"
void newDeepArray(stack *Stack)
{
Int depth=vm::pop<Int>(Stack);
-#line 621 "runarray.in"
+#line 621 "./runarray.in"
assert(depth > 0);
Int *dims = new Int[depth];
@@ -690,11 +690,11 @@ void newDeepArray(stack *Stack)
// Creates an array with elements already specified. First, the number
// of elements is popped off the stack, followed by each element in
// reverse order.
-#line 640 "runarray.in"
+#line 640 "./runarray.in"
void newInitializedArray(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 641 "runarray.in"
+#line 641 "./runarray.in"
assert(n >= 0);
array *a = new array(n);
@@ -707,12 +707,12 @@ void newInitializedArray(stack *Stack)
// Similar to newInitializedArray, but after the n elements, append another
// array to it.
-#line 654 "runarray.in"
+#line 654 "./runarray.in"
void newAppendedArray(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
array* tail=vm::pop<array*>(Stack);
-#line 655 "runarray.in"
+#line 655 "./runarray.in"
assert(n >= 0);
array *a = new array(n);
@@ -729,14 +729,14 @@ void newAppendedArray(stack *Stack)
// typeDepth is the true depth of the array determined at compile-time when the
// operations for the array type are added. This typeDepth argument is
// automatically pushed on the stack and is not visible to the user.
-#line 672 "runarray.in"
+#line 672 "./runarray.in"
void copyArrayValue(stack *Stack)
{
Int typeDepth=vm::pop<Int>(Stack);
Int depth=vm::pop<Int>(Stack,Int_MAX);
item value=vm::pop(Stack);
Int n=vm::pop<Int>(Stack);
-#line 673 "runarray.in"
+#line 673 "./runarray.in"
if(n < 0) error("cannot create a negative length array");
if(depth < 0) error("cannot copy to a negative depth");
if(depth > typeDepth) depth=typeDepth;
@@ -747,13 +747,13 @@ void copyArrayValue(stack *Stack)
// typeDepth is the true depth of the array determined at compile-time when the
// operations for the array type are added. This typeDepth argument is
// automatically pushed on the stack and is not visible to the user.
-#line 684 "runarray.in"
+#line 684 "./runarray.in"
void copyArray(stack *Stack)
{
Int typeDepth=vm::pop<Int>(Stack);
Int depth=vm::pop<Int>(Stack,Int_MAX);
array * a=vm::pop<array *>(Stack);
-#line 685 "runarray.in"
+#line 685 "./runarray.in"
if(a == 0) vm::error(dereferenceNullArray);
if(depth < 0) error("cannot copy to a negative depth");
if(depth > typeDepth) depth=typeDepth;
@@ -761,12 +761,12 @@ void copyArray(stack *Stack)
}
// Read an element from an array. Checks for initialization & bounds.
-#line 693 "runarray.in"
+#line 693 "./runarray.in"
void arrayRead(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 694 "runarray.in"
+#line 694 "./runarray.in"
item& i=arrayRead(a,n);
if (i.empty()) {
ostringstream buf;
@@ -777,37 +777,37 @@ void arrayRead(stack *Stack)
}
// Slice a substring from an array.
-#line 705 "runarray.in"
+#line 705 "./runarray.in"
void arraySliceRead(stack *Stack)
{
Int right=vm::pop<Int>(Stack);
Int left=vm::pop<Int>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 706 "runarray.in"
+#line 706 "./runarray.in"
checkArray(a);
{Stack->push(a->slice(left, right)); return;}
}
// Slice a substring from an array. This implements the cases a[i:] and a[:]
// where the endpoint is not given, and assumed to be the length of the array.
-#line 713 "runarray.in"
+#line 713 "./runarray.in"
void arraySliceReadToEnd(stack *Stack)
{
Int left=vm::pop<Int>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 714 "runarray.in"
+#line 714 "./runarray.in"
size_t len=checkArray(a);
{Stack->push(a->slice(left, (Int)len)); return;}
}
// Read an element from an array of arrays. Check bounds and initialize
// as necessary.
-#line 721 "runarray.in"
+#line 721 "./runarray.in"
void arrayArrayRead(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 722 "runarray.in"
+#line 722 "./runarray.in"
item& i=arrayRead(a,n);
if (i.empty()) i=new array(0);
{Stack->push(i); return;}
@@ -815,13 +815,13 @@ void arrayArrayRead(stack *Stack)
// Write an element to an array. Increase size if necessary.
// TODO: Add arrayWriteAndPop
-#line 730 "runarray.in"
+#line 730 "./runarray.in"
void arrayWrite(stack *Stack)
{
item value=vm::pop(Stack);
Int n=vm::pop<Int>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 731 "runarray.in"
+#line 731 "./runarray.in"
size_t len=checkArray(a);
bool cyclic=a->cyclic();
if(cyclic && len > 0) n=imod(n,len);
@@ -835,27 +835,27 @@ void arrayWrite(stack *Stack)
{Stack->push(value); return;}
}
-#line 745 "runarray.in"
+#line 745 "./runarray.in"
void arraySliceWrite(stack *Stack)
{
array * src=vm::pop<array *>(Stack);
Int right=vm::pop<Int>(Stack);
Int left=vm::pop<Int>(Stack);
array * dest=vm::pop<array *>(Stack);
-#line 746 "runarray.in"
+#line 746 "./runarray.in"
checkArray(src);
checkArray(dest);
dest->setSlice(left, right, src);
{Stack->push<array*>(src); return;}
}
-#line 753 "runarray.in"
+#line 753 "./runarray.in"
void arraySliceWriteToEnd(stack *Stack)
{
array * src=vm::pop<array *>(Stack);
Int left=vm::pop<Int>(Stack);
array * dest=vm::pop<array *>(Stack);
-#line 754 "runarray.in"
+#line 754 "./runarray.in"
checkArray(src);
size_t len=checkArray(dest);
dest->setSlice(left, (Int) len, src);
@@ -863,20 +863,20 @@ void arraySliceWriteToEnd(stack *Stack)
}
// Returns the length of an array.
-#line 762 "runarray.in"
+#line 762 "./runarray.in"
void arrayLength(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 763 "runarray.in"
+#line 763 "./runarray.in"
{Stack->push<Int>((Int) checkArray(a)); return;}
}
// Returns an array of integers representing the keys of the array.
-#line 768 "runarray.in"
+#line 768 "./runarray.in"
void arrayKeys(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 769 "runarray.in"
+#line 769 "./runarray.in"
size_t size=checkArray(a);
array *keys=new array();
@@ -890,33 +890,33 @@ void arrayKeys(stack *Stack)
}
// Return the cyclic flag for an array.
-#line 783 "runarray.in"
+#line 783 "./runarray.in"
void arrayCyclicFlag(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 784 "runarray.in"
+#line 784 "./runarray.in"
checkArray(a);
{Stack->push<bool>(a->cyclic()); return;}
}
-#line 789 "runarray.in"
+#line 789 "./runarray.in"
void arraySetCyclicFlag(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
bool b=vm::pop<bool>(Stack);
-#line 790 "runarray.in"
+#line 790 "./runarray.in"
checkArray(a);
a->cyclic(b);
{Stack->push<bool>(b); return;}
}
// Check to see if an array element is initialized.
-#line 797 "runarray.in"
+#line 797 "./runarray.in"
void arrayInitializedHelper(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
Int n=vm::pop<Int>(Stack);
-#line 798 "runarray.in"
+#line 798 "./runarray.in"
size_t len=checkArray(a);
bool cyclic=a->cyclic();
if(cyclic && len > 0) n=imod(n,len);
@@ -926,62 +926,62 @@ void arrayInitializedHelper(stack *Stack)
}
// Returns the initialize method for an array.
-#line 808 "runarray.in"
+#line 808 "./runarray.in"
void arrayInitialized(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 809 "runarray.in"
+#line 809 "./runarray.in"
{Stack->push<callable*>(new thunk(new bfunc(arrayInitializedHelper),a)); return;}
}
// The helper function for the cyclic method that sets the cyclic flag.
-#line 814 "runarray.in"
+#line 814 "./runarray.in"
void arrayCyclicHelper(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
bool b=vm::pop<bool>(Stack);
-#line 815 "runarray.in"
+#line 815 "./runarray.in"
checkArray(a);
a->cyclic(b);
}
// Set the cyclic flag for an array.
-#line 821 "runarray.in"
+#line 821 "./runarray.in"
void arrayCyclic(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 822 "runarray.in"
+#line 822 "./runarray.in"
{Stack->push<callable*>(new thunk(new bfunc(arrayCyclicHelper),a)); return;}
}
// The helper function for the push method that does the actual operation.
-#line 827 "runarray.in"
+#line 827 "./runarray.in"
void arrayPushHelper(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
item x=vm::pop(Stack);
-#line 828 "runarray.in"
+#line 828 "./runarray.in"
checkArray(a);
a->push(x);
{Stack->push(x); return;}
}
// Returns the push method for an array.
-#line 835 "runarray.in"
+#line 835 "./runarray.in"
void arrayPush(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 836 "runarray.in"
+#line 836 "./runarray.in"
{Stack->push<callable*>(new thunk(new bfunc(arrayPushHelper),a)); return;}
}
// The helper function for the append method that appends b to a.
-#line 841 "runarray.in"
+#line 841 "./runarray.in"
void arrayAppendHelper(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
array * b=vm::pop<array *>(Stack);
-#line 842 "runarray.in"
+#line 842 "./runarray.in"
checkArray(a);
size_t size=checkArray(b);
for(size_t i=0; i < size; i++)
@@ -989,20 +989,20 @@ void arrayAppendHelper(stack *Stack)
}
// Returns the append method for an array.
-#line 850 "runarray.in"
+#line 850 "./runarray.in"
void arrayAppend(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 851 "runarray.in"
+#line 851 "./runarray.in"
{Stack->push<callable*>(new thunk(new bfunc(arrayAppendHelper),a)); return;}
}
// The helper function for the pop method.
-#line 856 "runarray.in"
+#line 856 "./runarray.in"
void arrayPopHelper(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 857 "runarray.in"
+#line 857 "./runarray.in"
size_t asize=checkArray(a);
if(asize == 0)
error("cannot pop element from empty array");
@@ -1010,22 +1010,22 @@ void arrayPopHelper(stack *Stack)
}
// Returns the pop method for an array.
-#line 865 "runarray.in"
+#line 865 "./runarray.in"
void arrayPop(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 866 "runarray.in"
+#line 866 "./runarray.in"
{Stack->push<callable*>(new thunk(new bfunc(arrayPopHelper),a)); return;}
}
// The helper function for the insert method.
-#line 871 "runarray.in"
+#line 871 "./runarray.in"
void arrayInsertHelper(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
array * x=vm::pop<array *>(Stack);
Int i=vm::pop<Int>(Stack);
-#line 872 "runarray.in"
+#line 872 "./runarray.in"
size_t asize=checkArray(a);
checkArray(x);
if(a->cyclic() && asize > 0) i=imod(i,asize);
@@ -1035,39 +1035,39 @@ void arrayInsertHelper(stack *Stack)
}
// Returns the insert method for an array.
-#line 882 "runarray.in"
+#line 882 "./runarray.in"
void arrayInsert(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 883 "runarray.in"
+#line 883 "./runarray.in"
{Stack->push<callable*>(new thunk(new bfunc(arrayInsertHelper),a)); return;}
}
// Returns the delete method for an array.
-#line 888 "runarray.in"
+#line 888 "./runarray.in"
void arrayDelete(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 889 "runarray.in"
+#line 889 "./runarray.in"
{Stack->push<callable*>(new thunk(new bfunc(arrayDeleteHelper),a)); return;}
}
-#line 893 "runarray.in"
+#line 893 "./runarray.in"
void arrayAlias(stack *Stack)
{
array * b=vm::pop<array *>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 894 "runarray.in"
+#line 894 "./runarray.in"
{Stack->push<bool>(a==b); return;}
}
// Return array formed by indexing array a with elements of integer array b
-#line 899 "runarray.in"
+#line 899 "./runarray.in"
void arrayIntArray(stack *Stack)
{
array * b=vm::pop<array *>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 900 "runarray.in"
+#line 900 "./runarray.in"
size_t asize=checkArray(a);
size_t bsize=checkArray(b);
array *r=new array(bsize);
@@ -1085,13 +1085,13 @@ void arrayIntArray(stack *Stack)
// returns the complement of the integer array a in {0,2,...,n-1},
// so that b[complement(a,b.length)] yields the complement of b[a].
-#line 918 "runarray.in"
+#line 918 "./runarray.in"
// Intarray* complement(Intarray *a, Int n);
void gen_runarray32(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
Intarray * a=vm::pop<Intarray *>(Stack);
-#line 919 "runarray.in"
+#line 919 "./runarray.in"
size_t asize=checkArray(a);
array *r=new array(0);
bool *keep=new bool[n];
@@ -1108,12 +1108,12 @@ void gen_runarray32(stack *Stack)
}
// Generate the sequence {f(i) : i=0,1,...n-1} given a function f and integer n
-#line 936 "runarray.in"
+#line 936 "./runarray.in"
void arraySequence(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
callable * f=vm::pop<callable *>(Stack);
-#line 937 "runarray.in"
+#line 937 "./runarray.in"
if(n < 0) n=0;
array *a=new array(n);
for(Int i=0; i < n; ++i) {
@@ -1125,12 +1125,12 @@ void arraySequence(stack *Stack)
}
// Return the array {0,1,...n-1}
-#line 949 "runarray.in"
+#line 949 "./runarray.in"
// Intarray* sequence(Int n);
void gen_runarray34(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 950 "runarray.in"
+#line 950 "./runarray.in"
if(n < 0) n=0;
array *a=new array(n);
for(Int i=0; i < n; ++i) {
@@ -1140,12 +1140,12 @@ void gen_runarray34(stack *Stack)
}
// Apply a function to each element of an array
-#line 960 "runarray.in"
+#line 960 "./runarray.in"
void arrayFunction(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
callable * f=vm::pop<callable *>(Stack);
-#line 961 "runarray.in"
+#line 961 "./runarray.in"
size_t size=checkArray(a);
array *b=new array(size);
for(size_t i=0; i < size; ++i) {
@@ -1156,13 +1156,13 @@ void arrayFunction(stack *Stack)
{Stack->push<array*>(b); return;}
}
-#line 972 "runarray.in"
+#line 972 "./runarray.in"
void arraySort(stack *Stack)
{
bool stable=vm::pop<bool>(Stack,true);
callable * less=vm::pop<callable *>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 973 "runarray.in"
+#line 973 "./runarray.in"
array *c=copyArray(a);
compareFunc=less;
FuncStack=Stack;
@@ -1171,13 +1171,13 @@ void arraySort(stack *Stack)
{Stack->push<array*>(c); return;}
}
-#line 982 "runarray.in"
+#line 982 "./runarray.in"
void arraySearch(stack *Stack)
{
callable * less=vm::pop<callable *>(Stack);
item key=vm::pop(Stack);
array * a=vm::pop<array *>(Stack);
-#line 983 "runarray.in"
+#line 983 "./runarray.in"
size_t size=a->size();
compareFunc=less;
FuncStack=Stack;
@@ -1195,12 +1195,12 @@ void arraySearch(stack *Stack)
{Stack->push<Int>(0); return;}
}
-#line 1001 "runarray.in"
+#line 1001 "./runarray.in"
// bool all(boolarray *a);
void gen_runarray38(stack *Stack)
{
boolarray * a=vm::pop<boolarray *>(Stack);
-#line 1002 "runarray.in"
+#line 1002 "./runarray.in"
size_t size=checkArray(a);
bool c=true;
for(size_t i=0; i < size; i++)
@@ -1208,12 +1208,12 @@ void gen_runarray38(stack *Stack)
{Stack->push<bool>(c); return;}
}
-#line 1010 "runarray.in"
+#line 1010 "./runarray.in"
// boolarray* !(boolarray* a);
void gen_runarray39(stack *Stack)
{
boolarray* a=vm::pop<boolarray*>(Stack);
-#line 1011 "runarray.in"
+#line 1011 "./runarray.in"
size_t size=checkArray(a);
array *c=new array(size);
for(size_t i=0; i < size; i++)
@@ -1221,12 +1221,12 @@ void gen_runarray39(stack *Stack)
{Stack->push<boolarray*>(c); return;}
}
-#line 1019 "runarray.in"
+#line 1019 "./runarray.in"
// Int sum(boolarray *a);
void gen_runarray40(stack *Stack)
{
boolarray * a=vm::pop<boolarray *>(Stack);
-#line 1020 "runarray.in"
+#line 1020 "./runarray.in"
size_t size=checkArray(a);
Int sum=0;
for(size_t i=0; i < size; i++)
@@ -1234,11 +1234,11 @@ void gen_runarray40(stack *Stack)
{Stack->push<Int>(sum); return;}
}
-#line 1028 "runarray.in"
+#line 1028 "./runarray.in"
void arrayConcat(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 1029 "runarray.in"
+#line 1029 "./runarray.in"
// a is an array of arrays to be concatenated together.
// The signature is
// T[] concat(... T[][] a);
@@ -1265,11 +1265,11 @@ void arrayConcat(stack *Stack)
{Stack->push<array*>(result); return;}
}
-#line 1056 "runarray.in"
+#line 1056 "./runarray.in"
void array2Transpose(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 1057 "runarray.in"
+#line 1057 "./runarray.in"
size_t asize=checkArray(a);
array *c=new array(0);
size_t csize=0;
@@ -1298,12 +1298,12 @@ void array2Transpose(stack *Stack)
// permutation (021 or 120, etc; original is 012).
// Transpose by sending respective members to the permutated locations:
// return the array obtained by putting a[i][j][k] into position perm{ijk}.
-#line 1086 "runarray.in"
+#line 1086 "./runarray.in"
void array3Transpose(stack *Stack)
{
array * perm=vm::pop<array *>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 1087 "runarray.in"
+#line 1087 "./runarray.in"
const size_t DIM=3;
if(checkArray(perm) != DIM) {
@@ -1387,13 +1387,13 @@ void array3Transpose(stack *Stack)
// Find the index of the nth true value in a boolean array or -1 if not found.
// If n is negative, search backwards.
-#line 1171 "runarray.in"
+#line 1171 "./runarray.in"
// Int find(boolarray *a, Int n=1);
void gen_runarray44(stack *Stack)
{
Int n=vm::pop<Int>(Stack,1);
boolarray * a=vm::pop<boolarray *>(Stack);
-#line 1172 "runarray.in"
+#line 1172 "./runarray.in"
size_t size=checkArray(a);
Int j=-1;
if(n > 0)
@@ -1410,12 +1410,12 @@ void gen_runarray44(stack *Stack)
}
// Find all indices of true values in a boolean array.
-#line 1189 "runarray.in"
+#line 1189 "./runarray.in"
// Intarray* findall(boolarray *a);
void gen_runarray45(stack *Stack)
{
boolarray * a=vm::pop<boolarray *>(Stack);
-#line 1190 "runarray.in"
+#line 1190 "./runarray.in"
size_t size=checkArray(a);
array *b=new array(0);
for(size_t i=0; i < size; i++) {
@@ -1428,13 +1428,13 @@ void gen_runarray45(stack *Stack)
// construct vector obtained by replacing those elements of b for which the
// corresponding elements of a are false by the corresponding element of c.
-#line 1203 "runarray.in"
+#line 1203 "./runarray.in"
void arrayConditional(stack *Stack)
{
array * c=vm::pop<array *>(Stack);
array * b=vm::pop<array *>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 1204 "runarray.in"
+#line 1204 "./runarray.in"
size_t size=checkArray(a);
array *r=new array(size);
if(b && c) {
@@ -1458,22 +1458,22 @@ void arrayConditional(stack *Stack)
}
// Return an n x n identity matrix.
-#line 1228 "runarray.in"
+#line 1228 "./runarray.in"
// realarray2* identity(Int n);
void gen_runarray47(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 1229 "runarray.in"
+#line 1229 "./runarray.in"
{Stack->push<realarray2*>(Identity(n)); return;}
}
// Return the inverse of an n x n matrix a using Gauss-Jordan elimination.
-#line 1234 "runarray.in"
+#line 1234 "./runarray.in"
// realarray2* inverse(realarray2 *a);
void gen_runarray48(stack *Stack)
{
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1235 "runarray.in"
+#line 1235 "./runarray.in"
size_t n=checkArray(a);
double *A;
copyArray2C(A,a,true,0,NoGC);
@@ -1486,14 +1486,14 @@ void gen_runarray48(stack *Stack)
// Solve the linear equation ax=b by LU decomposition, returning the
// solution x, where a is an n x n matrix and b is an array of length n.
// If no solution exists, return an empty array.
-#line 1248 "runarray.in"
+#line 1248 "./runarray.in"
// realarray* solve(realarray2 *a, realarray *b, bool warn=true);
void gen_runarray49(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
realarray * b=vm::pop<realarray *>(Stack);
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1249 "runarray.in"
+#line 1249 "./runarray.in"
size_t n=checkArray(a);
if(n == 0) {Stack->push<realarray*>(new array(0)); return;}
@@ -1545,14 +1545,14 @@ void gen_runarray49(stack *Stack)
// Solve the linear equation ax=b by LU decomposition, returning the
// solution x, where a is an n x n matrix and b is an n x m matrix.
// If no solution exists, return an empty array.
-#line 1301 "runarray.in"
+#line 1301 "./runarray.in"
// realarray2* solve(realarray2 *a, realarray2 *b, bool warn=true);
void gen_runarray50(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
realarray2 * b=vm::pop<realarray2 *>(Stack);
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1302 "runarray.in"
+#line 1302 "./runarray.in"
size_t n=checkArray(a);
if(n == 0) {Stack->push<realarray2*>(new array(0)); return;}
@@ -1614,12 +1614,12 @@ void gen_runarray50(stack *Stack)
}
// Compute the determinant of an n x n matrix.
-#line 1364 "runarray.in"
+#line 1364 "./runarray.in"
// real determinant(realarray2 *a);
void gen_runarray51(stack *Stack)
{
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1365 "runarray.in"
+#line 1365 "./runarray.in"
real *A;
copyArray2C(A,a);
size_t n=checkArray(a);
@@ -1634,13 +1634,13 @@ void gen_runarray51(stack *Stack)
{Stack->push<real>(det); return;}
}
-#line 1380 "runarray.in"
+#line 1380 "./runarray.in"
// realarray* *(realarray2 *a, realarray *b);
void gen_runarray52(stack *Stack)
{
realarray * b=vm::pop<realarray *>(Stack);
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1381 "runarray.in"
+#line 1381 "./runarray.in"
size_t n=checkArray(a);
size_t m=checkArray(b);
array *c=new array(n);
@@ -1658,13 +1658,13 @@ void gen_runarray52(stack *Stack)
{Stack->push<realarray*>(c); return;}
}
-#line 1399 "runarray.in"
+#line 1399 "./runarray.in"
// realarray* *(realarray *a, realarray2 *b);
void gen_runarray53(stack *Stack)
{
realarray2 * b=vm::pop<realarray2 *>(Stack);
realarray * a=vm::pop<realarray *>(Stack);
-#line 1400 "runarray.in"
+#line 1400 "./runarray.in"
size_t n=checkArray(a);
if(n != checkArray(b)) error(incommensurate);
real *A;
@@ -1692,62 +1692,62 @@ void gen_runarray53(stack *Stack)
{Stack->push<realarray*>(c); return;}
}
-#line 1428 "runarray.in"
+#line 1428 "./runarray.in"
// Intarray2* *(Intarray2 *a, Intarray2 *b);
void gen_runarray54(stack *Stack)
{
Intarray2 * b=vm::pop<Intarray2 *>(Stack);
Intarray2 * a=vm::pop<Intarray2 *>(Stack);
-#line 1429 "runarray.in"
+#line 1429 "./runarray.in"
{Stack->push<Intarray2*>(mult<Int>(a,b)); return;}
}
-#line 1433 "runarray.in"
+#line 1433 "./runarray.in"
// realarray2* *(realarray2 *a, realarray2 *b);
void gen_runarray55(stack *Stack)
{
realarray2 * b=vm::pop<realarray2 *>(Stack);
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1434 "runarray.in"
+#line 1434 "./runarray.in"
{Stack->push<realarray2*>(mult<real>(a,b)); return;}
}
-#line 1438 "runarray.in"
+#line 1438 "./runarray.in"
// pairarray2* *(pairarray2 *a, pairarray2 *b);
void gen_runarray56(stack *Stack)
{
pairarray2 * b=vm::pop<pairarray2 *>(Stack);
pairarray2 * a=vm::pop<pairarray2 *>(Stack);
-#line 1439 "runarray.in"
+#line 1439 "./runarray.in"
{Stack->push<pairarray2*>(mult<pair>(a,b)); return;}
}
-#line 1443 "runarray.in"
+#line 1443 "./runarray.in"
// triple *(realarray2 *t, triple v);
void gen_runarray57(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
realarray2 * t=vm::pop<realarray2 *>(Stack);
-#line 1444 "runarray.in"
+#line 1444 "./runarray.in"
{Stack->push<triple>(*t*v); return;}
}
-#line 1448 "runarray.in"
+#line 1448 "./runarray.in"
// realarray2* AtA(realarray2 *a);
void gen_runarray58(stack *Stack)
{
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1449 "runarray.in"
+#line 1449 "./runarray.in"
{Stack->push<realarray2*>(AtA<real>(a)); return;}
}
-#line 1453 "runarray.in"
+#line 1453 "./runarray.in"
// pair project(triple v, realarray2 *t);
void gen_runarray59(stack *Stack)
{
realarray2 * t=vm::pop<realarray2 *>(Stack);
triple v=vm::pop<triple>(Stack);
-#line 1454 "runarray.in"
+#line 1454 "./runarray.in"
size_t n=checkArray(t);
if(n != 4) error(incommensurate);
array *t0=read<array*>(t,0);
@@ -1772,13 +1772,13 @@ void gen_runarray59(stack *Stack)
}
// Compute the dot product of vectors a and b.
-#line 1479 "runarray.in"
+#line 1479 "./runarray.in"
// real dot(realarray *a, realarray *b);
void gen_runarray60(stack *Stack)
{
realarray * b=vm::pop<realarray *>(Stack);
realarray * a=vm::pop<realarray *>(Stack);
-#line 1480 "runarray.in"
+#line 1480 "./runarray.in"
size_t n=checkArrays(a,b);
real sum=0.0;
for(size_t i=0; i < n; ++i)
@@ -1787,13 +1787,13 @@ void gen_runarray60(stack *Stack)
}
// Compute the complex dot product of vectors a and b.
-#line 1489 "runarray.in"
+#line 1489 "./runarray.in"
// pair dot(pairarray *a, pairarray *b);
void gen_runarray61(stack *Stack)
{
pairarray * b=vm::pop<pairarray *>(Stack);
pairarray * a=vm::pop<pairarray *>(Stack);
-#line 1490 "runarray.in"
+#line 1490 "./runarray.in"
size_t n=checkArrays(a,b);
pair sum=zero;
for(size_t i=0; i < n; ++i)
@@ -1808,7 +1808,7 @@ void gen_runarray61(stack *Stack)
// [ a[2] b[2] c[2] ]
// [ ... ]
// [ c[n-1] a[n-1] b[n-1] ]
-#line 1505 "runarray.in"
+#line 1505 "./runarray.in"
// realarray* tridiagonal(realarray *a, realarray *b, realarray *c, realarray *f);
void gen_runarray62(stack *Stack)
{
@@ -1816,7 +1816,7 @@ void gen_runarray62(stack *Stack)
realarray * c=vm::pop<realarray *>(Stack);
realarray * b=vm::pop<realarray *>(Stack);
realarray * a=vm::pop<realarray *>(Stack);
-#line 1506 "runarray.in"
+#line 1506 "./runarray.in"
size_t n=checkArrays(a,b);
checkEqual(n,checkArray(c));
checkEqual(n,checkArray(f));
@@ -1913,7 +1913,7 @@ void gen_runarray62(stack *Stack)
}
// Root solve by Newton-Raphson
-#line 1603 "runarray.in"
+#line 1603 "./runarray.in"
// real newton(Int iterations=100, callableReal *f, callableReal *fprime, real x, bool verbose=false);
void gen_runarray63(stack *Stack)
{
@@ -1922,7 +1922,7 @@ void gen_runarray63(stack *Stack)
callableReal * fprime=vm::pop<callableReal *>(Stack);
callableReal * f=vm::pop<callableReal *>(Stack);
Int iterations=vm::pop<Int>(Stack,100);
-#line 1605 "runarray.in"
+#line 1605 "./runarray.in"
static const real fuzz=1000.0*DBL_EPSILON;
Int i=0;
size_t oldPrec=0;
@@ -1968,7 +1968,7 @@ void gen_runarray63(stack *Stack)
// Root solve by Newton-Raphson bisection
// cf. routine rtsafe (Press et al., Numerical Recipes, 1991).
-#line 1651 "runarray.in"
+#line 1651 "./runarray.in"
// real newton(Int iterations=100, callableReal *f, callableReal *fprime, real x1, real x2, bool verbose=false);
void gen_runarray64(stack *Stack)
{
@@ -1978,7 +1978,7 @@ void gen_runarray64(stack *Stack)
callableReal * fprime=vm::pop<callableReal *>(Stack);
callableReal * f=vm::pop<callableReal *>(Stack);
Int iterations=vm::pop<Int>(Stack,100);
-#line 1653 "runarray.in"
+#line 1653 "./runarray.in"
static const real fuzz=1000.0*DBL_EPSILON;
size_t oldPrec=0;
if(verbose)
@@ -2064,7 +2064,7 @@ void gen_runarray64(stack *Stack)
// In this implementation, the binary search is interleaved
// with a modified version of quadratic interpolation.
// This is a C++ port of the Asymptote routine written by Charles Staats III.
-#line 1739 "runarray.in"
+#line 1739 "./runarray.in"
// real _findroot(callableReal *f, real a, real b, real tolerance, real fa, real fb);
void gen_runarray65(stack *Stack)
{
@@ -2074,7 +2074,7 @@ void gen_runarray65(stack *Stack)
real b=vm::pop<real>(Stack);
real a=vm::pop<real>(Stack);
callableReal * f=vm::pop<callableReal *>(Stack);
-#line 1741 "runarray.in"
+#line 1741 "./runarray.in"
if(fa == 0.0) {Stack->push<real>(a); return;}
if(fb == 0.0) {Stack->push<real>(b); return;}
@@ -2166,7 +2166,7 @@ void gen_runarray65(stack *Stack)
{Stack->push<real>(a-(b-a)/(fb-fa)*fa); return;}
}
-#line 1833 "runarray.in"
+#line 1833 "./runarray.in"
// real simpson(callableReal *f, real a, real b, real acc=DBL_EPSILON, real dxmax=0);
void gen_runarray66(stack *Stack)
{
@@ -2175,7 +2175,7 @@ void gen_runarray66(stack *Stack)
real b=vm::pop<real>(Stack);
real a=vm::pop<real>(Stack);
callableReal * f=vm::pop<callableReal *>(Stack);
-#line 1835 "runarray.in"
+#line 1835 "./runarray.in"
real integral;
if(dxmax <= 0) dxmax=fabs(b-a);
callable *oldFunc=Func;
@@ -2188,13 +2188,13 @@ void gen_runarray66(stack *Stack)
}
// Compute the fast Fourier transform of a pair array
-#line 1848 "runarray.in"
+#line 1848 "./runarray.in"
// pairarray* fft(pairarray *a, Int sign=1);
void gen_runarray67(stack *Stack)
{
Int sign=vm::pop<Int>(Stack,1);
pairarray * a=vm::pop<pairarray *>(Stack);
-#line 1849 "runarray.in"
+#line 1849 "./runarray.in"
#ifdef HAVE_LIBFFTW3
unsigned n=(unsigned) checkArray(a);
array *c=new array(n);
@@ -2224,13 +2224,13 @@ void gen_runarray67(stack *Stack)
}
// Compute the fast Fourier transform of a 2D pair array
-#line 1879 "runarray.in"
+#line 1879 "./runarray.in"
// pairarray2* fft(pairarray2 *a, Int sign=1);
void gen_runarray68(stack *Stack)
{
Int sign=vm::pop<Int>(Stack,1);
pairarray2 * a=vm::pop<pairarray2 *>(Stack);
-#line 1880 "runarray.in"
+#line 1880 "./runarray.in"
#ifdef HAVE_LIBFFTW3
size_t n=checkArray(a);
size_t m=n == 0 ? 0 : checkArray(read<array*>(a,0));
@@ -2275,13 +2275,13 @@ void gen_runarray68(stack *Stack)
}
// Compute the fast Fourier transform of a 3D pair array
-#line 1925 "runarray.in"
+#line 1925 "./runarray.in"
// pairarray3* fft(pairarray3 *a, Int sign=1);
void gen_runarray69(stack *Stack)
{
Int sign=vm::pop<Int>(Stack,1);
pairarray3 * a=vm::pop<pairarray3 *>(Stack);
-#line 1926 "runarray.in"
+#line 1926 "./runarray.in"
#ifdef HAVE_LIBFFTW3
size_t n=checkArray(a);
array *a0=read<array*>(a,0);
@@ -2339,12 +2339,12 @@ void gen_runarray69(stack *Stack)
}
// Compute the real Schur decomposition of a 2D pair array
-#line 1984 "runarray.in"
+#line 1984 "./runarray.in"
// realarray3* _schur(realarray2 *a);
void gen_runarray70(stack *Stack)
{
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1985 "runarray.in"
+#line 1985 "./runarray.in"
#ifdef HAVE_EIGEN_DENSE
size_t n=checkArray(a);
@@ -2391,12 +2391,12 @@ void gen_runarray70(stack *Stack)
}
// Compute the Schur decomposition of a 2D pair array
-#line 2032 "runarray.in"
+#line 2032 "./runarray.in"
// pairarray3* _schur(pairarray2 *a);
void gen_runarray71(stack *Stack)
{
pairarray2 * a=vm::pop<pairarray2 *>(Stack);
-#line 2033 "runarray.in"
+#line 2033 "./runarray.in"
#ifdef HAVE_EIGEN_DENSE
size_t n=checkArray(a);
@@ -2446,12 +2446,12 @@ void gen_runarray71(stack *Stack)
{Stack->push<pairarray3*>(S); return;}
}
-#line 2083 "runarray.in"
+#line 2083 "./runarray.in"
// Intarray2* triangulate(pairarray *z);
void gen_runarray72(stack *Stack)
{
pairarray * z=vm::pop<pairarray *>(Stack);
-#line 2084 "runarray.in"
+#line 2084 "./runarray.in"
size_t nv=checkArray(z);
// Call robust version of Gilles Dumoulin's port of Paul Bourke's
// triangulation code.
@@ -2485,12 +2485,12 @@ void gen_runarray72(stack *Stack)
{Stack->push<Intarray2*>(t); return;}
}
-#line 2118 "runarray.in"
+#line 2118 "./runarray.in"
// real norm(realarray *a);
void gen_runarray73(stack *Stack)
{
realarray * a=vm::pop<realarray *>(Stack);
-#line 2119 "runarray.in"
+#line 2119 "./runarray.in"
size_t n=checkArray(a);
real M=0.0;
for(size_t i=0; i < n; ++i) {
@@ -2500,12 +2500,12 @@ void gen_runarray73(stack *Stack)
{Stack->push<real>(M); return;}
}
-#line 2129 "runarray.in"
+#line 2129 "./runarray.in"
// real norm(realarray2 *a);
void gen_runarray74(stack *Stack)
{
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 2130 "runarray.in"
+#line 2130 "./runarray.in"
size_t n=checkArray(a);
real M=0.0;
for(size_t i=0; i < n; ++i) {
@@ -2519,12 +2519,12 @@ void gen_runarray74(stack *Stack)
{Stack->push<real>(M); return;}
}
-#line 2144 "runarray.in"
+#line 2144 "./runarray.in"
// real norm(triplearray2 *a);
void gen_runarray75(stack *Stack)
{
triplearray2 * a=vm::pop<triplearray2 *>(Stack);
-#line 2145 "runarray.in"
+#line 2145 "./runarray.in"
size_t n=checkArray(a);
real M=0.0;
for(size_t i=0; i < n; ++i) {
@@ -2538,12 +2538,12 @@ void gen_runarray75(stack *Stack)
{Stack->push<real>(sqrt(M)); return;}
}
-#line 2159 "runarray.in"
+#line 2159 "./runarray.in"
// real change2(triplearray2 *a);
void gen_runarray76(stack *Stack)
{
triplearray2 * a=vm::pop<triplearray2 *>(Stack);
-#line 2160 "runarray.in"
+#line 2160 "./runarray.in"
size_t n=checkArray(a);
if(n == 0) {Stack->push<real>(0.0); return;}
@@ -2564,13 +2564,13 @@ void gen_runarray76(stack *Stack)
{Stack->push<real>(M); return;}
}
-#line 2181 "runarray.in"
+#line 2181 "./runarray.in"
// triple minbezier(triplearray2 *P, triple b);
void gen_runarray77(stack *Stack)
{
triple b=vm::pop<triple>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
-#line 2182 "runarray.in"
+#line 2182 "./runarray.in"
size_t N;
real *A=copyTripleArray2Components(P,N);
bound_double *B=bounddouble(N);
@@ -2581,13 +2581,13 @@ void gen_runarray77(stack *Stack)
{Stack->push<triple>(b); return;}
}
-#line 2193 "runarray.in"
+#line 2193 "./runarray.in"
// triple maxbezier(triplearray2 *P, triple b);
void gen_runarray78(stack *Stack)
{
triple b=vm::pop<triple>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
-#line 2194 "runarray.in"
+#line 2194 "./runarray.in"
size_t N;
real *A=copyTripleArray2Components(P,N);
bound_double *B=bounddouble(N);
@@ -2598,13 +2598,13 @@ void gen_runarray78(stack *Stack)
{Stack->push<triple>(b); return;}
}
-#line 2205 "runarray.in"
+#line 2205 "./runarray.in"
// pair minratio(triplearray2 *P, pair b);
void gen_runarray79(stack *Stack)
{
pair b=vm::pop<pair>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
-#line 2206 "runarray.in"
+#line 2206 "./runarray.in"
size_t N;
triple *A=copyTripleArray2C(P,N);
real fuzz=Fuzz*norm(A,N);
@@ -2615,13 +2615,13 @@ void gen_runarray79(stack *Stack)
{Stack->push<pair>(b); return;}
}
-#line 2217 "runarray.in"
+#line 2217 "./runarray.in"
// pair maxratio(triplearray2 *P, pair b);
void gen_runarray80(stack *Stack)
{
pair b=vm::pop<pair>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
-#line 2218 "runarray.in"
+#line 2218 "./runarray.in"
size_t N;
triple *A=copyTripleArray2C(P,N);
bound_triple *B=boundtriple(N);
@@ -2632,11 +2632,11 @@ void gen_runarray80(stack *Stack)
{Stack->push<pair>(b); return;}
}
-#line 2229 "runarray.in"
+#line 2229 "./runarray.in"
// realarray* _projection();
void gen_runarray81(stack *Stack)
{
-#line 2230 "runarray.in"
+#line 2230 "./runarray.in"
#ifdef HAVE_GL
array *a=new array(14);
gl::projection P=gl::camera();
@@ -2673,169 +2673,169 @@ namespace trans {
void gen_runarray_venv(venv &ve)
{
-#line 609 "runarray.in"
+#line 609 "./runarray.in"
REGISTER_BLTIN(run::emptyArray,"emptyArray");
-#line 615 "runarray.in"
+#line 615 "./runarray.in"
REGISTER_BLTIN(run::newDeepArray,"newDeepArray");
-#line 637 "runarray.in"
+#line 637 "./runarray.in"
REGISTER_BLTIN(run::newInitializedArray,"newInitializedArray");
-#line 652 "runarray.in"
+#line 652 "./runarray.in"
REGISTER_BLTIN(run::newAppendedArray,"newAppendedArray");
-#line 668 "runarray.in"
+#line 668 "./runarray.in"
REGISTER_BLTIN(run::copyArrayValue,"copyArrayValue");
-#line 680 "runarray.in"
+#line 680 "./runarray.in"
REGISTER_BLTIN(run::copyArray,"copyArray");
-#line 692 "runarray.in"
+#line 692 "./runarray.in"
REGISTER_BLTIN(run::arrayRead,"arrayRead");
-#line 704 "runarray.in"
+#line 704 "./runarray.in"
REGISTER_BLTIN(run::arraySliceRead,"arraySliceRead");
-#line 711 "runarray.in"
+#line 711 "./runarray.in"
REGISTER_BLTIN(run::arraySliceReadToEnd,"arraySliceReadToEnd");
-#line 719 "runarray.in"
+#line 719 "./runarray.in"
REGISTER_BLTIN(run::arrayArrayRead,"arrayArrayRead");
-#line 728 "runarray.in"
+#line 728 "./runarray.in"
REGISTER_BLTIN(run::arrayWrite,"arrayWrite");
-#line 745 "runarray.in"
+#line 745 "./runarray.in"
REGISTER_BLTIN(run::arraySliceWrite,"arraySliceWrite");
-#line 753 "runarray.in"
+#line 753 "./runarray.in"
REGISTER_BLTIN(run::arraySliceWriteToEnd,"arraySliceWriteToEnd");
-#line 761 "runarray.in"
+#line 761 "./runarray.in"
REGISTER_BLTIN(run::arrayLength,"arrayLength");
-#line 767 "runarray.in"
+#line 767 "./runarray.in"
REGISTER_BLTIN(run::arrayKeys,"arrayKeys");
-#line 782 "runarray.in"
+#line 782 "./runarray.in"
REGISTER_BLTIN(run::arrayCyclicFlag,"arrayCyclicFlag");
-#line 789 "runarray.in"
+#line 789 "./runarray.in"
REGISTER_BLTIN(run::arraySetCyclicFlag,"arraySetCyclicFlag");
-#line 796 "runarray.in"
+#line 796 "./runarray.in"
REGISTER_BLTIN(run::arrayInitializedHelper,"arrayInitializedHelper");
-#line 807 "runarray.in"
+#line 807 "./runarray.in"
REGISTER_BLTIN(run::arrayInitialized,"arrayInitialized");
-#line 813 "runarray.in"
+#line 813 "./runarray.in"
REGISTER_BLTIN(run::arrayCyclicHelper,"arrayCyclicHelper");
-#line 820 "runarray.in"
+#line 820 "./runarray.in"
REGISTER_BLTIN(run::arrayCyclic,"arrayCyclic");
-#line 826 "runarray.in"
+#line 826 "./runarray.in"
REGISTER_BLTIN(run::arrayPushHelper,"arrayPushHelper");
-#line 834 "runarray.in"
+#line 834 "./runarray.in"
REGISTER_BLTIN(run::arrayPush,"arrayPush");
-#line 840 "runarray.in"
+#line 840 "./runarray.in"
REGISTER_BLTIN(run::arrayAppendHelper,"arrayAppendHelper");
-#line 849 "runarray.in"
+#line 849 "./runarray.in"
REGISTER_BLTIN(run::arrayAppend,"arrayAppend");
-#line 855 "runarray.in"
+#line 855 "./runarray.in"
REGISTER_BLTIN(run::arrayPopHelper,"arrayPopHelper");
-#line 864 "runarray.in"
+#line 864 "./runarray.in"
REGISTER_BLTIN(run::arrayPop,"arrayPop");
-#line 870 "runarray.in"
+#line 870 "./runarray.in"
REGISTER_BLTIN(run::arrayInsertHelper,"arrayInsertHelper");
-#line 881 "runarray.in"
+#line 881 "./runarray.in"
REGISTER_BLTIN(run::arrayInsert,"arrayInsert");
-#line 887 "runarray.in"
+#line 887 "./runarray.in"
REGISTER_BLTIN(run::arrayDelete,"arrayDelete");
-#line 893 "runarray.in"
+#line 893 "./runarray.in"
REGISTER_BLTIN(run::arrayAlias,"arrayAlias");
-#line 898 "runarray.in"
+#line 898 "./runarray.in"
REGISTER_BLTIN(run::arrayIntArray,"arrayIntArray");
-#line 916 "runarray.in"
+#line 916 "./runarray.in"
addFunc(ve, run::gen_runarray32, IntArray(), SYM(complement), formal(IntArray(), SYM(a), false, false), formal(primInt(), SYM(n), false, false));
-#line 935 "runarray.in"
+#line 935 "./runarray.in"
REGISTER_BLTIN(run::arraySequence,"arraySequence");
-#line 948 "runarray.in"
+#line 948 "./runarray.in"
addFunc(ve, run::gen_runarray34, IntArray(), SYM(sequence), formal(primInt(), SYM(n), false, false));
-#line 959 "runarray.in"
+#line 959 "./runarray.in"
REGISTER_BLTIN(run::arrayFunction,"arrayFunction");
-#line 972 "runarray.in"
+#line 972 "./runarray.in"
REGISTER_BLTIN(run::arraySort,"arraySort");
-#line 982 "runarray.in"
+#line 982 "./runarray.in"
REGISTER_BLTIN(run::arraySearch,"arraySearch");
-#line 1001 "runarray.in"
+#line 1001 "./runarray.in"
addFunc(ve, run::gen_runarray38, primBoolean(), SYM(all), formal(booleanArray(), SYM(a), false, false));
-#line 1010 "runarray.in"
+#line 1010 "./runarray.in"
addFunc(ve, run::gen_runarray39, booleanArray(), SYM_LOGNOT, formal(booleanArray(), SYM(a), false, false));
-#line 1019 "runarray.in"
+#line 1019 "./runarray.in"
addFunc(ve, run::gen_runarray40, primInt(), SYM(sum), formal(booleanArray(), SYM(a), false, false));
-#line 1028 "runarray.in"
+#line 1028 "./runarray.in"
REGISTER_BLTIN(run::arrayConcat,"arrayConcat");
-#line 1056 "runarray.in"
+#line 1056 "./runarray.in"
REGISTER_BLTIN(run::array2Transpose,"array2Transpose");
-#line 1082 "runarray.in"
+#line 1082 "./runarray.in"
REGISTER_BLTIN(run::array3Transpose,"array3Transpose");
-#line 1169 "runarray.in"
+#line 1169 "./runarray.in"
addFunc(ve, run::gen_runarray44, primInt(), SYM(find), formal(booleanArray(), SYM(a), false, false), formal(primInt(), SYM(n), true, false));
-#line 1188 "runarray.in"
+#line 1188 "./runarray.in"
addFunc(ve, run::gen_runarray45, IntArray(), SYM(findall), formal(booleanArray(), SYM(a), false, false));
-#line 1201 "runarray.in"
+#line 1201 "./runarray.in"
REGISTER_BLTIN(run::arrayConditional,"arrayConditional");
-#line 1227 "runarray.in"
+#line 1227 "./runarray.in"
addFunc(ve, run::gen_runarray47, realArray2(), SYM(identity), formal(primInt(), SYM(n), false, false));
-#line 1233 "runarray.in"
+#line 1233 "./runarray.in"
addFunc(ve, run::gen_runarray48, realArray2(), SYM(inverse), formal(realArray2(), SYM(a), false, false));
-#line 1245 "runarray.in"
+#line 1245 "./runarray.in"
addFunc(ve, run::gen_runarray49, realArray(), SYM(solve), formal(realArray2(), SYM(a), false, false), formal(realArray(), SYM(b), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 1298 "runarray.in"
+#line 1298 "./runarray.in"
addFunc(ve, run::gen_runarray50, realArray2(), SYM(solve), formal(realArray2(), SYM(a), false, false), formal(realArray2(), SYM(b), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 1363 "runarray.in"
+#line 1363 "./runarray.in"
addFunc(ve, run::gen_runarray51, primReal(), SYM(determinant), formal(realArray2(), SYM(a), false, false));
-#line 1380 "runarray.in"
+#line 1380 "./runarray.in"
addFunc(ve, run::gen_runarray52, realArray(), SYM_TIMES, formal(realArray2(), SYM(a), false, false), formal(realArray(), SYM(b), false, false));
-#line 1399 "runarray.in"
+#line 1399 "./runarray.in"
addFunc(ve, run::gen_runarray53, realArray(), SYM_TIMES, formal(realArray(), SYM(a), false, false), formal(realArray2(), SYM(b), false, false));
-#line 1428 "runarray.in"
+#line 1428 "./runarray.in"
addFunc(ve, run::gen_runarray54, IntArray2(), SYM_TIMES, formal(IntArray2(), SYM(a), false, false), formal(IntArray2(), SYM(b), false, false));
-#line 1433 "runarray.in"
+#line 1433 "./runarray.in"
addFunc(ve, run::gen_runarray55, realArray2(), SYM_TIMES, formal(realArray2(), SYM(a), false, false), formal(realArray2(), SYM(b), false, false));
-#line 1438 "runarray.in"
+#line 1438 "./runarray.in"
addFunc(ve, run::gen_runarray56, pairArray2(), SYM_TIMES, formal(pairArray2(), SYM(a), false, false), formal(pairArray2(), SYM(b), false, false));
-#line 1443 "runarray.in"
+#line 1443 "./runarray.in"
addFunc(ve, run::gen_runarray57, primTriple(), SYM_TIMES, formal(realArray2(), SYM(t), false, false), formal(primTriple(), SYM(v), false, false));
-#line 1448 "runarray.in"
+#line 1448 "./runarray.in"
addFunc(ve, run::gen_runarray58, realArray2(), SYM(AtA), formal(realArray2(), SYM(a), false, false));
-#line 1453 "runarray.in"
+#line 1453 "./runarray.in"
addFunc(ve, run::gen_runarray59, primPair(), SYM(project), formal(primTriple(), SYM(v), false, false), formal(realArray2(), SYM(t), false, false));
-#line 1478 "runarray.in"
+#line 1478 "./runarray.in"
addFunc(ve, run::gen_runarray60, primReal(), SYM(dot), formal(realArray(), SYM(a), false, false), formal(realArray(), SYM(b), false, false));
-#line 1488 "runarray.in"
+#line 1488 "./runarray.in"
addFunc(ve, run::gen_runarray61, primPair(), SYM(dot), formal(pairArray(), SYM(a), false, false), formal(pairArray(), SYM(b), false, false));
-#line 1498 "runarray.in"
+#line 1498 "./runarray.in"
addFunc(ve, run::gen_runarray62, realArray(), SYM(tridiagonal), formal(realArray(), SYM(a), false, false), formal(realArray(), SYM(b), false, false), formal(realArray(), SYM(c), false, false), formal(realArray(), SYM(f), false, false));
-#line 1602 "runarray.in"
+#line 1602 "./runarray.in"
addFunc(ve, run::gen_runarray63, primReal(), SYM(newton), formal(primInt(), SYM(iterations), true, false), formal(realRealFunction(), SYM(f), false, false), formal(realRealFunction(), SYM(fprime), false, false), formal(primReal(), SYM(x), false, false), formal(primBoolean(), SYM(verbose), true, false));
-#line 1649 "runarray.in"
+#line 1649 "./runarray.in"
addFunc(ve, run::gen_runarray64, primReal(), SYM(newton), formal(primInt(), SYM(iterations), true, false), formal(realRealFunction(), SYM(f), false, false), formal(realRealFunction(), SYM(fprime), false, false), formal(primReal(), SYM(x1), false, false), formal(primReal(), SYM(x2), false, false), formal(primBoolean(), SYM(verbose), true, false));
-#line 1731 "runarray.in"
+#line 1731 "./runarray.in"
addFunc(ve, run::gen_runarray65, primReal(), SYM(_findroot), formal(realRealFunction(), SYM(f), false, false), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false), formal(primReal(), SYM(tolerance), false, false), formal(primReal(), SYM(fa), false, false), formal(primReal(), SYM(fb), false, false));
-#line 1833 "runarray.in"
+#line 1833 "./runarray.in"
addFunc(ve, run::gen_runarray66, primReal(), SYM(simpson), formal(realRealFunction(), SYM(f), false, false), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false), formal(primReal(), SYM(acc), true, false), formal(primReal(), SYM(dxmax), true, false));
-#line 1847 "runarray.in"
+#line 1847 "./runarray.in"
addFunc(ve, run::gen_runarray67, pairArray(), SYM(fft), formal(pairArray(), SYM(a), false, false), formal(primInt(), SYM(sign), true, false));
-#line 1878 "runarray.in"
+#line 1878 "./runarray.in"
addFunc(ve, run::gen_runarray68, pairArray2(), SYM(fft), formal(pairArray2(), SYM(a), false, false), formal(primInt(), SYM(sign), true, false));
-#line 1924 "runarray.in"
+#line 1924 "./runarray.in"
addFunc(ve, run::gen_runarray69, pairArray3(), SYM(fft), formal(pairArray3(), SYM(a), false, false), formal(primInt(), SYM(sign), true, false));
-#line 1983 "runarray.in"
+#line 1983 "./runarray.in"
addFunc(ve, run::gen_runarray70, realArray3(), SYM(_schur), formal(realArray2(), SYM(a), false, false));
-#line 2031 "runarray.in"
+#line 2031 "./runarray.in"
addFunc(ve, run::gen_runarray71, pairArray3(), SYM(_schur), formal(pairArray2(), SYM(a), false, false));
-#line 2083 "runarray.in"
+#line 2083 "./runarray.in"
addFunc(ve, run::gen_runarray72, IntArray2(), SYM(triangulate), formal(pairArray(), SYM(z), false, false));
-#line 2118 "runarray.in"
+#line 2118 "./runarray.in"
addFunc(ve, run::gen_runarray73, primReal(), SYM(norm), formal(realArray(), SYM(a), false, false));
-#line 2129 "runarray.in"
+#line 2129 "./runarray.in"
addFunc(ve, run::gen_runarray74, primReal(), SYM(norm), formal(realArray2(), SYM(a), false, false));
-#line 2144 "runarray.in"
+#line 2144 "./runarray.in"
addFunc(ve, run::gen_runarray75, primReal(), SYM(norm), formal(tripleArray2(), SYM(a), false, false));
-#line 2159 "runarray.in"
+#line 2159 "./runarray.in"
addFunc(ve, run::gen_runarray76, primReal(), SYM(change2), formal(tripleArray2(), SYM(a), false, false));
-#line 2181 "runarray.in"
+#line 2181 "./runarray.in"
addFunc(ve, run::gen_runarray77, primTriple(), SYM(minbezier), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(b), false, false));
-#line 2193 "runarray.in"
+#line 2193 "./runarray.in"
addFunc(ve, run::gen_runarray78, primTriple(), SYM(maxbezier), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(b), false, false));
-#line 2205 "runarray.in"
+#line 2205 "./runarray.in"
addFunc(ve, run::gen_runarray79, primPair(), SYM(minratio), formal(tripleArray2(), SYM(p), false, false), formal(primPair(), SYM(b), false, false));
-#line 2217 "runarray.in"
+#line 2217 "./runarray.in"
addFunc(ve, run::gen_runarray80, primPair(), SYM(maxratio), formal(tripleArray2(), SYM(p), false, false), formal(primPair(), SYM(b), false, false));
-#line 2229 "runarray.in"
+#line 2229 "./runarray.in"
addFunc(ve, run::gen_runarray81, realArray(), SYM(_projection));
}
diff --git a/graphics/asymptote/runarray.h b/graphics/asymptote/runarray.h
index 0a1baf7267..e2112b530b 100644
--- a/graphics/asymptote/runarray.h
+++ b/graphics/asymptote/runarray.h
@@ -1,7 +1,6 @@
/***** Autogenerated from runarray.in; changes will be overwritten *****/
-#ifndef runarray_H
-#define runarray_H
+#pragma once
namespace run {
void emptyArray(vm::stack *);
void newDeepArray(vm::stack *);
@@ -45,4 +44,3 @@ void array3Transpose(vm::stack *);
void arrayConditional(vm::stack *);
}
-#endif // runarray_H
diff --git a/graphics/asymptote/runbacktrace.cc b/graphics/asymptote/runbacktrace.cc
index 14ad27acc8..a23e11b159 100644
--- a/graphics/asymptote/runbacktrace.cc
+++ b/graphics/asymptote/runbacktrace.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runbacktrace.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runbacktrace.in"
+#line 1 "./runbacktrace.in"
/*****
* backtrace.in
* Andy Hammerlindl 2009/07/28
@@ -19,7 +19,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -74,11 +74,11 @@ function *realRealFunction();
#endif
namespace run {
-#line 16 "runbacktrace.in"
+#line 16 "./runbacktrace.in"
// void generate_random_backtrace();
void gen_runbacktrace0(stack *)
{
-#line 17 "runbacktrace.in"
+#line 17 "./runbacktrace.in"
#if defined(USEGC) && defined(GC_DEBUG) && defined(GC_BACKTRACE)
GC_generate_random_backtrace();
#else
@@ -86,12 +86,12 @@ void gen_runbacktrace0(stack *)
#endif
}
-#line 25 "runbacktrace.in"
+#line 25 "./runbacktrace.in"
// void print_random_addresses(Int n=1);
void gen_runbacktrace1(stack *Stack)
{
Int n=vm::pop<Int>(Stack,1);
-#line 26 "runbacktrace.in"
+#line 26 "./runbacktrace.in"
#if defined(USEGC) && defined(GC_DEBUG) && defined(GC_BACKTRACE)
GC_gcollect();
for (Int i=0; i < n; ++i)
@@ -108,9 +108,9 @@ namespace trans {
void gen_runbacktrace_venv(venv &ve)
{
-#line 16 "runbacktrace.in"
+#line 16 "./runbacktrace.in"
addFunc(ve, run::gen_runbacktrace0, primVoid(), SYM(generate_random_backtrace));
-#line 25 "runbacktrace.in"
+#line 25 "./runbacktrace.in"
addFunc(ve, run::gen_runbacktrace1, primVoid(), SYM(print_random_addresses), formal(primInt(), SYM(n), true, false));
}
diff --git a/graphics/asymptote/runbacktrace.h b/graphics/asymptote/runbacktrace.h
index 9ddef1a996..14671e4b55 100644
--- a/graphics/asymptote/runbacktrace.h
+++ b/graphics/asymptote/runbacktrace.h
@@ -1,8 +1,6 @@
/***** Autogenerated from runbacktrace.in; changes will be overwritten *****/
-#ifndef runbacktrace_H
-#define runbacktrace_H
+#pragma once
namespace run {
}
-#endif // runbacktrace_H
diff --git a/graphics/asymptote/runfile.cc b/graphics/asymptote/runfile.cc
index 7ab1f0aad5..766600de06 100644
--- a/graphics/asymptote/runfile.cc
+++ b/graphics/asymptote/runfile.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runfile.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runfile.in"
+#line 1 "./runfile.in"
/*****
* runfile.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -67,8 +67,10 @@ function *realRealFunction();
#include "triple.h"
#include "array.h"
-#ifdef __CYGWIN__
- extern "C" int mkstemp(char *c);
+#if defined(_WIN32)
+#include <io.h>
+#else
+#include <unistd.h>
#endif
using namespace camp;
@@ -86,34 +88,34 @@ string commentchar="#";
#endif
namespace run {
-#line 28 "runfile.in"
+#line 30 "./runfile.in"
// bool ==(file *a, file *b);
void gen_runfile0(stack *Stack)
{
file * b=vm::pop<file *>(Stack);
file * a=vm::pop<file *>(Stack);
-#line 29 "runfile.in"
+#line 31 "./runfile.in"
{Stack->push<bool>(a == b); return;}
}
-#line 33 "runfile.in"
+#line 35 "./runfile.in"
// bool !=(file *a, file *b);
void gen_runfile1(stack *Stack)
{
file * b=vm::pop<file *>(Stack);
file * a=vm::pop<file *>(Stack);
-#line 34 "runfile.in"
+#line 36 "./runfile.in"
{Stack->push<bool>(a != b); return;}
}
-#line 38 "runfile.in"
+#line 40 "./runfile.in"
void nullFile(stack *Stack)
{
-#line 39 "runfile.in"
+#line 41 "./runfile.in"
{Stack->push<file*>(&camp::nullfile); return;}
}
-#line 43 "runfile.in"
+#line 45 "./runfile.in"
// file* input(string name=emptystring, bool check=true, string comment=commentchar, string mode=emptystring);
void gen_runfile3(stack *Stack)
{
@@ -121,7 +123,7 @@ void gen_runfile3(stack *Stack)
string comment=vm::pop<string>(Stack,commentchar);
bool check=vm::pop<bool>(Stack,true);
string name=vm::pop<string>(Stack,emptystring);
-#line 45 "runfile.in"
+#line 47 "./runfile.in"
file *f=NULL;
if(mode == "binary")
f=new ibfile(name,check);
@@ -150,7 +152,7 @@ void gen_runfile3(stack *Stack)
{Stack->push<file*>(f); return;}
}
-#line 74 "runfile.in"
+#line 76 "./runfile.in"
// file* output(string name=emptystring, bool update=false, string comment=commentchar, string mode=emptystring);
void gen_runfile4(stack *Stack)
{
@@ -158,7 +160,7 @@ void gen_runfile4(stack *Stack)
string comment=vm::pop<string>(Stack,commentchar);
bool update=vm::pop<bool>(Stack,false);
string name=vm::pop<string>(Stack,emptystring);
-#line 76 "runfile.in"
+#line 78 "./runfile.in"
file *f=NULL;
if(mode == "pipe") {
f=new opipe(name);
@@ -193,152 +195,152 @@ void gen_runfile4(stack *Stack)
{Stack->push<file*>(f); return;}
}
-#line 111 "runfile.in"
+#line 113 "./runfile.in"
// bool eof(file *f);
void gen_runfile5(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 112 "runfile.in"
+#line 114 "./runfile.in"
{Stack->push<bool>(f->eof()); return;}
}
-#line 116 "runfile.in"
+#line 118 "./runfile.in"
// bool eol(file *f);
void gen_runfile6(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 117 "runfile.in"
+#line 119 "./runfile.in"
{Stack->push<bool>(f->eol()); return;}
}
-#line 121 "runfile.in"
+#line 123 "./runfile.in"
// bool error(file *f);
void gen_runfile7(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 122 "runfile.in"
+#line 124 "./runfile.in"
{Stack->push<bool>(f->error()); return;}
}
-#line 126 "runfile.in"
+#line 128 "./runfile.in"
// void clear(file *f);
void gen_runfile8(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 127 "runfile.in"
+#line 129 "./runfile.in"
f->clear();
}
-#line 131 "runfile.in"
+#line 133 "./runfile.in"
// void close(file *f);
void gen_runfile9(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 132 "runfile.in"
+#line 134 "./runfile.in"
f->close();
}
-#line 136 "runfile.in"
+#line 138 "./runfile.in"
// Int precision(file *f=NULL, Int digits=0);
void gen_runfile10(stack *Stack)
{
Int digits=vm::pop<Int>(Stack,0);
file * f=vm::pop<file *>(Stack,NULL);
-#line 137 "runfile.in"
+#line 139 "./runfile.in"
if(f == 0) f=&camp::Stdout;
{Stack->push<Int>(f->precision(digits)); return;}
}
-#line 142 "runfile.in"
+#line 144 "./runfile.in"
// void flush(file *f);
void gen_runfile11(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 143 "runfile.in"
+#line 145 "./runfile.in"
f->flush();
}
-#line 147 "runfile.in"
+#line 149 "./runfile.in"
// string getc(file *f);
void gen_runfile12(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 148 "runfile.in"
+#line 150 "./runfile.in"
char c=0;
if(f->isOpen()) f->read(c);
{Stack->push<string>(string(1,c)); return;}
}
-#line 154 "runfile.in"
+#line 156 "./runfile.in"
// Int tell(file *f);
void gen_runfile13(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 155 "runfile.in"
+#line 157 "./runfile.in"
{Stack->push<Int>(f->tell()); return;}
}
-#line 159 "runfile.in"
+#line 161 "./runfile.in"
// void seek(file *f, Int pos);
void gen_runfile14(stack *Stack)
{
Int pos=vm::pop<Int>(Stack);
file * f=vm::pop<file *>(Stack);
-#line 160 "runfile.in"
+#line 162 "./runfile.in"
f->seek(pos,pos >= 0);
}
-#line 164 "runfile.in"
+#line 166 "./runfile.in"
// void seekeof(file *f);
void gen_runfile15(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 165 "runfile.in"
+#line 167 "./runfile.in"
f->seek(0,false);
}
-#line 169 "runfile.in"
+#line 171 "./runfile.in"
void namePart(stack *Stack)
{
file f=vm::pop<file>(Stack);
-#line 170 "runfile.in"
+#line 172 "./runfile.in"
{Stack->push<string>(f.filename()); return;}
}
-#line 174 "runfile.in"
+#line 176 "./runfile.in"
void modePart(stack *Stack)
{
file f=vm::pop<file>(Stack);
-#line 175 "runfile.in"
+#line 177 "./runfile.in"
{Stack->push<string>(f.FileMode()); return;}
}
// Set file dimensions
-#line 180 "runfile.in"
+#line 182 "./runfile.in"
void dimensionSetHelper(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
Int nz=vm::pop<Int>(Stack,-1);
Int ny=vm::pop<Int>(Stack,-1);
Int nx=vm::pop<Int>(Stack,-1);
-#line 181 "runfile.in"
+#line 183 "./runfile.in"
f->dimension(nx,ny,nz);
{Stack->push<file*>(f); return;}
}
-#line 186 "runfile.in"
+#line 188 "./runfile.in"
void dimensionSet(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 187 "runfile.in"
+#line 189 "./runfile.in"
{Stack->push<callable*>(new thunk(new bfunc(dimensionSetHelper),f)); return;}
}
-#line 191 "runfile.in"
+#line 193 "./runfile.in"
void dimensionPart(stack *Stack)
{
file f=vm::pop<file>(Stack);
-#line 192 "runfile.in"
+#line 194 "./runfile.in"
array *a=new array(3);
(*a)[0]=f.Nx();
(*a)[1]=f.Ny();
@@ -347,174 +349,174 @@ void dimensionPart(stack *Stack)
}
// Set file f to read arrays in line-at-a-time mode
-#line 201 "runfile.in"
+#line 203 "./runfile.in"
void lineSetHelper(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
bool b=vm::pop<bool>(Stack,true);
-#line 202 "runfile.in"
+#line 204 "./runfile.in"
f->LineMode(b);
{Stack->push<file*>(f); return;}
}
-#line 207 "runfile.in"
+#line 209 "./runfile.in"
void lineSet(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 208 "runfile.in"
+#line 210 "./runfile.in"
{Stack->push<callable*>(new thunk(new bfunc(lineSetHelper),f)); return;}
}
-#line 212 "runfile.in"
+#line 214 "./runfile.in"
void linePart(stack *Stack)
{
file f=vm::pop<file>(Stack);
-#line 213 "runfile.in"
+#line 215 "./runfile.in"
{Stack->push<bool>(f.LineMode()); return;}
}
// Set file to read comma-separated values
-#line 218 "runfile.in"
+#line 220 "./runfile.in"
void csvSetHelper(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
bool b=vm::pop<bool>(Stack,true);
-#line 219 "runfile.in"
+#line 221 "./runfile.in"
f->CSVMode(b);
{Stack->push<file*>(f); return;}
}
-#line 224 "runfile.in"
+#line 226 "./runfile.in"
void csvSet(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 225 "runfile.in"
+#line 227 "./runfile.in"
{Stack->push<callable*>(new thunk(new bfunc(csvSetHelper),f)); return;}
}
-#line 229 "runfile.in"
+#line 231 "./runfile.in"
void csvPart(stack *Stack)
{
file f=vm::pop<file>(Stack);
-#line 230 "runfile.in"
+#line 232 "./runfile.in"
{Stack->push<bool>(f.CSVMode()); return;}
}
// Set file to read whitespace-separated values
-#line 235 "runfile.in"
+#line 237 "./runfile.in"
void wordSetHelper(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
bool b=vm::pop<bool>(Stack,true);
-#line 236 "runfile.in"
+#line 238 "./runfile.in"
f->WordMode(b);
{Stack->push<file*>(f); return;}
}
-#line 241 "runfile.in"
+#line 243 "./runfile.in"
void wordSet(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 242 "runfile.in"
+#line 244 "./runfile.in"
{Stack->push<callable*>(new thunk(new bfunc(wordSetHelper),f)); return;}
}
-#line 246 "runfile.in"
+#line 248 "./runfile.in"
void wordPart(stack *Stack)
{
file f=vm::pop<file>(Stack);
-#line 247 "runfile.in"
+#line 249 "./runfile.in"
{Stack->push<bool>(f.WordMode()); return;}
}
// Set file to read/write single precision real XDR values.
-#line 252 "runfile.in"
+#line 254 "./runfile.in"
void singlerealSetHelper(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
bool b=vm::pop<bool>(Stack,true);
-#line 253 "runfile.in"
+#line 255 "./runfile.in"
f->SingleReal(b);
{Stack->push<file*>(f); return;}
}
-#line 258 "runfile.in"
+#line 260 "./runfile.in"
void singlerealSet(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 259 "runfile.in"
+#line 261 "./runfile.in"
{Stack->push<callable*>(new thunk(new bfunc(singlerealSetHelper),f)); return;}
}
-#line 263 "runfile.in"
+#line 265 "./runfile.in"
void singlerealPart(stack *Stack)
{
file f=vm::pop<file>(Stack);
-#line 264 "runfile.in"
+#line 266 "./runfile.in"
{Stack->push<bool>(f.SingleReal()); return;}
}
// Set file to read/write single precision int XDR values.
-#line 269 "runfile.in"
+#line 271 "./runfile.in"
void singleintSetHelper(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
bool b=vm::pop<bool>(Stack,true);
-#line 270 "runfile.in"
+#line 272 "./runfile.in"
f->SingleInt(b);
{Stack->push<file*>(f); return;}
}
-#line 275 "runfile.in"
+#line 277 "./runfile.in"
void singleintSet(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 276 "runfile.in"
+#line 278 "./runfile.in"
{Stack->push<callable*>(new thunk(new bfunc(singleintSetHelper),f)); return;}
}
-#line 280 "runfile.in"
+#line 282 "./runfile.in"
void singleintPart(stack *Stack)
{
file f=vm::pop<file>(Stack);
-#line 281 "runfile.in"
+#line 283 "./runfile.in"
{Stack->push<bool>(f.SingleInt()); return;}
}
// Set file to read/write signed int XDR values.
-#line 286 "runfile.in"
+#line 288 "./runfile.in"
void signedintSetHelper(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
bool b=vm::pop<bool>(Stack,true);
-#line 287 "runfile.in"
+#line 289 "./runfile.in"
f->SignedInt(b);
{Stack->push<file*>(f); return;}
}
-#line 292 "runfile.in"
+#line 294 "./runfile.in"
void signedintSet(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 293 "runfile.in"
+#line 295 "./runfile.in"
{Stack->push<callable*>(new thunk(new bfunc(signedintSetHelper),f)); return;}
}
-#line 297 "runfile.in"
+#line 299 "./runfile.in"
void signedintPart(stack *Stack)
{
file f=vm::pop<file>(Stack);
-#line 298 "runfile.in"
+#line 300 "./runfile.in"
{Stack->push<bool>(f.SignedInt()); return;}
}
// Set file to read an arrayi (i int sizes followed by an i-dimensional array)
-#line 303 "runfile.in"
+#line 305 "./runfile.in"
void readSetHelper(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
Int i=vm::pop<Int>(Stack);
-#line 304 "runfile.in"
+#line 306 "./runfile.in"
switch(i) {
case 1:
f->dimension(-2);
@@ -535,21 +537,21 @@ void readSetHelper(stack *Stack)
{Stack->push<file*>(f); return;}
}
-#line 325 "runfile.in"
+#line 327 "./runfile.in"
void readSet(stack *Stack)
{
file * f=vm::pop<file *>(Stack);
-#line 326 "runfile.in"
+#line 328 "./runfile.in"
{Stack->push<callable*>(new thunk(new bfunc(readSetHelper),f)); return;}
}
// Delete file named s.
-#line 331 "runfile.in"
+#line 333 "./runfile.in"
// Int delete(string s);
void gen_runfile41(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 332 "runfile.in"
+#line 334 "./runfile.in"
s=outpath(s);
Int rc=unlink(s.c_str());
if(rc == 0 && verbose > 0)
@@ -558,13 +560,13 @@ void gen_runfile41(stack *Stack)
}
// Rename file "from" to file "to".
-#line 341 "runfile.in"
+#line 343 "./runfile.in"
// Int rename(string from, string to);
void gen_runfile42(stack *Stack)
{
string to=vm::pop<string>(Stack);
string from=vm::pop<string>(Stack);
-#line 342 "runfile.in"
+#line 344 "./runfile.in"
from=outpath(from);
to=outpath(to);
Int rc=rename(from.c_str(),to.c_str());
@@ -574,21 +576,53 @@ void gen_runfile42(stack *Stack)
}
// Create a uniquely named temporary file.
-#line 352 "runfile.in"
+#line 354 "./runfile.in"
// string mktemp(string s);
void gen_runfile43(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 353 "runfile.in"
- char *S=StrdupMalloc(s+"XXXXXX");
+#line 355 "./runfile.in"
+ string baseTemplate=s+"XXXXXX";
+ char *S=StrdupMalloc(baseTemplate);
+ bool success=true;
+#if defined(_WIN32)
+ if (_mktemp_s(S,baseTemplate.length()+1) != 0)
+ {
+ success = false;
+ }
+ FILE* fp;
+ if (success && (fopen_s(&fp,S,"w") != 0))
+ {
+ success = false;
+ }
+#else
int fd=mkstemp(S);
- if(fd < 0) {
+ if (fd < 0)
+ {
+ success = false;
+ }
+#endif
+ if(!success)
+ {
ostringstream buf;
buf << "Could not create unique temporary filename based on " << s;
error(buf);
}
string T(S);
free(S);
+
+#if defined(_WIN32)
+ bool closeSuccess = fclose(fp) == 0;
+#else
+ bool closeSuccess = close(fd) == 0;
+#endif
+
+ if (!closeSuccess)
+ {
+ ostringstream buf;
+ buf << "Could not finalize temporary file based on " << s;
+ error(buf);
+ }
{Stack->push<string>(T); return;}
}
@@ -598,93 +632,93 @@ namespace trans {
void gen_runfile_venv(venv &ve)
{
-#line 28 "runfile.in"
+#line 30 "./runfile.in"
addFunc(ve, run::gen_runfile0, primBoolean(), SYM_EQ, formal(primFile(), SYM(a), false, false), formal(primFile(), SYM(b), false, false));
-#line 33 "runfile.in"
+#line 35 "./runfile.in"
addFunc(ve, run::gen_runfile1, primBoolean(), SYM_NEQ, formal(primFile(), SYM(a), false, false), formal(primFile(), SYM(b), false, false));
-#line 38 "runfile.in"
+#line 40 "./runfile.in"
REGISTER_BLTIN(run::nullFile,"nullFile");
-#line 43 "runfile.in"
+#line 45 "./runfile.in"
addFunc(ve, run::gen_runfile3, primFile(), SYM(input), formal(primString(), SYM(name), true, false), formal(primBoolean(), SYM(check), true, false), formal(primString(), SYM(comment), true, false), formal(primString(), SYM(mode), true, false));
-#line 74 "runfile.in"
+#line 76 "./runfile.in"
addFunc(ve, run::gen_runfile4, primFile(), SYM(output), formal(primString(), SYM(name), true, false), formal(primBoolean(), SYM(update), true, false), formal(primString(), SYM(comment), true, false), formal(primString(), SYM(mode), true, false));
-#line 111 "runfile.in"
+#line 113 "./runfile.in"
addFunc(ve, run::gen_runfile5, primBoolean(), SYM(eof), formal(primFile(), SYM(f), false, false));
-#line 116 "runfile.in"
+#line 118 "./runfile.in"
addFunc(ve, run::gen_runfile6, primBoolean(), SYM(eol), formal(primFile(), SYM(f), false, false));
-#line 121 "runfile.in"
+#line 123 "./runfile.in"
addFunc(ve, run::gen_runfile7, primBoolean(), SYM(error), formal(primFile(), SYM(f), false, false));
-#line 126 "runfile.in"
+#line 128 "./runfile.in"
addFunc(ve, run::gen_runfile8, primVoid(), SYM(clear), formal(primFile(), SYM(f), false, false));
-#line 131 "runfile.in"
+#line 133 "./runfile.in"
addFunc(ve, run::gen_runfile9, primVoid(), SYM(close), formal(primFile(), SYM(f), false, false));
-#line 136 "runfile.in"
+#line 138 "./runfile.in"
addFunc(ve, run::gen_runfile10, primInt(), SYM(precision), formal(primFile(), SYM(f), true, false), formal(primInt(), SYM(digits), true, false));
-#line 142 "runfile.in"
+#line 144 "./runfile.in"
addFunc(ve, run::gen_runfile11, primVoid(), SYM(flush), formal(primFile(), SYM(f), false, false));
-#line 147 "runfile.in"
+#line 149 "./runfile.in"
addFunc(ve, run::gen_runfile12, primString(), SYM(getc), formal(primFile(), SYM(f), false, false));
-#line 154 "runfile.in"
+#line 156 "./runfile.in"
addFunc(ve, run::gen_runfile13, primInt(), SYM(tell), formal(primFile(), SYM(f), false, false));
-#line 159 "runfile.in"
+#line 161 "./runfile.in"
addFunc(ve, run::gen_runfile14, primVoid(), SYM(seek), formal(primFile(), SYM(f), false, false), formal(primInt(), SYM(pos), false, false));
-#line 164 "runfile.in"
+#line 166 "./runfile.in"
addFunc(ve, run::gen_runfile15, primVoid(), SYM(seekeof), formal(primFile(), SYM(f), false, false));
-#line 169 "runfile.in"
+#line 171 "./runfile.in"
REGISTER_BLTIN(run::namePart,"namePart");
-#line 174 "runfile.in"
+#line 176 "./runfile.in"
REGISTER_BLTIN(run::modePart,"modePart");
-#line 179 "runfile.in"
+#line 181 "./runfile.in"
REGISTER_BLTIN(run::dimensionSetHelper,"dimensionSetHelper");
-#line 186 "runfile.in"
+#line 188 "./runfile.in"
REGISTER_BLTIN(run::dimensionSet,"dimensionSet");
-#line 191 "runfile.in"
+#line 193 "./runfile.in"
REGISTER_BLTIN(run::dimensionPart,"dimensionPart");
-#line 200 "runfile.in"
+#line 202 "./runfile.in"
REGISTER_BLTIN(run::lineSetHelper,"lineSetHelper");
-#line 207 "runfile.in"
+#line 209 "./runfile.in"
REGISTER_BLTIN(run::lineSet,"lineSet");
-#line 212 "runfile.in"
+#line 214 "./runfile.in"
REGISTER_BLTIN(run::linePart,"linePart");
-#line 217 "runfile.in"
+#line 219 "./runfile.in"
REGISTER_BLTIN(run::csvSetHelper,"csvSetHelper");
-#line 224 "runfile.in"
+#line 226 "./runfile.in"
REGISTER_BLTIN(run::csvSet,"csvSet");
-#line 229 "runfile.in"
+#line 231 "./runfile.in"
REGISTER_BLTIN(run::csvPart,"csvPart");
-#line 234 "runfile.in"
+#line 236 "./runfile.in"
REGISTER_BLTIN(run::wordSetHelper,"wordSetHelper");
-#line 241 "runfile.in"
+#line 243 "./runfile.in"
REGISTER_BLTIN(run::wordSet,"wordSet");
-#line 246 "runfile.in"
+#line 248 "./runfile.in"
REGISTER_BLTIN(run::wordPart,"wordPart");
-#line 251 "runfile.in"
+#line 253 "./runfile.in"
REGISTER_BLTIN(run::singlerealSetHelper,"singlerealSetHelper");
-#line 258 "runfile.in"
+#line 260 "./runfile.in"
REGISTER_BLTIN(run::singlerealSet,"singlerealSet");
-#line 263 "runfile.in"
+#line 265 "./runfile.in"
REGISTER_BLTIN(run::singlerealPart,"singlerealPart");
-#line 268 "runfile.in"
+#line 270 "./runfile.in"
REGISTER_BLTIN(run::singleintSetHelper,"singleintSetHelper");
-#line 275 "runfile.in"
+#line 277 "./runfile.in"
REGISTER_BLTIN(run::singleintSet,"singleintSet");
-#line 280 "runfile.in"
+#line 282 "./runfile.in"
REGISTER_BLTIN(run::singleintPart,"singleintPart");
-#line 285 "runfile.in"
+#line 287 "./runfile.in"
REGISTER_BLTIN(run::signedintSetHelper,"signedintSetHelper");
-#line 292 "runfile.in"
+#line 294 "./runfile.in"
REGISTER_BLTIN(run::signedintSet,"signedintSet");
-#line 297 "runfile.in"
+#line 299 "./runfile.in"
REGISTER_BLTIN(run::signedintPart,"signedintPart");
-#line 302 "runfile.in"
+#line 304 "./runfile.in"
REGISTER_BLTIN(run::readSetHelper,"readSetHelper");
-#line 325 "runfile.in"
+#line 327 "./runfile.in"
REGISTER_BLTIN(run::readSet,"readSet");
-#line 330 "runfile.in"
+#line 332 "./runfile.in"
addFunc(ve, run::gen_runfile41, primInt(), SYM(delete), formal(primString(), SYM(s), false, false));
-#line 340 "runfile.in"
+#line 342 "./runfile.in"
addFunc(ve, run::gen_runfile42, primInt(), SYM(rename), formal(primString(), SYM(from), false, false), formal(primString(), SYM(to), false, false));
-#line 351 "runfile.in"
+#line 353 "./runfile.in"
addFunc(ve, run::gen_runfile43, primString(), SYM(mktemp), formal(primString(), SYM(s), false, false));
}
diff --git a/graphics/asymptote/runfile.h b/graphics/asymptote/runfile.h
index f523c58815..aa22067cd3 100644
--- a/graphics/asymptote/runfile.h
+++ b/graphics/asymptote/runfile.h
@@ -1,7 +1,6 @@
/***** Autogenerated from runfile.in; changes will be overwritten *****/
-#ifndef runfile_H
-#define runfile_H
+#pragma once
namespace run {
void nullFile(vm::stack *);
void namePart(vm::stack *);
@@ -31,4 +30,3 @@ void readSetHelper(vm::stack *);
void readSet(vm::stack *);
}
-#endif // runfile_H
diff --git a/graphics/asymptote/runfile.in b/graphics/asymptote/runfile.in
index 4e7e3302ec..e77d10d275 100644
--- a/graphics/asymptote/runfile.in
+++ b/graphics/asymptote/runfile.in
@@ -12,8 +12,10 @@ file* => primFile()
#include "triple.h"
#include "array.h"
-#ifdef __CYGWIN__
- extern "C" int mkstemp(char *c);
+#if defined(_WIN32)
+#include <io.h>
+#else
+#include <unistd.h>
#endif
using namespace camp;
@@ -351,14 +353,46 @@ Int rename(string from, string to)
// Create a uniquely named temporary file.
string mktemp(string s)
{
- char *S=StrdupMalloc(s+"XXXXXX");
+ string baseTemplate=s+"XXXXXX";
+ char *S=StrdupMalloc(baseTemplate);
+ bool success=true;
+#if defined(_WIN32)
+ if (_mktemp_s(S,baseTemplate.length()+1) != 0)
+ {
+ success = false;
+ }
+ FILE* fp;
+ if (success && (fopen_s(&fp,S,"w") != 0))
+ {
+ success = false;
+ }
+#else
int fd=mkstemp(S);
- if(fd < 0) {
+ if (fd < 0)
+ {
+ success = false;
+ }
+#endif
+ if(!success)
+ {
ostringstream buf;
buf << "Could not create unique temporary filename based on " << s;
error(buf);
}
string T(S);
free(S);
+
+#if defined(_WIN32)
+ bool closeSuccess = fclose(fp) == 0;
+#else
+ bool closeSuccess = close(fd) == 0;
+#endif
+
+ if (!closeSuccess)
+ {
+ ostringstream buf;
+ buf << "Could not finalize temporary file based on " << s;
+ error(buf);
+ }
return T;
}
diff --git a/graphics/asymptote/runhistory.cc b/graphics/asymptote/runhistory.cc
index 089807c5a0..31886db8ef 100644
--- a/graphics/asymptote/runhistory.cc
+++ b/graphics/asymptote/runhistory.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runhistory.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runhistory.in"
+#line 1 "./runhistory.in"
/*****
* runhistory.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -67,6 +67,13 @@ function *realRealFunction();
#include "mathop.h"
#include "builtin.h"
+#if defined(_WIN32)
+#include <io.h>
+#define isatty _isatty
+#else
+#include <unistd.h>
+#endif
+
using namespace camp;
using namespace settings;
using namespace vm;
@@ -166,13 +173,13 @@ void cleanup()
#endif
namespace run {
// Return the last n lines of the history named name.
-#line 110 "runhistory.in"
+#line 117 "./runhistory.in"
// stringarray* history(string name, Int n=1);
void gen_runhistory0(stack *Stack)
{
Int n=vm::pop<Int>(Stack,1);
string name=vm::pop<string>(Stack);
-#line 111 "runhistory.in"
+#line 118 "./runhistory.in"
#if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES)
bool newhistory=historyMap.find(name) == historyMap.end();
@@ -204,12 +211,12 @@ void gen_runhistory0(stack *Stack)
}
// Return the last n lines of the interactive history.
-#line 143 "runhistory.in"
+#line 150 "./runhistory.in"
// stringarray* history(Int n=0);
void gen_runhistory1(stack *Stack)
{
Int n=vm::pop<Int>(Stack,0);
-#line 144 "runhistory.in"
+#line 151 "./runhistory.in"
#if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES)
{Stack->push<stringarray*>(get_history(n)); return;}
#else
@@ -220,16 +227,20 @@ void gen_runhistory1(stack *Stack)
// Prompt for a string using prompt, the GNU readline library, and a
// local history named name.
-#line 155 "runhistory.in"
+#line 162 "./runhistory.in"
// string readline(string prompt=emptystring, string name=emptystring, bool tabcompletion=false);
void gen_runhistory2(stack *Stack)
{
bool tabcompletion=vm::pop<bool>(Stack,false);
string name=vm::pop<string>(Stack,emptystring);
string prompt=vm::pop<string>(Stack,emptystring);
-#line 157 "runhistory.in"
- if(!(isatty(STDIN_FILENO) || getSetting<Int>("inpipe") >= 0))
+#line 164 "./runhistory.in"
+ bool stdinIsTty=isatty(STDIN_FILENO);
+ bool hasInpipe=getSetting<Int>("inpipe") >= 0;
+ if(!(stdinIsTty || hasInpipe))
+ {
{Stack->push<string>(emptystring); return;}
+ }
#if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES)
interact::init_readline(tabcompletion);
@@ -271,14 +282,14 @@ void gen_runhistory2(stack *Stack)
// Save a string in a local history named name.
// If store=true, store the local history in the file historyfilename(name).
-#line 201 "runhistory.in"
+#line 212 "./runhistory.in"
// void saveline(string name, string value, bool store=true);
void gen_runhistory3(stack *Stack)
{
bool store=vm::pop<bool>(Stack,true);
string value=vm::pop<string>(Stack);
string name=vm::pop<string>(Stack);
-#line 202 "runhistory.in"
+#line 213 "./runhistory.in"
#if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES)
store_history(&history_save);
bool newhistory=historyMap.find(name) == historyMap.end();
@@ -311,13 +322,13 @@ namespace trans {
void gen_runhistory_venv(venv &ve)
{
-#line 109 "runhistory.in"
+#line 116 "./runhistory.in"
addFunc(ve, run::gen_runhistory0, stringArray(), SYM(history), formal(primString(), SYM(name), false, false), formal(primInt(), SYM(n), true, false));
-#line 142 "runhistory.in"
+#line 149 "./runhistory.in"
addFunc(ve, run::gen_runhistory1, stringArray(), SYM(history), formal(primInt(), SYM(n), true, false));
-#line 153 "runhistory.in"
+#line 160 "./runhistory.in"
addFunc(ve, run::gen_runhistory2, primString(), SYM(readline), formal(primString(), SYM(prompt), true, false), formal(primString(), SYM(name), true, false), formal(primBoolean(), SYM(tabcompletion), true, false));
-#line 199 "runhistory.in"
+#line 210 "./runhistory.in"
addFunc(ve, run::gen_runhistory3, primVoid(), SYM(saveline), formal(primString(), SYM(name), false, false), formal(primString(), SYM(value), false, false), formal(primBoolean(), SYM(store), true, false));
}
diff --git a/graphics/asymptote/runhistory.h b/graphics/asymptote/runhistory.h
index 50be6f77f1..424b904fcb 100644
--- a/graphics/asymptote/runhistory.h
+++ b/graphics/asymptote/runhistory.h
@@ -1,8 +1,6 @@
/***** Autogenerated from runhistory.in; changes will be overwritten *****/
-#ifndef runhistory_H
-#define runhistory_H
+#pragma once
namespace run {
}
-#endif // runhistory_H
diff --git a/graphics/asymptote/runhistory.in b/graphics/asymptote/runhistory.in
index 78dcbb6d54..8943733854 100644
--- a/graphics/asymptote/runhistory.in
+++ b/graphics/asymptote/runhistory.in
@@ -14,6 +14,13 @@ stringarray* => stringArray()
#include "mathop.h"
#include "builtin.h"
+#if defined(_WIN32)
+#include <io.h>
+#define isatty _isatty
+#else
+#include <unistd.h>
+#endif
+
using namespace camp;
using namespace settings;
using namespace vm;
@@ -155,8 +162,12 @@ stringarray* history(Int n=0)
string readline(string prompt=emptystring, string name=emptystring,
bool tabcompletion=false)
{
- if(!(isatty(STDIN_FILENO) || getSetting<Int>("inpipe") >= 0))
+ bool stdinIsTty=isatty(STDIN_FILENO);
+ bool hasInpipe=getSetting<Int>("inpipe") >= 0;
+ if(!(stdinIsTty || hasInpipe))
+ {
return emptystring;
+ }
#if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES)
interact::init_readline(tabcompletion);
diff --git a/graphics/asymptote/runlabel.cc b/graphics/asymptote/runlabel.cc
index fc55f079bc..ca002b3a4a 100644
--- a/graphics/asymptote/runlabel.cc
+++ b/graphics/asymptote/runlabel.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runlabel.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runlabel.in"
+#line 1 "./runlabel.in"
/*****
* runlabel.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -263,7 +263,7 @@ array *readpath(const string& psname, bool keep,
#endif
namespace run {
-#line 214 "runlabel.in"
+#line 214 "./runlabel.in"
// void label(picture *f, string *s, string *size, transform t, pair position, pair align, pen p);
void gen_runlabel0(stack *Stack)
{
@@ -274,26 +274,26 @@ void gen_runlabel0(stack *Stack)
string * size=vm::pop<string *>(Stack);
string * s=vm::pop<string *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 216 "runlabel.in"
+#line 216 "./runlabel.in"
f->append(new drawLabel(*s,*size,t,position,align,p));
}
-#line 220 "runlabel.in"
+#line 220 "./runlabel.in"
// bool labels(picture *f);
void gen_runlabel1(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 221 "runlabel.in"
+#line 221 "./runlabel.in"
{Stack->push<bool>(f->havelabels()); return;}
}
-#line 225 "runlabel.in"
+#line 225 "./runlabel.in"
// realarray* texsize(string *s, pen p=CURRENTPEN);
void gen_runlabel2(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
string * s=vm::pop<string *>(Stack);
-#line 226 "runlabel.in"
+#line 226 "./runlabel.in"
texinit();
processDataStruct &pd=processData();
@@ -310,13 +310,13 @@ void gen_runlabel2(stack *Stack)
{Stack->push<realarray*>(t); return;}
}
-#line 243 "runlabel.in"
+#line 243 "./runlabel.in"
// patharray2* _texpath(stringarray *s, penarray *p);
void gen_runlabel3(stack *Stack)
{
penarray * p=vm::pop<penarray *>(Stack);
stringarray * s=vm::pop<stringarray *>(Stack);
-#line 244 "runlabel.in"
+#line 244 "./runlabel.in"
size_t n=checkArrays(s,p);
if(n == 0) {Stack->push<patharray2*>(new array(0)); return;}
@@ -421,13 +421,13 @@ void gen_runlabel3(stack *Stack)
{Stack->push<patharray2*>(xe ? readpath(psname,keep,0.1) : readpath(psname,keep,0.12,-1.0)); return;}
}
-#line 349 "runlabel.in"
+#line 349 "./runlabel.in"
// patharray2* textpath(stringarray *s, penarray *p);
void gen_runlabel4(stack *Stack)
{
penarray * p=vm::pop<penarray *>(Stack);
stringarray * s=vm::pop<stringarray *>(Stack);
-#line 350 "runlabel.in"
+#line 350 "./runlabel.in"
size_t n=checkArrays(s,p);
if(n == 0) {Stack->push<patharray2*>(new array(0)); return;}
@@ -500,13 +500,13 @@ void gen_runlabel4(stack *Stack)
{Stack->push<patharray2*>(readpath(psname,keep,0.1)); return;}
}
-#line 423 "runlabel.in"
+#line 423 "./runlabel.in"
// patharray* _strokepath(path g, pen p=CURRENTPEN);
void gen_runlabel5(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
path g=vm::pop<path>(Stack);
-#line 424 "runlabel.in"
+#line 424 "./runlabel.in"
array *P=new array(0);
if(g.size() == 0) {Stack->push<patharray*>(P); return;}
@@ -536,17 +536,17 @@ namespace trans {
void gen_runlabel_venv(venv &ve)
{
-#line 214 "runlabel.in"
+#line 214 "./runlabel.in"
addFunc(ve, run::gen_runlabel0, primVoid(), SYM(label), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false), formal(primString(), SYM(size), false, false), formal(primTransform(), SYM(t), false, false), formal(primPair(), SYM(position), false, false), formal(primPair(), SYM(align), false, false), formal(primPen(), SYM(p), false, false));
-#line 220 "runlabel.in"
+#line 220 "./runlabel.in"
addFunc(ve, run::gen_runlabel1, primBoolean(), SYM(labels), formal(primPicture(), SYM(f), false, false));
-#line 225 "runlabel.in"
+#line 225 "./runlabel.in"
addFunc(ve, run::gen_runlabel2, realArray(), SYM(texsize), formal(primString(), SYM(s), false, false), formal(primPen(), SYM(p), true, false));
-#line 243 "runlabel.in"
+#line 243 "./runlabel.in"
addFunc(ve, run::gen_runlabel3, pathArray2(), SYM(_texpath), formal(stringArray(), SYM(s), false, false), formal(penArray(), SYM(p), false, false));
-#line 349 "runlabel.in"
+#line 349 "./runlabel.in"
addFunc(ve, run::gen_runlabel4, pathArray2(), SYM(textpath), formal(stringArray(), SYM(s), false, false), formal(penArray(), SYM(p), false, false));
-#line 423 "runlabel.in"
+#line 423 "./runlabel.in"
addFunc(ve, run::gen_runlabel5, pathArray(), SYM(_strokepath), formal(primPath(), SYM(g), false, false), formal(primPen(), SYM(p), true, false));
}
diff --git a/graphics/asymptote/runlabel.h b/graphics/asymptote/runlabel.h
index b710d65cee..da4322798d 100644
--- a/graphics/asymptote/runlabel.h
+++ b/graphics/asymptote/runlabel.h
@@ -1,8 +1,6 @@
/***** Autogenerated from runlabel.in; changes will be overwritten *****/
-#ifndef runlabel_H
-#define runlabel_H
+#pragma once
namespace run {
}
-#endif // runlabel_H
diff --git a/graphics/asymptote/runmath.cc b/graphics/asymptote/runmath.cc
index c7d4c65bba..af3b867f97 100644
--- a/graphics/asymptote/runmath.cc
+++ b/graphics/asymptote/runmath.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runmath.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runmath.in"
+#line 1 "./runmath.in"
/*****
* runmath.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -62,6 +62,10 @@ function *realRealFunction();
#define CURRENTPEN processData().currentpen
#line 12 "runmath.in"
+#include <chrono>
+#include <random>
+#include <memory>
+#include <cmath>
#include <inttypes.h>
#include "mathop.h"
@@ -227,14 +231,16 @@ inline Int sgn(double x)
return (x > 0.0 ? 1 : (x < 0.0 ? -1 : 0));
}
-static bool initializeRandom=true;
+namespace
+{
+bool initializeRandom=true;
+std::minstd_rand randEngine;
+}
void Srand(Int seed)
{
initializeRandom=false;
- const int n=256;
- static char state[n];
- initstate(intcast(seed),state,n);
+ randEngine=std::minstd_rand(seed);
}
// Autogenerated routines:
@@ -246,233 +252,235 @@ void Srand(Int seed)
#endif
namespace run {
-#line 190 "runmath.in"
+#line 196 "./runmath.in"
// real ^(real x, Int y);
void gen_runmath0(stack *Stack)
{
Int y=vm::pop<Int>(Stack);
real x=vm::pop<real>(Stack);
-#line 191 "runmath.in"
+#line 197 "./runmath.in"
{Stack->push<real>(pow(x,y)); return;}
}
-#line 195 "runmath.in"
+#line 201 "./runmath.in"
// pair ^(pair z, Int y);
void gen_runmath1(stack *Stack)
{
Int y=vm::pop<Int>(Stack);
pair z=vm::pop<pair>(Stack);
-#line 196 "runmath.in"
+#line 202 "./runmath.in"
{Stack->push<pair>(pow(z,y)); return;}
}
-#line 200 "runmath.in"
+#line 206 "./runmath.in"
// Int quotient(Int x, Int y);
void gen_runmath2(stack *Stack)
{
Int y=vm::pop<Int>(Stack);
Int x=vm::pop<Int>(Stack);
-#line 201 "runmath.in"
+#line 207 "./runmath.in"
{Stack->push<Int>(quotient<Int>()(x,y)); return;}
}
-#line 205 "runmath.in"
+#line 211 "./runmath.in"
// Int abs(Int x);
void gen_runmath3(stack *Stack)
{
Int x=vm::pop<Int>(Stack);
-#line 206 "runmath.in"
+#line 212 "./runmath.in"
{Stack->push<Int>(Abs(x)); return;}
}
-#line 210 "runmath.in"
+#line 216 "./runmath.in"
// Int sgn(real x);
void gen_runmath4(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 211 "runmath.in"
+#line 217 "./runmath.in"
{Stack->push<Int>(sgn(x)); return;}
}
-#line 215 "runmath.in"
+#line 221 "./runmath.in"
// Int rand();
void gen_runmath5(stack *Stack)
{
-#line 216 "runmath.in"
+#line 222 "./runmath.in"
if(initializeRandom)
Srand(1);
- {Stack->push<Int>(random()); return;}
+ std::uniform_int_distribution dist(0, RANDOM_MAX);
+ {Stack->push<Int>(dist(randEngine)); return;}
}
-#line 222 "runmath.in"
+#line 229 "./runmath.in"
// void srand(Int seed);
void gen_runmath6(stack *Stack)
{
Int seed=vm::pop<Int>(Stack);
-#line 223 "runmath.in"
+#line 230 "./runmath.in"
Srand(seed);
}
// a random number uniformly distributed in the interval [0,1]
-#line 228 "runmath.in"
+#line 235 "./runmath.in"
// real unitrand();
void gen_runmath7(stack *Stack)
{
-#line 229 "runmath.in"
- {Stack->push<real>(((real) random())/RANDOM_MAX); return;}
+#line 236 "./runmath.in"
+ std::uniform_real_distribution<double> dist(0.0, 1.0);
+ {Stack->push<real>(dist(randEngine)); return;}
}
-#line 233 "runmath.in"
+#line 241 "./runmath.in"
// Int ceil(real x);
void gen_runmath8(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 234 "runmath.in"
+#line 242 "./runmath.in"
{Stack->push<Int>(Intcast(ceil(x))); return;}
}
-#line 238 "runmath.in"
+#line 246 "./runmath.in"
// Int floor(real x);
void gen_runmath9(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 239 "runmath.in"
+#line 247 "./runmath.in"
{Stack->push<Int>(Intcast(floor(x))); return;}
}
-#line 243 "runmath.in"
+#line 251 "./runmath.in"
// Int round(real x);
void gen_runmath10(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 244 "runmath.in"
+#line 252 "./runmath.in"
if(validInt(x)) {Stack->push<Int>(Round(x)); return;}
integeroverflow(0);
}
-#line 249 "runmath.in"
+#line 257 "./runmath.in"
// Int Ceil(real x);
void gen_runmath11(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 250 "runmath.in"
+#line 258 "./runmath.in"
{Stack->push<Int>(Ceil(x)); return;}
}
-#line 254 "runmath.in"
+#line 262 "./runmath.in"
// Int Floor(real x);
void gen_runmath12(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 255 "runmath.in"
+#line 263 "./runmath.in"
{Stack->push<Int>(Floor(x)); return;}
}
-#line 259 "runmath.in"
+#line 267 "./runmath.in"
// Int Round(real x);
void gen_runmath13(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 260 "runmath.in"
+#line 268 "./runmath.in"
{Stack->push<Int>(Round(Intcap(x))); return;}
}
-#line 264 "runmath.in"
+#line 272 "./runmath.in"
// real fmod(real x, real y);
void gen_runmath14(stack *Stack)
{
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 265 "runmath.in"
+#line 273 "./runmath.in"
if (y == 0.0) dividebyzero();
{Stack->push<real>(fmod(x,y)); return;}
}
-#line 270 "runmath.in"
+#line 278 "./runmath.in"
// real atan2(real y, real x);
void gen_runmath15(stack *Stack)
{
real x=vm::pop<real>(Stack);
real y=vm::pop<real>(Stack);
-#line 271 "runmath.in"
+#line 279 "./runmath.in"
{Stack->push<real>(atan2(y,x)); return;}
}
-#line 275 "runmath.in"
+#line 283 "./runmath.in"
// real hypot(real x, real y);
void gen_runmath16(stack *Stack)
{
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 276 "runmath.in"
+#line 284 "./runmath.in"
{Stack->push<real>(hypot(x,y)); return;}
}
-#line 280 "runmath.in"
+#line 288 "./runmath.in"
// real remainder(real x, real y);
void gen_runmath17(stack *Stack)
{
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 281 "runmath.in"
+#line 289 "./runmath.in"
{Stack->push<real>(remainder(x,y)); return;}
}
-#line 285 "runmath.in"
+#line 293 "./runmath.in"
// real Jn(Int n, real x);
void gen_runmath18(stack *Stack)
{
real x=vm::pop<real>(Stack);
Int n=vm::pop<Int>(Stack);
-#line 286 "runmath.in"
+#line 294 "./runmath.in"
{Stack->push<real>(jn(n,x)); return;}
}
-#line 290 "runmath.in"
+#line 298 "./runmath.in"
// real Yn(Int n, real x);
void gen_runmath19(stack *Stack)
{
real x=vm::pop<real>(Stack);
Int n=vm::pop<Int>(Stack);
-#line 291 "runmath.in"
+#line 299 "./runmath.in"
{Stack->push<real>(yn(n,x)); return;}
}
-#line 295 "runmath.in"
+#line 303 "./runmath.in"
// real erf(real x);
void gen_runmath20(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 296 "runmath.in"
+#line 304 "./runmath.in"
{Stack->push<real>(erf(x)); return;}
}
-#line 300 "runmath.in"
+#line 308 "./runmath.in"
// real erfc(real x);
void gen_runmath21(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 301 "runmath.in"
+#line 309 "./runmath.in"
{Stack->push<real>(erfc(x)); return;}
}
-#line 305 "runmath.in"
+#line 313 "./runmath.in"
// Int factorial(Int n);
void gen_runmath22(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 306 "runmath.in"
+#line 314 "./runmath.in"
if(n < 0) error(invalidargument);
{Stack->push<Int>(factorial(n)); return;}
}
-#line 310 "runmath.in"
+#line 318 "./runmath.in"
// Int choose(Int n, Int k);
void gen_runmath23(stack *Stack)
{
Int k=vm::pop<Int>(Stack);
Int n=vm::pop<Int>(Stack);
-#line 311 "runmath.in"
+#line 319 "./runmath.in"
if(n < 0 || k < 0 || k > n) error(invalidargument);
Int f=1;
Int r=n-k;
@@ -483,28 +491,23 @@ void gen_runmath23(stack *Stack)
{Stack->push<Int>(f); return;}
}
-#line 321 "runmath.in"
+#line 329 "./runmath.in"
// real gamma(real x);
void gen_runmath24(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 322 "runmath.in"
-#ifdef HAVE_TGAMMA
- {Stack->push<real>(tgamma(x)); return;}
-#else
- real lg = lgamma(x);
- {Stack->push<real>(signgam*exp(lg)); return;}
-#endif
+#line 330 "./runmath.in"
+ {Stack->push<real>(std::tgamma(x)); return;}
}
-#line 331 "runmath.in"
+#line 334 "./runmath.in"
// realarray* quadraticroots(real a, real b, real c);
void gen_runmath25(stack *Stack)
{
real c=vm::pop<real>(Stack);
real b=vm::pop<real>(Stack);
real a=vm::pop<real>(Stack);
-#line 332 "runmath.in"
+#line 335 "./runmath.in"
quadraticroots q(a,b,c);
array *roots=new array(q.roots);
if(q.roots >= 1) (*roots)[0]=q.t1;
@@ -512,14 +515,14 @@ void gen_runmath25(stack *Stack)
{Stack->push<realarray*>(roots); return;}
}
-#line 340 "runmath.in"
+#line 343 "./runmath.in"
// pairarray* quadraticroots(explicit pair a, explicit pair b, explicit pair c);
void gen_runmath26(stack *Stack)
{
pair c=vm::pop<pair>(Stack);
pair b=vm::pop<pair>(Stack);
pair a=vm::pop<pair>(Stack);
-#line 341 "runmath.in"
+#line 344 "./runmath.in"
Quadraticroots q(a,b,c);
array *roots=new array(q.roots);
if(q.roots >= 1) (*roots)[0]=q.z1;
@@ -527,7 +530,7 @@ void gen_runmath26(stack *Stack)
{Stack->push<pairarray*>(roots); return;}
}
-#line 349 "runmath.in"
+#line 352 "./runmath.in"
// realarray* cubicroots(real a, real b, real c, real d);
void gen_runmath27(stack *Stack)
{
@@ -535,7 +538,7 @@ void gen_runmath27(stack *Stack)
real c=vm::pop<real>(Stack);
real b=vm::pop<real>(Stack);
real a=vm::pop<real>(Stack);
-#line 350 "runmath.in"
+#line 353 "./runmath.in"
cubicroots q(a,b,c,d);
array *roots=new array(q.roots);
if(q.roots >= 1) (*roots)[0]=q.t1;
@@ -546,98 +549,98 @@ void gen_runmath27(stack *Stack)
// Logical operations
-#line 361 "runmath.in"
+#line 364 "./runmath.in"
// bool !(bool b);
void gen_runmath28(stack *Stack)
{
bool b=vm::pop<bool>(Stack);
-#line 362 "runmath.in"
+#line 365 "./runmath.in"
{Stack->push<bool>(!b); return;}
}
-#line 367 "runmath.in"
+#line 370 "./runmath.in"
void boolMemEq(stack *Stack)
{
vmFrame * b=vm::pop<vmFrame *>(Stack);
vmFrame * a=vm::pop<vmFrame *>(Stack);
-#line 368 "runmath.in"
+#line 371 "./runmath.in"
{Stack->push<bool>(a == b); return;}
}
-#line 372 "runmath.in"
+#line 375 "./runmath.in"
void boolMemNeq(stack *Stack)
{
vmFrame * b=vm::pop<vmFrame *>(Stack);
vmFrame * a=vm::pop<vmFrame *>(Stack);
-#line 373 "runmath.in"
+#line 376 "./runmath.in"
{Stack->push<bool>(a != b); return;}
}
-#line 377 "runmath.in"
+#line 380 "./runmath.in"
void boolFuncEq(stack *Stack)
{
callable * b=vm::pop<callable *>(Stack);
callable * a=vm::pop<callable *>(Stack);
-#line 378 "runmath.in"
+#line 381 "./runmath.in"
{Stack->push<bool>(a->compare(b)); return;}
}
-#line 382 "runmath.in"
+#line 385 "./runmath.in"
void boolFuncNeq(stack *Stack)
{
callable * b=vm::pop<callable *>(Stack);
callable * a=vm::pop<callable *>(Stack);
-#line 383 "runmath.in"
+#line 386 "./runmath.in"
{Stack->push<bool>(!(a->compare(b))); return;}
}
// Bit operations
-#line 389 "runmath.in"
+#line 392 "./runmath.in"
// Int AND(Int a, Int b);
void gen_runmath33(stack *Stack)
{
Int b=vm::pop<Int>(Stack);
Int a=vm::pop<Int>(Stack);
-#line 390 "runmath.in"
+#line 393 "./runmath.in"
{Stack->push<Int>(a & b); return;}
}
-#line 395 "runmath.in"
+#line 398 "./runmath.in"
// Int OR(Int a, Int b);
void gen_runmath34(stack *Stack)
{
Int b=vm::pop<Int>(Stack);
Int a=vm::pop<Int>(Stack);
-#line 396 "runmath.in"
+#line 399 "./runmath.in"
{Stack->push<Int>(a | b); return;}
}
-#line 400 "runmath.in"
+#line 403 "./runmath.in"
// Int XOR(Int a, Int b);
void gen_runmath35(stack *Stack)
{
Int b=vm::pop<Int>(Stack);
Int a=vm::pop<Int>(Stack);
-#line 401 "runmath.in"
+#line 404 "./runmath.in"
{Stack->push<Int>(a ^ b); return;}
}
-#line 405 "runmath.in"
+#line 408 "./runmath.in"
// Int NOT(Int a);
void gen_runmath36(stack *Stack)
{
Int a=vm::pop<Int>(Stack);
-#line 406 "runmath.in"
+#line 409 "./runmath.in"
{Stack->push<Int>(~a); return;}
}
-#line 410 "runmath.in"
+#line 413 "./runmath.in"
// Int CLZ(Int a);
void gen_runmath37(stack *Stack)
{
Int a=vm::pop<Int>(Stack);
-#line 411 "runmath.in"
+#line 414 "./runmath.in"
if((unsigned long long) a > 0xFFFFFFFF)
{Stack->push<Int>(CLZ((uint32_t) ((unsigned long long) a >> 32))); return;}
else {
@@ -647,32 +650,32 @@ void gen_runmath37(stack *Stack)
}
}
-#line 421 "runmath.in"
+#line 424 "./runmath.in"
// Int popcount(Int a);
void gen_runmath38(stack *Stack)
{
Int a=vm::pop<Int>(Stack);
-#line 422 "runmath.in"
+#line 425 "./runmath.in"
{Stack->push<Int>(popcount(a)); return;}
}
-#line 426 "runmath.in"
+#line 429 "./runmath.in"
// Int CTZ(Int a);
void gen_runmath39(stack *Stack)
{
Int a=vm::pop<Int>(Stack);
-#line 427 "runmath.in"
+#line 430 "./runmath.in"
{Stack->push<Int>(popcount((a&-a)-1)); return;}
}
// bitreverse a within a word of length bits.
-#line 432 "runmath.in"
+#line 435 "./runmath.in"
// Int bitreverse(Int a, Int bits);
void gen_runmath40(stack *Stack)
{
Int bits=vm::pop<Int>(Stack);
Int a=vm::pop<Int>(Stack);
-#line 433 "runmath.in"
+#line 436 "./runmath.in"
typedef unsigned long long Bitreverse(unsigned long long a);
static Bitreverse *B[]={bitreverse8,bitreverse16,bitreverse24,bitreverse32,
bitreverse40,bitreverse48,bitreverse56,bitreverse64};
@@ -693,87 +696,87 @@ namespace trans {
void gen_runmath_venv(venv &ve)
{
-#line 190 "runmath.in"
+#line 196 "./runmath.in"
addFunc(ve, run::gen_runmath0, primReal(), SYM_CARET, formal(primReal(), SYM(x), false, false), formal(primInt(), SYM(y), false, false));
-#line 195 "runmath.in"
+#line 201 "./runmath.in"
addFunc(ve, run::gen_runmath1, primPair(), SYM_CARET, formal(primPair(), SYM(z), false, false), formal(primInt(), SYM(y), false, false));
-#line 200 "runmath.in"
+#line 206 "./runmath.in"
addFunc(ve, run::gen_runmath2, primInt(), SYM(quotient), formal(primInt(), SYM(x), false, false), formal(primInt(), SYM(y), false, false));
-#line 205 "runmath.in"
+#line 211 "./runmath.in"
addFunc(ve, run::gen_runmath3, primInt(), SYM(abs), formal(primInt(), SYM(x), false, false));
-#line 210 "runmath.in"
+#line 216 "./runmath.in"
addFunc(ve, run::gen_runmath4, primInt(), SYM(sgn), formal(primReal(), SYM(x), false, false));
-#line 215 "runmath.in"
+#line 221 "./runmath.in"
addFunc(ve, run::gen_runmath5, primInt(), SYM(rand));
-#line 222 "runmath.in"
+#line 229 "./runmath.in"
addFunc(ve, run::gen_runmath6, primVoid(), SYM(srand), formal(primInt(), SYM(seed), false, false));
-#line 227 "runmath.in"
+#line 234 "./runmath.in"
addFunc(ve, run::gen_runmath7, primReal(), SYM(unitrand));
-#line 233 "runmath.in"
+#line 241 "./runmath.in"
addFunc(ve, run::gen_runmath8, primInt(), SYM(ceil), formal(primReal(), SYM(x), false, false));
-#line 238 "runmath.in"
+#line 246 "./runmath.in"
addFunc(ve, run::gen_runmath9, primInt(), SYM(floor), formal(primReal(), SYM(x), false, false));
-#line 243 "runmath.in"
+#line 251 "./runmath.in"
addFunc(ve, run::gen_runmath10, primInt(), SYM(round), formal(primReal(), SYM(x), false, false));
-#line 249 "runmath.in"
+#line 257 "./runmath.in"
addFunc(ve, run::gen_runmath11, primInt(), SYM(Ceil), formal(primReal(), SYM(x), false, false));
-#line 254 "runmath.in"
+#line 262 "./runmath.in"
addFunc(ve, run::gen_runmath12, primInt(), SYM(Floor), formal(primReal(), SYM(x), false, false));
-#line 259 "runmath.in"
+#line 267 "./runmath.in"
addFunc(ve, run::gen_runmath13, primInt(), SYM(Round), formal(primReal(), SYM(x), false, false));
-#line 264 "runmath.in"
+#line 272 "./runmath.in"
addFunc(ve, run::gen_runmath14, primReal(), SYM(fmod), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false));
-#line 270 "runmath.in"
+#line 278 "./runmath.in"
addFunc(ve, run::gen_runmath15, primReal(), SYM(atan2), formal(primReal(), SYM(y), false, false), formal(primReal(), SYM(x), false, false));
-#line 275 "runmath.in"
+#line 283 "./runmath.in"
addFunc(ve, run::gen_runmath16, primReal(), SYM(hypot), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false));
-#line 280 "runmath.in"
+#line 288 "./runmath.in"
addFunc(ve, run::gen_runmath17, primReal(), SYM(remainder), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false));
-#line 285 "runmath.in"
+#line 293 "./runmath.in"
addFunc(ve, run::gen_runmath18, primReal(), SYM(Jn), formal(primInt(), SYM(n), false, false), formal(primReal(), SYM(x), false, false));
-#line 290 "runmath.in"
+#line 298 "./runmath.in"
addFunc(ve, run::gen_runmath19, primReal(), SYM(Yn), formal(primInt(), SYM(n), false, false), formal(primReal(), SYM(x), false, false));
-#line 295 "runmath.in"
+#line 303 "./runmath.in"
addFunc(ve, run::gen_runmath20, primReal(), SYM(erf), formal(primReal(), SYM(x), false, false));
-#line 300 "runmath.in"
+#line 308 "./runmath.in"
addFunc(ve, run::gen_runmath21, primReal(), SYM(erfc), formal(primReal(), SYM(x), false, false));
-#line 305 "runmath.in"
+#line 313 "./runmath.in"
addFunc(ve, run::gen_runmath22, primInt(), SYM(factorial), formal(primInt(), SYM(n), false, false));
-#line 310 "runmath.in"
+#line 318 "./runmath.in"
addFunc(ve, run::gen_runmath23, primInt(), SYM(choose), formal(primInt(), SYM(n), false, false), formal(primInt(), SYM(k), false, false));
-#line 321 "runmath.in"
+#line 329 "./runmath.in"
addFunc(ve, run::gen_runmath24, primReal(), SYM(gamma), formal(primReal(), SYM(x), false, false));
-#line 331 "runmath.in"
+#line 334 "./runmath.in"
addFunc(ve, run::gen_runmath25, realArray(), SYM(quadraticroots), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false), formal(primReal(), SYM(c), false, false));
-#line 340 "runmath.in"
+#line 343 "./runmath.in"
addFunc(ve, run::gen_runmath26, pairArray(), SYM(quadraticroots), formal(primPair(), SYM(a), false, true), formal(primPair(), SYM(b), false, true), formal(primPair(), SYM(c), false, true));
-#line 349 "runmath.in"
+#line 352 "./runmath.in"
addFunc(ve, run::gen_runmath27, realArray(), SYM(cubicroots), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false), formal(primReal(), SYM(c), false, false), formal(primReal(), SYM(d), false, false));
-#line 359 "runmath.in"
+#line 362 "./runmath.in"
addFunc(ve, run::gen_runmath28, primBoolean(), SYM_LOGNOT, formal(primBoolean(), SYM(b), false, false));
-#line 367 "runmath.in"
+#line 370 "./runmath.in"
REGISTER_BLTIN(run::boolMemEq,"boolMemEq");
-#line 372 "runmath.in"
+#line 375 "./runmath.in"
REGISTER_BLTIN(run::boolMemNeq,"boolMemNeq");
-#line 377 "runmath.in"
+#line 380 "./runmath.in"
REGISTER_BLTIN(run::boolFuncEq,"boolFuncEq");
-#line 382 "runmath.in"
+#line 385 "./runmath.in"
REGISTER_BLTIN(run::boolFuncNeq,"boolFuncNeq");
-#line 387 "runmath.in"
+#line 390 "./runmath.in"
addFunc(ve, run::gen_runmath33, primInt(), SYM(AND), formal(primInt(), SYM(a), false, false), formal(primInt(), SYM(b), false, false));
-#line 395 "runmath.in"
+#line 398 "./runmath.in"
addFunc(ve, run::gen_runmath34, primInt(), SYM(OR), formal(primInt(), SYM(a), false, false), formal(primInt(), SYM(b), false, false));
-#line 400 "runmath.in"
+#line 403 "./runmath.in"
addFunc(ve, run::gen_runmath35, primInt(), SYM(XOR), formal(primInt(), SYM(a), false, false), formal(primInt(), SYM(b), false, false));
-#line 405 "runmath.in"
+#line 408 "./runmath.in"
addFunc(ve, run::gen_runmath36, primInt(), SYM(NOT), formal(primInt(), SYM(a), false, false));
-#line 410 "runmath.in"
+#line 413 "./runmath.in"
addFunc(ve, run::gen_runmath37, primInt(), SYM(CLZ), formal(primInt(), SYM(a), false, false));
-#line 421 "runmath.in"
+#line 424 "./runmath.in"
addFunc(ve, run::gen_runmath38, primInt(), SYM(popcount), formal(primInt(), SYM(a), false, false));
-#line 426 "runmath.in"
+#line 429 "./runmath.in"
addFunc(ve, run::gen_runmath39, primInt(), SYM(CTZ), formal(primInt(), SYM(a), false, false));
-#line 431 "runmath.in"
+#line 434 "./runmath.in"
addFunc(ve, run::gen_runmath40, primInt(), SYM(bitreverse), formal(primInt(), SYM(a), false, false), formal(primInt(), SYM(bits), false, false));
}
diff --git a/graphics/asymptote/runmath.h b/graphics/asymptote/runmath.h
index a9e030cb73..deaf19a19d 100644
--- a/graphics/asymptote/runmath.h
+++ b/graphics/asymptote/runmath.h
@@ -1,7 +1,6 @@
/***** Autogenerated from runmath.in; changes will be overwritten *****/
-#ifndef runmath_H
-#define runmath_H
+#pragma once
namespace run {
void boolMemEq(vm::stack *);
void boolMemNeq(vm::stack *);
@@ -9,4 +8,3 @@ void boolFuncEq(vm::stack *);
void boolFuncNeq(vm::stack *);
}
-#endif // runmath_H
diff --git a/graphics/asymptote/runmath.in b/graphics/asymptote/runmath.in
index 36ca583744..cecf2a3cc0 100644
--- a/graphics/asymptote/runmath.in
+++ b/graphics/asymptote/runmath.in
@@ -9,6 +9,10 @@ pair => primPair()
realarray* => realArray()
pairarray* => pairArray()
+#include <chrono>
+#include <random>
+#include <memory>
+#include <cmath>
#include <inttypes.h>
#include "mathop.h"
@@ -174,14 +178,16 @@ inline Int sgn(double x)
return (x > 0.0 ? 1 : (x < 0.0 ? -1 : 0));
}
-static bool initializeRandom=true;
+namespace
+{
+bool initializeRandom=true;
+std::minstd_rand randEngine;
+}
void Srand(Int seed)
{
initializeRandom=false;
- const int n=256;
- static char state[n];
- initstate(intcast(seed),state,n);
+ randEngine=std::minstd_rand(seed);
}
// Autogenerated routines:
@@ -216,7 +222,8 @@ Int rand()
{
if(initializeRandom)
Srand(1);
- return random();
+ std::uniform_int_distribution dist(0, RANDOM_MAX);
+ return dist(randEngine);
}
void srand(Int seed)
@@ -227,7 +234,8 @@ void srand(Int seed)
// a random number uniformly distributed in the interval [0,1]
real unitrand()
{
- return ((real) random())/RANDOM_MAX;
+ std::uniform_real_distribution<double> dist(0.0, 1.0);
+ return dist(randEngine);
}
Int ceil(real x)
@@ -320,12 +328,7 @@ Int choose(Int n, Int k) {
real gamma(real x)
{
-#ifdef HAVE_TGAMMA
- return tgamma(x);
-#else
- real lg = lgamma(x);
- return signgam*exp(lg);
-#endif
+ return std::tgamma(x);
}
realarray *quadraticroots(real a, real b, real c)
diff --git a/graphics/asymptote/runpair.cc b/graphics/asymptote/runpair.cc
index bbae654ec3..dfaf8a008e 100644
--- a/graphics/asymptote/runpair.cc
+++ b/graphics/asymptote/runpair.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runpair.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runpair.in"
+#line 1 "./runpair.in"
/*****
* runpair.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -107,142 +107,142 @@ pair gamma(pair z)
#endif
namespace run {
-#line 49 "runpair.in"
+#line 49 "./runpair.in"
void pairZero(stack *Stack)
{
-#line 50 "runpair.in"
+#line 50 "./runpair.in"
{Stack->push<pair>(zero); return;}
}
-#line 54 "runpair.in"
+#line 54 "./runpair.in"
void realRealToPair(stack *Stack)
{
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 55 "runpair.in"
+#line 55 "./runpair.in"
{Stack->push<pair>(pair(x,y)); return;}
}
-#line 59 "runpair.in"
+#line 59 "./runpair.in"
void pairNegate(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 60 "runpair.in"
+#line 60 "./runpair.in"
{Stack->push<pair>(-z); return;}
}
-#line 64 "runpair.in"
+#line 64 "./runpair.in"
// real xpart(pair z);
void pairXPart(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 65 "runpair.in"
+#line 65 "./runpair.in"
{Stack->push<real>(z.getx()); return;}
}
-#line 69 "runpair.in"
+#line 69 "./runpair.in"
// real ypart(pair z);
void pairYPart(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 70 "runpair.in"
+#line 70 "./runpair.in"
{Stack->push<real>(z.gety()); return;}
}
-#line 74 "runpair.in"
+#line 74 "./runpair.in"
// real length(pair z);
void gen_runpair5(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 75 "runpair.in"
+#line 75 "./runpair.in"
{Stack->push<real>(z.length()); return;}
}
-#line 79 "runpair.in"
+#line 79 "./runpair.in"
// real abs(pair z);
void gen_runpair6(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 80 "runpair.in"
+#line 80 "./runpair.in"
{Stack->push<real>(z.length()); return;}
}
-#line 84 "runpair.in"
+#line 84 "./runpair.in"
// real abs2(pair z);
void gen_runpair7(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 85 "runpair.in"
+#line 85 "./runpair.in"
{Stack->push<real>(z.abs2()); return;}
}
-#line 89 "runpair.in"
+#line 89 "./runpair.in"
// pair sqrt(explicit pair z);
void gen_runpair8(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 90 "runpair.in"
+#line 90 "./runpair.in"
{Stack->push<pair>(Sqrt(z)); return;}
}
// Return the angle of z in radians.
-#line 95 "runpair.in"
+#line 95 "./runpair.in"
// real angle(pair z, bool warn=true);
void gen_runpair9(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
pair z=vm::pop<pair>(Stack);
-#line 96 "runpair.in"
+#line 96 "./runpair.in"
{Stack->push<real>(z.angle(warn)); return;}
}
// Return the angle of z in degrees in the interval [0,360).
-#line 101 "runpair.in"
+#line 101 "./runpair.in"
// real degrees(pair z, bool warn=true);
void gen_runpair10(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
pair z=vm::pop<pair>(Stack);
-#line 102 "runpair.in"
+#line 102 "./runpair.in"
{Stack->push<real>(principalBranch(degrees(z.angle(warn)))); return;}
}
// Convert degrees to radians.
-#line 107 "runpair.in"
+#line 107 "./runpair.in"
// real radians(real degrees);
void gen_runpair11(stack *Stack)
{
real degrees=vm::pop<real>(Stack);
-#line 108 "runpair.in"
+#line 108 "./runpair.in"
{Stack->push<real>(radians(degrees)); return;}
}
// Convert radians to degrees.
-#line 113 "runpair.in"
+#line 113 "./runpair.in"
// real degrees(real radians);
void gen_runpair12(stack *Stack)
{
real radians=vm::pop<real>(Stack);
-#line 114 "runpair.in"
+#line 114 "./runpair.in"
{Stack->push<real>(degrees(radians)); return;}
}
// Convert radians to degrees in [0,360).
-#line 119 "runpair.in"
+#line 119 "./runpair.in"
// real Degrees(real radians);
void gen_runpair13(stack *Stack)
{
real radians=vm::pop<real>(Stack);
-#line 120 "runpair.in"
+#line 120 "./runpair.in"
{Stack->push<real>(principalBranch(degrees(radians))); return;}
}
-#line 124 "runpair.in"
+#line 124 "./runpair.in"
// real Sin(real deg);
void gen_runpair14(stack *Stack)
{
real deg=vm::pop<real>(Stack);
-#line 125 "runpair.in"
+#line 125 "./runpair.in"
int n=(int) (deg/90.0);
if(deg == n*90.0) {
int m=n % 4;
@@ -254,12 +254,12 @@ void gen_runpair14(stack *Stack)
{Stack->push<real>(sin(radians(deg))); return;}
}
-#line 137 "runpair.in"
+#line 137 "./runpair.in"
// real Cos(real deg);
void gen_runpair15(stack *Stack)
{
real deg=vm::pop<real>(Stack);
-#line 138 "runpair.in"
+#line 138 "./runpair.in"
int n=(int) (deg/90.0);
if(deg == n*90.0) {
int m=n % 4;
@@ -271,12 +271,12 @@ void gen_runpair15(stack *Stack)
{Stack->push<real>(cos(radians(deg))); return;}
}
-#line 150 "runpair.in"
+#line 150 "./runpair.in"
// real Tan(real deg);
void gen_runpair16(stack *Stack)
{
real deg=vm::pop<real>(Stack);
-#line 151 "runpair.in"
+#line 151 "./runpair.in"
int n=(int) (deg/90.0);
if(deg == n*90.0) {
int m=n % 4;
@@ -288,157 +288,157 @@ void gen_runpair16(stack *Stack)
{Stack->push<real>(tan(radians(deg))); return;}
}
-#line 163 "runpair.in"
+#line 163 "./runpair.in"
// real aSin(real x);
void gen_runpair17(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 164 "runpair.in"
+#line 164 "./runpair.in"
{Stack->push<real>(degrees(asin(x))); return;}
}
-#line 168 "runpair.in"
+#line 168 "./runpair.in"
// real aCos(real x);
void gen_runpair18(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 169 "runpair.in"
+#line 169 "./runpair.in"
{Stack->push<real>(degrees(acos(x))); return;}
}
-#line 173 "runpair.in"
+#line 173 "./runpair.in"
// real aTan(real x);
void gen_runpair19(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 174 "runpair.in"
+#line 174 "./runpair.in"
{Stack->push<real>(degrees(atan(x))); return;}
}
-#line 178 "runpair.in"
+#line 178 "./runpair.in"
// pair unit(pair z);
void gen_runpair20(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 179 "runpair.in"
+#line 179 "./runpair.in"
{Stack->push<pair>(unit(z)); return;}
}
-#line 183 "runpair.in"
+#line 183 "./runpair.in"
// pair dir(real degrees);
void gen_runpair21(stack *Stack)
{
real degrees=vm::pop<real>(Stack);
-#line 184 "runpair.in"
+#line 184 "./runpair.in"
{Stack->push<pair>(expi(radians(degrees))); return;}
}
-#line 188 "runpair.in"
+#line 188 "./runpair.in"
// pair dir(explicit pair z);
void gen_runpair22(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 189 "runpair.in"
+#line 189 "./runpair.in"
{Stack->push<pair>(unit(z)); return;}
}
-#line 193 "runpair.in"
+#line 193 "./runpair.in"
// pair expi(real angle);
void gen_runpair23(stack *Stack)
{
real angle=vm::pop<real>(Stack);
-#line 194 "runpair.in"
+#line 194 "./runpair.in"
{Stack->push<pair>(expi(angle)); return;}
}
-#line 198 "runpair.in"
+#line 198 "./runpair.in"
// pair exp(explicit pair z);
void gen_runpair24(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 199 "runpair.in"
+#line 199 "./runpair.in"
{Stack->push<pair>(exp(z)); return;}
}
-#line 203 "runpair.in"
+#line 203 "./runpair.in"
// pair log(explicit pair z);
void gen_runpair25(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 204 "runpair.in"
+#line 204 "./runpair.in"
{Stack->push<pair>(pair(log(z.length()),z.angle())); return;}
}
-#line 208 "runpair.in"
+#line 208 "./runpair.in"
// pair sin(explicit pair z);
void gen_runpair26(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 209 "runpair.in"
+#line 209 "./runpair.in"
{Stack->push<pair>(sin(z)); return;}
}
-#line 213 "runpair.in"
+#line 213 "./runpair.in"
// pair cos(explicit pair z);
void gen_runpair27(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 214 "runpair.in"
+#line 214 "./runpair.in"
{Stack->push<pair>(pair(cos(z.getx())*cosh(z.gety()),-sin(z.getx())*sinh(z.gety()))); return;}
}
// Complex Gamma function
-#line 219 "runpair.in"
+#line 219 "./runpair.in"
// pair gamma(explicit pair z);
void gen_runpair28(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 220 "runpair.in"
+#line 220 "./runpair.in"
{Stack->push<pair>(gamma(z)); return;}
}
-#line 224 "runpair.in"
+#line 224 "./runpair.in"
// pair conj(pair z);
void gen_runpair29(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 225 "runpair.in"
+#line 225 "./runpair.in"
{Stack->push<pair>(conj(z)); return;}
}
-#line 229 "runpair.in"
+#line 229 "./runpair.in"
// pair realmult(pair z, pair w);
void gen_runpair30(stack *Stack)
{
pair w=vm::pop<pair>(Stack);
pair z=vm::pop<pair>(Stack);
-#line 230 "runpair.in"
+#line 230 "./runpair.in"
{Stack->push<pair>(pair(z.getx()*w.getx(),z.gety()*w.gety())); return;}
}
// To avoid confusion, a dot product requires explicit pair arguments.
-#line 235 "runpair.in"
+#line 235 "./runpair.in"
// real dot(explicit pair z, explicit pair w);
void gen_runpair31(stack *Stack)
{
pair w=vm::pop<pair>(Stack);
pair z=vm::pop<pair>(Stack);
-#line 236 "runpair.in"
+#line 236 "./runpair.in"
{Stack->push<real>(dot(z,w)); return;}
}
// Return the 2D scalar cross product z.x*w.y-z.y*w.x.
-#line 241 "runpair.in"
+#line 241 "./runpair.in"
// real cross(explicit pair z, explicit pair w);
void gen_runpair32(stack *Stack)
{
pair w=vm::pop<pair>(Stack);
pair z=vm::pop<pair>(Stack);
-#line 242 "runpair.in"
+#line 242 "./runpair.in"
{Stack->push<real>(cross(z,w)); return;}
}
-#line 246 "runpair.in"
+#line 246 "./runpair.in"
// pair bezier(pair a, pair b, pair c, pair d, real t);
void gen_runpair33(stack *Stack)
{
@@ -447,13 +447,13 @@ void gen_runpair33(stack *Stack)
pair c=vm::pop<pair>(Stack);
pair b=vm::pop<pair>(Stack);
pair a=vm::pop<pair>(Stack);
-#line 247 "runpair.in"
+#line 247 "./runpair.in"
real onemt=1-t;
real onemt2=onemt*onemt;
{Stack->push<pair>(onemt2*onemt*a+t*(3.0*(onemt2*b+t*onemt*c)+t*t*d)); return;}
}
-#line 253 "runpair.in"
+#line 253 "./runpair.in"
// pair bezierP(pair a, pair b, pair c, pair d, real t);
void gen_runpair34(stack *Stack)
{
@@ -462,11 +462,11 @@ void gen_runpair34(stack *Stack)
pair c=vm::pop<pair>(Stack);
pair b=vm::pop<pair>(Stack);
pair a=vm::pop<pair>(Stack);
-#line 254 "runpair.in"
+#line 254 "./runpair.in"
{Stack->push<pair>(3.0*(t*t*(d-a+3.0*(b-c))+t*(2.0*(a+c)-4.0*b)+b-a)); return;}
}
-#line 258 "runpair.in"
+#line 258 "./runpair.in"
// pair bezierPP(pair a, pair b, pair c, pair d, real t);
void gen_runpair35(stack *Stack)
{
@@ -475,11 +475,11 @@ void gen_runpair35(stack *Stack)
pair c=vm::pop<pair>(Stack);
pair b=vm::pop<pair>(Stack);
pair a=vm::pop<pair>(Stack);
-#line 259 "runpair.in"
+#line 259 "./runpair.in"
{Stack->push<pair>(6.0*(t*(d-a+3.0*(b-c))+a+c)-12.0*b); return;}
}
-#line 263 "runpair.in"
+#line 263 "./runpair.in"
// pair bezierPPP(pair a, pair b, pair c, pair d);
void gen_runpair36(stack *Stack)
{
@@ -487,7 +487,7 @@ void gen_runpair36(stack *Stack)
pair c=vm::pop<pair>(Stack);
pair b=vm::pop<pair>(Stack);
pair a=vm::pop<pair>(Stack);
-#line 264 "runpair.in"
+#line 264 "./runpair.in"
{Stack->push<pair>(6.0*(d-a)+18.0*(b-c)); return;}
}
@@ -497,79 +497,79 @@ namespace trans {
void gen_runpair_venv(venv &ve)
{
-#line 49 "runpair.in"
+#line 49 "./runpair.in"
REGISTER_BLTIN(run::pairZero,"pairZero");
-#line 54 "runpair.in"
+#line 54 "./runpair.in"
REGISTER_BLTIN(run::realRealToPair,"realRealToPair");
-#line 59 "runpair.in"
+#line 59 "./runpair.in"
REGISTER_BLTIN(run::pairNegate,"pairNegate");
-#line 64 "runpair.in"
+#line 64 "./runpair.in"
addFunc(ve, run::pairXPart, primReal(), SYM(xpart), formal(primPair(), SYM(z), false, false));
-#line 69 "runpair.in"
+#line 69 "./runpair.in"
addFunc(ve, run::pairYPart, primReal(), SYM(ypart), formal(primPair(), SYM(z), false, false));
-#line 74 "runpair.in"
+#line 74 "./runpair.in"
addFunc(ve, run::gen_runpair5, primReal(), SYM(length), formal(primPair(), SYM(z), false, false));
-#line 79 "runpair.in"
+#line 79 "./runpair.in"
addFunc(ve, run::gen_runpair6, primReal(), SYM(abs), formal(primPair(), SYM(z), false, false));
-#line 84 "runpair.in"
+#line 84 "./runpair.in"
addFunc(ve, run::gen_runpair7, primReal(), SYM(abs2), formal(primPair(), SYM(z), false, false));
-#line 89 "runpair.in"
+#line 89 "./runpair.in"
addFunc(ve, run::gen_runpair8, primPair(), SYM(sqrt), formal(primPair(), SYM(z), false, true));
-#line 94 "runpair.in"
+#line 94 "./runpair.in"
addFunc(ve, run::gen_runpair9, primReal(), SYM(angle), formal(primPair(), SYM(z), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 100 "runpair.in"
+#line 100 "./runpair.in"
addFunc(ve, run::gen_runpair10, primReal(), SYM(degrees), formal(primPair(), SYM(z), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 106 "runpair.in"
+#line 106 "./runpair.in"
addFunc(ve, run::gen_runpair11, primReal(), SYM(radians), formal(primReal(), SYM(degrees), false, false));
-#line 112 "runpair.in"
+#line 112 "./runpair.in"
addFunc(ve, run::gen_runpair12, primReal(), SYM(degrees), formal(primReal(), SYM(radians), false, false));
-#line 118 "runpair.in"
+#line 118 "./runpair.in"
addFunc(ve, run::gen_runpair13, primReal(), SYM(Degrees), formal(primReal(), SYM(radians), false, false));
-#line 124 "runpair.in"
+#line 124 "./runpair.in"
addFunc(ve, run::gen_runpair14, primReal(), SYM(Sin), formal(primReal(), SYM(deg), false, false));
-#line 137 "runpair.in"
+#line 137 "./runpair.in"
addFunc(ve, run::gen_runpair15, primReal(), SYM(Cos), formal(primReal(), SYM(deg), false, false));
-#line 150 "runpair.in"
+#line 150 "./runpair.in"
addFunc(ve, run::gen_runpair16, primReal(), SYM(Tan), formal(primReal(), SYM(deg), false, false));
-#line 163 "runpair.in"
+#line 163 "./runpair.in"
addFunc(ve, run::gen_runpair17, primReal(), SYM(aSin), formal(primReal(), SYM(x), false, false));
-#line 168 "runpair.in"
+#line 168 "./runpair.in"
addFunc(ve, run::gen_runpair18, primReal(), SYM(aCos), formal(primReal(), SYM(x), false, false));
-#line 173 "runpair.in"
+#line 173 "./runpair.in"
addFunc(ve, run::gen_runpair19, primReal(), SYM(aTan), formal(primReal(), SYM(x), false, false));
-#line 178 "runpair.in"
+#line 178 "./runpair.in"
addFunc(ve, run::gen_runpair20, primPair(), SYM(unit), formal(primPair(), SYM(z), false, false));
-#line 183 "runpair.in"
+#line 183 "./runpair.in"
addFunc(ve, run::gen_runpair21, primPair(), SYM(dir), formal(primReal(), SYM(degrees), false, false));
-#line 188 "runpair.in"
+#line 188 "./runpair.in"
addFunc(ve, run::gen_runpair22, primPair(), SYM(dir), formal(primPair(), SYM(z), false, true));
-#line 193 "runpair.in"
+#line 193 "./runpair.in"
addFunc(ve, run::gen_runpair23, primPair(), SYM(expi), formal(primReal(), SYM(angle), false, false));
-#line 198 "runpair.in"
+#line 198 "./runpair.in"
addFunc(ve, run::gen_runpair24, primPair(), SYM(exp), formal(primPair(), SYM(z), false, true));
-#line 203 "runpair.in"
+#line 203 "./runpair.in"
addFunc(ve, run::gen_runpair25, primPair(), SYM(log), formal(primPair(), SYM(z), false, true));
-#line 208 "runpair.in"
+#line 208 "./runpair.in"
addFunc(ve, run::gen_runpair26, primPair(), SYM(sin), formal(primPair(), SYM(z), false, true));
-#line 213 "runpair.in"
+#line 213 "./runpair.in"
addFunc(ve, run::gen_runpair27, primPair(), SYM(cos), formal(primPair(), SYM(z), false, true));
-#line 218 "runpair.in"
+#line 218 "./runpair.in"
addFunc(ve, run::gen_runpair28, primPair(), SYM(gamma), formal(primPair(), SYM(z), false, true));
-#line 224 "runpair.in"
+#line 224 "./runpair.in"
addFunc(ve, run::gen_runpair29, primPair(), SYM(conj), formal(primPair(), SYM(z), false, false));
-#line 229 "runpair.in"
+#line 229 "./runpair.in"
addFunc(ve, run::gen_runpair30, primPair(), SYM(realmult), formal(primPair(), SYM(z), false, false), formal(primPair(), SYM(w), false, false));
-#line 234 "runpair.in"
+#line 234 "./runpair.in"
addFunc(ve, run::gen_runpair31, primReal(), SYM(dot), formal(primPair(), SYM(z), false, true), formal(primPair(), SYM(w), false, true));
-#line 240 "runpair.in"
+#line 240 "./runpair.in"
addFunc(ve, run::gen_runpair32, primReal(), SYM(cross), formal(primPair(), SYM(z), false, true), formal(primPair(), SYM(w), false, true));
-#line 246 "runpair.in"
+#line 246 "./runpair.in"
addFunc(ve, run::gen_runpair33, primPair(), SYM(bezier), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false), formal(primPair(), SYM(c), false, false), formal(primPair(), SYM(d), false, false), formal(primReal(), SYM(t), false, false));
-#line 253 "runpair.in"
+#line 253 "./runpair.in"
addFunc(ve, run::gen_runpair34, primPair(), SYM(bezierP), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false), formal(primPair(), SYM(c), false, false), formal(primPair(), SYM(d), false, false), formal(primReal(), SYM(t), false, false));
-#line 258 "runpair.in"
+#line 258 "./runpair.in"
addFunc(ve, run::gen_runpair35, primPair(), SYM(bezierPP), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false), formal(primPair(), SYM(c), false, false), formal(primPair(), SYM(d), false, false), formal(primReal(), SYM(t), false, false));
-#line 263 "runpair.in"
+#line 263 "./runpair.in"
addFunc(ve, run::gen_runpair36, primPair(), SYM(bezierPPP), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false), formal(primPair(), SYM(c), false, false), formal(primPair(), SYM(d), false, false));
}
diff --git a/graphics/asymptote/runpair.h b/graphics/asymptote/runpair.h
index b53a7c02e9..11ccc61870 100644
--- a/graphics/asymptote/runpair.h
+++ b/graphics/asymptote/runpair.h
@@ -1,7 +1,6 @@
/***** Autogenerated from runpair.in; changes will be overwritten *****/
-#ifndef runpair_H
-#define runpair_H
+#pragma once
namespace run {
void pairZero(vm::stack *);
void realRealToPair(vm::stack *);
@@ -10,4 +9,3 @@ void pairXPart(vm::stack *);
void pairYPart(vm::stack *);
}
-#endif // runpair_H
diff --git a/graphics/asymptote/runpath.cc b/graphics/asymptote/runpath.cc
index b346cecd73..30e52813a7 100644
--- a/graphics/asymptote/runpath.cc
+++ b/graphics/asymptote/runpath.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runpath.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runpath.in"
+#line 1 "./runpath.in"
/*****
* runpath.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -95,94 +95,94 @@ Int windingnumber(array *p, camp::pair z)
#endif
namespace run {
-#line 44 "runpath.in"
+#line 44 "./runpath.in"
void nullPath(stack *Stack)
{
-#line 45 "runpath.in"
+#line 45 "./runpath.in"
{Stack->push<path>(nullpath); return;}
}
-#line 49 "runpath.in"
+#line 49 "./runpath.in"
// bool ==(path a, path b);
void gen_runpath1(stack *Stack)
{
path b=vm::pop<path>(Stack);
path a=vm::pop<path>(Stack);
-#line 50 "runpath.in"
+#line 50 "./runpath.in"
{Stack->push<bool>(a == b); return;}
}
-#line 54 "runpath.in"
+#line 54 "./runpath.in"
// bool !=(path a, path b);
void gen_runpath2(stack *Stack)
{
path b=vm::pop<path>(Stack);
path a=vm::pop<path>(Stack);
-#line 55 "runpath.in"
+#line 55 "./runpath.in"
{Stack->push<bool>(!(a == b)); return;}
}
-#line 59 "runpath.in"
+#line 59 "./runpath.in"
// pair point(path p, Int t);
void gen_runpath3(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
path p=vm::pop<path>(Stack);
-#line 60 "runpath.in"
+#line 60 "./runpath.in"
{Stack->push<pair>(p.point((Int) t)); return;}
}
-#line 64 "runpath.in"
+#line 64 "./runpath.in"
// pair point(path p, real t);
void gen_runpath4(stack *Stack)
{
real t=vm::pop<real>(Stack);
path p=vm::pop<path>(Stack);
-#line 65 "runpath.in"
+#line 65 "./runpath.in"
{Stack->push<pair>(p.point(t)); return;}
}
-#line 69 "runpath.in"
+#line 69 "./runpath.in"
// pair precontrol(path p, Int t);
void gen_runpath5(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
path p=vm::pop<path>(Stack);
-#line 70 "runpath.in"
+#line 70 "./runpath.in"
{Stack->push<pair>(p.precontrol((Int) t)); return;}
}
-#line 74 "runpath.in"
+#line 74 "./runpath.in"
// pair precontrol(path p, real t);
void gen_runpath6(stack *Stack)
{
real t=vm::pop<real>(Stack);
path p=vm::pop<path>(Stack);
-#line 75 "runpath.in"
+#line 75 "./runpath.in"
{Stack->push<pair>(p.precontrol(t)); return;}
}
-#line 79 "runpath.in"
+#line 79 "./runpath.in"
// pair postcontrol(path p, Int t);
void gen_runpath7(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
path p=vm::pop<path>(Stack);
-#line 80 "runpath.in"
+#line 80 "./runpath.in"
{Stack->push<pair>(p.postcontrol((Int) t)); return;}
}
-#line 84 "runpath.in"
+#line 84 "./runpath.in"
// pair postcontrol(path p, real t);
void gen_runpath8(stack *Stack)
{
real t=vm::pop<real>(Stack);
path p=vm::pop<path>(Stack);
-#line 85 "runpath.in"
+#line 85 "./runpath.in"
{Stack->push<pair>(p.postcontrol(t)); return;}
}
-#line 89 "runpath.in"
+#line 89 "./runpath.in"
// pair dir(path p, Int t, Int sign=0, bool normalize=true);
void gen_runpath9(stack *Stack)
{
@@ -190,49 +190,49 @@ void gen_runpath9(stack *Stack)
Int sign=vm::pop<Int>(Stack,0);
Int t=vm::pop<Int>(Stack);
path p=vm::pop<path>(Stack);
-#line 90 "runpath.in"
+#line 90 "./runpath.in"
{Stack->push<pair>(p.dir(t,sign,normalize)); return;}
}
-#line 94 "runpath.in"
+#line 94 "./runpath.in"
// pair dir(path p, real t, bool normalize=true);
void gen_runpath10(stack *Stack)
{
bool normalize=vm::pop<bool>(Stack,true);
real t=vm::pop<real>(Stack);
path p=vm::pop<path>(Stack);
-#line 95 "runpath.in"
+#line 95 "./runpath.in"
{Stack->push<pair>(p.dir(t,normalize)); return;}
}
-#line 99 "runpath.in"
+#line 99 "./runpath.in"
// pair accel(path p, Int t, Int sign=0);
void gen_runpath11(stack *Stack)
{
Int sign=vm::pop<Int>(Stack,0);
Int t=vm::pop<Int>(Stack);
path p=vm::pop<path>(Stack);
-#line 100 "runpath.in"
+#line 100 "./runpath.in"
{Stack->push<pair>(p.accel(t,sign)); return;}
}
-#line 104 "runpath.in"
+#line 104 "./runpath.in"
// pair accel(path p, real t);
void gen_runpath12(stack *Stack)
{
real t=vm::pop<real>(Stack);
path p=vm::pop<path>(Stack);
-#line 105 "runpath.in"
+#line 105 "./runpath.in"
{Stack->push<pair>(p.accel(t)); return;}
}
-#line 109 "runpath.in"
+#line 109 "./runpath.in"
// real radius(path p, real t);
void gen_runpath13(stack *Stack)
{
real t=vm::pop<real>(Stack);
path p=vm::pop<path>(Stack);
-#line 110 "runpath.in"
+#line 110 "./runpath.in"
pair v=p.dir(t,false);
pair a=p.accel(t);
real d=dot(a,v);
@@ -243,38 +243,38 @@ void gen_runpath13(stack *Stack)
{Stack->push<real>(denom > 0 ? r/sqrt(denom) : 0.0); return;}
}
-#line 121 "runpath.in"
+#line 121 "./runpath.in"
// path reverse(path p);
void gen_runpath14(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 122 "runpath.in"
+#line 122 "./runpath.in"
{Stack->push<path>(p.reverse()); return;}
}
-#line 126 "runpath.in"
+#line 126 "./runpath.in"
// path subpath(path p, Int a, Int b);
void gen_runpath15(stack *Stack)
{
Int b=vm::pop<Int>(Stack);
Int a=vm::pop<Int>(Stack);
path p=vm::pop<path>(Stack);
-#line 127 "runpath.in"
+#line 127 "./runpath.in"
{Stack->push<path>(p.subpath((Int) a, (Int) b)); return;}
}
-#line 131 "runpath.in"
+#line 131 "./runpath.in"
// path subpath(path p, real a, real b);
void gen_runpath16(stack *Stack)
{
real b=vm::pop<real>(Stack);
real a=vm::pop<real>(Stack);
path p=vm::pop<path>(Stack);
-#line 132 "runpath.in"
+#line 132 "./runpath.in"
{Stack->push<path>(p.subpath(a,b)); return;}
}
-#line 136 "runpath.in"
+#line 136 "./runpath.in"
// path nurb(pair z0, pair z1, pair z2, pair z3, real w0, real w1, real w2, real w3, Int m);
void gen_runpath17(stack *Stack)
{
@@ -287,66 +287,66 @@ void gen_runpath17(stack *Stack)
pair z2=vm::pop<pair>(Stack);
pair z1=vm::pop<pair>(Stack);
pair z0=vm::pop<pair>(Stack);
-#line 138 "runpath.in"
+#line 138 "./runpath.in"
{Stack->push<path>(nurb(z0,z1,z2,z3,w0,w1,w2,w3,m)); return;}
}
-#line 142 "runpath.in"
+#line 142 "./runpath.in"
// Int length(path p);
void gen_runpath18(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 143 "runpath.in"
+#line 143 "./runpath.in"
{Stack->push<Int>(p.length()); return;}
}
-#line 147 "runpath.in"
+#line 147 "./runpath.in"
// bool cyclic(path p);
void gen_runpath19(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 148 "runpath.in"
+#line 148 "./runpath.in"
{Stack->push<bool>(p.cyclic()); return;}
}
-#line 152 "runpath.in"
+#line 152 "./runpath.in"
// bool straight(path p, Int t);
void gen_runpath20(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
path p=vm::pop<path>(Stack);
-#line 153 "runpath.in"
+#line 153 "./runpath.in"
{Stack->push<bool>(p.straight(t)); return;}
}
-#line 157 "runpath.in"
+#line 157 "./runpath.in"
// path unstraighten(path p);
void gen_runpath21(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 158 "runpath.in"
+#line 158 "./runpath.in"
{Stack->push<path>(p.unstraighten()); return;}
}
-#line 162 "runpath.in"
+#line 162 "./runpath.in"
// bool piecewisestraight(path p);
void gen_runpath22(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 163 "runpath.in"
+#line 163 "./runpath.in"
{Stack->push<bool>(p.piecewisestraight()); return;}
}
-#line 167 "runpath.in"
+#line 167 "./runpath.in"
// real arclength(path p);
void gen_runpath23(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 168 "runpath.in"
+#line 168 "./runpath.in"
{Stack->push<real>(p.arclength()); return;}
}
-#line 172 "runpath.in"
+#line 172 "./runpath.in"
// real arclength(pair z0, pair c0, pair c1, pair z1);
void gen_runpath24(stack *Stack)
{
@@ -354,38 +354,38 @@ void gen_runpath24(stack *Stack)
pair c1=vm::pop<pair>(Stack);
pair c0=vm::pop<pair>(Stack);
pair z0=vm::pop<pair>(Stack);
-#line 173 "runpath.in"
+#line 173 "./runpath.in"
{Stack->push<real>(arcLength(z0,c0,c1,z1)); return;}
}
-#line 177 "runpath.in"
+#line 177 "./runpath.in"
// real arctime(path p, real L);
void gen_runpath25(stack *Stack)
{
real L=vm::pop<real>(Stack);
path p=vm::pop<path>(Stack);
-#line 178 "runpath.in"
+#line 178 "./runpath.in"
{Stack->push<real>(p.arctime(L)); return;}
}
-#line 182 "runpath.in"
+#line 182 "./runpath.in"
// real dirtime(path p, pair z);
void gen_runpath26(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
path p=vm::pop<path>(Stack);
-#line 183 "runpath.in"
+#line 183 "./runpath.in"
{Stack->push<real>(p.directiontime(z)); return;}
}
-#line 187 "runpath.in"
+#line 187 "./runpath.in"
// realarray* intersect(path p, path q, real fuzz=-1);
void gen_runpath27(stack *Stack)
{
real fuzz=vm::pop<real>(Stack,-1);
path q=vm::pop<path>(Stack);
path p=vm::pop<path>(Stack);
-#line 188 "runpath.in"
+#line 188 "./runpath.in"
bool exact=fuzz <= 0.0;
if(fuzz < 0)
fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())),
@@ -401,14 +401,14 @@ void gen_runpath27(stack *Stack)
{Stack->push<realarray*>(new array(0)); return;}
}
-#line 204 "runpath.in"
+#line 204 "./runpath.in"
// realarray2* intersections(path p, path q, real fuzz=-1);
void gen_runpath28(stack *Stack)
{
real fuzz=vm::pop<real>(Stack,-1);
path q=vm::pop<path>(Stack);
path p=vm::pop<path>(Stack);
-#line 205 "runpath.in"
+#line 205 "./runpath.in"
bool exact=fuzz <= 0.0;
if(fuzz < 0.0)
fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())),
@@ -438,7 +438,7 @@ void gen_runpath28(stack *Stack)
{Stack->push<realarray2*>(V); return;}
}
-#line 235 "runpath.in"
+#line 235 "./runpath.in"
// realarray* intersections(path p, explicit pair a, explicit pair b, real fuzz=-1);
void gen_runpath29(stack *Stack)
{
@@ -446,7 +446,7 @@ void gen_runpath29(stack *Stack)
pair b=vm::pop<pair>(Stack);
pair a=vm::pop<pair>(Stack);
path p=vm::pop<path>(Stack);
-#line 236 "runpath.in"
+#line 236 "./runpath.in"
if(fuzz < 0)
fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())),
::max(length(a),length(b)));
@@ -462,7 +462,7 @@ void gen_runpath29(stack *Stack)
// Return the intersection point of the extensions of the line segments
// PQ and pq.
-#line 252 "runpath.in"
+#line 252 "./runpath.in"
// pair extension(pair P, pair Q, pair p, pair q);
void gen_runpath30(stack *Stack)
{
@@ -470,7 +470,7 @@ void gen_runpath30(stack *Stack)
pair p=vm::pop<pair>(Stack);
pair Q=vm::pop<pair>(Stack);
pair P=vm::pop<pair>(Stack);
-#line 253 "runpath.in"
+#line 253 "./runpath.in"
pair ac=P-Q;
pair bd=q-p;
real det=ac.getx()*bd.gety()-ac.gety()*bd.getx();
@@ -478,49 +478,49 @@ void gen_runpath30(stack *Stack)
{Stack->push<pair>(P+((p.getx()-P.getx())*bd.gety()-(p.gety()-P.gety())*bd.getx())*ac/det); return;}
}
-#line 261 "runpath.in"
+#line 261 "./runpath.in"
// Int size(path p);
void gen_runpath31(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 262 "runpath.in"
+#line 262 "./runpath.in"
{Stack->push<Int>(p.size()); return;}
}
-#line 266 "runpath.in"
+#line 266 "./runpath.in"
// path &(path p, path q);
void gen_runpath32(stack *Stack)
{
path q=vm::pop<path>(Stack);
path p=vm::pop<path>(Stack);
-#line 267 "runpath.in"
+#line 267 "./runpath.in"
{Stack->push<path>(camp::concat(p,q)); return;}
}
-#line 271 "runpath.in"
+#line 271 "./runpath.in"
// pair min(explicit path p);
void gen_runpath33(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 272 "runpath.in"
+#line 272 "./runpath.in"
{Stack->push<pair>(p.min()); return;}
}
-#line 276 "runpath.in"
+#line 276 "./runpath.in"
// pair max(explicit path p);
void gen_runpath34(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 277 "runpath.in"
+#line 277 "./runpath.in"
{Stack->push<pair>(p.max()); return;}
}
-#line 281 "runpath.in"
+#line 281 "./runpath.in"
// Int size(patharray *p);
void gen_runpath35(stack *Stack)
{
patharray * p=vm::pop<patharray *>(Stack);
-#line 282 "runpath.in"
+#line 282 "./runpath.in"
size_t size=checkArray(p);
Int count=0;
for (size_t i = 0; i < size; i++)
@@ -528,12 +528,12 @@ void gen_runpath35(stack *Stack)
{Stack->push<Int>(count); return;}
}
-#line 290 "runpath.in"
+#line 290 "./runpath.in"
// pair min(patharray *p);
void gen_runpath36(stack *Stack)
{
patharray * p=vm::pop<patharray *>(Stack);
-#line 291 "runpath.in"
+#line 291 "./runpath.in"
size_t size=checkArray(p);
if(size == 0)
@@ -556,12 +556,12 @@ void gen_runpath36(stack *Stack)
{Stack->push<pair>(pair(minx, miny)); return;}
}
-#line 314 "runpath.in"
+#line 314 "./runpath.in"
// pair max(patharray *p);
void gen_runpath37(stack *Stack)
{
patharray * p=vm::pop<patharray *>(Stack);
-#line 315 "runpath.in"
+#line 315 "./runpath.in"
size_t size=checkArray(p);
if(size == 0)
@@ -584,13 +584,13 @@ void gen_runpath37(stack *Stack)
{Stack->push<pair>(pair(maxx, maxy)); return;}
}
-#line 338 "runpath.in"
+#line 338 "./runpath.in"
// pair minAfterTransform(transform t, patharray *p);
void gen_runpath38(stack *Stack)
{
patharray * p=vm::pop<patharray *>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 339 "runpath.in"
+#line 339 "./runpath.in"
size_t size=checkArray(p);
if(size == 0)
@@ -613,13 +613,13 @@ void gen_runpath38(stack *Stack)
{Stack->push<pair>(pair(minx, miny)); return;}
}
-#line 362 "runpath.in"
+#line 362 "./runpath.in"
// pair maxAfterTransform(transform t, patharray *p);
void gen_runpath39(stack *Stack)
{
patharray * p=vm::pop<patharray *>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 363 "runpath.in"
+#line 363 "./runpath.in"
size_t size=checkArray(p);
if(size == 0)
@@ -642,12 +642,12 @@ void gen_runpath39(stack *Stack)
{Stack->push<pair>(pair(maxx, maxy)); return;}
}
-#line 386 "runpath.in"
+#line 386 "./runpath.in"
// realarray* mintimes(path p);
void gen_runpath40(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 387 "runpath.in"
+#line 387 "./runpath.in"
array *V=new array(2);
pair z=p.mintimes();
(*V)[0]=z.getx();
@@ -655,12 +655,12 @@ void gen_runpath40(stack *Stack)
{Stack->push<realarray*>(V); return;}
}
-#line 395 "runpath.in"
+#line 395 "./runpath.in"
// realarray* maxtimes(path p);
void gen_runpath41(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 396 "runpath.in"
+#line 396 "./runpath.in"
array *V=new array(2);
pair z=p.maxtimes();
(*V)[0]=z.getx();
@@ -668,7 +668,7 @@ void gen_runpath41(stack *Stack)
{Stack->push<realarray*>(V); return;}
}
-#line 404 "runpath.in"
+#line 404 "./runpath.in"
// real relativedistance(real theta, real phi, real t, bool atleast);
void gen_runpath42(stack *Stack)
{
@@ -676,39 +676,39 @@ void gen_runpath42(stack *Stack)
real t=vm::pop<real>(Stack);
real phi=vm::pop<real>(Stack);
real theta=vm::pop<real>(Stack);
-#line 405 "runpath.in"
+#line 405 "./runpath.in"
{Stack->push<real>(camp::velocity(theta,phi,tension(t,atleast))); return;}
}
-#line 409 "runpath.in"
+#line 409 "./runpath.in"
// Int windingnumber(patharray *p, pair z);
void gen_runpath43(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
patharray * p=vm::pop<patharray *>(Stack);
-#line 410 "runpath.in"
+#line 410 "./runpath.in"
{Stack->push<Int>(windingnumber(p,z)); return;}
}
-#line 414 "runpath.in"
+#line 414 "./runpath.in"
// bool inside(explicit patharray *g, pair z, pen fillrule=CURRENTPEN);
void gen_runpath44(stack *Stack)
{
pen fillrule=vm::pop<pen>(Stack,CURRENTPEN);
pair z=vm::pop<pair>(Stack);
patharray * g=vm::pop<patharray *>(Stack);
-#line 415 "runpath.in"
+#line 415 "./runpath.in"
{Stack->push<bool>(fillrule.inside(windingnumber(g,z))); return;}
}
-#line 419 "runpath.in"
+#line 419 "./runpath.in"
// bool inside(path g, pair z, pen fillrule=CURRENTPEN);
void gen_runpath45(stack *Stack)
{
pen fillrule=vm::pop<pen>(Stack,CURRENTPEN);
pair z=vm::pop<pair>(Stack);
path g=vm::pop<path>(Stack);
-#line 420 "runpath.in"
+#line 420 "./runpath.in"
{Stack->push<bool>(fillrule.inside(g.windingnumber(z))); return;}
}
@@ -721,14 +721,14 @@ void gen_runpath45(stack *Stack)
// |b.x b.y 1|
// |c.x c.y 1|
//
-#line 433 "runpath.in"
+#line 433 "./runpath.in"
// real orient(pair a, pair b, pair c);
void gen_runpath46(stack *Stack)
{
pair c=vm::pop<pair>(Stack);
pair b=vm::pop<pair>(Stack);
pair a=vm::pop<pair>(Stack);
-#line 434 "runpath.in"
+#line 434 "./runpath.in"
{Stack->push<real>(orient2d(a,b,c)); return;}
}
@@ -740,7 +740,7 @@ void gen_runpath46(stack *Stack)
// |b.x b.y b.x^2+b.y^2 1|
// |c.x c.y c.x^2+c.y^2 1|
// |d.x d.y d.x^2+d.y^2 1|
-#line 446 "runpath.in"
+#line 446 "./runpath.in"
// real incircle(pair a, pair b, pair c, pair d);
void gen_runpath47(stack *Stack)
{
@@ -748,7 +748,7 @@ void gen_runpath47(stack *Stack)
pair c=vm::pop<pair>(Stack);
pair b=vm::pop<pair>(Stack);
pair a=vm::pop<pair>(Stack);
-#line 447 "runpath.in"
+#line 447 "./runpath.in"
{Stack->push<real>(incircle(a.getx(),a.gety(),b.getx(),b.gety(),c.getx(),c.gety(),
d.getx(),d.gety())); return;}
}
@@ -759,101 +759,101 @@ namespace trans {
void gen_runpath_venv(venv &ve)
{
-#line 44 "runpath.in"
+#line 44 "./runpath.in"
REGISTER_BLTIN(run::nullPath,"nullPath");
-#line 49 "runpath.in"
+#line 49 "./runpath.in"
addFunc(ve, run::gen_runpath1, primBoolean(), SYM_EQ, formal(primPath(), SYM(a), false, false), formal(primPath(), SYM(b), false, false));
-#line 54 "runpath.in"
+#line 54 "./runpath.in"
addFunc(ve, run::gen_runpath2, primBoolean(), SYM_NEQ, formal(primPath(), SYM(a), false, false), formal(primPath(), SYM(b), false, false));
-#line 59 "runpath.in"
+#line 59 "./runpath.in"
addFunc(ve, run::gen_runpath3, primPair(), SYM(point), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false));
-#line 64 "runpath.in"
+#line 64 "./runpath.in"
addFunc(ve, run::gen_runpath4, primPair(), SYM(point), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false));
-#line 69 "runpath.in"
+#line 69 "./runpath.in"
addFunc(ve, run::gen_runpath5, primPair(), SYM(precontrol), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false));
-#line 74 "runpath.in"
+#line 74 "./runpath.in"
addFunc(ve, run::gen_runpath6, primPair(), SYM(precontrol), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false));
-#line 79 "runpath.in"
+#line 79 "./runpath.in"
addFunc(ve, run::gen_runpath7, primPair(), SYM(postcontrol), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false));
-#line 84 "runpath.in"
+#line 84 "./runpath.in"
addFunc(ve, run::gen_runpath8, primPair(), SYM(postcontrol), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false));
-#line 89 "runpath.in"
+#line 89 "./runpath.in"
addFunc(ve, run::gen_runpath9, primPair(), SYM(dir), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false), formal(primInt(), SYM(sign), true, false), formal(primBoolean(), SYM(normalize), true, false));
-#line 94 "runpath.in"
+#line 94 "./runpath.in"
addFunc(ve, run::gen_runpath10, primPair(), SYM(dir), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false), formal(primBoolean(), SYM(normalize), true, false));
-#line 99 "runpath.in"
+#line 99 "./runpath.in"
addFunc(ve, run::gen_runpath11, primPair(), SYM(accel), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false), formal(primInt(), SYM(sign), true, false));
-#line 104 "runpath.in"
+#line 104 "./runpath.in"
addFunc(ve, run::gen_runpath12, primPair(), SYM(accel), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false));
-#line 109 "runpath.in"
+#line 109 "./runpath.in"
addFunc(ve, run::gen_runpath13, primReal(), SYM(radius), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(t), false, false));
-#line 121 "runpath.in"
+#line 121 "./runpath.in"
addFunc(ve, run::gen_runpath14, primPath(), SYM(reverse), formal(primPath(), SYM(p), false, false));
-#line 126 "runpath.in"
+#line 126 "./runpath.in"
addFunc(ve, run::gen_runpath15, primPath(), SYM(subpath), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(a), false, false), formal(primInt(), SYM(b), false, false));
-#line 131 "runpath.in"
+#line 131 "./runpath.in"
addFunc(ve, run::gen_runpath16, primPath(), SYM(subpath), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false));
-#line 136 "runpath.in"
+#line 136 "./runpath.in"
addFunc(ve, run::gen_runpath17, primPath(), SYM(nurb), formal(primPair(), SYM(z0), false, false), formal(primPair(), SYM(z1), false, false), formal(primPair(), SYM(z2), false, false), formal(primPair(), SYM(z3), false, false), formal(primReal(), SYM(w0), false, false), formal(primReal(), SYM(w1), false, false), formal(primReal(), SYM(w2), false, false), formal(primReal(), SYM(w3), false, false), formal(primInt(), SYM(m), false, false));
-#line 142 "runpath.in"
+#line 142 "./runpath.in"
addFunc(ve, run::gen_runpath18, primInt(), SYM(length), formal(primPath(), SYM(p), false, false));
-#line 147 "runpath.in"
+#line 147 "./runpath.in"
addFunc(ve, run::gen_runpath19, primBoolean(), SYM(cyclic), formal(primPath(), SYM(p), false, false));
-#line 152 "runpath.in"
+#line 152 "./runpath.in"
addFunc(ve, run::gen_runpath20, primBoolean(), SYM(straight), formal(primPath(), SYM(p), false, false), formal(primInt(), SYM(t), false, false));
-#line 157 "runpath.in"
+#line 157 "./runpath.in"
addFunc(ve, run::gen_runpath21, primPath(), SYM(unstraighten), formal(primPath(), SYM(p), false, false));
-#line 162 "runpath.in"
+#line 162 "./runpath.in"
addFunc(ve, run::gen_runpath22, primBoolean(), SYM(piecewisestraight), formal(primPath(), SYM(p), false, false));
-#line 167 "runpath.in"
+#line 167 "./runpath.in"
addFunc(ve, run::gen_runpath23, primReal(), SYM(arclength), formal(primPath(), SYM(p), false, false));
-#line 172 "runpath.in"
+#line 172 "./runpath.in"
addFunc(ve, run::gen_runpath24, primReal(), SYM(arclength), formal(primPair(), SYM(z0), false, false), formal(primPair(), SYM(c0), false, false), formal(primPair(), SYM(c1), false, false), formal(primPair(), SYM(z1), false, false));
-#line 177 "runpath.in"
+#line 177 "./runpath.in"
addFunc(ve, run::gen_runpath25, primReal(), SYM(arctime), formal(primPath(), SYM(p), false, false), formal(primReal(), SYM(l), false, false));
-#line 182 "runpath.in"
+#line 182 "./runpath.in"
addFunc(ve, run::gen_runpath26, primReal(), SYM(dirtime), formal(primPath(), SYM(p), false, false), formal(primPair(), SYM(z), false, false));
-#line 187 "runpath.in"
+#line 187 "./runpath.in"
addFunc(ve, run::gen_runpath27, realArray(), SYM(intersect), formal(primPath(), SYM(p), false, false), formal(primPath(), SYM(q), false, false), formal(primReal(), SYM(fuzz), true, false));
-#line 204 "runpath.in"
+#line 204 "./runpath.in"
addFunc(ve, run::gen_runpath28, realArray2(), SYM(intersections), formal(primPath(), SYM(p), false, false), formal(primPath(), SYM(q), false, false), formal(primReal(), SYM(fuzz), true, false));
-#line 235 "runpath.in"
+#line 235 "./runpath.in"
addFunc(ve, run::gen_runpath29, realArray(), SYM(intersections), formal(primPath(), SYM(p), false, false), formal(primPair(), SYM(a), false, true), formal(primPair(), SYM(b), false, true), formal(primReal(), SYM(fuzz), true, false));
-#line 250 "runpath.in"
+#line 250 "./runpath.in"
addFunc(ve, run::gen_runpath30, primPair(), SYM(extension), formal(primPair(), SYM(p), false, false), formal(primPair(), SYM(q), false, false), formal(primPair(), SYM(p), false, false), formal(primPair(), SYM(q), false, false));
-#line 261 "runpath.in"
+#line 261 "./runpath.in"
addFunc(ve, run::gen_runpath31, primInt(), SYM(size), formal(primPath(), SYM(p), false, false));
-#line 266 "runpath.in"
+#line 266 "./runpath.in"
addFunc(ve, run::gen_runpath32, primPath(), SYM_AMPERSAND, formal(primPath(), SYM(p), false, false), formal(primPath(), SYM(q), false, false));
-#line 271 "runpath.in"
+#line 271 "./runpath.in"
addFunc(ve, run::gen_runpath33, primPair(), SYM(min), formal(primPath(), SYM(p), false, true));
-#line 276 "runpath.in"
+#line 276 "./runpath.in"
addFunc(ve, run::gen_runpath34, primPair(), SYM(max), formal(primPath(), SYM(p), false, true));
-#line 281 "runpath.in"
+#line 281 "./runpath.in"
addFunc(ve, run::gen_runpath35, primInt(), SYM(size), formal(pathArray(), SYM(p), false, false));
-#line 290 "runpath.in"
+#line 290 "./runpath.in"
addFunc(ve, run::gen_runpath36, primPair(), SYM(min), formal(pathArray(), SYM(p), false, false));
-#line 314 "runpath.in"
+#line 314 "./runpath.in"
addFunc(ve, run::gen_runpath37, primPair(), SYM(max), formal(pathArray(), SYM(p), false, false));
-#line 338 "runpath.in"
+#line 338 "./runpath.in"
addFunc(ve, run::gen_runpath38, primPair(), SYM(minAfterTransform), formal(primTransform(), SYM(t), false, false), formal(pathArray(), SYM(p), false, false));
-#line 362 "runpath.in"
+#line 362 "./runpath.in"
addFunc(ve, run::gen_runpath39, primPair(), SYM(maxAfterTransform), formal(primTransform(), SYM(t), false, false), formal(pathArray(), SYM(p), false, false));
-#line 386 "runpath.in"
+#line 386 "./runpath.in"
addFunc(ve, run::gen_runpath40, realArray(), SYM(mintimes), formal(primPath(), SYM(p), false, false));
-#line 395 "runpath.in"
+#line 395 "./runpath.in"
addFunc(ve, run::gen_runpath41, realArray(), SYM(maxtimes), formal(primPath(), SYM(p), false, false));
-#line 404 "runpath.in"
+#line 404 "./runpath.in"
addFunc(ve, run::gen_runpath42, primReal(), SYM(relativedistance), formal(primReal(), SYM(theta), false, false), formal(primReal(), SYM(phi), false, false), formal(primReal(), SYM(t), false, false), formal(primBoolean(), SYM(atleast), false, false));
-#line 409 "runpath.in"
+#line 409 "./runpath.in"
addFunc(ve, run::gen_runpath43, primInt(), SYM(windingnumber), formal(pathArray(), SYM(p), false, false), formal(primPair(), SYM(z), false, false));
-#line 414 "runpath.in"
+#line 414 "./runpath.in"
addFunc(ve, run::gen_runpath44, primBoolean(), SYM(inside), formal(pathArray(), SYM(g), false, true), formal(primPair(), SYM(z), false, false), formal(primPen(), SYM(fillrule), true, false));
-#line 419 "runpath.in"
+#line 419 "./runpath.in"
addFunc(ve, run::gen_runpath45, primBoolean(), SYM(inside), formal(primPath(), SYM(g), false, false), formal(primPair(), SYM(z), false, false), formal(primPen(), SYM(fillrule), true, false));
-#line 424 "runpath.in"
+#line 424 "./runpath.in"
addFunc(ve, run::gen_runpath46, primReal(), SYM(orient), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false), formal(primPair(), SYM(c), false, false));
-#line 438 "runpath.in"
+#line 438 "./runpath.in"
addFunc(ve, run::gen_runpath47, primReal(), SYM(incircle), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false), formal(primPair(), SYM(c), false, false), formal(primPair(), SYM(d), false, false));
}
diff --git a/graphics/asymptote/runpath.h b/graphics/asymptote/runpath.h
index 18ee20cb57..ef1e6ed25b 100644
--- a/graphics/asymptote/runpath.h
+++ b/graphics/asymptote/runpath.h
@@ -1,9 +1,7 @@
/***** Autogenerated from runpath.in; changes will be overwritten *****/
-#ifndef runpath_H
-#define runpath_H
+#pragma once
namespace run {
void nullPath(vm::stack *);
}
-#endif // runpath_H
diff --git a/graphics/asymptote/runpath3d.cc b/graphics/asymptote/runpath3d.cc
index cb80e3b692..0a789dcbdc 100644
--- a/graphics/asymptote/runpath3d.cc
+++ b/graphics/asymptote/runpath3d.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runpath3d.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runpath3d.in"
+#line 1 "./runpath3d.in"
/*****
* runpath3.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -91,7 +91,7 @@ using types::tripleArray2;
#endif
namespace run {
-#line 40 "runpath3d.in"
+#line 40 "./runpath3d.in"
// path3 path3(triplearray *pre, triplearray *point, triplearray *post, boolarray *straight, bool cyclic);
void gen_runpath3d0(stack *Stack)
{
@@ -100,7 +100,7 @@ void gen_runpath3d0(stack *Stack)
triplearray * post=vm::pop<triplearray *>(Stack);
triplearray * point=vm::pop<triplearray *>(Stack);
triplearray * pre=vm::pop<triplearray *>(Stack);
-#line 42 "runpath3d.in"
+#line 42 "./runpath3d.in"
size_t n=checkArrays(pre,point);
checkEqual(n,checkArray(post));
checkEqual(n,checkArray(straight));
@@ -115,94 +115,94 @@ void gen_runpath3d0(stack *Stack)
{Stack->push<path3>(path3(nodes,(Int) n,cyclic)); return;}
}
-#line 57 "runpath3d.in"
+#line 57 "./runpath3d.in"
void nullPath3(stack *Stack)
{
-#line 58 "runpath3d.in"
+#line 58 "./runpath3d.in"
{Stack->push<path3>(nullpath3); return;}
}
-#line 62 "runpath3d.in"
+#line 62 "./runpath3d.in"
// bool ==(path3 a, path3 b);
void gen_runpath3d2(stack *Stack)
{
path3 b=vm::pop<path3>(Stack);
path3 a=vm::pop<path3>(Stack);
-#line 63 "runpath3d.in"
+#line 63 "./runpath3d.in"
{Stack->push<bool>(a == b); return;}
}
-#line 67 "runpath3d.in"
+#line 67 "./runpath3d.in"
// bool !=(path3 a, path3 b);
void gen_runpath3d3(stack *Stack)
{
path3 b=vm::pop<path3>(Stack);
path3 a=vm::pop<path3>(Stack);
-#line 68 "runpath3d.in"
+#line 68 "./runpath3d.in"
{Stack->push<bool>(!(a == b)); return;}
}
-#line 72 "runpath3d.in"
+#line 72 "./runpath3d.in"
// triple point(path3 p, Int t);
void gen_runpath3d4(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 73 "runpath3d.in"
+#line 73 "./runpath3d.in"
{Stack->push<triple>(p.point((Int) t)); return;}
}
-#line 77 "runpath3d.in"
+#line 77 "./runpath3d.in"
// triple point(path3 p, real t);
void gen_runpath3d5(stack *Stack)
{
real t=vm::pop<real>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 78 "runpath3d.in"
+#line 78 "./runpath3d.in"
{Stack->push<triple>(p.point(t)); return;}
}
-#line 82 "runpath3d.in"
+#line 82 "./runpath3d.in"
// triple precontrol(path3 p, Int t);
void gen_runpath3d6(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 83 "runpath3d.in"
+#line 83 "./runpath3d.in"
{Stack->push<triple>(p.precontrol((Int) t)); return;}
}
-#line 87 "runpath3d.in"
+#line 87 "./runpath3d.in"
// triple precontrol(path3 p, real t);
void gen_runpath3d7(stack *Stack)
{
real t=vm::pop<real>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 88 "runpath3d.in"
+#line 88 "./runpath3d.in"
{Stack->push<triple>(p.precontrol(t)); return;}
}
-#line 92 "runpath3d.in"
+#line 92 "./runpath3d.in"
// triple postcontrol(path3 p, Int t);
void gen_runpath3d8(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 93 "runpath3d.in"
+#line 93 "./runpath3d.in"
{Stack->push<triple>(p.postcontrol((Int) t)); return;}
}
-#line 97 "runpath3d.in"
+#line 97 "./runpath3d.in"
// triple postcontrol(path3 p, real t);
void gen_runpath3d9(stack *Stack)
{
real t=vm::pop<real>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 98 "runpath3d.in"
+#line 98 "./runpath3d.in"
{Stack->push<triple>(p.postcontrol(t)); return;}
}
-#line 102 "runpath3d.in"
+#line 102 "./runpath3d.in"
// triple dir(path3 p, Int t, Int sign=0, bool normalize=true);
void gen_runpath3d10(stack *Stack)
{
@@ -210,49 +210,49 @@ void gen_runpath3d10(stack *Stack)
Int sign=vm::pop<Int>(Stack,0);
Int t=vm::pop<Int>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 103 "runpath3d.in"
+#line 103 "./runpath3d.in"
{Stack->push<triple>(p.dir(t,sign,normalize)); return;}
}
-#line 107 "runpath3d.in"
+#line 107 "./runpath3d.in"
// triple dir(path3 p, real t, bool normalize=true);
void gen_runpath3d11(stack *Stack)
{
bool normalize=vm::pop<bool>(Stack,true);
real t=vm::pop<real>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 108 "runpath3d.in"
+#line 108 "./runpath3d.in"
{Stack->push<triple>(p.dir(t,normalize)); return;}
}
-#line 112 "runpath3d.in"
+#line 112 "./runpath3d.in"
// triple accel(path3 p, Int t, Int sign=0);
void gen_runpath3d12(stack *Stack)
{
Int sign=vm::pop<Int>(Stack,0);
Int t=vm::pop<Int>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 113 "runpath3d.in"
+#line 113 "./runpath3d.in"
{Stack->push<triple>(p.accel(t,sign)); return;}
}
-#line 117 "runpath3d.in"
+#line 117 "./runpath3d.in"
// triple accel(path3 p, real t);
void gen_runpath3d13(stack *Stack)
{
real t=vm::pop<real>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 118 "runpath3d.in"
+#line 118 "./runpath3d.in"
{Stack->push<triple>(p.accel(t)); return;}
}
-#line 122 "runpath3d.in"
+#line 122 "./runpath3d.in"
// real radius(path3 p, real t);
void gen_runpath3d14(stack *Stack)
{
real t=vm::pop<real>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 123 "runpath3d.in"
+#line 123 "./runpath3d.in"
triple v=p.dir(t,false);
triple a=p.accel(t);
real d=dot(a,v);
@@ -263,7 +263,7 @@ void gen_runpath3d14(stack *Stack)
{Stack->push<real>(denom > 0 ? r/sqrt(denom) : 0.0); return;}
}
-#line 134 "runpath3d.in"
+#line 134 "./runpath3d.in"
// real radius(triple z0, triple c0, triple c1, triple z1, real t);
void gen_runpath3d15(stack *Stack)
{
@@ -272,7 +272,7 @@ void gen_runpath3d15(stack *Stack)
triple c1=vm::pop<triple>(Stack);
triple c0=vm::pop<triple>(Stack);
triple z0=vm::pop<triple>(Stack);
-#line 135 "runpath3d.in"
+#line 135 "./runpath3d.in"
triple v=(3.0*(z1-z0)+9.0*(c0-c1))*t*t+(6.0*(z0+c1)-12.0*c0)*t+3.0*(c0-z0);
triple a=6.0*(z1-z0+3.0*(c0-c1))*t+6.0*(z0+c1)-12.0*c0;
real d=dot(a,v);
@@ -283,77 +283,77 @@ void gen_runpath3d15(stack *Stack)
{Stack->push<real>(denom > 0 ? r/sqrt(denom) : 0.0); return;}
}
-#line 146 "runpath3d.in"
+#line 146 "./runpath3d.in"
// path3 reverse(path3 p);
void gen_runpath3d16(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 147 "runpath3d.in"
+#line 147 "./runpath3d.in"
{Stack->push<path3>(p.reverse()); return;}
}
-#line 151 "runpath3d.in"
+#line 151 "./runpath3d.in"
// path3 subpath(path3 p, Int a, Int b);
void gen_runpath3d17(stack *Stack)
{
Int b=vm::pop<Int>(Stack);
Int a=vm::pop<Int>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 152 "runpath3d.in"
+#line 152 "./runpath3d.in"
{Stack->push<path3>(p.subpath((Int) a, (Int) b)); return;}
}
-#line 156 "runpath3d.in"
+#line 156 "./runpath3d.in"
// path3 subpath(path3 p, real a, real b);
void gen_runpath3d18(stack *Stack)
{
real b=vm::pop<real>(Stack);
real a=vm::pop<real>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 157 "runpath3d.in"
+#line 157 "./runpath3d.in"
{Stack->push<path3>(p.subpath(a,b)); return;}
}
-#line 161 "runpath3d.in"
+#line 161 "./runpath3d.in"
// Int length(path3 p);
void gen_runpath3d19(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 162 "runpath3d.in"
+#line 162 "./runpath3d.in"
{Stack->push<Int>(p.length()); return;}
}
-#line 166 "runpath3d.in"
+#line 166 "./runpath3d.in"
// bool cyclic(path3 p);
void gen_runpath3d20(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 167 "runpath3d.in"
+#line 167 "./runpath3d.in"
{Stack->push<bool>(p.cyclic()); return;}
}
-#line 171 "runpath3d.in"
+#line 171 "./runpath3d.in"
// bool straight(path3 p, Int t);
void gen_runpath3d21(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 172 "runpath3d.in"
+#line 172 "./runpath3d.in"
{Stack->push<bool>(p.straight(t)); return;}
}
-#line 176 "runpath3d.in"
+#line 176 "./runpath3d.in"
// path3 unstraighten(path3 p);
void gen_runpath3d22(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 177 "runpath3d.in"
+#line 177 "./runpath3d.in"
{Stack->push<path3>(p.unstraighten()); return;}
}
// return the maximum distance squared of points c0 and c1 from
// the respective internal control points of z0--z1.
-#line 183 "runpath3d.in"
+#line 183 "./runpath3d.in"
// real straightness(triple z0, triple c0, triple c1, triple z1);
void gen_runpath3d23(stack *Stack)
{
@@ -361,42 +361,42 @@ void gen_runpath3d23(stack *Stack)
triple c1=vm::pop<triple>(Stack);
triple c0=vm::pop<triple>(Stack);
triple z0=vm::pop<triple>(Stack);
-#line 184 "runpath3d.in"
+#line 184 "./runpath3d.in"
{Stack->push<real>(Straightness(z0,c0,c1,z1)); return;}
}
// return the straightness of segment i of path3 g.
-#line 189 "runpath3d.in"
+#line 189 "./runpath3d.in"
// real straightness(path3 p, Int t);
void gen_runpath3d24(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 190 "runpath3d.in"
+#line 190 "./runpath3d.in"
if(p.straight(t)) {Stack->push<real>(0); return;}
{Stack->push<real>(Straightness(p.point(t),p.postcontrol(t),p.precontrol(t+1),
p.point(t+1))); return;}
}
-#line 196 "runpath3d.in"
+#line 196 "./runpath3d.in"
// bool piecewisestraight(path3 p);
void gen_runpath3d25(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 197 "runpath3d.in"
+#line 197 "./runpath3d.in"
{Stack->push<bool>(p.piecewisestraight()); return;}
}
-#line 201 "runpath3d.in"
+#line 201 "./runpath3d.in"
// real arclength(path3 p);
void gen_runpath3d26(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 202 "runpath3d.in"
+#line 202 "./runpath3d.in"
{Stack->push<real>(p.arclength()); return;}
}
-#line 206 "runpath3d.in"
+#line 206 "./runpath3d.in"
// real arclength(triple z0, triple c0, triple c1, triple z1);
void gen_runpath3d27(stack *Stack)
{
@@ -404,28 +404,28 @@ void gen_runpath3d27(stack *Stack)
triple c1=vm::pop<triple>(Stack);
triple c0=vm::pop<triple>(Stack);
triple z0=vm::pop<triple>(Stack);
-#line 207 "runpath3d.in"
+#line 207 "./runpath3d.in"
{Stack->push<real>(arcLength(z0,c0,c1,z1)); return;}
}
-#line 211 "runpath3d.in"
+#line 211 "./runpath3d.in"
// real arctime(path3 p, real dval);
void gen_runpath3d28(stack *Stack)
{
real dval=vm::pop<real>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 212 "runpath3d.in"
+#line 212 "./runpath3d.in"
{Stack->push<real>(p.arctime(dval)); return;}
}
-#line 216 "runpath3d.in"
+#line 216 "./runpath3d.in"
// realarray* intersect(path3 p, path3 q, real fuzz=-1);
void gen_runpath3d29(stack *Stack)
{
real fuzz=vm::pop<real>(Stack,-1);
path3 q=vm::pop<path3>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 217 "runpath3d.in"
+#line 217 "./runpath3d.in"
bool exact=fuzz <= 0.0;
if(fuzz < 0)
fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())),
@@ -442,14 +442,14 @@ void gen_runpath3d29(stack *Stack)
{Stack->push<realarray*>(new array(0)); return;}
}
-#line 234 "runpath3d.in"
+#line 234 "./runpath3d.in"
// realarray2* intersections(path3 p, path3 q, real fuzz=-1);
void gen_runpath3d30(stack *Stack)
{
real fuzz=vm::pop<real>(Stack,-1);
path3 q=vm::pop<path3>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 235 "runpath3d.in"
+#line 235 "./runpath3d.in"
bool exact=fuzz <= 0.0;
if(fuzz < 0)
fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())),
@@ -481,14 +481,14 @@ void gen_runpath3d30(stack *Stack)
{Stack->push<realarray2*>(V); return;}
}
-#line 267 "runpath3d.in"
+#line 267 "./runpath3d.in"
// realarray* intersect(path3 p, triplearray2 *P, real fuzz=-1);
void gen_runpath3d31(stack *Stack)
{
real fuzz=vm::pop<real>(Stack,-1);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 268 "runpath3d.in"
+#line 268 "./runpath3d.in"
triple *A;
copyArray2C(A,P,true,4);
if(fuzz <= 0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())),
@@ -506,14 +506,14 @@ void gen_runpath3d31(stack *Stack)
{Stack->push<realarray*>(new array(0)); return;}
}
-#line 286 "runpath3d.in"
+#line 286 "./runpath3d.in"
// realarray2* intersections(path3 p, triplearray2 *P, real fuzz=-1);
void gen_runpath3d32(stack *Stack)
{
real fuzz=vm::pop<real>(Stack,-1);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 287 "runpath3d.in"
+#line 287 "./runpath3d.in"
triple *A;
copyArray2C(A,P,true,4);
if(fuzz <= 0) fuzz=BigFuzz*::max(::max(length(p.max()),length(p.min())),
@@ -533,49 +533,49 @@ void gen_runpath3d32(stack *Stack)
{Stack->push<realarray2*>(W); return;} // Sorting will done in asy.
}
-#line 307 "runpath3d.in"
+#line 307 "./runpath3d.in"
// Int size(path3 p);
void gen_runpath3d33(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 308 "runpath3d.in"
+#line 308 "./runpath3d.in"
{Stack->push<Int>(p.size()); return;}
}
-#line 312 "runpath3d.in"
+#line 312 "./runpath3d.in"
// path3 &(path3 p, path3 q);
void gen_runpath3d34(stack *Stack)
{
path3 q=vm::pop<path3>(Stack);
path3 p=vm::pop<path3>(Stack);
-#line 313 "runpath3d.in"
+#line 313 "./runpath3d.in"
{Stack->push<path3>(camp::concat(p,q)); return;}
}
-#line 317 "runpath3d.in"
+#line 317 "./runpath3d.in"
// triple min(path3 p);
void gen_runpath3d35(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 318 "runpath3d.in"
+#line 318 "./runpath3d.in"
{Stack->push<triple>(p.min()); return;}
}
-#line 322 "runpath3d.in"
+#line 322 "./runpath3d.in"
// triple max(path3 p);
void gen_runpath3d36(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 323 "runpath3d.in"
+#line 323 "./runpath3d.in"
{Stack->push<triple>(p.max()); return;}
}
-#line 327 "runpath3d.in"
+#line 327 "./runpath3d.in"
// realarray* mintimes(path3 p);
void gen_runpath3d37(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 328 "runpath3d.in"
+#line 328 "./runpath3d.in"
array *V=new array(3);
triple v=p.mintimes();
(*V)[0]=v.getx();
@@ -584,12 +584,12 @@ void gen_runpath3d37(stack *Stack)
{Stack->push<realarray*>(V); return;}
}
-#line 337 "runpath3d.in"
+#line 337 "./runpath3d.in"
// realarray* maxtimes(path3 p);
void gen_runpath3d38(stack *Stack)
{
path3 p=vm::pop<path3>(Stack);
-#line 338 "runpath3d.in"
+#line 338 "./runpath3d.in"
array *V=new array(3);
triple v=p.maxtimes();
(*V)[0]=v.getx();
@@ -598,31 +598,31 @@ void gen_runpath3d38(stack *Stack)
{Stack->push<realarray*>(V); return;}
}
-#line 347 "runpath3d.in"
+#line 347 "./runpath3d.in"
// path3 *(realarray2 *t, path3 g);
void gen_runpath3d39(stack *Stack)
{
path3 g=vm::pop<path3>(Stack);
realarray2 * t=vm::pop<realarray2 *>(Stack);
-#line 348 "runpath3d.in"
+#line 348 "./runpath3d.in"
{Stack->push<path3>(transformed(*t,g)); return;}
}
-#line 352 "runpath3d.in"
+#line 352 "./runpath3d.in"
// pair minratio(path3 g);
void gen_runpath3d40(stack *Stack)
{
path3 g=vm::pop<path3>(Stack);
-#line 353 "runpath3d.in"
+#line 353 "./runpath3d.in"
{Stack->push<pair>(g.ratio(::min)); return;}
}
-#line 357 "runpath3d.in"
+#line 357 "./runpath3d.in"
// pair maxratio(path3 g);
void gen_runpath3d41(stack *Stack)
{
path3 g=vm::pop<path3>(Stack);
-#line 358 "runpath3d.in"
+#line 358 "./runpath3d.in"
{Stack->push<pair>(g.ratio(::max)); return;}
}
@@ -634,7 +634,7 @@ void gen_runpath3d41(stack *Stack)
// |b.x b.y b.z 1|
// |c.x c.y c.z 1|
// |d.x d.y d.z 1|
-#line 370 "runpath3d.in"
+#line 370 "./runpath3d.in"
// real orient(triple a, triple b, triple c, triple d);
void gen_runpath3d42(stack *Stack)
{
@@ -642,7 +642,7 @@ void gen_runpath3d42(stack *Stack)
triple c=vm::pop<triple>(Stack);
triple b=vm::pop<triple>(Stack);
triple a=vm::pop<triple>(Stack);
-#line 371 "runpath3d.in"
+#line 371 "./runpath3d.in"
real A[]={a.getx(),a.gety(),a.getz()};
real B[]={b.getx(),b.gety(),b.getz()};
real C[]={c.getx(),c.gety(),c.getz()};
@@ -660,7 +660,7 @@ void gen_runpath3d42(stack *Stack)
// |c.x c.y c.z c.x^2+c.y^2+c.z^2 1|
// |d.x d.y d.z d.x^2+d.y^2+d.z^2 1|
// |e.x e.y e.z e.x^2+e.y^2+e.z^2 1|
-#line 389 "runpath3d.in"
+#line 389 "./runpath3d.in"
// real insphere(triple a, triple b, triple c, triple d, triple e);
void gen_runpath3d43(stack *Stack)
{
@@ -669,7 +669,7 @@ void gen_runpath3d43(stack *Stack)
triple c=vm::pop<triple>(Stack);
triple b=vm::pop<triple>(Stack);
triple a=vm::pop<triple>(Stack);
-#line 390 "runpath3d.in"
+#line 390 "./runpath3d.in"
real A[]={a.getx(),a.gety(),a.getz()};
real B[]={b.getx(),b.gety(),b.getz()};
real C[]={c.getx(),c.gety(),c.getz()};
@@ -684,93 +684,93 @@ namespace trans {
void gen_runpath3d_venv(venv &ve)
{
-#line 40 "runpath3d.in"
+#line 40 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d0, primPath3(), SYM(path3), formal(tripleArray(), SYM(pre), false, false), formal(tripleArray(), SYM(point), false, false), formal(tripleArray(), SYM(post), false, false), formal(booleanArray(), SYM(straight), false, false), formal(primBoolean(), SYM(cyclic), false, false));
-#line 57 "runpath3d.in"
+#line 57 "./runpath3d.in"
REGISTER_BLTIN(run::nullPath3,"nullPath3");
-#line 62 "runpath3d.in"
+#line 62 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d2, primBoolean(), SYM_EQ, formal(primPath3(), SYM(a), false, false), formal(primPath3(), SYM(b), false, false));
-#line 67 "runpath3d.in"
+#line 67 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d3, primBoolean(), SYM_NEQ, formal(primPath3(), SYM(a), false, false), formal(primPath3(), SYM(b), false, false));
-#line 72 "runpath3d.in"
+#line 72 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d4, primTriple(), SYM(point), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false));
-#line 77 "runpath3d.in"
+#line 77 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d5, primTriple(), SYM(point), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false));
-#line 82 "runpath3d.in"
+#line 82 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d6, primTriple(), SYM(precontrol), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false));
-#line 87 "runpath3d.in"
+#line 87 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d7, primTriple(), SYM(precontrol), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false));
-#line 92 "runpath3d.in"
+#line 92 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d8, primTriple(), SYM(postcontrol), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false));
-#line 97 "runpath3d.in"
+#line 97 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d9, primTriple(), SYM(postcontrol), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false));
-#line 102 "runpath3d.in"
+#line 102 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d10, primTriple(), SYM(dir), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false), formal(primInt(), SYM(sign), true, false), formal(primBoolean(), SYM(normalize), true, false));
-#line 107 "runpath3d.in"
+#line 107 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d11, primTriple(), SYM(dir), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false), formal(primBoolean(), SYM(normalize), true, false));
-#line 112 "runpath3d.in"
+#line 112 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d12, primTriple(), SYM(accel), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false), formal(primInt(), SYM(sign), true, false));
-#line 117 "runpath3d.in"
+#line 117 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d13, primTriple(), SYM(accel), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false));
-#line 122 "runpath3d.in"
+#line 122 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d14, primReal(), SYM(radius), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(t), false, false));
-#line 134 "runpath3d.in"
+#line 134 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d15, primReal(), SYM(radius), formal(primTriple(), SYM(z0), false, false), formal(primTriple(), SYM(c0), false, false), formal(primTriple(), SYM(c1), false, false), formal(primTriple(), SYM(z1), false, false), formal(primReal(), SYM(t), false, false));
-#line 146 "runpath3d.in"
+#line 146 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d16, primPath3(), SYM(reverse), formal(primPath3(), SYM(p), false, false));
-#line 151 "runpath3d.in"
+#line 151 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d17, primPath3(), SYM(subpath), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(a), false, false), formal(primInt(), SYM(b), false, false));
-#line 156 "runpath3d.in"
+#line 156 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d18, primPath3(), SYM(subpath), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false));
-#line 161 "runpath3d.in"
+#line 161 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d19, primInt(), SYM(length), formal(primPath3(), SYM(p), false, false));
-#line 166 "runpath3d.in"
+#line 166 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d20, primBoolean(), SYM(cyclic), formal(primPath3(), SYM(p), false, false));
-#line 171 "runpath3d.in"
+#line 171 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d21, primBoolean(), SYM(straight), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false));
-#line 176 "runpath3d.in"
+#line 176 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d22, primPath3(), SYM(unstraighten), formal(primPath3(), SYM(p), false, false));
-#line 181 "runpath3d.in"
+#line 181 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d23, primReal(), SYM(straightness), formal(primTriple(), SYM(z0), false, false), formal(primTriple(), SYM(c0), false, false), formal(primTriple(), SYM(c1), false, false), formal(primTriple(), SYM(z1), false, false));
-#line 188 "runpath3d.in"
+#line 188 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d24, primReal(), SYM(straightness), formal(primPath3(), SYM(p), false, false), formal(primInt(), SYM(t), false, false));
-#line 196 "runpath3d.in"
+#line 196 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d25, primBoolean(), SYM(piecewisestraight), formal(primPath3(), SYM(p), false, false));
-#line 201 "runpath3d.in"
+#line 201 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d26, primReal(), SYM(arclength), formal(primPath3(), SYM(p), false, false));
-#line 206 "runpath3d.in"
+#line 206 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d27, primReal(), SYM(arclength), formal(primTriple(), SYM(z0), false, false), formal(primTriple(), SYM(c0), false, false), formal(primTriple(), SYM(c1), false, false), formal(primTriple(), SYM(z1), false, false));
-#line 211 "runpath3d.in"
+#line 211 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d28, primReal(), SYM(arctime), formal(primPath3(), SYM(p), false, false), formal(primReal(), SYM(dval), false, false));
-#line 216 "runpath3d.in"
+#line 216 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d29, realArray(), SYM(intersect), formal(primPath3(), SYM(p), false, false), formal(primPath3(), SYM(q), false, false), formal(primReal(), SYM(fuzz), true, false));
-#line 234 "runpath3d.in"
+#line 234 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d30, realArray2(), SYM(intersections), formal(primPath3(), SYM(p), false, false), formal(primPath3(), SYM(q), false, false), formal(primReal(), SYM(fuzz), true, false));
-#line 267 "runpath3d.in"
+#line 267 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d31, realArray(), SYM(intersect), formal(primPath3(), SYM(p), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primReal(), SYM(fuzz), true, false));
-#line 286 "runpath3d.in"
+#line 286 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d32, realArray2(), SYM(intersections), formal(primPath3(), SYM(p), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primReal(), SYM(fuzz), true, false));
-#line 307 "runpath3d.in"
+#line 307 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d33, primInt(), SYM(size), formal(primPath3(), SYM(p), false, false));
-#line 312 "runpath3d.in"
+#line 312 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d34, primPath3(), SYM_AMPERSAND, formal(primPath3(), SYM(p), false, false), formal(primPath3(), SYM(q), false, false));
-#line 317 "runpath3d.in"
+#line 317 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d35, primTriple(), SYM(min), formal(primPath3(), SYM(p), false, false));
-#line 322 "runpath3d.in"
+#line 322 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d36, primTriple(), SYM(max), formal(primPath3(), SYM(p), false, false));
-#line 327 "runpath3d.in"
+#line 327 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d37, realArray(), SYM(mintimes), formal(primPath3(), SYM(p), false, false));
-#line 337 "runpath3d.in"
+#line 337 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d38, realArray(), SYM(maxtimes), formal(primPath3(), SYM(p), false, false));
-#line 347 "runpath3d.in"
+#line 347 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d39, primPath3(), SYM_TIMES, formal(realArray2(), SYM(t), false, false), formal(primPath3(), SYM(g), false, false));
-#line 352 "runpath3d.in"
+#line 352 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d40, primPair(), SYM(minratio), formal(primPath3(), SYM(g), false, false));
-#line 357 "runpath3d.in"
+#line 357 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d41, primPair(), SYM(maxratio), formal(primPath3(), SYM(g), false, false));
-#line 362 "runpath3d.in"
+#line 362 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d42, primReal(), SYM(orient), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false));
-#line 379 "runpath3d.in"
+#line 379 "./runpath3d.in"
addFunc(ve, run::gen_runpath3d43, primReal(), SYM(insphere), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false), formal(primTriple(), SYM(e), false, false));
}
diff --git a/graphics/asymptote/runpath3d.h b/graphics/asymptote/runpath3d.h
index cdb6480460..84155974c0 100644
--- a/graphics/asymptote/runpath3d.h
+++ b/graphics/asymptote/runpath3d.h
@@ -1,9 +1,7 @@
/***** Autogenerated from runpath3d.in; changes will be overwritten *****/
-#ifndef runpath3d_H
-#define runpath3d_H
+#pragma once
namespace run {
void nullPath3(vm::stack *);
}
-#endif // runpath3d_H
diff --git a/graphics/asymptote/runpicture.cc b/graphics/asymptote/runpicture.cc
index e8a153463a..e1db6c922b 100644
--- a/graphics/asymptote/runpicture.cc
+++ b/graphics/asymptote/runpicture.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runpicture.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runpicture.in"
+#line 1 "./runpicture.in"
/*****
* runpicture.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -166,71 +166,71 @@ string defaultformat3="prc";
#endif
namespace run {
-#line 126 "runpicture.in"
+#line 126 "./runpicture.in"
void newPicture(stack *Stack)
{
-#line 127 "runpicture.in"
+#line 127 "./runpicture.in"
{Stack->push<picture*>(new picture()); return;}
}
-#line 131 "runpicture.in"
+#line 131 "./runpicture.in"
// bool empty(picture *f);
void gen_runpicture1(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 132 "runpicture.in"
+#line 132 "./runpicture.in"
{Stack->push<bool>(f->null()); return;}
}
-#line 136 "runpicture.in"
+#line 136 "./runpicture.in"
// void erase(picture *f);
void gen_runpicture2(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 137 "runpicture.in"
+#line 137 "./runpicture.in"
f->nodes.clear();
}
-#line 141 "runpicture.in"
+#line 141 "./runpicture.in"
// pair min(picture *f);
void gen_runpicture3(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 142 "runpicture.in"
+#line 142 "./runpicture.in"
{Stack->push<pair>(f->bounds().Min()); return;}
}
-#line 146 "runpicture.in"
+#line 146 "./runpicture.in"
// pair max(picture *f);
void gen_runpicture4(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 147 "runpicture.in"
+#line 147 "./runpicture.in"
{Stack->push<pair>(f->bounds().Max()); return;}
}
-#line 151 "runpicture.in"
+#line 151 "./runpicture.in"
// pair size(picture *f);
void gen_runpicture5(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 152 "runpicture.in"
+#line 152 "./runpicture.in"
bbox b=f->bounds();
{Stack->push<pair>(b.Max()-b.Min()); return;}
}
-#line 157 "runpicture.in"
+#line 157 "./runpicture.in"
// void _draw(picture *f, path g, pen p);
void gen_runpicture6(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
path g=vm::pop<path>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 158 "runpicture.in"
+#line 158 "./runpicture.in"
f->append(new drawPath(g,p));
}
-#line 162 "runpicture.in"
+#line 162 "./runpicture.in"
// void fill(picture *f, patharray *g, pen p=CURRENTPEN, bool copy=true);
void gen_runpicture7(stack *Stack)
{
@@ -238,12 +238,12 @@ void gen_runpicture7(stack *Stack)
pen p=vm::pop<pen>(Stack,CURRENTPEN);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 163 "runpicture.in"
+#line 163 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawFill(*copyarray(g),false,p));
}
-#line 168 "runpicture.in"
+#line 168 "./runpicture.in"
// void latticeshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray2 *p, transform t=identity, bool copy=true);
void gen_runpicture8(stack *Stack)
{
@@ -254,13 +254,13 @@ void gen_runpicture8(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 171 "runpicture.in"
+#line 171 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawLatticeShade(*copyarray(g),stroke,fillrule,*copyarray(p),
t));
}
-#line 177 "runpicture.in"
+#line 177 "./runpicture.in"
// void axialshade(picture *f, patharray *g, bool stroke=false, pen pena, pair a, bool extenda=true, pen penb, pair b, bool extendb=true, bool copy=true);
void gen_runpicture9(stack *Stack)
{
@@ -274,13 +274,13 @@ void gen_runpicture9(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 180 "runpicture.in"
+#line 180 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawAxialShade(*copyarray(g),stroke,pena,a,extenda,penb,b,
extendb));
}
-#line 186 "runpicture.in"
+#line 186 "./runpicture.in"
// void radialshade(picture *f, patharray *g, bool stroke=false, pen pena, pair a, real ra, bool extenda=true, pen penb, pair b, real rb, bool extendb=true, bool copy=true);
void gen_runpicture10(stack *Stack)
{
@@ -296,13 +296,13 @@ void gen_runpicture10(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 189 "runpicture.in"
+#line 189 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawRadialShade(*copyarray(g),stroke,pena,a,ra,extenda,
penb,b,rb,extendb));
}
-#line 195 "runpicture.in"
+#line 195 "./runpicture.in"
// void gouraudshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray *p, pairarray *z, Intarray *edges, bool copy=true);
void gen_runpicture11(stack *Stack)
{
@@ -314,7 +314,7 @@ void gen_runpicture11(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 198 "runpicture.in"
+#line 198 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
checkArrays(p,z);
checkArrays(z,edges);
@@ -322,7 +322,7 @@ void gen_runpicture11(stack *Stack)
*copyarray(z),*copyarray(edges)));
}
-#line 206 "runpicture.in"
+#line 206 "./runpicture.in"
// void gouraudshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray *p, Intarray *edges, bool copy=true);
void gen_runpicture12(stack *Stack)
{
@@ -333,7 +333,7 @@ void gen_runpicture12(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 209 "runpicture.in"
+#line 209 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
size_t n=checkArrays(p,edges);
size_t m=checkArray(g);
@@ -354,7 +354,7 @@ void gen_runpicture12(stack *Stack)
*z,*copyarray(edges)));
}
-#line 230 "runpicture.in"
+#line 230 "./runpicture.in"
// void tensorshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray2 *p, patharray *b=NULL, pairarray2 *z=emptyarray, bool copy=true);
void gen_runpicture13(stack *Stack)
{
@@ -366,7 +366,7 @@ void gen_runpicture13(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 233 "runpicture.in"
+#line 233 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
array *(*copyarray2)(array *a)=copy ? copyArray2 : nop;
size_t n=checkArrays(p,b ? b : g);
@@ -379,7 +379,7 @@ void gen_runpicture13(stack *Stack)
*copyarray2(z)));
}
-#line 246 "runpicture.in"
+#line 246 "./runpicture.in"
// void functionshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, string shader=emptystring, bool copy=true);
void gen_runpicture14(stack *Stack)
{
@@ -389,14 +389,14 @@ void gen_runpicture14(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 249 "runpicture.in"
+#line 249 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawFunctionShade(*copyarray(g),stroke,fillrule,shader));
}
// Clip a picture to a superpath using the given fill rule.
// Subsequent additions to the picture will not be affected by the clipping.
-#line 256 "runpicture.in"
+#line 256 "./runpicture.in"
// void clip(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, bool copy=true);
void gen_runpicture15(stack *Stack)
{
@@ -405,13 +405,13 @@ void gen_runpicture15(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 258 "runpicture.in"
+#line 258 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
drawClipBegin *begin=new drawClipBegin(*copyarray(g),stroke,fillrule,true);
f->enclose(begin,new drawClipEnd(true,begin));
}
-#line 264 "runpicture.in"
+#line 264 "./runpicture.in"
// void beginclip(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, bool copy=true);
void gen_runpicture16(stack *Stack)
{
@@ -420,57 +420,57 @@ void gen_runpicture16(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 266 "runpicture.in"
+#line 266 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawClipBegin(*copyarray(g),stroke,fillrule,false));
}
-#line 271 "runpicture.in"
+#line 271 "./runpicture.in"
// void endclip(picture *f);
void gen_runpicture17(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 272 "runpicture.in"
+#line 272 "./runpicture.in"
f->append(new drawClipEnd(false));
}
-#line 276 "runpicture.in"
+#line 276 "./runpicture.in"
// void gsave(picture *f);
void gen_runpicture18(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 277 "runpicture.in"
+#line 277 "./runpicture.in"
f->append(new drawGsave());
}
-#line 281 "runpicture.in"
+#line 281 "./runpicture.in"
// void grestore(picture *f);
void gen_runpicture19(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 282 "runpicture.in"
+#line 282 "./runpicture.in"
f->append(new drawGrestore());
}
-#line 286 "runpicture.in"
+#line 286 "./runpicture.in"
// void begingroup(picture *f);
void gen_runpicture20(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 287 "runpicture.in"
+#line 287 "./runpicture.in"
f->append(new drawBegin());
}
-#line 291 "runpicture.in"
+#line 291 "./runpicture.in"
// void endgroup(picture *f);
void gen_runpicture21(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 292 "runpicture.in"
+#line 292 "./runpicture.in"
f->append(new drawEnd());
}
-#line 296 "runpicture.in"
+#line 296 "./runpicture.in"
// void _begingroup3(picture *f, string name, real compression, real granularity, bool closed, bool tessellate, bool dobreak, bool nobreak, triple center, Int interaction);
void gen_runpicture22(stack *Stack)
{
@@ -484,62 +484,62 @@ void gen_runpicture22(stack *Stack)
real compression=vm::pop<real>(Stack);
string name=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 299 "runpicture.in"
+#line 299 "./runpicture.in"
f->append(new drawBegin3(name,compression,granularity,
closed,tessellate,dobreak,nobreak,
center,(Interaction) intcast(interaction)));
}
-#line 305 "runpicture.in"
+#line 305 "./runpicture.in"
// void endgroup3(picture *f);
void gen_runpicture23(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 306 "runpicture.in"
+#line 306 "./runpicture.in"
f->append(new drawEnd3());
}
-#line 310 "runpicture.in"
+#line 310 "./runpicture.in"
// void add(picture *dest, picture *src);
void gen_runpicture24(stack *Stack)
{
picture * src=vm::pop<picture *>(Stack);
picture * dest=vm::pop<picture *>(Stack);
-#line 311 "runpicture.in"
+#line 311 "./runpicture.in"
dest->add(*src);
}
-#line 315 "runpicture.in"
+#line 315 "./runpicture.in"
// void prepend(picture *dest, picture *src);
void gen_runpicture25(stack *Stack)
{
picture * src=vm::pop<picture *>(Stack);
picture * dest=vm::pop<picture *>(Stack);
-#line 316 "runpicture.in"
+#line 316 "./runpicture.in"
dest->prepend(*src);
}
-#line 320 "runpicture.in"
+#line 320 "./runpicture.in"
// void postscript(picture *f, string s);
void gen_runpicture26(stack *Stack)
{
string s=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 321 "runpicture.in"
+#line 321 "./runpicture.in"
f->append(new drawVerbatim(PostScript,s));
}
-#line 325 "runpicture.in"
+#line 325 "./runpicture.in"
// void tex(picture *f, string s);
void gen_runpicture27(stack *Stack)
{
string s=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 326 "runpicture.in"
+#line 326 "./runpicture.in"
f->append(new drawVerbatim(TeX,s));
}
-#line 330 "runpicture.in"
+#line 330 "./runpicture.in"
// void postscript(picture *f, string s, pair min, pair max);
void gen_runpicture28(stack *Stack)
{
@@ -547,11 +547,11 @@ void gen_runpicture28(stack *Stack)
pair min=vm::pop<pair>(Stack);
string s=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 331 "runpicture.in"
+#line 331 "./runpicture.in"
f->append(new drawVerbatim(PostScript,s,min,max));
}
-#line 335 "runpicture.in"
+#line 335 "./runpicture.in"
// void tex(picture *f, string s, pair min, pair max);
void gen_runpicture29(stack *Stack)
{
@@ -559,33 +559,33 @@ void gen_runpicture29(stack *Stack)
pair min=vm::pop<pair>(Stack);
string s=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 336 "runpicture.in"
+#line 336 "./runpicture.in"
f->append(new drawVerbatim(TeX,s,min,max));
}
-#line 340 "runpicture.in"
+#line 340 "./runpicture.in"
// void texpreamble(string s);
void gen_runpicture30(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 341 "runpicture.in"
+#line 341 "./runpicture.in"
string t=s+"\n";
processDataStruct &pd=processData();
pd.TeXpipepreamble.push_back(t);
pd.TeXpreamble.push_back(t);
}
-#line 348 "runpicture.in"
+#line 348 "./runpicture.in"
// void deletepreamble();
void gen_runpicture31(stack *)
{
-#line 349 "runpicture.in"
+#line 349 "./runpicture.in"
if(getSetting<bool>("inlinetex")) {
unlink(buildname(outname(),"pre").c_str());
}
}
-#line 355 "runpicture.in"
+#line 355 "./runpicture.in"
// void _labelpath(picture *f, string s, string size, path g, string justify, pair offset, pen p);
void gen_runpicture32(stack *Stack)
{
@@ -596,40 +596,40 @@ void gen_runpicture32(stack *Stack)
string size=vm::pop<string>(Stack);
string s=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 357 "runpicture.in"
+#line 357 "./runpicture.in"
f->append(new drawLabelPath(s,size,g,justify,offset,p));
}
-#line 361 "runpicture.in"
+#line 361 "./runpicture.in"
// void texreset();
void gen_runpicture33(stack *)
{
-#line 362 "runpicture.in"
+#line 362 "./runpicture.in"
processDataStruct &pd=processData();
pd.TeXpipepreamble.clear();
pd.TeXpreamble.clear();
pd.tex.pipeclose();
}
-#line 369 "runpicture.in"
+#line 369 "./runpicture.in"
// void layer(picture *f);
void gen_runpicture34(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 370 "runpicture.in"
+#line 370 "./runpicture.in"
f->append(new drawLayer());
}
-#line 374 "runpicture.in"
+#line 374 "./runpicture.in"
// void newpage(picture *f);
void gen_runpicture35(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 375 "runpicture.in"
+#line 375 "./runpicture.in"
f->append(new drawNewPage());
}
-#line 379 "runpicture.in"
+#line 379 "./runpicture.in"
// void _image(picture *f, realarray2 *data, pair initial, pair final, penarray *palette=NULL, transform t=identity, bool copy=true, bool antialias=false);
void gen_runpicture36(stack *Stack)
{
@@ -641,14 +641,14 @@ void gen_runpicture36(stack *Stack)
pair initial=vm::pop<pair>(Stack);
realarray2 * data=vm::pop<realarray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 382 "runpicture.in"
+#line 382 "./runpicture.in"
array *(*copyarray)(array *a)=copy ? copyArray : nop;
array *(*copyarray2)(array *a)=copy ? copyArray2 : nop;
f->append(new drawPaletteImage(*copyarray2(data),*copyarray(palette),
t*matrix(initial,final),antialias));
}
-#line 389 "runpicture.in"
+#line 389 "./runpicture.in"
// void _image(picture *f, penarray2 *data, pair initial, pair final, transform t=identity, bool copy=true, bool antialias=false);
void gen_runpicture37(stack *Stack)
{
@@ -659,13 +659,13 @@ void gen_runpicture37(stack *Stack)
pair initial=vm::pop<pair>(Stack);
penarray2 * data=vm::pop<penarray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 391 "runpicture.in"
+#line 391 "./runpicture.in"
array *(*copyarray2)(array *a)=copy ? copyArray2 : nop;
f->append(new drawNoPaletteImage(*copyarray2(data),t*matrix(initial,final),
antialias));
}
-#line 397 "runpicture.in"
+#line 397 "./runpicture.in"
// void _image(picture *f, callablePen *F, Int width, Int height, pair initial, pair final, transform t=identity, bool antialias=false);
void gen_runpicture38(stack *Stack)
{
@@ -677,36 +677,36 @@ void gen_runpicture38(stack *Stack)
Int width=vm::pop<Int>(Stack);
callablePen * F=vm::pop<callablePen *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 399 "runpicture.in"
+#line 399 "./runpicture.in"
f->append(new drawFunctionImage(Stack,F,width,height,
t*matrix(initial,final),antialias));
}
-#line 404 "runpicture.in"
+#line 404 "./runpicture.in"
// string nativeformat();
void gen_runpicture39(stack *Stack)
{
-#line 405 "runpicture.in"
+#line 405 "./runpicture.in"
{Stack->push<string>(nativeformat()); return;}
}
-#line 409 "runpicture.in"
+#line 409 "./runpicture.in"
// bool latex();
void gen_runpicture40(stack *Stack)
{
-#line 410 "runpicture.in"
+#line 410 "./runpicture.in"
{Stack->push<bool>(latex(getSetting<string>("tex"))); return;}
}
-#line 414 "runpicture.in"
+#line 414 "./runpicture.in"
// bool pdf();
void gen_runpicture41(stack *Stack)
{
-#line 415 "runpicture.in"
+#line 415 "./runpicture.in"
{Stack->push<bool>(pdf(getSetting<string>("tex"))); return;}
}
-#line 419 "runpicture.in"
+#line 419 "./runpicture.in"
// void _shipout(string prefix=emptystring, picture *f, picture *preamble=NULL, string format=emptystring, bool wait=false, bool view=true, transform T=identity);
void gen_runpicture42(stack *Stack)
{
@@ -717,7 +717,7 @@ void gen_runpicture42(stack *Stack)
picture * preamble=vm::pop<picture *>(Stack,NULL);
picture * f=vm::pop<picture *>(Stack);
string prefix=vm::pop<string>(Stack,emptystring);
-#line 422 "runpicture.in"
+#line 422 "./runpicture.in"
if(prefix.empty()) prefix=outname();
picture *result=new picture;
@@ -765,8 +765,8 @@ void gen_runpicture42(stack *Stack)
delete result;
}
-#line 470 "runpicture.in"
-// void shipout3(string prefix, picture *f, string format=emptystring, real width, real height, real angle, real zoom, triple m, triple M, pair shift, pair margin, realarray2 *t, realarray *background, triplearray *lights, realarray2 *diffuse, realarray2 *specular, bool view=true);
+#line 470 "./runpicture.in"
+// void shipout3(string prefix, picture *f, string format=emptystring, real width, real height, real angle, real zoom, triple m, triple M, pair shift, pair margin, realarray2 *t, realarray2 *tup, realarray *background, triplearray *lights, realarray2 *diffuse, realarray2 *specular, bool view=true);
void gen_runpicture43(stack *Stack)
{
bool view=vm::pop<bool>(Stack,true);
@@ -774,6 +774,7 @@ void gen_runpicture43(stack *Stack)
realarray2 * diffuse=vm::pop<realarray2 *>(Stack);
triplearray * lights=vm::pop<triplearray *>(Stack);
realarray * background=vm::pop<realarray *>(Stack);
+ realarray2 * tup=vm::pop<realarray2 *>(Stack);
realarray2 * t=vm::pop<realarray2 *>(Stack);
pair margin=vm::pop<pair>(Stack);
pair shift=vm::pop<pair>(Stack);
@@ -786,44 +787,46 @@ void gen_runpicture43(stack *Stack)
string format=vm::pop<string>(Stack,emptystring);
picture * f=vm::pop<picture *>(Stack);
string prefix=vm::pop<string>(Stack);
-#line 475 "runpicture.in"
+#line 476 "./runpicture.in"
size_t n=checkArrays(lights,diffuse);
checkEqual(n,checkArray(specular));
- real *T,*Background,*Diffuse,*Specular;
+ real *T,*Tup,*Background,*Diffuse,*Specular;
triple *Lights;
copyArray2C(T,t,true,4);
+ copyArray2C(Tup,tup,true,4);
copyArrayC(Background,background);
copyArrayC(Lights,lights);
copyArray2C(Diffuse,diffuse,false,4,UseGC);
copyArray2C(Specular,specular,false,4,UseGC);
- f->shipout3(prefix,format,width,height,angle,zoom,m,M,shift,margin,T,
+ f->shipout3(prefix,format,width,height,angle,zoom,m,M,shift,margin,T,Tup,
Background,n,Lights,Diffuse,Specular,view);
delete[] Background;
delete[] T;
+ delete[] Tup;
}
-#line 495 "runpicture.in"
+#line 498 "./runpicture.in"
// void shipout3(string prefix, picture *f, string format=defaultformat3);
void gen_runpicture44(stack *Stack)
{
string format=vm::pop<string>(Stack,defaultformat3);
picture * f=vm::pop<picture *>(Stack);
string prefix=vm::pop<string>(Stack);
-#line 496 "runpicture.in"
+#line 499 "./runpicture.in"
f->shipout3(prefix,format);
}
-#line 500 "runpicture.in"
+#line 503 "./runpicture.in"
// void xmap(string key, transform t=identity);
void gen_runpicture45(stack *Stack)
{
transform t=vm::pop<transform>(Stack,identity);
string key=vm::pop<string>(Stack);
-#line 501 "runpicture.in"
+#line 504 "./runpicture.in"
processDataStruct *P=&processData();
xmap_t &xmap=P->xmap;
xmap_t::iterator p=xmap.find(key);
@@ -837,14 +840,14 @@ void gen_runpicture45(stack *Stack)
P->xmapCount++;
}
-#line 515 "runpicture.in"
+#line 518 "./runpicture.in"
// void deconstruct(picture *f, picture *preamble=NULL, transform T=identity);
void gen_runpicture46(stack *Stack)
{
transform T=vm::pop<transform>(Stack,identity);
picture * preamble=vm::pop<picture *>(Stack,NULL);
picture * f=vm::pop<picture *>(Stack);
-#line 516 "runpicture.in"
+#line 519 "./runpicture.in"
unsigned level=0;
bool first=pdf(getSetting<string>("tex"));
@@ -959,7 +962,7 @@ void gen_runpicture46(stack *Stack)
// Three-dimensional picture and surface operations
// Bezier curve
-#line 631 "runpicture.in"
+#line 634 "./runpicture.in"
// void _draw(picture *f, path3 g, triple center=Zero, penarray *p, real opacity, real shininess, real metallic, real fresnel0, Int interaction=0);
void gen_runpicture47(stack *Stack)
{
@@ -972,7 +975,7 @@ void gen_runpicture47(stack *Stack)
triple center=vm::pop<triple>(Stack,Zero);
path3 g=vm::pop<path3>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 634 "runpicture.in"
+#line 637 "./runpicture.in"
size_t n=g.size();
for(unsigned int i=0; i < n; ++i)
f->append(new drawPath3(g.subpath((Int) i,Int(i+1)),center,*p,opacity,
@@ -981,7 +984,7 @@ void gen_runpicture47(stack *Stack)
}
// Bezier patch
-#line 643 "runpicture.in"
+#line 646 "./runpicture.in"
// void draw(picture *f, triplearray2 *P, triple center, bool straight, penarray *p, real opacity, real shininess, real metallic, real fresnel0, penarray *colors, Int interaction, Int digits, bool primitive=false);
void gen_runpicture48(stack *Stack)
{
@@ -998,7 +1001,7 @@ void gen_runpicture48(stack *Stack)
triple center=vm::pop<triple>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 647 "runpicture.in"
+#line 650 "./runpicture.in"
f->append(new drawBezierPatch(*P,center,straight,*p,opacity,shininess,
metallic,fresnel0,*colors,
(Interaction) intcast(interaction),
@@ -1006,7 +1009,7 @@ void gen_runpicture48(stack *Stack)
}
// Bezier triangle
-#line 655 "runpicture.in"
+#line 658 "./runpicture.in"
// void drawbeziertriangle(picture *f, triplearray2 *P, triple center, bool straight, penarray *p, real opacity, real shininess, real metallic, real fresnel0, penarray *colors, Int interaction, Int digits, bool primitive=false);
void gen_runpicture49(stack *Stack)
{
@@ -1023,7 +1026,7 @@ void gen_runpicture49(stack *Stack)
triple center=vm::pop<triple>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 660 "runpicture.in"
+#line 663 "./runpicture.in"
f->append(new drawBezierTriangle(*P,center,straight,*p,opacity,shininess,
metallic,fresnel0,*colors,
(Interaction) intcast(interaction),
@@ -1031,7 +1034,7 @@ void gen_runpicture49(stack *Stack)
}
// General NURBS curve
-#line 668 "runpicture.in"
+#line 671 "./runpicture.in"
// void draw(picture *f, triplearray *P, realarray *knot, realarray *weights=emptyarray, pen p);
void gen_runpicture50(stack *Stack)
{
@@ -1040,12 +1043,12 @@ void gen_runpicture50(stack *Stack)
realarray * knot=vm::pop<realarray *>(Stack);
triplearray * P=vm::pop<triplearray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 670 "runpicture.in"
+#line 673 "./runpicture.in"
f->append(new drawNurbsPath3(*P,knot,weights,p));
}
// General NURBS surface
-#line 675 "runpicture.in"
+#line 678 "./runpicture.in"
// void draw(picture *f, triplearray2 *P, realarray *uknot, realarray *vknot, realarray2 *weights=emptyarray, penarray *p, real opacity, real shininess,real metallic, real fresnel0, penarray *colors);
void gen_runpicture51(stack *Stack)
{
@@ -1060,13 +1063,13 @@ void gen_runpicture51(stack *Stack)
realarray * uknot=vm::pop<realarray *>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 678 "runpicture.in"
+#line 681 "./runpicture.in"
f->append(new drawNurbs(*P,uknot,vknot,weights,*p,opacity,shininess,
metallic,fresnel0,*colors));
}
// Sphere primitive
-#line 684 "runpicture.in"
+#line 687 "./runpicture.in"
// void drawSphere(picture *f, realarray2 *t, bool half=false, penarray *p, real opacity, real shininess, real metallic, real fresnel0, Int type);
void gen_runpicture52(stack *Stack)
{
@@ -1079,13 +1082,13 @@ void gen_runpicture52(stack *Stack)
bool half=vm::pop<bool>(Stack,false);
realarray2 * t=vm::pop<realarray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 687 "runpicture.in"
+#line 690 "./runpicture.in"
f->append(new drawSphere(*t,half,*p,opacity,shininess,metallic,fresnel0,
intcast(type)));
}
// Cylinder primitive
-#line 693 "runpicture.in"
+#line 696 "./runpicture.in"
// void drawCylinder(picture *f, realarray2 *t, penarray *p, real opacity, real shininess, real metallic, real fresnel0, bool core=false);
void gen_runpicture53(stack *Stack)
{
@@ -1097,12 +1100,12 @@ void gen_runpicture53(stack *Stack)
penarray * p=vm::pop<penarray *>(Stack);
realarray2 * t=vm::pop<realarray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 696 "runpicture.in"
+#line 699 "./runpicture.in"
f->append(new drawCylinder(*t,*p,opacity,shininess,metallic,fresnel0,core));
}
// Disk primitive
-#line 701 "runpicture.in"
+#line 704 "./runpicture.in"
// void drawDisk(picture *f, realarray2 *t, penarray *p, real opacity, real shininess, real metallic, real fresnel0);
void gen_runpicture54(stack *Stack)
{
@@ -1113,12 +1116,12 @@ void gen_runpicture54(stack *Stack)
penarray * p=vm::pop<penarray *>(Stack);
realarray2 * t=vm::pop<realarray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 703 "runpicture.in"
+#line 706 "./runpicture.in"
f->append(new drawDisk(*t,*p,opacity,shininess,metallic,fresnel0));
}
// Tube primitive
-#line 708 "runpicture.in"
+#line 711 "./runpicture.in"
// void drawTube(picture *f, triplearray *g, real width, penarray *p, real opacity, real shininess, real metallic, real fresnel0, triple min, triple max, bool core=false);
void gen_runpicture55(stack *Stack)
{
@@ -1133,13 +1136,13 @@ void gen_runpicture55(stack *Stack)
real width=vm::pop<real>(Stack);
triplearray * g=vm::pop<triplearray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 711 "runpicture.in"
+#line 714 "./runpicture.in"
f->append(new drawTube(*g,width,*p,opacity,shininess,metallic,fresnel0,
min,max,core));
}
// Draw pixel
-#line 717 "runpicture.in"
+#line 720 "./runpicture.in"
// void drawpixel(picture *f, triple v, pen p, real width=1.0);
void gen_runpicture56(stack *Stack)
{
@@ -1147,12 +1150,12 @@ void gen_runpicture56(stack *Stack)
pen p=vm::pop<pen>(Stack);
triple v=vm::pop<triple>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 718 "runpicture.in"
+#line 721 "./runpicture.in"
f->append(new drawPixel(v,p,width));
}
// Draw triangles
-#line 723 "runpicture.in"
+#line 726 "./runpicture.in"
// void draw(picture *f, triplearray *v, Intarray2 *vi, triple center=Zero, triplearray *n, Intarray2 *ni, penarray *p, real opacity, real shininess, real metallic, real fresnel0, penarray *c=emptyarray, Intarray2 *ci=emptyarray, Int interaction);
void gen_runpicture57(stack *Stack)
{
@@ -1170,64 +1173,64 @@ void gen_runpicture57(stack *Stack)
Intarray2 * vi=vm::pop<Intarray2 *>(Stack);
triplearray * v=vm::pop<triplearray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 728 "runpicture.in"
+#line 731 "./runpicture.in"
f->append(new drawTriangles(*v,*vi,center,*n,*ni,*p,opacity,shininess,
metallic,fresnel0,*c,*ci,
(Interaction) intcast(interaction)));
}
-#line 734 "runpicture.in"
+#line 737 "./runpicture.in"
// triple min3(picture *f);
void gen_runpicture58(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 735 "runpicture.in"
+#line 738 "./runpicture.in"
{Stack->push<triple>(f->bounds3().Min()); return;}
}
-#line 739 "runpicture.in"
+#line 742 "./runpicture.in"
// triple max3(picture *f);
void gen_runpicture59(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 740 "runpicture.in"
+#line 743 "./runpicture.in"
{Stack->push<triple>(f->bounds3().Max()); return;}
}
-#line 744 "runpicture.in"
+#line 747 "./runpicture.in"
// triple size3(picture *f);
void gen_runpicture60(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 745 "runpicture.in"
+#line 748 "./runpicture.in"
bbox3 b=f->bounds3();
{Stack->push<triple>(b.Max()-b.Min()); return;}
}
-#line 750 "runpicture.in"
+#line 753 "./runpicture.in"
// pair minratio(picture *f);
void gen_runpicture61(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 751 "runpicture.in"
+#line 754 "./runpicture.in"
{Stack->push<pair>(f->ratio(::min)); return;}
}
-#line 755 "runpicture.in"
+#line 758 "./runpicture.in"
// pair maxratio(picture *f);
void gen_runpicture62(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 756 "runpicture.in"
+#line 759 "./runpicture.in"
{Stack->push<pair>(f->ratio(::max)); return;}
}
-#line 760 "runpicture.in"
+#line 763 "./runpicture.in"
// bool is3D(picture *f);
void gen_runpicture63(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 761 "runpicture.in"
+#line 764 "./runpicture.in"
{Stack->push<bool>(f->have3D()); return;}
}
@@ -1237,133 +1240,133 @@ namespace trans {
void gen_runpicture_venv(venv &ve)
{
-#line 126 "runpicture.in"
+#line 126 "./runpicture.in"
REGISTER_BLTIN(run::newPicture,"newPicture");
-#line 131 "runpicture.in"
+#line 131 "./runpicture.in"
addFunc(ve, run::gen_runpicture1, primBoolean(), SYM(empty), formal(primPicture(), SYM(f), false, false));
-#line 136 "runpicture.in"
+#line 136 "./runpicture.in"
addFunc(ve, run::gen_runpicture2, primVoid(), SYM(erase), formal(primPicture(), SYM(f), false, false));
-#line 141 "runpicture.in"
+#line 141 "./runpicture.in"
addFunc(ve, run::gen_runpicture3, primPair(), SYM(min), formal(primPicture(), SYM(f), false, false));
-#line 146 "runpicture.in"
+#line 146 "./runpicture.in"
addFunc(ve, run::gen_runpicture4, primPair(), SYM(max), formal(primPicture(), SYM(f), false, false));
-#line 151 "runpicture.in"
+#line 151 "./runpicture.in"
addFunc(ve, run::gen_runpicture5, primPair(), SYM(size), formal(primPicture(), SYM(f), false, false));
-#line 157 "runpicture.in"
+#line 157 "./runpicture.in"
addFunc(ve, run::gen_runpicture6, primVoid(), SYM(_draw), formal(primPicture(), SYM(f), false, false), formal(primPath(), SYM(g), false, false), formal(primPen(), SYM(p), false, false));
-#line 162 "runpicture.in"
+#line 162 "./runpicture.in"
addFunc(ve, run::gen_runpicture7, primVoid(), SYM(fill), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primPen(), SYM(p), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 168 "runpicture.in"
+#line 168 "./runpicture.in"
addFunc(ve, run::gen_runpicture8, primVoid(), SYM(latticeshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray2(), SYM(p), false, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 177 "runpicture.in"
+#line 177 "./runpicture.in"
addFunc(ve, run::gen_runpicture9, primVoid(), SYM(axialshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(pena), false, false), formal(primPair(), SYM(a), false, false), formal(primBoolean(), SYM(extenda), true, false), formal(primPen(), SYM(penb), false, false), formal(primPair(), SYM(b), false, false), formal(primBoolean(), SYM(extendb), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 186 "runpicture.in"
+#line 186 "./runpicture.in"
addFunc(ve, run::gen_runpicture10, primVoid(), SYM(radialshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(pena), false, false), formal(primPair(), SYM(a), false, false), formal(primReal(), SYM(ra), false, false), formal(primBoolean(), SYM(extenda), true, false), formal(primPen(), SYM(penb), false, false), formal(primPair(), SYM(b), false, false), formal(primReal(), SYM(rb), false, false), formal(primBoolean(), SYM(extendb), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 195 "runpicture.in"
+#line 195 "./runpicture.in"
addFunc(ve, run::gen_runpicture11, primVoid(), SYM(gouraudshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray(), SYM(p), false, false), formal(pairArray(), SYM(z), false, false), formal(IntArray(), SYM(edges), false, false), formal(primBoolean(), SYM(copy), true, false));
-#line 206 "runpicture.in"
+#line 206 "./runpicture.in"
addFunc(ve, run::gen_runpicture12, primVoid(), SYM(gouraudshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray(), SYM(p), false, false), formal(IntArray(), SYM(edges), false, false), formal(primBoolean(), SYM(copy), true, false));
-#line 230 "runpicture.in"
+#line 230 "./runpicture.in"
addFunc(ve, run::gen_runpicture13, primVoid(), SYM(tensorshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray2(), SYM(p), false, false), formal(pathArray(), SYM(b), true, false), formal(pairArray2(), SYM(z), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 246 "runpicture.in"
+#line 246 "./runpicture.in"
addFunc(ve, run::gen_runpicture14, primVoid(), SYM(functionshade), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(primString(), SYM(shader), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 254 "runpicture.in"
+#line 254 "./runpicture.in"
addFunc(ve, run::gen_runpicture15, primVoid(), SYM(clip), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 264 "runpicture.in"
+#line 264 "./runpicture.in"
addFunc(ve, run::gen_runpicture16, primVoid(), SYM(beginclip), formal(primPicture(), SYM(f), false, false), formal(pathArray(), SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 271 "runpicture.in"
+#line 271 "./runpicture.in"
addFunc(ve, run::gen_runpicture17, primVoid(), SYM(endclip), formal(primPicture(), SYM(f), false, false));
-#line 276 "runpicture.in"
+#line 276 "./runpicture.in"
addFunc(ve, run::gen_runpicture18, primVoid(), SYM(gsave), formal(primPicture(), SYM(f), false, false));
-#line 281 "runpicture.in"
+#line 281 "./runpicture.in"
addFunc(ve, run::gen_runpicture19, primVoid(), SYM(grestore), formal(primPicture(), SYM(f), false, false));
-#line 286 "runpicture.in"
+#line 286 "./runpicture.in"
addFunc(ve, run::gen_runpicture20, primVoid(), SYM(begingroup), formal(primPicture(), SYM(f), false, false));
-#line 291 "runpicture.in"
+#line 291 "./runpicture.in"
addFunc(ve, run::gen_runpicture21, primVoid(), SYM(endgroup), formal(primPicture(), SYM(f), false, false));
-#line 296 "runpicture.in"
+#line 296 "./runpicture.in"
addFunc(ve, run::gen_runpicture22, primVoid(), SYM(_begingroup3), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(name), false, false), formal(primReal(), SYM(compression), false, false), formal(primReal(), SYM(granularity), false, false), formal(primBoolean(), SYM(closed), false, false), formal(primBoolean(), SYM(tessellate), false, false), formal(primBoolean(), SYM(dobreak), false, false), formal(primBoolean(), SYM(nobreak), false, false), formal(primTriple(), SYM(center), false, false), formal(primInt(), SYM(interaction), false, false));
-#line 305 "runpicture.in"
+#line 305 "./runpicture.in"
addFunc(ve, run::gen_runpicture23, primVoid(), SYM(endgroup3), formal(primPicture(), SYM(f), false, false));
-#line 310 "runpicture.in"
+#line 310 "./runpicture.in"
addFunc(ve, run::gen_runpicture24, primVoid(), SYM(add), formal(primPicture(), SYM(dest), false, false), formal(primPicture(), SYM(src), false, false));
-#line 315 "runpicture.in"
+#line 315 "./runpicture.in"
addFunc(ve, run::gen_runpicture25, primVoid(), SYM(prepend), formal(primPicture(), SYM(dest), false, false), formal(primPicture(), SYM(src), false, false));
-#line 320 "runpicture.in"
+#line 320 "./runpicture.in"
addFunc(ve, run::gen_runpicture26, primVoid(), SYM(postscript), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false));
-#line 325 "runpicture.in"
+#line 325 "./runpicture.in"
addFunc(ve, run::gen_runpicture27, primVoid(), SYM(tex), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false));
-#line 330 "runpicture.in"
+#line 330 "./runpicture.in"
addFunc(ve, run::gen_runpicture28, primVoid(), SYM(postscript), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false), formal(primPair(), SYM(min), false, false), formal(primPair(), SYM(max), false, false));
-#line 335 "runpicture.in"
+#line 335 "./runpicture.in"
addFunc(ve, run::gen_runpicture29, primVoid(), SYM(tex), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false), formal(primPair(), SYM(min), false, false), formal(primPair(), SYM(max), false, false));
-#line 340 "runpicture.in"
+#line 340 "./runpicture.in"
addFunc(ve, run::gen_runpicture30, primVoid(), SYM(texpreamble), formal(primString(), SYM(s), false, false));
-#line 348 "runpicture.in"
+#line 348 "./runpicture.in"
addFunc(ve, run::gen_runpicture31, primVoid(), SYM(deletepreamble));
-#line 355 "runpicture.in"
+#line 355 "./runpicture.in"
addFunc(ve, run::gen_runpicture32, primVoid(), SYM(_labelpath), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(s), false, false), formal(primString(), SYM(size), false, false), formal(primPath(), SYM(g), false, false), formal(primString(), SYM(justify), false, false), formal(primPair(), SYM(offset), false, false), formal(primPen(), SYM(p), false, false));
-#line 361 "runpicture.in"
+#line 361 "./runpicture.in"
addFunc(ve, run::gen_runpicture33, primVoid(), SYM(texreset));
-#line 369 "runpicture.in"
+#line 369 "./runpicture.in"
addFunc(ve, run::gen_runpicture34, primVoid(), SYM(layer), formal(primPicture(), SYM(f), false, false));
-#line 374 "runpicture.in"
+#line 374 "./runpicture.in"
addFunc(ve, run::gen_runpicture35, primVoid(), SYM(newpage), formal(primPicture(), SYM(f), false, false));
-#line 379 "runpicture.in"
+#line 379 "./runpicture.in"
addFunc(ve, run::gen_runpicture36, primVoid(), SYM(_image), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(data), false, false), formal(primPair(), SYM(initial), false, false), formal(primPair(), SYM(final), false, false), formal(penArray(), SYM(palette), true, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(copy), true, false), formal(primBoolean(), SYM(antialias), true, false));
-#line 389 "runpicture.in"
+#line 389 "./runpicture.in"
addFunc(ve, run::gen_runpicture37, primVoid(), SYM(_image), formal(primPicture(), SYM(f), false, false), formal(penArray2(), SYM(data), false, false), formal(primPair(), SYM(initial), false, false), formal(primPair(), SYM(final), false, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(copy), true, false), formal(primBoolean(), SYM(antialias), true, false));
-#line 397 "runpicture.in"
+#line 397 "./runpicture.in"
addFunc(ve, run::gen_runpicture38, primVoid(), SYM(_image), formal(primPicture(), SYM(f), false, false), formal(penFunction(), SYM(f), false, false), formal(primInt(), SYM(width), false, false), formal(primInt(), SYM(height), false, false), formal(primPair(), SYM(initial), false, false), formal(primPair(), SYM(final), false, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(antialias), true, false));
-#line 404 "runpicture.in"
+#line 404 "./runpicture.in"
addFunc(ve, run::gen_runpicture39, primString(), SYM(nativeformat));
-#line 409 "runpicture.in"
+#line 409 "./runpicture.in"
addFunc(ve, run::gen_runpicture40, primBoolean(), SYM(latex));
-#line 414 "runpicture.in"
+#line 414 "./runpicture.in"
addFunc(ve, run::gen_runpicture41, primBoolean(), SYM(pdf));
-#line 419 "runpicture.in"
+#line 419 "./runpicture.in"
addFunc(ve, run::gen_runpicture42, primVoid(), SYM(_shipout), formal(primString(), SYM(prefix), true, false), formal(primPicture(), SYM(f), false, false), formal(primPicture(), SYM(preamble), true, false), formal(primString(), SYM(format), true, false), formal(primBoolean(), SYM(wait), true, false), formal(primBoolean(), SYM(view), true, false), formal(primTransform(), SYM(t), true, false));
-#line 470 "runpicture.in"
- addFunc(ve, run::gen_runpicture43, primVoid(), SYM(shipout3), formal(primString(), SYM(prefix), false, false), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(format), true, false), formal(primReal(), SYM(width), false, false), formal(primReal(), SYM(height), false, false), formal(primReal(), SYM(angle), false, false), formal(primReal(), SYM(zoom), false, false), formal(primTriple(), SYM(m), false, false), formal(primTriple(), SYM(m), false, false), formal(primPair(), SYM(shift), false, false), formal(primPair(), SYM(margin), false, false), formal(realArray2(), SYM(t), false, false), formal(realArray(), SYM(background), false, false), formal(tripleArray(), SYM(lights), false, false), formal(realArray2(), SYM(diffuse), false, false), formal(realArray2(), SYM(specular), false, false), formal(primBoolean(), SYM(view), true, false));
-#line 495 "runpicture.in"
+#line 470 "./runpicture.in"
+ addFunc(ve, run::gen_runpicture43, primVoid(), SYM(shipout3), formal(primString(), SYM(prefix), false, false), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(format), true, false), formal(primReal(), SYM(width), false, false), formal(primReal(), SYM(height), false, false), formal(primReal(), SYM(angle), false, false), formal(primReal(), SYM(zoom), false, false), formal(primTriple(), SYM(m), false, false), formal(primTriple(), SYM(m), false, false), formal(primPair(), SYM(shift), false, false), formal(primPair(), SYM(margin), false, false), formal(realArray2(), SYM(t), false, false), formal(realArray2(), SYM(tup), false, false), formal(realArray(), SYM(background), false, false), formal(tripleArray(), SYM(lights), false, false), formal(realArray2(), SYM(diffuse), false, false), formal(realArray2(), SYM(specular), false, false), formal(primBoolean(), SYM(view), true, false));
+#line 498 "./runpicture.in"
addFunc(ve, run::gen_runpicture44, primVoid(), SYM(shipout3), formal(primString(), SYM(prefix), false, false), formal(primPicture(), SYM(f), false, false), formal(primString(), SYM(format), true, false));
-#line 500 "runpicture.in"
+#line 503 "./runpicture.in"
addFunc(ve, run::gen_runpicture45, primVoid(), SYM(xmap), formal(primString(), SYM(key), false, false), formal(primTransform(), SYM(t), true, false));
-#line 515 "runpicture.in"
+#line 518 "./runpicture.in"
addFunc(ve, run::gen_runpicture46, primVoid(), SYM(deconstruct), formal(primPicture(), SYM(f), false, false), formal(primPicture(), SYM(preamble), true, false), formal(primTransform(), SYM(t), true, false));
-#line 627 "runpicture.in"
+#line 630 "./runpicture.in"
addFunc(ve, run::gen_runpicture47, primVoid(), SYM(_draw), formal(primPicture(), SYM(f), false, false), formal(primPath3(), SYM(g), false, false), formal(primTriple(), SYM(center), true, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(primInt(), SYM(interaction), true, false));
-#line 642 "runpicture.in"
+#line 645 "./runpicture.in"
addFunc(ve, run::gen_runpicture48, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(center), false, false), formal(primBoolean(), SYM(straight), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(penArray(), SYM(colors), false, false), formal(primInt(), SYM(interaction), false, false), formal(primInt(), SYM(digits), false, false), formal(primBoolean(), SYM(primitive), true, false));
-#line 654 "runpicture.in"
+#line 657 "./runpicture.in"
addFunc(ve, run::gen_runpicture49, primVoid(), SYM(drawbeziertriangle), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(center), false, false), formal(primBoolean(), SYM(straight), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(penArray(), SYM(colors), false, false), formal(primInt(), SYM(interaction), false, false), formal(primInt(), SYM(digits), false, false), formal(primBoolean(), SYM(primitive), true, false));
-#line 667 "runpicture.in"
+#line 670 "./runpicture.in"
addFunc(ve, run::gen_runpicture50, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(p), false, false), formal(realArray(), SYM(knot), false, false), formal(realArray(), SYM(weights), true, false), formal(primPen(), SYM(p), false, false));
-#line 674 "runpicture.in"
+#line 677 "./runpicture.in"
addFunc(ve, run::gen_runpicture51, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(realArray(), SYM(uknot), false, false), formal(realArray(), SYM(vknot), false, false), formal(realArray2(), SYM(weights), true, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(penArray(), SYM(colors), false, false));
-#line 683 "runpicture.in"
+#line 686 "./runpicture.in"
addFunc(ve, run::gen_runpicture52, primVoid(), SYM(drawSphere), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(primBoolean(), SYM(half), true, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(primInt(), SYM(type), false, false));
-#line 692 "runpicture.in"
+#line 695 "./runpicture.in"
addFunc(ve, run::gen_runpicture53, primVoid(), SYM(drawCylinder), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(primBoolean(), SYM(core), true, false));
-#line 700 "runpicture.in"
+#line 703 "./runpicture.in"
addFunc(ve, run::gen_runpicture54, primVoid(), SYM(drawDisk), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false));
-#line 707 "runpicture.in"
+#line 710 "./runpicture.in"
addFunc(ve, run::gen_runpicture55, primVoid(), SYM(drawTube), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(g), false, false), formal(primReal(), SYM(width), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(primTriple(), SYM(min), false, false), formal(primTriple(), SYM(max), false, false), formal(primBoolean(), SYM(core), true, false));
-#line 716 "runpicture.in"
+#line 719 "./runpicture.in"
addFunc(ve, run::gen_runpicture56, primVoid(), SYM(drawpixel), formal(primPicture(), SYM(f), false, false), formal(primTriple(), SYM(v), false, false), formal(primPen(), SYM(p), false, false), formal(primReal(), SYM(width), true, false));
-#line 722 "runpicture.in"
+#line 725 "./runpicture.in"
addFunc(ve, run::gen_runpicture57, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(v), false, false), formal(IntArray2(), SYM(vi), false, false), formal(primTriple(), SYM(center), true, false), formal(tripleArray(), SYM(n), false, false), formal(IntArray2(), SYM(ni), false, false), formal(penArray(), SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(metallic), false, false), formal(primReal(), SYM(fresnel0), false, false), formal(penArray(), SYM(c), true, false), formal(IntArray2(), SYM(ci), true, false), formal(primInt(), SYM(interaction), false, false));
-#line 734 "runpicture.in"
+#line 737 "./runpicture.in"
addFunc(ve, run::gen_runpicture58, primTriple(), SYM(min3), formal(primPicture(), SYM(f), false, false));
-#line 739 "runpicture.in"
+#line 742 "./runpicture.in"
addFunc(ve, run::gen_runpicture59, primTriple(), SYM(max3), formal(primPicture(), SYM(f), false, false));
-#line 744 "runpicture.in"
+#line 747 "./runpicture.in"
addFunc(ve, run::gen_runpicture60, primTriple(), SYM(size3), formal(primPicture(), SYM(f), false, false));
-#line 750 "runpicture.in"
+#line 753 "./runpicture.in"
addFunc(ve, run::gen_runpicture61, primPair(), SYM(minratio), formal(primPicture(), SYM(f), false, false));
-#line 755 "runpicture.in"
+#line 758 "./runpicture.in"
addFunc(ve, run::gen_runpicture62, primPair(), SYM(maxratio), formal(primPicture(), SYM(f), false, false));
-#line 760 "runpicture.in"
+#line 763 "./runpicture.in"
addFunc(ve, run::gen_runpicture63, primBoolean(), SYM(is3D), formal(primPicture(), SYM(f), false, false));
}
diff --git a/graphics/asymptote/runpicture.h b/graphics/asymptote/runpicture.h
index db7db84248..ae990b8c29 100644
--- a/graphics/asymptote/runpicture.h
+++ b/graphics/asymptote/runpicture.h
@@ -1,9 +1,7 @@
/***** Autogenerated from runpicture.in; changes will be overwritten *****/
-#ifndef runpicture_H
-#define runpicture_H
+#pragma once
namespace run {
void newPicture(vm::stack *);
}
-#endif // runpicture_H
diff --git a/graphics/asymptote/runpicture.in b/graphics/asymptote/runpicture.in
index 56431b9be7..421a97db8e 100644
--- a/graphics/asymptote/runpicture.in
+++ b/graphics/asymptote/runpicture.in
@@ -470,26 +470,29 @@ void _shipout(string prefix=emptystring, picture *f, picture *preamble=NULL,
void shipout3(string prefix, picture *f, string format=emptystring,
real width, real height, real angle, real zoom,
triple m, triple M, pair shift, pair margin, realarray2 *t,
+ realarray2 *tup,
realarray *background, triplearray *lights, realarray2 *diffuse,
realarray2 *specular, bool view=true)
{
size_t n=checkArrays(lights,diffuse);
checkEqual(n,checkArray(specular));
- real *T,*Background,*Diffuse,*Specular;
+ real *T,*Tup,*Background,*Diffuse,*Specular;
triple *Lights;
copyArray2C(T,t,true,4);
+ copyArray2C(Tup,tup,true,4);
copyArrayC(Background,background);
copyArrayC(Lights,lights);
copyArray2C(Diffuse,diffuse,false,4,UseGC);
copyArray2C(Specular,specular,false,4,UseGC);
- f->shipout3(prefix,format,width,height,angle,zoom,m,M,shift,margin,T,
+ f->shipout3(prefix,format,width,height,angle,zoom,m,M,shift,margin,T,Tup,
Background,n,Lights,Diffuse,Specular,view);
delete[] Background;
delete[] T;
+ delete[] Tup;
}
void shipout3(string prefix, picture *f, string format=defaultformat3)
diff --git a/graphics/asymptote/runstring.cc b/graphics/asymptote/runstring.cc
index a9c557af78..537f70d5af 100644
--- a/graphics/asymptote/runstring.cc
+++ b/graphics/asymptote/runstring.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runstring.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runstring.in"
+#line 1 "./runstring.in"
/*****
* runstring.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -64,6 +64,9 @@ function *realRealFunction();
#line 10 "runstring.in"
#include <cfloat>
#include <cstring>
+#include <iomanip>
+#include <ctime>
+#include <chrono>
#include <algorithm>
#include "array.h"
@@ -171,124 +174,124 @@ void checkformat(const char *ptr, bool intformat)
#endif
namespace run {
// String operations
-#line 113 "runstring.in"
+#line 116 "./runstring.in"
void emptyString(stack *Stack)
{
-#line 114 "runstring.in"
+#line 117 "./runstring.in"
{Stack->push<string>(emptystring); return;}
}
-#line 119 "runstring.in"
+#line 122 "./runstring.in"
// Int length(string *s);
void gen_runstring1(stack *Stack)
{
string * s=vm::pop<string *>(Stack);
-#line 120 "runstring.in"
+#line 123 "./runstring.in"
{Stack->push<Int>((Int) s->length()); return;}
}
-#line 124 "runstring.in"
+#line 127 "./runstring.in"
// Int find(string *s, string t, Int pos=0);
void gen_runstring2(stack *Stack)
{
Int pos=vm::pop<Int>(Stack,0);
string t=vm::pop<string>(Stack);
string * s=vm::pop<string *>(Stack);
-#line 125 "runstring.in"
+#line 128 "./runstring.in"
size_t n=s->find(t,pos);
{Stack->push<Int>(n == string::npos ? (Int) -1 : (Int) n); return;}
}
-#line 130 "runstring.in"
+#line 133 "./runstring.in"
// Int rfind(string *s, string t, Int pos=-1);
void gen_runstring3(stack *Stack)
{
Int pos=vm::pop<Int>(Stack,-1);
string t=vm::pop<string>(Stack);
string * s=vm::pop<string *>(Stack);
-#line 131 "runstring.in"
+#line 134 "./runstring.in"
size_t n=s->rfind(t,pos);
{Stack->push<Int>(n == string::npos ? (Int) -1 : (Int) n); return;}
}
-#line 136 "runstring.in"
+#line 139 "./runstring.in"
// string reverse(string s);
void gen_runstring4(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 137 "runstring.in"
+#line 140 "./runstring.in"
reverse(s.begin(),s.end());
{Stack->push<string>(s); return;}
}
-#line 142 "runstring.in"
+#line 145 "./runstring.in"
// string insert(string s, Int pos, string t);
void gen_runstring5(stack *Stack)
{
string t=vm::pop<string>(Stack);
Int pos=vm::pop<Int>(Stack);
string s=vm::pop<string>(Stack);
-#line 143 "runstring.in"
+#line 146 "./runstring.in"
if ((size_t) pos < s.length())
{Stack->push<string>(s.insert(pos,t)); return;}
{Stack->push<string>(s); return;}
}
-#line 149 "runstring.in"
+#line 152 "./runstring.in"
// string substr(string* s, Int pos, Int n=-1);
void gen_runstring6(stack *Stack)
{
Int n=vm::pop<Int>(Stack,-1);
Int pos=vm::pop<Int>(Stack);
string* s=vm::pop<string*>(Stack);
-#line 150 "runstring.in"
+#line 153 "./runstring.in"
if ((size_t) pos < s->length())
{Stack->push<string>(s->substr(pos,n)); return;}
{Stack->push<string>(emptystring); return;}
}
-#line 156 "runstring.in"
+#line 159 "./runstring.in"
// string erase(string s, Int pos, Int n);
void gen_runstring7(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
Int pos=vm::pop<Int>(Stack);
string s=vm::pop<string>(Stack);
-#line 157 "runstring.in"
+#line 160 "./runstring.in"
if ((size_t) pos < s.length())
{Stack->push<string>(s.erase(pos,n)); return;}
{Stack->push<string>(s); return;}
}
-#line 163 "runstring.in"
+#line 166 "./runstring.in"
// string downcase(string s);
void gen_runstring8(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 164 "runstring.in"
+#line 167 "./runstring.in"
std::transform(s.begin(),s.end(),s.begin(),tolower);
{Stack->push<string>(s); return;}
}
-#line 169 "runstring.in"
+#line 172 "./runstring.in"
// string upcase(string s);
void gen_runstring9(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 170 "runstring.in"
+#line 173 "./runstring.in"
std::transform(s.begin(),s.end(),s.begin(),toupper);
{Stack->push<string>(s); return;}
}
// returns a string constructed by translating all occurrences of the string
// from in an array of string pairs {from,to} to the string to in string s.
-#line 177 "runstring.in"
+#line 180 "./runstring.in"
// string replace(string *S, stringarray2 *translate);
void gen_runstring10(stack *Stack)
{
stringarray2 * translate=vm::pop<stringarray2 *>(Stack);
string * S=vm::pop<string *>(Stack);
-#line 178 "runstring.in"
+#line 181 "./runstring.in"
size_t size=checkArray(translate);
for(size_t i=0; i < size; i++) {
array *a=read<array*>(translate,i);
@@ -318,14 +321,14 @@ void gen_runstring10(stack *Stack)
{Stack->push<string>(buf.str()); return;}
}
-#line 208 "runstring.in"
+#line 211 "./runstring.in"
// string format(string *format, Int x, string locale=emptystring);
void gen_runstring11(stack *Stack)
{
string locale=vm::pop<string>(Stack,emptystring);
Int x=vm::pop<Int>(Stack);
string * format=vm::pop<string *>(Stack);
-#line 209 "runstring.in"
+#line 212 "./runstring.in"
ostringstream out;
const char *p0=format->c_str();
checkformat(p0,true);
@@ -379,7 +382,7 @@ void gen_runstring11(stack *Stack)
{Stack->push<string>(out.str()); return;}
}
-#line 263 "runstring.in"
+#line 266 "./runstring.in"
// string format(string *format, bool forcemath=false, string separator, real x, string locale=emptystring);
void gen_runstring12(stack *Stack)
{
@@ -388,7 +391,7 @@ void gen_runstring12(stack *Stack)
string separator=vm::pop<string>(Stack);
bool forcemath=vm::pop<bool>(Stack,false);
string * format=vm::pop<string *>(Stack);
-#line 265 "runstring.in"
+#line 268 "./runstring.in"
if(*format == "%") {Stack->push<string>(""); return;} // Temporary workaround for github Issue #29.
bool tex=getSetting<string>("tex") != "none";
@@ -515,12 +518,12 @@ void gen_runstring12(stack *Stack)
{Stack->push<string>(out.str()); return;}
}
-#line 392 "runstring.in"
+#line 395 "./runstring.in"
// Int hex(string s);
void gen_runstring13(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 393 "runstring.in"
+#line 396 "./runstring.in"
istringstream is(s);
is.setf(std::ios::hex,std::ios::basefield);
Int value;
@@ -530,45 +533,45 @@ void gen_runstring13(stack *Stack)
error(buf);
}
-#line 403 "runstring.in"
+#line 406 "./runstring.in"
// Int ascii(string s);
void gen_runstring14(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 404 "runstring.in"
+#line 407 "./runstring.in"
{Stack->push<Int>(s.empty() ? -1 : (unsigned char) s[0]); return;}
}
-#line 408 "runstring.in"
+#line 411 "./runstring.in"
// string string(Int x);
void gen_runstring15(stack *Stack)
{
Int x=vm::pop<Int>(Stack);
-#line 409 "runstring.in"
+#line 412 "./runstring.in"
ostringstream buf;
buf << x;
{Stack->push<string>(buf.str()); return;}
}
-#line 415 "runstring.in"
+#line 418 "./runstring.in"
// string string(real x, Int digits=DBL_DIG);
void gen_runstring16(stack *Stack)
{
Int digits=vm::pop<Int>(Stack,DBL_DIG);
real x=vm::pop<real>(Stack);
-#line 416 "runstring.in"
+#line 419 "./runstring.in"
ostringstream buf;
buf.precision(digits);
buf << x;
{Stack->push<string>(buf.str()); return;}
}
-#line 423 "runstring.in"
+#line 426 "./runstring.in"
// string time(string format=defaulttimeformat);
void gen_runstring17(stack *Stack)
{
string format=vm::pop<string>(Stack,defaulttimeformat);
-#line 424 "runstring.in"
+#line 427 "./runstring.in"
#ifdef HAVE_STRFTIME
const time_t bintime=time(NULL);
if(!strftime(Time,nTime,format.c_str(),localtime(&bintime))) {Stack->push<string>(""); return;}
@@ -578,13 +581,13 @@ void gen_runstring17(stack *Stack)
#endif
}
-#line 434 "runstring.in"
+#line 437 "./runstring.in"
// string time(Int seconds, string format=defaulttimeformat);
void gen_runstring18(stack *Stack)
{
string format=vm::pop<string>(Stack,defaulttimeformat);
Int seconds=vm::pop<Int>(Stack);
-#line 435 "runstring.in"
+#line 438 "./runstring.in"
#ifdef HAVE_STRFTIME
const time_t bintime=seconds;
if(!strftime(Time,nTime,format.c_str(),localtime(&bintime))) {Stack->push<string>(""); return;}
@@ -596,21 +599,34 @@ void gen_runstring18(stack *Stack)
#endif
}
-#line 447 "runstring.in"
+#line 450 "./runstring.in"
// Int seconds(string t=emptystring, string format=emptystring);
void gen_runstring19(stack *Stack)
{
string format=vm::pop<string>(Stack,emptystring);
string t=vm::pop<string>(Stack,emptystring);
-#line 448 "runstring.in"
-#if defined(HAVE_STRPTIME)
- const time_t bintime=time(NULL);
- tm tm=*localtime(&bintime);
- if(t != "" && !strptime(t.c_str(),format.c_str(),&tm)) {Stack->push<Int>(-1); return;}
- {Stack->push<Int>((Int) mktime(&tm)); return;}
-#else
- {Stack->push<Int>(-1); return;}
-#endif
+#line 451 "./runstring.in"
+ if (t == "")
+ {
+ auto clock = std::chrono::system_clock::now();
+ {Stack->push<Int>(static_cast<Int>(
+ std::chrono::duration_cast<std::chrono::seconds>(
+ clock.time_since_epoch()
+ ).count()
+ )); return;}
+ }
+
+ std::tm tmObj = {};
+ istringstream instream(t);
+ instream.imbue(std::locale(""));
+ instream >> std::get_time(&tmObj,format.c_str());
+
+ if(instream.fail())
+ {
+ {Stack->push<Int>(-1); return;}
+ }
+
+ {Stack->push<Int>(static_cast<Int>(std::mktime(&tmObj))); return;}
}
} // namespace run
@@ -619,45 +635,45 @@ namespace trans {
void gen_runstring_venv(venv &ve)
{
-#line 112 "runstring.in"
+#line 115 "./runstring.in"
REGISTER_BLTIN(run::emptyString,"emptyString");
-#line 119 "runstring.in"
+#line 122 "./runstring.in"
addFunc(ve, run::gen_runstring1, primInt(), SYM(length), formal(primString(), SYM(s), false, false));
-#line 124 "runstring.in"
+#line 127 "./runstring.in"
addFunc(ve, run::gen_runstring2, primInt(), SYM(find), formal(primString(), SYM(s), false, false), formal(primString(), SYM(t), false, false), formal(primInt(), SYM(pos), true, false));
-#line 130 "runstring.in"
+#line 133 "./runstring.in"
addFunc(ve, run::gen_runstring3, primInt(), SYM(rfind), formal(primString(), SYM(s), false, false), formal(primString(), SYM(t), false, false), formal(primInt(), SYM(pos), true, false));
-#line 136 "runstring.in"
+#line 139 "./runstring.in"
addFunc(ve, run::gen_runstring4, primString(), SYM(reverse), formal(primString(), SYM(s), false, false));
-#line 142 "runstring.in"
+#line 145 "./runstring.in"
addFunc(ve, run::gen_runstring5, primString(), SYM(insert), formal(primString(), SYM(s), false, false), formal(primInt(), SYM(pos), false, false), formal(primString(), SYM(t), false, false));
-#line 149 "runstring.in"
+#line 152 "./runstring.in"
addFunc(ve, run::gen_runstring6, primString(), SYM(substr), formal(primString(), SYM(s), false, false), formal(primInt(), SYM(pos), false, false), formal(primInt(), SYM(n), true, false));
-#line 156 "runstring.in"
+#line 159 "./runstring.in"
addFunc(ve, run::gen_runstring7, primString(), SYM(erase), formal(primString(), SYM(s), false, false), formal(primInt(), SYM(pos), false, false), formal(primInt(), SYM(n), false, false));
-#line 163 "runstring.in"
+#line 166 "./runstring.in"
addFunc(ve, run::gen_runstring8, primString(), SYM(downcase), formal(primString(), SYM(s), false, false));
-#line 169 "runstring.in"
+#line 172 "./runstring.in"
addFunc(ve, run::gen_runstring9, primString(), SYM(upcase), formal(primString(), SYM(s), false, false));
-#line 175 "runstring.in"
+#line 178 "./runstring.in"
addFunc(ve, run::gen_runstring10, primString(), SYM(replace), formal(primString(), SYM(s), false, false), formal(stringArray2(), SYM(translate), false, false));
-#line 208 "runstring.in"
+#line 211 "./runstring.in"
addFunc(ve, run::gen_runstring11, primString(), SYM(format), formal(primString(), SYM(format), false, false), formal(primInt(), SYM(x), false, false), formal(primString(), SYM(locale), true, false));
-#line 263 "runstring.in"
+#line 266 "./runstring.in"
addFunc(ve, run::gen_runstring12, primString(), SYM(format), formal(primString(), SYM(format), false, false), formal(primBoolean(), SYM(forcemath), true, false), formal(primString(), SYM(separator), false, false), formal(primReal(), SYM(x), false, false), formal(primString(), SYM(locale), true, false));
-#line 392 "runstring.in"
+#line 395 "./runstring.in"
addFunc(ve, run::gen_runstring13, primInt(), SYM(hex), formal(primString(), SYM(s), false, false));
-#line 403 "runstring.in"
+#line 406 "./runstring.in"
addFunc(ve, run::gen_runstring14, primInt(), SYM(ascii), formal(primString(), SYM(s), false, false));
-#line 408 "runstring.in"
+#line 411 "./runstring.in"
addFunc(ve, run::gen_runstring15, primString(), SYM(string), formal(primInt(), SYM(x), false, false));
-#line 415 "runstring.in"
+#line 418 "./runstring.in"
addFunc(ve, run::gen_runstring16, primString(), SYM(string), formal(primReal(), SYM(x), false, false), formal(primInt(), SYM(digits), true, false));
-#line 423 "runstring.in"
+#line 426 "./runstring.in"
addFunc(ve, run::gen_runstring17, primString(), SYM(time), formal(primString(), SYM(format), true, false));
-#line 434 "runstring.in"
+#line 437 "./runstring.in"
addFunc(ve, run::gen_runstring18, primString(), SYM(time), formal(primInt(), SYM(seconds), false, false), formal(primString(), SYM(format), true, false));
-#line 447 "runstring.in"
+#line 450 "./runstring.in"
addFunc(ve, run::gen_runstring19, primInt(), SYM(seconds), formal(primString(), SYM(t), true, false), formal(primString(), SYM(format), true, false));
}
diff --git a/graphics/asymptote/runstring.h b/graphics/asymptote/runstring.h
index 0092cf5d57..aba6f0a10a 100644
--- a/graphics/asymptote/runstring.h
+++ b/graphics/asymptote/runstring.h
@@ -1,9 +1,7 @@
/***** Autogenerated from runstring.in; changes will be overwritten *****/
-#ifndef runstring_H
-#define runstring_H
+#pragma once
namespace run {
void emptyString(vm::stack *);
}
-#endif // runstring_H
diff --git a/graphics/asymptote/runstring.in b/graphics/asymptote/runstring.in
index b57a921515..24c4ef89b1 100644
--- a/graphics/asymptote/runstring.in
+++ b/graphics/asymptote/runstring.in
@@ -9,6 +9,9 @@ stringarray2* => stringArray2()
#include <cfloat>
#include <cstring>
+#include <iomanip>
+#include <ctime>
+#include <chrono>
#include <algorithm>
#include "array.h"
@@ -446,12 +449,25 @@ string time(Int seconds, string format=defaulttimeformat)
Int seconds(string t=emptystring, string format=emptystring)
{
-#if defined(HAVE_STRPTIME)
- const time_t bintime=time(NULL);
- tm tm=*localtime(&bintime);
- if(t != "" && !strptime(t.c_str(),format.c_str(),&tm)) return -1;
- return (Int) mktime(&tm);
-#else
- return -1;
-#endif
+ if (t == "")
+ {
+ auto clock = std::chrono::system_clock::now();
+ return static_cast<Int>(
+ std::chrono::duration_cast<std::chrono::seconds>(
+ clock.time_since_epoch()
+ ).count()
+ );
+ }
+
+ std::tm tmObj = {};
+ istringstream instream(t);
+ instream.imbue(std::locale(""));
+ instream >> std::get_time(&tmObj,format.c_str());
+
+ if(instream.fail())
+ {
+ return -1;
+ }
+
+ return static_cast<Int>(std::mktime(&tmObj));
}
diff --git a/graphics/asymptote/runsystem.cc b/graphics/asymptote/runsystem.cc
index e9c8c37eec..202fdab09a 100644
--- a/graphics/asymptote/runsystem.cc
+++ b/graphics/asymptote/runsystem.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runsystem.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runsystem.in"
+#line 1 "./runsystem.in"
/*****
* runsystem.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -62,7 +62,7 @@ function *realRealFunction();
#define CURRENTPEN processData().currentpen
#line 12 "runsystem.in"
-#include "process.h"
+#include "asyprocess.h"
#include "stack.h"
#include "locate.h"
@@ -163,192 +163,194 @@ void exitFunction(stack *Stack)
#endif
namespace run {
-#line 107 "runsystem.in"
+#line 107 "./runsystem.in"
// string outname();
void gen_runsystem0(stack *Stack)
{
-#line 108 "runsystem.in"
+#line 108 "./runsystem.in"
{Stack->push<string>(outname()); return;}
}
-#line 112 "runsystem.in"
+#line 112 "./runsystem.in"
// void atupdate(callable *f);
void gen_runsystem1(stack *Stack)
{
callable * f=vm::pop<callable *>(Stack);
-#line 113 "runsystem.in"
+#line 113 "./runsystem.in"
processData().atUpdateFunction=f;
}
-#line 117 "runsystem.in"
+#line 117 "./runsystem.in"
// callable* atupdate();
void gen_runsystem2(stack *Stack)
{
-#line 118 "runsystem.in"
+#line 118 "./runsystem.in"
{Stack->push<callable*>(processData().atUpdateFunction); return;}
}
-#line 122 "runsystem.in"
+#line 122 "./runsystem.in"
// void atexit(callable *f);
void gen_runsystem3(stack *Stack)
{
callable * f=vm::pop<callable *>(Stack);
-#line 123 "runsystem.in"
+#line 123 "./runsystem.in"
processData().atExitFunction=f;
}
-#line 127 "runsystem.in"
+#line 127 "./runsystem.in"
// callable* atexit();
void gen_runsystem4(stack *Stack)
{
-#line 128 "runsystem.in"
+#line 128 "./runsystem.in"
{Stack->push<callable*>(processData().atExitFunction); return;}
}
-#line 132 "runsystem.in"
+#line 132 "./runsystem.in"
// void atbreakpoint(callableBp *f);
void gen_runsystem5(stack *Stack)
{
callableBp * f=vm::pop<callableBp *>(Stack);
-#line 133 "runsystem.in"
+#line 133 "./runsystem.in"
processData().atBreakpointFunction=f;
}
-#line 137 "runsystem.in"
+#line 137 "./runsystem.in"
// void breakpoint(runnable *s=NULL);
void gen_runsystem6(stack *Stack)
{
runnable * s=vm::pop<runnable *>(Stack,NULL);
-#line 138 "runsystem.in"
+#line 138 "./runsystem.in"
breakpoint(Stack,s);
}
-#line 142 "runsystem.in"
+#line 142 "./runsystem.in"
// string locatefile(string file, bool full=true);
void gen_runsystem7(stack *Stack)
{
bool full=vm::pop<bool>(Stack,true);
string file=vm::pop<string>(Stack);
-#line 143 "runsystem.in"
+#line 143 "./runsystem.in"
{Stack->push<string>(locateFile(file,full)); return;}
}
-#line 147 "runsystem.in"
+#line 147 "./runsystem.in"
// void stop(string file, Int line, runnable *s=NULL);
void gen_runsystem8(stack *Stack)
{
runnable * s=vm::pop<runnable *>(Stack,NULL);
Int line=vm::pop<Int>(Stack);
string file=vm::pop<string>(Stack);
-#line 148 "runsystem.in"
+#line 148 "./runsystem.in"
file=locateFile(file);
clear(file,line);
cout << "setting breakpoint at " << file << ": " << line << endl;
bplist.push_back(bpinfo(file,line,s));
}
-#line 155 "runsystem.in"
+#line 155 "./runsystem.in"
// void breakpoints();
void gen_runsystem9(stack *)
{
-#line 156 "runsystem.in"
+#line 156 "./runsystem.in"
for(mem::list<bpinfo>::iterator p=bplist.begin(); p != bplist.end(); ++p)
cout << p->f.name() << ": " << p->f.line() << endl;
}
-#line 161 "runsystem.in"
+#line 161 "./runsystem.in"
// void clear(string file, Int line);
void gen_runsystem10(stack *Stack)
{
Int line=vm::pop<Int>(Stack);
string file=vm::pop<string>(Stack);
-#line 162 "runsystem.in"
+#line 162 "./runsystem.in"
file=locateFile(file);
clear(file,line,true);
}
-#line 167 "runsystem.in"
+#line 167 "./runsystem.in"
// void clear();
void gen_runsystem11(stack *)
{
-#line 168 "runsystem.in"
+#line 168 "./runsystem.in"
bplist.clear();
}
-#line 172 "runsystem.in"
+#line 172 "./runsystem.in"
// void warn(string s);
void gen_runsystem12(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 173 "runsystem.in"
+#line 173 "./runsystem.in"
Warn(s);
}
-#line 177 "runsystem.in"
+#line 177 "./runsystem.in"
// void nowarn(string s);
void gen_runsystem13(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 178 "runsystem.in"
+#line 178 "./runsystem.in"
noWarn(s);
}
-#line 182 "runsystem.in"
+#line 182 "./runsystem.in"
// void warning(string s, string t, bool position=false);
void gen_runsystem14(stack *Stack)
{
bool position=vm::pop<bool>(Stack,false);
string t=vm::pop<string>(Stack);
string s=vm::pop<string>(Stack);
-#line 183 "runsystem.in"
+#line 183 "./runsystem.in"
if(settings::warn(s)) {
em.warning(position ? getPos() : nullPos,s);
em << t;
+ em.sync(true);
}
}
// Strip directory from string
-#line 191 "runsystem.in"
+#line 192 "./runsystem.in"
// string stripdirectory(string *s);
void gen_runsystem15(stack *Stack)
{
string * s=vm::pop<string *>(Stack);
-#line 192 "runsystem.in"
+#line 193 "./runsystem.in"
{Stack->push<string>(stripDir(*s)); return;}
}
// Strip directory from string
-#line 197 "runsystem.in"
+#line 198 "./runsystem.in"
// string stripfile(string *s);
void gen_runsystem16(stack *Stack)
{
string * s=vm::pop<string *>(Stack);
-#line 198 "runsystem.in"
+#line 199 "./runsystem.in"
{Stack->push<string>(stripFile(*s)); return;}
}
// Strip file extension from string
-#line 203 "runsystem.in"
+#line 204 "./runsystem.in"
// string stripextension(string *s);
void gen_runsystem17(stack *Stack)
{
string * s=vm::pop<string *>(Stack);
-#line 204 "runsystem.in"
+#line 205 "./runsystem.in"
{Stack->push<string>(stripExt(*s)); return;}
}
// Call ImageMagick convert.
-#line 209 "runsystem.in"
+#line 210 "./runsystem.in"
// Int convert(string args=emptystring, string file=emptystring, string format=emptystring);
void gen_runsystem18(stack *Stack)
{
string format=vm::pop<string>(Stack,emptystring);
string file=vm::pop<string>(Stack,emptystring);
string args=vm::pop<string>(Stack,emptystring);
-#line 211 "runsystem.in"
+#line 212 "./runsystem.in"
string name=convertname(file,format);
mem::vector<string> cmd;
- cmd.push_back(getSetting<string>("convert"));
+ string s=getSetting<string>("convert");
+ cmd.push_back(s);
push_split(cmd,args);
cmd.push_back(name);
bool quiet=verbose <= 1;
@@ -371,33 +373,34 @@ void gen_runsystem18(stack *Stack)
}
// Call ImageMagick animate.
-#line 237 "runsystem.in"
+#line 239 "./runsystem.in"
// Int animate(string args=emptystring, string file=emptystring, string format=emptystring);
void gen_runsystem19(stack *Stack)
{
string format=vm::pop<string>(Stack,emptystring);
string file=vm::pop<string>(Stack,emptystring);
string args=vm::pop<string>(Stack,emptystring);
-#line 239 "runsystem.in"
-#ifndef __MSDOS__
+#line 241 "./runsystem.in"
string name=convertname(file,format);
if(view()) {
mem::vector<string> cmd;
- cmd.push_back(getSetting<string>("animate"));
+ string s=getSetting<string>("animate");
+ cmd.push_back(s);
+ if(s == "magick")
+ cmd.push_back("animate");
push_split(cmd,args);
cmd.push_back(name);
{Stack->push<Int>(System(cmd,0,false,"animate","your animated GIF viewer")); return;}
}
-#endif
{Stack->push<Int>(0); return;}
}
-#line 253 "runsystem.in"
+#line 256 "./runsystem.in"
// void purge(Int divisor=0);
void gen_runsystem20(stack *Stack)
{
Int divisor=vm::pop<Int>(Stack,0);
-#line 254 "runsystem.in"
+#line 257 "./runsystem.in"
purge(divisor);
}
@@ -407,47 +410,47 @@ namespace trans {
void gen_runsystem_venv(venv &ve)
{
-#line 107 "runsystem.in"
+#line 107 "./runsystem.in"
addFunc(ve, run::gen_runsystem0, primString(), SYM(outname));
-#line 112 "runsystem.in"
+#line 112 "./runsystem.in"
addFunc(ve, run::gen_runsystem1, primVoid(), SYM(atupdate), formal(voidFunction(), SYM(f), false, false));
-#line 117 "runsystem.in"
+#line 117 "./runsystem.in"
addFunc(ve, run::gen_runsystem2, voidFunction(), SYM(atupdate));
-#line 122 "runsystem.in"
+#line 122 "./runsystem.in"
addFunc(ve, run::gen_runsystem3, primVoid(), SYM(atexit), formal(voidFunction(), SYM(f), false, false));
-#line 127 "runsystem.in"
+#line 127 "./runsystem.in"
addFunc(ve, run::gen_runsystem4, voidFunction(), SYM(atexit));
-#line 132 "runsystem.in"
+#line 132 "./runsystem.in"
addFunc(ve, run::gen_runsystem5, primVoid(), SYM(atbreakpoint), formal(breakpointFunction(), SYM(f), false, false));
-#line 137 "runsystem.in"
+#line 137 "./runsystem.in"
addFunc(ve, run::gen_runsystem6, primVoid(), SYM(breakpoint), formal(primCode(), SYM(s), true, false));
-#line 142 "runsystem.in"
+#line 142 "./runsystem.in"
addFunc(ve, run::gen_runsystem7, primString(), SYM(locatefile), formal(primString(), SYM(file), false, false), formal(primBoolean(), SYM(full), true, false));
-#line 147 "runsystem.in"
+#line 147 "./runsystem.in"
addFunc(ve, run::gen_runsystem8, primVoid(), SYM(stop), formal(primString(), SYM(file), false, false), formal(primInt(), SYM(line), false, false), formal(primCode(), SYM(s), true, false));
-#line 155 "runsystem.in"
+#line 155 "./runsystem.in"
addFunc(ve, run::gen_runsystem9, primVoid(), SYM(breakpoints));
-#line 161 "runsystem.in"
+#line 161 "./runsystem.in"
addFunc(ve, run::gen_runsystem10, primVoid(), SYM(clear), formal(primString(), SYM(file), false, false), formal(primInt(), SYM(line), false, false));
-#line 167 "runsystem.in"
+#line 167 "./runsystem.in"
addFunc(ve, run::gen_runsystem11, primVoid(), SYM(clear));
-#line 172 "runsystem.in"
+#line 172 "./runsystem.in"
addFunc(ve, run::gen_runsystem12, primVoid(), SYM(warn), formal(primString(), SYM(s), false, false));
-#line 177 "runsystem.in"
+#line 177 "./runsystem.in"
addFunc(ve, run::gen_runsystem13, primVoid(), SYM(nowarn), formal(primString(), SYM(s), false, false));
-#line 182 "runsystem.in"
+#line 182 "./runsystem.in"
addFunc(ve, run::gen_runsystem14, primVoid(), SYM(warning), formal(primString(), SYM(s), false, false), formal(primString(), SYM(t), false, false), formal(primBoolean(), SYM(position), true, false));
-#line 190 "runsystem.in"
+#line 191 "./runsystem.in"
addFunc(ve, run::gen_runsystem15, primString(), SYM(stripdirectory), formal(primString(), SYM(s), false, false));
-#line 196 "runsystem.in"
+#line 197 "./runsystem.in"
addFunc(ve, run::gen_runsystem16, primString(), SYM(stripfile), formal(primString(), SYM(s), false, false));
-#line 202 "runsystem.in"
+#line 203 "./runsystem.in"
addFunc(ve, run::gen_runsystem17, primString(), SYM(stripextension), formal(primString(), SYM(s), false, false));
-#line 208 "runsystem.in"
+#line 209 "./runsystem.in"
addFunc(ve, run::gen_runsystem18, primInt(), SYM(convert), formal(primString(), SYM(args), true, false), formal(primString(), SYM(file), true, false), formal(primString(), SYM(format), true, false));
-#line 236 "runsystem.in"
+#line 238 "./runsystem.in"
addFunc(ve, run::gen_runsystem19, primInt(), SYM(animate), formal(primString(), SYM(args), true, false), formal(primString(), SYM(file), true, false), formal(primString(), SYM(format), true, false));
-#line 253 "runsystem.in"
+#line 256 "./runsystem.in"
addFunc(ve, run::gen_runsystem20, primVoid(), SYM(purge), formal(primInt(), SYM(divisor), true, false));
}
diff --git a/graphics/asymptote/runsystem.h b/graphics/asymptote/runsystem.h
index f6912e1076..3386d3d943 100644
--- a/graphics/asymptote/runsystem.h
+++ b/graphics/asymptote/runsystem.h
@@ -1,8 +1,6 @@
/***** Autogenerated from runsystem.in; changes will be overwritten *****/
-#ifndef runsystem_H
-#define runsystem_H
+#pragma once
namespace run {
}
-#endif // runsystem_H
diff --git a/graphics/asymptote/runsystem.in b/graphics/asymptote/runsystem.in
index 306b332ea1..76c40e4a32 100644
--- a/graphics/asymptote/runsystem.in
+++ b/graphics/asymptote/runsystem.in
@@ -9,7 +9,7 @@ callable* => voidFunction()
callableBp* => breakpointFunction()
runnable* => primCode()
-#include "process.h"
+#include "asyprocess.h"
#include "stack.h"
#include "locate.h"
@@ -184,6 +184,7 @@ void warning(string s, string t, bool position=false)
if(settings::warn(s)) {
em.warning(position ? getPos() : nullPos,s);
em << t;
+ em.sync(true);
}
}
@@ -211,7 +212,8 @@ Int convert(string args=emptystring, string file=emptystring,
{
string name=convertname(file,format);
mem::vector<string> cmd;
- cmd.push_back(getSetting<string>("convert"));
+ string s=getSetting<string>("convert");
+ cmd.push_back(s);
push_split(cmd,args);
cmd.push_back(name);
bool quiet=verbose <= 1;
@@ -237,16 +239,17 @@ Int convert(string args=emptystring, string file=emptystring,
Int animate(string args=emptystring, string file=emptystring,
string format=emptystring)
{
-#ifndef __MSDOS__
string name=convertname(file,format);
if(view()) {
mem::vector<string> cmd;
- cmd.push_back(getSetting<string>("animate"));
+ string s=getSetting<string>("animate");
+ cmd.push_back(s);
+ if(s == "magick")
+ cmd.push_back("animate");
push_split(cmd,args);
cmd.push_back(name);
return System(cmd,0,false,"animate","your animated GIF viewer");
}
-#endif
return 0;
}
diff --git a/graphics/asymptote/runtime.cc b/graphics/asymptote/runtime.cc
index ba5a6d0f66..01e3470a9d 100644
--- a/graphics/asymptote/runtime.cc
+++ b/graphics/asymptote/runtime.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runtime.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runtime.in"
+#line 1 "./runtime.in"
/*****
* runtime.in
* Tom Prince 2005/4/15
@@ -30,7 +30,7 @@
// Use Void f() instead of void f() to force an explicit Stack argument.
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -78,9 +78,15 @@ function *realRealFunction();
#include <iostream>
#include <fstream>
#include <time.h>
+
+#include <chrono>
+#include <thread>
+
+#if !defined(_WIN32)
#include <sys/times.h>
-#include <locale.h>
+#endif
+#include <locale.h>
#include "angle.h"
#include "pair.h"
#include "triple.h"
@@ -96,7 +102,7 @@ function *realRealFunction();
#include "builtin.h"
#include "texfile.h"
#include "pipestream.h"
-#include "parser.h"
+#include "asyparser.h"
#include "stack.h"
#include "util.h"
#include "locate.h"
@@ -104,7 +110,7 @@ function *realRealFunction();
#include "callable.h"
#include "stm.h"
#include "lexical.h"
-#include "process.h"
+#include "asyprocess.h"
#include "arrayop.h"
#include "seconds.h"
@@ -257,54 +263,54 @@ void unused(void *)
namespace run {
// Initializers
-#line 229 "runtime.in"
+#line 235 "./runtime.in"
void IntZero(stack *Stack)
{
-#line 230 "runtime.in"
+#line 236 "./runtime.in"
{Stack->push<Int>(0); return;}
}
-#line 235 "runtime.in"
+#line 241 "./runtime.in"
void realZero(stack *Stack)
{
-#line 236 "runtime.in"
+#line 242 "./runtime.in"
{Stack->push<real>(0.0); return;}
}
-#line 240 "runtime.in"
+#line 246 "./runtime.in"
void boolFalse(stack *Stack)
{
-#line 241 "runtime.in"
+#line 247 "./runtime.in"
{Stack->push<bool>(false); return;}
}
-#line 245 "runtime.in"
+#line 251 "./runtime.in"
// bool isnan(real x);
void gen_runtime3(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 246 "runtime.in"
+#line 252 "./runtime.in"
{Stack->push<bool>(std::isnan(x)); return;}
}
-#line 250 "runtime.in"
+#line 256 "./runtime.in"
void pushNullArray(stack *Stack)
{
-#line 251 "runtime.in"
+#line 257 "./runtime.in"
{Stack->push<array*>(0); return;}
}
-#line 255 "runtime.in"
+#line 261 "./runtime.in"
void pushNullRecord(stack *Stack)
{
-#line 256 "runtime.in"
+#line 262 "./runtime.in"
{Stack->push<vmFrame*>(0); return;}
}
-#line 260 "runtime.in"
+#line 266 "./runtime.in"
void pushNullFunction(stack *Stack)
{
-#line 261 "runtime.in"
+#line 267 "./runtime.in"
{Stack->push(nullfunc::instance()); return;}
}
@@ -313,222 +319,222 @@ void pushNullFunction(stack *Stack)
// Put the default value token on the stack (in place of an argument when
// making a function call).
-#line 270 "runtime.in"
+#line 276 "./runtime.in"
void pushDefault(stack *Stack)
{
-#line 271 "runtime.in"
+#line 277 "./runtime.in"
{Stack->push(Default); return;}
}
// Test if the value on the stack is the default value token.
-#line 277 "runtime.in"
+#line 283 "./runtime.in"
void isDefault(stack *Stack)
{
item i=vm::pop(Stack);
-#line 278 "runtime.in"
+#line 284 "./runtime.in"
{Stack->push<bool>(isdefault(i)); return;}
}
// Casts
-#line 284 "runtime.in"
+#line 290 "./runtime.in"
void pairToGuide(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 285 "runtime.in"
+#line 291 "./runtime.in"
{Stack->push<guide*>(new pairguide(z)); return;}
}
-#line 290 "runtime.in"
+#line 296 "./runtime.in"
void pathToGuide(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 291 "runtime.in"
+#line 297 "./runtime.in"
{Stack->push<guide*>(new pathguide(p)); return;}
}
-#line 295 "runtime.in"
+#line 301 "./runtime.in"
void guideToPath(stack *Stack)
{
guide * g=vm::pop<guide *>(Stack);
-#line 296 "runtime.in"
+#line 302 "./runtime.in"
{Stack->push<path>(g->solve()); return;}
}
// Pen operations
-#line 302 "runtime.in"
+#line 308 "./runtime.in"
void newPen(stack *Stack)
{
-#line 303 "runtime.in"
+#line 309 "./runtime.in"
{Stack->push<pen>(pen()); return;}
}
-#line 308 "runtime.in"
+#line 314 "./runtime.in"
// bool ==(pen a, pen b);
void gen_runtime13(stack *Stack)
{
pen b=vm::pop<pen>(Stack);
pen a=vm::pop<pen>(Stack);
-#line 309 "runtime.in"
+#line 315 "./runtime.in"
{Stack->push<bool>(a == b); return;}
}
-#line 313 "runtime.in"
+#line 319 "./runtime.in"
// bool !=(pen a, pen b);
void gen_runtime14(stack *Stack)
{
pen b=vm::pop<pen>(Stack);
pen a=vm::pop<pen>(Stack);
-#line 314 "runtime.in"
+#line 320 "./runtime.in"
{Stack->push<bool>(a != b); return;}
}
-#line 318 "runtime.in"
+#line 324 "./runtime.in"
// pen +(pen a, pen b);
void gen_runtime15(stack *Stack)
{
pen b=vm::pop<pen>(Stack);
pen a=vm::pop<pen>(Stack);
-#line 319 "runtime.in"
+#line 325 "./runtime.in"
{Stack->push<pen>(a+b); return;}
}
-#line 323 "runtime.in"
+#line 329 "./runtime.in"
// pen *(real a, pen b);
void gen_runtime16(stack *Stack)
{
pen b=vm::pop<pen>(Stack);
real a=vm::pop<real>(Stack);
-#line 324 "runtime.in"
+#line 330 "./runtime.in"
{Stack->push<pen>(a*b); return;}
}
-#line 328 "runtime.in"
+#line 334 "./runtime.in"
// pen *(pen a, real b);
void gen_runtime17(stack *Stack)
{
real b=vm::pop<real>(Stack);
pen a=vm::pop<pen>(Stack);
-#line 329 "runtime.in"
+#line 335 "./runtime.in"
{Stack->push<pen>(b*a); return;}
}
-#line 333 "runtime.in"
+#line 339 "./runtime.in"
// pair max(pen p);
void gen_runtime18(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 334 "runtime.in"
+#line 340 "./runtime.in"
{Stack->push<pair>(p.bounds().Max()); return;}
}
-#line 338 "runtime.in"
+#line 344 "./runtime.in"
// pair min(pen p);
void gen_runtime19(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 339 "runtime.in"
+#line 345 "./runtime.in"
{Stack->push<pair>(p.bounds().Min()); return;}
}
// Reset the meaning of pen default attributes.
-#line 344 "runtime.in"
+#line 350 "./runtime.in"
// void resetdefaultpen();
void gen_runtime20(stack *)
{
-#line 345 "runtime.in"
+#line 351 "./runtime.in"
processData().defaultpen=camp::pen::initialpen();
}
-#line 349 "runtime.in"
+#line 355 "./runtime.in"
// void defaultpen(pen p);
void gen_runtime21(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 350 "runtime.in"
+#line 356 "./runtime.in"
processData().defaultpen=pen(resolvepen,p);
}
-#line 354 "runtime.in"
+#line 360 "./runtime.in"
// pen defaultpen();
void gen_runtime22(stack *Stack)
{
-#line 355 "runtime.in"
+#line 361 "./runtime.in"
{Stack->push<pen>(processData().defaultpen); return;}
}
-#line 359 "runtime.in"
+#line 365 "./runtime.in"
// bool invisible(pen p);
void gen_runtime23(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 360 "runtime.in"
+#line 366 "./runtime.in"
{Stack->push<bool>(p.invisible()); return;}
}
-#line 364 "runtime.in"
+#line 370 "./runtime.in"
// pen invisible();
void gen_runtime24(stack *Stack)
{
-#line 365 "runtime.in"
+#line 371 "./runtime.in"
{Stack->push<pen>(pen(invisiblepen)); return;}
}
-#line 369 "runtime.in"
+#line 375 "./runtime.in"
// pen gray(pen p);
void gen_runtime25(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 370 "runtime.in"
+#line 376 "./runtime.in"
p.togrey();
{Stack->push<pen>(p); return;}
}
-#line 375 "runtime.in"
+#line 381 "./runtime.in"
// pen rgb(pen p);
void gen_runtime26(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 376 "runtime.in"
+#line 382 "./runtime.in"
p.torgb();
{Stack->push<pen>(p); return;}
}
-#line 381 "runtime.in"
+#line 387 "./runtime.in"
// pen cmyk(pen p);
void gen_runtime27(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 382 "runtime.in"
+#line 388 "./runtime.in"
p.tocmyk();
{Stack->push<pen>(p); return;}
}
-#line 387 "runtime.in"
+#line 393 "./runtime.in"
// pen interp(pen a, pen b, real t);
void gen_runtime28(stack *Stack)
{
real t=vm::pop<real>(Stack);
pen b=vm::pop<pen>(Stack);
pen a=vm::pop<pen>(Stack);
-#line 388 "runtime.in"
+#line 394 "./runtime.in"
{Stack->push<pen>(interpolate(a,b,t)); return;}
}
-#line 392 "runtime.in"
+#line 398 "./runtime.in"
// pen rgb(real r, real g, real b);
void gen_runtime29(stack *Stack)
{
real b=vm::pop<real>(Stack);
real g=vm::pop<real>(Stack);
real r=vm::pop<real>(Stack);
-#line 393 "runtime.in"
+#line 399 "./runtime.in"
{Stack->push<pen>(pen(r,g,b)); return;}
}
-#line 397 "runtime.in"
+#line 403 "./runtime.in"
// pen cmyk(real c, real m, real y, real k);
void gen_runtime30(stack *Stack)
{
@@ -536,25 +542,25 @@ void gen_runtime30(stack *Stack)
real y=vm::pop<real>(Stack);
real m=vm::pop<real>(Stack);
real c=vm::pop<real>(Stack);
-#line 398 "runtime.in"
+#line 404 "./runtime.in"
{Stack->push<pen>(pen(c,m,y,k)); return;}
}
-#line 402 "runtime.in"
+#line 408 "./runtime.in"
// pen gray(real gray);
void gen_runtime31(stack *Stack)
{
real gray=vm::pop<real>(Stack);
-#line 403 "runtime.in"
+#line 409 "./runtime.in"
{Stack->push<pen>(pen(gray)); return;}
}
-#line 407 "runtime.in"
+#line 413 "./runtime.in"
// realarray* colors(pen p);
void gen_runtime32(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 408 "runtime.in"
+#line 414 "./runtime.in"
size_t n=ColorComponents[p.colorspace()];
array *a=new array(n);
@@ -581,87 +587,87 @@ void gen_runtime32(stack *Stack)
{Stack->push<realarray*>(a); return;}
}
-#line 435 "runtime.in"
+#line 441 "./runtime.in"
// string hex(pen p);
void gen_runtime33(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 436 "runtime.in"
+#line 442 "./runtime.in"
{Stack->push<string>(p.hex()); return;}
}
-#line 440 "runtime.in"
+#line 446 "./runtime.in"
// Int byte(real x);
void gen_runtime34(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 441 "runtime.in"
+#line 447 "./runtime.in"
{Stack->push<Int>(camp::byte(x)); return;}
}
-#line 445 "runtime.in"
+#line 451 "./runtime.in"
// real byteinv(Int x);
void gen_runtime35(stack *Stack)
{
Int x=vm::pop<Int>(Stack);
-#line 446 "runtime.in"
+#line 452 "./runtime.in"
{Stack->push<real>(x >= 0 ? camp::byteinv(x) : 0.0); return;}
}
-#line 450 "runtime.in"
+#line 456 "./runtime.in"
// string colorspace(pen p);
void gen_runtime36(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 451 "runtime.in"
+#line 457 "./runtime.in"
string s=ColorDeviceSuffix[p.colorspace()];
std::transform(s.begin(),s.end(),s.begin(),tolower);
{Stack->push<string>(s); return;}
}
-#line 457 "runtime.in"
+#line 463 "./runtime.in"
// pen pattern(string *s);
void gen_runtime37(stack *Stack)
{
string * s=vm::pop<string *>(Stack);
-#line 458 "runtime.in"
+#line 464 "./runtime.in"
{Stack->push<pen>(pen(setpattern,*s)); return;}
}
-#line 462 "runtime.in"
+#line 468 "./runtime.in"
// string pattern(pen p);
void gen_runtime38(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 463 "runtime.in"
+#line 469 "./runtime.in"
{Stack->push<string>(p.fillpattern()); return;}
}
-#line 467 "runtime.in"
+#line 473 "./runtime.in"
// pen fillrule(Int n);
void gen_runtime39(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 468 "runtime.in"
+#line 474 "./runtime.in"
{Stack->push<pen>(pen(n >= 0 && n < nFill ? (FillRule) n : DEFFILL)); return;}
}
-#line 472 "runtime.in"
+#line 478 "./runtime.in"
// Int fillrule(pen p);
void gen_runtime40(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 473 "runtime.in"
+#line 479 "./runtime.in"
{Stack->push<Int>(p.Fillrule()); return;}
}
-#line 477 "runtime.in"
+#line 483 "./runtime.in"
// pen opacity(real opacity=1.0, string blend=defaulttransparency);
void gen_runtime41(stack *Stack)
{
string blend=vm::pop<string>(Stack,defaulttransparency);
real opacity=vm::pop<real>(Stack,1.0);
-#line 478 "runtime.in"
+#line 484 "./runtime.in"
for(Int i=0; i < nBlendMode; ++i)
if(blend == BlendMode[i]) {Stack->push<pen>(pen(Transparency(blend,opacity))); return;}
@@ -670,25 +676,25 @@ void gen_runtime41(stack *Stack)
error(buf);
}
-#line 487 "runtime.in"
+#line 493 "./runtime.in"
// real opacity(pen p);
void gen_runtime42(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 488 "runtime.in"
+#line 494 "./runtime.in"
{Stack->push<real>(p.opacity()); return;}
}
-#line 492 "runtime.in"
+#line 498 "./runtime.in"
// string blend(pen p);
void gen_runtime43(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 493 "runtime.in"
+#line 499 "./runtime.in"
{Stack->push<string>(p.blend()); return;}
}
-#line 497 "runtime.in"
+#line 503 "./runtime.in"
// pen linetype(realarray *pattern, real offset=0, bool scale=true, bool adjust=true);
void gen_runtime44(stack *Stack)
{
@@ -696,7 +702,7 @@ void gen_runtime44(stack *Stack)
bool scale=vm::pop<bool>(Stack,true);
real offset=vm::pop<real>(Stack,0);
realarray * pattern=vm::pop<realarray *>(Stack);
-#line 499 "runtime.in"
+#line 505 "./runtime.in"
size_t size=checkArray(pattern);
array *a=new array(size);
for(size_t i=0; i < size; ++i)
@@ -705,272 +711,272 @@ void gen_runtime44(stack *Stack)
{Stack->push<pen>(pen(LineType(*a,offset,scale,adjust))); return;}
}
-#line 508 "runtime.in"
+#line 514 "./runtime.in"
// realarray* linetype(pen p=CURRENTPEN);
void gen_runtime45(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 509 "runtime.in"
+#line 515 "./runtime.in"
array a=p.linetype()->pattern;
{Stack->push<realarray*>(copyArray(&a)); return;}
}
-#line 514 "runtime.in"
+#line 520 "./runtime.in"
// real offset(pen p);
void gen_runtime46(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 515 "runtime.in"
+#line 521 "./runtime.in"
{Stack->push<real>(p.linetype()->offset); return;}
}
-#line 519 "runtime.in"
+#line 525 "./runtime.in"
// bool scale(pen p);
void gen_runtime47(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 520 "runtime.in"
+#line 526 "./runtime.in"
{Stack->push<bool>(p.linetype()->scale); return;}
}
-#line 524 "runtime.in"
+#line 530 "./runtime.in"
// bool adjust(pen p);
void gen_runtime48(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 525 "runtime.in"
+#line 531 "./runtime.in"
{Stack->push<bool>(p.linetype()->adjust); return;}
}
-#line 529 "runtime.in"
+#line 535 "./runtime.in"
// pen adjust(pen p, real arclength, bool cyclic);
void gen_runtime49(stack *Stack)
{
bool cyclic=vm::pop<bool>(Stack);
real arclength=vm::pop<real>(Stack);
pen p=vm::pop<pen>(Stack);
-#line 530 "runtime.in"
+#line 536 "./runtime.in"
{Stack->push<pen>(adjustdash(p,arclength,cyclic)); return;}
}
-#line 534 "runtime.in"
+#line 540 "./runtime.in"
// pen linecap(Int n);
void gen_runtime50(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 535 "runtime.in"
+#line 541 "./runtime.in"
{Stack->push<pen>(pen(setlinecap,n >= 0 && n < nCap ? n : DEFCAP)); return;}
}
-#line 539 "runtime.in"
+#line 545 "./runtime.in"
// Int linecap(pen p=CURRENTPEN);
void gen_runtime51(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 540 "runtime.in"
+#line 546 "./runtime.in"
{Stack->push<Int>(p.cap()); return;}
}
-#line 544 "runtime.in"
+#line 550 "./runtime.in"
// pen linejoin(Int n);
void gen_runtime52(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 545 "runtime.in"
+#line 551 "./runtime.in"
{Stack->push<pen>(pen(setlinejoin,n >= 0 && n < nJoin ? n : DEFJOIN)); return;}
}
-#line 549 "runtime.in"
+#line 555 "./runtime.in"
// Int linejoin(pen p=CURRENTPEN);
void gen_runtime53(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 550 "runtime.in"
+#line 556 "./runtime.in"
{Stack->push<Int>(p.join()); return;}
}
-#line 554 "runtime.in"
+#line 560 "./runtime.in"
// pen miterlimit(real x);
void gen_runtime54(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 555 "runtime.in"
+#line 561 "./runtime.in"
{Stack->push<pen>(pen(setmiterlimit,x >= 1.0 ? x : DEFJOIN)); return;}
}
-#line 559 "runtime.in"
+#line 565 "./runtime.in"
// real miterlimit(pen p=CURRENTPEN);
void gen_runtime55(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 560 "runtime.in"
+#line 566 "./runtime.in"
{Stack->push<real>(p.miter()); return;}
}
-#line 564 "runtime.in"
+#line 570 "./runtime.in"
// pen linewidth(real x);
void gen_runtime56(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 565 "runtime.in"
+#line 571 "./runtime.in"
{Stack->push<pen>(pen(setlinewidth,x >= 0.0 ? x : DEFWIDTH)); return;}
}
-#line 569 "runtime.in"
+#line 575 "./runtime.in"
// real linewidth(pen p=CURRENTPEN);
void gen_runtime57(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 570 "runtime.in"
+#line 576 "./runtime.in"
{Stack->push<real>(p.width()); return;}
}
-#line 574 "runtime.in"
+#line 580 "./runtime.in"
// pen fontcommand(string *s);
void gen_runtime58(stack *Stack)
{
string * s=vm::pop<string *>(Stack);
-#line 575 "runtime.in"
+#line 581 "./runtime.in"
{Stack->push<pen>(pen(setfont,*s)); return;}
}
-#line 579 "runtime.in"
+#line 585 "./runtime.in"
// string font(pen p=CURRENTPEN);
void gen_runtime59(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 580 "runtime.in"
+#line 586 "./runtime.in"
{Stack->push<string>(p.Font()); return;}
}
-#line 584 "runtime.in"
+#line 590 "./runtime.in"
// pen fontsize(real size, real lineskip);
void gen_runtime60(stack *Stack)
{
real lineskip=vm::pop<real>(Stack);
real size=vm::pop<real>(Stack);
-#line 585 "runtime.in"
+#line 591 "./runtime.in"
{Stack->push<pen>(pen(setfontsize,size > 0.0 ? size : 0.0,
lineskip > 0.0 ? lineskip : 0.0)); return;}
}
-#line 590 "runtime.in"
+#line 596 "./runtime.in"
// real fontsize(pen p=CURRENTPEN);
void gen_runtime61(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 591 "runtime.in"
+#line 597 "./runtime.in"
{Stack->push<real>(p.size()); return;}
}
-#line 595 "runtime.in"
+#line 601 "./runtime.in"
// real lineskip(pen p=CURRENTPEN);
void gen_runtime62(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 596 "runtime.in"
+#line 602 "./runtime.in"
{Stack->push<real>(p.Lineskip()); return;}
}
-#line 600 "runtime.in"
+#line 606 "./runtime.in"
// pen overwrite(Int n);
void gen_runtime63(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 601 "runtime.in"
+#line 607 "./runtime.in"
{Stack->push<pen>(pen(setoverwrite,n >= 0 && n < nOverwrite ? (overwrite_t) n :
DEFWRITE)); return;}
}
-#line 606 "runtime.in"
+#line 612 "./runtime.in"
// Int overwrite(pen p=CURRENTPEN);
void gen_runtime64(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 607 "runtime.in"
+#line 613 "./runtime.in"
{Stack->push<Int>(p.Overwrite()); return;}
}
-#line 611 "runtime.in"
+#line 617 "./runtime.in"
// pen basealign(Int n);
void gen_runtime65(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 612 "runtime.in"
+#line 618 "./runtime.in"
{Stack->push<pen>(pen(n >= 0 && n < nBaseLine ? (BaseLine) n : DEFBASE)); return;}
}
-#line 616 "runtime.in"
+#line 622 "./runtime.in"
// Int basealign(pen p=CURRENTPEN);
void gen_runtime66(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 617 "runtime.in"
+#line 623 "./runtime.in"
{Stack->push<Int>(p.Baseline()); return;}
}
-#line 621 "runtime.in"
+#line 627 "./runtime.in"
// transform transform(pen p);
void gen_runtime67(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 622 "runtime.in"
+#line 628 "./runtime.in"
{Stack->push<transform>(p.getTransform()); return;}
}
-#line 626 "runtime.in"
+#line 632 "./runtime.in"
// path nib(pen p);
void gen_runtime68(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 627 "runtime.in"
+#line 633 "./runtime.in"
{Stack->push<path>(p.Path()); return;}
}
-#line 631 "runtime.in"
+#line 637 "./runtime.in"
// pen makepen(path p);
void gen_runtime69(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 632 "runtime.in"
+#line 638 "./runtime.in"
{Stack->push<pen>(pen(p)); return;}
}
-#line 636 "runtime.in"
+#line 642 "./runtime.in"
// pen colorless(pen p);
void gen_runtime70(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 637 "runtime.in"
+#line 643 "./runtime.in"
p.colorless();
{Stack->push<pen>(p); return;}
}
// Interactive mode
-#line 643 "runtime.in"
+#line 649 "./runtime.in"
// bool interactive();
void gen_runtime71(stack *Stack)
{
-#line 644 "runtime.in"
+#line 650 "./runtime.in"
{Stack->push<bool>(interact::interactive); return;}
}
-#line 649 "runtime.in"
+#line 655 "./runtime.in"
// bool uptodate();
void gen_runtime72(stack *Stack)
{
-#line 650 "runtime.in"
+#line 656 "./runtime.in"
{Stack->push<bool>(interact::uptodate); return;}
}
// System commands
-#line 656 "runtime.in"
+#line 662 "./runtime.in"
// Int system(stringarray *s);
void gen_runtime73(stack *Stack)
{
stringarray * s=vm::pop<stringarray *>(Stack);
-#line 657 "runtime.in"
+#line 663 "./runtime.in"
if(safe) error("system() call disabled; override with option -nosafe");
size_t size=checkArray(s);
if(size == 0) {Stack->push<Int>(0); return;}
@@ -980,57 +986,57 @@ void gen_runtime73(stack *Stack)
{Stack->push<Int>(System(cmd)); return;}
}
-#line 668 "runtime.in"
+#line 674 "./runtime.in"
// bool view();
void gen_runtime74(stack *Stack)
{
-#line 669 "runtime.in"
+#line 675 "./runtime.in"
{Stack->push<bool>(view()); return;}
}
-#line 673 "runtime.in"
+#line 679 "./runtime.in"
// string asydir();
void gen_runtime75(stack *Stack)
{
-#line 674 "runtime.in"
+#line 680 "./runtime.in"
{Stack->push<string>(systemDir); return;}
}
-#line 678 "runtime.in"
+#line 684 "./runtime.in"
// string locale(string s=emptystring);
void gen_runtime76(stack *Stack)
{
string s=vm::pop<string>(Stack,emptystring);
-#line 679 "runtime.in"
+#line 685 "./runtime.in"
char *L=setlocale(LC_ALL,s.empty() ? NULL : s.c_str());
{Stack->push<string>(L != NULL ? string(L) : ""); return;}
}
-#line 684 "runtime.in"
+#line 690 "./runtime.in"
// void abort(string s=emptystring);
void gen_runtime77(stack *Stack)
{
string s=vm::pop<string>(Stack,emptystring);
-#line 685 "runtime.in"
+#line 691 "./runtime.in"
if(s.empty()) throw handled_error();
error(s.c_str());
}
-#line 690 "runtime.in"
+#line 696 "./runtime.in"
// void exit();
void gen_runtime78(stack *)
{
-#line 691 "runtime.in"
+#line 697 "./runtime.in"
throw quit();
}
-#line 695 "runtime.in"
+#line 701 "./runtime.in"
// void assert(bool b, string s=emptystring);
void gen_runtime79(stack *Stack)
{
string s=vm::pop<string>(Stack,emptystring);
bool b=vm::pop<bool>(Stack);
-#line 696 "runtime.in"
+#line 702 "./runtime.in"
flush(cout);
if(!b) {
ostringstream buf;
@@ -1040,34 +1046,34 @@ void gen_runtime79(stack *Stack)
}
}
-#line 706 "runtime.in"
+#line 712 "./runtime.in"
// void sleep(Int seconds);
void gen_runtime80(stack *Stack)
{
Int seconds=vm::pop<Int>(Stack);
-#line 707 "runtime.in"
+#line 713 "./runtime.in"
if(seconds <= 0) return;
- sleep(seconds);
+ std::this_thread::sleep_for(std::chrono::seconds(seconds));
}
-#line 712 "runtime.in"
+#line 718 "./runtime.in"
// void usleep(Int microseconds);
void gen_runtime81(stack *Stack)
{
Int microseconds=vm::pop<Int>(Stack);
-#line 713 "runtime.in"
+#line 719 "./runtime.in"
if(microseconds <= 0) return;
- usleep((unsigned long) microseconds);
+ std::this_thread::sleep_for(std::chrono::microseconds(microseconds));
}
-#line 718 "runtime.in"
+#line 724 "./runtime.in"
// void _eval(string *s, bool embedded, bool interactiveWrite=false);
void gen_runtime82(stack *Stack)
{
bool interactiveWrite=vm::pop<bool>(Stack,false);
bool embedded=vm::pop<bool>(Stack);
string * s=vm::pop<string *>(Stack);
-#line 719 "runtime.in"
+#line 725 "./runtime.in"
if(embedded) {
trans::coenv *e=Stack->getEnvironment();
vm::interactiveStack *is=dynamic_cast<vm::interactiveStack *>(Stack);
@@ -1079,13 +1085,13 @@ void gen_runtime82(stack *Stack)
runString(*s,interactiveWrite);
}
-#line 731 "runtime.in"
+#line 737 "./runtime.in"
// void _eval(runnable *s, bool embedded);
void gen_runtime83(stack *Stack)
{
bool embedded=vm::pop<bool>(Stack);
runnable * s=vm::pop<runnable *>(Stack);
-#line 732 "runtime.in"
+#line 738 "./runtime.in"
absyntax::block *ast=new absyntax::block(s->getPos(), false);
ast->add(s);
@@ -1100,51 +1106,52 @@ void gen_runtime83(stack *Stack)
runCode(ast);
}
-#line 747 "runtime.in"
+#line 753 "./runtime.in"
// string xasyKEY();
void gen_runtime84(stack *Stack)
{
-#line 748 "runtime.in"
+#line 754 "./runtime.in"
processDataStruct& P=processData();
xkey_t& xkey=P.xkey;
xkey_t::iterator p=xkey.find(P.topPos.LineColumn());
{Stack->push<string>(p != xkey.end() ? p->second+" 1" : toplocation()+" 0"); return;}
}
-#line 754 "runtime.in"
+#line 760 "./runtime.in"
// void xasyKEY(string *s);
void gen_runtime85(stack *Stack)
{
string * s=vm::pop<string *>(Stack);
-#line 755 "runtime.in"
+#line 761 "./runtime.in"
processData().KEY=*s;
}
-#line 758 "runtime.in"
+#line 764 "./runtime.in"
// string location();
void gen_runtime86(stack *Stack)
{
-#line 759 "runtime.in"
+#line 765 "./runtime.in"
ostringstream buf;
buf << getPos();
{Stack->push<string>(buf.str()); return;}
}
-// Wrapper for the stack::load() method.
-#line 765 "runtime.in"
+// Wrapper for the stack::loadModule() method.
+#line 771 "./runtime.in"
void loadModule(stack *Stack)
{
+ Int numPushedParents=vm::pop<Int>(Stack);
string * index=vm::pop<string *>(Stack);
-#line 766 "runtime.in"
- Stack->load(*index);
+#line 772 "./runtime.in"
+ Stack->loadModule(*index, numPushedParents);
}
-#line 770 "runtime.in"
+#line 776 "./runtime.in"
// string cd(string s=emptystring);
void gen_runtime88(stack *Stack)
{
string s=vm::pop<string>(Stack,emptystring);
-#line 771 "runtime.in"
+#line 777 "./runtime.in"
if(!globalread()) readDisabled();
if(!s.empty() && !globalwrite()) {
string outname=settings::outname();
@@ -1154,13 +1161,13 @@ void gen_runtime88(stack *Stack)
{Stack->push<string>(setPath(s.c_str())); return;}
}
-#line 781 "runtime.in"
+#line 787 "./runtime.in"
// void list(string *s, bool imports=false);
void gen_runtime89(stack *Stack)
{
bool imports=vm::pop<bool>(Stack,false);
string * s=vm::pop<string *>(Stack);
-#line 782 "runtime.in"
+#line 788 "./runtime.in"
if(*s == "-") return;
trans::genv ge;
symbol name=symbol::trans(*s);
@@ -1170,18 +1177,18 @@ void gen_runtime89(stack *Stack)
// Guide operations
-#line 792 "runtime.in"
+#line 798 "./runtime.in"
void nullGuide(stack *Stack)
{
-#line 793 "runtime.in"
+#line 799 "./runtime.in"
{Stack->push<guide*>(new pathguide(path())); return;}
}
-#line 798 "runtime.in"
+#line 804 "./runtime.in"
void dotsGuide(stack *Stack)
{
guidearray * a=vm::pop<guidearray *>(Stack);
-#line 799 "runtime.in"
+#line 805 "./runtime.in"
guidevector v;
size_t size=checkArray(a);
for (size_t i=0; i < size; ++i)
@@ -1190,11 +1197,11 @@ void dotsGuide(stack *Stack)
{Stack->push<guide*>(new multiguide(v)); return;}
}
-#line 808 "runtime.in"
+#line 814 "./runtime.in"
void dashesGuide(stack *Stack)
{
guidearray * a=vm::pop<guidearray *>(Stack);
-#line 809 "runtime.in"
+#line 815 "./runtime.in"
static camp::curlSpec curly;
static camp::specguide curlout(&curly, camp::OUT);
static camp::specguide curlin(&curly, camp::IN);
@@ -1220,179 +1227,179 @@ void dashesGuide(stack *Stack)
{Stack->push<guide*>(new multiguide(v)); return;}
}
-#line 835 "runtime.in"
+#line 841 "./runtime.in"
void newCycleToken(stack *Stack)
{
-#line 836 "runtime.in"
+#line 842 "./runtime.in"
{Stack->push<cycleToken>(cycleToken()); return;}
}
-#line 840 "runtime.in"
+#line 846 "./runtime.in"
// guide* operator cast(cycleToken tok);
void gen_runtime94(stack *Stack)
{
cycleToken tok=vm::pop<cycleToken>(Stack);
-#line 841 "runtime.in"
+#line 847 "./runtime.in"
// Avoid unused variable warning messages.
unused(&tok);
{Stack->push<guide*>(new cycletokguide()); return;}
}
-#line 847 "runtime.in"
+#line 853 "./runtime.in"
// guide* operator spec(pair z, Int p);
void gen_runtime95(stack *Stack)
{
Int p=vm::pop<Int>(Stack);
pair z=vm::pop<pair>(Stack);
-#line 848 "runtime.in"
+#line 854 "./runtime.in"
camp::side d=(camp::side) p;
camp::dirSpec *sp=new camp::dirSpec(z);
{Stack->push<guide*>(new specguide(sp,d)); return;}
}
-#line 855 "runtime.in"
+#line 861 "./runtime.in"
// curlSpecifier operator curl(real gamma, Int p);
void gen_runtime96(stack *Stack)
{
Int p=vm::pop<Int>(Stack);
real gamma=vm::pop<real>(Stack);
-#line 856 "runtime.in"
+#line 862 "./runtime.in"
camp::side s=(camp::side) p;
{Stack->push<curlSpecifier>(curlSpecifier(gamma,s)); return;}
}
-#line 861 "runtime.in"
+#line 867 "./runtime.in"
void curlSpecifierValuePart(stack *Stack)
{
curlSpecifier spec=vm::pop<curlSpecifier>(Stack);
-#line 862 "runtime.in"
+#line 868 "./runtime.in"
{Stack->push<real>(spec.getValue()); return;}
}
-#line 866 "runtime.in"
+#line 872 "./runtime.in"
void curlSpecifierSidePart(stack *Stack)
{
curlSpecifier spec=vm::pop<curlSpecifier>(Stack);
-#line 867 "runtime.in"
+#line 873 "./runtime.in"
{Stack->push<Int>(spec.getSide()); return;}
}
-#line 871 "runtime.in"
+#line 877 "./runtime.in"
// guide* operator cast(curlSpecifier spec);
void gen_runtime99(stack *Stack)
{
curlSpecifier spec=vm::pop<curlSpecifier>(Stack);
-#line 872 "runtime.in"
+#line 878 "./runtime.in"
{Stack->push<guide*>(new specguide(spec)); return;}
}
-#line 876 "runtime.in"
+#line 882 "./runtime.in"
// tensionSpecifier operator tension(real tout, real tin, bool atleast);
void gen_runtime100(stack *Stack)
{
bool atleast=vm::pop<bool>(Stack);
real tin=vm::pop<real>(Stack);
real tout=vm::pop<real>(Stack);
-#line 877 "runtime.in"
+#line 883 "./runtime.in"
{Stack->push<tensionSpecifier>(tensionSpecifier(tout, tin, atleast)); return;}
}
-#line 881 "runtime.in"
+#line 887 "./runtime.in"
void tensionSpecifierOutPart(stack *Stack)
{
tensionSpecifier t=vm::pop<tensionSpecifier>(Stack);
-#line 882 "runtime.in"
+#line 888 "./runtime.in"
{Stack->push<real>(t.getOut()); return;}
}
-#line 886 "runtime.in"
+#line 892 "./runtime.in"
void tensionSpecifierInPart(stack *Stack)
{
tensionSpecifier t=vm::pop<tensionSpecifier>(Stack);
-#line 887 "runtime.in"
+#line 893 "./runtime.in"
{Stack->push<real>(t.getIn()); return;}
}
-#line 891 "runtime.in"
+#line 897 "./runtime.in"
void tensionSpecifierAtleastPart(stack *Stack)
{
tensionSpecifier t=vm::pop<tensionSpecifier>(Stack);
-#line 892 "runtime.in"
+#line 898 "./runtime.in"
{Stack->push<bool>(t.getAtleast()); return;}
}
-#line 896 "runtime.in"
+#line 902 "./runtime.in"
// guide* operator cast(tensionSpecifier t);
void gen_runtime104(stack *Stack)
{
tensionSpecifier t=vm::pop<tensionSpecifier>(Stack);
-#line 897 "runtime.in"
+#line 903 "./runtime.in"
{Stack->push<guide*>(new tensionguide(t)); return;}
}
-#line 901 "runtime.in"
+#line 907 "./runtime.in"
// guide* operator controls(pair zout, pair zin);
void gen_runtime105(stack *Stack)
{
pair zin=vm::pop<pair>(Stack);
pair zout=vm::pop<pair>(Stack);
-#line 902 "runtime.in"
+#line 908 "./runtime.in"
{Stack->push<guide*>(new controlguide(zout, zin)); return;}
}
-#line 906 "runtime.in"
+#line 912 "./runtime.in"
// Int size(guide *g);
void gen_runtime106(stack *Stack)
{
guide * g=vm::pop<guide *>(Stack);
-#line 907 "runtime.in"
+#line 913 "./runtime.in"
flatguide f;
g->flatten(f,false);
{Stack->push<Int>(f.size()); return;}
}
-#line 913 "runtime.in"
+#line 919 "./runtime.in"
// Int length(guide *g);
void gen_runtime107(stack *Stack)
{
guide * g=vm::pop<guide *>(Stack);
-#line 914 "runtime.in"
+#line 920 "./runtime.in"
flatguide f;
g->flatten(f,false);
{Stack->push<Int>(g->cyclic() ? f.size() : f.size()-1); return;}
}
-#line 920 "runtime.in"
+#line 926 "./runtime.in"
// bool cyclic(guide *g);
void gen_runtime108(stack *Stack)
{
guide * g=vm::pop<guide *>(Stack);
-#line 921 "runtime.in"
+#line 927 "./runtime.in"
flatguide f;
g->flatten(f,false);
{Stack->push<bool>(g->cyclic()); return;}
}
-#line 927 "runtime.in"
+#line 933 "./runtime.in"
// pair point(guide *g, Int t);
void gen_runtime109(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
guide * g=vm::pop<guide *>(Stack);
-#line 928 "runtime.in"
+#line 934 "./runtime.in"
flatguide f;
g->flatten(f,false);
{Stack->push<pair>(f.Nodes(adjustedIndex(t,f.size(),g->cyclic())).z); return;}
}
-#line 934 "runtime.in"
+#line 940 "./runtime.in"
// pairarray* dirSpecifier(guide *g, Int t);
void gen_runtime110(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
guide * g=vm::pop<guide *>(Stack);
-#line 935 "runtime.in"
+#line 941 "./runtime.in"
flatguide f;
g->flatten(f,false);
Int n=f.size();
@@ -1403,13 +1410,13 @@ void gen_runtime110(stack *Stack)
{Stack->push<pairarray*>(c); return;}
}
-#line 946 "runtime.in"
+#line 952 "./runtime.in"
// pairarray* controlSpecifier(guide *g, Int t);
void gen_runtime111(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
guide * g=vm::pop<guide *>(Stack);
-#line 947 "runtime.in"
+#line 953 "./runtime.in"
flatguide f;
g->flatten(f,false);
Int n=f.size();
@@ -1425,13 +1432,13 @@ void gen_runtime111(stack *Stack)
} else {Stack->push<pairarray*>(new array(0)); return;}
}
-#line 963 "runtime.in"
+#line 969 "./runtime.in"
// tensionSpecifier tensionSpecifier(guide *g, Int t);
void gen_runtime112(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
guide * g=vm::pop<guide *>(Stack);
-#line 964 "runtime.in"
+#line 970 "./runtime.in"
flatguide f;
g->flatten(f,false);
Int n=f.size();
@@ -1440,13 +1447,13 @@ void gen_runtime112(stack *Stack)
{Stack->push<tensionSpecifier>(tensionSpecifier(curr.tout.val,f.Nodes(t+1).tin.val,curr.tout.atleast)); return;}
}
-#line 973 "runtime.in"
+#line 979 "./runtime.in"
// realarray* curlSpecifier(guide *g, Int t);
void gen_runtime113(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
guide * g=vm::pop<guide *>(Stack);
-#line 974 "runtime.in"
+#line 980 "./runtime.in"
flatguide f;
g->flatten(f,false);
Int n=f.size();
@@ -1459,12 +1466,12 @@ void gen_runtime113(stack *Stack)
{Stack->push<realarray*>(c); return;}
}
-#line 987 "runtime.in"
+#line 993 "./runtime.in"
// guide* reverse(guide *g);
void gen_runtime114(stack *Stack)
{
guide * g=vm::pop<guide *>(Stack);
-#line 988 "runtime.in"
+#line 994 "./runtime.in"
flatguide f;
g->flatten(f,false);
if(f.precyclic())
@@ -1515,123 +1522,133 @@ void gen_runtime114(stack *Stack)
{Stack->push<guide*>(new multiguide(v)); return;}
}
-#line 1040 "runtime.in"
+#line 1046 "./runtime.in"
// realarray* _cputime();
void gen_runtime115(stack *Stack)
{
-#line 1041 "runtime.in"
+#line 1047 "./runtime.in"
+#if !defined(_WIN32)
static const real ticktime=1.0/sysconf(_SC_CLK_TCK);
struct tms buf;
-
::times(&buf);
+
+ real realCutime=((real)buf.tms_cutime)*ticktime;
+ real realCstime=((real)buf.tms_cstime)*ticktime;
+#else
+ // FIXME: See if there's a way to get cutime/cstime on windows,
+ // if it's possible.
+ real realCutime=0.0;
+ real realCstime=0.0;
+#endif
+
array *t=new array(5);
(*t)[0]=cpuTime.seconds(); // Includes system time
(*t)[1]=0.0;
- (*t)[2]=((real) buf.tms_cutime)*ticktime;
- (*t)[3]=((real) buf.tms_cstime)*ticktime;
+ (*t)[2]=realCutime;
+ (*t)[3]=realCstime;
(*t)[4]=wallClock.seconds();
{Stack->push<realarray*>(t); return;}
}
// Transforms
-#line 1057 "runtime.in"
+#line 1073 "./runtime.in"
// bool ==(transform a, transform b);
void gen_runtime116(stack *Stack)
{
transform b=vm::pop<transform>(Stack);
transform a=vm::pop<transform>(Stack);
-#line 1058 "runtime.in"
+#line 1074 "./runtime.in"
{Stack->push<bool>(a == b); return;}
}
-#line 1063 "runtime.in"
+#line 1079 "./runtime.in"
// bool !=(transform a, transform b);
void gen_runtime117(stack *Stack)
{
transform b=vm::pop<transform>(Stack);
transform a=vm::pop<transform>(Stack);
-#line 1064 "runtime.in"
+#line 1080 "./runtime.in"
{Stack->push<bool>(a != b); return;}
}
-#line 1068 "runtime.in"
+#line 1084 "./runtime.in"
// transform +(transform a, transform b);
void gen_runtime118(stack *Stack)
{
transform b=vm::pop<transform>(Stack);
transform a=vm::pop<transform>(Stack);
-#line 1069 "runtime.in"
+#line 1085 "./runtime.in"
{Stack->push<transform>(a+b); return;}
}
-#line 1073 "runtime.in"
+#line 1089 "./runtime.in"
// transform *(transform a, transform b);
void gen_runtime119(stack *Stack)
{
transform b=vm::pop<transform>(Stack);
transform a=vm::pop<transform>(Stack);
-#line 1074 "runtime.in"
+#line 1090 "./runtime.in"
{Stack->push<transform>(a*b); return;}
}
-#line 1078 "runtime.in"
+#line 1094 "./runtime.in"
// pair *(transform t, pair z);
void gen_runtime120(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 1079 "runtime.in"
+#line 1095 "./runtime.in"
{Stack->push<pair>(t*z); return;}
}
-#line 1083 "runtime.in"
+#line 1099 "./runtime.in"
// path *(transform t, path g);
void gen_runtime121(stack *Stack)
{
path g=vm::pop<path>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 1084 "runtime.in"
+#line 1100 "./runtime.in"
{Stack->push<path>(transformed(t,g)); return;}
}
-#line 1088 "runtime.in"
+#line 1104 "./runtime.in"
// pen *(transform t, pen p);
void gen_runtime122(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 1089 "runtime.in"
+#line 1105 "./runtime.in"
{Stack->push<pen>(transformed(t,p)); return;}
}
-#line 1093 "runtime.in"
+#line 1109 "./runtime.in"
// picture* *(transform t, picture *f);
void gen_runtime123(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 1094 "runtime.in"
+#line 1110 "./runtime.in"
{Stack->push<picture*>(transformed(t,f)); return;}
}
-#line 1098 "runtime.in"
+#line 1114 "./runtime.in"
// picture* *(realarray2 *t, picture *f);
void gen_runtime124(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
realarray2 * t=vm::pop<realarray2 *>(Stack);
-#line 1099 "runtime.in"
+#line 1115 "./runtime.in"
{Stack->push<picture*>(transformed(*t,f)); return;}
}
-#line 1103 "runtime.in"
+#line 1119 "./runtime.in"
// transform ^(transform t, Int n);
void gen_runtime125(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 1104 "runtime.in"
+#line 1120 "./runtime.in"
transform T;
if(n < 0) {
n=-n;
@@ -1641,55 +1658,55 @@ void gen_runtime125(stack *Stack)
{Stack->push<transform>(T); return;}
}
-#line 1114 "runtime.in"
+#line 1130 "./runtime.in"
void transformXPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1115 "runtime.in"
+#line 1131 "./runtime.in"
{Stack->push<real>(t.getx()); return;}
}
-#line 1119 "runtime.in"
+#line 1135 "./runtime.in"
void transformYPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1120 "runtime.in"
+#line 1136 "./runtime.in"
{Stack->push<real>(t.gety()); return;}
}
-#line 1124 "runtime.in"
+#line 1140 "./runtime.in"
void transformXXPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1125 "runtime.in"
+#line 1141 "./runtime.in"
{Stack->push<real>(t.getxx()); return;}
}
-#line 1129 "runtime.in"
+#line 1145 "./runtime.in"
void transformXYPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1130 "runtime.in"
+#line 1146 "./runtime.in"
{Stack->push<real>(t.getxy()); return;}
}
-#line 1134 "runtime.in"
+#line 1150 "./runtime.in"
void transformYXPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1135 "runtime.in"
+#line 1151 "./runtime.in"
{Stack->push<real>(t.getyx()); return;}
}
-#line 1139 "runtime.in"
+#line 1155 "./runtime.in"
void transformYYPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1140 "runtime.in"
+#line 1156 "./runtime.in"
{Stack->push<real>(t.getyy()); return;}
}
-#line 1144 "runtime.in"
+#line 1160 "./runtime.in"
void real6ToTransform(stack *Stack)
{
real yy=vm::pop<real>(Stack);
@@ -1698,140 +1715,140 @@ void real6ToTransform(stack *Stack)
real xx=vm::pop<real>(Stack);
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 1146 "runtime.in"
+#line 1162 "./runtime.in"
{Stack->push<transform>(transform(x,y,xx,xy,yx,yy)); return;}
}
-#line 1150 "runtime.in"
+#line 1166 "./runtime.in"
// transform shift(transform t);
void gen_runtime133(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1151 "runtime.in"
+#line 1167 "./runtime.in"
{Stack->push<transform>(transform(t.getx(),t.gety(),0,0,0,0)); return;}
}
-#line 1155 "runtime.in"
+#line 1171 "./runtime.in"
// transform shiftless(transform t);
void gen_runtime134(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1156 "runtime.in"
+#line 1172 "./runtime.in"
{Stack->push<transform>(transform(0,0,t.getxx(),t.getxy(),t.getyx(),t.getyy())); return;}
}
-#line 1160 "runtime.in"
+#line 1176 "./runtime.in"
// transform identity();
void transformIdentity(stack *Stack)
{
-#line 1161 "runtime.in"
+#line 1177 "./runtime.in"
{Stack->push<transform>(identity); return;}
}
-#line 1165 "runtime.in"
+#line 1181 "./runtime.in"
// transform inverse(transform t);
void gen_runtime136(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1166 "runtime.in"
+#line 1182 "./runtime.in"
{Stack->push<transform>(inverse(t)); return;}
}
-#line 1170 "runtime.in"
+#line 1186 "./runtime.in"
// transform shift(pair z);
void gen_runtime137(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 1171 "runtime.in"
+#line 1187 "./runtime.in"
{Stack->push<transform>(shift(z)); return;}
}
-#line 1175 "runtime.in"
+#line 1191 "./runtime.in"
// transform shift(real x, real y);
void gen_runtime138(stack *Stack)
{
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 1176 "runtime.in"
+#line 1192 "./runtime.in"
{Stack->push<transform>(shift(pair(x,y))); return;}
}
-#line 1180 "runtime.in"
+#line 1196 "./runtime.in"
// transform xscale(real x);
void gen_runtime139(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 1181 "runtime.in"
+#line 1197 "./runtime.in"
{Stack->push<transform>(xscale(x)); return;}
}
-#line 1185 "runtime.in"
+#line 1201 "./runtime.in"
// transform yscale(real y);
void gen_runtime140(stack *Stack)
{
real y=vm::pop<real>(Stack);
-#line 1186 "runtime.in"
+#line 1202 "./runtime.in"
{Stack->push<transform>(yscale(y)); return;}
}
-#line 1190 "runtime.in"
+#line 1206 "./runtime.in"
// transform scale(real x);
void gen_runtime141(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 1191 "runtime.in"
+#line 1207 "./runtime.in"
{Stack->push<transform>(scale(x)); return;}
}
-#line 1195 "runtime.in"
+#line 1211 "./runtime.in"
// transform scale(real x, real y);
void gen_runtime142(stack *Stack)
{
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 1196 "runtime.in"
+#line 1212 "./runtime.in"
{Stack->push<transform>(scale(x,y)); return;}
}
-#line 1200 "runtime.in"
+#line 1216 "./runtime.in"
// transform slant(real s);
void gen_runtime143(stack *Stack)
{
real s=vm::pop<real>(Stack);
-#line 1201 "runtime.in"
+#line 1217 "./runtime.in"
{Stack->push<transform>(slant(s)); return;}
}
-#line 1205 "runtime.in"
+#line 1221 "./runtime.in"
// transform rotate(real angle, pair z=0);
void gen_runtime144(stack *Stack)
{
pair z=vm::pop<pair>(Stack,0);
real angle=vm::pop<real>(Stack);
-#line 1206 "runtime.in"
+#line 1222 "./runtime.in"
{Stack->push<transform>(rotatearound(z,radians(angle))); return;}
}
-#line 1210 "runtime.in"
+#line 1226 "./runtime.in"
// transform reflect(pair a, pair b);
void gen_runtime145(stack *Stack)
{
pair b=vm::pop<pair>(Stack);
pair a=vm::pop<pair>(Stack);
-#line 1211 "runtime.in"
+#line 1227 "./runtime.in"
{Stack->push<transform>(reflectabout(a,b)); return;}
}
-#line 1215 "runtime.in"
+#line 1231 "./runtime.in"
// bool isometry(transform t);
void gen_runtime146(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1216 "runtime.in"
+#line 1232 "./runtime.in"
{Stack->push<bool>(t.isIsometry()); return;}
}
-#line 1220 "runtime.in"
+#line 1236 "./runtime.in"
// real bezier(real a, real b, real c, real d, real t);
void gen_runtime147(stack *Stack)
{
@@ -1840,7 +1857,7 @@ void gen_runtime147(stack *Stack)
real c=vm::pop<real>(Stack);
real b=vm::pop<real>(Stack);
real a=vm::pop<real>(Stack);
-#line 1221 "runtime.in"
+#line 1237 "./runtime.in"
real onemt=1-t;
real onemt2=onemt*onemt;
{Stack->push<real>(onemt2*onemt*a+t*(3.0*(onemt2*b+t*onemt*c)+t*t*d)); return;}
@@ -1852,301 +1869,301 @@ namespace trans {
void gen_runtime_venv(venv &ve)
{
-#line 227 "runtime.in"
+#line 233 "./runtime.in"
REGISTER_BLTIN(run::IntZero,"IntZero");
-#line 235 "runtime.in"
+#line 241 "./runtime.in"
REGISTER_BLTIN(run::realZero,"realZero");
-#line 240 "runtime.in"
+#line 246 "./runtime.in"
REGISTER_BLTIN(run::boolFalse,"boolFalse");
-#line 245 "runtime.in"
+#line 251 "./runtime.in"
addFunc(ve, run::gen_runtime3, primBoolean(), SYM(isnan), formal(primReal(), SYM(x), false, false));
-#line 250 "runtime.in"
+#line 256 "./runtime.in"
REGISTER_BLTIN(run::pushNullArray,"pushNullArray");
-#line 255 "runtime.in"
+#line 261 "./runtime.in"
REGISTER_BLTIN(run::pushNullRecord,"pushNullRecord");
-#line 260 "runtime.in"
+#line 266 "./runtime.in"
REGISTER_BLTIN(run::pushNullFunction,"pushNullFunction");
-#line 265 "runtime.in"
+#line 271 "./runtime.in"
REGISTER_BLTIN(run::pushDefault,"pushDefault");
-#line 275 "runtime.in"
+#line 281 "./runtime.in"
REGISTER_BLTIN(run::isDefault,"isDefault");
-#line 282 "runtime.in"
+#line 288 "./runtime.in"
REGISTER_BLTIN(run::pairToGuide,"pairToGuide");
-#line 290 "runtime.in"
+#line 296 "./runtime.in"
REGISTER_BLTIN(run::pathToGuide,"pathToGuide");
-#line 295 "runtime.in"
+#line 301 "./runtime.in"
REGISTER_BLTIN(run::guideToPath,"guideToPath");
-#line 300 "runtime.in"
+#line 306 "./runtime.in"
REGISTER_BLTIN(run::newPen,"newPen");
-#line 308 "runtime.in"
+#line 314 "./runtime.in"
addFunc(ve, run::gen_runtime13, primBoolean(), SYM_EQ, formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false));
-#line 313 "runtime.in"
+#line 319 "./runtime.in"
addFunc(ve, run::gen_runtime14, primBoolean(), SYM_NEQ, formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false));
-#line 318 "runtime.in"
+#line 324 "./runtime.in"
addFunc(ve, run::gen_runtime15, primPen(), SYM_PLUS, formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false));
-#line 323 "runtime.in"
+#line 329 "./runtime.in"
addFunc(ve, run::gen_runtime16, primPen(), SYM_TIMES, formal(primReal(), SYM(a), false, false), formal(primPen(), SYM(b), false, false));
-#line 328 "runtime.in"
+#line 334 "./runtime.in"
addFunc(ve, run::gen_runtime17, primPen(), SYM_TIMES, formal(primPen(), SYM(a), false, false), formal(primReal(), SYM(b), false, false));
-#line 333 "runtime.in"
+#line 339 "./runtime.in"
addFunc(ve, run::gen_runtime18, primPair(), SYM(max), formal(primPen(), SYM(p), false, false));
-#line 338 "runtime.in"
+#line 344 "./runtime.in"
addFunc(ve, run::gen_runtime19, primPair(), SYM(min), formal(primPen(), SYM(p), false, false));
-#line 343 "runtime.in"
+#line 349 "./runtime.in"
addFunc(ve, run::gen_runtime20, primVoid(), SYM(resetdefaultpen));
-#line 349 "runtime.in"
+#line 355 "./runtime.in"
addFunc(ve, run::gen_runtime21, primVoid(), SYM(defaultpen), formal(primPen(), SYM(p), false, false));
-#line 354 "runtime.in"
+#line 360 "./runtime.in"
addFunc(ve, run::gen_runtime22, primPen(), SYM(defaultpen));
-#line 359 "runtime.in"
+#line 365 "./runtime.in"
addFunc(ve, run::gen_runtime23, primBoolean(), SYM(invisible), formal(primPen(), SYM(p), false, false));
-#line 364 "runtime.in"
+#line 370 "./runtime.in"
addFunc(ve, run::gen_runtime24, primPen(), SYM(invisible));
-#line 369 "runtime.in"
+#line 375 "./runtime.in"
addFunc(ve, run::gen_runtime25, primPen(), SYM(gray), formal(primPen(), SYM(p), false, false));
-#line 375 "runtime.in"
+#line 381 "./runtime.in"
addFunc(ve, run::gen_runtime26, primPen(), SYM(rgb), formal(primPen(), SYM(p), false, false));
-#line 381 "runtime.in"
+#line 387 "./runtime.in"
addFunc(ve, run::gen_runtime27, primPen(), SYM(cmyk), formal(primPen(), SYM(p), false, false));
-#line 387 "runtime.in"
+#line 393 "./runtime.in"
addFunc(ve, run::gen_runtime28, primPen(), SYM(interp), formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false), formal(primReal(), SYM(t), false, false));
-#line 392 "runtime.in"
+#line 398 "./runtime.in"
addFunc(ve, run::gen_runtime29, primPen(), SYM(rgb), formal(primReal(), SYM(r), false, false), formal(primReal(), SYM(g), false, false), formal(primReal(), SYM(b), false, false));
-#line 397 "runtime.in"
+#line 403 "./runtime.in"
addFunc(ve, run::gen_runtime30, primPen(), SYM(cmyk), formal(primReal(), SYM(c), false, false), formal(primReal(), SYM(m), false, false), formal(primReal(), SYM(y), false, false), formal(primReal(), SYM(k), false, false));
-#line 402 "runtime.in"
+#line 408 "./runtime.in"
addFunc(ve, run::gen_runtime31, primPen(), SYM(gray), formal(primReal(), SYM(gray), false, false));
-#line 407 "runtime.in"
+#line 413 "./runtime.in"
addFunc(ve, run::gen_runtime32, realArray(), SYM(colors), formal(primPen(), SYM(p), false, false));
-#line 435 "runtime.in"
+#line 441 "./runtime.in"
addFunc(ve, run::gen_runtime33, primString(), SYM(hex), formal(primPen(), SYM(p), false, false));
-#line 440 "runtime.in"
+#line 446 "./runtime.in"
addFunc(ve, run::gen_runtime34, primInt(), SYM(byte), formal(primReal(), SYM(x), false, false));
-#line 445 "runtime.in"
+#line 451 "./runtime.in"
addFunc(ve, run::gen_runtime35, primReal(), SYM(byteinv), formal(primInt(), SYM(x), false, false));
-#line 450 "runtime.in"
+#line 456 "./runtime.in"
addFunc(ve, run::gen_runtime36, primString(), SYM(colorspace), formal(primPen(), SYM(p), false, false));
-#line 457 "runtime.in"
+#line 463 "./runtime.in"
addFunc(ve, run::gen_runtime37, primPen(), SYM(pattern), formal(primString(), SYM(s), false, false));
-#line 462 "runtime.in"
+#line 468 "./runtime.in"
addFunc(ve, run::gen_runtime38, primString(), SYM(pattern), formal(primPen(), SYM(p), false, false));
-#line 467 "runtime.in"
+#line 473 "./runtime.in"
addFunc(ve, run::gen_runtime39, primPen(), SYM(fillrule), formal(primInt(), SYM(n), false, false));
-#line 472 "runtime.in"
+#line 478 "./runtime.in"
addFunc(ve, run::gen_runtime40, primInt(), SYM(fillrule), formal(primPen(), SYM(p), false, false));
-#line 477 "runtime.in"
+#line 483 "./runtime.in"
addFunc(ve, run::gen_runtime41, primPen(), SYM(opacity), formal(primReal(), SYM(opacity), true, false), formal(primString(), SYM(blend), true, false));
-#line 487 "runtime.in"
+#line 493 "./runtime.in"
addFunc(ve, run::gen_runtime42, primReal(), SYM(opacity), formal(primPen(), SYM(p), false, false));
-#line 492 "runtime.in"
+#line 498 "./runtime.in"
addFunc(ve, run::gen_runtime43, primString(), SYM(blend), formal(primPen(), SYM(p), false, false));
-#line 497 "runtime.in"
+#line 503 "./runtime.in"
addFunc(ve, run::gen_runtime44, primPen(), SYM(linetype), formal(realArray(), SYM(pattern), false, false), formal(primReal(), SYM(offset), true, false), formal(primBoolean(), SYM(scale), true, false), formal(primBoolean(), SYM(adjust), true, false));
-#line 508 "runtime.in"
+#line 514 "./runtime.in"
addFunc(ve, run::gen_runtime45, realArray(), SYM(linetype), formal(primPen(), SYM(p), true, false));
-#line 514 "runtime.in"
+#line 520 "./runtime.in"
addFunc(ve, run::gen_runtime46, primReal(), SYM(offset), formal(primPen(), SYM(p), false, false));
-#line 519 "runtime.in"
+#line 525 "./runtime.in"
addFunc(ve, run::gen_runtime47, primBoolean(), SYM(scale), formal(primPen(), SYM(p), false, false));
-#line 524 "runtime.in"
+#line 530 "./runtime.in"
addFunc(ve, run::gen_runtime48, primBoolean(), SYM(adjust), formal(primPen(), SYM(p), false, false));
-#line 529 "runtime.in"
+#line 535 "./runtime.in"
addFunc(ve, run::gen_runtime49, primPen(), SYM(adjust), formal(primPen(), SYM(p), false, false), formal(primReal(), SYM(arclength), false, false), formal(primBoolean(), SYM(cyclic), false, false));
-#line 534 "runtime.in"
+#line 540 "./runtime.in"
addFunc(ve, run::gen_runtime50, primPen(), SYM(linecap), formal(primInt(), SYM(n), false, false));
-#line 539 "runtime.in"
+#line 545 "./runtime.in"
addFunc(ve, run::gen_runtime51, primInt(), SYM(linecap), formal(primPen(), SYM(p), true, false));
-#line 544 "runtime.in"
+#line 550 "./runtime.in"
addFunc(ve, run::gen_runtime52, primPen(), SYM(linejoin), formal(primInt(), SYM(n), false, false));
-#line 549 "runtime.in"
+#line 555 "./runtime.in"
addFunc(ve, run::gen_runtime53, primInt(), SYM(linejoin), formal(primPen(), SYM(p), true, false));
-#line 554 "runtime.in"
+#line 560 "./runtime.in"
addFunc(ve, run::gen_runtime54, primPen(), SYM(miterlimit), formal(primReal(), SYM(x), false, false));
-#line 559 "runtime.in"
+#line 565 "./runtime.in"
addFunc(ve, run::gen_runtime55, primReal(), SYM(miterlimit), formal(primPen(), SYM(p), true, false));
-#line 564 "runtime.in"
+#line 570 "./runtime.in"
addFunc(ve, run::gen_runtime56, primPen(), SYM(linewidth), formal(primReal(), SYM(x), false, false));
-#line 569 "runtime.in"
+#line 575 "./runtime.in"
addFunc(ve, run::gen_runtime57, primReal(), SYM(linewidth), formal(primPen(), SYM(p), true, false));
-#line 574 "runtime.in"
+#line 580 "./runtime.in"
addFunc(ve, run::gen_runtime58, primPen(), SYM(fontcommand), formal(primString(), SYM(s), false, false));
-#line 579 "runtime.in"
+#line 585 "./runtime.in"
addFunc(ve, run::gen_runtime59, primString(), SYM(font), formal(primPen(), SYM(p), true, false));
-#line 584 "runtime.in"
+#line 590 "./runtime.in"
addFunc(ve, run::gen_runtime60, primPen(), SYM(fontsize), formal(primReal(), SYM(size), false, false), formal(primReal(), SYM(lineskip), false, false));
-#line 590 "runtime.in"
+#line 596 "./runtime.in"
addFunc(ve, run::gen_runtime61, primReal(), SYM(fontsize), formal(primPen(), SYM(p), true, false));
-#line 595 "runtime.in"
+#line 601 "./runtime.in"
addFunc(ve, run::gen_runtime62, primReal(), SYM(lineskip), formal(primPen(), SYM(p), true, false));
-#line 600 "runtime.in"
+#line 606 "./runtime.in"
addFunc(ve, run::gen_runtime63, primPen(), SYM(overwrite), formal(primInt(), SYM(n), false, false));
-#line 606 "runtime.in"
+#line 612 "./runtime.in"
addFunc(ve, run::gen_runtime64, primInt(), SYM(overwrite), formal(primPen(), SYM(p), true, false));
-#line 611 "runtime.in"
+#line 617 "./runtime.in"
addFunc(ve, run::gen_runtime65, primPen(), SYM(basealign), formal(primInt(), SYM(n), false, false));
-#line 616 "runtime.in"
+#line 622 "./runtime.in"
addFunc(ve, run::gen_runtime66, primInt(), SYM(basealign), formal(primPen(), SYM(p), true, false));
-#line 621 "runtime.in"
+#line 627 "./runtime.in"
addFunc(ve, run::gen_runtime67, primTransform(), SYM(transform), formal(primPen(), SYM(p), false, false));
-#line 626 "runtime.in"
+#line 632 "./runtime.in"
addFunc(ve, run::gen_runtime68, primPath(), SYM(nib), formal(primPen(), SYM(p), false, false));
-#line 631 "runtime.in"
+#line 637 "./runtime.in"
addFunc(ve, run::gen_runtime69, primPen(), SYM(makepen), formal(primPath(), SYM(p), false, false));
-#line 636 "runtime.in"
+#line 642 "./runtime.in"
addFunc(ve, run::gen_runtime70, primPen(), SYM(colorless), formal(primPen(), SYM(p), false, false));
-#line 642 "runtime.in"
+#line 648 "./runtime.in"
addFunc(ve, run::gen_runtime71, primBoolean(), SYM(interactive));
-#line 649 "runtime.in"
+#line 655 "./runtime.in"
addFunc(ve, run::gen_runtime72, primBoolean(), SYM(uptodate));
-#line 654 "runtime.in"
+#line 660 "./runtime.in"
addFunc(ve, run::gen_runtime73, primInt(), SYM(system), formal(stringArray(), SYM(s), false, false));
-#line 668 "runtime.in"
+#line 674 "./runtime.in"
addFunc(ve, run::gen_runtime74, primBoolean(), SYM(view));
-#line 673 "runtime.in"
+#line 679 "./runtime.in"
addFunc(ve, run::gen_runtime75, primString(), SYM(asydir));
-#line 678 "runtime.in"
+#line 684 "./runtime.in"
addFunc(ve, run::gen_runtime76, primString(), SYM(locale), formal(primString(), SYM(s), true, false));
-#line 684 "runtime.in"
+#line 690 "./runtime.in"
addFunc(ve, run::gen_runtime77, primVoid(), SYM(abort), formal(primString(), SYM(s), true, false));
-#line 690 "runtime.in"
+#line 696 "./runtime.in"
addFunc(ve, run::gen_runtime78, primVoid(), SYM(exit));
-#line 695 "runtime.in"
+#line 701 "./runtime.in"
addFunc(ve, run::gen_runtime79, primVoid(), SYM(assert), formal(primBoolean(), SYM(b), false, false), formal(primString(), SYM(s), true, false));
-#line 706 "runtime.in"
+#line 712 "./runtime.in"
addFunc(ve, run::gen_runtime80, primVoid(), SYM(sleep), formal(primInt(), SYM(seconds), false, false));
-#line 712 "runtime.in"
+#line 718 "./runtime.in"
addFunc(ve, run::gen_runtime81, primVoid(), SYM(usleep), formal(primInt(), SYM(microseconds), false, false));
-#line 718 "runtime.in"
+#line 724 "./runtime.in"
addFunc(ve, run::gen_runtime82, primVoid(), SYM(_eval), formal(primString(), SYM(s), false, false), formal(primBoolean(), SYM(embedded), false, false), formal(primBoolean(), SYM(interactivewrite), true, false));
-#line 731 "runtime.in"
+#line 737 "./runtime.in"
addFunc(ve, run::gen_runtime83, primVoid(), SYM(_eval), formal(primCode(), SYM(s), false, false), formal(primBoolean(), SYM(embedded), false, false));
-#line 747 "runtime.in"
+#line 753 "./runtime.in"
addFunc(ve, run::gen_runtime84, primString(), SYM(xasyKEY));
-#line 754 "runtime.in"
+#line 760 "./runtime.in"
addFunc(ve, run::gen_runtime85, primVoid(), SYM(xasyKEY), formal(primString(), SYM(s), false, false));
-#line 758 "runtime.in"
+#line 764 "./runtime.in"
addFunc(ve, run::gen_runtime86, primString(), SYM(location));
-#line 764 "runtime.in"
+#line 770 "./runtime.in"
REGISTER_BLTIN(run::loadModule,"loadModule");
-#line 770 "runtime.in"
+#line 776 "./runtime.in"
addFunc(ve, run::gen_runtime88, primString(), SYM(cd), formal(primString(), SYM(s), true, false));
-#line 781 "runtime.in"
+#line 787 "./runtime.in"
addFunc(ve, run::gen_runtime89, primVoid(), SYM(list), formal(primString(), SYM(s), false, false), formal(primBoolean(), SYM(imports), true, false));
-#line 790 "runtime.in"
+#line 796 "./runtime.in"
REGISTER_BLTIN(run::nullGuide,"nullGuide");
-#line 798 "runtime.in"
+#line 804 "./runtime.in"
REGISTER_BLTIN(run::dotsGuide,"dotsGuide");
-#line 808 "runtime.in"
+#line 814 "./runtime.in"
REGISTER_BLTIN(run::dashesGuide,"dashesGuide");
-#line 835 "runtime.in"
+#line 841 "./runtime.in"
REGISTER_BLTIN(run::newCycleToken,"newCycleToken");
-#line 840 "runtime.in"
+#line 846 "./runtime.in"
addFunc(ve, run::gen_runtime94, primGuide(), symbol::trans("operator cast"), formal(primCycleToken(), SYM(tok), false, false));
-#line 847 "runtime.in"
+#line 853 "./runtime.in"
addFunc(ve, run::gen_runtime95, primGuide(), symbol::trans("operator spec"), formal(primPair(), SYM(z), false, false), formal(primInt(), SYM(p), false, false));
-#line 855 "runtime.in"
+#line 861 "./runtime.in"
addFunc(ve, run::gen_runtime96, primCurlSpecifier(), SYM_CURL, formal(primReal(), SYM(gamma), false, false), formal(primInt(), SYM(p), false, false));
-#line 861 "runtime.in"
+#line 867 "./runtime.in"
REGISTER_BLTIN(run::curlSpecifierValuePart,"curlSpecifierValuePart");
-#line 866 "runtime.in"
+#line 872 "./runtime.in"
REGISTER_BLTIN(run::curlSpecifierSidePart,"curlSpecifierSidePart");
-#line 871 "runtime.in"
+#line 877 "./runtime.in"
addFunc(ve, run::gen_runtime99, primGuide(), symbol::trans("operator cast"), formal(primCurlSpecifier(), SYM(spec), false, false));
-#line 876 "runtime.in"
+#line 882 "./runtime.in"
addFunc(ve, run::gen_runtime100, primTensionSpecifier(), SYM_TENSION, formal(primReal(), SYM(tout), false, false), formal(primReal(), SYM(tin), false, false), formal(primBoolean(), SYM(atleast), false, false));
-#line 881 "runtime.in"
+#line 887 "./runtime.in"
REGISTER_BLTIN(run::tensionSpecifierOutPart,"tensionSpecifierOutPart");
-#line 886 "runtime.in"
+#line 892 "./runtime.in"
REGISTER_BLTIN(run::tensionSpecifierInPart,"tensionSpecifierInPart");
-#line 891 "runtime.in"
+#line 897 "./runtime.in"
REGISTER_BLTIN(run::tensionSpecifierAtleastPart,"tensionSpecifierAtleastPart");
-#line 896 "runtime.in"
+#line 902 "./runtime.in"
addFunc(ve, run::gen_runtime104, primGuide(), symbol::trans("operator cast"), formal(primTensionSpecifier(), SYM(t), false, false));
-#line 901 "runtime.in"
+#line 907 "./runtime.in"
addFunc(ve, run::gen_runtime105, primGuide(), SYM_CONTROLS, formal(primPair(), SYM(zout), false, false), formal(primPair(), SYM(zin), false, false));
-#line 906 "runtime.in"
+#line 912 "./runtime.in"
addFunc(ve, run::gen_runtime106, primInt(), SYM(size), formal(primGuide(), SYM(g), false, false));
-#line 913 "runtime.in"
+#line 919 "./runtime.in"
addFunc(ve, run::gen_runtime107, primInt(), SYM(length), formal(primGuide(), SYM(g), false, false));
-#line 920 "runtime.in"
+#line 926 "./runtime.in"
addFunc(ve, run::gen_runtime108, primBoolean(), SYM(cyclic), formal(primGuide(), SYM(g), false, false));
-#line 927 "runtime.in"
+#line 933 "./runtime.in"
addFunc(ve, run::gen_runtime109, primPair(), SYM(point), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
-#line 934 "runtime.in"
+#line 940 "./runtime.in"
addFunc(ve, run::gen_runtime110, pairArray(), SYM(dirSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
-#line 946 "runtime.in"
+#line 952 "./runtime.in"
addFunc(ve, run::gen_runtime111, pairArray(), SYM(controlSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
-#line 963 "runtime.in"
+#line 969 "./runtime.in"
addFunc(ve, run::gen_runtime112, primTensionSpecifier(), SYM(tensionSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
-#line 973 "runtime.in"
+#line 979 "./runtime.in"
addFunc(ve, run::gen_runtime113, realArray(), SYM(curlSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
-#line 987 "runtime.in"
+#line 993 "./runtime.in"
addFunc(ve, run::gen_runtime114, primGuide(), SYM(reverse), formal(primGuide(), SYM(g), false, false));
-#line 1040 "runtime.in"
+#line 1046 "./runtime.in"
addFunc(ve, run::gen_runtime115, realArray(), SYM(_cputime));
-#line 1055 "runtime.in"
+#line 1071 "./runtime.in"
addFunc(ve, run::gen_runtime116, primBoolean(), SYM_EQ, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
-#line 1063 "runtime.in"
+#line 1079 "./runtime.in"
addFunc(ve, run::gen_runtime117, primBoolean(), SYM_NEQ, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
-#line 1068 "runtime.in"
+#line 1084 "./runtime.in"
addFunc(ve, run::gen_runtime118, primTransform(), SYM_PLUS, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
-#line 1073 "runtime.in"
+#line 1089 "./runtime.in"
addFunc(ve, run::gen_runtime119, primTransform(), SYM_TIMES, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
-#line 1078 "runtime.in"
+#line 1094 "./runtime.in"
addFunc(ve, run::gen_runtime120, primPair(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPair(), SYM(z), false, false));
-#line 1083 "runtime.in"
+#line 1099 "./runtime.in"
addFunc(ve, run::gen_runtime121, primPath(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPath(), SYM(g), false, false));
-#line 1088 "runtime.in"
+#line 1104 "./runtime.in"
addFunc(ve, run::gen_runtime122, primPen(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPen(), SYM(p), false, false));
-#line 1093 "runtime.in"
+#line 1109 "./runtime.in"
addFunc(ve, run::gen_runtime123, primPicture(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPicture(), SYM(f), false, false));
-#line 1098 "runtime.in"
+#line 1114 "./runtime.in"
addFunc(ve, run::gen_runtime124, primPicture(), SYM_TIMES, formal(realArray2(), SYM(t), false, false), formal(primPicture(), SYM(f), false, false));
-#line 1103 "runtime.in"
+#line 1119 "./runtime.in"
addFunc(ve, run::gen_runtime125, primTransform(), SYM_CARET, formal(primTransform(), SYM(t), false, false), formal(primInt(), SYM(n), false, false));
-#line 1114 "runtime.in"
+#line 1130 "./runtime.in"
REGISTER_BLTIN(run::transformXPart,"transformXPart");
-#line 1119 "runtime.in"
+#line 1135 "./runtime.in"
REGISTER_BLTIN(run::transformYPart,"transformYPart");
-#line 1124 "runtime.in"
+#line 1140 "./runtime.in"
REGISTER_BLTIN(run::transformXXPart,"transformXXPart");
-#line 1129 "runtime.in"
+#line 1145 "./runtime.in"
REGISTER_BLTIN(run::transformXYPart,"transformXYPart");
-#line 1134 "runtime.in"
+#line 1150 "./runtime.in"
REGISTER_BLTIN(run::transformYXPart,"transformYXPart");
-#line 1139 "runtime.in"
+#line 1155 "./runtime.in"
REGISTER_BLTIN(run::transformYYPart,"transformYYPart");
-#line 1144 "runtime.in"
+#line 1160 "./runtime.in"
REGISTER_BLTIN(run::real6ToTransform,"real6ToTransform");
-#line 1150 "runtime.in"
+#line 1166 "./runtime.in"
addFunc(ve, run::gen_runtime133, primTransform(), SYM(shift), formal(primTransform(), SYM(t), false, false));
-#line 1155 "runtime.in"
+#line 1171 "./runtime.in"
addFunc(ve, run::gen_runtime134, primTransform(), SYM(shiftless), formal(primTransform(), SYM(t), false, false));
-#line 1160 "runtime.in"
+#line 1176 "./runtime.in"
addFunc(ve, run::transformIdentity, primTransform(), SYM(identity));
-#line 1165 "runtime.in"
+#line 1181 "./runtime.in"
addFunc(ve, run::gen_runtime136, primTransform(), SYM(inverse), formal(primTransform(), SYM(t), false, false));
-#line 1170 "runtime.in"
+#line 1186 "./runtime.in"
addFunc(ve, run::gen_runtime137, primTransform(), SYM(shift), formal(primPair(), SYM(z), false, false));
-#line 1175 "runtime.in"
+#line 1191 "./runtime.in"
addFunc(ve, run::gen_runtime138, primTransform(), SYM(shift), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false));
-#line 1180 "runtime.in"
+#line 1196 "./runtime.in"
addFunc(ve, run::gen_runtime139, primTransform(), SYM(xscale), formal(primReal(), SYM(x), false, false));
-#line 1185 "runtime.in"
+#line 1201 "./runtime.in"
addFunc(ve, run::gen_runtime140, primTransform(), SYM(yscale), formal(primReal(), SYM(y), false, false));
-#line 1190 "runtime.in"
+#line 1206 "./runtime.in"
addFunc(ve, run::gen_runtime141, primTransform(), SYM(scale), formal(primReal(), SYM(x), false, false));
-#line 1195 "runtime.in"
+#line 1211 "./runtime.in"
addFunc(ve, run::gen_runtime142, primTransform(), SYM(scale), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false));
-#line 1200 "runtime.in"
+#line 1216 "./runtime.in"
addFunc(ve, run::gen_runtime143, primTransform(), SYM(slant), formal(primReal(), SYM(s), false, false));
-#line 1205 "runtime.in"
+#line 1221 "./runtime.in"
addFunc(ve, run::gen_runtime144, primTransform(), SYM(rotate), formal(primReal(), SYM(angle), false, false), formal(primPair(), SYM(z), true, false));
-#line 1210 "runtime.in"
+#line 1226 "./runtime.in"
addFunc(ve, run::gen_runtime145, primTransform(), SYM(reflect), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false));
-#line 1215 "runtime.in"
+#line 1231 "./runtime.in"
addFunc(ve, run::gen_runtime146, primBoolean(), SYM(isometry), formal(primTransform(), SYM(t), false, false));
-#line 1220 "runtime.in"
+#line 1236 "./runtime.in"
addFunc(ve, run::gen_runtime147, primReal(), SYM(bezier), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false), formal(primReal(), SYM(c), false, false), formal(primReal(), SYM(d), false, false), formal(primReal(), SYM(t), false, false));
}
diff --git a/graphics/asymptote/runtime.h b/graphics/asymptote/runtime.h
index e7864e5441..dc9f9e6c69 100644
--- a/graphics/asymptote/runtime.h
+++ b/graphics/asymptote/runtime.h
@@ -1,7 +1,6 @@
/***** Autogenerated from runtime.in; changes will be overwritten *****/
-#ifndef runtime_H
-#define runtime_H
+#pragma once
namespace run {
void IntZero(vm::stack *);
void realZero(vm::stack *);
@@ -35,4 +34,3 @@ void real6ToTransform(vm::stack *);
void transformIdentity(vm::stack *);
}
-#endif // runtime_H
diff --git a/graphics/asymptote/runtime.in b/graphics/asymptote/runtime.in
index bc9154e4f6..0df7b34ea3 100644
--- a/graphics/asymptote/runtime.in
+++ b/graphics/asymptote/runtime.in
@@ -53,9 +53,15 @@ stringarray2* => stringArray2()
#include <iostream>
#include <fstream>
#include <time.h>
+
+#include <chrono>
+#include <thread>
+
+#if !defined(_WIN32)
#include <sys/times.h>
-#include <locale.h>
+#endif
+#include <locale.h>
#include "angle.h"
#include "pair.h"
#include "triple.h"
@@ -71,7 +77,7 @@ stringarray2* => stringArray2()
#include "builtin.h"
#include "texfile.h"
#include "pipestream.h"
-#include "parser.h"
+#include "asyparser.h"
#include "stack.h"
#include "util.h"
#include "locate.h"
@@ -79,7 +85,7 @@ stringarray2* => stringArray2()
#include "callable.h"
#include "stm.h"
#include "lexical.h"
-#include "process.h"
+#include "asyprocess.h"
#include "arrayop.h"
#include "seconds.h"
@@ -706,13 +712,13 @@ void assert(bool b, string s=emptystring)
void sleep(Int seconds)
{
if(seconds <= 0) return;
- sleep(seconds);
+ std::this_thread::sleep_for(std::chrono::seconds(seconds));
}
void usleep(Int microseconds)
{
if(microseconds <= 0) return;
- usleep((unsigned long) microseconds);
+ std::this_thread::sleep_for(std::chrono::microseconds(microseconds));
}
void _eval(string *s, bool embedded, bool interactiveWrite=false)
@@ -761,10 +767,10 @@ string location() {
return buf.str();
}
-// Wrapper for the stack::load() method.
-void :loadModule(string *index)
+// Wrapper for the stack::loadModule() method.
+void :loadModule(string *index, Int numPushedParents)
{
- Stack->load(*index);
+ Stack->loadModule(*index, numPushedParents);
}
string cd(string s=emptystring)
@@ -1039,15 +1045,25 @@ guide *reverse(guide *g)
realarray *_cputime()
{
+#if !defined(_WIN32)
static const real ticktime=1.0/sysconf(_SC_CLK_TCK);
struct tms buf;
-
::times(&buf);
+
+ real realCutime=((real)buf.tms_cutime)*ticktime;
+ real realCstime=((real)buf.tms_cstime)*ticktime;
+#else
+ // FIXME: See if there's a way to get cutime/cstime on windows,
+ // if it's possible.
+ real realCutime=0.0;
+ real realCstime=0.0;
+#endif
+
array *t=new array(5);
(*t)[0]=cpuTime.seconds(); // Includes system time
(*t)[1]=0.0;
- (*t)[2]=((real) buf.tms_cutime)*ticktime;
- (*t)[3]=((real) buf.tms_cstime)*ticktime;
+ (*t)[2]=realCutime;
+ (*t)[3]=realCstime;
(*t)[4]=wallClock.seconds();
return t;
}
diff --git a/graphics/asymptote/runtime.pl b/graphics/asymptote/runtime.pl
index 4a694c60bc..e998b49e0d 100755..100644
--- a/graphics/asymptote/runtime.pl
+++ b/graphics/asymptote/runtime.pl
@@ -7,13 +7,31 @@
#
#####
-$prefix = shift(@ARGV);
-if (not $prefix) {
- print STDERR "usage: ./runtime.pl module_name\n";
- exit(1);
-}
+use strict;
+use warnings;
+
+use Getopt::Long;
+
+my $opsymbolsFile;
+my $runtimeBaseFile;
+my $prefix;
+my $srcTemplateDir;
+my $headerOutDir;
+my $srcOutDir;
-$stack = "Stack";
+GetOptions(
+ "opsym-file=s" => \$opsymbolsFile,
+ "runtime-base-file=s" => \$runtimeBaseFile,
+ "src-template-dir=s" => \$srcTemplateDir,
+ "prefix=s" => \$prefix,
+ "header-out-dir=s" => \$headerOutDir,
+ "src-out-dir=s" => \$srcOutDir
+) || die("Argument error");
+
+my $outHeaderFile = "$headerOutDir/$prefix.h";
+my $outSrcFile = "$srcOutDir/$prefix.cc";
+
+my $stack = "Stack";
my $errors = 0;
@@ -72,14 +90,16 @@ sub read_types {
# Scrape the symbol names of the operators from opsymbols.h.
my %opsymbols = ();
-open(opsyms, "opsymbols.h") ||
- die("Couldn't open opsymbols.h");
-while (<opsyms>) {
+open(my $opsyms, $opsymbolsFile) ||
+ die("Couldn't open $opsymbolsFile");
+while (<$opsyms>) {
if (m/^OPSYMBOL\(\"(.*)\", ([A-Za-z_]+)\);/) {
$opsymbols{ $1 } = $2;
}
}
+close($opsyms);
+
# Turn a name into a symbol.
sub symbolize {
my $name = shift;
@@ -134,9 +154,9 @@ sub c_params {
$/ = "\f\n";
-open STDIN, "<$prefix.in" or die "can't open input file $prefix.in";
-open BASE, "<runtimebase.in" or die "can't open runtimebase.in";
-open STDOUT, ">$prefix.cc" or die "can't open output file $prefix.cc";
+open STDIN, "<$srcTemplateDir/$prefix.in" or die "can't open input file $srcTemplateDir/$prefix.in";
+open BASE, "<$runtimeBaseFile" or die "can't open $runtimeBaseFile";
+open STDOUT, ">$outSrcFile" or die "can't open output file $outSrcFile";
binmode STDIN, ":unix:crlf";
binmode BASE, ":unix:crlf";
@@ -144,30 +164,30 @@ binmode BASE, ":unix:crlf";
my $autogenerated=
"/***** Autogenerated from $prefix.in; changes will be overwritten *****/\n\n";
-my $base_source_line = 1;
+my $basesource_line = 1;
my $source_line = 1;
print $autogenerated;
-print "#line $base_source_line \"runtimebase.in\"\n";
-$baseheader = <BASE>;
+print "#line $basesource_line \"$srcTemplateDir/runtimebase.in\"\n";
+my $baseheader = <BASE>;
print $baseheader;
$basesource_line += ($baseheader =~ tr/\n//);;
my $basesource_type_line = $basesource_line;
-print "#line $source_line \"$prefix.in\"\n";
-$header = <>;
+print "#line $source_line \"$srcTemplateDir/$prefix.in\"\n";
+my $header = <>;
print $header;
$source_line += ($header =~ tr/\n//);;
my $source_type_line = $source_line;
-$basetypes = <BASE>;
+my $basetypes = <BASE>;
$basesource_line += ($basetypes =~ tr/\n//);;
-$types = <>;
+my $types = <>;
$source_line += ($types =~ tr/\n//);;
-print "#line $base_source_line \"runtimebase.in\"\n";
+print "#line $basesource_line \"$srcTemplateDir/runtimebase.in\"\n";
$baseheader = <BASE>;
print $baseheader;
$basesource_line += ($baseheader =~ tr/\n//);;
@@ -187,13 +207,14 @@ read_types($basetypes, "runtimebase.in", $basesource_type_line);
read_types($types, "$prefix.in", $source_type_line);
### Begining of `$prefix.h'
+my @header;
push @header, $autogenerated;
# TODO: Capitalize prefix
-push @header, "#ifndef " . $prefix . "_H\n";
-push @header, "#define " . $prefix . "_H\n";
+push @header, "#pragma once\n";
push @header, "namespace run {\n";
my $count = 0;
+my @builtin;
while (<>) {
my ($comments,$type,$name,$cname,$params,$code) =
m|^((?:\s*//[^\n]*\n)*) # comment lines
@@ -225,7 +246,7 @@ while (<>) {
assoc_error("$prefix.in", $source_line, $type);
}
my @asy_params = asy_params($params, "$prefix.in", $source_line);
- push @builtin, "#line $source_line \"$prefix.in\"\n"
+ push @builtin, "#line $source_line \"$srcTemplateDir/$prefix.in\"\n"
. " addFunc(ve, run::" . $cname
. ", " . $type_map{$type}
. ", " . symbolize($name)
@@ -237,22 +258,22 @@ while (<>) {
# Build REGISTER_BLTIN command for builtin functions which are not added to
# the environment.
if (not $name and $cname) {
- push @builtin, "#line $source_line \"$prefix.in\"\n"
+ push @builtin, "#line $source_line \"$srcTemplateDir/$prefix.in\"\n"
. " REGISTER_BLTIN(run::" . $cname
. ',"' . $cname . '"' . ");\n";
}
# Handle marshalling of values to/from stack
- $qualifier = ($type eq "item" ? "" : "<$type>");
+ my $qualifier = ($type eq "item" ? "" : "<$type>");
$code =~ s/\breturn ([^;]*);/{$stack->push$qualifier($1); return;}/g;
- $args = join("",c_params(@params));
+ my $args = join("",c_params(@params));
print $comments;
- $ncomments = ($comments =~ tr/\n//);
+ my $ncomments = ($comments =~ tr/\n//);
$source_line += $ncomments;
- print "#line $source_line \"$prefix.in\"\n";
+ print "#line $source_line \"$srcTemplateDir/$prefix.in\"\n";
my $prototype=$type . " " . $name . "(" . $params . ");";
- $nprototype = ($prototype =~ tr/\n//)+1;
+ my $nprototype = ($prototype =~ tr/\n//)+1;
$source_line += $nprototype;
if($name) {
clean_params($prototype);
@@ -261,7 +282,7 @@ while (<>) {
print "void $cname(stack *";
if($type ne "void" or $params ne "") {print $stack;}
print ")\n{\n$args";
- print "#line $source_line \"$prefix.in\"";
+ print "#line $source_line \"$srcTemplateDir/$prefix.in\"";
print "$code}\n\n";
$source_line -= $ncomments+$nprototype;
@@ -279,19 +300,25 @@ print "} // namespace trans\n";
### End of `header.h'
push @header, "}\n\n";
-push @header, "#endif // ". $prefix . "_H\n";
undef $/;
-open HEADER, "<", "$prefix.h";
-$orig_header = <HEADER>;
-$new_header = join "", @header;
+my $orig_header = "";
+my $HEADER;
+if (-e $outHeaderFile) {
+ open $HEADER, "<", $outHeaderFile;
+ $orig_header = <$HEADER>;
+ close $HEADER;
+}
+
+my $new_header = join "", @header;
if ($new_header ne $orig_header) {
- open HEADER, ">", "$prefix.h";
- print HEADER $new_header;
+ open $HEADER, ">", $outHeaderFile;
+ print $HEADER $new_header;
+ close $HEADER;
}
if ($errors) {
- unlink("$prefix.h");
- unlink("$prefix.cc");
+ unlink($outHeaderFile);
+ unlink($outSrcFile);
}
exit($errors);
diff --git a/graphics/asymptote/runtriple.cc b/graphics/asymptote/runtriple.cc
index 919f2957f1..d0250c1ee5 100644
--- a/graphics/asymptote/runtriple.cc
+++ b/graphics/asymptote/runtriple.cc
@@ -1,6 +1,6 @@
/***** Autogenerated from runtriple.in; changes will be overwritten *****/
-#line 1 "runtimebase.in"
+#line 1 "./runtimebase.in"
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
@@ -10,7 +10,7 @@
*****/
-#line 1 "runtriple.in"
+#line 1 "./runtriple.in"
/*****
* runtriple.in
*
@@ -18,7 +18,7 @@
*
*****/
-#line 1 "runtimebase.in"
+#line 23 "./runtimebase.in"
#include "stack.h"
#include "types.h"
#include "builtin.h"
@@ -77,243 +77,243 @@ using namespace camp;
#endif
namespace run {
-#line 19 "runtriple.in"
+#line 19 "./runtriple.in"
void tripleZero(stack *Stack)
{
-#line 20 "runtriple.in"
+#line 20 "./runtriple.in"
static triple zero;
{Stack->push<triple>(zero); return;}
}
-#line 25 "runtriple.in"
+#line 25 "./runtriple.in"
void realRealRealToTriple(stack *Stack)
{
real z=vm::pop<real>(Stack);
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 26 "runtriple.in"
+#line 26 "./runtriple.in"
{Stack->push<triple>(triple(x,y,z)); return;}
}
-#line 30 "runtriple.in"
+#line 30 "./runtriple.in"
// real xpart(triple v);
void tripleXPart(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
-#line 31 "runtriple.in"
+#line 31 "./runtriple.in"
{Stack->push<real>(v.getx()); return;}
}
-#line 35 "runtriple.in"
+#line 35 "./runtriple.in"
// real ypart(triple v);
void tripleYPart(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
-#line 36 "runtriple.in"
+#line 36 "./runtriple.in"
{Stack->push<real>(v.gety()); return;}
}
-#line 40 "runtriple.in"
+#line 40 "./runtriple.in"
// real zpart(triple v);
void tripleZPart(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
-#line 41 "runtriple.in"
+#line 41 "./runtriple.in"
{Stack->push<real>(v.getz()); return;}
}
-#line 45 "runtriple.in"
+#line 45 "./runtriple.in"
// triple *(real x, triple v);
void gen_runtriple5(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
real x=vm::pop<real>(Stack);
-#line 46 "runtriple.in"
+#line 46 "./runtriple.in"
{Stack->push<triple>(x*v); return;}
}
-#line 50 "runtriple.in"
+#line 50 "./runtriple.in"
// triple *(triple v, real x);
void gen_runtriple6(stack *Stack)
{
real x=vm::pop<real>(Stack);
triple v=vm::pop<triple>(Stack);
-#line 51 "runtriple.in"
+#line 51 "./runtriple.in"
{Stack->push<triple>(v*x); return;}
}
-#line 55 "runtriple.in"
+#line 55 "./runtriple.in"
// triple /(triple v, real x);
void gen_runtriple7(stack *Stack)
{
real x=vm::pop<real>(Stack);
triple v=vm::pop<triple>(Stack);
-#line 56 "runtriple.in"
+#line 56 "./runtriple.in"
{Stack->push<triple>(v/x); return;}
}
-#line 60 "runtriple.in"
+#line 60 "./runtriple.in"
// real length(triple v);
void gen_runtriple8(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
-#line 61 "runtriple.in"
+#line 61 "./runtriple.in"
{Stack->push<real>(v.length()); return;}
}
-#line 65 "runtriple.in"
+#line 65 "./runtriple.in"
// real abs(triple v);
void gen_runtriple9(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
-#line 66 "runtriple.in"
+#line 66 "./runtriple.in"
{Stack->push<real>(v.length()); return;}
}
-#line 70 "runtriple.in"
+#line 70 "./runtriple.in"
// real abs2(triple v);
void gen_runtriple10(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
-#line 71 "runtriple.in"
+#line 71 "./runtriple.in"
{Stack->push<real>(abs2(v)); return;}
}
-#line 75 "runtriple.in"
+#line 75 "./runtriple.in"
// real polar(triple v, bool warn=true);
void gen_runtriple11(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
triple v=vm::pop<triple>(Stack);
-#line 76 "runtriple.in"
+#line 76 "./runtriple.in"
{Stack->push<real>(v.polar(warn)); return;}
}
-#line 80 "runtriple.in"
+#line 80 "./runtriple.in"
// real azimuth(triple v, bool warn=true);
void gen_runtriple12(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
triple v=vm::pop<triple>(Stack);
-#line 81 "runtriple.in"
+#line 81 "./runtriple.in"
if(!warn && v.getx() == 0.0 && v.gety() == 0.0) {Stack->push<real>(0.0); return;}
{Stack->push<real>(v.azimuth()); return;}
}
-#line 86 "runtriple.in"
+#line 86 "./runtriple.in"
// real colatitude(triple v, bool warn=true);
void gen_runtriple13(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
triple v=vm::pop<triple>(Stack);
-#line 87 "runtriple.in"
+#line 87 "./runtriple.in"
if(!warn && v.getx() == 0.0 && v.gety() == 0.0 && v.getz() == 0.0) {Stack->push<real>(0.0); return;}
{Stack->push<real>(degrees(v.polar())); return;}
}
-#line 92 "runtriple.in"
+#line 92 "./runtriple.in"
// real latitude(triple v, bool warn=true);
void gen_runtriple14(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
triple v=vm::pop<triple>(Stack);
-#line 93 "runtriple.in"
+#line 93 "./runtriple.in"
if(!warn && v.getx() == 0.0 && v.gety() == 0.0 && v.getz() == 0.0) {Stack->push<real>(0.0); return;}
{Stack->push<real>(90.0-degrees(v.polar())); return;}
}
// Return the longitude of v in [0,360).
-#line 99 "runtriple.in"
+#line 99 "./runtriple.in"
// real longitude(triple v, bool warn=true);
void gen_runtriple15(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
triple v=vm::pop<triple>(Stack);
-#line 100 "runtriple.in"
+#line 100 "./runtriple.in"
if(!warn && v.getx() == 0.0 && v.gety() == 0.0) {Stack->push<real>(0.0); return;}
{Stack->push<real>(principalBranch(degrees(v.azimuth()))); return;}
}
-#line 105 "runtriple.in"
+#line 105 "./runtriple.in"
// triple unit(triple v);
void gen_runtriple16(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
-#line 106 "runtriple.in"
+#line 106 "./runtriple.in"
{Stack->push<triple>(unit(v)); return;}
}
-#line 110 "runtriple.in"
+#line 110 "./runtriple.in"
// real dot(triple u, triple v);
void gen_runtriple17(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
triple u=vm::pop<triple>(Stack);
-#line 111 "runtriple.in"
+#line 111 "./runtriple.in"
{Stack->push<real>(dot(u,v)); return;}
}
-#line 115 "runtriple.in"
+#line 115 "./runtriple.in"
// triple cross(triple u, triple v);
void gen_runtriple18(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
triple u=vm::pop<triple>(Stack);
-#line 116 "runtriple.in"
+#line 116 "./runtriple.in"
{Stack->push<triple>(cross(u,v)); return;}
}
-#line 120 "runtriple.in"
+#line 120 "./runtriple.in"
// triple dir(explicit triple z);
void gen_runtriple19(stack *Stack)
{
triple z=vm::pop<triple>(Stack);
-#line 121 "runtriple.in"
+#line 121 "./runtriple.in"
{Stack->push<triple>(unit(z)); return;}
}
-#line 125 "runtriple.in"
+#line 125 "./runtriple.in"
// triple expi(real polar, real azimuth);
void gen_runtriple20(stack *Stack)
{
real azimuth=vm::pop<real>(Stack);
real polar=vm::pop<real>(Stack);
-#line 126 "runtriple.in"
+#line 126 "./runtriple.in"
{Stack->push<triple>(expi(polar,azimuth)); return;}
}
-#line 130 "runtriple.in"
+#line 130 "./runtriple.in"
// triple dir(real colatitude, real longitude);
void gen_runtriple21(stack *Stack)
{
real longitude=vm::pop<real>(Stack);
real colatitude=vm::pop<real>(Stack);
-#line 131 "runtriple.in"
+#line 131 "./runtriple.in"
{Stack->push<triple>(expi(radians(colatitude),radians(longitude))); return;}
}
-#line 135 "runtriple.in"
+#line 135 "./runtriple.in"
// triple realmult(triple u, triple v);
void gen_runtriple22(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
triple u=vm::pop<triple>(Stack);
-#line 136 "runtriple.in"
+#line 136 "./runtriple.in"
{Stack->push<triple>(triple (u.getx()*v.getx(),u.gety()*v.gety(),u.getz()*v.getz())); return;}
}
// Return the component of vector v perpendicular to a unit vector u.
-#line 141 "runtriple.in"
+#line 141 "./runtriple.in"
// triple perp(triple v, triple u);
void gen_runtriple23(stack *Stack)
{
triple u=vm::pop<triple>(Stack);
triple v=vm::pop<triple>(Stack);
-#line 142 "runtriple.in"
+#line 142 "./runtriple.in"
{Stack->push<triple>(perp(v,u)); return;}
}
-#line 146 "runtriple.in"
+#line 146 "./runtriple.in"
// triple bezier(triple a, triple b, triple c, triple d, real t);
void gen_runtriple24(stack *Stack)
{
@@ -322,13 +322,13 @@ void gen_runtriple24(stack *Stack)
triple c=vm::pop<triple>(Stack);
triple b=vm::pop<triple>(Stack);
triple a=vm::pop<triple>(Stack);
-#line 147 "runtriple.in"
+#line 147 "./runtriple.in"
real onemt=1-t;
real onemt2=onemt*onemt;
{Stack->push<triple>(onemt2*onemt*a+t*(3.0*(onemt2*b+t*onemt*c)+t*t*d)); return;}
}
-#line 153 "runtriple.in"
+#line 153 "./runtriple.in"
// triple bezierP(triple a, triple b, triple c, triple d, real t);
void gen_runtriple25(stack *Stack)
{
@@ -337,11 +337,11 @@ void gen_runtriple25(stack *Stack)
triple c=vm::pop<triple>(Stack);
triple b=vm::pop<triple>(Stack);
triple a=vm::pop<triple>(Stack);
-#line 154 "runtriple.in"
+#line 154 "./runtriple.in"
{Stack->push<triple>(3.0*(t*t*(d-a+3.0*(b-c))+t*(2.0*(a+c)-4.0*b)+b-a)); return;}
}
-#line 158 "runtriple.in"
+#line 158 "./runtriple.in"
// triple bezierPP(triple a, triple b, triple c, triple d, real t);
void gen_runtriple26(stack *Stack)
{
@@ -350,11 +350,11 @@ void gen_runtriple26(stack *Stack)
triple c=vm::pop<triple>(Stack);
triple b=vm::pop<triple>(Stack);
triple a=vm::pop<triple>(Stack);
-#line 159 "runtriple.in"
+#line 159 "./runtriple.in"
{Stack->push<triple>(6.0*(t*(d-a+3.0*(b-c))+a+c)-12.0*b); return;}
}
-#line 163 "runtriple.in"
+#line 163 "./runtriple.in"
// triple bezierPPP(triple a, triple b, triple c, triple d);
void gen_runtriple27(stack *Stack)
{
@@ -362,7 +362,7 @@ void gen_runtriple27(stack *Stack)
triple c=vm::pop<triple>(Stack);
triple b=vm::pop<triple>(Stack);
triple a=vm::pop<triple>(Stack);
-#line 164 "runtriple.in"
+#line 164 "./runtriple.in"
{Stack->push<triple>(6.0*(d-a)+18.0*(b-c)); return;}
}
@@ -372,61 +372,61 @@ namespace trans {
void gen_runtriple_venv(venv &ve)
{
-#line 19 "runtriple.in"
+#line 19 "./runtriple.in"
REGISTER_BLTIN(run::tripleZero,"tripleZero");
-#line 25 "runtriple.in"
+#line 25 "./runtriple.in"
REGISTER_BLTIN(run::realRealRealToTriple,"realRealRealToTriple");
-#line 30 "runtriple.in"
+#line 30 "./runtriple.in"
addFunc(ve, run::tripleXPart, primReal(), SYM(xpart), formal(primTriple(), SYM(v), false, false));
-#line 35 "runtriple.in"
+#line 35 "./runtriple.in"
addFunc(ve, run::tripleYPart, primReal(), SYM(ypart), formal(primTriple(), SYM(v), false, false));
-#line 40 "runtriple.in"
+#line 40 "./runtriple.in"
addFunc(ve, run::tripleZPart, primReal(), SYM(zpart), formal(primTriple(), SYM(v), false, false));
-#line 45 "runtriple.in"
+#line 45 "./runtriple.in"
addFunc(ve, run::gen_runtriple5, primTriple(), SYM_TIMES, formal(primReal(), SYM(x), false, false), formal(primTriple(), SYM(v), false, false));
-#line 50 "runtriple.in"
+#line 50 "./runtriple.in"
addFunc(ve, run::gen_runtriple6, primTriple(), SYM_TIMES, formal(primTriple(), SYM(v), false, false), formal(primReal(), SYM(x), false, false));
-#line 55 "runtriple.in"
+#line 55 "./runtriple.in"
addFunc(ve, run::gen_runtriple7, primTriple(), SYM_DIVIDE, formal(primTriple(), SYM(v), false, false), formal(primReal(), SYM(x), false, false));
-#line 60 "runtriple.in"
+#line 60 "./runtriple.in"
addFunc(ve, run::gen_runtriple8, primReal(), SYM(length), formal(primTriple(), SYM(v), false, false));
-#line 65 "runtriple.in"
+#line 65 "./runtriple.in"
addFunc(ve, run::gen_runtriple9, primReal(), SYM(abs), formal(primTriple(), SYM(v), false, false));
-#line 70 "runtriple.in"
+#line 70 "./runtriple.in"
addFunc(ve, run::gen_runtriple10, primReal(), SYM(abs2), formal(primTriple(), SYM(v), false, false));
-#line 75 "runtriple.in"
+#line 75 "./runtriple.in"
addFunc(ve, run::gen_runtriple11, primReal(), SYM(polar), formal(primTriple(), SYM(v), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 80 "runtriple.in"
+#line 80 "./runtriple.in"
addFunc(ve, run::gen_runtriple12, primReal(), SYM(azimuth), formal(primTriple(), SYM(v), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 86 "runtriple.in"
+#line 86 "./runtriple.in"
addFunc(ve, run::gen_runtriple13, primReal(), SYM(colatitude), formal(primTriple(), SYM(v), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 92 "runtriple.in"
+#line 92 "./runtriple.in"
addFunc(ve, run::gen_runtriple14, primReal(), SYM(latitude), formal(primTriple(), SYM(v), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 98 "runtriple.in"
+#line 98 "./runtriple.in"
addFunc(ve, run::gen_runtriple15, primReal(), SYM(longitude), formal(primTriple(), SYM(v), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 105 "runtriple.in"
+#line 105 "./runtriple.in"
addFunc(ve, run::gen_runtriple16, primTriple(), SYM(unit), formal(primTriple(), SYM(v), false, false));
-#line 110 "runtriple.in"
+#line 110 "./runtriple.in"
addFunc(ve, run::gen_runtriple17, primReal(), SYM(dot), formal(primTriple(), SYM(u), false, false), formal(primTriple(), SYM(v), false, false));
-#line 115 "runtriple.in"
+#line 115 "./runtriple.in"
addFunc(ve, run::gen_runtriple18, primTriple(), SYM(cross), formal(primTriple(), SYM(u), false, false), formal(primTriple(), SYM(v), false, false));
-#line 120 "runtriple.in"
+#line 120 "./runtriple.in"
addFunc(ve, run::gen_runtriple19, primTriple(), SYM(dir), formal(primTriple(), SYM(z), false, true));
-#line 125 "runtriple.in"
+#line 125 "./runtriple.in"
addFunc(ve, run::gen_runtriple20, primTriple(), SYM(expi), formal(primReal(), SYM(polar), false, false), formal(primReal(), SYM(azimuth), false, false));
-#line 130 "runtriple.in"
+#line 130 "./runtriple.in"
addFunc(ve, run::gen_runtriple21, primTriple(), SYM(dir), formal(primReal(), SYM(colatitude), false, false), formal(primReal(), SYM(longitude), false, false));
-#line 135 "runtriple.in"
+#line 135 "./runtriple.in"
addFunc(ve, run::gen_runtriple22, primTriple(), SYM(realmult), formal(primTriple(), SYM(u), false, false), formal(primTriple(), SYM(v), false, false));
-#line 140 "runtriple.in"
+#line 140 "./runtriple.in"
addFunc(ve, run::gen_runtriple23, primTriple(), SYM(perp), formal(primTriple(), SYM(v), false, false), formal(primTriple(), SYM(u), false, false));
-#line 146 "runtriple.in"
+#line 146 "./runtriple.in"
addFunc(ve, run::gen_runtriple24, primTriple(), SYM(bezier), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false), formal(primReal(), SYM(t), false, false));
-#line 153 "runtriple.in"
+#line 153 "./runtriple.in"
addFunc(ve, run::gen_runtriple25, primTriple(), SYM(bezierP), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false), formal(primReal(), SYM(t), false, false));
-#line 158 "runtriple.in"
+#line 158 "./runtriple.in"
addFunc(ve, run::gen_runtriple26, primTriple(), SYM(bezierPP), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false), formal(primReal(), SYM(t), false, false));
-#line 163 "runtriple.in"
+#line 163 "./runtriple.in"
addFunc(ve, run::gen_runtriple27, primTriple(), SYM(bezierPPP), formal(primTriple(), SYM(a), false, false), formal(primTriple(), SYM(b), false, false), formal(primTriple(), SYM(c), false, false), formal(primTriple(), SYM(d), false, false));
}
diff --git a/graphics/asymptote/runtriple.h b/graphics/asymptote/runtriple.h
index aff21b39fc..1de776f9e2 100644
--- a/graphics/asymptote/runtriple.h
+++ b/graphics/asymptote/runtriple.h
@@ -1,7 +1,6 @@
/***** Autogenerated from runtriple.in; changes will be overwritten *****/
-#ifndef runtriple_H
-#define runtriple_H
+#pragma once
namespace run {
void tripleZero(vm::stack *);
void realRealRealToTriple(vm::stack *);
@@ -10,4 +9,3 @@ void tripleYPart(vm::stack *);
void tripleZPart(vm::stack *);
}
-#endif // runtriple_H
diff --git a/graphics/asymptote/seconds.h b/graphics/asymptote/seconds.h
index f8d94b92c1..3b78042c04 100644
--- a/graphics/asymptote/seconds.h
+++ b/graphics/asymptote/seconds.h
@@ -2,7 +2,10 @@
#define __seconds_h__ 1
#include <chrono>
+
+#if !defined(_WIN32)
#include <sys/resource.h>
+#endif
namespace utils {
diff --git a/graphics/asymptote/settings.cc b/graphics/asymptote/settings.cc
index 9a5006cfe4..5af3ab0863 100644
--- a/graphics/asymptote/settings.cc
+++ b/graphics/asymptote/settings.cc
@@ -11,10 +11,19 @@
#include <cerrno>
#include <sys/stat.h>
#include <cfloat>
-#include <locale.h>
-#include <unistd.h>
+#include <clocale>
#include <algorithm>
+#if defined(_WIN32)
+#include <Windows.h>
+#include <io.h>
+#define isatty _isatty
+
+#include "win32helpers.h"
+#else
+#include <unistd.h>
+#endif
+
#include "common.h"
#if HAVE_GNU_GETOPT_H
@@ -41,15 +50,22 @@
extern "C" {
#ifdef HAVE_NCURSES_CURSES_H
+#define USE_SETUPTERM
#include <ncurses/curses.h>
#include <ncurses/term.h>
#elif HAVE_NCURSES_H
+#define USE_SETUPTERM
#include <ncurses.h>
#include <term.h>
#elif HAVE_CURSES_H
#include <curses.h>
+
+#if defined(HAVE_TERM_H)
+#define USE_SETUPTERM
#include <term.h>
#endif
+
+#endif
}
#endif
@@ -81,7 +97,9 @@ const bool havegl=true;
const bool havegl=false;
#endif
+#if !defined(_WIN32)
mode_t mask;
+#endif
string systemDir=ASYMPTOTE_SYSDIR;
string defaultPSdriver="ps2write";
@@ -90,7 +108,7 @@ string defaultPNGdriver="png16m"; // pngalpha has issues at high resolutions
string defaultAsyGL="https://vectorgraphics.github.io/asymptote/base/webgl/asygl-"+
string(AsyGLVersion)+".js";
-#ifndef __MSDOS__
+#if !defined(_WIN32)
bool msdos=false;
string HOME="HOME";
@@ -108,7 +126,7 @@ string defaultHTMLViewer="google-chrome";
string defaultGhostscript="gs";
string defaultGhostscriptLibrary="";
string defaultDisplay="display";
-string defaultAnimate="animate";
+string defaultAnimate="magick";
void queryRegistry() {}
const string dirsep="/";
@@ -118,92 +136,185 @@ bool msdos=true;
string HOME="USERPROFILE";
string docdir="c:\\Program Files\\Asymptote";
const char pathSeparator=';';
-string defaultPSViewer="cmd";
+string defaultPSViewer;
//string defaultPDFViewer="AcroRd32.exe";
-string defaultPDFViewer="cmd";
-string defaultHTMLViewer="cmd";
+string defaultPDFViewer;
+string defaultHTMLViewer;
string defaultGhostscript;
string defaultGhostscriptLibrary;
-string defaultDisplay="cmd";
-//string defaultAnimate="animate";
-string defaultAnimate="cmd";
+string defaultDisplay;
+//string defaultAnimate="magick";
+string defaultAnimate="";
const string dirsep="\\";
-#include <dirent.h>
-
-// Use key to look up an entry in the MSWindows registry, respecting wild cards
-string getEntry(const string& location, const string& key)
+/**
+ * Use key to look up an entry in the MSWindows registry,
+ * @param baseRegLocation base location for a key
+ * @param key Key to look up, respecting wild cards
+ * @remark Wildcards can only be in keys, not in the final value
+ * @return Entry value, or an empty string if not found
+ */
+string getEntry(const HKEY& baseRegLocation, const string& key)
{
- string path="/proc/registry"+location+key;
+ string path=key;
size_t star;
string head;
- while((star=path.find("*")) < string::npos) {
+ while((star=path.find('*')) < string::npos)
+ {
+ // has asterisk in the path
+
string prefix=path.substr(0,star);
- string suffix=path.substr(star+1);
- size_t slash=suffix.find("/");
+ string pathSuffix=path.substr(star+1);
+ // path = prefix [*] pathSuffix
+ size_t slash=pathSuffix.find('\\');
if(slash < string::npos) {
- path=suffix.substr(slash);
- suffix=suffix.substr(0,slash);
+ // pathsuffix is not leaf yet
+ // pathSuffix = <new path suffix>[/<new path>]
+ path=pathSuffix.substr(slash);
+ pathSuffix=pathSuffix.substr(0,slash);
} else {
- path=suffix;
- suffix="";
+ // pathSuffix is entirely part of registry value name
+ // pathSuffix = <new path>, new path suffix is empty
+ path=pathSuffix;
+ pathSuffix="";
}
string directory=head+stripFile(prefix);
string file=stripDir(prefix);
- DIR *dir=opendir(directory.c_str());
- if(dir == NULL) return "";
- dirent *p;
- string rsuffix=suffix;
- reverse(rsuffix.begin(),rsuffix.end());
- while((p=readdir(dir)) != NULL) {
- string dname=p->d_name;
+ // prefix = directory/file
+ // [old path] = directory/file [*] pathSuffix [/path]
+ // or, if asterisk is in the leaf
+ // [old path] = directory/file[*]path, pathSuffix is empty
+
+ camp::w32::RegKeyWrapper currRegDirectory;
+ if (RegOpenKeyExA(baseRegLocation, directory.c_str(), 0, KEY_READ, currRegDirectory.put()) != ERROR_SUCCESS)
+ {
+ currRegDirectory.release();
+ return "";
+ }
+
+ DWORD numSubKeys;
+ DWORD longestSubkeySize;
+
+ if (RegQueryInfoKeyA(
+ currRegDirectory.getKey(),
+ nullptr, nullptr, nullptr,
+ &numSubKeys, &longestSubkeySize,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr) != ERROR_SUCCESS)
+ {
+ numSubKeys = 0;
+ longestSubkeySize = 0;
+ }
+ mem::vector<char> subkeyBuffer(longestSubkeySize + 1);
+ bool found=false;
+
+ string rsuffix= pathSuffix;
+ reverse(rsuffix.begin(), rsuffix.end());
+ for (DWORD i=0;i<numSubKeys;++i)
+ {
+ DWORD cchValue=longestSubkeySize + 1;
+
+ if (auto const regQueryResult= RegEnumKeyExA(
+ currRegDirectory.getKey(),
+ i,
+ subkeyBuffer.data(),
+ &cchValue,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr
+ );
+ regQueryResult != ERROR_SUCCESS)
+ {
+ continue;
+ }
+
+ string const dname(subkeyBuffer.data());
string rdname=dname;
reverse(rdname.begin(),rdname.end());
- if(dname != "." && dname != ".." &&
- dname.substr(0,file.size()) == file &&
- rdname.substr(0,suffix.size()) == rsuffix) {
- head=directory+p->d_name;
+ if(dname.substr(0,file.size()) == file &&
+ rdname.substr(0, pathSuffix.size()) == rsuffix) {
+ // dname matches file [*} pathSuffix
+ head=directory+dname;
+ found=true;
break;
}
}
- if(p == NULL) return "";
+
+ if (!found)
+ {
+ return "";
+ }
}
- std::ifstream fin((head+path).c_str());
- if(fin) {
- string s;
- getline(fin,s);
- size_t end=s.find('\0');
- if(end < string::npos)
- return s.substr(0,end);
+
+ if (path.find('\\') == 0)
+ {
+ path = path.substr(1); // strip the prefix separator
}
- return "";
+
+ if (path == "@")
+ {
+ path= "";// default registry key
+ }
+
+ DWORD requiredStrSize=0;
+ // FIXME: Add handling of additional types
+ if (RegGetValueA(baseRegLocation, head.c_str(), path.c_str(), RRF_RT_REG_SZ, nullptr, nullptr, &requiredStrSize) !=
+ ERROR_SUCCESS)
+ {
+ return "";
+ }
+
+ mem::vector<BYTE> outputBuffer(requiredStrSize);
+
+ if (auto const retCheck = RegGetValueA(baseRegLocation, head.c_str(), path.c_str(),
+ RRF_RT_REG_SZ,
+ nullptr,
+ outputBuffer.data(),
+ &requiredStrSize
+ );
+ retCheck != ERROR_SUCCESS)
+ {
+ return "";
+ }
+
+ return reinterpret_cast<char const*>(outputBuffer.data());
}
// Use key to look up an entry in the MSWindows registry, respecting wild cards
string getEntry(const string& key)
{
- string entry=getEntry("64/HKEY_CURRENT_USER/Software/",key);
- if(entry.empty()) entry=getEntry("64/HKEY_LOCAL_MACHINE/SOFTWARE/",key);
- if(entry.empty()) entry=getEntry("/HKEY_CURRENT_USER/Software/",key);
- if(entry.empty()) entry=getEntry("/HKEY_LOCAL_MACHINE/SOFTWARE/",key);
- return entry;
+ for (HKEY const keyToSearch : { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER })
+ {
+ camp::w32::RegKeyWrapper baseRegKey;
+ if (RegOpenKeyExA(keyToSearch, "Software", 0, KEY_READ, baseRegKey.put()) != ERROR_SUCCESS)
+ {
+ baseRegKey.release();
+ continue;
+ }
+
+ if (string entry=getEntry(baseRegKey.getKey(),key); !entry.empty())
+ {
+ return entry;
+ }
+ }
+
+ return "";
}
void queryRegistry()
{
- string defaultGhostscriptLibrary=getEntry("GPL Ghostscript/*/GS_DLL");
+ defaultGhostscriptLibrary= getEntry(R"(GPL Ghostscript\*\GS_DLL)");
if(defaultGhostscriptLibrary.empty())
- defaultGhostscriptLibrary=getEntry("AFPL Ghostscript/*/GS_DLL");
+ defaultGhostscriptLibrary=getEntry(R"(AFPL Ghostscript\*\GS_DLL)");
string gslib=stripDir(defaultGhostscriptLibrary);
defaultGhostscript=stripFile(defaultGhostscriptLibrary)+
((gslib.empty() || gslib.substr(5,2) == "32") ? "gswin32c.exe" : "gswin64c.exe");
- if(defaultPDFViewer != "cmd")
- defaultPDFViewer=getEntry("Adobe/Acrobat Reader/*/InstallPath/@")+"\\"+
- defaultPDFViewer;
- string s;
- s=getEntry("Microsoft/Windows/CurrentVersion/App Paths/Asymptote/Path");
- if(!s.empty()) docdir=s;
+
+ if (string const s= getEntry(R"(Microsoft\Windows\CurrentVersion\App Paths\Asymptote\Path)"); !s.empty())
+ {
+ docdir= s;
+ }
// An empty systemDir indicates a TeXLive build
if(!systemDir.empty() && !docdir.empty())
systemDir=docdir;
@@ -211,15 +322,13 @@ void queryRegistry()
#endif
-const char PROGRAM[]=PACKAGE_NAME;
-const char VERSION[]=PACKAGE_VERSION;
-const char BUGREPORT[]=PACKAGE_BUGREPORT;
-
// The name of the program (as called). Used when displaying help info.
char *argv0;
-// The verbosity setting, a global variable.
Int verbose;
+bool debug;
+bool xasy;
+
bool quiet=false;
// Conserve memory at the expense of speed.
@@ -281,7 +390,7 @@ void Warn(const string& s)
bool warn(const string& s)
{
- if(getSetting<bool>("debug")) return true;
+ if(debug) return true;
array *Warn=getSetting<array *>("suppress");
size_t size=checkArray(Warn);
for(size_t i=0; i < size; i++)
@@ -896,7 +1005,7 @@ void addOption(option *o) {
void version()
{
- cerr << PROGRAM << " version " << REVISION
+ cerr << PACKAGE_NAME << " version " << REVISION
<< " [(C) 2004 Andy Hammerlindl, John C. Bowman, Tom Prince]"
<< endl;
}
@@ -1052,7 +1161,7 @@ struct versionOption : public option {
feature("LSP Language Server Protocol",lsp);
feature("Readline Interactive history and editing",readline);
if(!readline)
- feature("Editline interactive editing (if Readline is unavailable)",editline);
+ feature("Editline interactive editing (Readline is unavailable)",editline);
feature("Sigsegv Distinguish stack overflows from segmentation faults",
sigsegv);
feature("GC Boehm garbage collector",usegc);
@@ -1194,7 +1303,9 @@ array* stringArray(const char **s)
void initSettings() {
static bool initialize=true;
if(initialize) {
+#if defined(_WIN32)
queryRegistry();
+#endif
initialize=false;
}
@@ -1321,7 +1432,7 @@ void initSettings() {
"Center, Bottom, Top, or Zero page alignment",
"C"));
- addOption(new boolSetting("debug", 'd', "Enable debugging messages"));
+ addOption(new boolrefSetting("debug", 'd', "Enable debugging messages and traceback",&debug));
addOption(new incrementSetting("verbose", 'v',
"Increase verbosity level (can specify multiple times)", &verbose));
// Resolve ambiguity with --version
@@ -1393,13 +1504,11 @@ void initSettings() {
addOption(new stringOption("cd", 0, "directory", "Set current directory",
&startpath));
-#ifdef USEGC
addOption(new compactSetting("compact", 0,
"Conserve memory at the expense of speed",
&compact));
addOption(new divisorOption("divisor", 0, "n",
"Garbage collect using purge(divisor=n) [2]"));
-#endif
addOption(new stringSetting("prompt", 0,"str","Prompt","> "));
addOption(new stringSetting("prompt2", 0,"str",
@@ -1407,13 +1516,12 @@ void initSettings() {
".."));
addOption(new boolSetting("multiline", 0,
"Input code over multiple lines at the prompt"));
- addOption(new boolSetting("xasy", 0,
- "Interactive mode for xasy"));
-#ifdef HAVE_LSP
+ addOption(new boolrefSetting("xasy", 0,
+ "Interactive mode for xasy",&xasy));
+
addOption(new boolSetting("lsp", 0, "Interactive mode for the Language Server Protocol"));
addOption(new envSetting("lspport", ""));
addOption(new envSetting("lsphost", "127.0.0.1"));
-#endif
addOption(new boolSetting("wsl", 0, "Run asy under the Windows Subsystem for Linux"));
@@ -1531,21 +1639,29 @@ char *getArg(int n) { return argList[n]; }
void setInteractive()
{
- bool xasy=getSetting<bool>("xasy");
if(xasy && getSetting<Int>("outpipe") < 0) {
cerr << "Missing outpipe." << endl;
exit(-1);
}
+ bool lspmode=getSetting<bool>("lsp");
+
if(numArgs() == 0 && !getSetting<bool>("listvariables") &&
getSetting<string>("command").empty() &&
- (isatty(STDIN_FILENO) || xasy || getSetting<Int>("lsp")))
+ (isatty(STDIN_FILENO) || xasy || lspmode))
interact::interactive=true;
if(getSetting<bool>("localhistory"))
historyname=string(getPath())+dirsep+"."+suffix+"_history";
else {
- if(mkdir(initdir.c_str(),0777) != 0 && errno != EEXIST)
+#if defined(_WIN32)
+ bool mkdirResult = CreateDirectoryA(initdir.c_str(), nullptr);
+ bool mkdirSuccess = mkdirResult || GetLastError() == ERROR_ALREADY_EXISTS;
+#else
+ int mkdirResult = mkdir(initdir.c_str(),0777);
+ bool mkdirSuccess = mkdirResult == 0 || errno == EEXIST;
+#endif
+ if(!mkdirSuccess)
cerr << "failed to create directory "+initdir+"." << endl;
historyname=initdir+"/history";
}
@@ -1618,12 +1734,14 @@ void initDir() {
if(initdir.empty())
initdir=Getenv(HOME.c_str(),msdos)+dirsep+"."+suffix;
-#ifdef __MSDOS__
- mask=umask(0);
- if(mask == 0) mask=0027;
- umask(mask);
+#if defined(_WIN32)
+ DWORD dirAttrib = GetFileAttributesA(initdir.c_str());
+ bool dirExists = dirAttrib != INVALID_FILE_ATTRIBUTES && ((dirAttrib & FILE_ATTRIBUTE_DIRECTORY) != 0);
+#else
+ bool dirExists = access(initdir.c_str(),F_OK) == 0;
#endif
- if(access(initdir.c_str(),F_OK) == 0) {
+
+ if(dirExists) {
if(!quiet && verbose > 1)
cerr << "Using configuration directory " << initdir << endl;
}
@@ -1641,7 +1759,14 @@ void setPath() {
}
if(i < asydir.length()) searchPath.push_back(asydir.substr(i));
}
- if(access(initdir.c_str(),F_OK) == 0)
+#if defined(_WIN32)
+ DWORD dirAttrib = GetFileAttributesA(initdir.c_str());
+ bool dirExists = dirAttrib != INVALID_FILE_ATTRIBUTES && ((dirAttrib & FILE_ATTRIBUTE_DIRECTORY) != 0);
+#else
+ bool dirExists = access(initdir.c_str(),F_OK) == 0;
+#endif
+
+ if(dirExists)
searchPath.push_back(initdir);
string sysdir=getSetting<string>("sysdir");
if(sysdir != "")
@@ -1812,7 +1937,7 @@ Int getScroll()
if(!terminal)
terminal=getenv("TERM");
if(terminal) {
-#ifndef __MSDOS__
+#if defined(USE_SETUPTERM)
int error=setupterm(terminal,1,&error);
if(error == 0) scroll=lines > 2 ? lines-1 : 1;
else
@@ -1886,10 +2011,10 @@ void setOptions(int argc, char *argv[])
docdir=getSetting<string>("dir");
#ifdef USEGC
- if(verbose == 0 && !getSetting<bool>("debug")) GC_set_warn_proc(no_GCwarn);
+ if(verbose == 0 && !debug) GC_set_warn_proc(no_GCwarn);
#endif
- if(setlocale (LC_ALL, "") == NULL && getSetting<bool>("debug"))
+ if(setlocale (LC_ALL, "") == NULL && debug)
perror("setlocale");
// Set variables for the file arguments.
diff --git a/graphics/asymptote/settings.h b/graphics/asymptote/settings.h
index 6d55aae962..0b2d9b330f 100644
--- a/graphics/asymptote/settings.h
+++ b/graphics/asymptote/settings.h
@@ -39,10 +39,6 @@ void endwait(pthread_cond_t& signal, pthread_mutex_t& lock);
}
namespace settings {
-extern const char PROGRAM[];
-extern const char VERSION[];
-extern const char BUGREPORT[];
-
extern char *argv0;
void Warn(const string& s);
@@ -75,7 +71,11 @@ inline T getSetting(string name)
return vm::get<T>(Setting(name));
}
+// Global settings accessible as variables
+
extern Int verbose;
+extern bool debug;
+extern bool xasy;
extern bool compact;
extern bool gray;
extern bool bw;
@@ -94,7 +94,9 @@ char *getArg(int n);
Int getScroll();
+#if !defined(_MSC_VER)
extern mode_t mask;
+#endif
bool xe(const string& texengine);
bool lua(const string& texengine);
diff --git a/graphics/asymptote/shaders.cc b/graphics/asymptote/shaders.cc
index e1e08a45de..117bbb25de 100644
--- a/graphics/asymptote/shaders.cc
+++ b/graphics/asymptote/shaders.cc
@@ -19,7 +19,7 @@ int GLSLversion;
GLuint compileAndLinkShader(std::vector<ShaderfileModePair> const& shaders,
std::vector<std::string> const& defineflags,
- bool ssbo, bool interlock, bool compute)
+ bool ssbo, bool interlock, bool compute, bool test)
{
GLuint shader = glCreateProgram();
std::vector<GLuint> compiledShaders;
@@ -27,8 +27,8 @@ GLuint compileAndLinkShader(std::vector<ShaderfileModePair> const& shaders,
size_t n=shaders.size();
for(size_t i=0; i < n; ++i) {
GLint newshader=createShaderFile(shaders[i].first,shaders[i].second,
- defineflags,ssbo,interlock,compute);
- if((ssbo || interlock || compute) && newshader == 0) return 0;
+ defineflags,ssbo,interlock,compute,test);
+ if(test && newshader == 0) return 0;
glAttachShader(shader,newshader);
compiledShaders.push_back(newshader);
}
@@ -53,7 +53,7 @@ GLuint compileAndLinkShader(std::vector<ShaderfileModePair> const& shaders,
GLuint createShader(const std::string& src, int shaderType,
const std::string& filename, bool ssbo, bool interlock,
- bool compute)
+ bool compute, bool test)
{
const GLchar *source=src.c_str();
GLuint shader=glCreateShader(shaderType);
@@ -64,7 +64,7 @@ GLuint createShader(const std::string& src, int shaderType,
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
if(status != GL_TRUE) {
- if(ssbo || interlock || compute) return 0;
+ if(test) return 0;
GLint length;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
@@ -90,7 +90,7 @@ GLuint createShader(const std::string& src, int shaderType,
GLuint createShaderFile(std::string file, int shaderType,
std::vector<std::string> const& defineflags,
- bool ssbo, bool interlock, bool compute)
+ bool ssbo, bool interlock, bool compute, bool test)
{
std::ifstream shaderFile;
shaderFile.open(file.c_str());
@@ -124,6 +124,7 @@ GLuint createShaderFile(std::string file, int shaderType,
exit(-1);
}
- return createShader(shaderSrc.str(),shaderType,file,ssbo,interlock,compute);
+ return createShader(shaderSrc.str(),shaderType,file,ssbo,interlock,compute,
+ test);
}
#endif
diff --git a/graphics/asymptote/shaders.h b/graphics/asymptote/shaders.h
index 1ff831d997..9546ce198e 100644
--- a/graphics/asymptote/shaders.h
+++ b/graphics/asymptote/shaders.h
@@ -2,19 +2,7 @@
#define __TOGL_SHADERSPROC
#define GLEW_NO_GLU
-
-#ifdef __MSDOS__
-#define GLEW_STATIC
-#define _WIN32
-#endif
-
-#include "GL/glew.h"
-
-#ifdef __MSDOS__
-#undef _WIN32
-#include <GL/wglew.h>
-#include <GL/wglext.h>
-#endif
+#include <GL/glew.h>
#include <string>
@@ -25,11 +13,11 @@ typedef std::pair<std::string, int> ShaderfileModePair;
GLuint compileAndLinkShader(
std::vector<ShaderfileModePair> const& shaders,
std::vector<std::string> const& defineflags, bool ssbo=true,
- bool interlock=false, bool compute=false);
+ bool interlock=false, bool compute=false, bool test=false);
GLuint createShaderFile(std::string file, int shaderType,
std::vector<std::string> const& constflags,
- bool ssbo, bool interlock, bool compute);
+ bool ssbo, bool interlock, bool compute, bool test);
enum attrib {positionAttrib=0,normalAttrib,materialAttrib,colorAttrib,
widthAttrib};
diff --git a/graphics/asymptote/stack.cc b/graphics/asymptote/stack.cc
index 3623e666cb..1158061812 100644
--- a/graphics/asymptote/stack.cc
+++ b/graphics/asymptote/stack.cc
@@ -14,7 +14,7 @@
#include "errormsg.h"
#include "util.h"
#include "runtime.h"
-#include "process.h"
+#include "asyprocess.h"
#include "profiler.h"
@@ -159,10 +159,10 @@ void stack::marshall(size_t args, stack::vars_t vars)
#ifdef PROFILE
#ifndef DEBUG_FRAME
-#warning "profiler needs DEBUG_FRAME for function names"
+#pragma message("WARNING: profiler needs DEBUG_FRAME for function names")
#endif
#ifndef DEBUG_BLTIN
-#warning "profiler needs DEBUG_BLTIN for builtin function names"
+#pragma message("WARNING: profiler needs DEBUG_BLTIN for builtin function names")
#endif
profiler prof;
@@ -342,14 +342,16 @@ void stack::runWithOrWithoutClosure(lambda *l, vars_t vars, vars_t parent)
string& fileName=P.fileName;
unsigned int offset=P.xmapCount;
+ bool traceless=!settings::debug;
+ bool xasy=settings::debug || offset;
+ if(xasy && curPos.filename() == fileName)
+ topPos=curPos.shift(offset);
+
try {
for (;;) {
const inst &i = *ip;
curPos = i.pos;
- if(curPos.filename() == fileName)
- topPos=curPos.shift(offset);
-
#ifdef PROFILE
prof.recordInstruction();
#endif
@@ -520,8 +522,18 @@ void stack::runWithOrWithoutClosure(lambda *l, vars_t vars, vars_t parent)
case inst::popcall: {
/* get the function reference off of the stack */
+ if(xasy && curPos.filename() == fileName)
+ topPos=curPos.shift(offset);
+
callable* f = pop<callable*>();
- f->call(this);
+ if(traceless)
+ f->call(this);
+ else {
+ em.traceback.push_back(curPos);
+ f->call(this);
+ if(em.traceback.size())
+ em.traceback.pop_back();
+ }
break;
}
@@ -555,9 +567,12 @@ void stack::runWithOrWithoutClosure(lambda *l, vars_t vars, vars_t parent)
#undef FRAMEVAR
}
-void stack::load(string index) {
+void stack::loadModule(string index, Int numPushedParents) {
vmFrame *inst=instMap[index];
if (inst) {
+ for (Int i = 0; i < numPushedParents; ++i) {
+ pop();
+ }
push(inst);
}
else {
@@ -649,7 +664,7 @@ void errornothrow(const char* message)
{
em.error(curPos);
em << message;
- em.sync();
+ em.sync(true);
}
void error(const char* message)
diff --git a/graphics/asymptote/stack.h b/graphics/asymptote/stack.h
index 0522f6bb98..cd7524d553 100644
--- a/graphics/asymptote/stack.h
+++ b/graphics/asymptote/stack.h
@@ -108,7 +108,7 @@ public:
// Put an import (indexed by filename and optional template
// parameter signature) on top of the stack, initializing it if necessary.
- void load(string index);
+ void loadModule(string index, Int numPushedParents = 0);
// These are so that built-in functions can easily manipulate the stack
void push(item next) {
diff --git a/graphics/asymptote/stm.cc b/graphics/asymptote/stm.cc
index 17461a01d2..de60c9d5ef 100644
--- a/graphics/asymptote/stm.cc
+++ b/graphics/asymptote/stm.cc
@@ -42,12 +42,7 @@ void blockStm::prettyprint(ostream &out, Int indent)
base->prettyprint(out, indent+1);
}
-void blockStm::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- base->createSymMap(symContext->newContext(getPos().LineColumn()));
-#endif
-}
+
void expStm::prettyprint(ostream &out, Int indent)
{
@@ -134,7 +129,7 @@ void tryToWriteExp(coenv &e, exp *expr)
if (t->kind == ty_overloaded) {
// Translate the expr in order to print the ambiguity error first.
expr->trans(e);
- em.sync();
+ em.sync(true);
assert(em.errors());
// Then, write out all of the types.
@@ -176,11 +171,6 @@ void expStm::interactiveTrans(coenv &e)
baseExpTrans(e, body);
}
-void expStm::createSymMap(AsymptoteLsp::SymbolContext* symContext) {
-#ifdef HAVE_LSP
- body->createSymMap(symContext);
-#endif
-}
void ifStm::prettyprint(ostream &out, Int indent)
@@ -216,18 +206,6 @@ void ifStm::trans(coenv &e)
e.c.defLabel(end);
}
- void ifStm::createSymMap(AsymptoteLsp::SymbolContext* symContext)
- {
-#ifdef HAVE_LSP
- test->createSymMap(symContext);
- onTrue->createSymMap(symContext);
-
- if (onFalse)
- {
- onFalse->createSymMap(symContext);
- }
-#endif
- }
void transLoopBody(coenv &e, stm *body) {
@@ -298,24 +276,6 @@ void whileStm::trans(coenv &e)
e.c.popLoop();
}
-void whileStm::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- // while (<xyz>) { <body> }
- // the <xyz> part belongs in the main context as the while statement,
- // as it cannot declare new variables and only knows the symbols from that context.
-
- test->createSymMap(symContext);
-
- // for the body part, { <body> } are encapsulated in
- // the blockStm, while <body> are direct statements.
- // If the while block does not use { <body> }, then the body
- // can be considered the same context as it cannot declare new variables and again, can
- // only uses the variable already known before this while statement.
-
- body->createSymMap(symContext);
-#endif
-}
void doStm::prettyprint(ostream &out, Int indent)
@@ -345,15 +305,6 @@ void doStm::trans(coenv &e)
e.c.popLoop();
}
-void doStm::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- body->createSymMap(symContext);
- test->createSymMap(symContext);
-#endif
-}
-
-
void forStm::prettyprint(ostream &out, Int indent)
{
prettyname(out,"forStm",indent, getPos());
@@ -395,27 +346,7 @@ void forStm::trans(coenv &e)
e.e.endScope();
}
-void forStm::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- AsymptoteLsp::SymbolContext* ctx(symContext);
- if (init)
- {
- auto* declCtx(symContext->newContext(getPos().LineColumn()));
- init->createSymMap(declCtx);
- ctx = declCtx;
- }
- if (test)
- {
- test->createSymMap(ctx);
- }
- if (update)
- {
- update->createSymMap(ctx);
- }
- body->createSymMap(ctx);
-#endif
-}
+
void extendedForStm::prettyprint(ostream &out, Int indent)
{
@@ -495,26 +426,7 @@ void extendedForStm::trans(coenv &e) {
new blockStm(pos, &b)).trans(e);
}
-void extendedForStm::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- auto* declCtx(symContext->newContext(getPos().LineColumn()));
-
- std::string varName(var);
-
- // FIXME: How do we get the position of the actual variable name?
- // Right now, we only get the starting position of the type declaration
- declCtx->symMap.varDec.emplace(std::piecewise_construct,
- std::forward_as_tuple(varName),
- std::forward_as_tuple(
- varName,
- static_cast<std::string>(*start),
- start->getPos().LineColumn()
- ));
- set->createSymMap(symContext);
- body->createSymMap(declCtx);
-#endif
-}
+
void breakStm::prettyprint(ostream &out, Int indent)
@@ -580,15 +492,6 @@ void returnStm::trans(coenv &e)
e.c.encode(inst::ret);
}
-void returnStm::createSymMap(AsymptoteLsp::SymbolContext* symContext)
-{
-#ifdef HAVE_LSP
- if (value)
- {
- value->createSymMap(symContext);
- }
-#endif
-}
void stmExpList::prettyprint(ostream &out, Int indent)
diff --git a/graphics/asymptote/template_rev.cc.in b/graphics/asymptote/template_rev.cc.in
new file mode 100644
index 0000000000..2f46560480
--- /dev/null
+++ b/graphics/asymptote/template_rev.cc.in
@@ -0,0 +1,4 @@
+// This file is automatically generated; do not modify manually
+
+char const* REVISION="${ASY_VERSION}";
+char const* AsyGLVersion="${ASY_GL_VERSION}";
diff --git a/graphics/asymptote/test-driver b/graphics/asymptote/test-driver
new file mode 100755
index 0000000000..be73b80adf
--- /dev/null
+++ b/graphics/asymptote/test-driver
@@ -0,0 +1,153 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 2011-2021 Free Software Foundation, Inc.
+#
+# 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
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+# Make unconditional expansion of undefined variables an error. This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+ echo "$0: $*" >&2
+ print_usage >&2
+ exit 2
+}
+
+print_usage ()
+{
+ cat <<END
+Usage:
+ test-driver --test-name NAME --log-file PATH --trs-file PATH
+ [--expect-failure {yes|no}] [--color-tests {yes|no}]
+ [--enable-hard-errors {yes|no}] [--]
+ TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+See the GNU Automake documentation for information.
+END
+}
+
+test_name= # Used for reporting.
+log_file= # Where to save the output of the test script.
+trs_file= # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+ case $1 in
+ --help) print_usage; exit $?;;
+ --version) echo "test-driver $scriptversion"; exit $?;;
+ --test-name) test_name=$2; shift;;
+ --log-file) log_file=$2; shift;;
+ --trs-file) trs_file=$2; shift;;
+ --color-tests) color_tests=$2; shift;;
+ --expect-failure) expect_failure=$2; shift;;
+ --enable-hard-errors) enable_hard_errors=$2; shift;;
+ --) shift; break;;
+ -*) usage_error "invalid option: '$1'";;
+ *) break;;
+ esac
+ shift
+done
+
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file" = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file" = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+ usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+ usage_error "missing argument"
+fi
+
+if test $color_tests = yes; then
+ # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+ red='' # Red.
+ grn='' # Green.
+ lgn='' # Light green.
+ blu='' # Blue.
+ mgn='' # Magenta.
+ std='' # No color.
+else
+ red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here. We create the file first, then append to it,
+# to ameliorate tests themselves also writing to the log file. Our tests
+# don't, but others can (automake bug#35762).
+: >"$log_file"
+"$@" >>"$log_file" 2>&1
+estatus=$?
+
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+ tweaked_estatus=1
+else
+ tweaked_estatus=$estatus
+fi
+
+case $tweaked_estatus:$expect_failure in
+ 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+ 0:*) col=$grn res=PASS recheck=no gcopy=no;;
+ 77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
+ 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
+ *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
+ *:*) col=$red res=FAIL recheck=yes gcopy=yes;;
+esac
+
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>"$log_file"
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/graphics/asymptote/tests/arith/integer.asy b/graphics/asymptote/tests/arith/integer.asy
index 5433f345bc..004fe0935f 100644
--- a/graphics/asymptote/tests/arith/integer.asy
+++ b/graphics/asymptote/tests/arith/integer.asy
@@ -22,6 +22,16 @@ assert(1#-2 == -1);
assert(-1#-2 == 0);
assert(-3#2 == -2);
EndTest();
+StartTest("integer mod");
+assert(12%5 == 2);
+assert(-12%5 == 3);
+assert(12%-5 == -3);
+assert(-12%-5 == -2);
+assert(13%4 == 1);
+assert(-13%4 == 3);
+assert(13%-4 == -3);
+assert(-13%-4 == -1);
+EndTest();
StartTest("integer self ops");
{ int x=3; assert(++x == 4); assert(x == 4); }
{ int x=3; assert(--x == 2); assert(x == 2); }
diff --git a/graphics/asymptote/tests/arith/pair.asy b/graphics/asymptote/tests/arith/pair.asy
index c815f28b2f..a846859e51 100644
--- a/graphics/asymptote/tests/arith/pair.asy
+++ b/graphics/asymptote/tests/arith/pair.asy
@@ -1,20 +1,20 @@
import TestLib;
StartTest("complex addition");
-assert((1,0)+(0,1)==(1,1));
+assert((1,0)+(0,1) == (1,1));
EndTest();
StartTest("complex subtraction");
-assert((1,0)-(0,1)==(1,-1));
+assert((1,0)-(0,1) == (1,-1));
EndTest();
StartTest("complex multiplication");
-assert((1,2)*(2,1)==(0,5));
+assert((1,2)*(2,1) == (0,5));
EndTest();
StartTest("complex division");
-assert((0,5)/(2,1)==(1,2));
+assert((0,5)/(2,1) == (1,2));
EndTest();
StartTest("length(pair)");
assert(length((0.0,1.0)) == 1.0);
EndTest();
StartTest("conj()");
-assert(conj((0.0,1.0))==(0.0, -1.0));
+assert(conj((0.0,1.0)) == (0.0,-1.0));
EndTest();
diff --git a/graphics/asymptote/tests/arith/real.asy b/graphics/asymptote/tests/arith/real.asy
index 1628258cf8..8f874fb3c0 100644
--- a/graphics/asymptote/tests/arith/real.asy
+++ b/graphics/asymptote/tests/arith/real.asy
@@ -16,3 +16,9 @@ EndTest();
StartTest("real division");
assert((4.0/2.0) == (2.0));
EndTest();
+StartTest("real mod");
+assert((12.0%5.0) == (2.0));
+assert((-12.0%5.0) == (3.0));
+assert((12.0%-5.0) == (-3.0));
+assert((-12.0%-5.0) == (-2.0));
+EndTest();
diff --git a/graphics/asymptote/tests/imp/imports/A.asy b/graphics/asymptote/tests/imp/imports/A.asy
new file mode 100644
index 0000000000..afa1a9cb85
--- /dev/null
+++ b/graphics/asymptote/tests/imp/imports/A.asy
@@ -0,0 +1,3 @@
+struct B {
+ static int x=4;
+} \ No newline at end of file
diff --git a/graphics/asymptote/tests/imp/unravel.asy b/graphics/asymptote/tests/imp/unravel.asy
index 0f61326fd6..338bc37951 100644
--- a/graphics/asymptote/tests/imp/unravel.asy
+++ b/graphics/asymptote/tests/imp/unravel.asy
@@ -92,4 +92,22 @@ StartTest("unravel");
from A.B unravel x;
assert(x==4);
}
+{
+ struct A {
+ static struct B {
+ static int x=4;
+ }
+ }
+ int x=3;
+ from A unravel B;
+ from B unravel x;
+ assert(x==4);
+}
+{
+ access 'imp/imports/A' as A;
+ int x=3;
+ from A unravel B;
+ from B unravel x;
+ assert(x==4);
+}
EndTest();
diff --git a/graphics/asymptote/tests/io/data1.txt b/graphics/asymptote/tests/io/data1.txt
new file mode 100644
index 0000000000..4de62dfc0c
--- /dev/null
+++ b/graphics/asymptote/tests/io/data1.txt
@@ -0,0 +1,3 @@
+10
+0 1 2 3 4 5 6 7
+8 9
diff --git a/graphics/asymptote/tests/io/data2.txt b/graphics/asymptote/tests/io/data2.txt
new file mode 100644
index 0000000000..506f173605
--- /dev/null
+++ b/graphics/asymptote/tests/io/data2.txt
@@ -0,0 +1,5 @@
+2 3
+0
+1
+2 3
+4 5
diff --git a/graphics/asymptote/tests/io/data3.txt b/graphics/asymptote/tests/io/data3.txt
new file mode 100644
index 0000000000..9e6cb8c31f
--- /dev/null
+++ b/graphics/asymptote/tests/io/data3.txt
@@ -0,0 +1,3 @@
+2 3 4
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
+19 20 21 22 23 24
diff --git a/graphics/asymptote/tests/io/read.asy b/graphics/asymptote/tests/io/read.asy
new file mode 100644
index 0000000000..de6fc9928f
--- /dev/null
+++ b/graphics/asymptote/tests/io/read.asy
@@ -0,0 +1,71 @@
+import TestLib;
+
+StartTest("read1");
+{
+ file fin=input("io/data1.txt").read(1);
+ real[] a=fin;
+ assert(a.length == 10);
+ int c=-1;
+ for(int i=0; i < a.length; ++i)
+ assert(a[i] == ++c);
+ seek(fin,0);
+ real[] b=fin.line();
+ assert(b[0] == a.length);
+ real[] b=fin.line();
+ c=-1;
+ for(int i=0; i < b.length; ++i)
+ assert(b[i] == ++c);
+ seek(fin,0);
+ real nx=fin;
+ real[] b=fin.dimension(5);
+ c=-1;
+ for(int i=0; i < 5; ++i)
+ assert(b[i] == ++c);
+}
+EndTest();
+
+StartTest("read2");
+{
+ file fin=input("io/data2.txt").read(2);
+ real[][] a=fin;
+ assert(a.length == 2);
+ assert(a[0].length == 3);
+ int c=-1;
+ for(int i=0; i < a.length; ++i)
+ for(int j=0; j < a[0].length; ++j)
+ assert(a[i][j] == ++c);
+ seek(fin,0);
+ real nx=fin;
+ real ny=fin;
+ c=-1;
+ real[][] b=fin.dimension(a.length,a[0].length);
+ for(int i=0; i < a.length; ++i)
+ for(int j=0; j < a[0].length; ++j)
+ assert(b[i][j] == ++c);
+}
+EndTest();
+
+StartTest("read3");
+{
+ file fin=input("io/data3.txt").read(3);
+ real[][][] a=fin;
+ assert(a.length == 2);
+ assert(a[0].length == 3);
+ assert(a[0][0].length == 4);
+ int c=-1;
+ for(int i=0; i < a.length; ++i)
+ for(int j=0; j < a[0].length; ++j)
+ for(int k=0; k < a[0][0].length; ++k)
+ assert(a[i][j][k] == ++c);
+ seek(fin,0);
+ real nx=fin;
+ real ny=fin;
+ real nz=fin;
+ real[][][] b=fin.dimension(a.length,a[0].length,a[0][0].length);
+ c=-1;
+ for(int i=0; i < a.length; ++i)
+ for(int j=0; j < a[0].length; ++j)
+ for(int k=0; k < a[0][0].length; ++k)
+ assert(b[i][j][k] == ++c);
+}
+EndTest();
diff --git a/graphics/asymptote/tests/template/imports/Cpass.asy b/graphics/asymptote/tests/template/imports/Cpass.asy
new file mode 100644
index 0000000000..69c4094777
--- /dev/null
+++ b/graphics/asymptote/tests/template/imports/Cpass.asy
@@ -0,0 +1,3 @@
+typedef import(T);
+
+from 'template/imports/C'(T=T) access global; \ No newline at end of file
diff --git a/graphics/asymptote/tests/template/imports/notTemplate.asy b/graphics/asymptote/tests/template/imports/notTemplate.asy
index bd309b07ba..f30615465a 100644
--- a/graphics/asymptote/tests/template/imports/notTemplate.asy
+++ b/graphics/asymptote/tests/template/imports/notTemplate.asy
@@ -1,4 +1,5 @@
struct A {
static int global = 17;
int local = 3;
+ autounravel int au = -1;
} \ No newline at end of file
diff --git a/graphics/asymptote/tests/template/imports/structTemplate.asy b/graphics/asymptote/tests/template/imports/structTemplate.asy
index 5894d2e280..682a2b06d8 100644
--- a/graphics/asymptote/tests/template/imports/structTemplate.asy
+++ b/graphics/asymptote/tests/template/imports/structTemplate.asy
@@ -1,5 +1,6 @@
-// Assumption: T is a struct with a static int `global` and a non-static int
-// `local`. Lib is a struct with a static string `testName`.
+// Assumption: T is a struct with a static int `global`, a non-static int
+// `local`, and an autounravel int `au`. The value of T.au is -1. Lib is a
+// struct with a static string `testName`.
typedef import(T, Lib);
import TestLib;
@@ -34,3 +35,37 @@ EndTest();
StartTest(Lib.testName + ': Access static member from instance');
int f = c.global;
EndTest();
+
+StartTest(Lib.testName + ': Unraveling and accessing static member');
+from T unravel global;
+int g = global;
+EndTest();
+
+StartTest(Lib.testName + ': Access autounravel member');
+assert(au == -1);
+assert(T.au == -1);
+assert(c.au == -1);
+au = -2;
+assert(au == -2);
+assert(T.au == -2);
+assert(c.au == -2);
+T.au = -3;
+assert(au == -3);
+assert(T.au == -3);
+assert(c.au == -3);
+c.au = -4;
+assert(au == -4);
+assert(T.au == -4);
+assert(c.au == -4);
+au = -1; // Reset for next test
+EndTest();
+
+StartTest(Lib.testName + ': Equality, inequality, and alias');
+T h = new T;
+assert(h == h);
+assert(!(h == null));
+assert(h != null);
+assert(!(h != h));
+assert(alias(h, h));
+assert(!alias(h, null));
+EndTest(); \ No newline at end of file
diff --git a/graphics/asymptote/tests/template/initTest.asy b/graphics/asymptote/tests/template/initTest.asy
index 7def279138..c5d0ba2d3a 100644
--- a/graphics/asymptote/tests/template/initTest.asy
+++ b/graphics/asymptote/tests/template/initTest.asy
@@ -11,13 +11,11 @@ EndTest();
StartTest("new");
struct X {
- struct A {
+ static struct A {
int x=1;
}
}
-X x;
-
-access "template/imports/C"(T=x.A) as p;
+access "template/imports/C"(T=X.A) as p;
EndTest();
diff --git a/graphics/asymptote/tests/template/nestedImport.asy b/graphics/asymptote/tests/template/nestedImport.asy
new file mode 100644
index 0000000000..2e0af81f10
--- /dev/null
+++ b/graphics/asymptote/tests/template/nestedImport.asy
@@ -0,0 +1,7 @@
+import TestLib;
+
+StartTest('nested_import');
+struct A { int x = 1; }
+access 'template/imports/Cpass'(T=A) as module;
+assert(module.global == 17);
+EndTest(); \ No newline at end of file
diff --git a/graphics/asymptote/tests/template/structTest.asy b/graphics/asymptote/tests/template/structTest.asy
index e961397e9f..668b1fb006 100644
--- a/graphics/asymptote/tests/template/structTest.asy
+++ b/graphics/asymptote/tests/template/structTest.asy
@@ -4,6 +4,7 @@ struct BareStruct {
struct A {
static int global = 17;
int local = 3;
+ autounravel int au = -1;
}
access 'template/imports/structTemplate'(T=A, Lib=BareStruct) as bareStruct;
@@ -14,33 +15,22 @@ struct B {
static struct C {
static int global = 17;
int local = 3;
+ autounravel int au = -1;
}
}
access 'template/imports/structTemplate'(T=B.C, Lib=NestedStruct)
as nestedStruct;
-struct InnerStruct {
- static string testName = "inner struct";
-}
-struct D {
- struct E {
- static int global = 17;
- int local = 3;
- }
-}
-D d;
-access 'template/imports/structTemplate'(T=d.E, Lib=InnerStruct)
- as innerStruct;
-
struct DeeplyNestedStruct {
static string testName = "deeply nested struct";
}
struct G {
- struct H {
+ static struct H {
static struct I {
static int global = 17;
int local = 3;
+ autounravel int au = -1;
}
}
}
diff --git a/graphics/asymptote/tests/types/autounravel.asy b/graphics/asymptote/tests/types/autounravel.asy
new file mode 100644
index 0000000000..30270f7349
--- /dev/null
+++ b/graphics/asymptote/tests/types/autounravel.asy
@@ -0,0 +1,172 @@
+import TestLib;
+
+StartTest('autounravel: struct declaration');
+{
+ struct A {
+ autounravel int x = -1;
+ }
+ assert(x == -1);
+ assert(A.x == -1);
+ x = -2;
+ assert(A.x == -2);
+ A.x = -3;
+ assert(x == -3);
+}
+EndTest();
+
+StartTest('autounravel: typedef');
+{
+ struct B {
+ static struct C {
+ autounravel int y = -1;
+ }
+ }
+ typedef B.C C;
+ assert(y == -1);
+ assert(C.y == -1);
+ y = -2;
+ assert(C.y == -2);
+ C.y = -3;
+ assert(y == -3);
+}
+EndTest();
+
+StartTest('autounravel: unravel *');
+{
+ struct B {
+ static struct C {
+ autounravel int y = -1;
+ }
+ }
+ unravel B;
+ assert(y == -1);
+ assert(C.y == -1);
+ y = -2;
+ assert(C.y == -2);
+ C.y = -3;
+ assert(y == -3);
+}
+EndTest();
+
+StartTest('autounravel: unravel');
+{
+ struct B {
+ static struct C {
+ autounravel int y = -1;
+ }
+ }
+ from B unravel C;
+ assert(y == -1);
+ assert(C.y == -1);
+ y = -2;
+ assert(C.y == -2);
+ C.y = -3;
+ assert(y == -3);
+}
+EndTest();
+
+StartTest('autounravel: field is unraveled');
+{
+ struct A {
+ static int z = -1;
+ }
+ struct B {
+ static struct C {
+ autounravel from A unravel z as zz;
+ }
+ }
+ from B unravel C;
+ assert(zz == -1);
+ assert(C.zz == -1);
+ zz = -2;
+ assert(C.zz == -2);
+ assert(A.z == -2);
+ C.zz = -3;
+ assert(zz == -3);
+ assert(A.z == -3);
+ A.z = -4;
+ assert(C.zz == -4);
+ assert(zz == -4);
+}
+EndTest();
+
+StartTest('autounravel: whole struct is unraveled');
+{
+ struct A {
+ static int z = -1;
+ }
+ struct B {
+ static struct C {
+ autounravel unravel A;
+ }
+ }
+ from B unravel C;
+ assert(z == -1);
+ assert(C.z == -1);
+ z = -2;
+ assert(C.z == -2);
+ assert(A.z == -2);
+ C.z = -3;
+ assert(z == -3);
+ assert(A.z == -3);
+ A.z = -4;
+ assert(C.z == -4);
+ assert(z == -4);
+}
+EndTest();
+
+StartTest('autounravel: function');
+{
+ struct B {
+ static struct C {
+ autounravel int y() { return -1; }
+ }
+ }
+ from B unravel C;
+ assert(y() == -1);
+ assert(C.y() == -1);
+ y = new int() { return -2; };
+ assert(C.y() == -2);
+ assert(y() == -2);
+ C.y = new int() { return -3; };
+ assert(y() == -3);
+ assert(C.y() == -3);
+}
+EndTest();
+
+StartTest('autounravel: multiple fields');
+{
+ struct B {
+ static struct C {
+ autounravel int y = -1;
+ autounravel int z = 1;
+ }
+ }
+ from B unravel C;
+ assert(y == -1);
+ assert(C.y == -1);
+ assert(z == 1);
+ assert(C.z == 1);
+ y = -2;
+ assert(C.y == -2);
+ assert(z == 1);
+ assert(C.z == 1);
+ C.z = 2;
+ assert(y == -2);
+ assert(C.y == -2);
+ assert(z == 2);
+ assert(C.z == 2);
+}
+EndTest();
+
+StartTest('autounravel: builtin operators');
+{
+ struct B {
+ static struct C {}
+ }
+ from B unravel C;
+ C x = new C;
+ assert(alias(x, x));
+ assert(!alias(x, null));
+}
+EndTest(); \ No newline at end of file
diff --git a/graphics/asymptote/tests/types/builtinOps.asy b/graphics/asymptote/tests/types/builtinOps.asy
new file mode 100644
index 0000000000..8a92f09c70
--- /dev/null
+++ b/graphics/asymptote/tests/types/builtinOps.asy
@@ -0,0 +1,35 @@
+import TestLib;
+
+{
+ StartTest('builtin record ops: external');
+ struct A {}
+ A a = new A;
+ assert(a == a);
+ assert(alias(a, a));
+ assert(a != null);
+ EndTest();
+}
+
+{
+ StartTest('builtin record ops: internal');
+ struct A {
+ void runTest() {
+ assert(this == this);
+ assert(alias(this, this));
+ assert(this != null);
+ }
+ }
+ (new A).runTest();
+ EndTest();
+}
+
+{
+ StartTest('builtin record ops: nested');
+ struct A {
+ struct B {}
+ }
+ A a;
+ a.B b;
+ from a unravel operator==;
+ assert(b == b);
+} \ No newline at end of file
diff --git a/graphics/asymptote/tests/types/init.asy b/graphics/asymptote/tests/types/init.asy
index 5557bd0676..5382265bd6 100644
--- a/graphics/asymptote/tests/types/init.asy
+++ b/graphics/asymptote/tests/types/init.asy
@@ -1,17 +1,35 @@
import TestLib;
-StartTest("init");
-int operator init() { return 7; }
-int x;
-assert(x==7);
-struct A {
- int x=3;
+{
+ StartTest("init");
+ int operator init() { return 7; }
+ int x;
+ assert(x==7);
+
+ struct A {
+ int x=3;
+ }
+ A a;
+ assert(a!=null);
+ assert(a.x==3);
+
+ A operator init() { return null; }
+ A aa;
+ assert(aa==null);
+ EndTest();
}
-A a;
-assert(a!=null);
-assert(a.x==3);
-A operator init() { return null; }
-A aa;
-assert(aa==null);
-EndTest();
+{
+ StartTest("init autounravel");
+ struct A {
+ int x = 3;
+ autounravel A operator init() {
+ A a = new A;
+ a.x = 17;
+ return a;
+ }
+ }
+ A a;
+ assert(a.x==17);
+ EndTest();
+} \ No newline at end of file
diff --git a/graphics/asymptote/tests/types/overrideEquals.asy b/graphics/asymptote/tests/types/overrideEquals.asy
new file mode 100644
index 0000000000..d2cbbef89c
--- /dev/null
+++ b/graphics/asymptote/tests/types/overrideEquals.asy
@@ -0,0 +1,43 @@
+import TestLib;
+
+StartTest("overrideEquals: external");
+{
+ struct Outer {
+ static struct Inner {}
+ }
+ from Outer unravel Inner;
+ Inner a = new Inner;
+ assert(!(a == null));
+ bool operator ==(Inner a, Inner b) {
+ return true;
+ }
+ assert(a == null);
+ typedef Inner _; // Force autounravel to rerun.
+ // Even if autounravel is rerun, it should not shadow something that was
+ // already shadowed.
+ assert(a == null);
+}
+EndTest();
+
+StartTest('overrideEquals: internal');
+{
+ struct Outer {
+ static struct Inner {
+ autounravel bool operator ==(Inner a, Inner b) {
+ return true;
+ }
+ }
+ }
+ from Outer unravel Inner;
+ Inner a = new Inner;
+ assert(a == null); // Use the overridden operator.
+}
+struct A {
+ static assert((A)null == (A)null);
+ autounravel bool operator ==(A a, A b) {
+ return false;
+ }
+ static assert(!((A)null == (A)null));
+}
+assert(!((A)null == (A)null));
+EndTest(); \ No newline at end of file
diff --git a/graphics/asymptote/texfile.cc b/graphics/asymptote/texfile.cc
index bb8efe5dcc..51a54fac90 100644
--- a/graphics/asymptote/texfile.cc
+++ b/graphics/asymptote/texfile.cc
@@ -477,9 +477,8 @@ void svgtexfile::properties(const pen& p)
const LineType *lastlinetype=lastpen.linetype();
if(!(linetype->pattern == lastlinetype->pattern)) {
- bool xasy=getSetting<bool>("xasy");
auto qtfix=[&](double x) {
- return xasy ? max(x,1.0e-6) : x;
+ return settings::xasy ? max(x,1.0e-6) : x;
};
size_t n=linetype->pattern.size();
if(n > 0) {
diff --git a/graphics/asymptote/texfile.h b/graphics/asymptote/texfile.h
index 7387349c4c..db237424bc 100644
--- a/graphics/asymptote/texfile.h
+++ b/graphics/asymptote/texfile.h
@@ -22,7 +22,7 @@
#include "array.h"
#include "psfile.h"
#include "settings.h"
-#include "process.h"
+#include "asyprocess.h"
namespace camp {
@@ -57,18 +57,21 @@ void latexfontencoding(T& out)
<< "\\makeatother%" << newl;
}
+std::unordered_set const latexCharacters = {'#', '$', '%', '&', '\\', '^', '_', '{', '}', '~'};
+
template<class T>
void texpreamble(T& out, mem::list<string>& preamble=processData().TeXpreamble,
bool pipe=false, bool ASYbox=true)
{
texuserpreamble(out,preamble,pipe);
string texengine=settings::getSetting<string>("tex");
+ string outPath=stripFile(settings::outname());
if(settings::context(texengine))
out << "\\disabledirectives[system.errorcontext]%" << newl;
if(ASYbox)
out << "\\newbox\\ASYbox" << newl
<< "\\newdimen\\ASYdimen" << newl;
- out << "\\def\\ASYprefix{" << stripFile(settings::outname()) << "}" << newl
+ out << "\\def\\ASYprefix{" << escapeCharacters(outPath, latexCharacters) << "}" << newl
<< "\\long\\def\\ASYbase#1#2{\\leavevmode\\setbox\\ASYbox=\\hbox{#1}%"
<< "\\ASYdimen=\\ht\\ASYbox%" << newl
<< "\\setbox\\ASYbox=\\hbox{#2}\\lower\\ASYdimen\\box\\ASYbox}" << newl;
diff --git a/graphics/asymptote/thirdparty_impl/tinyexr_impl/CMakeLists.txt b/graphics/asymptote/thirdparty_impl/tinyexr_impl/CMakeLists.txt
new file mode 100644
index 0000000000..cc47d38225
--- /dev/null
+++ b/graphics/asymptote/thirdparty_impl/tinyexr_impl/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Implementation library for tinyexr
+
+cmake_minimum_required(VERSION 3.27)
+project(tinyexr-impl)
+
+# fetch content
+
+set(TINYEXR_REPO_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../tinyexr" CACHE PATH "Tinyexr repo location")
+add_library(tinyexr-impl src/tinyexr_impl.cc)
+target_include_directories(
+ tinyexr-impl PUBLIC ${TINYEXR_REPO_LOCATION}
+)
+
+# zlib
+find_package(ZLIB REQUIRED)
+if (ZLIB_FOUND)
+ target_compile_definitions(tinyexr-impl PRIVATE HAVE_ZLIB)
+else()
+ message(WARNING "zlib not found; will use miniz")
+endif()
+
+target_link_libraries(tinyexr-impl PRIVATE ZLIB::ZLIB)
diff --git a/graphics/asymptote/thirdparty_impl/tinyexr_impl/src/tinyexr_impl.cc b/graphics/asymptote/thirdparty_impl/tinyexr_impl/src/tinyexr_impl.cc
new file mode 100644
index 0000000000..3a07954036
--- /dev/null
+++ b/graphics/asymptote/thirdparty_impl/tinyexr_impl/src/tinyexr_impl.cc
@@ -0,0 +1,21 @@
+/**
+ * @file tinyexr_impl.cc
+ * @brief Implementation file for tinyexr
+ */
+
+#if defined(HAVE_CONFIG_H)
+#include "config.h"
+#endif
+
+// zlib
+#if defined(HAVE_ZLIB)
+#define TINYEXR_USE_MINIZ 0
+#include <zlib.h>
+#else
+#define TINYEXR_USE_MINIZ 1
+#endif
+
+#define TINYEXR_USE_THREAD 1
+
+#define TINYEXR_IMPLEMENTATION
+#include <tinyexr.h>
diff --git a/graphics/asymptote/tinyexr.cc b/graphics/asymptote/tinyexr.cc
deleted file mode 100644
index 4a50c9d0f2..0000000000
--- a/graphics/asymptote/tinyexr.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
-* @file tinyexr.cc
-* @brief An implementation object file for tinyexr mandated by the repository.
-*
-* On Windows, use vcpkg to install zlib instead of nuget. On Linux, this should work naturally
-*/
-
-#include <zlib.h>
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#define TINYEXR_IMPLEMENTATION
-#define TINYEXR_USE_MINIZ 0
-
-#ifdef HAVE_PTHREAD
-#define TINYEXR_USE_THREAD 1
-#else
-#define TINYEXR_USE_THREAD 0
-#endif
-
-#ifndef HAVE_STRNLEN
-#include <cstring>
-#include <iostream>
-
-inline size_t strnlen(const char *s, size_t maxlen)
-{
- const char *p=(const char *) memchr(s,0,maxlen);
- return p ? p-s : maxlen;
-}
-#endif
-
-#include "cudareflect/tinyexr/tinyexr.h"
diff --git a/graphics/asymptote/cudareflect/tinyexr/CMakeLists.txt b/graphics/asymptote/tinyexr/CMakeLists.txt
index 6d03e7e193..b7f97b0597 100644
--- a/graphics/asymptote/cudareflect/tinyexr/CMakeLists.txt
+++ b/graphics/asymptote/tinyexr/CMakeLists.txt
@@ -42,9 +42,13 @@ target_include_directories(${BUILD_TARGET} PRIVATE ${PROJECT_SOURCE_DIR})
target_link_libraries(${BUILD_TARGET} ${TINYEXR_EXT_LIBRARIES} ${CMAKE_DL_LIBS})
# Increase warning level for clang.
-IF (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- set_source_files_properties(${TINYEXR_SOURCES} PROPERTIES COMPILE_FLAGS "-Weverything -Werror -Wno-padded -Wno-c++98-compat-pedantic -Wno-documentation -Wno-unused-member-function")
-ENDIF ()
+if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT MSVC)
+ set(CLANG_COMPILE_FLAGS "-Weverything -Werror -Wno-padded -Wno-c++98-compat-pedantic -Wno-documentation -Wno-unused-member-function")
+ if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 16)
+ set(CLANG_COMPILE_FLAGS "${CLANG_COMPILE_FLAGS} -Wno-unsafe-buffer-usage")
+ endif()
+ set_source_files_properties(${TINYEXR_SOURCES} PROPERTIES COMPILE_FLAGS ${CLANG_COMPILE_FLAGS})
+endif ()
if (TINYEXR_BUILD_SAMPLE)
diff --git a/graphics/asymptote/tinyexr/Makefile b/graphics/asymptote/tinyexr/Makefile
new file mode 100644
index 0000000000..9e00fb0ea0
--- /dev/null
+++ b/graphics/asymptote/tinyexr/Makefile
@@ -0,0 +1,33 @@
+#CXX ?= clang++
+#CXXFLAGS ?= -fsanitize=address -Werror -Wall -Wextra -g -O0 -DTINYEXR_USE_MINIZ=0 -DTINYEXR_USE_PIZ=0
+#LDFLAGS ?= -lz
+
+# ZFP(experimental)
+#CXXFLAGS += -DTINYEXR_USE_ZFP=1 -I./deps/ZFP/include
+#LDFLAGS += -L./deps/ZFP/lib -lzfp
+
+# nanozlib(experimental)
+#BUILD_NANOZLIB=1
+#CXXFLAGS += -DTINYEXR_USE_NANOZLIB=1 -DTINYEXR_USE_MINIZ=0 -I./deps/nanozlib
+
+ifeq ($(BUILD_NANOZLIB),1)
+else
+ DEPOBJS = miniz.o
+ CFLAGS += -I./deps/miniz
+ CXXFLAGS += -I./deps/miniz
+endif
+
+.PHONY: test clean
+
+all: $(DEPOBJS)
+ $(CXX) $(CXXFLAGS) -o test_tinyexr test_tinyexr.cc $(DEPOBJS) $(LDFLAGS)
+
+miniz.o:
+ $(CC) $(CFLAGS) -c ./deps/miniz/miniz.c
+
+test:
+ ./test_tinyexr asakusa.exr
+
+clean:
+ rm -rf test_tinyexr miniz.o
+
diff --git a/graphics/asymptote/cudareflect/tinyexr/Makefile.gcc-mingw b/graphics/asymptote/tinyexr/Makefile.gcc-mingw
index 44e86ed244..44e86ed244 100644
--- a/graphics/asymptote/cudareflect/tinyexr/Makefile.gcc-mingw
+++ b/graphics/asymptote/tinyexr/Makefile.gcc-mingw
diff --git a/graphics/asymptote/cudareflect/tinyexr/Makefile.gcc-mingw-msys b/graphics/asymptote/tinyexr/Makefile.gcc-mingw-msys
index 28af0e89ae..28af0e89ae 100644
--- a/graphics/asymptote/cudareflect/tinyexr/Makefile.gcc-mingw-msys
+++ b/graphics/asymptote/tinyexr/Makefile.gcc-mingw-msys
diff --git a/graphics/asymptote/cudareflect/tinyexr/Makefile.llvm-mingw b/graphics/asymptote/tinyexr/Makefile.llvm-mingw
index aff5444e1e..aff5444e1e 100644
--- a/graphics/asymptote/cudareflect/tinyexr/Makefile.llvm-mingw
+++ b/graphics/asymptote/tinyexr/Makefile.llvm-mingw
diff --git a/graphics/asymptote/cudareflect/tinyexr/README.md b/graphics/asymptote/tinyexr/README.md
index 92c766a76f..11a3efab59 100644
--- a/graphics/asymptote/cudareflect/tinyexr/README.md
+++ b/graphics/asymptote/tinyexr/README.md
@@ -1,18 +1,23 @@
# Tiny OpenEXR image library.
-[![Total alerts](https://img.shields.io/lgtm/alerts/g/syoyo/tinyexr.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/syoyo/tinyexr/alerts/)
+![Example](https://github.com/syoyo/tinyexr/blob/release/asakusa.png?raw=true)
-![Example](https://github.com/syoyo/tinyexr/blob/master/asakusa.png?raw=true)
-
-[![AppVeyor build status](https://ci.appveyor.com/api/projects/status/k07ftfe4ph057qau/branch/master?svg=true)](https://ci.appveyor.com/project/syoyo/tinyexr/branch/master)
-
-[![Travis build Status](https://travis-ci.org/syoyo/tinyexr.svg)](https://travis-ci.org/syoyo/tinyexr)
+[![AppVeyor build status](https://ci.appveyor.com/api/projects/status/k07ftfe4ph057qau/branch/release?svg=true)](https://ci.appveyor.com/project/syoyo/tinyexr/branch/release)
[![Coverity Scan Build Status](https://scan.coverity.com/projects/5827/badge.svg)](https://scan.coverity.com/projects/5827)
`tinyexr` is a small, single header-only library to load and save OpenEXR (.exr) images.
`tinyexr` is written in portable C++ (no library dependency except for STL), thus `tinyexr` is good to embed into your application.
-To use `tinyexr`, simply copy `tinyexr.h`, `miniz.c` and `miniz.h`(for zlib. You can use system-installed zlib instead of miniz. Controlled with `TINYEXR_USE_MINIZ` compile flag) into your project.
+To use `tinyexr`, simply copy `tinyexr.h`, `miniz.c` and `miniz.h`(for zlib. You can use system-installed zlib instead of miniz, or the zlib implementation included in `stb_image[_write].h`. Controlled with `TINYEXR_USE_MINIZ` and `TINYEXR_USE_STB_ZLIB` compile flags) into your project.
+
+# Security
+
+TinyEXR does not use C++ exception.
+
+TinyEXR now does not use `assert` from v1.0.4(2023/06/04), except for miniz's assert.
+(We plan to use wuff's zlib for better security and performance)
+
+TinyEXR is fuzz tested and **currently no security issues**(No seg fault for any malcious/corrupted input EXR data) as of v1.0.7.
# Features
@@ -32,6 +37,7 @@ Current status of `tinyexr` is:
- [x] Save multi-part image
- [ ] Load multi-part deep image
- [ ] Save multi-part deep image
+ - [ ] deepscanline
- OpenEXR v2 deep image
- [x] Loading scanline + ZIPS + HALF or FLOAT pixel type.
- Compression
@@ -44,6 +50,7 @@ Current status of `tinyexr` is:
- [ ] B44?
- [ ] B44A?
- [ ] PIX24?
+ - [ ] DWA (not planned, patent encumbered)
- Line order.
- [x] Increasing, decreasing (load)
- [ ] Random?
@@ -103,6 +110,8 @@ Current status of `tinyexr` is:
* Filament. PBR engine(used in a converter tool). https://github.com/google/filament
* PyEXR. Loading OpenEXR (.exr) images using Python. https://github.com/ialhashim/PyEXR
* The-Forge. The Forge Cross-Platform Rendering Framework PC, Linux, Ray Tracing, macOS / iOS, Android, XBOX, PS4 https://github.com/ConfettiFX/The-Forge
+* psdr-cuda. Path-space differentiable renderer. https://github.com/uci-rendering/psdr-cuda
+* Studying Microfacets BSDFs https://virtualgonio.pages.xlim.fr/
* Your project here!
## Older TinyEXR (v0.9.0)
@@ -120,7 +129,7 @@ Current status of `tinyexr` is:
* [examples/ldr2exr/](examples/exr2rgbe) LDR to EXR converter
* [examples/exr2ldr/](examples/exr2ldr) EXR to LDR converter
* [examples/exr2fptiff/](examples/exr2fptiff) EXR to 32bit floating point TIFF converter
- * for 32bit floating point TIFF to EXR convert, see https://github.com/syoyo/tinydngloader/tree/master/examples/fptiff2exr
+ * for 32bit floating point TIFF to EXR convert, see https://github.com/syoyo/tinydngloader/tree/release/examples/fptiff2exr
* [examples/cube2longlat/](examples/cube2longlat) Cubemap to longlat (equirectangler) converter
## Experimental
@@ -138,6 +147,9 @@ Include `tinyexr.h` with `TINYEXR_IMPLEMENTATION` flag (do this only for **one**
//including `tinyexr.h` when you disable `TINYEXR_USE_MINIZ`
//#define TINYEXR_USE_MINIZ 0
//#include "zlib.h"
+//Or, if your project uses `stb_image[_write].h`, use their
+//zlib implementation:
+//#define TINYEXR_USE_STB_ZLIB 1
#define TINYEXR_IMPLEMENTATION
#include "tinyexr.h"
```
@@ -145,6 +157,7 @@ Include `tinyexr.h` with `TINYEXR_IMPLEMENTATION` flag (do this only for **one**
### Compile flags
* `TINYEXR_USE_MINIZ` Use miniz (default = 1). Please include `zlib.h` header before `tinyexr.h` if you disable miniz support(e.g. use system's zlib).
+* `TINYEXR_USE_STB_ZLIB` Use zlib from `stb_image[_write].h` instead of miniz or the system's zlib (default = 0).
* `TINYEXR_USE_PIZ` Enable PIZ compression support (default = 1)
* `TINYEXR_USE_ZFP` Enable ZFP compression supoort (TinyEXR extension, default = 0)
* `TINYEXR_USE_THREAD` Enable threaded loading using C++11 thread (Requires C++11 compiler, default = 0)
@@ -432,7 +445,7 @@ See `example/deepview` for actual usage.
`examples/deepview` is simple deep image viewer in OpenGL.
-![DeepViewExample](https://github.com/syoyo/tinyexr/blob/master/examples/deepview/deepview_screencast.gif?raw=true)
+![DeepViewExample](https://github.com/syoyo/tinyexr/blob/release/examples/deepview/deepview_screencast.gif?raw=true)
## TinyEXR extension
@@ -555,6 +568,7 @@ Contribution is welcome!
`tinyexr` tools uses stb, which is licensed under public domain: https://github.com/nothings/stb
`tinyexr` uses some code from OpenEXR, which is licensed under 3-clause BSD license.
+`tinyexr` uses nanozlib and wuffs, whose are licensed unnder Apache 2.0 license.
## Author(s)
diff --git a/graphics/asymptote/cudareflect/tinyexr/appveyor.yml b/graphics/asymptote/tinyexr/appveyor.yml
index c63267fe8b..c63267fe8b 100644
--- a/graphics/asymptote/cudareflect/tinyexr/appveyor.yml
+++ b/graphics/asymptote/tinyexr/appveyor.yml
diff --git a/graphics/asymptote/cudareflect/tinyexr/asakusa.exr b/graphics/asymptote/tinyexr/asakusa.exr
index ae7f38ad34..ae7f38ad34 100644
--- a/graphics/asymptote/cudareflect/tinyexr/asakusa.exr
+++ b/graphics/asymptote/tinyexr/asakusa.exr
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/asakusa.png b/graphics/asymptote/tinyexr/asakusa.png
index 7183d5f01c..7183d5f01c 100644
--- a/graphics/asymptote/cudareflect/tinyexr/asakusa.png
+++ b/graphics/asymptote/tinyexr/asakusa.png
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindASan.cmake b/graphics/asymptote/tinyexr/cmake/sanitizers/FindASan.cmake
index 98ea7cb311..98ea7cb311 100644
--- a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindASan.cmake
+++ b/graphics/asymptote/tinyexr/cmake/sanitizers/FindASan.cmake
diff --git a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindMSan.cmake b/graphics/asymptote/tinyexr/cmake/sanitizers/FindMSan.cmake
index 22d0050e97..22d0050e97 100644
--- a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindMSan.cmake
+++ b/graphics/asymptote/tinyexr/cmake/sanitizers/FindMSan.cmake
diff --git a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindSanitizers.cmake b/graphics/asymptote/tinyexr/cmake/sanitizers/FindSanitizers.cmake
index 101bab8439..101bab8439 100644
--- a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindSanitizers.cmake
+++ b/graphics/asymptote/tinyexr/cmake/sanitizers/FindSanitizers.cmake
diff --git a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindTSan.cmake b/graphics/asymptote/tinyexr/cmake/sanitizers/FindTSan.cmake
index 3cba3c03b6..3cba3c03b6 100644
--- a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindTSan.cmake
+++ b/graphics/asymptote/tinyexr/cmake/sanitizers/FindTSan.cmake
diff --git a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindUBSan.cmake b/graphics/asymptote/tinyexr/cmake/sanitizers/FindUBSan.cmake
index ae103f7172..ae103f7172 100644
--- a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindUBSan.cmake
+++ b/graphics/asymptote/tinyexr/cmake/sanitizers/FindUBSan.cmake
diff --git a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/asan-wrapper b/graphics/asymptote/tinyexr/cmake/sanitizers/asan-wrapper
index 5d54103372..5d54103372 100644
--- a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/asan-wrapper
+++ b/graphics/asymptote/tinyexr/cmake/sanitizers/asan-wrapper
diff --git a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/sanitize-helpers.cmake b/graphics/asymptote/tinyexr/cmake/sanitizers/sanitize-helpers.cmake
index 3649b07423..3649b07423 100644
--- a/graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/sanitize-helpers.cmake
+++ b/graphics/asymptote/tinyexr/cmake/sanitizers/sanitize-helpers.cmake
diff --git a/graphics/asymptote/cudareflect/tinyexr/config-msvc.py b/graphics/asymptote/tinyexr/config-msvc.py
index 1b3a48c876..1b3a48c876 100644
--- a/graphics/asymptote/cudareflect/tinyexr/config-msvc.py
+++ b/graphics/asymptote/tinyexr/config-msvc.py
diff --git a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/ChangeLog.md b/graphics/asymptote/tinyexr/deps/miniz/ChangeLog.md
index 4ae15a8cdf..a2fce92919 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/ChangeLog.md
+++ b/graphics/asymptote/tinyexr/deps/miniz/ChangeLog.md
@@ -1,196 +1,239 @@
-## Changelog
-
-### 2.2.0
-
- - Fix examples with amalgamation
- - Modified cmake script to support shared library mode and find_package
- - Fix for misleading doc comment on `mz_zip_reader_init_cfile` function
- - Add include location tolerance and stop forcing `_GNU_SOURCE`
- - Fix: mz_zip_reader_locate_file_v2 returns an mz_bool
- - Fix large file system checks
- - Add #elif to enable an external mz_crc32() to be linked in
- - Write with dynamic size (size of file/data to be added not known before adding)
- - Added uncompress2 for zlib compatibility
- - Add support for building as a Meson subproject
- - Added OSSFuzz support; Integrate with CIFuzz
- - Add pkg-config file
- - Fixed use-of-uninitialized value msan error when copying dist bytes with no output bytes written.
- - mz_zip_validate_file(): fix memory leak on errors
- - Fixed MSAN use-of-uninitialized in tinfl_decompress when invalid dist is decoded. In this instance dist was 31 which s_dist_base translates as 0
- - Add flag to set (compressed) size in local file header
- - avoid use of uninitialized value in tdefl_record_literal
-
-### 2.1.0
-
- - More instances of memcpy instead of cast and use memcpy per default
- - Remove inline for c90 support
- - New function to read files via callback functions when adding them
- - Fix out of bounds read while reading Zip64 extended information
- - guard memcpy when n == 0 because buffer may be NULL
- - Implement inflateReset() function
- - Move comp/decomp alloc/free prototypes under guarding #ifndef MZ_NO_MALLOC
- - Fix large file support under Windows
- - Don't warn if _LARGEFILE64_SOURCE is not defined to 1
- - Fixes for MSVC warnings
- - Remove check that path of file added to archive contains ':' or '\'
- - Add !defined check on MINIZ_USE_ALIGNED_LOADS_AND_STORES
-
-### 2.0.8
-
- - Remove unimplemented functions (mz_zip_locate_file and mz_zip_locate_file_v2)
- - Add license, changelog, readme and example files to release zip
- - Fix heap overflow to user buffer in tinfl_status tinfl_decompress
- - Fix corrupt archive if uncompressed file smaller than 4 byte and the file is added by mz_zip_writer_add_mem*
-
-### 2.0.7
-
- - Removed need in C++ compiler in cmake build
- - Fixed a lot of uninitialized value errors found with Valgrind by memsetting m_dict to 0 in tdefl_init
- - Fix resource leak in mz_zip_reader_init_file_v2
- - Fix assert with mz_zip_writer_add_mem* w/MZ_DEFAULT_COMPRESSION
- - cmake build: install library and headers
- - Remove _LARGEFILE64_SOURCE requirement from apple defines for large files
-
-### 2.0.6
-
- - Improve MZ_ZIP_FLAG_WRITE_ZIP64 documentation
- - Remove check for cur_archive_file_ofs > UINT_MAX because cur_archive_file_ofs is not used after this point
- - Add cmake debug configuration
- - Fix PNG height when creating png files
- - Add "iterative" file extraction method based on mz_zip_reader_extract_to_callback.
- - Option to use memcpy for unaligned data access
- - Define processor/arch macros as zero if not set to one
-
-### 2.0.4/2.0.5
-
- - Fix compilation with the various omission compile definitions
-
-### 2.0.3
-
-- Fix GCC/clang compile warnings
-- Added callback for periodic flushes (for ZIP file streaming)
-- Use UTF-8 for file names in ZIP files per default
-
-### 2.0.2
-
-- Fix source backwards compatibility with 1.x
-- Fix a ZIP bit not being set correctly
-
-### 2.0.1
-
-- Added some tests
-- Added CI
-- Make source code ANSI C compatible
-
-### 2.0.0 beta
-
-- Matthew Sitton merged miniz 1.x to Rich Geldreich's vogl ZIP64 changes. Miniz is now licensed as MIT since the vogl code base is MIT licensed
-- Miniz is now split into several files
-- Miniz does now not seek backwards when creating ZIP files. That is the ZIP files can be streamed
-- Miniz automatically switches to the ZIP64 format when the created ZIP files goes over ZIP file limits
-- Similar to [SQLite](https://www.sqlite.org/amalgamation.html) the Miniz source code is amalgamated into one miniz.c/miniz.h pair in a build step (amalgamate.sh). Please use miniz.c/miniz.h in your projects
-- Miniz 2 is only source back-compatible with miniz 1.x. It breaks binary compatibility because structures changed
-
-### v1.16 BETA Oct 19, 2013
-
-Still testing, this release is downloadable from [here](http://www.tenacioussoftware.com/miniz_v116_beta_r1.7z). Two key inflator-only robustness and streaming related changes. Also merged in tdefl_compressor_alloc(), tdefl_compressor_free() helpers to make script bindings easier for rustyzip. I would greatly appreciate any help with testing or any feedback.
-
-The inflator in raw (non-zlib) mode is now usable on gzip or similar streams that have a bunch of bytes following the raw deflate data (problem discovered by rustyzip author williamw520). This version should never read beyond the last byte of the raw deflate data independent of how many bytes you pass into the input buffer.
-
-The inflator now has a new failure status TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS (-4). Previously, if the inflator was starved of bytes and could not make progress (because the input buffer was empty and the caller did not set the TINFL_FLAG_HAS_MORE_INPUT flag - say on truncated or corrupted compressed data stream) it would append all 0's to the input and try to soldier on. This is scary behavior if the caller didn't know when to stop accepting output (because it didn't know how much uncompressed data was expected, or didn't enforce a sane maximum). v1.16 will instead return TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS immediately if it needs 1 or more bytes to make progress, the input buf is empty, and the caller has indicated that no more input is available. This is a "soft" failure, so you can call the inflator again with more input and it will try to continue, or you can give up and fail. This could be very useful in network streaming scenarios.
-
-- The inflator coroutine func. is subtle and complex so I'm being cautious about this release. I would greatly appreciate any help with testing or any feedback.
- I feel good about these changes, and they've been through several hours of automated testing, but they will probably not fix anything for the majority of prev. users so I'm
- going to mark this release as beta for a few weeks and continue testing it at work/home on various things.
-- The inflator in raw (non-zlib) mode is now usable on gzip or similar data streams that have a bunch of bytes following the raw deflate data (problem discovered by rustyzip author williamw520).
- This version should *never* read beyond the last byte of the raw deflate data independent of how many bytes you pass into the input buffer. This issue was caused by the various Huffman bitbuffer lookahead optimizations, and
- would not be an issue if the caller knew and enforced the precise size of the raw compressed data *or* if the compressed data was in zlib format (i.e. always followed by the byte aligned zlib adler32).
- So in other words, you can now call the inflator on deflate streams that are followed by arbitrary amounts of data and it's guaranteed that decompression will stop exactly on the last byte.
-- The inflator now has a new failure status: TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS (-4). Previously, if the inflator was starved of bytes and could not make progress (because the input buffer was empty and the
- caller did not set the TINFL_FLAG_HAS_MORE_INPUT flag - say on truncated or corrupted compressed data stream) it would append all 0's to the input and try to soldier on.
- This is scary, because in the worst case, I believe it was possible for the prev. inflator to start outputting large amounts of literal data. If the caller didn't know when to stop accepting output
- (because it didn't know how much uncompressed data was expected, or didn't enforce a sane maximum) it could continue forever. v1.16 cannot fall into this failure mode, instead it'll return
- TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS immediately if it needs 1 or more bytes to make progress, the input buf is empty, and the caller has indicated that no more input is available. This is a "soft"
- failure, so you can call the inflator again with more input and it will try to continue, or you can give up and fail. This could be very useful in network streaming scenarios.
-- Added documentation to all the tinfl return status codes, fixed miniz_tester so it accepts double minus params for Linux, tweaked example1.c, added a simple "follower bytes" test to miniz_tester.cpp.
-### v1.15 r4 STABLE - Oct 13, 2013
-
-Merged over a few very minor bug fixes that I fixed in the zip64 branch. This is downloadable from [here](http://code.google.com/p/miniz/downloads/list) and also in SVN head (as of 10/19/13).
-
-
-### v1.15 - Oct. 13, 2013
-
-Interim bugfix release while I work on the next major release with zip64 and streaming compression/decompression support. Fixed the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug (thanks kahmyong.moon@hp.com), which could cause the locate files func to not find files when this flag was specified. Also fixed a bug in mz_zip_reader_extract_to_mem_no_alloc() with user provided read buffers (thanks kymoon). I also merged lots of compiler fixes from various github repo branches and Google Code issue reports. I finally added cmake support (only tested under for Linux so far), compiled and tested with clang v3.3 and gcc 4.6 (under Linux), added defl_write_image_to_png_file_in_memory_ex() (supports Y flipping for OpenGL use, real-time compression), added a new PNG example (example6.c - Mandelbrot), and I added 64-bit file I/O support (stat64(), etc.) for glibc.
-
-- Critical fix for the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug (thanks kahmyong.moon@hp.com) which could cause locate files to not find files. This bug
- would only have occured in earlier versions if you explicitly used this flag, OR if you used mz_zip_extract_archive_file_to_heap() or mz_zip_add_mem_to_archive_file_in_place()
- (which used this flag). If you can't switch to v1.15 but want to fix this bug, just remove the uses of this flag from both helper funcs (and of course don't use the flag).
-- Bugfix in mz_zip_reader_extract_to_mem_no_alloc() from kymoon when pUser_read_buf is not NULL and compressed size is > uncompressed size
-- Fixing mz_zip_reader_extract_*() funcs so they don't try to extract compressed data from directory entries, to account for weird zipfiles which contain zero-size compressed data on dir entries.
- Hopefully this fix won't cause any issues on weird zip archives, because it assumes the low 16-bits of zip external attributes are DOS attributes (which I believe they always are in practice).
-- Fixing mz_zip_reader_is_file_a_directory() so it doesn't check the internal attributes, just the filename and external attributes
-- mz_zip_reader_init_file() - missing MZ_FCLOSE() call if the seek failed
-- Added cmake support for Linux builds which builds all the examples, tested with clang v3.3 and gcc v4.6.
-- Clang fix for tdefl_write_image_to_png_file_in_memory() from toffaletti
-- Merged MZ_FORCEINLINE fix from hdeanclark
-- Fix <time.h> include before config #ifdef, thanks emil.brink
-- Added tdefl_write_image_to_png_file_in_memory_ex(): supports Y flipping (super useful for OpenGL apps), and explicit control over the compression level (so you can
- set it to 1 for real-time compression).
-- Merged in some compiler fixes from paulharris's github repro.
-- Retested this build under Windows (VS 2010, including static analysis), tcc 0.9.26, gcc v4.6 and clang v3.3.
-- Added example6.c, which dumps an image of the mandelbrot set to a PNG file.
-- Modified example2 to help test the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag more.
-- In r3: Bugfix to mz_zip_writer_add_file() found during merge: Fix possible src file fclose() leak if alignment bytes+local header file write faiiled
-- In r4: Minor bugfix to mz_zip_writer_add_from_zip_reader(): Was pushing the wrong central dir header offset, appears harmless in this release, but it became a problem in the zip64 branch
-
-### v1.14 - May 20, 2012
-
-(SVN Only) Minor tweaks to get miniz.c compiling with the Tiny C Compiler, added #ifndef MINIZ_NO_TIME guards around utime.h includes. Adding mz_free() function, so the caller can free heap blocks returned by miniz using whatever heap functions it has been configured to use, MSVC specific fixes to use "safe" variants of several functions (localtime_s, fopen_s, freopen_s).
-
-MinGW32/64 GCC 4.6.1 compiler fixes: added MZ_FORCEINLINE, #include <time.h> (thanks fermtect).
-
-Compiler specific fixes, some from fermtect. I upgraded to TDM GCC 4.6.1 and now static __forceinline is giving it fits, so I'm changing all usage of __forceinline to MZ_FORCEINLINE and forcing gcc to use __attribute__((__always_inline__)) (and MSVC to use __forceinline). Also various fixes from fermtect for MinGW32: added #include , 64-bit ftell/fseek fixes.
-
-### v1.13 - May 19, 2012
-
-From jason@cornsyrup.org and kelwert@mtu.edu - Most importantly, fixed mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bits. Temporarily/locally slammed in "typedef unsigned long mz_ulong" and re-ran a randomized regression test on ~500k files. Other stuff:
-
-Eliminated a bunch of warnings when compiling with GCC 32-bit/64. Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze (static analysis) option and fixed all warnings (except for the silly "Use of the comma-operator in a tested expression.." analysis warning, which I purposely use to work around a MSVC compiler warning).
-
-Created 32-bit and 64-bit Codeblocks projects/workspace. Built and tested Linux executables. The codeblocks workspace is compatible with Linux+Win32/x64. Added miniz_tester solution/project, which is a useful little app derived from LZHAM's tester app that I use as part of the regression test. Ran miniz.c and tinfl.c through another series of regression testing on ~500,000 files and archives. Modified example5.c so it purposely disables a bunch of high-level functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the MINIZ_NO_STDIO bug report.)
-
-Fix ftell() usage in a few of the examples so they exit with an error on files which are too large (a limitation of the examples, not miniz itself). Fix fail logic handling in mz_zip_add_mem_to_archive_file_in_place() so it always calls mz_zip_writer_finalize_archive() and mz_zip_writer_end(), even if the file add fails.
-
-- From jason@cornsyrup.org and kelwert@mtu.edu - Fix mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bit.
-- Temporarily/locally slammed in "typedef unsigned long mz_ulong" and re-ran a randomized regression test on ~500k files.
-- Eliminated a bunch of warnings when compiling with GCC 32-bit/64.
-- Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze (static analysis) option and fixed all warnings (except for the silly
-"Use of the comma-operator in a tested expression.." analysis warning, which I purposely use to work around a MSVC compiler warning).
-- Created 32-bit and 64-bit Codeblocks projects/workspace. Built and tested Linux executables. The codeblocks workspace is compatible with Linux+Win32/x64.
-- Added miniz_tester solution/project, which is a useful little app derived from LZHAM's tester app that I use as part of the regression test.
-- Ran miniz.c and tinfl.c through another series of regression testing on ~500,000 files and archives.
-- Modified example5.c so it purposely disables a bunch of high-level functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the MINIZ_NO_STDIO bug report.)
-- Fix ftell() usage in examples so they exit with an error on files which are too large (a limitation of the examples, not miniz itself).
-
-### v1.12 - 4/12/12
-
-More comments, added low-level example5.c, fixed a couple minor level_and_flags issues in the archive API's.
-level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce Dawson <bruced@valvesoftware.com> for the feedback/bug report.
-
-### v1.11 - 5/28/11
-
-Added statement from unlicense.org
-
-### v1.10 - 5/27/11
-
-- Substantial compressor optimizations:
-- Level 1 is now ~4x faster than before. The L1 compressor's throughput now varies between 70-110MB/sec. on a Core i7 (actual throughput varies depending on the type of data, and x64 vs. x86).
-- Improved baseline L2-L9 compression perf. Also, greatly improved compression perf. issues on some file types.
-- Refactored the compression code for better readability and maintainability.
-- Added level 10 compression level (L10 has slightly better ratio than level 9, but could have a potentially large drop in throughput on some files).
-
-### v1.09 - 5/15/11
-
-Initial stable release.
-
-
+## Changelog
+
+### 3.0.2
+
+ - Fix buffer overrun in mz_utf8z_to_widechar on Windows
+
+### 3.0.1
+
+ - Fix compilation error with MINIZ_USE_UNALIGNED_LOADS_AND_STORES=1
+
+### 3.0.0
+
+ - Reduce memory usage for inflate. This changes `struct tinfl_decompressor_tag` and therefore requires a major version bump (breaks ABI compatibility)
+ - Add padding to structures so it continues to work if features differ. This also changes some structures
+ - Use _ftelli64, _fseeki64 and stat with MinGW32 and OpenWatcom
+ - Fix varios warnings with OpenWatcom compiler
+ - Avoid using unaligned memory access in UBSan builds
+ - Set MINIZ_LITTLE_ENDIAN only if not set
+ - Add MINIZ_NO_DEFLATE_APIS and MINIZ_NO_INFLATE_APIS
+ - Fix use of uninitialized memory in tinfl_decompress_mem_to_callback()
+ - Use wfopen on windows
+ - Use _wstat64 instead _stat64 on windows
+ - Use level_and_flags after MZ_DEFAULT_COMPRESSION has been handled
+ - Improve endianess detection
+ - Don't use unaligned stores and loads per default
+ - Fix function declaration if MINIZ_NO_STDIO is used
+ - Fix MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8 not being set
+ - Remove total files check (its 32-bit uint)
+ - tinfl_decompress: avoid NULL ptr arithmetic UB
+ - miniz_zip: fix mz_zip_reader_extract_to_heap to read correct sizes
+ - Eliminate 64-bit operations on 32-bit machines
+ - Disable treating warnings as error with MSVC
+ - Disable building shared lib via CMake by default
+ - Fixed alignment problems on MacOS
+ - Fixed get error string for MZ_ZIP_TOTAL_ERRORS
+ - Write correct FLEVEL 2-bit value in zlib header
+ - miniz.pc.in: fix include path not containing the "miniz" suffix
+ - Fix compatibility with FreeBSD
+ - pkg-config tweaks
+ - Fix integer overflow in header corruption check
+ - Fix some warnings
+ - tdefl_compress_normal: Avoid NULL ptr arithmetic UB
+ - replace use of stdint.h types with mz_ variants
+
+
+### 2.2.0
+
+ - Fix examples with amalgamation
+ - Modified cmake script to support shared library mode and find_package
+ - Fix for misleading doc comment on `mz_zip_reader_init_cfile` function
+ - Add include location tolerance and stop forcing `_GNU_SOURCE`
+ - Fix: mz_zip_reader_locate_file_v2 returns an mz_bool
+ - Fix large file system checks
+ - Add #elif to enable an external mz_crc32() to be linked in
+ - Write with dynamic size (size of file/data to be added not known before adding)
+ - Added uncompress2 for zlib compatibility
+ - Add support for building as a Meson subproject
+ - Added OSSFuzz support; Integrate with CIFuzz
+ - Add pkg-config file
+ - Fixed use-of-uninitialized value msan error when copying dist bytes with no output bytes written.
+ - mz_zip_validate_file(): fix memory leak on errors
+ - Fixed MSAN use-of-uninitialized in tinfl_decompress when invalid dist is decoded. In this instance dist was 31 which s_dist_base translates as 0
+ - Add flag to set (compressed) size in local file header
+ - avoid use of uninitialized value in tdefl_record_literal
+
+### 2.1.0
+
+ - More instances of memcpy instead of cast and use memcpy per default
+ - Remove inline for c90 support
+ - New function to read files via callback functions when adding them
+ - Fix out of bounds read while reading Zip64 extended information
+ - guard memcpy when n == 0 because buffer may be NULL
+ - Implement inflateReset() function
+ - Move comp/decomp alloc/free prototypes under guarding #ifndef MZ_NO_MALLOC
+ - Fix large file support under Windows
+ - Don't warn if _LARGEFILE64_SOURCE is not defined to 1
+ - Fixes for MSVC warnings
+ - Remove check that path of file added to archive contains ':' or '\'
+ - Add !defined check on MINIZ_USE_ALIGNED_LOADS_AND_STORES
+
+### 2.0.8
+
+ - Remove unimplemented functions (mz_zip_locate_file and mz_zip_locate_file_v2)
+ - Add license, changelog, readme and example files to release zip
+ - Fix heap overflow to user buffer in tinfl_status tinfl_decompress
+ - Fix corrupt archive if uncompressed file smaller than 4 byte and the file is added by mz_zip_writer_add_mem*
+
+### 2.0.7
+
+ - Removed need in C++ compiler in cmake build
+ - Fixed a lot of uninitialized value errors found with Valgrind by memsetting m_dict to 0 in tdefl_init
+ - Fix resource leak in mz_zip_reader_init_file_v2
+ - Fix assert with mz_zip_writer_add_mem* w/MZ_DEFAULT_COMPRESSION
+ - cmake build: install library and headers
+ - Remove _LARGEFILE64_SOURCE requirement from apple defines for large files
+
+### 2.0.6
+
+ - Improve MZ_ZIP_FLAG_WRITE_ZIP64 documentation
+ - Remove check for cur_archive_file_ofs > UINT_MAX because cur_archive_file_ofs is not used after this point
+ - Add cmake debug configuration
+ - Fix PNG height when creating png files
+ - Add "iterative" file extraction method based on mz_zip_reader_extract_to_callback.
+ - Option to use memcpy for unaligned data access
+ - Define processor/arch macros as zero if not set to one
+
+### 2.0.4/2.0.5
+
+ - Fix compilation with the various omission compile definitions
+
+### 2.0.3
+
+- Fix GCC/clang compile warnings
+- Added callback for periodic flushes (for ZIP file streaming)
+- Use UTF-8 for file names in ZIP files per default
+
+### 2.0.2
+
+- Fix source backwards compatibility with 1.x
+- Fix a ZIP bit not being set correctly
+
+### 2.0.1
+
+- Added some tests
+- Added CI
+- Make source code ANSI C compatible
+
+### 2.0.0 beta
+
+- Matthew Sitton merged miniz 1.x to Rich Geldreich's vogl ZIP64 changes. Miniz is now licensed as MIT since the vogl code base is MIT licensed
+- Miniz is now split into several files
+- Miniz does now not seek backwards when creating ZIP files. That is the ZIP files can be streamed
+- Miniz automatically switches to the ZIP64 format when the created ZIP files goes over ZIP file limits
+- Similar to [SQLite](https://www.sqlite.org/amalgamation.html) the Miniz source code is amalgamated into one miniz.c/miniz.h pair in a build step (amalgamate.sh). Please use miniz.c/miniz.h in your projects
+- Miniz 2 is only source back-compatible with miniz 1.x. It breaks binary compatibility because structures changed
+
+### v1.16 BETA Oct 19, 2013
+
+Still testing, this release is downloadable from [here](http://www.tenacioussoftware.com/miniz_v116_beta_r1.7z). Two key inflator-only robustness and streaming related changes. Also merged in tdefl_compressor_alloc(), tdefl_compressor_free() helpers to make script bindings easier for rustyzip. I would greatly appreciate any help with testing or any feedback.
+
+The inflator in raw (non-zlib) mode is now usable on gzip or similar streams that have a bunch of bytes following the raw deflate data (problem discovered by rustyzip author williamw520). This version should never read beyond the last byte of the raw deflate data independent of how many bytes you pass into the input buffer.
+
+The inflator now has a new failure status TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS (-4). Previously, if the inflator was starved of bytes and could not make progress (because the input buffer was empty and the caller did not set the TINFL_FLAG_HAS_MORE_INPUT flag - say on truncated or corrupted compressed data stream) it would append all 0's to the input and try to soldier on. This is scary behavior if the caller didn't know when to stop accepting output (because it didn't know how much uncompressed data was expected, or didn't enforce a sane maximum). v1.16 will instead return TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS immediately if it needs 1 or more bytes to make progress, the input buf is empty, and the caller has indicated that no more input is available. This is a "soft" failure, so you can call the inflator again with more input and it will try to continue, or you can give up and fail. This could be very useful in network streaming scenarios.
+
+- The inflator coroutine func. is subtle and complex so I'm being cautious about this release. I would greatly appreciate any help with testing or any feedback.
+ I feel good about these changes, and they've been through several hours of automated testing, but they will probably not fix anything for the majority of prev. users so I'm
+ going to mark this release as beta for a few weeks and continue testing it at work/home on various things.
+- The inflator in raw (non-zlib) mode is now usable on gzip or similar data streams that have a bunch of bytes following the raw deflate data (problem discovered by rustyzip author williamw520).
+ This version should *never* read beyond the last byte of the raw deflate data independent of how many bytes you pass into the input buffer. This issue was caused by the various Huffman bitbuffer lookahead optimizations, and
+ would not be an issue if the caller knew and enforced the precise size of the raw compressed data *or* if the compressed data was in zlib format (i.e. always followed by the byte aligned zlib adler32).
+ So in other words, you can now call the inflator on deflate streams that are followed by arbitrary amounts of data and it's guaranteed that decompression will stop exactly on the last byte.
+- The inflator now has a new failure status: TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS (-4). Previously, if the inflator was starved of bytes and could not make progress (because the input buffer was empty and the
+ caller did not set the TINFL_FLAG_HAS_MORE_INPUT flag - say on truncated or corrupted compressed data stream) it would append all 0's to the input and try to soldier on.
+ This is scary, because in the worst case, I believe it was possible for the prev. inflator to start outputting large amounts of literal data. If the caller didn't know when to stop accepting output
+ (because it didn't know how much uncompressed data was expected, or didn't enforce a sane maximum) it could continue forever. v1.16 cannot fall into this failure mode, instead it'll return
+ TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS immediately if it needs 1 or more bytes to make progress, the input buf is empty, and the caller has indicated that no more input is available. This is a "soft"
+ failure, so you can call the inflator again with more input and it will try to continue, or you can give up and fail. This could be very useful in network streaming scenarios.
+- Added documentation to all the tinfl return status codes, fixed miniz_tester so it accepts double minus params for Linux, tweaked example1.c, added a simple "follower bytes" test to miniz_tester.cpp.
+### v1.15 r4 STABLE - Oct 13, 2013
+
+Merged over a few very minor bug fixes that I fixed in the zip64 branch. This is downloadable from [here](http://code.google.com/p/miniz/downloads/list) and also in SVN head (as of 10/19/13).
+
+
+### v1.15 - Oct. 13, 2013
+
+Interim bugfix release while I work on the next major release with zip64 and streaming compression/decompression support. Fixed the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug (thanks kahmyong.moon@hp.com), which could cause the locate files func to not find files when this flag was specified. Also fixed a bug in mz_zip_reader_extract_to_mem_no_alloc() with user provided read buffers (thanks kymoon). I also merged lots of compiler fixes from various github repo branches and Google Code issue reports. I finally added cmake support (only tested under for Linux so far), compiled and tested with clang v3.3 and gcc 4.6 (under Linux), added defl_write_image_to_png_file_in_memory_ex() (supports Y flipping for OpenGL use, real-time compression), added a new PNG example (example6.c - Mandelbrot), and I added 64-bit file I/O support (stat64(), etc.) for glibc.
+
+- Critical fix for the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug (thanks kahmyong.moon@hp.com) which could cause locate files to not find files. This bug
+ would only have occurred in earlier versions if you explicitly used this flag, OR if you used mz_zip_extract_archive_file_to_heap() or mz_zip_add_mem_to_archive_file_in_place()
+ (which used this flag). If you can't switch to v1.15 but want to fix this bug, just remove the uses of this flag from both helper funcs (and of course don't use the flag).
+- Bugfix in mz_zip_reader_extract_to_mem_no_alloc() from kymoon when pUser_read_buf is not NULL and compressed size is > uncompressed size
+- Fixing mz_zip_reader_extract_*() funcs so they don't try to extract compressed data from directory entries, to account for weird zipfiles which contain zero-size compressed data on dir entries.
+ Hopefully this fix won't cause any issues on weird zip archives, because it assumes the low 16-bits of zip external attributes are DOS attributes (which I believe they always are in practice).
+- Fixing mz_zip_reader_is_file_a_directory() so it doesn't check the internal attributes, just the filename and external attributes
+- mz_zip_reader_init_file() - missing MZ_FCLOSE() call if the seek failed
+- Added cmake support for Linux builds which builds all the examples, tested with clang v3.3 and gcc v4.6.
+- Clang fix for tdefl_write_image_to_png_file_in_memory() from toffaletti
+- Merged MZ_FORCEINLINE fix from hdeanclark
+- Fix <time.h> include before config #ifdef, thanks emil.brink
+- Added tdefl_write_image_to_png_file_in_memory_ex(): supports Y flipping (super useful for OpenGL apps), and explicit control over the compression level (so you can
+ set it to 1 for real-time compression).
+- Merged in some compiler fixes from paulharris's github repro.
+- Retested this build under Windows (VS 2010, including static analysis), tcc 0.9.26, gcc v4.6 and clang v3.3.
+- Added example6.c, which dumps an image of the mandelbrot set to a PNG file.
+- Modified example2 to help test the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag more.
+- In r3: Bugfix to mz_zip_writer_add_file() found during merge: Fix possible src file fclose() leak if alignment bytes+local header file write faiiled
+- In r4: Minor bugfix to mz_zip_writer_add_from_zip_reader(): Was pushing the wrong central dir header offset, appears harmless in this release, but it became a problem in the zip64 branch
+
+### v1.14 - May 20, 2012
+
+(SVN Only) Minor tweaks to get miniz.c compiling with the Tiny C Compiler, added #ifndef MINIZ_NO_TIME guards around utime.h includes. Adding mz_free() function, so the caller can free heap blocks returned by miniz using whatever heap functions it has been configured to use, MSVC specific fixes to use "safe" variants of several functions (localtime_s, fopen_s, freopen_s).
+
+MinGW32/64 GCC 4.6.1 compiler fixes: added MZ_FORCEINLINE, #include <time.h> (thanks fermtect).
+
+Compiler specific fixes, some from fermtect. I upgraded to TDM GCC 4.6.1 and now static __forceinline is giving it fits, so I'm changing all usage of __forceinline to MZ_FORCEINLINE and forcing gcc to use __attribute__((__always_inline__)) (and MSVC to use __forceinline). Also various fixes from fermtect for MinGW32: added #include , 64-bit ftell/fseek fixes.
+
+### v1.13 - May 19, 2012
+
+From jason@cornsyrup.org and kelwert@mtu.edu - Most importantly, fixed mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bits. Temporarily/locally slammed in "typedef unsigned long mz_ulong" and re-ran a randomized regression test on ~500k files. Other stuff:
+
+Eliminated a bunch of warnings when compiling with GCC 32-bit/64. Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze (static analysis) option and fixed all warnings (except for the silly "Use of the comma-operator in a tested expression.." analysis warning, which I purposely use to work around a MSVC compiler warning).
+
+Created 32-bit and 64-bit Codeblocks projects/workspace. Built and tested Linux executables. The codeblocks workspace is compatible with Linux+Win32/x64. Added miniz_tester solution/project, which is a useful little app derived from LZHAM's tester app that I use as part of the regression test. Ran miniz.c and tinfl.c through another series of regression testing on ~500,000 files and archives. Modified example5.c so it purposely disables a bunch of high-level functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the MINIZ_NO_STDIO bug report.)
+
+Fix ftell() usage in a few of the examples so they exit with an error on files which are too large (a limitation of the examples, not miniz itself). Fix fail logic handling in mz_zip_add_mem_to_archive_file_in_place() so it always calls mz_zip_writer_finalize_archive() and mz_zip_writer_end(), even if the file add fails.
+
+- From jason@cornsyrup.org and kelwert@mtu.edu - Fix mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bit.
+- Temporarily/locally slammed in "typedef unsigned long mz_ulong" and re-ran a randomized regression test on ~500k files.
+- Eliminated a bunch of warnings when compiling with GCC 32-bit/64.
+- Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze (static analysis) option and fixed all warnings (except for the silly
+"Use of the comma-operator in a tested expression.." analysis warning, which I purposely use to work around a MSVC compiler warning).
+- Created 32-bit and 64-bit Codeblocks projects/workspace. Built and tested Linux executables. The codeblocks workspace is compatible with Linux+Win32/x64.
+- Added miniz_tester solution/project, which is a useful little app derived from LZHAM's tester app that I use as part of the regression test.
+- Ran miniz.c and tinfl.c through another series of regression testing on ~500,000 files and archives.
+- Modified example5.c so it purposely disables a bunch of high-level functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the MINIZ_NO_STDIO bug report.)
+- Fix ftell() usage in examples so they exit with an error on files which are too large (a limitation of the examples, not miniz itself).
+
+### v1.12 - 4/12/12
+
+More comments, added low-level example5.c, fixed a couple minor level_and_flags issues in the archive API's.
+level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce Dawson <bruced@valvesoftware.com> for the feedback/bug report.
+
+### v1.11 - 5/28/11
+
+Added statement from unlicense.org
+
+### v1.10 - 5/27/11
+
+- Substantial compressor optimizations:
+- Level 1 is now ~4x faster than before. The L1 compressor's throughput now varies between 70-110MB/sec. on a Core i7 (actual throughput varies depending on the type of data, and x64 vs. x86).
+- Improved baseline L2-L9 compression perf. Also, greatly improved compression perf. issues on some file types.
+- Refactored the compression code for better readability and maintainability.
+- Added level 10 compression level (L10 has slightly better ratio than level 9, but could have a potentially large drop in throughput on some files).
+
+### v1.09 - 5/15/11
+
+Initial stable release.
+
+
diff --git a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/LICENSE b/graphics/asymptote/tinyexr/deps/miniz/LICENSE
index b6ff45a30f..1982f4bb8f 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/LICENSE
+++ b/graphics/asymptote/tinyexr/deps/miniz/LICENSE
@@ -1,22 +1,22 @@
-Copyright 2013-2014 RAD Game Tools and Valve Software
-Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC
-
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
+Copyright 2013-2014 RAD Game Tools and Valve Software
+Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC
+
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION 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/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example1.c b/graphics/asymptote/tinyexr/deps/miniz/examples/example1.c
index d6e33faaa6..d6e33faaa6 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example1.c
+++ b/graphics/asymptote/tinyexr/deps/miniz/examples/example1.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example2.c b/graphics/asymptote/tinyexr/deps/miniz/examples/example2.c
index 03d2409583..03d2409583 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example2.c
+++ b/graphics/asymptote/tinyexr/deps/miniz/examples/example2.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example3.c b/graphics/asymptote/tinyexr/deps/miniz/examples/example3.c
index a97ba8420f..a97ba8420f 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example3.c
+++ b/graphics/asymptote/tinyexr/deps/miniz/examples/example3.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example4.c b/graphics/asymptote/tinyexr/deps/miniz/examples/example4.c
index 3f2d7cf1ed..3f2d7cf1ed 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example4.c
+++ b/graphics/asymptote/tinyexr/deps/miniz/examples/example4.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example5.c b/graphics/asymptote/tinyexr/deps/miniz/examples/example5.c
index a190357b3d..a190357b3d 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example5.c
+++ b/graphics/asymptote/tinyexr/deps/miniz/examples/example5.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example6.c b/graphics/asymptote/tinyexr/deps/miniz/examples/example6.c
index abbb64fe3c..abbb64fe3c 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example6.c
+++ b/graphics/asymptote/tinyexr/deps/miniz/examples/example6.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/miniz.c b/graphics/asymptote/tinyexr/deps/miniz/miniz.c
index 87bdedb188..6e7e2184c6 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/miniz.c
+++ b/graphics/asymptote/tinyexr/deps/miniz/miniz.c
@@ -187,6 +187,8 @@ const char *mz_version(void)
#ifndef MINIZ_NO_ZLIB_APIS
+#ifndef MINIZ_NO_DEFLATE_APIS
+
int mz_deflateInit(mz_streamp pStream, int level)
{
return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY);
@@ -321,7 +323,7 @@ int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char
memset(&stream, 0, sizeof(stream));
/* In case mz_ulong is 64-bits (argh I hate longs). */
- if ((source_len | *pDest_len) > 0xFFFFFFFFU)
+ if ((mz_uint64)(source_len | *pDest_len) > 0xFFFFFFFFU)
return MZ_PARAM_ERROR;
stream.next_in = pSource;
@@ -354,6 +356,10 @@ mz_ulong mz_compressBound(mz_ulong source_len)
return mz_deflateBound(NULL, source_len);
}
+#endif /*#ifndef MINIZ_NO_DEFLATE_APIS*/
+
+#ifndef MINIZ_NO_INFLATE_APIS
+
typedef struct
{
tinfl_decompressor m_decomp;
@@ -560,7 +566,7 @@ int mz_uncompress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned cha
memset(&stream, 0, sizeof(stream));
/* In case mz_ulong is 64-bits (argh I hate longs). */
- if ((*pSource_len | *pDest_len) > 0xFFFFFFFFU)
+ if ((mz_uint64)(*pSource_len | *pDest_len) > 0xFFFFFFFFU)
return MZ_PARAM_ERROR;
stream.next_in = pSource;
@@ -589,6 +595,8 @@ int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char
return mz_uncompress2(pDest, pDest_len, pSource, &source_len);
}
+#endif /*#ifndef MINIZ_NO_INFLATE_APIS*/
+
const char *mz_error(int err)
{
static struct
@@ -666,6 +674,8 @@ const char *mz_error(int err)
+#ifndef MINIZ_NO_DEFLATE_APIS
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -744,7 +754,7 @@ static tdefl_sym_freq *tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq *p
{
mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2];
tdefl_sym_freq *pCur_syms = pSyms0, *pNew_syms = pSyms1;
- MZ_CLEAR_OBJ(hist);
+ MZ_CLEAR_ARR(hist);
for (i = 0; i < num_syms; i++)
{
mz_uint freq = pSyms0[i].m_key;
@@ -862,7 +872,7 @@ static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int
{
int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE];
mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1];
- MZ_CLEAR_OBJ(num_codes);
+ MZ_CLEAR_ARR(num_codes);
if (static_table)
{
for (i = 0; i < table_len; i++)
@@ -888,8 +898,8 @@ static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int
tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit);
- MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]);
- MZ_CLEAR_OBJ(d->m_huff_codes[table_num]);
+ MZ_CLEAR_ARR(d->m_huff_code_sizes[table_num]);
+ MZ_CLEAR_ARR(d->m_huff_codes[table_num]);
for (i = 1, j = num_used_syms; i <= code_size_limit; i++)
for (l = num_codes[i]; l > 0; l--)
d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i);
@@ -975,7 +985,7 @@ static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int
} \
}
-static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
+static const mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
static void tdefl_start_dynamic_block(tdefl_compressor *d)
{
@@ -1113,7 +1123,8 @@ static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d)
if (flags & 1)
{
mz_uint s0, s1, n0, n1, sym, num_extra_bits;
- mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1);
+ mz_uint match_len = pLZ_codes[0];
+ mz_uint match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8));
pLZ_codes += 3;
MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
@@ -1158,7 +1169,7 @@ static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d)
if (pOutput_buf >= d->m_pOutput_buf_end)
return MZ_FALSE;
- *(mz_uint64 *)pOutput_buf = bit_buffer;
+ memcpy(pOutput_buf, &bit_buffer, sizeof(mz_uint64));
pOutput_buf += (bits_in >> 3);
bit_buffer >>= (bits_in & ~7);
bits_in &= 7;
@@ -1240,6 +1251,8 @@ static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block)
return tdefl_compress_lz_codes(d);
}
+static const mz_uint s_tdefl_num_probes[11];
+
static int tdefl_flush_block(tdefl_compressor *d, int flush)
{
mz_uint saved_bit_buf, saved_bits_in;
@@ -1260,8 +1273,27 @@ static int tdefl_flush_block(tdefl_compressor *d, int flush)
if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index))
{
- TDEFL_PUT_BITS(0x78, 8);
- TDEFL_PUT_BITS(0x01, 8);
+ const mz_uint8 cmf = 0x78;
+ mz_uint8 flg, flevel = 3;
+ mz_uint header, i, mz_un = sizeof(s_tdefl_num_probes) / sizeof(mz_uint);
+
+ /* Determine compression level by reversing the process in tdefl_create_comp_flags_from_zip_params() */
+ for (i = 0; i < mz_un; i++)
+ if (s_tdefl_num_probes[i] == (d->m_flags & 0xFFF)) break;
+
+ if (i < 2)
+ flevel = 0;
+ else if (i < 6)
+ flevel = 1;
+ else if (i == 6)
+ flevel = 2;
+
+ header = cmf << 8 | (flevel << 6);
+ header += 31 - (header % 31);
+ flg = header & 0xFF;
+
+ TDEFL_PUT_BITS(cmf, 8);
+ TDEFL_PUT_BITS(flg, 8);
}
TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1);
@@ -1732,7 +1764,7 @@ static mz_bool tdefl_compress_normal(tdefl_compressor *d)
mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2;
mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK];
mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size);
- const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process;
+ const mz_uint8 *pSrc_end = pSrc ? pSrc + num_bytes_to_process : NULL;
src_buf_left -= num_bytes_to_process;
d->m_lookahead_size += num_bytes_to_process;
while (pSrc != pSrc_end)
@@ -1942,8 +1974,8 @@ tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pI
d->m_finished = (flush == TDEFL_FINISH);
if (flush == TDEFL_FULL_FLUSH)
{
- MZ_CLEAR_OBJ(d->m_hash);
- MZ_CLEAR_OBJ(d->m_next);
+ MZ_CLEAR_ARR(d->m_hash);
+ MZ_CLEAR_ARR(d->m_next);
d->m_dict_size = 0;
}
}
@@ -1966,7 +1998,7 @@ tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_fun
d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0;
d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3;
if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG))
- MZ_CLEAR_OBJ(d->m_hash);
+ MZ_CLEAR_ARR(d->m_hash);
d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0;
d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0;
d->m_pLZ_code_buf = d->m_lz_code_buf + 1;
@@ -1987,7 +2019,7 @@ tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_fun
d->m_src_buf_left = 0;
d->m_out_buf_ofs = 0;
if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG))
- MZ_CLEAR_OBJ(d->m_dict);
+ MZ_CLEAR_ARR(d->m_dict);
memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);
memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);
return TDEFL_STATUS_OKAY;
@@ -2197,7 +2229,7 @@ void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h,
/* Allocate the tdefl_compressor and tinfl_decompressor structures in C so that */
/* non-C language bindings to tdefL_ and tinfl_ API don't need to worry about */
/* structure size and allocation mechanism. */
-tdefl_compressor *tdefl_compressor_alloc()
+tdefl_compressor *tdefl_compressor_alloc(void)
{
return (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor));
}
@@ -2215,6 +2247,8 @@ void tdefl_compressor_free(tdefl_compressor *pComp)
#ifdef __cplusplus
}
#endif
+
+#endif /*#ifndef MINIZ_NO_DEFLATE_APIS*/
/**************************************************************************
*
* Copyright 2013-2014 RAD Game Tools and Valve Software
@@ -2243,6 +2277,8 @@ void tdefl_compressor_free(tdefl_compressor *pComp)
+#ifndef MINIZ_NO_INFLATE_APIS
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -2323,10 +2359,10 @@ extern "C" {
/* It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a */
/* Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the */
/* bit buffer contains >=15 bits (deflate's max. Huffman code size). */
-#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
+#define TINFL_HUFF_BITBUF_FILL(state_index, pLookUp, pTree) \
do \
{ \
- temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
+ temp = pLookUp[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
if (temp >= 0) \
{ \
code_len = temp >> 9; \
@@ -2338,7 +2374,7 @@ extern "C" {
code_len = TINFL_FAST_LOOKUP_BITS; \
do \
{ \
- temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
+ temp = pTree[~temp + ((bit_buf >> code_len++) & 1)]; \
} while ((temp < 0) && (num_bits >= (code_len + 1))); \
if (temp >= 0) \
break; \
@@ -2354,7 +2390,7 @@ extern "C" {
/* The slow path is only executed at the very end of the input buffer. */
/* v1.16: The original macro handled the case at the very end of the passed-in input buffer, but we also need to handle the case where the user passes in 1+zillion bytes */
/* following the deflate data and our non-conservative read-ahead path won't kick in here on this code. This is much trickier. */
-#define TINFL_HUFF_DECODE(state_index, sym, pHuff) \
+#define TINFL_HUFF_DECODE(state_index, sym, pLookUp, pTree) \
do \
{ \
int temp; \
@@ -2363,7 +2399,7 @@ extern "C" {
{ \
if ((pIn_buf_end - pIn_buf_cur) < 2) \
{ \
- TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \
+ TINFL_HUFF_BITBUF_FILL(state_index, pLookUp, pTree); \
} \
else \
{ \
@@ -2372,14 +2408,14 @@ extern "C" {
num_bits += 16; \
} \
} \
- if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \
+ if ((temp = pLookUp[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \
code_len = temp >> 9, temp &= 511; \
else \
{ \
code_len = TINFL_FAST_LOOKUP_BITS; \
do \
{ \
- temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
+ temp = pTree[~temp + ((bit_buf >> code_len++) & 1)]; \
} while (temp < 0); \
} \
sym = temp; \
@@ -2388,29 +2424,53 @@ extern "C" {
} \
MZ_MACRO_END
+static void tinfl_clear_tree(tinfl_decompressor *r)
+{
+ if (r->m_type == 0)
+ MZ_CLEAR_ARR(r->m_tree_0);
+ else if (r->m_type == 1)
+ MZ_CLEAR_ARR(r->m_tree_1);
+ else
+ MZ_CLEAR_ARR(r->m_tree_2);
+}
+
tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags)
{
- static const int s_length_base[31] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 };
- static const int s_length_extra[31] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0 };
- static const int s_dist_base[32] = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0 };
- static const int s_dist_extra[32] = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 };
+ static const mz_uint16 s_length_base[31] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 };
+ static const mz_uint8 s_length_extra[31] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0 };
+ static const mz_uint16 s_dist_base[32] = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0 };
+ static const mz_uint8 s_dist_extra[32] = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 };
static const mz_uint8 s_length_dezigzag[19] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
- static const int s_min_table_sizes[3] = { 257, 1, 4 };
+ static const mz_uint16 s_min_table_sizes[3] = { 257, 1, 4 };
+
+ mz_int16 *pTrees[3];
+ mz_uint8 *pCode_sizes[3];
tinfl_status status = TINFL_STATUS_FAILED;
mz_uint32 num_bits, dist, counter, num_extra;
tinfl_bit_buf_t bit_buf;
const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
- mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
+ mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next ? pOut_buf_next + *pOut_buf_size : NULL;
size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start;
/* Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter). */
+ if ((!pOut_buf_start) || (!pOut_buf_next) || (!pIn_buf_size) || (!pOut_buf_size))
+ {
+ return TINFL_STATUS_BAD_PARAM;
+ }
if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start))
{
*pIn_buf_size = *pOut_buf_size = 0;
return TINFL_STATUS_BAD_PARAM;
}
+ pTrees[0] = r->m_tree_0;
+ pTrees[1] = r->m_tree_1;
+ pTrees[2] = r->m_tree_2;
+ pCode_sizes[0] = r->m_code_size_0;
+ pCode_sizes[1] = r->m_code_size_1;
+ pCode_sizes[2] = r->m_code_size_2;
+
num_bits = r->m_num_bits;
bit_buf = r->m_bit_buf;
dist = r->m_dist;
@@ -2427,7 +2487,7 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
TINFL_GET_BYTE(2, r->m_zhdr1);
counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));
if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))
- counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4)))));
+ counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)((size_t)1 << (8U + (r->m_zhdr0 >> 4)))));
if (counter)
{
TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED);
@@ -2488,11 +2548,11 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
{
if (r->m_type == 1)
{
- mz_uint8 *p = r->m_tables[0].m_code_size;
+ mz_uint8 *p = r->m_code_size_0;
mz_uint i;
r->m_table_sizes[0] = 288;
r->m_table_sizes[1] = 32;
- TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);
+ TINFL_MEMSET(r->m_code_size_1, 5, 32);
for (i = 0; i <= 143; ++i)
*p++ = 8;
for (; i <= 255; ++i)
@@ -2509,26 +2569,30 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]);
r->m_table_sizes[counter] += s_min_table_sizes[counter];
}
- MZ_CLEAR_OBJ(r->m_tables[2].m_code_size);
+ MZ_CLEAR_ARR(r->m_code_size_2);
for (counter = 0; counter < r->m_table_sizes[2]; counter++)
{
mz_uint s;
TINFL_GET_BITS(14, s, 3);
- r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s;
+ r->m_code_size_2[s_length_dezigzag[counter]] = (mz_uint8)s;
}
r->m_table_sizes[2] = 19;
}
for (; (int)r->m_type >= 0; r->m_type--)
{
int tree_next, tree_cur;
- tinfl_huff_table *pTable;
+ mz_int16 *pLookUp;
+ mz_int16 *pTree;
+ mz_uint8 *pCode_size;
mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16];
- pTable = &r->m_tables[r->m_type];
- MZ_CLEAR_OBJ(total_syms);
- MZ_CLEAR_OBJ(pTable->m_look_up);
- MZ_CLEAR_OBJ(pTable->m_tree);
+ pLookUp = r->m_look_up[r->m_type];
+ pTree = pTrees[r->m_type];
+ pCode_size = pCode_sizes[r->m_type];
+ MZ_CLEAR_ARR(total_syms);
+ TINFL_MEMSET(pLookUp, 0, sizeof(r->m_look_up[0]));
+ tinfl_clear_tree(r);
for (i = 0; i < r->m_table_sizes[r->m_type]; ++i)
- total_syms[pTable->m_code_size[i]]++;
+ total_syms[pCode_size[i]]++;
used_syms = 0, total = 0;
next_code[0] = next_code[1] = 0;
for (i = 1; i <= 15; ++i)
@@ -2542,7 +2606,7 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
}
for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)
{
- mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index];
+ mz_uint rev_code = 0, l, cur_code, code_size = pCode_size[sym_index];
if (!code_size)
continue;
cur_code = next_code[code_size]++;
@@ -2553,14 +2617,14 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
mz_int16 k = (mz_int16)((code_size << 9) | sym_index);
while (rev_code < TINFL_FAST_LOOKUP_SIZE)
{
- pTable->m_look_up[rev_code] = k;
+ pLookUp[rev_code] = k;
rev_code += (1 << code_size);
}
continue;
}
- if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)]))
+ if (0 == (tree_cur = pLookUp[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)]))
{
- pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next;
+ pLookUp[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next;
tree_cur = tree_next;
tree_next -= 2;
}
@@ -2568,24 +2632,24 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)
{
tree_cur -= ((rev_code >>= 1) & 1);
- if (!pTable->m_tree[-tree_cur - 1])
+ if (!pTree[-tree_cur - 1])
{
- pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next;
+ pTree[-tree_cur - 1] = (mz_int16)tree_next;
tree_cur = tree_next;
tree_next -= 2;
}
else
- tree_cur = pTable->m_tree[-tree_cur - 1];
+ tree_cur = pTree[-tree_cur - 1];
}
tree_cur -= ((rev_code >>= 1) & 1);
- pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;
+ pTree[-tree_cur - 1] = (mz_int16)sym_index;
}
if (r->m_type == 2)
{
for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]);)
{
mz_uint s;
- TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]);
+ TINFL_HUFF_DECODE(16, dist, r->m_look_up[2], r->m_tree_2);
if (dist < 16)
{
r->m_len_codes[counter++] = (mz_uint8)dist;
@@ -2605,8 +2669,8 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
{
TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);
}
- TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]);
- TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]);
+ TINFL_MEMCPY(r->m_code_size_0, r->m_len_codes, r->m_table_sizes[0]);
+ TINFL_MEMCPY(r->m_code_size_1, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]);
}
}
for (;;)
@@ -2616,7 +2680,7 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
{
if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2))
{
- TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);
+ TINFL_HUFF_DECODE(23, counter, r->m_look_up[0], r->m_tree_0);
if (counter >= 256)
break;
while (pOut_buf_cur >= pOut_buf_end)
@@ -2644,14 +2708,14 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
num_bits += 16;
}
#endif
- if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
+ if ((sym2 = r->m_look_up[0][bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
code_len = sym2 >> 9;
else
{
code_len = TINFL_FAST_LOOKUP_BITS;
do
{
- sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)];
+ sym2 = r->m_tree_0[~sym2 + ((bit_buf >> code_len++) & 1)];
} while (sym2 < 0);
}
counter = sym2;
@@ -2668,14 +2732,14 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
num_bits += 16;
}
#endif
- if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
+ if ((sym2 = r->m_look_up[0][bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
code_len = sym2 >> 9;
else
{
code_len = TINFL_FAST_LOOKUP_BITS;
do
{
- sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)];
+ sym2 = r->m_tree_0[~sym2 + ((bit_buf >> code_len++) & 1)];
} while (sym2 < 0);
}
bit_buf >>= code_len;
@@ -2704,7 +2768,7 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
counter += extra_bits;
}
- TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);
+ TINFL_HUFF_DECODE(26, dist, r->m_look_up[1], r->m_tree_1);
num_extra = s_dist_extra[dist];
dist = s_dist_base[dist];
if (num_extra)
@@ -2789,7 +2853,7 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
--pIn_buf_cur;
num_bits -= 8;
}
- bit_buf &= (tinfl_bit_buf_t)((((mz_uint64)1) << num_bits) - (mz_uint64)1);
+ bit_buf &= ~(~(tinfl_bit_buf_t)0 << num_bits);
MZ_ASSERT(!num_bits); /* if this assert fires then we've read beyond the end of non-deflate/zlib streams with following data (such as gzip streams). */
if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
@@ -2821,7 +2885,7 @@ common_exit:
}
}
r->m_num_bits = num_bits;
- r->m_bit_buf = bit_buf & (tinfl_bit_buf_t)((((mz_uint64)1) << num_bits) - (mz_uint64)1);
+ r->m_bit_buf = bit_buf & ~(~(tinfl_bit_buf_t)0 << num_bits);
r->m_dist = dist;
r->m_counter = counter;
r->m_num_extra = num_extra;
@@ -2916,6 +2980,7 @@ int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size,
size_t in_buf_ofs = 0, dict_ofs = 0;
if (!pDict)
return TINFL_STATUS_FAILED;
+ memset(pDict,0,TINFL_LZ_DICT_SIZE);
tinfl_init(&decomp);
for (;;)
{
@@ -2938,7 +3003,7 @@ int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size,
}
#ifndef MINIZ_NO_MALLOC
-tinfl_decompressor *tinfl_decompressor_alloc()
+tinfl_decompressor *tinfl_decompressor_alloc(void)
{
tinfl_decompressor *pDecomp = (tinfl_decompressor *)MZ_MALLOC(sizeof(tinfl_decompressor));
if (pDecomp)
@@ -2955,6 +3020,8 @@ void tinfl_decompressor_free(tinfl_decompressor *pDecomp)
#ifdef __cplusplus
}
#endif
+
+#endif /*#ifndef MINIZ_NO_INFLATE_APIS*/
/**************************************************************************
*
* Copyright 2013-2014 RAD Game Tools and Valve Software
@@ -2996,20 +3063,59 @@ extern "C" {
#else
#include <sys/stat.h>
-#if defined(_MSC_VER) || defined(__MINGW64__)
+#if defined(_MSC_VER) || defined(__MINGW64__) || defined(__MINGW32__)
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+static WCHAR* mz_utf8z_to_widechar(const char* str)
+{
+ int reqChars = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
+ WCHAR* wStr = (WCHAR*)malloc(reqChars * sizeof(WCHAR));
+ MultiByteToWideChar(CP_UTF8, 0, str, -1, wStr, reqChars);
+ return wStr;
+}
+
static FILE *mz_fopen(const char *pFilename, const char *pMode)
{
- FILE *pFile = NULL;
- fopen_s(&pFile, pFilename, pMode);
- return pFile;
+ WCHAR* wFilename = mz_utf8z_to_widechar(pFilename);
+ WCHAR* wMode = mz_utf8z_to_widechar(pMode);
+ FILE* pFile = NULL;
+ errno_t err = _wfopen_s(&pFile, wFilename, wMode);
+ free(wFilename);
+ free(wMode);
+ return err ? NULL : pFile;
}
+
static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream)
{
- FILE *pFile = NULL;
- if (freopen_s(&pFile, pPath, pMode, pStream))
- return NULL;
- return pFile;
+ WCHAR* wPath = mz_utf8z_to_widechar(pPath);
+ WCHAR* wMode = mz_utf8z_to_widechar(pMode);
+ FILE* pFile = NULL;
+ errno_t err = _wfreopen_s(&pFile, wPath, wMode, pStream);
+ free(wPath);
+ free(wMode);
+ return err ? NULL : pFile;
}
+
+#if defined(__MINGW32__)
+static int mz_stat(const char *path, struct _stat *buffer)
+{
+ WCHAR* wPath = mz_utf8z_to_widechar(path);
+ int res = _wstat(wPath, buffer);
+ free(wPath);
+ return res;
+}
+#else
+static int mz_stat64(const char *path, struct __stat64 *buffer)
+{
+ WCHAR* wPath = mz_utf8z_to_widechar(path);
+ int res = _wstat64(wPath, buffer);
+ free(wPath);
+ return res;
+}
+#endif
+
#ifndef MINIZ_NO_TIME
#include <sys/utime.h>
#endif
@@ -3019,12 +3125,18 @@ static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream)
#define MZ_FWRITE fwrite
#define MZ_FTELL64 _ftelli64
#define MZ_FSEEK64 _fseeki64
+#if defined(__MINGW32__)
+#define MZ_FILE_STAT_STRUCT _stat
+#define MZ_FILE_STAT mz_stat
+#else
#define MZ_FILE_STAT_STRUCT _stat64
-#define MZ_FILE_STAT _stat64
+#define MZ_FILE_STAT mz_stat64
+#endif
#define MZ_FFLUSH fflush
#define MZ_FREOPEN mz_freopen
#define MZ_DELETE_FILE remove
-#elif defined(__MINGW32__)
+
+#elif defined(__WATCOMC__)
#ifndef MINIZ_NO_TIME
#include <sys/utime.h>
#endif
@@ -3032,13 +3144,14 @@ static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream)
#define MZ_FCLOSE fclose
#define MZ_FREAD fread
#define MZ_FWRITE fwrite
-#define MZ_FTELL64 ftello64
-#define MZ_FSEEK64 fseeko64
-#define MZ_FILE_STAT_STRUCT _stat
-#define MZ_FILE_STAT _stat
+#define MZ_FTELL64 _ftelli64
+#define MZ_FSEEK64 _fseeki64
+#define MZ_FILE_STAT_STRUCT stat
+#define MZ_FILE_STAT stat
#define MZ_FFLUSH fflush
#define MZ_FREOPEN(f, m, s) freopen(f, m, s)
#define MZ_DELETE_FILE remove
+
#elif defined(__TINYC__)
#ifndef MINIZ_NO_TIME
#include <sys/utime.h>
@@ -3054,6 +3167,7 @@ static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream)
#define MZ_FFLUSH fflush
#define MZ_FREOPEN(f, m, s) freopen(f, m, s)
#define MZ_DELETE_FILE remove
+
#elif defined(__USE_LARGEFILE64) /* gcc, clang */
#ifndef MINIZ_NO_TIME
#include <utime.h>
@@ -3069,7 +3183,8 @@ static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream)
#define MZ_FFLUSH fflush
#define MZ_FREOPEN(p, m, s) freopen64(p, m, s)
#define MZ_DELETE_FILE remove
-#elif defined(__APPLE__)
+
+#elif defined(__APPLE__) || defined(__FreeBSD__)
#ifndef MINIZ_NO_TIME
#include <utime.h>
#endif
@@ -3215,7 +3330,7 @@ struct mz_zip_internal_state_tag
mz_zip_array m_sorted_central_dir_offsets;
/* The flags passed in when the archive is initially opened. */
- uint32_t m_init_flags;
+ mz_uint32 m_init_flags;
/* MZ_TRUE if the archive has a zip64 end of central directory headers, etc. */
mz_bool m_zip64;
@@ -3537,7 +3652,7 @@ static mz_bool mz_zip_reader_locate_header_sig(mz_zip_archive *pZip, mz_uint32 r
}
/* Give up if we've searched the entire file, or we've gone back "too far" (~64kb) */
- if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= (MZ_UINT16_MAX + record_size)))
+ if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= ((mz_uint64)(MZ_UINT16_MAX) + record_size)))
return MZ_FALSE;
cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0);
@@ -3651,7 +3766,7 @@ static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint flag
if (((num_this_disk | cdir_disk_index) != 0) && ((num_this_disk != 1) || (cdir_disk_index != 1)))
return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_MULTIDISK);
- if (cdir_size < pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)
+ if (cdir_size < (mz_uint64)pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)
return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED);
if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size)
@@ -3802,7 +3917,7 @@ static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint flag
void mz_zip_zero_struct(mz_zip_archive *pZip)
{
if (pZip)
- MZ_CLEAR_OBJ(*pZip);
+ MZ_CLEAR_PTR(pZip);
}
static mz_bool mz_zip_reader_end_internal(mz_zip_archive *pZip, mz_bool set_last_error)
@@ -4276,7 +4391,7 @@ static mz_bool mz_zip_locate_file_binary_search(mz_zip_archive *pZip, const char
const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;
const mz_zip_array *pCentral_dir = &pState->m_central_dir;
mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0);
- const uint32_t size = pZip->m_total_files;
+ const mz_uint32 size = pZip->m_total_files;
const mz_uint filename_len = (mz_uint)strlen(pFilename);
if (pIndex)
@@ -4291,7 +4406,7 @@ static mz_bool mz_zip_locate_file_binary_search(mz_zip_archive *pZip, const char
while (l <= h)
{
mz_int64 m = l + ((h - l) >> 1);
- uint32_t file_index = pIndices[(uint32_t)m];
+ mz_uint32 file_index = pIndices[(mz_uint32)m];
int comp = mz_zip_filename_compare(pCentral_dir, pCentral_dir_offsets, file_index, pFilename, filename_len);
if (!comp)
@@ -4384,7 +4499,8 @@ mz_bool mz_zip_reader_locate_file_v2(mz_zip_archive *pZip, const char *pName, co
return mz_zip_set_error(pZip, MZ_ZIP_FILE_NOT_FOUND);
}
-mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)
+static
+mz_bool mz_zip_reader_extract_to_mem_no_alloc1(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size, const mz_zip_archive_file_stat *st)
{
int status = TINFL_STATUS_DONE;
mz_uint64 needed_size, cur_file_ofs, comp_remaining, out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail;
@@ -4397,6 +4513,9 @@ mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file
if ((!pZip) || (!pZip->m_pState) || ((buf_size) && (!pBuf)) || ((user_read_buf_size) && (!pUser_read_buf)) || (!pZip->m_pRead))
return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER);
+ if (st) {
+ file_stat = *st;
+ } else
if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))
return MZ_FALSE;
@@ -4425,7 +4544,7 @@ mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file
if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)
return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED);
- cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
+ cur_file_ofs += (mz_uint64)(MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)
return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED);
@@ -4527,17 +4646,22 @@ mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file
return status == TINFL_STATUS_DONE;
}
+mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)
+{
+ return mz_zip_reader_extract_to_mem_no_alloc1(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size, NULL);
+}
+
mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)
{
mz_uint32 file_index;
if (!mz_zip_reader_locate_file_v2(pZip, pFilename, NULL, flags, &file_index))
return MZ_FALSE;
- return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size);
+ return mz_zip_reader_extract_to_mem_no_alloc1(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size, NULL);
}
mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags)
{
- return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, NULL, 0);
+ return mz_zip_reader_extract_to_mem_no_alloc1(pZip, file_index, pBuf, buf_size, flags, NULL, 0, NULL);
}
mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags)
@@ -4547,23 +4671,17 @@ mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFil
void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags)
{
- mz_uint64 comp_size, uncomp_size, alloc_size;
- const mz_uint8 *p = mz_zip_get_cdh(pZip, file_index);
+ mz_zip_archive_file_stat file_stat;
+ mz_uint64 alloc_size;
void *pBuf;
if (pSize)
*pSize = 0;
- if (!p)
- {
- mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER);
+ if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))
return NULL;
- }
-
- comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);
- uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);
- alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size;
+ alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size : file_stat.m_uncomp_size;
if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))
{
mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR);
@@ -4576,7 +4694,7 @@ void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, si
return NULL;
}
- if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size, flags))
+ if (!mz_zip_reader_extract_to_mem_no_alloc1(pZip, file_index, pBuf, (size_t)alloc_size, flags, NULL, 0, &file_stat))
{
pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);
return NULL;
@@ -4638,7 +4756,7 @@ mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_ind
if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)
return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED);
- cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
+ cur_file_ofs += (mz_uint64)(MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)
return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED);
@@ -4880,7 +4998,7 @@ mz_zip_reader_extract_iter_state* mz_zip_reader_extract_iter_new(mz_zip_archive
return NULL;
}
- pState->cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
+ pState->cur_file_ofs += (mz_uint64)(MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
if ((pState->cur_file_ofs + pState->file_stat.m_comp_size) > pZip->m_archive_size)
{
mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED);
@@ -5037,7 +5155,7 @@ size_t mz_zip_reader_extract_iter_read(mz_zip_reader_extract_iter_state* pState,
size_t to_copy = MZ_MIN( (buf_size - copied_to_caller), pState->out_blk_remain );
/* Copy data to caller's buffer */
- memcpy( (uint8_t*)pvBuf + copied_to_caller, pWrite_buf_cur, to_copy );
+ memcpy( (mz_uint8*)pvBuf + copied_to_caller, pWrite_buf_cur, to_copy );
#ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS
/* Perform CRC */
@@ -5406,7 +5524,7 @@ handle_failure:
mz_bool mz_zip_validate_archive(mz_zip_archive *pZip, mz_uint flags)
{
mz_zip_internal_state *pState;
- uint32_t i;
+ mz_uint32 i;
if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (!pZip->m_pRead))
return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER);
@@ -5424,9 +5542,6 @@ mz_bool mz_zip_validate_archive(mz_zip_archive *pZip, mz_uint flags)
}
else
{
- if (pZip->m_total_files >= MZ_UINT32_MAX)
- return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE);
-
if (pState->m_central_dir.m_size >= MZ_UINT32_MAX)
return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE);
}
@@ -5788,7 +5903,7 @@ mz_bool mz_zip_writer_init_file_v2(mz_zip_archive *pZip, const char *pFilename,
mz_uint64 cur_ofs = 0;
char buf[4096];
- MZ_CLEAR_OBJ(buf);
+ MZ_CLEAR_ARR(buf);
do
{
@@ -6151,7 +6266,7 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n
pState->m_zip64 = MZ_TRUE;
/*return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); */
}
- if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF))
+ if (((mz_uint64)buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF))
{
pState->m_zip64 = MZ_TRUE;
/*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */
@@ -6244,7 +6359,7 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n
}
cur_archive_file_ofs += num_alignment_padding_bytes;
- MZ_CLEAR_OBJ(local_dir_header);
+ MZ_CLEAR_ARR(local_dir_header);
if (!store_data_uncompressed || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA))
{
@@ -6394,7 +6509,7 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n
mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 max_size, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags,
const char *user_extra_data, mz_uint user_extra_data_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len)
{
- mz_uint16 gen_flags = (level_and_flags & MZ_ZIP_FLAG_WRITE_HEADER_SET_SIZE) ? 0 : MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR;
+ mz_uint16 gen_flags;
mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes;
mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0;
mz_uint64 local_dir_header_ofs, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0;
@@ -6406,13 +6521,15 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA
mz_zip_internal_state *pState;
mz_uint64 file_ofs = 0, cur_archive_header_file_ofs;
- if (!(level_and_flags & MZ_ZIP_FLAG_ASCII_FILENAME))
- gen_flags |= MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8;
-
if ((int)level_and_flags < 0)
level_and_flags = MZ_DEFAULT_LEVEL;
level = level_and_flags & 0xF;
+ gen_flags = (level_and_flags & MZ_ZIP_FLAG_WRITE_HEADER_SET_SIZE) ? 0 : MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR;
+
+ if (!(level_and_flags & MZ_ZIP_FLAG_ASCII_FILENAME))
+ gen_flags |= MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8;
+
/* Sanity checks */
if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION))
return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER);
@@ -6497,7 +6614,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA
method = MZ_DEFLATED;
}
- MZ_CLEAR_OBJ(local_dir_header);
+ MZ_CLEAR_ARR(local_dir_header);
if (pState->m_zip64)
{
if (max_size >= MZ_UINT32_MAX || local_dir_header_ofs >= MZ_UINT32_MAX)
@@ -6801,7 +6918,7 @@ mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name,
}
#endif /* #ifndef MINIZ_NO_STDIO */
-static mz_bool mz_zip_writer_update_zip64_extension_block(mz_zip_array *pNew_ext, mz_zip_archive *pZip, const mz_uint8 *pExt, uint32_t ext_len, mz_uint64 *pComp_size, mz_uint64 *pUncomp_size, mz_uint64 *pLocal_header_ofs, mz_uint32 *pDisk_start)
+static mz_bool mz_zip_writer_update_zip64_extension_block(mz_zip_array *pNew_ext, mz_zip_archive *pZip, const mz_uint8 *pExt, mz_uint32 ext_len, mz_uint64 *pComp_size, mz_uint64 *pUncomp_size, mz_uint64 *pLocal_header_ofs, mz_uint32 *pDisk_start)
{
/* + 64 should be enough for any new zip64 data */
if (!mz_zip_array_reserve(pZip, pNew_ext, ext_len + 64, MZ_FALSE))
@@ -6959,7 +7076,7 @@ mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *
local_header_extra_len = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);
local_header_comp_size = MZ_READ_LE32(pLocal_header + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS);
local_header_uncomp_size = MZ_READ_LE32(pLocal_header + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS);
- src_archive_bytes_remaining = local_header_filename_size + local_header_extra_len + src_file_stat.m_comp_size;
+ src_archive_bytes_remaining = src_file_stat.m_comp_size + local_header_filename_size + local_header_extra_len ;
/* Try to find a zip64 extended information field */
if ((local_header_extra_len) && ((local_header_comp_size == MZ_UINT32_MAX) || (local_header_uncomp_size == MZ_UINT32_MAX)))
@@ -7117,10 +7234,10 @@ mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *
if (pZip->m_pState->m_zip64)
{
/* dest is zip64, so upgrade the data descriptor */
- const mz_uint32 *pSrc_descriptor = (const mz_uint32 *)((const mz_uint8 *)pBuf + (has_id ? sizeof(mz_uint32) : 0));
- const mz_uint32 src_crc32 = pSrc_descriptor[0];
- const mz_uint64 src_comp_size = pSrc_descriptor[1];
- const mz_uint64 src_uncomp_size = pSrc_descriptor[2];
+ const mz_uint8 *pSrc_descriptor = (const mz_uint8 *)pBuf + (has_id ? sizeof(mz_uint32) : 0);
+ const mz_uint32 src_crc32 = MZ_READ_LE32(pSrc_descriptor);
+ const mz_uint64 src_comp_size = MZ_READ_LE32(pSrc_descriptor + sizeof(mz_uint32));
+ const mz_uint64 src_uncomp_size = MZ_READ_LE32(pSrc_descriptor + 2*sizeof(mz_uint32));
mz_write_le32((mz_uint8 *)pBuf, MZ_ZIP_DATA_DESCRIPTOR_ID);
mz_write_le32((mz_uint8 *)pBuf + sizeof(mz_uint32) * 1, src_crc32);
@@ -7256,7 +7373,7 @@ mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip)
if (pState->m_zip64)
{
- if ((pZip->m_total_files > MZ_UINT32_MAX) || (pState->m_central_dir.m_size >= MZ_UINT32_MAX))
+ if ((mz_uint64)pState->m_central_dir.m_size >= MZ_UINT32_MAX)
return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES);
}
else
@@ -7284,7 +7401,7 @@ mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip)
/* Write zip64 end of central directory header */
mz_uint64 rel_ofs_to_zip64_ecdr = pZip->m_archive_size;
- MZ_CLEAR_OBJ(hdr);
+ MZ_CLEAR_ARR(hdr);
MZ_WRITE_LE32(hdr + MZ_ZIP64_ECDH_SIG_OFS, MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIG);
MZ_WRITE_LE64(hdr + MZ_ZIP64_ECDH_SIZE_OF_RECORD_OFS, MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE - sizeof(mz_uint32) - sizeof(mz_uint64));
MZ_WRITE_LE16(hdr + MZ_ZIP64_ECDH_VERSION_MADE_BY_OFS, 0x031E); /* TODO: always Unix */
@@ -7299,7 +7416,7 @@ mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip)
pZip->m_archive_size += MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE;
/* Write zip64 end of central directory locator */
- MZ_CLEAR_OBJ(hdr);
+ MZ_CLEAR_ARR(hdr);
MZ_WRITE_LE32(hdr + MZ_ZIP64_ECDL_SIG_OFS, MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG);
MZ_WRITE_LE64(hdr + MZ_ZIP64_ECDL_REL_OFS_TO_ZIP64_ECDR_OFS, rel_ofs_to_zip64_ecdr);
MZ_WRITE_LE32(hdr + MZ_ZIP64_ECDL_TOTAL_NUMBER_OF_DISKS_OFS, 1);
@@ -7310,7 +7427,7 @@ mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip)
}
/* Write end of central directory record */
- MZ_CLEAR_OBJ(hdr);
+ MZ_CLEAR_ARR(hdr);
MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG);
MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, MZ_MIN(MZ_UINT16_MAX, pZip->m_total_files));
MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, MZ_MIN(MZ_UINT16_MAX, pZip->m_total_files));
@@ -7626,7 +7743,9 @@ const char *mz_zip_get_error_string(mz_zip_error mz_err)
case MZ_ZIP_VALIDATION_FAILED:
return "validation failed";
case MZ_ZIP_WRITE_CALLBACK_FAILED:
- return "write calledback failed";
+ return "write callback failed";
+ case MZ_ZIP_TOTAL_ERRORS:
+ return "total errors";
default:
break;
}
diff --git a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/miniz.h b/graphics/asymptote/tinyexr/deps/miniz/miniz.h
index 6cc398c920..9fcfffcc8c 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/miniz.h
+++ b/graphics/asymptote/tinyexr/deps/miniz/miniz.h
@@ -1,5 +1,7 @@
+#ifndef MINIZ_EXPORT
#define MINIZ_EXPORT
-/* miniz.c 2.2.0 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing
+#endif
+/* miniz.c 3.0.0 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing
See "unlicense" statement at the end of this file.
Rich Geldreich <richgel99@gmail.com>, last updated Oct. 13, 2013
Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt
@@ -116,7 +118,7 @@
/* Defines to completely disable specific portions of miniz.c:
- If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl. */
+ If all macros here are defined the only functionality remaining will be CRC-32 and adler-32. */
/* Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O. */
/*#define MINIZ_NO_STDIO */
@@ -126,6 +128,12 @@
/* The current downside is the times written to your archives will be from 1979. */
/*#define MINIZ_NO_TIME */
+/* Define MINIZ_NO_DEFLATE_APIS to disable all compression API's. */
+/*#define MINIZ_NO_DEFLATE_APIS */
+
+/* Define MINIZ_NO_INFLATE_APIS to disable all decompression API's. */
+/*#define MINIZ_NO_INFLATE_APIS */
+
/* Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's. */
/*#define MINIZ_NO_ARCHIVE_APIS */
@@ -144,6 +152,14 @@
functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work. */
/*#define MINIZ_NO_MALLOC */
+#ifdef MINIZ_NO_INFLATE_APIS
+#define MINIZ_NO_ARCHIVE_APIS
+#endif
+
+#ifdef MINIZ_NO_DEFLATE_APIS
+#define MINIZ_NO_ARCHIVE_WRITING_APIS
+#endif
+
#if defined(__TINYC__) && (defined(__linux) || defined(__linux__))
/* TODO: Work around "error: include file 'sys\utime.h' when compiling with tcc on Linux */
#define MINIZ_NO_TIME
@@ -162,18 +178,40 @@
#define MINIZ_X86_OR_X64_CPU 0
#endif
-#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU
+/* Set MINIZ_LITTLE_ENDIAN only if not set */
+#if !defined(MINIZ_LITTLE_ENDIAN)
+#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__)
+
+#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
/* Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. */
#define MINIZ_LITTLE_ENDIAN 1
#else
#define MINIZ_LITTLE_ENDIAN 0
#endif
+#else
+
+#if MINIZ_X86_OR_X64_CPU
+#define MINIZ_LITTLE_ENDIAN 1
+#else
+#define MINIZ_LITTLE_ENDIAN 0
+#endif
+
+#endif
+#endif
+
+/* Using unaligned loads and stores causes errors when using UBSan */
+#if defined(__has_feature)
+#if __has_feature(undefined_behavior_sanitizer)
+#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 0
+#endif
+#endif
+
/* Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES only if not set */
#if !defined(MINIZ_USE_UNALIGNED_LOADS_AND_STORES)
#if MINIZ_X86_OR_X64_CPU
/* Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses. */
-#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
+#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 0
#define MINIZ_UNALIGNED_USE_MEMCPY
#else
#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 0
@@ -237,9 +275,9 @@ enum
MZ_DEFAULT_COMPRESSION = -1
};
-#define MZ_VERSION "10.2.0"
-#define MZ_VERNUM 0xA100
-#define MZ_VER_MAJOR 10
+#define MZ_VERSION "11.0.2"
+#define MZ_VERNUM 0xB002
+#define MZ_VER_MAJOR 11
#define MZ_VER_MINOR 2
#define MZ_VER_REVISION 0
#define MZ_VER_SUBREVISION 0
@@ -305,6 +343,8 @@ typedef mz_stream *mz_streamp;
/* Returns the version string of miniz.c. */
MINIZ_EXPORT const char *mz_version(void);
+#ifndef MINIZ_NO_DEFLATE_APIS
+
/* mz_deflateInit() initializes a compressor with default options: */
/* Parameters: */
/* pStream must point to an initialized mz_stream struct. */
@@ -357,6 +397,10 @@ MINIZ_EXPORT int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const u
/* mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress(). */
MINIZ_EXPORT mz_ulong mz_compressBound(mz_ulong source_len);
+#endif /*#ifndef MINIZ_NO_DEFLATE_APIS*/
+
+#ifndef MINIZ_NO_INFLATE_APIS
+
/* Initializes a decompressor. */
MINIZ_EXPORT int mz_inflateInit(mz_streamp pStream);
@@ -390,6 +434,7 @@ MINIZ_EXPORT int mz_inflateEnd(mz_streamp pStream);
/* Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure. */
MINIZ_EXPORT int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len);
MINIZ_EXPORT int mz_uncompress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong *pSource_len);
+#endif /*#ifndef MINIZ_NO_INFLATE_APIS*/
/* Returns a string description of the specified error code, or NULL if the error code is invalid. */
MINIZ_EXPORT const char *mz_error(int err);
@@ -440,6 +485,8 @@ typedef void *const voidpc;
#define free_func mz_free_func
#define internal_state mz_internal_state
#define z_stream mz_stream
+
+#ifndef MINIZ_NO_DEFLATE_APIS
#define deflateInit mz_deflateInit
#define deflateInit2 mz_deflateInit2
#define deflateReset mz_deflateReset
@@ -449,6 +496,9 @@ typedef void *const voidpc;
#define compress mz_compress
#define compress2 mz_compress2
#define compressBound mz_compressBound
+#endif /*#ifndef MINIZ_NO_DEFLATE_APIS*/
+
+#ifndef MINIZ_NO_INFLATE_APIS
#define inflateInit mz_inflateInit
#define inflateInit2 mz_inflateInit2
#define inflateReset mz_inflateReset
@@ -456,6 +506,8 @@ typedef void *const voidpc;
#define inflateEnd mz_inflateEnd
#define uncompress mz_uncompress
#define uncompress2 mz_uncompress2
+#endif /*#ifndef MINIZ_NO_INFLATE_APIS*/
+
#define crc32 mz_crc32
#define adler32 mz_adler32
#define MAX_WBITS 15
@@ -519,7 +571,8 @@ typedef int mz_bool;
#ifdef MINIZ_NO_TIME
typedef struct mz_dummy_time_t_tag
{
- int m_dummy;
+ mz_uint32 m_dummy1;
+ mz_uint32 m_dummy2;
} mz_dummy_time_t;
#define MZ_TIME_T mz_dummy_time_t
#else
@@ -541,6 +594,8 @@ typedef struct mz_dummy_time_t_tag
#define MZ_MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MZ_MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))
+#define MZ_CLEAR_ARR(obj) memset((obj), 0, sizeof(obj))
+#define MZ_CLEAR_PTR(obj) memset((obj), 0, sizeof(*obj))
#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
#define MZ_READ_LE16(p) *((const mz_uint16 *)(p))
@@ -577,6 +632,8 @@ extern MINIZ_EXPORT void *miniz_def_realloc_func(void *opaque, void *address, si
#pragma once
+#ifndef MINIZ_NO_DEFLATE_APIS
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -764,10 +821,14 @@ MINIZ_EXPORT void tdefl_compressor_free(tdefl_compressor *pComp);
#ifdef __cplusplus
}
#endif
+
+#endif /*#ifndef MINIZ_NO_DEFLATE_APIS*/
#pragma once
/* ------------------- Low-level Decompression API Definitions */
+#ifndef MINIZ_NO_INFLATE_APIS
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -876,12 +937,6 @@ enum
TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS
};
-typedef struct
-{
- mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0];
- mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2];
-} tinfl_huff_table;
-
#if MINIZ_HAS_64BIT_REGISTERS
#define TINFL_USE_64BIT_BITBUF 1
#else
@@ -901,13 +956,21 @@ struct tinfl_decompressor_tag
mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES];
tinfl_bit_buf_t m_bit_buf;
size_t m_dist_from_out_buf_start;
- tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES];
+ mz_int16 m_look_up[TINFL_MAX_HUFF_TABLES][TINFL_FAST_LOOKUP_SIZE];
+ mz_int16 m_tree_0[TINFL_MAX_HUFF_SYMBOLS_0 * 2];
+ mz_int16 m_tree_1[TINFL_MAX_HUFF_SYMBOLS_1 * 2];
+ mz_int16 m_tree_2[TINFL_MAX_HUFF_SYMBOLS_2 * 2];
+ mz_uint8 m_code_size_0[TINFL_MAX_HUFF_SYMBOLS_0];
+ mz_uint8 m_code_size_1[TINFL_MAX_HUFF_SYMBOLS_1];
+ mz_uint8 m_code_size_2[TINFL_MAX_HUFF_SYMBOLS_2];
mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137];
};
#ifdef __cplusplus
}
#endif
+
+#endif /*#ifndef MINIZ_NO_INFLATE_APIS*/
#pragma once
@@ -942,10 +1005,6 @@ typedef struct
mz_uint16 m_bit_flag;
mz_uint16 m_method;
-#ifndef MINIZ_NO_TIME
- MZ_TIME_T m_time;
-#endif
-
/* CRC-32 of uncompressed data. */
mz_uint32 m_crc32;
@@ -982,6 +1041,11 @@ typedef struct
/* Guaranteed to be zero terminated, may be truncated to fit. */
char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE];
+#ifdef MINIZ_NO_TIME
+ MZ_TIME_T m_padding;
+#else
+ MZ_TIME_T m_time;
+#endif
} mz_zip_archive_file_stat;
typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n);
@@ -1093,9 +1157,7 @@ typedef struct
mz_uint flags;
int status;
-#ifndef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS
- mz_uint file_crc32;
-#endif
+
mz_uint64 read_buf_size, read_buf_ofs, read_buf_avail, comp_remaining, out_buf_ofs, cur_file_ofs;
mz_zip_archive_file_stat file_stat;
void *pRead_buf;
@@ -1105,6 +1167,12 @@ typedef struct
tinfl_decompressor inflator;
+#ifdef MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS
+ mz_uint padding;
+#else
+ mz_uint file_crc32;
+#endif
+
} mz_zip_reader_extract_iter_state;
/* -------- ZIP reading */
@@ -1228,9 +1296,9 @@ MINIZ_EXPORT mz_bool mz_zip_reader_extract_file_to_cfile(mz_zip_archive *pZip, c
/* TODO */
typedef void *mz_zip_streaming_extract_state_ptr;
mz_zip_streaming_extract_state_ptr mz_zip_streaming_extract_begin(mz_zip_archive *pZip, mz_uint file_index, mz_uint flags);
- uint64_t mz_zip_streaming_extract_get_size(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState);
- uint64_t mz_zip_streaming_extract_get_cur_ofs(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState);
- mz_bool mz_zip_streaming_extract_seek(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState, uint64_t new_ofs);
+ mz_uint64 mz_zip_streaming_extract_get_size(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState);
+ mz_uint64 mz_zip_streaming_extract_get_cur_ofs(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState);
+ mz_bool mz_zip_streaming_extract_seek(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState, mz_uint64 new_ofs);
size_t mz_zip_streaming_extract_read(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState, void *pBuf, size_t buf_size);
mz_bool mz_zip_streaming_extract_end(mz_zip_archive *pZip, mz_zip_streaming_extract_state_ptr pState);
#endif
@@ -1244,7 +1312,9 @@ MINIZ_EXPORT mz_bool mz_zip_validate_archive(mz_zip_archive *pZip, mz_uint flags
/* Misc utils/helpers, valid for ZIP reading or writing */
MINIZ_EXPORT mz_bool mz_zip_validate_mem_archive(const void *pMem, size_t size, mz_uint flags, mz_zip_error *pErr);
+#ifndef MINIZ_NO_STDIO
MINIZ_EXPORT mz_bool mz_zip_validate_file_archive(const char *pFilename, mz_uint flags, mz_zip_error *pErr);
+#endif
/* Universal end function - calls either mz_zip_reader_end() or mz_zip_writer_end(). */
MINIZ_EXPORT mz_bool mz_zip_end(mz_zip_archive *pZip);
@@ -1318,7 +1388,7 @@ MINIZ_EXPORT mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_
/* An archive must be manually finalized by calling this function for it to be valid. */
MINIZ_EXPORT mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip);
-/* Finalizes a heap archive, returning a poiner to the heap block and its size. */
+/* Finalizes a heap archive, returning a pointer to the heap block and its size. */
/* The heap block will be allocated using the mz_zip_archive's alloc/realloc callbacks. */
MINIZ_EXPORT mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **ppBuf, size_t *pSize);
@@ -1335,11 +1405,13 @@ MINIZ_EXPORT mz_bool mz_zip_writer_end(mz_zip_archive *pZip);
MINIZ_EXPORT mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);
MINIZ_EXPORT mz_bool mz_zip_add_mem_to_archive_file_in_place_v2(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_zip_error *pErr);
+#ifndef MINIZ_NO_STDIO
/* Reads a single file from an archive into a heap block. */
/* If pComment is not NULL, only the file with the specified comment will be extracted. */
/* Returns NULL on failure. */
MINIZ_EXPORT void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint flags);
MINIZ_EXPORT void *mz_zip_extract_archive_file_to_heap_v2(const char *pZip_filename, const char *pArchive_name, const char *pComment, size_t *pSize, mz_uint flags, mz_zip_error *pErr);
+#endif
#endif /* #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS */
diff --git a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/readme.md b/graphics/asymptote/tinyexr/deps/miniz/readme.md
index 3f8fd73247..9734435fab 100644
--- a/graphics/asymptote/cudareflect/tinyexr/deps/miniz/readme.md
+++ b/graphics/asymptote/tinyexr/deps/miniz/readme.md
@@ -4,7 +4,7 @@ Miniz is a lossless, high performance data compression library in a single sourc
## Usage
-Please use the files from the [releases page](https://github.com/richgel999/miniz/releases) in your projects. Do not use the git checkout directly! The different source and header files are [amalgamated](https://www.sqlite.org/amalgamation.html) into one `miniz.c`/`miniz.h` pair in a build step (`amalgamate.sh`). Include `miniz.c` and `miniz.h` in your project to use Miniz.
+Releases are available at the [releases page](https://github.com/richgel999/miniz/releases) as a pair of `miniz.c`/`miniz.h` files which can be simply added to a project. To create this file pair the different source and header files are [amalgamated](https://www.sqlite.org/amalgamation.html) during build. Alternatively use as cmake or meson module (or build system of your choice).
## Features
@@ -18,6 +18,18 @@ Please use the files from the [releases page](https://github.com/richgel999/mini
* Entire inflater (including optional zlib header parsing and Adler-32 checking) is implemented in a single function as a coroutine, which is separately available in a small (~550 line) source file: miniz_tinfl.c
* A fairly complete (but totally optional) set of .ZIP archive manipulation and extraction API's. The archive functionality is intended to solve common problems encountered in embedded, mobile, or game development situations. (The archive API's are purposely just powerful enough to write an entire archiver given a bit of additional higher-level logic.)
+## Building miniz - Using vcpkg
+
+You can download and install miniz using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:
+
+ git clone https://github.com/Microsoft/vcpkg.git
+ cd vcpkg
+ ./bootstrap-vcpkg.sh
+ ./vcpkg integrate install
+ ./vcpkg install miniz
+
+The miniz port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
+
## Known Problems
* No support for encrypted archives. Not sure how useful this stuff is in practice.
diff --git a/graphics/asymptote/tinyexr/deps/nanozlib/README.md b/graphics/asymptote/tinyexr/deps/nanozlib/README.md
new file mode 100644
index 0000000000..d44cd1c33a
--- /dev/null
+++ b/graphics/asymptote/tinyexr/deps/nanozlib/README.md
@@ -0,0 +1,48 @@
+# nanozlib
+
+Nanoscale secure zlib decoding utilizing wuffs `std/zlib`, and somewhat secure zlib compression using stb'z lib, written in portable C/C++(Mostly C).
+
+nanozib provides very limited zlib decoding and encoding functionalities.
+nanozib is good to embed zlib support to your C/C++ application.
+
+## Requirements
+
+* C99, C++11 or later
+
+## Advantages and disadvantages
+
+* Advantage(s)
+ * Born to be super secure.
+ * No assert, No C++ exception. No segfault for corrupted/malcious zlib data.
+
+* Disadvantage(s)
+ * Up to 2GB.
+ * 50 KB or more in compiled binary(even compiled with `-Os`)
+ * If you want picoscale zlib decoder, please take a look at zlib module in stb_image https://github.com/nothings/stb
+
+## Example
+
+```
+$ make
+# 11 = uncompressed size
+$ ./test_nanozdec test/test-000.txt.zz 11
+```
+
+
+## Wuffs version
+
+v0.3.0
+
+## TODO
+
+* [ ] compress using wuffs or fpng's encoder. wuffs doesn't provide zlib encoding feature at the moment.
+
+## License
+
+Apache 2.0 for decoding part.
+Public domin for encoding part.
+
+### Third party licenses
+
+* wuffs. Apache 2.0. https://github.com/google/wuffs
+* stb zlib. Public domain. https://github.com/nothings/stb
diff --git a/graphics/asymptote/tinyexr/deps/nanozlib/nanozlib.h b/graphics/asymptote/tinyexr/deps/nanozlib/nanozlib.h
new file mode 100644
index 0000000000..88d18ae24f
--- /dev/null
+++ b/graphics/asymptote/tinyexr/deps/nanozlib/nanozlib.h
@@ -0,0 +1,471 @@
+/* SPDX-License-Identifier: Apache 2.0 */
+/* Copyright 2023 - Present, Light Transport Entertainment Inc. */
+
+/* TODO:
+ *
+ * - [ ] Stream decoding API
+ * - [ ] Stream encoding API
+ *
+ */
+
+#ifndef NANOZLIB_H_
+#define NANOZLIB_H_
+
+#include <stdint.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum nanoz_status {
+ NANOZ_SUCCESS = 0,
+ NANOZ_ERROR = -1, // general error code.
+ NANOZ_ERROR_INVALID_ARGUMENT = -2,
+ NANOZ_ERROR_CORRUPTED = -3,
+ NANOZ_ERROR_INTERNAL = -4,
+} nanoz_status_t;
+
+#if 0 // TODO
+/* Up to 2GB chunk. */
+typedef (*nanoz_stream_read)(const uint8_t *addr, uint8_t *dst_addr, const uint32_t read_bytes, const void *user_ptr);
+typedef (*nanoz_stream_write)(const uint8_t *addr, const uint32_t write_bytes, const void *user_ptr);
+#endif
+
+/* TODO: Get uncompressed size function */
+
+/*
+ * zlib decompression. Up to 2GB compressed data.
+ *
+ * @param[in] src_addr Source buffer address containing compressed data.
+ * @param[in] src_size Source buffer bytes.
+ * @param[in] dst_size Destination buffer size. Must be larger than or equal to uncompressed size.
+ * @param[out] dst_addr Destination buffer address.
+ * @param[out] uncompressed_size Uncompressed bytes.
+ * contain `uncompressed_size` bytes.
+ * @return NANOZ_SUCCESS upon success.
+ *
+ * TODO: return error message string.
+ */
+nanoz_status_t nanoz_uncompress(const unsigned char *src_addr,
+ int32_t src_size,
+ const uint64_t dst_size,
+ unsigned char *dst_addr,
+ uint64_t *uncompressed_size);
+
+/*
+ * Compute compress bound.
+ */
+uint64_t nanoz_compressBound(uint64_t sourceLen);
+
+/*
+ * zlib compression. Currently we use stb's zlib_compress
+ *
+ * @param[in] data Input data
+ * @param[in] data_len Input data bytes(up to 2GB)
+ * @param[out] out_len Input data
+ * @param[in] quality Compression quality(5 or more. Usually 8)
+ *
+ * @return Compressed bytes upon success. NULL when failed to compress or any input parameter is wrong.
+ */
+unsigned char *nanoz_compress(unsigned char *data, int data_len, int *out_len,
+ int quality);
+
+#if 0 // TODO
+nanoz_status_t nanoz_stream_uncompress(nanoz_stream_read *reader, nanoz_stream_writer *writer);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#if defined(NANOZLIB_IMPLEMENTATION)
+
+#define WUFFS_IMPLEMENTATION
+
+#define WUFFS_CONFIG__STATIC_FUNCTIONS
+
+#define WUFFS_CONFIG__MODULES
+#define WUFFS_CONFIG__MODULE__BASE
+#define WUFFS_CONFIG__MODULE__CRC32
+#define WUFFS_CONFIG__MODULE__ADLER32
+#define WUFFS_CONFIG__MODULE__DEFLATE
+#define WUFFS_CONFIG__MODULE__ZLIB
+
+#include "wuffs-v0.3.c"
+
+#define WORK_BUFFER_ARRAY_SIZE \
+ WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE
+
+nanoz_status_t nanoz_uncompress(const unsigned char *src_addr,
+ const int32_t src_size,
+ const uint64_t dst_size,
+ unsigned char *dst_addr,
+ uint64_t *uncompressed_size_out) {
+// WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE = 1, its tiny bytes and
+// safe to alloc worbuf at heap location.
+#if WORK_BUFFER_ARRAY_SIZE > 0
+ uint8_t work_buffer_array[WORK_BUFFER_ARRAY_SIZE];
+#else
+ // Not all C/C++ compilers support 0-length arrays.
+ uint8_t work_buffer_array[1];
+#endif
+
+ if (!src_addr) {
+ return NANOZ_ERROR_INVALID_ARGUMENT;
+ }
+
+ if (src_size < 4) {
+ return NANOZ_ERROR_INVALID_ARGUMENT;
+ }
+
+ if (!dst_addr) {
+ return NANOZ_ERROR_INVALID_ARGUMENT;
+ }
+
+ if (dst_size < 1) {
+ return NANOZ_ERROR_INVALID_ARGUMENT;
+ }
+
+ if (!uncompressed_size_out) {
+ return NANOZ_ERROR_INVALID_ARGUMENT;
+ }
+
+ wuffs_zlib__decoder dec;
+ wuffs_base__status status =
+ wuffs_zlib__decoder__initialize(&dec, sizeof dec, WUFFS_VERSION, 0);
+ if (!wuffs_base__status__is_ok(&status)) {
+ // wuffs_base__status__message(&status);
+ return NANOZ_ERROR_INTERNAL;
+ }
+
+ // TODO: Streamed decoding?
+
+ wuffs_base__io_buffer dst;
+ dst.data.ptr = dst_addr;
+ dst.data.len = dst_size;
+ dst.meta.wi = 0;
+ dst.meta.ri = 0;
+ dst.meta.pos = 0;
+ dst.meta.closed = false;
+
+ wuffs_base__io_buffer src;
+ src.data.ptr = const_cast<uint8_t *>(src_addr); // remove const
+ src.data.len = src_size;
+ src.meta.wi = src_size;
+ src.meta.ri = 0;
+ src.meta.pos = 0;
+ src.meta.closed = false;
+
+ status = wuffs_zlib__decoder__transform_io(
+ &dec, &dst, &src,
+ wuffs_base__make_slice_u8(work_buffer_array, WORK_BUFFER_ARRAY_SIZE));
+
+ uint64_t uncompressed_size{0};
+
+ if (dst.meta.wi) {
+ dst.meta.ri = dst.meta.wi;
+ uncompressed_size = dst.meta.wi;
+ wuffs_base__io_buffer__compact(&dst);
+ }
+
+ if (status.repr == wuffs_base__suspension__short_read) {
+ // ok
+ } else if (status.repr == wuffs_base__suspension__short_write) {
+ // read&write should succeed at once.
+ return NANOZ_ERROR_CORRUPTED;
+ }
+
+ const char *stat_msg = wuffs_base__status__message(&status);
+ if (stat_msg) {
+ return NANOZ_ERROR_INTERNAL;
+ }
+
+ (*uncompressed_size_out) = uncompressed_size;
+
+ return NANOZ_SUCCESS;
+}
+
+#ifndef NANOZ_MALLOC
+#define NANOZ_MALLOC(sz) malloc(sz)
+#define NANOZ_REALLOC(p, newsz) realloc(p, newsz)
+#define NANOZ_FREE(p) free(p)
+#endif
+
+#ifndef NANOZ_REALLOC_SIZED
+#define NANOZ_REALLOC_SIZED(p, oldsz, newsz) NANOZ_REALLOC(p, newsz)
+#endif
+
+#ifndef NANOZ_MEMMOVE
+#define NANOZ_MEMMOVE(a, b, sz) memmove(a, b, sz)
+#endif
+
+#define NANOZ_UCHAR(x) (unsigned char)((x)&0xff)
+
+// #ifndef NANOZ_ZLIB_COMPRESS
+// stretchy buffer; nanoz__sbpush() == vector<>::push_back() --
+// nanoz__sbcount() == vector<>::size()
+#define nanoz__sbraw(a) ((int *)(void *)(a)-2)
+#define nanoz__sbm(a) nanoz__sbraw(a)[0]
+#define nanoz__sbn(a) nanoz__sbraw(a)[1]
+
+#define nanoz__sbneedgrow(a, n) ((a) == 0 || nanoz__sbn(a) + n >= nanoz__sbm(a))
+#define nanoz__sbmaybegrow(a, n) \
+ (nanoz__sbneedgrow(a, (n)) ? nanoz__sbgrow(a, n) : 0)
+#define nanoz__sbgrow(a, n) nanoz__sbgrowf((void **)&(a), (n), sizeof(*(a)))
+
+#define nanoz__sbpush(a, v) \
+ (nanoz__sbmaybegrow(a, 1), (a)[nanoz__sbn(a)++] = (v))
+#define nanoz__sbcount(a) ((a) ? nanoz__sbn(a) : 0)
+#define nanoz__sbfree(a) ((a) ? NANOZ_FREE(nanoz__sbraw(a)), 0 : 0)
+
+static void *nanoz__sbgrowf(void **arr, int increment, int itemsize) {
+ int m = *arr ? 2 * nanoz__sbm(*arr) + increment : increment + 1;
+ void *p = NANOZ_REALLOC_SIZED(
+ *arr ? nanoz__sbraw(*arr) : 0,
+ *arr ? (nanoz__sbm(*arr) * itemsize + sizeof(int) * 2) : 0,
+ itemsize * m + sizeof(int) * 2);
+ if (!p) {
+ return nullptr;
+ }
+
+ if (p) {
+ if (!*arr) ((int *)p)[1] = 0;
+ *arr = (void *)((int *)p + 2);
+ nanoz__sbm(*arr) = m;
+ }
+ return *arr;
+}
+
+static unsigned char *nanoz__zlib_flushf(unsigned char *data,
+ unsigned int *bitbuffer,
+ int *bitcount) {
+ while (*bitcount >= 8) {
+ nanoz__sbpush(data, NANOZ_UCHAR(*bitbuffer));
+ *bitbuffer >>= 8;
+ *bitcount -= 8;
+ }
+ return data;
+}
+
+static int nanoz__zlib_bitrev(int code, int codebits) {
+ int res = 0;
+ while (codebits--) {
+ res = (res << 1) | (code & 1);
+ code >>= 1;
+ }
+ return res;
+}
+
+static unsigned int nanoz__zlib_countm(unsigned char *a, unsigned char *b,
+ int limit) {
+ int i;
+ for (i = 0; i < limit && i < 258; ++i)
+ if (a[i] != b[i]) break;
+ return i;
+}
+
+static unsigned int nanoz__zhash(unsigned char *data) {
+ uint32_t hash = data[0] + (data[1] << 8) + (data[2] << 16);
+ hash ^= hash << 3;
+ hash += hash >> 5;
+ hash ^= hash << 4;
+ hash += hash >> 17;
+ hash ^= hash << 25;
+ hash += hash >> 6;
+ return hash;
+}
+
+#define nanoz__zlib_flush() (out = nanoz__zlib_flushf(out, &bitbuf, &bitcount))
+#define nanoz__zlib_add(code, codebits) \
+ (bitbuf |= (code) << bitcount, bitcount += (codebits), nanoz__zlib_flush())
+#define nanoz__zlib_huffa(b, c) nanoz__zlib_add(nanoz__zlib_bitrev(b, c), c)
+// default huffman tables
+#define nanoz__zlib_huff1(n) nanoz__zlib_huffa(0x30 + (n), 8)
+#define nanoz__zlib_huff2(n) nanoz__zlib_huffa(0x190 + (n)-144, 9)
+#define nanoz__zlib_huff3(n) nanoz__zlib_huffa(0 + (n)-256, 7)
+#define nanoz__zlib_huff4(n) nanoz__zlib_huffa(0xc0 + (n)-280, 8)
+#define nanoz__zlib_huff(n) \
+ ((n) <= 143 ? nanoz__zlib_huff1(n) \
+ : (n) <= 255 ? nanoz__zlib_huff2(n) \
+ : (n) <= 279 ? nanoz__zlib_huff3(n) \
+ : nanoz__zlib_huff4(n))
+#define nanoz__zlib_huffb(n) \
+ ((n) <= 143 ? nanoz__zlib_huff1(n) : nanoz__zlib_huff2(n))
+
+#define nanoz__ZHASH 16384
+
+// #endif // NANOZ_ZLIB_COMPRESS
+
+unsigned char *nanoz_compress(unsigned char *data, int data_len, int *out_len,
+ int quality) {
+ static unsigned short lengthc[] = {
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27,
+ 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 259};
+ static unsigned char lengtheb[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
+ 4, 4, 4, 4, 5, 5, 5, 5, 0};
+ static unsigned short distc[] = {
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33,
+ 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537,
+ 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 32768};
+ static unsigned char disteb[] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3,
+ 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 9, 9, 10, 10, 11, 11, 12, 12, 13, 13};
+ unsigned int bitbuf = 0;
+ int i, j, bitcount = 0;
+ unsigned char *out = NULL;
+
+ if (!data) {
+ return NULL;
+ }
+
+ if (data_len < 1) {
+ return NULL;
+ }
+
+ if (!out_len) {
+ return NULL;
+ }
+
+ unsigned char ***hash_table =
+ (unsigned char ***)NANOZ_MALLOC(nanoz__ZHASH * sizeof(unsigned char **));
+ if (hash_table == NULL) return NULL;
+ if (quality < 5) quality = 5;
+
+ nanoz__sbpush(out, 0x78); // DEFLATE 32K window
+ nanoz__sbpush(out, 0x5e); // FLEVEL = 1
+ nanoz__zlib_add(1, 1); // BFINAL = 1
+ nanoz__zlib_add(1, 2); // BTYPE = 1 -- fixed huffman
+
+ for (i = 0; i < nanoz__ZHASH; ++i) hash_table[i] = NULL;
+
+ i = 0;
+ while (i < data_len - 3) {
+ // hash next 3 bytes of data to be compressed
+ int h = nanoz__zhash(data + i) & (nanoz__ZHASH - 1), best = 3;
+ unsigned char *bestloc = 0;
+ unsigned char **hlist = hash_table[h];
+ int n = nanoz__sbcount(hlist);
+ for (j = 0; j < n; ++j) {
+ if (hlist[j] - data > i - 32768) { // if entry lies within window
+ int d = nanoz__zlib_countm(hlist[j], data + i, data_len - i);
+ if (d >= best) {
+ best = d;
+ bestloc = hlist[j];
+ }
+ }
+ }
+ // when hash table entry is too long, delete half the entries
+ if (hash_table[h] && nanoz__sbn(hash_table[h]) == 2 * quality) {
+ NANOZ_MEMMOVE(hash_table[h], hash_table[h] + quality,
+ sizeof(hash_table[h][0]) * quality);
+ nanoz__sbn(hash_table[h]) = quality;
+ }
+ nanoz__sbpush(hash_table[h], data + i);
+
+ if (bestloc) {
+ // "lazy matching" - check match at *next* byte, and if it's better, do
+ // cur byte as literal
+ h = nanoz__zhash(data + i + 1) & (nanoz__ZHASH - 1);
+ hlist = hash_table[h];
+ n = nanoz__sbcount(hlist);
+ for (j = 0; j < n; ++j) {
+ if (hlist[j] - data > i - 32767) {
+ int e = nanoz__zlib_countm(hlist[j], data + i + 1, data_len - i - 1);
+ if (e > best) { // if next match is better, bail on current match
+ bestloc = NULL;
+ break;
+ }
+ }
+ }
+ }
+
+ if (bestloc) {
+ int d = (int)(data + i - bestloc); // distance back
+ // NANOZ_ASSERT(d <= 32767 && best <= 258);
+ if (d <= 32767 && best <= 258) {
+ // OK
+ } else {
+ return NULL; // FIXME: may leak
+ }
+ for (j = 0; best > lengthc[j + 1] - 1; ++j)
+ ;
+ nanoz__zlib_huff(j + 257);
+ if (lengtheb[j]) nanoz__zlib_add(best - lengthc[j], lengtheb[j]);
+ for (j = 0; d > distc[j + 1] - 1; ++j)
+ ;
+ nanoz__zlib_add(nanoz__zlib_bitrev(j, 5), 5);
+ if (disteb[j]) nanoz__zlib_add(d - distc[j], disteb[j]);
+ i += best;
+ } else {
+ nanoz__zlib_huffb(data[i]);
+ ++i;
+ }
+ }
+ // write out final bytes
+ for (; i < data_len; ++i) nanoz__zlib_huffb(data[i]);
+ nanoz__zlib_huff(256); // end of block
+ // pad with 0 bits to byte boundary
+ while (bitcount) nanoz__zlib_add(0, 1);
+
+ for (i = 0; i < nanoz__ZHASH; ++i) (void)nanoz__sbfree(hash_table[i]);
+ NANOZ_FREE(hash_table);
+
+ // store uncompressed instead if compression was worse
+ if (nanoz__sbn(out) > data_len + 2 + ((data_len + 32766) / 32767) * 5) {
+ nanoz__sbn(out) = 2; // truncate to DEFLATE 32K window and FLEVEL = 1
+ for (j = 0; j < data_len;) {
+ int blocklen = data_len - j;
+ if (blocklen > 32767) blocklen = 32767;
+ nanoz__sbpush(
+ out,
+ data_len - j == blocklen); // BFINAL = ?, BTYPE = 0 -- no compression
+ nanoz__sbpush(out, NANOZ_UCHAR(blocklen)); // LEN
+ nanoz__sbpush(out, NANOZ_UCHAR(blocklen >> 8));
+ nanoz__sbpush(out, NANOZ_UCHAR(~blocklen)); // NLEN
+ nanoz__sbpush(out, NANOZ_UCHAR(~blocklen >> 8));
+ memcpy(out + nanoz__sbn(out), data + j, blocklen);
+ nanoz__sbn(out) += blocklen;
+ j += blocklen;
+ }
+ }
+
+ {
+ // compute adler32 on input
+ unsigned int s1 = 1, s2 = 0;
+ int blocklen = (int)(data_len % 5552);
+ j = 0;
+ while (j < data_len) {
+ for (i = 0; i < blocklen; ++i) {
+ s1 += data[j + i];
+ s2 += s1;
+ }
+ s1 %= 65521;
+ s2 %= 65521;
+ j += blocklen;
+ blocklen = 5552;
+ }
+ nanoz__sbpush(out, NANOZ_UCHAR(s2 >> 8));
+ nanoz__sbpush(out, NANOZ_UCHAR(s2));
+ nanoz__sbpush(out, NANOZ_UCHAR(s1 >> 8));
+ nanoz__sbpush(out, NANOZ_UCHAR(s1));
+ }
+ *out_len = nanoz__sbn(out);
+ // make returned pointer freeable
+ NANOZ_MEMMOVE(nanoz__sbraw(out), out, *out_len);
+ return (unsigned char *)nanoz__sbraw(out);
+}
+
+// from zlib
+uint64_t nanoz_compressBound(uint64_t sourceLen)
+{
+ // TODO: Overflow check?
+ return sourceLen + (sourceLen >> 12ull) + (sourceLen >> 14ull) +
+ (sourceLen >> 25ull) + 13ull;
+}
+
+
+#endif // NANOZDEC_IMPLEMENTATION
+
+#endif /* NANOZDEC_H_ */
diff --git a/graphics/asymptote/tinyexr/deps/nanozlib/wuffs-v0.3.c b/graphics/asymptote/tinyexr/deps/nanozlib/wuffs-v0.3.c
new file mode 100644
index 0000000000..3cce317b38
--- /dev/null
+++ b/graphics/asymptote/tinyexr/deps/nanozlib/wuffs-v0.3.c
@@ -0,0 +1,22438 @@
+#ifndef WUFFS_INCLUDE_GUARD
+#define WUFFS_INCLUDE_GUARD
+
+// Wuffs ships as a "single file C library" or "header file library" as per
+// https://github.com/nothings/stb/blob/master/docs/stb_howto.txt
+//
+// To use that single file as a "foo.c"-like implementation, instead of a
+// "foo.h"-like header, #define WUFFS_IMPLEMENTATION before #include'ing or
+// compiling it.
+
+// Wuffs' C code is generated automatically, not hand-written. These warnings'
+// costs outweigh the benefits.
+//
+// The "elif defined(__clang__)" isn't redundant. While vanilla clang defines
+// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+#pragma GCC diagnostic ignored "-Wunreachable-code"
+#pragma GCC diagnostic ignored "-Wunused-function"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#if defined(__cplusplus)
+#pragma GCC diagnostic ignored "-Wold-style-cast"
+#endif
+#elif defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
+#pragma clang diagnostic ignored "-Wmissing-field-initializers"
+#pragma clang diagnostic ignored "-Wunreachable-code"
+#pragma clang diagnostic ignored "-Wunused-function"
+#pragma clang diagnostic ignored "-Wunused-parameter"
+#if defined(__cplusplus)
+#pragma clang diagnostic ignored "-Wold-style-cast"
+#endif
+#endif
+
+// Copyright 2017 The Wuffs Authors.
+//
+// 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
+//
+// https://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 <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef __cplusplus
+#if (__cplusplus >= 201103L) || defined(_MSC_VER)
+#include <memory>
+#define WUFFS_BASE__HAVE_EQ_DELETE
+#define WUFFS_BASE__HAVE_UNIQUE_PTR
+// The "defined(__clang__)" isn't redundant. While vanilla clang defines
+// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
+#elif defined(__GNUC__) || defined(__clang__)
+#warning "Wuffs' C++ code expects -std=c++11 or later"
+#endif
+
+extern "C" {
+#endif
+
+// ---------------- Version
+
+// WUFFS_VERSION is the major.minor.patch version, as per https://semver.org/,
+// as a uint64_t. The major number is the high 32 bits. The minor number is the
+// middle 16 bits. The patch number is the low 16 bits. The pre-release label
+// and build metadata are part of the string representation (such as
+// "1.2.3-beta+456.20181231") but not the uint64_t representation.
+//
+// WUFFS_VERSION_PRE_RELEASE_LABEL (such as "", "beta" or "rc.1") being
+// non-empty denotes a developer preview, not a release version, and has no
+// backwards or forwards compatibility guarantees.
+//
+// WUFFS_VERSION_BUILD_METADATA_XXX, if non-zero, are the number of commits and
+// the last commit date in the repository used to build this library. Within
+// each major.minor branch, the commit count should increase monotonically.
+//
+// WUFFS_VERSION was overridden by "wuffs gen -version" based on revision
+// 00d5e35865a2f2718f4bb2596adaaa54bd639bbe committed on 2023-04-08.
+#define WUFFS_VERSION 0x000030003
+#define WUFFS_VERSION_MAJOR 0
+#define WUFFS_VERSION_MINOR 3
+#define WUFFS_VERSION_PATCH 3
+#define WUFFS_VERSION_PRE_RELEASE_LABEL ""
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3399
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20230408
+#define WUFFS_VERSION_STRING "0.3.3+3399.20230408"
+
+// ---------------- Configuration
+
+// Define WUFFS_CONFIG__AVOID_CPU_ARCH to avoid any code tied to a specific CPU
+// architecture, such as SSE SIMD for the x86 CPU family.
+#if defined(WUFFS_CONFIG__AVOID_CPU_ARCH) // (#if-chain ref AVOID_CPU_ARCH_0)
+// No-op.
+#else // (#if-chain ref AVOID_CPU_ARCH_0)
+
+// The "defined(__clang__)" isn't redundant. While vanilla clang defines
+// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
+#if defined(__GNUC__) || defined(__clang__)
+#define WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET(arg) __attribute__((target(arg)))
+#else
+#define WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET(arg)
+#endif // defined(__GNUC__) || defined(__clang__)
+
+#if defined(__GNUC__) // (#if-chain ref AVOID_CPU_ARCH_1)
+
+// To simplify Wuffs code, "cpu_arch >= arm_xxx" requires xxx but also
+// unaligned little-endian load/stores.
+#if defined(__ARM_FEATURE_UNALIGNED) && !defined(__native_client__) && \
+ defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+// Not all gcc versions define __ARM_ACLE, even if they support crc32
+// intrinsics. Look for __ARM_FEATURE_CRC32 instead.
+#if defined(__ARM_FEATURE_CRC32)
+#include <arm_acle.h>
+#define WUFFS_BASE__CPU_ARCH__ARM_CRC32
+#endif // defined(__ARM_FEATURE_CRC32)
+#if defined(__ARM_NEON)
+#include <arm_neon.h>
+#define WUFFS_BASE__CPU_ARCH__ARM_NEON
+#endif // defined(__ARM_NEON)
+#endif // defined(__ARM_FEATURE_UNALIGNED) etc
+
+// Similarly, "cpu_arch >= x86_sse42" requires SSE4.2 but also PCLMUL and
+// POPCNT. This is checked at runtime via cpuid, not at compile time.
+//
+// Likewise, "cpu_arch >= x86_avx2" also requires PCLMUL, POPCNT and SSE4.2.
+#if defined(__i386__) || defined(__x86_64__)
+#if !defined(__native_client__)
+#include <cpuid.h>
+#include <x86intrin.h>
+// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously).
+#define WUFFS_BASE__CPU_ARCH__X86_FAMILY
+#endif // !defined(__native_client__)
+#endif // defined(__i386__) || defined(__x86_64__)
+
+#elif defined(_MSC_VER) // (#if-chain ref AVOID_CPU_ARCH_1)
+
+#if defined(_M_IX86) || defined(_M_X64)
+#if defined(__AVX__) || defined(__clang__)
+
+// We need <intrin.h> for the __cpuid function.
+#include <intrin.h>
+// That's not enough for X64 SIMD, with clang-cl, if we want to use
+// "__attribute__((target(arg)))" without e.g. "/arch:AVX".
+//
+// Some web pages suggest that <immintrin.h> is all you need, as it pulls in
+// the earlier SIMD families like SSE4.2, but that doesn't seem to work in
+// practice, possibly for the same reason that just <intrin.h> doesn't work.
+#include <immintrin.h> // AVX, AVX2, FMA, POPCNT
+#include <nmmintrin.h> // SSE4.2
+#include <wmmintrin.h> // AES, PCLMUL
+// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously).
+#define WUFFS_BASE__CPU_ARCH__X86_FAMILY
+
+#else // defined(__AVX__) || defined(__clang__)
+
+// clang-cl (which defines both __clang__ and _MSC_VER) supports
+// "__attribute__((target(arg)))".
+//
+// For MSVC's cl.exe (unlike clang or gcc), SIMD capability is a compile-time
+// property of the source file (e.g. a /arch:AVX or -mavx compiler flag), not
+// of individual functions (that can be conditionally selected at runtime).
+#pragma message("Wuffs with MSVC+IX86/X64 needs /arch:AVX for best performance")
+
+#endif // defined(__AVX__) || defined(__clang__)
+#endif // defined(_M_IX86) || defined(_M_X64)
+
+#endif // (#if-chain ref AVOID_CPU_ARCH_1)
+#endif // (#if-chain ref AVOID_CPU_ARCH_0)
+
+// --------
+
+// Define WUFFS_CONFIG__STATIC_FUNCTIONS (combined with WUFFS_IMPLEMENTATION)
+// to make all of Wuffs' functions have static storage.
+//
+// This can help the compiler ignore or discard unused code, which can produce
+// faster compiles and smaller binaries. Other motivations are discussed in the
+// "ALLOW STATIC IMPLEMENTATION" section of
+// https://raw.githubusercontent.com/nothings/stb/master/docs/stb_howto.txt
+#if defined(WUFFS_CONFIG__STATIC_FUNCTIONS)
+#define WUFFS_BASE__MAYBE_STATIC static
+#else
+#define WUFFS_BASE__MAYBE_STATIC
+#endif // defined(WUFFS_CONFIG__STATIC_FUNCTIONS)
+
+// ---------------- CPU Architecture
+
+static inline bool //
+wuffs_base__cpu_arch__have_arm_crc32() {
+#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+ return true;
+#else
+ return false;
+#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+}
+
+static inline bool //
+wuffs_base__cpu_arch__have_arm_neon() {
+#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+ return true;
+#else
+ return false;
+#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+}
+
+static inline bool //
+wuffs_base__cpu_arch__have_x86_avx2() {
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ // GCC defines these macros but MSVC does not.
+ // - bit_AVX2 = (1 << 5)
+ const unsigned int avx2_ebx7 = 0x00000020;
+ // GCC defines these macros but MSVC does not.
+ // - bit_PCLMUL = (1 << 1)
+ // - bit_POPCNT = (1 << 23)
+ // - bit_SSE4_2 = (1 << 20)
+ const unsigned int avx2_ecx1 = 0x00900002;
+
+ // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
+#if defined(__GNUC__)
+ unsigned int eax7 = 0;
+ unsigned int ebx7 = 0;
+ unsigned int ecx7 = 0;
+ unsigned int edx7 = 0;
+ if (__get_cpuid_count(7, 0, &eax7, &ebx7, &ecx7, &edx7) &&
+ ((ebx7 & avx2_ebx7) == avx2_ebx7)) {
+ unsigned int eax1 = 0;
+ unsigned int ebx1 = 0;
+ unsigned int ecx1 = 0;
+ unsigned int edx1 = 0;
+ if (__get_cpuid(1, &eax1, &ebx1, &ecx1, &edx1) &&
+ ((ecx1 & avx2_ecx1) == avx2_ecx1)) {
+ return true;
+ }
+ }
+#elif defined(_MSC_VER) // defined(__GNUC__)
+ int x7[4];
+ __cpuidex(x7, 7, 0);
+ if ((((unsigned int)(x7[1])) & avx2_ebx7) == avx2_ebx7) {
+ int x1[4];
+ __cpuid(x1, 1);
+ if ((((unsigned int)(x1[2])) & avx2_ecx1) == avx2_ecx1) {
+ return true;
+ }
+ }
+#else
+#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler"
+#endif // defined(__GNUC__); defined(_MSC_VER)
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ return false;
+}
+
+static inline bool //
+wuffs_base__cpu_arch__have_x86_bmi2() {
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ // GCC defines these macros but MSVC does not.
+ // - bit_BMI2 = (1 << 8)
+ const unsigned int bmi2_ebx7 = 0x00000100;
+
+ // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
+#if defined(__GNUC__)
+ unsigned int eax7 = 0;
+ unsigned int ebx7 = 0;
+ unsigned int ecx7 = 0;
+ unsigned int edx7 = 0;
+ if (__get_cpuid_count(7, 0, &eax7, &ebx7, &ecx7, &edx7) &&
+ ((ebx7 & bmi2_ebx7) == bmi2_ebx7)) {
+ return true;
+ }
+#elif defined(_MSC_VER) // defined(__GNUC__)
+ int x7[4];
+ __cpuidex(x7, 7, 0);
+ if ((((unsigned int)(x7[1])) & bmi2_ebx7) == bmi2_ebx7) {
+ return true;
+ }
+#else
+#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler"
+#endif // defined(__GNUC__); defined(_MSC_VER)
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ return false;
+}
+
+static inline bool //
+wuffs_base__cpu_arch__have_x86_sse42() {
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ // GCC defines these macros but MSVC does not.
+ // - bit_PCLMUL = (1 << 1)
+ // - bit_POPCNT = (1 << 23)
+ // - bit_SSE4_2 = (1 << 20)
+ const unsigned int sse42_ecx1 = 0x00900002;
+
+ // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
+#if defined(__GNUC__)
+ unsigned int eax1 = 0;
+ unsigned int ebx1 = 0;
+ unsigned int ecx1 = 0;
+ unsigned int edx1 = 0;
+ if (__get_cpuid(1, &eax1, &ebx1, &ecx1, &edx1) &&
+ ((ecx1 & sse42_ecx1) == sse42_ecx1)) {
+ return true;
+ }
+#elif defined(_MSC_VER) // defined(__GNUC__)
+ int x1[4];
+ __cpuid(x1, 1);
+ if ((((unsigned int)(x1[2])) & sse42_ecx1) == sse42_ecx1) {
+ return true;
+ }
+#else
+#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler"
+#endif // defined(__GNUC__); defined(_MSC_VER)
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ return false;
+}
+
+// ---------------- Fundamentals
+
+// Wuffs assumes that:
+// - converting a uint32_t to a size_t will never overflow.
+// - converting a size_t to a uint64_t will never overflow.
+#if defined(__WORDSIZE)
+#if (__WORDSIZE != 32) && (__WORDSIZE != 64)
+#error "Wuffs requires a word size of either 32 or 64 bits"
+#endif
+#endif
+
+// The "defined(__clang__)" isn't redundant. While vanilla clang defines
+// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
+#if defined(__GNUC__) || defined(__clang__)
+#define WUFFS_BASE__POTENTIALLY_UNUSED __attribute__((unused))
+#define WUFFS_BASE__WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+#else
+#define WUFFS_BASE__POTENTIALLY_UNUSED
+#define WUFFS_BASE__WARN_UNUSED_RESULT
+#endif
+
+// --------
+
+// Options (bitwise or'ed together) for wuffs_foo__bar__initialize functions.
+
+#define WUFFS_INITIALIZE__DEFAULT_OPTIONS ((uint32_t)0x00000000)
+
+// WUFFS_INITIALIZE__ALREADY_ZEROED means that the "self" receiver struct value
+// has already been set to all zeroes.
+#define WUFFS_INITIALIZE__ALREADY_ZEROED ((uint32_t)0x00000001)
+
+// WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED means that, absent
+// WUFFS_INITIALIZE__ALREADY_ZEROED, only some of the "self" receiver struct
+// value will be set to all zeroes. Internal buffers, which tend to be a large
+// proportion of the struct's size, will be left uninitialized. Internal means
+// that the buffer is contained by the receiver struct, as opposed to being
+// passed as a separately allocated "work buffer".
+//
+// For more detail, see:
+// https://github.com/google/wuffs/blob/main/doc/note/initialization.md
+#define WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED \
+ ((uint32_t)0x00000002)
+
+// --------
+
+// wuffs_base__empty_struct is used when a Wuffs function returns an empty
+// struct. In C, if a function f returns void, you can't say "x = f()", but in
+// Wuffs, if a function g returns empty, you can say "y = g()".
+typedef struct wuffs_base__empty_struct__struct {
+ // private_impl is a placeholder field. It isn't explicitly used, except that
+ // without it, the sizeof a struct with no fields can differ across C/C++
+ // compilers, and it is undefined behavior in C99. For example, gcc says that
+ // the sizeof an empty struct is 0, and g++ says that it is 1. This leads to
+ // ABI incompatibility if a Wuffs .c file is processed by one compiler and
+ // its .h file with another compiler.
+ //
+ // Instead, we explicitly insert an otherwise unused field, so that the
+ // sizeof this struct is always 1.
+ uint8_t private_impl;
+} wuffs_base__empty_struct;
+
+static inline wuffs_base__empty_struct //
+wuffs_base__make_empty_struct() {
+ wuffs_base__empty_struct ret;
+ ret.private_impl = 0;
+ return ret;
+}
+
+// wuffs_base__utility is a placeholder receiver type. It enables what Java
+// calls static methods, as opposed to regular methods.
+typedef struct wuffs_base__utility__struct {
+ // private_impl is a placeholder field. It isn't explicitly used, except that
+ // without it, the sizeof a struct with no fields can differ across C/C++
+ // compilers, and it is undefined behavior in C99. For example, gcc says that
+ // the sizeof an empty struct is 0, and g++ says that it is 1. This leads to
+ // ABI incompatibility if a Wuffs .c file is processed by one compiler and
+ // its .h file with another compiler.
+ //
+ // Instead, we explicitly insert an otherwise unused field, so that the
+ // sizeof this struct is always 1.
+ uint8_t private_impl;
+} wuffs_base__utility;
+
+typedef struct wuffs_base__vtable__struct {
+ const char* vtable_name;
+ const void* function_pointers;
+} wuffs_base__vtable;
+
+// --------
+
+// See https://github.com/google/wuffs/blob/main/doc/note/statuses.md
+typedef struct wuffs_base__status__struct {
+ const char* repr;
+
+#ifdef __cplusplus
+ inline bool is_complete() const;
+ inline bool is_error() const;
+ inline bool is_note() const;
+ inline bool is_ok() const;
+ inline bool is_suspension() const;
+ inline const char* message() const;
+#endif // __cplusplus
+
+} wuffs_base__status;
+
+extern const char wuffs_base__note__i_o_redirect[];
+extern const char wuffs_base__note__end_of_data[];
+extern const char wuffs_base__note__metadata_reported[];
+extern const char wuffs_base__suspension__even_more_information[];
+extern const char wuffs_base__suspension__mispositioned_read[];
+extern const char wuffs_base__suspension__mispositioned_write[];
+extern const char wuffs_base__suspension__short_read[];
+extern const char wuffs_base__suspension__short_write[];
+extern const char wuffs_base__error__bad_i_o_position[];
+extern const char wuffs_base__error__bad_argument_length_too_short[];
+extern const char wuffs_base__error__bad_argument[];
+extern const char wuffs_base__error__bad_call_sequence[];
+extern const char wuffs_base__error__bad_data[];
+extern const char wuffs_base__error__bad_receiver[];
+extern const char wuffs_base__error__bad_restart[];
+extern const char wuffs_base__error__bad_sizeof_receiver[];
+extern const char wuffs_base__error__bad_vtable[];
+extern const char wuffs_base__error__bad_workbuf_length[];
+extern const char wuffs_base__error__bad_wuffs_version[];
+extern const char wuffs_base__error__cannot_return_a_suspension[];
+extern const char wuffs_base__error__disabled_by_previous_error[];
+extern const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[];
+extern const char wuffs_base__error__initialize_not_called[];
+extern const char wuffs_base__error__interleaved_coroutine_calls[];
+extern const char wuffs_base__error__no_more_information[];
+extern const char wuffs_base__error__not_enough_data[];
+extern const char wuffs_base__error__out_of_bounds[];
+extern const char wuffs_base__error__unsupported_method[];
+extern const char wuffs_base__error__unsupported_option[];
+extern const char wuffs_base__error__unsupported_pixel_swizzler_option[];
+extern const char wuffs_base__error__too_much_data[];
+
+static inline wuffs_base__status //
+wuffs_base__make_status(const char* repr) {
+ wuffs_base__status z;
+ z.repr = repr;
+ return z;
+}
+
+static inline bool //
+wuffs_base__status__is_complete(const wuffs_base__status* z) {
+ return (z->repr == NULL) || ((*z->repr != '$') && (*z->repr != '#'));
+}
+
+static inline bool //
+wuffs_base__status__is_error(const wuffs_base__status* z) {
+ return z->repr && (*z->repr == '#');
+}
+
+static inline bool //
+wuffs_base__status__is_note(const wuffs_base__status* z) {
+ return z->repr && (*z->repr != '$') && (*z->repr != '#');
+}
+
+static inline bool //
+wuffs_base__status__is_ok(const wuffs_base__status* z) {
+ return z->repr == NULL;
+}
+
+static inline bool //
+wuffs_base__status__is_suspension(const wuffs_base__status* z) {
+ return z->repr && (*z->repr == '$');
+}
+
+// wuffs_base__status__message strips the leading '$', '#' or '@'.
+static inline const char* //
+wuffs_base__status__message(const wuffs_base__status* z) {
+ if (z->repr) {
+ if ((*z->repr == '$') || (*z->repr == '#') || (*z->repr == '@')) {
+ return z->repr + 1;
+ }
+ }
+ return z->repr;
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__status::is_complete() const {
+ return wuffs_base__status__is_complete(this);
+}
+
+inline bool //
+wuffs_base__status::is_error() const {
+ return wuffs_base__status__is_error(this);
+}
+
+inline bool //
+wuffs_base__status::is_note() const {
+ return wuffs_base__status__is_note(this);
+}
+
+inline bool //
+wuffs_base__status::is_ok() const {
+ return wuffs_base__status__is_ok(this);
+}
+
+inline bool //
+wuffs_base__status::is_suspension() const {
+ return wuffs_base__status__is_suspension(this);
+}
+
+inline const char* //
+wuffs_base__status::message() const {
+ return wuffs_base__status__message(this);
+}
+
+#endif // __cplusplus
+
+// --------
+
+// WUFFS_BASE__RESULT is a result type: either a status (an error) or a value.
+//
+// A result with all fields NULL or zero is as valid as a zero-valued T.
+#define WUFFS_BASE__RESULT(T) \
+ struct { \
+ wuffs_base__status status; \
+ T value; \
+ }
+
+typedef WUFFS_BASE__RESULT(double) wuffs_base__result_f64;
+typedef WUFFS_BASE__RESULT(int64_t) wuffs_base__result_i64;
+typedef WUFFS_BASE__RESULT(uint64_t) wuffs_base__result_u64;
+
+// --------
+
+// wuffs_base__transform__output is the result of transforming from a src slice
+// to a dst slice.
+typedef struct wuffs_base__transform__output__struct {
+ wuffs_base__status status;
+ size_t num_dst;
+ size_t num_src;
+} wuffs_base__transform__output;
+
+// --------
+
+// FourCC constants. Four Character Codes are literally four ASCII characters
+// (sometimes padded with ' ' spaces) that pack neatly into a signed or
+// unsigned 32-bit integer. ASCII letters are conventionally upper case.
+//
+// They are often used to identify video codecs (e.g. "H265") and pixel formats
+// (e.g. "YV12"). Wuffs uses them for that but also generally for naming
+// various things: compression formats (e.g. "BZ2 "), image metadata (e.g.
+// "EXIF"), file formats (e.g. "HTML"), etc.
+//
+// Wuffs' u32 values are big-endian ("JPEG" is 0x4A504547 not 0x4745504A) to
+// preserve ordering: "JPEG" < "MP3 " and 0x4A504547 < 0x4D503320.
+
+// Background Color.
+#define WUFFS_BASE__FOURCC__BGCL 0x4247434C
+
+// Bitmap.
+#define WUFFS_BASE__FOURCC__BMP 0x424D5020
+
+// Brotli.
+#define WUFFS_BASE__FOURCC__BRTL 0x4252544C
+
+// Bzip2.
+#define WUFFS_BASE__FOURCC__BZ2 0x425A3220
+
+// Concise Binary Object Representation.
+#define WUFFS_BASE__FOURCC__CBOR 0x43424F52
+
+// Primary Chromaticities and White Point.
+#define WUFFS_BASE__FOURCC__CHRM 0x4348524D
+
+// Cascading Style Sheets.
+#define WUFFS_BASE__FOURCC__CSS 0x43535320
+
+// Encapsulated PostScript.
+#define WUFFS_BASE__FOURCC__EPS 0x45505320
+
+// Exchangeable Image File Format.
+#define WUFFS_BASE__FOURCC__EXIF 0x45584946
+
+// Free Lossless Audio Codec.
+#define WUFFS_BASE__FOURCC__FLAC 0x464C4143
+
+// Gamma Correction.
+#define WUFFS_BASE__FOURCC__GAMA 0x47414D41
+
+// Graphics Interchange Format.
+#define WUFFS_BASE__FOURCC__GIF 0x47494620
+
+// GNU Zip.
+#define WUFFS_BASE__FOURCC__GZ 0x475A2020
+
+// High Efficiency Image File.
+#define WUFFS_BASE__FOURCC__HEIF 0x48454946
+
+// Hypertext Markup Language.
+#define WUFFS_BASE__FOURCC__HTML 0x48544D4C
+
+// International Color Consortium Profile.
+#define WUFFS_BASE__FOURCC__ICCP 0x49434350
+
+// Icon.
+#define WUFFS_BASE__FOURCC__ICO 0x49434F20
+
+// Icon Vector Graphics.
+#define WUFFS_BASE__FOURCC__ICVG 0x49435647
+
+// Initialization.
+#define WUFFS_BASE__FOURCC__INI 0x494E4920
+
+// Joint Photographic Experts Group.
+#define WUFFS_BASE__FOURCC__JPEG 0x4A504547
+
+// JavaScript.
+#define WUFFS_BASE__FOURCC__JS 0x4A532020
+
+// JavaScript Object Notation.
+#define WUFFS_BASE__FOURCC__JSON 0x4A534F4E
+
+// JSON With Commas and Comments.
+#define WUFFS_BASE__FOURCC__JWCC 0x4A574343
+
+// Key-Value Pair.
+#define WUFFS_BASE__FOURCC__KVP 0x4B565020
+
+// Key-Value Pair (Key).
+#define WUFFS_BASE__FOURCC__KVPK 0x4B56504B
+
+// Key-Value Pair (Value).
+#define WUFFS_BASE__FOURCC__KVPV 0x4B565056
+
+// Lempel–Ziv 4.
+#define WUFFS_BASE__FOURCC__LZ4 0x4C5A3420
+
+// Markdown.
+#define WUFFS_BASE__FOURCC__MD 0x4D442020
+
+// Modification Time.
+#define WUFFS_BASE__FOURCC__MTIM 0x4D54494D
+
+// MPEG-1 Audio Layer III.
+#define WUFFS_BASE__FOURCC__MP3 0x4D503320
+
+// Naive Image.
+#define WUFFS_BASE__FOURCC__NIE 0x4E494520
+
+// Offset (2-Dimensional).
+#define WUFFS_BASE__FOURCC__OFS2 0x4F465332
+
+// Open Type Format.
+#define WUFFS_BASE__FOURCC__OTF 0x4F544620
+
+// Portable Document Format.
+#define WUFFS_BASE__FOURCC__PDF 0x50444620
+
+// Physical Dimensions.
+#define WUFFS_BASE__FOURCC__PHYD 0x50485944
+
+// Portable Network Graphics.
+#define WUFFS_BASE__FOURCC__PNG 0x504E4720
+
+// Portable Anymap.
+#define WUFFS_BASE__FOURCC__PNM 0x504E4D20
+
+// PostScript.
+#define WUFFS_BASE__FOURCC__PS 0x50532020
+
+// Quite OK Image.
+#define WUFFS_BASE__FOURCC__QOI 0x514F4920
+
+// Random Access Compression.
+#define WUFFS_BASE__FOURCC__RAC 0x52414320
+
+// Raw.
+#define WUFFS_BASE__FOURCC__RAW 0x52415720
+
+// Resource Interchange File Format.
+#define WUFFS_BASE__FOURCC__RIFF 0x52494646
+
+// Riegeli Records.
+#define WUFFS_BASE__FOURCC__RIGL 0x5249474C
+
+// Snappy.
+#define WUFFS_BASE__FOURCC__SNPY 0x534E5059
+
+// Standard Red Green Blue (Rendering Intent).
+#define WUFFS_BASE__FOURCC__SRGB 0x53524742
+
+// Scalable Vector Graphics.
+#define WUFFS_BASE__FOURCC__SVG 0x53564720
+
+// Tape Archive.
+#define WUFFS_BASE__FOURCC__TAR 0x54415220
+
+// Text.
+#define WUFFS_BASE__FOURCC__TEXT 0x54455854
+
+// Truevision Advanced Raster Graphics Adapter.
+#define WUFFS_BASE__FOURCC__TGA 0x54474120
+
+// Tagged Image File Format.
+#define WUFFS_BASE__FOURCC__TIFF 0x54494646
+
+// Tom's Obvious Minimal Language.
+#define WUFFS_BASE__FOURCC__TOML 0x544F4D4C
+
+// Waveform.
+#define WUFFS_BASE__FOURCC__WAVE 0x57415645
+
+// Wireless Bitmap.
+#define WUFFS_BASE__FOURCC__WBMP 0x57424D50
+
+// Web Picture.
+#define WUFFS_BASE__FOURCC__WEBP 0x57454250
+
+// Web Open Font Format.
+#define WUFFS_BASE__FOURCC__WOFF 0x574F4646
+
+// Extensible Markup Language.
+#define WUFFS_BASE__FOURCC__XML 0x584D4C20
+
+// Extensible Metadata Platform.
+#define WUFFS_BASE__FOURCC__XMP 0x584D5020
+
+// Xz.
+#define WUFFS_BASE__FOURCC__XZ 0x585A2020
+
+// Zip.
+#define WUFFS_BASE__FOURCC__ZIP 0x5A495020
+
+// Zlib.
+#define WUFFS_BASE__FOURCC__ZLIB 0x5A4C4942
+
+// Zstandard.
+#define WUFFS_BASE__FOURCC__ZSTD 0x5A535444
+
+// --------
+
+// Quirks.
+
+#define WUFFS_BASE__QUIRK_IGNORE_CHECKSUM 1
+
+// --------
+
+// Flicks are a unit of time. One flick (frame-tick) is 1 / 705_600_000 of a
+// second. See https://github.com/OculusVR/Flicks
+typedef int64_t wuffs_base__flicks;
+
+#define WUFFS_BASE__FLICKS_PER_SECOND ((uint64_t)705600000)
+#define WUFFS_BASE__FLICKS_PER_MILLISECOND ((uint64_t)705600)
+
+// ---------------- Numeric Types
+
+// The helpers below are functions, instead of macros, because their arguments
+// can be an expression that we shouldn't evaluate more than once.
+//
+// They are static, so that linking multiple wuffs .o files won't complain about
+// duplicate function definitions.
+//
+// They are explicitly marked inline, even if modern compilers don't use the
+// inline attribute to guide optimizations such as inlining, to avoid the
+// -Wunused-function warning, and we like to compile with -Wall -Werror.
+
+static inline int8_t //
+wuffs_base__i8__min(int8_t x, int8_t y) {
+ return x < y ? x : y;
+}
+
+static inline int8_t //
+wuffs_base__i8__max(int8_t x, int8_t y) {
+ return x > y ? x : y;
+}
+
+static inline int16_t //
+wuffs_base__i16__min(int16_t x, int16_t y) {
+ return x < y ? x : y;
+}
+
+static inline int16_t //
+wuffs_base__i16__max(int16_t x, int16_t y) {
+ return x > y ? x : y;
+}
+
+static inline int32_t //
+wuffs_base__i32__min(int32_t x, int32_t y) {
+ return x < y ? x : y;
+}
+
+static inline int32_t //
+wuffs_base__i32__max(int32_t x, int32_t y) {
+ return x > y ? x : y;
+}
+
+static inline int64_t //
+wuffs_base__i64__min(int64_t x, int64_t y) {
+ return x < y ? x : y;
+}
+
+static inline int64_t //
+wuffs_base__i64__max(int64_t x, int64_t y) {
+ return x > y ? x : y;
+}
+
+static inline uint8_t //
+wuffs_base__u8__min(uint8_t x, uint8_t y) {
+ return x < y ? x : y;
+}
+
+static inline uint8_t //
+wuffs_base__u8__max(uint8_t x, uint8_t y) {
+ return x > y ? x : y;
+}
+
+static inline uint16_t //
+wuffs_base__u16__min(uint16_t x, uint16_t y) {
+ return x < y ? x : y;
+}
+
+static inline uint16_t //
+wuffs_base__u16__max(uint16_t x, uint16_t y) {
+ return x > y ? x : y;
+}
+
+static inline uint32_t //
+wuffs_base__u32__min(uint32_t x, uint32_t y) {
+ return x < y ? x : y;
+}
+
+static inline uint32_t //
+wuffs_base__u32__max(uint32_t x, uint32_t y) {
+ return x > y ? x : y;
+}
+
+static inline uint64_t //
+wuffs_base__u64__min(uint64_t x, uint64_t y) {
+ return x < y ? x : y;
+}
+
+static inline uint64_t //
+wuffs_base__u64__max(uint64_t x, uint64_t y) {
+ return x > y ? x : y;
+}
+
+// --------
+
+static inline uint8_t //
+wuffs_base__u8__rotate_left(uint8_t x, uint32_t n) {
+ n &= 7;
+ return ((uint8_t)(x << n)) | ((uint8_t)(x >> (8 - n)));
+}
+
+static inline uint8_t //
+wuffs_base__u8__rotate_right(uint8_t x, uint32_t n) {
+ n &= 7;
+ return ((uint8_t)(x >> n)) | ((uint8_t)(x << (8 - n)));
+}
+
+static inline uint16_t //
+wuffs_base__u16__rotate_left(uint16_t x, uint32_t n) {
+ n &= 15;
+ return ((uint16_t)(x << n)) | ((uint16_t)(x >> (16 - n)));
+}
+
+static inline uint16_t //
+wuffs_base__u16__rotate_right(uint16_t x, uint32_t n) {
+ n &= 15;
+ return ((uint16_t)(x >> n)) | ((uint16_t)(x << (16 - n)));
+}
+
+static inline uint32_t //
+wuffs_base__u32__rotate_left(uint32_t x, uint32_t n) {
+ n &= 31;
+ return ((uint32_t)(x << n)) | ((uint32_t)(x >> (32 - n)));
+}
+
+static inline uint32_t //
+wuffs_base__u32__rotate_right(uint32_t x, uint32_t n) {
+ n &= 31;
+ return ((uint32_t)(x >> n)) | ((uint32_t)(x << (32 - n)));
+}
+
+static inline uint64_t //
+wuffs_base__u64__rotate_left(uint64_t x, uint32_t n) {
+ n &= 63;
+ return ((uint64_t)(x << n)) | ((uint64_t)(x >> (64 - n)));
+}
+
+static inline uint64_t //
+wuffs_base__u64__rotate_right(uint64_t x, uint32_t n) {
+ n &= 63;
+ return ((uint64_t)(x >> n)) | ((uint64_t)(x << (64 - n)));
+}
+
+// --------
+
+// Saturating arithmetic (sat_add, sat_sub) branchless bit-twiddling algorithms
+// are per https://locklessinc.com/articles/sat_arithmetic/
+//
+// It is important that the underlying types are unsigned integers, as signed
+// integer arithmetic overflow is undefined behavior in C.
+
+static inline uint8_t //
+wuffs_base__u8__sat_add(uint8_t x, uint8_t y) {
+ uint8_t res = (uint8_t)(x + y);
+ res |= (uint8_t)(-(res < x));
+ return res;
+}
+
+static inline uint8_t //
+wuffs_base__u8__sat_sub(uint8_t x, uint8_t y) {
+ uint8_t res = (uint8_t)(x - y);
+ res &= (uint8_t)(-(res <= x));
+ return res;
+}
+
+static inline uint16_t //
+wuffs_base__u16__sat_add(uint16_t x, uint16_t y) {
+ uint16_t res = (uint16_t)(x + y);
+ res |= (uint16_t)(-(res < x));
+ return res;
+}
+
+static inline uint16_t //
+wuffs_base__u16__sat_sub(uint16_t x, uint16_t y) {
+ uint16_t res = (uint16_t)(x - y);
+ res &= (uint16_t)(-(res <= x));
+ return res;
+}
+
+static inline uint32_t //
+wuffs_base__u32__sat_add(uint32_t x, uint32_t y) {
+ uint32_t res = (uint32_t)(x + y);
+ res |= (uint32_t)(-(res < x));
+ return res;
+}
+
+static inline uint32_t //
+wuffs_base__u32__sat_sub(uint32_t x, uint32_t y) {
+ uint32_t res = (uint32_t)(x - y);
+ res &= (uint32_t)(-(res <= x));
+ return res;
+}
+
+static inline uint64_t //
+wuffs_base__u64__sat_add(uint64_t x, uint64_t y) {
+ uint64_t res = (uint64_t)(x + y);
+ res |= (uint64_t)(-(res < x));
+ return res;
+}
+
+static inline uint64_t //
+wuffs_base__u64__sat_sub(uint64_t x, uint64_t y) {
+ uint64_t res = (uint64_t)(x - y);
+ res &= (uint64_t)(-(res <= x));
+ return res;
+}
+
+// --------
+
+typedef struct wuffs_base__multiply_u64__output__struct {
+ uint64_t lo;
+ uint64_t hi;
+} wuffs_base__multiply_u64__output;
+
+// wuffs_base__multiply_u64 returns x*y as a 128-bit value.
+//
+// The maximum inclusive output hi_lo is 0xFFFFFFFFFFFFFFFE_0000000000000001.
+static inline wuffs_base__multiply_u64__output //
+wuffs_base__multiply_u64(uint64_t x, uint64_t y) {
+#if defined(__SIZEOF_INT128__)
+ __uint128_t z = ((__uint128_t)x) * ((__uint128_t)y);
+ wuffs_base__multiply_u64__output o;
+ o.lo = ((uint64_t)(z));
+ o.hi = ((uint64_t)(z >> 64));
+ return o;
+#else
+ // TODO: consider using the _mul128 intrinsic if defined(_MSC_VER).
+ uint64_t x0 = x & 0xFFFFFFFF;
+ uint64_t x1 = x >> 32;
+ uint64_t y0 = y & 0xFFFFFFFF;
+ uint64_t y1 = y >> 32;
+ uint64_t w0 = x0 * y0;
+ uint64_t t = (x1 * y0) + (w0 >> 32);
+ uint64_t w1 = t & 0xFFFFFFFF;
+ uint64_t w2 = t >> 32;
+ w1 += x0 * y1;
+ wuffs_base__multiply_u64__output o;
+ o.lo = x * y;
+ o.hi = (x1 * y1) + w2 + (w1 >> 32);
+ return o;
+#endif
+}
+
+// --------
+
+// The "defined(__clang__)" isn't redundant. While vanilla clang defines
+// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
+#if (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8)
+
+static inline uint32_t //
+wuffs_base__count_leading_zeroes_u64(uint64_t u) {
+ return u ? ((uint32_t)(__builtin_clzl(u))) : 64u;
+}
+
+#else
+// TODO: consider using the _BitScanReverse intrinsic if defined(_MSC_VER).
+
+static inline uint32_t //
+wuffs_base__count_leading_zeroes_u64(uint64_t u) {
+ if (u == 0) {
+ return 64;
+ }
+
+ uint32_t n = 0;
+ if ((u >> 32) == 0) {
+ n |= 32;
+ u <<= 32;
+ }
+ if ((u >> 48) == 0) {
+ n |= 16;
+ u <<= 16;
+ }
+ if ((u >> 56) == 0) {
+ n |= 8;
+ u <<= 8;
+ }
+ if ((u >> 60) == 0) {
+ n |= 4;
+ u <<= 4;
+ }
+ if ((u >> 62) == 0) {
+ n |= 2;
+ u <<= 2;
+ }
+ if ((u >> 63) == 0) {
+ n |= 1;
+ u <<= 1;
+ }
+ return n;
+}
+
+#endif // (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8)
+
+// --------
+
+// Normally, the wuffs_base__peek_etc and wuffs_base__poke_etc implementations
+// are both (1) correct regardless of CPU endianness and (2) very fast (e.g. an
+// inlined wuffs_base__peek_u32le__no_bounds_check call, in an optimized clang
+// or gcc build, is a single MOV instruction on x86_64).
+//
+// However, the endian-agnostic implementations are slow on Microsoft's C
+// compiler (MSC). Alternative memcpy-based implementations restore speed, but
+// they are only correct on little-endian CPU architectures. Defining
+// WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE opts in to these implementations.
+//
+// https://godbolt.org/z/q4MfjzTPh
+#if defined(_MSC_VER) && !defined(__clang__) && \
+ (defined(_M_ARM64) || defined(_M_X64))
+#define WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE
+#endif
+
+#define wuffs_base__peek_u8be__no_bounds_check \
+ wuffs_base__peek_u8__no_bounds_check
+#define wuffs_base__peek_u8le__no_bounds_check \
+ wuffs_base__peek_u8__no_bounds_check
+
+static inline uint8_t //
+wuffs_base__peek_u8__no_bounds_check(const uint8_t* p) {
+ return p[0];
+}
+
+static inline uint16_t //
+wuffs_base__peek_u16be__no_bounds_check(const uint8_t* p) {
+#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
+ uint16_t x;
+ memcpy(&x, p, 2);
+ return _byteswap_ushort(x);
+#else
+ return (uint16_t)(((uint16_t)(p[0]) << 8) | ((uint16_t)(p[1]) << 0));
+#endif
+}
+
+static inline uint16_t //
+wuffs_base__peek_u16le__no_bounds_check(const uint8_t* p) {
+#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
+ uint16_t x;
+ memcpy(&x, p, 2);
+ return x;
+#else
+ return (uint16_t)(((uint16_t)(p[0]) << 0) | ((uint16_t)(p[1]) << 8));
+#endif
+}
+
+static inline uint32_t //
+wuffs_base__peek_u24be__no_bounds_check(const uint8_t* p) {
+ return ((uint32_t)(p[0]) << 16) | ((uint32_t)(p[1]) << 8) |
+ ((uint32_t)(p[2]) << 0);
+}
+
+static inline uint32_t //
+wuffs_base__peek_u24le__no_bounds_check(const uint8_t* p) {
+ return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |
+ ((uint32_t)(p[2]) << 16);
+}
+
+static inline uint32_t //
+wuffs_base__peek_u32be__no_bounds_check(const uint8_t* p) {
+#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
+ uint32_t x;
+ memcpy(&x, p, 4);
+ return _byteswap_ulong(x);
+#else
+ return ((uint32_t)(p[0]) << 24) | ((uint32_t)(p[1]) << 16) |
+ ((uint32_t)(p[2]) << 8) | ((uint32_t)(p[3]) << 0);
+#endif
+}
+
+static inline uint32_t //
+wuffs_base__peek_u32le__no_bounds_check(const uint8_t* p) {
+#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
+ uint32_t x;
+ memcpy(&x, p, 4);
+ return x;
+#else
+ return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |
+ ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24);
+#endif
+}
+
+static inline uint64_t //
+wuffs_base__peek_u40be__no_bounds_check(const uint8_t* p) {
+ return ((uint64_t)(p[0]) << 32) | ((uint64_t)(p[1]) << 24) |
+ ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 8) |
+ ((uint64_t)(p[4]) << 0);
+}
+
+static inline uint64_t //
+wuffs_base__peek_u40le__no_bounds_check(const uint8_t* p) {
+ return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
+ ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
+ ((uint64_t)(p[4]) << 32);
+}
+
+static inline uint64_t //
+wuffs_base__peek_u48be__no_bounds_check(const uint8_t* p) {
+ return ((uint64_t)(p[0]) << 40) | ((uint64_t)(p[1]) << 32) |
+ ((uint64_t)(p[2]) << 24) | ((uint64_t)(p[3]) << 16) |
+ ((uint64_t)(p[4]) << 8) | ((uint64_t)(p[5]) << 0);
+}
+
+static inline uint64_t //
+wuffs_base__peek_u48le__no_bounds_check(const uint8_t* p) {
+ return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
+ ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
+ ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40);
+}
+
+static inline uint64_t //
+wuffs_base__peek_u56be__no_bounds_check(const uint8_t* p) {
+ return ((uint64_t)(p[0]) << 48) | ((uint64_t)(p[1]) << 40) |
+ ((uint64_t)(p[2]) << 32) | ((uint64_t)(p[3]) << 24) |
+ ((uint64_t)(p[4]) << 16) | ((uint64_t)(p[5]) << 8) |
+ ((uint64_t)(p[6]) << 0);
+}
+
+static inline uint64_t //
+wuffs_base__peek_u56le__no_bounds_check(const uint8_t* p) {
+ return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
+ ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
+ ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) |
+ ((uint64_t)(p[6]) << 48);
+}
+
+static inline uint64_t //
+wuffs_base__peek_u64be__no_bounds_check(const uint8_t* p) {
+#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
+ uint64_t x;
+ memcpy(&x, p, 8);
+ return _byteswap_uint64(x);
+#else
+ return ((uint64_t)(p[0]) << 56) | ((uint64_t)(p[1]) << 48) |
+ ((uint64_t)(p[2]) << 40) | ((uint64_t)(p[3]) << 32) |
+ ((uint64_t)(p[4]) << 24) | ((uint64_t)(p[5]) << 16) |
+ ((uint64_t)(p[6]) << 8) | ((uint64_t)(p[7]) << 0);
+#endif
+}
+
+static inline uint64_t //
+wuffs_base__peek_u64le__no_bounds_check(const uint8_t* p) {
+#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
+ uint64_t x;
+ memcpy(&x, p, 8);
+ return x;
+#else
+ return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
+ ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
+ ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) |
+ ((uint64_t)(p[6]) << 48) | ((uint64_t)(p[7]) << 56);
+#endif
+}
+
+// --------
+
+#define wuffs_base__poke_u8be__no_bounds_check \
+ wuffs_base__poke_u8__no_bounds_check
+#define wuffs_base__poke_u8le__no_bounds_check \
+ wuffs_base__poke_u8__no_bounds_check
+
+static inline void //
+wuffs_base__poke_u8__no_bounds_check(uint8_t* p, uint8_t x) {
+ p[0] = x;
+}
+
+static inline void //
+wuffs_base__poke_u16be__no_bounds_check(uint8_t* p, uint16_t x) {
+ p[0] = (uint8_t)(x >> 8);
+ p[1] = (uint8_t)(x >> 0);
+}
+
+static inline void //
+wuffs_base__poke_u16le__no_bounds_check(uint8_t* p, uint16_t x) {
+#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
+ (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
+ // This seems to perform better on gcc 10 (but not clang 9). Clang also
+ // defines "__GNUC__".
+ memcpy(p, &x, 2);
+#else
+ p[0] = (uint8_t)(x >> 0);
+ p[1] = (uint8_t)(x >> 8);
+#endif
+}
+
+static inline void //
+wuffs_base__poke_u24be__no_bounds_check(uint8_t* p, uint32_t x) {
+ p[0] = (uint8_t)(x >> 16);
+ p[1] = (uint8_t)(x >> 8);
+ p[2] = (uint8_t)(x >> 0);
+}
+
+static inline void //
+wuffs_base__poke_u24le__no_bounds_check(uint8_t* p, uint32_t x) {
+ p[0] = (uint8_t)(x >> 0);
+ p[1] = (uint8_t)(x >> 8);
+ p[2] = (uint8_t)(x >> 16);
+}
+
+static inline void //
+wuffs_base__poke_u32be__no_bounds_check(uint8_t* p, uint32_t x) {
+ p[0] = (uint8_t)(x >> 24);
+ p[1] = (uint8_t)(x >> 16);
+ p[2] = (uint8_t)(x >> 8);
+ p[3] = (uint8_t)(x >> 0);
+}
+
+static inline void //
+wuffs_base__poke_u32le__no_bounds_check(uint8_t* p, uint32_t x) {
+#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
+ (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
+ // This seems to perform better on gcc 10 (but not clang 9). Clang also
+ // defines "__GNUC__".
+ memcpy(p, &x, 4);
+#else
+ p[0] = (uint8_t)(x >> 0);
+ p[1] = (uint8_t)(x >> 8);
+ p[2] = (uint8_t)(x >> 16);
+ p[3] = (uint8_t)(x >> 24);
+#endif
+}
+
+static inline void //
+wuffs_base__poke_u40be__no_bounds_check(uint8_t* p, uint64_t x) {
+ p[0] = (uint8_t)(x >> 32);
+ p[1] = (uint8_t)(x >> 24);
+ p[2] = (uint8_t)(x >> 16);
+ p[3] = (uint8_t)(x >> 8);
+ p[4] = (uint8_t)(x >> 0);
+}
+
+static inline void //
+wuffs_base__poke_u40le__no_bounds_check(uint8_t* p, uint64_t x) {
+ p[0] = (uint8_t)(x >> 0);
+ p[1] = (uint8_t)(x >> 8);
+ p[2] = (uint8_t)(x >> 16);
+ p[3] = (uint8_t)(x >> 24);
+ p[4] = (uint8_t)(x >> 32);
+}
+
+static inline void //
+wuffs_base__poke_u48be__no_bounds_check(uint8_t* p, uint64_t x) {
+ p[0] = (uint8_t)(x >> 40);
+ p[1] = (uint8_t)(x >> 32);
+ p[2] = (uint8_t)(x >> 24);
+ p[3] = (uint8_t)(x >> 16);
+ p[4] = (uint8_t)(x >> 8);
+ p[5] = (uint8_t)(x >> 0);
+}
+
+static inline void //
+wuffs_base__poke_u48le__no_bounds_check(uint8_t* p, uint64_t x) {
+ p[0] = (uint8_t)(x >> 0);
+ p[1] = (uint8_t)(x >> 8);
+ p[2] = (uint8_t)(x >> 16);
+ p[3] = (uint8_t)(x >> 24);
+ p[4] = (uint8_t)(x >> 32);
+ p[5] = (uint8_t)(x >> 40);
+}
+
+static inline void //
+wuffs_base__poke_u56be__no_bounds_check(uint8_t* p, uint64_t x) {
+ p[0] = (uint8_t)(x >> 48);
+ p[1] = (uint8_t)(x >> 40);
+ p[2] = (uint8_t)(x >> 32);
+ p[3] = (uint8_t)(x >> 24);
+ p[4] = (uint8_t)(x >> 16);
+ p[5] = (uint8_t)(x >> 8);
+ p[6] = (uint8_t)(x >> 0);
+}
+
+static inline void //
+wuffs_base__poke_u56le__no_bounds_check(uint8_t* p, uint64_t x) {
+ p[0] = (uint8_t)(x >> 0);
+ p[1] = (uint8_t)(x >> 8);
+ p[2] = (uint8_t)(x >> 16);
+ p[3] = (uint8_t)(x >> 24);
+ p[4] = (uint8_t)(x >> 32);
+ p[5] = (uint8_t)(x >> 40);
+ p[6] = (uint8_t)(x >> 48);
+}
+
+static inline void //
+wuffs_base__poke_u64be__no_bounds_check(uint8_t* p, uint64_t x) {
+ p[0] = (uint8_t)(x >> 56);
+ p[1] = (uint8_t)(x >> 48);
+ p[2] = (uint8_t)(x >> 40);
+ p[3] = (uint8_t)(x >> 32);
+ p[4] = (uint8_t)(x >> 24);
+ p[5] = (uint8_t)(x >> 16);
+ p[6] = (uint8_t)(x >> 8);
+ p[7] = (uint8_t)(x >> 0);
+}
+
+static inline void //
+wuffs_base__poke_u64le__no_bounds_check(uint8_t* p, uint64_t x) {
+#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
+ (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
+ // This seems to perform better on gcc 10 (but not clang 9). Clang also
+ // defines "__GNUC__".
+ memcpy(p, &x, 8);
+#else
+ p[0] = (uint8_t)(x >> 0);
+ p[1] = (uint8_t)(x >> 8);
+ p[2] = (uint8_t)(x >> 16);
+ p[3] = (uint8_t)(x >> 24);
+ p[4] = (uint8_t)(x >> 32);
+ p[5] = (uint8_t)(x >> 40);
+ p[6] = (uint8_t)(x >> 48);
+ p[7] = (uint8_t)(x >> 56);
+#endif
+}
+
+// --------
+
+// Load and Store functions are deprecated. Use Peek and Poke instead.
+
+#define wuffs_base__load_u8__no_bounds_check \
+ wuffs_base__peek_u8__no_bounds_check
+#define wuffs_base__load_u16be__no_bounds_check \
+ wuffs_base__peek_u16be__no_bounds_check
+#define wuffs_base__load_u16le__no_bounds_check \
+ wuffs_base__peek_u16le__no_bounds_check
+#define wuffs_base__load_u24be__no_bounds_check \
+ wuffs_base__peek_u24be__no_bounds_check
+#define wuffs_base__load_u24le__no_bounds_check \
+ wuffs_base__peek_u24le__no_bounds_check
+#define wuffs_base__load_u32be__no_bounds_check \
+ wuffs_base__peek_u32be__no_bounds_check
+#define wuffs_base__load_u32le__no_bounds_check \
+ wuffs_base__peek_u32le__no_bounds_check
+#define wuffs_base__load_u40be__no_bounds_check \
+ wuffs_base__peek_u40be__no_bounds_check
+#define wuffs_base__load_u40le__no_bounds_check \
+ wuffs_base__peek_u40le__no_bounds_check
+#define wuffs_base__load_u48be__no_bounds_check \
+ wuffs_base__peek_u48be__no_bounds_check
+#define wuffs_base__load_u48le__no_bounds_check \
+ wuffs_base__peek_u48le__no_bounds_check
+#define wuffs_base__load_u56be__no_bounds_check \
+ wuffs_base__peek_u56be__no_bounds_check
+#define wuffs_base__load_u56le__no_bounds_check \
+ wuffs_base__peek_u56le__no_bounds_check
+#define wuffs_base__load_u64be__no_bounds_check \
+ wuffs_base__peek_u64be__no_bounds_check
+#define wuffs_base__load_u64le__no_bounds_check \
+ wuffs_base__peek_u64le__no_bounds_check
+
+#define wuffs_base__store_u8__no_bounds_check \
+ wuffs_base__poke_u8__no_bounds_check
+#define wuffs_base__store_u16be__no_bounds_check \
+ wuffs_base__poke_u16be__no_bounds_check
+#define wuffs_base__store_u16le__no_bounds_check \
+ wuffs_base__poke_u16le__no_bounds_check
+#define wuffs_base__store_u24be__no_bounds_check \
+ wuffs_base__poke_u24be__no_bounds_check
+#define wuffs_base__store_u24le__no_bounds_check \
+ wuffs_base__poke_u24le__no_bounds_check
+#define wuffs_base__store_u32be__no_bounds_check \
+ wuffs_base__poke_u32be__no_bounds_check
+#define wuffs_base__store_u32le__no_bounds_check \
+ wuffs_base__poke_u32le__no_bounds_check
+#define wuffs_base__store_u40be__no_bounds_check \
+ wuffs_base__poke_u40be__no_bounds_check
+#define wuffs_base__store_u40le__no_bounds_check \
+ wuffs_base__poke_u40le__no_bounds_check
+#define wuffs_base__store_u48be__no_bounds_check \
+ wuffs_base__poke_u48be__no_bounds_check
+#define wuffs_base__store_u48le__no_bounds_check \
+ wuffs_base__poke_u48le__no_bounds_check
+#define wuffs_base__store_u56be__no_bounds_check \
+ wuffs_base__poke_u56be__no_bounds_check
+#define wuffs_base__store_u56le__no_bounds_check \
+ wuffs_base__poke_u56le__no_bounds_check
+#define wuffs_base__store_u64be__no_bounds_check \
+ wuffs_base__poke_u64be__no_bounds_check
+#define wuffs_base__store_u64le__no_bounds_check \
+ wuffs_base__poke_u64le__no_bounds_check
+
+// ---------------- Slices and Tables
+
+// WUFFS_BASE__SLICE is a 1-dimensional buffer.
+//
+// len measures a number of elements, not necessarily a size in bytes.
+//
+// A value with all fields NULL or zero is a valid, empty slice.
+#define WUFFS_BASE__SLICE(T) \
+ struct { \
+ T* ptr; \
+ size_t len; \
+ }
+
+// WUFFS_BASE__TABLE is a 2-dimensional buffer.
+//
+// width, height and stride measure a number of elements, not necessarily a
+// size in bytes.
+//
+// A value with all fields NULL or zero is a valid, empty table.
+#define WUFFS_BASE__TABLE(T) \
+ struct { \
+ T* ptr; \
+ size_t width; \
+ size_t height; \
+ size_t stride; \
+ }
+
+typedef WUFFS_BASE__SLICE(uint8_t) wuffs_base__slice_u8;
+typedef WUFFS_BASE__SLICE(uint16_t) wuffs_base__slice_u16;
+typedef WUFFS_BASE__SLICE(uint32_t) wuffs_base__slice_u32;
+typedef WUFFS_BASE__SLICE(uint64_t) wuffs_base__slice_u64;
+
+typedef WUFFS_BASE__TABLE(uint8_t) wuffs_base__table_u8;
+typedef WUFFS_BASE__TABLE(uint16_t) wuffs_base__table_u16;
+typedef WUFFS_BASE__TABLE(uint32_t) wuffs_base__table_u32;
+typedef WUFFS_BASE__TABLE(uint64_t) wuffs_base__table_u64;
+
+static inline wuffs_base__slice_u8 //
+wuffs_base__make_slice_u8(uint8_t* ptr, size_t len) {
+ wuffs_base__slice_u8 ret;
+ ret.ptr = ptr;
+ ret.len = len;
+ return ret;
+}
+
+static inline wuffs_base__slice_u16 //
+wuffs_base__make_slice_u16(uint16_t* ptr, size_t len) {
+ wuffs_base__slice_u16 ret;
+ ret.ptr = ptr;
+ ret.len = len;
+ return ret;
+}
+
+static inline wuffs_base__slice_u32 //
+wuffs_base__make_slice_u32(uint32_t* ptr, size_t len) {
+ wuffs_base__slice_u32 ret;
+ ret.ptr = ptr;
+ ret.len = len;
+ return ret;
+}
+
+static inline wuffs_base__slice_u64 //
+wuffs_base__make_slice_u64(uint64_t* ptr, size_t len) {
+ wuffs_base__slice_u64 ret;
+ ret.ptr = ptr;
+ ret.len = len;
+ return ret;
+}
+
+static inline wuffs_base__slice_u8 //
+wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) {
+ wuffs_base__slice_u8 ret;
+ ret.ptr = ptr + i;
+ ret.len = (j >= i) ? (j - i) : 0;
+ return ret;
+}
+
+static inline wuffs_base__slice_u16 //
+wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) {
+ wuffs_base__slice_u16 ret;
+ ret.ptr = ptr + i;
+ ret.len = (j >= i) ? (j - i) : 0;
+ return ret;
+}
+
+static inline wuffs_base__slice_u32 //
+wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) {
+ wuffs_base__slice_u32 ret;
+ ret.ptr = ptr + i;
+ ret.len = (j >= i) ? (j - i) : 0;
+ return ret;
+}
+
+static inline wuffs_base__slice_u64 //
+wuffs_base__make_slice_u64_ij(uint64_t* ptr, size_t i, size_t j) {
+ wuffs_base__slice_u64 ret;
+ ret.ptr = ptr + i;
+ ret.len = (j >= i) ? (j - i) : 0;
+ return ret;
+}
+
+static inline wuffs_base__slice_u8 //
+wuffs_base__empty_slice_u8() {
+ wuffs_base__slice_u8 ret;
+ ret.ptr = NULL;
+ ret.len = 0;
+ return ret;
+}
+
+static inline wuffs_base__slice_u16 //
+wuffs_base__empty_slice_u16() {
+ wuffs_base__slice_u16 ret;
+ ret.ptr = NULL;
+ ret.len = 0;
+ return ret;
+}
+
+static inline wuffs_base__slice_u32 //
+wuffs_base__empty_slice_u32() {
+ wuffs_base__slice_u32 ret;
+ ret.ptr = NULL;
+ ret.len = 0;
+ return ret;
+}
+
+static inline wuffs_base__slice_u64 //
+wuffs_base__empty_slice_u64() {
+ wuffs_base__slice_u64 ret;
+ ret.ptr = NULL;
+ ret.len = 0;
+ return ret;
+}
+
+static inline wuffs_base__table_u8 //
+wuffs_base__make_table_u8(uint8_t* ptr,
+ size_t width,
+ size_t height,
+ size_t stride) {
+ wuffs_base__table_u8 ret;
+ ret.ptr = ptr;
+ ret.width = width;
+ ret.height = height;
+ ret.stride = stride;
+ return ret;
+}
+
+static inline wuffs_base__table_u16 //
+wuffs_base__make_table_u16(uint16_t* ptr,
+ size_t width,
+ size_t height,
+ size_t stride) {
+ wuffs_base__table_u16 ret;
+ ret.ptr = ptr;
+ ret.width = width;
+ ret.height = height;
+ ret.stride = stride;
+ return ret;
+}
+
+static inline wuffs_base__table_u32 //
+wuffs_base__make_table_u32(uint32_t* ptr,
+ size_t width,
+ size_t height,
+ size_t stride) {
+ wuffs_base__table_u32 ret;
+ ret.ptr = ptr;
+ ret.width = width;
+ ret.height = height;
+ ret.stride = stride;
+ return ret;
+}
+
+static inline wuffs_base__table_u64 //
+wuffs_base__make_table_u64(uint64_t* ptr,
+ size_t width,
+ size_t height,
+ size_t stride) {
+ wuffs_base__table_u64 ret;
+ ret.ptr = ptr;
+ ret.width = width;
+ ret.height = height;
+ ret.stride = stride;
+ return ret;
+}
+
+static inline wuffs_base__table_u8 //
+wuffs_base__empty_table_u8() {
+ wuffs_base__table_u8 ret;
+ ret.ptr = NULL;
+ ret.width = 0;
+ ret.height = 0;
+ ret.stride = 0;
+ return ret;
+}
+
+static inline wuffs_base__table_u16 //
+wuffs_base__empty_table_u16() {
+ wuffs_base__table_u16 ret;
+ ret.ptr = NULL;
+ ret.width = 0;
+ ret.height = 0;
+ ret.stride = 0;
+ return ret;
+}
+
+static inline wuffs_base__table_u32 //
+wuffs_base__empty_table_u32() {
+ wuffs_base__table_u32 ret;
+ ret.ptr = NULL;
+ ret.width = 0;
+ ret.height = 0;
+ ret.stride = 0;
+ return ret;
+}
+
+static inline wuffs_base__table_u64 //
+wuffs_base__empty_table_u64() {
+ wuffs_base__table_u64 ret;
+ ret.ptr = NULL;
+ ret.width = 0;
+ ret.height = 0;
+ ret.stride = 0;
+ return ret;
+}
+
+static inline bool //
+wuffs_base__slice_u8__overlaps(wuffs_base__slice_u8 s, wuffs_base__slice_u8 t) {
+ return ((s.ptr <= t.ptr) && (t.ptr < (s.ptr + s.len))) ||
+ ((t.ptr <= s.ptr) && (s.ptr < (t.ptr + t.len)));
+}
+
+// wuffs_base__slice_u8__subslice_i returns s[i:].
+//
+// It returns an empty slice if i is out of bounds.
+static inline wuffs_base__slice_u8 //
+wuffs_base__slice_u8__subslice_i(wuffs_base__slice_u8 s, uint64_t i) {
+ if ((i <= SIZE_MAX) && (i <= s.len)) {
+ return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(s.len - i)));
+ }
+ return wuffs_base__make_slice_u8(NULL, 0);
+}
+
+// wuffs_base__slice_u8__subslice_j returns s[:j].
+//
+// It returns an empty slice if j is out of bounds.
+static inline wuffs_base__slice_u8 //
+wuffs_base__slice_u8__subslice_j(wuffs_base__slice_u8 s, uint64_t j) {
+ if ((j <= SIZE_MAX) && (j <= s.len)) {
+ return wuffs_base__make_slice_u8(s.ptr, ((size_t)j));
+ }
+ return wuffs_base__make_slice_u8(NULL, 0);
+}
+
+// wuffs_base__slice_u8__subslice_ij returns s[i:j].
+//
+// It returns an empty slice if i or j is out of bounds.
+static inline wuffs_base__slice_u8 //
+wuffs_base__slice_u8__subslice_ij(wuffs_base__slice_u8 s,
+ uint64_t i,
+ uint64_t j) {
+ if ((i <= j) && (j <= SIZE_MAX) && (j <= s.len)) {
+ return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(j - i)));
+ }
+ return wuffs_base__make_slice_u8(NULL, 0);
+}
+
+// wuffs_base__table_u8__subtable_ij returns t[ix:jx, iy:jy].
+//
+// It returns an empty table if i or j is out of bounds.
+static inline wuffs_base__table_u8 //
+wuffs_base__table_u8__subtable_ij(wuffs_base__table_u8 t,
+ uint64_t ix,
+ uint64_t iy,
+ uint64_t jx,
+ uint64_t jy) {
+ if ((ix <= jx) && (jx <= SIZE_MAX) && (jx <= t.width) && //
+ (iy <= jy) && (jy <= SIZE_MAX) && (jy <= t.height)) {
+ return wuffs_base__make_table_u8(t.ptr + ix + (iy * t.stride), //
+ ((size_t)(jx - ix)), //
+ ((size_t)(jy - iy)), //
+ t.stride); //
+ }
+ return wuffs_base__make_table_u8(NULL, 0, 0, 0);
+}
+
+// wuffs_base__table__flattened_length returns the number of elements covered
+// by the 1-dimensional span that backs a 2-dimensional table. This counts the
+// elements inside the table and, when width != stride, the elements outside
+// the table but between its rows.
+//
+// For example, consider a width 10, height 4, stride 10 table. Mark its first
+// and last (inclusive) elements with 'a' and 'z'. This function returns 40.
+//
+// a123456789
+// 0123456789
+// 0123456789
+// 012345678z
+//
+// Now consider the sub-table of that from (2, 1) inclusive to (8, 4) exclusive.
+//
+// a123456789
+// 01iiiiiioo
+// ooiiiiiioo
+// ooiiiiii8z
+//
+// This function (called with width 6, height 3, stride 10) returns 26: 18 'i'
+// inside elements plus 8 'o' outside elements. Note that 26 is less than a
+// naive (height * stride = 30) computation. Indeed, advancing 29 elements from
+// the first 'i' would venture past 'z', out of bounds of the original table.
+//
+// It does not check for overflow, but if the arguments come from a table that
+// exists in memory and each element occupies a positive number of bytes then
+// the result should be bounded by the amount of allocatable memory (which
+// shouldn't overflow SIZE_MAX).
+static inline size_t //
+wuffs_base__table__flattened_length(size_t width,
+ size_t height,
+ size_t stride) {
+ if (height == 0) {
+ return 0;
+ }
+ return ((height - 1) * stride) + width;
+}
+
+// ---------------- Magic Numbers
+
+// wuffs_base__magic_number_guess_fourcc guesses the file format of some data,
+// given its starting bytes (the prefix_data argument) and whether or not there
+// may be further bytes (the prefix_closed argument; true means that
+// prefix_data is the entire data).
+//
+// It returns a positive FourCC value on success.
+//
+// It returns zero if nothing matches its hard-coded list of 'magic numbers'.
+//
+// It returns a negative value if prefix_closed is false and a longer prefix is
+// required for a conclusive result. For example, a single 'B' byte (without
+// further data) is not enough to discriminate the BMP and BPG image file
+// formats. Similarly, a single '\xFF' byte might be the start of JPEG data or
+// it might be the start of some other binary data.
+//
+// It does not do a full validity check. Like any guess made from a short
+// prefix of the data, it may return false positives. Data that starts with 99
+// bytes of valid JPEG followed by corruption or truncation is an invalid JPEG
+// image overall, but this function will still return WUFFS_BASE__FOURCC__JPEG.
+//
+// Another source of false positives is that some 'magic numbers' are valid
+// ASCII data. A file starting with "GIF87a and GIF89a are the two versions of
+// GIF" will match GIF's 'magic number' even if it's plain text, not an image.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__MAGIC sub-module, not just
+// WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC int32_t //
+wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data,
+ bool prefix_closed);
+
+// ---------------- Ranges and Rects
+
+// See https://github.com/google/wuffs/blob/main/doc/note/ranges-and-rects.md
+
+typedef struct wuffs_base__range_ii_u32__struct {
+ uint32_t min_incl;
+ uint32_t max_incl;
+
+#ifdef __cplusplus
+ inline bool is_empty() const;
+ inline bool equals(wuffs_base__range_ii_u32__struct s) const;
+ inline wuffs_base__range_ii_u32__struct intersect(
+ wuffs_base__range_ii_u32__struct s) const;
+ inline wuffs_base__range_ii_u32__struct unite(
+ wuffs_base__range_ii_u32__struct s) const;
+ inline bool contains(uint32_t x) const;
+ inline bool contains_range(wuffs_base__range_ii_u32__struct s) const;
+#endif // __cplusplus
+
+} wuffs_base__range_ii_u32;
+
+static inline wuffs_base__range_ii_u32 //
+wuffs_base__empty_range_ii_u32() {
+ wuffs_base__range_ii_u32 ret;
+ ret.min_incl = 0;
+ ret.max_incl = 0;
+ return ret;
+}
+
+static inline wuffs_base__range_ii_u32 //
+wuffs_base__make_range_ii_u32(uint32_t min_incl, uint32_t max_incl) {
+ wuffs_base__range_ii_u32 ret;
+ ret.min_incl = min_incl;
+ ret.max_incl = max_incl;
+ return ret;
+}
+
+static inline bool //
+wuffs_base__range_ii_u32__is_empty(const wuffs_base__range_ii_u32* r) {
+ return r->min_incl > r->max_incl;
+}
+
+static inline bool //
+wuffs_base__range_ii_u32__equals(const wuffs_base__range_ii_u32* r,
+ wuffs_base__range_ii_u32 s) {
+ return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||
+ (wuffs_base__range_ii_u32__is_empty(r) &&
+ wuffs_base__range_ii_u32__is_empty(&s));
+}
+
+static inline wuffs_base__range_ii_u32 //
+wuffs_base__range_ii_u32__intersect(const wuffs_base__range_ii_u32* r,
+ wuffs_base__range_ii_u32 s) {
+ wuffs_base__range_ii_u32 t;
+ t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);
+ t.max_incl = wuffs_base__u32__min(r->max_incl, s.max_incl);
+ return t;
+}
+
+static inline wuffs_base__range_ii_u32 //
+wuffs_base__range_ii_u32__unite(const wuffs_base__range_ii_u32* r,
+ wuffs_base__range_ii_u32 s) {
+ if (wuffs_base__range_ii_u32__is_empty(r)) {
+ return s;
+ }
+ if (wuffs_base__range_ii_u32__is_empty(&s)) {
+ return *r;
+ }
+ wuffs_base__range_ii_u32 t;
+ t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);
+ t.max_incl = wuffs_base__u32__max(r->max_incl, s.max_incl);
+ return t;
+}
+
+static inline bool //
+wuffs_base__range_ii_u32__contains(const wuffs_base__range_ii_u32* r,
+ uint32_t x) {
+ return (r->min_incl <= x) && (x <= r->max_incl);
+}
+
+static inline bool //
+wuffs_base__range_ii_u32__contains_range(const wuffs_base__range_ii_u32* r,
+ wuffs_base__range_ii_u32 s) {
+ return wuffs_base__range_ii_u32__equals(
+ &s, wuffs_base__range_ii_u32__intersect(r, s));
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__range_ii_u32::is_empty() const {
+ return wuffs_base__range_ii_u32__is_empty(this);
+}
+
+inline bool //
+wuffs_base__range_ii_u32::equals(wuffs_base__range_ii_u32 s) const {
+ return wuffs_base__range_ii_u32__equals(this, s);
+}
+
+inline wuffs_base__range_ii_u32 //
+wuffs_base__range_ii_u32::intersect(wuffs_base__range_ii_u32 s) const {
+ return wuffs_base__range_ii_u32__intersect(this, s);
+}
+
+inline wuffs_base__range_ii_u32 //
+wuffs_base__range_ii_u32::unite(wuffs_base__range_ii_u32 s) const {
+ return wuffs_base__range_ii_u32__unite(this, s);
+}
+
+inline bool //
+wuffs_base__range_ii_u32::contains(uint32_t x) const {
+ return wuffs_base__range_ii_u32__contains(this, x);
+}
+
+inline bool //
+wuffs_base__range_ii_u32::contains_range(wuffs_base__range_ii_u32 s) const {
+ return wuffs_base__range_ii_u32__contains_range(this, s);
+}
+
+#endif // __cplusplus
+
+// --------
+
+typedef struct wuffs_base__range_ie_u32__struct {
+ uint32_t min_incl;
+ uint32_t max_excl;
+
+#ifdef __cplusplus
+ inline bool is_empty() const;
+ inline bool equals(wuffs_base__range_ie_u32__struct s) const;
+ inline wuffs_base__range_ie_u32__struct intersect(
+ wuffs_base__range_ie_u32__struct s) const;
+ inline wuffs_base__range_ie_u32__struct unite(
+ wuffs_base__range_ie_u32__struct s) const;
+ inline bool contains(uint32_t x) const;
+ inline bool contains_range(wuffs_base__range_ie_u32__struct s) const;
+ inline uint32_t length() const;
+#endif // __cplusplus
+
+} wuffs_base__range_ie_u32;
+
+static inline wuffs_base__range_ie_u32 //
+wuffs_base__empty_range_ie_u32() {
+ wuffs_base__range_ie_u32 ret;
+ ret.min_incl = 0;
+ ret.max_excl = 0;
+ return ret;
+}
+
+static inline wuffs_base__range_ie_u32 //
+wuffs_base__make_range_ie_u32(uint32_t min_incl, uint32_t max_excl) {
+ wuffs_base__range_ie_u32 ret;
+ ret.min_incl = min_incl;
+ ret.max_excl = max_excl;
+ return ret;
+}
+
+static inline bool //
+wuffs_base__range_ie_u32__is_empty(const wuffs_base__range_ie_u32* r) {
+ return r->min_incl >= r->max_excl;
+}
+
+static inline bool //
+wuffs_base__range_ie_u32__equals(const wuffs_base__range_ie_u32* r,
+ wuffs_base__range_ie_u32 s) {
+ return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||
+ (wuffs_base__range_ie_u32__is_empty(r) &&
+ wuffs_base__range_ie_u32__is_empty(&s));
+}
+
+static inline wuffs_base__range_ie_u32 //
+wuffs_base__range_ie_u32__intersect(const wuffs_base__range_ie_u32* r,
+ wuffs_base__range_ie_u32 s) {
+ wuffs_base__range_ie_u32 t;
+ t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);
+ t.max_excl = wuffs_base__u32__min(r->max_excl, s.max_excl);
+ return t;
+}
+
+static inline wuffs_base__range_ie_u32 //
+wuffs_base__range_ie_u32__unite(const wuffs_base__range_ie_u32* r,
+ wuffs_base__range_ie_u32 s) {
+ if (wuffs_base__range_ie_u32__is_empty(r)) {
+ return s;
+ }
+ if (wuffs_base__range_ie_u32__is_empty(&s)) {
+ return *r;
+ }
+ wuffs_base__range_ie_u32 t;
+ t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);
+ t.max_excl = wuffs_base__u32__max(r->max_excl, s.max_excl);
+ return t;
+}
+
+static inline bool //
+wuffs_base__range_ie_u32__contains(const wuffs_base__range_ie_u32* r,
+ uint32_t x) {
+ return (r->min_incl <= x) && (x < r->max_excl);
+}
+
+static inline bool //
+wuffs_base__range_ie_u32__contains_range(const wuffs_base__range_ie_u32* r,
+ wuffs_base__range_ie_u32 s) {
+ return wuffs_base__range_ie_u32__equals(
+ &s, wuffs_base__range_ie_u32__intersect(r, s));
+}
+
+static inline uint32_t //
+wuffs_base__range_ie_u32__length(const wuffs_base__range_ie_u32* r) {
+ return wuffs_base__u32__sat_sub(r->max_excl, r->min_incl);
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__range_ie_u32::is_empty() const {
+ return wuffs_base__range_ie_u32__is_empty(this);
+}
+
+inline bool //
+wuffs_base__range_ie_u32::equals(wuffs_base__range_ie_u32 s) const {
+ return wuffs_base__range_ie_u32__equals(this, s);
+}
+
+inline wuffs_base__range_ie_u32 //
+wuffs_base__range_ie_u32::intersect(wuffs_base__range_ie_u32 s) const {
+ return wuffs_base__range_ie_u32__intersect(this, s);
+}
+
+inline wuffs_base__range_ie_u32 //
+wuffs_base__range_ie_u32::unite(wuffs_base__range_ie_u32 s) const {
+ return wuffs_base__range_ie_u32__unite(this, s);
+}
+
+inline bool //
+wuffs_base__range_ie_u32::contains(uint32_t x) const {
+ return wuffs_base__range_ie_u32__contains(this, x);
+}
+
+inline bool //
+wuffs_base__range_ie_u32::contains_range(wuffs_base__range_ie_u32 s) const {
+ return wuffs_base__range_ie_u32__contains_range(this, s);
+}
+
+inline uint32_t //
+wuffs_base__range_ie_u32::length() const {
+ return wuffs_base__range_ie_u32__length(this);
+}
+
+#endif // __cplusplus
+
+// --------
+
+typedef struct wuffs_base__range_ii_u64__struct {
+ uint64_t min_incl;
+ uint64_t max_incl;
+
+#ifdef __cplusplus
+ inline bool is_empty() const;
+ inline bool equals(wuffs_base__range_ii_u64__struct s) const;
+ inline wuffs_base__range_ii_u64__struct intersect(
+ wuffs_base__range_ii_u64__struct s) const;
+ inline wuffs_base__range_ii_u64__struct unite(
+ wuffs_base__range_ii_u64__struct s) const;
+ inline bool contains(uint64_t x) const;
+ inline bool contains_range(wuffs_base__range_ii_u64__struct s) const;
+#endif // __cplusplus
+
+} wuffs_base__range_ii_u64;
+
+static inline wuffs_base__range_ii_u64 //
+wuffs_base__empty_range_ii_u64() {
+ wuffs_base__range_ii_u64 ret;
+ ret.min_incl = 0;
+ ret.max_incl = 0;
+ return ret;
+}
+
+static inline wuffs_base__range_ii_u64 //
+wuffs_base__make_range_ii_u64(uint64_t min_incl, uint64_t max_incl) {
+ wuffs_base__range_ii_u64 ret;
+ ret.min_incl = min_incl;
+ ret.max_incl = max_incl;
+ return ret;
+}
+
+static inline bool //
+wuffs_base__range_ii_u64__is_empty(const wuffs_base__range_ii_u64* r) {
+ return r->min_incl > r->max_incl;
+}
+
+static inline bool //
+wuffs_base__range_ii_u64__equals(const wuffs_base__range_ii_u64* r,
+ wuffs_base__range_ii_u64 s) {
+ return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||
+ (wuffs_base__range_ii_u64__is_empty(r) &&
+ wuffs_base__range_ii_u64__is_empty(&s));
+}
+
+static inline wuffs_base__range_ii_u64 //
+wuffs_base__range_ii_u64__intersect(const wuffs_base__range_ii_u64* r,
+ wuffs_base__range_ii_u64 s) {
+ wuffs_base__range_ii_u64 t;
+ t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);
+ t.max_incl = wuffs_base__u64__min(r->max_incl, s.max_incl);
+ return t;
+}
+
+static inline wuffs_base__range_ii_u64 //
+wuffs_base__range_ii_u64__unite(const wuffs_base__range_ii_u64* r,
+ wuffs_base__range_ii_u64 s) {
+ if (wuffs_base__range_ii_u64__is_empty(r)) {
+ return s;
+ }
+ if (wuffs_base__range_ii_u64__is_empty(&s)) {
+ return *r;
+ }
+ wuffs_base__range_ii_u64 t;
+ t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);
+ t.max_incl = wuffs_base__u64__max(r->max_incl, s.max_incl);
+ return t;
+}
+
+static inline bool //
+wuffs_base__range_ii_u64__contains(const wuffs_base__range_ii_u64* r,
+ uint64_t x) {
+ return (r->min_incl <= x) && (x <= r->max_incl);
+}
+
+static inline bool //
+wuffs_base__range_ii_u64__contains_range(const wuffs_base__range_ii_u64* r,
+ wuffs_base__range_ii_u64 s) {
+ return wuffs_base__range_ii_u64__equals(
+ &s, wuffs_base__range_ii_u64__intersect(r, s));
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__range_ii_u64::is_empty() const {
+ return wuffs_base__range_ii_u64__is_empty(this);
+}
+
+inline bool //
+wuffs_base__range_ii_u64::equals(wuffs_base__range_ii_u64 s) const {
+ return wuffs_base__range_ii_u64__equals(this, s);
+}
+
+inline wuffs_base__range_ii_u64 //
+wuffs_base__range_ii_u64::intersect(wuffs_base__range_ii_u64 s) const {
+ return wuffs_base__range_ii_u64__intersect(this, s);
+}
+
+inline wuffs_base__range_ii_u64 //
+wuffs_base__range_ii_u64::unite(wuffs_base__range_ii_u64 s) const {
+ return wuffs_base__range_ii_u64__unite(this, s);
+}
+
+inline bool //
+wuffs_base__range_ii_u64::contains(uint64_t x) const {
+ return wuffs_base__range_ii_u64__contains(this, x);
+}
+
+inline bool //
+wuffs_base__range_ii_u64::contains_range(wuffs_base__range_ii_u64 s) const {
+ return wuffs_base__range_ii_u64__contains_range(this, s);
+}
+
+#endif // __cplusplus
+
+// --------
+
+typedef struct wuffs_base__range_ie_u64__struct {
+ uint64_t min_incl;
+ uint64_t max_excl;
+
+#ifdef __cplusplus
+ inline bool is_empty() const;
+ inline bool equals(wuffs_base__range_ie_u64__struct s) const;
+ inline wuffs_base__range_ie_u64__struct intersect(
+ wuffs_base__range_ie_u64__struct s) const;
+ inline wuffs_base__range_ie_u64__struct unite(
+ wuffs_base__range_ie_u64__struct s) const;
+ inline bool contains(uint64_t x) const;
+ inline bool contains_range(wuffs_base__range_ie_u64__struct s) const;
+ inline uint64_t length() const;
+#endif // __cplusplus
+
+} wuffs_base__range_ie_u64;
+
+static inline wuffs_base__range_ie_u64 //
+wuffs_base__empty_range_ie_u64() {
+ wuffs_base__range_ie_u64 ret;
+ ret.min_incl = 0;
+ ret.max_excl = 0;
+ return ret;
+}
+
+static inline wuffs_base__range_ie_u64 //
+wuffs_base__make_range_ie_u64(uint64_t min_incl, uint64_t max_excl) {
+ wuffs_base__range_ie_u64 ret;
+ ret.min_incl = min_incl;
+ ret.max_excl = max_excl;
+ return ret;
+}
+
+static inline bool //
+wuffs_base__range_ie_u64__is_empty(const wuffs_base__range_ie_u64* r) {
+ return r->min_incl >= r->max_excl;
+}
+
+static inline bool //
+wuffs_base__range_ie_u64__equals(const wuffs_base__range_ie_u64* r,
+ wuffs_base__range_ie_u64 s) {
+ return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||
+ (wuffs_base__range_ie_u64__is_empty(r) &&
+ wuffs_base__range_ie_u64__is_empty(&s));
+}
+
+static inline wuffs_base__range_ie_u64 //
+wuffs_base__range_ie_u64__intersect(const wuffs_base__range_ie_u64* r,
+ wuffs_base__range_ie_u64 s) {
+ wuffs_base__range_ie_u64 t;
+ t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);
+ t.max_excl = wuffs_base__u64__min(r->max_excl, s.max_excl);
+ return t;
+}
+
+static inline wuffs_base__range_ie_u64 //
+wuffs_base__range_ie_u64__unite(const wuffs_base__range_ie_u64* r,
+ wuffs_base__range_ie_u64 s) {
+ if (wuffs_base__range_ie_u64__is_empty(r)) {
+ return s;
+ }
+ if (wuffs_base__range_ie_u64__is_empty(&s)) {
+ return *r;
+ }
+ wuffs_base__range_ie_u64 t;
+ t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);
+ t.max_excl = wuffs_base__u64__max(r->max_excl, s.max_excl);
+ return t;
+}
+
+static inline bool //
+wuffs_base__range_ie_u64__contains(const wuffs_base__range_ie_u64* r,
+ uint64_t x) {
+ return (r->min_incl <= x) && (x < r->max_excl);
+}
+
+static inline bool //
+wuffs_base__range_ie_u64__contains_range(const wuffs_base__range_ie_u64* r,
+ wuffs_base__range_ie_u64 s) {
+ return wuffs_base__range_ie_u64__equals(
+ &s, wuffs_base__range_ie_u64__intersect(r, s));
+}
+
+static inline uint64_t //
+wuffs_base__range_ie_u64__length(const wuffs_base__range_ie_u64* r) {
+ return wuffs_base__u64__sat_sub(r->max_excl, r->min_incl);
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__range_ie_u64::is_empty() const {
+ return wuffs_base__range_ie_u64__is_empty(this);
+}
+
+inline bool //
+wuffs_base__range_ie_u64::equals(wuffs_base__range_ie_u64 s) const {
+ return wuffs_base__range_ie_u64__equals(this, s);
+}
+
+inline wuffs_base__range_ie_u64 //
+wuffs_base__range_ie_u64::intersect(wuffs_base__range_ie_u64 s) const {
+ return wuffs_base__range_ie_u64__intersect(this, s);
+}
+
+inline wuffs_base__range_ie_u64 //
+wuffs_base__range_ie_u64::unite(wuffs_base__range_ie_u64 s) const {
+ return wuffs_base__range_ie_u64__unite(this, s);
+}
+
+inline bool //
+wuffs_base__range_ie_u64::contains(uint64_t x) const {
+ return wuffs_base__range_ie_u64__contains(this, x);
+}
+
+inline bool //
+wuffs_base__range_ie_u64::contains_range(wuffs_base__range_ie_u64 s) const {
+ return wuffs_base__range_ie_u64__contains_range(this, s);
+}
+
+inline uint64_t //
+wuffs_base__range_ie_u64::length() const {
+ return wuffs_base__range_ie_u64__length(this);
+}
+
+#endif // __cplusplus
+
+// --------
+
+typedef struct wuffs_base__rect_ii_u32__struct {
+ uint32_t min_incl_x;
+ uint32_t min_incl_y;
+ uint32_t max_incl_x;
+ uint32_t max_incl_y;
+
+#ifdef __cplusplus
+ inline bool is_empty() const;
+ inline bool equals(wuffs_base__rect_ii_u32__struct s) const;
+ inline wuffs_base__rect_ii_u32__struct intersect(
+ wuffs_base__rect_ii_u32__struct s) const;
+ inline wuffs_base__rect_ii_u32__struct unite(
+ wuffs_base__rect_ii_u32__struct s) const;
+ inline bool contains(uint32_t x, uint32_t y) const;
+ inline bool contains_rect(wuffs_base__rect_ii_u32__struct s) const;
+#endif // __cplusplus
+
+} wuffs_base__rect_ii_u32;
+
+static inline wuffs_base__rect_ii_u32 //
+wuffs_base__empty_rect_ii_u32() {
+ wuffs_base__rect_ii_u32 ret;
+ ret.min_incl_x = 0;
+ ret.min_incl_y = 0;
+ ret.max_incl_x = 0;
+ ret.max_incl_y = 0;
+ return ret;
+}
+
+static inline wuffs_base__rect_ii_u32 //
+wuffs_base__make_rect_ii_u32(uint32_t min_incl_x,
+ uint32_t min_incl_y,
+ uint32_t max_incl_x,
+ uint32_t max_incl_y) {
+ wuffs_base__rect_ii_u32 ret;
+ ret.min_incl_x = min_incl_x;
+ ret.min_incl_y = min_incl_y;
+ ret.max_incl_x = max_incl_x;
+ ret.max_incl_y = max_incl_y;
+ return ret;
+}
+
+static inline bool //
+wuffs_base__rect_ii_u32__is_empty(const wuffs_base__rect_ii_u32* r) {
+ return (r->min_incl_x > r->max_incl_x) || (r->min_incl_y > r->max_incl_y);
+}
+
+static inline bool //
+wuffs_base__rect_ii_u32__equals(const wuffs_base__rect_ii_u32* r,
+ wuffs_base__rect_ii_u32 s) {
+ return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&
+ r->max_incl_x == s.max_incl_x && r->max_incl_y == s.max_incl_y) ||
+ (wuffs_base__rect_ii_u32__is_empty(r) &&
+ wuffs_base__rect_ii_u32__is_empty(&s));
+}
+
+static inline wuffs_base__rect_ii_u32 //
+wuffs_base__rect_ii_u32__intersect(const wuffs_base__rect_ii_u32* r,
+ wuffs_base__rect_ii_u32 s) {
+ wuffs_base__rect_ii_u32 t;
+ t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);
+ t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);
+ t.max_incl_x = wuffs_base__u32__min(r->max_incl_x, s.max_incl_x);
+ t.max_incl_y = wuffs_base__u32__min(r->max_incl_y, s.max_incl_y);
+ return t;
+}
+
+static inline wuffs_base__rect_ii_u32 //
+wuffs_base__rect_ii_u32__unite(const wuffs_base__rect_ii_u32* r,
+ wuffs_base__rect_ii_u32 s) {
+ if (wuffs_base__rect_ii_u32__is_empty(r)) {
+ return s;
+ }
+ if (wuffs_base__rect_ii_u32__is_empty(&s)) {
+ return *r;
+ }
+ wuffs_base__rect_ii_u32 t;
+ t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);
+ t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);
+ t.max_incl_x = wuffs_base__u32__max(r->max_incl_x, s.max_incl_x);
+ t.max_incl_y = wuffs_base__u32__max(r->max_incl_y, s.max_incl_y);
+ return t;
+}
+
+static inline bool //
+wuffs_base__rect_ii_u32__contains(const wuffs_base__rect_ii_u32* r,
+ uint32_t x,
+ uint32_t y) {
+ return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) &&
+ (y <= r->max_incl_y);
+}
+
+static inline bool //
+wuffs_base__rect_ii_u32__contains_rect(const wuffs_base__rect_ii_u32* r,
+ wuffs_base__rect_ii_u32 s) {
+ return wuffs_base__rect_ii_u32__equals(
+ &s, wuffs_base__rect_ii_u32__intersect(r, s));
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__rect_ii_u32::is_empty() const {
+ return wuffs_base__rect_ii_u32__is_empty(this);
+}
+
+inline bool //
+wuffs_base__rect_ii_u32::equals(wuffs_base__rect_ii_u32 s) const {
+ return wuffs_base__rect_ii_u32__equals(this, s);
+}
+
+inline wuffs_base__rect_ii_u32 //
+wuffs_base__rect_ii_u32::intersect(wuffs_base__rect_ii_u32 s) const {
+ return wuffs_base__rect_ii_u32__intersect(this, s);
+}
+
+inline wuffs_base__rect_ii_u32 //
+wuffs_base__rect_ii_u32::unite(wuffs_base__rect_ii_u32 s) const {
+ return wuffs_base__rect_ii_u32__unite(this, s);
+}
+
+inline bool //
+wuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) const {
+ return wuffs_base__rect_ii_u32__contains(this, x, y);
+}
+
+inline bool //
+wuffs_base__rect_ii_u32::contains_rect(wuffs_base__rect_ii_u32 s) const {
+ return wuffs_base__rect_ii_u32__contains_rect(this, s);
+}
+
+#endif // __cplusplus
+
+// --------
+
+typedef struct wuffs_base__rect_ie_u32__struct {
+ uint32_t min_incl_x;
+ uint32_t min_incl_y;
+ uint32_t max_excl_x;
+ uint32_t max_excl_y;
+
+#ifdef __cplusplus
+ inline bool is_empty() const;
+ inline bool equals(wuffs_base__rect_ie_u32__struct s) const;
+ inline wuffs_base__rect_ie_u32__struct intersect(
+ wuffs_base__rect_ie_u32__struct s) const;
+ inline wuffs_base__rect_ie_u32__struct unite(
+ wuffs_base__rect_ie_u32__struct s) const;
+ inline bool contains(uint32_t x, uint32_t y) const;
+ inline bool contains_rect(wuffs_base__rect_ie_u32__struct s) const;
+ inline uint32_t width() const;
+ inline uint32_t height() const;
+#endif // __cplusplus
+
+} wuffs_base__rect_ie_u32;
+
+static inline wuffs_base__rect_ie_u32 //
+wuffs_base__empty_rect_ie_u32() {
+ wuffs_base__rect_ie_u32 ret;
+ ret.min_incl_x = 0;
+ ret.min_incl_y = 0;
+ ret.max_excl_x = 0;
+ ret.max_excl_y = 0;
+ return ret;
+}
+
+static inline wuffs_base__rect_ie_u32 //
+wuffs_base__make_rect_ie_u32(uint32_t min_incl_x,
+ uint32_t min_incl_y,
+ uint32_t max_excl_x,
+ uint32_t max_excl_y) {
+ wuffs_base__rect_ie_u32 ret;
+ ret.min_incl_x = min_incl_x;
+ ret.min_incl_y = min_incl_y;
+ ret.max_excl_x = max_excl_x;
+ ret.max_excl_y = max_excl_y;
+ return ret;
+}
+
+static inline bool //
+wuffs_base__rect_ie_u32__is_empty(const wuffs_base__rect_ie_u32* r) {
+ return (r->min_incl_x >= r->max_excl_x) || (r->min_incl_y >= r->max_excl_y);
+}
+
+static inline bool //
+wuffs_base__rect_ie_u32__equals(const wuffs_base__rect_ie_u32* r,
+ wuffs_base__rect_ie_u32 s) {
+ return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&
+ r->max_excl_x == s.max_excl_x && r->max_excl_y == s.max_excl_y) ||
+ (wuffs_base__rect_ie_u32__is_empty(r) &&
+ wuffs_base__rect_ie_u32__is_empty(&s));
+}
+
+static inline wuffs_base__rect_ie_u32 //
+wuffs_base__rect_ie_u32__intersect(const wuffs_base__rect_ie_u32* r,
+ wuffs_base__rect_ie_u32 s) {
+ wuffs_base__rect_ie_u32 t;
+ t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);
+ t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);
+ t.max_excl_x = wuffs_base__u32__min(r->max_excl_x, s.max_excl_x);
+ t.max_excl_y = wuffs_base__u32__min(r->max_excl_y, s.max_excl_y);
+ return t;
+}
+
+static inline wuffs_base__rect_ie_u32 //
+wuffs_base__rect_ie_u32__unite(const wuffs_base__rect_ie_u32* r,
+ wuffs_base__rect_ie_u32 s) {
+ if (wuffs_base__rect_ie_u32__is_empty(r)) {
+ return s;
+ }
+ if (wuffs_base__rect_ie_u32__is_empty(&s)) {
+ return *r;
+ }
+ wuffs_base__rect_ie_u32 t;
+ t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);
+ t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);
+ t.max_excl_x = wuffs_base__u32__max(r->max_excl_x, s.max_excl_x);
+ t.max_excl_y = wuffs_base__u32__max(r->max_excl_y, s.max_excl_y);
+ return t;
+}
+
+static inline bool //
+wuffs_base__rect_ie_u32__contains(const wuffs_base__rect_ie_u32* r,
+ uint32_t x,
+ uint32_t y) {
+ return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&
+ (y < r->max_excl_y);
+}
+
+static inline bool //
+wuffs_base__rect_ie_u32__contains_rect(const wuffs_base__rect_ie_u32* r,
+ wuffs_base__rect_ie_u32 s) {
+ return wuffs_base__rect_ie_u32__equals(
+ &s, wuffs_base__rect_ie_u32__intersect(r, s));
+}
+
+static inline uint32_t //
+wuffs_base__rect_ie_u32__width(const wuffs_base__rect_ie_u32* r) {
+ return wuffs_base__u32__sat_sub(r->max_excl_x, r->min_incl_x);
+}
+
+static inline uint32_t //
+wuffs_base__rect_ie_u32__height(const wuffs_base__rect_ie_u32* r) {
+ return wuffs_base__u32__sat_sub(r->max_excl_y, r->min_incl_y);
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__rect_ie_u32::is_empty() const {
+ return wuffs_base__rect_ie_u32__is_empty(this);
+}
+
+inline bool //
+wuffs_base__rect_ie_u32::equals(wuffs_base__rect_ie_u32 s) const {
+ return wuffs_base__rect_ie_u32__equals(this, s);
+}
+
+inline wuffs_base__rect_ie_u32 //
+wuffs_base__rect_ie_u32::intersect(wuffs_base__rect_ie_u32 s) const {
+ return wuffs_base__rect_ie_u32__intersect(this, s);
+}
+
+inline wuffs_base__rect_ie_u32 //
+wuffs_base__rect_ie_u32::unite(wuffs_base__rect_ie_u32 s) const {
+ return wuffs_base__rect_ie_u32__unite(this, s);
+}
+
+inline bool //
+wuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) const {
+ return wuffs_base__rect_ie_u32__contains(this, x, y);
+}
+
+inline bool //
+wuffs_base__rect_ie_u32::contains_rect(wuffs_base__rect_ie_u32 s) const {
+ return wuffs_base__rect_ie_u32__contains_rect(this, s);
+}
+
+inline uint32_t //
+wuffs_base__rect_ie_u32::width() const {
+ return wuffs_base__rect_ie_u32__width(this);
+}
+
+inline uint32_t //
+wuffs_base__rect_ie_u32::height() const {
+ return wuffs_base__rect_ie_u32__height(this);
+}
+
+#endif // __cplusplus
+
+// ---------------- More Information
+
+// wuffs_base__more_information holds additional fields, typically when a Wuffs
+// method returns a [note status](/doc/note/statuses.md).
+//
+// The flavor field follows the base38 namespace
+// convention](/doc/note/base38-and-fourcc.md). The other fields' semantics
+// depends on the flavor.
+typedef struct wuffs_base__more_information__struct {
+ uint32_t flavor;
+ uint32_t w;
+ uint64_t x;
+ uint64_t y;
+ uint64_t z;
+
+#ifdef __cplusplus
+ inline void set(uint32_t flavor_arg,
+ uint32_t w_arg,
+ uint64_t x_arg,
+ uint64_t y_arg,
+ uint64_t z_arg);
+ inline uint32_t io_redirect__fourcc() const;
+ inline wuffs_base__range_ie_u64 io_redirect__range() const;
+ inline uint64_t io_seek__position() const;
+ inline uint32_t metadata__fourcc() const;
+ // Deprecated: use metadata_raw_passthrough__range.
+ inline wuffs_base__range_ie_u64 metadata__range() const;
+ inline wuffs_base__range_ie_u64 metadata_raw_passthrough__range() const;
+ inline int32_t metadata_parsed__chrm(uint32_t component) const;
+ inline uint32_t metadata_parsed__gama() const;
+ inline uint32_t metadata_parsed__srgb() const;
+#endif // __cplusplus
+
+} wuffs_base__more_information;
+
+#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_REDIRECT 1
+#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_SEEK 2
+// Deprecated: use
+// WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH.
+#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA 3
+#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH 3
+#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_TRANSFORM 4
+#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED 5
+
+static inline wuffs_base__more_information //
+wuffs_base__empty_more_information() {
+ wuffs_base__more_information ret;
+ ret.flavor = 0;
+ ret.w = 0;
+ ret.x = 0;
+ ret.y = 0;
+ ret.z = 0;
+ return ret;
+}
+
+static inline void //
+wuffs_base__more_information__set(wuffs_base__more_information* m,
+ uint32_t flavor,
+ uint32_t w,
+ uint64_t x,
+ uint64_t y,
+ uint64_t z) {
+ if (!m) {
+ return;
+ }
+ m->flavor = flavor;
+ m->w = w;
+ m->x = x;
+ m->y = y;
+ m->z = z;
+}
+
+static inline uint32_t //
+wuffs_base__more_information__io_redirect__fourcc(
+ const wuffs_base__more_information* m) {
+ return m->w;
+}
+
+static inline wuffs_base__range_ie_u64 //
+wuffs_base__more_information__io_redirect__range(
+ const wuffs_base__more_information* m) {
+ wuffs_base__range_ie_u64 ret;
+ ret.min_incl = m->y;
+ ret.max_excl = m->z;
+ return ret;
+}
+
+static inline uint64_t //
+wuffs_base__more_information__io_seek__position(
+ const wuffs_base__more_information* m) {
+ return m->x;
+}
+
+static inline uint32_t //
+wuffs_base__more_information__metadata__fourcc(
+ const wuffs_base__more_information* m) {
+ return m->w;
+}
+
+// Deprecated: use
+// wuffs_base__more_information__metadata_raw_passthrough__range.
+static inline wuffs_base__range_ie_u64 //
+wuffs_base__more_information__metadata__range(
+ const wuffs_base__more_information* m) {
+ wuffs_base__range_ie_u64 ret;
+ ret.min_incl = m->y;
+ ret.max_excl = m->z;
+ return ret;
+}
+
+static inline wuffs_base__range_ie_u64 //
+wuffs_base__more_information__metadata_raw_passthrough__range(
+ const wuffs_base__more_information* m) {
+ wuffs_base__range_ie_u64 ret;
+ ret.min_incl = m->y;
+ ret.max_excl = m->z;
+ return ret;
+}
+
+#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_X 0
+#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_Y 1
+#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_X 2
+#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_Y 3
+#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__GREEN_X 4
+#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__GREEN_Y 5
+#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__BLUE_X 6
+#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__BLUE_Y 7
+
+// wuffs_base__more_information__metadata_parsed__chrm returns chromaticity
+// values (scaled by 100000) like the PNG "cHRM" chunk. For example, the sRGB
+// color space corresponds to:
+// - ETC__CHRM__WHITE_X 31270
+// - ETC__CHRM__WHITE_Y 32900
+// - ETC__CHRM__RED_X 64000
+// - ETC__CHRM__RED_Y 33000
+// - ETC__CHRM__GREEN_X 30000
+// - ETC__CHRM__GREEN_Y 60000
+// - ETC__CHRM__BLUE_X 15000
+// - ETC__CHRM__BLUE_Y 6000
+//
+// See
+// https://ciechanow.ski/color-spaces/#chromaticity-and-white-point-coordinates
+static inline int32_t //
+wuffs_base__more_information__metadata_parsed__chrm(
+ const wuffs_base__more_information* m,
+ uint32_t component) {
+ // After the flavor and the w field (holding a FourCC), a
+ // wuffs_base__more_information holds 24 bytes of data in three uint64_t
+ // typed fields (x, y and z). We pack the eight chromaticity values (wx, wy,
+ // rx, ..., by), basically int24_t values, into 24 bytes like this:
+ // - LSB MSB
+ // - x: wx wx wx wy wy wy rx rx
+ // - y: rx ry ry ry gx gx gx gy
+ // - z: gy gy bx bx bx by by by
+ uint32_t u = 0;
+ switch (component & 7) {
+ case 0:
+ u = ((uint32_t)(m->x >> 0));
+ break;
+ case 1:
+ u = ((uint32_t)(m->x >> 24));
+ break;
+ case 2:
+ u = ((uint32_t)((m->x >> 48) | (m->y << 16)));
+ break;
+ case 3:
+ u = ((uint32_t)(m->y >> 8));
+ break;
+ case 4:
+ u = ((uint32_t)(m->y >> 32));
+ break;
+ case 5:
+ u = ((uint32_t)((m->y >> 56) | (m->z << 8)));
+ break;
+ case 6:
+ u = ((uint32_t)(m->z >> 16));
+ break;
+ case 7:
+ u = ((uint32_t)(m->z >> 40));
+ break;
+ }
+ // The left-right shifts sign-extend from 24-bit to 32-bit integers.
+ return ((int32_t)(u << 8)) >> 8;
+}
+
+// wuffs_base__more_information__metadata_parsed__gama returns inverse gamma
+// correction values (scaled by 100000) like the PNG "gAMA" chunk. For example,
+// for gamma = 2.2, this returns 45455 (approximating 100000 / 2.2).
+static inline uint32_t //
+wuffs_base__more_information__metadata_parsed__gama(
+ const wuffs_base__more_information* m) {
+ return ((uint32_t)(m->x));
+}
+
+#define WUFFS_BASE__SRGB_RENDERING_INTENT__PERCEPTUAL 0
+#define WUFFS_BASE__SRGB_RENDERING_INTENT__RELATIVE_COLORIMETRIC 1
+#define WUFFS_BASE__SRGB_RENDERING_INTENT__SATURATION 2
+#define WUFFS_BASE__SRGB_RENDERING_INTENT__ABSOLUTE_COLORIMETRIC 3
+
+// wuffs_base__more_information__metadata_parsed__srgb returns the sRGB
+// rendering intent like the PNG "sRGB" chunk.
+static inline uint32_t //
+wuffs_base__more_information__metadata_parsed__srgb(
+ const wuffs_base__more_information* m) {
+ return m->x & 3;
+}
+
+#ifdef __cplusplus
+
+inline void //
+wuffs_base__more_information::set(uint32_t flavor_arg,
+ uint32_t w_arg,
+ uint64_t x_arg,
+ uint64_t y_arg,
+ uint64_t z_arg) {
+ wuffs_base__more_information__set(this, flavor_arg, w_arg, x_arg, y_arg,
+ z_arg);
+}
+
+inline uint32_t //
+wuffs_base__more_information::io_redirect__fourcc() const {
+ return wuffs_base__more_information__io_redirect__fourcc(this);
+}
+
+inline wuffs_base__range_ie_u64 //
+wuffs_base__more_information::io_redirect__range() const {
+ return wuffs_base__more_information__io_redirect__range(this);
+}
+
+inline uint64_t //
+wuffs_base__more_information::io_seek__position() const {
+ return wuffs_base__more_information__io_seek__position(this);
+}
+
+inline uint32_t //
+wuffs_base__more_information::metadata__fourcc() const {
+ return wuffs_base__more_information__metadata__fourcc(this);
+}
+
+inline wuffs_base__range_ie_u64 //
+wuffs_base__more_information::metadata__range() const {
+ return wuffs_base__more_information__metadata__range(this);
+}
+
+inline wuffs_base__range_ie_u64 //
+wuffs_base__more_information::metadata_raw_passthrough__range() const {
+ return wuffs_base__more_information__metadata_raw_passthrough__range(this);
+}
+
+inline int32_t //
+wuffs_base__more_information::metadata_parsed__chrm(uint32_t component) const {
+ return wuffs_base__more_information__metadata_parsed__chrm(this, component);
+}
+
+inline uint32_t //
+wuffs_base__more_information::metadata_parsed__gama() const {
+ return wuffs_base__more_information__metadata_parsed__gama(this);
+}
+
+inline uint32_t //
+wuffs_base__more_information::metadata_parsed__srgb() const {
+ return wuffs_base__more_information__metadata_parsed__srgb(this);
+}
+
+#endif // __cplusplus
+
+// ---------------- I/O
+//
+// See (/doc/note/io-input-output.md).
+
+// wuffs_base__io_buffer_meta is the metadata for a wuffs_base__io_buffer's
+// data.
+typedef struct wuffs_base__io_buffer_meta__struct {
+ size_t wi; // Write index. Invariant: wi <= len.
+ size_t ri; // Read index. Invariant: ri <= wi.
+ uint64_t pos; // Buffer position (relative to the start of stream).
+ bool closed; // No further writes are expected.
+} wuffs_base__io_buffer_meta;
+
+// wuffs_base__io_buffer is a 1-dimensional buffer (a pointer and length) plus
+// additional metadata.
+//
+// A value with all fields zero is a valid, empty buffer.
+typedef struct wuffs_base__io_buffer__struct {
+ wuffs_base__slice_u8 data;
+ wuffs_base__io_buffer_meta meta;
+
+#ifdef __cplusplus
+ inline bool is_valid() const;
+ inline void compact();
+ inline size_t reader_length() const;
+ inline uint8_t* reader_pointer() const;
+ inline uint64_t reader_position() const;
+ inline wuffs_base__slice_u8 reader_slice() const;
+ inline size_t writer_length() const;
+ inline uint8_t* writer_pointer() const;
+ inline uint64_t writer_position() const;
+ inline wuffs_base__slice_u8 writer_slice() const;
+
+ // Deprecated: use reader_position.
+ inline uint64_t reader_io_position() const;
+ // Deprecated: use writer_position.
+ inline uint64_t writer_io_position() const;
+#endif // __cplusplus
+
+} wuffs_base__io_buffer;
+
+static inline wuffs_base__io_buffer //
+wuffs_base__make_io_buffer(wuffs_base__slice_u8 data,
+ wuffs_base__io_buffer_meta meta) {
+ wuffs_base__io_buffer ret;
+ ret.data = data;
+ ret.meta = meta;
+ return ret;
+}
+
+static inline wuffs_base__io_buffer_meta //
+wuffs_base__make_io_buffer_meta(size_t wi,
+ size_t ri,
+ uint64_t pos,
+ bool closed) {
+ wuffs_base__io_buffer_meta ret;
+ ret.wi = wi;
+ ret.ri = ri;
+ ret.pos = pos;
+ ret.closed = closed;
+ return ret;
+}
+
+static inline wuffs_base__io_buffer //
+wuffs_base__ptr_u8__reader(uint8_t* ptr, size_t len, bool closed) {
+ wuffs_base__io_buffer ret;
+ ret.data.ptr = ptr;
+ ret.data.len = len;
+ ret.meta.wi = len;
+ ret.meta.ri = 0;
+ ret.meta.pos = 0;
+ ret.meta.closed = closed;
+ return ret;
+}
+
+static inline wuffs_base__io_buffer //
+wuffs_base__ptr_u8__writer(uint8_t* ptr, size_t len) {
+ wuffs_base__io_buffer ret;
+ ret.data.ptr = ptr;
+ ret.data.len = len;
+ ret.meta.wi = 0;
+ ret.meta.ri = 0;
+ ret.meta.pos = 0;
+ ret.meta.closed = false;
+ return ret;
+}
+
+static inline wuffs_base__io_buffer //
+wuffs_base__slice_u8__reader(wuffs_base__slice_u8 s, bool closed) {
+ wuffs_base__io_buffer ret;
+ ret.data.ptr = s.ptr;
+ ret.data.len = s.len;
+ ret.meta.wi = s.len;
+ ret.meta.ri = 0;
+ ret.meta.pos = 0;
+ ret.meta.closed = closed;
+ return ret;
+}
+
+static inline wuffs_base__io_buffer //
+wuffs_base__slice_u8__writer(wuffs_base__slice_u8 s) {
+ wuffs_base__io_buffer ret;
+ ret.data.ptr = s.ptr;
+ ret.data.len = s.len;
+ ret.meta.wi = 0;
+ ret.meta.ri = 0;
+ ret.meta.pos = 0;
+ ret.meta.closed = false;
+ return ret;
+}
+
+static inline wuffs_base__io_buffer //
+wuffs_base__empty_io_buffer() {
+ wuffs_base__io_buffer ret;
+ ret.data.ptr = NULL;
+ ret.data.len = 0;
+ ret.meta.wi = 0;
+ ret.meta.ri = 0;
+ ret.meta.pos = 0;
+ ret.meta.closed = false;
+ return ret;
+}
+
+static inline wuffs_base__io_buffer_meta //
+wuffs_base__empty_io_buffer_meta() {
+ wuffs_base__io_buffer_meta ret;
+ ret.wi = 0;
+ ret.ri = 0;
+ ret.pos = 0;
+ ret.closed = false;
+ return ret;
+}
+
+static inline bool //
+wuffs_base__io_buffer__is_valid(const wuffs_base__io_buffer* buf) {
+ if (buf) {
+ if (buf->data.ptr) {
+ return (buf->meta.ri <= buf->meta.wi) && (buf->meta.wi <= buf->data.len);
+ } else {
+ return (buf->meta.ri == 0) && (buf->meta.wi == 0) && (buf->data.len == 0);
+ }
+ }
+ return false;
+}
+
+// wuffs_base__io_buffer__compact moves any written but unread bytes to the
+// start of the buffer.
+static inline void //
+wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) {
+ if (!buf || (buf->meta.ri == 0)) {
+ return;
+ }
+ buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri);
+ size_t n = buf->meta.wi - buf->meta.ri;
+ if (n != 0) {
+ memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri, n);
+ }
+ buf->meta.wi = n;
+ buf->meta.ri = 0;
+}
+
+// Deprecated. Use wuffs_base__io_buffer__reader_position.
+static inline uint64_t //
+wuffs_base__io_buffer__reader_io_position(const wuffs_base__io_buffer* buf) {
+ return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0;
+}
+
+static inline size_t //
+wuffs_base__io_buffer__reader_length(const wuffs_base__io_buffer* buf) {
+ return buf ? buf->meta.wi - buf->meta.ri : 0;
+}
+
+static inline uint8_t* //
+wuffs_base__io_buffer__reader_pointer(const wuffs_base__io_buffer* buf) {
+ return buf ? (buf->data.ptr + buf->meta.ri) : NULL;
+}
+
+static inline uint64_t //
+wuffs_base__io_buffer__reader_position(const wuffs_base__io_buffer* buf) {
+ return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0;
+}
+
+static inline wuffs_base__slice_u8 //
+wuffs_base__io_buffer__reader_slice(const wuffs_base__io_buffer* buf) {
+ return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri,
+ buf->meta.wi - buf->meta.ri)
+ : wuffs_base__empty_slice_u8();
+}
+
+// Deprecated. Use wuffs_base__io_buffer__writer_position.
+static inline uint64_t //
+wuffs_base__io_buffer__writer_io_position(const wuffs_base__io_buffer* buf) {
+ return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0;
+}
+
+static inline size_t //
+wuffs_base__io_buffer__writer_length(const wuffs_base__io_buffer* buf) {
+ return buf ? buf->data.len - buf->meta.wi : 0;
+}
+
+static inline uint8_t* //
+wuffs_base__io_buffer__writer_pointer(const wuffs_base__io_buffer* buf) {
+ return buf ? (buf->data.ptr + buf->meta.wi) : NULL;
+}
+
+static inline uint64_t //
+wuffs_base__io_buffer__writer_position(const wuffs_base__io_buffer* buf) {
+ return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0;
+}
+
+static inline wuffs_base__slice_u8 //
+wuffs_base__io_buffer__writer_slice(const wuffs_base__io_buffer* buf) {
+ return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi,
+ buf->data.len - buf->meta.wi)
+ : wuffs_base__empty_slice_u8();
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__io_buffer::is_valid() const {
+ return wuffs_base__io_buffer__is_valid(this);
+}
+
+inline void //
+wuffs_base__io_buffer::compact() {
+ wuffs_base__io_buffer__compact(this);
+}
+
+inline uint64_t //
+wuffs_base__io_buffer::reader_io_position() const {
+ return wuffs_base__io_buffer__reader_io_position(this);
+}
+
+inline size_t //
+wuffs_base__io_buffer::reader_length() const {
+ return wuffs_base__io_buffer__reader_length(this);
+}
+
+inline uint8_t* //
+wuffs_base__io_buffer::reader_pointer() const {
+ return wuffs_base__io_buffer__reader_pointer(this);
+}
+
+inline uint64_t //
+wuffs_base__io_buffer::reader_position() const {
+ return wuffs_base__io_buffer__reader_position(this);
+}
+
+inline wuffs_base__slice_u8 //
+wuffs_base__io_buffer::reader_slice() const {
+ return wuffs_base__io_buffer__reader_slice(this);
+}
+
+inline uint64_t //
+wuffs_base__io_buffer::writer_io_position() const {
+ return wuffs_base__io_buffer__writer_io_position(this);
+}
+
+inline size_t //
+wuffs_base__io_buffer::writer_length() const {
+ return wuffs_base__io_buffer__writer_length(this);
+}
+
+inline uint8_t* //
+wuffs_base__io_buffer::writer_pointer() const {
+ return wuffs_base__io_buffer__writer_pointer(this);
+}
+
+inline uint64_t //
+wuffs_base__io_buffer::writer_position() const {
+ return wuffs_base__io_buffer__writer_position(this);
+}
+
+inline wuffs_base__slice_u8 //
+wuffs_base__io_buffer::writer_slice() const {
+ return wuffs_base__io_buffer__writer_slice(this);
+}
+
+#endif // __cplusplus
+
+// ---------------- Tokens
+
+// wuffs_base__token is an element of a byte stream's tokenization.
+//
+// See https://github.com/google/wuffs/blob/main/doc/note/tokens.md
+typedef struct wuffs_base__token__struct {
+ uint64_t repr;
+
+#ifdef __cplusplus
+ inline int64_t value() const;
+ inline int64_t value_extension() const;
+ inline int64_t value_major() const;
+ inline int64_t value_base_category() const;
+ inline uint64_t value_minor() const;
+ inline uint64_t value_base_detail() const;
+ inline int64_t value_base_detail__sign_extended() const;
+ inline bool continued() const;
+ inline uint64_t length() const;
+#endif // __cplusplus
+
+} wuffs_base__token;
+
+static inline wuffs_base__token //
+wuffs_base__make_token(uint64_t repr) {
+ wuffs_base__token ret;
+ ret.repr = repr;
+ return ret;
+}
+
+// --------
+
+#define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF
+
+#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17
+#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17
+#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42
+#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17
+#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38
+#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17
+#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16
+#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0
+
+#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS 46
+
+// --------
+
+#define WUFFS_BASE__TOKEN__VBC__FILLER 0
+#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1
+#define WUFFS_BASE__TOKEN__VBC__STRING 2
+#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3
+#define WUFFS_BASE__TOKEN__VBC__LITERAL 4
+#define WUFFS_BASE__TOKEN__VBC__NUMBER 5
+#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED 6
+#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED 7
+
+// --------
+
+#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION 0x00001
+#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_BLOCK 0x00002
+#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE 0x00004
+
+// COMMENT_ANY is a bit-wise or of COMMENT_BLOCK AND COMMENT_LINE.
+#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY 0x00006
+
+// --------
+
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE 0x00010
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST 0x00020
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT 0x00040
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000
+
+// --------
+
+// DEFINITELY_FOO means that the destination bytes (and also the source bytes,
+// for 1_DST_1_SRC_COPY) are in the FOO format. Definitely means that the lack
+// of the bit means "maybe FOO". It does not necessarily mean "not FOO".
+//
+// CHAIN_ETC means that decoding the entire token chain forms a UTF-8 or ASCII
+// string, not just this current token. CHAIN_ETC_UTF_8 therefore distinguishes
+// Unicode (UTF-8) strings from byte strings. MUST means that the the token
+// producer (e.g. parser) must verify this. SHOULD means that the token
+// consumer (e.g. renderer) should verify this.
+//
+// When a CHAIN_ETC_UTF_8 bit is set, the parser must ensure that non-ASCII
+// code points (with multi-byte UTF-8 encodings) do not straddle token
+// boundaries. Checking UTF-8 validity can inspect each token separately.
+//
+// The lack of any particular bit is conservative: it is valid for all-ASCII
+// strings, in a single- or multi-token chain, to have none of these bits set.
+#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001
+#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 0x00002
+#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_UTF_8 0x00004
+#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00010
+#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII 0x00020
+#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_ASCII 0x00040
+
+// CONVERT_D_DST_S_SRC means that multiples of S source bytes (possibly padded)
+// produces multiples of D destination bytes. For example,
+// CONVERT_1_DST_4_SRC_BACKSLASH_X means a source like "\\x23\\x67\\xAB", where
+// 12 src bytes encode 3 dst bytes.
+//
+// Post-processing may further transform those D destination bytes (e.g. treat
+// "\\xFF" as the Unicode code point U+00FF instead of the byte 0xFF), but that
+// is out of scope of this VBD's semantics.
+//
+// When src is the empty string, multiple conversion algorithms are applicable
+// (so these bits are not necessarily mutually exclusive), all producing the
+// same empty dst string.
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00100
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00200
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00400
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00800
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x01000
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x02000
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x04000
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_HEX 0x08000
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_STD 0x10000
+
+// --------
+
+#define WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED 0x00001
+#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002
+#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004
+#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008
+
+// --------
+
+// For a source string of "123" or "0x9A", it is valid for a tokenizer to
+// return any combination of:
+// - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT.
+// - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED.
+// - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED.
+//
+// For a source string of "+123" or "-0x9A", only the first two are valid.
+//
+// For a source string of "123.", only the first one is valid.
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT 0x00001
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED 0x00002
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED 0x00004
+
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF 0x00010
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF 0x00020
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN 0x00040
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN 0x00080
+
+// The number 300 might be represented as "\x01\x2C", "\x2C\x01\x00\x00" or
+// "300", which are big-endian, little-endian or text. For binary formats, the
+// token length (after adjusting for FORMAT_IGNORE_ETC) discriminates
+// e.g. u16 little-endian vs u32 little-endian.
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_LITTLE_ENDIAN 0x00200
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400
+
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE 0x01000
+
+// --------
+
+// wuffs_base__token__value returns the token's high 46 bits, sign-extended. A
+// negative value means an extended token, non-negative means a simple token.
+static inline int64_t //
+wuffs_base__token__value(const wuffs_base__token* t) {
+ return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE__SHIFT;
+}
+
+// wuffs_base__token__value_extension returns a negative value if the token was
+// not an extended token.
+static inline int64_t //
+wuffs_base__token__value_extension(const wuffs_base__token* t) {
+ return (~(int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT;
+}
+
+// wuffs_base__token__value_major returns a negative value if the token was not
+// a simple token.
+static inline int64_t //
+wuffs_base__token__value_major(const wuffs_base__token* t) {
+ return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT;
+}
+
+// wuffs_base__token__value_base_category returns a negative value if the token
+// was not a simple token.
+static inline int64_t //
+wuffs_base__token__value_base_category(const wuffs_base__token* t) {
+ return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT;
+}
+
+static inline uint64_t //
+wuffs_base__token__value_minor(const wuffs_base__token* t) {
+ return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0x1FFFFFF;
+}
+
+static inline uint64_t //
+wuffs_base__token__value_base_detail(const wuffs_base__token* t) {
+ return (t->repr >> WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT) & 0x1FFFFF;
+}
+
+static inline int64_t //
+wuffs_base__token__value_base_detail__sign_extended(
+ const wuffs_base__token* t) {
+ // The VBD is 21 bits in the middle of t->repr. Left shift the high (64 - 21
+ // - ETC__SHIFT) bits off, then right shift (sign-extending) back down.
+ uint64_t u = t->repr << (43 - WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT);
+ return ((int64_t)u) >> 43;
+}
+
+static inline bool //
+wuffs_base__token__continued(const wuffs_base__token* t) {
+ return t->repr & 0x10000;
+}
+
+static inline uint64_t //
+wuffs_base__token__length(const wuffs_base__token* t) {
+ return (t->repr >> WUFFS_BASE__TOKEN__LENGTH__SHIFT) & 0xFFFF;
+}
+
+#ifdef __cplusplus
+
+inline int64_t //
+wuffs_base__token::value() const {
+ return wuffs_base__token__value(this);
+}
+
+inline int64_t //
+wuffs_base__token::value_extension() const {
+ return wuffs_base__token__value_extension(this);
+}
+
+inline int64_t //
+wuffs_base__token::value_major() const {
+ return wuffs_base__token__value_major(this);
+}
+
+inline int64_t //
+wuffs_base__token::value_base_category() const {
+ return wuffs_base__token__value_base_category(this);
+}
+
+inline uint64_t //
+wuffs_base__token::value_minor() const {
+ return wuffs_base__token__value_minor(this);
+}
+
+inline uint64_t //
+wuffs_base__token::value_base_detail() const {
+ return wuffs_base__token__value_base_detail(this);
+}
+
+inline int64_t //
+wuffs_base__token::value_base_detail__sign_extended() const {
+ return wuffs_base__token__value_base_detail__sign_extended(this);
+}
+
+inline bool //
+wuffs_base__token::continued() const {
+ return wuffs_base__token__continued(this);
+}
+
+inline uint64_t //
+wuffs_base__token::length() const {
+ return wuffs_base__token__length(this);
+}
+
+#endif // __cplusplus
+
+// --------
+
+typedef WUFFS_BASE__SLICE(wuffs_base__token) wuffs_base__slice_token;
+
+static inline wuffs_base__slice_token //
+wuffs_base__make_slice_token(wuffs_base__token* ptr, size_t len) {
+ wuffs_base__slice_token ret;
+ ret.ptr = ptr;
+ ret.len = len;
+ return ret;
+}
+
+static inline wuffs_base__slice_token //
+wuffs_base__empty_slice_token() {
+ wuffs_base__slice_token ret;
+ ret.ptr = NULL;
+ ret.len = 0;
+ return ret;
+}
+
+// --------
+
+// wuffs_base__token_buffer_meta is the metadata for a
+// wuffs_base__token_buffer's data.
+typedef struct wuffs_base__token_buffer_meta__struct {
+ size_t wi; // Write index. Invariant: wi <= len.
+ size_t ri; // Read index. Invariant: ri <= wi.
+ uint64_t pos; // Position of the buffer start relative to the stream start.
+ bool closed; // No further writes are expected.
+} wuffs_base__token_buffer_meta;
+
+// wuffs_base__token_buffer is a 1-dimensional buffer (a pointer and length)
+// plus additional metadata.
+//
+// A value with all fields zero is a valid, empty buffer.
+typedef struct wuffs_base__token_buffer__struct {
+ wuffs_base__slice_token data;
+ wuffs_base__token_buffer_meta meta;
+
+#ifdef __cplusplus
+ inline bool is_valid() const;
+ inline void compact();
+ inline uint64_t reader_length() const;
+ inline wuffs_base__token* reader_pointer() const;
+ inline wuffs_base__slice_token reader_slice() const;
+ inline uint64_t reader_token_position() const;
+ inline uint64_t writer_length() const;
+ inline uint64_t writer_token_position() const;
+ inline wuffs_base__token* writer_pointer() const;
+ inline wuffs_base__slice_token writer_slice() const;
+#endif // __cplusplus
+
+} wuffs_base__token_buffer;
+
+static inline wuffs_base__token_buffer //
+wuffs_base__make_token_buffer(wuffs_base__slice_token data,
+ wuffs_base__token_buffer_meta meta) {
+ wuffs_base__token_buffer ret;
+ ret.data = data;
+ ret.meta = meta;
+ return ret;
+}
+
+static inline wuffs_base__token_buffer_meta //
+wuffs_base__make_token_buffer_meta(size_t wi,
+ size_t ri,
+ uint64_t pos,
+ bool closed) {
+ wuffs_base__token_buffer_meta ret;
+ ret.wi = wi;
+ ret.ri = ri;
+ ret.pos = pos;
+ ret.closed = closed;
+ return ret;
+}
+
+static inline wuffs_base__token_buffer //
+wuffs_base__slice_token__reader(wuffs_base__slice_token s, bool closed) {
+ wuffs_base__token_buffer ret;
+ ret.data.ptr = s.ptr;
+ ret.data.len = s.len;
+ ret.meta.wi = s.len;
+ ret.meta.ri = 0;
+ ret.meta.pos = 0;
+ ret.meta.closed = closed;
+ return ret;
+}
+
+static inline wuffs_base__token_buffer //
+wuffs_base__slice_token__writer(wuffs_base__slice_token s) {
+ wuffs_base__token_buffer ret;
+ ret.data.ptr = s.ptr;
+ ret.data.len = s.len;
+ ret.meta.wi = 0;
+ ret.meta.ri = 0;
+ ret.meta.pos = 0;
+ ret.meta.closed = false;
+ return ret;
+}
+
+static inline wuffs_base__token_buffer //
+wuffs_base__empty_token_buffer() {
+ wuffs_base__token_buffer ret;
+ ret.data.ptr = NULL;
+ ret.data.len = 0;
+ ret.meta.wi = 0;
+ ret.meta.ri = 0;
+ ret.meta.pos = 0;
+ ret.meta.closed = false;
+ return ret;
+}
+
+static inline wuffs_base__token_buffer_meta //
+wuffs_base__empty_token_buffer_meta() {
+ wuffs_base__token_buffer_meta ret;
+ ret.wi = 0;
+ ret.ri = 0;
+ ret.pos = 0;
+ ret.closed = false;
+ return ret;
+}
+
+static inline bool //
+wuffs_base__token_buffer__is_valid(const wuffs_base__token_buffer* buf) {
+ if (buf) {
+ if (buf->data.ptr) {
+ return (buf->meta.ri <= buf->meta.wi) && (buf->meta.wi <= buf->data.len);
+ } else {
+ return (buf->meta.ri == 0) && (buf->meta.wi == 0) && (buf->data.len == 0);
+ }
+ }
+ return false;
+}
+
+// wuffs_base__token_buffer__compact moves any written but unread tokens to the
+// start of the buffer.
+static inline void //
+wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) {
+ if (!buf || (buf->meta.ri == 0)) {
+ return;
+ }
+ buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri);
+ size_t n = buf->meta.wi - buf->meta.ri;
+ if (n != 0) {
+ memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri,
+ n * sizeof(wuffs_base__token));
+ }
+ buf->meta.wi = n;
+ buf->meta.ri = 0;
+}
+
+static inline uint64_t //
+wuffs_base__token_buffer__reader_length(const wuffs_base__token_buffer* buf) {
+ return buf ? buf->meta.wi - buf->meta.ri : 0;
+}
+
+static inline wuffs_base__token* //
+wuffs_base__token_buffer__reader_pointer(const wuffs_base__token_buffer* buf) {
+ return buf ? (buf->data.ptr + buf->meta.ri) : NULL;
+}
+
+static inline wuffs_base__slice_token //
+wuffs_base__token_buffer__reader_slice(const wuffs_base__token_buffer* buf) {
+ return buf ? wuffs_base__make_slice_token(buf->data.ptr + buf->meta.ri,
+ buf->meta.wi - buf->meta.ri)
+ : wuffs_base__empty_slice_token();
+}
+
+static inline uint64_t //
+wuffs_base__token_buffer__reader_token_position(
+ const wuffs_base__token_buffer* buf) {
+ return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0;
+}
+
+static inline uint64_t //
+wuffs_base__token_buffer__writer_length(const wuffs_base__token_buffer* buf) {
+ return buf ? buf->data.len - buf->meta.wi : 0;
+}
+
+static inline wuffs_base__token* //
+wuffs_base__token_buffer__writer_pointer(const wuffs_base__token_buffer* buf) {
+ return buf ? (buf->data.ptr + buf->meta.wi) : NULL;
+}
+
+static inline wuffs_base__slice_token //
+wuffs_base__token_buffer__writer_slice(const wuffs_base__token_buffer* buf) {
+ return buf ? wuffs_base__make_slice_token(buf->data.ptr + buf->meta.wi,
+ buf->data.len - buf->meta.wi)
+ : wuffs_base__empty_slice_token();
+}
+
+static inline uint64_t //
+wuffs_base__token_buffer__writer_token_position(
+ const wuffs_base__token_buffer* buf) {
+ return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0;
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__token_buffer::is_valid() const {
+ return wuffs_base__token_buffer__is_valid(this);
+}
+
+inline void //
+wuffs_base__token_buffer::compact() {
+ wuffs_base__token_buffer__compact(this);
+}
+
+inline uint64_t //
+wuffs_base__token_buffer::reader_length() const {
+ return wuffs_base__token_buffer__reader_length(this);
+}
+
+inline wuffs_base__token* //
+wuffs_base__token_buffer::reader_pointer() const {
+ return wuffs_base__token_buffer__reader_pointer(this);
+}
+
+inline wuffs_base__slice_token //
+wuffs_base__token_buffer::reader_slice() const {
+ return wuffs_base__token_buffer__reader_slice(this);
+}
+
+inline uint64_t //
+wuffs_base__token_buffer::reader_token_position() const {
+ return wuffs_base__token_buffer__reader_token_position(this);
+}
+
+inline uint64_t //
+wuffs_base__token_buffer::writer_length() const {
+ return wuffs_base__token_buffer__writer_length(this);
+}
+
+inline wuffs_base__token* //
+wuffs_base__token_buffer::writer_pointer() const {
+ return wuffs_base__token_buffer__writer_pointer(this);
+}
+
+inline wuffs_base__slice_token //
+wuffs_base__token_buffer::writer_slice() const {
+ return wuffs_base__token_buffer__writer_slice(this);
+}
+
+inline uint64_t //
+wuffs_base__token_buffer::writer_token_position() const {
+ return wuffs_base__token_buffer__writer_token_position(this);
+}
+
+#endif // __cplusplus
+
+// ---------------- Memory Allocation
+
+// The memory allocation related functions in this section aren't used by Wuffs
+// per se, but they may be helpful to the code that uses Wuffs.
+
+// wuffs_base__malloc_slice_uxx wraps calling a malloc-like function, except
+// that it takes a uint64_t number of elements instead of a size_t size in
+// bytes, and it returns a slice (a pointer and a length) instead of just a
+// pointer.
+//
+// You can pass the C stdlib's malloc as the malloc_func.
+//
+// It returns an empty slice (containing a NULL ptr field) if (num_uxx *
+// sizeof(uintxx_t)) would overflow SIZE_MAX.
+
+static inline wuffs_base__slice_u8 //
+wuffs_base__malloc_slice_u8(void* (*malloc_func)(size_t), uint64_t num_u8) {
+ if (malloc_func && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) {
+ void* p = (*malloc_func)((size_t)(num_u8 * sizeof(uint8_t)));
+ if (p) {
+ return wuffs_base__make_slice_u8((uint8_t*)(p), (size_t)num_u8);
+ }
+ }
+ return wuffs_base__make_slice_u8(NULL, 0);
+}
+
+static inline wuffs_base__slice_u16 //
+wuffs_base__malloc_slice_u16(void* (*malloc_func)(size_t), uint64_t num_u16) {
+ if (malloc_func && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) {
+ void* p = (*malloc_func)((size_t)(num_u16 * sizeof(uint16_t)));
+ if (p) {
+ return wuffs_base__make_slice_u16((uint16_t*)(p), (size_t)num_u16);
+ }
+ }
+ return wuffs_base__make_slice_u16(NULL, 0);
+}
+
+static inline wuffs_base__slice_u32 //
+wuffs_base__malloc_slice_u32(void* (*malloc_func)(size_t), uint64_t num_u32) {
+ if (malloc_func && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) {
+ void* p = (*malloc_func)((size_t)(num_u32 * sizeof(uint32_t)));
+ if (p) {
+ return wuffs_base__make_slice_u32((uint32_t*)(p), (size_t)num_u32);
+ }
+ }
+ return wuffs_base__make_slice_u32(NULL, 0);
+}
+
+static inline wuffs_base__slice_u64 //
+wuffs_base__malloc_slice_u64(void* (*malloc_func)(size_t), uint64_t num_u64) {
+ if (malloc_func && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) {
+ void* p = (*malloc_func)((size_t)(num_u64 * sizeof(uint64_t)));
+ if (p) {
+ return wuffs_base__make_slice_u64((uint64_t*)(p), (size_t)num_u64);
+ }
+ }
+ return wuffs_base__make_slice_u64(NULL, 0);
+}
+
+// ---------------- Images
+
+// wuffs_base__color_u32_argb_premul is an 8 bit per channel premultiplied
+// Alpha, Red, Green, Blue color, as a uint32_t value. Its value is always
+// 0xAARRGGBB (Alpha most significant, Blue least), regardless of endianness.
+typedef uint32_t wuffs_base__color_u32_argb_premul;
+
+// wuffs_base__color_u32_argb_premul__is_valid returns whether c's Red, Green
+// and Blue channels are all less than or equal to its Alpha channel. c uses
+// premultiplied alpha, so 50% opaque 100% saturated red is 0x7F7F_0000 and a
+// value like 0x7F80_0000 is invalid.
+static inline bool //
+wuffs_base__color_u32_argb_premul__is_valid(
+ wuffs_base__color_u32_argb_premul c) {
+ uint32_t a = 0xFF & (c >> 24);
+ uint32_t r = 0xFF & (c >> 16);
+ uint32_t g = 0xFF & (c >> 8);
+ uint32_t b = 0xFF & (c >> 0);
+ return (a >= r) && (a >= g) && (a >= b);
+}
+
+static inline uint16_t //
+wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
+ wuffs_base__color_u32_argb_premul c) {
+ uint32_t r5 = 0xF800 & (c >> 8);
+ uint32_t g6 = 0x07E0 & (c >> 5);
+ uint32_t b5 = 0x001F & (c >> 3);
+ return (uint16_t)(r5 | g6 | b5);
+}
+
+static inline wuffs_base__color_u32_argb_premul //
+wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(uint16_t rgb_565) {
+ uint32_t b5 = 0x1F & (rgb_565 >> 0);
+ uint32_t b = (b5 << 3) | (b5 >> 2);
+ uint32_t g6 = 0x3F & (rgb_565 >> 5);
+ uint32_t g = (g6 << 2) | (g6 >> 4);
+ uint32_t r5 = 0x1F & (rgb_565 >> 11);
+ uint32_t r = (r5 << 3) | (r5 >> 2);
+ return 0xFF000000 | (r << 16) | (g << 8) | (b << 0);
+}
+
+static inline uint8_t //
+wuffs_base__color_u32_argb_premul__as__color_u8_gray(
+ wuffs_base__color_u32_argb_premul c) {
+ // Work in 16-bit color.
+ uint32_t cr = 0x101 * (0xFF & (c >> 16));
+ uint32_t cg = 0x101 * (0xFF & (c >> 8));
+ uint32_t cb = 0x101 * (0xFF & (c >> 0));
+
+ // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
+ // as those given by the JFIF specification.
+ //
+ // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We
+ // shift by 24, not just by 16, because the return value is 8-bit color, not
+ // 16-bit color.
+ uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
+ return (uint8_t)(weighted_average >> 24);
+}
+
+static inline uint16_t //
+wuffs_base__color_u32_argb_premul__as__color_u16_gray(
+ wuffs_base__color_u32_argb_premul c) {
+ // Work in 16-bit color.
+ uint32_t cr = 0x101 * (0xFF & (c >> 16));
+ uint32_t cg = 0x101 * (0xFF & (c >> 8));
+ uint32_t cb = 0x101 * (0xFF & (c >> 0));
+
+ // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
+ // as those given by the JFIF specification.
+ //
+ // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16).
+ uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
+ return (uint16_t)(weighted_average >> 16);
+}
+
+// wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul converts
+// from non-premultiplied alpha to premultiplied alpha.
+static inline wuffs_base__color_u32_argb_premul //
+wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
+ uint32_t argb_nonpremul) {
+ // Multiplying by 0x101 (twice, once for alpha and once for color) converts
+ // from 8-bit to 16-bit color. Shifting right by 8 undoes that.
+ //
+ // Working in the higher bit depth can produce slightly different (and
+ // arguably slightly more accurate) results. For example, given 8-bit blue
+ // and alpha of 0x80 and 0x81:
+ //
+ // - ((0x80 * 0x81 ) / 0xFF ) = 0x40 = 0x40
+ // - ((0x8080 * 0x8181) / 0xFFFF) >> 8 = 0x4101 >> 8 = 0x41
+ uint32_t a = 0xFF & (argb_nonpremul >> 24);
+ uint32_t a16 = a * (0x101 * 0x101);
+
+ uint32_t r = 0xFF & (argb_nonpremul >> 16);
+ r = ((r * a16) / 0xFFFF) >> 8;
+ uint32_t g = 0xFF & (argb_nonpremul >> 8);
+ g = ((g * a16) / 0xFFFF) >> 8;
+ uint32_t b = 0xFF & (argb_nonpremul >> 0);
+ b = ((b * a16) / 0xFFFF) >> 8;
+
+ return (a << 24) | (r << 16) | (g << 8) | (b << 0);
+}
+
+// wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul converts
+// from premultiplied alpha to non-premultiplied alpha.
+static inline uint32_t //
+wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
+ wuffs_base__color_u32_argb_premul c) {
+ uint32_t a = 0xFF & (c >> 24);
+ if (a == 0xFF) {
+ return c;
+ } else if (a == 0) {
+ return 0;
+ }
+ uint32_t a16 = a * 0x101;
+
+ uint32_t r = 0xFF & (c >> 16);
+ r = ((r * (0x101 * 0xFFFF)) / a16) >> 8;
+ uint32_t g = 0xFF & (c >> 8);
+ g = ((g * (0x101 * 0xFFFF)) / a16) >> 8;
+ uint32_t b = 0xFF & (c >> 0);
+ b = ((b * (0x101 * 0xFFFF)) / a16) >> 8;
+
+ return (a << 24) | (r << 16) | (g << 8) | (b << 0);
+}
+
+// wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul converts
+// from 4x16LE non-premultiplied alpha to 4x8 premultiplied alpha.
+static inline wuffs_base__color_u32_argb_premul //
+wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
+ uint64_t argb_nonpremul) {
+ uint32_t a16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 48)));
+
+ uint32_t r16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 32)));
+ r16 = (r16 * a16) / 0xFFFF;
+ uint32_t g16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 16)));
+ g16 = (g16 * a16) / 0xFFFF;
+ uint32_t b16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 0)));
+ b16 = (b16 * a16) / 0xFFFF;
+
+ return ((a16 >> 8) << 24) | ((r16 >> 8) << 16) | ((g16 >> 8) << 8) |
+ ((b16 >> 8) << 0);
+}
+
+// wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul converts
+// from 4x8 premultiplied alpha to 4x16LE non-premultiplied alpha.
+static inline uint64_t //
+wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
+ wuffs_base__color_u32_argb_premul c) {
+ uint32_t a = 0xFF & (c >> 24);
+ if (a == 0xFF) {
+ uint64_t r16 = 0x101 * (0xFF & (c >> 16));
+ uint64_t g16 = 0x101 * (0xFF & (c >> 8));
+ uint64_t b16 = 0x101 * (0xFF & (c >> 0));
+ return 0xFFFF000000000000u | (r16 << 32) | (g16 << 16) | (b16 << 0);
+ } else if (a == 0) {
+ return 0;
+ }
+ uint64_t a16 = a * 0x101;
+
+ uint64_t r = 0xFF & (c >> 16);
+ uint64_t r16 = (r * (0x101 * 0xFFFF)) / a16;
+ uint64_t g = 0xFF & (c >> 8);
+ uint64_t g16 = (g * (0x101 * 0xFFFF)) / a16;
+ uint64_t b = 0xFF & (c >> 0);
+ uint64_t b16 = (b * (0x101 * 0xFFFF)) / a16;
+
+ return (a16 << 48) | (r16 << 32) | (g16 << 16) | (b16 << 0);
+}
+
+static inline uint64_t //
+wuffs_base__color_u32__as__color_u64(uint32_t c) {
+ uint64_t a16 = 0x101 * (0xFF & (c >> 24));
+ uint64_t r16 = 0x101 * (0xFF & (c >> 16));
+ uint64_t g16 = 0x101 * (0xFF & (c >> 8));
+ uint64_t b16 = 0x101 * (0xFF & (c >> 0));
+ return (a16 << 48) | (r16 << 32) | (g16 << 16) | (b16 << 0);
+}
+
+static inline uint32_t //
+wuffs_base__color_u64__as__color_u32(uint64_t c) {
+ uint32_t a = ((uint32_t)(0xFF & (c >> 56)));
+ uint32_t r = ((uint32_t)(0xFF & (c >> 40)));
+ uint32_t g = ((uint32_t)(0xFF & (c >> 24)));
+ uint32_t b = ((uint32_t)(0xFF & (c >> 8)));
+ return (a << 24) | (r << 16) | (g << 8) | (b << 0);
+}
+
+// --------
+
+typedef uint8_t wuffs_base__pixel_blend;
+
+// wuffs_base__pixel_blend encodes how to blend source and destination pixels,
+// accounting for transparency. It encompasses the Porter-Duff compositing
+// operators as well as the other blending modes defined by PDF.
+//
+// TODO: implement the other modes.
+#define WUFFS_BASE__PIXEL_BLEND__SRC ((wuffs_base__pixel_blend)0)
+#define WUFFS_BASE__PIXEL_BLEND__SRC_OVER ((wuffs_base__pixel_blend)1)
+
+// --------
+
+// wuffs_base__pixel_alpha_transparency is a pixel format's alpha channel
+// model. It is a property of the pixel format in general, not of a specific
+// pixel. An RGBA pixel format (with alpha) can still have fully opaque pixels.
+typedef uint32_t wuffs_base__pixel_alpha_transparency;
+
+#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE 0
+#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__NONPREMULTIPLIED_ALPHA 1
+#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__PREMULTIPLIED_ALPHA 2
+#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__BINARY_ALPHA 3
+
+// Deprecated: use WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__NONPREMULTIPLIED_ALPHA
+// instead.
+#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__NON_PREMULTIPLIED_ALPHA 1
+
+// --------
+
+#define WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX 4
+
+#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__INDEX_PLANE 0
+#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE 3
+
+// A palette is 256 entries × 4 bytes per entry (e.g. BGRA).
+#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH 1024
+
+// wuffs_base__pixel_format encodes the format of the bytes that constitute an
+// image frame's pixel data.
+//
+// See https://github.com/google/wuffs/blob/main/doc/note/pixel-formats.md
+//
+// Do not manipulate its bits directly; they are private implementation
+// details. Use methods such as wuffs_base__pixel_format__num_planes instead.
+typedef struct wuffs_base__pixel_format__struct {
+ uint32_t repr;
+
+#ifdef __cplusplus
+ inline bool is_valid() const;
+ inline uint32_t bits_per_pixel() const;
+ inline bool is_direct() const;
+ inline bool is_indexed() const;
+ inline bool is_interleaved() const;
+ inline bool is_planar() const;
+ inline uint32_t num_planes() const;
+ inline wuffs_base__pixel_alpha_transparency transparency() const;
+#endif // __cplusplus
+
+} wuffs_base__pixel_format;
+
+static inline wuffs_base__pixel_format //
+wuffs_base__make_pixel_format(uint32_t repr) {
+ wuffs_base__pixel_format f;
+ f.repr = repr;
+ return f;
+}
+
+// Common 8-bit-depth pixel formats. This list is not exhaustive; not all valid
+// wuffs_base__pixel_format values are present.
+
+#define WUFFS_BASE__PIXEL_FORMAT__INVALID 0x00000000
+
+#define WUFFS_BASE__PIXEL_FORMAT__A 0x02000008
+
+#define WUFFS_BASE__PIXEL_FORMAT__Y 0x20000008
+#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE 0x2000000B
+#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE 0x2010000B
+#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL 0x21000008
+#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL 0x22000008
+
+#define WUFFS_BASE__PIXEL_FORMAT__YCBCR 0x40020888
+#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL 0x41038888
+#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK 0x50038888
+
+#define WUFFS_BASE__PIXEL_FORMAT__YCOCG 0x60020888
+#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL 0x61038888
+#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK 0x70038888
+
+#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL 0x81040008
+#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL 0x82040008
+#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY 0x83040008
+
+#define WUFFS_BASE__PIXEL_FORMAT__BGR_565 0x80000565
+#define WUFFS_BASE__PIXEL_FORMAT__BGR 0x80000888
+#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL 0x81008888
+#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE 0x8100BBBB
+#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL 0x82008888
+#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE 0x8200BBBB
+#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY 0x83008888
+#define WUFFS_BASE__PIXEL_FORMAT__BGRX 0x90008888
+
+#define WUFFS_BASE__PIXEL_FORMAT__RGB 0xA0000888
+#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL 0xA1008888
+#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE 0xA100BBBB
+#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL 0xA2008888
+#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE 0xA200BBBB
+#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY 0xA3008888
+#define WUFFS_BASE__PIXEL_FORMAT__RGBX 0xB0008888
+
+#define WUFFS_BASE__PIXEL_FORMAT__CMY 0xC0020888
+#define WUFFS_BASE__PIXEL_FORMAT__CMYK 0xD0038888
+
+extern const uint32_t wuffs_base__pixel_format__bits_per_channel[16];
+
+static inline bool //
+wuffs_base__pixel_format__is_valid(const wuffs_base__pixel_format* f) {
+ return f->repr != 0;
+}
+
+// wuffs_base__pixel_format__bits_per_pixel returns the number of bits per
+// pixel for interleaved pixel formats, and returns 0 for planar pixel formats.
+static inline uint32_t //
+wuffs_base__pixel_format__bits_per_pixel(const wuffs_base__pixel_format* f) {
+ if (((f->repr >> 16) & 0x03) != 0) {
+ return 0;
+ }
+ return wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 0)] +
+ wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 4)] +
+ wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 8)] +
+ wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 12)];
+}
+
+static inline bool //
+wuffs_base__pixel_format__is_direct(const wuffs_base__pixel_format* f) {
+ return ((f->repr >> 18) & 0x01) == 0;
+}
+
+static inline bool //
+wuffs_base__pixel_format__is_indexed(const wuffs_base__pixel_format* f) {
+ return ((f->repr >> 18) & 0x01) != 0;
+}
+
+static inline bool //
+wuffs_base__pixel_format__is_interleaved(const wuffs_base__pixel_format* f) {
+ return ((f->repr >> 16) & 0x03) == 0;
+}
+
+static inline bool //
+wuffs_base__pixel_format__is_planar(const wuffs_base__pixel_format* f) {
+ return ((f->repr >> 16) & 0x03) != 0;
+}
+
+static inline uint32_t //
+wuffs_base__pixel_format__num_planes(const wuffs_base__pixel_format* f) {
+ return ((f->repr >> 16) & 0x03) + 1;
+}
+
+static inline wuffs_base__pixel_alpha_transparency //
+wuffs_base__pixel_format__transparency(const wuffs_base__pixel_format* f) {
+ return (wuffs_base__pixel_alpha_transparency)((f->repr >> 24) & 0x03);
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__pixel_format::is_valid() const {
+ return wuffs_base__pixel_format__is_valid(this);
+}
+
+inline uint32_t //
+wuffs_base__pixel_format::bits_per_pixel() const {
+ return wuffs_base__pixel_format__bits_per_pixel(this);
+}
+
+inline bool //
+wuffs_base__pixel_format::is_direct() const {
+ return wuffs_base__pixel_format__is_direct(this);
+}
+
+inline bool //
+wuffs_base__pixel_format::is_indexed() const {
+ return wuffs_base__pixel_format__is_indexed(this);
+}
+
+inline bool //
+wuffs_base__pixel_format::is_interleaved() const {
+ return wuffs_base__pixel_format__is_interleaved(this);
+}
+
+inline bool //
+wuffs_base__pixel_format::is_planar() const {
+ return wuffs_base__pixel_format__is_planar(this);
+}
+
+inline uint32_t //
+wuffs_base__pixel_format::num_planes() const {
+ return wuffs_base__pixel_format__num_planes(this);
+}
+
+inline wuffs_base__pixel_alpha_transparency //
+wuffs_base__pixel_format::transparency() const {
+ return wuffs_base__pixel_format__transparency(this);
+}
+
+#endif // __cplusplus
+
+// --------
+
+// wuffs_base__pixel_subsampling encodes whether sample values cover one pixel
+// or cover multiple pixels.
+//
+// See https://github.com/google/wuffs/blob/main/doc/note/pixel-subsampling.md
+//
+// Do not manipulate its bits directly; they are private implementation
+// details. Use methods such as wuffs_base__pixel_subsampling__bias_x instead.
+typedef struct wuffs_base__pixel_subsampling__struct {
+ uint32_t repr;
+
+#ifdef __cplusplus
+ inline uint32_t bias_x(uint32_t plane) const;
+ inline uint32_t denominator_x(uint32_t plane) const;
+ inline uint32_t bias_y(uint32_t plane) const;
+ inline uint32_t denominator_y(uint32_t plane) const;
+#endif // __cplusplus
+
+} wuffs_base__pixel_subsampling;
+
+static inline wuffs_base__pixel_subsampling //
+wuffs_base__make_pixel_subsampling(uint32_t repr) {
+ wuffs_base__pixel_subsampling s;
+ s.repr = repr;
+ return s;
+}
+
+#define WUFFS_BASE__PIXEL_SUBSAMPLING__NONE 0x00000000
+
+#define WUFFS_BASE__PIXEL_SUBSAMPLING__444 0x000000
+#define WUFFS_BASE__PIXEL_SUBSAMPLING__440 0x010100
+#define WUFFS_BASE__PIXEL_SUBSAMPLING__422 0x101000
+#define WUFFS_BASE__PIXEL_SUBSAMPLING__420 0x111100
+#define WUFFS_BASE__PIXEL_SUBSAMPLING__411 0x303000
+#define WUFFS_BASE__PIXEL_SUBSAMPLING__410 0x313100
+
+static inline uint32_t //
+wuffs_base__pixel_subsampling__bias_x(const wuffs_base__pixel_subsampling* s,
+ uint32_t plane) {
+ uint32_t shift = ((plane & 0x03) * 8) + 6;
+ return (s->repr >> shift) & 0x03;
+}
+
+static inline uint32_t //
+wuffs_base__pixel_subsampling__denominator_x(
+ const wuffs_base__pixel_subsampling* s,
+ uint32_t plane) {
+ uint32_t shift = ((plane & 0x03) * 8) + 4;
+ return ((s->repr >> shift) & 0x03) + 1;
+}
+
+static inline uint32_t //
+wuffs_base__pixel_subsampling__bias_y(const wuffs_base__pixel_subsampling* s,
+ uint32_t plane) {
+ uint32_t shift = ((plane & 0x03) * 8) + 2;
+ return (s->repr >> shift) & 0x03;
+}
+
+static inline uint32_t //
+wuffs_base__pixel_subsampling__denominator_y(
+ const wuffs_base__pixel_subsampling* s,
+ uint32_t plane) {
+ uint32_t shift = ((plane & 0x03) * 8) + 0;
+ return ((s->repr >> shift) & 0x03) + 1;
+}
+
+#ifdef __cplusplus
+
+inline uint32_t //
+wuffs_base__pixel_subsampling::bias_x(uint32_t plane) const {
+ return wuffs_base__pixel_subsampling__bias_x(this, plane);
+}
+
+inline uint32_t //
+wuffs_base__pixel_subsampling::denominator_x(uint32_t plane) const {
+ return wuffs_base__pixel_subsampling__denominator_x(this, plane);
+}
+
+inline uint32_t //
+wuffs_base__pixel_subsampling::bias_y(uint32_t plane) const {
+ return wuffs_base__pixel_subsampling__bias_y(this, plane);
+}
+
+inline uint32_t //
+wuffs_base__pixel_subsampling::denominator_y(uint32_t plane) const {
+ return wuffs_base__pixel_subsampling__denominator_y(this, plane);
+}
+
+#endif // __cplusplus
+
+// --------
+
+typedef struct wuffs_base__pixel_config__struct {
+ // Do not access the private_impl's fields directly. There is no API/ABI
+ // compatibility or safety guarantee if you do so.
+ struct {
+ wuffs_base__pixel_format pixfmt;
+ wuffs_base__pixel_subsampling pixsub;
+ uint32_t width;
+ uint32_t height;
+ } private_impl;
+
+#ifdef __cplusplus
+ inline void set(uint32_t pixfmt_repr,
+ uint32_t pixsub_repr,
+ uint32_t width,
+ uint32_t height);
+ inline void invalidate();
+ inline bool is_valid() const;
+ inline wuffs_base__pixel_format pixel_format() const;
+ inline wuffs_base__pixel_subsampling pixel_subsampling() const;
+ inline wuffs_base__rect_ie_u32 bounds() const;
+ inline uint32_t width() const;
+ inline uint32_t height() const;
+ inline uint64_t pixbuf_len() const;
+#endif // __cplusplus
+
+} wuffs_base__pixel_config;
+
+static inline wuffs_base__pixel_config //
+wuffs_base__null_pixel_config() {
+ wuffs_base__pixel_config ret;
+ ret.private_impl.pixfmt.repr = 0;
+ ret.private_impl.pixsub.repr = 0;
+ ret.private_impl.width = 0;
+ ret.private_impl.height = 0;
+ return ret;
+}
+
+// TODO: Should this function return bool? An error type?
+static inline void //
+wuffs_base__pixel_config__set(wuffs_base__pixel_config* c,
+ uint32_t pixfmt_repr,
+ uint32_t pixsub_repr,
+ uint32_t width,
+ uint32_t height) {
+ if (!c) {
+ return;
+ }
+ if (pixfmt_repr) {
+ uint64_t wh = ((uint64_t)width) * ((uint64_t)height);
+ // TODO: handle things other than 1 byte per pixel.
+ if (wh <= ((uint64_t)SIZE_MAX)) {
+ c->private_impl.pixfmt.repr = pixfmt_repr;
+ c->private_impl.pixsub.repr = pixsub_repr;
+ c->private_impl.width = width;
+ c->private_impl.height = height;
+ return;
+ }
+ }
+
+ c->private_impl.pixfmt.repr = 0;
+ c->private_impl.pixsub.repr = 0;
+ c->private_impl.width = 0;
+ c->private_impl.height = 0;
+}
+
+static inline void //
+wuffs_base__pixel_config__invalidate(wuffs_base__pixel_config* c) {
+ if (c) {
+ c->private_impl.pixfmt.repr = 0;
+ c->private_impl.pixsub.repr = 0;
+ c->private_impl.width = 0;
+ c->private_impl.height = 0;
+ }
+}
+
+static inline bool //
+wuffs_base__pixel_config__is_valid(const wuffs_base__pixel_config* c) {
+ return c && c->private_impl.pixfmt.repr;
+}
+
+static inline wuffs_base__pixel_format //
+wuffs_base__pixel_config__pixel_format(const wuffs_base__pixel_config* c) {
+ return c ? c->private_impl.pixfmt : wuffs_base__make_pixel_format(0);
+}
+
+static inline wuffs_base__pixel_subsampling //
+wuffs_base__pixel_config__pixel_subsampling(const wuffs_base__pixel_config* c) {
+ return c ? c->private_impl.pixsub : wuffs_base__make_pixel_subsampling(0);
+}
+
+static inline wuffs_base__rect_ie_u32 //
+wuffs_base__pixel_config__bounds(const wuffs_base__pixel_config* c) {
+ if (c) {
+ wuffs_base__rect_ie_u32 ret;
+ ret.min_incl_x = 0;
+ ret.min_incl_y = 0;
+ ret.max_excl_x = c->private_impl.width;
+ ret.max_excl_y = c->private_impl.height;
+ return ret;
+ }
+
+ wuffs_base__rect_ie_u32 ret;
+ ret.min_incl_x = 0;
+ ret.min_incl_y = 0;
+ ret.max_excl_x = 0;
+ ret.max_excl_y = 0;
+ return ret;
+}
+
+static inline uint32_t //
+wuffs_base__pixel_config__width(const wuffs_base__pixel_config* c) {
+ return c ? c->private_impl.width : 0;
+}
+
+static inline uint32_t //
+wuffs_base__pixel_config__height(const wuffs_base__pixel_config* c) {
+ return c ? c->private_impl.height : 0;
+}
+
+// TODO: this is the right API for planar (not interleaved) pixbufs? Should it
+// allow decoding into a color model different from the format's intrinsic one?
+// For example, decoding a JPEG image straight to RGBA instead of to YCbCr?
+static inline uint64_t //
+wuffs_base__pixel_config__pixbuf_len(const wuffs_base__pixel_config* c) {
+ if (!c) {
+ return 0;
+ }
+ if (wuffs_base__pixel_format__is_planar(&c->private_impl.pixfmt)) {
+ // TODO: support planar pixel formats, concious of pixel subsampling.
+ return 0;
+ }
+ uint32_t bits_per_pixel =
+ wuffs_base__pixel_format__bits_per_pixel(&c->private_impl.pixfmt);
+ if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
+ // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
+ return 0;
+ }
+ uint64_t bytes_per_pixel = bits_per_pixel / 8;
+
+ uint64_t n =
+ ((uint64_t)c->private_impl.width) * ((uint64_t)c->private_impl.height);
+ if (n > (UINT64_MAX / bytes_per_pixel)) {
+ return 0;
+ }
+ n *= bytes_per_pixel;
+
+ if (wuffs_base__pixel_format__is_indexed(&c->private_impl.pixfmt)) {
+ if (n >
+ (UINT64_MAX - WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH)) {
+ return 0;
+ }
+ n += WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
+ }
+
+ return n;
+}
+
+#ifdef __cplusplus
+
+inline void //
+wuffs_base__pixel_config::set(uint32_t pixfmt_repr,
+ uint32_t pixsub_repr,
+ uint32_t width,
+ uint32_t height) {
+ wuffs_base__pixel_config__set(this, pixfmt_repr, pixsub_repr, width, height);
+}
+
+inline void //
+wuffs_base__pixel_config::invalidate() {
+ wuffs_base__pixel_config__invalidate(this);
+}
+
+inline bool //
+wuffs_base__pixel_config::is_valid() const {
+ return wuffs_base__pixel_config__is_valid(this);
+}
+
+inline wuffs_base__pixel_format //
+wuffs_base__pixel_config::pixel_format() const {
+ return wuffs_base__pixel_config__pixel_format(this);
+}
+
+inline wuffs_base__pixel_subsampling //
+wuffs_base__pixel_config::pixel_subsampling() const {
+ return wuffs_base__pixel_config__pixel_subsampling(this);
+}
+
+inline wuffs_base__rect_ie_u32 //
+wuffs_base__pixel_config::bounds() const {
+ return wuffs_base__pixel_config__bounds(this);
+}
+
+inline uint32_t //
+wuffs_base__pixel_config::width() const {
+ return wuffs_base__pixel_config__width(this);
+}
+
+inline uint32_t //
+wuffs_base__pixel_config::height() const {
+ return wuffs_base__pixel_config__height(this);
+}
+
+inline uint64_t //
+wuffs_base__pixel_config::pixbuf_len() const {
+ return wuffs_base__pixel_config__pixbuf_len(this);
+}
+
+#endif // __cplusplus
+
+// --------
+
+typedef struct wuffs_base__image_config__struct {
+ wuffs_base__pixel_config pixcfg;
+
+ // Do not access the private_impl's fields directly. There is no API/ABI
+ // compatibility or safety guarantee if you do so.
+ struct {
+ uint64_t first_frame_io_position;
+ bool first_frame_is_opaque;
+ } private_impl;
+
+#ifdef __cplusplus
+ inline void set(uint32_t pixfmt_repr,
+ uint32_t pixsub_repr,
+ uint32_t width,
+ uint32_t height,
+ uint64_t first_frame_io_position,
+ bool first_frame_is_opaque);
+ inline void invalidate();
+ inline bool is_valid() const;
+ inline uint64_t first_frame_io_position() const;
+ inline bool first_frame_is_opaque() const;
+#endif // __cplusplus
+
+} wuffs_base__image_config;
+
+static inline wuffs_base__image_config //
+wuffs_base__null_image_config() {
+ wuffs_base__image_config ret;
+ ret.pixcfg = wuffs_base__null_pixel_config();
+ ret.private_impl.first_frame_io_position = 0;
+ ret.private_impl.first_frame_is_opaque = false;
+ return ret;
+}
+
+// TODO: Should this function return bool? An error type?
+static inline void //
+wuffs_base__image_config__set(wuffs_base__image_config* c,
+ uint32_t pixfmt_repr,
+ uint32_t pixsub_repr,
+ uint32_t width,
+ uint32_t height,
+ uint64_t first_frame_io_position,
+ bool first_frame_is_opaque) {
+ if (!c) {
+ return;
+ }
+ if (pixfmt_repr) {
+ c->pixcfg.private_impl.pixfmt.repr = pixfmt_repr;
+ c->pixcfg.private_impl.pixsub.repr = pixsub_repr;
+ c->pixcfg.private_impl.width = width;
+ c->pixcfg.private_impl.height = height;
+ c->private_impl.first_frame_io_position = first_frame_io_position;
+ c->private_impl.first_frame_is_opaque = first_frame_is_opaque;
+ return;
+ }
+
+ c->pixcfg.private_impl.pixfmt.repr = 0;
+ c->pixcfg.private_impl.pixsub.repr = 0;
+ c->pixcfg.private_impl.width = 0;
+ c->pixcfg.private_impl.height = 0;
+ c->private_impl.first_frame_io_position = 0;
+ c->private_impl.first_frame_is_opaque = 0;
+}
+
+static inline void //
+wuffs_base__image_config__invalidate(wuffs_base__image_config* c) {
+ if (c) {
+ c->pixcfg.private_impl.pixfmt.repr = 0;
+ c->pixcfg.private_impl.pixsub.repr = 0;
+ c->pixcfg.private_impl.width = 0;
+ c->pixcfg.private_impl.height = 0;
+ c->private_impl.first_frame_io_position = 0;
+ c->private_impl.first_frame_is_opaque = 0;
+ }
+}
+
+static inline bool //
+wuffs_base__image_config__is_valid(const wuffs_base__image_config* c) {
+ return c && wuffs_base__pixel_config__is_valid(&(c->pixcfg));
+}
+
+static inline uint64_t //
+wuffs_base__image_config__first_frame_io_position(
+ const wuffs_base__image_config* c) {
+ return c ? c->private_impl.first_frame_io_position : 0;
+}
+
+static inline bool //
+wuffs_base__image_config__first_frame_is_opaque(
+ const wuffs_base__image_config* c) {
+ return c ? c->private_impl.first_frame_is_opaque : false;
+}
+
+#ifdef __cplusplus
+
+inline void //
+wuffs_base__image_config::set(uint32_t pixfmt_repr,
+ uint32_t pixsub_repr,
+ uint32_t width,
+ uint32_t height,
+ uint64_t first_frame_io_position,
+ bool first_frame_is_opaque) {
+ wuffs_base__image_config__set(this, pixfmt_repr, pixsub_repr, width, height,
+ first_frame_io_position, first_frame_is_opaque);
+}
+
+inline void //
+wuffs_base__image_config::invalidate() {
+ wuffs_base__image_config__invalidate(this);
+}
+
+inline bool //
+wuffs_base__image_config::is_valid() const {
+ return wuffs_base__image_config__is_valid(this);
+}
+
+inline uint64_t //
+wuffs_base__image_config::first_frame_io_position() const {
+ return wuffs_base__image_config__first_frame_io_position(this);
+}
+
+inline bool //
+wuffs_base__image_config::first_frame_is_opaque() const {
+ return wuffs_base__image_config__first_frame_is_opaque(this);
+}
+
+#endif // __cplusplus
+
+// --------
+
+// wuffs_base__animation_disposal encodes, for an animated image, how to
+// dispose of a frame after displaying it:
+// - None means to draw the next frame on top of this one.
+// - Restore Background means to clear the frame's dirty rectangle to "the
+// background color" (in practice, this means transparent black) before
+// drawing the next frame.
+// - Restore Previous means to undo the current frame, so that the next frame
+// is drawn on top of the previous one.
+typedef uint8_t wuffs_base__animation_disposal;
+
+#define WUFFS_BASE__ANIMATION_DISPOSAL__NONE ((wuffs_base__animation_disposal)0)
+#define WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_BACKGROUND \
+ ((wuffs_base__animation_disposal)1)
+#define WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_PREVIOUS \
+ ((wuffs_base__animation_disposal)2)
+
+// --------
+
+typedef struct wuffs_base__frame_config__struct {
+ // Do not access the private_impl's fields directly. There is no API/ABI
+ // compatibility or safety guarantee if you do so.
+ struct {
+ wuffs_base__rect_ie_u32 bounds;
+ wuffs_base__flicks duration;
+ uint64_t index;
+ uint64_t io_position;
+ wuffs_base__animation_disposal disposal;
+ bool opaque_within_bounds;
+ bool overwrite_instead_of_blend;
+ wuffs_base__color_u32_argb_premul background_color;
+ } private_impl;
+
+#ifdef __cplusplus
+ inline void set(wuffs_base__rect_ie_u32 bounds,
+ wuffs_base__flicks duration,
+ uint64_t index,
+ uint64_t io_position,
+ wuffs_base__animation_disposal disposal,
+ bool opaque_within_bounds,
+ bool overwrite_instead_of_blend,
+ wuffs_base__color_u32_argb_premul background_color);
+ inline wuffs_base__rect_ie_u32 bounds() const;
+ inline uint32_t width() const;
+ inline uint32_t height() const;
+ inline wuffs_base__flicks duration() const;
+ inline uint64_t index() const;
+ inline uint64_t io_position() const;
+ inline wuffs_base__animation_disposal disposal() const;
+ inline bool opaque_within_bounds() const;
+ inline bool overwrite_instead_of_blend() const;
+ inline wuffs_base__color_u32_argb_premul background_color() const;
+#endif // __cplusplus
+
+} wuffs_base__frame_config;
+
+static inline wuffs_base__frame_config //
+wuffs_base__null_frame_config() {
+ wuffs_base__frame_config ret;
+ ret.private_impl.bounds = wuffs_base__make_rect_ie_u32(0, 0, 0, 0);
+ ret.private_impl.duration = 0;
+ ret.private_impl.index = 0;
+ ret.private_impl.io_position = 0;
+ ret.private_impl.disposal = 0;
+ ret.private_impl.opaque_within_bounds = false;
+ ret.private_impl.overwrite_instead_of_blend = false;
+ return ret;
+}
+
+static inline void //
+wuffs_base__frame_config__set(
+ wuffs_base__frame_config* c,
+ wuffs_base__rect_ie_u32 bounds,
+ wuffs_base__flicks duration,
+ uint64_t index,
+ uint64_t io_position,
+ wuffs_base__animation_disposal disposal,
+ bool opaque_within_bounds,
+ bool overwrite_instead_of_blend,
+ wuffs_base__color_u32_argb_premul background_color) {
+ if (!c) {
+ return;
+ }
+
+ c->private_impl.bounds = bounds;
+ c->private_impl.duration = duration;
+ c->private_impl.index = index;
+ c->private_impl.io_position = io_position;
+ c->private_impl.disposal = disposal;
+ c->private_impl.opaque_within_bounds = opaque_within_bounds;
+ c->private_impl.overwrite_instead_of_blend = overwrite_instead_of_blend;
+ c->private_impl.background_color = background_color;
+}
+
+static inline wuffs_base__rect_ie_u32 //
+wuffs_base__frame_config__bounds(const wuffs_base__frame_config* c) {
+ if (c) {
+ return c->private_impl.bounds;
+ }
+
+ wuffs_base__rect_ie_u32 ret;
+ ret.min_incl_x = 0;
+ ret.min_incl_y = 0;
+ ret.max_excl_x = 0;
+ ret.max_excl_y = 0;
+ return ret;
+}
+
+static inline uint32_t //
+wuffs_base__frame_config__width(const wuffs_base__frame_config* c) {
+ return c ? wuffs_base__rect_ie_u32__width(&c->private_impl.bounds) : 0;
+}
+
+static inline uint32_t //
+wuffs_base__frame_config__height(const wuffs_base__frame_config* c) {
+ return c ? wuffs_base__rect_ie_u32__height(&c->private_impl.bounds) : 0;
+}
+
+// wuffs_base__frame_config__duration returns the amount of time to display
+// this frame. Zero means to display forever - a still (non-animated) image.
+static inline wuffs_base__flicks //
+wuffs_base__frame_config__duration(const wuffs_base__frame_config* c) {
+ return c ? c->private_impl.duration : 0;
+}
+
+// wuffs_base__frame_config__index returns the index of this frame. The first
+// frame in an image has index 0, the second frame has index 1, and so on.
+static inline uint64_t //
+wuffs_base__frame_config__index(const wuffs_base__frame_config* c) {
+ return c ? c->private_impl.index : 0;
+}
+
+// wuffs_base__frame_config__io_position returns the I/O stream position before
+// the frame config.
+static inline uint64_t //
+wuffs_base__frame_config__io_position(const wuffs_base__frame_config* c) {
+ return c ? c->private_impl.io_position : 0;
+}
+
+// wuffs_base__frame_config__disposal returns, for an animated image, how to
+// dispose of this frame after displaying it.
+static inline wuffs_base__animation_disposal //
+wuffs_base__frame_config__disposal(const wuffs_base__frame_config* c) {
+ return c ? c->private_impl.disposal : 0;
+}
+
+// wuffs_base__frame_config__opaque_within_bounds returns whether all pixels
+// within the frame's bounds are fully opaque. It makes no claim about pixels
+// outside the frame bounds but still inside the overall image. The two
+// bounding rectangles can differ for animated images.
+//
+// Its semantics are conservative. It is valid for a fully opaque frame to have
+// this value be false: a false negative.
+//
+// If true, drawing the frame with WUFFS_BASE__PIXEL_BLEND__SRC and
+// WUFFS_BASE__PIXEL_BLEND__SRC_OVER should be equivalent, in terms of
+// resultant pixels, but the former may be faster.
+static inline bool //
+wuffs_base__frame_config__opaque_within_bounds(
+ const wuffs_base__frame_config* c) {
+ return c && c->private_impl.opaque_within_bounds;
+}
+
+// wuffs_base__frame_config__overwrite_instead_of_blend returns, for an
+// animated image, whether to ignore the previous image state (within the frame
+// bounds) when drawing this incremental frame. Equivalently, whether to use
+// WUFFS_BASE__PIXEL_BLEND__SRC instead of WUFFS_BASE__PIXEL_BLEND__SRC_OVER.
+//
+// The WebP spec (https://developers.google.com/speed/webp/docs/riff_container)
+// calls this the "Blending method" bit. WebP's "Do not blend" corresponds to
+// Wuffs' "overwrite_instead_of_blend".
+static inline bool //
+wuffs_base__frame_config__overwrite_instead_of_blend(
+ const wuffs_base__frame_config* c) {
+ return c && c->private_impl.overwrite_instead_of_blend;
+}
+
+static inline wuffs_base__color_u32_argb_premul //
+wuffs_base__frame_config__background_color(const wuffs_base__frame_config* c) {
+ return c ? c->private_impl.background_color : 0;
+}
+
+#ifdef __cplusplus
+
+inline void //
+wuffs_base__frame_config::set(
+ wuffs_base__rect_ie_u32 bounds,
+ wuffs_base__flicks duration,
+ uint64_t index,
+ uint64_t io_position,
+ wuffs_base__animation_disposal disposal,
+ bool opaque_within_bounds,
+ bool overwrite_instead_of_blend,
+ wuffs_base__color_u32_argb_premul background_color) {
+ wuffs_base__frame_config__set(this, bounds, duration, index, io_position,
+ disposal, opaque_within_bounds,
+ overwrite_instead_of_blend, background_color);
+}
+
+inline wuffs_base__rect_ie_u32 //
+wuffs_base__frame_config::bounds() const {
+ return wuffs_base__frame_config__bounds(this);
+}
+
+inline uint32_t //
+wuffs_base__frame_config::width() const {
+ return wuffs_base__frame_config__width(this);
+}
+
+inline uint32_t //
+wuffs_base__frame_config::height() const {
+ return wuffs_base__frame_config__height(this);
+}
+
+inline wuffs_base__flicks //
+wuffs_base__frame_config::duration() const {
+ return wuffs_base__frame_config__duration(this);
+}
+
+inline uint64_t //
+wuffs_base__frame_config::index() const {
+ return wuffs_base__frame_config__index(this);
+}
+
+inline uint64_t //
+wuffs_base__frame_config::io_position() const {
+ return wuffs_base__frame_config__io_position(this);
+}
+
+inline wuffs_base__animation_disposal //
+wuffs_base__frame_config::disposal() const {
+ return wuffs_base__frame_config__disposal(this);
+}
+
+inline bool //
+wuffs_base__frame_config::opaque_within_bounds() const {
+ return wuffs_base__frame_config__opaque_within_bounds(this);
+}
+
+inline bool //
+wuffs_base__frame_config::overwrite_instead_of_blend() const {
+ return wuffs_base__frame_config__overwrite_instead_of_blend(this);
+}
+
+inline wuffs_base__color_u32_argb_premul //
+wuffs_base__frame_config::background_color() const {
+ return wuffs_base__frame_config__background_color(this);
+}
+
+#endif // __cplusplus
+
+// --------
+
+typedef struct wuffs_base__pixel_buffer__struct {
+ wuffs_base__pixel_config pixcfg;
+
+ // Do not access the private_impl's fields directly. There is no API/ABI
+ // compatibility or safety guarantee if you do so.
+ struct {
+ wuffs_base__table_u8 planes[WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX];
+ // TODO: color spaces.
+ } private_impl;
+
+#ifdef __cplusplus
+ inline wuffs_base__status set_interleaved(
+ const wuffs_base__pixel_config* pixcfg,
+ wuffs_base__table_u8 primary_memory,
+ wuffs_base__slice_u8 palette_memory);
+ inline wuffs_base__status set_from_slice(
+ const wuffs_base__pixel_config* pixcfg,
+ wuffs_base__slice_u8 pixbuf_memory);
+ inline wuffs_base__status set_from_table(
+ const wuffs_base__pixel_config* pixcfg,
+ wuffs_base__table_u8 primary_memory);
+ inline wuffs_base__slice_u8 palette();
+ inline wuffs_base__slice_u8 palette_or_else(wuffs_base__slice_u8 fallback);
+ inline wuffs_base__pixel_format pixel_format() const;
+ inline wuffs_base__table_u8 plane(uint32_t p);
+ inline wuffs_base__color_u32_argb_premul color_u32_at(uint32_t x,
+ uint32_t y) const;
+ inline wuffs_base__status set_color_u32_at(
+ uint32_t x,
+ uint32_t y,
+ wuffs_base__color_u32_argb_premul color);
+ inline wuffs_base__status set_color_u32_fill_rect(
+ wuffs_base__rect_ie_u32 rect,
+ wuffs_base__color_u32_argb_premul color);
+#endif // __cplusplus
+
+} wuffs_base__pixel_buffer;
+
+static inline wuffs_base__pixel_buffer //
+wuffs_base__null_pixel_buffer() {
+ wuffs_base__pixel_buffer ret;
+ ret.pixcfg = wuffs_base__null_pixel_config();
+ ret.private_impl.planes[0] = wuffs_base__empty_table_u8();
+ ret.private_impl.planes[1] = wuffs_base__empty_table_u8();
+ ret.private_impl.planes[2] = wuffs_base__empty_table_u8();
+ ret.private_impl.planes[3] = wuffs_base__empty_table_u8();
+ return ret;
+}
+
+static inline wuffs_base__status //
+wuffs_base__pixel_buffer__set_interleaved(
+ wuffs_base__pixel_buffer* pb,
+ const wuffs_base__pixel_config* pixcfg,
+ wuffs_base__table_u8 primary_memory,
+ wuffs_base__slice_u8 palette_memory) {
+ if (!pb) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ memset(pb, 0, sizeof(*pb));
+ if (!pixcfg ||
+ wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt) &&
+ (palette_memory.len <
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH)) {
+ return wuffs_base__make_status(
+ wuffs_base__error__bad_argument_length_too_short);
+ }
+ uint32_t bits_per_pixel =
+ wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt);
+ if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
+ // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
+ return wuffs_base__make_status(wuffs_base__error__unsupported_option);
+ }
+ uint64_t bytes_per_pixel = bits_per_pixel / 8;
+
+ uint64_t width_in_bytes =
+ ((uint64_t)pixcfg->private_impl.width) * bytes_per_pixel;
+ if ((width_in_bytes > primary_memory.width) ||
+ (pixcfg->private_impl.height > primary_memory.height)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+
+ pb->pixcfg = *pixcfg;
+ pb->private_impl.planes[0] = primary_memory;
+ if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt)) {
+ wuffs_base__table_u8* tab =
+ &pb->private_impl
+ .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
+ tab->ptr = palette_memory.ptr;
+ tab->width = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
+ tab->height = 1;
+ tab->stride = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
+ }
+ return wuffs_base__make_status(NULL);
+}
+
+static inline wuffs_base__status //
+wuffs_base__pixel_buffer__set_from_slice(wuffs_base__pixel_buffer* pb,
+ const wuffs_base__pixel_config* pixcfg,
+ wuffs_base__slice_u8 pixbuf_memory) {
+ if (!pb) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ memset(pb, 0, sizeof(*pb));
+ if (!pixcfg) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ if (wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) {
+ // TODO: support planar pixel formats, concious of pixel subsampling.
+ return wuffs_base__make_status(wuffs_base__error__unsupported_option);
+ }
+ uint32_t bits_per_pixel =
+ wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt);
+ if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
+ // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
+ return wuffs_base__make_status(wuffs_base__error__unsupported_option);
+ }
+ uint64_t bytes_per_pixel = bits_per_pixel / 8;
+
+ uint8_t* ptr = pixbuf_memory.ptr;
+ uint64_t len = pixbuf_memory.len;
+ if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt)) {
+ // Split a WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH byte
+ // chunk (1024 bytes = 256 palette entries × 4 bytes per entry) from the
+ // start of pixbuf_memory. We split from the start, not the end, so that
+ // the both chunks' pointers have the same alignment as the original
+ // pointer, up to an alignment of 1024.
+ if (len < WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return wuffs_base__make_status(
+ wuffs_base__error__bad_argument_length_too_short);
+ }
+ wuffs_base__table_u8* tab =
+ &pb->private_impl
+ .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
+ tab->ptr = ptr;
+ tab->width = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
+ tab->height = 1;
+ tab->stride = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
+ ptr += WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
+ len -= WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
+ }
+
+ uint64_t wh = ((uint64_t)pixcfg->private_impl.width) *
+ ((uint64_t)pixcfg->private_impl.height);
+ size_t width = (size_t)(pixcfg->private_impl.width);
+ if ((wh > (UINT64_MAX / bytes_per_pixel)) ||
+ (width > (SIZE_MAX / bytes_per_pixel))) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ wh *= bytes_per_pixel;
+ width = ((size_t)(width * bytes_per_pixel));
+ if (wh > len) {
+ return wuffs_base__make_status(
+ wuffs_base__error__bad_argument_length_too_short);
+ }
+
+ pb->pixcfg = *pixcfg;
+ wuffs_base__table_u8* tab = &pb->private_impl.planes[0];
+ tab->ptr = ptr;
+ tab->width = width;
+ tab->height = pixcfg->private_impl.height;
+ tab->stride = width;
+ return wuffs_base__make_status(NULL);
+}
+
+// Deprecated: does not handle indexed pixel configurations. Use
+// wuffs_base__pixel_buffer__set_interleaved instead.
+static inline wuffs_base__status //
+wuffs_base__pixel_buffer__set_from_table(wuffs_base__pixel_buffer* pb,
+ const wuffs_base__pixel_config* pixcfg,
+ wuffs_base__table_u8 primary_memory) {
+ if (!pb) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ memset(pb, 0, sizeof(*pb));
+ if (!pixcfg ||
+ wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt) ||
+ wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ uint32_t bits_per_pixel =
+ wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt);
+ if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
+ // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
+ return wuffs_base__make_status(wuffs_base__error__unsupported_option);
+ }
+ uint64_t bytes_per_pixel = bits_per_pixel / 8;
+
+ uint64_t width_in_bytes =
+ ((uint64_t)pixcfg->private_impl.width) * bytes_per_pixel;
+ if ((width_in_bytes > primary_memory.width) ||
+ (pixcfg->private_impl.height > primary_memory.height)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+
+ pb->pixcfg = *pixcfg;
+ pb->private_impl.planes[0] = primary_memory;
+ return wuffs_base__make_status(NULL);
+}
+
+// wuffs_base__pixel_buffer__palette returns the palette color data. If
+// non-empty, it will have length
+// WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH.
+static inline wuffs_base__slice_u8 //
+wuffs_base__pixel_buffer__palette(wuffs_base__pixel_buffer* pb) {
+ if (pb &&
+ wuffs_base__pixel_format__is_indexed(&pb->pixcfg.private_impl.pixfmt)) {
+ wuffs_base__table_u8* tab =
+ &pb->private_impl
+ .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
+ if ((tab->width ==
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) &&
+ (tab->height == 1)) {
+ return wuffs_base__make_slice_u8(
+ tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH);
+ }
+ }
+ return wuffs_base__make_slice_u8(NULL, 0);
+}
+
+static inline wuffs_base__slice_u8 //
+wuffs_base__pixel_buffer__palette_or_else(wuffs_base__pixel_buffer* pb,
+ wuffs_base__slice_u8 fallback) {
+ if (pb &&
+ wuffs_base__pixel_format__is_indexed(&pb->pixcfg.private_impl.pixfmt)) {
+ wuffs_base__table_u8* tab =
+ &pb->private_impl
+ .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
+ if ((tab->width ==
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) &&
+ (tab->height == 1)) {
+ return wuffs_base__make_slice_u8(
+ tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH);
+ }
+ }
+ return fallback;
+}
+
+static inline wuffs_base__pixel_format //
+wuffs_base__pixel_buffer__pixel_format(const wuffs_base__pixel_buffer* pb) {
+ if (pb) {
+ return pb->pixcfg.private_impl.pixfmt;
+ }
+ return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__INVALID);
+}
+
+static inline wuffs_base__table_u8 //
+wuffs_base__pixel_buffer__plane(wuffs_base__pixel_buffer* pb, uint32_t p) {
+ if (pb && (p < WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX)) {
+ return pb->private_impl.planes[p];
+ }
+
+ wuffs_base__table_u8 ret;
+ ret.ptr = NULL;
+ ret.width = 0;
+ ret.height = 0;
+ ret.stride = 0;
+ return ret;
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul //
+wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb,
+ uint32_t x,
+ uint32_t y);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status //
+wuffs_base__pixel_buffer__set_color_u32_at(
+ wuffs_base__pixel_buffer* pb,
+ uint32_t x,
+ uint32_t y,
+ wuffs_base__color_u32_argb_premul color);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status //
+wuffs_base__pixel_buffer__set_color_u32_fill_rect(
+ wuffs_base__pixel_buffer* pb,
+ wuffs_base__rect_ie_u32 rect,
+ wuffs_base__color_u32_argb_premul color);
+
+#ifdef __cplusplus
+
+inline wuffs_base__status //
+wuffs_base__pixel_buffer::set_interleaved(
+ const wuffs_base__pixel_config* pixcfg_arg,
+ wuffs_base__table_u8 primary_memory,
+ wuffs_base__slice_u8 palette_memory) {
+ return wuffs_base__pixel_buffer__set_interleaved(
+ this, pixcfg_arg, primary_memory, palette_memory);
+}
+
+inline wuffs_base__status //
+wuffs_base__pixel_buffer::set_from_slice(
+ const wuffs_base__pixel_config* pixcfg_arg,
+ wuffs_base__slice_u8 pixbuf_memory) {
+ return wuffs_base__pixel_buffer__set_from_slice(this, pixcfg_arg,
+ pixbuf_memory);
+}
+
+inline wuffs_base__status //
+wuffs_base__pixel_buffer::set_from_table(
+ const wuffs_base__pixel_config* pixcfg_arg,
+ wuffs_base__table_u8 primary_memory) {
+ return wuffs_base__pixel_buffer__set_from_table(this, pixcfg_arg,
+ primary_memory);
+}
+
+inline wuffs_base__slice_u8 //
+wuffs_base__pixel_buffer::palette() {
+ return wuffs_base__pixel_buffer__palette(this);
+}
+
+inline wuffs_base__slice_u8 //
+wuffs_base__pixel_buffer::palette_or_else(wuffs_base__slice_u8 fallback) {
+ return wuffs_base__pixel_buffer__palette_or_else(this, fallback);
+}
+
+inline wuffs_base__pixel_format //
+wuffs_base__pixel_buffer::pixel_format() const {
+ return wuffs_base__pixel_buffer__pixel_format(this);
+}
+
+inline wuffs_base__table_u8 //
+wuffs_base__pixel_buffer::plane(uint32_t p) {
+ return wuffs_base__pixel_buffer__plane(this, p);
+}
+
+inline wuffs_base__color_u32_argb_premul //
+wuffs_base__pixel_buffer::color_u32_at(uint32_t x, uint32_t y) const {
+ return wuffs_base__pixel_buffer__color_u32_at(this, x, y);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status //
+wuffs_base__pixel_buffer__set_color_u32_fill_rect(
+ wuffs_base__pixel_buffer* pb,
+ wuffs_base__rect_ie_u32 rect,
+ wuffs_base__color_u32_argb_premul color);
+
+inline wuffs_base__status //
+wuffs_base__pixel_buffer::set_color_u32_at(
+ uint32_t x,
+ uint32_t y,
+ wuffs_base__color_u32_argb_premul color) {
+ return wuffs_base__pixel_buffer__set_color_u32_at(this, x, y, color);
+}
+
+inline wuffs_base__status //
+wuffs_base__pixel_buffer::set_color_u32_fill_rect(
+ wuffs_base__rect_ie_u32 rect,
+ wuffs_base__color_u32_argb_premul color) {
+ return wuffs_base__pixel_buffer__set_color_u32_fill_rect(this, rect, color);
+}
+
+#endif // __cplusplus
+
+// --------
+
+typedef struct wuffs_base__decode_frame_options__struct {
+ // Do not access the private_impl's fields directly. There is no API/ABI
+ // compatibility or safety guarantee if you do so.
+ struct {
+ uint8_t TODO;
+ } private_impl;
+
+#ifdef __cplusplus
+#endif // __cplusplus
+
+} wuffs_base__decode_frame_options;
+
+#ifdef __cplusplus
+
+#endif // __cplusplus
+
+// --------
+
+// wuffs_base__pixel_palette__closest_element returns the index of the palette
+// element that minimizes the sum of squared differences of the four ARGB
+// channels, working in premultiplied alpha. Ties favor the smaller index.
+//
+// The palette_slice.len may equal (N*4), for N less than 256, which means that
+// only the first N palette elements are considered. It returns 0 when N is 0.
+//
+// Applying this function on a per-pixel basis will not produce whole-of-image
+// dithering.
+WUFFS_BASE__MAYBE_STATIC uint8_t //
+wuffs_base__pixel_palette__closest_element(
+ wuffs_base__slice_u8 palette_slice,
+ wuffs_base__pixel_format palette_format,
+ wuffs_base__color_u32_argb_premul c);
+
+// --------
+
+// TODO: should the func type take restrict pointers?
+typedef uint64_t (*wuffs_base__pixel_swizzler__func)(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len);
+
+typedef uint64_t (*wuffs_base__pixel_swizzler__transparent_black_func)(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ uint64_t num_pixels,
+ uint32_t dst_pixfmt_bytes_per_pixel);
+
+typedef struct wuffs_base__pixel_swizzler__struct {
+ // Do not access the private_impl's fields directly. There is no API/ABI
+ // compatibility or safety guarantee if you do so.
+ struct {
+ wuffs_base__pixel_swizzler__func func;
+ wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func;
+ uint32_t dst_pixfmt_bytes_per_pixel;
+ uint32_t src_pixfmt_bytes_per_pixel;
+ } private_impl;
+
+#ifdef __cplusplus
+ inline wuffs_base__status prepare(wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__pixel_format src_pixfmt,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend);
+ inline uint64_t swizzle_interleaved_from_slice(
+ wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src) const;
+#endif // __cplusplus
+
+} wuffs_base__pixel_swizzler;
+
+// wuffs_base__pixel_swizzler__prepare readies the pixel swizzler so that its
+// other methods may be called.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__PIXCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status //
+wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__pixel_format src_pixfmt,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend);
+
+// wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice converts pixels
+// from a source format to a destination format.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__PIXCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC uint64_t //
+wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
+ const wuffs_base__pixel_swizzler* p,
+ wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src);
+
+#ifdef __cplusplus
+
+inline wuffs_base__status //
+wuffs_base__pixel_swizzler::prepare(wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__pixel_format src_pixfmt,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ return wuffs_base__pixel_swizzler__prepare(this, dst_pixfmt, dst_palette,
+ src_pixfmt, src_palette, blend);
+}
+
+uint64_t //
+wuffs_base__pixel_swizzler::swizzle_interleaved_from_slice(
+ wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src) const {
+ return wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
+ this, dst, dst_palette, src);
+}
+
+#endif // __cplusplus
+
+// ---------------- String Conversions
+
+// Options (bitwise or'ed together) for wuffs_base__parse_number_xxx
+// functions. The XXX options apply to both integer and floating point. The FXX
+// options apply only to floating point.
+
+#define WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000)
+
+// WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES means to accept
+// inputs like "00", "0644" and "00.7". By default, they are rejected.
+#define WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES \
+ ((uint32_t)0x00000001)
+
+// WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES means to accept inputs like
+// "1__2" and "_3.141_592". By default, they are rejected.
+#define WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES ((uint32_t)0x00000002)
+
+// WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to accept
+// "1,5" and not "1.5" as one-and-a-half.
+//
+// If the caller wants to accept either, it is responsible for canonicalizing
+// the input before calling wuffs_base__parse_number_fxx. The caller also has
+// more context on e.g. exactly how to treat something like "$1,234".
+#define WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \
+ ((uint32_t)0x00000010)
+
+// WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN means to reject inputs that
+// would lead to infinite or Not-a-Number floating point values. By default,
+// they are accepted.
+//
+// This affects the literal "inf" as input, but also affects inputs like
+// "1e999" that would overflow double-precision floating point.
+#define WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN ((uint32_t)0x00000020)
+
+// --------
+
+// Options (bitwise or'ed together) for wuffs_base__render_number_xxx
+// functions. The XXX options apply to both integer and floating point. The FXX
+// options apply only to floating point.
+
+#define WUFFS_BASE__RENDER_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000)
+
+// WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT means to render to the right side
+// (higher indexes) of the destination slice, leaving any untouched bytes on
+// the left side (lower indexes). The default is vice versa: rendering on the
+// left with slack on the right.
+#define WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT ((uint32_t)0x00000100)
+
+// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN means to render the leading
+// "+" for non-negative numbers: "+0" and "+12.3" instead of "0" and "12.3".
+#define WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN ((uint32_t)0x00000200)
+
+// WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to render
+// one-and-a-half as "1,5" instead of "1.5".
+#define WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \
+ ((uint32_t)0x00001000)
+
+// WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ETC means whether to never
+// (EXPONENT_ABSENT, equivalent to printf's "%f") or to always
+// (EXPONENT_PRESENT, equivalent to printf's "%e") render a floating point
+// number as "1.23e+05" instead of "123000".
+//
+// Having both bits set is the same has having neither bit set, where the
+// notation used depends on whether the exponent is sufficiently large: "0.5"
+// is preferred over "5e-01" but "5e-09" is preferred over "0.000000005".
+#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT ((uint32_t)0x00002000)
+#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT ((uint32_t)0x00004000)
+
+// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION means to render the
+// smallest number of digits so that parsing the resultant string will recover
+// the same double-precision floating point number.
+//
+// For example, double-precision cannot distinguish between 0.3 and
+// 0.299999999999999988897769753748434595763683319091796875, so when this bit
+// is set, rendering the latter will produce "0.3" but rendering
+// 0.3000000000000000444089209850062616169452667236328125 will produce
+// "0.30000000000000004".
+#define WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION \
+ ((uint32_t)0x00008000)
+
+// ---------------- IEEE 754 Floating Point
+
+// wuffs_base__ieee_754_bit_representation__etc converts between a double
+// precision numerical value and its IEEE 754 representations:
+// - 16-bit: 1 sign bit, 5 exponent bits, 10 explicit significand bits.
+// - 32-bit: 1 sign bit, 8 exponent bits, 23 explicit significand bits.
+// - 64-bit: 1 sign bit, 11 exponent bits, 52 explicit significand bits.
+//
+// For example, it converts between:
+// - +1.0 and 0x3C00, 0x3F80_0000 or 0x3FF0_0000_0000_0000.
+// - +5.5 and 0x4580, 0x40B0_0000 or 0x4016_0000_0000_0000.
+// - -inf and 0xFC00, 0xFF80_0000 or 0xFFF0_0000_0000_0000.
+//
+// Converting from f64 to shorter formats (f16 or f32, represented in C as
+// uint16_t and uint32_t) may be lossy. Such functions have names that look
+// like etc_truncate, as converting finite numbers produce equal or smaller
+// (closer-to-zero) finite numbers. For example, 1048576.0 is a perfectly valid
+// f64 number, but converting it to a f16 (with truncation) produces 65504.0,
+// the largest finite f16 number. Truncating a f64-typed value d to f32 does
+// not always produce the same result as the C-style cast ((float)d), as
+// casting can convert from finite numbers to infinite ones.
+//
+// Converting infinities or NaNs produces infinities or NaNs and always report
+// no loss, even though there a multiple NaN representations so that round-
+// tripping a f64-typed NaN may produce a different 64 bits. Nonetheless, the
+// etc_truncate functions preserve a NaN's "quiet vs signaling" bit.
+//
+// See https://en.wikipedia.org/wiki/Double-precision_floating-point_format
+
+typedef struct wuffs_base__lossy_value_u16__struct {
+ uint16_t value;
+ bool lossy;
+} wuffs_base__lossy_value_u16;
+
+typedef struct wuffs_base__lossy_value_u32__struct {
+ uint32_t value;
+ bool lossy;
+} wuffs_base__lossy_value_u32;
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16 //
+wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32 //
+wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f);
+
+static inline uint64_t //
+wuffs_base__ieee_754_bit_representation__from_f64_to_u64(double f) {
+ uint64_t u = 0;
+ if (sizeof(uint64_t) == sizeof(double)) {
+ memcpy(&u, &f, sizeof(uint64_t));
+ }
+ return u;
+}
+
+static inline double //
+wuffs_base__ieee_754_bit_representation__from_u16_to_f64(uint16_t u) {
+ uint64_t v = ((uint64_t)(u & 0x8000)) << 48;
+
+ do {
+ uint64_t exp = (u >> 10) & 0x1F;
+ uint64_t man = u & 0x3FF;
+ if (exp == 0x1F) { // Infinity or NaN.
+ exp = 2047;
+ } else if (exp != 0) { // Normal.
+ exp += 1008; // 1008 = 1023 - 15, the difference in biases.
+ } else if (man != 0) { // Subnormal but non-zero.
+ uint32_t clz = wuffs_base__count_leading_zeroes_u64(man);
+ exp = 1062 - clz; // 1062 = 1008 + 64 - 10.
+ man = 0x3FF & (man << (clz - 53));
+ } else { // Zero.
+ break;
+ }
+ v |= (exp << 52) | (man << 42);
+ } while (0);
+
+ double f = 0;
+ if (sizeof(uint64_t) == sizeof(double)) {
+ memcpy(&f, &v, sizeof(uint64_t));
+ }
+ return f;
+}
+
+static inline double //
+wuffs_base__ieee_754_bit_representation__from_u32_to_f64(uint32_t u) {
+ float f = 0;
+ if (sizeof(uint32_t) == sizeof(float)) {
+ memcpy(&f, &u, sizeof(uint32_t));
+ }
+ return (double)f;
+}
+
+static inline double //
+wuffs_base__ieee_754_bit_representation__from_u64_to_f64(uint64_t u) {
+ double f = 0;
+ if (sizeof(uint64_t) == sizeof(double)) {
+ memcpy(&f, &u, sizeof(uint64_t));
+ }
+ return f;
+}
+
+// ---------------- Parsing and Rendering Numbers
+
+// wuffs_base__parse_number_f64 parses the floating point number in s. For
+// example, if s contains the bytes "1.5" then it will return the double 1.5.
+//
+// It returns an error if s does not contain a floating point number.
+//
+// It does not necessarily return an error if the conversion is lossy, e.g. if
+// s is "0.3", which double-precision floating point cannot represent exactly.
+//
+// Similarly, the returned value may be infinite (and no error returned) even
+// if s was not "inf", when the input is nominally finite but sufficiently
+// larger than DBL_MAX, about 1.8e+308.
+//
+// It is similar to the C standard library's strtod function, but:
+// - Errors are returned in-band (in a result type), not out-of-band (errno).
+// - It takes a slice (a pointer and length), not a NUL-terminated C string.
+// - It does not take an optional endptr argument. It does not allow a partial
+// parse: it returns an error unless all of s is consumed.
+// - It does not allow whitespace, leading or otherwise.
+// - It does not allow hexadecimal floating point numbers.
+// - It is not affected by i18n / l10n settings such as environment variables.
+//
+// The options argument can change these, but by default, it:
+// - Allows "inf", "+Infinity" and "-NAN", case insensitive. Similarly,
+// without an explicit opt-out, it would successfully parse "1e999" as
+// infinity, even though it overflows double-precision floating point.
+// - Rejects underscores. With an explicit opt-in, "_3.141_592" would
+// successfully parse as an approximation to π.
+// - Rejects unnecessary leading zeroes: "00", "0644" and "00.7".
+// - Uses a dot '1.5' instead of a comma '1,5' for the decimal separator.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__FLOATCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 //
+wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options);
+
+// wuffs_base__parse_number_i64 parses the ASCII integer in s. For example, if
+// s contains the bytes "-123" then it will return the int64_t -123.
+//
+// It returns an error if s does not contain an integer or if the integer
+// within would overflow an int64_t.
+//
+// It is similar to wuffs_base__parse_number_u64 but it returns a signed
+// integer, not an unsigned integer. It also allows a leading '+' or '-'.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 //
+wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options);
+
+// wuffs_base__parse_number_u64 parses the ASCII integer in s. For example, if
+// s contains the bytes "123" then it will return the uint64_t 123.
+//
+// It returns an error if s does not contain an integer or if the integer
+// within would overflow a uint64_t.
+//
+// It is similar to the C standard library's strtoull function, but:
+// - Errors are returned in-band (in a result type), not out-of-band (errno).
+// - It takes a slice (a pointer and length), not a NUL-terminated C string.
+// - It does not take an optional endptr argument. It does not allow a partial
+// parse: it returns an error unless all of s is consumed.
+// - It does not allow whitespace, leading or otherwise.
+// - It does not allow a leading '+' or '-'.
+// - It does not take a base argument (e.g. base 10 vs base 16). Instead, it
+// always accepts both decimal (e.g "1234", "0d5678") and hexadecimal (e.g.
+// "0x9aBC"). The caller is responsible for prior filtering of e.g. hex
+// numbers if they are unwanted. For example, Wuffs' JSON decoder will only
+// produce a wuffs_base__token for decimal numbers, not hexadecimal.
+// - It is not affected by i18n / l10n settings such as environment variables.
+//
+// The options argument can change these, but by default, it:
+// - Rejects underscores. With an explicit opt-in, "__0D_1_002" would
+// successfully parse as "one thousand and two". Underscores are still
+// rejected inside the optional 2-byte opening "0d" or "0X" that denotes
+// base-10 or base-16.
+// - Rejects unnecessary leading zeroes: "00" and "0644".
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 //
+wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options);
+
+// --------
+
+// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL is the string length of
+// "-9223372036854775808" and "+9223372036854775807", INT64_MIN and INT64_MAX.
+#define WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL 20
+
+// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL is the string length of
+// "+18446744073709551615", UINT64_MAX.
+#define WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL 21
+
+// wuffs_base__render_number_f64 writes the decimal encoding of x to dst and
+// returns the number of bytes written. If dst is shorter than the entire
+// encoding, it returns 0 (and no bytes are written).
+//
+// For those familiar with C's printf or Go's fmt.Printf functions:
+// - "%e" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT option.
+// - "%f" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT option.
+// - "%g" means neither or both bits are set.
+//
+// The precision argument controls the number of digits rendered, excluding the
+// exponent (the "e+05" in "1.23e+05"):
+// - for "%e" and "%f" it is the number of digits after the decimal separator,
+// - for "%g" it is the number of significant digits (and trailing zeroes are
+// removed).
+//
+// A precision of 6 gives similar output to printf's defaults.
+//
+// A precision greater than 4095 is equivalent to 4095.
+//
+// The precision argument is ignored when the
+// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION option is set. This is
+// similar to Go's strconv.FormatFloat with a negative (i.e. non-sensical)
+// precision, but there is no corresponding feature in C's printf.
+//
+// Extreme values of x will be rendered as "NaN", "Inf" (or "+Inf" if the
+// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN option is set) or "-Inf".
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__FLOATCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_f64(wuffs_base__slice_u8 dst,
+ double x,
+ uint32_t precision,
+ uint32_t options);
+
+// wuffs_base__render_number_i64 writes the decimal encoding of x to dst and
+// returns the number of bytes written. If dst is shorter than the entire
+// encoding, it returns 0 (and no bytes are written).
+//
+// dst will never be too short if its length is at least 20, also known as
+// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_i64(wuffs_base__slice_u8 dst,
+ int64_t x,
+ uint32_t options);
+
+// wuffs_base__render_number_u64 writes the decimal encoding of x to dst and
+// returns the number of bytes written. If dst is shorter than the entire
+// encoding, it returns 0 (and no bytes are written).
+//
+// dst will never be too short if its length is at least 21, also known as
+// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_u64(wuffs_base__slice_u8 dst,
+ uint64_t x,
+ uint32_t options);
+
+// ---------------- Base-16
+
+// Options (bitwise or'ed together) for wuffs_base__base_16__xxx functions.
+
+#define WUFFS_BASE__BASE_16__DEFAULT_OPTIONS ((uint32_t)0x00000000)
+
+// wuffs_base__base_16__decode2 converts "6A6b" to "jk", where e.g. 'j' is
+// U+006A. There are 2 src bytes for every dst byte.
+//
+// It assumes that the src bytes are two hexadecimal digits (0-9, A-F, a-f),
+// repeated. It may write nonsense bytes if not, although it will not read or
+// write out of bounds.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options);
+
+// wuffs_base__base_16__decode4 converts both "\\x6A\\x6b" and "??6a??6B" to
+// "jk", where e.g. 'j' is U+006A. There are 4 src bytes for every dst byte.
+//
+// It assumes that the src bytes are two ignored bytes and then two hexadecimal
+// digits (0-9, A-F, a-f), repeated. It may write nonsense bytes if not,
+// although it will not read or write out of bounds.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options);
+
+// wuffs_base__base_16__encode2 converts "jk" to "6A6B", where e.g. 'j' is
+// U+006A. There are 2 dst bytes for every src byte.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options);
+
+// wuffs_base__base_16__encode4 converts "jk" to "\\x6A\\x6B", where e.g. 'j'
+// is U+006A. There are 4 dst bytes for every src byte.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options);
+
+// ---------------- Base-64
+
+// Options (bitwise or'ed together) for wuffs_base__base_64__xxx functions.
+
+#define WUFFS_BASE__BASE_64__DEFAULT_OPTIONS ((uint32_t)0x00000000)
+
+// WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING means that, when decoding base-64,
+// the input may (but does not need to) be padded with '=' bytes so that the
+// overall encoded length in bytes is a multiple of 4. A successful decoding
+// will return a num_src that includes those padding bytes.
+//
+// Excess padding (e.g. three final '='s) will be rejected as bad data.
+#define WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING ((uint32_t)0x00000001)
+
+// WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING means that, when encoding base-64,
+// the output will be padded with '=' bytes so that the overall encoded length
+// in bytes is a multiple of 4.
+#define WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING ((uint32_t)0x00000002)
+
+// WUFFS_BASE__BASE_64__URL_ALPHABET means that, for base-64, the URL-friendly
+// and file-name-friendly alphabet be used, as per RFC 4648 section 5. When
+// this option bit is off, the standard alphabet from section 4 is used.
+#define WUFFS_BASE__BASE_64__URL_ALPHABET ((uint32_t)0x00000100)
+
+// wuffs_base__base_64__decode transforms base-64 encoded bytes from src to
+// arbitrary bytes in dst.
+//
+// It will not permit line breaks or other whitespace in src. Filtering those
+// out is the responsibility of the caller.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_64__decode(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options);
+
+// wuffs_base__base_64__encode transforms arbitrary bytes from src to base-64
+// encoded bytes in dst.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_64__encode(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options);
+
+// ---------------- Unicode and UTF-8
+
+#define WUFFS_BASE__UNICODE_CODE_POINT__MIN_INCL 0x00000000
+#define WUFFS_BASE__UNICODE_CODE_POINT__MAX_INCL 0x0010FFFF
+
+#define WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER 0x0000FFFD
+
+#define WUFFS_BASE__UNICODE_SURROGATE__MIN_INCL 0x0000D800
+#define WUFFS_BASE__UNICODE_SURROGATE__MAX_INCL 0x0000DFFF
+
+#define WUFFS_BASE__ASCII__MIN_INCL 0x00
+#define WUFFS_BASE__ASCII__MAX_INCL 0x7F
+
+#define WUFFS_BASE__UTF_8__BYTE_LENGTH__MIN_INCL 1
+#define WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL 4
+
+#define WUFFS_BASE__UTF_8__BYTE_LENGTH_1__CODE_POINT__MIN_INCL 0x00000000
+#define WUFFS_BASE__UTF_8__BYTE_LENGTH_1__CODE_POINT__MAX_INCL 0x0000007F
+#define WUFFS_BASE__UTF_8__BYTE_LENGTH_2__CODE_POINT__MIN_INCL 0x00000080
+#define WUFFS_BASE__UTF_8__BYTE_LENGTH_2__CODE_POINT__MAX_INCL 0x000007FF
+#define WUFFS_BASE__UTF_8__BYTE_LENGTH_3__CODE_POINT__MIN_INCL 0x00000800
+#define WUFFS_BASE__UTF_8__BYTE_LENGTH_3__CODE_POINT__MAX_INCL 0x0000FFFF
+#define WUFFS_BASE__UTF_8__BYTE_LENGTH_4__CODE_POINT__MIN_INCL 0x00010000
+#define WUFFS_BASE__UTF_8__BYTE_LENGTH_4__CODE_POINT__MAX_INCL 0x0010FFFF
+
+// --------
+
+// wuffs_base__utf_8__next__output is the type returned by
+// wuffs_base__utf_8__next.
+typedef struct wuffs_base__utf_8__next__output__struct {
+ uint32_t code_point;
+ uint32_t byte_length;
+
+#ifdef __cplusplus
+ inline bool is_valid() const;
+#endif // __cplusplus
+
+} wuffs_base__utf_8__next__output;
+
+static inline wuffs_base__utf_8__next__output //
+wuffs_base__make_utf_8__next__output(uint32_t code_point,
+ uint32_t byte_length) {
+ wuffs_base__utf_8__next__output ret;
+ ret.code_point = code_point;
+ ret.byte_length = byte_length;
+ return ret;
+}
+
+static inline bool //
+wuffs_base__utf_8__next__output__is_valid(
+ const wuffs_base__utf_8__next__output* o) {
+ if (o) {
+ uint32_t cp = o->code_point;
+ switch (o->byte_length) {
+ case 1:
+ return (cp <= 0x7F);
+ case 2:
+ return (0x080 <= cp) && (cp <= 0x7FF);
+ case 3:
+ // Avoid the 0xD800 ..= 0xDFFF surrogate range.
+ return ((0x0800 <= cp) && (cp <= 0xD7FF)) ||
+ ((0xE000 <= cp) && (cp <= 0xFFFF));
+ case 4:
+ return (0x00010000 <= cp) && (cp <= 0x0010FFFF);
+ }
+ }
+ return false;
+}
+
+#ifdef __cplusplus
+
+inline bool //
+wuffs_base__utf_8__next__output::is_valid() const {
+ return wuffs_base__utf_8__next__output__is_valid(this);
+}
+
+#endif // __cplusplus
+
+// --------
+
+// wuffs_base__utf_8__encode writes the UTF-8 encoding of code_point to s and
+// returns the number of bytes written. If code_point is invalid, or if s is
+// shorter than the entire encoding, it returns 0 (and no bytes are written).
+//
+// s will never be too short if its length is at least 4, also known as
+// WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
+// WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point);
+
+// wuffs_base__utf_8__next returns the next UTF-8 code point (and that code
+// point's byte length) at the start of the read-only slice (s_ptr, s_len).
+//
+// There are exactly two cases in which this function returns something where
+// wuffs_base__utf_8__next__output__is_valid is false:
+// - If s is empty then it returns {.code_point=0, .byte_length=0}.
+// - If s is non-empty and starts with invalid UTF-8 then it returns
+// {.code_point=WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, .byte_length=1}.
+//
+// Otherwise, it returns something where
+// wuffs_base__utf_8__next__output__is_valid is true.
+//
+// In any case, it always returns an output that satisfies both of:
+// - (output.code_point <= WUFFS_BASE__UNICODE_CODE_POINT__MAX_INCL).
+// - (output.byte_length <= s_len).
+//
+// If s is a sub-slice of a larger slice of valid UTF-8, but that sub-slice
+// boundary occurs in the middle of a multi-byte UTF-8 encoding of a single
+// code point, then this function may return something invalid. It is the
+// caller's responsibility to split on or otherwise manage UTF-8 boundaries.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
+// WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output //
+wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len);
+
+// wuffs_base__utf_8__next_from_end is like wuffs_base__utf_8__next except that
+// it looks at the end of (s_ptr, s_len) instead of the start.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
+// WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output //
+wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len);
+
+// wuffs_base__utf_8__longest_valid_prefix returns the largest n such that the
+// sub-slice s[..n] is valid UTF-8, where s is the read-only slice (s_ptr,
+// s_len).
+//
+// In particular, it returns s_len if and only if all of s is valid UTF-8.
+//
+// If s is a sub-slice of a larger slice of valid UTF-8, but that sub-slice
+// boundary occurs in the middle of a multi-byte UTF-8 encoding of a single
+// code point, then this function will return less than s_len. It is the
+// caller's responsibility to split on or otherwise manage UTF-8 boundaries.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
+// WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len);
+
+// wuffs_base__ascii__longest_valid_prefix returns the largest n such that the
+// sub-slice s[..n] is valid ASCII, where s is the read-only slice (s_ptr,
+// s_len).
+//
+// In particular, it returns s_len if and only if all of s is valid ASCII.
+// Equivalently, when none of the bytes in s have the 0x80 high bit set.
+//
+// For modular builds that divide the base module into sub-modules, using this
+// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
+// WUFFS_CONFIG__MODULE__BASE__CORE.
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len);
+
+// ---------------- Interface Declarations.
+
+// For modular builds that divide the base module into sub-modules, using these
+// functions require the WUFFS_CONFIG__MODULE__BASE__INTERFACES sub-module, not
+// just WUFFS_CONFIG__MODULE__BASE__CORE.
+
+// --------
+
+extern const char wuffs_base__hasher_u32__vtable_name[];
+
+typedef struct wuffs_base__hasher_u32__func_ptrs__struct {
+ wuffs_base__empty_struct (*set_quirk_enabled)(
+ void* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+ uint32_t (*update_u32)(
+ void* self,
+ wuffs_base__slice_u8 a_x);
+} wuffs_base__hasher_u32__func_ptrs;
+
+typedef struct wuffs_base__hasher_u32__struct wuffs_base__hasher_u32;
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_base__hasher_u32__set_quirk_enabled(
+ wuffs_base__hasher_u32* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_base__hasher_u32__update_u32(
+ wuffs_base__hasher_u32* self,
+ wuffs_base__slice_u8 a_x);
+
+#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+struct wuffs_base__hasher_u32__struct {
+ struct {
+ uint32_t magic;
+ uint32_t active_coroutine;
+ wuffs_base__vtable first_vtable;
+ } private_impl;
+
+#ifdef __cplusplus
+#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+ using unique_ptr = std::unique_ptr<wuffs_base__hasher_u32, decltype(&free)>;
+#endif
+
+ inline wuffs_base__empty_struct
+ set_quirk_enabled(
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_base__hasher_u32__set_quirk_enabled(
+ this, a_quirk, a_enabled);
+ }
+
+ inline uint32_t
+ update_u32(
+ wuffs_base__slice_u8 a_x) {
+ return wuffs_base__hasher_u32__update_u32(
+ this, a_x);
+ }
+
+#endif // __cplusplus
+}; // struct wuffs_base__hasher_u32__struct
+
+#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+// --------
+
+extern const char wuffs_base__image_decoder__vtable_name[];
+
+typedef struct wuffs_base__image_decoder__func_ptrs__struct {
+ wuffs_base__status (*decode_frame)(
+ void* self,
+ wuffs_base__pixel_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__pixel_blend a_blend,
+ wuffs_base__slice_u8 a_workbuf,
+ wuffs_base__decode_frame_options* a_opts);
+ wuffs_base__status (*decode_frame_config)(
+ void* self,
+ wuffs_base__frame_config* a_dst,
+ wuffs_base__io_buffer* a_src);
+ wuffs_base__status (*decode_image_config)(
+ void* self,
+ wuffs_base__image_config* a_dst,
+ wuffs_base__io_buffer* a_src);
+ wuffs_base__rect_ie_u32 (*frame_dirty_rect)(
+ const void* self);
+ uint32_t (*num_animation_loops)(
+ const void* self);
+ uint64_t (*num_decoded_frame_configs)(
+ const void* self);
+ uint64_t (*num_decoded_frames)(
+ const void* self);
+ wuffs_base__status (*restart_frame)(
+ void* self,
+ uint64_t a_index,
+ uint64_t a_io_position);
+ wuffs_base__empty_struct (*set_quirk_enabled)(
+ void* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+ wuffs_base__empty_struct (*set_report_metadata)(
+ void* self,
+ uint32_t a_fourcc,
+ bool a_report);
+ wuffs_base__status (*tell_me_more)(
+ void* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__more_information* a_minfo,
+ wuffs_base__io_buffer* a_src);
+ wuffs_base__range_ii_u64 (*workbuf_len)(
+ const void* self);
+} wuffs_base__image_decoder__func_ptrs;
+
+typedef struct wuffs_base__image_decoder__struct wuffs_base__image_decoder;
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__image_decoder__decode_frame(
+ wuffs_base__image_decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__pixel_blend a_blend,
+ wuffs_base__slice_u8 a_workbuf,
+ wuffs_base__decode_frame_options* a_opts);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__image_decoder__decode_frame_config(
+ wuffs_base__image_decoder* self,
+ wuffs_base__frame_config* a_dst,
+ wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__image_decoder__decode_image_config(
+ wuffs_base__image_decoder* self,
+ wuffs_base__image_config* a_dst,
+ wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
+wuffs_base__image_decoder__frame_dirty_rect(
+ const wuffs_base__image_decoder* self);
+
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_base__image_decoder__num_animation_loops(
+ const wuffs_base__image_decoder* self);
+
+WUFFS_BASE__MAYBE_STATIC uint64_t
+wuffs_base__image_decoder__num_decoded_frame_configs(
+ const wuffs_base__image_decoder* self);
+
+WUFFS_BASE__MAYBE_STATIC uint64_t
+wuffs_base__image_decoder__num_decoded_frames(
+ const wuffs_base__image_decoder* self);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__image_decoder__restart_frame(
+ wuffs_base__image_decoder* self,
+ uint64_t a_index,
+ uint64_t a_io_position);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_base__image_decoder__set_quirk_enabled(
+ wuffs_base__image_decoder* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_base__image_decoder__set_report_metadata(
+ wuffs_base__image_decoder* self,
+ uint32_t a_fourcc,
+ bool a_report);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__image_decoder__tell_me_more(
+ wuffs_base__image_decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__more_information* a_minfo,
+ wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_base__image_decoder__workbuf_len(
+ const wuffs_base__image_decoder* self);
+
+#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+struct wuffs_base__image_decoder__struct {
+ struct {
+ uint32_t magic;
+ uint32_t active_coroutine;
+ wuffs_base__vtable first_vtable;
+ } private_impl;
+
+#ifdef __cplusplus
+#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+ using unique_ptr = std::unique_ptr<wuffs_base__image_decoder, decltype(&free)>;
+#endif
+
+ inline wuffs_base__status
+ decode_frame(
+ wuffs_base__pixel_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__pixel_blend a_blend,
+ wuffs_base__slice_u8 a_workbuf,
+ wuffs_base__decode_frame_options* a_opts) {
+ return wuffs_base__image_decoder__decode_frame(
+ this, a_dst, a_src, a_blend, a_workbuf, a_opts);
+ }
+
+ inline wuffs_base__status
+ decode_frame_config(
+ wuffs_base__frame_config* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ return wuffs_base__image_decoder__decode_frame_config(
+ this, a_dst, a_src);
+ }
+
+ inline wuffs_base__status
+ decode_image_config(
+ wuffs_base__image_config* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ return wuffs_base__image_decoder__decode_image_config(
+ this, a_dst, a_src);
+ }
+
+ inline wuffs_base__rect_ie_u32
+ frame_dirty_rect() const {
+ return wuffs_base__image_decoder__frame_dirty_rect(this);
+ }
+
+ inline uint32_t
+ num_animation_loops() const {
+ return wuffs_base__image_decoder__num_animation_loops(this);
+ }
+
+ inline uint64_t
+ num_decoded_frame_configs() const {
+ return wuffs_base__image_decoder__num_decoded_frame_configs(this);
+ }
+
+ inline uint64_t
+ num_decoded_frames() const {
+ return wuffs_base__image_decoder__num_decoded_frames(this);
+ }
+
+ inline wuffs_base__status
+ restart_frame(
+ uint64_t a_index,
+ uint64_t a_io_position) {
+ return wuffs_base__image_decoder__restart_frame(
+ this, a_index, a_io_position);
+ }
+
+ inline wuffs_base__empty_struct
+ set_quirk_enabled(
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_base__image_decoder__set_quirk_enabled(
+ this, a_quirk, a_enabled);
+ }
+
+ inline wuffs_base__empty_struct
+ set_report_metadata(
+ uint32_t a_fourcc,
+ bool a_report) {
+ return wuffs_base__image_decoder__set_report_metadata(
+ this, a_fourcc, a_report);
+ }
+
+ inline wuffs_base__status
+ tell_me_more(
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__more_information* a_minfo,
+ wuffs_base__io_buffer* a_src) {
+ return wuffs_base__image_decoder__tell_me_more(
+ this, a_dst, a_minfo, a_src);
+ }
+
+ inline wuffs_base__range_ii_u64
+ workbuf_len() const {
+ return wuffs_base__image_decoder__workbuf_len(this);
+ }
+
+#endif // __cplusplus
+}; // struct wuffs_base__image_decoder__struct
+
+#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+// --------
+
+extern const char wuffs_base__io_transformer__vtable_name[];
+
+typedef struct wuffs_base__io_transformer__func_ptrs__struct {
+ wuffs_base__empty_struct (*set_quirk_enabled)(
+ void* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+ wuffs_base__status (*transform_io)(
+ void* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf);
+ wuffs_base__range_ii_u64 (*workbuf_len)(
+ const void* self);
+} wuffs_base__io_transformer__func_ptrs;
+
+typedef struct wuffs_base__io_transformer__struct wuffs_base__io_transformer;
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_base__io_transformer__set_quirk_enabled(
+ wuffs_base__io_transformer* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__io_transformer__transform_io(
+ wuffs_base__io_transformer* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_base__io_transformer__workbuf_len(
+ const wuffs_base__io_transformer* self);
+
+#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+struct wuffs_base__io_transformer__struct {
+ struct {
+ uint32_t magic;
+ uint32_t active_coroutine;
+ wuffs_base__vtable first_vtable;
+ } private_impl;
+
+#ifdef __cplusplus
+#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+ using unique_ptr = std::unique_ptr<wuffs_base__io_transformer, decltype(&free)>;
+#endif
+
+ inline wuffs_base__empty_struct
+ set_quirk_enabled(
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_base__io_transformer__set_quirk_enabled(
+ this, a_quirk, a_enabled);
+ }
+
+ inline wuffs_base__status
+ transform_io(
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf) {
+ return wuffs_base__io_transformer__transform_io(
+ this, a_dst, a_src, a_workbuf);
+ }
+
+ inline wuffs_base__range_ii_u64
+ workbuf_len() const {
+ return wuffs_base__io_transformer__workbuf_len(this);
+ }
+
+#endif // __cplusplus
+}; // struct wuffs_base__io_transformer__struct
+
+#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+// --------
+
+extern const char wuffs_base__token_decoder__vtable_name[];
+
+typedef struct wuffs_base__token_decoder__func_ptrs__struct {
+ wuffs_base__status (*decode_tokens)(
+ void* self,
+ wuffs_base__token_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf);
+ wuffs_base__empty_struct (*set_quirk_enabled)(
+ void* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+ wuffs_base__range_ii_u64 (*workbuf_len)(
+ const void* self);
+} wuffs_base__token_decoder__func_ptrs;
+
+typedef struct wuffs_base__token_decoder__struct wuffs_base__token_decoder;
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__token_decoder__decode_tokens(
+ wuffs_base__token_decoder* self,
+ wuffs_base__token_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_base__token_decoder__set_quirk_enabled(
+ wuffs_base__token_decoder* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_base__token_decoder__workbuf_len(
+ const wuffs_base__token_decoder* self);
+
+#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+struct wuffs_base__token_decoder__struct {
+ struct {
+ uint32_t magic;
+ uint32_t active_coroutine;
+ wuffs_base__vtable first_vtable;
+ } private_impl;
+
+#ifdef __cplusplus
+#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+ using unique_ptr = std::unique_ptr<wuffs_base__token_decoder, decltype(&free)>;
+#endif
+
+ inline wuffs_base__status
+ decode_tokens(
+ wuffs_base__token_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf) {
+ return wuffs_base__token_decoder__decode_tokens(
+ this, a_dst, a_src, a_workbuf);
+ }
+
+ inline wuffs_base__empty_struct
+ set_quirk_enabled(
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_base__token_decoder__set_quirk_enabled(
+ this, a_quirk, a_enabled);
+ }
+
+ inline wuffs_base__range_ii_u64
+ workbuf_len() const {
+ return wuffs_base__token_decoder__workbuf_len(this);
+ }
+
+#endif // __cplusplus
+}; // struct wuffs_base__token_decoder__struct
+
+#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+// ----------------
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) || defined(WUFFS_NONMONOLITHIC)
+
+// ---------------- Status Codes
+
+// ---------------- Public Consts
+
+// ---------------- Struct Declarations
+
+typedef struct wuffs_adler32__hasher__struct wuffs_adler32__hasher;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// ---------------- Public Initializer Prototypes
+
+// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
+// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
+//
+// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_adler32__hasher__initialize(
+ wuffs_adler32__hasher* self,
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options);
+
+size_t
+sizeof__wuffs_adler32__hasher();
+
+// ---------------- Allocs
+
+// These functions allocate and initialize Wuffs structs. They return NULL if
+// memory allocation fails. If they return non-NULL, there is no need to call
+// wuffs_foo__bar__initialize, but the caller is responsible for eventually
+// calling free on the returned pointer. That pointer is effectively a C++
+// std::unique_ptr<T, decltype(&free)>.
+
+wuffs_adler32__hasher*
+wuffs_adler32__hasher__alloc();
+
+static inline wuffs_base__hasher_u32*
+wuffs_adler32__hasher__alloc_as__wuffs_base__hasher_u32() {
+ return (wuffs_base__hasher_u32*)(wuffs_adler32__hasher__alloc());
+}
+
+// ---------------- Upcasts
+
+static inline wuffs_base__hasher_u32*
+wuffs_adler32__hasher__upcast_as__wuffs_base__hasher_u32(
+ wuffs_adler32__hasher* p) {
+ return (wuffs_base__hasher_u32*)p;
+}
+
+// ---------------- Public Function Prototypes
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_adler32__hasher__set_quirk_enabled(
+ wuffs_adler32__hasher* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_adler32__hasher__update_u32(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+// ---------------- Struct Definitions
+
+// These structs' fields, and the sizeof them, are private implementation
+// details that aren't guaranteed to be stable across Wuffs versions.
+//
+// See https://en.wikipedia.org/wiki/Opaque_pointer#C
+
+#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+struct wuffs_adler32__hasher__struct {
+ // Do not access the private_impl's or private_data's fields directly. There
+ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
+ // the wuffs_foo__bar__baz functions.
+ //
+ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
+ // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
+
+ struct {
+ uint32_t magic;
+ uint32_t active_coroutine;
+ wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
+ wuffs_base__vtable null_vtable;
+
+ uint32_t f_state;
+ bool f_started;
+
+ wuffs_base__empty_struct (*choosy_up)(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x);
+ } private_impl;
+
+#ifdef __cplusplus
+#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+ using unique_ptr = std::unique_ptr<wuffs_adler32__hasher, decltype(&free)>;
+
+ // On failure, the alloc_etc functions return nullptr. They don't throw.
+
+ static inline unique_ptr
+ alloc() {
+ return unique_ptr(wuffs_adler32__hasher__alloc(), &free);
+ }
+
+ static inline wuffs_base__hasher_u32::unique_ptr
+ alloc_as__wuffs_base__hasher_u32() {
+ return wuffs_base__hasher_u32::unique_ptr(
+ wuffs_adler32__hasher__alloc_as__wuffs_base__hasher_u32(), &free);
+ }
+#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+
+#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+ // Disallow constructing or copying an object via standard C++ mechanisms,
+ // e.g. the "new" operator, as this struct is intentionally opaque. Its total
+ // size and field layout is not part of the public, stable, memory-safe API.
+ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
+ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
+ // their first argument) rather than tweaking bar.private_impl.qux fields.
+ //
+ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
+ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
+ // order to provide convenience methods. These forward on "this", so that you
+ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
+ wuffs_adler32__hasher__struct() = delete;
+ wuffs_adler32__hasher__struct(const wuffs_adler32__hasher__struct&) = delete;
+ wuffs_adler32__hasher__struct& operator=(
+ const wuffs_adler32__hasher__struct&) = delete;
+#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+
+#if !defined(WUFFS_IMPLEMENTATION)
+ // As above, the size of the struct is not part of the public API, and unless
+ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
+ // allocated, not stack allocated. Its size is not intended to be known at
+ // compile time, but it is unfortunately divulged as a side effect of
+ // defining C++ convenience methods. Use "sizeof__T()", calling the function,
+ // instead of "sizeof T", invoking the operator. To make the two values
+ // different, so that passing the latter will be rejected by the initialize
+ // function, we add an arbitrary amount of dead weight.
+ uint8_t dead_weight[123000000]; // 123 MB.
+#endif // !defined(WUFFS_IMPLEMENTATION)
+
+ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+ initialize(
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options) {
+ return wuffs_adler32__hasher__initialize(
+ this, sizeof_star_self, wuffs_version, options);
+ }
+
+ inline wuffs_base__hasher_u32*
+ upcast_as__wuffs_base__hasher_u32() {
+ return (wuffs_base__hasher_u32*)this;
+ }
+
+ inline wuffs_base__empty_struct
+ set_quirk_enabled(
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_adler32__hasher__set_quirk_enabled(this, a_quirk, a_enabled);
+ }
+
+ inline uint32_t
+ update_u32(
+ wuffs_base__slice_u8 a_x) {
+ return wuffs_adler32__hasher__update_u32(this, a_x);
+ }
+
+#endif // __cplusplus
+}; // struct wuffs_adler32__hasher__struct
+
+#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) || defined(WUFFS_NONMONOLITHIC)
+
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC)
+
+// ---------------- Status Codes
+
+// ---------------- Public Consts
+
+// ---------------- Struct Declarations
+
+typedef struct wuffs_crc32__ieee_hasher__struct wuffs_crc32__ieee_hasher;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// ---------------- Public Initializer Prototypes
+
+// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
+// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
+//
+// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_crc32__ieee_hasher__initialize(
+ wuffs_crc32__ieee_hasher* self,
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options);
+
+size_t
+sizeof__wuffs_crc32__ieee_hasher();
+
+// ---------------- Allocs
+
+// These functions allocate and initialize Wuffs structs. They return NULL if
+// memory allocation fails. If they return non-NULL, there is no need to call
+// wuffs_foo__bar__initialize, but the caller is responsible for eventually
+// calling free on the returned pointer. That pointer is effectively a C++
+// std::unique_ptr<T, decltype(&free)>.
+
+wuffs_crc32__ieee_hasher*
+wuffs_crc32__ieee_hasher__alloc();
+
+static inline wuffs_base__hasher_u32*
+wuffs_crc32__ieee_hasher__alloc_as__wuffs_base__hasher_u32() {
+ return (wuffs_base__hasher_u32*)(wuffs_crc32__ieee_hasher__alloc());
+}
+
+// ---------------- Upcasts
+
+static inline wuffs_base__hasher_u32*
+wuffs_crc32__ieee_hasher__upcast_as__wuffs_base__hasher_u32(
+ wuffs_crc32__ieee_hasher* p) {
+ return (wuffs_base__hasher_u32*)p;
+}
+
+// ---------------- Public Function Prototypes
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__set_quirk_enabled(
+ wuffs_crc32__ieee_hasher* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_crc32__ieee_hasher__update_u32(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+// ---------------- Struct Definitions
+
+// These structs' fields, and the sizeof them, are private implementation
+// details that aren't guaranteed to be stable across Wuffs versions.
+//
+// See https://en.wikipedia.org/wiki/Opaque_pointer#C
+
+#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+struct wuffs_crc32__ieee_hasher__struct {
+ // Do not access the private_impl's or private_data's fields directly. There
+ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
+ // the wuffs_foo__bar__baz functions.
+ //
+ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
+ // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
+
+ struct {
+ uint32_t magic;
+ uint32_t active_coroutine;
+ wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
+ wuffs_base__vtable null_vtable;
+
+ uint32_t f_state;
+
+ wuffs_base__empty_struct (*choosy_up)(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x);
+ } private_impl;
+
+#ifdef __cplusplus
+#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+ using unique_ptr = std::unique_ptr<wuffs_crc32__ieee_hasher, decltype(&free)>;
+
+ // On failure, the alloc_etc functions return nullptr. They don't throw.
+
+ static inline unique_ptr
+ alloc() {
+ return unique_ptr(wuffs_crc32__ieee_hasher__alloc(), &free);
+ }
+
+ static inline wuffs_base__hasher_u32::unique_ptr
+ alloc_as__wuffs_base__hasher_u32() {
+ return wuffs_base__hasher_u32::unique_ptr(
+ wuffs_crc32__ieee_hasher__alloc_as__wuffs_base__hasher_u32(), &free);
+ }
+#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+
+#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+ // Disallow constructing or copying an object via standard C++ mechanisms,
+ // e.g. the "new" operator, as this struct is intentionally opaque. Its total
+ // size and field layout is not part of the public, stable, memory-safe API.
+ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
+ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
+ // their first argument) rather than tweaking bar.private_impl.qux fields.
+ //
+ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
+ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
+ // order to provide convenience methods. These forward on "this", so that you
+ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
+ wuffs_crc32__ieee_hasher__struct() = delete;
+ wuffs_crc32__ieee_hasher__struct(const wuffs_crc32__ieee_hasher__struct&) = delete;
+ wuffs_crc32__ieee_hasher__struct& operator=(
+ const wuffs_crc32__ieee_hasher__struct&) = delete;
+#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+
+#if !defined(WUFFS_IMPLEMENTATION)
+ // As above, the size of the struct is not part of the public API, and unless
+ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
+ // allocated, not stack allocated. Its size is not intended to be known at
+ // compile time, but it is unfortunately divulged as a side effect of
+ // defining C++ convenience methods. Use "sizeof__T()", calling the function,
+ // instead of "sizeof T", invoking the operator. To make the two values
+ // different, so that passing the latter will be rejected by the initialize
+ // function, we add an arbitrary amount of dead weight.
+ uint8_t dead_weight[123000000]; // 123 MB.
+#endif // !defined(WUFFS_IMPLEMENTATION)
+
+ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+ initialize(
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options) {
+ return wuffs_crc32__ieee_hasher__initialize(
+ this, sizeof_star_self, wuffs_version, options);
+ }
+
+ inline wuffs_base__hasher_u32*
+ upcast_as__wuffs_base__hasher_u32() {
+ return (wuffs_base__hasher_u32*)this;
+ }
+
+ inline wuffs_base__empty_struct
+ set_quirk_enabled(
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_crc32__ieee_hasher__set_quirk_enabled(this, a_quirk, a_enabled);
+ }
+
+ inline uint32_t
+ update_u32(
+ wuffs_base__slice_u8 a_x) {
+ return wuffs_crc32__ieee_hasher__update_u32(this, a_x);
+ }
+
+#endif // __cplusplus
+}; // struct wuffs_crc32__ieee_hasher__struct
+
+#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC)
+
+// ---------------- Status Codes
+
+extern const char wuffs_deflate__error__bad_huffman_code_over_subscribed[];
+extern const char wuffs_deflate__error__bad_huffman_code_under_subscribed[];
+extern const char wuffs_deflate__error__bad_huffman_code_length_count[];
+extern const char wuffs_deflate__error__bad_huffman_code_length_repetition[];
+extern const char wuffs_deflate__error__bad_huffman_code[];
+extern const char wuffs_deflate__error__bad_huffman_minimum_code_length[];
+extern const char wuffs_deflate__error__bad_block[];
+extern const char wuffs_deflate__error__bad_distance[];
+extern const char wuffs_deflate__error__bad_distance_code_count[];
+extern const char wuffs_deflate__error__bad_literal_length_code_count[];
+extern const char wuffs_deflate__error__inconsistent_stored_block_length[];
+extern const char wuffs_deflate__error__missing_end_of_block_code[];
+extern const char wuffs_deflate__error__no_huffman_codes[];
+extern const char wuffs_deflate__error__truncated_input[];
+
+// ---------------- Public Consts
+
+#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1
+
+// ---------------- Struct Declarations
+
+typedef struct wuffs_deflate__decoder__struct wuffs_deflate__decoder;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// ---------------- Public Initializer Prototypes
+
+// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
+// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
+//
+// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_deflate__decoder__initialize(
+ wuffs_deflate__decoder* self,
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options);
+
+size_t
+sizeof__wuffs_deflate__decoder();
+
+// ---------------- Allocs
+
+// These functions allocate and initialize Wuffs structs. They return NULL if
+// memory allocation fails. If they return non-NULL, there is no need to call
+// wuffs_foo__bar__initialize, but the caller is responsible for eventually
+// calling free on the returned pointer. That pointer is effectively a C++
+// std::unique_ptr<T, decltype(&free)>.
+
+wuffs_deflate__decoder*
+wuffs_deflate__decoder__alloc();
+
+static inline wuffs_base__io_transformer*
+wuffs_deflate__decoder__alloc_as__wuffs_base__io_transformer() {
+ return (wuffs_base__io_transformer*)(wuffs_deflate__decoder__alloc());
+}
+
+// ---------------- Upcasts
+
+static inline wuffs_base__io_transformer*
+wuffs_deflate__decoder__upcast_as__wuffs_base__io_transformer(
+ wuffs_deflate__decoder* p) {
+ return (wuffs_base__io_transformer*)p;
+}
+
+// ---------------- Public Function Prototypes
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_deflate__decoder__add_history(
+ wuffs_deflate__decoder* self,
+ wuffs_base__slice_u8 a_hist);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_deflate__decoder__set_quirk_enabled(
+ wuffs_deflate__decoder* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_deflate__decoder__workbuf_len(
+ const wuffs_deflate__decoder* self);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_deflate__decoder__transform_io(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+// ---------------- Struct Definitions
+
+// These structs' fields, and the sizeof them, are private implementation
+// details that aren't guaranteed to be stable across Wuffs versions.
+//
+// See https://en.wikipedia.org/wiki/Opaque_pointer#C
+
+#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+struct wuffs_deflate__decoder__struct {
+ // Do not access the private_impl's or private_data's fields directly. There
+ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
+ // the wuffs_foo__bar__baz functions.
+ //
+ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
+ // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
+
+ struct {
+ uint32_t magic;
+ uint32_t active_coroutine;
+ wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
+ wuffs_base__vtable null_vtable;
+
+ uint32_t f_bits;
+ uint32_t f_n_bits;
+ uint64_t f_transformed_history_count;
+ uint32_t f_history_index;
+ uint32_t f_n_huffs_bits[2];
+ bool f_end_of_block;
+
+ uint32_t p_transform_io[1];
+ uint32_t p_do_transform_io[1];
+ uint32_t p_decode_blocks[1];
+ uint32_t p_decode_uncompressed[1];
+ uint32_t p_init_dynamic_huffman[1];
+ wuffs_base__status (*choosy_decode_huffman_fast64)(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src);
+ uint32_t p_decode_huffman_slow[1];
+ } private_impl;
+
+ struct {
+ uint32_t f_huffs[2][1024];
+ uint8_t f_history[33025];
+ uint8_t f_code_lengths[320];
+
+ struct {
+ uint32_t v_final;
+ } s_decode_blocks[1];
+ struct {
+ uint32_t v_length;
+ uint64_t scratch;
+ } s_decode_uncompressed[1];
+ struct {
+ uint32_t v_bits;
+ uint32_t v_n_bits;
+ uint32_t v_n_lit;
+ uint32_t v_n_dist;
+ uint32_t v_n_clen;
+ uint32_t v_i;
+ uint32_t v_mask;
+ uint32_t v_n_extra_bits;
+ uint8_t v_rep_symbol;
+ uint32_t v_rep_count;
+ } s_init_dynamic_huffman[1];
+ struct {
+ uint32_t v_bits;
+ uint32_t v_n_bits;
+ uint32_t v_table_entry_n_bits;
+ uint32_t v_lmask;
+ uint32_t v_dmask;
+ uint32_t v_redir_top;
+ uint32_t v_redir_mask;
+ uint32_t v_length;
+ uint32_t v_dist_minus_1;
+ uint64_t scratch;
+ } s_decode_huffman_slow[1];
+ } private_data;
+
+#ifdef __cplusplus
+#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+ using unique_ptr = std::unique_ptr<wuffs_deflate__decoder, decltype(&free)>;
+
+ // On failure, the alloc_etc functions return nullptr. They don't throw.
+
+ static inline unique_ptr
+ alloc() {
+ return unique_ptr(wuffs_deflate__decoder__alloc(), &free);
+ }
+
+ static inline wuffs_base__io_transformer::unique_ptr
+ alloc_as__wuffs_base__io_transformer() {
+ return wuffs_base__io_transformer::unique_ptr(
+ wuffs_deflate__decoder__alloc_as__wuffs_base__io_transformer(), &free);
+ }
+#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+
+#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+ // Disallow constructing or copying an object via standard C++ mechanisms,
+ // e.g. the "new" operator, as this struct is intentionally opaque. Its total
+ // size and field layout is not part of the public, stable, memory-safe API.
+ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
+ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
+ // their first argument) rather than tweaking bar.private_impl.qux fields.
+ //
+ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
+ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
+ // order to provide convenience methods. These forward on "this", so that you
+ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
+ wuffs_deflate__decoder__struct() = delete;
+ wuffs_deflate__decoder__struct(const wuffs_deflate__decoder__struct&) = delete;
+ wuffs_deflate__decoder__struct& operator=(
+ const wuffs_deflate__decoder__struct&) = delete;
+#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+
+#if !defined(WUFFS_IMPLEMENTATION)
+ // As above, the size of the struct is not part of the public API, and unless
+ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
+ // allocated, not stack allocated. Its size is not intended to be known at
+ // compile time, but it is unfortunately divulged as a side effect of
+ // defining C++ convenience methods. Use "sizeof__T()", calling the function,
+ // instead of "sizeof T", invoking the operator. To make the two values
+ // different, so that passing the latter will be rejected by the initialize
+ // function, we add an arbitrary amount of dead weight.
+ uint8_t dead_weight[123000000]; // 123 MB.
+#endif // !defined(WUFFS_IMPLEMENTATION)
+
+ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+ initialize(
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options) {
+ return wuffs_deflate__decoder__initialize(
+ this, sizeof_star_self, wuffs_version, options);
+ }
+
+ inline wuffs_base__io_transformer*
+ upcast_as__wuffs_base__io_transformer() {
+ return (wuffs_base__io_transformer*)this;
+ }
+
+ inline wuffs_base__empty_struct
+ add_history(
+ wuffs_base__slice_u8 a_hist) {
+ return wuffs_deflate__decoder__add_history(this, a_hist);
+ }
+
+ inline wuffs_base__empty_struct
+ set_quirk_enabled(
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_deflate__decoder__set_quirk_enabled(this, a_quirk, a_enabled);
+ }
+
+ inline wuffs_base__range_ii_u64
+ workbuf_len() const {
+ return wuffs_deflate__decoder__workbuf_len(this);
+ }
+
+ inline wuffs_base__status
+ transform_io(
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf) {
+ return wuffs_deflate__decoder__transform_io(this, a_dst, a_src, a_workbuf);
+ }
+
+#endif // __cplusplus
+}; // struct wuffs_deflate__decoder__struct
+
+#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC)
+
+// ---------------- Status Codes
+
+extern const char wuffs_zlib__note__dictionary_required[];
+extern const char wuffs_zlib__error__bad_checksum[];
+extern const char wuffs_zlib__error__bad_compression_method[];
+extern const char wuffs_zlib__error__bad_compression_window_size[];
+extern const char wuffs_zlib__error__bad_parity_check[];
+extern const char wuffs_zlib__error__incorrect_dictionary[];
+extern const char wuffs_zlib__error__truncated_input[];
+
+// ---------------- Public Consts
+
+#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2113790976
+
+#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1
+
+// ---------------- Struct Declarations
+
+typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// ---------------- Public Initializer Prototypes
+
+// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
+// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
+//
+// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_zlib__decoder__initialize(
+ wuffs_zlib__decoder* self,
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options);
+
+size_t
+sizeof__wuffs_zlib__decoder();
+
+// ---------------- Allocs
+
+// These functions allocate and initialize Wuffs structs. They return NULL if
+// memory allocation fails. If they return non-NULL, there is no need to call
+// wuffs_foo__bar__initialize, but the caller is responsible for eventually
+// calling free on the returned pointer. That pointer is effectively a C++
+// std::unique_ptr<T, decltype(&free)>.
+
+wuffs_zlib__decoder*
+wuffs_zlib__decoder__alloc();
+
+static inline wuffs_base__io_transformer*
+wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer() {
+ return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc());
+}
+
+// ---------------- Upcasts
+
+static inline wuffs_base__io_transformer*
+wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer(
+ wuffs_zlib__decoder* p) {
+ return (wuffs_base__io_transformer*)p;
+}
+
+// ---------------- Public Function Prototypes
+
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_zlib__decoder__dictionary_id(
+ const wuffs_zlib__decoder* self);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_zlib__decoder__add_dictionary(
+ wuffs_zlib__decoder* self,
+ wuffs_base__slice_u8 a_dict);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_zlib__decoder__set_quirk_enabled(
+ wuffs_zlib__decoder* self,
+ uint32_t a_quirk,
+ bool a_enabled);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_zlib__decoder__workbuf_len(
+ const wuffs_zlib__decoder* self);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_zlib__decoder__transform_io(
+ wuffs_zlib__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+// ---------------- Struct Definitions
+
+// These structs' fields, and the sizeof them, are private implementation
+// details that aren't guaranteed to be stable across Wuffs versions.
+//
+// See https://en.wikipedia.org/wiki/Opaque_pointer#C
+
+#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+struct wuffs_zlib__decoder__struct {
+ // Do not access the private_impl's or private_data's fields directly. There
+ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
+ // the wuffs_foo__bar__baz functions.
+ //
+ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
+ // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
+
+ struct {
+ uint32_t magic;
+ uint32_t active_coroutine;
+ wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
+ wuffs_base__vtable null_vtable;
+
+ bool f_bad_call_sequence;
+ bool f_header_complete;
+ bool f_got_dictionary;
+ bool f_want_dictionary;
+ bool f_quirks[1];
+ bool f_ignore_checksum;
+ uint32_t f_dict_id_got;
+ uint32_t f_dict_id_want;
+
+ uint32_t p_transform_io[1];
+ uint32_t p_do_transform_io[1];
+ } private_impl;
+
+ struct {
+ wuffs_adler32__hasher f_checksum;
+ wuffs_adler32__hasher f_dict_id_hasher;
+ wuffs_deflate__decoder f_flate;
+
+ struct {
+ uint32_t v_checksum_got;
+ uint64_t scratch;
+ } s_do_transform_io[1];
+ } private_data;
+
+#ifdef __cplusplus
+#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+ using unique_ptr = std::unique_ptr<wuffs_zlib__decoder, decltype(&free)>;
+
+ // On failure, the alloc_etc functions return nullptr. They don't throw.
+
+ static inline unique_ptr
+ alloc() {
+ return unique_ptr(wuffs_zlib__decoder__alloc(), &free);
+ }
+
+ static inline wuffs_base__io_transformer::unique_ptr
+ alloc_as__wuffs_base__io_transformer() {
+ return wuffs_base__io_transformer::unique_ptr(
+ wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(), &free);
+ }
+#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+
+#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+ // Disallow constructing or copying an object via standard C++ mechanisms,
+ // e.g. the "new" operator, as this struct is intentionally opaque. Its total
+ // size and field layout is not part of the public, stable, memory-safe API.
+ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
+ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
+ // their first argument) rather than tweaking bar.private_impl.qux fields.
+ //
+ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
+ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
+ // order to provide convenience methods. These forward on "this", so that you
+ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
+ wuffs_zlib__decoder__struct() = delete;
+ wuffs_zlib__decoder__struct(const wuffs_zlib__decoder__struct&) = delete;
+ wuffs_zlib__decoder__struct& operator=(
+ const wuffs_zlib__decoder__struct&) = delete;
+#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+
+#if !defined(WUFFS_IMPLEMENTATION)
+ // As above, the size of the struct is not part of the public API, and unless
+ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
+ // allocated, not stack allocated. Its size is not intended to be known at
+ // compile time, but it is unfortunately divulged as a side effect of
+ // defining C++ convenience methods. Use "sizeof__T()", calling the function,
+ // instead of "sizeof T", invoking the operator. To make the two values
+ // different, so that passing the latter will be rejected by the initialize
+ // function, we add an arbitrary amount of dead weight.
+ uint8_t dead_weight[123000000]; // 123 MB.
+#endif // !defined(WUFFS_IMPLEMENTATION)
+
+ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+ initialize(
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options) {
+ return wuffs_zlib__decoder__initialize(
+ this, sizeof_star_self, wuffs_version, options);
+ }
+
+ inline wuffs_base__io_transformer*
+ upcast_as__wuffs_base__io_transformer() {
+ return (wuffs_base__io_transformer*)this;
+ }
+
+ inline uint32_t
+ dictionary_id() const {
+ return wuffs_zlib__decoder__dictionary_id(this);
+ }
+
+ inline wuffs_base__empty_struct
+ add_dictionary(
+ wuffs_base__slice_u8 a_dict) {
+ return wuffs_zlib__decoder__add_dictionary(this, a_dict);
+ }
+
+ inline wuffs_base__empty_struct
+ set_quirk_enabled(
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_zlib__decoder__set_quirk_enabled(this, a_quirk, a_enabled);
+ }
+
+ inline wuffs_base__range_ii_u64
+ workbuf_len() const {
+ return wuffs_zlib__decoder__workbuf_len(this);
+ }
+
+ inline wuffs_base__status
+ transform_io(
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf) {
+ return wuffs_zlib__decoder__transform_io(this, a_dst, a_src, a_workbuf);
+ }
+
+#endif // __cplusplus
+}; // struct wuffs_zlib__decoder__struct
+
+#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC)
+
+
+// ‼ WUFFS C HEADER ENDS HERE.
+#ifdef WUFFS_IMPLEMENTATION
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// ---------------- Fundamentals
+
+// WUFFS_BASE__MAGIC is a magic number to check that initializers are called.
+// It's not foolproof, given C doesn't automatically zero memory before use,
+// but it should catch 99.99% of cases.
+//
+// Its (non-zero) value is arbitrary, based on md5sum("wuffs").
+#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71)
+
+// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable
+// error was previously encountered.
+//
+// Its (non-zero) value is arbitrary, based on md5sum("disabled").
+#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2)
+
+// Use switch cases for coroutine suspension points, similar to the technique
+// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
+//
+// The implicit fallthrough is intentional.
+//
+// We use trivial macros instead of an explicit assignment and case statement
+// so that clang-format doesn't get confused by the unusual "case"s.
+#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:;
+#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \
+ coro_susp_point = n; \
+ case n:;
+
+#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \
+ if (!status.repr) { \
+ goto ok; \
+ } else if (*status.repr != '$') { \
+ goto exit; \
+ } \
+ coro_susp_point = n; \
+ goto suspend; \
+ case n:;
+
+// The "defined(__clang__)" isn't redundant. While vanilla clang defines
+// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
+#if defined(__GNUC__) || defined(__clang__)
+#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1))
+#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0))
+#else
+#define WUFFS_BASE__LIKELY(expr) (expr)
+#define WUFFS_BASE__UNLIKELY(expr) (expr)
+#endif
+
+// --------
+
+static inline wuffs_base__empty_struct //
+wuffs_base__ignore_status(wuffs_base__status z) {
+ return wuffs_base__make_empty_struct();
+}
+
+static inline wuffs_base__status //
+wuffs_base__status__ensure_not_a_suspension(wuffs_base__status z) {
+ if (z.repr && (*z.repr == '$')) {
+ z.repr = wuffs_base__error__cannot_return_a_suspension;
+ }
+ return z;
+}
+
+// --------
+
+// wuffs_base__iterate_total_advance returns the exclusive pointer-offset at
+// which iteration should stop. The overall slice has length total_len, each
+// iteration's sub-slice has length iter_len and are placed iter_advance apart.
+//
+// The iter_advance may not be larger than iter_len. The iter_advance may be
+// smaller than iter_len, in which case the sub-slices will overlap.
+//
+// The return value r satisfies ((0 <= r) && (r <= total_len)).
+//
+// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are
+// four iterations at offsets 0, 3, 6 and 9. This function returns 12.
+//
+// 0123456789012345
+// [....]
+// [....]
+// [....]
+// [....]
+// $
+// 0123456789012345
+//
+// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are
+// three iterations at offsets 0, 5 and 10. This function returns 15.
+//
+// 0123456789012345
+// [....]
+// [....]
+// [....]
+// $
+// 0123456789012345
+static inline size_t //
+wuffs_base__iterate_total_advance(size_t total_len,
+ size_t iter_len,
+ size_t iter_advance) {
+ if (total_len >= iter_len) {
+ size_t n = total_len - iter_len;
+ return ((n / iter_advance) * iter_advance) + iter_advance;
+ }
+ return 0;
+}
+
+// ---------------- Numeric Types
+
+extern const uint8_t wuffs_base__low_bits_mask__u8[8];
+extern const uint16_t wuffs_base__low_bits_mask__u16[16];
+extern const uint32_t wuffs_base__low_bits_mask__u32[32];
+extern const uint64_t wuffs_base__low_bits_mask__u64[64];
+
+#define WUFFS_BASE__LOW_BITS_MASK__U8(n) (wuffs_base__low_bits_mask__u8[n])
+#define WUFFS_BASE__LOW_BITS_MASK__U16(n) (wuffs_base__low_bits_mask__u16[n])
+#define WUFFS_BASE__LOW_BITS_MASK__U32(n) (wuffs_base__low_bits_mask__u32[n])
+#define WUFFS_BASE__LOW_BITS_MASK__U64(n) (wuffs_base__low_bits_mask__u64[n])
+
+// --------
+
+static inline void //
+wuffs_base__u8__sat_add_indirect(uint8_t* x, uint8_t y) {
+ *x = wuffs_base__u8__sat_add(*x, y);
+}
+
+static inline void //
+wuffs_base__u8__sat_sub_indirect(uint8_t* x, uint8_t y) {
+ *x = wuffs_base__u8__sat_sub(*x, y);
+}
+
+static inline void //
+wuffs_base__u16__sat_add_indirect(uint16_t* x, uint16_t y) {
+ *x = wuffs_base__u16__sat_add(*x, y);
+}
+
+static inline void //
+wuffs_base__u16__sat_sub_indirect(uint16_t* x, uint16_t y) {
+ *x = wuffs_base__u16__sat_sub(*x, y);
+}
+
+static inline void //
+wuffs_base__u32__sat_add_indirect(uint32_t* x, uint32_t y) {
+ *x = wuffs_base__u32__sat_add(*x, y);
+}
+
+static inline void //
+wuffs_base__u32__sat_sub_indirect(uint32_t* x, uint32_t y) {
+ *x = wuffs_base__u32__sat_sub(*x, y);
+}
+
+static inline void //
+wuffs_base__u64__sat_add_indirect(uint64_t* x, uint64_t y) {
+ *x = wuffs_base__u64__sat_add(*x, y);
+}
+
+static inline void //
+wuffs_base__u64__sat_sub_indirect(uint64_t* x, uint64_t y) {
+ *x = wuffs_base__u64__sat_sub(*x, y);
+}
+
+// ---------------- Slices and Tables
+
+// wuffs_base__slice_u8__prefix returns up to the first up_to bytes of s.
+static inline wuffs_base__slice_u8 //
+wuffs_base__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) {
+ if (((uint64_t)(s.len)) > up_to) {
+ s.len = ((size_t)up_to);
+ }
+ return s;
+}
+
+// wuffs_base__slice_u8__suffix returns up to the last up_to bytes of s.
+static inline wuffs_base__slice_u8 //
+wuffs_base__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) {
+ if (((uint64_t)(s.len)) > up_to) {
+ s.ptr += ((uint64_t)(s.len)) - up_to;
+ s.len = ((size_t)up_to);
+ }
+ return s;
+}
+
+// wuffs_base__slice_u8__copy_from_slice calls memmove(dst.ptr, src.ptr, len)
+// where len is the minimum of dst.len and src.len.
+//
+// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty
+// slice) is valid and results in a no-op.
+static inline uint64_t //
+wuffs_base__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src) {
+ size_t len = dst.len < src.len ? dst.len : src.len;
+ if (len > 0) {
+ memmove(dst.ptr, src.ptr, len);
+ }
+ return len;
+}
+
+// --------
+
+static inline wuffs_base__slice_u8 //
+wuffs_base__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) {
+ if (y < t.height) {
+ return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width);
+ }
+ return wuffs_base__make_slice_u8(NULL, 0);
+}
+
+// ---------------- Slices and Tables (Utility)
+
+#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8
+
+// ---------------- Ranges and Rects
+
+static inline uint32_t //
+wuffs_base__range_ii_u32__get_min_incl(const wuffs_base__range_ii_u32* r) {
+ return r->min_incl;
+}
+
+static inline uint32_t //
+wuffs_base__range_ii_u32__get_max_incl(const wuffs_base__range_ii_u32* r) {
+ return r->max_incl;
+}
+
+static inline uint32_t //
+wuffs_base__range_ie_u32__get_min_incl(const wuffs_base__range_ie_u32* r) {
+ return r->min_incl;
+}
+
+static inline uint32_t //
+wuffs_base__range_ie_u32__get_max_excl(const wuffs_base__range_ie_u32* r) {
+ return r->max_excl;
+}
+
+static inline uint64_t //
+wuffs_base__range_ii_u64__get_min_incl(const wuffs_base__range_ii_u64* r) {
+ return r->min_incl;
+}
+
+static inline uint64_t //
+wuffs_base__range_ii_u64__get_max_incl(const wuffs_base__range_ii_u64* r) {
+ return r->max_incl;
+}
+
+static inline uint64_t //
+wuffs_base__range_ie_u64__get_min_incl(const wuffs_base__range_ie_u64* r) {
+ return r->min_incl;
+}
+
+static inline uint64_t //
+wuffs_base__range_ie_u64__get_max_excl(const wuffs_base__range_ie_u64* r) {
+ return r->max_excl;
+}
+
+// ---------------- Ranges and Rects (Utility)
+
+#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32
+#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32
+#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64
+#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64
+#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32
+#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32
+#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32
+#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32
+#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64
+#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64
+#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32
+#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32
+
+// ---------------- I/O
+
+static inline uint64_t //
+wuffs_base__io__count_since(uint64_t mark, uint64_t index) {
+ if (index >= mark) {
+ return index - mark;
+ }
+ return 0;
+}
+
+// TODO: drop the "const" in "const uint8_t* ptr". Some though required about
+// the base.io_reader.since method returning a mutable "slice base.u8".
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-qual"
+#endif
+static inline wuffs_base__slice_u8 //
+wuffs_base__io__since(uint64_t mark, uint64_t index, const uint8_t* ptr) {
+ if (index >= mark) {
+ return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark,
+ ((size_t)(index - mark)));
+ }
+ return wuffs_base__make_slice_u8(NULL, 0);
+}
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+
+// --------
+
+static inline void //
+wuffs_base__io_reader__limit(const uint8_t** ptr_io2_r,
+ const uint8_t* iop_r,
+ uint64_t limit) {
+ if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) {
+ *ptr_io2_r = iop_r + limit;
+ }
+}
+
+static inline uint32_t //
+wuffs_base__io_reader__limited_copy_u32_to_slice(const uint8_t** ptr_iop_r,
+ const uint8_t* io2_r,
+ uint32_t length,
+ wuffs_base__slice_u8 dst) {
+ const uint8_t* iop_r = *ptr_iop_r;
+ size_t n = dst.len;
+ if (n > length) {
+ n = length;
+ }
+ if (n > ((size_t)(io2_r - iop_r))) {
+ n = (size_t)(io2_r - iop_r);
+ }
+ if (n > 0) {
+ memmove(dst.ptr, iop_r, n);
+ *ptr_iop_r += n;
+ }
+ return (uint32_t)(n);
+}
+
+// wuffs_base__io_reader__match7 returns whether the io_reader's upcoming bytes
+// start with the given prefix (up to 7 bytes long). It is peek-like, not
+// read-like, in that there are no side-effects.
+//
+// The low 3 bits of a hold the prefix length, n.
+//
+// The high 56 bits of a hold the prefix itself, in little-endian order. The
+// first prefix byte is in bits 8..=15, the second prefix byte is in bits
+// 16..=23, etc. The high (8 * (7 - n)) bits are ignored.
+//
+// There are three possible return values:
+// - 0 means success.
+// - 1 means inconclusive, equivalent to "$short read".
+// - 2 means failure.
+static inline uint32_t //
+wuffs_base__io_reader__match7(const uint8_t* iop_r,
+ const uint8_t* io2_r,
+ wuffs_base__io_buffer* r,
+ uint64_t a) {
+ uint32_t n = a & 7;
+ a >>= 8;
+ if ((io2_r - iop_r) >= 8) {
+ uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r);
+ uint32_t shift = 8 * (8 - n);
+ return ((a << shift) == (x << shift)) ? 0 : 2;
+ }
+ for (; n > 0; n--) {
+ if (iop_r >= io2_r) {
+ return (r && r->meta.closed) ? 2 : 1;
+ } else if (*iop_r != ((uint8_t)(a))) {
+ return 2;
+ }
+ iop_r++;
+ a >>= 8;
+ }
+ return 0;
+}
+
+static inline wuffs_base__io_buffer* //
+wuffs_base__io_reader__set(wuffs_base__io_buffer* b,
+ const uint8_t** ptr_iop_r,
+ const uint8_t** ptr_io0_r,
+ const uint8_t** ptr_io1_r,
+ const uint8_t** ptr_io2_r,
+ wuffs_base__slice_u8 data,
+ uint64_t history_position) {
+ b->data = data;
+ b->meta.wi = data.len;
+ b->meta.ri = 0;
+ b->meta.pos = history_position;
+ b->meta.closed = false;
+
+ *ptr_iop_r = data.ptr;
+ *ptr_io0_r = data.ptr;
+ *ptr_io1_r = data.ptr;
+ *ptr_io2_r = data.ptr + data.len;
+
+ return b;
+}
+
+// --------
+
+static inline uint64_t //
+wuffs_base__io_writer__copy_from_slice(uint8_t** ptr_iop_w,
+ uint8_t* io2_w,
+ wuffs_base__slice_u8 src) {
+ uint8_t* iop_w = *ptr_iop_w;
+ size_t n = src.len;
+ if (n > ((size_t)(io2_w - iop_w))) {
+ n = (size_t)(io2_w - iop_w);
+ }
+ if (n > 0) {
+ memmove(iop_w, src.ptr, n);
+ *ptr_iop_w += n;
+ }
+ return (uint64_t)(n);
+}
+
+static inline void //
+wuffs_base__io_writer__limit(uint8_t** ptr_io2_w,
+ uint8_t* iop_w,
+ uint64_t limit) {
+ if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) {
+ *ptr_io2_w = iop_w + limit;
+ }
+}
+
+static inline uint32_t //
+wuffs_base__io_writer__limited_copy_u32_from_history(uint8_t** ptr_iop_w,
+ uint8_t* io0_w,
+ uint8_t* io2_w,
+ uint32_t length,
+ uint32_t distance) {
+ if (!distance) {
+ return 0;
+ }
+ uint8_t* p = *ptr_iop_w;
+ if ((size_t)(p - io0_w) < (size_t)(distance)) {
+ return 0;
+ }
+ uint8_t* q = p - distance;
+ size_t n = (size_t)(io2_w - p);
+ if ((size_t)(length) > n) {
+ length = (uint32_t)(n);
+ } else {
+ n = (size_t)(length);
+ }
+ // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that
+ // is mostly because 3 is the minimum length for the deflate format. This
+ // function implementation shouldn't overfit to that one format. Perhaps the
+ // limited_copy_u32_from_history Wuffs method should also take an unroll hint
+ // argument, and the cgen can look if that argument is the constant
+ // expression '3'.
+ //
+ // See also wuffs_base__io_writer__limited_copy_u32_from_history_fast below.
+ for (; n >= 3; n -= 3) {
+ *p++ = *q++;
+ *p++ = *q++;
+ *p++ = *q++;
+ }
+ for (; n; n--) {
+ *p++ = *q++;
+ }
+ *ptr_iop_w = p;
+ return length;
+}
+
+// wuffs_base__io_writer__limited_copy_u32_from_history_fast is like the
+// wuffs_base__io_writer__limited_copy_u32_from_history function above, but has
+// stronger pre-conditions.
+//
+// The caller needs to prove that:
+// - length <= (io2_w - *ptr_iop_w)
+// - distance >= 1
+// - distance <= (*ptr_iop_w - io0_w)
+static inline uint32_t //
+wuffs_base__io_writer__limited_copy_u32_from_history_fast(uint8_t** ptr_iop_w,
+ uint8_t* io0_w,
+ uint8_t* io2_w,
+ uint32_t length,
+ uint32_t distance) {
+ uint8_t* p = *ptr_iop_w;
+ uint8_t* q = p - distance;
+ uint32_t n = length;
+ for (; n >= 3; n -= 3) {
+ *p++ = *q++;
+ *p++ = *q++;
+ *p++ = *q++;
+ }
+ for (; n; n--) {
+ *p++ = *q++;
+ }
+ *ptr_iop_w = p;
+ return length;
+}
+
+// wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast
+// copies the previous byte (the one immediately before *ptr_iop_w), copying 8
+// byte chunks at a time. Each chunk contains 8 repetitions of the same byte.
+//
+// In terms of number of bytes copied, length is rounded up to a multiple of 8.
+// As a special case, a zero length rounds up to 8 (even though 0 is already a
+// multiple of 8), since there is always at least one 8 byte chunk copied.
+//
+// In terms of advancing *ptr_iop_w, length is not rounded up.
+//
+// The caller needs to prove that:
+// - (length + 8) <= (io2_w - *ptr_iop_w)
+// - distance == 1
+// - distance <= (*ptr_iop_w - io0_w)
+static inline uint32_t //
+wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
+ uint8_t** ptr_iop_w,
+ uint8_t* io0_w,
+ uint8_t* io2_w,
+ uint32_t length,
+ uint32_t distance) {
+ uint8_t* p = *ptr_iop_w;
+ uint64_t x = p[-1];
+ x |= x << 8;
+ x |= x << 16;
+ x |= x << 32;
+ uint32_t n = length;
+ while (1) {
+ wuffs_base__poke_u64le__no_bounds_check(p, x);
+ if (n <= 8) {
+ p += n;
+ break;
+ }
+ p += 8;
+ n -= 8;
+ }
+ *ptr_iop_w = p;
+ return length;
+}
+
+// wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast is
+// like the wuffs_base__io_writer__limited_copy_u32_from_history_fast function
+// above, but copies 8 byte chunks at a time.
+//
+// In terms of number of bytes copied, length is rounded up to a multiple of 8.
+// As a special case, a zero length rounds up to 8 (even though 0 is already a
+// multiple of 8), since there is always at least one 8 byte chunk copied.
+//
+// In terms of advancing *ptr_iop_w, length is not rounded up.
+//
+// The caller needs to prove that:
+// - (length + 8) <= (io2_w - *ptr_iop_w)
+// - distance >= 8
+// - distance <= (*ptr_iop_w - io0_w)
+static inline uint32_t //
+wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
+ uint8_t** ptr_iop_w,
+ uint8_t* io0_w,
+ uint8_t* io2_w,
+ uint32_t length,
+ uint32_t distance) {
+ uint8_t* p = *ptr_iop_w;
+ uint8_t* q = p - distance;
+ uint32_t n = length;
+ while (1) {
+ memcpy(p, q, 8);
+ if (n <= 8) {
+ p += n;
+ break;
+ }
+ p += 8;
+ q += 8;
+ n -= 8;
+ }
+ *ptr_iop_w = p;
+ return length;
+}
+
+static inline uint32_t //
+wuffs_base__io_writer__limited_copy_u32_from_reader(uint8_t** ptr_iop_w,
+ uint8_t* io2_w,
+ uint32_t length,
+ const uint8_t** ptr_iop_r,
+ const uint8_t* io2_r) {
+ uint8_t* iop_w = *ptr_iop_w;
+ size_t n = length;
+ if (n > ((size_t)(io2_w - iop_w))) {
+ n = (size_t)(io2_w - iop_w);
+ }
+ const uint8_t* iop_r = *ptr_iop_r;
+ if (n > ((size_t)(io2_r - iop_r))) {
+ n = (size_t)(io2_r - iop_r);
+ }
+ if (n > 0) {
+ memmove(iop_w, iop_r, n);
+ *ptr_iop_w += n;
+ *ptr_iop_r += n;
+ }
+ return (uint32_t)(n);
+}
+
+static inline uint32_t //
+wuffs_base__io_writer__limited_copy_u32_from_slice(uint8_t** ptr_iop_w,
+ uint8_t* io2_w,
+ uint32_t length,
+ wuffs_base__slice_u8 src) {
+ uint8_t* iop_w = *ptr_iop_w;
+ size_t n = src.len;
+ if (n > length) {
+ n = length;
+ }
+ if (n > ((size_t)(io2_w - iop_w))) {
+ n = (size_t)(io2_w - iop_w);
+ }
+ if (n > 0) {
+ memmove(iop_w, src.ptr, n);
+ *ptr_iop_w += n;
+ }
+ return (uint32_t)(n);
+}
+
+static inline wuffs_base__io_buffer* //
+wuffs_base__io_writer__set(wuffs_base__io_buffer* b,
+ uint8_t** ptr_iop_w,
+ uint8_t** ptr_io0_w,
+ uint8_t** ptr_io1_w,
+ uint8_t** ptr_io2_w,
+ wuffs_base__slice_u8 data,
+ uint64_t history_position) {
+ b->data = data;
+ b->meta.wi = 0;
+ b->meta.ri = 0;
+ b->meta.pos = history_position;
+ b->meta.closed = false;
+
+ *ptr_iop_w = data.ptr;
+ *ptr_io0_w = data.ptr;
+ *ptr_io1_w = data.ptr;
+ *ptr_io2_w = data.ptr + data.len;
+
+ return b;
+}
+
+// ---------------- I/O (Utility)
+
+#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader
+#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer
+
+// ---------------- Tokens
+
+// ---------------- Tokens (Utility)
+
+// ---------------- Memory Allocation
+
+// ---------------- Images
+
+WUFFS_BASE__MAYBE_STATIC uint64_t //
+wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
+ const wuffs_base__pixel_swizzler* p,
+ uint32_t up_to_num_pixels,
+ wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 dst_palette,
+ const uint8_t** ptr_iop_r,
+ const uint8_t* io2_r);
+
+WUFFS_BASE__MAYBE_STATIC uint64_t //
+wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
+ const wuffs_base__pixel_swizzler* p,
+ wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 dst_palette,
+ const uint8_t** ptr_iop_r,
+ const uint8_t* io2_r);
+
+WUFFS_BASE__MAYBE_STATIC uint64_t //
+wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(
+ const wuffs_base__pixel_swizzler* p,
+ wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 dst_palette,
+ uint64_t num_pixels);
+
+// ---------------- Images (Utility)
+
+#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format
+
+// ---------------- String Conversions
+
+// ---------------- Unicode and UTF-8
+
+// ----------------
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
+ defined(WUFFS_CONFIG__MODULE__BASE__CORE)
+
+const uint8_t wuffs_base__low_bits_mask__u8[8] = {
+ 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F,
+};
+
+const uint16_t wuffs_base__low_bits_mask__u16[16] = {
+ 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F,
+ 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF,
+};
+
+const uint32_t wuffs_base__low_bits_mask__u32[32] = {
+ 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F,
+ 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
+ 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF,
+ 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
+ 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF,
+ 0x3FFFFFFF, 0x7FFFFFFF,
+};
+
+const uint64_t wuffs_base__low_bits_mask__u64[64] = {
+ 0x0000000000000000, 0x0000000000000001, 0x0000000000000003,
+ 0x0000000000000007, 0x000000000000000F, 0x000000000000001F,
+ 0x000000000000003F, 0x000000000000007F, 0x00000000000000FF,
+ 0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF,
+ 0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF,
+ 0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF,
+ 0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF,
+ 0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF,
+ 0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF,
+ 0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF,
+ 0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF,
+ 0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF,
+ 0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF,
+ 0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF,
+ 0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF,
+ 0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF,
+ 0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF,
+ 0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF,
+ 0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF,
+ 0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF,
+ 0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF,
+ 0x7FFFFFFFFFFFFFFF,
+};
+
+const uint32_t wuffs_base__pixel_format__bits_per_channel[16] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40,
+};
+
+const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect";
+const char wuffs_base__note__end_of_data[] = "@base: end of data";
+const char wuffs_base__note__metadata_reported[] = "@base: metadata reported";
+const char wuffs_base__suspension__even_more_information[] = "$base: even more information";
+const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read";
+const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write";
+const char wuffs_base__suspension__short_read[] = "$base: short read";
+const char wuffs_base__suspension__short_write[] = "$base: short write";
+const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position";
+const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)";
+const char wuffs_base__error__bad_argument[] = "#base: bad argument";
+const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence";
+const char wuffs_base__error__bad_data[] = "#base: bad data";
+const char wuffs_base__error__bad_receiver[] = "#base: bad receiver";
+const char wuffs_base__error__bad_restart[] = "#base: bad restart";
+const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver";
+const char wuffs_base__error__bad_vtable[] = "#base: bad vtable";
+const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length";
+const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version";
+const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension";
+const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error";
+const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed";
+const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called";
+const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls";
+const char wuffs_base__error__no_more_information[] = "#base: no more information";
+const char wuffs_base__error__not_enough_data[] = "#base: not enough data";
+const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds";
+const char wuffs_base__error__unsupported_method[] = "#base: unsupported method";
+const char wuffs_base__error__unsupported_option[] = "#base: unsupported option";
+const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option";
+const char wuffs_base__error__too_much_data[] = "#base: too much data";
+
+const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32";
+const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder";
+const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer";
+const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder";
+
+#endif // !defined(WUFFS_CONFIG__MODULES) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE__CORE)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
+ defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES)
+
+// ---------------- Interface Definitions.
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_base__hasher_u32__set_quirk_enabled(
+ wuffs_base__hasher_u32* self,
+ uint32_t a_quirk,
+ bool a_enabled) {
+ if (!self) {
+ return wuffs_base__make_empty_struct();
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_empty_struct();
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
+ const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
+ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->set_quirk_enabled)(self, a_quirk, a_enabled);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_empty_struct();
+}
+
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_base__hasher_u32__update_u32(
+ wuffs_base__hasher_u32* self,
+ wuffs_base__slice_u8 a_x) {
+ if (!self) {
+ return 0;
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return 0;
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
+ const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
+ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->update_u32)(self, a_x);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return 0;
+}
+
+// --------
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__image_decoder__decode_frame(
+ wuffs_base__image_decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__pixel_blend a_blend,
+ wuffs_base__slice_u8 a_workbuf,
+ wuffs_base__decode_frame_options* a_opts) {
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_status(
+ (self->private_impl.magic == WUFFS_BASE__DISABLED)
+ ? wuffs_base__error__disabled_by_previous_error
+ : wuffs_base__error__initialize_not_called);
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_status(wuffs_base__error__bad_vtable);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__image_decoder__decode_frame_config(
+ wuffs_base__image_decoder* self,
+ wuffs_base__frame_config* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_status(
+ (self->private_impl.magic == WUFFS_BASE__DISABLED)
+ ? wuffs_base__error__disabled_by_previous_error
+ : wuffs_base__error__initialize_not_called);
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->decode_frame_config)(self, a_dst, a_src);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_status(wuffs_base__error__bad_vtable);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__image_decoder__decode_image_config(
+ wuffs_base__image_decoder* self,
+ wuffs_base__image_config* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_status(
+ (self->private_impl.magic == WUFFS_BASE__DISABLED)
+ ? wuffs_base__error__disabled_by_previous_error
+ : wuffs_base__error__initialize_not_called);
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->decode_image_config)(self, a_dst, a_src);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_status(wuffs_base__error__bad_vtable);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
+wuffs_base__image_decoder__frame_dirty_rect(
+ const wuffs_base__image_decoder* self) {
+ if (!self) {
+ return wuffs_base__utility__empty_rect_ie_u32();
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return wuffs_base__utility__empty_rect_ie_u32();
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->frame_dirty_rect)(self);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__utility__empty_rect_ie_u32();
+}
+
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_base__image_decoder__num_animation_loops(
+ const wuffs_base__image_decoder* self) {
+ if (!self) {
+ return 0;
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return 0;
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->num_animation_loops)(self);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return 0;
+}
+
+WUFFS_BASE__MAYBE_STATIC uint64_t
+wuffs_base__image_decoder__num_decoded_frame_configs(
+ const wuffs_base__image_decoder* self) {
+ if (!self) {
+ return 0;
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return 0;
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->num_decoded_frame_configs)(self);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return 0;
+}
+
+WUFFS_BASE__MAYBE_STATIC uint64_t
+wuffs_base__image_decoder__num_decoded_frames(
+ const wuffs_base__image_decoder* self) {
+ if (!self) {
+ return 0;
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return 0;
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->num_decoded_frames)(self);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return 0;
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__image_decoder__restart_frame(
+ wuffs_base__image_decoder* self,
+ uint64_t a_index,
+ uint64_t a_io_position) {
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_status(
+ (self->private_impl.magic == WUFFS_BASE__DISABLED)
+ ? wuffs_base__error__disabled_by_previous_error
+ : wuffs_base__error__initialize_not_called);
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->restart_frame)(self, a_index, a_io_position);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_status(wuffs_base__error__bad_vtable);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_base__image_decoder__set_quirk_enabled(
+ wuffs_base__image_decoder* self,
+ uint32_t a_quirk,
+ bool a_enabled) {
+ if (!self) {
+ return wuffs_base__make_empty_struct();
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_empty_struct();
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->set_quirk_enabled)(self, a_quirk, a_enabled);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_empty_struct();
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_base__image_decoder__set_report_metadata(
+ wuffs_base__image_decoder* self,
+ uint32_t a_fourcc,
+ bool a_report) {
+ if (!self) {
+ return wuffs_base__make_empty_struct();
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_empty_struct();
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_empty_struct();
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__image_decoder__tell_me_more(
+ wuffs_base__image_decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__more_information* a_minfo,
+ wuffs_base__io_buffer* a_src) {
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_status(
+ (self->private_impl.magic == WUFFS_BASE__DISABLED)
+ ? wuffs_base__error__disabled_by_previous_error
+ : wuffs_base__error__initialize_not_called);
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_status(wuffs_base__error__bad_vtable);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_base__image_decoder__workbuf_len(
+ const wuffs_base__image_decoder* self) {
+ if (!self) {
+ return wuffs_base__utility__empty_range_ii_u64();
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return wuffs_base__utility__empty_range_ii_u64();
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
+ const wuffs_base__image_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->workbuf_len)(self);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__utility__empty_range_ii_u64();
+}
+
+// --------
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_base__io_transformer__set_quirk_enabled(
+ wuffs_base__io_transformer* self,
+ uint32_t a_quirk,
+ bool a_enabled) {
+ if (!self) {
+ return wuffs_base__make_empty_struct();
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_empty_struct();
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
+ const wuffs_base__io_transformer__func_ptrs* func_ptrs =
+ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->set_quirk_enabled)(self, a_quirk, a_enabled);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_empty_struct();
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__io_transformer__transform_io(
+ wuffs_base__io_transformer* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf) {
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_status(
+ (self->private_impl.magic == WUFFS_BASE__DISABLED)
+ ? wuffs_base__error__disabled_by_previous_error
+ : wuffs_base__error__initialize_not_called);
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
+ const wuffs_base__io_transformer__func_ptrs* func_ptrs =
+ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_status(wuffs_base__error__bad_vtable);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_base__io_transformer__workbuf_len(
+ const wuffs_base__io_transformer* self) {
+ if (!self) {
+ return wuffs_base__utility__empty_range_ii_u64();
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return wuffs_base__utility__empty_range_ii_u64();
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
+ const wuffs_base__io_transformer__func_ptrs* func_ptrs =
+ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->workbuf_len)(self);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__utility__empty_range_ii_u64();
+}
+
+// --------
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_base__token_decoder__decode_tokens(
+ wuffs_base__token_decoder* self,
+ wuffs_base__token_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf) {
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_status(
+ (self->private_impl.magic == WUFFS_BASE__DISABLED)
+ ? wuffs_base__error__disabled_by_previous_error
+ : wuffs_base__error__initialize_not_called);
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
+ const wuffs_base__token_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_status(wuffs_base__error__bad_vtable);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_base__token_decoder__set_quirk_enabled(
+ wuffs_base__token_decoder* self,
+ uint32_t a_quirk,
+ bool a_enabled) {
+ if (!self) {
+ return wuffs_base__make_empty_struct();
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_empty_struct();
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
+ const wuffs_base__token_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->set_quirk_enabled)(self, a_quirk, a_enabled);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__make_empty_struct();
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_base__token_decoder__workbuf_len(
+ const wuffs_base__token_decoder* self) {
+ if (!self) {
+ return wuffs_base__utility__empty_range_ii_u64();
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return wuffs_base__utility__empty_range_ii_u64();
+ }
+
+ const wuffs_base__vtable* v = &self->private_impl.first_vtable;
+ int i;
+ for (i = 0; i < 63; i++) {
+ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
+ const wuffs_base__token_decoder__func_ptrs* func_ptrs =
+ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
+ return (*func_ptrs->workbuf_len)(self);
+ } else if (v->vtable_name == NULL) {
+ break;
+ }
+ v++;
+ }
+
+ return wuffs_base__utility__empty_range_ii_u64();
+}
+
+#endif // !defined(WUFFS_CONFIG__MODULES) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
+ defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV)
+
+// ---------------- IEEE 754 Floating Point
+
+// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by
+// script/print-hpd-left-shift.go. That script has an optional -comments flag,
+// whose output is not copied here, which prints further detail.
+//
+// These tables are used in
+// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits.
+
+// wuffs_base__private_implementation__hpd_left_shift[i] encodes the number of
+// new digits created after multiplying a positive integer by (1 << i): the
+// additional length in the decimal representation. For example, shifting "234"
+// by 3 (equivalent to multiplying by 8) will produce "1872". Going from a
+// 3-length string to a 4-length string means that 1 new digit was added (and
+// existing digits may have changed).
+//
+// Shifting by i can add either N or N-1 new digits, depending on whether the
+// original positive integer compares >= or < to the i'th power of 5 (as 10
+// equals 2 * 5). Comparison is lexicographic, not numerical.
+//
+// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new
+// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625":
+// - ("1" << 4) is "16", which adds 1 new digit.
+// - ("5678" << 4) is "90848", which adds 1 new digit.
+// - ("624" << 4) is "9984", which adds 1 new digit.
+// - ("62498" << 4) is "999968", which adds 1 new digit.
+// - ("625" << 4) is "10000", which adds 2 new digits.
+// - ("625001" << 4) is "10000016", which adds 2 new digits.
+// - ("7008" << 4) is "112128", which adds 2 new digits.
+// - ("99" << 4) is "1584", which adds 2 new digits.
+//
+// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift
+// array encodes this as:
+// - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006.
+// - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009.
+// where the ? isn't relevant for i == 4.
+//
+// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two
+// possible number of new digits. The low 11 bits are an offset into the
+// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i
+// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9]
+// is the string "\x06\x02\x05", so the relevant power of 5 is "625".
+//
+// Thanks to Ken Thompson for the original idea.
+static const uint16_t wuffs_base__private_implementation__hpd_left_shift[65] = {
+ 0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817,
+ 0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067,
+ 0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF,
+ 0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0,
+ 0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA,
+ 0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC,
+ 0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C,
+ 0x051C, 0x051C,
+};
+
+// wuffs_base__private_implementation__powers_of_5 contains the powers of 5,
+// concatenated together: "5", "25", "125", "625", "3125", etc.
+static const uint8_t wuffs_base__private_implementation__powers_of_5[0x051C] = {
+ 5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5, 3, 9,
+ 0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8, 2, 8, 1, 2,
+ 5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2, 5, 6, 1, 0, 3, 5,
+ 1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1, 5, 2, 5, 8, 7, 8, 9, 0,
+ 6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5, 3, 8, 1, 4, 6, 9, 7, 2, 6, 5,
+ 6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2, 8, 1, 2, 5, 9, 5, 3, 6, 7, 4, 3, 1,
+ 6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3, 7, 1, 5, 8, 2, 0, 3, 1, 2, 5, 2, 3, 8, 4,
+ 1, 8, 5, 7, 9, 1, 0, 1, 5, 6, 2, 5, 1, 1, 9, 2, 0, 9, 2, 8, 9, 5, 5, 0, 7,
+ 8, 1, 2, 5, 5, 9, 6, 0, 4, 6, 4, 4, 7, 7, 5, 3, 9, 0, 6, 2, 5, 2, 9, 8, 0,
+ 2, 3, 2, 2, 3, 8, 7, 6, 9, 5, 3, 1, 2, 5, 1, 4, 9, 0, 1, 1, 6, 1, 1, 9, 3,
+ 8, 4, 7, 6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8, 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1,
+ 2, 5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4, 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8, 6,
+ 2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5, 7, 0, 3, 1, 2, 5, 9, 3, 1, 3, 2, 2, 5,
+ 7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5, 6, 2, 5, 4, 6, 5, 6, 6, 1, 2, 8, 7, 3, 0,
+ 7, 7, 3, 9, 2, 5, 7, 8, 1, 2, 5, 2, 3, 2, 8, 3, 0, 6, 4, 3, 6, 5, 3, 8, 6,
+ 9, 6, 2, 8, 9, 0, 6, 2, 5, 1, 1, 6, 4, 1, 5, 3, 2, 1, 8, 2, 6, 9, 3, 4, 8,
+ 1, 4, 4, 5, 3, 1, 2, 5, 5, 8, 2, 0, 7, 6, 6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7,
+ 2, 2, 6, 5, 6, 2, 5, 2, 9, 1, 0, 3, 8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6,
+ 1, 3, 2, 8, 1, 2, 5, 1, 4, 5, 5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8,
+ 0, 6, 6, 4, 0, 6, 2, 5, 7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9,
+ 0, 3, 3, 2, 0, 3, 1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2,
+ 9, 5, 1, 6, 6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8,
+ 5, 6, 4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7,
+ 2, 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7, 3, 5,
+ 0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5, 2, 2, 7, 3,
+ 7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5, 9, 7, 6, 5, 6, 2,
+ 5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0, 2, 9, 7, 3, 9, 3, 7, 9,
+ 8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8, 8, 6, 0, 8, 0, 8, 0, 1, 4, 8,
+ 6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5, 2, 8, 4, 2, 1, 7, 0, 9, 4, 3, 0, 4,
+ 0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4, 9, 7, 0, 7, 0, 3, 1, 2, 5, 1, 4, 2, 1, 0,
+ 8, 5, 4, 7, 1, 5, 2, 0, 2, 0, 0, 3, 7, 1, 7, 4, 2, 2, 4, 8, 5, 3, 5, 1, 5,
+ 6, 2, 5, 7, 1, 0, 5, 4, 2, 7, 3, 5, 7, 6, 0, 1, 0, 0, 1, 8, 5, 8, 7, 1, 1,
+ 2, 4, 2, 6, 7, 5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7, 1, 3, 6, 7, 8, 8, 0, 0, 5,
+ 0, 0, 9, 2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8, 9, 0, 6, 2, 5, 1, 7, 7, 6, 3,
+ 5, 6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4, 6, 7, 7, 8, 1, 0, 6, 6, 8, 9, 4,
+ 5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3,
+ 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5, 4, 4, 4, 0, 8, 9, 2, 0, 9, 8,
+ 5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9, 4, 5, 2, 6, 6, 7, 2, 3, 6, 3, 2, 8, 1, 2,
+ 5, 2, 2, 2, 0, 4, 4, 6, 0, 4, 9, 2, 5, 0, 3, 1, 3, 0, 8, 0, 8, 4, 7, 2, 6,
+ 3, 3, 3, 6, 1, 8, 1, 6, 4, 0, 6, 2, 5, 1, 1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2,
+ 5, 1, 5, 6, 5, 4, 0, 4, 2, 3, 6, 3, 1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2,
+ 5, 5, 5, 5, 1, 1, 1, 5, 1, 2, 3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5,
+ 8, 3, 4, 0, 4, 5, 4, 1, 0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5,
+ 6, 2, 8, 9, 1, 3, 5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8,
+ 1, 2, 5, 1, 3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9,
+ 5, 3, 9, 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3,
+ 9, 0, 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6, 7, 6,
+ 2, 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3, 6, 1, 4, 1,
+ 8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7, 6, 5, 6, 2, 5, 1,
+ 7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9, 4, 4, 1, 1, 9, 2, 4, 4,
+ 8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2, 5, 8, 6, 7, 3, 6, 1, 7, 3, 7,
+ 9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9, 6, 2, 2, 4, 0, 6, 9, 5, 9, 5, 3, 3,
+ 6, 9, 1, 4, 0, 6, 2, 5,
+};
+
+// --------
+
+// wuffs_base__private_implementation__powers_of_10 contains truncated
+// approximations to the powers of 10, ranging from 1e-307 to 1e+288 inclusive,
+// as 596 pairs of uint64_t values (a 128-bit mantissa).
+//
+// There's also an implicit third column (implied by a linear formula involving
+// the base-10 exponent) that is the base-2 exponent, biased by a magic
+// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias
+// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and
+// wuffs_base__private_implementation__parse_number_f64_eisel_lemire works with
+// multiples-of-64-bit mantissas.
+//
+// For example, the third row holds the approximation to 1e-305:
+// 0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE))
+//
+// Similarly, 1e+4 is approximated by:
+// 0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE))
+//
+// Similarly, 1e+68 is approximated by:
+// 0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE))
+//
+// This table was generated by by script/print-mpb-powers-of-10.go
+static const uint64_t wuffs_base__private_implementation__powers_of_10[596][2] =
+ {
+ {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307
+ {0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306
+ {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305
+ {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304
+ {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303
+ {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302
+ {0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301
+ {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300
+ {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299
+ {0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298
+ {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297
+ {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296
+ {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295
+ {0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294
+ {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293
+ {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292
+ {0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291
+ {0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290
+ {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289
+ {0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288
+ {0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287
+ {0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286
+ {0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285
+ {0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284
+ {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283
+ {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282
+ {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281
+ {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280
+ {0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279
+ {0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278
+ {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277
+ {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276
+ {0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275
+ {0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274
+ {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273
+ {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272
+ {0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271
+ {0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270
+ {0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269
+ {0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268
+ {0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267
+ {0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266
+ {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265
+ {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264
+ {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263
+ {0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262
+ {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261
+ {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260
+ {0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259
+ {0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258
+ {0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257
+ {0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256
+ {0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255
+ {0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254
+ {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253
+ {0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252
+ {0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251
+ {0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250
+ {0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249
+ {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248
+ {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247
+ {0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246
+ {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245
+ {0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244
+ {0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243
+ {0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242
+ {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241
+ {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240
+ {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239
+ {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238
+ {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237
+ {0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236
+ {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235
+ {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234
+ {0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233
+ {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232
+ {0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231
+ {0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230
+ {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229
+ {0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228
+ {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227
+ {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226
+ {0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225
+ {0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224
+ {0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223
+ {0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222
+ {0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221
+ {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220
+ {0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219
+ {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218
+ {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217
+ {0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216
+ {0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215
+ {0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214
+ {0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213
+ {0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212
+ {0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211
+ {0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210
+ {0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209
+ {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208
+ {0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207
+ {0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206
+ {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205
+ {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204
+ {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203
+ {0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202
+ {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201
+ {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200
+ {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199
+ {0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198
+ {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197
+ {0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196
+ {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195
+ {0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194
+ {0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193
+ {0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192
+ {0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191
+ {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190
+ {0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189
+ {0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188
+ {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187
+ {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186
+ {0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185
+ {0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184
+ {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183
+ {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182
+ {0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181
+ {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180
+ {0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179
+ {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178
+ {0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177
+ {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176
+ {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175
+ {0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174
+ {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173
+ {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172
+ {0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171
+ {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170
+ {0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169
+ {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168
+ {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167
+ {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166
+ {0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165
+ {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164
+ {0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163
+ {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162
+ {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161
+ {0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160
+ {0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159
+ {0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158
+ {0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157
+ {0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156
+ {0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155
+ {0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154
+ {0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153
+ {0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152
+ {0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151
+ {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150
+ {0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149
+ {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148
+ {0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147
+ {0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146
+ {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145
+ {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144
+ {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143
+ {0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142
+ {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141
+ {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140
+ {0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139
+ {0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138
+ {0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137
+ {0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136
+ {0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135
+ {0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134
+ {0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133
+ {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132
+ {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131
+ {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130
+ {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129
+ {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128
+ {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127
+ {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126
+ {0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125
+ {0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124
+ {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123
+ {0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122
+ {0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121
+ {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120
+ {0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119
+ {0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118
+ {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117
+ {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116
+ {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115
+ {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114
+ {0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113
+ {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112
+ {0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111
+ {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110
+ {0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109
+ {0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108
+ {0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107
+ {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106
+ {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105
+ {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104
+ {0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103
+ {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102
+ {0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101
+ {0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100
+ {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99
+ {0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98
+ {0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97
+ {0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96
+ {0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95
+ {0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94
+ {0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93
+ {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92
+ {0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91
+ {0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90
+ {0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89
+ {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88
+ {0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87
+ {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86
+ {0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85
+ {0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84
+ {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83
+ {0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82
+ {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81
+ {0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80
+ {0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79
+ {0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78
+ {0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77
+ {0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76
+ {0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75
+ {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74
+ {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73
+ {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72
+ {0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71
+ {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70
+ {0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69
+ {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68
+ {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67
+ {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66
+ {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65
+ {0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64
+ {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63
+ {0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62
+ {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61
+ {0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60
+ {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59
+ {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58
+ {0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57
+ {0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56
+ {0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55
+ {0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54
+ {0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53
+ {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52
+ {0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51
+ {0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50
+ {0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49
+ {0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48
+ {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47
+ {0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46
+ {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45
+ {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44
+ {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43
+ {0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42
+ {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41
+ {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40
+ {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39
+ {0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38
+ {0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37
+ {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36
+ {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35
+ {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34
+ {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33
+ {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32
+ {0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31
+ {0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30
+ {0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29
+ {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28
+ {0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27
+ {0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26
+ {0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25
+ {0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24
+ {0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23
+ {0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22
+ {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21
+ {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20
+ {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19
+ {0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18
+ {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17
+ {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16
+ {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15
+ {0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14
+ {0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13
+ {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12
+ {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11
+ {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10
+ {0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9
+ {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8
+ {0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7
+ {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6
+ {0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5
+ {0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4
+ {0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3
+ {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2
+ {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1
+ {0x0000000000000000, 0x8000000000000000}, // 1e0
+ {0x0000000000000000, 0xA000000000000000}, // 1e1
+ {0x0000000000000000, 0xC800000000000000}, // 1e2
+ {0x0000000000000000, 0xFA00000000000000}, // 1e3
+ {0x0000000000000000, 0x9C40000000000000}, // 1e4
+ {0x0000000000000000, 0xC350000000000000}, // 1e5
+ {0x0000000000000000, 0xF424000000000000}, // 1e6
+ {0x0000000000000000, 0x9896800000000000}, // 1e7
+ {0x0000000000000000, 0xBEBC200000000000}, // 1e8
+ {0x0000000000000000, 0xEE6B280000000000}, // 1e9
+ {0x0000000000000000, 0x9502F90000000000}, // 1e10
+ {0x0000000000000000, 0xBA43B74000000000}, // 1e11
+ {0x0000000000000000, 0xE8D4A51000000000}, // 1e12
+ {0x0000000000000000, 0x9184E72A00000000}, // 1e13
+ {0x0000000000000000, 0xB5E620F480000000}, // 1e14
+ {0x0000000000000000, 0xE35FA931A0000000}, // 1e15
+ {0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16
+ {0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17
+ {0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18
+ {0x0000000000000000, 0x8AC7230489E80000}, // 1e19
+ {0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20
+ {0x0000000000000000, 0xD8D726B7177A8000}, // 1e21
+ {0x0000000000000000, 0x878678326EAC9000}, // 1e22
+ {0x0000000000000000, 0xA968163F0A57B400}, // 1e23
+ {0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24
+ {0x0000000000000000, 0x84595161401484A0}, // 1e25
+ {0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26
+ {0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27
+ {0x4000000000000000, 0x813F3978F8940984}, // 1e28
+ {0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29
+ {0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30
+ {0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31
+ {0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32
+ {0x6C28000000000000, 0xC5371912364CE305}, // 1e33
+ {0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34
+ {0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35
+ {0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36
+ {0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37
+ {0x1314448000000000, 0x96769950B50D88F4}, // 1e38
+ {0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39
+ {0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40
+ {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41
+ {0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42
+ {0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43
+ {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44
+ {0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45
+ {0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46
+ {0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47
+ {0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48
+ {0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49
+ {0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50
+ {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51
+ {0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52
+ {0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53
+ {0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54
+ {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55
+ {0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56
+ {0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57
+ {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58
+ {0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59
+ {0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60
+ {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61
+ {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62
+ {0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63
+ {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64
+ {0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65
+ {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66
+ {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67
+ {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68
+ {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69
+ {0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70
+ {0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71
+ {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72
+ {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73
+ {0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74
+ {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75
+ {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76
+ {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77
+ {0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78
+ {0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79
+ {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80
+ {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81
+ {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82
+ {0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83
+ {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84
+ {0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85
+ {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86
+ {0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87
+ {0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88
+ {0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89
+ {0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90
+ {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91
+ {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92
+ {0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93
+ {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94
+ {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95
+ {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96
+ {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97
+ {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98
+ {0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99
+ {0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100
+ {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101
+ {0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102
+ {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103
+ {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104
+ {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105
+ {0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106
+ {0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107
+ {0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108
+ {0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109
+ {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110
+ {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111
+ {0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112
+ {0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113
+ {0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114
+ {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115
+ {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116
+ {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117
+ {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118
+ {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119
+ {0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120
+ {0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121
+ {0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122
+ {0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123
+ {0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124
+ {0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125
+ {0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126
+ {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127
+ {0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128
+ {0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129
+ {0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130
+ {0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131
+ {0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132
+ {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133
+ {0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134
+ {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135
+ {0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136
+ {0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137
+ {0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138
+ {0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139
+ {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140
+ {0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141
+ {0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142
+ {0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143
+ {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144
+ {0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145
+ {0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146
+ {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147
+ {0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148
+ {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149
+ {0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150
+ {0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151
+ {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152
+ {0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153
+ {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154
+ {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155
+ {0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156
+ {0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157
+ {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158
+ {0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159
+ {0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160
+ {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161
+ {0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162
+ {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163
+ {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164
+ {0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165
+ {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166
+ {0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167
+ {0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168
+ {0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169
+ {0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170
+ {0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171
+ {0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172
+ {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173
+ {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174
+ {0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175
+ {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176
+ {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177
+ {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178
+ {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179
+ {0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180
+ {0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181
+ {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182
+ {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183
+ {0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184
+ {0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185
+ {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186
+ {0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187
+ {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188
+ {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189
+ {0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190
+ {0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191
+ {0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192
+ {0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193
+ {0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194
+ {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195
+ {0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196
+ {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197
+ {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198
+ {0xF6872D5667844E49, 0x85C7056562757456}, // 1e199
+ {0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200
+ {0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201
+ {0xECC0024661173473, 0x82A45B450226B39C}, // 1e202
+ {0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203
+ {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204
+ {0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205
+ {0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206
+ {0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207
+ {0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208
+ {0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209
+ {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210
+ {0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211
+ {0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212
+ {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213
+ {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214
+ {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215
+ {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216
+ {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217
+ {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218
+ {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219
+ {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220
+ {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221
+ {0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222
+ {0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223
+ {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224
+ {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225
+ {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226
+ {0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227
+ {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228
+ {0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229
+ {0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230
+ {0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231
+ {0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232
+ {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233
+ {0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234
+ {0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235
+ {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236
+ {0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237
+ {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238
+ {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239
+ {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240
+ {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241
+ {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242
+ {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243
+ {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244
+ {0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245
+ {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246
+ {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247
+ {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248
+ {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249
+ {0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250
+ {0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251
+ {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252
+ {0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253
+ {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254
+ {0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255
+ {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256
+ {0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257
+ {0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258
+ {0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259
+ {0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260
+ {0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261
+ {0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262
+ {0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263
+ {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264
+ {0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265
+ {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266
+ {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267
+ {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268
+ {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269
+ {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270
+ {0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271
+ {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272
+ {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273
+ {0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274
+ {0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275
+ {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276
+ {0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277
+ {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278
+ {0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279
+ {0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280
+ {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281
+ {0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282
+ {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283
+ {0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284
+ {0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285
+ {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286
+ {0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287
+ {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288
+};
+
+// wuffs_base__private_implementation__f64_powers_of_10 holds powers of 10 that
+// can be exactly represented by a float64 (what C calls a double).
+static const double wuffs_base__private_implementation__f64_powers_of_10[23] = {
+ 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11,
+ 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22,
+};
+
+// ---------------- IEEE 754 Floating Point
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16 //
+wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) {
+ uint64_t u = 0;
+ if (sizeof(uint64_t) == sizeof(double)) {
+ memcpy(&u, &f, sizeof(uint64_t));
+ }
+ uint16_t neg = ((uint16_t)((u >> 63) << 15));
+ u &= 0x7FFFFFFFFFFFFFFF;
+ uint64_t exp = u >> 52;
+ uint64_t man = u & 0x000FFFFFFFFFFFFF;
+
+ if (exp == 0x7FF) {
+ if (man == 0) { // Infinity.
+ wuffs_base__lossy_value_u16 ret;
+ ret.value = neg | 0x7C00;
+ ret.lossy = false;
+ return ret;
+ }
+ // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most
+ // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9
+ // bits of ret.value so that the 10-bit mantissa is non-zero.
+ wuffs_base__lossy_value_u16 ret;
+ ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42));
+ ret.lossy = false;
+ return ret;
+
+ } else if (exp > 0x40E) { // Truncate to the largest finite f16.
+ wuffs_base__lossy_value_u16 ret;
+ ret.value = neg | 0x7BFF;
+ ret.lossy = true;
+ return ret;
+
+ } else if (exp <= 0x3E6) { // Truncate to zero.
+ wuffs_base__lossy_value_u16 ret;
+ ret.value = neg;
+ ret.lossy = (u != 0);
+ return ret;
+
+ } else if (exp <= 0x3F0) { // Normal f64, subnormal f16.
+ // Convert from a 53-bit mantissa (after realizing the implicit bit) to a
+ // 10-bit mantissa and then adjust for the exponent.
+ man |= 0x0010000000000000;
+ uint32_t shift = ((uint32_t)(1051 - exp)); // 1051 = 0x3F0 + 53 - 10.
+ uint64_t shifted_man = man >> shift;
+ wuffs_base__lossy_value_u16 ret;
+ ret.value = neg | ((uint16_t)shifted_man);
+ ret.lossy = (shifted_man << shift) != man;
+ return ret;
+ }
+
+ // Normal f64, normal f16.
+
+ // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits.
+ exp = (exp - 1008) << 10; // 1008 = 1023 - 15 = 0x3FF - 0xF.
+
+ // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit
+ // mantissa (again excluding the implicit bit). We lose some information if
+ // any of the bottom 42 bits are non-zero.
+ wuffs_base__lossy_value_u16 ret;
+ ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42));
+ ret.lossy = (man << 22) != 0;
+ return ret;
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32 //
+wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) {
+ uint64_t u = 0;
+ if (sizeof(uint64_t) == sizeof(double)) {
+ memcpy(&u, &f, sizeof(uint64_t));
+ }
+ uint32_t neg = ((uint32_t)(u >> 63)) << 31;
+ u &= 0x7FFFFFFFFFFFFFFF;
+ uint64_t exp = u >> 52;
+ uint64_t man = u & 0x000FFFFFFFFFFFFF;
+
+ if (exp == 0x7FF) {
+ if (man == 0) { // Infinity.
+ wuffs_base__lossy_value_u32 ret;
+ ret.value = neg | 0x7F800000;
+ ret.lossy = false;
+ return ret;
+ }
+ // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most
+ // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22
+ // bits of ret.value so that the 23-bit mantissa is non-zero.
+ wuffs_base__lossy_value_u32 ret;
+ ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29));
+ ret.lossy = false;
+ return ret;
+
+ } else if (exp > 0x47E) { // Truncate to the largest finite f32.
+ wuffs_base__lossy_value_u32 ret;
+ ret.value = neg | 0x7F7FFFFF;
+ ret.lossy = true;
+ return ret;
+
+ } else if (exp <= 0x369) { // Truncate to zero.
+ wuffs_base__lossy_value_u32 ret;
+ ret.value = neg;
+ ret.lossy = (u != 0);
+ return ret;
+
+ } else if (exp <= 0x380) { // Normal f64, subnormal f32.
+ // Convert from a 53-bit mantissa (after realizing the implicit bit) to a
+ // 23-bit mantissa and then adjust for the exponent.
+ man |= 0x0010000000000000;
+ uint32_t shift = ((uint32_t)(926 - exp)); // 926 = 0x380 + 53 - 23.
+ uint64_t shifted_man = man >> shift;
+ wuffs_base__lossy_value_u32 ret;
+ ret.value = neg | ((uint32_t)shifted_man);
+ ret.lossy = (shifted_man << shift) != man;
+ return ret;
+ }
+
+ // Normal f64, normal f32.
+
+ // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits.
+ exp = (exp - 896) << 23; // 896 = 1023 - 127 = 0x3FF - 0x7F.
+
+ // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit
+ // mantissa (again excluding the implicit bit). We lose some information if
+ // any of the bottom 29 bits are non-zero.
+ wuffs_base__lossy_value_u32 ret;
+ ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29));
+ ret.lossy = (man << 35) != 0;
+ return ret;
+}
+
+// --------
+
+#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE 2047
+#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION 800
+
+// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL is the largest N
+// such that ((10 << N) < (1 << 64)).
+#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL 60
+
+// wuffs_base__private_implementation__high_prec_dec (abbreviated as HPD) is a
+// fixed precision floating point decimal number, augmented with ±infinity
+// values, but it cannot represent NaN (Not a Number).
+//
+// "High precision" means that the mantissa holds 800 decimal digits. 800 is
+// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION.
+//
+// An HPD isn't for general purpose arithmetic, only for conversions to and
+// from IEEE 754 double-precision floating point, where the largest and
+// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324.
+// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ±2047
+// bounds are further away from zero than ±(324 + 800), where 800 and 2047 is
+// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION and
+// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE.
+//
+// digits[.. num_digits] are the number's digits in big-endian order. The
+// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7'
+// is the ASCII value 0x37.
+//
+// decimal_point is the index (within digits) of the decimal point. It may be
+// negative or be larger than num_digits, in which case the explicit digits are
+// padded with implicit zeroes.
+//
+// For example, if num_digits is 3 and digits is "\x07\x08\x09":
+// - A decimal_point of -2 means ".00789"
+// - A decimal_point of -1 means ".0789"
+// - A decimal_point of +0 means ".789"
+// - A decimal_point of +1 means "7.89"
+// - A decimal_point of +2 means "78.9"
+// - A decimal_point of +3 means "789."
+// - A decimal_point of +4 means "7890."
+// - A decimal_point of +5 means "78900."
+//
+// As above, a decimal_point higher than +2047 means that the overall value is
+// infinity, lower than -2047 means zero.
+//
+// negative is a sign bit. An HPD can distinguish positive and negative zero.
+//
+// truncated is whether there are more than
+// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION digits, and at
+// least one of those extra digits are non-zero. The existence of long-tail
+// digits can affect rounding.
+//
+// The "all fields are zero" value is valid, and represents the number +0.
+typedef struct wuffs_base__private_implementation__high_prec_dec__struct {
+ uint32_t num_digits;
+ int32_t decimal_point;
+ bool negative;
+ bool truncated;
+ uint8_t digits[WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION];
+} wuffs_base__private_implementation__high_prec_dec;
+
+// wuffs_base__private_implementation__high_prec_dec__trim trims trailing
+// zeroes from the h->digits[.. h->num_digits] slice. They have no benefit,
+// since we explicitly track h->decimal_point.
+//
+// Preconditions:
+// - h is non-NULL.
+static inline void //
+wuffs_base__private_implementation__high_prec_dec__trim(
+ wuffs_base__private_implementation__high_prec_dec* h) {
+ while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) {
+ h->num_digits--;
+ }
+}
+
+// wuffs_base__private_implementation__high_prec_dec__assign sets h to
+// represent the number x.
+//
+// Preconditions:
+// - h is non-NULL.
+static void //
+wuffs_base__private_implementation__high_prec_dec__assign(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ uint64_t x,
+ bool negative) {
+ uint32_t n = 0;
+
+ // Set h->digits.
+ if (x > 0) {
+ // Calculate the digits, working right-to-left. After we determine n (how
+ // many digits there are), copy from buf to h->digits.
+ //
+ // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to
+ // copy a constant number of bytes than a variable number (20 instead of
+ // n). Make buf large enough (and start writing to it from the middle) so
+ // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)].
+ uint8_t buf[40] = {0};
+ uint8_t* ptr = &buf[20];
+ do {
+ uint64_t remaining = x / 10;
+ x -= remaining * 10;
+ ptr--;
+ *ptr = (uint8_t)x;
+ n++;
+ x = remaining;
+ } while (x > 0);
+ memcpy(h->digits, ptr, 20);
+ }
+
+ // Set h's other fields.
+ h->num_digits = n;
+ h->decimal_point = (int32_t)n;
+ h->negative = negative;
+ h->truncated = false;
+ wuffs_base__private_implementation__high_prec_dec__trim(h);
+}
+
+static wuffs_base__status //
+wuffs_base__private_implementation__high_prec_dec__parse(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ wuffs_base__slice_u8 s,
+ uint32_t options) {
+ if (!h) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ h->num_digits = 0;
+ h->decimal_point = 0;
+ h->negative = false;
+ h->truncated = false;
+
+ uint8_t* p = s.ptr;
+ uint8_t* q = s.ptr + s.len;
+
+ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
+ for (;; p++) {
+ if (p >= q) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ } else if (*p != '_') {
+ break;
+ }
+ }
+ }
+
+ // Parse sign.
+ do {
+ if (*p == '+') {
+ p++;
+ } else if (*p == '-') {
+ h->negative = true;
+ p++;
+ } else {
+ break;
+ }
+ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
+ for (;; p++) {
+ if (p >= q) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ } else if (*p != '_') {
+ break;
+ }
+ }
+ }
+ } while (0);
+
+ // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each
+ // limb in this if-else chain:
+ // - "0.789"
+ // - "1002.789"
+ // - ".789"
+ // - Other (invalid input).
+ uint32_t nd = 0;
+ int32_t dp = 0;
+ bool no_digits_before_separator = false;
+ if (('0' == *p) &&
+ !(options &
+ WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) {
+ p++;
+ for (;; p++) {
+ if (p >= q) {
+ goto after_all;
+ } else if (*p ==
+ ((options &
+ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
+ ? ','
+ : '.')) {
+ p++;
+ goto after_sep;
+ } else if ((*p == 'E') || (*p == 'e')) {
+ p++;
+ goto after_exp;
+ } else if ((*p != '_') ||
+ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ }
+
+ } else if (('0' <= *p) && (*p <= '9')) {
+ if (*p == '0') {
+ for (; (p < q) && (*p == '0'); p++) {
+ }
+ } else {
+ h->digits[nd++] = (uint8_t)(*p - '0');
+ dp = (int32_t)nd;
+ p++;
+ }
+
+ for (;; p++) {
+ if (p >= q) {
+ goto after_all;
+ } else if (('0' <= *p) && (*p <= '9')) {
+ if (nd < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) {
+ h->digits[nd++] = (uint8_t)(*p - '0');
+ dp = (int32_t)nd;
+ } else if ('0' != *p) {
+ // Long-tail non-zeroes set the truncated bit.
+ h->truncated = true;
+ }
+ } else if (*p ==
+ ((options &
+ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
+ ? ','
+ : '.')) {
+ p++;
+ goto after_sep;
+ } else if ((*p == 'E') || (*p == 'e')) {
+ p++;
+ goto after_exp;
+ } else if ((*p != '_') ||
+ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ }
+
+ } else if (*p == ((options &
+ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
+ ? ','
+ : '.')) {
+ p++;
+ no_digits_before_separator = true;
+
+ } else {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+
+after_sep:
+ for (;; p++) {
+ if (p >= q) {
+ goto after_all;
+ } else if ('0' == *p) {
+ if (nd == 0) {
+ // Track leading zeroes implicitly.
+ dp--;
+ } else if (nd <
+ WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) {
+ h->digits[nd++] = (uint8_t)(*p - '0');
+ }
+ } else if (('0' < *p) && (*p <= '9')) {
+ if (nd < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) {
+ h->digits[nd++] = (uint8_t)(*p - '0');
+ } else {
+ // Long-tail non-zeroes set the truncated bit.
+ h->truncated = true;
+ }
+ } else if ((*p == 'E') || (*p == 'e')) {
+ p++;
+ goto after_exp;
+ } else if ((*p != '_') ||
+ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ }
+
+after_exp:
+ do {
+ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
+ for (;; p++) {
+ if (p >= q) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ } else if (*p != '_') {
+ break;
+ }
+ }
+ }
+
+ int32_t exp_sign = +1;
+ if (*p == '+') {
+ p++;
+ } else if (*p == '-') {
+ exp_sign = -1;
+ p++;
+ }
+
+ int32_t exp = 0;
+ const int32_t exp_large =
+ WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE +
+ WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION;
+ bool saw_exp_digits = false;
+ for (; p < q; p++) {
+ if ((*p == '_') &&
+ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
+ // No-op.
+ } else if (('0' <= *p) && (*p <= '9')) {
+ saw_exp_digits = true;
+ if (exp < exp_large) {
+ exp = (10 * exp) + ((int32_t)(*p - '0'));
+ }
+ } else {
+ break;
+ }
+ }
+ if (!saw_exp_digits) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ dp += exp_sign * exp;
+ } while (0);
+
+after_all:
+ if (p != q) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ h->num_digits = nd;
+ if (nd == 0) {
+ if (no_digits_before_separator) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ h->decimal_point = 0;
+ } else if (dp <
+ -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) {
+ h->decimal_point =
+ -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE - 1;
+ } else if (dp >
+ +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) {
+ h->decimal_point =
+ +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE + 1;
+ } else {
+ h->decimal_point = dp;
+ }
+ wuffs_base__private_implementation__high_prec_dec__trim(h);
+ return wuffs_base__make_status(NULL);
+}
+
+// --------
+
+// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits
+// returns the number of additional decimal digits when left-shifting by shift.
+//
+// See below for preconditions.
+static uint32_t //
+wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ uint32_t shift) {
+ // Masking with 0x3F should be unnecessary (assuming the preconditions) but
+ // it's cheap and ensures that we don't overflow the
+ // wuffs_base__private_implementation__hpd_left_shift array.
+ shift &= 63;
+
+ uint32_t x_a = wuffs_base__private_implementation__hpd_left_shift[shift];
+ uint32_t x_b = wuffs_base__private_implementation__hpd_left_shift[shift + 1];
+ uint32_t num_new_digits = x_a >> 11;
+ uint32_t pow5_a = 0x7FF & x_a;
+ uint32_t pow5_b = 0x7FF & x_b;
+
+ const uint8_t* pow5 =
+ &wuffs_base__private_implementation__powers_of_5[pow5_a];
+ uint32_t i = 0;
+ uint32_t n = pow5_b - pow5_a;
+ for (; i < n; i++) {
+ if (i >= h->num_digits) {
+ return num_new_digits - 1;
+ } else if (h->digits[i] == pow5[i]) {
+ continue;
+ } else if (h->digits[i] < pow5[i]) {
+ return num_new_digits - 1;
+ } else {
+ return num_new_digits;
+ }
+ }
+ return num_new_digits;
+}
+
+// --------
+
+// wuffs_base__private_implementation__high_prec_dec__rounded_integer returns
+// the integral (non-fractional) part of h, provided that it is 18 or fewer
+// decimal digits. For 19 or more digits, it returns UINT64_MAX. Note that:
+// - (1 << 53) is 9007199254740992, which has 16 decimal digits.
+// - (1 << 56) is 72057594037927936, which has 17 decimal digits.
+// - (1 << 59) is 576460752303423488, which has 18 decimal digits.
+// - (1 << 63) is 9223372036854775808, which has 19 decimal digits.
+// and that IEEE 754 double precision has 52 mantissa bits.
+//
+// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8.
+//
+// h's negative bit is ignored: rounding -8.6 returns 9.
+//
+// See below for preconditions.
+static uint64_t //
+wuffs_base__private_implementation__high_prec_dec__rounded_integer(
+ wuffs_base__private_implementation__high_prec_dec* h) {
+ if ((h->num_digits == 0) || (h->decimal_point < 0)) {
+ return 0;
+ } else if (h->decimal_point > 18) {
+ return UINT64_MAX;
+ }
+
+ uint32_t dp = (uint32_t)(h->decimal_point);
+ uint64_t n = 0;
+ uint32_t i = 0;
+ for (; i < dp; i++) {
+ n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0);
+ }
+
+ bool round_up = false;
+ if (dp < h->num_digits) {
+ round_up = h->digits[dp] >= 5;
+ if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) {
+ // We are exactly halfway. If we're truncated, round up, otherwise round
+ // to even.
+ round_up = h->truncated || //
+ ((dp > 0) && (1 & h->digits[dp - 1]));
+ }
+ }
+ if (round_up) {
+ n++;
+ }
+
+ return n;
+}
+
+// wuffs_base__private_implementation__high_prec_dec__small_xshift shifts h's
+// number (where 'x' is 'l' or 'r' for left or right) by a small shift value.
+//
+// Preconditions:
+// - h is non-NULL.
+// - h->decimal_point is "not extreme".
+// - shift is non-zero.
+// - shift is "a small shift".
+//
+// "Not extreme" means within
+// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE.
+//
+// "A small shift" means not more than
+// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL.
+//
+// wuffs_base__private_implementation__high_prec_dec__rounded_integer and
+// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits
+// have the same preconditions.
+//
+// wuffs_base__private_implementation__high_prec_dec__lshift keeps the first
+// two preconditions but not the last two. Its shift argument is signed and
+// does not need to be "small": zero is a no-op, positive means left shift and
+// negative means right shift.
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__small_lshift(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ uint32_t shift) {
+ if (h->num_digits == 0) {
+ return;
+ }
+ uint32_t num_new_digits =
+ wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits(
+ h, shift);
+ uint32_t rx = h->num_digits - 1; // Read index.
+ uint32_t wx = h->num_digits - 1 + num_new_digits; // Write index.
+ uint64_t n = 0;
+
+ // Repeat: pick up a digit, put down a digit, right to left.
+ while (((int32_t)rx) >= 0) {
+ n += ((uint64_t)(h->digits[rx])) << shift;
+ uint64_t quo = n / 10;
+ uint64_t rem = n - (10 * quo);
+ if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) {
+ h->digits[wx] = (uint8_t)rem;
+ } else if (rem > 0) {
+ h->truncated = true;
+ }
+ n = quo;
+ wx--;
+ rx--;
+ }
+
+ // Put down leading digits, right to left.
+ while (n > 0) {
+ uint64_t quo = n / 10;
+ uint64_t rem = n - (10 * quo);
+ if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) {
+ h->digits[wx] = (uint8_t)rem;
+ } else if (rem > 0) {
+ h->truncated = true;
+ }
+ n = quo;
+ wx--;
+ }
+
+ // Finish.
+ h->num_digits += num_new_digits;
+ if (h->num_digits >
+ WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) {
+ h->num_digits = WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION;
+ }
+ h->decimal_point += (int32_t)num_new_digits;
+ wuffs_base__private_implementation__high_prec_dec__trim(h);
+}
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__small_rshift(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ uint32_t shift) {
+ uint32_t rx = 0; // Read index.
+ uint32_t wx = 0; // Write index.
+ uint64_t n = 0;
+
+ // Pick up enough leading digits to cover the first shift.
+ while ((n >> shift) == 0) {
+ if (rx < h->num_digits) {
+ // Read a digit.
+ n = (10 * n) + h->digits[rx++];
+ } else if (n == 0) {
+ // h's number used to be zero and remains zero.
+ return;
+ } else {
+ // Read sufficient implicit trailing zeroes.
+ while ((n >> shift) == 0) {
+ n = 10 * n;
+ rx++;
+ }
+ break;
+ }
+ }
+ h->decimal_point -= ((int32_t)(rx - 1));
+ if (h->decimal_point <
+ -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) {
+ // After the shift, h's number is effectively zero.
+ h->num_digits = 0;
+ h->decimal_point = 0;
+ h->truncated = false;
+ return;
+ }
+
+ // Repeat: pick up a digit, put down a digit, left to right.
+ uint64_t mask = (((uint64_t)(1)) << shift) - 1;
+ while (rx < h->num_digits) {
+ uint8_t new_digit = ((uint8_t)(n >> shift));
+ n = (10 * (n & mask)) + h->digits[rx++];
+ h->digits[wx++] = new_digit;
+ }
+
+ // Put down trailing digits, left to right.
+ while (n > 0) {
+ uint8_t new_digit = ((uint8_t)(n >> shift));
+ n = 10 * (n & mask);
+ if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) {
+ h->digits[wx++] = new_digit;
+ } else if (new_digit > 0) {
+ h->truncated = true;
+ }
+ }
+
+ // Finish.
+ h->num_digits = wx;
+ wuffs_base__private_implementation__high_prec_dec__trim(h);
+}
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__lshift(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ int32_t shift) {
+ if (shift > 0) {
+ while (shift > +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) {
+ wuffs_base__private_implementation__high_prec_dec__small_lshift(
+ h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL);
+ shift -= WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL;
+ }
+ wuffs_base__private_implementation__high_prec_dec__small_lshift(
+ h, ((uint32_t)(+shift)));
+ } else if (shift < 0) {
+ while (shift < -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) {
+ wuffs_base__private_implementation__high_prec_dec__small_rshift(
+ h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL);
+ shift += WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL;
+ }
+ wuffs_base__private_implementation__high_prec_dec__small_rshift(
+ h, ((uint32_t)(-shift)));
+ }
+}
+
+// --------
+
+// wuffs_base__private_implementation__high_prec_dec__round_etc rounds h's
+// number. For those functions that take an n argument, rounding produces at
+// most n digits (which is not necessarily at most n decimal places). Negative
+// n values are ignored, as well as any n greater than or equal to h's number
+// of digits. The etc__round_just_enough function implicitly chooses an n to
+// implement WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION.
+//
+// Preconditions:
+// - h is non-NULL.
+// - h->decimal_point is "not extreme".
+//
+// "Not extreme" means within
+// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE.
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__round_down(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ int32_t n) {
+ if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
+ return;
+ }
+ h->num_digits = (uint32_t)(n);
+ wuffs_base__private_implementation__high_prec_dec__trim(h);
+}
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__round_up(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ int32_t n) {
+ if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
+ return;
+ }
+
+ for (n--; n >= 0; n--) {
+ if (h->digits[n] < 9) {
+ h->digits[n]++;
+ h->num_digits = (uint32_t)(n + 1);
+ return;
+ }
+ }
+
+ // The number is all 9s. Change to a single 1 and adjust the decimal point.
+ h->digits[0] = 1;
+ h->num_digits = 1;
+ h->decimal_point++;
+}
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__round_nearest(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ int32_t n) {
+ if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
+ return;
+ }
+ bool up = h->digits[n] >= 5;
+ if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) {
+ up = h->truncated || //
+ ((n > 0) && ((h->digits[n - 1] & 1) != 0));
+ }
+
+ if (up) {
+ wuffs_base__private_implementation__high_prec_dec__round_up(h, n);
+ } else {
+ wuffs_base__private_implementation__high_prec_dec__round_down(h, n);
+ }
+}
+
+static void //
+wuffs_base__private_implementation__high_prec_dec__round_just_enough(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ int32_t exp2,
+ uint64_t mantissa) {
+ // The magic numbers 52 and 53 in this function are because IEEE 754 double
+ // precision has 52 mantissa bits.
+ //
+ // Let f be the floating point number represented by exp2 and mantissa (and
+ // also the number in h): the number (mantissa * (2 ** (exp2 - 52))).
+ //
+ // If f is zero or a small integer, we can return early.
+ if ((mantissa == 0) ||
+ ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) {
+ return;
+ }
+
+ // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52).
+ // Subnormal numbers have the same exp2 but a smaller mantissa.
+ static const int32_t min_incl_normal_exp2 = -1022;
+ static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul;
+
+ // Compute lower and upper bounds such that any number between them (possibly
+ // inclusive) will round to f. First, the lower bound. Our number f is:
+ // ((mantissa + 0) * (2 ** ( exp2 - 52)))
+ //
+ // The next lowest floating point number is:
+ // ((mantissa - 1) * (2 ** ( exp2 - 52)))
+ // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the
+ // min_incl_normal_exp2. Either way, call it:
+ // ((l_mantissa) * (2 ** (l_exp2 - 52)))
+ //
+ // The lower bound is halfway between them (noting that 52 became 53):
+ // (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53)))
+ int32_t l_exp2 = exp2;
+ uint64_t l_mantissa = mantissa - 1;
+ if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) {
+ l_exp2 = exp2 - 1;
+ l_mantissa = (2 * mantissa) - 1;
+ }
+ wuffs_base__private_implementation__high_prec_dec lower;
+ wuffs_base__private_implementation__high_prec_dec__assign(
+ &lower, (2 * l_mantissa) + 1, false);
+ wuffs_base__private_implementation__high_prec_dec__lshift(&lower,
+ l_exp2 - 53);
+
+ // Next, the upper bound. Our number f is:
+ // ((mantissa + 0) * (2 ** (exp2 - 52)))
+ //
+ // The next highest floating point number is:
+ // ((mantissa + 1) * (2 ** (exp2 - 52)))
+ //
+ // The upper bound is halfway between them (noting that 52 became 53):
+ // (((2 * mantissa) + 1) * (2 ** (exp2 - 53)))
+ wuffs_base__private_implementation__high_prec_dec upper;
+ wuffs_base__private_implementation__high_prec_dec__assign(
+ &upper, (2 * mantissa) + 1, false);
+ wuffs_base__private_implementation__high_prec_dec__lshift(&upper, exp2 - 53);
+
+ // The lower and upper bounds are possible outputs only if the original
+ // mantissa is even, so that IEEE round-to-even would round to the original
+ // mantissa and not its neighbors.
+ bool inclusive = (mantissa & 1) == 0;
+
+ // As we walk the digits, we want to know whether rounding up would fall
+ // within the upper bound. This is tracked by upper_delta:
+ // - When -1, the digits of h and upper are the same so far.
+ // - When +0, we saw a difference of 1 between h and upper on a previous
+ // digit and subsequently only 9s for h and 0s for upper. Thus, rounding
+ // up may fall outside of the bound if !inclusive.
+ // - When +1, the difference is greater than 1 and we know that rounding up
+ // falls within the bound.
+ //
+ // This is a state machine with three states. The numerical value for each
+ // state (-1, +0 or +1) isn't important, other than their order.
+ int upper_delta = -1;
+
+ // We can now figure out the shortest number of digits required. Walk the
+ // digits until h has distinguished itself from lower or upper.
+ //
+ // The zi and zd variables are indexes and digits, for z in l (lower), h (the
+ // number) and u (upper).
+ //
+ // The lower, h and upper numbers may have their decimal points at different
+ // places. In this case, upper is the longest, so we iterate ui starting from
+ // 0 and iterate li and hi starting from either 0 or -1.
+ int32_t ui = 0;
+ for (;; ui++) {
+ // Calculate hd, the middle number's digit.
+ int32_t hi = ui - upper.decimal_point + h->decimal_point;
+ if (hi >= ((int32_t)(h->num_digits))) {
+ break;
+ }
+ uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0;
+
+ // Calculate ld, the lower bound's digit.
+ int32_t li = ui - upper.decimal_point + lower.decimal_point;
+ uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0;
+
+ // We can round down (truncate) if lower has a different digit than h or if
+ // lower is inclusive and is exactly the result of rounding down (i.e. we
+ // have reached the final digit of lower).
+ bool can_round_down =
+ (ld != hd) || //
+ (inclusive && ((li + 1) == ((int32_t)(lower.num_digits))));
+
+ // Calculate ud, the upper bound's digit, and update upper_delta.
+ uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0;
+ if (upper_delta < 0) {
+ if ((hd + 1) < ud) {
+ // For example:
+ // h = 12345???
+ // upper = 12347???
+ upper_delta = +1;
+ } else if (hd != ud) {
+ // For example:
+ // h = 12345???
+ // upper = 12346???
+ upper_delta = +0;
+ }
+ } else if (upper_delta == 0) {
+ if ((hd != 9) || (ud != 0)) {
+ // For example:
+ // h = 1234598?
+ // upper = 1234600?
+ upper_delta = +1;
+ }
+ }
+
+ // We can round up if upper has a different digit than h and either upper
+ // is inclusive or upper is bigger than the result of rounding up.
+ bool can_round_up =
+ (upper_delta > 0) || //
+ ((upper_delta == 0) && //
+ (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits)))));
+
+ // If we can round either way, round to nearest. If we can round only one
+ // way, do it. If we can't round, continue the loop.
+ if (can_round_down) {
+ if (can_round_up) {
+ wuffs_base__private_implementation__high_prec_dec__round_nearest(
+ h, hi + 1);
+ return;
+ } else {
+ wuffs_base__private_implementation__high_prec_dec__round_down(h,
+ hi + 1);
+ return;
+ }
+ } else {
+ if (can_round_up) {
+ wuffs_base__private_implementation__high_prec_dec__round_up(h, hi + 1);
+ return;
+ }
+ }
+ }
+}
+
+// --------
+
+// wuffs_base__private_implementation__parse_number_f64_eisel_lemire produces
+// the IEEE 754 double-precision value for an exact mantissa and base-10
+// exponent. For example:
+// - when parsing "12345.678e+02", man is 12345678 and exp10 is -1.
+// - when parsing "-12", man is 12 and exp10 is 0. Processing the leading
+// minus sign is the responsibility of the caller, not this function.
+//
+// On success, it returns a non-negative int64_t such that the low 63 bits hold
+// the 11-bit exponent and 52-bit mantissa.
+//
+// On failure, it returns a negative value.
+//
+// The algorithm is based on an original idea by Michael Eisel that was refined
+// by Daniel Lemire. See
+// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/
+// and
+// https://nigeltao.github.io/blog/2020/eisel-lemire.html
+//
+// Preconditions:
+// - man is non-zero.
+// - exp10 is in the range [-307 ..= 288], the same range of the
+// wuffs_base__private_implementation__powers_of_10 array.
+//
+// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX],
+// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the
+// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal
+// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are
+// approximately 2.23e–308 and 1.80e+308.
+static int64_t //
+wuffs_base__private_implementation__parse_number_f64_eisel_lemire(
+ uint64_t man,
+ int32_t exp10) {
+ // Look up the (possibly truncated) base-2 representation of (10 ** exp10).
+ // The look-up table was constructed so that it is already normalized: the
+ // table entry's mantissa's MSB (most significant bit) is on.
+ const uint64_t* po10 =
+ &wuffs_base__private_implementation__powers_of_10[exp10 + 307][0];
+
+ // Normalize the man argument. The (man != 0) precondition means that a
+ // non-zero bit exists.
+ uint32_t clz = wuffs_base__count_leading_zeroes_u64(man);
+ man <<= clz;
+
+ // Calculate the return value's base-2 exponent. We might tweak it by ±1
+ // later, but its initial value comes from a linear scaling of exp10,
+ // converting from power-of-10 to power-of-2, and adjusting by clz.
+ //
+ // The magic constants are:
+ // - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because
+ // the look-up table uses 64-bit mantissas.
+ // - 217706 is such that the ratio 217706 / 65536 ≈ 3.321930 is close enough
+ // (over the practical range of exp10) to log(10) / log(2) ≈ 3.321928.
+ // - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift.
+ //
+ // Equality of the linearly-scaled value and the actual power-of-2, over the
+ // range of exp10 arguments that this function accepts, is confirmed by
+ // script/print-mpb-powers-of-10.go
+ uint64_t ret_exp2 =
+ ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz);
+
+ // Multiply the two mantissas. Normalization means that both mantissas are at
+ // least (1<<63), so the 128-bit product must be at least (1<<126). The high
+ // 64 bits of the product, x_hi, must therefore be at least (1<<62).
+ //
+ // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi
+ // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore
+ // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on.
+ wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]);
+ uint64_t x_hi = x.hi;
+ uint64_t x_lo = x.lo;
+
+ // Before we shift right by at least 9 bits, recall that the look-up table
+ // entry was possibly truncated. We have so far only calculated a lower bound
+ // for the product (man * e), where e is (10 ** exp10). The upper bound would
+ // add a further (man * 1) to the 128-bit product, which overflows the lower
+ // 64-bit limb if ((x_lo + man) < man).
+ //
+ // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right
+ // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit
+ // limb's low 9 bits are all on.
+ //
+ // For example, parsing "9999999999999999999" will take the if-true branch
+ // here, since:
+ // - x_hi = 0x4563918244F3FFFF
+ // - x_lo = 0x8000000000000000
+ // - man = 0x8AC7230489E7FFFF
+ if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) {
+ // Refine our calculation of (man * e). Before, our approximation of e used
+ // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit
+ // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e).
+ // Now calculate y = (man * bits_64_to_127_incl_of_e).
+ wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]);
+ uint64_t y_hi = y.hi;
+ uint64_t y_lo = y.lo;
+
+ // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to
+ // calculate the 192-bit product of the 64-bit man by the 128-bit e.
+ // As we exit this if-block, we only care about the high 128 bits
+ // (merged_hi and merged_lo) of that 192-bit product.
+ //
+ // For example, parsing "1.234e-45" will take the if-true branch here,
+ // since:
+ // - x_hi = 0x70B7E3696DB29FFF
+ // - x_lo = 0xE040000000000000
+ // - y_hi = 0x33718BBEAB0E0D7A
+ // - y_lo = 0xA880000000000000
+ uint64_t merged_hi = x_hi;
+ uint64_t merged_lo = x_lo + y_hi;
+ if (merged_lo < x_lo) {
+ merged_hi++; // Carry the overflow bit.
+ }
+
+ // The "high resolution" approximation of e is still a lower bound. Once
+ // again, see if the upper bound is large enough to produce a different
+ // result. This time, if it does, give up instead of reaching for an even
+ // more precise approximation to e.
+ //
+ // This three-part check is similar to the two-part check that guarded the
+ // if block that we're now in, but it has an extra term for the middle 64
+ // bits (checking that adding 1 to merged_lo would overflow).
+ //
+ // For example, parsing "5.9604644775390625e-8" will take the if-true
+ // branch here, since:
+ // - merged_hi = 0x7FFFFFFFFFFFFFFF
+ // - merged_lo = 0xFFFFFFFFFFFFFFFF
+ // - y_lo = 0x4DB3FFC120988200
+ // - man = 0xD3C21BCECCEDA100
+ if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) &&
+ (y_lo + man < man)) {
+ return -1;
+ }
+
+ // Replace the 128-bit x with merged.
+ x_hi = merged_hi;
+ x_lo = merged_lo;
+ }
+
+ // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave
+ // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the
+ // MSB (before shifting) was on, adjust ret_exp2 for the larger shift.
+ //
+ // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit
+ // number.
+ uint64_t msb = x_hi >> 63;
+ uint64_t ret_mantissa = x_hi >> (msb + 9);
+ ret_exp2 -= 1 ^ msb;
+
+ // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can
+ // be tricky. If we're half-way between two exactly representable numbers
+ // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give
+ // up instead of trying to pick the winner.
+ //
+ // Technically, we could tighten the condition by changing "73" to "73 or 74,
+ // depending on msb", but a flat "73" is simpler.
+ //
+ // For example, parsing "1e+23" will take the if-true branch here, since:
+ // - x_hi = 0x54B40B1F852BDA00
+ // - ret_mantissa = 0x002A5A058FC295ED
+ if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) {
+ return -1;
+ }
+
+ // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit
+ // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether
+ // it was on or off, shifting right by one then produces a 53-bit number. If
+ // carrying up overflowed, shift again.
+ ret_mantissa += ret_mantissa & 1;
+ ret_mantissa >>= 1;
+ // This if block is equivalent to (but benchmarks slightly faster than) the
+ // following branchless form:
+ // uint64_t overflow_adjustment = ret_mantissa >> 53;
+ // ret_mantissa >>= overflow_adjustment;
+ // ret_exp2 += overflow_adjustment;
+ //
+ // For example, parsing "7.2057594037927933e+16" will take the if-true
+ // branch here, since:
+ // - x_hi = 0x7FFFFFFFFFFFFE80
+ // - ret_mantissa = 0x0020000000000000
+ if ((ret_mantissa >> 53) > 0) {
+ ret_mantissa >>= 1;
+ ret_exp2++;
+ }
+
+ // Starting with a 53-bit number, IEEE 754 double-precision normal numbers
+ // have an implicit mantissa bit. Mask that away and keep the low 52 bits.
+ ret_mantissa &= 0x000FFFFFFFFFFFFF;
+
+ // Pack the bits and return.
+ return ((int64_t)(ret_mantissa | (ret_exp2 << 52)));
+}
+
+// --------
+
+static wuffs_base__result_f64 //
+wuffs_base__private_implementation__parse_number_f64_special(
+ wuffs_base__slice_u8 s,
+ uint32_t options) {
+ do {
+ if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) {
+ goto fail;
+ }
+
+ uint8_t* p = s.ptr;
+ uint8_t* q = s.ptr + s.len;
+
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+ if (p >= q) {
+ goto fail;
+ }
+
+ // Parse sign.
+ bool negative = false;
+ do {
+ if (*p == '+') {
+ p++;
+ } else if (*p == '-') {
+ negative = true;
+ p++;
+ } else {
+ break;
+ }
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+ } while (0);
+ if (p >= q) {
+ goto fail;
+ }
+
+ bool nan = false;
+ switch (p[0]) {
+ case 'I':
+ case 'i':
+ if (((q - p) < 3) || //
+ ((p[1] != 'N') && (p[1] != 'n')) || //
+ ((p[2] != 'F') && (p[2] != 'f'))) {
+ goto fail;
+ }
+ p += 3;
+
+ if ((p >= q) || (*p == '_')) {
+ break;
+ } else if (((q - p) < 5) || //
+ ((p[0] != 'I') && (p[0] != 'i')) || //
+ ((p[1] != 'N') && (p[1] != 'n')) || //
+ ((p[2] != 'I') && (p[2] != 'i')) || //
+ ((p[3] != 'T') && (p[3] != 't')) || //
+ ((p[4] != 'Y') && (p[4] != 'y'))) {
+ goto fail;
+ }
+ p += 5;
+
+ if ((p >= q) || (*p == '_')) {
+ break;
+ }
+ goto fail;
+
+ case 'N':
+ case 'n':
+ if (((q - p) < 3) || //
+ ((p[1] != 'A') && (p[1] != 'a')) || //
+ ((p[2] != 'N') && (p[2] != 'n'))) {
+ goto fail;
+ }
+ p += 3;
+
+ if ((p >= q) || (*p == '_')) {
+ nan = true;
+ break;
+ }
+ goto fail;
+
+ default:
+ goto fail;
+ }
+
+ // Finish.
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+ if (p != q) {
+ goto fail;
+ }
+ wuffs_base__result_f64 ret;
+ ret.status.repr = NULL;
+ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
+ (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) |
+ (negative ? 0x8000000000000000 : 0));
+ return ret;
+ } while (0);
+
+fail:
+ do {
+ wuffs_base__result_f64 ret;
+ ret.status.repr = wuffs_base__error__bad_argument;
+ ret.value = 0;
+ return ret;
+ } while (0);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 //
+wuffs_base__private_implementation__high_prec_dec__to_f64(
+ wuffs_base__private_implementation__high_prec_dec* h,
+ uint32_t options) {
+ do {
+ // powers converts decimal powers of 10 to binary powers of 2. For example,
+ // (10000 >> 13) is 1. It stops before the elements exceed 60, also known
+ // as WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL.
+ //
+ // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array
+ // element value rounds up (1<<14 is an upper bound for 1e4) while staying
+ // at or below WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL.
+ //
+ // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2),
+ // powers[2] == 6 and so:
+ // - Right shifting by 6+0 produces the range [10/64 .. 100/64] =
+ // [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1.
+ // - Right shifting by 6+1 produces the range [10/128 .. 100/128] =
+ // [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0.
+ //
+ // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2),
+ // powers[2] == 6 and so:
+ // - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] =
+ // [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0.
+ // - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] =
+ // [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1.
+ //
+ // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0)
+ // when right shifting but (powers[n]+1) when left shifting.
+ static const uint32_t num_powers = 19;
+ static const uint8_t powers[19] = {
+ 0, 3, 6, 9, 13, 16, 19, 23, 26, 29, //
+ 33, 36, 39, 43, 46, 49, 53, 56, 59, //
+ };
+
+ // Handle zero and obvious extremes. The largest and smallest positive
+ // finite f64 values are approximately 1.8e+308 and 4.9e-324.
+ if ((h->num_digits == 0) || (h->decimal_point < -326)) {
+ goto zero;
+ } else if (h->decimal_point > 310) {
+ goto infinity;
+ }
+
+ // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10)
+ // pair from the high_prec_dec h is more correct but slower than the
+ // approach taken in wuffs_base__parse_number_f64. The latter is optimized
+ // for the common cases (e.g. assuming no underscores or a leading '+'
+ // sign) rather than the full set of cases allowed by the Wuffs API.
+ //
+ // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying
+ // for an exact result). When we have more than 19 mantissa digits, run it
+ // twice to get a lower and upper bound. We still have an exact result
+ // (within f64's rounding margin) if both bounds are equal (and valid).
+ uint32_t i_max = h->num_digits;
+ if (i_max > 19) {
+ i_max = 19;
+ }
+ int32_t exp10 = h->decimal_point - ((int32_t)i_max);
+ if ((-307 <= exp10) && (exp10 <= 288)) {
+ uint64_t man = 0;
+ uint32_t i;
+ for (i = 0; i < i_max; i++) {
+ man = (10 * man) + h->digits[i];
+ }
+ while (man != 0) { // The 'while' is just an 'if' that we can 'break'.
+ int64_t r0 =
+ wuffs_base__private_implementation__parse_number_f64_eisel_lemire(
+ man + 0, exp10);
+ if (r0 < 0) {
+ break;
+ } else if (h->num_digits > 19) {
+ int64_t r1 =
+ wuffs_base__private_implementation__parse_number_f64_eisel_lemire(
+ man + 1, exp10);
+ if (r1 != r0) {
+ break;
+ }
+ }
+ wuffs_base__result_f64 ret;
+ ret.status.repr = NULL;
+ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
+ ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63));
+ return ret;
+ }
+ }
+
+ // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See
+ // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html
+ //
+ // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently,
+ // that h->decimal_point is +0 or +1.
+ //
+ // First we shift right while at or above 10...
+ const int32_t f64_bias = -1023;
+ int32_t exp2 = 0;
+ while (h->decimal_point > 1) {
+ uint32_t n = (uint32_t)(+h->decimal_point);
+ uint32_t shift =
+ (n < num_powers)
+ ? powers[n]
+ : WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL;
+
+ wuffs_base__private_implementation__high_prec_dec__small_rshift(h, shift);
+ if (h->decimal_point <
+ -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) {
+ goto zero;
+ }
+ exp2 += (int32_t)shift;
+ }
+ // ...then we shift left while below 0.1.
+ while (h->decimal_point < 0) {
+ uint32_t shift;
+ uint32_t n = (uint32_t)(-h->decimal_point);
+ shift = (n < num_powers)
+ // The +1 is per "when targeting h->decimal_point being +0 or
+ // +1... when left shifting" in the powers comment above.
+ ? (powers[n] + 1)
+ : WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL;
+
+ wuffs_base__private_implementation__high_prec_dec__small_lshift(h, shift);
+ if (h->decimal_point >
+ +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) {
+ goto infinity;
+ }
+ exp2 -= (int32_t)shift;
+ }
+
+ // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which
+ // will give us our exponent in base-2), the mantissa's first 3 digits will
+ // determine the final left shift, equal to 52 (the number of explicit f64
+ // bits) plus an additional adjustment.
+ int man3 = (100 * h->digits[0]) +
+ ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) +
+ ((h->num_digits > 2) ? h->digits[2] : 0);
+ int32_t additional_lshift = 0;
+ if (h->decimal_point == 0) { // The value is in [0.1 .. 1].
+ if (man3 < 125) {
+ additional_lshift = +4;
+ } else if (man3 < 250) {
+ additional_lshift = +3;
+ } else if (man3 < 500) {
+ additional_lshift = +2;
+ } else {
+ additional_lshift = +1;
+ }
+ } else { // The value is in [1 .. 10].
+ if (man3 < 200) {
+ additional_lshift = -0;
+ } else if (man3 < 400) {
+ additional_lshift = -1;
+ } else if (man3 < 800) {
+ additional_lshift = -2;
+ } else {
+ additional_lshift = -3;
+ }
+ }
+ exp2 -= additional_lshift;
+ uint32_t final_lshift = (uint32_t)(52 + additional_lshift);
+
+ // The minimum normal exponent is (f64_bias + 1).
+ while ((f64_bias + 1) > exp2) {
+ uint32_t n = (uint32_t)((f64_bias + 1) - exp2);
+ if (n > WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) {
+ n = WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL;
+ }
+ wuffs_base__private_implementation__high_prec_dec__small_rshift(h, n);
+ exp2 += (int32_t)n;
+ }
+
+ // Check for overflow.
+ if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1.
+ goto infinity;
+ }
+
+ // Extract 53 bits for the mantissa (in base-2).
+ wuffs_base__private_implementation__high_prec_dec__small_lshift(
+ h, final_lshift);
+ uint64_t man2 =
+ wuffs_base__private_implementation__high_prec_dec__rounded_integer(h);
+
+ // Rounding might have added one bit. If so, shift and re-check overflow.
+ if ((man2 >> 53) != 0) {
+ man2 >>= 1;
+ exp2++;
+ if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1.
+ goto infinity;
+ }
+ }
+
+ // Handle subnormal numbers.
+ if ((man2 >> 52) == 0) {
+ exp2 = f64_bias;
+ }
+
+ // Pack the bits and return.
+ uint64_t exp2_bits =
+ (uint64_t)((exp2 - f64_bias) & 0x07FF); // (1 << 11) - 1.
+ uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) | // (1 << 52) - 1.
+ (exp2_bits << 52) | //
+ (h->negative ? 0x8000000000000000 : 0); // (1 << 63).
+
+ wuffs_base__result_f64 ret;
+ ret.status.repr = NULL;
+ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
+ return ret;
+ } while (0);
+
+zero:
+ do {
+ uint64_t bits = h->negative ? 0x8000000000000000 : 0;
+
+ wuffs_base__result_f64 ret;
+ ret.status.repr = NULL;
+ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
+ return ret;
+ } while (0);
+
+infinity:
+ do {
+ if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) {
+ wuffs_base__result_f64 ret;
+ ret.status.repr = wuffs_base__error__bad_argument;
+ ret.value = 0;
+ return ret;
+ }
+
+ uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000;
+
+ wuffs_base__result_f64 ret;
+ ret.status.repr = NULL;
+ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
+ return ret;
+ } while (0);
+}
+
+static inline bool //
+wuffs_base__private_implementation__is_decimal_digit(uint8_t c) {
+ return ('0' <= c) && (c <= '9');
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 //
+wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) {
+ // In practice, almost all "dd.ddddE±xxx" numbers can be represented
+ // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10
+ // exponent, adjusting "xxx" for the position (if present) of the decimal
+ // separator '.' or ','.
+ //
+ // This (u64 man, i32 exp10) data structure is superficially similar to the
+ // "Do It Yourself Floating Point" type from Loitsch (†), but the exponent
+ // here is base-10, not base-2.
+ //
+ // If s's number fits in a (man, exp10), parse that pair with the
+ // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with
+ // the fallback algorithm is slower but comprehensive.
+ //
+ // † "Printing Floating-Point Numbers Quickly and Accurately with Integers"
+ // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf).
+ // Florian Loitsch is also the primary contributor to
+ // https://github.com/google/double-conversion
+ do {
+ // Calculating that (man, exp10) pair needs to stay within s's bounds.
+ // Provided that s isn't extremely long, work on a NUL-terminated copy of
+ // s's contents. The NUL byte isn't a valid part of "±dd.ddddE±xxx".
+ //
+ // As the pointer p walks the contents, it's faster to repeatedly check "is
+ // *p a valid digit" than "is p within bounds and *p a valid digit".
+ if (s.len >= 256) {
+ goto fallback;
+ }
+ uint8_t z[256];
+ memcpy(&z[0], s.ptr, s.len);
+ z[s.len] = 0;
+ const uint8_t* p = &z[0];
+
+ // Look for a leading minus sign. Technically, we could also look for an
+ // optional plus sign, but the "script/process-json-numbers.c with -p"
+ // benchmark is noticably slower if we do. It's optional and, in practice,
+ // usually absent. Let the fallback catch it.
+ bool negative = (*p == '-');
+ if (negative) {
+ p++;
+ }
+
+ // After walking "dd.dddd", comparing p later with p now will produce the
+ // number of "d"s and "."s.
+ const uint8_t* const start_of_digits_ptr = p;
+
+ // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0',
+ // it must be a single '0'. If it starts with a non-zero decimal digit, it
+ // can be a sequence of decimal digits.
+ //
+ // Update the man variable during the walk. It's OK if man overflows now.
+ // We'll detect that later.
+ uint64_t man;
+ if (*p == '0') {
+ man = 0;
+ p++;
+ if (wuffs_base__private_implementation__is_decimal_digit(*p)) {
+ goto fallback;
+ }
+ } else if (wuffs_base__private_implementation__is_decimal_digit(*p)) {
+ man = ((uint8_t)(*p - '0'));
+ p++;
+ for (; wuffs_base__private_implementation__is_decimal_digit(*p); p++) {
+ man = (10 * man) + ((uint8_t)(*p - '0'));
+ }
+ } else {
+ goto fallback;
+ }
+
+ // Walk the "d"s after the optional decimal separator ('.' or ','),
+ // updating the man and exp10 variables.
+ int32_t exp10 = 0;
+ if (*p ==
+ ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
+ ? ','
+ : '.')) {
+ p++;
+ const uint8_t* first_after_separator_ptr = p;
+ if (!wuffs_base__private_implementation__is_decimal_digit(*p)) {
+ goto fallback;
+ }
+ man = (10 * man) + ((uint8_t)(*p - '0'));
+ p++;
+ for (; wuffs_base__private_implementation__is_decimal_digit(*p); p++) {
+ man = (10 * man) + ((uint8_t)(*p - '0'));
+ }
+ exp10 = ((int32_t)(first_after_separator_ptr - p));
+ }
+
+ // Count the number of digits:
+ // - for an input of "314159", digit_count is 6.
+ // - for an input of "3.14159", digit_count is 7.
+ //
+ // This is off-by-one if there is a decimal separator. That's OK for now.
+ // We'll correct for that later. The "script/process-json-numbers.c with
+ // -p" benchmark is noticably slower if we try to correct for that now.
+ uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr);
+
+ // Update exp10 for the optional exponent, starting with 'E' or 'e'.
+ if ((*p | 0x20) == 'e') {
+ p++;
+ int32_t exp_sign = +1;
+ if (*p == '-') {
+ p++;
+ exp_sign = -1;
+ } else if (*p == '+') {
+ p++;
+ }
+ if (!wuffs_base__private_implementation__is_decimal_digit(*p)) {
+ goto fallback;
+ }
+ int32_t exp_num = ((uint8_t)(*p - '0'));
+ p++;
+ // The rest of the exp_num walking has a peculiar control flow but, once
+ // again, the "script/process-json-numbers.c with -p" benchmark is
+ // sensitive to alternative formulations.
+ if (wuffs_base__private_implementation__is_decimal_digit(*p)) {
+ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
+ p++;
+ }
+ if (wuffs_base__private_implementation__is_decimal_digit(*p)) {
+ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
+ p++;
+ }
+ while (wuffs_base__private_implementation__is_decimal_digit(*p)) {
+ if (exp_num > 0x1000000) {
+ goto fallback;
+ }
+ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
+ p++;
+ }
+ exp10 += exp_sign * exp_num;
+ }
+
+ // The Wuffs API is that the original slice has no trailing data. It also
+ // allows underscores, which we don't catch here but the fallback should.
+ if (p != &z[s.len]) {
+ goto fallback;
+ }
+
+ // Check that the uint64_t typed man variable has not overflowed, based on
+ // digit_count.
+ //
+ // For reference:
+ // - (1 << 63) is 9223372036854775808, which has 19 decimal digits.
+ // - (1 << 64) is 18446744073709551616, which has 20 decimal digits.
+ // - 19 nines, 9999999999999999999, is 0x8AC7230489E7FFFF, which has 64
+ // bits and 16 hexadecimal digits.
+ // - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67
+ // bits and 17 hexadecimal digits.
+ if (digit_count > 19) {
+ // Even if we have more than 19 pseudo-digits, it's not yet definitely an
+ // overflow. Recall that digit_count might be off-by-one (too large) if
+ // there's a decimal separator. It will also over-report the number of
+ // meaningful digits if the input looks something like "0.000dddExxx".
+ //
+ // We adjust by the number of leading '0's and '.'s and re-compare to 19.
+ // Once again, technically, we could skip ','s too, but that perturbs the
+ // "script/process-json-numbers.c with -p" benchmark.
+ const uint8_t* q = start_of_digits_ptr;
+ for (; (*q == '0') || (*q == '.'); q++) {
+ }
+ digit_count -= (uint32_t)(q - start_of_digits_ptr);
+ if (digit_count > 19) {
+ goto fallback;
+ }
+ }
+
+ // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire
+ // preconditions include that exp10 is in the range [-307 ..= 288].
+ if ((exp10 < -307) || (288 < exp10)) {
+ goto fallback;
+ }
+
+ // If both man and (10 ** exp10) are exactly representable by a double, we
+ // don't need to run the Eisel-Lemire algorithm.
+ if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) {
+ double d = (double)man;
+ if (exp10 >= 0) {
+ d *= wuffs_base__private_implementation__f64_powers_of_10[+exp10];
+ } else {
+ d /= wuffs_base__private_implementation__f64_powers_of_10[-exp10];
+ }
+ wuffs_base__result_f64 ret;
+ ret.status.repr = NULL;
+ ret.value = negative ? -d : +d;
+ return ret;
+ }
+
+ // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire
+ // preconditions include that man is non-zero. Parsing "0" should be caught
+ // by the "If both man and (10 ** exp10)" above, but "0e99" might not.
+ if (man == 0) {
+ goto fallback;
+ }
+
+ // Our man and exp10 are in range. Run the Eisel-Lemire algorithm.
+ int64_t r =
+ wuffs_base__private_implementation__parse_number_f64_eisel_lemire(
+ man, exp10);
+ if (r < 0) {
+ goto fallback;
+ }
+ wuffs_base__result_f64 ret;
+ ret.status.repr = NULL;
+ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
+ ((uint64_t)r) | (((uint64_t)negative) << 63));
+ return ret;
+ } while (0);
+
+fallback:
+ do {
+ wuffs_base__private_implementation__high_prec_dec h;
+ wuffs_base__status status =
+ wuffs_base__private_implementation__high_prec_dec__parse(&h, s,
+ options);
+ if (status.repr) {
+ return wuffs_base__private_implementation__parse_number_f64_special(
+ s, options);
+ }
+ return wuffs_base__private_implementation__high_prec_dec__to_f64(&h,
+ options);
+ } while (0);
+}
+
+// --------
+
+static inline size_t //
+wuffs_base__private_implementation__render_inf(wuffs_base__slice_u8 dst,
+ bool neg,
+ uint32_t options) {
+ if (neg) {
+ if (dst.len < 4) {
+ return 0;
+ }
+ wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D); // '-Inf'le.
+ return 4;
+ }
+
+ if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
+ if (dst.len < 4) {
+ return 0;
+ }
+ wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B); // '+Inf'le.
+ return 4;
+ }
+
+ if (dst.len < 3) {
+ return 0;
+ }
+ wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49); // 'Inf'le.
+ return 3;
+}
+
+static inline size_t //
+wuffs_base__private_implementation__render_nan(wuffs_base__slice_u8 dst) {
+ if (dst.len < 3) {
+ return 0;
+ }
+ wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E); // 'NaN'le.
+ return 3;
+}
+
+static size_t //
+wuffs_base__private_implementation__high_prec_dec__render_exponent_absent(
+ wuffs_base__slice_u8 dst,
+ wuffs_base__private_implementation__high_prec_dec* h,
+ uint32_t precision,
+ uint32_t options) {
+ size_t n = (h->negative ||
+ (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN))
+ ? 1
+ : 0;
+ if (h->decimal_point <= 0) {
+ n += 1;
+ } else {
+ n += (size_t)(h->decimal_point);
+ }
+ if (precision > 0) {
+ n += precision + 1; // +1 for the '.'.
+ }
+
+ // Don't modify dst if the formatted number won't fit.
+ if (n > dst.len) {
+ return 0;
+ }
+
+ // Align-left or align-right.
+ uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
+ ? &dst.ptr[dst.len - n]
+ : &dst.ptr[0];
+
+ // Leading "±".
+ if (h->negative) {
+ *ptr++ = '-';
+ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
+ *ptr++ = '+';
+ }
+
+ // Integral digits.
+ if (h->decimal_point <= 0) {
+ *ptr++ = '0';
+ } else {
+ uint32_t m =
+ wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point));
+ uint32_t i = 0;
+ for (; i < m; i++) {
+ *ptr++ = (uint8_t)('0' | h->digits[i]);
+ }
+ for (; i < (uint32_t)(h->decimal_point); i++) {
+ *ptr++ = '0';
+ }
+ }
+
+ // Separator and then fractional digits.
+ if (precision > 0) {
+ *ptr++ =
+ (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
+ ? ','
+ : '.';
+ uint32_t i = 0;
+ for (; i < precision; i++) {
+ uint32_t j = ((uint32_t)(h->decimal_point)) + i;
+ *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0));
+ }
+ }
+
+ return n;
+}
+
+static size_t //
+wuffs_base__private_implementation__high_prec_dec__render_exponent_present(
+ wuffs_base__slice_u8 dst,
+ wuffs_base__private_implementation__high_prec_dec* h,
+ uint32_t precision,
+ uint32_t options) {
+ int32_t exp = 0;
+ if (h->num_digits > 0) {
+ exp = h->decimal_point - 1;
+ }
+ bool negative_exp = exp < 0;
+ if (negative_exp) {
+ exp = -exp;
+ }
+
+ size_t n = (h->negative ||
+ (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN))
+ ? 4
+ : 3; // Mininum 3 bytes: first digit and then "e±".
+ if (precision > 0) {
+ n += precision + 1; // +1 for the '.'.
+ }
+ n += (exp < 100) ? 2 : 3;
+
+ // Don't modify dst if the formatted number won't fit.
+ if (n > dst.len) {
+ return 0;
+ }
+
+ // Align-left or align-right.
+ uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
+ ? &dst.ptr[dst.len - n]
+ : &dst.ptr[0];
+
+ // Leading "±".
+ if (h->negative) {
+ *ptr++ = '-';
+ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
+ *ptr++ = '+';
+ }
+
+ // Integral digit.
+ if (h->num_digits > 0) {
+ *ptr++ = (uint8_t)('0' | h->digits[0]);
+ } else {
+ *ptr++ = '0';
+ }
+
+ // Separator and then fractional digits.
+ if (precision > 0) {
+ *ptr++ =
+ (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
+ ? ','
+ : '.';
+ uint32_t i = 1;
+ uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1);
+ for (; i < j; i++) {
+ *ptr++ = (uint8_t)('0' | h->digits[i]);
+ }
+ for (; i <= precision; i++) {
+ *ptr++ = '0';
+ }
+ }
+
+ // Exponent: "e±" and then 2 or 3 digits.
+ *ptr++ = 'e';
+ *ptr++ = negative_exp ? '-' : '+';
+ if (exp < 10) {
+ *ptr++ = '0';
+ *ptr++ = (uint8_t)('0' | exp);
+ } else if (exp < 100) {
+ *ptr++ = (uint8_t)('0' | (exp / 10));
+ *ptr++ = (uint8_t)('0' | (exp % 10));
+ } else {
+ int32_t e = exp / 100;
+ exp -= e * 100;
+ *ptr++ = (uint8_t)('0' | e);
+ *ptr++ = (uint8_t)('0' | (exp / 10));
+ *ptr++ = (uint8_t)('0' | (exp % 10));
+ }
+
+ return n;
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_f64(wuffs_base__slice_u8 dst,
+ double x,
+ uint32_t precision,
+ uint32_t options) {
+ // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits
+ // with a -1023 bias) and mantissa (52 bits).
+ uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x);
+ bool neg = (bits >> 63) != 0;
+ int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF;
+ uint64_t man = bits & 0x000FFFFFFFFFFFFFul;
+
+ // Apply the exponent bias and set the implicit top bit of the mantissa,
+ // unless x is subnormal. Also take care of Inf and NaN.
+ if (exp2 == 0x7FF) {
+ if (man != 0) {
+ return wuffs_base__private_implementation__render_nan(dst);
+ }
+ return wuffs_base__private_implementation__render_inf(dst, neg, options);
+ } else if (exp2 == 0) {
+ exp2 = -1022;
+ } else {
+ exp2 -= 1023;
+ man |= 0x0010000000000000ul;
+ }
+
+ // Ensure that precision isn't too large.
+ if (precision > 4095) {
+ precision = 4095;
+ }
+
+ // Convert from the (neg, exp2, man) tuple to an HPD.
+ wuffs_base__private_implementation__high_prec_dec h;
+ wuffs_base__private_implementation__high_prec_dec__assign(&h, man, neg);
+ if (h.num_digits > 0) {
+ wuffs_base__private_implementation__high_prec_dec__lshift(
+ &h, exp2 - 52); // 52 mantissa bits.
+ }
+
+ // Handle the "%e" and "%f" formats.
+ switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT |
+ WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) {
+ case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT: // The "%"f" format.
+ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
+ wuffs_base__private_implementation__high_prec_dec__round_just_enough(
+ &h, exp2, man);
+ int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point;
+ precision = ((uint32_t)(wuffs_base__i32__max(0, p)));
+ } else {
+ wuffs_base__private_implementation__high_prec_dec__round_nearest(
+ &h, ((int32_t)precision) + h.decimal_point);
+ }
+ return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent(
+ dst, &h, precision, options);
+
+ case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT: // The "%e" format.
+ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
+ wuffs_base__private_implementation__high_prec_dec__round_just_enough(
+ &h, exp2, man);
+ precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0;
+ } else {
+ wuffs_base__private_implementation__high_prec_dec__round_nearest(
+ &h, ((int32_t)precision) + 1);
+ }
+ return wuffs_base__private_implementation__high_prec_dec__render_exponent_present(
+ dst, &h, precision, options);
+ }
+
+ // We have the "%g" format and so precision means the number of significant
+ // digits, not the number of digits after the decimal separator. Perform
+ // rounding and determine whether to use "%e" or "%f".
+ int32_t e_threshold = 0;
+ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
+ wuffs_base__private_implementation__high_prec_dec__round_just_enough(
+ &h, exp2, man);
+ precision = h.num_digits;
+ e_threshold = 6;
+ } else {
+ if (precision == 0) {
+ precision = 1;
+ }
+ wuffs_base__private_implementation__high_prec_dec__round_nearest(
+ &h, ((int32_t)precision));
+ e_threshold = ((int32_t)precision);
+ int32_t nd = ((int32_t)(h.num_digits));
+ if ((e_threshold > nd) && (nd >= h.decimal_point)) {
+ e_threshold = nd;
+ }
+ }
+
+ // Use the "%e" format if the exponent is large.
+ int32_t e = h.decimal_point - 1;
+ if ((e < -4) || (e_threshold <= e)) {
+ uint32_t p = wuffs_base__u32__min(precision, h.num_digits);
+ return wuffs_base__private_implementation__high_prec_dec__render_exponent_present(
+ dst, &h, (p > 0) ? (p - 1) : 0, options);
+ }
+
+ // Use the "%f" format otherwise.
+ int32_t p = ((int32_t)precision);
+ if (p > h.decimal_point) {
+ p = ((int32_t)(h.num_digits));
+ }
+ precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point)));
+ return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent(
+ dst, &h, precision, options);
+}
+
+#endif // !defined(WUFFS_CONFIG__MODULES) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
+ defined(WUFFS_CONFIG__MODULE__BASE__INTCONV)
+
+// ---------------- Integer
+
+// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits,
+// and (0x80 | v) for valid digits, where v is the 4 bit value.
+
+static const uint8_t wuffs_base__parse_number__decimal_digits[256] = {
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F.
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'.
+ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF.
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+};
+
+static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = {
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F.
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'.
+ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'.
+
+ 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x40 ..= 0x47. 'A'-'F'.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F.
+ 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x60 ..= 0x67. 'a'-'f'.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF.
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+};
+
+static const uint8_t wuffs_base__private_implementation__encode_base16[16] = {
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 0x00 ..= 0x07.
+ 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, // 0x08 ..= 0x0F.
+};
+
+// --------
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 //
+wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) {
+ uint8_t* p = s.ptr;
+ uint8_t* q = s.ptr + s.len;
+
+ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+ }
+
+ bool negative = false;
+ if (p >= q) {
+ goto fail_bad_argument;
+ } else if (*p == '-') {
+ p++;
+ negative = true;
+ } else if (*p == '+') {
+ p++;
+ }
+
+ do {
+ wuffs_base__result_u64 r = wuffs_base__parse_number_u64(
+ wuffs_base__make_slice_u8(p, (size_t)(q - p)), options);
+ if (r.status.repr != NULL) {
+ wuffs_base__result_i64 ret;
+ ret.status.repr = r.status.repr;
+ ret.value = 0;
+ return ret;
+ } else if (negative) {
+ if (r.value < 0x8000000000000000) {
+ wuffs_base__result_i64 ret;
+ ret.status.repr = NULL;
+ ret.value = -(int64_t)(r.value);
+ return ret;
+ } else if (r.value == 0x8000000000000000) {
+ wuffs_base__result_i64 ret;
+ ret.status.repr = NULL;
+ ret.value = INT64_MIN;
+ return ret;
+ }
+ goto fail_out_of_bounds;
+ } else if (r.value > 0x7FFFFFFFFFFFFFFF) {
+ goto fail_out_of_bounds;
+ } else {
+ wuffs_base__result_i64 ret;
+ ret.status.repr = NULL;
+ ret.value = +(int64_t)(r.value);
+ return ret;
+ }
+ } while (0);
+
+fail_bad_argument:
+ do {
+ wuffs_base__result_i64 ret;
+ ret.status.repr = wuffs_base__error__bad_argument;
+ ret.value = 0;
+ return ret;
+ } while (0);
+
+fail_out_of_bounds:
+ do {
+ wuffs_base__result_i64 ret;
+ ret.status.repr = wuffs_base__error__out_of_bounds;
+ ret.value = 0;
+ return ret;
+ } while (0);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 //
+wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) {
+ uint8_t* p = s.ptr;
+ uint8_t* q = s.ptr + s.len;
+
+ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+ }
+
+ if (p >= q) {
+ goto fail_bad_argument;
+
+ } else if (*p == '0') {
+ p++;
+ if (p >= q) {
+ goto ok_zero;
+ }
+ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
+ if (*p == '_') {
+ p++;
+ for (; p < q; p++) {
+ if (*p != '_') {
+ if (options &
+ WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) {
+ goto decimal;
+ }
+ goto fail_bad_argument;
+ }
+ }
+ goto ok_zero;
+ }
+ }
+
+ if ((*p == 'x') || (*p == 'X')) {
+ p++;
+ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+ }
+ if (p < q) {
+ goto hexadecimal;
+ }
+
+ } else if ((*p == 'd') || (*p == 'D')) {
+ p++;
+ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
+ for (; (p < q) && (*p == '_'); p++) {
+ }
+ }
+ if (p < q) {
+ goto decimal;
+ }
+ }
+
+ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) {
+ goto decimal;
+ }
+ goto fail_bad_argument;
+ }
+
+decimal:
+ do {
+ uint64_t v = wuffs_base__parse_number__decimal_digits[*p++];
+ if (v == 0) {
+ goto fail_bad_argument;
+ }
+ v &= 0x0F;
+
+ // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1).
+ const uint64_t max10 = 1844674407370955161u;
+ const uint8_t max1 = 5;
+
+ for (; p < q; p++) {
+ if ((*p == '_') &&
+ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
+ continue;
+ }
+ uint8_t digit = wuffs_base__parse_number__decimal_digits[*p];
+ if (digit == 0) {
+ goto fail_bad_argument;
+ }
+ digit &= 0x0F;
+ if ((v > max10) || ((v == max10) && (digit > max1))) {
+ goto fail_out_of_bounds;
+ }
+ v = (10 * v) + ((uint64_t)(digit));
+ }
+
+ wuffs_base__result_u64 ret;
+ ret.status.repr = NULL;
+ ret.value = v;
+ return ret;
+ } while (0);
+
+hexadecimal:
+ do {
+ uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++];
+ if (v == 0) {
+ goto fail_bad_argument;
+ }
+ v &= 0x0F;
+
+ for (; p < q; p++) {
+ if ((*p == '_') &&
+ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
+ continue;
+ }
+ uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p];
+ if (digit == 0) {
+ goto fail_bad_argument;
+ }
+ digit &= 0x0F;
+ if ((v >> 60) != 0) {
+ goto fail_out_of_bounds;
+ }
+ v = (v << 4) | ((uint64_t)(digit));
+ }
+
+ wuffs_base__result_u64 ret;
+ ret.status.repr = NULL;
+ ret.value = v;
+ return ret;
+ } while (0);
+
+ok_zero:
+ do {
+ wuffs_base__result_u64 ret;
+ ret.status.repr = NULL;
+ ret.value = 0;
+ return ret;
+ } while (0);
+
+fail_bad_argument:
+ do {
+ wuffs_base__result_u64 ret;
+ ret.status.repr = wuffs_base__error__bad_argument;
+ ret.value = 0;
+ return ret;
+ } while (0);
+
+fail_out_of_bounds:
+ do {
+ wuffs_base__result_u64 ret;
+ ret.status.repr = wuffs_base__error__out_of_bounds;
+ ret.value = 0;
+ return ret;
+ } while (0);
+}
+
+// --------
+
+// wuffs_base__render_number__first_hundred contains the decimal encodings of
+// the first one hundred numbers [0 ..= 99].
+static const uint8_t wuffs_base__render_number__first_hundred[200] = {
+ '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', //
+ '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', //
+ '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', //
+ '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', //
+ '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', //
+ '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', //
+ '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', //
+ '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', //
+ '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', //
+ '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', //
+ '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', //
+ '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', //
+ '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', //
+ '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', //
+ '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', //
+ '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', //
+ '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', //
+ '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', //
+ '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', //
+ '9', '5', '9', '6', '9', '7', '9', '8', '9', '9', //
+};
+
+static size_t //
+wuffs_base__private_implementation__render_number_u64(wuffs_base__slice_u8 dst,
+ uint64_t x,
+ uint32_t options,
+ bool neg) {
+ uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL];
+ uint8_t* ptr = &buf[0] + sizeof(buf);
+
+ while (x >= 100) {
+ size_t index = ((size_t)((x % 100) * 2));
+ x /= 100;
+ uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0];
+ uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1];
+ ptr -= 2;
+ ptr[0] = s0;
+ ptr[1] = s1;
+ }
+
+ if (x < 10) {
+ ptr -= 1;
+ ptr[0] = (uint8_t)('0' + x);
+ } else {
+ size_t index = ((size_t)(x * 2));
+ uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0];
+ uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1];
+ ptr -= 2;
+ ptr[0] = s0;
+ ptr[1] = s1;
+ }
+
+ if (neg) {
+ ptr -= 1;
+ ptr[0] = '-';
+ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
+ ptr -= 1;
+ ptr[0] = '+';
+ }
+
+ size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0]));
+ if (n > dst.len) {
+ return 0;
+ }
+ memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
+ ? (dst.len - n)
+ : 0),
+ ptr, n);
+ return n;
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_i64(wuffs_base__slice_u8 dst,
+ int64_t x,
+ uint32_t options) {
+ uint64_t u = (uint64_t)x;
+ bool neg = x < 0;
+ if (neg) {
+ u = 1 + ~u;
+ }
+ return wuffs_base__private_implementation__render_number_u64(dst, u, options,
+ neg);
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__render_number_u64(wuffs_base__slice_u8 dst,
+ uint64_t x,
+ uint32_t options) {
+ return wuffs_base__private_implementation__render_number_u64(dst, x, options,
+ false);
+}
+
+// ---------------- Base-16
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options) {
+ wuffs_base__transform__output o;
+ size_t src_len2 = src.len / 2;
+ size_t len;
+ if (dst.len < src_len2) {
+ len = dst.len;
+ o.status.repr = wuffs_base__suspension__short_write;
+ } else {
+ len = src_len2;
+ if (!src_closed) {
+ o.status.repr = wuffs_base__suspension__short_read;
+ } else if (src.len & 1) {
+ o.status.repr = wuffs_base__error__bad_data;
+ } else {
+ o.status.repr = NULL;
+ }
+ }
+
+ uint8_t* d = dst.ptr;
+ uint8_t* s = src.ptr;
+ size_t n = len;
+
+ while (n--) {
+ *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) |
+ (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F));
+ d += 1;
+ s += 2;
+ }
+
+ o.num_dst = len;
+ o.num_src = len * 2;
+ return o;
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options) {
+ wuffs_base__transform__output o;
+ size_t src_len4 = src.len / 4;
+ size_t len = dst.len < src_len4 ? dst.len : src_len4;
+ if (dst.len < src_len4) {
+ len = dst.len;
+ o.status.repr = wuffs_base__suspension__short_write;
+ } else {
+ len = src_len4;
+ if (!src_closed) {
+ o.status.repr = wuffs_base__suspension__short_read;
+ } else if (src.len & 1) {
+ o.status.repr = wuffs_base__error__bad_data;
+ } else {
+ o.status.repr = NULL;
+ }
+ }
+
+ uint8_t* d = dst.ptr;
+ uint8_t* s = src.ptr;
+ size_t n = len;
+
+ while (n--) {
+ *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) |
+ (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F));
+ d += 1;
+ s += 4;
+ }
+
+ o.num_dst = len;
+ o.num_src = len * 4;
+ return o;
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options) {
+ wuffs_base__transform__output o;
+ size_t dst_len2 = dst.len / 2;
+ size_t len;
+ if (dst_len2 < src.len) {
+ len = dst_len2;
+ o.status.repr = wuffs_base__suspension__short_write;
+ } else {
+ len = src.len;
+ if (!src_closed) {
+ o.status.repr = wuffs_base__suspension__short_read;
+ } else {
+ o.status.repr = NULL;
+ }
+ }
+
+ uint8_t* d = dst.ptr;
+ uint8_t* s = src.ptr;
+ size_t n = len;
+
+ while (n--) {
+ uint8_t c = *s;
+ d[0] = wuffs_base__private_implementation__encode_base16[c >> 4];
+ d[1] = wuffs_base__private_implementation__encode_base16[c & 0x0F];
+ d += 2;
+ s += 1;
+ }
+
+ o.num_dst = len * 2;
+ o.num_src = len;
+ return o;
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options) {
+ wuffs_base__transform__output o;
+ size_t dst_len4 = dst.len / 4;
+ size_t len;
+ if (dst_len4 < src.len) {
+ len = dst_len4;
+ o.status.repr = wuffs_base__suspension__short_write;
+ } else {
+ len = src.len;
+ if (!src_closed) {
+ o.status.repr = wuffs_base__suspension__short_read;
+ } else {
+ o.status.repr = NULL;
+ }
+ }
+
+ uint8_t* d = dst.ptr;
+ uint8_t* s = src.ptr;
+ size_t n = len;
+
+ while (n--) {
+ uint8_t c = *s;
+ d[0] = '\\';
+ d[1] = 'x';
+ d[2] = wuffs_base__private_implementation__encode_base16[c >> 4];
+ d[3] = wuffs_base__private_implementation__encode_base16[c & 0x0F];
+ d += 4;
+ s += 1;
+ }
+
+ o.num_dst = len * 4;
+ o.num_src = len;
+ return o;
+}
+
+// ---------------- Base-64
+
+// The two base-64 alphabets, std and url, differ only in the last two codes.
+// - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
+// - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
+
+static const uint8_t wuffs_base__base_64__decode_std[256] = {
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27.
+ 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F, // 0x28 ..= 0x2F.
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37.
+ 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F.
+
+ 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47.
+ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F.
+ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57.
+ 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x58 ..= 0x5F.
+ 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67.
+ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F.
+ 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77.
+ 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F.
+
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF.
+
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF.
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+};
+
+static const uint8_t wuffs_base__base_64__decode_url[256] = {
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, // 0x28 ..= 0x2F.
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37.
+ 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F.
+
+ 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47.
+ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F.
+ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57.
+ 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F, // 0x58 ..= 0x5F.
+ 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67.
+ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F.
+ 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77.
+ 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F.
+
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF.
+
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF.
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+};
+
+static const uint8_t wuffs_base__base_64__encode_std[64] = {
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07.
+ 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F.
+ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17.
+ 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F.
+ 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27.
+ 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F.
+ 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37.
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F, // 0x38 ..= 0x3F.
+};
+
+static const uint8_t wuffs_base__base_64__encode_url[64] = {
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07.
+ 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F.
+ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17.
+ 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F.
+ 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27.
+ 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F.
+ 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37.
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F, // 0x38 ..= 0x3F.
+};
+
+// --------
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_64__decode(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options) {
+ const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET)
+ ? wuffs_base__base_64__decode_url
+ : wuffs_base__base_64__decode_std;
+ wuffs_base__transform__output o;
+ uint8_t* d_ptr = dst.ptr;
+ size_t d_len = dst.len;
+ const uint8_t* s_ptr = src.ptr;
+ size_t s_len = src.len;
+ bool pad = false;
+
+ while (s_len >= 4) {
+ uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr);
+ uint32_t s0 = alphabet[0xFF & (s >> 0)];
+ uint32_t s1 = alphabet[0xFF & (s >> 8)];
+ uint32_t s2 = alphabet[0xFF & (s >> 16)];
+ uint32_t s3 = alphabet[0xFF & (s >> 24)];
+
+ if (((s0 | s1 | s2 | s3) & 0xC0) != 0) {
+ if (s_len > 4) {
+ o.status.repr = wuffs_base__error__bad_data;
+ goto done;
+ } else if (!src_closed) {
+ o.status.repr = wuffs_base__suspension__short_read;
+ goto done;
+ } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) &&
+ (s_ptr[3] == '=')) {
+ pad = true;
+ if (s_ptr[2] == '=') {
+ goto src2;
+ }
+ goto src3;
+ }
+ o.status.repr = wuffs_base__error__bad_data;
+ goto done;
+ }
+
+ if (d_len < 3) {
+ o.status.repr = wuffs_base__suspension__short_write;
+ goto done;
+ }
+
+ s_ptr += 4;
+ s_len -= 4;
+ s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0);
+ *d_ptr++ = (uint8_t)(s >> 16);
+ *d_ptr++ = (uint8_t)(s >> 8);
+ *d_ptr++ = (uint8_t)(s >> 0);
+ d_len -= 3;
+ }
+
+ if (!src_closed) {
+ o.status.repr = wuffs_base__suspension__short_read;
+ goto done;
+ }
+
+ if (s_len == 0) {
+ o.status.repr = NULL;
+ goto done;
+ } else if (s_len == 1) {
+ o.status.repr = wuffs_base__error__bad_data;
+ goto done;
+ } else if (s_len == 2) {
+ goto src2;
+ }
+
+src3:
+ do {
+ uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr);
+ uint32_t s0 = alphabet[0xFF & (s >> 0)];
+ uint32_t s1 = alphabet[0xFF & (s >> 8)];
+ uint32_t s2 = alphabet[0xFF & (s >> 16)];
+ if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) {
+ o.status.repr = wuffs_base__error__bad_data;
+ goto done;
+ }
+ if (d_len < 2) {
+ o.status.repr = wuffs_base__suspension__short_write;
+ goto done;
+ }
+ s_ptr += pad ? 4 : 3;
+ s = (s0 << 18) | (s1 << 12) | (s2 << 6);
+ *d_ptr++ = (uint8_t)(s >> 16);
+ *d_ptr++ = (uint8_t)(s >> 8);
+ o.status.repr = NULL;
+ goto done;
+ } while (0);
+
+src2:
+ do {
+ uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr);
+ uint32_t s0 = alphabet[0xFF & (s >> 0)];
+ uint32_t s1 = alphabet[0xFF & (s >> 8)];
+ if ((s0 & 0xC0) || (s1 & 0xCF)) {
+ o.status.repr = wuffs_base__error__bad_data;
+ goto done;
+ }
+ if (d_len < 1) {
+ o.status.repr = wuffs_base__suspension__short_write;
+ goto done;
+ }
+ s_ptr += pad ? 4 : 2;
+ s = (s0 << 18) | (s1 << 12);
+ *d_ptr++ = (uint8_t)(s >> 16);
+ o.status.repr = NULL;
+ goto done;
+ } while (0);
+
+done:
+ o.num_dst = (size_t)(d_ptr - dst.ptr);
+ o.num_src = (size_t)(s_ptr - src.ptr);
+ return o;
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output //
+wuffs_base__base_64__encode(wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 src,
+ bool src_closed,
+ uint32_t options) {
+ const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET)
+ ? wuffs_base__base_64__encode_url
+ : wuffs_base__base_64__encode_std;
+ wuffs_base__transform__output o;
+ uint8_t* d_ptr = dst.ptr;
+ size_t d_len = dst.len;
+ const uint8_t* s_ptr = src.ptr;
+ size_t s_len = src.len;
+
+ do {
+ while (s_len >= 3) {
+ if (d_len < 4) {
+ o.status.repr = wuffs_base__suspension__short_write;
+ goto done;
+ }
+ uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr);
+ s_ptr += 3;
+ s_len -= 3;
+ *d_ptr++ = alphabet[0x3F & (s >> 18)];
+ *d_ptr++ = alphabet[0x3F & (s >> 12)];
+ *d_ptr++ = alphabet[0x3F & (s >> 6)];
+ *d_ptr++ = alphabet[0x3F & (s >> 0)];
+ d_len -= 4;
+ }
+
+ if (!src_closed) {
+ o.status.repr = wuffs_base__suspension__short_read;
+ goto done;
+ }
+
+ if (s_len == 2) {
+ if (d_len <
+ ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) {
+ o.status.repr = wuffs_base__suspension__short_write;
+ goto done;
+ }
+ uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr)))
+ << 8;
+ s_ptr += 2;
+ *d_ptr++ = alphabet[0x3F & (s >> 18)];
+ *d_ptr++ = alphabet[0x3F & (s >> 12)];
+ *d_ptr++ = alphabet[0x3F & (s >> 6)];
+ if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) {
+ *d_ptr++ = '=';
+ }
+ o.status.repr = NULL;
+ goto done;
+
+ } else if (s_len == 1) {
+ if (d_len <
+ ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) {
+ o.status.repr = wuffs_base__suspension__short_write;
+ goto done;
+ }
+ uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr)))
+ << 16;
+ s_ptr += 1;
+ *d_ptr++ = alphabet[0x3F & (s >> 18)];
+ *d_ptr++ = alphabet[0x3F & (s >> 12)];
+ if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) {
+ *d_ptr++ = '=';
+ *d_ptr++ = '=';
+ }
+ o.status.repr = NULL;
+ goto done;
+
+ } else {
+ o.status.repr = NULL;
+ goto done;
+ }
+ } while (0);
+
+done:
+ o.num_dst = (size_t)(d_ptr - dst.ptr);
+ o.num_src = (size_t)(s_ptr - src.ptr);
+ return o;
+}
+
+#endif // !defined(WUFFS_CONFIG__MODULES) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
+ defined(WUFFS_CONFIG__MODULE__BASE__MAGIC)
+
+// ---------------- Magic Numbers
+
+// ICO doesn't start with a magic identifier. Instead, see if the opening bytes
+// are plausibly ICO.
+//
+// Callers should have already verified that (prefix_data.len >= 2) and the
+// first two bytes are 0x00.
+//
+// See:
+// - https://docs.fileformat.com/image/ico/
+static int32_t //
+wuffs_base__magic_number_guess_fourcc__maybe_ico(
+ wuffs_base__slice_u8 prefix_data,
+ bool prefix_closed) {
+ // Allow-list for the Image Type field.
+ if (prefix_data.len < 4) {
+ return prefix_closed ? 0 : -1;
+ } else if (prefix_data.ptr[3] != 0) {
+ return 0;
+ }
+ switch (prefix_data.ptr[2]) {
+ case 0x01: // ICO
+ case 0x02: // CUR
+ break;
+ default:
+ return 0;
+ }
+
+ // The Number Of Images should be positive.
+ if (prefix_data.len < 6) {
+ return prefix_closed ? 0 : -1;
+ } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) {
+ return 0;
+ }
+
+ // The first ICONDIRENTRY's fourth byte should be zero.
+ if (prefix_data.len < 10) {
+ return prefix_closed ? 0 : -1;
+ } else if (prefix_data.ptr[9] != 0) {
+ return 0;
+ }
+
+ // TODO: have a separate FourCC for CUR?
+ return 0x49434F20; // 'ICO 'be
+}
+
+// TGA doesn't start with a magic identifier. Instead, see if the opening bytes
+// are plausibly TGA.
+//
+// Callers should have already verified that (prefix_data.len >= 2) and the
+// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or
+// 0x01.
+//
+// See:
+// - https://docs.fileformat.com/image/tga/
+// - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf
+static int32_t //
+wuffs_base__magic_number_guess_fourcc__maybe_tga(
+ wuffs_base__slice_u8 prefix_data,
+ bool prefix_closed) {
+ // Allow-list for the Image Type field.
+ if (prefix_data.len < 3) {
+ return prefix_closed ? 0 : -1;
+ }
+ switch (prefix_data.ptr[2]) {
+ case 0x01:
+ case 0x02:
+ case 0x03:
+ case 0x09:
+ case 0x0A:
+ case 0x0B:
+ break;
+ default:
+ // TODO: 0x20 and 0x21 are invalid, according to the spec, but are
+ // apparently unofficial extensions.
+ return 0;
+ }
+
+ // Allow-list for the Color Map Entry Size field (if the Color Map Type field
+ // is non-zero) or else all the Color Map fields should be zero.
+ if (prefix_data.len < 8) {
+ return prefix_closed ? 0 : -1;
+ } else if (prefix_data.ptr[1] != 0x00) {
+ switch (prefix_data.ptr[7]) {
+ case 0x0F:
+ case 0x10:
+ case 0x18:
+ case 0x20:
+ break;
+ default:
+ return 0;
+ }
+ } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] |
+ prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) {
+ return 0;
+ }
+
+ // Allow-list for the Pixel Depth field.
+ if (prefix_data.len < 17) {
+ return prefix_closed ? 0 : -1;
+ }
+ switch (prefix_data.ptr[16]) {
+ case 0x01:
+ case 0x08:
+ case 0x0F:
+ case 0x10:
+ case 0x18:
+ case 0x20:
+ break;
+ default:
+ return 0;
+ }
+
+ return 0x54474120; // 'TGA 'be
+}
+
+WUFFS_BASE__MAYBE_STATIC int32_t //
+wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data,
+ bool prefix_closed) {
+ // This is similar to (but different from):
+ // - the magic/Magdir tables under https://github.com/file/file
+ // - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/
+
+ // table holds the 'magic numbers' (which are actually variable length
+ // strings). The strings may contain NUL bytes, so the "const char* magic"
+ // value starts with the length-minus-1 of the 'magic number'.
+ //
+ // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer
+ // matches) and finally by magic[2:]. When multiple entries match, the
+ // longest one wins.
+ //
+ // The fourcc field might be negated, in which case there's further
+ // specialization (see § below).
+ static struct {
+ int32_t fourcc;
+ const char* magic;
+ } table[] = {
+ {-0x30302020, "\x01\x00\x00"}, // '00 'be
+ {+0x475A2020, "\x02\x1F\x8B\x08"}, // GZ
+ {+0x5A535444, "\x03\x28\xB5\x2F\xFD"}, // ZSTD
+ {+0x425A3220, "\x02\x42\x5A\x68"}, // BZ2
+ {+0x424D5020, "\x01\x42\x4D"}, // BMP
+ {+0x47494620, "\x03\x47\x49\x46\x38"}, // GIF
+ {+0x54494646, "\x03\x49\x49\x2A\x00"}, // TIFF (little-endian)
+ {+0x54494646, "\x03\x4D\x4D\x00\x2A"}, // TIFF (big-endian)
+ {-0x52494646, "\x03\x52\x49\x46\x46"}, // RIFF
+ {+0x4E494520, "\x02\x6E\xC3\xAF"}, // NIE
+ {+0x514F4920, "\x03\x71\x6F\x69\x66"}, // QOI
+ {+0x5A4C4942, "\x01\x78\x9C"}, // ZLIB
+ {+0x504E4720, "\x03\x89\x50\x4E\x47"}, // PNG
+ {+0x4A504547, "\x01\xFF\xD8"}, // JPEG
+ };
+ static const size_t table_len = sizeof(table) / sizeof(table[0]);
+
+ if (prefix_data.len == 0) {
+ return prefix_closed ? 0 : -1;
+ }
+ uint8_t pre_first_byte = prefix_data.ptr[0];
+
+ int32_t fourcc = 0;
+ size_t i;
+ for (i = 0; i < table_len; i++) {
+ uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1]));
+ if (pre_first_byte < mag_first_byte) {
+ break;
+ } else if (pre_first_byte > mag_first_byte) {
+ continue;
+ }
+ fourcc = table[i].fourcc;
+
+ uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0]));
+ if (mag_remaining_len == 0) {
+ goto match;
+ }
+
+ const char* mag_remaining_ptr = table[i].magic + 2;
+ uint8_t* pre_remaining_ptr = prefix_data.ptr + 1;
+ size_t pre_remaining_len = prefix_data.len - 1;
+ if (pre_remaining_len < mag_remaining_len) {
+ if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) {
+ return prefix_closed ? 0 : -1;
+ }
+ } else {
+ if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) {
+ goto match;
+ }
+ }
+ }
+
+ if (prefix_data.len < 2) {
+ return prefix_closed ? 0 : -1;
+ } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) {
+ return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data,
+ prefix_closed);
+ }
+
+ return 0;
+
+match:
+ // Negative FourCC values (see § above) are further specialized.
+ if (fourcc < 0) {
+ fourcc = -fourcc;
+
+ if (fourcc == 0x52494646) { // 'RIFF'be
+ if (prefix_data.len < 12) {
+ return prefix_closed ? 0 : -1;
+ }
+ uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8);
+ if (x == 0x57454250) { // 'WEBP'be
+ return 0x57454250; // 'WEBP'be
+ }
+
+ } else if (fourcc == 0x30302020) { // '00 'be
+ // Binary data starting with multiple 0x00 NUL bytes is quite common.
+ // Unfortunately, some file formats also don't start with a magic
+ // identifier, so we have to use heuristics (where the order matters, the
+ // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe
+ // it's TGA, ICO/CUR, etc. Maybe it's something else.
+ int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga(
+ prefix_data, prefix_closed);
+ if (tga != 0) {
+ return tga;
+ }
+ int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico(
+ prefix_data, prefix_closed);
+ if (ico != 0) {
+ return ico;
+ }
+ if (prefix_data.len < 4) {
+ return prefix_closed ? 0 : -1;
+ } else if ((prefix_data.ptr[2] != 0x00) &&
+ ((prefix_data.ptr[2] >= 0x80) ||
+ (prefix_data.ptr[3] != 0x00))) {
+ // Roughly speaking, this could be a non-degenerate (non-0-width and
+ // non-0-height) WBMP image.
+ return 0x57424D50; // 'WBMP'be
+ }
+ return 0;
+ }
+ }
+ return fourcc;
+}
+
+#endif // !defined(WUFFS_CONFIG__MODULES) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
+ defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV)
+
+// ---------------- Pixel Swizzler
+
+static inline uint32_t //
+wuffs_base__swap_u32_argb_abgr(uint32_t u) {
+ uint32_t o = u & 0xFF00FF00ul;
+ uint32_t r = u & 0x00FF0000ul;
+ uint32_t b = u & 0x000000FFul;
+ return o | (r >> 16) | (b << 16);
+}
+
+static inline uint64_t //
+wuffs_base__swap_u64_argb_abgr(uint64_t u) {
+ uint64_t o = u & 0xFFFF0000FFFF0000ull;
+ uint64_t r = u & 0x0000FFFF00000000ull;
+ uint64_t b = u & 0x000000000000FFFFull;
+ return o | (r >> 32) | (b << 32);
+}
+
+static inline uint32_t //
+wuffs_base__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) {
+ uint32_t a = ((uint32_t)(0xFF & (c >> 56)));
+ uint32_t r = ((uint32_t)(0xFF & (c >> 40)));
+ uint32_t g = ((uint32_t)(0xFF & (c >> 24)));
+ uint32_t b = ((uint32_t)(0xFF & (c >> 8)));
+ return (a << 24) | (b << 16) | (g << 8) | (r << 0);
+}
+
+// --------
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul //
+wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb,
+ uint32_t x,
+ uint32_t y) {
+ if (!pb || (x >= pb->pixcfg.private_impl.width) ||
+ (y >= pb->pixcfg.private_impl.height)) {
+ return 0;
+ }
+
+ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
+ // TODO: support planar formats.
+ return 0;
+ }
+
+ size_t stride = pb->private_impl.planes[0].stride;
+ const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y));
+
+ switch (pb->pixcfg.private_impl.pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)));
+
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: {
+ uint8_t* palette = pb->private_impl.planes[3].ptr;
+ return wuffs_base__peek_u32le__no_bounds_check(palette +
+ (4 * ((size_t)row[x])));
+ }
+
+ // Common formats above. Rarer formats below.
+
+ case WUFFS_BASE__PIXEL_FORMAT__Y:
+ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x])));
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
+ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1])));
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
+ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0])));
+
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: {
+ uint8_t* palette = pb->private_impl.planes[3].ptr;
+ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
+ wuffs_base__peek_u32le__no_bounds_check(palette +
+ (4 * ((size_t)row[x]))));
+ }
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
+ wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x))));
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ return 0xFF000000 |
+ wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)));
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
+ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
+ wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x))));
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ return 0xFF000000 |
+ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)));
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ return wuffs_base__swap_u32_argb_abgr(
+ 0xFF000000 |
+ wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x))));
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ return wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
+ wuffs_base__peek_u32le__no_bounds_check(row +
+ (4 * ((size_t)x)))));
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ return wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ return wuffs_base__swap_u32_argb_abgr(
+ 0xFF000000 |
+ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
+
+ default:
+ // TODO: support more formats.
+ break;
+ }
+
+ return 0;
+}
+
+// --------
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status //
+wuffs_base__pixel_buffer__set_color_u32_at(
+ wuffs_base__pixel_buffer* pb,
+ uint32_t x,
+ uint32_t y,
+ wuffs_base__color_u32_argb_premul color) {
+ if (!pb) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if ((x >= pb->pixcfg.private_impl.width) ||
+ (y >= pb->pixcfg.private_impl.height)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+
+ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
+ // TODO: support planar formats.
+ return wuffs_base__make_status(wuffs_base__error__unsupported_option);
+ }
+
+ size_t stride = pb->private_impl.planes[0].stride;
+ uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y));
+
+ switch (pb->pixcfg.private_impl.pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color);
+ break;
+
+ // Common formats above. Rarer formats below.
+
+ case WUFFS_BASE__PIXEL_FORMAT__Y:
+ wuffs_base__poke_u8__no_bounds_check(
+ row + ((size_t)x),
+ wuffs_base__color_u32_argb_premul__as__color_u8_gray(color));
+ break;
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
+ wuffs_base__poke_u16le__no_bounds_check(
+ row + (2 * ((size_t)x)),
+ wuffs_base__color_u32_argb_premul__as__color_u16_gray(color));
+ break;
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
+ wuffs_base__poke_u16be__no_bounds_check(
+ row + (2 * ((size_t)x)),
+ wuffs_base__color_u32_argb_premul__as__color_u16_gray(color));
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
+ wuffs_base__poke_u8__no_bounds_check(
+ row + ((size_t)x), wuffs_base__pixel_palette__closest_element(
+ wuffs_base__pixel_buffer__palette(pb),
+ pb->pixcfg.private_impl.pixfmt, color));
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ wuffs_base__poke_u16le__no_bounds_check(
+ row + (2 * ((size_t)x)),
+ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color));
+ break;
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color);
+ break;
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ wuffs_base__poke_u32le__no_bounds_check(
+ row + (4 * ((size_t)x)),
+ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
+ color));
+ break;
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ wuffs_base__poke_u64le__no_bounds_check(
+ row + (8 * ((size_t)x)),
+ wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
+ color));
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ wuffs_base__poke_u24le__no_bounds_check(
+ row + (3 * ((size_t)x)), wuffs_base__swap_u32_argb_abgr(color));
+ break;
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ wuffs_base__poke_u32le__no_bounds_check(
+ row + (4 * ((size_t)x)),
+ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
+ wuffs_base__swap_u32_argb_abgr(color)));
+ break;
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ wuffs_base__poke_u32le__no_bounds_check(
+ row + (4 * ((size_t)x)), wuffs_base__swap_u32_argb_abgr(color));
+ break;
+
+ default:
+ // TODO: support more formats.
+ return wuffs_base__make_status(wuffs_base__error__unsupported_option);
+ }
+
+ return wuffs_base__make_status(NULL);
+}
+
+// --------
+
+static inline void //
+wuffs_base__pixel_buffer__set_color_u32_fill_rect__xx(
+ wuffs_base__pixel_buffer* pb,
+ wuffs_base__rect_ie_u32 rect,
+ uint16_t color) {
+ size_t stride = pb->private_impl.planes[0].stride;
+ uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
+ if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
+ uint8_t* ptr =
+ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
+ uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
+ size_t n;
+ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
+ wuffs_base__poke_u16le__no_bounds_check(ptr, color);
+ ptr += 2;
+ }
+ return;
+ }
+
+ uint32_t y;
+ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
+ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
+ (2 * ((size_t)rect.min_incl_x));
+ uint32_t n;
+ for (n = width; n > 0; n--) {
+ wuffs_base__poke_u16le__no_bounds_check(ptr, color);
+ ptr += 2;
+ }
+ }
+}
+
+static inline void //
+wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxx(
+ wuffs_base__pixel_buffer* pb,
+ wuffs_base__rect_ie_u32 rect,
+ uint32_t color) {
+ size_t stride = pb->private_impl.planes[0].stride;
+ uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
+ if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
+ uint8_t* ptr =
+ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
+ uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
+ size_t n;
+ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
+ wuffs_base__poke_u24le__no_bounds_check(ptr, color);
+ ptr += 3;
+ }
+ return;
+ }
+
+ uint32_t y;
+ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
+ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
+ (3 * ((size_t)rect.min_incl_x));
+ uint32_t n;
+ for (n = width; n > 0; n--) {
+ wuffs_base__poke_u24le__no_bounds_check(ptr, color);
+ ptr += 3;
+ }
+ }
+}
+
+static inline void //
+wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx(
+ wuffs_base__pixel_buffer* pb,
+ wuffs_base__rect_ie_u32 rect,
+ uint32_t color) {
+ size_t stride = pb->private_impl.planes[0].stride;
+ uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
+ if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
+ uint8_t* ptr =
+ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
+ uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
+ size_t n;
+ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
+ wuffs_base__poke_u32le__no_bounds_check(ptr, color);
+ ptr += 4;
+ }
+ return;
+ }
+
+ uint32_t y;
+ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
+ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
+ (4 * ((size_t)rect.min_incl_x));
+ uint32_t n;
+ for (n = width; n > 0; n--) {
+ wuffs_base__poke_u32le__no_bounds_check(ptr, color);
+ ptr += 4;
+ }
+ }
+}
+
+static inline void //
+wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx(
+ wuffs_base__pixel_buffer* pb,
+ wuffs_base__rect_ie_u32 rect,
+ uint64_t color) {
+ size_t stride = pb->private_impl.planes[0].stride;
+ uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
+ if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
+ uint8_t* ptr =
+ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
+ uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
+ size_t n;
+ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
+ wuffs_base__poke_u64le__no_bounds_check(ptr, color);
+ ptr += 8;
+ }
+ return;
+ }
+
+ uint32_t y;
+ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
+ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
+ (8 * ((size_t)rect.min_incl_x));
+ uint32_t n;
+ for (n = width; n > 0; n--) {
+ wuffs_base__poke_u64le__no_bounds_check(ptr, color);
+ ptr += 8;
+ }
+ }
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status //
+wuffs_base__pixel_buffer__set_color_u32_fill_rect(
+ wuffs_base__pixel_buffer* pb,
+ wuffs_base__rect_ie_u32 rect,
+ wuffs_base__color_u32_argb_premul color) {
+ if (!pb) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) {
+ return wuffs_base__make_status(NULL);
+ }
+ wuffs_base__rect_ie_u32 bounds =
+ wuffs_base__pixel_config__bounds(&pb->pixcfg);
+ if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+
+ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
+ // TODO: support planar formats.
+ return wuffs_base__make_status(wuffs_base__error__unsupported_option);
+ }
+
+ switch (pb->pixcfg.private_impl.pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect, color);
+ return wuffs_base__make_status(NULL);
+
+ // Common formats above. Rarer formats below.
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ wuffs_base__pixel_buffer__set_color_u32_fill_rect__xx(
+ pb, rect,
+ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color));
+ return wuffs_base__make_status(NULL);
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect, color);
+ return wuffs_base__make_status(NULL);
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx(
+ pb, rect,
+ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
+ color));
+ return wuffs_base__make_status(NULL);
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx(
+ pb, rect,
+ wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
+ color));
+ return wuffs_base__make_status(NULL);
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx(
+ pb, rect,
+ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
+ wuffs_base__swap_u32_argb_abgr(color)));
+ return wuffs_base__make_status(NULL);
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx(
+ pb, rect, wuffs_base__swap_u32_argb_abgr(color));
+ return wuffs_base__make_status(NULL);
+ }
+
+ uint32_t y;
+ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
+ uint32_t x;
+ for (x = rect.min_incl_x; x < rect.max_excl_x; x++) {
+ wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color);
+ }
+ }
+ return wuffs_base__make_status(NULL);
+}
+
+// --------
+
+WUFFS_BASE__MAYBE_STATIC uint8_t //
+wuffs_base__pixel_palette__closest_element(
+ wuffs_base__slice_u8 palette_slice,
+ wuffs_base__pixel_format palette_format,
+ wuffs_base__color_u32_argb_premul c) {
+ size_t n = palette_slice.len / 4;
+ if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
+ n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4);
+ }
+ size_t best_index = 0;
+ uint64_t best_score = 0xFFFFFFFFFFFFFFFF;
+
+ // Work in 16-bit color.
+ uint32_t ca = 0x101 * (0xFF & (c >> 24));
+ uint32_t cr = 0x101 * (0xFF & (c >> 16));
+ uint32_t cg = 0x101 * (0xFF & (c >> 8));
+ uint32_t cb = 0x101 * (0xFF & (c >> 0));
+
+ switch (palette_format.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: {
+ bool nonpremul = palette_format.repr ==
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL;
+
+ size_t i;
+ for (i = 0; i < n; i++) {
+ // Work in 16-bit color.
+ uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0]));
+ uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1]));
+ uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2]));
+ uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3]));
+
+ // Convert to premultiplied alpha.
+ if (nonpremul && (pa != 0xFFFF)) {
+ pb = (pb * pa) / 0xFFFF;
+ pg = (pg * pa) / 0xFFFF;
+ pr = (pr * pa) / 0xFFFF;
+ }
+
+ // These deltas are conceptually int32_t (signed) but after squaring,
+ // it's equivalent to work in uint32_t (unsigned).
+ pb -= cb;
+ pg -= cg;
+ pr -= cr;
+ pa -= ca;
+ uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) +
+ ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa));
+ if (best_score > score) {
+ best_score = score;
+ best_index = i;
+ }
+ }
+ break;
+ }
+ }
+
+ return (uint8_t)best_index;
+}
+
+// --------
+
+static inline uint32_t //
+wuffs_base__composite_nonpremul_nonpremul_u32_axxx(uint32_t dst_nonpremul,
+ uint32_t src_nonpremul) {
+ // Extract 16-bit color components.
+ //
+ // If the destination is transparent then SRC_OVER is equivalent to SRC: just
+ // return src_nonpremul. This isn't just an optimization (skipping the rest
+ // of the function's computation). It also preserves the nonpremul
+ // distinction between e.g. transparent red and transparent blue that would
+ // otherwise be lost by converting from nonpremul to premul and back.
+ uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24));
+ if (da == 0) {
+ return src_nonpremul;
+ }
+ uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16));
+ uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8));
+ uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0));
+ uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24));
+ uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16));
+ uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8));
+ uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0));
+
+ // Convert dst from nonpremul to premul.
+ dr = (dr * da) / 0xFFFF;
+ dg = (dg * da) / 0xFFFF;
+ db = (db * da) / 0xFFFF;
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (nonpremul) over dst (premul).
+ da = sa + ((da * ia) / 0xFFFF);
+ dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
+ dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
+ db = ((sb * sa) + (db * ia)) / 0xFFFF;
+
+ // Convert dst from premul to nonpremul.
+ if (da != 0) {
+ dr = (dr * 0xFFFF) / da;
+ dg = (dg * 0xFFFF) / da;
+ db = (db * 0xFFFF) / da;
+ }
+
+ // Convert from 16-bit color to 8-bit color.
+ da >>= 8;
+ dr >>= 8;
+ dg >>= 8;
+ db >>= 8;
+
+ // Combine components.
+ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
+}
+
+static inline uint64_t //
+wuffs_base__composite_nonpremul_nonpremul_u64_axxx(uint64_t dst_nonpremul,
+ uint64_t src_nonpremul) {
+ // Extract components.
+ //
+ // If the destination is transparent then SRC_OVER is equivalent to SRC: just
+ // return src_nonpremul. This isn't just an optimization (skipping the rest
+ // of the function's computation). It also preserves the nonpremul
+ // distinction between e.g. transparent red and transparent blue that would
+ // otherwise be lost by converting from nonpremul to premul and back.
+ uint64_t da = 0xFFFF & (dst_nonpremul >> 48);
+ if (da == 0) {
+ return src_nonpremul;
+ }
+ uint64_t dr = 0xFFFF & (dst_nonpremul >> 32);
+ uint64_t dg = 0xFFFF & (dst_nonpremul >> 16);
+ uint64_t db = 0xFFFF & (dst_nonpremul >> 0);
+ uint64_t sa = 0xFFFF & (src_nonpremul >> 48);
+ uint64_t sr = 0xFFFF & (src_nonpremul >> 32);
+ uint64_t sg = 0xFFFF & (src_nonpremul >> 16);
+ uint64_t sb = 0xFFFF & (src_nonpremul >> 0);
+
+ // Convert dst from nonpremul to premul.
+ dr = (dr * da) / 0xFFFF;
+ dg = (dg * da) / 0xFFFF;
+ db = (db * da) / 0xFFFF;
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint64_t ia = 0xFFFF - sa;
+
+ // Composite src (nonpremul) over dst (premul).
+ da = sa + ((da * ia) / 0xFFFF);
+ dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
+ dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
+ db = ((sb * sa) + (db * ia)) / 0xFFFF;
+
+ // Convert dst from premul to nonpremul.
+ if (da != 0) {
+ dr = (dr * 0xFFFF) / da;
+ dg = (dg * 0xFFFF) / da;
+ db = (db * 0xFFFF) / da;
+ }
+
+ // Combine components.
+ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
+}
+
+static inline uint32_t //
+wuffs_base__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul,
+ uint32_t src_premul) {
+ // Extract 16-bit color components.
+ uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24));
+ uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16));
+ uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8));
+ uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0));
+ uint32_t sa = 0x101 * (0xFF & (src_premul >> 24));
+ uint32_t sr = 0x101 * (0xFF & (src_premul >> 16));
+ uint32_t sg = 0x101 * (0xFF & (src_premul >> 8));
+ uint32_t sb = 0x101 * (0xFF & (src_premul >> 0));
+
+ // Convert dst from nonpremul to premul.
+ dr = (dr * da) / 0xFFFF;
+ dg = (dg * da) / 0xFFFF;
+ db = (db * da) / 0xFFFF;
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (premul) over dst (premul).
+ da = sa + ((da * ia) / 0xFFFF);
+ dr = sr + ((dr * ia) / 0xFFFF);
+ dg = sg + ((dg * ia) / 0xFFFF);
+ db = sb + ((db * ia) / 0xFFFF);
+
+ // Convert dst from premul to nonpremul.
+ if (da != 0) {
+ dr = (dr * 0xFFFF) / da;
+ dg = (dg * 0xFFFF) / da;
+ db = (db * 0xFFFF) / da;
+ }
+
+ // Convert from 16-bit color to 8-bit color.
+ da >>= 8;
+ dr >>= 8;
+ dg >>= 8;
+ db >>= 8;
+
+ // Combine components.
+ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
+}
+
+static inline uint64_t //
+wuffs_base__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul,
+ uint64_t src_premul) {
+ // Extract components.
+ uint64_t da = 0xFFFF & (dst_nonpremul >> 48);
+ uint64_t dr = 0xFFFF & (dst_nonpremul >> 32);
+ uint64_t dg = 0xFFFF & (dst_nonpremul >> 16);
+ uint64_t db = 0xFFFF & (dst_nonpremul >> 0);
+ uint64_t sa = 0xFFFF & (src_premul >> 48);
+ uint64_t sr = 0xFFFF & (src_premul >> 32);
+ uint64_t sg = 0xFFFF & (src_premul >> 16);
+ uint64_t sb = 0xFFFF & (src_premul >> 0);
+
+ // Convert dst from nonpremul to premul.
+ dr = (dr * da) / 0xFFFF;
+ dg = (dg * da) / 0xFFFF;
+ db = (db * da) / 0xFFFF;
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint64_t ia = 0xFFFF - sa;
+
+ // Composite src (premul) over dst (premul).
+ da = sa + ((da * ia) / 0xFFFF);
+ dr = sr + ((dr * ia) / 0xFFFF);
+ dg = sg + ((dg * ia) / 0xFFFF);
+ db = sb + ((db * ia) / 0xFFFF);
+
+ // Convert dst from premul to nonpremul.
+ if (da != 0) {
+ dr = (dr * 0xFFFF) / da;
+ dg = (dg * 0xFFFF) / da;
+ db = (db * 0xFFFF) / da;
+ }
+
+ // Combine components.
+ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
+}
+
+static inline uint32_t //
+wuffs_base__composite_premul_nonpremul_u32_axxx(uint32_t dst_premul,
+ uint32_t src_nonpremul) {
+ // Extract 16-bit color components.
+ uint32_t da = 0x101 * (0xFF & (dst_premul >> 24));
+ uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16));
+ uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8));
+ uint32_t db = 0x101 * (0xFF & (dst_premul >> 0));
+ uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24));
+ uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16));
+ uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8));
+ uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0));
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (nonpremul) over dst (premul).
+ da = sa + ((da * ia) / 0xFFFF);
+ dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
+ dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
+ db = ((sb * sa) + (db * ia)) / 0xFFFF;
+
+ // Convert from 16-bit color to 8-bit color.
+ da >>= 8;
+ dr >>= 8;
+ dg >>= 8;
+ db >>= 8;
+
+ // Combine components.
+ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
+}
+
+static inline uint64_t //
+wuffs_base__composite_premul_nonpremul_u64_axxx(uint64_t dst_premul,
+ uint64_t src_nonpremul) {
+ // Extract components.
+ uint64_t da = 0xFFFF & (dst_premul >> 48);
+ uint64_t dr = 0xFFFF & (dst_premul >> 32);
+ uint64_t dg = 0xFFFF & (dst_premul >> 16);
+ uint64_t db = 0xFFFF & (dst_premul >> 0);
+ uint64_t sa = 0xFFFF & (src_nonpremul >> 48);
+ uint64_t sr = 0xFFFF & (src_nonpremul >> 32);
+ uint64_t sg = 0xFFFF & (src_nonpremul >> 16);
+ uint64_t sb = 0xFFFF & (src_nonpremul >> 0);
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint64_t ia = 0xFFFF - sa;
+
+ // Composite src (nonpremul) over dst (premul).
+ da = sa + ((da * ia) / 0xFFFF);
+ dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
+ dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
+ db = ((sb * sa) + (db * ia)) / 0xFFFF;
+
+ // Combine components.
+ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
+}
+
+static inline uint32_t //
+wuffs_base__composite_premul_premul_u32_axxx(uint32_t dst_premul,
+ uint32_t src_premul) {
+ // Extract 16-bit color components.
+ uint32_t da = 0x101 * (0xFF & (dst_premul >> 24));
+ uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16));
+ uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8));
+ uint32_t db = 0x101 * (0xFF & (dst_premul >> 0));
+ uint32_t sa = 0x101 * (0xFF & (src_premul >> 24));
+ uint32_t sr = 0x101 * (0xFF & (src_premul >> 16));
+ uint32_t sg = 0x101 * (0xFF & (src_premul >> 8));
+ uint32_t sb = 0x101 * (0xFF & (src_premul >> 0));
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (premul) over dst (premul).
+ da = sa + ((da * ia) / 0xFFFF);
+ dr = sr + ((dr * ia) / 0xFFFF);
+ dg = sg + ((dg * ia) / 0xFFFF);
+ db = sb + ((db * ia) / 0xFFFF);
+
+ // Convert from 16-bit color to 8-bit color.
+ da >>= 8;
+ dr >>= 8;
+ dg >>= 8;
+ db >>= 8;
+
+ // Combine components.
+ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888(uint8_t* dst_ptr,
+ size_t dst_len,
+ const uint8_t* src_ptr,
+ size_t src_len,
+ bool nonpremul) {
+ size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n--) {
+ uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s);
+ if (nonpremul) {
+ argb =
+ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb);
+ }
+ uint32_t b5 = 0x1F & (argb >> (8 - 5));
+ uint32_t g6 = 0x3F & (argb >> (16 - 6));
+ uint32_t r5 = 0x1F & (argb >> (24 - 5));
+ uint32_t alpha = argb & 0xFF000000;
+ wuffs_base__poke_u32le__no_bounds_check(
+ d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0));
+ s += 4;
+ d += 4;
+ }
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__swap_rgb_bgr(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t len = (dst_len < src_len ? dst_len : src_len) / 3;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n--) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ uint8_t s2 = s[2];
+ d[0] = s2;
+ d[1] = s1;
+ d[2] = s0;
+ s += 3;
+ d += 3;
+ }
+ return len;
+}
+
+// ‼ WUFFS MULTI-FILE SECTION +x86_sse42
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
+static uint64_t //
+wuffs_base__pixel_swizzler__swap_rgbx_bgrx__sse42(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E, //
+ +0x0B, +0x08, +0x09, +0x0A, //
+ +0x07, +0x04, +0x05, +0x06, //
+ +0x03, +0x00, +0x01, +0x02);
+
+ while (n >= 4) {
+ __m128i x;
+ x = _mm_lddqu_si128((const __m128i*)(const void*)s);
+ x = _mm_shuffle_epi8(x, shuffle);
+ _mm_storeu_si128((__m128i*)(void*)d, x);
+
+ s += 4 * 4;
+ d += 4 * 4;
+ n -= 4;
+ }
+
+ while (n--) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ uint8_t s2 = s[2];
+ uint8_t s3 = s[3];
+ d[0] = s2;
+ d[1] = s1;
+ d[2] = s0;
+ d[3] = s3;
+ s += 4;
+ d += 4;
+ }
+ return len;
+}
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+// ‼ WUFFS MULTI-FILE SECTION -x86_sse42
+
+static uint64_t //
+wuffs_base__pixel_swizzler__swap_rgbx_bgrx(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n--) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ uint8_t s2 = s[2];
+ uint8_t s3 = s[3];
+ d[0] = s2;
+ d[1] = s1;
+ d[2] = s0;
+ d[3] = s3;
+ s += 4;
+ d += 4;
+ }
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__copy_1_1(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t len = (dst_len < src_len) ? dst_len : src_len;
+ if (len > 0) {
+ memmove(dst_ptr, src_ptr, len);
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__copy_2_2(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
+ if (len > 0) {
+ memmove(dst_ptr, src_ptr, len * 2);
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__copy_3_3(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len3 = src_len / 3;
+ size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3;
+ if (len > 0) {
+ memmove(dst_ptr, src_ptr, len * 3);
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__copy_4_4(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ if (len > 0) {
+ memmove(dst_ptr, src_ptr, len * 4);
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__copy_8_8(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
+ if (len > 0) {
+ memmove(dst_ptr, src_ptr, len * 8);
+ }
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__bgr(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len3 = src_len / 3;
+ size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t b5 = s[0] >> 3;
+ uint32_t g6 = s[1] >> 2;
+ uint32_t r5 = s[2] >> 3;
+ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
+
+ s += 1 * 3;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__bgrx(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t b5 = s[0] >> 3;
+ uint32_t g6 = s[1] >> 2;
+ uint32_t r5 = s[2] >> 3;
+ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
+
+ s += 1 * 4;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (0 * 2),
+ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
+ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
+
+ s += 1 * 4;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (0 * 2),
+ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
+ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
+ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))));
+
+ s += 1 * 8;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ // Extract 16-bit color components.
+ uint32_t sa = 0x101 * ((uint32_t)s[3]);
+ uint32_t sr = 0x101 * ((uint32_t)s[2]);
+ uint32_t sg = 0x101 * ((uint32_t)s[1]);
+ uint32_t sb = 0x101 * ((uint32_t)s[0]);
+
+ // Convert from 565 color to 16-bit color.
+ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
+ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
+ uint32_t dr = (0x8421 * old_r5) >> 4;
+ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
+ uint32_t dg = (0x1041 * old_g6) >> 2;
+ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
+ uint32_t db = (0x8421 * old_b5) >> 4;
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (nonpremul) over dst (premul).
+ dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
+ dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
+ db = ((sb * sa) + (db * ia)) / 0xFFFF;
+
+ // Convert from 16-bit color to 565 color and combine the components.
+ uint32_t new_r5 = 0x1F & (dr >> 11);
+ uint32_t new_g6 = 0x3F & (dg >> 10);
+ uint32_t new_b5 = 0x1F & (db >> 11);
+ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
+
+ s += 1 * 4;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ // Extract 16-bit color components.
+ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
+ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
+ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
+ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
+
+ // Convert from 565 color to 16-bit color.
+ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
+ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
+ uint32_t dr = (0x8421 * old_r5) >> 4;
+ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
+ uint32_t dg = (0x1041 * old_g6) >> 2;
+ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
+ uint32_t db = (0x8421 * old_b5) >> 4;
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (nonpremul) over dst (premul).
+ dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
+ dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
+ db = ((sb * sa) + (db * ia)) / 0xFFFF;
+
+ // Convert from 16-bit color to 565 color and combine the components.
+ uint32_t new_r5 = 0x1F & (dr >> 11);
+ uint32_t new_g6 = 0x3F & (dg >> 10);
+ uint32_t new_b5 = 0x1F & (db >> 11);
+ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
+
+ s += 1 * 8;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
+
+ s += 1 * 4;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ // Extract 16-bit color components.
+ uint32_t sa = 0x101 * ((uint32_t)s[3]);
+ uint32_t sr = 0x101 * ((uint32_t)s[2]);
+ uint32_t sg = 0x101 * ((uint32_t)s[1]);
+ uint32_t sb = 0x101 * ((uint32_t)s[0]);
+
+ // Convert from 565 color to 16-bit color.
+ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
+ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
+ uint32_t dr = (0x8421 * old_r5) >> 4;
+ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
+ uint32_t dg = (0x1041 * old_g6) >> 2;
+ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
+ uint32_t db = (0x8421 * old_b5) >> 4;
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (premul) over dst (premul).
+ dr = sr + ((dr * ia) / 0xFFFF);
+ dg = sg + ((dg * ia) / 0xFFFF);
+ db = sb + ((db * ia) / 0xFFFF);
+
+ // Convert from 16-bit color to 565 color and combine the components.
+ uint32_t new_r5 = 0x1F & (dr >> 11);
+ uint32_t new_g6 = 0x3F & (dg >> 10);
+ uint32_t new_b5 = 0x1F & (db >> 11);
+ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
+
+ s += 1 * 4;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__rgb(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len3 = src_len / 3;
+ size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t r5 = s[0] >> 3;
+ uint32_t g6 = s[1] >> 2;
+ uint32_t b5 = s[2] >> 3;
+ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
+
+ s += 1 * 3;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (0 * 2),
+ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
+ wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))));
+
+ s += 1 * 4;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ // Extract 16-bit color components.
+ uint32_t sa = 0x101 * ((uint32_t)s[3]);
+ uint32_t sb = 0x101 * ((uint32_t)s[2]);
+ uint32_t sg = 0x101 * ((uint32_t)s[1]);
+ uint32_t sr = 0x101 * ((uint32_t)s[0]);
+
+ // Convert from 565 color to 16-bit color.
+ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
+ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
+ uint32_t dr = (0x8421 * old_r5) >> 4;
+ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
+ uint32_t dg = (0x1041 * old_g6) >> 2;
+ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
+ uint32_t db = (0x8421 * old_b5) >> 4;
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (nonpremul) over dst (premul).
+ dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
+ dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
+ db = ((sb * sa) + (db * ia)) / 0xFFFF;
+
+ // Convert from 16-bit color to 565 color and combine the components.
+ uint32_t new_r5 = 0x1F & (dr >> 11);
+ uint32_t new_g6 = 0x3F & (dg >> 10);
+ uint32_t new_b5 = 0x1F & (db >> 11);
+ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
+
+ s += 1 * 4;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (0 * 2),
+ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
+ wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
+
+ s += 1 * 4;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ // Extract 16-bit color components.
+ uint32_t sa = 0x101 * ((uint32_t)s[3]);
+ uint32_t sb = 0x101 * ((uint32_t)s[2]);
+ uint32_t sg = 0x101 * ((uint32_t)s[1]);
+ uint32_t sr = 0x101 * ((uint32_t)s[0]);
+
+ // Convert from 565 color to 16-bit color.
+ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
+ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
+ uint32_t dr = (0x8421 * old_r5) >> 4;
+ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
+ uint32_t dg = (0x1041 * old_g6) >> 2;
+ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
+ uint32_t db = (0x8421 * old_b5) >> 4;
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (premul) over dst (premul).
+ dr = sr + ((dr * ia) / 0xFFFF);
+ dg = sg + ((dg * ia) / 0xFFFF);
+ db = sb + ((db * ia) / 0xFFFF);
+
+ // Convert from 16-bit color to 565 color and combine the components.
+ uint32_t new_r5 = 0x1F & (dr >> 11);
+ uint32_t new_g6 = 0x3F & (dg >> 10);
+ uint32_t new_b5 = 0x1F & (db >> 11);
+ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
+
+ s += 1 * 4;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__y(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t y5 = s[0] >> 3;
+ uint32_t y6 = s[0] >> 2;
+ uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
+
+ s += 1 * 1;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__y_16be(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t y5 = s[0] >> 3;
+ uint32_t y6 = s[0] >> 2;
+ uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
+
+ s += 1 * 2;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__index__src(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len2 = dst_len / 2;
+ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ const size_t loop_unroll_count = 4;
+
+ while (n >= loop_unroll_count) {
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[0] * 4)));
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[1] * 4)));
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[2] * 4)));
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[3] * 4)));
+
+ s += loop_unroll_count * 1;
+ d += loop_unroll_count * 2;
+ n -= loop_unroll_count;
+ }
+
+ while (n >= 1) {
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[0] * 4)));
+
+ s += 1 * 1;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__index_bgra_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len2 = dst_len / 2;
+ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
+ wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)));
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ wuffs_base__poke_u16le__no_bounds_check(
+ d + (0 * 2),
+ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
+ wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)));
+
+ s += 1 * 1;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr_565__index_binary_alpha__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len2 = dst_len / 2;
+ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ if (s0) {
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0);
+ }
+
+ s += 1 * 1;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__bgr_565(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
+ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)));
+ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
+
+ s += 1 * 2;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t s0 =
+ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
+
+ s += 1 * 4;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t s0 =
+ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
+ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
+ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
+
+ s += 1 * 8;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ // Extract 16-bit color components.
+ uint32_t dr = 0x101 * ((uint32_t)d[2]);
+ uint32_t dg = 0x101 * ((uint32_t)d[1]);
+ uint32_t db = 0x101 * ((uint32_t)d[0]);
+ uint32_t sa = 0x101 * ((uint32_t)s[3]);
+ uint32_t sr = 0x101 * ((uint32_t)s[2]);
+ uint32_t sg = 0x101 * ((uint32_t)s[1]);
+ uint32_t sb = 0x101 * ((uint32_t)s[0]);
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (nonpremul) over dst (premul).
+ dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
+ dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
+ db = ((sb * sa) + (db * ia)) / 0xFFFF;
+
+ // Convert from 16-bit color to 8-bit color.
+ d[0] = (uint8_t)(db >> 8);
+ d[1] = (uint8_t)(dg >> 8);
+ d[2] = (uint8_t)(dr >> 8);
+
+ s += 1 * 4;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ // Extract 16-bit color components.
+ uint32_t dr = 0x101 * ((uint32_t)d[2]);
+ uint32_t dg = 0x101 * ((uint32_t)d[1]);
+ uint32_t db = 0x101 * ((uint32_t)d[0]);
+ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
+ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
+ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
+ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (nonpremul) over dst (premul).
+ dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
+ dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
+ db = ((sb * sa) + (db * ia)) / 0xFFFF;
+
+ // Convert from 16-bit color to 8-bit color.
+ d[0] = (uint8_t)(db >> 8);
+ d[1] = (uint8_t)(dg >> 8);
+ d[2] = (uint8_t)(dr >> 8);
+
+ s += 1 * 8;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__bgra_premul__src(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ uint8_t s2 = s[2];
+ d[0] = s0;
+ d[1] = s1;
+ d[2] = s2;
+
+ s += 1 * 4;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ // Extract 16-bit color components.
+ uint32_t dr = 0x101 * ((uint32_t)d[2]);
+ uint32_t dg = 0x101 * ((uint32_t)d[1]);
+ uint32_t db = 0x101 * ((uint32_t)d[0]);
+ uint32_t sa = 0x101 * ((uint32_t)s[3]);
+ uint32_t sr = 0x101 * ((uint32_t)s[2]);
+ uint32_t sg = 0x101 * ((uint32_t)s[1]);
+ uint32_t sb = 0x101 * ((uint32_t)s[0]);
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (premul) over dst (premul).
+ dr = sr + ((dr * ia) / 0xFFFF);
+ dg = sg + ((dg * ia) / 0xFFFF);
+ db = sb + ((db * ia) / 0xFFFF);
+
+ // Convert from 16-bit color to 8-bit color.
+ d[0] = (uint8_t)(db >> 8);
+ d[1] = (uint8_t)(dg >> 8);
+ d[2] = (uint8_t)(dr >> 8);
+
+ s += 1 * 4;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
+ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
+
+ s += 1 * 4;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ // Extract 16-bit color components.
+ uint32_t dr = 0x101 * ((uint32_t)d[2]);
+ uint32_t dg = 0x101 * ((uint32_t)d[1]);
+ uint32_t db = 0x101 * ((uint32_t)d[0]);
+ uint32_t sa = 0x101 * ((uint32_t)s[3]);
+ uint32_t sb = 0x101 * ((uint32_t)s[2]);
+ uint32_t sg = 0x101 * ((uint32_t)s[1]);
+ uint32_t sr = 0x101 * ((uint32_t)s[0]);
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (nonpremul) over dst (premul).
+ dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
+ dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
+ db = ((sb * sa) + (db * ia)) / 0xFFFF;
+
+ // Convert from 16-bit color to 8-bit color.
+ d[0] = (uint8_t)(db >> 8);
+ d[1] = (uint8_t)(dg >> 8);
+ d[2] = (uint8_t)(dr >> 8);
+
+ s += 1 * 4;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__rgba_premul__src(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ uint8_t s2 = s[2];
+ d[0] = s2;
+ d[1] = s1;
+ d[2] = s0;
+
+ s += 1 * 4;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ // Extract 16-bit color components.
+ uint32_t dr = 0x101 * ((uint32_t)d[2]);
+ uint32_t dg = 0x101 * ((uint32_t)d[1]);
+ uint32_t db = 0x101 * ((uint32_t)d[0]);
+ uint32_t sa = 0x101 * ((uint32_t)s[3]);
+ uint32_t sb = 0x101 * ((uint32_t)s[2]);
+ uint32_t sg = 0x101 * ((uint32_t)s[1]);
+ uint32_t sr = 0x101 * ((uint32_t)s[0]);
+
+ // Calculate the inverse of the src-alpha: how much of the dst to keep.
+ uint32_t ia = 0xFFFF - sa;
+
+ // Composite src (premul) over dst (premul).
+ dr = sr + ((dr * ia) / 0xFFFF);
+ dg = sg + ((dg * ia) / 0xFFFF);
+ db = sb + ((db * ia) / 0xFFFF);
+
+ // Convert from 16-bit color to 8-bit color.
+ d[0] = (uint8_t)(db >> 8);
+ d[1] = (uint8_t)(dg >> 8);
+ d[2] = (uint8_t)(dr >> 8);
+
+ s += 1 * 4;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__color_u64__as__color_u32(
+ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
+
+ s += 1 * 8;
+ d += 1 * 4;
+ n -= 1;
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint64_t d0 = wuffs_base__color_u32__as__color_u64(
+ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
+ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__color_u64__as__color_u32(
+ wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)));
+
+ s += 1 * 8;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__composite_nonpremul_premul_u32_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len4 = dst_len / 4;
+ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
+
+ s += 1 * 1;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
+ uint32_t s0 = wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
+ uint32_t s0 = wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__composite_nonpremul_premul_u32_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ uint8_t s2 = s[2];
+ uint8_t s3 = s[3];
+ d[0] = s0;
+ d[1] = s0;
+ d[2] = s1;
+ d[3] = s1;
+ d[4] = s2;
+ d[5] = s2;
+ d[6] = s3;
+ d[7] = s3;
+
+ s += 1 * 4;
+ d += 1 * 8;
+ n -= 1;
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
+ uint64_t s0 = wuffs_base__color_u32__as__color_u64(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8),
+ wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 8;
+ n -= 1;
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
+ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8),
+ wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
+
+ s += 1 * 8;
+ d += 1 * 8;
+ n -= 1;
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ uint64_t s0 = wuffs_base__color_u32__as__color_u64(
+ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
+ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
+
+ s += 1 * 4;
+ d += 1 * 8;
+ n -= 1;
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
+ uint64_t s0 = wuffs_base__color_u32__as__color_u64(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8), wuffs_base__composite_nonpremul_premul_u64_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 8;
+ n -= 1;
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len8 = dst_len / 8;
+ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
+ uint64_t s0 = wuffs_base__color_u32__as__color_u64(
+ wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4)));
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8),
+ wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
+
+ s += 1 * 1;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ uint8_t s2 = s[2];
+ uint8_t s3 = s[3];
+ d[0] = s2;
+ d[1] = s2;
+ d[2] = s1;
+ d[3] = s1;
+ d[4] = s0;
+ d[5] = s0;
+ d[6] = s3;
+ d[7] = s3;
+
+ s += 1 * 4;
+ d += 1 * 8;
+ n -= 1;
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
+ uint64_t s0 =
+ wuffs_base__color_u32__as__color_u64(wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8),
+ wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 8;
+ n -= 1;
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ uint64_t s0 = wuffs_base__color_u32__as__color_u64(
+ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
+ wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
+ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
+
+ s += 1 * 4;
+ d += 1 * 8;
+ n -= 1;
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
+ uint64_t s0 =
+ wuffs_base__color_u32__as__color_u64(wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8), wuffs_base__composite_nonpremul_premul_u64_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 8;
+ n -= 1;
+ }
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0));
+
+ s += 1 * 8;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint64_t d0 = wuffs_base__color_u32__as__color_u64(
+ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
+ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__color_u64__as__color_u32(
+ wuffs_base__composite_premul_nonpremul_u64_axxx(d0, s0)));
+
+ s += 1 * 8;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__composite_premul_premul_u32_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len4 = dst_len / 4;
+ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0));
+
+ s += 1 * 1;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
+ uint32_t s0 = wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
+ s0)));
+
+ s += 1 * 8;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint64_t d0 = wuffs_base__color_u32__as__color_u64(
+ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
+ uint64_t s0 = wuffs_base__swap_u64_argb_abgr(
+ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__color_u64__as__color_u32(
+ wuffs_base__composite_premul_nonpremul_u64_axxx(d0, s0)));
+
+ s += 1 * 8;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
+ uint32_t s0 = wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__composite_premul_premul_u32_axxx(d0, s0));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len3 = src_len / 3;
+ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ 0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3)));
+
+ s += 1 * 3;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
+ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))));
+
+ s += 1 * 2;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgrw__bgrx(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// ‼ WUFFS MULTI-FILE SECTION +x86_sse42
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
+static uint64_t //
+wuffs_base__pixel_swizzler__bgrw__rgb__sse42(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len3 = src_len / 3;
+ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B, //
+ +0x00, +0x06, +0x07, +0x08, //
+ +0x00, +0x03, +0x04, +0x05, //
+ +0x00, +0x00, +0x01, +0x02);
+ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, //
+ -0x01, +0x00, +0x00, +0x00, //
+ -0x01, +0x00, +0x00, +0x00, //
+ -0x01, +0x00, +0x00, +0x00);
+
+ while (n >= 6) {
+ __m128i x;
+ x = _mm_lddqu_si128((const __m128i*)(const void*)s);
+ x = _mm_shuffle_epi8(x, shuffle);
+ x = _mm_or_si128(x, or_ff);
+ _mm_storeu_si128((__m128i*)(void*)d, x);
+
+ s += 4 * 3;
+ d += 4 * 4;
+ n -= 4;
+ }
+
+ while (n >= 1) {
+ uint8_t b0 = s[0];
+ uint8_t b1 = s[1];
+ uint8_t b2 = s[2];
+ d[0] = b2;
+ d[1] = b1;
+ d[2] = b0;
+ d[3] = 0xFF;
+
+ s += 1 * 3;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+// ‼ WUFFS MULTI-FILE SECTION -x86_sse42
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgrw__rgb(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len3 = src_len / 3;
+ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint8_t b0 = s[0];
+ uint8_t b1 = s[1];
+ uint8_t b2 = s[2];
+ d[0] = b2;
+ d[1] = b1;
+ d[2] = b0;
+ d[3] = 0xFF;
+
+ s += 1 * 3;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgrw__rgbx(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint8_t b0 = s[0];
+ uint8_t b1 = s[1];
+ uint8_t b2 = s[2];
+ d[0] = b2;
+ d[1] = b1;
+ d[2] = b0;
+ d[3] = 0xFF;
+
+ s += 1 * 4;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgrw_4x16le__bgr(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len3 = src_len / 3;
+ size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ uint8_t s2 = s[2];
+ d[0] = s0;
+ d[1] = s0;
+ d[2] = s1;
+ d[3] = s1;
+ d[4] = s2;
+ d[5] = s2;
+ d[6] = 0xFF;
+ d[7] = 0xFF;
+
+ s += 1 * 3;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8),
+ wuffs_base__color_u32__as__color_u64(
+ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
+ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
+
+ s += 1 * 2;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgrw_4x16le__bgrx(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ uint8_t s2 = s[2];
+ d[0] = s0;
+ d[1] = s0;
+ d[2] = s1;
+ d[3] = s1;
+ d[4] = s2;
+ d[5] = s2;
+ d[6] = 0xFF;
+ d[7] = 0xFF;
+
+ s += 1 * 4;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__bgrw_4x16le__rgb(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len3 = src_len / 3;
+ size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ uint8_t s2 = s[2];
+ d[0] = s2;
+ d[1] = s2;
+ d[2] = s1;
+ d[3] = s1;
+ d[4] = s0;
+ d[5] = s0;
+ d[6] = 0xFF;
+ d[7] = 0xFF;
+
+ s += 1 * 3;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+
+ size_t n = len;
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__color_u64__as__color_u32__swap_u32_argb_abgr(
+ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
+
+ s += 1 * 8;
+ d += 1 * 4;
+ n -= 1;
+ }
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len8 = src_len / 8;
+ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint64_t d0 = wuffs_base__color_u32__as__color_u64(
+ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
+ uint64_t s0 = wuffs_base__swap_u64_argb_abgr(
+ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__color_u64__as__color_u32(
+ wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)));
+
+ s += 1 * 8;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__rgbw__bgr_565(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4),
+ wuffs_base__swap_u32_argb_abgr(
+ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
+ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
+
+ s += 1 * 2;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxx__index__src(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len3 = dst_len / 3;
+ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ const size_t loop_unroll_count = 4;
+
+ // The comparison in the while condition is ">", not ">=", because with
+ // ">=", the last 4-byte store could write past the end of the dst slice.
+ //
+ // Each 4-byte store writes one too many bytes, but a subsequent store
+ // will overwrite that with the correct byte. There is always another
+ // store, whether a 4-byte store in this loop or a 1-byte store in the
+ // next loop.
+ while (n > loop_unroll_count) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[0] * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[1] * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[2] * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[3] * 4)));
+
+ s += loop_unroll_count * 1;
+ d += loop_unroll_count * 3;
+ n -= loop_unroll_count;
+ }
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
+
+ s += 1 * 1;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len3 = dst_len / 3;
+ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t d0 =
+ wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000;
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ wuffs_base__poke_u24le__no_bounds_check(
+ d + (0 * 3), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0));
+
+ s += 1 * 1;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len3 = dst_len / 3;
+ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ const size_t loop_unroll_count = 4;
+
+ while (n >= loop_unroll_count) {
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ if (s0) {
+ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
+ }
+ uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[1] * 4));
+ if (s1) {
+ wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1);
+ }
+ uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[2] * 4));
+ if (s2) {
+ wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2);
+ }
+ uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[3] * 4));
+ if (s3) {
+ wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3);
+ }
+
+ s += loop_unroll_count * 1;
+ d += loop_unroll_count * 3;
+ n -= loop_unroll_count;
+ }
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ if (s0) {
+ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
+ }
+
+ s += 1 * 1;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len4 = src_len / 4;
+ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ wuffs_base__poke_u24le__no_bounds_check(
+ d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+
+ s += 1 * 4;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxx__y(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint8_t s0 = s[0];
+ d[0] = s0;
+ d[1] = s0;
+ d[2] = s0;
+
+ s += 1 * 1;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxx__y_16be(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint8_t s0 = s[0];
+ d[0] = s0;
+ d[1] = s0;
+ d[2] = s0;
+
+ s += 1 * 2;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxxx__index__src(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len4 = dst_len / 4;
+ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ const size_t loop_unroll_count = 4;
+
+ while (n >= loop_unroll_count) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[0] * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[1] * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[2] * 4)));
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[3] * 4)));
+
+ s += loop_unroll_count * 1;
+ d += loop_unroll_count * 4;
+ n -= loop_unroll_count;
+ }
+
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[0] * 4)));
+
+ s += 1 * 1;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len4 = dst_len / 4;
+ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ const size_t loop_unroll_count = 4;
+
+ while (n >= loop_unroll_count) {
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ if (s0) {
+ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
+ }
+ uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[1] * 4));
+ if (s1) {
+ wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1);
+ }
+ uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[2] * 4));
+ if (s2) {
+ wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2);
+ }
+ uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[3] * 4));
+ if (s3) {
+ wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3);
+ }
+
+ s += loop_unroll_count * 1;
+ d += loop_unroll_count * 4;
+ n -= loop_unroll_count;
+ }
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ if (s0) {
+ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
+ }
+
+ s += 1 * 1;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// ‼ WUFFS MULTI-FILE SECTION +x86_sse42
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
+static uint64_t //
+wuffs_base__pixel_swizzler__xxxx__y__sse42(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03, //
+ +0x02, +0x02, +0x02, +0x02, //
+ +0x01, +0x01, +0x01, +0x01, //
+ +0x00, +0x00, +0x00, +0x00);
+ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, //
+ -0x01, +0x00, +0x00, +0x00, //
+ -0x01, +0x00, +0x00, +0x00, //
+ -0x01, +0x00, +0x00, +0x00);
+
+ while (n >= 4) {
+ __m128i x;
+ x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s)));
+ x = _mm_shuffle_epi8(x, shuffle);
+ x = _mm_or_si128(x, or_ff);
+ _mm_storeu_si128((__m128i*)(void*)d, x);
+
+ s += 4 * 1;
+ d += 4 * 4;
+ n -= 4;
+ }
+
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
+
+ s += 1 * 1;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+// ‼ WUFFS MULTI-FILE SECTION -x86_sse42
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxxx__y(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
+
+ s += 1 * 1;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxxx__y_16be(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
+
+ s += 1 * 2;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxxxxxxx__index__src(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len8 = dst_len / 8;
+ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8), wuffs_base__color_u32__as__color_u64(
+ wuffs_base__peek_u32le__no_bounds_check(
+ dst_palette_ptr + ((size_t)s[0] * 4))));
+
+ s += 1 * 1;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ if (dst_palette_len !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return 0;
+ }
+ size_t dst_len8 = dst_len / 8;
+ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
+ ((size_t)s[0] * 4));
+ if (s0) {
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0));
+ }
+
+ s += 1 * 1;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxxxxxxx__y(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0]));
+
+ s += 1 * 1;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__xxxxxxxx__y_16be(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint64_t s0 =
+ ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2))));
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0));
+
+ s += 1 * 2;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__y__y_16be(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len < src_len2) ? dst_len : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ d[0] = s[0];
+
+ s += 1 * 2;
+ d += 1 * 1;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__y_16le__y_16be(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint8_t s0 = s[0];
+ uint8_t s1 = s[1];
+ d[0] = s1;
+ d[1] = s0;
+
+ s += 1 * 2;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+// --------
+
+static uint64_t //
+wuffs_base__pixel_swizzler__transparent_black_src(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ uint64_t num_pixels,
+ uint32_t dst_pixfmt_bytes_per_pixel) {
+ uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel;
+ if (n > num_pixels) {
+ n = num_pixels;
+ }
+ memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel)));
+ return n;
+}
+
+static uint64_t //
+wuffs_base__pixel_swizzler__transparent_black_src_over(
+ uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ uint64_t num_pixels,
+ uint32_t dst_pixfmt_bytes_per_pixel) {
+ uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel;
+ if (n > num_pixels) {
+ n = num_pixels;
+ }
+ return n;
+}
+
+// --------
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__y(wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__Y:
+ return wuffs_base__pixel_swizzler__copy_1_1;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ return wuffs_base__pixel_swizzler__bgr_565__y;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ return wuffs_base__pixel_swizzler__xxx__y;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ if (wuffs_base__cpu_arch__have_x86_sse42()) {
+ return wuffs_base__pixel_swizzler__xxxx__y__sse42;
+ }
+#endif
+ return wuffs_base__pixel_swizzler__xxxx__y;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
+ return wuffs_base__pixel_swizzler__xxxxxxxx__y;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__y_16be(wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__Y:
+ return wuffs_base__pixel_swizzler__y__y_16be;
+
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
+ return wuffs_base__pixel_swizzler__y_16le__y_16be;
+
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
+ return wuffs_base__pixel_swizzler__copy_2_2;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ return wuffs_base__pixel_swizzler__bgr_565__y_16be;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ return wuffs_base__pixel_swizzler__xxx__y_16be;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ return wuffs_base__pixel_swizzler__xxxx__y_16be;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
+ return wuffs_base__pixel_swizzler__xxxxxxxx__y_16be;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__indexed__bgra_nonpremul(
+ wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
+ if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__copy_1_1;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ if (wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888(
+ dst_palette.ptr, dst_palette.len, src_palette.ptr,
+ src_palette.len, true) !=
+ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
+ return NULL;
+ }
+ return wuffs_base__pixel_swizzler__bgr_565__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return NULL;
+ }
+ return wuffs_base__pixel_swizzler__bgr_565__index_bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ if (wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src(
+ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
+ src_palette.len) !=
+ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
+ return NULL;
+ }
+ return wuffs_base__pixel_swizzler__xxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return NULL;
+ }
+ return wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__xxxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__xxxxxxxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ if (wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src(
+ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
+ src_palette.len) !=
+ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
+ return NULL;
+ }
+ return wuffs_base__pixel_swizzler__xxxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return NULL;
+ }
+ return wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ // TODO.
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx(
+ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
+ src_palette.len) !=
+ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__xxxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ if (wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src(
+ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
+ src_palette.len) !=
+ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
+ return NULL;
+ }
+ return wuffs_base__pixel_swizzler__xxxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx(
+ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
+ src_palette.len) !=
+ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
+ return NULL;
+ }
+ return wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ // TODO.
+ break;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__indexed__bgra_binary(
+ wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
+ if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__copy_1_1;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ if (wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888(
+ dst_palette.ptr, dst_palette.len, src_palette.ptr,
+ src_palette.len, false) !=
+ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr_565__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr_565__index_binary_alpha__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__xxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__xxxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
+ if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) !=
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__xxxxxxxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx(
+ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
+ src_palette.len) !=
+ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__xxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx(
+ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
+ src_palette.len) !=
+ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
+ return NULL;
+ }
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__xxxx__index__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over;
+ }
+ return NULL;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__bgr_565(
+ wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ return wuffs_base__pixel_swizzler__copy_2_2;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ return wuffs_base__pixel_swizzler__bgr__bgr_565;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ return wuffs_base__pixel_swizzler__bgrw__bgr_565;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
+ return wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ return wuffs_base__pixel_swizzler__rgbw__bgr_565;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__bgr(wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ return wuffs_base__pixel_swizzler__bgr_565__bgr;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ return wuffs_base__pixel_swizzler__copy_3_3;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ return wuffs_base__pixel_swizzler__bgrw__bgr;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
+ return wuffs_base__pixel_swizzler__bgrw_4x16le__bgr;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ return wuffs_base__pixel_swizzler__swap_rgb_bgr;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ if (wuffs_base__cpu_arch__have_x86_sse42()) {
+ return wuffs_base__pixel_swizzler__bgrw__rgb__sse42;
+ }
+#endif
+ return wuffs_base__pixel_swizzler__bgrw__rgb;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__bgra_nonpremul(
+ wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__copy_4_4;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ // TODO.
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ // TODO.
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ if (wuffs_base__cpu_arch__have_x86_sse42()) {
+ return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__sse42;
+ }
+#endif
+ return wuffs_base__pixel_swizzler__swap_rgbx_bgrx;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ // TODO.
+ break;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__bgra_nonpremul_4x16le(
+ wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__copy_8_8;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ // TODO.
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ // TODO.
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src_over;
+ }
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ // TODO.
+ break;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__bgra_premul(
+ wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr__bgra_premul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__copy_4_4;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ if (wuffs_base__cpu_arch__have_x86_sse42()) {
+ return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__sse42;
+ }
+#endif
+ return wuffs_base__pixel_swizzler__swap_rgbx_bgrx;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over;
+ }
+ return NULL;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__bgrx(wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ return wuffs_base__pixel_swizzler__bgr_565__bgrx;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ return wuffs_base__pixel_swizzler__xxx__xxxx;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ return wuffs_base__pixel_swizzler__bgrw__bgrx;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ return wuffs_base__pixel_swizzler__bgrw_4x16le__bgrx;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ return wuffs_base__pixel_swizzler__copy_4_4;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ // TODO.
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ return wuffs_base__pixel_swizzler__bgrw__rgbx;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__rgb(wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ return wuffs_base__pixel_swizzler__bgr_565__rgb;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ return wuffs_base__pixel_swizzler__swap_rgb_bgr;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ if (wuffs_base__cpu_arch__have_x86_sse42()) {
+ return wuffs_base__pixel_swizzler__bgrw__rgb__sse42;
+ }
+#endif
+ return wuffs_base__pixel_swizzler__bgrw__rgb;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ return wuffs_base__pixel_swizzler__bgrw_4x16le__rgb;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ return wuffs_base__pixel_swizzler__copy_3_3;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ return wuffs_base__pixel_swizzler__bgrw__bgr;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__rgba_nonpremul(
+ wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ if (wuffs_base__cpu_arch__have_x86_sse42()) {
+ return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__sse42;
+ }
+#endif
+ return wuffs_base__pixel_swizzler__swap_rgbx_bgrx;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ // TODO.
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ // TODO.
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__copy_4_4;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ // TODO.
+ break;
+ }
+ return NULL;
+}
+
+static wuffs_base__pixel_swizzler__func //
+wuffs_base__pixel_swizzler__prepare__rgba_premul(
+ wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgr__rgba_premul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ if (wuffs_base__cpu_arch__have_x86_sse42()) {
+ return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__sse42;
+ }
+#endif
+ return wuffs_base__pixel_swizzler__swap_rgbx_bgrx;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over;
+ }
+ return NULL;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ return wuffs_base__pixel_swizzler__copy_4_4;
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ return wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over;
+ }
+ return NULL;
+ }
+ return NULL;
+}
+
+// --------
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status //
+wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__pixel_format src_pixfmt,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ if (!p) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ p->private_impl.func = NULL;
+ p->private_impl.transparent_black_func = NULL;
+ p->private_impl.dst_pixfmt_bytes_per_pixel = 0;
+ p->private_impl.src_pixfmt_bytes_per_pixel = 0;
+
+ wuffs_base__pixel_swizzler__func func = NULL;
+ wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func =
+ NULL;
+
+ uint32_t dst_pixfmt_bits_per_pixel =
+ wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt);
+ if ((dst_pixfmt_bits_per_pixel == 0) ||
+ ((dst_pixfmt_bits_per_pixel & 7) != 0)) {
+ return wuffs_base__make_status(
+ wuffs_base__error__unsupported_pixel_swizzler_option);
+ }
+
+ uint32_t src_pixfmt_bits_per_pixel =
+ wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt);
+ if ((src_pixfmt_bits_per_pixel == 0) ||
+ ((src_pixfmt_bits_per_pixel & 7) != 0)) {
+ return wuffs_base__make_status(
+ wuffs_base__error__unsupported_pixel_swizzler_option);
+ }
+
+ // TODO: support many more formats.
+
+ switch (blend) {
+ case WUFFS_BASE__PIXEL_BLEND__SRC:
+ transparent_black_func =
+ wuffs_base__pixel_swizzler__transparent_black_src;
+ break;
+
+ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+ transparent_black_func =
+ wuffs_base__pixel_swizzler__transparent_black_src_over;
+ break;
+ }
+
+ switch (src_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__Y:
+ func = wuffs_base__pixel_swizzler__prepare__y(p, dst_pixfmt, dst_palette,
+ src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
+ func = wuffs_base__pixel_swizzler__prepare__y_16be(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
+ func = wuffs_base__pixel_swizzler__prepare__indexed__bgra_nonpremul(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
+ func = wuffs_base__pixel_swizzler__prepare__indexed__bgra_binary(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ func = wuffs_base__pixel_swizzler__prepare__bgr_565(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ func = wuffs_base__pixel_swizzler__prepare__bgr(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ func = wuffs_base__pixel_swizzler__prepare__bgra_nonpremul(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ func = wuffs_base__pixel_swizzler__prepare__bgra_nonpremul_4x16le(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ func = wuffs_base__pixel_swizzler__prepare__bgra_premul(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ func = wuffs_base__pixel_swizzler__prepare__bgrx(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ func = wuffs_base__pixel_swizzler__prepare__rgb(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ func = wuffs_base__pixel_swizzler__prepare__rgba_nonpremul(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ func = wuffs_base__pixel_swizzler__prepare__rgba_premul(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+ }
+
+ p->private_impl.func = func;
+ p->private_impl.transparent_black_func = transparent_black_func;
+ p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8;
+ p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8;
+ return wuffs_base__make_status(
+ func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option);
+}
+
+WUFFS_BASE__MAYBE_STATIC uint64_t //
+wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
+ const wuffs_base__pixel_swizzler* p,
+ uint32_t up_to_num_pixels,
+ wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 dst_palette,
+ const uint8_t** ptr_iop_r,
+ const uint8_t* io2_r) {
+ if (p && p->private_impl.func) {
+ const uint8_t* iop_r = *ptr_iop_r;
+ uint64_t src_len = wuffs_base__u64__min(
+ ((uint64_t)up_to_num_pixels) *
+ ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel),
+ ((uint64_t)(io2_r - iop_r)));
+ uint64_t n =
+ (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
+ dst_palette.len, iop_r, (size_t)src_len);
+ *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel;
+ return n;
+ }
+ return 0;
+}
+
+WUFFS_BASE__MAYBE_STATIC uint64_t //
+wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
+ const wuffs_base__pixel_swizzler* p,
+ wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 dst_palette,
+ const uint8_t** ptr_iop_r,
+ const uint8_t* io2_r) {
+ if (p && p->private_impl.func) {
+ const uint8_t* iop_r = *ptr_iop_r;
+ uint64_t src_len = ((uint64_t)(io2_r - iop_r));
+ uint64_t n =
+ (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
+ dst_palette.len, iop_r, (size_t)src_len);
+ *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel;
+ return n;
+ }
+ return 0;
+}
+
+WUFFS_BASE__MAYBE_STATIC uint64_t //
+wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
+ const wuffs_base__pixel_swizzler* p,
+ wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src) {
+ if (p && p->private_impl.func) {
+ return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
+ dst_palette.len, src.ptr, src.len);
+ }
+ return 0;
+}
+
+WUFFS_BASE__MAYBE_STATIC uint64_t //
+wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(
+ const wuffs_base__pixel_swizzler* p,
+ wuffs_base__slice_u8 dst,
+ wuffs_base__slice_u8 dst_palette,
+ uint64_t num_pixels) {
+ if (p && p->private_impl.transparent_black_func) {
+ return (*p->private_impl.transparent_black_func)(
+ dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels,
+ p->private_impl.dst_pixfmt_bytes_per_pixel);
+ }
+ return 0;
+}
+
+#endif // !defined(WUFFS_CONFIG__MODULES) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
+ defined(WUFFS_CONFIG__MODULE__BASE__UTF8)
+
+// ---------------- Unicode and UTF-8
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) {
+ if (code_point <= 0x7F) {
+ if (dst.len >= 1) {
+ dst.ptr[0] = (uint8_t)(code_point);
+ return 1;
+ }
+
+ } else if (code_point <= 0x07FF) {
+ if (dst.len >= 2) {
+ dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6)));
+ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
+ return 2;
+ }
+
+ } else if (code_point <= 0xFFFF) {
+ if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) {
+ dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12)));
+ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
+ dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
+ return 3;
+ }
+
+ } else if (code_point <= 0x10FFFF) {
+ if (dst.len >= 4) {
+ dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18)));
+ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F));
+ dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
+ dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
+ return 4;
+ }
+ }
+
+ return 0;
+}
+
+// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a
+// UTF-8 encoded code point, based on the encoding's initial byte.
+// - 0x00 is 1-byte UTF-8 (ASCII).
+// - 0x01 is the start of 2-byte UTF-8.
+// - 0x02 is the start of 3-byte UTF-8.
+// - 0x03 is the start of 4-byte UTF-8.
+// - 0x40 is a UTF-8 tail byte.
+// - 0x80 is invalid UTF-8.
+//
+// RFC 3629 (UTF-8) gives this grammar for valid UTF-8:
+// UTF8-1 = %x00-7F
+// UTF8-2 = %xC2-DF UTF8-tail
+// UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
+// %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
+// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
+// %xF4 %x80-8F 2( UTF8-tail )
+// UTF8-tail = %x80-BF
+static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = {
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 ..= 0x37.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F.
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77.
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F.
+
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x80 ..= 0x87.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x88 ..= 0x8F.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x90 ..= 0x97.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x98 ..= 0x9F.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA0 ..= 0xA7.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA8 ..= 0xAF.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB0 ..= 0xB7.
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB8 ..= 0xBF.
+
+ 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC0 ..= 0xC7.
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC8 ..= 0xCF.
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD0 ..= 0xD7.
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD8 ..= 0xDF.
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE0 ..= 0xE7.
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE8 ..= 0xEF.
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7.
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF.
+ // 0 1 2 3 4 5 6 7
+ // 8 9 A B C D E F
+};
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output //
+wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) {
+ if (s_len == 0) {
+ return wuffs_base__make_utf_8__next__output(0, 0);
+ }
+ uint32_t c = s_ptr[0];
+ switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) {
+ case 0:
+ return wuffs_base__make_utf_8__next__output(c, 1);
+
+ case 1:
+ if (s_len < 2) {
+ break;
+ }
+ c = wuffs_base__peek_u16le__no_bounds_check(s_ptr);
+ if ((c & 0xC000) != 0x8000) {
+ break;
+ }
+ c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8));
+ return wuffs_base__make_utf_8__next__output(c, 2);
+
+ case 2:
+ if (s_len < 3) {
+ break;
+ }
+ c = wuffs_base__peek_u24le__no_bounds_check(s_ptr);
+ if ((c & 0xC0C000) != 0x808000) {
+ break;
+ }
+ c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) |
+ (0x00003F & (c >> 16));
+ if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) {
+ break;
+ }
+ return wuffs_base__make_utf_8__next__output(c, 3);
+
+ case 3:
+ if (s_len < 4) {
+ break;
+ }
+ c = wuffs_base__peek_u32le__no_bounds_check(s_ptr);
+ if ((c & 0xC0C0C000) != 0x80808000) {
+ break;
+ }
+ c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) |
+ (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24));
+ if ((c <= 0xFFFF) || (0x110000 <= c)) {
+ break;
+ }
+ return wuffs_base__make_utf_8__next__output(c, 4);
+ }
+
+ return wuffs_base__make_utf_8__next__output(
+ WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1);
+}
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output //
+wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) {
+ if (s_len == 0) {
+ return wuffs_base__make_utf_8__next__output(0, 0);
+ }
+ const uint8_t* ptr = &s_ptr[s_len - 1];
+ if (*ptr < 0x80) {
+ return wuffs_base__make_utf_8__next__output(*ptr, 1);
+
+ } else if (*ptr < 0xC0) {
+ const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0];
+ uint32_t n = 1;
+ while (ptr != too_far) {
+ ptr--;
+ n++;
+ if (*ptr < 0x80) {
+ break;
+ } else if (*ptr < 0xC0) {
+ continue;
+ }
+ wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n);
+ if (o.byte_length != n) {
+ break;
+ }
+ return o;
+ }
+ }
+
+ return wuffs_base__make_utf_8__next__output(
+ WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1);
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) {
+ // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time).
+ //
+ // TODO: possibly optimize this by manually inlining the
+ // wuffs_base__utf_8__next calls.
+ size_t original_len = s_len;
+ while (s_len > 0) {
+ wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len);
+ if ((o.code_point > 0x7F) && (o.byte_length == 1)) {
+ break;
+ }
+ s_ptr += o.byte_length;
+ s_len -= o.byte_length;
+ }
+ return original_len - s_len;
+}
+
+WUFFS_BASE__MAYBE_STATIC size_t //
+wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) {
+ // TODO: possibly optimize this by checking 4 or 8 bytes at a time.
+ const uint8_t* original_ptr = s_ptr;
+ const uint8_t* p = s_ptr;
+ const uint8_t* q = s_ptr + s_len;
+ for (; (p != q) && ((*p & 0x80) == 0); p++) {
+ }
+ return (size_t)(p - original_ptr);
+}
+
+#endif // !defined(WUFFS_CONFIG__MODULES) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE) ||
+ // defined(WUFFS_CONFIG__MODULE__BASE__UTF8)
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32)
+
+// ---------------- Status Codes Implementations
+
+// ---------------- Private Consts
+
+// ---------------- Private Initializer Prototypes
+
+// ---------------- Private Function Prototypes
+
+static wuffs_base__empty_struct
+wuffs_adler32__hasher__up(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x);
+
+static wuffs_base__empty_struct
+wuffs_adler32__hasher__up__choosy_default(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x);
+
+#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+static wuffs_base__empty_struct
+wuffs_adler32__hasher__up_arm_neon(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x);
+#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+static wuffs_base__empty_struct
+wuffs_adler32__hasher__up_x86_sse42(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x);
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+
+// ---------------- VTables
+
+const wuffs_base__hasher_u32__func_ptrs
+wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
+ (wuffs_base__empty_struct(*)(void*,
+ uint32_t,
+ bool))(&wuffs_adler32__hasher__set_quirk_enabled),
+ (uint32_t(*)(void*,
+ wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32),
+};
+
+// ---------------- Initializer Implementations
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_adler32__hasher__initialize(
+ wuffs_adler32__hasher* self,
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options){
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (sizeof(*self) != sizeof_star_self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
+ }
+ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
+ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
+ }
+
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ // The whole point of this if-check is to detect an uninitialized *self.
+ // We disable the warning on GCC. Clang-5.0 does not have this warning.
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#endif
+ if (self->private_impl.magic != 0) {
+ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
+ }
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ } else {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ memset(self, 0, sizeof(*self));
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ } else {
+ memset(&(self->private_impl), 0, sizeof(self->private_impl));
+ }
+ }
+
+ self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default;
+
+ self->private_impl.magic = WUFFS_BASE__MAGIC;
+ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
+ wuffs_base__hasher_u32__vtable_name;
+ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
+ (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32);
+ return wuffs_base__make_status(NULL);
+}
+
+wuffs_adler32__hasher*
+wuffs_adler32__hasher__alloc() {
+ wuffs_adler32__hasher* x =
+ (wuffs_adler32__hasher*)(calloc(sizeof(wuffs_adler32__hasher), 1));
+ if (!x) {
+ return NULL;
+ }
+ if (wuffs_adler32__hasher__initialize(
+ x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
+ free(x);
+ return NULL;
+ }
+ return x;
+}
+
+size_t
+sizeof__wuffs_adler32__hasher() {
+ return sizeof(wuffs_adler32__hasher);
+}
+
+// ---------------- Function Implementations
+
+// -------- func adler32.hasher.set_quirk_enabled
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_adler32__hasher__set_quirk_enabled(
+ wuffs_adler32__hasher* self,
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_base__make_empty_struct();
+}
+
+// -------- func adler32.hasher.update_u32
+
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_adler32__hasher__update_u32(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ if (!self) {
+ return 0;
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return 0;
+ }
+
+ if ( ! self->private_impl.f_started) {
+ self->private_impl.f_started = true;
+ self->private_impl.f_state = 1;
+ self->private_impl.choosy_up = (
+#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon :
+#endif
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 :
+#endif
+ self->private_impl.choosy_up);
+ }
+ wuffs_adler32__hasher__up(self, a_x);
+ return self->private_impl.f_state;
+}
+
+// -------- func adler32.hasher.up
+
+static wuffs_base__empty_struct
+wuffs_adler32__hasher__up(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ return (*self->private_impl.choosy_up)(self, a_x);
+}
+
+static wuffs_base__empty_struct
+wuffs_adler32__hasher__up__choosy_default(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ uint32_t v_s1 = 0;
+ uint32_t v_s2 = 0;
+ wuffs_base__slice_u8 v_remaining = {0};
+ wuffs_base__slice_u8 v_p = {0};
+
+ v_s1 = ((self->private_impl.f_state) & 0xFFFF);
+ v_s2 = ((self->private_impl.f_state) >> (32 - (16)));
+ while (((uint64_t)(a_x.len)) > 0) {
+ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0);
+ if (((uint64_t)(a_x.len)) > 5552) {
+ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552);
+ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552);
+ }
+ {
+ wuffs_base__slice_u8 i_slice_p = a_x;
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 1;
+ uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8);
+ while (v_p.ptr < i_end0_p) {
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ }
+ v_p.len = 1;
+ uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len;
+ while (v_p.ptr < i_end1_p) {
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ }
+ v_p.len = 0;
+ }
+ v_s1 %= 65521;
+ v_s2 %= 65521;
+ a_x = v_remaining;
+ }
+ self->private_impl.f_state = (((v_s2 & 65535) << 16) | (v_s1 & 65535));
+ return wuffs_base__make_empty_struct();
+}
+
+// ‼ WUFFS MULTI-FILE SECTION +arm_neon
+// -------- func adler32.hasher.up_arm_neon
+
+#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+static wuffs_base__empty_struct
+wuffs_adler32__hasher__up_arm_neon(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ uint32_t v_s1 = 0;
+ uint32_t v_s2 = 0;
+ wuffs_base__slice_u8 v_remaining = {0};
+ wuffs_base__slice_u8 v_p = {0};
+ uint8x16_t v_p__left = {0};
+ uint8x16_t v_p_right = {0};
+ uint32x4_t v_v1 = {0};
+ uint32x4_t v_v2 = {0};
+ uint16x8_t v_col0 = {0};
+ uint16x8_t v_col1 = {0};
+ uint16x8_t v_col2 = {0};
+ uint16x8_t v_col3 = {0};
+ uint32x2_t v_sum1 = {0};
+ uint32x2_t v_sum2 = {0};
+ uint32x2_t v_sum12 = {0};
+ uint32_t v_num_iterate_bytes = 0;
+ uint64_t v_tail_index = 0;
+
+ v_s1 = ((self->private_impl.f_state) & 0xFFFF);
+ v_s2 = ((self->private_impl.f_state) >> (32 - (16)));
+ while ((((uint64_t)(a_x.len)) > 0) && ((15 & ((uint32_t)(0xFFF & (uintptr_t)(a_x.ptr)))) != 0)) {
+ v_s1 += ((uint32_t)(a_x.ptr[0]));
+ v_s2 += v_s1;
+ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1);
+ }
+ v_s1 %= 65521;
+ v_s2 %= 65521;
+ while (((uint64_t)(a_x.len)) > 0) {
+ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0);
+ if (((uint64_t)(a_x.len)) > 5536) {
+ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536);
+ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536);
+ }
+ v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264)));
+ v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes));
+ v_v1 = vdupq_n_u32(0);
+ v_v2 = vdupq_n_u32(0);
+ v_col0 = vdupq_n_u16(0);
+ v_col1 = vdupq_n_u16(0);
+ v_col2 = vdupq_n_u16(0);
+ v_col3 = vdupq_n_u16(0);
+ {
+ wuffs_base__slice_u8 i_slice_p = a_x;
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 32;
+ uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32);
+ while (v_p.ptr < i_end0_p) {
+ v_p__left = vld1q_u8(v_p.ptr);
+ v_p_right = vld1q_u8(v_p.ptr + 16);
+ v_v2 = vaddq_u32(v_v2, v_v1);
+ v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right));
+ v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left));
+ v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left));
+ v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right));
+ v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right));
+ v_p.ptr += 32;
+ }
+ v_p.len = 0;
+ }
+ v_v2 = vshlq_n_u32(v_v2, 5);
+ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32, 31, 30, 29}));
+ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28, 27, 26, 25}));
+ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24, 23, 22, 21}));
+ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20, 19, 18, 17}));
+ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16, 15, 14, 13}));
+ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12, 11, 10, 9}));
+ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8, 7, 6, 5}));
+ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4, 3, 2, 1}));
+ v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1));
+ v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2));
+ v_sum12 = vpadd_u32(v_sum1, v_sum2);
+ v_s1 += vget_lane_u32(v_sum12, 0);
+ v_s2 += vget_lane_u32(v_sum12, 1);
+ v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u);
+ if (v_tail_index < ((uint64_t)(a_x.len))) {
+ {
+ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 1;
+ uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+ while (v_p.ptr < i_end0_p) {
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ }
+ v_p.len = 0;
+ }
+ }
+ v_s1 %= 65521;
+ v_s2 %= 65521;
+ a_x = v_remaining;
+ }
+ self->private_impl.f_state = (((v_s2 & 65535) << 16) | (v_s1 & 65535));
+ return wuffs_base__make_empty_struct();
+}
+#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+// ‼ WUFFS MULTI-FILE SECTION -arm_neon
+
+// ‼ WUFFS MULTI-FILE SECTION +x86_sse42
+// -------- func adler32.hasher.up_x86_sse42
+
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
+static wuffs_base__empty_struct
+wuffs_adler32__hasher__up_x86_sse42(
+ wuffs_adler32__hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ uint32_t v_s1 = 0;
+ uint32_t v_s2 = 0;
+ wuffs_base__slice_u8 v_remaining = {0};
+ wuffs_base__slice_u8 v_p = {0};
+ __m128i v_zeroes = {0};
+ __m128i v_ones = {0};
+ __m128i v_weights__left = {0};
+ __m128i v_weights_right = {0};
+ __m128i v_q__left = {0};
+ __m128i v_q_right = {0};
+ __m128i v_v1 = {0};
+ __m128i v_v2 = {0};
+ __m128i v_v2j = {0};
+ __m128i v_v2k = {0};
+ uint32_t v_num_iterate_bytes = 0;
+ uint64_t v_tail_index = 0;
+
+ v_zeroes = _mm_set1_epi16((int16_t)(0));
+ v_ones = _mm_set1_epi16((int16_t)(1));
+ v_weights__left = _mm_set_epi8((int8_t)(17), (int8_t)(18), (int8_t)(19), (int8_t)(20), (int8_t)(21), (int8_t)(22), (int8_t)(23), (int8_t)(24), (int8_t)(25), (int8_t)(26), (int8_t)(27), (int8_t)(28), (int8_t)(29), (int8_t)(30), (int8_t)(31), (int8_t)(32));
+ v_weights_right = _mm_set_epi8((int8_t)(1), (int8_t)(2), (int8_t)(3), (int8_t)(4), (int8_t)(5), (int8_t)(6), (int8_t)(7), (int8_t)(8), (int8_t)(9), (int8_t)(10), (int8_t)(11), (int8_t)(12), (int8_t)(13), (int8_t)(14), (int8_t)(15), (int8_t)(16));
+ v_s1 = ((self->private_impl.f_state) & 0xFFFF);
+ v_s2 = ((self->private_impl.f_state) >> (32 - (16)));
+ while (((uint64_t)(a_x.len)) > 0) {
+ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0);
+ if (((uint64_t)(a_x.len)) > 5536) {
+ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536);
+ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536);
+ }
+ v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264)));
+ v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes));
+ v_v1 = _mm_setzero_si128();
+ v_v2j = _mm_setzero_si128();
+ v_v2k = _mm_setzero_si128();
+ {
+ wuffs_base__slice_u8 i_slice_p = a_x;
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 32;
+ uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32);
+ while (v_p.ptr < i_end0_p) {
+ v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr));
+ v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16));
+ v_v2j = _mm_add_epi32(v_v2j, v_v1);
+ v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes));
+ v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes));
+ v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left)));
+ v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right)));
+ v_p.ptr += 32;
+ }
+ v_p.len = 0;
+ }
+ v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177)));
+ v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78)));
+ v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1)));
+ v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5)));
+ v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177)));
+ v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78)));
+ v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2)));
+ v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u);
+ if (v_tail_index < ((uint64_t)(a_x.len))) {
+ {
+ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 1;
+ uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+ while (v_p.ptr < i_end0_p) {
+ v_s1 += ((uint32_t)(v_p.ptr[0]));
+ v_s2 += v_s1;
+ v_p.ptr += 1;
+ }
+ v_p.len = 0;
+ }
+ }
+ v_s1 %= 65521;
+ v_s2 %= 65521;
+ a_x = v_remaining;
+ }
+ self->private_impl.f_state = (((v_s2 & 65535) << 16) | (v_s1 & 65535));
+ return wuffs_base__make_empty_struct();
+}
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+// ‼ WUFFS MULTI-FILE SECTION -x86_sse42
+
+#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32)
+
+// ---------------- Status Codes Implementations
+
+// ---------------- Private Consts
+
+static const uint32_t
+WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = {
+ {
+ 0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035,
+ 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049,
+ 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639,
+ 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317,
+ 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443,
+ 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665,
+ 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303,
+ 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565,
+ 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059,
+ 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297,
+ 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223,
+ 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405,
+ 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995,
+ 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649,
+ 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015,
+ 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989,
+ 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523,
+ 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377,
+ 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879,
+ 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637,
+ 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859,
+ 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161,
+ 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815,
+ 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221,
+ 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371,
+ 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881,
+ 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567,
+ 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701,
+ 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035,
+ 2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897,
+ 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431,
+ 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117,
+ }, {
+ 0, 421212481, 842424962, 724390851, 1684849924, 2105013317, 1448781702, 1329698503,
+ 3369699848, 3519200073, 4210026634, 3824474571, 2897563404, 3048111693, 2659397006, 2274893007,
+ 1254232657, 1406739216, 2029285587, 1643069842, 783210325, 934667796, 479770071, 92505238,
+ 2182846553, 2600511768, 2955803355, 2838940570, 3866582365, 4285295644, 3561045983, 3445231262,
+ 2508465314, 2359236067, 2813478432, 3198777185, 4058571174, 3908292839, 3286139684, 3670389349,
+ 1566420650, 1145479147, 1869335592, 1987116393, 959540142, 539646703, 185010476, 303839341,
+ 3745920755, 3327985586, 3983561841, 4100678960, 3140154359, 2721170102, 2300350837, 2416418868,
+ 396344571, 243568058, 631889529, 1018359608, 1945336319, 1793607870, 1103436669, 1490954812,
+ 4034481925, 3915546180, 3259968903, 3679722694, 2484439553, 2366552896, 2787371139, 3208174018,
+ 950060301, 565965900, 177645455, 328046286, 1556873225, 1171730760, 1861902987, 2011255754,
+ 3132841300, 2745199637, 2290958294, 2442530455, 3738671184, 3352078609, 3974232786, 4126854035,
+ 1919080284, 1803150877, 1079293406, 1498383519, 370020952, 253043481, 607678682, 1025720731,
+ 1711106983, 2095471334, 1472923941, 1322268772, 26324643, 411738082, 866634785, 717028704,
+ 2904875439, 3024081134, 2668790573, 2248782444, 3376948395, 3495106026, 4219356713, 3798300520,
+ 792689142, 908347575, 487136116, 68299317, 1263779058, 1380486579, 2036719216, 1618931505,
+ 3890672638, 4278043327, 3587215740, 3435896893, 2206873338, 2593195963, 2981909624, 2829542713,
+ 998479947, 580430090, 162921161, 279890824, 1609522511, 1190423566, 1842954189, 1958874764,
+ 4082766403, 3930137346, 3245109441, 3631694208, 2536953671, 2385372678, 2768287173, 3155920004,
+ 1900120602, 1750776667, 1131931800, 1517083097, 355290910, 204897887, 656092572, 1040194781,
+ 3113746450, 2692952403, 2343461520, 2461357009, 3723805974, 3304059991, 4022511508, 4141455061,
+ 2919742697, 3072101800, 2620513899, 2234183466, 3396041197, 3547351212, 4166851439, 3779471918,
+ 1725839073, 2143618976, 1424512099, 1307796770, 45282277, 464110244, 813994343, 698327078,
+ 3838160568, 4259225593, 3606301754, 3488152955, 2158586812, 2578602749, 2996767038, 2877569151,
+ 740041904, 889656817, 506086962, 120682355, 1215357364, 1366020341, 2051441462, 1667084919,
+ 3422213966, 3538019855, 4190942668, 3772220557, 2945847882, 3062702859, 2644537544, 2226864521,
+ 52649286, 439905287, 823476164, 672009861, 1733269570, 2119477507, 1434057408, 1281543041,
+ 2167981343, 2552493150, 3004082077, 2853541596, 3847487515, 4233048410, 3613549209, 3464057816,
+ 1239502615, 1358593622, 2077699477, 1657543892, 764250643, 882293586, 532408465, 111204816,
+ 1585378284, 1197851309, 1816695150, 1968414767, 974272232, 587794345, 136598634, 289367339,
+ 2527558116, 2411481253, 2760973158, 3179948583, 4073438432, 3956313505, 3237863010, 3655790371,
+ 347922877, 229101820, 646611775, 1066513022, 1892689081, 1774917112, 1122387515, 1543337850,
+ 3697634229, 3313392372, 3998419255, 4148705398, 3087642289, 2702352368, 2319436851, 2468674930,
+ }, {
+ 0, 29518391, 59036782, 38190681, 118073564, 114017003, 76381362, 89069189,
+ 236147128, 265370511, 228034006, 206958561, 152762724, 148411219, 178138378, 190596925,
+ 472294256, 501532999, 530741022, 509615401, 456068012, 451764635, 413917122, 426358261,
+ 305525448, 334993663, 296822438, 275991697, 356276756, 352202787, 381193850, 393929805,
+ 944588512, 965684439, 1003065998, 973863097, 1061482044, 1049003019, 1019230802, 1023561829,
+ 912136024, 933002607, 903529270, 874031361, 827834244, 815125939, 852716522, 856752605,
+ 611050896, 631869351, 669987326, 640506825, 593644876, 580921211, 551983394, 556069653,
+ 712553512, 733666847, 704405574, 675154545, 762387700, 749958851, 787859610, 792175277,
+ 1889177024, 1901651959, 1931368878, 1927033753, 2006131996, 1985040171, 1947726194, 1976933189,
+ 2122964088, 2135668303, 2098006038, 2093965857, 2038461604, 2017599123, 2047123658, 2076625661,
+ 1824272048, 1836991623, 1866005214, 1861914857, 1807058540, 1786244187, 1748062722, 1777547317,
+ 1655668488, 1668093247, 1630251878, 1625932113, 1705433044, 1684323811, 1713505210, 1742760333,
+ 1222101792, 1226154263, 1263738702, 1251046777, 1339974652, 1310460363, 1281013650, 1301863845,
+ 1187289752, 1191637167, 1161842422, 1149379777, 1103966788, 1074747507, 1112139306, 1133218845,
+ 1425107024, 1429406311, 1467333694, 1454888457, 1408811148, 1379576507, 1350309090, 1371438805,
+ 1524775400, 1528845279, 1499917702, 1487177649, 1575719220, 1546255107, 1584350554, 1605185389,
+ 3778354048, 3774312887, 3803303918, 3816007129, 3862737756, 3892238699, 3854067506, 3833203973,
+ 4012263992, 4007927823, 3970080342, 3982554209, 3895452388, 3924658387, 3953866378, 3932773565,
+ 4245928176, 4241609415, 4271336606, 4283762345, 4196012076, 4225268251, 4187931714, 4166823541,
+ 4076923208, 4072833919, 4035198246, 4047918865, 4094247316, 4123732899, 4153251322, 4132437965,
+ 3648544096, 3636082519, 3673983246, 3678331705, 3732010428, 3753090955, 3723829714, 3694611429,
+ 3614117080, 3601426159, 3572488374, 3576541825, 3496125444, 3516976691, 3555094634, 3525581405,
+ 3311336976, 3298595879, 3336186494, 3340255305, 3260503756, 3281337595, 3251864226, 3222399125,
+ 3410866088, 3398419871, 3368647622, 3372945905, 3427010420, 3448139075, 3485520666, 3456284973,
+ 2444203584, 2423127159, 2452308526, 2481530905, 2527477404, 2539934891, 2502093554, 2497740997,
+ 2679949304, 2659102159, 2620920726, 2650438049, 2562027300, 2574714131, 2603727690, 2599670141,
+ 2374579504, 2353749767, 2383274334, 2412743529, 2323684844, 2336421851, 2298759554, 2294686645,
+ 2207933576, 2186809023, 2149495014, 2178734801, 2224278612, 2236720739, 2266437690, 2262135309,
+ 2850214048, 2820717207, 2858812622, 2879680249, 2934667388, 2938704459, 2909776914, 2897069605,
+ 2817622296, 2788420399, 2759153014, 2780249921, 2700618180, 2704950259, 2742877610, 2730399645,
+ 3049550800, 3020298727, 3057690558, 3078802825, 2999835404, 3004150075, 2974355298, 2961925461,
+ 3151438440, 3121956959, 3092510214, 3113327665, 3168701108, 3172786307, 3210370778, 3197646061,
+ }, {
+ 0, 3099354981, 2852767883, 313896942, 2405603159, 937357362, 627793884, 2648127673,
+ 3316918511, 2097696650, 1874714724, 3607201537, 1255587768, 4067088605, 3772741427, 1482887254,
+ 1343838111, 3903140090, 4195393300, 1118632049, 3749429448, 1741137837, 1970407491, 3452858150,
+ 2511175536, 756094997, 1067759611, 2266550430, 449832999, 2725482306, 2965774508, 142231497,
+ 2687676222, 412010587, 171665333, 2995192016, 793786473, 2548850444, 2237264098, 1038456711,
+ 1703315409, 3711623348, 3482275674, 1999841343, 3940814982, 1381529571, 1089329165, 4166106984,
+ 4029413537, 1217896388, 1512189994, 3802027855, 2135519222, 3354724499, 3577784189, 1845280792,
+ 899665998, 2367928107, 2677414085, 657096608, 3137160985, 37822588, 284462994, 2823350519,
+ 2601801789, 598228824, 824021174, 2309093331, 343330666, 2898962447, 3195996129, 113467524,
+ 1587572946, 3860600759, 4104763481, 1276501820, 3519211397, 1769898208, 2076913422, 3279374443,
+ 3406630818, 1941006535, 1627703081, 3652755532, 1148164341, 4241751952, 3999682686, 1457141531,
+ 247015245, 3053797416, 2763059142, 470583459, 2178658330, 963106687, 735213713, 2473467892,
+ 992409347, 2207944806, 2435792776, 697522413, 3024379988, 217581361, 508405983, 2800865210,
+ 4271038444, 1177467017, 1419450215, 3962007554, 1911572667, 3377213406, 3690561584, 1665525589,
+ 1799331996, 3548628985, 3241568279, 2039091058, 3831314379, 1558270126, 1314193216, 4142438437,
+ 2928380019, 372764438, 75645176, 3158189981, 568925988, 2572515393, 2346768303, 861712586,
+ 3982079547, 1441124702, 1196457648, 4293663189, 1648042348, 3666298377, 3358779879, 1888390786,
+ 686661332, 2421291441, 2196002399, 978858298, 2811169155, 523464422, 226935048, 3040519789,
+ 3175145892, 100435649, 390670639, 2952089162, 841119475, 2325614998, 2553003640, 546822429,
+ 2029308235, 3225988654, 3539796416, 1782671013, 4153826844, 1328167289, 1570739863, 3844338162,
+ 1298864389, 4124540512, 3882013070, 1608431339, 3255406162, 2058742071, 1744848601, 3501990332,
+ 2296328682, 811816591, 584513889, 2590678532, 129869501, 3204563416, 2914283062, 352848211,
+ 494030490, 2781751807, 3078325777, 264757620, 2450577869, 715964072, 941166918, 2158327331,
+ 3636881013, 1618608400, 1926213374, 3396585883, 1470427426, 4011365959, 4255988137, 1158766284,
+ 1984818694, 3471935843, 3695453837, 1693991400, 4180638033, 1100160564, 1395044826, 3952793279,
+ 3019491049, 189112716, 435162722, 2706139399, 1016811966, 2217162459, 2526189877, 774831696,
+ 643086745, 2666061564, 2354934034, 887166583, 2838900430, 294275499, 54519365, 3145957664,
+ 3823145334, 1532818963, 1240029693, 4048895640, 1820460577, 3560857924, 3331051178, 2117577167,
+ 3598663992, 1858283101, 2088143283, 3301633750, 1495127663, 3785470218, 4078182116, 1269332353,
+ 332098007, 2876706482, 3116540252, 25085497, 2628386432, 605395429, 916469259, 2384220526,
+ 2254837415, 1054503362, 745528876, 2496903497, 151290352, 2981684885, 2735556987, 464596510,
+ 1137851976, 4218313005, 3923506883, 1365741990, 3434129695, 1946996346, 1723425172, 3724871409,
+ }, {
+ 0, 1029712304, 2059424608, 1201699536, 4118849216, 3370159984, 2403399072, 2988497936,
+ 812665793, 219177585, 1253054625, 2010132753, 3320900865, 4170237105, 3207642721, 2186319825,
+ 1625331586, 1568718386, 438355170, 658566482, 2506109250, 2818578674, 4020265506, 3535817618,
+ 1351670851, 1844508147, 709922595, 389064339, 2769320579, 2557498163, 3754961379, 3803185235,
+ 3250663172, 4238411444, 3137436772, 2254525908, 876710340, 153198708, 1317132964, 1944187668,
+ 4054934725, 3436268917, 2339452837, 3054575125, 70369797, 961670069, 2129760613, 1133623509,
+ 2703341702, 2621542710, 3689016294, 3867263574, 1419845190, 1774270454, 778128678, 318858390,
+ 2438067015, 2888948471, 3952189479, 3606153623, 1691440519, 1504803895, 504432359, 594620247,
+ 1492342857, 1704161785, 573770537, 525542041, 2910060169, 2417219385, 3618876905, 3939730521,
+ 1753420680, 1440954936, 306397416, 790849880, 2634265928, 2690882808, 3888375336, 3668168600,
+ 940822475, 91481723, 1121164459, 2142483739, 3448989963, 4042473659, 3075684971, 2318603227,
+ 140739594, 889433530, 1923340138, 1338244826, 4259521226, 3229813626, 2267247018, 3124975642,
+ 2570221389, 2756861693, 3824297005, 3734113693, 1823658381, 1372780605, 376603373, 722643805,
+ 2839690380, 2485261628, 3548540908, 4007806556, 1556257356, 1638052860, 637716780, 459464860,
+ 4191346895, 3300051327, 2199040943, 3195181599, 206718479, 825388991, 1989285231, 1274166495,
+ 3382881038, 4106388158, 3009607790, 2382549470, 1008864718, 21111934, 1189240494, 2072147742,
+ 2984685714, 2357631266, 3408323570, 4131834434, 1147541074, 2030452706, 1051084082, 63335554,
+ 2174155603, 3170292451, 4216760371, 3325460867, 1947622803, 1232499747, 248909555, 867575619,
+ 3506841360, 3966111392, 2881909872, 2527485376, 612794832, 434546784, 1581699760, 1663499008,
+ 3782634705, 3692447073, 2612412337, 2799048193, 351717905, 697754529, 1849071985, 1398190273,
+ 1881644950, 1296545318, 182963446, 931652934, 2242328918, 3100053734, 4284967478, 3255255942,
+ 1079497815, 2100821479, 983009079, 133672583, 3050795671, 2293717799, 3474399735, 4067887175,
+ 281479188, 765927844, 1778867060, 1466397380, 3846680276, 3626469220, 2676489652, 2733102084,
+ 548881365, 500656741, 1517752501, 1729575173, 3577210133, 3898068133, 2952246901, 2459410373,
+ 3910527195, 3564487019, 2480257979, 2931134987, 479546907, 569730987, 1716854139, 1530213579,
+ 3647316762, 3825568426, 2745561210, 2663766474, 753206746, 293940330, 1445287610, 1799716618,
+ 2314567513, 3029685993, 4080348217, 3461678473, 2088098201, 1091956777, 112560889, 1003856713,
+ 3112514712, 2229607720, 3276105720, 4263857736, 1275433560, 1902492648, 918929720, 195422344,
+ 685033439, 364179055, 1377080511, 1869921551, 3713294623, 3761522863, 2811507327, 2599689167,
+ 413436958, 633644462, 1650777982, 1594160846, 3978570462, 3494118254, 2548332990, 2860797966,
+ 1211387997, 1968470509, 854852413, 261368461, 3182753437, 2161434413, 3346310653, 4195650637,
+ 2017729436, 1160000044, 42223868, 1071931724, 2378480988, 2963576044, 4144295484, 3395602316,
+ }, {
+ 0, 3411858341, 1304994059, 2257875630, 2609988118, 1355649459, 3596215069, 486879416,
+ 3964895853, 655315400, 2711298918, 1791488195, 2009251963, 3164476382, 973758832, 4048990933,
+ 64357019, 3364540734, 1310630800, 2235723829, 2554806413, 1394316072, 3582976390, 517157411,
+ 4018503926, 618222419, 2722963965, 1762783832, 1947517664, 3209171269, 970744811, 4068520014,
+ 128714038, 3438335635, 1248109629, 2167961496, 2621261600, 1466012805, 3522553387, 447296910,
+ 3959392091, 547575038, 2788632144, 1835791861, 1886307661, 3140622056, 1034314822, 4143626211,
+ 75106221, 3475428360, 1236444838, 2196665603, 2682996155, 1421317662, 3525567664, 427767573,
+ 3895035328, 594892389, 2782995659, 1857943406, 1941489622, 3101955187, 1047553757, 4113347960,
+ 257428076, 3288652233, 1116777319, 2311878850, 2496219258, 1603640287, 3640781169, 308099796,
+ 3809183745, 676813732, 2932025610, 1704983215, 2023410199, 3016104370, 894593820, 4262377657,
+ 210634999, 3352484690, 1095150076, 2316991065, 2535410401, 1547934020, 3671583722, 294336591,
+ 3772615322, 729897279, 2903845777, 1716123700, 2068629644, 2953845545, 914647431, 4258839074,
+ 150212442, 3282623743, 1161604689, 2388688372, 2472889676, 1480171241, 3735940167, 368132066,
+ 3836185911, 805002898, 2842635324, 1647574937, 2134298401, 3026852996, 855535146, 4188192143,
+ 186781121, 3229539940, 1189784778, 2377547631, 2427670487, 1542429810, 3715886812, 371670393,
+ 3882979244, 741170185, 2864262823, 1642462466, 2095107514, 3082559007, 824732849, 4201955092,
+ 514856152, 3589064573, 1400419795, 2552522358, 2233554638, 1316849003, 3370776517, 62202976,
+ 4075001525, 968836368, 3207280574, 1954014235, 1769133219, 2720925446, 616199592, 4024870413,
+ 493229635, 3594175974, 1353627464, 2616354029, 2264355925, 1303087088, 3409966430, 6498043,
+ 4046820398, 979978123, 3170710821, 2007099008, 1789187640, 2717386141, 661419827, 3962610838,
+ 421269998, 3527459403, 1423225061, 2676515648, 2190300152, 1238466653, 3477467891, 68755798,
+ 4115633027, 1041448998, 3095868040, 1943789869, 1860096405, 2776760880, 588673182, 3897205563,
+ 449450869, 3516317904, 1459794558, 2623431131, 2170245475, 1242006214, 3432247400, 131015629,
+ 4137259288, 1036337853, 3142660115, 1879958454, 1829294862, 2790523051, 549483013, 3952910752,
+ 300424884, 3669282065, 1545650111, 2541513754, 2323209378, 1092980487, 3350330793, 216870412,
+ 4256931033, 921128828, 2960342482, 2066738807, 1714085583, 2910195050, 736264132, 3770592353,
+ 306060335, 3647131530, 1610005796, 2494197377, 2309971513, 1123257756, 3295149874, 255536279,
+ 4268596802, 892423655, 3013951305, 2029645036, 1711070292, 2929725425, 674528607, 3815288570,
+ 373562242, 3709388839, 1535949449, 2429577516, 2379569556, 1183418929, 3223189663, 188820282,
+ 4195850735, 827017802, 3084859620, 2089020225, 1636228089, 2866415708, 743340786, 3876759895,
+ 361896217, 3738094268, 1482340370, 2466671543, 2382584591, 1163888810, 3284924932, 144124321,
+ 4190215028, 849168593, 3020503679, 2136336858, 1649465698, 2836138695, 798521449, 3838094284,
+ }, {
+ 0, 2792819636, 2543784233, 837294749, 4098827283, 1379413927, 1674589498, 3316072078,
+ 871321191, 2509784531, 2758827854, 34034938, 3349178996, 1641505216, 1346337629, 4131942633,
+ 1742642382, 3249117050, 4030828007, 1446413907, 2475800797, 904311657, 68069876, 2725880384,
+ 1412551337, 4064729373, 3283010432, 1708771380, 2692675258, 101317902, 937551763, 2442587175,
+ 3485284764, 1774858792, 1478633653, 4266992385, 1005723023, 2642744891, 2892827814, 169477906,
+ 4233263099, 1512406095, 1808623314, 3451546982, 136139752, 2926205020, 2676114113, 972376437,
+ 2825102674, 236236518, 1073525883, 2576072655, 1546420545, 4200303349, 3417542760, 1841601500,
+ 2609703733, 1039917185, 202635804, 2858742184, 1875103526, 3384067218, 4166835727, 1579931067,
+ 1141601657, 3799809741, 3549717584, 1977839588, 2957267306, 372464350, 668680259, 2175552503,
+ 2011446046, 3516084394, 3766168119, 1175200131, 2209029901, 635180217, 338955812, 2990736784,
+ 601221559, 2242044419, 3024812190, 306049834, 3617246628, 1911408144, 1074125965, 3866285881,
+ 272279504, 3058543716, 2275784441, 567459149, 3832906691, 1107462263, 1944752874, 3583875422,
+ 2343980261, 767641425, 472473036, 3126744696, 2147051766, 3649987394, 3899029983, 1309766251,
+ 3092841090, 506333494, 801510315, 2310084639, 1276520081, 3932237093, 3683203000, 2113813516,
+ 3966292011, 1243601823, 2079834370, 3716205238, 405271608, 3192979340, 2411259153, 701492901,
+ 3750207052, 2045810168, 1209569125, 4000285905, 734575199, 2378150379, 3159862134, 438345922,
+ 2283203314, 778166598, 529136603, 3120492655, 2086260449, 3660498261, 3955679176, 1303499900,
+ 3153699989, 495890209, 744928700, 2316418568, 1337360518, 3921775410, 3626602927, 2120129051,
+ 4022892092, 1237286280, 2018993941, 3726666913, 461853231, 3186645403, 2350400262, 711936178,
+ 3693557851, 2052076527, 1270360434, 3989775046, 677911624, 2384402428, 3220639073, 427820757,
+ 1202443118, 3789347034, 3493118535, 1984154099, 3018127229, 362020041, 612099668, 2181885408,
+ 1950653705, 3526596285, 3822816288, 1168934804, 2148251930, 645706414, 395618355, 2984485767,
+ 544559008, 2248295444, 3085590153, 295523645, 3560598451, 1917673479, 1134918298, 3855773998,
+ 328860103, 3052210803, 2214924526, 577903450, 3889505748, 1101147744, 1883911421, 3594338121,
+ 3424493451, 1785369663, 1535282850, 4260726038, 944946072, 2653270060, 2949491377, 163225861,
+ 4294103532, 1501944408, 1752023237, 3457862513, 196998655, 2915761739, 2619532502, 978710370,
+ 2881684293, 229902577, 1012666988, 2586515928, 1603020630, 4193987810, 3356702335, 1852063179,
+ 2553040162, 1046169238, 263412747, 2848217023, 1818454321, 3390333573, 4227627032, 1569420204,
+ 60859927, 2782375331, 2487203646, 843627658, 4159668740, 1368951216, 1617990445, 3322386585,
+ 810543216, 2520310724, 2815490393, 27783917, 3288386659, 1652017111, 1402985802, 4125677310,
+ 1685994201, 3255382381, 4091620336, 1435902020, 2419138250, 910562686, 128847843, 2715354199,
+ 1469150398, 4058414858, 3222168983, 1719234083, 2749255853, 94984985, 876691844, 2453031472,
+ }, {
+ 0, 3433693342, 1109723005, 2391738339, 2219446010, 1222643300, 3329165703, 180685081,
+ 3555007413, 525277995, 2445286600, 1567235158, 1471092047, 2600801745, 361370162, 3642757804,
+ 2092642603, 2953916853, 1050555990, 4063508168, 4176560081, 878395215, 3134470316, 1987983410,
+ 2942184094, 1676945920, 3984272867, 567356797, 722740324, 3887998202, 1764827929, 2778407815,
+ 4185285206, 903635656, 3142804779, 2012833205, 2101111980, 2979425330, 1058630609, 4088621903,
+ 714308067, 3862526333, 1756790430, 2753330688, 2933487385, 1651734407, 3975966820, 542535930,
+ 2244825981, 1231508451, 3353891840, 188896414, 25648519, 3442302233, 1134713594, 2399689316,
+ 1445480648, 2592229462, 336416693, 3634843435, 3529655858, 516441772, 2420588879, 1559052753,
+ 698204909, 3845636723, 1807271312, 2803025166, 2916600855, 1635634313, 4025666410, 593021940,
+ 4202223960, 919787974, 3093159461, 1962401467, 2117261218, 2996361020, 1008193759, 4038971457,
+ 1428616134, 2576151384, 386135227, 3685348389, 3513580860, 499580322, 2471098945, 1608776415,
+ 2260985971, 1248454893, 3303468814, 139259792, 42591881, 3458459159, 1085071860, 2349261162,
+ 3505103035, 474062885, 2463016902, 1583654744, 1419882049, 2550902495, 377792828, 3660491170,
+ 51297038, 3483679632, 1093385331, 2374089965, 2269427188, 1273935210, 3311514249, 164344343,
+ 2890961296, 1627033870, 4000683757, 585078387, 672833386, 3836780532, 1782552599, 2794821769,
+ 2142603813, 3005188795, 1032883544, 4047146438, 4227826911, 928351297, 3118105506, 1970307900,
+ 1396409818, 2677114180, 287212199, 3719594553, 3614542624, 467372990, 2505346141, 1509854403,
+ 2162073199, 1282711281, 3271268626, 240228748, 76845205, 3359543307, 1186043880, 2317064054,
+ 796964081, 3811226735, 1839575948, 2702160658, 2882189835, 1734392469, 3924802934, 625327592,
+ 4234522436, 818917338, 3191908409, 1927981223, 2016387518, 3028656416, 973776579, 4137723485,
+ 2857232268, 1726474002, 3899187441, 616751215, 772270454, 3803048424, 1814228491, 2693328533,
+ 2041117753, 3036871847, 999160644, 4146592730, 4259508931, 826864221, 3217552830, 1936586016,
+ 3606501031, 442291769, 2496909786, 1484378436, 1388107869, 2652297411, 278519584, 3694387134,
+ 85183762, 3384397196, 1194773103, 2342308593, 2170143720, 1307820918, 3279733909, 265733131,
+ 2057717559, 3054258089, 948125770, 4096344276, 4276898253, 843467091, 3167309488, 1885556270,
+ 2839764098, 1709792284, 3949353983, 667704161, 755585656, 3785577190, 1865176325, 2743489947,
+ 102594076, 3401021058, 1144549729, 2291298815, 2186770662, 1325234296, 3228729243, 215514885,
+ 3589828009, 424832311, 2547870420, 1534552650, 1370645331, 2635621325, 328688686, 3745342640,
+ 2211456353, 1333405183, 3254067740, 224338562, 127544219, 3408931589, 1170156774, 2299866232,
+ 1345666772, 2627681866, 303053225, 3736746295, 3565105198, 416624816, 2522494803, 1525692365,
+ 4285207626, 868291796, 3176010551, 1910772649, 2065767088, 3079346734, 956571085, 4121828691,
+ 747507711, 3760459617, 1856702594, 2717976604, 2831417605, 1684930971, 3940615800, 642451174,
+ },
+ {
+ 0, 393942083, 787884166, 965557445, 1575768332, 1251427663, 1931114890, 1684106697,
+ 3151536664, 2896410203, 2502855326, 2186649309, 3862229780, 4048545623, 3368213394, 3753496529,
+ 2898281073, 3149616690, 2184604407, 2504883892, 4046197629, 3864463166, 3755621371, 3366006712,
+ 387506281, 6550570, 971950319, 781573292, 1257550181, 1569695014, 1677892067, 1937345952,
+ 2196865699, 2508887776, 2886183461, 3145514598, 3743273903, 3362179052, 4058774313, 3868258154,
+ 958996667, 777139448, 400492605, 10755198, 1690661303, 1941857780, 1244879153, 1565019506,
+ 775012562, 961205393, 13101140, 398261271, 1943900638, 1688634781, 1563146584, 1246801179,
+ 2515100362, 2190636681, 3139390028, 2892258831, 3355784134, 3749586821, 3874691904, 4052225795,
+ 3734110983, 3387496260, 4033096577, 3877584834, 2206093835, 2483373640, 2911402637, 3136515790,
+ 1699389727, 1915860316, 1270647193, 1556585946, 950464531, 803071056, 374397077, 19647702,
+ 1917993334, 1697207605, 1554278896, 1272937907, 800985210, 952435769, 21510396, 372452543,
+ 3381322606, 3740399405, 3883715560, 4027047851, 2489758306, 2199758369, 3130039012, 2917895847,
+ 1550025124, 1259902439, 1922410786, 1710144865, 26202280, 385139947, 796522542, 939715693,
+ 3887801276, 4039129087, 3377269562, 3728088953, 3126293168, 2905368307, 2493602358, 2212122229,
+ 4037264341, 3889747862, 3730172755, 3375300368, 2907673305, 3124004506, 2209987167, 2495786524,
+ 1266377165, 1543533966, 1703758155, 1928748296, 379007169, 32253058, 945887303, 790236164,
+ 1716846671, 1898845196, 1218652361, 1608006794, 1002000707, 750929152, 357530053, 36990342,
+ 3717046871, 3405166100, 4084959953, 3825245842, 2153902939, 2535122712, 2929187805, 3119304606,
+ 3398779454, 3723384445, 3831720632, 4078468859, 2541294386, 2147616625, 3113171892, 2935238647,
+ 1900929062, 1714877541, 1606142112, 1220599011, 748794154, 1004184937, 39295404, 355241455,
+ 3835986668, 4091516591, 3394415210, 3710500393, 3108557792, 2922629027, 2545875814, 2160455461,
+ 1601970420, 1208431799, 1904871538, 1727077425, 43020792, 367748539, 744905086, 991776061,
+ 1214562461, 1595921630, 1720903707, 1911159896, 361271697, 49513938, 998160663, 738569556,
+ 4089209477, 3838277318, 3712633347, 3392233024, 2924491657, 3106613194, 2158369551, 2547846988,
+ 3100050248, 2948339467, 2519804878, 2169126797, 3844821572, 4065347079, 3420289730, 3701894785,
+ 52404560, 342144275, 770279894, 982687125, 1593045084, 1233708063, 1879431386, 1736363161,
+ 336019769, 58479994, 988899775, 764050940, 1240141877, 1586496630, 1729968307, 1885744368,
+ 2950685473, 3097818978, 2166999975, 2522013668, 4063474221, 3846743662, 3703937707, 3418263272,
+ 976650731, 760059304, 348170605, 62635310, 1742393575, 1889649828, 1227683937, 1582820386,
+ 2179867635, 2526361520, 2937588597, 3093503798, 3691148031, 3413731004, 4076100217, 3851374138,
+ 2532754330, 2173556697, 3087067932, 2944139103, 3407516310, 3697379029, 3857496592, 4070026835,
+ 758014338, 978679233, 64506116, 346250567, 1891774606, 1740186829, 1580472328, 1229917259,
+ }, {
+ 0, 4022496062, 83218493, 3946298115, 166436986, 3861498692, 220098631, 3806075769,
+ 332873972, 4229245898, 388141257, 4175494135, 440197262, 4127099824, 516501683, 4044053389,
+ 665747944, 3362581206, 593187285, 3432594155, 776282514, 3246869164, 716239279, 3312622225,
+ 880394524, 3686509090, 814485793, 3746462239, 1033003366, 3528460888, 963096923, 3601193573,
+ 1331495888, 2694801646, 1269355501, 2758457555, 1186374570, 2843003028, 1111716759, 2910918825,
+ 1552565028, 3007850522, 1484755737, 3082680359, 1432478558, 3131279456, 1368666979, 3193329757,
+ 1760789048, 2268195078, 1812353541, 2210675003, 1628971586, 2396670332, 1710092927, 2318375233,
+ 2066006732, 2498144754, 2144408305, 2417195471, 1926193846, 2634877320, 1983558283, 2583222709,
+ 2662991776, 1903717534, 2588923805, 1972223139, 2538711002, 2022952164, 2477029351, 2087066841,
+ 2372749140, 1655647338, 2308478825, 1717238871, 2223433518, 1799654416, 2155034387, 1873894445,
+ 3105130056, 1456926070, 3185661557, 1378041163, 2969511474, 1597852940, 3020617231, 1539874097,
+ 2864957116, 1157737858, 2922780289, 1106542015, 2737333958, 1290407416, 2816325371, 1210047941,
+ 3521578096, 1042640718, 3574781005, 986759027, 3624707082, 936300340, 3707335735, 859512585,
+ 3257943172, 770846650, 3334837433, 688390023, 3420185854, 605654976, 3475911875, 552361981,
+ 4132013464, 428600998, 4072428965, 494812827, 4288816610, 274747100, 4216845791, 345349857,
+ 3852387692, 173846098, 3781891409, 245988975, 3967116566, 62328360, 3900749099, 121822741,
+ 3859089665, 164061759, 3807435068, 221426178, 4025395579, 2933317, 3944446278, 81334904,
+ 4124199413, 437265099, 4045904328, 518386422, 4231653775, 335250097, 4174133682, 386814604,
+ 3249244393, 778691543, 3311294676, 714879978, 3359647891, 662848429, 3434477742, 595039120,
+ 3531393053, 1035903779, 3599308832, 961245982, 3684132967, 877986649, 3747788890, 815846244,
+ 2841119441, 1184522735, 2913852140, 1114616274, 2696129195, 1332855189, 2756082326, 1266946472,
+ 3129952805, 1431118107, 3195705880, 1371074854, 3009735263, 1554415969, 3079748194, 1481855324,
+ 2398522169, 1630855175, 2315475716, 1707159610, 2266835779, 1759461501, 2213084030, 1814728768,
+ 2636237773, 1927520499, 2580814832, 1981182158, 2496293815, 2064121993, 2420095882, 2147340468,
+ 2025787041, 2541577631, 2085281436, 2475210146, 1901375195, 2660681189, 1973518054, 2590184920,
+ 1801997909, 2225743211, 1872600680, 2153772374, 1652813359, 2369881361, 1719025170, 2310296876,
+ 1594986313, 2966676599, 1541693300, 3022402634, 1459236659, 3107472397, 1376780046, 3184366640,
+ 1288097725, 2734990467, 1211309952, 2817619134, 1160605639, 2867791097, 1104723962, 2920993988,
+ 937561457, 3626001999, 857201996, 3704993394, 1040821515, 3519792693, 989625654, 3577615880,
+ 607473029, 3421972155, 549494200, 3473077894, 769584639, 3256649409, 690699714, 3337180924,
+ 273452185, 4287555495, 347692196, 4219156378, 430386403, 4133832669, 491977950, 4069562336,
+ 60542061, 3965298515, 124656720, 3903616878, 175139863, 3853649705, 243645482, 3779581716,
+ }, {
+ 0, 3247366080, 1483520449, 2581751297, 2967040898, 1901571138, 3904227907, 691737987,
+ 3133399365, 2068659845, 3803142276, 589399876, 169513671, 3415493895, 1383475974, 2482566342,
+ 2935407819, 1870142219, 4137319690, 924099274, 506443593, 3751897225, 1178799752, 2278412616,
+ 339027342, 3585866318, 1280941135, 2379694991, 2766951948, 1700956620, 4236308429, 1024339981,
+ 2258407383, 1192382487, 3740284438, 528411094, 910556245, 4157285269, 1848198548, 2946996820,
+ 1012887186, 4258378066, 1681119059, 2780629139, 2357599504, 1292419792, 3572147409, 358906641,
+ 678054684, 3924071644, 1879503581, 2978491677, 2561882270, 1497229150, 3235873119, 22109855,
+ 2460592729, 1395094937, 3401913240, 189516888, 577821147, 3825075739, 2048679962, 3146956762,
+ 3595049455, 398902831, 2384764974, 1336573934, 1720805997, 2803873197, 1056822188, 4285729900,
+ 1821112490, 2902796138, 887570795, 4117339819, 3696397096, 500978920, 2218668777, 1169222953,
+ 2025774372, 3106931428, 550659301, 3780950821, 3362238118, 166293862, 2416645991, 1367722151,
+ 3262987361, 66315169, 2584839584, 1537170016, 1923370979, 3005911075, 717813282, 3947244002,
+ 1356109368, 2438613496, 146288633, 3375820857, 3759007162, 562248314, 3093388411, 2045739963,
+ 3927406461, 731490493, 2994458300, 1945440636, 1523451135, 2604718911, 44219710, 3274466046,
+ 4263662323, 1068272947, 2790189874, 1740649714, 1325080945, 2406874801, 379033776, 3608758128,
+ 1155642294, 2238671990, 479005303, 3708016055, 4097359924, 901128180, 2891217397, 1843045941,
+ 2011248031, 3060787807, 797805662, 3993195422, 3342353949, 112630237, 2673147868, 1591353372,
+ 3441611994, 212601626, 2504944923, 1421914843, 2113644376, 3161815192, 630660761, 3826893145,
+ 3642224980, 412692116, 2172340373, 1089836885, 1775141590, 2822790422, 832715543, 4029474007,
+ 1674842129, 2723860433, 1001957840, 4197873168, 3540870035, 310623315, 2338445906, 1257178514,
+ 4051548744, 821257608, 2836464521, 1755307081, 1101318602, 2150241802, 432566283, 3628511179,
+ 1270766349, 2318435533, 332587724, 3529260300, 4217841807, 988411727, 2735444302, 1652903566,
+ 1602977411, 2651169091, 132630338, 3328776322, 4015131905, 786223809, 3074340032, 1991273216,
+ 3846741958, 616972294, 3173262855, 2091579847, 1435626564, 2485072772, 234706309, 3430124101,
+ 2712218736, 1613231024, 4190475697, 944458353, 292577266, 3506339890, 1226630707, 2291284467,
+ 459984181, 3672380149, 1124496628, 2189994804, 2880683703, 1782407543, 4091479926, 844224694,
+ 257943739, 3469817723, 1462980986, 2529005242, 3213269817, 2114471161, 3890881272, 644152632,
+ 3046902270, 1947391550, 3991973951, 746483711, 88439420, 3301680572, 1563018173, 2628197501,
+ 657826727, 3871046759, 2136545894, 3201811878, 2548879397, 1449267173, 3481299428, 235845156,
+ 2650161890, 1551408418, 3315268387, 68429027, 758067552, 3970035360, 1967360161, 3033356129,
+ 2311284588, 1213053100, 3517963949, 270598509, 958010606, 4170500910, 1635167535, 2700636911,
+ 855672361, 4069415401, 1802256360, 2866995240, 2212099499, 1113008747, 3686091882, 440112042,
+ }, {
+ 0, 2611301487, 3963330207, 2006897392, 50740095, 2560849680, 4013794784, 1956178319,
+ 101480190, 2645113489, 3929532513, 1905435662, 84561281, 2662269422, 3912356638, 1922342769,
+ 202960380, 2545787283, 3760419683, 2072395532, 253679235, 2495322860, 3810871324, 2021655667,
+ 169122562, 2444351341, 3861841309, 2106214898, 152215677, 2461527058, 3844685538, 2123133581,
+ 405920760, 2207553431, 4094313831, 1873742088, 456646791, 2157096168, 4144791064, 1823027831,
+ 507358470, 2241388905, 4060492697, 1772322806, 490444409, 2258557462, 4043311334, 1789215881,
+ 338245124, 2408348267, 4161972379, 1672996084, 388959611, 2357870868, 4212429796, 1622269835,
+ 304431354, 2306870421, 4263435877, 1706791434, 287538053, 2324051946, 4246267162, 1723705717,
+ 811841520, 2881944479, 3696765295, 1207788800, 862293135, 2831204576, 3747484176, 1157324415,
+ 913293582, 2915732833, 3662962577, 1106318334, 896137841, 2932651550, 3646055662, 1123494017,
+ 1014716940, 2816349795, 3493905555, 1273334012, 1065181555, 2765630748, 3544645612, 1222882179,
+ 980888818, 2714919069, 3595350637, 1307180546, 963712909, 2731826146, 3578431762, 1324336509,
+ 676490248, 3019317351, 3295277719, 1607253752, 726947703, 2968591128, 3345992168, 1556776327,
+ 777919222, 3053147801, 3261432937, 1505806342, 760750473, 3070062054, 3244539670, 1522987897,
+ 608862708, 3220163995, 3362856811, 1406423812, 659339915, 3169449700, 3413582868, 1355966587,
+ 575076106, 3118709605, 3464325525, 1440228858, 557894773, 3135602714, 3447411434, 1457397381,
+ 1623683040, 4217512847, 2365387135, 391757072, 1673614495, 4167309552, 2415577600, 341804655,
+ 1724586270, 4251866481, 2331019137, 290835438, 1707942497, 4268256782, 2314648830, 307490961,
+ 1826587164, 4152020595, 2162433155, 457265388, 1876539747, 4101829900, 2212636668, 407333779,
+ 1792275682, 4051089549, 2263378557, 491595282, 1775619997, 4067460082, 2246988034, 508239213,
+ 2029433880, 3813931127, 2496473735, 258500328, 2079362919, 3763716872, 2546668024, 208559511,
+ 2130363110, 3848244873, 2462145657, 157552662, 2113730969, 3864638966, 2445764358, 174205801,
+ 1961777636, 4014675339, 2564147067, 57707284, 2011718299, 3964481268, 2614361092, 7778411,
+ 1927425818, 3913769845, 2665066885, 92077546, 1910772837, 3930150922, 2648673018, 108709525,
+ 1352980496, 3405878399, 3164554895, 658115296, 1403183983, 3355946752, 3214507504, 607924639,
+ 1453895406, 3440239233, 3130208369, 557218846, 1437504913, 3456883198, 3113552654, 573589345,
+ 1555838444, 3340335491, 2961681267, 723707676, 1606028947, 3290383100, 3011612684, 673504355,
+ 1521500946, 3239382909, 3062619533, 758026722, 1505130605, 3256038402, 3045975794, 774417053,
+ 1217725416, 3543158663, 2762906999, 1057739032, 1267939479, 3493229816, 2812847624, 1007544935,
+ 1318679830, 3577493881, 2728586121, 956803046, 1302285929, 3594125830, 2711933174, 973184153,
+ 1150152212, 3743982203, 2830528651, 856898788, 1200346475, 3694041348, 2880457716, 806684571,
+ 1115789546, 3643069573, 2931426933, 891243034, 1099408277, 3659722746, 2914794762, 907637093,
+ }, {
+ 0, 3717650821, 1616688459, 3184159950, 3233376918, 489665299, 2699419613, 2104690264,
+ 1510200173, 2274691816, 979330598, 3888758691, 2595928571, 1194090622, 4209380528, 661706037,
+ 3020400346, 1771143007, 3562738577, 164481556, 1958661196, 2837976521, 350386439, 3379863682,
+ 3993269687, 865250354, 2388181244, 1406015865, 784146209, 4079732388, 1323412074, 2474079215,
+ 3011398645, 1860735600, 3542286014, 246687547, 1942430051, 2924607718, 328963112, 3456978349,
+ 3917322392, 887832861, 2300653011, 1421341782, 700772878, 4099025803, 1234716485, 2483986112,
+ 125431087, 3673109674, 1730500708, 3132326369, 3351283641, 441867836, 2812031730, 2047535991,
+ 1568292418, 2163009479, 1025936137, 3769651852, 2646824148, 1079348561, 4255113631, 537475098,
+ 3180171691, 1612400686, 3721471200, 4717925, 2100624189, 2694980280, 493375094, 3237910515,
+ 3884860102, 974691139, 2278750093, 1514417672, 657926224, 4204917205, 1198234907, 2600289438,
+ 160053105, 3558665972, 1775665722, 3024116671, 3375586791, 346391650, 2842683564, 1962488105,
+ 1401545756, 2384412057, 869618007, 3997403346, 2469432970, 1319524111, 4083956673, 788193860,
+ 250862174, 3546612699, 1856990997, 3006903952, 3461001416, 333211981, 2920678787, 1937824774,
+ 1425017139, 2305216694, 883735672, 3912918525, 2487837605, 1239398944, 4095071982, 696455019,
+ 3136584836, 1734518017, 3668494799, 121507914, 2051872274, 2816200599, 437363545, 3347544796,
+ 3774328809, 1029797484, 2158697122, 1564328743, 542033279, 4258798842, 1074950196, 2642717105,
+ 2691310871, 2113731730, 3224801372, 497043929, 1624461185, 3175454212, 9435850, 3709412175,
+ 4201248378, 671035391, 2587181873, 1201904308, 986750188, 3880142185, 1519135143, 2266689570,
+ 342721485, 3388693064, 1949382278, 2846355203, 3570723163, 155332830, 3028835344, 1763607957,
+ 1315852448, 2482538789, 775087595, 4087626862, 2396469814, 1396827059, 4002123645, 857560824,
+ 320106210, 3464673127, 1934154665, 2933785132, 3551331444, 238804465, 3018961215, 1852270778,
+ 1226292623, 2491507722, 692783300, 4108177729, 2309936921, 1412959900, 3924976210, 879016919,
+ 2803091512, 2055541181, 3343875443, 450471158, 1739236014, 3124525867, 133568485, 3663777376,
+ 4245691221, 545702608, 2639048222, 1088059291, 1034514883, 3762268230, 1576387720, 2153979149,
+ 501724348, 3228659001, 2109407735, 2687359090, 3713981994, 13109167, 3171052385, 1620357860,
+ 1206151121, 2591211092, 666423962, 4197321503, 2271022407, 1523307714, 3875649548, 982999433,
+ 2850034278, 1953942499, 3384583981, 338329256, 1767471344, 3033506165, 151375291, 3566408766,
+ 4091789579, 779425934, 2478797888, 1311354309, 861580189, 4006375960, 1392910038, 2391852883,
+ 2929327945, 1930372812, 3469036034, 324244359, 1847629279, 3015068762, 243015828, 3555391761,
+ 4103744548, 688715169, 2496043375, 1229996266, 874727090, 3920994103, 1417671673, 2313759356,
+ 446585235, 3339223062, 2059594968, 2807313757, 3660002053, 129100416, 3128657486, 1743609803,
+ 1084066558, 2634765179, 549535669, 4250396208, 2149900392, 1571961325, 3765982499, 1039043750,
+ }, {
+ 0, 2635063670, 3782132909, 2086741467, 430739227, 2225303149, 4173482934, 1707977408,
+ 861478454, 2924937024, 3526875803, 1329085421, 720736557, 3086643291, 3415954816, 1452586230,
+ 1722956908, 4223524122, 2279405761, 450042295, 2132718455, 3792785921, 2658170842, 58693292,
+ 1441473114, 3370435372, 3028674295, 696911745, 1279765825, 3511176247, 2905172460, 807831706,
+ 3445913816, 1349228974, 738901109, 2969918723, 3569940419, 1237784245, 900084590, 2829701656,
+ 4265436910, 1664255896, 525574723, 2187084597, 3885099509, 2057177219, 117386584, 2616249390,
+ 2882946228, 920233410, 1253605401, 3619119471, 2994391983, 796207833, 1393823490, 3457937012,
+ 2559531650, 92322804, 2044829231, 3840835417, 2166609305, 472659183, 1615663412, 4249022530,
+ 1102706673, 3702920839, 2698457948, 1037619754, 1477802218, 3306854812, 3111894087, 611605809,
+ 1927342535, 4025419953, 2475568490, 243387420, 1800169180, 4131620778, 2317525617, 388842247,
+ 655084445, 3120835307, 3328511792, 1533734470, 1051149446, 2745738736, 3754524715, 1120297309,
+ 340972971, 2304586973, 4114354438, 1748234352, 234773168, 2431761350, 3968900637, 1906278251,
+ 2363330345, 299003487, 1840466820, 4038896370, 2507210802, 142532932, 1948239007, 3910149609,
+ 3213136159, 579563625, 1592415666, 3286611140, 2787646980, 992477042, 1195825833, 3662232543,
+ 3933188933, 2002801203, 184645608, 2517538462, 4089658462, 1858919720, 313391347, 2409765253,
+ 3644239219, 1144605701, 945318366, 2773977256, 3231326824, 1570095902, 569697989, 3170568115,
+ 2205413346, 511446676, 1646078799, 4279421497, 2598330617, 131105167, 2075239508, 3871229218,
+ 2955604436, 757403810, 1363424633, 3427521551, 2844163791, 881434553, 1223211618, 3588709140,
+ 3854685070, 2026779384, 78583587, 2577462869, 4235025557, 1633861091, 486774840, 2148301134,
+ 3600338360, 1268198606, 938871061, 2868504675, 3476308643, 1379640277, 777684494, 3008718712,
+ 1310168890, 3541595724, 2943964055, 846639841, 1471879201, 3400857943, 3067468940, 735723002,
+ 2102298892, 3762382970, 2619362721, 19901655, 1692534295, 4193118049, 2240594618, 411247564,
+ 681945942, 3047836192, 3385552891, 1422167693, 822682701, 2886124859, 3496468704, 1298661782,
+ 469546336, 2264093718, 4203901389, 1738379451, 38812283, 2673859341, 3812556502, 2117148576,
+ 3268024339, 1606809957, 598006974, 3198893512, 3680933640, 1181316734, 973624229, 2802299603,
+ 4052944421, 1822222163, 285065864, 2381456382, 3896478014, 1966106696, 156323219, 2489232613,
+ 2759337087, 964150537, 1159127250, 3625517476, 3184831332, 551242258, 1555722185, 3249901247,
+ 2535537225, 170842943, 1984954084, 3946848146, 2391651666, 327308324, 1877176831, 4075589769,
+ 263086283, 2460058045, 4005602406, 1942963472, 369291216, 2332888742, 4151061373, 1784924683,
+ 1022852861, 2717425547, 3717839440, 1083595558, 626782694, 3092517008, 3291821387, 1497027645,
+ 1763466407, 4094934481, 2289211402, 360544636, 1890636732, 3988730570, 2447251217, 215086695,
+ 1514488465, 3343557607, 3140191804, 639919946, 1139395978, 3739626748, 2726758695, 1065936977,
+ }, {
+ 0, 3120290792, 2827399569, 293431929, 2323408227, 864534155, 586863858, 2600537882,
+ 3481914503, 1987188591, 1729068310, 3740575486, 1173727716, 4228805132, 3983743093, 1418249117,
+ 1147313999, 4254680231, 3974377182, 1428157750, 3458136620, 2011505092, 1721256893, 3747844181,
+ 2347455432, 839944224, 594403929, 2593536433, 26687147, 3094146371, 2836498234, 283794642,
+ 2294627998, 826205558, 541298447, 2578994407, 45702141, 3141697557, 2856315500, 331624836,
+ 1196225049, 4273416689, 4023010184, 1446090848, 3442513786, 1959480466, 1706436331, 3696098563,
+ 3433538001, 1968994873, 1679888448, 3722103720, 1188807858, 4280295258, 3999102243, 1470541515,
+ 53374294, 3134568126, 2879970503, 307431215, 2303854645, 816436189, 567589284, 2553242188,
+ 3405478781, 1929420949, 1652411116, 3682996484, 1082596894, 4185703926, 3892424591, 1375368295,
+ 91404282, 3163122706, 2918450795, 336584067, 2400113305, 922028401, 663249672, 2658384096,
+ 2392450098, 929185754, 639587747, 2682555979, 82149713, 3172883129, 2892181696, 362343208,
+ 1091578037, 4176212829, 3918960932, 1349337804, 3412872662, 1922537022, 1676344391, 3658557359,
+ 1111377379, 4224032267, 3937989746, 1396912026, 3359776896, 1908013928, 1623494929, 3644803833,
+ 2377615716, 877417100, 623982837, 2630542109, 130804743, 3190831087, 2941083030, 381060734,
+ 106748588, 3215393092, 2933549885, 388083925, 2350956495, 903570471, 614862430, 2640172470,
+ 3386185259, 1882115523, 1632872378, 3634920530, 1135178568, 4199721120, 3945775833, 1389631793,
+ 1317531835, 4152109907, 3858841898, 1610259138, 3304822232, 2097172016, 1820140617, 3582394273,
+ 2165193788, 955639764, 696815021, 2423477829, 192043359, 2995356343, 2750736590, 437203750,
+ 182808564, 3005133852, 2724453989, 462947725, 2157513367, 962777471, 673168134, 2447663342,
+ 3312231283, 2090301595, 1844056802, 3557935370, 1326499344, 4142603768, 3885397889, 1584245865,
+ 3326266917, 2142836173, 1858371508, 3611272284, 1279175494, 4123357358, 3837270743, 1564721471,
+ 164299426, 2955991370, 2706223923, 414607579, 2209834945, 978107433, 724686416, 2462715320,
+ 2183156074, 1004243586, 715579643, 2472360723, 140260361, 2980573153, 2698675608, 421617264,
+ 1302961645, 4099032581, 3845074044, 1557460884, 3352688782, 2116952934, 1867729183, 3601371895,
+ 2222754758, 1032278062, 754596439, 2499928511, 234942117, 3086693709, 2793824052, 528319708,
+ 1274365761, 4061043881, 3816027856, 1518873912, 3246989858, 2020800970, 1762628531, 3505670235,
+ 3223196809, 2045103969, 1754834200, 3512958704, 1247965674, 4086934018, 3806642299, 1528765331,
+ 261609486, 3060532198, 2802936223, 518697591, 2246819181, 1007707781, 762121468, 2492913428,
+ 213497176, 3041029808, 2755593417, 499441441, 2261110843, 1061030867, 776167850, 2545465922,
+ 3274734047, 2060165687, 1807140942, 3528266662, 1229724860, 4038575956, 3788156205, 1479636677,
+ 1222322711, 4045468159, 3764231046, 1504067694, 3265744756, 2069664924, 1780612837, 3554288909,
+ 2270357136, 1051278712, 802445057, 2519698665, 221152243, 3033880603, 2779263586, 475261322,
+ }, {
+ 0, 2926088593, 2275419491, 701019378, 3560000647, 2052709654, 1402038756, 4261017717,
+ 1930665807, 3715829470, 4105419308, 1524313021, 2804077512, 155861593, 545453739, 2397726522,
+ 3861331614, 1213181711, 1636244477, 3488582252, 840331801, 2625561480, 3048626042, 467584747,
+ 2503254481, 995897408, 311723186, 3170637091, 1090907478, 4016929991, 3332753461, 1758288292,
+ 390036349, 3109546732, 2426363422, 1056427919, 3272488954, 1835443819, 1152258713, 3938878216,
+ 1680663602, 3393484195, 3817652561, 1306808512, 2954733749, 510998820, 935169494, 2580880455,
+ 4044899811, 1601229938, 1991794816, 3637571857, 623446372, 2336332021, 2726898695, 216120726,
+ 2181814956, 744704829, 95158223, 2881711710, 1446680107, 4166125498, 3516576584, 2146575065,
+ 780072698, 2148951915, 2849952665, 129384968, 4199529085, 1411853292, 2112855838, 3548843663,
+ 1567451573, 4077254692, 3670887638, 1957027143, 2304517426, 657765539, 251396177, 2694091200,
+ 3361327204, 1714510325, 1341779207, 3784408214, 476611811, 2986349938, 2613617024, 899690513,
+ 3142211371, 354600634, 1021997640, 2458051545, 1870338988, 3239283261, 3906682575, 1186180958,
+ 960597383, 2536053782, 3202459876, 277428597, 3983589632, 1125666961, 1792074851, 3300423154,
+ 1246892744, 3829039961, 3455203243, 1671079482, 2657312335, 806080478, 432241452, 3081497277,
+ 3748049689, 1896751752, 1489409658, 4138600427, 190316446, 2772397583, 2365053693, 580864876,
+ 2893360214, 35503559, 735381813, 2243795108, 2017747153, 3593269568, 4293150130, 1368183843,
+ 1560145396, 4069882981, 3680356503, 1966430470, 2295112051, 648294626, 258769936, 2701399425,
+ 804156091, 2173100842, 2823706584, 103204425, 4225711676, 1438101421, 2088704863, 3524758222,
+ 3134903146, 347226875, 1031468553, 2467456920, 1860935661, 3229814396, 3914054286, 1193487135,
+ 3385412645, 1738661300, 1315531078, 3758225623, 502792354, 3012596019, 2589468097, 875607120,
+ 1271043721, 3853125400, 3429020650, 1644831355, 2683558414, 832261023, 408158061, 3057348348,
+ 953223622, 2528745559, 3211865253, 286899508, 3974120769, 1116263632, 1799381026, 3307794867,
+ 2917509143, 59586950, 709201268, 2217549029, 2043995280, 3619452161, 4269064691, 1344032866,
+ 3740677976, 1889445577, 1498812987, 4148069290, 180845535, 2762992206, 2372361916, 588238637,
+ 1921194766, 3706423967, 4112727661, 1531686908, 2796705673, 148555288, 554857194, 2407195515,
+ 26248257, 2952271312, 2251333922, 676868275, 3584149702, 2076793175, 1375858085, 4234771508,
+ 2493785488, 986493953, 319029491, 3178008930, 1083533591, 4009621638, 3342158964, 1767759333,
+ 3887577823, 1239362382, 1612160956, 3464433197, 864482904, 2649647049, 3022443323, 441336490,
+ 1706844275, 3419730402, 3793503504, 1282724993, 2978819316, 535149925, 908921239, 2554697734,
+ 380632892, 3100077741, 2433735263, 1063734222, 3265180603, 1828069930, 1161729752, 3948283721,
+ 2207997677, 770953084, 71007118, 2857626143, 1470763626, 4190274555, 3490330377, 2120394392,
+ 4035494306, 1591758899, 1999168705, 3644880208, 616140069, 2328960180, 2736367686, 225524183,
+ },
+};
+
+static const uint8_t
+WUFFS_CRC32__IEEE_X86_SSE42_K1K2[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+ 212, 43, 68, 84, 1, 0, 0, 0,
+ 150, 21, 228, 198, 1, 0, 0, 0,
+};
+
+static const uint8_t
+WUFFS_CRC32__IEEE_X86_SSE42_K3K4[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+ 208, 151, 25, 117, 1, 0, 0, 0,
+ 158, 0, 170, 204, 0, 0, 0, 0,
+};
+
+static const uint8_t
+WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+ 36, 97, 205, 99, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const uint8_t
+WUFFS_CRC32__IEEE_X86_SSE42_PXMU[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+ 65, 6, 113, 219, 1, 0, 0, 0,
+ 65, 22, 1, 247, 1, 0, 0, 0,
+};
+
+// ---------------- Private Initializer Prototypes
+
+// ---------------- Private Function Prototypes
+
+static wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__up(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x);
+
+static wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__up__choosy_default(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x);
+
+#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+static wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__up_arm_crc32(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x);
+#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+static wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__up_x86_avx2(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x);
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+static wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__up_x86_sse42(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x);
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+
+// ---------------- VTables
+
+const wuffs_base__hasher_u32__func_ptrs
+wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
+ (wuffs_base__empty_struct(*)(void*,
+ uint32_t,
+ bool))(&wuffs_crc32__ieee_hasher__set_quirk_enabled),
+ (uint32_t(*)(void*,
+ wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32),
+};
+
+// ---------------- Initializer Implementations
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_crc32__ieee_hasher__initialize(
+ wuffs_crc32__ieee_hasher* self,
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options){
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (sizeof(*self) != sizeof_star_self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
+ }
+ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
+ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
+ }
+
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ // The whole point of this if-check is to detect an uninitialized *self.
+ // We disable the warning on GCC. Clang-5.0 does not have this warning.
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#endif
+ if (self->private_impl.magic != 0) {
+ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
+ }
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ } else {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ memset(self, 0, sizeof(*self));
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ } else {
+ memset(&(self->private_impl), 0, sizeof(self->private_impl));
+ }
+ }
+
+ self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default;
+
+ self->private_impl.magic = WUFFS_BASE__MAGIC;
+ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
+ wuffs_base__hasher_u32__vtable_name;
+ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
+ (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32);
+ return wuffs_base__make_status(NULL);
+}
+
+wuffs_crc32__ieee_hasher*
+wuffs_crc32__ieee_hasher__alloc() {
+ wuffs_crc32__ieee_hasher* x =
+ (wuffs_crc32__ieee_hasher*)(calloc(sizeof(wuffs_crc32__ieee_hasher), 1));
+ if (!x) {
+ return NULL;
+ }
+ if (wuffs_crc32__ieee_hasher__initialize(
+ x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
+ free(x);
+ return NULL;
+ }
+ return x;
+}
+
+size_t
+sizeof__wuffs_crc32__ieee_hasher() {
+ return sizeof(wuffs_crc32__ieee_hasher);
+}
+
+// ---------------- Function Implementations
+
+// -------- func crc32.ieee_hasher.set_quirk_enabled
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__set_quirk_enabled(
+ wuffs_crc32__ieee_hasher* self,
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_base__make_empty_struct();
+}
+
+// -------- func crc32.ieee_hasher.update_u32
+
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_crc32__ieee_hasher__update_u32(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ if (!self) {
+ return 0;
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return 0;
+ }
+
+ if (self->private_impl.f_state == 0) {
+ self->private_impl.choosy_up = (
+#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+ wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 :
+#endif
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_crc32__ieee_hasher__up_x86_avx2 :
+#endif
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 :
+#endif
+ self->private_impl.choosy_up);
+ }
+ wuffs_crc32__ieee_hasher__up(self, a_x);
+ return self->private_impl.f_state;
+}
+
+// -------- func crc32.ieee_hasher.up
+
+static wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__up(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ return (*self->private_impl.choosy_up)(self, a_x);
+}
+
+static wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__up__choosy_default(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ uint32_t v_s = 0;
+ wuffs_base__slice_u8 v_p = {0};
+
+ v_s = (4294967295 ^ self->private_impl.f_state);
+ {
+ wuffs_base__slice_u8 i_slice_p = a_x;
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 16;
+ uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32);
+ while (v_p.ptr < i_end0_p) {
+ v_s ^= ((((uint32_t)(v_p.ptr[0])) << 0) |
+ (((uint32_t)(v_p.ptr[1])) << 8) |
+ (((uint32_t)(v_p.ptr[2])) << 16) |
+ (((uint32_t)(v_p.ptr[3])) << 24));
+ v_s = (WUFFS_CRC32__IEEE_TABLE[0][v_p.ptr[15]] ^
+ WUFFS_CRC32__IEEE_TABLE[1][v_p.ptr[14]] ^
+ WUFFS_CRC32__IEEE_TABLE[2][v_p.ptr[13]] ^
+ WUFFS_CRC32__IEEE_TABLE[3][v_p.ptr[12]] ^
+ WUFFS_CRC32__IEEE_TABLE[4][v_p.ptr[11]] ^
+ WUFFS_CRC32__IEEE_TABLE[5][v_p.ptr[10]] ^
+ WUFFS_CRC32__IEEE_TABLE[6][v_p.ptr[9]] ^
+ WUFFS_CRC32__IEEE_TABLE[7][v_p.ptr[8]] ^
+ WUFFS_CRC32__IEEE_TABLE[8][v_p.ptr[7]] ^
+ WUFFS_CRC32__IEEE_TABLE[9][v_p.ptr[6]] ^
+ WUFFS_CRC32__IEEE_TABLE[10][v_p.ptr[5]] ^
+ WUFFS_CRC32__IEEE_TABLE[11][v_p.ptr[4]] ^
+ WUFFS_CRC32__IEEE_TABLE[12][(255 & (v_s >> 24))] ^
+ WUFFS_CRC32__IEEE_TABLE[13][(255 & (v_s >> 16))] ^
+ WUFFS_CRC32__IEEE_TABLE[14][(255 & (v_s >> 8))] ^
+ WUFFS_CRC32__IEEE_TABLE[15][(255 & (v_s >> 0))]);
+ v_p.ptr += 16;
+ v_s ^= ((((uint32_t)(v_p.ptr[0])) << 0) |
+ (((uint32_t)(v_p.ptr[1])) << 8) |
+ (((uint32_t)(v_p.ptr[2])) << 16) |
+ (((uint32_t)(v_p.ptr[3])) << 24));
+ v_s = (WUFFS_CRC32__IEEE_TABLE[0][v_p.ptr[15]] ^
+ WUFFS_CRC32__IEEE_TABLE[1][v_p.ptr[14]] ^
+ WUFFS_CRC32__IEEE_TABLE[2][v_p.ptr[13]] ^
+ WUFFS_CRC32__IEEE_TABLE[3][v_p.ptr[12]] ^
+ WUFFS_CRC32__IEEE_TABLE[4][v_p.ptr[11]] ^
+ WUFFS_CRC32__IEEE_TABLE[5][v_p.ptr[10]] ^
+ WUFFS_CRC32__IEEE_TABLE[6][v_p.ptr[9]] ^
+ WUFFS_CRC32__IEEE_TABLE[7][v_p.ptr[8]] ^
+ WUFFS_CRC32__IEEE_TABLE[8][v_p.ptr[7]] ^
+ WUFFS_CRC32__IEEE_TABLE[9][v_p.ptr[6]] ^
+ WUFFS_CRC32__IEEE_TABLE[10][v_p.ptr[5]] ^
+ WUFFS_CRC32__IEEE_TABLE[11][v_p.ptr[4]] ^
+ WUFFS_CRC32__IEEE_TABLE[12][(255 & (v_s >> 24))] ^
+ WUFFS_CRC32__IEEE_TABLE[13][(255 & (v_s >> 16))] ^
+ WUFFS_CRC32__IEEE_TABLE[14][(255 & (v_s >> 8))] ^
+ WUFFS_CRC32__IEEE_TABLE[15][(255 & (v_s >> 0))]);
+ v_p.ptr += 16;
+ }
+ v_p.len = 16;
+ uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16);
+ while (v_p.ptr < i_end1_p) {
+ v_s ^= ((((uint32_t)(v_p.ptr[0])) << 0) |
+ (((uint32_t)(v_p.ptr[1])) << 8) |
+ (((uint32_t)(v_p.ptr[2])) << 16) |
+ (((uint32_t)(v_p.ptr[3])) << 24));
+ v_s = (WUFFS_CRC32__IEEE_TABLE[0][v_p.ptr[15]] ^
+ WUFFS_CRC32__IEEE_TABLE[1][v_p.ptr[14]] ^
+ WUFFS_CRC32__IEEE_TABLE[2][v_p.ptr[13]] ^
+ WUFFS_CRC32__IEEE_TABLE[3][v_p.ptr[12]] ^
+ WUFFS_CRC32__IEEE_TABLE[4][v_p.ptr[11]] ^
+ WUFFS_CRC32__IEEE_TABLE[5][v_p.ptr[10]] ^
+ WUFFS_CRC32__IEEE_TABLE[6][v_p.ptr[9]] ^
+ WUFFS_CRC32__IEEE_TABLE[7][v_p.ptr[8]] ^
+ WUFFS_CRC32__IEEE_TABLE[8][v_p.ptr[7]] ^
+ WUFFS_CRC32__IEEE_TABLE[9][v_p.ptr[6]] ^
+ WUFFS_CRC32__IEEE_TABLE[10][v_p.ptr[5]] ^
+ WUFFS_CRC32__IEEE_TABLE[11][v_p.ptr[4]] ^
+ WUFFS_CRC32__IEEE_TABLE[12][(255 & (v_s >> 24))] ^
+ WUFFS_CRC32__IEEE_TABLE[13][(255 & (v_s >> 16))] ^
+ WUFFS_CRC32__IEEE_TABLE[14][(255 & (v_s >> 8))] ^
+ WUFFS_CRC32__IEEE_TABLE[15][(255 & (v_s >> 0))]);
+ v_p.ptr += 16;
+ }
+ v_p.len = 1;
+ uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len;
+ while (v_p.ptr < i_end2_p) {
+ v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ (v_s >> 8));
+ v_p.ptr += 1;
+ }
+ v_p.len = 0;
+ }
+ self->private_impl.f_state = (4294967295 ^ v_s);
+ return wuffs_base__make_empty_struct();
+}
+
+// ‼ WUFFS MULTI-FILE SECTION +arm_crc32
+// -------- func crc32.ieee_hasher.up_arm_crc32
+
+#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+static wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__up_arm_crc32(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ wuffs_base__slice_u8 v_p = {0};
+ uint32_t v_s = 0;
+
+ v_s = (4294967295 ^ self->private_impl.f_state);
+ while ((((uint64_t)(a_x.len)) > 0) && ((15 & ((uint32_t)(0xFFF & (uintptr_t)(a_x.ptr)))) != 0)) {
+ v_s = __crc32b(v_s, a_x.ptr[0]);
+ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1);
+ }
+ {
+ wuffs_base__slice_u8 i_slice_p = a_x;
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 8;
+ uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 128) * 128);
+ while (v_p.ptr < i_end0_p) {
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ }
+ v_p.len = 8;
+ uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8);
+ while (v_p.ptr < i_end1_p) {
+ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
+ v_p.ptr += 8;
+ }
+ v_p.len = 1;
+ uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len;
+ while (v_p.ptr < i_end2_p) {
+ v_s = __crc32b(v_s, v_p.ptr[0]);
+ v_p.ptr += 1;
+ }
+ v_p.len = 0;
+ }
+ self->private_impl.f_state = (4294967295 ^ v_s);
+ return wuffs_base__make_empty_struct();
+}
+#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+// ‼ WUFFS MULTI-FILE SECTION -arm_crc32
+
+// ‼ WUFFS MULTI-FILE SECTION +x86_avx2
+// -------- func crc32.ieee_hasher.up_x86_avx2
+
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
+static wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__up_x86_avx2(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ uint32_t v_s = 0;
+ wuffs_base__slice_u8 v_p = {0};
+ __m128i v_k = {0};
+ __m128i v_x0 = {0};
+ __m128i v_x1 = {0};
+ __m128i v_x2 = {0};
+ __m128i v_x3 = {0};
+ __m128i v_y0 = {0};
+ __m128i v_y1 = {0};
+ __m128i v_y2 = {0};
+ __m128i v_y3 = {0};
+ uint64_t v_tail_index = 0;
+
+ v_s = (4294967295 ^ self->private_impl.f_state);
+ while ((((uint64_t)(a_x.len)) > 0) && ((15 & ((uint32_t)(0xFFF & (uintptr_t)(a_x.ptr)))) != 0)) {
+ v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ a_x.ptr[0])] ^ (v_s >> 8));
+ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1);
+ }
+ if (((uint64_t)(a_x.len)) < 64) {
+ {
+ wuffs_base__slice_u8 i_slice_p = a_x;
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 1;
+ uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+ while (v_p.ptr < i_end0_p) {
+ v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ (v_s >> 8));
+ v_p.ptr += 1;
+ }
+ v_p.len = 0;
+ }
+ self->private_impl.f_state = (4294967295 ^ v_s);
+ return wuffs_base__make_empty_struct();
+ }
+ v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0));
+ v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16));
+ v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32));
+ v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48));
+ v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s)));
+ v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2));
+ {
+ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64);
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 64;
+ uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64);
+ while (v_p.ptr < i_end0_p) {
+ v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0));
+ v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0));
+ v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0));
+ v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0));
+ v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17));
+ v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17));
+ v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17));
+ v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17));
+ v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0)));
+ v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16)));
+ v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32)));
+ v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48)));
+ v_p.ptr += 64;
+ }
+ v_p.len = 0;
+ }
+ v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4));
+ v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0));
+ v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17));
+ v_x0 = _mm_xor_si128(v_x0, v_x1);
+ v_x0 = _mm_xor_si128(v_x0, v_y0);
+ v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0));
+ v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17));
+ v_x0 = _mm_xor_si128(v_x0, v_x2);
+ v_x0 = _mm_xor_si128(v_x0, v_y0);
+ v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0));
+ v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17));
+ v_x0 = _mm_xor_si128(v_x0, v_x3);
+ v_x0 = _mm_xor_si128(v_x0, v_y0);
+ v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16));
+ v_x2 = _mm_set_epi32((int32_t)(0), (int32_t)(4294967295), (int32_t)(0), (int32_t)(4294967295));
+ v_x0 = _mm_srli_si128(v_x0, (int32_t)(8));
+ v_x0 = _mm_xor_si128(v_x0, v_x1);
+ v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ));
+ v_x1 = _mm_srli_si128(v_x0, (int32_t)(4));
+ v_x0 = _mm_and_si128(v_x0, v_x2);
+ v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0));
+ v_x0 = _mm_xor_si128(v_x0, v_x1);
+ v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU));
+ v_x1 = _mm_and_si128(v_x0, v_x2);
+ v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16));
+ v_x1 = _mm_and_si128(v_x1, v_x2);
+ v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0));
+ v_x0 = _mm_xor_si128(v_x0, v_x1);
+ v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1))));
+ v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u);
+ if (v_tail_index < ((uint64_t)(a_x.len))) {
+ {
+ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 1;
+ uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+ while (v_p.ptr < i_end0_p) {
+ v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ (v_s >> 8));
+ v_p.ptr += 1;
+ }
+ v_p.len = 0;
+ }
+ }
+ self->private_impl.f_state = (4294967295 ^ v_s);
+ return wuffs_base__make_empty_struct();
+}
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+// ‼ WUFFS MULTI-FILE SECTION -x86_avx2
+
+// ‼ WUFFS MULTI-FILE SECTION +x86_sse42
+// -------- func crc32.ieee_hasher.up_x86_sse42
+
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
+static wuffs_base__empty_struct
+wuffs_crc32__ieee_hasher__up_x86_sse42(
+ wuffs_crc32__ieee_hasher* self,
+ wuffs_base__slice_u8 a_x) {
+ uint32_t v_s = 0;
+ wuffs_base__slice_u8 v_p = {0};
+ __m128i v_k = {0};
+ __m128i v_x0 = {0};
+ __m128i v_x1 = {0};
+ __m128i v_x2 = {0};
+ __m128i v_x3 = {0};
+ __m128i v_y0 = {0};
+ __m128i v_y1 = {0};
+ __m128i v_y2 = {0};
+ __m128i v_y3 = {0};
+ uint64_t v_tail_index = 0;
+
+ v_s = (4294967295 ^ self->private_impl.f_state);
+ while ((((uint64_t)(a_x.len)) > 0) && ((15 & ((uint32_t)(0xFFF & (uintptr_t)(a_x.ptr)))) != 0)) {
+ v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ a_x.ptr[0])] ^ (v_s >> 8));
+ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1);
+ }
+ if (((uint64_t)(a_x.len)) < 64) {
+ {
+ wuffs_base__slice_u8 i_slice_p = a_x;
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 1;
+ uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+ while (v_p.ptr < i_end0_p) {
+ v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ (v_s >> 8));
+ v_p.ptr += 1;
+ }
+ v_p.len = 0;
+ }
+ self->private_impl.f_state = (4294967295 ^ v_s);
+ return wuffs_base__make_empty_struct();
+ }
+ v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0));
+ v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16));
+ v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32));
+ v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48));
+ v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s)));
+ v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2));
+ {
+ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64);
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 64;
+ uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64);
+ while (v_p.ptr < i_end0_p) {
+ v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0));
+ v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0));
+ v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0));
+ v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0));
+ v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17));
+ v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17));
+ v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17));
+ v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17));
+ v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0)));
+ v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16)));
+ v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32)));
+ v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48)));
+ v_p.ptr += 64;
+ }
+ v_p.len = 0;
+ }
+ v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4));
+ v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0));
+ v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17));
+ v_x0 = _mm_xor_si128(v_x0, v_x1);
+ v_x0 = _mm_xor_si128(v_x0, v_y0);
+ v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0));
+ v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17));
+ v_x0 = _mm_xor_si128(v_x0, v_x2);
+ v_x0 = _mm_xor_si128(v_x0, v_y0);
+ v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0));
+ v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17));
+ v_x0 = _mm_xor_si128(v_x0, v_x3);
+ v_x0 = _mm_xor_si128(v_x0, v_y0);
+ v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16));
+ v_x2 = _mm_set_epi32((int32_t)(0), (int32_t)(4294967295), (int32_t)(0), (int32_t)(4294967295));
+ v_x0 = _mm_srli_si128(v_x0, (int32_t)(8));
+ v_x0 = _mm_xor_si128(v_x0, v_x1);
+ v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ));
+ v_x1 = _mm_srli_si128(v_x0, (int32_t)(4));
+ v_x0 = _mm_and_si128(v_x0, v_x2);
+ v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0));
+ v_x0 = _mm_xor_si128(v_x0, v_x1);
+ v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU));
+ v_x1 = _mm_and_si128(v_x0, v_x2);
+ v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16));
+ v_x1 = _mm_and_si128(v_x1, v_x2);
+ v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0));
+ v_x0 = _mm_xor_si128(v_x0, v_x1);
+ v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1))));
+ v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u);
+ if (v_tail_index < ((uint64_t)(a_x.len))) {
+ {
+ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
+ v_p.ptr = i_slice_p.ptr;
+ v_p.len = 1;
+ uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len;
+ while (v_p.ptr < i_end0_p) {
+ v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ (v_s >> 8));
+ v_p.ptr += 1;
+ }
+ v_p.len = 0;
+ }
+ }
+ self->private_impl.f_state = (4294967295 ^ v_s);
+ return wuffs_base__make_empty_struct();
+}
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+// ‼ WUFFS MULTI-FILE SECTION -x86_sse42
+
+#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE)
+
+// ---------------- Status Codes Implementations
+
+const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)";
+const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)";
+const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count";
+const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition";
+const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code";
+const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length";
+const char wuffs_deflate__error__bad_block[] = "#deflate: bad block";
+const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance";
+const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count";
+const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count";
+const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length";
+const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code";
+const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes";
+const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input";
+const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state";
+const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O";
+const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance";
+const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits";
+
+// ---------------- Private Consts
+
+static const uint8_t
+WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = {
+ 16, 17, 18, 0, 8, 7, 9, 6,
+ 10, 5, 11, 4, 12, 3, 13, 2,
+ 14, 1, 15,
+};
+
+static const uint8_t
+WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
+ 0, 128, 64, 192, 32, 160, 96, 224,
+ 16, 144, 80, 208, 48, 176, 112, 240,
+ 8, 136, 72, 200, 40, 168, 104, 232,
+ 24, 152, 88, 216, 56, 184, 120, 248,
+ 4, 132, 68, 196, 36, 164, 100, 228,
+ 20, 148, 84, 212, 52, 180, 116, 244,
+ 12, 140, 76, 204, 44, 172, 108, 236,
+ 28, 156, 92, 220, 60, 188, 124, 252,
+ 2, 130, 66, 194, 34, 162, 98, 226,
+ 18, 146, 82, 210, 50, 178, 114, 242,
+ 10, 138, 74, 202, 42, 170, 106, 234,
+ 26, 154, 90, 218, 58, 186, 122, 250,
+ 6, 134, 70, 198, 38, 166, 102, 230,
+ 22, 150, 86, 214, 54, 182, 118, 246,
+ 14, 142, 78, 206, 46, 174, 110, 238,
+ 30, 158, 94, 222, 62, 190, 126, 254,
+ 1, 129, 65, 193, 33, 161, 97, 225,
+ 17, 145, 81, 209, 49, 177, 113, 241,
+ 9, 137, 73, 201, 41, 169, 105, 233,
+ 25, 153, 89, 217, 57, 185, 121, 249,
+ 5, 133, 69, 197, 37, 165, 101, 229,
+ 21, 149, 85, 213, 53, 181, 117, 245,
+ 13, 141, 77, 205, 45, 173, 109, 237,
+ 29, 157, 93, 221, 61, 189, 125, 253,
+ 3, 131, 67, 195, 35, 163, 99, 227,
+ 19, 147, 83, 211, 51, 179, 115, 243,
+ 11, 139, 75, 203, 43, 171, 107, 235,
+ 27, 155, 91, 219, 59, 187, 123, 251,
+ 7, 135, 71, 199, 39, 167, 103, 231,
+ 23, 151, 87, 215, 55, 183, 119, 247,
+ 15, 143, 79, 207, 47, 175, 111, 239,
+ 31, 159, 95, 223, 63, 191, 127, 255,
+};
+
+static const uint32_t
+WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
+ 1073741824, 1073742080, 1073742336, 1073742592, 1073742848, 1073743104, 1073743360, 1073743616,
+ 1073743888, 1073744400, 1073744912, 1073745424, 1073745952, 1073746976, 1073748000, 1073749024,
+ 1073750064, 1073752112, 1073754160, 1073756208, 1073758272, 1073762368, 1073766464, 1073770560,
+ 1073774672, 1073782864, 1073791056, 1073799248, 1073807104, 134217728, 134217728, 134217728,
+};
+
+static const uint32_t
+WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
+ 1073741824, 1073742080, 1073742336, 1073742592, 1073742864, 1073743376, 1073743904, 1073744928,
+ 1073745968, 1073748016, 1073750080, 1073754176, 1073758288, 1073766480, 1073774688, 1073791072,
+ 1073807472, 1073840240, 1073873024, 1073938560, 1074004112, 1074135184, 1074266272, 1074528416,
+ 1074790576, 1075314864, 1075839168, 1076887744, 1077936336, 1080033488, 134217728, 134217728,
+};
+
+#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024
+
+#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023
+
+// ---------------- Private Initializer Prototypes
+
+// ---------------- Private Function Prototypes
+
+static wuffs_base__status
+wuffs_deflate__decoder__do_transform_io(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf);
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_blocks(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src);
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_uncompressed(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src);
+
+static wuffs_base__status
+wuffs_deflate__decoder__init_fixed_huffman(
+ wuffs_deflate__decoder* self);
+
+static wuffs_base__status
+wuffs_deflate__decoder__init_dynamic_huffman(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_src);
+
+static wuffs_base__status
+wuffs_deflate__decoder__init_huff(
+ wuffs_deflate__decoder* self,
+ uint32_t a_which,
+ uint32_t a_n_codes0,
+ uint32_t a_n_codes1,
+ uint32_t a_base_symbol);
+
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+static wuffs_base__status
+wuffs_deflate__decoder__decode_huffman_bmi2(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src);
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_huffman_fast32(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src);
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_huffman_fast64(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src);
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_huffman_fast64__choosy_default(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src);
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_huffman_slow(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src);
+
+// ---------------- VTables
+
+const wuffs_base__io_transformer__func_ptrs
+wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = {
+ (wuffs_base__empty_struct(*)(void*,
+ uint32_t,
+ bool))(&wuffs_deflate__decoder__set_quirk_enabled),
+ (wuffs_base__status(*)(void*,
+ wuffs_base__io_buffer*,
+ wuffs_base__io_buffer*,
+ wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io),
+ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len),
+};
+
+// ---------------- Initializer Implementations
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_deflate__decoder__initialize(
+ wuffs_deflate__decoder* self,
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options){
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (sizeof(*self) != sizeof_star_self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
+ }
+ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
+ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
+ }
+
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ // The whole point of this if-check is to detect an uninitialized *self.
+ // We disable the warning on GCC. Clang-5.0 does not have this warning.
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#endif
+ if (self->private_impl.magic != 0) {
+ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
+ }
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ } else {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ memset(self, 0, sizeof(*self));
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ } else {
+ memset(&(self->private_impl), 0, sizeof(self->private_impl));
+ }
+ }
+
+ self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default;
+
+ self->private_impl.magic = WUFFS_BASE__MAGIC;
+ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
+ wuffs_base__io_transformer__vtable_name;
+ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
+ (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer);
+ return wuffs_base__make_status(NULL);
+}
+
+wuffs_deflate__decoder*
+wuffs_deflate__decoder__alloc() {
+ wuffs_deflate__decoder* x =
+ (wuffs_deflate__decoder*)(calloc(sizeof(wuffs_deflate__decoder), 1));
+ if (!x) {
+ return NULL;
+ }
+ if (wuffs_deflate__decoder__initialize(
+ x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
+ free(x);
+ return NULL;
+ }
+ return x;
+}
+
+size_t
+sizeof__wuffs_deflate__decoder() {
+ return sizeof(wuffs_deflate__decoder);
+}
+
+// ---------------- Function Implementations
+
+// -------- func deflate.decoder.add_history
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_deflate__decoder__add_history(
+ wuffs_deflate__decoder* self,
+ wuffs_base__slice_u8 a_hist) {
+ if (!self) {
+ return wuffs_base__make_empty_struct();
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_empty_struct();
+ }
+
+ wuffs_base__slice_u8 v_s = {0};
+ uint64_t v_n_copied = 0;
+ uint32_t v_already_full = 0;
+
+ v_s = a_hist;
+ if (((uint64_t)(v_s.len)) >= 32768) {
+ v_s = wuffs_base__slice_u8__suffix(v_s, 32768);
+ wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s);
+ self->private_impl.f_history_index = 32768;
+ } else {
+ v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, (self->private_impl.f_history_index & 32767), 32768), v_s);
+ if (v_n_copied < ((uint64_t)(v_s.len))) {
+ v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied);
+ v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s);
+ self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767))) + 32768);
+ } else {
+ v_already_full = 0;
+ if (self->private_impl.f_history_index >= 32768) {
+ v_already_full = 32768;
+ }
+ self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767) + ((uint32_t)((v_n_copied & 32767))) + v_already_full);
+ }
+ }
+ wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, 32768, 33025), wuffs_base__make_slice_u8(self->private_data.f_history, 33025));
+ return wuffs_base__make_empty_struct();
+}
+
+// -------- func deflate.decoder.set_quirk_enabled
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_deflate__decoder__set_quirk_enabled(
+ wuffs_deflate__decoder* self,
+ uint32_t a_quirk,
+ bool a_enabled) {
+ return wuffs_base__make_empty_struct();
+}
+
+// -------- func deflate.decoder.workbuf_len
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_deflate__decoder__workbuf_len(
+ const wuffs_deflate__decoder* self) {
+ if (!self) {
+ return wuffs_base__utility__empty_range_ii_u64();
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return wuffs_base__utility__empty_range_ii_u64();
+ }
+
+ return wuffs_base__utility__make_range_ii_u64(1, 1);
+}
+
+// -------- func deflate.decoder.transform_io
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_deflate__decoder__transform_io(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf) {
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_status(
+ (self->private_impl.magic == WUFFS_BASE__DISABLED)
+ ? wuffs_base__error__disabled_by_previous_error
+ : wuffs_base__error__initialize_not_called);
+ }
+ if (!a_dst || !a_src) {
+ self->private_impl.magic = WUFFS_BASE__DISABLED;
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ if ((self->private_impl.active_coroutine != 0) &&
+ (self->private_impl.active_coroutine != 1)) {
+ self->private_impl.magic = WUFFS_BASE__DISABLED;
+ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
+ }
+ self->private_impl.active_coroutine = 0;
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+ uint32_t coro_susp_point = self->private_impl.p_transform_io[0];
+ switch (coro_susp_point) {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+ while (true) {
+ {
+ wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
+ v_status = t_0;
+ }
+ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__truncated_input);
+ goto exit;
+ }
+ status = v_status;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
+ }
+
+ ok:
+ self->private_impl.p_transform_io[0] = 0;
+ goto exit;
+ }
+
+ goto suspend;
+ suspend:
+ self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
+
+ goto exit;
+ exit:
+ if (wuffs_base__status__is_error(&status)) {
+ self->private_impl.magic = WUFFS_BASE__DISABLED;
+ }
+ return status;
+}
+
+// -------- func deflate.decoder.do_transform_io
+
+static wuffs_base__status
+wuffs_deflate__decoder__do_transform_io(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf) {
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ uint64_t v_mark = 0;
+ wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+ uint8_t* iop_a_dst = NULL;
+ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_dst && a_dst->data.ptr) {
+ io0_a_dst = a_dst->data.ptr;
+ io1_a_dst = io0_a_dst + a_dst->meta.wi;
+ iop_a_dst = io1_a_dst;
+ io2_a_dst = io0_a_dst + a_dst->data.len;
+ if (a_dst->meta.closed) {
+ io2_a_dst = iop_a_dst;
+ }
+ }
+
+ uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0];
+ switch (coro_susp_point) {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+ self->private_impl.choosy_decode_huffman_fast64 = (
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+ wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 :
+#endif
+ self->private_impl.choosy_decode_huffman_fast64);
+ while (true) {
+ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
+ {
+ if (a_dst) {
+ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
+ }
+ wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src);
+ v_status = t_0;
+ if (a_dst) {
+ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
+ }
+ }
+ if ( ! wuffs_base__status__is_suspension(&v_status)) {
+ status = v_status;
+ if (wuffs_base__status__is_error(&status)) {
+ goto exit;
+ } else if (wuffs_base__status__is_suspension(&status)) {
+ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
+ goto exit;
+ }
+ goto ok;
+ }
+ wuffs_base__u64__sat_add_indirect(&self->private_impl.f_transformed_history_count, wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst))));
+ wuffs_deflate__decoder__add_history(self, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
+ status = v_status;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
+ }
+
+ ok:
+ self->private_impl.p_do_transform_io[0] = 0;
+ goto exit;
+ }
+
+ goto suspend;
+ suspend:
+ self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+
+ goto exit;
+ exit:
+ if (a_dst && a_dst->data.ptr) {
+ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
+ }
+
+ return status;
+}
+
+// -------- func deflate.decoder.decode_blocks
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_blocks(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ uint32_t v_final = 0;
+ uint32_t v_b0 = 0;
+ uint32_t v_type = 0;
+ wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+ const uint8_t* iop_a_src = NULL;
+ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_src && a_src->data.ptr) {
+ io0_a_src = a_src->data.ptr;
+ io1_a_src = io0_a_src + a_src->meta.ri;
+ iop_a_src = io1_a_src;
+ io2_a_src = io0_a_src + a_src->meta.wi;
+ }
+
+ uint32_t coro_susp_point = self->private_impl.p_decode_blocks[0];
+ if (coro_susp_point) {
+ v_final = self->private_data.s_decode_blocks[0].v_final;
+ }
+ switch (coro_susp_point) {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+ label__outer__continue:;
+ while (v_final == 0) {
+ while (self->private_impl.f_n_bits < 3) {
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_0 = *iop_a_src++;
+ v_b0 = t_0;
+ }
+ self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3));
+ self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3) + 8);
+ }
+ v_final = (self->private_impl.f_bits & 1);
+ v_type = ((self->private_impl.f_bits >> 1) & 3);
+ self->private_impl.f_bits >>= 3;
+ self->private_impl.f_n_bits -= 3;
+ if (v_type == 0) {
+ if (a_src) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+ status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src);
+ if (a_src) {
+ iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ }
+ if (status.repr) {
+ goto suspend;
+ }
+ goto label__outer__continue;
+ } else if (v_type == 1) {
+ v_status = wuffs_deflate__decoder__init_fixed_huffman(self);
+ if ( ! wuffs_base__status__is_ok(&v_status)) {
+ status = v_status;
+ if (wuffs_base__status__is_error(&status)) {
+ goto exit;
+ } else if (wuffs_base__status__is_suspension(&status)) {
+ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
+ goto exit;
+ }
+ goto ok;
+ }
+ } else if (v_type == 2) {
+ if (a_src) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+ status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src);
+ if (a_src) {
+ iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ }
+ if (status.repr) {
+ goto suspend;
+ }
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_block);
+ goto exit;
+ }
+ self->private_impl.f_end_of_block = false;
+ while (true) {
+ if (sizeof(void*) == 4) {
+ if (a_src) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+ v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src);
+ if (a_src) {
+ iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ }
+ } else {
+ if (a_src) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+ v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src);
+ if (a_src) {
+ iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ }
+ }
+ if (wuffs_base__status__is_error(&v_status)) {
+ status = v_status;
+ goto exit;
+ }
+ if (self->private_impl.f_end_of_block) {
+ goto label__outer__continue;
+ }
+ if (a_src) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+ status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src);
+ if (a_src) {
+ iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ }
+ if (status.repr) {
+ goto suspend;
+ }
+ if (self->private_impl.f_end_of_block) {
+ goto label__outer__continue;
+ }
+ }
+ }
+
+ ok:
+ self->private_impl.p_decode_blocks[0] = 0;
+ goto exit;
+ }
+
+ goto suspend;
+ suspend:
+ self->private_impl.p_decode_blocks[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+ self->private_data.s_decode_blocks[0].v_final = v_final;
+
+ goto exit;
+ exit:
+ if (a_src && a_src->data.ptr) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+
+ return status;
+}
+
+// -------- func deflate.decoder.decode_uncompressed
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_uncompressed(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ uint32_t v_length = 0;
+ uint32_t v_n_copied = 0;
+
+ uint8_t* iop_a_dst = NULL;
+ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_dst && a_dst->data.ptr) {
+ io0_a_dst = a_dst->data.ptr;
+ io1_a_dst = io0_a_dst + a_dst->meta.wi;
+ iop_a_dst = io1_a_dst;
+ io2_a_dst = io0_a_dst + a_dst->data.len;
+ if (a_dst->meta.closed) {
+ io2_a_dst = iop_a_dst;
+ }
+ }
+ const uint8_t* iop_a_src = NULL;
+ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_src && a_src->data.ptr) {
+ io0_a_src = a_src->data.ptr;
+ io1_a_src = io0_a_src + a_src->meta.ri;
+ iop_a_src = io1_a_src;
+ io2_a_src = io0_a_src + a_src->meta.wi;
+ }
+
+ uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed[0];
+ if (coro_susp_point) {
+ v_length = self->private_data.s_decode_uncompressed[0].v_length;
+ }
+ switch (coro_susp_point) {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+ if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+ self->private_impl.f_n_bits = 0;
+ self->private_impl.f_bits = 0;
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+ uint32_t t_0;
+ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
+ iop_a_src += 4;
+ } else {
+ self->private_data.s_decode_uncompressed[0].scratch = 0;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+ while (true) {
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint64_t* scratch = &self->private_data.s_decode_uncompressed[0].scratch;
+ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
+ *scratch <<= 8;
+ *scratch >>= 8;
+ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
+ if (num_bits_0 == 24) {
+ t_0 = ((uint32_t)(*scratch));
+ break;
+ }
+ num_bits_0 += 8;
+ *scratch |= ((uint64_t)(num_bits_0)) << 56;
+ }
+ }
+ v_length = t_0;
+ }
+ if ((((v_length) & 0xFFFF) + ((v_length) >> (32 - (16)))) != 65535) {
+ status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length);
+ goto exit;
+ }
+ v_length = ((v_length) & 0xFFFF);
+ while (true) {
+ v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_reader(
+ &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src);
+ if (v_length <= v_n_copied) {
+ status = wuffs_base__make_status(NULL);
+ goto ok;
+ }
+ v_length -= v_n_copied;
+ if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_write);
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
+ } else {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
+ }
+ }
+
+ ok:
+ self->private_impl.p_decode_uncompressed[0] = 0;
+ goto exit;
+ }
+
+ goto suspend;
+ suspend:
+ self->private_impl.p_decode_uncompressed[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+ self->private_data.s_decode_uncompressed[0].v_length = v_length;
+
+ goto exit;
+ exit:
+ if (a_dst && a_dst->data.ptr) {
+ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
+ }
+ if (a_src && a_src->data.ptr) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+
+ return status;
+}
+
+// -------- func deflate.decoder.init_fixed_huffman
+
+static wuffs_base__status
+wuffs_deflate__decoder__init_fixed_huffman(
+ wuffs_deflate__decoder* self) {
+ uint32_t v_i = 0;
+ wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+ while (v_i < 144) {
+ self->private_data.f_code_lengths[v_i] = 8;
+ v_i += 1;
+ }
+ while (v_i < 256) {
+ self->private_data.f_code_lengths[v_i] = 9;
+ v_i += 1;
+ }
+ while (v_i < 280) {
+ self->private_data.f_code_lengths[v_i] = 7;
+ v_i += 1;
+ }
+ while (v_i < 288) {
+ self->private_data.f_code_lengths[v_i] = 8;
+ v_i += 1;
+ }
+ while (v_i < 320) {
+ self->private_data.f_code_lengths[v_i] = 5;
+ v_i += 1;
+ }
+ v_status = wuffs_deflate__decoder__init_huff(self,
+ 0,
+ 0,
+ 288,
+ 257);
+ if (wuffs_base__status__is_error(&v_status)) {
+ return v_status;
+ }
+ v_status = wuffs_deflate__decoder__init_huff(self,
+ 1,
+ 288,
+ 320,
+ 0);
+ if (wuffs_base__status__is_error(&v_status)) {
+ return v_status;
+ }
+ return wuffs_base__make_status(NULL);
+}
+
+// -------- func deflate.decoder.init_dynamic_huffman
+
+static wuffs_base__status
+wuffs_deflate__decoder__init_dynamic_huffman(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_src) {
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ uint32_t v_bits = 0;
+ uint32_t v_n_bits = 0;
+ uint32_t v_b0 = 0;
+ uint32_t v_n_lit = 0;
+ uint32_t v_n_dist = 0;
+ uint32_t v_n_clen = 0;
+ uint32_t v_i = 0;
+ uint32_t v_b1 = 0;
+ wuffs_base__status v_status = wuffs_base__make_status(NULL);
+ uint32_t v_mask = 0;
+ uint32_t v_table_entry = 0;
+ uint32_t v_table_entry_n_bits = 0;
+ uint32_t v_b2 = 0;
+ uint32_t v_n_extra_bits = 0;
+ uint8_t v_rep_symbol = 0;
+ uint32_t v_rep_count = 0;
+ uint32_t v_b3 = 0;
+
+ const uint8_t* iop_a_src = NULL;
+ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_src && a_src->data.ptr) {
+ io0_a_src = a_src->data.ptr;
+ io1_a_src = io0_a_src + a_src->meta.ri;
+ iop_a_src = io1_a_src;
+ io2_a_src = io0_a_src + a_src->meta.wi;
+ }
+
+ uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman[0];
+ if (coro_susp_point) {
+ v_bits = self->private_data.s_init_dynamic_huffman[0].v_bits;
+ v_n_bits = self->private_data.s_init_dynamic_huffman[0].v_n_bits;
+ v_n_lit = self->private_data.s_init_dynamic_huffman[0].v_n_lit;
+ v_n_dist = self->private_data.s_init_dynamic_huffman[0].v_n_dist;
+ v_n_clen = self->private_data.s_init_dynamic_huffman[0].v_n_clen;
+ v_i = self->private_data.s_init_dynamic_huffman[0].v_i;
+ v_mask = self->private_data.s_init_dynamic_huffman[0].v_mask;
+ v_n_extra_bits = self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits;
+ v_rep_symbol = self->private_data.s_init_dynamic_huffman[0].v_rep_symbol;
+ v_rep_count = self->private_data.s_init_dynamic_huffman[0].v_rep_count;
+ }
+ switch (coro_susp_point) {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+ v_bits = self->private_impl.f_bits;
+ v_n_bits = self->private_impl.f_n_bits;
+ while (v_n_bits < 14) {
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_0 = *iop_a_src++;
+ v_b0 = t_0;
+ }
+ v_bits |= (v_b0 << v_n_bits);
+ v_n_bits += 8;
+ }
+ v_n_lit = (((v_bits) & 0x1F) + 257);
+ if (v_n_lit > 286) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count);
+ goto exit;
+ }
+ v_bits >>= 5;
+ v_n_dist = (((v_bits) & 0x1F) + 1);
+ if (v_n_dist > 30) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count);
+ goto exit;
+ }
+ v_bits >>= 5;
+ v_n_clen = (((v_bits) & 0xF) + 4);
+ v_bits >>= 4;
+ v_n_bits -= 14;
+ v_i = 0;
+ while (v_i < v_n_clen) {
+ while (v_n_bits < 3) {
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_1 = *iop_a_src++;
+ v_b1 = t_1;
+ }
+ v_bits |= (v_b1 << v_n_bits);
+ v_n_bits += 8;
+ }
+ self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7)));
+ v_bits >>= 3;
+ v_n_bits -= 3;
+ v_i += 1;
+ }
+ while (v_i < 19) {
+ self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0;
+ v_i += 1;
+ }
+ v_status = wuffs_deflate__decoder__init_huff(self,
+ 0,
+ 0,
+ 19,
+ 4095);
+ if (wuffs_base__status__is_error(&v_status)) {
+ status = v_status;
+ goto exit;
+ }
+ v_mask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1);
+ v_i = 0;
+ label__0__continue:;
+ while (v_i < (v_n_lit + v_n_dist)) {
+ while (true) {
+ v_table_entry = self->private_data.f_huffs[0][(v_bits & v_mask)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ if (v_n_bits >= v_table_entry_n_bits) {
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ goto label__1__break;
+ }
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_2 = *iop_a_src++;
+ v_b2 = t_2;
+ }
+ v_bits |= (v_b2 << v_n_bits);
+ v_n_bits += 8;
+ }
+ label__1__break:;
+ if ((v_table_entry >> 24) != 128) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ v_table_entry = ((v_table_entry >> 8) & 255);
+ if (v_table_entry < 16) {
+ self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry));
+ v_i += 1;
+ goto label__0__continue;
+ }
+ v_n_extra_bits = 0;
+ v_rep_symbol = 0;
+ v_rep_count = 0;
+ if (v_table_entry == 16) {
+ v_n_extra_bits = 2;
+ if (v_i <= 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition);
+ goto exit;
+ }
+ v_rep_symbol = (self->private_data.f_code_lengths[(v_i - 1)] & 15);
+ v_rep_count = 3;
+ } else if (v_table_entry == 17) {
+ v_n_extra_bits = 3;
+ v_rep_symbol = 0;
+ v_rep_count = 3;
+ } else if (v_table_entry == 18) {
+ v_n_extra_bits = 7;
+ v_rep_symbol = 0;
+ v_rep_count = 11;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ while (v_n_bits < v_n_extra_bits) {
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_3 = *iop_a_src++;
+ v_b3 = t_3;
+ }
+ v_bits |= (v_b3 << v_n_bits);
+ v_n_bits += 8;
+ }
+ v_rep_count += ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_n_extra_bits));
+ v_bits >>= v_n_extra_bits;
+ v_n_bits -= v_n_extra_bits;
+ while (v_rep_count > 0) {
+ if (v_i >= (v_n_lit + v_n_dist)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count);
+ goto exit;
+ }
+ self->private_data.f_code_lengths[v_i] = v_rep_symbol;
+ v_i += 1;
+ v_rep_count -= 1;
+ }
+ }
+ if (v_i != (v_n_lit + v_n_dist)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count);
+ goto exit;
+ }
+ if (self->private_data.f_code_lengths[256] == 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code);
+ goto exit;
+ }
+ v_status = wuffs_deflate__decoder__init_huff(self,
+ 0,
+ 0,
+ v_n_lit,
+ 257);
+ if (wuffs_base__status__is_error(&v_status)) {
+ status = v_status;
+ goto exit;
+ }
+ v_status = wuffs_deflate__decoder__init_huff(self,
+ 1,
+ v_n_lit,
+ (v_n_lit + v_n_dist),
+ 0);
+ if (wuffs_base__status__is_error(&v_status)) {
+ status = v_status;
+ goto exit;
+ }
+ self->private_impl.f_bits = v_bits;
+ self->private_impl.f_n_bits = v_n_bits;
+
+ goto ok;
+ ok:
+ self->private_impl.p_init_dynamic_huffman[0] = 0;
+ goto exit;
+ }
+
+ goto suspend;
+ suspend:
+ self->private_impl.p_init_dynamic_huffman[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+ self->private_data.s_init_dynamic_huffman[0].v_bits = v_bits;
+ self->private_data.s_init_dynamic_huffman[0].v_n_bits = v_n_bits;
+ self->private_data.s_init_dynamic_huffman[0].v_n_lit = v_n_lit;
+ self->private_data.s_init_dynamic_huffman[0].v_n_dist = v_n_dist;
+ self->private_data.s_init_dynamic_huffman[0].v_n_clen = v_n_clen;
+ self->private_data.s_init_dynamic_huffman[0].v_i = v_i;
+ self->private_data.s_init_dynamic_huffman[0].v_mask = v_mask;
+ self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits = v_n_extra_bits;
+ self->private_data.s_init_dynamic_huffman[0].v_rep_symbol = v_rep_symbol;
+ self->private_data.s_init_dynamic_huffman[0].v_rep_count = v_rep_count;
+
+ goto exit;
+ exit:
+ if (a_src && a_src->data.ptr) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+
+ return status;
+}
+
+// -------- func deflate.decoder.init_huff
+
+static wuffs_base__status
+wuffs_deflate__decoder__init_huff(
+ wuffs_deflate__decoder* self,
+ uint32_t a_which,
+ uint32_t a_n_codes0,
+ uint32_t a_n_codes1,
+ uint32_t a_base_symbol) {
+ uint16_t v_counts[16] = {0};
+ uint32_t v_i = 0;
+ uint32_t v_remaining = 0;
+ uint16_t v_offsets[16] = {0};
+ uint32_t v_n_symbols = 0;
+ uint32_t v_count = 0;
+ uint16_t v_symbols[320] = {0};
+ uint32_t v_min_cl = 0;
+ uint32_t v_max_cl = 0;
+ uint32_t v_initial_high_bits = 0;
+ uint32_t v_prev_cl = 0;
+ uint32_t v_prev_redirect_key = 0;
+ uint32_t v_top = 0;
+ uint32_t v_next_top = 0;
+ uint32_t v_code = 0;
+ uint32_t v_key = 0;
+ uint32_t v_value = 0;
+ uint32_t v_cl = 0;
+ uint32_t v_redirect_key = 0;
+ uint32_t v_j = 0;
+ uint32_t v_reversed_key = 0;
+ uint32_t v_symbol = 0;
+ uint32_t v_high_bits = 0;
+ uint32_t v_delta = 0;
+
+ v_i = a_n_codes0;
+ while (v_i < a_n_codes1) {
+ if (v_counts[(self->private_data.f_code_lengths[v_i] & 15)] >= 320) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+ v_counts[(self->private_data.f_code_lengths[v_i] & 15)] += 1;
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ v_i += 1;
+ }
+ if ((((uint32_t)(v_counts[0])) + a_n_codes0) == a_n_codes1) {
+ return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes);
+ }
+ v_remaining = 1;
+ v_i = 1;
+ while (v_i <= 15) {
+ if (v_remaining > 1073741824) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ v_remaining <<= 1;
+ if (v_remaining < ((uint32_t)(v_counts[v_i]))) {
+ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed);
+ }
+ v_remaining -= ((uint32_t)(v_counts[v_i]));
+ v_i += 1;
+ }
+ if (v_remaining != 0) {
+ if ((a_which == 1) && (v_counts[1] == 1) && ((((uint32_t)(v_counts[0])) + a_n_codes0 + 1) == a_n_codes1)) {
+ v_i = 0;
+ while (v_i <= 29) {
+ if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1) {
+ self->private_impl.f_n_huffs_bits[1] = 1;
+ self->private_data.f_huffs[1][0] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1);
+ self->private_data.f_huffs[1][1] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31] | 1);
+ return wuffs_base__make_status(NULL);
+ }
+ v_i += 1;
+ }
+ }
+ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed);
+ }
+ v_i = 1;
+ while (v_i <= 15) {
+ v_offsets[v_i] = ((uint16_t)(v_n_symbols));
+ v_count = ((uint32_t)(v_counts[v_i]));
+ if (v_n_symbols > (320 - v_count)) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ v_n_symbols = (v_n_symbols + v_count);
+ v_i += 1;
+ }
+ if (v_n_symbols > 288) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ v_i = a_n_codes0;
+ while (v_i < a_n_codes1) {
+ if (v_i < a_n_codes0) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ if (self->private_data.f_code_lengths[v_i] != 0) {
+ if (v_offsets[(self->private_data.f_code_lengths[v_i] & 15)] >= 320) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ v_symbols[v_offsets[(self->private_data.f_code_lengths[v_i] & 15)]] = ((uint16_t)((v_i - a_n_codes0)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+ v_offsets[(self->private_data.f_code_lengths[v_i] & 15)] += 1;
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ }
+ v_i += 1;
+ }
+ v_min_cl = 1;
+ while (true) {
+ if (v_counts[v_min_cl] != 0) {
+ goto label__0__break;
+ }
+ if (v_min_cl >= 9) {
+ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length);
+ }
+ v_min_cl += 1;
+ }
+ label__0__break:;
+ v_max_cl = 15;
+ while (true) {
+ if (v_counts[v_max_cl] != 0) {
+ goto label__1__break;
+ }
+ if (v_max_cl <= 1) {
+ return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes);
+ }
+ v_max_cl -= 1;
+ }
+ label__1__break:;
+ if (v_max_cl <= 9) {
+ self->private_impl.f_n_huffs_bits[a_which] = v_max_cl;
+ } else {
+ self->private_impl.f_n_huffs_bits[a_which] = 9;
+ }
+ v_i = 0;
+ if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15])))) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ if ((a_n_codes0 + ((uint32_t)(v_symbols[0]))) >= 320) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ v_initial_high_bits = 512;
+ if (v_max_cl < 9) {
+ v_initial_high_bits = (((uint32_t)(1)) << v_max_cl);
+ }
+ v_prev_cl = ((uint32_t)((self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0])))] & 15)));
+ v_prev_redirect_key = 4294967295;
+ v_top = 0;
+ v_next_top = 512;
+ v_code = 0;
+ v_key = 0;
+ v_value = 0;
+ while (true) {
+ if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ v_cl = ((uint32_t)((self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15)));
+ if (v_cl > v_prev_cl) {
+ v_code <<= (v_cl - v_prev_cl);
+ if (v_code >= 32768) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ }
+ v_prev_cl = v_cl;
+ v_key = v_code;
+ if (v_cl > 9) {
+ v_cl -= 9;
+ v_redirect_key = ((v_key >> v_cl) & 511);
+ v_key = ((v_key) & WUFFS_BASE__LOW_BITS_MASK__U32(v_cl));
+ if (v_prev_redirect_key != v_redirect_key) {
+ v_prev_redirect_key = v_redirect_key;
+ v_remaining = (((uint32_t)(1)) << v_cl);
+ v_j = v_prev_cl;
+ while (v_j <= 15) {
+ if (v_remaining <= ((uint32_t)(v_counts[v_j]))) {
+ goto label__2__break;
+ }
+ v_remaining -= ((uint32_t)(v_counts[v_j]));
+ if (v_remaining > 1073741824) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ v_remaining <<= 1;
+ v_j += 1;
+ }
+ label__2__break:;
+ if ((v_j <= 9) || (15 < v_j)) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ v_j -= 9;
+ v_initial_high_bits = (((uint32_t)(1)) << v_j);
+ v_top = v_next_top;
+ if ((v_top + (((uint32_t)(1)) << v_j)) > 1024) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ v_next_top = (v_top + (((uint32_t)(1)) << v_j));
+ v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1)])) | ((v_redirect_key & 1) << 8));
+ self->private_data.f_huffs[a_which][v_redirect_key] = (268435465 | (v_top << 8) | (v_j << 4));
+ }
+ }
+ if ((v_key >= 512) || (v_counts[v_prev_cl] <= 0)) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+ v_counts[v_prev_cl] -= 1;
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1)])) | ((v_key & 1) << 8));
+ v_reversed_key >>= (9 - v_cl);
+ v_symbol = ((uint32_t)(v_symbols[v_i]));
+ if (v_symbol == 256) {
+ v_value = (536870912 | v_cl);
+ } else if ((v_symbol < 256) && (a_which == 0)) {
+ v_value = (2147483648 | (v_symbol << 8) | v_cl);
+ } else if (v_symbol >= a_base_symbol) {
+ v_symbol -= a_base_symbol;
+ if (a_which == 0) {
+ v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31)] | v_cl);
+ } else {
+ v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31)] | v_cl);
+ }
+ } else {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ v_high_bits = v_initial_high_bits;
+ v_delta = (((uint32_t)(1)) << v_cl);
+ while (v_high_bits >= v_delta) {
+ v_high_bits -= v_delta;
+ if ((v_top + ((v_high_bits | v_reversed_key) & 511)) >= 1024) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511))] = v_value;
+ }
+ v_i += 1;
+ if (v_i >= v_n_symbols) {
+ goto label__3__break;
+ }
+ v_code += 1;
+ if (v_code >= 32768) {
+ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ }
+ }
+ label__3__break:;
+ return wuffs_base__make_status(NULL);
+}
+
+// ‼ WUFFS MULTI-FILE SECTION +x86_bmi2
+// -------- func deflate.decoder.decode_huffman_bmi2
+
+#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2")
+static wuffs_base__status
+wuffs_deflate__decoder__decode_huffman_bmi2(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ uint64_t v_bits = 0;
+ uint32_t v_n_bits = 0;
+ uint32_t v_table_entry = 0;
+ uint32_t v_table_entry_n_bits = 0;
+ uint64_t v_lmask = 0;
+ uint64_t v_dmask = 0;
+ uint32_t v_redir_top = 0;
+ uint32_t v_redir_mask = 0;
+ uint32_t v_length = 0;
+ uint32_t v_dist_minus_1 = 0;
+ uint32_t v_hlen = 0;
+ uint32_t v_hdist = 0;
+ uint32_t v_hdist_adjustment = 0;
+
+ uint8_t* iop_a_dst = NULL;
+ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_dst && a_dst->data.ptr) {
+ io0_a_dst = a_dst->data.ptr;
+ io1_a_dst = io0_a_dst + a_dst->meta.wi;
+ iop_a_dst = io1_a_dst;
+ io2_a_dst = io0_a_dst + a_dst->data.len;
+ if (a_dst->meta.closed) {
+ io2_a_dst = iop_a_dst;
+ }
+ }
+ const uint8_t* iop_a_src = NULL;
+ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_src && a_src->data.ptr) {
+ io0_a_src = a_src->data.ptr;
+ io1_a_src = io0_a_src + a_src->meta.ri;
+ iop_a_src = io1_a_src;
+ io2_a_src = io0_a_src + a_src->meta.wi;
+ }
+
+ if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+ v_bits = ((uint64_t)(self->private_impl.f_bits));
+ v_n_bits = self->private_impl.f_n_bits;
+ v_lmask = ((((uint64_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1);
+ v_dmask = ((((uint64_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1);
+ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0)) {
+ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
+ goto exit;
+ }
+ v_hdist_adjustment = ((uint32_t)(((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0)) & 4294967295)));
+ label__loop__continue:;
+ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8)) {
+ v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63)));
+ iop_a_src += ((63 - (v_n_bits & 63)) >> 3);
+ v_n_bits |= 56;
+ v_table_entry = self->private_data.f_huffs[0][(v_bits & v_lmask)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ if ((v_table_entry >> 31) != 0) {
+ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1);
+ goto label__loop__continue;
+ } else if ((v_table_entry >> 30) != 0) {
+ } else if ((v_table_entry >> 29) != 0) {
+ self->private_impl.f_end_of_block = true;
+ goto label__loop__break;
+ } else if ((v_table_entry >> 28) != 0) {
+ v_redir_top = ((v_table_entry >> 8) & 65535);
+ v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1);
+ v_table_entry = self->private_data.f_huffs[0][((v_redir_top + (((uint32_t)((v_bits & 4294967295))) & v_redir_mask)) & 1023)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ if ((v_table_entry >> 31) != 0) {
+ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1);
+ goto label__loop__continue;
+ } else if ((v_table_entry >> 30) != 0) {
+ } else if ((v_table_entry >> 29) != 0) {
+ self->private_impl.f_end_of_block = true;
+ goto label__loop__break;
+ } else if ((v_table_entry >> 28) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ } else if ((v_table_entry >> 27) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ } else if ((v_table_entry >> 27) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ v_length = (((v_table_entry >> 8) & 255) + 3);
+ v_table_entry_n_bits = ((v_table_entry >> 4) & 15);
+ if (v_table_entry_n_bits > 0) {
+ v_length = (((v_length + 253 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255) + 3);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ }
+ v_table_entry = self->private_data.f_huffs[1][(v_bits & v_dmask)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ if ((v_table_entry >> 28) == 1) {
+ v_redir_top = ((v_table_entry >> 8) & 65535);
+ v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1);
+ v_table_entry = self->private_data.f_huffs[1][((v_redir_top + (((uint32_t)((v_bits & 4294967295))) & v_redir_mask)) & 1023)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ }
+ if ((v_table_entry >> 24) != 64) {
+ if ((v_table_entry >> 24) == 8) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ }
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ v_dist_minus_1 = ((v_table_entry >> 8) & 32767);
+ v_table_entry_n_bits = ((v_table_entry >> 4) & 15);
+ v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ while (true) {
+ if (((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
+ v_hlen = 0;
+ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
+ if (v_length > v_hdist) {
+ v_length -= v_hdist;
+ v_hlen = v_hdist;
+ } else {
+ v_hlen = v_length;
+ v_length = 0;
+ }
+ v_hdist += v_hdist_adjustment;
+ if (self->private_impl.f_history_index < v_hdist) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
+ goto exit;
+ }
+ wuffs_base__io_writer__limited_copy_u32_from_slice(
+ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025));
+ if (v_length == 0) {
+ goto label__loop__continue;
+ }
+ if ((((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
+ goto exit;
+ }
+ }
+ if ((v_dist_minus_1 + 1) >= 8) {
+ wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
+ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1));
+ } else if ((v_dist_minus_1 + 1) == 1) {
+ wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
+ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1));
+ } else {
+ wuffs_base__io_writer__limited_copy_u32_from_history_fast(
+ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1));
+ }
+ goto label__0__break;
+ }
+ label__0__break:;
+ }
+ label__loop__break:;
+ if (v_n_bits > 63) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+ while (v_n_bits >= 8) {
+ v_n_bits -= 8;
+ if (iop_a_src > io1_a_src) {
+ iop_a_src--;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
+ goto exit;
+ }
+ }
+ self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1)) << v_n_bits) - 1))));
+ self->private_impl.f_n_bits = v_n_bits;
+ if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+ goto exit;
+ exit:
+ if (a_dst && a_dst->data.ptr) {
+ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
+ }
+ if (a_src && a_src->data.ptr) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+
+ return status;
+}
+#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY)
+// ‼ WUFFS MULTI-FILE SECTION -x86_bmi2
+
+// -------- func deflate.decoder.decode_huffman_fast32
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_huffman_fast32(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ uint32_t v_bits = 0;
+ uint32_t v_n_bits = 0;
+ uint32_t v_table_entry = 0;
+ uint32_t v_table_entry_n_bits = 0;
+ uint32_t v_lmask = 0;
+ uint32_t v_dmask = 0;
+ uint32_t v_redir_top = 0;
+ uint32_t v_redir_mask = 0;
+ uint32_t v_length = 0;
+ uint32_t v_dist_minus_1 = 0;
+ uint32_t v_hlen = 0;
+ uint32_t v_hdist = 0;
+ uint32_t v_hdist_adjustment = 0;
+
+ uint8_t* iop_a_dst = NULL;
+ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_dst && a_dst->data.ptr) {
+ io0_a_dst = a_dst->data.ptr;
+ io1_a_dst = io0_a_dst + a_dst->meta.wi;
+ iop_a_dst = io1_a_dst;
+ io2_a_dst = io0_a_dst + a_dst->data.len;
+ if (a_dst->meta.closed) {
+ io2_a_dst = iop_a_dst;
+ }
+ }
+ const uint8_t* iop_a_src = NULL;
+ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_src && a_src->data.ptr) {
+ io0_a_src = a_src->data.ptr;
+ io1_a_src = io0_a_src + a_src->meta.ri;
+ iop_a_src = io1_a_src;
+ io2_a_src = io0_a_src + a_src->meta.wi;
+ }
+
+ if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+ v_bits = self->private_impl.f_bits;
+ v_n_bits = self->private_impl.f_n_bits;
+ v_lmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1);
+ v_dmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1);
+ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0)) {
+ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
+ goto exit;
+ }
+ v_hdist_adjustment = ((uint32_t)(((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0)) & 4294967295)));
+ label__loop__continue:;
+ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12)) {
+ if (v_n_bits < 15) {
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ } else {
+ }
+ v_table_entry = self->private_data.f_huffs[0][(v_bits & v_lmask)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ if ((v_table_entry >> 31) != 0) {
+ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1);
+ goto label__loop__continue;
+ } else if ((v_table_entry >> 30) != 0) {
+ } else if ((v_table_entry >> 29) != 0) {
+ self->private_impl.f_end_of_block = true;
+ goto label__loop__break;
+ } else if ((v_table_entry >> 28) != 0) {
+ if (v_n_bits < 15) {
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ } else {
+ }
+ v_redir_top = ((v_table_entry >> 8) & 65535);
+ v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1);
+ v_table_entry = self->private_data.f_huffs[0][((v_redir_top + (v_bits & v_redir_mask)) & 1023)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ if ((v_table_entry >> 31) != 0) {
+ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1);
+ goto label__loop__continue;
+ } else if ((v_table_entry >> 30) != 0) {
+ } else if ((v_table_entry >> 29) != 0) {
+ self->private_impl.f_end_of_block = true;
+ goto label__loop__break;
+ } else if ((v_table_entry >> 28) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ } else if ((v_table_entry >> 27) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ } else if ((v_table_entry >> 27) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ v_length = (((v_table_entry >> 8) & 255) + 3);
+ v_table_entry_n_bits = ((v_table_entry >> 4) & 15);
+ if (v_table_entry_n_bits > 0) {
+ if (v_n_bits < 15) {
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ } else {
+ }
+ v_length = (((v_length + 253 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255) + 3);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ } else {
+ }
+ if (v_n_bits < 15) {
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ } else {
+ }
+ v_table_entry = self->private_data.f_huffs[1][(v_bits & v_dmask)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ if ((v_table_entry >> 28) == 1) {
+ if (v_n_bits < 15) {
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ } else {
+ }
+ v_redir_top = ((v_table_entry >> 8) & 65535);
+ v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1);
+ v_table_entry = self->private_data.f_huffs[1][((v_redir_top + (v_bits & v_redir_mask)) & 1023)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ } else {
+ }
+ if ((v_table_entry >> 24) != 64) {
+ if ((v_table_entry >> 24) == 8) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ }
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ v_dist_minus_1 = ((v_table_entry >> 8) & 32767);
+ v_table_entry_n_bits = ((v_table_entry >> 4) & 15);
+ if (v_n_bits < v_table_entry_n_bits) {
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
+ iop_a_src += 1;
+ v_n_bits += 8;
+ }
+ v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ while (true) {
+ if (((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
+ v_hlen = 0;
+ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
+ if (v_length > v_hdist) {
+ v_length -= v_hdist;
+ v_hlen = v_hdist;
+ } else {
+ v_hlen = v_length;
+ v_length = 0;
+ }
+ v_hdist += v_hdist_adjustment;
+ if (self->private_impl.f_history_index < v_hdist) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
+ goto exit;
+ }
+ wuffs_base__io_writer__limited_copy_u32_from_slice(
+ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025));
+ if (v_length == 0) {
+ goto label__loop__continue;
+ }
+ if ((((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
+ goto exit;
+ }
+ }
+ if ((v_dist_minus_1 + 1) >= 8) {
+ wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
+ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1));
+ } else {
+ wuffs_base__io_writer__limited_copy_u32_from_history_fast(
+ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1));
+ }
+ goto label__0__break;
+ }
+ label__0__break:;
+ }
+ label__loop__break:;
+ while (v_n_bits >= 8) {
+ v_n_bits -= 8;
+ if (iop_a_src > io1_a_src) {
+ iop_a_src--;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
+ goto exit;
+ }
+ }
+ self->private_impl.f_bits = (v_bits & ((((uint32_t)(1)) << v_n_bits) - 1));
+ self->private_impl.f_n_bits = v_n_bits;
+ if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+ goto exit;
+ exit:
+ if (a_dst && a_dst->data.ptr) {
+ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
+ }
+ if (a_src && a_src->data.ptr) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+
+ return status;
+}
+
+// -------- func deflate.decoder.decode_huffman_fast64
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_huffman_fast64(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src);
+}
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_huffman_fast64__choosy_default(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ uint64_t v_bits = 0;
+ uint32_t v_n_bits = 0;
+ uint32_t v_table_entry = 0;
+ uint32_t v_table_entry_n_bits = 0;
+ uint64_t v_lmask = 0;
+ uint64_t v_dmask = 0;
+ uint32_t v_redir_top = 0;
+ uint32_t v_redir_mask = 0;
+ uint32_t v_length = 0;
+ uint32_t v_dist_minus_1 = 0;
+ uint32_t v_hlen = 0;
+ uint32_t v_hdist = 0;
+ uint32_t v_hdist_adjustment = 0;
+
+ uint8_t* iop_a_dst = NULL;
+ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_dst && a_dst->data.ptr) {
+ io0_a_dst = a_dst->data.ptr;
+ io1_a_dst = io0_a_dst + a_dst->meta.wi;
+ iop_a_dst = io1_a_dst;
+ io2_a_dst = io0_a_dst + a_dst->data.len;
+ if (a_dst->meta.closed) {
+ io2_a_dst = iop_a_dst;
+ }
+ }
+ const uint8_t* iop_a_src = NULL;
+ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_src && a_src->data.ptr) {
+ io0_a_src = a_src->data.ptr;
+ io1_a_src = io0_a_src + a_src->meta.ri;
+ iop_a_src = io1_a_src;
+ io2_a_src = io0_a_src + a_src->meta.wi;
+ }
+
+ if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+ v_bits = ((uint64_t)(self->private_impl.f_bits));
+ v_n_bits = self->private_impl.f_n_bits;
+ v_lmask = ((((uint64_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1);
+ v_dmask = ((((uint64_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1);
+ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0)) {
+ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
+ goto exit;
+ }
+ v_hdist_adjustment = ((uint32_t)(((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0)) & 4294967295)));
+ label__loop__continue:;
+ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8)) {
+ v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63)));
+ iop_a_src += ((63 - (v_n_bits & 63)) >> 3);
+ v_n_bits |= 56;
+ v_table_entry = self->private_data.f_huffs[0][(v_bits & v_lmask)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ if ((v_table_entry >> 31) != 0) {
+ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1);
+ goto label__loop__continue;
+ } else if ((v_table_entry >> 30) != 0) {
+ } else if ((v_table_entry >> 29) != 0) {
+ self->private_impl.f_end_of_block = true;
+ goto label__loop__break;
+ } else if ((v_table_entry >> 28) != 0) {
+ v_redir_top = ((v_table_entry >> 8) & 65535);
+ v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1);
+ v_table_entry = self->private_data.f_huffs[0][((v_redir_top + (((uint32_t)((v_bits & 4294967295))) & v_redir_mask)) & 1023)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ if ((v_table_entry >> 31) != 0) {
+ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1);
+ goto label__loop__continue;
+ } else if ((v_table_entry >> 30) != 0) {
+ } else if ((v_table_entry >> 29) != 0) {
+ self->private_impl.f_end_of_block = true;
+ goto label__loop__break;
+ } else if ((v_table_entry >> 28) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ } else if ((v_table_entry >> 27) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ } else if ((v_table_entry >> 27) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ v_length = (((v_table_entry >> 8) & 255) + 3);
+ v_table_entry_n_bits = ((v_table_entry >> 4) & 15);
+ if (v_table_entry_n_bits > 0) {
+ v_length = (((v_length + 253 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255) + 3);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ }
+ v_table_entry = self->private_data.f_huffs[1][(v_bits & v_dmask)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ if ((v_table_entry >> 28) == 1) {
+ v_redir_top = ((v_table_entry >> 8) & 65535);
+ v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1);
+ v_table_entry = self->private_data.f_huffs[1][((v_redir_top + (((uint32_t)((v_bits & 4294967295))) & v_redir_mask)) & 1023)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ }
+ if ((v_table_entry >> 24) != 64) {
+ if ((v_table_entry >> 24) == 8) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ }
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ v_dist_minus_1 = ((v_table_entry >> 8) & 32767);
+ v_table_entry_n_bits = ((v_table_entry >> 4) & 15);
+ v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ while (true) {
+ if (((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
+ v_hlen = 0;
+ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
+ if (v_length > v_hdist) {
+ v_length -= v_hdist;
+ v_hlen = v_hdist;
+ } else {
+ v_hlen = v_length;
+ v_length = 0;
+ }
+ v_hdist += v_hdist_adjustment;
+ if (self->private_impl.f_history_index < v_hdist) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
+ goto exit;
+ }
+ wuffs_base__io_writer__limited_copy_u32_from_slice(
+ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025));
+ if (v_length == 0) {
+ goto label__loop__continue;
+ }
+ if ((((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
+ goto exit;
+ }
+ }
+ if ((v_dist_minus_1 + 1) >= 8) {
+ wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
+ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1));
+ } else if ((v_dist_minus_1 + 1) == 1) {
+ wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
+ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1));
+ } else {
+ wuffs_base__io_writer__limited_copy_u32_from_history_fast(
+ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1));
+ }
+ goto label__0__break;
+ }
+ label__0__break:;
+ }
+ label__loop__break:;
+ if (v_n_bits > 63) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+ while (v_n_bits >= 8) {
+ v_n_bits -= 8;
+ if (iop_a_src > io1_a_src) {
+ iop_a_src--;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
+ goto exit;
+ }
+ }
+ self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1)) << v_n_bits) - 1))));
+ self->private_impl.f_n_bits = v_n_bits;
+ if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+ goto exit;
+ exit:
+ if (a_dst && a_dst->data.ptr) {
+ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
+ }
+ if (a_src && a_src->data.ptr) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+
+ return status;
+}
+
+// -------- func deflate.decoder.decode_huffman_slow
+
+static wuffs_base__status
+wuffs_deflate__decoder__decode_huffman_slow(
+ wuffs_deflate__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src) {
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ uint32_t v_bits = 0;
+ uint32_t v_n_bits = 0;
+ uint32_t v_table_entry = 0;
+ uint32_t v_table_entry_n_bits = 0;
+ uint32_t v_lmask = 0;
+ uint32_t v_dmask = 0;
+ uint32_t v_b0 = 0;
+ uint32_t v_redir_top = 0;
+ uint32_t v_redir_mask = 0;
+ uint32_t v_b1 = 0;
+ uint32_t v_length = 0;
+ uint32_t v_b2 = 0;
+ uint32_t v_b3 = 0;
+ uint32_t v_b4 = 0;
+ uint32_t v_dist_minus_1 = 0;
+ uint32_t v_b5 = 0;
+ uint32_t v_n_copied = 0;
+ uint32_t v_hlen = 0;
+ uint32_t v_hdist = 0;
+
+ uint8_t* iop_a_dst = NULL;
+ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_dst && a_dst->data.ptr) {
+ io0_a_dst = a_dst->data.ptr;
+ io1_a_dst = io0_a_dst + a_dst->meta.wi;
+ iop_a_dst = io1_a_dst;
+ io2_a_dst = io0_a_dst + a_dst->data.len;
+ if (a_dst->meta.closed) {
+ io2_a_dst = iop_a_dst;
+ }
+ }
+ const uint8_t* iop_a_src = NULL;
+ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_src && a_src->data.ptr) {
+ io0_a_src = a_src->data.ptr;
+ io1_a_src = io0_a_src + a_src->meta.ri;
+ iop_a_src = io1_a_src;
+ io2_a_src = io0_a_src + a_src->meta.wi;
+ }
+
+ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow[0];
+ if (coro_susp_point) {
+ v_bits = self->private_data.s_decode_huffman_slow[0].v_bits;
+ v_n_bits = self->private_data.s_decode_huffman_slow[0].v_n_bits;
+ v_table_entry_n_bits = self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits;
+ v_lmask = self->private_data.s_decode_huffman_slow[0].v_lmask;
+ v_dmask = self->private_data.s_decode_huffman_slow[0].v_dmask;
+ v_redir_top = self->private_data.s_decode_huffman_slow[0].v_redir_top;
+ v_redir_mask = self->private_data.s_decode_huffman_slow[0].v_redir_mask;
+ v_length = self->private_data.s_decode_huffman_slow[0].v_length;
+ v_dist_minus_1 = self->private_data.s_decode_huffman_slow[0].v_dist_minus_1;
+ }
+ switch (coro_susp_point) {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+ if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+ v_bits = self->private_impl.f_bits;
+ v_n_bits = self->private_impl.f_n_bits;
+ v_lmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1);
+ v_dmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1);
+ label__loop__continue:;
+ while ( ! (self->private_impl.p_decode_huffman_slow[0] != 0)) {
+ while (true) {
+ v_table_entry = self->private_data.f_huffs[0][(v_bits & v_lmask)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ if (v_n_bits >= v_table_entry_n_bits) {
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ goto label__0__break;
+ }
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_0 = *iop_a_src++;
+ v_b0 = t_0;
+ }
+ v_bits |= (v_b0 << v_n_bits);
+ v_n_bits += 8;
+ }
+ label__0__break:;
+ if ((v_table_entry >> 31) != 0) {
+ self->private_data.s_decode_huffman_slow[0].scratch = ((uint8_t)(((v_table_entry >> 8) & 255)));
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+ if (iop_a_dst == io2_a_dst) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_write);
+ goto suspend;
+ }
+ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow[0].scratch));
+ goto label__loop__continue;
+ } else if ((v_table_entry >> 30) != 0) {
+ } else if ((v_table_entry >> 29) != 0) {
+ self->private_impl.f_end_of_block = true;
+ goto label__loop__break;
+ } else if ((v_table_entry >> 28) != 0) {
+ v_redir_top = ((v_table_entry >> 8) & 65535);
+ v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1);
+ while (true) {
+ v_table_entry = self->private_data.f_huffs[0][((v_redir_top + (v_bits & v_redir_mask)) & 1023)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ if (v_n_bits >= v_table_entry_n_bits) {
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ goto label__1__break;
+ }
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_1 = *iop_a_src++;
+ v_b1 = t_1;
+ }
+ v_bits |= (v_b1 << v_n_bits);
+ v_n_bits += 8;
+ }
+ label__1__break:;
+ if ((v_table_entry >> 31) != 0) {
+ self->private_data.s_decode_huffman_slow[0].scratch = ((uint8_t)(((v_table_entry >> 8) & 255)));
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+ if (iop_a_dst == io2_a_dst) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_write);
+ goto suspend;
+ }
+ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow[0].scratch));
+ goto label__loop__continue;
+ } else if ((v_table_entry >> 30) != 0) {
+ } else if ((v_table_entry >> 29) != 0) {
+ self->private_impl.f_end_of_block = true;
+ goto label__loop__break;
+ } else if ((v_table_entry >> 28) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ } else if ((v_table_entry >> 27) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ } else if ((v_table_entry >> 27) != 0) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ } else {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ v_length = (((v_table_entry >> 8) & 255) + 3);
+ v_table_entry_n_bits = ((v_table_entry >> 4) & 15);
+ if (v_table_entry_n_bits > 0) {
+ while (v_n_bits < v_table_entry_n_bits) {
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_2 = *iop_a_src++;
+ v_b2 = t_2;
+ }
+ v_bits |= (v_b2 << v_n_bits);
+ v_n_bits += 8;
+ }
+ v_length = (((v_length + 253 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255) + 3);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ }
+ while (true) {
+ v_table_entry = self->private_data.f_huffs[1][(v_bits & v_dmask)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ if (v_n_bits >= v_table_entry_n_bits) {
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ goto label__2__break;
+ }
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_3 = *iop_a_src++;
+ v_b3 = t_3;
+ }
+ v_bits |= (v_b3 << v_n_bits);
+ v_n_bits += 8;
+ }
+ label__2__break:;
+ if ((v_table_entry >> 28) == 1) {
+ v_redir_top = ((v_table_entry >> 8) & 65535);
+ v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1);
+ while (true) {
+ v_table_entry = self->private_data.f_huffs[1][((v_redir_top + (v_bits & v_redir_mask)) & 1023)];
+ v_table_entry_n_bits = (v_table_entry & 15);
+ if (v_n_bits >= v_table_entry_n_bits) {
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ goto label__3__break;
+ }
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_4 = *iop_a_src++;
+ v_b4 = t_4;
+ }
+ v_bits |= (v_b4 << v_n_bits);
+ v_n_bits += 8;
+ }
+ label__3__break:;
+ }
+ if ((v_table_entry >> 24) != 64) {
+ if ((v_table_entry >> 24) == 8) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
+ goto exit;
+ }
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
+ goto exit;
+ }
+ v_dist_minus_1 = ((v_table_entry >> 8) & 32767);
+ v_table_entry_n_bits = ((v_table_entry >> 4) & 15);
+ if (v_table_entry_n_bits > 0) {
+ while (v_n_bits < v_table_entry_n_bits) {
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint32_t t_5 = *iop_a_src++;
+ v_b5 = t_5;
+ }
+ v_bits |= (v_b5 << v_n_bits);
+ v_n_bits += 8;
+ }
+ v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767);
+ v_bits >>= v_table_entry_n_bits;
+ v_n_bits -= v_table_entry_n_bits;
+ }
+ label__inner__continue:;
+ while (true) {
+ if (((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
+ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
+ if (v_hdist < v_length) {
+ v_hlen = v_hdist;
+ } else {
+ v_hlen = v_length;
+ }
+ v_hdist += ((uint32_t)((((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0))) & 4294967295)));
+ if (self->private_impl.f_history_index < v_hdist) {
+ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
+ goto exit;
+ }
+ v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_slice(
+ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025));
+ if (v_n_copied < v_hlen) {
+ v_length -= v_n_copied;
+ status = wuffs_base__make_status(wuffs_base__suspension__short_write);
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
+ goto label__inner__continue;
+ }
+ v_length -= v_hlen;
+ if (v_length == 0) {
+ goto label__loop__continue;
+ }
+ }
+ v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_history(
+ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1));
+ if (v_length <= v_n_copied) {
+ goto label__loop__continue;
+ }
+ v_length -= v_n_copied;
+ status = wuffs_base__make_status(wuffs_base__suspension__short_write);
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
+ }
+ }
+ label__loop__break:;
+ self->private_impl.f_bits = v_bits;
+ self->private_impl.f_n_bits = v_n_bits;
+ if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) {
+ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
+ goto exit;
+ }
+
+ ok:
+ self->private_impl.p_decode_huffman_slow[0] = 0;
+ goto exit;
+ }
+
+ goto suspend;
+ suspend:
+ self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+ self->private_data.s_decode_huffman_slow[0].v_bits = v_bits;
+ self->private_data.s_decode_huffman_slow[0].v_n_bits = v_n_bits;
+ self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits = v_table_entry_n_bits;
+ self->private_data.s_decode_huffman_slow[0].v_lmask = v_lmask;
+ self->private_data.s_decode_huffman_slow[0].v_dmask = v_dmask;
+ self->private_data.s_decode_huffman_slow[0].v_redir_top = v_redir_top;
+ self->private_data.s_decode_huffman_slow[0].v_redir_mask = v_redir_mask;
+ self->private_data.s_decode_huffman_slow[0].v_length = v_length;
+ self->private_data.s_decode_huffman_slow[0].v_dist_minus_1 = v_dist_minus_1;
+
+ goto exit;
+ exit:
+ if (a_dst && a_dst->data.ptr) {
+ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
+ }
+ if (a_src && a_src->data.ptr) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+
+ return status;
+}
+
+#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE)
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB)
+
+// ---------------- Status Codes Implementations
+
+const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required";
+const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum";
+const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method";
+const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size";
+const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check";
+const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary";
+const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input";
+
+// ---------------- Private Consts
+
+#define WUFFS_ZLIB__QUIRKS_BASE 2113790976
+
+#define WUFFS_ZLIB__QUIRKS_COUNT 1
+
+// ---------------- Private Initializer Prototypes
+
+// ---------------- Private Function Prototypes
+
+static wuffs_base__status
+wuffs_zlib__decoder__do_transform_io(
+ wuffs_zlib__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf);
+
+// ---------------- VTables
+
+const wuffs_base__io_transformer__func_ptrs
+wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = {
+ (wuffs_base__empty_struct(*)(void*,
+ uint32_t,
+ bool))(&wuffs_zlib__decoder__set_quirk_enabled),
+ (wuffs_base__status(*)(void*,
+ wuffs_base__io_buffer*,
+ wuffs_base__io_buffer*,
+ wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io),
+ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len),
+};
+
+// ---------------- Initializer Implementations
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_zlib__decoder__initialize(
+ wuffs_zlib__decoder* self,
+ size_t sizeof_star_self,
+ uint64_t wuffs_version,
+ uint32_t options){
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (sizeof(*self) != sizeof_star_self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
+ }
+ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
+ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
+ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
+ }
+
+ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+ // The whole point of this if-check is to detect an uninitialized *self.
+ // We disable the warning on GCC. Clang-5.0 does not have this warning.
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#endif
+ if (self->private_impl.magic != 0) {
+ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
+ }
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ } else {
+ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+ memset(self, 0, sizeof(*self));
+ options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+ } else {
+ memset(&(self->private_impl), 0, sizeof(self->private_impl));
+ }
+ }
+
+ {
+ wuffs_base__status z = wuffs_adler32__hasher__initialize(
+ &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options);
+ if (z.repr) {
+ return z;
+ }
+ }
+ {
+ wuffs_base__status z = wuffs_adler32__hasher__initialize(
+ &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options);
+ if (z.repr) {
+ return z;
+ }
+ }
+ {
+ wuffs_base__status z = wuffs_deflate__decoder__initialize(
+ &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options);
+ if (z.repr) {
+ return z;
+ }
+ }
+ self->private_impl.magic = WUFFS_BASE__MAGIC;
+ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
+ wuffs_base__io_transformer__vtable_name;
+ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
+ (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer);
+ return wuffs_base__make_status(NULL);
+}
+
+wuffs_zlib__decoder*
+wuffs_zlib__decoder__alloc() {
+ wuffs_zlib__decoder* x =
+ (wuffs_zlib__decoder*)(calloc(sizeof(wuffs_zlib__decoder), 1));
+ if (!x) {
+ return NULL;
+ }
+ if (wuffs_zlib__decoder__initialize(
+ x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
+ free(x);
+ return NULL;
+ }
+ return x;
+}
+
+size_t
+sizeof__wuffs_zlib__decoder() {
+ return sizeof(wuffs_zlib__decoder);
+}
+
+// ---------------- Function Implementations
+
+// -------- func zlib.decoder.dictionary_id
+
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_zlib__decoder__dictionary_id(
+ const wuffs_zlib__decoder* self) {
+ if (!self) {
+ return 0;
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return 0;
+ }
+
+ return self->private_impl.f_dict_id_want;
+}
+
+// -------- func zlib.decoder.add_dictionary
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_zlib__decoder__add_dictionary(
+ wuffs_zlib__decoder* self,
+ wuffs_base__slice_u8 a_dict) {
+ if (!self) {
+ return wuffs_base__make_empty_struct();
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_empty_struct();
+ }
+
+ if (self->private_impl.f_header_complete) {
+ self->private_impl.f_bad_call_sequence = true;
+ } else {
+ self->private_impl.f_dict_id_got = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict);
+ wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict);
+ }
+ self->private_impl.f_got_dictionary = true;
+ return wuffs_base__make_empty_struct();
+}
+
+// -------- func zlib.decoder.set_quirk_enabled
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_zlib__decoder__set_quirk_enabled(
+ wuffs_zlib__decoder* self,
+ uint32_t a_quirk,
+ bool a_enabled) {
+ if (!self) {
+ return wuffs_base__make_empty_struct();
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_empty_struct();
+ }
+
+ if (self->private_impl.f_header_complete) {
+ self->private_impl.f_bad_call_sequence = true;
+ } else if (a_quirk == 1) {
+ self->private_impl.f_ignore_checksum = a_enabled;
+ } else if (a_quirk >= 2113790976) {
+ a_quirk -= 2113790976;
+ if (a_quirk < 1) {
+ self->private_impl.f_quirks[a_quirk] = a_enabled;
+ }
+ }
+ return wuffs_base__make_empty_struct();
+}
+
+// -------- func zlib.decoder.workbuf_len
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_zlib__decoder__workbuf_len(
+ const wuffs_zlib__decoder* self) {
+ if (!self) {
+ return wuffs_base__utility__empty_range_ii_u64();
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return wuffs_base__utility__empty_range_ii_u64();
+ }
+
+ return wuffs_base__utility__make_range_ii_u64(1, 1);
+}
+
+// -------- func zlib.decoder.transform_io
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_zlib__decoder__transform_io(
+ wuffs_zlib__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf) {
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_status(
+ (self->private_impl.magic == WUFFS_BASE__DISABLED)
+ ? wuffs_base__error__disabled_by_previous_error
+ : wuffs_base__error__initialize_not_called);
+ }
+ if (!a_dst || !a_src) {
+ self->private_impl.magic = WUFFS_BASE__DISABLED;
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ if ((self->private_impl.active_coroutine != 0) &&
+ (self->private_impl.active_coroutine != 1)) {
+ self->private_impl.magic = WUFFS_BASE__DISABLED;
+ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
+ }
+ self->private_impl.active_coroutine = 0;
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+ uint32_t coro_susp_point = self->private_impl.p_transform_io[0];
+ switch (coro_susp_point) {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+ while (true) {
+ {
+ wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
+ v_status = t_0;
+ }
+ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
+ status = wuffs_base__make_status(wuffs_zlib__error__truncated_input);
+ goto exit;
+ }
+ status = v_status;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
+ }
+
+ ok:
+ self->private_impl.p_transform_io[0] = 0;
+ goto exit;
+ }
+
+ goto suspend;
+ suspend:
+ self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
+
+ goto exit;
+ exit:
+ if (wuffs_base__status__is_error(&status)) {
+ self->private_impl.magic = WUFFS_BASE__DISABLED;
+ }
+ return status;
+}
+
+// -------- func zlib.decoder.do_transform_io
+
+static wuffs_base__status
+wuffs_zlib__decoder__do_transform_io(
+ wuffs_zlib__decoder* self,
+ wuffs_base__io_buffer* a_dst,
+ wuffs_base__io_buffer* a_src,
+ wuffs_base__slice_u8 a_workbuf) {
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ uint16_t v_x = 0;
+ uint32_t v_checksum_got = 0;
+ wuffs_base__status v_status = wuffs_base__make_status(NULL);
+ uint32_t v_checksum_want = 0;
+ uint64_t v_mark = 0;
+
+ uint8_t* iop_a_dst = NULL;
+ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_dst && a_dst->data.ptr) {
+ io0_a_dst = a_dst->data.ptr;
+ io1_a_dst = io0_a_dst + a_dst->meta.wi;
+ iop_a_dst = io1_a_dst;
+ io2_a_dst = io0_a_dst + a_dst->data.len;
+ if (a_dst->meta.closed) {
+ io2_a_dst = iop_a_dst;
+ }
+ }
+ const uint8_t* iop_a_src = NULL;
+ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+ if (a_src && a_src->data.ptr) {
+ io0_a_src = a_src->data.ptr;
+ io1_a_src = io0_a_src + a_src->meta.ri;
+ iop_a_src = io1_a_src;
+ io2_a_src = io0_a_src + a_src->meta.wi;
+ }
+
+ uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0];
+ if (coro_susp_point) {
+ v_checksum_got = self->private_data.s_do_transform_io[0].v_checksum_got;
+ }
+ switch (coro_susp_point) {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+ if (self->private_impl.f_bad_call_sequence) {
+ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
+ goto exit;
+ } else if (self->private_impl.f_quirks[0]) {
+ } else if ( ! self->private_impl.f_want_dictionary) {
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+ uint16_t t_0;
+ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
+ t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
+ iop_a_src += 2;
+ } else {
+ self->private_data.s_do_transform_io[0].scratch = 0;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+ while (true) {
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch;
+ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF));
+ *scratch >>= 8;
+ *scratch <<= 8;
+ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
+ if (num_bits_0 == 8) {
+ t_0 = ((uint16_t)(*scratch >> 48));
+ break;
+ }
+ num_bits_0 += 8;
+ *scratch |= ((uint64_t)(num_bits_0));
+ }
+ }
+ v_x = t_0;
+ }
+ if (((v_x >> 8) & 15) != 8) {
+ status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method);
+ goto exit;
+ }
+ if ((v_x >> 12) > 7) {
+ status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size);
+ goto exit;
+ }
+ if ((v_x % 31) != 0) {
+ status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check);
+ goto exit;
+ }
+ self->private_impl.f_want_dictionary = ((v_x & 32) != 0);
+ if (self->private_impl.f_want_dictionary) {
+ self->private_impl.f_dict_id_got = 1;
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+ uint32_t t_1;
+ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
+ iop_a_src += 4;
+ } else {
+ self->private_data.s_do_transform_io[0].scratch = 0;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+ while (true) {
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch;
+ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF));
+ *scratch >>= 8;
+ *scratch <<= 8;
+ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
+ if (num_bits_1 == 24) {
+ t_1 = ((uint32_t)(*scratch >> 32));
+ break;
+ }
+ num_bits_1 += 8;
+ *scratch |= ((uint64_t)(num_bits_1));
+ }
+ }
+ self->private_impl.f_dict_id_want = t_1;
+ }
+ status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required);
+ goto ok;
+ } else if (self->private_impl.f_got_dictionary) {
+ status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary);
+ goto exit;
+ }
+ } else if (self->private_impl.f_dict_id_got != self->private_impl.f_dict_id_want) {
+ if (self->private_impl.f_got_dictionary) {
+ status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary);
+ goto exit;
+ }
+ status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required);
+ goto ok;
+ }
+ self->private_impl.f_header_complete = true;
+ while (true) {
+ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
+ {
+ if (a_dst) {
+ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
+ }
+ if (a_src) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+ wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf);
+ v_status = t_2;
+ if (a_dst) {
+ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
+ }
+ if (a_src) {
+ iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ }
+ }
+ if ( ! self->private_impl.f_ignore_checksum && ! self->private_impl.f_quirks[0]) {
+ v_checksum_got = wuffs_adler32__hasher__update_u32(&self->private_data.f_checksum, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
+ }
+ if (wuffs_base__status__is_ok(&v_status)) {
+ goto label__0__break;
+ }
+ status = v_status;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
+ }
+ label__0__break:;
+ if ( ! self->private_impl.f_quirks[0]) {
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
+ uint32_t t_3;
+ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
+ iop_a_src += 4;
+ } else {
+ self->private_data.s_do_transform_io[0].scratch = 0;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
+ while (true) {
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+ goto suspend;
+ }
+ uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch;
+ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFF));
+ *scratch >>= 8;
+ *scratch <<= 8;
+ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
+ if (num_bits_3 == 24) {
+ t_3 = ((uint32_t)(*scratch >> 32));
+ break;
+ }
+ num_bits_3 += 8;
+ *scratch |= ((uint64_t)(num_bits_3));
+ }
+ }
+ v_checksum_want = t_3;
+ }
+ if ( ! self->private_impl.f_ignore_checksum && (v_checksum_got != v_checksum_want)) {
+ status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum);
+ goto exit;
+ }
+ }
+
+ ok:
+ self->private_impl.p_do_transform_io[0] = 0;
+ goto exit;
+ }
+
+ goto suspend;
+ suspend:
+ self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+ self->private_data.s_do_transform_io[0].v_checksum_got = v_checksum_got;
+
+ goto exit;
+ exit:
+ if (a_dst && a_dst->data.ptr) {
+ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
+ }
+ if (a_src && a_src->data.ptr) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+
+ return status;
+}
+
+#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB)
+
+
+
+#endif // WUFFS_IMPLEMENTATION
+
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#elif defined(__clang__)
+#pragma clang diagnostic pop
+#endif
+
+#endif // WUFFS_INCLUDE_GUARD
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/common/cxxopts.hpp b/graphics/asymptote/tinyexr/examples/common/cxxopts.hpp
index 6a6a85f035..6a6a85f035 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/common/cxxopts.hpp
+++ b/graphics/asymptote/tinyexr/examples/common/cxxopts.hpp
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/common/stb_image.h b/graphics/asymptote/tinyexr/examples/common/stb_image.h
index d9c21bc813..d9c21bc813 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/common/stb_image.h
+++ b/graphics/asymptote/tinyexr/examples/common/stb_image.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/common/stb_image_resize.h b/graphics/asymptote/tinyexr/examples/common/stb_image_resize.h
index bcca92c2dc..bcca92c2dc 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/common/stb_image_resize.h
+++ b/graphics/asymptote/tinyexr/examples/common/stb_image_resize.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/common/stb_image_write.h b/graphics/asymptote/tinyexr/examples/common/stb_image_write.h
index 4319c0de1d..4319c0de1d 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/common/stb_image_write.h
+++ b/graphics/asymptote/tinyexr/examples/common/stb_image_write.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/cube2longlat/Makefile b/graphics/asymptote/tinyexr/examples/cube2longlat/Makefile
index 6868dd9ac6..6868dd9ac6 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/cube2longlat/Makefile
+++ b/graphics/asymptote/tinyexr/examples/cube2longlat/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/cube2longlat/README.md b/graphics/asymptote/tinyexr/examples/cube2longlat/README.md
index 06a9e3c0ac..06a9e3c0ac 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/cube2longlat/README.md
+++ b/graphics/asymptote/tinyexr/examples/cube2longlat/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/cube2longlat/cube2longlat.cc b/graphics/asymptote/tinyexr/examples/cube2longlat/cube2longlat.cc
index 5a389c18cf..5a389c18cf 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/cube2longlat/cube2longlat.cc
+++ b/graphics/asymptote/tinyexr/examples/cube2longlat/cube2longlat.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/deepview/Makefile b/graphics/asymptote/tinyexr/examples/deepview/Makefile
index b3dafd7877..b3dafd7877 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/deepview/Makefile
+++ b/graphics/asymptote/tinyexr/examples/deepview/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/deepview/deepview_screencast.gif b/graphics/asymptote/tinyexr/examples/deepview/deepview_screencast.gif
index 6a9560efbf..6a9560efbf 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/deepview/deepview_screencast.gif
+++ b/graphics/asymptote/tinyexr/examples/deepview/deepview_screencast.gif
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/deepview/main.cc b/graphics/asymptote/tinyexr/examples/deepview/main.cc
index 4c996d5b81..4c996d5b81 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/deepview/main.cc
+++ b/graphics/asymptote/tinyexr/examples/deepview/main.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/deepview/trackball.cc b/graphics/asymptote/tinyexr/examples/deepview/trackball.cc
index f23d3db30b..f23d3db30b 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/deepview/trackball.cc
+++ b/graphics/asymptote/tinyexr/examples/deepview/trackball.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/deepview/trackball.h b/graphics/asymptote/tinyexr/examples/deepview/trackball.h
index 68a83d1609..68a83d1609 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/deepview/trackball.h
+++ b/graphics/asymptote/tinyexr/examples/deepview/trackball.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/Makefile b/graphics/asymptote/tinyexr/examples/exr2fptiff/Makefile
index 68789d2009..68789d2009 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/Makefile
+++ b/graphics/asymptote/tinyexr/examples/exr2fptiff/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/README.md b/graphics/asymptote/tinyexr/examples/exr2fptiff/README.md
index 3c3a2390dd..3c3a2390dd 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/README.md
+++ b/graphics/asymptote/tinyexr/examples/exr2fptiff/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/exr2fptiff.cc b/graphics/asymptote/tinyexr/examples/exr2fptiff/exr2fptiff.cc
index fd101bb6a0..fd101bb6a0 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/exr2fptiff.cc
+++ b/graphics/asymptote/tinyexr/examples/exr2fptiff/exr2fptiff.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/tiny_dng_writer.h b/graphics/asymptote/tinyexr/examples/exr2fptiff/tiny_dng_writer.h
index 6156821f3c..6156821f3c 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exr2fptiff/tiny_dng_writer.h
+++ b/graphics/asymptote/tinyexr/examples/exr2fptiff/tiny_dng_writer.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exr2ldr/Makefile b/graphics/asymptote/tinyexr/examples/exr2ldr/Makefile
index 532212ee4a..532212ee4a 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exr2ldr/Makefile
+++ b/graphics/asymptote/tinyexr/examples/exr2ldr/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exr2ldr/exr2ldr.cc b/graphics/asymptote/tinyexr/examples/exr2ldr/exr2ldr.cc
index a401211cb5..a401211cb5 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exr2ldr/exr2ldr.cc
+++ b/graphics/asymptote/tinyexr/examples/exr2ldr/exr2ldr.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exr2rgbe/Makefile b/graphics/asymptote/tinyexr/examples/exr2rgbe/Makefile
index f0356eb491..f0356eb491 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exr2rgbe/Makefile
+++ b/graphics/asymptote/tinyexr/examples/exr2rgbe/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exr2rgbe/exr2rgbe.cc b/graphics/asymptote/tinyexr/examples/exr2rgbe/exr2rgbe.cc
index 2631590488..2631590488 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exr2rgbe/exr2rgbe.cc
+++ b/graphics/asymptote/tinyexr/examples/exr2rgbe/exr2rgbe.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrfilter/Makefile b/graphics/asymptote/tinyexr/examples/exrfilter/Makefile
index c2e740ce0d..c2e740ce0d 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrfilter/Makefile
+++ b/graphics/asymptote/tinyexr/examples/exrfilter/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrfilter/README.md b/graphics/asymptote/tinyexr/examples/exrfilter/README.md
index 8317ac1bad..8317ac1bad 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrfilter/README.md
+++ b/graphics/asymptote/tinyexr/examples/exrfilter/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrfilter/exrfilter.cc b/graphics/asymptote/tinyexr/examples/exrfilter/exrfilter.cc
index b766c1d622..b766c1d622 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrfilter/exrfilter.cc
+++ b/graphics/asymptote/tinyexr/examples/exrfilter/exrfilter.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/DroidSans.ttf b/graphics/asymptote/tinyexr/examples/exrview/DroidSans.ttf
index 767c63ad00..767c63ad00 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/DroidSans.ttf
+++ b/graphics/asymptote/tinyexr/examples/exrview/DroidSans.ttf
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/CommonWindowInterface.h b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/CommonWindowInterface.h
index 346fdac72a..346fdac72a 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/CommonWindowInterface.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/CommonWindowInterface.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.h b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.h
index 0d61f67567..0d61f67567 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.mm b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.mm
index 8cab041af3..8cab041af3 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.mm
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.mm
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/OpenGL2Include.h b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/OpenGL2Include.h
index 34caaaf07e..34caaaf07e 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/OpenGL2Include.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/OpenGL2Include.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/OpenGLInclude.h b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/OpenGLInclude.h
index 19219a188f..19219a188f 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/OpenGLInclude.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/OpenGLInclude.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32InternalWindowData.h b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32InternalWindowData.h
index a512bc7630..a512bc7630 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32InternalWindowData.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32InternalWindowData.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.cpp b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.cpp
index 0e076b92c2..0e076b92c2 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.cpp
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.cpp
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.h b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.h
index 901ce6518b..901ce6518b 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32Window.cpp b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32Window.cpp
index 029a098f2c..029a098f2c 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32Window.cpp
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32Window.cpp
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32Window.h b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32Window.h
index d10e65d6ec..d10e65d6ec 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32Window.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/Win32Window.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.cpp b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.cpp
index 68aa22720b..68aa22720b 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.cpp
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.cpp
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.h b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.h
index 3d8eac1fcc..3d8eac1fcc 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/README.md b/graphics/asymptote/tinyexr/examples/exrview/README.md
index 4e5947a212..4e5947a212 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/README.md
+++ b/graphics/asymptote/tinyexr/examples/exrview/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glew.h b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glew.h
index f33e7d458e..f33e7d458e 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glew.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glew.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glxew.h b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glxew.h
index 6115d611e1..6115d611e1 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glxew.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glxew.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/wglew.h b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/wglew.h
index 8659841d35..8659841d35 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/wglew.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/wglew.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/glew.c b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/glew.c
index 1be61489e0..1be61489e0 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/glew.c
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/Glew/glew.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/LICENSE b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/LICENSE
index 3ab103c551..3ab103c551 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/LICENSE
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/LICENSE
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/README.md b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/README.md
index 7ff1008a39..7ff1008a39 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/README.md
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_cocoa.png b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_cocoa.png
index 932306ebac..932306ebac 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_cocoa.png
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_cocoa.png
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_gtk3.png b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_gtk3.png
index f835396e66..f835396e66 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_gtk3.png
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_gtk3.png
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_win8.png b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_win8.png
index 3ce0a5a3fa..3ce0a5a3fa 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_win8.png
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_win8.png
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/SConstruct b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/SConstruct
index 342fa1a3a8..342fa1a3a8 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/SConstruct
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/SConstruct
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/common.h b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/common.h
index 688b0b1fdc..688b0b1fdc 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/common.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/common.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/include/nfd.h b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/include/nfd.h
index 03fe532069..03fe532069 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/include/nfd.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/include/nfd.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_cocoa.m b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_cocoa.m
index a73e15714a..a73e15714a 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_cocoa.m
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_cocoa.m
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.c b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.c
index 269fbd2135..269fbd2135 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.c
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.h b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.h
index a3f6b4ad64..a3f6b4ad64 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_gtk.c b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_gtk.c
index 2d7b9b5f6e..2d7b9b5f6e 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_gtk.c
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_gtk.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_win.cpp b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_win.cpp
index b065d69cb7..b065d69cb7 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_win.cpp
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_win.cpp
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/SConstruct b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/SConstruct
index 14e98912b4..14e98912b4 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/SConstruct
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/SConstruct
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialog.c b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialog.c
index 2984acf990..2984acf990 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialog.c
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialog.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialogmultiple.c b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialogmultiple.c
index 16cd675542..16cd675542 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialogmultiple.c
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialogmultiple.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_savedialog.c b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_savedialog.c
index 4e1f69efc4..4e1f69efc4 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_savedialog.c
+++ b/graphics/asymptote/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_savedialog.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/exr-io.cc b/graphics/asymptote/tinyexr/examples/exrview/exr-io.cc
index 5c2821b75b..5c2821b75b 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/exr-io.cc
+++ b/graphics/asymptote/tinyexr/examples/exrview/exr-io.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/exr-io.h b/graphics/asymptote/tinyexr/examples/exrview/exr-io.h
index d338ff6977..d338ff6977 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/exr-io.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/exr-io.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/findOpenGLGlewGlut.lua b/graphics/asymptote/tinyexr/examples/exrview/findOpenGLGlewGlut.lua
index c3c3582ff6..c3c3582ff6 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/findOpenGLGlewGlut.lua
+++ b/graphics/asymptote/tinyexr/examples/exrview/findOpenGLGlewGlut.lua
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/main.cc b/graphics/asymptote/tinyexr/examples/exrview/main.cc
index 2254fe7078..2254fe7078 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/main.cc
+++ b/graphics/asymptote/tinyexr/examples/exrview/main.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/nuklear.h b/graphics/asymptote/tinyexr/examples/exrview/nuklear.h
index 15f2cc7bf3..15f2cc7bf3 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/nuklear.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/nuklear.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/nuklear_btgui_gl2.h b/graphics/asymptote/tinyexr/examples/exrview/nuklear_btgui_gl2.h
index a89dae4db7..a89dae4db7 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/nuklear_btgui_gl2.h
+++ b/graphics/asymptote/tinyexr/examples/exrview/nuklear_btgui_gl2.h
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/premake4.lua b/graphics/asymptote/tinyexr/examples/exrview/premake4.lua
index caccd7cde7..caccd7cde7 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/premake4.lua
+++ b/graphics/asymptote/tinyexr/examples/exrview/premake4.lua
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/screenshots/exrview.png b/graphics/asymptote/tinyexr/examples/exrview/screenshots/exrview.png
index 67bec21c24..67bec21c24 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/screenshots/exrview.png
+++ b/graphics/asymptote/tinyexr/examples/exrview/screenshots/exrview.png
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/shader.frag b/graphics/asymptote/tinyexr/examples/exrview/shader.frag
index 2ad28caef8..2ad28caef8 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/shader.frag
+++ b/graphics/asymptote/tinyexr/examples/exrview/shader.frag
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/shader.vert b/graphics/asymptote/tinyexr/examples/exrview/shader.vert
index e0f91b3ab4..e0f91b3ab4 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/exrview/shader.vert
+++ b/graphics/asymptote/tinyexr/examples/exrview/shader.vert
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/ldr2exr/Makefile b/graphics/asymptote/tinyexr/examples/ldr2exr/Makefile
index 5ae4ee63be..5ae4ee63be 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/ldr2exr/Makefile
+++ b/graphics/asymptote/tinyexr/examples/ldr2exr/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/ldr2exr/ldr2exr.cc b/graphics/asymptote/tinyexr/examples/ldr2exr/ldr2exr.cc
index 63e0c8a736..63e0c8a736 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/ldr2exr/ldr2exr.cc
+++ b/graphics/asymptote/tinyexr/examples/ldr2exr/ldr2exr.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/Makefile b/graphics/asymptote/tinyexr/examples/nornalmap/Makefile
index eacf84b5f2..eacf84b5f2 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/Makefile
+++ b/graphics/asymptote/tinyexr/examples/nornalmap/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/README.md b/graphics/asymptote/tinyexr/examples/nornalmap/README.md
index 4cbf4b5304..4cbf4b5304 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/README.md
+++ b/graphics/asymptote/tinyexr/examples/nornalmap/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/main.cc b/graphics/asymptote/tinyexr/examples/nornalmap/main.cc
index 6571739ff3..6571739ff3 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/main.cc
+++ b/graphics/asymptote/tinyexr/examples/nornalmap/main.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/resize/Makefile b/graphics/asymptote/tinyexr/examples/resize/Makefile
index 423b221406..423b221406 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/resize/Makefile
+++ b/graphics/asymptote/tinyexr/examples/resize/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/resize/resize.cc b/graphics/asymptote/tinyexr/examples/resize/resize.cc
index c78d9a8790..c78d9a8790 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/resize/resize.cc
+++ b/graphics/asymptote/tinyexr/examples/resize/resize.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/rgbe2exr/Makefile b/graphics/asymptote/tinyexr/examples/rgbe2exr/Makefile
index 32b5afd84e..32b5afd84e 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/rgbe2exr/Makefile
+++ b/graphics/asymptote/tinyexr/examples/rgbe2exr/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/rgbe2exr/rgbe2exr.cc b/graphics/asymptote/tinyexr/examples/rgbe2exr/rgbe2exr.cc
index c0da5a6d60..c0da5a6d60 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/rgbe2exr/rgbe2exr.cc
+++ b/graphics/asymptote/tinyexr/examples/rgbe2exr/rgbe2exr.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/testmapgen/Makefile b/graphics/asymptote/tinyexr/examples/testmapgen/Makefile
index 0dc31f69d0..0dc31f69d0 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/testmapgen/Makefile
+++ b/graphics/asymptote/tinyexr/examples/testmapgen/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/testmapgen/README.md b/graphics/asymptote/tinyexr/examples/testmapgen/README.md
index 0b5fe97d5d..0b5fe97d5d 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/testmapgen/README.md
+++ b/graphics/asymptote/tinyexr/examples/testmapgen/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/examples/testmapgen/testmapgen.cc b/graphics/asymptote/tinyexr/examples/testmapgen/testmapgen.cc
index 79514652a6..79514652a6 100644
--- a/graphics/asymptote/cudareflect/tinyexr/examples/testmapgen/testmapgen.cc
+++ b/graphics/asymptote/tinyexr/examples/testmapgen/testmapgen.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/experimental/js/Makefile b/graphics/asymptote/tinyexr/experimental/js/Makefile
index 4f83f29a74..4f83f29a74 100644
--- a/graphics/asymptote/cudareflect/tinyexr/experimental/js/Makefile
+++ b/graphics/asymptote/tinyexr/experimental/js/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/experimental/js/README.md b/graphics/asymptote/tinyexr/experimental/js/README.md
index 9132541327..9132541327 100644
--- a/graphics/asymptote/cudareflect/tinyexr/experimental/js/README.md
+++ b/graphics/asymptote/tinyexr/experimental/js/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/experimental/js/binding.cc b/graphics/asymptote/tinyexr/experimental/js/binding.cc
index 4f6856848b..4f6856848b 100644
--- a/graphics/asymptote/cudareflect/tinyexr/experimental/js/binding.cc
+++ b/graphics/asymptote/tinyexr/experimental/js/binding.cc
diff --git a/graphics/asymptote/tinyexr/experimental/js/compile_to_js.sh b/graphics/asymptote/tinyexr/experimental/js/compile_to_js.sh
new file mode 100755
index 0000000000..e2c9cba764
--- /dev/null
+++ b/graphics/asymptote/tinyexr/experimental/js/compile_to_js.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+EMCC=em++
+
+# Export EXR loader/saver function to JS.
+# TODO: export more functions
+# DEMANGLE_SUPPORT=1
+#${EMCC} -std=c++11 --bind -O2 -I../../ binding.cc --memory-init-file 0 -s TOTAL_MEMORY=67108864 -s DEMANGLE_SUPPORT=1 -s EXPORTED_FUNCTIONS="['_ParseEXRHeaderFromMemory', '_LoadEXRFromMemory']" -o tinyexr.js
+#${EMCC} --bind -Os -I../../ -I../../deps/miniz binding.cc ../../deps/miniz/miniz.c --memory-init-file 0 -s TOTAL_MEMORY=67108864 -o tinyexr.js
+
+${EMCC} --bind -Os -I../../ -I../../deps/miniz binding.cc ../../deps/miniz/miniz.c -s ALLOW_MEMORY_GROWTH=1 -o tinyexr.js
+
diff --git a/graphics/asymptote/cudareflect/tinyexr/experimental/js/index.html b/graphics/asymptote/tinyexr/experimental/js/index.html
index d46e342d0e..d46e342d0e 100644
--- a/graphics/asymptote/cudareflect/tinyexr/experimental/js/index.html
+++ b/graphics/asymptote/tinyexr/experimental/js/index.html
diff --git a/graphics/asymptote/tinyexr/experimental/js/test.js b/graphics/asymptote/tinyexr/experimental/js/test.js
new file mode 100644
index 0000000000..b0ff6ba94d
--- /dev/null
+++ b/graphics/asymptote/tinyexr/experimental/js/test.js
@@ -0,0 +1,17 @@
+var fs = require('fs');
+var Module = require('./tinyexr.js')
+
+
+Module.onRuntimeInitialized = async function(){
+
+ var data = new Uint8Array(fs.readFileSync("../../asakusa.exr"))
+
+ console.log('Module loaded: ', Module);
+
+ var instance = new Module.EXRLoader(data);
+ console.log(instance.ok())
+ console.log(instance.width())
+ console.log(instance.height())
+
+ var image = instance.getBytes()
+}
diff --git a/graphics/asymptote/tinyexr/experimental/js/tinyexr.js b/graphics/asymptote/tinyexr/experimental/js/tinyexr.js
new file mode 100644
index 0000000000..c02cffc21b
--- /dev/null
+++ b/graphics/asymptote/tinyexr/experimental/js/tinyexr.js
@@ -0,0 +1 @@
+var Module=typeof Module!="undefined"?Module:{};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}var fs,nodePath;if(typeof require==="function"){fs=require("fs");nodePath=require("path")}read_=(filename,binary)=>{filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="tinyexr.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["y"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["C"];addOnInit(Module["asm"]["z"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function ___cxa_allocate_exception(size){return _malloc(size+24)+24}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}return name}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach((dt,i)=>{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function registerType(rawType,registeredInstance,options={}){if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationRegistry=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}var registeredPointers={};function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}var delayFunction=undefined;function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function attachFinalizer(handle){if("undefined"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,Emval.toHandle(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAP32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&&registeredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function getWasmTableEntry(funcPtr){return wasmTable.get(funcPtr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}var rtn=getWasmTableEntry(ptr).apply(null,args);return rtn}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=0;Object.assign(argCache,arguments);return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAPU32[firstElement+i*4>>2])}return array}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}var returns=argTypes[0].name!=="void";var argsList="";var argsListWired="";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?", ":"")+"arg"+i;argsListWired+=(i!==0?", ":"")+"arg"+i+"Wired"}var invokerFnBody="return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n"+"if (arguments.length !== "+(argCount-2)+") {\n"+"throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount-2)+" args!');\n"+"}\n";if(needsDestructorStack){invokerFnBody+="var destructors = [];\n"}var dtorStack=needsDestructorStack?"destructors":"null";var args1=["throwBindingError","invoker","fn","runDestructors","retType","classParam"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+="var thisWired = classParam.toWireType("+dtorStack+", this);\n"}for(var i=0;i<argCount-2;++i){invokerFnBody+="var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";args1.push("argType"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired="thisWired"+(argsListWired.length>0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?"thisWired":"arg"+(i-2)+"Wired";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";args1.push(paramName+"_dtor");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+="var ret = retType.fromWireType(rv);\n"+"return ret;\n"}else{}invokerFnBody+="}\n";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module["count_emval_handles"]=count_emval_handles;Module["get_first_emval"]=get_first_emval}var Emval={toValue:handle=>{if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value},toHandle:value=>{switch(value){case undefined:return 1;case null:return 2;case true:return 3;case false:return 4;default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}};function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=Emval.toValue(handle);__emval_decref(handle);return rv},"toWireType":function(destructors,value){return Emval.toHandle(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function embindRepr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<<bitshift>>>bitshift}var isUnsignedType=name.includes("unsigned");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":toWireType,"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[payload+i])}str=a.join("")}_free(value);return str},"toWireType":function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}var length;var valueIsOfTypeString=typeof value=="string";if(!(valueIsOfTypeString||value instanceof Uint8Array||value instanceof Uint8ClampedArray||value instanceof Int8Array)){throwBindingError("Cannot pass non-string to std::string")}if(stdStringIsUTF8&&valueIsOfTypeString){length=lengthBytesUTF8(value)}else{length=value.length}var base=_malloc(4+length+1);var ptr=base+4;HEAPU32[base>>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i<length;++i){var charCode=value.charCodeAt(i);if(charCode>255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;i<length;++i){HEAPU8[ptr+i]=value[i]}}}if(destructors!==null){destructors.push(_free,base)}return base},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var decodeString,encodeString,getHeap,lengthBytesUTF,shift;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;getHeap=()=>HEAPU16;shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=()=>HEAPU32;shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value=="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __emval_take_value(type,arg){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](arg);return Emval.toHandle(v)}function _abort(){abort("")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var SYSCALLS={varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret}};function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length<digits){str=character[0]+str}return str}function leadingNulls(value,digits){return leadingSomething(value,digits,"0")}function compareByDay(date1,date2){function sgn(value){return value<0?-1:value>0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm,loc){return _strftime(s,maxsize,format,tm)}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var asmLibraryArg={"a":___assert_fail,"g":___cxa_allocate_exception,"e":___cxa_throw,"q":__embind_register_bigint,"x":__embind_register_bool,"l":__embind_register_class,"k":__embind_register_class_constructor,"c":__embind_register_class_function,"w":__embind_register_emval,"o":__embind_register_float,"d":__embind_register_integer,"b":__embind_register_memory_view,"n":__embind_register_std_string,"f":__embind_register_std_wstring,"p":__embind_register_void,"h":__emval_decref,"i":__emval_incref,"j":__emval_take_value,"m":_abort,"v":_emscripten_memcpy_big,"u":_emscripten_resize_heap,"s":_environ_get,"t":_environ_sizes_get,"r":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["z"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["A"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["B"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["D"]).apply(null,arguments)};var __embind_initialize_bindings=Module["__embind_initialize_bindings"]=function(){return(__embind_initialize_bindings=Module["__embind_initialize_bindings"]=Module["asm"]["E"]).apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return(___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=Module["asm"]["F"]).apply(null,arguments)};var dynCall_viijii=Module["dynCall_viijii"]=function(){return(dynCall_viijii=Module["dynCall_viijii"]=Module["asm"]["G"]).apply(null,arguments)};var dynCall_iiiiij=Module["dynCall_iiiiij"]=function(){return(dynCall_iiiiij=Module["dynCall_iiiiij"]=Module["asm"]["H"]).apply(null,arguments)};var dynCall_iiiiijj=Module["dynCall_iiiiijj"]=function(){return(dynCall_iiiiijj=Module["dynCall_iiiiijj"]=Module["asm"]["I"]).apply(null,arguments)};var dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=function(){return(dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=Module["asm"]["J"]).apply(null,arguments)};var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
diff --git a/graphics/asymptote/cudareflect/tinyexr/jni/Android.mk b/graphics/asymptote/tinyexr/jni/Android.mk
index f2268a06fd..f2268a06fd 100644
--- a/graphics/asymptote/cudareflect/tinyexr/jni/Android.mk
+++ b/graphics/asymptote/tinyexr/jni/Android.mk
diff --git a/graphics/asymptote/cudareflect/tinyexr/jni/Application.mk b/graphics/asymptote/tinyexr/jni/Application.mk
index e5d3191944..e5d3191944 100644
--- a/graphics/asymptote/cudareflect/tinyexr/jni/Application.mk
+++ b/graphics/asymptote/tinyexr/jni/Application.mk
diff --git a/graphics/asymptote/cudareflect/tinyexr/jni/Makefile b/graphics/asymptote/tinyexr/jni/Makefile
index 86fd1e55c8..86fd1e55c8 100644
--- a/graphics/asymptote/cudareflect/tinyexr/jni/Makefile
+++ b/graphics/asymptote/tinyexr/jni/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/jni/README.md b/graphics/asymptote/tinyexr/jni/README.md
index b3f95d5e34..b3f95d5e34 100644
--- a/graphics/asymptote/cudareflect/tinyexr/jni/README.md
+++ b/graphics/asymptote/tinyexr/jni/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/kuroga.py b/graphics/asymptote/tinyexr/kuroga.py
index 2c41a08ab3..2c41a08ab3 100644
--- a/graphics/asymptote/cudareflect/tinyexr/kuroga.py
+++ b/graphics/asymptote/tinyexr/kuroga.py
diff --git a/graphics/asymptote/cudareflect/tinyexr/premake4.lua b/graphics/asymptote/tinyexr/premake4.lua
index 7470417960..7470417960 100644
--- a/graphics/asymptote/cudareflect/tinyexr/premake4.lua
+++ b/graphics/asymptote/tinyexr/premake4.lua
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/CMakeLists.txt b/graphics/asymptote/tinyexr/test/CMakeLists.txt
index 4a28914486..4a28914486 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/CMakeLists.txt
+++ b/graphics/asymptote/tinyexr/test/CMakeLists.txt
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/c-binding/Makefile b/graphics/asymptote/tinyexr/test/c-binding/Makefile
index 66b3371838..66b3371838 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/c-binding/Makefile
+++ b/graphics/asymptote/tinyexr/test/c-binding/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/c-binding/test.c b/graphics/asymptote/tinyexr/test/c-binding/test.c
index 3c7f4436f4..3c7f4436f4 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/c-binding/test.c
+++ b/graphics/asymptote/tinyexr/test/c-binding/test.c
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/exrcat/exrcat.cpp b/graphics/asymptote/tinyexr/test/exrcat/exrcat.cpp
index bccfc5f815..bccfc5f815 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/exrcat/exrcat.cpp
+++ b/graphics/asymptote/tinyexr/test/exrcat/exrcat.cpp
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/exrwrite/exrwritetest.cpp b/graphics/asymptote/tinyexr/test/exrwrite/exrwritetest.cpp
index fdcfce6e8e..fdcfce6e8e 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/exrwrite/exrwritetest.cpp
+++ b/graphics/asymptote/tinyexr/test/exrwrite/exrwritetest.cpp
diff --git a/graphics/asymptote/tinyexr/test/fuzzer/Makefile b/graphics/asymptote/tinyexr/test/fuzzer/Makefile
new file mode 100644
index 0000000000..ee504088f4
--- /dev/null
+++ b/graphics/asymptote/tinyexr/test/fuzzer/Makefile
@@ -0,0 +1,14 @@
+#ISSUE_63_FLAGS=-O1 -g -fsanitize=address,bool,float-cast-overflow,integer-divide-by-zero,return,returns-nonnull-attribute,shift-exponent,signed-integer-overflow,unreachable,vla-bound -fno-sanitize-recover=all -funsigned-char
+
+all: miniz
+ clang++ -std=c++11 -o fuzz -I../../ -I../../deps/miniz -g -fsanitize=address,fuzzer fuzz.cc miniz.o
+ #clang++ -std=c++11 -o fuzz_63 -I../../ -I../../deps/miniz ${ISSUE_63_FLAGS} fuzz.cc libminiz.a
+
+miniz:
+ clang -c -I../../deps/miniz -g ../../deps/miniz/miniz.c
+ #llvm-ar rc libminiz.a miniz.o
+
+t:
+ ./fuzz
+ #./fuzz_62 issue-62-tinyexr_memcpy_heap-buffer-overflow
+ #./fuzz_63 issue-63-tinyexr_signed-integer-overflow
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/README.md b/graphics/asymptote/tinyexr/test/fuzzer/README.md
index 616b62e2cb..7333127325 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/README.md
+++ b/graphics/asymptote/tinyexr/test/fuzzer/README.md
@@ -1,8 +1,9 @@
-# Test with libFuzzer
+# Test with llvm Fuzzer
## Requirements
-Ubuntu 16.04 + apt installed clang 5.0 libFuzzer.
+clang 12 or later
+(recent clang does not require libFuzzer anymore)
## Compile and run
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/fuzz.cc b/graphics/asymptote/tinyexr/test/fuzzer/fuzz.cc
index 6de8637e34..6de8637e34 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/fuzz.cc
+++ b/graphics/asymptote/tinyexr/test/fuzzer/fuzz.cc
diff --git a/graphics/asymptote/tinyexr/test/fuzzer/issue-167-heap-buffer-overflow b/graphics/asymptote/tinyexr/test/fuzzer/issue-167-heap-buffer-overflow
new file mode 100644
index 0000000000..4c034aec05
--- /dev/null
+++ b/graphics/asymptote/tinyexr/test/fuzzer/issue-167-heap-buffer-overflow
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/issue-62-tinyexr_memcpy_heap-buffer-overflow b/graphics/asymptote/tinyexr/test/fuzzer/issue-62-tinyexr_memcpy_heap-buffer-overflow
index c9c65b9df4..c9c65b9df4 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/issue-62-tinyexr_memcpy_heap-buffer-overflow
+++ b/graphics/asymptote/tinyexr/test/fuzzer/issue-62-tinyexr_memcpy_heap-buffer-overflow
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/issue-63-tinyexr_signed-integer-overflow b/graphics/asymptote/tinyexr/test/fuzzer/issue-63-tinyexr_signed-integer-overflow
index 2169c501b2..2169c501b2 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/issue-63-tinyexr_signed-integer-overflow
+++ b/graphics/asymptote/tinyexr/test/fuzzer/issue-63-tinyexr_signed-integer-overflow
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/issue-77-heap-buffer-overflow b/graphics/asymptote/tinyexr/test/fuzzer/issue-77-heap-buffer-overflow
index fc326baf43..fc326baf43 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/fuzzer/issue-77-heap-buffer-overflow
+++ b/graphics/asymptote/tinyexr/test/fuzzer/issue-77-heap-buffer-overflow
Binary files differ
diff --git a/graphics/asymptote/tinyexr/test/fuzzer/issue176-heap-buffer-overflow b/graphics/asymptote/tinyexr/test/fuzzer/issue176-heap-buffer-overflow
new file mode 100755
index 0000000000..8ae0d73bcd
--- /dev/null
+++ b/graphics/asymptote/tinyexr/test/fuzzer/issue176-heap-buffer-overflow
Binary files differ
diff --git a/graphics/asymptote/tinyexr/test/fuzzer/issue177-heap-buffer-overflow b/graphics/asymptote/tinyexr/test/fuzzer/issue177-heap-buffer-overflow
new file mode 100755
index 0000000000..22ddca6ad5
--- /dev/null
+++ b/graphics/asymptote/tinyexr/test/fuzzer/issue177-heap-buffer-overflow
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/issues/160/README.md b/graphics/asymptote/tinyexr/test/issues/160/README.md
index 9077773e8d..9077773e8d 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/issues/160/README.md
+++ b/graphics/asymptote/tinyexr/test/issues/160/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/issues/160/main.py b/graphics/asymptote/tinyexr/test/issues/160/main.py
index 5fd77c5e17..5fd77c5e17 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/issues/160/main.py
+++ b/graphics/asymptote/tinyexr/test/issues/160/main.py
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/issues/160/requirements.txt b/graphics/asymptote/tinyexr/test/issues/160/requirements.txt
index cb3f878071..cb3f878071 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/issues/160/requirements.txt
+++ b/graphics/asymptote/tinyexr/test/issues/160/requirements.txt
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/Makefile b/graphics/asymptote/tinyexr/test/unit/Makefile
index 0757dda879..0757dda879 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/Makefile
+++ b/graphics/asymptote/tinyexr/test/unit/Makefile
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/README.md b/graphics/asymptote/tinyexr/test/unit/README.md
index 8e3327275e..8e3327275e 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/README.md
+++ b/graphics/asymptote/tinyexr/test/unit/README.md
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/catch.hpp b/graphics/asymptote/tinyexr/test/unit/catch.hpp
index 2a7146a7f9..2a7146a7f9 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/catch.hpp
+++ b/graphics/asymptote/tinyexr/test/unit/catch.hpp
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/config-msvc.py b/graphics/asymptote/tinyexr/test/unit/config-msvc.py
index a7771defd1..a7771defd1 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/config-msvc.py
+++ b/graphics/asymptote/tinyexr/test/unit/config-msvc.py
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/config-posix.py b/graphics/asymptote/tinyexr/test/unit/config-posix.py
index 29cc4d5518..29cc4d5518 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/config-posix.py
+++ b/graphics/asymptote/tinyexr/test/unit/config-posix.py
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/kuroga.py b/graphics/asymptote/tinyexr/test/unit/kuroga.py
index 56d3f863dd..56d3f863dd 100755
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/kuroga.py
+++ b/graphics/asymptote/tinyexr/test/unit/kuroga.py
diff --git a/graphics/asymptote/tinyexr/test/unit/regression/000-issue194.exr b/graphics/asymptote/tinyexr/test/unit/regression/000-issue194.exr
new file mode 100644
index 0000000000..208ff943b9
--- /dev/null
+++ b/graphics/asymptote/tinyexr/test/unit/regression/000-issue194.exr
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/2by2.exr b/graphics/asymptote/tinyexr/test/unit/regression/2by2.exr
index 5cc69a90c1..5cc69a90c1 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/2by2.exr
+++ b/graphics/asymptote/tinyexr/test/unit/regression/2by2.exr
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/flaga.exr b/graphics/asymptote/tinyexr/test/unit/regression/flaga.exr
index baafcbf976..baafcbf976 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/flaga.exr
+++ b/graphics/asymptote/tinyexr/test/unit/regression/flaga.exr
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/issue-160-piz-decode.exr b/graphics/asymptote/tinyexr/test/unit/regression/issue-160-piz-decode.exr
index 0190859ebf..0190859ebf 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/issue-160-piz-decode.exr
+++ b/graphics/asymptote/tinyexr/test/unit/regression/issue-160-piz-decode.exr
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/piz-bug-issue-100.exr b/graphics/asymptote/tinyexr/test/unit/regression/piz-bug-issue-100.exr
index 6be0d2d8f2..6be0d2d8f2 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/piz-bug-issue-100.exr
+++ b/graphics/asymptote/tinyexr/test/unit/regression/piz-bug-issue-100.exr
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-1383755b301e5f505b2198dc0508918b537fdf48bbfc6deeffe268822e6f6cd6 b/graphics/asymptote/tinyexr/test/unit/regression/poc-1383755b301e5f505b2198dc0508918b537fdf48bbfc6deeffe268822e6f6cd6
index 53d737ff9a..53d737ff9a 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-1383755b301e5f505b2198dc0508918b537fdf48bbfc6deeffe268822e6f6cd6
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-1383755b301e5f505b2198dc0508918b537fdf48bbfc6deeffe268822e6f6cd6
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-24322747c47e87a10e4407528b779a1a763a48135384909b3d1010bbba1d4c28_min b/graphics/asymptote/tinyexr/test/unit/regression/poc-24322747c47e87a10e4407528b779a1a763a48135384909b3d1010bbba1d4c28_min
index bdd036c97c..bdd036c97c 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-24322747c47e87a10e4407528b779a1a763a48135384909b3d1010bbba1d4c28_min
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-24322747c47e87a10e4407528b779a1a763a48135384909b3d1010bbba1d4c28_min
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-255456016cca60ddb5c5ed6898182e13739bf687b17d1411e97bb60ad95e7a84_min b/graphics/asymptote/tinyexr/test/unit/regression/poc-255456016cca60ddb5c5ed6898182e13739bf687b17d1411e97bb60ad95e7a84_min
index 81a2321162..81a2321162 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-255456016cca60ddb5c5ed6898182e13739bf687b17d1411e97bb60ad95e7a84_min
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-255456016cca60ddb5c5ed6898182e13739bf687b17d1411e97bb60ad95e7a84_min
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-360c3b0555cb979ca108f2d178cf8a80959cfeabaa4ec1d310d062fa653a8c6b_min b/graphics/asymptote/tinyexr/test/unit/regression/poc-360c3b0555cb979ca108f2d178cf8a80959cfeabaa4ec1d310d062fa653a8c6b_min
index b2543d3109..b2543d3109 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-360c3b0555cb979ca108f2d178cf8a80959cfeabaa4ec1d310d062fa653a8c6b_min
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-360c3b0555cb979ca108f2d178cf8a80959cfeabaa4ec1d310d062fa653a8c6b_min
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-3f1f642c3356fd8e8d2a0787613ec09a56572b3a1e38c9629b6db9e8dead1117_min b/graphics/asymptote/tinyexr/test/unit/regression/poc-3f1f642c3356fd8e8d2a0787613ec09a56572b3a1e38c9629b6db9e8dead1117_min
index 5f844b157b..5f844b157b 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-3f1f642c3356fd8e8d2a0787613ec09a56572b3a1e38c9629b6db9e8dead1117_min
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-3f1f642c3356fd8e8d2a0787613ec09a56572b3a1e38c9629b6db9e8dead1117_min
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-5ace655ef080932dcc7e4abc9eab1d4f82c845453464993dfa3eb6c5822a1621 b/graphics/asymptote/tinyexr/test/unit/regression/poc-5ace655ef080932dcc7e4abc9eab1d4f82c845453464993dfa3eb6c5822a1621
index ddafb67aad..ddafb67aad 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-5ace655ef080932dcc7e4abc9eab1d4f82c845453464993dfa3eb6c5822a1621
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-5ace655ef080932dcc7e4abc9eab1d4f82c845453464993dfa3eb6c5822a1621
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-5b66774a7498c635334ad386be0c3b359951738ac47f14878a3346d1c6ea0fe5_min b/graphics/asymptote/tinyexr/test/unit/regression/poc-5b66774a7498c635334ad386be0c3b359951738ac47f14878a3346d1c6ea0fe5_min
index eb74f48f44..eb74f48f44 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-5b66774a7498c635334ad386be0c3b359951738ac47f14878a3346d1c6ea0fe5_min
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-5b66774a7498c635334ad386be0c3b359951738ac47f14878a3346d1c6ea0fe5_min
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-d5c9c893e559277a3320c196523095b94db93985620ac338d037487e0e613047_min b/graphics/asymptote/tinyexr/test/unit/regression/poc-d5c9c893e559277a3320c196523095b94db93985620ac338d037487e0e613047_min
index d01d059e99..d01d059e99 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-d5c9c893e559277a3320c196523095b94db93985620ac338d037487e0e613047_min
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-d5c9c893e559277a3320c196523095b94db93985620ac338d037487e0e613047_min
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-df76d1f27adb8927a1446a603028272140905c168a336128465a1162ec7af270.mini b/graphics/asymptote/tinyexr/test/unit/regression/poc-df76d1f27adb8927a1446a603028272140905c168a336128465a1162ec7af270.mini
index d07b822737..d07b822737 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-df76d1f27adb8927a1446a603028272140905c168a336128465a1162ec7af270.mini
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-df76d1f27adb8927a1446a603028272140905c168a336128465a1162ec7af270.mini
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-e7fa6404daa861369d2172fe68e08f9d38c0989f57da7bcfb510bab67e19ca9f b/graphics/asymptote/tinyexr/test/unit/regression/poc-e7fa6404daa861369d2172fe68e08f9d38c0989f57da7bcfb510bab67e19ca9f
index fef3948e19..fef3948e19 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-e7fa6404daa861369d2172fe68e08f9d38c0989f57da7bcfb510bab67e19ca9f
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-e7fa6404daa861369d2172fe68e08f9d38c0989f57da7bcfb510bab67e19ca9f
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-eedff3a9e99eb1c0fd3a3b0989e7c44c0a69f04f10b23e5264f362a4773f4397_min b/graphics/asymptote/tinyexr/test/unit/regression/poc-eedff3a9e99eb1c0fd3a3b0989e7c44c0a69f04f10b23e5264f362a4773f4397_min
index a5168f80dc..a5168f80dc 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-eedff3a9e99eb1c0fd3a3b0989e7c44c0a69f04f10b23e5264f362a4773f4397_min
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-eedff3a9e99eb1c0fd3a3b0989e7c44c0a69f04f10b23e5264f362a4773f4397_min
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-efe9007bfdcbbe8a1569bf01fa9acadb8261ead49cb83f6e91fcdc4dae2e99a3_min b/graphics/asymptote/tinyexr/test/unit/regression/poc-efe9007bfdcbbe8a1569bf01fa9acadb8261ead49cb83f6e91fcdc4dae2e99a3_min
index 58184850d2..58184850d2 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-efe9007bfdcbbe8a1569bf01fa9acadb8261ead49cb83f6e91fcdc4dae2e99a3_min
+++ b/graphics/asymptote/tinyexr/test/unit/regression/poc-efe9007bfdcbbe8a1569bf01fa9acadb8261ead49cb83f6e91fcdc4dae2e99a3_min
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/tiled_half_1x1_alpha.exr b/graphics/asymptote/tinyexr/test/unit/regression/tiled_half_1x1_alpha.exr
index 1933c14e8a..1933c14e8a 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/regression/tiled_half_1x1_alpha.exr
+++ b/graphics/asymptote/tinyexr/test/unit/regression/tiled_half_1x1_alpha.exr
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/tester.cc b/graphics/asymptote/tinyexr/test/unit/tester.cc
index 5fc722dd20..262837f6e7 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/tester.cc
+++ b/graphics/asymptote/tinyexr/test/unit/tester.cc
@@ -1619,7 +1619,7 @@ TEST_CASE("Regression: Issue53|Channels", "[issue53]") {
std::vector<tinyexr::LayerChannel> channels;
tinyexr::ChannelsInLayer(header, "", channels);
- REQUIRE(8 == channels.size());
+ REQUIRE(0 == channels.size());
channels.clear();
tinyexr::ChannelsInLayer(header, "Warstwa 3", channels);
@@ -1653,16 +1653,22 @@ TEST_CASE("Regression: Issue53|Image", "[issue53]") {
int width, height;
float* image;
ret = LoadEXRWithLayer(&image, &width, &height, filepath.c_str(), NULL, &err);
- REQUIRE(TINYEXR_SUCCESS == ret);
- free(image);
+ REQUIRE(TINYEXR_SUCCESS != ret);
+ if (TINYEXR_SUCCESS == ret) {
+ free(image);
+ }
if (err) {
FreeEXRErrorMessage(err);
+ err = nullptr;
}
ret = LoadEXRWithLayer(&image, &width, &height, filepath.c_str(), "Warstwa 1",
&err);
REQUIRE(TINYEXR_SUCCESS == ret);
- free(image);
+ if (TINYEXR_SUCCESS == ret) {
+ free(image);
+ }
+
if (err) {
FreeEXRErrorMessage(err);
}
@@ -1712,3 +1718,28 @@ TEST_CASE("Regression: PR150|Read|1x1 1xhalf", "[pr150]") {
FreeEXRHeader(&header);
FreeEXRImage(&image);
}
+
+TEST_CASE("Regression: Issue194|Piz", "[issue194]") {
+ std::string filepath = "./regression/000-issue194.exr";
+
+ EXRVersion exr_version;
+ std::cout << "Loading" << filepath << std::endl;
+ int ret = ParseEXRVersionFromFile(&exr_version, filepath.c_str());
+ REQUIRE(TINYEXR_SUCCESS == ret);
+
+ EXRVersion version;
+ EXRHeader header;
+ EXRImage image;
+ InitEXRHeader(&header);
+ InitEXRImage(&image);
+
+ const char* err;
+ ret = ParseEXRHeaderFromFile(&header, &exr_version, filepath.c_str(), &err);
+ REQUIRE(TINYEXR_SUCCESS == ret);
+
+ ret = LoadEXRImageFromFile(&image, &header, filepath.c_str(), &err);
+ REQUIRE(TINYEXR_SUCCESS == ret);
+
+ FreeEXRHeader(&header);
+ FreeEXRImage(&image);
+}
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/vcbuild.bat b/graphics/asymptote/tinyexr/test/unit/vcbuild.bat
index e8646735e9..e8646735e9 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/vcbuild.bat
+++ b/graphics/asymptote/tinyexr/test/unit/vcbuild.bat
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/win32-filelist-utf16le.inc b/graphics/asymptote/tinyexr/test/unit/win32-filelist-utf16le.inc
index b784ce8c94..b784ce8c94 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/win32-filelist-utf16le.inc
+++ b/graphics/asymptote/tinyexr/test/unit/win32-filelist-utf16le.inc
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/test/unit/win32-filelist-utf8.inc b/graphics/asymptote/tinyexr/test/unit/win32-filelist-utf8.inc
index a2b9366d57..a2b9366d57 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test/unit/win32-filelist-utf8.inc
+++ b/graphics/asymptote/tinyexr/test/unit/win32-filelist-utf8.inc
diff --git a/graphics/asymptote/cudareflect/tinyexr/test_tinyexr.cc b/graphics/asymptote/tinyexr/test_tinyexr.cc
index 07a38a4769..8c80e0c8d5 100644
--- a/graphics/asymptote/cudareflect/tinyexr/test_tinyexr.cc
+++ b/graphics/asymptote/tinyexr/test_tinyexr.cc
@@ -13,8 +13,8 @@
#include <vector>
// Uncomment if you want to use system provided zlib.
-// #define TINYEXR_USE_MINIZ (0)
-// #include <zlib.h>
+//#define TINYEXR_USE_MINIZ (0)
+//#include <zlib.h>
#define TINYEXR_IMPLEMENTATION
#include "tinyexr.h"
@@ -216,7 +216,7 @@ int test_main(int argc, char** argv) {
int ret = IsEXR(input_filename);
if (ret != TINYEXR_SUCCESS) {
- fprintf(stderr, "Header err. code %d\n", ret);
+ fprintf(stderr, "File not found or given file is not a EXR format. code %d\n", ret);
exit(-1);
}
@@ -230,6 +230,7 @@ int test_main(int argc, char** argv) {
FreeEXRErrorMessage(err);
return ret;
}
+
// SaveAsPFM("output.pfm", width, height, image);
ret = SaveEXR(image, width, height, 4 /* =RGBA*/,
1 /* = save as fp16 format */, "output.exr", &err);
diff --git a/graphics/asymptote/cudareflect/tinyexr/tinyexr.cc b/graphics/asymptote/tinyexr/tinyexr.cc
index fef8f66c98..fef8f66c98 100644
--- a/graphics/asymptote/cudareflect/tinyexr/tinyexr.cc
+++ b/graphics/asymptote/tinyexr/tinyexr.cc
diff --git a/graphics/asymptote/cudareflect/tinyexr/tinyexr.h b/graphics/asymptote/tinyexr/tinyexr.h
index 8bc7cd1d44..64ee67f2c6 100644
--- a/graphics/asymptote/cudareflect/tinyexr/tinyexr.h
+++ b/graphics/asymptote/tinyexr/tinyexr.h
@@ -82,11 +82,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//
-#ifdef __CYGWIN__
-extern "C" char *strdup (const char *) __malloc_like __result_use_check;
-extern "C" size_t strnlen (const char *, size_t);
-#endif
-
#include <stddef.h> // for size_t
#include <stdint.h> // guess stdint.h is available(C99)
@@ -109,12 +104,22 @@ extern "C" {
#endif
// Use miniz or not to decode ZIP format pixel. Linking with zlib
-// required if this flas is 0.
+// required if this flag is 0 and TINYEXR_USE_STB_ZLIB is 0.
#ifndef TINYEXR_USE_MINIZ
#define TINYEXR_USE_MINIZ (1)
#endif
-// Disable PIZ comporession when applying cpplint.
+// Use the ZIP implementation of stb_image.h and stb_image_write.h.
+#ifndef TINYEXR_USE_STB_ZLIB
+#define TINYEXR_USE_STB_ZLIB (0)
+#endif
+
+// Use nanozlib.
+#ifndef TINYEXR_USE_NANOZLIB
+#define TINYEXR_USE_NANOZLIB (0)
+#endif
+
+// Disable PIZ compression when applying cpplint.
#ifndef TINYEXR_USE_PIZ
#define TINYEXR_USE_PIZ (1)
#endif
@@ -149,8 +154,9 @@ extern "C" {
#define TINYEXR_ERROR_INVALID_HEADER (-9)
#define TINYEXR_ERROR_UNSUPPORTED_FEATURE (-10)
#define TINYEXR_ERROR_CANT_WRITE_FILE (-11)
-#define TINYEXR_ERROR_SERIALZATION_FAILED (-12)
+#define TINYEXR_ERROR_SERIALIZATION_FAILED (-12)
#define TINYEXR_ERROR_LAYER_NOT_FOUND (-13)
+#define TINYEXR_ERROR_DATA_TOO_LARGE (-14)
// @note { OpenEXR file format: http://www.openexr.com/openexrfilelayout.pdf }
@@ -180,7 +186,7 @@ extern "C" {
#define TINYEXR_TILE_ROUND_DOWN (0)
#define TINYEXR_TILE_ROUND_UP (1)
-typedef struct _EXRVersion {
+typedef struct TEXRVersion {
int version; // this must be 2
// tile format image;
// not zero for only a single-part "normal" tiled file (according to spec.)
@@ -192,7 +198,7 @@ typedef struct _EXRVersion {
int multipart; // multi-part(EXR 2.0)
} EXRVersion;
-typedef struct _EXRAttribute {
+typedef struct TEXRAttribute {
char name[256]; // name and type are up to 255 chars long.
char type[256];
unsigned char *value; // uint8_t*
@@ -200,7 +206,7 @@ typedef struct _EXRAttribute {
int pad0;
} EXRAttribute;
-typedef struct _EXRChannelInfo {
+typedef struct TEXRChannelInfo {
char name[256]; // less than 255 bytes long
int pixel_type;
int x_sampling;
@@ -209,7 +215,7 @@ typedef struct _EXRChannelInfo {
unsigned char pad[3];
} EXRChannelInfo;
-typedef struct _EXRTile {
+typedef struct TEXRTile {
int offset_x;
int offset_y;
int level_x;
@@ -221,14 +227,14 @@ typedef struct _EXRTile {
unsigned char **images; // image[channels][pixels]
} EXRTile;
-typedef struct _EXRBox2i {
+typedef struct TEXRBox2i {
int min_x;
int min_y;
int max_x;
int max_y;
} EXRBox2i;
-typedef struct _EXRHeader {
+typedef struct TEXRHeader {
float pixel_aspect_ratio;
int line_order;
EXRBox2i data_window;
@@ -277,16 +283,16 @@ typedef struct _EXRHeader {
char name[256];
} EXRHeader;
-typedef struct _EXRMultiPartHeader {
+typedef struct TEXRMultiPartHeader {
int num_headers;
EXRHeader *headers;
} EXRMultiPartHeader;
-typedef struct _EXRImage {
+typedef struct TEXRImage {
EXRTile *tiles; // Tiled pixel data. The application must reconstruct image
// from tiles manually. NULL if scanline format.
- struct _EXRImage* next_level; // NULL if scanline format or image is the last level.
+ struct TEXRImage* next_level; // NULL if scanline format or image is the last level.
int level_x; // x level index
int level_y; // y level index
@@ -301,13 +307,13 @@ typedef struct _EXRImage {
} EXRImage;
-typedef struct _EXRMultiPartImage {
+typedef struct TEXRMultiPartImage {
int num_images;
EXRImage *images;
} EXRMultiPartImage;
-typedef struct _DeepImage {
+typedef struct TDeepImage {
const char **channel_names;
float ***image; // image[channels][scanlines][samples]
int **offset_table; // offset_table[scanline][offsets]
@@ -351,15 +357,39 @@ extern int LoadEXRWithLayer(float **out_rgba, int *width, int *height,
extern int EXRLayers(const char *filename, const char **layer_names[],
int *num_layers, const char **err);
-// @deprecated { to be removed. }
+// @deprecated
// Simple wrapper API for ParseEXRHeaderFromFile.
// checking given file is a EXR file(by just look up header)
// @return TINYEXR_SUCCEES for EXR image, TINYEXR_ERROR_INVALID_HEADER for
// others
extern int IsEXR(const char *filename);
-// @deprecated { to be removed. }
-// Saves single-frame OpenEXR image. Assume EXR image contains RGB(A) channels.
+// Simple wrapper API for ParseEXRHeaderFromMemory.
+// Check if given data is a EXR image(by just looking up a header section)
+// @return TINYEXR_SUCCEES for EXR image, TINYEXR_ERROR_INVALID_HEADER for
+// others
+extern int IsEXRFromMemory(const unsigned char *memory, size_t size);
+
+// @deprecated
+// Saves single-frame OpenEXR image to a buffer. Assume EXR image contains RGB(A) channels.
+// components must be 1(Grayscale), 3(RGB) or 4(RGBA).
+// Input image format is: `float x width x height`, or `float x RGB(A) x width x
+// hight`
+// Save image as fp16(HALF) format when `save_as_fp16` is positive non-zero
+// value.
+// Save image as fp32(FLOAT) format when `save_as_fp16` is 0.
+// Use ZIP compression by default.
+// `buffer` is the pointer to write EXR data.
+// Memory for `buffer` is allocated internally in SaveEXRToMemory.
+// Returns the data size of EXR file when the value is positive(up to 2GB EXR data).
+// Returns negative value and may set error string in `err` when there's an
+// error
+extern int SaveEXRToMemory(const float *data, const int width, const int height,
+ const int components, const int save_as_fp16,
+ unsigned char **buffer, const char **err);
+
+// @deprecated { Not recommended, but handy to use. }
+// Saves single-frame OpenEXR image to a buffer. Assume EXR image contains RGB(A) channels.
// components must be 1(Grayscale), 3(RGB) or 4(RGBA).
// Input image format is: `float x width x height`, or `float x RGB(A) x width x
// hight`
@@ -367,6 +397,7 @@ extern int IsEXR(const char *filename);
// value.
// Save image as fp32(FLOAT) format when `save_as_fp16` is 0.
// Use ZIP compression by default.
+// Returns TINYEXR_SUCCEES(0) when success.
// Returns negative value and may set error string in `err` when there's an
// error
extern int SaveEXR(const float *data, const int width, const int height,
@@ -581,18 +612,27 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
#ifndef NOMINMAX
#define NOMINMAX
#endif
-#include <windows.h> // for UTF-8
+#include <windows.h> // for UTF-8 and memory-mapping
+
+#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
+#define TINYEXR_USE_WIN32_MMAP (1)
+#endif
+#elif defined(__linux__) || defined(__unix__)
+#include <fcntl.h> // for open()
+#include <sys/mman.h> // for memory-mapping
+#include <sys/stat.h> // for stat
+#include <unistd.h> // for close()
+#define TINYEXR_USE_POSIX_MMAP (1)
#endif
#include <algorithm>
-#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
-// #include <iostream> // debug
+//#include <iostream> // debug
#include <limits>
#include <string>
@@ -610,13 +650,15 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
#include <thread>
#endif
+#else // __cplusplus > 199711L
+#define TINYEXR_HAS_CXX11 (0)
#endif // __cplusplus > 199711L
#if TINYEXR_USE_OPENMP
#include <omp.h>
#endif
-#if TINYEXR_USE_MINIZ
+#if defined(TINYEXR_USE_MINIZ) && (TINYEXR_USE_MINIZ==1)
#include <miniz.h>
#else
// Issue #46. Please include your own zlib-compatible API header before
@@ -624,6 +666,22 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
//#include "zlib.h"
#endif
+#if defined(TINYEXR_USE_NANOZLIB) && (TINYEXR_USE_NANOZLIB==1)
+#define NANOZLIB_IMPLEMENTATION
+#include "nanozlib.h"
+#endif
+
+#if TINYEXR_USE_STB_ZLIB
+// Since we don't know where a project has stb_image.h and stb_image_write.h
+// and whether they are in the include path, we don't include them here, and
+// instead declare the two relevant functions manually.
+// from stb_image.h:
+extern "C" int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
+// from stb_image_write.h:
+extern "C" unsigned char *stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality);
+#endif
+
+
#if TINYEXR_USE_ZFP
#ifdef __clang__
@@ -639,6 +697,27 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
#endif
+// cond: conditional expression
+// msg: std::string
+// err: std::string*
+#define TINYEXR_CHECK_AND_RETURN_MSG(cond, msg, err) do { \
+ if (!(cond)) { \
+ if (!err) { \
+ std::ostringstream ss_e; \
+ ss_e << __func__ << "():" << __LINE__ << msg << "\n"; \
+ (*err) += ss_e.str(); \
+ } \
+ return false;\
+ } \
+ } while(0)
+
+// no error message.
+#define TINYEXR_CHECK_AND_RETURN_C(cond, retcode) do { \
+ if (!(cond)) { \
+ return retcode; \
+ } \
+ } while(0)
+
namespace tinyexr {
#if __cplusplus > 199711L
@@ -678,6 +757,18 @@ static void SetErrorMessage(const std::string &msg, const char **err) {
}
}
+#if 0
+static void SetWarningMessage(const std::string &msg, const char **warn) {
+ if (warn) {
+#ifdef _WIN32
+ (*warn) = _strdup(msg.c_str());
+#else
+ (*warn) = strdup(msg.c_str());
+#endif
+ }
+}
+#endif
+
static const int kEXRVersionSize = 8;
static void cpy2(unsigned short *dst_val, const unsigned short *src_val) {
@@ -689,7 +780,7 @@ static void cpy2(unsigned short *dst_val, const unsigned short *src_val) {
}
static void swap2(unsigned short *val) {
-#ifdef TINYEXR_LITTLE_ENDIAN
+#if TINYEXR_LITTLE_ENDIAN
(void)val;
#else
unsigned short tmp = *val;
@@ -748,7 +839,7 @@ static void cpy4(float *dst_val, const float *src_val) {
#endif
static void swap4(unsigned int *val) {
-#ifdef TINYEXR_LITTLE_ENDIAN
+#if TINYEXR_LITTLE_ENDIAN
(void)val;
#else
unsigned int tmp = *val;
@@ -763,7 +854,7 @@ static void swap4(unsigned int *val) {
}
static void swap4(int *val) {
-#ifdef TINYEXR_LITTLE_ENDIAN
+#if TINYEXR_LITTLE_ENDIAN
(void)val;
#else
int tmp = *val;
@@ -778,7 +869,7 @@ static void swap4(int *val) {
}
static void swap4(float *val) {
-#ifdef TINYEXR_LITTLE_ENDIAN
+#if TINYEXR_LITTLE_ENDIAN
(void)val;
#else
float tmp = *val;
@@ -809,7 +900,7 @@ static void cpy8(tinyexr::tinyexr_uint64 *dst_val, const tinyexr::tinyexr_uint64
#endif
static void swap8(tinyexr::tinyexr_uint64 *val) {
-#ifdef TINYEXR_LITTLE_ENDIAN
+#if TINYEXR_LITTLE_ENDIAN
(void)val;
#else
tinyexr::tinyexr_uint64 tmp = (*val);
@@ -1044,7 +1135,7 @@ static void WriteAttributeToMemory(std::vector<unsigned char> *out,
out->insert(out->end(), data, data + len);
}
-typedef struct {
+typedef struct TChannelInfo {
std::string name; // less than 255 bytes long
int pixel_type;
int requested_pixel_type;
@@ -1134,6 +1225,7 @@ static bool ReadChannelInfo(std::vector<ChannelInfo> &channels,
break;
}
ChannelInfo info;
+ info.requested_pixel_type = 0;
tinyexr_int64 data_len = static_cast<tinyexr_int64>(data.size()) -
(p - reinterpret_cast<const char *>(data.data()));
@@ -1214,7 +1306,7 @@ static void WriteChannelInfo(std::vector<unsigned char> &data,
(*p) = '\0';
}
-static void CompressZip(unsigned char *dst,
+static bool CompressZip(unsigned char *dst,
tinyexr::tinyexr_uint64 &compressedSize,
const unsigned char *src, unsigned long src_size) {
std::vector<unsigned char> tmpBuf(src_size);
@@ -1265,7 +1357,7 @@ static void CompressZip(unsigned char *dst,
}
}
-#if TINYEXR_USE_MINIZ
+#if defined(TINYEXR_USE_MINIZ) && (TINYEXR_USE_MINIZ==1)
//
// Compress the data using miniz
//
@@ -1274,15 +1366,40 @@ static void CompressZip(unsigned char *dst,
int ret = mz_compress(
dst, &outSize, static_cast<const unsigned char *>(&tmpBuf.at(0)),
src_size);
- assert(ret == MZ_OK);
- (void)ret;
+ if (ret != MZ_OK) {
+ return false;
+ }
compressedSize = outSize;
+#elif defined(TINYEXR_USE_STB_ZLIB) && (TINYEXR_USE_STB_ZLIB==1)
+ int outSize;
+ unsigned char* ret = stbi_zlib_compress(const_cast<unsigned char*>(&tmpBuf.at(0)), src_size, &outSize, 8);
+ if (!ret) {
+ return false;
+ }
+ memcpy(dst, ret, outSize);
+ free(ret);
+
+ compressedSize = outSize;
+#elif defined(TINYEXR_USE_NANOZLIB) && (TINYEXR_USE_NANOZLIB==1)
+ uint64_t dstSize = nanoz_compressBound(static_cast<uint64_t>(src_size));
+ int outSize{0};
+ unsigned char *ret = nanoz_compress(&tmpBuf.at(0), src_size, &outSize, /* quality */8);
+ if (!ret) {
+ return false;
+ }
+
+ memcpy(dst, ret, outSize);
+ free(ret);
+
+ compressedSize = outSize;
#else
uLong outSize = compressBound(static_cast<uLong>(src_size));
int ret = compress(dst, &outSize, static_cast<const Bytef *>(&tmpBuf.at(0)),
src_size);
- assert(ret == Z_OK);
+ if (ret != Z_OK) {
+ return false;
+ }
compressedSize = outSize;
#endif
@@ -1293,6 +1410,8 @@ static void CompressZip(unsigned char *dst,
compressedSize = src_size;
memcpy(dst, src, src_size);
}
+
+ return true;
}
static bool DecompressZip(unsigned char *dst,
@@ -1305,12 +1424,29 @@ static bool DecompressZip(unsigned char *dst,
}
std::vector<unsigned char> tmpBuf(*uncompressed_size);
-#if TINYEXR_USE_MINIZ
+#if defined(TINYEXR_USE_MINIZ) && (TINYEXR_USE_MINIZ==1)
int ret =
mz_uncompress(&tmpBuf.at(0), uncompressed_size, src, src_size);
if (MZ_OK != ret) {
return false;
}
+#elif TINYEXR_USE_STB_ZLIB
+ int ret = stbi_zlib_decode_buffer(reinterpret_cast<char*>(&tmpBuf.at(0)),
+ *uncompressed_size, reinterpret_cast<const char*>(src), src_size);
+ if (ret < 0) {
+ return false;
+ }
+#elif defined(TINYEXR_USE_NANOZLIB) && (TINYEXR_USE_NANOZLIB==1)
+ uint64_t dest_size = (*uncompressed_size);
+ uint64_t uncomp_size{0};
+ nanoz_status_t ret =
+ nanoz_uncompress(src, src_size, dest_size, &tmpBuf.at(0), &uncomp_size);
+ if (NANOZ_SUCCESS != ret) {
+ return false;
+ }
+ if ((*uncompressed_size) != uncomp_size) {
+ return false;
+ }
#else
int ret = uncompress(&tmpBuf.at(0), uncompressed_size, src, src_size);
if (Z_OK != ret) {
@@ -1438,7 +1574,7 @@ static int rleCompress(int inLength, const char in[], signed char out[]) {
//
// Uncompress an array of bytes compressed with rleCompress().
-// Returns the length of the oncompressed data, or 0 if the
+// Returns the length of the uncompressed data, or 0 if the
// length of the uncompressed data would be more than maxLength.
//
@@ -1461,7 +1597,7 @@ static int rleUncompress(int inLength, int maxLength, const signed char in[],
int count = *in++;
inLength -= 2;
- if (0 > (maxLength -= count + 1)) return 0;
+ if ((0 > (maxLength -= count + 1)) || (inLength < 0)) return 0;
memset(out, *reinterpret_cast<const char *>(in), count + 1);
out += count + 1;
@@ -1479,7 +1615,7 @@ static int rleUncompress(int inLength, int maxLength, const signed char in[],
// End of RLE code from OpenEXR -----------------------------------
-static void CompressRle(unsigned char *dst,
+static bool CompressRle(unsigned char *dst,
tinyexr::tinyexr_uint64 &compressedSize,
const unsigned char *src, unsigned long src_size) {
std::vector<unsigned char> tmpBuf(src_size);
@@ -1534,7 +1670,7 @@ static void CompressRle(unsigned char *dst,
int outSize = rleCompress(static_cast<int>(src_size),
reinterpret_cast<const char *>(&tmpBuf.at(0)),
reinterpret_cast<signed char *>(dst));
- assert(outSize > 0);
+ TINYEXR_CHECK_AND_RETURN_C(outSize > 0, false);
compressedSize = static_cast<tinyexr::tinyexr_uint64>(outSize);
@@ -1544,6 +1680,8 @@ static void CompressRle(unsigned char *dst,
compressedSize = src_size;
memcpy(dst, src, src_size);
}
+
+ return true;
}
static bool DecompressRle(unsigned char *dst,
@@ -2083,7 +2221,7 @@ struct FHeapCompare {
bool operator()(long long *a, long long *b) { return *a > *b; }
};
-static void hufBuildEncTable(
+static bool hufBuildEncTable(
long long *frq, // io: input frequencies [HUF_ENCSIZE], output table
int *im, // o: min frq index
int *iM) // o: max frq index
@@ -2211,7 +2349,7 @@ static void hufBuildEncTable(
for (int j = m;; j = hlink[j]) {
scode[j]++;
- assert(scode[j] <= 58);
+ TINYEXR_CHECK_AND_RETURN_C(scode[j] <= 58, false);
if (hlink[j] == j) {
//
@@ -2230,7 +2368,7 @@ static void hufBuildEncTable(
for (int j = mm;; j = hlink[j]) {
scode[j]++;
- assert(scode[j] <= 58);
+ TINYEXR_CHECK_AND_RETURN_C(scode[j] <= 58, false);
if (hlink[j] == j) break;
}
@@ -2244,6 +2382,8 @@ static void hufBuildEncTable(
hufCanonicalCodeTable(scode.data());
memcpy(frq, scode.data(), sizeof(long long) * HUF_ENCSIZE);
+
+ return true;
}
//
@@ -2441,7 +2581,7 @@ static bool hufBuildDecTable(const long long *hcode, // i : encoding table
unsigned int *p = pl->p;
pl->p = new unsigned int[pl->lit];
- for (int i = 0; i < pl->lit - 1; ++i) pl->p[i] = p[i];
+ for (unsigned int i = 0; i < pl->lit - 1u; ++i) pl->p[i] = p[i];
delete[] p;
} else {
@@ -2696,7 +2836,7 @@ static bool hufDecode(const long long *hcode, // i : encoding table
// Search long code
//
- int j;
+ unsigned int j;
for (j = 0; j < pl.lit; j++) {
int l = hufLength(hcode[pl.p[j]]);
@@ -2955,7 +3095,6 @@ static bool CompressPiz(unsigned char *outPtr, unsigned int *outSize,
#if !TINYEXR_LITTLE_ENDIAN
// @todo { PIZ compression on BigEndian architecture. }
- assert(0);
return false;
#endif
@@ -3081,27 +3220,52 @@ static bool DecompressPiz(unsigned char *outPtr, const unsigned char *inPtr,
#if !TINYEXR_LITTLE_ENDIAN
// @todo { PIZ compression on BigEndian architecture. }
- assert(0);
return false;
#endif
memset(bitmap.data(), 0, BITMAP_SIZE);
+ if (inLen < 4) {
+ return false;
+ }
+
+ size_t readLen = 0;
+
const unsigned char *ptr = inPtr;
// minNonZero = *(reinterpret_cast<const unsigned short *>(ptr));
tinyexr::cpy2(&minNonZero, reinterpret_cast<const unsigned short *>(ptr));
// maxNonZero = *(reinterpret_cast<const unsigned short *>(ptr + 2));
tinyexr::cpy2(&maxNonZero, reinterpret_cast<const unsigned short *>(ptr + 2));
ptr += 4;
+ readLen += 4;
if (maxNonZero >= BITMAP_SIZE) {
return false;
}
+ //printf("maxNonZero = %d\n", maxNonZero);
+ //printf("minNonZero = %d\n", minNonZero);
+ //printf("len = %d\n", (maxNonZero - minNonZero + 1));
+ //printf("BITMAPSIZE - min = %d\n", (BITMAP_SIZE - minNonZero));
+
if (minNonZero <= maxNonZero) {
+ if (((maxNonZero - minNonZero + 1) + readLen) > inLen) {
+ // Input too short
+ return false;
+ }
+
memcpy(reinterpret_cast<char *>(&bitmap[0] + minNonZero), ptr,
maxNonZero - minNonZero + 1);
ptr += maxNonZero - minNonZero + 1;
+ readLen += maxNonZero - minNonZero + 1;
+ } else {
+ // Issue 194
+ if ((minNonZero == (BITMAP_SIZE - 1)) && (maxNonZero == 0)) {
+ // OK. all pixels are zero. And no need to read `bitmap` data.
+ } else {
+ // invalid minNonZero/maxNonZero combination.
+ return false;
+ }
}
std::vector<unsigned short> lut(USHORT_RANGE);
@@ -3112,7 +3276,11 @@ static bool DecompressPiz(unsigned char *outPtr, const unsigned char *inPtr,
// Huffman decoding
//
- int length;
+ if ((readLen + 4) > inLen) {
+ return false;
+ }
+
+ int length=0;
// length = *(reinterpret_cast<const int *>(ptr));
tinyexr::cpy4(&length, reinterpret_cast<const int *>(ptr));
@@ -3293,8 +3461,8 @@ static bool DecompressZfp(float *dst, int dst_width, int dst_num_lines,
zfp_stream *zfp = NULL;
zfp_field *field = NULL;
- assert((dst_width % 4) == 0);
- assert((dst_num_lines % 4) == 0);
+ TINYEXR_CHECK_AND_RETURN_C((dst_width % 4) == 0, false);
+ TINYEXR_CHECK_AND_RETURN_C((dst_num_lines % 4) == 0, false);
if ((size_t(dst_width) & 3U) || (size_t(dst_num_lines) & 3U)) {
return false;
@@ -3315,7 +3483,7 @@ static bool DecompressZfp(float *dst, int dst_width, int dst_num_lines,
} else if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_ACCURACY) {
zfp_stream_set_accuracy(zfp, param.tolerance);
} else {
- assert(0);
+ return false;
}
size_t buf_size = zfp_stream_maximum_size(zfp, field);
@@ -3359,8 +3527,8 @@ static bool CompressZfp(std::vector<unsigned char> *outBuf,
zfp_stream *zfp = NULL;
zfp_field *field = NULL;
- assert((width % 4) == 0);
- assert((num_lines % 4) == 0);
+ TINYEXR_CHECK_AND_RETURN_C((width % 4) == 0, false);
+ TINYEXR_CHECK_AND_RETURN_C((num_lines % 4) == 0, false);
if ((size_t(width) & 3U) || (size_t(num_lines) & 3U)) {
return false;
@@ -3380,7 +3548,7 @@ static bool CompressZfp(std::vector<unsigned char> *outBuf,
} else if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_ACCURACY) {
zfp_stream_set_accuracy(zfp, param.tolerance);
} else {
- assert(0);
+ return false;
}
size_t buf_size = zfp_stream_maximum_size(zfp, field);
@@ -3517,7 +3685,7 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
}
}
} else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) {
- assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT);
+ TINYEXR_CHECK_AND_RETURN_C(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT, false);
for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {
const unsigned int *line_ptr = reinterpret_cast<unsigned int *>(
@@ -3546,11 +3714,11 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
}
}
} else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {
- assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT);
+ TINYEXR_CHECK_AND_RETURN_C(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT, false);
for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {
const float *line_ptr = reinterpret_cast<float *>(&outBuf.at(
- v * pixel_data_size * static_cast<size_t>(x_stride) +
- channel_offset_list[c] * static_cast<size_t>(x_stride)));
+ v * pixel_data_size * static_cast<size_t>(width) +
+ channel_offset_list[c] * static_cast<size_t>(width)));
for (size_t u = 0; u < static_cast<size_t>(width); u++) {
float val;
// val = line_ptr[u];
@@ -3573,11 +3741,10 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
}
}
} else {
- assert(0);
+ return false;
}
}
#else
- assert(0 && "PIZ is enabled in this build");
return false;
#endif
@@ -3589,7 +3756,7 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
pixel_data_size);
unsigned long dstLen = static_cast<unsigned long>(outBuf.size());
- assert(dstLen > 0);
+ TINYEXR_CHECK_AND_RETURN_C(dstLen > 0, false);
if (!tinyexr::DecompressZip(
reinterpret_cast<unsigned char *>(&outBuf.at(0)), &dstLen, data_ptr,
static_cast<unsigned long>(data_len))) {
@@ -3656,7 +3823,7 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
}
}
} else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) {
- assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT);
+ TINYEXR_CHECK_AND_RETURN_C(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT, false);
for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {
const unsigned int *line_ptr = reinterpret_cast<unsigned int *>(
@@ -3685,7 +3852,7 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
}
}
} else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {
- assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT);
+ TINYEXR_CHECK_AND_RETURN_C(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT, false);
for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {
const float *line_ptr = reinterpret_cast<float *>(
&outBuf.at(v * pixel_data_size * static_cast<size_t>(width) +
@@ -3712,7 +3879,6 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
}
}
} else {
- assert(0);
return false;
}
}
@@ -3790,7 +3956,7 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
}
}
} else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) {
- assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT);
+ TINYEXR_CHECK_AND_RETURN_C(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT, false);
for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {
const unsigned int *line_ptr = reinterpret_cast<unsigned int *>(
@@ -3819,7 +3985,7 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
}
}
} else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {
- assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT);
+ TINYEXR_CHECK_AND_RETURN_C(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT, false);
for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {
const float *line_ptr = reinterpret_cast<float *>(
&outBuf.at(v * pixel_data_size * static_cast<size_t>(width) +
@@ -3846,7 +4012,6 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
}
}
} else {
- assert(0);
return false;
}
}
@@ -3857,7 +4022,6 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
if (!tinyexr::FindZFPCompressionParam(&zfp_compression_param, attributes,
int(num_attributes), &e)) {
// This code path should not be reachable.
- assert(0);
return false;
}
@@ -3867,7 +4031,7 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
pixel_data_size);
unsigned long dstLen = outBuf.size();
- assert(dstLen > 0);
+ TINYEXR_CHECK_AND_RETURN_C(dstLen > 0, false);
tinyexr::DecompressZfp(reinterpret_cast<float *>(&outBuf.at(0)), width,
num_lines, num_channels, data_ptr,
static_cast<unsigned long>(data_len),
@@ -3884,9 +4048,9 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
// pixel sample data for channel n for scanline 1
// ...
for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {
- assert(channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT);
+ TINYEXR_CHECK_AND_RETURN_C(channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT, false);
if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {
- assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT);
+ TINYEXR_CHECK_AND_RETURN_C(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT, false);
for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {
const float *line_ptr = reinterpret_cast<float *>(
&outBuf.at(v * pixel_data_size * static_cast<size_t>(width) +
@@ -3912,7 +4076,6 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
}
}
} else {
- assert(0);
return false;
}
}
@@ -3920,7 +4083,6 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
(void)attributes;
(void)num_attributes;
(void)num_channels;
- assert(0);
return false;
#endif
} else if (compression_type == TINYEXR_COMPRESSIONTYPE_NONE) {
@@ -3970,7 +4132,7 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
for (int u = 0; u < width; u++) {
tinyexr::FP16 hf;
- // address may not be aliged. use byte-wise copy for safety.#76
+ // address may not be aligned. use byte-wise copy for safety.#76
// hf.u = line_ptr[u];
tinyexr::cpy2(&(hf.u), line_ptr + u);
@@ -3981,7 +4143,6 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
outLine[u] = f32.f;
}
} else {
- assert(0);
return false;
}
} else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {
@@ -4025,12 +4186,13 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
(size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);
}
+ if (reinterpret_cast<const unsigned char *>(line_ptr + width) >
+ (data_ptr + data_len)) {
+ // Corrupted data
+ return false;
+ }
+
for (int u = 0; u < width; u++) {
- if (reinterpret_cast<const unsigned char *>(line_ptr + u) >=
- (data_ptr + data_len)) {
- // Corrupsed data?
- return false;
- }
unsigned int val;
tinyexr::cpy4(&val, line_ptr + u);
@@ -4111,15 +4273,22 @@ static bool ComputeChannelLayout(std::vector<size_t> *channel_offset_list,
return true;
}
+// TODO: Simply return nullptr when failed to allocate?
static unsigned char **AllocateImage(int num_channels,
const EXRChannelInfo *channels,
const int *requested_pixel_types,
- int data_width, int data_height) {
+ int data_width, int data_height, bool *success) {
unsigned char **images =
reinterpret_cast<unsigned char **>(static_cast<float **>(
malloc(sizeof(float *) * static_cast<size_t>(num_channels))));
for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {
+ images[c] = NULL;
+ }
+
+ bool valid = true;
+
+ for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {
size_t data_len =
static_cast<size_t>(data_width) * static_cast<size_t>(data_height);
if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) {
@@ -4134,7 +4303,9 @@ static unsigned char **AllocateImage(int num_channels,
images[c] = reinterpret_cast<unsigned char *>(
static_cast<float *>(malloc(sizeof(float) * data_len)));
} else {
- assert(0);
+ images[c] = NULL; // just in case.
+ valid = false;
+ break;
}
} else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {
// pixel_data_size += sizeof(float);
@@ -4147,7 +4318,26 @@ static unsigned char **AllocateImage(int num_channels,
images[c] = reinterpret_cast<unsigned char *>(
static_cast<unsigned int *>(malloc(sizeof(unsigned int) * data_len)));
} else {
- assert(0);
+ images[c] = NULL; // just in case.
+ valid = false;
+ break;
+ }
+ }
+
+ if (!valid) {
+ for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {
+ if (images[c]) {
+ free(images[c]);
+ images[c] = NULL;
+ }
+ }
+
+ if (success) {
+ (*success) = false;
+ }
+ } else {
+ if (success) {
+ (*success) = true;
}
}
@@ -4263,7 +4453,13 @@ static int ParseEXRHeader(HeaderInfo *info, bool *empty_header,
if ((version->tiled || version->multipart || version->non_image) && attr_name.compare("tiles") == 0) {
unsigned int x_size, y_size;
unsigned char tile_mode;
- assert(data.size() == 9);
+ if (data.size() != 9) {
+ if (err) {
+ (*err) += "(ParseEXRHeader) Invalid attribute data size. Attribute data size must be 9.\n";
+ }
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+
memcpy(&x_size, &data.at(0), sizeof(int));
memcpy(&y_size, &data.at(4), sizeof(int));
tile_mode = data[8];
@@ -4432,6 +4628,7 @@ static int ParseEXRHeader(HeaderInfo *info, bool *empty_header,
#endif
attrib.name[255] = '\0';
attrib.type[255] = '\0';
+ //std::cout << "i = " << info->attributes.size() << ", dsize = " << data.size() << "\n";
attrib.size = static_cast<int>(data.size());
attrib.value = static_cast<unsigned char *>(malloc(data.size()));
memcpy(reinterpret_cast<char *>(attrib.value), &data.at(0),
@@ -4498,6 +4695,7 @@ static int ParseEXRHeader(HeaderInfo *info, bool *empty_header,
if (err) {
(*err) += ss_err.str();
}
+
return TINYEXR_ERROR_INVALID_HEADER;
}
}
@@ -4508,7 +4706,7 @@ static int ParseEXRHeader(HeaderInfo *info, bool *empty_header,
}
// C++ HeaderInfo to C EXRHeader conversion.
-static void ConvertHeader(EXRHeader *exr_header, const HeaderInfo &info) {
+static bool ConvertHeader(EXRHeader *exr_header, const HeaderInfo &info, std::string *warn, std::string *err) {
exr_header->pixel_aspect_ratio = info.pixel_aspect_ratio;
exr_header->screen_window_center[0] = info.screen_window_center[0];
exr_header->screen_window_center[1] = info.screen_window_center[1];
@@ -4532,19 +4730,49 @@ static void ConvertHeader(EXRHeader *exr_header, const HeaderInfo &info) {
EXRSetNameAttr(exr_header, info.name.c_str());
+
if (!info.type.empty()) {
+ bool valid = true;
if (info.type == "scanlineimage") {
- assert(!exr_header->tiled);
+ if (exr_header->tiled) {
+ if (err) {
+ (*err) += "(ConvertHeader) tiled bit must be off for `scanlineimage` type.\n";
+ }
+ valid = false;
+ }
} else if (info.type == "tiledimage") {
- assert(exr_header->tiled);
+ if (!exr_header->tiled) {
+ if (err) {
+ (*err) += "(ConvertHeader) tiled bit must be on for `tiledimage` type.\n";
+ }
+ valid = false;
+ }
} else if (info.type == "deeptile") {
exr_header->non_image = 1;
- assert(exr_header->tiled);
+ if (!exr_header->tiled) {
+ if (err) {
+ (*err) += "(ConvertHeader) tiled bit must be on for `deeptile` type.\n";
+ }
+ valid = false;
+ }
} else if (info.type == "deepscanline") {
exr_header->non_image = 1;
- assert(!exr_header->tiled);
+ if (exr_header->tiled) {
+ if (err) {
+ (*err) += "(ConvertHeader) tiled bit must be off for `deepscanline` type.\n";
+ }
+ //valid = false;
+ }
} else {
- assert(false);
+ if (warn) {
+ std::stringstream ss;
+ ss << "(ConvertHeader) Unsupported or unknown info.type: " << info.type << "\n";
+ (*warn) += ss.str();
+ }
+ }
+
+ if (!valid) {
+ return false;
}
}
@@ -4592,7 +4820,7 @@ static void ConvertHeader(EXRHeader *exr_header, const HeaderInfo &info) {
exr_header->custom_attributes = static_cast<EXRAttribute *>(malloc(
sizeof(EXRAttribute) * size_t(exr_header->num_custom_attributes)));
- for (size_t i = 0; i < info.attributes.size(); i++) {
+ for (size_t i = 0; i < size_t(exr_header->num_custom_attributes); i++) {
memcpy(exr_header->custom_attributes[i].name, info.attributes[i].name,
256);
memcpy(exr_header->custom_attributes[i].type, info.attributes[i].type,
@@ -4607,16 +4835,19 @@ static void ConvertHeader(EXRHeader *exr_header, const HeaderInfo &info) {
}
exr_header->header_len = info.header_len;
+
+ return true;
}
struct OffsetData {
OffsetData() : num_x_levels(0), num_y_levels(0) {}
std::vector<std::vector<std::vector <tinyexr::tinyexr_uint64> > > offsets;
- int num_x_levels;
- int num_y_levels;
+ int num_x_levels;
+ int num_y_levels;
};
-int LevelIndex(int lx, int ly, int tile_level_mode, int num_x_levels) {
+// -1 = error
+static int LevelIndex(int lx, int ly, int tile_level_mode, int num_x_levels) {
switch (tile_level_mode) {
case TINYEXR_TILE_ONE_LEVEL:
return 0;
@@ -4628,15 +4859,17 @@ int LevelIndex(int lx, int ly, int tile_level_mode, int num_x_levels) {
return lx + ly * num_x_levels;
default:
- assert(false);
+ return -1;
}
return 0;
}
static int LevelSize(int toplevel_size, int level, int tile_rounding_mode) {
- assert(level >= 0);
+ if (level < 0) {
+ return -1;
+ }
- int b = (int)(1u << (unsigned)level);
+ int b = static_cast<int>(1u << static_cast<unsigned int>(level));
int level_size = toplevel_size / b;
if (tile_rounding_mode == TINYEXR_TILE_ROUND_UP && level_size * b < toplevel_size)
@@ -4654,10 +4887,14 @@ static int DecodeTiledLevel(EXRImage* exr_image, const EXRHeader* exr_header,
int num_channels = exr_header->num_channels;
int level_index = LevelIndex(exr_image->level_x, exr_image->level_y, exr_header->tile_level_mode, offset_data.num_x_levels);
- int num_y_tiles = (int)offset_data.offsets[level_index].size();
- assert(num_y_tiles);
- int num_x_tiles = (int)offset_data.offsets[level_index][0].size();
- assert(num_x_tiles);
+ int num_y_tiles = int(offset_data.offsets[size_t(level_index)].size());
+ if (num_y_tiles < 1) {
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+ int num_x_tiles = int(offset_data.offsets[size_t(level_index)][0].size());
+ if (num_x_tiles < 1) {
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
int num_tiles = num_x_tiles * num_y_tiles;
int err_code = TINYEXR_SUCCESS;
@@ -4686,7 +4923,7 @@ static int DecodeTiledLevel(EXRImage* exr_image, const EXRHeader* exr_header,
}
#endif
exr_image->tiles = static_cast<EXRTile*>(
- calloc(sizeof(EXRTile), static_cast<size_t>(num_tiles)));
+ calloc(static_cast<size_t>(num_tiles), sizeof(EXRTile)));
#if TINYEXR_HAS_CXX11 && (TINYEXR_USE_THREAD > 0)
std::vector<std::thread> workers;
@@ -4710,17 +4947,23 @@ static int DecodeTiledLevel(EXRImage* exr_image, const EXRHeader* exr_header,
for (int tile_idx = 0; tile_idx < num_tiles; tile_idx++) {
#endif
// Allocate memory for each tile.
+ bool alloc_success = false;
exr_image->tiles[tile_idx].images = tinyexr::AllocateImage(
num_channels, exr_header->channels,
exr_header->requested_pixel_types, exr_header->tile_size_x,
- exr_header->tile_size_y);
+ exr_header->tile_size_y, &alloc_success);
+
+ if (!alloc_success) {
+ error_flag |= EF_INVALID_DATA;
+ continue;
+ }
int x_tile = tile_idx % num_x_tiles;
int y_tile = tile_idx / num_x_tiles;
// 16 byte: tile coordinates
// 4 byte : data size
// ~ : data(uncompressed or compressed)
- tinyexr::tinyexr_uint64 offset = offset_data.offsets[level_index][y_tile][x_tile];
+ tinyexr::tinyexr_uint64 offset = offset_data.offsets[size_t(level_index)][size_t(y_tile)][size_t(x_tile)];
if (offset + sizeof(int) * 5 > size) {
// Insufficient data size.
error_flag |= EF_INSUFFICIENT_DATA;
@@ -4849,10 +5092,24 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
return TINYEXR_ERROR_INVALID_DATA;
}
- int data_width =
- exr_header->data_window.max_x - exr_header->data_window.min_x + 1;
- int data_height =
- exr_header->data_window.max_y - exr_header->data_window.min_y + 1;
+ tinyexr_int64 data_width =
+ static_cast<tinyexr_int64>(exr_header->data_window.max_x) - static_cast<tinyexr_int64>(exr_header->data_window.min_x) + static_cast<tinyexr_int64>(1);
+ tinyexr_int64 data_height =
+ static_cast<tinyexr_int64>(exr_header->data_window.max_y) - static_cast<tinyexr_int64>(exr_header->data_window.min_y) + static_cast<tinyexr_int64>(1);
+
+ if (data_width <= 0) {
+ if (err) {
+ (*err) += "Invalid data window width.\n";
+ }
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+
+ if (data_height <= 0) {
+ if (err) {
+ (*err) += "Invalid data window height.\n";
+ }
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
// Do not allow too large data_width and data_height. header invalid?
{
@@ -4932,8 +5189,17 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
}
level_image->width =
LevelSize(exr_header->data_window.max_x - exr_header->data_window.min_x + 1, level, exr_header->tile_rounding_mode);
+ if (level_image->width < 1) {
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+
level_image->height =
LevelSize(exr_header->data_window.max_y - exr_header->data_window.min_y + 1, level, exr_header->tile_rounding_mode);
+
+ if (level_image->height < 1) {
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+
level_image->level_x = level;
level_image->level_y = level;
@@ -4959,8 +5225,16 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
level_image->width =
LevelSize(exr_header->data_window.max_x - exr_header->data_window.min_x + 1, level_x, exr_header->tile_rounding_mode);
+ if (level_image->width < 1) {
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+
level_image->height =
LevelSize(exr_header->data_window.max_y - exr_header->data_window.min_y + 1, level_y, exr_header->tile_rounding_mode);
+ if (level_image->height < 1) {
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+
level_image->level_x = level_x;
level_image->level_y = level_y;
@@ -4991,9 +5265,21 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
return TINYEXR_ERROR_INVALID_DATA;
}
+ bool alloc_success = false;
exr_image->images = tinyexr::AllocateImage(
num_channels, exr_header->channels, exr_header->requested_pixel_types,
- data_width, data_height);
+ int(data_width), int(data_height), &alloc_success);
+
+ if (!alloc_success) {
+ if (err) {
+ std::stringstream ss;
+ ss << "Failed to allocate memory for Images. Maybe EXR header is corrupted or Image data size is too large: width = " << data_width
+ << ", height = " << data_height << ", channels = " << num_channels
+ << std::endl;
+ (*err) += ss.str();
+ }
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
#if TINYEXR_HAS_CXX11 && (TINYEXR_USE_THREAD > 0)
std::vector<std::thread> workers;
@@ -5082,7 +5368,7 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
exr_image->images, exr_header->requested_pixel_types,
data_ptr, static_cast<size_t>(data_len),
exr_header->compression_type, exr_header->line_order,
- data_width, data_height, data_width, y, line_no,
+ int(data_width), int(data_height), int(data_width), y, line_no,
num_lines, static_cast<size_t>(pixel_data_size),
static_cast<size_t>(
exr_header->num_custom_attributes),
@@ -5111,7 +5397,15 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
if (invalid_data) {
if (err) {
- (*err) += "Invalid data found when decoding pixels.\n";
+ (*err) += "Invalid/Corrupted data found when decoding pixels.\n";
+ }
+
+ // free alloced image.
+ for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {
+ if (exr_image->images[c]) {
+ free(exr_image->images[c]);
+ exr_image->images[c] = NULL;
+ }
}
return TINYEXR_ERROR_INVALID_DATA;
}
@@ -5126,8 +5420,8 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
{
exr_image->num_channels = num_channels;
- exr_image->width = data_width;
- exr_image->height = data_height;
+ exr_image->width = int(data_width);
+ exr_image->height = int(data_height);
}
return TINYEXR_SUCCESS;
@@ -5136,8 +5430,12 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
static bool ReconstructLineOffsets(
std::vector<tinyexr::tinyexr_uint64> *offsets, size_t n,
const unsigned char *head, const unsigned char *marker, const size_t size) {
- assert(head < marker);
- assert(offsets->size() == n);
+ if (head >= marker) {
+ return false;
+ }
+ if (offsets->size() != n) {
+ return false;
+ }
for (size_t i = 0; i < n; i++) {
size_t offset = static_cast<size_t>(marker - head);
@@ -5233,7 +5531,7 @@ static int CalculateNumXLevels(const EXRHeader* exr_header) {
default:
- assert(false);
+ return -1;
}
return num;
@@ -5271,25 +5569,29 @@ static int CalculateNumYLevels(const EXRHeader* exr_header) {
default:
- assert(false);
+ return -1;
}
return num;
}
-static void CalculateNumTiles(std::vector<int>& numTiles,
+static bool CalculateNumTiles(std::vector<int>& numTiles,
int toplevel_size,
int size,
int tile_rounding_mode) {
for (unsigned i = 0; i < numTiles.size(); i++) {
- int l = LevelSize(toplevel_size, i, tile_rounding_mode);
- assert(l <= std::numeric_limits<int>::max() - size + 1);
+ int l = LevelSize(toplevel_size, int(i), tile_rounding_mode);
+ if (l < 0) {
+ return false;
+ }
+ TINYEXR_CHECK_AND_RETURN_C(l <= std::numeric_limits<int>::max() - size + 1, false);
numTiles[i] = (l + size - 1) / size;
}
+ return true;
}
-static void PrecalculateTileInfo(std::vector<int>& num_x_tiles,
+static bool PrecalculateTileInfo(std::vector<int>& num_x_tiles,
std::vector<int>& num_y_tiles,
const EXRHeader* exr_header) {
int min_x = exr_header->data_window.min_x;
@@ -5298,20 +5600,35 @@ static void PrecalculateTileInfo(std::vector<int>& num_x_tiles,
int max_y = exr_header->data_window.max_y;
int num_x_levels = CalculateNumXLevels(exr_header);
+
+ if (num_x_levels < 0) {
+ return false;
+ }
+
int num_y_levels = CalculateNumYLevels(exr_header);
- num_x_tiles.resize(num_x_levels);
- num_y_tiles.resize(num_y_levels);
+ if (num_y_levels < 0) {
+ return false;
+ }
+
+ num_x_tiles.resize(size_t(num_x_levels));
+ num_y_tiles.resize(size_t(num_y_levels));
- CalculateNumTiles(num_x_tiles,
+ if (!CalculateNumTiles(num_x_tiles,
max_x - min_x + 1,
exr_header->tile_size_x,
- exr_header->tile_rounding_mode);
+ exr_header->tile_rounding_mode)) {
+ return false;
+ }
- CalculateNumTiles(num_y_tiles,
+ if (!CalculateNumTiles(num_y_tiles,
max_y - min_y + 1,
exr_header->tile_size_y,
- exr_header->tile_rounding_mode);
+ exr_header->tile_rounding_mode)) {
+ return false;
+ }
+
+ return true;
}
static void InitSingleResolutionOffsets(OffsetData& offset_data, size_t num_blocks) {
@@ -5323,6 +5640,7 @@ static void InitSingleResolutionOffsets(OffsetData& offset_data, size_t num_bloc
}
// Return sum of tile blocks.
+// 0 = error
static int InitTileOffsets(OffsetData& offset_data,
const EXRHeader* exr_header,
const std::vector<int>& num_x_tiles,
@@ -5333,14 +5651,14 @@ static int InitTileOffsets(OffsetData& offset_data,
switch (exr_header->tile_level_mode) {
case TINYEXR_TILE_ONE_LEVEL:
case TINYEXR_TILE_MIPMAP_LEVELS:
- assert(offset_data.num_x_levels == offset_data.num_y_levels);
- offset_data.offsets.resize(offset_data.num_x_levels);
+ TINYEXR_CHECK_AND_RETURN_C(offset_data.num_x_levels == offset_data.num_y_levels, 0);
+ offset_data.offsets.resize(size_t(offset_data.num_x_levels));
for (unsigned int l = 0; l < offset_data.offsets.size(); ++l) {
- offset_data.offsets[l].resize(num_y_tiles[l]);
+ offset_data.offsets[l].resize(size_t(num_y_tiles[l]));
for (unsigned int dy = 0; dy < offset_data.offsets[l].size(); ++dy) {
- offset_data.offsets[l][dy].resize(num_x_tiles[l]);
+ offset_data.offsets[l][dy].resize(size_t(num_x_tiles[l]));
num_tile_blocks += num_x_tiles[l];
}
}
@@ -5353,18 +5671,18 @@ static int InitTileOffsets(OffsetData& offset_data,
for (int ly = 0; ly < offset_data.num_y_levels; ++ly) {
for (int lx = 0; lx < offset_data.num_x_levels; ++lx) {
int l = ly * offset_data.num_x_levels + lx;
- offset_data.offsets[l].resize(num_y_tiles[ly]);
+ offset_data.offsets[size_t(l)].resize(size_t(num_y_tiles[size_t(ly)]));
- for (size_t dy = 0; dy < offset_data.offsets[l].size(); ++dy) {
- offset_data.offsets[l][dy].resize(num_x_tiles[lx]);
- num_tile_blocks += num_x_tiles[lx];
+ for (size_t dy = 0; dy < offset_data.offsets[size_t(l)].size(); ++dy) {
+ offset_data.offsets[size_t(l)][dy].resize(size_t(num_x_tiles[size_t(lx)]));
+ num_tile_blocks += num_x_tiles[size_t(lx)];
}
}
}
break;
default:
- assert(false);
+ return 0;
}
return num_tile_blocks;
}
@@ -5392,7 +5710,7 @@ static bool isValidTile(const EXRHeader* exr_header,
ly == 0 &&
offset_data.offsets.size() > 0 &&
offset_data.offsets[0].size() > static_cast<size_t>(dy) &&
- offset_data.offsets[0][dy].size() > static_cast<size_t>(dx)) {
+ offset_data.offsets[0][size_t(dy)].size() > static_cast<size_t>(dx)) {
return true;
}
@@ -5403,8 +5721,8 @@ static bool isValidTile(const EXRHeader* exr_header,
if (lx < num_x_levels &&
ly < num_y_levels &&
offset_data.offsets.size() > static_cast<size_t>(lx) &&
- offset_data.offsets[lx].size() > static_cast<size_t>(dy) &&
- offset_data.offsets[lx][dy].size() > static_cast<size_t>(dx)) {
+ offset_data.offsets[size_t(lx)].size() > static_cast<size_t>(dy) &&
+ offset_data.offsets[size_t(lx)][size_t(dy)].size() > static_cast<size_t>(dx)) {
return true;
}
@@ -5417,7 +5735,7 @@ static bool isValidTile(const EXRHeader* exr_header,
ly < num_y_levels &&
(offset_data.offsets.size() > idx) &&
offset_data.offsets[idx].size() > static_cast<size_t>(dy) &&
- offset_data.offsets[idx][dy].size() > static_cast<size_t>(dx)) {
+ offset_data.offsets[idx][size_t(dy)].size() > static_cast<size_t>(dx)) {
return true;
}
}
@@ -5432,22 +5750,31 @@ static bool isValidTile(const EXRHeader* exr_header,
return false;
}
-static void ReconstructTileOffsets(OffsetData& offset_data,
+static bool ReconstructTileOffsets(OffsetData& offset_data,
const EXRHeader* exr_header,
- const unsigned char* head, const unsigned char* marker, const size_t /*size*/,
+ const unsigned char* head, const unsigned char* marker, const size_t size,
bool isMultiPartFile,
bool isDeep) {
int numXLevels = offset_data.num_x_levels;
for (unsigned int l = 0; l < offset_data.offsets.size(); ++l) {
for (unsigned int dy = 0; dy < offset_data.offsets[l].size(); ++dy) {
for (unsigned int dx = 0; dx < offset_data.offsets[l][dy].size(); ++dx) {
- tinyexr::tinyexr_uint64 tileOffset = marker - head;
+ tinyexr::tinyexr_uint64 tileOffset = tinyexr::tinyexr_uint64(marker - head);
+
if (isMultiPartFile) {
+ if ((marker + sizeof(int)) >= (head + size)) {
+ return false;
+ }
+
//int partNumber;
marker += sizeof(int);
}
+ if ((marker + 4 * sizeof(int)) >= (head + size)) {
+ return false;
+ }
+
int tileX;
memcpy(&tileX, marker, sizeof(int));
tinyexr::swap4(&tileX);
@@ -5469,6 +5796,9 @@ static void ReconstructTileOffsets(OffsetData& offset_data,
marker += sizeof(int);
if (isDeep) {
+ if ((marker + 2 * sizeof(tinyexr::tinyexr_int64)) >= (head + size)) {
+ return false;
+ }
tinyexr::tinyexr_int64 packed_offset_table_size;
memcpy(&packed_offset_table_size, marker, sizeof(tinyexr::tinyexr_int64));
tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64*>(&packed_offset_table_size));
@@ -5482,24 +5812,55 @@ static void ReconstructTileOffsets(OffsetData& offset_data,
// next Int64 is unpacked sample size - skip that too
marker += packed_offset_table_size + packed_sample_size + 8;
+ if (marker >= (head + size)) {
+ return false;
+ }
+
} else {
- int dataSize;
- memcpy(&dataSize, marker, sizeof(int));
+ if ((marker + sizeof(uint32_t)) >= (head + size)) {
+ return false;
+ }
+
+ uint32_t dataSize;
+ memcpy(&dataSize, marker, sizeof(uint32_t));
tinyexr::swap4(&dataSize);
- marker += sizeof(int);
+ marker += sizeof(uint32_t);
+
marker += dataSize;
+
+ if (marker >= (head + size)) {
+ return false;
+ }
}
if (!isValidTile(exr_header, offset_data,
- tileX, tileY, levelX, levelY))
- return;
+ tileX, tileY, levelX, levelY)) {
+ return false;
+ }
int level_idx = LevelIndex(levelX, levelY, exr_header->tile_level_mode, numXLevels);
- offset_data.offsets[level_idx][tileY][tileX] = tileOffset;
+ if (level_idx < 0) {
+ return false;
+ }
+
+ if (size_t(level_idx) >= offset_data.offsets.size()) {
+ return false;
+ }
+
+ if (size_t(tileY) >= offset_data.offsets[size_t(level_idx)].size()) {
+ return false;
+ }
+
+ if (size_t(tileX) >= offset_data.offsets[size_t(level_idx)][size_t(tileY)].size()) {
+ return false;
+ }
+
+ offset_data.offsets[size_t(level_idx)][size_t(tileY)][size_t(tileX)] = tileOffset;
}
}
}
+ return true;
}
// marker output is also
@@ -5557,8 +5918,12 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header,
tinyexr::SetErrorMessage("Invalid data width value", err);
return TINYEXR_ERROR_INVALID_DATA;
}
- int data_width =
- exr_header->data_window.max_x - exr_header->data_window.min_x + 1;
+ tinyexr_int64 data_width =
+ static_cast<tinyexr_int64>(exr_header->data_window.max_x) - static_cast<tinyexr_int64>(exr_header->data_window.min_x) + static_cast<tinyexr_int64>(1);
+ if (data_width <= 0) {
+ tinyexr::SetErrorMessage("Invalid data window width value", err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
if (exr_header->data_window.max_y < exr_header->data_window.min_y ||
exr_header->data_window.max_y - exr_header->data_window.min_y ==
@@ -5566,8 +5931,13 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header,
tinyexr::SetErrorMessage("Invalid data height value", err);
return TINYEXR_ERROR_INVALID_DATA;
}
- int data_height =
- exr_header->data_window.max_y - exr_header->data_window.min_y + 1;
+ tinyexr_int64 data_height =
+ static_cast<tinyexr_int64>(exr_header->data_window.max_y) - static_cast<tinyexr_int64>(exr_header->data_window.min_y) + static_cast<tinyexr_int64>(1);
+
+ if (data_height <= 0) {
+ tinyexr::SetErrorMessage("Invalid data window height value", err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
// Do not allow too large data_width and data_height. header invalid?
{
@@ -5600,8 +5970,11 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header,
if (exr_header->tiled) {
{
std::vector<int> num_x_tiles, num_y_tiles;
- PrecalculateTileInfo(num_x_tiles, num_y_tiles, exr_header);
- num_blocks = InitTileOffsets(offset_data, exr_header, num_x_tiles, num_y_tiles);
+ if (!PrecalculateTileInfo(num_x_tiles, num_y_tiles, exr_header)) {
+ tinyexr::SetErrorMessage("Failed to precalculate tile info.", err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+ num_blocks = size_t(InitTileOffsets(offset_data, exr_header, num_x_tiles, num_y_tiles));
if (exr_header->chunk_count > 0) {
if (exr_header->chunk_count != static_cast<int>(num_blocks)) {
tinyexr::SetErrorMessage("Invalid offset table size.", err);
@@ -5613,9 +5986,13 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header,
int ret = ReadOffsets(offset_data, head, marker, size, err);
if (ret != TINYEXR_SUCCESS) return ret;
if (IsAnyOffsetsAreInvalid(offset_data)) {
- ReconstructTileOffsets(offset_data, exr_header,
+ if (!ReconstructTileOffsets(offset_data, exr_header,
head, marker, size,
- exr_header->multipart, exr_header->non_image);
+ exr_header->multipart, exr_header->non_image)) {
+
+ tinyexr::SetErrorMessage("Invalid Tile Offsets data.", err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
}
} else if (exr_header->chunk_count > 0) {
// Use `chunkCount` attribute.
@@ -5735,11 +6112,14 @@ static void ChannelsInLayer(const EXRHeader &exr_header,
const std::string &layer_name,
std::vector<LayerChannel> &channels) {
channels.clear();
+ //std::cout << "layer_name = " << layer_name << "\n";
for (int c = 0; c < exr_header.num_channels; c++) {
+ //std::cout << "chan[" << c << "] = " << exr_header.channels[c].name << "\n";
std::string ch_name(exr_header.channels[c].name);
if (layer_name.empty()) {
const size_t pos = ch_name.find_last_of('.');
if (pos != std::string::npos && pos < ch_name.size()) {
+ if (pos != 0) continue;
ch_name = ch_name.substr(pos + 1);
}
} else {
@@ -5876,8 +6256,14 @@ int LoadEXRWithLayer(float **out_rgba, int *width, int *height,
tinyexr::ChannelsInLayer(
exr_header, layername == NULL ? "" : std::string(layername), channels);
+
if (channels.size() < 1) {
- tinyexr::SetErrorMessage("Layer Not Found", err);
+ if (layername == NULL) {
+ tinyexr::SetErrorMessage("Layer Not Found. Seems EXR contains channels with layer(e.g. `diffuse.R`). if you are using LoadEXR(), please try LoadEXRWithLayer(). LoadEXR() cannot load EXR having channels with layer.", err);
+
+ } else {
+ tinyexr::SetErrorMessage("Layer Not Found", err);
+ }
FreeEXRHeader(&exr_header);
FreeEXRImage(&exr_image);
return TINYEXR_ERROR_LAYER_NOT_FOUND;
@@ -5907,25 +6293,27 @@ int LoadEXRWithLayer(float **out_rgba, int *width, int *height,
static_cast<size_t>(exr_image.height)));
if (exr_header.tiled) {
+ const size_t tile_size_x = static_cast<size_t>(exr_header.tile_size_x);
+ const size_t tile_size_y = static_cast<size_t>(exr_header.tile_size_y);
for (int it = 0; it < exr_image.num_tiles; it++) {
- for (int j = 0; j < exr_header.tile_size_y; j++) {
- for (int i = 0; i < exr_header.tile_size_x; i++) {
- const int ii = exr_image.tiles[it].offset_x *
- static_cast<int>(exr_header.tile_size_x) +
- i;
- const int jj = exr_image.tiles[it].offset_y *
- static_cast<int>(exr_header.tile_size_y) +
- j;
- const int idx = ii + jj * static_cast<int>(exr_image.width);
+ for (size_t j = 0; j < tile_size_y; j++) {
+ for (size_t i = 0; i < tile_size_x; i++) {
+ const size_t ii =
+ static_cast<size_t>(exr_image.tiles[it].offset_x) * tile_size_x +
+ i;
+ const size_t jj =
+ static_cast<size_t>(exr_image.tiles[it].offset_y) * tile_size_y +
+ j;
+ const size_t idx = ii + jj * static_cast<size_t>(exr_image.width);
// out of region check.
- if (ii >= exr_image.width) {
+ if (ii >= static_cast<size_t>(exr_image.width)) {
continue;
}
- if (jj >= exr_image.height) {
+ if (jj >= static_cast<size_t>(exr_image.height)) {
continue;
}
- const int srcIdx = i + j * exr_header.tile_size_x;
+ const size_t srcIdx = i + j * tile_size_x;
unsigned char **src = exr_image.tiles[it].images;
(*out_rgba)[4 * idx + 0] =
reinterpret_cast<float **>(src)[chIdx][srcIdx];
@@ -5939,7 +6327,9 @@ int LoadEXRWithLayer(float **out_rgba, int *width, int *height,
}
}
} else {
- for (int i = 0; i < exr_image.width * exr_image.height; i++) {
+ const size_t pixel_size = static_cast<size_t>(exr_image.width) *
+ static_cast<size_t>(exr_image.height);
+ for (size_t i = 0; i < pixel_size; i++) {
const float val =
reinterpret_cast<float **>(exr_image.images)[chIdx][i];
(*out_rgba)[4 * i + 0] = val;
@@ -5977,23 +6367,29 @@ int LoadEXRWithLayer(float **out_rgba, int *width, int *height,
malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *
static_cast<size_t>(exr_image.height)));
if (exr_header.tiled) {
+ const size_t tile_size_x = static_cast<size_t>(exr_header.tile_size_x);
+ const size_t tile_size_y = static_cast<size_t>(exr_header.tile_size_y);
for (int it = 0; it < exr_image.num_tiles; it++) {
- for (int j = 0; j < exr_header.tile_size_y; j++) {
- for (int i = 0; i < exr_header.tile_size_x; i++) {
- const int ii =
- exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;
- const int jj =
- exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;
- const int idx = ii + jj * exr_image.width;
+ for (size_t j = 0; j < tile_size_y; j++) {
+ for (size_t i = 0; i < tile_size_x; i++) {
+ const size_t ii =
+ static_cast<size_t>(exr_image.tiles[it].offset_x) *
+ tile_size_x +
+ i;
+ const size_t jj =
+ static_cast<size_t>(exr_image.tiles[it].offset_y) *
+ tile_size_y +
+ j;
+ const size_t idx = ii + jj * static_cast<size_t>(exr_image.width);
// out of region check.
- if (ii >= exr_image.width) {
+ if (ii >= static_cast<size_t>(exr_image.width)) {
continue;
}
- if (jj >= exr_image.height) {
+ if (jj >= static_cast<size_t>(exr_image.height)) {
continue;
}
- const int srcIdx = i + j * exr_header.tile_size_x;
+ const size_t srcIdx = i + j * tile_size_x;
unsigned char **src = exr_image.tiles[it].images;
(*out_rgba)[4 * idx + 0] =
reinterpret_cast<float **>(src)[idxR][srcIdx];
@@ -6011,7 +6407,9 @@ int LoadEXRWithLayer(float **out_rgba, int *width, int *height,
}
}
} else {
- for (int i = 0; i < exr_image.width * exr_image.height; i++) {
+ const size_t pixel_size = static_cast<size_t>(exr_image.width) *
+ static_cast<size_t>(exr_image.height);
+ for (size_t i = 0; i < pixel_size; i++) {
(*out_rgba)[4 * i + 0] =
reinterpret_cast<float **>(exr_image.images)[idxR][i];
(*out_rgba)[4 * i + 1] =
@@ -6048,6 +6446,17 @@ int IsEXR(const char *filename) {
return TINYEXR_SUCCESS;
}
+int IsEXRFromMemory(const unsigned char *memory, size_t size) {
+ EXRVersion exr_version;
+
+ int ret = ParseEXRVersionFromMemory(&exr_version, memory, size);
+ if (ret != TINYEXR_SUCCESS) {
+ return ret;
+ }
+
+ return TINYEXR_SUCCESS;
+}
+
int ParseEXRHeaderFromMemory(EXRHeader *exr_header, const EXRVersion *version,
const unsigned char *memory, size_t size,
const char **err) {
@@ -6072,16 +6481,35 @@ int ParseEXRHeaderFromMemory(EXRHeader *exr_header, const EXRVersion *version,
tinyexr::HeaderInfo info;
info.clear();
- std::string err_str;
- int ret = ParseEXRHeader(&info, NULL, version, &err_str, marker, marker_size);
+ int ret;
+ {
+ std::string err_str;
+ ret = ParseEXRHeader(&info, NULL, version, &err_str, marker, marker_size);
- if (ret != TINYEXR_SUCCESS) {
- if (err && !err_str.empty()) {
- tinyexr::SetErrorMessage(err_str, err);
+ if (ret != TINYEXR_SUCCESS) {
+ if (err && !err_str.empty()) {
+ tinyexr::SetErrorMessage(err_str, err);
+ }
}
}
- ConvertHeader(exr_header, info);
+ {
+ std::string warn;
+ std::string err_str;
+
+ if (!ConvertHeader(exr_header, info, &warn, &err_str)) {
+ // release mem
+ for (size_t i = 0; i < info.attributes.size(); i++) {
+ if (info.attributes[i].value) {
+ free(info.attributes[i].value);
+ }
+ }
+ if (err && !err_str.empty()) {
+ tinyexr::SetErrorMessage(err_str, err);
+ }
+ ret = TINYEXR_ERROR_INVALID_HEADER;
+ }
+ }
exr_header->multipart = version->multipart ? 1 : 0;
exr_header->non_image = version->non_image ? 1 : 0;
@@ -6155,23 +6583,29 @@ int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
static_cast<size_t>(exr_image.height)));
if (exr_header.tiled) {
+ const size_t tile_size_x = static_cast<size_t>(exr_header.tile_size_x);
+ const size_t tile_size_y = static_cast<size_t>(exr_header.tile_size_y);
for (int it = 0; it < exr_image.num_tiles; it++) {
- for (int j = 0; j < exr_header.tile_size_y; j++) {
- for (int i = 0; i < exr_header.tile_size_x; i++) {
- const int ii =
- exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;
- const int jj =
- exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;
- const int idx = ii + jj * exr_image.width;
+ for (size_t j = 0; j < tile_size_y; j++) {
+ for (size_t i = 0; i < tile_size_x; i++) {
+ const size_t ii =
+ static_cast<size_t>(exr_image.tiles[it].offset_x) *
+ tile_size_x +
+ i;
+ const size_t jj =
+ static_cast<size_t>(exr_image.tiles[it].offset_y) *
+ tile_size_y +
+ j;
+ const size_t idx = ii + jj * static_cast<size_t>(exr_image.width);
// out of region check.
- if (ii >= exr_image.width) {
+ if (ii >= static_cast<size_t>(exr_image.width)) {
continue;
}
- if (jj >= exr_image.height) {
+ if (jj >= static_cast<size_t>(exr_image.height)) {
continue;
}
- const int srcIdx = i + j * exr_header.tile_size_x;
+ const size_t srcIdx = i + j * tile_size_x;
unsigned char **src = exr_image.tiles[it].images;
(*out_rgba)[4 * idx + 0] =
reinterpret_cast<float **>(src)[0][srcIdx];
@@ -6185,7 +6619,9 @@ int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
}
}
} else {
- for (int i = 0; i < exr_image.width * exr_image.height; i++) {
+ const size_t pixel_size = static_cast<size_t>(exr_image.width) *
+ static_cast<size_t>(exr_image.height);
+ for (size_t i = 0; i < pixel_size; i++) {
const float val = reinterpret_cast<float **>(exr_image.images)[0][i];
(*out_rgba)[4 * i + 0] = val;
(*out_rgba)[4 * i + 1] = val;
@@ -6221,23 +6657,29 @@ int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
static_cast<size_t>(exr_image.height)));
if (exr_header.tiled) {
+ const size_t tile_size_x = static_cast<size_t>(exr_header.tile_size_x);
+ const size_t tile_size_y = static_cast<size_t>(exr_header.tile_size_y);
for (int it = 0; it < exr_image.num_tiles; it++) {
- for (int j = 0; j < exr_header.tile_size_y; j++)
- for (int i = 0; i < exr_header.tile_size_x; i++) {
- const int ii =
- exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;
- const int jj =
- exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;
- const int idx = ii + jj * exr_image.width;
+ for (size_t j = 0; j < tile_size_y; j++)
+ for (size_t i = 0; i < tile_size_x; i++) {
+ const size_t ii =
+ static_cast<size_t>(exr_image.tiles[it].offset_x) *
+ tile_size_x +
+ i;
+ const size_t jj =
+ static_cast<size_t>(exr_image.tiles[it].offset_y) *
+ tile_size_y +
+ j;
+ const size_t idx = ii + jj * static_cast<size_t>(exr_image.width);
// out of region check.
- if (ii >= exr_image.width) {
+ if (ii >= static_cast<size_t>(exr_image.width)) {
continue;
}
- if (jj >= exr_image.height) {
+ if (jj >= static_cast<size_t>(exr_image.height)) {
continue;
}
- const int srcIdx = i + j * exr_header.tile_size_x;
+ const size_t srcIdx = i + j * tile_size_x;
unsigned char **src = exr_image.tiles[it].images;
(*out_rgba)[4 * idx + 0] =
reinterpret_cast<float **>(src)[idxR][srcIdx];
@@ -6254,7 +6696,9 @@ int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
}
}
} else {
- for (int i = 0; i < exr_image.width * exr_image.height; i++) {
+ const size_t pixel_size = static_cast<size_t>(exr_image.width) *
+ static_cast<size_t>(exr_image.height);
+ for (size_t i = 0; i < pixel_size; i++) {
(*out_rgba)[4 * i + 0] =
reinterpret_cast<float **>(exr_image.images)[idxR][i];
(*out_rgba)[4 * i + 1] =
@@ -6280,6 +6724,200 @@ int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
return TINYEXR_SUCCESS;
}
+// Represents a read-only file mapped to an address space in memory.
+// If no memory-mapping API is available, falls back to allocating a buffer
+// with a copy of the file's data.
+struct MemoryMappedFile {
+ unsigned char *data; // To the start of the file's data.
+ size_t size; // The size of the file in bytes.
+#ifdef TINYEXR_USE_WIN32_MMAP
+ HANDLE windows_file;
+ HANDLE windows_file_mapping;
+#elif defined(TINYEXR_USE_POSIX_MMAP)
+ int posix_descriptor;
+#endif
+
+ // MemoryMappedFile's constructor tries to map memory to a file.
+ // If this succeeds, valid() will return true and all fields
+ // are usable; otherwise, valid() will return false.
+ MemoryMappedFile(const char *filename) {
+ data = NULL;
+ size = 0;
+#ifdef TINYEXR_USE_WIN32_MMAP
+ windows_file_mapping = NULL;
+ windows_file =
+ CreateFileW(tinyexr::UTF8ToWchar(filename).c_str(), // lpFileName
+ GENERIC_READ, // dwDesiredAccess
+ FILE_SHARE_READ, // dwShareMode
+ NULL, // lpSecurityAttributes
+ OPEN_EXISTING, // dwCreationDisposition
+ FILE_ATTRIBUTE_READONLY, // dwFlagsAndAttributes
+ NULL); // hTemplateFile
+ if (windows_file == INVALID_HANDLE_VALUE) {
+ return;
+ }
+
+ windows_file_mapping = CreateFileMapping(windows_file, // hFile
+ NULL, // lpFileMappingAttributes
+ PAGE_READONLY, // flProtect
+ 0, // dwMaximumSizeHigh
+ 0, // dwMaximumSizeLow
+ NULL); // lpName
+ if (windows_file_mapping == NULL) {
+ return;
+ }
+
+ data = reinterpret_cast<unsigned char *>(
+ MapViewOfFile(windows_file_mapping, // hFileMappingObject
+ FILE_MAP_READ, // dwDesiredAccess
+ 0, // dwFileOffsetHigh
+ 0, // dwFileOffsetLow
+ 0)); // dwNumberOfBytesToMap
+ if (!data) {
+ return;
+ }
+
+ LARGE_INTEGER windows_file_size = {};
+ if (!GetFileSizeEx(windows_file, &windows_file_size) ||
+ static_cast<ULONGLONG>(windows_file_size.QuadPart) >
+ std::numeric_limits<size_t>::max()) {
+ UnmapViewOfFile(data);
+ data = NULL;
+ return;
+ }
+ size = static_cast<size_t>(windows_file_size.QuadPart);
+#elif defined(TINYEXR_USE_POSIX_MMAP)
+ posix_descriptor = open(filename, O_RDONLY);
+ if (posix_descriptor == -1) {
+ return;
+ }
+
+ struct stat info;
+ if (fstat(posix_descriptor, &info) < 0) {
+ return;
+ }
+ // Make sure st_size is in the valid range for a size_t. The second case
+ // can only fail if a POSIX implementation defines off_t to be a larger
+ // type than size_t - for instance, compiling with _FILE_OFFSET_BITS=64
+ // on a 32-bit system. On current 64-bit systems, this check can never
+ // fail, so we turn off clang's Wtautological-type-limit-compare warning
+ // around this code.
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wtautological-type-limit-compare"
+#endif
+ if (info.st_size < 0 ||
+ info.st_size > std::numeric_limits<ssize_t>::max()) {
+ return;
+ }
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+ size = static_cast<size_t>(info.st_size);
+
+ data = reinterpret_cast<unsigned char *>(
+ mmap(0, size, PROT_READ, MAP_SHARED, posix_descriptor, 0));
+ if (data == MAP_FAILED) {
+ data = nullptr;
+ return;
+ }
+#else
+ FILE *fp = fopen(filename, "rb");
+ if (!fp) {
+ return;
+ }
+
+ // Calling fseek(fp, 0, SEEK_END) isn't strictly-conforming C code, but
+ // since neither the WIN32 nor POSIX APIs are available in this branch, this
+ // is a reasonable fallback option.
+ if (fseek(fp, 0, SEEK_END) != 0) {
+ fclose(fp);
+ return;
+ }
+ const long ftell_result = ftell(fp);
+ if (ftell_result < 0) {
+ // Error from ftell
+ fclose(fp);
+ return;
+ }
+ size = static_cast<size_t>(ftell_result);
+ if (fseek(fp, 0, SEEK_SET) != 0) {
+ fclose(fp);
+ size = 0;
+ return;
+ }
+
+ data = reinterpret_cast<unsigned char *>(malloc(size));
+ if (!data) {
+ size = 0;
+ fclose(fp);
+ return;
+ }
+ size_t read_bytes = fread(data, 1, size, fp);
+ if (read_bytes != size) {
+ // TODO: Try to read data until reading `size` bytes.
+ fclose(fp);
+ size = 0;
+ data = nullptr;
+ return;
+ }
+ fclose(fp);
+#endif
+ }
+
+ // MemoryMappedFile's destructor closes all its handles.
+ ~MemoryMappedFile() {
+#ifdef TINYEXR_USE_WIN32_MMAP
+ if (data) {
+ (void)UnmapViewOfFile(data);
+ data = NULL;
+ }
+
+ if (windows_file_mapping != NULL) {
+ (void)CloseHandle(windows_file_mapping);
+ }
+
+ if (windows_file != INVALID_HANDLE_VALUE) {
+ (void)CloseHandle(windows_file);
+ }
+#elif defined(TINYEXR_USE_POSIX_MMAP)
+ if (data) {
+ (void)munmap(data, size);
+ data = NULL;
+ }
+
+ if (posix_descriptor != -1) {
+ (void)close(posix_descriptor);
+ }
+#else
+ if (data) {
+ (void)free(data);
+ }
+ data = NULL;
+#endif
+ }
+
+ // A MemoryMappedFile cannot be copied or moved.
+ // Only check for this when compiling with C++11 or higher, since deleted
+ // function definitions were added then.
+#if TINYEXR_HAS_CXX11
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wc++98-compat"
+#endif
+ MemoryMappedFile(const MemoryMappedFile &) = delete;
+ MemoryMappedFile &operator=(const MemoryMappedFile &) = delete;
+ MemoryMappedFile(MemoryMappedFile &&other) noexcept = delete;
+ MemoryMappedFile &operator=(MemoryMappedFile &&other) noexcept = delete;
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+#endif
+
+ // Returns whether this was successfully opened.
+ bool valid() const { return data; }
+};
+
int LoadEXRImageFromFile(EXRImage *exr_image, const EXRHeader *exr_header,
const char *filename, const char **err) {
if (exr_image == NULL) {
@@ -6287,50 +6925,19 @@ int LoadEXRImageFromFile(EXRImage *exr_image, const EXRHeader *exr_header,
return TINYEXR_ERROR_INVALID_ARGUMENT;
}
- FILE *fp = NULL;
-#ifdef _WIN32
-#if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) // MSVC, MinGW GCC, or Clang.
- errno_t errcode =
- _wfopen_s(&fp, tinyexr::UTF8ToWchar(filename).c_str(), L"rb");
- if (errcode != 0) {
+ MemoryMappedFile file(filename);
+ if (!file.valid()) {
tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err);
- // TODO(syoyo): return wfopen_s erro code
return TINYEXR_ERROR_CANT_OPEN_FILE;
}
-#else
- // Unknown compiler or MinGW without MINGW_HAS_SECURE_API.
- fp = fopen(filename, "rb");
-#endif
-#else
- fp = fopen(filename, "rb");
-#endif
- if (!fp) {
- tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err);
- return TINYEXR_ERROR_CANT_OPEN_FILE;
- }
-
- size_t filesize;
- // Compute size
- fseek(fp, 0, SEEK_END);
- filesize = static_cast<size_t>(ftell(fp));
- fseek(fp, 0, SEEK_SET);
- if (filesize < 16) {
- tinyexr::SetErrorMessage("File size too short " + std::string(filename),
+ if (file.size < 16) {
+ tinyexr::SetErrorMessage("File size too short : " + std::string(filename),
err);
return TINYEXR_ERROR_INVALID_FILE;
}
- std::vector<unsigned char> buf(filesize); // @todo { use mmap }
- {
- size_t ret;
- ret = fread(&buf[0], 1, filesize, fp);
- assert(ret == filesize);
- fclose(fp);
- (void)ret;
- }
-
- return LoadEXRImageFromMemory(exr_image, exr_header, &buf.at(0), filesize,
+ return LoadEXRImageFromMemory(exr_image, exr_header, file.data, file.size,
err);
}
@@ -6360,6 +6967,11 @@ int LoadEXRImageFromMemory(EXRImage *exr_image, const EXRHeader *exr_header,
namespace tinyexr
{
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wsign-conversion"
+#endif
+
// out_data must be allocated initially with the block-header size
// of the current image(-part) type
static bool EncodePixelData(/* out */ std::vector<unsigned char>& out_data,
@@ -6374,6 +6986,7 @@ static bool EncodePixelData(/* out */ std::vector<unsigned char>& out_data,
size_t pixel_data_size,
const std::vector<ChannelInfo>& channels,
const std::vector<size_t>& channel_offset_list,
+ std::string *err,
const void* compression_param = 0) // zfp compression param
{
size_t buf_size = static_cast<size_t>(width) *
@@ -6391,13 +7004,13 @@ static bool EncodePixelData(/* out */ std::vector<unsigned char>& out_data,
for (int y = 0; y < num_lines; y++) {
// Assume increasing Y
float *line_ptr = reinterpret_cast<float *>(&buf.at(
- static_cast<size_t>(pixel_data_size * y * width) +
+ static_cast<size_t>(pixel_data_size * size_t(y) * size_t(width)) +
channel_offset_list[c] *
static_cast<size_t>(width)));
for (int x = 0; x < width; x++) {
tinyexr::FP16 h16;
h16.u = reinterpret_cast<const unsigned short * const *>(
- images)[c][(y + start_y) * x_stride + x];
+ images)[c][(y + start_y) * size_t(x_stride) + size_t(x)];
tinyexr::FP32 f32 = half_to_float(h16);
@@ -6426,7 +7039,10 @@ static bool EncodePixelData(/* out */ std::vector<unsigned char>& out_data,
}
}
} else {
- assert(0);
+ if (err) {
+ (*err) += "Invalid requested_pixel_type.\n";
+ }
+ return false;
}
} else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {
@@ -6470,7 +7086,10 @@ static bool EncodePixelData(/* out */ std::vector<unsigned char>& out_data,
}
}
} else {
- assert(0);
+ if (err) {
+ (*err) += "Invalid requested_pixel_type.\n";
+ }
+ return false;
}
} else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) {
for (int y = 0; y < num_lines; y++) {
@@ -6499,18 +7118,30 @@ static bool EncodePixelData(/* out */ std::vector<unsigned char>& out_data,
} else if ((compression_type == TINYEXR_COMPRESSIONTYPE_ZIPS) ||
(compression_type == TINYEXR_COMPRESSIONTYPE_ZIP)) {
-#if TINYEXR_USE_MINIZ
+#if defined(TINYEXR_USE_MINIZ) && (TINYEXR_USE_MINIZ==1)
std::vector<unsigned char> block(mz_compressBound(
static_cast<unsigned long>(buf.size())));
+#elif TINYEXR_USE_STB_ZLIB
+ // there is no compressBound() function, so we use a value that
+ // is grossly overestimated, but should always work
+ std::vector<unsigned char> block(256 + 2 * buf.size());
+#elif defined(TINYEXR_USE_NANOZLIB) && (TINYEXR_USE_NANOZLIB == 1)
+ std::vector<unsigned char> block(nanoz_compressBound(
+ static_cast<unsigned long>(buf.size())));
#else
std::vector<unsigned char> block(
compressBound(static_cast<uLong>(buf.size())));
#endif
tinyexr::tinyexr_uint64 outSize = block.size();
- tinyexr::CompressZip(&block.at(0), outSize,
+ if (!tinyexr::CompressZip(&block.at(0), outSize,
reinterpret_cast<const unsigned char *>(&buf.at(0)),
- static_cast<unsigned long>(buf.size()));
+ static_cast<unsigned long>(buf.size()))) {
+ if (err) {
+ (*err) += "Zip compresssion failed.\n";
+ }
+ return false;
+ }
// 4 byte: scan line
// 4 byte: data size
@@ -6525,9 +7156,14 @@ static bool EncodePixelData(/* out */ std::vector<unsigned char>& out_data,
tinyexr::tinyexr_uint64 outSize = block.size();
- tinyexr::CompressRle(&block.at(0), outSize,
+ if (!tinyexr::CompressRle(&block.at(0), outSize,
reinterpret_cast<const unsigned char *>(&buf.at(0)),
- static_cast<unsigned long>(buf.size()));
+ static_cast<unsigned long>(buf.size()))) {
+ if (err) {
+ (*err) += "RLE compresssion failed.\n";
+ }
+ return false;
+ }
// 4 byte: scan line
// 4 byte: data size
@@ -6537,16 +7173,21 @@ static bool EncodePixelData(/* out */ std::vector<unsigned char>& out_data,
} else if (compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {
#if TINYEXR_USE_PIZ
- unsigned int bufLen = 512 + // Avoid buffer overflow
+ unsigned int bufLen =
8192 + static_cast<unsigned int>(
2 * static_cast<unsigned int>(
buf.size())); // @fixme { compute good bound. }
std::vector<unsigned char> block(bufLen);
unsigned int outSize = static_cast<unsigned int>(block.size());
- CompressPiz(&block.at(0), &outSize,
+ if (!CompressPiz(&block.at(0), &outSize,
reinterpret_cast<const unsigned char *>(&buf.at(0)),
- buf.size(), channels, width, num_lines);
+ buf.size(), channels, width, num_lines)) {
+ if (err) {
+ (*err) += "PIZ compresssion failed.\n";
+ }
+ return false;
+ }
// 4 byte: scan line
// 4 byte: data size
@@ -6555,7 +7196,10 @@ static bool EncodePixelData(/* out */ std::vector<unsigned char>& out_data,
out_data.insert(out_data.end(), block.begin(), block.begin() + data_len);
#else
- assert(0);
+ if (err) {
+ (*err) += "PIZ compression is disabled in this build.\n";
+ }
+ return false;
#endif
} else if (compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {
#if TINYEXR_USE_ZFP
@@ -6574,11 +7218,13 @@ static bool EncodePixelData(/* out */ std::vector<unsigned char>& out_data,
out_data.insert(out_data.end(), block.begin(), block.begin() + data_len);
#else
+ if (err) {
+ (*err) += "ZFP compression is disabled in this build.\n";
+ }
(void)compression_param;
- assert(0);
+ return false;
#endif
} else {
- assert(0);
return false;
}
@@ -6595,14 +7241,19 @@ static int EncodeTiledLevel(const EXRImage* level_image, const EXRHeader* exr_he
const void* compression_param, // must be set if zfp compression is enabled
std::string* err) {
int num_tiles = num_x_tiles * num_y_tiles;
- assert(num_tiles == level_image->num_tiles);
+ if (num_tiles != level_image->num_tiles) {
+ if (err) {
+ (*err) += "Invalid number of tiles in argument.\n";
+ }
+ return TINYEXR_ERROR_INVALID_ARGUMENT;
+ }
if ((exr_header->tile_size_x > level_image->width || exr_header->tile_size_y > level_image->height) &&
level_image->level_x == 0 && level_image->level_y == 0) {
if (err) {
(*err) += "Failed to encode tile data.\n";
- }
- return TINYEXR_ERROR_INVALID_DATA;
+ }
+ return TINYEXR_ERROR_INVALID_DATA;
}
@@ -6660,12 +7311,16 @@ static int EncodeTiledLevel(const EXRImage* level_image, const EXRHeader* exr_he
pixel_data_size,
channels,
channel_offset_list,
- compression_param);
+ err, compression_param);
if (!ret) {
invalid_data = true;
continue;
}
- assert(data_list[data_idx].size() > data_header_size);
+ if (data_list[data_idx].size() <= data_header_size) {
+ invalid_data = true;
+ continue;
+ }
+
int data_len = static_cast<int>(data_list[data_idx].size() - data_header_size);
//tileX, tileY, levelX, levelY // pixel_data_size(int)
memcpy(&data_list[data_idx][0], &x_tile, sizeof(int));
@@ -6745,7 +7400,10 @@ static int EncodeChunk(const EXRImage* exr_image, const EXRHeader* exr_header,
pixel_data_size += sizeof(unsigned int);
channel_offset += sizeof(unsigned int);
} else {
- assert(0);
+ if (err) {
+ (*err) += "Invalid requested_pixel_type.\n";
+ }
+ return TINYEXR_ERROR_INVALID_DATA;
}
}
}
@@ -6777,6 +7435,7 @@ static int EncodeChunk(const EXRImage* exr_image, const EXRHeader* exr_header,
if (exr_image->tiles) {
const EXRImage* level_image = exr_image;
size_t block_idx = 0;
+ //tinyexr::tinyexr_uint64 block_data_size = 0;
int num_levels = (exr_header->tile_level_mode != TINYEXR_TILE_RIPMAP_LEVELS) ?
offset_data.num_x_levels : (offset_data.num_x_levels * offset_data.num_y_levels);
for (int level_index = 0; level_index < num_levels; ++level_index) {
@@ -6789,16 +7448,34 @@ static int EncodeChunk(const EXRImage* exr_image, const EXRHeader* exr_header,
int level_index_from_image = LevelIndex(level_image->level_x, level_image->level_y,
exr_header->tile_level_mode, offset_data.num_x_levels);
+ if (level_index_from_image < 0) {
+ if (err) {
+ (*err) += "Invalid tile level mode\n";
+ }
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+
if (level_index_from_image != level_index) {
if (err) {
(*err) += "Incorrect level ordering in tiled image\n";
}
return TINYEXR_ERROR_INVALID_DATA;
}
- int num_y_tiles = (int)offset_data.offsets[level_index].size();
- assert(num_y_tiles);
- int num_x_tiles = (int)offset_data.offsets[level_index][0].size();
- assert(num_x_tiles);
+ int num_y_tiles = int(offset_data.offsets[level_index].size());
+ if (num_y_tiles <= 0) {
+ if (err) {
+ (*err) += "Invalid Y tile size\n";
+ }
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+
+ int num_x_tiles = int(offset_data.offsets[level_index][0].size());
+ if (num_x_tiles <= 0) {
+ if (err) {
+ (*err) += "Invalid X tile size\n";
+ }
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
std::string e;
int ret = EncodeTiledLevel(level_image,
@@ -6824,11 +7501,12 @@ static int EncodeChunk(const EXRImage* exr_image, const EXRHeader* exr_header,
offset_data.offsets[level_index][j][i] = offset;
swap8(reinterpret_cast<tinyexr_uint64*>(&offset_data.offsets[level_index][j][i]));
offset += data_list[block_idx].size() + doffset;
+ //block_data_size += data_list[block_idx].size();
++block_idx;
}
level_image = level_image->next_level;
}
- assert(static_cast<int>(block_idx) == num_blocks);
+ TINYEXR_CHECK_AND_RETURN_C(static_cast<int>(block_idx) == num_blocks, TINYEXR_ERROR_INVALID_DATA);
total_size = offset;
} else { // scanlines
std::vector<tinyexr::tinyexr_uint64>& offsets = offset_data.offsets[0][0];
@@ -6875,12 +7553,16 @@ static int EncodeChunk(const EXRImage* exr_image, const EXRHeader* exr_header,
pixel_data_size,
channels,
channel_offset_list,
+ err,
compression_param);
if (!ret) {
invalid_data = true;
continue; // "break" cannot be used with OpenMP
}
- assert(data_list[i].size() > data_header_size);
+ if (data_list[i].size() <= data_header_size) {
+ invalid_data = true;
+ continue; // "break" cannot be used with OpenMP
+ }
int data_len = static_cast<int>(data_list[i].size() - data_header_size);
memcpy(&data_list[i][0], &start_y, sizeof(int));
memcpy(&data_list[i][4], &data_len, sizeof(int));
@@ -6942,21 +7624,24 @@ static size_t SaveEXRNPartImageToMemory(const EXRImage* exr_images,
return 0;
}
#endif
-#if !TINYEXR_USE_ZFP
if (exr_headers[i]->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {
+#if !TINYEXR_USE_ZFP
SetErrorMessage("ZFP compression is not supported in this build",
err);
return 0;
- }
#else
- for (int c = 0; c < exr_header->num_channels; ++c) {
- if (exr_headers[i]->requested_pixel_types[c] != TINYEXR_PIXELTYPE_FLOAT) {
- SetErrorMessage("Pixel type must be FLOAT for ZFP compression",
- err);
- return 0;
+ // All channels must be fp32.
+ // No fp16 support in ZFP atm(as of 2023 June)
+ // https://github.com/LLNL/fpzip/issues/2
+ for (int c = 0; c < exr_headers[i]->num_channels; ++c) {
+ if (exr_headers[i]->requested_pixel_types[c] != TINYEXR_PIXELTYPE_FLOAT) {
+ SetErrorMessage("Pixel type must be FLOAT for ZFP compression",
+ err);
+ return 0;
+ }
}
- }
#endif
+ }
}
}
@@ -7006,9 +7691,20 @@ static size_t SaveEXRNPartImageToMemory(const EXRImage* exr_images,
} else {
{
std::vector<int> num_x_tiles, num_y_tiles;
- PrecalculateTileInfo(num_x_tiles, num_y_tiles, exr_headers[i]);
- chunk_count[i] =
- InitTileOffsets(offset_data[i], exr_headers[i], num_x_tiles, num_y_tiles);
+ if (!PrecalculateTileInfo(num_x_tiles, num_y_tiles, exr_headers[i])) {
+ SetErrorMessage("Failed to precalculate Tile info",
+ err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+ int ntiles = InitTileOffsets(offset_data[i], exr_headers[i], num_x_tiles, num_y_tiles);
+ if (ntiles > 0) {
+ chunk_count[i] = ntiles;
+ } else {
+ SetErrorMessage("Failed to compute Tile offsets",
+ err);
+ return TINYEXR_ERROR_INVALID_DATA;
+
+ }
total_chunk_count += chunk_count[i];
}
}
@@ -7122,7 +7818,11 @@ static size_t SaveEXRNPartImageToMemory(const EXRImage* exr_images,
{
size_t len = 0;
if ((len = strlen(exr_headers[i]->name)) > 0) {
+#if TINYEXR_HAS_CXX11
partnames.emplace(exr_headers[i]->name);
+#else
+ partnames.insert(std::string(exr_headers[i]->name));
+#endif
if (partnames.size() != i + 1) {
SetErrorMessage("'name' attributes must be unique for a multi-part file", err);
return 0;
@@ -7204,9 +7904,9 @@ static size_t SaveEXRNPartImageToMemory(const EXRImage* exr_images,
// Allocating required memory
if (total_size == 0) { // something went wrong
tinyexr::SetErrorMessage("Output memory size is zero", err);
- return 0;
+ return TINYEXR_ERROR_INVALID_DATA;
}
- (*memory_out) = static_cast<unsigned char*>(malloc(total_size));
+ (*memory_out) = static_cast<unsigned char*>(malloc(size_t(total_size)));
// Writing header
memcpy((*memory_out), &memory[0], memory.size());
@@ -7223,7 +7923,11 @@ static size_t SaveEXRNPartImageToMemory(const EXRImage* exr_images,
for (size_t j = 0; j < offset_data[i].offsets[level_index].size(); ++j) {
size_t num_bytes = sizeof(tinyexr_uint64) * offset_data[i].offsets[level_index][j].size();
sum += num_bytes;
- assert(sum <= total_size);
+ if (sum > total_size) {
+ tinyexr::SetErrorMessage("Invalid offset bytes in Tiled Part image.", err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+
memcpy(memory_ptr,
reinterpret_cast<unsigned char*>(&offset_data[i].offsets[level_index][j][0]),
num_bytes);
@@ -7234,7 +7938,10 @@ static size_t SaveEXRNPartImageToMemory(const EXRImage* exr_images,
} else {
size_t num_bytes = sizeof(tinyexr::tinyexr_uint64) * static_cast<size_t>(chunk_count[i]);
sum += num_bytes;
- assert(sum <= total_size);
+ if (sum > total_size) {
+ tinyexr::SetErrorMessage("Invalid offset bytes in Part image.", err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
std::vector<tinyexr::tinyexr_uint64>& offsets = offset_data[i].offsets[0][0];
memcpy(memory_ptr, reinterpret_cast<unsigned char*>(&offsets[0]), num_bytes);
memory_ptr += num_bytes;
@@ -7246,22 +7953,37 @@ static size_t SaveEXRNPartImageToMemory(const EXRImage* exr_images,
for (size_t j = 0; j < static_cast<size_t>(chunk_count[i]); ++j) {
if (num_parts > 1) {
sum += 4;
- assert(sum <= total_size);
+ if (sum > total_size) {
+ tinyexr::SetErrorMessage("Buffer overrun in reading Part image chunk data.", err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
unsigned int part_number = i;
swap4(&part_number);
memcpy(memory_ptr, &part_number, 4);
memory_ptr += 4;
}
sum += data_lists[i][j].size();
- assert(sum <= total_size);
+ if (sum > total_size) {
+ tinyexr::SetErrorMessage("Buffer overrun in reading Part image chunk data.", err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
memcpy(memory_ptr, &data_lists[i][j][0], data_lists[i][j].size());
memory_ptr += data_lists[i][j].size();
}
}
- assert(sum == total_size);
- return total_size; // OK
+
+ if (sum != total_size) {
+ tinyexr::SetErrorMessage("Corrupted Part image chunk data.", err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
+
+ return size_t(total_size); // OK
}
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
} // tinyexr
size_t SaveEXRImageToMemory(const EXRImage* exr_image,
@@ -7320,7 +8042,8 @@ int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header,
unsigned char *mem = NULL;
size_t mem_size = SaveEXRImageToMemory(exr_image, exr_header, &mem, err);
if (mem_size == 0) {
- return TINYEXR_ERROR_SERIALZATION_FAILED;
+ fclose(fp);
+ return TINYEXR_ERROR_SERIALIZATION_FAILED;
}
size_t written_size = 0;
@@ -7389,7 +8112,8 @@ int SaveEXRMultipartImageToFile(const EXRImage* exr_images,
unsigned char *mem = NULL;
size_t mem_size = SaveEXRMultipartImageToMemory(exr_images, exr_headers, num_parts, &mem, err);
if (mem_size == 0) {
- return TINYEXR_ERROR_SERIALZATION_FAILED;
+ fclose(fp);
+ return TINYEXR_ERROR_SERIALIZATION_FAILED;
}
size_t written_size = 0;
@@ -7414,58 +8138,20 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) {
return TINYEXR_ERROR_INVALID_ARGUMENT;
}
-#ifdef _WIN32
- FILE *fp = NULL;
-#if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) // MSVC, MinGW GCC, or Clang.
- errno_t errcode =
- _wfopen_s(&fp, tinyexr::UTF8ToWchar(filename).c_str(), L"rb");
- if (errcode != 0) {
- tinyexr::SetErrorMessage("Cannot read a file " + std::string(filename),
- err);
- return TINYEXR_ERROR_CANT_OPEN_FILE;
- }
-#else
- // Unknown compiler or MinGW without MINGW_HAS_SECURE_API.
- fp = fopen(filename, "rb");
-#endif
- if (!fp) {
- tinyexr::SetErrorMessage("Cannot read a file " + std::string(filename),
- err);
- return TINYEXR_ERROR_CANT_OPEN_FILE;
- }
-#else
- FILE *fp = fopen(filename, "rb");
- if (!fp) {
- tinyexr::SetErrorMessage("Cannot read a file " + std::string(filename),
- err);
+ MemoryMappedFile file(filename);
+ if (!file.valid()) {
+ tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err);
return TINYEXR_ERROR_CANT_OPEN_FILE;
}
-#endif
-
- size_t filesize;
- // Compute size
- fseek(fp, 0, SEEK_END);
- filesize = static_cast<size_t>(ftell(fp));
- fseek(fp, 0, SEEK_SET);
- if (filesize == 0) {
- fclose(fp);
+ if (file.size == 0) {
tinyexr::SetErrorMessage("File size is zero : " + std::string(filename),
err);
return TINYEXR_ERROR_INVALID_FILE;
}
- std::vector<char> buf(filesize); // @todo { use mmap }
- {
- size_t ret;
- ret = fread(&buf[0], 1, filesize, fp);
- assert(ret == filesize);
- (void)ret;
- }
- fclose(fp);
-
- const char *head = &buf[0];
- const char *marker = &buf[0];
+ const char *head = reinterpret_cast<const char *>(file.data);
+ const char *marker = reinterpret_cast<const char *>(file.data);
// Header check.
{
@@ -7500,7 +8186,7 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) {
std::vector<tinyexr::ChannelInfo> channels;
// Read attributes
- size_t size = filesize - tinyexr::kEXRVersionSize;
+ size_t size = file.size - tinyexr::kEXRVersionSize;
for (;;) {
if (0 == size) {
return TINYEXR_ERROR_INVALID_DATA;
@@ -7583,11 +8269,11 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) {
}
}
- assert(dx >= 0);
- assert(dy >= 0);
- assert(dw >= 0);
- assert(dh >= 0);
- assert(num_channels >= 1);
+ TINYEXR_CHECK_AND_RETURN_C(dx >= 0, TINYEXR_ERROR_INVALID_DATA);
+ TINYEXR_CHECK_AND_RETURN_C(dy >= 0, TINYEXR_ERROR_INVALID_DATA);
+ TINYEXR_CHECK_AND_RETURN_C(dw >= 0, TINYEXR_ERROR_INVALID_DATA);
+ TINYEXR_CHECK_AND_RETURN_C(dh >= 0, TINYEXR_ERROR_INVALID_DATA);
+ TINYEXR_CHECK_AND_RETURN_C(num_channels >= 1, TINYEXR_ERROR_INVALID_DATA);
int data_width = dw - dx + 1;
int data_height = dh - dy + 1;
@@ -7685,7 +8371,7 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) {
return false;
}
- assert(dstLen == pixelOffsetTable.size() * sizeof(int));
+ TINYEXR_CHECK_AND_RETURN_C(dstLen == pixelOffsetTable.size() * sizeof(int), TINYEXR_ERROR_INVALID_DATA);
for (size_t i = 0; i < static_cast<size_t>(data_width); i++) {
deep_image->offset_table[y][i] = pixelOffsetTable[i];
}
@@ -7704,7 +8390,7 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) {
static_cast<unsigned long>(packedSampleDataSize))) {
return false;
}
- assert(dstLen == static_cast<unsigned long>(unpackedSampleDataSize));
+ TINYEXR_CHECK_AND_RETURN_C(dstLen == static_cast<unsigned long>(unpackedSampleDataSize), TINYEXR_ERROR_INVALID_DATA);
}
}
@@ -7723,16 +8409,17 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) {
TINYEXR_PIXELTYPE_FLOAT) { // float
channel_offset += 4;
} else {
- assert(0);
+ tinyexr::SetErrorMessage("Invalid pixel_type in chnnels.", err);
+ return TINYEXR_ERROR_INVALID_DATA;
}
}
sampleSize = channel_offset;
}
- assert(sampleSize >= 2);
+ TINYEXR_CHECK_AND_RETURN_C(sampleSize >= 2, TINYEXR_ERROR_INVALID_DATA);
- assert(static_cast<size_t>(
+ TINYEXR_CHECK_AND_RETURN_C(static_cast<size_t>(
pixelOffsetTable[static_cast<size_t>(data_width - 1)] *
- sampleSize) == sample_data.size());
+ sampleSize) == sample_data.size(), TINYEXR_ERROR_INVALID_DATA);
int samples_per_line = static_cast<int>(sample_data.size()) / sampleSize;
//
@@ -7870,7 +8557,7 @@ void EXRSetNameAttr(EXRHeader* exr_header, const char* name) {
}
memset(exr_header->name, 0, 256);
if (name != NULL) {
- size_t len = std::min(strlen(name), (size_t)255);
+ size_t len = std::min(strlen(name), size_t(255));
if (len) {
memcpy(exr_header->name, name, len);
}
@@ -7931,48 +8618,13 @@ int ParseEXRHeaderFromFile(EXRHeader *exr_header, const EXRVersion *exr_version,
return TINYEXR_ERROR_INVALID_ARGUMENT;
}
- FILE *fp = NULL;
-#ifdef _WIN32
-#if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) // MSVC, MinGW GCC, or Clang.
- errno_t errcode =
- _wfopen_s(&fp, tinyexr::UTF8ToWchar(filename).c_str(), L"rb");
- if (errcode != 0) {
- tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err);
- return TINYEXR_ERROR_INVALID_FILE;
- }
-#else
- // Unknown compiler or MinGW without MINGW_HAS_SECURE_API.
- fp = fopen(filename, "rb");
-#endif
-#else
- fp = fopen(filename, "rb");
-#endif
- if (!fp) {
+ MemoryMappedFile file(filename);
+ if (!file.valid()) {
tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err);
return TINYEXR_ERROR_CANT_OPEN_FILE;
}
- size_t filesize;
- // Compute size
- fseek(fp, 0, SEEK_END);
- filesize = static_cast<size_t>(ftell(fp));
- fseek(fp, 0, SEEK_SET);
-
- std::vector<unsigned char> buf(filesize); // @todo { use mmap }
- {
- size_t ret;
- ret = fread(&buf[0], 1, filesize, fp);
- assert(ret == filesize);
- fclose(fp);
-
- if (ret != filesize) {
- tinyexr::SetErrorMessage("fread() error on " + std::string(filename),
- err);
- return TINYEXR_ERROR_INVALID_FILE;
- }
- }
-
- return ParseEXRHeaderFromMemory(exr_header, exr_version, &buf.at(0), filesize,
+ return ParseEXRHeaderFromMemory(exr_header, exr_version, file.data, file.size,
err);
}
@@ -8009,6 +8661,14 @@ int ParseEXRMultipartHeaderFromMemory(EXRHeader ***exr_headers,
marker, marker_size);
if (ret != TINYEXR_SUCCESS) {
+
+ // Free malloc-allocated memory here.
+ for (size_t i = 0; i < info.attributes.size(); i++) {
+ if (info.attributes[i].value) {
+ free(info.attributes[i].value);
+ }
+ }
+
tinyexr::SetErrorMessage(err_str, err);
return ret;
}
@@ -8020,6 +8680,14 @@ int ParseEXRMultipartHeaderFromMemory(EXRHeader ***exr_headers,
// `chunkCount` must exist in the header.
if (info.chunk_count == 0) {
+
+ // Free malloc-allocated memory here.
+ for (size_t i = 0; i < info.attributes.size(); i++) {
+ if (info.attributes[i].value) {
+ free(info.attributes[i].value);
+ }
+ }
+
tinyexr::SetErrorMessage(
"`chunkCount' attribute is not found in the header.", err);
return TINYEXR_ERROR_INVALID_DATA;
@@ -8035,11 +8703,32 @@ int ParseEXRMultipartHeaderFromMemory(EXRHeader ***exr_headers,
// allocate memory for EXRHeader and create array of EXRHeader pointers.
(*exr_headers) =
static_cast<EXRHeader **>(malloc(sizeof(EXRHeader *) * infos.size()));
+
+
+ int retcode = TINYEXR_SUCCESS;
+
for (size_t i = 0; i < infos.size(); i++) {
EXRHeader *exr_header = static_cast<EXRHeader *>(malloc(sizeof(EXRHeader)));
memset(exr_header, 0, sizeof(EXRHeader));
- ConvertHeader(exr_header, infos[i]);
+ std::string warn;
+ std::string _err;
+ if (!ConvertHeader(exr_header, infos[i], &warn, &_err)) {
+
+ // Free malloc-allocated memory here.
+ for (size_t k = 0; k < infos[i].attributes.size(); k++) {
+ if (infos[i].attributes[k].value) {
+ free(infos[i].attributes[k].value);
+ }
+ }
+
+ if (!_err.empty()) {
+ tinyexr::SetErrorMessage(
+ _err, err);
+ }
+ // continue to converting headers
+ retcode = TINYEXR_ERROR_INVALID_HEADER;
+ }
exr_header->multipart = exr_version->multipart ? 1 : 0;
@@ -8048,7 +8737,7 @@ int ParseEXRMultipartHeaderFromMemory(EXRHeader ***exr_headers,
(*num_headers) = static_cast<int>(infos.size());
- return TINYEXR_SUCCESS;
+ return retcode;
}
int ParseEXRMultipartHeaderFromFile(EXRHeader ***exr_headers, int *num_headers,
@@ -8061,48 +8750,14 @@ int ParseEXRMultipartHeaderFromFile(EXRHeader ***exr_headers, int *num_headers,
return TINYEXR_ERROR_INVALID_ARGUMENT;
}
- FILE *fp = NULL;
-#ifdef _WIN32
-#if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) // MSVC, MinGW GCC, or Clang.
- errno_t errcode =
- _wfopen_s(&fp, tinyexr::UTF8ToWchar(filename).c_str(), L"rb");
- if (errcode != 0) {
- tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err);
- return TINYEXR_ERROR_INVALID_FILE;
- }
-#else
- // Unknown compiler or MinGW without MINGW_HAS_SECURE_API.
- fp = fopen(filename, "rb");
-#endif
-#else
- fp = fopen(filename, "rb");
-#endif
- if (!fp) {
+ MemoryMappedFile file(filename);
+ if (!file.valid()) {
tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err);
return TINYEXR_ERROR_CANT_OPEN_FILE;
}
- size_t filesize;
- // Compute size
- fseek(fp, 0, SEEK_END);
- filesize = static_cast<size_t>(ftell(fp));
- fseek(fp, 0, SEEK_SET);
-
- std::vector<unsigned char> buf(filesize); // @todo { use mmap }
- {
- size_t ret;
- ret = fread(&buf[0], 1, filesize, fp);
- assert(ret == filesize);
- fclose(fp);
-
- if (ret != filesize) {
- tinyexr::SetErrorMessage("`fread' error. file may be corrupted.", err);
- return TINYEXR_ERROR_INVALID_FILE;
- }
- }
-
return ParseEXRMultipartHeaderFromMemory(
- exr_headers, num_headers, exr_version, &buf.at(0), filesize, err);
+ exr_headers, num_headers, exr_version, file.data, file.size, err);
}
int ParseEXRVersionFromMemory(EXRVersion *version, const unsigned char *memory,
@@ -8186,16 +8841,10 @@ int ParseEXRVersionFromFile(EXRVersion *version, const char *filename) {
return TINYEXR_ERROR_CANT_OPEN_FILE;
}
- size_t file_size;
- // Compute size
- fseek(fp, 0, SEEK_END);
- file_size = static_cast<size_t>(ftell(fp));
- fseek(fp, 0, SEEK_SET);
-
- if (file_size < tinyexr::kEXRVersionSize) {
- return TINYEXR_ERROR_INVALID_FILE;
- }
-
+ // Try to read kEXRVersionSize bytes; if the file is shorter than
+ // kEXRVersionSize, this will produce an error. This avoids a call to
+ // fseek(fp, 0, SEEK_END), which is not required to be supported by C
+ // implementations.
unsigned char buf[tinyexr::kEXRVersionSize];
size_t ret = fread(&buf[0], 1, tinyexr::kEXRVersionSize, fp);
fclose(fp);
@@ -8253,7 +8902,7 @@ int LoadEXRMultipartImageFromMemory(EXRImage *exr_images,
chunk_offset_table_list.resize(chunk_offset_table_list.size() + 1);
tinyexr::OffsetData& offset_data = chunk_offset_table_list.back();
if (!exr_headers[i]->tiled || exr_headers[i]->tile_level_mode == TINYEXR_TILE_ONE_LEVEL) {
- tinyexr::InitSingleResolutionOffsets(offset_data, exr_headers[i]->chunk_count);
+ tinyexr::InitSingleResolutionOffsets(offset_data, size_t(exr_headers[i]->chunk_count));
std::vector<tinyexr::tinyexr_uint64>& offset_table = offset_data.offsets[0][0];
for (size_t c = 0; c < offset_table.size(); c++) {
@@ -8273,7 +8922,10 @@ int LoadEXRMultipartImageFromMemory(EXRImage *exr_images,
} else {
{
std::vector<int> num_x_tiles, num_y_tiles;
- tinyexr::PrecalculateTileInfo(num_x_tiles, num_y_tiles, exr_headers[i]);
+ if (!tinyexr::PrecalculateTileInfo(num_x_tiles, num_y_tiles, exr_headers[i])) {
+ tinyexr::SetErrorMessage("Invalid tile info.", err);
+ return TINYEXR_ERROR_INVALID_DATA;
+ }
int num_blocks = InitTileOffsets(offset_data, exr_headers[i], num_x_tiles, num_y_tiles);
if (num_blocks != exr_headers[i]->chunk_count) {
tinyexr::SetErrorMessage("Invalid offset table size.", err);
@@ -8303,7 +8955,7 @@ int LoadEXRMultipartImageFromMemory(EXRImage *exr_images,
for (size_t i = 0; i < static_cast<size_t>(num_parts); i++) {
tinyexr::OffsetData &offset_data = chunk_offset_table_list[i];
- // First check 'part number' is identitical to 'i'
+ // First check 'part number' is identical to 'i'
for (unsigned int l = 0; l < offset_data.offsets.size(); ++l)
for (unsigned int dy = 0; dy < offset_data.offsets[l].size(); ++dy)
for (unsigned int dx = 0; dx < offset_data.offsets[l][dy].size(); ++dx) {
@@ -8345,44 +8997,164 @@ int LoadEXRMultipartImageFromFile(EXRImage *exr_images,
return TINYEXR_ERROR_INVALID_ARGUMENT;
}
- FILE *fp = NULL;
-#ifdef _WIN32
-#if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) // MSVC, MinGW GCC, or Clang.
- errno_t errcode =
- _wfopen_s(&fp, tinyexr::UTF8ToWchar(filename).c_str(), L"rb");
- if (errcode != 0) {
+ MemoryMappedFile file(filename);
+ if (!file.valid()) {
tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err);
return TINYEXR_ERROR_CANT_OPEN_FILE;
}
+
+ return LoadEXRMultipartImageFromMemory(exr_images, exr_headers, num_parts,
+ file.data, file.size, err);
+}
+
+int SaveEXRToMemory(const float *data, int width, int height, int components,
+ const int save_as_fp16, unsigned char **outbuf, const char **err) {
+
+ if ((components == 1) || components == 3 || components == 4) {
+ // OK
+ } else {
+ std::stringstream ss;
+ ss << "Unsupported component value : " << components << std::endl;
+
+ tinyexr::SetErrorMessage(ss.str(), err);
+ return TINYEXR_ERROR_INVALID_ARGUMENT;
+ }
+
+ EXRHeader header;
+ InitEXRHeader(&header);
+
+ if ((width < 16) && (height < 16)) {
+ // No compression for small image.
+ header.compression_type = TINYEXR_COMPRESSIONTYPE_NONE;
+ } else {
+ header.compression_type = TINYEXR_COMPRESSIONTYPE_ZIP;
+ }
+
+ EXRImage image;
+ InitEXRImage(&image);
+
+ image.num_channels = components;
+
+ std::vector<float> images[4];
+
+ if (components == 1) {
+ images[0].resize(static_cast<size_t>(width * height));
+ memcpy(images[0].data(), data, sizeof(float) * size_t(width * height));
+ } else {
+ images[0].resize(static_cast<size_t>(width * height));
+ images[1].resize(static_cast<size_t>(width * height));
+ images[2].resize(static_cast<size_t>(width * height));
+ images[3].resize(static_cast<size_t>(width * height));
+
+ // Split RGB(A)RGB(A)RGB(A)... into R, G and B(and A) layers
+ for (size_t i = 0; i < static_cast<size_t>(width * height); i++) {
+ images[0][i] = data[static_cast<size_t>(components) * i + 0];
+ images[1][i] = data[static_cast<size_t>(components) * i + 1];
+ images[2][i] = data[static_cast<size_t>(components) * i + 2];
+ if (components == 4) {
+ images[3][i] = data[static_cast<size_t>(components) * i + 3];
+ }
+ }
+ }
+
+ float *image_ptr[4] = {0, 0, 0, 0};
+ if (components == 4) {
+ image_ptr[0] = &(images[3].at(0)); // A
+ image_ptr[1] = &(images[2].at(0)); // B
+ image_ptr[2] = &(images[1].at(0)); // G
+ image_ptr[3] = &(images[0].at(0)); // R
+ } else if (components == 3) {
+ image_ptr[0] = &(images[2].at(0)); // B
+ image_ptr[1] = &(images[1].at(0)); // G
+ image_ptr[2] = &(images[0].at(0)); // R
+ } else if (components == 1) {
+ image_ptr[0] = &(images[0].at(0)); // A
+ }
+
+ image.images = reinterpret_cast<unsigned char **>(image_ptr);
+ image.width = width;
+ image.height = height;
+
+ header.num_channels = components;
+ header.channels = static_cast<EXRChannelInfo *>(malloc(
+ sizeof(EXRChannelInfo) * static_cast<size_t>(header.num_channels)));
+ // Must be (A)BGR order, since most of EXR viewers expect this channel order.
+ if (components == 4) {
+#ifdef _MSC_VER
+ strncpy_s(header.channels[0].name, "A", 255);
+ strncpy_s(header.channels[1].name, "B", 255);
+ strncpy_s(header.channels[2].name, "G", 255);
+ strncpy_s(header.channels[3].name, "R", 255);
#else
- // Unknown compiler or MinGW without MINGW_HAS_SECURE_API.
- fp = fopen(filename, "rb");
+ strncpy(header.channels[0].name, "A", 255);
+ strncpy(header.channels[1].name, "B", 255);
+ strncpy(header.channels[2].name, "G", 255);
+ strncpy(header.channels[3].name, "R", 255);
#endif
+ header.channels[0].name[strlen("A")] = '\0';
+ header.channels[1].name[strlen("B")] = '\0';
+ header.channels[2].name[strlen("G")] = '\0';
+ header.channels[3].name[strlen("R")] = '\0';
+ } else if (components == 3) {
+#ifdef _MSC_VER
+ strncpy_s(header.channels[0].name, "B", 255);
+ strncpy_s(header.channels[1].name, "G", 255);
+ strncpy_s(header.channels[2].name, "R", 255);
#else
- fp = fopen(filename, "rb");
+ strncpy(header.channels[0].name, "B", 255);
+ strncpy(header.channels[1].name, "G", 255);
+ strncpy(header.channels[2].name, "R", 255);
#endif
- if (!fp) {
- tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err);
- return TINYEXR_ERROR_CANT_OPEN_FILE;
+ header.channels[0].name[strlen("B")] = '\0';
+ header.channels[1].name[strlen("G")] = '\0';
+ header.channels[2].name[strlen("R")] = '\0';
+ } else {
+#ifdef _MSC_VER
+ strncpy_s(header.channels[0].name, "A", 255);
+#else
+ strncpy(header.channels[0].name, "A", 255);
+#endif
+ header.channels[0].name[strlen("A")] = '\0';
}
- size_t filesize;
- // Compute size
- fseek(fp, 0, SEEK_END);
- filesize = static_cast<size_t>(ftell(fp));
- fseek(fp, 0, SEEK_SET);
+ header.pixel_types = static_cast<int *>(
+ malloc(sizeof(int) * static_cast<size_t>(header.num_channels)));
+ header.requested_pixel_types = static_cast<int *>(
+ malloc(sizeof(int) * static_cast<size_t>(header.num_channels)));
+ for (int i = 0; i < header.num_channels; i++) {
+ header.pixel_types[i] =
+ TINYEXR_PIXELTYPE_FLOAT; // pixel type of input image
- std::vector<unsigned char> buf(filesize); // @todo { use mmap }
- {
- size_t ret;
- ret = fread(&buf[0], 1, filesize, fp);
- assert(ret == filesize);
- fclose(fp);
- (void)ret;
+ if (save_as_fp16 > 0) {
+ header.requested_pixel_types[i] =
+ TINYEXR_PIXELTYPE_HALF; // save with half(fp16) pixel format
+ } else {
+ header.requested_pixel_types[i] =
+ TINYEXR_PIXELTYPE_FLOAT; // save with float(fp32) pixel format(i.e.
+ // no precision reduction)
+ }
}
- return LoadEXRMultipartImageFromMemory(exr_images, exr_headers, num_parts,
- &buf.at(0), filesize, err);
+
+ unsigned char *mem_buf;
+ size_t mem_size = SaveEXRImageToMemory(&image, &header, &mem_buf, err);
+
+ if (mem_size == 0) {
+ return TINYEXR_ERROR_SERIALIZATION_FAILED;
+ }
+
+ free(header.channels);
+ free(header.pixel_types);
+ free(header.requested_pixel_types);
+
+ if (mem_size > size_t(std::numeric_limits<int>::max())) {
+ free(mem_buf);
+ return TINYEXR_ERROR_DATA_TOO_LARGE;
+ }
+
+ (*outbuf) = mem_buf;
+
+ return int(mem_size);
}
int SaveEXR(const float *data, int width, int height, int components,
@@ -8413,18 +9185,20 @@ int SaveEXR(const float *data, int width, int height, int components,
image.num_channels = components;
std::vector<float> images[4];
+ const size_t pixel_count =
+ static_cast<size_t>(width) * static_cast<size_t>(height);
if (components == 1) {
- images[0].resize(static_cast<size_t>(width * height));
- memcpy(images[0].data(), data, sizeof(float) * size_t(width * height));
+ images[0].resize(pixel_count);
+ memcpy(images[0].data(), data, sizeof(float) * pixel_count);
} else {
- images[0].resize(static_cast<size_t>(width * height));
- images[1].resize(static_cast<size_t>(width * height));
- images[2].resize(static_cast<size_t>(width * height));
- images[3].resize(static_cast<size_t>(width * height));
+ images[0].resize(pixel_count);
+ images[1].resize(pixel_count);
+ images[2].resize(pixel_count);
+ images[3].resize(pixel_count);
// Split RGB(A)RGB(A)RGB(A)... into R, G and B(and A) layers
- for (size_t i = 0; i < static_cast<size_t>(width * height); i++) {
+ for (size_t i = 0; i < pixel_count; i++) {
images[0][i] = data[static_cast<size_t>(components) * i + 0];
images[1][i] = data[static_cast<size_t>(components) * i + 1];
images[2][i] = data[static_cast<size_t>(components) * i + 2];
@@ -8513,9 +9287,6 @@ int SaveEXR(const float *data, int width, int height, int components,
}
int ret = SaveEXRImageToFile(&image, &header, outfilename, err);
- if (ret != TINYEXR_SUCCESS) {
- return ret;
- }
free(header.channels);
free(header.pixel_types);
@@ -8525,7 +9296,7 @@ int SaveEXR(const float *data, int width, int height, int components,
}
#ifdef __clang__
-// zero-as-null-ppinter-constant
+// zero-as-null-pointer-constant
#pragma clang diagnostic pop
#endif
diff --git a/graphics/asymptote/tinyexr/transparent.exr b/graphics/asymptote/tinyexr/transparent.exr
new file mode 100644
index 0000000000..617d4704d9
--- /dev/null
+++ b/graphics/asymptote/tinyexr/transparent.exr
Binary files differ
diff --git a/graphics/asymptote/cudareflect/tinyexr/vcbuild.bat b/graphics/asymptote/tinyexr/vcbuild.bat
index c465052f2b..c465052f2b 100644
--- a/graphics/asymptote/cudareflect/tinyexr/vcbuild.bat
+++ b/graphics/asymptote/tinyexr/vcbuild.bat
diff --git a/graphics/asymptote/cudareflect/tinyexr/vcsetup2019.bat b/graphics/asymptote/tinyexr/vcsetup2019.bat
index 799f6da780..799f6da780 100644
--- a/graphics/asymptote/cudareflect/tinyexr/vcsetup2019.bat
+++ b/graphics/asymptote/tinyexr/vcsetup2019.bat
diff --git a/graphics/asymptote/tr.h b/graphics/asymptote/tr.h
index d1c7dfb04e..1e3ed0ac4e 100644
--- a/graphics/asymptote/tr.h
+++ b/graphics/asymptote/tr.h
@@ -78,12 +78,8 @@
#include <OpenGL/gl.h>
#else
-#ifdef __MSDOS__
-#include </usr/include/w32api/GL/gl.h>
-#else
#include <GL/gl.h>
#endif
-#endif
#ifdef __cplusplus
diff --git a/graphics/asymptote/types.cc b/graphics/asymptote/types.cc
index ecbb409cdf..065ec4dde0 100644
--- a/graphics/asymptote/types.cc
+++ b/graphics/asymptote/types.cc
@@ -18,7 +18,7 @@
#include "runtriple.h"
#include "access.h"
#include "virtualfieldaccess.h"
-#include "process.h"
+#include "asyprocess.h"
namespace run {
void arrayDeleteHelper(vm::stack *Stack);
@@ -31,6 +31,8 @@ void arrayDeleteHelper(vm::stack *Stack);
namespace types {
+const signature::OPEN_t signature::OPEN;
+
/* Base types */
#define PRIMITIVE(name,Name,asyName) \
primitiveTy p##Name(ty_##name); \
@@ -74,14 +76,14 @@ void ty::print(ostream& out) const
#define FIELD(Type, name, func) \
if (sig == 0 && id == name) { \
static trans::virtualFieldAccess a(run::func); \
- static trans::varEntry v(Type(), &a, 0, position()); \
+ static trans::varEntry v(Type(), &a, 0, nullPos); \
return &v; \
}
#define RWFIELD(Type, name, getter, setter) \
if (sig == 0 && id == name) { \
static trans::virtualFieldAccess a(run::getter, run::setter); \
- static trans::varEntry v(Type(), &a, 0, position()); \
+ static trans::varEntry v(Type(), &a, 0, nullPos); \
return &v; \
}
@@ -90,7 +92,7 @@ void ty::print(ostream& out) const
equivalent(sig, Type()->getSignature())) \
{ \
static trans::virtualFieldAccess a(run::func, 0, run::func##Helper); \
- static trans::varEntry v(Type(), &a, 0, position()); \
+ static trans::varEntry v(Type(), &a, 0, nullPos); \
return &v; \
}
@@ -102,7 +104,7 @@ void ty::print(ostream& out) const
/* for some fields, v needs to be dynamic */ \
/* e.g. when the function type depends on an array type. */ \
trans::varEntry *v = \
- new trans::varEntry(name##Type(), &a, 0, position()); \
+ new trans::varEntry(name##Type(), &a, 0, nullPos); \
return v; \
}
@@ -173,20 +175,6 @@ trans::varEntry *primitiveTy::virtualField(symbol id, signature *sig)
return 0;
}
-ty *overloadedDimensionType() {
- overloaded *o=new overloaded;
- o->add(dimensionType());
- o->add(IntArray());
- return o;
-}
-
-ty *overloadedModeType() {
- overloaded *o=new overloaded;
- o->add(modeType());
- o->add(primBoolean());
- return o;
-}
-
ty *ty::virtualFieldGetType(symbol id)
{
trans::varEntry *v = virtualField(id, 0);
@@ -197,12 +185,12 @@ ty *primitiveTy::virtualFieldGetType(symbol id)
{
if(kind == ty_file) {
if (id == SYM(dimension))
- return overloadedDimensionType();
+ return dimensionType();
if (id == SYM(line) || id == SYM(csv) ||
id == SYM(word) || id == SYM(singlereal) ||
id == SYM(singleint) || id == SYM(signedint))
- return overloadedModeType();
+ return modeType();
if (id == SYM(read))
return readType();
@@ -429,8 +417,9 @@ bool equivalent(const signature *s1, const signature *s2)
else if (s2->isOpen)
return false;
- if (s1->formals.size() != s2->formals.size())
+ if (s1->formals.size() != s2->formals.size()) {
return false;
+ }
if (!std::equal(s1->formals.begin(),s1->formals.end(),s2->formals.begin(),
(bool (*)(const formal&,const formal&)) equivalent))
diff --git a/graphics/asymptote/types.h b/graphics/asymptote/types.h
index 36d44d0009..a5fff69593 100644
--- a/graphics/asymptote/types.h
+++ b/graphics/asymptote/types.h
@@ -345,7 +345,9 @@ struct signature : public gc {
: numKeywordOnly(0), rest(0), isOpen(false)
{}
- static const struct OPEN_t {} OPEN;
+ struct OPEN_t {};
+
+ static const OPEN_t OPEN;
explicit signature(OPEN_t) : numKeywordOnly(0), rest(0), isOpen(true) {}
diff --git a/graphics/asymptote/util.cc b/graphics/asymptote/util.cc
index 8cc0a76aee..bfabacdebd 100644
--- a/graphics/asymptote/util.cc
+++ b/graphics/asymptote/util.cc
@@ -15,15 +15,29 @@
#include <cfloat>
#include <sstream>
#include <cerrno>
-#include <sys/wait.h>
-#include <sys/param.h>
+#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
-#include <unistd.h>
#include <cstring>
#include <algorithm>
+
+
+#if !defined(_WIN32)
+#include <sys/wait.h>
+#include <sys/param.h>
+#include <unistd.h>
#include <dirent.h>
+#else
+#include <Windows.h>
+#include <Shlwapi.h>
+#include <Shellapi.h>
+#include <direct.h>
+#include "win32helpers.h"
+
+#define getcwd _getcwd
+#define chdir _chdir
+#endif
#include "util.h"
#include "settings.h"
@@ -66,6 +80,106 @@ string demangle(const char* s)
}
#endif
+// windows specific unnamed spaces
+#if defined(_WIN32)
+namespace w32 = camp::w32;
+
+namespace
+{
+/** @brief System, but for Windows.
+ * Any handle placed in outHandle must be properly closed */
+int SystemWin32(const mem::vector<string>& command, int quiet, bool wait,
+ const char* hint, const char* application, int* ppid);
+}
+
+namespace
+{
+int SystemWin32(const mem::vector<string>& command, int quiet, bool wait,
+ const char* hint, const char* application, int* ppid)
+{
+ cout.flush();
+ if (command.empty())
+ {
+ camp::reportError("Command cannot be empty");
+ return -1;
+ }
+ string cmdlineStr=camp::w32::buildWindowsCmd(command);
+
+ STARTUPINFOA startInfo={};
+ startInfo.cb=sizeof(startInfo);
+ startInfo.dwFlags=STARTF_USESTDHANDLES;
+
+ SECURITY_ATTRIBUTES sa;
+ sa.nLength= sizeof(sa);
+ sa.lpSecurityDescriptor=nullptr;
+ sa.bInheritHandle=true;
+
+ PROCESS_INFORMATION procInfo= {};
+
+ // windows' "/dev/null" file (a.k.a. "NUL")
+ {
+ w32::HandleRaiiWrapper const nulFileHandle=CreateFileA(
+ "NUL", GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,
+ &sa,
+ CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL,
+ nullptr);
+
+ // set quiet info
+ startInfo.hStdInput= GetStdHandle(STD_INPUT_HANDLE);
+ startInfo.hStdOutput= quiet >= 1 ? nulFileHandle.getHandle() : GetStdHandle(STD_OUTPUT_HANDLE);
+ startInfo.hStdError= quiet >= 2 ? nulFileHandle.getHandle() : GetStdHandle(STD_ERROR_HANDLE);
+
+ ostringstream errorMessage;
+ errorMessage << "Cannot open " << application << "\n";
+ string const errorMessageOut=errorMessage.str();
+ w32::checkResult(CreateProcessA(
+ nullptr,
+ cmdlineStr.data(),
+ nullptr, nullptr, true,
+ 0,
+ nullptr, nullptr,
+ &startInfo,
+ &procInfo),
+ errorMessageOut.c_str());
+ }
+ if (ppid)
+ {
+ *ppid=static_cast<int>(procInfo.dwProcessId);
+ }
+
+ w32::HandleRaiiWrapper const procHandle(procInfo.hProcess);
+ w32::HandleRaiiWrapper const threadHandle(procInfo.hThread);
+
+
+ if (!wait)
+ {
+ return 0;
+ }
+
+ DWORD retcode=-1;
+ // else, wait
+ switch (WaitForSingleObject(procHandle.getHandle(), INFINITE))
+ {
+ case WAIT_OBJECT_0: {
+ w32::checkResult(GetExitCodeProcess(
+ procHandle.getHandle(), &retcode
+ ),"Cannot get exit code of process");
+ break;
+ }
+ case WAIT_ABANDONED:// also impossible, we are waiting for a process
+ case WAIT_TIMEOUT: // impossible, since we set timeout to infinite
+ case WAIT_FAILED:
+ default:
+ camp::reportError("Waiting for process failed");
+ break;
+ }
+ return static_cast<int>(retcode);
+}
+}
+
+#endif
+
char *Strdup(string s)
{
size_t size=s.size()+1;
@@ -92,32 +206,32 @@ char *StrdupMalloc(string s)
string stripDir(string name)
{
- size_t p;
-#ifdef __MSDOS__
- p=name.rfind('\\');
- if(p < string::npos) name.erase(0,p+1);
+#if defined(_WIN32)
+ char constexpr separator= '\\';
+ std::replace(name.begin(), name.end(), '/', separator);
+#else
+ char constexpr separator= '/';
#endif
- p=name.rfind('/');
+
+ size_t p=name.rfind(separator);
if(p < string::npos) name.erase(0,p+1);
return name;
}
string stripFile(string name)
{
- size_t p;
- bool dir=false;
-#ifdef __MSDOS__
- p=name.rfind('\\');
- if(p < string::npos) {
- dir=true;
- while(p > 0 && name[p-1] == '\\') --p;
- name.erase(p+1);
- }
+#if defined(_WIN32)
+ char constexpr separator = '\\';
+ std::replace(name.begin(), name.end(), '/', separator);
+#else
+ char constexpr separator= '/';
#endif
- p=name.rfind('/');
+
+ bool dir=false;
+ size_t p=name.rfind(separator);
if(p < string::npos) {
dir=true;
- while(p > 0 && name[p-1] == '/') --p;
+ while(p > 0 && name[p-1] == separator) --p;
name.erase(p+1);
}
@@ -148,13 +262,49 @@ void spaceToUnderscore(string& s)
s[p]='_';
}
+string escapeCharacters(string const& inText, std::unordered_set<char> const& charactersToEscape)
+{
+ mem::vector<char> retBuffer;
+ retBuffer.reserve(inText.length() + 1);
+
+ for (const char textChar : inText)
+ {
+ if (charactersToEscape.find(textChar) != charactersToEscape.end())
+ {
+ retBuffer.emplace_back('\\');
+ }
+ retBuffer.emplace_back(textChar);
+ }
+ retBuffer.emplace_back(0);
+
+ return retBuffer.data();
+}
+
string Getenv(const char *name, bool msdos)
{
+#if defined(_WIN32)
+ size_t envSize=0;
+ getenv_s(&envSize,nullptr,0,name);
+ if (envSize == 0)
+ {
+ return "";
+ }
+
+ mem::vector<char> resultingData(envSize);
+ if (getenv_s(&envSize, resultingData.data(), resultingData.size(), name) != 0)
+ {
+ camp::reportError("Cannot retrieve environment variable");
+ }
+
+ return resultingData.data();
+
+#else
char *s=getenv(name);
if(!s) return "";
string S=string(s);
if(msdos) backslashToSlash(S);
return S;
+#endif
}
void readDisabled()
@@ -209,12 +359,16 @@ string auxname(string filename, string suffix)
sighandler_t Signal(int signum, sighandler_t handler)
{
+#if !defined(_WIN32)
struct sigaction action,oldaction;
action.sa_handler=handler;
sigemptyset(&action.sa_mask);
action.sa_flags=0;
return sigaction(signum,&action,&oldaction) == 0 ? oldaction.sa_handler :
SIG_ERR;
+#else
+ return signal(signum, handler);
+#endif
}
void push_split(mem::vector<string>& a, const string& S)
@@ -278,6 +432,9 @@ void execError(const char *command, const char *hint, const char *application)
int System(const mem::vector<string> &command, int quiet, bool wait,
const char *hint, const char *application, int *ppid)
{
+#if _WIN32
+ return SystemWin32(command, quiet, wait, hint, application, ppid);
+#else
int status;
cout.flush(); // Flush stdout to avoid duplicate output.
@@ -288,10 +445,6 @@ int System(const mem::vector<string> &command, int quiet, bool wait,
if(pid == -1)
camp::reportError("Cannot fork process");
-#ifdef __MSDOS__
- wait=true;
-#endif
-
if(pid == 0) {
if(interact::interactive) signal(SIGINT,SIG_IGN);
if(quiet) {
@@ -343,6 +496,7 @@ int System(const mem::vector<string> &command, int quiet, bool wait,
}
}
}
+#endif
}
string stripblanklines(const string& s)
@@ -415,6 +569,38 @@ void push_command(mem::vector<string>& a, const string& s)
}
void popupHelp() {
+#if defined(_WIN32)
+ auto const pdfviewer= getSetting<string>("pdfviewer");
+ string const docPath= docdir + dirsep + "asymptote.pdf";
+ if (!pdfviewer.empty())
+ {
+ mem::vector<string> cmd;
+ push_command(cmd, pdfviewer);
+
+ if (auto const viewerOpts= getSetting<string>("pdfviewerOptions"); !viewerOpts.empty())
+ {
+ istringstream viewerOptStream(viewerOpts);
+ string tmp;
+ while (viewerOptStream >> tmp)
+ {
+ if (!tmp.empty())
+ {
+ cmd.push_back(tmp);
+ }
+ }
+ }
+ cmd.push_back(docPath);
+ System(cmd, 0, false, "pdfviewer", "your PDF viewer");
+ }
+ else
+ {
+ // pdf viewer not given, let windows decide which program to use
+ camp::w32::checkShellExecuteResult(
+ reinterpret_cast<INT_PTR>(ShellExecuteA(nullptr, "open", docPath.c_str(), nullptr, nullptr, SW_SHOWNORMAL)),
+ false
+ );
+ }
+#else
// If the popped-up help is already running, pid stores the pid of the viewer.
static int pid=0;
@@ -432,6 +618,7 @@ void popupHelp() {
cmd.push_back(docdir+dirsep+"asymptote.pdf");
status=System(cmd,0,false,"pdfviewer","your PDF viewer",&pid);
}
+#endif
}
const char *intrange="integer argument is outside valid range";
@@ -464,3 +651,12 @@ Int Intcast(unsignedInt n)
vm::error(intrange);
return (Int) n;
}
+
+bool fileExists(string const& path)
+{
+#if defined(_WIN32)
+ return PathFileExistsA(path.c_str());
+#else
+ return access(path.c_str(), R_OK) == 0;
+#endif
+}
diff --git a/graphics/asymptote/util.h b/graphics/asymptote/util.h
index 699cef521e..44eac86efd 100644
--- a/graphics/asymptote/util.h
+++ b/graphics/asymptote/util.h
@@ -21,8 +21,15 @@ extern "C" int sigaction(int signum, const struct sigaction *act, struct sigacti
#include <csignal>
#include "common.h"
+#include <unordered_set>
+#if !defined(_MSC_VER)
#include <strings.h>
+#else
+#include <cstring>
+#define strcasecmp _stricmp
+#define strncasecmp _strnicmp
+#endif
// Demangle a typeid name (if the proper library is installed.
string demangle(const char *s);
@@ -41,6 +48,9 @@ string stripFile(string name);
// Strip the extension from a filename.
string stripExt(string name, const string& suffix="");
+// Escapes characters specified in set
+string escapeCharacters(string const& inText, std::unordered_set<char> const& charactersToEscape);
+
void readDisabled();
void writeDisabled();
@@ -163,4 +173,6 @@ unsignedInt unsignedIntcast(Int n);
int intcast(Int n);
Int Intcast(unsignedInt n);
+bool fileExists(string const& path);
+
#endif
diff --git a/graphics/asymptote/v3dfile.cc b/graphics/asymptote/v3dfile.cc
index f9a66e84e6..73ac829aeb 100644
--- a/graphics/asymptote/v3dfile.cc
+++ b/graphics/asymptote/v3dfile.cc
@@ -316,9 +316,12 @@ void gzv3dfile::close()
{
if(!destroyed) {
finalize();
+
+ std::vector<uint8_t> const resultingData = memxdrfile.createCopyOfCurrentData();
+
memxdrfile.close();
gzFile file=gzopen(name.c_str(), "wb9");
- gzwrite(file,data(),length());
+ gzwrite(file, resultingData.data(), resultingData.size());
gzclose(file);
if(settings::verbose > 0)
cout << "Wrote " << name << endl;
@@ -326,16 +329,6 @@ void gzv3dfile::close()
}
}
-char const* gzv3dfile::data() const
-{
- return memxdrfile.stream();
-}
-
-size_t const& gzv3dfile::length() const
-{
- return memxdrfile.getLength();
-}
-
uint32_t LightHeader::getWordSize(bool singleprecision) const
{
return (singleprecision ? 1 : 2)*3+3;
diff --git a/graphics/asymptote/v3dfile.h b/graphics/asymptote/v3dfile.h
index 0c296919b8..8b145c6fef 100644
--- a/graphics/asymptote/v3dfile.h
+++ b/graphics/asymptote/v3dfile.h
@@ -159,12 +159,6 @@ public:
protected:
xdr::oxstream& getXDRFile() override;
- [[nodiscard]]
- char const* data() const;
-
- [[nodiscard]]
- size_t const& length() const;
-
private:
xdr::memoxstream memxdrfile;
string name;
diff --git a/graphics/asymptote/v3dheadertypes.h b/graphics/asymptote/v3dheadertypes.h
index 3e29f8469f..b5e0c42e22 100644
--- a/graphics/asymptote/v3dheadertypes.h
+++ b/graphics/asymptote/v3dheadertypes.h
@@ -1,67 +1,65 @@
// Enum class for v3dheadertypes
// AUTO-GENERATED from v3dheadertypes.csv
-// Generated at 2024-06-21 17:44:46+00:00
-
namespace camp
{
enum v3dheadertypes : uint32_t
{
-canvasWidth=1,
// UINT Canvas width
+canvasWidth=1,
-canvasHeight=2,
// UINT Canvas heighot
+canvasHeight=2,
-absolute=3,
// BOOL true: absolute size; false: scale to canvas
+absolute=3,
-minBound=4,
// TRIPLE Scene minimum bounding box corners
+minBound=4,
-maxBound=5,
// TRIPLE Scene maximum bounding box corners
+maxBound=5,
-orthographic=6,
// BOOL true: orthographic; false: perspective
+orthographic=6,
-angleOfView=7,
// REAL Field of view angle (in radians)
+angleOfView=7,
-initialZoom=8,
// REAL Initial zoom
+initialZoom=8,
-viewportShift=9,
// PAIR Viewport shift (for perspective projection)
+viewportShift=9,
-viewportMargin=10,
// PAIR Margin around viewport
+viewportMargin=10,
-light=11,
// RGB Direction and color of each point light source
+light=11,
-background=12,
// RGBA Background color
+background=12,
-zoomFactor=13,
// REAL Zoom base factor
+zoomFactor=13,
-zoomPinchFactor=14,
// REAL Zoom pinch factor
+zoomPinchFactor=14,
-zoomPinchCap=15,
// REAL Zoom pinch limit
+zoomPinchCap=15,
-zoomStep=16,
// REAL Zoom power step
+zoomStep=16,
-shiftHoldDistance=17,
// REAL Shift-mode maximum hold distance (pixels)
+shiftHoldDistance=17,
-shiftWaitTime=18,
// REAL Shift-mode hold time (milliseconds)
+shiftWaitTime=18,
-vibrateTime=19,
// REAL Shift-mode vibrate time (milliseconds)
+vibrateTime=19,
};
diff --git a/graphics/asymptote/v3dheadertypes.py b/graphics/asymptote/v3dheadertypes.py
deleted file mode 100644
index 988128ff44..0000000000
--- a/graphics/asymptote/v3dheadertypes.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python3
-# Enum class for v3dheadertypes
-""" AUTO-GENERATED from v3dheadertypes.csv """
-# Generated at 2024-06-21 17:45:18+00:00
-
-class v3dheadertypes:
- v3dheadertypes_canvasWidth=1
- # UINT Canvas width
-
- v3dheadertypes_canvasHeight=2
- # UINT Canvas heighot
-
- v3dheadertypes_absolute=3
- # BOOL true: absolute size; false: scale to canvas
-
- v3dheadertypes_minBound=4
- # TRIPLE Scene minimum bounding box corners
-
- v3dheadertypes_maxBound=5
- # TRIPLE Scene maximum bounding box corners
-
- v3dheadertypes_orthographic=6
- # BOOL true: orthographic; false: perspective
-
- v3dheadertypes_angleOfView=7
- # REAL Field of view angle (in radians)
-
- v3dheadertypes_initialZoom=8
- # REAL Initial zoom
-
- v3dheadertypes_viewportShift=9
- # PAIR Viewport shift (for perspective projection)
-
- v3dheadertypes_viewportMargin=10
- # PAIR Margin around viewport
-
- v3dheadertypes_light=11
- # RGB Direction and color of each point light source
-
- v3dheadertypes_background=12
- # RGBA Background color
-
- v3dheadertypes_zoomFactor=13
- # REAL Zoom base factor
-
- v3dheadertypes_zoomPinchFactor=14
- # REAL Zoom pinch factor
-
- v3dheadertypes_zoomPinchCap=15
- # REAL Zoom pinch limit
-
- v3dheadertypes_zoomStep=16
- # REAL Zoom power step
-
- v3dheadertypes_shiftHoldDistance=17
- # REAL Shift-mode maximum hold distance (pixels)
-
- v3dheadertypes_shiftWaitTime=18
- # REAL Shift-mode hold time (milliseconds)
-
- v3dheadertypes_vibrateTime=19
- # REAL Shift-mode vibrate time (milliseconds)
-
-# End of File
diff --git a/graphics/asymptote/v3dtypes.h b/graphics/asymptote/v3dtypes.h
index 9713798875..e8e50cadc7 100644
--- a/graphics/asymptote/v3dtypes.h
+++ b/graphics/asymptote/v3dtypes.h
@@ -1,36 +1,59 @@
// Enum class for v3dtypes
// AUTO-GENERATED from v3dtypes.csv
-// Generated at 2024-06-21 17:44:46+00:00
-
namespace camp
{
enum v3dtypes : uint32_t
{
material=1,
+
transform=2,
+
element=3,
+
centers=4,
+
header=5,
+
line=64,
+
triangle=65,
+
quad=66,
+
curve=128,
+
bezierTriangle=129,
+
bezierPatch=130,
+
lineColor=192,
+
triangleColor=193,
+
quadColor=194,
+
curveColor=256,
+
bezierTriangleColor=257,
+
bezierPatchColor=258,
+
triangles=512,
+
disk=1024,
+
cylinder=1025,
+
tube=1026,
+
sphere=1027,
+
halfSphere=1028,
+
animation=2048,
+
pixel=4096,
+
};
} // namespace camp
diff --git a/graphics/asymptote/v3dtypes.py b/graphics/asymptote/v3dtypes.py
deleted file mode 100644
index 9dab614b51..0000000000
--- a/graphics/asymptote/v3dtypes.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python3
-# Enum class for v3dtypes
-""" AUTO-GENERATED from v3dtypes.csv """
-# Generated at 2024-06-21 17:45:18+00:00
-
-class v3dtypes:
- v3dtypes_material=1
- v3dtypes_transform=2
- v3dtypes_element=3
- v3dtypes_centers=4
- v3dtypes_header=5
- v3dtypes_line=64
- v3dtypes_triangle=65
- v3dtypes_quad=66
- v3dtypes_curve=128
- v3dtypes_bezierTriangle=129
- v3dtypes_bezierPatch=130
- v3dtypes_lineColor=192
- v3dtypes_triangleColor=193
- v3dtypes_quadColor=194
- v3dtypes_curveColor=256
- v3dtypes_bezierTriangleColor=257
- v3dtypes_bezierPatchColor=258
- v3dtypes_triangles=512
- v3dtypes_disk=1024
- v3dtypes_cylinder=1025
- v3dtypes_tube=1026
- v3dtypes_sphere=1027
- v3dtypes_halfSphere=1028
- v3dtypes_animation=2048
- v3dtypes_pixel=4096
-# End of File
diff --git a/graphics/asymptote/vcpkg.json b/graphics/asymptote/vcpkg.json
new file mode 100644
index 0000000000..b3c43933b3
--- /dev/null
+++ b/graphics/asymptote/vcpkg.json
@@ -0,0 +1,74 @@
+{
+ "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
+
+ "builtin-baseline": "5e5d0e1cd7785623065e77eff011afdeec1a3574",
+ "name": "asymptote",
+ "version": "0.0-snapshot",
+ "dependencies": [
+ "zlib",
+ "glm",
+ {
+ "name": "getopt-win32",
+ "platform": "windows"
+ }
+ ],
+ "features": {
+ "threading": {
+ "description": "Enable threading support",
+ "dependencies": ["pthreads"]
+ },
+ "readline": {
+ "description": "Enable readline support",
+ "dependencies": [
+ "readline",
+ {
+ "name": "ncurses",
+ "platform": "!windows"
+ },
+ {
+ "name": "pdcurses",
+ "platform": "windows"
+ }
+ ]
+ },
+ "curl": {
+ "description": "Enable curl support",
+ "dependencies": ["curl"]
+ },
+ "eigen3": {
+ "description": "eigen3 support",
+ "dependencies": ["eigen3"]
+ },
+ "gsl": {
+ "description": "GSL support",
+ "dependencies": ["gsl"]
+ },
+ "fftw3": {
+ "description": "fftw3 support",
+ "dependencies": ["fftw3"]
+ },
+ "opengl": {
+ "description": "OpenGL Support",
+ "dependencies": [
+ "opengl",
+ "freeglut"
+ ]
+ },
+ "lsp": {
+ "description": "Language Server Protocol Support",
+ "dependencies": [
+ "rapidjson",
+ "boost-asio",
+ "boost-beast",
+ "boost-date-time",
+ "boost-chrono",
+ "boost-filesystem",
+ "boost-system",
+ "boost-uuid",
+ "boost-thread",
+ "boost-process",
+ "boost-program-options"
+ ]
+ }
+ }
+}
diff --git a/graphics/asymptote/version.texi.in b/graphics/asymptote/version.texi.in
new file mode 100644
index 0000000000..02d9702388
--- /dev/null
+++ b/graphics/asymptote/version.texi.in
@@ -0,0 +1,3 @@
+@set VERSION ${ASY_VERSION}
+@set Datadir asy-datadir
+@set Docdir asy-docdir
diff --git a/graphics/asymptote/versionTemplate.asy.in b/graphics/asymptote/versionTemplate.asy.in
new file mode 100644
index 0000000000..a9cc2fc568
--- /dev/null
+++ b/graphics/asymptote/versionTemplate.asy.in
@@ -0,0 +1,3 @@
+// This file is automatically generated. Do not modify manually
+
+string VERSION="${ASY_VERSION}";
diff --git a/graphics/asymptote/webgl/gl.js b/graphics/asymptote/webgl/gl.js
index 00375ee57f..024a886fc6 100644
--- a/graphics/asymptote/webgl/gl.js
+++ b/graphics/asymptote/webgl/gl.js
@@ -522,7 +522,7 @@ class vertexBuffer {
}
// indexed colored vertex
- iVertex(i,v,n,c=[0,0,0,0]) {
+ iVertex(i,v,n,onscreen,c=[0,0,0,0]) {
let i6=6*i;
this.vertices[i6]=v[0];
this.vertices[i6+1]=v[1];
@@ -536,7 +536,8 @@ class vertexBuffer {
this.colors[i4+1]=c[1];
this.colors[i4+2]=c[2];
this.colors[i4+3]=c[3];
- this.indices.push(i);
+ if(onscreen)
+ this.indices.push(i);
}
append(data) {
@@ -718,7 +719,7 @@ class BezierPatch extends Geometry {
if(color) {
let sum=color[0][3]+color[1][3]+color[2][3];
this.transparent=(n == 16 || n == 4) ?
- sum+color[3][3] < 1020 : sum < 765;
+ sum+color[3][3] < 4 : sum < 3;
} else
this.transparent=Materials[MaterialIndex].diffuse[3] < 1;
@@ -1811,7 +1812,7 @@ class BezierPatch extends Geometry {
// Check the horizontal flatness.
let h=Flatness(p0,p12,p3,p15);
// Check straightness of the horizontal edges and interior control curves.
- h=Math.max(Straightness(p0,p[4],p[8],p12));
+ h=Math.max(h,Straightness(p0,p[4],p[8],p12));
h=Math.max(h,Straightness(p[1],p[5],p[9],p[13]));
h=Math.max(h,Straightness(p3,p[7],p[11],p15));
h=Math.max(h,Straightness(p[2],p[6],p[10],p[14]));
@@ -2158,14 +2159,15 @@ class Triangles extends Geometry {
super();
this.CenterIndex=CenterIndex;
this.MaterialIndex=MaterialIndex;
- this.Min=this.Bounds(Positions,Math.min);
- this.Max=this.Bounds(Positions,Math.max);
- this.controlpoints=Positions;
- this.Normals=Normals;
- this.Colors=Colors;
- this.Indices=Indices;
+ this.controlpoints=window.Positions;
+ this.Normals=window.Normals;
+ this.Colors=window.Colors;
+ this.Indices=window.Indices;
this.transparent=Materials[this.MaterialIndex].diffuse[3] < 1;
+
+ this.Min=this.Bounds(this.controlpoints,Math.min);
+ this.Max=this.Bounds(this.controlpoints,Math.max);
}
Bounds(p,m) {
@@ -2188,6 +2190,7 @@ class Triangles extends Geometry {
}
process(p) {
+
this.data.vertices=new Array(6*p.length);
// Override materialIndex to encode color vs material
materialIndex=this.Colors.length > 0 ?
@@ -2199,41 +2202,40 @@ class Triangles extends Geometry {
let P0=p[PI[0]];
let P1=p[PI[1]];
let P2=p[PI[2]];
- if(!this.offscreen([P0,P1,P2])) {
- let NI=index.length > 1 ? index[1] : PI;
- if(!NI || NI.length == 0) NI=PI;
- if(this.Colors.length > 0) {
- let CI=index.length > 2 ? index[2] : PI;
- if(!CI || CI.length == 0) CI=PI;
- let C0=this.Colors[CI[0]];
- let C1=this.Colors[CI[1]];
- let C2=this.Colors[CI[2]];
- this.transparent |= C0[3]+C1[3]+C2[3] < 765;
- if(wireframe == 0) {
- this.data.iVertex(PI[0],P0,this.Normals[NI[0]],C0);
- this.data.iVertex(PI[1],P1,this.Normals[NI[1]],C1);
- this.data.iVertex(PI[2],P2,this.Normals[NI[2]],C2);
- } else {
- this.data.iVertex(PI[0],P0,this.Normals[NI[0]],C0);
- this.data.iVertex(PI[1],P1,this.Normals[NI[1]],C1);
- this.data.iVertex(PI[1],P1,this.Normals[NI[1]],C1);
- this.data.iVertex(PI[2],P2,this.Normals[NI[2]],C2);
- this.data.iVertex(PI[2],P2,this.Normals[NI[2]],C2);
- this.data.iVertex(PI[0],P0,this.Normals[NI[0]],C0);
- }
+ let onscreen=!this.offscreen([P0,P1,P2]);
+ let NI=index.length > 1 ? index[1] : PI;
+ if(!NI || NI.length == 0) NI=PI;
+ if(this.Colors.length > 0) {
+ let CI=index.length > 2 ? index[2] : PI;
+ if(!CI || CI.length == 0) CI=PI;
+ let C0=this.Colors[CI[0]];
+ let C1=this.Colors[CI[1]];
+ let C2=this.Colors[CI[2]];
+ this.transparent |= C0[3]+C1[3]+C2[3] < 3;
+ if(wireframe == 0) {
+ this.data.iVertex(PI[0],P0,this.Normals[NI[0]],onscreen,C0);
+ this.data.iVertex(PI[1],P1,this.Normals[NI[1]],onscreen,C1);
+ this.data.iVertex(PI[2],P2,this.Normals[NI[2]],onscreen,C2);
} else {
- if(wireframe == 0) {
- this.data.iVertex(PI[0],P0,this.Normals[NI[0]]);
- this.data.iVertex(PI[1],P1,this.Normals[NI[1]]);
- this.data.iVertex(PI[2],P2,this.Normals[NI[2]]);
- } else {
- this.data.iVertex(PI[0],P0,this.Normals[NI[0]]);
- this.data.iVertex(PI[1],P1,this.Normals[NI[1]]);
- this.data.iVertex(PI[1],P1,this.Normals[NI[1]]);
- this.data.iVertex(PI[2],P2,this.Normals[NI[2]]);
- this.data.iVertex(PI[2],P2,this.Normals[NI[2]]);
- this.data.iVertex(PI[0],P0,this.Normals[NI[0]]);
- }
+ this.data.iVertex(PI[0],P0,this.Normals[NI[0]],onscreen,C0);
+ this.data.iVertex(PI[1],P1,this.Normals[NI[1]],onscreen,C1);
+ this.data.iVertex(PI[1],P1,this.Normals[NI[1]],onscreen,C1);
+ this.data.iVertex(PI[2],P2,this.Normals[NI[2]],onscreen,C2);
+ this.data.iVertex(PI[2],P2,this.Normals[NI[2]],onscreen,C2);
+ this.data.iVertex(PI[0],P0,this.Normals[NI[0]],onscreen,C0);
+ }
+ } else {
+ if(wireframe == 0) {
+ this.data.iVertex(PI[0],P0,this.Normals[NI[0]],onscreen);
+ this.data.iVertex(PI[1],P1,this.Normals[NI[1]],onscreen);
+ this.data.iVertex(PI[2],P2,this.Normals[NI[2]],onscreen);
+ } else {
+ this.data.iVertex(PI[0],P0,this.Normals[NI[0]],onscreen);
+ this.data.iVertex(PI[1],P1,this.Normals[NI[1]],onscreen);
+ this.data.iVertex(PI[1],P1,this.Normals[NI[1]],onscreen);
+ this.data.iVertex(PI[2],P2,this.Normals[NI[2]],onscreen);
+ this.data.iVertex(PI[2],P2,this.Normals[NI[2]],onscreen);
+ this.data.iVertex(PI[0],P0,this.Normals[NI[0]],onscreen);
}
}
}
@@ -3224,10 +3226,10 @@ function resize()
window.parent.asyProjection=false;
if(W.absolute && !W.embedded) {
- W.canvasWidth=W.canvasWith0*window.devicePixelRatio;
+ W.canvasWidth=W.canvasWidth0*window.devicePixelRatio;
W.canvasHeight=W.canvasHeight0*window.devicePixelRatio;
} else {
- let Aspect=W.canvasWith0/W.canvasHeight0;
+ let Aspect=W.canvasWidth0/W.canvasHeight0;
W.canvasWidth=Math.max(window.innerWidth-windowTrim,windowTrim);
W.canvasHeight=Math.max(window.innerHeight-windowTrim,windowTrim);
@@ -3788,7 +3790,7 @@ function webGLStart()
W.canvas.addEventListener("touchmove",handleTouchMove,false);
document.addEventListener("keydown",handleKey,false);
- W.canvasWith0=W.canvasWidth;
+ W.canvasWidth0=W.canvasWidth;
W.canvasHeight0=W.canvasHeight;
mat4.identity(rotMat);
@@ -3800,6 +3802,8 @@ function webGLStart()
if(W.ibl)
initIBL().then(SetIBL).then(redrawScene);
+
+ home();
}
window.webGLStart=webGLStart;
diff --git a/graphics/asymptote/webgl/license b/graphics/asymptote/webgl/license
index 1dae2c49bd..915200ff7c 100644
--- a/graphics/asymptote/webgl/license
+++ b/graphics/asymptote/webgl/license
@@ -1,6 +1,6 @@
/*@license
AsyGL: Render Bezier patches and triangles via subdivision with WebGL.
- Copyright 2019-2022: John C. Bowman and Supakorn "Jamie" Rassameemasmuang
+ Copyright 2019-2024: John C. Bowman and Supakorn "Jamie" Rassameemasmuang
University of Alberta
This program is free software; you can redistribute it and/or modify
diff --git a/graphics/asymptote/win32helpers.cc b/graphics/asymptote/win32helpers.cc
new file mode 100644
index 0000000000..c8a5cfe65e
--- /dev/null
+++ b/graphics/asymptote/win32helpers.cc
@@ -0,0 +1,240 @@
+/**
+ * @file win32helpers.cc
+ * @brief Windows-specific utility functions
+ * @author Supakorn "Jamie" Rassameemasmuang (jamievlin [at] outlook.com)
+ */
+
+#if defined(_WIN32)
+#include "win32helpers.h"
+#include "errormsg.h"
+#include <shellapi.h>
+
+using camp::reportError;
+
+namespace camp::w32
+{
+
+bool checkShellExecuteResult(INT_PTR const shellExecResult, bool const reportWarning)
+{
+ switch (shellExecResult)
+ {
+ // see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutea
+ // ERROR_FILE_NOT_FOUND and ERROR_PATH_NOT_FOUND shares the same error code as
+ // SE_ERR_FNF and SE_ERR_PNF, respectively
+ case 0:
+ case ERROR_BAD_FORMAT:
+ case SE_ERR_ACCESSDENIED:
+ case SE_ERR_ASSOCINCOMPLETE:
+ case SE_ERR_DDEBUSY:
+ case SE_ERR_DDEFAIL:
+ case SE_ERR_DDETIMEOUT:
+ case SE_ERR_DLLNOTFOUND:
+ case SE_ERR_FNF:
+ case SE_ERR_NOASSOC:
+ case SE_ERR_OOM:
+ case SE_ERR_PNF:
+ case SE_ERR_SHARE:
+ {
+ if (reportWarning)
+ {
+ DWORD const errorCode= GetLastError();
+ ostringstream msg;
+ msg << "Error code: 0x" << std::hex << errorCode << std::dec << "; message: " << getErrorMessage(errorCode);
+ camp::reportWarning(msg.str());
+ }
+ }
+ return false;
+ default:
+ return true;
+ }
+}
+
+void reportAndFailWithLastError(string const& message)
+{
+ DWORD errorCode= GetLastError();
+ ostringstream msg;
+ msg << message << "; error code = 0x" << std::hex << errorCode << std::dec
+ << "; Windows Message: " << getErrorMessage(errorCode);
+ reportError(msg);
+}
+
+void checkResult(BOOL result, string const& message)
+{
+ if (!result)
+ {
+ reportAndFailWithLastError(message);
+ }
+}
+
+void checkLStatus(LSTATUS result, string const& message)
+{
+ checkResult(result == ERROR_SUCCESS, message);
+}
+
+bool isProcessRunning(DWORD const& pid)
+{
+ if (pid == 0)
+ {
+ return true; // system idle is always running
+ }
+
+ HandleRaiiWrapper const processHandle(OpenProcess(PROCESS_QUERY_INFORMATION, false, pid));
+ if (processHandle.getHandle() == nullptr)
+ {
+ // handle not in system, returns false
+ return false;
+ }
+
+ DWORD exitCode=999;
+ if (GetExitCodeProcess(processHandle.getHandle(), &exitCode))
+ {
+ if (exitCode == STILL_ACTIVE)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ return false;
+}
+
+#pragma region RegKeyWrapper
+
+RegKeyWrapper::RegKeyWrapper(HKEY const& regKey)
+ : key(regKey)
+{
+}
+RegKeyWrapper::RegKeyWrapper() : key(nullptr)
+{
+}
+RegKeyWrapper::~RegKeyWrapper()
+{
+ closeExistingKey();
+}
+RegKeyWrapper::RegKeyWrapper(RegKeyWrapper&& other) noexcept
+ : key(std::exchange(other.key, nullptr))
+{
+}
+
+RegKeyWrapper& RegKeyWrapper::operator=(RegKeyWrapper&& other) noexcept
+{
+ if (this != &other)
+ {
+ closeExistingKey();
+ this->key = std::exchange(other.key, nullptr);
+ }
+ return *this;
+}
+
+HKEY RegKeyWrapper::getKey() const
+{
+ return key;
+}
+
+void RegKeyWrapper::closeExistingKey()
+{
+ if (this->key != nullptr)
+ {
+ RegCloseKey(this->key);
+ this->key = nullptr;
+ }
+}
+
+PHKEY RegKeyWrapper::put()
+{
+ closeExistingKey();
+ return &(this->key);
+}
+void RegKeyWrapper::release()
+{
+ this->key = nullptr;
+}
+
+#pragma endregion
+
+#pragma region HandleRaiiWrapper
+
+HandleRaiiWrapper::HandleRaiiWrapper(HANDLE const& handle)
+ : hd(handle)
+{
+}
+
+HandleRaiiWrapper::~HandleRaiiWrapper()
+{
+ if (hd)
+ {
+ if (!CloseHandle(hd))
+ {
+ cerr << "Warning: Cannot close handle" << endl;
+ }
+ }
+}
+
+HandleRaiiWrapper::HandleRaiiWrapper(HandleRaiiWrapper&& other) noexcept
+: hd(std::exchange(other.hd, nullptr))
+{
+}
+
+HANDLE HandleRaiiWrapper::getHandle() const
+{
+ return hd;
+}
+
+LPHANDLE HandleRaiiWrapper::put()
+{
+ if (hd)
+ {
+ w32::checkResult(CloseHandle(hd));
+ hd = nullptr;
+ }
+
+ return &hd;
+}
+
+#pragma endregion
+
+string buildWindowsCmd(const mem::vector<string>& command)
+{
+ ostringstream out;
+ for (auto it= command.begin(); it != command.end(); ++it)
+ {
+ out << '"' << *it << '"';
+ if (std::next(it) != command.end())
+ {
+ out << ' ';
+ }
+ }
+
+ return out.str();
+}
+
+string getErrorMessage(DWORD const& errorCode)
+{
+ LPSTR messageOut= nullptr;
+ auto ret = FormatMessageA(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+ nullptr,
+ errorCode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ reinterpret_cast<LPSTR>(&messageOut),
+ 0,
+ nullptr
+ );
+
+ if (ret == 0)
+ {
+ return "Cannot determine error message";
+ }
+
+ string retString(messageOut);
+ LocalFree(messageOut);
+
+ return retString;
+}
+
+}// namespace camp::w32
+
+#endif
diff --git a/graphics/asymptote/win32helpers.h b/graphics/asymptote/win32helpers.h
new file mode 100644
index 0000000000..266a65f3bd
--- /dev/null
+++ b/graphics/asymptote/win32helpers.h
@@ -0,0 +1,92 @@
+/**
+ * @file win32helpers.h
+ * @brief Windows-specific utility functions header
+ * @author Supakorn "Jamie" Rassameemasmuang (jamievlin [at] outlook.com)
+ */
+
+#pragma once
+
+#if defined(_WIN32)
+
+#include <Windows.h>
+#include "common.h"
+
+namespace camp::w32
+{
+
+/**
+ * Checks if result from ShellExecute/ShellExecuteEx indicates a successful execution or not.
+ * This function does not raise an error in itself, but can generate a warning if specified
+ */
+bool checkShellExecuteResult(INT_PTR shellExecResult, bool reportWarning=false);
+
+void checkResult(BOOL result, string const& message= "");
+void checkLStatus(LSTATUS result, string const& message="");
+
+string buildWindowsCmd(const mem::vector<string>& command);
+
+string getErrorMessage(DWORD const& errorCode);
+
+bool isProcessRunning(DWORD const& pid);
+
+/** Reports error with message from GetLastError and the user specified message */
+void reportAndFailWithLastError(string const& message);
+
+/**
+ * A simple wraper for <tt>HKEY</tt>
+ */
+class RegKeyWrapper
+{
+public:
+ RegKeyWrapper(HKEY const& regKey);
+ RegKeyWrapper();
+
+ ~RegKeyWrapper();
+ RegKeyWrapper(RegKeyWrapper const&) = delete;
+ RegKeyWrapper& operator=(RegKeyWrapper const&) = delete;
+
+ RegKeyWrapper(RegKeyWrapper&& other) noexcept;
+ RegKeyWrapper& operator=(RegKeyWrapper&& other) noexcept;
+
+ /**
+ * @return The registry key held by the wrapper
+ */
+ [[nodiscard]]
+ HKEY getKey() const;
+ PHKEY put();
+
+ void release();
+
+private:
+ void closeExistingKey();
+ HKEY key;
+};
+
+class HandleRaiiWrapper
+{
+public:
+ HandleRaiiWrapper() = default;
+ HandleRaiiWrapper(HANDLE const& handle);
+ ~HandleRaiiWrapper();
+
+ HandleRaiiWrapper(HandleRaiiWrapper const&) = delete;
+ HandleRaiiWrapper& operator=(HandleRaiiWrapper const&) = delete;
+
+ HandleRaiiWrapper(HandleRaiiWrapper&& other) noexcept;
+
+ // already hold a handle, should not consume another one
+ HandleRaiiWrapper& operator=(HandleRaiiWrapper&& other) = delete;
+
+ [[nodiscard]]
+ HANDLE getHandle() const;
+
+ LPHANDLE put();
+
+private:
+ HANDLE hd = nullptr;
+
+};
+
+} // namespace camp::w32
+
+#endif
diff --git a/graphics/asymptote/win32pipestream.cc b/graphics/asymptote/win32pipestream.cc
new file mode 100644
index 0000000000..ab8c0af7e9
--- /dev/null
+++ b/graphics/asymptote/win32pipestream.cc
@@ -0,0 +1,320 @@
+/**
+ * @file win32pipestream.cc
+ * @brief A reimplementation of pipestream for win32
+ * @author Supakorn "Jamie" Rassameemasmuang (jamievlin [at] outlook.com)
+ */
+#if defined(_WIN32)
+#include "win32pipestream.h"
+#include "win32helpers.h"
+#include "util.h"
+#include "errormsg.h"
+
+namespace w32
+{
+
+namespace cw32 = camp::w32;
+
+Win32IoPipeStream::~Win32IoPipeStream()
+{
+ // this is not the best idea, but this is what the
+ // original code looks like (pipestream.h)
+ pipeclose();
+}
+
+void Win32IoPipeStream::open(
+ mem::vector<string> const& command, char const* hint,
+ char const* application, int out_fileno)
+{
+ if (out_fileno != STDOUT_FILENO && out_fileno != STDERR_FILENO)
+ {
+ camp::reportError("out_fileno must be stdout or stdin");
+ }
+
+ // creating pipes
+ SECURITY_ATTRIBUTES pipeSecurityAttr = {};
+ pipeSecurityAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
+ pipeSecurityAttr.bInheritHandle = true;
+ pipeSecurityAttr.lpSecurityDescriptor = nullptr;
+
+ {
+ cw32::HandleRaiiWrapper processStdinRd;
+ cw32::checkResult(CreatePipe(processStdinRd.put(), &processStdinWr, &pipeSecurityAttr, 0));
+
+ cw32::HandleRaiiWrapper processOutWr;
+ cw32::checkResult(CreatePipe(&processOutRd, processOutWr.put(), &pipeSecurityAttr, 0));
+
+ // building command
+ string cmd= camp::w32::buildWindowsCmd(command);
+
+ STARTUPINFOA startInfo= {};
+ startInfo.cb= sizeof(startInfo);
+ startInfo.dwFlags= STARTF_USESTDHANDLES;
+ startInfo.hStdInput= processStdinRd.getHandle();
+ startInfo.hStdOutput= out_fileno == STDOUT_FILENO ? processOutWr.getHandle() : GetStdHandle(STD_OUTPUT_HANDLE);
+ startInfo.hStdError= out_fileno == STDERR_FILENO ? processOutWr.getHandle() : GetStdHandle(STD_ERROR_HANDLE);
+
+ auto const result= CreateProcessA(
+ nullptr,
+ cmd.data(),
+ nullptr, nullptr, true,
+ 0,
+ nullptr, nullptr,
+ &startInfo,
+ &procInfo);
+ if (!result)
+ {
+ execError(command.at(0).c_str(), hint, application);
+ cw32::checkResult(result, "Cannot open application");
+ }
+ }
+
+ ZeroMemory(buffer, BUFFER_LEN);
+ Running=true;
+ pipeopen=true;
+ pipein=true;
+ block(false,true);
+}
+
+void Win32IoPipeStream::block(bool write, bool read)
+{
+ /*
+ * Side note: what the hell, microsoft?
+ *
+ * Why is setting mode for anonymous pipe also called
+ * "SetNamedPipeHandleState", why not "SetPipeHandleState"?
+ *
+ * (see https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-setnamedpipehandlestate?redirectedfrom=MSDN)
+ */
+
+ DWORD blockMode = PIPE_WAIT;
+ DWORD noBlockMode = PIPE_NOWAIT;
+
+ cw32::checkResult(SetNamedPipeHandleState(
+ processStdinWr,
+ write ? &blockMode : &noBlockMode,
+ nullptr, nullptr
+ ));
+
+ cw32::checkResult(SetNamedPipeHandleState(
+ processOutRd,
+ read ? &blockMode : &noBlockMode,
+ nullptr, nullptr
+ ));
+}
+
+void Win32IoPipeStream::eof()
+{
+ if(pipeopen && pipein) {
+ camp::w32::checkResult(CloseHandle(&processStdinWr));
+ pipein=false;
+ }
+}
+
+void Win32IoPipeStream::pipeclose()
+{
+ if(pipeopen) {
+ cw32::checkResult(CloseHandle(processOutRd));
+
+ if (procInfo.hProcess != nullptr)
+ {
+ if (!TerminateProcess(procInfo.hProcess, 0) && GetLastError() != ERROR_ACCESS_DENIED)
+ {
+ camp::reportError("cannot terminate process");
+ }
+ }
+ Running=false;
+ pipeopen=false;
+ wait();
+ }
+}
+
+bool Win32IoPipeStream::isopen() const
+{
+ return pipeopen;
+}
+
+Win32IoPipeStream::Win32IoPipeStream(
+ mem::vector<string> const& command, char const* hint, char const* application, int out_fileno)
+{
+ open(command, hint, application, out_fileno);
+}
+
+int Win32IoPipeStream::wait()
+{
+ DWORD retcode = 0;
+ if (procInfo.hProcess == nullptr)
+ {
+ return static_cast<int>(retcode);
+ }
+
+ switch(WaitForSingleObject(procInfo.hProcess, INFINITE))
+ {
+ case WAIT_OBJECT_0:
+ cw32::checkResult(GetExitCodeProcess(procInfo.hProcess, &retcode));
+ break;
+ default:
+ closeProcessHandles();
+ camp::reportError("Wait for process error");
+ break;
+ }
+
+ closeProcessHandles();
+ return static_cast<int>(retcode);
+}
+
+void Win32IoPipeStream::Write(string const& s)
+{
+ if (!pipeopen)
+ {
+ return;
+ }
+ if(settings::verbose > 2) cerr << s;
+
+ DWORD bytesWritten=0;
+
+ cw32::checkResult(WriteFile(
+ processStdinWr,
+ s.c_str(), s.length(),
+ &bytesWritten, nullptr
+ ));
+
+ if (static_cast<DWORD>(s.length()) != bytesWritten)
+ {
+ camp::reportFatal("write to pipe failed");
+ }
+
+}
+
+void Win32IoPipeStream::wait(char const* prompt)
+{
+ sbuffer.clear();
+ size_t plen=strlen(prompt);
+
+ do {
+ readbuffer();
+ if(*buffer == 0) camp::reportError(sbuffer);
+ sbuffer.append(buffer);
+
+ if(tailequals(sbuffer.c_str(),sbuffer.size(),prompt,plen)) break;
+ } while(true);
+}
+
+ssize_t Win32IoPipeStream::readbuffer()
+{
+ if (!(Running && pipeopen))
+ {
+ return 0;
+ }
+
+ DWORD nc;
+
+ if (!ReadFile(processOutRd, buffer, BUFFER_LEN - 1, &nc, nullptr))
+ {
+ if (GetLastError() != ERROR_BROKEN_PIPE)
+ {
+ // process could have exited
+ camp::reportError("read failed from pipe");
+ }
+ }
+
+ buffer[nc]=0;
+
+ if (nc > 0)
+ {
+ if (settings::verbose > 2)
+ {
+ cerr << buffer;
+ }
+ }
+ else if (procInfo.hProcess != nullptr)
+ {
+ switch (WaitForSingleObject(procInfo.hProcess, 0))
+ {
+ case WAIT_OBJECT_0:
+ {
+ closeProcessHandles();
+ Running=false;
+ break;
+ }
+ case WAIT_TIMEOUT:
+ break;
+ default:
+ camp::reportError("Waiting for process failed");
+ break;
+ }
+ }
+ return nc;
+}
+
+string Win32IoPipeStream::readline()
+{
+ sbuffer.clear();
+ int nc;
+ do {
+ nc=readbuffer();
+ sbuffer.append(buffer);
+ } while(buffer[nc-1] != '\n' && Running);
+ return sbuffer;
+}
+
+bool Win32IoPipeStream::tailequals(char const* buf, size_t len, char const* prompt, size_t plen)
+{
+ const char *a=buf+len;
+ const char *b=prompt+plen;
+ while(b >= prompt) {
+ if(a < buf) return false;
+ if(*a != *b) return false;
+ // Handle MSDOS incompatibility:
+ if(a > buf && *a == '\n' && *(a-1) == '\r') --a;
+ --a; --b;
+ }
+ return true;
+}
+
+#pragma region "private functions"
+void Win32IoPipeStream::closeProcessHandles()
+{
+ if (procInfo.hProcess != nullptr)
+ {
+ cw32::checkResult(CloseHandle(procInfo.hProcess));
+ procInfo.hProcess=nullptr;
+ }
+
+ if (procInfo.hThread != nullptr)
+ {
+ cw32::checkResult(CloseHandle(procInfo.hThread));
+ procInfo.hThread=nullptr;
+ }
+}
+
+Win32IoPipeStream& Win32IoPipeStream::operator<< (imanip func)
+{
+ return (*func)(*this);
+}
+
+Win32IoPipeStream& Win32IoPipeStream::operator>>(string& s)
+{
+ readbuffer();
+ s=buffer;
+ return *this;
+}
+
+Win32IoPipeStream& Win32IoPipeStream::operator<<(const string& s)
+{
+ Write(s);
+ return *this;
+}
+string Win32IoPipeStream::getbuffer()
+{
+ return sbuffer;
+}
+
+bool Win32IoPipeStream::running()
+{
+ return Running;
+}
+
+#pragma endregion
+
+}
+#endif
diff --git a/graphics/asymptote/win32pipestream.h b/graphics/asymptote/win32pipestream.h
new file mode 100644
index 0000000000..79b216ea8b
--- /dev/null
+++ b/graphics/asymptote/win32pipestream.h
@@ -0,0 +1,94 @@
+/**
+ * @file win32pipestream.h
+ * @brief A reimplementation of pipestream for win32
+ * @author Supakorn "Jamie" Rassameemasmuang (jamievlin [at] outlook.com)
+ */
+
+#pragma once
+
+#if defined(_WIN32)
+#include "common.h"
+#include <array>
+#include <iomanip>
+
+#include <Windows.h>
+
+namespace w32
+{
+
+class Win32IoPipeStream
+{
+public:
+ static const size_t BUFFER_LEN = SHRT_MAX;
+
+ void open(
+ const mem::vector<string> &command,
+ const char *hint=NULL,
+ const char *application="",
+ int out_fileno=STDOUT_FILENO);
+
+ virtual ~Win32IoPipeStream();
+
+ [[nodiscard]]
+ bool isopen() const;
+
+ Win32IoPipeStream() = default;
+ Win32IoPipeStream(
+ const mem::vector<string> &command,
+ const char *hint=NULL,
+ const char *application="",
+ int out_fileno=STDOUT_FILENO);
+
+ void eof();
+ virtual void pipeclose();
+ void block(bool write, bool read);
+ int wait();
+
+ void Write(const string &s);
+ void wait(const char *prompt);
+ string readline();
+
+ bool tailequals(
+ const char *buf,
+ size_t len,
+ const char *prompt,
+ size_t plen);
+
+ ssize_t readbuffer();
+
+ Win32IoPipeStream& operator>>(string& s);
+ Win32IoPipeStream& operator<<(const string& s);
+
+ typedef Win32IoPipeStream& (*imanip)(Win32IoPipeStream&);
+ Win32IoPipeStream& operator<< (imanip func);
+
+ string getbuffer();
+ bool running();
+
+ template<class T>
+ Win32IoPipeStream& operator<<(T x) {
+ ostringstream os;
+ os << x;
+ Write(os.str());
+ return *this;
+ }
+
+private:
+ void closeProcessHandles();
+
+protected:
+ PROCESS_INFORMATION procInfo = {};
+ bool pipeopen = false;
+
+ HANDLE processStdinWr;
+ HANDLE processOutRd;
+ bool Running;
+ bool pipein;
+
+ char buffer[BUFFER_LEN];
+ string sbuffer;
+};
+
+}
+
+#endif
diff --git a/graphics/asymptote/win32xdr.cc b/graphics/asymptote/win32xdr.cc
new file mode 100644
index 0000000000..227bc59391
--- /dev/null
+++ b/graphics/asymptote/win32xdr.cc
@@ -0,0 +1,95 @@
+#if defined(_WIN32) && defined(HAVE_LIBTIRPC)
+
+#include "win32xdr.h"
+
+void w32_xdrstdio_create(Win32XDR* xdrs, FILE* file, uint32_t op)
+{
+ xdrs->file = file;
+ xdrs->fileMode = op;
+}
+
+void w32_xdr_destroy(Win32XDR* xdrs)
+{
+}
+
+void w32_xdrmem_create(
+ Win32XDR* xdrs, char* addr, unsigned int size,
+ uint32_t op
+)
+{
+ xdrs->file = nullptr;
+ xdrs->fileMode = op;
+ xdrs->nonFileMem.data = addr;
+ xdrs->nonFileMem.memSize = size;
+ xdrs->nonFileMem.dataCursor = addr;
+ xdrs->fileMode = op;
+}
+
+// treat int/long/ulong/other types as by Microsoft's specs:
+// https://learn.microsoft.com/en-us/cpp/cpp/data-type-ranges?view=msvc-170
+
+bool w32_xdr_u_int(Win32XDR* xdrs, uint32_t* ip)
+{
+ return w32_internal_xdr_u_type<uint32_t>(xdrs, ip);
+}
+
+bool w32_xdr_u_long(Win32XDR* xdrs, unsigned long* ip)
+{
+ static_assert(sizeof(unsigned long) == sizeof(uint32_t));
+ return w32_xdr_u_int(xdrs, reinterpret_cast<uint32_t*>(ip));
+}
+
+bool w32_xdr_long(Win32XDR* xdrs, long* ip)
+{
+ static_assert(sizeof(long) == sizeof(int32_t));
+ return w32_xdr_u_long(xdrs, reinterpret_cast<unsigned long*>(ip));
+}
+
+bool w32_xdr_int(Win32XDR* xdrs, int32_t* ip)
+{
+ return w32_xdr_u_int(xdrs, reinterpret_cast<uint32_t*>(ip));
+}
+
+bool w32_xdr_u_short(Win32XDR* xdrs, uint16_t* ip)
+{
+ return w32_internal_xdr_u_type<uint16_t>(xdrs, ip);
+}
+
+bool w32_xdr_short(Win32XDR* xdrs, int16_t* ip)
+{
+ return w32_xdr_u_short(xdrs, reinterpret_cast<uint16_t*>(ip));
+}
+
+bool w32_xdr_u_longlong_t(Win32XDR* xdrs, uint64_t* ip)
+{
+ return w32_internal_xdr_u_type<uint64_t>(xdrs, ip);
+}
+
+bool w32_xdr_longlong_t(Win32XDR* xdrs, int64_t* ip)
+{
+ return w32_xdr_u_longlong_t(xdrs, reinterpret_cast<uint64_t*>(ip));
+}
+
+bool w32_xdr_float(Win32XDR* xdrs, float* ip)
+{
+ return w32_internal_xdr_u_type<float>(xdrs, ip);
+}
+
+bool w32_xdr_double(Win32XDR* xdrs, double* ip)
+{
+ return w32_internal_xdr_u_type<double>(xdrs, ip);
+}
+
+bool w32_xdr_char(Win32XDR* xdrs, char* ip)
+{
+ static_assert(sizeof(char) == sizeof(int8_t));
+ return w32_xdr_u_char(xdrs, reinterpret_cast<unsigned char*>(ip));
+}
+
+bool w32_xdr_u_char(Win32XDR* xdrs, unsigned char* ip)
+{
+ static_assert(sizeof(unsigned char) == sizeof(uint8_t));
+ return w32_internal_xdr_u_type<uint8_t>(xdrs, ip);
+}
+
+#endif
diff --git a/graphics/asymptote/win32xdr.h b/graphics/asymptote/win32xdr.h
new file mode 100644
index 0000000000..bc57ede14b
--- /dev/null
+++ b/graphics/asymptote/win32xdr.h
@@ -0,0 +1,175 @@
+#pragma once
+
+#if defined(_WIN32)
+
+#if defined(HAVE_CONFIG_H)
+#include "config.h"
+#endif
+
+#if defined(HAVE_LIBTIRPC)
+#include <cstdint>
+#include <cstring>
+#include <cstdio>
+
+#include <Winsock2.h>
+
+uint32_t constexpr W32_XDR_DECODE = 0U;
+uint32_t constexpr W32_XDR_ENCODE = 1U;
+
+struct Win32XDR
+{
+ FILE* file;
+ struct
+ {
+ char* data;
+ char* dataCursor;
+ size_t memSize;
+ } nonFileMem;
+ uint32_t fileMode;
+};
+
+void w32_xdrstdio_create(Win32XDR* xdrs, FILE* file, uint32_t op);
+
+void w32_xdr_destroy(Win32XDR* xdrs);
+
+void w32_xdrmem_create(
+ Win32XDR* xdrs, char* addr, unsigned int size,
+ uint32_t op
+);
+
+template<typename T>
+bool w32_internal_xdr_write_raw_bytes(Win32XDR* xdr, T& data)
+{
+ if (xdr->file != nullptr)
+ {
+ auto written = fwrite(&data, sizeof(T), 1, xdr->file);
+ return written == 1;
+ }
+ else
+ {
+ memcpy(xdr->nonFileMem.dataCursor, reinterpret_cast<char*>(&data), sizeof(T));
+ xdr->nonFileMem.dataCursor += sizeof(T);
+ return true;
+ }
+}
+
+template<typename T>
+bool w32_internal_xdr_read_raw_bytes(Win32XDR* xdr, T& result)
+{
+ if (xdr->file != nullptr)
+ {
+ auto readNum = fread(&result, sizeof(T), 1, xdr->file);
+ return readNum == 1;
+ }
+ else
+ {
+ result = *reinterpret_cast<T*>(xdr->nonFileMem.dataCursor);
+ xdr->nonFileMem.dataCursor += sizeof(T);
+ return true;
+ }
+}
+
+template<typename THostType>
+struct w32_internal_xdr_conv_fn {};
+
+template<>
+struct w32_internal_xdr_conv_fn<uint8_t>
+{
+ typedef uint8_t NetType;
+ static uint8_t identity(uint8_t in)
+ {
+ return in;
+ }
+
+ static auto constexpr host2NetFn = identity;
+ static auto constexpr net2HostFn = identity;
+
+};
+
+template<>
+struct w32_internal_xdr_conv_fn<uint16_t>
+{
+ typedef u_short NetType;
+ static auto constexpr host2NetFn = htons;
+ static auto constexpr net2HostFn = ntohs;
+};
+
+template<>
+struct w32_internal_xdr_conv_fn<uint32_t>
+{
+ typedef u_long NetType;
+ static auto constexpr host2NetFn = htonl;
+ static auto constexpr net2HostFn = ntohl;
+};
+
+template<>
+struct w32_internal_xdr_conv_fn<uint64_t>
+{
+ typedef unsigned __int64 NetType;
+ static auto constexpr host2NetFn = htonll;
+ static auto constexpr net2HostFn = ntohll;
+};
+
+template<>
+struct w32_internal_xdr_conv_fn<double>
+{
+ typedef unsigned __int64 NetType;
+ static auto constexpr host2NetFn = htond;
+ static auto constexpr net2HostFn = ntohd;
+};
+
+template<>
+struct w32_internal_xdr_conv_fn<float>
+{
+ typedef unsigned __int32 NetType;
+ static auto constexpr host2NetFn = htonf;
+ static auto constexpr net2HostFn = ntohf;
+};
+
+
+template<typename THostType>
+bool w32_internal_xdr_u_type(Win32XDR* xdrs, THostType* ip)
+{
+ typedef w32_internal_xdr_conv_fn<THostType>::NetType NetType;
+ static_assert(sizeof(NetType) == sizeof(THostType));
+ if (xdrs->fileMode == W32_XDR_DECODE)
+ {
+ NetType rawValue;
+ auto const result = w32_internal_xdr_read_raw_bytes<NetType>(xdrs, rawValue);
+ if (result)
+ {
+ *ip = w32_internal_xdr_conv_fn<THostType>::net2HostFn(rawValue);
+ }
+ return result;
+ }
+ else
+ {
+ NetType translated = w32_internal_xdr_conv_fn<THostType>::host2NetFn(*ip);
+ return w32_internal_xdr_write_raw_bytes<NetType>(xdrs, translated);
+ }
+}
+
+bool w32_xdr_int(Win32XDR* xdrs, int32_t* ip);
+bool w32_xdr_u_int(Win32XDR* xdrs, uint32_t* ip);
+
+// See https://learn.microsoft.com/en-us/cpp/cpp/data-type-ranges?view=msvc-170
+// long and int are both 4 bits
+
+bool w32_xdr_u_long(Win32XDR* xdrs, unsigned long* ip);
+bool w32_xdr_long(Win32XDR* xdrs, long* ip);
+
+bool w32_xdr_short(Win32XDR* xdrs, int16_t* ip);
+bool w32_xdr_u_short(Win32XDR* xdrs, uint16_t* ip);
+
+bool w32_xdr_char(Win32XDR* xdrs, char* ip);
+bool w32_xdr_u_char(Win32XDR* xdrs, unsigned char* ip);
+
+bool w32_xdr_u_longlong_t(Win32XDR* xdrs, uint64_t* ip);
+bool w32_xdr_longlong_t(Win32XDR* xdrs, int64_t* ip);
+
+bool w32_xdr_float(Win32XDR* xdrs, float* ip);
+bool w32_xdr_double(Win32XDR* xdrs, double* ip);
+
+
+#endif
+#endif \ No newline at end of file
diff --git a/graphics/asymptote/windows/AsymptoteInstallInfo.nsi.in b/graphics/asymptote/windows/AsymptoteInstallInfo.nsi.in
new file mode 100644
index 0000000000..4a89399513
--- /dev/null
+++ b/graphics/asymptote/windows/AsymptoteInstallInfo.nsi.in
@@ -0,0 +1 @@
+!define PRODUCT_VERSION "${ASY_VERSION}"
diff --git a/graphics/asymptote/EnvVarUpdate.nsh b/graphics/asymptote/windows/EnvVarUpdate.nsh
index 839d6a0206..39682000c3 100755..100644
--- a/graphics/asymptote/EnvVarUpdate.nsh
+++ b/graphics/asymptote/windows/EnvVarUpdate.nsh
@@ -1,327 +1,327 @@
-/**
- * EnvVarUpdate.nsh
- * : Environmental Variables: append, prepend, and remove entries
- *
- * WARNING: If you use StrFunc.nsh header then include it before this file
- * with all required definitions. This is to avoid conflicts
- *
- * Usage:
- * ${EnvVarUpdate} "ResultVar" "EnvVarName" "Action" "RegLoc" "PathString"
- *
- * Credits:
- * Version 1.0
- * * Cal Turney (turnec2)
- * * Amir Szekely (KiCHiK) and e-circ for developing the forerunners of this
- * function: AddToPath, un.RemoveFromPath, AddToEnvVar, un.RemoveFromEnvVar,
- * WriteEnvStr, and un.DeleteEnvStr
- * * Diego Pedroso (deguix) for StrTok
- * * Kevin English (kenglish_hi) for StrContains
- * * Hendri Adriaens (Smile2Me), Diego Pedroso (deguix), and Dan Fuhry
- * (dandaman32) for StrReplace
- *
- * Version 1.1 (compatibility with StrFunc.nsh)
- * * techtonik
- *
- * http://nsis.sourceforge.net/Environmental_Variables:_append%2C_prepend%2C_and_remove_entries
- *
- */
-
-
-!ifndef ENVVARUPDATE_FUNCTION
-!define ENVVARUPDATE_FUNCTION
-!verbose push
-!verbose 3
-!include "LogicLib.nsh"
-!include "WinMessages.NSH"
-!include "StrFunc.nsh"
-
-; ---- Fix for conflict if StrFunc.nsh is already includes in main file -----------------------
-!macro _IncludeStrFunction StrFuncName
- !ifndef ${StrFuncName}_INCLUDED
- ${${StrFuncName}}
- !endif
- !ifndef Un${StrFuncName}_INCLUDED
- ${Un${StrFuncName}}
- !endif
- !define un.${StrFuncName} "${Un${StrFuncName}}"
-!macroend
-
-!insertmacro _IncludeStrFunction StrTok
-!insertmacro _IncludeStrFunction StrStr
-!insertmacro _IncludeStrFunction StrRep
-
-; ---------------------------------- Macro Definitions ----------------------------------------
-!macro _EnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString
- Push "${EnvVarName}"
- Push "${Action}"
- Push "${RegLoc}"
- Push "${PathString}"
- Call EnvVarUpdate
- Pop "${ResultVar}"
-!macroend
-!define EnvVarUpdate '!insertmacro "_EnvVarUpdateConstructor"'
-
-!macro _unEnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString
- Push "${EnvVarName}"
- Push "${Action}"
- Push "${RegLoc}"
- Push "${PathString}"
- Call un.EnvVarUpdate
- Pop "${ResultVar}"
-!macroend
-!define un.EnvVarUpdate '!insertmacro "_unEnvVarUpdateConstructor"'
-; ---------------------------------- Macro Definitions end-------------------------------------
-
-;----------------------------------- EnvVarUpdate start----------------------------------------
-!define hklm_all_users 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
-!define hkcu_current_user 'HKCU "Environment"'
-
-!macro EnvVarUpdate UN
-
-Function ${UN}EnvVarUpdate
-
- Push $0
- Exch 4
- Exch $1
- Exch 3
- Exch $2
- Exch 2
- Exch $3
- Exch
- Exch $4
- Push $5
- Push $6
- Push $7
- Push $8
- Push $9
- Push $R0
-
- /* After this point:
- -------------------------
- $0 = ResultVar (returned)
- $1 = EnvVarName (input)
- $2 = Action (input)
- $3 = RegLoc (input)
- $4 = PathString (input)
- $5 = Orig EnvVar (read from registry)
- $6 = Len of $0 (temp)
- $7 = tempstr1 (temp)
- $8 = Entry counter (temp)
- $9 = tempstr2 (temp)
- $R0 = tempChar (temp) */
-
- ; Step 1: Read contents of EnvVarName from RegLoc
- ;
- ; Check for empty EnvVarName
- ${If} $1 == ""
- SetErrors
- DetailPrint "ERROR: EnvVarName is blank"
- Goto EnvVarUpdate_Restore_Vars
- ${EndIf}
-
- ; Check for valid Action
- ${If} $2 != "A"
- ${AndIf} $2 != "P"
- ${AndIf} $2 != "R"
- SetErrors
- DetailPrint "ERROR: Invalid Action - must be A, P, or R"
- Goto EnvVarUpdate_Restore_Vars
- ${EndIf}
-
- ${If} $3 == HKLM
- ReadRegStr $5 ${hklm_all_users} $1 ; Get EnvVarName from all users into $5
- ${ElseIf} $3 == HKCU
- ReadRegStr $5 ${hkcu_current_user} $1 ; Read EnvVarName from current user into $5
- ${Else}
- SetErrors
- DetailPrint 'ERROR: Action is [$3] but must be "HKLM" or HKCU"'
- Goto EnvVarUpdate_Restore_Vars
- ${EndIf}
-
- ; Check for empty PathString
- ${If} $4 == ""
- SetErrors
- DetailPrint "ERROR: PathString is blank"
- Goto EnvVarUpdate_Restore_Vars
- ${EndIf}
-
- ; Make sure we've got some work to do
- ${If} $5 == ""
- ${AndIf} $2 == "R"
- SetErrors
- DetailPrint "$1 is empty - Nothing to remove"
- Goto EnvVarUpdate_Restore_Vars
- ${EndIf}
-
- ; Step 2: Scrub EnvVar
- ;
- StrCpy $0 $5 ; Copy the contents to $0
- ; Remove spaces around semicolons (NOTE: spaces before the 1st entry or
- ; after the last one are not removed here but instead in Step 3)
- ${If} $0 != "" ; If EnvVar is not empty ...
- ${Do}
- ${${UN}StrStr} $7 $0 " ;"
- ${If} $7 == ""
- ${ExitDo}
- ${EndIf}
- ${${UN}StrRep} $0 $0 " ;" ";" ; Remove '<space>;'
- ${Loop}
- ${Do}
- ${${UN}StrStr} $7 $0 "; "
- ${If} $7 == ""
- ${ExitDo}
- ${EndIf}
- ${${UN}StrRep} $0 $0 "; " ";" ; Remove ';<space>'
- ${Loop}
- ${Do}
- ${${UN}StrStr} $7 $0 ";;"
- ${If} $7 == ""
- ${ExitDo}
- ${EndIf}
- ${${UN}StrRep} $0 $0 ";;" ";"
- ${Loop}
-
- ; Remove a leading or trailing semicolon from EnvVar
- StrCpy $7 $0 1 0
- ${If} $7 == ";"
- StrCpy $0 $0 "" 1 ; Change ';<EnvVar>' to '<EnvVar>'
- ${EndIf}
- StrLen $6 $0
- IntOp $6 $6 - 1
- StrCpy $7 $0 1 $6
- ${If} $7 == ";"
- StrCpy $0 $0 $6 ; Change ';<EnvVar>' to '<EnvVar>'
- ${EndIf}
- ; DetailPrint "Scrubbed $1: [$0]" ; Uncomment to debug
- ${EndIf}
-
- /* Step 3. Remove all instances of the target path/string (even if "A" or "P")
- $6 = bool flag (1 = found and removed PathString)
- $7 = a string (e.g. path) delimited by semicolon(s)
- $8 = entry counter starting at 0
- $9 = copy of $0
- $R0 = tempChar */
-
- ${If} $5 != "" ; If EnvVar is not empty ...
- StrCpy $9 $0
- StrCpy $0 ""
- StrCpy $8 0
- StrCpy $6 0
-
- ${Do}
- ${${UN}StrTok} $7 $9 ";" $8 "0" ; $7 = next entry, $8 = entry counter
-
- ${If} $7 == "" ; If we've run out of entries,
- ${ExitDo} ; were done
- ${EndIf} ;
-
- ; Remove leading and trailing spaces from this entry (critical step for Action=Remove)
- ${Do}
- StrCpy $R0 $7 1
- ${If} $R0 != " "
- ${ExitDo}
- ${EndIf}
- StrCpy $7 $7 "" 1 ; Remove leading space
- ${Loop}
- ${Do}
- StrCpy $R0 $7 1 -1
- ${If} $R0 != " "
- ${ExitDo}
- ${EndIf}
- StrCpy $7 $7 -1 ; Remove trailing space
- ${Loop}
- ${If} $7 == $4 ; If string matches, remove it by not appending it
- StrCpy $6 1 ; Set 'found' flag
- ${ElseIf} $7 != $4 ; If string does NOT match
- ${AndIf} $0 == "" ; and the 1st string being added to $0,
- StrCpy $0 $7 ; copy it to $0 without a prepended semicolon
- ${ElseIf} $7 != $4 ; If string does NOT match
- ${AndIf} $0 != "" ; and this is NOT the 1st string to be added to $0,
- StrCpy $0 $0;$7 ; append path to $0 with a prepended semicolon
- ${EndIf} ;
-
- IntOp $8 $8 + 1 ; Bump counter
- ${Loop} ; Check for duplicates until we run out of paths
- ${EndIf}
-
- ; Step 4: Perform the requested Action
- ;
- ${If} $2 != "R" ; If Append or Prepend
- ${If} $6 == 1 ; And if we found the target
- DetailPrint "Target is already present in $1. It will be removed and"
- ${EndIf}
- ${If} $0 == "" ; If EnvVar is (now) empty
- StrCpy $0 $4 ; just copy PathString to EnvVar
- ${If} $6 == 0 ; If found flag is either 0
- ${OrIf} $6 == "" ; or blank (if EnvVarName is empty)
- DetailPrint "$1 was empty and has been updated with the target"
- ${EndIf}
- ${ElseIf} $2 == "A" ; If Append (and EnvVar is not empty),
- StrCpy $0 $0;$4 ; append PathString
- ${If} $6 == 1
- DetailPrint "appended to $1"
- ${Else}
- DetailPrint "Target was appended to $1"
- ${EndIf}
- ${Else} ; If Prepend (and EnvVar is not empty),
- StrCpy $0 $4;$0 ; prepend PathString
- ${If} $6 == 1
- DetailPrint "prepended to $1"
- ${Else}
- DetailPrint "Target was prepended to $1"
- ${EndIf}
- ${EndIf}
- ${Else} ; If Action = Remove
- ${If} $6 == 1 ; and we found the target
- DetailPrint "Target was found and removed from $1"
- ${Else}
- DetailPrint "Target was NOT found in $1 (nothing to remove)"
- ${EndIf}
- ${If} $0 == ""
- DetailPrint "$1 is now empty"
- ${EndIf}
- ${EndIf}
-
- ; Step 5: Update the registry at RegLoc with the updated EnvVar and announce the change
- ;
- ClearErrors
- ${If} $3 == HKLM
- WriteRegExpandStr ${hklm_all_users} $1 $0 ; Write it in all users section
- ${ElseIf} $3 == HKCU
- WriteRegExpandStr ${hkcu_current_user} $1 $0 ; Write it to current user section
- ${EndIf}
-
- IfErrors 0 +4
- MessageBox MB_OK|MB_ICONEXCLAMATION "Could not write updated $1 to $3"
- DetailPrint "Could not write updated $1 to $3"
- Goto EnvVarUpdate_Restore_Vars
-
- ; "Export" our change
- SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
-
- EnvVarUpdate_Restore_Vars:
- ;
- ; Restore the user's variables and return ResultVar
- Pop $R0
- Pop $9
- Pop $8
- Pop $7
- Pop $6
- Pop $5
- Pop $4
- Pop $3
- Pop $2
- Pop $1
- Push $0 ; Push my $0 (ResultVar)
- Exch
- Pop $0 ; Restore his $0
-
-FunctionEnd
-
-!macroend ; EnvVarUpdate UN
-!insertmacro EnvVarUpdate ""
-!insertmacro EnvVarUpdate "un."
-;----------------------------------- EnvVarUpdate end----------------------------------------
-
-!verbose pop
-!endif
+/**
+ * EnvVarUpdate.nsh
+ * : Environmental Variables: append, prepend, and remove entries
+ *
+ * WARNING: If you use StrFunc.nsh header then include it before this file
+ * with all required definitions. This is to avoid conflicts
+ *
+ * Usage:
+ * ${EnvVarUpdate} "ResultVar" "EnvVarName" "Action" "RegLoc" "PathString"
+ *
+ * Credits:
+ * Version 1.0
+ * * Cal Turney (turnec2)
+ * * Amir Szekely (KiCHiK) and e-circ for developing the forerunners of this
+ * function: AddToPath, un.RemoveFromPath, AddToEnvVar, un.RemoveFromEnvVar,
+ * WriteEnvStr, and un.DeleteEnvStr
+ * * Diego Pedroso (deguix) for StrTok
+ * * Kevin English (kenglish_hi) for StrContains
+ * * Hendri Adriaens (Smile2Me), Diego Pedroso (deguix), and Dan Fuhry
+ * (dandaman32) for StrReplace
+ *
+ * Version 1.1 (compatibility with StrFunc.nsh)
+ * * techtonik
+ *
+ * http://nsis.sourceforge.net/Environmental_Variables:_append%2C_prepend%2C_and_remove_entries
+ *
+ */
+
+
+!ifndef ENVVARUPDATE_FUNCTION
+!define ENVVARUPDATE_FUNCTION
+!verbose push
+!verbose 3
+!include "LogicLib.nsh"
+!include "WinMessages.NSH"
+!include "StrFunc.nsh"
+
+; ---- Fix for conflict if StrFunc.nsh is already includes in main file -----------------------
+!macro _IncludeStrFunction StrFuncName
+ !ifndef ${StrFuncName}_INCLUDED
+ ${${StrFuncName}}
+ !endif
+ !ifndef Un${StrFuncName}_INCLUDED
+ ${Un${StrFuncName}}
+ !endif
+ !define un.${StrFuncName} "${Un${StrFuncName}}"
+!macroend
+
+!insertmacro _IncludeStrFunction StrTok
+!insertmacro _IncludeStrFunction StrStr
+!insertmacro _IncludeStrFunction StrRep
+
+; ---------------------------------- Macro Definitions ----------------------------------------
+!macro _EnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString
+ Push "${EnvVarName}"
+ Push "${Action}"
+ Push "${RegLoc}"
+ Push "${PathString}"
+ Call EnvVarUpdate
+ Pop "${ResultVar}"
+!macroend
+!define EnvVarUpdate '!insertmacro "_EnvVarUpdateConstructor"'
+
+!macro _unEnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString
+ Push "${EnvVarName}"
+ Push "${Action}"
+ Push "${RegLoc}"
+ Push "${PathString}"
+ Call un.EnvVarUpdate
+ Pop "${ResultVar}"
+!macroend
+!define un.EnvVarUpdate '!insertmacro "_unEnvVarUpdateConstructor"'
+; ---------------------------------- Macro Definitions end-------------------------------------
+
+;----------------------------------- EnvVarUpdate start----------------------------------------
+!define hklm_all_users 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
+!define hkcu_current_user 'HKCU "Environment"'
+
+!macro EnvVarUpdate UN
+
+Function ${UN}EnvVarUpdate
+
+ Push $0
+ Exch 4
+ Exch $1
+ Exch 3
+ Exch $2
+ Exch 2
+ Exch $3
+ Exch
+ Exch $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R0
+
+ /* After this point:
+ -------------------------
+ $0 = ResultVar (returned)
+ $1 = EnvVarName (input)
+ $2 = Action (input)
+ $3 = RegLoc (input)
+ $4 = PathString (input)
+ $5 = Orig EnvVar (read from registry)
+ $6 = Len of $0 (temp)
+ $7 = tempstr1 (temp)
+ $8 = Entry counter (temp)
+ $9 = tempstr2 (temp)
+ $R0 = tempChar (temp) */
+
+ ; Step 1: Read contents of EnvVarName from RegLoc
+ ;
+ ; Check for empty EnvVarName
+ ${If} $1 == ""
+ SetErrors
+ DetailPrint "ERROR: EnvVarName is blank"
+ Goto EnvVarUpdate_Restore_Vars
+ ${EndIf}
+
+ ; Check for valid Action
+ ${If} $2 != "A"
+ ${AndIf} $2 != "P"
+ ${AndIf} $2 != "R"
+ SetErrors
+ DetailPrint "ERROR: Invalid Action - must be A, P, or R"
+ Goto EnvVarUpdate_Restore_Vars
+ ${EndIf}
+
+ ${If} $3 == HKLM
+ ReadRegStr $5 ${hklm_all_users} $1 ; Get EnvVarName from all users into $5
+ ${ElseIf} $3 == HKCU
+ ReadRegStr $5 ${hkcu_current_user} $1 ; Read EnvVarName from current user into $5
+ ${Else}
+ SetErrors
+ DetailPrint 'ERROR: Action is [$3] but must be "HKLM" or HKCU"'
+ Goto EnvVarUpdate_Restore_Vars
+ ${EndIf}
+
+ ; Check for empty PathString
+ ${If} $4 == ""
+ SetErrors
+ DetailPrint "ERROR: PathString is blank"
+ Goto EnvVarUpdate_Restore_Vars
+ ${EndIf}
+
+ ; Make sure we've got some work to do
+ ${If} $5 == ""
+ ${AndIf} $2 == "R"
+ SetErrors
+ DetailPrint "$1 is empty - Nothing to remove"
+ Goto EnvVarUpdate_Restore_Vars
+ ${EndIf}
+
+ ; Step 2: Scrub EnvVar
+ ;
+ StrCpy $0 $5 ; Copy the contents to $0
+ ; Remove spaces around semicolons (NOTE: spaces before the 1st entry or
+ ; after the last one are not removed here but instead in Step 3)
+ ${If} $0 != "" ; If EnvVar is not empty ...
+ ${Do}
+ ${${UN}StrStr} $7 $0 " ;"
+ ${If} $7 == ""
+ ${ExitDo}
+ ${EndIf}
+ ${${UN}StrRep} $0 $0 " ;" ";" ; Remove '<space>;'
+ ${Loop}
+ ${Do}
+ ${${UN}StrStr} $7 $0 "; "
+ ${If} $7 == ""
+ ${ExitDo}
+ ${EndIf}
+ ${${UN}StrRep} $0 $0 "; " ";" ; Remove ';<space>'
+ ${Loop}
+ ${Do}
+ ${${UN}StrStr} $7 $0 ";;"
+ ${If} $7 == ""
+ ${ExitDo}
+ ${EndIf}
+ ${${UN}StrRep} $0 $0 ";;" ";"
+ ${Loop}
+
+ ; Remove a leading or trailing semicolon from EnvVar
+ StrCpy $7 $0 1 0
+ ${If} $7 == ";"
+ StrCpy $0 $0 "" 1 ; Change ';<EnvVar>' to '<EnvVar>'
+ ${EndIf}
+ StrLen $6 $0
+ IntOp $6 $6 - 1
+ StrCpy $7 $0 1 $6
+ ${If} $7 == ";"
+ StrCpy $0 $0 $6 ; Change ';<EnvVar>' to '<EnvVar>'
+ ${EndIf}
+ ; DetailPrint "Scrubbed $1: [$0]" ; Uncomment to debug
+ ${EndIf}
+
+ /* Step 3. Remove all instances of the target path/string (even if "A" or "P")
+ $6 = bool flag (1 = found and removed PathString)
+ $7 = a string (e.g. path) delimited by semicolon(s)
+ $8 = entry counter starting at 0
+ $9 = copy of $0
+ $R0 = tempChar */
+
+ ${If} $5 != "" ; If EnvVar is not empty ...
+ StrCpy $9 $0
+ StrCpy $0 ""
+ StrCpy $8 0
+ StrCpy $6 0
+
+ ${Do}
+ ${${UN}StrTok} $7 $9 ";" $8 "0" ; $7 = next entry, $8 = entry counter
+
+ ${If} $7 == "" ; If we've run out of entries,
+ ${ExitDo} ; were done
+ ${EndIf} ;
+
+ ; Remove leading and trailing spaces from this entry (critical step for Action=Remove)
+ ${Do}
+ StrCpy $R0 $7 1
+ ${If} $R0 != " "
+ ${ExitDo}
+ ${EndIf}
+ StrCpy $7 $7 "" 1 ; Remove leading space
+ ${Loop}
+ ${Do}
+ StrCpy $R0 $7 1 -1
+ ${If} $R0 != " "
+ ${ExitDo}
+ ${EndIf}
+ StrCpy $7 $7 -1 ; Remove trailing space
+ ${Loop}
+ ${If} $7 == $4 ; If string matches, remove it by not appending it
+ StrCpy $6 1 ; Set 'found' flag
+ ${ElseIf} $7 != $4 ; If string does NOT match
+ ${AndIf} $0 == "" ; and the 1st string being added to $0,
+ StrCpy $0 $7 ; copy it to $0 without a prepended semicolon
+ ${ElseIf} $7 != $4 ; If string does NOT match
+ ${AndIf} $0 != "" ; and this is NOT the 1st string to be added to $0,
+ StrCpy $0 $0;$7 ; append path to $0 with a prepended semicolon
+ ${EndIf} ;
+
+ IntOp $8 $8 + 1 ; Bump counter
+ ${Loop} ; Check for duplicates until we run out of paths
+ ${EndIf}
+
+ ; Step 4: Perform the requested Action
+ ;
+ ${If} $2 != "R" ; If Append or Prepend
+ ${If} $6 == 1 ; And if we found the target
+ DetailPrint "Target is already present in $1. It will be removed and"
+ ${EndIf}
+ ${If} $0 == "" ; If EnvVar is (now) empty
+ StrCpy $0 $4 ; just copy PathString to EnvVar
+ ${If} $6 == 0 ; If found flag is either 0
+ ${OrIf} $6 == "" ; or blank (if EnvVarName is empty)
+ DetailPrint "$1 was empty and has been updated with the target"
+ ${EndIf}
+ ${ElseIf} $2 == "A" ; If Append (and EnvVar is not empty),
+ StrCpy $0 $0;$4 ; append PathString
+ ${If} $6 == 1
+ DetailPrint "appended to $1"
+ ${Else}
+ DetailPrint "Target was appended to $1"
+ ${EndIf}
+ ${Else} ; If Prepend (and EnvVar is not empty),
+ StrCpy $0 $4;$0 ; prepend PathString
+ ${If} $6 == 1
+ DetailPrint "prepended to $1"
+ ${Else}
+ DetailPrint "Target was prepended to $1"
+ ${EndIf}
+ ${EndIf}
+ ${Else} ; If Action = Remove
+ ${If} $6 == 1 ; and we found the target
+ DetailPrint "Target was found and removed from $1"
+ ${Else}
+ DetailPrint "Target was NOT found in $1 (nothing to remove)"
+ ${EndIf}
+ ${If} $0 == ""
+ DetailPrint "$1 is now empty"
+ ${EndIf}
+ ${EndIf}
+
+ ; Step 5: Update the registry at RegLoc with the updated EnvVar and announce the change
+ ;
+ ClearErrors
+ ${If} $3 == HKLM
+ WriteRegExpandStr ${hklm_all_users} $1 $0 ; Write it in all users section
+ ${ElseIf} $3 == HKCU
+ WriteRegExpandStr ${hkcu_current_user} $1 $0 ; Write it to current user section
+ ${EndIf}
+
+ IfErrors 0 +4
+ MessageBox MB_OK|MB_ICONEXCLAMATION "Could not write updated $1 to $3"
+ DetailPrint "Could not write updated $1 to $3"
+ Goto EnvVarUpdate_Restore_Vars
+
+ ; "Export" our change
+ SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+
+ EnvVarUpdate_Restore_Vars:
+ ;
+ ; Restore the user's variables and return ResultVar
+ Pop $R0
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Push $0 ; Push my $0 (ResultVar)
+ Exch
+ Pop $0 ; Restore his $0
+
+FunctionEnd
+
+!macroend ; EnvVarUpdate UN
+!insertmacro EnvVarUpdate ""
+!insertmacro EnvVarUpdate "un."
+;----------------------------------- EnvVarUpdate end----------------------------------------
+
+!verbose pop
+!endif
diff --git a/graphics/asymptote/asy.ico b/graphics/asymptote/windows/asy.ico
index f9c89bc2be..f9c89bc2be 100644
--- a/graphics/asymptote/asy.ico
+++ b/graphics/asymptote/windows/asy.ico
Binary files differ
diff --git a/graphics/asymptote/asy.rc b/graphics/asymptote/windows/asy.rc
index 62b2e91dd3..62b2e91dd3 100644
--- a/graphics/asymptote/asy.rc
+++ b/graphics/asymptote/windows/asy.rc
diff --git a/graphics/asymptote/asymptote.nsi b/graphics/asymptote/windows/asymptote.nsi
index 9c4f16ec74..9c4f16ec74 100644
--- a/graphics/asymptote/asymptote.nsi
+++ b/graphics/asymptote/windows/asymptote.nsi
diff --git a/graphics/asymptote/windows/build-asy-installer.ps1.in b/graphics/asymptote/windows/build-asy-installer.ps1.in
new file mode 100644
index 0000000000..d82d5d9e22
--- /dev/null
+++ b/graphics/asymptote/windows/build-asy-installer.ps1.in
@@ -0,0 +1,11 @@
+#!/usr/bin/env pwsh
+
+param(
+ [Parameter(Mandatory=$true)]
+ [string]$MakeNsisExec
+)
+
+& "${PY3_INTERPRETER}" "${BUILD_ASY_INSTALLER_SCRIPT}" `
+ --cmake-install-root="${CMAKE_INSTALL_PREFIX}" `
+ --asy-install-build-dir="${ASY_INSTALL_DIRECTORY}" `
+ --makensis-exec="$MakeNsisExec"
diff --git a/graphics/asymptote/windows/build-asymptote-installer.py b/graphics/asymptote/windows/build-asymptote-installer.py
new file mode 100644
index 0000000000..ac22cffb0c
--- /dev/null
+++ b/graphics/asymptote/windows/build-asymptote-installer.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python3
+
+import argparse
+import pathlib
+import shutil
+import subprocess
+
+ASYMPTOTE_SOURCE_ROOT = pathlib.Path(__file__).parent.parent
+GUI_DIR = gui_dir = ASYMPTOTE_SOURCE_ROOT / "GUI"
+
+
+def parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--makensis-exec",
+ type=str,
+ required=True,
+ help="Executable file to makensis.exe",
+ )
+ parser.add_argument(
+ "--cmake-install-root",
+ type=str,
+ required=True,
+ help="CMake Pre-NSIS install root",
+ )
+ parser.add_argument(
+ "--asy-install-build-dir",
+ type=str,
+ required=True,
+ help=(
+ "Name of the install directory for asymptote build contained in the "
+ + "cmake-install-root directory"
+ ),
+ )
+ return parser.parse_args()
+
+
+def check_gui_built():
+ dirs_to_check = {"xasyicons", "xasyqtui", "xasyversion"}
+
+ message = (
+ "GUI is not fully built. "
+ + "Please ensure GUI is built before running this build script."
+ )
+ if not all((GUI_DIR / dir_to_check).exists() for dir_to_check in dirs_to_check):
+ raise RuntimeError(message)
+
+
+def copy_gui_files(asy_install_root: pathlib.Path):
+ gui_install_dir = asy_install_root / "GUI"
+ if gui_install_dir.is_file():
+ gui_install_dir.unlink(missing_ok=True)
+ elif gui_install_dir.is_dir():
+ shutil.rmtree(gui_install_dir)
+
+ gui_install_dir.mkdir(exist_ok=True)
+
+ exclude_prefixes = {
+ ".vscode",
+ ".fleet",
+ ".idea",
+ "__pycache__",
+ ".python-version",
+ ".gitignore",
+ "buildtool.py",
+ "requirements.",
+ "setup.py",
+ "xasy-launcher",
+ }
+
+ for file in GUI_DIR.iterdir():
+ if any(
+ file.name.lower().startswith(exclude_prefix.lower())
+ for exclude_prefix in exclude_prefixes
+ ):
+ continue
+ if file.is_dir():
+ shutil.copytree(file, gui_install_dir / file.name)
+ else:
+ shutil.copy2(file, gui_install_dir / file.name)
+
+
+def main():
+ # check GUI built
+ args = parse_args()
+ check_gui_built()
+
+ makensis_exec = pathlib.Path(args.makensis_exec)
+ if not makensis_exec.is_file():
+ raise RuntimeError("makensis executable cannot be found")
+
+ # copy GUI to
+ cmake_install_root = pathlib.Path(args.cmake_install_root)
+ asy_install_root = cmake_install_root / args.asy_install_build_dir
+ copy_gui_files(asy_install_root)
+
+ # generate uninstall file
+ with open(
+ cmake_install_root / "AsymptoteUninstallList.nsi", "w", encoding="utf-8"
+ ) as f:
+ for file in asy_install_root.iterdir():
+ if file.is_dir():
+ f.write("RMDir /r $INSTDIR\\" + file.name)
+ else:
+ f.write("Delete $INSTDIR\\" + file.name)
+ f.write("\n")
+
+ # call nsis builder
+ subprocess.run(
+ [args.makensis_exec, str(cmake_install_root / "asymptote.nsi")], check=True
+ )
+ print("Build succeeded")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/graphics/asymptote/lnkX64IconFix.nsh b/graphics/asymptote/windows/lnkX64IconFix.nsh
index d1a4c9f311..ded187c8f1 100644
--- a/graphics/asymptote/lnkX64IconFix.nsh
+++ b/graphics/asymptote/windows/lnkX64IconFix.nsh
@@ -1,74 +1,74 @@
-/******************************************************************************
- WORKAROUND - lnkX64IconFix
- This snippet was developed to address an issue with Windows
- x64 incorrectly redirecting the shortcuts icon from $PROGRAMFILES32
- to $PROGRAMFILES64.
-
- See Forum post: http://forums.winamp.com/newreply.php?do=postreply&t=327806
-
- Example:
- CreateShortcut "$SMPROGRAMS\My App\My App.lnk" "$INSTDIR\My App.exe" "" "$INSTDIR\My App.exe"
- ${lnkX64IconFix} "$SMPROGRAMS\My App\My App.lnk"
-
- Original Code by Anders [http://forums.winamp.com/member.php?u=70852]
- ******************************************************************************/
-!ifndef ___lnkX64IconFix___
- !verbose push
- !verbose 0
-
- !include "LogicLib.nsh"
- !include "x64.nsh"
-
- !define ___lnkX64IconFix___
- !define lnkX64IconFix `!insertmacro _lnkX64IconFix`
- !macro _lnkX64IconFix _lnkPath
- !verbose push
- !verbose 0
- ${If} ${RunningX64}
- DetailPrint "WORKAROUND: 64bit OS Detected, Attempting to apply lnkX64IconFix"
- Push "${_lnkPath}"
- Call lnkX64IconFix
- ${EndIf}
- !verbose pop
- !macroend
-
- Function lnkX64IconFix ; _lnkPath
- Exch $5
- Push $0
- Push $1
- Push $2
- Push $3
- Push $4
- System::Call 'OLE32::CoCreateInstance(g "{00021401-0000-0000-c000-000000000046}",i 0,i 1,g "{000214ee-0000-0000-c000-000000000046}",*i.r1)i'
- ${If} $1 <> 0
- System::Call '$1->0(g "{0000010b-0000-0000-C000-000000000046}",*i.r2)'
- ${If} $2 <> 0
- System::Call '$2->5(w r5,i 2)i.r0'
- ${If} $0 = 0
- System::Call '$1->0(g "{45e2b4ae-b1c3-11d0-b92f-00a0c90312e1}",*i.r3)i.r0'
- ${If} $3 <> 0
- System::Call '$3->5(i 0xA0000007)i.r0'
- System::Call '$3->6(*i.r4)i.r0'
- ${If} $0 = 0
- IntOp $4 $4 & 0xffffBFFF
- System::Call '$3->7(ir4)i.r0'
- ${If} $0 = 0
- System::Call '$2->6(i0,i0)'
- DetailPrint "WORKAROUND: lnkX64IconFix Applied successfully"
- ${EndIf}
- ${EndIf}
- System::Call $3->2()
- ${EndIf}
- ${EndIf}
- System::Call $2->2()
- ${EndIf}
- System::Call $1->2()
- ${EndIf}
- Pop $4
- Pop $3
- Pop $2
- Pop $1
- Pop $0
- FunctionEnd
- !verbose pop
-!endif
+/******************************************************************************
+ WORKAROUND - lnkX64IconFix
+ This snippet was developed to address an issue with Windows
+ x64 incorrectly redirecting the shortcuts icon from $PROGRAMFILES32
+ to $PROGRAMFILES64.
+
+ See Forum post: http://forums.winamp.com/newreply.php?do=postreply&t=327806
+
+ Example:
+ CreateShortcut "$SMPROGRAMS\My App\My App.lnk" "$INSTDIR\My App.exe" "" "$INSTDIR\My App.exe"
+ ${lnkX64IconFix} "$SMPROGRAMS\My App\My App.lnk"
+
+ Original Code by Anders [http://forums.winamp.com/member.php?u=70852]
+ ******************************************************************************/
+!ifndef ___lnkX64IconFix___
+ !verbose push
+ !verbose 0
+
+ !include "LogicLib.nsh"
+ !include "x64.nsh"
+
+ !define ___lnkX64IconFix___
+ !define lnkX64IconFix `!insertmacro _lnkX64IconFix`
+ !macro _lnkX64IconFix _lnkPath
+ !verbose push
+ !verbose 0
+ ${If} ${RunningX64}
+ DetailPrint "WORKAROUND: 64bit OS Detected, Attempting to apply lnkX64IconFix"
+ Push "${_lnkPath}"
+ Call lnkX64IconFix
+ ${EndIf}
+ !verbose pop
+ !macroend
+
+ Function lnkX64IconFix ; _lnkPath
+ Exch $5
+ Push $0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ System::Call 'OLE32::CoCreateInstance(g "{00021401-0000-0000-c000-000000000046}",i 0,i 1,g "{000214ee-0000-0000-c000-000000000046}",*i.r1)i'
+ ${If} $1 <> 0
+ System::Call '$1->0(g "{0000010b-0000-0000-C000-000000000046}",*i.r2)'
+ ${If} $2 <> 0
+ System::Call '$2->5(w r5,i 2)i.r0'
+ ${If} $0 = 0
+ System::Call '$1->0(g "{45e2b4ae-b1c3-11d0-b92f-00a0c90312e1}",*i.r3)i.r0'
+ ${If} $3 <> 0
+ System::Call '$3->5(i 0xA0000007)i.r0'
+ System::Call '$3->6(*i.r4)i.r0'
+ ${If} $0 = 0
+ IntOp $4 $4 & 0xffffBFFF
+ System::Call '$3->7(ir4)i.r0'
+ ${If} $0 = 0
+ System::Call '$2->6(i0,i0)'
+ DetailPrint "WORKAROUND: lnkX64IconFix Applied successfully"
+ ${EndIf}
+ ${EndIf}
+ System::Call $3->2()
+ ${EndIf}
+ ${EndIf}
+ System::Call $2->2()
+ ${EndIf}
+ System::Call $1->2()
+ ${EndIf}
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ FunctionEnd
+ !verbose pop
+!endif
diff --git a/graphics/asymptote/windows/texindex-wsl.cmd b/graphics/asymptote/windows/texindex-wsl.cmd
new file mode 100644
index 0000000000..76d314b9f1
--- /dev/null
+++ b/graphics/asymptote/windows/texindex-wsl.cmd
@@ -0,0 +1,2 @@
+@echo off
+wsl texindex %*
diff --git a/graphics/asymptote/xdrcommon.h b/graphics/asymptote/xdrcommon.h
new file mode 100644
index 0000000000..f62d2dcb5f
--- /dev/null
+++ b/graphics/asymptote/xdrcommon.h
@@ -0,0 +1,82 @@
+#pragma once
+
+#if defined(HAVE_LIBTIRPC)
+#if defined(_WIN32)
+#include "win32xdr.h"
+typedef Win32XDR XDR;
+#define xdrstdio_create w32_xdrstdio_create
+#define xdr_destroy w32_xdr_destroy
+#define xdrmem_create w32_xdrmem_create
+
+#define xdr_u_int w32_xdr_u_int
+#define xdr_int w32_xdr_int
+#define xdr_float w32_xdr_float
+#define xdr_double w32_xdr_double
+#define xdr_long w32_xdr_long
+#define xdr_u_long w32_xdr_u_long
+
+#define xdr_longlong_t w32_xdr_longlong_t
+#define xdr_u_longlong_t w32_xdr_u_longlong_t
+
+#define xdr_short w32_xdr_short
+#define xdr_u_short w32_xdr_u_short
+
+#define xdr_char w32_xdr_char
+#define xdr_u_char w32_xdr_u_char
+
+#define XDR_DECODE W32_XDR_DECODE
+#define XDR_ENCODE W32_XDR_ENCODE
+
+#else
+#ifndef _ALL_SOURCE
+#define _ALL_SOURCE 1
+#endif
+
+#include <cstdio>
+#include <vector>
+#include <algorithm>
+
+#include <sys/types.h>
+#include <rpc/types.h>
+
+#define quad_t long long
+#define u_quad_t unsigned long long
+
+#if defined(__CYGWIN__) || defined(__FreeBSD__)
+#include <sys/select.h>
+#define u_char unsigned char
+#define u_int unsigned int
+#define u_short unsigned short
+#define u_long unsigned long
+extern "C" int fseeko(FILE*, off_t, int);
+extern "C" off_t ftello(FILE*);
+extern "C" FILE * open_memstream(char**, size_t*);
+#endif
+
+#ifdef __APPLE__
+#include <rpc/xdr.h>
+
+inline bool_t xdr_long(XDR* __xdrs, long* __lp) {
+ return xdr_longlong_t(__xdrs, (long long*)__lp);
+}
+
+inline bool_t xdr_u_long(XDR* __xdrs, unsigned long* __lp) {
+ return xdr_u_longlong_t(__xdrs, (unsigned long long*) __lp);
+}
+
+#endif
+
+#ifdef __OpenBSD__
+#define xdr_longlong_t xdr_int64_t
+#define xdr_u_longlong_t xdr_u_int64_t
+#endif
+
+#ifdef _POSIX_SOURCE
+#undef _POSIX_SOURCE
+#include <rpc/rpc.h>
+#define _POSIX_SOURCE
+#else
+#include <rpc/rpc.h>
+#endif
+#endif
+#endif
diff --git a/graphics/asymptote/xstream.cc b/graphics/asymptote/xstream.cc
new file mode 100644
index 0000000000..9656e37b19
--- /dev/null
+++ b/graphics/asymptote/xstream.cc
@@ -0,0 +1,372 @@
+#if defined(HAVE_CONFIG_H)
+#include "config.h"
+#endif
+
+#if defined(HAVE_LIBTIRPC)
+#include "xstream.h"
+
+namespace xdr
+{
+
+// xbyte
+xbyte::xbyte() {}
+xbyte::xbyte(unsigned char c0): c(c0) {}
+xbyte::xbyte(int c0): c((unsigned char) c0) {}
+xbyte::xbyte(unsigned c0): c((unsigned char) c0) {}
+
+int xbyte::byte() const
+{
+ return c;
+}
+
+xbyte::operator unsigned char() const
+{
+ return c;
+}
+
+// xios
+int xios::good() const { return _state == 0; }
+int xios::eof() const { return _state & eofbit; }
+int xios::fail() const { return !good();}
+int xios::bad() const { return _state & badbit; }
+void xios::clear(int state) {_state=state;}
+void xios::set(int flag) {_state |= flag;}
+xios::operator void*() const { return fail() ? (void*)0 : (void*)(-1); }
+int xios::operator!() const { return fail(); }
+
+// xstream
+xstream::~xstream() {}
+xstream::xstream(): xios(), buf(nullptr) {}
+void xstream::precision(int) {}
+xstream& xstream::seek(OffsetType pos, seekdir dir) {
+ if(buf) {
+ clear();
+ if(fseeko(buf,pos,dir) != 0) set(failbit);
+ }
+ return *this;
+}
+OffsetType xstream::tell() {
+ return ftello(buf);
+}
+
+// ixstream
+
+ixstream::ixstream(bool singleprecision)
+ : singleprecision(singleprecision)
+{
+
+}
+
+void ixstream::open(const char* filename, open_mode)
+{
+ clear();
+ buf=fopen(filename,"r");
+ if(buf) xdrstdio_create(&xdri,buf,XDR_DECODE);
+ else set(badbit);
+}
+
+void ixstream::close()
+{
+ closeFile();
+}
+
+void ixstream::closeFile()
+{
+ if(buf) {
+#ifndef _CRAY
+ xdr_destroy(&xdri);
+#endif
+ fclose(buf);
+ buf=nullptr;
+ }
+}
+
+ixstream::ixstream(const char* filename, bool singleprecision)
+ : singleprecision(singleprecision)
+{
+ ixstream::open(filename);
+}
+
+ixstream::ixstream(const char* filename, open_mode mode, bool singleprecision)
+ : singleprecision(singleprecision)
+{
+ ixstream::open(filename,mode);
+}
+
+ixstream::~ixstream()
+{
+ ixstream::close();
+}
+
+ixstream& ixstream::operator>>(imanip func)
+{
+ return (*func)(*this);
+}
+
+ixstream& ixstream::operator>>(double& x)
+{
+ if(singleprecision)
+ {
+ float f;
+ *this >> f;
+ x=(double) f;
+ } else
+ if(!xdr_double(&xdri, &x)) set(eofbit);
+ return *this;
+}
+ixstream& ixstream::operator>>(xbyte& x)
+{
+ int c=fgetc(buf);
+ if(c != EOF) x=c;
+ else set(eofbit);
+ return *this;
+}
+
+// oxstream
+oxstream::oxstream(bool singleprecision): singleprecision(singleprecision)
+{
+
+}
+void oxstream::open(const char* filename, open_mode mode)
+{
+ clear();
+ buf=fopen(filename,(mode & app) ? "a" : "w");
+ if(buf) xdrstdio_create(&xdro,buf,XDR_ENCODE);
+ else set(badbit);
+}
+void oxstream::close()
+{
+ closefile();
+}
+void oxstream::closefile()
+{
+ if(buf) {
+#ifndef _CRAY
+ xdr_destroy(&xdro);
+#endif
+ fclose(buf);
+ buf=NULL;
+ }
+}
+oxstream::oxstream(const char* filename, bool singleprecision)
+ : singleprecision(singleprecision)
+{
+ oxstream::open(filename);
+}
+
+oxstream::oxstream(const char* filename, open_mode mode, bool singleprecision)
+ : singleprecision(singleprecision)
+{
+ oxstream::open(filename,mode);
+}
+
+oxstream::~oxstream()
+{
+ closefile();
+}
+
+oxstream& oxstream::flush() {if(buf) fflush(buf); return *this;}
+oxstream& oxstream::operator<<(omanip func) { return (*func)(*this); }
+oxstream& oxstream::operator<<(double x)
+{
+ if(singleprecision)
+ *this << (float) x;
+ else
+ if(!xdr_double(&xdro, &x)) set(badbit);
+ return *this;
+}
+oxstream& oxstream::operator<<(xbyte x) {
+ if(fputc(x.byte(),buf) == EOF) set(badbit);
+ return *this;
+}
+
+memoxstream::memoxstream(bool singleprecision)
+ : oxstream(singleprecision)
+#if defined(_WIN32)
+ ,fmInstance()
+#endif
+{
+ clear();
+#if defined(_WIN32)
+ fmem_init(&fmInstance);
+ buf=fmem_open(&fmInstance, "w+");
+#else
+ buf=open_memstream(&buffer,&size);
+#endif
+ if(buf)
+ xdrstdio_create(&xdro,buf,XDR_ENCODE);
+ else
+ set(badbit);
+}
+
+memoxstream::~memoxstream()
+{
+ closefile();
+#if defined(_WIN32)
+ fmem_term(&fmInstance);
+#else
+ free(buffer);
+#endif
+}
+std::vector<uint8_t> memoxstream::createCopyOfCurrentData() {
+ auto flushResult = fflush(buf);
+ if (flushResult != 0)
+ {
+ std::cerr << "cannot flush memory xstream";
+ exit(EXIT_FAILURE);
+ }
+#if defined(_WIN32)
+ size_t retSize=0;
+ void* streamPtr=nullptr;
+
+ // DANGER: There's a /severe/ issue with certain systems (though such cases should be rare)
+ // about a potential memory leak.
+
+ // See https://github.com/Kreijstal/fmem/issues/6
+
+ // Right now, we have no reasonable way to determine if tmpfile implementation is being used
+ // or not, so we cannot have a way to conditionally free the memory.
+
+ // In most systems, we have open_memstream and Windows tmpfile API
+ // which the allocation/mapping is handled by the system and hence
+ // no need to free the pointer ourselves, but tmpfile implementation uses malloc that doesn't
+ // get freed, so it is our job to manually free it.
+ fmem_mem(&fmInstance, &streamPtr, &retSize);
+
+ if (streamPtr == nullptr)
+ {
+ return {};
+ }
+
+ auto* bytePtr = static_cast<uint8_t*>(streamPtr);
+ std::vector ret(bytePtr, bytePtr + retSize);
+ return ret;
+#else
+ // for sanity check, always want to make sure we have a vector of bytes
+ static_assert(sizeof(char) == sizeof(uint8_t));
+
+ if (buffer == nullptr)
+ {
+ return {};
+ }
+
+ auto* retPtr = reinterpret_cast<uint8_t*>(buffer);
+ return {retPtr, retPtr + size};
+#endif
+}
+
+// memixstream
+memixstream::memixstream(char* data, size_t length, bool singleprecision)
+ : ixstream(singleprecision)
+{
+ xdrmem_create(&xdri,data,length,XDR_DECODE);
+}
+memixstream::memixstream(std::vector<char>& data, bool singleprecision)
+ : memixstream(data.data(), data.size(), singleprecision)
+{
+}
+
+memixstream::~memixstream()
+{
+ xdr_destroy(&xdri);
+}
+void memixstream::close()
+{
+ xdr_destroy(&xdri);
+}
+
+void memixstream::open(const char* filename, open_mode openMode)
+{
+}
+
+// ioxstream
+
+void ioxstream::open(const char* filename, open_mode mode)
+{
+ clear();
+ if(mode & app)
+ buf=fopen(filename,"a+");
+ else if(mode & trunc)
+ buf=fopen(filename,"w+");
+ else if(mode & out) {
+ buf=fopen(filename,"r+");
+ if(!buf)
+ buf=fopen(filename,"w+");
+ } else
+ buf=fopen(filename,"r");
+ if(buf) {
+ xdrstdio_create(&xdri,buf,XDR_DECODE);
+ xdrstdio_create(&xdro,buf,XDR_ENCODE);
+ } else set(badbit);
+}
+void ioxstream::close() {
+ if(buf) {
+#ifndef _CRAY
+ xdr_destroy(&xdri);
+ xdr_destroy(&xdro);
+#endif
+ fclose(buf);
+ buf=NULL;
+ }
+}
+ioxstream::ioxstream()
+{
+
+}
+ioxstream::ioxstream(const char* filename)
+{
+ ioxstream::open(filename);
+}
+ioxstream::ioxstream(const char* filename, open_mode mode)
+{
+ ioxstream::open(filename,mode);
+}
+ioxstream::~ioxstream()
+{
+ ioxstream::close();
+}
+
+
+// ixstream + oxstream operator implementation
+
+#define IXSTREAM_CC_DECL(T) ixstream& ixstream::operator >> (T& x)
+#define IXSTREAM_IMPL(T,N) IXSTREAM_CC_DECL(T) {if(!xdr_##N(&xdri, &x)) set(eofbit); return *this;}
+
+IXSTREAM_IMPL(int, int);
+IXSTREAM_IMPL(unsigned int, u_int);
+IXSTREAM_IMPL(long, long);
+IXSTREAM_IMPL(unsigned long, u_long);
+IXSTREAM_IMPL(long long, longlong_t);
+IXSTREAM_IMPL(unsigned long long, u_longlong_t);
+IXSTREAM_IMPL(short, short);
+IXSTREAM_IMPL(unsigned short, u_short);
+IXSTREAM_IMPL(char, char);
+#ifndef _CRAY
+IXSTREAM_IMPL(unsigned char, u_char);
+#endif
+IXSTREAM_IMPL(float, float);
+
+#define OXSTREAM_CC_DECL(T) oxstream& oxstream::operator << (T x)
+#define OXSTREAM_IMPL(T,N) OXSTREAM_CC_DECL(T) {if(!xdr_##N(&xdro, &x)) set(badbit); return *this;}
+
+OXSTREAM_IMPL(int, int);
+OXSTREAM_IMPL(unsigned int, u_int);
+OXSTREAM_IMPL(long, long);
+OXSTREAM_IMPL(unsigned long, u_long);
+OXSTREAM_IMPL(long long, longlong_t);
+OXSTREAM_IMPL(unsigned long long, u_longlong_t);
+OXSTREAM_IMPL(short, short);
+OXSTREAM_IMPL(unsigned short, u_short);
+OXSTREAM_IMPL(char, char);
+
+#ifndef _CRAY
+OXSTREAM_IMPL(unsigned char, u_char);
+#endif
+OXSTREAM_IMPL(float, float);
+
+oxstream& endl(oxstream& s) { s.flush(); return s; }
+oxstream& flush(oxstream& s) {s.flush(); return s;}
+
+
+}
+#endif
diff --git a/graphics/asymptote/xstream.h b/graphics/asymptote/xstream.h
index c2c2f4cdeb..b87f917904 100644
--- a/graphics/asymptote/xstream.h
+++ b/graphics/asymptote/xstream.h
@@ -19,55 +19,24 @@
#ifndef __xstream_h__
#define __xstream_h__ 1
-#ifndef _ALL_SOURCE
-#define _ALL_SOURCE 1
-#endif
+#if defined(HAVE_LIBTIRPC)
#include <cstdio>
+#include <iostream>
#include <vector>
-#include <algorithm>
-
-#include <sys/types.h>
-#include <rpc/types.h>
-
-#define quad_t long long
-#define u_quad_t unsigned long long
-
-#if defined(__CYGWIN__) || defined(__FreeBSD__)
-#include <sys/select.h>
-#define u_char unsigned char
-#define u_int unsigned int
-#define u_short unsigned short
-#define u_long unsigned long
-extern "C" int fseeko(FILE *, off_t, int);
-extern "C" off_t ftello(FILE *);
-extern "C" FILE *open_memstream(char **, size_t *);
-#endif
-
-#ifdef __APPLE__
-#include <rpc/xdr.h>
-
-inline bool_t xdr_long(XDR *__xdrs, long *__lp) {
- return xdr_longlong_t(__xdrs,(long long *) __lp);
-}
-
-inline bool_t xdr_u_long(XDR *__xdrs, unsigned long *__lp) {
- return xdr_u_longlong_t(__xdrs,(unsigned long long *) __lp);
-}
-
+#include <cstdlib>
+#if defined(_WIN32)
+#include <fmem.h>
#endif
-#ifdef __OpenBSD__
-#define xdr_longlong_t xdr_int64_t
-#define xdr_u_longlong_t xdr_u_int64_t
-#endif
+#include "xdrcommon.h"
-#ifdef _POSIX_SOURCE
-#undef _POSIX_SOURCE
-#include <rpc/rpc.h>
-#define _POSIX_SOURCE
+#if defined(_WIN32)
+typedef __int64 OffsetType;
+#define fseeko _fseeki64
+#define ftello _ftelli64
#else
-#include <rpc/rpc.h>
+#define OffsetType off_t
#endif
namespace xdr {
@@ -75,12 +44,12 @@ namespace xdr {
class xbyte {
unsigned char c;
public:
- xbyte() {}
- xbyte(unsigned char c0) : c(c0) {}
- xbyte(int c0) : c((unsigned char) c0) {}
- xbyte(unsigned int c0) : c((unsigned char) c0) {}
- int byte() const {return c;}
- operator unsigned char () const {return c;}
+ xbyte();
+ xbyte(unsigned char c0);
+ xbyte(int c0);
+ xbyte(unsigned int c0);
+ int byte() const;
+ operator unsigned char () const;
};
class xios {
@@ -91,42 +60,32 @@ public:
private:
int _state;
public:
- int good() const { return _state == 0; }
- int eof() const { return _state & eofbit; }
- int fail() const { return !good();}
- int bad() const { return _state & badbit; }
- void clear(int state = 0) {_state=state;}
- void set(int flag) {_state |= flag;}
- operator void*() const { return fail() ? (void*)0 : (void*)(-1); }
- int operator!() const { return fail(); }
+ int good() const;
+ int eof() const;
+ int fail() const;
+ int bad() const;
+ void clear(int state = 0);
+ void set(int flag);
+ operator void*() const;
+ int operator!() const;
};
class xstream : public xios {
protected:
FILE *buf;
public:
- virtual ~xstream() {}
- xstream() : xios(), buf(nullptr) {}
-
- void precision(int) {}
-
- xstream& seek(off_t pos, seekdir dir=beg) {
- if(buf) {
- clear();
- if(fseeko(buf,pos,dir) != 0) set(failbit);
- }
- return *this;
- }
- off_t tell() {
- return ftello(buf);
- }
-};
+ virtual ~xstream();
+ xstream();
-#define IXSTREAM(T,N) ixstream& operator >> (T& x) \
- {if(!xdr_##N(&xdri, &x)) set(eofbit); return *this;}
+ void precision(int);
-#define OXSTREAM(T,N) oxstream& operator << (T x) \
- {if(!xdr_##N(&xdro, &x)) set(badbit); return *this;}
+ xstream& seek(OffsetType pos, seekdir dir=beg);
+
+ OffsetType tell();
+};
+
+#define IXSTREAM_DECL(T) ixstream& operator >> (T& x)
+#define OXSTREAM_DECL(T) oxstream& operator << (T x)
class ixstream : virtual public xstream {
private:
@@ -134,68 +93,35 @@ private:
protected:
XDR xdri;
public:
- ixstream(bool singleprecision=false) : singleprecision(singleprecision) {}
+ ixstream(bool singleprecision=false);
- virtual void open(const char *filename, open_mode=in) {
- clear();
- buf=fopen(filename,"r");
- if(buf) xdrstdio_create(&xdri,buf,XDR_DECODE);
- else set(badbit);
- }
+ virtual void open(const char *filename, open_mode=in);
+ virtual void close();
+ void closeFile();
- virtual void close() {
- closeFile();
- }
-
- void closeFile() {
- if(buf) {
-#ifndef _CRAY
- xdr_destroy(&xdri);
-#endif
- fclose(buf);
- buf=nullptr;
- }
- }
- ixstream(const char *filename, bool singleprecision=false) :
- singleprecision(singleprecision) {open(filename);}
- ixstream(const char *filename, open_mode mode, bool singleprecision=false) :
- singleprecision(singleprecision) {open(filename,mode);}
- virtual ~ixstream() {close();}
+ ixstream(const char *filename, bool singleprecision=false);
+ ixstream(const char *filename, open_mode mode, bool singleprecision=false);
+ virtual ~ixstream();
typedef ixstream& (*imanip)(ixstream&);
- ixstream& operator >> (imanip func) { return (*func)(*this); }
-
- IXSTREAM(int,int);
- IXSTREAM(unsigned int,u_int);
- IXSTREAM(long,long);
- IXSTREAM(unsigned long,u_long);
- IXSTREAM(long long,longlong_t);
- IXSTREAM(unsigned long long,u_longlong_t);
- IXSTREAM(short,short);
- IXSTREAM(unsigned short,u_short);
- IXSTREAM(char,char);
+ ixstream& operator >> (imanip func);
+
+ IXSTREAM_DECL(int);
+ IXSTREAM_DECL(unsigned int);
+ IXSTREAM_DECL(long);
+ IXSTREAM_DECL(unsigned long);
+ IXSTREAM_DECL(long long);
+ IXSTREAM_DECL(unsigned long long);
+ IXSTREAM_DECL(short);
+ IXSTREAM_DECL(unsigned short);
+ IXSTREAM_DECL(char);
#ifndef _CRAY
- IXSTREAM(unsigned char,u_char);
+ IXSTREAM_DECL(unsigned char);
#endif
- IXSTREAM(float,float);
-
- ixstream& operator >> (double& x)
- {
- if(singleprecision) {
- float f;
- *this >> f;
- x=(double) f;
- } else
- if(!xdr_double(&xdri, &x)) set(eofbit);
- return *this;
- }
-
- ixstream& operator >> (xbyte& x) {
- int c=fgetc(buf);
- if(c != EOF) x=c;
- else set(eofbit);
- return *this;
- }
+ IXSTREAM_DECL(float);
+
+ ixstream& operator >> (double& x);
+ ixstream& operator >> (xbyte& x);
};
class oxstream : virtual public xstream {
@@ -204,181 +130,95 @@ private:
protected:
XDR xdro;
public:
- oxstream(bool singleprecision=false) : singleprecision(singleprecision) {}
-
- virtual void open(const char *filename, open_mode mode=trunc) {
- clear();
- buf=fopen(filename,(mode & app) ? "a" : "w");
- if(buf) xdrstdio_create(&xdro,buf,XDR_ENCODE);
- else set(badbit);
- }
-
- virtual void close()
- {
- closefile();
- }
-
- void closefile() {
- if(buf) {
-#ifndef _CRAY
- xdr_destroy(&xdro);
-#endif
- fclose(buf);
- buf=NULL;
- }
- }
+ oxstream(bool singleprecision=false);
- oxstream(const char *filename, bool singleprecision=false) :
- singleprecision(singleprecision) {open(filename);}
- oxstream(const char *filename, open_mode mode, bool singleprecision=false) :
- singleprecision(singleprecision) {
- open(filename,mode);
- }
- virtual ~oxstream() {closefile();}
+ virtual void open(const char *filename, open_mode mode=trunc);
- oxstream& flush() {if(buf) fflush(buf); return *this;}
+ virtual void close();
+
+ void closefile();
+
+ oxstream(const char *filename, bool singleprecision=false);
+
+ oxstream(const char *filename, open_mode mode, bool singleprecision=false);
+ virtual ~oxstream();
+
+ oxstream& flush();
typedef oxstream& (*omanip)(oxstream&);
- oxstream& operator << (omanip func) { return (*func)(*this); }
-
- OXSTREAM(int,int);
- OXSTREAM(unsigned int,u_int);
- OXSTREAM(long,long);
- OXSTREAM(unsigned long,u_long);
- OXSTREAM(long long,longlong_t);
- OXSTREAM(unsigned long long,u_longlong_t);
- OXSTREAM(short,short);
- OXSTREAM(unsigned short,u_short);
- OXSTREAM(char,char);
+ oxstream& operator << (omanip func);
+
+ OXSTREAM_DECL(int);
+ OXSTREAM_DECL(unsigned int);
+ OXSTREAM_DECL(long);
+ OXSTREAM_DECL(unsigned long);
+ OXSTREAM_DECL(long long);
+ OXSTREAM_DECL(unsigned long long);
+ OXSTREAM_DECL(short);
+ OXSTREAM_DECL(unsigned short);
+ OXSTREAM_DECL(char);
#ifndef _CRAY
- OXSTREAM(unsigned char,u_char);
+ OXSTREAM_DECL(unsigned char);
#endif
- OXSTREAM(float,float);
-
- oxstream& operator << (double x) {
- if(singleprecision)
- *this << (float) x;
- else
- if(!xdr_double(&xdro, &x)) set(badbit);
- return *this;
- }
-
- oxstream& operator << (xbyte x) {
- if(fputc(x.byte(),buf) == EOF) set(badbit);
- return *this;
- }
+ OXSTREAM_DECL(float);
+
+ oxstream& operator << (double x);
+
+ oxstream& operator << (xbyte x);
};
class memoxstream : public oxstream
{
private:
- char* baseBuf;
- size_t len;
+#if defined(_WIN32)
+ fmem fmInstance;
+#else
+ char* buffer=nullptr;
+ size_t size=0;
+#endif
public:
- memoxstream(bool singleprecision=false) :
- oxstream(singleprecision), baseBuf(nullptr), len(0)
- {
- clear();
- buf=open_memstream(&baseBuf,&len);
- if(buf)
- xdrstdio_create(&xdro,buf,XDR_ENCODE);
- else
- set(badbit);
- }
-
- ~memoxstream() override
- {
- closefile();
- free(baseBuf);
- }
-
- [[nodiscard]]
- char const* stream() const
- {
- return baseBuf;
- }
-
- [[nodiscard]]
- size_t const& getLength() const
- {
- return len;
- }
+ memoxstream(bool singleprecision=false);
+ ~memoxstream() override;
+ std::vector<uint8_t> createCopyOfCurrentData();
};
class memixstream: public ixstream
{
public:
- memixstream(char* data, size_t length, bool singleprecision=false) : ixstream(singleprecision)
- {
- xdrmem_create(&xdri,data,length,XDR_DECODE);
- }
-
- explicit memixstream(std::vector<char>& data, bool singleprecision=false) :
- memixstream(data.data(), data.size(), singleprecision)
- {
- }
-
- ~memixstream() override
- {
- xdr_destroy(&xdri);
- }
-
- void close() override
- {
- xdr_destroy(&xdri);
- }
-
- void open(const char *filename, open_mode = in) override
- {
- }
+ memixstream(char* data, size_t length, bool singleprecision=false);
+
+ explicit memixstream(std::vector<char>& data, bool singleprecision=false);
+
+ ~memixstream() override;
+
+ void close() override;
+
+ void open(const char *filename, open_mode = in) override;
};
class ioxstream : public ixstream, public oxstream {
public:
- void open(const char *filename, open_mode mode=out) override {
- clear();
- if(mode & app)
- buf=fopen(filename,"a+");
- else if(mode & trunc)
- buf=fopen(filename,"w+");
- else if(mode & out) {
- buf=fopen(filename,"r+");
- if(!buf)
- buf=fopen(filename,"w+");
- } else
- buf=fopen(filename,"r");
- if(buf) {
- xdrstdio_create(&xdri,buf,XDR_DECODE);
- xdrstdio_create(&xdro,buf,XDR_ENCODE);
- } else set(badbit);
- }
-
- void close() override {
- if(buf) {
-#ifndef _CRAY
- xdr_destroy(&xdri);
- xdr_destroy(&xdro);
-#endif
- fclose(buf);
- buf=NULL;
- }
- }
-
- ioxstream() {}
- ioxstream(const char *filename) {open(filename);}
- ioxstream(const char *filename, open_mode mode) {open(filename,mode);}
- virtual ~ioxstream() {close();}
+ void open(const char *filename, open_mode mode=out) override;
+
+ void close() override;
+
+ ioxstream();
+ ioxstream(const char *filename);
+ ioxstream(const char *filename, open_mode mode);
+ ~ioxstream() override;
};
-inline oxstream& endl(oxstream& s) {s.flush(); return s;}
-inline oxstream& flush(oxstream& s) {s.flush(); return s;}
+oxstream& endl(oxstream& s);
+oxstream& flush(oxstream& s);
-#undef IXSTREAM
-#undef OXSTREAM
+#undef IXSTREAM_DECL
+#undef OXSTREAM_DECL
}
#undef quad_t
#endif
+
+#endif
diff --git a/graphics/asypictureb/README b/graphics/asypictureb/README
index 536022f7eb..919a6917b7 100644
--- a/graphics/asypictureb/README
+++ b/graphics/asypictureb/README
@@ -1,6 +1,6 @@
----------------------------------------------------------------
-asypictureB --- user-friendly integration of Asymptote into LaTeX
-E-mail: cstaats at math.uchicago.edu
+asypictureB -- user-friendly integration of Asymptote into LaTeX
+E-mail: charles dot staats dot iii at gmail.com
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
----------------------------------------------------------------
diff --git a/graphics/asypictureb/asypictureB.dtx b/graphics/asypictureb/asypictureB.dtx
index b86e6a1851..b390d37386 100644
--- a/graphics/asypictureb/asypictureB.dtx
+++ b/graphics/asypictureb/asypictureB.dtx
@@ -1,90 +1,6 @@
% \iffalse meta-comment
-%<*internal>
-\iffalse
-%</internal>
-%<*readme>
-----------------------------------------------------------------
-asypictureB -- user-friendly integration of Asymptote into LaTeX
-E-mail: cstaats at math.uchicago.edu
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-The `asypictureB` package allows users to integrate Asymptote code
-for producing pictures into LaTeX source code using the shell-escape
-functionality. It is an alternative to the `asymptote` package
-that comes with Asymptote. The most important advantage of the
-asypictureB package is that it provides immediate access to
-Asymptote errors by repackaging them as LaTeX errors. It also allows
-limited use of TeX macros such as \the\linewidth inside Asymptote code.
-%</readme>
-%<*internal>
-\fi
-\def\nameofplainTeX{plain}
-\ifx\fmtname\nameofplainTeX\else
- \expandafter\begingroup
-\fi
-%</internal>
-%<*install>
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
-----------------------------------------------------------------
-asypictureB --- user-friendly integration of Asymptote into LaTeX
-E-mail: cstaats at math.uchicago.edu
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Copyright (C) 2014 by Charles Staats III
-
-This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License (LPPL), either
-version 1.3c of this license or (at your option) any later
-version. The latest version of this license is in the following file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
-Charles Staats III.
-
-This work consists of the file asypictureB.dtx
-and the derived files asypictureB.ins,
- asypictureB.pdf, and
- asypictureB.sty.
-
-\endpostamble
-\usedir{tex/latex/asypictureb}
-\generate{
- \file{\jobname.sty}{\from{\jobname.dtx}{package}}
-}
-%</install>
-%<install>\endbatchfile
-%<*internal>
-\usedir{source/latex/asypictureb}
-\generate{
- \file{\jobname.ins}{\from{\jobname.dtx}{install}}
-}
-\nopreamble\nopostamble
-\usedir{doc/latex/asypictureb}
-\generate{
- \file{README.txt}{\from{\jobname.dtx}{readme}}
-}
-\ifx\fmtname\nameofplainTeX
- \expandafter\endbatchfile
-\else
- \expandafter\endgroup
-\fi
-%</internal>
-%<*package>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{asypictureB}
- [2014/04/15 v0.3 user-friendly integration of Asymptote into LaTeX]
-%</package>
+% \fi
+% \iffalse
%<*driver>
\documentclass{ltxdoc}
\usepackage{lmodern}
@@ -99,7 +15,7 @@ and the derived files asypictureB.ins,
\setlength{\emergencystretch}{0.5\linewidth}
\hypersetup{hidelinks}
\newcommand{\packagename}[1]{\textsf{#1}}
-\newcommand{\danger}{\fontencoding{U}\fontfamily{futs}\selectfont\char 66\relax}
+\newcommand{\danger}{\fontencoding{U}\fontfamily{futs}\selectfont\char 49\relax}
\newenvironment{warning}%
{%
\medskip\noindent\hangindent=3em\hangafter=-2%
@@ -115,7 +31,6 @@ and the derived files asypictureB.ins,
\EnableCrossrefs
\CodelineIndex
-\RecordChanges
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
@@ -131,13 +46,11 @@ and the derived files asypictureB.ins,
% corresponds to \packagename{asypictureB}~\fileversion, dated~\filedate.^^A
% }^^A
% }
-% \author{Charles Staats III\thanks{E-mail: cstaats at math.uchicago.edu}}
+% \author{Charles Staats III\thanks{E-mail: charles dot staats dot iii at gmail.com}}
% \date{Released \filedate}
%
% \maketitle
%
-% \changes{v0.3}{2014/04/15}{First public release}
-%
% \begin{abstract}
% The \packagename{asypictureB} package allows users to integrate Asymptote code
% for producing pictures into \LaTeX\ source code using the shell-escape
@@ -148,9 +61,6 @@ and the derived files asypictureB.ins,
% limited use of TeX macros such as |\the\linewidth| inside Asymptote code.
% \end{abstract}
%
-% \noindent\textbf{Disclaimer:} The author of this package has no affiliation with
-% the creators of the Asymptote programming language.
-%
% \tableofcontents
%
% \section{Introduction}
@@ -179,13 +89,7 @@ and the derived files asypictureB.ins,
% included into the \TeX\ source once they do what I want.
% \item
% The \packagename{asymptote} package does not support PNG files,
-% although the Asymptote language does.\footnote{A note
-% on why this is desirable: Asymptote's 3d capabilities are
-% currently much better for
-% rasterized images than for vector graphics. Thus, it is often desirable
-% to produce a rasterized image. Because of a quirk of Asymptote, it is
-% easy to produce high-resolution images in PNG format, but much harder
-% to raise the resolution when the output is in the default PDF format.}
+% although the Asymptote language does.
% \item
% The \packagename{asymptote} package does have a mechanism in place so that
% when it is used with |latexmk|, Asymptote images that have not changed are
@@ -197,10 +101,7 @@ and the derived files asypictureB.ins,
% \item
% The \packagename{asymptote} package can rescale an Asymptote-produced
% image to a given width and/or a given height, but it cannot rescale the
-% image by a given scaling factor.\footnote{This is relevant because a
-% second trick for producing a high-resolution rasterized image with the
-% Asymptote language is to produce a scaled-up PDF image, and then
-% scale it back down when including it into the \TeX\ file.}
+% image by a given scaling factor.
% \end{enumerate}
% The most important issue here is the first, which can to some extent be fixed
% using editor features; see, for instance,
@@ -218,8 +119,8 @@ and the derived files asypictureB.ins,
% \begin{enumerate}
% \item
% Asymptote errors are repackaged as \LaTeX\ errors and reported immediately.
-% At a minimum, the user is shown the Asymptote error log and a line number
-% that will allow him to locate the correct Asymptote picture within the
+% At a minimum, users are shown the Asymptote error log and a line number
+% that will allow them to locate the correct Asymptote picture within the
% \TeX\ source file.
%
% Additionally, \packagename{asypictureB} is usually able to display the
@@ -261,14 +162,14 @@ and the derived files asypictureB.ins,
% First of all, the \packagename{asypictureB} package is mostly useless unless you
% have Asymptote installed on your system.
% \begin{itemize}
-% \item For a Mac OS X system, this installation
+% \item For a MacOS system, this installation
% is automatic with a standard installation
% of \href{http://tug.org/mactex/}{MacTeX}.
% \item For a Windows system, the
% \href{http://asymptote.sourceforge.net/doc/Microsoft-Windows.html}{official
% installation instructions} are fairly good. As of this writing, the most
% recent version of the |setup.exe| file can be downloaded from
-% \url{http://sourceforge.net/projects/asymptote/files/2.24/}.
+% \url{http://sourceforge.net/projects/asymptote/files/2.95/}.
% \item
% For a Unix-like system, a version of
% Asymptote is included in TeX Live, but there may be additional dependencies;
@@ -280,7 +181,7 @@ and the derived files asypictureB.ins,
% \end{itemize}
%
% To use the \texttt{asypictureB} package,
-% the \texttt{.tex} file should be run with shell-escape
+% your \texttt{.tex} file should be run with shell-escape
% enabled:
% \begin{Verbatim}[commandchars=\\\{\},gobble=2]
% pdflatex -shell-escape \meta{filename}
@@ -293,7 +194,9 @@ and the derived files asypictureB.ins,
%
% If you are unwilling to use shell-escape, \packagename{asypictureB}
% creates a script that makes it easy to execute the necessary commands
-% afterwards. To use it, run the following three commands at the terminal.
+% afterwards. To use it, run the following four commands at the terminal.
+% (The second command is optional; it allows you to inspect the script
+% before running it.)
% For convenience, it is assumed that the name of the \LaTeX\ source file
% is |foo.tex|.
%
@@ -302,16 +205,18 @@ and the derived files asypictureB.ins,
% Windows:
% \begin{Verbatim}[commandchars=\\\{\},gobble=2]
% pdflatex foo
-% foo-asy_compile.bat
+% type foo-compile_asy.txt
+% type foo-compile_asy.txt|cmd
% pdflatex foo
% \end{Verbatim}
% \end{minipage}
% \hfill
% \begin{minipage}{0.48\linewidth}
-% Mac OS X and Unix-like systems:
+% MacOS and Unix-like systems:
% \begin{Verbatim}[commandchars=\\\{\},gobble=2]
% pdflatex foo
-% sh foo-asy_compile.sh
+% cat foo-compile_asy.sh
+% sh foo-compile_asy.sh
% pdflatex foo
% \end{Verbatim}
% \end{minipage}
@@ -322,12 +227,13 @@ and the derived files asypictureB.ins,
%
% \begin{warning}
% This method is not entirely foolproof. In particular, if |pdflatex| is run
-% twice in a row without running the \meta{filename}-|asy_compile|
+% twice in a row without running the \meta{filename}-|compile_asy|
% script in between, then
% Asymptote pictures which have been compiled at some point in the past, even
% if they have since been altered, will
% not be recompiled. Should this happen, you can force every |asypicture|
-% to be recompiled using the |\RequireAsyRecompile| command.
+% to be recompiled by temporarily adding the |\RequireAsyRecompile| command
+% before your first |asypicture|.
% \end{warning}
%
% \paragraph{The safer method}
@@ -494,7 +400,7 @@ and the derived files asypictureB.ins,
%
% \begin{warning}
% If \packagename{asypictureB} determines that the contents of an |asypicture|
-% environment named \meta{picturname}
+% environment named \meta{picturename}
% have changed since the last run, it will delete
% all of the following files that exist:
% \begin{Verbatim}[gobble=2,commandchars=\\\{\}]
@@ -541,7 +447,7 @@ and the derived files asypictureB.ins,
% settings.render = 16;
% size(@asywidth,0);
% import three;
-% draw(unitsphere);
+% draw(unitsphere, white);
% \end{asypicture}
% \end{minipage}
% \hfill
@@ -553,7 +459,7 @@ and the derived files asypictureB.ins,
% settings.render = 16;
% size(@asywidth,0);
% import three;
-% draw(unitsphere);
+% draw(unitsphere, white);
% \end{asypicture}
% \end{Verbatim}
% \end{minipage}
@@ -662,14 +568,16 @@ and the derived files asypictureB.ins,
% \texttt{\meta{filename}-\meta{picturename}\_errors.txt}.
% \end{quote}
% Once the Asymptote run is complete, it checks whether the error file
-% has any content. If so, it throws a \LaTeX\ package error and displays
+% has any lines of the form
+% \begin{quote}
+% \texttt{\meta{filename}-\meta{picturename}.asy:\meta{number}.\meta{stuff}}
+% \end{quote}
+% If so, it throws a \LaTeX\ package error and displays
% the contents of the error file, which include all the errors and
-% warnings issued by Asymptote. One unfortunate
-% consequence of this procedure is that
-% a warning by Asymptote will be translated into a full-fledged error,
-% which is why the \LaTeX\ error message begins with the words
-% ``Possible Asymptote error."
-%
+% warnings issued by Asymptote. Note that if some kind of asy error occurs
+% that does not match this output form, \packagename{asypictureB} will not
+% notice the error.
+%
% The \LaTeX\ error message will give the line number of the
% |\end{asypicture}| command for the |asypicture| that caused the error, which
% is of limited use in isolating the error.
@@ -683,15 +591,12 @@ and the derived files asypictureB.ins,
% error log and print out the five lines leading up to the error. More precisely,
% it does the following:
% \begin{enumerate}
-% \item If the first line of the error log is of the form
+% \item From the first line of the form
% \begin{quote}
% \texttt{\meta{filename}-\meta{picturename}.asy:\meta{number}.\meta{stuff}}
% \end{quote}
-% then the \meta{number} is extracted. If the first line is not of this
-% form, then the parsing is considered to have failed. As a consequence,
-% if the first line of the error log is a warning but an error shows up
-% later, \packagename{asypictureB} will not notice the error message.
-% In the author's experience, this problem does occur, but not often.
+% the \meta{number} is extracted. Note that if no successful extraction occurs,
+% there will be no \LaTeX\ error.
% \item Assuming \meta{number} was extracted successfully, the lines
% of the |asy| file from
% the inclusive range $\meta{number}-5$ to \meta{number} are displayed
@@ -709,7 +614,7 @@ and the derived files asypictureB.ins,
% \begin{Verbatim}[gobble=2,numbers=left,tabsize=4]
% \documentclass{article}
% \usepackage{asypictureB}
-% \begin{document}
+% \begin{document}
% \def\asywidth{5cm}
% \begin{asypicture}{name=error_example}
% // A comment
@@ -725,13 +630,12 @@ and the derived files asypictureB.ins,
% If this file is saved as \texttt{asyerrorexample.tex} and then
% compiled with the shell-escape option, the following error results:
% \begin{Verbatim}[gobble=2]
-% ./asyerrorexample.tex:13: Package asypicture Error:
-% Possible Asymptote error:
-% asyerrorexample-error_example.asy: 10.5: syntax error
+% ! Package asypictureB Error:
+% draw(l1, dotted);
+% ^
+% asyerrorexample-error_example.asy: 10.5: syntax error
% error: could not load module 'asyerrorexample-error_example.asy'
%
-%
-%
% 6 size(5cm, 0);
% 7 path l1 = (0,0) -- (1,1);
% 8 // Another comment
@@ -739,16 +643,16 @@ and the derived files asypictureB.ins,
% 10 draw(l1, dotted);
% .
%
-% See the asypicture package documentation for explanation.
+% See the asypictureB package documentation for explanation.
% Type H <return> for immediate help.
-% ...
-%
+% ...
+%
% l.13 \end{asypicture}
% \end{Verbatim}
-% The first two lines of the \LaTeX\ error message identifies that the
-% |asypicture| environment ending on line 13 may have produced an error.
-% The next two lines are the Asymptote error log: they explain that this
-% was, in fact, a syntax error. Looking at the five lines displayed,
+% The \LaTeX\ error message first repeats the Asymptote error log,
+% which explains that there was a syntax error. Next, the five lines
+% leading up to the error are displayed.
+% Looking at these five lines,
% one can determine that the difficulty was a comma omitted
% on line 9 of the Asympote file. (It is diagnosed on line 10 because
% of how the compiler works.) Looking at the context, this corresponds
@@ -765,7 +669,10 @@ and the derived files asypictureB.ins,
% also used in the \LaTeX\ code to avoid hard-coding numbers.
% However, it was almost immediately apparent that this feature
% has more sophistocated uses, such as allowing user-defined
-% syntax or even creating something similar to templates.
+% syntax or even creating something similar to templates\footnote{If you
+% actually want to use templates in Asymptote code, the experimental
+% \emph{templated imports} feature of the language is probably a
+% better choice than the macro techniques described in this section}.
%
% \subsection{Limitations}
%
@@ -962,7 +869,7 @@ and the derived files asypictureB.ins,
% same packages loaded and macros defined as in the original document.
% For instance, font consistency between the Asymptote images and the
% larger document is ensured by this option.
-% It comes with an important limitations---Asymptote cannot use size information
+% It comes with an important limitation---Asymptote cannot use size information
% about the labels when this option is in use.
%
% The closest
@@ -1077,6 +984,33 @@ and the derived files asypictureB.ins,
% \paragraph{No spaces in file names} The \packagename{asymptote} package
% takes measures to accomodate peculiar file names---in particular, file
% names that include spaces. The \packagename{asypictureB} package does not.
+%
+% \paragraph{No directory specification} The \packagename{asymptote} package
+% allows the user to specify a directory in which to store the Asymptote
+% code and images. The \packagename{asypictureB} package does not currently
+% have this feature, although there is a patch by user202729 that will hopefully
+% be included in the next version. Note that neither package respects the
+% |-output-directory| commandline option.
+%
+% \paragraph{Suboptimal interaction with \texttt{latexmk}} By design, the
+% \packagename{asypictureB} package allows the image format to be specified by
+% the Asymptote code; it does not care whether a |png| or |pdf| file is produced.
+% Unfortunately, |latexmk| relies on being able to identify the generated image file
+% from the \TeX\ log file. Thus, if you use \packagename{asypictureB} with |latexmk|,
+% it will rerun Asymptote every time for |asypicture|s that produce a file format other
+% than the one expected by |latexmk|. Since \packagename{asypictureB} and |latexmk|
+% are two different solutions to the same problem, I expect most users will choose
+% one or the other. But for those who want to use them together, hopefully there will
+% be a better solution in the future.
+%
+% \section{Acknowledgements}
+%
+% The current \packagename{asypictureB} package incorporates bug fixes and improvements
+% by \href{https://github.com/user202729}{user202729}
+% (\url{https://tex.stackexchange.com/users/250119})
+% and \href{https://github.com/cfr42}{cfr}
+% (\url{https://tex.stackexchange.com/users/39222}). For more details,
+% see the \href{https://github.com/charlesstaats/asypictureB/commits/main/}{commit history on github}.
%
% \StopEventually{^^A
% \PrintChanges
@@ -1088,33 +1022,45 @@ and the derived files asypictureB.ins,
%<*package>
%\fi
% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{asypictureB}
+ [2025/01/26 v0.4 user-friendly integration of Asymptote into LaTeX]
+
\RequirePackage{fancyvrb}
\RequirePackage{graphicx}
\RequirePackage{pgfkeys}
-
\makeatletter
\def\asy@OutFile{\FV@OutFile}
\RequirePackage{ifplatform}
+% \end{macrocode}
+% Define the |\shell@execute| command. If shell escape is enabled, the
+% command executes its contents in the shell. Otherwise, the command
+% is written to a script for the user to execute.
+% \begin{macrocode}
\ifshellescape
\def\ASYPIC@shell{18}
\newcommand{\shell@execute}{\immediate\write\ASYPIC@shell}
\else
- \newwrite\ASYPIC@shell
- \ifwindows
- \openout\ASYPIC@shell=\jobname-compile_asy.bat\relax
- \else
- \openout\ASYPIC@shell=\jobname-compile_asy.sh\relax
- \fi
- \newcommand{\shell@execute}[1]{{%
- \edef\temp{#1}%
+ \newwrite\ASYPIC@shell
+ \ifwindows
+ \openout\ASYPIC@shell=\jobname-compile_asy.txt\relax
+ \else
+ \openout\ASYPIC@shell=\jobname-compile_asy.sh\relax
+ \fi
+ \newcommand{\shell@execute}[1]{{%
+ \edef\temp{#1}%
\write\expandafter\ASYPIC@shell\expandafter{\temp}%
- }}
+ }}
\fi
+% \end{macrocode}
+% Define the |\copyfile| command, which should work regardless of whether
+% shell escape is enabled. (If shell escape is enabled, it is more efficient.)
+% \begin{macrocode}
\ifshellescape
\newcommand{\copyfile}[2]{%
\ifwindows%
@@ -1130,6 +1076,12 @@ and the derived files asypictureB.ins,
}
\fi
+% \end{macrocode}
+% Define the |\deletefile| command. Unlike |\copyfile|, this command will
+% have no immediate effect if shell escape is not enabled, instead writing
+% a line to the script. (If shell escape \emph{is} enabled, of course the
+% command will immediately delete the file.)
+% \begin{macrocode}
\newcommand{\deletefile}[1]{%
\ifwindows%
\shell@execute{del #1}%
@@ -1138,7 +1090,10 @@ and the derived files asypictureB.ins,
\fi%
}
-
+% \end{macrocode}
+%
+% Set up the key-value system for \packagename{asypictureB} using \packagename{pgfkeys}.
+% \begin{macrocode}
\newcommand{\asyset}[1]{\pgfqkeys{/asy}{#1}}
\newcommand{\@asyerrorfilename}{\@asypicturename_errors.txt}
\newcounter{@asy@linenumber}
@@ -1148,8 +1103,8 @@ and the derived files asypictureB.ins,
\asyset{graphic options/.code={}}
\asyset{set graphic option/.style={graphic options/.append code=#1}}
% \end{macrocode}
-% Unrecognized keys should be passed to the |\includegraphics| command
-% using |\setkeys|.
+% Unrecognized keys should be passed to the |\includegraphics| command
+% using |\setkeys|.
% \begin{macrocode}
\asyset{.unknown/.code = %
{%
@@ -1176,7 +1131,6 @@ and the derived files asypictureB.ins,
\asyset{angle/.style = {set graphic option = {\def\asy@angle{#1}}},
angle/.value required}
-
\newcommand{\getfontsize}{\f@size}
\newif\ifasyfilechanged
@@ -1190,10 +1144,8 @@ and the derived files asypictureB.ins,
\newcommand{\AsyCompileIfNecessary}{\ASYPIC@flushfalse}
\AsyCompileIfNecessary
-
\newcommand\clearasyheader{\def\ASYPIC@header{}}
-
\def\ASYPIC@header{}
\def\asyheader{\FV@Environment{}{asyheader}}
@@ -1207,7 +1159,7 @@ and the derived files asypictureB.ins,
\FV@DefineTabOut
\def\FV@ProcessLine##1{\g@addto@macro\ASYPIC@header{##1^^J}}%
\let\FV@FontScanPrep\relax
- %% DG/SR modification begin - May. 18, 1998
+ %% DG/SR modification begin - May. 18, 1998
%% (to avoid problems with ligatures)
\let\@noligs\relax
%% DG/SR modification end
@@ -1230,18 +1182,27 @@ settings.prc = false;
% \begin{macrocode}
\def\asypicture{\FV@Environment{}{asypicture}}
+% \end{macrocode}
+%
+% Define the |\ASYPIC%recordname| command. As an example, |\ASYPIC@recordname@foo|
+% in the file |bar.tex| would set |\asylistingfile| to |bar-foo.asy| the first
+% time it is called. A second call to |\ASYPIC@recordname{foo}| would set
+% |\asylistingfile| to |bar-foo__1.asy|, a third to |bar-foo__2.asy|, and so on.
+% The next number to use is stored in the macro |\ASYPIC@name@foo|. (Note that this
+% is a macro, not a counter.)
+% \begin{macrocode}
\newcommand{\ASYPIC@recordname}[1]{%
\edef\tempmacroname{ASYPIC@name@#1}%
\ifcsname\tempmacroname\endcsname%% if \ASYPIC@name@... is defined
\edef\oldnum{\csname\tempmacroname\endcsname}%
\edef\@asypicturename%
- {\scantokens\expandafter{\jobname\noexpand}-#1__\oldnum}%
+ {\jobname-#1__\oldnum}%
\expandafter\xdef\csname\tempmacroname\endcsname%
{\the\numexpr\oldnum+1\relax}%
\edef\ASYPIC@current@num{\csname\tempmacroname\endcsname}%
\else%% This is the first time this name is being used.
\edef\@asypicturename%
- {\scantokens\expandafter{\jobname\noexpand}-#1}%
+ {\jobname-#1}%
\expandafter\gdef\csname\tempmacroname\endcsname{1}%
\fi%
\xdef\asylistingfile{\@asypicturename.asy}
@@ -1293,8 +1254,8 @@ settings.prc = false;
\@asyrepeatfalse%
\asyfilechangedtrue%
\else% Not at the end of either file in this case
- \read\@asyreadold to \oldfileline%
- \read\@asyreadnew to \newfileline%
+ \readline\@asyreadold to \oldfileline%
+ \readline\@asyreadnew to \newfileline%
\ifx\oldfileline\newfileline%
\@asyrepeattrue%
\else
@@ -1323,46 +1284,52 @@ settings.prc = false;
\shell@execute{asy -noV \@asypicturename.asy 2> \@asyerrorfilename}%
\openin\@asyreadold=\@asyerrorfilename\relax%
\ifeof\@asyreadold%
- \closein\@asyreadold%
+ \closein\@asyreadold% Error log does not exist.
\else%
- \def\@asyerrormessage{^^JPossible Asymptote error:^^J}%
- \read\@asyreadold to \@asyerrorfirstline%
- \g@addto@macro\@asyerrormessage{\@asyerrorfirstline^^J}%
- \ifeof\@asyreadold%
- \closein\@asyreadold%
- \else%
- {\endlinechar=`^^J%
- \loop%
- \readline\@asyreadold to \@asytempmessage%
- \expandafter\g@addto@macro\expandafter%
- \@asyerrormessage\expandafter{\@asytempmessage^^J}%
- \unless\ifeof\@asyreadold\repeat%
+ \def\@asyerrormessage{^^J}%
+ %Create command to process line of log file to figure
+ %out the Asymptote file line number:
+ \edef\@asy@temp{%
+ \def\noexpand\@asy@processerrorline####1\detokenize\expandafter{%
+ \@asypicturename.asy:%
}%
- \closein\@asyreadold%
- \g@addto@macro\@asyerrormessage{^^J}%
- %Next: Need to process \@asyerrorfirstline to figure
- %out the Asymptote file line number
- \expandafter\def\expandafter\@asy@processerrorline%
- \expandafter##\expandafter1\@asypicturename.asy:%
- ##2.##3\relax{\xdef\@asy@errorline{\numexpr##2\relax}}%
- {\expandafter\expandafter\expandafter%
- \@asy@processerrorline\expandafter%
- \@asyerrorfirstline\@asypicturename.asy: -5.\relax%
- }% The surrounding braces should prevent too much from
- % being gobbled in case the pattern doesn't match.
+ }%
+ \@asy@temp##2.##3:\relax{%
+ \xdef\@asy@errorlinenumber{\numexpr##2\relax}}%
+ %
+ \gdef\@asy@errorlinenumber{-5}%
+ {%
+ \endlinechar=-1%
+ \loop\unless\ifeof\@asyreadold%
+ \readline\@asyreadold to \@asyerrorcurrentline%
+ \ifnum\@asy@errorlinenumber=-5%
+ {\expandafter\expandafter\expandafter%
+ \@asy@processerrorline\expandafter%
+ % Suffix provides default of -5:
+ \@asyerrorcurrentline\detokenize\expandafter%
+ {\@asypicturename.asy:} -5.1:\relax%
+ }%
+ \fi%
+ \expandafter\g@addto@macro\expandafter\@asyerrormessage%
+ \expandafter{\@asyerrorcurrentline^^J}%
+ \repeat%
+ }%
+ \closein\@asyreadold%
+ \ifnum\@asy@errorlinenumber=-5% No error
+ \else%
\openin\@asyreadold\@asypicturename.asy\relax%
\edef\numlinesout{5}
\setcounter{@asy@linenumber}{\numlinesout}
- \loop\ifnum\value{@asy@linenumber}<\@asy@errorline%
+ \loop\ifnum\value{@asy@linenumber}<\@asy@errorlinenumber%
\readline\@asyreadold to \temp%
\stepcounter{@asy@linenumber}%
\repeat%
%
- \addtocounter{@asy@linenumber}{-\numlinesout}
+ \addtocounter{@asy@linenumber}{-\numlinesout}%
%
{%
\endlinechar=`^^J%
- \loop\ifnum\value{@asy@linenumber}<\@asy@errorline%
+ \loop\ifnum\value{@asy@linenumber}<\@asy@errorlinenumber%
\stepcounter{@asy@linenumber}%
\edef\temp/{\arabic{@asy@linenumber}}%
\expandafter\g@addto@macro\expandafter%
@@ -1374,12 +1341,12 @@ settings.prc = false;
}%
\closein\@asyreadold%
\PackageError{asypictureB}{\@asyerrormessage}{%
- The Asymptote run described above
- gave a non-empty error log. I have^^J
- reproduced the error log and attempted
- to print the five lines leading^^J
- up to the error. Press enter or return
- to continue, and then fix your^^J
+ The Asymptote run described above
+ gave a non-empty error log. I have^^J%
+ reproduced the error log and attempted
+ to print the five lines leading^^J%
+ up to the error. Press enter or return
+ to continue, and then fix your^^J%
Asymptote code when this run is done.
}%
\fi%
@@ -1400,7 +1367,7 @@ settings.prc = false;
{\deletefile{\@asypicturename.pdf}}{}%
\IfFileExists{\@asypicturename.eps}%
{\deletefile{\@asypicturename.eps}}{}%
- \copyfile{\@tempasyfile.asy}{\@asypicturename.asy}
+ \copyfile{\@tempasyfile.asy}{\@asypicturename.asy}%
\ASYPIC@runasy%
\fi%
\asyset{graphic options}%
diff --git a/graphics/asypictureb/asypictureB.ins b/graphics/asypictureb/asypictureB.ins
index c19feaa770..056d810a1b 100644
--- a/graphics/asypictureb/asypictureB.ins
+++ b/graphics/asypictureb/asypictureB.ins
@@ -1,13 +1,6 @@
-%%
-%% This is file `asypictureB.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% asypictureB.dtx (with options: `install')
%% ----------------------------------------------------------------
%% asypictureB --- user-friendly integration of Asymptote into LaTeX
-%% E-mail: cstaats at math.uchicago.edu
+%% E-mail: charles dot staats dot iii at gmail.com
%% Released under the LaTeX Project Public License v1.3c or later
%% See http://www.latex-project.org/lppl.txt
%% ----------------------------------------------------------------
@@ -18,7 +11,7 @@
\preamble
----------------------------------------------------------------
asypictureB --- user-friendly integration of Asymptote into LaTeX
-E-mail: cstaats at math.uchicago.edu
+E-mail: charles dot staats dot iii at gmail.com
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
----------------------------------------------------------------
@@ -38,10 +31,10 @@ version. The latest version of this license is in the following file:
This work is "maintained" (as per LPPL maintenance status) by
Charles Staats III.
-This work consists of the file asypictureB.dtx
-and the derived files asypictureB.ins,
- asypictureB.pdf, and
- asypictureB.sty.
+This work consists of the files asypictureB.dtx and
+ asypictureB.ins,
+and the derived files asypictureB.pdf and
+ asypictureB.sty.
\endpostamble
\usedir{tex/latex/asypictureb}
@@ -62,10 +55,10 @@ and the derived files asypictureB.ins,
%% This work is "maintained" (as per LPPL maintenance status) by
%% Charles Staats III.
%%
-%% This work consists of the file asypictureB.dtx
-%% and the derived files asypictureB.ins,
-%% asypictureB.pdf, and
-%% asypictureB.sty.
+%% This work consists of the files asypictureB.dtx and
+%% asypictureB.ins,
+%% and the derived files asypictureB.pdf and
+%% asypictureB.sty.
%%
%%
%% End of file `asypictureB.ins'.
diff --git a/graphics/asypictureb/asypictureB.pdf b/graphics/asypictureb/asypictureB.pdf
index 9365ef3c88..8b160da7f9 100644
--- a/graphics/asypictureb/asypictureB.pdf
+++ b/graphics/asypictureb/asypictureB.pdf
Binary files differ
diff --git a/graphics/asypictureb/asypictureB.sty b/graphics/asypictureb/asypictureB.sty
deleted file mode 100644
index cfca65bcdd..0000000000
--- a/graphics/asypictureb/asypictureB.sty
+++ /dev/null
@@ -1,338 +0,0 @@
-%%
-%% This is file `asypictureB.sty',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% asypictureB.dtx (with options: `package')
-%% ----------------------------------------------------------------
-%% asypictureB --- user-friendly integration of Asymptote into LaTeX
-%% E-mail: cstaats at math.uchicago.edu
-%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
-%% ----------------------------------------------------------------
-%%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{asypictureB}
- [2014/04/15 v0.3 user-friendly integration of Asymptote into LaTeX]
-\RequirePackage{fancyvrb}
-\RequirePackage{graphicx}
-\RequirePackage{pgfkeys}
-
-\makeatletter
-
-\def\asy@OutFile{\FV@OutFile}
-
-\RequirePackage{ifplatform}
-
-\ifshellescape
- \def\ASYPIC@shell{18}
- \newcommand{\shell@execute}{\immediate\write\ASYPIC@shell}
-\else
-\newwrite\ASYPIC@shell
-\ifwindows
- \openout\ASYPIC@shell=\jobname-compile_asy.bat\relax
-\else
- \openout\ASYPIC@shell=\jobname-compile_asy.sh\relax
-\fi
-\newcommand{\shell@execute}[1]{{%
-\edef\temp{#1}%
- \write\expandafter\ASYPIC@shell\expandafter{\temp}%
-}}
-\fi
-
-\ifshellescape
- \newcommand{\copyfile}[2]{%
- \ifwindows%
- \immediate\write18{copy #1 #2 /y}%
- \else%
- \immediate\write18{cp #1 #2}%
- \fi%
- }
-\else
- \RequirePackage{verbatimcopy}
- \newcommand{\copyfile}[2]{%
- \OldVerbatimCopy{#1}{#2}%
- }
-\fi
-
-\newcommand{\deletefile}[1]{%
- \ifwindows%
- \shell@execute{del #1}%
- \else%
- \shell@execute{rm #1}%
- \fi%
-}
-
-\newcommand{\asyset}[1]{\pgfqkeys{/asy}{#1}}
-\newcommand{\@asyerrorfilename}{\@asypicturename_errors.txt}
-\newcounter{@asy@linenumber}
-
-\asyset{name/.initial=noname, name/.value required}%
-
-\asyset{graphic options/.code={}}
-\asyset{set graphic option/.style={graphic options/.append code=#1}}
-\asyset{.unknown/.code = %
- {%
- \edef\unknownkey{\pgfkeyscurrentname}%
- \asyset{set graphic option/.expand once = {%
- \expandafter\setkeys\expandafter{%
- \expandafter G\expandafter i\expandafter n\expandafter%
- }\expandafter{\unknownkey=#1}%
- }}%
- }%
-}
-\def\asy@scale{1}
-\asyset{scale/.style={set graphic option = {\def\asy@scale{#1}}},
- scale/.value required}
-\newcommand{\asy@angle}{0}
-\asyset{angle/.style = {set graphic option = {\def\asy@angle{#1}}},
- angle/.value required}
-
-\newcommand{\getfontsize}{\f@size}
-
-\newif\ifasyfilechanged
-\newif\ifASYPIC@flush
-\newif\if@asyrepeat
-\newread\@asyreadold
-\newread\@asyreadnew
-\edef\@tempasyfile{\jobname-temp}
-
-\newcommand{\RequireAsyRecompile}{\ASYPIC@flushtrue}
-\newcommand{\AsyCompileIfNecessary}{\ASYPIC@flushfalse}
-\AsyCompileIfNecessary
-
-\newcommand\clearasyheader{\def\ASYPIC@header{}}
-
-\def\ASYPIC@header{}
-
-\def\asyheader{\FV@Environment{}{asyheader}}
-
-\def\FVB@asyheader{%
- \@bsphack
- \begingroup
- \FV@UseKeyValues
- \FV@DefineWhiteSpace
- \def\FV@Space{\space}%
- \FV@DefineTabOut
- \def\FV@ProcessLine##1{\g@addto@macro\ASYPIC@header{##1^^J}}%
- \let\FV@FontScanPrep\relax
- %% DG/SR modification begin - May. 18, 1998
- %% (to avoid problems with ligatures)
- \let\@noligs\relax
- %% DG/SR modification end
- \FV@Scan}%
-
-\def\FVE@asyheader{\endgroup\@esphack}
-
-\DefineVerbatimEnvironment{asyheader}{asyheader}%
- {codes={\catcode`@=0},tabsize=4}
-\begin{asyheader}
-defaultpen(fontsize(@getfontsize pt));
-settings.prc = false;
-\end{asyheader}
-\def\asypicture{\FV@Environment{}{asypicture}}
-
-\newcommand{\ASYPIC@recordname}[1]{%
- \edef\tempmacroname{ASYPIC@name@#1}%
- \ifcsname\tempmacroname\endcsname%% if \ASYPIC@name@... is defined
- \edef\oldnum{\csname\tempmacroname\endcsname}%
- \edef\@asypicturename%
- {\scantokens\expandafter{\jobname\noexpand}-#1__\oldnum}%
- \expandafter\xdef\csname\tempmacroname\endcsname%
- {\the\numexpr\oldnum+1\relax}%
- \edef\ASYPIC@current@num{\csname\tempmacroname\endcsname}%
- \else%% This is the first time this name is being used.
- \edef\@asypicturename%
- {\scantokens\expandafter{\jobname\noexpand}-#1}%
- \expandafter\gdef\csname\tempmacroname\endcsname{1}%
- \fi%
- \xdef\asylistingfile{\@asypicturename.asy}
-}
-
-
-\def\FVB@asypicture#1{%
- \@bsphack
- \asyset{graphic options/.code={}}%
- \asyset{#1, name/.get = \currentname}%
- \ASYPIC@recordname{\currentname}%
- \begingroup
- \FV@UseKeyValues
- \FV@DefineWhiteSpace
- \def\FV@Space{\space}%
- \FV@DefineTabOut
- \def\FV@ProcessLine{\immediate\write\asy@OutFile}%
- \immediate\openout\asy@OutFile\@tempasyfile.asy\relax
- \immediate\write\asy@OutFile{\ASYPIC@header^^J}
- \let\FV@FontScanPrep\relax
- %% DG/SR modification begin - May. 18, 1998
- %% (to avoid problems with ligatures)
- \let\@noligs\relax
- %% DG/SR modification end
- \FV@Scan}
-
-\newcommand{\ASYPICcomparefiles}[2]{
- \IfFileExists{\@asypicturename.asy}%
- {\openin\@asyreadold=#1.asy\relax%
- \openin\@asyreadnew=#2.asy\relax%
- \asyfilechangedfalse%
- \@asyrepeattrue%
- \loop%
- \ifeof\@asyreadold%
- \@asyrepeatfalse%
- \ifeof\@asyreadnew%
- \else%
- \asyfilechangedtrue%
- \fi%
- \else%
- \ifeof\@asyreadnew%
- \@asyrepeatfalse%
- \asyfilechangedtrue%
- \else% Not at the end of either file in this case
- \read\@asyreadold to \oldfileline%
- \read\@asyreadnew to \newfileline%
- \ifx\oldfileline\newfileline%
- \@asyrepeattrue%
- \else
- \asyfilechangedtrue%
- \@asyrepeatfalse%
- \fi%
- \fi%
- \fi%
- \if@asyrepeat
- \repeat%
- \closein\@asyreadold%
- \closein\@asyreadnew%
- }%
- {\asyfilechangedtrue}%
- \IfFileExists{#1.pdf}{}{%
- \IfFileExists{#1.png}{}{%
- \IfFileExists{#1.eps}{}{%
- \asyfilechangedtrue%
- }%
- }%
- }%
-}
-
-\def\ASYPIC@runasy{%
- \message{Attempting to run asy on \@asypicturename.asy^^J}%
- \shell@execute{asy -noV \@asypicturename.asy 2> \@asyerrorfilename}%
- \openin\@asyreadold=\@asyerrorfilename\relax%
- \ifeof\@asyreadold%
- \closein\@asyreadold%
- \else%
- \def\@asyerrormessage{^^JPossible Asymptote error:^^J}%
- \read\@asyreadold to \@asyerrorfirstline%
- \g@addto@macro\@asyerrormessage{\@asyerrorfirstline^^J}%
- \ifeof\@asyreadold%
- \closein\@asyreadold%
- \else%
- {\endlinechar=`^^J%
- \loop%
- \readline\@asyreadold to \@asytempmessage%
- \expandafter\g@addto@macro\expandafter%
- \@asyerrormessage\expandafter{\@asytempmessage^^J}%
- \unless\ifeof\@asyreadold\repeat%
- }%
- \closein\@asyreadold%
- \g@addto@macro\@asyerrormessage{^^J}%
- %Next: Need to process \@asyerrorfirstline to figure
- %out the Asymptote file line number
- \expandafter\def\expandafter\@asy@processerrorline%
- \expandafter##\expandafter1\@asypicturename.asy:%
- ##2.##3\relax{\xdef\@asy@errorline{\numexpr##2\relax}}%
- {\expandafter\expandafter\expandafter%
- \@asy@processerrorline\expandafter%
- \@asyerrorfirstline\@asypicturename.asy: -5.\relax%
- }% The surrounding braces should prevent too much from
- % being gobbled in case the pattern doesn't match.
- \openin\@asyreadold\@asypicturename.asy\relax%
- \edef\numlinesout{5}
- \setcounter{@asy@linenumber}{\numlinesout}
- \loop\ifnum\value{@asy@linenumber}<\@asy@errorline%
- \readline\@asyreadold to \temp%
- \stepcounter{@asy@linenumber}%
- \repeat%
- %
- \addtocounter{@asy@linenumber}{-\numlinesout}
- %
- {%
- \endlinechar=`^^J%
- \loop\ifnum\value{@asy@linenumber}<\@asy@errorline%
- \stepcounter{@asy@linenumber}%
- \edef\temp/{\arabic{@asy@linenumber}}%
- \expandafter\g@addto@macro\expandafter%
- \@asyerrormessage\expandafter{\temp/ }%
- \readline\@asyreadold to \@asytempmessage%
- \expandafter\g@addto@macro\expandafter%
- \@asyerrormessage\expandafter{\@asytempmessage}%
- \repeat%
- }%
- \closein\@asyreadold%
- \PackageError{asypictureB}{\@asyerrormessage}{%
- The Asymptote run described above
- gave a non-empty error log. I have^^J
- reproduced the error log and attempted
- to print the five lines leading^^J
- up to the error. Press enter or return
- to continue, and then fix your^^J
- Asymptote code when this run is done.
- }%
- \fi%
- \fi%
-}
-
-\def\FVE@asypicture{\immediate\closeout\asy@OutFile\endgroup%
- \@esphack%
- \ifASYPIC@flush%
- \asyfilechangedtrue%
- \else%
- \ASYPICcomparefiles{\@asypicturename}{\@tempasyfile}%
- \fi%
- \ifasyfilechanged%
- \IfFileExists{\@asypicturename.png}%
- {\deletefile{\@asypicturename.png}}{}%
- \IfFileExists{\@asypicturename.pdf}%
- {\deletefile{\@asypicturename.pdf}}{}%
- \IfFileExists{\@asypicturename.eps}%
- {\deletefile{\@asypicturename.eps}}{}%
- \copyfile{\@tempasyfile.asy}{\@asypicturename.asy}
- \ASYPIC@runasy%
- \fi%
- \asyset{graphic options}%
- % Avoid giving "file does not exist" errors.
- \chardef\previousinteractionmode=\interactionmode%
- \batchmode%
- \includegraphics[scale=\asy@scale,angle=\asy@angle]%
- {\@asypicturename}%
- \interactionmode=\previousinteractionmode%
-}
-
-\DefineVerbatimEnvironment{asypicture}{asypicture}%
- {codes={\catcode`@=0},tabsize=4}
-
-\ifshellescape\else
- \AtEndDocument{\closeout\ASYPIC@shell}
-\fi
-
-\makeatother
-%%
-%% Copyright (C) 2014 by Charles Staats III
-%%
-%% This file may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License (LPPL), either
-%% version 1.3c of this license or (at your option) any later
-%% version. The latest version of this license is in the following file:
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% This work is "maintained" (as per LPPL maintenance status) by
-%% Charles Staats III.
-%%
-%% This work consists of the file asypictureB.dtx
-%% and the derived files asypictureB.ins,
-%% asypictureB.pdf, and
-%% asypictureB.sty.
-%%
-%%
-%% End of file `asypictureB.sty'.
diff --git a/graphics/bookshelf/LICENSE b/graphics/bookshelf/LICENSE
new file mode 100644
index 0000000000..90e5e3ab79
--- /dev/null
+++ b/graphics/bookshelf/LICENSE
@@ -0,0 +1,416 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2006-05-20
+
+Copyright 1999 2002-2006 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2005 M. Y. Name
+ %
+ % This work may be distributed and/or modified under the
+ % conditions of the LaTeX Project Public License, either version 1.3
+ % of this license or (at your option) any later version.
+ % The latest version of this license is in
+ % http://www.latex-project.org/lppl.txt
+ % and version 1.3 or later is part of all distributions of LaTeX
+ % version 2005/12/01 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
+
diff --git a/graphics/bookshelf/MANIFEST b/graphics/bookshelf/MANIFEST
deleted file mode 100644
index ec75086096..0000000000
--- a/graphics/bookshelf/MANIFEST
+++ /dev/null
@@ -1,7 +0,0 @@
-bookshelf.dtx
-bookshelf.ins
-bookshelf.pdf
-MANIFEST
-myshelf.jpg
-README.md
-VERSION
diff --git a/graphics/bookshelf/Makefile b/graphics/bookshelf/Makefile
new file mode 100644
index 0000000000..795656791c
--- /dev/null
+++ b/graphics/bookshelf/Makefile
@@ -0,0 +1,37 @@
+PACKAGE = bookshelf
+
+
+DIRS = doc scripts
+
+all: ${PACKAGE}.cls bookshelf-svgnam.tex
+ for dir in ${DIRS}; do cd $$dir; ${MAKE} $@; cd ..; done
+
+%.cls: %.ins %.dtx
+ pdflatex $<
+
+bookshelf-svgnam.tex:
+ ./svgnam.sh > bookshelf-svgnam.tex
+ $(RM) svgnam.csv
+
+%.pdf: %.dtx
+ xelatex $<
+ - biber $<
+ xelatex $<
+ - makeindex -s gind.ist -o $*.ind $*.idx
+ - makeindex -s gglo.ist -o $*.gls $*.glo
+ xelatex $<
+ while ( grep -q '^LaTeX Warning: Label(s) may have changed' $*.log) \
+ do xelatex $<; done
+
+
+clean:
+ $(RM) *.aux *.log *.bbl *.blg *.cls *.dvi *~ pickfont.tex \
+ *.bcf *.glo *.gls *.hd *.idx *.ilg *.ind *.our *.xml *.toc \
+ *.out *.pdf *.tgz svgnam.csv
+ for dir in ${DIRS}; do cd $$dir; ${MAKE} $@; cd ..; done
+
+distclean: clean
+ for dir in ${DIRS}; do cd $$dir; ${MAKE} $@; cd ..; done
+
+archive: all clean
+ COPYFILE_DISABLE=1 tar -C .. -czvf ../$(PACKAGE).tgz --exclude '*~' --exclude '*.tgz' --exclude '*.zip' --exclude CVS --exclude '.git*' --exclude books.bib $(PACKAGE); mv ../$(PACKAGE).tgz .
diff --git a/graphics/bookshelf/README.md b/graphics/bookshelf/README.md
index daa1df57dc..3bab45cbba 100644
--- a/graphics/bookshelf/README.md
+++ b/graphics/bookshelf/README.md
@@ -1,188 +1,39 @@
+# Bookshelf package by Peter Flynn, with changes by Boris Veytsman
-[//]: # (bookshelf LaTeX class)
+## TL;DR
-# bookshelf
+Create your own BibTeX file `sample.tex` and put its name in `spines.tex`:
-This is the README.md file for the bookshelf LaTeX class v0.5 (2020-05-24)
-generated by ClassPack v.1.19 (2020-05-19) on 23 May 2020 at 23:33:08
+``` tex
+% !TEX TS-program = lualatex
+% !TEX encoding = UTF-8 Unicode
+% !BIB TS-program = bibtex
-## Summary
+\documentclass[landscape]{bookshelf}
+\begin{document}
+\nocite{*}
+\bibliography{sample}
+\bibliographystyle{bookshelf}
+\end{document}
+```
-The _bookshelf_ package uses _biblatex_ and _biber_ to turn a BiBTeX
-bibliography file into a randomly-coloured, randomly-sized shelf of
-books, with the title and author in a randomly-chosen typeface. The
-image (converted to JPEG from PDF) can then be used as a background in
-_Zoom_, _Teams_, _WhatsApp_ etc video calls. It requires a little
-preliminary work with the supplied script to set up a list of all your
-fonts, a list of colors, and a list of the BiBTeX entry names in your
-`.bib` file, but otherwise should work on any modern TeX distribution.
+``` shell
+luaotfload-tool --update --force
+bookshelf-listallfonts > allfonts
+bookshelf-mkfontsel allfonts
+lualatex spines
+bibtex spines
+lualatex spines
+```
-![Image created from the author's own files](http://latex.silmaril.ie/packages/bookshelf/myshelf.jpg)
+## License
+LPPL 1.3c
-## Automated installation
+## Changes
-If this class is distributed from CTAN, it should be in a zip file which
-allows it to be installed automatically by the TeX Live Manager (tlmgr)
-and similar automated installers.
-
-If you are using automated LaTeX package installation, no further action
-is required: the package will be installed the first time you use it in
-a LaTeX document.
-
-If you are using the TeX Live Manager (_tlmgr_) program manually, you
-can install this package with the command:
-
-
-## TDS installation
-
-This class is also available as a TeX Directory System (TDS) zip file
-(`.tds.zip`). This is the standard directory layout for a modern TeX
-installation which enables the class to be unzipped directly into your
-Personal TeX Directory without the need to use _tlmgr_. If you haven’t
-yet created a Personal TeX Directory, see below for details of what one
-is, and how to create it.
- * You can install this class on any TDS-compliant personal system (laptop,
-desktop, workstation, table, smartphone, PDA, etc) by unzipping it
-straight into your Personal TeX Directory. This will put all the files
-into the right places, so you can start using them immediately.
- * On a shared (multiuser) system like a server, the administrator can
-unzip it into the `$TEXMFLOCAL` directory instead (see below), and run
-your TeX directory-indexing program (eg _texhash_, _mktexlsr_, etc) so
-that everyone can use it.
- * If you are using an old non-TDS-compliant system, see below under Manual
-Installation.
-
-### Your Personal TeX Directory
-
-This is a directory (folder) where you should put all local manual
-modifications (updates, additions such as new or updated classes,
-packages, and fonts) that are _not_ handled automatically by _tlmgr_.
-The name and location are fixed (for all practical purposes):
- * Apple Mac OS X
-
- ~/Library/texmf
- * Unix and GNU/Linux
-
- ~/texmf
- * MS-Windows 95/XP/NT
-
- C:\texmf
- * MS-Windows 2007 and above
-
- Computer\System\YOURNAME\texmf
-
-Create that folder now if it does not already exist. Put (or unzip) all
-additions to your system that are _not_ handled by _tlmgr_ into this
-directory, following _exactly_ the subdirectory structure that is used
-in your main TeX distribution (unzipping a TDS file does this for you).
-This is what enables LaTeX to find stuff automatically.
-
-
-> #### If you are a Windows user running _MiKTeX_
-> When you create the folder for your Personal TeX Directory, you MUST add it to _MiKTeX_ ’s list of supported folders. Run the _MiKTeX Maintenance/Settings_ program, select the `Roots` tab, and add the folder. You only have to do this once.
-> > Each time you add or remove software in your Personal TeX Directory, you MUST then click on the `Update FNDB` button in the `General` tab of the _MiKTeX Maintenance/Settings_ program, otherwise _MiKTeX_ will not find them and nothing will work!
->
-
-Unix (Mac and GNU/Linux) users do not need to (indeed, should not) run
-their filename database indexer program (_mktexlsr_ or _texhash_) for
-files put into a personal TeX directory.
-
-
-## Installation on shared systems
-
-On multi-user systems (Unix-based), identify the shared local directory
-tree with the command
-
- kpsewhich -expand-var '$TEXMFLOCAL'
-
-This will give you the location of the shared `texmf` directory into
-which you must unzip these files.
-
-Do not forget to run your local TeX filename database indexer program
-(_texhash_ or _mktexlsr_) after installation, otherwise the files will
-not be found by LaTeX and nothing will work!
-
-
-## Manual installation (non-TDS systems)
-
-To install this software manually, download and unzip the _non-_TDS zip
-file into a temporary directory and move the class and/or package
-file[s] and other files to the proper locations where LaTeX will find
-them on your system. This is referred to in some documentation as “the
-`TEXINPUTS` directoryâ€, although it may be called something else on your
-system.
-
-_It is your responsibility to know where this location is._ See the
-question in the TeX FAQ at https://texfaq.org/FAQ-inst-wlcf.html for
-more information. If you do not know, or cannot find it, or do not have
-access to it, your TeX system may be out of date and may need replacing.
-
-
-
-## Online systems and “last resort†systems
-
-Some online LaTeX systems use CTAN, so a package from there should be
-available on demand. For other online LaTeX systems where you do not
-have access to the file system, unzip the _non-_TDS zip file into a
-temporary directory and upload the files to the online system. Follow
-their instructions for where to put them.
-
-In an emergency, or as a last resort on unmanageable systems, it is
-possible simply to put the class and/or package file[s] into your
-current working directory (the same folder as your `.tex` file[s]).
-
-While this may work, it is not supported, and may lead to other
-resources (packages, fonts, images etc) not being found.
-
-
-## Usage
-
-Include the line shown below in the Preamble of your LaTeX document; a
-`\documentclass` line should be at the top; a `\usepackage` command
-normally goes anywhere in the Preamble:
-
- \documentclass[options]{bookshelf}
-
-(similarly for other classes or packages if more than one is supplied
-with this package). Read the documentation for the options available, if
-any. The documentation is distributed as a PDF document in the zip file.
-You can also regenerate it by typesetting the `bookshelf.dtx` file with
-`xelatex` (and `biber` and _makeindex_) in the normal way.
-
-
-## Bugs and TODO
-
-No outstanding reported bugs at the time of this version.
-
-For TODO items, see the PDF documentation.
-
-
-## Copyright
-
-The following statement is included in the source code:
-
- Transformed from bookshelf.xml by ClassPack db2dtx.xsl
- version 1.19 (2020-05-19) on Saturday 23 May 2020 at 23:33:08
-
- bookshelf.cls is copyright © 2020 by Peter Flynn <peter@silmaril.ie>
-
- This work may be distributed and/or modified under the
- conditions of the LaTeX Project Public License, either
- version 1.3 of this license or (at your option) any later
- version. The latest version of this license is in:
-
- http://www.latex-project.org/lppl.txt
-
- and version 1.3 or later is part of all distributions of
- LaTeX version 2005/12/01 or later.
-
- This work has the LPPL maintenance status ‘maintained’.
-
- The current maintainer of this work is Peter Flynn <peter@silmaril.ie>
-
- This work consists of the files bookshelf.dtx and bookshelf.ins,
- the derived file ,
- and any other ancillary files listed in the MANIFEST.
-
+* Version 1.0 2024-10-05. New maintainer. Rewrite of scripts. Multilanguage processing. Important change: now the package is LuaLaTeX only
+
+* Version 1.1 2024-10-08. Scripts now support standard switches --help, --man, --version
+* Version 1.2 2024-10-09. Renamed svgnam.tex to bookshelf-svgnam.tex as requested by TeXLive maintainers
diff --git a/graphics/bookshelf/VERSION b/graphics/bookshelf/VERSION
deleted file mode 100644
index 3bb4be8764..0000000000
--- a/graphics/bookshelf/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-Date of most recent change is 2020-05-24
diff --git a/graphics/bookshelf/bookshelf-svgnam.tex b/graphics/bookshelf/bookshelf-svgnam.tex
new file mode 100644
index 0000000000..4cd6f9f4a8
--- /dev/null
+++ b/graphics/bookshelf/bookshelf-svgnam.tex
@@ -0,0 +1,313 @@
+%
+% This is svgnam.tex file generated from svgnam.def by the script
+% ./svgnam.sh > svgnam.tex
+%
+\newcommand{\SIL@svgcolname}[1]{\ifcase#1
+AliceBlue\or
+AntiqueWhite\or
+Aqua\or
+Aquamarine\or
+Azure\or
+Beige\or
+Bisque\or
+Black\or
+BlanchedAlmond\or
+Blue\or
+BlueViolet\or
+Brown\or
+BurlyWood\or
+CadetBlue\or
+Chartreuse\or
+Chocolate\or
+Coral\or
+CornflowerBlue\or
+Cornsilk\or
+Crimson\or
+Cyan\or
+DarkBlue\or
+DarkCyan\or
+DarkGoldenrod\or
+DarkGray\or
+DarkGreen\or
+DarkGrey\or
+DarkKhaki\or
+DarkMagenta\or
+DarkOliveGreen\or
+DarkOrange\or
+DarkOrchid\or
+DarkRed\or
+DarkSalmon\or
+DarkSeaGreen\or
+DarkSlateBlue\or
+DarkSlateGray\or
+DarkSlateGrey\or
+DarkTurquoise\or
+DarkViolet\or
+DeepPink\or
+DeepSkyBlue\or
+DimGray\or
+DimGrey\or
+DodgerBlue\or
+FireBrick\or
+FloralWhite\or
+ForestGreen\or
+Fuchsia\or
+Gainsboro\or
+GhostWhite\or
+Gold\or
+Goldenrod\or
+Gray\or
+Green\or
+GreenYellow\or
+Grey\or
+Honeydew\or
+HotPink\or
+IndianRed\or
+Indigo\or
+Ivory\or
+Khaki\or
+Lavender\or
+LavenderBlush\or
+LawnGreen\or
+LemonChiffon\or
+LightBlue\or
+LightCoral\or
+LightCyan\or
+LightGoldenrod\or
+LightGoldenrodYellow\or
+LightGray\or
+LightGreen\or
+LightGrey\or
+LightPink\or
+LightSalmon\or
+LightSeaGreen\or
+LightSkyBlue\or
+LightSlateBlue\or
+LightSlateGray\or
+LightSlateGrey\or
+LightSteelBlue\or
+LightYellow\or
+Lime\or
+LimeGreen\or
+Linen\or
+Magenta\or
+Maroon\or
+MediumAquamarine\or
+MediumBlue\or
+MediumOrchid\or
+MediumPurple\or
+MediumSeaGreen\or
+MediumSlateBlue\or
+MediumSpringGreen\or
+MediumTurquoise\or
+MediumVioletRed\or
+MidnightBlue\or
+MintCream\or
+MistyRose\or
+Moccasin\or
+NavajoWhite\or
+Navy\or
+NavyBlue\or
+OldLace\or
+Olive\or
+OliveDrab\or
+Orange\or
+OrangeRed\or
+Orchid\or
+PaleGoldenrod\or
+PaleGreen\or
+PaleTurquoise\or
+PaleVioletRed\or
+PapayaWhip\or
+PeachPuff\or
+Peru\or
+Pink\or
+Plum\or
+PowderBlue\or
+Purple\or
+Red\or
+RosyBrown\or
+RoyalBlue\or
+SaddleBrown\or
+Salmon\or
+SandyBrown\or
+SeaGreen\or
+Seashell\or
+Sienna\or
+Silver\or
+SkyBlue\or
+SlateBlue\or
+SlateGray\or
+SlateGrey\or
+Snow\or
+SpringGreen\or
+SteelBlue\or
+Tan\or
+Teal\or
+Thistle\or
+Tomato\or
+Turquoise\or
+Violet\or
+VioletRed\or
+Wheat\or
+White\or
+WhiteSmoke\or
+Yellow\or
+YellowGreen\or
+Black\fi}
+
+\newcommand{\SIL@svgcolval}[1]{\ifcase#1
+0.96633\or
+0.929923\or
+0.871206\or
+0.893092\or
+0.985874\or
+0.953778\or
+0.913011\or
+0\or
+0.932641\or
+0.260768\or
+0.379297\or
+0.349085\or
+0.74815\or
+0.570779\or
+0.866469\or
+0.529816\or
+0.647294\or
+0.576475\or
+0.971909\or
+0.433686\or
+0.871206\or
+0.142119\or
+0.474807\or
+0.561714\or
+0.664\or
+0.325856\or
+0.664\or
+0.705841\or
+0.302953\or
+0.388309\or
+0.670841\or
+0.396012\or
+0.26755\or
+0.675762\or
+0.686451\or
+0.281846\or
+0.284935\or
+0.284935\or
+0.704877\or
+0.35734\or
+0.517671\or
+0.675787\or
+0.41\or
+0.41\or
+0.54021\or
+0.361443\or
+0.982202\or
+0.458943\or
+0.555878\or
+0.864\or
+0.97393\or
+0.856285\or
+0.683662\or
+0.5\or
+0.415632\or
+0.897087\or
+0.5\or
+0.981852\or
+0.625264\or
+0.504136\or
+0.19626\or
+0.996035\or
+0.890633\or
+0.905664\or
+0.956157\or
+0.857112\or
+0.973957\or
+0.814506\or
+0.634585\or
+0.972435\or
+0.864229\or
+0.970187\or
+0.828\or
+0.835978\or
+0.828\or
+0.793828\or
+0.727452\or
+0.608906\or
+0.764286\or
+0.516182\or
+0.522335\or
+0.522335\or
+0.758883\or
+0.9923\or
+0.831264\or
+0.677159\or
+0.947156\or
+0.555878\or
+0.245459\or
+0.718037\or
+0.209658\or
+0.501212\or
+0.513837\or
+0.604404\or
+0.480155\or
+0.829725\or
+0.726351\or
+0.412174\or
+0.148714\or
+0.989148\or
+0.920006\or
+0.909698\or
+0.891886\or
+0.130384\or
+0.130384\or
+0.96388\or
+0.482701\or
+0.507329\or
+0.728803\or
+0.539791\or
+0.598277\or
+0.901054\or
+0.883282\or
+0.87941\or
+0.578431\or
+0.945407\or
+0.88424\or
+0.58891\or
+0.821492\or
+0.710864\or
+0.839601\or
+0.277939\or
+0.490918\or
+0.607101\or
+0.430078\or
+0.349771\or
+0.646416\or
+0.718648\or
+0.470014\or
+0.967932\or
+0.40977\or
+0.752\or
+0.759198\or
+0.413618\or
+0.491035\or
+0.491035\or
+0.984857\or
+0.841347\or
+0.481407\or
+0.726393\or
+0.435603\or
+0.781595\or
+0.592817\or
+0.771583\or
+0.669428\or
+0.43929\or
+0.882294\or
+1\or
+0.96\or
+0.965401\or
+0.732944\or
+0\fi}
+
+\setcounter{SIL@maxcolno}{151}
diff --git a/graphics/bookshelf/bookshelf.bst b/graphics/bookshelf/bookshelf.bst
new file mode 100644
index 0000000000..b3641bec86
--- /dev/null
+++ b/graphics/bookshelf/bookshelf.bst
@@ -0,0 +1,55 @@
+%%%
+%%% Create a list of commands from bibtex entries.
+%%% Each command is \makebook{author}{title}
+%%%
+
+ENTRY {
+ author
+ title
+ }{}{}
+
+INTEGERS { nameptr namesleft numnames }
+
+STRINGS { s }
+
+FUNCTION {preamble} {}
+
+FUNCTION { format.names }
+{
+
+ 's :=
+ s num.names$ 'numnames :=
+ numnames #3 >
+ {#3 'namesleft :=}
+ {numnames 'namesleft :=}
+ if$
+ #1 'nameptr :=
+ { namesleft }
+ {
+ s nameptr "{ff{ } }{vv{ } }{ll{ }}{, jj}" format.name$
+ namesleft #1 >
+ { " \& " *}
+ {}
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ *
+ }
+ while$
+ numnames #3 >
+ {" et~al" *}
+ {}
+ if$
+}
+
+FUNCTION {book} {
+ "\makebook{" author format.names "}{" * title * "}%" * write$
+ newline$
+}
+
+FUNCTION {misc} {book}
+
+FUNCTION { default.type } { book }
+
+READ
+ITERATE{call.type$}
diff --git a/graphics/bookshelf/bookshelf.dtx b/graphics/bookshelf/bookshelf.dtx
index 8abaee3d6d..c0e6c41116 100644
--- a/graphics/bookshelf/bookshelf.dtx
+++ b/graphics/bookshelf/bookshelf.dtx
@@ -1,19 +1,18 @@
% \iffalse meta-comment
%
-% Transformed from bookshelf.xml by ClassPack db2dtx.xsl
-% version 1.19 (2020-05-19) on Saturday 23 May 2020 at 23:33:08
%
-% bookshelf.dtx is copyright © 2020 by Peter Flynn <peter@silmaril.ie>
+% bookshelf.dtx is copyright © 2020-2024 by Peter Flynn
+% <peter@silmaril.ie> and Boris Veytsman <borisv@lk.net>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
-% version 1.3 of this license or (at your option) any later
+% version 1.3c of this license or (at your option) any later
% version. The latest version of this license is in:
%
% http://www.latex-project.org/lppl.txt
%
-% and version 1.3 or later is part of all distributions of
-% LaTeX version 2005/12/01 or later.
+% and version 1.3c or later is part of all distributions of
+% LaTeX version 2008-06-01 or later.
%
% This work has the LPPL maintenance status ‘maintained’.
%
@@ -29,8 +28,10 @@
\ProvidesFile{bookshelf.dtx}
%</driver>
%<class>\NeedsTeXFormat{LaTeX2e}[2017/04/15]
-%<class>\ProvidesClass{bookshelf}[2020/05/24 v0.5
-%<class> Turn your bibliography into a bookshelf image]
+%<class>\ProvidesClass{bookshelf}
+%<*class>
+[2024/10/09 v1.2 Turn your bibliography into a bookshelf image]
+%</class>
%<*driver>
\RequirePackage{fix-cm}% included by default.
\PassOptionsToPackage{svgnames}{xcolor}% xcolor/dox/hyperref implied
@@ -38,7 +39,8 @@
%%
%% Packages added for documentation
%%
-\usepackage{dox}% used by default. (0)%
+\usepackage[noindex]{dox}% used by default. (0)%
+
\makeatletter
\doxitem[idxtype=attribute]{Attribute}{CPK@attribute}{attributes}
\makeatother
@@ -152,21 +154,6 @@
\usepackage{luximono}% requested by author (16)%
\usepackage{mflogo}% used by default. (36)%
\usepackage[british]{babel}% used by default. (41)%
-\usepackage[backend=biber,doi=true,
- isbn=true,url=true,uniquename=false,style=apa]{biblatex}% bibliography/@arch=biblatex detected. (42)%
- \makeatletter
- \AtBeginDocument{%
- \setlength{\bibitemsep}{1ex}%
- \setlength{\bibnamesep}{1.5\itemsep}%
- \defbibheading{shortbib}[References]%
- {\section{#1}}}
- \@ifpackagewith{babel}{british}{%
- \DeclareLanguageMapping{british}%
- {british-apa}}{\relax}
- \makeatother
- \makeatletter
- \providetoggle{blx@skipbiblist}
- \makeatother
\usepackage{calc}% used by default. (50)%
\makeatletter
{\scriptsize
@@ -209,7 +196,9 @@
\setcounter{dbltopnumber}{9}
\usepackage[level]{fmtcount}% xref/@linkendâžlistitem/xml:id detected. (71)%
\usepackage[a4paper,left=30mm,top=25mm,
- textwidth=150mm,textheight=225mm,headheight=15pt]{geometry}% used by default. (72)%
+ textwidth=150mm,textheight=225mm,headheight=15pt]{geometry}% used by
+ % default. (72)%
+\usepackage{biblatex}
\usepackage{hypdoc}% requested by author (78)%
\hypersetup{linkcolor=DarkBlue,urlcolor=Blue,citecolor=Red}
\ExecuteBibliographyOptions{maxcitenames=1}
@@ -468,7 +457,7 @@
%</driver>
% \fi
%
-% \CheckSum{718}
+% \CheckSum{0}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -485,7 +474,8 @@
% Right bracket \] Circumflex \^ Underscore \_
% Grave accent \` Left brace \{ Vertical bar \|
% Right brace \} Tilde \~}
-%
+%
+% \changes{v1.0}{2024/10/02}{New maintainer. Starting rewriting}
% \changes{v0.5}{2020/05/24}{Finished initial testing: Replaced hyperref with hypdoc to avoid makeindex bug.}
% \changes{v0.4}{2020/05/19}{Completed documentation: 1) Updated note on bug in biber when processing sgml.bib; 2) Removed sgml.bib as example until problems are resolved; 3) Backtracked on attempt to use the monographic title for articles, chapters, etc; 4) Revised notes on production.}
% \changes{v0.3}{2020/05/14}{Finished first pass on documentation: 1) Done preliminary testing; 2) Script adapted for Mac OS X.}
@@ -575,17 +565,18 @@
% \setcounter{tocdepth}{5}
% \setcounter{secnumdepth}{5}
% \makeatletter
-% \def\@@doxdescribe#1#2{\endgroup \ifdox@noprint\else\marginpar{\raggedleft \textcolor{DarkRed}{\@nameuse{PrintDescribe#1}{#2}}}\fi \ifdox@noindex\else\@nameuse{Special#1Index}{#2}\fi \endgroup\@esphack\ignorespaces}
% \makeatother
%
-% \def\fileversion{0.5}
-% \def\filedate{2020/05/24}
-% \title{The \textsf{bookshelf} \LaTeXe\ document class\thanks{%
+% \GetFileInfo{bookshelf.dtx}
+% \title{The \textsf{bookshelf} document class\thanks{%
% This document corresponds to \textsf{bookshelf}
-% \textit{v.}\ \fileversion $\beta$, dated \filedate.}
+% \fileversion, dated \filedate.}
% \\[1em]\Large
% Turn your bibliography into a bookshelf image}
-% \author{Peter Flynn\\\normalsize Silmaril Consultants\\[-.25ex]\normalsize Instant Textual Gratification Division\\\normalsize(\url{peter@silmaril.ie})}
+% \author{Peter Flynn\\\normalsize Silmaril
+% Consultants\\[-.25ex]\normalsize Instant Textual Gratification
+% Division\\\normalsize(\url{peter@silmaril.ie})\\
+% Boris Veytsman\\\normalsize(\url{borisv@lk.net})}
% \maketitle
% \renewcommand{\abstractname}{Summary}\thispagestyle{empty}
% \begin{abstract}
@@ -593,8 +584,7 @@
% \advance\parskip by 0pt plus 2pt
% \parindent=0pt% \noindent
% The \textsf{bookshelf} package uses
-% \textsf{biblatex} and
-% \emph{biber} to turn a \BibTeX{}
+% your \BibTeX{}
% bibliography file into a randomly-coloured, randomly-sized
% shelf of books, with the title and author in a randomly-chosen
% typeface. The image (converted to {\smaller JPEG} from
@@ -602,12 +592,11 @@
% \emph{Zoom},
% \emph{Teams},
% \emph{WhatsApp} etc video calls. It
-% requires a little preliminary work with the supplied script to
-% set up a list of all your fonts, a list of colors, and a list
-% of the \BibTeX{} entry names in your {\ttfamily{}.bib}
-% file, but otherwise should work on any modern \TeX{}
+% requires a little preliminary work with the supplied scripts to
+% set up a list of your fonts and their stylistic variants,
+% but otherwise should work on any modern \TeX{}
% distribution.\par
-% \par\centering\includegraphics[width=.666\columnwidth]{myshelf.jpg}
+% \par\centering\includegraphics[width=.55\columnwidth, page=4]{spines.pdf}
% \end{abstract}
% \clearpage
% \tableofcontents
@@ -624,8 +613,46 @@
% RFC 2119 \parencite{rfc2119}.\par
% When shown in normal type, these words keep their conventional
% contextual degree of meaning.\par
+% \clearpage
+% \section*{Foreword by BV}
+% \addcontentsline{toc}{section}{Foreword by BV}
+% I have spent many hours admiring colorful bookcases produced by
+% Peter Flynn's \emph{bookshelf} package. They helped me to survive
+% many boring remote meetings during the {\smaller COVID} pandemic and its
+% aftermath. However, since my library had books in different
+% languages, I wanted to showcase them as well. I started to write
+% patches for the package, and at some point Peter kindly decided to
+% transfer the maintenance to me.
+%
+% I described the project at {\smaller
+% TUG}~2024~\parencite{Bookshelf2024}. At present the following
+% changes has been implemented:
+% \begin{enumerate}
+% \item The package now can typeset book spines in any language. It
+% automatically selects a random font capable to typeset a given
+% spine.
+% \item The new |bookshelf-listallfonts| script lists all system and \TeX\
+% fonts with ``interesting'' variants, while the new |bookshelf-mkfontsel|
+% script populates the |fontsel| directory.
+% \item The package now understands fonts in OTF, TTF
+% \item The switch from Biber to Bib\TeX\ made the processing much
+% faster, and eliminated the need for the separate |entries.tex| file:
+% now the |.bbl| file has the right format.
+% \item The switch from \emph{fontspec} to primitive font loading also
+% made the processing faster---and increased the number of fonts we
+% can display.
+% \end{enumerate}
+%
+% There is, however, a price for these improvements: now the package
+% is Lua\LaTeX-only.
+%
+% \bigskip
+% \emph{Boris Veytsman, October 2024}
% \clearpage
+% \addcontentsline{toc}{section}{Latest changes}
% \section*{Latest changes}
+% \subsection*{v.1.0(2025/10/02)}
+% New maintainer. Several rewrites.
% \subsection*{v.0.5 (2020-05-24)}
% \paragraph*{Finished initial testing}
% \begin{itemize}
@@ -656,7 +683,6 @@
% \item Done preliminary testing\par
% \item Script adapted for Mac OS X\par
% \end{itemize}
-% See p.\thinspace\pageref{changehistory} for earlier changes.
% \subsection*{Acknowledgments}
% Thanks to many people for the original
% suggestion; and to Isabel Yorke, Bethan Tovey-Walsh,
@@ -665,37 +691,36 @@
% testing comments.\par
% \clearpage
% \section{Documentation}
-% During the era of the
-% {\smaller COVID-19} lockdown, the popularity
-% of group video messaging grew rapidly, both for
-% business and domestic use. As people sought for what
-% they believed to be more representative backgrounds
-% than a messy kitchen, an untidy workroom, or a
-% sterile blank wall, a well-populated bookshelf was a
-% frequent choice.\par
-% This package is for those who cannot use (or
-% don't have, or don't want to use) such a bookshelf,
-% but can still lay their hands on a bibliography or
-% reference list in \BibTeX{} format — perhaps from a
-% recent or long-forgotten thesis, book, article, or
-% other document.\par
+% During the era of the {\smaller COVID-19} lockdown, the popularity
+% of group video messaging grew rapidly, both for business and
+% domestic use. As people sought for what they believed to be more
+% representative backgrounds than a messy kitchen, an untidy workroom,
+% or a sterile blank wall, a well-populated bookshelf was a frequent
+% choice.\par
+% This package is for those who cannot use (or don't have, or don't
+% want to use) such a bookshelf, but can still lay their hands on a
+% bibliography or reference list in \BibTeX{} format — perhaps from a
+% recent or long-forgotten thesis, book, article, or other
+% document.\par
+% You also may want to showcase your electronic library. Many
+% programs like \emph{Calibre}~\parencite{Calibre} can export the list
+% of your electronic books in Bib\TeX\ format. This is how the sample
+% library |spines.pdf| was created.\par
+% Another important use of this package is to provide a diversion
+% during long boring remote meetings. Try to guess the font the given
+% spine was typeset with---and use these tiny numbers under the books
+% to check your knowledge!
% \par\begingroup
% \fboxsep1em\centering
% \fbox{\begin{minipage}{0.8\columnwidth}\sffamily
% \raggedright\parindent0pt
% \parskip=.5\baselineskip
-% \subsubsection*{\sffamily \XeLaTeX{} and \textsf{biblatex} and
-% \emph{biber}}
-% To avoid problems with accented and other
+% \subsubsection*{\sffamily Lua\LaTeX{}}
+% To avoid problems with accented
% characters, and to make it easier to maintain,
-% this document class uses only \XeLaTeX{} and
-% \textsf{biblatex} and
-% \emph{biber}.\par
+% this document class uses only Lua\LaTeX.\par
% It will not work with the
-% \emph{pdflatex} or
-% \emph{bibtex} programs, and it does not
-% use the {\ttfamily{}.bst} files of old
-% \BibTeX{}.\par
+% \emph{pdflatex} or \XeTeX.\par
% \end{minipage}}\par\endgroup
% This is a work-in-progress: there are bugs (see \vref{bugs}).\par
% \subsection{What the package does}
@@ -712,40 +737,25 @@
% line.\par
% \subsection{Preparation}
% To get things ready for this, you need to install this
-% document class, and provide the following files.\par
+% document class, and provide the following data:
% \begin{enumerate}
-% \item Your \BibTeX{} file;
-% \item A list of all the entry values;
-% \item A list of all your usable text fonts;
-% \item A command defining how many such fonts;
+% \item The list of book as a \BibTeX{} file.
+% \item A list of all your usable text fonts and the total number of
+% them.
% \item A list of all the colors to choose from.
% \end{enumerate}
% These are explained in more detail in the subsections
% below.\par
-% All but the first of these can be generated by the
-% supplied shell script {\ttfamily{}prepdata.sh}. This
-% works on UNIX/GNU Linux and on Apple Mac OS X, and may work
-% in CygWin, but needs more work for plain Windows.\par
% \subsubsection{Your \BibTeX{} file}
% Your \BibTeX{} ({\ttfamily{}.bib}) file,
% suitable for use with \emph{biber}
% rather than \emph{bibtex}.\par
-% Old \BibTeX{} files will work, but possibly not
-% optimally: if you want to update them, see \vref{bibchanges} for what to edit; but this is not
-% needed for this class.\par
-% One thing that may help is to replace all the
+% You may need to replace all the
% old-style symbolic notation accented characters like
% \verb|{\"a}| for
% `ä' and
% \verb|{\l}| for
-% `Å‚'. Not only is the symbolic
-% notation no longer needed because \XeLaTeX{} and the
-% \emph{biber} program handle
-% {\smaller UTF-8} characters, which the old
-% \emph{bibtex} program doesn't; the
-% discipline of replacing helps to reduce the problem of
-% unmatched curly braces, which is one of the biggest
-% sources of errors in \BibTeX{} files.\par
+% `Å‚'. \par
% If you have a bibliography in
% \emph{EndNote},
% \emph{Mendeley},
@@ -758,44 +768,35 @@
% converted to \BibTeX{} by opening it in
% \emph{JabRef} and saving it
% as \BibTeX{}.\par
-% \subsubsection{Entry values}
-% A list of all the entry values from your \BibTeX{} file
-% (the unique names immediately after the document type),
-% each given as the argument to a
-% \verb|\makebook}{...}| command in a file called
-% {\ttfamily{}entries.tex}.\par
% \subsubsection{Font file list}\label{fontfiles}
-% A set of 1–line files in a subdirectory called
-% {\ttfamily{}fontsel} representing of all the
-% usable text fonts on your system that you wish to use;
-% that is, excluding broken or partial fonts, symbols, math,
-% non-Latin characters or alphabets, and display or non-text
-% fonts.\par
+% A set of 2–line files in a subdirectory called
+% |fontsel| representing of all the
+% usable text fonts on your system.\par
% Each file {\sffamily {\smaller MUST}} be
% numbered sequentially in its name (eg
% {\ttfamily{}1.tex}, {\ttfamily{}2.tex},
% {\ttfamily{}3.tex}, etc) and
-% {\sffamily {\smaller MUST}} contain a
-% \verb|\newfontface{SILmfont}{...}| command for
-% the font name \emph{and} a definition of its
-% name in a \verb|\SILmfontname{...}| command
-% (see the examples generated by the
-% {\ttfamily{}prepdata.sh} script). Be aware that
-% many fonts on your system may not be suitable for setting
-% normal text: see the comments in the script\par
-% These files are entirely dependent on your system
-% because everyone has a different set of fonts.\par
+% {\sffamily {\smaller MUST}} contain a |\font| command and define
+% the name of the font, for example
+% \begin{verbatim}
+% \font\SILmfont={[/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+swsh}\SILmfont
+% \def\SILmfontname{Junicode SmCond Medium Italic; Swash}%
+% \end{verbatim}
+% This list can be created using the scripts |bookshelf-listallfonts| and
+% |bookshelf-mkfontsel|, see~\vref{sec:scripts}.
% \subsubsection{Maximum number of fonts}
% A file called {\ttfamily{}pickfont.tex}
% containing a
% \verb|\setcounter{SIL@maxfont}{...}| command to
% set the total number of the fonts which are represented in
% the {\ttfamily{}fontsel} subdirectory above\par
+% This file can be created using the scripts |bookshelf-listallfonts| and
+% |bookshelf-mkfontsel|, see~\vref{sec:scripts}.
% \subsubsection{List of colors}
% A list of all the colors represented by the
% {\smaller SVG} palette used by the
-% \textsf{xcolor} package: the file created by
-% the script is called {\ttfamily{}svgnam.tex}.
+% \textsf{xcolor} package: the file is called
+% called {\ttfamily{}bookshelf-svgnam.tex}.
% This contains three definitions:\par
% \begin{enumerate}
% \item the command {\ttfamily{}\textbackslash{}SIL@svgcolname}
@@ -809,74 +810,72 @@
% \item the counter {\ttfamily{}SIL@maxcolno} which holds
% the number of colors available.\par
% \end{enumerate}
+% This file is included in the distribution.
+%
+% In the previous versions of the ditribution it was created with the
+% from |svgnam.def| database. The script |svgnam.sh| is retained in
+% the distribution and can be used to recreate the file.
+%
% \subsection{Producing your bookshelf}
-% This class comes with a file
-% {\ttfamily{}test.tex} which you can use to test your
-% file of references. It is initially set just to make the
-% {\ttfamily{}test.aux} file that
-% \emph{biber} needs to create your
-% {\ttfamily{}test.bbl} bibliography file; that is, it
-% will \emph{not} try to run the shell script
-% \emph{or} to create a bookshelf the first time
-% round, until everything else is ready.\par
+%
+% \subsubsection{Producing the list of fonts}
+% \label{sec:scripts}
+%
+% Each system has its own fonts installed, so you need to create the
+% list of fonts installed on \emph{your} system. It is done in three
+% steps.
% \begin{enumerate}
-% \item Run the shell script with your
-% {\ttfamily{}.bib} filename as the argument,
-% eg;
-% \iffalse
-%<*ignore>
-% \fi
-\begin{lstlisting}[language={[LaTeX]TeX}]
-$ ./prepdata.sh mythesis.bib
-\end{lstlisting}
-% \iffalse
-%</ignore>
-% \fi
-% \item Edit the {\ttfamily{}test.tex} file and
-% change the name of the {\ttfamily{}.bib} file in
-% the {\ttfamily{}\textbackslash{}addbibresource} command to the
-% name of your own file\par
-% Leave the two lines {\ttfamily{}\textbackslash{}immediate} and
-% {\ttfamily{}\textbackslash{}input} commented out for the
-% moment;
-% \item Delete any {\ttfamily{}test.aux} or
-% {\ttfamily{}test.bbl} files in the directory in
-% which you are doing this;
-% \item Typeset the test file with \XeLaTeX{}. You should get
-% three messages:\par
-% \iffalse
-%<*ignore>
-% \fi
-\begin{lstlisting}[language={[LaTeX]TeX}]
-LaTeX Warning: Empty bibliography on input line 12.
-LaTeX Warning: There were undefined references.
-Package biblatex Warning: Please (re)run Biber on the file:
-(biblatex) test
-(biblatex) and rerun LaTeX afterwards.
-\end{lstlisting}
-% \iffalse
-%</ignore>
-% \fi
-% \item Process the test file with
-% \emph{biber}
-% (\emph{not} \emph{bibtex}). You will probably
-% get many warning messages: ignore them. If you get a
-% fatal error, however, you will need to find the problem
-% in your {\ttfamily{}.bib} file and fix it before
-% going any further.\par
-% See also the known bug at item~\ref{sgmlbib} in the list on p.\thinspace\pageref{sgmlbib};
-% \item Edit the test file and
-% \emph{un}comment the line starting
-% {\ttfamily{}\textbackslash{}input}, save the file, and retypeset
-% it twice.
+% \item Update the database of fonts known to Lua\TeX:
+% \begin{verbatim}
+% luaotfload-tool --update --force
+% \end{verbatim}
+% The key |--force| forces the update even if Lua\TeX\ thinks it is
+% not necessary: sometimes it is mistaken.
+% \item Create the list of the usable fonts and font variants:
+% \begin{verbatim}
+% bookshelf-listallfonts [options] > allfonts
+% \end{verbatim}
+% The script lists all fonts in {\smaller OTF, TTF} or {\smaller TTC}
+% format, known to Lua\LaTeX. For scripts in {\smaller OTF} and
+% {\smaller TTF} format it looks at the ``interesting'' Open Type
+% features like swash and stylistic variant and lists them too. This
+% means that the bookshelf might have spines typeset in the different
+% variants of the same font---they are considered different fonts!
+% You can change the list of feaures using the key |-f FEATURES_FILE|;
+% see the |doc| directory for an example. The script tries to exclude
+% broken font files; you can change the list with the key
+% |-x EXCLUDED_PATTERNS|. Again, there is an example in the |doc|
+% directory.
+% \item Create the |fontsel| directory and the file |pickfont.tex|
+% using the command
+% \begin{verbatim}
+% bookshelf-mkfontsel allfonts
+% \end{verbatim}
% \end{enumerate}
-% You should now have a {\smaller PDF} bookshelf!
-% The books are in the order in which they appear in your
-% {\ttfamily{}.bib} file because the script creates
-% the list of entries to process in that order, regardless of
-% what \emph{biblatex} or
-% \emph{biber} are configured to
-% do.\par
+%
+% \subsubsection{Driver file}
+%
+% The distribution contains the file |spines.tex|
+% \begin{verbatim}
+% % !TEX TS-program = lualatex
+% % !TEX encoding = UTF-8 Unicode
+% % !BIB TS-program = bibtex
+% \documentclass[landscape]{bookshelf}
+% \begin{document}
+% \nocite{*}
+% \bibliography{sample}
+% \bibliographystyle{bookshelf}
+% \end{document}
+% \end{verbatim}
+%
+% Change |sample| to the name of your bibliography, and typeset the
+% file using |lualatex| and | bibtex|.
+%
+% You should see your books nicely placed on the shelves. The small
+% numbers under each book are meaningful: they are the line numbers in
+% the |allfonts| file. You may use them if you play ``Guess the
+% font'' game.
+%
% \subsubsection{Options}
% The class comes set for making an
% \textbf{\texttt{a0paper}} page (1189 mm × 841 mm
@@ -893,127 +892,14 @@ Package biblatex Warning: Please (re)run Biber on the file:
% There is also a \textbf{\texttt{portrait}} option to
% produce the page in that format instead of
% landscape.\par
-% \subsection{Changes between \BibTeX{} fields and
-% \emph{biblatex}}\label{bibchanges}
-% This has been expanded from the description provided in
-% \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=33}{§2.3
-% of the online documentation for
-% \textsf{biblatex}} v3.14 (1 December
-% 2019).\par
-% This is for information only. You do not need to do any
-% of this to use the \index{bookshelf=\textsf{bookshelf} (class)}\textsf{bookshelf} document
-% class unless you encounter errors processing your
-% {\ttfamily{}.bib} file.\par
-% \begin{enumerate}
-% \item The entry type {\ttfamily{}@inbook}
-% (basically only use this where each chapter of the book
-% is written by a different author). See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=8}{§2.1.1}
-% and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=33}{§2.3.1}
-% for details.\par
-% \item Replace {\ttfamily{}school} with {\ttfamily{}institution} for theses;
-% replace {\ttfamily{}publisher} with {\ttfamily{}organization} for manuals
-% and conference sponsors;
-% and replace {\ttfamily{}address} with {\ttfamily{}location}. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2},
-% \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=32}{§2.2.5},
-% and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=34}{§2.3.4}
-% for details.\par
-% \item The handling of certain types of titles. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=35}{§2.3.5}
-% for details. Replace {\ttfamily{}journal} with
-% {\ttfamily{}journaltitle} in {\ttfamily{}@article} entries.\par
-% \item The field {\ttfamily{}series}: only
-% use it for journal series; for the main title of
-% multi-volume works use {\ttfamily{}maintitle}.
-% See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2}
-% and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=37}{§2.3.7}
-% for details.\par
-% \item The fields {\ttfamily{}year} and {\ttfamily{}month} must be
-% integers; {\ttfamily{}month} {\sffamily {\smaller MUST NOT}} be
-% alphabetic. The field {\ttfamily{}date} {\sffamily {\smaller MUST}} be an
-% {\smaller ISO} 8601 date in the format
-% {\ttfamily{}yyyy-mm-dd}. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2},
-% \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=38}{§2.3.8},
-% and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=39}{§2.3.9}
-% for details.\par
-% \item The field {\ttfamily{}edition} must
-% be an integer with no ordinal indicator or abbreviation
-% `ed'. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2}
-% for details.\par
-% \item Replace {\ttfamily{}key} with
-% {\ttfamily{}label}. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=33}{§2.3.2}
-% for details.\par
-% \end{enumerate}
-% Most of this is for creating new entries. For converting
-% \BibTeX{} files for use with
-% \emph{biblatex}, just change the field
-% names as in items 2, 3, 4, and 7; and make sure your months
-% and editions are integers.\par
+%
% \subsection{Bugs}\label{bugs}
% Some things don't yet work as they should, and
% there are some features that may or may not make
-% the final cut.\par
-% \begin{enumerate}
-% \item The shell script doesn't run on Windows
-% because I don't have any Windows. If someone
-% would write some Powershell I could include it
-% in a later version.\par
-% \item There is no conscious
-% `line'-breaking when a
-% row of books comes to the
-% {\ttfamily{}\textbackslash{}pagewidth}, and as it is
-% deliberately set
-% {\ttfamily{}\textbackslash{}raggedright} (because you
-% can't hyphenate a book and variable space
-% between books seems to be a silly idea), there
-% is no filler at the ends of lines to complete
-% the `shelf' (which is
-% in any case just a bar below each
-% book).\par
-% \item \label{sgmlbib}A test with a bibliography file from
-% Nelson Beebe's collection
-% ({\ttfamily{}sgml.bib}) generated a
-% {\ttfamily{}test.bbl} with a missing
-% closing curly brace, terminating (or rather,
-% failing to terminate) the
-% {\ttfamily{}\textbackslash{}name} command for an entry.
-% This appears to be a known bug in
-% \emph{biber} which is
-% being fixed in the version 2.15.\par
-% \item There seems to be a recurrent problem with
-% certain entries and certain fonts where the
-% length of the title is measured as 0.0pt which
-% causes an unresolvable problem for the routine
-% which assigns space and layout. Any
-% suggestions as to why this occurs are
-% welcomed.\par
-% \item The objective of the field re-expressions
-% (see \vref{fields}) was to make sure the book
-% spine for journal {\ttfamily{}@article}, {\ttfamily{}@incollection}, and
-% {\ttfamily{}@inbook} entry
-% types reflected the \emph{book}
-% or \emph{journal} title, not the
-% title of the article or chapter. This may or
-% may not be a good idea.\par
-% \item During development, it became obvious that
-% the number of fonts on many systems can be
-% very large. The
-% {\ttfamily{}prepdata.sh} script
-% currently includes the exclusions I made on
-% {\smaller UNIX}/{\smaller GNU}
-% Linux and Apple Mac {\smaller OS X} in
-% order to get a set of fonts that did not issue
-% errors (bearing in mind we are using
-% \textsf{fontspec}, so for simplicity
-% the script deals only with TrueType and
-% OpenType fonts, not Postscript Type 1 or
-% Type 3, or font packaging systems like
-% \emph{Suitcase} or True
-% Type Collections). I am not aware of any
-% easily-accessible machine-readable list or
-% {\smaller API} for identifying normal
-% text fonts by name (there are commercial
-% databases but that is outside the scope of
-% this document class).\par
-% \end{enumerate}
+% the final cut. Please report bugs at
+% \url{https://github.com/borisveytsman/bookshelf}\par
+%
+%
% \StopEventually{\label{endcode}%
% \clearpage
% \newgeometry{left=3cm}%
@@ -1237,25 +1123,6 @@ Package biblatex Warning: Please (re)run Biber on the file:
nofoot,margin=1cm]{geometry}%
% \end{macrocode}
% \end{CPK@package}
-% \begin{CPK@package}{biblatex}
-% Use \textsf{biblatex} instead of \BibTeX{};
-% \iffalse
-%% Use biblatex instead of \BibTeX{}
-% \fi
-% \begin{macrocode}
-\RequirePackage[backend=biber,style=authoryear,
- doi=true,isbn=true,url=true,uniquename=false]{biblatex}%
- \AtBeginDocument{%
- \setlength{\bibitemsep}{1ex}%
- \setlength{\bibnamesep}{1.5\itemsep}%
- \defbibheading{shortbib}[References]%
- {\section{#1}}}
- \@ifpackagewith{babel}{british}{%
- \DeclareLanguageMapping{british}%
- {british-apa}}{\relax}
- \providetoggle{blx@skipbiblist}
-% \end{macrocode}
-% \end{CPK@package}
%
% \subsection{Non-package resources}
% \iffalse
@@ -1317,7 +1184,7 @@ Package biblatex Warning: Please (re)run Biber on the file:
% \subsubsection{Color selection}\label{color}
% \begin{CPK@counter}{SIL@maxcolno}\label{counter--SIL@maxcolno}
% This value is set at the end of the file
-% {\ttfamily{}svgnam.tex}. This is the number of
+% {\ttfamily{}bookshelf-svgnam.tex}. This is the number of
% color names found by the routine in
% {\ttfamily{}prepdata.sh} which extracts the color
% names.\par
@@ -1325,16 +1192,16 @@ Package biblatex Warning: Please (re)run Biber on the file:
\newcounter{SIL@maxcolno}
% \end{macrocode}
% \end{CPK@counter}
-% \begin{CPK@file}{svgnam.tex}\label{file--svgnam.tex}
+% \begin{CPK@file}{bookshelf-svgnam.tex}\label{file--bookshelf-svgnam.tex}
% The preparatory data script
% {\ttfamily{}prepdata.sh} retrieves the colors named
% in the \textbf{\texttt{svgnames}} option to the
% \textsf{xcolor} package and instantiates them
% as a \LaTeX{} {\ttfamily{}\textbackslash{}ifcase} list in the file
-% {\ttfamily{}svgnam.tex} as the command
+% {\ttfamily{}bookshelf-svgnam.tex} as the command
% {\ttfamily{}\textbackslash{}SIL@svgcolname}.\par
% \begin{macrocode}
-\input{svgnam.tex}
+\input{bookshelf-svgnam.tex}
% \end{macrocode}
% \end{CPK@file}
% \begin{CPK@counter}{SIL@loopcount}\label{counter--SIL@loopcount}
@@ -1400,7 +1267,7 @@ Package biblatex Warning: Please (re)run Biber on the file:
% \begin{CPK@length}{\SIL@bgval}\label{length--SIL@bgval}
% The values computed by the
% {\ttfamily{}prepdata.sh} script and stored in
-% {\ttfamily{}svgnam.tex} are decimal fractions,
+% {\ttfamily{}bookshelf-svgnam.tex} are decimal fractions,
% to they need to be retrieved as lengths. This is the
% background value…\par
% \begin{macrocode}
@@ -1508,18 +1375,201 @@ Package biblatex Warning: Please (re)run Biber on the file:
\fboxsep1em\fboxrule.1pt
\pagestyle{empty}
% \end{macrocode}
+%
+% \subsubsection{Auxillary macro: fitting text in a box}
+%
+% \begin{CPK@macro}{\SIL@fittext}\label{macro--SIL@fittext}
+% For typesetting title we use an auxillary macro |\SIL@fittext|. It
+% has four parameters: the text to be typeset, the width ($W$), the
+% height $H$, and the box $W\times H$ to put the text into. We want
+% to get the maximal font size that still fits in the box.
+% Unfortunately there is a limitation on the maximal number of fonts
+% \TeX\ can handle (currently 9000 by default). Since each size
+% change counts as a new font, things can quickly go out of hand.
+% Therefore instead of scaling the font we scale the box.
+%
+% So our aim is to find the maximal scaling factor $S$ such as (1)~the
+% text is typeset in a $w\times h$ box, (2)~the text box scales to the
+% given width, $W=Sw$, (3)~the text box does not overflow the height,
+% $H\le Sh$.
+%
+% The algorithm is the following:
+% \begin{enumerate}
+% \item If the text fits in one line, we expand the box for the line
+% to occupy $W$, setting $S=W/w$.
+% \item Otherwise, we try to typeset the text in the box of horizontal
+% size $W$ ($S=1$) and calculate box height $h$. We determine how
+% much we can expand or shrink the box, setting $S=H/h$.
+% \item We typeset the text in the box of width $w=W/S$.
+% \item Due to changed line breaks its height $h$ might be higher than
+% $H/S$. In this case we start to decrease $S$ by 5\% on each step
+% and repeat typesetting until $w\le W/S$
+% \end{enumerate}
+%
+% Now, the implementation.
+%
+% First, we calculate $W$ and $H$ by stripping the pt dimension
+% \begin{macrocode}
+\def\SIL@fittext#1#2#3#4{%
+ \@tempdima=#2\relax
+ \edef\SIL@W{\strip@pt\@tempdima}%
+ \@tempdima=#3\relax
+ \edef\SIL@H{\strip@pt\@tempdima}%
+% \end{macrocode}
+% Try to set up the text in one line
+% \begin{macrocode}
+ \setbox#4=\hbox{\raggedright\noindent#1}%
+ \@tempdima=\wd#4\relax
+ \edef\SIL@w{\strip@pt\@tempdima}%
+ \ifdim#2>\@tempdima\relax
+ \FPeval\SIL@S{\SIL@W/\SIL@w}%
+ \typeout{Text fits in one line: have H=\SIL@w pt, want \SIL@W pt}%
+ \typeout{Trying S=\SIL@S}%
+ \else
+% \end{macrocode}
+% We start with the scale factor $S=1$. We add |\vskip0pt| to the
+% text to set the box depth to zero.
+% \begin{macrocode}
+ \typeout{Text does not fit in one line}%
+ \def\SIL@S{1}%
+ \FPeval\SIL@w{\SIL@W/\SIL@S}%
+ \setbox#4=\vbox{\hsize=\SIL@w pt\relax
+ \raggedright\noindent#1\vskip0pt}%
+ \@tempdima=\ht#4\relax
+ \edef\SIL@h{\strip@pt\@tempdima}%
+ \@tempdima = \SIL@S \@tempdima\relax
+ \typeout{Trying S=\SIL@S. Got H=\the\@tempdima. Want \SIL@H pt}%
+ \FPeval\SIL@S{\SIL@H/\SIL@h}%
+ \fi
+% \end{macrocode}
+% Rescaling the box for the first time. If $S$ on the previous step
+% is below 1, start again with 1.
+% \begin{macrocode}
+ \FPmax\SIL@S\SIL@S{1}%
+ \FPeval\SIL@w{\SIL@W/\SIL@S}%
+ \setbox#4=\vbox{\hsize=\SIL@w pt\relax
+ \raggedright\noindent#1\vskip0pt}%
+ \@tempdima=\ht#4\relax
+ \edef\SIL@h{\strip@pt\@tempdima}%
+ \@tempdima = \SIL@S \@tempdima\relax
+ \typeout{Trying S=\SIL@S. Got H=\the\@tempdima. Want \SIL@H pt}%
+% \end{macrocode}
+% If the text does not fit, keep reducing it by 5\% at a type
+% \begin{macrocode}
+ \ifdim\@tempdima>#3\relax
+ \loop
+ \FPeval\SIL@S{0.95*\SIL@S}%
+ \FPeval\SIL@w{\SIL@W/\SIL@S}%
+ \setbox#4=\vbox{\hsize=\SIL@w pt\relax
+ \raggedright\noindent#1\vskip0pt}%
+ \@tempdima=\ht#4\relax
+ \edef\SIL@h{\strip@pt\@tempdima}%
+ \@tempdima = \SIL@S \@tempdima\relax
+ \typeout{Trying S=\SIL@S. Got H=\the\@tempdima. Want \SIL@H pt}%
+ \ifdim\@tempdima>#3\repeat
+ \fi
+% \end{macrocode}
+% And the final typesetting
+% \begin{macrocode}
+ \setbox#4=\vbox to #3{\hsize=#2\relax
+ \vfill
+ \noindent
+ \scalebox{\SIL@S}{\vbox{\hsize=\SIL@w pt\relax
+ \raggedright\noindent#1\vskip0pt}}%
+ \vfill}%
+}
+% \end{macrocode}
+%
+% \end{CPK@macro}
+%
+%
+% \subsubsection{Selecting the font for the book}\label{fontsel}
+%
+% In a multilingual library some books can be typeset only in specific
+% fonts. Here we randomly select a font to typeset the given book.
+%
+% We define a macro that checks whether the given string can be
+% typeset in the font just defined by fontspec.
+%
+% We write the program in expl3 syntax because it has nice mapping
+% subroutines and becasue fontspec internal variables are in expl3.
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+% An auxillary routine checking whether the character can be typeset
+% with the current font. Copied from fontspec internals
+% \begin{macrocode}
+\prg_new_conditional:Nnn \__SIL_primitive_font_glyph_if_exists:n {TF,F}
+ {
+ \tex_iffontchar:D \SILmfont `#1 \scan_stop:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+% \end{macrocode}
+% And the document command
+% \begin{macrocode}
+\prg_new_conditional:Nnn \__SIL_can_typeset:n {TF}
+ {
+ \typeout{Trying ~ to ~ typeset ~ #1}
+ \bool_set_true:N \l_tmpa_bool
+ \str_map_inline:nn {#1} {
+ \__SIL_primitive_font_glyph_if_exists:nTF {##1} {}{
+ \bool_set_false:N \l_tmpa_bool
+ \typeout{Cannot ~ typeset ~ ##1}
+ \str_map_break:
+ }
+ }
+ \bool_if:nTF \l_tmpa_bool {\prg_return_true:} {\prg_return_false:}
+}
+
+\cs_generate_variant:Nn \__SIL_can_typeset:nTF {x}
+
+\NewDocumentCommand\CanTypesetTF { m m m}{
+ \__SIL_can_typeset:xTF{#1}{#2}{#3}
+}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% We define some counters and flags for the font selection
+% \begin{macrocode}
+\def\SIL@maxfonttries{100}
+\newif\ifSIL@fontfound
+% \end{macrocode}
+%
+%
+% Another twist is that we cannot have too many fonts used. Therefore
+% we add all fontsel files to a stack, and after having
+% 2100 of them, we reuse opened files. Again, it is easy to do in
+% expl3.
+% \begin{macrocode}
+\ExplSyntaxOn
+\seq_new:N \l__SIL_fontstack
+\NewDocumentCommand\AddFontToStack {m} {%
+ \seq_gput_right:Ne \l__SIL_fontstack {#1}
+}
+\NewDocumentCommand\ReuseFont {} {
+ \seq_rand_item:N \l__SIL_fontstack
+}
+\ExplSyntaxOff
+\newcount\SIL@num@fontsel@files
+\SIL@num@fontsel@files=0
+\def\SIL@max@fontsel@files{5500}
+% \end{macrocode}
+%
% \subsubsection{Making the book}\label{mb}
% The {\ttfamily{}\textbackslash{}makebook} macro is huge, and
% handles all the detail of making a book spine. It takes
-% one mandatory argument: a \BibTeX{} entry label value from
-% the declared \BibTeX{} {\ttfamily{}.bib} file in
-% {\ttfamily{}\textbackslash{}addbibresource}.\par
+% two mandatory arguments: the author and the title of the
+% book.\par
% \begin{CPK@macro}{\makebook}\label{macro--makebook}
% Start by announcing the entry label and setting the
% values that need to be reset every time.\par
% \begin{macrocode}
-\newcommand{\makebook}[1]{%
- \typeout{^^J#1}%
+\newcommand{\makebook}[2]{%
+ \typeout{^^JTypesetting #1---#2}%
\setcounter{SIL@maxloop}{10}%
\setcounter{SIL@loopcount}{0}%
% observed
@@ -1538,7 +1588,7 @@ Package biblatex Warning: Please (re)run Biber on the file:
% Start a loop which will pick two random integers,
% one for background and one for foreground colors. Look
% these up in the {\ttfamily{}\textbackslash{}SIL@svgcolval} (in
-% {\ttfamily{}svgnam.tex}) to get the brightness
+% {\ttfamily{}bookshelf-svgnam.tex}) to get the brightness
% values, and calculate the absolute distance between
% them.\par
% \begin{macrocode}
@@ -1574,7 +1624,7 @@ Package biblatex Warning: Please (re)run Biber on the file:
% colors are separated enough, and come from opposite
% sides of the split point. If the loop makes \DescribeCounter{SIL@maxloop}{\ttfamily{}SIL@maxloop}
% iterations without finding a pair of values, use
-% whatever was tested last.\par
+% the default white on black.\par
% \begin{macrocode}
\ifdim\SIL@bgval<\SIL@splitpoint
\ifdim\SIL@fgval>\SIL@splitpoint
@@ -1607,6 +1657,11 @@ Package biblatex Warning: Please (re)run Biber on the file:
\theSIL@bgcolno}}%
\def\SIL@fgcol{\SIL@svgcolname{%
\theSIL@fgcolno}}%
+ \ifnum\c@SIL@loopcount>\c@SIL@maxloop
+ \typeout{Using default colors after \the\c@SIL@maxloop\space attempts}%
+ \def\SIL@bgcol{Black}%
+ \def\SIL@fgcol{White}%
+ \fi
\typeout{BG=\SIL@bgcol, FG=\SIL@fgcol}%
% \end{macrocode}
% Now pick a random font: the files generated by
@@ -1619,10 +1674,33 @@ Package biblatex Warning: Please (re)run Biber on the file:
% {\ttfamily{}\textbackslash{}SILmfontname} as the name (for the
% same reason).\par
% \begin{macrocode}
- \setrannum{\c@SIL@fontsel}{1}{\c@SIL@maxfont}%
- \input{fontsel/\theSIL@fontsel.tex}%
+ \c@SIL@loopcount=1\relax
+ \loop
+ \ifnum\SIL@num@fontsel@files<\SIL@max@fontsel@files
+ \advance\SIL@num@fontsel@files by 1\relax
+ \typeout{Opening new fontsel file, counter=\the\SIL@num@fontsel@files}%
+ \setrannum{\c@SIL@fontsel}{1}{\c@SIL@maxfont}%
+ \AddFontToStack{\the\c@SIL@fontsel}%
+ \else
+ \typeout{Reusing fontsel file}%
+ \expandafter\c@SIL@fontsel\ReuseFont\relax
+ \fi
+ \input{fontsel/\theSIL@fontsel.tex}\unskip%
+ \typeout{Trying \SILmfontname, attempt \the\c@SIL@loopcount}%
+ \CanTypesetTF{#2---#1}{\global
+ \SIL@fontfoundtrue}{\global
+ \SIL@fontfoundfalse}%
+ \ifSIL@fontfound
+ \c@SIL@loopcount=\SIL@maxfonttries\relax
+ \else
+ \addtocounter{SIL@loopcount}{1}%
+ \fi
+ \ifnum\c@SIL@loopcount<\SIL@maxfonttries\repeat
+ \ifSIL@fontfound
\typeout{Set in \SILmfontname}%
% \end{macrocode}
+%
+%
% Measure the author width and height at the default
% size (10pt). If the author fits in 90\% of the
% maximum width of the book, we put it at the top of the
@@ -1632,10 +1710,10 @@ Package biblatex Warning: Please (re)run Biber on the file:
% point and won't change later.\par
% \begin{macrocode}
\settowidth{\SIL@authorwidth}{%
- \SILmfont\citefullauthor{#1}}%
+ \SILmfont#1}%
\typeout{Author width: \the\SIL@authorwidth}%
\settoheight{\SIL@authorheight}{%
- \SILmfont\citefullauthor{#1}}%
+ \SILmfont#1}%
\typeout{Author height: \the\SIL@authorheight}%
\ifdim\SIL@authorwidth<.9\SIL@maxbookwidth
\typeout{Author width is less than 90\%
@@ -1655,34 +1733,6 @@ Package biblatex Warning: Please (re)run Biber on the file:
\the\SIL@maxbookwidth}%
\fi
% \end{macrocode}
-% Now measure the title, with an em rule and the
-% author if it hasn't been assigned to the top of the
-% spine.\par
-% \begin{macrocode}
- \settowidth{\SIL@titlewidth}{%
- \SILmfont\citetitle{#1}}%
- \ifdim\SIL@titlewidth=0pt
- \typeout{WARNING title width for entry "#1"
- set in \SILmfontname=0pt!}%
- \typeout{Likely that the entry has faulty
- syntax or a bogus title field}%
- \typeout{or a BiBTeX management or
- crossref setting is being misinterpreted.}%
- \typeout{I can't go any further until you
- fix this, sorry}%
- \end{document}%
- \fi
- \ifSIL@topauthor
- \typeout{Title width: \the\SIL@titlewidth}%
- \else
- \addtolength{\SIL@titlewidth}{%
- \widthof{\SILmfont~~—~~}}%
- \addtolength{\SIL@titlewidth}{%
- \SIL@authorwidth}%
- \typeout{Title width with em rule and author:
- \the\SIL@titlewidth}%
- \fi
-% \end{macrocode}
% We now have enough data to make a shot at the
% dimensions. Pick a random book height and set the height
% available for the title (set sideways) to 90\% of
@@ -1721,94 +1771,6 @@ Package biblatex Warning: Please (re)run Biber on the file:
\the\SIL@bookwidth}%
\fi
% \end{macrocode}
-% See how the title will fit the space: if it's
-% smaller, it will fit on one line, but we scale it up so
-% it occupies more of the space available. To do this, we
-% perform fixed-point arithmetic on the space it takes and
-% the space available, and use the resulting decimal
-% fraction later to scale the title. However, if the value
-% resulting is greater than four, set it to four,
-% otherwise the title will be too big to fit. The value
-% four was obtained by inspection and trial and
-% error.\par
-% \begin{macrocode}
- \ifdim\SIL@titlewidth<\SIL@heightfortitle
- \typeout{Titling fits in
- \the\SIL@heightfortitle}%
- \SIL@titleonelinetrue
- \edef\titleval{\strip@pt\SIL@titlewidth}%
- \edef\heightval{\strip@pt\SIL@heightfortitle}%
- \FPeval\SIL@scaledtitle{\heightval/\titleval}%
- \typeout{Scaling 1-line title by
- \SIL@scaledtitle}%
- \expandafter\SIL@scaleint
- \SIL@scaledtitle\sentinel
- \ifnum\c@SIL@scale>4
- \gdef\SIL@scaledtitle{4}%
- \typeout{Resetting scale \theSIL@scale\ to
- \SIL@scaledtitle}%
- \fi
-% \end{macrocode}
-% Otherwise (too long) the title needs to be set in a
-% box as a multi-line title. This gets complicated:\par
-% \begin{enumerate}
-% \item set the title in a {\ttfamily{}\textbackslash{}vbox} and
-% then add the height and depth it occupies to get the
-% height of the set title;
-% \item if that height is more than the width of the
-% book, use the method above to divide the available
-% height by the [over]used height and use that to reduce
-% the point size by deducting it from 10 (points);
-% \item otherwise (the multiline title fits in the width
-% of the book), do the reverse and increase the point
-% size to take advantage of the extra space by adding it
-% to 10pt.\par
-% \end{enumerate}
-% \begin{macrocode}
- \else
- \typeout{Titling won't fit
- \the\SIL@heightfortitle}%
- \SIL@titleonelinefalse
- \setbox\SIL@titlebox=\vbox{%
- \hsize\SIL@heightfortitle
- \SILmfont\raggedright
- \vrule height1em width0pt
- \bfseries\citetitle{#1}%
- \vrule depth.2em width0pt
- }%
- \setlength{\SIL@titleheight}%
- {\ht\SIL@titlebox + \dp\SIL@titlebox}%
- \typeout{Multiline title takes
- \the\SIL@titleheight}%
- \ifdim\SIL@titleheight>\SIL@bookwidth
- \typeout{Height of title
- \the\SIL@titleheight\
- is greater than
- \the\SIL@bookwidth}%
- \edef\titleval{\strip@pt\SIL@titleheight}%
- \edef\heightval{\strip@pt\SIL@bookwidth}%
- \FPeval\SIL@scaledtitle
- {10 - \heightval / \titleval}%
- \typeout{10 - \heightval\ ÷ \titleval\
- = \SIL@scaledtitle}%
- \typeout{Using smaller font \SIL@scaledtitle
- pt for multiline title}%
- \else
- \typeout{Height of title
- \the\SIL@titleheight\
- is less than
- \the\SIL@bookwidth}%
- \edef\titleval{\strip@pt\SIL@titleheight}%
- \edef\heightval{\strip@pt\SIL@bookwidth}%
- \FPeval\SIL@scaledtitle
- {10 + \heightval / \titleval}%
- \typeout{10 + \heightval\ ÷ \titleval\
- = \SIL@scaledtitle}%
- \typeout{Using larger font \SIL@scaledtitle
- pt for multiline title}%
- \fi
- \fi
-% \end{macrocode}
% Finally, set a {\ttfamily{}\textbackslash{}vbox} to the
% defined width \emph{less} the space
% occupied by the {\ttfamily{}\textbackslash{}fcolorbox} border and
@@ -1833,53 +1795,21 @@ Package biblatex Warning: Please (re)run Biber on the file:
hsize=\the\SIL@bookwidth}%
\centering
\SILmfont\color{\SIL@fgcol}%
- \citefullauthor{#1}%
+ #1%
\par\vfill
- \rotatebox{90}{\vbox to\SIL@bookwidth{%
- \hsize\SIL@heightfortitle
- \null\vfill
- \typeout{Title in a vbox to
- \the\SIL@bookwidth,
- hsize=\the\SIL@heightfortitle}%
- \raggedright\color{\SIL@fgcol}%
- \ifSIL@titleoneline
- \scalebox{\SIL@scaledtitle}%
- {\bfseries\citetitle{#1}}%
- \else
- \fontsize{\SIL@scaledtitle}%
- {\SIL@scaledtitle}\selectfont
- \bfseries\citetitle{#1}%
- \fi
- \par\vfill}%
+ \SIL@fittext{\color{\SIL@fgcol}\SILmfont
+ #2}{\SIL@heightfortitle}{\SIL@bookwidth}%
+ {\SIL@titlebox}%
+ \rotatebox{90}{\box\SIL@titlebox}%
}%
- }%
\else
\typeout{Setting author inline to title}%
\vbox to\SIL@bookheight{\hsize\SIL@bookwidth
- \typeout{Spine is a vbox to
- \the\SIL@bookheight,
- hsize=\the\SIL@bookwidth}%
- \centering
- \SILmfont\color{\SIL@fgcol}%
- \rotatebox{90}{\vbox to\SIL@bookwidth{%
- \hsize\SIL@heightfortitle
- \null\vfill
- \typeout{Title and author in a vbox to
- \the\SIL@bookwidth,
- hsize=\the\SIL@heightfortitle}%
- \raggedright\color{\SIL@fgcol}%
- \ifSIL@titleoneline
- \scalebox{\SIL@scaledtitle}%
- {{\bfseries\citetitle{#1}}\quad
- —\ \ \citefullauthor{#1}}%
- \else
- \fontsize{\SIL@scaledtitle}%
- {\SIL@scaledtitle}\selectfont
- {\bfseries\citetitle{#1}}\quad
- —\ \ \citefullauthor{#1}%
- \fi
- \par\vfill}%
- }%
+ \SIL@fittext{\color{\SIL@fgcol}\SILmfont
+ #1\quad
+ ---\quad#2}{\SIL@bookheight}{\SIL@bookwidth}%
+ {\SIL@titlebox}%
+ \rotatebox{90}{\box\SIL@titlebox}%
}%
\fi
}%
@@ -1888,64 +1818,24 @@ Package biblatex Warning: Please (re)run Biber on the file:
% shelf the books stand on. The number is the number of
% the font that was selected, and is there for
% error-tracing purposes only.\par
-% Despite best efforts at ending all
-% non-control-sequence line-ends with a percent shield,
-% space is creeping in somewhere, so the final negative
-% kern removes it.\par
% \begin{macrocode}
- \\\fboxsep0pt\fboxrule0pt
+ \\\fboxsep0pt\fboxrule0pt%
\colorbox{BurlyWood}{\hbox to\hsize{%
\hfil\vrule height3mm depth6mm width0pt
\normalfont\scriptsize\theSIL@fontsel\hfil}}%
- }%
-\kern-2.2mm}%
+ }%
+ \penalty0
+\else % font not found
+ \typeout{Did not find font for #1--#2}%
+
+\fi}
% \end{macrocode}
% \end{CPK@macro}
-% \begin{CPK@macro}{\DeclareCiteCommand}\label{fields}
-% Trying to ensure we have an author's full name, not
-% just the surname. This came from \href{https://tex.stackexchange.com/questions/24979/citing-authors-full-name-in-biblatex}{lockstep},
-% modified at \textsf{biblatex}'s suggestion to
-% use {\ttfamily{}given-family} instead of
-% {\ttfamily{}first-last}, but it doesn't seem
-% to have any effect.\par
+%
% \begin{macrocode}
-\DeclareCiteCommand{\citefullauthor}
- {\boolfalse{citetracker}%
- \boolfalse{pagetracker}%
- \DeclareNameAlias{labelname}{given-family}%
- \usebibmacro{prenote}}
- {\ifciteindex
- {\indexnames{labelname}}
- {}%
- \printnames{labelname}}
- {\multicitedelim}
- {\usebibmacro{postnote}}
+\raggedright
% \end{macrocode}
-% \end{CPK@macro}
-% \begin{CPK@macro}{\DeclareLabeltitle}\label{macro--DeclareLabeltitle}
-% Similarly, in an attempt to get keep the author and
-% title for books and monographs, but use the editors and
-% volume/journal/book title for articles, incollection, and
-% inbook entry types, these two definitions don't seem to
-% have any effect. The remaining definitions are
-% needed to cope with the expected commands found in
-% sample bibliographies.\par
-% \begin{macrocode}
-%%\DeclareLabeltitle[article]{%
-%% \field{journaltitle}
-%%}
-%%\DeclareLabeltitle
-%% [inbook,incollection,inproceedings]{%
-%% \field{booktitle}
-%% \field{maintitle}
-%%}
%
-\DeclareFieldFormat*{citetitle}{#1}
-\let\citeA\textcite
-\let\titleref\emph
-\def\emdash{~--- }
-% \end{macrocode}
-% \end{CPK@macro}
% \iffalse
%</class>
% \fi
@@ -1953,572 +1843,5 @@ Package biblatex Warning: Please (re)run Biber on the file:
% \clearpage
% \raggedright
% \raggedright\printbibliography
-% \appendix
-% \newgeometry{left=3cm}
-% \clearpage
-% \section{The \LaTeX{} Project Public License (v\thinspace{}1.3c)}\label{LPPL}
-% \begin{quotation}\small\sffamily\parindent0pt
-% \parskip.5\baselineskip
-% \color{DarkBlue}\noindent
-% Everyone is allowed to distribute verbatim copies of this
-% license document, but modification of it is not allowed.\par
-% \end{quotation}
-% \subsection{Preamble}\label{Preamble}
-% The \LaTeX{} Project Public License ({\smaller LPPL})
-% is the primary license under which the \LaTeX{} kernel and the
-% base \LaTeX{} packages are distributed.\par
-% You may use this license for any work of which you hold the
-% copyright and which you wish to distribute. This license may be
-% particularly suitable if your work is \TeX{}-related (such as a
-% \LaTeX{} package), but it is written in such a way that you can
-% use it even if your work is unrelated to \TeX{}.\par
-% The section “Whether and How to Distribute Works under This
-% Licenseâ€, below, gives instructions, examples, and
-% recommendations for authors who are considering distributing
-% their works under this license.\par
-% This license gives conditions under which a work may be
-% distributed and modified, as well as conditions under which
-% modified versions of that work may be distributed.\par
-% We, the \LaTeX{3} Project, believe that the conditions below
-% give you the freedom to make and distribute modified versions of
-% your work that conform with whatever technical specifications
-% you wish while maintaining the availability, integrity, and
-% reliability of that work. If you do not see how to achieve your
-% goal while meeting these conditions, then read the document
-% {\ttfamily{}cfgguide.tex} and {\ttfamily{}modguide.tex} in the base \LaTeX{}
-% distribution for suggestions.\par
-% \subsection{Definitions}\label{Definitions}
-% In this license document the following terms are used:\par
-% \begin{description}[style=unboxed]
-% \item[Work\thinspace:]Any work being distributed under this License.\par
-% \item[Derived Work\thinspace:]Any work that under any applicable law is derived from
-% the Work.\par
-% \item[Modification\thinspace:]Any procedure that produces a Derived Work under any
-% applicable law~--- for example, the production of a file
-% containing an original file associated with the Work or a
-% significant portion of such a file, either verbatim or
-% with modifications and/or translated into another
-% language.\par
-% \item[Modify\thinspace:]To apply any procedure that produces a Derived Work
-% under any applicable law.\par
-% \item[Distribution\thinspace:]Making copies of the Work available from one person to
-% another, in whole or in part. Distribution includes (but
-% is not limited to) making any electronic components of the
-% Work accessible by file transfer protocols such as
-% {\smaller FTP} or {\smaller HTTP} or by
-% shared file systems such as Sun's Network File System
-% ({\smaller NFS}).\par
-% \item[Compiled Work\thinspace:]A version of the Work that has been processed into a
-% form where it is directly usable on a computer system.
-% This processing may include using installation facilities
-% provided by the Work, transformations of the Work, copying
-% of components of the Work, or other activities. Note that
-% modification of any installation facilities provided by
-% the Work constitutes modification of the Work.\par
-% \item[Current Maintainer\thinspace:]A person or persons nominated as such within the Work.
-% If there is no such explicit nomination then it is the
-% `Copyright Holder' under any applicable
-% law.\par
-% \item[Base Interpreter\thinspace:]A program or process that is normally needed for
-% running or interpreting a part or the whole of the
-% Work.\par
-% A Base Interpreter may depend on external components
-% but these are not considered part of the Base Interpreter
-% provided that each external component clearly identifies
-% itself whenever it is used interactively. Unless
-% explicitly specified when applying the license to the
-% Work, the only applicable Base Interpreter is a
-% `\LaTeX{}-Format' or in the case of files
-% belonging to the `\LaTeX{}-format' a program
-% implementing the `\TeX{} language'.\par
-% \end{description}
-% \subsection{Conditions on Distribution and Modification}\label{Conditions}
-% \begin{enumerate}
-% \item Activities other than distribution and/or modification
-% of the Work are not covered by this license; they are
-% outside its scope. In particular, the act of running the
-% Work is not restricted and no requirements are made
-% concerning any offers of support for the Work.\par
-% \item \label{item-distribute}You may distribute a complete, unmodified copy of the
-% Work as you received it. Distribution of only part of the
-% Work is considered modification of the Work, and no right to
-% distribute such a Derived Work may be assumed under the
-% terms of this clause.\par
-% \item You may distribute a Compiled Work that has been
-% generated from a complete, unmodified copy of the Work as
-% distributed under Clause~item~\ref{item-distribute} above above, as
-% long as that Compiled Work is distributed in such a way that
-% the recipients may install the Compiled Work on their system
-% exactly as it would have been installed if they generated a
-% Compiled Work directly from the Work.\par
-% \item \label{item-currmaint}If you are the Current Maintainer of the Work, you may,
-% without restriction, modify the Work, thus creating a
-% Derived Work. You may also distribute the Derived Work
-% without restriction, including Compiled Works generated from
-% the Derived Work. Derived Works distributed in this manner
-% by the Current Maintainer are considered to be updated
-% versions of the Work.\par
-% \item If you are not the Current Maintainer of the Work, you
-% may modify your copy of the Work, thus creating a Derived
-% Work based on the Work, and compile this Derived Work, thus
-% creating a Compiled Work based on the Derived Work.\par
-% \item \label{item-conditions}If you are not the Current Maintainer of the Work, you
-% may distribute a Derived Work provided the following
-% conditions are met for every component of the Work unless
-% that component clearly states in the copyright notice that
-% it is exempt from that condition. Only the Current
-% Maintainer is allowed to add such statements of exemption to
-% a component of the Work.\par
-% \begin{enumerate}
-% \item If a component of this Derived Work can be a direct
-% replacement for a component of the Work when that
-% component is used with the Base Interpreter, then,
-% wherever this component of the Work identifies itself to
-% the user when used interactively with that Base
-% Interpreter, the replacement component of this Derived
-% Work clearly and unambiguously identifies itself as a
-% modified version of this component to the user when used
-% interactively with that Base Interpreter.\par
-% \item Every component of the Derived Work contains
-% prominent notices detailing the nature of the changes to
-% that component, or a prominent reference to another file
-% that is distributed as part of the Derived Work and that
-% contains a complete and accurate log of the
-% changes.\par
-% \item No information in the Derived Work implies that any
-% persons, including (but not limited to) the authors of
-% the original version of the Work, provide any support,
-% including (but not limited to) the reporting and
-% handling of errors, to recipients of the Derived Work
-% unless those persons have stated explicitly that they do
-% provide such support for the Derived Work.\par
-% \item You distribute at least one of the following with
-% the Derived Work:\par
-% \begin{enumerate}
-% \item A complete, unmodified copy of the Work; if your
-% distribution of a modified component is made by
-% offering access to copy the modified component from
-% a designated place, then offering equivalent access
-% to copy the Work from the same or some similar place
-% meets this condition, even though third parties are
-% not compelled to copy the Work along with the
-% modified component;\par
-% \item Information that is sufficient to obtain a
-% complete, unmodified copy of the Work.\par
-% \end{enumerate}
-% \end{enumerate}
-% \item If you are not the Current Maintainer of the Work, you
-% may distribute a Compiled Work generated from a Derived
-% Work, as long as the Derived Work is distributed to all
-% recipients of the Compiled Work, and as long as the
-% conditions of Clause~item~\ref{item-conditions} above, above, are met
-% with regard to the Derived Work.\par
-% \item The conditions above are not intended to prohibit, and
-% hence do not apply to, the modification, by any method, of
-% any component so that it becomes identical to an updated
-% version of that component of the Work as it is distributed
-% by the Current Maintainer under Clause~item~\ref{item-currmaint} above, above.\par
-% \item Distribution of the Work or any Derived Work in an
-% alternative format, where the Work or that Derived Work (in
-% whole or in part) is then produced by applying some process
-% to that format, does not relax or nullify any sections of
-% this license as they pertain to the results of applying that
-% process.\par
-% \item % \begin{enumerate}
-% \item A Derived Work may be distributed under a different
-% license provided that license itself honors the
-% conditions listed in Clause~item~\ref{item-conditions} in the list on p.\thinspace\pageref{item-conditions} above, in
-% regard to the Work, though it does not have to honor the
-% rest of the conditions in this license.\par
-% \item If a Derived Work is distributed under a different
-% license, that Derived Work must provide sufficient
-% documentation as part of itself to allow each recipient
-% of that Derived Work to honor the restrictions in
-% Clause~item~\ref{item-conditions} in the list on p.\thinspace\pageref{item-conditions} above, concerning
-% changes from the Work.\par
-% \end{enumerate}
-% \item This license places no restrictions on works that are
-% unrelated to the Work, nor does this license place any
-% restrictions on aggregating such works with the Work by any
-% means.\par
-% \item Nothing in this license is intended to, or may be used
-% to, prevent complete compliance by all parties with all
-% applicable laws.\par
-% \end{enumerate}
-% \subsection{No Warranty}\label{Warranty}
-% There is no warranty for the Work. Except when otherwise
-% stated in writing, the Copyright Holder provides the Work
-% `as is', without warranty of any kind, either
-% expressed or implied, including, but not limited to, the implied
-% warranties of merchantability and fitness for a particular
-% purpose. The entire risk as to the quality and performance of
-% the Work is with you. Should the Work prove defective, you
-% assume the cost of all necessary servicing, repair, or
-% correction.\par
-% In no event unless required by applicable law or agreed to
-% in writing will The Copyright Holder, or any author named in the
-% components of the Work, or any other party who may distribute
-% and/or modify the Work as permitted above, be liable to you for
-% damages, including any general, special, incidental or
-% consequential damages arising out of any use of the Work or out
-% of inability to use the Work (including, but not limited to,
-% loss of data, data being rendered inaccurate, or losses
-% sustained by anyone as a result of any failure of the Work to
-% operate with any other programs), even if the Copyright Holder
-% or said author or said other party has been advised of the
-% possibility of such damages.\par
-% \subsection{Maintenance of The Work}\label{Maintenance}
-% The Work has the status `author-maintained'
-% if the Copyright Holder explicitly and prominently states near
-% the primary copyright notice in the Work that the Work can only
-% be maintained by the Copyright Holder or simply that it is
-% `author-maintained'.\par
-% The Work has the status `maintained' if there
-% is a Current Maintainer who has indicated in the Work that they
-% are willing to receive error reports for the Work (for example,
-% by supplying a valid e-mail address). It is not required for the
-% Current Maintainer to acknowledge or act upon these error
-% reports.\par
-% The Work changes from status `maintained' to
-% `unmaintained' if there is no Current Maintainer,
-% or the person stated to be Current Maintainer of the work cannot
-% be reached through the indicated means of communication for a
-% period of six months, and there are no other significant signs
-% of active maintenance.\par
-% You can become the Current Maintainer of the Work by
-% agreement with any existing Current Maintainer to take over this
-% role.\par
-% If the Work is unmaintained, you can become the Current
-% Maintainer of the Work through the following steps:\par
-% \begin{enumerate}
-% \item Make a reasonable attempt to trace the Current
-% Maintainer (and the Copyright Holder, if the two differ)
-% through the means of an Internet or similar search.\par
-% \item If this search is successful, then enquire whether the
-% Work is still maintained.\par
-% \begin{enumerate}
-% \item If it is being maintained, then ask the Current
-% Maintainer to update their communication data within one
-% month.\par
-% \item \label{item-intention}If the search is unsuccessful or no action to resume
-% active maintenance is taken by the Current Maintainer,
-% then announce within the pertinent community your
-% intention to take over maintenance. (If the Work is a
-% \LaTeX{} work, this could be done, for example, by
-% posting to \url{news:comp.text.tex}.)\par
-% \end{enumerate}
-% \item % \begin{enumerate}
-% \item If the Current Maintainer is reachable and agrees to
-% pass maintenance of the Work to you, then this takes
-% effect immediately upon announcement.\par
-% \item \label{item-announce}If the Current Maintainer is not reachable and the
-% Copyright Holder agrees that maintenance of the Work be
-% passed to you, then this takes effect immediately upon
-% announcement.\par
-% \end{enumerate}
-% \item \label{item-change}If you make an `intention announcement'
-% as described in~item~\ref{item-intention} in the list on p.\thinspace\pageref{item-intention} above and after three
-% months your intention is challenged neither by the Current
-% Maintainer nor by the Copyright Holder nor by other people,
-% then you may arrange for the Work to be changed so as to
-% name you as the (new) Current Maintainer.\par
-% \item If the previously unreachable Current Maintainer becomes
-% reachable once more within three months of a change
-% completed under the terms of~item~\ref{item-announce} in the list on p.\thinspace\pageref{item-announce}
-% or~item~\ref{item-change} above, then that
-% Current
-% Maintainer must become or remain the Current Maintainer upon
-% request provided they then update their communication data
-% within one month.\par
-% \end{enumerate}
-% A change in the Current Maintainer does not, of itself,
-% alter the fact that the Work is distributed under the
-% {\smaller LPPL} license.\par
-% If you become the Current Maintainer of the Work, you should
-% immediately provide, within the Work, a prominent and
-% unambiguous statement of your status as Current Maintainer. You
-% should also announce your new status to the same pertinent
-% community as in~item~\ref{item-intention} in the list on p.\thinspace\pageref{item-intention}
-% above.\par
-% \subsection{Whether and How to Distribute Works under This
-% License}\label{Distribute}
-% This section contains important instructions, examples, and
-% recommendations for authors who are considering distributing
-% their works under this license. These authors are addressed as
-% `you' in this section.\par
-% \subsubsection{Choosing This License or Another License}\label{Choosing}
-% If for any part of your work you want or need to use
-% \emph{distribution} conditions that differ
-% significantly from those in this license, then do not refer to
-% this license anywhere in your work but, instead, distribute
-% your work under a different license. You may use the text of
-% this license as a model for your own license, but your license
-% should not refer to the {\smaller LPPL} or otherwise
-% give the impression that your work is distributed under the
-% {\smaller LPPL}.\par
-% The document {\ttfamily{}modguide.tex} in the base \LaTeX{}
-% distribution explains the motivation behind the conditions of
-% this license. It explains, for example, why distributing
-% \LaTeX{} under the {\smaller GNU} General Public
-% License ({\smaller GPL}) was considered inappropriate.
-% Even if your work is unrelated to \LaTeX{}, the discussion in
-% {\ttfamily{}modguide.tex} may still be
-% relevant, and authors intending to distribute their works
-% under any license are encouraged to read it.\par
-% \subsubsection{A Recommendation on Modification Without
-% Distribution}\label{WithoutDistribution}
-% It is wise never to modify a component of the Work, even
-% for your own personal use, without also meeting the above
-% conditions for distributing the modified component. While you
-% might intend that such modifications will never be
-% distributed, often this will happen by accident~--- you may
-% forget that you have modified that component; or it may not
-% occur to you when allowing others to access the modified
-% version that you are thus distributing it and violating the
-% conditions of this license in ways that could have legal
-% implications and, worse, cause problems for the community. It
-% is therefore usually in your best interest to keep your copy
-% of the Work identical with the public one. Many works provide
-% ways to control the behavior of that work without altering any
-% of its licensed components.\par
-% \subsubsection{How to Use This License}\label{HowTo}
-% To use this license, place in each of the components of
-% your work both an explicit copyright notice including your
-% name and the year the work was authored and/or last
-% substantially modified. Include also a statement that the
-% distribution and/or modification of that component is
-% constrained by the conditions in this license.\par
-% Here is an example of such a notice and statement:\par
-% \iffalse
-%<*ignore>
-% \fi
-\begin{lstlisting}[language={[LaTeX]TeX}]
-%%% pig.dtx
-%%% Copyright 2005 M. Y. Name
-%%
-%% This work may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3 or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
-%%
-%% This work has the LPPL maintenance status `maintained'.
-%%
-%% The Current Maintainer of this work is M. Y. Name.
-%%
-%% This work consists of the files pig.dtx and pig.ins
-%% and the derived file pig.sty.
-\end{lstlisting}
-% \iffalse
-%</ignore>
-% \fi
-% Given such a notice and statement in a file, the
-% conditions given in this license document would apply, with
-% the `Work' referring to the three files
-% {\ttfamily{}pig.dtx}, {\ttfamily{}pig.ins}, and {\ttfamily{}pig.sty} (the last being generated
-% from {\ttfamily{}pig.dtx} using {\ttfamily{}pig.ins}), the `Base
-% Interpreter' referring to any
-% `\LaTeX{}-Format', and both `Copyright
-% Holder' and `Current Maintainer'
-% referring to the person
-% M.~Y.~Name\index{!}.\par
-% If you do not want the Maintenance section of
-% {\smaller LPPL} to apply to your Work, change
-% `maintained' above into
-% `author-maintained'. However, we recommend that
-% you use `maintained' as the Maintenance
-% section was added in order to ensure that your Work remains
-% useful to the community even when you can no longer maintain
-% and support it yourself.\par
-% \subsubsection{Derived Works That Are Not Replacements}\label{NotReplacements}
-% Several clauses of the {\smaller LPPL} specify
-% means to provide reliability and stability for the user
-% community. They therefore concern themselves with the case
-% that a Derived Work is intended to be used as a (compatible or
-% incompatible) replacement of the original Work. If this is not
-% the case (e.g., if a few lines of code are reused for a
-% completely different task), then clauses 6b and 6d shall not
-% apply.\par
-% \subsubsection{Important Recommendations}\label{Recommendations}
-% \paragraph[Defining What Constitutes the Work]{Defining What Constitutes the Work :}
-% The {\smaller LPPL} requires that distributions
-% of the Work contain all the files of the Work. It is
-% therefore important that you provide a way for the licensee
-% to determine which files constitute the Work. This could,
-% for example, be achieved by explicitly listing all the files
-% of the Work near the copyright notice of each file or by
-% using a line such as:\par
-% \iffalse
-%<*ignore>
-% \fi
-\begin{lstlisting}[language={[LaTeX]TeX}]
-%% This work consists of all files listed in manifest.txt.
-\end{lstlisting}
-% \iffalse
-%</ignore>
-% \fi
-% in that place. In the absence of an unequivocal list it
-% might be impossible for the licensee to determine what is
-% considered by you to comprise the Work and, in such a case,
-% the licensee would be entitled to make reasonable
-% conjectures as to which files comprise the Work.\par
-% \iffalse
-%<*script>
-#! /bin/bash
-
-# prepdata.sh - prepare the datasets for the bookshelf package
-# which creates a bookshelf image from a BiBTeX file.
-#
-# Peter Flynn, 2020-05-14 <peter@silmaril.ie>
-#
-# Dependencies: the standard UNIX/GNU Linux text utilities
-# and builtins : cat, grep, awk, mkdir, rm, echo, sed, sort
-# PLUS the font-cache program fc-list (1) and the TeX utility
-# kpsewhich (1).
-#
-# Note that if you have not updated your font-cach to take
-# account of fonts added since installation (eg fonts
-# distributed with TeX which are not installed in the system
-# fonts directories) then you should edit /etc/fonts/conf.avail
-# to add the directories where they are installed to (eg)
-# 09-texlive.conf and then alias that file to conf.d, and then
-# run fc-cache as root.
-
-if [ -z "$1" ]; then
- echo You must give the full name of your BiBTeX file
- exit 1
-else
- if [ ! -s "$1" ]; then
-echo I can\'t find the file "$1" anywhere here
-exit 1
- else
-BIBFILE="$1"
- fi
-fi
-
-###########################################################
-#
-# Make a list of all the entries in the bib file. This is
-# in effect the 'driver' which creates each book spine image
-# and the entries.tex file is \input in the test.tex file.
-
-cat "$BIBFILE" |\
- grep '^@' |\
- grep -viE '(@Preamble|@String)' |\
- awk -F\{ '{print $2}' |\
- awk -F, '{print "\\makebook{" $1 "}%"}' >entries.tex
-
-echo `cat entries.tex|wc -l` bibliographic entries
-
-##########################################################
-#
-# Make a list of all the fonts available: this omits PFB
-# fonts (Postscript Type 1) and deduplicates the entries
-# on the first token of their name. CRITICALLY it then
-# applies a (typically) VERY LONG list of disallowed font
-# names so as to exclude non-text fonts: math, symbols,
-# display fonts, bogus and broken fonts, and fonts not
-# providing the Latin alphabet.
-#
-# Note that the current list includes many names which
-# ought not be there, because problems were encountered
-# when using them, especially as they returned a value
-# for the title length of 0.0pt, which is clearly a bug.
-
-mkdir -p fontsel
-rm -f fontsel/*
-
-if [[ "$OSTYPE" =~ ^darwin ]]; then
-
- system_profiler SPFontsDataType 2>/dev/null |\
- awk -F: '/^[ ]{4}[A-Za-z0-9\;\ ]*.[ot]tf*:$/ {font=substr($1,5)} \
- /^[ ]{10}Family:/ {if(font!="") \
- {print substr($2,2);font=""}}' |\
- grep -Ev '^[\.\ ]' |\
- sort |\
- uniq |\
- grep -Evi '(Bitmap|Emoji|Dingbats|Jazz|STIX|dings|Symbol|Numeric|DIN|Ornament|OCR|CJK|Awesome|Dummy|Math)' |\
- awk '{file="fontsel/" NR ".tex";\
- print "\\newfontface{\\SILmfont}{" $0 "}" >file;
- print "\\def\\SILmfontname{" $0 "}" >file;
- close(file)} \
- END {print "\\setcounter{SIL@maxfont}{" NR "}"}' >pickfont.tex
-
-elif [[ "$OSTYPE" =~ ^linux ]]; then
-
- fc-list |\
- grep -v '\.[ot]tf' |\
- grep -Ev '(fontsite|bitstrea)' |\
- awk -F: '{print substr($2,2)}' |\
- awk -F, '{print $1}' |\
- awk '{print $1 "," length($0) "," $0}' |\
- sort -t, -k 1,1 -k 2n |\
- awk -F, '{if($1!=last)print $3;last=$1}' |\
- grep -Evi '(Bitmap|Emoji|Dingbats|Jazz|STIX|dings|Symbol|Numeric|DIN|Ornament|OCR|CJK|Awesome|Dummy|Math)' |\
- awk '{file="fontsel/" NR ".tex";\
- print "\\newfontface{\\SILmfont}{" $0 "}" >file;
- print "\\def\\SILmfontname{" $0 "}" >file;
- close(file)} \
- END {print "\\setcounter{SIL@maxfont}{" NR "}"}' >pickfont.tex
-
-fi
-
-echo `ls -1 fontsel|wc -l` fonts
-
-###########################################################
-#
-# Make a list of the colour selection from the SVG palette
-# of the xcolor LaTeX package, with calculation of the
-# brightness/darkness value according to
-# https://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx
-
-PALETTE=`kpsewhich svgnam.def`
-cat $PALETTE |\
- grep '^[A-Z][A-Za-z]*,[\.0-9][0-9]*,[\.0-9][0-9]*,[\.0-9][0-9]*' |\
- awk -F\; '{print $1}' |\
- awk -F, '{r=$2;g=$3;b=$4} \
- {brightness=sqrt((0.241*r*r)+(0.691*g*g)+(0.068*b*b))} \
- {print $1,r,g,b,brightness}' >svgnam.csv
- cat svgnam.csv |\
- awk 'BEGIN {print "\\newcommand{\\SIL@svgcolname}[1]{\\ifcase#1 "} \
- {print $1 "\\or"} END {print "Black\\fi}\n"}' >svgnam.tex
- cat svgnam.csv |\
- awk 'BEGIN {print "\\newcommand{\\SIL@svgcolval}[1]{\\ifcase#1 "} \
- {print $5 "\\or"} END {print ".666666666\\fi}\n"}' >>svgnam.tex
- cat svgnam.csv | wc -l |\
- awk '{print "\\setcounter{SIL@maxcolno}{" $1 "}"}' >>svgnam.tex
-
-echo `cat svgnam.csv|wc -l` colors
-
-exit 0
-
-%</script>
-% \fi
-% \iffalse
-%<*tester>
-%<<COMMENT
-% !TEX TS-program = xelatex
-% !TEX encoding = UTF-8 Unicode
-% !BIB TS-program = biber
-%COMMENT
-
-%</tester>
-% \fi
-% \iffalse
-%<*tester>
-\documentclass[a0paper,landscape]{bookshelf}
-\addbibresource{mythesis.bib}
-\begin{document}\raggedright
-%%\immediate\write18{./prepdata.sh}
-%%\input{entries.tex}
-\nocite{*}
-\par\vfill\clearpage
-\printbibliography
-\end{document}
-
-%</tester>
-% \fi
% \Finale
diff --git a/graphics/bookshelf/bookshelf.ins b/graphics/bookshelf/bookshelf.ins
index cc1b1c8164..37b0aad7d8 100644
--- a/graphics/bookshelf/bookshelf.ins
+++ b/graphics/bookshelf/bookshelf.ins
@@ -1,61 +1,27 @@
-% Transformed from bookshelf.xml by ClassPack db2dtx.xsl
-% version 1.19 (2020-05-19) on Saturday 23 May 2020 at 23:33:08
-%
-% bookshelf.ins is copyright © 2020 by Peter Flynn <peter@silmaril.ie>
+% bookshelf.ins is copyright © 2020-2024 by Peter Flynn <peter@silmaril.ie>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
-% version 1.3 of this license or (at your option) any later
+% version 1.3c of this license or (at your option) any later
% version. The latest version of this license is in:
%
% http://www.latex-project.org/lppl.txt
%
-% and version 1.3 or later is part of all distributions of
-% LaTeX version 2005/12/01 or later.
+% and version 1.3c or later is part of all distributions of
+% LaTeX version 2008/06/01 or later.
%
% This work has the LPPL maintenance status ‘maintained’.
%
-% The current maintainer of this work is Peter Flynn <peter@silmaril.ie>
+% The current maintainer of this work is Boris Veytsman <borisv@lk.net>
%
-% This work consists of the files bookshelf.dtx and bookshelf.ins,
-% the derived file
-% and any other ancillary files listed in the MANIFEST.
%
\input docstrip.tex
-\keepsilent
-\usedir{tex/latex/bookshelf}
-\preamble
-
-This is a generated file.
-
-Copyright © 2020 by latex@silmaril.ie
-
-This file was generated from an XML master source.
-Amendments and corrections should be notified to the
-maintainer for inclusion in future versions.
-
-\endpreamble
-\generate{\file{bookshelf.cls}{\from{bookshelf.dtx}{class}}
- \usepreamble\empty\usepostamble\empty
- \file{prepdata.sh}{\from{bookshelf.dtx}{script}}
- \usepreamble\empty\usepostamble\empty
- \file{test.tex}{\from{bookshelf.dtx}{tester}}
-}
+\askforoverwritefalse
+\showprogress
+\generate{\file{bookshelf.cls}{\from{bookshelf.dtx}{class}}}
\obeyspaces
\Msg{********************************************************}
-\Msg{** **}
\Msg{** Read the documentation before using this class. **}
-\Msg{** **}
-\Msg{** To finish the installation you have to move the **}
-\Msg{** following files into a directory searched by TeX: **}
-\Msg{** **}
-\Msg{** **}
-\Msg{** prepdata.sh **}
-\Msg{** test.tex **}
-\Msg{** **}
-\Msg{** To produce the documentation run the file **}
-\Msg{** bookshelf.dtx through XeLaTeX and biber **}
-\Msg{** **}
\Msg{** Happy LaTeXing! **}
\Msg{** **}
\Msg{********************************************************}
diff --git a/graphics/bookshelf/bookshelf.pdf b/graphics/bookshelf/bookshelf.pdf
deleted file mode 100644
index e9cd649832..0000000000
--- a/graphics/bookshelf/bookshelf.pdf
+++ /dev/null
Binary files differ
diff --git a/graphics/bookshelf/doc/Makefile b/graphics/bookshelf/doc/Makefile
new file mode 100644
index 0000000000..9647a369c4
--- /dev/null
+++ b/graphics/bookshelf/doc/Makefile
@@ -0,0 +1,75 @@
+SAMPLE = spines.tex
+
+SAMPLEPDF = spines.pdf
+
+MAINDOC = bookshelf.pdf
+
+CLS = bookshelf.cls
+
+PERLSCRIPTS = \
+ ../scripts/bookshelf-listallfonts \
+ ../scripts/bookshelf-mkfontsel
+
+MAN = $(notdir ${PERLSCRIPTS:%=%.1})
+
+SCRIPTTEX = $(notdir ${PERLSCRIPTS:%=%.tex})
+
+SCRIPTPDF = $(notdir ${PERLSCRIPTS:%=%.pdf})
+
+all: ${MAN} allfonts ${SAMPLEPDF} ${SCRIPTPDF} ${MAINDOC}
+
+%.1: ../scripts/%
+ pod2man $< > $@
+
+%.tex: ../scripts/%
+ pod2latex -full $< > $@
+
+%.pdf: %.tex bookshelf.cls bookshelf-svgnam.tex pickfont.tex bookshelf.bst
+ lualatex $*
+ - bibtex $*
+ lualatex $*
+
+%.pdf: %.dtx spines.pdf bookshelf.cls
+ xelatex $<
+ - biber $*
+ xelatex $<
+ - makeindex -s gind.ist -o $*.ind $*.idx
+ - makeindex -s gglo.ist -o $*.gls $*.glo
+ xelatex $<
+ while ( grep -q 'rerun LaTeX' $*.log) \
+ do xelatex $<; done
+
+bookshelf.dtx: ../bookshelf.dtx
+ cp $< $@
+
+bookshelf.cls: ../bookshelf.cls
+ cp $< $@
+
+bookshelf.bst: ../bookshelf.bst
+ cp $< $@
+
+
+%.tex: ../%.tex
+ cp $< $@
+
+../bookshelf.cls: ../bookshelf.ins ../bookshelf.dtx
+ cd .. && ${MAKE} bookshelf.cls
+
+../bookshelf-svgnam.tex: ../svgnam.sh
+ cd .. && ${MAKE} bookshelf-svgnam.tex
+
+pickfont.tex: allfonts
+ ../scripts/bookshelf-mkfontsel allfonts
+
+allfonts:
+ luaotfload-tool --update --force
+ ../scripts/bookshelf-listallfonts > allfonts
+
+clean:
+ $(RM) *.bst *.cls *.aux *.bbl *.blg *.idx *.toc *.log \
+ *.bcf *.dtx *.dtx *.glo *.gls *.hd *.ilg *.ind *.out \
+ *.xml pickfont.tex ${SCRIPTTEX} bookshelf-svgnam.tex svgnam.csv
+ $(RM) -r fontsel
+
+distclean: clean
+ $(RM) ${MAN} allfonts ${SAMPLEPDF} ${SCRIPTPDF} ${MAINDOC}
diff --git a/graphics/bookshelf/doc/allfonts b/graphics/bookshelf/doc/allfonts
new file mode 100644
index 0000000000..10f775d575
--- /dev/null
+++ b/graphics/bookshelf/doc/allfonts
@@ -0,0 +1,20194 @@
+.Apple Color Emoji UI [/System/Library/Fonts/Apple Color Emoji.ttc](1):+clig;+liga;+tlig
+.Apple SD Gothic NeoI Bold [/System/Library/Fonts/AppleSDGothicNeo.ttc](7):+clig;+liga;+tlig
+.Apple SD Gothic NeoI ExtraBold [/System/Library/Fonts/AppleSDGothicNeo.ttc](15):+clig;+liga;+tlig
+.Apple SD Gothic NeoI Heavy [/System/Library/Fonts/AppleSDGothicNeo.ttc](17):+clig;+liga;+tlig
+.Apple SD Gothic NeoI Light [/System/Library/Fonts/AppleSDGothicNeo.ttc](9):+clig;+liga;+tlig
+.Apple SD Gothic NeoI Medium [/System/Library/Fonts/AppleSDGothicNeo.ttc](3):+clig;+liga;+tlig
+.Apple SD Gothic NeoI Regular [/System/Library/Fonts/AppleSDGothicNeo.ttc](1):+clig;+liga;+tlig
+.Apple SD Gothic NeoI SemiBold [/System/Library/Fonts/AppleSDGothicNeo.ttc](5):+clig;+liga;+tlig
+.Apple SD Gothic NeoI Thin [/System/Library/Fonts/AppleSDGothicNeo.ttc](11):+clig;+liga;+tlig
+.Apple SD Gothic NeoI UltraLight [/System/Library/Fonts/AppleSDGothicNeo.ttc](13):+clig;+liga;+tlig
+.Aqua Kana [/System/Library/Fonts/AquaKana.ttc](0):+clig;+liga;+tlig
+.Aqua Kana Bold [/System/Library/Fonts/AquaKana.ttc](1):+clig;+liga;+tlig
+.Arial Hebrew Desk Interface [/System/Library/Fonts/ArialHB.ttc](3):+clig;+liga;+tlig
+.Arial Hebrew Desk Interface Bold [/System/Library/Fonts/ArialHB.ttc](4):+clig;+liga;+tlig
+.Arial Hebrew Desk Interface Light [/System/Library/Fonts/ArialHB.ttc](5):+clig;+liga;+tlig
+.Geeza Pro Interface Bold [/System/Library/Fonts/GeezaPro.ttc](3):+clig;+liga;+tlig
+.Geeza Pro Interface Light [/System/Library/Fonts/GeezaPro.ttc](4):+clig;+liga;+tlig
+.Geeza Pro Interface Regular [/System/Library/Fonts/GeezaPro.ttc](2):+clig;+liga;+tlig
+.Geeza Pro PUA [/System/Library/Fonts/GeezaPro.ttc](5):+clig;+liga;+tlig
+.Geeza Pro PUA Bold [/System/Library/Fonts/GeezaPro.ttc](6):+clig;+liga;+tlig
+.Hiragino Kaku Gothic Interface W0 [/System/Library/Fonts/ヒラギノ角ゴシック W0.ttc](1):+clig;+liga;+tlig
+.Hiragino Kaku Gothic Interface W1 [/System/Library/Fonts/ヒラギノ角ゴシック W1.ttc](1):+clig;+liga;+tlig
+.Hiragino Kaku Gothic Interface W2 [/System/Library/Fonts/ヒラギノ角ゴシック W2.ttc](1):+clig;+liga;+tlig
+.Hiragino Kaku Gothic Interface W3 [/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc](1):+clig;+liga;+tlig
+.Hiragino Kaku Gothic Interface W4 [/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc](1):+clig;+liga;+tlig
+.Hiragino Kaku Gothic Interface W5 [/System/Library/Fonts/ヒラギノ角ゴシック W5.ttc](1):+clig;+liga;+tlig
+.Hiragino Kaku Gothic Interface W6 [/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc](1):+clig;+liga;+tlig
+.Hiragino Kaku Gothic Interface W7 [/System/Library/Fonts/ヒラギノ角ゴシック W7.ttc](1):+clig;+liga;+tlig
+.Hiragino Kaku Gothic Interface W8 [/System/Library/Fonts/ヒラギノ角ゴシック W8.ttc](1):+clig;+liga;+tlig
+.Hiragino Kaku Gothic Interface W9 [/System/Library/Fonts/ヒラギノ角ゴシック W9.ttc](1):+clig;+liga;+tlig
+.Hiragino Sans GB Interface W3 [/System/Library/Fonts/Hiragino Sans GB.ttc](1):+clig;+liga;+tlig
+.Hiragino Sans GB Interface W6 [/System/Library/Fonts/Hiragino Sans GB.ttc](3):+clig;+liga;+tlig
+.Keyboard [/System/Library/Fonts/Keyboard.ttf]:+clig;+liga;+tlig
+.LastResort [/System/Library/Fonts/LastResort.otf]:+clig;+liga;+tlig
+.New York [/System/Library/Fonts/NewYork.ttf]:+clig;+liga;+tlig
+.New York; Oldstyle Figures [/System/Library/Fonts/NewYork.ttf]:+clig;+liga;+tlig;+onum
+.New York; Small Capitals [/System/Library/Fonts/NewYork.ttf]:+clig;+liga;+tlig;+smcp
+.New York; Stylistic Set 1 [/System/Library/Fonts/NewYork.ttf]:+clig;+liga;+tlig;+ss01
+.New York Italic [/System/Library/Fonts/NewYorkItalic.ttf]:+clig;+liga;+tlig
+.New York Italic; Oldstyle Figures [/System/Library/Fonts/NewYorkItalic.ttf]:+clig;+liga;+tlig;+onum
+.New York Italic; Small Capitals [/System/Library/Fonts/NewYorkItalic.ttf]:+clig;+liga;+tlig;+smcp
+.New York Italic; Stylistic Set 1 [/System/Library/Fonts/NewYorkItalic.ttf]:+clig;+liga;+tlig;+ss01
+.Noto Nastaliq Urdu UI [/System/Library/Fonts/NotoNastaliq.ttc](1):+clig;+liga;+tlig
+.Noto Nastaliq Urdu UI Bold [/System/Library/Fonts/NotoNastaliq.ttc](3):+clig;+liga;+tlig
+.PingFang HK Light [/System/Library/Fonts/PingFang.ttc](27):+clig;+liga;+tlig
+.PingFang HK Medium [/System/Library/Fonts/PingFang.ttc](21):+clig;+liga;+tlig
+.PingFang HK Regular [/System/Library/Fonts/PingFang.ttc](18):+clig;+liga;+tlig
+.PingFang HK Semibold [/System/Library/Fonts/PingFang.ttc](24):+clig;+liga;+tlig
+.PingFang HK Thin [/System/Library/Fonts/PingFang.ttc](30):+clig;+liga;+tlig
+.PingFang HK Ultralight [/System/Library/Fonts/PingFang.ttc](33):+clig;+liga;+tlig
+.PingFang SC Light [/System/Library/Fonts/PingFang.ttc](29):+clig;+liga;+tlig
+.PingFang SC Medium [/System/Library/Fonts/PingFang.ttc](23):+clig;+liga;+tlig
+.PingFang SC Regular [/System/Library/Fonts/PingFang.ttc](20):+clig;+liga;+tlig
+.PingFang SC Semibold [/System/Library/Fonts/PingFang.ttc](26):+clig;+liga;+tlig
+.PingFang SC Thin [/System/Library/Fonts/PingFang.ttc](32):+clig;+liga;+tlig
+.PingFang SC Ultralight [/System/Library/Fonts/PingFang.ttc](35):+clig;+liga;+tlig
+.PingFang TC Light [/System/Library/Fonts/PingFang.ttc](28):+clig;+liga;+tlig
+.PingFang TC Medium [/System/Library/Fonts/PingFang.ttc](22):+clig;+liga;+tlig
+.PingFang TC Regular [/System/Library/Fonts/PingFang.ttc](19):+clig;+liga;+tlig
+.PingFang TC Semibold [/System/Library/Fonts/PingFang.ttc](25):+clig;+liga;+tlig
+.PingFang TC Thin [/System/Library/Fonts/PingFang.ttc](31):+clig;+liga;+tlig
+.PingFang TC Ultralight [/System/Library/Fonts/PingFang.ttc](34):+clig;+liga;+tlig
+.SF Compact [/System/Library/Fonts/SFCompact.ttf]:+clig;+liga;+tlig
+.SF Compact; Small Capitals [/System/Library/Fonts/SFCompact.ttf]:+clig;+liga;+tlig;+smcp
+.SF Compact; Stylistic Set 1 [/System/Library/Fonts/SFCompact.ttf]:+clig;+liga;+tlig;+ss01
+.SF Compact; Stylistic Set 2 [/System/Library/Fonts/SFCompact.ttf]:+clig;+liga;+tlig;+ss02
+.SF Compact; Stylistic Set 3 [/System/Library/Fonts/SFCompact.ttf]:+clig;+liga;+tlig;+ss03
+.SF Compact; Stylistic Set 5 [/System/Library/Fonts/SFCompact.ttf]:+clig;+liga;+tlig;+ss05
+.SF Compact; Stylistic Set 6 [/System/Library/Fonts/SFCompact.ttf]:+clig;+liga;+tlig;+ss06
+.SF Compact; Stylistic Set 7 [/System/Library/Fonts/SFCompact.ttf]:+clig;+liga;+tlig;+ss07
+.SF Compact [/System/Library/Fonts/SFCompactItalic.ttf]:+clig;+liga;+tlig
+.SF Compact; Stylistic Set 1 [/System/Library/Fonts/SFCompactItalic.ttf]:+clig;+liga;+tlig;+ss01
+.SF Compact; Stylistic Set 2 [/System/Library/Fonts/SFCompactItalic.ttf]:+clig;+liga;+tlig;+ss02
+.SF Compact; Stylistic Set 3 [/System/Library/Fonts/SFCompactItalic.ttf]:+clig;+liga;+tlig;+ss03
+.SF Compact; Stylistic Set 6 [/System/Library/Fonts/SFCompactItalic.ttf]:+clig;+liga;+tlig;+ss06
+.SF Compact; Stylistic Set 7 [/System/Library/Fonts/SFCompactItalic.ttf]:+clig;+liga;+tlig;+ss07
+.SF NS Mono Light [/System/Library/Fonts/SFNSMono.ttf]:+clig;+liga;+tlig
+.SF NS Mono Light; Small Capitals [/System/Library/Fonts/SFNSMono.ttf]:+clig;+liga;+tlig;+smcp
+.SF NS Mono Light; Stylistic Set 3 [/System/Library/Fonts/SFNSMono.ttf]:+clig;+liga;+tlig;+ss03
+.SF NS Mono Light; Stylistic Set 4 [/System/Library/Fonts/SFNSMono.ttf]:+clig;+liga;+tlig;+ss04
+.SF NS Mono Light Italic [/System/Library/Fonts/SFNSMonoItalic.ttf]:+clig;+liga;+tlig
+.SF NS Mono Light Italic; Small Capitals [/System/Library/Fonts/SFNSMonoItalic.ttf]:+clig;+liga;+tlig;+smcp
+.SF NS Mono Light Italic; Stylistic Set 3 [/System/Library/Fonts/SFNSMonoItalic.ttf]:+clig;+liga;+tlig;+ss03
+.SF NS Mono Light Italic; Stylistic Set 4 [/System/Library/Fonts/SFNSMonoItalic.ttf]:+clig;+liga;+tlig;+ss04
+.SF NS Rounded [/System/Library/Fonts/SFNSRounded.ttf]:+clig;+liga;+tlig
+.SF NS Rounded; Small Capitals [/System/Library/Fonts/SFNSRounded.ttf]:+clig;+liga;+tlig;+smcp
+.SF NS Rounded; Stylistic Set 1 [/System/Library/Fonts/SFNSRounded.ttf]:+clig;+liga;+tlig;+ss01
+.SF NS Rounded; Stylistic Set 2 [/System/Library/Fonts/SFNSRounded.ttf]:+clig;+liga;+tlig;+ss02
+.SF NS Rounded; Stylistic Set 3 [/System/Library/Fonts/SFNSRounded.ttf]:+clig;+liga;+tlig;+ss03
+.SF NS Rounded; Stylistic Set 6 [/System/Library/Fonts/SFNSRounded.ttf]:+clig;+liga;+tlig;+ss06
+.SF NS Rounded; Stylistic Set 7 [/System/Library/Fonts/SFNSRounded.ttf]:+clig;+liga;+tlig;+ss07
+.SF Soft Numeric [/System/Library/Fonts/ADTNumeric.ttc](0):+clig;+liga;+tlig
+.ThonburiUI Regular [/System/Library/Fonts/ThonburiUI.ttc](0):+clig;+liga;+tlig
+.ThonburiUIWatch Regular [/System/Library/Fonts/ThonburiUI.ttc](1):+clig;+liga;+tlig
+ADFBaskerville [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Reg.otf]:+clig;+liga;+tlig
+ADFBaskerville; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Reg.otf]:+clig;+liga;+tlig;+hist
+ADFBaskerville; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Reg.otf]:+clig;+liga;+tlig;+onum
+ADFBaskerville; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Reg.otf]:+clig;+liga;+tlig;+smcp
+ADFBaskerville-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Bol.otf]:+clig;+liga;+tlig
+ADFBaskerville-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Bol.otf]:+clig;+liga;+tlig;+hist
+ADFBaskerville-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Bol.otf]:+clig;+liga;+tlig;+onum
+ADFBaskerville-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Bol.otf]:+clig;+liga;+tlig;+smcp
+ADFBaskerville-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-BolIta.otf]:+clig;+liga;+tlig
+ADFBaskerville-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-BolIta.otf]:+clig;+liga;+tlig;+hist
+ADFBaskerville-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-BolIta.otf]:+clig;+liga;+tlig;+onum
+ADFBaskerville-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-BolIta.otf]:+clig;+liga;+tlig;+smcp
+ADFBaskerville-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Ita.otf]:+clig;+liga;+tlig
+ADFBaskerville-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Ita.otf]:+clig;+liga;+tlig;+hist
+ADFBaskerville-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Ita.otf]:+clig;+liga;+tlig;+onum
+ADFBaskerville-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervaldx/Baskervaldx-Ita.otf]:+clig;+liga;+tlig;+smcp
+ALM Fixed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/almfixed/almfixed.ttf]:+clig;+liga;+tlig
+ALM Fixed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/almfixed/almfixed.ttf]:+clig;+liga;+tlig;+onum
+ALMFixed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/almfixed/almfixed.otf]:+clig;+liga;+tlig
+ALMFixed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/almfixed/almfixed.otf]:+clig;+liga;+tlig;+onum
+AR PL KaitiM Big5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/arphic-ttf/bkai00mp.ttf]:+clig;+liga;+tlig
+AR PL KaitiM GB [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/arphic-ttf/gkai00mp.ttf]:+clig;+liga;+tlig
+AR PL Mingti2L Big5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/arphic-ttf/bsmi00lp.ttf]:+clig;+liga;+tlig
+AR PL SungtiL GB [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/arphic-ttf/gbsn00lp.ttf]:+clig;+liga;+tlig
+Aboensis Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aboensis/Aboensis-Regular.otf]:+clig;+liga;+tlig
+Aboensis Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aboensis/Aboensis-Regular.otf]:+clig;+liga;+tlig;+onum
+Aboensis Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aboensis/Aboensis-Regular.otf]:+clig;+liga;+tlig;+ss01
+Aboensis Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aboensis/Aboensis-Regular.otf]:+clig;+liga;+tlig;+ss02
+Aboensis Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aboensis/Aboensis-Regular.otf]:+clig;+liga;+tlig;+ss03
+Aboensis Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aboensis/Aboensis-Regular.otf]:+clig;+liga;+tlig;+ss04
+Aboensis Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aboensis/Aboensis-Regular.otf]:+clig;+liga;+tlig;+ss05
+Aboensis Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aboensis/Aboensis-Regular.otf]:+clig;+liga;+tlig;+swsh
+Academicons [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/academicons/academicons.ttf]:+clig;+liga;+tlig
+Acathist [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Acathist-Regular.otf]:+clig;+liga;+tlig
+Acathist; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Acathist-Regular.otf]:+clig;+liga;+tlig;+ss01
+AccanthisADFStdNo3-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Bold.otf]:+clig;+liga;+tlig
+AccanthisADFStdNo3-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Bold.otf]:+clig;+liga;+tlig;+hist
+AccanthisADFStdNo3-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Bold.otf]:+clig;+liga;+tlig;+ss01
+AccanthisADFStdNo3-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Bold.otf]:+clig;+liga;+tlig;+ss02
+AccanthisADFStdNo3-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-BoldItalic.otf]:+clig;+liga;+tlig
+AccanthisADFStdNo3-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+AccanthisADFStdNo3-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+AccanthisADFStdNo3-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+AccanthisADFStdNo3-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Italic.otf]:+clig;+liga;+tlig
+AccanthisADFStdNo3-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Italic.otf]:+clig;+liga;+tlig;+hist
+AccanthisADFStdNo3-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Italic.otf]:+clig;+liga;+tlig;+ss01
+AccanthisADFStdNo3-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Italic.otf]:+clig;+liga;+tlig;+ss02
+AccanthisADFStdNo3-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Regular.otf]:+clig;+liga;+tlig
+AccanthisADFStdNo3-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Regular.otf]:+clig;+liga;+tlig;+hist
+AccanthisADFStdNo3-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Regular.otf]:+clig;+liga;+tlig;+ss01
+AccanthisADFStdNo3-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/accanthis/AccanthisADFStdNo3-Regular.otf]:+clig;+liga;+tlig;+ss02
+Adishila [/Users/bveytsman/Library/Fonts/AdishilaN.ttf]:+clig;+liga;+tlig
+Adishila Bold [/Users/bveytsman/Library/Fonts/AdishilaBoldB.ttf]:+clig;+liga;+tlig
+Adishila Heavy [/Users/bveytsman/Library/Fonts/AdishilaHeavyH.ttf]:+clig;+liga;+tlig
+Adishila Heavy Italic [/Users/bveytsman/Library/Fonts/AdishilaHeavyItalicI.ttf]:+clig;+liga;+tlig
+Adishila Italic [/Users/bveytsman/Library/Fonts/AdishilaItalicI.ttf]:+clig;+liga;+tlig
+Adishila San [/Users/bveytsman/Library/Fonts/AdishilaSanN.ttf]:+clig;+liga;+tlig
+Adishila San Bold [/Users/bveytsman/Library/Fonts/AdishilaSanBoldB.ttf]:+clig;+liga;+tlig
+Adishila San Bold Italic [/Users/bveytsman/Library/Fonts/AdishilaSanBoldItalicI.ttf]:+clig;+liga;+tlig
+Adishila San Italic [/Users/bveytsman/Library/Fonts/AdishilaSanItalicI.ttf]:+clig;+liga;+tlig
+Adishila SemiBold [/Users/bveytsman/Library/Fonts/AdishilaSemiBoldB.ttf]:+clig;+liga;+tlig
+Adishila-BoldItalic [/Users/bveytsman/Library/Fonts/AdishilaBoldItalicBI.ttf]:+clig;+liga;+tlig
+AdishilaDev [/Users/bveytsman/Library/Fonts/AdishilaDev.ttf]:+clig;+liga;+tlig
+AdishilaDev Bold [/Users/bveytsman/Library/Fonts/AdishilaDevB.ttf]:+clig;+liga;+tlig
+AdishilaDevGuru [/Users/bveytsman/Library/Fonts/AdishilaDevGuru.ttf]:+clig;+liga;+tlig
+AdishilaSamskrta [/Users/bveytsman/Library/Fonts/AdishilaSamskrta.ttf]:+clig;+liga;+tlig
+AdishilaSamskrta Letterpress [/Users/bveytsman/Library/Fonts/AdishilaSamskrtaLetterpress.ttf]:+clig;+liga;+tlig
+AeBonum-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-bolditalic.otf]:+clig;+liga;+tlig
+AeBonum-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AeBonum-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AeBonum-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AeBonum-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AeBonum-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AeBonum-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AeBonum-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-italic.otf]:+clig;+liga;+tlig
+AeBonum-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-italic.otf]:+clig;+liga;+tlig;+onum
+AeBonum-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-italic.otf]:+clig;+liga;+tlig;+smcp
+AeBonum-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-italic.otf]:+clig;+liga;+tlig;+ss01
+AeBonum-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-italic.otf]:+clig;+liga;+tlig;+ss02
+AeBonum-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-italic.otf]:+clig;+liga;+tlig;+ss03
+AeBonum-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aebonum-italic.otf]:+clig;+liga;+tlig;+ss04
+AeMMono10-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemmono10-italic.otf]:+clig;+liga;+tlig
+AeMMono10-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemmono10-italic.otf]:+clig;+liga;+tlig;+onum
+AeMRoman10-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman10-bolditalic.otf]:+clig;+liga;+tlig
+AeMRoman10-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman10-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AeMRoman10-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman10-italic.otf]:+clig;+liga;+tlig
+AeMRoman10-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman10-italic.otf]:+clig;+liga;+tlig;+onum
+AeMRoman12-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman12-italic.otf]:+clig;+liga;+tlig
+AeMRoman12-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman12-italic.otf]:+clig;+liga;+tlig;+onum
+AeMRoman7-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman7-italic.otf]:+clig;+liga;+tlig
+AeMRoman7-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman7-italic.otf]:+clig;+liga;+tlig;+onum
+AeMRoman8-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman8-italic.otf]:+clig;+liga;+tlig
+AeMRoman8-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman8-italic.otf]:+clig;+liga;+tlig;+onum
+AeMRoman9-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman9-italic.otf]:+clig;+liga;+tlig
+AeMRoman9-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aemroman9-italic.otf]:+clig;+liga;+tlig;+onum
+AePagella-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-bolditalic.otf]:+clig;+liga;+tlig
+AePagella-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AePagella-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AePagella-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AePagella-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AePagella-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AePagella-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AePagella-BoldItalic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-bolditalic.otf]:+clig;+liga;+tlig;+ss10
+AePagella-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-italic.otf]:+clig;+liga;+tlig
+AePagella-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-italic.otf]:+clig;+liga;+tlig;+onum
+AePagella-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-italic.otf]:+clig;+liga;+tlig;+smcp
+AePagella-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-italic.otf]:+clig;+liga;+tlig;+ss01
+AePagella-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-italic.otf]:+clig;+liga;+tlig;+ss02
+AePagella-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-italic.otf]:+clig;+liga;+tlig;+ss03
+AePagella-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-italic.otf]:+clig;+liga;+tlig;+ss04
+AePagella-Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aepagella-italic.otf]:+clig;+liga;+tlig;+ss10
+AeSchola-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-bolditalic.otf]:+clig;+liga;+tlig
+AeSchola-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AeSchola-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AeSchola-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AeSchola-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AeSchola-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AeSchola-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AeSchola-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-italic.otf]:+clig;+liga;+tlig
+AeSchola-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-italic.otf]:+clig;+liga;+tlig;+onum
+AeSchola-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-italic.otf]:+clig;+liga;+tlig;+smcp
+AeSchola-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-italic.otf]:+clig;+liga;+tlig;+ss01
+AeSchola-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-italic.otf]:+clig;+liga;+tlig;+ss02
+AeSchola-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-italic.otf]:+clig;+liga;+tlig;+ss03
+AeSchola-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/aesupp/aeschola-italic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Black.otf]:+clig;+liga;+tlig
+Alegreya Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Black.otf]:+clig;+liga;+tlig;+onum
+Alegreya Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Black.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Black.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Black.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Black.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Black.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BlackItalic.otf]:+clig;+liga;+tlig
+Alegreya Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BlackItalic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Black Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Bold.otf]:+clig;+liga;+tlig
+Alegreya Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Bold.otf]:+clig;+liga;+tlig;+onum
+Alegreya Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Bold.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Bold.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Bold.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Bold.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Bold.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BoldItalic.otf]:+clig;+liga;+tlig
+Alegreya Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBold.otf]:+clig;+liga;+tlig
+Alegreya ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Alegreya ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+Alegreya ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Alegreya ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Alegreya ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+Alegreya ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Alegreya ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Alegreya ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya ExtraBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Italic.otf]:+clig;+liga;+tlig
+Alegreya Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Italic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Italic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Italic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Italic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Italic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Italic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Medium.otf]:+clig;+liga;+tlig
+Alegreya Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Medium.otf]:+clig;+liga;+tlig;+onum
+Alegreya Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Medium.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Medium.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Medium.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Medium.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Medium.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-MediumItalic.otf]:+clig;+liga;+tlig
+Alegreya Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Regular.otf]:+clig;+liga;+tlig
+Alegreya Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Regular.otf]:+clig;+liga;+tlig;+onum
+Alegreya Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Regular.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Regular.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Regular.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Regular.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/Alegreya-Regular.otf]:+clig;+liga;+tlig;+ss05
+Alegreya SC Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Black.otf]:+clig;+liga;+tlig
+Alegreya SC Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Black.otf]:+clig;+liga;+tlig;+onum
+Alegreya SC Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Black.otf]:+clig;+liga;+tlig;+ss01
+Alegreya SC Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Black.otf]:+clig;+liga;+tlig;+ss03
+Alegreya SC Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Black.otf]:+clig;+liga;+tlig;+ss04
+Alegreya SC Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Black.otf]:+clig;+liga;+tlig;+ss05
+Alegreya SC Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BlackItalic.otf]:+clig;+liga;+tlig
+Alegreya SC Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya SC Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya SC Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya SC Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya SC Black Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya SC Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Bold.otf]:+clig;+liga;+tlig
+Alegreya SC Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Bold.otf]:+clig;+liga;+tlig;+onum
+Alegreya SC Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Bold.otf]:+clig;+liga;+tlig;+ss01
+Alegreya SC Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Bold.otf]:+clig;+liga;+tlig;+ss03
+Alegreya SC Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Bold.otf]:+clig;+liga;+tlig;+ss04
+Alegreya SC Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Bold.otf]:+clig;+liga;+tlig;+ss05
+Alegreya SC Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BoldItalic.otf]:+clig;+liga;+tlig
+Alegreya SC Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya SC Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya SC Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya SC Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya SC Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya SC ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBold.otf]:+clig;+liga;+tlig
+Alegreya SC ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Alegreya SC ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Alegreya SC ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Alegreya SC ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+Alegreya SC ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Alegreya SC ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Alegreya SC ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya SC ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya SC ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya SC ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya SC ExtraBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya SC Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Italic.otf]:+clig;+liga;+tlig
+Alegreya SC Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Italic.otf]:+clig;+liga;+tlig;+onum
+Alegreya SC Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Italic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya SC Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Italic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya SC Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Italic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya SC Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Italic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya SC Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Medium.otf]:+clig;+liga;+tlig
+Alegreya SC Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Medium.otf]:+clig;+liga;+tlig;+onum
+Alegreya SC Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Medium.otf]:+clig;+liga;+tlig;+ss01
+Alegreya SC Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Medium.otf]:+clig;+liga;+tlig;+ss03
+Alegreya SC Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Medium.otf]:+clig;+liga;+tlig;+ss04
+Alegreya SC Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Medium.otf]:+clig;+liga;+tlig;+ss05
+Alegreya SC Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-MediumItalic.otf]:+clig;+liga;+tlig
+Alegreya SC Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya SC Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya SC Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya SC Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya SC Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya SC Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Regular.otf]:+clig;+liga;+tlig
+Alegreya SC Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Regular.otf]:+clig;+liga;+tlig;+onum
+Alegreya SC Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Regular.otf]:+clig;+liga;+tlig;+ss01
+Alegreya SC Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Regular.otf]:+clig;+liga;+tlig;+ss03
+Alegreya SC Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Regular.otf]:+clig;+liga;+tlig;+ss04
+Alegreya SC Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSC-Regular.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Black.otf]:+clig;+liga;+tlig
+Alegreya Sans Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Black.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Black.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Black.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Black.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Black.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Black.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BlackItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BlackItalic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Black Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Bold.otf]:+clig;+liga;+tlig
+Alegreya Sans Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Bold.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Bold.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Bold.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Bold.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Bold.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Bold.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BoldItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBold.otf]:+clig;+liga;+tlig
+Alegreya Sans ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans ExtraBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Italic.otf]:+clig;+liga;+tlig
+Alegreya Sans Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Italic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Italic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Italic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Italic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Italic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Italic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Light.otf]:+clig;+liga;+tlig
+Alegreya Sans Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Light.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Light.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Light.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Light.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Light.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Light.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-LightItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Medium.otf]:+clig;+liga;+tlig
+Alegreya Sans Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Medium.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Medium.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Medium.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Medium.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Medium.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Medium.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-MediumItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Regular.otf]:+clig;+liga;+tlig
+Alegreya Sans Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Regular.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Regular.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Regular.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Regular.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Regular.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Regular.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Black.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Black.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Black.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Black.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Black.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Black.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BlackItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Black Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Bold.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Bold.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Bold.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Bold.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Bold.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Bold.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BoldItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBold.otf]:+clig;+liga;+tlig
+Alegreya Sans SC ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans SC ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC ExtraBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Italic.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Italic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Italic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Italic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Italic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Italic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Light.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Light.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Light.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Light.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Light.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Light.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-LightItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Medium.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Medium.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Medium.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Medium.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Medium.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Medium.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-MediumItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Regular.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Regular.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Regular.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Regular.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Regular.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Regular.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Thin.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Thin.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Thin.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Thin.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Thin.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-Thin.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans SC Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ThinItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans SC Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans SC Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans SC Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans SC Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans SC Thin Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSansSC-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Thin.otf]:+clig;+liga;+tlig
+Alegreya Sans Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Thin.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Thin.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Thin.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Thin.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Thin.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-Thin.otf]:+clig;+liga;+tlig;+ss05
+Alegreya Sans Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ThinItalic.otf]:+clig;+liga;+tlig
+Alegreya Sans Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Alegreya Sans Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ThinItalic.otf]:+clig;+liga;+tlig;+smcp
+Alegreya Sans Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Alegreya Sans Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Alegreya Sans Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+Alegreya Sans Thin Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/huerta/alegreya/AlegreyaSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+Alkalami Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Light.ttf]:+clig;+liga;+tlig
+Alkalami Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Light.ttf]:+clig;+liga;+tlig;+onum
+Alkalami Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Light.ttf]:+clig;+liga;+tlig;+smcp
+Alkalami Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Light.ttf]:+clig;+liga;+tlig;+ss01
+Alkalami Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Light.ttf]:+clig;+liga;+tlig;+ss02
+Alkalami Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Light.ttf]:+clig;+liga;+tlig;+ss03
+Alkalami Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Light.ttf]:+clig;+liga;+tlig;+ss04
+Alkalami Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Light.ttf]:+clig;+liga;+tlig;+ss05
+Alkalami Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Light.ttf]:+clig;+liga;+tlig;+ss07
+Alkalami Light; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Light.ttf]:+clig;+liga;+tlig;+ss08
+Alkalami Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Regular.ttf]:+clig;+liga;+tlig
+Alkalami Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Regular.ttf]:+clig;+liga;+tlig;+onum
+Alkalami Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Alkalami Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Alkalami Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Alkalami Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Alkalami Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Alkalami Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Alkalami Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Alkalami Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/alkalami/Alkalami-Regular.ttf]:+clig;+liga;+tlig;+ss08
+Almendra Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/almendra/Almendra-Bold.ttf]:+clig;+liga;+tlig
+Almendra Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/almendra/Almendra-BoldItalic.ttf]:+clig;+liga;+tlig
+Almendra Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/almendra/Almendra-Italic.ttf]:+clig;+liga;+tlig
+Almendra Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/almendra/Almendra-Regular.ttf]:+clig;+liga;+tlig
+Almendra SC Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/almendra/AlmendraSC-Regular.ttf]:+clig;+liga;+tlig
+Alpha Slab One Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/alfaslabone/AlphaSlabOne-Regular.otf]:+clig;+liga;+tlig
+Amiri Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Bold.ttf]:+clig;+liga;+tlig
+Amiri Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Amiri Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Amiri Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Amiri Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Amiri Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Amiri Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Bold.ttf]:+clig;+liga;+tlig;+ss06
+Amiri Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Bold.ttf]:+clig;+liga;+tlig;+ss07
+Amiri Bold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Bold.ttf]:+clig;+liga;+tlig;+ss08
+Amiri Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-BoldItalic.ttf]:+clig;+liga;+tlig
+Amiri Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Amiri Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Amiri Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Amiri Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Amiri Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-BoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Amiri Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-BoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Amiri Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-BoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Amiri Bold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-BoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Amiri Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Italic.ttf]:+clig;+liga;+tlig
+Amiri Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Amiri Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Amiri Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Amiri Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Amiri Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Italic.ttf]:+clig;+liga;+tlig;+ss05
+Amiri Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Italic.ttf]:+clig;+liga;+tlig;+ss06
+Amiri Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Italic.ttf]:+clig;+liga;+tlig;+ss07
+Amiri Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Italic.ttf]:+clig;+liga;+tlig;+ss08
+Amiri Quran Colored Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuranColored.ttf]:+clig;+liga;+tlig
+Amiri Quran Colored Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuranColored.ttf]:+clig;+liga;+tlig;+ss01
+Amiri Quran Colored Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuranColored.ttf]:+clig;+liga;+tlig;+ss02
+Amiri Quran Colored Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuranColored.ttf]:+clig;+liga;+tlig;+ss05
+Amiri Quran Colored Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuranColored.ttf]:+clig;+liga;+tlig;+ss07
+Amiri Quran Colored Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuranColored.ttf]:+clig;+liga;+tlig;+ss08
+Amiri Quran Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuran.ttf]:+clig;+liga;+tlig
+Amiri Quran Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuran.ttf]:+clig;+liga;+tlig;+ss01
+Amiri Quran Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuran.ttf]:+clig;+liga;+tlig;+ss02
+Amiri Quran Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuran.ttf]:+clig;+liga;+tlig;+ss05
+Amiri Quran Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuran.ttf]:+clig;+liga;+tlig;+ss07
+Amiri Quran Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/AmiriQuran.ttf]:+clig;+liga;+tlig;+ss08
+Amiri Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Regular.ttf]:+clig;+liga;+tlig
+Amiri Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Amiri Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Amiri Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Amiri Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Amiri Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Amiri Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Amiri Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Amiri Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/amiri/Amiri-Regular.ttf]:+clig;+liga;+tlig;+ss08
+Amnesty Trade Gothic Bold Condensed No. 20 [/usr/local/texlive/texmf-local/fonts/truetype/linotype/amnesty/AmnestyTradeGothic-BdCn20.ttf]:+clig;+liga;+tlig
+Amnesty Trade Gothic Bold Condensed No. 20 Oblique [/usr/local/texlive/texmf-local/fonts/truetype/linotype/amnesty/AmnestyTradeGothic-BdCn20Ob.ttf]:+clig;+liga;+tlig
+Amnesty Trade Gothic Bold No. 2 [/usr/local/texlive/texmf-local/fonts/truetype/linotype/amnesty/AmnestyTradeGothic-Bd2.ttf]:+clig;+liga;+tlig
+Amnesty Trade Gothic Bold No. 2 Oblique [/usr/local/texlive/texmf-local/fonts/truetype/linotype/amnesty/AmnestyTradeGothic-Bd2Obl.ttf]:+clig;+liga;+tlig
+Amnesty Trade Gothic Condensed No. 18 [/usr/local/texlive/texmf-local/fonts/truetype/linotype/amnesty/AmnestyTradeGothic-Cn18.ttf]:+clig;+liga;+tlig
+Amnesty Trade Gothic Condensed No. 18 Oblique [/usr/local/texlive/texmf-local/fonts/truetype/linotype/amnesty/AmnestyTradeGothic-Cn18Obl.ttf]:+clig;+liga;+tlig
+Amnesty Trade Gothic Light [/usr/local/texlive/texmf-local/fonts/truetype/linotype/amnesty/AmnestyTradeGothic-Light.ttf]:+clig;+liga;+tlig
+Amnesty Trade Gothic Light Oblique [/usr/local/texlive/texmf-local/fonts/truetype/linotype/amnesty/AmnestyTradeGothic-LightObl.ttf]:+clig;+liga;+tlig
+Amnesty Trade Gothic Oblique [/usr/local/texlive/texmf-local/fonts/truetype/linotype/amnesty/AmnestyTradeGothic-Obl.ttf]:+clig;+liga;+tlig
+Amnesty Trade Gothic Regular [/usr/local/texlive/texmf-local/fonts/truetype/linotype/amnesty/AmnestyTradeGothic.ttf]:+clig;+liga;+tlig
+Andika [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Regular.ttf]:+clig;+liga;+tlig
+Andika; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Andika; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Andika; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Andika; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Andika; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Regular.ttf]:+clig;+liga;+tlig;+ss13
+Andika; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Regular.ttf]:+clig;+liga;+tlig;+ss14
+Andika Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Bold.ttf]:+clig;+liga;+tlig
+Andika Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Andika Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Andika Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Andika Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Andika Bold; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Bold.ttf]:+clig;+liga;+tlig;+ss13
+Andika Bold; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Bold.ttf]:+clig;+liga;+tlig;+ss14
+Andika Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-BoldItalic.ttf]:+clig;+liga;+tlig
+Andika Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Andika Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Andika Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Andika Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-BoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Andika Bold Italic; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-BoldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Andika Bold Italic; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-BoldItalic.ttf]:+clig;+liga;+tlig;+ss14
+Andika Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Italic.ttf]:+clig;+liga;+tlig
+Andika Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Andika Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Andika Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Andika Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Italic.ttf]:+clig;+liga;+tlig;+ss05
+Andika Italic; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Italic.ttf]:+clig;+liga;+tlig;+ss13
+Andika Italic; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/andika/Andika-Italic.ttf]:+clig;+liga;+tlig;+ss14
+AnnabelleMatineeNF [/usr/local/texlive/texmf-local/fonts/truetype/Nicks/ANNAMN__.ttf]:+clig;+liga;+tlig
+Anonymous [/usr/local/texlive/texmf-local/fonts/truetype/Simonson/AnonymousTT/Anonymous.ttf]:+clig;+liga;+tlig
+Anonymous Pro [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/anonymouspro/AnonymousPro-Regular.ttf]:+clig;+liga;+tlig
+Anonymous Pro Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/anonymouspro/AnonymousPro-Bold.ttf]:+clig;+liga;+tlig
+Anonymous Pro Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/anonymouspro/AnonymousPro-BoldItalic.ttf]:+clig;+liga;+tlig
+Anonymous Pro Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/anonymouspro/AnonymousPro-Italic.ttf]:+clig;+liga;+tlig
+AntPolt-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bold.otf]:+clig;+liga;+tlig
+AntPolt-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bold.otf]:+clig;+liga;+tlig;+onum
+AntPolt-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bold.otf]:+clig;+liga;+tlig;+smcp
+AntPolt-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bold.otf]:+clig;+liga;+tlig;+ss01
+AntPolt-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bold.otf]:+clig;+liga;+tlig;+ss02
+AntPolt-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bold.otf]:+clig;+liga;+tlig;+ss03
+AntPolt-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bold.otf]:+clig;+liga;+tlig;+ss04
+AntPolt-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bolditalic.otf]:+clig;+liga;+tlig
+AntPolt-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AntPolt-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AntPolt-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AntPolt-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AntPolt-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AntPolt-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AntPolt-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-italic.otf]:+clig;+liga;+tlig
+AntPolt-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-italic.otf]:+clig;+liga;+tlig;+onum
+AntPolt-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-italic.otf]:+clig;+liga;+tlig;+smcp
+AntPolt-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-italic.otf]:+clig;+liga;+tlig;+ss01
+AntPolt-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-italic.otf]:+clig;+liga;+tlig;+ss02
+AntPolt-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-italic.otf]:+clig;+liga;+tlig;+ss03
+AntPolt-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-italic.otf]:+clig;+liga;+tlig;+ss04
+AntPolt-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-regular.otf]:+clig;+liga;+tlig
+AntPolt-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-regular.otf]:+clig;+liga;+tlig;+onum
+AntPolt-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-regular.otf]:+clig;+liga;+tlig;+smcp
+AntPolt-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-regular.otf]:+clig;+liga;+tlig;+ss01
+AntPolt-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-regular.otf]:+clig;+liga;+tlig;+ss02
+AntPolt-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-regular.otf]:+clig;+liga;+tlig;+ss03
+AntPolt-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpolt-regular.otf]:+clig;+liga;+tlig;+ss04
+AntPoltCond-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bold.otf]:+clig;+liga;+tlig
+AntPoltCond-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bold.otf]:+clig;+liga;+tlig;+onum
+AntPoltCond-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bold.otf]:+clig;+liga;+tlig;+smcp
+AntPoltCond-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bold.otf]:+clig;+liga;+tlig;+ss01
+AntPoltCond-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bold.otf]:+clig;+liga;+tlig;+ss02
+AntPoltCond-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bold.otf]:+clig;+liga;+tlig;+ss03
+AntPoltCond-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bold.otf]:+clig;+liga;+tlig;+ss04
+AntPoltCond-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bolditalic.otf]:+clig;+liga;+tlig
+AntPoltCond-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AntPoltCond-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltCond-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltCond-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltCond-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltCond-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltCond-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-italic.otf]:+clig;+liga;+tlig
+AntPoltCond-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-italic.otf]:+clig;+liga;+tlig;+onum
+AntPoltCond-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-italic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltCond-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-italic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltCond-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-italic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltCond-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-italic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltCond-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-italic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltCond-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-regular.otf]:+clig;+liga;+tlig
+AntPoltCond-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-regular.otf]:+clig;+liga;+tlig;+onum
+AntPoltCond-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-regular.otf]:+clig;+liga;+tlig;+smcp
+AntPoltCond-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-regular.otf]:+clig;+liga;+tlig;+ss01
+AntPoltCond-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-regular.otf]:+clig;+liga;+tlig;+ss02
+AntPoltCond-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-regular.otf]:+clig;+liga;+tlig;+ss03
+AntPoltCond-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltcond-regular.otf]:+clig;+liga;+tlig;+ss04
+AntPoltExpd-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bold.otf]:+clig;+liga;+tlig
+AntPoltExpd-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bold.otf]:+clig;+liga;+tlig;+onum
+AntPoltExpd-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bold.otf]:+clig;+liga;+tlig;+smcp
+AntPoltExpd-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bold.otf]:+clig;+liga;+tlig;+ss01
+AntPoltExpd-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bold.otf]:+clig;+liga;+tlig;+ss02
+AntPoltExpd-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bold.otf]:+clig;+liga;+tlig;+ss03
+AntPoltExpd-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bold.otf]:+clig;+liga;+tlig;+ss04
+AntPoltExpd-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bolditalic.otf]:+clig;+liga;+tlig
+AntPoltExpd-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AntPoltExpd-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltExpd-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltExpd-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltExpd-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltExpd-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltExpd-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-italic.otf]:+clig;+liga;+tlig
+AntPoltExpd-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-italic.otf]:+clig;+liga;+tlig;+onum
+AntPoltExpd-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-italic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltExpd-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-italic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltExpd-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-italic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltExpd-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-italic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltExpd-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-italic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltExpd-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-regular.otf]:+clig;+liga;+tlig
+AntPoltExpd-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-regular.otf]:+clig;+liga;+tlig;+onum
+AntPoltExpd-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-regular.otf]:+clig;+liga;+tlig;+smcp
+AntPoltExpd-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-regular.otf]:+clig;+liga;+tlig;+ss01
+AntPoltExpd-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-regular.otf]:+clig;+liga;+tlig;+ss02
+AntPoltExpd-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-regular.otf]:+clig;+liga;+tlig;+ss03
+AntPoltExpd-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltexpd-regular.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLt-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bold.otf]:+clig;+liga;+tlig
+AntPoltLt-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bold.otf]:+clig;+liga;+tlig;+onum
+AntPoltLt-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bold.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLt-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bold.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLt-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bold.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLt-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bold.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLt-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bold.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLt-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bolditalic.otf]:+clig;+liga;+tlig
+AntPoltLt-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AntPoltLt-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLt-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLt-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLt-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLt-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLt-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-italic.otf]:+clig;+liga;+tlig
+AntPoltLt-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-italic.otf]:+clig;+liga;+tlig;+onum
+AntPoltLt-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-italic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLt-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-italic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLt-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-italic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLt-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-italic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLt-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-italic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLt-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-regular.otf]:+clig;+liga;+tlig
+AntPoltLt-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-regular.otf]:+clig;+liga;+tlig;+onum
+AntPoltLt-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-regular.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLt-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-regular.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLt-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-regular.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLt-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-regular.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLt-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltlt-regular.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtCond-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bold.otf]:+clig;+liga;+tlig
+AntPoltLtCond-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bold.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtCond-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bold.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtCond-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bold.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtCond-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bold.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtCond-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bold.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtCond-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bold.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtCond-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bolditalic.otf]:+clig;+liga;+tlig
+AntPoltLtCond-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtCond-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtCond-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtCond-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtCond-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtCond-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtCond-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-italic.otf]:+clig;+liga;+tlig
+AntPoltLtCond-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-italic.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtCond-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-italic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtCond-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-italic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtCond-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-italic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtCond-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-italic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtCond-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-italic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtCond-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-regular.otf]:+clig;+liga;+tlig
+AntPoltLtCond-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-regular.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtCond-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-regular.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtCond-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-regular.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtCond-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-regular.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtCond-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-regular.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtCond-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltcond-regular.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtExpd-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bold.otf]:+clig;+liga;+tlig
+AntPoltLtExpd-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bold.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtExpd-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bold.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtExpd-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bold.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtExpd-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bold.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtExpd-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bold.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtExpd-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bold.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtExpd-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bolditalic.otf]:+clig;+liga;+tlig
+AntPoltLtExpd-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtExpd-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtExpd-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtExpd-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtExpd-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtExpd-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtExpd-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-italic.otf]:+clig;+liga;+tlig
+AntPoltLtExpd-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-italic.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtExpd-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-italic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtExpd-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-italic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtExpd-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-italic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtExpd-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-italic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtExpd-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-italic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtExpd-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-regular.otf]:+clig;+liga;+tlig
+AntPoltLtExpd-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-regular.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtExpd-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-regular.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtExpd-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-regular.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtExpd-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-regular.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtExpd-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-regular.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtExpd-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltexpd-regular.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtSemiCond-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bold.otf]:+clig;+liga;+tlig
+AntPoltLtSemiCond-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bold.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtSemiCond-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bold.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtSemiCond-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bold.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtSemiCond-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bold.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtSemiCond-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bold.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtSemiCond-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bold.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtSemiCond-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bolditalic.otf]:+clig;+liga;+tlig
+AntPoltLtSemiCond-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtSemiCond-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtSemiCond-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtSemiCond-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtSemiCond-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtSemiCond-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtSemiCond-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-italic.otf]:+clig;+liga;+tlig
+AntPoltLtSemiCond-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-italic.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtSemiCond-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-italic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtSemiCond-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-italic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtSemiCond-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-italic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtSemiCond-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-italic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtSemiCond-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-italic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtSemiCond-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-regular.otf]:+clig;+liga;+tlig
+AntPoltLtSemiCond-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-regular.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtSemiCond-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-regular.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtSemiCond-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-regular.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtSemiCond-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-regular.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtSemiCond-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-regular.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtSemiCond-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemicond-regular.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtSemiExpd-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bold.otf]:+clig;+liga;+tlig
+AntPoltLtSemiExpd-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bold.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtSemiExpd-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bold.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtSemiExpd-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bold.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtSemiExpd-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bold.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtSemiExpd-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bold.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtSemiExpd-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bold.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtSemiExpd-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig
+AntPoltLtSemiExpd-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtSemiExpd-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtSemiExpd-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtSemiExpd-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtSemiExpd-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtSemiExpd-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtSemiExpd-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-italic.otf]:+clig;+liga;+tlig
+AntPoltLtSemiExpd-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-italic.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtSemiExpd-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-italic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtSemiExpd-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-italic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtSemiExpd-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-italic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtSemiExpd-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-italic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtSemiExpd-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-italic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltLtSemiExpd-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-regular.otf]:+clig;+liga;+tlig
+AntPoltLtSemiExpd-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-regular.otf]:+clig;+liga;+tlig;+onum
+AntPoltLtSemiExpd-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-regular.otf]:+clig;+liga;+tlig;+smcp
+AntPoltLtSemiExpd-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-regular.otf]:+clig;+liga;+tlig;+ss01
+AntPoltLtSemiExpd-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-regular.otf]:+clig;+liga;+tlig;+ss02
+AntPoltLtSemiExpd-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-regular.otf]:+clig;+liga;+tlig;+ss03
+AntPoltLtSemiExpd-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltltsemiexpd-regular.otf]:+clig;+liga;+tlig;+ss04
+AntPoltSemiCond-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bold.otf]:+clig;+liga;+tlig
+AntPoltSemiCond-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bold.otf]:+clig;+liga;+tlig;+onum
+AntPoltSemiCond-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bold.otf]:+clig;+liga;+tlig;+smcp
+AntPoltSemiCond-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bold.otf]:+clig;+liga;+tlig;+ss01
+AntPoltSemiCond-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bold.otf]:+clig;+liga;+tlig;+ss02
+AntPoltSemiCond-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bold.otf]:+clig;+liga;+tlig;+ss03
+AntPoltSemiCond-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bold.otf]:+clig;+liga;+tlig;+ss04
+AntPoltSemiCond-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bolditalic.otf]:+clig;+liga;+tlig
+AntPoltSemiCond-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AntPoltSemiCond-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltSemiCond-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltSemiCond-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltSemiCond-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltSemiCond-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltSemiCond-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-italic.otf]:+clig;+liga;+tlig
+AntPoltSemiCond-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-italic.otf]:+clig;+liga;+tlig;+onum
+AntPoltSemiCond-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-italic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltSemiCond-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-italic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltSemiCond-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-italic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltSemiCond-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-italic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltSemiCond-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-italic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltSemiCond-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-regular.otf]:+clig;+liga;+tlig
+AntPoltSemiCond-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-regular.otf]:+clig;+liga;+tlig;+onum
+AntPoltSemiCond-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-regular.otf]:+clig;+liga;+tlig;+smcp
+AntPoltSemiCond-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-regular.otf]:+clig;+liga;+tlig;+ss01
+AntPoltSemiCond-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-regular.otf]:+clig;+liga;+tlig;+ss02
+AntPoltSemiCond-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-regular.otf]:+clig;+liga;+tlig;+ss03
+AntPoltSemiCond-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemicond-regular.otf]:+clig;+liga;+tlig;+ss04
+AntPoltSemiExpd-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bold.otf]:+clig;+liga;+tlig
+AntPoltSemiExpd-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bold.otf]:+clig;+liga;+tlig;+onum
+AntPoltSemiExpd-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bold.otf]:+clig;+liga;+tlig;+smcp
+AntPoltSemiExpd-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bold.otf]:+clig;+liga;+tlig;+ss01
+AntPoltSemiExpd-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bold.otf]:+clig;+liga;+tlig;+ss02
+AntPoltSemiExpd-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bold.otf]:+clig;+liga;+tlig;+ss03
+AntPoltSemiExpd-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bold.otf]:+clig;+liga;+tlig;+ss04
+AntPoltSemiExpd-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig
+AntPoltSemiExpd-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+onum
+AntPoltSemiExpd-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltSemiExpd-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltSemiExpd-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltSemiExpd-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltSemiExpd-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltSemiExpd-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-italic.otf]:+clig;+liga;+tlig
+AntPoltSemiExpd-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-italic.otf]:+clig;+liga;+tlig;+onum
+AntPoltSemiExpd-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-italic.otf]:+clig;+liga;+tlig;+smcp
+AntPoltSemiExpd-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-italic.otf]:+clig;+liga;+tlig;+ss01
+AntPoltSemiExpd-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-italic.otf]:+clig;+liga;+tlig;+ss02
+AntPoltSemiExpd-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-italic.otf]:+clig;+liga;+tlig;+ss03
+AntPoltSemiExpd-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-italic.otf]:+clig;+liga;+tlig;+ss04
+AntPoltSemiExpd-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-regular.otf]:+clig;+liga;+tlig
+AntPoltSemiExpd-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-regular.otf]:+clig;+liga;+tlig;+onum
+AntPoltSemiExpd-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-regular.otf]:+clig;+liga;+tlig;+smcp
+AntPoltSemiExpd-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-regular.otf]:+clig;+liga;+tlig;+ss01
+AntPoltSemiExpd-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-regular.otf]:+clig;+liga;+tlig;+ss02
+AntPoltSemiExpd-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-regular.otf]:+clig;+liga;+tlig;+ss03
+AntPoltSemiExpd-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gust/poltawski/antpoltsemiexpd-regular.otf]:+clig;+liga;+tlig;+ss04
+AntykwaTorunska-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-Bold.otf]:+clig;+liga;+tlig
+AntykwaTorunska-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-Bold.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunska-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-Bold.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunska-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-BoldItalic.otf]:+clig;+liga;+tlig
+AntykwaTorunska-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunska-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunska-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-Italic.otf]:+clig;+liga;+tlig
+AntykwaTorunska-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-Italic.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunska-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-Italic.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunska-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-Regular.otf]:+clig;+liga;+tlig
+AntykwaTorunska-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-Regular.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunska-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunska-Regular.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaCond-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-Bold.otf]:+clig;+liga;+tlig
+AntykwaTorunskaCond-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-Bold.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaCond-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-Bold.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaCond-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-BoldItalic.otf]:+clig;+liga;+tlig
+AntykwaTorunskaCond-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaCond-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaCond-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-Italic.otf]:+clig;+liga;+tlig
+AntykwaTorunskaCond-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-Italic.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaCond-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-Italic.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaCond-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-Regular.otf]:+clig;+liga;+tlig
+AntykwaTorunskaCond-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-Regular.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaCond-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCond-Regular.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaCondLight-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondLight-Italic.otf]:+clig;+liga;+tlig
+AntykwaTorunskaCondLight-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondLight-Italic.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaCondLight-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondLight-Italic.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaCondLight-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondLight-Regular.otf]:+clig;+liga;+tlig
+AntykwaTorunskaCondLight-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondLight-Regular.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaCondLight-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondLight-Regular.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaCondMed-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondMed-Italic.otf]:+clig;+liga;+tlig
+AntykwaTorunskaCondMed-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondMed-Italic.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaCondMed-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondMed-Italic.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaCondMed-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondMed-Regular.otf]:+clig;+liga;+tlig
+AntykwaTorunskaCondMed-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondMed-Regular.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaCondMed-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaCondMed-Regular.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaLight-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaLight-Italic.otf]:+clig;+liga;+tlig
+AntykwaTorunskaLight-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaLight-Italic.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaLight-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaLight-Italic.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaLight-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaLight-Regular.otf]:+clig;+liga;+tlig
+AntykwaTorunskaLight-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaLight-Regular.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaLight-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaLight-Regular.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaMed-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaMed-Italic.otf]:+clig;+liga;+tlig
+AntykwaTorunskaMed-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaMed-Italic.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaMed-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaMed-Italic.otf]:+clig;+liga;+tlig;+smcp
+AntykwaTorunskaMed-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaMed-Regular.otf]:+clig;+liga;+tlig
+AntykwaTorunskaMed-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaMed-Regular.otf]:+clig;+liga;+tlig;+onum
+AntykwaTorunskaMed-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/antt/AntykwaTorunskaMed-Regular.otf]:+clig;+liga;+tlig;+smcp
+Apple Braille [/System/Library/Fonts/Apple Braille.ttf]:+clig;+liga;+tlig
+Apple Braille Outline 6 Dot [/System/Library/Fonts/Apple Braille Outline 6 Dot.ttf]:+clig;+liga;+tlig
+Apple Braille Outline 8 Dot [/System/Library/Fonts/Apple Braille Outline 8 Dot.ttf]:+clig;+liga;+tlig
+Apple Braille Pinpoint 6 Dot [/System/Library/Fonts/Apple Braille Pinpoint 6 Dot.ttf]:+clig;+liga;+tlig
+Apple Braille Pinpoint 8 Dot [/System/Library/Fonts/Apple Braille Pinpoint 8 Dot.ttf]:+clig;+liga;+tlig
+Apple Color Emoji [/System/Library/Fonts/Apple Color Emoji.ttc](0):+clig;+liga;+tlig
+Apple SD Gothic Neo Bold [/System/Library/Fonts/AppleSDGothicNeo.ttc](6):+clig;+liga;+tlig
+Apple SD Gothic Neo ExtraBold [/System/Library/Fonts/AppleSDGothicNeo.ttc](14):+clig;+liga;+tlig
+Apple SD Gothic Neo Heavy [/System/Library/Fonts/AppleSDGothicNeo.ttc](16):+clig;+liga;+tlig
+Apple SD Gothic Neo Light [/System/Library/Fonts/AppleSDGothicNeo.ttc](8):+clig;+liga;+tlig
+Apple SD Gothic Neo Medium [/System/Library/Fonts/AppleSDGothicNeo.ttc](2):+clig;+liga;+tlig
+Apple SD Gothic Neo Regular [/System/Library/Fonts/AppleSDGothicNeo.ttc](0):+clig;+liga;+tlig
+Apple SD Gothic Neo SemiBold [/System/Library/Fonts/AppleSDGothicNeo.ttc](4):+clig;+liga;+tlig
+Apple SD Gothic Neo Thin [/System/Library/Fonts/AppleSDGothicNeo.ttc](10):+clig;+liga;+tlig
+Apple SD Gothic Neo UltraLight [/System/Library/Fonts/AppleSDGothicNeo.ttc](12):+clig;+liga;+tlig
+Apple Symbols [/System/Library/Fonts/Apple Symbols.ttf]:+clig;+liga;+tlig
+Archiv0 Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-Bold.otf]:+clig;+liga;+tlig
+Archiv0 Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-Bold.otf]:+clig;+liga;+tlig;+onum
+Archiv0 Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-BoldItalic.otf]:+clig;+liga;+tlig
+Archiv0 Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Archiv0 Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-Italic.otf]:+clig;+liga;+tlig
+Archiv0 Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-Italic.otf]:+clig;+liga;+tlig;+onum
+Archiv0 Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-Medium.otf]:+clig;+liga;+tlig
+Archiv0 Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-Medium.otf]:+clig;+liga;+tlig;+onum
+Archiv0 Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-MediumItalic.otf]:+clig;+liga;+tlig
+Archiv0 Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Archiv0 Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-Regular.otf]:+clig;+liga;+tlig
+Archiv0 Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-Regular.otf]:+clig;+liga;+tlig;+onum
+Archiv0 SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-SemiBold.otf]:+clig;+liga;+tlig
+Archiv0 SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Archiv0 SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Archiv0 SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/archivo/Archiv0-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Arial [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arial.ttf]:+clig;+liga;+tlig
+Arial; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arial.ttf]:+clig;+liga;+tlig;+onum
+Arial; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arial.ttf]:+clig;+liga;+tlig;+smcp
+Arial; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arial.ttf]:+clig;+liga;+tlig;+ss01
+Arial; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arial.ttf]:+clig;+liga;+tlig;+ss02
+Arial; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arial.ttf]:+clig;+liga;+tlig;+ss03
+Arial; Unicase [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arial.ttf]:+clig;+liga;+tlig;+unic
+Arial Black [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariblk.ttf]:+clig;+liga;+tlig
+Arial Black; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariblk.ttf]:+clig;+liga;+tlig;+onum
+Arial Black; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariblk.ttf]:+clig;+liga;+tlig;+smcp
+Arial Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariblk.ttf]:+clig;+liga;+tlig;+ss01
+Arial Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariblk.ttf]:+clig;+liga;+tlig;+ss02
+Arial Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariblk.ttf]:+clig;+liga;+tlig;+ss03
+Arial Black; Unicase [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariblk.ttf]:+clig;+liga;+tlig;+unic
+Arial Bold [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbd.ttf]:+clig;+liga;+tlig
+Arial Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbd.ttf]:+clig;+liga;+tlig;+onum
+Arial Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbd.ttf]:+clig;+liga;+tlig;+smcp
+Arial Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbd.ttf]:+clig;+liga;+tlig;+ss01
+Arial Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbd.ttf]:+clig;+liga;+tlig;+ss02
+Arial Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbd.ttf]:+clig;+liga;+tlig;+ss03
+Arial Bold; Unicase [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbd.ttf]:+clig;+liga;+tlig;+unic
+Arial Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbi.ttf]:+clig;+liga;+tlig
+Arial Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbi.ttf]:+clig;+liga;+tlig;+onum
+Arial Bold Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbi.ttf]:+clig;+liga;+tlig;+smcp
+Arial Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbi.ttf]:+clig;+liga;+tlig;+ss01
+Arial Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbi.ttf]:+clig;+liga;+tlig;+ss02
+Arial Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbi.ttf]:+clig;+liga;+tlig;+ss03
+Arial Bold Italic; Unicase [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/arialbi.ttf]:+clig;+liga;+tlig;+unic
+Arial Hebrew [/System/Library/Fonts/ArialHB.ttc](0):+clig;+liga;+tlig
+Arial Hebrew Bold [/System/Library/Fonts/ArialHB.ttc](1):+clig;+liga;+tlig
+Arial Hebrew Light [/System/Library/Fonts/ArialHB.ttc](2):+clig;+liga;+tlig
+Arial Hebrew Scholar [/System/Library/Fonts/ArialHB.ttc](6):+clig;+liga;+tlig
+Arial Hebrew Scholar Bold [/System/Library/Fonts/ArialHB.ttc](7):+clig;+liga;+tlig
+Arial Hebrew Scholar Light [/System/Library/Fonts/ArialHB.ttc](8):+clig;+liga;+tlig
+Arial Italic [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariali.ttf]:+clig;+liga;+tlig
+Arial Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariali.ttf]:+clig;+liga;+tlig;+onum
+Arial Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariali.ttf]:+clig;+liga;+tlig;+smcp
+Arial Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariali.ttf]:+clig;+liga;+tlig;+ss01
+Arial Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariali.ttf]:+clig;+liga;+tlig;+ss02
+Arial Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariali.ttf]:+clig;+liga;+tlig;+ss03
+Arial Italic; Unicase [/usr/local/texlive/texmf-local/fonts/truetype/monotype/arial/ariali.ttf]:+clig;+liga;+tlig;+unic
+Arial Unicode MS [/Library/Fonts/Arial Unicode.ttf]:+clig;+liga;+tlig
+Arimo [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/arimo/Arimo-Regular.ttf]:+clig;+liga;+tlig
+Arimo Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/arimo/Arimo-Bold.ttf]:+clig;+liga;+tlig
+Arimo Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/arimo/Arimo-BoldItalic.ttf]:+clig;+liga;+tlig
+Arimo Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/arimo/Arimo-Italic.ttf]:+clig;+liga;+tlig
+Arsenal Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Bold.otf]:+clig;+liga;+tlig
+Arsenal Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Bold.otf]:+clig;+liga;+tlig;+hist
+Arsenal Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Bold.otf]:+clig;+liga;+tlig;+smcp
+Arsenal Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Bold.otf]:+clig;+liga;+tlig;+ss01
+Arsenal Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Bold.otf]:+clig;+liga;+tlig;+ss02
+Arsenal Bold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Bold.otf]:+clig;+liga;+tlig;+swsh
+Arsenal Bold [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Bold.ttf]:+clig;+liga;+tlig
+Arsenal Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Bold.ttf]:+clig;+liga;+tlig;+hist
+Arsenal Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Arsenal Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Arsenal Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Arsenal Bold; Swash [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Bold.ttf]:+clig;+liga;+tlig;+swsh
+Arsenal Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-BoldItalic.otf]:+clig;+liga;+tlig
+Arsenal Bold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+Arsenal Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Arsenal Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Arsenal Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Arsenal Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Arsenal Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-BoldItalic.ttf]:+clig;+liga;+tlig
+Arsenal Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-BoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Arsenal Bold Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Arsenal Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Arsenal Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Arsenal Bold Italic; Swash [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-BoldItalic.ttf]:+clig;+liga;+tlig;+swsh
+Arsenal Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Italic.otf]:+clig;+liga;+tlig
+Arsenal Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Italic.otf]:+clig;+liga;+tlig;+hist
+Arsenal Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Italic.otf]:+clig;+liga;+tlig;+smcp
+Arsenal Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Italic.otf]:+clig;+liga;+tlig;+ss01
+Arsenal Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Italic.otf]:+clig;+liga;+tlig;+ss02
+Arsenal Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Italic.otf]:+clig;+liga;+tlig;+swsh
+Arsenal Italic [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Italic.ttf]:+clig;+liga;+tlig
+Arsenal Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Italic.ttf]:+clig;+liga;+tlig;+hist
+Arsenal Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Arsenal Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Arsenal Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Arsenal Italic; Swash [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Italic.ttf]:+clig;+liga;+tlig;+swsh
+Arsenal Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Regular.otf]:+clig;+liga;+tlig
+Arsenal Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Regular.otf]:+clig;+liga;+tlig;+hist
+Arsenal Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Regular.otf]:+clig;+liga;+tlig;+smcp
+Arsenal Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Regular.otf]:+clig;+liga;+tlig;+ss01
+Arsenal Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Regular.otf]:+clig;+liga;+tlig;+ss02
+Arsenal Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/arsenal/Arsenal-Regular.otf]:+clig;+liga;+tlig;+swsh
+Arsenal Regular [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Regular.ttf]:+clig;+liga;+tlig
+Arsenal Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Regular.ttf]:+clig;+liga;+tlig;+hist
+Arsenal Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Arsenal Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Arsenal Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Arsenal Regular; Swash [/usr/local/texlive/texmf-local/fonts/truetype/Shevchenko/Arsenal/Arsenal-Regular.ttf]:+clig;+liga;+tlig;+swsh
+Arvo [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/arvo/Arvo-Regular.ttf]:+clig;+liga;+tlig
+Arvo Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/arvo/Arvo-Bold.ttf]:+clig;+liga;+tlig
+Arvo Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/arvo/Arvo-BoldItalic.ttf]:+clig;+liga;+tlig
+Arvo-Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/arvo/Arvo-Italic.ttf]:+clig;+liga;+tlig
+Asana [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/asana-math/ASANA.TTC](0):+clig;+liga;+tlig
+Asana Math [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/asana-math/Asana-Math.otf]:+clig;+liga;+tlig
+Asana Math; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/asana-math/Asana-Math.otf]:+clig;+liga;+tlig;+onum
+Asana Math; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/asana-math/Asana-Math.otf]:+clig;+liga;+tlig;+ssty
+Asana Math [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/asana-math/ASANA.TTC](1):+clig;+liga;+tlig
+AtkinsonHyperlegible-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/atkinson/Atkinson-Hyperlegible-Bold-102.otf]:+clig;+liga;+tlig
+AtkinsonHyperlegible-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/atkinson/Atkinson-Hyperlegible-BoldItalic-102.otf]:+clig;+liga;+tlig
+AtkinsonHyperlegible-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/atkinson/Atkinson-Hyperlegible-Italic-102.otf]:+clig;+liga;+tlig
+AtkinsonHyperlegible-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/atkinson/Atkinson-Hyperlegible-Regular-102.otf]:+clig;+liga;+tlig
+Avenir Black [/System/Library/Fonts/Avenir.ttc](2):+clig;+liga;+tlig
+Avenir Black Oblique [/System/Library/Fonts/Avenir.ttc](3):+clig;+liga;+tlig
+Avenir Book [/System/Library/Fonts/Avenir.ttc](0):+clig;+liga;+tlig
+Avenir Book Oblique [/System/Library/Fonts/Avenir.ttc](1):+clig;+liga;+tlig
+Avenir Heavy [/System/Library/Fonts/Avenir.ttc](4):+clig;+liga;+tlig
+Avenir Heavy Oblique [/System/Library/Fonts/Avenir.ttc](5):+clig;+liga;+tlig
+Avenir Light [/System/Library/Fonts/Avenir.ttc](6):+clig;+liga;+tlig
+Avenir Light Oblique [/System/Library/Fonts/Avenir.ttc](7):+clig;+liga;+tlig
+Avenir Medium [/System/Library/Fonts/Avenir.ttc](8):+clig;+liga;+tlig
+Avenir Medium Oblique [/System/Library/Fonts/Avenir.ttc](9):+clig;+liga;+tlig
+Avenir Next Bold [/System/Library/Fonts/Avenir Next.ttc](0):+clig;+liga;+tlig
+Avenir Next Bold Italic [/System/Library/Fonts/Avenir Next.ttc](1):+clig;+liga;+tlig
+Avenir Next Condensed Bold [/System/Library/Fonts/Avenir Next Condensed.ttc](0):+clig;+liga;+tlig
+Avenir Next Condensed Bold Italic [/System/Library/Fonts/Avenir Next Condensed.ttc](1):+clig;+liga;+tlig
+Avenir Next Condensed Demi Bold [/System/Library/Fonts/Avenir Next Condensed.ttc](2):+clig;+liga;+tlig
+Avenir Next Condensed Demi Bold Italic [/System/Library/Fonts/Avenir Next Condensed.ttc](3):+clig;+liga;+tlig
+Avenir Next Condensed Heavy [/System/Library/Fonts/Avenir Next Condensed.ttc](8):+clig;+liga;+tlig
+Avenir Next Condensed Heavy Italic [/System/Library/Fonts/Avenir Next Condensed.ttc](9):+clig;+liga;+tlig
+Avenir Next Condensed Italic [/System/Library/Fonts/Avenir Next Condensed.ttc](4):+clig;+liga;+tlig
+Avenir Next Condensed Medium [/System/Library/Fonts/Avenir Next Condensed.ttc](5):+clig;+liga;+tlig
+Avenir Next Condensed Regular [/System/Library/Fonts/Avenir Next Condensed.ttc](7):+clig;+liga;+tlig
+Avenir Next Condensed Ultra Light [/System/Library/Fonts/Avenir Next Condensed.ttc](10):+clig;+liga;+tlig
+Avenir Next Condensed Ultra Light Italic [/System/Library/Fonts/Avenir Next Condensed.ttc](11):+clig;+liga;+tlig
+Avenir Next Demi Bold [/System/Library/Fonts/Avenir Next.ttc](2):+clig;+liga;+tlig
+Avenir Next Demi Bold Italic [/System/Library/Fonts/Avenir Next.ttc](3):+clig;+liga;+tlig
+Avenir Next Heavy [/System/Library/Fonts/Avenir Next.ttc](8):+clig;+liga;+tlig
+Avenir Next Heavy Italic [/System/Library/Fonts/Avenir Next.ttc](9):+clig;+liga;+tlig
+Avenir Next Italic [/System/Library/Fonts/Avenir Next.ttc](4):+clig;+liga;+tlig
+Avenir Next Medium [/System/Library/Fonts/Avenir Next.ttc](5):+clig;+liga;+tlig
+Avenir Next Medium Condensed Italic [/System/Library/Fonts/Avenir Next Condensed.ttc](6):+clig;+liga;+tlig
+Avenir Next Medium Italic [/System/Library/Fonts/Avenir Next.ttc](6):+clig;+liga;+tlig
+Avenir Next Regular [/System/Library/Fonts/Avenir Next.ttc](7):+clig;+liga;+tlig
+Avenir Next Ultra Light Italic [/System/Library/Fonts/Avenir Next.ttc](11):+clig;+liga;+tlig
+Avenir Oblique [/System/Library/Fonts/Avenir.ttc](10):+clig;+liga;+tlig
+Avenir Roman [/System/Library/Fonts/Avenir.ttc](11):+clig;+liga;+tlig
+AvenirLTStd-Black [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-Black.otf]:+clig;+liga;+tlig
+AvenirLTStd-BlackOblique [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-BlackOblique.otf]:+clig;+liga;+tlig
+AvenirLTStd-Book [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-Book.otf]:+clig;+liga;+tlig
+AvenirLTStd-BookOblique [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-BookOblique.otf]:+clig;+liga;+tlig
+AvenirLTStd-Heavy [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-Heavy.otf]:+clig;+liga;+tlig
+AvenirLTStd-HeavyOblique [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-HeavyOblique.otf]:+clig;+liga;+tlig
+AvenirLTStd-Light [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-Light.otf]:+clig;+liga;+tlig
+AvenirLTStd-LightOblique [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-LightOblique.otf]:+clig;+liga;+tlig
+AvenirLTStd-Medium [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-Medium.otf]:+clig;+liga;+tlig
+AvenirLTStd-MediumOblique [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-MediumOblique.otf]:+clig;+liga;+tlig
+AvenirLTStd-Oblique [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-Oblique.otf]:+clig;+liga;+tlig
+AvenirLTStd-Roman [/usr/local/texlive/texmf-local/fonts/opentype/linotype/avenir/AvenirLTStd-Roman.otf]:+clig;+liga;+tlig
+AvenirNext-UltraLight [/System/Library/Fonts/Avenir Next.ttc](10):+clig;+liga;+tlig
+Baekmuk Batang [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/baekmuk/batang.ttf]:+clig;+liga;+tlig
+Baekmuk Dotum [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/baekmuk/dotum.ttf]:+clig;+liga;+tlig
+Baekmuk Gulim [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/baekmuk/gulim.ttf]:+clig;+liga;+tlig
+Baekmuk Headline [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/baekmuk/hline.ttf]:+clig;+liga;+tlig
+Baloo 2 Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-Bold.ttf]:+clig;+liga;+tlig
+Baloo 2 Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Baloo 2 Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Baloo 2 ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-ExtraBold.ttf]:+clig;+liga;+tlig
+Baloo 2 ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Baloo 2 ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Baloo 2 Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-Medium.ttf]:+clig;+liga;+tlig
+Baloo 2 Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Baloo 2 Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Baloo 2 Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-Regular.ttf]:+clig;+liga;+tlig
+Baloo 2 Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Baloo 2 Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Baloo 2 SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-SemiBold.ttf]:+clig;+liga;+tlig
+Baloo 2 SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Baloo 2 SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Baloo2-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+BaskervilleF [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-Regular.otf]:+clig;+liga;+tlig
+BaskervilleF; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-Regular.otf]:+clig;+liga;+tlig;+onum
+BaskervilleF; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-Regular.otf]:+clig;+liga;+tlig;+smcp
+BaskervilleF Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-Bold.otf]:+clig;+liga;+tlig
+BaskervilleF Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-Bold.otf]:+clig;+liga;+tlig;+onum
+BaskervilleF Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-Bold.otf]:+clig;+liga;+tlig;+smcp
+BaskervilleF Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-BoldItalic.otf]:+clig;+liga;+tlig
+BaskervilleF Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+BaskervilleF Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+BaskervilleF Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+BaskervilleF Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-Italic.otf]:+clig;+liga;+tlig
+BaskervilleF Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-Italic.otf]:+clig;+liga;+tlig;+onum
+BaskervilleF Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-Italic.otf]:+clig;+liga;+tlig;+smcp
+BaskervilleF Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/baskervillef/BaskervilleF-Italic.otf]:+clig;+liga;+tlig;+ss01
+BerenisADFPro-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Bold.otf]:+clig;+liga;+tlig
+BerenisADFPro-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Bold.otf]:+clig;+liga;+tlig;+hist
+BerenisADFPro-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Bold.otf]:+clig;+liga;+tlig;+onum
+BerenisADFPro-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Bold.otf]:+clig;+liga;+tlig;+ss01
+BerenisADFPro-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-BoldItalic.otf]:+clig;+liga;+tlig
+BerenisADFPro-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+BerenisADFPro-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+BerenisADFPro-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+BerenisADFPro-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Italic.otf]:+clig;+liga;+tlig
+BerenisADFPro-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Italic.otf]:+clig;+liga;+tlig;+hist
+BerenisADFPro-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Italic.otf]:+clig;+liga;+tlig;+onum
+BerenisADFPro-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Italic.otf]:+clig;+liga;+tlig;+ss01
+BerenisADFPro-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Regular.otf]:+clig;+liga;+tlig
+BerenisADFPro-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Regular.otf]:+clig;+liga;+tlig;+hist
+BerenisADFPro-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Regular.otf]:+clig;+liga;+tlig;+onum
+BerenisADFPro-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFPro-Regular.otf]:+clig;+liga;+tlig;+ss01
+BerenisADFProSC-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Bold.otf]:+clig;+liga;+tlig
+BerenisADFProSC-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Bold.otf]:+clig;+liga;+tlig;+hist
+BerenisADFProSC-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Bold.otf]:+clig;+liga;+tlig;+onum
+BerenisADFProSC-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Bold.otf]:+clig;+liga;+tlig;+ss01
+BerenisADFProSC-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-BoldItalic.otf]:+clig;+liga;+tlig
+BerenisADFProSC-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+BerenisADFProSC-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+BerenisADFProSC-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+BerenisADFProSC-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Italic.otf]:+clig;+liga;+tlig
+BerenisADFProSC-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Italic.otf]:+clig;+liga;+tlig;+hist
+BerenisADFProSC-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Italic.otf]:+clig;+liga;+tlig;+onum
+BerenisADFProSC-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Italic.otf]:+clig;+liga;+tlig;+ss01
+BerenisADFProSC-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Regular.otf]:+clig;+liga;+tlig
+BerenisADFProSC-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Regular.otf]:+clig;+liga;+tlig;+hist
+BerenisADFProSC-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Regular.otf]:+clig;+liga;+tlig;+onum
+BerenisADFProSC-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/berenisadf/BerenisADFProSC-Regular.otf]:+clig;+liga;+tlig;+ss01
+Beuron Condensed Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/beuron/BeuronCondensed-Regular.otf]:+clig;+liga;+tlig
+Beuron Extended Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/beuron/BeuronExtended-Regular.otf]:+clig;+liga;+tlig
+Beuron Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/beuron/Beuron-Regular.otf]:+clig;+liga;+tlig
+Bild Poster v5 Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Black.otf]:+clig;+liga;+tlig
+Bild Poster v5 Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Bold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Compressed Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Black.otf]:+clig;+liga;+tlig
+Bild Poster v5 Compressed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Compressed Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Compressed Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Compressed Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Compressed Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Compressed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Bold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Compressed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Compressed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Compressed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Compressed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Compressed Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Compressed ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig
+Bild Poster v5 Compressed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Compressed ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Compressed ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Compressed ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Compressed ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Compressed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Light.otf]:+clig;+liga;+tlig
+Bild Poster v5 Compressed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Compressed Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Compressed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Compressed Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Compressed Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Compressed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Medium.otf]:+clig;+liga;+tlig
+Bild Poster v5 Compressed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Compressed Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Compressed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Compressed Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Compressed Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Compressed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Regular.otf]:+clig;+liga;+tlig
+Bild Poster v5 Compressed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Compressed Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Compressed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Compressed Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Compressed Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Compressed SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-SemiBold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Compressed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Compressed SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Compressed SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Compressed SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Compressed SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Compressed Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Thin.otf]:+clig;+liga;+tlig
+Bild Poster v5 Compressed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Compressed Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Compressed Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Compressed Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Compressed Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Compressed-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Condensed Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Black.otf]:+clig;+liga;+tlig
+Bild Poster v5 Condensed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Condensed Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Condensed Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Condensed Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Condensed Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Condensed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Bold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Condensed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Condensed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Condensed Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Condensed ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig
+Bild Poster v5 Condensed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Condensed ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Condensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Condensed ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Condensed ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Condensed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Light.otf]:+clig;+liga;+tlig
+Bild Poster v5 Condensed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Condensed Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Condensed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Condensed Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Condensed Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Condensed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Medium.otf]:+clig;+liga;+tlig
+Bild Poster v5 Condensed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Condensed Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Condensed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Condensed Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Condensed Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Condensed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Regular.otf]:+clig;+liga;+tlig
+Bild Poster v5 Condensed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Condensed Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Condensed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Condensed Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Condensed Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Condensed SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-SemiBold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Condensed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Condensed SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Condensed SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Condensed SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Condensed SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Condensed Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Thin.otf]:+clig;+liga;+tlig
+Bild Poster v5 Condensed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Condensed Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Condensed Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Condensed Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Condensed Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Condensed-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Extra Compressed Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig
+Bild Poster v5 Extra Compressed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Extra Compressed Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Extra Compressed Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Extra Compressed Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Extra Compressed Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Extra Compressed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Extra Compressed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Extra Compressed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Extra Compressed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Extra Compressed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Extra Compressed Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Extra Compressed ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig
+Bild Poster v5 Extra Compressed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Extra Compressed ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Extra Compressed ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Extra Compressed ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Extra Compressed ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Extra Compressed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig
+Bild Poster v5 Extra Compressed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Extra Compressed Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Extra Compressed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Extra Compressed Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Extra Compressed Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Extra Compressed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig
+Bild Poster v5 Extra Compressed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Extra Compressed Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Extra Compressed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Extra Compressed Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Extra Compressed Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Extra Compressed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig
+Bild Poster v5 Extra Compressed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Extra Compressed Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Extra Compressed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Extra Compressed Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Extra Compressed Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Extra Compressed SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Extra Compressed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Extra Compressed SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Extra Compressed SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Extra Compressed SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Extra Compressed SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Extra Compressed Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig
+Bild Poster v5 Extra Compressed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Extra Compressed Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Extra Compressed Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Extra Compressed Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Extra Compressed Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-ExtraLight.otf]:+clig;+liga;+tlig
+Bild Poster v5 ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Light.otf]:+clig;+liga;+tlig
+Bild Poster v5 Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Medium.otf]:+clig;+liga;+tlig
+Bild Poster v5 Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Narrow Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Black.otf]:+clig;+liga;+tlig
+Bild Poster v5 Narrow Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Narrow Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Narrow Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Narrow Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Narrow Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Narrow Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Bold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Narrow Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Narrow Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Narrow Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Narrow Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Narrow Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Narrow ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig
+Bild Poster v5 Narrow ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Narrow ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Narrow ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Narrow ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Narrow ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Narrow Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Light.otf]:+clig;+liga;+tlig
+Bild Poster v5 Narrow Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Narrow Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Narrow Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Narrow Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Narrow Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Narrow Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Medium.otf]:+clig;+liga;+tlig
+Bild Poster v5 Narrow Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Narrow Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Narrow Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Narrow Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Narrow Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Narrow Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Regular.otf]:+clig;+liga;+tlig
+Bild Poster v5 Narrow Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Narrow Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Narrow Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Narrow Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Narrow Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Narrow SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-SemiBold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Narrow SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Narrow SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Narrow SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Narrow SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Narrow SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Narrow Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Thin.otf]:+clig;+liga;+tlig
+Bild Poster v5 Narrow Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Narrow Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Narrow Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Narrow Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Narrow Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Narrow-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Regular.otf]:+clig;+liga;+tlig
+Bild Poster v5 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-SemiBold.otf]:+clig;+liga;+tlig
+Bild Poster v5 SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Skyline Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Black.otf]:+clig;+liga;+tlig
+Bild Poster v5 Skyline Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Skyline Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Skyline Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Skyline Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Skyline Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Skyline Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Bold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Skyline Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Skyline Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Skyline Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Skyline Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Skyline Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Skyline ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig
+Bild Poster v5 Skyline ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Skyline ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Skyline ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Skyline ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Skyline ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Skyline Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Light.otf]:+clig;+liga;+tlig
+Bild Poster v5 Skyline Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Skyline Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Skyline Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Skyline Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Skyline Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Skyline Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Medium.otf]:+clig;+liga;+tlig
+Bild Poster v5 Skyline Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Skyline Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Skyline Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Skyline Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Skyline Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Skyline Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Regular.otf]:+clig;+liga;+tlig
+Bild Poster v5 Skyline Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Skyline Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Skyline Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Skyline Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Skyline Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Skyline SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-SemiBold.otf]:+clig;+liga;+tlig
+Bild Poster v5 Skyline SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Skyline SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Skyline SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Skyline SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Skyline SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Skyline Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Thin.otf]:+clig;+liga;+tlig
+Bild Poster v5 Skyline Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Skyline Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Skyline Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Skyline Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Skyline Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5Skyline-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild Poster v5 Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Thin.otf]:+clig;+liga;+tlig
+Bild Poster v5 Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild Poster v5 Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild Poster v5 Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild Poster v5 Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild Poster v5 Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildPosterV5-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild Variable v3 Compressed Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV3-VF.ttf]:+clig;+liga;+tlig
+Bild Variable v3 Compressed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV3-VF.ttf]:+clig;+liga;+tlig;+ss01
+Bild Variable v4 Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV4_wdth,wght_.ttf]:+clig;+liga;+tlig
+Bild Variable v4 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV4_wdth,wght_.ttf]:+clig;+liga;+tlig;+ss01
+Bild Variable v4 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV4_wdth,wght_.ttf]:+clig;+liga;+tlig;+ss02
+Bild Variable v4 Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV4_wdth,wght_.ttf]:+clig;+liga;+tlig;+ss03
+Bild Variable v4 Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV4_wdth,wght_.ttf]:+clig;+liga;+tlig;+ss20
+Bild Variable v5 Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV5_XHGT,wdth,wght_.ttf]:+clig;+liga;+tlig
+Bild Variable v5 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV5_XHGT,wdth,wght_.ttf]:+clig;+liga;+tlig;+ss01
+Bild Variable v5 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV5_XHGT,wdth,wght_.ttf]:+clig;+liga;+tlig;+ss02
+Bild Variable v5 Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV5_XHGT,wdth,wght_.ttf]:+clig;+liga;+tlig;+ss03
+Bild Variable v5 Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV5_XHGT,wdth,wght_.ttf]:+clig;+liga;+tlig;+ss04
+Bild Variable v5 Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildVariableV5_XHGT,wdth,wght_.ttf]:+clig;+liga;+tlig;+ss20
+Bild v3 Compressed Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedBlack.otf]:+clig;+liga;+tlig
+Bild v3 Compressed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedBlack.otf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Black [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedBlack.ttf]:+clig;+liga;+tlig
+Bild v3 Compressed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedBlack.ttf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedBold.otf]:+clig;+liga;+tlig
+Bild v3 Compressed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedBold.ttf]:+clig;+liga;+tlig
+Bild v3 Compressed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedBold.ttf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Extra Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedExtraBold.otf]:+clig;+liga;+tlig
+Bild v3 Compressed Extra Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Extra Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedExtraBold.ttf]:+clig;+liga;+tlig
+Bild v3 Compressed Extra Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Extra Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedExtraLight.otf]:+clig;+liga;+tlig
+Bild v3 Compressed Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Extra Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedExtraLight.ttf]:+clig;+liga;+tlig
+Bild v3 Compressed Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedLight.otf]:+clig;+liga;+tlig
+Bild v3 Compressed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedLight.ttf]:+clig;+liga;+tlig
+Bild v3 Compressed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedLight.ttf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedMedium.otf]:+clig;+liga;+tlig
+Bild v3 Compressed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedMedium.otf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Medium [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedMedium.ttf]:+clig;+liga;+tlig
+Bild v3 Compressed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedMedium.ttf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedRegular.otf]:+clig;+liga;+tlig
+Bild v3 Compressed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedRegular.otf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedRegular.ttf]:+clig;+liga;+tlig
+Bild v3 Compressed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedRegular.ttf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Semi Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedSemiBold.otf]:+clig;+liga;+tlig
+Bild v3 Compressed Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedSemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Semi Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedSemiBold.ttf]:+clig;+liga;+tlig
+Bild v3 Compressed Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedSemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedThin.otf]:+clig;+liga;+tlig
+Bild v3 Compressed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV3-CompressedThin.otf]:+clig;+liga;+tlig;+ss01
+Bild v3 Compressed Thin [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedThin.ttf]:+clig;+liga;+tlig
+Bild v3 Compressed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bild/BildV3-CompressedThin.ttf]:+clig;+liga;+tlig;+ss01
+Bild v4 Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Black.otf]:+clig;+liga;+tlig
+Bild v4 Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Bold.otf]:+clig;+liga;+tlig
+Bild v4 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Compressed Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Black.otf]:+clig;+liga;+tlig
+Bild v4 Compressed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Compressed Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Compressed Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Compressed Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Compressed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Bold.otf]:+clig;+liga;+tlig
+Bild v4 Compressed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Compressed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Compressed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Compressed Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Compressed ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-ExtraLight.otf]:+clig;+liga;+tlig
+Bild v4 Compressed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Compressed ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Compressed ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Compressed ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Compressed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Light.otf]:+clig;+liga;+tlig
+Bild v4 Compressed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Compressed Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Compressed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Compressed Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Compressed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Medium.otf]:+clig;+liga;+tlig
+Bild v4 Compressed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Compressed Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Compressed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Compressed Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Compressed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Regular.otf]:+clig;+liga;+tlig
+Bild v4 Compressed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Compressed Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Compressed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Compressed Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Compressed SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-SemiBold.otf]:+clig;+liga;+tlig
+Bild v4 Compressed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Compressed SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Compressed SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Compressed SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Compressed Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Thin.otf]:+clig;+liga;+tlig
+Bild v4 Compressed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Compressed Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Compressed Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Compressed Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Compressed-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Condensed Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Black.otf]:+clig;+liga;+tlig
+Bild v4 Condensed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Condensed Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Condensed Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Condensed Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Condensed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Bold.otf]:+clig;+liga;+tlig
+Bild v4 Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Condensed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Condensed Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Condensed ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-ExtraLight.otf]:+clig;+liga;+tlig
+Bild v4 Condensed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Condensed ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Condensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Condensed ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Condensed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Light.otf]:+clig;+liga;+tlig
+Bild v4 Condensed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Condensed Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Condensed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Condensed Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Condensed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Medium.otf]:+clig;+liga;+tlig
+Bild v4 Condensed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Condensed Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Condensed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Condensed Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Condensed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Regular.otf]:+clig;+liga;+tlig
+Bild v4 Condensed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Condensed Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Condensed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Condensed Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Condensed SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-SemiBold.otf]:+clig;+liga;+tlig
+Bild v4 Condensed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Condensed SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Condensed SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Condensed SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Condensed Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Thin.otf]:+clig;+liga;+tlig
+Bild v4 Condensed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Condensed Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Condensed Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Condensed Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Condensed-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-ExtraLight.otf]:+clig;+liga;+tlig
+Bild v4 ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Light.otf]:+clig;+liga;+tlig
+Bild v4 Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Medium.otf]:+clig;+liga;+tlig
+Bild v4 Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Narrow Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Black.otf]:+clig;+liga;+tlig
+Bild v4 Narrow Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Narrow Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Narrow Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Narrow Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Narrow Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Bold.otf]:+clig;+liga;+tlig
+Bild v4 Narrow Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Narrow Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Narrow Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Narrow Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Narrow ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-ExtraLight.otf]:+clig;+liga;+tlig
+Bild v4 Narrow ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Narrow ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Narrow ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Narrow ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Narrow Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Light.otf]:+clig;+liga;+tlig
+Bild v4 Narrow Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Narrow Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Narrow Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Narrow Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Narrow Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Medium.otf]:+clig;+liga;+tlig
+Bild v4 Narrow Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Narrow Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Narrow Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Narrow Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Narrow Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Regular.otf]:+clig;+liga;+tlig
+Bild v4 Narrow Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Narrow Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Narrow Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Narrow Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Narrow SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-SemiBold.otf]:+clig;+liga;+tlig
+Bild v4 Narrow SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Narrow SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Narrow SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Narrow SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Narrow Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Thin.otf]:+clig;+liga;+tlig
+Bild v4 Narrow Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Narrow Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Narrow Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Narrow Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4Narrow-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Regular.otf]:+clig;+liga;+tlig
+Bild v4 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-SemiBold.otf]:+clig;+liga;+tlig
+Bild v4 SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild v4 Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Thin.otf]:+clig;+liga;+tlig
+Bild v4 Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild v4 Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild v4 Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild v4 Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV4-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Black.otf]:+clig;+liga;+tlig
+Bild v5 Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Bold.otf]:+clig;+liga;+tlig
+Bild v5 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Compressed Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Black.otf]:+clig;+liga;+tlig
+Bild v5 Compressed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Compressed Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Compressed Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Compressed Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Compressed Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Compressed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Bold.otf]:+clig;+liga;+tlig
+Bild v5 Compressed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Compressed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Compressed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Compressed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Compressed Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Compressed ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig
+Bild v5 Compressed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Compressed ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Compressed ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Compressed ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Compressed ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Compressed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Light.otf]:+clig;+liga;+tlig
+Bild v5 Compressed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Compressed Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Compressed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Compressed Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Compressed Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Compressed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Medium.otf]:+clig;+liga;+tlig
+Bild v5 Compressed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Compressed Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Compressed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Compressed Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Compressed Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Compressed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Regular.otf]:+clig;+liga;+tlig
+Bild v5 Compressed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Compressed Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Compressed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Compressed Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Compressed Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Compressed SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-SemiBold.otf]:+clig;+liga;+tlig
+Bild v5 Compressed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Compressed SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Compressed SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Compressed SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Compressed SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Compressed Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Thin.otf]:+clig;+liga;+tlig
+Bild v5 Compressed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Compressed Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Compressed Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Compressed Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Compressed Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Compressed-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Condensed Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Black.otf]:+clig;+liga;+tlig
+Bild v5 Condensed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Condensed Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Condensed Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Condensed Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Condensed Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Condensed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Bold.otf]:+clig;+liga;+tlig
+Bild v5 Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Condensed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Condensed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Condensed Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Condensed ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig
+Bild v5 Condensed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Condensed ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Condensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Condensed ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Condensed ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Condensed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Light.otf]:+clig;+liga;+tlig
+Bild v5 Condensed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Condensed Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Condensed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Condensed Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Condensed Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Condensed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Medium.otf]:+clig;+liga;+tlig
+Bild v5 Condensed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Condensed Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Condensed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Condensed Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Condensed Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Condensed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Regular.otf]:+clig;+liga;+tlig
+Bild v5 Condensed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Condensed Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Condensed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Condensed Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Condensed Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Condensed SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-SemiBold.otf]:+clig;+liga;+tlig
+Bild v5 Condensed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Condensed SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Condensed SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Condensed SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Condensed SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Condensed Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Thin.otf]:+clig;+liga;+tlig
+Bild v5 Condensed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Condensed Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Condensed Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Condensed Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Condensed Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Condensed-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Extra Compressed Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig
+Bild v5 Extra Compressed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Extra Compressed Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Extra Compressed Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Extra Compressed Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Extra Compressed Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Extra Compressed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig
+Bild v5 Extra Compressed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Extra Compressed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Extra Compressed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Extra Compressed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Extra Compressed Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Extra Compressed ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig
+Bild v5 Extra Compressed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Extra Compressed ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Extra Compressed ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Extra Compressed ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Extra Compressed ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Extra Compressed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig
+Bild v5 Extra Compressed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Extra Compressed Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Extra Compressed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Extra Compressed Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Extra Compressed Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Extra Compressed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig
+Bild v5 Extra Compressed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Extra Compressed Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Extra Compressed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Extra Compressed Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Extra Compressed Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Extra Compressed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig
+Bild v5 Extra Compressed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Extra Compressed Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Extra Compressed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Extra Compressed Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Extra Compressed Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Extra Compressed SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig
+Bild v5 Extra Compressed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Extra Compressed SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Extra Compressed SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Extra Compressed SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Extra Compressed SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Extra Compressed Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig
+Bild v5 Extra Compressed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Extra Compressed Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Extra Compressed Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Extra Compressed Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Extra Compressed Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5ExtraCompressed-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-ExtraLight.otf]:+clig;+liga;+tlig
+Bild v5 ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Light.otf]:+clig;+liga;+tlig
+Bild v5 Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Medium.otf]:+clig;+liga;+tlig
+Bild v5 Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Narrow Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Black.otf]:+clig;+liga;+tlig
+Bild v5 Narrow Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Narrow Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Narrow Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Narrow Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Narrow Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Narrow Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Bold.otf]:+clig;+liga;+tlig
+Bild v5 Narrow Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Narrow Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Narrow Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Narrow Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Narrow Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Narrow ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig
+Bild v5 Narrow ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Narrow ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Narrow ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Narrow ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Narrow ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Narrow Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Light.otf]:+clig;+liga;+tlig
+Bild v5 Narrow Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Narrow Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Narrow Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Narrow Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Narrow Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Narrow Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Medium.otf]:+clig;+liga;+tlig
+Bild v5 Narrow Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Narrow Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Narrow Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Narrow Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Narrow Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Narrow Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Regular.otf]:+clig;+liga;+tlig
+Bild v5 Narrow Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Narrow Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Narrow Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Narrow Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Narrow Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Narrow SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-SemiBold.otf]:+clig;+liga;+tlig
+Bild v5 Narrow SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Narrow SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Narrow SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Narrow SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Narrow SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Narrow Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Thin.otf]:+clig;+liga;+tlig
+Bild v5 Narrow Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Narrow Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Narrow Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Narrow Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Narrow Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Narrow-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Regular.otf]:+clig;+liga;+tlig
+Bild v5 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-SemiBold.otf]:+clig;+liga;+tlig
+Bild v5 SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Skyline Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Black.otf]:+clig;+liga;+tlig
+Bild v5 Skyline Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Black.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Skyline Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Black.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Skyline Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Black.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Skyline Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Black.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Skyline Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Black.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Skyline Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Bold.otf]:+clig;+liga;+tlig
+Bild v5 Skyline Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Bold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Skyline Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Bold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Skyline Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Bold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Skyline Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Bold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Skyline Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Bold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Skyline ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig
+Bild v5 Skyline ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Skyline ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Skyline ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Skyline ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Skyline ExtraLight; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Skyline Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Light.otf]:+clig;+liga;+tlig
+Bild v5 Skyline Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Light.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Skyline Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Light.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Skyline Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Light.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Skyline Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Light.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Skyline Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Light.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Skyline Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Medium.otf]:+clig;+liga;+tlig
+Bild v5 Skyline Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Medium.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Skyline Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Medium.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Skyline Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Medium.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Skyline Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Medium.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Skyline Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Medium.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Skyline Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Regular.otf]:+clig;+liga;+tlig
+Bild v5 Skyline Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Regular.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Skyline Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Regular.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Skyline Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Regular.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Skyline Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Regular.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Skyline Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Regular.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Skyline SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-SemiBold.otf]:+clig;+liga;+tlig
+Bild v5 Skyline SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Skyline SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Skyline SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Skyline SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Skyline SemiBold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Skyline Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Thin.otf]:+clig;+liga;+tlig
+Bild v5 Skyline Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Skyline Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Skyline Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Skyline Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Skyline Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5Skyline-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bild v5 Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Thin.otf]:+clig;+liga;+tlig
+Bild v5 Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Thin.otf]:+clig;+liga;+tlig;+ss01
+Bild v5 Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Thin.otf]:+clig;+liga;+tlig;+ss02
+Bild v5 Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Thin.otf]:+clig;+liga;+tlig;+ss03
+Bild v5 Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Thin.otf]:+clig;+liga;+tlig;+ss04
+Bild v5 Thin; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bild/BildV5-Thin.otf]:+clig;+liga;+tlig;+ss20
+Bitter Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/huerta/bitter/Bitter-Bold.ttf]:+clig;+liga;+tlig
+Bitter Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/huerta/bitter/Bitter-Italic.ttf]:+clig;+liga;+tlig
+Bitter Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/huerta/bitter/Bitter-Regular.ttf]:+clig;+liga;+tlig
+Bradley DJR Display [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Display.ttf]:+clig;+liga;+tlig
+Bradley DJR Display; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Display.ttf]:+clig;+liga;+tlig;+hist
+Bradley DJR Display; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Display.ttf]:+clig;+liga;+tlig;+ss01
+Bradley DJR Display; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Display.ttf]:+clig;+liga;+tlig;+ss02
+Bradley DJR Display; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Display.ttf]:+clig;+liga;+tlig;+ss03
+Bradley DJR Display; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Display.ttf]:+clig;+liga;+tlig;+ss04
+Bradley DJR Display; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Display.ttf]:+clig;+liga;+tlig;+ss05
+Bradley DJR Display; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Display.ttf]:+clig;+liga;+tlig;+ss06
+Bradley DJR Display Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Display.otf]:+clig;+liga;+tlig
+Bradley DJR Display Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Display.otf]:+clig;+liga;+tlig;+hist
+Bradley DJR Display Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Display.otf]:+clig;+liga;+tlig;+ss01
+Bradley DJR Display Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Display.otf]:+clig;+liga;+tlig;+ss02
+Bradley DJR Display Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Display.otf]:+clig;+liga;+tlig;+ss03
+Bradley DJR Display Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Display.otf]:+clig;+liga;+tlig;+ss04
+Bradley DJR Display Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Display.otf]:+clig;+liga;+tlig;+ss05
+Bradley DJR Display Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Display.otf]:+clig;+liga;+tlig;+ss06
+Bradley DJR Micro [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Micro.ttf]:+clig;+liga;+tlig
+Bradley DJR Micro; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Micro.ttf]:+clig;+liga;+tlig;+hist
+Bradley DJR Micro; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Micro.ttf]:+clig;+liga;+tlig;+ss01
+Bradley DJR Micro; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Micro.ttf]:+clig;+liga;+tlig;+ss02
+Bradley DJR Micro; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Micro.ttf]:+clig;+liga;+tlig;+ss03
+Bradley DJR Micro; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Micro.ttf]:+clig;+liga;+tlig;+ss04
+Bradley DJR Micro; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Micro.ttf]:+clig;+liga;+tlig;+ss05
+Bradley DJR Micro; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Micro.ttf]:+clig;+liga;+tlig;+ss06
+Bradley DJR Micro Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Micro.otf]:+clig;+liga;+tlig
+Bradley DJR Micro Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Micro.otf]:+clig;+liga;+tlig;+hist
+Bradley DJR Micro Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Micro.otf]:+clig;+liga;+tlig;+ss01
+Bradley DJR Micro Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Micro.otf]:+clig;+liga;+tlig;+ss02
+Bradley DJR Micro Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Micro.otf]:+clig;+liga;+tlig;+ss03
+Bradley DJR Micro Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Micro.otf]:+clig;+liga;+tlig;+ss04
+Bradley DJR Micro Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Micro.otf]:+clig;+liga;+tlig;+ss05
+Bradley DJR Micro Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Micro.otf]:+clig;+liga;+tlig;+ss06
+Bradley DJR Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Regular.ttf]:+clig;+liga;+tlig
+Bradley DJR Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Regular.ttf]:+clig;+liga;+tlig;+hist
+Bradley DJR Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Bradley DJR Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Bradley DJR Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Bradley DJR Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Bradley DJR Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Bradley DJR Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Bradley DJR Small [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Small.ttf]:+clig;+liga;+tlig
+Bradley DJR Small; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Small.ttf]:+clig;+liga;+tlig;+hist
+Bradley DJR Small; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Small.ttf]:+clig;+liga;+tlig;+ss01
+Bradley DJR Small; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Small.ttf]:+clig;+liga;+tlig;+ss02
+Bradley DJR Small; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Small.ttf]:+clig;+liga;+tlig;+ss03
+Bradley DJR Small; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Small.ttf]:+clig;+liga;+tlig;+ss04
+Bradley DJR Small; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Small.ttf]:+clig;+liga;+tlig;+ss05
+Bradley DJR Small; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJR-Small.ttf]:+clig;+liga;+tlig;+ss06
+Bradley DJR Small Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Small.otf]:+clig;+liga;+tlig
+Bradley DJR Small Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Small.otf]:+clig;+liga;+tlig;+hist
+Bradley DJR Small Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Small.otf]:+clig;+liga;+tlig;+ss01
+Bradley DJR Small Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Small.otf]:+clig;+liga;+tlig;+ss02
+Bradley DJR Small Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Small.otf]:+clig;+liga;+tlig;+ss03
+Bradley DJR Small Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Small.otf]:+clig;+liga;+tlig;+ss04
+Bradley DJR Small Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Small.otf]:+clig;+liga;+tlig;+ss05
+Bradley DJR Small Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Small.otf]:+clig;+liga;+tlig;+ss06
+Bradley DJR Variable [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJRVariable-VF.ttf]:+clig;+liga;+tlig
+Bradley DJR Variable; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJRVariable-VF.ttf]:+clig;+liga;+tlig;+hist
+Bradley DJR Variable; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJRVariable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Bradley DJR Variable; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJRVariable-VF.ttf]:+clig;+liga;+tlig;+ss02
+Bradley DJR Variable; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJRVariable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Bradley DJR Variable; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJRVariable-VF.ttf]:+clig;+liga;+tlig;+ss04
+Bradley DJR Variable; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJRVariable-VF.ttf]:+clig;+liga;+tlig;+ss05
+Bradley DJR Variable; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Bradley/BradleyDJRVariable-VF.ttf]:+clig;+liga;+tlig;+ss06
+Bradley Initials DJR Black and White [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJR-BlackandWhite.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR Bumble Bee [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJR-BumbleBee.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR Classic Red [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJR-ClassicRed.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR Layers Basic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJRLayers-Basic.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR Layers Frills [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJRLayers-Frills.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR Layers Letterform [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJRLayers-Letterform.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR Layers Outline [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJRLayers-Outline.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR Lilac Blossom [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJR-LilacBlossom.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJR-Regular.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR Royal Purple [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJR-RoyalPurple.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR Seafoam [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJR-Seafoam.ttf]:+clig;+liga;+tlig
+Bradley Initials DJR colrV1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/BradleyInitials/BradleyInitialsDJR-Regular_COLRv1_BETA.ttf]:+clig;+liga;+tlig
+BradleyDJR Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Regular.otf]:+clig;+liga;+tlig
+BradleyDJR Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Regular.otf]:+clig;+liga;+tlig;+hist
+BradleyDJR Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Regular.otf]:+clig;+liga;+tlig;+ss01
+BradleyDJR Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Regular.otf]:+clig;+liga;+tlig;+ss02
+BradleyDJR Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Regular.otf]:+clig;+liga;+tlig;+ss03
+BradleyDJR Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Regular.otf]:+clig;+liga;+tlig;+ss04
+BradleyDJR Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Regular.otf]:+clig;+liga;+tlig;+ss05
+BradleyDJR Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Bradley/BradleyDJR-Regular.otf]:+clig;+liga;+tlig;+ss06
+BsLandscope [/usr/local/texlive/texmf-local/fonts/truetype/Feliciano/Bs-Landscope/TT/BsLandsc.ttf]:+clig;+liga;+tlig
+CCIcons [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ccicons/ccicons.otf]:+clig;+liga;+tlig
+CMU Bright Bold Extended [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbbx.otf]:+clig;+liga;+tlig
+CMU Bright Bold Extended; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbbx.otf]:+clig;+liga;+tlig;+onum
+CMU Bright Bold Extended; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbbx.otf]:+clig;+liga;+tlig;+ss01
+CMU Bright Bold Extended Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbxo.otf]:+clig;+liga;+tlig
+CMU Bright Bold Extended Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbxo.otf]:+clig;+liga;+tlig;+onum
+CMU Bright Bold Extended Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbxo.otf]:+clig;+liga;+tlig;+ss01
+CMU Bright Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbmo.otf]:+clig;+liga;+tlig
+CMU Bright Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbmo.otf]:+clig;+liga;+tlig;+onum
+CMU Bright Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbmo.otf]:+clig;+liga;+tlig;+ss01
+CMU Bright Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbmr.otf]:+clig;+liga;+tlig
+CMU Bright Roman; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbmr.otf]:+clig;+liga;+tlig;+onum
+CMU Bright Roman; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbmr.otf]:+clig;+liga;+tlig;+ss01
+CMU Bright SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbsr.otf]:+clig;+liga;+tlig
+CMU Bright SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbsr.otf]:+clig;+liga;+tlig;+onum
+CMU Bright SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbsr.otf]:+clig;+liga;+tlig;+ss01
+CMU Bright SemiBold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbso.otf]:+clig;+liga;+tlig
+CMU Bright SemiBold Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbso.otf]:+clig;+liga;+tlig;+onum
+CMU Bright SemiBold Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbso.otf]:+clig;+liga;+tlig;+ss01
+CMU Classical Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunci.otf]:+clig;+liga;+tlig
+CMU Classical Serif Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunci.otf]:+clig;+liga;+tlig;+onum
+CMU Classical Serif Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunci.otf]:+clig;+liga;+tlig;+ss01
+CMU Concrete Bold Extended Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunobi.otf]:+clig;+liga;+tlig
+CMU Concrete Bold Extended Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunobi.otf]:+clig;+liga;+tlig;+onum
+CMU Concrete Bold Extended Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunobi.otf]:+clig;+liga;+tlig;+ss01
+CMU Concrete Bold Extended Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunobx.otf]:+clig;+liga;+tlig
+CMU Concrete Bold Extended Roman; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunobx.otf]:+clig;+liga;+tlig;+onum
+CMU Concrete Bold Extended Roman; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunobx.otf]:+clig;+liga;+tlig;+ss01
+CMU Concrete Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunoti.otf]:+clig;+liga;+tlig
+CMU Concrete Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunoti.otf]:+clig;+liga;+tlig;+onum
+CMU Concrete Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunoti.otf]:+clig;+liga;+tlig;+ss01
+CMU Concrete Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunorm.otf]:+clig;+liga;+tlig
+CMU Concrete Roman; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunorm.otf]:+clig;+liga;+tlig;+onum
+CMU Concrete Roman; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunorm.otf]:+clig;+liga;+tlig;+smcp
+CMU Concrete Roman; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunorm.otf]:+clig;+liga;+tlig;+ss01
+CMU Sans Serif [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunss.otf]:+clig;+liga;+tlig
+CMU Sans Serif; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunss.otf]:+clig;+liga;+tlig;+onum
+CMU Sans Serif; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunss.otf]:+clig;+liga;+tlig;+ss01
+CMU Sans Serif Bold Extended [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunsx.otf]:+clig;+liga;+tlig
+CMU Sans Serif Bold Extended; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunsx.otf]:+clig;+liga;+tlig;+onum
+CMU Sans Serif Bold Extended; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunsx.otf]:+clig;+liga;+tlig;+ss01
+CMU Sans Serif Bold Extended Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunso.otf]:+clig;+liga;+tlig
+CMU Sans Serif Bold Extended Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunso.otf]:+clig;+liga;+tlig;+onum
+CMU Sans Serif Bold Extended Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunso.otf]:+clig;+liga;+tlig;+ss01
+CMU Sans Serif Demi Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunssdc.otf]:+clig;+liga;+tlig
+CMU Sans Serif Demi Condensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunssdc.otf]:+clig;+liga;+tlig;+onum
+CMU Sans Serif Demi Condensed; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunssdc.otf]:+clig;+liga;+tlig;+ss01
+CMU Sans Serif Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunsi.otf]:+clig;+liga;+tlig
+CMU Sans Serif Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunsi.otf]:+clig;+liga;+tlig;+onum
+CMU Sans Serif Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunsi.otf]:+clig;+liga;+tlig;+ss01
+CMU Serif Bold Extended Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbi.otf]:+clig;+liga;+tlig
+CMU Serif Bold Extended Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbi.otf]:+clig;+liga;+tlig;+onum
+CMU Serif Bold Extended Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbi.otf]:+clig;+liga;+tlig;+ss01
+CMU Serif Bold Extended Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbx.otf]:+clig;+liga;+tlig
+CMU Serif Bold Extended Roman; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbx.otf]:+clig;+liga;+tlig;+onum
+CMU Serif Bold Extended Roman; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbx.otf]:+clig;+liga;+tlig;+smcp
+CMU Serif Bold Extended Roman; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbx.otf]:+clig;+liga;+tlig;+ss01
+CMU Serif Bold Extended Slanted Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbl.otf]:+clig;+liga;+tlig
+CMU Serif Bold Extended Slanted Roman; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbl.otf]:+clig;+liga;+tlig;+onum
+CMU Serif Bold Extended Slanted Roman; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbl.otf]:+clig;+liga;+tlig;+smcp
+CMU Serif Bold Extended Slanted Roman; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbl.otf]:+clig;+liga;+tlig;+ss01
+CMU Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunti.otf]:+clig;+liga;+tlig
+CMU Serif Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunti.otf]:+clig;+liga;+tlig;+onum
+CMU Serif Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunti.otf]:+clig;+liga;+tlig;+ss01
+CMU Serif Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunrm.otf]:+clig;+liga;+tlig
+CMU Serif Roman; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunrm.otf]:+clig;+liga;+tlig;+onum
+CMU Serif Roman; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunrm.otf]:+clig;+liga;+tlig;+smcp
+CMU Serif Roman; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunrm.otf]:+clig;+liga;+tlig;+ss01
+CMU Serif Roman Bold Nonextended [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunrb.otf]:+clig;+liga;+tlig
+CMU Serif Roman Bold Nonextended; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunrb.otf]:+clig;+liga;+tlig;+onum
+CMU Serif Roman Bold Nonextended; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunrb.otf]:+clig;+liga;+tlig;+ss01
+CMU Serif Roman Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunsl.otf]:+clig;+liga;+tlig
+CMU Serif Roman Slanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunsl.otf]:+clig;+liga;+tlig;+onum
+CMU Serif Roman Slanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunsl.otf]:+clig;+liga;+tlig;+smcp
+CMU Serif Roman Slanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunsl.otf]:+clig;+liga;+tlig;+ss01
+CMU Serif Upright Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunui.otf]:+clig;+liga;+tlig
+CMU Serif Upright Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunui.otf]:+clig;+liga;+tlig;+onum
+CMU Serif Upright Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunui.otf]:+clig;+liga;+tlig;+ss01
+CMU Typewriter Text Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmuntb.otf]:+clig;+liga;+tlig
+CMU Typewriter Text Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmuntb.otf]:+clig;+liga;+tlig;+onum
+CMU Typewriter Text Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmuntb.otf]:+clig;+liga;+tlig;+ss01
+CMU Typewriter Text Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmuntx.otf]:+clig;+liga;+tlig
+CMU Typewriter Text Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmuntx.otf]:+clig;+liga;+tlig;+onum
+CMU Typewriter Text Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmuntx.otf]:+clig;+liga;+tlig;+ss01
+CMU Typewriter Text Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunit.otf]:+clig;+liga;+tlig
+CMU Typewriter Text Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunit.otf]:+clig;+liga;+tlig;+onum
+CMU Typewriter Text Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunit.otf]:+clig;+liga;+tlig;+ss01
+CMU Typewriter Text Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbtl.otf]:+clig;+liga;+tlig
+CMU Typewriter Text Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbtl.otf]:+clig;+liga;+tlig;+onum
+CMU Typewriter Text Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbtl.otf]:+clig;+liga;+tlig;+ss01
+CMU Typewriter Text Light Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbto.otf]:+clig;+liga;+tlig
+CMU Typewriter Text Light Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbto.otf]:+clig;+liga;+tlig;+onum
+CMU Typewriter Text Light Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunbto.otf]:+clig;+liga;+tlig;+ss01
+CMU Typewriter Text Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunst.otf]:+clig;+liga;+tlig
+CMU Typewriter Text Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunst.otf]:+clig;+liga;+tlig;+onum
+CMU Typewriter Text Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunst.otf]:+clig;+liga;+tlig;+ss01
+CMU Typewriter Text Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmuntt.otf]:+clig;+liga;+tlig
+CMU Typewriter Text Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmuntt.otf]:+clig;+liga;+tlig;+onum
+CMU Typewriter Text Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmuntt.otf]:+clig;+liga;+tlig;+ss01
+CMU Typewriter Text Variable Width [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunvt.otf]:+clig;+liga;+tlig
+CMU Typewriter Text Variable Width; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunvt.otf]:+clig;+liga;+tlig;+onum
+CMU Typewriter Text Variable Width; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunvt.otf]:+clig;+liga;+tlig;+ss01
+CMU Typewriter Text Variable Width Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunvi.otf]:+clig;+liga;+tlig
+CMU Typewriter Text Variable Width Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunvi.otf]:+clig;+liga;+tlig;+onum
+CMU Typewriter Text Variable Width Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cm-unicode/cmunvi.otf]:+clig;+liga;+tlig;+ss01
+Cabin Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Bold.otf]:+clig;+liga;+tlig
+Cabin Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Bold.otf]:+clig;+liga;+tlig;+smcp
+Cabin Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Bold.otf]:+clig;+liga;+tlig;+ss01
+Cabin Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-BoldItalic.otf]:+clig;+liga;+tlig
+Cabin Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Cabin Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Cabin Condensed Bold Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-BoldCondensed.otf]:+clig;+liga;+tlig
+Cabin Condensed Bold Condensed; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-BoldCondensed.otf]:+clig;+liga;+tlig;+ss01
+Cabin Condensed Bold Italic Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-BoldItalicCondensed.otf]:+clig;+liga;+tlig
+Cabin Condensed Bold Italic Condensed; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-BoldItalicCondensed.otf]:+clig;+liga;+tlig;+ss01
+Cabin Condensed Italic Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-ItalicCondensed.otf]:+clig;+liga;+tlig
+Cabin Condensed Italic Condensed; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-ItalicCondensed.otf]:+clig;+liga;+tlig;+ss01
+Cabin Condensed Medium Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-MediumCondensed.otf]:+clig;+liga;+tlig
+Cabin Condensed Medium Condensed; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-MediumCondensed.otf]:+clig;+liga;+tlig;+ss01
+Cabin Condensed Medium Italic Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-MediumItalicCondensed.otf]:+clig;+liga;+tlig
+Cabin Condensed Medium Italic Condensed; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-MediumItalicCondensed.otf]:+clig;+liga;+tlig;+ss01
+Cabin Condensed Regular Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-RegularCondensed.otf]:+clig;+liga;+tlig
+Cabin Condensed Regular Condensed; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-RegularCondensed.otf]:+clig;+liga;+tlig;+ss01
+Cabin Condensed SemiBold Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-SemiBoldCondensed.otf]:+clig;+liga;+tlig
+Cabin Condensed SemiBold Condensed; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-SemiBoldCondensed.otf]:+clig;+liga;+tlig;+ss01
+Cabin Condensed Semibold Italic Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-SemiboldItalicCondensed.otf]:+clig;+liga;+tlig
+Cabin Condensed Semibold Italic Condensed; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/CabinCondensed-SemiboldItalicCondensed.otf]:+clig;+liga;+tlig;+ss01
+Cabin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Italic.otf]:+clig;+liga;+tlig
+Cabin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Italic.otf]:+clig;+liga;+tlig;+smcp
+Cabin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Italic.otf]:+clig;+liga;+tlig;+ss01
+Cabin Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Medium.otf]:+clig;+liga;+tlig
+Cabin Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Medium.otf]:+clig;+liga;+tlig;+smcp
+Cabin Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Medium.otf]:+clig;+liga;+tlig;+ss01
+Cabin Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-MediumItalic.otf]:+clig;+liga;+tlig
+Cabin Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Cabin Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Cabin Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Regular.otf]:+clig;+liga;+tlig
+Cabin Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Regular.otf]:+clig;+liga;+tlig;+smcp
+Cabin Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-Regular.otf]:+clig;+liga;+tlig;+ss01
+Cabin SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-SemiBold.otf]:+clig;+liga;+tlig
+Cabin SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+Cabin SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Cabin SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Cabin SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-SemiBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Cabin SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/cabin/Cabin-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Caladea [/usr/local/texlive/2024/texmf-dist/fonts/truetype/huerta/caladea/Caladea-Regular.ttf]:+clig;+liga;+tlig
+Caladea Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/huerta/caladea/Caladea-Bold.ttf]:+clig;+liga;+tlig
+Caladea Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/huerta/caladea/Caladea-BoldItalic.ttf]:+clig;+liga;+tlig
+Caladea Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/huerta/caladea/Caladea-Italic.ttf]:+clig;+liga;+tlig
+Cantarell Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Bold.otf]:+clig;+liga;+tlig
+Cantarell Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Bold.otf]:+clig;+liga;+tlig;+onum
+Cantarell Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Bold.otf]:+clig;+liga;+tlig;+ss01
+Cantarell Extra Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-ExtraBold.otf]:+clig;+liga;+tlig
+Cantarell Extra Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Cantarell Extra Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Cantarell Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Light.otf]:+clig;+liga;+tlig
+Cantarell Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Light.otf]:+clig;+liga;+tlig;+onum
+Cantarell Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Light.otf]:+clig;+liga;+tlig;+ss01
+Cantarell Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Regular.otf]:+clig;+liga;+tlig
+Cantarell Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Regular.otf]:+clig;+liga;+tlig;+onum
+Cantarell Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Regular.otf]:+clig;+liga;+tlig;+ss01
+Cantarell Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Thin.otf]:+clig;+liga;+tlig
+Cantarell Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Thin.otf]:+clig;+liga;+tlig;+onum
+Cantarell Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/gnome/cantarell/Cantarell-Thin.otf]:+clig;+liga;+tlig;+ss01
+Carlito [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Regular.ttf]:+clig;+liga;+tlig
+Carlito; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Regular.ttf]:+clig;+liga;+tlig;+onum
+Carlito; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Carlito; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Carlito; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Carlito; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Carlito Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Bold.ttf]:+clig;+liga;+tlig
+Carlito Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Bold.ttf]:+clig;+liga;+tlig;+onum
+Carlito Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Carlito Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Carlito Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Carlito Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Carlito Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-BoldItalic.ttf]:+clig;+liga;+tlig
+Carlito Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Carlito Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Carlito Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Carlito Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Carlito Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Carlito Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Italic.ttf]:+clig;+liga;+tlig
+Carlito Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Italic.ttf]:+clig;+liga;+tlig;+onum
+Carlito Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Carlito Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Carlito Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Carlito Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/carlito/Carlito-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Cascadia Code Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Bold.otf]:+clig;+liga;+tlig
+Cascadia Code Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Bold.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code Bold; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Bold.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code Bold; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Bold.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-BoldItalic.otf]:+clig;+liga;+tlig
+Cascadia Code Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Cascadia Code Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Cascadia Code Bold Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-BoldItalic.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code Bold Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-BoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-ExtraLight.otf]:+clig;+liga;+tlig
+Cascadia Code ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code ExtraLight; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-ExtraLight.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code ExtraLight; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-ExtraLight.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Cascadia Code ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Cascadia Code ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Cascadia Code ExtraLight Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code ExtraLight Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Italic.otf]:+clig;+liga;+tlig
+Cascadia Code Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Italic.otf]:+clig;+liga;+tlig;+ss01
+Cascadia Code Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Italic.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Italic.otf]:+clig;+liga;+tlig;+ss03
+Cascadia Code Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Italic.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Italic.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Light.otf]:+clig;+liga;+tlig
+Cascadia Code Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Light.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code Light; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Light.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code Light; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Light.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-LightItalic.otf]:+clig;+liga;+tlig
+Cascadia Code Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Cascadia Code Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Cascadia Code Light Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-LightItalic.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code Light Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-LightItalic.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Regular.otf]:+clig;+liga;+tlig
+Cascadia Code Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Regular.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code Regular; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Regular.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code Regular; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-Regular.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiBold.otf]:+clig;+liga;+tlig
+Cascadia Code SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code SemiBold; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiBold.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code SemiBold; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Cascadia Code SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Cascadia Code SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Cascadia Code SemiBold Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code SemiBold Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code SemiLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiLight.otf]:+clig;+liga;+tlig
+Cascadia Code SemiLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiLight.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code SemiLight; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiLight.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code SemiLight; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiLight.otf]:+clig;+liga;+tlig;+ss20
+Cascadia Code SemiLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiLightItalic.otf]:+clig;+liga;+tlig
+Cascadia Code SemiLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Cascadia Code SemiLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiLightItalic.otf]:+clig;+liga;+tlig;+ss02
+Cascadia Code SemiLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Cascadia Code SemiLight Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiLightItalic.otf]:+clig;+liga;+tlig;+ss19
+Cascadia Code SemiLight Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cascadia-code/CascadiaCode-SemiLightItalic.otf]:+clig;+liga;+tlig;+ss20
+Cashew [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/CashewGX.ttf]:+clig;+liga;+tlig
+Cashew; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/CashewGX.ttf]:+clig;+liga;+tlig;+ss01
+Cashew; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/CashewGX.ttf]:+clig;+liga;+tlig;+ss02
+Cashew Condensed [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Condensed.ttf]:+clig;+liga;+tlig
+Cashew Condensed; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Condensed.ttf]:+clig;+liga;+tlig;+ss01
+Cashew Condensed; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Condensed.ttf]:+clig;+liga;+tlig;+ss02
+Cashew Extended [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Extended.ttf]:+clig;+liga;+tlig
+Cashew Extended; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Extended.ttf]:+clig;+liga;+tlig;+ss01
+Cashew Extended; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Extended.ttf]:+clig;+liga;+tlig;+ss02
+Cashew Medium [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Medium.ttf]:+clig;+liga;+tlig
+Cashew Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Cashew Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Cashew Regular [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Regular.ttf]:+clig;+liga;+tlig
+Cashew Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Cashew Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Cashew Semi Condensed [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-SemiCondensed.ttf]:+clig;+liga;+tlig
+Cashew Semi Condensed; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-SemiCondensed.ttf]:+clig;+liga;+tlig;+ss01
+Cashew Semi Condensed; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/NowType/Cashew/Cashew-SemiCondensed.ttf]:+clig;+liga;+tlig;+ss02
+Cathisma Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/CathismaUnicode.otf]:+clig;+liga;+tlig
+Charis SIL [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Regular.ttf]:+clig;+liga;+tlig
+Charis SIL; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Charis SIL; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Charis SIL; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Charis SIL; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Charis SIL; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Regular.ttf]:+clig;+liga;+tlig;+ss11
+Charis SIL; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Regular.ttf]:+clig;+liga;+tlig;+ss12
+Charis SIL Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Bold.ttf]:+clig;+liga;+tlig
+Charis SIL Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Charis SIL Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Charis SIL Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Charis SIL Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Charis SIL Bold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Bold.ttf]:+clig;+liga;+tlig;+ss11
+Charis SIL Bold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Bold.ttf]:+clig;+liga;+tlig;+ss12
+Charis SIL Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-BoldItalic.ttf]:+clig;+liga;+tlig
+Charis SIL Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Charis SIL Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Charis SIL Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Charis SIL Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-BoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Charis SIL Bold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-BoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Charis SIL Bold Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-BoldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Charis SIL Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Italic.ttf]:+clig;+liga;+tlig
+Charis SIL Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Charis SIL Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Charis SIL Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Charis SIL Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Italic.ttf]:+clig;+liga;+tlig;+ss05
+Charis SIL Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Italic.ttf]:+clig;+liga;+tlig;+ss11
+Charis SIL Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/SIL/charissil/CharisSIL-Italic.ttf]:+clig;+liga;+tlig;+ss12
+Charpentier RenaissanceIF [/usr/local/texlive/texmf-local/fonts/truetype/Ingo/CharpentierRenaissance/TrueType/CHARRI__.ttf]:+clig;+liga;+tlig
+ChessAlphaDiagram [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/skaknew/AlphaDia.otf]:+clig;+liga;+tlig
+Chip 1 [/usr/local/texlive/texmf-local/fonts/truetype/Holland/HFC2001TTW_CHIP1/CHIP-1__.ttf]:+clig;+liga;+tlig
+Chivo Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Black.otf]:+clig;+liga;+tlig
+Chivo Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Black.otf]:+clig;+liga;+tlig;+onum
+Chivo Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-BlackItalic.otf]:+clig;+liga;+tlig
+Chivo Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Chivo Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Bold.otf]:+clig;+liga;+tlig
+Chivo Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Bold.otf]:+clig;+liga;+tlig;+onum
+Chivo Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-BoldItalic.otf]:+clig;+liga;+tlig
+Chivo Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Chivo ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-ExtraBold.otf]:+clig;+liga;+tlig
+Chivo ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Chivo ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Chivo ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Chivo ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-ExtraLight.otf]:+clig;+liga;+tlig
+Chivo ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Chivo ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Chivo ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Chivo Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Italic.otf]:+clig;+liga;+tlig
+Chivo Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Italic.otf]:+clig;+liga;+tlig;+onum
+Chivo Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Light.otf]:+clig;+liga;+tlig
+Chivo Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Light.otf]:+clig;+liga;+tlig;+onum
+Chivo Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-LightItalic.otf]:+clig;+liga;+tlig
+Chivo Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Chivo Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Medium.otf]:+clig;+liga;+tlig
+Chivo Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Medium.otf]:+clig;+liga;+tlig;+onum
+Chivo Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-MediumItalic.otf]:+clig;+liga;+tlig
+Chivo Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Chivo Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Regular.otf]:+clig;+liga;+tlig
+Chivo Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Regular.otf]:+clig;+liga;+tlig;+onum
+Chivo SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-SemiBold.otf]:+clig;+liga;+tlig
+Chivo SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Chivo SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Chivo SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Chivo Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Thin.otf]:+clig;+liga;+tlig
+Chivo Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-Thin.otf]:+clig;+liga;+tlig;+onum
+Chivo Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-ThinItalic.otf]:+clig;+liga;+tlig
+Chivo Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/chivo/Chivo-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Cinzel Decorative Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ndiscovered/cinzel/CinzelDecorative-Black.ttf]:+clig;+liga;+tlig
+Cinzel Decorative Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ndiscovered/cinzel/CinzelDecorative-Bold.ttf]:+clig;+liga;+tlig
+Cinzel-Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ndiscovered/cinzel/Cinzel-Black.ttf]:+clig;+liga;+tlig
+Cinzel-Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ndiscovered/cinzel/Cinzel-Bold.ttf]:+clig;+liga;+tlig
+Cinzel-Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ndiscovered/cinzel/Cinzel-Regular.ttf]:+clig;+liga;+tlig
+CinzelDecorative-Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ndiscovered/cinzel/CinzelDecorative-Regular.ttf]:+clig;+liga;+tlig
+Clara [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarar.otf]:+clig;+liga;+tlig
+Clara; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarar.otf]:+clig;+liga;+tlig;+hist
+Clara; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarar.otf]:+clig;+liga;+tlig;+onum
+Clara; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarar.otf]:+clig;+liga;+tlig;+smcp
+Clara Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarab.otf]:+clig;+liga;+tlig
+Clara Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarab.otf]:+clig;+liga;+tlig;+hist
+Clara Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarabi.otf]:+clig;+liga;+tlig
+Clara Bold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarabi.otf]:+clig;+liga;+tlig;+hist
+Clara Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarai.otf]:+clig;+liga;+tlig
+Clara Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarai.otf]:+clig;+liga;+tlig;+hist
+Clara Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/clara/clarai.otf]:+clig;+liga;+tlig;+onum
+ClaudiumNB [/usr/local/texlive/texmf-local/fonts/truetype/NoBodoni/ClaudiumNB_Regular_TT/ClaudiumNB.ttf]:+clig;+liga;+tlig
+Clear Sans [/usr/local/texlive/2024/texmf-dist/fonts/truetype/intel/clearsans/ClearSans-Regular.ttf]:+clig;+liga;+tlig
+Clear Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/intel/clearsans/ClearSans-Bold.ttf]:+clig;+liga;+tlig
+Clear Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/intel/clearsans/ClearSans-BoldItalic.ttf]:+clig;+liga;+tlig
+Clear Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/intel/clearsans/ClearSans-Italic.ttf]:+clig;+liga;+tlig
+Clear Sans Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/intel/clearsans/ClearSans-Light.ttf]:+clig;+liga;+tlig
+Clear Sans Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/intel/clearsans/ClearSans-Medium.ttf]:+clig;+liga;+tlig
+Clear Sans Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/intel/clearsans/ClearSans-MediumItalic.ttf]:+clig;+liga;+tlig
+Clear Sans Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/intel/clearsans/ClearSans-Thin.ttf]:+clig;+liga;+tlig
+Club Lithographer Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/ClubLitographer/ClubLithographer-Italic.otf]:+clig;+liga;+tlig
+Club Lithographer Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/ClubLitographer/ClubLithographer-Italic.otf]:+clig;+liga;+tlig;+ss01
+Club Lithographer Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/ClubLitographer/ClubLithographer-Italic.ttf]:+clig;+liga;+tlig
+Club Lithographer Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/ClubLitographer/ClubLithographer-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Club Lithographer v2 Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/ClubLitographerV2/ClubLithographerV2-Italic.otf]:+clig;+liga;+tlig
+Club Lithographer v2 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/ClubLitographerV2/ClubLithographerV2-Italic.otf]:+clig;+liga;+tlig;+ss01
+Club Lithographer v2 Italic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/DJR/ClubLitographerV2/ClubLithographerV2-Italic.otf]:+clig;+liga;+tlig;+swsh
+Club Lithographer v2 Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/ClubLitographerV2/ClubLithographerV2-Italic.ttf]:+clig;+liga;+tlig
+Club Lithographer v2 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/ClubLitographerV2/ClubLithographerV2-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Club Lithographer v2 Italic; Swash [/usr/local/texlive/texmf-local/fonts/truetype/DJR/ClubLitographerV2/ClubLithographerV2-Italic.ttf]:+clig;+liga;+tlig;+swsh
+Cochineal Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Bold.otf]:+clig;+liga;+tlig
+Cochineal Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Bold.otf]:+clig;+liga;+tlig;+onum
+Cochineal Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Bold.otf]:+clig;+liga;+tlig;+smcp
+Cochineal Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Bold.otf]:+clig;+liga;+tlig;+ss01
+Cochineal Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Bold.otf]:+clig;+liga;+tlig;+ss03
+Cochineal Bold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Bold.otf]:+clig;+liga;+tlig;+swsh
+Cochineal Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-BoldItalic.otf]:+clig;+liga;+tlig
+Cochineal Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Cochineal Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Cochineal Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Cochineal Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Cochineal Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Cochineal Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Cochineal Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Italic.otf]:+clig;+liga;+tlig
+Cochineal Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Italic.otf]:+clig;+liga;+tlig;+onum
+Cochineal Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Italic.otf]:+clig;+liga;+tlig;+smcp
+Cochineal Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Italic.otf]:+clig;+liga;+tlig;+ss01
+Cochineal Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Italic.otf]:+clig;+liga;+tlig;+ss02
+Cochineal Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Italic.otf]:+clig;+liga;+tlig;+ss03
+Cochineal Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Italic.otf]:+clig;+liga;+tlig;+swsh
+Cochineal Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Roman.otf]:+clig;+liga;+tlig
+Cochineal Roman; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Roman.otf]:+clig;+liga;+tlig;+onum
+Cochineal Roman; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Roman.otf]:+clig;+liga;+tlig;+smcp
+Cochineal Roman; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Roman.otf]:+clig;+liga;+tlig;+ss01
+Cochineal Roman; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Roman.otf]:+clig;+liga;+tlig;+ss03
+Cochineal Roman; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cochineal/Cochineal-Roman.otf]:+clig;+liga;+tlig;+swsh
+Coelacanth [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/Coelacanth.otf]:+clig;+liga;+tlig
+Coelacanth ; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/Coelacanth.otf]:+clig;+liga;+tlig;+onum
+Coelacanth ; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/Coelacanth.otf]:+clig;+liga;+tlig;+pcap
+Coelacanth ; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/Coelacanth.otf]:+clig;+liga;+tlig;+smcp
+Coelacanth Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthBold.otf]:+clig;+liga;+tlig
+Coelacanth Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthBold.otf]:+clig;+liga;+tlig;+onum
+Coelacanth Bold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthBold.otf]:+clig;+liga;+tlig;+pcap
+Coelacanth Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthBold.otf]:+clig;+liga;+tlig;+smcp
+Coelacanth ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthExtraLt.otf]:+clig;+liga;+tlig
+Coelacanth ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthExtraLt.otf]:+clig;+liga;+tlig;+onum
+Coelacanth ExtraLight; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthExtraLt.otf]:+clig;+liga;+tlig;+pcap
+Coelacanth ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthExtraLt.otf]:+clig;+liga;+tlig;+smcp
+Coelacanth Heavy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthHeavy.otf]:+clig;+liga;+tlig
+Coelacanth Heavy; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthHeavy.otf]:+clig;+liga;+tlig;+onum
+Coelacanth Heavy; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthHeavy.otf]:+clig;+liga;+tlig;+pcap
+Coelacanth Heavy; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthHeavy.otf]:+clig;+liga;+tlig;+smcp
+Coelacanth Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthLt.otf]:+clig;+liga;+tlig
+Coelacanth Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthLt.otf]:+clig;+liga;+tlig;+onum
+Coelacanth Light; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthLt.otf]:+clig;+liga;+tlig;+pcap
+Coelacanth Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthLt.otf]:+clig;+liga;+tlig;+smcp
+Coelacanth Semibold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthSemibd.otf]:+clig;+liga;+tlig
+Coelacanth Semibold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthSemibd.otf]:+clig;+liga;+tlig;+onum
+Coelacanth Semibold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthSemibd.otf]:+clig;+liga;+tlig;+pcap
+Coelacanth Semibold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthSemibd.otf]:+clig;+liga;+tlig;+smcp
+Coelacanth Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthItalic.otf]:+clig;+liga;+tlig
+Coelacanth Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthItalic.otf]:+clig;+liga;+tlig;+onum
+Coelacanth Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthItalic.otf]:+clig;+liga;+tlig;+pcap
+Coelacanth Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/coelacanth/CoelacanthItalic.otf]:+clig;+liga;+tlig;+smcp
+Comfortaa Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/aajohan/comfortaa/Comfortaa-Bold.ttf]:+clig;+liga;+tlig
+Comfortaa Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/aajohan/comfortaa/Comfortaa-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Comfortaa Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/aajohan/comfortaa/Comfortaa-Light.ttf]:+clig;+liga;+tlig
+Comfortaa Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/aajohan/comfortaa/Comfortaa-Light.ttf]:+clig;+liga;+tlig;+ss01
+Comfortaa Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/aajohan/comfortaa/Comfortaa-Regular.ttf]:+clig;+liga;+tlig
+Comfortaa Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/aajohan/comfortaa/Comfortaa-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Comic Neue Angular Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeueAngular-Bold.otf]:+clig;+liga;+tlig
+Comic Neue Angular Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeueAngular-BoldItalic.otf]:+clig;+liga;+tlig
+Comic Neue Angular Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeueAngular-RegularItalic.otf]:+clig;+liga;+tlig
+Comic Neue Angular Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeueAngular-Light.otf]:+clig;+liga;+tlig
+Comic Neue Angular Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeueAngular-LightItalic.otf]:+clig;+liga;+tlig
+Comic Neue Angular Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeueAngular-Regular.otf]:+clig;+liga;+tlig
+Comic Neue Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeue-Bold.otf]:+clig;+liga;+tlig
+Comic Neue Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeue-BoldItalic.otf]:+clig;+liga;+tlig
+Comic Neue Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeue-RegularItalic.otf]:+clig;+liga;+tlig
+Comic Neue Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeue-Light.otf]:+clig;+liga;+tlig
+Comic Neue Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeue-LightItalic.otf]:+clig;+liga;+tlig
+Comic Neue Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeue-Regular.otf]:+clig;+liga;+tlig
+Concourse 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig
+Concourse 2; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+hist
+Concourse 2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+onum
+Concourse 2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 2; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 2; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 2; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 2; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 2; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 2; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 2; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Regular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig
+Concourse 2; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 2; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 2; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 2; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 2; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 2; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 2; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 2; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Regular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig
+Concourse 2 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+hist
+Concourse 2 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Bold.otf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig
+Concourse 2 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+hist
+Concourse 2 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Bold.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig
+Concourse 2 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 2 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2BoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig
+Concourse 2 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 2 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2BoldItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig
+Concourse 2 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 2 Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 2 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 2 Caps Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig
+Concourse 2 Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2CapsBold.otf]:+clig;+liga;+tlig;+ss10
+Concourse 2 Caps Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig
+Concourse 2 Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2CapsBold.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 2 Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig
+Concourse 2 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+hist
+Concourse 2 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2Italic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig
+Concourse 2 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 2 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2Italic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Tab [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig
+Concourse 2 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+hist
+Concourse 2 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabRegular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Tab [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig
+Concourse 2 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 2 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabRegular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Tab Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig
+Concourse 2 Tab Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+hist
+Concourse 2 Tab Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Tab Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Tab Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Tab Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Tab Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Tab Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Tab Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Tab Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBold.otf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Tab Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig
+Concourse 2 Tab Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+hist
+Concourse 2 Tab Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Tab Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Tab Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Tab Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Tab Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Tab Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Tab Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Tab Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBold.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Tab Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig
+Concourse 2 Tab Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 2 Tab Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Tab Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Tab Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Tab Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Tab Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Tab Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Tab Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Tab Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabBoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Tab Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig
+Concourse 2 Tab Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 2 Tab Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Tab Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Tab Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Tab Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Tab Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Tab Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Tab Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Tab Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Tab Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig
+Concourse 2 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 2 Tab Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 2 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 2 Tab Caps Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig
+Concourse 2 Tab Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabCapsBold.otf]:+clig;+liga;+tlig;+ss10
+Concourse 2 Tab Caps Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig
+Concourse 2 Tab Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabCapsBold.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 2 Tab Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig
+Concourse 2 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 2 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse2TabItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 2 Tab Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig
+Concourse 2 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 2 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 2 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 2 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 2 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 2 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 2 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 2 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 2 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 2 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 2 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 2 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 2 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 2 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 2 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 2 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 2 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 2 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse2TabItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig
+Concourse 3; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+hist
+Concourse 3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+onum
+Concourse 3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 3; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 3; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 3; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 3; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 3; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 3; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 3; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Regular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig
+Concourse 3; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 3; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 3; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 3; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 3; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 3; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 3; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 3; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Regular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig
+Concourse 3 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+hist
+Concourse 3 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Bold.otf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig
+Concourse 3 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+hist
+Concourse 3 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Bold.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig
+Concourse 3 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 3 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3BoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig
+Concourse 3 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 3 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3BoldItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig
+Concourse 3 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 3 Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 3 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 3 Caps Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig
+Concourse 3 Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3CapsBold.otf]:+clig;+liga;+tlig;+ss10
+Concourse 3 Caps Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig
+Concourse 3 Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3CapsBold.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 3 Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig
+Concourse 3 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+hist
+Concourse 3 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3Italic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig
+Concourse 3 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 3 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3Italic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Tab [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig
+Concourse 3 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+hist
+Concourse 3 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabRegular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Tab [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig
+Concourse 3 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 3 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabRegular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Tab Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig
+Concourse 3 Tab Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+hist
+Concourse 3 Tab Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Tab Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Tab Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Tab Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Tab Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Tab Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Tab Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Tab Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBold.otf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Tab Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig
+Concourse 3 Tab Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+hist
+Concourse 3 Tab Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Tab Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Tab Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Tab Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Tab Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Tab Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Tab Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Tab Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBold.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Tab Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig
+Concourse 3 Tab Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 3 Tab Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Tab Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Tab Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Tab Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Tab Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Tab Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Tab Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Tab Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabBoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Tab Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig
+Concourse 3 Tab Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 3 Tab Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Tab Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Tab Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Tab Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Tab Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Tab Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Tab Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Tab Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Tab Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig
+Concourse 3 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 3 Tab Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 3 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 3 Tab Caps Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig
+Concourse 3 Tab Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabCapsBold.otf]:+clig;+liga;+tlig;+ss10
+Concourse 3 Tab Caps Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig
+Concourse 3 Tab Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabCapsBold.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 3 Tab Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig
+Concourse 3 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 3 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse3TabItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 3 Tab Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig
+Concourse 3 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 3 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 3 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 3 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 3 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 3 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 3 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 3 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 3 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 3 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 3 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 3 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 3 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 3 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 3 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 3 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 3 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 3 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse3TabItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig
+Concourse 4; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+hist
+Concourse 4; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+onum
+Concourse 4; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 4; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 4; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 4; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 4; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 4; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 4; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 4; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Regular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig
+Concourse 4; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 4; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 4; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 4; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 4; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 4; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 4; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 4; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 4; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Regular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig
+Concourse 4 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+hist
+Concourse 4 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Bold.otf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig
+Concourse 4 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+hist
+Concourse 4 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Bold.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig
+Concourse 4 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 4 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4BoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig
+Concourse 4 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 4 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4BoldItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig
+Concourse 4 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 4 Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 4 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 4 Caps Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig
+Concourse 4 Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4CapsBold.otf]:+clig;+liga;+tlig;+ss10
+Concourse 4 Caps Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig
+Concourse 4 Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4CapsBold.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 4 Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig
+Concourse 4 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+hist
+Concourse 4 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4Italic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig
+Concourse 4 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 4 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4Italic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Tab [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig
+Concourse 4 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+hist
+Concourse 4 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabRegular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Tab [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig
+Concourse 4 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 4 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabRegular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Tab Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig
+Concourse 4 Tab Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+hist
+Concourse 4 Tab Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Tab Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Tab Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Tab Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Tab Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Tab Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Tab Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Tab Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBold.otf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Tab Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig
+Concourse 4 Tab Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+hist
+Concourse 4 Tab Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Tab Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Tab Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Tab Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Tab Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Tab Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Tab Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Tab Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBold.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Tab Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig
+Concourse 4 Tab Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 4 Tab Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Tab Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Tab Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Tab Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Tab Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Tab Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Tab Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Tab Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabBoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Tab Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig
+Concourse 4 Tab Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 4 Tab Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Tab Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Tab Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Tab Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Tab Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Tab Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Tab Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Tab Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabBoldItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Tab Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig
+Concourse 4 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 4 Tab Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 4 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 4 Tab Caps Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig
+Concourse 4 Tab Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabCapsBold.otf]:+clig;+liga;+tlig;+ss10
+Concourse 4 Tab Caps Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig
+Concourse 4 Tab Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab Caps Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab Caps Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab Caps Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab Caps Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabCapsBold.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 4 Tab Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig
+Concourse 4 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 4 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse4TabItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 4 Tab Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig
+Concourse 4 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 4 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 4 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 4 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 4 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 4 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 4 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 4 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 4 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 4 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 4 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 4 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 4 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 4 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 4 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 4 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 4 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 4 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse4TabItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig
+Concourse 6; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+hist
+Concourse 6; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+onum
+Concourse 6; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 6; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 6; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 6; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 6; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 6; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 6; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 6; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 6; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 6; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 6; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 6; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 6; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 6; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 6; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 6; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Regular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig
+Concourse 6; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 6; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 6; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 6; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 6; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 6; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 6; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 6; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 6; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 6; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 6; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 6; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 6; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 6; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 6; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 6; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 6; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 6; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Regular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 6 Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig
+Concourse 6 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 6 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 6 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 6 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 6 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 6 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 6 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 6 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 6 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 6 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6CapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 6 Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 6 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 6 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 6 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 6 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 6 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 6 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 6 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 6 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 6 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 6 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6CapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 6 Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig
+Concourse 6 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+hist
+Concourse 6 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+onum
+Concourse 6 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 6 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 6 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 6 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 6 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 6 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 6 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 6 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 6 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 6 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 6 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 6 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 6 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 6 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 6 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 6 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6Italic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 6 Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig
+Concourse 6 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 6 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 6 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 6 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 6 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 6 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 6 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 6 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 6 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 6 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 6 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 6 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 6 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 6 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 6 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 6 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 6 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 6 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6Italic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 6 Tab [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig
+Concourse 6 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+hist
+Concourse 6 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 6 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 6 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 6 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 6 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 6 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 6 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 6 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 6 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 6 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 6 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 6 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 6 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 6 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 6 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 6 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 6 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabRegular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 6 Tab [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig
+Concourse 6 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 6 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 6 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 6 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 6 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 6 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 6 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 6 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 6 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 6 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 6 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 6 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 6 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 6 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 6 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 6 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 6 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 6 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabRegular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 6 Tab Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig
+Concourse 6 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 6 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 6 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 6 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 6 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 6 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 6 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 6 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 6 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 6 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabCapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 6 Tab Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 6 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 6 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 6 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 6 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 6 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 6 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 6 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 6 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 6 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 6 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 6 Tab Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig
+Concourse 6 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 6 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 6 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 6 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 6 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 6 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 6 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 6 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 6 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 6 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 6 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 6 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 6 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 6 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 6 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 6 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 6 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 6 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse6TabItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 6 Tab Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig
+Concourse 6 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 6 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 6 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 6 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 6 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 6 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 6 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 6 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 6 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 6 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 6 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 6 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 6 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 6 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 6 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 6 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 6 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 6 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse6TabItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig
+Concourse 7; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+hist
+Concourse 7; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+onum
+Concourse 7; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 7; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 7; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 7; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 7; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 7; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 7; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 7; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 7; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 7; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 7; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 7; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 7; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 7; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 7; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 7; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Regular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig
+Concourse 7; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 7; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 7; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 7; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 7; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 7; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 7; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 7; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 7; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 7; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 7; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 7; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 7; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 7; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 7; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 7; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 7; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 7; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Regular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 7 Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig
+Concourse 7 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 7 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 7 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 7 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 7 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 7 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 7 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 7 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 7 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 7 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7CapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 7 Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 7 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 7 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 7 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 7 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 7 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 7 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 7 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 7 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 7 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 7 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7CapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 7 Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig
+Concourse 7 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+hist
+Concourse 7 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+onum
+Concourse 7 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 7 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 7 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 7 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 7 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 7 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 7 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 7 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 7 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 7 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 7 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 7 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 7 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 7 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 7 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 7 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7Italic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 7 Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig
+Concourse 7 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 7 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 7 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 7 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 7 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 7 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 7 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 7 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 7 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 7 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 7 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 7 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 7 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 7 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 7 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 7 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 7 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 7 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7Italic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 7 Tab [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig
+Concourse 7 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+hist
+Concourse 7 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 7 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 7 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 7 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 7 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 7 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 7 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 7 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 7 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 7 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 7 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 7 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 7 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 7 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 7 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 7 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 7 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabRegular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 7 Tab [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig
+Concourse 7 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 7 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 7 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 7 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 7 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 7 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 7 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 7 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 7 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 7 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 7 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 7 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 7 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 7 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 7 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 7 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 7 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 7 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabRegular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 7 Tab Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig
+Concourse 7 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 7 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 7 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 7 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 7 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 7 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 7 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 7 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 7 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 7 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabCapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 7 Tab Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 7 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 7 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 7 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 7 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 7 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 7 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 7 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 7 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 7 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 7 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 7 Tab Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig
+Concourse 7 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 7 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 7 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 7 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 7 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 7 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 7 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 7 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 7 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 7 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 7 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 7 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 7 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 7 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 7 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 7 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 7 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 7 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse7TabItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 7 Tab Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig
+Concourse 7 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 7 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 7 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 7 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 7 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 7 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 7 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 7 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 7 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 7 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 7 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 7 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 7 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 7 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 7 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 7 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 7 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 7 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse7TabItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig
+Concourse 8; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+hist
+Concourse 8; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+onum
+Concourse 8; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 8; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 8; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 8; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 8; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 8; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 8; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 8; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 8; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 8; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 8; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 8; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 8; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 8; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 8; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 8; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Regular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig
+Concourse 8; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 8; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 8; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 8; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 8; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 8; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 8; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 8; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 8; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 8; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 8; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 8; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 8; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 8; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 8; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 8; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 8; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 8; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Regular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 8 Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig
+Concourse 8 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 8 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 8 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 8 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 8 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 8 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 8 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 8 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 8 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 8 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8CapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 8 Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 8 Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 8 Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 8 Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 8 Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 8 Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 8 Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 8 Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 8 Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 8 Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 8 Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8CapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 8 Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig
+Concourse 8 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+hist
+Concourse 8 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+onum
+Concourse 8 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 8 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 8 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 8 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 8 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 8 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 8 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 8 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 8 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 8 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 8 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 8 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 8 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 8 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 8 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 8 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8Italic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 8 Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig
+Concourse 8 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 8 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 8 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 8 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 8 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 8 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 8 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 8 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 8 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 8 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 8 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 8 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 8 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 8 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 8 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 8 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 8 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 8 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8Italic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 8 Tab [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig
+Concourse 8 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+hist
+Concourse 8 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 8 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 8 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 8 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 8 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 8 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 8 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 8 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 8 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 8 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss09
+Concourse 8 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss11
+Concourse 8 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss12
+Concourse 8 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss13
+Concourse 8 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss14
+Concourse 8 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss15
+Concourse 8 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss16
+Concourse 8 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabRegular.otf]:+clig;+liga;+tlig;+ss17
+Concourse 8 Tab [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig
+Concourse 8 Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+hist
+Concourse 8 Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 8 Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 8 Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 8 Tab; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 8 Tab; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 8 Tab; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 8 Tab; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 8 Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 8 Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 8 Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 8 Tab; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 8 Tab; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 8 Tab; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 8 Tab; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 8 Tab; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 8 Tab; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 8 Tab; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabRegular.ttf]:+clig;+liga;+tlig;+ss17
+Concourse 8 Tab Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig
+Concourse 8 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig;+onum
+Concourse 8 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Concourse 8 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Concourse 8 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig;+ss03
+Concourse 8 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig;+ss04
+Concourse 8 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig;+ss05
+Concourse 8 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig;+ss06
+Concourse 8 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Concourse 8 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Concourse 8 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabCapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Concourse 8 Tab Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig
+Concourse 8 Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Concourse 8 Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 8 Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 8 Tab Caps; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 8 Tab Caps; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 8 Tab Caps; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 8 Tab Caps; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 8 Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 8 Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 8 Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabCapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Concourse 8 Tab Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig
+Concourse 8 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse 8 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse 8 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse 8 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse 8 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse 8 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse 8 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse 8 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse 8 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse 8 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse 8 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse 8 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse 8 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse 8 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse 8 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse 8 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse 8 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse 8 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/Concourse8TabItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse 8 Tab Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig
+Concourse 8 Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse 8 Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse 8 Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse 8 Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse 8 Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse 8 Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse 8 Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse 8 Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse 8 Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse 8 Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse 8 Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse 8 Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse 8 Tab Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse 8 Tab Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse 8 Tab Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse 8 Tab Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse 8 Tab Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse 8 Tab Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/Concourse8TabItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig
+Concourse OT 2; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 2; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+smcp
+Concourse OT 2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 2; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 2; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 2; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 2; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 2; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 2; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 2; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 2; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 2; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 2; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 2; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2Thin.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig
+Concourse OT 2; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 2; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+smcp
+Concourse OT 2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 2; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 2; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 2; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 2; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 2; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 2; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 2; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 2; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 2; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 2; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 2; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2Thin.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 2 Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig
+Concourse OT 2 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 2 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 2 Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+smcp
+Concourse OT 2 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 2 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 2 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 2 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 2 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 2 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 2 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 2 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 2 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 2 Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 2 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 2 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 2 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 2 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 2 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 2 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 2 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8Black.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 2 Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig
+Concourse OT 2 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 2 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 2 Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+smcp
+Concourse OT 2 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 2 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 2 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 2 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 2 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 2 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 2 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 2 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 2 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 2 Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 2 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 2 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 2 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 2 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 2 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 2 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 2 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8Black.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 2 Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig
+Concourse OT 2 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 2 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 2 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 2 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 2 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 2 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 2 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 2 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 2 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 2 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 2 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 2 Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 2 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 2 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 2 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 2 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 2 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 2 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 2 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT8BlackItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 2 Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig
+Concourse OT 2 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 2 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 2 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 2 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 2 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 2 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 2 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 2 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 2 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 2 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 2 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 2 Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 2 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 2 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 2 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 2 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 2 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 2 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 2 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT8BlackItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 2 Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig
+Concourse OT 2 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 2 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 2 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 2 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 2 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 2 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 2 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 2 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 2 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 2 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 2 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 2 Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 2 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 2 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 2 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 2 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 2 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 2 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 2 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT2ThinItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 2 Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig
+Concourse OT 2 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 2 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 2 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 2 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 2 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 2 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 2 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 2 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 2 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 2 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 2 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 2 Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 2 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 2 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 2 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 2 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 2 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 2 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 2 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT2ThinItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig
+Concourse OT 3; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 3; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+smcp
+Concourse OT 3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 3; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 3; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 3; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 3; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 3; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 3; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 3; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 3; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 3; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 3; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 3; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3Book.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig
+Concourse OT 3; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 3; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+smcp
+Concourse OT 3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 3; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 3; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 3; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 3; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 3; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 3; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 3; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 3; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 3; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 3; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 3; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3Book.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 3 Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig
+Concourse OT 3 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 3 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 3 Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+smcp
+Concourse OT 3 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 3 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 3 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 3 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 3 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 3 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 3 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 3 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 3 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 3 Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 3 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 3 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 3 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 3 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 3 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 3 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 3 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6Semibold.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 3 Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig
+Concourse OT 3 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 3 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 3 Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+smcp
+Concourse OT 3 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 3 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 3 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 3 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 3 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 3 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 3 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 3 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 3 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 3 Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 3 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 3 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 3 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 3 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 3 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 3 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 3 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6Semibold.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 3 Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig
+Concourse OT 3 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 3 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 3 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 3 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 3 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 3 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 3 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 3 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 3 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 3 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 3 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 3 Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 3 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 3 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 3 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 3 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 3 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 3 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 3 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT6SemiboldItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 3 Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig
+Concourse OT 3 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 3 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 3 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 3 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 3 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 3 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 3 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 3 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 3 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 3 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 3 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 3 Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 3 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 3 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 3 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 3 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 3 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 3 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 3 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT6SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 3 Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig
+Concourse OT 3 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 3 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 3 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 3 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 3 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 3 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 3 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 3 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 3 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 3 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 3 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 3 Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 3 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 3 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 3 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 3 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 3 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 3 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 3 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT3BookItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 3 Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig
+Concourse OT 3 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 3 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 3 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 3 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 3 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 3 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 3 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 3 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 3 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 3 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 3 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 3 Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 3 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 3 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 3 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 3 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 3 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 3 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 3 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT3BookItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig
+Concourse OT 4; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 4; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 4; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+smcp
+Concourse OT 4; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 4; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 4; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 4; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 4; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 4; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 4; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 4; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 4; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 4; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 4; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 4; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 4; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 4; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 4; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 4; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 4; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4Medium.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig
+Concourse OT 4; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 4; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 4; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+smcp
+Concourse OT 4; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 4; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 4; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 4; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 4; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 4; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 4; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 4; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 4; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 4; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 4; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 4; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 4; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 4; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 4; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 4; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 4; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4Medium.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 4 Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig
+Concourse OT 4 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 4 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 4 Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+smcp
+Concourse OT 4 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 4 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 4 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 4 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 4 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 4 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 4 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 4 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 4 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 4 Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 4 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 4 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 4 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 4 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 4 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 4 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 4 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7Bold.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 4 Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig
+Concourse OT 4 Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 4 Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 4 Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+smcp
+Concourse OT 4 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 4 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 4 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 4 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 4 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 4 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 4 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 4 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 4 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 4 Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 4 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 4 Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 4 Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 4 Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 4 Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 4 Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 4 Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7Bold.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 4 Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig
+Concourse OT 4 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 4 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 4 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 4 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 4 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 4 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 4 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 4 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 4 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 4 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 4 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 4 Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 4 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 4 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 4 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 4 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 4 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 4 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 4 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT7BoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 4 Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig
+Concourse OT 4 Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 4 Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 4 Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 4 Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 4 Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 4 Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 4 Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 4 Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 4 Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 4 Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 4 Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 4 Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 4 Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 4 Bold Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 4 Bold Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 4 Bold Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 4 Bold Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 4 Bold Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 4 Bold Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT7BoldItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concourse OT 4 Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig
+Concourse OT 4 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+hist
+Concourse OT 4 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Concourse OT 4 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Concourse OT 4 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Concourse OT 4 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Concourse OT 4 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Concourse OT 4 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Concourse OT 4 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Concourse OT 4 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Concourse OT 4 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Concourse OT 4 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Concourse OT 4 Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Concourse OT 4 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss11
+Concourse OT 4 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss12
+Concourse OT 4 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss13
+Concourse OT 4 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss14
+Concourse OT 4 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss15
+Concourse OT 4 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss16
+Concourse OT 4 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/concourse/ConcourseOT4MediumItalic.otf]:+clig;+liga;+tlig;+ss17
+Concourse OT 4 Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig
+Concourse OT 4 Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+hist
+Concourse OT 4 Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Concourse OT 4 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Concourse OT 4 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Concourse OT 4 Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Concourse OT 4 Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss04
+Concourse OT 4 Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss05
+Concourse OT 4 Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss06
+Concourse OT 4 Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss07
+Concourse OT 4 Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss08
+Concourse OT 4 Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss09
+Concourse OT 4 Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss10
+Concourse OT 4 Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss11
+Concourse OT 4 Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss12
+Concourse OT 4 Italic; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss13
+Concourse OT 4 Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss14
+Concourse OT 4 Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss15
+Concourse OT 4 Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss16
+Concourse OT 4 Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/concourse/ConcourseOT4MediumItalic.ttf]:+clig;+liga;+tlig;+ss17
+Concrete Math [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/concmath-otf/Concrete-Math.otf]:+clig;+liga;+tlig
+Concrete Math; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/concmath-otf/Concrete-Math.otf]:+clig;+liga;+tlig;+onum
+Concrete Math; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/concmath-otf/Concrete-Math.otf]:+clig;+liga;+tlig;+ss06
+Concrete Math; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/concmath-otf/Concrete-Math.otf]:+clig;+liga;+tlig;+ssty
+Concrete Math Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/concmath-otf/Concrete-Math-Bold.otf]:+clig;+liga;+tlig
+Concrete Math Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/concmath-otf/Concrete-Math-Bold.otf]:+clig;+liga;+tlig;+onum
+Concrete Math Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/concmath-otf/Concrete-Math-Bold.otf]:+clig;+liga;+tlig;+ss03
+Concrete Math Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/concmath-otf/Concrete-Math-Bold.otf]:+clig;+liga;+tlig;+ss04
+Concrete Math Bold; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/concmath-otf/Concrete-Math-Bold.otf]:+clig;+liga;+tlig;+ssty
+CooperHewitt-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Bold.otf]:+clig;+liga;+tlig
+CooperHewitt-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Bold.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-BoldItalic.otf]:+clig;+liga;+tlig
+CooperHewitt-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Book.otf]:+clig;+liga;+tlig
+CooperHewitt-Book; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Book.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-BookItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-BookItalic.otf]:+clig;+liga;+tlig
+CooperHewitt-BookItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-BookItalic.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-Heavy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Heavy.otf]:+clig;+liga;+tlig
+CooperHewitt-Heavy; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Heavy.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-HeavyItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-HeavyItalic.otf]:+clig;+liga;+tlig
+CooperHewitt-HeavyItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-HeavyItalic.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Light.otf]:+clig;+liga;+tlig
+CooperHewitt-Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Light.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-LightItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-LightItalic.otf]:+clig;+liga;+tlig
+CooperHewitt-LightItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Medium.otf]:+clig;+liga;+tlig
+CooperHewitt-Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Medium.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-MediumItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-MediumItalic.otf]:+clig;+liga;+tlig
+CooperHewitt-MediumItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-Semibold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Semibold.otf]:+clig;+liga;+tlig
+CooperHewitt-Semibold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Semibold.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-SemiboldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-SemiboldItalic.otf]:+clig;+liga;+tlig
+CooperHewitt-SemiboldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Thin.otf]:+clig;+liga;+tlig
+CooperHewitt-Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-Thin.otf]:+clig;+liga;+tlig;+ss01
+CooperHewitt-ThinItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-ThinItalic.otf]:+clig;+liga;+tlig
+CooperHewitt-ThinItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cooperhewitt/CooperHewitt-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig
+Cormorant Garamond Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+onum
+Cormorant Garamond Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Cormorant Garamond Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Cormorant Garamond Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Cormorant Garamond Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Cormorant Garamond Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+ss06
+Cormorant Garamond Bold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+ss09
+Cormorant Garamond Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+ss10
+Cormorant Garamond Bold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+ss12
+Cormorant Garamond Bold; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+ss13
+Cormorant Garamond Bold; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Bold.ttf]:+clig;+liga;+tlig;+ss14
+Cormorant Garamond Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig
+Cormorant Garamond Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Cormorant Garamond Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Cormorant Garamond Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Cormorant Garamond Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Cormorant Garamond Bold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Cormorant Garamond Bold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Cormorant Garamond Bold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Cormorant Garamond Bold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Cormorant Garamond Bold Italic; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-BoldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Cormorant Garamond Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig
+Cormorant Garamond Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig;+onum
+Cormorant Garamond Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Cormorant Garamond Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Cormorant Garamond Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig;+ss07
+Cormorant Garamond Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig;+ss08
+Cormorant Garamond Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig;+ss09
+Cormorant Garamond Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig;+ss10
+Cormorant Garamond Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig;+ss11
+Cormorant Garamond Italic; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Italic.ttf]:+clig;+liga;+tlig;+ss13
+Cormorant Garamond Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig
+Cormorant Garamond Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+onum
+Cormorant Garamond Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+smcp
+Cormorant Garamond Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+ss03
+Cormorant Garamond Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+ss04
+Cormorant Garamond Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+ss05
+Cormorant Garamond Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+ss06
+Cormorant Garamond Light; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+ss09
+Cormorant Garamond Light; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+ss10
+Cormorant Garamond Light; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+ss12
+Cormorant Garamond Light; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+ss13
+Cormorant Garamond Light; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Light.ttf]:+clig;+liga;+tlig;+ss14
+Cormorant Garamond Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig
+Cormorant Garamond Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Cormorant Garamond Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Cormorant Garamond Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig;+ss04
+Cormorant Garamond Light Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig;+ss07
+Cormorant Garamond Light Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig;+ss08
+Cormorant Garamond Light Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig;+ss09
+Cormorant Garamond Light Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig;+ss10
+Cormorant Garamond Light Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig;+ss11
+Cormorant Garamond Light Italic; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-LightItalic.ttf]:+clig;+liga;+tlig;+ss13
+Cormorant Garamond Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig
+Cormorant Garamond Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+onum
+Cormorant Garamond Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+smcp
+Cormorant Garamond Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Cormorant Garamond Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+ss04
+Cormorant Garamond Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+ss05
+Cormorant Garamond Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+ss06
+Cormorant Garamond Medium; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+ss09
+Cormorant Garamond Medium; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+ss10
+Cormorant Garamond Medium; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+ss12
+Cormorant Garamond Medium; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+ss13
+Cormorant Garamond Medium; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Medium.ttf]:+clig;+liga;+tlig;+ss14
+Cormorant Garamond Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig
+Cormorant Garamond Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Cormorant Garamond Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Cormorant Garamond Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig;+ss04
+Cormorant Garamond Medium Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig;+ss07
+Cormorant Garamond Medium Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig;+ss08
+Cormorant Garamond Medium Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig;+ss09
+Cormorant Garamond Medium Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig;+ss10
+Cormorant Garamond Medium Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig;+ss11
+Cormorant Garamond Medium Italic; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-MediumItalic.ttf]:+clig;+liga;+tlig;+ss13
+Cormorant Garamond Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig
+Cormorant Garamond Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+onum
+Cormorant Garamond Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Cormorant Garamond Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Cormorant Garamond Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Cormorant Garamond Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Cormorant Garamond Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Cormorant Garamond Regular; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+ss09
+Cormorant Garamond Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+ss10
+Cormorant Garamond Regular; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+ss12
+Cormorant Garamond Regular; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+ss13
+Cormorant Garamond Regular; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-Regular.ttf]:+clig;+liga;+tlig;+ss14
+Cormorant Garamond SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig
+Cormorant Garamond SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+onum
+Cormorant Garamond SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Cormorant Garamond SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Cormorant Garamond SemiBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+ss04
+Cormorant Garamond SemiBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+ss05
+Cormorant Garamond SemiBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+ss06
+Cormorant Garamond SemiBold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+ss09
+Cormorant Garamond SemiBold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+ss10
+Cormorant Garamond SemiBold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+ss12
+Cormorant Garamond SemiBold; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+ss13
+Cormorant Garamond SemiBold; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBold.ttf]:+clig;+liga;+tlig;+ss14
+Cormorant Garamond SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Cormorant Garamond SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Cormorant Garamond SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Cormorant Garamond SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Cormorant Garamond SemiBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Cormorant Garamond SemiBold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Cormorant Garamond SemiBold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Cormorant Garamond SemiBold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Cormorant Garamond SemiBold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Cormorant Garamond SemiBold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Cormorant Garamond SemiBold Italic; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/catharsis/cormorantgaramond/CormorantGaramond-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss13
+Courier [/System/Library/Fonts/Courier.ttc](0):+clig;+liga;+tlig
+Courier 10 Pitch [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/courierten/Courier10PitchBT-Roman.otf]:+clig;+liga;+tlig
+Courier 10 Pitch Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/courierten/Courier10PitchBT-Bold.otf]:+clig;+liga;+tlig
+Courier 10 Pitch Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/courierten/Courier10PitchBT-BoldItalic.otf]:+clig;+liga;+tlig
+Courier 10 Pitch Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/courierten/Courier10PitchBT-Italic.otf]:+clig;+liga;+tlig
+Courier Bold [/System/Library/Fonts/Courier.ttc](1):+clig;+liga;+tlig
+Courier Bold Oblique [/System/Library/Fonts/Courier.ttc](3):+clig;+liga;+tlig
+Courier Oblique [/System/Library/Fonts/Courier.ttc](2):+clig;+liga;+tlig
+Crimson Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-Bold.otf]:+clig;+liga;+tlig
+Crimson Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-Bold.otf]:+clig;+liga;+tlig;+smcp
+Crimson Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-BoldItalic.otf]:+clig;+liga;+tlig
+Crimson Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Crimson Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-Italic.otf]:+clig;+liga;+tlig
+Crimson Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-Italic.otf]:+clig;+liga;+tlig;+onum
+Crimson Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-Italic.otf]:+clig;+liga;+tlig;+smcp
+Crimson Pro Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Black.ttf]:+clig;+liga;+tlig
+Crimson Pro Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Black.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-BlackItalic.ttf]:+clig;+liga;+tlig
+Crimson Pro Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-BlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Bold.ttf]:+clig;+liga;+tlig
+Crimson Pro Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Bold.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-BoldItalic.ttf]:+clig;+liga;+tlig
+Crimson Pro Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-ExtraBold.ttf]:+clig;+liga;+tlig
+Crimson Pro ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-ExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Crimson Pro ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-ExtraLight.ttf]:+clig;+liga;+tlig
+Crimson Pro ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-ExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Crimson Pro ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Italic.ttf]:+clig;+liga;+tlig
+Crimson Pro Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Italic.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Light.ttf]:+clig;+liga;+tlig
+Crimson Pro Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Light.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-LightItalic.ttf]:+clig;+liga;+tlig
+Crimson Pro Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Medium.ttf]:+clig;+liga;+tlig
+Crimson Pro Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Medium.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-MediumItalic.ttf]:+clig;+liga;+tlig
+Crimson Pro Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-MediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Regular.ttf]:+clig;+liga;+tlig
+Crimson Pro Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-Regular.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-SemiBold.ttf]:+clig;+liga;+tlig
+Crimson Pro SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-SemiBold.ttf]:+clig;+liga;+tlig;+onum
+Crimson Pro SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Crimson Pro SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/crimsonpro/CrimsonPro-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Crimson Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-Roman.otf]:+clig;+liga;+tlig
+Crimson Roman; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-Roman.otf]:+clig;+liga;+tlig;+onum
+Crimson Roman; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-Roman.otf]:+clig;+liga;+tlig;+smcp
+Crimson Semibold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-Semibold.otf]:+clig;+liga;+tlig
+Crimson Semibold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/kosch/crimson/Crimson-SemiboldItalic.otf]:+clig;+liga;+tlig
+Cuprum [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/cuprum/Cuprum-Regular.ttf]:+clig;+liga;+tlig
+Cuprum Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/cuprum/Cuprum-Bold.ttf]:+clig;+liga;+tlig
+Cuprum Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/cuprum/Cuprum-BoldItalic.ttf]:+clig;+liga;+tlig
+Cuprum Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/cuprum/Cuprum-Italic.ttf]:+clig;+liga;+tlig
+Cyklop-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyklop/cyklop-italic.otf]:+clig;+liga;+tlig
+Cyklop-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyklop/cyklop-italic.otf]:+clig;+liga;+tlig;+onum
+Cyklop-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyklop/cyklop-italic.otf]:+clig;+liga;+tlig;+smcp
+Cyklop-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyklop/cyklop-italic.otf]:+clig;+liga;+tlig;+ss01
+Cyklop-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyklop/cyklop-regular.otf]:+clig;+liga;+tlig
+Cyklop-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyklop/cyklop-regular.otf]:+clig;+liga;+tlig;+onum
+Cyklop-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyklop/cyklop-regular.otf]:+clig;+liga;+tlig;+smcp
+Cyklop-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyklop/cyklop-regular.otf]:+clig;+liga;+tlig;+ss01
+DR Kruk Single PS Normal [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig
+DR Kruk Single PS Normal; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+hist
+DR Kruk Single PS Normal; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+onum
+DR Kruk Single PS Normal; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss01
+DR Kruk Single PS Normal; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss02
+DR Kruk Single PS Normal; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss03
+DR Kruk Single PS Normal; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss04
+DR Kruk Single PS Normal; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss05
+DR Kruk Single PS Normal; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss06
+DR Kruk Single PS Normal; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss07
+DR Kruk Single PS Normal; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss08
+DR Kruk Single PS Normal; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss09
+DR Kruk Single PS Normal; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss10
+DR Kruk Single PS Normal; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss11
+DR Kruk Single PS Normal; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss12
+DR Kruk Single PS Normal; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss13
+DR Kruk Single PS Normal; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss14
+DR Kruk Single PS Normal; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss15
+DR Kruk Single PS Normal; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss16
+DR Kruk Single PS Normal; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss17
+DR Kruk Single PS Normal; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss18
+DR Kruk Single PS Normal; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss19
+DR Kruk Single PS Normal; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DR/DRKruk/DRKrukSinglePS-Normal.otf]:+clig;+liga;+tlig;+ss20
+Daily Special Banner Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Black.otf]:+clig;+liga;+tlig
+Daily Special Banner Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Black.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Banner Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Black.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Banner Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Black.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Banner Gold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Gold.otf]:+clig;+liga;+tlig
+Daily Special Banner Gold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Gold.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Banner Gold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Gold.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Banner Gold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Gold.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Banner Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Regular.otf]:+clig;+liga;+tlig
+Daily Special Banner Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Regular.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Banner Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Regular.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Banner Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Regular.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Banner Silver [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Silver.otf]:+clig;+liga;+tlig
+Daily Special Banner Silver; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Silver.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Banner Silver; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Silver.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Banner Silver; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-Silver.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Banner White [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-White.otf]:+clig;+liga;+tlig
+Daily Special Banner White; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-White.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Banner White; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-White.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Banner White; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialBanner-White.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Black.otf]:+clig;+liga;+tlig
+Daily Special Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Black.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Black.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Black.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Display Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Black.otf]:+clig;+liga;+tlig
+Daily Special Display Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Black.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Display Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Black.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Display Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Black.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Display Gold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Gold.otf]:+clig;+liga;+tlig
+Daily Special Display Gold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Gold.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Display Gold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Gold.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Display Gold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Gold.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Display Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Regular.otf]:+clig;+liga;+tlig
+Daily Special Display Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Regular.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Display Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Regular.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Display Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Regular.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Display Silver [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Silver.otf]:+clig;+liga;+tlig
+Daily Special Display Silver; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Silver.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Display Silver; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Silver.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Display Silver; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-Silver.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Display White [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-White.otf]:+clig;+liga;+tlig
+Daily Special Display White; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-White.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Display White; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-White.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Display White; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecialDisplay-White.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Gold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Gold.otf]:+clig;+liga;+tlig
+Daily Special Gold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Gold.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Gold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Gold.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Gold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Gold.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Regular.otf]:+clig;+liga;+tlig
+Daily Special Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Regular.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Regular.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Regular.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Silver [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Silver.otf]:+clig;+liga;+tlig
+Daily Special Silver; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Silver.otf]:+clig;+liga;+tlig;+ss01
+Daily Special Silver; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Silver.otf]:+clig;+liga;+tlig;+ss02
+Daily Special Silver; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-Silver.otf]:+clig;+liga;+tlig;+ss03
+Daily Special Variable [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Regular.ttf]:+clig;+liga;+tlig
+Daily Special Variable; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Daily Special Variable; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Daily Special Variable; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Daily Special Variable Black [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Black.ttf]:+clig;+liga;+tlig
+Daily Special Variable Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Black.ttf]:+clig;+liga;+tlig;+ss01
+Daily Special Variable Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Black.ttf]:+clig;+liga;+tlig;+ss02
+Daily Special Variable Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Black.ttf]:+clig;+liga;+tlig;+ss03
+Daily Special Variable Gold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Gold.ttf]:+clig;+liga;+tlig
+Daily Special Variable Gold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Gold.ttf]:+clig;+liga;+tlig;+ss01
+Daily Special Variable Gold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Gold.ttf]:+clig;+liga;+tlig;+ss02
+Daily Special Variable Gold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Gold.ttf]:+clig;+liga;+tlig;+ss03
+Daily Special Variable Silver [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Silver.ttf]:+clig;+liga;+tlig
+Daily Special Variable Silver; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Silver.ttf]:+clig;+liga;+tlig;+ss01
+Daily Special Variable Silver; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Silver.ttf]:+clig;+liga;+tlig;+ss02
+Daily Special Variable Silver; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-Silver.ttf]:+clig;+liga;+tlig;+ss03
+Daily Special Variable White [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-White.ttf]:+clig;+liga;+tlig
+Daily Special Variable White; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-White.ttf]:+clig;+liga;+tlig;+ss01
+Daily Special Variable White; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-White.ttf]:+clig;+liga;+tlig;+ss02
+Daily Special Variable White; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/DailySpecial/DailySpecialVariable-White.ttf]:+clig;+liga;+tlig;+ss03
+Daily Special White [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-White.otf]:+clig;+liga;+tlig
+Daily Special White; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-White.otf]:+clig;+liga;+tlig;+ss01
+Daily Special White; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-White.otf]:+clig;+liga;+tlig;+ss02
+Daily Special White; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/DailySpecial/DailySpecial-White.otf]:+clig;+liga;+tlig;+ss03
+Dattilo DJR Banner Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Black.otf]:+clig;+liga;+tlig
+Dattilo DJR Banner Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Black.otf]:+clig;+liga;+tlig;+ss03
+Dattilo DJR Banner Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Black.otf]:+clig;+liga;+tlig;+ss05
+Dattilo DJR Banner Black; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Black.otf]:+clig;+liga;+tlig;+ss19
+Dattilo DJR Banner Black [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Black.ttf]:+clig;+liga;+tlig
+Dattilo DJR Banner Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Black.ttf]:+clig;+liga;+tlig;+ss03
+Dattilo DJR Banner Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Black.ttf]:+clig;+liga;+tlig;+ss05
+Dattilo DJR Banner Black; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Black.ttf]:+clig;+liga;+tlig;+ss19
+Dattilo DJR Banner Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Bold.otf]:+clig;+liga;+tlig
+Dattilo DJR Banner Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Bold.otf]:+clig;+liga;+tlig;+ss03
+Dattilo DJR Banner Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Bold.otf]:+clig;+liga;+tlig;+ss05
+Dattilo DJR Banner Bold; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Bold.otf]:+clig;+liga;+tlig;+ss19
+Dattilo DJR Banner Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Bold.ttf]:+clig;+liga;+tlig
+Dattilo DJR Banner Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Dattilo DJR Banner Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Dattilo DJR Banner Bold; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Bold.ttf]:+clig;+liga;+tlig;+ss19
+Dattilo DJR Banner Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Medium.otf]:+clig;+liga;+tlig
+Dattilo DJR Banner Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Medium.otf]:+clig;+liga;+tlig;+ss03
+Dattilo DJR Banner Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Medium.otf]:+clig;+liga;+tlig;+ss05
+Dattilo DJR Banner Medium; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Medium.otf]:+clig;+liga;+tlig;+ss19
+Dattilo DJR Banner Medium [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Medium.ttf]:+clig;+liga;+tlig
+Dattilo DJR Banner Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Dattilo DJR Banner Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Medium.ttf]:+clig;+liga;+tlig;+ss05
+Dattilo DJR Banner Medium; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Medium.ttf]:+clig;+liga;+tlig;+ss19
+Dattilo DJR Banner Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Regular.otf]:+clig;+liga;+tlig
+Dattilo DJR Banner Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Regular.otf]:+clig;+liga;+tlig;+ss03
+Dattilo DJR Banner Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Regular.otf]:+clig;+liga;+tlig;+ss05
+Dattilo DJR Banner Regular; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Dattilo/DattiloDJRBanner-Regular.otf]:+clig;+liga;+tlig;+ss19
+Dattilo DJR Banner Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Regular.ttf]:+clig;+liga;+tlig
+Dattilo DJR Banner Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Dattilo DJR Banner Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Dattilo DJR Banner Regular; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBanner-Regular.ttf]:+clig;+liga;+tlig;+ss19
+Dattilo DJR Banner Variable Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBannerVariable-VF.ttf]:+clig;+liga;+tlig
+Dattilo DJR Banner Variable Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBannerVariable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Dattilo DJR Banner Variable Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBannerVariable-VF.ttf]:+clig;+liga;+tlig;+ss05
+Dattilo DJR Banner Variable Regular; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Dattilo/DattiloDJRBannerVariable-VF.ttf]:+clig;+liga;+tlig;+ss19
+David CLM Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/culmus/DavidCLM-Bold.otf]:+clig;+liga;+tlig
+David CLM Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/culmus/DavidCLM-BoldItalic.otf]:+clig;+liga;+tlig
+David CLM Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/culmus/DavidCLM-Medium.otf]:+clig;+liga;+tlig
+David CLM Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/culmus/DavidCLM-MediumItalic.otf]:+clig;+liga;+tlig
+DejaVu Sans [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSans.ttf]:+clig;+liga;+tlig
+DejaVu Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSans-Bold.ttf]:+clig;+liga;+tlig
+DejaVu Sans Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSans-BoldOblique.ttf]:+clig;+liga;+tlig
+DejaVu Sans Condensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSansCondensed.ttf]:+clig;+liga;+tlig
+DejaVu Sans Condensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSansCondensed-Bold.ttf]:+clig;+liga;+tlig
+DejaVu Sans Condensed Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSansCondensed-BoldOblique.ttf]:+clig;+liga;+tlig
+DejaVu Sans Condensed Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSansCondensed-Oblique.ttf]:+clig;+liga;+tlig
+DejaVu Sans ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSans-ExtraLight.ttf]:+clig;+liga;+tlig
+DejaVu Sans Mono [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSansMono.ttf]:+clig;+liga;+tlig
+DejaVu Sans Mono Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSansMono-Bold.ttf]:+clig;+liga;+tlig
+DejaVu Sans Mono Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSansMono-BoldOblique.ttf]:+clig;+liga;+tlig
+DejaVu Sans Mono Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSansMono-Oblique.ttf]:+clig;+liga;+tlig
+DejaVu Sans Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSans-Oblique.ttf]:+clig;+liga;+tlig
+DejaVu Serif [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSerif.ttf]:+clig;+liga;+tlig
+DejaVu Serif Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSerif-Bold.ttf]:+clig;+liga;+tlig
+DejaVu Serif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSerif-BoldItalic.ttf]:+clig;+liga;+tlig
+DejaVu Serif Condensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSerifCondensed.ttf]:+clig;+liga;+tlig
+DejaVu Serif Condensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSerifCondensed-Bold.ttf]:+clig;+liga;+tlig
+DejaVu Serif Condensed Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSerifCondensed-BoldItalic.ttf]:+clig;+liga;+tlig
+DejaVu Serif Condensed Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSerifCondensed-Italic.ttf]:+clig;+liga;+tlig
+DejaVu Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/dejavu/DejaVuSerif-Italic.ttf]:+clig;+liga;+tlig
+DeutscheSchrift Callwey [/usr/local/texlive/texmf-local/fonts/truetype/Ingo/DeutscheSchriftCallwey/TrueType/DEUTSC__.ttf]:+clig;+liga;+tlig
+Divine [/usr/local/texlive/texmf-local/fonts/truetype/t26/divine/divine.ttf]:+clig;+liga;+tlig
+DogmaBold [/usr/local/texlive/texmf-local/fonts/truetype/dogma/dogmab01.ttf]:+clig;+liga;+tlig
+Domitian-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-Bold.otf]:+clig;+liga;+tlig
+Domitian-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-Bold.otf]:+clig;+liga;+tlig;+hist
+Domitian-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-Bold.otf]:+clig;+liga;+tlig;+onum
+Domitian-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-BoldItalic.otf]:+clig;+liga;+tlig
+Domitian-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+Domitian-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Domitian-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-Italic.otf]:+clig;+liga;+tlig
+Domitian-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-Italic.otf]:+clig;+liga;+tlig;+hist
+Domitian-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-Italic.otf]:+clig;+liga;+tlig;+onum
+Domitian-Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-Roman.otf]:+clig;+liga;+tlig
+Domitian-Roman; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-Roman.otf]:+clig;+liga;+tlig;+hist
+Domitian-Roman; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-Roman.otf]:+clig;+liga;+tlig;+onum
+Domitian-Roman; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/domitian/Domitian-Roman.otf]:+clig;+liga;+tlig;+smcp
+Doulos SIL [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/doulossil/Doulos_SIL_Regular.ttf]:+clig;+liga;+tlig
+Doulos SIL; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/doulossil/Doulos_SIL_Regular.ttf]:+clig;+liga;+tlig;+smcp
+Doulos SIL; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/doulossil/Doulos_SIL_Regular.ttf]:+clig;+liga;+tlig;+ss01
+Doulos SIL; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/doulossil/Doulos_SIL_Regular.ttf]:+clig;+liga;+tlig;+ss04
+Doulos SIL; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/doulossil/Doulos_SIL_Regular.ttf]:+clig;+liga;+tlig;+ss05
+Doulos SIL; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/doulossil/Doulos_SIL_Regular.ttf]:+clig;+liga;+tlig;+ss06
+Droid Sans [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/droid/droidsans/DroidSans.ttf]:+clig;+liga;+tlig
+Droid Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/droid/droidsans/DroidSans-Bold.ttf]:+clig;+liga;+tlig
+Droid Sans Mono [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/droid/droidsansmono/DroidSansMono.ttf]:+clig;+liga;+tlig
+Droid Serif [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/droid/droidserif/DroidSerif-Regular.ttf]:+clig;+liga;+tlig
+Droid Serif Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/droid/droidserif/DroidSerif-Bold.ttf]:+clig;+liga;+tlig
+Droid Serif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/droid/droidserif/DroidSerif-BoldItalic.ttf]:+clig;+liga;+tlig
+Droid Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/droid/droidserif/DroidSerif-Italic.ttf]:+clig;+liga;+tlig
+EB Garamond Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig
+EB Garamond Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+hist
+EB Garamond Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+onum
+EB Garamond Bold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+pcap
+EB Garamond Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+smcp
+EB Garamond Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+ss01
+EB Garamond Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+ss02
+EB Garamond Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+ss03
+EB Garamond Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+ss04
+EB Garamond Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+ss05
+EB Garamond Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+ss06
+EB Garamond Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+ss07
+EB Garamond Bold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Bold.otf]:+clig;+liga;+tlig;+swsh
+EB Garamond Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig
+EB Garamond Bold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+EB Garamond Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+EB Garamond Bold Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+pcap
+EB Garamond Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+EB Garamond Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+EB Garamond Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+EB Garamond Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+EB Garamond Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+EB Garamond Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+EB Garamond Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+EB Garamond Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+EB Garamond Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+EB Garamond ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig
+EB Garamond ExtraBold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+hist
+EB Garamond ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+EB Garamond ExtraBold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+pcap
+EB Garamond ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+EB Garamond ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+EB Garamond ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+EB Garamond ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+EB Garamond ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+EB Garamond ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+EB Garamond ExtraBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+ss06
+EB Garamond ExtraBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+ss07
+EB Garamond ExtraBold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBold.otf]:+clig;+liga;+tlig;+swsh
+EB Garamond ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+EB Garamond ExtraBold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+hist
+EB Garamond ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+EB Garamond ExtraBold Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+pcap
+EB Garamond ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+EB Garamond ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+EB Garamond ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+EB Garamond ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+EB Garamond ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+EB Garamond ExtraBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+EB Garamond ExtraBold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+EB Garamond ExtraBold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+EB Garamond ExtraBold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+EB Garamond Initials [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Initials.otf]:+clig;+liga;+tlig
+EB Garamond Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig
+EB Garamond Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+hist
+EB Garamond Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+onum
+EB Garamond Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+pcap
+EB Garamond Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+smcp
+EB Garamond Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+ss01
+EB Garamond Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+ss02
+EB Garamond Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+ss03
+EB Garamond Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+ss04
+EB Garamond Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+ss05
+EB Garamond Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+ss06
+EB Garamond Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+ss07
+EB Garamond Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Italic.otf]:+clig;+liga;+tlig;+swsh
+EB Garamond Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig
+EB Garamond Medium; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+hist
+EB Garamond Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+onum
+EB Garamond Medium; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+pcap
+EB Garamond Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+smcp
+EB Garamond Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+ss01
+EB Garamond Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+ss02
+EB Garamond Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+ss03
+EB Garamond Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+ss04
+EB Garamond Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+ss05
+EB Garamond Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+ss06
+EB Garamond Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+ss07
+EB Garamond Medium; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Medium.otf]:+clig;+liga;+tlig;+swsh
+EB Garamond Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig
+EB Garamond Medium Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+hist
+EB Garamond Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+EB Garamond Medium Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+pcap
+EB Garamond Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+EB Garamond Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+EB Garamond Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+EB Garamond Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+EB Garamond Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+EB Garamond Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+EB Garamond Medium Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+EB Garamond Medium Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+ss07
+EB Garamond Medium Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-MediumItalic.otf]:+clig;+liga;+tlig;+swsh
+EB Garamond Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig
+EB Garamond Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+hist
+EB Garamond Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+onum
+EB Garamond Regular; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+pcap
+EB Garamond Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+smcp
+EB Garamond Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+ss01
+EB Garamond Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+ss02
+EB Garamond Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+ss03
+EB Garamond Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+ss04
+EB Garamond Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+ss05
+EB Garamond Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+ss06
+EB Garamond Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+ss07
+EB Garamond Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-Regular.otf]:+clig;+liga;+tlig;+swsh
+EB Garamond SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig
+EB Garamond SemiBold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+hist
+EB Garamond SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+onum
+EB Garamond SemiBold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+pcap
+EB Garamond SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+EB Garamond SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+EB Garamond SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+EB Garamond SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+EB Garamond SemiBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+EB Garamond SemiBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+EB Garamond SemiBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+ss06
+EB Garamond SemiBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+ss07
+EB Garamond SemiBold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBold.otf]:+clig;+liga;+tlig;+swsh
+EB Garamond SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig
+EB Garamond SemiBold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+hist
+EB Garamond SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+EB Garamond SemiBold Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+pcap
+EB Garamond SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+EB Garamond SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+EB Garamond SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+EB Garamond SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+EB Garamond SemiBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+EB Garamond SemiBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+EB Garamond SemiBold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+EB Garamond SemiBold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+EB Garamond SemiBold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ebgaramond/EBGaramond-SemiBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+ET Bembo Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Bold.otf]:+clig;+liga;+tlig
+ET Bembo Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Bold.otf]:+clig;+liga;+tlig;+onum
+ET Bembo Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Bold.otf]:+clig;+liga;+tlig;+smcp
+ET Bembo Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Bold.otf]:+clig;+liga;+tlig;+ss02
+ET Bembo Bold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Bold.otf]:+clig;+liga;+tlig;+ss09
+ET Bembo Bold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Bold.otf]:+clig;+liga;+tlig;+swsh
+ET Bembo Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-BoldItalic.otf]:+clig;+liga;+tlig
+ET Bembo Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+ET Bembo Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+ET Bembo Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+ET Bembo Bold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-BoldItalic.otf]:+clig;+liga;+tlig;+ss09
+ET Bembo Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+ET Bembo Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Italic.otf]:+clig;+liga;+tlig
+ET Bembo Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Italic.otf]:+clig;+liga;+tlig;+onum
+ET Bembo Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Italic.otf]:+clig;+liga;+tlig;+smcp
+ET Bembo Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Italic.otf]:+clig;+liga;+tlig;+ss02
+ET Bembo Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Italic.otf]:+clig;+liga;+tlig;+ss09
+ET Bembo Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Italic.otf]:+clig;+liga;+tlig;+swsh
+ET Bembo Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Regular.otf]:+clig;+liga;+tlig
+ET Bembo Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Regular.otf]:+clig;+liga;+tlig;+onum
+ET Bembo Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Regular.otf]:+clig;+liga;+tlig;+smcp
+ET Bembo Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Regular.otf]:+clig;+liga;+tlig;+ss02
+ET Bembo Regular; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Regular.otf]:+clig;+liga;+tlig;+ss09
+ET Bembo Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/etbb/ETbb-Regular.otf]:+clig;+liga;+tlig;+swsh
+Eczar [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Regular.otf]:+clig;+liga;+tlig
+Eczar; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Regular.otf]:+clig;+liga;+tlig;+ss01
+Eczar; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Regular.otf]:+clig;+liga;+tlig;+ss02
+Eczar; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Regular.otf]:+clig;+liga;+tlig;+ss03
+Eczar; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Regular.otf]:+clig;+liga;+tlig;+ss05
+Eczar; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Regular.otf]:+clig;+liga;+tlig;+ss06
+Eczar; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Regular.otf]:+clig;+liga;+tlig;+ss14
+Eczar Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Bold.otf]:+clig;+liga;+tlig
+Eczar Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Bold.otf]:+clig;+liga;+tlig;+ss01
+Eczar Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Bold.otf]:+clig;+liga;+tlig;+ss02
+Eczar Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Bold.otf]:+clig;+liga;+tlig;+ss03
+Eczar Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Bold.otf]:+clig;+liga;+tlig;+ss05
+Eczar Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Bold.otf]:+clig;+liga;+tlig;+ss06
+Eczar Bold; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Bold.otf]:+clig;+liga;+tlig;+ss14
+Eczar ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-ExtraBold.otf]:+clig;+liga;+tlig
+Eczar ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Eczar ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Eczar ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Eczar ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Eczar ExtraBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-ExtraBold.otf]:+clig;+liga;+tlig;+ss06
+Eczar ExtraBold; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-ExtraBold.otf]:+clig;+liga;+tlig;+ss14
+Eczar Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Medium.otf]:+clig;+liga;+tlig
+Eczar Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Medium.otf]:+clig;+liga;+tlig;+ss01
+Eczar Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Medium.otf]:+clig;+liga;+tlig;+ss02
+Eczar Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Medium.otf]:+clig;+liga;+tlig;+ss03
+Eczar Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Medium.otf]:+clig;+liga;+tlig;+ss05
+Eczar Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Medium.otf]:+clig;+liga;+tlig;+ss06
+Eczar Medium; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-Medium.otf]:+clig;+liga;+tlig;+ss14
+Eczar SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-SemiBold.otf]:+clig;+liga;+tlig
+Eczar SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Eczar SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Eczar SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Eczar SemiBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+Eczar SemiBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-SemiBold.otf]:+clig;+liga;+tlig;+ss06
+Eczar SemiBold; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/eczar/Eczar-SemiBold.otf]:+clig;+liga;+tlig;+ss14
+Equity A [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityARegular.otf]:+clig;+liga;+tlig
+Equity A; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityARegular.otf]:+clig;+liga;+tlig;+hist
+Equity A; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityARegular.otf]:+clig;+liga;+tlig;+onum
+Equity A; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityARegular.otf]:+clig;+liga;+tlig;+ss01
+Equity A; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityARegular.otf]:+clig;+liga;+tlig;+ss02
+Equity A; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityARegular.otf]:+clig;+liga;+tlig;+ss07
+Equity A; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityARegular.otf]:+clig;+liga;+tlig;+ss08
+Equity A; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityARegular.otf]:+clig;+liga;+tlig;+ss09
+Equity A [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityARegular.ttf]:+clig;+liga;+tlig
+Equity A; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityARegular.ttf]:+clig;+liga;+tlig;+hist
+Equity A; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityARegular.ttf]:+clig;+liga;+tlig;+onum
+Equity A; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityARegular.ttf]:+clig;+liga;+tlig;+ss01
+Equity A; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityARegular.ttf]:+clig;+liga;+tlig;+ss02
+Equity A; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityARegular.ttf]:+clig;+liga;+tlig;+ss07
+Equity A; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityARegular.ttf]:+clig;+liga;+tlig;+ss08
+Equity A; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityARegular.ttf]:+clig;+liga;+tlig;+ss09
+Equity A Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABold.otf]:+clig;+liga;+tlig
+Equity A Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABold.otf]:+clig;+liga;+tlig;+hist
+Equity A Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABold.otf]:+clig;+liga;+tlig;+onum
+Equity A Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABold.otf]:+clig;+liga;+tlig;+ss01
+Equity A Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABold.otf]:+clig;+liga;+tlig;+ss02
+Equity A Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABold.otf]:+clig;+liga;+tlig;+ss07
+Equity A Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABold.otf]:+clig;+liga;+tlig;+ss08
+Equity A Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABold.otf]:+clig;+liga;+tlig;+ss09
+Equity A Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABold.ttf]:+clig;+liga;+tlig
+Equity A Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABold.ttf]:+clig;+liga;+tlig;+hist
+Equity A Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABold.ttf]:+clig;+liga;+tlig;+onum
+Equity A Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABold.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABold.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABold.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABold.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABold.ttf]:+clig;+liga;+tlig;+ss09
+Equity A Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig
+Equity A Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+hist
+Equity A Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+onum
+Equity A Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity A Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity A Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity A Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity A Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity A Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity A Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity A Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity A Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity A Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityABoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity A Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig
+Equity A Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity A Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity A Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity A Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity A Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity A Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity A Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity A Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityABoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity A Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsRegular.otf]:+clig;+liga;+tlig
+Equity A Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsRegular.otf]:+clig;+liga;+tlig;+onum
+Equity A Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Equity A Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Equity A Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Equity A Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Equity A Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Equity A Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsRegular.ttf]:+clig;+liga;+tlig
+Equity A Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Equity A Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Equity A Caps Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsBold.otf]:+clig;+liga;+tlig
+Equity A Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsBold.otf]:+clig;+liga;+tlig;+onum
+Equity A Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsBold.otf]:+clig;+liga;+tlig;+ss01
+Equity A Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsBold.otf]:+clig;+liga;+tlig;+ss02
+Equity A Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsBold.otf]:+clig;+liga;+tlig;+ss07
+Equity A Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsBold.otf]:+clig;+liga;+tlig;+ss08
+Equity A Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityACapsBold.otf]:+clig;+liga;+tlig;+ss10
+Equity A Caps Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsBold.ttf]:+clig;+liga;+tlig
+Equity A Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsBold.ttf]:+clig;+liga;+tlig;+onum
+Equity A Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsBold.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsBold.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsBold.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsBold.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityACapsBold.ttf]:+clig;+liga;+tlig;+ss10
+Equity A Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig
+Equity A Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+hist
+Equity A Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+onum
+Equity A Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity A Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity A Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity A Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity A Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity A Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity A Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity A Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity A Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity A Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityAItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity A Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig
+Equity A Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity A Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity A Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity A Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity A Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity A Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity A Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity A Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityAItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity A Tab [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabRegular.otf]:+clig;+liga;+tlig
+Equity A Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabRegular.otf]:+clig;+liga;+tlig;+hist
+Equity A Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabRegular.otf]:+clig;+liga;+tlig;+onum
+Equity A Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabRegular.otf]:+clig;+liga;+tlig;+ss01
+Equity A Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabRegular.otf]:+clig;+liga;+tlig;+ss02
+Equity A Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabRegular.otf]:+clig;+liga;+tlig;+ss07
+Equity A Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabRegular.otf]:+clig;+liga;+tlig;+ss08
+Equity A Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabRegular.otf]:+clig;+liga;+tlig;+ss09
+Equity A Tab [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabRegular.ttf]:+clig;+liga;+tlig
+Equity A Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabRegular.ttf]:+clig;+liga;+tlig;+hist
+Equity A Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabRegular.ttf]:+clig;+liga;+tlig;+onum
+Equity A Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabRegular.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabRegular.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabRegular.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabRegular.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabRegular.ttf]:+clig;+liga;+tlig;+ss09
+Equity A Tab Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBold.otf]:+clig;+liga;+tlig
+Equity A Tab Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBold.otf]:+clig;+liga;+tlig;+hist
+Equity A Tab Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBold.otf]:+clig;+liga;+tlig;+onum
+Equity A Tab Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBold.otf]:+clig;+liga;+tlig;+ss01
+Equity A Tab Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBold.otf]:+clig;+liga;+tlig;+ss02
+Equity A Tab Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBold.otf]:+clig;+liga;+tlig;+ss07
+Equity A Tab Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBold.otf]:+clig;+liga;+tlig;+ss08
+Equity A Tab Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBold.otf]:+clig;+liga;+tlig;+ss09
+Equity A Tab Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBold.ttf]:+clig;+liga;+tlig
+Equity A Tab Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBold.ttf]:+clig;+liga;+tlig;+hist
+Equity A Tab Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBold.ttf]:+clig;+liga;+tlig;+onum
+Equity A Tab Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBold.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Tab Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBold.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Tab Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBold.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Tab Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBold.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Tab Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBold.ttf]:+clig;+liga;+tlig;+ss09
+Equity A Tab Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig
+Equity A Tab Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+hist
+Equity A Tab Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Equity A Tab Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity A Tab Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity A Tab Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity A Tab Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity A Tab Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity A Tab Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity A Tab Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity A Tab Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity A Tab Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity A Tab Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity A Tab Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig
+Equity A Tab Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity A Tab Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity A Tab Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Tab Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Tab Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity A Tab Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity A Tab Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity A Tab Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity A Tab Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Tab Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Tab Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity A Tab Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity A Tab Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsRegular.otf]:+clig;+liga;+tlig
+Equity A Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsRegular.otf]:+clig;+liga;+tlig;+onum
+Equity A Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Equity A Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Equity A Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Equity A Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Equity A Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Equity A Tab Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsRegular.ttf]:+clig;+liga;+tlig
+Equity A Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Equity A Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Equity A Tab Caps Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsBold.otf]:+clig;+liga;+tlig
+Equity A Tab Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsBold.otf]:+clig;+liga;+tlig;+onum
+Equity A Tab Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsBold.otf]:+clig;+liga;+tlig;+ss01
+Equity A Tab Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsBold.otf]:+clig;+liga;+tlig;+ss02
+Equity A Tab Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsBold.otf]:+clig;+liga;+tlig;+ss07
+Equity A Tab Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsBold.otf]:+clig;+liga;+tlig;+ss08
+Equity A Tab Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabCapsBold.otf]:+clig;+liga;+tlig;+ss10
+Equity A Tab Caps Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsBold.ttf]:+clig;+liga;+tlig
+Equity A Tab Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsBold.ttf]:+clig;+liga;+tlig;+onum
+Equity A Tab Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsBold.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Tab Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsBold.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Tab Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsBold.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Tab Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsBold.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Tab Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabCapsBold.ttf]:+clig;+liga;+tlig;+ss10
+Equity A Tab Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig
+Equity A Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+hist
+Equity A Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+onum
+Equity A Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity A Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity A Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity A Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity A Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity A Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity A Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity A Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity A Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity A Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityATabItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity A Tab Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig
+Equity A Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity A Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity A Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity A Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity A Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity A Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity A Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity A Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity A Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity A Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity A Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity A Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityATabItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity B [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBRegular.otf]:+clig;+liga;+tlig
+Equity B; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBRegular.otf]:+clig;+liga;+tlig;+hist
+Equity B; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBRegular.otf]:+clig;+liga;+tlig;+onum
+Equity B; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBRegular.otf]:+clig;+liga;+tlig;+ss01
+Equity B; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBRegular.otf]:+clig;+liga;+tlig;+ss02
+Equity B; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBRegular.otf]:+clig;+liga;+tlig;+ss07
+Equity B; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBRegular.otf]:+clig;+liga;+tlig;+ss08
+Equity B; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBRegular.otf]:+clig;+liga;+tlig;+ss09
+Equity B [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBRegular.ttf]:+clig;+liga;+tlig
+Equity B; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBRegular.ttf]:+clig;+liga;+tlig;+hist
+Equity B; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBRegular.ttf]:+clig;+liga;+tlig;+onum
+Equity B; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBRegular.ttf]:+clig;+liga;+tlig;+ss01
+Equity B; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBRegular.ttf]:+clig;+liga;+tlig;+ss02
+Equity B; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBRegular.ttf]:+clig;+liga;+tlig;+ss07
+Equity B; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBRegular.ttf]:+clig;+liga;+tlig;+ss08
+Equity B; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBRegular.ttf]:+clig;+liga;+tlig;+ss09
+Equity B Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBold.otf]:+clig;+liga;+tlig
+Equity B Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBold.otf]:+clig;+liga;+tlig;+hist
+Equity B Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBold.otf]:+clig;+liga;+tlig;+onum
+Equity B Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBold.otf]:+clig;+liga;+tlig;+ss01
+Equity B Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBold.otf]:+clig;+liga;+tlig;+ss02
+Equity B Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBold.otf]:+clig;+liga;+tlig;+ss07
+Equity B Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBold.otf]:+clig;+liga;+tlig;+ss08
+Equity B Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBold.otf]:+clig;+liga;+tlig;+ss09
+Equity B Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBold.ttf]:+clig;+liga;+tlig
+Equity B Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBold.ttf]:+clig;+liga;+tlig;+hist
+Equity B Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBold.ttf]:+clig;+liga;+tlig;+onum
+Equity B Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBold.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBold.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBold.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBold.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBold.ttf]:+clig;+liga;+tlig;+ss09
+Equity B Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig
+Equity B Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+hist
+Equity B Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Equity B Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity B Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity B Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity B Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity B Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity B Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity B Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity B Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity B Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity B Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity B Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig
+Equity B Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity B Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity B Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity B Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity B Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity B Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity B Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity B Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity B Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsRegular.otf]:+clig;+liga;+tlig
+Equity B Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsRegular.otf]:+clig;+liga;+tlig;+onum
+Equity B Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Equity B Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Equity B Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Equity B Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Equity B Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Equity B Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsRegular.ttf]:+clig;+liga;+tlig
+Equity B Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Equity B Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Equity B Caps Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsBold.otf]:+clig;+liga;+tlig
+Equity B Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsBold.otf]:+clig;+liga;+tlig;+onum
+Equity B Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsBold.otf]:+clig;+liga;+tlig;+ss01
+Equity B Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsBold.otf]:+clig;+liga;+tlig;+ss02
+Equity B Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsBold.otf]:+clig;+liga;+tlig;+ss07
+Equity B Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsBold.otf]:+clig;+liga;+tlig;+ss08
+Equity B Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBCapsBold.otf]:+clig;+liga;+tlig;+ss10
+Equity B Caps Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsBold.ttf]:+clig;+liga;+tlig
+Equity B Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsBold.ttf]:+clig;+liga;+tlig;+onum
+Equity B Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsBold.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsBold.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsBold.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsBold.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBCapsBold.ttf]:+clig;+liga;+tlig;+ss10
+Equity B Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig
+Equity B Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+hist
+Equity B Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+onum
+Equity B Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity B Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity B Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity B Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity B Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity B Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity B Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity B Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity B Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity B Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity B Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig
+Equity B Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity B Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity B Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity B Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity B Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity B Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity B Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity B Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity B Tab [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabRegular.otf]:+clig;+liga;+tlig
+Equity B Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabRegular.otf]:+clig;+liga;+tlig;+hist
+Equity B Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabRegular.otf]:+clig;+liga;+tlig;+onum
+Equity B Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabRegular.otf]:+clig;+liga;+tlig;+ss01
+Equity B Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabRegular.otf]:+clig;+liga;+tlig;+ss02
+Equity B Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabRegular.otf]:+clig;+liga;+tlig;+ss07
+Equity B Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabRegular.otf]:+clig;+liga;+tlig;+ss08
+Equity B Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabRegular.otf]:+clig;+liga;+tlig;+ss09
+Equity B Tab [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabRegular.ttf]:+clig;+liga;+tlig
+Equity B Tab; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabRegular.ttf]:+clig;+liga;+tlig;+hist
+Equity B Tab; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabRegular.ttf]:+clig;+liga;+tlig;+onum
+Equity B Tab; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabRegular.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Tab; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabRegular.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Tab; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabRegular.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Tab; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabRegular.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Tab; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabRegular.ttf]:+clig;+liga;+tlig;+ss09
+Equity B Tab Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBold.otf]:+clig;+liga;+tlig
+Equity B Tab Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBold.otf]:+clig;+liga;+tlig;+hist
+Equity B Tab Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBold.otf]:+clig;+liga;+tlig;+onum
+Equity B Tab Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBold.otf]:+clig;+liga;+tlig;+ss01
+Equity B Tab Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBold.otf]:+clig;+liga;+tlig;+ss02
+Equity B Tab Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBold.otf]:+clig;+liga;+tlig;+ss07
+Equity B Tab Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBold.otf]:+clig;+liga;+tlig;+ss08
+Equity B Tab Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBold.otf]:+clig;+liga;+tlig;+ss09
+Equity B Tab Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBold.ttf]:+clig;+liga;+tlig
+Equity B Tab Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBold.ttf]:+clig;+liga;+tlig;+hist
+Equity B Tab Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBold.ttf]:+clig;+liga;+tlig;+onum
+Equity B Tab Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBold.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Tab Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBold.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Tab Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBold.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Tab Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBold.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Tab Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBold.ttf]:+clig;+liga;+tlig;+ss09
+Equity B Tab Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig
+Equity B Tab Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+hist
+Equity B Tab Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Equity B Tab Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity B Tab Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity B Tab Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity B Tab Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity B Tab Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity B Tab Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity B Tab Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity B Tab Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity B Tab Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity B Tab Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity B Tab Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig
+Equity B Tab Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity B Tab Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity B Tab Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Tab Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Tab Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity B Tab Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity B Tab Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity B Tab Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity B Tab Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Tab Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Tab Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity B Tab Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity B Tab Caps [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsRegular.otf]:+clig;+liga;+tlig
+Equity B Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsRegular.otf]:+clig;+liga;+tlig;+onum
+Equity B Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsRegular.otf]:+clig;+liga;+tlig;+ss01
+Equity B Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsRegular.otf]:+clig;+liga;+tlig;+ss02
+Equity B Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsRegular.otf]:+clig;+liga;+tlig;+ss07
+Equity B Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsRegular.otf]:+clig;+liga;+tlig;+ss08
+Equity B Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsRegular.otf]:+clig;+liga;+tlig;+ss10
+Equity B Tab Caps [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsRegular.ttf]:+clig;+liga;+tlig
+Equity B Tab Caps; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsRegular.ttf]:+clig;+liga;+tlig;+onum
+Equity B Tab Caps; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsRegular.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Tab Caps; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsRegular.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Tab Caps; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsRegular.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Tab Caps; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsRegular.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Tab Caps; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsRegular.ttf]:+clig;+liga;+tlig;+ss10
+Equity B Tab Caps Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsBold.otf]:+clig;+liga;+tlig
+Equity B Tab Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsBold.otf]:+clig;+liga;+tlig;+onum
+Equity B Tab Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsBold.otf]:+clig;+liga;+tlig;+ss01
+Equity B Tab Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsBold.otf]:+clig;+liga;+tlig;+ss02
+Equity B Tab Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsBold.otf]:+clig;+liga;+tlig;+ss07
+Equity B Tab Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsBold.otf]:+clig;+liga;+tlig;+ss08
+Equity B Tab Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabCapsBold.otf]:+clig;+liga;+tlig;+ss10
+Equity B Tab Caps Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsBold.ttf]:+clig;+liga;+tlig
+Equity B Tab Caps Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsBold.ttf]:+clig;+liga;+tlig;+onum
+Equity B Tab Caps Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsBold.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Tab Caps Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsBold.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Tab Caps Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsBold.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Tab Caps Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsBold.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Tab Caps Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabCapsBold.ttf]:+clig;+liga;+tlig;+ss10
+Equity B Tab Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig
+Equity B Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+hist
+Equity B Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+onum
+Equity B Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity B Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity B Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity B Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity B Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity B Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity B Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity B Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity B Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity B Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityBTabItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity B Tab Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig
+Equity B Tab Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity B Tab Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity B Tab Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity B Tab Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity B Tab Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity B Tab Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity B Tab Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity B Tab Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity B Tab Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity B Tab Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity B Tab Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity B Tab Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityBTabItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity OT A [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTARegular.otf]:+clig;+liga;+tlig
+Equity OT A; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTARegular.otf]:+clig;+liga;+tlig;+hist
+Equity OT A; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTARegular.otf]:+clig;+liga;+tlig;+onum
+Equity OT A; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTARegular.otf]:+clig;+liga;+tlig;+smcp
+Equity OT A; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTARegular.otf]:+clig;+liga;+tlig;+ss01
+Equity OT A; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTARegular.otf]:+clig;+liga;+tlig;+ss02
+Equity OT A; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTARegular.otf]:+clig;+liga;+tlig;+ss07
+Equity OT A; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTARegular.otf]:+clig;+liga;+tlig;+ss08
+Equity OT A; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTARegular.otf]:+clig;+liga;+tlig;+ss09
+Equity OT A; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTARegular.otf]:+clig;+liga;+tlig;+ss10
+Equity OT A [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTARegular.ttf]:+clig;+liga;+tlig
+Equity OT A; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTARegular.ttf]:+clig;+liga;+tlig;+hist
+Equity OT A; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTARegular.ttf]:+clig;+liga;+tlig;+onum
+Equity OT A; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTARegular.ttf]:+clig;+liga;+tlig;+smcp
+Equity OT A; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTARegular.ttf]:+clig;+liga;+tlig;+ss01
+Equity OT A; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTARegular.ttf]:+clig;+liga;+tlig;+ss02
+Equity OT A; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTARegular.ttf]:+clig;+liga;+tlig;+ss07
+Equity OT A; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTARegular.ttf]:+clig;+liga;+tlig;+ss08
+Equity OT A; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTARegular.ttf]:+clig;+liga;+tlig;+ss09
+Equity OT A; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTARegular.ttf]:+clig;+liga;+tlig;+ss10
+Equity OT A Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABold.otf]:+clig;+liga;+tlig
+Equity OT A Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABold.otf]:+clig;+liga;+tlig;+hist
+Equity OT A Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABold.otf]:+clig;+liga;+tlig;+onum
+Equity OT A Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABold.otf]:+clig;+liga;+tlig;+smcp
+Equity OT A Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABold.otf]:+clig;+liga;+tlig;+ss01
+Equity OT A Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABold.otf]:+clig;+liga;+tlig;+ss02
+Equity OT A Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABold.otf]:+clig;+liga;+tlig;+ss07
+Equity OT A Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABold.otf]:+clig;+liga;+tlig;+ss08
+Equity OT A Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABold.otf]:+clig;+liga;+tlig;+ss09
+Equity OT A Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABold.otf]:+clig;+liga;+tlig;+ss10
+Equity OT A Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABold.ttf]:+clig;+liga;+tlig
+Equity OT A Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABold.ttf]:+clig;+liga;+tlig;+hist
+Equity OT A Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABold.ttf]:+clig;+liga;+tlig;+onum
+Equity OT A Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABold.ttf]:+clig;+liga;+tlig;+smcp
+Equity OT A Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABold.ttf]:+clig;+liga;+tlig;+ss01
+Equity OT A Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABold.ttf]:+clig;+liga;+tlig;+ss02
+Equity OT A Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABold.ttf]:+clig;+liga;+tlig;+ss07
+Equity OT A Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABold.ttf]:+clig;+liga;+tlig;+ss08
+Equity OT A Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABold.ttf]:+clig;+liga;+tlig;+ss09
+Equity OT A Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABold.ttf]:+clig;+liga;+tlig;+ss10
+Equity OT A Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig
+Equity OT A Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+hist
+Equity OT A Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+onum
+Equity OT A Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity OT A Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity OT A Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity OT A Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity OT A Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity OT A Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity OT A Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity OT A Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity OT A Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity OT A Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Equity OT A Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTABoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity OT A Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig
+Equity OT A Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity OT A Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity OT A Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity OT A Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity OT A Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity OT A Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity OT A Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity OT A Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity OT A Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity OT A Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity OT A Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity OT A Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Equity OT A Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTABoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity OT A Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig
+Equity OT A Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+hist
+Equity OT A Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+onum
+Equity OT A Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity OT A Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity OT A Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity OT A Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity OT A Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity OT A Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity OT A Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity OT A Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity OT A Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity OT A Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss10
+Equity OT A Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTAItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity OT A Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig
+Equity OT A Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity OT A Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity OT A Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity OT A Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity OT A Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity OT A Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity OT A Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity OT A Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity OT A Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity OT A Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity OT A Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity OT A Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss10
+Equity OT A Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTAItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity OT B [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBRegular.otf]:+clig;+liga;+tlig
+Equity OT B; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBRegular.otf]:+clig;+liga;+tlig;+hist
+Equity OT B; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBRegular.otf]:+clig;+liga;+tlig;+onum
+Equity OT B; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBRegular.otf]:+clig;+liga;+tlig;+smcp
+Equity OT B; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBRegular.otf]:+clig;+liga;+tlig;+ss01
+Equity OT B; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBRegular.otf]:+clig;+liga;+tlig;+ss02
+Equity OT B; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBRegular.otf]:+clig;+liga;+tlig;+ss07
+Equity OT B; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBRegular.otf]:+clig;+liga;+tlig;+ss08
+Equity OT B; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBRegular.otf]:+clig;+liga;+tlig;+ss09
+Equity OT B; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBRegular.otf]:+clig;+liga;+tlig;+ss10
+Equity OT B [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBRegular.ttf]:+clig;+liga;+tlig
+Equity OT B; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBRegular.ttf]:+clig;+liga;+tlig;+hist
+Equity OT B; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBRegular.ttf]:+clig;+liga;+tlig;+onum
+Equity OT B; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBRegular.ttf]:+clig;+liga;+tlig;+smcp
+Equity OT B; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBRegular.ttf]:+clig;+liga;+tlig;+ss01
+Equity OT B; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBRegular.ttf]:+clig;+liga;+tlig;+ss02
+Equity OT B; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBRegular.ttf]:+clig;+liga;+tlig;+ss07
+Equity OT B; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBRegular.ttf]:+clig;+liga;+tlig;+ss08
+Equity OT B; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBRegular.ttf]:+clig;+liga;+tlig;+ss09
+Equity OT B; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBRegular.ttf]:+clig;+liga;+tlig;+ss10
+Equity OT B Bold [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBold.otf]:+clig;+liga;+tlig
+Equity OT B Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBold.otf]:+clig;+liga;+tlig;+hist
+Equity OT B Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBold.otf]:+clig;+liga;+tlig;+onum
+Equity OT B Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBold.otf]:+clig;+liga;+tlig;+smcp
+Equity OT B Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBold.otf]:+clig;+liga;+tlig;+ss01
+Equity OT B Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBold.otf]:+clig;+liga;+tlig;+ss02
+Equity OT B Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBold.otf]:+clig;+liga;+tlig;+ss07
+Equity OT B Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBold.otf]:+clig;+liga;+tlig;+ss08
+Equity OT B Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBold.otf]:+clig;+liga;+tlig;+ss09
+Equity OT B Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBold.otf]:+clig;+liga;+tlig;+ss10
+Equity OT B Bold [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBold.ttf]:+clig;+liga;+tlig
+Equity OT B Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBold.ttf]:+clig;+liga;+tlig;+hist
+Equity OT B Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBold.ttf]:+clig;+liga;+tlig;+onum
+Equity OT B Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBold.ttf]:+clig;+liga;+tlig;+smcp
+Equity OT B Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBold.ttf]:+clig;+liga;+tlig;+ss01
+Equity OT B Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBold.ttf]:+clig;+liga;+tlig;+ss02
+Equity OT B Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBold.ttf]:+clig;+liga;+tlig;+ss07
+Equity OT B Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBold.ttf]:+clig;+liga;+tlig;+ss08
+Equity OT B Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBold.ttf]:+clig;+liga;+tlig;+ss09
+Equity OT B Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBold.ttf]:+clig;+liga;+tlig;+ss10
+Equity OT B Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig
+Equity OT B Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+hist
+Equity OT B Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Equity OT B Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity OT B Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity OT B Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity OT B Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity OT B Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity OT B Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity OT B Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity OT B Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity OT B Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity OT B Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Equity OT B Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity OT B Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig
+Equity OT B Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity OT B Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity OT B Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity OT B Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity OT B Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity OT B Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity OT B Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity OT B Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity OT B Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity OT B Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity OT B Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity OT B Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Equity OT B Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Equity OT B Italic [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig
+Equity OT B Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+hist
+Equity OT B Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+onum
+Equity OT B Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss01
+Equity OT B Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss02
+Equity OT B Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss03
+Equity OT B Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss04
+Equity OT B Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss05
+Equity OT B Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss06
+Equity OT B Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss07
+Equity OT B Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss08
+Equity OT B Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss09
+Equity OT B Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss10
+Equity OT B Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/mbtype/equity/EquityOTBItalic.otf]:+clig;+liga;+tlig;+ss11
+Equity OT B Italic [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig
+Equity OT B Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+hist
+Equity OT B Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+onum
+Equity OT B Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss01
+Equity OT B Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss02
+Equity OT B Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss03
+Equity OT B Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss04
+Equity OT B Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss05
+Equity OT B Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss06
+Equity OT B Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss07
+Equity OT B Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss08
+Equity OT B Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss09
+Equity OT B Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss10
+Equity OT B Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/mbtype/equity/EquityOTBItalic.ttf]:+clig;+liga;+tlig;+ss11
+Erewhon Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Bold.otf]:+clig;+liga;+tlig
+Erewhon Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Bold.otf]:+clig;+liga;+tlig;+onum
+Erewhon Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Bold.otf]:+clig;+liga;+tlig;+smcp
+Erewhon Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Bold.otf]:+clig;+liga;+tlig;+ss01
+Erewhon Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Bold.otf]:+clig;+liga;+tlig;+ss02
+Erewhon Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Bold.otf]:+clig;+liga;+tlig;+ss03
+Erewhon Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldItalic.otf]:+clig;+liga;+tlig
+Erewhon Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Erewhon Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Erewhon Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Erewhon Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Erewhon Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Erewhon Bold Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldSlanted.otf]:+clig;+liga;+tlig
+Erewhon Bold Slanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldSlanted.otf]:+clig;+liga;+tlig;+onum
+Erewhon Bold Slanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldSlanted.otf]:+clig;+liga;+tlig;+smcp
+Erewhon Bold Slanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldSlanted.otf]:+clig;+liga;+tlig;+ss01
+Erewhon Bold Slanted; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldSlanted.otf]:+clig;+liga;+tlig;+ss02
+Erewhon Bold Slanted; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-BoldSlanted.otf]:+clig;+liga;+tlig;+ss03
+Erewhon Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Italic.otf]:+clig;+liga;+tlig
+Erewhon Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Italic.otf]:+clig;+liga;+tlig;+onum
+Erewhon Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Italic.otf]:+clig;+liga;+tlig;+smcp
+Erewhon Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Italic.otf]:+clig;+liga;+tlig;+ss01
+Erewhon Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Italic.otf]:+clig;+liga;+tlig;+ss02
+Erewhon Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Italic.otf]:+clig;+liga;+tlig;+ss03
+Erewhon Math Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon-math/Erewhon-Math.otf]:+clig;+liga;+tlig
+Erewhon Math Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon-math/Erewhon-Math.otf]:+clig;+liga;+tlig;+onum
+Erewhon Math Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon-math/Erewhon-Math.otf]:+clig;+liga;+tlig;+ss06
+Erewhon Math Regular; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon-math/Erewhon-Math.otf]:+clig;+liga;+tlig;+ssty
+Erewhon Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Regular.otf]:+clig;+liga;+tlig
+Erewhon Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Regular.otf]:+clig;+liga;+tlig;+onum
+Erewhon Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Regular.otf]:+clig;+liga;+tlig;+smcp
+Erewhon Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Regular.otf]:+clig;+liga;+tlig;+ss01
+Erewhon Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Regular.otf]:+clig;+liga;+tlig;+ss02
+Erewhon Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-Regular.otf]:+clig;+liga;+tlig;+ss03
+Erewhon Regular Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-RegularSlanted.otf]:+clig;+liga;+tlig
+Erewhon Regular Slanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-RegularSlanted.otf]:+clig;+liga;+tlig;+onum
+Erewhon Regular Slanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-RegularSlanted.otf]:+clig;+liga;+tlig;+smcp
+Erewhon Regular Slanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-RegularSlanted.otf]:+clig;+liga;+tlig;+ss01
+Erewhon Regular Slanted; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-RegularSlanted.otf]:+clig;+liga;+tlig;+ss02
+Erewhon Regular Slanted; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon/Erewhon-RegularSlanted.otf]:+clig;+liga;+tlig;+ss03
+Erewhon-Math-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon-math/Erewhon-Math-Bold.otf]:+clig;+liga;+tlig
+Erewhon-Math-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/erewhon-math/Erewhon-Math-Bold.otf]:+clig;+liga;+tlig;+onum
+Euler Math [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/euler-math/Euler-Math.otf]:+clig;+liga;+tlig
+Euler Math; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/euler-math/Euler-Math.otf]:+clig;+liga;+tlig;+onum
+Euler Math; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/euler-math/Euler-Math.otf]:+clig;+liga;+tlig;+ss06
+Euler Math; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/euler-math/Euler-Math.otf]:+clig;+liga;+tlig;+ssty
+Extendomatic Backslant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Backslant.otf]:+clig;+liga;+tlig
+Extendomatic Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Backslant.otf]:+clig;+liga;+tlig;+ss01
+Extendomatic Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Backslant.otf]:+clig;+liga;+tlig;+ss02
+Extendomatic Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Backslant.otf]:+clig;+liga;+tlig;+ss03
+Extendomatic Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Backslant.otf]:+clig;+liga;+tlig;+ss04
+Extendomatic Backslant [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Backslant.ttf]:+clig;+liga;+tlig
+Extendomatic Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Backslant.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Backslant.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Backslant.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Backslant.ttf]:+clig;+liga;+tlig;+ss04
+Extendomatic Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Bold.otf]:+clig;+liga;+tlig
+Extendomatic Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Bold.otf]:+clig;+liga;+tlig;+ss01
+Extendomatic Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Bold.otf]:+clig;+liga;+tlig;+ss02
+Extendomatic Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Bold.otf]:+clig;+liga;+tlig;+ss03
+Extendomatic Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Bold.otf]:+clig;+liga;+tlig;+ss04
+Extendomatic Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Bold.ttf]:+clig;+liga;+tlig
+Extendomatic Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extended [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Extended.otf]:+clig;+liga;+tlig
+Extendomatic Extended; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Extended.otf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extended; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Extended.otf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extended; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Extended.otf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extended; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Extended.otf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extended [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Extended.ttf]:+clig;+liga;+tlig
+Extendomatic Extended; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Extended.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extended; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Extended.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extended; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Extended.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extended; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Extended.ttf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extended Backslant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedBackslant.otf]:+clig;+liga;+tlig
+Extendomatic Extended Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedBackslant.otf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extended Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedBackslant.otf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extended Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedBackslant.otf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extended Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedBackslant.otf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extended Backslant [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedBackslant.ttf]:+clig;+liga;+tlig
+Extendomatic Extended Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedBackslant.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extended Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedBackslant.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extended Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedBackslant.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extended Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedBackslant.ttf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extended Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedBold.otf]:+clig;+liga;+tlig
+Extendomatic Extended Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedBold.otf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extended Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedBold.otf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extended Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedBold.otf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extended Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedBold.otf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extended Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedBold.ttf]:+clig;+liga;+tlig
+Extendomatic Extended Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedBold.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extended Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedBold.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extended Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedBold.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extended Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedBold.ttf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extended Extra Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedExtraLight.otf]:+clig;+liga;+tlig
+Extendomatic Extended Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extended Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extended Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extended Extra Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extended Extra Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedExtraLight.ttf]:+clig;+liga;+tlig
+Extendomatic Extended Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extended Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extended Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extended Extra Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedExtraLight.ttf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extended Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedItalic.otf]:+clig;+liga;+tlig
+Extendomatic Extended Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedItalic.otf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extended Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedItalic.otf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extended Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedItalic.otf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extended Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtendedItalic.otf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extended Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedItalic.ttf]:+clig;+liga;+tlig
+Extendomatic Extended Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedItalic.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extended Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedItalic.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extended Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedItalic.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extended Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtendedItalic.ttf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extra Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtraLight.otf]:+clig;+liga;+tlig
+Extendomatic Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extra Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Extendomatic Extra Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtraLight.ttf]:+clig;+liga;+tlig
+Extendomatic Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Extra Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-ExtraLight.ttf]:+clig;+liga;+tlig;+ss04
+Extendomatic Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Italic.otf]:+clig;+liga;+tlig
+Extendomatic Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Italic.otf]:+clig;+liga;+tlig;+ss01
+Extendomatic Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Italic.otf]:+clig;+liga;+tlig;+ss02
+Extendomatic Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Italic.otf]:+clig;+liga;+tlig;+ss03
+Extendomatic Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Italic.otf]:+clig;+liga;+tlig;+ss04
+Extendomatic Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Italic.ttf]:+clig;+liga;+tlig
+Extendomatic Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Extendomatic Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Regular.otf]:+clig;+liga;+tlig
+Extendomatic Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Regular.otf]:+clig;+liga;+tlig;+ss01
+Extendomatic Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Regular.otf]:+clig;+liga;+tlig;+ss02
+Extendomatic Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Regular.otf]:+clig;+liga;+tlig;+ss03
+Extendomatic Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Extendomatic/Extendomatic-Regular.otf]:+clig;+liga;+tlig;+ss04
+Extendomatic Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Regular.ttf]:+clig;+liga;+tlig
+Extendomatic Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/Extendomatic-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Extendomatic Variable [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/ExtendomaticVariable-VF.ttf]:+clig;+liga;+tlig
+Extendomatic Variable; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/ExtendomaticVariable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Extendomatic Variable; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/ExtendomaticVariable-VF.ttf]:+clig;+liga;+tlig;+ss02
+Extendomatic Variable; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/ExtendomaticVariable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Extendomatic Variable; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Extendomatic/ExtendomaticVariable-VF.ttf]:+clig;+liga;+tlig;+ss04
+FairyTaleJF [/usr/local/texlive/texmf-local/fonts/truetype/Jukebox/FAIRTJ__.ttf]:+clig;+liga;+tlig
+Fandol Braille Display [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fandol/FandolBraille-Display.otf]:+clig;+liga;+tlig
+Fandol Braille Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fandol/FandolBraille-Regular.otf]:+clig;+liga;+tlig
+FandolFang R [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fandol/FandolFang-Regular.otf]:+clig;+liga;+tlig
+FandolHei [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fandol/FandolHei-Regular.otf]:+clig;+liga;+tlig
+FandolHei Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fandol/FandolHei-Bold.otf]:+clig;+liga;+tlig
+FandolKai [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fandol/FandolKai-Regular.otf]:+clig;+liga;+tlig
+FandolSong [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fandol/FandolSong-Regular.otf]:+clig;+liga;+tlig
+FandolSong Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fandol/FandolSong-Bold.otf]:+clig;+liga;+tlig
+Fedorovsk Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/FedorovskUnicode.otf]:+clig;+liga;+tlig
+Fedorovsk Unicode; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/FedorovskUnicode.otf]:+clig;+liga;+tlig;+ss01
+Fedorovsk Unicode; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/FedorovskUnicode.otf]:+clig;+liga;+tlig;+ss02
+Fedorovsk Unicode; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/FedorovskUnicode.otf]:+clig;+liga;+tlig;+ss10
+Fern Micro Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-Bold.otf]:+clig;+liga;+tlig
+Fern Micro Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-Bold.otf]:+clig;+liga;+tlig;+onum
+Fern Micro Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-Bold.otf]:+clig;+liga;+tlig;+smcp
+Fern Micro Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-Bold.ttf]:+clig;+liga;+tlig
+Fern Micro Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-Bold.ttf]:+clig;+liga;+tlig;+onum
+Fern Micro Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Fern Micro Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-BoldItalic.otf]:+clig;+liga;+tlig
+Fern Micro Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Fern Micro Bold Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Fern Micro Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-BoldItalic.ttf]:+clig;+liga;+tlig
+Fern Micro Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Fern Micro Bold Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Fern Micro Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-Italic.otf]:+clig;+liga;+tlig
+Fern Micro Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-Italic.otf]:+clig;+liga;+tlig;+onum
+Fern Micro Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-Italic.otf]:+clig;+liga;+tlig;+smcp
+Fern Micro Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-Italic.ttf]:+clig;+liga;+tlig
+Fern Micro Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-Italic.ttf]:+clig;+liga;+tlig;+onum
+Fern Micro Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Fern Micro Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-Regular.otf]:+clig;+liga;+tlig
+Fern Micro Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-Regular.otf]:+clig;+liga;+tlig;+onum
+Fern Micro Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernMicro-Regular.otf]:+clig;+liga;+tlig;+smcp
+Fern Micro Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-Regular.ttf]:+clig;+liga;+tlig
+Fern Micro Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-Regular.ttf]:+clig;+liga;+tlig;+onum
+Fern Micro Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernMicro-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Fern Ornaments Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernOrnaments-Regular.otf]:+clig;+liga;+tlig
+Fern Ornaments Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernOrnaments-Regular.ttf]:+clig;+liga;+tlig
+Fern Text Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-Bold.otf]:+clig;+liga;+tlig
+Fern Text Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-Bold.otf]:+clig;+liga;+tlig;+onum
+Fern Text Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-Bold.otf]:+clig;+liga;+tlig;+smcp
+Fern Text Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-Bold.ttf]:+clig;+liga;+tlig
+Fern Text Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-Bold.ttf]:+clig;+liga;+tlig;+onum
+Fern Text Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Fern Text Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-BoldItalic.otf]:+clig;+liga;+tlig
+Fern Text Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Fern Text Bold Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Fern Text Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-BoldItalic.ttf]:+clig;+liga;+tlig
+Fern Text Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Fern Text Bold Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Fern Text Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-Italic.otf]:+clig;+liga;+tlig
+Fern Text Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-Italic.otf]:+clig;+liga;+tlig;+onum
+Fern Text Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-Italic.otf]:+clig;+liga;+tlig;+smcp
+Fern Text Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-Italic.ttf]:+clig;+liga;+tlig
+Fern Text Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-Italic.ttf]:+clig;+liga;+tlig;+onum
+Fern Text Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Fern Text Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-Regular.otf]:+clig;+liga;+tlig
+Fern Text Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-Regular.otf]:+clig;+liga;+tlig;+onum
+Fern Text Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernText-Regular.otf]:+clig;+liga;+tlig;+smcp
+Fern Text Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-Regular.ttf]:+clig;+liga;+tlig
+Fern Text Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-Regular.ttf]:+clig;+liga;+tlig;+onum
+Fern Text Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernText-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Fern Titling Caps Beta Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Fern/FernTitlingCapsBeta-Regular.otf]:+clig;+liga;+tlig
+Fern Variable Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernVariable-Italic-VF.ttf]:+clig;+liga;+tlig
+Fern Variable Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernVariable-Italic-VF.ttf]:+clig;+liga;+tlig;+onum
+Fern Variable Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernVariable-Italic-VF.ttf]:+clig;+liga;+tlig;+smcp
+Fern Variable Roman [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernVariable-Roman-VF.ttf]:+clig;+liga;+tlig
+Fern Variable Roman; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernVariable-Roman-VF.ttf]:+clig;+liga;+tlig;+onum
+Fern Variable Roman; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Fern/FernVariable-Roman-VF.ttf]:+clig;+liga;+tlig;+smcp
+Fetamont Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmb10.otf]:+clig;+liga;+tlig
+Fetamont Bold 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmb8.otf]:+clig;+liga;+tlig
+Fetamont Bold 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmb9.otf]:+clig;+liga;+tlig
+Fetamont Bold Condensed Oblique40 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmbco40.otf]:+clig;+liga;+tlig
+Fetamont Bold Condensed40 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmbc40.otf]:+clig;+liga;+tlig
+Fetamont Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmbo10.otf]:+clig;+liga;+tlig
+Fetamont Bold Oblique 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmbo8.otf]:+clig;+liga;+tlig
+Fetamont Bold Oblique 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmbo9.otf]:+clig;+liga;+tlig
+Fetamont Bold Script [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmbw10.otf]:+clig;+liga;+tlig
+Fetamont Bold Script Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmbwo10.otf]:+clig;+liga;+tlig
+Fetamont Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmc10.otf]:+clig;+liga;+tlig
+Fetamont Condensed Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmco10.otf]:+clig;+liga;+tlig
+Fetamont Heavy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmh10.otf]:+clig;+liga;+tlig
+Fetamont Heavy 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmh8.otf]:+clig;+liga;+tlig
+Fetamont Heavy 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmh9.otf]:+clig;+liga;+tlig
+Fetamont Heavy Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmho10.otf]:+clig;+liga;+tlig
+Fetamont Heavy Oblique 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmho8.otf]:+clig;+liga;+tlig
+Fetamont Heavy Oblique 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmho9.otf]:+clig;+liga;+tlig
+Fetamont Heavy Script [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmhw10.otf]:+clig;+liga;+tlig
+Fetamont Heavy Script Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmhwo10.otf]:+clig;+liga;+tlig
+Fetamont Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffml10.otf]:+clig;+liga;+tlig
+Fetamont Light Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmlc10.otf]:+clig;+liga;+tlig
+Fetamont Light Condensed Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmlco10.otf]:+clig;+liga;+tlig
+Fetamont Light Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmlo10.otf]:+clig;+liga;+tlig
+Fetamont Light Script [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmlw10.otf]:+clig;+liga;+tlig
+Fetamont Light Script Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmlwo10.otf]:+clig;+liga;+tlig
+Fetamont Light Ultra-Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmlq10.otf]:+clig;+liga;+tlig
+Fetamont Light Ultra-Condensed Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmlqo10.otf]:+clig;+liga;+tlig
+Fetamont Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmo10.otf]:+clig;+liga;+tlig
+Fetamont Oblique 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmo8.otf]:+clig;+liga;+tlig
+Fetamont Oblique 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmo9.otf]:+clig;+liga;+tlig
+Fetamont Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmr10.otf]:+clig;+liga;+tlig
+Fetamont Regular 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmr8.otf]:+clig;+liga;+tlig
+Fetamont Regular 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmr9.otf]:+clig;+liga;+tlig
+Fetamont Script [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmw10.otf]:+clig;+liga;+tlig
+Fetamont Script Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fetamont/ffmwo10.otf]:+clig;+liga;+tlig
+Fira Math Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/firamath/FiraMath-Regular.otf]:+clig;+liga;+tlig
+Fira Math Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/firamath/FiraMath-Regular.otf]:+clig;+liga;+tlig;+ss01
+Fira Math Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/firamath/FiraMath-Regular.otf]:+clig;+liga;+tlig;+ss02
+Fira Math Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/firamath/FiraMath-Regular.otf]:+clig;+liga;+tlig;+ss03
+Fira Mono [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-Regular.otf]:+clig;+liga;+tlig
+Fira Mono; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-Regular.otf]:+clig;+liga;+tlig;+onum
+Fira Mono [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-Oblique.otf]:+clig;+liga;+tlig
+Fira Mono; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-Oblique.otf]:+clig;+liga;+tlig;+onum
+Fira Mono Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-Bold.otf]:+clig;+liga;+tlig
+Fira Mono Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-Bold.otf]:+clig;+liga;+tlig;+onum
+Fira Mono BoldOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-BoldOblique.otf]:+clig;+liga;+tlig
+Fira Mono BoldOblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-BoldOblique.otf]:+clig;+liga;+tlig;+onum
+Fira Mono Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-Medium.otf]:+clig;+liga;+tlig
+Fira Mono Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-Medium.otf]:+clig;+liga;+tlig;+onum
+Fira Mono MediumOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-MediumOblique.otf]:+clig;+liga;+tlig
+Fira Mono MediumOblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraMono-MediumOblique.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Bold.otf]:+clig;+liga;+tlig
+Fira Sans Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Bold.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Bold.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Bold.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Bold.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Bold.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Bold.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Bold.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Bold.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BoldItalic.otf]:+clig;+liga;+tlig
+Fira Sans Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Bold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Book.otf]:+clig;+liga;+tlig
+Fira Sans Book; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Book.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Book; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Book.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Book; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Book.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Book; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Book.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Book; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Book.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Book; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Book.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans Book; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Book.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans Book; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Book.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Book Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BookItalic.otf]:+clig;+liga;+tlig
+Fira Sans Book Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BookItalic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Book Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BookItalic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Book Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BookItalic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Book Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BookItalic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Book Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BookItalic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Book Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-BookItalic.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBold.otf]:+clig;+liga;+tlig
+Fira Sans ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Fira Sans ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans ExtraBold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBold.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Fira Sans ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans ExtraBold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLight.otf]:+clig;+liga;+tlig
+Fira Sans ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Fira Sans ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLight.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans ExtraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans ExtraLight; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans ExtraLight; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Fira Sans ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans ExtraLight Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Heavy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Heavy.otf]:+clig;+liga;+tlig
+Fira Sans Heavy; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Heavy.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Heavy; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Heavy.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Heavy; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Heavy.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Heavy; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Heavy.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Heavy; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Heavy.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Heavy; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Heavy.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans Heavy; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Heavy.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans Heavy; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Heavy.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Heavy Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-HeavyItalic.otf]:+clig;+liga;+tlig
+Fira Sans Heavy Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-HeavyItalic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Heavy Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-HeavyItalic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Heavy Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-HeavyItalic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Heavy Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-HeavyItalic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Heavy Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-HeavyItalic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Heavy Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-HeavyItalic.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Italic.otf]:+clig;+liga;+tlig
+Fira Sans Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Italic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Italic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Italic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Italic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Italic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Italic.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Light.otf]:+clig;+liga;+tlig
+Fira Sans Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Light.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Light.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Light.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Light.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Light.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Light.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Light.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans Light; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Light.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-LightItalic.otf]:+clig;+liga;+tlig
+Fira Sans Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Light Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-LightItalic.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Medium.otf]:+clig;+liga;+tlig
+Fira Sans Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Medium.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Medium.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Medium.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Medium.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Medium.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Medium.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Medium.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans Medium; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Medium.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-MediumItalic.otf]:+clig;+liga;+tlig
+Fira Sans Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Medium Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Regular.otf]:+clig;+liga;+tlig
+Fira Sans Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Regular.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Regular.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Regular.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Regular.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Regular.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Regular.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Regular.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Regular.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBold.otf]:+clig;+liga;+tlig
+Fira Sans SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Fira Sans SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans SemiBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans SemiBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans SemiBold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBold.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Fira Sans SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans SemiBold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Thin.otf]:+clig;+liga;+tlig
+Fira Sans Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Thin.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Thin.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Thin.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Thin.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Thin.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Thin.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Thin.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans Thin; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-Thin.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ThinItalic.otf]:+clig;+liga;+tlig
+Fira Sans Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ThinItalic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans Thin Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans UltraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLight.otf]:+clig;+liga;+tlig
+Fira Sans UltraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLight.otf]:+clig;+liga;+tlig;+onum
+Fira Sans UltraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLight.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans UltraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLight.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans UltraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLight.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans UltraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLight.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans UltraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLight.otf]:+clig;+liga;+tlig;+ss04
+Fira Sans UltraLight; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLight.otf]:+clig;+liga;+tlig;+ss05
+Fira Sans UltraLight; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLight.otf]:+clig;+liga;+tlig;+ss10
+Fira Sans UltraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLightItalic.otf]:+clig;+liga;+tlig
+Fira Sans UltraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Fira Sans UltraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLightItalic.otf]:+clig;+liga;+tlig;+smcp
+Fira Sans UltraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Fira Sans UltraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+Fira Sans UltraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Fira Sans UltraLight Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fira/FiraSans-UltraLightItalic.otf]:+clig;+liga;+tlig;+ss10
+Fira Slav [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/FiraSlav-Regular.otf]:+clig;+liga;+tlig
+Fira Slav Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/FiraSlav-Bold.otf]:+clig;+liga;+tlig
+Fixogum [/usr/local/texlive/texmf-local/fonts/truetype/Ingo/Fixogum/TrueType/FIXOGUM_.ttf]:+clig;+liga;+tlig
+Fonetika Dania Iwonae Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/fonetika/FonetikaDaniaIwonaeRegular.ttf]:+clig;+liga;+tlig
+Fonetika Dania Pallae Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/fonetika/FonetikaDaniaPallaeBold.ttf]:+clig;+liga;+tlig
+Fonetika Dania Pallae Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/fonetika/FonetikaDaniaPallaeRegular.ttf]:+clig;+liga;+tlig
+Fonitika Dania Iwonae Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/fonetika/FonetikaDaniaIwonaeBold.ttf]:+clig;+liga;+tlig
+Forma DJR Chiaroscuro Banner Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.otf]:+clig;+liga;+tlig
+Forma DJR Chiaroscuro Banner Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.otf]:+clig;+liga;+tlig;+ss01
+Forma DJR Chiaroscuro Banner Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.otf]:+clig;+liga;+tlig;+ss02
+Forma DJR Chiaroscuro Banner Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.otf]:+clig;+liga;+tlig;+ss03
+Forma DJR Chiaroscuro Banner Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.otf]:+clig;+liga;+tlig;+ss04
+Forma DJR Chiaroscuro Banner Black; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.otf]:+clig;+liga;+tlig;+ss19
+Forma DJR Chiaroscuro Banner Black [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.ttf]:+clig;+liga;+tlig
+Forma DJR Chiaroscuro Banner Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.ttf]:+clig;+liga;+tlig;+ss01
+Forma DJR Chiaroscuro Banner Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.ttf]:+clig;+liga;+tlig;+ss02
+Forma DJR Chiaroscuro Banner Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.ttf]:+clig;+liga;+tlig;+ss03
+Forma DJR Chiaroscuro Banner Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.ttf]:+clig;+liga;+tlig;+ss04
+Forma DJR Chiaroscuro Banner Black; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Black.ttf]:+clig;+liga;+tlig;+ss19
+Forma DJR Chiaroscuro Banner Hairline [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Hairline.otf]:+clig;+liga;+tlig
+Forma DJR Chiaroscuro Banner Hairline; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Hairline.otf]:+clig;+liga;+tlig;+ss01
+Forma DJR Chiaroscuro Banner Hairline; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Hairline.otf]:+clig;+liga;+tlig;+ss02
+Forma DJR Chiaroscuro Banner Hairline; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Hairline.otf]:+clig;+liga;+tlig;+ss03
+Forma DJR Chiaroscuro Banner Hairline; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Hairline.otf]:+clig;+liga;+tlig;+ss04
+Forma DJR Chiaroscuro Banner Hairline [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Hairline.ttf]:+clig;+liga;+tlig
+Forma DJR Chiaroscuro Banner Hairline; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Hairline.ttf]:+clig;+liga;+tlig;+ss01
+Forma DJR Chiaroscuro Banner Hairline; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Hairline.ttf]:+clig;+liga;+tlig;+ss02
+Forma DJR Chiaroscuro Banner Hairline; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Hairline.ttf]:+clig;+liga;+tlig;+ss03
+Forma DJR Chiaroscuro Banner Hairline; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Forma-DJR-Chiaroscuro/FormaDJRChiaroscuroBanner-Hairline.ttf]:+clig;+liga;+tlig;+ss04
+Forum [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/forum/Forum-Regular.otf]:+clig;+liga;+tlig
+Founders [/usr/local/texlive/texmf-local/fonts/truetype/Sherwood/FOUNDERS.ttf]:+clig;+liga;+tlig
+FourierOrns Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fourier/FourierOrns-Regular.otf]:+clig;+liga;+tlig
+Frank Ruehl CLM Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/FrankRuehlCLM-Bold.ttf]:+clig;+liga;+tlig
+Frank Ruehl CLM Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/FrankRuehlCLM-BoldOblique.ttf]:+clig;+liga;+tlig
+Frank Ruehl CLM Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/FrankRuehlCLM-Medium.ttf]:+clig;+liga;+tlig
+Frank Ruehl CLM Medium Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/FrankRuehlCLM-MediumOblique.ttf]:+clig;+liga;+tlig
+Franklin Gothic Book [/usr/local/texlive/texmf-local/fonts/truetype/itc/franklingothic/frabk.ttf]:+clig;+liga;+tlig
+Franklin Gothic Book Italic [/usr/local/texlive/texmf-local/fonts/truetype/itc/franklingothic/frabkit.ttf]:+clig;+liga;+tlig
+Franklin Gothic Demi [/usr/local/texlive/texmf-local/fonts/truetype/itc/franklingothic/fradm.ttf]:+clig;+liga;+tlig
+Franklin Gothic Demi Cond [/usr/local/texlive/texmf-local/fonts/truetype/itc/franklingothic/fradmcn.ttf]:+clig;+liga;+tlig
+Franklin Gothic Demi Italic [/usr/local/texlive/texmf-local/fonts/truetype/itc/franklingothic/fradmit.ttf]:+clig;+liga;+tlig
+Franklin Gothic Heavy [/usr/local/texlive/texmf-local/fonts/truetype/itc/franklingothic/frahv.ttf]:+clig;+liga;+tlig
+Franklin Gothic Heavy Italic [/usr/local/texlive/texmf-local/fonts/truetype/itc/franklingothic/frahvit.ttf]:+clig;+liga;+tlig
+Franklin Gothic Medium [/usr/local/texlive/texmf-local/fonts/truetype/itc/franklingothic/framd.ttf]:+clig;+liga;+tlig
+Franklin Gothic Medium Cond [/usr/local/texlive/texmf-local/fonts/truetype/itc/franklingothic/framdcn.ttf]:+clig;+liga;+tlig
+Franklin Gothic Medium Italic [/usr/local/texlive/texmf-local/fonts/truetype/itc/franklingothic/framdit.ttf]:+clig;+liga;+tlig
+Frederika2016 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/frederika2016/Frederika2016.otf]:+clig;+liga;+tlig
+Free Serifb [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/txfontsb/FreeSerifb.otf]:+clig;+liga;+tlig
+Free Serifb Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/txfontsb/FreeSerifbBold.otf]:+clig;+liga;+tlig
+Free Serifb Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/txfontsb/FreeSerifbBoldItalic.otf]:+clig;+liga;+tlig
+Free Serifb Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/txfontsb/FreeSerifbItalic.otf]:+clig;+liga;+tlig
+FreeMono [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeMono.otf]:+clig;+liga;+tlig
+FreeMono [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeMono.ttf]:+clig;+liga;+tlig
+FreeMono Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeMonoBold.otf]:+clig;+liga;+tlig
+FreeMono Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeMonoBold.ttf]:+clig;+liga;+tlig
+FreeMono Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeMonoBoldOblique.otf]:+clig;+liga;+tlig
+FreeMono Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeMonoBoldOblique.ttf]:+clig;+liga;+tlig
+FreeMono Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeMonoOblique.otf]:+clig;+liga;+tlig
+FreeMono Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeMonoOblique.ttf]:+clig;+liga;+tlig
+FreeSans [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSans.otf]:+clig;+liga;+tlig
+FreeSans; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSans.otf]:+clig;+liga;+tlig;+smcp
+FreeSans [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSans.ttf]:+clig;+liga;+tlig
+FreeSans; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSans.ttf]:+clig;+liga;+tlig;+smcp
+FreeSans Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSansBold.otf]:+clig;+liga;+tlig
+FreeSans Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSansBold.otf]:+clig;+liga;+tlig;+smcp
+FreeSans Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSansBold.ttf]:+clig;+liga;+tlig
+FreeSans Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSansBold.ttf]:+clig;+liga;+tlig;+smcp
+FreeSans Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSansBoldOblique.otf]:+clig;+liga;+tlig
+FreeSans Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSansBoldOblique.ttf]:+clig;+liga;+tlig
+FreeSans Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSansOblique.otf]:+clig;+liga;+tlig
+FreeSans Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSansOblique.ttf]:+clig;+liga;+tlig
+FreeSerif [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSerif.otf]:+clig;+liga;+tlig
+FreeSerif; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSerif.otf]:+clig;+liga;+tlig;+hist
+FreeSerif; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSerif.otf]:+clig;+liga;+tlig;+smcp
+FreeSerif [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSerif.ttf]:+clig;+liga;+tlig
+FreeSerif; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSerif.ttf]:+clig;+liga;+tlig;+hist
+FreeSerif; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSerif.ttf]:+clig;+liga;+tlig;+smcp
+FreeSerif Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSerifBold.otf]:+clig;+liga;+tlig
+FreeSerif Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSerifBold.otf]:+clig;+liga;+tlig;+hist
+FreeSerif Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSerifBold.otf]:+clig;+liga;+tlig;+smcp
+FreeSerif Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSerifBold.ttf]:+clig;+liga;+tlig
+FreeSerif Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSerifBold.ttf]:+clig;+liga;+tlig;+hist
+FreeSerif Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSerifBold.ttf]:+clig;+liga;+tlig;+smcp
+FreeSerif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSerifBoldItalic.otf]:+clig;+liga;+tlig
+FreeSerif Bold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSerifBoldItalic.otf]:+clig;+liga;+tlig;+hist
+FreeSerif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSerifBoldItalic.ttf]:+clig;+liga;+tlig
+FreeSerif Bold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSerifBoldItalic.ttf]:+clig;+liga;+tlig;+hist
+FreeSerif Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSerifItalic.otf]:+clig;+liga;+tlig
+FreeSerif Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gnu-freefont/FreeSerifItalic.otf]:+clig;+liga;+tlig;+hist
+FreeSerif Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSerifItalic.ttf]:+clig;+liga;+tlig
+FreeSerif Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gnu-freefont/FreeSerifItalic.ttf]:+clig;+liga;+tlig;+hist
+FreeSerifb-SmallCaps [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/txfontsb/FreeSerifb-SmallCaps.otf]:+clig;+liga;+tlig
+FreeSerifb-SmallCapsAlt [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/txfontsb/FreeSerifb-SmallCapsAlt.otf]:+clig;+liga;+tlig
+Frm Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/forum/Frm-Bold.otf]:+clig;+liga;+tlig
+Futura Bold [/usr/local/texlive/texmf-local/fonts/truetype/futurans/FuturB41.ttf]:+clig;+liga;+tlig
+Futura Book [/usr/local/texlive/texmf-local/fonts/truetype/futurans/FuturB37.ttf]:+clig;+liga;+tlig
+Futura Book Oblique [/usr/local/texlive/texmf-local/fonts/truetype/futurans/FutuBO08.ttf]:+clig;+liga;+tlig
+Futura Condensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/futurans/futucb18.ttf]:+clig;+liga;+tlig
+Futura Condensed Bold Oblique [/usr/local/texlive/texmf-local/fonts/truetype/futurans/FutCBO63.ttf]:+clig;+liga;+tlig
+Futura Heavy [/usr/local/texlive/texmf-local/fonts/truetype/futurans/FuturH79.ttf]:+clig;+liga;+tlig
+Futura Medium [/usr/local/texlive/texmf-local/fonts/truetype/futurans/futura.ttf]:+clig;+liga;+tlig
+Futura ND [/usr/local/texlive/texmf-local/fonts/truetype/Neufville/TrueType/Funmed__.ttf]:+clig;+liga;+tlig
+Futura ND Medium Oblique [/usr/local/texlive/texmf-local/fonts/truetype/Neufville/TrueType/Funmdita.ttf]:+clig;+liga;+tlig
+GFS Neohellenic Math [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenicmath/GFSNeohellenicMath.otf]:+clig;+liga;+tlig
+GFS Neohellenic Math; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenicmath/GFSNeohellenicMath.otf]:+clig;+liga;+tlig;+smcp
+GFSArtemisia-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsartemisia/GFSArtemisiaBold.otf]:+clig;+liga;+tlig
+GFSArtemisia-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsartemisia/GFSArtemisiaBold.otf]:+clig;+liga;+tlig;+hist
+GFSArtemisia-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsartemisia/GFSArtemisiaBoldIt.otf]:+clig;+liga;+tlig
+GFSArtemisia-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsartemisia/GFSArtemisiaBoldIt.otf]:+clig;+liga;+tlig;+hist
+GFSArtemisia-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsartemisia/GFSArtemisiaIt.otf]:+clig;+liga;+tlig
+GFSArtemisia-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsartemisia/GFSArtemisiaIt.otf]:+clig;+liga;+tlig;+hist
+GFSArtemisia-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsartemisia/GFSArtemisia.otf]:+clig;+liga;+tlig
+GFSArtemisia-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsartemisia/GFSArtemisia.otf]:+clig;+liga;+tlig;+hist
+GFSArtemisia-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsartemisia/GFSArtemisia.otf]:+clig;+liga;+tlig;+onum
+GFSArtemisia-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsartemisia/GFSArtemisia.otf]:+clig;+liga;+tlig;+smcp
+GFSBaskerville-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbaskerville/GFSBaskerville.otf]:+clig;+liga;+tlig
+GFSBodoni-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbodoni/GFSBodoniBold.otf]:+clig;+liga;+tlig
+GFSBodoni-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbodoni/GFSBodoniBold.otf]:+clig;+liga;+tlig;+hist
+GFSBodoni-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbodoni/GFSBodoniBoldIt.otf]:+clig;+liga;+tlig
+GFSBodoni-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbodoni/GFSBodoniBoldIt.otf]:+clig;+liga;+tlig;+hist
+GFSBodoni-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbodoni/GFSBodoniIt.otf]:+clig;+liga;+tlig
+GFSBodoni-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbodoni/GFSBodoniIt.otf]:+clig;+liga;+tlig;+hist
+GFSBodoni-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbodoni/GFSBodoni.otf]:+clig;+liga;+tlig
+GFSBodoni-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbodoni/GFSBodoni.otf]:+clig;+liga;+tlig;+hist
+GFSBodoni-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbodoni/GFSBodoni.otf]:+clig;+liga;+tlig;+onum
+GFSBodoni-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsbodoni/GFSBodoni.otf]:+clig;+liga;+tlig;+smcp
+GFSComplutumClassic-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfscomplutum/GFSPolyglot.otf]:+clig;+liga;+tlig
+GFSDidot-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSDidotBold.otf]:+clig;+liga;+tlig
+GFSDidot-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSDidotBold.otf]:+clig;+liga;+tlig;+hist
+GFSDidot-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSDidotBoldItalic.otf]:+clig;+liga;+tlig
+GFSDidot-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSDidotBoldItalic.otf]:+clig;+liga;+tlig;+hist
+GFSDidot-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSDidotItalic.otf]:+clig;+liga;+tlig
+GFSDidot-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSDidotItalic.otf]:+clig;+liga;+tlig;+hist
+GFSDidot-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSDidot.otf]:+clig;+liga;+tlig
+GFSDidot-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSDidot.otf]:+clig;+liga;+tlig;+hist
+GFSDidot-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSDidot.otf]:+clig;+liga;+tlig;+onum
+GFSDidot-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSDidot.otf]:+clig;+liga;+tlig;+smcp
+GFSDidotClassic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidotclassic/GFSDidot_Classic.otf]:+clig;+liga;+tlig
+GFSNeohellenic-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenic/GFSNeohellenicBold.otf]:+clig;+liga;+tlig
+GFSNeohellenic-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenic/GFSNeohellenicBold.otf]:+clig;+liga;+tlig;+hist
+GFSNeohellenic-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenic/GFSNeohellenicBoldIt.otf]:+clig;+liga;+tlig
+GFSNeohellenic-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenic/GFSNeohellenicBoldIt.otf]:+clig;+liga;+tlig;+hist
+GFSNeohellenic-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenic/GFSNeohellenicIt.otf]:+clig;+liga;+tlig
+GFSNeohellenic-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenic/GFSNeohellenicIt.otf]:+clig;+liga;+tlig;+hist
+GFSNeohellenic-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenic/GFSNeohellenic.otf]:+clig;+liga;+tlig
+GFSNeohellenic-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenic/GFSNeohellenic.otf]:+clig;+liga;+tlig;+hist
+GFSNeohellenic-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenic/GFSNeohellenic.otf]:+clig;+liga;+tlig;+onum
+GFSNeohellenic-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsneohellenic/GFSNeohellenic.otf]:+clig;+liga;+tlig;+smcp
+GFSOlga-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSOlga.otf]:+clig;+liga;+tlig
+GFSOlga-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSOlgaGrDidotItEn.otf]:+clig;+liga;+tlig
+GFSOlga-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsdidot/GFSOlgaGrDidotItEn.otf]:+clig;+liga;+tlig;+hist
+GFSPorson-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfsporson/GFSPorson.otf]:+clig;+liga;+tlig
+GFSSolomos-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/gfssolomos/GFSSolomos.otf]:+clig;+liga;+tlig
+GandhiSans-Bold [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Bold.otf]:+clig;+liga;+tlig
+GandhiSans-Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Bold.otf]:+clig;+liga;+tlig;+onum
+GandhiSans-Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Bold.otf]:+clig;+liga;+tlig;+smcp
+GandhiSans-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Bold.otf]:+clig;+liga;+tlig
+GandhiSans-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Bold.otf]:+clig;+liga;+tlig;+onum
+GandhiSans-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Bold.otf]:+clig;+liga;+tlig;+smcp
+GandhiSans-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-BoldItalic.otf]:+clig;+liga;+tlig
+GandhiSans-BoldItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+GandhiSans-BoldItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+GandhiSans-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-BoldItalic.otf]:+clig;+liga;+tlig
+GandhiSans-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+GandhiSans-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+GandhiSans-Italic [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Italic.otf]:+clig;+liga;+tlig
+GandhiSans-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Italic.otf]:+clig;+liga;+tlig;+onum
+GandhiSans-Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Italic.otf]:+clig;+liga;+tlig;+smcp
+GandhiSans-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Italic.otf]:+clig;+liga;+tlig
+GandhiSans-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Italic.otf]:+clig;+liga;+tlig;+onum
+GandhiSans-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Italic.otf]:+clig;+liga;+tlig;+smcp
+GandhiSans-Regular [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Regular.otf]:+clig;+liga;+tlig
+GandhiSans-Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Regular.otf]:+clig;+liga;+tlig;+onum
+GandhiSans-Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Regular.otf]:+clig;+liga;+tlig;+smcp
+GandhiSans-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Regular.otf]:+clig;+liga;+tlig
+GandhiSans-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Regular.otf]:+clig;+liga;+tlig;+onum
+GandhiSans-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSans-Regular.otf]:+clig;+liga;+tlig;+smcp
+GandhiSerif-Bold [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Bold.otf]:+clig;+liga;+tlig
+GandhiSerif-Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Bold.otf]:+clig;+liga;+tlig;+onum
+GandhiSerif-Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Bold.otf]:+clig;+liga;+tlig;+smcp
+GandhiSerif-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Bold.otf]:+clig;+liga;+tlig
+GandhiSerif-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Bold.otf]:+clig;+liga;+tlig;+onum
+GandhiSerif-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Bold.otf]:+clig;+liga;+tlig;+smcp
+GandhiSerif-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-BoldItalic.otf]:+clig;+liga;+tlig
+GandhiSerif-BoldItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+GandhiSerif-BoldItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+GandhiSerif-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-BoldItalic.otf]:+clig;+liga;+tlig
+GandhiSerif-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+GandhiSerif-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+GandhiSerif-Italic [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Italic.otf]:+clig;+liga;+tlig
+GandhiSerif-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Italic.otf]:+clig;+liga;+tlig;+onum
+GandhiSerif-Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Italic.otf]:+clig;+liga;+tlig;+smcp
+GandhiSerif-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Italic.otf]:+clig;+liga;+tlig
+GandhiSerif-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Italic.otf]:+clig;+liga;+tlig;+onum
+GandhiSerif-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Italic.otf]:+clig;+liga;+tlig;+smcp
+GandhiSerif-Regular [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Regular.otf]:+clig;+liga;+tlig
+GandhiSerif-Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Regular.otf]:+clig;+liga;+tlig;+onum
+GandhiSerif-Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Regular.otf]:+clig;+liga;+tlig;+smcp
+GandhiSerif-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Regular.otf]:+clig;+liga;+tlig
+GandhiSerif-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Regular.otf]:+clig;+liga;+tlig;+onum
+GandhiSerif-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/TipografiaGandhi/gandhi/GandhiSerif-Regular.otf]:+clig;+liga;+tlig;+smcp
+Garamond Libre Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Bold.otf]:+clig;+liga;+tlig
+Garamond Libre Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Bold.otf]:+clig;+liga;+tlig;+onum
+Garamond Libre Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Bold.otf]:+clig;+liga;+tlig;+smcp
+Garamond Libre Bold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Bold.otf]:+clig;+liga;+tlig;+swsh
+Garamond Libre Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-BoldItalic.otf]:+clig;+liga;+tlig
+Garamond Libre Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Garamond Libre Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Garamond Libre Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Garamond Libre Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Italic.otf]:+clig;+liga;+tlig
+Garamond Libre Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Italic.otf]:+clig;+liga;+tlig;+onum
+Garamond Libre Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Italic.otf]:+clig;+liga;+tlig;+smcp
+Garamond Libre Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Italic.otf]:+clig;+liga;+tlig;+swsh
+Garamond Libre Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Regular.otf]:+clig;+liga;+tlig
+Garamond Libre Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Regular.otf]:+clig;+liga;+tlig;+onum
+Garamond Libre Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Regular.otf]:+clig;+liga;+tlig;+smcp
+Garamond Libre Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-libre/GaramondLibre-Regular.otf]:+clig;+liga;+tlig;+swsh
+Garamond-Math [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig
+Garamond-Math; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss01
+Garamond-Math; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss02
+Garamond-Math; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss03
+Garamond-Math; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss04
+Garamond-Math; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss05
+Garamond-Math; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss06
+Garamond-Math; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss07
+Garamond-Math; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss08
+Garamond-Math; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss09
+Garamond-Math; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss10
+Garamond-Math; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/garamond-math/Garamond-Math.otf]:+clig;+liga;+tlig;+ss11
+Garuda [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Garuda.otf]:+clig;+liga;+tlig
+Garuda Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Garuda-Bold.otf]:+clig;+liga;+tlig
+Garuda Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Garuda-BoldOblique.otf]:+clig;+liga;+tlig
+Garuda Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Garuda-Oblique.otf]:+clig;+liga;+tlig
+Geeza Pro Bold [/System/Library/Fonts/GeezaPro.ttc](1):+clig;+liga;+tlig
+Geeza Pro Regular [/System/Library/Fonts/GeezaPro.ttc](0):+clig;+liga;+tlig
+Gelasio Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-Bold.otf]:+clig;+liga;+tlig
+Gelasio Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-Bold.otf]:+clig;+liga;+tlig;+onum
+Gelasio Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-BoldItalic.otf]:+clig;+liga;+tlig
+Gelasio Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Gelasio Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-Italic.otf]:+clig;+liga;+tlig
+Gelasio Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-Italic.otf]:+clig;+liga;+tlig;+onum
+Gelasio Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-Medium.otf]:+clig;+liga;+tlig
+Gelasio Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-Medium.otf]:+clig;+liga;+tlig;+onum
+Gelasio Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-MediumItalic.otf]:+clig;+liga;+tlig
+Gelasio Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Gelasio Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-Regular.otf]:+clig;+liga;+tlig
+Gelasio Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-Regular.otf]:+clig;+liga;+tlig;+onum
+Gelasio SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-SemiBold.otf]:+clig;+liga;+tlig
+Gelasio SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Gelasio SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Gelasio SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/gelasio/Gelasio-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Geneva [/System/Library/Fonts/Geneva.ttf]:+clig;+liga;+tlig
+Gentium Book Plus [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Regular.ttf]:+clig;+liga;+tlig
+Gentium Book Plus; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Gentium Book Plus; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Gentium Book Plus; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Gentium Book Plus; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Gentium Book Plus; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Gentium Book Plus; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Regular.ttf]:+clig;+liga;+tlig;+ss11
+Gentium Book Plus; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Regular.ttf]:+clig;+liga;+tlig;+ss12
+Gentium Book Plus Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Bold.ttf]:+clig;+liga;+tlig
+Gentium Book Plus Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Gentium Book Plus Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Gentium Book Plus Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Gentium Book Plus Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Gentium Book Plus Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Bold.ttf]:+clig;+liga;+tlig;+ss07
+Gentium Book Plus Bold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Bold.ttf]:+clig;+liga;+tlig;+ss11
+Gentium Book Plus Bold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Bold.ttf]:+clig;+liga;+tlig;+ss12
+Gentium Book Plus Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-BoldItalic.ttf]:+clig;+liga;+tlig
+Gentium Book Plus Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Gentium Book Plus Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Gentium Book Plus Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Gentium Book Plus Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Gentium Book Plus Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Gentium Book Plus Bold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Gentium Book Plus Bold Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Gentium Book Plus Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Italic.ttf]:+clig;+liga;+tlig
+Gentium Book Plus Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Gentium Book Plus Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Gentium Book Plus Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Gentium Book Plus Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Italic.ttf]:+clig;+liga;+tlig;+ss05
+Gentium Book Plus Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Italic.ttf]:+clig;+liga;+tlig;+ss07
+Gentium Book Plus Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Italic.ttf]:+clig;+liga;+tlig;+ss11
+Gentium Book Plus Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumBookPlus-Italic.ttf]:+clig;+liga;+tlig;+ss12
+Gentium Plus [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Regular.ttf]:+clig;+liga;+tlig
+Gentium Plus; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Gentium Plus; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Gentium Plus; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Gentium Plus; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Gentium Plus; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Gentium Plus; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Regular.ttf]:+clig;+liga;+tlig;+ss11
+Gentium Plus; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Regular.ttf]:+clig;+liga;+tlig;+ss12
+Gentium Plus Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Bold.ttf]:+clig;+liga;+tlig
+Gentium Plus Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Gentium Plus Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Gentium Plus Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Gentium Plus Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Gentium Plus Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Bold.ttf]:+clig;+liga;+tlig;+ss07
+Gentium Plus Bold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Bold.ttf]:+clig;+liga;+tlig;+ss11
+Gentium Plus Bold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Bold.ttf]:+clig;+liga;+tlig;+ss12
+Gentium Plus Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-BoldItalic.ttf]:+clig;+liga;+tlig
+Gentium Plus Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Gentium Plus Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Gentium Plus Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Gentium Plus Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Gentium Plus Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Gentium Plus Bold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Gentium Plus Bold Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-BoldItalic.ttf]:+clig;+liga;+tlig;+ss12
+Gentium Plus Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Italic.ttf]:+clig;+liga;+tlig
+Gentium Plus Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Gentium Plus Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Gentium Plus Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Gentium Plus Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Italic.ttf]:+clig;+liga;+tlig;+ss05
+Gentium Plus Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Italic.ttf]:+clig;+liga;+tlig;+ss07
+Gentium Plus Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Italic.ttf]:+clig;+liga;+tlig;+ss11
+Gentium Plus Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gentium-tug/GentiumPlus-Italic.ttf]:+clig;+liga;+tlig;+ss12
+Georgia [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgia.ttf]:+clig;+liga;+tlig
+Georgia; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgia.ttf]:+clig;+liga;+tlig;+onum
+Georgia; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgia.ttf]:+clig;+liga;+tlig;+smcp
+Georgia Bold [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgiab.ttf]:+clig;+liga;+tlig
+Georgia Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgiab.ttf]:+clig;+liga;+tlig;+onum
+Georgia Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgiab.ttf]:+clig;+liga;+tlig;+smcp
+Georgia Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgiaz.ttf]:+clig;+liga;+tlig
+Georgia Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgiaz.ttf]:+clig;+liga;+tlig;+onum
+Georgia Bold Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgiaz.ttf]:+clig;+liga;+tlig;+smcp
+Georgia Italic [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgiai.ttf]:+clig;+liga;+tlig
+Georgia Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgiai.ttf]:+clig;+liga;+tlig;+onum
+Georgia Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/microsoft/georgia/georgiai.ttf]:+clig;+liga;+tlig;+smcp
+GilliusADF-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADF-Bold.otf]:+clig;+liga;+tlig
+GilliusADF-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADF-Bold.otf]:+clig;+liga;+tlig;+hist
+GilliusADF-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADF-BoldItalic.otf]:+clig;+liga;+tlig
+GilliusADF-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADF-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+GilliusADF-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADF-Italic.otf]:+clig;+liga;+tlig
+GilliusADF-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADF-Italic.otf]:+clig;+liga;+tlig;+hist
+GilliusADF-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADF-Regular.otf]:+clig;+liga;+tlig
+GilliusADF-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADF-Regular.otf]:+clig;+liga;+tlig;+hist
+GilliusADFCond [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFCond-Regular.otf]:+clig;+liga;+tlig
+GilliusADFCond; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFCond-Regular.otf]:+clig;+liga;+tlig;+hist
+GilliusADFCond-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFCond-Bold.otf]:+clig;+liga;+tlig
+GilliusADFCond-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFCond-Bold.otf]:+clig;+liga;+tlig;+hist
+GilliusADFCond-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFCond-BoldItalic.otf]:+clig;+liga;+tlig
+GilliusADFCond-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFCond-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+GilliusADFCond-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFCond-Italic.otf]:+clig;+liga;+tlig
+GilliusADFCond-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFCond-Italic.otf]:+clig;+liga;+tlig;+hist
+GilliusADFNo2-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2-Bold.otf]:+clig;+liga;+tlig
+GilliusADFNo2-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2-Bold.otf]:+clig;+liga;+tlig;+hist
+GilliusADFNo2-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2-BoldItalic.otf]:+clig;+liga;+tlig
+GilliusADFNo2-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+GilliusADFNo2-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2-Italic.otf]:+clig;+liga;+tlig
+GilliusADFNo2-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2-Italic.otf]:+clig;+liga;+tlig;+hist
+GilliusADFNo2-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2-Regular.otf]:+clig;+liga;+tlig
+GilliusADFNo2-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2-Regular.otf]:+clig;+liga;+tlig;+hist
+GilliusADFNo2Cond-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2Cond-Bold.otf]:+clig;+liga;+tlig
+GilliusADFNo2Cond-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2Cond-Bold.otf]:+clig;+liga;+tlig;+hist
+GilliusADFNo2Cond-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2Cond-BoldItalic.otf]:+clig;+liga;+tlig
+GilliusADFNo2Cond-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2Cond-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+GilliusADFNo2Cond-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2Cond-Italic.otf]:+clig;+liga;+tlig
+GilliusADFNo2Cond-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2Cond-Italic.otf]:+clig;+liga;+tlig;+hist
+GilliusADFNo2Cond-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2Cond-Regular.otf]:+clig;+liga;+tlig
+GilliusADFNo2Cond-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/gillius/GilliusADFNo2Cond-Regular.otf]:+clig;+liga;+tlig;+hist
+Gimlet Sans Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-Black.otf]:+clig;+liga;+tlig
+Gimlet Sans Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-Black.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansBlack/GimletSans-Black.otf]:+clig;+liga;+tlig
+Gimlet Sans Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansBlack/GimletSans-Black.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Black [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-Black.ttf]:+clig;+liga;+tlig
+Gimlet Sans Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-Black.ttf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Black [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansBlack/GimletSans-Black.ttf]:+clig;+liga;+tlig
+Gimlet Sans Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansBlack/GimletSans-Black.ttf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-Bold.otf]:+clig;+liga;+tlig
+Gimlet Sans Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-Bold.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-Bold.ttf]:+clig;+liga;+tlig
+Gimlet Sans Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Black; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Black; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Black; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Black; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Black; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Black; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Black.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Black Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Black Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Black Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Black Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Black Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Black Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Black Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Black Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Black Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Black Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Black Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Black Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Black Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Bold.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Bold Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Italic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Light.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Light Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Light Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Light Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Light Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Light Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Light Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Light Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Light Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Light Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Light Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Light Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Light Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Light Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-LightItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Medium.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Medium Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Medium Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Medium Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Medium Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Medium Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Medium Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Medium Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-MediumItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-Regular.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Semi Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Semi Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Semi Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Semi Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Semi Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Semi Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Semi Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Semi Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Semi Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Display Semi Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Display Semi Bold Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansDisplay-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-Light.otf]:+clig;+liga;+tlig
+Gimlet Sans Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-Light.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-Light.ttf]:+clig;+liga;+tlig
+Gimlet Sans Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-Light.ttf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-Medium.otf]:+clig;+liga;+tlig
+Gimlet Sans Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-Medium.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Medium [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-Medium.ttf]:+clig;+liga;+tlig
+Gimlet Sans Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig
+Gimlet Sans Micro Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Micro Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Micro Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Micro Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Micro Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Micro Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Micro Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Micro Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Micro Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Micro Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Micro Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Bold.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Micro Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Micro Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Micro Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Micro Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Micro Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Micro Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Micro Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Micro Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Micro Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Micro Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Micro Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Micro Bold Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-BoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Micro Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig
+Gimlet Sans Micro Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Micro Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Micro Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Micro Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Micro Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Micro Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Micro Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Micro Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Micro Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Micro Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Micro Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Italic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Micro Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig
+Gimlet Sans Micro Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Micro Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Micro Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Micro Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Micro Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Micro Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Micro Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Micro Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Micro Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Micro Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Micro Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Light.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Micro Light Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Micro Light Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Light Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Micro Light Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Micro Light Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Micro Light Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Micro Light Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Micro Light Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Micro Light Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Micro Light Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Micro Light Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Micro Light Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Micro Light Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-LightItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Micro Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig
+Gimlet Sans Micro Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Micro Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Micro Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Micro Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Micro Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Micro Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Micro Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Micro Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Micro Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Micro Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Micro Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Medium.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Micro Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Micro Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Medium Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Micro Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Micro Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Micro Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Micro Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Micro Medium Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Micro Medium Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Micro Medium Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Micro Medium Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Micro Medium Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Micro Medium Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-MediumItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Micro Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig
+Gimlet Sans Micro Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Micro Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Micro Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Micro Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Micro Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Micro Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Micro Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Micro Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Micro Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Micro Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Micro Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-Regular.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Micro Semi Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig
+Gimlet Sans Micro Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Micro Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Micro Semi Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Micro Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Micro Semi Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Micro Semi Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Micro Semi Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Micro Semi Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Micro Semi Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Micro Semi Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Micro Semi Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Micro Semi Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Micro Semi Bold Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansMicro-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-Regular.otf]:+clig;+liga;+tlig
+Gimlet Sans Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-Regular.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-Regular.ttf]:+clig;+liga;+tlig
+Gimlet Sans Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Semi Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-SemiBold.otf]:+clig;+liga;+tlig
+Gimlet Sans Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSansLight/GimletSans-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Semi Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-SemiBold.ttf]:+clig;+liga;+tlig
+Gimlet Sans Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSans-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Black; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Black; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Black; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Black; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Black; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Black; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Black; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Black.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Black Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Black Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Black Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Black Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Black Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Black Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Black Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Black Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Black Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Black Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Black Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Black Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Black Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BlackItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Bold.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Bold Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-BoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Italic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Light.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Light Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Light Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Light Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Light Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Light Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Light Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Light Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Light Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Light Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Light Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Light Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Light Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Light Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-LightItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Medium; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Medium.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Medium Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Medium Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Medium Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Medium Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Medium Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Medium Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Medium Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-MediumItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Regular; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-Regular.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Semi Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Semi Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Semi Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Semi Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Semi Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Semi Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Semi Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Semi Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Semi Bold; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBold.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Text Semi Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Text Semi Bold Italic; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletSans/GimletSansText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Variable Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig
+Gimlet Sans Variable Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss01
+Gimlet Sans Variable Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss02
+Gimlet Sans Variable Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss03
+Gimlet Sans Variable Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss04
+Gimlet Sans Variable Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss05
+Gimlet Sans Variable Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss06
+Gimlet Sans Variable Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss07
+Gimlet Sans Variable Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss08
+Gimlet Sans Variable Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss09
+Gimlet Sans Variable Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss10
+Gimlet Sans Variable Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss11
+Gimlet Sans Variable Light; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSans/GimletSansVariable_ital,opsz,wght_.ttf]:+clig;+liga;+tlig;+ss20
+Gimlet Sans Variable Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSansVariable-VF.ttf]:+clig;+liga;+tlig
+Gimlet Sans Variable Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletSansLight/GimletSansVariable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Gimlet Variable Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig
+Gimlet Variable Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+onum
+Gimlet Variable Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+smcp
+Gimlet Variable Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Gimlet Variable Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss02
+Gimlet Variable Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Gimlet Variable Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss04
+Gimlet Variable Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss05
+Gimlet Variable Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss06
+Gimlet Variable Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss07
+Gimlet Variable Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss08
+Gimlet Variable Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss09
+Gimlet Variable Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss10
+Gimlet Variable Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/GimletVariable/GimletVariable-VF.ttf]:+clig;+liga;+tlig;+ss11
+Gimlet X-Ray SVG Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GimletXRay/GimletXRaySVG-Regular.otf]:+clig;+liga;+tlig
+Glyptic DJR Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJR-Regular.otf]:+clig;+liga;+tlig
+Glyptic DJR Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJR-Regular.otf]:+clig;+liga;+tlig;+ss01
+Glyptic DJR Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJR-Regular.otf]:+clig;+liga;+tlig;+ss02
+Glyptic DJR Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJR-Regular.otf]:+clig;+liga;+tlig;+ss03
+Glyptic DJR v2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJRv2-Regular.otf]:+clig;+liga;+tlig
+Glyptic DJR v2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJRv2-Regular.otf]:+clig;+liga;+tlig;+ss01
+Glyptic DJR v2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJRv2-Regular.otf]:+clig;+liga;+tlig;+ss02
+Glyptic DJR v2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJRv2-Regular.otf]:+clig;+liga;+tlig;+ss03
+Glyptic DJR v2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJRv2-Regular.otf]:+clig;+liga;+tlig;+ss04
+Glyptic DJR v2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJRv2-Regular.otf]:+clig;+liga;+tlig;+ss05
+Glyptic DJR v2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJRv2-Regular.otf]:+clig;+liga;+tlig;+ss06
+Glyptic DJR v2; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/GlypticDJR/GlypticDJRv2-Regular.otf]:+clig;+liga;+tlig;+ss07
+Go Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/Go-Bold.ttf]:+clig;+liga;+tlig
+Go Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/Go-Bold-Italic.ttf]:+clig;+liga;+tlig
+Go Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/Go-Medium.ttf]:+clig;+liga;+tlig
+Go Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/Go-Medium-Italic.ttf]:+clig;+liga;+tlig
+Go Mono [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/GoMono-Regular.ttf]:+clig;+liga;+tlig
+Go Mono Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/GoMono-Bold.ttf]:+clig;+liga;+tlig
+Go Mono Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/GoMono-Bold-Italic.ttf]:+clig;+liga;+tlig
+Go Mono Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/GoMono-Regular-Italic.ttf]:+clig;+liga;+tlig
+Go Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/Go-Regular.ttf]:+clig;+liga;+tlig
+Go Regular Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/Go-Regular-Italic.ttf]:+clig;+liga;+tlig
+Go Smallcaps [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/GoSmallcaps.ttf]:+clig;+liga;+tlig
+GoSmallcaps Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/bh/gofonts/GoSmallcaps-Italic.ttf]:+clig;+liga;+tlig
+Gorton Perfected Bold [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig
+Gorton Perfected Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss01
+Gorton Perfected Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss02
+Gorton Perfected Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss03
+Gorton Perfected Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss04
+Gorton Perfected Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss05
+Gorton Perfected Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss06
+Gorton Perfected Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss07
+Gorton Perfected Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss08
+Gorton Perfected Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss09
+Gorton Perfected Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss10
+Gorton Perfected Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss11
+Gorton Perfected Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss12
+Gorton Perfected Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Bold.otf]:+clig;+liga;+tlig;+ss13
+Gorton Perfected Extra Light [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig
+Gorton Perfected Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Gorton Perfected Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Gorton Perfected Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Gorton Perfected Extra Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Gorton Perfected Extra Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Gorton Perfected Extra Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss06
+Gorton Perfected Extra Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss07
+Gorton Perfected Extra Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss08
+Gorton Perfected Extra Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss09
+Gorton Perfected Extra Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss10
+Gorton Perfected Extra Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss11
+Gorton Perfected Extra Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss12
+Gorton Perfected Extra Light; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-ExtraLight.otf]:+clig;+liga;+tlig;+ss13
+Gorton Perfected Light [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig
+Gorton Perfected Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss01
+Gorton Perfected Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss02
+Gorton Perfected Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss03
+Gorton Perfected Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss04
+Gorton Perfected Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss05
+Gorton Perfected Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss06
+Gorton Perfected Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss07
+Gorton Perfected Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss08
+Gorton Perfected Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss09
+Gorton Perfected Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss10
+Gorton Perfected Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss11
+Gorton Perfected Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss12
+Gorton Perfected Light; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Light.otf]:+clig;+liga;+tlig;+ss13
+Gorton Perfected Medium [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig
+Gorton Perfected Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss01
+Gorton Perfected Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss02
+Gorton Perfected Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss03
+Gorton Perfected Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss04
+Gorton Perfected Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss05
+Gorton Perfected Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss06
+Gorton Perfected Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss07
+Gorton Perfected Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss08
+Gorton Perfected Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss09
+Gorton Perfected Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss10
+Gorton Perfected Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss11
+Gorton Perfected Medium; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss12
+Gorton Perfected Medium; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Medium.otf]:+clig;+liga;+tlig;+ss13
+Gorton Perfected Regular [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig
+Gorton Perfected Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss01
+Gorton Perfected Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss02
+Gorton Perfected Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss03
+Gorton Perfected Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss04
+Gorton Perfected Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss05
+Gorton Perfected Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss06
+Gorton Perfected Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss07
+Gorton Perfected Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss08
+Gorton Perfected Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss09
+Gorton Perfected Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss10
+Gorton Perfected Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss11
+Gorton Perfected Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss12
+Gorton Perfected Regular; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Regular.otf]:+clig;+liga;+tlig;+ss13
+Gorton Perfected Regular [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig
+Gorton Perfected Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss01
+Gorton Perfected Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss02
+Gorton Perfected Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss03
+Gorton Perfected Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss04
+Gorton Perfected Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss05
+Gorton Perfected Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss06
+Gorton Perfected Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss07
+Gorton Perfected Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss08
+Gorton Perfected Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss09
+Gorton Perfected Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss10
+Gorton Perfected Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss11
+Gorton Perfected Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss12
+Gorton Perfected Regular; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/Aresluna/GortonPerfected/GortonPerfectedVF.ttf]:+clig;+liga;+tlig;+ss13
+Gorton Perfected Semibold [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig
+Gorton Perfected Semibold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss01
+Gorton Perfected Semibold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss02
+Gorton Perfected Semibold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss03
+Gorton Perfected Semibold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss04
+Gorton Perfected Semibold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss05
+Gorton Perfected Semibold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss06
+Gorton Perfected Semibold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss07
+Gorton Perfected Semibold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss08
+Gorton Perfected Semibold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss09
+Gorton Perfected Semibold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss10
+Gorton Perfected Semibold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss11
+Gorton Perfected Semibold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss12
+Gorton Perfected Semibold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Semibold.otf]:+clig;+liga;+tlig;+ss13
+Gorton Perfected Thin [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig
+Gorton Perfected Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss01
+Gorton Perfected Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss02
+Gorton Perfected Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss03
+Gorton Perfected Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss04
+Gorton Perfected Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss05
+Gorton Perfected Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss06
+Gorton Perfected Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss07
+Gorton Perfected Thin; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss08
+Gorton Perfected Thin; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss09
+Gorton Perfected Thin; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss10
+Gorton Perfected Thin; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss11
+Gorton Perfected Thin; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss12
+Gorton Perfected Thin; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/Aresluna/GortonPerfected/GortonPerfected-Thin.otf]:+clig;+liga;+tlig;+ss13
+Gotu [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Gotu_Regular.ttf]:+clig;+liga;+tlig
+Gotu; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Gotu_Regular.ttf]:+clig;+liga;+tlig;+onum
+Gotu; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Gotu_Regular.ttf]:+clig;+liga;+tlig;+ss01
+HOTMETAL Normal [/usr/local/texlive/texmf-local/fonts/truetype/Union/HOTME___.ttf]:+clig;+liga;+tlig
+HWTUnitGothic-716 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic716.otf]:+clig;+liga;+tlig
+HWTUnitGothic-716; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic716.otf]:+clig;+liga;+tlig;+ss01
+HWTUnitGothic-717 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic717.otf]:+clig;+liga;+tlig
+HWTUnitGothic-717; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic717.otf]:+clig;+liga;+tlig;+ss01
+HWTUnitGothic-718 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic718.otf]:+clig;+liga;+tlig
+HWTUnitGothic-718; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic718.otf]:+clig;+liga;+tlig;+ss01
+HWTUnitGothic-719 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic719.otf]:+clig;+liga;+tlig
+HWTUnitGothic-719; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic719.otf]:+clig;+liga;+tlig;+ss01
+HWTUnitGothic-719; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic719.otf]:+clig;+liga;+tlig;+ss02
+HWTUnitGothic-720 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic720.otf]:+clig;+liga;+tlig
+HWTUnitGothic-720; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic720.otf]:+clig;+liga;+tlig;+ss01
+HWTUnitGothic-720; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic720.otf]:+clig;+liga;+tlig;+ss02
+HWTUnitGothic-721 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic721.otf]:+clig;+liga;+tlig
+HWTUnitGothic-721; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic721.otf]:+clig;+liga;+tlig;+ss01
+HWTUnitGothic-721; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic721.otf]:+clig;+liga;+tlig;+ss02
+HWTUnitGothic-722 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic722.otf]:+clig;+liga;+tlig
+HWTUnitGothic-722; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic722.otf]:+clig;+liga;+tlig;+ss01
+HWTUnitGothic-722; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/HWTUnitGothic/HWTUnitGothic722.otf]:+clig;+liga;+tlig;+ss02
+Hadasim CLM Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/HadasimCLM-Bold.ttf]:+clig;+liga;+tlig
+Hadasim CLM BoldOblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/HadasimCLM-BoldOblique.ttf]:+clig;+liga;+tlig
+Hadasim CLM Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/HadasimCLM-Regular.ttf]:+clig;+liga;+tlig
+Hadasim CLM RegularOblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/HadasimCLM-RegularOblique.ttf]:+clig;+liga;+tlig
+Hamnosysunicode [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/hamnosys/HamNoSysUnicode.ttf]:+clig;+liga;+tlig
+Harano Aji Gothic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiGothic-Regular.otf]:+clig;+liga;+tlig
+Harano Aji Gothic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiGothic-Regular.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Gothic Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiGothic-Bold.otf]:+clig;+liga;+tlig
+Harano Aji Gothic Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiGothic-Bold.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Gothic ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiGothic-ExtraLight.otf]:+clig;+liga;+tlig
+Harano Aji Gothic ExtraLight; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiGothic-ExtraLight.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Gothic Heavy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiGothic-Heavy.otf]:+clig;+liga;+tlig
+Harano Aji Gothic Heavy; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiGothic-Heavy.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Gothic Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiGothic-Light.otf]:+clig;+liga;+tlig
+Harano Aji Gothic Light; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiGothic-Light.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Gothic Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiGothic-Medium.otf]:+clig;+liga;+tlig
+Harano Aji Gothic Medium; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiGothic-Medium.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Gothic Normal [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiGothic-Normal.otf]:+clig;+liga;+tlig
+Harano Aji Gothic Normal; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiGothic-Normal.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Mincho [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiMincho-Regular.otf]:+clig;+liga;+tlig
+Harano Aji Mincho; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiMincho-Regular.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Mincho Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiMincho-Bold.otf]:+clig;+liga;+tlig
+Harano Aji Mincho Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiMincho-Bold.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Mincho ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiMincho-ExtraLight.otf]:+clig;+liga;+tlig
+Harano Aji Mincho ExtraLight; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiMincho-ExtraLight.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Mincho Heavy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiMincho-Heavy.otf]:+clig;+liga;+tlig
+Harano Aji Mincho Heavy; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiMincho-Heavy.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Mincho Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiMincho-Light.otf]:+clig;+liga;+tlig
+Harano Aji Mincho Light; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiMincho-Light.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Mincho Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiMincho-Medium.otf]:+clig;+liga;+tlig
+Harano Aji Mincho Medium; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiMincho-Medium.otf]:+clig;+liga;+tlig;+hist
+Harano Aji Mincho SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiMincho-SemiBold.otf]:+clig;+liga;+tlig
+Harano Aji Mincho SemiBold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/haranoaji-extra/HaranoAjiMincho-SemiBold.otf]:+clig;+liga;+tlig;+hist
+Heckendon Hairline [/usr/local/texlive/texmf-local/fonts/opentype/DJR/HeckondonHairline/Heckondon-Hairline.otf]:+clig;+liga;+tlig
+Heckendon Hairline; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/HeckondonHairline/Heckondon-Hairline.otf]:+clig;+liga;+tlig;+ss01
+Heckendon Hairline; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/HeckondonHairline/Heckondon-Hairline.otf]:+clig;+liga;+tlig;+ss02
+Heckendon Hairline; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/HeckondonHairline/Heckondon-Hairline.otf]:+clig;+liga;+tlig;+ss03
+Heckendon Hairline; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/HeckondonHairline/Heckondon-Hairline.otf]:+clig;+liga;+tlig;+ss04
+Heckendon Hairline; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/HeckondonHairline/Heckondon-Hairline.otf]:+clig;+liga;+tlig;+ss05
+Heckendon Hairline; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/HeckondonHairline/Heckondon-Hairline.otf]:+clig;+liga;+tlig;+ss06
+Heckendon Hairline; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/HeckondonHairline/Heckondon-Hairline.otf]:+clig;+liga;+tlig;+ss07
+Heckendon Hairline; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/HeckondonHairline/Heckondon-Hairline.otf]:+clig;+liga;+tlig;+ss08
+Heckendon Hairline [/usr/local/texlive/texmf-local/fonts/truetype/DJR/HeckondonHairline/Heckondon-Hairline.ttf]:+clig;+liga;+tlig
+Heckendon Hairline; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/HeckondonHairline/Heckondon-Hairline.ttf]:+clig;+liga;+tlig;+ss01
+Heckendon Hairline; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/HeckondonHairline/Heckondon-Hairline.ttf]:+clig;+liga;+tlig;+ss02
+Heckendon Hairline; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/HeckondonHairline/Heckondon-Hairline.ttf]:+clig;+liga;+tlig;+ss03
+Heckendon Hairline; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/HeckondonHairline/Heckondon-Hairline.ttf]:+clig;+liga;+tlig;+ss04
+Heckendon Hairline; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/HeckondonHairline/Heckondon-Hairline.ttf]:+clig;+liga;+tlig;+ss05
+Heckendon Hairline; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/HeckondonHairline/Heckondon-Hairline.ttf]:+clig;+liga;+tlig;+ss06
+Heckendon Hairline; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/HeckondonHairline/Heckondon-Hairline.ttf]:+clig;+liga;+tlig;+ss07
+Heckendon Hairline; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/HeckondonHairline/Heckondon-Hairline.ttf]:+clig;+liga;+tlig;+ss08
+Heiti SC Light [/System/Library/Fonts/STHeiti Light.ttc](1):+clig;+liga;+tlig
+Heiti SC Medium [/System/Library/Fonts/STHeiti Medium.ttc](1):+clig;+liga;+tlig
+Heiti TC Light [/System/Library/Fonts/STHeiti Light.ttc](0):+clig;+liga;+tlig
+Heiti TC Medium [/System/Library/Fonts/STHeiti Medium.ttc](0):+clig;+liga;+tlig
+Helvetica [/System/Library/Fonts/Helvetica.ttc](0):+clig;+liga;+tlig
+Helvetica Bold [/System/Library/Fonts/Helvetica.ttc](1):+clig;+liga;+tlig
+Helvetica Bold Oblique [/System/Library/Fonts/Helvetica.ttc](3):+clig;+liga;+tlig
+Helvetica Light [/System/Library/Fonts/Helvetica.ttc](4):+clig;+liga;+tlig
+Helvetica Light Oblique [/System/Library/Fonts/Helvetica.ttc](5):+clig;+liga;+tlig
+Helvetica Neue [/System/Library/Fonts/HelveticaNeue.ttc](0):+clig;+liga;+tlig
+Helvetica Neue Bold [/System/Library/Fonts/HelveticaNeue.ttc](1):+clig;+liga;+tlig
+Helvetica Neue Bold Italic [/System/Library/Fonts/HelveticaNeue.ttc](3):+clig;+liga;+tlig
+Helvetica Neue Condensed Black [/System/Library/Fonts/HelveticaNeue.ttc](9):+clig;+liga;+tlig
+Helvetica Neue Condensed Bold [/System/Library/Fonts/HelveticaNeue.ttc](4):+clig;+liga;+tlig
+Helvetica Neue Italic [/System/Library/Fonts/HelveticaNeue.ttc](2):+clig;+liga;+tlig
+Helvetica Neue Light [/System/Library/Fonts/HelveticaNeue.ttc](7):+clig;+liga;+tlig
+Helvetica Neue Light Italic [/System/Library/Fonts/HelveticaNeue.ttc](8):+clig;+liga;+tlig
+Helvetica Neue Medium [/System/Library/Fonts/HelveticaNeue.ttc](10):+clig;+liga;+tlig
+Helvetica Neue Medium Italic [/System/Library/Fonts/HelveticaNeue.ttc](11):+clig;+liga;+tlig
+Helvetica Neue Thin [/System/Library/Fonts/HelveticaNeue.ttc](12):+clig;+liga;+tlig
+Helvetica Neue Thin Italic [/System/Library/Fonts/HelveticaNeue.ttc](13):+clig;+liga;+tlig
+Helvetica Neue UltraLight [/System/Library/Fonts/HelveticaNeue.ttc](5):+clig;+liga;+tlig
+Helvetica Neue UltraLight Italic [/System/Library/Fonts/HelveticaNeue.ttc](6):+clig;+liga;+tlig
+Helvetica Oblique [/System/Library/Fonts/Helvetica.ttc](2):+clig;+liga;+tlig
+HelveticaNeueLTStd-Bd [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-Bd.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-BdCn [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-BdCn.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-BdCnO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-BdCnO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-BdEx [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-BdEx.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-BdExO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-BdExO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-BdIt [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-BdIt.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-Blk [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-Blk.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-BlkCn [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-BlkCn.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-BlkCnO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-BlkCnO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-BlkEx [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-BlkEx.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-BlkExO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-BlkExO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-BlkIt [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-BlkIt.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-Cn [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-Cn.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-CnO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-CnO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-ExO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-ExO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-Hv [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-Hv.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-HvCn [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-HvCn.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-HvCnO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-HvCnO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-HvEx [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-HvEx.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-HvExO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-HvExO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-HvIt [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-HvIt.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-It [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-It.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-Lt [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-Lt.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-LtCn [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-LtCn.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-LtCnO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-LtCnO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-LtEx [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-LtEx.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-LtExO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-LtExO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-LtIt [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-LtIt.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-Md [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-Md.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-MdExO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-MdExO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-MdIt [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-MdIt.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-Th [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-Th.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-ThCn [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-ThCn.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-ThCnO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-ThCnO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-ThEx [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-ThEx.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-ThExO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-ThExO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-ThIt [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-ThIt.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-UltLt [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-UltLt.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-UltLtCn [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-UltLtCn.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-UltLtCnO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-UltLtCnO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-UltLtEx [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-UltLtEx.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-UltLtExO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-UltLtExO.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-UltLtIt [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-UltLtIt.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-XBlkCn [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-XBlkCn.otf]:+clig;+liga;+tlig
+HelveticaNeueLTStd-XBlkCnO [/usr/local/texlive/texmf-local/fonts/opentype/linotype/HelveticaNeueLTStd/HelveticaNeueLTStd-XBlkCnO.otf]:+clig;+liga;+tlig
+Heuristica Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/heuristica/Heuristica-Bold.otf]:+clig;+liga;+tlig
+Heuristica Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/heuristica/Heuristica-Bold.otf]:+clig;+liga;+tlig;+onum
+Heuristica Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/heuristica/Heuristica-BoldItalic.otf]:+clig;+liga;+tlig
+Heuristica Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/heuristica/Heuristica-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Heuristica Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/heuristica/Heuristica-Italic.otf]:+clig;+liga;+tlig
+Heuristica Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/heuristica/Heuristica-Italic.otf]:+clig;+liga;+tlig;+onum
+Heuristica Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/heuristica/Heuristica-Regular.otf]:+clig;+liga;+tlig
+Heuristica Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/heuristica/Heuristica-Regular.otf]:+clig;+liga;+tlig;+onum
+Heuristica Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/heuristica/Heuristica-Regular.otf]:+clig;+liga;+tlig;+smcp
+Hind Madurai Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/hindmadurai/HindMadurai-Bold.otf]:+clig;+liga;+tlig
+Hind Madurai Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/hindmadurai/HindMadurai-Bold.otf]:+clig;+liga;+tlig;+ss01
+Hind Madurai Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/hindmadurai/HindMadurai-Light.otf]:+clig;+liga;+tlig
+Hind Madurai Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/hindmadurai/HindMadurai-Light.otf]:+clig;+liga;+tlig;+ss01
+Hind Madurai Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/hindmadurai/HindMadurai-Medium.otf]:+clig;+liga;+tlig
+Hind Madurai Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/hindmadurai/HindMadurai-Medium.otf]:+clig;+liga;+tlig;+ss01
+Hind Madurai Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/hindmadurai/HindMadurai-Regular.otf]:+clig;+liga;+tlig
+Hind Madurai Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/hindmadurai/HindMadurai-Regular.otf]:+clig;+liga;+tlig;+ss01
+Hind Madurai SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/hindmadurai/HindMadurai-SemiBold.otf]:+clig;+liga;+tlig
+Hind Madurai SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/hindmadurai/HindMadurai-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+HiraMaruPro-W4 [/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc](0):+clig;+liga;+tlig
+HiraMaruProN-W4 [/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc](1):+clig;+liga;+tlig
+HiraMinPro-W3 [/System/Library/Fonts/ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN.ttc](1):+clig;+liga;+tlig
+HiraMinPro-W6 [/System/Library/Fonts/ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN.ttc](3):+clig;+liga;+tlig
+HiraMinProN-W3 [/System/Library/Fonts/ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN.ttc](0):+clig;+liga;+tlig
+HiraMinProN-W6 [/System/Library/Fonts/ãƒ’ãƒ©ã‚­ã‚™ãƒŽæ˜Žæœ ProN.ttc](2):+clig;+liga;+tlig
+Hiragino Kaku Gothic Pro W3 [/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc](3):+clig;+liga;+tlig
+Hiragino Kaku Gothic Pro W6 [/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc](3):+clig;+liga;+tlig
+Hiragino Kaku Gothic ProN W3 [/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc](2):+clig;+liga;+tlig
+Hiragino Kaku Gothic ProN W6 [/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc](2):+clig;+liga;+tlig
+Hiragino Kaku Gothic Std W8 [/System/Library/Fonts/ヒラギノ角ゴシック W8.ttc](2):+clig;+liga;+tlig
+Hiragino Kaku Gothic StdN W8 [/System/Library/Fonts/ヒラギノ角ゴシック W8.ttc](3):+clig;+liga;+tlig
+Hiragino Sans GB W3 [/System/Library/Fonts/Hiragino Sans GB.ttc](0):+clig;+liga;+tlig
+Hiragino Sans GB W6 [/System/Library/Fonts/Hiragino Sans GB.ttc](2):+clig;+liga;+tlig
+Hiragino Sans W0 [/System/Library/Fonts/ヒラギノ角ゴシック W0.ttc](0):+clig;+liga;+tlig
+Hiragino Sans W1 [/System/Library/Fonts/ヒラギノ角ゴシック W1.ttc](0):+clig;+liga;+tlig
+Hiragino Sans W2 [/System/Library/Fonts/ヒラギノ角ゴシック W2.ttc](0):+clig;+liga;+tlig
+Hiragino Sans W3 [/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc](0):+clig;+liga;+tlig
+Hiragino Sans W4 [/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc](0):+clig;+liga;+tlig
+Hiragino Sans W5 [/System/Library/Fonts/ヒラギノ角ゴシック W5.ttc](0):+clig;+liga;+tlig
+Hiragino Sans W6 [/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc](0):+clig;+liga;+tlig
+Hiragino Sans W7 [/System/Library/Fonts/ヒラギノ角ゴシック W7.ttc](0):+clig;+liga;+tlig
+Hiragino Sans W8 [/System/Library/Fonts/ヒラギノ角ゴシック W8.ttc](0):+clig;+liga;+tlig
+Hiragino Sans W9 [/System/Library/Fonts/ヒラギノ角ゴシック W9.ttc](0):+clig;+liga;+tlig
+IBM Plex Mono [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Regular.otf]:+clig;+liga;+tlig
+IBM Plex Mono; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Regular.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Regular.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Regular.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Regular.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Regular.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Bold.otf]:+clig;+liga;+tlig
+IBM Plex Mono Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Bold.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Bold.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Bold.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Bold.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Bold.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-BoldItalic.otf]:+clig;+liga;+tlig
+IBM Plex Mono Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono ExtLt [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLight.otf]:+clig;+liga;+tlig
+IBM Plex Mono ExtLt; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono ExtLt; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono ExtLt; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono ExtLt; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono ExtLt; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono ExtLt Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLightItalic.otf]:+clig;+liga;+tlig
+IBM Plex Mono ExtLt Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono ExtLt Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono ExtLt Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono ExtLt Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono ExtLt Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Italic.otf]:+clig;+liga;+tlig
+IBM Plex Mono Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Italic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Italic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Italic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Italic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Italic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Light.otf]:+clig;+liga;+tlig
+IBM Plex Mono Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Light.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Light.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Light.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Light.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Light.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-LightItalic.otf]:+clig;+liga;+tlig
+IBM Plex Mono Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Medm [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Medium.otf]:+clig;+liga;+tlig
+IBM Plex Mono Medm; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Medium.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Medm; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Medium.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Medm; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Medium.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Medm; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Medium.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Medm; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Medium.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Medm Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-MediumItalic.otf]:+clig;+liga;+tlig
+IBM Plex Mono Medm Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Medm Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Medm Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Medm Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Medm Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono SmBld [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBold.otf]:+clig;+liga;+tlig
+IBM Plex Mono SmBld; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono SmBld; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono SmBld; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono SmBld; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono SmBld; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono SmBld Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBoldItalic.otf]:+clig;+liga;+tlig
+IBM Plex Mono SmBld Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono SmBld Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono SmBld Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono SmBld Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono SmBld Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Text [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Text.otf]:+clig;+liga;+tlig
+IBM Plex Mono Text; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Text.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Text; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Text.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Text; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Text.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Text; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Text.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Text; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Text.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Text Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-TextItalic.otf]:+clig;+liga;+tlig
+IBM Plex Mono Text Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-TextItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Text Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-TextItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Text Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-TextItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Text Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-TextItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Text Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-TextItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Thin.otf]:+clig;+liga;+tlig
+IBM Plex Mono Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Thin.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Thin.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Thin.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Thin.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-Thin.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Mono Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ThinItalic.otf]:+clig;+liga;+tlig
+IBM Plex Mono Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Mono Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Mono Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Mono Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Mono Thin Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexMono-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Regular.otf]:+clig;+liga;+tlig
+IBM Plex Sans; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Regular.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Regular.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Regular.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Regular.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Regular.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Regular.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Bold.otf]:+clig;+liga;+tlig
+IBM Plex Sans Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Bold.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Bold.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Bold.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Bold.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Bold.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Bold.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-BoldItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Regular.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Regular.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Regular.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Regular.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Regular.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Regular.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Bold.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Bold.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Bold.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Bold.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Bold.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Bold.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-BoldItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond ExtLt [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLight.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond ExtLt; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond ExtLt; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond ExtLt; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond ExtLt; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond ExtLt; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond ExtLt Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLightItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond ExtLt Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond ExtLt Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond ExtLt Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond ExtLt Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond ExtLt Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Italic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Italic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Italic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Italic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Italic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Italic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Light.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Light.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Light.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Light.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Light.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Light.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-LightItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Medm [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Medium.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Medm; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Medium.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Medm; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Medium.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Medm; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Medium.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Medm; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Medium.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Medm; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Medium.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Medm Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-MediumItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Medm Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Medm Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Medm Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Medm Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Medm Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond SmBld [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBold.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond SmBld; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond SmBld; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond SmBld; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond SmBld; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond SmBld; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond SmBld Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBoldItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond SmBld Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond SmBld Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond SmBld Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond SmBld Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond SmBld Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Text [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Text.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Text; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Text.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Text; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Text.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Text; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Text.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Text; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Text.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Text; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Text.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Text Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-TextItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Text Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-TextItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Text Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-TextItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Text Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-TextItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Text Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-TextItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Text Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-TextItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Thin.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Thin.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Thin.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Thin.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Thin.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-Thin.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Cond Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ThinItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Cond Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Cond Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Cond Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Cond Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Cond Thin Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSansCondensed-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans ExtLt [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLight.otf]:+clig;+liga;+tlig
+IBM Plex Sans ExtLt; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans ExtLt; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans ExtLt; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans ExtLt; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans ExtLt; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans ExtLt; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans ExtLt Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLightItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans ExtLt Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans ExtLt Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans ExtLt Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans ExtLt Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans ExtLt Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans ExtLt Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Italic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Italic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Italic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Italic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Italic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Italic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Italic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Light.otf]:+clig;+liga;+tlig
+IBM Plex Sans Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Light.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Light.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Light.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Light.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Light.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Light.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-LightItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-LightItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Medm [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Medium.otf]:+clig;+liga;+tlig
+IBM Plex Sans Medm; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Medium.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Medm; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Medium.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Medm; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Medium.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Medm; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Medium.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Medm; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Medium.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Medm; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Medium.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Medm Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-MediumItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Medm Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Medm Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Medm Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Medm Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Medm Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Medm Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans SmBld [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBold.otf]:+clig;+liga;+tlig
+IBM Plex Sans SmBld; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBold.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans SmBld; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans SmBld; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans SmBld; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans SmBld; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans SmBld; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans SmBld Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBoldItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans SmBld Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans SmBld Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans SmBld Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans SmBld Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans SmBld Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans SmBld Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Text [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Text.otf]:+clig;+liga;+tlig
+IBM Plex Sans Text; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Text.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Text; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Text.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Text; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Text.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Text; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Text.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Text; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Text.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Text; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Text.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Text Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-TextItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Text Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-TextItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Text Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-TextItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Text Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-TextItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Text Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-TextItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Text Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-TextItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Text Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-TextItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Thin.otf]:+clig;+liga;+tlig
+IBM Plex Sans Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Thin.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Thin.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Thin.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Thin.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Thin.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-Thin.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Sans Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ThinItalic.otf]:+clig;+liga;+tlig
+IBM Plex Sans Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Sans Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Sans Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Sans Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Sans Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Sans Thin Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSans-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Regular.otf]:+clig;+liga;+tlig
+IBM Plex Serif; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Regular.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Regular.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Regular.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Regular.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Regular.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Regular.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Bold.otf]:+clig;+liga;+tlig
+IBM Plex Serif Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Bold.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Bold.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Bold.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Bold.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Bold.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Bold.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-BoldItalic.otf]:+clig;+liga;+tlig
+IBM Plex Serif Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif ExtLt [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLight.otf]:+clig;+liga;+tlig
+IBM Plex Serif ExtLt; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif ExtLt; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif ExtLt; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif ExtLt; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif ExtLt; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif ExtLt; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif ExtLt Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig
+IBM Plex Serif ExtLt Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif ExtLt Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif ExtLt Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif ExtLt Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif ExtLt Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif ExtLt Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Italic.otf]:+clig;+liga;+tlig
+IBM Plex Serif Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Italic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Italic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Italic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Italic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Italic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Italic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Light.otf]:+clig;+liga;+tlig
+IBM Plex Serif Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Light.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Light.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Light.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Light.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Light.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Light.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-LightItalic.otf]:+clig;+liga;+tlig
+IBM Plex Serif Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-LightItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Medm [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Medium.otf]:+clig;+liga;+tlig
+IBM Plex Serif Medm; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Medium.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Medm; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Medium.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Medm; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Medium.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Medm; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Medium.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Medm; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Medium.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Medm; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Medium.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Medm Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-MediumItalic.otf]:+clig;+liga;+tlig
+IBM Plex Serif Medm Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Medm Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Medm Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Medm Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Medm Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Medm Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif SmBld [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBold.otf]:+clig;+liga;+tlig
+IBM Plex Serif SmBld; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBold.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif SmBld; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif SmBld; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif SmBld; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif SmBld; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif SmBld; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif SmBld Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig
+IBM Plex Serif SmBld Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif SmBld Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif SmBld Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif SmBld Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif SmBld Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif SmBld Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Text [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Text.otf]:+clig;+liga;+tlig
+IBM Plex Serif Text; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Text.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Text; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Text.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Text; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Text.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Text; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Text.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Text; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Text.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Text; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Text.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Text Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-TextItalic.otf]:+clig;+liga;+tlig
+IBM Plex Serif Text Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-TextItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Text Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-TextItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Text Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-TextItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Text Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-TextItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Text Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-TextItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Text Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-TextItalic.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Thin.otf]:+clig;+liga;+tlig
+IBM Plex Serif Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Thin.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Thin.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Thin.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Thin.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Thin.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-Thin.otf]:+clig;+liga;+tlig;+ss05
+IBM Plex Serif Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ThinItalic.otf]:+clig;+liga;+tlig
+IBM Plex Serif Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+IBM Plex Serif Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+IBM Plex Serif Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+IBM Plex Serif Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+IBM Plex Serif Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+IBM Plex Serif Thin Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/ibm/plex/IBMPlexSerif-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+IM FELL English Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENit28P.otf]:+clig;+liga;+tlig
+IM FELL English Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENit28P.otf]:+clig;+liga;+tlig;+hist
+IM FELL English Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENit28P.otf]:+clig;+liga;+tlig;+ss01
+IM FELL English Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENit28P.otf]:+clig;+liga;+tlig;+ss02
+IM FELL English Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENit28P.otf]:+clig;+liga;+tlig;+ss03
+IM FELL English Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENit28P.otf]:+clig;+liga;+tlig;+ss04
+IM FELL English Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENit28P.otf]:+clig;+liga;+tlig;+swsh
+IM FELL English Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENrm28P.otf]:+clig;+liga;+tlig
+IM FELL English Roman; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENrm28P.otf]:+clig;+liga;+tlig;+hist
+IM FELL English Roman; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENrm28P.otf]:+clig;+liga;+tlig;+ss01
+IM FELL English Roman; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENrm28P.otf]:+clig;+liga;+tlig;+ss02
+IM FELL English Roman; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENrm28P.otf]:+clig;+liga;+tlig;+ss03
+IM FELL English Roman; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENrm28P.otf]:+clig;+liga;+tlig;+ss04
+IM FELL English SC [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENsc28P.otf]:+clig;+liga;+tlig
+IM FELL English SC; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENsc28P.otf]:+clig;+liga;+tlig;+ss02
+IM FELL English SC; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENsc28P.otf]:+clig;+liga;+tlig;+ss03
+IM FELL English SC; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/IMFeENsc28P.otf]:+clig;+liga;+tlig;+ss04
+IM_FELL_FLOWERS_1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/FeFlow1.otf]:+clig;+liga;+tlig
+IM_FELL_FLOWERS_2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/iginomarini/imfellenglish/FeFlow2.otf]:+clig;+liga;+tlig
+IPAGothic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ipaex/ipag.ttf]:+clig;+liga;+tlig
+IPAMincho [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ipaex/ipam.ttf]:+clig;+liga;+tlig
+IPAPGothic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ipaex/ipagp.ttf]:+clig;+liga;+tlig
+IPAPMincho [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ipaex/ipamp.ttf]:+clig;+liga;+tlig
+IPAexGothic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ipaex/ipaexg.ttf]:+clig;+liga;+tlig
+IPAexMincho [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ipaex/ipaexm.ttf]:+clig;+liga;+tlig
+Ibarra Real Nova Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-Bold.ttf]:+clig;+liga;+tlig
+Ibarra Real Nova Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-Bold.ttf]:+clig;+liga;+tlig;+onum
+Ibarra Real Nova Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Ibarra Real Nova Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-BoldItalic.ttf]:+clig;+liga;+tlig
+Ibarra Real Nova Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Ibarra Real Nova Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Ibarra Real Nova Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-Italic.ttf]:+clig;+liga;+tlig
+Ibarra Real Nova Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-Italic.ttf]:+clig;+liga;+tlig;+onum
+Ibarra Real Nova Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Ibarra Real Nova Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-Regular.ttf]:+clig;+liga;+tlig
+Ibarra Real Nova Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-Regular.ttf]:+clig;+liga;+tlig;+onum
+Ibarra Real Nova Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Ibarra Real Nova SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-SemiBold.ttf]:+clig;+liga;+tlig
+Ibarra Real Nova SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-SemiBold.ttf]:+clig;+liga;+tlig;+onum
+Ibarra Real Nova SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-SemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Ibarra Real Nova SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Ibarra Real Nova SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Ibarra Real Nova SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ibarra/IbarraRealNova-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Inconsolata Black [/Users/bveytsman/Library/Fonts/Inconsolata-Black.ttf]:+clig;+liga;+tlig
+Inconsolata Black; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata-Black.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Black; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata-Black.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Black; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata-Black.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Bold [/Users/bveytsman/Library/Fonts/Inconsolata-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata Bold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Bold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Bold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Condensed Black [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Black.ttf]:+clig;+liga;+tlig
+Inconsolata Condensed Black; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Black.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Condensed Black; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Black.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Condensed Black; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Black.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Condensed Bold [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata Condensed Bold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Condensed Bold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Condensed Bold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Condensed ExtraBold [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Inconsolata Condensed ExtraBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Condensed ExtraBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Condensed ExtraBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Condensed ExtraLight [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Inconsolata Condensed ExtraLight; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Condensed ExtraLight; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Condensed ExtraLight; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Condensed Light [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Light.ttf]:+clig;+liga;+tlig
+Inconsolata Condensed Light; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Condensed Light; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Condensed Light; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Light.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Condensed Medium [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Medium.ttf]:+clig;+liga;+tlig
+Inconsolata Condensed Medium; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Condensed Medium; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Condensed Medium; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Condensed Regular [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata Condensed Regular; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Condensed Regular; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Condensed Regular; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Condensed SemiBold [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-SemiBold.ttf]:+clig;+liga;+tlig
+Inconsolata Condensed SemiBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Condensed SemiBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Condensed SemiBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Condensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Expanded Black [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Black.ttf]:+clig;+liga;+tlig
+Inconsolata Expanded Black; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Black.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Expanded Black; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Black.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Expanded Black; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Black.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Expanded Bold [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata Expanded Bold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Expanded Bold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Expanded Bold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Expanded ExtraBold [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-ExtraBold.ttf]:+clig;+liga;+tlig
+Inconsolata Expanded ExtraBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Expanded ExtraBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Expanded ExtraBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Expanded ExtraLight [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-ExtraLight.ttf]:+clig;+liga;+tlig
+Inconsolata Expanded ExtraLight; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Expanded ExtraLight; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Expanded ExtraLight; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Expanded Light [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Light.ttf]:+clig;+liga;+tlig
+Inconsolata Expanded Light; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Expanded Light; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Expanded Light; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Light.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Expanded Medium [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Medium.ttf]:+clig;+liga;+tlig
+Inconsolata Expanded Medium; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Expanded Medium; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Expanded Medium; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Expanded Regular [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata Expanded Regular; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Expanded Regular; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Expanded Regular; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Expanded SemiBold [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-SemiBold.ttf]:+clig;+liga;+tlig
+Inconsolata Expanded SemiBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Expanded SemiBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Expanded SemiBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_Expanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraBold [/Users/bveytsman/Library/Fonts/Inconsolata-ExtraBold.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraCondensed Black [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Black.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraCondensed Black; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Black.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraCondensed Black; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Black.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraCondensed Black; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Black.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraCondensed Bold [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraCondensed Bold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraCondensed Bold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraCondensed Bold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraCondensed ExtraBold [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraCondensed ExtraBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraCondensed ExtraBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraCondensed ExtraBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraCondensed ExtraLight [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraCondensed ExtraLight; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraCondensed ExtraLight; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraCondensed ExtraLight; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraCondensed Light [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Light.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraCondensed Light; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraCondensed Light; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraCondensed Light; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Light.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraCondensed Medium [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Medium.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraCondensed Medium; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraCondensed Medium; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraCondensed Medium; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraCondensed Regular [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraCondensed Regular; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraCondensed Regular; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraCondensed Regular; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraCondensed SemiBold [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-SemiBold.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraCondensed SemiBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraCondensed SemiBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraCondensed SemiBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraExpanded Black [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Black.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraExpanded Black; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Black.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraExpanded Black; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Black.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraExpanded Black; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Black.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraExpanded Bold [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraExpanded Bold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraExpanded Bold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraExpanded Bold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraExpanded ExtraBold [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-ExtraBold.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraExpanded ExtraBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraExpanded ExtraBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraExpanded ExtraBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraExpanded ExtraLight [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-ExtraLight.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraExpanded ExtraLight; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraExpanded ExtraLight; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraExpanded ExtraLight; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraExpanded Light [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Light.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraExpanded Light; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraExpanded Light; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraExpanded Light; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Light.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraExpanded Medium [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Medium.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraExpanded Medium; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraExpanded Medium; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraExpanded Medium; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraExpanded Regular [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraExpanded Regular; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraExpanded Regular; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraExpanded Regular; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraExpanded SemiBold [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-SemiBold.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraExpanded SemiBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraExpanded SemiBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraExpanded SemiBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_ExtraExpanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata ExtraLight [/Users/bveytsman/Library/Fonts/Inconsolata-ExtraLight.ttf]:+clig;+liga;+tlig
+Inconsolata ExtraLight; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata ExtraLight; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata ExtraLight; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata LGC Nerd Font [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFont-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFont-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFont-BoldItalic.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFont-Italic.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Mono [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFontMono-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Mono Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFontMono-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Mono Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFontMono-BoldItalic.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Mono Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFontMono-Italic.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Propo [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFontPropo-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Propo Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFontPropo-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Propo Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFontPropo-BoldItalic.ttf]:+clig;+liga;+tlig
+Inconsolata LGC Nerd Font Propo Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inconsolata-nerd-font/InconsolataLGCNerdFontPropo-Italic.ttf]:+clig;+liga;+tlig
+Inconsolata Light [/Users/bveytsman/Library/Fonts/Inconsolata-Light.ttf]:+clig;+liga;+tlig
+Inconsolata Light; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Light; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Light; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata-Light.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Medium [/Users/bveytsman/Library/Fonts/Inconsolata-Medium.ttf]:+clig;+liga;+tlig
+Inconsolata Medium; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Medium; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Medium; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Narrow Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/InconsolataN-Bold.otf]:+clig;+liga;+tlig
+Inconsolata Narrow Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/InconsolataN-Bold.otf]:+clig;+liga;+tlig;+ss01
+Inconsolata Narrow Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/InconsolataN-Bold.otf]:+clig;+liga;+tlig;+ss02
+Inconsolata Narrow Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/InconsolataN-Bold.otf]:+clig;+liga;+tlig;+ss03
+Inconsolata Narrow Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/InconsolataN-Regular.otf]:+clig;+liga;+tlig
+Inconsolata Narrow Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/InconsolataN-Regular.otf]:+clig;+liga;+tlig;+ss01
+Inconsolata Narrow Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/InconsolataN-Regular.otf]:+clig;+liga;+tlig;+ss02
+Inconsolata Narrow Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/InconsolataN-Regular.otf]:+clig;+liga;+tlig;+ss03
+Inconsolata Regular [/Users/bveytsman/Library/Fonts/Inconsolata-VariableFont_wdth,wght.ttf]:+clig;+liga;+tlig
+Inconsolata Regular; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata-VariableFont_wdth,wght.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Regular; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata-VariableFont_wdth,wght.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Regular; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata-VariableFont_wdth,wght.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata Regular [/Users/bveytsman/Library/Fonts/Inconsolata-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata Regular; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata Regular; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata Regular; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiBold [/Users/bveytsman/Library/Fonts/Inconsolata-SemiBold.ttf]:+clig;+liga;+tlig
+Inconsolata SemiBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiCondensed Black [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Black.ttf]:+clig;+liga;+tlig
+Inconsolata SemiCondensed Black; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Black.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiCondensed Black; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Black.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiCondensed Black; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Black.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiCondensed Bold [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata SemiCondensed Bold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiCondensed Bold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiCondensed Bold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiCondensed ExtraBold [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Inconsolata SemiCondensed ExtraBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiCondensed ExtraBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiCondensed ExtraBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiCondensed ExtraLight [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Inconsolata SemiCondensed ExtraLight; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiCondensed ExtraLight; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiCondensed ExtraLight; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiCondensed Light [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Light.ttf]:+clig;+liga;+tlig
+Inconsolata SemiCondensed Light; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiCondensed Light; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiCondensed Light; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Light.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiCondensed Medium [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Medium.ttf]:+clig;+liga;+tlig
+Inconsolata SemiCondensed Medium; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiCondensed Medium; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiCondensed Medium; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiCondensed Regular [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata SemiCondensed Regular; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiCondensed Regular; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiCondensed Regular; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiCondensed SemiBold [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-SemiBold.ttf]:+clig;+liga;+tlig
+Inconsolata SemiCondensed SemiBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiCondensed SemiBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiCondensed SemiBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiExpanded Black [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Black.ttf]:+clig;+liga;+tlig
+Inconsolata SemiExpanded Black; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Black.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiExpanded Black; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Black.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiExpanded Black; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Black.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiExpanded Bold [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata SemiExpanded Bold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiExpanded Bold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiExpanded Bold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiExpanded ExtraBold [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-ExtraBold.ttf]:+clig;+liga;+tlig
+Inconsolata SemiExpanded ExtraBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiExpanded ExtraBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiExpanded ExtraBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiExpanded ExtraLight [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-ExtraLight.ttf]:+clig;+liga;+tlig
+Inconsolata SemiExpanded ExtraLight; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiExpanded ExtraLight; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiExpanded ExtraLight; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiExpanded Light [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Light.ttf]:+clig;+liga;+tlig
+Inconsolata SemiExpanded Light; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiExpanded Light; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiExpanded Light; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Light.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiExpanded Medium [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Medium.ttf]:+clig;+liga;+tlig
+Inconsolata SemiExpanded Medium; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiExpanded Medium; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiExpanded Medium; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiExpanded Regular [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata SemiExpanded Regular; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiExpanded Regular; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiExpanded Regular; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata SemiExpanded SemiBold [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-SemiBold.ttf]:+clig;+liga;+tlig
+Inconsolata SemiExpanded SemiBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata SemiExpanded SemiBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata SemiExpanded SemiBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_SemiExpanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraCondensed Black [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Black.ttf]:+clig;+liga;+tlig
+Inconsolata UltraCondensed Black; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Black.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraCondensed Black; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Black.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraCondensed Black; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Black.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraCondensed Bold [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata UltraCondensed Bold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraCondensed Bold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraCondensed Bold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraCondensed ExtraBold [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Inconsolata UltraCondensed ExtraBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraCondensed ExtraBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraCondensed ExtraBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraCondensed ExtraLight [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Inconsolata UltraCondensed ExtraLight; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraCondensed ExtraLight; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraCondensed ExtraLight; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraCondensed Light [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Light.ttf]:+clig;+liga;+tlig
+Inconsolata UltraCondensed Light; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraCondensed Light; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraCondensed Light; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Light.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraCondensed Medium [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Medium.ttf]:+clig;+liga;+tlig
+Inconsolata UltraCondensed Medium; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraCondensed Medium; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraCondensed Medium; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraCondensed Regular [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata UltraCondensed Regular; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraCondensed Regular; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraCondensed Regular; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraCondensed SemiBold [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-SemiBold.ttf]:+clig;+liga;+tlig
+Inconsolata UltraCondensed SemiBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraCondensed SemiBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraCondensed SemiBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraExpanded Black [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Black.ttf]:+clig;+liga;+tlig
+Inconsolata UltraExpanded Black; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Black.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraExpanded Black; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Black.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraExpanded Black; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Black.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraExpanded Bold [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Bold.ttf]:+clig;+liga;+tlig
+Inconsolata UltraExpanded Bold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraExpanded Bold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraExpanded Bold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraExpanded ExtraBold [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-ExtraBold.ttf]:+clig;+liga;+tlig
+Inconsolata UltraExpanded ExtraBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraExpanded ExtraBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraExpanded ExtraBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraExpanded ExtraLight [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-ExtraLight.ttf]:+clig;+liga;+tlig
+Inconsolata UltraExpanded ExtraLight; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraExpanded ExtraLight; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraExpanded ExtraLight; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraExpanded Light [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Light.ttf]:+clig;+liga;+tlig
+Inconsolata UltraExpanded Light; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraExpanded Light; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraExpanded Light; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Light.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraExpanded Medium [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Medium.ttf]:+clig;+liga;+tlig
+Inconsolata UltraExpanded Medium; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraExpanded Medium; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraExpanded Medium; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraExpanded Regular [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Regular.ttf]:+clig;+liga;+tlig
+Inconsolata UltraExpanded Regular; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraExpanded Regular; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraExpanded Regular; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata UltraExpanded SemiBold [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-SemiBold.ttf]:+clig;+liga;+tlig
+Inconsolata UltraExpanded SemiBold; Stylistic Set 1 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Inconsolata UltraExpanded SemiBold; Stylistic Set 2 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Inconsolata UltraExpanded SemiBold; Stylistic Set 3 [/Users/bveytsman/Library/Fonts/Inconsolata_UltraExpanded-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Inconsolata zi4 Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Bold.otf]:+clig;+liga;+tlig
+Inconsolata zi4 Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Bold.otf]:+clig;+liga;+tlig;+ss01
+Inconsolata zi4 Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Bold.otf]:+clig;+liga;+tlig;+ss02
+Inconsolata zi4 Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Bold.otf]:+clig;+liga;+tlig;+ss03
+Inconsolata zi4r Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Regular.otf]:+clig;+liga;+tlig
+Inconsolata zi4r Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Regular.otf]:+clig;+liga;+tlig;+ss01
+Inconsolata zi4r Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Regular.otf]:+clig;+liga;+tlig;+ss02
+Inconsolata zi4r Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Regular.otf]:+clig;+liga;+tlig;+ss03
+Indiction Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/IndictionUnicode.otf]:+clig;+liga;+tlig
+Indoor Kid Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Bold.otf]:+clig;+liga;+tlig
+Indoor Kid Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Bold.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Bold.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Bold.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Bold.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Bold.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-BoldItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Condensed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Bold.otf]:+clig;+liga;+tlig
+Indoor Kid Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Condensed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Bold.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Condensed Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Bold.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Condensed Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Bold.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Condensed Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-BoldItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Condensed Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Condensed Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Condensed Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Condensed Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Condensed Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Condensed Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Italic.otf]:+clig;+liga;+tlig
+Indoor Kid Condensed Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Italic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Condensed Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Italic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Condensed Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Italic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Condensed Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Italic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Condensed Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Italic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Condensed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Light.otf]:+clig;+liga;+tlig
+Indoor Kid Condensed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Light.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Condensed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Light.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Condensed Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Light.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Condensed Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Light.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Condensed Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Light.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Condensed Light Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-LightItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Condensed Light Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Condensed Light Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Condensed Light Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Condensed Light Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Condensed Light Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Condensed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Medium.otf]:+clig;+liga;+tlig
+Indoor Kid Condensed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Condensed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Medium.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Condensed Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Medium.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Condensed Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Medium.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Condensed Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Medium.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Condensed Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-MediumItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Condensed Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Condensed Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Condensed Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Condensed Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Condensed Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Condensed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Regular.otf]:+clig;+liga;+tlig
+Indoor Kid Condensed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Condensed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Condensed Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Regular.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Condensed Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Regular.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Condensed Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidCondensed-Regular.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extended Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Bold.otf]:+clig;+liga;+tlig
+Indoor Kid Extended Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Bold.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extended Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Bold.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extended Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Bold.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extended Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Bold.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extended Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Bold.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extended Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-BoldItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Extended Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extended Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extended Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extended Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extended Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extended Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Italic.otf]:+clig;+liga;+tlig
+Indoor Kid Extended Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Italic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extended Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Italic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extended Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Italic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extended Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Italic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extended Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Italic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extended Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Light.otf]:+clig;+liga;+tlig
+Indoor Kid Extended Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Light.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extended Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Light.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extended Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Light.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extended Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Light.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extended Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Light.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extended Light Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-LightItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Extended Light Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extended Light Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extended Light Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extended Light Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extended Light Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extended Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Medium.otf]:+clig;+liga;+tlig
+Indoor Kid Extended Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Medium.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extended Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Medium.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extended Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Medium.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extended Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Medium.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extended Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Medium.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extended Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-MediumItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Extended Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extended Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extended Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extended Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extended Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extended Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Regular.otf]:+clig;+liga;+tlig
+Indoor Kid Extended Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Regular.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extended Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Regular.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extended Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Regular.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extended Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Regular.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extended Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtended-Regular.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extra Condensed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Bold.otf]:+clig;+liga;+tlig
+Indoor Kid Extra Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extra Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extra Condensed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Bold.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extra Condensed Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Bold.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extra Condensed Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Bold.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extra Condensed Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-BoldItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Extra Condensed Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extra Condensed Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extra Condensed Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extra Condensed Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extra Condensed Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extra Condensed Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Italic.otf]:+clig;+liga;+tlig
+Indoor Kid Extra Condensed Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Italic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extra Condensed Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Italic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extra Condensed Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Italic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extra Condensed Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Italic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extra Condensed Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Italic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extra Condensed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Light.otf]:+clig;+liga;+tlig
+Indoor Kid Extra Condensed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Light.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extra Condensed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Light.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extra Condensed Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Light.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extra Condensed Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Light.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extra Condensed Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Light.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extra Condensed Light Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-LightItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Extra Condensed Light Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extra Condensed Light Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extra Condensed Light Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extra Condensed Light Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extra Condensed Light Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extra Condensed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Medium.otf]:+clig;+liga;+tlig
+Indoor Kid Extra Condensed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extra Condensed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Medium.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extra Condensed Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Medium.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extra Condensed Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Medium.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extra Condensed Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Medium.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extra Condensed Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-MediumItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Extra Condensed Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extra Condensed Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extra Condensed Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extra Condensed Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extra Condensed Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Extra Condensed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Regular.otf]:+clig;+liga;+tlig
+Indoor Kid Extra Condensed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Extra Condensed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Extra Condensed Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Regular.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Extra Condensed Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Regular.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Extra Condensed Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidExtraCondensed-Regular.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Italic.otf]:+clig;+liga;+tlig
+Indoor Kid Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Italic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Italic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Italic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Italic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Italic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Light.otf]:+clig;+liga;+tlig
+Indoor Kid Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Light.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Light.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Light.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Light.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Light.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Light Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-LightItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Light Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Light Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Light Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Light Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Light Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Medium.otf]:+clig;+liga;+tlig
+Indoor Kid Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Medium.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Medium.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Medium.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Medium.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Medium.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-MediumItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Narrow Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Bold.otf]:+clig;+liga;+tlig
+Indoor Kid Narrow Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Bold.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Narrow Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Bold.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Narrow Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Bold.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Narrow Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Bold.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Narrow Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Bold.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Narrow Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-BoldItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Narrow Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Narrow Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Narrow Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Narrow Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Narrow Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Narrow Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Italic.otf]:+clig;+liga;+tlig
+Indoor Kid Narrow Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Italic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Narrow Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Italic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Narrow Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Italic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Narrow Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Italic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Narrow Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Italic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Narrow Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Light.otf]:+clig;+liga;+tlig
+Indoor Kid Narrow Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Light.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Narrow Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Light.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Narrow Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Light.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Narrow Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Light.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Narrow Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Light.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Narrow Light Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-LightItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Narrow Light Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Narrow Light Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Narrow Light Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Narrow Light Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Narrow Light Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Narrow Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Medium.otf]:+clig;+liga;+tlig
+Indoor Kid Narrow Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Medium.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Narrow Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Medium.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Narrow Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Medium.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Narrow Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Medium.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Narrow Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Medium.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Narrow Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-MediumItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Narrow Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Narrow Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Narrow Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Narrow Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Narrow Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Narrow Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Regular.otf]:+clig;+liga;+tlig
+Indoor Kid Narrow Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Regular.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Narrow Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Regular.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Narrow Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Regular.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Narrow Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Regular.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Narrow Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidNarrow-Regular.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Regular.otf]:+clig;+liga;+tlig
+Indoor Kid Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Regular.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Regular.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Regular.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Regular.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKid-Regular.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Variable Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/IndoorKid/IndoorKidVariable_EMPH,slnt,wdth,wght_.ttf]:+clig;+liga;+tlig
+Indoor Kid Variable Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/IndoorKid/IndoorKidVariable_EMPH,slnt,wdth,wght_.ttf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Variable Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/IndoorKid/IndoorKidVariable_EMPH,slnt,wdth,wght_.ttf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Variable Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/IndoorKid/IndoorKidVariable_EMPH,slnt,wdth,wght_.ttf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Variable Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/IndoorKid/IndoorKidVariable_EMPH,slnt,wdth,wght_.ttf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Variable Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/IndoorKid/IndoorKidVariable_EMPH,slnt,wdth,wght_.ttf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Wide Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Bold.otf]:+clig;+liga;+tlig
+Indoor Kid Wide Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Bold.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Wide Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Bold.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Wide Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Bold.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Wide Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Bold.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Wide Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Bold.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Wide Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-BoldItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Wide Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Wide Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Wide Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Wide Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Wide Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Wide Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Italic.otf]:+clig;+liga;+tlig
+Indoor Kid Wide Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Italic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Wide Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Italic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Wide Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Italic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Wide Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Italic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Wide Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Italic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Wide Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Light.otf]:+clig;+liga;+tlig
+Indoor Kid Wide Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Light.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Wide Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Light.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Wide Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Light.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Wide Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Light.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Wide Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Light.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Wide Light Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-LightItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Wide Light Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Wide Light Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Wide Light Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Wide Light Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Wide Light Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Wide Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Medium.otf]:+clig;+liga;+tlig
+Indoor Kid Wide Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Medium.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Wide Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Medium.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Wide Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Medium.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Wide Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Medium.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Wide Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Medium.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Wide Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-MediumItalic.otf]:+clig;+liga;+tlig
+Indoor Kid Wide Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Wide Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Wide Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Wide Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Wide Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Indoor Kid Wide Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Regular.otf]:+clig;+liga;+tlig
+Indoor Kid Wide Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Regular.otf]:+clig;+liga;+tlig;+ss01
+Indoor Kid Wide Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Regular.otf]:+clig;+liga;+tlig;+ss03
+Indoor Kid Wide Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Regular.otf]:+clig;+liga;+tlig;+ss04
+Indoor Kid Wide Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Regular.otf]:+clig;+liga;+tlig;+ss05
+Indoor Kid Wide Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/IndoorKid/IndoorKidWide-Regular.otf]:+clig;+liga;+tlig;+ss06
+Inria Sans [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Regular.otf]:+clig;+liga;+tlig
+Inria Sans; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Regular.otf]:+clig;+liga;+tlig;+onum
+Inria Sans; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Regular.otf]:+clig;+liga;+tlig;+ss01
+Inria Sans; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Regular.otf]:+clig;+liga;+tlig;+ss02
+Inria Sans [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Regular.ttf]:+clig;+liga;+tlig
+Inria Sans; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Regular.ttf]:+clig;+liga;+tlig;+onum
+Inria Sans; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inria Sans; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inria Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Bold.otf]:+clig;+liga;+tlig
+Inria Sans Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Bold.otf]:+clig;+liga;+tlig;+onum
+Inria Sans Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Bold.otf]:+clig;+liga;+tlig;+ss01
+Inria Sans Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Bold.otf]:+clig;+liga;+tlig;+ss02
+Inria Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Bold.ttf]:+clig;+liga;+tlig
+Inria Sans Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Bold.ttf]:+clig;+liga;+tlig;+onum
+Inria Sans Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inria Sans Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inria Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-BoldItalic.otf]:+clig;+liga;+tlig
+Inria Sans Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Inria Sans Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Inria Sans Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Inria Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-BoldItalic.ttf]:+clig;+liga;+tlig
+Inria Sans Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Inria Sans Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Inria Sans Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Inria Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Italic.otf]:+clig;+liga;+tlig
+Inria Sans Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Italic.otf]:+clig;+liga;+tlig;+onum
+Inria Sans Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Italic.otf]:+clig;+liga;+tlig;+ss01
+Inria Sans Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Italic.otf]:+clig;+liga;+tlig;+ss02
+Inria Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Italic.ttf]:+clig;+liga;+tlig
+Inria Sans Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Italic.ttf]:+clig;+liga;+tlig;+onum
+Inria Sans Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Inria Sans Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Inria Sans Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Light.otf]:+clig;+liga;+tlig
+Inria Sans Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Light.otf]:+clig;+liga;+tlig;+onum
+Inria Sans Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Light.otf]:+clig;+liga;+tlig;+ss01
+Inria Sans Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-Light.otf]:+clig;+liga;+tlig;+ss02
+Inria Sans Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Light.ttf]:+clig;+liga;+tlig
+Inria Sans Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Light.ttf]:+clig;+liga;+tlig;+onum
+Inria Sans Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inria Sans Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inria Sans Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-LightItalic.otf]:+clig;+liga;+tlig
+Inria Sans Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Inria Sans Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Inria Sans Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSans-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Inria Sans Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-LightItalic.ttf]:+clig;+liga;+tlig
+Inria Sans Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Inria Sans Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Inria Sans Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSans-LightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Inria Serif [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Regular.otf]:+clig;+liga;+tlig
+Inria Serif; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Regular.otf]:+clig;+liga;+tlig;+onum
+Inria Serif; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Regular.otf]:+clig;+liga;+tlig;+ss01
+Inria Serif; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Regular.otf]:+clig;+liga;+tlig;+ss02
+Inria Serif [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Regular.ttf]:+clig;+liga;+tlig
+Inria Serif; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Regular.ttf]:+clig;+liga;+tlig;+onum
+Inria Serif; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Inria Serif; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Inria Serif Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Bold.otf]:+clig;+liga;+tlig
+Inria Serif Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Bold.otf]:+clig;+liga;+tlig;+onum
+Inria Serif Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Bold.otf]:+clig;+liga;+tlig;+ss01
+Inria Serif Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Bold.otf]:+clig;+liga;+tlig;+ss02
+Inria Serif Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Bold.ttf]:+clig;+liga;+tlig
+Inria Serif Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Bold.ttf]:+clig;+liga;+tlig;+onum
+Inria Serif Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Inria Serif Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Inria Serif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-BoldItalic.otf]:+clig;+liga;+tlig
+Inria Serif Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Inria Serif Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Inria Serif Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Inria Serif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-BoldItalic.ttf]:+clig;+liga;+tlig
+Inria Serif Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Inria Serif Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Inria Serif Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Inria Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Italic.otf]:+clig;+liga;+tlig
+Inria Serif Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Italic.otf]:+clig;+liga;+tlig;+onum
+Inria Serif Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Italic.otf]:+clig;+liga;+tlig;+ss01
+Inria Serif Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Italic.otf]:+clig;+liga;+tlig;+ss02
+Inria Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Italic.ttf]:+clig;+liga;+tlig
+Inria Serif Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Italic.ttf]:+clig;+liga;+tlig;+onum
+Inria Serif Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Inria Serif Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Inria Serif Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Light.otf]:+clig;+liga;+tlig
+Inria Serif Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Light.otf]:+clig;+liga;+tlig;+onum
+Inria Serif Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Light.otf]:+clig;+liga;+tlig;+ss01
+Inria Serif Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-Light.otf]:+clig;+liga;+tlig;+ss02
+Inria Serif Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Light.ttf]:+clig;+liga;+tlig
+Inria Serif Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Light.ttf]:+clig;+liga;+tlig;+onum
+Inria Serif Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Light.ttf]:+clig;+liga;+tlig;+ss01
+Inria Serif Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-Light.ttf]:+clig;+liga;+tlig;+ss02
+Inria Serif Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-LightItalic.otf]:+clig;+liga;+tlig
+Inria Serif Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Inria Serif Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Inria Serif Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inriafonts/InriaSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Inria Serif Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-LightItalic.ttf]:+clig;+liga;+tlig
+Inria Serif Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Inria Serif Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Inria Serif Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/inriafonts/InriaSerif-LightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Inter Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Black.otf]:+clig;+liga;+tlig
+Inter Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Black.otf]:+clig;+liga;+tlig;+smcp
+Inter Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Black.otf]:+clig;+liga;+tlig;+ss01
+Inter Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Black.otf]:+clig;+liga;+tlig;+ss02
+Inter Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Black.otf]:+clig;+liga;+tlig;+ss03
+Inter Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Black.otf]:+clig;+liga;+tlig;+ss04
+Inter Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Black.otf]:+clig;+liga;+tlig;+ss05
+Inter Black; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Black.otf]:+clig;+liga;+tlig;+ss06
+Inter Black; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Black.otf]:+clig;+liga;+tlig;+ss07
+Inter Black; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Black.otf]:+clig;+liga;+tlig;+ss08
+Inter Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BlackItalic.otf]:+clig;+liga;+tlig
+Inter Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BlackItalic.otf]:+clig;+liga;+tlig;+smcp
+Inter Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Inter Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BlackItalic.otf]:+clig;+liga;+tlig;+ss02
+Inter Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Inter Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Inter Black Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Inter Black Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BlackItalic.otf]:+clig;+liga;+tlig;+ss06
+Inter Black Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BlackItalic.otf]:+clig;+liga;+tlig;+ss07
+Inter Black Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BlackItalic.otf]:+clig;+liga;+tlig;+ss08
+Inter Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Bold.otf]:+clig;+liga;+tlig
+Inter Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Bold.otf]:+clig;+liga;+tlig;+smcp
+Inter Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Bold.otf]:+clig;+liga;+tlig;+ss01
+Inter Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Bold.otf]:+clig;+liga;+tlig;+ss02
+Inter Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Bold.otf]:+clig;+liga;+tlig;+ss03
+Inter Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Bold.otf]:+clig;+liga;+tlig;+ss04
+Inter Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Bold.otf]:+clig;+liga;+tlig;+ss05
+Inter Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Bold.otf]:+clig;+liga;+tlig;+ss06
+Inter Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Bold.otf]:+clig;+liga;+tlig;+ss07
+Inter Bold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Bold.otf]:+clig;+liga;+tlig;+ss08
+Inter Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BoldItalic.otf]:+clig;+liga;+tlig
+Inter Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Inter Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Inter Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Inter Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Inter Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Inter Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Inter Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Inter Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Inter Bold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-BoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Inter ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBold.otf]:+clig;+liga;+tlig
+Inter ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+Inter ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Inter ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Inter ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Inter ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+Inter ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Inter ExtraBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBold.otf]:+clig;+liga;+tlig;+ss06
+Inter ExtraBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBold.otf]:+clig;+liga;+tlig;+ss07
+Inter ExtraBold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBold.otf]:+clig;+liga;+tlig;+ss08
+Inter ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Inter ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Inter ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Inter ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Inter ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Inter ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Inter ExtraBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Inter ExtraBold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Inter ExtraBold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Inter ExtraBold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Inter ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLight.otf]:+clig;+liga;+tlig
+Inter ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLight.otf]:+clig;+liga;+tlig;+smcp
+Inter ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Inter ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Inter ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Inter ExtraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Inter ExtraLight; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Inter ExtraLight; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLight.otf]:+clig;+liga;+tlig;+ss06
+Inter ExtraLight; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLight.otf]:+clig;+liga;+tlig;+ss07
+Inter ExtraLight; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLight.otf]:+clig;+liga;+tlig;+ss08
+Inter ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Inter ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLightItalic.otf]:+clig;+liga;+tlig;+smcp
+Inter ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Inter ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+Inter ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Inter ExtraLight Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss04
+Inter ExtraLight Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss05
+Inter ExtraLight Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss06
+Inter ExtraLight Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss07
+Inter ExtraLight Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss08
+Inter Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Italic.otf]:+clig;+liga;+tlig
+Inter Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Italic.otf]:+clig;+liga;+tlig;+smcp
+Inter Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Italic.otf]:+clig;+liga;+tlig;+ss01
+Inter Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Italic.otf]:+clig;+liga;+tlig;+ss02
+Inter Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Italic.otf]:+clig;+liga;+tlig;+ss03
+Inter Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Italic.otf]:+clig;+liga;+tlig;+ss04
+Inter Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Italic.otf]:+clig;+liga;+tlig;+ss05
+Inter Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Italic.otf]:+clig;+liga;+tlig;+ss06
+Inter Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Italic.otf]:+clig;+liga;+tlig;+ss07
+Inter Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Italic.otf]:+clig;+liga;+tlig;+ss08
+Inter Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Light.otf]:+clig;+liga;+tlig
+Inter Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Light.otf]:+clig;+liga;+tlig;+smcp
+Inter Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Light.otf]:+clig;+liga;+tlig;+ss01
+Inter Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Light.otf]:+clig;+liga;+tlig;+ss02
+Inter Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Light.otf]:+clig;+liga;+tlig;+ss03
+Inter Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Light.otf]:+clig;+liga;+tlig;+ss04
+Inter Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Light.otf]:+clig;+liga;+tlig;+ss05
+Inter Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Light.otf]:+clig;+liga;+tlig;+ss06
+Inter Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Light.otf]:+clig;+liga;+tlig;+ss07
+Inter Light; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Light.otf]:+clig;+liga;+tlig;+ss08
+Inter Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-LightItalic.otf]:+clig;+liga;+tlig
+Inter Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Inter Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Inter Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Inter Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Inter Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Inter Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Inter Light Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Inter Light Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-LightItalic.otf]:+clig;+liga;+tlig;+ss07
+Inter Light Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-LightItalic.otf]:+clig;+liga;+tlig;+ss08
+Inter Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Medium.otf]:+clig;+liga;+tlig
+Inter Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Medium.otf]:+clig;+liga;+tlig;+smcp
+Inter Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Medium.otf]:+clig;+liga;+tlig;+ss01
+Inter Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Medium.otf]:+clig;+liga;+tlig;+ss02
+Inter Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Medium.otf]:+clig;+liga;+tlig;+ss03
+Inter Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Medium.otf]:+clig;+liga;+tlig;+ss04
+Inter Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Medium.otf]:+clig;+liga;+tlig;+ss05
+Inter Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Medium.otf]:+clig;+liga;+tlig;+ss06
+Inter Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Medium.otf]:+clig;+liga;+tlig;+ss07
+Inter Medium; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Medium.otf]:+clig;+liga;+tlig;+ss08
+Inter Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-MediumItalic.otf]:+clig;+liga;+tlig
+Inter Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Inter Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Inter Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Inter Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Inter Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Inter Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Inter Medium Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Inter Medium Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-MediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Inter Medium Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-MediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Inter Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Regular.otf]:+clig;+liga;+tlig
+Inter Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Regular.otf]:+clig;+liga;+tlig;+smcp
+Inter Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Regular.otf]:+clig;+liga;+tlig;+ss01
+Inter Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Regular.otf]:+clig;+liga;+tlig;+ss02
+Inter Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Regular.otf]:+clig;+liga;+tlig;+ss03
+Inter Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Regular.otf]:+clig;+liga;+tlig;+ss04
+Inter Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Regular.otf]:+clig;+liga;+tlig;+ss05
+Inter Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Regular.otf]:+clig;+liga;+tlig;+ss06
+Inter Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Regular.otf]:+clig;+liga;+tlig;+ss07
+Inter Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Regular.otf]:+clig;+liga;+tlig;+ss08
+Inter SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBold.otf]:+clig;+liga;+tlig
+Inter SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+Inter SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Inter SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Inter SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Inter SemiBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Inter SemiBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+Inter SemiBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBold.otf]:+clig;+liga;+tlig;+ss06
+Inter SemiBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBold.otf]:+clig;+liga;+tlig;+ss07
+Inter SemiBold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBold.otf]:+clig;+liga;+tlig;+ss08
+Inter SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Inter SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Inter SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Inter SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Inter SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Inter SemiBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Inter SemiBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Inter SemiBold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Inter SemiBold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Inter SemiBold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Inter Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Thin.otf]:+clig;+liga;+tlig
+Inter Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Thin.otf]:+clig;+liga;+tlig;+smcp
+Inter Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Thin.otf]:+clig;+liga;+tlig;+ss01
+Inter Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Thin.otf]:+clig;+liga;+tlig;+ss02
+Inter Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Thin.otf]:+clig;+liga;+tlig;+ss03
+Inter Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Thin.otf]:+clig;+liga;+tlig;+ss04
+Inter Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Thin.otf]:+clig;+liga;+tlig;+ss05
+Inter Thin; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Thin.otf]:+clig;+liga;+tlig;+ss06
+Inter Thin; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Thin.otf]:+clig;+liga;+tlig;+ss07
+Inter Thin; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-Thin.otf]:+clig;+liga;+tlig;+ss08
+Inter Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ThinItalic.otf]:+clig;+liga;+tlig
+Inter Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ThinItalic.otf]:+clig;+liga;+tlig;+smcp
+Inter Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Inter Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+Inter Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Inter Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+Inter Thin Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+Inter Thin Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ThinItalic.otf]:+clig;+liga;+tlig;+ss06
+Inter Thin Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ThinItalic.otf]:+clig;+liga;+tlig;+ss07
+Inter Thin Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/inter/Inter-ThinItalic.otf]:+clig;+liga;+tlig;+ss08
+Ivan Honchar Regular [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/IvanHonchar/IvanHonchar-Regular.otf]:+clig;+liga;+tlig
+Iwona-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Bold.otf]:+clig;+liga;+tlig
+Iwona-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Bold.otf]:+clig;+liga;+tlig;+hist
+Iwona-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Bold.otf]:+clig;+liga;+tlig;+onum
+Iwona-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Bold.otf]:+clig;+liga;+tlig;+smcp
+Iwona-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Bold.otf]:+clig;+liga;+tlig;+ss02
+Iwona-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-BoldItalic.otf]:+clig;+liga;+tlig
+Iwona-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+Iwona-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Iwona-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Iwona-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Iwona-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Italic.otf]:+clig;+liga;+tlig
+Iwona-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Italic.otf]:+clig;+liga;+tlig;+hist
+Iwona-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Italic.otf]:+clig;+liga;+tlig;+onum
+Iwona-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Italic.otf]:+clig;+liga;+tlig;+smcp
+Iwona-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Italic.otf]:+clig;+liga;+tlig;+ss02
+Iwona-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Regular.otf]:+clig;+liga;+tlig
+Iwona-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Regular.otf]:+clig;+liga;+tlig;+hist
+Iwona-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Regular.otf]:+clig;+liga;+tlig;+onum
+Iwona-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Regular.otf]:+clig;+liga;+tlig;+smcp
+Iwona-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Regular.otf]:+clig;+liga;+tlig;+ss02
+IwonaCond-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Bold.otf]:+clig;+liga;+tlig
+IwonaCond-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Bold.otf]:+clig;+liga;+tlig;+hist
+IwonaCond-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Bold.otf]:+clig;+liga;+tlig;+onum
+IwonaCond-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Bold.otf]:+clig;+liga;+tlig;+smcp
+IwonaCond-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Bold.otf]:+clig;+liga;+tlig;+ss02
+IwonaCond-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-BoldItalic.otf]:+clig;+liga;+tlig
+IwonaCond-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+IwonaCond-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+IwonaCond-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+IwonaCond-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+IwonaCond-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Italic.otf]:+clig;+liga;+tlig
+IwonaCond-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Italic.otf]:+clig;+liga;+tlig;+hist
+IwonaCond-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Italic.otf]:+clig;+liga;+tlig;+onum
+IwonaCond-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Italic.otf]:+clig;+liga;+tlig;+smcp
+IwonaCond-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Italic.otf]:+clig;+liga;+tlig;+ss02
+IwonaCond-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Regular.otf]:+clig;+liga;+tlig
+IwonaCond-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Regular.otf]:+clig;+liga;+tlig;+hist
+IwonaCond-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Regular.otf]:+clig;+liga;+tlig;+onum
+IwonaCond-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Regular.otf]:+clig;+liga;+tlig;+smcp
+IwonaCond-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCond-Regular.otf]:+clig;+liga;+tlig;+ss02
+IwonaCondHeavy-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondHeavy-Italic.otf]:+clig;+liga;+tlig
+IwonaCondHeavy-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondHeavy-Italic.otf]:+clig;+liga;+tlig;+hist
+IwonaCondHeavy-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondHeavy-Italic.otf]:+clig;+liga;+tlig;+onum
+IwonaCondHeavy-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondHeavy-Italic.otf]:+clig;+liga;+tlig;+smcp
+IwonaCondHeavy-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondHeavy-Italic.otf]:+clig;+liga;+tlig;+ss02
+IwonaCondHeavy-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondHeavy-Regular.otf]:+clig;+liga;+tlig
+IwonaCondHeavy-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondHeavy-Regular.otf]:+clig;+liga;+tlig;+hist
+IwonaCondHeavy-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondHeavy-Regular.otf]:+clig;+liga;+tlig;+onum
+IwonaCondHeavy-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondHeavy-Regular.otf]:+clig;+liga;+tlig;+smcp
+IwonaCondHeavy-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondHeavy-Regular.otf]:+clig;+liga;+tlig;+ss02
+IwonaCondLight-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondLight-Italic.otf]:+clig;+liga;+tlig
+IwonaCondLight-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondLight-Italic.otf]:+clig;+liga;+tlig;+hist
+IwonaCondLight-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondLight-Italic.otf]:+clig;+liga;+tlig;+onum
+IwonaCondLight-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondLight-Italic.otf]:+clig;+liga;+tlig;+smcp
+IwonaCondLight-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondLight-Italic.otf]:+clig;+liga;+tlig;+ss02
+IwonaCondLight-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondLight-Regular.otf]:+clig;+liga;+tlig
+IwonaCondLight-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondLight-Regular.otf]:+clig;+liga;+tlig;+hist
+IwonaCondLight-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondLight-Regular.otf]:+clig;+liga;+tlig;+onum
+IwonaCondLight-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondLight-Regular.otf]:+clig;+liga;+tlig;+smcp
+IwonaCondLight-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondLight-Regular.otf]:+clig;+liga;+tlig;+ss02
+IwonaCondMedium-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondMedium-Italic.otf]:+clig;+liga;+tlig
+IwonaCondMedium-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondMedium-Italic.otf]:+clig;+liga;+tlig;+hist
+IwonaCondMedium-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondMedium-Italic.otf]:+clig;+liga;+tlig;+onum
+IwonaCondMedium-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondMedium-Italic.otf]:+clig;+liga;+tlig;+smcp
+IwonaCondMedium-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondMedium-Italic.otf]:+clig;+liga;+tlig;+ss02
+IwonaCondMedium-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondMedium-Regular.otf]:+clig;+liga;+tlig
+IwonaCondMedium-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondMedium-Regular.otf]:+clig;+liga;+tlig;+hist
+IwonaCondMedium-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondMedium-Regular.otf]:+clig;+liga;+tlig;+onum
+IwonaCondMedium-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondMedium-Regular.otf]:+clig;+liga;+tlig;+smcp
+IwonaCondMedium-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaCondMedium-Regular.otf]:+clig;+liga;+tlig;+ss02
+IwonaHeavy-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaHeavy-Italic.otf]:+clig;+liga;+tlig
+IwonaHeavy-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaHeavy-Italic.otf]:+clig;+liga;+tlig;+hist
+IwonaHeavy-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaHeavy-Italic.otf]:+clig;+liga;+tlig;+onum
+IwonaHeavy-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaHeavy-Italic.otf]:+clig;+liga;+tlig;+smcp
+IwonaHeavy-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaHeavy-Italic.otf]:+clig;+liga;+tlig;+ss02
+IwonaHeavy-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaHeavy-Regular.otf]:+clig;+liga;+tlig
+IwonaHeavy-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaHeavy-Regular.otf]:+clig;+liga;+tlig;+hist
+IwonaHeavy-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaHeavy-Regular.otf]:+clig;+liga;+tlig;+onum
+IwonaHeavy-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaHeavy-Regular.otf]:+clig;+liga;+tlig;+smcp
+IwonaHeavy-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaHeavy-Regular.otf]:+clig;+liga;+tlig;+ss02
+IwonaLight-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaLight-Italic.otf]:+clig;+liga;+tlig
+IwonaLight-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaLight-Italic.otf]:+clig;+liga;+tlig;+hist
+IwonaLight-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaLight-Italic.otf]:+clig;+liga;+tlig;+onum
+IwonaLight-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaLight-Italic.otf]:+clig;+liga;+tlig;+smcp
+IwonaLight-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaLight-Italic.otf]:+clig;+liga;+tlig;+ss02
+IwonaLight-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaLight-Regular.otf]:+clig;+liga;+tlig
+IwonaLight-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaLight-Regular.otf]:+clig;+liga;+tlig;+hist
+IwonaLight-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaLight-Regular.otf]:+clig;+liga;+tlig;+onum
+IwonaLight-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaLight-Regular.otf]:+clig;+liga;+tlig;+smcp
+IwonaLight-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaLight-Regular.otf]:+clig;+liga;+tlig;+ss02
+IwonaMedium-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaMedium-Italic.otf]:+clig;+liga;+tlig
+IwonaMedium-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaMedium-Italic.otf]:+clig;+liga;+tlig;+hist
+IwonaMedium-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaMedium-Italic.otf]:+clig;+liga;+tlig;+onum
+IwonaMedium-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaMedium-Italic.otf]:+clig;+liga;+tlig;+smcp
+IwonaMedium-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaMedium-Italic.otf]:+clig;+liga;+tlig;+ss02
+IwonaMedium-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaMedium-Regular.otf]:+clig;+liga;+tlig
+IwonaMedium-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaMedium-Regular.otf]:+clig;+liga;+tlig;+hist
+IwonaMedium-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaMedium-Regular.otf]:+clig;+liga;+tlig;+onum
+IwonaMedium-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaMedium-Regular.otf]:+clig;+liga;+tlig;+smcp
+IwonaMedium-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/iwona/IwonaMedium-Regular.otf]:+clig;+liga;+tlig;+ss02
+Jaini [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Jaini-Regular.ttf]:+clig;+liga;+tlig
+Jaini; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Jaini-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Jaini; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Jaini-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Jaini; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Jaini-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Jaini; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Jaini-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Jaini Purva [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/JainiPurva-Regular.ttf]:+clig;+liga;+tlig
+Jaini Purva; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/JainiPurva-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Jaini Purva; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/JainiPurva-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Jaini Purva; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/JainiPurva-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Jaini Purva; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/JainiPurva-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Jaini Purva; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/JainiPurva-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Black.otf]:+clig;+liga;+tlig
+Job Clarendon Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Black.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Black.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Black.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Black.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Black.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Black; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Black.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Black; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Black.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Black [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Black.ttf]:+clig;+liga;+tlig
+Job Clarendon Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Black.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Black.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Black.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Black.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Black.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Black; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Black.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Black; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Black.ttf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Bold.otf]:+clig;+liga;+tlig
+Job Clarendon Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Bold.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Bold.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Bold.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Bold.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Bold.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Bold.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Bold.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Bold.ttf]:+clig;+liga;+tlig
+Job Clarendon Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Bold.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Bold.ttf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Compressed Hairline [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCompressed-Hairline.otf]:+clig;+liga;+tlig
+Job Clarendon Compressed Hairline; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Compressed Hairline; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Compressed Hairline; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Compressed Hairline; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Compressed Hairline; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Compressed Hairline; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Compressed Hairline; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Condensed Hairline [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCondensed-Hairline.otf]:+clig;+liga;+tlig
+Job Clarendon Condensed Hairline; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCondensed-Hairline.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Condensed Hairline; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCondensed-Hairline.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Condensed Hairline; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCondensed-Hairline.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Condensed Hairline; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCondensed-Hairline.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Condensed Hairline; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCondensed-Hairline.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Condensed Hairline; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCondensed-Hairline.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Condensed Hairline; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonCondensed-Hairline.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Extra Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraBold.otf]:+clig;+liga;+tlig
+Job Clarendon Extra Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Extra Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Extra Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Extra Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Extra Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Extra Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraBold.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Extra Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraBold.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Extra Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraBold.ttf]:+clig;+liga;+tlig
+Job Clarendon Extra Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Extra Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Extra Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Extra Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraBold.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Extra Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraBold.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Extra Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraBold.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Extra Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraBold.ttf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Extra Compressed Hairline [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonExtraCompressed-Hairline.otf]:+clig;+liga;+tlig
+Job Clarendon Extra Compressed Hairline; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonExtraCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Extra Compressed Hairline; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonExtraCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Extra Compressed Hairline; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonExtraCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Extra Compressed Hairline; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonExtraCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Extra Compressed Hairline; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonExtraCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Extra Compressed Hairline; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonExtraCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Extra Compressed Hairline; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonComperessedHairlines/JobClarendonExtraCompressed-Hairline.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Extra Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraLight.otf]:+clig;+liga;+tlig
+Job Clarendon Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Extra Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Extra Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Extra Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraLight.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Extra Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-ExtraLight.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Extra Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraLight.ttf]:+clig;+liga;+tlig
+Job Clarendon Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Extra Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraLight.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Extra Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraLight.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Extra Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraLight.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Extra Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-ExtraLight.ttf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Hairline [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Hairline.otf]:+clig;+liga;+tlig
+Job Clarendon Hairline; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Hairline.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Hairline; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Hairline.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Hairline; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Hairline.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Hairline; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Hairline.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Hairline; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Hairline.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Hairline; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Hairline.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Hairline; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Hairline.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Hairline [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Hairline.ttf]:+clig;+liga;+tlig
+Job Clarendon Hairline; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Hairline.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Hairline; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Hairline.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Hairline; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Hairline.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Hairline; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Hairline.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Hairline; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Hairline.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Hairline; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Hairline.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Hairline; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Hairline.ttf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Light.otf]:+clig;+liga;+tlig
+Job Clarendon Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Light.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Light.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Light.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Light.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Light.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Light.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Light.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Light.ttf]:+clig;+liga;+tlig
+Job Clarendon Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Light.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Light.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Light.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Light.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Light.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Light.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Light.ttf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Medium.otf]:+clig;+liga;+tlig
+Job Clarendon Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Medium.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Medium.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Medium.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Medium.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Medium.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Medium.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Medium.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Medium [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Medium.ttf]:+clig;+liga;+tlig
+Job Clarendon Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Medium.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Medium.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Medium.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Medium.ttf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Regular.otf]:+clig;+liga;+tlig
+Job Clarendon Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Regular.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Regular.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Regular.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Regular.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Regular.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Regular.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Regular.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Regular.ttf]:+clig;+liga;+tlig
+Job Clarendon Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Semi Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-SemiBold.otf]:+clig;+liga;+tlig
+Job Clarendon Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Semi Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Semi Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-SemiBold.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Semi Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-SemiBold.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Semi Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-SemiBold.ttf]:+clig;+liga;+tlig
+Job Clarendon Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Semi Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-SemiBold.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-SemiBold.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Semi Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-SemiBold.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Semi Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-SemiBold.ttf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Text B Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Bold.otf]:+clig;+liga;+tlig
+Job Clarendon Text B Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Bold.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Text B Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Bold.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Text B Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Bold.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Text B Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Bold.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Text B Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Bold.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Text B Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Bold.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Text B Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-BoldItalic.otf]:+clig;+liga;+tlig
+Job Clarendon Text B Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Text B Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Text B Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Text B Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Text B Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Text B Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Text B Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Italic.otf]:+clig;+liga;+tlig
+Job Clarendon Text B Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Italic.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Text B Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Italic.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Text B Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Italic.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Text B Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Italic.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Text B Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Italic.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Text B Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Italic.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Text B Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Regular.otf]:+clig;+liga;+tlig
+Job Clarendon Text B Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Regular.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Text B Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Regular.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Text B Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Regular.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Text B Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Regular.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Text B Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Regular.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Text B Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonTextB-Regular.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Text Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Bold.otf]:+clig;+liga;+tlig
+Job Clarendon Text Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Bold.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Text Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Bold.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Text Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Bold.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Text Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Bold.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Text Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Bold.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Text Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Bold.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Text Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-BoldItalic.otf]:+clig;+liga;+tlig
+Job Clarendon Text Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Text Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Text Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Text Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Text Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Text Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Text Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Italic.otf]:+clig;+liga;+tlig
+Job Clarendon Text Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Italic.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Text Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Italic.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Text Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Italic.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Text Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Italic.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Text Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Italic.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Text Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Italic.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Text Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Regular.otf]:+clig;+liga;+tlig
+Job Clarendon Text Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Regular.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Text Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Regular.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Text Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Regular.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Text Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Regular.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Text Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Regular.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Text Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendonText/JobClarendonText-Regular.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Thin.otf]:+clig;+liga;+tlig
+Job Clarendon Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Thin.otf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Thin.otf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Thin.otf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Thin.otf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Thin.otf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Thin.otf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobClarendon/JobClarendon-Thin.otf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Thin [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Thin.ttf]:+clig;+liga;+tlig
+Job Clarendon Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Thin.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Thin.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Thin.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Thin.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Thin.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Thin.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendon-Thin.ttf]:+clig;+liga;+tlig;+ss07
+Job Clarendon Variable [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendonVariable-VF.ttf]:+clig;+liga;+tlig
+Job Clarendon Variable; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendonVariable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Job Clarendon Variable; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendonVariable-VF.ttf]:+clig;+liga;+tlig;+ss02
+Job Clarendon Variable; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendonVariable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Job Clarendon Variable; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendonVariable-VF.ttf]:+clig;+liga;+tlig;+ss04
+Job Clarendon Variable; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendonVariable-VF.ttf]:+clig;+liga;+tlig;+ss05
+Job Clarendon Variable; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendonVariable-VF.ttf]:+clig;+liga;+tlig;+ss06
+Job Clarendon Variable; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobClarendon/JobClarendonVariable-VF.ttf]:+clig;+liga;+tlig;+ss07
+Job French Clarendon Variable v1 Condensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobFrenchClarenonV1/JobFrenchClarendonVariableV1_wdth_.ttf]:+clig;+liga;+tlig
+Job French Clarendon Variable v1 Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobFrenchClarenonV1/JobFrenchClarendonVariableV1_wdth_.ttf]:+clig;+liga;+tlig;+ss01
+Job French Clarendon Variable v1 Condensed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobFrenchClarenonV1/JobFrenchClarendonVariableV1_wdth_.ttf]:+clig;+liga;+tlig;+ss02
+Job French Clarendon Variable v1 Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobFrenchClarenonV1/JobFrenchClarendonVariableV1_wdth_.ttf]:+clig;+liga;+tlig;+ss03
+Job French Clarendon Variable v1 Condensed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobFrenchClarenonV1/JobFrenchClarendonVariableV1_wdth_.ttf]:+clig;+liga;+tlig;+ss04
+Job French Clarendon Variable v1 Condensed Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobFrenchClarenonV1/JobFrenchClarendonVariableV1_wdth_.ttf]:+clig;+liga;+tlig;+ss05
+Job French Clarendon Variable v1 Condensed Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/JobFrenchClarenonV1/JobFrenchClarendonVariableV1_wdth_.ttf]:+clig;+liga;+tlig;+ss06
+Job French Clarendon v1 Compressed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CompressedBold.otf]:+clig;+liga;+tlig
+Job French Clarendon v1 Compressed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CompressedBold.otf]:+clig;+liga;+tlig;+ss01
+Job French Clarendon v1 Compressed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CompressedBold.otf]:+clig;+liga;+tlig;+ss02
+Job French Clarendon v1 Compressed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CompressedBold.otf]:+clig;+liga;+tlig;+ss03
+Job French Clarendon v1 Compressed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CompressedBold.otf]:+clig;+liga;+tlig;+ss04
+Job French Clarendon v1 Compressed Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CompressedBold.otf]:+clig;+liga;+tlig;+ss05
+Job French Clarendon v1 Compressed Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CompressedBold.otf]:+clig;+liga;+tlig;+ss06
+Job French Clarendon v1 Condensed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CondensedBold.otf]:+clig;+liga;+tlig
+Job French Clarendon v1 Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CondensedBold.otf]:+clig;+liga;+tlig;+ss01
+Job French Clarendon v1 Condensed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CondensedBold.otf]:+clig;+liga;+tlig;+ss02
+Job French Clarendon v1 Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CondensedBold.otf]:+clig;+liga;+tlig;+ss03
+Job French Clarendon v1 Condensed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CondensedBold.otf]:+clig;+liga;+tlig;+ss04
+Job French Clarendon v1 Condensed Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CondensedBold.otf]:+clig;+liga;+tlig;+ss05
+Job French Clarendon v1 Condensed Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-CondensedBold.otf]:+clig;+liga;+tlig;+ss06
+Job French Clarendon v1 Extra Condensed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-ExtraCondensedBold.otf]:+clig;+liga;+tlig
+Job French Clarendon v1 Extra Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-ExtraCondensedBold.otf]:+clig;+liga;+tlig;+ss01
+Job French Clarendon v1 Extra Condensed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-ExtraCondensedBold.otf]:+clig;+liga;+tlig;+ss02
+Job French Clarendon v1 Extra Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-ExtraCondensedBold.otf]:+clig;+liga;+tlig;+ss03
+Job French Clarendon v1 Extra Condensed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-ExtraCondensedBold.otf]:+clig;+liga;+tlig;+ss04
+Job French Clarendon v1 Extra Condensed Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-ExtraCondensedBold.otf]:+clig;+liga;+tlig;+ss05
+Job French Clarendon v1 Extra Condensed Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-ExtraCondensedBold.otf]:+clig;+liga;+tlig;+ss06
+Job French Clarendon v1 Skyline Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-SkylineBold.otf]:+clig;+liga;+tlig
+Job French Clarendon v1 Skyline Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-SkylineBold.otf]:+clig;+liga;+tlig;+ss01
+Job French Clarendon v1 Skyline Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-SkylineBold.otf]:+clig;+liga;+tlig;+ss02
+Job French Clarendon v1 Skyline Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-SkylineBold.otf]:+clig;+liga;+tlig;+ss03
+Job French Clarendon v1 Skyline Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-SkylineBold.otf]:+clig;+liga;+tlig;+ss04
+Job French Clarendon v1 Skyline Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-SkylineBold.otf]:+clig;+liga;+tlig;+ss05
+Job French Clarendon v1 Skyline Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/JobFrenchClarenonV1/JobFrenchClarendonV1-SkylineBold.otf]:+clig;+liga;+tlig;+ss06
+Josef Normal [/usr/local/texlive/texmf-local/fonts/truetype/Ingo/JosefNormal/TrueType/JOSEN___.ttf]:+clig;+liga;+tlig
+Josefin Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-Bold.ttf]:+clig;+liga;+tlig
+Josefin Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-BoldItalic.ttf]:+clig;+liga;+tlig
+Josefin Sans ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-ExtraLight.ttf]:+clig;+liga;+tlig
+Josefin Sans ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Josefin Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-Italic.ttf]:+clig;+liga;+tlig
+Josefin Sans Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-Light.ttf]:+clig;+liga;+tlig
+Josefin Sans Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-LightItalic.ttf]:+clig;+liga;+tlig
+Josefin Sans Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-Medium.ttf]:+clig;+liga;+tlig
+Josefin Sans Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-MediumItalic.ttf]:+clig;+liga;+tlig
+Josefin Sans Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-Regular.ttf]:+clig;+liga;+tlig
+Josefin Sans SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-SemiBold.ttf]:+clig;+liga;+tlig
+Josefin Sans SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Josefin Sans Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-Thin.ttf]:+clig;+liga;+tlig
+Josefin Sans Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/josefin/JosefinSans-ThinItalic.ttf]:+clig;+liga;+tlig
+Junicode Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig
+Junicode Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+onum
+Junicode Bold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+pcap
+Junicode Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+smcp
+Junicode Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss01
+Junicode Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss03
+Junicode Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss04
+Junicode Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss05
+Junicode Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss06
+Junicode Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss07
+Junicode Bold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss08
+Junicode Bold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss09
+Junicode Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss10
+Junicode Bold; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss15
+Junicode Bold; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss16
+Junicode Bold; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss17
+Junicode Bold; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss18
+Junicode Bold; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss19
+Junicode Bold; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Bold.otf]:+clig;+liga;+tlig;+ss20
+Junicode Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig
+Junicode Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode Bold Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Bold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Bold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Bold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Bold Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Bold Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Bold Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Bold Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Bold Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Bold Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Cond [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig
+Junicode Cond; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+onum
+Junicode Cond; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+pcap
+Junicode Cond; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+smcp
+Junicode Cond; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss01
+Junicode Cond; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss03
+Junicode Cond; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss04
+Junicode Cond; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss05
+Junicode Cond; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss06
+Junicode Cond; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss07
+Junicode Cond; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss08
+Junicode Cond; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss09
+Junicode Cond; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss10
+Junicode Cond; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss15
+Junicode Cond; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss16
+Junicode Cond; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss17
+Junicode Cond; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss18
+Junicode Cond; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss19
+Junicode Cond; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Cond.otf]:+clig;+liga;+tlig;+ss20
+Junicode Cond Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig
+Junicode Cond Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode Cond Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Cond Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Cond Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Cond Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Cond Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Cond Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Cond Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Cond Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Cond Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Cond Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Cond Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Cond Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Cond Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Cond Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Cond Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Cond Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Cond Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Cond Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig
+Junicode Cond Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+onum
+Junicode Cond Light; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+pcap
+Junicode Cond Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+smcp
+Junicode Cond Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss01
+Junicode Cond Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss03
+Junicode Cond Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss04
+Junicode Cond Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss05
+Junicode Cond Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss06
+Junicode Cond Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss07
+Junicode Cond Light; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss08
+Junicode Cond Light; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss09
+Junicode Cond Light; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss10
+Junicode Cond Light; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss15
+Junicode Cond Light; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss16
+Junicode Cond Light; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss17
+Junicode Cond Light; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss18
+Junicode Cond Light; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss19
+Junicode Cond Light; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLight.otf]:+clig;+liga;+tlig;+ss20
+Junicode Cond Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig
+Junicode Cond Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode Cond Light Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Cond Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Cond Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Cond Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Cond Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Cond Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Cond Light Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Cond Light Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Cond Light Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Cond Light Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Cond Light Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Cond Light Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Cond Light Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Cond Light Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Cond Light Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Cond Light Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Cond Light Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondLightItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Cond Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig
+Junicode Cond Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+onum
+Junicode Cond Medium; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+pcap
+Junicode Cond Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+smcp
+Junicode Cond Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss01
+Junicode Cond Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss03
+Junicode Cond Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss04
+Junicode Cond Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss05
+Junicode Cond Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss06
+Junicode Cond Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss07
+Junicode Cond Medium; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss08
+Junicode Cond Medium; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss09
+Junicode Cond Medium; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss10
+Junicode Cond Medium; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss15
+Junicode Cond Medium; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss16
+Junicode Cond Medium; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss17
+Junicode Cond Medium; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss18
+Junicode Cond Medium; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss19
+Junicode Cond Medium; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMedium.otf]:+clig;+liga;+tlig;+ss20
+Junicode Cond Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig
+Junicode Cond Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode Cond Medium Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Cond Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Cond Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Cond Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Cond Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Cond Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Cond Medium Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Cond Medium Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Cond Medium Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Cond Medium Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Cond Medium Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Cond Medium Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Cond Medium Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Cond Medium Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Cond Medium Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Cond Medium Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Cond Medium Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-CondMediumItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Exp [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig
+Junicode Exp; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+onum
+Junicode Exp; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+pcap
+Junicode Exp; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+smcp
+Junicode Exp; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss01
+Junicode Exp; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss03
+Junicode Exp; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss04
+Junicode Exp; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss05
+Junicode Exp; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss06
+Junicode Exp; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss07
+Junicode Exp; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss08
+Junicode Exp; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss09
+Junicode Exp; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss10
+Junicode Exp; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss15
+Junicode Exp; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss16
+Junicode Exp; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss17
+Junicode Exp; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss18
+Junicode Exp; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss19
+Junicode Exp; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Exp.otf]:+clig;+liga;+tlig;+ss20
+Junicode Exp Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig
+Junicode Exp Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+onum
+Junicode Exp Bold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+pcap
+Junicode Exp Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+smcp
+Junicode Exp Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss01
+Junicode Exp Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss03
+Junicode Exp Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss04
+Junicode Exp Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss05
+Junicode Exp Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss06
+Junicode Exp Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss07
+Junicode Exp Bold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss08
+Junicode Exp Bold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss09
+Junicode Exp Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss10
+Junicode Exp Bold; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss15
+Junicode Exp Bold; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss16
+Junicode Exp Bold; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss17
+Junicode Exp Bold; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss18
+Junicode Exp Bold; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss19
+Junicode Exp Bold; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBold.otf]:+clig;+liga;+tlig;+ss20
+Junicode Exp Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig
+Junicode Exp Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode Exp Bold Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Exp Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Exp Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Exp Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Exp Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Exp Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Exp Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Exp Bold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Exp Bold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Exp Bold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Exp Bold Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Exp Bold Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Exp Bold Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Exp Bold Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Exp Bold Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Exp Bold Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Exp Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Exp Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig
+Junicode Exp Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode Exp Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Exp Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Exp Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Exp Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Exp Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Exp Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Exp Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Exp Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Exp Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Exp Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Exp Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Exp Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Exp Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Exp Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Exp Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Exp Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Exp Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Exp Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig
+Junicode Exp Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+onum
+Junicode Exp Medium; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+pcap
+Junicode Exp Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+smcp
+Junicode Exp Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss01
+Junicode Exp Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss03
+Junicode Exp Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss04
+Junicode Exp Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss05
+Junicode Exp Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss06
+Junicode Exp Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss07
+Junicode Exp Medium; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss08
+Junicode Exp Medium; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss09
+Junicode Exp Medium; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss10
+Junicode Exp Medium; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss15
+Junicode Exp Medium; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss16
+Junicode Exp Medium; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss17
+Junicode Exp Medium; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss18
+Junicode Exp Medium; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss19
+Junicode Exp Medium; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMedium.otf]:+clig;+liga;+tlig;+ss20
+Junicode Exp Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig
+Junicode Exp Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode Exp Medium Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Exp Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Exp Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Exp Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Exp Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Exp Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Exp Medium Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Exp Medium Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Exp Medium Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Exp Medium Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Exp Medium Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Exp Medium Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Exp Medium Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Exp Medium Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Exp Medium Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Exp Medium Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Exp Medium Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpMediumItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Exp SmBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig
+Junicode Exp SmBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+onum
+Junicode Exp SmBold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+pcap
+Junicode Exp SmBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+smcp
+Junicode Exp SmBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss01
+Junicode Exp SmBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss03
+Junicode Exp SmBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss04
+Junicode Exp SmBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss05
+Junicode Exp SmBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss06
+Junicode Exp SmBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss07
+Junicode Exp SmBold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss08
+Junicode Exp SmBold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss09
+Junicode Exp SmBold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss10
+Junicode Exp SmBold; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss15
+Junicode Exp SmBold; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss16
+Junicode Exp SmBold; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss17
+Junicode Exp SmBold; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss18
+Junicode Exp SmBold; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss19
+Junicode Exp SmBold; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBold.otf]:+clig;+liga;+tlig;+ss20
+Junicode Exp SmBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig
+Junicode Exp SmBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode Exp SmBold Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Exp SmBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Exp SmBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Exp SmBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Exp SmBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Exp SmBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Exp SmBold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Exp SmBold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Exp SmBold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Exp SmBold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Exp SmBold Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Exp SmBold Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Exp SmBold Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Exp SmBold Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Exp SmBold Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Exp SmBold Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Exp SmBold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-ExpSmBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig
+Junicode Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+onum
+Junicode Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Italic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig
+Junicode Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+onum
+Junicode Light; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+pcap
+Junicode Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+smcp
+Junicode Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss01
+Junicode Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss03
+Junicode Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss04
+Junicode Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss05
+Junicode Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss06
+Junicode Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss07
+Junicode Light; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss08
+Junicode Light; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss09
+Junicode Light; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss10
+Junicode Light; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss15
+Junicode Light; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss16
+Junicode Light; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss17
+Junicode Light; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss18
+Junicode Light; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss19
+Junicode Light; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Light.otf]:+clig;+liga;+tlig;+ss20
+Junicode Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig
+Junicode Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode Light Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Light Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Light Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Light Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Light Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Light Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Light Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Light Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Light Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Light Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Light Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Light Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-LightItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig
+Junicode Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+onum
+Junicode Medium; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+pcap
+Junicode Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+smcp
+Junicode Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss01
+Junicode Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss03
+Junicode Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss04
+Junicode Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss05
+Junicode Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss06
+Junicode Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss07
+Junicode Medium; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss08
+Junicode Medium; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss09
+Junicode Medium; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss10
+Junicode Medium; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss15
+Junicode Medium; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss16
+Junicode Medium; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss17
+Junicode Medium; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss18
+Junicode Medium; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss19
+Junicode Medium; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Medium.otf]:+clig;+liga;+tlig;+ss20
+Junicode Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig
+Junicode Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode Medium Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode Medium Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode Medium Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode Medium Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode Medium Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode Medium Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode Medium Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode Medium Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode Medium Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode Medium Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode Medium Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode Medium Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-MediumItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig
+Junicode Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+onum
+Junicode Regular; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+pcap
+Junicode Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+smcp
+Junicode Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss01
+Junicode Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss03
+Junicode Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss04
+Junicode Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss05
+Junicode Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss06
+Junicode Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss07
+Junicode Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss08
+Junicode Regular; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss09
+Junicode Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss10
+Junicode Regular; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss15
+Junicode Regular; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss16
+Junicode Regular; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss17
+Junicode Regular; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss18
+Junicode Regular; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss19
+Junicode Regular; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-Regular.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig
+Junicode SmBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+onum
+Junicode SmBold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss06
+Junicode SmBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmBold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmBold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmBold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmBold; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmBold; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmBold; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmBold; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmBold; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmBold; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBold.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig
+Junicode SmBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode SmBold Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmBold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmBold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmBold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmBold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmBold Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmBold Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmBold Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmBold Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmBold Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmBold Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmBold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode SmCond [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig
+Junicode SmCond; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+onum
+Junicode SmCond; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmCond; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmCond; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmCond; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmCond; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmCond; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmCond; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss06
+Junicode SmCond; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmCond; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmCond; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmCond; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmCond; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmCond; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmCond; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmCond; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmCond; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmCond; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCond.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmCond Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig
+Junicode SmCond Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode SmCond Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmCond Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmCond Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmCond Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmCond Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmCond Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmCond Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmCond Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmCond Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmCond Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmCond Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmCond Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmCond Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmCond Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmCond Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmCond Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmCond Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode SmCond Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig
+Junicode SmCond Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+onum
+Junicode SmCond Light; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmCond Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmCond Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmCond Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmCond Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmCond Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmCond Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss06
+Junicode SmCond Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmCond Light; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmCond Light; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmCond Light; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmCond Light; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmCond Light; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmCond Light; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmCond Light; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmCond Light; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmCond Light; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLight.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmCond Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig
+Junicode SmCond Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode SmCond Light Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmCond Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmCond Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmCond Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmCond Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmCond Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmCond Light Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmCond Light Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmCond Light Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmCond Light Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmCond Light Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmCond Light Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmCond Light Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmCond Light Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmCond Light Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmCond Light Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmCond Light Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondLightItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode SmCond Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig
+Junicode SmCond Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+onum
+Junicode SmCond Medium; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmCond Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmCond Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmCond Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmCond Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmCond Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmCond Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss06
+Junicode SmCond Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmCond Medium; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmCond Medium; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmCond Medium; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmCond Medium; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmCond Medium; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmCond Medium; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmCond Medium; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmCond Medium; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmCond Medium; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMedium.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmCond Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig
+Junicode SmCond Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode SmCond Medium Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmCond Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmCond Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmCond Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmCond Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmCond Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmCond Medium Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmCond Medium Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmCond Medium Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmCond Medium Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmCond Medium Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmCond Medium Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmCond Medium Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmCond Medium Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmCond Medium Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmCond Medium Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmCond Medium Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmCondMediumItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode SmExp [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig
+Junicode SmExp; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+onum
+Junicode SmExp; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmExp; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmExp; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmExp; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmExp; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmExp; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmExp; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss06
+Junicode SmExp; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmExp; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmExp; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmExp; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmExp; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmExp; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmExp; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmExp; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmExp; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmExp; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExp.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmExp Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig
+Junicode SmExp Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+onum
+Junicode SmExp Bold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmExp Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmExp Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmExp Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmExp Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmExp Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmExp Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss06
+Junicode SmExp Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmExp Bold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmExp Bold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmExp Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmExp Bold; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmExp Bold; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmExp Bold; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmExp Bold; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmExp Bold; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmExp Bold; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBold.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmExp Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig
+Junicode SmExp Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode SmExp Bold Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmExp Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmExp Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmExp Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmExp Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmExp Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmExp Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmExp Bold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmExp Bold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmExp Bold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmExp Bold Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmExp Bold Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmExp Bold Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmExp Bold Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmExp Bold Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmExp Bold Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmExp Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode SmExp Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig
+Junicode SmExp Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode SmExp Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmExp Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmExp Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmExp Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmExp Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmExp Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmExp Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmExp Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmExp Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmExp Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmExp Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmExp Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmExp Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmExp Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmExp Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmExp Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmExp Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode SmExp Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig
+Junicode SmExp Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+onum
+Junicode SmExp Medium; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmExp Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmExp Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmExp Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmExp Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmExp Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmExp Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss06
+Junicode SmExp Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmExp Medium; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmExp Medium; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmExp Medium; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmExp Medium; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmExp Medium; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmExp Medium; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmExp Medium; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmExp Medium; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmExp Medium; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMedium.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmExp Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig
+Junicode SmExp Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode SmExp Medium Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmExp Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmExp Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmExp Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmExp Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmExp Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmExp Medium Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmExp Medium Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmExp Medium Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmExp Medium Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmExp Medium Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmExp Medium Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmExp Medium Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmExp Medium Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmExp Medium Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmExp Medium Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmExp Medium Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpMediumItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode SmExp SmBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig
+Junicode SmExp SmBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+onum
+Junicode SmExp SmBold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmExp SmBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmExp SmBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmExp SmBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmExp SmBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmExp SmBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmExp SmBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss06
+Junicode SmExp SmBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmExp SmBold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmExp SmBold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmExp SmBold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmExp SmBold; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmExp SmBold; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmExp SmBold; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmExp SmBold; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmExp SmBold; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmExp SmBold; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBold.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmExp SmBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig
+Junicode SmExp SmBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Junicode SmExp SmBold Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+pcap
+Junicode SmExp SmBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Junicode SmExp SmBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Junicode SmExp SmBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Junicode SmExp SmBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Junicode SmExp SmBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Junicode SmExp SmBold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Junicode SmExp SmBold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Junicode SmExp SmBold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Junicode SmExp SmBold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Junicode SmExp SmBold Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss15
+Junicode SmExp SmBold Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss16
+Junicode SmExp SmBold Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss17
+Junicode SmExp SmBold Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss18
+Junicode SmExp SmBold Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss19
+Junicode SmExp SmBold Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+ss20
+Junicode SmExp SmBold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/junicode/Junicode-SmExpSmBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Junicode VF Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig
+Junicode VF Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+onum
+Junicode VF Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+pcap
+Junicode VF Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Junicode VF Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Junicode VF Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Junicode VF Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Junicode VF Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss05
+Junicode VF Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss07
+Junicode VF Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss08
+Junicode VF Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss09
+Junicode VF Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss10
+Junicode VF Italic; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss15
+Junicode VF Italic; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss16
+Junicode VF Italic; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss17
+Junicode VF Italic; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss18
+Junicode VF Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss19
+Junicode VF Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+ss20
+Junicode VF Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Italic.ttf]:+clig;+liga;+tlig;+swsh
+Junicode VF Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig
+Junicode VF Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+onum
+Junicode VF Regular; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+pcap
+Junicode VF Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+smcp
+Junicode VF Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss01
+Junicode VF Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss03
+Junicode VF Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss04
+Junicode VF Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss05
+Junicode VF Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss06
+Junicode VF Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss07
+Junicode VF Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss08
+Junicode VF Regular; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss09
+Junicode VF Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss10
+Junicode VF Regular; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss15
+Junicode VF Regular; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss16
+Junicode VF Regular; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss17
+Junicode VF Regular; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss18
+Junicode VF Regular; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss19
+Junicode VF Regular; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/junicodevf/JunicodeVF-Roman.ttf]:+clig;+liga;+tlig;+ss20
+Kalpurush [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/bangla/fontkalpurush.ttf]:+clig;+liga;+tlig
+Kerkis [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/Kerkis.otf]:+clig;+liga;+tlig
+Kerkis Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/Kerkis-Bold.otf]:+clig;+liga;+tlig
+Kerkis Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/Kerkis-BoldItalic.otf]:+clig;+liga;+tlig
+Kerkis Bold SmallCaps [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/Kerkis-BoldSmallCaps.otf]:+clig;+liga;+tlig
+Kerkis Calligraphic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/Kerkis-Calligraphic.otf]:+clig;+liga;+tlig
+Kerkis Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/Kerkis-Italic.otf]:+clig;+liga;+tlig
+Kerkis Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/KerkisSans-Bold.otf]:+clig;+liga;+tlig
+Kerkis Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/KerkisSans-BoldItalic.otf]:+clig;+liga;+tlig
+Kerkis Semi Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/Kerkis-SemiBold.otf]:+clig;+liga;+tlig
+Kerkis Semi Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/Kerkis-SemiBold-Italic.otf]:+clig;+liga;+tlig
+Kerkis Small Caps [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/Kerkis-SmallCaps.otf]:+clig;+liga;+tlig
+KerkisSans [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/KerkisSans.otf]:+clig;+liga;+tlig
+KerkisSans Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/KerkisSans-Italic.otf]:+clig;+liga;+tlig
+KerkisSans-SmallCaps [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kerkis/KerkisSans-SmallCaps.otf]:+clig;+liga;+tlig
+Keter YG Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/KeterYG-Bold.ttf]:+clig;+liga;+tlig
+Keter YG Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/KeterYG-BoldOblique.ttf]:+clig;+liga;+tlig
+Keter YG Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/KeterYG-Medium.ttf]:+clig;+liga;+tlig
+Keter YG Medium Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/KeterYG-MediumOblique.ttf]:+clig;+liga;+tlig
+Kinnari [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Kinnari.otf]:+clig;+liga;+tlig
+Kinnari Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Kinnari-Bold.otf]:+clig;+liga;+tlig
+Kinnari Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Kinnari-BoldItalic.otf]:+clig;+liga;+tlig
+Kinnari Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Kinnari-BoldOblique.otf]:+clig;+liga;+tlig
+Kinnari Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Kinnari-Italic.otf]:+clig;+liga;+tlig
+Kinnari Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Kinnari-Oblique.otf]:+clig;+liga;+tlig
+Klavika Light [/usr/local/texlive/texmf-local/fonts/opentype/ProcessTypeFoundry/Klavika/Klavika-Light.otf]:+clig;+liga;+tlig
+Klavika Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/ProcessTypeFoundry/Klavika/Klavika-Light.otf]:+clig;+liga;+tlig;+onum
+Klavika Light; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/ProcessTypeFoundry/Klavika/Klavika-Light.otf]:+clig;+liga;+tlig;+smcp
+Klavika Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/ProcessTypeFoundry/Klavika/Klavika-Light.otf]:+clig;+liga;+tlig;+ss01
+Klex [/usr/local/texlive/texmf-local/fonts/truetype/Ingo/Klex/TrueType/KLEX____.ttf]:+clig;+liga;+tlig
+Klooster Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Klooster/Klooster-Thin.otf]:+clig;+liga;+tlig
+Klooster Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Klooster/Klooster-Thin.otf]:+clig;+liga;+tlig;+ss01
+Klooster Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Klooster/Klooster-Thin.otf]:+clig;+liga;+tlig;+ss02
+Klooster Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Klooster/Klooster-Thin.otf]:+clig;+liga;+tlig;+ss03
+Klooster Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Klooster/Klooster-Thin.otf]:+clig;+liga;+tlig;+ss04
+Klooster Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Klooster/Klooster-Thin.otf]:+clig;+liga;+tlig;+ss05
+Klooster Thin [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Klooster/Klooster-Thin.ttf]:+clig;+liga;+tlig
+Klooster Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Klooster/Klooster-Thin.ttf]:+clig;+liga;+tlig;+ss01
+Klooster Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Klooster/Klooster-Thin.ttf]:+clig;+liga;+tlig;+ss02
+Klooster Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Klooster/Klooster-Thin.ttf]:+clig;+liga;+tlig;+ss03
+Klooster Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Klooster/Klooster-Thin.ttf]:+clig;+liga;+tlig;+ss04
+Klooster Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Klooster/Klooster-Thin.ttf]:+clig;+liga;+tlig;+ss05
+Klooster v2 Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/KloosterThinV2/Kloosterv2-Thin.otf]:+clig;+liga;+tlig
+Klooster v2 Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/KloosterThinV2/Kloosterv2-Thin.otf]:+clig;+liga;+tlig;+ss01
+Klooster v2 Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/KloosterThinV2/Kloosterv2-Thin.otf]:+clig;+liga;+tlig;+ss02
+Klooster v2 Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/KloosterThinV2/Kloosterv2-Thin.otf]:+clig;+liga;+tlig;+ss03
+Klooster v2 Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/KloosterThinV2/Kloosterv2-Thin.otf]:+clig;+liga;+tlig;+ss04
+Klooster v2 Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/KloosterThinV2/Kloosterv2-Thin.otf]:+clig;+liga;+tlig;+ss05
+Klooster v2 Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/KloosterThinV2/Kloosterv2-Thin.otf]:+clig;+liga;+tlig;+ss06
+Klooster v2 Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/KloosterThinV2/Kloosterv2-Thin.otf]:+clig;+liga;+tlig;+ss07
+Klooster v2 Thin [/usr/local/texlive/texmf-local/fonts/truetype/DJR/KloosterThinV2/Kloosterv2-Thin.ttf]:+clig;+liga;+tlig
+Klooster v2 Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/KloosterThinV2/Kloosterv2-Thin.ttf]:+clig;+liga;+tlig;+ss01
+Klooster v2 Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/KloosterThinV2/Kloosterv2-Thin.ttf]:+clig;+liga;+tlig;+ss02
+Klooster v2 Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/KloosterThinV2/Kloosterv2-Thin.ttf]:+clig;+liga;+tlig;+ss03
+Klooster v2 Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/KloosterThinV2/Kloosterv2-Thin.ttf]:+clig;+liga;+tlig;+ss04
+Klooster v2 Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/KloosterThinV2/Kloosterv2-Thin.ttf]:+clig;+liga;+tlig;+ss05
+Klooster v2 Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/KloosterThinV2/Kloosterv2-Thin.ttf]:+clig;+liga;+tlig;+ss06
+Klooster v2 Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/KloosterThinV2/Kloosterv2-Thin.ttf]:+clig;+liga;+tlig;+ss07
+KobzarKS [/usr/local/texlive/texmf-local/fonts/opentype/DR/KobzarKS/KobzarKS_v1-012.otf]:+clig;+liga;+tlig
+KobzarKS; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KobzarKS/KobzarKS_v1-012.otf]:+clig;+liga;+tlig;+ss01
+KobzarKS; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KobzarKS/KobzarKS_v1-012.otf]:+clig;+liga;+tlig;+ss02
+KobzarKS; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KobzarKS/KobzarKS_v1-012.otf]:+clig;+liga;+tlig;+ss03
+KobzarKS; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KobzarKS/KobzarKS_v1-012.otf]:+clig;+liga;+tlig;+ss04
+Kohinoor Bangla [/System/Library/Fonts/KohinoorBangla.ttc](0):+clig;+liga;+tlig
+Kohinoor Bangla Bold [/System/Library/Fonts/KohinoorBangla.ttc](3):+clig;+liga;+tlig
+Kohinoor Bangla Light [/System/Library/Fonts/KohinoorBangla.ttc](4):+clig;+liga;+tlig
+Kohinoor Bangla Medium [/System/Library/Fonts/KohinoorBangla.ttc](2):+clig;+liga;+tlig
+Kohinoor Bangla Semibold [/System/Library/Fonts/KohinoorBangla.ttc](1):+clig;+liga;+tlig
+Kohinoor Devanagari Bold [/System/Library/Fonts/Kohinoor.ttc](3):+clig;+liga;+tlig
+Kohinoor Devanagari Light [/System/Library/Fonts/Kohinoor.ttc](4):+clig;+liga;+tlig
+Kohinoor Devanagari Medium [/System/Library/Fonts/Kohinoor.ttc](1):+clig;+liga;+tlig
+Kohinoor Devanagari Regular [/System/Library/Fonts/Kohinoor.ttc](0):+clig;+liga;+tlig
+Kohinoor Devanagari Semibold [/System/Library/Fonts/Kohinoor.ttc](2):+clig;+liga;+tlig
+Kohinoor Gujarati Bold [/System/Library/Fonts/KohinoorGujarati.ttc](0):+clig;+liga;+tlig
+Kohinoor Gujarati Light [/System/Library/Fonts/KohinoorGujarati.ttc](1):+clig;+liga;+tlig
+Kohinoor Gujarati Medium [/System/Library/Fonts/KohinoorGujarati.ttc](2):+clig;+liga;+tlig
+Kohinoor Gujarati Regular [/System/Library/Fonts/KohinoorGujarati.ttc](3):+clig;+liga;+tlig
+Kohinoor Gujarati Semibold [/System/Library/Fonts/KohinoorGujarati.ttc](4):+clig;+liga;+tlig
+Kohinoor Telugu [/System/Library/Fonts/KohinoorTelugu.ttc](0):+clig;+liga;+tlig
+Kohinoor Telugu Bold [/System/Library/Fonts/KohinoorTelugu.ttc](3):+clig;+liga;+tlig
+Kohinoor Telugu Light [/System/Library/Fonts/KohinoorTelugu.ttc](4):+clig;+liga;+tlig
+Kohinoor Telugu Medium [/System/Library/Fonts/KohinoorTelugu.ttc](2):+clig;+liga;+tlig
+Kohinoor Telugu Semibold [/System/Library/Fonts/KohinoorTelugu.ttc](1):+clig;+liga;+tlig
+Kotyhoroshko Bold [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Kotyhoroshko/Kotyhoroshko-Bold.0.2.otf]:+clig;+liga;+tlig
+Kotyhoroshko Regular [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Kotyhoroshko/Kotyhoroshko-Regular.0.2.otf]:+clig;+liga;+tlig
+Koziyar Regular [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Koziyar/Koziyar-Regular.0.1.otf]:+clig;+liga;+tlig
+KpMath Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMath-Bold.otf]:+clig;+liga;+tlig
+KpMath Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMath-Light.otf]:+clig;+liga;+tlig
+KpMath Light; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMath-Light.otf]:+clig;+liga;+tlig;+ssty
+KpMath Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMath-Regular.otf]:+clig;+liga;+tlig
+KpMath Regular; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMath-Regular.otf]:+clig;+liga;+tlig;+ssty
+KpMath Sans [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMath-Sans.otf]:+clig;+liga;+tlig
+KpMath SansBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMath-SansBold.otf]:+clig;+liga;+tlig
+KpMath Semibold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMath-Semibold.otf]:+clig;+liga;+tlig
+KpMono Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Bold.otf]:+clig;+liga;+tlig
+KpMono Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Bold.otf]:+clig;+liga;+tlig;+hist
+KpMono Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Bold.otf]:+clig;+liga;+tlig;+onum
+KpMono Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Bold.otf]:+clig;+liga;+tlig;+ss03
+KpMono Bold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Bold.otf]:+clig;+liga;+tlig;+ss12
+KpMono Bold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Bold.otf]:+clig;+liga;+tlig;+swsh
+KpMono BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-BoldItalic.otf]:+clig;+liga;+tlig
+KpMono BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+KpMono BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+KpMono BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+KpMono BoldItalic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-BoldItalic.otf]:+clig;+liga;+tlig;+ss12
+KpMono BoldItalic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+KpMono Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Italic.otf]:+clig;+liga;+tlig
+KpMono Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Italic.otf]:+clig;+liga;+tlig;+hist
+KpMono Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Italic.otf]:+clig;+liga;+tlig;+onum
+KpMono Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Italic.otf]:+clig;+liga;+tlig;+ss03
+KpMono Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Italic.otf]:+clig;+liga;+tlig;+ss12
+KpMono Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Italic.otf]:+clig;+liga;+tlig;+swsh
+KpMono Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Regular.otf]:+clig;+liga;+tlig
+KpMono Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Regular.otf]:+clig;+liga;+tlig;+hist
+KpMono Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Regular.otf]:+clig;+liga;+tlig;+onum
+KpMono Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Regular.otf]:+clig;+liga;+tlig;+ss03
+KpMono Regular; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Regular.otf]:+clig;+liga;+tlig;+ss12
+KpMono Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpMono-Regular.otf]:+clig;+liga;+tlig;+swsh
+KpRoman Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Bold.otf]:+clig;+liga;+tlig
+KpRoman Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Bold.otf]:+clig;+liga;+tlig;+hist
+KpRoman Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Bold.otf]:+clig;+liga;+tlig;+onum
+KpRoman Bold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Bold.otf]:+clig;+liga;+tlig;+pcap
+KpRoman Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Bold.otf]:+clig;+liga;+tlig;+smcp
+KpRoman Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Bold.otf]:+clig;+liga;+tlig;+ss01
+KpRoman Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Bold.otf]:+clig;+liga;+tlig;+ss02
+KpRoman Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Bold.otf]:+clig;+liga;+tlig;+ss03
+KpRoman Bold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Bold.otf]:+clig;+liga;+tlig;+ss12
+KpRoman Bold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Bold.otf]:+clig;+liga;+tlig;+swsh
+KpRoman BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-BoldItalic.otf]:+clig;+liga;+tlig
+KpRoman BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+KpRoman BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+KpRoman BoldItalic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-BoldItalic.otf]:+clig;+liga;+tlig;+pcap
+KpRoman BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+KpRoman BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+KpRoman BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+KpRoman BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+KpRoman BoldItalic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-BoldItalic.otf]:+clig;+liga;+tlig;+ss12
+KpRoman BoldItalic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+KpRoman Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Italic.otf]:+clig;+liga;+tlig
+KpRoman Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Italic.otf]:+clig;+liga;+tlig;+hist
+KpRoman Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Italic.otf]:+clig;+liga;+tlig;+onum
+KpRoman Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Italic.otf]:+clig;+liga;+tlig;+pcap
+KpRoman Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Italic.otf]:+clig;+liga;+tlig;+smcp
+KpRoman Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Italic.otf]:+clig;+liga;+tlig;+ss01
+KpRoman Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Italic.otf]:+clig;+liga;+tlig;+ss02
+KpRoman Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Italic.otf]:+clig;+liga;+tlig;+ss03
+KpRoman Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Italic.otf]:+clig;+liga;+tlig;+ss12
+KpRoman Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Italic.otf]:+clig;+liga;+tlig;+swsh
+KpRoman Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Regular.otf]:+clig;+liga;+tlig
+KpRoman Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Regular.otf]:+clig;+liga;+tlig;+hist
+KpRoman Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Regular.otf]:+clig;+liga;+tlig;+onum
+KpRoman Regular; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Regular.otf]:+clig;+liga;+tlig;+pcap
+KpRoman Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Regular.otf]:+clig;+liga;+tlig;+smcp
+KpRoman Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Regular.otf]:+clig;+liga;+tlig;+ss01
+KpRoman Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Regular.otf]:+clig;+liga;+tlig;+ss02
+KpRoman Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Regular.otf]:+clig;+liga;+tlig;+ss03
+KpRoman Regular; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Regular.otf]:+clig;+liga;+tlig;+ss12
+KpRoman Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Regular.otf]:+clig;+liga;+tlig;+swsh
+KpRoman Semibold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Semibold.otf]:+clig;+liga;+tlig
+KpRoman Semibold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Semibold.otf]:+clig;+liga;+tlig;+hist
+KpRoman Semibold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Semibold.otf]:+clig;+liga;+tlig;+onum
+KpRoman Semibold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Semibold.otf]:+clig;+liga;+tlig;+pcap
+KpRoman Semibold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Semibold.otf]:+clig;+liga;+tlig;+smcp
+KpRoman Semibold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Semibold.otf]:+clig;+liga;+tlig;+ss01
+KpRoman Semibold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Semibold.otf]:+clig;+liga;+tlig;+ss02
+KpRoman Semibold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Semibold.otf]:+clig;+liga;+tlig;+ss03
+KpRoman Semibold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Semibold.otf]:+clig;+liga;+tlig;+ss12
+KpRoman Semibold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Semibold.otf]:+clig;+liga;+tlig;+swsh
+KpRoman SemiboldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-SemiboldItalic.otf]:+clig;+liga;+tlig
+KpRoman SemiboldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-SemiboldItalic.otf]:+clig;+liga;+tlig;+hist
+KpRoman SemiboldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-SemiboldItalic.otf]:+clig;+liga;+tlig;+onum
+KpRoman SemiboldItalic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-SemiboldItalic.otf]:+clig;+liga;+tlig;+pcap
+KpRoman SemiboldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-SemiboldItalic.otf]:+clig;+liga;+tlig;+smcp
+KpRoman SemiboldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss01
+KpRoman SemiboldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss02
+KpRoman SemiboldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss03
+KpRoman SemiboldItalic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss12
+KpRoman SemiboldItalic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-SemiboldItalic.otf]:+clig;+liga;+tlig;+swsh
+KpRoman-Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Light.otf]:+clig;+liga;+tlig
+KpRoman-Light; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Light.otf]:+clig;+liga;+tlig;+hist
+KpRoman-Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Light.otf]:+clig;+liga;+tlig;+onum
+KpRoman-Light; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Light.otf]:+clig;+liga;+tlig;+pcap
+KpRoman-Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Light.otf]:+clig;+liga;+tlig;+smcp
+KpRoman-Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Light.otf]:+clig;+liga;+tlig;+ss01
+KpRoman-Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Light.otf]:+clig;+liga;+tlig;+ss02
+KpRoman-Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Light.otf]:+clig;+liga;+tlig;+ss03
+KpRoman-Light; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Light.otf]:+clig;+liga;+tlig;+ss12
+KpRoman-Light; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-Light.otf]:+clig;+liga;+tlig;+swsh
+KpRoman-LightItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-LightItalic.otf]:+clig;+liga;+tlig
+KpRoman-LightItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-LightItalic.otf]:+clig;+liga;+tlig;+hist
+KpRoman-LightItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-LightItalic.otf]:+clig;+liga;+tlig;+onum
+KpRoman-LightItalic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-LightItalic.otf]:+clig;+liga;+tlig;+pcap
+KpRoman-LightItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+KpRoman-LightItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+KpRoman-LightItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+KpRoman-LightItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+KpRoman-LightItalic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-LightItalic.otf]:+clig;+liga;+tlig;+ss12
+KpRoman-LightItalic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpRoman-LightItalic.otf]:+clig;+liga;+tlig;+swsh
+KpSans Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Bold.otf]:+clig;+liga;+tlig
+KpSans Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Bold.otf]:+clig;+liga;+tlig;+hist
+KpSans Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Bold.otf]:+clig;+liga;+tlig;+onum
+KpSans Bold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Bold.otf]:+clig;+liga;+tlig;+pcap
+KpSans Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Bold.otf]:+clig;+liga;+tlig;+smcp
+KpSans Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Bold.otf]:+clig;+liga;+tlig;+ss01
+KpSans Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Bold.otf]:+clig;+liga;+tlig;+ss02
+KpSans Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Bold.otf]:+clig;+liga;+tlig;+ss03
+KpSans Bold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Bold.otf]:+clig;+liga;+tlig;+ss12
+KpSans Bold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Bold.otf]:+clig;+liga;+tlig;+swsh
+KpSans BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-BoldItalic.otf]:+clig;+liga;+tlig
+KpSans BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+KpSans BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+KpSans BoldItalic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-BoldItalic.otf]:+clig;+liga;+tlig;+pcap
+KpSans BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+KpSans BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+KpSans BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+KpSans BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+KpSans BoldItalic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-BoldItalic.otf]:+clig;+liga;+tlig;+ss12
+KpSans BoldItalic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+KpSans Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Italic.otf]:+clig;+liga;+tlig
+KpSans Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Italic.otf]:+clig;+liga;+tlig;+hist
+KpSans Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Italic.otf]:+clig;+liga;+tlig;+onum
+KpSans Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Italic.otf]:+clig;+liga;+tlig;+pcap
+KpSans Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Italic.otf]:+clig;+liga;+tlig;+smcp
+KpSans Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Italic.otf]:+clig;+liga;+tlig;+ss01
+KpSans Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Italic.otf]:+clig;+liga;+tlig;+ss02
+KpSans Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Italic.otf]:+clig;+liga;+tlig;+ss03
+KpSans Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Italic.otf]:+clig;+liga;+tlig;+ss12
+KpSans Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Italic.otf]:+clig;+liga;+tlig;+swsh
+KpSans Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Regular.otf]:+clig;+liga;+tlig
+KpSans Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Regular.otf]:+clig;+liga;+tlig;+hist
+KpSans Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Regular.otf]:+clig;+liga;+tlig;+onum
+KpSans Regular; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Regular.otf]:+clig;+liga;+tlig;+pcap
+KpSans Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Regular.otf]:+clig;+liga;+tlig;+smcp
+KpSans Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Regular.otf]:+clig;+liga;+tlig;+ss01
+KpSans Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Regular.otf]:+clig;+liga;+tlig;+ss02
+KpSans Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Regular.otf]:+clig;+liga;+tlig;+ss03
+KpSans Regular; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Regular.otf]:+clig;+liga;+tlig;+ss12
+KpSans Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/kpfonts-otf/KpSans-Regular.otf]:+clig;+liga;+tlig;+swsh
+Kurier-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Bold.otf]:+clig;+liga;+tlig
+Kurier-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Bold.otf]:+clig;+liga;+tlig;+hist
+Kurier-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Bold.otf]:+clig;+liga;+tlig;+onum
+Kurier-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Bold.otf]:+clig;+liga;+tlig;+smcp
+Kurier-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Bold.otf]:+clig;+liga;+tlig;+ss02
+Kurier-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-BoldItalic.otf]:+clig;+liga;+tlig
+Kurier-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+Kurier-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Kurier-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Kurier-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Kurier-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Italic.otf]:+clig;+liga;+tlig
+Kurier-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Italic.otf]:+clig;+liga;+tlig;+hist
+Kurier-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Italic.otf]:+clig;+liga;+tlig;+onum
+Kurier-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Italic.otf]:+clig;+liga;+tlig;+smcp
+Kurier-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Italic.otf]:+clig;+liga;+tlig;+ss02
+Kurier-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Regular.otf]:+clig;+liga;+tlig
+Kurier-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Regular.otf]:+clig;+liga;+tlig;+hist
+Kurier-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Regular.otf]:+clig;+liga;+tlig;+onum
+Kurier-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Regular.otf]:+clig;+liga;+tlig;+smcp
+Kurier-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/Kurier-Regular.otf]:+clig;+liga;+tlig;+ss02
+KurierCond-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Bold.otf]:+clig;+liga;+tlig
+KurierCond-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Bold.otf]:+clig;+liga;+tlig;+hist
+KurierCond-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Bold.otf]:+clig;+liga;+tlig;+onum
+KurierCond-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Bold.otf]:+clig;+liga;+tlig;+smcp
+KurierCond-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Bold.otf]:+clig;+liga;+tlig;+ss02
+KurierCond-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-BoldItalic.otf]:+clig;+liga;+tlig
+KurierCond-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+KurierCond-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+KurierCond-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+KurierCond-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+KurierCond-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Italic.otf]:+clig;+liga;+tlig
+KurierCond-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Italic.otf]:+clig;+liga;+tlig;+hist
+KurierCond-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Italic.otf]:+clig;+liga;+tlig;+onum
+KurierCond-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Italic.otf]:+clig;+liga;+tlig;+smcp
+KurierCond-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Italic.otf]:+clig;+liga;+tlig;+ss02
+KurierCond-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Regular.otf]:+clig;+liga;+tlig
+KurierCond-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Regular.otf]:+clig;+liga;+tlig;+hist
+KurierCond-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Regular.otf]:+clig;+liga;+tlig;+onum
+KurierCond-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Regular.otf]:+clig;+liga;+tlig;+smcp
+KurierCond-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCond-Regular.otf]:+clig;+liga;+tlig;+ss02
+KurierCondHeavy-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondHeavy-Italic.otf]:+clig;+liga;+tlig
+KurierCondHeavy-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondHeavy-Italic.otf]:+clig;+liga;+tlig;+hist
+KurierCondHeavy-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondHeavy-Italic.otf]:+clig;+liga;+tlig;+onum
+KurierCondHeavy-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondHeavy-Italic.otf]:+clig;+liga;+tlig;+smcp
+KurierCondHeavy-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondHeavy-Italic.otf]:+clig;+liga;+tlig;+ss02
+KurierCondHeavy-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondHeavy-Regular.otf]:+clig;+liga;+tlig
+KurierCondHeavy-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondHeavy-Regular.otf]:+clig;+liga;+tlig;+hist
+KurierCondHeavy-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondHeavy-Regular.otf]:+clig;+liga;+tlig;+onum
+KurierCondHeavy-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondHeavy-Regular.otf]:+clig;+liga;+tlig;+smcp
+KurierCondHeavy-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondHeavy-Regular.otf]:+clig;+liga;+tlig;+ss02
+KurierCondLight-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondLight-Italic.otf]:+clig;+liga;+tlig
+KurierCondLight-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondLight-Italic.otf]:+clig;+liga;+tlig;+hist
+KurierCondLight-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondLight-Italic.otf]:+clig;+liga;+tlig;+onum
+KurierCondLight-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondLight-Italic.otf]:+clig;+liga;+tlig;+smcp
+KurierCondLight-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondLight-Italic.otf]:+clig;+liga;+tlig;+ss02
+KurierCondLight-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondLight-Regular.otf]:+clig;+liga;+tlig
+KurierCondLight-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondLight-Regular.otf]:+clig;+liga;+tlig;+hist
+KurierCondLight-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondLight-Regular.otf]:+clig;+liga;+tlig;+onum
+KurierCondLight-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondLight-Regular.otf]:+clig;+liga;+tlig;+smcp
+KurierCondLight-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondLight-Regular.otf]:+clig;+liga;+tlig;+ss02
+KurierCondMedium-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondMedium-Italic.otf]:+clig;+liga;+tlig
+KurierCondMedium-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondMedium-Italic.otf]:+clig;+liga;+tlig;+hist
+KurierCondMedium-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondMedium-Italic.otf]:+clig;+liga;+tlig;+onum
+KurierCondMedium-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondMedium-Italic.otf]:+clig;+liga;+tlig;+smcp
+KurierCondMedium-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondMedium-Italic.otf]:+clig;+liga;+tlig;+ss02
+KurierCondMedium-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondMedium-Regular.otf]:+clig;+liga;+tlig
+KurierCondMedium-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondMedium-Regular.otf]:+clig;+liga;+tlig;+hist
+KurierCondMedium-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondMedium-Regular.otf]:+clig;+liga;+tlig;+onum
+KurierCondMedium-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondMedium-Regular.otf]:+clig;+liga;+tlig;+smcp
+KurierCondMedium-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierCondMedium-Regular.otf]:+clig;+liga;+tlig;+ss02
+KurierHeavy-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierHeavy-Italic.otf]:+clig;+liga;+tlig
+KurierHeavy-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierHeavy-Italic.otf]:+clig;+liga;+tlig;+hist
+KurierHeavy-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierHeavy-Italic.otf]:+clig;+liga;+tlig;+onum
+KurierHeavy-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierHeavy-Italic.otf]:+clig;+liga;+tlig;+smcp
+KurierHeavy-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierHeavy-Italic.otf]:+clig;+liga;+tlig;+ss02
+KurierHeavy-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierHeavy-Regular.otf]:+clig;+liga;+tlig
+KurierHeavy-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierHeavy-Regular.otf]:+clig;+liga;+tlig;+hist
+KurierHeavy-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierHeavy-Regular.otf]:+clig;+liga;+tlig;+onum
+KurierHeavy-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierHeavy-Regular.otf]:+clig;+liga;+tlig;+smcp
+KurierHeavy-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierHeavy-Regular.otf]:+clig;+liga;+tlig;+ss02
+KurierLight-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierLight-Italic.otf]:+clig;+liga;+tlig
+KurierLight-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierLight-Italic.otf]:+clig;+liga;+tlig;+hist
+KurierLight-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierLight-Italic.otf]:+clig;+liga;+tlig;+onum
+KurierLight-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierLight-Italic.otf]:+clig;+liga;+tlig;+smcp
+KurierLight-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierLight-Italic.otf]:+clig;+liga;+tlig;+ss02
+KurierLight-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierLight-Regular.otf]:+clig;+liga;+tlig
+KurierLight-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierLight-Regular.otf]:+clig;+liga;+tlig;+hist
+KurierLight-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierLight-Regular.otf]:+clig;+liga;+tlig;+onum
+KurierLight-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierLight-Regular.otf]:+clig;+liga;+tlig;+smcp
+KurierLight-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierLight-Regular.otf]:+clig;+liga;+tlig;+ss02
+KurierMedium-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierMedium-Italic.otf]:+clig;+liga;+tlig
+KurierMedium-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierMedium-Italic.otf]:+clig;+liga;+tlig;+hist
+KurierMedium-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierMedium-Italic.otf]:+clig;+liga;+tlig;+onum
+KurierMedium-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierMedium-Italic.otf]:+clig;+liga;+tlig;+smcp
+KurierMedium-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierMedium-Italic.otf]:+clig;+liga;+tlig;+ss02
+KurierMedium-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierMedium-Regular.otf]:+clig;+liga;+tlig
+KurierMedium-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierMedium-Regular.otf]:+clig;+liga;+tlig;+hist
+KurierMedium-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierMedium-Regular.otf]:+clig;+liga;+tlig;+onum
+KurierMedium-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierMedium-Regular.otf]:+clig;+liga;+tlig;+smcp
+KurierMedium-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/nowacki/kurier/KurierMedium-Regular.otf]:+clig;+liga;+tlig;+ss02
+KurkaLapoyu Regular [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/KurkaLapoyu/KurkaLapoyu-Regular.otf]:+clig;+liga;+tlig
+Kyiv Region Regular [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig
+Kyiv Region Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+onum
+Kyiv Region Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+ss01
+Kyiv Region Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+ss02
+Kyiv Region Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+ss03
+Kyiv Region Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+ss04
+Kyiv Region Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+ss05
+Kyiv Region Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+ss06
+Kyiv Region Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+ss07
+Kyiv Region Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+ss08
+Kyiv Region Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+ss09
+Kyiv Region Regular; Swash [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivRegion/KyivRegion-Regular.otf]:+clig;+liga;+tlig;+swsh
+Kyiv Region Regular [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig
+Kyiv Region Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+onum
+Kyiv Region Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Kyiv Region Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Kyiv Region Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Kyiv Region Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Kyiv Region Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Kyiv Region Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Kyiv Region Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Kyiv Region Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+ss08
+Kyiv Region Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+ss09
+Kyiv Region Regular; Swash [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivRegion/KyivRegion-Regular.ttf]:+clig;+liga;+tlig;+swsh
+Kyiv*Type Serif [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-VarGX.ttf]:+clig;+liga;+tlig
+Kyiv*Type Serif; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-VarGX.ttf]:+clig;+liga;+tlig;+onum
+Kyiv*Type Serif; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-VarGX.ttf]:+clig;+liga;+tlig;+ss01
+Kyiv*Type Serif; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-VarGX.ttf]:+clig;+liga;+tlig;+ss02
+Kyiv*Type Serif; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-VarGX.ttf]:+clig;+liga;+tlig;+ss03
+Kyiv*Type Serif; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-VarGX.ttf]:+clig;+liga;+tlig;+ss04
+Kyiv*Type Serif; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-VarGX.ttf]:+clig;+liga;+tlig;+ss05
+Kyiv*Type Titling [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-VarGX.ttf]:+clig;+liga;+tlig
+Kyiv*Type Titling; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-VarGX.ttf]:+clig;+liga;+tlig;+onum
+Kyiv*Type Titling; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-VarGX.ttf]:+clig;+liga;+tlig;+ss01
+Kyiv*Type Titling; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-VarGX.ttf]:+clig;+liga;+tlig;+ss02
+Kyiv*Type Titling; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-VarGX.ttf]:+clig;+liga;+tlig;+ss03
+Kyiv*Type Titling; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-VarGX.ttf]:+clig;+liga;+tlig;+ss04
+Kyiv*Type Titling; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-VarGX.ttf]:+clig;+liga;+tlig;+ss05
+Kyiv*Type Titling; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-VarGX.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Icons Background [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeIcons-Background.otf]:+clig;+liga;+tlig
+KyivType Icons Background [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeIcons-Background.ttf]:+clig;+liga;+tlig
+KyivType Icons Regular [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeIcons-Regular.otf]:+clig;+liga;+tlig
+KyivType Icons Regular [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeIcons-Regular.ttf]:+clig;+liga;+tlig
+KyivType Sans [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-VarGX.ttf]:+clig;+liga;+tlig
+KyivType Sans; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-VarGX.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-VarGX.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-VarGX.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-VarGX.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-VarGX.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-VarGX.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-VarGX.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Black [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black.otf]:+clig;+liga;+tlig
+KyivType Sans Black; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Black; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Black [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black.ttf]:+clig;+liga;+tlig
+KyivType Sans Black; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Black; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Black- [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black-.otf]:+clig;+liga;+tlig
+KyivType Sans Black-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black-.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Black-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black-.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Black-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black-.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Black-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black-.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Black-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black-.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Black-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black-.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Black-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black-.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Black- [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black-.ttf]:+clig;+liga;+tlig
+KyivType Sans Black-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black-.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Black-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black-.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Black-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black-.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Black-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black-.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Black-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black-.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Black-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black-.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Black-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black-.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Black2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black2.otf]:+clig;+liga;+tlig
+KyivType Sans Black2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black2.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Black2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Black2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Black2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Black2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Black2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Black2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Black2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black2.ttf]:+clig;+liga;+tlig
+KyivType Sans Black2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Black2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Black2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Black2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Black2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Black2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Black2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Black3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black3.otf]:+clig;+liga;+tlig
+KyivType Sans Black3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black3.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Black3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Black3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Black3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Black3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Black3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Black3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Black3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Black3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black3.ttf]:+clig;+liga;+tlig
+KyivType Sans Black3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Black3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Black3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Black3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Black3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Black3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Black3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Black3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Bold [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold.otf]:+clig;+liga;+tlig
+KyivType Sans Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Bold [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold.ttf]:+clig;+liga;+tlig
+KyivType Sans Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Bold- [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold-.otf]:+clig;+liga;+tlig
+KyivType Sans Bold-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold-.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Bold-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold-.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Bold-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold-.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Bold-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold-.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Bold-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold-.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Bold-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold-.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Bold-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold-.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Bold- [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold-.ttf]:+clig;+liga;+tlig
+KyivType Sans Bold-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold-.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Bold-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold-.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Bold-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold-.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Bold-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold-.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Bold-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold-.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Bold-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold-.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Bold-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold-.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Bold2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold2.otf]:+clig;+liga;+tlig
+KyivType Sans Bold2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold2.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Bold2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Bold2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Bold2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Bold2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Bold2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Bold2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Bold2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold2.ttf]:+clig;+liga;+tlig
+KyivType Sans Bold2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Bold2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Bold2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Bold2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Bold2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Bold2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Bold2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Bold3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold3.otf]:+clig;+liga;+tlig
+KyivType Sans Bold3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold3.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Bold3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Bold3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Bold3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Bold3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Bold3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Bold3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Bold3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Bold3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold3.ttf]:+clig;+liga;+tlig
+KyivType Sans Bold3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Bold3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Bold3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Bold3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Bold3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Bold3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Bold3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Bold3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Heavy [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy.otf]:+clig;+liga;+tlig
+KyivType Sans Heavy; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Heavy; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Heavy; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Heavy; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Heavy; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Heavy; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Heavy; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Heavy [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy.ttf]:+clig;+liga;+tlig
+KyivType Sans Heavy; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Heavy; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Heavy; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Heavy; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Heavy; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Heavy; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Heavy; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Heavy- [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy-.otf]:+clig;+liga;+tlig
+KyivType Sans Heavy-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy-.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Heavy-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy-.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Heavy-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy-.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Heavy-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy-.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Heavy-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy-.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Heavy-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy-.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Heavy-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy-.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Heavy- [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy-.ttf]:+clig;+liga;+tlig
+KyivType Sans Heavy-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy-.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Heavy-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy-.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Heavy-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy-.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Heavy-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy-.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Heavy-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy-.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Heavy-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy-.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Heavy-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy-.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Heavy2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy2.otf]:+clig;+liga;+tlig
+KyivType Sans Heavy2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy2.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Heavy2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Heavy2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Heavy2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Heavy2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Heavy2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Heavy2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Heavy2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy2.ttf]:+clig;+liga;+tlig
+KyivType Sans Heavy2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Heavy2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Heavy2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Heavy2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Heavy2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Heavy2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Heavy2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Heavy3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy3.otf]:+clig;+liga;+tlig
+KyivType Sans Heavy3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy3.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Heavy3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Heavy3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Heavy3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Heavy3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Heavy3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Heavy3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Heavy3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Heavy3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy3.ttf]:+clig;+liga;+tlig
+KyivType Sans Heavy3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Heavy3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Heavy3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Heavy3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Heavy3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Heavy3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Heavy3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Heavy3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Light [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light.otf]:+clig;+liga;+tlig
+KyivType Sans Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Light [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light.ttf]:+clig;+liga;+tlig
+KyivType Sans Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Light- [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light-.otf]:+clig;+liga;+tlig
+KyivType Sans Light-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light-.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Light-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light-.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Light-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light-.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Light-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light-.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Light-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light-.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Light-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light-.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Light-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light-.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Light- [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light-.ttf]:+clig;+liga;+tlig
+KyivType Sans Light-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light-.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Light-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light-.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Light-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light-.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Light-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light-.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Light-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light-.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Light-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light-.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Light-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light-.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Light2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light2.otf]:+clig;+liga;+tlig
+KyivType Sans Light2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light2.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Light2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Light2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Light2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Light2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Light2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Light2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Light2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light2.ttf]:+clig;+liga;+tlig
+KyivType Sans Light2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Light2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Light2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Light2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Light2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Light2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Light2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Light3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light3.otf]:+clig;+liga;+tlig
+KyivType Sans Light3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light3.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Light3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Light3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Light3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Light3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Light3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Light3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Light3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Light3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light3.ttf]:+clig;+liga;+tlig
+KyivType Sans Light3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Light3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Light3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Light3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Light3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Light3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Light3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Light3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Medium [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium.otf]:+clig;+liga;+tlig
+KyivType Sans Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Medium [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium.ttf]:+clig;+liga;+tlig
+KyivType Sans Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Medium- [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium-.otf]:+clig;+liga;+tlig
+KyivType Sans Medium-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium-.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Medium-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium-.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Medium-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium-.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Medium-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium-.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Medium-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium-.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Medium-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium-.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Medium-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium-.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Medium- [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium-.ttf]:+clig;+liga;+tlig
+KyivType Sans Medium-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium-.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Medium-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium-.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Medium-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium-.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Medium-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium-.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Medium-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium-.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Medium-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium-.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Medium-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium-.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Medium2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium2.otf]:+clig;+liga;+tlig
+KyivType Sans Medium2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium2.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Medium2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Medium2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Medium2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Medium2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Medium2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Medium2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Medium2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium2.ttf]:+clig;+liga;+tlig
+KyivType Sans Medium2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Medium2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Medium2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Medium2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Medium2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Medium2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Medium2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Medium3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium3.otf]:+clig;+liga;+tlig
+KyivType Sans Medium3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium3.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Medium3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Medium3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Medium3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Medium3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Medium3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Medium3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Medium3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Medium3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium3.ttf]:+clig;+liga;+tlig
+KyivType Sans Medium3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Medium3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Medium3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Medium3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Medium3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Medium3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Medium3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Medium3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Regular [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular.otf]:+clig;+liga;+tlig
+KyivType Sans Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Regular [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular.ttf]:+clig;+liga;+tlig
+KyivType Sans Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Regular- [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular-.otf]:+clig;+liga;+tlig
+KyivType Sans Regular-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular-.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Regular-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular-.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Regular-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular-.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Regular-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular-.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Regular-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular-.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Regular-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular-.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Regular-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular-.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Regular- [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular-.ttf]:+clig;+liga;+tlig
+KyivType Sans Regular-; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular-.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Regular-; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular-.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Regular-; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular-.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Regular-; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular-.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Regular-; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular-.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Regular-; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular-.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Regular-; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular-.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Regular2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular2.otf]:+clig;+liga;+tlig
+KyivType Sans Regular2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular2.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Regular2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Regular2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Regular2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Regular2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Regular2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Regular2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Regular2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular2.ttf]:+clig;+liga;+tlig
+KyivType Sans Regular2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Regular2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Regular2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Regular2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Regular2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Regular2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Regular2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Regular3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular3.otf]:+clig;+liga;+tlig
+KyivType Sans Regular3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular3.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Regular3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Regular3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Regular3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Regular3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Regular3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Regular3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Regular3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Regular3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular3.ttf]:+clig;+liga;+tlig
+KyivType Sans Regular3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Regular3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Regular3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Regular3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Regular3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Regular3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Regular3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Regular3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Thin [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Thin.otf]:+clig;+liga;+tlig
+KyivType Sans Thin; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Thin.otf]:+clig;+liga;+tlig;+onum
+KyivType Sans Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Thin.otf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Thin.otf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Thin.otf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Thin.otf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Thin.otf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSans-Thin.otf]:+clig;+liga;+tlig;+ss06
+KyivType Sans Thin [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Thin.ttf]:+clig;+liga;+tlig
+KyivType Sans Thin; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Thin.ttf]:+clig;+liga;+tlig;+onum
+KyivType Sans Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Thin.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Sans Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Thin.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Sans Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Thin.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Sans Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Thin.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Sans Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Thin.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Sans Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSans-Thin.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Serif Black [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black.otf]:+clig;+liga;+tlig
+KyivType Serif Black; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Black [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black.ttf]:+clig;+liga;+tlig
+KyivType Serif Black; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Black2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black2.otf]:+clig;+liga;+tlig
+KyivType Serif Black2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black2.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Black2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Black2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Black2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Black2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Black2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Black2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black2.ttf]:+clig;+liga;+tlig
+KyivType Serif Black2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Black2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Black2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Black2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Black2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Black2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Black3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black3.otf]:+clig;+liga;+tlig
+KyivType Serif Black3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black3.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Black3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Black3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Black3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Black3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Black3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Black3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Black3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black3.ttf]:+clig;+liga;+tlig
+KyivType Serif Black3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Black3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Black3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Black3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Black3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Black3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Black3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Bold [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold.otf]:+clig;+liga;+tlig
+KyivType Serif Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Bold [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold.ttf]:+clig;+liga;+tlig
+KyivType Serif Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Bold2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold2.otf]:+clig;+liga;+tlig
+KyivType Serif Bold2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold2.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Bold2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Bold2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Bold2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Bold2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Bold2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Bold2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold2.ttf]:+clig;+liga;+tlig
+KyivType Serif Bold2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Bold2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Bold2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Bold2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Bold2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Bold2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Bold3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold3.otf]:+clig;+liga;+tlig
+KyivType Serif Bold3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold3.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Bold3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Bold3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Bold3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Bold3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Bold3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Bold3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Bold3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold3.ttf]:+clig;+liga;+tlig
+KyivType Serif Bold3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Bold3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Bold3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Bold3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Bold3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Bold3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Bold3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Heavy [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy.otf]:+clig;+liga;+tlig
+KyivType Serif Heavy; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Heavy; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Heavy; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Heavy; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Heavy; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Heavy; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Heavy [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy.ttf]:+clig;+liga;+tlig
+KyivType Serif Heavy; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Heavy; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Heavy; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Heavy; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Heavy; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Heavy; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Heavy2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy2.otf]:+clig;+liga;+tlig
+KyivType Serif Heavy2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy2.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Heavy2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Heavy2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Heavy2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Heavy2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Heavy2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Heavy2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy2.ttf]:+clig;+liga;+tlig
+KyivType Serif Heavy2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Heavy2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Heavy2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Heavy2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Heavy2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Heavy2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Heavy3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy3.otf]:+clig;+liga;+tlig
+KyivType Serif Heavy3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy3.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Heavy3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Heavy3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Heavy3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Heavy3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Heavy3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Heavy3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Heavy3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy3.ttf]:+clig;+liga;+tlig
+KyivType Serif Heavy3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Heavy3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Heavy3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Heavy3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Heavy3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Heavy3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Heavy3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Light [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light.otf]:+clig;+liga;+tlig
+KyivType Serif Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Light [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light.ttf]:+clig;+liga;+tlig
+KyivType Serif Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Light2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light2.otf]:+clig;+liga;+tlig
+KyivType Serif Light2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light2.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Light2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Light2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Light2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Light2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Light2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Light2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light2.ttf]:+clig;+liga;+tlig
+KyivType Serif Light2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Light2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Light2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Light2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Light2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Light2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Light3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light3.otf]:+clig;+liga;+tlig
+KyivType Serif Light3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light3.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Light3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Light3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Light3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Light3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Light3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Light3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Light3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light3.ttf]:+clig;+liga;+tlig
+KyivType Serif Light3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Light3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Light3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Light3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Light3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Light3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Light3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Medium [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium.otf]:+clig;+liga;+tlig
+KyivType Serif Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Medium [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium.ttf]:+clig;+liga;+tlig
+KyivType Serif Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Medium2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium2.otf]:+clig;+liga;+tlig
+KyivType Serif Medium2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium2.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Medium2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Medium2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Medium2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Medium2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Medium2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Medium2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium2.ttf]:+clig;+liga;+tlig
+KyivType Serif Medium2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Medium2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Medium2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Medium2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Medium2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Medium2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Medium3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium3.otf]:+clig;+liga;+tlig
+KyivType Serif Medium3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium3.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Medium3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Medium3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Medium3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Medium3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Medium3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Medium3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Medium3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium3.ttf]:+clig;+liga;+tlig
+KyivType Serif Medium3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Medium3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Medium3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Medium3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Medium3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Medium3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Medium3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Regular [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular.otf]:+clig;+liga;+tlig
+KyivType Serif Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Regular [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular.ttf]:+clig;+liga;+tlig
+KyivType Serif Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Regular2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular2.otf]:+clig;+liga;+tlig
+KyivType Serif Regular2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular2.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Regular2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Regular2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Regular2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Regular2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Regular2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Regular2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular2.ttf]:+clig;+liga;+tlig
+KyivType Serif Regular2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Regular2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Regular2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Regular2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Regular2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Regular2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Regular3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular3.otf]:+clig;+liga;+tlig
+KyivType Serif Regular3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular3.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Regular3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Regular3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Regular3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Regular3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Regular3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Regular3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Regular3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular3.ttf]:+clig;+liga;+tlig
+KyivType Serif Regular3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Regular3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Regular3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Regular3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Regular3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Regular3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Regular3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Thin [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Thin.otf]:+clig;+liga;+tlig
+KyivType Serif Thin; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Thin.otf]:+clig;+liga;+tlig;+onum
+KyivType Serif Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Thin.otf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Thin.otf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Thin.otf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Thin.otf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeSerif-Thin.otf]:+clig;+liga;+tlig;+ss05
+KyivType Serif Thin [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Thin.ttf]:+clig;+liga;+tlig
+KyivType Serif Thin; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Thin.ttf]:+clig;+liga;+tlig;+onum
+KyivType Serif Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Thin.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Serif Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Thin.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Serif Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Thin.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Serif Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Thin.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Serif Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeSerif-Thin.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Black [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black.otf]:+clig;+liga;+tlig
+KyivType Titling Black; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Black; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Black [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black.ttf]:+clig;+liga;+tlig
+KyivType Titling Black; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Black; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Black2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black2.otf]:+clig;+liga;+tlig
+KyivType Titling Black2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black2.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Black2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Black2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Black2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Black2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Black2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Black2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Black2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black2.ttf]:+clig;+liga;+tlig
+KyivType Titling Black2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Black2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Black2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Black2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Black2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Black2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Black2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Black3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black3.otf]:+clig;+liga;+tlig
+KyivType Titling Black3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black3.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Black3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Black3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Black3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Black3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Black3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Black3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Black3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Black3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black3.ttf]:+clig;+liga;+tlig
+KyivType Titling Black3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Black3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Black3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Black3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Black3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Black3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Black3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Black3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Bold [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold.otf]:+clig;+liga;+tlig
+KyivType Titling Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Bold [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold.ttf]:+clig;+liga;+tlig
+KyivType Titling Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Bold2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold2.otf]:+clig;+liga;+tlig
+KyivType Titling Bold2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold2.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Bold2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Bold2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Bold2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Bold2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Bold2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Bold2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Bold2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold2.ttf]:+clig;+liga;+tlig
+KyivType Titling Bold2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Bold2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Bold2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Bold2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Bold2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Bold2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Bold2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Bold3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold3.otf]:+clig;+liga;+tlig
+KyivType Titling Bold3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold3.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Bold3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Bold3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Bold3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Bold3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Bold3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Bold3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Bold3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Bold3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold3.ttf]:+clig;+liga;+tlig
+KyivType Titling Bold3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Bold3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Bold3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Bold3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Bold3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Bold3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Bold3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Bold3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Heavy [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy.otf]:+clig;+liga;+tlig
+KyivType Titling Heavy; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Heavy; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Heavy; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Heavy; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Heavy; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Heavy; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Heavy; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Heavy [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy.ttf]:+clig;+liga;+tlig
+KyivType Titling Heavy; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Heavy; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Heavy; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Heavy; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Heavy; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Heavy; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Heavy; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Heavy2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy2.otf]:+clig;+liga;+tlig
+KyivType Titling Heavy2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy2.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Heavy2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Heavy2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Heavy2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Heavy2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Heavy2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Heavy2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Heavy2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy2.ttf]:+clig;+liga;+tlig
+KyivType Titling Heavy2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Heavy2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Heavy2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Heavy2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Heavy2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Heavy2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Heavy2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Heavy3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy3.otf]:+clig;+liga;+tlig
+KyivType Titling Heavy3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy3.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Heavy3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Heavy3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Heavy3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Heavy3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Heavy3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Heavy3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Heavy3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Heavy3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy3.ttf]:+clig;+liga;+tlig
+KyivType Titling Heavy3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Heavy3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Heavy3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Heavy3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Heavy3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Heavy3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Heavy3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Heavy3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Light [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light.otf]:+clig;+liga;+tlig
+KyivType Titling Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Light [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light.ttf]:+clig;+liga;+tlig
+KyivType Titling Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Light2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light2.otf]:+clig;+liga;+tlig
+KyivType Titling Light2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light2.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Light2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Light2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Light2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Light2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Light2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Light2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Light2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light2.ttf]:+clig;+liga;+tlig
+KyivType Titling Light2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Light2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Light2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Light2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Light2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Light2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Light2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Light3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light3.otf]:+clig;+liga;+tlig
+KyivType Titling Light3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light3.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Light3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Light3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Light3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Light3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Light3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Light3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Light3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Light3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light3.ttf]:+clig;+liga;+tlig
+KyivType Titling Light3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Light3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Light3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Light3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Light3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Light3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Light3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Light3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Medium [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium.otf]:+clig;+liga;+tlig
+KyivType Titling Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Medium [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium.ttf]:+clig;+liga;+tlig
+KyivType Titling Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Medium2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium2.otf]:+clig;+liga;+tlig
+KyivType Titling Medium2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium2.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Medium2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Medium2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Medium2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Medium2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Medium2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Medium2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Medium2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium2.ttf]:+clig;+liga;+tlig
+KyivType Titling Medium2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Medium2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Medium2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Medium2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Medium2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Medium2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Medium2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Medium3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium3.otf]:+clig;+liga;+tlig
+KyivType Titling Medium3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium3.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Medium3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Medium3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Medium3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Medium3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Medium3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Medium3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Medium3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Medium3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium3.ttf]:+clig;+liga;+tlig
+KyivType Titling Medium3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Medium3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Medium3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Medium3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Medium3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Medium3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Medium3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Medium3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Regular [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular.otf]:+clig;+liga;+tlig
+KyivType Titling Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Regular [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular.ttf]:+clig;+liga;+tlig
+KyivType Titling Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Regular2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular2.otf]:+clig;+liga;+tlig
+KyivType Titling Regular2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular2.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Regular2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular2.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Regular2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular2.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Regular2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular2.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Regular2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular2.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Regular2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular2.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Regular2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular2.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Regular2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular2.ttf]:+clig;+liga;+tlig
+KyivType Titling Regular2; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular2.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Regular2; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular2.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Regular2; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular2.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Regular2; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular2.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Regular2; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular2.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Regular2; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular2.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Regular2; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular2.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Regular3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular3.otf]:+clig;+liga;+tlig
+KyivType Titling Regular3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular3.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Regular3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular3.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Regular3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular3.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Regular3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular3.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Regular3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular3.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Regular3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular3.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Regular3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Regular3.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Regular3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular3.ttf]:+clig;+liga;+tlig
+KyivType Titling Regular3; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular3.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Regular3; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular3.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Regular3; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular3.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Regular3; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular3.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Regular3; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular3.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Regular3; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular3.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Regular3; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Regular3.ttf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Thin [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Thin.otf]:+clig;+liga;+tlig
+KyivType Titling Thin; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Thin.otf]:+clig;+liga;+tlig;+onum
+KyivType Titling Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Thin.otf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Thin.otf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Thin.otf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Thin.otf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Thin.otf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/KyivType/KyivTypeTitling-Thin.otf]:+clig;+liga;+tlig;+ss06
+KyivType Titling Thin [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Thin.ttf]:+clig;+liga;+tlig
+KyivType Titling Thin; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Thin.ttf]:+clig;+liga;+tlig;+onum
+KyivType Titling Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Thin.ttf]:+clig;+liga;+tlig;+ss01
+KyivType Titling Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Thin.ttf]:+clig;+liga;+tlig;+ss02
+KyivType Titling Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Thin.ttf]:+clig;+liga;+tlig;+ss03
+KyivType Titling Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Thin.ttf]:+clig;+liga;+tlig;+ss04
+KyivType Titling Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Thin.ttf]:+clig;+liga;+tlig;+ss05
+KyivType Titling Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/KyivType/KyivTypeTitling-Thin.ttf]:+clig;+liga;+tlig;+ss06
+LMMono10-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmono10-italic.otf]:+clig;+liga;+tlig
+LMMono10-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmono10-italic.otf]:+clig;+liga;+tlig;+onum
+LMMono10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmono10-regular.otf]:+clig;+liga;+tlig
+LMMono10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmono10-regular.otf]:+clig;+liga;+tlig;+onum
+LMMono12-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmono12-regular.otf]:+clig;+liga;+tlig
+LMMono12-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmono12-regular.otf]:+clig;+liga;+tlig;+onum
+LMMono8-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmono8-regular.otf]:+clig;+liga;+tlig
+LMMono8-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmono8-regular.otf]:+clig;+liga;+tlig;+onum
+LMMono9-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmono9-regular.otf]:+clig;+liga;+tlig
+LMMono9-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmono9-regular.otf]:+clig;+liga;+tlig;+onum
+LMMonoCaps10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonocaps10-oblique.otf]:+clig;+liga;+tlig
+LMMonoCaps10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonocaps10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMMonoCaps10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonocaps10-regular.otf]:+clig;+liga;+tlig
+LMMonoCaps10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonocaps10-regular.otf]:+clig;+liga;+tlig;+onum
+LMMonoLt10-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonolt10-bold.otf]:+clig;+liga;+tlig
+LMMonoLt10-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonolt10-bold.otf]:+clig;+liga;+tlig;+onum
+LMMonoLt10-BoldOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonolt10-boldoblique.otf]:+clig;+liga;+tlig
+LMMonoLt10-BoldOblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonolt10-boldoblique.otf]:+clig;+liga;+tlig;+onum
+LMMonoLt10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonolt10-oblique.otf]:+clig;+liga;+tlig
+LMMonoLt10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonolt10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMMonoLt10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonolt10-regular.otf]:+clig;+liga;+tlig
+LMMonoLt10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonolt10-regular.otf]:+clig;+liga;+tlig;+onum
+LMMonoLtCond10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoltcond10-oblique.otf]:+clig;+liga;+tlig
+LMMonoLtCond10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoltcond10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMMonoLtCond10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoltcond10-regular.otf]:+clig;+liga;+tlig
+LMMonoLtCond10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoltcond10-regular.otf]:+clig;+liga;+tlig;+onum
+LMMonoProp10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoprop10-oblique.otf]:+clig;+liga;+tlig
+LMMonoProp10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoprop10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMMonoProp10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoprop10-regular.otf]:+clig;+liga;+tlig
+LMMonoProp10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoprop10-regular.otf]:+clig;+liga;+tlig;+onum
+LMMonoPropLt10-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoproplt10-bold.otf]:+clig;+liga;+tlig
+LMMonoPropLt10-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoproplt10-bold.otf]:+clig;+liga;+tlig;+onum
+LMMonoPropLt10-BoldOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoproplt10-boldoblique.otf]:+clig;+liga;+tlig
+LMMonoPropLt10-BoldOblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoproplt10-boldoblique.otf]:+clig;+liga;+tlig;+onum
+LMMonoPropLt10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoproplt10-oblique.otf]:+clig;+liga;+tlig
+LMMonoPropLt10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoproplt10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMMonoPropLt10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoproplt10-regular.otf]:+clig;+liga;+tlig
+LMMonoPropLt10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoproplt10-regular.otf]:+clig;+liga;+tlig;+onum
+LMMonoSlant10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoslant10-regular.otf]:+clig;+liga;+tlig
+LMMonoSlant10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmmonoslant10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRoman10-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman10-bold.otf]:+clig;+liga;+tlig
+LMRoman10-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman10-bold.otf]:+clig;+liga;+tlig;+onum
+LMRoman10-Bold [/Users/bveytsman/Library/Fonts/lmroman10-bold.otf]:+clig;+liga;+tlig
+LMRoman10-Bold; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmroman10-bold.otf]:+clig;+liga;+tlig;+onum
+LMRoman10-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman10-bolditalic.otf]:+clig;+liga;+tlig
+LMRoman10-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman10-bolditalic.otf]:+clig;+liga;+tlig;+onum
+LMRoman10-BoldItalic [/Users/bveytsman/Library/Fonts/lmroman10-bolditalic.otf]:+clig;+liga;+tlig
+LMRoman10-BoldItalic; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmroman10-bolditalic.otf]:+clig;+liga;+tlig;+onum
+LMRoman10-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman10-italic.otf]:+clig;+liga;+tlig
+LMRoman10-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman10-italic.otf]:+clig;+liga;+tlig;+onum
+LMRoman10-Italic [/Users/bveytsman/Library/Fonts/lmroman10-italic.otf]:+clig;+liga;+tlig
+LMRoman10-Italic; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmroman10-italic.otf]:+clig;+liga;+tlig;+onum
+LMRoman10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman10-regular.otf]:+clig;+liga;+tlig
+LMRoman10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRoman10-Regular [/Users/bveytsman/Library/Fonts/lmroman10-regular.otf]:+clig;+liga;+tlig
+LMRoman10-Regular; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmroman10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRoman12-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman12-bold.otf]:+clig;+liga;+tlig
+LMRoman12-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman12-bold.otf]:+clig;+liga;+tlig;+onum
+LMRoman12-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman12-italic.otf]:+clig;+liga;+tlig
+LMRoman12-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman12-italic.otf]:+clig;+liga;+tlig;+onum
+LMRoman12-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman12-regular.otf]:+clig;+liga;+tlig
+LMRoman12-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman12-regular.otf]:+clig;+liga;+tlig;+onum
+LMRoman17-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman17-regular.otf]:+clig;+liga;+tlig
+LMRoman17-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman17-regular.otf]:+clig;+liga;+tlig;+onum
+LMRoman5-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman5-bold.otf]:+clig;+liga;+tlig
+LMRoman5-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman5-bold.otf]:+clig;+liga;+tlig;+onum
+LMRoman5-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman5-regular.otf]:+clig;+liga;+tlig
+LMRoman5-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman5-regular.otf]:+clig;+liga;+tlig;+onum
+LMRoman6-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman6-bold.otf]:+clig;+liga;+tlig
+LMRoman6-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman6-bold.otf]:+clig;+liga;+tlig;+onum
+LMRoman6-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman6-regular.otf]:+clig;+liga;+tlig
+LMRoman6-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman6-regular.otf]:+clig;+liga;+tlig;+onum
+LMRoman7-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman7-bold.otf]:+clig;+liga;+tlig
+LMRoman7-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman7-bold.otf]:+clig;+liga;+tlig;+onum
+LMRoman7-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman7-italic.otf]:+clig;+liga;+tlig
+LMRoman7-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman7-italic.otf]:+clig;+liga;+tlig;+onum
+LMRoman7-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman7-regular.otf]:+clig;+liga;+tlig
+LMRoman7-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman7-regular.otf]:+clig;+liga;+tlig;+onum
+LMRoman8-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman8-bold.otf]:+clig;+liga;+tlig
+LMRoman8-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman8-bold.otf]:+clig;+liga;+tlig;+onum
+LMRoman8-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman8-italic.otf]:+clig;+liga;+tlig
+LMRoman8-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman8-italic.otf]:+clig;+liga;+tlig;+onum
+LMRoman8-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman8-regular.otf]:+clig;+liga;+tlig
+LMRoman8-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman8-regular.otf]:+clig;+liga;+tlig;+onum
+LMRoman9-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman9-bold.otf]:+clig;+liga;+tlig
+LMRoman9-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman9-bold.otf]:+clig;+liga;+tlig;+onum
+LMRoman9-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman9-italic.otf]:+clig;+liga;+tlig
+LMRoman9-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman9-italic.otf]:+clig;+liga;+tlig;+onum
+LMRoman9-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman9-regular.otf]:+clig;+liga;+tlig
+LMRoman9-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmroman9-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanCaps10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromancaps10-oblique.otf]:+clig;+liga;+tlig
+LMRomanCaps10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromancaps10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMRomanCaps10-Oblique [/Users/bveytsman/Library/Fonts/lmromancaps10-oblique.otf]:+clig;+liga;+tlig
+LMRomanCaps10-Oblique; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmromancaps10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMRomanCaps10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromancaps10-regular.otf]:+clig;+liga;+tlig
+LMRomanCaps10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromancaps10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanCaps10-Regular [/Users/bveytsman/Library/Fonts/lmromancaps10-regular.otf]:+clig;+liga;+tlig
+LMRomanCaps10-Regular; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmromancaps10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanDemi10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromandemi10-oblique.otf]:+clig;+liga;+tlig
+LMRomanDemi10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromandemi10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMRomanDemi10-Oblique [/Users/bveytsman/Library/Fonts/lmromandemi10-oblique.otf]:+clig;+liga;+tlig
+LMRomanDemi10-Oblique; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmromandemi10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMRomanDemi10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromandemi10-regular.otf]:+clig;+liga;+tlig
+LMRomanDemi10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromandemi10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanDemi10-Regular [/Users/bveytsman/Library/Fonts/lmromandemi10-regular.otf]:+clig;+liga;+tlig
+LMRomanDemi10-Regular; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmromandemi10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanDunh10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromandunh10-oblique.otf]:+clig;+liga;+tlig
+LMRomanDunh10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromandunh10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMRomanDunh10-Oblique [/Users/bveytsman/Library/Fonts/lmromandunh10-oblique.otf]:+clig;+liga;+tlig
+LMRomanDunh10-Oblique; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmromandunh10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMRomanDunh10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromandunh10-regular.otf]:+clig;+liga;+tlig
+LMRomanDunh10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromandunh10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanDunh10-Regular [/Users/bveytsman/Library/Fonts/lmromandunh10-regular.otf]:+clig;+liga;+tlig
+LMRomanDunh10-Regular; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmromandunh10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanSlant10-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant10-bold.otf]:+clig;+liga;+tlig
+LMRomanSlant10-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant10-bold.otf]:+clig;+liga;+tlig;+onum
+LMRomanSlant10-Bold [/Users/bveytsman/Library/Fonts/lmromanslant10-bold.otf]:+clig;+liga;+tlig
+LMRomanSlant10-Bold; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmromanslant10-bold.otf]:+clig;+liga;+tlig;+onum
+LMRomanSlant10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant10-regular.otf]:+clig;+liga;+tlig
+LMRomanSlant10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanSlant10-Regular [/Users/bveytsman/Library/Fonts/lmromanslant10-regular.otf]:+clig;+liga;+tlig
+LMRomanSlant10-Regular; Oldstyle Figures [/Users/bveytsman/Library/Fonts/lmromanslant10-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanSlant12-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant12-regular.otf]:+clig;+liga;+tlig
+LMRomanSlant12-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant12-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanSlant17-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant17-regular.otf]:+clig;+liga;+tlig
+LMRomanSlant17-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant17-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanSlant8-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant8-regular.otf]:+clig;+liga;+tlig
+LMRomanSlant8-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant8-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanSlant9-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant9-regular.otf]:+clig;+liga;+tlig
+LMRomanSlant9-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanslant9-regular.otf]:+clig;+liga;+tlig;+onum
+LMRomanUnsl10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanunsl10-regular.otf]:+clig;+liga;+tlig
+LMRomanUnsl10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmromanunsl10-regular.otf]:+clig;+liga;+tlig;+onum
+LMSans10-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans10-bold.otf]:+clig;+liga;+tlig
+LMSans10-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans10-bold.otf]:+clig;+liga;+tlig;+onum
+LMSans10-BoldOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans10-boldoblique.otf]:+clig;+liga;+tlig
+LMSans10-BoldOblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans10-boldoblique.otf]:+clig;+liga;+tlig;+onum
+LMSans10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans10-oblique.otf]:+clig;+liga;+tlig
+LMSans10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMSans10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans10-regular.otf]:+clig;+liga;+tlig
+LMSans10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans10-regular.otf]:+clig;+liga;+tlig;+onum
+LMSans12-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans12-oblique.otf]:+clig;+liga;+tlig
+LMSans12-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans12-oblique.otf]:+clig;+liga;+tlig;+onum
+LMSans12-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans12-regular.otf]:+clig;+liga;+tlig
+LMSans12-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans12-regular.otf]:+clig;+liga;+tlig;+onum
+LMSans17-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans17-oblique.otf]:+clig;+liga;+tlig
+LMSans17-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans17-oblique.otf]:+clig;+liga;+tlig;+onum
+LMSans17-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans17-regular.otf]:+clig;+liga;+tlig
+LMSans17-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans17-regular.otf]:+clig;+liga;+tlig;+onum
+LMSans8-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans8-oblique.otf]:+clig;+liga;+tlig
+LMSans8-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans8-oblique.otf]:+clig;+liga;+tlig;+onum
+LMSans8-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans8-regular.otf]:+clig;+liga;+tlig
+LMSans8-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans8-regular.otf]:+clig;+liga;+tlig;+onum
+LMSans9-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans9-oblique.otf]:+clig;+liga;+tlig
+LMSans9-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans9-oblique.otf]:+clig;+liga;+tlig;+onum
+LMSans9-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans9-regular.otf]:+clig;+liga;+tlig
+LMSans9-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsans9-regular.otf]:+clig;+liga;+tlig;+onum
+LMSansDemiCond10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansdemicond10-oblique.otf]:+clig;+liga;+tlig
+LMSansDemiCond10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansdemicond10-oblique.otf]:+clig;+liga;+tlig;+onum
+LMSansDemiCond10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansdemicond10-regular.otf]:+clig;+liga;+tlig
+LMSansDemiCond10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansdemicond10-regular.otf]:+clig;+liga;+tlig;+onum
+LMSansQuot8-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansquot8-bold.otf]:+clig;+liga;+tlig
+LMSansQuot8-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansquot8-bold.otf]:+clig;+liga;+tlig;+onum
+LMSansQuot8-BoldOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansquot8-boldoblique.otf]:+clig;+liga;+tlig
+LMSansQuot8-BoldOblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansquot8-boldoblique.otf]:+clig;+liga;+tlig;+onum
+LMSansQuot8-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansquot8-oblique.otf]:+clig;+liga;+tlig
+LMSansQuot8-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansquot8-oblique.otf]:+clig;+liga;+tlig;+onum
+LMSansQuot8-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansquot8-regular.otf]:+clig;+liga;+tlig
+LMSansQuot8-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm/lmsansquot8-regular.otf]:+clig;+liga;+tlig;+onum
+LTC Bodoni 26 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBodoni26.otf]:+clig;+liga;+tlig
+LTC Caslon Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonBold.otf]:+clig;+liga;+tlig
+LTC Caslon Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonBoldItalic.otf]:+clig;+liga;+tlig
+LTC Caslon Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonItalic.otf]:+clig;+liga;+tlig
+LTC Caslon Long Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonBoldLong.otf]:+clig;+liga;+tlig
+LTC Caslon Long Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonBoldLongItalic.otf]:+clig;+liga;+tlig
+LTC Caslon Long Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonLongItalic.otf]:+clig;+liga;+tlig
+LTC Caslon Long Pro Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongBold.otf]:+clig;+liga;+tlig
+LTC Caslon Long Pro Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongBold.otf]:+clig;+liga;+tlig;+hist
+LTC Caslon Long Pro Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongBold.otf]:+clig;+liga;+tlig;+onum
+LTC Caslon Long Pro Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProBoldItalic.otf]:+clig;+liga;+tlig
+LTC Caslon Long Pro Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProBoldItalic.otf]:+clig;+liga;+tlig;+hist
+LTC Caslon Long Pro Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProBoldItalic.otf]:+clig;+liga;+tlig;+onum
+LTC Caslon Long Pro Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongItalic.otf]:+clig;+liga;+tlig
+LTC Caslon Long Pro Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongItalic.otf]:+clig;+liga;+tlig;+hist
+LTC Caslon Long Pro Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongItalic.otf]:+clig;+liga;+tlig;+onum
+LTC Caslon Long Pro Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongItalic.otf]:+clig;+liga;+tlig;+smcp
+LTC Caslon Long Pro Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongItalic.otf]:+clig;+liga;+tlig;+ss01
+LTC Caslon Long Pro Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongItalic.otf]:+clig;+liga;+tlig;+ss02
+LTC Caslon Long Pro Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongRegular.otf]:+clig;+liga;+tlig
+LTC Caslon Long Pro Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongRegular.otf]:+clig;+liga;+tlig;+hist
+LTC Caslon Long Pro Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongRegular.otf]:+clig;+liga;+tlig;+onum
+LTC Caslon Long Pro Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongRegular.otf]:+clig;+liga;+tlig;+smcp
+LTC Caslon Long Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonLong.otf]:+clig;+liga;+tlig
+LTC Caslon Long Swash Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonSwashLong.otf]:+clig;+liga;+tlig
+LTC Caslon Pro Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProBold.otf]:+clig;+liga;+tlig
+LTC Caslon Pro Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProBold.otf]:+clig;+liga;+tlig;+hist
+LTC Caslon Pro Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProBold.otf]:+clig;+liga;+tlig;+onum
+LTC Caslon Pro Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongBoldItalic.otf]:+clig;+liga;+tlig
+LTC Caslon Pro Bold Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongBoldItalic.otf]:+clig;+liga;+tlig;+hist
+LTC Caslon Pro Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProLongBoldItalic.otf]:+clig;+liga;+tlig;+onum
+LTC Caslon Pro Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProItalic.otf]:+clig;+liga;+tlig
+LTC Caslon Pro Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProItalic.otf]:+clig;+liga;+tlig;+hist
+LTC Caslon Pro Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProItalic.otf]:+clig;+liga;+tlig;+onum
+LTC Caslon Pro Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProItalic.otf]:+clig;+liga;+tlig;+smcp
+LTC Caslon Pro Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProItalic.otf]:+clig;+liga;+tlig;+ss01
+LTC Caslon Pro Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProItalic.otf]:+clig;+liga;+tlig;+ss02
+LTC Caslon Pro Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProRegular.otf]:+clig;+liga;+tlig
+LTC Caslon Pro Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProRegular.otf]:+clig;+liga;+tlig;+hist
+LTC Caslon Pro Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProRegular.otf]:+clig;+liga;+tlig;+onum
+LTC Caslon Pro Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonProRegular.otf]:+clig;+liga;+tlig;+smcp
+LTC Caslon Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslon.otf]:+clig;+liga;+tlig
+LTC Caslon Remix [/usr/local/texlive/texmf-local/fonts/truetype/p22/LTCCaslonRemix.ttf]:+clig;+liga;+tlig
+LTC Caslon SmallCaps Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonItalicSmallCaps.otf]:+clig;+liga;+tlig
+LTC Caslon SmallCaps Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonSmallCaps.otf]:+clig;+liga;+tlig
+LTC Caslon Swash Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCaslon/LTCaslonSwash.otf]:+clig;+liga;+tlig
+LTC Creepy Ornaments Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCreepyOrnaments/LTCCreepyOrnaments.otf]:+clig;+liga;+tlig
+LTC Goudy Oldstyle Pro [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGoudyOldstyleProRegular.otf]:+clig;+liga;+tlig
+LTC Goudy Oldstyle Pro; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGoudyOldstyleProRegular.otf]:+clig;+liga;+tlig;+hist
+LTC Goudy Oldstyle Pro; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGoudyOldstyleProRegular.otf]:+clig;+liga;+tlig;+onum
+LTC Goudy Oldstyle Pro; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGoudyOldstyleProRegular.otf]:+clig;+liga;+tlig;+smcp
+LTC Goudy Oldstyle Pro; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGoudyOldstyleProRegular.otf]:+clig;+liga;+tlig;+ss01
+LTC Ornamental Initials Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCOrnamentalInitials/LTCOrnamentalInitials.otf]:+clig;+liga;+tlig
+LTC Remington Typewriter Pro Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCRemington/LTCRemingtonTypewriterProItalic.otf]:+clig;+liga;+tlig
+LTCArtscriptPro [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCArtscript/LTCArtscriptPro.otf]:+clig;+liga;+tlig
+LTCArtscriptPro; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCArtscript/LTCArtscriptPro.otf]:+clig;+liga;+tlig;+hist
+LTCArtscriptPro; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCArtscript/LTCArtscriptPro.otf]:+clig;+liga;+tlig;+ss01
+LTCArtscriptPro; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCArtscript/LTCArtscriptPro.otf]:+clig;+liga;+tlig;+ss02
+LTCArtscriptPro; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCArtscript/LTCArtscriptPro.otf]:+clig;+liga;+tlig;+swsh
+LTCBodoni175 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175Rom.otf]:+clig;+liga;+tlig
+LTCBodoni175-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175Ita.otf]:+clig;+liga;+tlig
+LTCBodoni175Pro [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProRom.otf]:+clig;+liga;+tlig
+LTCBodoni175Pro; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProRom.otf]:+clig;+liga;+tlig;+hist
+LTCBodoni175Pro; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProRom.otf]:+clig;+liga;+tlig;+onum
+LTCBodoni175Pro; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProRom.otf]:+clig;+liga;+tlig;+smcp
+LTCBodoni175Pro; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProRom.otf]:+clig;+liga;+tlig;+ss01
+LTCBodoni175Pro; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProRom.otf]:+clig;+liga;+tlig;+ss02
+LTCBodoni175Pro-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProIta.otf]:+clig;+liga;+tlig
+LTCBodoni175Pro-Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProIta.otf]:+clig;+liga;+tlig;+hist
+LTCBodoni175Pro-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProIta.otf]:+clig;+liga;+tlig;+onum
+LTCBodoni175Pro-Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProIta.otf]:+clig;+liga;+tlig;+smcp
+LTCBodoni175Pro-Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProIta.otf]:+clig;+liga;+tlig;+ss01
+LTCBodoni175Pro-Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175ProIta.otf]:+clig;+liga;+tlig;+ss02
+LTCBodoni175SmallCaps [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175SCRom.otf]:+clig;+liga;+tlig
+LTCBodoni175SmallCaps-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBod175SCIta.otf]:+clig;+liga;+tlig
+LTCBodoniBold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBodonBdR.otf]:+clig;+liga;+tlig
+LTCBodoniBoldOSF [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBodonBdOSF.otf]:+clig;+liga;+tlig
+LTCBodoniBoldPro [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBodBldPro.otf]:+clig;+liga;+tlig
+LTCBodoniBoldPro; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBodBldPro.otf]:+clig;+liga;+tlig;+hist
+LTCBodoniBoldPro; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBodBldPro.otf]:+clig;+liga;+tlig;+onum
+LTCBodoniBoldPro; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBodBldPro.otf]:+clig;+liga;+tlig;+smcp
+LTCBodoniBoldSmallCapsOSF [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBodonBdCOSF.otf]:+clig;+liga;+tlig
+LTCBodoniBoldSmallcaps [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCBodoni/LTCBodonBdSC.otf]:+clig;+liga;+tlig
+LTCCalifornianDisplay [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspReg.otf]:+clig;+liga;+tlig
+LTCCalifornianDisplay-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspItl.otf]:+clig;+liga;+tlig
+LTCCalifornianDisplaySC [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspSC.otf]:+clig;+liga;+tlig
+LTCCalifornianProDisplay [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspRegPro.otf]:+clig;+liga;+tlig
+LTCCalifornianProDisplay; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspRegPro.otf]:+clig;+liga;+tlig;+hist
+LTCCalifornianProDisplay; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspRegPro.otf]:+clig;+liga;+tlig;+onum
+LTCCalifornianProDisplay; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspRegPro.otf]:+clig;+liga;+tlig;+smcp
+LTCCalifornianProDisplay-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspItlPro.otf]:+clig;+liga;+tlig
+LTCCalifornianProDisplay-Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspItlPro.otf]:+clig;+liga;+tlig;+hist
+LTCCalifornianProDisplay-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspItlPro.otf]:+clig;+liga;+tlig;+onum
+LTCCalifornianProDisplay-Italic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifDspItlPro.otf]:+clig;+liga;+tlig;+swsh
+LTCCalifornianProText [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtRegPro.otf]:+clig;+liga;+tlig
+LTCCalifornianProText; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtRegPro.otf]:+clig;+liga;+tlig;+hist
+LTCCalifornianProText; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtRegPro.otf]:+clig;+liga;+tlig;+onum
+LTCCalifornianProText; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtRegPro.otf]:+clig;+liga;+tlig;+smcp
+LTCCalifornianProText-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtItlPro.otf]:+clig;+liga;+tlig
+LTCCalifornianProText-Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtItlPro.otf]:+clig;+liga;+tlig;+hist
+LTCCalifornianProText-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtItlPro.otf]:+clig;+liga;+tlig;+onum
+LTCCalifornianProText-Italic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtItlPro.otf]:+clig;+liga;+tlig;+swsh
+LTCCalifornianText [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtReg.otf]:+clig;+liga;+tlig
+LTCCalifornianText-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtItl.otf]:+clig;+liga;+tlig
+LTCCalifornianTextSC [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtSC.otf]:+clig;+liga;+tlig
+LTCCalifornianTextSwash-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCCalifornian/LTCCalifTxtSwsh.otf]:+clig;+liga;+tlig
+LTCGaramontDisplay [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDis.otf]:+clig;+liga;+tlig
+LTCGaramontDisplay-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDisIta.otf]:+clig;+liga;+tlig
+LTCGaramontDisplayOSF [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDisOSF.otf]:+clig;+liga;+tlig
+LTCGaramontDisplayOSF-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDisOSFIta.otf]:+clig;+liga;+tlig
+LTCGaramontDisplaySmallcaps [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDisSCOSF.otf]:+clig;+liga;+tlig
+LTCGaramontDisplaySwash-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDisSwaIta.otf]:+clig;+liga;+tlig
+LTCGaramontProDisplay [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspPro.otf]:+clig;+liga;+tlig
+LTCGaramontProDisplay; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspPro.otf]:+clig;+liga;+tlig;+hist
+LTCGaramontProDisplay; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspPro.otf]:+clig;+liga;+tlig;+onum
+LTCGaramontProDisplay; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspPro.otf]:+clig;+liga;+tlig;+smcp
+LTCGaramontProDisplay; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspPro.otf]:+clig;+liga;+tlig;+ss01
+LTCGaramontProDisplay; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspPro.otf]:+clig;+liga;+tlig;+ss02
+LTCGaramontProDisplay; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspPro.otf]:+clig;+liga;+tlig;+ss03
+LTCGaramontProDisplay-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspProItl.otf]:+clig;+liga;+tlig
+LTCGaramontProDisplay-Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspProItl.otf]:+clig;+liga;+tlig;+hist
+LTCGaramontProDisplay-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspProItl.otf]:+clig;+liga;+tlig;+onum
+LTCGaramontProDisplay-Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspProItl.otf]:+clig;+liga;+tlig;+ss01
+LTCGaramontProDisplay-Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspProItl.otf]:+clig;+liga;+tlig;+ss02
+LTCGaramontProDisplay-Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspProItl.otf]:+clig;+liga;+tlig;+ss03
+LTCGaramontProDisplay-Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspProItl.otf]:+clig;+liga;+tlig;+ss04
+LTCGaramontProDisplay-Italic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarDspProItl.otf]:+clig;+liga;+tlig;+swsh
+LTCGaramontProText [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtPro.otf]:+clig;+liga;+tlig
+LTCGaramontProText; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtPro.otf]:+clig;+liga;+tlig;+hist
+LTCGaramontProText; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtPro.otf]:+clig;+liga;+tlig;+onum
+LTCGaramontProText; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtPro.otf]:+clig;+liga;+tlig;+smcp
+LTCGaramontProText; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtPro.otf]:+clig;+liga;+tlig;+ss01
+LTCGaramontProText; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtPro.otf]:+clig;+liga;+tlig;+ss02
+LTCGaramontProText; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtPro.otf]:+clig;+liga;+tlig;+ss03
+LTCGaramontProText-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtProItl.otf]:+clig;+liga;+tlig
+LTCGaramontProText-Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtProItl.otf]:+clig;+liga;+tlig;+hist
+LTCGaramontProText-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtProItl.otf]:+clig;+liga;+tlig;+onum
+LTCGaramontProText-Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtProItl.otf]:+clig;+liga;+tlig;+ss01
+LTCGaramontProText-Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtProItl.otf]:+clig;+liga;+tlig;+ss02
+LTCGaramontProText-Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtProItl.otf]:+clig;+liga;+tlig;+ss03
+LTCGaramontProText-Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtProItl.otf]:+clig;+liga;+tlig;+ss04
+LTCGaramontProText-Italic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGarTxtProItl.otf]:+clig;+liga;+tlig;+swsh
+LTCGaramontText [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGaramTex.otf]:+clig;+liga;+tlig
+LTCGaramontText-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGaramTexIt.otf]:+clig;+liga;+tlig
+LTCGaramontTextOSF [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGaramTexOSF.otf]:+clig;+liga;+tlig
+LTCGaramontTextOSF-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGaramTexItOSF.otf]:+clig;+liga;+tlig
+LTCGaramontTextSmallcaps [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGaramTexSC.otf]:+clig;+liga;+tlig
+LTCGaramontTextSwash-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGaramont/LTCGaramTexItSwa.otf]:+clig;+liga;+tlig
+LTCGoudyHandtooled [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyHand.otf]:+clig;+liga;+tlig
+LTCGoudyHandtooled-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyHndItl.otf]:+clig;+liga;+tlig
+LTCGoudyHandtooledCursive [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyHndCrsv.otf]:+clig;+liga;+tlig
+LTCGoudyInitials [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyInitials/LTCGoudyInitNew.otf]:+clig;+liga;+tlig
+LTCGoudyInitials [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyInitialsNew/LTCGoudyInitNew.otf]:+clig;+liga;+tlig
+LTCGoudyInitialsFill [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyInitials/LTCGoudyInitFill.otf]:+clig;+liga;+tlig
+LTCGoudyInitialsFlora [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyInitials/LTCGoudyInitFlora.otf]:+clig;+liga;+tlig
+LTCGoudyOldstyle [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldReg.otf]:+clig;+liga;+tlig
+LTCGoudyOldstyle-Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldBld.otf]:+clig;+liga;+tlig
+LTCGoudyOldstyle-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldBldItal.otf]:+clig;+liga;+tlig
+LTCGoudyOldstyle-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldItl.otf]:+clig;+liga;+tlig
+LTCGoudyOldstyleCursive [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldCrsv.otf]:+clig;+liga;+tlig
+LTCGoudyOldstyleCursive-Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldBldCrsv.otf]:+clig;+liga;+tlig
+LTCGoudyOldstylePro-Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProBldReg.otf]:+clig;+liga;+tlig
+LTCGoudyOldstylePro-Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProBldReg.otf]:+clig;+liga;+tlig;+hist
+LTCGoudyOldstylePro-Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProBldReg.otf]:+clig;+liga;+tlig;+ss01
+LTCGoudyOldstylePro-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProBldItal.otf]:+clig;+liga;+tlig
+LTCGoudyOldstylePro-BoldItalic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProBldItal.otf]:+clig;+liga;+tlig;+hist
+LTCGoudyOldstylePro-BoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProBldItal.otf]:+clig;+liga;+tlig;+ss01
+LTCGoudyOldstylePro-BoldItalic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProBldItal.otf]:+clig;+liga;+tlig;+swsh
+LTCGoudyOldstylePro-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProItl.otf]:+clig;+liga;+tlig
+LTCGoudyOldstylePro-Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProItl.otf]:+clig;+liga;+tlig;+hist
+LTCGoudyOldstylePro-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProItl.otf]:+clig;+liga;+tlig;+onum
+LTCGoudyOldstylePro-Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProItl.otf]:+clig;+liga;+tlig;+smcp
+LTCGoudyOldstylePro-Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProItl.otf]:+clig;+liga;+tlig;+ss01
+LTCGoudyOldstylePro-Italic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldsProItl.otf]:+clig;+liga;+tlig;+swsh
+LTCGoudyOldstyleSC [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldSC.otf]:+clig;+liga;+tlig
+LTCGoudyOldstyleSC-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyOldStyle/LTCGdyOldItlSC.otf]:+clig;+liga;+tlig
+LTCGoudyText [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyText/LTCGdyTxtReg.otf]:+clig;+liga;+tlig
+LTCGoudyTextLombardicCaps [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyText/LTCGdyTxtLmbReg.otf]:+clig;+liga;+tlig
+LTCGoudyTextLombardicShaded [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyText/LTCGdyTxtLmbShd.otf]:+clig;+liga;+tlig
+LTCGoudyTextPro [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyText/LTCGdyTxtProReg.otf]:+clig;+liga;+tlig
+LTCGoudyTextPro; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyText/LTCGdyTxtProReg.otf]:+clig;+liga;+tlig;+hist
+LTCGoudyTextPro; Titling [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyText/LTCGdyTxtProReg.otf]:+clig;+liga;+tlig;+titl
+LTCGoudyTextProShaded [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyText/LTCGdyTxtProShd.otf]:+clig;+liga;+tlig
+LTCGoudyTextProShaded; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyText/LTCGdyTxtProShd.otf]:+clig;+liga;+tlig;+hist
+LTCGoudyTextProShaded; Titling [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyText/LTCGdyTxtProShd.otf]:+clig;+liga;+tlig;+titl
+LTCGoudyTextShaded [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCGoudyText/LTCGdyTxtShd.otf]:+clig;+liga;+tlig
+LTCJacobeanInitialsA [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCJacobeanInitials/LTCJacobIniA.otf]:+clig;+liga;+tlig
+LTCJacobeanInitialsB [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCJacobeanInitials/LTCJacobIniB.otf]:+clig;+liga;+tlig
+LTCJacobeanInitialsC [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCJacobeanInitials/LTCJacobIniC.otf]:+clig;+liga;+tlig
+LTCJacobeanInitialsD [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCJacobeanInitials/LTCJacobIniD.otf]:+clig;+liga;+tlig
+LTCJacobeanInitialsFramedA [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCJacobeanInitials/LTCJacobIniFA.otf]:+clig;+liga;+tlig
+LTCJacobeanInitialsFramedB [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCJacobeanInitials/LTCJacobIniFB.otf]:+clig;+liga;+tlig
+LTCJacobeanInitialsFramedC [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCJacobeanInitials/LTCJacobIniFC.otf]:+clig;+liga;+tlig
+LTCJacobeanInitialsFramedD [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCJacobeanInitials/LTCJacobIniFD.otf]:+clig;+liga;+tlig
+LTCKennerley [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKen.otf]:+clig;+liga;+tlig
+LTCKennerley-Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKenBol.otf]:+clig;+liga;+tlig
+LTCKennerley-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKenBolIta.otf]:+clig;+liga;+tlig
+LTCKennerley-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKenIta.otf]:+clig;+liga;+tlig
+LTCKennerleyOpenCaps [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKenOpeCap.otf]:+clig;+liga;+tlig
+LTCKennerleyPro-Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProBold.otf]:+clig;+liga;+tlig
+LTCKennerleyPro-Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProBold.otf]:+clig;+liga;+tlig;+onum
+LTCKennerleyPro-Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProBold.otf]:+clig;+liga;+tlig;+smcp
+LTCKennerleyPro-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProBoldItalic.otf]:+clig;+liga;+tlig
+LTCKennerleyPro-BoldItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProBoldItalic.otf]:+clig;+liga;+tlig;+onum
+LTCKennerleyPro-BoldItalic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+LTCKennerleyPro-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProItalic.otf]:+clig;+liga;+tlig
+LTCKennerleyPro-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProItalic.otf]:+clig;+liga;+tlig;+onum
+LTCKennerleyPro-Italic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProItalic.otf]:+clig;+liga;+tlig;+swsh
+LTCKennerleyPro-Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProRegular.otf]:+clig;+liga;+tlig
+LTCKennerleyPro-Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProRegular.otf]:+clig;+liga;+tlig;+onum
+LTCKennerleyPro-Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProRegular.otf]:+clig;+liga;+tlig;+smcp
+LTCKennerleyPro-Regular; Titling [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKennerleyProRegular.otf]:+clig;+liga;+tlig;+titl
+LTCKennerleySmallCaps [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKenSmaCap.otf]:+clig;+liga;+tlig
+LTCKennerleySmallCaps-Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKenBolSmaCap.otf]:+clig;+liga;+tlig
+LTCKennerleySwash [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKenSwa.otf]:+clig;+liga;+tlig
+LTCKennerleySwash-Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCKennerley/LTCKenSwaBol.otf]:+clig;+liga;+tlig
+LTCRemingtonTypewriter [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCRemington/LTCRemType.otf]:+clig;+liga;+tlig
+LTCRemingtonTypewriter-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCRemington/LTCRemItal.otf]:+clig;+liga;+tlig
+LTCRemingtonTypewriterPro [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCRemington/LTCRemingtonTypewriterPro.otf]:+clig;+liga;+tlig
+LTCSpire [/usr/local/texlive/texmf-local/fonts/opentype/p22/LTCSpire/LTCSpire.otf]:+clig;+liga;+tlig
+Lab DJR Basic Dot [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Dot.ttf]:+clig;+liga;+tlig
+Lab DJR Basic Dot; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Dot.ttf]:+clig;+liga;+tlig;+ss01
+Lab DJR Basic Dot; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Dot.ttf]:+clig;+liga;+tlig;+ss02
+Lab DJR Basic Dot; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Dot.ttf]:+clig;+liga;+tlig;+ss03
+Lab DJR Basic Fancy [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Fancy.ttf]:+clig;+liga;+tlig
+Lab DJR Basic Fancy; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Fancy.ttf]:+clig;+liga;+tlig;+ss01
+Lab DJR Basic Fancy; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Fancy.ttf]:+clig;+liga;+tlig;+ss02
+Lab DJR Basic Fancy; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Fancy.ttf]:+clig;+liga;+tlig;+ss03
+Lab DJR Basic Floret [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Floret.ttf]:+clig;+liga;+tlig
+Lab DJR Basic Floret; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Floret.ttf]:+clig;+liga;+tlig;+ss01
+Lab DJR Basic Floret; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Floret.ttf]:+clig;+liga;+tlig;+ss02
+Lab DJR Basic Floret; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Floret.ttf]:+clig;+liga;+tlig;+ss03
+Lab DJR Basic Ghost [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Ghost.ttf]:+clig;+liga;+tlig
+Lab DJR Basic Ghost; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Ghost.ttf]:+clig;+liga;+tlig;+ss01
+Lab DJR Basic Ghost; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Ghost.ttf]:+clig;+liga;+tlig;+ss02
+Lab DJR Basic Ghost; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Ghost.ttf]:+clig;+liga;+tlig;+ss03
+Lab DJR Basic Pixel [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Pixel.ttf]:+clig;+liga;+tlig
+Lab DJR Basic Pixel; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Pixel.ttf]:+clig;+liga;+tlig;+ss01
+Lab DJR Basic Pixel; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Pixel.ttf]:+clig;+liga;+tlig;+ss02
+Lab DJR Basic Pixel; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Pixel.ttf]:+clig;+liga;+tlig;+ss03
+Lab DJR Basic Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Regular.ttf]:+clig;+liga;+tlig
+Lab DJR Basic Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Lab DJR Basic Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Lab DJR Basic Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRBasic-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Lab DJR Color SVG Dot [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Dot.otf]:+clig;+liga;+tlig
+Lab DJR Color SVG Dot; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Dot.otf]:+clig;+liga;+tlig;+ss01
+Lab DJR Color SVG Dot; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Dot.otf]:+clig;+liga;+tlig;+ss02
+Lab DJR Color SVG Dot; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Dot.otf]:+clig;+liga;+tlig;+ss03
+Lab DJR Color SVG Fancy [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Fancy.otf]:+clig;+liga;+tlig
+Lab DJR Color SVG Fancy; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Fancy.otf]:+clig;+liga;+tlig;+ss01
+Lab DJR Color SVG Fancy; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Fancy.otf]:+clig;+liga;+tlig;+ss02
+Lab DJR Color SVG Fancy; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Fancy.otf]:+clig;+liga;+tlig;+ss03
+Lab DJR Color SVG Floret [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Floret.otf]:+clig;+liga;+tlig
+Lab DJR Color SVG Floret; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Floret.otf]:+clig;+liga;+tlig;+ss01
+Lab DJR Color SVG Floret; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Floret.otf]:+clig;+liga;+tlig;+ss02
+Lab DJR Color SVG Floret; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Floret.otf]:+clig;+liga;+tlig;+ss03
+Lab DJR Color SVG Ghost [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Ghost.otf]:+clig;+liga;+tlig
+Lab DJR Color SVG Ghost; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Ghost.otf]:+clig;+liga;+tlig;+ss01
+Lab DJR Color SVG Ghost; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Ghost.otf]:+clig;+liga;+tlig;+ss02
+Lab DJR Color SVG Ghost; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Ghost.otf]:+clig;+liga;+tlig;+ss03
+Lab DJR Color SVG Pixel [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Pixel.otf]:+clig;+liga;+tlig
+Lab DJR Color SVG Pixel; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Pixel.otf]:+clig;+liga;+tlig;+ss01
+Lab DJR Color SVG Pixel; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Pixel.otf]:+clig;+liga;+tlig;+ss02
+Lab DJR Color SVG Pixel; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Pixel.otf]:+clig;+liga;+tlig;+ss03
+Lab DJR Color SVG Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig
+Lab DJR Color SVG Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss01
+Lab DJR Color SVG Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss02
+Lab DJR Color SVG Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/LabDJR/LabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss03
+Lab DJR Color Variable [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRColorVariable_SIZE,BEVL,OVAL,SPRK,QUAD,XSWP,YSWP_-colr-cpal.ttf]:+clig;+liga;+tlig
+Lab DJR Color Variable; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRColorVariable_SIZE,BEVL,OVAL,SPRK,QUAD,XSWP,YSWP_-colr-cpal.ttf]:+clig;+liga;+tlig;+ss01
+Lab DJR Color Variable; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRColorVariable_SIZE,BEVL,OVAL,SPRK,QUAD,XSWP,YSWP_-colr-cpal.ttf]:+clig;+liga;+tlig;+ss02
+Lab DJR Color Variable; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRColorVariable_SIZE,BEVL,OVAL,SPRK,QUAD,XSWP,YSWP_-colr-cpal.ttf]:+clig;+liga;+tlig;+ss03
+Lab DJR Variable [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRVariable_SIZE,BEVL,OVAL,SPRK,QUAD,XSWP,YSWP_.ttf]:+clig;+liga;+tlig
+Lab DJR Variable; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRVariable_SIZE,BEVL,OVAL,SPRK,QUAD,XSWP,YSWP_.ttf]:+clig;+liga;+tlig;+ss01
+Lab DJR Variable; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRVariable_SIZE,BEVL,OVAL,SPRK,QUAD,XSWP,YSWP_.ttf]:+clig;+liga;+tlig;+ss02
+Lab DJR Variable; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/LabDJR/LabDJRVariable_SIZE,BEVL,OVAL,SPRK,QUAD,XSWP,YSWP_.ttf]:+clig;+liga;+tlig;+ss03
+Laksaman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Laksaman.otf]:+clig;+liga;+tlig
+Laksaman Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Laksaman-Bold.otf]:+clig;+liga;+tlig
+Laksaman Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Laksaman-BoldItalic.otf]:+clig;+liga;+tlig
+Laksaman Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Laksaman-Italic.otf]:+clig;+liga;+tlig
+LatinModernMath-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lm-math/latinmodern-math.otf]:+clig;+liga;+tlig
+Lato Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Black.ttf]:+clig;+liga;+tlig
+Lato Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Black.ttf]:+clig;+liga;+tlig;+onum
+Lato Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Black.ttf]:+clig;+liga;+tlig;+ss01
+Lato Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Black.ttf]:+clig;+liga;+tlig;+ss02
+Lato Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Black.ttf]:+clig;+liga;+tlig;+ss03
+Lato Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Black.ttf]:+clig;+liga;+tlig;+ss04
+Lato Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BlackItalic.ttf]:+clig;+liga;+tlig
+Lato Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Lato Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Lato Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Lato Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Lato Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BlackItalic.ttf]:+clig;+liga;+tlig;+ss04
+Lato Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Bold.ttf]:+clig;+liga;+tlig
+Lato Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Bold.ttf]:+clig;+liga;+tlig;+onum
+Lato Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Lato Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Lato Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Lato Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Lato Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BoldItalic.ttf]:+clig;+liga;+tlig
+Lato Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Lato Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Lato Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Lato Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Lato Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Lato Hairline [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Hairline.ttf]:+clig;+liga;+tlig
+Lato Hairline; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Hairline.ttf]:+clig;+liga;+tlig;+onum
+Lato Hairline; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Hairline.ttf]:+clig;+liga;+tlig;+ss01
+Lato Hairline; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Hairline.ttf]:+clig;+liga;+tlig;+ss02
+Lato Hairline; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Hairline.ttf]:+clig;+liga;+tlig;+ss03
+Lato Hairline; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Hairline.ttf]:+clig;+liga;+tlig;+ss04
+Lato Hairline Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HairlineItalic.ttf]:+clig;+liga;+tlig
+Lato Hairline Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HairlineItalic.ttf]:+clig;+liga;+tlig;+onum
+Lato Hairline Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HairlineItalic.ttf]:+clig;+liga;+tlig;+ss01
+Lato Hairline Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HairlineItalic.ttf]:+clig;+liga;+tlig;+ss02
+Lato Hairline Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HairlineItalic.ttf]:+clig;+liga;+tlig;+ss03
+Lato Hairline Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HairlineItalic.ttf]:+clig;+liga;+tlig;+ss04
+Lato Heavy [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Heavy.ttf]:+clig;+liga;+tlig
+Lato Heavy; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Heavy.ttf]:+clig;+liga;+tlig;+onum
+Lato Heavy; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Heavy.ttf]:+clig;+liga;+tlig;+ss01
+Lato Heavy; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Heavy.ttf]:+clig;+liga;+tlig;+ss02
+Lato Heavy; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Heavy.ttf]:+clig;+liga;+tlig;+ss03
+Lato Heavy; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Heavy.ttf]:+clig;+liga;+tlig;+ss04
+Lato Heavy Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HeavyItalic.ttf]:+clig;+liga;+tlig
+Lato Heavy Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HeavyItalic.ttf]:+clig;+liga;+tlig;+onum
+Lato Heavy Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HeavyItalic.ttf]:+clig;+liga;+tlig;+ss01
+Lato Heavy Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HeavyItalic.ttf]:+clig;+liga;+tlig;+ss02
+Lato Heavy Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HeavyItalic.ttf]:+clig;+liga;+tlig;+ss03
+Lato Heavy Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-HeavyItalic.ttf]:+clig;+liga;+tlig;+ss04
+Lato Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Italic.ttf]:+clig;+liga;+tlig
+Lato Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Italic.ttf]:+clig;+liga;+tlig;+onum
+Lato Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Lato Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Lato Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Lato Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Lato Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Light.ttf]:+clig;+liga;+tlig
+Lato Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Light.ttf]:+clig;+liga;+tlig;+onum
+Lato Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Light.ttf]:+clig;+liga;+tlig;+ss01
+Lato Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Light.ttf]:+clig;+liga;+tlig;+ss02
+Lato Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Light.ttf]:+clig;+liga;+tlig;+ss03
+Lato Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Light.ttf]:+clig;+liga;+tlig;+ss04
+Lato Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-LightItalic.ttf]:+clig;+liga;+tlig
+Lato Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Lato Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Lato Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-LightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Lato Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-LightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Lato Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-LightItalic.ttf]:+clig;+liga;+tlig;+ss04
+Lato Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Medium.ttf]:+clig;+liga;+tlig
+Lato Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Medium.ttf]:+clig;+liga;+tlig;+onum
+Lato Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Lato Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Lato Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Lato Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Medium.ttf]:+clig;+liga;+tlig;+ss04
+Lato Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-MediumItalic.ttf]:+clig;+liga;+tlig
+Lato Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-MediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Lato Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-MediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Lato Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-MediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Lato Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-MediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Lato Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-MediumItalic.ttf]:+clig;+liga;+tlig;+ss04
+Lato Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Regular.ttf]:+clig;+liga;+tlig
+Lato Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Regular.ttf]:+clig;+liga;+tlig;+onum
+Lato Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Lato Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Lato Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Lato Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Lato Semibold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Semibold.ttf]:+clig;+liga;+tlig
+Lato Semibold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Semibold.ttf]:+clig;+liga;+tlig;+onum
+Lato Semibold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Semibold.ttf]:+clig;+liga;+tlig;+ss01
+Lato Semibold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Semibold.ttf]:+clig;+liga;+tlig;+ss02
+Lato Semibold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Semibold.ttf]:+clig;+liga;+tlig;+ss03
+Lato Semibold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Semibold.ttf]:+clig;+liga;+tlig;+ss04
+Lato Semibold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-SemiboldItalic.ttf]:+clig;+liga;+tlig
+Lato Semibold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-SemiboldItalic.ttf]:+clig;+liga;+tlig;+onum
+Lato Semibold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Lato Semibold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Lato Semibold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Lato Semibold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-SemiboldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Lato Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Thin.ttf]:+clig;+liga;+tlig
+Lato Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Thin.ttf]:+clig;+liga;+tlig;+onum
+Lato Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Thin.ttf]:+clig;+liga;+tlig;+ss01
+Lato Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Thin.ttf]:+clig;+liga;+tlig;+ss02
+Lato Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Thin.ttf]:+clig;+liga;+tlig;+ss03
+Lato Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-Thin.ttf]:+clig;+liga;+tlig;+ss04
+Lato Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-ThinItalic.ttf]:+clig;+liga;+tlig
+Lato Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-ThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Lato Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-ThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Lato Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-ThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Lato Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-ThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Lato Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/typoland/lato/Lato-ThinItalic.ttf]:+clig;+liga;+tlig;+ss04
+Lete Sans Math [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lete-sans-math/LeteSansMath.otf]:+clig;+liga;+tlig
+Lete Sans Math; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lete-sans-math/LeteSansMath.otf]:+clig;+liga;+tlig;+onum
+Lete Sans Math; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lete-sans-math/LeteSansMath.otf]:+clig;+liga;+tlig;+ss06
+Lete Sans Math; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lete-sans-math/LeteSansMath.otf]:+clig;+liga;+tlig;+ss08
+Lete Sans Math; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lete-sans-math/LeteSansMath.otf]:+clig;+liga;+tlig;+ss09
+Lete Sans Math; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lete-sans-math/LeteSansMath.otf]:+clig;+liga;+tlig;+ssty
+Lete Sans Math Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lete-sans-math/LeteSansMath-Bold.otf]:+clig;+liga;+tlig
+Lete Sans Math Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lete-sans-math/LeteSansMath-Bold.otf]:+clig;+liga;+tlig;+onum
+Lete Sans Math Bold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/lete-sans-math/LeteSansMath-Bold.otf]:+clig;+liga;+tlig;+ss08
+LevType Repyakh UA Bold [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Bold.ttf]:+clig;+liga;+tlig
+LevType Repyakh UA Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Bold.ttf]:+clig;+liga;+tlig;+onum
+LevType Repyakh UA Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Bold.ttf]:+clig;+liga;+tlig;+ss01
+LevType Repyakh UA Light [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Light.ttf]:+clig;+liga;+tlig
+LevType Repyakh UA Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Light.ttf]:+clig;+liga;+tlig;+onum
+LevType Repyakh UA Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Light.ttf]:+clig;+liga;+tlig;+ss01
+LevType Repyakh UA Medium [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Medium.ttf]:+clig;+liga;+tlig
+LevType Repyakh UA Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Medium.ttf]:+clig;+liga;+tlig;+onum
+LevType Repyakh UA Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Medium.ttf]:+clig;+liga;+tlig;+ss01
+LevType Repyakh UA Regular [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Regular.ttf]:+clig;+liga;+tlig
+LevType Repyakh UA Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Regular.ttf]:+clig;+liga;+tlig;+onum
+LevType Repyakh UA Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/LevType/LevTypeRepyakhUA/LevTypeRepyakhUA-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Lexend Deca Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendDeca-Regular.ttf]:+clig;+liga;+tlig
+Lexend Deca Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendDeca-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Lexend Exa Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendExa-Regular.ttf]:+clig;+liga;+tlig
+Lexend Exa Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendExa-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Lexend Giga Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendGiga-Regular.ttf]:+clig;+liga;+tlig
+Lexend Giga Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendGiga-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Lexend Mega Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendMega-Regular.ttf]:+clig;+liga;+tlig
+Lexend Mega Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendMega-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Lexend Peta Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendPeta-Regular.ttf]:+clig;+liga;+tlig
+Lexend Peta Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendPeta-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Lexend Tera Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendTera-Regular.ttf]:+clig;+liga;+tlig
+Lexend Tera Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendTera-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Lexend Zetta Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendZetta-Regular.ttf]:+clig;+liga;+tlig
+Lexend Zetta Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/lexend/LexendZetta-Regular.ttf]:+clig;+liga;+tlig;+ss01
+LfAAluminia [/usr/local/texlive/texmf-local/fonts/opentype/LfA/LfAAluminia-Roman.otf]:+clig;+liga;+tlig
+LfAAluminia; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/LfA/LfAAluminia-Roman.otf]:+clig;+liga;+tlig;+smcp
+LfAAluminia; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/LfA/LfAAluminia-Roman.otf]:+clig;+liga;+tlig;+ss01
+LfAAluminia Italic [/usr/local/texlive/texmf-local/fonts/opentype/LfA/LfAAluminia-Italic.otf]:+clig;+liga;+tlig
+LfAAluminiaOriginal [/usr/local/texlive/texmf-local/fonts/opentype/LfA/LfAAluminiaOriginal-Roman.otf]:+clig;+liga;+tlig
+LfAAluminiaOriginal; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/LfA/LfAAluminiaOriginal-Roman.otf]:+clig;+liga;+tlig;+smcp
+LfAAluminiaOriginal; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/LfA/LfAAluminiaOriginal-Roman.otf]:+clig;+liga;+tlig;+ss01
+LfAAluminiaOriginal Italic [/usr/local/texlive/texmf-local/fonts/opentype/LfA/LfAAluminiaOriginal-Italic.otf]:+clig;+liga;+tlig
+Libertinus Keyboard Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusKeyboard-Regular.otf]:+clig;+liga;+tlig
+Libertinus Math Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusMath-Regular.otf]:+clig;+liga;+tlig
+Libertinus Math Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusMath-Regular.otf]:+clig;+liga;+tlig;+ss08
+Libertinus Math Regular; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusMath-Regular.otf]:+clig;+liga;+tlig;+ssty
+Libertinus Mono Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusMono-Regular.otf]:+clig;+liga;+tlig
+Libertinus Mono Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusMono-Regular.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Mono Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusMono-Regular.otf]:+clig;+liga;+tlig;+ss07
+Libertinus Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Bold.otf]:+clig;+liga;+tlig
+Libertinus Sans Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Bold.otf]:+clig;+liga;+tlig;+onum
+Libertinus Sans Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Bold.otf]:+clig;+liga;+tlig;+smcp
+Libertinus Sans Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Bold.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Sans Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Bold.otf]:+clig;+liga;+tlig;+ss03
+Libertinus Sans Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Bold.otf]:+clig;+liga;+tlig;+ss04
+Libertinus Sans Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Bold.otf]:+clig;+liga;+tlig;+ss06
+Libertinus Sans Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Bold.otf]:+clig;+liga;+tlig;+ss07
+Libertinus Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Italic.otf]:+clig;+liga;+tlig
+Libertinus Sans Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Italic.otf]:+clig;+liga;+tlig;+onum
+Libertinus Sans Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Italic.otf]:+clig;+liga;+tlig;+smcp
+Libertinus Sans Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Italic.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Sans Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Italic.otf]:+clig;+liga;+tlig;+ss03
+Libertinus Sans Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Italic.otf]:+clig;+liga;+tlig;+ss04
+Libertinus Sans Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Italic.otf]:+clig;+liga;+tlig;+ss06
+Libertinus Sans Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Italic.otf]:+clig;+liga;+tlig;+ss07
+Libertinus Sans Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Regular.otf]:+clig;+liga;+tlig
+Libertinus Sans Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Regular.otf]:+clig;+liga;+tlig;+onum
+Libertinus Sans Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Regular.otf]:+clig;+liga;+tlig;+smcp
+Libertinus Sans Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Regular.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Sans Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Regular.otf]:+clig;+liga;+tlig;+ss03
+Libertinus Sans Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Regular.otf]:+clig;+liga;+tlig;+ss04
+Libertinus Sans Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Regular.otf]:+clig;+liga;+tlig;+ss06
+Libertinus Sans Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSans-Regular.otf]:+clig;+liga;+tlig;+ss07
+Libertinus Serif Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Bold.otf]:+clig;+liga;+tlig
+Libertinus Serif Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Bold.otf]:+clig;+liga;+tlig;+onum
+Libertinus Serif Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Bold.otf]:+clig;+liga;+tlig;+smcp
+Libertinus Serif Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Bold.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Serif Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Bold.otf]:+clig;+liga;+tlig;+ss02
+Libertinus Serif Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Bold.otf]:+clig;+liga;+tlig;+ss03
+Libertinus Serif Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Bold.otf]:+clig;+liga;+tlig;+ss04
+Libertinus Serif Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Bold.otf]:+clig;+liga;+tlig;+ss05
+Libertinus Serif Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Bold.otf]:+clig;+liga;+tlig;+ss06
+Libertinus Serif Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Bold.otf]:+clig;+liga;+tlig;+ss07
+Libertinus Serif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-BoldItalic.otf]:+clig;+liga;+tlig
+Libertinus Serif Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Libertinus Serif Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Libertinus Serif Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Serif Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Libertinus Serif Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Libertinus Serif Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Libertinus Serif Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Libertinus Serif Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Libertinus Serif Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Libertinus Serif Display Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerifDisplay-Regular.otf]:+clig;+liga;+tlig
+Libertinus Serif Display Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerifDisplay-Regular.otf]:+clig;+liga;+tlig;+onum
+Libertinus Serif Display Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerifDisplay-Regular.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Serif Display Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerifDisplay-Regular.otf]:+clig;+liga;+tlig;+ss02
+Libertinus Serif Display Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerifDisplay-Regular.otf]:+clig;+liga;+tlig;+ss03
+Libertinus Serif Display Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerifDisplay-Regular.otf]:+clig;+liga;+tlig;+ss04
+Libertinus Serif Display Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerifDisplay-Regular.otf]:+clig;+liga;+tlig;+ss05
+Libertinus Serif Display Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerifDisplay-Regular.otf]:+clig;+liga;+tlig;+ss06
+Libertinus Serif Display Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerifDisplay-Regular.otf]:+clig;+liga;+tlig;+ss07
+Libertinus Serif Initials Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerifInitials-Regular.otf]:+clig;+liga;+tlig
+Libertinus Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Italic.otf]:+clig;+liga;+tlig
+Libertinus Serif Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Italic.otf]:+clig;+liga;+tlig;+onum
+Libertinus Serif Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Italic.otf]:+clig;+liga;+tlig;+smcp
+Libertinus Serif Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Italic.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Serif Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Italic.otf]:+clig;+liga;+tlig;+ss02
+Libertinus Serif Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Italic.otf]:+clig;+liga;+tlig;+ss03
+Libertinus Serif Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Italic.otf]:+clig;+liga;+tlig;+ss04
+Libertinus Serif Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Italic.otf]:+clig;+liga;+tlig;+ss05
+Libertinus Serif Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Italic.otf]:+clig;+liga;+tlig;+ss06
+Libertinus Serif Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Italic.otf]:+clig;+liga;+tlig;+ss07
+Libertinus Serif Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Regular.otf]:+clig;+liga;+tlig
+Libertinus Serif Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Regular.otf]:+clig;+liga;+tlig;+onum
+Libertinus Serif Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Regular.otf]:+clig;+liga;+tlig;+smcp
+Libertinus Serif Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Regular.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Serif Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Regular.otf]:+clig;+liga;+tlig;+ss02
+Libertinus Serif Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Regular.otf]:+clig;+liga;+tlig;+ss03
+Libertinus Serif Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Regular.otf]:+clig;+liga;+tlig;+ss04
+Libertinus Serif Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Regular.otf]:+clig;+liga;+tlig;+ss05
+Libertinus Serif Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Regular.otf]:+clig;+liga;+tlig;+ss06
+Libertinus Serif Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Regular.otf]:+clig;+liga;+tlig;+ss07
+Libertinus Serif Semibold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Semibold.otf]:+clig;+liga;+tlig
+Libertinus Serif Semibold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Semibold.otf]:+clig;+liga;+tlig;+onum
+Libertinus Serif Semibold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Semibold.otf]:+clig;+liga;+tlig;+smcp
+Libertinus Serif Semibold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Semibold.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Serif Semibold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Semibold.otf]:+clig;+liga;+tlig;+ss02
+Libertinus Serif Semibold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Semibold.otf]:+clig;+liga;+tlig;+ss03
+Libertinus Serif Semibold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Semibold.otf]:+clig;+liga;+tlig;+ss04
+Libertinus Serif Semibold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Semibold.otf]:+clig;+liga;+tlig;+ss05
+Libertinus Serif Semibold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Semibold.otf]:+clig;+liga;+tlig;+ss06
+Libertinus Serif Semibold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-Semibold.otf]:+clig;+liga;+tlig;+ss07
+Libertinus Serif Semibold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-SemiboldItalic.otf]:+clig;+liga;+tlig
+Libertinus Serif Semibold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-SemiboldItalic.otf]:+clig;+liga;+tlig;+onum
+Libertinus Serif Semibold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-SemiboldItalic.otf]:+clig;+liga;+tlig;+smcp
+Libertinus Serif Semibold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss01
+Libertinus Serif Semibold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss02
+Libertinus Serif Semibold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss03
+Libertinus Serif Semibold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss04
+Libertinus Serif Semibold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss05
+Libertinus Serif Semibold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss06
+Libertinus Serif Semibold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertinus-fonts/LibertinusSerif-SemiboldItalic.otf]:+clig;+liga;+tlig;+ss07
+Libre Baskerville [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/librebaskerville/LibreBaskerville-Regular.ttf]:+clig;+liga;+tlig
+Libre Baskerville Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/librebaskerville/LibreBaskerville-Bold.ttf]:+clig;+liga;+tlig
+Libre Baskerville Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/librebaskerville/LibreBaskerville-Italic.ttf]:+clig;+liga;+tlig
+Libre Baskerville Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/librebaskerville/LibreBaskerville-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Libre Bskvl Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/librebaskerville/LibreBskvl-BoldItalic.ttf]:+clig;+liga;+tlig
+Libre Franklin Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-Black.otf]:+clig;+liga;+tlig
+Libre Franklin Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-BlackItalic.otf]:+clig;+liga;+tlig
+Libre Franklin Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-Bold.otf]:+clig;+liga;+tlig
+Libre Franklin Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-BoldItalic.otf]:+clig;+liga;+tlig
+Libre Franklin ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-ExtraBold.otf]:+clig;+liga;+tlig
+Libre Franklin ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Libre Franklin ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-ExtraLight.otf]:+clig;+liga;+tlig
+Libre Franklin ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Libre Franklin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-Italic.otf]:+clig;+liga;+tlig
+Libre Franklin Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-Light.otf]:+clig;+liga;+tlig
+Libre Franklin Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-LightItalic.otf]:+clig;+liga;+tlig
+Libre Franklin Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-Medium.otf]:+clig;+liga;+tlig
+Libre Franklin Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-MediumItalic.otf]:+clig;+liga;+tlig
+Libre Franklin Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-Regular.otf]:+clig;+liga;+tlig
+Libre Franklin SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-SemiBold.otf]:+clig;+liga;+tlig
+Libre Franklin SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Libre Franklin Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-Thin.otf]:+clig;+liga;+tlig
+Libre Franklin Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librefranklin/LibreFranklin-ThinItalic.otf]:+clig;+liga;+tlig
+LibreBodoni-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librebodoni/LibreBodoni-Bold.otf]:+clig;+liga;+tlig
+LibreBodoni-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librebodoni/LibreBodoni-BoldItalic.otf]:+clig;+liga;+tlig
+LibreBodoni-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librebodoni/LibreBodoni-Italic.otf]:+clig;+liga;+tlig
+LibreBodoni-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librebodoni/LibreBodoni-Regular.otf]:+clig;+liga;+tlig
+LibreCaslonText-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librecaslon/LibreCaslonText-Bold.otf]:+clig;+liga;+tlig
+LibreCaslonText-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librecaslon/LibreCaslonText-Bold.otf]:+clig;+liga;+tlig;+onum
+LibreCaslonText-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librecaslon/LibreCaslonText-Italic.otf]:+clig;+liga;+tlig
+LibreCaslonText-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librecaslon/LibreCaslonText-Italic.otf]:+clig;+liga;+tlig;+onum
+LibreCaslonText-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librecaslon/LibreCaslonText-Italic.otf]:+clig;+liga;+tlig;+ss01
+LibreCaslonText-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librecaslon/LibreCaslonText-Regular.otf]:+clig;+liga;+tlig
+LibreCaslonText-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librecaslon/LibreCaslonText-Regular.otf]:+clig;+liga;+tlig;+onum
+LibreCsln-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librecaslon/LibreCsln-BoldItalic.otf]:+clig;+liga;+tlig
+LibreCsln-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/librecaslon/LibreCsln-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Lido STF CE [/usr/local/texlive/texmf-local/fonts/truetype/Storm/TTF/Lido_STF_CE/LidoSTFCE.ttf]:+clig;+liga;+tlig
+Lido STF CE Bold [/usr/local/texlive/texmf-local/fonts/truetype/Storm/TTF/Lido_STF_CE/LidoSTFCEBold.ttf]:+clig;+liga;+tlig
+Lido STF CE Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Storm/TTF/Lido_STF_CE/LidoSTFCEBoldItalic.ttf]:+clig;+liga;+tlig
+Lido STF CE Italic [/usr/local/texlive/texmf-local/fonts/truetype/Storm/TTF/Lido_STF_CE/LidoSTFCEItalic.ttf]:+clig;+liga;+tlig
+Lido STF Cond CE [/usr/local/texlive/texmf-local/fonts/truetype/Storm/TTF/Lido_STF_Cond_CE/LidoSTFCondCE.ttf]:+clig;+liga;+tlig
+Lido STF Cond CE Bold [/usr/local/texlive/texmf-local/fonts/truetype/Storm/TTF/Lido_STF_Cond_CE/LidoSTFCondCEBold.ttf]:+clig;+liga;+tlig
+LinguisticsPro-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Bold.otf]:+clig;+liga;+tlig
+LinguisticsPro-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Bold.otf]:+clig;+liga;+tlig;+onum
+LinguisticsPro-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Bold.otf]:+clig;+liga;+tlig;+ss01
+LinguisticsPro-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Bold.otf]:+clig;+liga;+tlig;+ss02
+LinguisticsPro-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-BoldItalic.otf]:+clig;+liga;+tlig
+LinguisticsPro-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+LinguisticsPro-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+LinguisticsPro-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+LinguisticsPro-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+LinguisticsPro-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Italic.otf]:+clig;+liga;+tlig
+LinguisticsPro-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Italic.otf]:+clig;+liga;+tlig;+onum
+LinguisticsPro-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Italic.otf]:+clig;+liga;+tlig;+ss01
+LinguisticsPro-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Italic.otf]:+clig;+liga;+tlig;+ss02
+LinguisticsPro-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Italic.otf]:+clig;+liga;+tlig;+ss03
+LinguisticsPro-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Regular.otf]:+clig;+liga;+tlig
+LinguisticsPro-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Regular.otf]:+clig;+liga;+tlig;+onum
+LinguisticsPro-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Regular.otf]:+clig;+liga;+tlig;+smcp
+LinguisticsPro-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Regular.otf]:+clig;+liga;+tlig;+ss01
+LinguisticsPro-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Regular.otf]:+clig;+liga;+tlig;+ss02
+LinguisticsPro-Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/LinguisticsPro-Regular.otf]:+clig;+liga;+tlig;+swsh
+Linux Biolinum Keyboard O [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_K.otf]:+clig;+liga;+tlig
+Linux Biolinum O [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_R.otf]:+clig;+liga;+tlig
+Linux Biolinum O; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_R.otf]:+clig;+liga;+tlig;+onum
+Linux Biolinum O; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_R.otf]:+clig;+liga;+tlig;+smcp
+Linux Biolinum O; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_R.otf]:+clig;+liga;+tlig;+ss01
+Linux Biolinum O; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_R.otf]:+clig;+liga;+tlig;+ss02
+Linux Biolinum O; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_R.otf]:+clig;+liga;+tlig;+ss03
+Linux Biolinum O; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_R.otf]:+clig;+liga;+tlig;+ss04
+Linux Biolinum O Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RB.otf]:+clig;+liga;+tlig
+Linux Biolinum O Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RB.otf]:+clig;+liga;+tlig;+onum
+Linux Biolinum O Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RB.otf]:+clig;+liga;+tlig;+smcp
+Linux Biolinum O Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RB.otf]:+clig;+liga;+tlig;+ss01
+Linux Biolinum O Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RB.otf]:+clig;+liga;+tlig;+ss03
+Linux Biolinum O Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RB.otf]:+clig;+liga;+tlig;+ss05
+Linux Biolinum O Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RBO.otf]:+clig;+liga;+tlig
+Linux Biolinum O Bold Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RBO.otf]:+clig;+liga;+tlig;+onum
+Linux Biolinum O Bold Oblique; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RBO.otf]:+clig;+liga;+tlig;+smcp
+Linux Biolinum O Bold Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RBO.otf]:+clig;+liga;+tlig;+ss01
+Linux Biolinum O Bold Oblique; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RBO.otf]:+clig;+liga;+tlig;+ss03
+Linux Biolinum O Bold Oblique; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RBO.otf]:+clig;+liga;+tlig;+ss05
+Linux Biolinum O Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RI.otf]:+clig;+liga;+tlig
+Linux Biolinum O Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RI.otf]:+clig;+liga;+tlig;+onum
+Linux Biolinum O Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RI.otf]:+clig;+liga;+tlig;+smcp
+Linux Biolinum O Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RI.otf]:+clig;+liga;+tlig;+ss01
+Linux Biolinum O Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RI.otf]:+clig;+liga;+tlig;+ss02
+Linux Biolinum O Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RI.otf]:+clig;+liga;+tlig;+ss03
+Linux Biolinum O Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinBiolinum_RI.otf]:+clig;+liga;+tlig;+ss04
+Linux Libertine Display O [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_DR.otf]:+clig;+liga;+tlig
+Linux Libertine Display O; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_DR.otf]:+clig;+liga;+tlig;+onum
+Linux Libertine Display O; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_DR.otf]:+clig;+liga;+tlig;+ss01
+Linux Libertine Display O; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_DR.otf]:+clig;+liga;+tlig;+ss05
+Linux Libertine Initials O [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_I.otf]:+clig;+liga;+tlig
+Linux Libertine Initials O; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_I.otf]:+clig;+liga;+tlig;+ss05
+Linux Libertine Mono O [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_M.otf]:+clig;+liga;+tlig
+Linux Libertine Mono O; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_M.otf]:+clig;+liga;+tlig;+ss01
+Linux Libertine Mono O Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_MB.otf]:+clig;+liga;+tlig
+Linux Libertine Mono O Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_MB.otf]:+clig;+liga;+tlig;+ss01
+Linux Libertine Mono O Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_MBO.otf]:+clig;+liga;+tlig
+Linux Libertine Mono O Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_MBO.otf]:+clig;+liga;+tlig;+ss01
+Linux Libertine Mono O Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_MO.otf]:+clig;+liga;+tlig
+Linux Libertine Mono O Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_MO.otf]:+clig;+liga;+tlig;+ss01
+Linux Libertine O [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_R.otf]:+clig;+liga;+tlig
+Linux Libertine O; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_R.otf]:+clig;+liga;+tlig;+onum
+Linux Libertine O; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_R.otf]:+clig;+liga;+tlig;+smcp
+Linux Libertine O; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_R.otf]:+clig;+liga;+tlig;+ss01
+Linux Libertine O; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_R.otf]:+clig;+liga;+tlig;+ss02
+Linux Libertine O; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_R.otf]:+clig;+liga;+tlig;+ss03
+Linux Libertine O; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_R.otf]:+clig;+liga;+tlig;+ss04
+Linux Libertine O; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_R.otf]:+clig;+liga;+tlig;+ss05
+Linux Libertine O; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_R.otf]:+clig;+liga;+tlig;+ss06
+Linux Libertine O Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RB.otf]:+clig;+liga;+tlig
+Linux Libertine O Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RB.otf]:+clig;+liga;+tlig;+onum
+Linux Libertine O Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RB.otf]:+clig;+liga;+tlig;+smcp
+Linux Libertine O Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RB.otf]:+clig;+liga;+tlig;+ss01
+Linux Libertine O Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RB.otf]:+clig;+liga;+tlig;+ss03
+Linux Libertine O Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RBI.otf]:+clig;+liga;+tlig
+Linux Libertine O Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RBI.otf]:+clig;+liga;+tlig;+onum
+Linux Libertine O Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RBI.otf]:+clig;+liga;+tlig;+smcp
+Linux Libertine O Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RBI.otf]:+clig;+liga;+tlig;+ss01
+Linux Libertine O Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RBI.otf]:+clig;+liga;+tlig;+ss02
+Linux Libertine O Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RBI.otf]:+clig;+liga;+tlig;+ss03
+Linux Libertine O Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RI.otf]:+clig;+liga;+tlig
+Linux Libertine O Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RI.otf]:+clig;+liga;+tlig;+onum
+Linux Libertine O Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RI.otf]:+clig;+liga;+tlig;+smcp
+Linux Libertine O Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RI.otf]:+clig;+liga;+tlig;+ss01
+Linux Libertine O Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RI.otf]:+clig;+liga;+tlig;+ss02
+Linux Libertine O Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RI.otf]:+clig;+liga;+tlig;+ss03
+Linux Libertine O Semibold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RZ.otf]:+clig;+liga;+tlig
+Linux Libertine O Semibold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RZ.otf]:+clig;+liga;+tlig;+onum
+Linux Libertine O Semibold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RZ.otf]:+clig;+liga;+tlig;+smcp
+Linux Libertine O Semibold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RZ.otf]:+clig;+liga;+tlig;+ss01
+Linux Libertine O Semibold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RZ.otf]:+clig;+liga;+tlig;+ss03
+Linux Libertine O Semibold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RZI.otf]:+clig;+liga;+tlig
+Linux Libertine O Semibold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RZI.otf]:+clig;+liga;+tlig;+onum
+Linux Libertine O Semibold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/libertine/LinLibertine_RZI.otf]:+clig;+liga;+tlig;+smcp
+LobsterTwo [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/lobster2/LobsterTwo-Regular.otf]:+clig;+liga;+tlig
+LobsterTwo-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/lobster2/LobsterTwo-Bold.otf]:+clig;+liga;+tlig
+LobsterTwo-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/lobster2/LobsterTwo-BoldItalic.otf]:+clig;+liga;+tlig
+LobsterTwo-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/lobster2/LobsterTwo-Italic.otf]:+clig;+liga;+tlig
+Logix [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/logix/logix.otf]:+clig;+liga;+tlig
+Logix [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/logix/logix.ttf]:+clig;+liga;+tlig
+Logix Mono [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/logix/logixMono.ttf]:+clig;+liga;+tlig
+LogixMono [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/logix/logixMono.otf]:+clig;+liga;+tlig
+Loma [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Loma.otf]:+clig;+liga;+tlig
+Loma Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Loma-Bold.otf]:+clig;+liga;+tlig
+Loma Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Loma-BoldOblique.otf]:+clig;+liga;+tlig
+Loma Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Loma-Oblique.otf]:+clig;+liga;+tlig
+Lucida Blackletter OT [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBlackletterOT.otf]:+clig;+liga;+tlig
+Lucida Bright Math OT [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightMathOT.otf]:+clig;+liga;+tlig
+Lucida Bright Math OT Demibold [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightMathOT-Demi.otf]:+clig;+liga;+tlig
+Lucida Bright OT [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightOT.otf]:+clig;+liga;+tlig
+Lucida Bright OT; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightOT.otf]:+clig;+liga;+tlig;+onum
+Lucida Bright OT; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightOT.otf]:+clig;+liga;+tlig;+smcp
+Lucida Bright OT Demi [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightOT-Demi.otf]:+clig;+liga;+tlig
+Lucida Bright OT Demi; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightOT-Demi.otf]:+clig;+liga;+tlig;+onum
+Lucida Bright OT Demi; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightOT-Demi.otf]:+clig;+liga;+tlig;+smcp
+Lucida Bright OT DemiItalic [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightOT-DemiItalic.otf]:+clig;+liga;+tlig
+Lucida Bright OT DemiItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightOT-DemiItalic.otf]:+clig;+liga;+tlig;+onum
+Lucida Bright OT Italic [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightOT-Italic.otf]:+clig;+liga;+tlig
+Lucida Bright OT Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaBrightOT-Italic.otf]:+clig;+liga;+tlig;+onum
+Lucida Calligraphy OT Italic [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaCalligraphyOT.otf]:+clig;+liga;+tlig
+Lucida Console DK [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaConsoleDK.otf]:+clig;+liga;+tlig
+Lucida Console DK; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaConsoleDK.otf]:+clig;+liga;+tlig;+ss01
+Lucida Console DK Bold [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaConsoleDK-Bold.otf]:+clig;+liga;+tlig
+Lucida Console DK Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaConsoleDK-Bold.otf]:+clig;+liga;+tlig;+ss01
+Lucida Console DK Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaConsoleDK-BoldItalic.otf]:+clig;+liga;+tlig
+Lucida Console DK Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaConsoleDK-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Lucida Console DK Italic [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaConsoleDK-Italic.otf]:+clig;+liga;+tlig
+Lucida Console DK Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaConsoleDK-Italic.otf]:+clig;+liga;+tlig;+ss01
+Lucida Grande [/System/Library/Fonts/LucidaGrande.ttc](0):+clig;+liga;+tlig
+Lucida Grande Bold [/System/Library/Fonts/LucidaGrande.ttc](1):+clig;+liga;+tlig
+Lucida Grande Mono DK [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaGrandeMonoDK.otf]:+clig;+liga;+tlig
+Lucida Grande Mono DK; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaGrandeMonoDK.otf]:+clig;+liga;+tlig;+ss01
+Lucida Grande Mono DK Bold [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaGrandeMonoDK-Bold.otf]:+clig;+liga;+tlig
+Lucida Grande Mono DK Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaGrandeMonoDK-Bold.otf]:+clig;+liga;+tlig;+ss01
+Lucida Grande Mono DK Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaGrandeMonoDK-BoldItalic.otf]:+clig;+liga;+tlig
+Lucida Grande Mono DK Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaGrandeMonoDK-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Lucida Grande Mono DK Italic [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaGrandeMonoDK-Italic.otf]:+clig;+liga;+tlig
+Lucida Grande Mono DK Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaGrandeMonoDK-Italic.otf]:+clig;+liga;+tlig;+ss01
+Lucida Handwriting OT Italic [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaHandwritingOT.otf]:+clig;+liga;+tlig
+Lucida Sans OT [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansOT.otf]:+clig;+liga;+tlig
+Lucida Sans OT; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansOT.otf]:+clig;+liga;+tlig;+ss01
+Lucida Sans OT Demibold [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansOT-Demi.otf]:+clig;+liga;+tlig
+Lucida Sans OT Demibold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansOT-Demi.otf]:+clig;+liga;+tlig;+ss01
+Lucida Sans OT Demibold Italic [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansOT-DemiItalic.otf]:+clig;+liga;+tlig
+Lucida Sans OT Demibold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansOT-DemiItalic.otf]:+clig;+liga;+tlig;+ss01
+Lucida Sans OT Italic [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansOT-Italic.otf]:+clig;+liga;+tlig
+Lucida Sans OT Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansOT-Italic.otf]:+clig;+liga;+tlig;+ss01
+Lucida Sans Typewriter OT [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansTypewriterOT.otf]:+clig;+liga;+tlig
+Lucida Sans Typewriter OT; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansTypewriterOT.otf]:+clig;+liga;+tlig;+ss01
+Lucida Sans Typewriter OT Bold [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansTypewriterOT-Bold.otf]:+clig;+liga;+tlig
+Lucida Sans Typewriter OT Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansTypewriterOT-Bold.otf]:+clig;+liga;+tlig;+ss01
+Lucida Sans Typewriter OT Bold Oblique [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansTypewriterOT-BoldOblique.otf]:+clig;+liga;+tlig
+Lucida Sans Typewriter OT Bold Oblique; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansTypewriterOT-BoldOblique.otf]:+clig;+liga;+tlig;+ss01
+Lucida Sans Typewriter OT Oblique [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansTypewriterOT-Oblique.otf]:+clig;+liga;+tlig
+Lucida Sans Typewriter OT Oblique; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/bh/lucidaot/LucidaSansTypewriterOT-Oblique.otf]:+clig;+liga;+tlig;+ss01
+MFB Oldstyle Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/mfb-oldstyle/MFBOldstyle-Bold.otf]:+clig;+liga;+tlig
+MFB Oldstyle Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/mfb-oldstyle/MFBOldstyle-Italic.otf]:+clig;+liga;+tlig
+MFB Oldstyle Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/mfb-oldstyle/MFBOldstyle-Regular.otf]:+clig;+liga;+tlig
+MFB Oldstyle Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/mfb-oldstyle/MFBOldstyle-Regular.otf]:+clig;+liga;+tlig;+onum
+MFB Oldstyle Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/mfb-oldstyle/MFBOldstyle-Regular.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-Black [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig
+Mantonico-Black; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig;+onum
+Mantonico-Black; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-Black; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-Black; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-Black; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-Black; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-Black; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Black.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-BlackItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig
+Mantonico-BlackItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Mantonico-BlackItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-BlackItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-BlackItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-BlackItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Mantonico-BlackItalic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-BlackItalic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-BlackItalic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-BlackItalic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-BlackItalic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-BlackItalic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BlackItalic.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-Bold [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig
+Mantonico-Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig;+onum
+Mantonico-Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-Bold; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Bold.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig
+Mantonico-BoldItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Mantonico-BoldItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-BoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-BoldItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-BoldItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Mantonico-BoldItalic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-BoldItalic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-BoldItalic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-BoldItalic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-BoldItalic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-BoldItalic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig
+Mantonico-ExtraLight; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Mantonico-ExtraLight; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-ExtraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-ExtraLight; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-ExtraLight; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-ExtraLight; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-ExtraLight; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-ExtraLight; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLight.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-ExtraLightItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Mantonico-ExtraLightItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Mantonico-ExtraLightItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-ExtraLightItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-ExtraLightItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-ExtraLightItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Mantonico-ExtraLightItalic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-ExtraLightItalic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-ExtraLightItalic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-ExtraLightItalic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-ExtraLightItalic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-ExtraLightItalic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ExtraLightItalic.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-Italic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig
+Mantonico-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+onum
+Mantonico-Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+ss03
+Mantonico-Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-Italic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Italic.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-Light [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig
+Mantonico-Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig;+onum
+Mantonico-Light; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-Light; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Light.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-LightItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig
+Mantonico-LightItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Mantonico-LightItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-LightItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-LightItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-LightItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Mantonico-LightItalic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-LightItalic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-LightItalic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-LightItalic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-LightItalic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-LightItalic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-LightItalic.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-Medium [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig
+Mantonico-Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig;+onum
+Mantonico-Medium; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-Medium; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Medium.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-MediumItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig
+Mantonico-MediumItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Mantonico-MediumItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-MediumItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-MediumItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-MediumItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Mantonico-MediumItalic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-MediumItalic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-MediumItalic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-MediumItalic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-MediumItalic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-MediumItalic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-MediumItalic.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-Regular [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig
+Mantonico-Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig;+onum
+Mantonico-Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-Regular; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Regular.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig
+Mantonico-SemiBold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Mantonico-SemiBold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-SemiBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-SemiBold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-SemiBold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-SemiBold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-SemiBold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-SemiBold; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBold.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-SemiBoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Mantonico-SemiBoldItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Mantonico-SemiBoldItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-SemiBoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-SemiBoldItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-SemiBoldItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Mantonico-SemiBoldItalic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-SemiBoldItalic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-SemiBoldItalic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-SemiBoldItalic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-SemiBoldItalic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-SemiBoldItalic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-SemiBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-Thin [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig
+Mantonico-Thin; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig;+onum
+Mantonico-Thin; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-Thin; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-Thin; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-Thin.otf]:+clig;+liga;+tlig;+swsh
+Mantonico-ThinItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig
+Mantonico-ThinItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Mantonico-ThinItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+smcp
+Mantonico-ThinItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Mantonico-ThinItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+Mantonico-ThinItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Mantonico-ThinItalic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+Mantonico-ThinItalic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+Mantonico-ThinItalic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+ss06
+Mantonico-ThinItalic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+ss07
+Mantonico-ThinItalic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+ss08
+Mantonico-ThinItalic; Swash [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Mantonico/Mantonico-ThinItalic.otf]:+clig;+liga;+tlig;+swsh
+Map Roman v3 Beta Compressed [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig
+Map Roman v3 Beta Compressed; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+onum
+Map Roman v3 Beta Compressed; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+ss01
+Map Roman v3 Beta Compressed; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+ss02
+Map Roman v3 Beta Compressed; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+ss03
+Map Roman v3 Beta Compressed; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+ss04
+Map Roman v3 Beta Compressed; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+ss05
+Map Roman v3 Beta Compressed; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+ss06
+Map Roman v3 Beta Compressed; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+ss07
+Map Roman v3 Beta Compressed; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+ss08
+Map Roman v3 Beta Compressed; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+ss09
+Map Roman v3 Beta Compressed; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+ss10
+Map Roman v3 Beta Compressed; Swash [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MapRomanV3Beta-Compressed/MapRomanV3Beta-Compressed.otf]:+clig;+liga;+tlig;+swsh
+Marcellus [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/marcellus/Marcellus-Regular.ttf]:+clig;+liga;+tlig
+Marcellus SC [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/marcellus/MarcellusSC-Regular.ttf]:+clig;+liga;+tlig
+Marker Felt Thin [/System/Library/Fonts/MarkerFelt.ttc](0):+clig;+liga;+tlig
+Marker Felt Wide [/System/Library/Fonts/MarkerFelt.ttc](1):+clig;+liga;+tlig
+MaxMix One [/usr/local/texlive/texmf-local/fonts/truetype/Holland/HFM2001TTW_MaxMix/MAXMO___.ttf]:+clig;+liga;+tlig
+Megabase Color Backslant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig
+Megabase Color Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Color Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Color Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Color Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Color Backslant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Color Backslant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Color Backslant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Color Backslant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Color Backslant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Color Backslant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Backslant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Color Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig
+Megabase Color Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megabase Color Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megabase Color Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megabase Color Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megabase Color Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megabase Color Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megabase Color Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megabase Color Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megabase Color Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megabase Color Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megabase Color SVG Backslant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig
+Megabase Color SVG Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Color SVG Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Color SVG Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Color SVG Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Color SVG Backslant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Color SVG Backslant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Color SVG Backslant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Color SVG Backslant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Color SVG Backslant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Color SVG Backslant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Backslant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Color SVG Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig
+Megabase Color SVG Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megabase Color SVG Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megabase Color SVG Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megabase Color SVG Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megabase Color SVG Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megabase Color SVG Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megabase Color SVG Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megabase Color SVG Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megabase Color SVG Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megabase Color SVG Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megabase Color SVG Slant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig
+Megabase Color SVG Slant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Color SVG Slant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Color SVG Slant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Color SVG Slant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Color SVG Slant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Color SVG Slant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Color SVG Slant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Color SVG Slant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Color SVG Slant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Color SVG Slant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColorSVG-Slant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Color Slant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig
+Megabase Color Slant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Color Slant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Color Slant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Color Slant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Color Slant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Color Slant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Color Slant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Color Slant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Color Slant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Color Slant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseColor-Slant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Color Variable Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig
+Megabase Color Variable Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Megabase Color Variable Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig;+ss02
+Megabase Color Variable Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Megabase Color Variable Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig;+ss04
+Megabase Color Variable Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig;+ss05
+Megabase Color Variable Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig;+ss06
+Megabase Color Variable Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig;+ss07
+Megabase Color Variable Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig;+ss08
+Megabase Color Variable Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig;+ss09
+Megabase Color Variable Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseColorVariable-VF.ttf]:+clig;+liga;+tlig;+ss10
+Megabase Fade Backslant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig
+Megabase Fade Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Fade Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Fade Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Fade Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Fade Backslant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Fade Backslant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Fade Backslant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Fade Backslant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Fade Backslant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Fade Backslant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Backslant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Fade Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig
+Megabase Fade Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megabase Fade Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megabase Fade Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megabase Fade Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megabase Fade Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megabase Fade Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megabase Fade Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megabase Fade Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megabase Fade Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megabase Fade Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megabase Fade SVG Backslant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig
+Megabase Fade SVG Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Fade SVG Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Fade SVG Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Fade SVG Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Fade SVG Backslant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Fade SVG Backslant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Fade SVG Backslant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Fade SVG Backslant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Fade SVG Backslant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Fade SVG Backslant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Backslant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Fade SVG Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig
+Megabase Fade SVG Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megabase Fade SVG Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megabase Fade SVG Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megabase Fade SVG Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megabase Fade SVG Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megabase Fade SVG Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megabase Fade SVG Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megabase Fade SVG Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megabase Fade SVG Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megabase Fade SVG Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megabase Fade SVG Slant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig
+Megabase Fade SVG Slant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Fade SVG Slant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Fade SVG Slant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Fade SVG Slant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Fade SVG Slant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Fade SVG Slant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Fade SVG Slant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Fade SVG Slant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Fade SVG Slant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Fade SVG Slant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFadeSVG-Slant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Fade Slant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig
+Megabase Fade Slant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Fade Slant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Fade Slant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Fade Slant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Fade Slant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Fade Slant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Fade Slant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Fade Slant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Fade Slant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Fade Slant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseFade-Slant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Fade Variable Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig
+Megabase Fade Variable Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Megabase Fade Variable Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig;+ss02
+Megabase Fade Variable Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Megabase Fade Variable Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig;+ss04
+Megabase Fade Variable Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig;+ss05
+Megabase Fade Variable Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig;+ss06
+Megabase Fade Variable Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig;+ss07
+Megabase Fade Variable Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig;+ss08
+Megabase Fade Variable Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig;+ss09
+Megabase Fade Variable Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseFadeVariable-VF.ttf]:+clig;+liga;+tlig;+ss10
+Megabase Open Backslant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig
+Megabase Open Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Open Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Open Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Open Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Open Backslant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Open Backslant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Open Backslant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Open Backslant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Open Backslant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Open Backslant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Backslant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Open Backslant [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig
+Megabase Open Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig;+ss01
+Megabase Open Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig;+ss02
+Megabase Open Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig;+ss03
+Megabase Open Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig;+ss04
+Megabase Open Backslant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig;+ss05
+Megabase Open Backslant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig;+ss06
+Megabase Open Backslant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig;+ss07
+Megabase Open Backslant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig;+ss08
+Megabase Open Backslant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig;+ss09
+Megabase Open Backslant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Backslant.ttf]:+clig;+liga;+tlig;+ss10
+Megabase Open Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig
+Megabase Open Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megabase Open Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megabase Open Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megabase Open Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megabase Open Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megabase Open Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megabase Open Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megabase Open Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megabase Open Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megabase Open Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megabase Open Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig
+Megabase Open Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Megabase Open Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Megabase Open Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Megabase Open Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Megabase Open Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Megabase Open Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Megabase Open Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Megabase Open Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig;+ss08
+Megabase Open Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig;+ss09
+Megabase Open Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Regular.ttf]:+clig;+liga;+tlig;+ss10
+Megabase Open Slant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig
+Megabase Open Slant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Open Slant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Open Slant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Open Slant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Open Slant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Open Slant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Open Slant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Open Slant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Open Slant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Open Slant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseOpen-Slant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Open Slant [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig
+Megabase Open Slant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig;+ss01
+Megabase Open Slant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig;+ss02
+Megabase Open Slant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig;+ss03
+Megabase Open Slant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig;+ss04
+Megabase Open Slant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig;+ss05
+Megabase Open Slant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig;+ss06
+Megabase Open Slant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig;+ss07
+Megabase Open Slant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig;+ss08
+Megabase Open Slant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig;+ss09
+Megabase Open Slant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpen-Slant.ttf]:+clig;+liga;+tlig;+ss10
+Megabase Open Variable Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig
+Megabase Open Variable Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Megabase Open Variable Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig;+ss02
+Megabase Open Variable Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Megabase Open Variable Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig;+ss04
+Megabase Open Variable Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig;+ss05
+Megabase Open Variable Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig;+ss06
+Megabase Open Variable Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig;+ss07
+Megabase Open Variable Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig;+ss08
+Megabase Open Variable Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig;+ss09
+Megabase Open Variable Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseOpenVariable-VF.ttf]:+clig;+liga;+tlig;+ss10
+Megabase Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig
+Megabase Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megabase Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megabase Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megabase Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megabase Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megabase Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megabase Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megabase Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megabase Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megabase Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/Megabase-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megabase Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig
+Megabase Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Megabase Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Megabase Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Megabase Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Megabase Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Megabase Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Megabase Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Megabase Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig;+ss08
+Megabase Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig;+ss09
+Megabase Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/Megabase-Regular.ttf]:+clig;+liga;+tlig;+ss10
+Megabase Stripe Backslant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig
+Megabase Stripe Backslant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Stripe Backslant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Stripe Backslant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Stripe Backslant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Stripe Backslant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Stripe Backslant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Stripe Backslant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Stripe Backslant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Stripe Backslant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Stripe Backslant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Backslant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Stripe Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig
+Megabase Stripe Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megabase Stripe Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megabase Stripe Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megabase Stripe Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megabase Stripe Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megabase Stripe Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megabase Stripe Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megabase Stripe Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megabase Stripe Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megabase Stripe Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megabase Stripe Slant [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig
+Megabase Stripe Slant; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig;+ss01
+Megabase Stripe Slant; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig;+ss02
+Megabase Stripe Slant; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig;+ss03
+Megabase Stripe Slant; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig;+ss04
+Megabase Stripe Slant; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig;+ss05
+Megabase Stripe Slant; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig;+ss06
+Megabase Stripe Slant; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig;+ss07
+Megabase Stripe Slant; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig;+ss08
+Megabase Stripe Slant; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig;+ss09
+Megabase Stripe Slant; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/MegabaseOpen/MegabaseStripe-Slant.otf]:+clig;+liga;+tlig;+ss10
+Megabase Stripe Variable [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig
+Megabase Stripe Variable; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Megabase Stripe Variable; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig;+ss02
+Megabase Stripe Variable; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Megabase Stripe Variable; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig;+ss04
+Megabase Stripe Variable; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig;+ss05
+Megabase Stripe Variable; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig;+ss06
+Megabase Stripe Variable; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig;+ss07
+Megabase Stripe Variable; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig;+ss08
+Megabase Stripe Variable; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig;+ss09
+Megabase Stripe Variable; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/MegabaseOpen/MegabaseStripeVariable-VF.ttf]:+clig;+liga;+tlig;+ss10
+Megabase v3 Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig
+Megabase v3 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig;+ss01
+Megabase v3 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig;+ss02
+Megabase v3 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig;+ss03
+Megabase v3 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig;+ss04
+Megabase v3 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig;+ss05
+Megabase v3 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig;+ss06
+Megabase v3 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig;+ss07
+Megabase v3 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig;+ss08
+Megabase v3 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig;+ss09
+Megabase v3 Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Bold.otf]:+clig;+liga;+tlig;+ss10
+Megabase v3 ExtraBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig
+Megabase v3 ExtraBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Megabase v3 ExtraBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Megabase v3 ExtraBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Megabase v3 ExtraBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+Megabase v3 ExtraBold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Megabase v3 ExtraBold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig;+ss06
+Megabase v3 ExtraBold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig;+ss07
+Megabase v3 ExtraBold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig;+ss08
+Megabase v3 ExtraBold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig;+ss09
+Megabase v3 ExtraBold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-ExtraBold.otf]:+clig;+liga;+tlig;+ss10
+Megabase v3 Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig
+Megabase v3 Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig;+ss01
+Megabase v3 Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig;+ss02
+Megabase v3 Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig;+ss03
+Megabase v3 Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig;+ss04
+Megabase v3 Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig;+ss05
+Megabase v3 Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig;+ss06
+Megabase v3 Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig;+ss07
+Megabase v3 Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig;+ss08
+Megabase v3 Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig;+ss09
+Megabase v3 Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Medium.otf]:+clig;+liga;+tlig;+ss10
+Megabase v3 Open Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig
+Megabase v3 Open Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig;+ss01
+Megabase v3 Open Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig;+ss02
+Megabase v3 Open Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig;+ss03
+Megabase v3 Open Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig;+ss04
+Megabase v3 Open Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig;+ss05
+Megabase v3 Open Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig;+ss06
+Megabase v3 Open Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig;+ss07
+Megabase v3 Open Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig;+ss08
+Megabase v3 Open Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig;+ss09
+Megabase v3 Open Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Bold.otf]:+clig;+liga;+tlig;+ss10
+Megabase v3 Open Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig
+Megabase v3 Open Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig;+ss01
+Megabase v3 Open Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig;+ss02
+Megabase v3 Open Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig;+ss03
+Megabase v3 Open Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig;+ss04
+Megabase v3 Open Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig;+ss05
+Megabase v3 Open Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig;+ss06
+Megabase v3 Open Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig;+ss07
+Megabase v3 Open Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig;+ss08
+Megabase v3 Open Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig;+ss09
+Megabase v3 Open Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Medium.otf]:+clig;+liga;+tlig;+ss10
+Megabase v3 Open Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig
+Megabase v3 Open Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megabase v3 Open Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megabase v3 Open Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megabase v3 Open Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megabase v3 Open Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megabase v3 Open Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megabase v3 Open Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megabase v3 Open Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megabase v3 Open Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megabase v3 Open Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3Open-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megabase v3 Open Variable [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig
+Megabase v3 Open Variable; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig;+ss01
+Megabase v3 Open Variable; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig;+ss02
+Megabase v3 Open Variable; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig;+ss03
+Megabase v3 Open Variable; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig;+ss04
+Megabase v3 Open Variable; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig;+ss05
+Megabase v3 Open Variable; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig;+ss06
+Megabase v3 Open Variable; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig;+ss07
+Megabase v3 Open Variable; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig;+ss08
+Megabase v3 Open Variable; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig;+ss09
+Megabase v3 Open Variable; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megabase/MegabaseV3OpenVariable_wght_.ttf]:+clig;+liga;+tlig;+ss10
+Megabase v3 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig
+Megabase v3 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megabase v3 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megabase v3 Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megabase v3 Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megabase v3 Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megabase v3 Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megabase v3 Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megabase v3 Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megabase v3 Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megabase v3 Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megabase/MegabaseV3-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megascope Max [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig
+Megascope Max; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig;+ss01
+Megascope Max; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig;+ss02
+Megascope Max; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig;+ss03
+Megascope Max; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig;+ss04
+Megascope Max; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig;+ss05
+Megascope Max; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig;+ss06
+Megascope Max; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig;+ss07
+Megascope Max; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig;+ss08
+Megascope Max; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig;+ss09
+Megascope Max; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Max.otf]:+clig;+liga;+tlig;+ss10
+Megascope Plus [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig
+Megascope Plus; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig;+ss01
+Megascope Plus; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig;+ss02
+Megascope Plus; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig;+ss03
+Megascope Plus; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig;+ss04
+Megascope Plus; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig;+ss05
+Megascope Plus; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig;+ss06
+Megascope Plus; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig;+ss07
+Megascope Plus; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig;+ss08
+Megascope Plus; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig;+ss09
+Megascope Plus; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Plus.otf]:+clig;+liga;+tlig;+ss10
+Megascope Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig
+Megascope Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megascope Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megascope Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megascope Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megascope Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megascope Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megascope Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megascope Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megascope Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megascope Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/Megascope-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megascope Variable Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig
+Megascope Variable Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig;+ss01
+Megascope Variable Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig;+ss02
+Megascope Variable Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig;+ss03
+Megascope Variable Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig;+ss04
+Megascope Variable Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig;+ss05
+Megascope Variable Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig;+ss06
+Megascope Variable Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig;+ss07
+Megascope Variable Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig;+ss08
+Megascope Variable Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig;+ss09
+Megascope Variable Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeVariable_SCOP_.ttf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig
+Megascope v2 Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Bold.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig
+Megascope v2 Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Light.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Max Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig
+Megascope v2 Max Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Max Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Max Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Max Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Max Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Max Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Max Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Max Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Max Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Max Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Max Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Bold.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Max Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig
+Megascope v2 Max Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Max Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Max Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Max Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Max Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Max Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Max Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Max Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Max Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Max Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Max Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Light.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Max Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig
+Megascope v2 Max Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Max Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Max Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Max Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Max Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Max Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Max Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Max Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Max Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Max Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Max Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Medium.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Max Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig
+Megascope v2 Max Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Max Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Max Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Max Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Max Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Max Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Max Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Max Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Max Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Max Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Max Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Regular.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Max Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig
+Megascope v2 Max Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Max Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Max Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Max Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Max Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Max Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Max Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Max Thin; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Max Thin; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Max Thin; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Max Thin; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Max-Thin.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig
+Megascope v2 Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Medium.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Plus Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig
+Megascope v2 Plus Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Plus Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Plus Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Plus Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Plus Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Plus Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Plus Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Plus Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Plus Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Plus Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Plus Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Bold.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Plus Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig
+Megascope v2 Plus Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Plus Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Plus Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Plus Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Plus Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Plus Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Plus Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Plus Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Plus Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Plus Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Plus Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Light.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Plus Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig
+Megascope v2 Plus Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Plus Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Plus Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Plus Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Plus Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Plus Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Plus Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Plus Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Plus Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Plus Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Plus Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Medium.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Plus Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig
+Megascope v2 Plus Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Plus Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Plus Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Plus Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Plus Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Plus Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Plus Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Plus Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Plus Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Plus Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Plus Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Regular.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Plus Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig
+Megascope v2 Plus Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Plus Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Plus Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Plus Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Plus Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Plus Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Plus Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Plus Thin; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Plus Thin; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Plus Thin; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Plus Thin; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2Plus-Thin.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig
+Megascope v2 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Regular.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Thin [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig
+Megascope v2 Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Thin; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Thin; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Thin; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Thin; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megascope/MegascopeV2-Thin.otf]:+clig;+liga;+tlig;+ss11
+Megascope v2 Variable Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig
+Megascope v2 Variable Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss01
+Megascope v2 Variable Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss02
+Megascope v2 Variable Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss03
+Megascope v2 Variable Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss04
+Megascope v2 Variable Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss05
+Megascope v2 Variable Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss06
+Megascope v2 Variable Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss07
+Megascope v2 Variable Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss08
+Megascope v2 Variable Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss09
+Megascope v2 Variable Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss10
+Megascope v2 Variable Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megascope/MegascopeV2Variable_SCOP,wght_.ttf]:+clig;+liga;+tlig;+ss11
+Megavolt [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megavolt/Megavolt-Regular.otf]:+clig;+liga;+tlig
+Megavolt; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megavolt/Megavolt-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megavolt; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megavolt/Megavolt-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megavolt; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megavolt/Megavolt-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megavolt; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megavolt/Megavolt-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megavolt; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megavolt/Megavolt-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megavolt; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megavolt/Megavolt-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megavolt; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megavolt/Megavolt-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megavolt [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megavolt/Megavolt-Regular.ttf]:+clig;+liga;+tlig
+Megavolt; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megavolt/Megavolt-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Megavolt; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megavolt/Megavolt-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Megavolt; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megavolt/Megavolt-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Megavolt; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megavolt/Megavolt-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Megavolt; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megavolt/Megavolt-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Megavolt; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megavolt/Megavolt-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Megavolt; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megavolt/Megavolt-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Megazoid Fill [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig
+Megazoid Fill; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss01
+Megazoid Fill; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss02
+Megazoid Fill; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss03
+Megazoid Fill; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss04
+Megazoid Fill; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss05
+Megazoid Fill; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss06
+Megazoid Fill; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss07
+Megazoid Fill; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss08
+Megazoid Fill; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss09
+Megazoid Fill; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss10
+Megazoid Fill; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss11
+Megazoid Fill; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Fill.otf]:+clig;+liga;+tlig;+ss12
+Megazoid Fill [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig
+Megazoid Fill; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss01
+Megazoid Fill; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss02
+Megazoid Fill; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss03
+Megazoid Fill; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss04
+Megazoid Fill; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss05
+Megazoid Fill; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss06
+Megazoid Fill; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss07
+Megazoid Fill; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss08
+Megazoid Fill; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss09
+Megazoid Fill; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss10
+Megazoid Fill; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss11
+Megazoid Fill; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Fill.ttf]:+clig;+liga;+tlig;+ss12
+Megazoid Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig
+Megazoid Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss01
+Megazoid Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss02
+Megazoid Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss03
+Megazoid Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss04
+Megazoid Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss07
+Megazoid Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss08
+Megazoid Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss11
+Megazoid Italic; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss12
+Megazoid Italic; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss14
+Megazoid Italic; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss15
+Megazoid Italic; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss16
+Megazoid Italic; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss17
+Megazoid Italic; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid-Italic/Megazoid-Italic.otf]:+clig;+liga;+tlig;+ss18
+Megazoid Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig
+Megazoid Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss01
+Megazoid Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss02
+Megazoid Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss03
+Megazoid Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss04
+Megazoid Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss05
+Megazoid Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss06
+Megazoid Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss07
+Megazoid Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss08
+Megazoid Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss09
+Megazoid Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss10
+Megazoid Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss11
+Megazoid Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Megazoid/Megazoid-Regular.otf]:+clig;+liga;+tlig;+ss12
+Megazoid Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig
+Megazoid Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Megazoid Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Megazoid Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Megazoid Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Megazoid Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Megazoid Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Megazoid Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Megazoid Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss08
+Megazoid Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss09
+Megazoid Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss10
+Megazoid Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss11
+Megazoid Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Megazoid/Megazoid-Regular.ttf]:+clig;+liga;+tlig;+ss12
+Menaion Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MenaionUnicode.otf]:+clig;+liga;+tlig
+Menlo Bold [/System/Library/Fonts/Menlo.ttc](1):+clig;+liga;+tlig
+Menlo Bold Italic [/System/Library/Fonts/Menlo.ttc](3):+clig;+liga;+tlig
+Menlo Italic [/System/Library/Fonts/Menlo.ttc](2):+clig;+liga;+tlig
+Menlo Regular [/System/Library/Fonts/Menlo.ttc](0):+clig;+liga;+tlig
+MercuryTextG1-Bold [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Bold-Pro.otf]:+clig;+liga;+tlig
+MercuryTextG1-Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Bold-Pro.otf]:+clig;+liga;+tlig;+smcp
+MercuryTextG1-Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Bold-Pro.otf]:+clig;+liga;+tlig;+ss01
+MercuryTextG1-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-BoldItalic-Pro.otf]:+clig;+liga;+tlig
+MercuryTextG1-BoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-BoldItalic-Pro.otf]:+clig;+liga;+tlig;+ss01
+MercuryTextG1-Italic [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Italic-Pro.otf]:+clig;+liga;+tlig
+MercuryTextG1-Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Italic-Pro.otf]:+clig;+liga;+tlig;+ss01
+MercuryTextG1-Roman [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Roman-Pro.otf]:+clig;+liga;+tlig
+MercuryTextG1-Roman; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Roman-Pro.otf]:+clig;+liga;+tlig;+smcp
+MercuryTextG1-Roman; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Roman-Pro.otf]:+clig;+liga;+tlig;+ss01
+MercuryTextG1-Semibold [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Semibold-Pro.otf]:+clig;+liga;+tlig
+MercuryTextG1-Semibold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Semibold-Pro.otf]:+clig;+liga;+tlig;+smcp
+MercuryTextG1-Semibold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-Semibold-Pro.otf]:+clig;+liga;+tlig;+ss01
+MercuryTextG1-SemiboldItalic [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-SemiItalic-Pro.otf]:+clig;+liga;+tlig
+MercuryTextG1-SemiboldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/hoefler/mercurytext/MercuryTextG1-SemiItalic-Pro.otf]:+clig;+liga;+tlig;+ss01
+Merriweather Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Black.otf]:+clig;+liga;+tlig
+Merriweather Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Black.otf]:+clig;+liga;+tlig;+onum
+Merriweather Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Black.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Black.otf]:+clig;+liga;+tlig;+ss01
+Merriweather Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-BlackItalic.otf]:+clig;+liga;+tlig
+Merriweather Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Merriweather Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-BlackItalic.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Merriweather Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Bold.otf]:+clig;+liga;+tlig
+Merriweather Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Bold.otf]:+clig;+liga;+tlig;+onum
+Merriweather Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Bold.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Bold.otf]:+clig;+liga;+tlig;+ss01
+Merriweather Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-BoldItalic.otf]:+clig;+liga;+tlig
+Merriweather Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Merriweather Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Merriweather Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Italic.otf]:+clig;+liga;+tlig
+Merriweather Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Italic.otf]:+clig;+liga;+tlig;+onum
+Merriweather Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Italic.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Italic.otf]:+clig;+liga;+tlig;+ss01
+Merriweather Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Light.otf]:+clig;+liga;+tlig
+Merriweather Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Light.otf]:+clig;+liga;+tlig;+onum
+Merriweather Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Light.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Light.otf]:+clig;+liga;+tlig;+ss01
+Merriweather Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-LightItalic.otf]:+clig;+liga;+tlig
+Merriweather Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Merriweather Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Merriweather Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Regular.otf]:+clig;+liga;+tlig
+Merriweather Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Regular.otf]:+clig;+liga;+tlig;+onum
+Merriweather Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Regular.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/Merriweather-Regular.otf]:+clig;+liga;+tlig;+ss01
+Merriweather Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Bold.otf]:+clig;+liga;+tlig
+Merriweather Sans Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Bold.otf]:+clig;+liga;+tlig;+onum
+Merriweather Sans Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Bold.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-BoldItalic.otf]:+clig;+liga;+tlig
+Merriweather Sans Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Merriweather Sans Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Sans ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-ExtraBold.otf]:+clig;+liga;+tlig
+Merriweather Sans ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Merriweather Sans ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Sans ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Merriweather Sans ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Merriweather Sans ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Italic.otf]:+clig;+liga;+tlig
+Merriweather Sans Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Italic.otf]:+clig;+liga;+tlig;+onum
+Merriweather Sans Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Italic.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Sans Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Light.otf]:+clig;+liga;+tlig
+Merriweather Sans Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Light.otf]:+clig;+liga;+tlig;+onum
+Merriweather Sans Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Light.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Sans Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-LightItalic.otf]:+clig;+liga;+tlig
+Merriweather Sans Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Merriweather Sans Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Merriweather Sans Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Regular.otf]:+clig;+liga;+tlig
+Merriweather Sans Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Regular.otf]:+clig;+liga;+tlig;+onum
+Merriweather Sans Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/sorkin/merriweather/MerriweatherSans-Regular.otf]:+clig;+liga;+tlig;+smcp
+Mezenets Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MezenetsUnicode.otf]:+clig;+liga;+tlig
+Mezenets Unicode; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MezenetsUnicode.otf]:+clig;+liga;+tlig;+ss01
+Mezenets Unicode; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MezenetsUnicode.otf]:+clig;+liga;+tlig;+ss02
+Mezenets Unicode; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MezenetsUnicode.otf]:+clig;+liga;+tlig;+ss03
+Mezenets Unicode; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MezenetsUnicode.otf]:+clig;+liga;+tlig;+ss04
+Miama Nueva [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/miama/miama.otf]:+clig;+liga;+tlig
+MinionPro-Bold [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Bold.otf]:+clig;+liga;+tlig
+MinionPro-Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Bold.otf]:+clig;+liga;+tlig;+hist
+MinionPro-Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Bold.otf]:+clig;+liga;+tlig;+onum
+MinionPro-Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Bold.otf]:+clig;+liga;+tlig;+smcp
+MinionPro-Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Bold.otf]:+clig;+liga;+tlig;+ss01
+MinionPro-Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Bold.otf]:+clig;+liga;+tlig;+ss02
+MinionPro-BoldIt [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-BoldIt.otf]:+clig;+liga;+tlig
+MinionPro-BoldIt; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-BoldIt.otf]:+clig;+liga;+tlig;+hist
+MinionPro-BoldIt; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-BoldIt.otf]:+clig;+liga;+tlig;+onum
+MinionPro-BoldIt; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-BoldIt.otf]:+clig;+liga;+tlig;+smcp
+MinionPro-BoldIt; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-BoldIt.otf]:+clig;+liga;+tlig;+ss01
+MinionPro-BoldIt; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-BoldIt.otf]:+clig;+liga;+tlig;+ss02
+MinionPro-It [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-It.otf]:+clig;+liga;+tlig
+MinionPro-It; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-It.otf]:+clig;+liga;+tlig;+hist
+MinionPro-It; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-It.otf]:+clig;+liga;+tlig;+onum
+MinionPro-It; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-It.otf]:+clig;+liga;+tlig;+smcp
+MinionPro-It; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-It.otf]:+clig;+liga;+tlig;+ss01
+MinionPro-It; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-It.otf]:+clig;+liga;+tlig;+ss02
+MinionPro-Regular [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Regular.otf]:+clig;+liga;+tlig
+MinionPro-Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Regular.otf]:+clig;+liga;+tlig;+hist
+MinionPro-Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Regular.otf]:+clig;+liga;+tlig;+onum
+MinionPro-Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Regular.otf]:+clig;+liga;+tlig;+smcp
+MinionPro-Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Regular.otf]:+clig;+liga;+tlig;+ss01
+MinionPro-Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/adobe/minionpro/MinionPro-Regular.otf]:+clig;+liga;+tlig;+ss02
+MintSpirit-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Bold.otf]:+clig;+liga;+tlig
+MintSpirit-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Bold.otf]:+clig;+liga;+tlig;+hist
+MintSpirit-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Bold.otf]:+clig;+liga;+tlig;+onum
+MintSpirit-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Bold.otf]:+clig;+liga;+tlig;+smcp
+MintSpirit-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Bold.otf]:+clig;+liga;+tlig;+ss01
+MintSpirit-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-BoldItalic.otf]:+clig;+liga;+tlig
+MintSpirit-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+MintSpirit-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+MintSpirit-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+MintSpirit-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+MintSpirit-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Italic.otf]:+clig;+liga;+tlig
+MintSpirit-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Italic.otf]:+clig;+liga;+tlig;+hist
+MintSpirit-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Italic.otf]:+clig;+liga;+tlig;+onum
+MintSpirit-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Italic.otf]:+clig;+liga;+tlig;+smcp
+MintSpirit-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Italic.otf]:+clig;+liga;+tlig;+ss01
+MintSpirit-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Regular.otf]:+clig;+liga;+tlig
+MintSpirit-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Regular.otf]:+clig;+liga;+tlig;+hist
+MintSpirit-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Regular.otf]:+clig;+liga;+tlig;+onum
+MintSpirit-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Regular.otf]:+clig;+liga;+tlig;+smcp
+MintSpirit-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpirit-Regular.otf]:+clig;+liga;+tlig;+ss01
+MintSpiritNo2-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Bold.otf]:+clig;+liga;+tlig
+MintSpiritNo2-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Bold.otf]:+clig;+liga;+tlig;+hist
+MintSpiritNo2-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Bold.otf]:+clig;+liga;+tlig;+onum
+MintSpiritNo2-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Bold.otf]:+clig;+liga;+tlig;+smcp
+MintSpiritNo2-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Bold.otf]:+clig;+liga;+tlig;+ss01
+MintSpiritNo2-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-BoldItalic.otf]:+clig;+liga;+tlig
+MintSpiritNo2-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+MintSpiritNo2-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+MintSpiritNo2-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+MintSpiritNo2-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+MintSpiritNo2-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Italic.otf]:+clig;+liga;+tlig
+MintSpiritNo2-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Italic.otf]:+clig;+liga;+tlig;+hist
+MintSpiritNo2-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Italic.otf]:+clig;+liga;+tlig;+onum
+MintSpiritNo2-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Italic.otf]:+clig;+liga;+tlig;+smcp
+MintSpiritNo2-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Italic.otf]:+clig;+liga;+tlig;+ss01
+MintSpiritNo2-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Regular.otf]:+clig;+liga;+tlig
+MintSpiritNo2-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Regular.otf]:+clig;+liga;+tlig;+hist
+MintSpiritNo2-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Regular.otf]:+clig;+liga;+tlig;+onum
+MintSpiritNo2-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Regular.otf]:+clig;+liga;+tlig;+smcp
+MintSpiritNo2-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/mintspirit/MintSpiritNo2-Regular.otf]:+clig;+liga;+tlig;+ss01
+Miriam CLM Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/MiriamCLM-Bold.ttf]:+clig;+liga;+tlig
+Miriam CLM Book [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/MiriamCLM-Book.ttf]:+clig;+liga;+tlig
+Miriam Mono CLM Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/MiriamMonoCLM-Bold.ttf]:+clig;+liga;+tlig
+Miriam Mono CLM Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/MiriamMonoCLM-BoldOblique.ttf]:+clig;+liga;+tlig
+Miriam Mono CLM Book [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/MiriamMonoCLM-Book.ttf]:+clig;+liga;+tlig
+Miriam Mono CLM Book Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/MiriamMonoCLM-BookOblique.ttf]:+clig;+liga;+tlig
+Missaali Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig
+Missaali Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+hist
+Missaali Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+onum
+Missaali Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+smcp
+Missaali Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss01
+Missaali Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss02
+Missaali Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss03
+Missaali Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss04
+Missaali Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss05
+Missaali Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss06
+Missaali Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss07
+Missaali Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss08
+Missaali Regular; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss09
+Missaali Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss10
+Missaali Regular; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss11
+Missaali Regular; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss12
+Missaali Regular; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss13
+Missaali Regular; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss14
+Missaali Regular; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss15
+Missaali Regular; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss16
+Missaali Regular; Stylistic Set 17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss17
+Missaali Regular; Stylistic Set 18 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss18
+Missaali Regular; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss19
+Missaali Regular; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss20
+Missaali Regular; <unknown feature> [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss21
+Missaali Regular; <unknown feature> [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss22
+Missaali Regular; <unknown feature> [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+ss23
+Missaali Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+swsh
+Missaali Regular; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/missaali/Missaali-Regular.otf]:+clig;+liga;+tlig;+titl
+Modak [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Modak.ttf]:+clig;+liga;+tlig
+Modak; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Modak.ttf]:+clig;+liga;+tlig;+ss01
+Monaco [/System/Library/Fonts/Monaco.ttf]:+clig;+liga;+tlig
+Monomakh Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MonomakhUnicode.otf]:+clig;+liga;+tlig
+Monomakh Unicode; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MonomakhUnicode.otf]:+clig;+liga;+tlig;+ss01
+Monomakh Unicode; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MonomakhUnicode.otf]:+clig;+liga;+tlig;+ss06
+Monomakh Unicode; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MonomakhUnicode.otf]:+clig;+liga;+tlig;+ss07
+Monomakh Unicode; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MonomakhUnicode.otf]:+clig;+liga;+tlig;+ss08
+Monomakh Unicode; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MonomakhUnicode.otf]:+clig;+liga;+tlig;+ss09
+Monomakh Unicode; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MonomakhUnicode.otf]:+clig;+liga;+tlig;+ss10
+Monomakh Unicode; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MonomakhUnicode.otf]:+clig;+liga;+tlig;+ss11
+Monomakh Unicode; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MonomakhUnicode.otf]:+clig;+liga;+tlig;+ss13
+Monomakh Unicode; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/MonomakhUnicode.otf]:+clig;+liga;+tlig;+ss15
+Montserrat Alternates Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Black.otf]:+clig;+liga;+tlig
+Montserrat Alternates Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Black.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Black.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-BlackItalic.otf]:+clig;+liga;+tlig
+Montserrat Alternates Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-BlackItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Bold.otf]:+clig;+liga;+tlig
+Montserrat Alternates Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Bold.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Bold.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-BoldItalic.otf]:+clig;+liga;+tlig
+Montserrat Alternates Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraBold.otf]:+clig;+liga;+tlig
+Montserrat Alternates ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Montserrat Alternates ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraLight.otf]:+clig;+liga;+tlig
+Montserrat Alternates ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraLight.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Montserrat Alternates ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ExtraLightItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Italic.otf]:+clig;+liga;+tlig
+Montserrat Alternates Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Italic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Italic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Light.otf]:+clig;+liga;+tlig
+Montserrat Alternates Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Light.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Light.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-LightItalic.otf]:+clig;+liga;+tlig
+Montserrat Alternates Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Medium.otf]:+clig;+liga;+tlig
+Montserrat Alternates Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Medium.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Medium.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-MediumItalic.otf]:+clig;+liga;+tlig
+Montserrat Alternates Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Regular.otf]:+clig;+liga;+tlig
+Montserrat Alternates Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Regular.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Regular.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-SemiBold.otf]:+clig;+liga;+tlig
+Montserrat Alternates SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Montserrat Alternates SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-SemiBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Thin.otf]:+clig;+liga;+tlig
+Montserrat Alternates Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Thin.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-Thin.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Alternates Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ThinItalic.otf]:+clig;+liga;+tlig
+Montserrat Alternates Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Alternates Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/MontserratAlternates-ThinItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Black.otf]:+clig;+liga;+tlig
+Montserrat Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Black.otf]:+clig;+liga;+tlig;+onum
+Montserrat Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Black.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Black.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-BlackItalic.otf]:+clig;+liga;+tlig
+Montserrat Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-BlackItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Bold.otf]:+clig;+liga;+tlig
+Montserrat Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Bold.otf]:+clig;+liga;+tlig;+onum
+Montserrat Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Bold.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Bold.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-BoldItalic.otf]:+clig;+liga;+tlig
+Montserrat Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Montserrat ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraBold.otf]:+clig;+liga;+tlig
+Montserrat ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Montserrat ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+Montserrat ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Montserrat ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Montserrat ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Montserrat ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraLight.otf]:+clig;+liga;+tlig
+Montserrat ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Montserrat ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraLight.otf]:+clig;+liga;+tlig;+smcp
+Montserrat ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Montserrat ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Montserrat ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraLightItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Italic.otf]:+clig;+liga;+tlig
+Montserrat Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Italic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Italic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Italic.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Light.otf]:+clig;+liga;+tlig
+Montserrat Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Light.otf]:+clig;+liga;+tlig;+onum
+Montserrat Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Light.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Light.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-LightItalic.otf]:+clig;+liga;+tlig
+Montserrat Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Medium.otf]:+clig;+liga;+tlig
+Montserrat Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Medium.otf]:+clig;+liga;+tlig;+onum
+Montserrat Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Medium.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Medium.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-MediumItalic.otf]:+clig;+liga;+tlig
+Montserrat Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Regular.otf]:+clig;+liga;+tlig
+Montserrat Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Regular.otf]:+clig;+liga;+tlig;+onum
+Montserrat Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Regular.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Regular.otf]:+clig;+liga;+tlig;+ss01
+Montserrat SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-SemiBold.otf]:+clig;+liga;+tlig
+Montserrat SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Montserrat SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+Montserrat SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Montserrat SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Montserrat SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-SemiBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Thin.otf]:+clig;+liga;+tlig
+Montserrat Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Thin.otf]:+clig;+liga;+tlig;+onum
+Montserrat Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Thin.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-Thin.otf]:+clig;+liga;+tlig;+ss01
+Montserrat Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ThinItalic.otf]:+clig;+liga;+tlig
+Montserrat Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Montserrat Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ThinItalic.otf]:+clig;+liga;+tlig;+smcp
+Montserrat Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/montserrat/Montserrat-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+MostraOneRegular [/usr/local/texlive/texmf-local/fonts/truetype/Simonson/MostraRegular/TrueType/MOST1RG_.ttf]:+clig;+liga;+tlig
+MostraThreeRegular [/usr/local/texlive/texmf-local/fonts/truetype/Simonson/MostraRegular/TrueType/MOST3RG_.ttf]:+clig;+liga;+tlig
+MostraTwoRegular [/usr/local/texlive/texmf-local/fonts/truetype/Simonson/MostraRegular/TrueType/MOST2RG_.ttf]:+clig;+liga;+tlig
+Mukta Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Bold.ttf]:+clig;+liga;+tlig
+Mukta Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Bold.ttf]:+clig;+liga;+tlig;+onum
+Mukta Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Mukta Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Mukta Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Mukta Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Mukta ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraBold.ttf]:+clig;+liga;+tlig
+Mukta ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Mukta ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Mukta ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Mukta ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Mukta ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Mukta ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraLight.ttf]:+clig;+liga;+tlig
+Mukta ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Mukta ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Mukta ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Mukta ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Mukta ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Mukta Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Light.ttf]:+clig;+liga;+tlig
+Mukta Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Light.ttf]:+clig;+liga;+tlig;+onum
+Mukta Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Light.ttf]:+clig;+liga;+tlig;+smcp
+Mukta Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Light.ttf]:+clig;+liga;+tlig;+ss01
+Mukta Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Light.ttf]:+clig;+liga;+tlig;+ss02
+Mukta Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Light.ttf]:+clig;+liga;+tlig;+ss03
+Mukta Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Medium.ttf]:+clig;+liga;+tlig
+Mukta Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Medium.ttf]:+clig;+liga;+tlig;+onum
+Mukta Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Medium.ttf]:+clig;+liga;+tlig;+smcp
+Mukta Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Mukta Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Mukta Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Mukta Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Regular.ttf]:+clig;+liga;+tlig
+Mukta Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Regular.ttf]:+clig;+liga;+tlig;+onum
+Mukta Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Mukta Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Mukta Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Mukta Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Mukta SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-SemiBold.ttf]:+clig;+liga;+tlig
+Mukta SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-SemiBold.ttf]:+clig;+liga;+tlig;+onum
+Mukta SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-SemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Mukta SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Mukta SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Mukta SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ektype-tanka/Mukta-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+MuktaMahee Bold [/System/Library/Fonts/MuktaMahee.ttc](6):+clig;+liga;+tlig
+MuktaMahee ExtraBold [/System/Library/Fonts/MuktaMahee.ttc](5):+clig;+liga;+tlig
+MuktaMahee ExtraLight [/System/Library/Fonts/MuktaMahee.ttc](4):+clig;+liga;+tlig
+MuktaMahee Light [/System/Library/Fonts/MuktaMahee.ttc](3):+clig;+liga;+tlig
+MuktaMahee Medium [/System/Library/Fonts/MuktaMahee.ttc](2):+clig;+liga;+tlig
+MuktaMahee Regular [/System/Library/Fonts/MuktaMahee.ttc](0):+clig;+liga;+tlig
+MuktaMahee SemiBold [/System/Library/Fonts/MuktaMahee.ttc](1):+clig;+liga;+tlig
+MuseJazz Text [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/musixtex-fonts/MuseJazzText.otf]:+clig;+liga;+tlig
+MyriadPro-Bold [/usr/local/texlive/texmf-local/fonts/opentype/adobe/myriadpro/MyriadPro-Bold.otf]:+clig;+liga;+tlig
+MyriadPro-Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/adobe/myriadpro/MyriadPro-Bold.otf]:+clig;+liga;+tlig;+onum
+MyriadPro-BoldIt [/usr/local/texlive/texmf-local/fonts/opentype/adobe/myriadpro/MyriadPro-BoldIt.otf]:+clig;+liga;+tlig
+MyriadPro-BoldIt; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/adobe/myriadpro/MyriadPro-BoldIt.otf]:+clig;+liga;+tlig;+onum
+MyriadPro-It [/usr/local/texlive/texmf-local/fonts/opentype/adobe/myriadpro/MyriadPro-It.otf]:+clig;+liga;+tlig
+MyriadPro-It; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/adobe/myriadpro/MyriadPro-It.otf]:+clig;+liga;+tlig;+onum
+MyriadPro-Regular [/usr/local/texlive/texmf-local/fonts/opentype/adobe/myriadpro/MyriadPro-Regular.otf]:+clig;+liga;+tlig
+MyriadPro-Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/adobe/myriadpro/MyriadPro-Regular.otf]:+clig;+liga;+tlig;+onum
+NAMU 1400 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1400.otf]:+clig;+liga;+tlig
+NAMU 1400; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1400.otf]:+clig;+liga;+tlig;+ss01
+NAMU 1400 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1400.ttf]:+clig;+liga;+tlig
+NAMU 1400; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1400.ttf]:+clig;+liga;+tlig;+ss01
+NAMU 1600 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1600.otf]:+clig;+liga;+tlig
+NAMU 1600; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1600.otf]:+clig;+liga;+tlig;+ss01
+NAMU 1600; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1600.otf]:+clig;+liga;+tlig;+ss02
+NAMU 1600 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1600.ttf]:+clig;+liga;+tlig
+NAMU 1600; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1600.ttf]:+clig;+liga;+tlig;+ss01
+NAMU 1600; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1600.ttf]:+clig;+liga;+tlig;+ss02
+NAMU 1750 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1750.otf]:+clig;+liga;+tlig
+NAMU 1750; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1750.otf]:+clig;+liga;+tlig;+ss01
+NAMU 1750 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1750.ttf]:+clig;+liga;+tlig
+NAMU 1750; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1750.ttf]:+clig;+liga;+tlig;+ss01
+NAMU 1850 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1850.otf]:+clig;+liga;+tlig
+NAMU 1850; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1850.otf]:+clig;+liga;+tlig;+ss01
+NAMU 1850 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1850.ttf]:+clig;+liga;+tlig
+NAMU 1850; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1850.ttf]:+clig;+liga;+tlig;+ss01
+NAMU 1910 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1910.otf]:+clig;+liga;+tlig
+NAMU 1910; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1910.otf]:+clig;+liga;+tlig;+ss01
+NAMU 1910 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1910.ttf]:+clig;+liga;+tlig
+NAMU 1910; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1910.ttf]:+clig;+liga;+tlig;+ss01
+NAMU 1930 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1930.otf]:+clig;+liga;+tlig
+NAMU 1930; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1930.otf]:+clig;+liga;+tlig;+ss01
+NAMU 1930 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1930.ttf]:+clig;+liga;+tlig
+NAMU 1930; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1930.ttf]:+clig;+liga;+tlig;+ss01
+NAMU 1960 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1960.otf]:+clig;+liga;+tlig
+NAMU 1960; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1960.otf]:+clig;+liga;+tlig;+ss01
+NAMU 1960 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1960.ttf]:+clig;+liga;+tlig
+NAMU 1960; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1960.ttf]:+clig;+liga;+tlig;+ss01
+NAMU 1990 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1990.otf]:+clig;+liga;+tlig
+NAMU 1990; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1990.otf]:+clig;+liga;+tlig;+ss01
+NAMU 1990; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1990.otf]:+clig;+liga;+tlig;+ss04
+NAMU 1990; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-1990.otf]:+clig;+liga;+tlig;+ss05
+NAMU 1990 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1990.ttf]:+clig;+liga;+tlig
+NAMU 1990; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1990.ttf]:+clig;+liga;+tlig;+ss01
+NAMU 1990; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1990.ttf]:+clig;+liga;+tlig;+ss04
+NAMU 1990; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-1990.ttf]:+clig;+liga;+tlig;+ss05
+NAMU Pro [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig
+NAMU Pro; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+onum
+NAMU Pro; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss01
+NAMU Pro; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss02
+NAMU Pro; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss03
+NAMU Pro; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss04
+NAMU Pro; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss05
+NAMU Pro; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss06
+NAMU Pro; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss07
+NAMU Pro; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss08
+NAMU Pro; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss09
+NAMU Pro; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss10
+NAMU Pro; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss11
+NAMU Pro; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss12
+NAMU Pro; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss13
+NAMU Pro; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss14
+NAMU Pro; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss15
+NAMU Pro; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss16
+NAMU Pro; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss17
+NAMU Pro; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss18
+NAMU Pro; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss19
+NAMU Pro; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/opentype/DR/NAMU/NAMU-Pro.otf]:+clig;+liga;+tlig;+ss20
+NAMU Pro [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig
+NAMU Pro; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+onum
+NAMU Pro; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss01
+NAMU Pro; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss02
+NAMU Pro; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss03
+NAMU Pro; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss04
+NAMU Pro; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss05
+NAMU Pro; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss06
+NAMU Pro; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss07
+NAMU Pro; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss08
+NAMU Pro; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss09
+NAMU Pro; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss10
+NAMU Pro; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss11
+NAMU Pro; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss12
+NAMU Pro; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss13
+NAMU Pro; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss14
+NAMU Pro; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss15
+NAMU Pro; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss16
+NAMU Pro; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss17
+NAMU Pro; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss18
+NAMU Pro; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss19
+NAMU Pro; Stylistic Set 20 [/usr/local/texlive/texmf-local/fonts/truetype/DR/NAMU/NAMU-Pro.ttf]:+clig;+liga;+tlig;+ss20
+NKD04 Playing Card's Index [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/hmtrump/nkd04_playing_cards_index.ttf]:+clig;+liga;+tlig
+NMB10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmb10.otf]:+clig;+liga;+tlig
+NMBX10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmbx10.otf]:+clig;+liga;+tlig
+NMBX12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmbx12.otf]:+clig;+liga;+tlig
+NMBX5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmbx5.otf]:+clig;+liga;+tlig
+NMBX6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmbx6.otf]:+clig;+liga;+tlig
+NMBX7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmbx7.otf]:+clig;+liga;+tlig
+NMBX8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmbx8.otf]:+clig;+liga;+tlig
+NMBX9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmbx9.otf]:+clig;+liga;+tlig
+NMBXSL10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmbxsl10.otf]:+clig;+liga;+tlig
+NMBXTI10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmbxti10.otf]:+clig;+liga;+tlig
+NMCSC10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmcsc10.otf]:+clig;+liga;+tlig
+NMMI10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmi10.otf]:+clig;+liga;+tlig
+NMMI12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmi12.otf]:+clig;+liga;+tlig
+NMMI5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmi5.otf]:+clig;+liga;+tlig
+NMMI6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmi6.otf]:+clig;+liga;+tlig
+NMMI7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmi7.otf]:+clig;+liga;+tlig
+NMMI8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmi8.otf]:+clig;+liga;+tlig
+NMMI9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmi9.otf]:+clig;+liga;+tlig
+NMMIB10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmib10.otf]:+clig;+liga;+tlig
+NMMIB5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmib5.otf]:+clig;+liga;+tlig
+NMMIB6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmib6.otf]:+clig;+liga;+tlig
+NMMIB7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmib7.otf]:+clig;+liga;+tlig
+NMMIB8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmib8.otf]:+clig;+liga;+tlig
+NMMIB9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmmib9.otf]:+clig;+liga;+tlig
+NMR10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmr10.otf]:+clig;+liga;+tlig
+NMR12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmr12.otf]:+clig;+liga;+tlig
+NMR17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmr17.otf]:+clig;+liga;+tlig
+NMR5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmr5.otf]:+clig;+liga;+tlig
+NMR6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmr6.otf]:+clig;+liga;+tlig
+NMR7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmr7.otf]:+clig;+liga;+tlig
+NMR8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmr8.otf]:+clig;+liga;+tlig
+NMR9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmr9.otf]:+clig;+liga;+tlig
+NMSL10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmsl10.otf]:+clig;+liga;+tlig
+NMSL12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmsl12.otf]:+clig;+liga;+tlig
+NMSL8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmsl8.otf]:+clig;+liga;+tlig
+NMSL9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmsl9.otf]:+clig;+liga;+tlig
+NMSS10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmss10.otf]:+clig;+liga;+tlig
+NMSS12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmss12.otf]:+clig;+liga;+tlig
+NMSS17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmss17.otf]:+clig;+liga;+tlig
+NMSS8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmss8.otf]:+clig;+liga;+tlig
+NMSS9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmss9.otf]:+clig;+liga;+tlig
+NMSSBX10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmssbx10.otf]:+clig;+liga;+tlig
+NMSSDC10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmssdc10.otf]:+clig;+liga;+tlig
+NMSSI10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmssi10.otf]:+clig;+liga;+tlig
+NMSSI12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmssi12.otf]:+clig;+liga;+tlig
+NMSSI17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmssi17.otf]:+clig;+liga;+tlig
+NMSSI8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmssi8.otf]:+clig;+liga;+tlig
+NMSSI9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmssi9.otf]:+clig;+liga;+tlig
+NMTI10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmti10.otf]:+clig;+liga;+tlig
+NMTI12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmti12.otf]:+clig;+liga;+tlig
+NMTI7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmti7.otf]:+clig;+liga;+tlig
+NMTI8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmti8.otf]:+clig;+liga;+tlig
+NMTI9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/cyrillic-modern/nmti9.otf]:+clig;+liga;+tlig
+Nachlieli CLM Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/culmus/NachlieliCLM-Bold.otf]:+clig;+liga;+tlig
+Nachlieli CLM Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/culmus/NachlieliCLM-BoldOblique.otf]:+clig;+liga;+tlig
+Nachlieli CLM Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/culmus/NachlieliCLM-Light.otf]:+clig;+liga;+tlig
+Nachlieli CLM Light Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/culmus/NachlieliCLM-LightOblique.otf]:+clig;+liga;+tlig
+Nastup Basic [/usr/local/texlive/texmf-local/fonts/opentype/zakznak/Nastup/Nastup-Basic.otf]:+clig;+liga;+tlig
+Nastup Basic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/zakznak/Nastup/Nastup-Basic.otf]:+clig;+liga;+tlig;+ss01
+Nastup Basic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/zakznak/Nastup/Nastup-Basic.otf]:+clig;+liga;+tlig;+ss02
+Nastup Basic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/zakznak/Nastup/Nastup-Basic.otf]:+clig;+liga;+tlig;+ss03
+Nastup Basic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/zakznak/Nastup/Nastup-Basic.otf]:+clig;+liga;+tlig;+ss04
+Nastup Basic [/usr/local/texlive/texmf-local/fonts/truetype/zakznak/Nastup/Nastup-Basic.ttf]:+clig;+liga;+tlig
+Nastup Basic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/zakznak/Nastup/Nastup-Basic.ttf]:+clig;+liga;+tlig;+ss01
+Nastup Basic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/zakznak/Nastup/Nastup-Basic.ttf]:+clig;+liga;+tlig;+ss02
+Nastup Basic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/zakznak/Nastup/Nastup-Basic.ttf]:+clig;+liga;+tlig;+ss03
+Nastup Basic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/zakznak/Nastup/Nastup-Basic.ttf]:+clig;+liga;+tlig;+ss04
+NewBaskervilleEF-Bold [/usr/local/texlive/texmf-local/fonts/truetype/nbaskerv/NewBaskervilleEF-Bold.ttf]:+clig;+liga;+tlig
+NewBaskervilleEF-BoldIta [/usr/local/texlive/texmf-local/fonts/truetype/nbaskerv/NewBaskervilleEF-BoldIta.ttf]:+clig;+liga;+tlig
+NewBaskervilleEF-Roman [/usr/local/texlive/texmf-local/fonts/truetype/nbaskerv/NewBaskervilleEF-Roman.ttf]:+clig;+liga;+tlig
+NewBaskervilleEF-RomanIta [/usr/local/texlive/texmf-local/fonts/truetype/nbaskerv/NewBaskervilleEF-RomanIta.ttf]:+clig;+liga;+tlig
+NewCM08Devanagari-Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08Devanagari-Book.otf]:+clig;+liga;+tlig
+NewCM10Devanagari-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08Devanagari-Regular.otf]:+clig;+liga;+tlig
+NewCMUncial08-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMUncial08-Bold.otf]:+clig;+liga;+tlig
+NewCMUncial08-Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMUncial08-Book.otf]:+clig;+liga;+tlig
+NewCMUncial08-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMUncial08-Regular.otf]:+clig;+liga;+tlig
+NewCMUncial10-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMUncial10-Bold.otf]:+clig;+liga;+tlig
+NewCMUncial10-Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMUncial10-Book.otf]:+clig;+liga;+tlig
+NewComputerModern 10 Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10Devanagari-Bold.otf]:+clig;+liga;+tlig
+NewComputerModern 10 Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10Devanagari-Book.otf]:+clig;+liga;+tlig
+NewComputerModern 10 Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10Devanagari-Regular.otf]:+clig;+liga;+tlig
+NewComputerModern08-Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Book.otf]:+clig;+liga;+tlig
+NewComputerModern08-Book; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Book.otf]:+clig;+liga;+tlig;+hist
+NewComputerModern08-Book; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Book.otf]:+clig;+liga;+tlig;+onum
+NewComputerModern08-Book; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Book.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModern08-Book; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Book.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModern08-Book; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Book.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModern08-BookItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-BookItalic.otf]:+clig;+liga;+tlig
+NewComputerModern08-BookItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-BookItalic.otf]:+clig;+liga;+tlig;+hist
+NewComputerModern08-BookItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-BookItalic.otf]:+clig;+liga;+tlig;+onum
+NewComputerModern08-BookItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-BookItalic.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModern08-BookItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-BookItalic.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModern08-BookItalic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-BookItalic.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModern08-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Italic.otf]:+clig;+liga;+tlig
+NewComputerModern08-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Italic.otf]:+clig;+liga;+tlig;+hist
+NewComputerModern08-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Italic.otf]:+clig;+liga;+tlig;+onum
+NewComputerModern08-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Italic.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModern08-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Italic.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModern08-Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Italic.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModern08-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Regular.otf]:+clig;+liga;+tlig
+NewComputerModern08-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Regular.otf]:+clig;+liga;+tlig;+onum
+NewComputerModern08-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Regular.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModern08-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Regular.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModern08-Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM08-Regular.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModern10-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Bold.otf]:+clig;+liga;+tlig
+NewComputerModern10-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Bold.otf]:+clig;+liga;+tlig;+hist
+NewComputerModern10-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Bold.otf]:+clig;+liga;+tlig;+onum
+NewComputerModern10-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Bold.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModern10-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Bold.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModern10-Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Bold.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModern10-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BoldItalic.otf]:+clig;+liga;+tlig
+NewComputerModern10-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+NewComputerModern10-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+NewComputerModern10-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModern10-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModern10-BoldItalic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModern10-Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Book.otf]:+clig;+liga;+tlig
+NewComputerModern10-Book; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Book.otf]:+clig;+liga;+tlig;+hist
+NewComputerModern10-Book; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Book.otf]:+clig;+liga;+tlig;+onum
+NewComputerModern10-Book; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Book.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModern10-Book; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Book.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModern10-Book; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Book.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModern10-BookItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BookItalic.otf]:+clig;+liga;+tlig
+NewComputerModern10-BookItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BookItalic.otf]:+clig;+liga;+tlig;+hist
+NewComputerModern10-BookItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BookItalic.otf]:+clig;+liga;+tlig;+onum
+NewComputerModern10-BookItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BookItalic.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModern10-BookItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BookItalic.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModern10-BookItalic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-BookItalic.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModern10-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Italic.otf]:+clig;+liga;+tlig
+NewComputerModern10-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Italic.otf]:+clig;+liga;+tlig;+hist
+NewComputerModern10-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Italic.otf]:+clig;+liga;+tlig;+onum
+NewComputerModern10-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Italic.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModern10-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Italic.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModern10-Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Italic.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModern10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Regular.otf]:+clig;+liga;+tlig
+NewComputerModern10-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Regular.otf]:+clig;+liga;+tlig;+hist
+NewComputerModern10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Regular.otf]:+clig;+liga;+tlig;+onum
+NewComputerModern10-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Regular.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModern10-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Regular.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModern10-Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCM10-Regular.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernMath-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Bold.otf]:+clig;+liga;+tlig
+NewComputerModernMath-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Bold.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernMath-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Bold.otf]:+clig;+liga;+tlig;+ss02
+NewComputerModernMath-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Bold.otf]:+clig;+liga;+tlig;+ss03
+NewComputerModernMath-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Bold.otf]:+clig;+liga;+tlig;+ss04
+NewComputerModernMath-Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Bold.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernMath-Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Book.otf]:+clig;+liga;+tlig
+NewComputerModernMath-Book; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Book.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernMath-Book; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Book.otf]:+clig;+liga;+tlig;+ss02
+NewComputerModernMath-Book; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Book.otf]:+clig;+liga;+tlig;+ss03
+NewComputerModernMath-Book; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Book.otf]:+clig;+liga;+tlig;+ss04
+NewComputerModernMath-Book; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Book.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernMath-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Regular.otf]:+clig;+liga;+tlig
+NewComputerModernMath-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Regular.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernMath-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Regular.otf]:+clig;+liga;+tlig;+ss02
+NewComputerModernMath-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Regular.otf]:+clig;+liga;+tlig;+ss03
+NewComputerModernMath-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Regular.otf]:+clig;+liga;+tlig;+ss04
+NewComputerModernMath-Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMath-Regular.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernMono10-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Bold.otf]:+clig;+liga;+tlig
+NewComputerModernMono10-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Bold.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernMono10-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Bold.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernMono10-Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Bold.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernMono10-BoldOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-BoldOblique.otf]:+clig;+liga;+tlig
+NewComputerModernMono10-BoldOblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-BoldOblique.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernMono10-BoldOblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-BoldOblique.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernMono10-BoldOblique; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-BoldOblique.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernMono10-Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Book.otf]:+clig;+liga;+tlig
+NewComputerModernMono10-Book; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Book.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernMono10-Book; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Book.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernMono10-Book; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Book.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernMono10-Book; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Book.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernMono10-BookItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-BookItalic.otf]:+clig;+liga;+tlig
+NewComputerModernMono10-BookItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-BookItalic.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernMono10-BookItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-BookItalic.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernMono10-BookItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-BookItalic.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernMono10-BookItalic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-BookItalic.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernMono10-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Italic.otf]:+clig;+liga;+tlig
+NewComputerModernMono10-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Italic.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernMono10-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Italic.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernMono10-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Italic.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernMono10-Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Italic.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernMono10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Regular.otf]:+clig;+liga;+tlig
+NewComputerModernMono10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Regular.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernMono10-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Regular.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernMono10-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Regular.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernMono10-Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMMono10-Regular.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernSans08-Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Book.otf]:+clig;+liga;+tlig
+NewComputerModernSans08-Book; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Book.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernSans08-Book; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Book.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernSans08-Book; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Book.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernSans08-Book; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Book.otf]:+clig;+liga;+tlig;+ss02
+NewComputerModernSans08-Book; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Book.otf]:+clig;+liga;+tlig;+ss03
+NewComputerModernSans08-Book; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Book.otf]:+clig;+liga;+tlig;+ss04
+NewComputerModernSans08-Book; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Book.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernSans08-BookOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-BookOblique.otf]:+clig;+liga;+tlig
+NewComputerModernSans08-BookOblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-BookOblique.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernSans08-BookOblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-BookOblique.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernSans08-BookOblique; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-BookOblique.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernSans08-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Oblique.otf]:+clig;+liga;+tlig
+NewComputerModernSans08-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Oblique.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernSans08-Oblique; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Oblique.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernSans08-Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Oblique.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernSans08-Oblique; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Oblique.otf]:+clig;+liga;+tlig;+ss02
+NewComputerModernSans08-Oblique; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Oblique.otf]:+clig;+liga;+tlig;+ss03
+NewComputerModernSans08-Oblique; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Oblique.otf]:+clig;+liga;+tlig;+ss04
+NewComputerModernSans08-Oblique; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Oblique.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernSans08-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Regular.otf]:+clig;+liga;+tlig
+NewComputerModernSans08-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Regular.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernSans08-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Regular.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernSans08-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Regular.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernSans08-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Regular.otf]:+clig;+liga;+tlig;+ss02
+NewComputerModernSans08-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Regular.otf]:+clig;+liga;+tlig;+ss03
+NewComputerModernSans08-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Regular.otf]:+clig;+liga;+tlig;+ss04
+NewComputerModernSans08-Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans08-Regular.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernSans10-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Bold.otf]:+clig;+liga;+tlig
+NewComputerModernSans10-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Bold.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernSans10-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Bold.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernSans10-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Bold.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernSans10-Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Bold.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernSans10-BoldOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BoldOblique.otf]:+clig;+liga;+tlig
+NewComputerModernSans10-BoldOblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BoldOblique.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernSans10-BoldOblique; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BoldOblique.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernSans10-BoldOblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BoldOblique.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernSans10-BoldOblique; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BoldOblique.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernSans10-Book [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Book.otf]:+clig;+liga;+tlig
+NewComputerModernSans10-Book; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Book.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernSans10-Book; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Book.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernSans10-Book; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Book.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernSans10-Book; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Book.otf]:+clig;+liga;+tlig;+ss02
+NewComputerModernSans10-Book; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Book.otf]:+clig;+liga;+tlig;+ss03
+NewComputerModernSans10-Book; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Book.otf]:+clig;+liga;+tlig;+ss04
+NewComputerModernSans10-Book; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Book.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernSans10-BookOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BookOblique.otf]:+clig;+liga;+tlig
+NewComputerModernSans10-BookOblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BookOblique.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernSans10-BookOblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BookOblique.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernSans10-BookOblique; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BookOblique.otf]:+clig;+liga;+tlig;+ss02
+NewComputerModernSans10-BookOblique; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BookOblique.otf]:+clig;+liga;+tlig;+ss03
+NewComputerModernSans10-BookOblique; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BookOblique.otf]:+clig;+liga;+tlig;+ss04
+NewComputerModernSans10-BookOblique; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-BookOblique.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernSans10-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Oblique.otf]:+clig;+liga;+tlig
+NewComputerModernSans10-Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Oblique.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernSans10-Oblique; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Oblique.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernSans10-Oblique; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Oblique.otf]:+clig;+liga;+tlig;+ss02
+NewComputerModernSans10-Oblique; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Oblique.otf]:+clig;+liga;+tlig;+ss03
+NewComputerModernSans10-Oblique; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Oblique.otf]:+clig;+liga;+tlig;+ss04
+NewComputerModernSans10-Oblique; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Oblique.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernSans10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Regular.otf]:+clig;+liga;+tlig
+NewComputerModernSans10-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Regular.otf]:+clig;+liga;+tlig;+onum
+NewComputerModernSans10-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Regular.otf]:+clig;+liga;+tlig;+smcp
+NewComputerModernSans10-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Regular.otf]:+clig;+liga;+tlig;+ss01
+NewComputerModernSans10-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Regular.otf]:+clig;+liga;+tlig;+ss02
+NewComputerModernSans10-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Regular.otf]:+clig;+liga;+tlig;+ss03
+NewComputerModernSans10-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Regular.otf]:+clig;+liga;+tlig;+ss04
+NewComputerModernSans10-Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMSans10-Regular.otf]:+clig;+liga;+tlig;+ss05
+NewComputerModernUncial10-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newcomputermodern/NewCMUncial10-Regular.otf]:+clig;+liga;+tlig
+Nickel Gothic Stencil Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelGothicStencil-Regular.otf]:+clig;+liga;+tlig
+Nickel Gothic Stencil Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelGothicStencil-Regular.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic Stencil Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelGothicStencil-Regular.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic Stencil Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelGothicStencil-Regular.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic Stencil Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelGothicStencil-Regular.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic Stencil Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelGothicStencil-Regular.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic Stencil Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelGothicStencil-Regular.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic Stencil Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelGothicStencil-Regular.otf]:+clig;+liga;+tlig;+ss07
+Nickel Gothic Stencil Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelGothicStencil-Regular.otf]:+clig;+liga;+tlig;+ss08
+Nickel Gothic Stencil Regular; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelGothicStencil-Regular.otf]:+clig;+liga;+tlig;+ss15
+Nickel Gothic v2 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Regular.otf]:+clig;+liga;+tlig
+Nickel Gothic v2 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Regular.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v2 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Regular.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v2 Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Regular.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v2 Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Regular.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v2 Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Regular.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v2 Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Regular.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v2 Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Regular.ttf]:+clig;+liga;+tlig
+Nickel Gothic v2 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v2 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v2 Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v2 Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v2 Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v2 Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v2 Semi Wide [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.otf]:+clig;+liga;+tlig
+Nickel Gothic v2 Semi Wide; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v2 Semi Wide; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v2 Semi Wide; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v2 Semi Wide; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v2 Semi Wide; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v2 Semi Wide; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v2 Semi Wide [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.ttf]:+clig;+liga;+tlig
+Nickel Gothic v2 Semi Wide; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.ttf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v2 Semi Wide; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.ttf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v2 Semi Wide; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.ttf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v2 Semi Wide; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.ttf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v2 Semi Wide; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.ttf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v2 Semi Wide; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-SemiWide.ttf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v2 Variable Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2Variable-VF.ttf]:+clig;+liga;+tlig
+Nickel Gothic v2 Variable Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2Variable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v2 Variable Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2Variable-VF.ttf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v2 Variable Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2Variable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v2 Variable Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2Variable-VF.ttf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v2 Variable Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2Variable-VF.ttf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v2 Variable Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2Variable-VF.ttf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v2 Wide [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Wide.otf]:+clig;+liga;+tlig
+Nickel Gothic v2 Wide; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Wide.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v2 Wide; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Wide.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v2 Wide; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Wide.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v2 Wide; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Wide.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v2 Wide; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Wide.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v2 Wide; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic/NickelGothicV2-Wide.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v2 Wide [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Wide.ttf]:+clig;+liga;+tlig
+Nickel Gothic v2 Wide; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Wide.ttf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v2 Wide; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Wide.ttf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v2 Wide; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Wide.ttf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v2 Wide; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Wide.ttf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v2 Wide; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Wide.ttf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v2 Wide; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic/NickelGothicV2-Wide.ttf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v3 Compressed [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Compressed.otf]:+clig;+liga;+tlig
+Nickel Gothic v3 Compressed; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Compressed.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v3 Compressed; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Compressed.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v3 Compressed; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Compressed.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v3 Compressed; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Compressed.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v3 Compressed; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Compressed.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v3 Compressed; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Compressed.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v3 Compressed; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Compressed.otf]:+clig;+liga;+tlig;+ss07
+Nickel Gothic v3 Condensed [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Condensed.otf]:+clig;+liga;+tlig
+Nickel Gothic v3 Condensed; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Condensed.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v3 Condensed; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Condensed.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v3 Condensed; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Condensed.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v3 Condensed; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Condensed.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v3 Condensed; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Condensed.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v3 Condensed; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Condensed.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v3 Condensed; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Condensed.otf]:+clig;+liga;+tlig;+ss07
+Nickel Gothic v3 Extra Condensed [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-ExtraCondensed.otf]:+clig;+liga;+tlig
+Nickel Gothic v3 Extra Condensed; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-ExtraCondensed.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v3 Extra Condensed; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-ExtraCondensed.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v3 Extra Condensed; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-ExtraCondensed.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v3 Extra Condensed; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-ExtraCondensed.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v3 Extra Condensed; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-ExtraCondensed.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v3 Extra Condensed; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-ExtraCondensed.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v3 Extra Condensed; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-ExtraCondensed.otf]:+clig;+liga;+tlig;+ss07
+Nickel Gothic v3 Narrow [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Narrow.otf]:+clig;+liga;+tlig
+Nickel Gothic v3 Narrow; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Narrow.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v3 Narrow; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Narrow.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v3 Narrow; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Narrow.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v3 Narrow; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Narrow.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v3 Narrow; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Narrow.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v3 Narrow; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Narrow.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v3 Narrow; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Narrow.otf]:+clig;+liga;+tlig;+ss07
+Nickel Gothic v3 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Regular.otf]:+clig;+liga;+tlig
+Nickel Gothic v3 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Regular.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v3 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Regular.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v3 Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Regular.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v3 Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Regular.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v3 Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Regular.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v3 Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Regular.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v3 Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Regular.otf]:+clig;+liga;+tlig;+ss07
+Nickel Gothic v3 Semi Wide [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-SemiWide.otf]:+clig;+liga;+tlig
+Nickel Gothic v3 Semi Wide; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-SemiWide.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v3 Semi Wide; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-SemiWide.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v3 Semi Wide; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-SemiWide.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v3 Semi Wide; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-SemiWide.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v3 Semi Wide; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-SemiWide.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v3 Semi Wide; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-SemiWide.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v3 Semi Wide; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-SemiWide.otf]:+clig;+liga;+tlig;+ss07
+Nickel Gothic v3 Variable [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic-v3/NickelGothicV3Variable_slnt,wdth_.ttf]:+clig;+liga;+tlig
+Nickel Gothic v3 Variable; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic-v3/NickelGothicV3Variable_slnt,wdth_.ttf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v3 Variable; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic-v3/NickelGothicV3Variable_slnt,wdth_.ttf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v3 Variable; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic-v3/NickelGothicV3Variable_slnt,wdth_.ttf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v3 Variable; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic-v3/NickelGothicV3Variable_slnt,wdth_.ttf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v3 Variable; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic-v3/NickelGothicV3Variable_slnt,wdth_.ttf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v3 Variable; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic-v3/NickelGothicV3Variable_slnt,wdth_.ttf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v3 Variable; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Nickel-Gothic-v3/NickelGothicV3Variable_slnt,wdth_.ttf]:+clig;+liga;+tlig;+ss07
+Nickel Gothic v3 Wide [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Wide.otf]:+clig;+liga;+tlig
+Nickel Gothic v3 Wide; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Wide.otf]:+clig;+liga;+tlig;+ss01
+Nickel Gothic v3 Wide; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Wide.otf]:+clig;+liga;+tlig;+ss02
+Nickel Gothic v3 Wide; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Wide.otf]:+clig;+liga;+tlig;+ss03
+Nickel Gothic v3 Wide; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Wide.otf]:+clig;+liga;+tlig;+ss04
+Nickel Gothic v3 Wide; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Wide.otf]:+clig;+liga;+tlig;+ss05
+Nickel Gothic v3 Wide; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Wide.otf]:+clig;+liga;+tlig;+ss06
+Nickel Gothic v3 Wide; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Gothic-v3/NickelGothicV3-Wide.otf]:+clig;+liga;+tlig;+ss07
+Nickel Stencil Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelStencil-Regular.otf]:+clig;+liga;+tlig
+Nickel Stencil Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelStencil-Regular.otf]:+clig;+liga;+tlig;+ss01
+Nickel Stencil Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelStencil-Regular.otf]:+clig;+liga;+tlig;+ss02
+Nickel Stencil Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelStencil-Regular.otf]:+clig;+liga;+tlig;+ss03
+Nickel Stencil Regular; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-Stencils/NickelStencil-Regular.otf]:+clig;+liga;+tlig;+ss15
+Nickel v2 Color Blue [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Blue.otf]:+clig;+liga;+tlig
+Nickel v2 Color Blue; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Blue.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Color Blue; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Blue.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Color Goldenrod [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Goldenrod.otf]:+clig;+liga;+tlig
+Nickel v2 Color Goldenrod; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Goldenrod.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Color Goldenrod; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Goldenrod.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Color Pink [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Pink.otf]:+clig;+liga;+tlig
+Nickel v2 Color Pink; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Pink.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Color Pink; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Pink.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Color Red [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Red.otf]:+clig;+liga;+tlig
+Nickel v2 Color Red; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Red.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Color Red; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Red.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Color Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Regular.otf]:+clig;+liga;+tlig
+Nickel v2 Color Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Regular.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Color Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Regular.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Color Silver [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Silver.otf]:+clig;+liga;+tlig
+Nickel v2 Color Silver; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Silver.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Color Silver; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Color-Silver.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Layers Base [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-Base.otf]:+clig;+liga;+tlig
+Nickel v2 Layers Base; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-Base.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Layers Base; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-Base.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Layers Highlight [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-Highlight.otf]:+clig;+liga;+tlig
+Nickel v2 Layers Highlight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-Highlight.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Layers Highlight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-Highlight.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Layers Inline [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-Inline.otf]:+clig;+liga;+tlig
+Nickel v2 Layers Inline; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-Inline.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Layers Inline; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-Inline.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Layers Open Face [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-OpenFace.otf]:+clig;+liga;+tlig
+Nickel v2 Layers Open Face; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-OpenFace.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Layers Open Face; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2Layers-OpenFace.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Open Face [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2-OpenFace.otf]:+clig;+liga;+tlig
+Nickel v2 Open Face; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2-OpenFace.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Open Face; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2-OpenFace.otf]:+clig;+liga;+tlig;+ss02
+Nickel v2 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2-Regular.otf]:+clig;+liga;+tlig
+Nickel v2 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2-Regular.otf]:+clig;+liga;+tlig;+ss01
+Nickel v2 Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Nickel-v2/NickelV2-Regular.otf]:+clig;+liga;+tlig;+ss02
+Nikki New Roman GD [/usr/local/texlive/texmf-local/fonts/truetype/Galapagos/TrueType/NikkiNR_.ttf]:+clig;+liga;+tlig
+NimbusMono-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zco-Bold.otf]:+clig;+liga;+tlig
+NimbusMono-BoldOblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zco-BoldOblique.otf]:+clig;+liga;+tlig
+NimbusMono-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zco-Oblique.otf]:+clig;+liga;+tlig
+NimbusMono-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zco-LightOblique.otf]:+clig;+liga;+tlig
+NimbusMono-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zcoN-Regular.otf]:+clig;+liga;+tlig
+NimbusMono-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zco-Light.otf]:+clig;+liga;+tlig
+NimbusMono-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zcoN-Oblique.otf]:+clig;+liga;+tlig
+NimbusMono-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zco-Regular.otf]:+clig;+liga;+tlig
+NimbusSanL-Bol [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zhv-Bol.otf]:+clig;+liga;+tlig
+NimbusSanL-BolIta [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zhv-BolIta.otf]:+clig;+liga;+tlig
+NimbusSanL-Reg [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zhv-Reg.otf]:+clig;+liga;+tlig
+NimbusSanL-RegIta [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/zhv-RegIta.otf]:+clig;+liga;+tlig
+Norasi [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi.otf]:+clig;+liga;+tlig
+Norasi; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi.otf]:+clig;+liga;+tlig;+onum
+Norasi; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi.otf]:+clig;+liga;+tlig;+smcp
+Norasi Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-Bold.otf]:+clig;+liga;+tlig
+Norasi Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-Bold.otf]:+clig;+liga;+tlig;+onum
+Norasi Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-Bold.otf]:+clig;+liga;+tlig;+smcp
+Norasi Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-BoldItalic.otf]:+clig;+liga;+tlig
+Norasi Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Norasi Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Norasi Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-BoldOblique.otf]:+clig;+liga;+tlig
+Norasi Bold Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-BoldOblique.otf]:+clig;+liga;+tlig;+onum
+Norasi Bold Oblique; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-BoldOblique.otf]:+clig;+liga;+tlig;+smcp
+Norasi Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-Italic.otf]:+clig;+liga;+tlig
+Norasi Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-Italic.otf]:+clig;+liga;+tlig;+onum
+Norasi Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-Italic.otf]:+clig;+liga;+tlig;+smcp
+Norasi Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-Oblique.otf]:+clig;+liga;+tlig
+Norasi Oblique; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-Oblique.otf]:+clig;+liga;+tlig;+onum
+Norasi Oblique; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Norasi-Oblique.otf]:+clig;+liga;+tlig;+smcp
+Noteworthy Bold [/System/Library/Fonts/Noteworthy.ttc](1):+clig;+liga;+tlig
+Noteworthy Light [/System/Library/Fonts/Noteworthy.ttc](0):+clig;+liga;+tlig
+Noto Emoji [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto-emoji/NotoEmoji-Regular.ttf]:+clig;+liga;+tlig
+Noto Nastaliq Urdu [/System/Library/Fonts/NotoNastaliq.ttc](0):+clig;+liga;+tlig
+Noto Nastaliq Urdu Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoNastaliqUrdu/NotoNastaliqUrdu-Bold.ttf]:+clig;+liga;+tlig
+Noto Nastaliq Urdu Bold [/System/Library/Fonts/NotoNastaliq.ttc](2):+clig;+liga;+tlig
+Noto Nastaliq Urdu Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoNastaliqUrdu/NotoNastaliqUrdu-Medium.ttf]:+clig;+liga;+tlig
+Noto Nastaliq Urdu Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoNastaliqUrdu/NotoNastaliqUrdu-VariableFont_wght.ttf]:+clig;+liga;+tlig
+Noto Nastaliq Urdu Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoNastaliqUrdu/NotoNastaliqUrdu-Regular.ttf]:+clig;+liga;+tlig
+Noto Nastaliq Urdu SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoNastaliqUrdu/NotoNastaliqUrdu-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans Anatolian Hieroglyphs Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/luwiantype/LuwianFont.ttf]:+clig;+liga;+tlig
+Noto Sans Armenian Black [/System/Library/Fonts/NotoSansArmenian.ttc](0):+clig;+liga;+tlig
+Noto Sans Armenian Bold [/System/Library/Fonts/NotoSansArmenian.ttc](1):+clig;+liga;+tlig
+Noto Sans Armenian ExtraBold [/System/Library/Fonts/NotoSansArmenian.ttc](2):+clig;+liga;+tlig
+Noto Sans Armenian ExtraLight [/System/Library/Fonts/NotoSansArmenian.ttc](3):+clig;+liga;+tlig
+Noto Sans Armenian Light [/System/Library/Fonts/NotoSansArmenian.ttc](4):+clig;+liga;+tlig
+Noto Sans Armenian Medium [/System/Library/Fonts/NotoSansArmenian.ttc](5):+clig;+liga;+tlig
+Noto Sans Armenian Regular [/System/Library/Fonts/NotoSansArmenian.ttc](6):+clig;+liga;+tlig
+Noto Sans Armenian SemiBold [/System/Library/Fonts/NotoSansArmenian.ttc](7):+clig;+liga;+tlig
+Noto Sans Armenian Thin [/System/Library/Fonts/NotoSansArmenian.ttc](8):+clig;+liga;+tlig
+Noto Sans Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Black.ttf]:+clig;+liga;+tlig
+Noto Sans Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Black.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Black.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Black.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Black.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Black; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Black.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Black; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Black.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BlackItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BlackItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BlackItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Bold.ttf]:+clig;+liga;+tlig
+Noto Sans Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Bold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Bold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Bold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-BoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans CJK SC Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Black.otf]:+clig;+liga;+tlig
+Noto Sans CJK SC Black; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Black.otf]:+clig;+liga;+tlig;+hist
+Noto Sans CJK SC Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Bold.otf]:+clig;+liga;+tlig
+Noto Sans CJK SC Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Bold.otf]:+clig;+liga;+tlig;+hist
+Noto Sans CJK SC DemiLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-DemiLight.otf]:+clig;+liga;+tlig
+Noto Sans CJK SC DemiLight; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-DemiLight.otf]:+clig;+liga;+tlig;+hist
+Noto Sans CJK SC Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Light.otf]:+clig;+liga;+tlig
+Noto Sans CJK SC Light; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Light.otf]:+clig;+liga;+tlig;+hist
+Noto Sans CJK SC Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Medium.otf]:+clig;+liga;+tlig
+Noto Sans CJK SC Medium; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Medium.otf]:+clig;+liga;+tlig;+hist
+Noto Sans CJK SC Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Regular.otf]:+clig;+liga;+tlig
+Noto Sans CJK SC Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Regular.otf]:+clig;+liga;+tlig;+hist
+Noto Sans CJK SC Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Thin.otf]:+clig;+liga;+tlig
+Noto Sans CJK SC Thin; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansCJKsc-Thin.otf]:+clig;+liga;+tlig;+hist
+Noto Sans Condensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-Condensed.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-Condensed.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-Condensed.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-Condensed.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-Condensed.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-Condensed.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Condensed; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-Condensed.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Condensed Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlack.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlack.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlack.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlack.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlack.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed Black; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlack.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Condensed Black; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlack.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Condensed Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlackItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Condensed Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Condensed Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBold.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Condensed Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Condensed Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Condensed Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Condensed Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBold.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed ExtraBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Condensed ExtraBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Condensed ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Condensed ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Condensed ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLight.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed ExtraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed ExtraLight; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Condensed ExtraLight; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Condensed ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Condensed ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Condensed ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed ExtraLight Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Condensed Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Condensed Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLight.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLight.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLight.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Condensed Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLight.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Condensed Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLightItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Condensed Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Condensed Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMedium.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMedium.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMedium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMedium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMedium.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMedium.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Condensed Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMedium.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Condensed Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMediumItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Condensed Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Condensed Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed SemiBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed SemiBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Condensed SemiBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Condensed SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Condensed SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Condensed SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed SemiBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThin.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThin.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThin.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Condensed Thin; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThin.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Condensed Thin; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThin.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Condensed Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThinItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Condensed Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Condensed Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Condensed Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Condensed Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Condensed Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Condensed Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensed.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensed.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensed.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensed.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensed.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensed.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraCondensed; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensed.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraCondensed Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed Black; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraCondensed Black; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraCondensed Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraCondensed Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraCondensed Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBold.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraCondensed Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraCondensed Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraCondensed Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraCondensed Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed ExtraBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraCondensed ExtraBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraCondensed ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraCondensed ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraCondensed ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed ExtraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed ExtraLight; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraCondensed ExtraLight; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraCondensed ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraCondensed ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraCondensed ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed ExtraLight Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraCondensed Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraCondensed Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLight.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraCondensed Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraCondensed Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraCondensed Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraCondensed Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraCondensed Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraCondensed Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraCondensed Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraCondensed Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed SemiBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed SemiBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraCondensed SemiBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraCondensed SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraCondensed SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraCondensed SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed SemiBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThin.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraCondensed Thin; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraCondensed Thin; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraCondensed Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraCondensed Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraCondensed Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraCondensed Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraCondensed Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraCondensed Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraCondensed Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLight.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans ExtraLight; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLight.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans ExtraLight; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLight.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Sans ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans ExtraLight Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Italic.ttf]:+clig;+liga;+tlig
+Noto Sans Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Italic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Italic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Kannada Black [/System/Library/Fonts/NotoSansKannada.ttc](8):+clig;+liga;+tlig
+Noto Sans Kannada Bold [/System/Library/Fonts/NotoSansKannada.ttc](6):+clig;+liga;+tlig
+Noto Sans Kannada ExtraBold [/System/Library/Fonts/NotoSansKannada.ttc](7):+clig;+liga;+tlig
+Noto Sans Kannada ExtraLight [/System/Library/Fonts/NotoSansKannada.ttc](1):+clig;+liga;+tlig
+Noto Sans Kannada Light [/System/Library/Fonts/NotoSansKannada.ttc](2):+clig;+liga;+tlig
+Noto Sans Kannada Medium [/System/Library/Fonts/NotoSansKannada.ttc](4):+clig;+liga;+tlig
+Noto Sans Kannada Regular [/System/Library/Fonts/NotoSansKannada.ttc](3):+clig;+liga;+tlig
+Noto Sans Kannada SemiBold [/System/Library/Fonts/NotoSansKannada.ttc](5):+clig;+liga;+tlig
+Noto Sans Kannada Thin [/System/Library/Fonts/NotoSansKannada.ttc](0):+clig;+liga;+tlig
+Noto Sans Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Light.ttf]:+clig;+liga;+tlig
+Noto Sans Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Light.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Light.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Light.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Light.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Light.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Light.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-LightItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-LightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-LightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-LightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-LightItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Medium.ttf]:+clig;+liga;+tlig
+Noto Sans Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Medium.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Medium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Medium.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Medium.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Medium.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-MediumItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-MediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-MediumItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-MediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-MediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-MediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-MediumItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Meetei Mayek Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansMeeteiMayek/NotoSansMeeteiMayek-Black.ttf]:+clig;+liga;+tlig
+Noto Sans Meetei Mayek Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansMeeteiMayek/NotoSansMeeteiMayek-Bold.ttf]:+clig;+liga;+tlig
+Noto Sans Meetei Mayek ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansMeeteiMayek/NotoSansMeeteiMayek-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Sans Meetei Mayek ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansMeeteiMayek/NotoSansMeeteiMayek-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Sans Meetei Mayek Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansMeeteiMayek/NotoSansMeeteiMayek-Light.ttf]:+clig;+liga;+tlig
+Noto Sans Meetei Mayek Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansMeeteiMayek/NotoSansMeeteiMayek-Medium.ttf]:+clig;+liga;+tlig
+Noto Sans Meetei Mayek Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansMeeteiMayek/NotoSansMeeteiMayek-VariableFont_wght.ttf]:+clig;+liga;+tlig
+Noto Sans Meetei Mayek Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansMeeteiMayek/NotoSansMeeteiMayek-Regular.ttf]:+clig;+liga;+tlig
+Noto Sans Meetei Mayek SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansMeeteiMayek/NotoSansMeeteiMayek-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans Meetei Mayek Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansMeeteiMayek/NotoSansMeeteiMayek-Thin.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Black.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Black.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Black.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Black.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Bold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Bold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono CJK SC Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansMonoCJKsc-Bold.otf]:+clig;+liga;+tlig
+Noto Sans Mono CJK SC Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansMonoCJKsc-Bold.otf]:+clig;+liga;+tlig;+hist
+Noto Sans Mono CJK SC Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansMonoCJKsc-Regular.otf]:+clig;+liga;+tlig
+Noto Sans Mono CJK SC Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSansMonoCJKsc-Regular.otf]:+clig;+liga;+tlig;+hist
+Noto Sans Mono Condensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-Condensed.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Condensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-Condensed.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Condensed; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-Condensed.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Condensed; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-Condensed.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Condensed Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedBlack.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Condensed Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedBlack.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Condensed Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedBlack.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Condensed Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedBlack.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Condensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Condensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Condensed Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Condensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Condensed ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedExtraBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Condensed ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Condensed ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Condensed ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Condensed ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedExtraLight.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Condensed ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Condensed ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Condensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Condensed Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedLight.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Condensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Condensed Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Condensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Condensed Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedMedium.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Condensed Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedMedium.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Condensed Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedMedium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Condensed Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedMedium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Condensed SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedSemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Condensed SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Condensed SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Condensed SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Condensed Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedThin.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Condensed Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedThin.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Condensed Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedThin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Condensed Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-CondensedThin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-ExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-ExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraCondensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensed.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraCondensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensed.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraCondensed; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensed.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraCondensed; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensed.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraCondensed Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraCondensed Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraCondensed Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraCondensed Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraCondensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraCondensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraCondensed Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraCondensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraCondensed ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraCondensed ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraCondensed ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraCondensed ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraCondensed ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraCondensed ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraCondensed ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraCondensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraCondensed Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedLight.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraCondensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraCondensed Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraCondensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraCondensed Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraCondensed Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraCondensed Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraCondensed Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraCondensed SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraCondensed SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraCondensed SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraCondensed SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraCondensed Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedThin.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraCondensed Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraCondensed Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraCondensed Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Sans Mono ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-ExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-ExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Light.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Light.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Light.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Light.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Medium.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Medium.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Medium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Regular.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Regular.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-SemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-SemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono SemiCondensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensed.ttf]:+clig;+liga;+tlig
+Noto Sans Mono SemiCondensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensed.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono SemiCondensed; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensed.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono SemiCondensed; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensed.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono SemiCondensed Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedBlack.ttf]:+clig;+liga;+tlig
+Noto Sans Mono SemiCondensed Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono SemiCondensed Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono SemiCondensed Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono SemiCondensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono SemiCondensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono SemiCondensed Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono SemiCondensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono SemiCondensed ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono SemiCondensed ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono SemiCondensed ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono SemiCondensed ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono SemiCondensed ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig
+Noto Sans Mono SemiCondensed ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono SemiCondensed ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono SemiCondensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono SemiCondensed Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedLight.ttf]:+clig;+liga;+tlig
+Noto Sans Mono SemiCondensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono SemiCondensed Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono SemiCondensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono SemiCondensed Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedMedium.ttf]:+clig;+liga;+tlig
+Noto Sans Mono SemiCondensed Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono SemiCondensed Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono SemiCondensed Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono SemiCondensed SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans Mono SemiCondensed SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono SemiCondensed SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono SemiCondensed SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono SemiCondensed Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedThin.ttf]:+clig;+liga;+tlig
+Noto Sans Mono SemiCondensed Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono SemiCondensed Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono SemiCondensed Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSansMono-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Mono Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Thin.ttf]:+clig;+liga;+tlig
+Noto Sans Mono Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Thin.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Mono Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Thin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Mono Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSansMono-Thin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Ol Chiki Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansOlChiki/NotoSansOlChiki-Bold.ttf]:+clig;+liga;+tlig
+Noto Sans Ol Chiki Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansOlChiki/NotoSansOlChiki-Medium.ttf]:+clig;+liga;+tlig
+Noto Sans Ol Chiki Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansOlChiki/NotoSansOlChiki-Regular.ttf]:+clig;+liga;+tlig
+Noto Sans Ol Chiki Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansOlChiki/NotoSansOlChiki-VariableFont_wght.ttf]:+clig;+liga;+tlig
+Noto Sans Ol Chiki SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSansOlChiki/NotoSansOlChiki-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans Oriya [/System/Library/Fonts/NotoSansOriya.ttc](0):+clig;+liga;+tlig
+Noto Sans Oriya Bold [/System/Library/Fonts/NotoSansOriya.ttc](1):+clig;+liga;+tlig
+Noto Sans Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Regular.ttf]:+clig;+liga;+tlig
+Noto Sans Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Regular.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans SemiBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensed.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensed.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensed.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensed.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensed.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensed.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans SemiCondensed; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensed.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiCondensed Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlack.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed Black; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans SemiCondensed Black; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiCondensed Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans SemiCondensed Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans SemiCondensed Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBold.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans SemiCondensed Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiCondensed Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans SemiCondensed Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans SemiCondensed Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed ExtraBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans SemiCondensed ExtraBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiCondensed ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans SemiCondensed ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans SemiCondensed ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed ExtraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed ExtraLight; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans SemiCondensed ExtraLight; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiCondensed ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans SemiCondensed ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans SemiCondensed ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed ExtraLight Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedItalic.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans SemiCondensed Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans SemiCondensed Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLight.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans SemiCondensed Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiCondensed Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans SemiCondensed Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans SemiCondensed Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMedium.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans SemiCondensed Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiCondensed Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans SemiCondensed Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans SemiCondensed Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed SemiBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed SemiBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans SemiCondensed SemiBold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiCondensed SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans SemiCondensed SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans SemiCondensed SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed SemiBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThin.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans SemiCondensed Thin; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans SemiCondensed Thin; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans SemiCondensed Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig
+Noto Sans SemiCondensed Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans SemiCondensed Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans SemiCondensed Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans SemiCondensed Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans SemiCondensed Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans SemiCondensed Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSans-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Thin.ttf]:+clig;+liga;+tlig
+Noto Sans Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Thin.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Thin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Thin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Thin.ttf]:+clig;+liga;+tlig;+ss04
+Noto Sans Thin; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Thin.ttf]:+clig;+liga;+tlig;+ss06
+Noto Sans Thin; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-Thin.ttf]:+clig;+liga;+tlig;+ss07
+Noto Sans Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ThinItalic.ttf]:+clig;+liga;+tlig
+Noto Sans Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Sans Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ThinItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Sans Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Sans Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Sans Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Sans Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSans-ThinItalic.ttf]:+clig;+liga;+tlig;+ss04
+Noto Serif Bengali Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Condensed Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_Condensed-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Condensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_Condensed-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Condensed ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_Condensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Condensed ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_Condensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Condensed Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_Condensed-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Condensed Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_Condensed-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Condensed Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_Condensed-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Condensed SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_Condensed-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Condensed Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_Condensed-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraCondensed Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_ExtraCondensed-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraCondensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_ExtraCondensed-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraCondensed ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_ExtraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraCondensed ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_ExtraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraCondensed Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_ExtraCondensed-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraCondensed Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_ExtraCondensed-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraCondensed Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_ExtraCondensed-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraCondensed SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_ExtraCondensed-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraCondensed Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_ExtraCondensed-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali-VariableFont_wdth,wght.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali SemiCondensed Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_SemiCondensed-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali SemiCondensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_SemiCondensed-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali SemiCondensed ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_SemiCondensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali SemiCondensed ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_SemiCondensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali SemiCondensed Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_SemiCondensed-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali SemiCondensed Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_SemiCondensed-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali SemiCondensed Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_SemiCondensed-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali SemiCondensed SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_SemiCondensed-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali SemiCondensed Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali_SemiCondensed-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Bengali Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifBengali/NotoSerifBengali-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Black.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Black.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Black.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BlackItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BlackItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Bold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif CJK SC [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-Regular.otf]:+clig;+liga;+tlig
+Noto Serif CJK SC; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-Regular.otf]:+clig;+liga;+tlig;+hist
+Noto Serif CJK SC Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-Black.otf]:+clig;+liga;+tlig
+Noto Serif CJK SC Black; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-Black.otf]:+clig;+liga;+tlig;+hist
+Noto Serif CJK SC Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-Bold.otf]:+clig;+liga;+tlig
+Noto Serif CJK SC Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-Bold.otf]:+clig;+liga;+tlig;+hist
+Noto Serif CJK SC ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-ExtraLight.otf]:+clig;+liga;+tlig
+Noto Serif CJK SC ExtraLight; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-ExtraLight.otf]:+clig;+liga;+tlig;+hist
+Noto Serif CJK SC Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-Light.otf]:+clig;+liga;+tlig
+Noto Serif CJK SC Light; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-Light.otf]:+clig;+liga;+tlig;+hist
+Noto Serif CJK SC Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-Medium.otf]:+clig;+liga;+tlig
+Noto Serif CJK SC Medium; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-Medium.otf]:+clig;+liga;+tlig;+hist
+Noto Serif CJK SC SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-SemiBold.otf]:+clig;+liga;+tlig
+Noto Serif CJK SC SemiBold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/notocjksc/NotoSerifCJKsc-SemiBold.otf]:+clig;+liga;+tlig;+hist
+Noto Serif Condensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-Condensed.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-Condensed.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-Condensed.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-Condensed.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBlack.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBlack.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBlack.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBlack.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBlackItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Condensed Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Condensed Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBold.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Condensed Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Condensed Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Condensed ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Condensed ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Condensed ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Condensed ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Condensed Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Condensed Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedLight.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Condensed Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Condensed Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedMedium.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedMedium.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedMedium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedMedium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedMediumItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Condensed Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Condensed Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedSemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Condensed SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Condensed SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedThin.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedThin.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedThin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedThin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Condensed Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedThinItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Condensed Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Condensed Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Condensed Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Condensed Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Condensed Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-CondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensed.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensed.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensed.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensed.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBlack.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraCondensed Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraCondensed Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBold.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraCondensed Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraCondensed Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraCondensed ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraCondensed ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraCondensed ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraCondensed ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraCondensed Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraCondensed Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedLight.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraCondensed Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraCondensed Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedMedium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraCondensed Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraCondensed Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraCondensed SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraCondensed SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedThin.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedThin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraCondensed Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraCondensed Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraCondensed Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraCondensed Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraCondensed Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraCondensed Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-ExtraCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Italic.ttf]:+clig;+liga;+tlig
+Noto Serif Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Italic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Kannada Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifKannada/NotoSerifKannada-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Kannada Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifKannada/NotoSerifKannada-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Kannada ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifKannada/NotoSerifKannada-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Kannada ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifKannada/NotoSerifKannada-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Kannada Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifKannada/NotoSerifKannada-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Kannada Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifKannada/NotoSerifKannada-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Kannada Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifKannada/NotoSerifKannada-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Kannada Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifKannada/NotoSerifKannada-VariableFont_wght.ttf]:+clig;+liga;+tlig
+Noto Serif Kannada SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifKannada/NotoSerifKannada-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Kannada Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifKannada/NotoSerifKannada-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Black.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Condensed Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Condensed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Black.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Condensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Condensed ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Condensed ExtraBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Condensed ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Condensed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Condensed Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Condensed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Light.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Condensed Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Condensed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Condensed Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Condensed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Condensed SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Condensed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Condensed Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Condensed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_Condensed-Thin.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraCondensed Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraCondensed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Black.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraCondensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraCondensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraCondensed ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraCondensed ExtraBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraCondensed ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraCondensed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraCondensed Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraCondensed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Light.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraCondensed Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraCondensed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraCondensed Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraCondensed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraCondensed SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraCondensed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraCondensed Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraCondensed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_ExtraCondensed-Thin.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Lao ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Light.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-VariableFont_wdth,wght.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-VariableFont_wdth,wght.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao SemiCondensed Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Lao SemiCondensed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Black.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao SemiCondensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao SemiCondensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao SemiCondensed ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao SemiCondensed ExtraBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao SemiCondensed ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Lao SemiCondensed ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao SemiCondensed Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Lao SemiCondensed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Light.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao SemiCondensed Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Lao SemiCondensed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao SemiCondensed Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Lao SemiCondensed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao SemiCondensed SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Lao SemiCondensed SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao SemiCondensed Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Lao SemiCondensed Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao_SemiCondensed-Thin.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Lao Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Lao Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifLao/NotoSerifLao-Thin.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Light.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Light.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Light.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-LightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-LightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-LightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-LightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Medium.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Medium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-MediumItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-MediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-MediumItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-MediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-MediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-MediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Myanmar Black [/System/Library/Fonts/NotoSerifMyanmar.ttc](0):+clig;+liga;+tlig
+Noto Serif Myanmar Bold [/System/Library/Fonts/NotoSerifMyanmar.ttc](1):+clig;+liga;+tlig
+Noto Serif Myanmar ExtraBold [/System/Library/Fonts/NotoSerifMyanmar.ttc](2):+clig;+liga;+tlig
+Noto Serif Myanmar ExtraLight [/System/Library/Fonts/NotoSerifMyanmar.ttc](3):+clig;+liga;+tlig
+Noto Serif Myanmar Light [/System/Library/Fonts/NotoSerifMyanmar.ttc](4):+clig;+liga;+tlig
+Noto Serif Myanmar Medium [/System/Library/Fonts/NotoSerifMyanmar.ttc](5):+clig;+liga;+tlig
+Noto Serif Myanmar Regular [/System/Library/Fonts/NotoSerifMyanmar.ttc](6):+clig;+liga;+tlig
+Noto Serif Myanmar SemiBold [/System/Library/Fonts/NotoSerifMyanmar.ttc](7):+clig;+liga;+tlig
+Noto Serif Myanmar Thin [/System/Library/Fonts/NotoSerifMyanmar.ttc](8):+clig;+liga;+tlig
+Noto Serif Oriya Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifOriya/NotoSerifOriya-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Oriya Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifOriya/NotoSerifOriya-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Oriya Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifOriya/NotoSerifOriya-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Oriya Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifOriya/NotoSerifOriya-VariableFont_wght.ttf]:+clig;+liga;+tlig
+Noto Serif Oriya SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifOriya/NotoSerifOriya-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Regular.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-SemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-SemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensed.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensed.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensed.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensed.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBlack.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBlack.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif SemiCondensed Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif SemiCondensed Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBold.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif SemiCondensed Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif SemiCondensed Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif SemiCondensed ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif SemiCondensed ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif SemiCondensed ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif SemiCondensed ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedItalic.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif SemiCondensed Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif SemiCondensed Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedLight.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedLight.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif SemiCondensed Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif SemiCondensed Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedMedium.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedMedium.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif SemiCondensed Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif SemiCondensed Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedMediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif SemiCondensed SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif SemiCondensed SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedThin.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedThin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif SemiCondensed Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig
+Noto Serif SemiCondensed Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif SemiCondensed Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif SemiCondensed Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif SemiCondensed Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif SemiCondensed Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/notocondensed/NotoSerif-SemiCondensedThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Tamil Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Black Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-BlackItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-BoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Black Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-BlackItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-BoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed ExtraBold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed ExtraLight Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-Italic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Light Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-LightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Medium Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-MediumItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed SemiBold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Condensed Thin Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_Condensed-ThinItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraBold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Black Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-BlackItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-BoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed ExtraBold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed ExtraLight Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-Italic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Light Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-LightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Medium Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-MediumItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed SemiBold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraCondensed Thin Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_ExtraCondensed-ThinItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil ExtraLight Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-Italic-VariableFont_wdth,wght.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-Italic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Light Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-LightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Medium Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-MediumItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-VariableFont_wdth,wght.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiBold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Black Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-BlackItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-BoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed ExtraBold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed ExtraLight Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-Italic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Light Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-LightItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Medium Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-MediumItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed SemiBold Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil SemiCondensed Thin Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil_SemiCondensed-ThinItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Tamil Thin Italic [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTamil/NotoSerifTamil-ThinItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Telugu Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTelugu/NotoSerifTelugu-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Telugu Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTelugu/NotoSerifTelugu-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Telugu ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTelugu/NotoSerifTelugu-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Telugu ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTelugu/NotoSerifTelugu-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Telugu Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTelugu/NotoSerifTelugu-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Telugu Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTelugu/NotoSerifTelugu-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Telugu Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTelugu/NotoSerifTelugu-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Telugu Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTelugu/NotoSerifTelugu-VariableFont_wght.ttf]:+clig;+liga;+tlig
+Noto Serif Telugu SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTelugu/NotoSerifTelugu-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Telugu Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTelugu/NotoSerifTelugu-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Thin.ttf]:+clig;+liga;+tlig
+Noto Serif Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Thin.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Thin.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-Thin.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ThinItalic.ttf]:+clig;+liga;+tlig
+Noto Serif Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Noto Serif Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ThinItalic.ttf]:+clig;+liga;+tlig;+smcp
+Noto Serif Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Noto Serif Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Noto Serif Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/noto/NotoSerif-ThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Noto Serif Tibetan Black [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTibetan/NotoSerifTibetan-Black.ttf]:+clig;+liga;+tlig
+Noto Serif Tibetan Bold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTibetan/NotoSerifTibetan-Bold.ttf]:+clig;+liga;+tlig
+Noto Serif Tibetan ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTibetan/NotoSerifTibetan-ExtraBold.ttf]:+clig;+liga;+tlig
+Noto Serif Tibetan ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTibetan/NotoSerifTibetan-ExtraLight.ttf]:+clig;+liga;+tlig
+Noto Serif Tibetan Light [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTibetan/NotoSerifTibetan-Light.ttf]:+clig;+liga;+tlig
+Noto Serif Tibetan Medium [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTibetan/NotoSerifTibetan-Medium.ttf]:+clig;+liga;+tlig
+Noto Serif Tibetan Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTibetan/NotoSerifTibetan-VariableFont_wght.ttf]:+clig;+liga;+tlig
+Noto Serif Tibetan Regular [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTibetan/NotoSerifTibetan-Regular.ttf]:+clig;+liga;+tlig
+Noto Serif Tibetan SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTibetan/NotoSerifTibetan-SemiBold.ttf]:+clig;+liga;+tlig
+Noto Serif Tibetan Thin [/usr/local/texlive/texmf-local/fonts/truetype/Google/NotoSerifTibetan/NotoSerifTibetan-Thin.ttf]:+clig;+liga;+tlig
+NovelDeco [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/novel/NovelDeco.otf]:+clig;+liga;+tlig
+NovelDeco; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/novel/NovelDeco.otf]:+clig;+liga;+tlig;+smcp
+NovelDeco; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/novel/NovelDeco.otf]:+clig;+liga;+tlig;+ss01
+NovelDeco; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/novel/NovelDeco.otf]:+clig;+liga;+tlig;+ss02
+NovelDeco; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/novel/NovelDeco.otf]:+clig;+liga;+tlig;+ss03
+NovelDeco; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/novel/NovelDeco.otf]:+clig;+liga;+tlig;+ss05
+NovelDeco; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/novel/NovelDeco.otf]:+clig;+liga;+tlig;+ssty
+Nunito Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Black.otf]:+clig;+liga;+tlig
+Nunito Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Black.otf]:+clig;+liga;+tlig;+onum
+Nunito Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Black.otf]:+clig;+liga;+tlig;+ss01
+Nunito Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Black.otf]:+clig;+liga;+tlig;+ss02
+Nunito Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-BlackItalic.otf]:+clig;+liga;+tlig
+Nunito Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Nunito Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Nunito Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-BlackItalic.otf]:+clig;+liga;+tlig;+ss02
+Nunito Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Bold.otf]:+clig;+liga;+tlig
+Nunito Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Bold.otf]:+clig;+liga;+tlig;+onum
+Nunito Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Bold.otf]:+clig;+liga;+tlig;+ss01
+Nunito Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Bold.otf]:+clig;+liga;+tlig;+ss02
+Nunito Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-BoldItalic.otf]:+clig;+liga;+tlig
+Nunito Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Nunito Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Nunito Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Nunito ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraBold.otf]:+clig;+liga;+tlig
+Nunito ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Nunito ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Nunito ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Nunito ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Nunito ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Nunito ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Nunito ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Nunito ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraLight.otf]:+clig;+liga;+tlig
+Nunito ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Nunito ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Nunito ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Nunito ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Nunito ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Nunito ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Nunito ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+Nunito Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Italic.otf]:+clig;+liga;+tlig
+Nunito Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Italic.otf]:+clig;+liga;+tlig;+onum
+Nunito Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Italic.otf]:+clig;+liga;+tlig;+ss01
+Nunito Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Italic.otf]:+clig;+liga;+tlig;+ss02
+Nunito Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Light.otf]:+clig;+liga;+tlig
+Nunito Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Light.otf]:+clig;+liga;+tlig;+onum
+Nunito Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Light.otf]:+clig;+liga;+tlig;+ss01
+Nunito Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Light.otf]:+clig;+liga;+tlig;+ss02
+Nunito Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-LightItalic.otf]:+clig;+liga;+tlig
+Nunito Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Nunito Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Nunito Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Nunito Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Regular.otf]:+clig;+liga;+tlig
+Nunito Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Regular.otf]:+clig;+liga;+tlig;+onum
+Nunito Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Regular.otf]:+clig;+liga;+tlig;+ss01
+Nunito Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-Regular.otf]:+clig;+liga;+tlig;+ss02
+Nunito SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-SemiBold.otf]:+clig;+liga;+tlig
+Nunito SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Nunito SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Nunito SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Nunito SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Nunito SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Nunito SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Nunito SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nunito/Nunito-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Oglavie Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/OglavieUnicode.otf]:+clig;+liga;+tlig
+Old Kharkiv [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/OldKharkiv/oldkharkiv-0.49.otf]:+clig;+liga;+tlig
+Old Kharkiv; Swash [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/OldKharkiv/oldkharkiv-0.49.otf]:+clig;+liga;+tlig;+swsh
+Old Standard Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Bold.otf]:+clig;+liga;+tlig
+Old Standard Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Bold.otf]:+clig;+liga;+tlig;+onum
+Old Standard Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Bold.otf]:+clig;+liga;+tlig;+smcp
+Old Standard Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Bold.otf]:+clig;+liga;+tlig;+ss01
+Old Standard Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Bold.otf]:+clig;+liga;+tlig;+ss02
+Old Standard Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Bold.otf]:+clig;+liga;+tlig;+ss05
+Old Standard Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Bold.otf]:+clig;+liga;+tlig;+ss06
+Old Standard Bold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Bold.otf]:+clig;+liga;+tlig;+ss12
+Old Standard Bold; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Bold.otf]:+clig;+liga;+tlig;+ss14
+Old Standard Bold; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Bold.otf]:+clig;+liga;+tlig;+ss15
+Old Standard Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-BoldItalic.otf]:+clig;+liga;+tlig
+Old Standard Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Old Standard Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Old Standard Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Old Standard Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Old Standard Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Old Standard Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Old Standard Bold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-BoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Old Standard Bold Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-BoldItalic.otf]:+clig;+liga;+tlig;+ss12
+Old Standard Bold Italic; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-BoldItalic.otf]:+clig;+liga;+tlig;+ss14
+Old Standard Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Italic.otf]:+clig;+liga;+tlig
+Old Standard Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Italic.otf]:+clig;+liga;+tlig;+onum
+Old Standard Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Italic.otf]:+clig;+liga;+tlig;+smcp
+Old Standard Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Italic.otf]:+clig;+liga;+tlig;+ss01
+Old Standard Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Italic.otf]:+clig;+liga;+tlig;+ss02
+Old Standard Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Italic.otf]:+clig;+liga;+tlig;+ss05
+Old Standard Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Italic.otf]:+clig;+liga;+tlig;+ss06
+Old Standard Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Italic.otf]:+clig;+liga;+tlig;+ss11
+Old Standard Italic; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Italic.otf]:+clig;+liga;+tlig;+ss12
+Old Standard Italic; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Italic.otf]:+clig;+liga;+tlig;+ss14
+Old Standard Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Regular.otf]:+clig;+liga;+tlig
+Old Standard Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Regular.otf]:+clig;+liga;+tlig;+onum
+Old Standard Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Regular.otf]:+clig;+liga;+tlig;+smcp
+Old Standard Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Regular.otf]:+clig;+liga;+tlig;+ss01
+Old Standard Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Regular.otf]:+clig;+liga;+tlig;+ss02
+Old Standard Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Regular.otf]:+clig;+liga;+tlig;+ss05
+Old Standard Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Regular.otf]:+clig;+liga;+tlig;+ss06
+Old Standard Regular; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Regular.otf]:+clig;+liga;+tlig;+ss12
+Old Standard Regular; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Regular.otf]:+clig;+liga;+tlig;+ss14
+Old Standard Regular; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Regular.otf]:+clig;+liga;+tlig;+ss15
+OldStandard-Math [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Math.otf]:+clig;+liga;+tlig
+OldStandard-Math; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Math.otf]:+clig;+liga;+tlig;+ss01
+OldStandard-Math; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/oldstandard/OldStandard-Math.otf]:+clig;+liga;+tlig;+ss02
+Open Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Bold.ttf]:+clig;+liga;+tlig
+Open Sans Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Bold.ttf]:+clig;+liga;+tlig;+onum
+Open Sans Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-BoldItalic.ttf]:+clig;+liga;+tlig
+Open Sans Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Open Sans Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans Condensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-Bold.ttf]:+clig;+liga;+tlig
+Open Sans Condensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-Bold.ttf]:+clig;+liga;+tlig;+onum
+Open Sans Condensed Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans Condensed Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans Condensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans Condensed Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-Light.ttf]:+clig;+liga;+tlig
+Open Sans Condensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-Light.ttf]:+clig;+liga;+tlig;+onum
+Open Sans Condensed Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-Light.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans Condensed Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-Light.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans Condensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-Light.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans Condensed Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-LightItalic.ttf]:+clig;+liga;+tlig
+Open Sans Condensed Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Open Sans Condensed Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans Condensed Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-LightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans Condensed Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSansCondensed-LightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-ExtraBold.ttf]:+clig;+liga;+tlig
+Open Sans ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-ExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Open Sans ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Open Sans ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Open Sans ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Italic.ttf]:+clig;+liga;+tlig
+Open Sans Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Italic.ttf]:+clig;+liga;+tlig;+onum
+Open Sans Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Light.ttf]:+clig;+liga;+tlig
+Open Sans Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Light.ttf]:+clig;+liga;+tlig;+onum
+Open Sans Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Light.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Light.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Light.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-LightItalic.ttf]:+clig;+liga;+tlig
+Open Sans Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Open Sans Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-LightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-LightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Regular.ttf]:+clig;+liga;+tlig
+Open Sans Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Regular.ttf]:+clig;+liga;+tlig;+onum
+Open Sans Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-SemiBold.ttf]:+clig;+liga;+tlig
+Open Sans SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-SemiBold.ttf]:+clig;+liga;+tlig;+onum
+Open Sans SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Open Sans SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Open Sans SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Open Sans SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Open Sans SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Open Sans SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/ascender/opensans/OpenSans-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Optima Bold [/System/Library/Fonts/Optima.ttc](1):+clig;+liga;+tlig
+Optima Bold Italic [/System/Library/Fonts/Optima.ttc](3):+clig;+liga;+tlig
+Optima ExtraBlack [/System/Library/Fonts/Optima.ttc](4):+clig;+liga;+tlig
+Optima Italic [/System/Library/Fonts/Optima.ttc](2):+clig;+liga;+tlig
+Optima Regular [/System/Library/Fonts/Optima.ttc](0):+clig;+liga;+tlig
+Ottavio v0.1 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/OttavioV0.1/OttavioV0.1-Regular.otf]:+clig;+liga;+tlig
+Ottavio v0.1 Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/OttavioV0.1/OttavioV0.1-Regular.otf]:+clig;+liga;+tlig;+ss01
+Output Sans 2 Beta Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/OutputSans2Beta/OutputSans2Beta-Regular.ttf]:+clig;+liga;+tlig
+Output Sans 2 Beta Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/OutputSans2Beta/OutputSans2Beta-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Output Sans 2 Beta Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/OutputSans2Beta/OutputSans2Beta-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Output Sans 2 Beta Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/OutputSans2Beta/OutputSans2Beta-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Output Sans 2 Beta Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/OutputSans2Beta/OutputSans2Beta-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Output Sans 2 Beta Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/OutputSans2Beta/OutputSans2Beta-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Output Sans 2 Beta Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/OutputSans2Beta/OutputSans2Beta-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Output Sans 2 Beta Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/OutputSans2Beta/OutputSans2Beta-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Overlock-Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Black-OTF.otf]:+clig;+liga;+tlig
+Overlock-Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Black-OTF.otf]:+clig;+liga;+tlig;+onum
+Overlock-Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Black-OTF.otf]:+clig;+liga;+tlig;+ss01
+Overlock-Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Black-OTF.otf]:+clig;+liga;+tlig;+ss04
+Overlock-Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Black-OTF.otf]:+clig;+liga;+tlig;+ss05
+Overlock-BlackItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BlackItalic-OTF.otf]:+clig;+liga;+tlig
+Overlock-BlackItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BlackItalic-OTF.otf]:+clig;+liga;+tlig;+onum
+Overlock-BlackItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BlackItalic-OTF.otf]:+clig;+liga;+tlig;+ss02
+Overlock-BlackItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BlackItalic-OTF.otf]:+clig;+liga;+tlig;+ss03
+Overlock-BlackItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BlackItalic-OTF.otf]:+clig;+liga;+tlig;+ss04
+Overlock-BlackItalic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BlackItalic-OTF.otf]:+clig;+liga;+tlig;+ss05
+Overlock-BlackItalic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BlackItalic-OTF.otf]:+clig;+liga;+tlig;+ss06
+Overlock-BlackItalic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BlackItalic-OTF.otf]:+clig;+liga;+tlig;+ss07
+Overlock-BlackItalic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BlackItalic-OTF.otf]:+clig;+liga;+tlig;+ss08
+Overlock-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Bold-OTF.otf]:+clig;+liga;+tlig
+Overlock-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Bold-OTF.otf]:+clig;+liga;+tlig;+onum
+Overlock-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Bold-OTF.otf]:+clig;+liga;+tlig;+ss01
+Overlock-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Bold-OTF.otf]:+clig;+liga;+tlig;+ss04
+Overlock-Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Bold-OTF.otf]:+clig;+liga;+tlig;+ss05
+Overlock-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BoldItalic-OTF.otf]:+clig;+liga;+tlig
+Overlock-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BoldItalic-OTF.otf]:+clig;+liga;+tlig;+onum
+Overlock-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BoldItalic-OTF.otf]:+clig;+liga;+tlig;+ss02
+Overlock-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BoldItalic-OTF.otf]:+clig;+liga;+tlig;+ss03
+Overlock-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BoldItalic-OTF.otf]:+clig;+liga;+tlig;+ss04
+Overlock-BoldItalic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BoldItalic-OTF.otf]:+clig;+liga;+tlig;+ss05
+Overlock-BoldItalic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BoldItalic-OTF.otf]:+clig;+liga;+tlig;+ss06
+Overlock-BoldItalic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BoldItalic-OTF.otf]:+clig;+liga;+tlig;+ss07
+Overlock-BoldItalic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-BoldItalic-OTF.otf]:+clig;+liga;+tlig;+ss08
+Overlock-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Italic-OTF.otf]:+clig;+liga;+tlig
+Overlock-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Italic-OTF.otf]:+clig;+liga;+tlig;+onum
+Overlock-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Italic-OTF.otf]:+clig;+liga;+tlig;+ss02
+Overlock-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Italic-OTF.otf]:+clig;+liga;+tlig;+ss03
+Overlock-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Italic-OTF.otf]:+clig;+liga;+tlig;+ss04
+Overlock-Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Italic-OTF.otf]:+clig;+liga;+tlig;+ss05
+Overlock-Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Italic-OTF.otf]:+clig;+liga;+tlig;+ss06
+Overlock-Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Italic-OTF.otf]:+clig;+liga;+tlig;+ss07
+Overlock-Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Italic-OTF.otf]:+clig;+liga;+tlig;+ss08
+Overlock-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Regular-OTF.otf]:+clig;+liga;+tlig
+Overlock-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Regular-OTF.otf]:+clig;+liga;+tlig;+onum
+Overlock-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Regular-OTF.otf]:+clig;+liga;+tlig;+smcp
+Overlock-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Regular-OTF.otf]:+clig;+liga;+tlig;+ss01
+Overlock-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Regular-OTF.otf]:+clig;+liga;+tlig;+ss04
+Overlock-Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/tipo/overlock/Overlock-Regular-OTF.otf]:+clig;+liga;+tlig;+ss05
+P22 Araminta Initials [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Araminta/P22AramintaInitials.otf]:+clig;+liga;+tlig
+P22 Cezanne Pro [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Cezanne/P22CezannePro.otf]:+clig;+liga;+tlig
+P22 Cezanne Pro; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Cezanne/P22CezannePro.otf]:+clig;+liga;+tlig;+hist
+P22 Cezanne Pro; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Cezanne/P22CezannePro.otf]:+clig;+liga;+tlig;+onum
+P22 Dada Zim Zum [/usr/local/texlive/texmf-local/fonts/truetype/p22/P22DUDBM.ttf]:+clig;+liga;+tlig
+P22 Posies Contour [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Posies/P22PosiesContour.otf]:+clig;+liga;+tlig
+P22 Posies Flowers [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Posies/P22PosiesFlowers.otf]:+clig;+liga;+tlig
+P22 Posies Initial [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Posies/P22PosiesInitial.otf]:+clig;+liga;+tlig
+P22 Posies Letter [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Posies/P22PosiesLetter.otf]:+clig;+liga;+tlig
+P22 Posies Solid [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Posies/P22PosiesSolid.otf]:+clig;+liga;+tlig
+P22 Posies Stems [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Posies/P22PosiesStems.otf]:+clig;+liga;+tlig
+P22Araminta-Branches [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Araminta/P22AramintaBranches.otf]:+clig;+liga;+tlig
+P22Araminta-Buds [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Araminta/P22AramintaBuds.otf]:+clig;+liga;+tlig
+P22Araminta-Caps [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Araminta/P22AramintaCaps.otf]:+clig;+liga;+tlig
+P22Araminta-Circles [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Araminta/P22AramintaCircles.otf]:+clig;+liga;+tlig
+P22Araminta-Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Araminta/P22AramintaRegular.otf]:+clig;+liga;+tlig
+P22BlancoNeg [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22BlancoNeg/P22BlaNeg.otf]:+clig;+liga;+tlig
+P22Cezanne [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Cezanne/P22CezanReg.otf]:+clig;+liga;+tlig
+P22CezanneAltOne [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Cezanne/P22CezanAltOne.otf]:+clig;+liga;+tlig
+P22CezanneAltTwo [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Cezanne/P22CezanAltTwo.otf]:+clig;+liga;+tlig
+P22ConstructivistPro [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22ConstructivistPro/P22CONPro.otf]:+clig;+liga;+tlig
+P22ConstructivistPro; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22ConstructivistPro/P22CONPro.otf]:+clig;+liga;+tlig;+smcp
+P22ConstructivistPro; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22ConstructivistPro/P22CONPro.otf]:+clig;+liga;+tlig;+ss01
+P22ConstructivistPro; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22ConstructivistPro/P22CONPro.otf]:+clig;+liga;+tlig;+ss02
+P22ConstructivistPro; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22ConstructivistPro/P22CONPro.otf]:+clig;+liga;+tlig;+ss03
+P22ConstructivistPro; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22ConstructivistPro/P22CONPro.otf]:+clig;+liga;+tlig;+ss04
+P22ConstructivistPro; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22ConstructivistPro/P22CONPro.otf]:+clig;+liga;+tlig;+swsh
+P22ConstructivistPro; Titling [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22ConstructivistPro/P22CONPro.otf]:+clig;+liga;+tlig;+titl
+P22DearestAlternates [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaAlt.otf]:+clig;+liga;+tlig
+P22DearestPro [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaPro.otf]:+clig;+liga;+tlig
+P22DearestPro; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaPro.otf]:+clig;+liga;+tlig;+onum
+P22DearestPro; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaPro.otf]:+clig;+liga;+tlig;+ss01
+P22DearestPro; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaPro.otf]:+clig;+liga;+tlig;+ss02
+P22DearestPro; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaPro.otf]:+clig;+liga;+tlig;+ss03
+P22DearestPro; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaPro.otf]:+clig;+liga;+tlig;+ss04
+P22DearestPro; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaPro.otf]:+clig;+liga;+tlig;+ss05
+P22DearestPro; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaPro.otf]:+clig;+liga;+tlig;+ss06
+P22DearestPro; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaPro.otf]:+clig;+liga;+tlig;+ss08
+P22DearestScript [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaScr.otf]:+clig;+liga;+tlig
+P22DearestSwash [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Dearest/P22DeaSwa.otf]:+clig;+liga;+tlig
+P22Gauguin [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Gauguin/P22GaugnReg.otf]:+clig;+liga;+tlig
+P22GauguinAlternate [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Gauguin/P22GaugnAlt.otf]:+clig;+liga;+tlig
+P22GauguinBrush [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Gauguin/P22GaugnBru.otf]:+clig;+liga;+tlig
+P22GauguinPro [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Gauguin/P22GauguinPro.otf]:+clig;+liga;+tlig
+P22GauguinPro; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Gauguin/P22GauguinPro.otf]:+clig;+liga;+tlig;+ss01
+P22GauguinPro; Titling [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Gauguin/P22GauguinPro.otf]:+clig;+liga;+tlig;+titl
+P22Goudy-Aries [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Goudy-Aries/P22Goudy-Ari.otf]:+clig;+liga;+tlig
+P22Goudy-Aries; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Goudy-Aries/P22Goudy-Ari.otf]:+clig;+liga;+tlig;+ss01
+P22Graciosa-Black [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Graciosa/P22GraciosaBlack.otf]:+clig;+liga;+tlig
+P22Graciosa-Gris [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Graciosa/P22GraciosaGris.otf]:+clig;+liga;+tlig
+P22Graciosa-Multi [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Graciosa/P22GraciosaMulti.otf]:+clig;+liga;+tlig
+P22Graciosa-Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Graciosa/P22GraciosaRegular.otf]:+clig;+liga;+tlig
+P22Graciosa-White [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Graciosa/P22GraciosaWhite.otf]:+clig;+liga;+tlig
+P22HufferPro [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22HufferPro/P22HufferPro.otf]:+clig;+liga;+tlig
+P22KilkennyPro [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22KilkennyPro/P22KlknyPro.otf]:+clig;+liga;+tlig
+P22KilkennyPro; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22KilkennyPro/P22KlknyPro.otf]:+clig;+liga;+tlig;+smcp
+P22KilkennyPro; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22KilkennyPro/P22KlknyPro.otf]:+clig;+liga;+tlig;+swsh
+P22KilkennyPro; Titling [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22KilkennyPro/P22KlknyPro.otf]:+clig;+liga;+tlig;+titl
+P22OperinaPro [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22OperinaPro/P22OperinaPro.otf]:+clig;+liga;+tlig
+P22OperinaPro; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22OperinaPro/P22OperinaPro.otf]:+clig;+liga;+tlig;+hist
+P22OperinaPro; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22OperinaPro/P22OperinaPro.otf]:+clig;+liga;+tlig;+onum
+P22OperinaPro; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22OperinaPro/P22OperinaPro.otf]:+clig;+liga;+tlig;+smcp
+P22OperinaPro; Swash [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22OperinaPro/P22OperinaPro.otf]:+clig;+liga;+tlig;+swsh
+P22OperinaPro; Titling [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22OperinaPro/P22OperinaPro.otf]:+clig;+liga;+tlig;+titl
+P22Specimen [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22Specimen/P22Specimen.otf]:+clig;+liga;+tlig
+P22UndergroundPro-Bold [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig
+P22UndergroundPro-Bold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-Bold; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBold.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig
+P22UndergroundPro-BoldItalic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-BoldItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-BoldItalic; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-BoldItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-BoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-BoldItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-BoldItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-BoldItalic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-BoldItalic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-BoldItalic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-BoldItalic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-BoldItalic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-BoldItalic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-BoldItalic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-BoldItalic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-ExtBdIta [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig
+P22UndergroundPro-ExtBdIta; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-ExtBdIta; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-ExtBdIta; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-ExtBdIta; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-ExtBdIta; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-ExtBdIta; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-ExtBdIta; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-ExtBdIta; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-ExtBdIta; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-ExtBdIta; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-ExtBdIta; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-ExtBdIta; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-ExtBdIta; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-ExtBdIta; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-ExtBdIta; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-ExtraBold [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig
+P22UndergroundPro-ExtraBold; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-ExtraBold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-ExtraBold; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-ExtraBold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-ExtraBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-ExtraBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-ExtraBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-ExtraBold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-ExtraBold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-ExtraBold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-ExtraBold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-ExtraBold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-ExtraBold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-ExtraBold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-ExtraBold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProExtraBold.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-Italic [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig
+P22UndergroundPro-Italic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-Italic; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProItalic.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-Light [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig
+P22UndergroundPro-Light; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-Light; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-Light; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLight.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-LightItalic [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig
+P22UndergroundPro-LightItalic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-LightItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-LightItalic; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-LightItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-LightItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-LightItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-LightItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-LightItalic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-LightItalic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-LightItalic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-LightItalic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-LightItalic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-LightItalic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-LightItalic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-LightItalic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProLightItalic.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-MedIta [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig
+P22UndergroundPro-MedIta; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-MedIta; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-MedIta; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-MedIta; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-MedIta; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-MedIta; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-MedIta; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-MedIta; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-MedIta; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-MedIta; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-MedIta; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-MedIta; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-MedIta; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-MedIta; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-MedIta; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMediumItalic.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-Medium [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig
+P22UndergroundPro-Medium; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-Medium; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-Medium; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProMedium.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-Regular [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig
+P22UndergroundPro-Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-Regular; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProRegular.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-Thin [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig
+P22UndergroundPro-Thin; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-Thin; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-Thin; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-Thin; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-Thin; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-Thin; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-Thin; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-Thin; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThin.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-ThinItalic [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig
+P22UndergroundPro-ThinItalic; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+hist
+P22UndergroundPro-ThinItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+onum
+P22UndergroundPro-ThinItalic; Petite Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+pcap
+P22UndergroundPro-ThinItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-ThinItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-ThinItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-ThinItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-ThinItalic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-ThinItalic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-ThinItalic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-ThinItalic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss07
+P22UndergroundPro-ThinItalic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss08
+P22UndergroundPro-ThinItalic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss09
+P22UndergroundPro-ThinItalic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss10
+P22UndergroundPro-ThinItalic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProThinItalic.otf]:+clig;+liga;+tlig;+ss11
+P22UndergroundPro-Titling [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProTitling.otf]:+clig;+liga;+tlig
+P22UndergroundPro-Titling; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProTitling.otf]:+clig;+liga;+tlig;+smcp
+P22UndergroundPro-Titling; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProTitling.otf]:+clig;+liga;+tlig;+ss01
+P22UndergroundPro-Titling; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProTitling.otf]:+clig;+liga;+tlig;+ss02
+P22UndergroundPro-Titling; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProTitling.otf]:+clig;+liga;+tlig;+ss03
+P22UndergroundPro-Titling; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProTitling.otf]:+clig;+liga;+tlig;+ss04
+P22UndergroundPro-Titling; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProTitling.otf]:+clig;+liga;+tlig;+ss05
+P22UndergroundPro-Titling; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProTitling.otf]:+clig;+liga;+tlig;+ss06
+P22UndergroundPro-Titling; Titling [/usr/local/texlive/texmf-local/fonts/opentype/p22/P22UndergroundPro/P22UndergroundProTitling.otf]:+clig;+liga;+tlig;+titl
+PSTricks Dots [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/luapstricks/PSTricksDotFont.otf]:+clig;+liga;+tlig
+PT Mono [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptmono/PTM55F.ttf]:+clig;+liga;+tlig
+PT Mono; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptmono/PTM55F.ttf]:+clig;+liga;+tlig;+hist
+PT Mono Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptmono/PTM75F.ttf]:+clig;+liga;+tlig
+PT Mono Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptmono/PTM75F.ttf]:+clig;+liga;+tlig;+hist
+PT Sans [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTS55F.ttf]:+clig;+liga;+tlig
+PT Sans; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTS55F.ttf]:+clig;+liga;+tlig;+hist
+PT Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTS75F.ttf]:+clig;+liga;+tlig
+PT Sans Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTS75F.ttf]:+clig;+liga;+tlig;+hist
+PT Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTS76F.ttf]:+clig;+liga;+tlig
+PT Sans Bold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTS76F.ttf]:+clig;+liga;+tlig;+hist
+PT Sans Caption [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTC55F.ttf]:+clig;+liga;+tlig
+PT Sans Caption; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTC55F.ttf]:+clig;+liga;+tlig;+hist
+PT Sans Caption Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTC75F.ttf]:+clig;+liga;+tlig
+PT Sans Caption Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTC75F.ttf]:+clig;+liga;+tlig;+hist
+PT Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTS56F.ttf]:+clig;+liga;+tlig
+PT Sans Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTS56F.ttf]:+clig;+liga;+tlig;+hist
+PT Sans Narrow [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTN57F.ttf]:+clig;+liga;+tlig
+PT Sans Narrow; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTN57F.ttf]:+clig;+liga;+tlig;+hist
+PT Sans Narrow Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTN77F.ttf]:+clig;+liga;+tlig
+PT Sans Narrow Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptsans/PTN77F.ttf]:+clig;+liga;+tlig;+hist
+PT Serif [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptserif/PTF55F.ttf]:+clig;+liga;+tlig
+PT Serif Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptserif/PTF75F.ttf]:+clig;+liga;+tlig
+PT Serif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptserif/PTF76F.ttf]:+clig;+liga;+tlig
+PT Serif Caption [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptserif/PTZ55F.ttf]:+clig;+liga;+tlig
+PT Serif Caption Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptserif/PTZ56F.ttf]:+clig;+liga;+tlig
+PT Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/paratype/ptserif/PTF56F.ttf]:+clig;+liga;+tlig
+Padauk [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/padauk/Padauk-Regular.ttf]:+clig;+liga;+tlig
+Padauk Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/padauk/Padauk-Bold.ttf]:+clig;+liga;+tlig
+Padauk Book [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/padauk/PadaukBook-Regular.ttf]:+clig;+liga;+tlig
+Padauk Book Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/padauk/PadaukBook-Bold.ttf]:+clig;+liga;+tlig
+Palatino [/System/Library/Fonts/Palatino.ttc](0):+clig;+liga;+tlig
+Palatino Bold [/System/Library/Fonts/Palatino.ttc](2):+clig;+liga;+tlig
+Palatino Bold Italic [/System/Library/Fonts/Palatino.ttc](3):+clig;+liga;+tlig
+Palatino Italic [/System/Library/Fonts/Palatino.ttc](1):+clig;+liga;+tlig
+Parsi Matn [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/parsimatn/ParsiMatn-Regular.ttf]:+clig;+liga;+tlig
+Parsi Matn Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/parsimatn/ParsiMatn-Bold.ttf]:+clig;+liga;+tlig
+Parsi Matn Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/parsimatn/ParsiMatn-BoldItalic.ttf]:+clig;+liga;+tlig
+Parsi Matn Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/parsimatn/ParsiMatn-Italic.ttf]:+clig;+liga;+tlig
+Parsi Nevis [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/parsinevis/ParsiNevis-Regular.ttf]:+clig;+liga;+tlig
+Parsi Nevis Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/parsinevis/ParsiNevis-Bold.ttf]:+clig;+liga;+tlig
+Parsi Nevis Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/parsinevis/ParsiNevis-BoldItalic.ttf]:+clig;+liga;+tlig
+Parsi Nevis Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/parsinevis/ParsiNevis-Italic.ttf]:+clig;+liga;+tlig
+Periodica-Bold [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Bold.otf]:+clig;+liga;+tlig
+Periodica-Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Bold.otf]:+clig;+liga;+tlig;+onum
+Periodica-Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Bold.otf]:+clig;+liga;+tlig;+smcp
+Periodica-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-BoldItalic.otf]:+clig;+liga;+tlig
+Periodica-BoldItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Periodica-BoldItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Periodica-ExtraBold [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraBold.otf]:+clig;+liga;+tlig
+Periodica-ExtraBold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Periodica-ExtraBold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+Periodica-ExtraBoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Periodica-ExtraBoldItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Periodica-ExtraBoldItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Periodica-ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraLight.otf]:+clig;+liga;+tlig
+Periodica-ExtraLight; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Periodica-ExtraLight; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraLight.otf]:+clig;+liga;+tlig;+smcp
+Periodica-ExtraLightItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Periodica-ExtraLightItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Periodica-ExtraLightItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-ExtraLightItalic.otf]:+clig;+liga;+tlig;+smcp
+Periodica-Heavy [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Heavy.otf]:+clig;+liga;+tlig
+Periodica-Heavy; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Heavy.otf]:+clig;+liga;+tlig;+onum
+Periodica-Heavy; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Heavy.otf]:+clig;+liga;+tlig;+smcp
+Periodica-HeavyItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-HeavyItalic.otf]:+clig;+liga;+tlig
+Periodica-HeavyItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-HeavyItalic.otf]:+clig;+liga;+tlig;+onum
+Periodica-HeavyItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-HeavyItalic.otf]:+clig;+liga;+tlig;+smcp
+Periodica-Italic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Italic.otf]:+clig;+liga;+tlig
+Periodica-Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Italic.otf]:+clig;+liga;+tlig;+onum
+Periodica-Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Italic.otf]:+clig;+liga;+tlig;+smcp
+Periodica-Light [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Light.otf]:+clig;+liga;+tlig
+Periodica-Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Light.otf]:+clig;+liga;+tlig;+onum
+Periodica-Light; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Light.otf]:+clig;+liga;+tlig;+smcp
+Periodica-LightItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-LightItalic.otf]:+clig;+liga;+tlig
+Periodica-LightItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Periodica-LightItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Periodica-Medium [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Medium.otf]:+clig;+liga;+tlig
+Periodica-Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Medium.otf]:+clig;+liga;+tlig;+onum
+Periodica-Medium; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Medium.otf]:+clig;+liga;+tlig;+smcp
+Periodica-MediumItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-MediumItalic.otf]:+clig;+liga;+tlig
+Periodica-MediumItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Periodica-MediumItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Periodica-Regular [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Regular.otf]:+clig;+liga;+tlig
+Periodica-Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Regular.otf]:+clig;+liga;+tlig;+onum
+Periodica-Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-Regular.otf]:+clig;+liga;+tlig;+smcp
+Periodica-SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-SemiBold.otf]:+clig;+liga;+tlig
+Periodica-SemiBold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Periodica-SemiBold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+Periodica-SemiBoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Periodica-SemiBoldItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Periodica-SemiBoldItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-SemiBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Periodica-UltraLight [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-UltraLight.otf]:+clig;+liga;+tlig
+Periodica-UltraLight; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-UltraLight.otf]:+clig;+liga;+tlig;+onum
+Periodica-UltraLight; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-UltraLight.otf]:+clig;+liga;+tlig;+smcp
+Periodica-UltraLightItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-UltraLightItalic.otf]:+clig;+liga;+tlig
+Periodica-UltraLightItalic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-UltraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Periodica-UltraLightItalic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Periodica/Periodica-UltraLightItalic.otf]:+clig;+liga;+tlig;+smcp
+Phaistos [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/phaistos/Phaistos.otf]:+clig;+liga;+tlig
+Philokalia Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/philokalia/Philokalia-Regular.otf]:+clig;+liga;+tlig
+PingFang HK Light [/System/Library/Fonts/PingFang.ttc](9):+clig;+liga;+tlig
+PingFang HK Medium [/System/Library/Fonts/PingFang.ttc](3):+clig;+liga;+tlig
+PingFang HK Regular [/System/Library/Fonts/PingFang.ttc](0):+clig;+liga;+tlig
+PingFang HK Semibold [/System/Library/Fonts/PingFang.ttc](6):+clig;+liga;+tlig
+PingFang HK Thin [/System/Library/Fonts/PingFang.ttc](12):+clig;+liga;+tlig
+PingFang HK Ultralight [/System/Library/Fonts/PingFang.ttc](15):+clig;+liga;+tlig
+PingFang SC Light [/System/Library/Fonts/PingFang.ttc](11):+clig;+liga;+tlig
+PingFang SC Medium [/System/Library/Fonts/PingFang.ttc](5):+clig;+liga;+tlig
+PingFang SC Regular [/System/Library/Fonts/PingFang.ttc](2):+clig;+liga;+tlig
+PingFang SC Semibold [/System/Library/Fonts/PingFang.ttc](8):+clig;+liga;+tlig
+PingFang SC Thin [/System/Library/Fonts/PingFang.ttc](14):+clig;+liga;+tlig
+PingFang SC Ultralight [/System/Library/Fonts/PingFang.ttc](17):+clig;+liga;+tlig
+PingFang TC Light [/System/Library/Fonts/PingFang.ttc](10):+clig;+liga;+tlig
+PingFang TC Medium [/System/Library/Fonts/PingFang.ttc](4):+clig;+liga;+tlig
+PingFang TC Regular [/System/Library/Fonts/PingFang.ttc](1):+clig;+liga;+tlig
+PingFang TC Semibold [/System/Library/Fonts/PingFang.ttc](7):+clig;+liga;+tlig
+PingFang TC Thin [/System/Library/Fonts/PingFang.ttc](13):+clig;+liga;+tlig
+PingFang TC Ultralight [/System/Library/Fonts/PingFang.ttc](16):+clig;+liga;+tlig
+Plain-Light [/usr/local/texlive/texmf-local/fonts/opentype/optimo/plain/Plain-Light.otf]:+clig;+liga;+tlig
+Plain-Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/optimo/plain/Plain-Light.otf]:+clig;+liga;+tlig;+onum
+Plain-LightIta [/usr/local/texlive/texmf-local/fonts/opentype/optimo/plain/Plain-LightIta.otf]:+clig;+liga;+tlig
+Plain-LightIta; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/optimo/plain/Plain-LightIta.otf]:+clig;+liga;+tlig;+onum
+Plain-Medium [/usr/local/texlive/texmf-local/fonts/opentype/optimo/plain/Plain-Medium.otf]:+clig;+liga;+tlig
+Plain-Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/optimo/plain/Plain-Medium.otf]:+clig;+liga;+tlig;+onum
+Plain-MediumIta [/usr/local/texlive/texmf-local/fonts/opentype/optimo/plain/Plain-MediumIta.otf]:+clig;+liga;+tlig
+Plain-MediumIta; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/optimo/plain/Plain-MediumIta.otf]:+clig;+liga;+tlig;+onum
+Playfair Display [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Regular.otf]:+clig;+liga;+tlig
+Playfair Display; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Regular.otf]:+clig;+liga;+tlig;+onum
+Playfair Display; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Regular.otf]:+clig;+liga;+tlig;+smcp
+Playfair Display Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Black.otf]:+clig;+liga;+tlig
+Playfair Display Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Black.otf]:+clig;+liga;+tlig;+onum
+Playfair Display Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Black.otf]:+clig;+liga;+tlig;+smcp
+Playfair Display Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-BlackItalic.otf]:+clig;+liga;+tlig
+Playfair Display Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Playfair Display Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-BlackItalic.otf]:+clig;+liga;+tlig;+smcp
+Playfair Display Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Bold.otf]:+clig;+liga;+tlig
+Playfair Display Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Bold.otf]:+clig;+liga;+tlig;+onum
+Playfair Display Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Bold.otf]:+clig;+liga;+tlig;+smcp
+Playfair Display Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-BoldItalic.otf]:+clig;+liga;+tlig
+Playfair Display Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Playfair Display Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Playfair Display Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Italic.otf]:+clig;+liga;+tlig
+Playfair Display Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Italic.otf]:+clig;+liga;+tlig;+onum
+Playfair Display Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/playfair/PlayfairDisplay-Italic.otf]:+clig;+liga;+tlig;+smcp
+Pochaevsk Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/PochaevskUnicode.otf]:+clig;+liga;+tlig
+Pochaevsk Unicode; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/PochaevskUnicode.otf]:+clig;+liga;+tlig;+ss01
+Poiret One [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/poiretone/PoiretOne-Regular.ttf]:+clig;+liga;+tlig
+Poiret One Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/poiretone/PoiretOne-Bold.ttf]:+clig;+liga;+tlig
+Pomfret Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/Pomfret-Regular.otf]:+clig;+liga;+tlig
+Pomfret Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/Pomfret-Regular.otf]:+clig;+liga;+tlig;+ss01
+Pomfret Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/Pomfret-Regular.otf]:+clig;+liga;+tlig;+ss02
+Pomfret Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/Pomfret-Regular.otf]:+clig;+liga;+tlig;+ss03
+Pomfret Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/Pomfret-Regular.otf]:+clig;+liga;+tlig;+ss04
+Pomfret Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/Pomfret-Regular.otf]:+clig;+liga;+tlig;+ss05
+Pomfret Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Pomfret/Pomfret-Regular.ttf]:+clig;+liga;+tlig
+Pomfret Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Pomfret/Pomfret-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Pomfret Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Pomfret/Pomfret-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Pomfret Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Pomfret/Pomfret-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Pomfret Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Pomfret/Pomfret-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Pomfret Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Pomfret/Pomfret-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Pomfret v3 Beta Banner [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/PomfretV3Beta-Banner.otf]:+clig;+liga;+tlig
+Pomfret v3 Beta Banner; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/PomfretV3Beta-Banner.otf]:+clig;+liga;+tlig;+ss05
+Pomfret v3 Beta Deck [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/PomfretV3Beta-Deck.otf]:+clig;+liga;+tlig
+Pomfret v3 Beta Deck; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/PomfretV3Beta-Deck.otf]:+clig;+liga;+tlig;+ss05
+Pomfret v3 Beta Display [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/PomfretV3Beta-Display.otf]:+clig;+liga;+tlig
+Pomfret v3 Beta Display; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/PomfretV3Beta-Display.otf]:+clig;+liga;+tlig;+ss05
+Pomfret v3 Beta Micro [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/PomfretV3Beta-Micro.otf]:+clig;+liga;+tlig
+Pomfret v3 Beta Micro; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/PomfretV3Beta-Micro.otf]:+clig;+liga;+tlig;+ss05
+Pomfret v3 Beta Text [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/PomfretV3Beta-Text.otf]:+clig;+liga;+tlig
+Pomfret v3 Beta Text; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Pomfret/PomfretV3Beta-Text.otf]:+clig;+liga;+tlig;+ss05
+Pomfret v3 Variable Beta Banner [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Pomfret/PomfretV3VariableBeta_opsz_.ttf]:+clig;+liga;+tlig
+Pomfret v3 Variable Beta Banner; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Pomfret/PomfretV3VariableBeta_opsz_.ttf]:+clig;+liga;+tlig;+ss05
+Pomorsky Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/PomorskyUnicode.otf]:+clig;+liga;+tlig
+Pomorsky Unicode; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/PomorskyUnicode.otf]:+clig;+liga;+tlig;+ss01
+Ponomar Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/PonomarUnicode.otf]:+clig;+liga;+tlig
+Ponomar Unicode; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/PonomarUnicode.otf]:+clig;+liga;+tlig;+ss01
+Ponomar Unicode; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/PonomarUnicode.otf]:+clig;+liga;+tlig;+ss02
+Punk Nova [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/punknova/punknova-regular.otf]:+clig;+liga;+tlig
+Punk Nova Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/punknova/punknova-bold.otf]:+clig;+liga;+tlig
+Punk Nova Bold Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/punknova/punknova-boldslanted.otf]:+clig;+liga;+tlig
+Punk Nova Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/punknova/punknova-slanted.otf]:+clig;+liga;+tlig
+Purisa [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Purisa.otf]:+clig;+liga;+tlig
+Purisa Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Purisa-Bold.otf]:+clig;+liga;+tlig
+Purisa Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Purisa-BoldOblique.otf]:+clig;+liga;+tlig
+Purisa Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Purisa-Oblique.otf]:+clig;+liga;+tlig
+QTAbbie [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTAbbie.otf]:+clig;+liga;+tlig
+QTAgateType [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTAgateType.otf]:+clig;+liga;+tlig
+QTAgateType-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTAgateType-Bold.otf]:+clig;+liga;+tlig
+QTAgateType-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTAgateType-Italic.otf]:+clig;+liga;+tlig
+QTAncientOlive [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTAncientOlive.otf]:+clig;+liga;+tlig
+QTAncientOlive-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTAncientOlive-Bold.otf]:+clig;+liga;+tlig
+QTAntiquePost [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTAntiquePost.otf]:+clig;+liga;+tlig
+QTArabian [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTArabian.otf]:+clig;+liga;+tlig
+QTArnieB [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTArnieB.otf]:+clig;+liga;+tlig
+QTArtiston [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTArtiston.otf]:+clig;+liga;+tlig
+QTAtchen [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTAtchen.otf]:+clig;+liga;+tlig
+QTAvanti [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTAvanti.otf]:+clig;+liga;+tlig
+QTAvanti-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTAvanti-Italic.otf]:+clig;+liga;+tlig
+QTBasker [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBasker.otf]:+clig;+liga;+tlig
+QTBasker-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBasker-Bold.otf]:+clig;+liga;+tlig
+QTBasker-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBasker-Italic.otf]:+clig;+liga;+tlig
+QTBeckman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBeckman.otf]:+clig;+liga;+tlig
+QTBengal [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBengal.otf]:+clig;+liga;+tlig
+QTBengal-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBengal-Bold.otf]:+clig;+liga;+tlig
+QTBlackForest [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBlackForest.otf]:+clig;+liga;+tlig
+QTBlimpo [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBlimpo.otf]:+clig;+liga;+tlig
+QTBodini [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBodini.otf]:+clig;+liga;+tlig
+QTBodini-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBodini-Bold.otf]:+clig;+liga;+tlig
+QTBodini-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBodini-Italic.otf]:+clig;+liga;+tlig
+QTBodiniPoster [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBodiniPoster.otf]:+clig;+liga;+tlig
+QTBodiniPoster-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBodiniPoster-Italic.otf]:+clig;+liga;+tlig
+QTBookmann [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBookmann.otf]:+clig;+liga;+tlig
+QTBookmann-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBookmann-Bold.otf]:+clig;+liga;+tlig
+QTBookmann-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBookmann-BoldItalic.otf]:+clig;+liga;+tlig
+QTBookmann-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBookmann-Italic.otf]:+clig;+liga;+tlig
+QTBoulevard [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBoulevard.otf]:+clig;+liga;+tlig
+QTBrushStroke [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTBrushStroke.otf]:+clig;+liga;+tlig
+QTCaligulatype [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCaligulatype.otf]:+clig;+liga;+tlig
+QTCanaithtype [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCanaithtype.otf]:+clig;+liga;+tlig
+QTCascadetype [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCascadetype.otf]:+clig;+liga;+tlig
+QTCaslan [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCaslan.otf]:+clig;+liga;+tlig
+QTCaslan-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCaslan-Bold.otf]:+clig;+liga;+tlig
+QTCaslan-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCaslan-BoldItalic.otf]:+clig;+liga;+tlig
+QTCaslan-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCaslan-Italic.otf]:+clig;+liga;+tlig
+QTCaslanOpen [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCaslanOpen.otf]:+clig;+liga;+tlig
+QTCasual [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCasual.otf]:+clig;+liga;+tlig
+QTChanceryType [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTChanceryType.otf]:+clig;+liga;+tlig
+QTChanceryType-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTChanceryType-Bold.otf]:+clig;+liga;+tlig
+QTChanceryType-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTChanceryType-Italic.otf]:+clig;+liga;+tlig
+QTChicagoland [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTChicagoland.otf]:+clig;+liga;+tlig
+QTClaytablet [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTClaytablet.otf]:+clig;+liga;+tlig
+QTCloisteredMonk [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCloisteredMonk.otf]:+clig;+liga;+tlig
+QTCoronation [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTCoronation.otf]:+clig;+liga;+tlig
+QTDeuce [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTDeuce.otf]:+clig;+liga;+tlig
+QTDoghaus [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTDoghaus.otf]:+clig;+liga;+tlig
+QTDoghausHeavy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTDoghausHeavy.otf]:+clig;+liga;+tlig
+QTDoghausLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTDoghausLight.otf]:+clig;+liga;+tlig
+QTDublinIrish [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTDublinIrish.otf]:+clig;+liga;+tlig
+QTEraType [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTEraType.otf]:+clig;+liga;+tlig
+QTEraType-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTEraType-Bold.otf]:+clig;+liga;+tlig
+QTEurotype [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTEurotype.otf]:+clig;+liga;+tlig
+QTEurotype-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTEurotype-Bold.otf]:+clig;+liga;+tlig
+QTFloraline [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFloraline.otf]:+clig;+liga;+tlig
+QTFloraline-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFloraline-Bold.otf]:+clig;+liga;+tlig
+QTFlorencia [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFlorencia.otf]:+clig;+liga;+tlig
+QTFraktur [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFraktur.otf]:+clig;+liga;+tlig
+QTFrank [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFrank.otf]:+clig;+liga;+tlig
+QTFrankHeavy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFrankHeavy.otf]:+clig;+liga;+tlig
+QTFrizQuad [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFrizQuad.otf]:+clig;+liga;+tlig
+QTFrizQuad-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFrizQuad-Bold.otf]:+clig;+liga;+tlig
+QTFuture [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFuture.otf]:+clig;+liga;+tlig
+QTFuture-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFuture-Italic.otf]:+clig;+liga;+tlig
+QTFuturePoster [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTFuturePoster.otf]:+clig;+liga;+tlig
+QTGaromand [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTGaromand.otf]:+clig;+liga;+tlig
+QTGaromand-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTGaromand-Bold.otf]:+clig;+liga;+tlig
+QTGaromand-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTGaromand-BoldItalic.otf]:+clig;+liga;+tlig
+QTGaromand-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTGaromand-Italic.otf]:+clig;+liga;+tlig
+QTGhoulFace [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTGhoulFace.otf]:+clig;+liga;+tlig
+QTGraphLite [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTGraphLite.otf]:+clig;+liga;+tlig
+QTGraveure [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTGraveure.otf]:+clig;+liga;+tlig
+QTGraveure-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTGraveure-Bold.otf]:+clig;+liga;+tlig
+QTGreece [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTGreece.otf]:+clig;+liga;+tlig
+QTHandwriting [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTHandwriting.otf]:+clig;+liga;+tlig
+QTHeidelbergType [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTHeidelbergType.otf]:+clig;+liga;+tlig
+QTHelvet-Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTHelvet-Black.otf]:+clig;+liga;+tlig
+QTHelvet-BoldOutline [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTHelvet-BoldOutline.otf]:+clig;+liga;+tlig
+QTHelvetCnd [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTHelvetCnd.otf]:+clig;+liga;+tlig
+QTHelvetCnd-Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTHelvetCnd-Black.otf]:+clig;+liga;+tlig
+QTHelvetCnd-Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTHelvetCnd-Light.otf]:+clig;+liga;+tlig
+QTHoboken [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTHoboken.otf]:+clig;+liga;+tlig
+QTHowardType [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTHowardType.otf]:+clig;+liga;+tlig
+QTHowardTypeFat [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTHowardTypeFat.otf]:+clig;+liga;+tlig
+QTImpromptu Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTImpromptu.otf]:+clig;+liga;+tlig
+QTJupiter [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTJupiter.otf]:+clig;+liga;+tlig
+QTKooper [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTKooper.otf]:+clig;+liga;+tlig
+QTKooper-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTKooper-Italic.otf]:+clig;+liga;+tlig
+QTKorrin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTKorrin.otf]:+clig;+liga;+tlig
+QTKorrin-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTKorrin-Italic.otf]:+clig;+liga;+tlig
+QTKung-Fu [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTKung-Fu.otf]:+clig;+liga;+tlig
+QTLautrecType [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTLautrecType.otf]:+clig;+liga;+tlig
+QTLetterGoth [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTLetterGoth.otf]:+clig;+liga;+tlig
+QTLetterGoth-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTLetterGoth-Bold.otf]:+clig;+liga;+tlig
+QTLetterGoth-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTLetterGoth-BoldItalic.otf]:+clig;+liga;+tlig
+QTLetterGoth-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTLetterGoth-Italic.otf]:+clig;+liga;+tlig
+QTLinoscroll [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTLinoscroll.otf]:+clig;+liga;+tlig
+QTLinostroke [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTLinostroke.otf]:+clig;+liga;+tlig
+QTLondonScroll [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTLondonScroll.otf]:+clig;+liga;+tlig
+QTMagicMarker [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTMagicMarker.otf]:+clig;+liga;+tlig
+QTMerryScript [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTMerryScript.otf]:+clig;+liga;+tlig
+QTMilitary [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTMilitary.otf]:+clig;+liga;+tlig
+QTOKCorral [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTOKCorral.otf]:+clig;+liga;+tlig
+QTOKCorral-Cnd [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTOKCorral-Cnd.otf]:+clig;+liga;+tlig
+QTOKCorral-Ext [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTOKCorral-Ext.otf]:+clig;+liga;+tlig
+QTOldGoudy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTOldGoudy.otf]:+clig;+liga;+tlig
+QTOldGoudy-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTOldGoudy-Bold.otf]:+clig;+liga;+tlig
+QTOldGoudy-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTOldGoudy-Italic.otf]:+clig;+liga;+tlig
+QTOptimum [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTOptimum.otf]:+clig;+liga;+tlig
+QTOptimum-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTOptimum-Bold.otf]:+clig;+liga;+tlig
+QTOptimum-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTOptimum-BoldItalic.otf]:+clig;+liga;+tlig
+QTOptimum-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTOptimum-Italic.otf]:+clig;+liga;+tlig
+QTPalatine [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPalatine.otf]:+clig;+liga;+tlig
+QTPalatine-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPalatine-Bold.otf]:+clig;+liga;+tlig
+QTPalatine-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPalatine-Italic.otf]:+clig;+liga;+tlig
+QTPandora [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPandora.otf]:+clig;+liga;+tlig
+QTParisFrance [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTParisFrance.otf]:+clig;+liga;+tlig
+QTPeignoir [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPeignoir.otf]:+clig;+liga;+tlig
+QTPeignoir-Lite [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPeignoir-Lite.otf]:+clig;+liga;+tlig
+QTPiltdown [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPiltdown.otf]:+clig;+liga;+tlig
+QTPristine [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPristine.otf]:+clig;+liga;+tlig
+QTPristine-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPristine-Bold.otf]:+clig;+liga;+tlig
+QTPristine-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPristine-BoldItalic.otf]:+clig;+liga;+tlig
+QTPristine-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTPristine-Italic.otf]:+clig;+liga;+tlig
+QTRobotic2000 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTRobotic2000.otf]:+clig;+liga;+tlig
+QTSanDiego [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTSanDiego.otf]:+clig;+liga;+tlig
+QTSchoolCentury [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTSchoolCentury.otf]:+clig;+liga;+tlig
+QTSchoolCentury-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTSchoolCentury-Bold.otf]:+clig;+liga;+tlig
+QTSchoolCentury-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTSchoolCentury-BoldItalic.otf]:+clig;+liga;+tlig
+QTSchoolCentury-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTSchoolCentury-Italic.otf]:+clig;+liga;+tlig
+QTSlogantype [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTSlogantype.otf]:+clig;+liga;+tlig
+QTSnowCaps [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTSnowCaps.otf]:+clig;+liga;+tlig
+QTStoryTimeCaps [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTStoryTimeCaps.otf]:+clig;+liga;+tlig
+QTTechtone [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTTechtone.otf]:+clig;+liga;+tlig
+QTTechtone-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTTechtone-Bold.otf]:+clig;+liga;+tlig
+QTTechtone-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTTechtone-BoldItalic.otf]:+clig;+liga;+tlig
+QTTechtone-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTTechtone-Italic.otf]:+clig;+liga;+tlig
+QTTheatre [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTTheatre.otf]:+clig;+liga;+tlig
+QTTimeOutline [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTTimeOutline.otf]:+clig;+liga;+tlig
+QTTumbleweed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTTumbleweed.otf]:+clig;+liga;+tlig
+QTUSA-Uncial [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTUSA-Uncial.otf]:+clig;+liga;+tlig
+QTVagaRound [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTVagaRound.otf]:+clig;+liga;+tlig
+QTVagaRound-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTVagaRound-Bold.otf]:+clig;+liga;+tlig
+QTWeise [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTWeise.otf]:+clig;+liga;+tlig
+QTWeise-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTWeise-Bold.otf]:+clig;+liga;+tlig
+QTWeise-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTWeise-Italic.otf]:+clig;+liga;+tlig
+QTWestEnd [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/qualitype/QTWestEnd.otf]:+clig;+liga;+tlig
+Quattro Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/quattrocento/Quattro-BoldItalic.ttf]:+clig;+liga;+tlig
+Quattro Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/quattrocento/Quattro-Italic.ttf]:+clig;+liga;+tlig
+Quattrocento [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/quattrocento/Quattrocento-Regular.ttf]:+clig;+liga;+tlig
+Quattrocento Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/quattrocento/Quattrocento-Bold.ttf]:+clig;+liga;+tlig
+Quattrocento Sans [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/quattrocento/QuattrocentoSans-Regular.ttf]:+clig;+liga;+tlig
+Quattrocento Sans Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/quattrocento/QuattrocentoSans-Bold.ttf]:+clig;+liga;+tlig
+Quattrocento Sans Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/quattrocento/QuattrocentoSans-BoldItalic.ttf]:+clig;+liga;+tlig
+Quattrocento Sans Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/impallari/quattrocento/QuattrocentoSans-Italic.ttf]:+clig;+liga;+tlig
+RIT Ezhuthu Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Ezhuthu-Regular.ttf]:+clig;+liga;+tlig
+RIT Karuna Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Karuna-Bold.ttf]:+clig;+liga;+tlig
+RIT Keraleeyam Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Keraleeyam-Italic.ttf]:+clig;+liga;+tlig
+RIT Keraleeyam Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Keraleeyam-Regular.ttf]:+clig;+liga;+tlig
+RIT Kutty Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Kutty-Bold.ttf]:+clig;+liga;+tlig
+RIT Meera New Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-MeeraNew.ttf]:+clig;+liga;+tlig
+RIT Panmana Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Panmana-Regular.ttf]:+clig;+liga;+tlig
+RIT Rachana [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Rachana-Regular.ttf]:+clig;+liga;+tlig
+RIT Rachana; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Rachana-Regular.ttf]:+clig;+liga;+tlig;+onum
+RIT Rachana Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Rachana-Bold.ttf]:+clig;+liga;+tlig
+RIT Rachana Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Rachana-Bold.ttf]:+clig;+liga;+tlig;+onum
+RIT Rachana Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Rachana-BoldItalic.ttf]:+clig;+liga;+tlig
+RIT Rachana Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Rachana-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+RIT Rachana Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Rachana-Italic.ttf]:+clig;+liga;+tlig
+RIT Rachana Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Rachana-Italic.ttf]:+clig;+liga;+tlig;+onum
+RIT Sundar Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Sundar.ttf]:+clig;+liga;+tlig
+RIT TN Joy Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-tnjoy-bold.ttf]:+clig;+liga;+tlig
+RIT TN Joy Extra Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-tnjoy-extrabold.ttf]:+clig;+liga;+tlig
+RIT TN Joy Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-tnjoy-regular.ttf]:+clig;+liga;+tlig
+RIT Uroob [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/rit-fonts/RIT-Uroob.ttf]:+clig;+liga;+tlig
+Raleway-Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Black.otf]:+clig;+liga;+tlig
+Raleway-Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Black.otf]:+clig;+liga;+tlig;+onum
+Raleway-Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Black.otf]:+clig;+liga;+tlig;+smcp
+Raleway-Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Black.otf]:+clig;+liga;+tlig;+ss01
+Raleway-Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Black.otf]:+clig;+liga;+tlig;+ss02
+Raleway-BlackItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Black-Italic.otf]:+clig;+liga;+tlig
+Raleway-BlackItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Black-Italic.otf]:+clig;+liga;+tlig;+onum
+Raleway-BlackItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Black-Italic.otf]:+clig;+liga;+tlig;+smcp
+Raleway-BlackItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Black-Italic.otf]:+clig;+liga;+tlig;+ss01
+Raleway-BlackItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Black-Italic.otf]:+clig;+liga;+tlig;+ss02
+Raleway-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Bold.otf]:+clig;+liga;+tlig
+Raleway-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Bold.otf]:+clig;+liga;+tlig;+onum
+Raleway-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Bold.otf]:+clig;+liga;+tlig;+smcp
+Raleway-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Bold.otf]:+clig;+liga;+tlig;+ss01
+Raleway-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Bold.otf]:+clig;+liga;+tlig;+ss02
+Raleway-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Bold-Italic.otf]:+clig;+liga;+tlig
+Raleway-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Bold-Italic.otf]:+clig;+liga;+tlig;+onum
+Raleway-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Bold-Italic.otf]:+clig;+liga;+tlig;+smcp
+Raleway-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Bold-Italic.otf]:+clig;+liga;+tlig;+ss01
+Raleway-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Bold-Italic.otf]:+clig;+liga;+tlig;+ss02
+Raleway-ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraBold.otf]:+clig;+liga;+tlig
+Raleway-ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Raleway-ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+Raleway-ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Raleway-ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Raleway-ExtraBoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraBold-Italic.otf]:+clig;+liga;+tlig
+Raleway-ExtraBoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraBold-Italic.otf]:+clig;+liga;+tlig;+onum
+Raleway-ExtraBoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraBold-Italic.otf]:+clig;+liga;+tlig;+smcp
+Raleway-ExtraBoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraBold-Italic.otf]:+clig;+liga;+tlig;+ss01
+Raleway-ExtraBoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraBold-Italic.otf]:+clig;+liga;+tlig;+ss02
+Raleway-ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraLight.otf]:+clig;+liga;+tlig
+Raleway-ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Raleway-ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraLight.otf]:+clig;+liga;+tlig;+smcp
+Raleway-ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Raleway-ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Raleway-ExtraLightItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraLight-Italic.otf]:+clig;+liga;+tlig
+Raleway-ExtraLightItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraLight-Italic.otf]:+clig;+liga;+tlig;+onum
+Raleway-ExtraLightItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraLight-Italic.otf]:+clig;+liga;+tlig;+smcp
+Raleway-ExtraLightItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraLight-Italic.otf]:+clig;+liga;+tlig;+ss01
+Raleway-ExtraLightItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-ExtraLight-Italic.otf]:+clig;+liga;+tlig;+ss02
+Raleway-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Regular-Italic.otf]:+clig;+liga;+tlig
+Raleway-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Regular-Italic.otf]:+clig;+liga;+tlig;+onum
+Raleway-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Regular-Italic.otf]:+clig;+liga;+tlig;+smcp
+Raleway-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Regular-Italic.otf]:+clig;+liga;+tlig;+ss01
+Raleway-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Regular-Italic.otf]:+clig;+liga;+tlig;+ss02
+Raleway-Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Light.otf]:+clig;+liga;+tlig
+Raleway-Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Light.otf]:+clig;+liga;+tlig;+onum
+Raleway-Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Light.otf]:+clig;+liga;+tlig;+smcp
+Raleway-Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Light.otf]:+clig;+liga;+tlig;+ss01
+Raleway-Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Light.otf]:+clig;+liga;+tlig;+ss02
+Raleway-LightItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Light-Italic.otf]:+clig;+liga;+tlig
+Raleway-LightItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Light-Italic.otf]:+clig;+liga;+tlig;+onum
+Raleway-LightItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Light-Italic.otf]:+clig;+liga;+tlig;+smcp
+Raleway-LightItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Light-Italic.otf]:+clig;+liga;+tlig;+ss01
+Raleway-LightItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Light-Italic.otf]:+clig;+liga;+tlig;+ss02
+Raleway-Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Medium.otf]:+clig;+liga;+tlig
+Raleway-Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Medium.otf]:+clig;+liga;+tlig;+onum
+Raleway-Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Medium.otf]:+clig;+liga;+tlig;+smcp
+Raleway-Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Medium.otf]:+clig;+liga;+tlig;+ss01
+Raleway-Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Medium.otf]:+clig;+liga;+tlig;+ss02
+Raleway-MediumItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Medium-Italic.otf]:+clig;+liga;+tlig
+Raleway-MediumItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Medium-Italic.otf]:+clig;+liga;+tlig;+onum
+Raleway-MediumItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Medium-Italic.otf]:+clig;+liga;+tlig;+smcp
+Raleway-MediumItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Medium-Italic.otf]:+clig;+liga;+tlig;+ss01
+Raleway-MediumItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Medium-Italic.otf]:+clig;+liga;+tlig;+ss02
+Raleway-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Regular.otf]:+clig;+liga;+tlig
+Raleway-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Regular.otf]:+clig;+liga;+tlig;+onum
+Raleway-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Regular.otf]:+clig;+liga;+tlig;+smcp
+Raleway-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Regular.otf]:+clig;+liga;+tlig;+ss01
+Raleway-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Regular.otf]:+clig;+liga;+tlig;+ss02
+Raleway-SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-SemiBold.otf]:+clig;+liga;+tlig
+Raleway-SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Raleway-SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+Raleway-SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Raleway-SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Raleway-SemiBoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-SemiBold-Italic.otf]:+clig;+liga;+tlig
+Raleway-SemiBoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-SemiBold-Italic.otf]:+clig;+liga;+tlig;+onum
+Raleway-SemiBoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-SemiBold-Italic.otf]:+clig;+liga;+tlig;+smcp
+Raleway-SemiBoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-SemiBold-Italic.otf]:+clig;+liga;+tlig;+ss01
+Raleway-SemiBoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-SemiBold-Italic.otf]:+clig;+liga;+tlig;+ss02
+Raleway-Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Thin.otf]:+clig;+liga;+tlig
+Raleway-Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Thin.otf]:+clig;+liga;+tlig;+onum
+Raleway-Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Thin.otf]:+clig;+liga;+tlig;+smcp
+Raleway-Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Thin.otf]:+clig;+liga;+tlig;+ss01
+Raleway-Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Thin.otf]:+clig;+liga;+tlig;+ss02
+Raleway-ThinItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Thin-Italic.otf]:+clig;+liga;+tlig
+Raleway-ThinItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Thin-Italic.otf]:+clig;+liga;+tlig;+onum
+Raleway-ThinItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Thin-Italic.otf]:+clig;+liga;+tlig;+smcp
+Raleway-ThinItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Thin-Italic.otf]:+clig;+liga;+tlig;+ss01
+Raleway-ThinItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/impallari/raleway/Raleway-Thin-Italic.otf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Dziga Regular [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUADziga/ReImagineUADziga-Regular.ttf]:+clig;+liga;+tlig
+ReImagineUA Dziga Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUADziga/ReImagineUADziga-Regular.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Dziga Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUADziga/ReImagineUADziga-Regular.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Dziga Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUADziga/ReImagineUADziga-Regular.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Dziga Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUADziga/ReImagineUADziga-Regular.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Dziga Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUADziga/ReImagineUADziga-Regular.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Dziga Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUADziga/ReImagineUADziga-Regular.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Dziga Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUADziga/ReImagineUADziga-Regular.ttf]:+clig;+liga;+tlig;+ss07
+ReImagineUA Dziga Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUADziga/ReImagineUADziga-Regular.ttf]:+clig;+liga;+tlig;+ss08
+ReImagineUA Malevich Bold [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Bold.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Bold.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Bold.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Bold.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Bold.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Bold.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Bold.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Bold Slant+15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant+15.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Bold Slant+15; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant+15.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Bold Slant+15; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant+15.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Bold Slant+15; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant+15.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Bold Slant+15; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant+15.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Bold Slant+15; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant+15.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Bold Slant+15; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant+15.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Bold Slant-15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant-15.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Bold Slant-15; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant-15.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Bold Slant-15; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant-15.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Bold Slant-15; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant-15.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Bold Slant-15; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant-15.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Bold Slant-15; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant-15.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Bold Slant-15; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-BoldSlant-15.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Light [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Light.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Light.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Light.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Light.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Light.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Light.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Light.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Light Slant+15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant+15.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Light Slant+15; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant+15.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Light Slant+15; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant+15.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Light Slant+15; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant+15.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Light Slant+15; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant+15.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Light Slant+15; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant+15.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Light Slant+15; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant+15.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Light Slant-15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant-15.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Light Slant-15; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant-15.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Light Slant-15; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant-15.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Light Slant-15; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant-15.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Light Slant-15; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant-15.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Light Slant-15; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant-15.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Light Slant-15; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-LightSlant-15.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Medium [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Medium.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Medium.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Medium.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Medium.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Medium.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Medium.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Medium.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Medium Slant+15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant+15.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Medium Slant+15; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant+15.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Medium Slant+15; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant+15.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Medium Slant+15; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant+15.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Medium Slant+15; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant+15.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Medium Slant+15; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant+15.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Medium Slant+15; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant+15.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Medium Slant-15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant-15.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Medium Slant-15; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant-15.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Medium Slant-15; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant-15.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Medium Slant-15; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant-15.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Medium Slant-15; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant-15.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Medium Slant-15; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant-15.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Medium Slant-15; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-MediumSlant-15.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Regular [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Regular.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Regular.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Regular.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Regular.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Regular.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Regular.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Regular.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Regular Slant+15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant+15.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Regular Slant+15; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant+15.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Regular Slant+15; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant+15.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Regular Slant+15; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant+15.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Regular Slant+15; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant+15.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Regular Slant+15; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant+15.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Regular Slant+15; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant+15.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Regular Slant-15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant-15.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Regular Slant-15; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant-15.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Regular Slant-15; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant-15.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Regular Slant-15; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant-15.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Regular Slant-15; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant-15.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Regular Slant-15; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant-15.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Regular Slant-15; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-RegularSlant-15.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Thin [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Thin.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Thin.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Thin.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Thin.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Thin.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Thin.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-Thin.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Thin Slant+15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant+15.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Thin Slant+15; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant+15.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Thin Slant+15; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant+15.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Thin Slant+15; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant+15.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Thin Slant+15; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant+15.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Thin Slant+15; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant+15.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Thin Slant+15; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant+15.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich Thin Slant-15 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant-15.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich Thin Slant-15; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant-15.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich Thin Slant-15; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant-15.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich Thin Slant-15; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant-15.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich Thin Slant-15; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant-15.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich Thin Slant-15; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant-15.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich Thin Slant-15; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevich-ThinSlant-15.ttf]:+clig;+liga;+tlig;+ss06
+ReImagineUA Malevich VF Nw Sla0 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevichVF.ttf]:+clig;+liga;+tlig
+ReImagineUA Malevich VF Nw Sla0; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevichVF.ttf]:+clig;+liga;+tlig;+ss01
+ReImagineUA Malevich VF Nw Sla0; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevichVF.ttf]:+clig;+liga;+tlig;+ss02
+ReImagineUA Malevich VF Nw Sla0; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevichVF.ttf]:+clig;+liga;+tlig;+ss03
+ReImagineUA Malevich VF Nw Sla0; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevichVF.ttf]:+clig;+liga;+tlig;+ss04
+ReImagineUA Malevich VF Nw Sla0; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevichVF.ttf]:+clig;+liga;+tlig;+ss05
+ReImagineUA Malevich VF Nw Sla0; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/ReImagineUAMalevich/ReImagineUAMalevichVF.ttf]:+clig;+liga;+tlig;+ss06
+Recht-Black [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Black.otf]:+clig;+liga;+tlig
+Recht-Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Black.otf]:+clig;+liga;+tlig;+ss01
+Recht-Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Black.otf]:+clig;+liga;+tlig;+ss02
+Recht-Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Black.otf]:+clig;+liga;+tlig;+ss03
+Recht-Black [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Black.ttf]:+clig;+liga;+tlig
+Recht-Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Black.ttf]:+clig;+liga;+tlig;+ss01
+Recht-Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Black.ttf]:+clig;+liga;+tlig;+ss02
+Recht-Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Black.ttf]:+clig;+liga;+tlig;+ss03
+Recht-BlackItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-BlackItalic.otf]:+clig;+liga;+tlig
+Recht-BlackItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Recht-BlackItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-BlackItalic.otf]:+clig;+liga;+tlig;+ss02
+Recht-BlackItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Recht-BlackItalic [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-BlackItalic.ttf]:+clig;+liga;+tlig
+Recht-BlackItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-BlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Recht-BlackItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-BlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Recht-BlackItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-BlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Recht-Bold [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Bold.otf]:+clig;+liga;+tlig
+Recht-Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Bold.otf]:+clig;+liga;+tlig;+ss01
+Recht-Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Bold.otf]:+clig;+liga;+tlig;+ss02
+Recht-Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Bold.otf]:+clig;+liga;+tlig;+ss03
+Recht-Bold [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Bold.ttf]:+clig;+liga;+tlig
+Recht-Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Recht-Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Recht-Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Recht-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-BoldItalic.otf]:+clig;+liga;+tlig
+Recht-BoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Recht-BoldItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Recht-BoldItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Recht-BoldItalic [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-BoldItalic.ttf]:+clig;+liga;+tlig
+Recht-BoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Recht-BoldItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Recht-BoldItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Recht-ExtraBold [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraBold.otf]:+clig;+liga;+tlig
+Recht-ExtraBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Recht-ExtraBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Recht-ExtraBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Recht-ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraBold.ttf]:+clig;+liga;+tlig
+Recht-ExtraBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Recht-ExtraBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Recht-ExtraBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Recht-ExtraBoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Recht-ExtraBoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Recht-ExtraBoldItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Recht-ExtraBoldItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Recht-ExtraBoldItalic [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Recht-ExtraBoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Recht-ExtraBoldItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Recht-ExtraBoldItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Recht-ExtraLight [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraLight.otf]:+clig;+liga;+tlig
+Recht-ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Recht-ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Recht-ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Recht-ExtraLight [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraLight.ttf]:+clig;+liga;+tlig
+Recht-ExtraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Recht-ExtraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Recht-ExtraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Recht-ExtraLightItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Recht-ExtraLightItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Recht-ExtraLightItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+Recht-ExtraLightItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Recht-ExtraLightItalic [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Recht-ExtraLightItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Recht-ExtraLightItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Recht-ExtraLightItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Recht-Italic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Italic.otf]:+clig;+liga;+tlig
+Recht-Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Italic.otf]:+clig;+liga;+tlig;+ss01
+Recht-Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Italic.otf]:+clig;+liga;+tlig;+ss02
+Recht-Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Italic.otf]:+clig;+liga;+tlig;+ss03
+Recht-Italic [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Italic.ttf]:+clig;+liga;+tlig
+Recht-Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Recht-Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Recht-Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Recht-Light [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Light.otf]:+clig;+liga;+tlig
+Recht-Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Light.otf]:+clig;+liga;+tlig;+ss01
+Recht-Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Light.otf]:+clig;+liga;+tlig;+ss02
+Recht-Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Light.otf]:+clig;+liga;+tlig;+ss03
+Recht-Light [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Light.ttf]:+clig;+liga;+tlig
+Recht-Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Light.ttf]:+clig;+liga;+tlig;+ss01
+Recht-Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Light.ttf]:+clig;+liga;+tlig;+ss02
+Recht-Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Light.ttf]:+clig;+liga;+tlig;+ss03
+Recht-LightItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-LightItalic.otf]:+clig;+liga;+tlig
+Recht-LightItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Recht-LightItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Recht-LightItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Recht-LightItalic [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-LightItalic.ttf]:+clig;+liga;+tlig
+Recht-LightItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Recht-LightItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-LightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Recht-LightItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-LightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Recht-Medium [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Medium.otf]:+clig;+liga;+tlig
+Recht-Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Medium.otf]:+clig;+liga;+tlig;+ss01
+Recht-Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Medium.otf]:+clig;+liga;+tlig;+ss02
+Recht-Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Medium.otf]:+clig;+liga;+tlig;+ss03
+Recht-Medium [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Medium.ttf]:+clig;+liga;+tlig
+Recht-Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Recht-Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Recht-Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Recht-MediumItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-MediumItalic.otf]:+clig;+liga;+tlig
+Recht-MediumItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Recht-MediumItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Recht-MediumItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Recht-MediumItalic [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-MediumItalic.ttf]:+clig;+liga;+tlig
+Recht-MediumItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-MediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Recht-MediumItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-MediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Recht-MediumItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-MediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Recht-Regular [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Regular.otf]:+clig;+liga;+tlig
+Recht-Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Regular.otf]:+clig;+liga;+tlig;+ss01
+Recht-Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Regular.otf]:+clig;+liga;+tlig;+ss02
+Recht-Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Regular.otf]:+clig;+liga;+tlig;+ss03
+Recht-Regular [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Regular.ttf]:+clig;+liga;+tlig
+Recht-Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Recht-Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Recht-Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Recht-SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-SemiBold.otf]:+clig;+liga;+tlig
+Recht-SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Recht-SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Recht-SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Recht-SemiBold [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-SemiBold.ttf]:+clig;+liga;+tlig
+Recht-SemiBold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Recht-SemiBold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Recht-SemiBold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Recht-SemiBoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Recht-SemiBoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Recht-SemiBoldItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Recht-SemiBoldItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Recht-SemiBoldItalic [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Recht-SemiBoldItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Recht-SemiBoldItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Recht-SemiBoldItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Recht-Thin [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Thin.otf]:+clig;+liga;+tlig
+Recht-Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Thin.otf]:+clig;+liga;+tlig;+ss01
+Recht-Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Thin.otf]:+clig;+liga;+tlig;+ss02
+Recht-Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-Thin.otf]:+clig;+liga;+tlig;+ss03
+Recht-Thin [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Thin.ttf]:+clig;+liga;+tlig
+Recht-Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Thin.ttf]:+clig;+liga;+tlig;+ss01
+Recht-Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Thin.ttf]:+clig;+liga;+tlig;+ss02
+Recht-Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-Thin.ttf]:+clig;+liga;+tlig;+ss03
+Recht-ThinItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ThinItalic.otf]:+clig;+liga;+tlig
+Recht-ThinItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Recht-ThinItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+Recht-ThinItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Recht-ThinItalic [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ThinItalic.ttf]:+clig;+liga;+tlig
+Recht-ThinItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Recht-ThinItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Recht-ThinItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-ThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Recht-UltraLight [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-UltraLight.otf]:+clig;+liga;+tlig
+Recht-UltraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-UltraLight.otf]:+clig;+liga;+tlig;+ss01
+Recht-UltraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-UltraLight.otf]:+clig;+liga;+tlig;+ss02
+Recht-UltraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-UltraLight.otf]:+clig;+liga;+tlig;+ss03
+Recht-UltraLight [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-UltraLight.ttf]:+clig;+liga;+tlig
+Recht-UltraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-UltraLight.ttf]:+clig;+liga;+tlig;+ss01
+Recht-UltraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-UltraLight.ttf]:+clig;+liga;+tlig;+ss02
+Recht-UltraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-UltraLight.ttf]:+clig;+liga;+tlig;+ss03
+Recht-UltraLightItalic [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-UltraLightItalic.otf]:+clig;+liga;+tlig
+Recht-UltraLightItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-UltraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Recht-UltraLightItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-UltraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+Recht-UltraLightItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/MintType/Recht/Recht-UltraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Recht-UltraLightItalic [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-UltraLightItalic.ttf]:+clig;+liga;+tlig
+Recht-UltraLightItalic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-UltraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Recht-UltraLightItalic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-UltraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Recht-UltraLightItalic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/MintType/Recht/Recht-UltraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Redacted Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/luacensor/Redacted-Regular.ttf]:+clig;+liga;+tlig
+Redaction [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction-Regular.otf]:+clig;+liga;+tlig
+Redaction 10 [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction10-Regular.otf]:+clig;+liga;+tlig
+Redaction 10 Bold [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction10-Bold.otf]:+clig;+liga;+tlig
+Redaction 10 Italic [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction10-Italic.otf]:+clig;+liga;+tlig
+Redaction 100 [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction100-Regular.otf]:+clig;+liga;+tlig
+Redaction 100 Bold [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction100-Bold.otf]:+clig;+liga;+tlig
+Redaction 100 Italic [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction100-Italic.otf]:+clig;+liga;+tlig
+Redaction 20 [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction20-Regular.otf]:+clig;+liga;+tlig
+Redaction 20 Bold [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction20-Bold.otf]:+clig;+liga;+tlig
+Redaction 20 Italic [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction20-Italic.otf]:+clig;+liga;+tlig
+Redaction 35 [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction35-Regular.otf]:+clig;+liga;+tlig
+Redaction 35 Bold [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction35-Bold.otf]:+clig;+liga;+tlig
+Redaction 35 Italic [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction35-Italic.otf]:+clig;+liga;+tlig
+Redaction 50 [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction50-Regular.otf]:+clig;+liga;+tlig
+Redaction 50 Bold [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction50-Bold.otf]:+clig;+liga;+tlig
+Redaction 50 Italic [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction50-Italic.otf]:+clig;+liga;+tlig
+Redaction 70 [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction70-Regular.otf]:+clig;+liga;+tlig
+Redaction 70 Bold [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction70-Bold.otf]:+clig;+liga;+tlig
+Redaction 70 Italic [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction70-Italic.otf]:+clig;+liga;+tlig
+Redaction Bold [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction-Bold.otf]:+clig;+liga;+tlig
+Redaction Italic [/usr/local/texlive/texmf-local/fonts/opentype/MCKL/Redaction/Redaction-Italic.otf]:+clig;+liga;+tlig
+Refunk Black Free [/usr/local/texlive/texmf-local/fonts/truetype/DR/Refunk-BlackFree/Refunk-BlackFree.ttf]:+clig;+liga;+tlig
+Refunk Black Free; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Refunk-BlackFree/Refunk-BlackFree.ttf]:+clig;+liga;+tlig;+ss01
+Refunk Black Free; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Refunk-BlackFree/Refunk-BlackFree.ttf]:+clig;+liga;+tlig;+ss03
+Rhody Wide Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RhodyWide/RhodyWide-Regular.otf]:+clig;+liga;+tlig
+Rhody Wide Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RhodyWide/RhodyWide-Regular.otf]:+clig;+liga;+tlig;+ss01
+Rhody Wide Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RhodyWide/RhodyWide-Regular.otf]:+clig;+liga;+tlig;+ss02
+Rhody Wide Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RhodyWide/RhodyWide-Regular.otf]:+clig;+liga;+tlig;+ss03
+Rhody Wide Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RhodyWide/RhodyWide-Regular.otf]:+clig;+liga;+tlig;+ss04
+Rhody Wide Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RhodyWide/RhodyWide-Regular.otf]:+clig;+liga;+tlig;+ss08
+Rhody Wide Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RhodyWide/RhodyWide-Regular.otf]:+clig;+liga;+tlig;+ss10
+Rhody Wide Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RhodyWide/RhodyWide-Regular.otf]:+clig;+liga;+tlig;+ss11
+Rhody Wide Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RhodyWide/RhodyWide-Regular.otf]:+clig;+liga;+tlig;+ss12
+RiblahRegular [/usr/local/texlive/texmf-local/fonts/truetype/YouWorkForThem/RIBLRG__.ttf]:+clig;+liga;+tlig
+Roboto [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Regular.otf]:+clig;+liga;+tlig
+Roboto; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Regular.otf]:+clig;+liga;+tlig;+onum
+Roboto; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Regular.otf]:+clig;+liga;+tlig;+smcp
+Roboto; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Regular.otf]:+clig;+liga;+tlig;+ss01
+Roboto; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Regular.otf]:+clig;+liga;+tlig;+ss02
+Roboto; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Regular.otf]:+clig;+liga;+tlig;+ss03
+Roboto; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Regular.otf]:+clig;+liga;+tlig;+ss04
+Roboto; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Regular.otf]:+clig;+liga;+tlig;+ss05
+Roboto; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Regular.otf]:+clig;+liga;+tlig;+ss06
+Roboto; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Regular.otf]:+clig;+liga;+tlig;+ss07
+Roboto Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Black.otf]:+clig;+liga;+tlig
+Roboto Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Black.otf]:+clig;+liga;+tlig;+onum
+Roboto Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Black.otf]:+clig;+liga;+tlig;+smcp
+Roboto Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Black.otf]:+clig;+liga;+tlig;+ss01
+Roboto Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Black.otf]:+clig;+liga;+tlig;+ss02
+Roboto Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Black.otf]:+clig;+liga;+tlig;+ss03
+Roboto Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Black.otf]:+clig;+liga;+tlig;+ss04
+Roboto Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Black.otf]:+clig;+liga;+tlig;+ss05
+Roboto Black; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Black.otf]:+clig;+liga;+tlig;+ss06
+Roboto Black; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Black.otf]:+clig;+liga;+tlig;+ss07
+Roboto Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BlackItalic.otf]:+clig;+liga;+tlig
+Roboto Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Black Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BlackItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BlackItalic.otf]:+clig;+liga;+tlig;+ss02
+Roboto Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Black Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Black Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BlackItalic.otf]:+clig;+liga;+tlig;+ss06
+Roboto Black Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BlackItalic.otf]:+clig;+liga;+tlig;+ss07
+Roboto Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Bold.otf]:+clig;+liga;+tlig
+Roboto Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Bold.otf]:+clig;+liga;+tlig;+onum
+Roboto Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Bold.otf]:+clig;+liga;+tlig;+smcp
+Roboto Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Bold.otf]:+clig;+liga;+tlig;+ss01
+Roboto Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Bold.otf]:+clig;+liga;+tlig;+ss02
+Roboto Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Bold.otf]:+clig;+liga;+tlig;+ss03
+Roboto Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Bold.otf]:+clig;+liga;+tlig;+ss04
+Roboto Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Bold.otf]:+clig;+liga;+tlig;+ss05
+Roboto Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Bold.otf]:+clig;+liga;+tlig;+ss06
+Roboto Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Bold.otf]:+clig;+liga;+tlig;+ss07
+Roboto Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BoldItalic.otf]:+clig;+liga;+tlig
+Roboto Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Roboto Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Roboto Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Roboto Condensed [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Regular.otf]:+clig;+liga;+tlig
+Roboto Condensed; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Regular.otf]:+clig;+liga;+tlig;+onum
+Roboto Condensed; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Regular.otf]:+clig;+liga;+tlig;+smcp
+Roboto Condensed; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Roboto Condensed; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Regular.otf]:+clig;+liga;+tlig;+ss02
+Roboto Condensed; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Regular.otf]:+clig;+liga;+tlig;+ss03
+Roboto Condensed; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Regular.otf]:+clig;+liga;+tlig;+ss04
+Roboto Condensed; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Regular.otf]:+clig;+liga;+tlig;+ss05
+Roboto Condensed; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Regular.otf]:+clig;+liga;+tlig;+ss06
+Roboto Condensed; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Regular.otf]:+clig;+liga;+tlig;+ss07
+Roboto Condensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Bold.otf]:+clig;+liga;+tlig
+Roboto Condensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Bold.otf]:+clig;+liga;+tlig;+onum
+Roboto Condensed Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Bold.otf]:+clig;+liga;+tlig;+smcp
+Roboto Condensed Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Roboto Condensed Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Bold.otf]:+clig;+liga;+tlig;+ss02
+Roboto Condensed Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Bold.otf]:+clig;+liga;+tlig;+ss03
+Roboto Condensed Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Bold.otf]:+clig;+liga;+tlig;+ss04
+Roboto Condensed Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Bold.otf]:+clig;+liga;+tlig;+ss05
+Roboto Condensed Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Bold.otf]:+clig;+liga;+tlig;+ss06
+Roboto Condensed Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Bold.otf]:+clig;+liga;+tlig;+ss07
+Roboto Condensed Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-BoldItalic.otf]:+clig;+liga;+tlig
+Roboto Condensed Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Condensed Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Condensed Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Condensed Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Roboto Condensed Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Condensed Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Condensed Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Condensed Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Roboto Condensed Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Roboto Condensed Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Italic.otf]:+clig;+liga;+tlig
+Roboto Condensed Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Italic.otf]:+clig;+liga;+tlig;+onum
+Roboto Condensed Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Italic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Condensed Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Italic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Condensed Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Italic.otf]:+clig;+liga;+tlig;+ss02
+Roboto Condensed Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Italic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Condensed Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Italic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Condensed Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Italic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Condensed Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Italic.otf]:+clig;+liga;+tlig;+ss06
+Roboto Condensed Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Italic.otf]:+clig;+liga;+tlig;+ss07
+Roboto Condensed Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Light.otf]:+clig;+liga;+tlig
+Roboto Condensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Light.otf]:+clig;+liga;+tlig;+onum
+Roboto Condensed Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Light.otf]:+clig;+liga;+tlig;+smcp
+Roboto Condensed Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Light.otf]:+clig;+liga;+tlig;+ss01
+Roboto Condensed Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Light.otf]:+clig;+liga;+tlig;+ss02
+Roboto Condensed Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Light.otf]:+clig;+liga;+tlig;+ss03
+Roboto Condensed Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Light.otf]:+clig;+liga;+tlig;+ss04
+Roboto Condensed Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Light.otf]:+clig;+liga;+tlig;+ss05
+Roboto Condensed Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Light.otf]:+clig;+liga;+tlig;+ss06
+Roboto Condensed Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-Light.otf]:+clig;+liga;+tlig;+ss07
+Roboto Condensed Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-LightItalic.otf]:+clig;+liga;+tlig
+Roboto Condensed Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Condensed Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Condensed Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Condensed Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Roboto Condensed Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Condensed Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Condensed Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Condensed Light Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Roboto Condensed Light Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoCondensed-LightItalic.otf]:+clig;+liga;+tlig;+ss07
+Roboto Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Italic.otf]:+clig;+liga;+tlig
+Roboto Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Italic.otf]:+clig;+liga;+tlig;+onum
+Roboto Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Italic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Italic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Italic.otf]:+clig;+liga;+tlig;+ss02
+Roboto Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Italic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Italic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Italic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Italic.otf]:+clig;+liga;+tlig;+ss06
+Roboto Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Italic.otf]:+clig;+liga;+tlig;+ss07
+Roboto Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Light.otf]:+clig;+liga;+tlig
+Roboto Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Light.otf]:+clig;+liga;+tlig;+onum
+Roboto Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Light.otf]:+clig;+liga;+tlig;+smcp
+Roboto Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Light.otf]:+clig;+liga;+tlig;+ss01
+Roboto Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Light.otf]:+clig;+liga;+tlig;+ss02
+Roboto Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Light.otf]:+clig;+liga;+tlig;+ss03
+Roboto Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Light.otf]:+clig;+liga;+tlig;+ss04
+Roboto Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Light.otf]:+clig;+liga;+tlig;+ss05
+Roboto Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Light.otf]:+clig;+liga;+tlig;+ss06
+Roboto Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Light.otf]:+clig;+liga;+tlig;+ss07
+Roboto Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-LightItalic.otf]:+clig;+liga;+tlig
+Roboto Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Roboto Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Light Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-LightItalic.otf]:+clig;+liga;+tlig;+ss06
+Roboto Light Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-LightItalic.otf]:+clig;+liga;+tlig;+ss07
+Roboto Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Medium.otf]:+clig;+liga;+tlig
+Roboto Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Medium.otf]:+clig;+liga;+tlig;+onum
+Roboto Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Medium.otf]:+clig;+liga;+tlig;+smcp
+Roboto Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Medium.otf]:+clig;+liga;+tlig;+ss01
+Roboto Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Medium.otf]:+clig;+liga;+tlig;+ss02
+Roboto Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Medium.otf]:+clig;+liga;+tlig;+ss03
+Roboto Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Medium.otf]:+clig;+liga;+tlig;+ss04
+Roboto Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Medium.otf]:+clig;+liga;+tlig;+ss05
+Roboto Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Medium.otf]:+clig;+liga;+tlig;+ss06
+Roboto Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Medium.otf]:+clig;+liga;+tlig;+ss07
+Roboto Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-MediumItalic.otf]:+clig;+liga;+tlig
+Roboto Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Roboto Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Medium Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-MediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Roboto Medium Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-MediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Roboto Mono [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Regular.otf]:+clig;+liga;+tlig
+Roboto Mono; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Regular.otf]:+clig;+liga;+tlig;+smcp
+Roboto Mono Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Bold.otf]:+clig;+liga;+tlig
+Roboto Mono Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Bold.otf]:+clig;+liga;+tlig;+smcp
+Roboto Mono Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-BoldItalic.otf]:+clig;+liga;+tlig
+Roboto Mono Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Mono Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Italic.otf]:+clig;+liga;+tlig
+Roboto Mono Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Italic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Mono Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Light.otf]:+clig;+liga;+tlig
+Roboto Mono Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Light.otf]:+clig;+liga;+tlig;+smcp
+Roboto Mono Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-LightItalic.otf]:+clig;+liga;+tlig
+Roboto Mono Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-LightItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Mono Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Medium.otf]:+clig;+liga;+tlig
+Roboto Mono Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Medium.otf]:+clig;+liga;+tlig;+smcp
+Roboto Mono Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-MediumItalic.otf]:+clig;+liga;+tlig
+Roboto Mono Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Mono Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Thin.otf]:+clig;+liga;+tlig
+Roboto Mono Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-Thin.otf]:+clig;+liga;+tlig;+smcp
+Roboto Mono Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-ThinItalic.otf]:+clig;+liga;+tlig
+Roboto Mono Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoMono-ThinItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Serif Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Black.otf]:+clig;+liga;+tlig
+Roboto Serif Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Black.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Black.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Black.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Black.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Black.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BlackItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Black Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Bold.otf]:+clig;+liga;+tlig
+Roboto Serif Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Bold.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Bold.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Bold.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Bold.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Bold.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BoldItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Black.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Black.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Black.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Black.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Condensed Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Black.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Black.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BlackItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Condensed Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BlackItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Black Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BlackItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Bold.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Bold.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Bold.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Bold.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Condensed Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Bold.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Bold.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BoldItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Condensed Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-BoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBold.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Condensed ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Condensed ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed ExtraBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLight.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Condensed ExtraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed ExtraLight; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Condensed ExtraLight Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed ExtraLight Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Italic.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Italic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Italic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Italic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Condensed Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Italic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Italic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Light.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Light.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Light.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Light.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Condensed Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Light.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Light.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-LightItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Condensed Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Medium.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Medium.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Medium.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Medium.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Condensed Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Medium.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Medium.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-MediumItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Condensed Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Regular.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Regular.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Regular.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Regular.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Condensed Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Regular.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Regular.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBold.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Condensed SemiBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed SemiBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Condensed SemiBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed SemiBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Thin.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Thin.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Thin.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Thin.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Condensed Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Thin.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-Thin.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Condensed Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ThinItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Condensed Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Condensed Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Condensed Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Condensed Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Condensed Thin Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif_Condensed-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBold.otf]:+clig;+liga;+tlig
+Roboto Serif ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif ExtraBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBold.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBold.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Roboto Serif ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif ExtraBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif ExtraBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLight.otf]:+clig;+liga;+tlig
+Roboto Serif ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif ExtraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif ExtraLight; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Roboto Serif ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif ExtraLight Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif ExtraLight Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Italic.otf]:+clig;+liga;+tlig
+Roboto Serif Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Italic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Italic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Italic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Italic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Italic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Light.otf]:+clig;+liga;+tlig
+Roboto Serif Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Light.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Light.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Light.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Light.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Light.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-LightItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-LightItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Medium.otf]:+clig;+liga;+tlig
+Roboto Serif Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Medium.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Medium.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Medium.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Medium.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Medium.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-MediumItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Medium Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-MediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-MediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Regular.otf]:+clig;+liga;+tlig
+Roboto Serif Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Regular.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Regular.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Regular.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Regular.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Regular.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBold.otf]:+clig;+liga;+tlig
+Roboto Serif SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif SemiBold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBold.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif SemiBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBold.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Roboto Serif SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif SemiBold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif SemiBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Thin.otf]:+clig;+liga;+tlig
+Roboto Serif Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Thin.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Thin.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Thin.otf]:+clig;+liga;+tlig;+ss02
+Roboto Serif Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Thin.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-Thin.otf]:+clig;+liga;+tlig;+ss05
+Roboto Serif Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ThinItalic.otf]:+clig;+liga;+tlig
+Roboto Serif Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Serif Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Serif Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Serif Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Serif Thin Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSerif-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Slab Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Bold.otf]:+clig;+liga;+tlig
+Roboto Slab Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Bold.otf]:+clig;+liga;+tlig;+smcp
+Roboto Slab Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Bold.otf]:+clig;+liga;+tlig;+ss01
+Roboto Slab Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Bold.otf]:+clig;+liga;+tlig;+ss02
+Roboto Slab Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Bold.otf]:+clig;+liga;+tlig;+ss03
+Roboto Slab Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Bold.otf]:+clig;+liga;+tlig;+ss04
+Roboto Slab Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Light.otf]:+clig;+liga;+tlig
+Roboto Slab Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Light.otf]:+clig;+liga;+tlig;+smcp
+Roboto Slab Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Light.otf]:+clig;+liga;+tlig;+ss01
+Roboto Slab Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Light.otf]:+clig;+liga;+tlig;+ss02
+Roboto Slab Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Light.otf]:+clig;+liga;+tlig;+ss03
+Roboto Slab Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Light.otf]:+clig;+liga;+tlig;+ss04
+Roboto Slab Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Regular.otf]:+clig;+liga;+tlig
+Roboto Slab Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Regular.otf]:+clig;+liga;+tlig;+smcp
+Roboto Slab Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Regular.otf]:+clig;+liga;+tlig;+ss01
+Roboto Slab Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Regular.otf]:+clig;+liga;+tlig;+ss02
+Roboto Slab Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Regular.otf]:+clig;+liga;+tlig;+ss03
+Roboto Slab Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Regular.otf]:+clig;+liga;+tlig;+ss04
+Roboto Slab Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Thin.otf]:+clig;+liga;+tlig
+Roboto Slab Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Thin.otf]:+clig;+liga;+tlig;+smcp
+Roboto Slab Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Thin.otf]:+clig;+liga;+tlig;+ss01
+Roboto Slab Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Thin.otf]:+clig;+liga;+tlig;+ss02
+Roboto Slab Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Thin.otf]:+clig;+liga;+tlig;+ss03
+Roboto Slab Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/RobotoSlab-Thin.otf]:+clig;+liga;+tlig;+ss04
+Roboto Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Thin.otf]:+clig;+liga;+tlig
+Roboto Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Thin.otf]:+clig;+liga;+tlig;+onum
+Roboto Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Thin.otf]:+clig;+liga;+tlig;+smcp
+Roboto Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Thin.otf]:+clig;+liga;+tlig;+ss01
+Roboto Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Thin.otf]:+clig;+liga;+tlig;+ss02
+Roboto Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Thin.otf]:+clig;+liga;+tlig;+ss03
+Roboto Thin; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Thin.otf]:+clig;+liga;+tlig;+ss04
+Roboto Thin; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Thin.otf]:+clig;+liga;+tlig;+ss05
+Roboto Thin; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Thin.otf]:+clig;+liga;+tlig;+ss06
+Roboto Thin; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-Thin.otf]:+clig;+liga;+tlig;+ss07
+Roboto Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-ThinItalic.otf]:+clig;+liga;+tlig
+Roboto Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Roboto Thin Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-ThinItalic.otf]:+clig;+liga;+tlig;+smcp
+Roboto Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Roboto Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+Roboto Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Roboto Thin Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-ThinItalic.otf]:+clig;+liga;+tlig;+ss04
+Roboto Thin Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-ThinItalic.otf]:+clig;+liga;+tlig;+ss05
+Roboto Thin Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-ThinItalic.otf]:+clig;+liga;+tlig;+ss06
+Roboto Thin Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/google/roboto/Roboto-ThinItalic.otf]:+clig;+liga;+tlig;+ss07
+Rosario Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-Bold.otf]:+clig;+liga;+tlig
+Rosario Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-Bold.otf]:+clig;+liga;+tlig;+onum
+Rosario Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-BoldItalic.otf]:+clig;+liga;+tlig
+Rosario Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Rosario Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-Italic.otf]:+clig;+liga;+tlig
+Rosario Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-Italic.otf]:+clig;+liga;+tlig;+onum
+Rosario Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-Light.otf]:+clig;+liga;+tlig
+Rosario Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-Light.otf]:+clig;+liga;+tlig;+onum
+Rosario Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-LightItalic.otf]:+clig;+liga;+tlig
+Rosario Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Rosario Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-Regular.otf]:+clig;+liga;+tlig
+Rosario Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-Regular.otf]:+clig;+liga;+tlig;+onum
+Rosario SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-SemiBold.otf]:+clig;+liga;+tlig
+Rosario SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Rosario SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Rosario SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/rosario/Rosario-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Roslindale Deck Narrow Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.otf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBold.ttf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.otf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowItalic.ttf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.otf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Medium [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMedium.ttf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Medium Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Medium Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Medium Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Medium Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Medium Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Medium Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.otf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Medium Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Medium Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Medium Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Medium Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Medium Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Medium Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Medium Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Medium Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Medium Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Medium Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Medium Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Medium Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowMediumItalic.ttf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.otf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowRegular.ttf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Semi Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Semi Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Semi Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Semi Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Semi Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Semi Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Semi Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Semi Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Semi Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Semi Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Semi Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Semi Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Semi Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Semi Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Semi Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Semi Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Semi Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Roslindale Deck Narrow Semi Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss04
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss07
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss08
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Roslindale Deck Narrow Semi Bold Italic; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/Roslindale-DeckNarrowSemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Roslindale Display Compressed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleCompressed/RoslindaleDisplayCompressed-Bold.otf]:+clig;+liga;+tlig
+Roslindale Display Extended Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.otf]:+clig;+liga;+tlig
+Roslindale Display Extended Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.otf]:+clig;+liga;+tlig;+ss01
+Roslindale Display Extended Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.otf]:+clig;+liga;+tlig;+ss02
+Roslindale Display Extended Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.otf]:+clig;+liga;+tlig;+ss03
+Roslindale Display Extended Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.otf]:+clig;+liga;+tlig;+ss05
+Roslindale Display Extended Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.otf]:+clig;+liga;+tlig;+ss12
+Roslindale Display Extended Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.ttf]:+clig;+liga;+tlig
+Roslindale Display Extended Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Display Extended Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Display Extended Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Display Extended Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Display Extended Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayExtended-Bold.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale Display Extra Condensed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleCompressed/RoslindaleDisplayExtraCondensed-Bold.otf]:+clig;+liga;+tlig
+Roslindale Display Wide Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.otf]:+clig;+liga;+tlig
+Roslindale Display Wide Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.otf]:+clig;+liga;+tlig;+ss01
+Roslindale Display Wide Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.otf]:+clig;+liga;+tlig;+ss02
+Roslindale Display Wide Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.otf]:+clig;+liga;+tlig;+ss03
+Roslindale Display Wide Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.otf]:+clig;+liga;+tlig;+ss05
+Roslindale Display Wide Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.otf]:+clig;+liga;+tlig;+ss12
+Roslindale Display Wide Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.ttf]:+clig;+liga;+tlig
+Roslindale Display Wide Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Display Wide Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Display Wide Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Display Wide Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Display Wide Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleDisplayWide-Bold.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale Extended Variable [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleExtendedVariable-VF.ttf]:+clig;+liga;+tlig
+Roslindale Extended Variable; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleExtendedVariable-VF.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Extended Variable; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleExtendedVariable-VF.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Extended Variable; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleExtendedVariable-VF.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Extended Variable; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleExtendedVariable-VF.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Extended Variable; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleExtended/RoslindaleExtendedVariable-VF.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale Text Italic Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleText/RoslindaleText-Italic.otf]:+clig;+liga;+tlig
+Roslindale Text Italic Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleText/RoslindaleText-Italic.ttf]:+clig;+liga;+tlig
+Roslindale Text Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleText/RoslindaleText-Regular.otf]:+clig;+liga;+tlig
+Roslindale Text Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleText/RoslindaleText-Regular.otf]:+clig;+liga;+tlig;+smcp
+Roslindale Text Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleText/RoslindaleText-Regular.ttf]:+clig;+liga;+tlig
+Roslindale Text Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleText/RoslindaleText-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Roslindale V2 Display Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Black; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Black [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Black; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBlack.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayBold.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Black; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Black [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Black; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBlack.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedBold.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Extra Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Extra Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Extra Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Extra Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Extra Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Extra Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedExtraLight.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedLight.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Medium; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Medium [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Medium; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedMedium.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedRegular.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Semi Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Semi Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Semi Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Semi Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedSemiBold.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Ultra [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Ultra; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Ultra; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Ultra; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Ultra; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Ultra; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Condensed Ultra [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Condensed Ultra; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Condensed Ultra; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Condensed Ultra; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Condensed Ultra; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Condensed Ultra; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayCondensedUltra.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Extra Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Extra Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Extra Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Extra Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Extra Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Extra Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayExtraLight.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayLight.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Medium; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Medium [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Medium; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayMedium.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Black [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Black; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Black [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Black; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Black; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Black; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Black; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Black; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBlack.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowBold.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Extra Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Extra Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Extra Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Extra Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Extra Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Extra Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Extra Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Extra Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Extra Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowExtraLight.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Light [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Light [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowLight.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Medium [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Medium; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Medium [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Medium; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowMedium.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowRegular.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Semi Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Semi Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Semi Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Semi Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowSemiBold.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Ultra [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Ultra; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Ultra; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Ultra; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Ultra; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Ultra; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Narrow Ultra [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Narrow Ultra; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Narrow Ultra; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Narrow Ultra; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Narrow Ultra; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Narrow Ultra; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayNarrowUltra.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayRegular.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Semi Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Semi Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Semi Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Semi Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Semi Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Semi Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Semi Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Semi Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplaySemiBold.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Ultra [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.otf]:+clig;+liga;+tlig
+Roslindale V2 Display Ultra; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.otf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Ultra; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.otf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Ultra; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.otf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Ultra; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.otf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Ultra; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.otf]:+clig;+liga;+tlig;+ss12
+Roslindale V2 Display Ultra [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.ttf]:+clig;+liga;+tlig
+Roslindale V2 Display Ultra; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale V2 Display Ultra; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale V2 Display Ultra; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale V2 Display Ultra; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale V2 Display Ultra; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleV2Display/RoslindaleV2-DisplayUltra.ttf]:+clig;+liga;+tlig;+ss12
+Roslindale Variable Display Condensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig
+Roslindale Variable Display Condensed Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss01
+Roslindale Variable Display Condensed Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss02
+Roslindale Variable Display Condensed Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss03
+Roslindale Variable Display Condensed Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss04
+Roslindale Variable Display Condensed Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss05
+Roslindale Variable Display Condensed Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss06
+Roslindale Variable Display Condensed Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss07
+Roslindale Variable Display Condensed Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss08
+Roslindale Variable Display Condensed Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss09
+Roslindale Variable Display Condensed Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss10
+Roslindale Variable Display Condensed Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleDeck/RoslindaleVariable-VF_Deck_.ttf]:+clig;+liga;+tlig;+ss11
+RoslindaleText Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/RoslindaleText/RoslindaleText-Bold.otf]:+clig;+liga;+tlig
+RoslindaleText Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/RoslindaleText/RoslindaleText-Bold.ttf]:+clig;+liga;+tlig
+Rotunda Veneta Regular [/usr/local/texlive/texmf-local/fonts/opentype/CAST/RotundaVeneta/RotundaVeneta-Regular.otf]:+clig;+liga;+tlig
+Rotunda Veneta Regular; Historical Forms [/usr/local/texlive/texmf-local/fonts/opentype/CAST/RotundaVeneta/RotundaVeneta-Regular.otf]:+clig;+liga;+tlig;+hist
+Rotunda Veneta Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/CAST/RotundaVeneta/RotundaVeneta-Regular.otf]:+clig;+liga;+tlig;+ss01
+Rotunda Veneta Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/CAST/RotundaVeneta/RotundaVeneta-Regular.otf]:+clig;+liga;+tlig;+ss02
+Rukotvory-Bold [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Rukotvory/Rukotvory2_Bold_3.otf]:+clig;+liga;+tlig
+Rukotvory-Light [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Rukotvory/Rukotvory2_Light_3.otf]:+clig;+liga;+tlig
+Rukotvory-Medium [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Rukotvory/Rukotvory2_Medium_3.otf]:+clig;+liga;+tlig
+Rukotvory-Regular [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Rukotvory/Rukotvory2_Regular_3.otf]:+clig;+liga;+tlig
+RukotvorySans Regular [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Rukotvory/RukotvorySans-0.18-Regular.otf]:+clig;+liga;+tlig
+Rustique Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Rustique/Rustique-Regular.otf]:+clig;+liga;+tlig
+Rustique Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Rustique/Rustique-Regular.otf]:+clig;+liga;+tlig;+ss01
+Rustique Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Rustique/Rustique-Regular.otf]:+clig;+liga;+tlig;+ss02
+Rustique Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Rustique/Rustique-Regular.otf]:+clig;+liga;+tlig;+ss03
+Rustique Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Rustique/Rustique-Regular.ttf]:+clig;+liga;+tlig
+Rustique Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Rustique/Rustique-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Rustique Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Rustique/Rustique-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Rustique Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Rustique/Rustique-Regular.ttf]:+clig;+liga;+tlig;+ss03
+STEP [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/step/STEP-Regular.otf]:+clig;+liga;+tlig
+STEP; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/step/STEP-Regular.otf]:+clig;+liga;+tlig;+onum
+STEP; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/step/STEP-Regular.otf]:+clig;+liga;+tlig;+smcp
+STEP Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/step/STEP-Bold.otf]:+clig;+liga;+tlig
+STEP Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/step/STEP-Bold.otf]:+clig;+liga;+tlig;+onum
+STEP Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/step/STEP-BoldItalic.otf]:+clig;+liga;+tlig
+STEP Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/step/STEP-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+STEP Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/step/STEP-Italic.otf]:+clig;+liga;+tlig
+STEP Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/step/STEP-Italic.otf]:+clig;+liga;+tlig;+onum
+STIX Two Math Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig
+STIX Two Math Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss01
+STIX Two Math Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss02
+STIX Two Math Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss03
+STIX Two Math Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss04
+STIX Two Math Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss05
+STIX Two Math Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss06
+STIX Two Math Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss07
+STIX Two Math Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss08
+STIX Two Math Regular; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss09
+STIX Two Math Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss10
+STIX Two Math Regular; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss11
+STIX Two Math Regular; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss12
+STIX Two Math Regular; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss13
+STIX Two Math Regular; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss14
+STIX Two Math Regular; Stylistic Set 15 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss15
+STIX Two Math Regular; Stylistic Set 16 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss16
+STIX Two Math Regular; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoMath-Regular.otf]:+clig;+liga;+tlig;+ss20
+STIX Two Text Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Bold.otf]:+clig;+liga;+tlig
+STIX Two Text Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Bold.otf]:+clig;+liga;+tlig;+onum
+STIX Two Text Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Bold.otf]:+clig;+liga;+tlig;+smcp
+STIX Two Text Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-BoldItalic.otf]:+clig;+liga;+tlig
+STIX Two Text Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+STIX Two Text Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+STIX Two Text Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+STIX Two Text Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+STIX Two Text Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Italic.otf]:+clig;+liga;+tlig
+STIX Two Text Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Italic.otf]:+clig;+liga;+tlig;+onum
+STIX Two Text Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Italic.otf]:+clig;+liga;+tlig;+smcp
+STIX Two Text Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Italic.otf]:+clig;+liga;+tlig;+ss01
+STIX Two Text Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Italic.otf]:+clig;+liga;+tlig;+ss02
+STIX Two Text Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Medium.otf]:+clig;+liga;+tlig
+STIX Two Text Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Medium.otf]:+clig;+liga;+tlig;+onum
+STIX Two Text Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Medium.otf]:+clig;+liga;+tlig;+smcp
+STIX Two Text Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-MediumItalic.otf]:+clig;+liga;+tlig
+STIX Two Text Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+STIX Two Text Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+STIX Two Text Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+STIX Two Text Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+STIX Two Text Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Regular.otf]:+clig;+liga;+tlig
+STIX Two Text Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Regular.otf]:+clig;+liga;+tlig;+onum
+STIX Two Text Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-Regular.otf]:+clig;+liga;+tlig;+smcp
+STIX Two Text SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-SemiBold.otf]:+clig;+liga;+tlig
+STIX Two Text SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-SemiBold.otf]:+clig;+liga;+tlig;+onum
+STIX Two Text SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+STIX Two Text SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-SemiBoldItalic.otf]:+clig;+liga;+tlig
+STIX Two Text SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+STIX Two Text SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+smcp
+STIX Two Text SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+STIX Two Text SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix2-otf/STIXTwoText-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+STIX-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Bold.otf]:+clig;+liga;+tlig
+STIX-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Bold.otf]:+clig;+liga;+tlig;+onum
+STIX-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Bold.otf]:+clig;+liga;+tlig;+ss01
+STIX-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Bold.otf]:+clig;+liga;+tlig;+ss02
+STIX-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Bold.otf]:+clig;+liga;+tlig;+ss03
+STIX-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-BoldItalic.otf]:+clig;+liga;+tlig
+STIX-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+STIX-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Italic.otf]:+clig;+liga;+tlig
+STIX-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Italic.otf]:+clig;+liga;+tlig;+onum
+STIX-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Regular.otf]:+clig;+liga;+tlig
+STIX-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Regular.otf]:+clig;+liga;+tlig;+onum
+STIX-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Regular.otf]:+clig;+liga;+tlig;+ss01
+STIX-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Regular.otf]:+clig;+liga;+tlig;+ss02
+STIX-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIX-Regular.otf]:+clig;+liga;+tlig;+ss03
+STIXMath-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/stix/STIXMath-Regular.otf]:+clig;+liga;+tlig
+Sanskrit 2003 [/Users/bveytsman/Library/Fonts/Sanskrit2003.ttf]:+clig;+liga;+tlig
+Sawasdee [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Sawasdee.otf]:+clig;+liga;+tlig
+Sawasdee Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Sawasdee-Bold.otf]:+clig;+liga;+tlig
+Sawasdee Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Sawasdee-BoldOblique.otf]:+clig;+liga;+tlig
+Sawasdee Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Sawasdee-Oblique.otf]:+clig;+liga;+tlig
+Shafarik [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Shafarik-Regular.otf]:+clig;+liga;+tlig
+Shafarik; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Shafarik-Regular.otf]:+clig;+liga;+tlig;+ss01
+Shafarik; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Shafarik-Regular.otf]:+clig;+liga;+tlig;+ss02
+Shafarik; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Shafarik-Regular.otf]:+clig;+liga;+tlig;+ss03
+Shafarik; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Shafarik-Regular.otf]:+clig;+liga;+tlig;+ss04
+Shafarik; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Shafarik-Regular.otf]:+clig;+liga;+tlig;+ss05
+Shimanto [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/bangla/fontshimanto.ttf]:+clig;+liga;+tlig
+Shobhika Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/shobhika/Shobhika-Bold.otf]:+clig;+liga;+tlig
+Shobhika Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/shobhika/Shobhika-Regular.otf]:+clig;+liga;+tlig
+Shofar Demi-Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/ShofarDemi-Bold.ttf]:+clig;+liga;+tlig
+Shofar Demi-Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/ShofarDemi-BoldOblique.ttf]:+clig;+liga;+tlig
+Shofar Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/ShofarRegular.ttf]:+clig;+liga;+tlig
+Shofar Regular Oblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/ShofarRegularOblique.ttf]:+clig;+liga;+tlig
+Simple CLM Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/SimpleCLM-Bold.ttf]:+clig;+liga;+tlig
+Simple CLM BoldOblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/SimpleCLM-BoldOblique.ttf]:+clig;+liga;+tlig
+Simple CLM Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/SimpleCLM-Medium.ttf]:+clig;+liga;+tlig
+Simple CLM MediumOblique [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/SimpleCLM-MediumOblique.ttf]:+clig;+liga;+tlig
+Source Code Pro [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Regular.otf]:+clig;+liga;+tlig
+Source Code Pro; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Regular.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Regular.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Regular.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Regular.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Regular.otf]:+clig;+liga;+tlig;+ss04
+Source Code Pro; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Regular.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Regular.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Regular.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Black.otf]:+clig;+liga;+tlig
+Source Code Pro Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Black.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Black.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Black.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Black.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Black.otf]:+clig;+liga;+tlig;+ss04
+Source Code Pro Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Black.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Black; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Black.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Black; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Black.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BlackIt.otf]:+clig;+liga;+tlig
+Source Code Pro Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BlackIt.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BlackIt.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BlackIt.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BlackIt.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Black Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BlackIt.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Black Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BlackIt.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Black Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BlackIt.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Bold.otf]:+clig;+liga;+tlig
+Source Code Pro Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Bold.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Bold.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Bold.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Bold.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Bold.otf]:+clig;+liga;+tlig;+ss04
+Source Code Pro Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Bold.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Bold.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Bold.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BoldIt.otf]:+clig;+liga;+tlig
+Source Code Pro Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BoldIt.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BoldIt.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BoldIt.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BoldIt.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BoldIt.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BoldIt.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-BoldIt.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLight.otf]:+clig;+liga;+tlig
+Source Code Pro ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro ExtraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Source Code Pro ExtraLight; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro ExtraLight; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLight.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro ExtraLight; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLight.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLightIt.otf]:+clig;+liga;+tlig
+Source Code Pro ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLightIt.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro ExtraLight Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro ExtraLight Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro ExtraLight Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-RegularIt.otf]:+clig;+liga;+tlig
+Source Code Pro Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-RegularIt.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-RegularIt.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-RegularIt.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-RegularIt.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-RegularIt.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-RegularIt.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-RegularIt.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Light.otf]:+clig;+liga;+tlig
+Source Code Pro Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Light.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Light.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Light.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Light.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Light.otf]:+clig;+liga;+tlig;+ss04
+Source Code Pro Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Light.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Light.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Light.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-LightIt.otf]:+clig;+liga;+tlig
+Source Code Pro Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-LightIt.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-LightIt.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-LightIt.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-LightIt.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-LightIt.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Light Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-LightIt.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Light Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-LightIt.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Medium.otf]:+clig;+liga;+tlig
+Source Code Pro Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Medium.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Medium.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Medium.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Medium.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Medium; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Medium.otf]:+clig;+liga;+tlig;+ss04
+Source Code Pro Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Medium.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Medium.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Medium; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Medium.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-MediumIt.otf]:+clig;+liga;+tlig
+Source Code Pro Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-MediumIt.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-MediumIt.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-MediumIt.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-MediumIt.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-MediumIt.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Medium Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-MediumIt.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Medium Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-MediumIt.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Semibold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Semibold.otf]:+clig;+liga;+tlig
+Source Code Pro Semibold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Semibold.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Semibold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Semibold.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Semibold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Semibold.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Semibold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Semibold.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Semibold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Semibold.otf]:+clig;+liga;+tlig;+ss04
+Source Code Pro Semibold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Semibold.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Semibold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Semibold.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Semibold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-Semibold.otf]:+clig;+liga;+tlig;+ss07
+Source Code Pro Semibold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-SemiboldIt.otf]:+clig;+liga;+tlig
+Source Code Pro Semibold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-SemiboldIt.otf]:+clig;+liga;+tlig;+onum
+Source Code Pro Semibold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss01
+Source Code Pro Semibold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss02
+Source Code Pro Semibold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss03
+Source Code Pro Semibold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss05
+Source Code Pro Semibold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss06
+Source Code Pro Semibold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcecodepro/SourceCodePro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig
+Source Sans Pro; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+smcp
+Source Sans Pro; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Regular.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig
+Source Sans Pro Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+smcp
+Source Sans Pro Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro Black; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro Black; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro Black; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro Black; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro Black; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro Black; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro Black; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro Black; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Black.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig
+Source Sans Pro Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro Black Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro Black Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro Black Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro Black Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro Black Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro Black Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro Black Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro Black Italic; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BlackIt.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig
+Source Sans Pro Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+smcp
+Source Sans Pro Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro Bold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro Bold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro Bold; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Bold.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig
+Source Sans Pro Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro Bold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro Bold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro Bold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro Bold Italic; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-BoldIt.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig
+Source Sans Pro ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+smcp
+Source Sans Pro ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro ExtraLight; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro ExtraLight; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro ExtraLight; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro ExtraLight; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro ExtraLight; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro ExtraLight; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro ExtraLight; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro ExtraLight; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLight.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig
+Source Sans Pro ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro ExtraLight Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro ExtraLight Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro ExtraLight Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro ExtraLight Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro ExtraLight Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro ExtraLight Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro ExtraLight Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro ExtraLight Italic; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig
+Source Sans Pro Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro Italic; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-RegularIt.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig
+Source Sans Pro Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+smcp
+Source Sans Pro Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro Light; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro Light; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro Light; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro Light; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro Light; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro Light; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Light.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig
+Source Sans Pro Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro Light Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro Light Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro Light Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro Light Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro Light Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro Light Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro Light Italic; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-LightIt.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro Semibold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig
+Source Sans Pro Semibold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro Semibold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+smcp
+Source Sans Pro Semibold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro Semibold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro Semibold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro Semibold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro Semibold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro Semibold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro Semibold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro Semibold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro Semibold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro Semibold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro Semibold; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-Semibold.otf]:+clig;+liga;+tlig;+titl
+Source Sans Pro Semibold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig
+Source Sans Pro Semibold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+onum
+Source Sans Pro Semibold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss01
+Source Sans Pro Semibold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss02
+Source Sans Pro Semibold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss03
+Source Sans Pro Semibold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss04
+Source Sans Pro Semibold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss05
+Source Sans Pro Semibold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss06
+Source Sans Pro Semibold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss07
+Source Sans Pro Semibold Italic; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss08
+Source Sans Pro Semibold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss09
+Source Sans Pro Semibold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss10
+Source Sans Pro Semibold Italic; Titling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourcesanspro/SourceSansPro-SemiboldIt.otf]:+clig;+liga;+tlig;+titl
+Source Serif Pro [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Regular.otf]:+clig;+liga;+tlig
+Source Serif Pro; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Regular.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Regular.otf]:+clig;+liga;+tlig;+smcp
+Source Serif Pro Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Black.otf]:+clig;+liga;+tlig
+Source Serif Pro Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Black.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Black.otf]:+clig;+liga;+tlig;+smcp
+Source Serif Pro Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-BlackIt.otf]:+clig;+liga;+tlig
+Source Serif Pro Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-BlackIt.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-BlackIt.otf]:+clig;+liga;+tlig;+ss01
+Source Serif Pro Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Bold.otf]:+clig;+liga;+tlig
+Source Serif Pro Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Bold.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Bold.otf]:+clig;+liga;+tlig;+smcp
+Source Serif Pro Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-BoldIt.otf]:+clig;+liga;+tlig
+Source Serif Pro Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-BoldIt.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-BoldIt.otf]:+clig;+liga;+tlig;+ss01
+Source Serif Pro ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-ExtraLight.otf]:+clig;+liga;+tlig
+Source Serif Pro ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-ExtraLight.otf]:+clig;+liga;+tlig;+smcp
+Source Serif Pro ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-ExtraLightIt.otf]:+clig;+liga;+tlig
+Source Serif Pro ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-ExtraLightIt.otf]:+clig;+liga;+tlig;+ss01
+Source Serif Pro Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-RegularIt.otf]:+clig;+liga;+tlig
+Source Serif Pro Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-RegularIt.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-RegularIt.otf]:+clig;+liga;+tlig;+ss01
+Source Serif Pro Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Light.otf]:+clig;+liga;+tlig
+Source Serif Pro Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Light.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Light.otf]:+clig;+liga;+tlig;+smcp
+Source Serif Pro Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-LightIt.otf]:+clig;+liga;+tlig
+Source Serif Pro Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-LightIt.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-LightIt.otf]:+clig;+liga;+tlig;+ss01
+Source Serif Pro Semibold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Semibold.otf]:+clig;+liga;+tlig
+Source Serif Pro Semibold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Semibold.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro Semibold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-Semibold.otf]:+clig;+liga;+tlig;+smcp
+Source Serif Pro Semibold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-SemiboldIt.otf]:+clig;+liga;+tlig
+Source Serif Pro Semibold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-SemiboldIt.otf]:+clig;+liga;+tlig;+onum
+Source Serif Pro Semibold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/adobe/sourceserifpro/SourceSerifPro-SemiboldIt.otf]:+clig;+liga;+tlig;+ss01
+Spark Bar Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/aftertheflood/spark/Spark - Bar - Medium.otf]:+clig;+liga;+tlig
+Spark Bar Narrow [/usr/local/texlive/2024/texmf-dist/fonts/opentype/aftertheflood/spark/Spark - Bar - Narrow.otf]:+clig;+liga;+tlig
+Spark Bar Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/aftertheflood/spark/Spark - Bar - Thin.otf]:+clig;+liga;+tlig
+Spark Dot Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/aftertheflood/spark/Spark - Dot - Medium.otf]:+clig;+liga;+tlig
+Spark Dot Small [/usr/local/texlive/2024/texmf-dist/fonts/opentype/aftertheflood/spark/Spark - Dot - Small.otf]:+clig;+liga;+tlig
+Spark Dot-line Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/aftertheflood/spark/Spark - Dot-line - Medium.otf]:+clig;+liga;+tlig
+Sparks Bar Extra-narrow [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Bar-Extranarrow.otf]:+clig;+liga;+tlig
+Sparks Bar Extra-wide [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Bar-Extrawide.otf]:+clig;+liga;+tlig
+Sparks Bar Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Bar-Medium.otf]:+clig;+liga;+tlig
+Sparks Bar Narrow [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Bar-Narrow.otf]:+clig;+liga;+tlig
+Sparks Bar Wide [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Bar-Wide.otf]:+clig;+liga;+tlig
+Sparks Dot Extra-large [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Dot-Extralarge.otf]:+clig;+liga;+tlig
+Sparks Dot Extra-small [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Dot-Extrasmall.otf]:+clig;+liga;+tlig
+Sparks Dot Large [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Dot-Large.otf]:+clig;+liga;+tlig
+Sparks Dot Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Dot-Medium.otf]:+clig;+liga;+tlig
+Sparks Dot Small [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Dot-Small.otf]:+clig;+liga;+tlig
+Sparks Dot-line Extra-thick [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Dotline-Extrathick.otf]:+clig;+liga;+tlig
+Sparks Dot-line Extra-thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Dotline-Extrathin.otf]:+clig;+liga;+tlig
+Sparks Dot-line Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Dotline-Medium.otf]:+clig;+liga;+tlig
+Sparks Dot-line Thick [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Dotline-Thick.otf]:+clig;+liga;+tlig
+Sparks Dot-line Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/spark-otf/Sparks-Dotline-Thin.otf]:+clig;+liga;+tlig
+Spectral Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Bold.ttf]:+clig;+liga;+tlig
+Spectral Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Bold.ttf]:+clig;+liga;+tlig;+hist
+Spectral Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Bold.ttf]:+clig;+liga;+tlig;+onum
+Spectral Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Spectral Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Spectral Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Spectral Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Spectral Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Spectral Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Bold.ttf]:+clig;+liga;+tlig;+ss06
+Spectral Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-BoldItalic.ttf]:+clig;+liga;+tlig
+Spectral Bold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-BoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Spectral Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Spectral Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-BoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Spectral Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Spectral Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Spectral Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Spectral Bold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-BoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Spectral Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-BoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Spectral ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBold.ttf]:+clig;+liga;+tlig
+Spectral ExtraBold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBold.ttf]:+clig;+liga;+tlig;+hist
+Spectral ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Spectral ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Spectral ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Spectral ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Spectral ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Spectral ExtraBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBold.ttf]:+clig;+liga;+tlig;+ss05
+Spectral ExtraBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBold.ttf]:+clig;+liga;+tlig;+ss06
+Spectral ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Spectral ExtraBold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Spectral ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Spectral ExtraBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Spectral ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Spectral ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Spectral ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Spectral ExtraBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Spectral ExtraBold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Spectral ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLight.ttf]:+clig;+liga;+tlig
+Spectral ExtraLight; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLight.ttf]:+clig;+liga;+tlig;+hist
+Spectral ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Spectral ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Spectral ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Spectral ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Spectral ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Spectral ExtraLight; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLight.ttf]:+clig;+liga;+tlig;+ss05
+Spectral ExtraLight; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLight.ttf]:+clig;+liga;+tlig;+ss06
+Spectral ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Spectral ExtraLight Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+hist
+Spectral ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Spectral ExtraLight Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Spectral ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Spectral ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Spectral ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Spectral ExtraLight Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss05
+Spectral ExtraLight Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss06
+Spectral Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Italic.ttf]:+clig;+liga;+tlig
+Spectral Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Italic.ttf]:+clig;+liga;+tlig;+hist
+Spectral Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Italic.ttf]:+clig;+liga;+tlig;+onum
+Spectral Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Italic.ttf]:+clig;+liga;+tlig;+smcp
+Spectral Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Spectral Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Spectral Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Spectral Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Italic.ttf]:+clig;+liga;+tlig;+ss05
+Spectral Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Italic.ttf]:+clig;+liga;+tlig;+ss06
+Spectral Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Light.ttf]:+clig;+liga;+tlig
+Spectral Light; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Light.ttf]:+clig;+liga;+tlig;+hist
+Spectral Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Light.ttf]:+clig;+liga;+tlig;+onum
+Spectral Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Light.ttf]:+clig;+liga;+tlig;+smcp
+Spectral Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Light.ttf]:+clig;+liga;+tlig;+ss01
+Spectral Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Light.ttf]:+clig;+liga;+tlig;+ss02
+Spectral Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Light.ttf]:+clig;+liga;+tlig;+ss03
+Spectral Light; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Light.ttf]:+clig;+liga;+tlig;+ss05
+Spectral Light; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Light.ttf]:+clig;+liga;+tlig;+ss06
+Spectral Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-LightItalic.ttf]:+clig;+liga;+tlig
+Spectral Light Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-LightItalic.ttf]:+clig;+liga;+tlig;+hist
+Spectral Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Spectral Light Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-LightItalic.ttf]:+clig;+liga;+tlig;+smcp
+Spectral Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Spectral Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-LightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Spectral Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-LightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Spectral Light Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-LightItalic.ttf]:+clig;+liga;+tlig;+ss05
+Spectral Light Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-LightItalic.ttf]:+clig;+liga;+tlig;+ss06
+Spectral Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Medium.ttf]:+clig;+liga;+tlig
+Spectral Medium; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Medium.ttf]:+clig;+liga;+tlig;+hist
+Spectral Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Medium.ttf]:+clig;+liga;+tlig;+onum
+Spectral Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Medium.ttf]:+clig;+liga;+tlig;+smcp
+Spectral Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Spectral Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Spectral Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Spectral Medium; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Medium.ttf]:+clig;+liga;+tlig;+ss05
+Spectral Medium; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Medium.ttf]:+clig;+liga;+tlig;+ss06
+Spectral Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-MediumItalic.ttf]:+clig;+liga;+tlig
+Spectral Medium Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-MediumItalic.ttf]:+clig;+liga;+tlig;+hist
+Spectral Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-MediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Spectral Medium Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-MediumItalic.ttf]:+clig;+liga;+tlig;+smcp
+Spectral Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-MediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Spectral Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-MediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Spectral Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-MediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Spectral Medium Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-MediumItalic.ttf]:+clig;+liga;+tlig;+ss05
+Spectral Medium Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-MediumItalic.ttf]:+clig;+liga;+tlig;+ss06
+Spectral Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Regular.ttf]:+clig;+liga;+tlig
+Spectral Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Regular.ttf]:+clig;+liga;+tlig;+hist
+Spectral Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Regular.ttf]:+clig;+liga;+tlig;+onum
+Spectral Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Spectral Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Spectral Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Spectral Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Spectral Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Spectral Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-Regular.ttf]:+clig;+liga;+tlig;+ss06
+Spectral SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBold.ttf]:+clig;+liga;+tlig
+Spectral SemiBold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBold.ttf]:+clig;+liga;+tlig;+hist
+Spectral SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBold.ttf]:+clig;+liga;+tlig;+onum
+Spectral SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Spectral SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Spectral SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Spectral SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Spectral SemiBold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBold.ttf]:+clig;+liga;+tlig;+ss05
+Spectral SemiBold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBold.ttf]:+clig;+liga;+tlig;+ss06
+Spectral SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Spectral SemiBold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+hist
+Spectral SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Spectral SemiBold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+smcp
+Spectral SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Spectral SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Spectral SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Spectral SemiBold Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss05
+Spectral SemiBold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/production/spectral/Spectral-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss06
+Stam Ashkenaz CLM [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/StamAshkenazCLM.ttf]:+clig;+liga;+tlig
+Stam Sefarad CLM [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/culmus/StamSefaradCLM.ttf]:+clig;+liga;+tlig
+Symbol [/System/Library/Fonts/Symbol.ttf]:+clig;+liga;+tlig
+System Font [/System/Library/Fonts/SFNS.ttf]:+clig;+liga;+tlig
+System Font; Small Capitals [/System/Library/Fonts/SFNS.ttf]:+clig;+liga;+tlig;+smcp
+System Font; Stylistic Set 1 [/System/Library/Fonts/SFNS.ttf]:+clig;+liga;+tlig;+ss01
+System Font; Stylistic Set 2 [/System/Library/Fonts/SFNS.ttf]:+clig;+liga;+tlig;+ss02
+System Font; Stylistic Set 3 [/System/Library/Fonts/SFNS.ttf]:+clig;+liga;+tlig;+ss03
+System Font; Stylistic Set 4 [/System/Library/Fonts/SFNS.ttf]:+clig;+liga;+tlig;+ss04
+System Font; Stylistic Set 6 [/System/Library/Fonts/SFNS.ttf]:+clig;+liga;+tlig;+ss06
+System Font; Stylistic Set 7 [/System/Library/Fonts/SFNS.ttf]:+clig;+liga;+tlig;+ss07
+System Font; Stylistic Set 9 [/System/Library/Fonts/SFNS.ttf]:+clig;+liga;+tlig;+ss09
+System Font Regular Italic [/System/Library/Fonts/SFNSItalic.ttf]:+clig;+liga;+tlig
+System Font Regular Italic; Stylistic Set 1 [/System/Library/Fonts/SFNSItalic.ttf]:+clig;+liga;+tlig;+ss01
+System Font Regular Italic; Stylistic Set 2 [/System/Library/Fonts/SFNSItalic.ttf]:+clig;+liga;+tlig;+ss02
+System Font Regular Italic; Stylistic Set 3 [/System/Library/Fonts/SFNSItalic.ttf]:+clig;+liga;+tlig;+ss03
+System Font Regular Italic; Stylistic Set 5 [/System/Library/Fonts/SFNSItalic.ttf]:+clig;+liga;+tlig;+ss05
+System Font Regular Italic; Stylistic Set 6 [/System/Library/Fonts/SFNSItalic.ttf]:+clig;+liga;+tlig;+ss06
+System Font Regular Italic; Stylistic Set 7 [/System/Library/Fonts/SFNSItalic.ttf]:+clig;+liga;+tlig;+ss07
+Talos-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/talos/Talos-Bold.otf]:+clig;+liga;+tlig
+Talos-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/talos/Talos-BoldItalic.otf]:+clig;+liga;+tlig
+Talos-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/talos/Talos-Italic.otf]:+clig;+liga;+tlig
+Talos-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/talos/Talos-Regular.otf]:+clig;+liga;+tlig
+Talos-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/talos/Talos-Regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreAdventor-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bold.otf]:+clig;+liga;+tlig
+TeXGyreAdventor-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyreAdventor-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreAdventor-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreAdventor-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreAdventor-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreAdventor-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreAdventor-Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bold.otf]:+clig;+liga;+tlig;+ss10
+TeXGyreAdventor-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bolditalic.otf]:+clig;+liga;+tlig
+TeXGyreAdventor-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bolditalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreAdventor-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreAdventor-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreAdventor-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreAdventor-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreAdventor-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreAdventor-BoldItalic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-bolditalic.otf]:+clig;+liga;+tlig;+ss10
+TeXGyreAdventor-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-italic.otf]:+clig;+liga;+tlig
+TeXGyreAdventor-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreAdventor-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreAdventor-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreAdventor-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreAdventor-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreAdventor-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreAdventor-Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-italic.otf]:+clig;+liga;+tlig;+ss10
+TeXGyreAdventor-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-regular.otf]:+clig;+liga;+tlig
+TeXGyreAdventor-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyreAdventor-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreAdventor-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreAdventor-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreAdventor-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreAdventor-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreAdventor-Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreadventor-regular.otf]:+clig;+liga;+tlig;+ss10
+TeXGyreBonum-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bold.otf]:+clig;+liga;+tlig
+TeXGyreBonum-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyreBonum-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreBonum-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreBonum-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreBonum-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreBonum-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreBonum-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bolditalic.otf]:+clig;+liga;+tlig
+TeXGyreBonum-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bolditalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreBonum-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreBonum-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreBonum-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreBonum-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreBonum-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreBonum-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-italic.otf]:+clig;+liga;+tlig
+TeXGyreBonum-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreBonum-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreBonum-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreBonum-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreBonum-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreBonum-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreBonum-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-regular.otf]:+clig;+liga;+tlig
+TeXGyreBonum-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyreBonum-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreBonum-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreBonum-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreBonum-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreBonum-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrebonum-regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreBonumMath-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre-math/texgyrebonum-math.otf]:+clig;+liga;+tlig
+TeXGyreChorus-MediumItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrechorus-mediumitalic.otf]:+clig;+liga;+tlig
+TeXGyreChorus-MediumItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrechorus-mediumitalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreChorus-MediumItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrechorus-mediumitalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreChorus-MediumItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrechorus-mediumitalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreChorus-MediumItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrechorus-mediumitalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreChorus-MediumItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrechorus-mediumitalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreCursor-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bold.otf]:+clig;+liga;+tlig
+TeXGyreCursor-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyreCursor-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreCursor-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreCursor-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreCursor-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreCursor-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreCursor-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bolditalic.otf]:+clig;+liga;+tlig
+TeXGyreCursor-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bolditalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreCursor-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreCursor-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreCursor-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreCursor-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreCursor-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreCursor-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-italic.otf]:+clig;+liga;+tlig
+TeXGyreCursor-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreCursor-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreCursor-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreCursor-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreCursor-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreCursor-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreCursor-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-regular.otf]:+clig;+liga;+tlig
+TeXGyreCursor-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyreCursor-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreCursor-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreCursor-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreCursor-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreCursor-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrecursor-regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreDejaVuMath-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre-math/texgyredejavu-math.otf]:+clig;+liga;+tlig
+TeXGyreHeros-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bold.otf]:+clig;+liga;+tlig
+TeXGyreHeros-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyreHeros-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreHeros-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreHeros-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreHeros-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreHeros-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreHeros-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bolditalic.otf]:+clig;+liga;+tlig
+TeXGyreHeros-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bolditalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreHeros-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreHeros-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreHeros-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreHeros-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreHeros-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreHeros-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-italic.otf]:+clig;+liga;+tlig
+TeXGyreHeros-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreHeros-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreHeros-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreHeros-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreHeros-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreHeros-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreHeros-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-regular.otf]:+clig;+liga;+tlig
+TeXGyreHeros-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyreHeros-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreHeros-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreHeros-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreHeros-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreHeros-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheros-regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreHerosCondensed-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bold.otf]:+clig;+liga;+tlig
+TeXGyreHerosCondensed-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyreHerosCondensed-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreHerosCondensed-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreHerosCondensed-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreHerosCondensed-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreHerosCondensed-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreHerosCondensed-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bolditalic.otf]:+clig;+liga;+tlig
+TeXGyreHerosCondensed-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bolditalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreHerosCondensed-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreHerosCondensed-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreHerosCondensed-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreHerosCondensed-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreHerosCondensed-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreHerosCondensed-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-italic.otf]:+clig;+liga;+tlig
+TeXGyreHerosCondensed-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreHerosCondensed-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreHerosCondensed-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreHerosCondensed-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreHerosCondensed-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreHerosCondensed-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreHerosCondensed-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-regular.otf]:+clig;+liga;+tlig
+TeXGyreHerosCondensed-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyreHerosCondensed-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreHerosCondensed-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreHerosCondensed-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreHerosCondensed-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreHerosCondensed-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreheroscn-regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagella-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bold.otf]:+clig;+liga;+tlig
+TeXGyrePagella-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyrePagella-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyrePagella-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyrePagella-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyrePagella-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyrePagella-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagella-Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bold.otf]:+clig;+liga;+tlig;+ss10
+TeXGyrePagella-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bolditalic.otf]:+clig;+liga;+tlig
+TeXGyrePagella-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bolditalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyrePagella-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyrePagella-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyrePagella-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyrePagella-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyrePagella-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagella-BoldItalic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-bolditalic.otf]:+clig;+liga;+tlig;+ss10
+TeXGyrePagella-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-italic.otf]:+clig;+liga;+tlig
+TeXGyrePagella-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyrePagella-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyrePagella-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyrePagella-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyrePagella-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyrePagella-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagella-Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-italic.otf]:+clig;+liga;+tlig;+ss10
+TeXGyrePagella-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-regular.otf]:+clig;+liga;+tlig
+TeXGyrePagella-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyrePagella-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyrePagella-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyrePagella-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyrePagella-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyrePagella-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagella-Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyrepagella-regular.otf]:+clig;+liga;+tlig;+ss10
+TeXGyrePagellaMath-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre-math/texgyrepagella-math.otf]:+clig;+liga;+tlig
+TeXGyrePagellaX-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig
+TeXGyrePagellaX-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyrePagellaX-Bold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig;+pcap
+TeXGyrePagellaX-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyrePagellaX-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyrePagellaX-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyrePagellaX-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyrePagellaX-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagellaX-Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig;+ss06
+TeXGyrePagellaX-Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig;+ss07
+TeXGyrePagellaX-Bold; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Bold.otf]:+clig;+liga;+tlig;+ss20
+TeXGyrePagellaX-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig
+TeXGyrePagellaX-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyrePagellaX-BoldItalic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig;+pcap
+TeXGyrePagellaX-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyrePagellaX-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyrePagellaX-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyrePagellaX-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyrePagellaX-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagellaX-BoldItalic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+TeXGyrePagellaX-BoldItalic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+TeXGyrePagellaX-BoldItalic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss20
+TeXGyrePagellaX-BoldSlanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig
+TeXGyrePagellaX-BoldSlanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig;+onum
+TeXGyrePagellaX-BoldSlanted; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig;+pcap
+TeXGyrePagellaX-BoldSlanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig;+smcp
+TeXGyrePagellaX-BoldSlanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss01
+TeXGyrePagellaX-BoldSlanted; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss02
+TeXGyrePagellaX-BoldSlanted; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss03
+TeXGyrePagellaX-BoldSlanted; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagellaX-BoldSlanted; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss06
+TeXGyrePagellaX-BoldSlanted; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss07
+TeXGyrePagellaX-BoldSlanted; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss20
+TeXGyrePagellaX-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig
+TeXGyrePagellaX-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyrePagellaX-Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+pcap
+TeXGyrePagellaX-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyrePagellaX-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyrePagellaX-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyrePagellaX-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyrePagellaX-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagellaX-Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+ss05
+TeXGyrePagellaX-Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+ss06
+TeXGyrePagellaX-Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+ss07
+TeXGyrePagellaX-Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Italic.otf]:+clig;+liga;+tlig;+ss20
+TeXGyrePagellaX-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig
+TeXGyrePagellaX-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyrePagellaX-Regular; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig;+pcap
+TeXGyrePagellaX-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyrePagellaX-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyrePagellaX-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyrePagellaX-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyrePagellaX-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagellaX-Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig;+ss06
+TeXGyrePagellaX-Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig;+ss07
+TeXGyrePagellaX-Regular; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Regular.otf]:+clig;+liga;+tlig;+ss20
+TeXGyrePagellaX-Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig
+TeXGyrePagellaX-Slanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig;+onum
+TeXGyrePagellaX-Slanted; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig;+pcap
+TeXGyrePagellaX-Slanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig;+smcp
+TeXGyrePagellaX-Slanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig;+ss01
+TeXGyrePagellaX-Slanted; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig;+ss02
+TeXGyrePagellaX-Slanted; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig;+ss03
+TeXGyrePagellaX-Slanted; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig;+ss04
+TeXGyrePagellaX-Slanted; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig;+ss06
+TeXGyrePagellaX-Slanted; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig;+ss07
+TeXGyrePagellaX-Slanted; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/TeXGyrePagellaX-Slanted.otf]:+clig;+liga;+tlig;+ss20
+TeXGyreSchola-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bold.otf]:+clig;+liga;+tlig
+TeXGyreSchola-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyreSchola-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreSchola-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreSchola-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreSchola-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreSchola-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreSchola-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bolditalic.otf]:+clig;+liga;+tlig
+TeXGyreSchola-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bolditalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreSchola-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreSchola-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreSchola-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreSchola-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreSchola-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreSchola-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-italic.otf]:+clig;+liga;+tlig
+TeXGyreSchola-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreSchola-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreSchola-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreSchola-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreSchola-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreSchola-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreSchola-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-regular.otf]:+clig;+liga;+tlig
+TeXGyreSchola-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyreSchola-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreSchola-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreSchola-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreSchola-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreSchola-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyreschola-regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreScholaMath-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre-math/texgyreschola-math.otf]:+clig;+liga;+tlig
+TeXGyreScholaX Bold Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldSlanted.otf]:+clig;+liga;+tlig
+TeXGyreScholaX Bold Slanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldSlanted.otf]:+clig;+liga;+tlig;+onum
+TeXGyreScholaX Bold Slanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldSlanted.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreScholaX Bold Slanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreScholaX Bold Slanted; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreScholaX Bold Slanted; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreScholaX Bold Slanted; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreScholaX Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Slanted.otf]:+clig;+liga;+tlig
+TeXGyreScholaX Slanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Slanted.otf]:+clig;+liga;+tlig;+onum
+TeXGyreScholaX Slanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Slanted.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreScholaX Slanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Slanted.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreScholaX Slanted; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Slanted.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreScholaX Slanted; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Slanted.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreScholaX Slanted; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Slanted.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreScholaX-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Bold.otf]:+clig;+liga;+tlig
+TeXGyreScholaX-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyreScholaX-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreScholaX-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreScholaX-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreScholaX-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreScholaX-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreScholaX-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldItalic.otf]:+clig;+liga;+tlig
+TeXGyreScholaX-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreScholaX-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreScholaX-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreScholaX-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreScholaX-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreScholaX-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreScholaX-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Italic.otf]:+clig;+liga;+tlig
+TeXGyreScholaX-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreScholaX-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreScholaX-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreScholaX-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreScholaX-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreScholaX-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreScholaX-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Regular.otf]:+clig;+liga;+tlig
+TeXGyreScholaX-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyreScholaX-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreScholaX-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreScholaX-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreScholaX-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreScholaX-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/scholax/TeXGyreScholaX-Regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermes-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bold.otf]:+clig;+liga;+tlig
+TeXGyreTermes-Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyreTermes-Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreTermes-Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreTermes-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreTermes-Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreTermes-Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermes-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bolditalic.otf]:+clig;+liga;+tlig
+TeXGyreTermes-BoldItalic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bolditalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreTermes-BoldItalic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bolditalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreTermes-BoldItalic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bolditalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreTermes-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bolditalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreTermes-BoldItalic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bolditalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreTermes-BoldItalic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-bolditalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermes-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-italic.otf]:+clig;+liga;+tlig
+TeXGyreTermes-Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreTermes-Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreTermes-Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreTermes-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreTermes-Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreTermes-Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermes-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-regular.otf]:+clig;+liga;+tlig
+TeXGyreTermes-Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyreTermes-Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreTermes-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreTermes-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreTermes-Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreTermes-Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre/texgyretermes-regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermesMath-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tex-gyre-math/texgyretermes-math.otf]:+clig;+liga;+tlig
+TeXGyreTermesX Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig
+TeXGyreTermesX Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+onum
+TeXGyreTermesX Bold; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+pcap
+TeXGyreTermesX Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreTermesX Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreTermesX Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreTermesX Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreTermesX Bold; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermesX Bold; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+ss06
+TeXGyreTermesX Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+ss07
+TeXGyreTermesX Bold; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+ss19
+TeXGyreTermesX Bold; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Bold.otf]:+clig;+liga;+tlig;+ss20
+TeXGyreTermesX Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig
+TeXGyreTermesX Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreTermesX Bold Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+pcap
+TeXGyreTermesX Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreTermesX Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreTermesX Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreTermesX Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreTermesX Bold Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermesX Bold Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+ss06
+TeXGyreTermesX Bold Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+ss07
+TeXGyreTermesX Bold Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+ss19
+TeXGyreTermesX Bold Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldItalic.otf]:+clig;+liga;+tlig;+ss20
+TeXGyreTermesX Bold Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig
+TeXGyreTermesX Bold Slanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+onum
+TeXGyreTermesX Bold Slanted; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+pcap
+TeXGyreTermesX Bold Slanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreTermesX Bold Slanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreTermesX Bold Slanted; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreTermesX Bold Slanted; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreTermesX Bold Slanted; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermesX Bold Slanted; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss06
+TeXGyreTermesX Bold Slanted; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss07
+TeXGyreTermesX Bold Slanted; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss19
+TeXGyreTermesX Bold Slanted; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-BoldSlanted.otf]:+clig;+liga;+tlig;+ss20
+TeXGyreTermesX Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig
+TeXGyreTermesX Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+onum
+TeXGyreTermesX Italic; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+pcap
+TeXGyreTermesX Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreTermesX Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreTermesX Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreTermesX Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreTermesX Italic; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermesX Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+ss05
+TeXGyreTermesX Italic; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+ss06
+TeXGyreTermesX Italic; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+ss07
+TeXGyreTermesX Italic; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+ss19
+TeXGyreTermesX Italic; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Italic.otf]:+clig;+liga;+tlig;+ss20
+TeXGyreTermesX Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig
+TeXGyreTermesX Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+onum
+TeXGyreTermesX Regular; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+pcap
+TeXGyreTermesX Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreTermesX Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreTermesX Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreTermesX Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreTermesX Regular; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermesX Regular; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+ss06
+TeXGyreTermesX Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+ss07
+TeXGyreTermesX Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+ss08
+TeXGyreTermesX Regular; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+ss19
+TeXGyreTermesX Regular; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Regular.otf]:+clig;+liga;+tlig;+ss20
+TeXGyreTermesX Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig
+TeXGyreTermesX Slanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+onum
+TeXGyreTermesX Slanted; Petite Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+pcap
+TeXGyreTermesX Slanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+smcp
+TeXGyreTermesX Slanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+ss01
+TeXGyreTermesX Slanted; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+ss02
+TeXGyreTermesX Slanted; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+ss03
+TeXGyreTermesX Slanted; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+ss04
+TeXGyreTermesX Slanted; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+ss05
+TeXGyreTermesX Slanted; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+ss06
+TeXGyreTermesX Slanted; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+ss07
+TeXGyreTermesX Slanted; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+ss08
+TeXGyreTermesX Slanted; Stylistic Set 19 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+ss19
+TeXGyreTermesX Slanted; Stylistic Set 20 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/TeXGyreTermesX-Slanted.otf]:+clig;+liga;+tlig;+ss20
+Tempora Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-Bold.otf]:+clig;+liga;+tlig
+Tempora Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-Bold.otf]:+clig;+liga;+tlig;+onum
+Tempora Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-Bold.otf]:+clig;+liga;+tlig;+ss01
+Tempora Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-BoldItalic.otf]:+clig;+liga;+tlig
+Tempora Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Tempora Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Tempora Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-Italic.otf]:+clig;+liga;+tlig
+Tempora Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-Italic.otf]:+clig;+liga;+tlig;+onum
+Tempora Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-Italic.otf]:+clig;+liga;+tlig;+ss01
+Tempora LGC Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-Regular.otf]:+clig;+liga;+tlig
+Tempora LGC Unicode; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-Regular.otf]:+clig;+liga;+tlig;+onum
+Tempora LGC Unicode; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/tempora/Tempora-Regular.otf]:+clig;+liga;+tlig;+ss01
+TheSansMonoCondensed Bold [/usr/local/texlive/texmf-local/fonts/truetype/thsmc/ThSMCB02.ttf]:+clig;+liga;+tlig
+TheSansMonoCondensed Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/thsmc/TSMCBI56.ttf]:+clig;+liga;+tlig
+TheSansMonoCondensed Italic [/usr/local/texlive/texmf-local/fonts/truetype/thsmc/ThSMCI29.ttf]:+clig;+liga;+tlig
+TheSansMonoCondensed Plain [/usr/local/texlive/texmf-local/fonts/truetype/thsmc/ThSMCP25.ttf]:+clig;+liga;+tlig
+Theano Didot Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanodidot/TheanoDidot-Bold.ttf]:+clig;+liga;+tlig
+Theano Didot Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanodidot/TheanoDidot-Bold.ttf]:+clig;+liga;+tlig;+onum
+Theano Didot Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanodidot/TheanoDidot-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Theano Didot Bold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanodidot/TheanoDidot-Bold.ttf]:+clig;+liga;+tlig;+ss11
+Theano Didot Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanodidot/TheanoDidot-Regular.ttf]:+clig;+liga;+tlig
+Theano Didot Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanodidot/TheanoDidot-Regular.ttf]:+clig;+liga;+tlig;+onum
+Theano Didot Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanodidot/TheanoDidot-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Theano Didot Regular; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanodidot/TheanoDidot-Regular.ttf]:+clig;+liga;+tlig;+ss11
+Theano Modern Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Bold.ttf]:+clig;+liga;+tlig
+Theano Modern Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Bold.ttf]:+clig;+liga;+tlig;+onum
+Theano Modern Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Theano Modern Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Bold.ttf]:+clig;+liga;+tlig;+ss07
+Theano Modern Bold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Bold.ttf]:+clig;+liga;+tlig;+ss08
+Theano Modern Bold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Bold.ttf]:+clig;+liga;+tlig;+ss09
+Theano Modern Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Bold.ttf]:+clig;+liga;+tlig;+ss10
+Theano Modern Bold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Bold.ttf]:+clig;+liga;+tlig;+ss11
+Theano Modern Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Regular.ttf]:+clig;+liga;+tlig
+Theano Modern Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Regular.ttf]:+clig;+liga;+tlig;+onum
+Theano Modern Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Theano Modern Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Theano Modern Regular; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Regular.ttf]:+clig;+liga;+tlig;+ss08
+Theano Modern Regular; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Regular.ttf]:+clig;+liga;+tlig;+ss09
+Theano Modern Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Regular.ttf]:+clig;+liga;+tlig;+ss10
+Theano Modern Regular; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanomodern/TheanoModern-Regular.ttf]:+clig;+liga;+tlig;+ss11
+Theano Old Style Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Bold.ttf]:+clig;+liga;+tlig
+Theano Old Style Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Bold.ttf]:+clig;+liga;+tlig;+hist
+Theano Old Style Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Bold.ttf]:+clig;+liga;+tlig;+onum
+Theano Old Style Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Theano Old Style Bold; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Theano Old Style Bold; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Bold.ttf]:+clig;+liga;+tlig;+ss07
+Theano Old Style Bold; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Bold.ttf]:+clig;+liga;+tlig;+ss12
+Theano Old Style Bold; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Bold.ttf]:+clig;+liga;+tlig;+ss13
+Theano Old Style Bold; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Bold.ttf]:+clig;+liga;+tlig;+ss14
+Theano Old Style Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Regular.ttf]:+clig;+liga;+tlig
+Theano Old Style Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Regular.ttf]:+clig;+liga;+tlig;+hist
+Theano Old Style Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Regular.ttf]:+clig;+liga;+tlig;+onum
+Theano Old Style Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Theano Old Style Regular; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Theano Old Style Regular; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Regular.ttf]:+clig;+liga;+tlig;+ss07
+Theano Old Style Regular; Stylistic Set 12 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Regular.ttf]:+clig;+liga;+tlig;+ss12
+Theano Old Style Regular; Stylistic Set 13 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Regular.ttf]:+clig;+liga;+tlig;+ss13
+Theano Old Style Regular; Stylistic Set 14 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/theanooldstyle/TheanoOldStyle-Regular.ttf]:+clig;+liga;+tlig;+ss14
+Tiempos Text Medium [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Medium.otf]:+clig;+liga;+tlig
+Tiempos Text Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Medium.otf]:+clig;+liga;+tlig;+onum
+Tiempos Text Medium; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Medium.otf]:+clig;+liga;+tlig;+smcp
+Tiempos Text Medium Bold [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Bold.otf]:+clig;+liga;+tlig
+Tiempos Text Medium Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Bold.otf]:+clig;+liga;+tlig;+onum
+Tiempos Text Medium Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Bold.otf]:+clig;+liga;+tlig;+smcp
+Tiempos Text Medium Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-BoldItalic.otf]:+clig;+liga;+tlig
+Tiempos Text Medium Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Tiempos Text Medium Bold Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+Tiempos Text Medium Italic [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-MediumItalic.otf]:+clig;+liga;+tlig
+Tiempos Text Medium Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Tiempos Text Medium Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-MediumItalic.otf]:+clig;+liga;+tlig;+smcp
+Tiempos Text Regular [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Regular.otf]:+clig;+liga;+tlig
+Tiempos Text Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Regular.otf]:+clig;+liga;+tlig;+onum
+Tiempos Text Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Regular.otf]:+clig;+liga;+tlig;+smcp
+Tiempos Text Regular Bold [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Semibold.otf]:+clig;+liga;+tlig
+Tiempos Text Regular Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Semibold.otf]:+clig;+liga;+tlig;+onum
+Tiempos Text Regular Bold; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-Semibold.otf]:+clig;+liga;+tlig;+smcp
+Tiempos Text Regular Bold Italic [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-SemiboldItalic.otf]:+clig;+liga;+tlig
+Tiempos Text Regular Bold Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-SemiboldItalic.otf]:+clig;+liga;+tlig;+onum
+Tiempos Text Regular Bold Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-SemiboldItalic.otf]:+clig;+liga;+tlig;+smcp
+Tiempos Text Regular Italic [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-RegularItalic.otf]:+clig;+liga;+tlig
+Tiempos Text Regular Italic; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-RegularItalic.otf]:+clig;+liga;+tlig;+onum
+Tiempos Text Regular Italic; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/klim/tiempostext/TiemposText-RegularItalic.otf]:+clig;+liga;+tlig;+smcp
+Times Bold [/System/Library/Fonts/Times.ttc](1):+clig;+liga;+tlig
+Times Bold Italic [/System/Library/Fonts/Times.ttc](3):+clig;+liga;+tlig
+Times Italic [/System/Library/Fonts/Times.ttc](2):+clig;+liga;+tlig
+Times New Roman [/usr/local/texlive/texmf-local/fonts/truetype/tnr/times_0.ttf]:+clig;+liga;+tlig
+Times New Roman [/usr/local/texlive/texmf-local/fonts/truetype/tnr/times.ttf]:+clig;+liga;+tlig
+Times New Roman Bold [/usr/local/texlive/texmf-local/fonts/truetype/tnr/timesbd_0.ttf]:+clig;+liga;+tlig
+Times New Roman Bold [/usr/local/texlive/texmf-local/fonts/truetype/tnr/timesbd.ttf]:+clig;+liga;+tlig
+Times New Roman Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/tnr/timesbi.ttf]:+clig;+liga;+tlig
+Times New Roman Bold Italic [/usr/local/texlive/texmf-local/fonts/truetype/tnr/timesbi_0.ttf]:+clig;+liga;+tlig
+Times New Roman Italic [/usr/local/texlive/texmf-local/fonts/truetype/tnr/timesi.ttf]:+clig;+liga;+tlig
+Times New Roman Italic [/usr/local/texlive/texmf-local/fonts/truetype/tnr/timesi_0.ttf]:+clig;+liga;+tlig
+Times New Roman MT Extra Bold [/usr/local/texlive/texmf-local/fonts/truetype/tnr/Timnreb.ttf]:+clig;+liga;+tlig
+Times Roman [/System/Library/Fonts/Times.ttc](0):+clig;+liga;+tlig
+Tinos [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/tinos/Tinos-Regular.ttf]:+clig;+liga;+tlig
+Tinos Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/tinos/Tinos-Bold.ttf]:+clig;+liga;+tlig
+Tinos Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/tinos/Tinos-BoldItalic.ttf]:+clig;+liga;+tlig
+Tinos Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/google/tinos/Tinos-Italic.ttf]:+clig;+liga;+tlig
+Tlwg Mono [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgMono.otf]:+clig;+liga;+tlig
+Tlwg Mono Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgMono-Bold.otf]:+clig;+liga;+tlig
+Tlwg Mono Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgMono-BoldOblique.otf]:+clig;+liga;+tlig
+Tlwg Mono Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgMono-Oblique.otf]:+clig;+liga;+tlig
+Tlwg Typewriter [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypewriter.otf]:+clig;+liga;+tlig
+Tlwg Typewriter Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypewriter-Bold.otf]:+clig;+liga;+tlig
+Tlwg Typewriter Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypewriter-BoldOblique.otf]:+clig;+liga;+tlig
+Tlwg Typewriter Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypewriter-Oblique.otf]:+clig;+liga;+tlig
+Tlwg Typist [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypist.otf]:+clig;+liga;+tlig
+Tlwg Typist Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypist-Bold.otf]:+clig;+liga;+tlig
+Tlwg Typist Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypist-BoldOblique.otf]:+clig;+liga;+tlig
+Tlwg Typist Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypist-Oblique.otf]:+clig;+liga;+tlig
+Tlwg Typo [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypo.otf]:+clig;+liga;+tlig
+Tlwg Typo Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypo-Bold.otf]:+clig;+liga;+tlig
+Tlwg Typo Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypo-BoldOblique.otf]:+clig;+liga;+tlig
+Tlwg Typo Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/TlwgTypo-Oblique.otf]:+clig;+liga;+tlig
+Triodion Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/TriodionUnicode.otf]:+clig;+liga;+tlig
+Typicons [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/typicons/typicons.ttf]:+clig;+liga;+tlig
+UM Typewriter Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/umtypewriter/UMTypewriter-Oblique.otf]:+clig;+liga;+tlig
+UMTypewriter [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/umtypewriter/UMTypewriter-Regular.otf]:+clig;+liga;+tlig
+UMTypewriter-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/umtypewriter/UMTypewriter-Bold.otf]:+clig;+liga;+tlig
+UMTypewriter-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/umtypewriter/UMTypewriter-BoldItalic.otf]:+clig;+liga;+tlig
+UMTypewriter-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/umtypewriter/UMTypewriter-Italic.otf]:+clig;+liga;+tlig
+URWClassico-Bold [/usr/local/texlive/texmf-local/fonts/opentype/urw/classico/URWClassico-Bold.otf]:+clig;+liga;+tlig
+URWClassico-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/urw/classico/URWClassico-Bold.otf]:+clig;+liga;+tlig
+URWClassico-BoldItalic [/usr/local/texlive/texmf-local/fonts/opentype/urw/classico/URWClassico-BoldItalic.otf]:+clig;+liga;+tlig
+URWClassico-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/urw/classico/URWClassico-BoldItalic.otf]:+clig;+liga;+tlig
+URWClassico-Italic [/usr/local/texlive/texmf-local/fonts/opentype/urw/classico/URWClassico-Italic.otf]:+clig;+liga;+tlig
+URWClassico-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/urw/classico/URWClassico-Italic.otf]:+clig;+liga;+tlig
+URWClassico-Regular [/usr/local/texlive/texmf-local/fonts/opentype/urw/classico/URWClassico-Regular.otf]:+clig;+liga;+tlig
+URWClassico-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/urw/classico/URWClassico-Regular.otf]:+clig;+liga;+tlig
+Umpush [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Umpush.otf]:+clig;+liga;+tlig
+Umpush Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Umpush-Bold.otf]:+clig;+liga;+tlig
+Umpush Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Umpush-BoldOblique.otf]:+clig;+liga;+tlig
+Umpush Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Umpush-Light.otf]:+clig;+liga;+tlig
+Umpush Light Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Umpush-LightOblique.otf]:+clig;+liga;+tlig
+Umpush Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Umpush-Oblique.otf]:+clig;+liga;+tlig
+Un Batang [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnBatang.ttf]:+clig;+liga;+tlig
+Un Batang Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnBatangBold.ttf]:+clig;+liga;+tlig
+Un Dinaru [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnDinaru.ttf]:+clig;+liga;+tlig
+Un Dinaru Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnDinaruBold.ttf]:+clig;+liga;+tlig
+Un Dinaru Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnDinaruLight.ttf]:+clig;+liga;+tlig
+Un Dotum [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnDotum.ttf]:+clig;+liga;+tlig
+Un Dotum Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnDotumBold.ttf]:+clig;+liga;+tlig
+Un Graphic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnGraphic.ttf]:+clig;+liga;+tlig
+Un Graphic Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnGraphicBold.ttf]:+clig;+liga;+tlig
+Un Gungseo [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnGungseo.ttf]:+clig;+liga;+tlig
+Un Jamo Batang [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnJamoBatang.ttf]:+clig;+liga;+tlig
+Un Jamo Dotum [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnJamoDotum.ttf]:+clig;+liga;+tlig
+Un Jamo Novel [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnJamoNovel.ttf]:+clig;+liga;+tlig
+Un Jamo Sora [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnJamoSora.ttf]:+clig;+liga;+tlig
+Un Pen [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnPen.ttf]:+clig;+liga;+tlig
+Un Penheulim [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnPenheulim.ttf]:+clig;+liga;+tlig
+Un Pilgi [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnPilgi.ttf]:+clig;+liga;+tlig
+Un Pilgi Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-core/UnPilgiBold.ttf]:+clig;+liga;+tlig
+Un Pilgia [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnPilgia.ttf]:+clig;+liga;+tlig
+Un Shinmun [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnShinmun.ttf]:+clig;+liga;+tlig
+Un Taza [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnTaza.ttf]:+clig;+liga;+tlig
+Un Vada [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnVada.ttf]:+clig;+liga;+tlig
+Un Yetgul [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/unfonts-extra/UnYetgul.ttf]:+clig;+liga;+tlig
+UniversalisADFStd-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-Bold.otf]:+clig;+liga;+tlig
+UniversalisADFStd-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-Bold.otf]:+clig;+liga;+tlig;+hist
+UniversalisADFStd-BoldCond [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-BoldCond.otf]:+clig;+liga;+tlig
+UniversalisADFStd-BoldCond; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-BoldCond.otf]:+clig;+liga;+tlig;+hist
+UniversalisADFStd-BoldCondIt [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-BoldCondIt.otf]:+clig;+liga;+tlig
+UniversalisADFStd-BoldCondIt; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-BoldCondIt.otf]:+clig;+liga;+tlig;+hist
+UniversalisADFStd-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-BoldItalic.otf]:+clig;+liga;+tlig
+UniversalisADFStd-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+UniversalisADFStd-Cond [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-Cond.otf]:+clig;+liga;+tlig
+UniversalisADFStd-Cond; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-Cond.otf]:+clig;+liga;+tlig;+hist
+UniversalisADFStd-CondItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-CondItalic.otf]:+clig;+liga;+tlig
+UniversalisADFStd-CondItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-CondItalic.otf]:+clig;+liga;+tlig;+hist
+UniversalisADFStd-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-Italic.otf]:+clig;+liga;+tlig
+UniversalisADFStd-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-Italic.otf]:+clig;+liga;+tlig;+hist
+UniversalisADFStd-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-Regular.otf]:+clig;+liga;+tlig
+UniversalisADFStd-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/arkandis/universalis/UniversalisADFStd-Regular.otf]:+clig;+liga;+tlig;+hist
+Veles-Bold [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Veles/Veles-Bold.0.9.2.otf]:+clig;+liga;+tlig
+Veles-Regular [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Veles/Veles-Regular.0.9.2.otf]:+clig;+liga;+tlig
+VenturisADF-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADF-Bold.otf]:+clig;+liga;+tlig
+VenturisADF-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADF-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisADF-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADF-Italic.otf]:+clig;+liga;+tlig
+VenturisADF-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADF-Regular.otf]:+clig;+liga;+tlig
+VenturisADF-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADF-Regular.otf]:+clig;+liga;+tlig;+ss01
+VenturisADFCd-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCd-Bold.otf]:+clig;+liga;+tlig
+VenturisADFCd-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCd-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisADFCd-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCd-Italic.otf]:+clig;+liga;+tlig
+VenturisADFCd-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCd-Regular.otf]:+clig;+liga;+tlig
+VenturisADFCdStyle-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCdStyle-Bold.otf]:+clig;+liga;+tlig
+VenturisADFCdStyle-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCdStyle-Bold.otf]:+clig;+liga;+tlig;+ss02
+VenturisADFCdStyle-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCdStyle-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisADFCdStyle-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCdStyle-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+VenturisADFCdStyle-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCdStyle-Italic.otf]:+clig;+liga;+tlig
+VenturisADFCdStyle-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCdStyle-Italic.otf]:+clig;+liga;+tlig;+ss02
+VenturisADFCdStyle-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCdStyle-Regular.otf]:+clig;+liga;+tlig
+VenturisADFCdStyle-Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFCdStyle-Regular.otf]:+clig;+liga;+tlig;+ss02
+VenturisADFGothTitling [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFGothTitling.otf]:+clig;+liga;+tlig
+VenturisADFHeavy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFHeavy.otf]:+clig;+liga;+tlig
+VenturisADFHeavy-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFHeavy-Italic.otf]:+clig;+liga;+tlig
+VenturisADFNo2-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2-Bold.otf]:+clig;+liga;+tlig
+VenturisADFNo2-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisADFNo2-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2-Italic.otf]:+clig;+liga;+tlig
+VenturisADFNo2-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2-Regular.otf]:+clig;+liga;+tlig
+VenturisADFNo2Cd-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2Cd-Bold.otf]:+clig;+liga;+tlig
+VenturisADFNo2Cd-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2Cd-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisADFNo2Cd-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2Cd-Italic.otf]:+clig;+liga;+tlig
+VenturisADFNo2Cd-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2Cd-Regular.otf]:+clig;+liga;+tlig
+VenturisADFNo2Med-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2Med-Bold.otf]:+clig;+liga;+tlig
+VenturisADFNo2Med-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2Med-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisADFNo2Med-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2Med-Italic.otf]:+clig;+liga;+tlig
+VenturisADFNo2Med-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFNo2Med-Regular.otf]:+clig;+liga;+tlig
+VenturisADFStyle-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFStyle-Bold.otf]:+clig;+liga;+tlig
+VenturisADFStyle-Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFStyle-Bold.otf]:+clig;+liga;+tlig;+ss02
+VenturisADFStyle-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFStyle-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisADFStyle-BoldItalic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFStyle-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+VenturisADFStyle-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFStyle-Italic.otf]:+clig;+liga;+tlig
+VenturisADFStyle-Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFStyle-Italic.otf]:+clig;+liga;+tlig;+ss02
+VenturisADFStyle-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFStyle-Regular.otf]:+clig;+liga;+tlig
+VenturisADFStyle-Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFStyle-Regular.otf]:+clig;+liga;+tlig;+ss01
+VenturisADFTitlingNo1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFTitlingNo1.otf]:+clig;+liga;+tlig
+VenturisADFTitlingNo2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFTitlingNo2.otf]:+clig;+liga;+tlig
+VenturisADFTitlingNo3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFTitlingNo3.otf]:+clig;+liga;+tlig
+VenturisADFTitlingNo4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisADFTitlingNo4.otf]:+clig;+liga;+tlig
+VenturisOldADF-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisOldADF-Bold.otf]:+clig;+liga;+tlig
+VenturisOldADF-Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisOldADF-Bold.otf]:+clig;+liga;+tlig;+hist
+VenturisOldADF-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisOldADF-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisOldADF-BoldItalic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisOldADF-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+VenturisOldADF-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisOldADF-Italic.otf]:+clig;+liga;+tlig
+VenturisOldADF-Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisOldADF-Italic.otf]:+clig;+liga;+tlig;+hist
+VenturisOldADF-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisOldADF-Regular.otf]:+clig;+liga;+tlig
+VenturisOldADF-Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisOldADF-Regular.otf]:+clig;+liga;+tlig;+hist
+VenturisSansADF-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADF-Bold.otf]:+clig;+liga;+tlig
+VenturisSansADF-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADF-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisSansADF-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADF-Italic.otf]:+clig;+liga;+tlig
+VenturisSansADF-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADF-Regular.otf]:+clig;+liga;+tlig
+VenturisSansADFCd-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFCd-Bold.otf]:+clig;+liga;+tlig
+VenturisSansADFCd-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFCd-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisSansADFCd-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFCd-Italic.otf]:+clig;+liga;+tlig
+VenturisSansADFCd-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFCd-Regular.otf]:+clig;+liga;+tlig
+VenturisSansADFEx-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFEx-Bold.otf]:+clig;+liga;+tlig
+VenturisSansADFEx-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFEx-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisSansADFEx-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFEx-Italic.otf]:+clig;+liga;+tlig
+VenturisSansADFEx-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFEx-Regular.otf]:+clig;+liga;+tlig
+VenturisSansADFHeavy [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFHeavy.otf]:+clig;+liga;+tlig
+VenturisSansADFHeavy-Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFHeavy-Oblique.otf]:+clig;+liga;+tlig
+VenturisSansADFLt-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFLt-Bold.otf]:+clig;+liga;+tlig
+VenturisSansADFLt-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFLt-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisSansADFLt-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFLt-Italic.otf]:+clig;+liga;+tlig
+VenturisSansADFLt-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFLt-Regular.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2-Bold.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2-BoldItalic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2-BoldItalic.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2-Italic.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2-Regular.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2Cd-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2Cd-Bold.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2Cd-BoldItal [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2Cd-BoldItal.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2Cd-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2Cd-Italic.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2Cd-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2Cd-Regular.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2Ex-Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2Ex-Bold.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2Ex-BoldItal [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2Ex-BoldItal.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2Ex-Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2Ex-Italic.otf]:+clig;+liga;+tlig
+VenturisSansADFNo2Ex-Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/venturisadf/VenturisSansADFNo2Ex-Regular.otf]:+clig;+liga;+tlig
+Vernyhora-Black [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Vernyhora/Vernyhora-Black.2.4.1.otf]:+clig;+liga;+tlig
+Vernyhora-Black [/usr/local/texlive/texmf-local/fonts/truetype/Hdal/Vernyhora/Vernyhora-Black.2.4.1.ttf]:+clig;+liga;+tlig
+Vernyhora-Bold [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Vernyhora/Vernyhora-Bold.2.4.1.otf]:+clig;+liga;+tlig
+Vernyhora-Bold [/usr/local/texlive/texmf-local/fonts/truetype/Hdal/Vernyhora/Vernyhora-Bold.2.4.1.ttf]:+clig;+liga;+tlig
+Vernyhora-ExtraBold [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Vernyhora/Vernyhora-ExtraBold.2.4.1.otf]:+clig;+liga;+tlig
+Vernyhora-ExtraBold [/usr/local/texlive/texmf-local/fonts/truetype/Hdal/Vernyhora/Vernyhora-ExtraBold.2.4.1.ttf]:+clig;+liga;+tlig
+Vernyhora-Light [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Vernyhora/Vernyhora-Light.2.4.1.otf]:+clig;+liga;+tlig
+Vernyhora-Light [/usr/local/texlive/texmf-local/fonts/truetype/Hdal/Vernyhora/Vernyhora-Light.2.4.1.ttf]:+clig;+liga;+tlig
+Vernyhora-Medium [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Vernyhora/Vernyhora-Medium.2.4.1.otf]:+clig;+liga;+tlig
+Vernyhora-Medium [/usr/local/texlive/texmf-local/fonts/truetype/Hdal/Vernyhora/Vernyhora-Medium.2.4.1.ttf]:+clig;+liga;+tlig
+Vernyhora-Regular [/usr/local/texlive/texmf-local/fonts/opentype/Hdal/Vernyhora/Vernyhora-Regular.2.4.1.otf]:+clig;+liga;+tlig
+Vernyhora-Regular [/usr/local/texlive/texmf-local/fonts/truetype/Hdal/Vernyhora/Vernyhora-Regular.2.4.1.ttf]:+clig;+liga;+tlig
+Version 0.43 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/yfonts-otf/yswab.otf]:+clig;+liga;+tlig
+Version 0.43; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/yfonts-otf/yswab.otf]:+clig;+liga;+tlig;+ss11
+Vertograd Unicode [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/VertogradUnicode.otf]:+clig;+liga;+tlig
+Vilnius [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Vilnius-Regular.otf]:+clig;+liga;+tlig
+Vilnius; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Vilnius-Regular.otf]:+clig;+liga;+tlig;+ss10
+Vinnytsia City Regular [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig
+Vinnytsia City Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss01
+Vinnytsia City Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss02
+Vinnytsia City Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss03
+Vinnytsia City Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss04
+Vinnytsia City Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss05
+Vinnytsia City Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss06
+Vinnytsia City Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss07
+Vinnytsia City Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss08
+Vinnytsia City Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss09
+Vinnytsia City Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss10
+Vinnytsia City Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss11
+Vinnytsia City Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss12
+Vinnytsia City Regular; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss13
+Vinnytsia City Regular; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaCity.otf]:+clig;+liga;+tlig;+ss14
+Vinnytsia City Regular [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig
+Vinnytsia City Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss01
+Vinnytsia City Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss02
+Vinnytsia City Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss03
+Vinnytsia City Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss04
+Vinnytsia City Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss05
+Vinnytsia City Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss06
+Vinnytsia City Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss07
+Vinnytsia City Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss08
+Vinnytsia City Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss09
+Vinnytsia City Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss10
+Vinnytsia City Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss11
+Vinnytsia City Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss12
+Vinnytsia City Regular; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss13
+Vinnytsia City Regular; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaCity.ttf]:+clig;+liga;+tlig;+ss14
+Vinnytsia Sans Bold [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansBold.otf]:+clig;+liga;+tlig
+Vinnytsia Sans Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansBold.otf]:+clig;+liga;+tlig;+onum
+Vinnytsia Sans Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansBold.otf]:+clig;+liga;+tlig;+ss01
+Vinnytsia Sans Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansBold.otf]:+clig;+liga;+tlig;+ss02
+Vinnytsia Sans Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansBold.otf]:+clig;+liga;+tlig;+ss03
+Vinnytsia Sans Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansBold.otf]:+clig;+liga;+tlig;+ss04
+Vinnytsia Sans Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansBold.otf]:+clig;+liga;+tlig;+ss05
+Vinnytsia Sans Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansBold.otf]:+clig;+liga;+tlig;+ss06
+Vinnytsia Sans Bold [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansBold.ttf]:+clig;+liga;+tlig
+Vinnytsia Sans Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansBold.ttf]:+clig;+liga;+tlig;+onum
+Vinnytsia Sans Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansBold.ttf]:+clig;+liga;+tlig;+ss01
+Vinnytsia Sans Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansBold.ttf]:+clig;+liga;+tlig;+ss02
+Vinnytsia Sans Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansBold.ttf]:+clig;+liga;+tlig;+ss03
+Vinnytsia Sans Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansBold.ttf]:+clig;+liga;+tlig;+ss04
+Vinnytsia Sans Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansBold.ttf]:+clig;+liga;+tlig;+ss05
+Vinnytsia Sans Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansBold.ttf]:+clig;+liga;+tlig;+ss06
+Vinnytsia Sans Regular [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansReg.otf]:+clig;+liga;+tlig
+Vinnytsia Sans Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansReg.otf]:+clig;+liga;+tlig;+onum
+Vinnytsia Sans Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansReg.otf]:+clig;+liga;+tlig;+ss01
+Vinnytsia Sans Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansReg.otf]:+clig;+liga;+tlig;+ss02
+Vinnytsia Sans Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansReg.otf]:+clig;+liga;+tlig;+ss03
+Vinnytsia Sans Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansReg.otf]:+clig;+liga;+tlig;+ss04
+Vinnytsia Sans Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansReg.otf]:+clig;+liga;+tlig;+ss05
+Vinnytsia Sans Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSansReg.otf]:+clig;+liga;+tlig;+ss06
+Vinnytsia Sans Regular [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansReg.ttf]:+clig;+liga;+tlig
+Vinnytsia Sans Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansReg.ttf]:+clig;+liga;+tlig;+onum
+Vinnytsia Sans Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansReg.ttf]:+clig;+liga;+tlig;+ss01
+Vinnytsia Sans Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansReg.ttf]:+clig;+liga;+tlig;+ss02
+Vinnytsia Sans Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansReg.ttf]:+clig;+liga;+tlig;+ss03
+Vinnytsia Sans Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansReg.ttf]:+clig;+liga;+tlig;+ss04
+Vinnytsia Sans Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansReg.ttf]:+clig;+liga;+tlig;+ss05
+Vinnytsia Sans Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSansReg.ttf]:+clig;+liga;+tlig;+ss06
+Vinnytsia Serif Regular [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSerif.otf]:+clig;+liga;+tlig
+Vinnytsia Serif Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSerif.otf]:+clig;+liga;+tlig;+onum
+Vinnytsia Serif Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSerif.otf]:+clig;+liga;+tlig;+ss01
+Vinnytsia Serif Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSerif.otf]:+clig;+liga;+tlig;+ss02
+Vinnytsia Serif Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSerif.otf]:+clig;+liga;+tlig;+ss03
+Vinnytsia Serif Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSerif.otf]:+clig;+liga;+tlig;+ss04
+Vinnytsia Serif Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSerif.otf]:+clig;+liga;+tlig;+ss05
+Vinnytsia Serif Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/Vinnitsia/VinnytsiaSerif.otf]:+clig;+liga;+tlig;+ss06
+Vinnytsia Serif Regular [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSerif.ttf]:+clig;+liga;+tlig
+Vinnytsia Serif Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSerif.ttf]:+clig;+liga;+tlig;+onum
+Vinnytsia Serif Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSerif.ttf]:+clig;+liga;+tlig;+ss01
+Vinnytsia Serif Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSerif.ttf]:+clig;+liga;+tlig;+ss02
+Vinnytsia Serif Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSerif.ttf]:+clig;+liga;+tlig;+ss03
+Vinnytsia Serif Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSerif.ttf]:+clig;+liga;+tlig;+ss04
+Vinnytsia Serif Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSerif.ttf]:+clig;+liga;+tlig;+ss05
+Vinnytsia Serif Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/truetype/DR/Vinnitsia/VinnytsiaSerif.ttf]:+clig;+liga;+tlig;+ss06
+Voskresensky [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-churchslavonic/Voskresensky-Regular.otf]:+clig;+liga;+tlig
+WalcottGothicSunset [/usr/local/texlive/texmf-local/fonts/truetype/Jukebox/WALCGS__.ttf]:+clig;+liga;+tlig
+Warbler Banner v1 Italic [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerBannerV1-Italic.otf]:+clig;+liga;+tlig
+Warbler Banner v1 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerBannerV1-Italic.otf]:+clig;+liga;+tlig;+ss01
+Warbler Banner v1 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerBannerV1-Italic.otf]:+clig;+liga;+tlig;+ss02
+Warbler Banner v1 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerBanner/WarblerBannerV1-Regular.otf]:+clig;+liga;+tlig
+Warbler Banner v1 Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerBanner/WarblerBannerV1-Regular.otf]:+clig;+liga;+tlig;+onum
+Warbler Banner v1 Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerBanner/WarblerBannerV1-Regular.ttf]:+clig;+liga;+tlig
+Warbler Banner v1 Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerBanner/WarblerBannerV1-Regular.ttf]:+clig;+liga;+tlig;+onum
+Warbler Deck v1 Italic [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerDeckV1-Italic.otf]:+clig;+liga;+tlig
+Warbler Deck v1 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerDeckV1-Italic.otf]:+clig;+liga;+tlig;+ss01
+Warbler Deck v1 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerDeckV1-Italic.otf]:+clig;+liga;+tlig;+ss02
+Warbler Deck v1 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerBanner/WarblerDeckV1-Regular.otf]:+clig;+liga;+tlig
+Warbler Deck v1 Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerBanner/WarblerDeckV1-Regular.otf]:+clig;+liga;+tlig;+onum
+Warbler Deck v1 Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerBanner/WarblerDeckV1-Regular.ttf]:+clig;+liga;+tlig
+Warbler Deck v1 Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerBanner/WarblerDeckV1-Regular.ttf]:+clig;+liga;+tlig;+onum
+Warbler Display v1 Italic [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerDisplayV1-Italic.otf]:+clig;+liga;+tlig
+Warbler Display v1 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerDisplayV1-Italic.otf]:+clig;+liga;+tlig;+ss01
+Warbler Display v1 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerDisplayV1-Italic.otf]:+clig;+liga;+tlig;+ss02
+Warbler Display v1 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerBanner/WarblerDisplayV1-Regular.otf]:+clig;+liga;+tlig
+Warbler Display v1 Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerBanner/WarblerDisplayV1-Regular.otf]:+clig;+liga;+tlig;+onum
+Warbler Display v1 Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerBanner/WarblerDisplayV1-Regular.ttf]:+clig;+liga;+tlig
+Warbler Display v1 Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerBanner/WarblerDisplayV1-Regular.ttf]:+clig;+liga;+tlig;+onum
+Warbler Text Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-Bold.otf]:+clig;+liga;+tlig
+Warbler Text Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-Bold.otf]:+clig;+liga;+tlig;+onum
+Warbler Text ExtraBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-ExtraBold.otf]:+clig;+liga;+tlig
+Warbler Text ExtraBold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Warbler Text Italic [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-Italic.otf]:+clig;+liga;+tlig
+Warbler Text Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-Italic.otf]:+clig;+liga;+tlig;+ss01
+Warbler Text Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-Italic.otf]:+clig;+liga;+tlig;+ss02
+Warbler Text Italic [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerText/WarblerText-Italic.ttf]:+clig;+liga;+tlig
+Warbler Text Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerText/WarblerText-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Warbler Text Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerText/WarblerText-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Warbler Text Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-Regular.otf]:+clig;+liga;+tlig
+Warbler Text Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-Regular.otf]:+clig;+liga;+tlig;+onum
+Warbler Text Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-Regular.otf]:+clig;+liga;+tlig;+smcp
+Warbler Text Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerText/WarblerText-Regular.ttf]:+clig;+liga;+tlig
+Warbler Text Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerText/WarblerText-Regular.ttf]:+clig;+liga;+tlig;+onum
+Warbler Text Regular; Small Capitals [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerText/WarblerText-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Warbler Text SemiBold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-SemiBold.otf]:+clig;+liga;+tlig
+Warbler Text SemiBold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerText/WarblerText-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Warbler Text v1 Italic [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerTextV1-Italic.otf]:+clig;+liga;+tlig
+Warbler Text v1 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerTextV1-Italic.otf]:+clig;+liga;+tlig;+ss01
+Warbler Text v1 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/WarblerBannerItalic/WarblerTextV1-Italic.otf]:+clig;+liga;+tlig;+ss02
+Warbler Text v1 Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerBanner/WarblerTextV1-Regular.otf]:+clig;+liga;+tlig
+Warbler Text v1 Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DJR/WarblerBanner/WarblerTextV1-Regular.otf]:+clig;+liga;+tlig;+onum
+Warbler Text v1 Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerBanner/WarblerTextV1-Regular.ttf]:+clig;+liga;+tlig
+Warbler Text v1 Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerBanner/WarblerTextV1-Regular.ttf]:+clig;+liga;+tlig;+onum
+Warbler Variable v1 Italic [/usr/local/texlive/texmf-local/fonts/truetype/WarblerBannerItalic/WarblerVariableV1-Italic_opsz_.ttf]:+clig;+liga;+tlig
+Warbler Variable v1 Italic; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/WarblerBannerItalic/WarblerVariableV1-Italic_opsz_.ttf]:+clig;+liga;+tlig;+ss01
+Warbler Variable v1 Italic; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/WarblerBannerItalic/WarblerVariableV1-Italic_opsz_.ttf]:+clig;+liga;+tlig;+ss02
+Warbler Variable v1 Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerBanner/WarblerVariableV1-VF.ttf]:+clig;+liga;+tlig
+Warbler Variable v1 Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/truetype/DJR/WarblerBanner/WarblerVariableV1-VF.ttf]:+clig;+liga;+tlig;+onum
+Waree [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Waree.otf]:+clig;+liga;+tlig
+Waree Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Waree-Bold.otf]:+clig;+liga;+tlig
+Waree Bold Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Waree-BoldOblique.otf]:+clig;+liga;+tlig
+Waree Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fonts-tlwg/Waree-Oblique.otf]:+clig;+liga;+tlig
+XCharter Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Bold.otf]:+clig;+liga;+tlig
+XCharter Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Bold.otf]:+clig;+liga;+tlig;+onum
+XCharter Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Bold.otf]:+clig;+liga;+tlig;+smcp
+XCharter Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Bold.otf]:+clig;+liga;+tlig;+ss01
+XCharter Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-BoldItalic.otf]:+clig;+liga;+tlig
+XCharter Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+XCharter Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+XCharter Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+XCharter Bold Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-BoldSlanted.otf]:+clig;+liga;+tlig
+XCharter Bold Slanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-BoldSlanted.otf]:+clig;+liga;+tlig;+onum
+XCharter Bold Slanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-BoldSlanted.otf]:+clig;+liga;+tlig;+smcp
+XCharter Bold Slanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-BoldSlanted.otf]:+clig;+liga;+tlig;+ss01
+XCharter Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Italic.otf]:+clig;+liga;+tlig
+XCharter Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Italic.otf]:+clig;+liga;+tlig;+onum
+XCharter Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Italic.otf]:+clig;+liga;+tlig;+smcp
+XCharter Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Italic.otf]:+clig;+liga;+tlig;+ss01
+XCharter Italic; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Italic.otf]:+clig;+liga;+tlig;+ss05
+XCharter Math [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter-math/XCharter-Math.otf]:+clig;+liga;+tlig
+XCharter Math; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter-math/XCharter-Math.otf]:+clig;+liga;+tlig;+onum
+XCharter Math; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter-math/XCharter-Math.otf]:+clig;+liga;+tlig;+ss06
+XCharter Math; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter-math/XCharter-Math.otf]:+clig;+liga;+tlig;+ssty
+XCharter Math Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter-math/XCharter-Math-Bold.otf]:+clig;+liga;+tlig
+XCharter Math Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter-math/XCharter-Math-Bold.otf]:+clig;+liga;+tlig;+onum
+XCharter Math Bold; Math Script Style Alternates [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter-math/XCharter-Math-Bold.otf]:+clig;+liga;+tlig;+ssty
+XCharter Roman [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Roman.otf]:+clig;+liga;+tlig
+XCharter Roman; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Roman.otf]:+clig;+liga;+tlig;+onum
+XCharter Roman; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Roman.otf]:+clig;+liga;+tlig;+smcp
+XCharter Roman; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Roman.otf]:+clig;+liga;+tlig;+ss01
+XCharter Roman; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Roman.otf]:+clig;+liga;+tlig;+ss02
+XCharter Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Slanted.otf]:+clig;+liga;+tlig
+XCharter Slanted; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Slanted.otf]:+clig;+liga;+tlig;+onum
+XCharter Slanted; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Slanted.otf]:+clig;+liga;+tlig;+smcp
+XCharter Slanted; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xcharter/XCharter-Slanted.otf]:+clig;+liga;+tlig;+ss01
+XITS [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-Regular.otf]:+clig;+liga;+tlig
+XITS; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-Regular.otf]:+clig;+liga;+tlig;+onum
+XITS; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-Regular.otf]:+clig;+liga;+tlig;+smcp
+XITS; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-Regular.otf]:+clig;+liga;+tlig;+ss11
+XITS Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-Bold.otf]:+clig;+liga;+tlig
+XITS Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-Bold.otf]:+clig;+liga;+tlig;+onum
+XITS Bold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-Bold.otf]:+clig;+liga;+tlig;+ss11
+XITS Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-BoldItalic.otf]:+clig;+liga;+tlig
+XITS Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+XITS Bold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-BoldItalic.otf]:+clig;+liga;+tlig;+ss11
+XITS Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-Italic.otf]:+clig;+liga;+tlig
+XITS Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-Italic.otf]:+clig;+liga;+tlig;+onum
+XITS Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITS-Italic.otf]:+clig;+liga;+tlig;+ss11
+XITS Math [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig
+XITS Math; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig;+ss01
+XITS Math; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig;+ss02
+XITS Math; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig;+ss03
+XITS Math; Stylistic Set 4 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig;+ss04
+XITS Math; Stylistic Set 5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig;+ss05
+XITS Math; Stylistic Set 6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig;+ss06
+XITS Math; Stylistic Set 7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig;+ss07
+XITS Math; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig;+ss08
+XITS Math; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig;+ss09
+XITS Math; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Regular.otf]:+clig;+liga;+tlig;+ss10
+XITS Math Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Bold.otf]:+clig;+liga;+tlig
+XITS Math Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Bold.otf]:+clig;+liga;+tlig;+ss01
+XITS Math Bold; Stylistic Set 8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/xits/XITSMath-Bold.otf]:+clig;+liga;+tlig;+ss08
+Yannis Fraktur Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/yfonts-otf/yfrak.otf]:+clig;+liga;+tlig
+Yannis Fraktur Regular; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/yfonts-otf/yfrak.otf]:+clig;+liga;+tlig;+ss11
+Yannis Gotisch Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/yfonts-otf/ygoth.otf]:+clig;+liga;+tlig
+Yannis Gotisch Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/yfonts-otf/ygoth.otf]:+clig;+liga;+tlig;+ss01
+Yannis Gotisch Regular; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/yfonts-otf/ygoth.otf]:+clig;+liga;+tlig;+ss11
+Yinit [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/yinit-otf/Yinit.otf]:+clig;+liga;+tlig
+Ysabeau Black [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Black.otf]:+clig;+liga;+tlig
+Ysabeau Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Black.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Black.otf]:+clig;+liga;+tlig;+smcp
+Ysabeau Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Black.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Black.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Black.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Black; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Black.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Black; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Black.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Black; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Black.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Black [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Black.ttf]:+clig;+liga;+tlig
+Ysabeau Black; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Black.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Black; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Black.ttf]:+clig;+liga;+tlig;+smcp
+Ysabeau Black; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Black.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Black; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Black.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Black; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Black.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Black; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Black.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Black; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Black.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Black; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Black.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BlackItalic.otf]:+clig;+liga;+tlig
+Ysabeau Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BlackItalic.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BlackItalic.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BlackItalic.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BlackItalic.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Black Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BlackItalic.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Black Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BlackItalic.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Black Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BlackItalic.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Black Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BlackItalic.otf]:+clig;+liga;+tlig;+swsh
+Ysabeau Black Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BlackItalic.ttf]:+clig;+liga;+tlig
+Ysabeau Black Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BlackItalic.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Black Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BlackItalic.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Black Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BlackItalic.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Black Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BlackItalic.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Black Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BlackItalic.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Black Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BlackItalic.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Black Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BlackItalic.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Black Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BlackItalic.ttf]:+clig;+liga;+tlig;+swsh
+Ysabeau Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Bold.otf]:+clig;+liga;+tlig
+Ysabeau Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Bold.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Bold.otf]:+clig;+liga;+tlig;+smcp
+Ysabeau Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Bold.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Bold.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Bold.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Bold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Bold.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Bold.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Bold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Bold.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Bold.ttf]:+clig;+liga;+tlig
+Ysabeau Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Bold.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Bold.ttf]:+clig;+liga;+tlig;+smcp
+Ysabeau Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Bold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Bold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Bold.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Bold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Bold.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Bold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Bold.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BoldItalic.otf]:+clig;+liga;+tlig
+Ysabeau Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Bold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Bold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Bold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Ysabeau Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BoldItalic.ttf]:+clig;+liga;+tlig
+Ysabeau Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Bold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Bold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Bold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BoldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Bold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-BoldItalic.ttf]:+clig;+liga;+tlig;+swsh
+Ysabeau ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBold.otf]:+clig;+liga;+tlig
+Ysabeau ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBold.otf]:+clig;+liga;+tlig;+onum
+Ysabeau ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBold.otf]:+clig;+liga;+tlig;+smcp
+Ysabeau ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBold.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBold.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBold.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau ExtraBold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBold.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau ExtraBold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBold.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau ExtraBold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBold.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau ExtraBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBold.ttf]:+clig;+liga;+tlig
+Ysabeau ExtraBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBold.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau ExtraBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBold.ttf]:+clig;+liga;+tlig;+smcp
+Ysabeau ExtraBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBold.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau ExtraBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBold.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau ExtraBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBold.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau ExtraBold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBold.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau ExtraBold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBold.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau ExtraBold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBold.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBoldItalic.otf]:+clig;+liga;+tlig
+Ysabeau ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Ysabeau ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau ExtraBold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau ExtraBold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau ExtraBold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau ExtraBold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Ysabeau ExtraBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBoldItalic.ttf]:+clig;+liga;+tlig
+Ysabeau ExtraBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau ExtraBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau ExtraBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau ExtraBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau ExtraBold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau ExtraBold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau ExtraBold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau ExtraBold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraBoldItalic.ttf]:+clig;+liga;+tlig;+swsh
+Ysabeau ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLight.otf]:+clig;+liga;+tlig
+Ysabeau ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLight.otf]:+clig;+liga;+tlig;+onum
+Ysabeau ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLight.otf]:+clig;+liga;+tlig;+smcp
+Ysabeau ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLight.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLight.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLight.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau ExtraLight; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLight.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau ExtraLight; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLight.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau ExtraLight; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLight.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau ExtraLight [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLight.ttf]:+clig;+liga;+tlig
+Ysabeau ExtraLight; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLight.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau ExtraLight; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLight.ttf]:+clig;+liga;+tlig;+smcp
+Ysabeau ExtraLight; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLight.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau ExtraLight; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLight.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau ExtraLight; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLight.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau ExtraLight; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLight.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau ExtraLight; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLight.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau ExtraLight; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLight.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLightItalic.otf]:+clig;+liga;+tlig
+Ysabeau ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLightItalic.otf]:+clig;+liga;+tlig;+onum
+Ysabeau ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau ExtraLight Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau ExtraLight Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau ExtraLight Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLightItalic.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau ExtraLight Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ExtraLightItalic.otf]:+clig;+liga;+tlig;+swsh
+Ysabeau ExtraLight Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLightItalic.ttf]:+clig;+liga;+tlig
+Ysabeau ExtraLight Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau ExtraLight Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau ExtraLight Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau ExtraLight Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau ExtraLight Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau ExtraLight Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau ExtraLight Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau ExtraLight Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ExtraLightItalic.ttf]:+clig;+liga;+tlig;+swsh
+Ysabeau Hairline [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Hairline.otf]:+clig;+liga;+tlig
+Ysabeau Hairline; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Hairline.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Hairline; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Hairline.otf]:+clig;+liga;+tlig;+smcp
+Ysabeau Hairline; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Hairline.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Hairline; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Hairline.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Hairline; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Hairline.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Hairline; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Hairline.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Hairline; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Hairline.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Hairline; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Hairline.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Hairline [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Hairline.ttf]:+clig;+liga;+tlig
+Ysabeau Hairline; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Hairline.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Hairline; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Hairline.ttf]:+clig;+liga;+tlig;+smcp
+Ysabeau Hairline; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Hairline.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Hairline; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Hairline.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Hairline; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Hairline.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Hairline; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Hairline.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Hairline; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Hairline.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Hairline; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Hairline.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Hairline Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-HairlineItalic.otf]:+clig;+liga;+tlig
+Ysabeau Hairline Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-HairlineItalic.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Hairline Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-HairlineItalic.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Hairline Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-HairlineItalic.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Hairline Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-HairlineItalic.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Hairline Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-HairlineItalic.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Hairline Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-HairlineItalic.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Hairline Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-HairlineItalic.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Hairline Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-HairlineItalic.otf]:+clig;+liga;+tlig;+swsh
+Ysabeau Hairline Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-HairlineItalic.ttf]:+clig;+liga;+tlig
+Ysabeau Hairline Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-HairlineItalic.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Hairline Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-HairlineItalic.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Hairline Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-HairlineItalic.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Hairline Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-HairlineItalic.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Hairline Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-HairlineItalic.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Hairline Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-HairlineItalic.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Hairline Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-HairlineItalic.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Hairline Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-HairlineItalic.ttf]:+clig;+liga;+tlig;+swsh
+Ysabeau Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Italic.otf]:+clig;+liga;+tlig
+Ysabeau Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Italic.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Italic.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Italic.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Italic.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Italic.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Italic.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Italic.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Italic.otf]:+clig;+liga;+tlig;+swsh
+Ysabeau Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Italic.ttf]:+clig;+liga;+tlig
+Ysabeau Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Italic.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Italic.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Italic.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Italic.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Italic.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Italic.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Italic.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Italic.ttf]:+clig;+liga;+tlig;+swsh
+Ysabeau Light [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Light.otf]:+clig;+liga;+tlig
+Ysabeau Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Light.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Light.otf]:+clig;+liga;+tlig;+smcp
+Ysabeau Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Light.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Light.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Light.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Light; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Light.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Light; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Light.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Light; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Light.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Light [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Light.ttf]:+clig;+liga;+tlig
+Ysabeau Light; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Light.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Light; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Light.ttf]:+clig;+liga;+tlig;+smcp
+Ysabeau Light; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Light.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Light; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Light.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Light; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Light.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Light; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Light.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Light; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Light.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Light; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Light.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-LightItalic.otf]:+clig;+liga;+tlig
+Ysabeau Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-LightItalic.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-LightItalic.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-LightItalic.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-LightItalic.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Light Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-LightItalic.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Light Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-LightItalic.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Light Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-LightItalic.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Light Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-LightItalic.otf]:+clig;+liga;+tlig;+swsh
+Ysabeau Light Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-LightItalic.ttf]:+clig;+liga;+tlig
+Ysabeau Light Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-LightItalic.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Light Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-LightItalic.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Light Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-LightItalic.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Light Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-LightItalic.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Light Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-LightItalic.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Light Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-LightItalic.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Light Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-LightItalic.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Light Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-LightItalic.ttf]:+clig;+liga;+tlig;+swsh
+Ysabeau Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Medium.otf]:+clig;+liga;+tlig
+Ysabeau Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Medium.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Medium.otf]:+clig;+liga;+tlig;+smcp
+Ysabeau Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Medium.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Medium.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Medium.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Medium; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Medium.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Medium; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Medium.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Medium; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Medium.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Medium [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Medium.ttf]:+clig;+liga;+tlig
+Ysabeau Medium; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Medium.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Medium; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Medium.ttf]:+clig;+liga;+tlig;+smcp
+Ysabeau Medium; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Medium.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Medium; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Medium.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Medium; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Medium.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Medium; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Medium.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Medium; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Medium.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Medium; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Medium.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-MediumItalic.otf]:+clig;+liga;+tlig
+Ysabeau Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-MediumItalic.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-MediumItalic.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-MediumItalic.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-MediumItalic.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Medium Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-MediumItalic.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Medium Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-MediumItalic.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Medium Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-MediumItalic.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Medium Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-MediumItalic.otf]:+clig;+liga;+tlig;+swsh
+Ysabeau Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-MediumItalic.ttf]:+clig;+liga;+tlig
+Ysabeau Medium Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-MediumItalic.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Medium Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-MediumItalic.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Medium Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-MediumItalic.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Medium Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-MediumItalic.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Medium Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-MediumItalic.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Medium Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-MediumItalic.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Medium Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-MediumItalic.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Medium Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-MediumItalic.ttf]:+clig;+liga;+tlig;+swsh
+Ysabeau Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Regular.otf]:+clig;+liga;+tlig
+Ysabeau Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Regular.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Regular.otf]:+clig;+liga;+tlig;+smcp
+Ysabeau Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Regular.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Regular.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Regular.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Regular; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Regular.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Regular.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Regular; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Regular.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Regular [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Regular.ttf]:+clig;+liga;+tlig
+Ysabeau Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Regular.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Regular.ttf]:+clig;+liga;+tlig;+smcp
+Ysabeau Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Regular; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Regular; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Regular.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Regular; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Regular.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Regular; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Regular.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBold.otf]:+clig;+liga;+tlig
+Ysabeau SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBold.otf]:+clig;+liga;+tlig;+onum
+Ysabeau SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBold.otf]:+clig;+liga;+tlig;+smcp
+Ysabeau SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBold.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBold.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBold.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau SemiBold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBold.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau SemiBold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBold.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau SemiBold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBold.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau SemiBold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBold.ttf]:+clig;+liga;+tlig
+Ysabeau SemiBold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBold.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau SemiBold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBold.ttf]:+clig;+liga;+tlig;+smcp
+Ysabeau SemiBold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBold.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau SemiBold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBold.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau SemiBold; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBold.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau SemiBold; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBold.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau SemiBold; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBold.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau SemiBold; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBold.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBoldItalic.otf]:+clig;+liga;+tlig
+Ysabeau SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBoldItalic.otf]:+clig;+liga;+tlig;+onum
+Ysabeau SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau SemiBold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau SemiBold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau SemiBold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBoldItalic.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau SemiBold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-SemiBoldItalic.otf]:+clig;+liga;+tlig;+swsh
+Ysabeau SemiBold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBoldItalic.ttf]:+clig;+liga;+tlig
+Ysabeau SemiBold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau SemiBold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau SemiBold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau SemiBold Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau SemiBold Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau SemiBold Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau SemiBold Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau SemiBold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-SemiBoldItalic.ttf]:+clig;+liga;+tlig;+swsh
+Ysabeau Thin [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Thin.otf]:+clig;+liga;+tlig
+Ysabeau Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Thin.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Thin.otf]:+clig;+liga;+tlig;+smcp
+Ysabeau Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Thin.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Thin.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Thin.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Thin; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Thin.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Thin; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Thin.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Thin; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-Thin.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Thin [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Thin.ttf]:+clig;+liga;+tlig
+Ysabeau Thin; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Thin.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Thin; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Thin.ttf]:+clig;+liga;+tlig;+smcp
+Ysabeau Thin; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Thin.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Thin; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Thin.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Thin; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Thin.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Thin; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Thin.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Thin; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Thin.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Thin; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-Thin.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ThinItalic.otf]:+clig;+liga;+tlig
+Ysabeau Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ThinItalic.otf]:+clig;+liga;+tlig;+onum
+Ysabeau Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ThinItalic.otf]:+clig;+liga;+tlig;+ss01
+Ysabeau Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ThinItalic.otf]:+clig;+liga;+tlig;+ss02
+Ysabeau Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ThinItalic.otf]:+clig;+liga;+tlig;+ss03
+Ysabeau Thin Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ThinItalic.otf]:+clig;+liga;+tlig;+ss09
+Ysabeau Thin Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ThinItalic.otf]:+clig;+liga;+tlig;+ss10
+Ysabeau Thin Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ThinItalic.otf]:+clig;+liga;+tlig;+ss11
+Ysabeau Thin Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ysabeau/Ysabeau-ThinItalic.otf]:+clig;+liga;+tlig;+swsh
+Ysabeau Thin Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ThinItalic.ttf]:+clig;+liga;+tlig
+Ysabeau Thin Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ThinItalic.ttf]:+clig;+liga;+tlig;+onum
+Ysabeau Thin Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ThinItalic.ttf]:+clig;+liga;+tlig;+ss01
+Ysabeau Thin Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ThinItalic.ttf]:+clig;+liga;+tlig;+ss02
+Ysabeau Thin Italic; Stylistic Set 3 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ThinItalic.ttf]:+clig;+liga;+tlig;+ss03
+Ysabeau Thin Italic; Stylistic Set 9 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ThinItalic.ttf]:+clig;+liga;+tlig;+ss09
+Ysabeau Thin Italic; Stylistic Set 10 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ThinItalic.ttf]:+clig;+liga;+tlig;+ss10
+Ysabeau Thin Italic; Stylistic Set 11 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ThinItalic.ttf]:+clig;+liga;+tlig;+ss11
+Ysabeau Thin Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/ysabeau/Ysabeau-ThinItalic.ttf]:+clig;+liga;+tlig;+swsh
+Zapf Dingbats [/System/Library/Fonts/ZapfDingbats.ttf]:+clig;+liga;+tlig
+Zenith Slab DJR Bold [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.otf]:+clig;+liga;+tlig
+Zenith Slab DJR Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.otf]:+clig;+liga;+tlig;+ss01
+Zenith Slab DJR Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.otf]:+clig;+liga;+tlig;+ss02
+Zenith Slab DJR Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.otf]:+clig;+liga;+tlig;+ss03
+Zenith Slab DJR Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.otf]:+clig;+liga;+tlig;+ss04
+Zenith Slab DJR Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.otf]:+clig;+liga;+tlig;+ss05
+Zenith Slab DJR Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.otf]:+clig;+liga;+tlig;+ss08
+Zenith Slab DJR Bold [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.ttf]:+clig;+liga;+tlig
+Zenith Slab DJR Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.ttf]:+clig;+liga;+tlig;+ss01
+Zenith Slab DJR Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.ttf]:+clig;+liga;+tlig;+ss02
+Zenith Slab DJR Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.ttf]:+clig;+liga;+tlig;+ss03
+Zenith Slab DJR Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.ttf]:+clig;+liga;+tlig;+ss04
+Zenith Slab DJR Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.ttf]:+clig;+liga;+tlig;+ss05
+Zenith Slab DJR Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Bold.ttf]:+clig;+liga;+tlig;+ss08
+Zenith Slab DJR Color [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.otf]:+clig;+liga;+tlig
+Zenith Slab DJR Color; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.otf]:+clig;+liga;+tlig;+ss01
+Zenith Slab DJR Color; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.otf]:+clig;+liga;+tlig;+ss02
+Zenith Slab DJR Color; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.otf]:+clig;+liga;+tlig;+ss03
+Zenith Slab DJR Color; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.otf]:+clig;+liga;+tlig;+ss04
+Zenith Slab DJR Color; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.otf]:+clig;+liga;+tlig;+ss05
+Zenith Slab DJR Color; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.otf]:+clig;+liga;+tlig;+ss08
+Zenith Slab DJR Color [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.ttf]:+clig;+liga;+tlig
+Zenith Slab DJR Color; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Zenith Slab DJR Color; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Zenith Slab DJR Color; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Zenith Slab DJR Color; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Zenith Slab DJR Color; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Zenith Slab DJR Color; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColor-Regular.ttf]:+clig;+liga;+tlig;+ss08
+Zenith Slab DJR Color SVG [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig
+Zenith Slab DJR Color SVG; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss01
+Zenith Slab DJR Color SVG; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss02
+Zenith Slab DJR Color SVG; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss03
+Zenith Slab DJR Color SVG; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss04
+Zenith Slab DJR Color SVG; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss05
+Zenith Slab DJR Color SVG; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.otf]:+clig;+liga;+tlig;+ss08
+Zenith Slab DJR Color SVG [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.ttf]:+clig;+liga;+tlig
+Zenith Slab DJR Color SVG; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Zenith Slab DJR Color SVG; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Zenith Slab DJR Color SVG; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Zenith Slab DJR Color SVG; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Zenith Slab DJR Color SVG; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Zenith Slab DJR Color SVG; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJRColorSVG-Regular.ttf]:+clig;+liga;+tlig;+ss08
+Zenith Slab DJR Regular [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.otf]:+clig;+liga;+tlig
+Zenith Slab DJR Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.otf]:+clig;+liga;+tlig;+ss01
+Zenith Slab DJR Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.otf]:+clig;+liga;+tlig;+ss02
+Zenith Slab DJR Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.otf]:+clig;+liga;+tlig;+ss03
+Zenith Slab DJR Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.otf]:+clig;+liga;+tlig;+ss04
+Zenith Slab DJR Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.otf]:+clig;+liga;+tlig;+ss05
+Zenith Slab DJR Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.otf]:+clig;+liga;+tlig;+ss08
+Zenith Slab DJR Regular [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.ttf]:+clig;+liga;+tlig
+Zenith Slab DJR Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.ttf]:+clig;+liga;+tlig;+ss01
+Zenith Slab DJR Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.ttf]:+clig;+liga;+tlig;+ss02
+Zenith Slab DJR Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.ttf]:+clig;+liga;+tlig;+ss03
+Zenith Slab DJR Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.ttf]:+clig;+liga;+tlig;+ss04
+Zenith Slab DJR Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.ttf]:+clig;+liga;+tlig;+ss05
+Zenith Slab DJR Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/truetype/DJR/Zenith-Slab/ZenithSlabDJR-Regular.ttf]:+clig;+liga;+tlig;+ss08
+drm10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drm10.otf]:+clig;+liga;+tlig
+drm11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drm11.otf]:+clig;+liga;+tlig
+drm12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drm12.otf]:+clig;+liga;+tlig
+drm14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drm14.otf]:+clig;+liga;+tlig
+drm17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drm17.otf]:+clig;+liga;+tlig
+drm24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drm24.otf]:+clig;+liga;+tlig
+drm6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drm6.otf]:+clig;+liga;+tlig
+drm7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drm7.otf]:+clig;+liga;+tlig
+drm8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drm8.otf]:+clig;+liga;+tlig
+drm9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drm9.otf]:+clig;+liga;+tlig
+drmb10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmb10.otf]:+clig;+liga;+tlig
+drmb11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmb11.otf]:+clig;+liga;+tlig
+drmb12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmb12.otf]:+clig;+liga;+tlig
+drmb14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmb14.otf]:+clig;+liga;+tlig
+drmb17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmb17.otf]:+clig;+liga;+tlig
+drmb24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmb24.otf]:+clig;+liga;+tlig
+drmb6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmb6.otf]:+clig;+liga;+tlig
+drmb7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmb7.otf]:+clig;+liga;+tlig
+drmb8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmb8.otf]:+clig;+liga;+tlig
+drmb9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmb9.otf]:+clig;+liga;+tlig
+drmbx10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmbx10.otf]:+clig;+liga;+tlig
+drmbx11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmbx11.otf]:+clig;+liga;+tlig
+drmbx12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmbx12.otf]:+clig;+liga;+tlig
+drmbx14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmbx14.otf]:+clig;+liga;+tlig
+drmbx17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmbx17.otf]:+clig;+liga;+tlig
+drmbx24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmbx24.otf]:+clig;+liga;+tlig
+drmbx6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmbx6.otf]:+clig;+liga;+tlig
+drmbx7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmbx7.otf]:+clig;+liga;+tlig
+drmbx8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmbx8.otf]:+clig;+liga;+tlig
+drmbx9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmbx9.otf]:+clig;+liga;+tlig
+drminf10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drminf10.otf]:+clig;+liga;+tlig
+drminf11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drminf11.otf]:+clig;+liga;+tlig
+drminf12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drminf12.otf]:+clig;+liga;+tlig
+drminf14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drminf14.otf]:+clig;+liga;+tlig
+drminf17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drminf17.otf]:+clig;+liga;+tlig
+drminf24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drminf24.otf]:+clig;+liga;+tlig
+drminf6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drminf6.otf]:+clig;+liga;+tlig
+drminf7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drminf7.otf]:+clig;+liga;+tlig
+drminf8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drminf8.otf]:+clig;+liga;+tlig
+drminf9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drminf9.otf]:+clig;+liga;+tlig
+drmit10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmit10.otf]:+clig;+liga;+tlig
+drmit11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmit11.otf]:+clig;+liga;+tlig
+drmit12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmit12.otf]:+clig;+liga;+tlig
+drmit14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmit14.otf]:+clig;+liga;+tlig
+drmit17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmit17.otf]:+clig;+liga;+tlig
+drmit24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmit24.otf]:+clig;+liga;+tlig
+drmit6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmit6.otf]:+clig;+liga;+tlig
+drmit7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmit7.otf]:+clig;+liga;+tlig
+drmit8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmit8.otf]:+clig;+liga;+tlig
+drmit9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmit9.otf]:+clig;+liga;+tlig
+drmitbx10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitbx10.otf]:+clig;+liga;+tlig
+drmitbx11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitbx11.otf]:+clig;+liga;+tlig
+drmitbx12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitbx12.otf]:+clig;+liga;+tlig
+drmitbx14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitbx14.otf]:+clig;+liga;+tlig
+drmitbx17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitbx17.otf]:+clig;+liga;+tlig
+drmitbx24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitbx24.otf]:+clig;+liga;+tlig
+drmitbx6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitbx6.otf]:+clig;+liga;+tlig
+drmitbx7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitbx7.otf]:+clig;+liga;+tlig
+drmitbx8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitbx8.otf]:+clig;+liga;+tlig
+drmitbx9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitbx9.otf]:+clig;+liga;+tlig
+drmitsc10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitsc10.otf]:+clig;+liga;+tlig
+drmitsc11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitsc11.otf]:+clig;+liga;+tlig
+drmitsc12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitsc12.otf]:+clig;+liga;+tlig
+drmitsc14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitsc14.otf]:+clig;+liga;+tlig
+drmitsc17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitsc17.otf]:+clig;+liga;+tlig
+drmitsc24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitsc24.otf]:+clig;+liga;+tlig
+drmitsc6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitsc6.otf]:+clig;+liga;+tlig
+drmitsc7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitsc7.otf]:+clig;+liga;+tlig
+drmitsc8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitsc8.otf]:+clig;+liga;+tlig
+drmitsc9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmitsc9.otf]:+clig;+liga;+tlig
+drmittc10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmittc10.otf]:+clig;+liga;+tlig
+drmittc11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmittc11.otf]:+clig;+liga;+tlig
+drmittc12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmittc12.otf]:+clig;+liga;+tlig
+drmittc14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmittc14.otf]:+clig;+liga;+tlig
+drmittc17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmittc17.otf]:+clig;+liga;+tlig
+drmittc24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmittc24.otf]:+clig;+liga;+tlig
+drmittc6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmittc6.otf]:+clig;+liga;+tlig
+drmittc7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmittc7.otf]:+clig;+liga;+tlig
+drmittc8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmittc8.otf]:+clig;+liga;+tlig
+drmittc9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmittc9.otf]:+clig;+liga;+tlig
+drml10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drml10.otf]:+clig;+liga;+tlig
+drml11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drml11.otf]:+clig;+liga;+tlig
+drml12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drml12.otf]:+clig;+liga;+tlig
+drml14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drml14.otf]:+clig;+liga;+tlig
+drml17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drml17.otf]:+clig;+liga;+tlig
+drml24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drml24.otf]:+clig;+liga;+tlig
+drml6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drml6.otf]:+clig;+liga;+tlig
+drml7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drml7.otf]:+clig;+liga;+tlig
+drml8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drml8.otf]:+clig;+liga;+tlig
+drml9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drml9.otf]:+clig;+liga;+tlig
+drmmi10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmmi10.otf]:+clig;+liga;+tlig
+drmsc10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsc10.otf]:+clig;+liga;+tlig
+drmsc11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsc11.otf]:+clig;+liga;+tlig
+drmsc12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsc12.otf]:+clig;+liga;+tlig
+drmsc14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsc14.otf]:+clig;+liga;+tlig
+drmsc17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsc17.otf]:+clig;+liga;+tlig
+drmsc24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsc24.otf]:+clig;+liga;+tlig
+drmsc6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsc6.otf]:+clig;+liga;+tlig
+drmsc7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsc7.otf]:+clig;+liga;+tlig
+drmsc8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsc8.otf]:+clig;+liga;+tlig
+drmsc9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsc9.otf]:+clig;+liga;+tlig
+drmscbx10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmscbx10.otf]:+clig;+liga;+tlig
+drmscbx11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmscbx11.otf]:+clig;+liga;+tlig
+drmscbx12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmscbx12.otf]:+clig;+liga;+tlig
+drmscbx14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmscbx14.otf]:+clig;+liga;+tlig
+drmscbx17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmscbx17.otf]:+clig;+liga;+tlig
+drmscbx24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmscbx24.otf]:+clig;+liga;+tlig
+drmscbx6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmscbx6.otf]:+clig;+liga;+tlig
+drmscbx7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmscbx7.otf]:+clig;+liga;+tlig
+drmscbx8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmscbx8.otf]:+clig;+liga;+tlig
+drmscbx9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmscbx9.otf]:+clig;+liga;+tlig
+drmsl10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsl10.otf]:+clig;+liga;+tlig
+drmsl11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsl11.otf]:+clig;+liga;+tlig
+drmsl12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsl12.otf]:+clig;+liga;+tlig
+drmsl14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsl14.otf]:+clig;+liga;+tlig
+drmsl17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsl17.otf]:+clig;+liga;+tlig
+drmsl24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsl24.otf]:+clig;+liga;+tlig
+drmsl6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsl6.otf]:+clig;+liga;+tlig
+drmsl7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsl7.otf]:+clig;+liga;+tlig
+drmsl8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsl8.otf]:+clig;+liga;+tlig
+drmsl9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmsl9.otf]:+clig;+liga;+tlig
+drmui10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmui10.otf]:+clig;+liga;+tlig
+drmui11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmui11.otf]:+clig;+liga;+tlig
+drmui12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmui12.otf]:+clig;+liga;+tlig
+drmui14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmui14.otf]:+clig;+liga;+tlig
+drmui17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmui17.otf]:+clig;+liga;+tlig
+drmui24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmui24.otf]:+clig;+liga;+tlig
+drmui6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmui6.otf]:+clig;+liga;+tlig
+drmui7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmui7.otf]:+clig;+liga;+tlig
+drmui8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmui8.otf]:+clig;+liga;+tlig
+drmui9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmui9.otf]:+clig;+liga;+tlig
+drmuibx10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmuibx10.otf]:+clig;+liga;+tlig
+drmuibx11 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmuibx11.otf]:+clig;+liga;+tlig
+drmuibx12 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmuibx12.otf]:+clig;+liga;+tlig
+drmuibx14 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmuibx14.otf]:+clig;+liga;+tlig
+drmuibx17 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmuibx17.otf]:+clig;+liga;+tlig
+drmuibx24 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmuibx24.otf]:+clig;+liga;+tlig
+drmuibx6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmuibx6.otf]:+clig;+liga;+tlig
+drmuibx7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmuibx7.otf]:+clig;+liga;+tlig
+drmuibx8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmuibx8.otf]:+clig;+liga;+tlig
+drmuibx9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/drm/drmuibx9.otf]:+clig;+liga;+tlig
+e-Ukraine Bold [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Bold.otf]:+clig;+liga;+tlig
+e-Ukraine Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Bold.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Bold.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Bold.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Bold.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Bold.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Bold.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Bold.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Bold.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Bold.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Head Bold [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig
+e-Ukraine Head Bold; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Head Bold; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Head Bold; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Head Bold; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Head Bold; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Head Bold; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Head Bold; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Head Bold; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Head Bold; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Head Bold; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss09
+e-Ukraine Head Bold; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss10
+e-Ukraine Head Bold; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss11
+e-Ukraine Head Bold; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss12
+e-Ukraine Head Bold; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss13
+e-Ukraine Head Bold; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss14
+e-Ukraine Head Bold; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss15
+e-Ukraine Head Bold; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss16
+e-Ukraine Head Bold; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss17
+e-Ukraine Head Bold; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss18
+e-Ukraine Head Bold; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Bold.otf]:+clig;+liga;+tlig;+ss19
+e-Ukraine Head LOGO [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig
+e-Ukraine Head LOGO; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Head LOGO; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Head LOGO; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Head LOGO; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Head LOGO; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Head LOGO; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Head LOGO; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Head LOGO; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Head LOGO; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Head LOGO; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss09
+e-Ukraine Head LOGO; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss10
+e-Ukraine Head LOGO; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss11
+e-Ukraine Head LOGO; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss12
+e-Ukraine Head LOGO; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss13
+e-Ukraine Head LOGO; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss14
+e-Ukraine Head LOGO; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss15
+e-Ukraine Head LOGO; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss16
+e-Ukraine Head LOGO; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss17
+e-Ukraine Head LOGO; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss18
+e-Ukraine Head LOGO; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-LOGO.otf]:+clig;+liga;+tlig;+ss19
+e-Ukraine Head Light [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig
+e-Ukraine Head Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Head Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Head Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Head Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Head Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Head Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Head Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Head Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Head Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Head Light; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss09
+e-Ukraine Head Light; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss10
+e-Ukraine Head Light; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss11
+e-Ukraine Head Light; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss12
+e-Ukraine Head Light; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss13
+e-Ukraine Head Light; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss14
+e-Ukraine Head Light; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss15
+e-Ukraine Head Light; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss16
+e-Ukraine Head Light; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss17
+e-Ukraine Head Light; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss18
+e-Ukraine Head Light; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Light.otf]:+clig;+liga;+tlig;+ss19
+e-Ukraine Head Medium [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig
+e-Ukraine Head Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Head Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Head Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Head Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Head Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Head Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Head Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Head Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Head Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Head Medium; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss09
+e-Ukraine Head Medium; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss10
+e-Ukraine Head Medium; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss11
+e-Ukraine Head Medium; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss12
+e-Ukraine Head Medium; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss13
+e-Ukraine Head Medium; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss14
+e-Ukraine Head Medium; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss15
+e-Ukraine Head Medium; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss16
+e-Ukraine Head Medium; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss17
+e-Ukraine Head Medium; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss18
+e-Ukraine Head Medium; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Medium.otf]:+clig;+liga;+tlig;+ss19
+e-Ukraine Head Regular [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig
+e-Ukraine Head Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Head Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Head Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Head Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Head Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Head Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Head Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Head Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Head Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Head Regular; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss09
+e-Ukraine Head Regular; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss10
+e-Ukraine Head Regular; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss11
+e-Ukraine Head Regular; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss12
+e-Ukraine Head Regular; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss13
+e-Ukraine Head Regular; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss14
+e-Ukraine Head Regular; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss15
+e-Ukraine Head Regular; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss16
+e-Ukraine Head Regular; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss17
+e-Ukraine Head Regular; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss18
+e-Ukraine Head Regular; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Regular.otf]:+clig;+liga;+tlig;+ss19
+e-Ukraine Head Thin [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig
+e-Ukraine Head Thin; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Head Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Head Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Head Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Head Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Head Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Head Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Head Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Head Thin; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Head Thin; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss09
+e-Ukraine Head Thin; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss10
+e-Ukraine Head Thin; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss11
+e-Ukraine Head Thin; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss12
+e-Ukraine Head Thin; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss13
+e-Ukraine Head Thin; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss14
+e-Ukraine Head Thin; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss15
+e-Ukraine Head Thin; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss16
+e-Ukraine Head Thin; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss17
+e-Ukraine Head Thin; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss18
+e-Ukraine Head Thin; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-Thin.otf]:+clig;+liga;+tlig;+ss19
+e-Ukraine Head UltraLight [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig
+e-Ukraine Head UltraLight; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Head UltraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Head UltraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Head UltraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Head UltraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Head UltraLight; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Head UltraLight; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Head UltraLight; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Head UltraLight; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Head UltraLight; Stylistic Set 9 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss09
+e-Ukraine Head UltraLight; Stylistic Set 10 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss10
+e-Ukraine Head UltraLight; Stylistic Set 11 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss11
+e-Ukraine Head UltraLight; Stylistic Set 12 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss12
+e-Ukraine Head UltraLight; Stylistic Set 13 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss13
+e-Ukraine Head UltraLight; Stylistic Set 14 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss14
+e-Ukraine Head UltraLight; Stylistic Set 15 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss15
+e-Ukraine Head UltraLight; Stylistic Set 16 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss16
+e-Ukraine Head UltraLight; Stylistic Set 17 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss17
+e-Ukraine Head UltraLight; Stylistic Set 18 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss18
+e-Ukraine Head UltraLight; Stylistic Set 19 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-UkraineHead-UltraLight.otf]:+clig;+liga;+tlig;+ss19
+e-Ukraine Light [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Light.otf]:+clig;+liga;+tlig
+e-Ukraine Light; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Light.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Light; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Light.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Light; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Light.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Light; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Light.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Light; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Light.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Light; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Light.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Light; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Light.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Light; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Light.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Light; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Light.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Medium [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Medium.otf]:+clig;+liga;+tlig
+e-Ukraine Medium; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Medium.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Medium; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Medium.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Medium; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Medium.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Medium; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Medium.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Medium; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Medium.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Medium; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Medium.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Medium; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Medium.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Medium; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Medium.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Medium; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Medium.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Regular [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Regular.otf]:+clig;+liga;+tlig
+e-Ukraine Regular; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Regular.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Regular; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Regular.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Regular; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Regular.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Regular; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Regular.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Regular; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Regular.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Regular; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Regular.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Regular; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Regular.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Regular; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Regular.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Regular; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Regular.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine Thin [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Thin.otf]:+clig;+liga;+tlig
+e-Ukraine Thin; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Thin.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine Thin; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Thin.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine Thin; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Thin.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine Thin; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Thin.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine Thin; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Thin.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine Thin; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Thin.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine Thin; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Thin.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine Thin; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Thin.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine Thin; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-Thin.otf]:+clig;+liga;+tlig;+ss08
+e-Ukraine UltraLight [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-UltraLight.otf]:+clig;+liga;+tlig
+e-Ukraine UltraLight; Oldstyle Figures [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-UltraLight.otf]:+clig;+liga;+tlig;+onum
+e-Ukraine UltraLight; Stylistic Set 1 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-UltraLight.otf]:+clig;+liga;+tlig;+ss01
+e-Ukraine UltraLight; Stylistic Set 2 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-UltraLight.otf]:+clig;+liga;+tlig;+ss02
+e-Ukraine UltraLight; Stylistic Set 3 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-UltraLight.otf]:+clig;+liga;+tlig;+ss03
+e-Ukraine UltraLight; Stylistic Set 4 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-UltraLight.otf]:+clig;+liga;+tlig;+ss04
+e-Ukraine UltraLight; Stylistic Set 5 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-UltraLight.otf]:+clig;+liga;+tlig;+ss05
+e-Ukraine UltraLight; Stylistic Set 6 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-UltraLight.otf]:+clig;+liga;+tlig;+ss06
+e-Ukraine UltraLight; Stylistic Set 7 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-UltraLight.otf]:+clig;+liga;+tlig;+ss07
+e-Ukraine UltraLight; Stylistic Set 8 [/usr/local/texlive/texmf-local/fonts/opentype/DR/e-Ukraine/e-Ukraine-UltraLight.otf]:+clig;+liga;+tlig;+ss08
+fbb Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Bold.otf]:+clig;+liga;+tlig
+fbb Bold; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Bold.otf]:+clig;+liga;+tlig;+hist
+fbb Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Bold.otf]:+clig;+liga;+tlig;+onum
+fbb Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Bold.otf]:+clig;+liga;+tlig;+smcp
+fbb Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Bold.otf]:+clig;+liga;+tlig;+ss01
+fbb Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Bold.otf]:+clig;+liga;+tlig;+ss02
+fbb Bold; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Bold.otf]:+clig;+liga;+tlig;+swsh
+fbb Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-BoldItalic.otf]:+clig;+liga;+tlig
+fbb Bold Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-BoldItalic.otf]:+clig;+liga;+tlig;+hist
+fbb Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-BoldItalic.otf]:+clig;+liga;+tlig;+onum
+fbb Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-BoldItalic.otf]:+clig;+liga;+tlig;+smcp
+fbb Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-BoldItalic.otf]:+clig;+liga;+tlig;+ss02
+fbb Bold Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-BoldItalic.otf]:+clig;+liga;+tlig;+swsh
+fbb Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Italic.otf]:+clig;+liga;+tlig
+fbb Italic; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Italic.otf]:+clig;+liga;+tlig;+hist
+fbb Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Italic.otf]:+clig;+liga;+tlig;+onum
+fbb Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Italic.otf]:+clig;+liga;+tlig;+smcp
+fbb Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Italic.otf]:+clig;+liga;+tlig;+ss02
+fbb Italic; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Italic.otf]:+clig;+liga;+tlig;+swsh
+fbb Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Regular.otf]:+clig;+liga;+tlig
+fbb Regular; Historical Forms [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Regular.otf]:+clig;+liga;+tlig;+hist
+fbb Regular; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Regular.otf]:+clig;+liga;+tlig;+onum
+fbb Regular; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Regular.otf]:+clig;+liga;+tlig;+smcp
+fbb Regular; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Regular.otf]:+clig;+liga;+tlig;+ss01
+fbb Regular; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Regular.otf]:+clig;+liga;+tlig;+ss02
+fbb Regular; Swash [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/fbb/fbb-Regular.otf]:+clig;+liga;+tlig;+swsh
+font-mfizz [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/fontmfizz/font-mfizz.ttf]:+clig;+liga;+tlig
+greextra [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gregoriotex/greextra.ttf]:+clig;+liga;+tlig
+gregall [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gregoriotex/gregall.ttf]:+clig;+liga;+tlig
+grelaon [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gregoriotex/grelaon.ttf]:+clig;+liga;+tlig
+gresgmodern [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/gregoriotex/gresgmodern.ttf]:+clig;+liga;+tlig
+khatalmaqala [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-regular.ttf]:+clig;+liga;+tlig
+khatalmaqala; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-regular.ttf]:+clig;+liga;+tlig;+onum
+khatalmaqala; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-regular.ttf]:+clig;+liga;+tlig;+smcp
+khatalmaqala; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-regular.ttf]:+clig;+liga;+tlig;+ss01
+khatalmaqala; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-regular.ttf]:+clig;+liga;+tlig;+ss02
+khatalmaqala Bold [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-bold.ttf]:+clig;+liga;+tlig
+khatalmaqala Bold; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-bold.ttf]:+clig;+liga;+tlig;+onum
+khatalmaqala Bold; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-bold.ttf]:+clig;+liga;+tlig;+smcp
+khatalmaqala Bold; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-bold.ttf]:+clig;+liga;+tlig;+ss01
+khatalmaqala Bold; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-bold.ttf]:+clig;+liga;+tlig;+ss02
+khatalmaqala Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-bolditalic.ttf]:+clig;+liga;+tlig
+khatalmaqala Bold Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-bolditalic.ttf]:+clig;+liga;+tlig;+onum
+khatalmaqala Bold Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-bolditalic.ttf]:+clig;+liga;+tlig;+smcp
+khatalmaqala Bold Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-bolditalic.ttf]:+clig;+liga;+tlig;+ss01
+khatalmaqala Bold Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-bolditalic.ttf]:+clig;+liga;+tlig;+ss02
+khatalmaqala Italic [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-italic.ttf]:+clig;+liga;+tlig
+khatalmaqala Italic; Oldstyle Figures [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-italic.ttf]:+clig;+liga;+tlig;+onum
+khatalmaqala Italic; Small Capitals [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-italic.ttf]:+clig;+liga;+tlig;+smcp
+khatalmaqala Italic; Stylistic Set 1 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-italic.ttf]:+clig;+liga;+tlig;+ss01
+khatalmaqala Italic; Stylistic Set 2 [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/khatalmaqala/khatalmaqala-italic.ttf]:+clig;+liga;+tlig;+ss02
+mpchess font [/usr/local/texlive/2024/texmf-dist/fonts/truetype/public/mpchess/mpchessfont.ttf]:+clig;+liga;+tlig
+npxsups Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/npxsups-Bold.otf]:+clig;+liga;+tlig
+npxsups Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/npxsups-BoldItalic.otf]:+clig;+liga;+tlig
+npxsups Bold Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/npxsups-BoldSlanted.otf]:+clig;+liga;+tlig
+npxsups Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/npxsups-Italic.otf]:+clig;+liga;+tlig
+npxsups Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/npxsups-Regular.otf]:+clig;+liga;+tlig
+npxsups Slanted [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newpx/npxsups-Slanted.otf]:+clig;+liga;+tlig
+ntxsups Bold [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/ntxsups-Bold.otf]:+clig;+liga;+tlig
+ntxsups Bold Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/ntxsups-BoldItalic.otf]:+clig;+liga;+tlig
+ntxsups Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/ntxsups-Italic.otf]:+clig;+liga;+tlig
+ntxsups Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/newtx/ntxsups-Regular.otf]:+clig;+liga;+tlig
+ocrb10 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ocr-b-outline/ocrb10.otf]:+clig;+liga;+tlig
+ocrb5 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ocr-b-outline/ocrb5.otf]:+clig;+liga;+tlig
+ocrb6 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ocr-b-outline/ocrb6.otf]:+clig;+liga;+tlig
+ocrb7 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ocr-b-outline/ocrb7.otf]:+clig;+liga;+tlig
+ocrb8 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ocr-b-outline/ocrb8.otf]:+clig;+liga;+tlig
+ocrb9 [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/ocr-b-outline/ocrb9.otf]:+clig;+liga;+tlig
+ztm Medium [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/ztm-Med.otf]:+clig;+liga;+tlig
+ztm Medium Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/ztm-MedIta.otf]:+clig;+liga;+tlig
+ztm Medium Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/ztm-MedObl.otf]:+clig;+liga;+tlig
+ztm Regular [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/ztm-Reg.otf]:+clig;+liga;+tlig
+ztm Regular Italic [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/ztm-RegIta.otf]:+clig;+liga;+tlig
+ztm Regular Oblique [/usr/local/texlive/2024/texmf-dist/fonts/opentype/public/nimbus15/ztm-RegObl.otf]:+clig;+liga;+tlig
diff --git a/graphics/bookshelf/doc/bookshelf-listallfonts.1 b/graphics/bookshelf/doc/bookshelf-listallfonts.1
new file mode 100644
index 0000000000..90b1cf0034
--- /dev/null
+++ b/graphics/bookshelf/doc/bookshelf-listallfonts.1
@@ -0,0 +1,119 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "BOOKSHELF-LISTALLFONTS 1"
+.TH BOOKSHELF-LISTALLFONTS 1 2024-10-08 "perl v5.38.2" "User Contributed Perl Documentation"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+bookshelf\-listallfonts \- list all fonts known to LuaTeX with "interesting" features
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+bookshelf-listallfonts [\-d] [\-f FEATURES_FILE] [\-x EXCLUDED_PATTERNS_FILE]
+.PP
+bookshelf-listallfonts \-h
+.PP
+bookshelf-listallfonts \-v
+.PP
+bookshelf-listallfonts \-m
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+List all fonts known to LuaTeX adding "interesting" features to the
+listing.
+.PP
+The script queries luaotfload databases and outputs the list of fonts
+and features as a tab-separated stream with two field: font
+name+feature name, and LuaTeX loading command. This form is suitable
+for \fBmkfontsel.pl\fR\|(1) command from the \fIbookshelf\fR package.
+.PP
+We always include default features, \f(CW\*(C`+clig;+liga;+tlig\*(C'\fR.
+.PP
+It is recommended to issue
+.PP
+.Vb 1
+\& luaotfload\-tool \-\-update \-\-force
+.Ve
+.PP
+before running the script.
+.SH OPTIONS
+.IX Header "OPTIONS"
+.IP \fB\-d\fR 4
+.IX Item "-d"
+Print debug information on the standard output.
+.IP "\fB\-f\fR \fIFEATURES_FILE\fR" 4
+.IX Item "-f FEATURES_FILE"
+Use patterns in the \fIFEATURES\fR file instead of the default ones.
+.IP "\fB\-x\fR \fIEXCLUDED_PATTERNS_FILE\fR" 4
+.IX Item "-x EXCLUDED_PATTERNS_FILE"
+Exclude patterns (font paths and features or combinations) listed
+in \fIEXCLUDED_PATTERNS_FILE\fR.
+.IP \fB\-v\fR 4
+.IX Item "-v"
+Print version information
+.IP \fB\-h\fR 4
+.IX Item "-h"
+Print usage information
+.IP \fB\-m\fR 4
+.IX Item "-m"
+Print manual page
+.SH AUTHOR
+.IX Header "AUTHOR"
+Boris Veytsman, 2024
+.SH LICENSE
+.IX Header "LICENSE"
+LPPL 1.3c
diff --git a/graphics/bookshelf/doc/bookshelf-listallfonts.pdf b/graphics/bookshelf/doc/bookshelf-listallfonts.pdf
new file mode 100644
index 0000000000..7777b06a14
--- /dev/null
+++ b/graphics/bookshelf/doc/bookshelf-listallfonts.pdf
Binary files differ
diff --git a/graphics/bookshelf/doc/bookshelf-mkfontsel.1 b/graphics/bookshelf/doc/bookshelf-mkfontsel.1
new file mode 100644
index 0000000000..a79a8556dc
--- /dev/null
+++ b/graphics/bookshelf/doc/bookshelf-mkfontsel.1
@@ -0,0 +1,90 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "BOOKSHELF-MKFONTSEL 1"
+.TH BOOKSHELF-MKFONTSEL 1 2024-10-08 "perl v5.38.2" "User Contributed Perl Documentation"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+bookshelf\-mkfontsel \- a script to populate "fontsel" directory and create "pickfont.tex" file for bookshelf package
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+bookshelf-mkfontsel FONTFILE
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+Create and populate fontsel directory from the file
+produced by \fBlistallfonts.pl\fR\|(1) script, and create
+\&\f(CW\*(C`pickfont.tex\*(C'\fR file. Used by
+\&\fIbookshelf\fR package.
+.SH OPTIONS
+.IX Header "OPTIONS"
+.IP \fB\-v\fR 4
+.IX Item "-v"
+Print version information
+.IP \fB\-h\fR 4
+.IX Item "-h"
+Print usage information
+.IP \fB\-m\fR 4
+.IX Item "-m"
+Print manual page
+.SH AUTHOR
+.IX Header "AUTHOR"
+Boris Veytsman, 2024
+.SH LICENSE
+.IX Header "LICENSE"
+LPPL 1.3c
diff --git a/graphics/bookshelf/doc/bookshelf-mkfontsel.pdf b/graphics/bookshelf/doc/bookshelf-mkfontsel.pdf
new file mode 100644
index 0000000000..e0dbbb8e61
--- /dev/null
+++ b/graphics/bookshelf/doc/bookshelf-mkfontsel.pdf
Binary files differ
diff --git a/graphics/bookshelf/doc/bookshelf.bib b/graphics/bookshelf/doc/bookshelf.bib
new file mode 100644
index 0000000000..9f6de0fae0
--- /dev/null
+++ b/graphics/bookshelf/doc/bookshelf.bib
@@ -0,0 +1,36 @@
+@misc{rfc2119,
+ series = {Request for Comments},
+ number = 2119,
+ howpublished = {RFC 2119},
+ publisher = {RFC Editor},
+ doi = {10.17487/RFC2119},
+ url = {https://www.rfc-editor.org/info/rfc2119},
+ author = {Scott O. Bradner},
+ title = {{Key words for use in RFCs to Indicate Requirement Levels}},
+ pagetotal = 3,
+ year = 1997,
+ month = mar,
+ abstract = {In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.},
+}
+
+@Article{Bookshelf2024,
+ author = {Boris Veytsman},
+ title = {Extending {Peter Flynn}'s bookshelf package for
+ multilanguage libraries},
+ journal = {TUGboat},
+ year = 2024,
+ volume = 45,
+ number = 2,
+ pages = {193--195},
+ doi = {10.47397/tb/45-2/tb140veytsman-bookshelf},
+ url = {https://tug.org/TUGboat/tb45-2/tb140veytsman-bookshelf.pdf},
+}
+
+
+@Manual{Calibre,
+ title = {\emph{calibre} User Manual},
+ author = {Kovid Goyal},
+ year = 2024,
+ url = {https://manual.calibre-ebook.com/}
+}
+
diff --git a/graphics/bookshelf/doc/bookshelf.pdf b/graphics/bookshelf/doc/bookshelf.pdf
new file mode 100644
index 0000000000..55344d3996
--- /dev/null
+++ b/graphics/bookshelf/doc/bookshelf.pdf
Binary files differ
diff --git a/graphics/bookshelf/doc/excluded_patterns b/graphics/bookshelf/doc/excluded_patterns
new file mode 100644
index 0000000000..80f21c47c1
--- /dev/null
+++ b/graphics/bookshelf/doc/excluded_patterns
@@ -0,0 +1,56 @@
+Alegreya.*\+ss02
+Spectral.*\+ss04
+Hans_Holbein
+Megazoid-Shade
+HEJI2Text
+NotoColorEmoji
+GimletXRay-VF
+MegabaseCore
+PappardelleV2
+countriesofeurope
+drmdoz
+drmsy
+drmtc
+drmfigs
+drmgrk
+smf
+SimpleIcons
+Skak
+FontAwesome
+InputCipher
+FdSymbol
+greciliae
+blex\.ttf
+blsy\.ttf
+rblmi\.ttf
+emo-lingchi
+MnSymbol
+MdSymbol
+dantelogo
+emmentaler
+marvosym
+Asap-Symbol
+metsymb
+AlgolRevived
+P22FraJenPeo.otf
+LTCFlueronsGranjon
+LTCArchiveOrn
+SVRsymbols
+LTCHalloweenOrnaments
+BradleyInitialsDJRLayers-Frame
+P22CezanSwa
+P22GaugnXtr
+P22CezanSkt
+P22CezanLig
+P22DeaPro.*\+ss07
+BradleyInitialsDJRLayers-Background
+Junicode.*\+ss12
+Junicode.*\+ss13
+Junicode.*\+ss14
+QTDingBits
+Math-Companion
+Script-Companion
+TwemojiMozilla
+NAMU-Tryzub
+\/Fonts\/Supplemental\/
+NotoSansMyanmar\.ttc \ No newline at end of file
diff --git a/graphics/bookshelf/doc/features b/graphics/bookshelf/doc/features
new file mode 100644
index 0000000000..6ecd89672c
--- /dev/null
+++ b/graphics/bookshelf/doc/features
@@ -0,0 +1,8 @@
+^hist$
+^onum$
+^pcap$
+^smcp$
+^ss
+^swsh$
+^titl$
+^unic$ \ No newline at end of file
diff --git a/graphics/bookshelf/doc/sample.bib b/graphics/bookshelf/doc/sample.bib
new file mode 100644
index 0000000000..efc379092c
--- /dev/null
+++ b/graphics/bookshelf/doc/sample.bib
@@ -0,0 +1,8108 @@
+@misc{ SchemberJohn1,
+ title = "Quick Start Guide",
+ author = "John Schember",
+ size = "57062 octets" }
+
+@misc{ ElianKlavdiiPoluianovPaviel9,
+ title = "ПеÑтрые раÑÑказы",
+ author = "Клавдий Элиан and Павел ПолуÑнов",
+ size = "706068 octets" }
+
+@book{ KrylovAlieksieiNikolaievich10,
+ title = "Мои воÑпоминаниÑ",
+ author = "ÐлекÑей Ðиколаевич Крылов",
+ size = "1962662 octets" }
+
+@misc{ LieskovNikolaiSiemionovich12,
+ title = "Владычный Ñуд",
+ author = "Ðиколай Семёнович ЛеÑков",
+ size = "285607 octets" }
+
+@book{ TsaoSiuetsin13,
+ title = "Сон в краÑном тереме. Т. 3. Гл. LXXXI – СХХ.",
+ author = "СюÑцинь Цао",
+ size = "1336584 octets" }
+
+@book{ TsaoSiuetsin14,
+ title = "Сон в краÑном тереме. Т. 2. Гл. XLI – LXXX.",
+ author = "СюÑцинь Цао",
+ size = "1458943 octets" }
+
+@book{ TsaoSiuetsin15,
+ title = "Сон в краÑном тереме. Т. 1. Гл. I – XL.",
+ author = "СюÑцинь Цао",
+ size = "1495194 octets" }
+
+@book{ MontienMishiel16,
+ title = "Опыты",
+ author = "Мишель Монтень",
+ size = "4151038 octets" }
+
+@misc{ Aristofan17,
+ title = "Комедии",
+ author = "ÐриÑтофан",
+ size = "1423740 octets" }
+
+@book{ NitsshieFridrikhVilghielm18,
+ title = "Так говорил ЗаратуÑтра. Ecce Homo. По ту Ñторону добра и зла (Ñборник)",
+ author = "Фридрих Вильгельм Ðицше",
+ size = "2285673 octets" }
+
+@book{ IerusalimschyRoberto19,
+ title = "Programming in Lua 4ed",
+ author = "Roberto Ierusalimschy",
+ size = "535496 octets" }
+
+@book{ FalkKim20,
+ title = "Practical Recommender Systems",
+ author = "Kim Falk",
+ size = "17053002 octets" }
+
+@book{ Eskhil21,
+ title = "Трагедии",
+ author = "ЭÑхил",
+ size = "297749 octets" }
+
+@misc{ EskhilSofoklIevripidAristofanMienandrPlavtTitMaktsiiAfrPubliiTierientsiiSieniekaLutsiiAnniei22,
+ title = "ÐÐ½Ñ‚Ð¸Ñ‡Ð½Ð°Ñ Ð´Ñ€Ð°Ð¼Ð°",
+ author = "ЭÑхил and Софокл and Еврипид and ÐриÑтофан and Менандр and Тит Макций Плавт and Публий Теренций ÐÑ„Ñ€ and Луций Ðнней Сенека",
+ size = "1752456 octets" }
+
+@book{ CederNaomi23,
+ title = "The Quick Python Book, Third Edition",
+ author = "Naomi Ceder",
+ size = "1331978 octets" }
+
+@misc{ DiderotDenis24,
+ title = "Les Bijoux Indiscrets, or, The Indiscreet Toys",
+ author = "Denis Diderot",
+ size = "1341140 octets" }
+
+@book{ AfrPubliiTierientsii25,
+ title = "Комедии",
+ author = "Публий Теренций ÐÑ„Ñ€",
+ size = "608796 octets" }
+
+@misc{ PlavtTitMaktsii26,
+ title = "ПьеÑÑ‹",
+ author = "Тит Макций Плавт",
+ size = "1514563 octets" }
+
+@book{ Nai-anShi27,
+ title = "Речные заводи (том 2)",
+ author = "Ши Ðай-ань",
+ size = "702817 octets" }
+
+@book{ Nai-anShi28,
+ title = "Речные заводи (том 1)",
+ author = "Ши Ðай-ань",
+ size = "652277 octets" }
+
+@book{ DidroDieni29,
+ title = "ÐеÑкромные Ñокровища",
+ author = "Дени Дидро",
+ size = "332138 octets" }
+
+@book{ SaikakuIkhara30,
+ title = "Избранное",
+ author = "Ихара Сайкаку",
+ size = "254788 octets" }
+
+@book{ OsipovMaksim31,
+ title = "пгт ВечноÑÑ‚ÑŒ (Ñборник)",
+ author = "МакÑим ОÑипов",
+ size = "1208021 octets" }
+
+@book{ CholletFrancoisAllaireJ.J.32,
+ title = "Deep Learning with R",
+ author = "François Chollet and J. J. Allaire",
+ size = "9184493 octets" }
+
+@book{ ShuklaNishant33,
+ title = "Machine Learning with TensorFlow",
+ author = "Nishant Shukla",
+ size = "7515997 octets" }
+
+@book{ ShmarakovRomanLvovich34,
+ title = "Призвание поÑта",
+ author = "Роман Львович Шмараков",
+ size = "81595 octets" }
+
+@misc{ ShmarakovRomanLvovich35,
+ title = "Овидий в изгнании",
+ author = "Роман Львович Шмараков",
+ size = "660478 octets" }
+
+@misc{ ShmarakovRomanLvovich36,
+ title = "Граф Валериан Зубов в конце октÑÐ±Ñ€Ñ 1794 года",
+ author = "Роман Львович Шмараков",
+ size = "128075 octets" }
+
+@book{ ShmarakovRomanLvovich37,
+ title = "Ðвтопортрет Ñ ÑƒÑтрицей в кармане (фрагмент романа)",
+ author = "Роман Львович Шмараков",
+ size = "115516 octets" }
+
+@misc{ ShmarakovRomanLvovich38,
+ title = "Под буковым кровом",
+ author = "Роман Львович Шмараков",
+ size = "2505650 octets" }
+
+@misc{ EinshtieinAlbiert39,
+ title = "Собрание научных трудов. Том IV-1",
+ author = "Ðльберт Эйнштейн",
+ size = "3699491 octets" }
+
+@misc{ EinshtieinAlbiert40,
+ title = "Собрание научных трудов. Том IV-2",
+ author = "Ðльберт Эйнштейн",
+ size = "4805979 octets" }
+
+@book{ GreenSimonR.41,
+ title = "Deathstalker Legacy",
+ author = "Simon R. Green",
+ size = "828994 octets" }
+
+@book{ BrennanMarie42,
+ title = "Witch",
+ author = "Marie Brennan",
+ size = "1092511 octets" }
+
+@book{ Moreno-GarciaSilvia43,
+ title = "Prime Meridian",
+ author = "Silvia Moreno-Garcia",
+ size = "623540 octets" }
+
+@book{ MoonElizabeth44,
+ title = "Deeds of Honor",
+ author = "Elizabeth Moon",
+ size = "1540022 octets" }
+
+@book{ GreenSimonR.45,
+ title = "The Swords of Haven",
+ author = "Simon R. Green",
+ size = "1387198 octets" }
+
+@book{ MooreJohn46,
+ title = "A Fate Worse Than Dragons",
+ author = "Moore, John",
+ size = "320646 octets" }
+
+@book{ ZakourJohn;GanemLawrence47,
+ title = "The Plutonium Blonde",
+ author = "John Zakour and Lawrence Ganem",
+ size = "627332 octets" }
+
+@book{ GreenSimonR.48,
+ title = "Drinking Midnight Wine",
+ author = "Simon R. Green",
+ size = "788300 octets" }
+
+@book{ SprunkJon49,
+ title = "Shadow’s Son",
+ author = "Jon Sprunk",
+ size = "711741 octets" }
+
+@book{ CampbellJack50,
+ title = "The Dragons of Dorcastle",
+ author = "Jack Campbell",
+ size = "974408 octets" }
+
+@book{ deBodardAliette51,
+ title = "Servant of the Underworld",
+ author = "Aliette de Bodard",
+ size = "858406 octets" }
+
+@book{ CastroAdam-Troy52,
+ title = "With Unclean Hands",
+ author = "Adam-Troy Castro",
+ size = "605240 octets" }
+
+@book{ HuffTanya53,
+ title = "The Fire's Stone",
+ author = "Tanya Huff",
+ size = "409120 octets" }
+
+@book{ DietzWilliamC.54,
+ title = "DeathDay",
+ author = "William C. Dietz",
+ size = "936607 octets" }
+
+@book{ BrennanMarie55,
+ title = "Warrior",
+ author = "Marie Brennan",
+ size = "1073326 octets" }
+
+@book{ LindseyErin56,
+ title = "Bloodforged",
+ author = "Erin Lindsey",
+ size = "1521297 octets" }
+
+@book{ LindseyErin57,
+ title = "Bloodbound",
+ author = "Erin Lindsey",
+ size = "1458048 octets" }
+
+@book{ AkersTim58,
+ title = "The Horns of Ruin",
+ author = "Tim Akers",
+ size = "460338 octets" }
+
+@book{ HarrisCharlaine59,
+ title = "Dancers in the Dark and Layla Steps Up",
+ author = "Charlaine Harris",
+ size = "941380 octets" }
+
+@book{ CampbellJack60,
+ title = "The Hidden Masters of Marandur",
+ author = "Jack Campbell",
+ size = "932997 octets" }
+
+@book{ OlderDanielJose61,
+ title = "Salsa Nocturna",
+ author = "Daniel José Older",
+ size = "1430728 octets" }
+
+@book{ JohnMoore62,
+ title = "The Unhandsome Prince",
+ author = "Moore, John",
+ size = "262851 octets" }
+
+@book{ MooreJohn63,
+ title = "Heroics for Beginners",
+ author = "Moore, John",
+ size = "245833 octets" }
+
+@book{ MackayScott64,
+ title = "The Meek",
+ author = "Scott Mackay",
+ size = "725128 octets" }
+
+@book{ MooreJohn65,
+ title = "Bad Prince Charlie",
+ author = "Moore, John",
+ size = "277236 octets" }
+
+@book{ HuffTanya66,
+ title = "February Thaw and Other Stories of Contemporary Fantasy",
+ author = "Tanya Huff",
+ size = "508250 octets" }
+
+@book{ CampbellJack67,
+ title = "The Assassins of Altis",
+ author = "Jack Campbell",
+ size = "837130 octets" }
+
+@book{ HemryJohnG.68,
+ title = "Ad Astra",
+ author = "John G. Hemry",
+ size = "957801 octets" }
+
+@book{ HuffTanya69,
+ title = "Sing the Four Quarters",
+ author = "Tanya Huff",
+ size = "1040379 octets" }
+
+@book{ DietzWilliamC.70,
+ title = "At Empire’s Edge",
+ author = "William C. Dietz",
+ size = "1070093 octets" }
+
+@book{ KroeseRobert71,
+ title = "Schrodinger's Gat",
+ author = "Robert Kroese",
+ size = "481993 octets" }
+
+@misc{ GivreCharlesRogersPaul72,
+ title = "Learning Apache Drill",
+ author = "Charles Givre and Paul Rogers",
+ size = "8872618 octets" }
+
+@misc{ OsingaDouwe73,
+ title = "Deep Learning Cookbook",
+ author = "Douwe Osinga",
+ size = "12201711 octets" }
+
+@book{ Nunez-IglesiasJuanWaltStefanvanDerDashnowHarriet74,
+ title = "Elegant SciPy: The Art of Scientific Python",
+ author = "Juan Nunez-Iglesias and Stéfan van Der Walt and Harriet Dashnow",
+ size = "31506722 octets" }
+
+@misc{ MalaskaTedSeidmanJonathan75,
+ title = "Foundations for Architecting Data Solutions",
+ author = "Ted Malaska and Jonathan Seidman",
+ size = "6864108 octets" }
+
+@book{ BengfortBenjaminBilbroRebeccaOjedaTony76,
+ title = "Applied Text Analysis With Python: Enabling Language-Aware Data Products With Machine Learning",
+ author = "Benjamin Bengfort and Rebecca Bilbro and Tony Ojeda",
+ size = "14670000 octets" }
+
+@book{ AraguesAnthony77,
+ title = "Visualizing Streaming Data: Interactive Analysis Beyond Static Limits",
+ author = "Anthony Aragues",
+ size = "34566093 octets" }
+
+@book{ NarkhedeNehaShapiraGwenPalinoTodd78,
+ title = "Kafka: The Definitive Guide: Real-Time Data and Stream Processing at Scale",
+ author = "Neha Narkhede and Gwen Shapira and Todd Palino",
+ size = "6458251 octets" }
+
+@misc{ HilfigerJohnJay79,
+ title = "Graphing Data with R",
+ author = "John Jay Hilfiger",
+ size = "17670156 octets" }
+
+@book{ AkidauTylerChernyakSlavaLaxReuven80,
+ title = "Streaming Systems: The What, Where, When, and How of Large-Scale Data Processing",
+ author = "Tyler Akidau and Slava Chernyak and Reuven Lax",
+ size = "58473880 octets" }
+
+@book{ BrucePeterBruceAndrew81,
+ title = "Practical Statistics for Data Scientists: 50 Essential Concepts",
+ author = "Peter Bruce and Andrew Bruce",
+ size = "13622091 octets" }
+
+@book{ KunigkJanBussIanWilkinsonPaulGeorgeLars82,
+ title = "Architecting Modern Data Platforms: A Guide to Enterprise Hadoop at Scale",
+ author = "Jan Kunigk and Ian Buss and Paul Wilkinson and Lars George",
+ size = "18857011 octets" }
+
+@misc{ HopeTomResheffYehezkelS.LiederItay83,
+ title = "Learning TensorFlow",
+ author = "Tom Hope and Yehezkel S. Resheff and Itay Lieder",
+ size = "13273949 octets" }
+
+@book{ SpaggiariJean-MarcKovacevicMladenNolandBrockBosshartRyan84,
+ title = "Getting Started With Kudu: Perform Fast Analytics on Fast Data",
+ author = "Jean-Marc Spaggiari and Mladen Kovacevic and Brock Noland and Ryan Bosshart",
+ size = "5783070 octets" }
+
+@misc{ SleeperRyan85,
+ title = "Practical Tableau",
+ author = "Ryan Sleeper",
+ size = "42029820 octets" }
+
+@misc{ RyzaSandyLasersonUriOwenSeanWillsJosh88,
+ title = "Advanced Analytics with Spark",
+ author = "Sandy Ryza and Uri Laserson and Sean Owen and Josh Wills",
+ size = "5737456 octets" }
+
+@book{ IanssonTuvie102,
+ title = "ШлÑпа Волшебника",
+ author = "Туве ЯнÑÑон",
+ size = "451876 octets" }
+
+@misc{ RassadinSt.SarnovB.116,
+ title = "Ð’ Ñтране литературных героев",
+ author = "Ст. РаÑÑадин and Б. Сарнов",
+ size = "8111634 octets" }
+
+@misc{ EinshtieinAlbiert117,
+ title = "Собрание научных трудов. Том II-2",
+ author = "Ðльберт Эйнштейн",
+ size = "3585277 octets" }
+
+@misc{ EinshtieinAlbiert118,
+ title = "Собрание научных трудов. Том II-3",
+ author = "Ðльберт Эйнштейн",
+ size = "3372763 octets" }
+
+@book{ RaoDelipMcMahanBrian119,
+ title = "Natural Language Processing With PyTorch: Build Intelligent Language Applications Using Deep Learning",
+ author = "Delip Rao and Brian McMahan",
+ size = "16071430 octets" }
+
+@misc{ EinshtieinAlbiert120,
+ title = "Собрание научных трудов. Том II-1",
+ author = "Ðльберт Эйнштейн",
+ size = "3442507 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich121,
+ title = "ТеоретичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°. Том 5. СтатиÑтичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "5045142 octets" }
+
+@misc{ KovalIurii122,
+ title = "Ð¢Ñ€Ð¸Ð»Ð¾Ð³Ð¸Ñ Ð¾ ВаÑе КуролеÑове",
+ author = "Юрий Коваль",
+ size = "9798850 octets" }
+
+@misc{ RytovS.M.123,
+ title = "Введение в ÑтатиÑтичеÑкую радиофизику. ЧаÑÑ‚ÑŒ 1. Случайные процеÑÑÑ‹",
+ author = "С. М. Рытов",
+ size = "7228939 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich124,
+ title = "ТеоретичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°. Том 10. ФизичеÑÐºÐ°Ñ ÐºÐ¸Ð½ÐµÑ‚Ð¸ÐºÐ°",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "4397914 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich125,
+ title = "ТеоретичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°. Том 1. Механика",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "1973204 octets" }
+
+@book{ RavichandiranSudharsan126,
+ title = "Hands-On Reinforcement Learning With Python: Master Reinforcement and Deep Reinforcement Learning Using OpenAI Gym and TensorFlow",
+ author = "Sudharsan Ravichandiran",
+ size = "17701242 octets" }
+
+@book{ ChandrasekharS.127,
+ title = "Stochastic Problems in Physics and Astronomy: Reviews of Modern Physics, V15",
+ author = "S. Chandrasekhar",
+ size = "1039229 octets" }
+
+@misc{ RytovS.M.KravtsovIu.A.TatarskiiV.I.128,
+ title = "Введение в ÑтатиÑтичеÑкую радиофизику. ЧаÑÑ‚ÑŒ 2. Случайные полÑ",
+ author = "С. Ðœ. Рытов and Ю. Ð. Кравцов and Ð’. И. ТатарÑкий",
+ size = "12648427 octets" }
+
+
+@book{ ScutariMarco130,
+ title = "Bayesian Networks: With Examples in R",
+ author = "Marco Scutari",
+ size = "2202016 octets" }
+
+@misc{ LietsStanislavIezhi131,
+ title = "Ðфоризмы",
+ author = "СтаниÑлав Ежи Лец",
+ size = "29916 octets" }
+
+@book{ WrenningeMagnus132,
+ title = "Production Volume Rendering: Design and Implementation",
+ author = "Magnus Wrenninge",
+ size = "39879408 octets" }
+
+@misc{ EinshtieinAlbiert133,
+ title = "Собрание научных трудов. Том I-2",
+ author = "Ðльберт Эйнштейн",
+ size = "5090877 octets" }
+
+@misc{ EinshtieinAlbiert134,
+ title = "Собрание научных трудов. Том I-1",
+ author = "Ðльберт Эйнштейн",
+ size = "3650473 octets" }
+
+@book{ DowneyAllenB.135,
+ title = "Think Python",
+ author = "Allen B. Downey",
+ size = "4410735 octets" }
+
+@book{ WickhamHadley136,
+ title = "Ggplot2: Elegant Graphics for Data Analysis",
+ author = "Hadley Wickham",
+ size = "9490710 octets" }
+
+@book{ Various137,
+ title = "The Fleming Files: Allan Fleming's Life and Works",
+ author = "Various",
+ size = "15825798 octets" }
+
+@misc{ Various138,
+ title = "Devil's Artisan \#77 Fall Winter 2015",
+ author = "Various",
+ size = "29929919 octets" }
+
+@misc{ ShmarakovRomanLvovich139,
+ title = "ПоÑÐ·Ð¸Ñ ÐšÐ»Ð°Ð²Ð´Ð¸Ð°Ð½Ð° в руÑÑкой литературе",
+ author = "Роман Львович Шмараков",
+ size = "6670373 octets" }
+
+@book{ CozziPatrickRingKevin140,
+ title = "3D Engine Design for Virtual Globes",
+ author = "Patrick Cozzi and Kevin Ring",
+ size = "106148570 octets" }
+
+@misc{ KabacoffRobertI.141,
+ title = "R in Action, Second Edition",
+ author = "Robert I. Kabacoff",
+ size = "20214196 octets" }
+
+@misc{ RudnitskiiIaroslavB.142,
+ title = "Етимологічний Ñловник українÑької мови, том 1",
+ author = "ЯроÑлав Б. Рудницькій",
+ size = "7449393 octets" }
+
+@book{ WakefieldJon143,
+ title = "Bayesian and Frequentist Regression Methods",
+ author = "Jon Wakefield",
+ size = "10569500 octets" }
+
+@misc{ RudnitskiiIaroslavB.144,
+ title = "Етимологічний Ñловник українÑької мови, том 2",
+ author = "ЯроÑлав Б. Рудницькій",
+ size = "10597785 octets" }
+
+@book{ BjelkhagenHansBrotherton-RatcliffeDavid145,
+ title = "Ultra-Realistic Imaging: Advanced Techniques in Analogue and Digital Colour Holography",
+ author = "Hans Bjelkhagen and David Brotherton-Ratcliffe",
+ size = "152193374 octets" }
+
+@book{ AlbertJim146,
+ title = "Bayesian Computation With R: Second Edition",
+ author = "Jim Albert",
+ size = "3725845 octets" }
+
+@book{ LifshitsIliaMikhailovichGriedieskulSierghieiAndrieievichPasturLieonidAndrieievich147,
+ title = "Введение в теорию неупорÑдоченных ÑиÑтем",
+ author = "Ð˜Ð»ÑŒÑ ÐœÐ¸Ñ…Ð°Ð¹Ð»Ð¾Ð²Ð¸Ñ‡ Лифшиц and Сергей Ðндреевич ГредеÑкул and Леонид Ðндреевич ПаÑтур",
+ size = "3478352 octets" }
+
+@book{ SpivakMichael148,
+ title = "Calculus on Manifolds: A Modern Approach to Classical Theorems of Advanced Calculus",
+ author = "Michael Spivak",
+ size = "1671524 octets" }
+
+@book{ JanertPhilippK.149,
+ title = "Gnuplot in Action: Understanding Data with Graphs",
+ author = "Philipp K. Janert",
+ size = "8128011 octets" }
+
+@misc{ BrauerRalfC.150,
+ title = "Healthy Cooking Tips, Techniques, and Tricks",
+ author = "Ralf C. Brauer",
+ size = "5305257 octets" }
+
+@book{ AdichieChimamandaNgozi151,
+ title = "Americanah",
+ author = "Chimamanda Ngozi Adichie",
+ size = "1004890 octets" }
+
+@book{ EddelbuettelDirk152,
+ title = "Seamless R and C++ Integration With Rcpp",
+ author = "Dirk Eddelbuettel",
+ size = "3533488 octets" }
+
+@book{ BirdStevenFettigAbeKleinEwanLoperEdward153,
+ title = "Natural Language Processing with Python",
+ author = "Steven Bird and Abe Fettig and Ewan Klein and Edward Loper",
+ size = "5385868 octets" }
+
+@misc{ MatvieievIvanKomarovIlia154,
+ title = "ÐÑ…Ð¸Ð»Ð»ÐµÑ Ð¸ Черепаха",
+ author = "Иван Матвеев and Ð˜Ð»ÑŒÑ ÐšÐ¾Ð¼Ð°Ñ€Ð¾Ð²",
+ size = "944778 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich155,
+ title = "ТеоретичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°. Том 3. ÐšÐ²Ð°Ð½Ñ‚Ð¾Ð²Ð°Ñ Ð¼ÐµÑ…Ð°Ð½Ð¸ÐºÐ°: нерелÑтивиÑÑ‚. теориÑ",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "8773691 octets" }
+
+@book{ ReitzKennethSchlusserTanya157,
+ title = "The Hitchhiker’s Guide To Python",
+ author = "Kenneth Reitz and Tanya Schlusser",
+ size = "5492946 octets" }
+
+@book{ McKellarJessicaFettigAbe158,
+ title = "Twisted Network Programming Essentials",
+ author = "Jessica McKellar and Abe Fettig",
+ size = "9780700 octets" }
+
+@book{ GentlemanRobertCareyVincentHuberWolfgangIrizarryRafaelDudoitSandrine159,
+ title = "Bioinformatics and Computational Biology Solutions Using R and Bioconductor",
+ author = "Robert Gentleman and Vincent Carey and Wolfgang Huber and Rafael Irizarry and Sandrine Dudoit",
+ size = "9299749 octets" }
+
+@book{ KruschkeJohnK.160,
+ title = "Doing Bayesian Data Analysis: A Tutorial With R, JAGS, and Stan",
+ author = "John K. Kruschke",
+ size = "33546392 octets" }
+
+@misc{ MoriYuzan161,
+ title = "Hamonshū",
+ author = "Mori, Yūzan",
+ size = "6487112 octets" }
+
+@book{ ONeillRob162,
+ title = "Digital Character Development: Theory and Practice, Second Edition",
+ author = "Rob O'Neill",
+ size = "33111656 octets" }
+
+@book{ GelmanAndrewCarlinJohnB.SternHalS.DunsonDavidB.VehtariAkiRubinDonaldB.163,
+ title = "Bayesian Data Analysis, Third Edition",
+ author = "Andrew Gelman and John B. Carlin and Hal S. Stern and David B. Dunson and Aki Vehtari and Donald B. Rubin",
+ size = "12409111 octets" }
+
+@book{ KapoorAmita164,
+ title = "Hands-On Artificial Intelligence for IoT: Expert Machine Learning and Deep Learning Techniques for Developing Smarter IoT Systems",
+ author = "Amita Kapoor",
+ size = "23525463 octets" }
+
+@misc{ RudnitskiiIaroslavB.166,
+ title = "Етимологічний Ñловник українÑької мови, додаток",
+ author = "ЯроÑлав Б. Рудницькій",
+ size = "80026 octets" }
+
+@book{ JansenStefan167,
+ title = "Hands-On Machine Learning for Algorithmic Trading: Design and Implement Investment Strategies Based on Smart Algorithms That Learn From Data Using Python",
+ author = "Stefan Jansen",
+ size = "26262512 octets" }
+
+@book{ MikhailikIeliena168,
+ title = "Стихи",
+ author = "Елена Михайлик",
+ size = "170000 octets" }
+
+@misc{ MaguireWilliam169,
+ title = "Plain TeX with PostScript",
+ author = "William Maguire",
+ size = "21725612 octets" }
+
+@book{ PielievinViktor170,
+ title = "ÐнанаÑÐ½Ð°Ñ Ð²Ð¾Ð´Ð° Ð´Ð»Ñ Ð¿Ñ€ÐµÐºÑ€Ð°Ñной дамы (Ñборник)",
+ author = "Виктор Пелевин",
+ size = "614041 octets" }
+
+@book{ DowneyAllenB.171,
+ title = "Think Bayes",
+ author = "Allen B. Downey",
+ size = "7409372 octets" }
+
+@book{ BishopChristopherM.172,
+ title = "Pattern Recognition and Machine Learning",
+ author = "Christopher M. Bishop",
+ size = "18090775 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich173,
+ title = "Краткий ÐºÑƒÑ€Ñ Ñ‚ÐµÐ¾Ñ€ÐµÑ‚Ð¸Ñ‡ÐµÑкой физики. Том 1. Механика, Ñлектродинамика",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "2126449 octets" }
+
+
+@misc{ KuttnerHenry175,
+ title = "The best of Kuttner",
+ author = "Henry Kuttner",
+ size = "629262 octets" }
+
+@book{ VasilevIvanSlaterDanielSpacagnaGianmarioRoelantsPeterZoccaValentino176,
+ title = "Python Deep Learning: Exploring Deep Learning Techniques and Neural Network Architectures With PyTorch, Keras, and TensorFlow, 2nd Edition",
+ author = "Ivan Vasilev and Daniel Slater and Gianmario Spacagna and Peter Roelants and Valentino Zocca",
+ size = "25295227 octets" }
+
+@book{ PercivalHarry177,
+ title = "Test-Driven Development with Python",
+ author = "Harry Percival",
+ size = "12187802 octets" }
+
+@book{ MitchellRyan178,
+ title = "Web Scraping with Python",
+ author = "Ryan Mitchell",
+ size = "6258727 octets" }
+
+@book{ MakovietskiiP.V.179,
+ title = "Смотри Ð’ Корень! Сборник любопытных задач и вопроÑов",
+ author = "П. В. Маковецкий",
+ size = "4814664 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich180,
+ title = "ТеоретичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°. Том 4. ÐšÐ²Ð°Ð½Ñ‚Ð¾Ð²Ð°Ñ Ñлектродинамика",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "6728582 octets" }
+
+@misc{ KnuthDonaldE.181,
+ title = "The new versions of TeX and Metafont",
+ author = "Donald E. Knuth",
+ size = "45744 octets" }
+
+@book{ VenablesW.N.RipleyB.D.182,
+ title = "Modern Applied Statistics With S",
+ author = "W. N. Venables and B. D. Ripley",
+ size = "3165454 octets" }
+
+@book{ BridsonRobert183,
+ title = "Fluid Simulation for Computer Graphics",
+ author = "Robert Bridson",
+ size = "2509154 octets" }
+
+@book{ GopalakrishnanRevathiVenkateswarluAvinash184,
+ title = "Machine Learning for Mobile: Practical Guide to Building Intelligent Mobile Applications Powered by Machine Learning",
+ author = "Revathi Gopalakrishnan and Avinash Venkateswarlu",
+ size = "11787182 octets" }
+
+@misc{ DoumontJean-luc185,
+ title = "Traditions, templates, and group leaders",
+ author = "Jean-luc Doumont",
+ size = "316188 octets" }
+
+@misc{ LipschutzSeymour186,
+ title = "Schaum's Outline of Theory \& Problems of Linear Algebra 2ed",
+ author = "Lipschutz, Seymour",
+ size = "5178870 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich187,
+ title = "ТеоретичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°. Том 9. СтатиÑтичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°, чаÑÑ‚ÑŒ 2: Ñ‚ÐµÐ¾Ñ€Ð¸Ñ ÐºÐ¾Ð½Ð´ÐµÐ½Ñированного ÑоÑтоÑниÑ",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "3363538 octets" }
+
+@book{ JaynesE.T.188,
+ title = "Probability Theory: The Logic of Science",
+ author = "E. T. Jaynes",
+ size = "8223871 octets" }
+
+@book{ RamalhoLuciano189,
+ title = "Fluent Python",
+ author = "Luciano Ramalho",
+ size = "14072728 octets" }
+
+@book{ LietsStanislavIezhi190,
+ title = "ÐепричеÑанные мыÑли",
+ author = "СтаниÑлав Ежи Лец",
+ size = "115489 octets" }
+
+@book{ NayfehAliH.191,
+ title = "Perturbation Methods",
+ author = "Ali H. Nayfeh",
+ size = "3219686 octets" }
+
+@book{ GennesPierre-Gillesde192,
+ title = "Scaling Concepts in Polymer Physics",
+ author = "Pierre-Gilles de Gennes",
+ size = "8954270 octets" }
+
+@book{ AversaDavideKyawAungSithuPetersClifford193,
+ title = "Unity Artificial Intelligence Programming: Add Powerful, Believable, and Fun AI Entities in Your Game With the Power of Unity 2018!, 4th Edition",
+ author = "Dr. Davide Aversa and Aung Sithu Kyaw and Clifford Peters",
+ size = "7963809 octets" }
+
+@book{ CarrollLewis194,
+ title = "Alice's Adventures in Wonderland",
+ author = "Lewis Carroll and George A. Walker",
+ size = "7314002 octets" }
+
+@book{ BasinskiiPaviel195,
+ title = "Лев ТолÑтой: БегÑтво из раÑ",
+ author = "Павел БаÑинÑкий",
+ size = "1660046 octets" }
+
+@book{ DongenM.R.C.van196,
+ title = "LaTeX and Friends",
+ author = "M. R. C. van Dongen",
+ size = "10594829 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich197,
+ title = "ТеоретичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°. Том 2. Ð¢ÐµÐ¾Ñ€Ð¸Ñ ÐŸÐ¾Ð»Ñ",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "5748433 octets" }
+
+@book{ PapiernyiVladimir198,
+ title = "Культура два",
+ author = "Владимир Паперный",
+ size = "2093754 octets" }
+
+@book{ FriedmanTrevorHastieandRobertTibshiraniandJerome199,
+ title = "The Elements of Statistical Learning: Data Mining, Inference, and Prediction, Second Edition",
+ author = "Trevor Hastie and Robert Tibshirani and Jerome Friedman",
+ size = "16646027 octets" }
+
+@misc{ EinshtieinAlbiert200,
+ title = "Собрание научных трудов. Том III-1",
+ author = "Ðльберт Эйнштейн",
+ size = "3865866 octets" }
+
+@misc{ EinshtieinAlbiert201,
+ title = "Собрание научных трудов. Том III-2",
+ author = "Ðльберт Эйнштейн",
+ size = "3842381 octets" }
+
+@book{ DmitriievValientinGrighorievich203,
+ title = "Скрывшие Ñвое имÑ: (из иÑтории анонимов и пÑевдонимов)",
+ author = "Валентин Григорьевич Дмитриев",
+ size = "18206319 octets" }
+
+@misc{ Anonymous204,
+ title = "Science Darwin 200 Collection",
+ author = "Anonymous",
+ size = "4204326 octets" }
+
+@book{ LubanovicBill205,
+ title = "Introducing Python",
+ author = "Bill Lubanovic",
+ size = "7940573 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich206,
+ title = "Краткий ÐºÑƒÑ€Ñ Ñ‚ÐµÐ¾Ñ€ÐµÑ‚Ð¸Ñ‡ÐµÑкой физики. Том 2. ÐšÐ²Ð°Ð½Ñ‚Ð¾Ð²Ð°Ñ Ð¼ÐµÑ…Ð°Ð½Ð¸ÐºÐ°",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "2971164 octets" }
+
+@book{ HahneFlorianHuberWolfgangGentlemanRobertFalconSeth207,
+ title = "Bioconductor Case Studies",
+ author = "Florian Hahne and Wolfgang Huber and Robert Gentleman and Seth Falcon",
+ size = "11547852 octets" }
+
+@misc{ GoyaFrancisco208,
+ title = "Caprichos",
+ author = "Francisco Goya",
+ size = "10551971 octets" }
+
+@book{ MagnorMarcusA.GrauOliverSorkine-HornungOlgaTheobaltChristian210,
+ title = "Digital Representations of the Real World: How to Capture, Model, and Render Visual Reality",
+ author = "Marcus A. Magnor and Oliver Grau and Olga Sorkine-Hornung and Christian Theobalt",
+ size = "281418816 octets" }
+
+@book{ BivandRogerS.PebesmaEdzerGomez-RubioVirgilio211,
+ title = "Applied Spatial Data Analysis With R",
+ author = "Roger S. Bivand and Edzer Pebesma and Virgilio Gómez-Rubio",
+ size = "10701147 octets" }
+
+@book{ GradshteynI.S.RyzhikI.M.212,
+ title = "Table of Integrals, Series, and Products",
+ author = "I. S. Gradshteyn and I. M. Ryzhik",
+ size = "7660295 octets" }
+
+@book{ EngelKlaus213,
+ title = "Real-Time Volume Graphics",
+ author = "Klaus Engel",
+ size = "63340271 octets" }
+
+@book{ ShanmugamaniRajalingappaa214,
+ title = "Deep Learning for Computer Vision: Expert Techniques to Train Advanced Neural Networks Using TensorFlow and Keras",
+ author = "Rajalingappaa Shanmugamani",
+ size = "54081550 octets" }
+
+@book{ KogaYoshikata215,
+ title = "Solution Thermodynamics and its Application to Aqueous Solutions",
+ author = "Yoshikata Koga",
+ size = "21239041 octets" }
+
+@book{ MartelloSilvanoTothPaolo216,
+ title = "Knapsack Problems: Algorithms and Computer Implementations",
+ author = "Silvano Martello and Paolo Toth",
+ size = "23602991 octets" }
+
+@book{ Anonymous217,
+ title = "R Programming",
+ author = "Anonymous",
+ size = "4101130 octets" }
+
+@book{ OrtegaFranciscoR.219,
+ title = "Interaction Design for 3D User Interfaces: The World of Modern Input Devices for Research, Applications, and Game Development",
+ author = "Francisco R. Ortega",
+ size = "34436122 octets" }
+
+@misc{ KaghanskaiaMaiiaBar-SiellaZieev220,
+ title = "ÐœÐ°Ð¹Ñ ÐšÐ°Ð³Ð°Ð½ÑÐºÐ°Ñ - МаÑтер Ð“Ð°Ð¼Ð±Ñ Ð¸ Маргарита (СочинениÑ, Ñ‚. 2)",
+ author = "ÐœÐ°Ð¹Ñ ÐšÐ°Ð³Ð°Ð½ÑÐºÐ°Ñ and ЗеÑв Бар-Селла",
+ size = "2260642 octets" }
+
+@book{ KruschkeJohnK.221,
+ title = "Doing Bayesian Data Analysis: A Tutorial With R and BUGS",
+ author = "John K. Kruschke",
+ size = "10387327 octets" }
+
+@book{ avtorabiez222,
+ title = "Задачи лингвиÑтичеÑких олимпиад 1965-1975",
+ author = "без автора",
+ size = "5164222 octets" }
+
+@book{ KuboRioghoIskhimuraKhiroshiUsuiTsuniemaruKhashitsumieNatsuki223,
+ title = "СтатиÑтичеÑÐºÐ°Ñ Ð¼ÐµÑ…Ð°Ð½Ð¸ÐºÐ°",
+ author = "Риого Кубо and Хироши ИÑхимура and ТÑунемару УÑуи and ÐатÑуки Хашицуме",
+ size = "5090853 octets" }
+
+@book{ RothmanDenis224,
+ title = "Artificial Intelligence by Example: Develop Machine Intelligence From Scratch Using Real Artificial Intelligence Use Cases",
+ author = "Denis Rothman",
+ size = "15712161 octets" }
+
+@book{ BiermanGeraldJ.226,
+ title = "Factorization Methods for Discrete Sequential Estimation",
+ author = "Gerald J. Bierman",
+ size = "2984468 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich227,
+ title = "ТеоретичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°. Том 6. Гидродинамика",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "6247502 octets" }
+
+@misc{ WalkerGeorgeA.228,
+ title = "The Mysterious Death of Tom Thompson",
+ author = "George A. Walker",
+ size = "14634332 octets" }
+
+@book{ TinwellAngela229,
+ title = "The Uncanny Valley in Games and Animation",
+ author = "Angela Tinwell",
+ size = "9985072 octets" }
+
+@book{ FlobierGiustav230,
+ title = "ГоÑпожа Бовари",
+ author = "ГюÑтав Флобер",
+ size = "902539 octets" }
+
+@book{ DalgaardPeter231,
+ title = "Introductory Statistics With R",
+ author = "Peter Dalgaard",
+ size = "3041126 octets" }
+
+@misc{ BurnsPatrick232,
+ title = "R inferno",
+ author = "Patrick Burns",
+ size = "947802 octets" }
+
+@book{ VanderplasJacobT.VanderPlasJake233,
+ title = "Python Data Science Handbook: Essential Tools for Working With Data",
+ author = "Jacob T. Vanderplas and Jake VanderPlas",
+ size = "17165292 octets" }
+
+@book{ BollobasBela234,
+ title = "Modern Graph Theory",
+ author = "Bela Bollobas",
+ size = "35564964 octets" }
+
+@book{ WattMartinCoumansErwinElkouraGeorgeHendersonRonaldKraemerManuelLaitJeffReindersJames235,
+ title = "Multithreading for Visual Effects",
+ author = "Martin Watt and Erwin Coumans and George Elkoura and Ronald Henderson and Manuel Kraemer and Jeff Lait and James Reinders",
+ size = "16748311 octets" }
+
+@book{ BieriozkinIuriiIevghienievich236,
+ title = "Мифы индейцев Южной Ðмерики. Книга Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "362933 octets" }
+
+@misc{ ShmarakovRomanLvovich237,
+ title = "Пикколомини",
+ author = "Роман Львович Шмараков",
+ size = "406016 octets" }
+
+@misc{ MielnichukO.SPotiebniInstitutMovoznavstvaIm.O.O.238,
+ title = "Етимологічний Ñловник українÑької мови: У-Я",
+ author = "О. С Мельничук and ІнÑтитут МовознавÑтва Ім. О. О. Потебни",
+ size = "6311339 octets" }
+
+@misc{ CederNaomiR.240,
+ title = "The Quick Python Book, Second Edition",
+ author = "Naomi R. Ceder",
+ size = "6214738 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich241,
+ title = "ТеоретичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°. Том 7. Ð¢ÐµÐ¾Ñ€Ð¸Ñ ÑƒÐ¿Ñ€ÑƒÐ³Ð¾Ñти",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "2963546 octets" }
+
+@misc{ GiliensonP.G.242,
+ title = "Справочник художеÑтвенного и техничеÑкого редактора",
+ author = "П. Г. ГиленÑон",
+ size = "217907 octets" }
+
+@book{ LandauLievDavidovichLifshitsIevghieniiMikhailovich243,
+ title = "ТеоретичеÑÐºÐ°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°. Том 8. Электродинамика Ñплошных Ñред",
+ author = "Лев Давидович Ландау and Евгений Михайлович Лифшиц",
+ size = "4596107 octets" }
+
+@misc{ BoschHieronymus244,
+ title = "Bilder",
+ author = "Hieronymus Bosch",
+ size = "11153983 octets" }
+
+@book{ FisherI.Z.245,
+ title = "Statistical Theory of Liquids",
+ author = "I. Z. Fisher",
+ size = "5906606 octets" }
+
+@misc{ Anonymous246,
+ title = "Clients for UNIX® Administrator’s Guide",
+ author = "Anonymous",
+ size = "1572459 octets" }
+
+@book{ KolaczykEricD.CsardiGabor247,
+ title = "Statistical Analysis of Network Data With R",
+ author = "Eric D. Kolaczyk and Gábor Csárdi",
+ size = "5194886 octets" }
+
+@book{ ReifF.248,
+ title = "Fundamentals of Statistical and Thermal Physics",
+ author = "F. Reif",
+ size = "7853485 octets" }
+
+@book{ PenroseRoger249,
+ title = "The Road to Reality: A Complete Guide to the Laws of the Universe",
+ author = "Roger Penrose",
+ size = "14511671 octets" }
+
+@misc{ GoyaFrancisco250,
+ title = "Desastres de la Guerra",
+ author = "Francisco Goya",
+ size = "11169231 octets" }
+
+@book{ HoffPeterD.251,
+ title = "A First Course in Bayesian Statistical Methods",
+ author = "Peter D. Hoff",
+ size = "3314583 octets" }
+
+@book{ TarlieIevghieniiViktorovich252,
+ title = "Из литературного наÑÐ»ÐµÐ´Ð¸Ñ Ð°ÐºÐ°Ð´ÐµÐ¼Ð¸ÐºÐ° Е.Ð’. Тарле",
+ author = "Евгений Викторович Тарле",
+ size = "5800665 octets" }
+
+@book{ KirkMatthew253,
+ title = "Thoughtful Machine Learning in Python",
+ author = "Matthew Kirk",
+ size = "7727012 octets" }
+
+@book{ ObeReginaO.HsuLeoS.254,
+ title = "PostGIS in Action",
+ author = "Regina O. Obe and Leo S. Hsu",
+ size = "10619422 octets" }
+
+@book{ KuhnThomasS.255,
+ title = "The Structure of Scientific Revolutions",
+ author = "Thomas S. Kuhn",
+ size = "825544 octets" }
+
+@misc{ GillelandEric256,
+ title = "An introduction to the analysis of extreme values using R and extRemes",
+ author = "Eric Gilleland",
+ size = "3682344 octets" }
+
+@book{ BondyJohnAdrianMurtyUppaluriS.R.257,
+ title = "Graph Theory With Applications",
+ author = "John Adrian Bondy and Uppaluri S. R. Murty",
+ size = "23976481 octets" }
+
+@book{ MielnichukO.SPotiebniInstitutMovoznavstvaIm.O.O.258,
+ title = "Етимологічний Ñловник українÑької мови: Ð-Г",
+ author = "О. С Мельничук and ІнÑтитут МовознавÑтва Ім. О. О. Потебни",
+ size = "9794645 octets" }
+
+@misc{ MielnichukO.SPotiebniInstitutMovoznavstvaIm.O.O.259,
+ title = "Етимологічний Ñловник українÑької мови: Д-Копці",
+ author = "О. С Мельничук and ІнÑтитут МовознавÑтва Ім. О. О. Потебни",
+ size = "8359428 octets" }
+
+@misc{ MielnichukO.SPotiebniInstitutMovoznavstvaIm.O.O.260,
+ title = "Етимологічний Ñловник українÑької мови: Кора-Ðœ",
+ author = "О. С Мельничук and ІнÑтитут МовознавÑтва Ім. О. О. Потебни",
+ size = "9635313 octets" }
+
+@misc{ MielnichukO.SPotiebniInstitutMovoznavstvaIm.O.O.261,
+ title = "Етимологічний Ñловник українÑької мови: Ð-П",
+ author = "О. С Мельничук and ІнÑтитут МовознавÑтва Ім. О. О. Потебни",
+ size = "7027920 octets" }
+
+@misc{ MielnichukO.SPotiebniInstitutMovoznavstvaIm.O.O.262,
+ title = "Етимологічний Ñловник українÑької мови: Р-Т",
+ author = "О. С Мельничук and ІнÑтитут МовознавÑтва Ім. О. О. Потебни",
+ size = "6912538 octets" }
+
+@misc{ LievinM.L.RytovS.M.263,
+ title = "Ð¢ÐµÐ¾Ñ€Ð¸Ñ Ñ€Ð°Ð²Ð½Ð¾Ð²ÐµÑных тепловых флуктуаций в Ñлектродинамике",
+ author = "М. Л. Левин and С. М. Рытов",
+ size = "6027861 octets" }
+
+@misc{ SchostakJohnSchostakJill264,
+ title = "Writing Research Critically",
+ author = "John Schostak and Jill Schostak",
+ size = "1766619 octets" }
+
+@book{ BorceaCristianTalasilaManoopCurtmolaReza265,
+ title = "Mobile Crowdsensing",
+ author = "Cristian Borcea and Manoop Talasila and Reza Curtmola",
+ size = "4659560 octets" }
+
+@misc{ FomienkoA.T.266,
+ title = "ÐаглÑÐ´Ð½Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ Ð¸ топологиÑ",
+ author = "Ð. Т. Фоменко",
+ size = "14916017 octets" }
+
+@book{ WolffMichael267,
+ title = "Fire and Fury",
+ author = "Michael Wolff",
+ size = "1873873 octets" }
+
+@misc{ KhokniR.IstvudDzh.268,
+ title = "ЧиÑленное моделирование методом чаÑтиц",
+ author = "Р. Хокни and Дж. ИÑтвуд",
+ size = "21449248 octets" }
+
+@book{ JamesGarethWittenDanielaHastieTrevorTibshiraniRobert269,
+ title = "An Introduction to Statistical Learning: With Applications in R",
+ author = "Gareth James and Daniela Witten and Trevor Hastie and Robert Tibshirani",
+ size = "13919079 octets" }
+
+@misc{ KaghanskaiaMaiia270,
+ title = "ÐœÐ°Ð¹Ñ ÐšÐ°Ð³Ð°Ð½ÑÐºÐ°Ñ - ШутовÑкой хоровод (СочинениÑ, Ñ‚. 1)",
+ author = "ÐœÐ°Ð¹Ñ ÐšÐ°Ð³Ð°Ð½ÑкаÑ",
+ size = "4235321 octets" }
+
+@book{ GrinbergMiguel271,
+ title = "Flask Web Development",
+ author = "Miguel Grinberg",
+ size = "5918173 octets" }
+
+@misc{ IanssonTuvie272,
+ title = "Ð’ конце ноÑбрÑ",
+ author = "Туве ЯнÑÑон",
+ size = "452743 octets" }
+
+@misc{ IanssonTuvie273,
+ title = "Маленькие тролли или большое наводнение",
+ author = "Туве ЯнÑÑон",
+ size = "780495 octets" }
+
+@misc{ IanssonTuvie274,
+ title = "Муми-тролль и комета",
+ author = "Туве ЯнÑÑон",
+ size = "638684 octets" }
+
+@book{ IanssonTuvie275,
+ title = "ОпаÑное лето",
+ author = "Туве ЯнÑÑон",
+ size = "417665 octets" }
+
+@book{ IanssonTuvie276,
+ title = "Папа и море",
+ author = "Туве ЯнÑÑон",
+ size = "547633 octets" }
+
+@misc{ IanssonTuvie277,
+ title = "Ð’Ð¾Ð»ÑˆÐµÐ±Ð½Ð°Ñ Ð·Ð¸Ð¼Ð°",
+ author = "Туве ЯнÑÑон",
+ size = "1126654 octets" }
+
+@misc{ IanssonTuvie278,
+ title = "Мемуары папы Муми-троллÑ",
+ author = "Туве ЯнÑÑон",
+ size = "517345 octets" }
+
+@misc{ MikhailikIeliena280,
+ title = "По-нашему не бывать",
+ author = "Елена Михайлик",
+ size = "409023 octets" }
+
+@misc{ MikhailikIurii281,
+ title = "Огонь Ñлучайный",
+ author = "Юрий Михайлик",
+ size = "563903 octets" }
+
+@book{ WilkinsonLeland293,
+ title = "The Grammar of Graphics",
+ author = "Leland Wilkinson",
+ size = "14685077 octets" }
+
+@book{ GapovaIeliena295,
+ title = "КлаÑÑÑ‹ наций: феминиÑÑ‚ÑÐºÐ°Ñ ÐºÑ€Ð¸Ñ‚Ð¸ÐºÐ° нациоÑтроительÑтва",
+ author = "Елена Гапова",
+ size = "2862322 octets" }
+
+@misc{ KonobieievIuriiPavlinchukVitaliiRabotnovNikolaiTurchinVladimir296,
+ title = "Физики шутÑÑ‚",
+ author = "Юрий Конобеев and Виталий Павлинчук and Ðиколай Работнов and Владимир Турчин",
+ size = "1198536 octets" }
+
+@misc{ KonobieievIuriiPavlinchukVitaliiRabotnovNikolaiTurchinVladimir297,
+ title = "Физики продолжают шутить",
+ author = "Юрий Конобеев and Виталий Павлинчук and Ðиколай Работнов and Владимир Турчин",
+ size = "4957645 octets" }
+
+@misc{ RuckertMartin298,
+ title = "HINT: The File Format: Reflowable Output for TeX",
+ author = "Martin Ruckert",
+ size = "887485 octets" }
+
+@misc{ BieriozkinIuriiIevghienievich299,
+ title = "Фольклор и поÑтфольклор: Ñтруктура, типологиÑ, Ñемиотика (СИ)",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "273595 octets" }
+
+@misc{ BieriozkinIuriiIevghienievich300,
+ title = "Мифы глубокой древноÑти",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "345301 octets" }
+
+@book{ BieriozkinIuriiIevghienievich301,
+ title = "Из Старого в Ðовый Свет: Мифы народов мира",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "1958499 octets" }
+
+@book{ BieriozkinIuriiIevghienievich302,
+ title = "Ð˜Ð¼Ð¿ÐµÑ€Ð¸Ñ Ð¸Ð½ÐºÐ¾Ð²",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "1947296 octets" }
+
+@book{ BieriozkinIuriiIevghienievich303,
+ title = "Древнее Перу. Ðовые факты — новые гипотезы",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "1654196 octets" }
+
+@book{ BieriozkinIuriiIevghienievich304,
+ title = "Инки. ИÑторичеÑкий опыт империи",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "1474531 octets" }
+
+@misc{ BieriozkinIuriiIevghienievich305,
+ title = "ИÑтоки нашей цивилизации или поворотные моменты в иÑтории (СИ)",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "67599 octets" }
+
+@book{ BieriozkinIuriiIevghienievich306,
+ title = "Ð“Ð¾Ð»Ð¾Ñ Ð´ÑŒÑвола Ñреди Ñнегов и джунглей. ИÑтоки древней религии",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "1978378 octets" }
+
+@misc{ BieriozkinIuriiIevghienievich307,
+ title = "Ðфрика, миграциÑ, мифологиÑ",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "7418259 octets" }
+
+@misc{ BieriozkinIuriiIevghienievich308,
+ title = "Между общиной и гоÑударÑтвом",
+ author = "Юрий Евгеньевич Берёзкин",
+ size = "5902797 octets" }
+
+@misc{ VasilievS.A.BieriozkinIuriiIevghienievichKozintsievA.G.310,
+ title = "Сибирь и первые американцы",
+ author = "С. Ð. ВаÑильев and Юрий Евгеньевич Берёзкин and Ð. Г. Козинцев",
+ size = "2276402 octets" }
+
+@book{ SeltmanMurielGouldingRobert311,
+ title = "Thomas Harriot's Artis Analyticae Praxis: An English Translation With Commentary",
+ author = "Muriel Seltman and Robert Goulding",
+ size = "11617790 octets" }
+
+@book{ avtorabiez312,
+ title = "Ð¡Ñ‚Ð°Ñ€ÑˆÐ°Ñ Ð­Ð´Ð´Ð°",
+ author = "без автора",
+ size = "899744 octets" }
+
+@misc{ SturlusonSnorri313,
+ title = "ÐœÐ»Ð°Ð´ÑˆÐ°Ñ Ð­Ð´Ð´Ð°",
+ author = "Снорри СтурлуÑон",
+ size = "497155 octets" }
+
+@misc{ HarteBret314,
+ title = "Selected Stories of Bret Harte",
+ author = "Bret Harte",
+ size = "302284 octets" }
+
+@book{ VaughanLee315,
+ title = "Impractical Python Projects: Playful Programming Activities to Make You Smarter",
+ author = "Lee Vaughan",
+ size = "9688005 octets" }
+
+@book{ SweigartAl316,
+ title = "Automate the Boring Stuff With Python: Practical Programming for Total Beginners",
+ author = "Al Sweigart",
+ size = "14880335 octets" }
+
+@book{ FarrellPeter317,
+ title = "Math Adventures With Python: An Illustrated Guide to Exploring Math With Code",
+ author = "Peter Farrell",
+ size = "21297834 octets" }
+
+@book{ SweigartAl318,
+ title = "Invent Your Own Computer Games With Python, 4E",
+ author = "Al Sweigart",
+ size = "12338524 octets" }
+
+@book{ SeitzJustin319,
+ title = "Black Hat Python: Python Programming for Hackers and Pentesters",
+ author = "Justin Seitz",
+ size = "6871913 octets" }
+
+@book{ McManusSean320,
+ title = "Mission Python: Code a Space Adventure Game!",
+ author = "Sean McManus",
+ size = "10443431 octets" }
+
+@book{ BriggsJasonR.321,
+ title = "Python for Kids: A Playful Introduction to Programming",
+ author = "Jason R. Briggs",
+ size = "14975098 octets" }
+
+@book{ GoodliffePete322,
+ title = "Code Craft: The Practice of Writing Excellent Code",
+ author = "Pete Goodliffe",
+ size = "9154545 octets" }
+
+@book{ SahaAmit323,
+ title = "Doing Math With Python: Use Programming to Explore Algebra, Statistics, Calculus, and More!",
+ author = "Amit Saha",
+ size = "6978480 octets" }
+
+@book{ SweigartAl324,
+ title = "Cracking Codes With Python: An Introduction to Building and Breaking Ciphers",
+ author = "Al Sweigart",
+ size = "8376706 octets" }
+
+@book{ VenkitachalamMahesh325,
+ title = "Python Playground: Geeky Projects for the Curious Programmer",
+ author = "Mahesh Venkitachalam",
+ size = "12383854 octets" }
+
+@book{ DanjouJulien326,
+ title = "Serious Python: Black-Belt Advice on Deployment, Scalability, Testing, and More",
+ author = "Julien Danjou",
+ size = "4952010 octets" }
+
+@book{ PayneBryson327,
+ title = "Teach Your Kids to Code: A Parent-Friendly Guide to Python Programming",
+ author = "Bryson Payne",
+ size = "16027061 octets" }
+
+@book{ SeitzJustin328,
+ title = "Gray Hat Python: Python Programming for Hackers and Reverse Engineers",
+ author = "Justin Seitz",
+ size = "3693360 octets" }
+
+@book{ PushkinA.S.329,
+ title = "Полное Ñобрание Ñочинений в 10 томах. Том 7",
+ author = "Ð. С. Пушкин",
+ size = "10707861 octets" }
+
+@book{ PushkinA.S.330,
+ title = "Полное Ñобрание Ñочинений в 10 томах. Том 9",
+ author = "Ð. С. Пушкин",
+ size = "1059907 octets" }
+
+@book{ PushkinA.S.331,
+ title = "Полное Ñобрание Ñочинений в 10 томах. Том 1",
+ author = "Ð. С. Пушкин",
+ size = "1642962 octets" }
+
+@book{ PushkinA.S.332,
+ title = "Полное Ñобрание Ñочинений в 10 томах. Том 10",
+ author = "Ð. С. Пушкин",
+ size = "1976164 octets" }
+
+@book{ PushkinA.S.333,
+ title = "Полное Ñобрание Ñочинений в 10 томах. Том 2",
+ author = "Ð. С. Пушкин",
+ size = "1581344 octets" }
+
+@book{ PushkinA.S.334,
+ title = "Полное Ñобрание Ñочинений в 10 томах. Том 3",
+ author = "Ð. С. Пушкин",
+ size = "1363161 octets" }
+
+@book{ PushkinA.S.335,
+ title = "Полное Ñобрание Ñочинений в 10 томах. Том 4",
+ author = "Ð. С. Пушкин",
+ size = "1660277 octets" }
+
+@book{ PushkinA.S.336,
+ title = "Полное Ñобрание Ñочинений в 10 томах. Том 5",
+ author = "Ð. С. Пушкин",
+ size = "1320833 octets" }
+
+@book{ PushkinA.S.337,
+ title = "Полное Ñобрание Ñочинений в 10 томах. Том 6",
+ author = "Ð. С. Пушкин",
+ size = "1740715 octets" }
+
+@book{ PushkinA.S.338,
+ title = "Полное Ñобрание Ñочинений в 10 томах. Том 8",
+ author = "Ð. С. Пушкин",
+ size = "1433289 octets" }
+
+@misc{ Saltykov-ShchiedrinMikhailIevghrafovich339,
+ title = "Собрание Ñочинений в 20-ти томах. Том 20. ПиÑьма 1884—1889 годо",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "11308853 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich340,
+ title = "Собрание Ñочинений в 20 томах. Том 1. Проза, рецензии, ÑÑ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ 1840-1849",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "754172 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich341,
+ title = "Собрание Ñочинений в 20 томах. Том 2. ГубернÑкие очерки",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "823719 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich342,
+ title = "Собрание Ñочинений в 20 томах. Том 3. Ðевинные раÑÑказы. Сатиры в прозе",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "977096 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich343,
+ title = "Собрание Ñочинений в 20 томах. Том 4. ÐŸÑ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1857-1865",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "903949 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich344,
+ title = "Собрание Ñочинений в 20 томах. Том 5. Критика и публициÑтика 1856-1864",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "1099864 octets" }
+
+@misc{ Saltykov-ShchiedrinMikhailIevghrafovich345,
+ title = "Собрание Ñочинений в 20 томах. Том 19 книга 2",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "5366652 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich346,
+ title = "Собрание Ñочинений в 20 томах. Том 6. Статьи 1863-1864",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "1117981 octets" }
+
+@misc{ Saltykov-ShchiedrinMikhailIevghrafovich347,
+ title = "Собрание Ñочинений в 20 томах. Том 18 Книга 1",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "5636522 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich348,
+ title = "Собрание Ñочинений в 20 томах. Том 7. ÐŸÑ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1863-1871",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "1092139 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich349,
+ title = "Собрание Ñочинений в 20 томах. Том 9. Критика и публициÑтика 1868-1883",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "984899 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich350,
+ title = "Собрание Ñочинений в 20 томах. Том 8. Помпадуры и помпадурши. ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ города",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "1005527 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich351,
+ title = "Собрание Ñочинений в 20 томах. Том 11. Благонамеренные речи",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "1015092 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich352,
+ title = "Собрание Ñочинений в 20 томах. Том 12. Ð’ Ñреде умеренноÑти и аккуратноÑти",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "1115790 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich353,
+ title = "Собрание Ñочинений в 20 томах. Том 13. ГоÑпода Головлевы. Убежище Монрепо",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "1203807 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich354,
+ title = "Собрание Ñочинений в 20 томах. Том 14. За рубежом. ПиÑьма к тетеньке",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "1096504 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich355,
+ title = "Собрание Ñочинений в 20 томах. Том 15. Книга 2. ПошехонÑкие раÑÑказы",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "672530 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich356,
+ title = "Собрание Ñочинений в 20 томах. Том 15. Книга 1. Ð¡Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¸Ð´Ð¸Ð»Ð»Ð¸Ñ",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "683910 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich357,
+ title = "Собрание Ñочинений в 20 томах. Том 16. Книга 2. Мелочи жизни",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "647517 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich358,
+ title = "Собрание Ñочинений в 20 томах. Том 17. ПошехонÑÐºÐ°Ñ Ñтарина (неполный)",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "914193 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich359,
+ title = "Собрание Ñочинений в 20 томах. Том 17. ПошехонÑÐºÐ°Ñ Ñтарина",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "1887392 octets" }
+
+@book{ Saltykov-ShchiedrinMikhailIevghrafovich360,
+ title = "Собрание Ñочинений в 20 томах. Том 10. ГоÑпода «ташкентцы». Дневник провинциала",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "1553056 octets" }
+
+@misc{ Saltykov-ShchiedrinMikhailIevghrafovich361,
+ title = "Собрание Ñочинений в 20 томах. Том 18 книга 2",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "5716697 octets" }
+
+@misc{ Saltykov-ShchiedrinMikhailIevghrafovich362,
+ title = "Собрание Ñочинений в 20 томах. Том 19 Книга 1",
+ author = "Михаил Евграфович Салтыков-Щедрин",
+ size = "3986614 octets" }
+
+@misc{ BrodskiiIosifAlieksandrovich363,
+ title = "Собрание Ñочинений",
+ author = "ИоÑиф ÐлекÑандрович БродÑкий",
+ size = "2239130 octets" }
+
+@book{ ChiekhovAntonPavlovich393,
+ title = "Том 1. РаÑÑказы, повеÑти, юмореÑки 1880-1882",
+ author = "Ðнтон Павлович Чехов",
+ size = "1484959 octets" }
+
+@book{ ChiekhovAntonPavlovich394,
+ title = "Том 30. ПиÑьма 1904. ÐадпиÑи",
+ author = "Ðнтон Павлович Чехов",
+ size = "2226126 octets" }
+
+@book{ ChiekhovAntonPavlovich395,
+ title = "Том 29. ПиÑьма 1902-1903",
+ author = "Ðнтон Павлович Чехов",
+ size = "2398976 octets" }
+
+@book{ ChiekhovAntonPavlovich396,
+ title = "Том 28. ПиÑьма 1901-1902",
+ author = "Ðнтон Павлович Чехов",
+ size = "2143975 octets" }
+
+@book{ ChiekhovAntonPavlovich397,
+ title = "Том 2. РаÑÑказы, юмореÑки 1883-1884",
+ author = "Ðнтон Павлович Чехов",
+ size = "1319068 octets" }
+
+@book{ ChiekhovAntonPavlovich398,
+ title = "Том 4. РаÑÑказы, юмореÑки 1885-1886",
+ author = "Ðнтон Павлович Чехов",
+ size = "1185891 octets" }
+
+@book{ ChiekhovAntonPavlovich399,
+ title = "Том 3. РаÑÑказы, юмореÑки 1884-1885",
+ author = "Ðнтон Павлович Чехов",
+ size = "2330211 octets" }
+
+@book{ ChiekhovAntonPavlovich400,
+ title = "Том 5. РаÑÑказы, юмореÑки 1886",
+ author = "Ðнтон Павлович Чехов",
+ size = "1729697 octets" }
+
+@book{ ChiekhovAntonPavlovich401,
+ title = "Том 6. РаÑÑказы 1887",
+ author = "Ðнтон Павлович Чехов",
+ size = "1571560 octets" }
+
+@book{ ChiekhovAntonPavlovich402,
+ title = "Том 7. РаÑÑказы, повеÑти 1888-1891",
+ author = "Ðнтон Павлович Чехов",
+ size = "1690943 octets" }
+
+@book{ ChiekhovAntonPavlovich403,
+ title = "Том 8. РаÑÑказы, повеÑти 1892-1894",
+ author = "Ðнтон Павлович Чехов",
+ size = "1404108 octets" }
+
+@book{ ChiekhovAntonPavlovich404,
+ title = "Том 9. РаÑÑказы, повеÑти 1894-1897",
+ author = "Ðнтон Павлович Чехов",
+ size = "1518732 octets" }
+
+@book{ ChiekhovAntonPavlovich405,
+ title = "Том 10. РаÑÑказы, повеÑти 1898-1903",
+ author = "Ðнтон Павлович Чехов",
+ size = "1347972 octets" }
+
+@book{ ChiekhovAntonPavlovich406,
+ title = "Том 11. ПьеÑÑ‹ 1878-1888",
+ author = "Ðнтон Павлович Чехов",
+ size = "1563898 octets" }
+
+@book{ ChiekhovAntonPavlovich407,
+ title = "Том 12. ПьеÑÑ‹ 1889-1891",
+ author = "Ðнтон Павлович Чехов",
+ size = "1425106 octets" }
+
+@book{ ChiekhovAntonPavlovich408,
+ title = "Том 13. ПьеÑÑ‹ 1895-1904",
+ author = "Ðнтон Павлович Чехов",
+ size = "1691266 octets" }
+
+@book{ ChiekhovAntonPavlovich409,
+ title = "Том 14/15. Из Сибири. ОÑтров Сахалин",
+ author = "Ðнтон Павлович Чехов",
+ size = "2218505 octets" }
+
+@book{ ChiekhovAntonPavlovich410,
+ title = "Том 16. Статьи. Рецензии. Заметки 1881-1902",
+ author = "Ðнтон Павлович Чехов",
+ size = "2067495 octets" }
+
+@book{ ChiekhovAntonPavlovich411,
+ title = "Том 17. ЗапиÑные книжки. Дневники",
+ author = "Ðнтон Павлович Чехов",
+ size = "2061223 octets" }
+
+@book{ ChiekhovAntonPavlovich412,
+ title = "Том 18. ГимназичеÑкое. СтихотворениÑ. Коллективное",
+ author = "Ðнтон Павлович Чехов",
+ size = "2965417 octets" }
+
+@book{ ChiekhovAntonPavlovich413,
+ title = "Том 19. ПиÑьма 1875-1886",
+ author = "Ðнтон Павлович Чехов",
+ size = "1771913 octets" }
+
+@book{ ChiekhovAntonPavlovich415,
+ title = "Том 20. ПиÑьма 1887-1888",
+ author = "Ðнтон Павлович Чехов",
+ size = "1833531 octets" }
+
+@book{ ChiekhovAntonPavlovich416,
+ title = "Том 22. ПиÑьма 1890-1892",
+ author = "Ðнтон Павлович Чехов",
+ size = "1864928 octets" }
+
+@book{ ChiekhovAntonPavlovich417,
+ title = "Том 23. ПиÑьма 1892-1894",
+ author = "Ðнтон Павлович Чехов",
+ size = "1931052 octets" }
+
+@book{ ChiekhovAntonPavlovich418,
+ title = "Том 24. ПиÑьма 1895-1897",
+ author = "Ðнтон Павлович Чехов",
+ size = "2263746 octets" }
+
+@book{ ChiekhovAntonPavlovich419,
+ title = "Том 26. ПиÑьма 1899",
+ author = "Ðнтон Павлович Чехов",
+ size = "2166014 octets" }
+
+@book{ ChiekhovAntonPavlovich420,
+ title = "Том 25. ПиÑьма 1897-1898",
+ author = "Ðнтон Павлович Чехов",
+ size = "2291517 octets" }
+
+@book{ ChiekhovAntonPavlovich421,
+ title = "Том 27. ПиÑьма 1900-1901",
+ author = "Ðнтон Павлович Чехов",
+ size = "2099012 octets" }
+
+@book{ ChiekhovAntonPavlovich422,
+ title = "Том 21. ПиÑьма 1888-1889",
+ author = "Ðнтон Павлович Чехов",
+ size = "1779115 octets" }
+
+@book{ GoossensMichelMittelbachFrankRahtzSebastianRoegelDenisVossHerbert423,
+ title = "The LaTeX Graphics Companion",
+ author = "Michel Goossens and Frank Mittelbach and Sebastian Rahtz and Denis Roegel and Herbert Voß",
+ size = "18647532 octets" }
+
+@misc{ GrahamRonaldL.KnuthDonaldE.PatashnikOren424,
+ title = "Concrete Mathematics: A Foundation for Computer Science",
+ author = "Ronald L. Graham and Donald E. Knuth and Oren Patashnik",
+ size = "7598609 octets" }
+
+@misc{ PikettyThomas425,
+ title = "Capital in the Twenty-First Century",
+ author = "Thomas Piketty",
+ size = "7360526 octets" }
+
+@book{ PikettyThomas426,
+ title = "The Economics of Inequality",
+ author = "Thomas Piketty",
+ size = "3919181 octets" }
+
+@book{ PeckRobertMcCracken427,
+ title = "The Remarkable Nature of Edward Lear",
+ author = "Robert McCracken Peck",
+ size = "7012431 octets" }
+
+@book{ IakhinaGuzielShamilievna428,
+ title = "Зулейха открывает глаза",
+ author = "Гузель Шамилевна Яхина",
+ size = "2543515 octets" }
+
+@book{ RadzinskiiOliegh429,
+ title = "Ðгафонкин и ВремÑ",
+ author = "Олег РадзинÑкий",
+ size = "3099602 octets" }
+
+@book{ IakhinaGuzielShamilievna430,
+ title = "Дети мои",
+ author = "Гузель Шамилевна Яхина",
+ size = "3303452 octets" }
+
+@book{ ZygharMikhailViktorovich431,
+ title = "Ð˜Ð¼Ð¿ÐµÑ€Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° умереть",
+ author = "Михаил Викторович Зыгарь",
+ size = "10029140 octets" }
+
+@book{ SiervantiesMighieldie432,
+ title = "Хитроумный идальго Дон Кихот ЛаманчÑкий. ЧаÑÑ‚ÑŒ перваÑ",
+ author = "Мигель де СервантеÑ",
+ size = "3987836 octets" }
+
+@book{ SiervantiesMighieldie433,
+ title = "Хитроумный идальго Дон Кихот ЛаманчÑкий. ЧаÑÑ‚ÑŒ втораÑ",
+ author = "Мигель де СервантеÑ",
+ size = "4236660 octets" }
+
+@book{ SliozkinIuriiLvovich434,
+ title = "Дом правительÑтва. Сага о руÑÑкой революции",
+ author = "Юрий Львович Слёзкин",
+ size = "53067976 octets" }
+
+@misc{ JonathanWilsonYewdellM.D.Ph.D.435,
+ title = "Truth Wins",
+ author = "Jonathan Wilson Yewdell, M.D., Ph.D.",
+ size = "2321501 octets" }
+
+@book{ HarrisonMatt436,
+ title = "Treading on Python Series: Illustrated Guide to Python 3",
+ author = "Matt Harrison",
+ size = "3266836 octets" }
+
+@book{ HarrisonMatt437,
+ title = "Learning the Pandas Library: Python Tools for Data Munging, Data Analysis, and Visualization",
+ author = "Matt Harrison",
+ size = "4647186 octets" }
+
+@book{ HarrisonMattKennedyMichael438,
+ title = "Effective PyCharm: Learn the PyCharm IDE With a Hands-On Approach",
+ author = "Matt Harrison and Michael Kennedy",
+ size = "35920233 octets" }
+
+@misc{ BaderDan439,
+ title = "Python Tricks: The Book",
+ author = "Dan Bader",
+ size = "368276 octets" }
+
+@misc{ SheckleyRobert440,
+ title = "Watchbird",
+ author = "Robert Sheckley",
+ size = "144228 octets" }
+
+@misc{ SheckleyRobert441,
+ title = "Warm",
+ author = "Robert Sheckley",
+ size = "99517 octets" }
+
+@misc{ SheckleyRobert442,
+ title = "Warrior Race",
+ author = "Robert Sheckley",
+ size = "66841 octets" }
+
+@misc{ SheckleyRobert443,
+ title = "Cost of Living",
+ author = "Robert Sheckley",
+ size = "31175 octets" }
+
+@misc{ SheckleyRobert444,
+ title = "Bad Medicine",
+ author = "Robert Sheckley",
+ size = "26598 octets" }
+
+@misc{ SheckleyRobert445,
+ title = "Beside Still Waters",
+ author = "Robert Sheckley",
+ size = "117143 octets" }
+
+@misc{ SheckleyRobert446,
+ title = "Diplomatic Immunity",
+ author = "Robert Sheckley",
+ size = "345642 octets" }
+
+@misc{ SheckleyRobert447,
+ title = "Death Wish",
+ author = "Robert Sheckley",
+ size = "74486 octets" }
+
+@misc{ SheckleyRobert448,
+ title = "Keep Your Shape",
+ author = "Robert Sheckley",
+ size = "164437 octets" }
+
+@misc{ SheckleyRobert449,
+ title = "The Hour of Battle",
+ author = "Robert Sheckley",
+ size = "112578 octets" }
+
+@misc{ SheckleyRobert450,
+ title = "Meeting of the Minds",
+ author = "Robert Sheckley",
+ size = "345402 octets" }
+
+@misc{ SheckleyRobert451,
+ title = "Forever",
+ author = "Robert Sheckley",
+ size = "92845 octets" }
+
+@misc{ SheckleyRobert452,
+ title = "One Man's Poison",
+ author = "Robert Sheckley",
+ size = "143185 octets" }
+
+@misc{ SheckleyRobert453,
+ title = "Proof of the Pudding",
+ author = "Robert Sheckley",
+ size = "263316 octets" }
+
+@misc{ SheckleyRobert454,
+ title = "Prospector's Special",
+ author = "Robert Sheckley",
+ size = "429977 octets" }
+
+@misc{ SheckleyRobert455,
+ title = "The Sweeper of Loray",
+ author = "Robert Sheckley",
+ size = "221816 octets" }
+
+@misc{ SheckleyRobert456,
+ title = "The Leech",
+ author = "Robert Sheckley",
+ size = "76729 octets" }
+
+@misc{ SheckleyRobert457,
+ title = "The Status Civilization",
+ author = "Robert Sheckley",
+ size = "122753 octets" }
+
+@misc{ HippmannTim458,
+ title = "Grandville's surreal illustrations",
+ author = "Tim Hippmann",
+ size = "363354749 octets" }
+
+@book{ LieskovNikolaiSiemienovich459,
+ title = "Том 9",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "1453531 octets" }
+
+@book{ LieskovNikolaiSiemienovich460,
+ title = "Том 10",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "1688170 octets" }
+
+@book{ LieskovNikolaiSiemienovich461,
+ title = "Том 1",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "996399 octets" }
+
+@book{ LieskovNikolaiSiemienovich462,
+ title = "Том 11",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "2223919 octets" }
+
+@book{ LieskovNikolaiSiemienovich463,
+ title = "Том 2",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "1237923 octets" }
+
+@book{ LieskovNikolaiSiemienovich464,
+ title = "Том 3",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "1460605 octets" }
+
+@book{ LieskovNikolaiSiemienovich465,
+ title = "Том 4",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "1132500 octets" }
+
+@book{ LieskovNikolaiSiemienovich466,
+ title = "Том 5",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "1385702 octets" }
+
+@book{ LieskovNikolaiSiemienovich467,
+ title = "Том 6",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "1548133 octets" }
+
+@book{ LieskovNikolaiSiemienovich468,
+ title = "Том 8",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "1378037 octets" }
+
+@book{ LieskovNikolaiSiemienovich469,
+ title = "Том 7",
+ author = "Ðиколай Семенович ЛеÑков",
+ size = "1624092 octets" }
+
+@misc{ GorfinklJosephI.470,
+ title = "Pirke Avot: The Sayings of the Jewish Fathers",
+ author = "Joseph I. Gorfinkl",
+ size = "80951 octets" }
+
+@book{ BarkovIvanSiemienovich475,
+ title = "Ð”ÐµÐ²Ð¸Ñ‡ÑŒÑ Ð¸Ð³Ñ€ÑƒÑˆÐºÐ°, или Ð¡Ð¾Ñ‡Ð¸Ð½ÐµÐ½Ð¸Ñ Ð³Ð¾Ñподина Баркова",
+ author = "Иван Семенович Барков",
+ size = "571602 octets" }
+
+@misc{ GasparovMikhailLieonovich476,
+ title = "ЗапиÑи и выпиÑки",
+ author = "Михаил Леонович ГаÑпаров",
+ size = "1044793 octets" }
+
+
+@book{ OnuchkovN.Ie.486,
+ title = "Заветные Ñказки из ÑÐ¾Ð±Ñ€Ð°Ð½Ð¸Ñ Ð. Е. Онучкова",
+ author = "Ð. Е. Онучков",
+ size = "5340108 octets" }
+
+@book{ avtorovKolliektiv489,
+ title = "РуÑÑкий школьный фольклор. От «вызываний» Пиковой дамы до Ñемейных раÑÑказов",
+ author = "Коллектив авторов",
+ size = "57665251 octets" }
+
+@book{ KharmsDaniilIvanovichVviedienskiiAlieksandrIvanovichOlieinikovNikolaiMakarovichLipavskiiLieonidSavielievichDruskinIakovSiemienovich491,
+ title = "«…Сборище друзей, оÑтавленных Ñудьбою». «Чинари» в текÑтах, документах и иÑÑледованиÑÑ…. Ð’ 2 томах. Том 1",
+ author = "Даниил Иванович Ð¥Ð°Ñ€Ð¼Ñ and ÐлекÑандр Иванович ВведенÑкий and Ðиколай Макарович Олейников and Леонид Савельевич ЛипавÑкий and Яков Семенович ДруÑкин",
+ size = "16639482 octets" }
+
+@book{ KharmsDaniilIvanovichVviedienskiiAlieksandrIvanovichOlieinikovNikolaiMakarovichLipavskiiLieonidSavielievichDruskinIakovSiemienovich493,
+ title = "«…Сборище друзей, оÑтавленных Ñудьбою». «Чинари» в текÑтах, документах и иÑÑледованиÑÑ…. Ð’ 2 томах. Том 2",
+ author = "Даниил Иванович Ð¥Ð°Ñ€Ð¼Ñ and ÐлекÑандр Иванович ВведенÑкий and Ðиколай Макарович Олейников and Леонид Савельевич ЛипавÑкий and Яков Семенович ДруÑкин",
+ size = "13925808 octets" }
+
+@book{ LieibovRomanLiekmanovOlieghStupakovaIeliena496,
+ title = "«ГоÑподь! ПроÑти СоветÑкому Союзу!»: ПоÑма Тимура Кибирова «Сквозь прощальные Ñлезы»: Опыт чтениÑ",
+ author = "Роман Лейбов and Олег Лекманов and Елена Ступакова",
+ size = "9076060 octets" }
+
+@book{ LiemStanislav497,
+ title = "Собрание Ñочинений в 10 томах. Том 1. ÐœÐ¾Ñ Ð¶Ð¸Ð·Ð½ÑŒ. Эдем. РаÑÑледование",
+ author = "СтаниÑлав Лем",
+ size = "629537 octets" }
+
+@book{ LiemStanislav498,
+ title = "Собрание Ñочинений в 10 томах. Том 2. СолÑриÑ. Возвращение Ñо звезд",
+ author = "СтаниÑлав Лем",
+ size = "613771 octets" }
+
+@book{ LiemStanislav499,
+ title = "Собрание Ñочинений в 10 томах. Том 3. Ðепобедимый. РаÑÑказы",
+ author = "СтаниÑлав Лем",
+ size = "681540 octets" }
+
+@book{ LiemStanislav500,
+ title = "Собрание Ñочинений в 10 томах. Том 4. РаÑÑказы о пилоте ПиркÑе. Ð›ÑƒÐ½Ð½Ð°Ñ Ð½Ð¾Ñ‡ÑŒ",
+ author = "СтаниÑлав Лем",
+ size = "624285 octets" }
+
+@book{ LiemStanislav501,
+ title = "Собрание Ñочинений в 10 томах. Том 5. РукопиÑÑŒ, Ð½Ð°Ð¹Ð´ÐµÐ½Ð½Ð°Ñ Ð² ванне. Ð’Ñ‹Ñокий замок. МаÑка",
+ author = "СтаниÑлав Лем",
+ size = "632849 octets" }
+
+@book{ LiemStanislav502,
+ title = "Собрание Ñочинений в 10 томах. Том 6. Кибериада",
+ author = "СтаниÑлав Лем",
+ size = "784327 octets" }
+
+@book{ LiemStanislav503,
+ title = "Собрание Ñочинений в 10 томах. Том 7. Звездные дневники Ийона Тихого. Из воÑпоминаний Ийона Тихого",
+ author = "СтаниÑлав Лем",
+ size = "722358 octets" }
+
+@book{ LiemStanislav504,
+ title = "Собрание Ñочинений в 10 томах. Том 8. ФутурологичеÑкий конгреÑÑ. ОÑмотр на меÑте. ПьеÑÑ‹ о профеÑÑоре Тарантоге",
+ author = "СтаниÑлав Лем",
+ size = "809174 octets" }
+
+@book{ LiemStanislav505,
+ title = "Собрание Ñочинений в 10 томах. Том 9. Мир на Земле. Ð“Ð»Ð°Ñ Ð“Ð¾Ñпода. Верный робот",
+ author = "СтаниÑлав Лем",
+ size = "679447 octets" }
+
+@book{ LiemStanislav506,
+ title = "Собрание Ñочинений в 10 томах. Том 12. Больница преображениÑ. ФиаÑко",
+ author = "СтаниÑлав Лем",
+ size = "754894 octets" }
+
+@book{ LiemStanislav507,
+ title = "Собрание Ñочинений в 10 томах. Том 11. Магелланово Облако",
+ author = "СтаниÑлав Лем",
+ size = "544320 octets" }
+
+@book{ LiemStanislav508,
+ title = "Собрание Ñочинений в 10 томах. Том 13. Сумма технологии",
+ author = "СтаниÑлав Лем",
+ size = "931315 octets" }
+
+@book{ LiemStanislav509,
+ title = "Собрание Ñочинений в 10 томах. Том 10. ÐаÑморк. ÐбÑÐ¾Ð»ÑŽÑ‚Ð½Ð°Ñ Ð¿ÑƒÑтота. ÐœÐ½Ð¸Ð¼Ð°Ñ Ð²ÐµÐ»Ð¸Ñ‡Ð¸Ð½Ð°. ПровокациÑ",
+ author = "СтаниÑлав Лем",
+ size = "949298 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich510,
+ title = "Том 12. Дополнительный",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "595989 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich511,
+ title = "Том 10. С.Витицкий, С.ЯроÑлавцев",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "951952 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich512,
+ title = "Том 11. Ðеопубликованное. ПублициÑтика",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "1068132 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich513,
+ title = "Том 1. 1955-1959",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "837431 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich514,
+ title = "Том 2. 1960-1962",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "687908 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich515,
+ title = "Том 3. 1961-1963",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "843618 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich516,
+ title = "Том 5. 1967-1968",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "809138 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich517,
+ title = "Том 7. 1973-1978",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "713338 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich518,
+ title = "Том 4. 1964-1966",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "742741 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich519,
+ title = "Том 6. 1969-1973",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "761431 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich520,
+ title = "Том 8. 1979-1984",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "882462 octets" }
+
+@book{ StrughatskiiArkadiiNatanovichStrughatskiiBorisNatanovich521,
+ title = "Том 9. 1985-1990",
+ author = "Ðркадий Ðатанович Стругацкий and Ð‘Ð¾Ñ€Ð¸Ñ Ðатанович Стругацкий",
+ size = "775242 octets" }
+
+@misc{ LieibovRomanOsipovatAlieksandr522,
+ title = "Тютчев Федор Иванович",
+ author = "Роман Лейбов and ÐлекÑандр ОÑиповат",
+ size = "3527211 octets" }
+
+@misc{ NeedhamMarkHodlerAmyE.523,
+ title = "Graph Algorithms",
+ author = "Mark Needham and Amy E. Hodler",
+ size = "10737943 octets" }
+
+@book{ HenneyKevlin528,
+ title = "97 Things Every Programmer Should Know",
+ author = "Kevlin Henney",
+ size = "3611441 octets" }
+
+@book{ RaymondEricS.529,
+ title = "The Cathedral \& the Bazaar",
+ author = "Eric S. Raymond",
+ size = "2594239 octets" }
+
+@book{ EvansBenjaminJ.FlanaganDavid530,
+ title = "Java in a Nutshell",
+ author = "Benjamin J. Evans and David Flanagan",
+ size = "7373354 octets" }
+
+@book{ ArnoldRobbins533,
+ title = "vi and Vim Editors Pocket Reference",
+ author = "Arnold Robbins",
+ size = "3376717 octets" }
+
+@book{ BarrettDanielJ.VehtariAkiSilvermanRichardE.ByrnesRobertG.536,
+ title = "SSH, the Secure Shell, 2nd Edition",
+ author = "Daniel J. Barrett and Aki Vehtari and Richard E. Silverman and Robert G. Byrnes",
+ size = "6644147 octets" }
+
+@book{ SierraKathyBatesBert539,
+ title = "Head First Javaâ„¢",
+ author = "Kathy Sierra and Bert Bates",
+ size = "47683877 octets" }
+
+@misc{ LiuCricketAlbitzPaul541,
+ title = "DNS and BIND",
+ author = "Cricket Liu and Paul Albitz",
+ size = "4827002 octets" }
+
+@book{ JanertPhilippK.542,
+ title = "Data Analysis with Open Source Tools",
+ author = "Philipp K. Janert",
+ size = "11451736 octets" }
+
+@book{ RosenfeldLouisMorvillePeterArangoJorge543,
+ title = "Information Architecture: For the Web and Beyond",
+ author = "Louis Rosenfeld and Peter Morville and Jorge Arango",
+ size = "76944408 octets" }
+
+@book{ CrockfordDouglas545,
+ title = "JavaScript: The Good Parts",
+ author = "Douglas Crockford",
+ size = "6064461 octets" }
+
+@book{ ChristiansenTomfoybriandWallLarry547,
+ title = "Programming Perl",
+ author = "Tom Christiansen and brian d foy and Larry Wall",
+ size = "18875022 octets" }
+
+@misc{ SilvermanRichardE.548,
+ title = "Git Pocket Guide",
+ author = "Richard E. Silverman",
+ size = "5085508 octets" }
+
+@misc{ HertzfeldAndy550,
+ title = "Revolution in the Valley",
+ author = "Andy Hertzfeld",
+ size = "38034684 octets" }
+
+@misc{ GrahamPaul551,
+ title = "Hackers \& Painters",
+ author = "Paul Graham",
+ size = "3514793 octets" }
+
+@misc{ HuxleyThomasHenry552,
+ title = "Evolution and Ethics, and Other Essays",
+ author = "Thomas Henry Huxley",
+ size = "250151 octets" }
+
+@book{ SadovnikovGieorghii553,
+ title = "Похищение продавца приключений",
+ author = "Георгий Садовников",
+ size = "435616 octets" }
+
+@book{ SadovnikovGieorghiiMikhailovich554,
+ title = "Продавец приключений",
+ author = "Георгий Михайлович Садовников",
+ size = "389356 octets" }
+
+@book{ VitghienshtieinLiudvigh555,
+ title = "Логико-филоÑофÑкий трактат",
+ author = "Людвиг Витгенштейн",
+ size = "2367773 octets" }
+
+@misc{ BuninIvanAlieksieievich556,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 9",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "14721248 octets" }
+
+@misc{ BuninIvanAlieksieievich557,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 8",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "9340632 octets" }
+
+@misc{ BuninIvanAlieksieievich558,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 7",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "7191581 octets" }
+
+@misc{ BuninIvanAlieksieievich559,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 1",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "7535999 octets" }
+
+@misc{ BuninIvanAlieksieievich560,
+ title = "Полное Ñобрание Ñочиненийв 13 томах. Том 10",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "11829472 octets" }
+
+@misc{ BuninIvanAlieksieievich561,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 11",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "12366966 octets" }
+
+@misc{ BuninIvanAlieksieievich562,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 12",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "14342098 octets" }
+
+@misc{ BuninIvanAlieksieievich563,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 13",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "14365796 octets" }
+
+@misc{ BuninIvanAlieksieievich564,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 14",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "17439405 octets" }
+
+@misc{ BuninIvanAlieksieievich565,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 15",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "16173015 octets" }
+
+@misc{ BuninIvanAlieksieievich566,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 16",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "14579758 octets" }
+
+@misc{ BuninIvanAlieksieievich567,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 2",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "8533352 octets" }
+
+@misc{ BuninIvanAlieksieievich568,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 3",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "12067023 octets" }
+
+@misc{ BuninIvanAlieksieievich569,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 5",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "8765016 octets" }
+
+@misc{ BuninIvanAlieksieievich570,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 6",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "8590616 octets" }
+
+@misc{ BuninIvanAlieksieievich571,
+ title = "Полное Ñобрание Ñочинений в 13 томах. Том 4",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "12039977 octets" }
+
+@book{ BuninIvanAlieksieievich572,
+ title = "Том 6. ПублициÑтика. ВоÑпоминаниÑ",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "1048040 octets" }
+
+@book{ BuninIvanAlieksieievich573,
+ title = "Том 5. Жизнь ÐÑ€Ñеньева. РаÑÑказы 1932-1952",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "924685 octets" }
+
+@book{ BuninIvanAlieksieievich574,
+ title = "Том 1. СтихотворениÑ",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "682459 octets" }
+
+@book{ BuninIvanAlieksieievich575,
+ title = "Том 2. ÐŸÑ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1887-1909",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "759433 octets" }
+
+@book{ BuninIvanAlieksieievich576,
+ title = "Том 3. ÐŸÑ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1907–1914",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "1002940 octets" }
+
+@book{ BuninIvanAlieksieievich577,
+ title = "Том 4. ÐŸÑ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1914-1931",
+ author = "Иван ÐлекÑеевич Бунин",
+ size = "951445 octets" }
+
+@misc{ VitghienshtieinLiudvigh578,
+ title = "Логико-филоÑофÑкий трактат",
+ author = "Людвиг Витгенштейн",
+ size = "185001 octets" }
+
+@book{ LieibovRoman579,
+ title = "P. S. Выдержки из дневников 2016-2017 гг.",
+ author = "Роман Лейбов",
+ size = "939182 octets" }
+
+@book{ LieibovRoman580,
+ title = "Ямбы и другие хореи. ЗапиÑи из дневников 2014-2015 гг.",
+ author = "Роман Лейбов",
+ size = "954004 octets" }
+
+@book{ LieibovRoman581,
+ title = "В рифму и/или в Ñтолбик. ЗапиÑи из дневника 2001-2014",
+ author = "Роман Лейбов",
+ size = "964234 octets" }
+
+@book{ Plutarkh582,
+ title = "ЗаÑтольные беÑеды",
+ author = "Плутарх",
+ size = "20258848 octets" }
+
+@misc{ PlatonKsienofontLaertsiiDioghienLibaniiPlutarkh583,
+ title = "Суд над Сократом (Сборник иÑторичеÑких ÑвидетельÑтв)",
+ author = "Платон and КÑенофонт and Диоген ЛаÑрций and Либаний and Плутарх",
+ size = "322003 octets" }
+
+@book{ Ksienofont584,
+ title = "ÐнабаÑиÑ",
+ author = "КÑенофонт",
+ size = "1191924 octets" }
+
+@book{ SayersIanMiellAidanHobson585,
+ title = "Docker in Practice, Second Edition",
+ author = "Ian Miell Aidan Hobson Sayers",
+ size = "14347578 octets" }
+
+@book{ NickoloffJeffKuenzliStephen587,
+ title = "Docker in Action, Second Edition",
+ author = "Jeff Nickoloff and Stephen Kuenzli",
+ size = "3519397 octets" }
+
+@book{ SendakMaurice589,
+ title = "Where the Wild Things Are",
+ author = "Maurice Sendak",
+ size = "8141946 octets" }
+
+@book{ GasparovMikhailLieonovichMartsialMarkValieriiIliushinAlieksandrAnatolievichZorinAndrieiLieonidovichBarkovIvanSiemienovichOlsufievAdamVasilievichPushkinAlieksandrSierghieievichLievintonGieorghiiAkhillovichOkhotinNikitaGliebovichTaranovskiiKirillFiedorovichSazhinValieriiNikolaievichPiechierskaiaT.MarkovV.ChudakovAlieksandrPavlovichBoghomolovNikolaiAlieksieievichShchierbakovR.DotsienkoSierghieiNikolaievichRiemizovAlieksieiMikhailovichMatichOlghaKushnirovichM.ZholkovskiiAlieksandrKonstantinovichRonienOmriZolotonosovMikhailNaftaliievichKantorAnatoliiMikhailovichKarlinskiiSiemienArkadievichKibirovTimurIurievich591,
+ title = "Литературное обозрение",
+ author = "Михаил Леонович ГаÑпаров and Марк Валерий Марциал and ÐлекÑандр Ðнатольевич Илюшин and Ðндрей Леонидович Зорин and Иван Семенович Барков and Ðдам ВаÑильевич ОлÑуфьев and ÐлекÑандр Сергеевич Пушкин and Георгий Ðхиллович Левинтон and Ðикита Глебович Охотин and Кирилл Федорович ТарановÑкий and Валерий Ðиколаевич Сажин and Т. ПечерÑÐºÐ°Ñ and Ð’. Марков and ÐлекÑандр Павлович Чудаков and Ðиколай ÐлекÑеевич Богомолов and Р. Щербаков and Сергей Ðиколаевич Доценко and ÐлекÑей Михайлович Ремизов and Ольга Матич and Ðœ. Кушнирович and ÐлекÑандр КонÑтантинович ЖолковÑкий and Омри Ронен and Михаил Ðафталиевич ЗолотоноÑов and Ðнатолий Михайлович Кантор and Семен Ðркадьевич КарлинÑкий and Тимур Юрьевич Кибиров",
+ size = "23043653 octets" }
+
+@book{ KibirovTimur592,
+ title = "Лада, или РадоÑÑ‚ÑŒ. Хроника верной и ÑчаÑтливой любви",
+ author = "Тимур Кибиров",
+ size = "328197 octets" }
+
+@book{ KibirovTimur593,
+ title = "Сантименты: воÑемь книг",
+ author = "Тимур Кибиров",
+ size = "8796187 octets" }
+
+@book{ LavrovAlieksandrVasilievichLiekmanovOlieghAndiershanovich594,
+ title = "От Кибирова до Пушкина",
+ author = "ÐлекÑандр ВаÑильевич Лавров and Олег Ðндершанович Лекманов",
+ size = "2978296 octets" }
+
+@book{ KibirovTimur595,
+ title = "Стихи",
+ author = "Тимур Кибиров",
+ size = "597085 octets" }
+
+@book{ GasparovMikhailLieonovich596,
+ title = "РаÑÑказы Геродота о греко-перÑидÑких войнах и еще о многом другом",
+ author = "Михаил Леонович ГаÑпаров",
+ size = "1884333 octets" }
+
+@book{ GasparovMikhailLieonovich597,
+ title = "КапитолийÑÐºÐ°Ñ Ð²Ð¾Ð»Ñ‡Ð¸Ñ†Ð°. Рим до цезарей",
+ author = "Михаил Леонович ГаÑпаров",
+ size = "281948 octets" }
+
+@book{ GasparovMikhailLieonovich598,
+ title = "Ð—Ð°Ð½Ð¸Ð¼Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð“Ñ€ÐµÑ†Ð¸Ñ",
+ author = "Михаил Леонович ГаÑпаров",
+ size = "978928 octets" }
+
+@book{ MartsialMarkValierii599,
+ title = "Эпиграммы",
+ author = "Марк Валерий Марциал",
+ size = "2499811 octets" }
+
+@book{ ApulieiLutsii600,
+ title = "«Метаморфозы» и другие ÑочинениÑ",
+ author = "Луций Ðпулей",
+ size = "905916 octets" }
+
+@book{ FlakkKvintGoratsiiFlakkAvlPiersiiSieniekaLutsiiAnnieiArbitrGaiPietroniiIuvienalDietsimIuniiSulpitsiiaAnonim602,
+ title = "РимÑÐºÐ°Ñ Ñатира",
+ author = "Квинт Гораций Флакк and Ðвл ПерÑий Флакк and Луций Ðнней Сенека and Гай Петроний Ðрбитр and Децим Юний Ювенал and Ð¡ÑƒÐ»ÑŒÐ¿Ð¸Ñ†Ð¸Ñ and Ðноним",
+ size = "1554451 octets" }
+
+@book{ TatiiAkhillLonghPietroniiGaiApulieiLutsii603,
+ title = "Ðхилл Татий «Левкиппа и Клитофонт». Лонг Â«Ð”Ð°Ñ„Ð½Ð¸Ñ Ð¸ ХлоÑ». Петроний «Сатирикон». Ðпулей «Метамофозы, или Золотой оÑел»",
+ author = "Ðхилл Татий and Лонг and Гай Петроний and Луций Ðпулей",
+ size = "1682640 octets" }
+
+@book{ GillespieColinLovelaceRobin605,
+ title = "Efficient R Programming: A Practical Guide to Smarter Programming",
+ author = "Colin Gillespie and Robin Lovelace",
+ size = "2824924 octets" }
+
+@book{ Sei-Sionaghon607,
+ title = "ЗапиÑки у изголовьÑ",
+ author = "СÑй-Сёнагон",
+ size = "1618992 octets" }
+
+@book{ DattaDilip609,
+ title = "LaTeX in 24 Hours",
+ author = "Dilip Datta",
+ size = "8294487 octets" }
+
+@book{ AlighieriDantie610,
+ title = "БожеÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð¼ÐµÐ´Ð¸Ñ (илл. Доре)",
+ author = "Данте Ðлигьери",
+ size = "3961168 octets" }
+
+@misc{ FasmierMaks613,
+ title = "ЭтимологичеÑкий Ñловарь руÑÑкого Ñзыка. Том 2",
+ author = "ÐœÐ°ÐºÑ Ð¤Ð°Ñмер",
+ size = "12929584 octets" }
+
+@misc{ FasmierMaks614,
+ title = "ЭтимологичеÑкий Ñловарь руÑÑкого Ñзыка. Том 4",
+ author = "ÐœÐ°ÐºÑ Ð¤Ð°Ñмер",
+ size = "11737842 octets" }
+
+@misc{ FasmierMaks615,
+ title = "ЭтимологичеÑкий Ñловарь руÑÑкого Ñзыка. Том 1",
+ author = "ÐœÐ°ÐºÑ Ð¤Ð°Ñмер",
+ size = "8999895 octets" }
+
+@misc{ FasmierMaks616,
+ title = "ЭтимологичеÑкий Ñловарь руÑÑкого Ñзыка. Том 3",
+ author = "ÐœÐ°ÐºÑ Ð¤Ð°Ñмер",
+ size = "14409999 octets" }
+
+@misc{ PezzottiNicola617,
+ title = "Dimensionality-Reduction Algorithmsfor Progressive Visual Analytics",
+ author = "Nicola Pezzotti",
+ size = "28078283 octets" }
+
+@misc{ WestcottChris618,
+ title = "From the Bookshelves of Jack Stauffacher",
+ author = "Chris Westcott",
+ size = "20003811 octets" }
+
+@misc{ RamieFrankaFoDario619,
+ title = "Я жду тебÑ, любимый…",
+ author = "Франка Раме and Дарио Фо",
+ size = "214286 octets" }
+
+@book{ Echiegharai-i-EisaghirrieKhosieGauptmanGierkhartBienavientie-i-MartiniesKhasintoONilIudzhinBiekkietSemiuelShoiinkaVolieFoDario620,
+ title = "Драматурги — лауреаты ÐобелевÑкой премии",
+ author = "ХоÑе Эчегарай-и-ЭйÑагирре and Герхарт Гауптман and ХаÑинто Бенавенте-и-ÐœÐ°Ñ€Ñ‚Ð¸Ð½ÐµÑ and Юджин О'Ðил and СÑмюÑль Беккет and Воле Шойинка and Дарио Фо",
+ size = "7183249 octets" }
+
+@book{ RamieFrankaFoDario621,
+ title = "Ð¡Ð²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ð¿Ð°Ñ€Ð°",
+ author = "Франка Раме and Дарио Фо",
+ size = "403305 octets" }
+
+@misc{ MiddletonRichard622,
+ title = "The Ghost Ship",
+ author = "Richard Middleton",
+ size = "144400 octets" }
+
+@book{ DefoeDaniel623,
+ title = "A Journal of the Plague Year",
+ author = "Daniel Defoe",
+ size = "824331 octets" }
+
+@book{ BokkachchoDzhovanni624,
+ title = "ФьÑмметта",
+ author = "Джованни Боккаччо",
+ size = "375048 octets" }
+
+@book{ BokkachchoDzhovanni626,
+ title = "ФьезоланÑкие нимфы",
+ author = "Джованни Боккаччо",
+ size = "483180 octets" }
+
+@book{ BokkachchoDzhovanniNavarrskaiaMargharita627,
+ title = "Декамерон. Гептамерон (Ñборник)",
+ author = "Джованни Боккаччо and Маргарита ÐаваррÑкаÑ",
+ size = "8113959 octets" }
+
+@book{ BokkachchoDzhovanni628,
+ title = "Декамерон",
+ author = "Джованни Боккаччо",
+ size = "2647058 octets" }
+
+@misc{ ReidRobert629,
+ title = "The Mystery of Fly Fishing",
+ author = "Robert Reid",
+ size = "23104062 octets" }
+
+@misc{ WodehousePelhamGrenville630,
+ title = "A Damsel in Distress",
+ author = "Pelham Grenville Wodehouse",
+ size = "557956 octets" }
+
+@misc{ WodehouseP.G.631,
+ title = "The Man with Two Left Feet",
+ author = "P. G. Wodehouse",
+ size = "495292 octets" }
+
+@misc{ WodehouseP.G.632,
+ title = "Death at the Excelsior",
+ author = "P. G. Wodehouse",
+ size = "281756 octets" }
+
+@misc{ WodehouseP.G.633,
+ title = "The Prince and Betty",
+ author = "P. G. Wodehouse",
+ size = "497928 octets" }
+
+@misc{ WodehouseP.G.634,
+ title = "The White Feather",
+ author = "P. G. Wodehouse",
+ size = "335276 octets" }
+
+@misc{ WodehouseP.G.635,
+ title = "Three Men and a Maid",
+ author = "P. G. Wodehouse",
+ size = "410268 octets" }
+
+@misc{ WodehouseP.G.636,
+ title = "My Man Jeeves",
+ author = "P. G. Wodehouse",
+ size = "372444 octets" }
+
+@misc{ WodehouseP.G.637,
+ title = "Tales of St. Austin's",
+ author = "P. G. Wodehouse",
+ size = "371132 octets" }
+
+@misc{ WodehouseP.G.638,
+ title = "The Swoop!",
+ author = "P. G. Wodehouse",
+ size = "148512 octets" }
+
+@misc{ WodehouseP.G.639,
+ title = "Something New",
+ author = "P. G. Wodehouse",
+ size = "517624 octets" }
+
+@misc{ WodehouseP.G.640,
+ title = "Psmith, Journalist",
+ author = "P. G. Wodehouse",
+ size = "425056 octets" }
+
+@misc{ WodehouseP.G.641,
+ title = "Psmith in the City",
+ author = "P. G. Wodehouse",
+ size = "379012 octets" }
+
+@misc{ WodehouseP.G.642,
+ title = "A Prefect's Uncle",
+ author = "P. G. Wodehouse",
+ size = "313252 octets" }
+
+@misc{ WodehouseP.G.643,
+ title = "Piccadilly Jim",
+ author = "P. G. Wodehouse",
+ size = "584928 octets" }
+
+@misc{ WodehouseP.G.644,
+ title = "The Pothunters",
+ author = "P. G. Wodehouse",
+ size = "312248 octets" }
+
+@misc{ WodehouseP.G.645,
+ title = "The Intrusion of Jimmy",
+ author = "P. G. Wodehouse",
+ size = "497828 octets" }
+
+@misc{ WodehouseP.G.646,
+ title = "Uneasy Money",
+ author = "P. G. Wodehouse",
+ size = "468440 octets" }
+
+@misc{ WodehouseP.G.647,
+ title = "Indiscretions of Archie",
+ author = "P. G. Wodehouse",
+ size = "530328 octets" }
+
+@misc{ WodehouseP.G.648,
+ title = "The Man Upstairs and Other Stories",
+ author = "P. G. Wodehouse",
+ size = "726876 octets" }
+
+@misc{ WodehouseP.G.649,
+ title = "A Man of Means",
+ author = "P. G. Wodehouse",
+ size = "209992 octets" }
+
+@misc{ WodehouseP.G.650,
+ title = "Love Among the Chickens",
+ author = "P. G. Wodehouse",
+ size = "351976 octets" }
+
+@misc{ WodehouseP.G.651,
+ title = "The Little Nugget",
+ author = "P. G. Wodehouse",
+ size = "511244 octets" }
+
+@misc{ WodehouseP.G.652,
+ title = "The Little Warrior",
+ author = "P. G. Wodehouse",
+ size = "702872 octets" }
+
+@misc{ WodehouseP.G.653,
+ title = "The Head of Kay's",
+ author = "P. G. Wodehouse",
+ size = "321064 octets" }
+
+@misc{ WodehouseP.G.654,
+ title = "The Gold Bat",
+ author = "P. G. Wodehouse",
+ size = "306800 octets" }
+
+@misc{ WodehouseP.G.655,
+ title = "The Adventures of Sally",
+ author = "P. G. Wodehouse",
+ size = "576120 octets" }
+
+@misc{ WodehouseP.G.657,
+ title = "The Coming of Bill",
+ author = "P. G. Wodehouse",
+ size = "603312 octets" }
+
+@misc{ WodehouseP.G.658,
+ title = "Jill the Reckless",
+ author = "P. G. Wodehouse",
+ size = "941232 octets" }
+
+@misc{ WodehouseP.G.659,
+ title = "The Clicking of Cuthbert",
+ author = "P. G. Wodehouse",
+ size = "437312 octets" }
+
+@misc{ WodehouseP.G.660,
+ title = "Mike and Psmith",
+ author = "P. G. Wodehouse",
+ size = "408704 octets" }
+
+@misc{ WodehouseP.G.661,
+ title = "Right Ho, Jeeves",
+ author = "P. G. Wodehouse",
+ size = "657268 octets" }
+
+@misc{ WodehouseP.G.662,
+ title = "The Girl on the Boat",
+ author = "P. G. Wodehouse",
+ size = "603304 octets" }
+
+@misc{ WodehouseP.G.663,
+ title = "Mike",
+ author = "P. G. Wodehouse",
+ size = "1635108 octets" }
+
+@misc{ WodehouseP.G.664,
+ title = "The Gem Collector",
+ author = "P. G. Wodehouse",
+ size = "255976 octets" }
+
+@misc{ WodehouseP.G.665,
+ title = "The Politeness of Princes",
+ author = "P. G. Wodehouse",
+ size = "190968 octets" }
+
+@misc{ WodehouseP.G.666,
+ title = "A Wodehouse Miscellany",
+ author = "P. G. Wodehouse",
+ size = "231408 octets" }
+
+@misc{ WodehouseP.G.668,
+ title = "Not George Washington — an Autobiographical Novel",
+ author = "P. G. Wodehouse",
+ size = "385724 octets" }
+
+@book{ RiezanovaNataliaOuenAnna669,
+ title = "Корабли Ñ Ð²Ð¾Ñтока",
+ author = "ÐÐ°Ñ‚Ð°Ð»ÑŒÑ Ð ÐµÐ·Ð°Ð½Ð¾Ð²Ð° and Ðнна ОуÑн",
+ size = "3293679 octets" }
+
+@misc{ GelmanAndrewCarlinJohnB.SternHalS.DunsonDavidB.VehtariAkiRubinDonaldB.670,
+ title = "Bayesian Data Analysis, Third Edition (corrected)",
+ author = "Andrew Gelman and John B. Carlin and Hal S. Stern and David B. Dunson and Aki Vehtari and Donald B. Rubin",
+ size = "66473875 octets" }
+
+@misc{ KhanghaIeliena671,
+ title = "Про вÑе",
+ author = "Елена Ханга",
+ size = "466674 octets" }
+
+@misc{ MasaAlejandroPolanco672,
+ title = "Physics Atlas 1889 (Kickstarter Edition HardCover) PaÌginas.indd",
+ author = "Alejandro Polanco Masa",
+ size = "47858499 octets" }
+
+@book{ LurieSamuil675,
+ title = "Книги нашего детÑтва",
+ author = "Самуил Лурье and Мирон ПетровÑкий",
+ size = "1393270 octets" }
+
+@misc{ GheorgheRaduHinmanMatthewLeeRussoRoy677,
+ title = "Elasticsearch in Action",
+ author = "Radu Gheorghe and Matthew Lee Hinman and Roy Russo",
+ size = "14993878 octets" }
+
+@misc{ RhysHefinI.678,
+ title = "Machine Learning with R, the tidyverse, and mlr",
+ author = "Hefin I. Rhys",
+ size = "40776331 octets" }
+
+@misc{ UptonBertha679,
+ title = "The Adventure of Two Dutch Dolls and a `Golliwogg'",
+ author = "Bertha Upton",
+ size = "3558740 octets" }
+
+@misc{ SmartTom680,
+ title = "George A. Walker's Xylographica",
+ author = "Tom Smart",
+ size = "30992143 octets" }
+
+@misc{ ReinhartAlex681,
+ title = "Statistics Done Wrong",
+ author = "Alex Reinhart",
+ size = "3595998 octets" }
+
+@misc{ MachenArthur682,
+ title = "The Great God Pan",
+ author = "Arthur Machen",
+ size = "73317 octets" }
+
+@misc{ CasanovaGiacomo683,
+ title = "The Memoirs of Jacques Casanova de Seingalt, 1725-1798. Complete",
+ author = "Giacomo Casanova",
+ size = "7428377 octets" }
+
+@misc{ MachenArthur684,
+ title = "The House of Souls",
+ author = "Arthur Machen",
+ size = "220496 octets" }
+
+@misc{ PetroniusArbiter685,
+ title = "The Satyricon — Complete",
+ author = "Petronius Arbiter",
+ size = "4045118 octets" }
+
+@book{ VaniekKariel686,
+ title = "ÐŸÑ€Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°Ð²Ð¾Ð³Ð¾ Ñолдата Швейка в руÑÑком плену",
+ author = "Карел Ванек",
+ size = "555725 octets" }
+
+@book{ VaniekKariel688,
+ title = "ÐŸÐ¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°Ð²Ð¾Ð³Ð¾ Ñолдата Швейка во Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¸Ñ€Ð¾Ð²Ð¾Ð¹ войны. Окончание",
+ author = "Карел Ванек",
+ size = "249492 octets" }
+
+@book{ DurrellGeraldM.689,
+ title = "Fauna and Family",
+ author = "Gerald M. Durrell",
+ size = "502270 octets" }
+
+@misc{ MiloRonPhillipsRob690,
+ title = "Cell Biology by the Numbers",
+ author = "Ron Milo and Rob Phillips",
+ size = "22474026 octets" }
+
+@book{ VolodinAlieksandrMoisieievichKorostylievVadimNikolaievichBykovRolanAnatolievichKostiukovskiiIakovAronovichSlobodskoiMorisRomanovichGaidaiLieonidIovich691,
+ title = "Три кинокомедии",
+ author = "ÐлекÑандр МоиÑеевич Володин and Вадим Ðиколаевич КороÑтылев and Ролан Ðнатольевич Быков and Яков Ðронович КоÑтюковÑкий and ÐœÐ¾Ñ€Ð¸Ñ Ð Ð¾Ð¼Ð°Ð½Ð¾Ð²Ð¸Ñ‡ СлободÑкой and Леонид Иович Гайдай",
+ size = "2447540 octets" }
+
+@book{ IlfIliaArnoldovichPietrovIevghieniiPietrovichVishniaOstapKassilLievAbramovichLienchLieonidSierghieievichBiezymienskiiAlieksandrIlichLaskinBorisSavielievichNarinianiSiemionDavydovichRyklinGrighoriiIefimovichArdovViktorIefimovichDykhovichnyiVladimirAbramovichSlobodskoiMorisRomanovichEdielMikhailVladimirovichTsughuliievaIelienaAlieksandrovnaShatrovIevghieniiVasilievichChistiakovAntoninFiodorovichPolishchukIanAzarovichPrivalovBorisAvksientievichIeghorovBorisAndrianovichSiemionovManuilGrighorievichGorielovIvanPavlovichRazumovskiiIuriiGieorghiievichSvietovAlieksandrAbramovichShmankievichAndrieiPavlovichPotiemkinaValientinaAlieksandrovnaAlieksandrovA.IlinIevghieniiIlichLarinBorisAbramovichTimofieievBorisNikolaievichTvienMarkKarvashPietierKraievGanchoPietrieskuE.MoravikIanRighienringhGansIoakhimNikFritsAdamKhorvatTiborTabiLasloGryzhievskiiKazimirMielikhStanislav692,
+ title = "Шипы и розы",
+ author = "Ð˜Ð»ÑŒÑ Ðрнольдович Ильф and Евгений Петрович Петров and ОÑтап Ð’Ð¸ÑˆÐ½Ñ and Лев Ðбрамович КаÑÑиль and Леонид Сергеевич Ленч and ÐлекÑандр Ильич БезыменÑкий and Ð‘Ð¾Ñ€Ð¸Ñ Ð¡Ð°Ð²ÐµÐ»ÑŒÐµÐ²Ð¸Ñ‡ ЛаÑкин and Семён Давыдович ÐариньÑни and Григорий Ефимович Рыклин and Виктор Ефимович Ðрдов and Владимир Ðбрамович Дыховичный and ÐœÐ¾Ñ€Ð¸Ñ Ð Ð¾Ð¼Ð°Ð½Ð¾Ð²Ð¸Ñ‡ СлободÑкой and Михаил Владимирович Эдель and Елена ÐлекÑандровна Цугулиева and Евгений ВаÑильевич Шатров and Ðнтонин Фёдорович ЧиÑÑ‚Ñков and Ян Ðзарович Полищук and Ð‘Ð¾Ñ€Ð¸Ñ ÐвкÑентьевич Привалов and Ð‘Ð¾Ñ€Ð¸Ñ Ðндрианович Егоров and Мануил Григорьевич Семёнов and Иван Павлович Горелов and Юрий Георгиевич РазумовÑкий and ÐлекÑандр Ðбрамович Светов and Ðндрей Павлович Шманкевич and Валентина ÐлекÑандровна Потемкина and Ð. ÐлекÑандров and Евгений Ильич Ильин and Ð‘Ð¾Ñ€Ð¸Ñ Ðбрамович Ларин and Ð‘Ð¾Ñ€Ð¸Ñ Ðиколаевич Тимофеев and Марк Твен and Петер Карваш and Ганчо Краев and Э. ПетреÑку and Ян Моравик and Ð“Ð°Ð½Ñ Ð˜Ð¾Ð°Ñ…Ð¸Ð¼ Ригенринг and Фриц Ðдам Ðик and Тибор Хорват and ЛаÑло Таби and Казимир ГрыжевÑкий and СтаниÑлав Мелих",
+ size = "1400801 octets" }
+
+@book{ DykhovichnyiVladimirAbramovichSlobodskoiMorisRomanovich693,
+ title = "Стакан воды",
+ author = "Владимир Ðбрамович Дыховичный and ÐœÐ¾Ñ€Ð¸Ñ Ð Ð¾Ð¼Ð°Ð½Ð¾Ð²Ð¸Ñ‡ СлободÑкой",
+ size = "1629231 octets" }
+
+@book{ SlobodskoiMorisRomanovich694,
+ title = "Ðовые Ð¿Ð¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°Ð²Ð¾Ð³Ð¾ Ñолдата Швейка. ЧаÑÑ‚ÑŒ перваÑ",
+ author = "ÐœÐ¾Ñ€Ð¸Ñ Ð Ð¾Ð¼Ð°Ð½Ð¾Ð²Ð¸Ñ‡ СлободÑкой",
+ size = "1744384 octets" }
+
+@misc{ MazinIghor695,
+ title = "English and Russian",
+ author = "Игорь Мазин",
+ size = "297459 octets" }
+
+@misc{ MikhailikIeliena697,
+ title = "ГенетичеÑÐºÐ°Ñ Ñ€Ð°Ð·Ð½Ð¸Ñ†Ð° между Ð´Ð²ÑƒÐ¼Ñ Ð²Ð¸Ð´Ð°Ð¼Ð¸ кукурузы…",
+ author = "Елена Михайлик",
+ size = "116270 octets" }
+
+@misc{ MikhailikIurii698,
+ title = "Пальмы и Ñ€Ñбины",
+ author = "Юрий Михайлик",
+ size = "102270 octets" }
+
+@misc{ MikhailikIurii699,
+ title = "Рв ТенгинÑком полку пополненье…",
+ author = "Юрий Михайлик",
+ size = "143789 octets" }
+
+@misc{ InksterTim700,
+ title = "Dingbats, Ornaments \& Fanciful Initials",
+ author = "Tim Inkster",
+ size = "22958195 octets" }
+
+@misc{ DragunasJ.M.701,
+ title = "Fanciful Ridiculousness, Vol 2",
+ author = "J. M. Dragunas",
+ size = "165195331 octets" }
+
+@book{ MikhailikIeliena702,
+ title = "Ð­Ð½Ñ‚Ñ€Ð¾Ð¿Ð¸Ñ Ð±ÐµÑ€ÐµÑ‚ Ñвое",
+ author = "Елена Михайлик",
+ size = "190364 octets" }
+
+@book{ BoltonJohn703,
+ title = "The Room Where It Happened",
+ author = "John Bolton",
+ size = "11695012 octets" }
+
+@book{ SimienonZhorzh704,
+ title = "ÐŸÐµÑ‚ÐµÑ€Ñ Ð›Ð°Ñ‚Ñ‹Ñˆ",
+ author = "Жорж Сименон",
+ size = "459630 octets" }
+
+@book{ SimienonZhorzh705,
+ title = "Коновод Ñ Ð±Ð°Ñ€Ð¶Ð¸ «Провидение»",
+ author = "Жорж Сименон",
+ size = "389157 octets" }
+
+@book{ GinzburghLiev706,
+ title = "Лирика вагантов в переводах Льва Гинзбурга",
+ author = "Лев Гинзбург",
+ size = "277205 octets" }
+
+@book{ SimienonZhorzh707,
+ title = "Покойный гоÑподин Галле",
+ author = "Жорж Сименон",
+ size = "309886 octets" }
+
+@misc{ SimienonZhorzh709,
+ title = "ВиÑельник из Сен-Фольена",
+ author = "Жорж Сименон",
+ size = "240394 octets" }
+
+@misc{ SimienonZhorzh710,
+ title = "Цена головы",
+ author = "Жорж Сименон",
+ size = "294018 octets" }
+
+@misc{ SimienonZhorzh711,
+ title = "Желтый пеÑ",
+ author = "Жорж Сименон",
+ size = "499142 octets" }
+
+@misc{ SimienonZhorzh712,
+ title = "Ðочь на перекреÑтке",
+ author = "Жорж Сименон",
+ size = "452171 octets" }
+
+@book{ SimienonZhorzh713,
+ title = "ПреÑтупление в Голландии",
+ author = "Жорж Сименон",
+ size = "274206 octets" }
+
+@book{ SimienonZhorzh714,
+ title = "«Кабачок ньюфаундлендцев»",
+ author = "Жорж Сименон",
+ size = "277426 octets" }
+
+@misc{ ChaundyT.W.BarrettP.R.BateyCharles715,
+ title = "The Printing of Mathematics: Aids for Authors and Editors and Rules for Compositors and Readers at the University Press, Oxford",
+ author = "T. W. Chaundy and P. R. Barrett and Charles Batey",
+ size = "44940931 octets" }
+
+@book{ SimienonZhorzh716,
+ title = "Танцовщица «ВеÑелой Мельницы»",
+ author = "Жорж Сименон",
+ size = "301912 octets" }
+
+@misc{ SimienonZhorzh717,
+ title = "Двухгрошовый кабачок",
+ author = "Жорж Сименон",
+ size = "424905 octets" }
+
+@book{ SimienonZhorzh718,
+ title = "Тень на шторе",
+ author = "Жорж Сименон",
+ size = "251413 octets" }
+
+@book{ ZielchienkoVsievolodVladimirovich719,
+ title = "Стихотворение ВладиÑлава ХодаÑевича «ОбезьÑна»: Комментарий",
+ author = "Ð’Ñеволод Владимирович Зельченко",
+ size = "1368671 octets" }
+
+@book{ SimienonZhorzh720,
+ title = "Дело Сен-Фиакра",
+ author = "Жорж Сименон",
+ size = "306772 octets" }
+
+@book{ KharonIakovIevghienievich721,
+ title = "Злые пеÑни Гийома дю Вентре : ПрозаичеÑкий комментарий к поÑтичеÑкой биографии.",
+ author = "Яков Евгеньевич Харон",
+ size = "533693 octets" }
+
+@misc{ AlshitsDaniilAndrieievDaniilParinVasiliiRakovLiev726,
+ title = "Ðовейший Плутарх",
+ author = "Даниил Ðльшиц and Даниил Ðндреев and ВаÑилий Парин and Лев Раков",
+ size = "3282230 octets" }
+
+@book{ WilsonPeter727,
+ title = "Glisterings. LaTeX \& other Oddments",
+ author = "Peter Wilson",
+ size = "1876518 octets" }
+
+@book{ Gordon-ReedAnnette728,
+ title = "Racism in America",
+ author = "Annette Gordon-Reed",
+ size = "17251535 octets" }
+
+@book{ WempnerGeraldTalasidisDemosthenes730,
+ title = "Mechanics of Solids and Shells: Theories and Approximations",
+ author = "Gerald Wempner and Demosthenes Talasidis",
+ size = "6854584 octets" }
+
+@book{ RudnickJosephGaspariGeorge731,
+ title = "Elements of the Random Walk: An Introduction for Advanced Students and Researchers",
+ author = "Joseph Rudnick and George Gaspari",
+ size = "3055011 octets" }
+
+@book{ MikhailikIurii732,
+ title = "Ð£Ñ…Ð¾Ð´Ñ Ð² полутьму налегке",
+ author = "Юрий Михайлик",
+ size = "1359155 octets" }
+
+@book{ LurieIa.S.RykovIu.D.733,
+ title = "ПерепиÑка Ивана Грозного Ñ Ðндреем КурбÑким",
+ author = "Я. С. Лурье and Ю. Д. Рыков",
+ size = "25644799 octets" }
+
+@book{ RebecchiniDamianoVassenaRaffaella734,
+ title = "Reading in Russia: Practices of Reading and Literary Communication, 1760-1930",
+ author = "Damiano Rebecchini and Raffaella Vassena",
+ size = "2634120 octets" }
+
+@book{ RebecchiniD.VassenaR.735,
+ title = "Reading in Russia. A History of Reading in Modern Russia. Vol 3",
+ author = "D. Rebecchini and R. Vassena",
+ size = "18819608 octets" }
+
+@book{ RebecchiniD.VassenaR.736,
+ title = "Reading in Russia. A History of Reading in Modern Russia. Vol 2",
+ author = "D. Rebecchini and R. Vassena",
+ size = "4455286 octets" }
+
+@book{ MoskalevAlexey737,
+ title = "Biomarkers of Human Aging",
+ author = "Alexey Moskalev",
+ size = "8475399 octets" }
+
+@book{ BriekhtBiertold738,
+ title = "СтихотворениÑ. РаÑÑказы. ПьеÑÑ‹",
+ author = "Бертольд Брехт",
+ size = "2670735 octets" }
+
+@book{ Kolliektivavtorov739,
+ title = "ОдеÑÑкий юмор: ÐнтологиÑ",
+ author = "Коллектив авторов and Валерий Хаит",
+ size = "2885232 octets" }
+
+@book{ TaibbiMatt741,
+ title = "Hate Inc.",
+ author = "Matt Taibbi",
+ size = "2476596 octets" }
+
+@book{ MylesEileen742,
+ title = "Inferno",
+ author = "Eileen Myles",
+ size = "2431521 octets" }
+
+@book{ AssangeJulian743,
+ title = "When Google Met WikiLeaks",
+ author = "Julian Assange",
+ size = "1770588 octets" }
+
+@book{ DuncombeStephen750,
+ title = "Dream or Nightmare: Reimagining Politics in an Age of Fantasy",
+ author = "Stephen Duncombe",
+ size = "3226466 octets" }
+
+@misc{ LehmannChris751,
+ title = "Rich People Things",
+ author = "Chris Lehmann",
+ size = "6115669 octets" }
+
+@book{ LaphamLewisH.752,
+ title = "Money and Class in America",
+ author = "Lewis H. Lapham",
+ size = "1897233 octets" }
+
+@misc{ RaufTakabbir756,
+ title = "Трон ЗнаниÑ. Книга 3",
+ author = "Такаббир Рауф",
+ size = "1578157 octets" }
+
+@book{ avtorovKolliektiv757,
+ title = "ПоÑÐ·Ð¸Ñ Ð¸ проза Древнего ВоÑтока",
+ author = "Коллектив авторов",
+ size = "3660012 octets" }
+
+@misc{ McElreathRichard758,
+ title = "Statistical Rethinking: A Bayesian Course With Examples in R and STAN",
+ author = "Richard McElreath",
+ size = "40212376 octets" }
+
+@book{ ZhadanSierghii759,
+ title = "МеÑопотаміÑ",
+ author = "Сергій Жадан",
+ size = "1114198 octets" }
+
+@book{ ZhadanSierghiiViktorovichAndrukhovichSofiiaDierieshLiubkoDnistroviiAnatoliiKarpaIrienaIghorivnaPirkaloSvitlanaPovaliaievaSvitlanaVadimivnaProkhaskoTarasBoghdanovichSniadankoNatalkaUshkalovSashko760,
+ title = "Декамерон. 10 українÑьких прозаїків оÑтанніх деÑÑти років",
+ author = "Сергій Вікторович Жадан and Ð¡Ð¾Ñ„Ñ–Ñ Ðндрухович and Любко Дереш and Ðнатолій ДніÑтровий and Ірена Ігорівна Карпа and Світлана Пиркало and Світлана Вадимівна ПовалÑєва and Ð¢Ð°Ñ€Ð°Ñ Ð‘Ð¾Ð³Ð´Ð°Ð½Ð¾Ð²Ð¸Ñ‡ ПрохаÑько and Ðаталка СнÑданко and Сашко Ушкалов",
+ size = "418952 octets" }
+
+@book{ MukharskiiAntonAndrukhovichIuriiBiebieshkoVladimirVasilievSierghieiVinnichukIuriiVodichkaGustavVoliazlovskiiStasGorbachievDmitriiDimshitsEduardDoniiAlieksandrIeshkilievVladimirZhadanSierghieiZholdakBoghdanZalievskiiAlieksieiIzdrykIuriiKarasIevghieniiKirichienkoVladislavKovalAlieksandraMalkovichIvanMannOlieksaMarushchienkoViktorPodiervianskiiAlieksandrPokalchukOlieghRalkoVladaSavadovArsienSiemiesiukIvanSidor-GibielindaOlieghKuzmienkoAndrieiSolovievAlieksandrSolomukhaAntonTitarienkoAlieksieiTsagholovVasilii761,
+ title = "ЖлобологіÑ",
+ author = "Ðнтон МухарÑкий and Юрий Ðндрухович and Владимир Бебешко and Сергей ВаÑильєв and Юрий Винничук and ГуÑтав Водичка and Ð¡Ñ‚Ð°Ñ Ð’Ð¾Ð»ÑзловÑкий and Дмитрий Горбачев and Эдуард Димшиц and ÐлекÑандр Доний and Владимир Ешкилев and Сергей Жадан and Богдан Жолдак and ÐлекÑей ЗалевÑкий and Юрий Издрык and Евгений КараÑÑŒ and ВладиÑлав Кириченко and ÐлекÑандра Коваль and Иван Малкович and ОлекÑа Манн and Виктор Марущенко and ÐлекÑандр ПодервÑнÑкий and Олег Покальчук and Влада Ралко and ÐÑ€Ñен Савадов and Иван СемеÑюк and Олег Сидор-Гибелинда and Ðндрей Кузьменко and ÐлекÑандр Соловьев and Ðнтон Соломуха and ÐлекÑей Титаренко and ВаÑилий Цаголов",
+ size = "5313050 octets" }
+
+@book{ SilvestreJosephBalthazar762,
+ title = "Alphabet-album; collection de soixante feuilles d'alphabets historiés et fleuronnés, tirés des principales bibliothèques de l'Europe",
+ author = "Silvestre, Joseph Balthazar",
+ size = "4888005 octets" }
+
+@book{ GiertsienAlieksandrIvanovich764,
+ title = "Том 9. Былое и думы. ЧаÑÑ‚ÑŒ 4",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "991382 octets" }
+
+@book{ GiertsienAlieksandrIvanovich765,
+ title = "Том 10. Былое и думы. ЧаÑÑ‚ÑŒ 5",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "1419279 octets" }
+
+@book{ GiertsienAlieksandrIvanovich766,
+ title = "Том 11. Былое и думы. ЧаÑÑ‚ÑŒ 6-8",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "1883745 octets" }
+
+@book{ GiertsienAlieksandrIvanovich767,
+ title = "Том 1. ÐŸÑ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1829-1841 годов",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "1330078 octets" }
+
+@book{ GiertsienAlieksandrIvanovich768,
+ title = "Том 3. Дилетантизм в науке. ПиÑьма об изучении природы",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "1024570 octets" }
+
+@book{ GiertsienAlieksandrIvanovich769,
+ title = "Том 4. ХудожеÑтвенные Ð¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1842-1846",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "902481 octets" }
+
+@book{ GiertsienAlieksandrIvanovich770,
+ title = "Том 2. Статьи и фельетоны 1841–1846. Дневник",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "1328568 octets" }
+
+@book{ GiertsienAlieksandrIvanovich771,
+ title = "Том 7. О развитии революционных идей в РоÑÑии",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "942578 octets" }
+
+@book{ GiertsienAlieksandrIvanovich772,
+ title = "Том 6. С того берега. Долг прежде вÑего",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "1182801 octets" }
+
+@book{ GiertsienAlieksandrIvanovich773,
+ title = "Том 5. ПиÑьма из Франции и Италии",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "1494348 octets" }
+
+@book{ GiertsienAlieksandrIvanovich774,
+ title = "Том 8. Былое и думы. ЧаÑÑ‚ÑŒ 1-3",
+ author = "ÐлекÑандр Иванович Герцен",
+ size = "1124542 octets" }
+
+@book{ PriiemyshievaMarina775,
+ title = "Тайные и уÑловные Ñзыки в РоÑÑии XIX в. ЧаÑÑ‚ÑŒ I",
+ author = "Марина Приемышева",
+ size = "16229340 octets" }
+
+@book{ PriiemyshievaMarina776,
+ title = "Тайные и уÑловные Ñзыки в РоÑÑии XIX в. ЧаÑÑ‚ÑŒ II. ПриложениÑ",
+ author = "Марина Приемышева",
+ size = "15627045 octets" }
+
+@book{ KamenevAlex777,
+ title = "Field Theory of Non-Equilibrium Systems",
+ author = "Alex Kamenev",
+ size = "3218786 octets" }
+
+@misc{ ZimmerHeinrichCampbellJoseph778,
+ title = "The King and the Corpse: Tales of the Soul's Conquest of Evil",
+ author = "Heinrich Zimmer and Joseph Campbell",
+ size = "62519025 octets" }
+
+@book{ ZizekSlavoj779,
+ title = "PANDEMIC!: COVID-19 Shakes the World",
+ author = "Slavoj Žižek",
+ size = "1526970 octets" }
+
+
+@misc{ UkrayinkaLiesia786,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 01",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "7135013 octets" }
+
+@misc{ UkrayinkaLiesia787,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 10",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "3272961 octets" }
+
+@misc{ UkrayinkaLiesia788,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 11",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "4451715 octets" }
+
+@misc{ UkrayinkaLiesia789,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 12",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "8201797 octets" }
+
+@misc{ UkrayinkaLiesia790,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 08",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "1829765 octets" }
+
+@misc{ UkrayinkaLiesia791,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 02",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "7906350 octets" }
+
+@misc{ UkrayinkaLiesia792,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 03",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "3649045 octets" }
+
+@misc{ UkrayinkaLiesia793,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 04",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "5946754 octets" }
+
+@misc{ UkrayinkaLiesia794,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 05",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "5308051 octets" }
+
+@misc{ UkrayinkaLiesia795,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 06",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "4089141 octets" }
+
+@misc{ UkrayinkaLiesia796,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 09",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "13832028 octets" }
+
+@misc{ UkrayinkaLiesia797,
+ title = "Ð—Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ‚Ð²Ð¾Ñ€Ñ–Ð² у 12 томах. Том 07",
+ author = "ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ°",
+ size = "2437439 octets" }
+
+@book{ ZhvanietskiiMikhailMikhailovich798,
+ title = "Собрание произведений в пÑти томах. Том 5. Двадцать первый век",
+ author = "Михаил Михайлович Жванецкий",
+ size = "792438 octets" }
+
+@book{ ZhvanietskiiMikhailMikhailovich799,
+ title = "Собрание произведений в пÑти томах. Том 1. ШеÑтидеÑÑтые",
+ author = "Михаил Михайлович Жванецкий",
+ size = "480511 octets" }
+
+@book{ ZhvanietskiiMikhailMikhailovich800,
+ title = "Собрание произведений в пÑти томах. Том 2. СемидеÑÑтые",
+ author = "Михаил Михайлович Жванецкий",
+ size = "893379 octets" }
+
+@book{ ZhvanietskiiMikhailMikhailovich801,
+ title = "Собрание произведений в пÑти томах. Том 4. ДевÑноÑтые",
+ author = "Михаил Михайлович Жванецкий",
+ size = "1080766 octets" }
+
+@book{ ZhvanietskiiMikhailMikhailovich802,
+ title = "Собрание произведений в пÑти томах. Том 3. ВоÑьмидеÑÑтые",
+ author = "Михаил Михайлович Жванецкий",
+ size = "681142 octets" }
+
+@book{ MehtaMadanLal803,
+ title = "Random Matrices",
+ author = "Madan Lal Mehta",
+ size = "5219024 octets" }
+
+@book{ AlkieiSapfo804,
+ title = "Сапфо и Ðлкей (Ñборник)",
+ author = "Ðлкей and Сапфо",
+ size = "3388955 octets" }
+
+@book{ BouchaudJean-PhilippeMezardMarcDalibardJean805,
+ title = "Complex Systems: Lecture Notes of the Les Houches Summer School 2006",
+ author = "Jean-Philippe Bouchaud and Marc Mézard and Jean Dalibard",
+ size = "6033688 octets" }
+
+@misc{ LivanGiacomoNovaesMarcelVivoPierpaolo808,
+ title = "Introduction to Random Matrices: Theory and Practice",
+ author = "Giacomo Livan and Marcel Novaes and Pierpaolo Vivo",
+ size = "1326375 octets" }
+
+@misc{ EynardBertrandKimuraTaroRibaultSylvain809,
+ title = "Random matrices",
+ author = "Bertrand Eynard and Taro Kimura and Sylvain Ribault",
+ size = "1855375 octets" }
+
+@misc{ HeglandFrodeAlexander810,
+ title = "THE FUTURE OF TEXT",
+ author = "Frode Alexander Hegland",
+ size = "46656285 octets" }
+
+@book{ AlkieiSafoIvanovViachieslav812,
+ title = "ПеÑни и лиричеÑкие отрывки",
+ author = "Ðлкей and Сафо and Ð’ÑчеÑлав Иванов",
+ size = "6656971 octets" }
+
+@book{ RowlandsDA813,
+ title = "Physics of Digital Photography (Second Edition)",
+ author = "D A Rowlands",
+ size = "32786166 octets" }
+
+@book{ VoiculescuDanV.DykemaK.J.NicaA.815,
+ title = "Free Random Variables",
+ author = "Dan V. Voiculescu and K. J. Dykema and A. Nica",
+ size = "3677854 octets" }
+
+@misc{ PriestRobertJ.816,
+ title = "Missionary Positions",
+ author = "Robert J. Priest",
+ size = "297012 octets" }
+
+@book{ LietsStanislavIezhi817,
+ title = "Почти вÑе",
+ author = "СтаниÑлав Ежи Лец",
+ size = "3467624 octets" }
+
+@misc{ InksterTim821,
+ title = "Victorian Christmas Ornaments",
+ author = "Tim Inkster",
+ size = "25442811 octets" }
+
+@misc{ InksterTim822,
+ title = "The Thing about Major Street",
+ author = "Tim Inkster",
+ size = "10921366 octets" }
+
+@misc{ ViaziemskiiPietrAndrieievich823,
+ title = "Ð¡Ñ‚Ð°Ñ€Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð¶ÐºÐ°. ЧаÑÑ‚ÑŒ 3",
+ author = "Петр Ðндреевич Ð’ÑземÑкий",
+ size = "426442 octets" }
+
+@misc{ ViaziemskiiPietrAndrieievich824,
+ title = "Ð¡Ñ‚Ð°Ñ€Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð¶ÐºÐ°. ЧаÑÑ‚ÑŒ 2",
+ author = "Петр Ðндреевич Ð’ÑземÑкий",
+ size = "499415 octets" }
+
+@misc{ ViaziemskiiPietrAndrieievich825,
+ title = "Ð¡Ñ‚Ð°Ñ€Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð¶ÐºÐ°. ЧаÑÑ‚ÑŒ 1",
+ author = "Петр Ðндреевич Ð’ÑземÑкий",
+ size = "755888 octets" }
+
+@book{ SlutskiiBorisAbramovich826,
+ title = "Собрание Ñочинений. Том 2. Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ 1961–1972",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ðбрамович Слуцкий",
+ size = "399579 octets" }
+
+@book{ SlutskiiBorisAbramovich827,
+ title = "Собрание Ñочинений. Том 3. СтихотворениÑ, 1972–1977",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ðбрамович Слуцкий",
+ size = "423543 octets" }
+
+@book{ SlutskiiBorisAbramovich828,
+ title = "Собрание Ñочинений. Том 1. Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ 1939–1961",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ðбрамович Слуцкий",
+ size = "536150 octets" }
+
+@misc{ KahnDaniel829,
+ title = "Partisans and parasites",
+ author = "Daniel Kahn",
+ size = "6667472 octets" }
+
+@misc{ KahnDaniel830,
+ title = "Lost causes songbook",
+ author = "Daniel Kahn",
+ size = "4136067 octets" }
+
+@misc{ KahnDaniel831,
+ title = "The broken tongue",
+ author = "Daniel Kahn",
+ size = "2329371 octets" }
+
+@misc{ KahnDaniel832,
+ title = "Bad old songbook",
+ author = "Daniel Kahn",
+ size = "1151031 octets" }
+
+@book{ RodariDzhanni833,
+ title = "Сказки по телефону",
+ author = "Джанни Родари",
+ size = "202144 octets" }
+
+@book{ PrutkovKozma834,
+ title = "Ð¡Ð¾Ñ‡Ð¸Ð½ÐµÐ½Ð¸Ñ ÐšÐ¾Ð·ÑŒÐ¼Ñ‹ Пруткова",
+ author = "Козьма Прутков",
+ size = "1020405 octets" }
+
+@misc{ GouinghTomas835,
+ title = "Борода и филоÑофиÑ",
+ author = "Ð¢Ð¾Ð¼Ð°Ñ Ð“Ð¾ÑƒÐ¸Ð½Ð³",
+ size = "2510996 octets" }
+
+@misc{ KliemientAvrieliiPrudientsii836,
+ title = "СочинениÑ",
+ author = "Ðврелий Пруденций Клемент",
+ size = "7164158 octets" }
+
+@book{ KissIstvanZ.MillerJoelC.SimonPeterL.838,
+ title = "Mathematics of Epidemics on Networks: From Exact to Approximate Models",
+ author = "István Z. Kiss and Joel C. Miller and Péter L. Simon",
+ size = "14775299 octets" }
+
+@book{ LievitanskiiIuriiDavidovich840,
+ title = "Черно-белое кино",
+ author = "Юрий Давидович ЛевитанÑкий",
+ size = "799197 octets" }
+
+@misc{ MilkusAlieksandr842,
+ title = "Как мы переÑтраивали ÑоветÑкое образование",
+ author = "ÐлекÑандр МилкуÑ",
+ size = "62028347 octets" }
+
+@book{ KayGuyGavriel843,
+ title = "A Brightness Long Ago",
+ author = "Guy Gavriel Kay",
+ size = "2202853 octets" }
+
+@book{ OlverFrankW.J.LozierDanielW.BoisvertRonaldF.ClarkCharlesW.844,
+ title = "NIST Handbook of Mathematical Functions",
+ author = "Frank W. J. Olver and Daniel W. Lozier and Ronald F. Boisvert and Charles W. Clark",
+ size = "23985570 octets" }
+
+@misc{ BerlinIsaiah846,
+ title = "The Hedgehog and the Fox: An Essay on Tolstoy's View of History - Second Edition",
+ author = "Isaiah Berlin",
+ size = "4386255 octets" }
+
+@book{ KavafisKonstantinos847,
+ title = "Полное Ñобрание Ñтихотворений: [пер. Ñ Ð³Ñ€ÐµÑ‡.]",
+ author = "КонÑÑ‚Ð°Ð½Ñ‚Ð¸Ð½Ð¾Ñ ÐšÐ°Ð²Ð°Ñ„Ð¸Ñ",
+ size = "4691413 octets" }
+
+@misc{ IakobsonRomanOsipovichIlinskaiaS.B.BrodskiiIosifAlieksandrovichToporovViktorLieonidovichTsivianTatianaVladimirovnaKavafisKonstantinosP.SmaghinaIevghieniiaBorisovnaKolaklidisP.849,
+ title = "РуÑÑÐºÐ°Ñ ÐºÐ°Ð²Ð°Ñ„Ð¸Ð°Ð½Ð°. Ð’ трех чаÑÑ‚ÑÑ…",
+ author = "Роман ОÑипович ЯкобÑон and С. Б. ИльинÑÐºÐ°Ñ and ИоÑиф ÐлекÑандрович БродÑкий and Виктор Леонидович Топоров and ТатьÑна Владимировна ЦивьÑн and КонÑÑ‚Ð°Ð½Ñ‚Ð¸Ð½Ð¾Ñ ÐŸ. ÐšÐ°Ð²Ð°Ñ„Ð¸Ñ and Ð•Ð²Ð³ÐµÐ½Ð¸Ñ Ð‘Ð¾Ñ€Ð¸Ñовна Смагина and П. КолаклидиÑ",
+ size = "10600082 octets" }
+
+@book{ LawsonAndrewB.850,
+ title = "Statistical Methods in Spatial Epidemiology",
+ author = "Andrew B. Lawson",
+ size = "5970363 octets" }
+
+@misc{ GamburdMiriam851,
+ title = "РаÑÑказы",
+ author = "Мириам Гамбурд",
+ size = "651181 octets" }
+
+@misc{ DalVladimirIvanovich852,
+ title = "Толковый Ñловарь живого великоруÑÑкого Ñзыка",
+ author = "Владимир Иванович Даль",
+ size = "8784559 octets" }
+
+@book{ GielliiAvl855,
+ title = "ÐттичеÑкие ночи. Книги XI - XX",
+ author = "Ðвл Геллий",
+ size = "1414676 octets" }
+
+@book{ GielliiAvl856,
+ title = "ÐттичеÑкие ночи. Книги I - X",
+ author = "Ðвл Геллий",
+ size = "1869278 octets" }
+
+@book{ ShmarakovRomanLvovich857,
+ title = "Книжица наших забав",
+ author = "Роман Львович Шмараков",
+ size = "4576809 octets" }
+
+@misc{ FrankfurtHarryG.858,
+ title = "On Bullshit",
+ author = "Harry G. Frankfurt",
+ size = "301363 octets" }
+
+@book{ VaisPietier859,
+ title = "Дознание и другие пьеÑÑ‹",
+ author = "Петер ВайÑ",
+ size = "12371286 octets" }
+
+@misc{ Anonymous860,
+ title = "70 Years of History Today",
+ author = "Anonymous",
+ size = "2355954 octets" }
+
+@book{ ShvartsIevghieniiLvovich861,
+ title = "Обыкновенное чудо. Дракон",
+ author = "Евгений Львович Шварц",
+ size = "2010955 octets" }
+
+@book{ ShvartsIevghieniiLvovich862,
+ title = "Тень. Голый король",
+ author = "Евгений Львович Шварц",
+ size = "2236885 octets" }
+
+@book{ McDougallBruce863,
+ title = "Urban Disturbances",
+ author = "Bruce McDougall",
+ size = "5567974 octets" }
+
+@misc{ ChestertonG.K.864,
+ title = "The Flying Inn",
+ author = "G. K. Chesterton",
+ size = "350783 octets" }
+
+@book{ CaseAnneDeatonAngus865,
+ title = "Deaths of Despair and the Future of Capitalism",
+ author = "Anne Case and Angus Deaton",
+ size = "9389040 octets" }
+
+@misc{ CardyJohn866,
+ title = "Reaction-diffusion processes",
+ author = "John Cardy",
+ size = "184111 octets" }
+
+@book{ HorizonsStrange869,
+ title = "Strange Horizons: OCTOBER 2020",
+ author = "Strange Horizons",
+ size = "11303325 octets" }
+
+@book{ HorizonsStrange872,
+ title = "Strange Horizons: Fund Drive 2020",
+ author = "Strange Horizons",
+ size = "8499966 octets" }
+
+@book{ HorizonsStrange882,
+ title = "Strange Horizons: JANUARY 2020",
+ author = "Strange Horizons",
+ size = "10410588 octets" }
+
+@book{ HorizonsStrange884,
+ title = "Strange Horizons: NOVEMBER 2020",
+ author = "Strange Horizons",
+ size = "12570272 octets" }
+
+@book{ HorizonsStrange888,
+ title = "Strange Horizons: APRIL 2020",
+ author = "Strange Horizons",
+ size = "3619652 octets" }
+
+@book{ HorizonsStrange889,
+ title = "Strange Horizons: MARCH 2020",
+ author = "Strange Horizons",
+ size = "7665329 octets" }
+
+@book{ HorizonsStrange894,
+ title = "Strange Horizons: FEBRUARY 2020",
+ author = "Strange Horizons",
+ size = "7358395 octets" }
+
+@book{ HorizonsStrange895,
+ title = "Strange Horizons: MAY 2020",
+ author = "Strange Horizons",
+ size = "4320804 octets" }
+
+@book{ HorizonsStrange898,
+ title = "Strange Horizons: DECEMBER 2020",
+ author = "Strange Horizons",
+ size = "3503808 octets" }
+
+@book{ HorizonsStrange900,
+ title = "Strange Horizons: JULY 2020",
+ author = "Strange Horizons",
+ size = "16473848 octets" }
+
+@book{ HorizonsStrange902,
+ title = "Strange Horizons: SEPTEMBER 2020",
+ author = "Strange Horizons",
+ size = "11913049 octets" }
+
+@book{ HorizonsStrange904,
+ title = "Strange Horizons: AUGUST 2020",
+ author = "Strange Horizons",
+ size = "11623752 octets" }
+
+@book{ HorizonsStrange905,
+ title = "Strange Horizons: JUNE 2020",
+ author = "Strange Horizons",
+ size = "7145940 octets" }
+
+@misc{ EdelmanAlanSuttonBrianD.906,
+ title = "From Random Matrices to Stochastic Operators",
+ author = "Alan Edelman and Brian D. Sutton",
+ size = "587808 octets" }
+
+@misc{ DumitriuIoana907,
+ title = "The Semicircle Law and beyond: the shape of spectra of Wigner matrices",
+ author = "Ioana Dumitriu",
+ size = "632334 octets" }
+
+@book{ LakatosImreFeyerabendPaul908,
+ title = "For and Against Method: Including Lakatos's Lectures on Scientific Method and the Lakatos-Feyerabend Correspondence",
+ author = "Imre Lakatos and Paul Feyerabend",
+ size = "30930288 octets" }
+
+@misc{ SobakinTim909,
+ title = "Трамвай 1990-01",
+ author = "Тим Собакин",
+ size = "3169678 octets" }
+
+@misc{ SobakinTim910,
+ title = "Трамвай 1995-045",
+ author = "Тим Собакин",
+ size = "3513606 octets" }
+
+@misc{ SobakinTim911,
+ title = "Трамвай 1995-023",
+ author = "Тим Собакин",
+ size = "2713128 octets" }
+
+@misc{ SobakinTim912,
+ title = "Трамвай 1995-06",
+ author = "Тим Собакин",
+ size = "3053146 octets" }
+
+@misc{ SobakinTim913,
+ title = "Трамвай 1995-01",
+ author = "Тим Собакин",
+ size = "1836127 octets" }
+
+@misc{ SobakinTim914,
+ title = "Трамвай 1994-12",
+ author = "Тим Собакин",
+ size = "2961840 octets" }
+
+@misc{ SobakinTim915,
+ title = "Трамвай 1994-11",
+ author = "Тим Собакин",
+ size = "2907737 octets" }
+
+@misc{ SobakinTim916,
+ title = "Трамвай 1994-10",
+ author = "Тим Собакин",
+ size = "3755538 octets" }
+
+@misc{ SobakinTim917,
+ title = "Трамвай 1990-02",
+ author = "Тим Собакин",
+ size = "2531932 octets" }
+
+@misc{ SobakinTim918,
+ title = "Трамвай 1994-08",
+ author = "Тим Собакин",
+ size = "3165299 octets" }
+
+@misc{ SobakinTim919,
+ title = "Трамвай 1994-09",
+ author = "Тим Собакин",
+ size = "2985706 octets" }
+
+@misc{ SobakinTim920,
+ title = "Трамвай 1990-03",
+ author = "Тим Собакин",
+ size = "3174404 octets" }
+
+@misc{ SobakinTim921,
+ title = "Трамвай 1994-06",
+ author = "Тим Собакин",
+ size = "3496439 octets" }
+
+@misc{ SobakinTim922,
+ title = "Трамвай 1994-07",
+ author = "Тим Собакин",
+ size = "2601712 octets" }
+
+@misc{ SobakinTim923,
+ title = "Трамвай 1994-04",
+ author = "Тим Собакин",
+ size = "3206934 octets" }
+
+@misc{ SobakinTim924,
+ title = "Трамвай 1994-03",
+ author = "Тим Собакин",
+ size = "3195670 octets" }
+
+@misc{ SobakinTim925,
+ title = "Трамвай 1994-05",
+ author = "Тим Собакин",
+ size = "2943770 octets" }
+
+@misc{ SobakinTim926,
+ title = "Трамвай 1994-02",
+ author = "Тим Собакин",
+ size = "3311292 octets" }
+
+@misc{ SobakinTim927,
+ title = "Трамвай 1994-01",
+ author = "Тим Собакин",
+ size = "2618265 octets" }
+
+@misc{ SobakinTim928,
+ title = "Трамвай 1993-12",
+ author = "Тим Собакин",
+ size = "2865126 octets" }
+
+@misc{ SobakinTim929,
+ title = "Трамвай 1993-10",
+ author = "Тим Собакин",
+ size = "3149099 octets" }
+
+@misc{ SobakinTim930,
+ title = "Трамвай 1993-11",
+ author = "Тим Собакин",
+ size = "2947724 octets" }
+
+@misc{ SobakinTim931,
+ title = "Трамвай 1993-08",
+ author = "Тим Собакин",
+ size = "3263770 octets" }
+
+@misc{ SobakinTim932,
+ title = "Трамвай 1993-07",
+ author = "Тим Собакин",
+ size = "3312420 octets" }
+
+@misc{ SobakinTim933,
+ title = "Трамвай 1993-05",
+ author = "Тим Собакин",
+ size = "3391809 octets" }
+
+@misc{ SobakinTim934,
+ title = "Трамвай 1993-06",
+ author = "Тим Собакин",
+ size = "2903247 octets" }
+
+@misc{ SobakinTim935,
+ title = "Трамвай 1993-09",
+ author = "Тим Собакин",
+ size = "2749760 octets" }
+
+@misc{ SobakinTim936,
+ title = "Трамвай 1993-04",
+ author = "Тим Собакин",
+ size = "3475535 octets" }
+
+@misc{ SobakinTim937,
+ title = "Трамвай 1993-03",
+ author = "Тим Собакин",
+ size = "3900878 octets" }
+
+@misc{ SobakinTim938,
+ title = "Трамвай 1993-02",
+ author = "Тим Собакин",
+ size = "3718230 octets" }
+
+@misc{ SobakinTim939,
+ title = "Трамвай 1993-01",
+ author = "Тим Собакин",
+ size = "3887231 octets" }
+
+@misc{ SobakinTim940,
+ title = "Трамвай 1991-09",
+ author = "Тим Собакин",
+ size = "4206911 octets" }
+
+@misc{ SobakinTim941,
+ title = "Трамвай 1991-11",
+ author = "Тим Собакин",
+ size = "3499011 octets" }
+
+@misc{ SobakinTim942,
+ title = "Трамвай 1991-10",
+ author = "Тим Собакин",
+ size = "3473419 octets" }
+
+@misc{ SobakinTim943,
+ title = "Трамвай 1991-08",
+ author = "Тим Собакин",
+ size = "3686971 octets" }
+
+@misc{ SobakinTim944,
+ title = "Трамвай 1991-07",
+ author = "Тим Собакин",
+ size = "4109504 octets" }
+
+@misc{ SobakinTim945,
+ title = "Трамвай 1991-06",
+ author = "Тим Собакин",
+ size = "3731244 octets" }
+
+@misc{ SobakinTim946,
+ title = "Трамвай 1991-04",
+ author = "Тим Собакин",
+ size = "4200392 octets" }
+
+@misc{ SobakinTim947,
+ title = "Трамвай 1991-05",
+ author = "Тим Собакин",
+ size = "3531011 octets" }
+
+@misc{ SobakinTim948,
+ title = "Трамвай 1991-02",
+ author = "Тим Собакин",
+ size = "4011491 octets" }
+
+@misc{ SobakinTim949,
+ title = "Трамвай 1991-01",
+ author = "Тим Собакин",
+ size = "3598493 octets" }
+
+@misc{ SobakinTim950,
+ title = "Трамвай 1990-11",
+ author = "Тим Собакин",
+ size = "3238540 octets" }
+
+@misc{ SobakinTim951,
+ title = "Трамвай 1991-03",
+ author = "Тим Собакин",
+ size = "3443583 octets" }
+
+@misc{ SobakinTim952,
+ title = "Трамвай 1990-12",
+ author = "Тим Собакин",
+ size = "4254225 octets" }
+
+@misc{ SobakinTim953,
+ title = "Трамвай 1990-10",
+ author = "Тим Собакин",
+ size = "3673254 octets" }
+
+@misc{ SobakinTim954,
+ title = "Трамвай 1990-09",
+ author = "Тим Собакин",
+ size = "3218404 octets" }
+
+@misc{ SobakinTim955,
+ title = "Трамвай 1990-08",
+ author = "Тим Собакин",
+ size = "3259987 octets" }
+
+@misc{ SobakinTim956,
+ title = "Трамвай 1990-05",
+ author = "Тим Собакин",
+ size = "3359629 octets" }
+
+@misc{ SobakinTim957,
+ title = "Трамвай 1990-06",
+ author = "Тим Собакин",
+ size = "3083256 octets" }
+
+@misc{ SobakinTim958,
+ title = "Трамвай 1990-07",
+ author = "Тим Собакин",
+ size = "2900411 octets" }
+
+@misc{ SobakinTim959,
+ title = "Трамвай 1990-04",
+ author = "Тим Собакин",
+ size = "3117492 octets" }
+
+@book{ TrankvillGaiSvietonii961,
+ title = "Жизнь двенадцати цезарей",
+ author = "Гай Светоний Транквилл",
+ size = "1588096 octets" }
+
+@book{ Plutarkh962,
+ title = "Сравнительные жизнеопиÑаниÑ",
+ author = "Плутарх",
+ size = "7937392 octets" }
+
+@book{ ArbitrGaiPietronii963,
+ title = "Сатирикон",
+ author = "Гай Петроний Ðрбитр",
+ size = "451264 octets" }
+
+@book{ AfanasievAlieksandrNikolaievich964,
+ title = "РуÑÑкие заветные Ñказки",
+ author = "ÐлекÑандр Ðиколаевич ÐфанаÑьев",
+ size = "825500 octets" }
+
+@misc{ KovalievskaiaIelienaAlieksandrovna965,
+ title = "Судьба в наÑледÑтво",
+ author = "Елена ÐлекÑандровна КовалевÑкаÑ",
+ size = "879496 octets" }
+
+@misc{ KovalievskaiaIelienaAlieksandrovna966,
+ title = "ПиÑьмо, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ вÑе началоÑÑŒ",
+ author = "Елена ÐлекÑандровна КовалевÑкаÑ",
+ size = "1616427 octets" }
+
+@misc{ WittigMichaelWittigAndreasWittigMichaelWittigAndreas967,
+ title = "Amazon Web Services in Action, Second Edition",
+ author = "Michael Wittig and Andreas Wittig",
+ size = "40785395 octets" }
+
+@book{ LandauLevDLifshitzE.M968,
+ title = "Fluid Mechanics",
+ author = "Lev D Landau and E. M Lifshitz",
+ size = "34136704 octets" }
+
+@book{ PorterDavidA.EasterlingKennethE.SherifMohamed970,
+ title = "Phase Transformations in Metals and Alloys, Third Edition (Revised Reprint)",
+ author = "David A. Porter and Kenneth E. Easterling and Mohamed Sherif",
+ size = "10221908 octets" }
+
+@book{ PuriSanjayWadhawanVinod971,
+ title = "Kinetics of Phase Transitions",
+ author = "Sanjay Puri and Vinod Wadhawan",
+ size = "5971147 octets" }
+
+@book{ DesaiRashmiC.KapralRaymond972,
+ title = "Dynamics of Self-Organized and Self-Assembled Structures",
+ author = "Rashmi C. Desai and Raymond Kapral",
+ size = "3691102 octets" }
+
+@book{ SlezovVitalyV.973,
+ title = "Kinetics of First Order Phase Transitions",
+ author = "Vitaly V. Slezov",
+ size = "4128370 octets" }
+
+@book{ Fukidid975,
+ title = "ИÑториÑ",
+ author = "Фукидид",
+ size = "2808537 octets" }
+
+@book{ SartreJean-Paul976,
+ title = "Anti-Semite and Jew",
+ author = "Jean-Paul Sartre",
+ size = "1696998 octets" }
+
+@book{ SamoilovDavid977,
+ title = "Мемуары. ПерепиÑка. ЭÑÑе",
+ author = "Давид Самойлов",
+ size = "936075 octets" }
+
+@book{ SamoilovDavid978,
+ title = "ПамÑтные запиÑки",
+ author = "Давид Самойлов",
+ size = "921145 octets" }
+
+@book{ SamoilovDavid979,
+ title = "СчаÑтье ремеÑла",
+ author = "Давид Самойлов",
+ size = "681205 octets" }
+
+@book{ ProppVladimir980,
+ title = "ÐœÐ¾Ñ€Ñ„Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð²Ð¾Ð»ÑˆÐµÐ±Ð½Ð¾Ð¹ Ñказки. ИÑторичеÑкие корни волшебной Ñказки",
+ author = "Владимир Яковлевич Пропп",
+ size = "3714384 octets" }
+
+@misc{ IsichenkoM.B.983,
+ title = "Percolation, statistical topography, and transport in random media",
+ author = "M. B. Isichenko",
+ size = "5675098 octets" }
+
+@book{ PopovSerguei984,
+ title = "Two-Dimensional Random Walk: From Path Counting to Random Interlacements",
+ author = "Serguei Popov",
+ size = "1694661 octets" }
+
+
+@book{ FeldbruggeJobvanEngelenMattivandeWeygaertRienPranavPratyushVegterGert990,
+ title = "Stochastic homology of Gaussian vs. non-Gaussian random fields: graphs towards Betti numbers and persistence diagrams",
+ author = "Feldbrugge, Job and van Engelen, Matti and van de Weygaert, Rien and Pranav, Pratyush and Vegter, Gert",
+ size = "5307715 octets" }
+
+@book{ EdelsbrunnerHerbert991,
+ title = "A Short Course in Computational Geometry and Topology",
+ author = "Herbert Edelsbrunner",
+ size = "3422426 octets" }
+
+@book{ EdelsbrunnerHerbertHarerJohn992,
+ title = "Computational Topology: An Introduction",
+ author = "Herbert Edelsbrunner and John Harer",
+ size = "2478303 octets" }
+
+@book{ ReedMichaelSimonBarry996,
+ title = "I: Functional Analysis",
+ author = "Michael Reed and Barry Simon",
+ size = "37469503 octets" }
+
+@book{ SimonBarry997,
+ title = "Functional Integration and Quantum Physics",
+ author = "Barry Simon",
+ size = "7195259 octets" }
+
+@book{ ReedMichaelSimonBarry998,
+ title = "II: Fourier Analysis, Self-Adjointness",
+ author = "Michael Reed and Barry Simon",
+ size = "10454617 octets" }
+
+@book{ ReedMichaelSimonBarry999,
+ title = "III: Scattering Theory",
+ author = "Michael Reed and Barry Simon",
+ size = "22268710 octets" }
+
+@book{ ReedMichaelSimonBarry1000,
+ title = "IV: Analysis of Operators",
+ author = "Michael Reed and Barry Simon",
+ size = "22803897 octets" }
+
+@misc{ HokusaiKatsushika1001,
+ title = "Thirty-six Views of Mount Fuji",
+ author = "Katsushika Hokusai",
+ size = "8381466 octets" }
+
+@misc{ SokalAlanD.1002,
+ title = "Monte Carlo Methods in Statistical Mechanics: Foundations and New Algorithms",
+ author = "Alan D. Sokal",
+ size = "661392 octets" }
+
+@book{ KloedenPeterE.PlatenEckhard1003,
+ title = "Numerical Solution of Stochastic Differential Equations",
+ author = "Peter E. Kloeden and Eckhard Platen",
+ size = "50569927 octets" }
+
+@book{ BartonGyorgyBartonGabriel1004,
+ title = "Elements of Green's Functions and Propagation: Potentials, Diffusion, and Waves",
+ author = "György Barton and Gabriel Barton",
+ size = "4575334 octets" }
+
+@misc{ MasaAlejandroPolanco1005,
+ title = "Pandemic Atlas",
+ author = "Alejandro Polanco Masa",
+ size = "207070362 octets" }
+
+@book{ VozniesienskiiAndrieiAndrieievich1006,
+ title = "Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ Ð¸ поÑмы. Том 1",
+ author = "Ðндрей Ðндреевич ВознеÑенÑкий",
+ size = "1561707 octets" }
+
+@book{ VozniesienskiiAndrieiAndrieievich1007,
+ title = "Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ Ð¸ поÑмы. Том 2",
+ author = "Ðндрей Ðндреевич ВознеÑенÑкий",
+ size = "1322429 octets" }
+
+@book{ InksterTim1008,
+ title = "Poetic Broadsides",
+ author = "Tim Inkster",
+ size = "347394326 octets" }
+
+@book{ Tiertullian1009,
+ title = "СочинениÑ",
+ author = "Тертуллиан",
+ size = "2468811 octets" }
+
+@misc{ VozniesienskiiAndrieiAndrieievich1010,
+ title = "Прожилки прозы. — Ðœ. : ПРОЗÐиК. 2011",
+ author = "Ðндрей Ðндреевич ВознеÑенÑкий",
+ size = "22725574 octets" }
+
+@book{ DomontovichV.1011,
+ title = "Доктор СерафікуÑ. Без ґрунту [Романи]",
+ author = "В. Домонтович",
+ size = "1166280 octets" }
+
+@book{ DomontovichV.1012,
+ title = "Дівчина з ведмедиком [Роман]. БолотÑна Лукроза [ÐžÐ¿Ð¾Ð²Ñ–Ð´Ð°Ð½Ð½Ñ Ñ‚Ð° нариÑи]",
+ author = "В. Домонтович",
+ size = "1264976 octets" }
+
+@book{ DomontovichViktor1014,
+ title = "Самотній мандрівник проÑтує по Ñамотній дорозі [Романізовані біографії. ОповіданнÑ, роман]",
+ author = "Віктор Домонтович",
+ size = "1422815 octets" }
+
+@book{ TurianskiiOsipVasilovichDomontovichV.1015,
+ title = "Доктор СерафікуÑ. Поза межами болю",
+ author = "ОÑип ВаÑильович ТурÑнÑький and Ð’. Домонтович",
+ size = "1240378 octets" }
+
+@book{ KobilianskaOlghaKotsiubinskiiMikhailoUkrayinkaLiesiaStiefanikVasilChieriemshinaMarkoMartovichLiesIatskivMikhailoMoghilianskiiMikhailoVinnichienkoVolodimirKhviloviiMikolaLiubchienkoArkadiiPidmoghilniiValierianIanovskiiIuriiKosinkaGrighoriiVildieIrinaDomontovichV.KosachIuriiKostietskiiIghorDovzhienkoOlieksandrPiervomaiskiiLieonidZaghriebielniiPavloSimonienkoVasilTiutiunnikGrighirShievchukValieriiGutsaloIevghienPashkovskiiIevghienPortiakVasilAndrukhovichIuriiZabuzhkoOksanaProkhaskoTaras1016,
+ title = "УкраїнÑька мала проза XX ÑтоліттÑ: ÐнтологіÑ. УпорÑдник Віра Ðгеєва",
+ author = "Ольга КобилÑнÑька and Михайло КоцюбинÑький and ЛеÑÑ Ð£ÐºÑ€Ð°Ñ—Ð½ÐºÐ° and ВаÑиль Стефаник and Марко Черемшина and ЛеÑÑŒ Мартович and Михайло Яцків and Михайло МогилÑнÑький and Володимир Винниченко and Микола Хвильовий and Ðркадій Любченко and Валер’Ñн Підмогильний and Юрій ЯновÑький and Григорій КоÑинка and Ірина Вільде and Ð’. Домонтович and Юрій КоÑач and Ігор КоÑтецький and ОлекÑандр Довженко and Леонід ПервомайÑький and Павло Загребельний and ВаÑиль Симоненко and Григір Тютюнник and Валерій Шевчук and Євген Гуцало and Євген ПашковÑький and ВаÑиль ПортÑк and Юрій Ðндрухович and ОкÑана Забужко and Ð¢Ð°Ñ€Ð°Ñ ÐŸÑ€Ð¾Ñ…Ð°Ñько",
+ size = "5456219 octets" }
+
+@misc{ MikhailikIeliena1018,
+ title = "Ð’Ñ‚Ð¾Ñ€Ð°Ñ ÑкÑпедициÑ",
+ author = "Елена Михайлик",
+ size = "133910 octets" }
+
+@book{ SatunovskiiIanAbramovich1019,
+ title = "Среди бела днÑ",
+ author = "Ян Ðбрамович СатуновÑкий",
+ size = "192139 octets" }
+
+@book{ VailPiotrLvovichGienisAlieksandrAlieksandrovich1020,
+ title = "Ð Ð¾Ð´Ð½Ð°Ñ Ð ÐµÑ‡ÑŒ. Уроки ИзÑщной СловеÑноÑти",
+ author = "Пётр Львович Вайль and ÐлекÑандр ÐлекÑандрович ГениÑ",
+ size = "662028 octets" }
+
+@book{ KirsanovSiemien1021,
+ title = "Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ Ð¸ поÑмы",
+ author = "Семен КирÑанов",
+ size = "10754973 octets" }
+
+@book{ GlazkovNikolaiIvanovich1022,
+ title = "Избранное",
+ author = "Ðиколай Иванович Глазков",
+ size = "4297122 octets" }
+
+@book{ SkienaStevenS.1023,
+ title = "Algorithm Design Manual",
+ author = "Steven S. Skiena",
+ size = "10411642 octets" }
+
+@book{ SviashchiennoiePisaniie1024,
+ title = "БиблиÑ. Книги СвÑщенного ПиÑÐ°Ð½Ð¸Ñ Ð’ÐµÑ‚Ñ…Ð¾Ð³Ð¾ и Ðового Завета",
+ author = "СвÑщенное ПиÑание",
+ size = "4060717 octets" }
+
+@book{ LipsonAlexanderMolinskyStevenJ.1027,
+ title = "A Russian Course",
+ author = "Alexander Lipson and Steven J. Molinsky",
+ size = "43984708 octets" }
+
+@book{ LokhvitskaiaNadiezhdaAlieksandrovna1028,
+ title = "Том 4. Книга Июнь. О нежноÑти",
+ author = "Ðадежда ÐлекÑандровна ЛохвицкаÑ",
+ size = "1117452 octets" }
+
+@book{ LokhvitskaiaNadiezhdaAlieksandrovna1029,
+ title = "Том 5. Ð—ÐµÐ¼Ð½Ð°Ñ Ñ€Ð°Ð´ÑƒÐ³Ð°. ВоÑпоминаниÑ",
+ author = "Ðадежда ÐлекÑандровна ЛохвицкаÑ",
+ size = "1320260 octets" }
+
+@book{ LokhvitskaiaNadiezhdaAlieksandrovna1030,
+ title = "Том 3. Ð’Ñе о любви. Городок. РыÑÑŒ",
+ author = "Ðадежда ÐлекÑандровна ЛохвицкаÑ",
+ size = "1121257 octets" }
+
+@book{ LokhvitskaiaNadiezhdaAlieksandrovna1031,
+ title = "Том 1. ЮмориÑтичеÑкие раÑÑказы",
+ author = "Ðадежда ÐлекÑандровна ЛохвицкаÑ",
+ size = "1462503 octets" }
+
+@book{ LokhvitskaiaNadiezhdaAlieksandrovna1032,
+ title = "Том 2. КаруÑель. Дым без огнÑ. Ðеживой зверь",
+ author = "Ðадежда ÐлекÑандровна ЛохвицкаÑ",
+ size = "915780 octets" }
+
+@misc{ KolmoghorovAndrieiNikolaievich1033,
+ title = "Избранные труды. Математика и механика",
+ author = "Ðндрей Ðиколаевич Колмогоров",
+ size = "6840388 octets" }
+
+@misc{ KolmoghorovAndrieiNikolaievich1034,
+ title = "Ð¢ÐµÐ¾Ñ€Ð¸Ñ Ð²ÐµÑ€Ð¾ÑтноÑтей и математичеÑÐºÐ°Ñ ÑтатиÑтика",
+ author = "Ðндрей Ðиколаевич Колмогоров",
+ size = "14212397 octets" }
+
+@misc{ KolmoghorovAndrieiNikolaievich1035,
+ title = "Труды по Ñтиховедению",
+ author = "Ðндрей Ðиколаевич Колмогоров",
+ size = "1243827 octets" }
+
+@misc{ HearnLafcadio1036,
+ title = "Kwaidan: Stories and Studies of Strange Things",
+ author = "Lafcadio Hearn",
+ size = "175580 octets" }
+
+@book{ RampoEdogawa1037,
+ title = "Japanese Tales of Mystery \& Imagination",
+ author = "Edogawa Rampo",
+ size = "3728874 octets" }
+
+@book{ AkinariUedaAkutaghavaRiunoskeEntioSaniuteiRampoEdoghavaSaikakuIkharaOsaraghiDziroAnseiOghitaSiosanSudzukiRioiAsaiTeisioTsughaKotaroTanakaIsikavaDziun1038,
+ title = "Пионовый фонарь: ЯпонÑÐºÐ°Ñ Ñ„Ð°Ð½Ñ‚Ð°ÑтичеÑÐºÐ°Ñ Ð¿Ñ€Ð¾Ð·Ð°",
+ author = "УÑда Ðкинари and РюноÑÐºÑ Ðкутагава and СанъютÑй Энтё and Эдогава Рампо and Ихара Сайкаку and Дзиро ОÑараги and Огита ÐнÑÑй and Судзуки СёÑан and ÐÑаи Рёи and Цуга ТÑйÑÑ‘ and Танака Котаро and Дзюн ИÑикава",
+ size = "1819788 octets" }
+
+@misc{ KabanovAlieksandrMikhailovich1039,
+ title = "Ðа Ñзыке врага: Ñтихи о войне и мире",
+ author = "ÐлекÑандр Михайлович Кабанов",
+ size = "625775 octets" }
+
+@misc{ KhiersonskiiBorisGrighorievich1040,
+ title = "ОдеÑÑкий дневник 2015–2016. Ð’Ð·Ñ€Ñ‹Ð²Ð½Ð°Ñ Ð²Ð¾Ð»Ð½Ð°",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð“Ñ€Ð¸Ð³Ð¾Ñ€ÑŒÐµÐ²Ð¸Ñ‡ ХерÑонÑкий",
+ size = "1485623 octets" }
+
+@misc{ KhiersonskiiBorisGrighorievich1041,
+ title = "ÐÐ¾Ð²ÐµÐ¹ÑˆÐ°Ñ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ ÑредневековьÑ",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð“Ñ€Ð¸Ð³Ð¾Ñ€ÑŒÐµÐ²Ð¸Ñ‡ ХерÑонÑкий",
+ size = "4481489 octets" }
+
+@misc{ KhiersonskiiBorisGrighorievich1042,
+ title = "ДевÑÑ‚ÑŒ",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð“Ñ€Ð¸Ð³Ð¾Ñ€ÑŒÐµÐ²Ð¸Ñ‡ ХерÑонÑкий",
+ size = "2635970 octets" }
+
+@misc{ BakharevichAlghierd1043,
+ title = "Дзеці Ðліндаркі",
+ author = "Ðльгерд БахарÑвіч",
+ size = "975949 octets" }
+
+@book{ LavrientievMikhailAlieksieievichShabatBorisVladimirovich1044,
+ title = "Методы теории функций комплекÑного переменного",
+ author = "Михаил ÐлекÑеевич Лаврентьев and Ð‘Ð¾Ñ€Ð¸Ñ Ð’Ð»Ð°Ð´Ð¸Ð¼Ð¸Ñ€Ð¾Ð²Ð¸Ñ‡ Шабат",
+ size = "7757732 octets" }
+
+@book{ LiefortA.A.1045,
+ title = "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ†Ð°Ñ€ÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ñударыни императрицы Екатерины II. ЧаÑÑ‚ÑŒ 2",
+ author = "Ð. Ð. Лефорт",
+ size = "9560140 octets" }
+
+@book{ LiefortA.A.1046,
+ title = "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ†Ð°Ñ€ÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ñударыни императрицы Екатерины II. ЧаÑÑ‚ÑŒ 1",
+ author = "Ð. Ð. Лефорт",
+ size = "10823946 octets" }
+
+@book{ LiefortA.A.1047,
+ title = "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ†Ð°Ñ€ÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ñударыни императрицы Екатерины II. ЧаÑÑ‚ÑŒ 5",
+ author = "Ð. Ð. Лефорт",
+ size = "13178736 octets" }
+
+@book{ LiefortA.A.1048,
+ title = "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ†Ð°Ñ€ÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ñударыни императрицы Екатерины II. ЧаÑÑ‚ÑŒ 3",
+ author = "Ð. Ð. Лефорт",
+ size = "9163439 octets" }
+
+@book{ LiefortA.A.1049,
+ title = "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ†Ð°Ñ€ÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ñударыни императрицы Екатерины II. ЧаÑÑ‚ÑŒ 4",
+ author = "Ð. Ð. Лефорт",
+ size = "9347231 octets" }
+
+@book{ KroitsM.1050,
+ title = "Кварки, глюоны и решетки",
+ author = "М. Кройц",
+ size = "1880367 octets" }
+
+@book{ RotheHeinzJ1051,
+ title = "Lattice Gauge Theories: An Introduction",
+ author = "Heinz J Rothe",
+ size = "25965286 octets" }
+
+@book{ LiviiTitMartsiellinAmmianTatsitKornieliiTrankvillGaiSvietoniiKrispGaiSalliustii1052,
+ title = "ИÑторики Рима",
+ author = "Тит Ливий and Ðммиан Марцеллин and Корнелий Тацит and Гай Светоний Транквилл and Гай СаллюÑтий КриÑп",
+ size = "2361190 octets" }
+
+@book{ NeedhamTristan1054,
+ title = "Visual Complex Analysis",
+ author = "Tristan Needham",
+ size = "46900069 octets" }
+
+@book{ PerrymanMark1056,
+ title = "Why the Olympics aren't good for us, and how they can be",
+ author = "Mark Perryman",
+ size = "474610 octets" }
+
+@book{ PatashinskiiAlieksandrZakharovichPokrovskiiValieriiLieonidovich1057,
+ title = "Ð¤Ð»ÑƒÐºÑ‚ÑƒÐ°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ñ‚ÐµÐ¾Ñ€Ð¸Ñ Ñ„Ð°Ð·Ð¾Ð²Ñ‹Ñ… переходов",
+ author = "ÐлекÑандр Захарович ПаташинÑкий and Валерий Леонидович ПокровÑкий",
+ size = "4477789 octets" }
+
+@book{ SpiegelMurrayR.1058,
+ title = "Schaum's Outline of Theory and Problems of Complex Variables: With an Introduction to Conformal Mapping and Its Applications",
+ author = "Murray R. Spiegel",
+ size = "2090743 octets" }
+
+@book{ ThomRene1059,
+ title = "Structural Stability and Morphogenesis: An Outline of a General Theory of Models 1St English Ed",
+ author = "René Thom",
+ size = "20475279 octets" }
+
+@book{ MarksKarl1060,
+ title = "18-е брюмера Луи Бонапарта: матеріалы къ изученію иÑторіи Франціи",
+ author = "Карл МаркÑ",
+ size = "6196289 octets" }
+
+@book{ KrikmannA.1061,
+ title = "Интернет-анекдоты о Сталине",
+ author = "A. Krikmann",
+ size = "2604628 octets" }
+
+@book{ DykeMiltonvan1062,
+ title = "Perturbation Methods in Fluid Mechanics",
+ author = "Milton van Dyke",
+ size = "20959462 octets" }
+
+@book{ BenefielRebeccaKeeganPeter1063,
+ title = "Inscriptions in the Private Sphere in the Greco-Roman World",
+ author = "Rebecca Benefiel and Peter Keegan",
+ size = "9794958 octets" }
+
+@misc{ WellmanHeath1064,
+ title = "Sex and Lots of Erotic Art to Prove It: The Erotic art of Pompeii",
+ author = "Heath Wellman",
+ size = "729197 octets" }
+
+@misc{ LiviiTit1065,
+ title = "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð Ð¸Ð¼Ð° от оÑÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ€Ð¾Ð´Ð°",
+ author = "Тит Ливий",
+ size = "10151230 octets" }
+
+@book{ VieskoFlor1066,
+ title = "Мирелла",
+ author = "Флор ВеÑко",
+ size = "2178039 octets" }
+
+@book{ RoedigerDavid1070,
+ title = "The Sinking Middle Class: A Political History",
+ author = "David Roediger",
+ size = "1733028 octets" }
+
+@book{ EisenbergRobert1071,
+ title = "The Center Did Not Hold: A Biden/Obama Balance Sheet",
+ author = "Robert Eisenberg",
+ size = "6320894 octets" }
+
+@misc{ MikhailikElena1075,
+ title = "The Gulag Archipelago: Rhetoric of History",
+ author = "Elena Mikhailik",
+ size = "435784 octets" }
+
+@misc{ CrossM.C.HohenbergP.C.1076,
+ title = "Pattern formation outsidide of equilibrium",
+ author = "M. C. Cross and P. C. Hohenberg",
+ size = "61364028 octets" }
+
+@book{ HappelJohnBrennerHoward1077,
+ title = "Low Reynolds Number Hydrodynamics: With Special Applications to Particulate Media",
+ author = "John Happel and Howard Brenner",
+ size = "44361312 octets" }
+
+@book{ LadyzhienskaiaOlghaAlieksandrovna1078,
+ title = "МатематичеÑкие вопроÑÑ‹ динамики вÑзкой неÑжимаемой жидкоÑти",
+ author = "Ольга ÐлекÑандровна ЛадыженÑкаÑ",
+ size = "8257830 octets" }
+
+@book{ HofstadterDouglasR.1079,
+ title = "Godel, Escher, Bach: An Eternal Golden Braid",
+ author = "Douglas R. Hofstadter",
+ size = "22878507 octets" }
+
+@book{ HendersonJohn1080,
+ title = "Florence Under Siege",
+ author = "John Henderson",
+ size = "143150395 octets" }
+
+@misc{ BringhurstRobert1083,
+ title = "The Elements of Typographic Style v3.0",
+ author = "Robert Bringhurst",
+ size = "23702778 octets" }
+
+@book{ StaufferDietrichAharonyAmmon1084,
+ title = "Introduction to Percolation Theory: Second Edition",
+ author = "Dietrich Stauffer and Ammon Aharony",
+ size = "2956256 octets" }
+
+@book{ LurieSolomonIakovlievich1086,
+ title = "ÐнтиÑемитизм в древнем мире",
+ author = "Соломон Яковлевич Лурье",
+ size = "221864 octets" }
+
+@book{ TolstoiAlieksieiKonstantinovich1087,
+ title = "Том 1. СтихотворениÑ",
+ author = "ÐлекÑей КонÑтантинович ТолÑтой",
+ size = "1395100 octets" }
+
+@book{ TolstoiAlieksieiKonstantinovich1088,
+ title = "Том 3. ХудожеÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð·Ð°. Статьи",
+ author = "ÐлекÑей КонÑтантинович ТолÑтой",
+ size = "2336724 octets" }
+
+@book{ TolstoiAlieksieiKonstantinovich1089,
+ title = "Том 2. ДраматичеÑкие произведениÑ",
+ author = "ÐлекÑей КонÑтантинович ТолÑтой",
+ size = "1653631 octets" }
+
+@misc{ TolstoiAlieksieiKonstantinovich1090,
+ title = "Том 4. Дневник. ПиÑьма",
+ author = "ÐлекÑей КонÑтантинович ТолÑтой",
+ size = "10209206 octets" }
+
+@book{ KottwitzStefan1091,
+ title = "LaTeX Beginner's Guide: Create Visually Appealing Texts, Articles, and Books for Business and Science Using LaTeX",
+ author = "Stefan Kottwitz",
+ size = "5394780 octets" }
+
+@book{ LorcaFedericoGarcia1092,
+ title = "Sketches of Spain",
+ author = "Federico García Lorca",
+ size = "24000767 octets" }
+
+@book{ KienzhieievBakhytShkurullaievich1094,
+ title = "Сообщение",
+ author = "Бахыт Шкуруллаевич Кенжеев",
+ size = "793223 octets" }
+
+@book{ KienzhieievBakhytShkurullaievich1095,
+ title = "Ðевидимые",
+ author = "Бахыт Шкуруллаевич Кенжеев",
+ size = "1014919 octets" }
+
+@book{ KienzhieievBakhytShkurullaievich1096,
+ title = "ПоÑланиÑ",
+ author = "Бахыт Шкуруллаевич Кенжеев",
+ size = "963836 octets" }
+
+@book{ KienzhieievBakhytShkurullaievich1097,
+ title = "КрепоÑтной оÑтывающих меÑÑ‚",
+ author = "Бахыт Шкуруллаевич Кенжеев",
+ size = "835289 octets" }
+
+@book{ DorfmanAriel1098,
+ title = "The Compensation Bureau",
+ author = "Ariel Dorfman",
+ size = "688193 octets" }
+
+@book{ DorfmanAriel1100,
+ title = "Homeland Security Ate My Speech: Messages from the End of the World",
+ author = "Ariel Dorfman",
+ size = "2247479 octets" }
+
+@book{ DorfmanArielMattelartArmand1101,
+ title = "How to Read Donald Duck",
+ author = "Ariel Dorfman and Armand Mattelart",
+ size = "4384577 octets" }
+
+@book{ DorfmanAriel1103,
+ title = "Cautivos: A Novel",
+ author = "Ariel Dorfman",
+ size = "1600630 octets" }
+
+@book{ RyzhiiBorisBorisovich1106,
+ title = "В кварталах дальних и печальных",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð‘Ð¾Ñ€Ð¸Ñович Рыжий",
+ size = "471222 octets" }
+
+
+@book{ KurochkinVasiliiStiepanovichBieranzhiePier-Zhan1108,
+ title = "ПоÑÑ‚Ñ‹ «ИÑкры». Том 1",
+ author = "ВаÑилий Степанович Курочкин and Пьер-Жан Беранже",
+ size = "1496603 octets" }
+
+@book{ VieinbierghPietrIsaievichMinaievDmitriiDmitriievichKurochkinNikolaiStiepanovichBoghdanovVasiliiIvanovichZhulievGavriilNikolaievichBurieninViktorPietrovichLomanNikolaiLoghinovichSnitkinAlieksieiPavlovich1109,
+ title = "ПоÑÑ‚Ñ‹ «ИÑкры». Том 2",
+ author = "Петр ИÑаевич Вейнберг and Дмитрий Дмитриевич Минаев and Ðиколай Степанович Курочкин and ВаÑилий Иванович Богданов and Гавриил Ðиколаевич Жулев and Виктор Петрович Буренин and Ðиколай Логинович Ломан and ÐлекÑей Павлович Сниткин",
+ size = "3411378 octets" }
+
+@book{ SuvorovViktor1110,
+ title = "Облом",
+ author = "Виктор Суворов",
+ size = "5340624 octets" }
+
+@book{ SuvorovViktor1111,
+ title = "Против вÑех",
+ author = "Виктор Суворов",
+ size = "6295525 octets" }
+
+@book{ SuvorovViktor1112,
+ title = "Кузькина мать",
+ author = "Виктор Суворов",
+ size = "6773531 octets" }
+
+@misc{ MasaAlejandroPolanco1113,
+ title = "The Art of Hand-Drawn Maps 1890",
+ author = "Alejandro Polanco Masa",
+ size = "91181762 octets" }
+
+@book{ BomarshiePier1114,
+ title = "ДраматичеÑкие произведениÑ. Мемуары",
+ author = "Пьер Бомарше",
+ size = "3160996 octets" }
+
+@book{ RochaClaudioMarcoTonyde1115,
+ title = "Tupigrafia Anthology",
+ author = "Claudio Rocha and Tony de Marco",
+ size = "98211451 octets" }
+
+@book{ KatullGaiValierii1116,
+ title = "СочинениÑ",
+ author = "Гай Валерий Катулл",
+ size = "5125160 octets" }
+
+@misc{ KatullGaiValierii1117,
+ title = "Книга Ñтихотворений",
+ author = "Гай Валерий Катулл",
+ size = "713459 octets" }
+
+@book{ IeriemienkoAlieksandrViktorovich1118,
+ title = "Ð“Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñтрана: СтихотворениÑ",
+ author = "ÐлекÑандр Викторович Еременко",
+ size = "257675 octets" }
+
+@misc{ nobody1031119,
+ title = "Mother of Learning",
+ author = "Domagoj Kurmaic",
+ size = "1869598 octets" }
+
+@book{ BrozekJennifer1120,
+ title = "99 Tiny Terrors",
+ author = "Jennifer Brozek",
+ size = "3811326 octets" }
+
+@misc{ MandielshtamOsip1122,
+ title = "Полное Ñобрание Ñочинений и пиÑем. Том 1. СтихотворениÑ",
+ author = "ОÑип Мандельштам",
+ size = "2124371 octets" }
+
+@misc{ MandielshtamOsip1123,
+ title = "Полное Ñобрание Ñочинений и пиÑем. Том 2. Проза",
+ author = "ОÑип Мандельштам",
+ size = "9714436 octets" }
+
+@misc{ MandielshtamOsip1124,
+ title = "Полное Ñобрание Ñочинений и пиÑем. Том 3. Проза. ПиÑьма",
+ author = "ОÑип Мандельштам",
+ size = "7846352 octets" }
+
+@misc{ ViionFransua1126,
+ title = "Полное Ñобрание поÑтичеÑких Ñочинений",
+ author = "ФранÑуа Вийон",
+ size = "512023 octets" }
+
+
+@book{ LieibovRoman1129,
+ title = "P. S.",
+ author = "Роман Лейбов",
+ size = "976111 octets" }
+
+@misc{ LotmanIurii1130,
+ title = "ХудожеÑтвенный текÑÑ‚ и изучение неродного Ñзыка",
+ author = "Юрий Лотман",
+ size = "437880 octets" }
+
+@misc{ KnuthDonaldE.1138,
+ title = "Computers \& Typesetting / C: The METAFONT book",
+ author = "Donald E. Knuth",
+ size = "6379267 octets" }
+
+@misc{ KnuthDonaldE.1139,
+ title = "Computers \& Typesetting / A: The TeXbook",
+ author = "Donald E. Knuth",
+ size = "8017619 octets" }
+
+@misc{ KnuthDonaldE.1140,
+ title = "Computers \& Typesetting / B: TeX: The Program",
+ author = "Donald E. Knuth",
+ size = "20920132 octets" }
+
+@misc{ KnuthDonaldE.1141,
+ title = "Computers \& Typesetting / E Computer Modern Typefaces",
+ author = "Donald E. Knuth",
+ size = "22103835 octets" }
+
+@misc{ KnuthDonaldE.1142,
+ title = "Computers \& Typesetting / D METAFONT: The Program",
+ author = "Donald E. Knuth",
+ size = "18387870 octets" }
+
+@book{ ZizekSlavoj1143,
+ title = "Heaven in Disorder",
+ author = "Slavoj Žižek",
+ size = "1642138 octets" }
+
+@misc{ HaiderBakhtawerBrunfaltBetty1145,
+ title = "Not a Reference Yet",
+ author = "Bakhtawer Haider and Betty Brunfalt",
+ size = "1169683 octets" }
+
+@misc{ SkanaviM.I.1147,
+ title = "Сборник задач по математике Ð´Ð»Ñ Ð¿Ð¾Ñтупающих во ВТУЗы",
+ author = "М. И. Сканави",
+ size = "33049997 octets" }
+
+@misc{ RyndinViachieslavDmitriievich1148,
+ title = "Я обрёл бога в Ðфрике: пиÑьма руÑÑкого буш-хирурга",
+ author = "Ð’ÑчеÑлав Дмитриевич Рындин",
+ size = "9063071 octets" }
+
+@book{ ColbyScottGladstoneMax1150,
+ title = "Pileaus: Symphony No. 1",
+ author = "Scott Colby and Max Gladstone",
+ size = "4396629 octets" }
+
+@book{ MartinJ.M.MeadorsMelanieR.WeisMargaret1152,
+ title = "Hath No Fury",
+ author = "J.M. Martin and Melanie R. Meadors and Margaret Weis",
+ size = "43249334 octets" }
+
+@book{ AbbottAlanaJoliMurphyCereceRennie1157,
+ title = "Where the Veil Is Thin",
+ author = "Alana Joli Abbott and Cerece Rennie Murphy",
+ size = "3311689 octets" }
+
+@book{ AbbottAlanaJoli1159,
+ title = "Apex",
+ author = "Alana Joli Abbott",
+ size = "7408847 octets" }
+
+@misc{ GatesJaym1165,
+ title = "Animus Mundi",
+ author = "Jaym Gates",
+ size = "5206375 octets" }
+
+@book{ AbbottAlanaJoli1166,
+ title = "Neverland’s Library",
+ author = "Alana Joli Abbott",
+ size = "4303927 octets" }
+
+@misc{ MarquitzTim1167,
+ title = "MECH",
+ author = "Tim Marquitz",
+ size = "16555130 octets" }
+
+@misc{ MeadorsMelanie1169,
+ title = "Brigands",
+ author = "Melanie Meadors",
+ size = "12925390 octets" }
+
+@misc{ MeadorsMelanie1172,
+ title = "Scoundrels",
+ author = "Melanie Meadors",
+ size = "18474120 octets" }
+
+@misc{ AbbottAlanaJoliMeadorsMelanieR.1174,
+ title = "Knaves",
+ author = "Alana Joli Abbott and Melanie R. Meadors",
+ size = "10848909 octets" }
+
+@misc{ GatesJaym1175,
+ title = "Genius Loci",
+ author = "Jaym Gates",
+ size = "4349031 octets" }
+
+@book{ OgdenDaniel1176,
+ title = "The Werewolf in the Ancient World",
+ author = "Daniel Ogden",
+ size = "5290806 octets" }
+
+@book{ OgdenDaniel1177,
+ title = "A Companion to Greek Religion",
+ author = "Daniel Ogden",
+ size = "5096863 octets" }
+
+@book{ OgdenDaniel1178,
+ title = "The Strix-Witch",
+ author = "Daniel Ogden",
+ size = "1415450 octets" }
+
+@book{ OgdenDaniel1179,
+ title = "The Legend of Seleucus: Kingship, Narrative and Mythmaking in the Ancient World",
+ author = "Daniel Ogden",
+ size = "6592665 octets" }
+
+@book{ OgdenDaniel1180,
+ title = "Greek and Roman Necromancy",
+ author = "Daniel Ogden",
+ size = "19205899 octets" }
+
+@book{ OgdenDaniel1181,
+ title = "Magic, Witchcraft, and Ghosts in the Greek and Roman Worlds: A Sourcebook",
+ author = "Daniel Ogden",
+ size = "3909029 octets" }
+
+@misc{ Anonymous1182,
+ title = "To explore micro-world with Smartphone",
+ author = "Anonymous",
+ size = "59670990 octets" }
+
+@book{ AesopTownsendGeorgeFyler1183,
+ title = "Aesop's Fables",
+ author = "Aesop and George Fyler Townsend",
+ size = "381732 octets" }
+
+
+@misc{ MezardMarcMontanariAndrea1186,
+ title = "Information, Physics, and Computation (Oxford Graduate Texts)",
+ author = "Marc Mezard and Andrea Montanari",
+ size = "3512591 octets" }
+
+@book{ PlatenEckhardBruti-LiberatiNicola1187,
+ title = "Numerical Solution of Stochastic Differential Equations With Jumps in Finance",
+ author = "Eckhard Platen and Nicola Bruti-Liberati",
+ size = "18871724 octets" }
+
+@book{ OrdingPhilip1188,
+ title = "99 Variations on a Proof",
+ author = "Philip Ording",
+ size = "42195482 octets" }
+
+@book{ FredricksonGlenn1189,
+ title = "The Equilibrium Theory of Inhomogeneous Polymers",
+ author = "Glenn Fredrickson",
+ size = "5535830 octets" }
+
+
+@misc{ Gutenberg1192,
+ title = "Biblia latina, vol 2",
+ author = "Gutenberg",
+ size = "450427225 octets" }
+
+@misc{ Gutenberg1193,
+ title = "Biblia latina, vol 1",
+ author = "Gutenberg",
+ size = "458471383 octets" }
+
+@book{ OchsnerMarcoOchsnerAndreas1194,
+ title = "Advanced LaTeX in Academia: Applications in Research and Education",
+ author = "Marco Öchsner and Andreas Öchsner",
+ size = "5558349 octets" }
+
+@book{ ZizekSlavoj1197,
+ title = "Pandemic! 2: Chronicles of a Time Lost",
+ author = "Slavoj Žižek",
+ size = "1049555 octets" }
+
+@book{ HorizonsStrange1200,
+ title = "Strange Horizons: JANUARY 2021",
+ author = "Strange Horizons",
+ size = "8844991 octets" }
+
+@book{ HorizonsStrange1201,
+ title = "Strange Horizons: MARCH 2021",
+ author = "Strange Horizons",
+ size = "7188167 octets" }
+
+@book{ HorizonsStrange1202,
+ title = "Strange Horizons: December 2021",
+ author = "Strange Horizons",
+ size = "8381318 octets" }
+
+@book{ HorizonsStrange1203,
+ title = "Strange Horizons: FEBRUARY 2021",
+ author = "Strange Horizons",
+ size = "4847597 octets" }
+
+@book{ HorizonsStrange1204,
+ title = "Strange Horizons: MAY 2021",
+ author = "Strange Horizons",
+ size = "12428876 octets" }
+
+@book{ HorizonsStrange1205,
+ title = "Strange Horizons: APRIL 2021",
+ author = "Strange Horizons",
+ size = "6458902 octets" }
+
+
+@misc{ MarksKarl1207,
+ title = "18 брюмера Луи Бонапарта",
+ author = "Карл МаркÑ",
+ size = "128842 octets" }
+
+@book{ BarabasiAlbert-LaszloStanleyHarryEugene1208,
+ title = "Fractal Concepts in Surface Growth",
+ author = "Albert-Laszlo Barabasi and Harry Eugene Stanley",
+ size = "14788089 octets" }
+
+@book{ SchindehetteJon1209,
+ title = "Grimmer Tales Volume One",
+ author = "Jon Schindehette",
+ size = "3426119 octets" }
+
+@misc{ MarxKarl1211,
+ title = "The Eastern question, a reprint of letters written 1853-1856 dealing with the events of the Crimean War",
+ author = "Karl Marx",
+ size = "15823045 octets" }
+
+@misc{ LieibovRoman1212,
+ title = "Заумный ТолÑтой",
+ author = "Роман Лейбов",
+ size = "426512 octets" }
+
+@book{ HorizonsStrange1214,
+ title = "Strange Horizons: October 2021 Fund Drive Special Issue",
+ author = "Strange Horizons",
+ size = "5417788 octets" }
+
+@misc{ PastiernakBorisLieonidovich1215,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 1. Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ Ð¸ поÑмы 1912 1931",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "7363322 octets" }
+
+@misc{ PastiernakBorisLieonidovich1216,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 11. Ð‘Ð¾Ñ€Ð¸Ñ ÐŸÐ°Ñтернак в воÑÐ¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ñовременников",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "16380328 octets" }
+
+@misc{ PastiernakBorisLieonidovich1217,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 10. ПиÑьма 1954 1960",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "16568756 octets" }
+
+@misc{ PastiernakBorisLieonidovich1218,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 9. ПиÑьма 1935 1953",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "18289786 octets" }
+
+@misc{ PastiernakBorisLieonidovich1219,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 8. ПиÑьма 1927 1934",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "18658186 octets" }
+
+@misc{ PastiernakBorisLieonidovich1220,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 7. ПиÑьма",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "18769646 octets" }
+
+@misc{ PastiernakBorisLieonidovich1221,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 6. Стихотворные переводы",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "10229796 octets" }
+
+@misc{ PastiernakBorisLieonidovich1222,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 5. Статьи рецензии предиÑловиÑ. ДраматичеÑкие произведениÑ. литературные и биографичеÑк",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "10726572 octets" }
+
+@misc{ PastiernakBorisLieonidovich1223,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 4. Доктор Живаго",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "9976718 octets" }
+
+@misc{ PastiernakBorisLieonidovich1224,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 2. СпекторÑкий. Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ 1930 1959",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "5746526 octets" }
+
+@misc{ PastiernakBorisLieonidovich1225,
+ title = "Полное Ñобрание Ñочинений в 11 томах. Том 3. ПовеÑти Ñтатьи ÑÑÑе",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð›ÐµÐ¾Ð½Ð¸Ð´Ð¾Ð²Ð¸Ñ‡ ПаÑтернак",
+ size = "8181246 octets" }
+
+@misc{ Anonymous1226,
+ title = "De Arcanis Tenebris",
+ author = "Anonymous",
+ size = "161508179 octets" }
+
+@book{ VinnichukIuriiPavlovichMalighonAnnaKarpovMikhayilSavkaMarianaLazutkinDmitroLikierienkoKieliaVinnikTietianaBlazhievskaOksamitkaDiadchienkoLiudmilaMoldovanIelviraMudrakLiesiaPozniakNatalia1227,
+ title = "Ðіч еротичної поезії",
+ author = "Юрій Павлович Винничук and Ðнна Малігон and Михаїл Карпов and Мар'Ñна Савка and Дмитро Лазуткін and ÐšÐµÐ»Ñ Ð›Ð¸ÐºÐµÑ€ÐµÐ½ÐºÐ¾ and ТетÑна Винник and ОкÑамитка БлажевÑька and Людмила ДÑдченко and Ельвира Молдован and ЛеÑÑ ÐœÑƒÐ´Ñ€Ð°Ðº and ÐÐ°Ñ‚Ð°Ð»Ñ ÐŸÐ¾Ð·Ð½Ñк",
+ size = "2589734 octets" }
+
+@misc{ KabacoffRobertI.1228,
+ title = "R in Action, Third Edition",
+ author = "Robert I. Kabacoff",
+ size = "28008229 octets" }
+
+@book{ LiemStanislav1263,
+ title = "Сумма технологии",
+ author = "СтаниÑлав Лем",
+ size = "2617946 octets" }
+
+@book{ LiemStanislav1264,
+ title = "Библиотека XXI века",
+ author = "СтаниÑлав Лем",
+ size = "2607858 octets" }
+
+@book{ LiemStanislav1265,
+ title = "РаÑÑледование. РукопиÑÑŒ, Ð½Ð°Ð¹Ð´ÐµÐ½Ð½Ð°Ñ Ð² ванне. ÐаÑморк",
+ author = "СтаниÑлав Лем",
+ size = "1943548 octets" }
+
+@book{ LiemStanislav1266,
+ title = "СолÑриÑ. Эдем. Ðепобедимый",
+ author = "СтаниÑлав Лем",
+ size = "2141921 octets" }
+
+@book{ LiemStanislav1267,
+ title = "ÐŸÑ€Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð˜Ð¹Ð¾Ð½Ð° Тихого",
+ author = "СтаниÑлав Лем",
+ size = "2152230 octets" }
+
+@book{ LiemStanislav1268,
+ title = "Сказки роботов. Кибериада",
+ author = "СтаниÑлав Лем",
+ size = "2025733 octets" }
+
+@book{ LiemStanislav1269,
+ title = "Мой взглÑд на литературу",
+ author = "СтаниÑлав Лем",
+ size = "3309832 octets" }
+
+@book{ LiemStanislav1270,
+ title = "ФантаÑтика и футурологиÑ. Книга 2",
+ author = "СтаниÑлав Лем",
+ size = "2689155 octets" }
+
+@book{ LiemStanislav1271,
+ title = "ФантаÑтика и футурологиÑ. Книга 1",
+ author = "СтаниÑлав Лем",
+ size = "2050524 octets" }
+
+@book{ LiemStanislav1272,
+ title = "ФилоÑÐ¾Ñ„Ð¸Ñ ÑлучаÑ",
+ author = "СтаниÑлав Лем",
+ size = "3098642 octets" }
+
+@book{ LiemStanislav1273,
+ title = "Молох (Ñборник)",
+ author = "СтаниÑлав Лем",
+ size = "2977735 octets" }
+
+@book{ LiemStanislav1274,
+ title = "Так говорил... Лем",
+ author = "СтаниÑлав Лем",
+ size = "2736489 octets" }
+
+@book{ LiemStanislav1275,
+ title = "Больница преображениÑ. Ð’Ñ‹Ñокий замок. РаÑÑказы",
+ author = "СтаниÑлав Лем",
+ size = "2496067 octets" }
+
+@book{ LiemStanislav1276,
+ title = "ФутурологичеÑкий конгреÑÑ. ОÑмотр на меÑте. Мир на земле",
+ author = "СтаниÑлав Лем",
+ size = "2376552 octets" }
+
+@book{ LiemStanislav1277,
+ title = "Магелланово Облако. Человек Ñ ÐœÐ°Ñ€Ñа. ÐÑтронавты",
+ author = "СтаниÑлав Лем",
+ size = "2916033 octets" }
+
+@book{ LiemStanislav1278,
+ title = "РаÑÑказы о пилоте ПиркÑе. ФиаÑко",
+ author = "СтаниÑлав Лем",
+ size = "2788678 octets" }
+
+@book{ LiemStanislav1279,
+ title = "Возвращение Ñо звезд. Ð“Ð»Ð°Ñ Ð“Ð¾Ñпода. ПовеÑти",
+ author = "СтаниÑлав Лем",
+ size = "2072669 octets" }
+
+@misc{ AbbottAlanaJoliRiosJulia1280,
+ title = "Scenes from Elsewhere: a companion to Bridge to Elsewhere",
+ author = "Alana Joli Abbott and Julia Rios",
+ size = "1555278 octets" }
+
+@book{ SuslovMikhailBodinPer-Arne1281,
+ title = "The Post-Soviet Politics of Utopia: Language, Fiction and Fantasy in Modern Russia",
+ author = "Mikhail Suslov and Per-Arne Bodin",
+ size = "4258188 octets" }
+
+@misc{ MarchettiM.C.JoannyJ.F.RamaswamyS.LiverpoolT.B.ProstJ.RaoMadanSimhaR.Aditi1282,
+ title = "Hydrodynamics of soft active matter",
+ author = "M. C. Marchetti and J. F. Joanny and S. Ramaswamy and T. B. Liverpool and J. Prost and Madan Rao and R. Aditi Simha",
+ size = "4545267 octets" }
+
+@book{ ZinggAutomnePloegJoshua1283,
+ title = "Enter Sandwich",
+ author = "Automne Zingg and Joshua Ploeg",
+ size = "9917511 octets" }
+
+@book{ ZinggAutomnePloegJoshua1284,
+ title = "Comfort Eating With Nick Cave: Vegan Recipes to Get Deep Inside of You",
+ author = "Automne Zingg and Joshua Ploeg",
+ size = "5274862 octets" }
+
+@book{ ZinggAutomnePloegJoshua1285,
+ title = "Hey Ho Let's Dough",
+ author = "Automne Zingg and Joshua Ploeg",
+ size = "22293759 octets" }
+
+@book{ KampenN.G.van1286,
+ title = "Stochastic Processes in Physics and Chemistry",
+ author = "N. G. van Kampen",
+ size = "5580527 octets" }
+
+@misc{ MakarievskaiaLiubaVolkovIvanPavlovaVieraIermakovaIrinaIanyshievSandzharKabanovAlieksandrM.RussAnnaEltanghLienaKuznietsovaInghaAnatolievna1287,
+ title = "Кровь-любовь. Современные поÑÑ‚Ñ‹ о любви",
+ author = "Люба МакаревÑÐºÐ°Ñ and Иван Волков and Вера Павлова and Ирина Ермакова and Санджар Янышев and ÐлекÑандр Ðœ. Кабанов and Ðнна РуÑÑ and Лена Элтанг and Инга Ðнатольевна Кузнецова",
+ size = "656233 octets" }
+
+@book{ FinegoldRobertB.1288,
+ title = "3rd and Starlight",
+ author = "Robert B. Finegold",
+ size = "22174806 octets" }
+
+@misc{ AdamsDustin1289,
+ title = "2nd and Starlight",
+ author = "Dustin Adams",
+ size = "1857245 octets" }
+
+@book{ McKinnonSky1290,
+ title = "1st and Starlight",
+ author = "Sky McKinnon",
+ size = "1033316 octets" }
+
+
+@book{ ZhadanSierghiiViktorovich1310,
+ title = "ГоÑподь Ñимпатазує аутÑайдерам. 10 книг віршів",
+ author = "Сергій Вікторович Жадан",
+ size = "1608013 octets" }
+
+@book{ BurkeChesya1311,
+ title = "A Secret Guide to Fighting Elder Gods",
+ author = "Chesya Burke and J. C. Koch and Jonathan Maberry and Seanan McGuire and Premee Mohamed and Lisa Morton and Weston Ochse and Stephen Ross and Lucy A. Snyder and Josh Vogt and Tim Waggoner and Wendy N. Wagner and Douglas Wynne",
+ size = "2184562 octets" }
+
+@misc{ BrozekJennifer1312,
+ title = "5 Minute Stories Volumes 1 - 5",
+ author = "Jennifer Brozek",
+ size = "849858 octets" }
+
+@book{ OakRaven1313,
+ title = "Amaskan’s Blood",
+ author = "Raven Oak",
+ size = "3096010 octets" }
+
+@book{ RamboCat1314,
+ title = "Altered America: Steampunk Stories",
+ author = "Cat Rambo",
+ size = "2582473 octets" }
+
+@misc{ FradesLuisGonzalezMasaAlejandroPolanco1321,
+ title = "Physics 1885",
+ author = "Luis González Frades and Alejandro Polanco Masa",
+ size = "210841770 octets" }
+
+@book{ LambSirHorace1322,
+ title = "Hydrodynamics",
+ author = "Sir Horace Lamb",
+ size = "24133300 octets" }
+
+@misc{ BrunetEric1323,
+ title = "Some aspects of the Fisher-KPP equation and the branching Brownian motion",
+ author = "Éric Brunet",
+ size = "4855744 octets" }
+
+@book{ BlokAlieksandrAlieksandrovich1324,
+ title = "Том 1. Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ 1898-1904",
+ author = "ÐлекÑандр ÐлекÑандрович Блок",
+ size = "947564 octets" }
+
+@book{ BlokAlieksandrAlieksandrovich1325,
+ title = "Том 2. Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ Ð¸ поÑмы 1904-1908",
+ author = "ÐлекÑандр ÐлекÑандрович Блок",
+ size = "619691 octets" }
+
+@book{ BlokAlieksandrAlieksandrovich1326,
+ title = "Том 8. ПиÑьма 1898-1921",
+ author = "ÐлекÑандр ÐлекÑандрович Блок",
+ size = "1681016 octets" }
+
+@book{ BlokAlieksandrAlieksandrovich1327,
+ title = "Том 7. Дневники",
+ author = "ÐлекÑандр ÐлекÑандрович Блок",
+ size = "1410610 octets" }
+
+@book{ BlokAlieksandrAlieksandrovich1328,
+ title = "Том 3. Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ Ð¸ поÑмы 1907–1921",
+ author = "ÐлекÑандр ÐлекÑандрович Блок",
+ size = "885624 octets" }
+
+@book{ BlokAlieksandrAlieksandrovich1329,
+ title = "Том 6. ПоÑледние дни императорÑкой влаÑти. Статьи",
+ author = "ÐлекÑандр ÐлекÑандрович Блок",
+ size = "1662468 octets" }
+
+@book{ BlokAlieksandrAlieksandrovich1330,
+ title = "Том 5. Очерки, Ñтатьи, речи",
+ author = "ÐлекÑандр ÐлекÑандрович Блок",
+ size = "2212447 octets" }
+
+@book{ BlokAlieksandrAlieksandrovich1331,
+ title = "Том 4. ДраматичеÑкие произведениÑ",
+ author = "ÐлекÑандр ÐлекÑандрович Блок",
+ size = "1330768 octets" }
+
+@book{ StavitskaLiesiaOlieksiyivna1332,
+ title = "УкраїнÑька мова без табу: Ñловник нецензурної лекÑики та Ñ—Ñ— відповідників: обÑценізми, евфемізми, ÑекÑуалізми",
+ author = "ЛеÑÑ ÐžÐ»ÐµÐºÑіївна Ставицька",
+ size = "8920040 octets" }
+
+@book{ SnyderTimothy1333,
+ title = "Bloodlands: Europe Between Hitler and Stalin",
+ author = "Timothy Snyder",
+ size = "151196913 octets" }
+
+@book{ AhmadMuhammadAurangzebGillinghamJosh1334,
+ title = "Althingi",
+ author = "Muhammad Aurangzeb Ahmad and Josh Gillingham",
+ size = "7667488 octets" }
+
+@book{ AbbottAlanaSharpsN.X.1335,
+ title = "Kaiju Rising II",
+ author = "Alana Abbott and N.X. Sharps",
+ size = "24319451 octets" }
+
+@book{ MarquitzTim1336,
+ title = "Kaiju Rising",
+ author = "Tim Marquitz",
+ size = "16620117 octets" }
+
+@book{ RiosJuliaAbbottAlanaJoli1337,
+ title = "Bridge to Elsewhere",
+ author = "Julia Rios and Alana Joli Abbott",
+ size = "6684612 octets" }
+
+@book{ SulimaM.1338,
+ title = "Бандурка: українÑькі Ñороміцькі піÑні",
+ author = "М. Сулима",
+ size = "6848926 octets" }
+
+@book{ MarcumDavid1339,
+ title = "The MX Book of New Sherlock Holmes Stories Part III: 1896 to 1929",
+ author = "David Marcum",
+ size = "2970219 octets" }
+
+@book{ MarcumDavid1340,
+ title = "The MX Book of New Sherlock Holmes Stories Part I: 1881 to 1889",
+ author = "David Marcum",
+ size = "3067231 octets" }
+
+@book{ MarcumDavid1341,
+ title = "The MX Book of New Sherlock Holmes Stories Part II: 1890 to 1895",
+ author = "David Marcum",
+ size = "2707766 octets" }
+
+@book{ MarcumDavid1342,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XXXIII: 2022 Annual (1896-1919)",
+ author = "David Marcum",
+ size = "4203678 octets" }
+
+@misc{ MarcumDavid1343,
+ title = "The MX Book of New Sherlock Holmes Stories Part XXXII – 2022 Annual (1888-1895)",
+ author = "David Marcum",
+ size = "4524910 octets" }
+
+@book{ MarcumDavid1344,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XXXI: 2022 Annual (1875-1887)",
+ author = "David Marcum",
+ size = "4668168 octets" }
+
+@book{ MarcumDavid1345,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XXX: More Christmas Adventures (1897-1928)",
+ author = "David Marcum",
+ size = "3828214 octets" }
+
+@book{ MarcumDavid1346,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XII: Some Untold Cases (1894-1902)",
+ author = "David Marcum",
+ size = "2587526 octets" }
+
+@book{ MarcumDavid1347,
+ title = "The MX Book of New Sherlock Holmes Stories - Part VII: Eliminate the Impossible: 1880-1891",
+ author = "David Marcum",
+ size = "2960627 octets" }
+
+@book{ MarcumDavid1348,
+ title = "The MX Book of New Sherlock Holmes Stories Part XXVIII: More Christmas Adventures (1869-1888)",
+ author = "David Marcum",
+ size = "3759475 octets" }
+
+@book{ MarcumDavid1349,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XXVII",
+ author = "David Marcum",
+ size = "3938892 octets" }
+
+@book{ MarcumDavid1350,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XXVI: The 2021 Annual: 1889 to 1897",
+ author = "David Marcum",
+ size = "3627648 octets" }
+
+@book{ MarcumDavid1351,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XXV",
+ author = "David Marcum",
+ size = "3517406 octets" }
+
+@book{ MarcumDavid1352,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XXIX",
+ author = "David Marcum",
+ size = "3728450 octets" }
+
+@book{ MarcumDavid1353,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XXIV",
+ author = "David Marcum",
+ size = "4043465 octets" }
+
+@book{ MarcumDavid1354,
+ title = "The MX Book of New Sherlock Holmes Stories Part XXII – Some More Untold Cases (1877-1887)",
+ author = "David Marcum",
+ size = "3359186 octets" }
+
+@book{ MarcumDavid1355,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XXIII",
+ author = "David Marcum",
+ size = "4009819 octets" }
+
+@book{ MarcumDavid1356,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XXI: 2020 Annual (1898-1923)",
+ author = "David Marcum",
+ size = "3557731 octets" }
+
+@book{ MarcumDavid1357,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XX: 2020 Annual (1891-1897)",
+ author = "David Marcum",
+ size = "3435656 octets" }
+
+@book{ MarcumDavid1358,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XVIII: Whatever Remains . . . Must Be the Truth (1899-1925)",
+ author = "David Marcum",
+ size = "3105109 octets" }
+
+@book{ MarcumDavid1359,
+ title = "The MX Book of New Sherlock Holmes Stories Part XVII: Whatever Remains . . . Must Be the Truth (1891-1898)",
+ author = "David Marcum",
+ size = "3308996 octets" }
+
+@book{ MarcumDavid1360,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XVI: Whatever Remains . . . Must Be the Truth (1881-1890)",
+ author = "David Marcum",
+ size = "3365185 octets" }
+
+@book{ MarcumDavid1361,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XV: 2019 Annual (1898-1917)",
+ author = "David Marcum",
+ size = "3929451 octets" }
+
+@book{ MarcumDavid1362,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XIX: 2020 Annual (1882-1890)",
+ author = "David Marcum",
+ size = "4039989 octets" }
+
+@book{ MarcumDavid1363,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XIV: 2019 Annual (1891-1897)",
+ author = "David Marcum",
+ size = "3614708 octets" }
+
+@book{ MarcumDavid1364,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XIII: 2019 Annual (1881-1890)",
+ author = "David Marcum",
+ size = "3491927 octets" }
+
+@book{ MarcumDavid1365,
+ title = "The MX Book of New Sherlock Holmes Stories - Part X: 2018 Annual (1896-1916)",
+ author = "David Marcum",
+ size = "2234045 octets" }
+
+@book{ MarcumDavid1366,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XI: Some Untold Cases (1880-1901)",
+ author = "David Marcum",
+ size = "2289107 octets" }
+
+@book{ MarcumDavid1367,
+ title = "The MX Book of New Sherlock Holmes Stories - Part VIII: Eliminate the Impossible: 1892-1905",
+ author = "David Marcum",
+ size = "3982683 octets" }
+
+@book{ MarcumDavid1368,
+ title = "The MX Book of New Sherlock Holmes Stories - Part VI: 2017 Annual",
+ author = "David Marcum",
+ size = "3887780 octets" }
+
+@book{ MarcumDavid1369,
+ title = "The MX Book of New Sherlock Holmes Stories Part V: Christmas Adventures",
+ author = "David Marcum",
+ size = "2958102 octets" }
+
+@book{ MarcumDavid1370,
+ title = "The MX Book of New Sherlock Holmes Stories Part IX – 2018 Annual (1879-1895)",
+ author = "David Marcum",
+ size = "2574877 octets" }
+
+@book{ MarcumDavidBelangerDerrickBaranDeannaMowerMarkJanacekCraigGangulyJayantikaByrneBobWilsonMarcia1371,
+ title = "The MX Book of New Sherlock Holmes Stories Part IV: 2016 Annual",
+ author = "David Marcum and Derrick Belanger and Deanna Baran and Mark Mower and Craig Janacek and Jayantika Ganguly and Bob Byrne and Marcia Wilson",
+ size = "2804019 octets" }
+
+@misc{ GolovinskaiaI.1372,
+ title = "ПонÑтые и Ñвидетели. Хроники военного времени",
+ author = "И. ГоловинÑÐºÐ°Ñ (ÑоÑÑ‚)",
+ size = "383008 octets" }
+
+@book{ MarcumDavid1373,
+ title = "The New Adventures of Solar Pons",
+ author = "David Marcum",
+ size = "3381892 octets" }
+
+@misc{ MarcumDavid1374,
+ title = "The Papers of Solar Pons",
+ author = "David Marcum",
+ size = "3832479 octets" }
+
+@misc{ DerlethAugust1377,
+ title = "The NOVELS of SOLAR PONS: LONDON and MR. fAIRLIES FINAL JOURNEY",
+ author = "August Derleth",
+ size = "2175447 octets" }
+
+@misc{ DerlethAugust1378,
+ title = "The Casebook of Solar Pons",
+ author = "August Derleth",
+ size = "2786910 octets" }
+
+@misc{ BelangerDerrick1379,
+ title = "The Novellas of Solar Pons",
+ author = "Derrick Belanger",
+ size = "3212128 octets" }
+
+@misc{ DerlethAugust1380,
+ title = "THE CHRONICLES OF SOLAR PONS",
+ author = "August Derleth",
+ size = "2446099 octets" }
+
+@misc{ DerlethAugust1381,
+ title = "THE APOCRYPHA OF SOLAR PONS",
+ author = "August Derleth",
+ size = "3213511 octets" }
+
+@misc{ DerlethAugust1382,
+ title = "SOLAR PONS : THE MEMOIRS OF SOLAR PONS",
+ author = "August Derleth",
+ size = "2164570 octets" }
+
+@misc{ DerlethAugust1383,
+ title = "SOLAR PONS : THE REMINISCENCES OF SOLAR PONS",
+ author = "August Derleth",
+ size = "1918575 octets" }
+
+@misc{ DerlethAugust1384,
+ title = "SOLAR PONS : THE RETURN OF SOLAR PONS",
+ author = "August Derleth",
+ size = "2138589 octets" }
+
+@misc{ DerlethAugust1385,
+ title = "SOLAR PONS IN RE: SHERLOCK HOLMES",
+ author = "August Derleth",
+ size = "2039167 octets" }
+
+@misc{ BelangerDerrick1387,
+ title = "The Pontine Dossier Millennium Volume One Issue Two",
+ author = "Derrick Belanger",
+ size = "26074016 octets" }
+
+@book{ BelangerDerrick1388,
+ title = "The Pontine Dossier Millennium Edition",
+ author = "Derrick Belanger",
+ size = "5594025 octets" }
+
+@misc{ BelangerDerrick1391,
+ title = "Necronomicon of Solar Pons eBook Edition",
+ author = "Derrick Belanger",
+ size = "3066901 octets" }
+
+@misc{ KoltsovaOksana1402,
+ title = "Тонкий лед",
+ author = "ОкÑана Кольцова",
+ size = "996456 octets" }
+
+@book{ MalikVladimirKirillovich1403,
+ title = "ПоÑол УруÑ-Шайтана",
+ author = "Владимир Кириллович Малик",
+ size = "951242 octets" }
+
+@misc{ ZakharovaTatianaAlieksandrovna1404,
+ title = "ВиконтеÑÑа из другого мира",
+ author = "ТатьÑна ÐлекÑандровна Захарова",
+ size = "853629 octets" }
+
+@book{ KimUn-suKim-RussellSora1405,
+ title = "The Plotters",
+ author = "Un-su Kim and Sora Kim-Russell",
+ size = "1419715 octets" }
+
+@book{ KimUn-su1406,
+ title = "The Cabinet",
+ author = "Un-su Kim",
+ size = "1627655 octets" }
+
+@misc{ MarcumDavid1416,
+ title = "The Meeting of the Minds: The Cases of Sherlock Holmes \& Solar Pons 1",
+ author = "David Marcum",
+ size = "9915375 octets" }
+
+@book{ MarcumDavid1417,
+ title = "The Meeting of the Minds: The Cases of Sherlock Holmes \& Solar Pons 2",
+ author = "David Marcum",
+ size = "15689741 octets" }
+
+@misc{ RamboCat1420,
+ title = "A Seed on the Wind",
+ author = "Cat Rambo",
+ size = "280941 octets" }
+
+@book{ BrozekJennifer1422,
+ title = "Caller Unknown",
+ author = "Jennifer Brozek",
+ size = "188886 octets" }
+
+@book{ OakRaven1423,
+ title = "Class-M Exile",
+ author = "Raven Oak",
+ size = "1905959 octets" }
+
+@misc{ LeblancMaurice1426,
+ title = "Gentleman thief Arsene Lupin",
+ author = "Maurice Leblanc",
+ size = "111789727 octets" }
+
+@misc{ KassambaraAlboukadel1427,
+ title = "Complete Guide to 3D Plots in R",
+ author = "Alboukadel Kassambara",
+ size = "13772432 octets" }
+
+@book{ BurkeKenneth1428,
+ title = "A Rhetoric of Motives",
+ author = "Kenneth Burke",
+ size = "33633426 octets" }
+
+@book{ BurkeKenneth1429,
+ title = "A Grammar of Motives",
+ author = "Kenneth Burke",
+ size = "37912324 octets" }
+
+@misc{ ElizabethTicknoreidtor1430,
+ title = "4th and Starlight",
+ author = "Elizabeth Ticknor",
+ size = "26720910 octets" }
+
+@book{ GelmanVladimir1432,
+ title = "The Politics of Bad Governance in Contemporary Russia",
+ author = "Vladimir Gel'man",
+ size = "2735341 octets" }
+
+@book{ VlasovNikolai1433,
+ title = "БиÑмарк. «Железный канцлер»",
+ author = "Ðиколай ВлаÑов",
+ size = "28452913 octets" }
+
+@misc{ ZhadanSierghiei1434,
+ title = "Ð’Ñе завиÑит только от наÑ",
+ author = "Сергей Жадан",
+ size = "343681 octets" }
+
+@book{ XieYihui1435,
+ title = "Dynamic Documents With R and Knitr",
+ author = "Yihui Xie",
+ size = "7070775 octets" }
+
+@misc{ SouzaPauloNeydeFatemanRichardMosesJoelYappCliff1436,
+ title = "The Maxima Book",
+ author = "Paulo Ney de Souza and Richard Fateman and Joel Moses and Cliff Yapp",
+ size = "1624763 octets" }
+
+@book{ WynneJessica1437,
+ title = "Do Not Erase: Mathematicians and Their Chalkboards",
+ author = "Jessica Wynne",
+ size = "235514494 octets" }
+
+@misc{ GrushievskiiMikhailo1438,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 3",
+ author = "Михайло ГрушевÑький",
+ size = "16576846 octets" }
+
+@misc{ GrushievskiiMikhailo1439,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 2",
+ author = "Михайло ГрушевÑький",
+ size = "20473861 octets" }
+
+@misc{ GrushievskiiMikhailo1440,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 1",
+ author = "Михайло ГрушевÑький",
+ size = "16742130 octets" }
+
+@misc{ GrushievskiiMikhailo1441,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 10",
+ author = "Михайло ГрушевÑький",
+ size = "11177113 octets" }
+
+@misc{ GrushievskiiMikhailo1442,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 9, чаÑтина 2",
+ author = "Михайло ГрушевÑький",
+ size = "25101537 octets" }
+
+@misc{ GrushievskiiMikhailo1443,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 9, чаÑтина 1",
+ author = "Михайло ГрушевÑький",
+ size = "28159161 octets" }
+
+@misc{ GrushievskiiMikhailo1444,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 8",
+ author = "Михайло ГрушевÑький",
+ size = "23354103 octets" }
+
+@misc{ GrushievskiiMikhailo1445,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 7",
+ author = "Михайло ГрушевÑький",
+ size = "13781274 octets" }
+
+@misc{ GrushievskiiMikhailo1446,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 6",
+ author = "Михайло ГрушевÑький",
+ size = "15459161 octets" }
+
+@misc{ GrushievskiiMikhailo1447,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 5",
+ author = "Михайло ГрушевÑький",
+ size = "15141935 octets" }
+
+@misc{ GrushievskiiMikhailo1448,
+ title = "ІСТОРІЯ УКРÐЇÐИ-РУСИ, Том 4",
+ author = "Михайло ГрушевÑький",
+ size = "12451704 octets" }
+
+@misc{ OstashkoSierghieiTsybeskovLeonidNikoraIghorShiyanAnatoliyMkrtichianDavidUdovitsaAlieksandr1449,
+ title = "ИнÑтитут имени Марии СелеÑÑ‚Ñ‹",
+ author = "Сергей ОÑташко and Leonid Tsybeskov and Игорь Ðикора and Anatoliy Shiyan and Давид МкртичÑн and ÐлекÑандр Удовица",
+ size = "3881527 octets" }
+
+@misc{ OstashkoSierghiei1450,
+ title = "Город ПГТ",
+ author = "Сергей ОÑташко",
+ size = "686589 octets" }
+
+@misc{ OstashkoSierghieiPielishienkoSvietoslav1451,
+ title = "Хождение за два-три морÑ",
+ author = "Сергей ОÑташко and СветоÑлав Пелишенко",
+ size = "1175006 octets" }
+
+@misc{ OstashkoSierghiei1452,
+ title = "Ð’Ð¿ÐµÑ‡Ð°Ñ‚Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÐµÑ‚Ð¾Ð²Ð°Ð½Ð½Ñ‹Ðµ",
+ author = "Сергей ОÑташко",
+ size = "809219 octets" }
+
+@misc{ PielishienkoSvietoslav1453,
+ title = "КÑюшины Ñказки",
+ author = "СветоÑлав Пелишенко",
+ size = "636458 octets" }
+
+@book{ VolynskaiaIlonaKashchieievKirill1454,
+ title = "Фабрика мертвецов",
+ author = "Илона ВолынÑÐºÐ°Ñ and Кирилл Кащеев",
+ size = "2859068 octets" }
+
+@misc{ VolynskaiaIlonaKashchieievKirill1455,
+ title = "Ðа Ñтороне мертвецов",
+ author = "Илона ВолынÑÐºÐ°Ñ and Кирилл Кащеев",
+ size = "1340052 octets" }
+
+@misc{ HorizonsStrange1456,
+ title = "Strange Horizons 2022 Fund Drive ebook",
+ author = "Strange Horizons",
+ size = "2885882 octets" }
+
+@misc{ VandykeC.1457,
+ title = "New Albion Omnibus: Adventures in Urban Fantasy: 1787 - 2187",
+ author = "C. Vandyke",
+ size = "6183166 octets" }
+
+@misc{ KonstantinovaAnna1458,
+ title = "СпираÑ. Книга 1",
+ author = "Ðнна КонÑтантинова",
+ size = "965535 octets" }
+
+@misc{ IolichAsia1459,
+ title = "Сердце Ñтепи",
+ author = "ÐÑÑ Ð˜Ð¾Ð»Ð¸Ñ‡",
+ size = "1124439 octets" }
+
+@misc{ IolichAsia1460,
+ title = "Сердце Ñтепи. Полёт над Ñтепью",
+ author = "ÐÑÑ Ð˜Ð¾Ð»Ð¸Ñ‡",
+ size = "1612376 octets" }
+
+@book{ CastileZoey1461,
+ title = "The Captive Merman's Promise (Kickstarter)",
+ author = "Zoey Castile",
+ size = "1146509 octets" }
+
+@book{ SloaneNikki1462,
+ title = "The Vixen's Deceit (Kickstarter)",
+ author = "Nikki Sloane",
+ size = "1039588 octets" }
+
+@book{ HerreraAdriana1463,
+ title = "The Hellmouth Guardian's Lover (Kickstarter)",
+ author = "Adriana Herrera",
+ size = "1177747 octets" }
+
+@book{ SimoneSierra1464,
+ title = "The Fae Queen's Captive: A Peculiar Tastes Novel",
+ author = "Sierra Simone",
+ size = "1079423 octets" }
+
+@book{ NordbakJenny1465,
+ title = "The Death God's Sacrifice (Kickstarter)",
+ author = "Jenny Nordbak",
+ size = "1032601 octets" }
+
+@book{ RobertKatee1466,
+ title = "The Demon's Bargain (Kickstarter)",
+ author = "Katee Robert",
+ size = "1028864 octets" }
+
+@book{ MarcumDavid1467,
+ title = "The Collected Papers of Sherlock Holmes - Volume 1: A Florilegium of Sherlockian Adventures in Multiple Volumes",
+ author = "David Marcum",
+ size = "4663333 octets" }
+
+@book{ GolledgeTerryGolledgeNielMarcumDavid1469,
+ title = "The Rediscovered Annals of Sherlock Holmes",
+ author = "Terry Golledge and Niel Golledge and David Marcum",
+ size = "2309727 octets" }
+
+
+
+@misc{ LievichVieniaminGrighorievich1473,
+ title = "Физико-химичеÑÐºÐ°Ñ Ð³Ð¸Ð´Ñ€Ð¾Ð´Ð¸Ð½Ð°Ð¼Ð¸ÐºÐ°",
+ author = "Вениамин Григорьевич Левич",
+ size = "18827865 octets" }
+
+@misc{ BelangerDerrickBelangerBrianChanEd1479,
+ title = "Sherlock Holmes and Dr Watson Medical Mysteries Volume II",
+ author = "Derrick Belanger and Brian Belanger and Ed Chan",
+ size = "2759653 octets" }
+
+@misc{ BelangerDerrickBelangerBrianChanEd1480,
+ title = "Sherlock Holmes and Dr Watson: Medical Mysteries Volume I",
+ author = "Derrick Belanger and Brian Belanger and Ed Chan",
+ size = "2689538 octets" }
+
+@misc{ MarcumDavid1483,
+ title = "Sherlock Holmes and Dr. Watson: The Early Adventures Volume III",
+ author = "David Marcum",
+ size = "9756852 octets" }
+
+@misc{ MarcumDavid1484,
+ title = "Sherlock Holmes and Dr. Watson: The Early Adventures Volume I",
+ author = "David Marcum",
+ size = "2078280 octets" }
+
+@misc{ MarcumDavid1485,
+ title = "Sherlock Holmes and Dr. Watson: The Early Adventures Volume II",
+ author = "David Marcum",
+ size = "9341935 octets" }
+
+@book{ MikhailovMikhail1492,
+ title = "МаÑтер големов",
+ author = "Михаил Михайлов",
+ size = "1125458 octets" }
+
+@misc{ CampbellJ.R.PrepolecCharles1493,
+ title = "Gaslight Ghouls. Uneasy tales of Sherlock Holmes, monsters and madmen",
+ author = "J. R. Campbell and Charles Prepolec",
+ size = "3396278 octets" }
+
+@misc{ DeSantisJoe1494,
+ title = "Sherlock Holmes: The Maplecroft Message",
+ author = "Joe DeSantis",
+ size = "1506944 octets" }
+
+@misc{ GrantJohnLinwood1495,
+ title = "The Book of Carnacki. The Ghost Finder",
+ author = "John Linwood Grant",
+ size = "9286018 octets" }
+
+@book{ DeSantisJoe1496,
+ title = "The Dartmoor Horror",
+ author = "Joe DeSantis",
+ size = "2264623 octets" }
+
+@book{ GrantJohnLinwood1497,
+ title = "Sherlock Holmes and the Occult Detectives, Vol II",
+ author = "John Linwood Grant",
+ size = "6355001 octets" }
+
+@misc{ GrantJohnLinwood1500,
+ title = "Sherlock Holmes and the Occult Detectives, Vol III",
+ author = "John Linwood Grant",
+ size = "4540690 octets" }
+
+@misc{ GrantJohnLinwood1501,
+ title = "Sherlock Holmes and the Occult Detectives, Vol IV",
+ author = "John Linwood Grant",
+ size = "6801979 octets" }
+
+@book{ GrantJohnLinwood1502,
+ title = "Sherlock Holmes and the Occult Detectives Volume I",
+ author = "John Linwood Grant",
+ size = "6363320 octets" }
+
+@book{ StankievichMariia1507,
+ title = "Как жаль, что Ð²Ð°Ñ Ð½Ðµ было Ñ Ð½Ð°Ð¼Ð¸. РаÑÑказы, том 1",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð¡Ñ‚Ð°Ð½ÐºÐµÐ²Ð¸Ñ‡",
+ size = "1783964 octets" }
+
+@book{ StankievichMariia1509,
+ title = "Призрак, призрак, поÑвиÑÑŒ. РаÑÑказы, том 2.",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð¡Ñ‚Ð°Ð½ÐºÐµÐ²Ð¸Ñ‡",
+ size = "1188603 octets" }
+
+@misc{ BraccioliniPoggio1513,
+ title = "The Facetiae Or Jocose Tales of Poggio, Vol II",
+ author = "Poggio Bracciolini",
+ size = "4531482 octets" }
+
+@misc{ BraccioliniPoggio1514,
+ title = "The Facetiae Or Jocose Tales of Poggio, Vol I",
+ author = "Poggio Bracciolini",
+ size = "4669775 octets" }
+
+@misc{ DraghunskiiDienisViktorovich1515,
+ title = "Обманщики",
+ author = "Ð”ÐµÐ½Ð¸Ñ Ð’Ð¸ÐºÑ‚Ð¾Ñ€Ð¾Ð²Ð¸Ñ‡ ДрагунÑкий",
+ size = "1642276 octets" }
+
+@misc{ MarcumDavid1517,
+ title = "The Collected Papers of Sherlock Holmes Volume I",
+ author = "David Marcum",
+ size = "4663333 octets" }
+
+@misc{ RyanRichardT.1518,
+ title = "The Druid of Death: A Sherlock Holmes Adventure",
+ author = "Richard T. Ryan",
+ size = "1718596 octets" }
+
+@misc{ RyanRichardT.1519,
+ title = "Three May Keep A Secret: A Sherlock Holmes Adventure",
+ author = "Richard T. Ryan",
+ size = "3632982 octets" }
+
+@misc{ RyanRichardT.1520,
+ title = "The Vatican Cameos: A Sherlock Holmes Adventure",
+ author = "Richard T. Ryan",
+ size = "1493845 octets" }
+
+@misc{ RyanRichardT.1521,
+ title = "Through A Glass Starkly: A Sherlock Holmes Adventure",
+ author = "Richard T. Ryan",
+ size = "1924039 octets" }
+
+@misc{ PearsonOrlando1522,
+ title = "The Redacted Sherlock Holmes Volume I",
+ author = "Orlando Pearson",
+ size = "418845 octets" }
+
+@misc{ RyanRichardT.1523,
+ title = "The Poisoned Pawn: A Sherlock Holmes Adventure",
+ author = "Richard T. Ryan",
+ size = "1152009 octets" }
+
+@misc{ KnightSusan1525,
+ title = "Mrs. Hudson Investigates",
+ author = "Susan Knight",
+ size = "986287 octets" }
+
+@misc{ RyanRichardT.1526,
+ title = "The Stone of Destiny: A Sherlock Holmes Adventure",
+ author = "Richard T. Ryan",
+ size = "1063909 octets" }
+
+@misc{ WalshMargaret1527,
+ title = "Sherlock Holmes and the Curse of Neb-Heka-Ra",
+ author = "Margaret Walsh",
+ size = "783567 octets" }
+
+@misc{ Unknown1528,
+ title = "The Adventure of Bloody Duck and other tales of Sherlock Holmes",
+ author = "Margaret Walsh",
+ size = "1390291 octets" }
+
+@misc{ WalshMargaret1529,
+ title = "Sherlock Holmes and the Case of the London Dock Deaths",
+ author = "Margaret Walsh",
+ size = "786125 octets" }
+
+@misc{ WalshMargaret1531,
+ title = "Sherlock Holmes and The Case of the Perplexed Politician",
+ author = "Margaret Walsh",
+ size = "872075 octets" }
+
+@book{ DavilaLaurenT.1532,
+ title = "When Other People Saw Us, They Saw The Dead",
+ author = "Lauren T. Davila",
+ size = "2007551 octets" }
+
+@book{ FrohnCeline1533,
+ title = "Unspeakable",
+ author = "Celine Frohn",
+ size = "4326591 octets" }
+
+@book{ PublishingHaunt1534,
+ title = "Haunted Voices",
+ author = "Haunt Publishing",
+ size = "46328483 octets" }
+
+@book{ FrohnCeline1535,
+ title = "Unthinkable",
+ author = "Celine Frohn",
+ size = "4853707 octets" }
+
+@book{ CheungAnna1536,
+ title = "Where Decay Sleeps",
+ author = "Anna Cheung",
+ size = "2921986 octets" }
+
+@misc{ MarcumDavid1537,
+ title = "The MX Book of New Sherlock Holmes Stories, Vol XXXVI",
+ author = "David Marcum",
+ size = "3785898 octets" }
+
+@misc{ MarcumDavid1538,
+ title = "The MX Book of New Sherlock Holmes Stories, Vol XXXIV",
+ author = "David Marcum",
+ size = "3467914 octets" }
+
+@misc{ MarcumDavid1539,
+ title = "The MX Book of New Sherlock Holmes Stories, Vol XXXV",
+ author = "David Marcum",
+ size = "3564551 octets" }
+
+@book{ VinklerPeter1541,
+ title = "The Evaluation of Research by Scientometric Indicators",
+ author = "Péter Vinkler",
+ size = "4267646 octets" }
+
+@misc{ SalieM.A.1542,
+ title = "Книга Ñ‚Ñ‹ÑÑчи и одной ночи. Том 2 (ночи 39-145)",
+ author = "Ðœ. Ð. Салье",
+ size = "13631824 octets" }
+
+@misc{ SalieM.A.1543,
+ title = "Книга Ñ‚Ñ‹ÑÑчи и одной ночи. Том 1 (ночи 1-38)",
+ author = "Ðœ. Ð. Салье",
+ size = "11534070 octets" }
+
+@misc{ SalieM.A.1544,
+ title = "Книга Ñ‚Ñ‹ÑÑчи и одной ночи. Том 3 (ночи 145-270)",
+ author = "Ðœ. Ð. Салье",
+ size = "10980937 octets" }
+
+@misc{ SalieM.A.1545,
+ title = "Книга Ñ‚Ñ‹ÑÑчи и одной ночи. Том 8 (ночи 894-1001)",
+ author = "Ðœ. Ð. Салье",
+ size = "12136015 octets" }
+
+@misc{ SalieM.A.1546,
+ title = "Книга Ñ‚Ñ‹ÑÑчи и одной ночи. Том 6 (ночи 607-756)",
+ author = "Ðœ. Ð. Салье",
+ size = "14364007 octets" }
+
+@misc{ SalieM.A.1547,
+ title = "Книга Ñ‚Ñ‹ÑÑчи и одной ночи. Том 7 (ночи 756-894)",
+ author = "Ðœ. Ð. Салье",
+ size = "12906204 octets" }
+
+@misc{ SalieM.A.1548,
+ title = "Книга Ñ‚Ñ‹ÑÑчи и одной ночи. Том 4 (ночи 270-434)",
+ author = "Ðœ. Ð. Салье",
+ size = "14423831 octets" }
+
+@misc{ SalieM.A.1549,
+ title = "Книга Ñ‚Ñ‹ÑÑчи и одной ночи. Том 5 (ночи 434-606)",
+ author = "Ðœ. Ð. Салье",
+ size = "15795545 octets" }
+
+@misc{ ChanChris1550,
+ title = "Of Course He Pushed Him \& Other Sherlock Holmes Stories. The Complete Collection",
+ author = "Chris Chan",
+ size = "1435816 octets" }
+
+@misc{ ChanChris1551,
+ title = "Murder most grotesque",
+ author = "Chris Chan",
+ size = "2499106 octets" }
+
+@misc{ ChanChris1552,
+ title = "Sherlock \& Irene",
+ author = "Chris Chan",
+ size = "1113536 octets" }
+
+@misc{ ChanChris1553,
+ title = "Sherlocks Secretary",
+ author = "Chris Chan",
+ size = "1065599 octets" }
+
+@book{ MurphyKenneth1554,
+ title = "Janeway's Immunobiology",
+ author = "Kenneth Murphy",
+ size = "99764388 octets" }
+
+@book{ AveelaRonesa1555,
+ title = "A Study of Dragons of Eastern Europe (Spirits \& Creatures Series, \#3)",
+ author = "Ronesa Aveela",
+ size = "6106855 octets" }
+
+@book{ AveelaRonesa1556,
+ title = "A Study of Baba Yaga (Spirits and Creatures Series, \#4)",
+ author = "Ronesa Aveela",
+ size = "8271202 octets" }
+
+@book{ AveelaRonesa1557,
+ title = "A Study of Household Spirits of Eastern Europe (Spirits and Creatures Series, \#1)",
+ author = "Ronesa Aveela",
+ size = "13645819 octets" }
+
+@book{ AveelaRonesa1558,
+ title = "Baba Yaga and the Strawberries",
+ author = "Ronesa Aveela",
+ size = "3595947 octets" }
+
+@book{ AveelaRonesa1559,
+ title = "Dragon Tales from Eastern Europe",
+ author = "Ronesa Aveela",
+ size = "986792 octets" }
+
+@book{ AveelaRonesa1560,
+ title = "A Study of Rusalki - Slavic Mermaids of Eastern Europe (Spirits \& Creatures Series, \#2)",
+ author = "Ronesa Aveela",
+ size = "9458942 octets" }
+
+@misc{ RyanRichardT.1561,
+ title = "Sherlock Holmes: A Year of Mystery 1882",
+ author = "Richard T. Ryan",
+ size = "3814750 octets" }
+
+@misc{ RyanRichardT.1562,
+ title = "Sherlock Holmes: A Year of Mystery 1881",
+ author = "Richard T. Ryan",
+ size = "3832304 octets" }
+
+@misc{ RyanRichardT.1563,
+ title = "Sherlock Holmes: A Year of Mystery 1883",
+ author = "Richard T. Ryan",
+ size = "3925829 octets" }
+
+@misc{ RyanRichardT.1564,
+ title = "Sherlock Holmes: A Year of Mystery 1884",
+ author = "Richard T. Ryan",
+ size = "4285767 octets" }
+
+@book{ LatourBrunoWoolgarSteve1565,
+ title = "Laboratory Life: The Construction of Scientific Facts",
+ author = "Bruno Latour and Steve Woolgar",
+ size = "14885113 octets" }
+
+@misc{ MikhailikIeliena1566,
+ title = "Сумчатые баллады",
+ author = "Елена Михайлик",
+ size = "2678894 octets" }
+
+@misc{ MikhailikIeliena1567,
+ title = "Перловка",
+ author = "Елена Михайлик",
+ size = "304607 octets" }
+
+@misc{ avtorovKolliektiv1568,
+ title = "ПроÑтранÑтво колдовÑтва",
+ author = "Коллектив авторов",
+ size = "912721 octets" }
+
+@book{ HorizonsStrange1587,
+ title = "Strange Horizons: FEBRUARY 2022",
+ author = "Strange Horizons",
+ size = "5581340 octets" }
+
+@book{ HorizonsStrange1588,
+ title = "Strange Horizons: January 2022",
+ author = "Strange Horizons",
+ size = "9808031 octets" }
+
+@misc{ HorizonsStrange1589,
+ title = "Strange Horizons March 2022 ebook",
+ author = "Strange Horizons",
+ size = "5503908 octets" }
+
+@misc{ HorizonsStrange1590,
+ title = "Strange Horizons September 2022 ebook",
+ author = "Strange Horizons",
+ size = "8612059 octets" }
+
+@misc{ HorizonsStrange1591,
+ title = "Strange Horizons June 2022",
+ author = "Strange Horizons",
+ size = "2721392 octets" }
+
+@misc{ HorizonsStrange1592,
+ title = "Strange Horizons May 2022 ebook",
+ author = "Strange Horizons",
+ size = "6257565 octets" }
+
+@misc{ HorizonsStrange1594,
+ title = "Strange Horizons July 2022",
+ author = "Strange Horizons",
+ size = "21147313 octets" }
+
+@misc{ HorizonsStrange1596,
+ title = "Strange Horizons April 2022 ebook Kindle",
+ author = "Strange Horizons",
+ size = "3903752 octets" }
+
+@misc{ HorizonsStrange1597,
+ title = "Strange Horizons August 2022 ebook",
+ author = "Strange Horizons",
+ size = "37470391 octets" }
+
+@misc{ KhiersonskiiBorisGrighorievich1598,
+ title = "Сталіна не було",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð“Ñ€Ð¸Ð³Ð¾Ñ€ÑŒÐµÐ²Ð¸Ñ‡ ХерÑонÑкий",
+ size = "1085410 octets" }
+
+@misc{ PielievinViktorOlieghovich1599,
+ title = "Ð­Ð»ÐµÐ³Ð¸Ñ 2",
+ author = "Виктор Олегович Пелевин",
+ size = "1630326 octets" }
+
+@misc{ PielievinViktorOlieghovich1600,
+ title = "ДПП (ÐÐ) (Ñборник)",
+ author = "Виктор Олегович Пелевин",
+ size = "2521916 octets" }
+
+@misc{ SorokinVladimirGieorghiievich1601,
+ title = "Триумф Времени и БеÑчувÑтвиÑ",
+ author = "Владимир Георгиевич Сорокин",
+ size = "835319 octets" }
+
+@misc{ SorokinVladimirGieorghiievich1602,
+ title = "ТеллуриÑ",
+ author = "Владимир Георгиевич Сорокин",
+ size = "1208354 octets" }
+
+@misc{ SorokinVladimirGieorghiievich1603,
+ title = "РуÑÑкие народные поÑловицы и поговорки",
+ author = "Владимир Георгиевич Сорокин",
+ size = "1044860 octets" }
+
+@misc{ SorokinVladimir1604,
+ title = "Роман",
+ author = "Владимир Сорокин",
+ size = "2554924 octets" }
+
+@misc{ PielievinViktorOlieghovich1605,
+ title = "Синий фонарь",
+ author = "Виктор Олегович Пелевин",
+ size = "1660035 octets" }
+
+@book{ JarvisIan1606,
+ title = "Cat Flap",
+ author = "Ian Jarvis",
+ size = "4384674 octets" }
+
+@misc{ VictorDanielD.1607,
+ title = "The Final Page of Baker Street",
+ author = "Daniel D. Victor",
+ size = "2931821 octets" }
+
+@misc{ BrownBarryS.1609,
+ title = "The Unpleasantness at Parkerton Manor",
+ author = "Barry S. Brown",
+ size = "4037692 octets" }
+
+@misc{ ThomasAmy1610,
+ title = "The Detective and the Woman: A Novel of Sherlock Holmes",
+ author = "Amy Thomas",
+ size = "5051668 octets" }
+
+@misc{ RiveraMiguelR.1611,
+ title = "Sherlock Holmes and The Case of The Green Dragon",
+ author = "Miguel R. Rivera",
+ size = "1750247 octets" }
+
+@misc{ Anonymous1612,
+ title = "Medieval \& Early Modern Manuscripts: Bookbinding Terms, Materials, Methods and Models",
+ author = "Anonymous",
+ size = "10838493 octets" }
+
+@misc{ ArkhipovaAlieksandraFrukhtmannIakob1613,
+ title = "Фетиш и табу: ÐÐ½Ñ‚Ñ€Ð¾Ð¿Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð´ÐµÐ½ÐµÐ³ в РоÑÑии",
+ author = "ÐлекÑандра Ðрхипова and Якоб Фрухтманн",
+ size = "2024480 octets" }
+
+@misc{ HorizonsStrange1616,
+ title = "Strange Horizons October 2022 ebook Kindle",
+ author = "Strange Horizons",
+ size = "4283474 octets" }
+
+@misc{ HorizonsStrange1617,
+ title = "Strange Horizons November 2022 ebook",
+ author = "Strange Horizons",
+ size = "6406817 octets" }
+
+@misc{ NelsonReed1618,
+ title = "50 Animated Years of Lupin The 3rd",
+ author = "Reed Nelson",
+ size = "113361309 octets" }
+
+@misc{ BorkhiesKhorkhieLuis1619,
+ title = "Собрание Ñочинений в 4 томах. Том 2. ÐŸÑ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1942–1969 годов",
+ author = "Хорхе Ð›ÑƒÐ¸Ñ Ð‘Ð¾Ñ€Ñ…ÐµÑ",
+ size = "40295434 octets" }
+
+@misc{ BorkhiesKhorkhieLuis1620,
+ title = "Собрание Ñочинений в 4 томах. Том 1. ÐŸÑ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1921–1941 годов",
+ author = "Хорхе Ð›ÑƒÐ¸Ñ Ð‘Ð¾Ñ€Ñ…ÐµÑ",
+ size = "26434680 octets" }
+
+@misc{ BorkhiesKhorkhieLuis1621,
+ title = "Собрание Ñочинений в 4 томах. Том 3. ÐŸÑ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1970 Ñ… годов",
+ author = "Хорхе Ð›ÑƒÐ¸Ñ Ð‘Ð¾Ñ€Ñ…ÐµÑ",
+ size = "34483730 octets" }
+
+@misc{ BorkhiesKhorkhieLuis1622,
+ title = "Собрание Ñочинений в 4 томах. Том 4. ÐŸÑ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 1980–1986 годов. ПоÑмертные публикации",
+ author = "Хорхе Ð›ÑƒÐ¸Ñ Ð‘Ð¾Ñ€Ñ…ÐµÑ",
+ size = "27454321 octets" }
+
+@book{ TidharLavieLeveneRebecca1629,
+ title = "Jews Vs Aliens",
+ author = "Lavie Tidhar and Rebecca Levene",
+ size = "1964470 octets" }
+
+@book{ LobelAndreaD.ShainblumMark1630,
+ title = "Other Covenants: Alternate Histories of the Jewish People",
+ author = "Andrea D. Lobel and Mark Shainblum",
+ size = "7129239 octets" }
+
+@book{ TidharLavieLeveneRebecca1631,
+ title = "Jews Vs Zombies",
+ author = "Lavie Tidhar and Rebecca Levene",
+ size = "3884354 octets" }
+
+@misc{ MarcumDavid1632,
+ title = "The Further Papers of Solar Pons",
+ author = "David Marcum",
+ size = "7633015 octets" }
+
+@misc{ BelangerDerrick1641,
+ title = "Pontine Dossier 2022",
+ author = "Derrick Belanger",
+ size = "3984348 octets" }
+
+@misc{ BelangerDerrick1642,
+ title = "Writing Holmes",
+ author = "Derrick Belanger",
+ size = "6098767 octets" }
+
+@misc{ BelangerDerrick1643,
+ title = "Steel True, Blade Straight",
+ author = "Derrick Belanger",
+ size = "5789067 octets" }
+
+@misc{ PietrovaNataliaRychkovaNadiezhda1645,
+ title = "Страшный, таинÑтвенный, разный Ðовый год. От Чукотки до Карелии Ñтаринные легенды, магичеÑкие обрÑды, праздничные обычаи народов РоÑÑии",
+ author = "ÐÐ°Ñ‚Ð°Ð»ÑŒÑ ÐŸÐµÑ‚Ñ€Ð¾Ð²Ð° and Ðадежда Рычкова",
+ size = "20472337 octets" }
+
+@book{ PyleMarxMastroJ.C.ScottVictoriaL.LynchAnneC.1646,
+ title = "Tales of Monstrosity: Monsters, Myths, and Miscreants - Monsters Cover",
+ author = "Marx Pyle and J.C. Mastro and Victoria L. Scott and Anne C. Lynch",
+ size = "5158173 octets" }
+
+@misc{ HosekDon1647,
+ title = "The Preppy Lion: A Guide to LaTeX for Authors",
+ author = "Don Hosek",
+ size = "8414639 octets" }
+
+@book{ SpiekermannErik1649,
+ title = "Stop Stealing Sheep \& Find Out How Type Works",
+ author = "Erik Spiekermann",
+ size = "23672244 octets" }
+
+@book{ GalinaMariiaSiemionovna1650,
+ title = "КраÑные волки, краÑные гуÑи (Ñборник)",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð¡ÐµÐ¼Ñ‘Ð½Ð¾Ð²Ð½Ð° Галина",
+ size = "1267154 octets" }
+
+@book{ GalinaMariiaSiemionovna1651,
+ title = "Ð’ÑÑ‘ о Лизе",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð¡ÐµÐ¼Ñ‘Ð½Ð¾Ð²Ð½Ð° Галина",
+ size = "280056 octets" }
+
+@book{ GalinaMariiaSiemionovna1653,
+ title = "Ð’Ñе имена птиц. Хроники неизвеÑтных времен",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð¡ÐµÐ¼Ñ‘Ð½Ð¾Ð²Ð½Ð° Галина",
+ size = "4465800 octets" }
+
+@book{ GalinaMariiaSiemionovna1656,
+ title = "ÐœÐ°Ð»Ð°Ñ Ð“Ð»ÑƒÑˆÐ°",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð¡ÐµÐ¼Ñ‘Ð½Ð¾Ð²Ð½Ð° Галина",
+ size = "1262324 octets" }
+
+@book{ ZhadanSierghieiViktorovich1658,
+ title = "Интернат",
+ author = "Сергей Викторович Жадан",
+ size = "1328517 octets" }
+
+@book{ SnyderTimothy1659,
+ title = "The Road to Unfreedom",
+ author = "Timothy Snyder",
+ size = "7671793 octets" }
+
+@book{ SierzhViktor1660,
+ title = "Когда нет прощениÑ",
+ author = "Виктор Серж",
+ size = "1363706 octets" }
+
+@book{ VronoIeliena1661,
+ title = "Казенный дом и другие детÑкие Ð²Ð¿ÐµÑ‡Ð°Ñ‚Ð»ÐµÐ½Ð¸Ñ (Ñборник)",
+ author = "Елена МоиÑеевна Вроно and Ð“ÐµÐ»Ð¸Ñ ÐŸÐµÐ²Ð·Ð½ÐµÑ€ and Леонид МоиÑеевич Гиршович and Людмила Евгеньевна Ð£Ð»Ð¸Ñ†ÐºÐ°Ñ and ÐœÐ°Ñ€Ð¸Ñ ÐœÐ¸Ñ…Ð°Ð¹Ð»Ð¾Ð²Ð½Ð° Степанова and Ирина И. Ðахова and ÐœÐ°Ñ€Ð¸Ñ Ð¡ÐµÐ¼Ñ‘Ð½Ð¾Ð²Ð½Ð° Галина and ÐÐ°Ñ‚Ð°Ð»Ð¸Ñ Ð®Ð»ÑŒÐµÐ²Ð½Ð° Ким and ÐлекÑей Маркович Моторов and Ольга ÐлекÑеевна ВельчинÑÐºÐ°Ñ and Ðлена Солнцева and Ð–ÐµÐ½Ñ Ð‘Ð¾Ñ€Ð¸Ñовна Снежкина and Ðикита ÐлекÑеев and Ð‘Ð¾Ñ€Ð¸Ñ Ð”Ð¾Ñ€Ð¸Ð°Ð½Ð¾Ð²Ð¸Ñ‡ Минаев and Лев Семенович Рубинштейн and ÐœÐ°Ñ€Ð¸Ñ Ð¡ÑƒÐ¼Ð½Ð¸Ð½Ð° and Линор Горалик and Любовь Романовна Гурова and ÐœÐ°Ñ€Ð¸Ñ Ð®Ð»ÑŒÐµÐ²Ð½Ð° Игнатьева and Маша Ðльтерман and Ðндрей Георгиевич Бильжо and ТатьÑна Малкина and ÐœÐ°Ñ€Ð¸Ñ Ð’Ð°Ð´Ð¸Ð¼Ð¾Ð²Ð½Ð° ВильÑÐ¼Ñ and ÐлекÑей Петрович Цветков and Ирина Григорьевна ГоловинÑÐºÐ°Ñ and Григорий Давидович БруÑкин",
+ size = "2254054 octets" }
+
+@book{ SierzhViktor1663,
+ title = "От революции к тоталитаризму: ВоÑÐ¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ñ€ÐµÐ²Ð¾Ð»ÑŽÑ†Ð¸Ð¾Ð½ÐµÑ€Ð°",
+ author = "Виктор Серж",
+ size = "853739 octets" }
+
+@book{ ManinIuriiIvanovich1666,
+ title = "Математика как метафора",
+ author = "Юрий Иванович Манин",
+ size = "2804433 octets" }
+
+@book{ ZierovM.1667,
+ title = "Байка Ñ– притча в українÑькій літературі XIX-XX в.",
+ author = "М. Зеров",
+ size = "170104285 octets" }
+
+@misc{ Anonymous1668,
+ title = "A Tour of the Solar System",
+ author = "Anonymous",
+ size = "79957264 octets" }
+
+@book{ ArkhipovaAlieksandraSierghieievnaKirziukAnna1669,
+ title = "ОпаÑные ÑоветÑкие вещи",
+ author = "ÐлекÑандра Сергеевна Ðрхипова and Ðнна Кирзюк",
+ size = "1544616 octets" }
+
+@book{ avtorovKolliektiv1670,
+ title = "Китай и окреÑтноÑти: мифологиÑ, фольклор, литература : к 75-летию академика Б.Л. Рифмина",
+ author = "Коллектив авторов",
+ size = "28754365 octets" }
+
+@book{ AdonievaSvietlanaArkhipovaAlieksandraBoghdanovKonstantinBoimiersBirghitBorisovaNataliiaDashkovaTatianaLidiermanIuliiaLipovietskiiMarkMurashovIuriiSavitskiiStanislavShvarttsMattias1672,
+ title = "СССР: Ð¢ÐµÑ€Ñ€Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð»ÑŽÐ±Ð²Ð¸ (Ñборник Ñтатей)",
+ author = "Светлана Ðдоньева and ÐлекÑандра Ðрхипова and КонÑтантин Богданов and Биргит Ð‘Ð¾Ð¹Ð¼ÐµÑ€Ñ and ÐÐ°Ñ‚Ð°Ð»Ð¸Ñ Ð‘Ð¾Ñ€Ð¸Ñова and ТатьÑна Дашкова and Ð®Ð»Ð¸Ñ Ð›Ð¸Ð´ÐµÑ€Ð¼Ð°Ð½ and Марк Липовецкий and Юрий Мурашов and СтаниÑлав Савицкий and ÐœÐ°Ñ‚Ñ‚Ð¸Ð°Ñ Ð¨Ð²Ð°Ñ€Ñ‚Ñ†",
+ size = "1960414 octets" }
+
+@book{ ArkhipovaA.SMielnichienkoMikhail1673,
+ title = "Ðнекдоты о Сталине: текÑÑ‚Ñ‹, комментарии, иÑÑледованиÑ",
+ author = "Ð. С Ðрхипова and Михаил Мельниченко",
+ size = "7253389 octets" }
+
+@book{ PanchienkoAlieksandr1674,
+ title = "РуÑÑкий политичеÑкий фольклор. ИÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ публикации",
+ author = "ÐлекÑандр Панченко",
+ size = "1332223 octets" }
+
+@misc{ ArkhipovaAlieksandraVolkovaMariiaKirziukAnnaMalaiaIelienaRadchienkoDariaIughaiIeliena1675,
+ title = "Мониторинг актуального фольклора. «Группы Ñмерти»: от игры к моральной панике",
+ author = "ÐлекÑандра Ðрхипова and ÐœÐ°Ñ€Ð¸Ñ Ð’Ð¾Ð»ÐºÐ¾Ð²Ð° and Ðнна Кирзюк and Елена ÐœÐ°Ð»Ð°Ñ and Ð”Ð°Ñ€ÑŒÑ Ð Ð°Ð´Ñ‡ÐµÐ½ÐºÐ¾ and Елена Югай",
+ size = "4357285 octets" }
+
+@misc{ ArkhipovaAlieksandraSierghieievna1676,
+ title = "Радио ОБС, птица обломинго и другие Ñзыковые игры в Ñовременном фольклоре",
+ author = "ÐлекÑандра Сергеевна Ðрхипова",
+ size = "5316238 octets" }
+
+@book{ ZaitsievValientinFiedorovichPolianinAndrieiDmitriievich1677,
+ title = "Справочник по обыкновенным дифференциальным уравнениÑм",
+ author = "Валентин Федорович Зайцев and Ðндрей Дмитриевич ПолÑнин",
+ size = "4614686 octets" }
+
+@book{ ZaitsievValientinFiedorovichPolianinAndrieiDmitriievich1678,
+ title = "Справочник по дифференциальным уравнениÑм Ñ Ñ‡Ð°Ñтными производными первого порÑдка",
+ author = "Валентин Федорович Зайцев and Ðндрей Дмитриевич ПолÑнин",
+ size = "3408828 octets" }
+
+@misc{ CatesMichaelE.1680,
+ title = "Active Field Theories",
+ author = "Michael E. Cates",
+ size = "2512166 octets" }
+
+@misc{ OsborneAllison1681,
+ title = "A Study in Victory Red",
+ author = "Allison Osborne",
+ size = "1010140 octets" }
+
+@misc{ OsborneAllison1682,
+ title = "The Circle Code Conundrum",
+ author = "Allison Osborne",
+ size = "1268919 octets" }
+
+@misc{ OsborneAllison1683,
+ title = "The Impossible Murderer",
+ author = "Allison Osborne",
+ size = "1027893 octets" }
+
+@misc{ OsborneAllison1684,
+ title = "The Detective's Nemesis",
+ author = "Allison Osborne",
+ size = "740277 octets" }
+
+@misc{ OsborneAllison1685,
+ title = "The Red Rover Society",
+ author = "Allison Osborne",
+ size = "537653 octets" }
+
+@misc{ OsborneAllison1686,
+ title = "The Happy Family Facade",
+ author = "Allison Osborne",
+ size = "1017264 octets" }
+
+@book{ SoloukhSierghiei1687,
+ title = "Комментарии к руÑÑкому переводу романа ЯроÑлава Гашека Â«ÐŸÐ¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°Ð²Ð¾Ð³Ð¾ Ñолдата Швейка»",
+ author = "Сергей Солоух",
+ size = "13662581 octets" }
+
+@misc{ GashiekIaroslav1688,
+ title = "ÐŸÐ¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°Ð²Ð¾Ð³Ð¾ Ñолдата Швейка. — Ðœ. : ЭкÑмо-ПреÑÑ. 1999",
+ author = "ЯроÑлав Гашек",
+ size = "9210751 octets" }
+
+@book{ HussRobyn1689,
+ title = "Hidden Villains",
+ author = "Robyn Huss",
+ size = "2474951 octets" }
+
+@book{ HussRobyn1690,
+ title = "Hidden Villains: Arise",
+ author = "Robyn Huss",
+ size = "4173621 octets" }
+
+@misc{ BennettS.F.1695,
+ title = "Sherlock Holmes: The Three Brothers",
+ author = "S. F. Bennett",
+ size = "5437587 octets" }
+
+@misc{ BennettS.F.1696,
+ title = "The Secret Diary of Mycroft Holmes",
+ author = "S. F. Bennett",
+ size = "1428018 octets" }
+
+@misc{ BennettS.F.1697,
+ title = "Sherlock Holmes. The Addleton Tradedy",
+ author = "S. F. Bennett",
+ size = "3214085 octets" }
+
+@misc{ BennettS.F.1698,
+ title = "The Collected Endeavours of Sherlock Holmes",
+ author = "S. F. Bennett",
+ size = "1659647 octets" }
+
+@misc{ MasaAlejandroPolanco1701,
+ title = "Spanish Castles 1865 (BW edition)",
+ author = "Alejandro Polanco Masa",
+ size = "113648635 octets" }
+
+@misc{ MasaAlejandroPolanco1702,
+ title = "Spanish Castles 1865 (Sepia edition)",
+ author = "Alejandro Polanco Masa",
+ size = "232714050 octets" }
+
+@book{ NeedhamTristan1703,
+ title = "Visual Differential Geometry and Forms: A Mathematical Drama in Five Acts",
+ author = "Tristan Needham",
+ size = "26070946 octets" }
+
+@misc{ JonesStevenPhilip1706,
+ title = "Sherlock Holmes and The Coal Tar Derivative",
+ author = "Steven Philip Jones",
+ size = "1454454 octets" }
+
+@misc{ LyneKieran1707,
+ title = "The Last Confessions of Sherlock Holmes",
+ author = "Kieran Lyne",
+ size = "1376394 octets" }
+
+@misc{ MadsenDianeGilber1708,
+ title = "The Conan Doyle Notes: The Secret of Jack the Ripper",
+ author = "Diane Gilber Madsen",
+ size = "1861793 octets" }
+
+@misc{ TurnbloomDean1709,
+ title = "Sherlock Holmes and The Whitechapel Vampire",
+ author = "Dean Turnbloom",
+ size = "1327858 octets" }
+
+@misc{ SohnMark1710,
+ title = "Sherlock Holmes and The Whitechapel Murders",
+ author = "Mark Sohn",
+ size = "1849990 octets" }
+
+@misc{ EmersonFrank1711,
+ title = "Sherlock Holmes and The Unmasking of the Whitechapel Horror",
+ author = "Frank Emerson",
+ size = "1183988 octets" }
+
+@misc{ KellyGerard1712,
+ title = "Sherlock Holmes and the Hunt for Jack the Ripper",
+ author = "Gerard Kelly",
+ size = "394574 octets" }
+
+@book{ EvansS.Usher1713,
+ title = "Of Drinks and Sinkholes: A Cozy Fantasy Novel",
+ author = "S. Usher Evans",
+ size = "12383221 octets" }
+
+@book{ ZhielvisVladimirIlich1714,
+ title = "Â«Ð—Ð»Ð°Ñ Ð»Ð°Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð½Ð°Ñ...»: Ñборник Ñтатей",
+ author = "Владимир Ильич ЖельвиÑ",
+ size = "6379292 octets" }
+
+@misc{ SmithDeanWesleyRuschKristineKathryn1718,
+ title = "Fantasies Collide Vol. 5",
+ author = "Dean Wesley Smith and Kristine Kathryn Rusch",
+ size = "5374316 octets" }
+
+@misc{ SmithDeanWesleyRuschKristineKathryn1719,
+ title = "Fantasies Collide Vol. 1",
+ author = "Dean Wesley Smith and Kristine Kathryn Rusch",
+ size = "4384668 octets" }
+
+@misc{ SmithDeanWesleyRuschKristineKathryn1720,
+ title = "Fantasies Collide Vol. 4",
+ author = "Dean Wesley Smith and Kristine Kathryn Rusch",
+ size = "4141336 octets" }
+
+@misc{ SmithDeanWesleyRuschKristineKathryn1723,
+ title = "Fantasies Collide Vol. 3",
+ author = "Dean Wesley Smith and Kristine Kathryn Rusch",
+ size = "5382634 octets" }
+
+@misc{ SmithDeanWesleyRuschKristineKathryn1724,
+ title = "Fantasies Collide Vol. 2",
+ author = "Dean Wesley Smith and Kristine Kathryn Rusch",
+ size = "4746204 octets" }
+
+@misc{ MikhailikIeliena1725,
+ title = "Мандельштам был раÑÑеÑн и вÑех поÑтоÑнно путал…",
+ author = "Елена Михайлик",
+ size = "279946 octets" }
+
+@book{ PyleMarxMastroJ.C.RonnMichaelLaDowKatherineGessnerCarriePlybonKevinBurnsJeffCookJeremiahDylanWolfMarisa1726,
+ title = "Tales of Monstrosity: Bonus Short Stories",
+ author = "Marx Pyle and J.C. Mastro and Michael La Ronn and Katherine Dow and Carrie Gessner and Kevin Plybon and Jeff Burns and Jeremiah Dylan Cook and Marisa Wolf",
+ size = "1525032 octets" }
+
+@book{ FreelingEvelyn1733,
+ title = "Les Petites Morts",
+ author = "Evelyn Freeling",
+ size = "3846313 octets" }
+
+@misc{ MarcumDavid1734,
+ title = "The Collected Papers of Sherlock Holmes",
+ author = "David Marcum",
+ size = "5719417 octets" }
+
+@misc{ WardeckerMark1735,
+ title = "The Arrival of Solar Pons",
+ author = "Mark Wardecker",
+ size = "4386936 octets" }
+
+@misc{ LieibovRoman1736,
+ title = "ПоÑма Пушкина «Граф Ðулин». Опыт комментированного чтениÑ",
+ author = "Роман Лейбов",
+ size = "12888033 octets" }
+
+@misc{ EvansS.Usher1737,
+ title = "Fiends and Festivals",
+ author = "S. Usher Evans",
+ size = "957732 octets" }
+
+@misc{ AquiloneJames1745,
+ title = "Shakespeare Unleashed Art Book",
+ author = "James Aquilone",
+ size = "4768868 octets" }
+
+@misc{ AquiloneJames1746,
+ title = "Shakespeare Unleashed",
+ author = "James Aquilone",
+ size = "37072105 octets" }
+
+@misc{ HallArthur1747,
+ title = "Further Little Known Adventures of Sherlock Holmes",
+ author = "Arthur Hall",
+ size = "761442 octets" }
+
+@misc{ HallArthur1748,
+ title = "The Recollections of Sherlock Holmes",
+ author = "Arthur Hall",
+ size = "1317866 octets" }
+
+@misc{ HallArthur1749,
+ title = "The Additional Investigations of Sherlock Holmes",
+ author = "Arthur Hall",
+ size = "852792 octets" }
+
+@misc{ HallArthur1750,
+ title = "Tales From The Annals of Sherlock Holmes",
+ author = "Arthur Hall",
+ size = "821593 octets" }
+
+@book{ PyleMarxPyleJulieSeaton1754,
+ title = "Tales of Monstrosity: A Field Guide to Monsters",
+ author = "Marx Pyle and Julie Seaton Pyle",
+ size = "5246929 octets" }
+
+@misc{ MarcumDavid1755,
+ title = "The Nefarious Villains of Sherlock Holmes. Volume I",
+ author = "David Marcum",
+ size = "5353285 octets" }
+
+@misc{ LawrenceJohn1756,
+ title = "Sherlock Holmes. The Affair at Mayerling Lodge",
+ author = "John Lawrence",
+ size = "2706320 octets" }
+
+@book{ MarcumDavid1757,
+ title = "After the East Wind Blows. WWI and Roaring Twenties Adventures of Sherlock Holmes Part II",
+ author = "David Marcum",
+ size = "8365723 octets" }
+
+@book{ MarcumDavid1758,
+ title = "After the East Wind Blows. WWI and Roaring Twenties Adventures of Sherlock Holmes Part I",
+ author = "David Marcum",
+ size = "4903763 octets" }
+
+@book{ MarcumDavid1759,
+ title = "After the East Wind Blows. WWI and Roaring Twenties Adventures of Sherlock Holmes. Part III",
+ author = "David Marcum",
+ size = "9252058 octets" }
+
+@misc{ MarcumDavid1763,
+ title = "The MX Book of New Sherlock Holmes Stories. Part XXXIX. 2023 Annual (1897-1923)",
+ author = "David Marcum",
+ size = "4496984 octets" }
+
+@misc{ MarcumDavid1764,
+ title = "The MX Book of New Sherlock Holmes Stories. Part XXXVII. 2023 Annual (1875-1889)",
+ author = "David Marcum",
+ size = "3378027 octets" }
+
+@misc{ MarcumDavid1765,
+ title = "The MX Book of New Sherlock Holmes Stories. Part XXXVIII. 2023 Annual (1890-1896)",
+ author = "David Marcum",
+ size = "3440030 octets" }
+
+@book{ MetzlerRalfJeonJae-HyungCherstvyAndreyG.BarkaiEli1766,
+ title = "Anomalous diffusion models and their properties: non-stationarity, non-ergodicity, and ageing at the centenary of single particle tracking",
+ author = "Ralf Metzler and Jae-Hyung Jeon and Andrey G. Cherstvy and Eli Barkai",
+ size = "7099496 octets" }
+
+@book{ Stern-WeinerJamie1767,
+ title = "Moment of Truth",
+ author = "Jamie Stern-Weiner",
+ size = "2202645 octets" }
+
+@book{ Leyton-BrownKevinShohamYoav1769,
+ title = "Essentials of Game Theory: A Concise, Multidisciplinary Introduction",
+ author = "Kevin Leyton-Brown and Yoav Shoham",
+ size = "1734154 octets" }
+
+@misc{ ShohamYoavLeyton-BrownKevin1770,
+ title = "Multiagent Systems: Algorithmic, Game-Theoretic, and Logical Foundations",
+ author = "Yoav Shoham and Kevin Leyton-Brown",
+ size = "3914452 octets" }
+
+@book{ PoytonRobert1771,
+ title = "THE PICKMAN PAPERS",
+ author = "Robert Poyton",
+ size = "19042560 octets" }
+
+@misc{ JiPengYeJiachenMuYuLinWeiTianYangHensChittaranjanPercMatjazTangYangSunJieKurthsJurgen1773,
+ title = "Signal propagation in complex networks",
+ author = "Peng Ji and Jiachen Ye and Yu Mu and Wei Lin and Yang Tian and Chittaranjan Hens and Matjaž Perc and Yang Tang and Jie Sun and Jürgen Kurths",
+ size = "15388333 octets" }
+
+@book{ SimoneNaima1774,
+ title = "To Conquer A Bride",
+ author = "Naima Simone",
+ size = "615974 octets" }
+
+@book{ ChristopherAndieJ1775,
+ title = "To Win a Witch's Heart",
+ author = "Andie J Christopher",
+ size = "577891 octets" }
+
+@book{ NordbakJenny1776,
+ title = "To Seduce a Siren",
+ author = "Jenny Nordbak",
+ size = "1285074 octets" }
+
+@book{ RobertKatee1777,
+ title = "To Kidnap a Princess",
+ author = "Katee Robert",
+ size = "1319066 octets" }
+
+@book{ NascostaC.M.1778,
+ title = "To Ravish a Rogue",
+ author = "C.M. Nascosta",
+ size = "605865 octets" }
+
+@book{ SaxenaNina1779,
+ title = "To Plunder a Pirate Queen",
+ author = "Nina Saxena",
+ size = "600859 octets" }
+
+@book{ BalsamoA.1780,
+ title = "Noncorporeal",
+ author = "A. Balsamo",
+ size = "432949 octets" }
+
+@misc{ SeitzStephen1781,
+ title = "Never Meant To Be",
+ author = "Stephen Seitz",
+ size = "1842598 octets" }
+
+@misc{ SeitzStephen1782,
+ title = "Sherlock Holmes and the House of Pain",
+ author = "Stephen Seitz",
+ size = "1215006 octets" }
+
+@misc{ SearfossGlenn1783,
+ title = "Sherlock Holmes. A Question of Time",
+ author = "Glenn Searfoss",
+ size = "1393138 octets" }
+
+@misc{ DruceMichael1784,
+ title = "Sherlock Holmes and the Roswell Incident",
+ author = "Michael Druce",
+ size = "2156141 octets" }
+
+@book{ DruceMichael1786,
+ title = "Sherlock Holmes and the Portal of Time",
+ author = "Michael Druce",
+ size = "1758679 octets" }
+
+@misc{ ParkJesang1787,
+ title = "Budoji: A Tale of the Divine City of Ancient Korea with an Overview of Korean Shamanism",
+ author = "Jesang Park",
+ size = "16219205 octets" }
+
+@misc{ BoydSarah1788,
+ title = "A Coup of Owls 2021-2022",
+ author = "Sarah Boyd",
+ size = "1478028 octets" }
+
+@misc{ BoydSarah1789,
+ title = "Other and Different",
+ author = "Sarah Boyd",
+ size = "2486351 octets" }
+
+@misc{ MasaAlejandroPolanco1792,
+ title = "Geography 1880",
+ author = "Alejandro Polanco Masa",
+ size = "424005990 octets" }
+
+@book{ RaglinEric1793,
+ title = "No Trouble at All",
+ author = "Eric Raglin",
+ size = "1024400 octets" }
+
+@book{ PerrinJean-Georges1794,
+ title = "Spark in Action, Second Edition: Covers Apache Spark 3 With Examples in Java, Python, and Scala",
+ author = "Jean-Georges Perrin",
+ size = "31861696 octets" }
+
+@book{ BelangerDerrick1795,
+ title = "Sherlock Holmes and the Great Detectives",
+ author = "Derrick Belanger",
+ size = "8936116 octets" }
+
+@misc{ MarcumDavid1797,
+ title = "The Detective and The Clergyman. The adventures of Sherlock Holmes and Father Brown",
+ author = "David Marcum",
+ size = "3896255 octets" }
+
+@book{ KottwitzStefan1799,
+ title = "LaTeX Graphics with TikZ",
+ author = "Stefan Kottwitz",
+ size = "12954043 octets" }
+
+@book{ BurnettMisha1801,
+ title = "Small Worlds",
+ author = "Misha Burnett",
+ size = "767829 octets" }
+
+@book{ BurnettMisha1802,
+ title = "An Atlas of Bad Roads",
+ author = "Misha Burnett",
+ size = "440144 octets" }
+
+@book{ BurnettMisha1803,
+ title = "Bad Dreams and Broken Hearts: The Case Files Of Erik Rugar, Dracoheim Department of Public Safety",
+ author = "Misha Burnett",
+ size = "620113 octets" }
+
+@book{ BurnettMisha1804,
+ title = "Misha Burnett Anthology",
+ author = "Misha Burnett",
+ size = "237236 octets" }
+
+@misc{ GilbertPaulD.1805,
+ title = "Sherlock Holmes: Tales of Darkness",
+ author = "Paul D. Gilbert",
+ size = "1042768 octets" }
+
+@book{ MittelbachFrank1806,
+ title = "The LaTeX Companion: Parts I \& II, 3rd Edition",
+ author = "Frank Mittelbach and Ulrike Fischer",
+ size = "131510724 octets" }
+
+@misc{ RiethmeierRay1809,
+ title = "Sherlock Holmes: Stranger Than Fiction",
+ author = "Ray Riethmeier",
+ size = "9156888 octets" }
+
+@misc{ RiethmeierRay1811,
+ title = "Sherlock Holmes Stranger than Truth",
+ author = "Ray Riethmeier",
+ size = "8386990 octets" }
+
+@misc{ RiethmeierRay1812,
+ title = "The Consultations of Sherlock Holmes",
+ author = "Ray Riethmeier",
+ size = "6401066 octets" }
+
+@book{ RevelsTracy1815,
+ title = "Shadowfall, a Novel of Sherlock Holmes",
+ author = "Tracy Revels",
+ size = "778581 octets" }
+
+@misc{ WalshMargaret1816,
+ title = "Sherlock Holmes and the Hellfire Heirs",
+ author = "Margaret Walsh",
+ size = "1043943 octets" }
+
+@misc{ AdamsonMike1817,
+ title = "Sherlock Holmes: A Tradition of Evil",
+ author = "Mike Adamson",
+ size = "4091998 octets" }
+
+@book{ JamesD.MacdonaldTomEastonDialJudithK.1818,
+ title = "ARC: Horror for the Throne",
+ author = "James D. Macdonald, Tom Easton and Judith K. Dial",
+ size = "375847 octets" }
+
+@book{ VentrellaMichaelA.1819,
+ title = "Three Time Travelers Walk Into...",
+ author = "Michael A. Ventrella",
+ size = "597564 octets" }
+
+@book{ EastonTomDialJudithK.1820,
+ title = "Science Fiction for the Throne: One-Sitting Reads",
+ author = "Tom Easton and Judith K. Dial",
+ size = "340613 octets" }
+
+@book{ DialJudithK.EastonTom1821,
+ title = "Fantasy for the Throne",
+ author = "Judith K. Dial and Tom Easton",
+ size = "375562 octets" }
+
+@book{ BursteinMichaelA.1822,
+ title = "Jewish Futures",
+ author = "Michael A. Burstein",
+ size = "593579 octets" }
+
+@book{ ShulmanIekatierina1824,
+ title = "ПрактичеÑÐºÐ°Ñ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¾Ð»Ð¾Ð³Ð¸Ñ. ПоÑобие по контакту Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ð¾Ñтью",
+ author = "Екатерина Шульман",
+ size = "2011731 octets" }
+
+@misc{ ArkhipovaAlieksandra1825,
+ title = "«Штирлиц шел по коридору…» Как мы придумываем анекдоты",
+ author = "ÐлекÑандра Ðрхипова",
+ size = "6019628 octets" }
+
+@misc{ FikhtiengholtsGrighoriiMikhailovich1826,
+ title = "ÐšÑƒÑ€Ñ Ð´Ð¸Ñ„ÐµÑ€ÐµÐ½Ñ†Ñ–Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ та інтегрального чиÑленнÑ",
+ author = "Григорій Михайлович Фіхтенгольц (переклад: Сергій Зінов'єв)",
+ size = "19993209 octets" }
+
+@misc{ ChanChris1827,
+ title = "Nessie's Nemesis",
+ author = "Chris Chan",
+ size = "1061600 octets" }
+
+@book{ ZizekSlavoj1828,
+ title = "Mad World: War, Movies, Sex",
+ author = "Slavoj Žižek",
+ size = "6919921 octets" }
+
+@misc{ EnghielghardtAlieksandrNikolaievich1831,
+ title = "ПиÑьма из деревни",
+ author = "ÐлекÑандр Ðиколаевич Энгельгардт",
+ size = "2029894 octets" }
+
+@misc{ ZabolotskiiN.1832,
+ title = "Собр. Ñоч. в 3-Ñ… Ñ‚Ñ‚. Т. 2: Переводы. Ðœ., Худ. лит., 1984. EBook 2014",
+ author = "Ð. Заболоцкий",
+ size = "2184701 octets" }
+
+@misc{ ZabolotskiiN.1833,
+ title = "Собр. Ñоч. в 3-Ñ… Ñ‚Ñ‚. Т. 1: Столбцы и поÑмы 1926-1933. Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ 1932-1958.",
+ author = "Ð. Заболоцкий",
+ size = "3184945 octets" }
+
+@misc{ ZabolotskiiN.1834,
+ title = "Собр. Ñоч. в 3-Ñ… Ñ‚Ñ‚. Т. 3: Переводы. ПиÑьма 1921-1958.",
+ author = "Ð. Заболоцкий",
+ size = "2098008 octets" }
+
+@misc{ BelangerDerrickBelangerBrian1835,
+ title = "Sherlock Holmes Adventures in the Realms of H.P. Lovecraft Volume 1 edited by Brian and Derrick Belanger",
+ author = "Derrick Belanger and Brian Belanger",
+ size = "2071892 octets" }
+
+@misc{ BelangerDerrickBelangerBrian1836,
+ title = "Sherlock Holmes Adventures in the Realms of H.P. Lovecraft Volume 2 edited by Brian and Derrick Belanger",
+ author = "Derrick Belanger and Brian Belanger",
+ size = "2045731 octets" }
+
+@misc{ HodgeJohn1837,
+ title = "Collaborators: A Play",
+ author = "John Hodge",
+ size = "7864885 octets" }
+
+@book{ WassermanStanleyFaustKatherine1838,
+ title = "Social Network Analysis: Methods and Applications",
+ author = "Stanley Wasserman and Katherine Faust",
+ size = "39729367 octets" }
+
+@book{ LightRyanMoodyJames1839,
+ title = "The Oxford Handbook of Social Networks",
+ author = "Ryan Light and James Moody",
+ size = "66151159 octets" }
+
+@book{ GarridoLuis1840,
+ title = "Far From Equilibrium Phase Transitions: Proceedings of the Xth Sitges Conference on Statistical Mechanics, Sitges, Barcelona, Spain, June 6–10, 1988",
+ author = "Luis Garrido",
+ size = "4673177 octets" }
+
+@misc{ MikhailikIelienaIurievna1841,
+ title = "Ðе Ñ Ñ‚Ð¾Ð¹ Ñтороны земли",
+ author = "Елена Юрьевна Михайлик",
+ size = "1092378 octets" }
+
+@misc{ LovecraftH.P.1842,
+ title = "The Complete Works of H. P. Lovecraft",
+ author = "H. P. Lovecraft",
+ size = "8153357 octets" }
+
+@misc{ SaidEdwardW.1843,
+ title = "Culture and Imperialism",
+ author = "Edward W. Said",
+ size = "8291620 octets" }
+
+@misc{ SaidEdwardW.1844,
+ title = "Orientalism",
+ author = "Edward W. Said",
+ size = "10154198 octets" }
+
+@misc{ SaidEdwardW.1845,
+ title = "The Text, The World, The Critic",
+ author = "Edward W. Said",
+ size = "21801893 octets" }
+
+@misc{ SaidEdwardW.1846,
+ title = "The question of Palestine",
+ author = "Edward W. Said",
+ size = "24532631 octets" }
+
+@misc{ ZabuzhkoOksana1847,
+ title = "Польові доÑÐ»Ñ–Ð´Ð¶ÐµÐ½Ð½Ñ Ð· українÑького ÑекÑу",
+ author = "ОкÑана Забужко",
+ size = "345703 octets" }
+
+@misc{ GUTenbergAssociation1848,
+ title = "Lettre GUTenberg 51",
+ author = "Association GUTenberg (éditeur)",
+ size = "5124489 octets" }
+
+@misc{ PoeEdgarAllan1849,
+ title = "Complete Tales And Poems Of Edgar Allan Poe",
+ author = "Edgar Allan Poe",
+ size = "34679712 octets" }
+
+@misc{ KiplingRudyard1850,
+ title = "The works of Rudyard Kipling",
+ author = "Rudyard Kipling",
+ size = "71910464 octets" }
+
+@misc{ ShakespeareWilliam1851,
+ title = "The complete works of William Shakespeare",
+ author = "William Shakespeare",
+ size = "127499881 octets" }
+
+@book{ KurasovPavel1852,
+ title = "Spectral Geometry of Graphs",
+ author = "Pavel Kurasov",
+ size = "18101724 octets" }
+
+@misc{ GasparovMikhailLieonovich1853,
+ title = "Собрание Ñочинений в шеÑти томах. Т. 1: ГрециÑ",
+ author = "Михаил Леонович ГаÑпаров",
+ size = "18426222 octets" }
+
+@misc{ GasparovMikhailLieonovich1854,
+ title = "Собрание Ñочинений в шеÑти томах. Т. 2: Рим / ПоÑле Рима",
+ author = "Михаил Леонович ГаÑпаров",
+ size = "4822570 octets" }
+
+@misc{ ChapiekKariel1855,
+ title = "Война Ñ Ñаламандрами (Ñборник)",
+ author = "Карел Чапек",
+ size = "2419557 octets" }
+
+@misc{ SierienkoDaria1856,
+ title = "Девочки и инÑтитуции",
+ author = "Ð”Ð°Ñ€ÑŒÑ Ð¡ÐµÑ€ÐµÐ½ÐºÐ¾",
+ size = "783002 octets" }
+
+@misc{ GasparovMikhailLieonovich1857,
+ title = "Собрание Ñочинений в шеÑти томах. Т. 6. Ðаука и проÑветительÑтво",
+ author = "Михаил Леонович ГаÑпаров",
+ size = "5441084 octets" }
+
+@misc{ GasparovMikhailLieonovich1858,
+ title = "Собрание Ñочинений в шеÑти томах. Т. 4. Стиховедение",
+ author = "Михаил Леонович ГаÑпаров",
+ size = "52650491 octets" }
+
+@misc{ GasparovMikhailLieonovich1859,
+ title = "Собрание Ñочинений в шеÑти томах. Т. 3: РуÑÑÐºÐ°Ñ Ð¿Ð¾ÑзиÑ",
+ author = "Михаил Леонович ГаÑпаров",
+ size = "7549684 octets" }
+
+@misc{ GasparovMikhailLieonovich1860,
+ title = "Собрание Ñочинений в шеÑти томах. Т. 5: Переводы. О переводах и переводчиках",
+ author = "Михаил Леонович ГаÑпаров",
+ size = "8157695 octets" }
+
+@misc{ GalinaMariia1861,
+ title = "Пациент",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð“Ð°Ð»Ð¸Ð½Ð°",
+ size = "184936 octets" }
+
+@misc{ GalinaMariia1862,
+ title = "Поводырь",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð“Ð°Ð»Ð¸Ð½Ð°",
+ size = "216873 octets" }
+
+@book{ SuttonRichardS.BartoAndrewG.1863,
+ title = "Reinforcement Learning: An Introduction. Second Edition",
+ author = "Richard S. Sutton and Andrew G. Barto",
+ size = "73129769 octets" }
+
+@book{ Various1864,
+ title = "The Good, The Bad, \& the Uncanny",
+ author = "Various",
+ size = "2880165 octets" }
+
+@book{ AquiloneJames1865,
+ title = "Dead Detectives Society \#1",
+ author = "James Aquilone",
+ size = "18220125 octets" }
+
+@book{ AndersonKevinJ.1866,
+ title = "Death Warmed Over",
+ author = "Kevin J. Anderson",
+ size = "1490023 octets" }
+
+@book{ AquiloneJames1867,
+ title = "Dead Jack and the Pandemonium Device",
+ author = "James Aquilone",
+ size = "931283 octets" }
+
+@misc{ PrenticeLloydR.1869,
+ title = "Precision Typesetting for Self-Publishers. Learn LaTeX the easy way",
+ author = "Lloyd R. Prentice",
+ size = "4113112 octets" }
+
+@misc{ WritersDublinCreative1870,
+ title = "Untold Stories: An Anthology",
+ author = "Dublin Creative Writers",
+ size = "1095835 octets" }
+
+@book{ HieroclesPhilagrius1871,
+ title = "The Jests of Hierocles and Philagrius",
+ author = "Hierocles and Philagrius",
+ size = "1015637 octets" }
+
+@book{ BaghdasarovaSofia1872,
+ title = "Омерзительное иÑкуÑÑтво. Юмор и хоррор шедевров живопиÑи",
+ author = "Ð¡Ð¾Ñ„ÑŒÑ Ð‘Ð°Ð³Ð´Ð°Ñарова",
+ size = "32195814 octets" }
+
+@book{ BaghdasarovaSofia1873,
+ title = "ÐпокалипÑÐ¸Ñ Ð² иÑкуÑÑтве. ПутешеÑтвие к Ðрмагеддону",
+ author = "Ð¡Ð¾Ñ„ÑŒÑ Ð‘Ð°Ð³Ð´Ð°Ñарова",
+ size = "32736980 octets" }
+
+@book{ BaghdasarovaSofia1874,
+ title = "Воры, вандалы и идиоты. ÐšÑ€Ð¸Ð¼Ð¸Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ€ÑƒÑÑкого иÑкуÑÑтва",
+ author = "Ð¡Ð¾Ñ„ÑŒÑ Ð‘Ð°Ð³Ð´Ð°Ñарова",
+ size = "11196520 octets" }
+
+@book{ Dobrokhotova-MaikovaNataliaPiatnitskiiVladimir1875,
+ title = "«Лев ТолÑтой очень любил детей...». Ðнекдоты о пиÑателÑÑ…, припиÑываемые ХармÑу",
+ author = "ÐÐ°Ñ‚Ð°Ð»ÑŒÑ Ð”Ð¾Ð±Ñ€Ð¾Ñ…Ð¾Ñ‚Ð¾Ð²Ð°-Майкова and Владимир ПÑтницкий",
+ size = "11810372 octets" }
+
+@book{ StephensonSvetlana1876,
+ title = "Gangs of Russia: From the Streets to the Corridors of Power",
+ author = "Svetlana Stephenson",
+ size = "1999474 octets" }
+
+@misc{ SierienkoDaria1877,
+ title = "Я желаю пепла Ñвоему дому",
+ author = "Ð”Ð°Ñ€ÑŒÑ Ð¡ÐµÑ€ÐµÐ½ÐºÐ¾",
+ size = "312633 octets" }
+
+@book{ IvikOliegh1878,
+ title = "ИÑÑ‚Ð¾Ñ€Ð¸Ñ ÑекÑуальных запретов и предпиÑаний",
+ author = "Олег Ивик",
+ size = "416685 octets" }
+
+@book{ OByrneJ.KafriY.TailleurJ.WijlandF.van1879,
+ title = "Time irreversibility in active matter, from micro to macro",
+ author = "J. O'Byrne and Y. Kafri and J. Tailleur and F. van Wijland",
+ size = "14108603 octets" }
+
+@book{ BaalPierrevan1880,
+ title = "A Course in Field Theory",
+ author = "Pierre van Baal",
+ size = "4394983 octets" }
+
+
+@book{ ZhadanSierghii1896,
+ title = "Скрипниківка: нова книжка віршів",
+ author = "Сергій Жадан",
+ size = "11897507 octets" }
+
+@book{ ZhadanSierghii1897,
+ title = "30 віршів про любов і залізницю",
+ author = "Сергій Жадан",
+ size = "17616276 octets" }
+
+@book{ ZhadanSierghii1898,
+ title = "Anarchy in the UKR",
+ author = "Сергій Жадан",
+ size = "9945664 octets" }
+
+@book{ ShultsBruno1899,
+ title = "Цинамонові крамниці та вÑÑ– інші Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð°Ð½Ð½Ñ Ñƒ перекладі Ð®Ñ€Ñ–Ñ Ðндруховича",
+ author = "Бруно Шульц",
+ size = "1926221 octets" }
+
+@book{ ShultsBruno1902,
+ title = "Санаторій під клепÑидрою",
+ author = "Бруно Шульц",
+ size = "31279424 octets" }
+
+@book{ ZhadanSierghii1903,
+ title = "Біг Мак",
+ author = "Сергій Жадан",
+ size = "2684346 octets" }
+
+@book{ AndrukhovichIurii1907,
+ title = "МоÑковіада",
+ author = "Юрій Ðндрухович",
+ size = "6016343 octets" }
+
+@book{ KhiersonskiiBoris1908,
+ title = "Kosmosnash: Книга Ñтихотворений",
+ author = "Ð‘Ð¾Ñ€Ð¸Ñ Ð¥ÐµÑ€ÑонÑкий",
+ size = "1641745 octets" }
+
+@book{ AndrukhovichIurii1909,
+ title = "Радіо ніч",
+ author = "Юрій Ðндрухович",
+ size = "1624669 octets" }
+
+@book{ AndrukhovichIurii1912,
+ title = "ЛекÑикон інтимних міÑÑ‚. Довільний поÑібник з геопоетики та коÑмополітики",
+ author = "Юрій Ðндрухович",
+ size = "11469484 octets" }
+
+@book{ SnyderTimothy1915,
+ title = "On Tyranny",
+ author = "Timothy Snyder",
+ size = "4623585 octets" }
+
+@misc{ MarxKarl1916,
+ title = "Secret diplomatic history of the eighteenth century",
+ author = "Karl Marx",
+ size = "6670952 octets" }
+
+@misc{ CrowleyJohn1917,
+ title = "Two Talks on Writing",
+ author = "John Crowley",
+ size = "678616 octets" }
+
+@misc{ CrowleyJohn1922,
+ title = "Two Chapters in a Family Chronicle",
+ author = "John Crowley",
+ size = "539799 octets" }
+
+@misc{ CrowleyJohn1923,
+ title = "The Sixties: A Forged Diary",
+ author = "John Crowley",
+ size = "1997434 octets" }
+
+@misc{ CrowleyJohn1924,
+ title = "Seventy-Nine Dreams",
+ author = "John Crowley",
+ size = "2425051 octets" }
+
+@misc{ BelangerDerrick1925,
+ title = "Sherlock Holmes A Year of Mystery 1885",
+ author = "Derrick Belanger",
+ size = "6417338 octets" }
+
+@misc{ BelangerDerrick1926,
+ title = "Sherlock Holmes A Year of Mystery 1886",
+ author = "Derrick Belanger",
+ size = "4815816 octets" }
+
+@misc{ HanggiPeterTalknerPeterBorkovecMichal1929,
+ title = "Reaction-rate theory: fifty years after Kramers",
+ author = "Peter Hänggi and Peter Talkner and Michal Borkovec",
+ size = "5289095 octets" }
+
+@book{ AssangeJulianSharpeKaren1930,
+ title = "Julian Assange In His Own Words",
+ author = "Julian Assange and Karen Sharpe",
+ size = "1699052 octets" }
+
+@book{ FinkelsteinNormanG.1932,
+ title = "Method and Madness",
+ author = "Norman G. Finkelstein",
+ size = "1059446 octets" }
+
+@misc{ HawkinsSarah1936,
+ title = "Ulterior Motives",
+ author = "Stephanie K. Clemens",
+ size = "144406 octets" }
+
+@book{ LevichV.1938,
+ title = "Physicochemical Hydrodynamics",
+ author = "V. Levich",
+ size = "95279394 octets" }
+
+@book{ HagenKleinert1939,
+ title = "Path Integrals in Quantum Mechanics, Statistics, Polymer Physics, and Financial Markets (5th Edition)",
+ author = "Kleinert Hagen",
+ size = "16180089 octets" }
+
+@book{ HorizonsStrange1940,
+ title = "Strange Horizons November 2023 Ebook",
+ author = "Strange Horizons",
+ size = "5505231 octets" }
+
+@book{ HorizonsStrange1941,
+ title = "Strange Horizons October 2023 Ebook",
+ author = "Strange Horizons",
+ size = "2934577 octets" }
+
+@book{ HorizonsStrange1942,
+ title = "Strange Horizons May 2023 Ebook",
+ author = "Strange Horizons",
+ size = "8227742 octets" }
+
+@book{ HorizonsStrange1943,
+ title = "Strange Horizons September 2023 Ebook",
+ author = "Strange Horizons",
+ size = "2267668 octets" }
+
+@book{ HorizonsStrange1944,
+ title = "Strange Horizons August 2023 Ebook",
+ author = "Strange Horizons",
+ size = "3095321 octets" }
+
+@book{ HorizonsStrange1945,
+ title = "Strange Horizons July 2023 Ebook",
+ author = "Strange Horizons",
+ size = "5700858 octets" }
+
+@book{ HorizonsStrange1946,
+ title = "Strange Horizons January 2023 Ebook",
+ author = "Strange Horizons",
+ size = "9730606 octets" }
+
+@book{ HorizonsStrange1947,
+ title = "Strange Horizons December 2023 Ebook",
+ author = "Strange Horizons",
+ size = "1724354 octets" }
+
+@book{ HorizonsStrange1948,
+ title = "Strange Horizons June 2023 Ebook",
+ author = "Strange Horizons",
+ size = "4040613 octets" }
+
+@book{ HorizonsStrange1949,
+ title = "Strange Horizons April 2023 Ebook",
+ author = "Strange Horizons",
+ size = "3946560 octets" }
+
+@book{ HorizonsStrange1950,
+ title = "Strange Horizons February 2023 Ebook",
+ author = "Strange Horizons",
+ size = "2506997 octets" }
+
+@book{ HorizonsStrange1951,
+ title = "Strange Horizons March 2023 Ebook",
+ author = "Strange Horizons",
+ size = "3212625 octets" }
+
+@book{ DoctorowCory1952,
+ title = "The Bezzle",
+ author = "Cory Doctorow",
+ size = "4202708 octets" }
+
+@book{ DoctorowCory1953,
+ title = "Red Team Blues",
+ author = "Cory Doctorow",
+ size = "3846654 octets" }
+
+@book{ KhlievniukOlieghVitalievich1954,
+ title = "ÐšÐ¾Ñ€Ð¿Ð¾Ñ€Ð°Ñ†Ð¸Ñ Ñамозванцев. Ð¢ÐµÐ½ÐµÐ²Ð°Ñ Ñкономика и ÐºÐ¾Ñ€Ñ€ÑƒÐ¿Ñ†Ð¸Ñ Ð² ÑталинÑком СССР",
+ author = "Олег Витальевич Хлевнюк",
+ size = "4068535 octets" }
+
+@misc{ MikhailikIeliena1956,
+ title = "Страна, которой нет",
+ author = "Елена Михайлик",
+ size = "2110060 octets" }
+
+@misc{ CoyleT.Thorn1957,
+ title = "Fantastic Stories Kickstarter Edition",
+ author = "T. Thorn Coyle",
+ size = "685868 octets" }
+
+@misc{ CoyleT.Thorn1958,
+ title = "Mouse's Folly Kickstarter Edition",
+ author = "T. Thorn Coyle",
+ size = "1498520 octets" }
+
+@misc{ CoyleT.Thorn1959,
+ title = "Mouse's Fight Kickstarter Edition",
+ author = "T. Thorn Coyle",
+ size = "1475574 octets" }
+
+@misc{ CoyleT.Thorn1960,
+ title = "Mouse Tavern Song \& Art",
+ author = "T. Thorn Coyle",
+ size = "10781344 octets" }
+
+@misc{ BieltonKetrin1961,
+ title = "Люди Путина",
+ author = "КÑтрин Белтон",
+ size = "23472383 octets" }
+
+@book{ HeraldMiranda1973,
+ title = "Johnny Dragonseed",
+ author = "Miranda Herald",
+ size = "3174124 octets" }
+
+@book{ HeraldMiranda1974,
+ title = "The Briarhaven Brigade- Part 1",
+ author = "Miranda Herald",
+ size = "3405243 octets" }
+
+@book{ HeraldMiranda1975,
+ title = "Magical Creature Sanctuary",
+ author = "Miranda Herald",
+ size = "3245832 octets" }
+
+@book{ HeraldMiranda1976,
+ title = "Practical Guide to Magical Farming (Book 1)",
+ author = "Miranda Herald",
+ size = "6282657 octets" }
+
+@book{ HeraldMiranda1977,
+ title = "Night's Companion: Briarhaven Short Story",
+ author = "Miranda Herald",
+ size = "3582728 octets" }
+
+@misc{ HeraldMiranda1978,
+ title = "Briarhaven Map",
+ author = "Miranda Herald",
+ size = "2261512 octets" }
+
+@misc{ HeraldMiranda1979,
+ title = "Magical Farming Stickers",
+ author = "Miranda Herald",
+ size = "2406933 octets" }
+
+@misc{ HeraldMiranda1980,
+ title = "Magical Farming Character Art",
+ author = "Miranda Herald",
+ size = "2345350 octets" }
+
+@misc{ HeraldMiranda1981,
+ title = "Tekla: A Classic Briarhaven Game",
+ author = "Miranda Herald",
+ size = "76563590 octets" }
+
+@misc{ TanswellFennerStanley1984,
+ title = "Mathematical Rigour and Informal Proof",
+ author = "Fenner Stanley Tanswell",
+ size = "2564305 octets" }
+
+@book{ JoyceJames1985,
+ title = "Dubliners",
+ author = "James Joyce",
+ size = "1171855 octets" }
+
+@book{ JoyceJames1986,
+ title = "Ulysses",
+ author = "James Joyce",
+ size = "1139204 octets" }
+
+@book{ OsokaSierghii1987,
+ title = "Три лини Ð´Ð»Ñ ÐœÐ°Ñ€Ñ–Ñ—",
+ author = "Сергій ОÑока",
+ size = "4737260 octets" }
+
+@book{ IghnatienkoIrina1988,
+ title = "Тіло, ÑекÑ, шлюб",
+ author = "Ірина Ігнатенко",
+ size = "6378258 octets" }
+
+@book{ OsokaSierghii1990,
+ title = "Ðічні ÐºÑƒÐ¿Ð°Ð½Ð½Ñ Ð² Ñерпні",
+ author = "Сергій ОÑока",
+ size = "2158019 octets" }
+
+@misc{ AlonUri1993,
+ title = "Systems Medicine Physiological Circuits and the Dynamics of Disease",
+ author = "Uri Alon",
+ size = "13624683 octets" }
+
+@misc{ KahnemanDaniel1994,
+ title = "Thinking, Fast and Slow",
+ author = "Kahneman, Daniel",
+ size = "3215324 octets" }
+
+@book{ DavisKevinA.1995,
+ title = "Detectives, Sleuths, \& Nosy Neighbors",
+ author = "Kevin A. Davis",
+ size = "1020936 octets" }
+
+@book{ DavisKevinA.1996,
+ title = "David's Journal \#21",
+ author = "Kevin A. Davis",
+ size = "489964 octets" }
+
+@book{ DavisKevinA.1997,
+ title = "Nyx's Blade",
+ author = "Kevin A. Davis",
+ size = "1896274 octets" }
+
+@misc{ RyanRichardT.1999,
+ title = "No Holidays for Sherlock Holmes Kickstarter Edition eBook",
+ author = "Richard T. Ryan",
+ size = "2889601 octets" }
+
+@book{ MasseyMisty2000,
+ title = "Nevermore: Tales Inspired by Edgar Allan Poe",
+ author = "Misty Massey",
+ size = "1717435 octets" }
+
+@misc{ BelangerBrian2006,
+ title = "Beyond the Adventures of Sherlock Holmes vol 1 Kickstarter Final Edition",
+ author = "Brian Belanger",
+ size = "11534619 octets" }
+
+@misc{ BelangerBrian2007,
+ title = "Beyond the Adventures of Sherlock Holmes vol 2 Kickstarter Final Edition",
+ author = "Brian Belanger",
+ size = "11222113 octets" }
+
+@misc{ BelangerBrian2008,
+ title = "Beyond the Adventures of Sherlock Holmes vol 3 Kickstarter Final edition",
+ author = "Brian Belanger",
+ size = "11016435 octets" }
+
+@misc{ OsborneAllison2009,
+ title = "American Visitors",
+ author = "Allison Osborne",
+ size = "456608 octets" }
+
+@misc{ OsborneAllison2010,
+ title = "The Missing Two",
+ author = "Allison Osborne",
+ size = "994949 octets" }
+
+@misc{ OsborneAllison2011,
+ title = "The Hidden Case",
+ author = "Allison Osborne",
+ size = "1060795 octets" }
+
+@misc{ MowerMark2012,
+ title = "Sherlock Holmes: The Baker Street Case-Book",
+ author = "Mark Mower",
+ size = "1229459 octets" }
+
+@misc{ AndriaccoDan2013,
+ title = "No Police Like Holmes",
+ author = "Dan Andriacco",
+ size = "1850814 octets" }
+
+@misc{ SwecJosephW.III2014,
+ title = "Sherlock Holmes The Adventure of the Grinning Cat",
+ author = "Joseph W. Swec III",
+ size = "1009914 octets" }
+
+@misc{ WalshMargaret2015,
+ title = "Sherlock Holmes and the Molly-Boy Murders",
+ author = "Margaret Walsh",
+ size = "932238 octets" }
+
+@misc{ RyanRichardT.2016,
+ title = "The Merchant of Menace. A Sherlock Holmes Adventure",
+ author = "Richard T. Ryan",
+ size = "1161806 octets" }
+
+@misc{ PerezRachel2017,
+ title = "Carved in Ice and Glass",
+ author = "R.L. Perez",
+ size = "959332 octets" }
+
+@book{ J.AnnCurtis2018,
+ title = "Veiled in Stars and Silver",
+ author = "J. Ann Curtis",
+ size = "11152909 octets" }
+
+@misc{ RiveraMiguelR.2019,
+ title = "Abominable Worm of Fleet Street",
+ author = "Miguel R. Rivera",
+ size = "1446028 octets" }
+
+@misc{ HuntRiley2020,
+ title = "Born of Blood and Thorns\_ Kickstarter",
+ author = "Trish Beninato/ Riley Hunt",
+ size = "1774842 octets" }
+
+@book{ GorkiiMaksim2022,
+ title = "О руÑÑкомъ креÑÑ‚ÑŒÑнÑтвѣ",
+ author = "МакÑим Горький",
+ size = "585120 octets" }
+
+@book{ HollowayJo2023,
+ title = "Hunted by Wolves and Shadow",
+ author = "Jo Holloway",
+ size = "4087880 octets" }
+
+@book{ RiosJuliaBulkinNadia2024,
+ title = "Why Didn't You Just Leave",
+ author = "Julia Rios and Nadia Bulkin",
+ size = "7223733 octets" }
+
+@book{ KukulinIliaLipovietskiiMarkNaumovichMaiofisM.L2026,
+ title = "ВеÑелые человечки: культурные герои ÑоветÑкого детÑтва : Ñборник Ñтатей",
+ author = "Ð˜Ð»ÑŒÑ ÐšÑƒÐºÑƒÐ»Ð¸Ð½ and Марк Ðаумович Липовецкий and Ðœ. Л МайофиÑ",
+ size = "2450947 octets" }
+
+@misc{ MarcumDavid2027,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XLV: 2024 Annual (1898-1917)",
+ author = "David Marcum",
+ size = "3873156 octets" }
+
+@misc{ MarcumDavid2028,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XLIV: 2024 Annual (1889-1897)",
+ author = "David Marcum",
+ size = "3853658 octets" }
+
+@misc{ MarcumDavid2029,
+ title = "The MX Book of New Sherlock Holmes Stories - Part XLIII: 2024 Annual (1874-1888)",
+ author = "David Marcum",
+ size = "3880893 octets" }
+
+@misc{ FoyMichaelJ.2030,
+ title = "Sherlock Holmes - A Study in Illustrations - Volume 1",
+ author = "Michael J. Foy",
+ size = "249911088 octets" }
+
+@book{ VinnichukIuriiPavlovich2031,
+ title = "ÐÐ½Ñ‚Ð¾Ð»Ð¾Ð³Ñ–Ñ ÑƒÐºÑ€Ð°Ñ—Ð½Ñької фантаÑтики XIX—ХХ ÑÑ‚.",
+ author = "Юрій Павлович Винничук",
+ size = "5329338 octets" }
+
+@book{ VinnichukIuriiPavlovich2032,
+ title = "ÐÐ½Ñ‚Ð¾Ð»Ð¾Ð³Ñ–Ñ ÑƒÐºÑ€Ð°Ñ—Ð½Ñької готичної прози. Том 2",
+ author = "Юрій Павлович Винничук",
+ size = "6519289 octets" }
+
+@book{ VinnichukIuriiPavlovich2033,
+ title = "УкраїнÑька міÑтична проза",
+ author = "Юрій Павлович Винничук",
+ size = "3026141 octets" }
+
+@book{ PliasietskiiIevghien2035,
+ title = "Таємна пригода. ÐÐ½Ñ‚Ð¾Ð»Ð¾Ð³Ñ–Ñ ÑƒÐºÑ€Ð°Ñ—Ð½Ñької еротичної прози межі ХІХ–ХХ ÑÑ‚.",
+ author = "Євген ПлÑÑецький",
+ size = "2763338 octets" }
+
+@book{ GiuyismansZhoris-Karl2036,
+ title = "Супроти Ñ”Ñтва",
+ author = "ЖоріÑ-Карл ГюїÑманÑ",
+ size = "2584448 octets" }
+
+@book{ AghieievaVira2038,
+ title = "Коли говорÑÑ‚ÑŒ гармати... ÐÐ½Ñ‚Ð¾Ð»Ð¾Ð³Ñ–Ñ ÑƒÐºÑ€Ð°Ñ—Ð½Ñької воєнної прози ХХ ÑтоліттÑ",
+ author = "Віра Ðгеєва",
+ size = "11463498 octets" }
+
+@book{ AghieievaVira2040,
+ title = "ÐрабеÑки. ÐÐ½Ñ‚Ð¾Ð»Ð¾Ð³Ñ–Ñ ÑƒÐºÑ€Ð°Ñ—Ð½Ñької малої прози першої половини ХХ ÑÑ‚.",
+ author = "Віра Ðгеєва",
+ size = "4892296 octets" }
+
+@book{ VinnichukIuriiPavlovich2042,
+ title = "ÐÐ½Ñ‚Ð¾Ð»Ð¾Ð³Ñ–Ñ ÑƒÐºÑ€Ð°Ñ—Ð½Ñької готичної прози. Том 1",
+ author = "Юрій Павлович Винничук",
+ size = "5557737 octets" }
+
+@book{ CovelloB.Luna2047,
+ title = "Bound by Wishes and Ruin",
+ author = "B. Luna Covello",
+ size = "4465098 octets" }
+
+@book{ SmithPeter2048,
+ title = "Gödel Without Tears",
+ author = "Peter Smith",
+ size = "2273281 octets" }
+
+@book{ SmithPeter2049,
+ title = "An Introduction to Gödel's Theorems",
+ author = "Peter Smith",
+ size = "972569 octets" }
+
+@book{ DavisKevinA.2050,
+ title = "Noncorporeal II",
+ author = "Kevin A. Davis",
+ size = "565510 octets" }
+
+@book{ HealySharlene2051,
+ title = "Cursed by Seas and Darkness - Kickstarter Edition",
+ author = "Sharlene Healy",
+ size = "2441542 octets" }
+
+@misc{ TynionJamesIV2052,
+ title = "Room Service Script",
+ author = "James Tynion IV",
+ size = "134107 octets" }
+
+@book{ ArutiunovaKarineBielskiiStanislavBlizniukDmitriiBozhkoIghorBorodinMaksimBraghinaOlghaVinoghradovaNinaVishniakovaIanaGalinaMariiaDiediulinDmitriiDierishievaIekatierinaIevsaIrinaZhbankovVladimirZadorozhnyiDaniilKabanovAlieksandrKostinskiiAndrieiMotsarAlieksandrNaidienkoTaiaNovikovKirillPantieliatAlSmirnovIuriiSonMikhailStarikovVladimirRietivovaTatianaShtypielArkadii2053,
+ title = "Ð’Ð¾Ð·Ð´ÑƒÑˆÐ½Ð°Ñ Ñ‚Ñ€ÐµÐ²Ð¾Ð³Ð°",
+ author = "ÐšÐ°Ñ€Ð¸Ð½Ñ Ðрутюнова and СтаниÑлав БельÑкий and Дмитрий Близнюк and Игорь Божко and МакÑим Бородин and Ольга Брагина and Ðина Виноградова and Яна ВишнÑкова and ÐœÐ°Ñ€Ð¸Ñ Ð“Ð°Ð»Ð¸Ð½Ð° and Дмитрий Дедюлин and Екатерина Деришева and Ирина ЕвÑа and Владимир Жбанков and Даниил Задорожный and ÐлекÑандр Кабанов and Ðндрей КоÑтинÑкий and ÐлекÑандр Моцар and Ð¢Ð°Ñ Ðайденко and Кирилл Ðовиков and Ðл ПантелÑÑ‚ and Юрий Смирнов and Михаил Сон and Владимир Стариков and ТатьÑна Ретивова and Ðркадий Штыпель",
+ size = "500576 octets" }
+
+@book{ KabanovAlieksandr2054,
+ title = "Сын Ñнеговика",
+ author = "ÐлекÑандр Кабанов",
+ size = "1383152 octets" }
+
+@misc{ GalinaMariia2055,
+ title = "ÐіневіÑ",
+ author = "ÐœÐ°Ñ€Ñ–Ñ Ð“Ð°Ð»Ñ–Ð½Ð°",
+ size = "129144 octets" }
+
+@book{ BreakerS.L.2056,
+ title = "Trapped by Clocks and Hearts: An Alice in Wonderland Fairy Tale Romance",
+ author = "S. L. Breaker",
+ size = "3372445 octets" }
+
+@book{ GantmacherF.R.2057,
+ title = "The Theory of Matrices, Volume 2",
+ author = "F. R. Gantmacher",
+ size = "9098065 octets" }
+
+@book{ GantmacherF.R.2058,
+ title = "The Theory of Matrices, Volume 1",
+ author = "F. R. Gantmacher",
+ size = "12638786 octets" }
+
+@book{ GennesP.G.deProstJ.2059,
+ title = "The Physics of Liquid Crystals",
+ author = "P. G. de Gennes and J. Prost",
+ size = "54847948 octets" }
+
+@book{ GennesPierre-GillesdedeBrochard-WyartFrancoiseQuereDavid2060,
+ title = "Capillarity and Wetting Phenomena: Drops, Bubbles, Pearls, Waves",
+ author = "Pierre-Gilles de de Gennes and Francoise Brochard-Wyart and David Quere",
+ size = "21738873 octets" }
+
+@book{ ZhadanSierghii2061,
+ title = "Депеш Мод",
+ author = "Сергій Жадан",
+ size = "3217623 octets" }
+
+@misc{ VaisbierghMatviiZhadanSierghii2062,
+ title = "Дорожній Щоденник",
+ author = "Матвій ВайÑберг and Сергій Жадан",
+ size = "5836726 octets" }
+
+@misc{ ZhadanSierghii2064,
+ title = "Ðнтена",
+ author = "Сергій Жадан",
+ size = "56619686 octets" }
+
+@book{ ZhadanSierghii2065,
+ title = "Ворошиловград",
+ author = "Сергій Жадан",
+ size = "3887573 octets" }
+
+@book{ ZhadanSierghii2066,
+ title = "Ð–Ð¸Ñ‚Ñ‚Ñ ÐœÐ°Ñ€Ñ–Ñ—. Книга віршів Ñ– перекладів",
+ author = "Сергій Жадан",
+ size = "5113027 octets" }
+
+@book{ ZhadanSierghii2067,
+ title = "Тамплієри",
+ author = "Сергій Жадан",
+ size = "6999951 octets" }
+
+@book{ ZhadanSierghii2069,
+ title = "СпиÑок кораблів",
+ author = "Сергій Жадан",
+ size = "12941414 octets" }
+
+@book{ ZhadanSierghii2072,
+ title = "ПÑалом авіації",
+ author = "Сергій Жадан",
+ size = "55168610 octets" }
+
+@book{ ZhadanSierghii2075,
+ title = "Хлібне перемир'Ñ",
+ author = "Сергій Жадан",
+ size = "6972437 octets" }
+
+@book{ ZhadanSierghii2076,
+ title = "Інтернат",
+ author = "Сергій Жадан",
+ size = "1416547 octets" }
+
+@misc{ ZhadanSierghii2077,
+ title = "Пливи рибо пливи",
+ author = "Сергій Жадан",
+ size = "10582006 octets" }
+
+
+@book{ BorkhiesKhorkhieLuis2082,
+ title = "КоллекциÑ: РаÑÑказы. ЭÑÑе. СтихотворениÑ",
+ author = "БорхеÑ, Хорхе ЛуиÑ",
+ size = "18626931 octets" }
+
+@book{ BorkhiesKhorkhieLuis2083,
+ title = "ПиÑьмена Бога",
+ author = "БорхеÑ, Хорхе ЛуиÑ",
+ size = "7627868 octets" }
+
+@book{ BorkhiesKhorkhieLuis2084,
+ title = "Избранные ÑтихотворениÑ",
+ author = "БорхеÑ, Хорхе ЛуиÑ",
+ size = "2541055 octets" }
+
+@book{ GumilievN.S.2085,
+ title = "Полное Ñобрание Ñочинений. Том 8. ПиÑьма",
+ author = "Ð. С. Гумилев",
+ size = "11976962 octets" }
+
+@book{ GumilievN.S.2086,
+ title = "Полное Ñобрание Ñочинений. Том 7. О литературе",
+ author = "Ð. С. Гумилев",
+ size = "12757107 octets" }
+
+@book{ GumilievN.S.2087,
+ title = "Полное Ñобрание Ñочинений. Том 6. Проза (1907—1918)",
+ author = "Ð. С. Гумилев",
+ size = "11456249 octets" }
+
+@book{ LosievLiev2088,
+ title = "Ð¡Ñ‚Ð¸Ñ…Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð¸Ñ Ð¸Ð· четырёх книг",
+ author = "ЛоÑев, Лев",
+ size = "4116000 octets" }
+
+@book{ GumilievN.S.2089,
+ title = "Полное Ñобрание Ñочинений. Том 5. Ð”Ñ€Ð°Ð¼Ð°Ñ‚ÑƒÑ€Ð³Ð¸Ñ (1911—1921)",
+ author = "Ð. С. Гумилев",
+ size = "8249419 octets" }
+
+@book{ GumilievN.S.2090,
+ title = "Полное Ñобрание Ñочинений. Том 4. СтихотворениÑ. ПоÑмы. 1918—1921",
+ author = "Ð. С. Гумилев",
+ size = "8630675 octets" }
+
+@book{ GumilievN.S.2091,
+ title = "Полное Ñобрание Ñочинений. Том 3. СтихотворениÑ. ПоÑмы (1914-1918)",
+ author = "Ð. С. Гумилев",
+ size = "10823841 octets" }
+
+@book{ GumilievN.S.2092,
+ title = "Полное Ñобрание Ñочинений. Том 2. СтихотворениÑ. ПоÑмы (1910—1913)",
+ author = "Ð. С. Гумилев",
+ size = "7299699 octets" }
+
+@book{ GumilievN.S.2093,
+ title = "Полное Ñобрание Ñочинений. Том 1. СтихотворениÑ. ПоÑмы (1902—1910)",
+ author = "Ð. С. Гумилев",
+ size = "9232382 octets" }
+
+@book{ TsvietkovAlieksieiPietrovich2094,
+ title = "ШекÑпир отдыхает: Книга новых Ñтихотворений 2004—2005 гг.",
+ author = "Цветков, ÐлекÑей Петрович",
+ size = "630131 octets" }
+
+@book{ TsvietkovAlieksieiPietrovich2095,
+ title = "Дивно молвить: Собрание Ñтихотворений",
+ author = "Цветков, ÐлекÑей Петрович",
+ size = "5062156 octets" }
+
+@book{ TsvietkovAlieksieiPietrovich2096,
+ title = "СтихотворениÑ",
+ author = "Цветков, ÐлекÑей Петрович",
+ size = "3445434 octets" }
+
+@book{ MarcusSteven2097,
+ title = "The Other Victorians: A Study of Sexuality and Pornography in Mid-Nineteenth-Century England",
+ author = "Steven Marcus",
+ size = "18489318 octets" }
+
+@misc{ GarciaRebeccaL.HuttonCM2098,
+ title = "Spelled by Truth and Tresses by CM Hutton \& Rebecca L. Garcia",
+ author = "Rebecca L. Garcia and CM Hutton",
+ size = "1624964 octets" }
+
+@book{ Multiple2100,
+ title = "Aether Beyond the Binary",
+ author = "Multiple",
+ size = "8967399 octets" }
+
+@book{ boneturtle2101,
+ title = "A Cure for Magic",
+ author = "boneturtle",
+ size = "7172949 octets" }
+
+@book{ GalinaMariia2102,
+ title = "Communiqués",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð“Ð°Ð»Ð¸Ð½Ð°",
+ size = "744806 octets" }
+
+@misc{ GalinaMariia2112,
+ title = "Ðвтохтоны",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð“Ð°Ð»Ð¸Ð½Ð°",
+ size = "828631 octets" }
+
+@misc{ GalinaMariia2114,
+ title = "РаÑÑказы",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð“Ð°Ð»Ð¸Ð½Ð°",
+ size = "1071925 octets" }
+
+@book{ PerryLyndon2115,
+ title = "ResAliens Issue \#1",
+ author = "Lyndon Perry",
+ size = "132986 octets" }
+
+@book{ PerryLyndon2116,
+ title = "ResAliens Issue \#2",
+ author = "Lyndon Perry",
+ size = "356001 octets" }
+
+@book{ PerryLyndon2117,
+ title = "ResAliens Issue \#3",
+ author = "Lyndon Perry",
+ size = "386824 octets" }
+
+@misc{ CrawfordB.Harlan2118,
+ title = "The Widow Ayers",
+ author = "B. Harlan Crawford",
+ size = "319754 octets" }
+
+@misc{ GomelElana2119,
+ title = "The Corpse-Fishers Daughter",
+ author = "Elana Gomel",
+ size = "519110 octets" }
+
+@book{ PerryLyndon2120,
+ title = "Sherlock \& Friends: Edlritch Investigations",
+ author = "Lyndon Perry",
+ size = "14283112 octets" }
+
+@book{ PerryLyndon2121,
+ title = "ResAliens Issue \#8/9",
+ author = "Lyndon Perry",
+ size = "14359946 octets" }
+
+@book{ PerryLyndon2122,
+ title = "ResAliens Issue \#11",
+ author = "Lyndon Perry",
+ size = "10217004 octets" }
+
+@book{ PerryLyndon2123,
+ title = "ResAliens Issue \#10",
+ author = "Lyndon Perry",
+ size = "7842032 octets" }
+
+@misc{ ChinnMike2124,
+ title = "The Airs of Eden",
+ author = "Mike Chinn",
+ size = "550230 octets" }
+
+@book{ PerryLyndon2125,
+ title = "ResAliens Issue \#7",
+ author = "Lyndon Perry",
+ size = "6686475 octets" }
+
+@book{ PerryLyndon2126,
+ title = "ResAliens Issue \#6",
+ author = "Lyndon Perry",
+ size = "3279479 octets" }
+
+@book{ PerryLyndon2127,
+ title = "ResAliens Issue \#5",
+ author = "Lyndon Perry",
+ size = "212394 octets" }
+
+@book{ PerryLyndon2128,
+ title = "ResAliens Issue \#4",
+ author = "Lyndon Perry",
+ size = "193825 octets" }
+
+@book{ GomelElana2131,
+ title = "Little Sister",
+ author = "Elana Gomel",
+ size = "1889079 octets" }
+
+@book{ GomelElana2132,
+ title = "Nightwood",
+ author = "Elana Gomel",
+ size = "3732178 octets" }
+
+@misc{ GalinaMariia2133,
+ title = "Ðвтохтоны (Ð¿Ð¾Ð»Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ)",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð“Ð°Ð»Ð¸Ð½Ð°",
+ size = "2734861 octets" }
+
+@misc{ GalinaMariia2135,
+ title = "Медведки",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð“Ð°Ð»Ð¸Ð½Ð°",
+ size = "1918888 octets" }
+
+@book{ LosievLiev2137,
+ title = "Меандр",
+ author = "Лев ЛоÑев",
+ size = "1648441 octets" }
+
+@book{ LikhachievD.S.2138,
+ title = "ПовеÑÑ‚ÑŒ временных лет",
+ author = "Д. С. Лихачев (перев.)",
+ size = "2368104 octets" }
+
+@book{ LosievLiev2140,
+ title = "Эзопов Ñзык в руÑÑкой литературе (Ñовременный период)",
+ author = "Лев ЛоÑев",
+ size = "2518302 octets" }
+
+@book{ LosievLiev2143,
+ title = "Стихи",
+ author = "Лев ЛоÑев",
+ size = "4587348 octets" }
+
+@misc{ ChanChris2145,
+ title = "Autistic Sleuth",
+ author = "Chris Chan",
+ size = "1407277 octets" }
+
+@book{ AggarwalCharuC.2146,
+ title = "Social Network Data Analytics",
+ author = "Charu C. Aggarwal",
+ size = "5305794 octets" }
+
+@misc{ BelangerDerrickDavisC.Edward2147,
+ title = "Sherlock Holmes. Further Adventures in the Realms of H. G. Wells. Volume 1",
+ author = "Derrick Belanger and C. Edward Davis",
+ size = "453804 octets" }
+
+
+@book{ DorogovtsevSergeyN.MendesJoseF.F.2149,
+ title = "The Nature of Complex Networks",
+ author = "Sergey N. Dorogovtsev and José F. F. Mendes",
+ size = "83554722 octets" }
+
+@book{ GurianovaSvietlana2150,
+ title = "Ð’ начале было кофе. Лингвомифы, речевые «ошибки» и другие поводы поломать ÐºÐ¾Ð¿ÑŒÑ Ð² Ñпорах о руÑÑком Ñзыке",
+ author = "Светлана ГурьÑнова",
+ size = "1764723 octets" }
+
+@book{ SorokinVladimirGieorghiievich2151,
+ title = "ЛедÑÐ½Ð°Ñ Ñ‚Ñ€Ð¸Ð»Ð¾Ð³Ð¸Ñ",
+ author = "Владимир Георгиевич Сорокин",
+ size = "1940530 octets" }
+
+@book{ ShvartsIevghieniiLvovich2153,
+ title = "МоÑковÑÐºÐ°Ñ Ñ‚ÐµÐ»ÐµÑ„Ð¾Ð½Ð½Ð°Ñ ÐºÐ½Ð¸Ð¶ÐºÐ°",
+ author = "Евгений Львович Шварц",
+ size = "6559536 octets" }
+
+@book{ ShalamovVarlamTikhonovich2155,
+ title = "КолымÑкие раÑÑказы",
+ author = "Варлам Тихонович Шаламов",
+ size = "2738377 octets" }
+
+
+@misc{ HardyG.H.CainAlanJ.2160,
+ title = "An Annotated Mathematician's Apology",
+ author = "G.H. Hardy and Alan J. Cain (Annotator)",
+ size = "1713475 octets" }
+
+@misc{ CainAlanJ.2161,
+ title = "Form \& Number: A History of Mathematical Beauty",
+ author = "Alan J. Cain",
+ size = "36973763 octets" }
+
+@misc{ KienzhieievBakhytShkurullaievich2162,
+ title = "Ðа долгом Ñщике Пандоры",
+ author = "Бахыт Шкуруллаевич Кенжеев",
+ size = "127669 octets" }
+
+@misc{ DaviesDavidStuart2163,
+ title = "Mycroft Out of the Shadows",
+ author = "David Stuart Davies",
+ size = "329842 octets" }
+
+@book{ PodiervianskiiLies2164,
+ title = "Ðфрика, Ñни",
+ author = "ЛеÑÑŒ Подерв'ÑнÑький",
+ size = "729745 octets" }
+
+@misc{ PearsonOrlando2165,
+ title = "A Study in Statecraft: The Memoirs of Mycroft Holmes",
+ author = "Orlando Pearson",
+ size = "1433895 octets" }
+
+@misc{ PearsonOrlando2166,
+ title = "Dark Arts, Dark Acts: Sherlock Holmes in Berlin in 1940",
+ author = "Orlando Pearson",
+ size = "938149 octets" }
+
+@book{ AriasAlfonsoMartinez2167,
+ title = "The Master Builder",
+ author = "Alfonso Martinez Arias",
+ size = "24294287 octets" }
+
+@book{ KrieinMarkGrighorievichNudielmanAdolfAbramovich2168,
+ title = "Проблема моментов Маркова и ÑкÑтремальные задачи: Идеи и проблемы П.Л. Чебыщева и Ð.Ð. Маркова и их дальнейшее развитие",
+ author = "Марк Григорьевич Крейн and Ðдольф Ðбрамович Ðудельман",
+ size = "6013408 octets" }
+
+@book{ GelmanAndrewHillJenniferVehtariAki2169,
+ title = "Regression and Other Stories",
+ author = "Andrew Gelman and Jennifer Hill and Aki Vehtari",
+ size = "17320040 octets" }
+
+@book{ BanakhStiefan2170,
+ title = "ÐšÑƒÑ€Ñ Ñ„ÑƒÐ½ÐºÑ†iонального аналiзу (лiнiйнi операцiÑ—)",
+ author = "Стефан Банах",
+ size = "4977479 octets" }
+
+@misc{ MonsonJoe2171,
+ title = "The Horror at Pooh Corner",
+ author = "Joe Monson",
+ size = "4209270 octets" }
+
+@book{ MillerLulu2172,
+ title = "Why Fish Don't Exist: A Story of Loss, Love, and the Hidden Order of Life",
+ author = "Lulu Miller",
+ size = "26479128 octets" }
+
+@book{ Jordan-HeintzSara2173,
+ title = "Behind the Shadows",
+ author = "Sara Jordan-Heintz (editor)",
+ size = "571602 octets" }
+
+@book{ Jordan-HeintzSara2174,
+ title = "Behind the Shadows II",
+ author = "Sara Jordan-Heintz (editor)",
+ size = "615511 octets" }
+
+@book{ HussRobyn2175,
+ title = "Hidden Villains: Betrayed",
+ author = "Robyn Huss (editor)",
+ size = "1035828 octets" }
+
+@book{ BoyarinDaniel2176,
+ title = "The No-State Solution: A Jewish Manifesto",
+ author = "Daniel Boyarin",
+ size = "1788291 octets" }
+
+@misc{ Bien-AmosDanNoiDov2180,
+ title = "ЕврейÑкие народные Ñказки. Том I. СефардÑкие Ñказки",
+ author = "Дан Бен-ÐÐ¼Ð¾Ñ and Дов Ðой",
+ size = "16458322 octets" }
+
+@misc{ Bien-AmosDanNoiDov2181,
+ title = "ЕврейÑкие народные Ñказки. Том II. Сказки евреев ВоÑточной Европы",
+ author = "Дан Бен-ÐÐ¼Ð¾Ñ and Дов Ðой",
+ size = "14731378 octets" }
+
+@misc{ Bien-AmosDanNoiDov2182,
+ title = "ЕврейÑкие народные Ñказки. Том III. Сказки евреев арабÑких Ñтран",
+ author = "Дан Бен-ÐÐ¼Ð¾Ñ and Дов Ðой",
+ size = "16927035 octets" }
+
+@book{ DymshitsValierii2183,
+ title = "ЕврейÑкие литературные Ñказки",
+ author = "Валерий Дымшиц (ÑоÑÑ‚)",
+ size = "11429115 octets" }
+
+@book{ DymshitsV.2184,
+ title = "ЕврейÑкие народные Ñказки, преданиÑ, былички, раÑÑказы, анекдоты, Ñобранные Е. С. Райзе",
+ author = "В. Дымшиц",
+ size = "15562355 octets" }
+
+@misc{ Ben-AmosDanNoyDov2185,
+ title = "Folktales of the Jews. Volume 1. Tales from Eastern Europe",
+ author = "Dan Ben-Amos and Dov Noy",
+ size = "6711356 octets" }
+
+@misc{ Ben-AmosDanNoyDov2186,
+ title = "Folktales of the Jews. Volume 1. Tales from the Sephardic Dispersion",
+ author = "Dan Ben-Amos and Dov Noy",
+ size = "6875904 octets" }
+
+@misc{ BoiarinDaniel2187,
+ title = "Израиль по плоти. О ÑекÑе в талмудичеÑкой культуре",
+ author = "ДаниÑль БоÑрин",
+ size = "2624162 octets" }
+
+@misc{ BoyarinDaniel2188,
+ title = "The Jewish Gospels: The Story of the Jewish Christ",
+ author = "Daniel Boyarin",
+ size = "2779667 octets" }
+
+@misc{ RevelsTracyJ.2189,
+ title = "Sherlock Holmes: Tales of Light",
+ author = "Tracy J. Revels",
+ size = "1657563 octets" }
+
+@misc{ RevelsTracyJ.2190,
+ title = "Sherlock Holmes: Tales of Darkness",
+ author = "Tracy J. Revels",
+ size = "1625647 octets" }
+
+@misc{ RevelsTracyJ.2191,
+ title = "Sherlock Holmes: Tales of Shadow",
+ author = "Tracy J. Revels",
+ size = "1654622 octets" }
+
+@misc{ LozinskiiI.M.2192,
+ title = "ПольÑкі фрашки",
+ author = "І. Ðœ. ЛозинÑький (упорÑдник)",
+ size = "2836282 octets" }
+
+@book{ PottersMarcBouchaudJean-Philippe2193,
+ title = "A First Course in Random Matrix Theory",
+ author = "Marc Potters and Jean-Philippe Bouchaud",
+ size = "5643151 octets" }
+
+@book{ ValeanCornelIoan2194,
+ title = "(Almost) Impossible Integrals, Sums, and Series",
+ author = "Cornel Ioan Vălean",
+ size = "4996393 octets" }
+
+@book{ ValeanCornelIoan2195,
+ title = "More (Almost) Impossible Integrals, Sums, and Series: A New Collection of Fiendish Problems and Surprising Solutions",
+ author = "Cornel Ioan Vălean",
+ size = "7657308 octets" }
+
+@book{ DAVISKEVINA2196,
+ title = "Delicious Memories",
+ author = "Kevin A. Davis",
+ size = "281382 octets" }
+
+@book{ RyanRichardT2197,
+ title = "The Traitorous Templar: A Sherlock Holmes Adventure",
+ author = "Richard T Ryan",
+ size = "1386459 octets" }
+
+@book{ NiesboIu2198,
+ title = "Жага",
+ author = "Ю ÐеÑбьо",
+ size = "3536707 octets" }
+
+@book{ NiesboIu2199,
+ title = "Ðіж",
+ author = "Ю ÐеÑбьо",
+ size = "4336531 octets" }
+
+@book{ GalinaMariia2202,
+ title = "ÐиневиÑ",
+ author = "ÐœÐ°Ñ€Ð¸Ñ Ð“Ð°Ð»Ð¸Ð½Ð°",
+ size = "1119413 octets" }
+
+@misc{ PatryshevVlad2204,
+ title = "Modern Mathematics, First Edition",
+ author = "Vlad Patryshev",
+ size = "5503045 octets" }
+
+
+@misc{ VaravaAlievtinaIvanovna2207,
+ title = "Ðовый пользователь",
+ author = "Ðлевтина Ивановна Варава",
+ size = "702566 octets" }
+
+@misc{ VaravaAlievtinaIvanovna2208,
+ title = "Продвинутый аккаунт",
+ author = "Ðлевтина Ивановна Варава",
+ size = "747973 octets" }
+
+@misc{ VaravaAlievtinaIvanovna2209,
+ title = "ТаинÑтво пищепринÑтиÑ. ÐлиÑа",
+ author = "Ðлевтина Ивановна Варава",
+ size = "682954 octets" }
+
+@misc{ AssociationPDF2210,
+ title = "International Standard ISO 14289-2:2014 Document management applications — Electronic document file format enhancement for accessibility —Part 2: Use of ISO 32000-2 (PDF/UA-2)",
+ author = "PDF Association",
+ size = "2430806 octets" }
+
+@misc{ AssociationPDF2211,
+ title = "International Standard ISO 14289-1:2014 Document management applications — Electronic document file format enhancement for accessibility — Part 1: Use of ISO 32000-1 (PDF/UA-1)",
+ author = "PDF Association",
+ size = "769760 octets" }
+
+@misc{ AssociationPDF2212,
+ title = "ISO/TS 32005:2023",
+ author = "PDF Association",
+ size = "2055902 octets" }
+
+@misc{ AssociationPDF2213,
+ title = "PDF Declarations",
+ author = "PDF Association",
+ size = "168750 octets" }
+
+@misc{ AssociationPDFTWGPDFReuseTWGPDF/UA2214,
+ title = "Well-Tagged PDF (WTPDF) Using Tagged PDF for Accessibility and Reuse in PDF 2.0",
+ author = "PDF Association and PDF Reuse TWG and PDF/UA TWG",
+ size = "769457 octets" }
+
+@misc{ AssociationPDF2215,
+ title = "Tagged PDF Best Practice Guide: Syntax 1.0.1",
+ author = "PDF Association",
+ size = "1233877 octets" }
+
+@book{ TheoAlvar2216,
+ title = "Benothinged",
+ author = "Alvar Theo",
+ size = "2875949 octets" }
+
+@book{ HorizonsStrange2217,
+ title = "Strange Horizons 2024 Fund Drive Ebook",
+ author = "Strange Horizons",
+ size = "2049562 octets" }
+
+@book{ HorizonsStrange2218,
+ title = "Strange Horizons January 2024 Ebook",
+ author = "Strange Horizons",
+ size = "4219812 octets" }
+
+@book{ HorizonsStrange2219,
+ title = "Strange Horizons February 2024 Ebook",
+ author = "Strange Horizons",
+ size = "4492100 octets" }
+
+@book{ HorizonsStrange2220,
+ title = "Strange Horizons March 2024 Ebook",
+ author = "Strange Horizons",
+ size = "5496639 octets" }
+
+@book{ HorizonsStrange2221,
+ title = "Strange Horizons June 2024 Ebook",
+ author = "Strange Horizons",
+ size = "6257060 octets" }
+
+@book{ HorizonsStrange2222,
+ title = "Strange Horizons May 2024 Ebook",
+ author = "Strange Horizons",
+ size = "3472366 octets" }
+
+@book{ HorizonsStrange2223,
+ title = "Strange Horizons April 2024 Ebook",
+ author = "Strange Horizons",
+ size = "5547316 octets" }
+
diff --git a/graphics/bookshelf/doc/spines.pdf b/graphics/bookshelf/doc/spines.pdf
new file mode 100644
index 0000000000..707b1c4506
--- /dev/null
+++ b/graphics/bookshelf/doc/spines.pdf
Binary files differ
diff --git a/graphics/bookshelf/doc/spines.tex b/graphics/bookshelf/doc/spines.tex
new file mode 100644
index 0000000000..12a4f9740e
--- /dev/null
+++ b/graphics/bookshelf/doc/spines.tex
@@ -0,0 +1,12 @@
+% !TEX TS-program = lualatex
+% !TEX encoding = UTF-8 Unicode
+% !BIB TS-program = bibtex
+
+\documentclass[landscape]{bookshelf}
+\begin{document}
+\nocite{*}
+\bibliography{sample}
+\bibliographystyle{bookshelf}
+\end{document}
+
+
diff --git a/graphics/bookshelf/myshelf.jpg b/graphics/bookshelf/myshelf.jpg
deleted file mode 100644
index 72b7dda2ef..0000000000
--- a/graphics/bookshelf/myshelf.jpg
+++ /dev/null
Binary files differ
diff --git a/graphics/bookshelf/scripts/Makefile b/graphics/bookshelf/scripts/Makefile
new file mode 100644
index 0000000000..bbc3cf6ef8
--- /dev/null
+++ b/graphics/bookshelf/scripts/Makefile
@@ -0,0 +1 @@
+all clean distclean:
diff --git a/graphics/bookshelf/scripts/bookshelf-listallfonts b/graphics/bookshelf/scripts/bookshelf-listallfonts
new file mode 100755
index 0000000000..20ae696fd6
--- /dev/null
+++ b/graphics/bookshelf/scripts/bookshelf-listallfonts
@@ -0,0 +1,271 @@
+#!/usr/bin/env perl
+#
+=pod
+
+=head1 NAME
+
+bookshelf-listallfonts - list all fonts known to LuaTeX with "interesting" features
+
+=head1 SYNOPSIS
+
+bookshelf-listallfonts [-d] [-f FEATURES_FILE] [-x EXCLUDED_PATTERNS_FILE]
+
+bookshelf-listallfonts -h
+
+bookshelf-listallfonts -v
+
+bookshelf-listallfonts -m
+
+=head1 DESCRIPTION
+
+List all fonts known to LuaTeX adding "interesting" features to the
+listing.
+
+The script queries luaotfload databases and outputs the list of fonts
+and features as a tab-separated stream with two field: font
+name+feature name, and LuaTeX loading command. This form is suitable
+for L<mkfontsel.pl(1)> command from the I<bookshelf> package.
+
+We always include default features, C<+clig;+liga;+tlig>.
+
+It is recommended to issue
+
+ luaotfload-tool --update --force
+
+before running the script.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-d>
+
+Print debug information on the standard output.
+
+=item B<-f> I<FEATURES_FILE>
+
+Use patterns in the I<FEATURES> file instead of the default ones.
+
+=item B<-x> I<EXCLUDED_PATTERNS_FILE>
+
+Exclude patterns (font paths and features or combinations) listed
+in I<EXCLUDED_PATTERNS_FILE>.
+
+=item B<-v>
+
+Print version information
+
+=item B<-h>
+
+Print usage information
+
+=item B<-m>
+
+Print manual page
+
+=back
+
+=head1 AUTHOR
+
+Boris Veytsman, 2024
+
+=head1 LICENSE
+
+LPPL 1.3c
+
+=cut
+
+use strict;
+use Getopt::Long;
+use Pod::Usage;
+use open qw( :std :encoding(UTF-8) );
+my $VERSION = "1.0";
+my $featuresFile ="";
+my $excludedPatternsFile = "";
+my $DEBUG=0;
+my $help=0;
+my $man=0;
+my $vrs=0;
+
+GetOptions(
+ "debug" => \$DEBUG,
+ "features|f=s" => \$featuresFile,
+ "excluded|x=s" => \$excludedPatternsFile,
+ "help|?" => \$help,
+ "man" => \$man,
+ "version" => \$vrs
+ ) or pod2usage(2);
+
+pod2usage(1) if $help;
+pod2usage(-exitval => 0, -verbose=>2) if $man;
+die ("$0, version $VERSION, License: LPPL 1.3c\n") if $vrs;
+
+
+my @features;
+if ($featuresFile) {
+ open(FEATURES, $featuresFile) or die ("Cannot open file $featuresFile\n");
+ while (<FEATURES>) {
+ chomp;
+ if (length($_)) {
+ push @features, $_;
+ }
+ }
+ close FEATURES;
+} else {
+ @features = qw(
+ ^hist$
+ ^onum$
+ ^pcap$
+ ^smcp$
+ ^ss
+ ^swsh$
+ ^titl$
+ ^unic$
+ );
+}
+
+my @excluded;
+if ($excludedPatternsFile) {
+ open(PATTERNS, $excludedPatternsFile) or die ("Cannot open file $excludedPatternsFile\n");
+ while (<PATTERNS>) {
+ chomp;
+ if (length($_)) {
+ push @excluded, $_;
+ }
+ }
+ close PATTERNS;
+} else {
+ @excluded = qw(
+ Alegreya.*\+ss02
+ Spectral.*\+ss04
+ Hans_Holbein
+ Megazoid-Shade
+ HEJI2Text
+ NotoColorEmoji
+ GimletXRay-VF
+ MegabaseCore
+ PappardelleV2
+ countriesofeurope
+ drmdoz
+ drmsy
+ drmtc
+ drmfigs
+ drmgrk
+ smf
+ SimpleIcons
+ Skak
+ FontAwesome
+ InputCipher
+ FdSymbol
+ greciliae
+ blex\.ttf
+ blsy\.ttf
+ rblmi\.ttf
+ emo-lingchi
+ MnSymbol
+ MdSymbol
+ dantelogo
+ emmentaler
+ marvosym
+ Asap-Symbol
+ metsymb
+ AlgolRevived
+ P22FraJenPeo.otf
+ LTCFlueronsGranjon
+ LTCArchiveOrn
+ SVRsymbols
+ LTCHalloweenOrnaments
+ BradleyInitialsDJRLayers-Frame
+ P22CezanSwa
+ P22GaugnXtr
+ P22CezanSkt
+ P22CezanLig
+ P22DeaPro.*\+ss07
+ BradleyInitialsDJRLayers-Background
+ Junicode.*\+ss12
+ Junicode.*\+ss13
+ Junicode.*\+ss14
+ QTDingBits
+ Math-Companion
+ Script-Companion
+ TwemojiMozilla
+ NAMU-Tryzub
+ \/Fonts\/Supplemental\/
+ NotoSansMyanmar\.ttc
+ );
+}
+
+my $standardFeatures="+clig;+liga;+tlig";
+
+open(FONTS,
+ 'luaotfload-tool --list="plainname" --fields="fullpath,format,subfont"|')
+ or die ("Cannot run luaotfload-tool\n");
+while (<FONTS>) {
+ chomp;
+ if (/^\s*$/) {
+ next;
+ }
+ my ($plainname, $fullpath, $format, $subfont) = split /\t/;
+ if ($DEBUG) {
+ print STDERR "Font: $plainname\n";
+ }
+ my $goodFont=1;
+ foreach my $excl (@excluded) {
+ if ($fullpath =~ m/$excl/) {
+ $goodFont=0;
+ if ($DEBUG) {
+ print STDERR " Font $plainname is excluded by pattern $excl\n";
+ }
+ last;
+ }
+ }
+ if (!$goodFont) {
+ next;
+ }
+ my $loadcommand = "[".$fullpath."]";
+ if ($format eq 'ttc') {
+ $loadcommand .= "(".($subfont-1).")";
+ }
+ $loadcommand .= ":$standardFeatures";
+ print "$plainname\t$loadcommand\n";
+ if ($format eq 'ttc') {
+ next; # WE do not extract features for TTC fonts
+ }
+
+ open (FEATURES, "otfinfo -f '$fullpath' |");
+ while (<FEATURES>) {
+ chomp;
+ my ($feature, $featurename) = split /\t/;
+ my $loadcommand1 = $loadcommand . ";+$feature";
+ my $goodFeature=0;
+ foreach my $pattern (@features) {
+ if ($feature =~ m/$pattern/) {
+ $goodFeature=1;
+ last;
+ }
+ }
+ if (!$goodFeature) {
+ next;
+ }
+
+ foreach my $excl (@excluded) {
+ if ($loadcommand1 =~ m/$excl/) {
+ $goodFeature=0;
+ if ($DEBUG) {
+ print STDERR
+ " Feature $featurename is excluded by pattern $excl\n";
+ }
+ last;
+ }
+
+ }
+ if ($goodFeature) {
+ print "$plainname; $featurename\t$loadcommand1\n";
+ }
+ }
+
+ close FEATURES;
+
+}
+close FONTS;
+
diff --git a/graphics/bookshelf/scripts/bookshelf-mkfontsel b/graphics/bookshelf/scripts/bookshelf-mkfontsel
new file mode 100755
index 0000000000..fc5c813f4d
--- /dev/null
+++ b/graphics/bookshelf/scripts/bookshelf-mkfontsel
@@ -0,0 +1,92 @@
+#!/usr/bin/env perl
+#
+#
+=pod
+
+=head1 NAME
+
+bookshelf-mkfontsel - a script to populate C<fontsel> directory and create C<pickfont.tex> file for I<bookshelf> package
+
+=head1 SYNOPSIS
+
+bookshelf-mkfontsel FONTFILE
+
+=head1 DESCRIPTION
+
+Create and populate fontsel directory from the file
+produced by L<listallfonts.pl(1)> script, and create
+C<pickfont.tex> file. Used by
+I<bookshelf> package.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-v>
+
+Print version information
+
+=item B<-h>
+
+Print usage information
+
+=item B<-m>
+
+Print manual page
+
+=back
+
+=head1 AUTHOR
+
+Boris Veytsman, 2024
+
+=head1 LICENSE
+
+LPPL 1.3c
+
+=cut
+
+
+use strict;
+use Getopt::Long;
+use Pod::Usage;
+use open qw( :std :encoding(UTF-8) );
+my $VERSION = "1.0";
+
+my $help=0;
+my $man=0;
+my $vrs=0;
+
+GetOptions(
+ "help|?" => \$help,
+ "man" => \$man,
+ "version" => \$vrs
+ ) or pod2usage(2);
+
+pod2usage(1) if $help;
+pod2usage(-exitval => 0, -verbose=>2) if $man;
+die ("$0, version $VERSION, License: LPPL 1.3c\n") if $vrs;
+
+
+
+
+`mkdir -p fontsel`;
+my $i=1;
+while(<>) {
+ chomp;
+ if (/^.*#/) {
+ next;
+ }
+ my ($name, $command) = split /\t/;
+ open(RES, ">fontsel/$i.tex");
+ print RES "\\font\\SILmfont={$command}\\SILmfont\n";
+ print RES "\\def\\SILmfontname{$name}%\n";
+ close RES;
+ $i++;
+}
+$i--;
+open(RES, ">pickfont.tex");
+print RES "\\setcounter{SIL\@maxfont}{$i}\n";
+close RES;
+
+
diff --git a/graphics/bookshelf/svgnam.sh b/graphics/bookshelf/svgnam.sh
new file mode 100755
index 0000000000..f586606c09
--- /dev/null
+++ b/graphics/bookshelf/svgnam.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+
+###########################################################
+#
+# Make a list of the colour selection from the SVG palette
+# of the xcolor LaTeX package, with calculation of the
+# brightness/darkness value according to
+# https://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx
+#
+# Usage: ./svgnam.sh > svgnam.tex
+#
+# Original author: Peter Flynn
+#
+
+cat <<EOF
+%
+% This is svgnam.tex file generated from svgnam.def by the script
+% ./svgnam.sh > svgnam.tex
+%
+EOF
+
+PALETTE=`kpsewhich svgnam.def`
+cat $PALETTE |\
+ grep '^[A-Z][A-Za-z]*,[\.0-9][0-9]*,[\.0-9][0-9]*,[\.0-9][0-9]*' |\
+ awk -F\; '{print $1}' |\
+ awk -F, '{r=$2;g=$3;b=$4} \
+ {brightness=sqrt((0.241*r*r)+(0.691*g*g)+(0.068*b*b))} \
+ {print $1,r,g,b,brightness}' >svgnam.csv
+ cat svgnam.csv |\
+ awk 'BEGIN {print "\\newcommand{\\SIL@svgcolname}[1]{\\ifcase#1 "} \
+ {print $1 "\\or"} END {print "Black\\fi}\n"}'
+ cat svgnam.csv |\
+ awk 'BEGIN {print "\\newcommand{\\SIL@svgcolval}[1]{\\ifcase#1 "} \
+ {print $5 "\\or"} END {print "0\\fi}\n"}'
+ cat svgnam.csv | wc -l |\
+ awk '{print "\\setcounter{SIL@maxcolno}{" $1 "}"}'
diff --git a/graphics/callouts-box/LICENCE b/graphics/callouts-box/LICENCE
new file mode 100644
index 0000000000..842cf85e3c
--- /dev/null
+++ b/graphics/callouts-box/LICENCE
@@ -0,0 +1,415 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2008 M. Y. Name
+ %
+ % This work may be distributed and/or modified under the
+ % conditions of the LaTeX Project Public License, either version 1.3
+ % of this license or (at your option) any later version.
+ % The latest version of this license is in
+ % https://www.latex-project.org/lppl.txt
+ % and version 1.3c or later is part of all distributions of LaTeX
+ % version 2008 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
diff --git a/graphics/callouts-box/README.md b/graphics/callouts-box/README.md
new file mode 100644
index 0000000000..7ac6d873fe
--- /dev/null
+++ b/graphics/callouts-box/README.md
@@ -0,0 +1,169 @@
+# The `callouts-box` Package
+
+## Version 1.0
+**Date:** 2025/02/14
+**Author:** julinux60
+
+## Table of Contents
+1. [Introduction](#introduction)
+2. [Installation](#installation)
+3. [Usage](#usage)
+ - [Basic Examples](#basic-examples)
+ - [Advanced Examples](#advanced-examples)
+ - [Customization](#customization)
+4. [Defining Custom Boxes](#defining-custom-boxes)
+5. [Complete Example](#complete-example)
+6. [License](#license)
+
+---
+
+## Introduction
+The `callouts-box` package provides a collection of visually appealing, structured callout boxes for LaTeX documents. These boxes are useful for highlighting important information such as warnings, errors, notes, and success messages. The package is built on top of `tcolorbox` for highly customizable, breakable callout boxes and `xcolor` for predefined color schemes.
+
+## Installation
+To install the `callouts-box` package, place the following files in your LaTeX directory:
+
+- `callouts-box.sty` (Core functionality and environment definitions)
+- `callouts-box-colors.sty` (Predefined color definitions for callouts)
+
+Then, include the package in your document preamble:
+
+```latex
+\usepackage{callouts-box}
+```
+
+## Usage
+The package provides four predefined callout box environments:
+
+- `warningbox`
+- `errorbox`
+- `notebox`
+- `successbox`
+
+Each environment takes an optional argument for the box title. If no title is provided, a default title is used.
+
+### Basic Examples
+Here are some examples of how to use the predefined callout boxes:
+
+```latex
+\begin{warningbox}[Custom Warning Title]
+ This is a warning message.
+\end{warningbox}
+
+\begin{errorbox}
+ This is an error message.
+\end{errorbox}
+
+\begin{notebox}[Important Note]
+ This is a note.
+\end{notebox}
+
+\begin{successbox}
+ This is a success message.
+\end{successbox}
+```
+
+### Advanced Examples
+You can nest callout boxes inside each other:
+
+```latex
+\begin{warningbox}[Outer Warning]
+ This is an outer warning message.
+
+ \begin{notebox}[Nested Note]
+ This is a nested note inside a warning.
+ \end{notebox}
+\end{warningbox}
+```
+
+You can add equations, lists, or images inside callout boxes:
+
+```latex
+\begin{successbox}[Success with Equation]
+ The famous Pythagorean theorem:
+ \[
+ a^2 + b^2 = c^2
+ \]
+\end{successbox}
+```
+
+```latex
+\begin{notebox}[Note with List]
+ Key points to remember:
+ \begin{itemize}
+ \item Callout boxes can contain lists.
+ \item They can also include images.
+ \end{itemize}
+\end{notebox}
+```
+
+### Customization
+Users can modify the visual appearance of callout boxes by editing `callouts-box-colors.sty` or overriding the `tcbset` settings in their document.
+
+To adjust layout settings, use the `tcbset` command:
+
+```latex
+\tcbset{
+ boxsettings/.style={
+ boxrule=2pt, rounded corners=10pt, arc=10pt,
+ left=10pt, right=10pt, top=10pt, bottom=10pt,
+ boxsep=10pt, before skip=15pt, after skip=15pt,
+ breakable, before upper={\ignorespaces},
+ }
+}
+```
+
+## Defining Custom Boxes
+You can define your own callout box styles using `NewTColorBox`. Example:
+
+```latex
+\definecolor{custom-border}{HTML}{FFA500}
+\definecolor{custom-content}{HTML}{FFF3E0}
+\definecolor{custom-text}{HTML}{FF6D00}
+
+\NewTColorBox{custombox}{ O{Custom Box} o }{
+ colframe=custom-border,
+ colback=custom-content,
+ coltitle=custom-text,
+ fonttitle=\bfseries,
+ coltext=custom-text,
+ title={#1},
+}
+```
+
+To use the custom box:
+
+```latex
+\begin{custombox}[My Custom Box]
+ This is a custom box.
+\end{custombox}
+```
+
+## Complete Example
+Here is a complete document using the `callouts-box` package:
+
+```latex
+\documentclass{article}
+\usepackage{callouts-box}
+
+\begin{document}
+
+\begin{warningbox}[Warning]
+ This is a warning message.
+\end{warningbox}
+
+\begin{successbox}[Success]
+ This is a success message.
+\end{successbox}
+
+\begin{notebox}[Math Example]
+ \[
+ E = mc^2
+ \]
+\end{notebox}
+
+\end{document}
+```
+
+## License
+This package is distributed under the LaTeX Project Public License (LPPL), version 1.3 or later. For more details, see the `LICENSE` file.
diff --git a/graphics/callouts-box/callouts-box.dtx b/graphics/callouts-box/callouts-box.dtx
new file mode 100644
index 0000000000..39228d09bf
--- /dev/null
+++ b/graphics/callouts-box/callouts-box.dtx
@@ -0,0 +1,249 @@
+% \iffalse
+% callouts-box.dtx
+% --------------------------------------
+% Documented LaTeX source for the callouts-box package
+% --------------------------------------
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{makeidx}
+\makeindex
+\begin{document}
+
+\title{The \texttt{callouts-box} Package\\
+\smallskip
+\small Version 1.0\\
+\small Date: 2025/02/14}
+\author{julinux60}
+\date{14/02/2025}
+
+\maketitle
+\tableofcontents
+
+\section{Introduction}
+The \texttt{callouts-box} package provides a collection of visually appealing, structured callout boxes for \LaTeX{} documents. These boxes are useful for highlighting important information such as warnings, errors, notes, and success messages. The package is built on top of \texttt{tcolorbox} for highly customizable, breakable callout boxes and \texttt{xcolor} for predefined color schemes.
+
+\section{Installation}
+To install the \texttt{callouts-box} package, place the following files in your \LaTeX{} directory:
+\begin{itemize}
+ \item \texttt{callouts-box.sty} (Core functionality and environment definitions)
+ \item \texttt{callouts-box-colors.sty} (Predefined color definitions for callouts)
+\end{itemize}
+Then, include the package in your document preamble:
+\begin{verbatim}
+\usepackage{callouts-box}
+\end{verbatim}
+
+\section{Usage}
+The package provides four predefined callout box environments:
+\DescribeEnv{warningbox}
+\DescribeEnv{errorbox}
+\DescribeEnv{notebox}
+\DescribeEnv{successbox}
+Each environment takes an optional argument for the box title. If no title is provided, a default title is used.
+
+\subsection{Basic Examples}
+Here are some examples of how to use the predefined callout boxes:
+
+\begin{verbatim}
+\begin{warningbox}[Custom Warning Title]
+ This is a warning message.
+\end{warningbox}
+
+\begin{errorbox}
+ This is an error message.
+\end{errorbox}
+
+\begin{notebox}[Important Note]
+ This is a note.
+\end{notebox}
+
+\begin{successbox}
+ This is a success message.
+\end{successbox}
+\end{verbatim}
+
+\subsection{Advanced Examples}
+You can nest callout boxes inside each other:
+\begin{verbatim}
+\begin{warningbox}[Outer Warning]
+ This is an outer warning message.
+
+ \begin{notebox}[Nested Note]
+ This is a nested note inside a warning.
+ \end{notebox}
+\end{warningbox}
+\end{verbatim}
+You can add equations, lists, or images inside callout boxes:
+\begin{verbatim}
+\begin{successbox}[Success with Equation]
+ The famous Pythagorean theorem:
+ \[
+ a^2 + b^2 = c^2
+ \]
+\end{successbox}
+\end{verbatim}
+
+\begin{verbatim}
+\begin{notebox}[Note with List]
+ Key points to remember:
+ \begin{itemize}
+ \item Callout boxes can contain lists.
+ \item They can also include images.
+ \end{itemize}
+\end{notebox}
+\end{verbatim}
+
+\subsection{Customization}
+Users can modify the visual appearance of callout boxes by editing \texttt{callouts-box-colors.sty} or overriding the \texttt{tcbset} settings in their document.
+
+\DescribeMacro{\tcbset}
+To adjust layout settings, use the \texttt{tcbset} command:
+\begin{verbatim}
+\tcbset{
+ boxsettings/.style={
+ boxrule=2pt, rounded corners=10pt, arc=10pt,
+ left=10pt, right=10pt, top=10pt, bottom=10pt,
+ boxsep=10pt, before skip=15pt, after skip=15pt,
+ breakable, before upper={\ignorespaces},
+ }
+}
+\end{verbatim}
+
+\section{Defining Custom Boxes}
+You can define your own callout box styles using \texttt{NewTColorBox}. Example:
+\begin{verbatim}
+\definecolor{custom-border}{HTML}{FFA500}
+\definecolor{custom-content}{HTML}{FFF3E0}
+\definecolor{custom-text}{HTML}{FF6D00}
+
+\NewTColorBox{custombox}{ O{Custom Box} o }{
+ colframe=custom-border,
+ colback=custom-content,
+ coltitle=custom-text,
+ fonttitle=\bfseries,
+ coltext=custom-text,
+ title={#1},
+}
+\end{verbatim}
+
+To use the custom box:
+\begin{verbatim}
+\begin{custombox}[My Custom Box]
+ This is a custom box.
+\end{custombox}
+\end{verbatim}
+
+\section{Complete Example}
+Here is a complete document using the \texttt{callouts-box} package:
+
+\begin{verbatim}
+\documentclass{article}
+\usepackage{callouts-box}
+
+\begin{document}
+
+\begin{warningbox}[Warning]
+ This is a warning message.
+\end{warningbox}
+
+\begin{successbox}[Success]
+ This is a success message.
+\end{successbox}
+
+\begin{notebox}[Math Example]
+ \[
+ E = mc^2
+ \]
+\end{notebox}
+
+\end{document}
+\end{verbatim}
+
+\section{License}
+This package is distributed under the \LaTeX{} Project Public License (LPPL), version 1.3 or later. For more details, see the \texttt{LICENSE} file.
+
+\PrintIndex
+
+\end{document}
+%</driver>
+% \fi
+
+% --------------------------------------
+% Package Code
+% --------------------------------------
+% \iffalse
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{callouts-box}[2025/02/14 v1.0 Styled callout boxes]
+
+\RequirePackage{xcolor}
+\RequirePackage{tcolorbox}
+\tcbuselibrary{breakable}
+\RequirePackage{callouts-box-colors}
+
+\tcbset{
+ boxsettings/.style={
+ boxrule=1pt, rounded corners=all, arc=5pt,
+ left=5pt, right=5pt, top=5pt, bottom=5pt,
+ boxsep=5pt, before skip=10pt, after skip=10pt,
+ breakable, before upper={\ignorespaces},
+ }
+}
+
+% Define callout box environments
+\NewTColorBox{warningbox}{ O{Warning} }{
+ colframe=warning-border, colback=warning-content,
+ coltitle=warning-text, fonttitle=\bfseries,
+ coltext=warning-text, title={#1}, boxsettings,
+}
+
+\NewTColorBox{errorbox}{ O{Error} }{
+ colframe=error-border, colback=error-content,
+ coltitle=error-text, fonttitle=\bfseries,
+ coltext=error-text, title={#1}, boxsettings,
+}
+
+\NewTColorBox{notebox}{ O{Note} }{
+ colframe=note-border, colback=note-content,
+ coltitle=note-text, fonttitle=\bfseries,
+ coltext=note-text, title={#1}, boxsettings,
+}
+
+\NewTColorBox{successbox}{ O{Success} }{
+ colframe=success-border, colback=success-content,
+ coltitle=success-text, fonttitle=\bfseries,
+ coltext=success-text, title={#1}, boxsettings,
+}
+%</package>
+% \fi
+
+% --------------------------------------
+% Colors Package Code
+% --------------------------------------
+% \iffalse
+%<*colors>
+\ProvidesPackage{callouts-box-colors}[2025/02/14 v1.0 Predefined colors for callouts-box]
+\RequirePackage{xcolor}
+
+% Define colors for callout boxes
+\definecolor{warning-title}{HTML}{FAE2A0}
+\definecolor{warning-content}{HTML}{FFFCF4}
+\definecolor{warning-text}{HTML}{5C4813}
+\definecolor{warning-border}{HTML}{FAE2A0}
+
+\definecolor{error-title}{HTML}{FAA0A0}
+\definecolor{error-content}{HTML}{FFF4F4}
+\definecolor{error-text}{HTML}{5C1313}
+\definecolor{error-border}{HTML}{FAA0A0}
+
+\definecolor{note-title}{HTML}{A3A0FA}
+\definecolor{note-content}{HTML}{F4F6FF}
+\definecolor{note-text}{HTML}{1E135C}
+\definecolor{note-border}{HTML}{A3A0FA}
+
+\definecolor{success-title}{HTML}{91DF96}
+\definecolor{success-content}{HTML}{F7FFF4}
+\definecolor{success-text}{HTML}{104F20}
+\definecolor{success-border}{HTML}{91DF96}
+%</colors>
+% \fi \ No newline at end of file
diff --git a/graphics/callouts-box/callouts-box.ins b/graphics/callouts-box/callouts-box.ins
new file mode 100644
index 0000000000..82b7235afa
--- /dev/null
+++ b/graphics/callouts-box/callouts-box.ins
@@ -0,0 +1,25 @@
+% callouts-box.ins
+% --------------------------------------
+% Installation file for the callouts-box package
+% --------------------------------------
+\input docstrip.tex
+\keepsilent
+\usedir{tex/latex/callouts-box}
+\preamble
+This is a generated file.
+
+Copyright (C) 2025 by julinux60
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3 of this license or (at your option) any later
+version. The latest version of this license is in:
+
+ http://www.latex-project.org/lppl.txt
+
+and version 1.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+\endpreamble
+\generate{\file{callouts-box.sty}{\from{callouts-box.dtx}{package}}}
+\generate{\file{callouts-box-colors.sty}{\from{callouts-box.dtx}{colors}}}
+\endbatchfile \ No newline at end of file
diff --git a/graphics/callouts-box/callouts-box.pdf b/graphics/callouts-box/callouts-box.pdf
new file mode 100644
index 0000000000..8bd1d1ec07
--- /dev/null
+++ b/graphics/callouts-box/callouts-box.pdf
Binary files differ
diff --git a/graphics/circuit_macros/CHANGES b/graphics/circuit_macros/CHANGES
index efb7f7a0e7..5be074405c 100644
--- a/graphics/circuit_macros/CHANGES
+++ b/graphics/circuit_macros/CHANGES
@@ -1,5 +1,8 @@
CHANGES
+Version 10.7: Minor changes and additions to ics.m4 and macros polygon,
+ jack, LH_symbol, LT_symbol, opamp, amp, sarrow, dashline. Extra
+ examples.
Version 10.6: New macro geiger. Corrected dpv .txt files.
Tweaked macros ColoredV, ShadeObject, ebox, shadowed, shadedball, addtaps.
Options for macros delay, resistor, source, relaycoil. List of macros
@@ -83,9 +86,8 @@ Version 8.2: Tweaks to round, bi_tr, bi_trans, Darlington, along_. New
Version 8.1: Additions to dpictools.pic. New macros parallel_, rgbstring,
series_, stackdo_, Vsprod, sbs, scs, sus. Options for diode. Thyristor
options and minor changes of functionality. Bugfix in winding macro.
-Version 8.0: New options for capacitor, cbreaker, diode, inductor,
-lswitch, Mux,
- resistor, rotbox, transformer. New macros addtaps, binary_, Demux,
+Version 8.0: New options for capacitor, cbreaker, diode, inductor, lswitch,
+ Mux, resistor, rotbox, transformer. New macros addtaps, binary_, Demux,
Header, HeaderPin, hex_digit, hexadecimal_, Pr_xy, Pr_xz, Pr_yz, SQUID,
KelvinR, FTcap, tconn, and tapped. Tweaked setrgb for svg output.
Generalized setview in lib3D.
@@ -94,8 +96,7 @@ Version 7.9: Added accessibility features to the documentation.
simplified expressions. New macros savem4dir, restorem4dir. Options for
vperp and Vperp. Bug fix in source macro. Tweaked stacksplit_. Removed
a name clash between libcct and liblog.
-Version 7.8: Logic gate options for arbitrary negated inputs; lg_pin
-options.
+Version 7.8: Logic gate options for arbitrary negated inputs; lg_pin options.
New macro FlipFlopX for simplicity and generality; new macros
Cintersect, LCintersect, LCtangent, stacksplit_; modified Loopover_.
Version 7.7: SVG macro tweaks. Tweaked BOX_gate and bugfix in IOdefs in
@@ -112,8 +113,7 @@ Version 7.5: Usage has been simplified by making the initialization macros
in composite macros. Bugfix in calls to BUFFER_gen. Tweaked Point_
for simpler output for common arguments. Reordered the arguments of
round for consistency.
-Version 7.4: New macro lthick. Simplified shadebox. The ifroff macro
-renamed
+Version 7.4: New macro lthick. Simplified shadebox. The ifroff macro renamed
to iftpic. New configuration file m4defaults.m4. Reworked darrow
library for consistency with solid lines and arrows; new macro darc and
wrappers Darc, Darrow, Dline; old version included in olddarrow.m4 to
@@ -150,8 +150,7 @@ Version 6.4: New macros Equidist3, f_box, rs_box, Darlington, View3D.
Options for diode, inductor, transformer, consource. Moved arrowhead
initialization in pstricks.m4 and libcct.m4 for for more flexibility
with diagrams embedded in latex files.
-Version 6.3: New options for mosfet, diode, earphone. Better color
-support.
+Version 6.3: New options for mosfet, diode, earphone. Better color support.
Fixed system-dependent OR_gate problems. New macro cintersect.
Version 6.2: Replaced scr with a variant of thyristor. Bug fix in
bi_trans. Options for source.
@@ -160,15 +159,13 @@ Version 6.1: New macros ttmotor, thyristor. Options for source, bi_trans,
Version 6.0: TikZ PGF compatibility. Added transformer labels, optional
FlipFlop labels. New macros dswitch, winding. Tweaked nport, source,
bi_trans, AND_gen, OR_gen, sinusoid, resistor.
-Version 5.9: Simplified internal flags for pic processor and
-postprocessor.
+Version 5.9: Simplified internal flags for pic processor and postprocessor.
New antenna, cbreaker, dturn, and lbox macros. Several changes to
allow sprintf string arguments. New options for buzzer, capacitor,
dimension_, ebox, fuse, mosfet, source, and switch. Fix of drjust.
Better compatibility with pic macros. Numerous changes to
documentation.
-Version 5.8: Simplified installation. Revised and augmented logic-gate
-library.
+Version 5.8: Simplified installation. Revised and augmented logic-gate library.
Cleaner libgen macro output. Improved b_current, bi_trans, ground,
dtee. Dline and darrow corrected for gpic. New macros dashline,
m4xtract.
@@ -181,8 +178,7 @@ Version 5.6: Better MetaPost, PDFLaTeX, and xfig support. PDF examples.
microphone, buzzer. Negated logic gate inputs and IEEE box logic gates.
Version 5.5: New macros potentiometer, variable, igbt, tline. Optional
negated logic gate inputs. Options for diode, source.
-Version 5.4: New Mux, for_, arca. Reworked gate macros FlipFlop,
-AND_gate,
+Version 5.4: New Mux, for_, arca. Reworked gate macros FlipFlop, AND_gate,
OR_gate, NOT_gate. Improved lg_pintxt, boxdim, s_box, s_ht, s_wd,
s_dp, nport, resistor, opamp. Completely reworked bi_tr, mosfet;
deleted smosfet. Minor additions and changes to the manual.
@@ -198,13 +194,11 @@ Version 5.1: Signal-flow graph (directed graph) macros. More consistent
Modified ground, dimension_, par_, label macros, b_current, diode,
transformer. New macros gpar_, ujt, scr, contact, relay. Document
fixes and additions. Changes to examples for portability.
-Version 5.0: Macros fuse, lpop, sinc; dpic-only sinusoid and fitcurve
-macros.
+Version 5.0: Macros fuse, lpop, sinc; dpic-only sinusoid and fitcurve macros.
More robust mosfet, smosfet, b_current, bi_tr, j_fet, intersect_.
Editorial changes to the manual. Examples in Xfig version 3.2 format.
Web-based examples and updated links.
-Version 4.9: More robust NOT_gate. Function pmod(), macro shade().
-Tweaks
+Version 4.9: More robust NOT_gate. Function pmod(), macro shade(). Tweaks
to diode, dend, crossover. Newer manual and web references. Binary tree
and flowchart macros.
Version 4.8: More robust ebox, source, shadebox, gap. Modified d_fet and
@@ -212,8 +206,7 @@ Version 4.8: More robust ebox, source, shadebox, gap. Modified d_fet and
Bug fixes in Fector, transformer, BUFFER_gate and in sum_, abs_, neg_,
sign_ (!).
Version 4.7: Fixed the excess-space bug in boxdims.sty. Added Macros
-s_box,
- s_init, scale changes to make the package more metric-friendly.
+ s_box, s_init, scale changes to make the package more metric-friendly.
Reworked amp, integrator, opamp, diode, battery and a few other macros
for robustness and clarity. Minor document changes.
Version 4.6: Percent-signs at the end of pstricks-generated lines.
@@ -221,8 +214,7 @@ Version 4.6: Percent-signs at the end of pstricks-generated lines.
Version 4.5: Options for several 2-terminal macros. Minor bug fixes and
better robustness. Documents edited for friendlier PC installation
and use.
-Version 4.3: Macros pt__ and boxdim. Additions to the manual.
-More robust
+Version 4.3: Macros pt__ and boxdim. Additions to the manual. More robust
dimension_, tuned FlipFlop for xfig. PC installation information.
Version 4.2: Friendlier manual. New Xfig prototype file to allow correct
scaling. Cleaned up b_current, added line_leng. Changes and additions
diff --git a/graphics/circuit_macros/Copying b/graphics/circuit_macros/Copying
index 7ec3b487d5..5e1ccde657 100644
--- a/graphics/circuit_macros/Copying
+++ b/graphics/circuit_macros/Copying
@@ -1,4 +1,4 @@
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/README b/graphics/circuit_macros/README
index 708d190f89..296fd6858e 100644
--- a/graphics/circuit_macros/README
+++ b/graphics/circuit_macros/README
@@ -1,5 +1,5 @@
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
@@ -118,7 +118,8 @@ USAGE
near-immediate viewing of the results, three windows can be kept open:
one in which to edit the source, one to process the source and produce
postscript or pdf, and a viewer such as gv or GSview 5.0. A window
- displaying the manual is also useful for composing a significant diagram.
+ displaying the manual is also useful when you are composing a significant
+ diagram.
INSTALLATION AND TESTING: See the INSTALL file.
@@ -239,6 +240,10 @@ INTEGRATION WITH OTHER TOOLS:
A set of examples and hints intended for his colleagues has been
produced by Alan Robert Clark at http://ytdp.ee.wits.ac.za/cct.html
+ Examples and hints for logic circuits are at:
+ https://aprikose.sumomo.ne.jp/madchemiker/
+ Invoke this site using Google translate if you do not read Japanese.
+
A video "Drawing Circuit Diagrams with Circuits Macros" by James Green
showing how to use Circuit_macros with his setup is at
https://www.youtube.com/watch?time_continue=53&v=pFRIBvUJHS4
diff --git a/graphics/circuit_macros/darrow.m4 b/graphics/circuit_macros/darrow.m4
index da57311215..47553b5992 100644
--- a/graphics/circuit_macros/darrow.m4
+++ b/graphics/circuit_macros/darrow.m4
@@ -1,7 +1,7 @@
divert(-1)
darrow.m4 Macros for double lines and arrows
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/doc/Circuit_macros.pdf b/graphics/circuit_macros/doc/Circuit_macros.pdf
index f20e440b8c..5e12cb00fb 100644
--- a/graphics/circuit_macros/doc/Circuit_macros.pdf
+++ b/graphics/circuit_macros/doc/Circuit_macros.pdf
Binary files differ
diff --git a/graphics/circuit_macros/doc/JackMan.m4 b/graphics/circuit_macros/doc/JackMan.m4
index b9a005d279..c55a4f4072 100644
--- a/graphics/circuit_macros/doc/JackMan.m4
+++ b/graphics/circuit_macros/doc/JackMan.m4
@@ -1,30 +1,24 @@
.PS
-# `Jack.m4'
+# `JackMan.m4'
cct_init
+# https://tex.stackexchange.com/questions/720858/is-there-a-tikz-or-circuitikz-headphone-jack-connector-diagram
P: [
P1: plug
- "\sl A" wid 0.1 at P1.A rjust
- "\sl B" at P1.B rjust
+ foreach_(`Y',`"\sl Y" wid 0.1 at P1.Y rjust',A,B)
"\sl TB" at P1.TB ljust above
"\sl TA" at P1.TA ljust below
+
P2: plug(,R) with .B at P1.A+(0.85,0)
- "\sl A" wid 0.1 at P2.A rjust
- "\sl B" at P2.B rjust
-# P3: plug(L) with .A at P2.A+(1,0)
-# "\sl A" wid 0.1 at P3.A ljust
-# "\sl B" at P3.B ljust
+ foreach_(`Y',`"\sl Y" wid 0.1 at P2.Y rjust',A,B)
+
P4: plug(,3) with .A at P2.B+(0.85,0)
- "\sl A" at P4.A rjust
- "\sl B" at P4.B rjust
- "\sl C" at P4.C rjust
+ foreach_(`Y',`"\sl Y" at P4.Y rjust',A,B,C)
+
P5: plug(L,3R) with .A at P4.A+(1,0)
- "\sl A" wid 0.1 at P5.A ljust
- "\sl B" at P5.B ljust
- "\sl C" at P5.C ljust
+ foreach_(`Y',`"\sl Y" wid 0.1 at P5.Y ljust',A,B,C)
`"\tt plug"' below at P1.s+(0,-0.1)
`"\tt plug(,R)"' below at P2.s+(0,-0.1)
-# `"\tt plug(L)"' below at P3.s+(0,-0.1)
`"\tt plug(,3)"' below at P4.s+(-0.1,-0.1)
`"\tt plug(L,3R)"' below at P5.s+(0.1,-0.1)
]
@@ -34,45 +28,33 @@ L: [ right_
thinlines_
"\sl L" wid 0.1 rjust at J1.L
arrow <- right 0.1 from J1.F; "\sl F" ljust
- arrow <- down 0.1 from J1.G then left 0.1 ; "\sl G" rjust
+ arrow <- down 0.1 left 0.1 from J1.G ; "\sl G" rjust
+ arrow <- up 0.1 left 0.1 from J1.H ; "\sl H" rjust
thicklines_
- J2:[K2: jack(,LMBS) #with .F at J1.F+(1.2,0)
- thinlines_
- "\sl L" rjust at K2.L
- arrow <- from K2.LM left 0.25; "\sl LM" wid 0.18 rjust
- arrow <- from K2.LB left 0.25; "\sl LB" rjust
- "\sl S" rjust at K2.S
- thicklines_ ] with .K2.F at J1.F+(1.2,0)
- J3: jack(L,RLS) with .F at J2.K2.F+(0.4,0)
- thinlines_
+
+ J3: jack(L,RLS) with .F at J1.F+(0.4,0)
"\sl L" ljust at J3.L
"\sl S" ljust at J3.S
- thicklines_
- J4: jack(L,RLBLMLMS) with .F at J3.F+(1.1,0)
- thinlines_
- "\sl L1" ljust at J4.L1
- arrow <- right 0.3 from J4.LM1; "\sl LM1" ljust
- "\sl L2" ljust at J4.L2
- arrow <- right 0.3 from J4.LM2; "\sl LM2" wid 0.2 ht 11pt__ ljust
- "\sl S" ljust at J4.S
- "\sl L" ljust at J4.L
- arrow <- right 0.2 from J4.LB ; "\sl LB" ljust
- right_
- J5: jack(,RSBSMLB) with .F at J4.F+(1.95,0)
+
+ J2: jack(,LMBS) with .F at J3.F+(1.5,0)
thinlines_
- "\sl L" rjust at J5.L
- "\sl S" rjust at J5.S
- "\sl S1" rjust at J5.S1
- arrow <- left 0.3 from J5.SM1; "\sl SM1" rjust
- spline 0.5 <- left 0.25 then left 0.1 down 0.05 from J5.LB; "\sl LB" rjust
- spline 0.5 <- left 0.25 then left 0.1 up 0.05 from J5.SB; "\sl SB" rjust
+ "\sl L" rjust at J2.L
+ arrow <- from J2.LM left 0.25; "\sl LM" wid 0.18 rjust
+ arrow <- from J2.LB left 0.25; "\sl LB" rjust
+ "\sl S" rjust at J2.S
thicklines_
+ J11: jack(,LMBSX) with .w at last [].e+(0.5,0)
+ foreach_(`Y',`"\small\sl Y" rjust at J11.Y.w', L,LM,LB,S,G)
+
+ J8: jack(,XLLBSSBC) with .sw at last [].se+(0.75,0)
+ foreach_(`Y',`"\small\sl Y" rjust at J8.Y.w', L,L1,LB1,S,S1,SB1,G,C)
+
`"\tt jack"' ht 0.15 below at J1.s+(0,-0.15)
- `"\tt jack(,LMBS)"' below at (J2,last "")
+ `"\tt ..(,LMBS)"' below at (J2,last "")
`"\tt ..(L,RLS)"' below at (J3,last "")
- `"\tt ..(L,RLBLMLMS)"' below at (J4,last "")
- `"\tt ..(,RSBSMLB)"' below at (J5,last "")
-] with .nw at P.sw #+ (0,0.1)
+ `"\tt ..(,LMBSX)"' below at (J11,last "")
+ `"\tt ..(,XLLBSSBC)"' below at (J8, last "")
+] with .nw at last [].sw + (0,0.1)
.PE
diff --git a/graphics/circuit_macros/doc/Version.tex b/graphics/circuit_macros/doc/Version.tex
index 0c66604489..5b31954edc 100644
--- a/graphics/circuit_macros/doc/Version.tex
+++ b/graphics/circuit_macros/doc/Version.tex
@@ -1 +1 @@
-Version 10.6
+Version 10.7
diff --git a/graphics/circuit_macros/doc/arrowex.m4 b/graphics/circuit_macros/doc/arrowex.m4
index 2ffd512107..1284c1e18a 100644
--- a/graphics/circuit_macros/doc/arrowex.m4
+++ b/graphics/circuit_macros/doc/arrowex.m4
@@ -1,9 +1,10 @@
.PS
# arrowex.m4
+# https://tex.stackexchange.com/questions/727004/how-do-i-create-hook-arrows-in-tikz-diagram-instead-of-plain-arrows
gen_init
movewid = 1
- moveht = 13bp__
+ moveht = 12bp__
ifdpic(
`{{ arrow -> 0 }; move; "\tt arrow -> 0" ljust }
@@ -21,9 +22,18 @@ gen_init
{{ sarrow(,type=Plain)}; move;
{"`\tt arrowwid=8bp\_\_; arrowht=10bp\_\_; sarrow(,type=Plain)'" ljust }}
move down_; right_
+ {{ sarrow(,type=PP;hook=R;)}; move;
+ {"`\tt sarrow(,type=PP;hook=R;)'" ljust }}
+ move down_; right_
{{ sarrow(,type=Open)}; move;
{"`\tt sarrow(,type=Open)'" ljust }}
move down_; right_
+ {{ sarrow(,type=DI;head=colored "blue")}; move;
+ {"`\tt sarrow(,type=DI;head=colored \"blue\")'" ljust }}
+ move down_; right_
+ {{ sarrow(,type=Open;head=fill_(0))}; move;
+ {"`\tt sarrow(,type=Open;head=fill\_(0))'" ljust }}
+ move down_; right_
{{ sarrow(,type=Crow;shaft=dashed)}; move
{"`\tt sarrow(,type=Crow;shaft=dashed)'" ljust }}
move down_; right_
diff --git a/graphics/circuit_macros/doc/body.tex b/graphics/circuit_macros/doc/body.tex
index 79827bb2e4..ce699c42ce 100644
--- a/graphics/circuit_macros/doc/body.tex
+++ b/graphics/circuit_macros/doc/body.tex
@@ -82,7 +82,7 @@ This section describes the basic process of adding circuit diagrams to
\latex documents to produce postscript or pdf files. On some operating
systems, project management software with graphical interfaces can
automate the process, but the steps can also be performed by a script,
-makefile, or by hand for simple documents as described in~\SR{Quickstart:}.
+makefile, or for simple documents, by hand as described in~\SR{Quickstart:}.
The diagram source file is processed as illustrated in
\FR{Flowdiag}. A configuration file is read by \Mfour,
@@ -130,11 +130,12 @@ labeled circuits.
% \vspace*{-\baselineskip}%
\caption{The file {\tt quick.m4} and resulting diagram.
There are several ways of drawing the same picture; for example,
- nodes (example: {\tt Origin: Here}) can be defined and circuit branches
- drawn between them; or absolute coordinates can be used (e.g.,
- {\tt source(up\_ from (0,0) to (0,0.75))} ). Element sizes
- can be varied and non-two-terminal elements included (\FR{QTrans})
- as described in later sections.\label{quick}}%
+ nodes can be defined (examples: {\tt Origin:$\;$(0,0)} or {\tt
+ Northwest:$\;$Origin+(0,elen\_)}) and circuit branches drawn between them;
+ or absolute coordinates can be used (e.g., {\tt source(up\_
+ from (0,0) to (0,0.75))} ). Element sizes can be varied and
+ non-two-terminal elements included (\FR{QTrans}) as described in
+ later sections.\label{quick}}%
\end{figure}
\subsubsection{\protect{Using \Mfour}%
@@ -211,7 +212,7 @@ The effect of the second \Mfour command above is shown in \FR{ConfigA}.
{\tt m4 pstricks.m4 quick.m4 > quick.pic}.
\label{ConfigA}}
\end{figure}
-Configuration files {\tt pstricks.m4} or {\tt pgf.m4}
+Configuration files {\tt pstricks.m4} and {\tt pgf.m4}
cause library {\tt libgen.m4}
to be read, thereby defining the macro {\tt cct\_init}.
The diagram source file is then read and
@@ -337,7 +338,7 @@ This method processes the picture source each time \latex is run, so for
large documents containing many diagrams, the \verb|\mtotex|
lines could be commented out after debugging the corresponding graphic.
A derivative of this method that allows the insertion of
-\pic code into a \Tikz picture is described in \SR{Tikzwithpic:}.
+\pic-produced code into a \Tikz picture is described in \SR{Tikzwithpic:}.
\item
It might be convenient for the source of small diagrams to be part
@@ -498,7 +499,7 @@ circular graph nodes, for example. Otherwise
\noindent
truncates the line by {\tt x} at the start and {\tt y} at the end.
-Any of the above means of specifying line (or arrow) direction and length
+Any of the above means of specifying line direction and length
will be called a \linespec.
Lines can be concatenated to create multsegmented objects.
@@ -1740,7 +1741,7 @@ The first argument of both macros establishes the drawing direction.
\begin{figure}[H]
\input JackMan
\vspace{-1ex}
- \caption{The {\tt jack(U|D|L|R|{\sl degrees}, {\sl chars})}
+ \caption{The {\tt jack(U|D|L|R|{\sl degrees}, {\sl chars} [;{\sl keys}])}
and {\tt plug(U|D|L|R|{\sl degrees},[2|3][R])} components
and their defined points.}
\label{Jack}
@@ -3022,65 +3023,62 @@ to equal {\tt ({\sl expression})}; if the substring is not found, {\tt
m4wdth} is given the default value {\tt (dimen\_*2).} The enclosing
parentheses are omitted if the fourth argument of {\tt pushkey\_} is
nonblank as would be required if {\tt m4wdth} were to be non-numeric.
-Argument 1 can contain several such substrings separated by semicolons.
+%Argument 1 can contain several such substrings separated by semicolons.
In addition, the macro
{\tt pushkeys\_({\sl string, keysequence})}
\noindent
-applies {\tt pushkey\_()} multiple times to its {\sl keysequence}
+applies {\tt pushkey\_()} to each of the terms of its {\sl keysequence}
(second) argument.
-Each term of the second argument consists of the rightmost three
-arguments of {\tt pushkey\_} separated by the colons (:) rather than commas.
-
-%For example, suppose that a macro contains the line
-%
-%{\tt pushkeys\_(`\$1', wdth:dimen\_/2; type::N)}
-%
-%\noindent
-%and is invoked as {\tt {\sl macro}(type=Basic;wdth=0.2, $\ldots$)}.
-%The first argument is scanned, resulting in
-%{\tt m4wdth} defined to be
-%{\tt (0.2)} and {\tt m4type} to be {\tt Basic}.
+Each term of the semicolon-separated second argument sequence
+consists of the rightmost three
+arguments of {\tt pushkey\_} separated by colons (:) rather than commas.
+Normal good practice cancels pushed key definitions at macro exit,
+for example,
+{\tt popdef(\LQ{}m4{}{\sl string1}\RQ,\LQ{}m4{}{\sl string2}\RQ, \ldots ).}
The macros {\tt setkey\_()} and {\tt setkeys\_()} are similar to
{\tt pushkey\_()} and {\tt pushkeys\_()} respectively but use the
m4 {\tt define} command rather than {\tt pushdef}.
-For example, the macro
-{\tt sarrow({\sl linespec}, {\sl keys})}
-can generate the custom arrows shown below the three native arrows
-in \FR{arrowex}. The defined keys are
- {\tt type=}; {\tt lgth=}; {\tt wdth=}; {\tt shaft=}; and {\tt head=}.
-Many variations of these arrowheads are possible.
-\begin{figure}[H]
- \input arrowex
- \caption{The three \dpic native arrows and others generated by
- {\tt sarrow({\sl linespec}, {\sl keys})}.}
- \label{arrowex}
- \end{figure}
-
-As another example, consider the elementary example of a custom box macro:
+For example, consider the elementary example of a custom box macro:
\begin{verbatim}
define(`custombox',
-`pushkeys_(`$1',wdth:boxwid:; hgt:boxht:; label::N; text::N)
- ifelse(m4label,,,m4label:) box wid m4wdth ht m4hgt "m4text" ')
+`pushkeys_(`$1',wdth:boxwid:; hgt:boxht:; name::N; text::N)
+ ifelse(m4name,,,m4name:) box wid m4wdth ht m4hgt ifelse(m4text,,,"m4text")
+ popdef(`m4wdth',`m4hgt',`m4name',`m4text')')
\end{verbatim}
-Then {\tt custombox(wdth=2; label=B1; text=Hello)}
-first causes the macros {\tt m4wdth, m4hgt, m4label,} and {\tt m4text}
+Then {\tt custombox(wdth=2; name=B1; text=Hello)}
+first causes the macros {\tt m4wdth, m4hgt, m4name,} and {\tt m4text}
to be created, with values {\tt (2), (boxht), B1,} and {\tt Hello}
respectively, and {\tt custombox} evaluates to
{\tt B1:\ box wid (2) ht (boxht) "Hello"}.
-The key prefix {\tt m4} of the automatically created parameter macros can be
-redefined if necessary since it is given in the distribution by the line
-{\tt define(`key\_prefix',`m4')}.
+%The key prefix {\tt m4} of the automatically created parameter macros can be
+%redefined if necessary since it is given in the distribution by the line
+%{\tt define(`key\_prefix',`m4')}.
+
+As another example, the macro
+{\tt sarrow({\sl linespec}, {\sl keys})}
+can generate the custom arrows shown below the three native arrows
+in \FR{arrowex}. The defined keys are
+ {\tt type=}; {\tt wdth=}; {\tt lgth=};
+ {\tt shaft=}; {\tt head=}; {\tt hook=}; and {\tt name=}.
+Many variations of these arrowheads could be created by adding keys.
+\begin{figure}[H]
+ \input arrowex
+ \caption{The three \dpic native arrows and others generated by
+ {\tt sarrow({\sl linespec}, {\sl keys})}.}
+ \label{arrowex}
+ \end{figure}
+\enlargethispage{\baselineskip}
\xection{Interaction with \latex\label{Interaction:}}
The sizes of typeset labels and other \tex boxes are generally unknown
prior to processing the diagram by \latex.
@@ -3331,7 +3329,7 @@ the rotation of text by \PSTricks postprocessing is illustrated by the file
which contains both horizontal text and text rotated $90^\circ$ along the
vertical line.
This rotation of text is also implemented by the macro
-{\tt rs\_boxs([angle={\sl degrees};] {\sl text}[,{\sl expr, expr $\ldots$}])},
+{\tt rs\_box([angle={\sl degrees};] {\sl text}[,{\sl expr, expr $\ldots$}])},
which is similar
to {\tt s\_box} but rotates its argument by~$90^\circ,$ a default angle
that can be changed by preceding invocation with
@@ -3605,6 +3603,8 @@ to modify them.
Maintaining reasonable compatibility with both \gpic\ and \dpic
and, especially, with different postprocessors, has
resulted in some macros becoming more complicated than is preferable.
+Furthermore, some of the newer macros make use of \dpic\ facilities
+not available with \gpic.
Here are some hints, gleaned from experience and from comments I have
received.
diff --git a/graphics/circuit_macros/doc/defines.tex b/graphics/circuit_macros/doc/defines.tex
index 6cb3a997c7..fbb8fb0d67 100644
--- a/graphics/circuit_macros/doc/defines.tex
+++ b/graphics/circuit_macros/doc/defines.tex
@@ -32,6 +32,8 @@
\newcommand{\LR}[1]{\hyperref[#1]{{#1}}\hskip1em}
\newcommand{\fra}[1]{\hbox{\sl frac#1}}%
+\renewcommand{\Re}{\mathop{\rm Re}\nolimits}
+\renewcommand{\Im}{\mathop{\rm Im}\nolimits}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -40,7 +42,7 @@
\noindent
\LR{A} \LR{B} \LR{C} \LR{D} \LR{E} \LR{F} \LR{G} \LR{H} \LR{I} \LR{J}
\LR{K} \LR{L} \LR{M} \LR{N} \LR{O} \LR{P}
-\LR{R} \LR{S} \LR{T} \LR{U} \LR{V} \LR{W} \LR{X} \LR{Y}
+\LR{R} \LR{S} \LR{T} \LR{U} \LR{V} \LR{W} \LR{X} \LR{Y} \LR{Z}
\\
\Letter{A}%
@@ -666,10 +668,11 @@
\macrodef{darrow\_init}{darrow_init}{}%
{darrow}%
{Initialize darrow drawing parameters (reads library file {\tt darrow.m4})}%
-\macrodef{dashline}{dashline}{(\linespec,{\sl thickness}|{\sl color}|<->,
+\macrodef{dashline}{dashline}{(\linespec,{\sl thickness}|{\sl color}|<->|->|<-,
{\sl dash len, gap len},G)}%
{gen}%
- {dashed line with dash at end ({\tt G} ends with gap)}%
+ {Dashed line with dash at end ({\tt G} ends with gap). Dashes are
+ adjusted to fit with given gap length. Dpic only.}%
\macrodef{dbelow}{dbelow}{(at {\sl location})}%
{darrow}%
{below (displaced dlinewid/2)}%
@@ -1410,11 +1413,14 @@ n|e|s|w,{\sl length})}%
\Letter{J}%
-\macrodef{jack}{jack}{(U|D|L|R|{\sl degrees},{\sl chars})}%
+\macrodef{jack}{jack}{(U|D|L|R|{\sl degrees},{\sl chars} [;{\sl keys}])}%
{cct}%
- {arg1: drawing direction; string arg2: {\tt R}: right orientation,
+ {arg1: drawing direction, normally R or L;
+ character sequence arg2: {\tt R}: right orientation,
+ {\tt X} external make or break contact points,
one or more {\tt L[M][B]} for L and auxiliary contacts with make or break
- points; {\tt S[M][B]} for S and auxiliary contacts
+ points; {\tt S[M][B]} for S and auxiliary contacts;
+ {\tt C[M][B]} for a centre contact
\seesect{Composite:}}%
\macrodef{j\_fet}{j_fet}{(\linespec,L|R,P,E)}%
{cct}%
@@ -1511,9 +1517,11 @@ n|e|s|w,{\sl length})}%
\macrodef{lg\_plen}{lg_plen}{}%
{log}%
{logic pin length in in {\tt L\_unit}s}%
-\macrodef{LH\_symbol}{LH_symbol}{([U|D|L|R|{\sl degrees}][I])}%
+\macrodef{LH\_symbol}{LH_symbol}{([U|D|L|R|{\sl degrees}][I],{\sl keys})}%
{log}%
- {logic-gate hysteresis symbol; {\tt I:} inverted}%
+ {logic-gate hysteresis symbol; {\tt I:} inverted. The keys are:
+ {\tt lgth={\sl expr};},
+ {\tt wdth={\sl fraction};} i.e. body width ={\sl fraction $\times$ height}}%
\macrodef{lin\_ang}{lin_ang}{({\sl line-reference}[,d])}%
{gen}%
{the angle of a line or move from {\tt .start} to {\tt .end} of a linear
@@ -1581,9 +1589,10 @@ n|e|s|w,{\sl length})}%
\macrodef{lt\_}{lt_}{}%
{gen}%
{left with respect to current direction}%
-\macrodef{LT\_symbol}{LT_symbol}{(U|D|L|R|{\sl degrees})}%
+\macrodef{LT\_symbol}{LT_symbol}{(U|D|L|R|{\sl degrees},{\sl keys})}%
{log}%
- {logic-gate triangle symbol}%
+ {logic-gate triangle symbol. The keys are:
+ {\tt wdth={\sl expr};}}%
\macrodef{L\_unit}{L_unit}{}%
{log}%
{logic-element grid size}%
@@ -2190,13 +2199,20 @@ degrees, attributes})}%
{gen}%
{Single-segment, single-headed special arrows with {\sl keys}:\\
{\tt type=}{\tt O[pen]} (default)
- | {\tt D[iamond]} | {\tt C[rowfoot]} | {\tt P[lain]}
- | {\tt R[ight]} | {\tt L[eft]} {\tt ;}\\
+ | {\tt D[iamond]}
+ | {\tt C[rowfoot]}
+ | {\tt DI} (disk)
+ | {\tt P[lain]}
+ | {\tt PP[lain]}
+ | {\tt R[ight]}
+ | {\tt L[eft]} {\tt ;}\\
{\tt wdth=}{\sl expression}{\tt ;} (default {\tt arrowwid})\\
{\tt lgth=}{\sl expression}{\tt ;} (default {\tt arrowht})\\
- {\tt shaft=}{\sl shaft attributes} (e.g., {\tt dashed}){\tt ;}\\
- {\tt head=}{\sl head attributes} (e.g., {\tt shaded}){\tt ;}\\
+ {\tt head=}{\sl head attributes}{\tt ;} (e.g., {\tt shaded})\\
+ {\tt shaft=}{\sl shaft attributes}{\tt ;} (default: head attributes)\\
+ {\tt hook=[L|R|LR]} (left, right, or double hook, default none)\\
{\tt name=}{\sl Name}{\tt ;} (default {\sl Sarrow\_})
+ The {\tt PP} key creates a doubled plain arrowhead
\seesect{Macroarguments:}}%
\macrodef{savem4dir}{savem4dir}{([`{\sl stack name}'])}%
{gen}%
@@ -3177,4 +3193,38 @@ brushht})}%
{cct}%
{Y symbol for power-system diagrams
{\sl keys:} {\tt size={\sl expression}; type=G}}%
+
+\Letter{Z}%
+
+\macrodef{zabs}{zabs}{({\sl complex value})}%
+ {dpictools}%
+ {$\;\;$ Absolute value of complex value $\sqrt{(val.x^2+val.y^2}$}%
+\macrodef{zarg}{zarg}{({\sl complex value})}%
+ {dpictools}%
+ {$\;\;$ Angle of complex value $\hbox{atan2}(val.y, val.x)$}%
+\macrodef{Zcos}{Zcos}{({\sl complex value})}%
+ {dpictools}%
+ {$\;\;$ Complex cosine
+ $(\cos(val.x)*\cosh(val.y), -\sin(val.x)*\sinh(val.y))$}%
+\macrodef{Zdiff}{Zdiff}{({\sl complex value, complex value})}%
+ {dpictools}%
+ {$\;\;$ Complex subtraction $(val1.x-val2.x, val1.y-val2.y)$}%
+\macrodef{Zexp}{Zexp}{({\sl complex value})}%
+ {dpictools}%
+ {$\;\;$ Complex exponential $((\cos(val.y), \sin(val.y))*e^{val.x})$}%
+\macrodef{Zinv}{Zinv}{({\sl complex value})}%
+ {dpictools}%
+ {$\;\;$ Complex inverse $((val.x, -val.y)/\hbox{zabs}(val))$}%
+\macrodef{Zprod}{Zprod}{({\sl complex value, complex value})}%
+ {dpictools}%
+ {$\;\;$ Complex multiplication
+ $(val1.x*val2.x-val1.y*val2.y, val1.y*val2.x+val1.x*val2.y)$}%
+\macrodef{Zsin}{Zsin}{({\sl complex value})}%
+ {dpictools}%
+ {$\;\;$ Complex sine
+ $(\sin(val.x)*\cosh(val.y), \cos(val.x)*\sinh(val.y))$}%
+\macrodef{Zsum}{Zsum}{({\sl complex value, complex value})}%
+ {dpictools}%
+ {$\;\;$ Complex addition $(val1.x+val2.x, val1.y+val2.y)$}%
+
% \end{tabbing}%
diff --git a/graphics/circuit_macros/dpictools.pic b/graphics/circuit_macros/dpictools.pic
index 415cd0329a..77573bb667 100644
--- a/graphics/circuit_macros/dpictools.pic
+++ b/graphics/circuit_macros/dpictools.pic
@@ -3,7 +3,7 @@
# m4 macro NeedDpicTools or the pic statement copy "HOMELIB_/dpictools.pic"
# when HOMELIB_ is defined or, generically, copy "<path>dpictools.pic"
-# Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under #
+# Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under #
# the LaTeX Project Public Licence in file Licence.txt. The files of #
# this distribution may be redistributed or modified provided that this #
# copyright notice is included and provided that modifications are clearly #
@@ -457,13 +457,13 @@ define rnd {int($1+sign($1)/2)} # round function
# Operations on complex numbers (x,y)
define Zsum {($1+($2))}
define Zdiff{($1-($2))}
-define Zprod{($1.x*$2.x-$1.y*$2.y,$1.y*$2.x+$1.x*$2.y)}
-define Zinv {($1.x/($1.x^2+$1.y^2),-$1.y/($1.x^2+$1.y^2))}
-define Zexp {((cos($1.y),sin($1.y))*expe($1.x))}
-define Zcos {(cos($1.x)*cosh($1.y),-sin($1.x)*sinh($1.y))}
-define Zsin {(sin($1.x)*cosh($1.y), cos(%1.x)*sinh($1.y))}
-define zabs {sqrt($1.x^2+$1.y^2)}
-define zarg {atan2($1.y,$1.x)}
+define Zprod{(($1).x*($2).x-($1).y*($2).y,($1).y*($2).x+($1).x*($2).y)}
+define Zinv {(($1).x/(($1).x^2+($1).y^2),-($1).y/(($1).x^2+($1).y^2))}
+define Zexp {((cos(($1).y),sin(($1).y))*expe(($1).x))}
+define Zcos {(cos(($1).x)*cosh(($1).y),-sin(($1).x)*sinh(($1).y))}
+define Zsin {(sin(($1).x)*cosh(($1).y), cos(($1).x)*sinh(($1).y))}
+define zabs {sqrt(($1).x^2+($1).y^2)}
+define zarg {atan2(($1).y,($1).x)}
# Trig functions if undefined
if "cosh"=="co"+"sh" then {
define cosh {((expe($1) + expe(-($1)))/2)}
diff --git a/graphics/circuit_macros/examples/Capacitors.m4 b/graphics/circuit_macros/examples/Capacitors.m4
index d96a6f8827..24ffc1493e 100644
--- a/graphics/circuit_macros/examples/Capacitors.m4
+++ b/graphics/circuit_macros/examples/Capacitors.m4
@@ -33,7 +33,7 @@ vm = 0.28
{variable(`capacitor',NN,-30,dimen_/3); move
# Stacking the strings normally does not work because the .pdf uses the
# length of the last line.
- "`{\tt variable(}{\rm}{\tt capacitor}{\rm}{\tt,}'" ljust
+ "`{\tt variable({\sf\char96}capacitor{\sf\char39},}'" ljust
"`{\enskip\tt NN,-30,dimen\_/3)}'" ljust at last ""+(0,-12pt__)
}
}
diff --git a/graphics/circuit_macros/examples/Fuses.m4 b/graphics/circuit_macros/examples/Fuses.m4
index dcffba66cb..adea1e0582 100644
--- a/graphics/circuit_macros/examples/Fuses.m4
+++ b/graphics/circuit_macros/examples/Fuses.m4
@@ -41,10 +41,13 @@ movewid = 0.25
move
jumper(,CJBED) ; {"`\tt $\ldots$(,CJBED)'" at last line.c+(0,-0.2) }
move
- jumper(,body=outlined "gray" shaded "gray";)
+ jumper(,body=outlined "gray" shaded "gray";);
+# "`\tt $\ldots$(,body=outlined \"gray\" \textbackslash'" wid 168bp__ \
+# at last line.start+(0,-20bp__) ljust \
+# "`\tt \hphantom{body=}shaded \"gray\";)'" ljust # svg kludge:
"`\tt $\ldots$(,body=outlined \"gray\" \textbackslash'" wid 168bp__ \
- at last line.start+(0,-20bp__) ljust \
- "`\tt \hphantom{body=}shaded \"gray\";)'" ljust
+ at (last line.start,last "") ljust
+ "`\tt \hphantom{body=}shaded \"gray\";)'" at last "".sw+(0,-5bp__) below ljust
}
.PE
diff --git a/graphics/circuit_macros/examples/Jack.m4 b/graphics/circuit_macros/examples/Jack.m4
index b9a005d279..2569c25267 100644
--- a/graphics/circuit_macros/examples/Jack.m4
+++ b/graphics/circuit_macros/examples/Jack.m4
@@ -1,30 +1,24 @@
.PS
# `Jack.m4'
cct_init
+# https://tex.stackexchange.com/questions/720858/is-there-a-tikz-or-circuitikz-headphone-jack-connector-diagram
P: [
P1: plug
- "\sl A" wid 0.1 at P1.A rjust
- "\sl B" at P1.B rjust
+ foreach_(`Y',`"\sl Y" wid 0.1 at P1.Y rjust',A,B)
"\sl TB" at P1.TB ljust above
"\sl TA" at P1.TA ljust below
+
P2: plug(,R) with .B at P1.A+(0.85,0)
- "\sl A" wid 0.1 at P2.A rjust
- "\sl B" at P2.B rjust
-# P3: plug(L) with .A at P2.A+(1,0)
-# "\sl A" wid 0.1 at P3.A ljust
-# "\sl B" at P3.B ljust
+ foreach_(`Y',`"\sl Y" wid 0.1 at P2.Y rjust',A,B)
+
P4: plug(,3) with .A at P2.B+(0.85,0)
- "\sl A" at P4.A rjust
- "\sl B" at P4.B rjust
- "\sl C" at P4.C rjust
+ foreach_(`Y',`"\sl Y" at P4.Y rjust',A,B,C)
+
P5: plug(L,3R) with .A at P4.A+(1,0)
- "\sl A" wid 0.1 at P5.A ljust
- "\sl B" at P5.B ljust
- "\sl C" at P5.C ljust
+ foreach_(`Y',`"\sl Y" wid 0.1 at P5.Y ljust',A,B,C)
`"\tt plug"' below at P1.s+(0,-0.1)
`"\tt plug(,R)"' below at P2.s+(0,-0.1)
-# `"\tt plug(L)"' below at P3.s+(0,-0.1)
`"\tt plug(,3)"' below at P4.s+(-0.1,-0.1)
`"\tt plug(L,3R)"' below at P5.s+(0.1,-0.1)
]
@@ -34,45 +28,33 @@ L: [ right_
thinlines_
"\sl L" wid 0.1 rjust at J1.L
arrow <- right 0.1 from J1.F; "\sl F" ljust
- arrow <- down 0.1 from J1.G then left 0.1 ; "\sl G" rjust
+ arrow <- down 0.1 left 0.1 from J1.G ; "\sl G" rjust
+ arrow <- up 0.1 left 0.1 from J1.H ; "\sl H" rjust
thicklines_
- J2:[K2: jack(,LMBS) #with .F at J1.F+(1.2,0)
- thinlines_
- "\sl L" rjust at K2.L
- arrow <- from K2.LM left 0.25; "\sl LM" wid 0.18 rjust
- arrow <- from K2.LB left 0.25; "\sl LB" rjust
- "\sl S" rjust at K2.S
- thicklines_ ] with .K2.F at J1.F+(1.2,0)
- J3: jack(L,RLS) with .F at J2.K2.F+(0.4,0)
- thinlines_
+
+ J3: jack(L,RLS) with .F at J1.F+(0.4,0)
"\sl L" ljust at J3.L
"\sl S" ljust at J3.S
- thicklines_
- J4: jack(L,RLBLMLMS) with .F at J3.F+(1.1,0)
- thinlines_
- "\sl L1" ljust at J4.L1
- arrow <- right 0.3 from J4.LM1; "\sl LM1" ljust
- "\sl L2" ljust at J4.L2
- arrow <- right 0.3 from J4.LM2; "\sl LM2" wid 0.2 ht 11pt__ ljust
- "\sl S" ljust at J4.S
- "\sl L" ljust at J4.L
- arrow <- right 0.2 from J4.LB ; "\sl LB" ljust
- right_
- J5: jack(,RSBSMLB) with .F at J4.F+(1.95,0)
+
+ J2: jack(,LMBS) with .F at J3.F+(1.5,0)
thinlines_
- "\sl L" rjust at J5.L
- "\sl S" rjust at J5.S
- "\sl S1" rjust at J5.S1
- arrow <- left 0.3 from J5.SM1; "\sl SM1" rjust
- spline 0.5 <- left 0.25 then left 0.1 down 0.05 from J5.LB; "\sl LB" rjust
- spline 0.5 <- left 0.25 then left 0.1 up 0.05 from J5.SB; "\sl SB" rjust
+ "\sl L" rjust at J2.L
+ arrow <- from J2.LM left 0.25; "\sl LM" wid 0.18 rjust
+ arrow <- from J2.LB left 0.25; "\sl LB" rjust
+ "\sl S" rjust at J2.S
thicklines_
+ J11: jack(,LMBSX) with .w at last [].e+(0.5,0)
+ foreach_(`Y',`"\small\sl Y" rjust at J11.Y.w', L,LM,LB,S,G)
+
+ J8: jack(,XLLBSSBC) with .sw at last [].se+(0.75,0)
+ foreach_(`Y',`"\small\sl Y" rjust at J8.Y.w', L,L1,LB1,S,S1,SB1,G,C)
+
`"\tt jack"' ht 0.15 below at J1.s+(0,-0.15)
- `"\tt jack(,LMBS)"' below at (J2,last "")
+ `"\tt ..(,LMBS)"' below at (J2,last "")
`"\tt ..(L,RLS)"' below at (J3,last "")
- `"\tt ..(L,RLBLMLMS)"' below at (J4,last "")
- `"\tt ..(,RSBSMLB)"' below at (J5,last "")
-] with .nw at P.sw #+ (0,0.1)
+ `"\tt ..(,LMBSX)"' below at (J11,last "")
+ `"\tt ..(,XLLBSSBC)"' below at (J8, last "")
+] with .nw at last [].sw + (0,0.1)
.PE
diff --git a/graphics/circuit_macros/examples/LT3724.m4 b/graphics/circuit_macros/examples/LT3724.m4
new file mode 100644
index 0000000000..19a3a5486e
--- /dev/null
+++ b/graphics/circuit_macros/examples/LT3724.m4
@@ -0,0 +1,89 @@
+.PS
+# LT3724.m4
+# https://pdf1.alldatasheet.com/datasheet-pdf/view/547351/LINER/LT3724.html
+
+log_init
+include(ics.m4)
+iflatex{command "{\scriptsize\sf"}
+
+# This draws the symbolic chip with external circuitry
+
+pinsep=0.25
+hght= 9*pinsep
+wdth=0.6*hght
+blskip = 0.1
+
+[ QR: LT3724
+ line left_ dimen_/2 from QR.SYNC; ground
+ line left_ dimen_/2 from QR.FSET
+ R7: resistor(down_ dimen_); rlabel(,"\SI{49.9}{\kilo\ohm}"); ground(,T)
+ line left_ dimen_ from QR.VC
+ {dot; capacitor(down_ pinsep); llabel(,"\SI{120}{\pico\farad}"); ground(,T)}
+ resistor(left_ dimen_*5/4); rlabel(,\SI{10}{\kilo\ohm})
+ capacitor(down_ pinsep); llabel(,\SI{680}{\pico\farad}); ground(,T)
+ line left_ dimen_/2 from QR.BURST_EN then down_ QR.BURST_EN.y-QR.VFB.y; dot
+
+ DL: dot(at QR.VFB-(dimen_*13/4,0))
+ resistor(down_ pinsep*2); llabel(,"\SI{14.7}{\kilo\ohm}"); ground(,T)
+
+ line left_ dimen_/2 from QR.VIN then up_ QR.n.y-QR.VIN.y+dimen_/3; VINL: dot
+ line left_ dimen_*3/2 from QR.SHDN; dot
+ {resistor(down_ dimen_); rlabel(,"\SI{82.5}{\kilo\ohm}"); H: ground(,T)
+ capacitor(left_ dimen_ from QR.CSS); rlabel(,\SI{1000}{\pico\farad})
+ line to (Here,H); ground(,T)}
+ resistor(up_ to (Here,VINL)); rlabel(,"\SI{1}{\mega\ohm}"); dot
+ dot(at (Here.x-dimen_,Here.y))
+ {capacitor(down_ pinsep); {"\SI{22}{\micro\farad}" at last [].e ljust}
+ line left_ dimen_}
+ dot(at (Here.x-dimen_,Here.y))
+ {capacitor(down_ pinsep); {"\SI{68}{\micro\farad}" at last [].e ljust}
+ dot; ground}
+ VIN: (Here.x-dimen_/2,Here.y); {line invis left_ 25bp__ from VIN}
+ "V$_{\hbox{\tiny IN}}$" at VIN rjust
+ "\SI{36}{\volt}" rjust at VIN-(0,blskip*2.5) \
+ "TO" rjust "\SI{60}{\volt}" rjust
+
+ line right_ dimen_/2 from QR.SGND; dot; ground(at (Here,R7.end),T)
+ line to (Here,QR.PGND) then to QR.PGND
+ dot(at QR.VCC+(dimen_/2,0))
+ { capacitor(down_ pinsep); llabel(,\SI{1}{\micro\farad}); dot }
+ dot(at Here+(dimen_*3/4,0))
+ { reversed(`diode',to (Here,QR.SENSEM)); DV: dot}
+ { line to QR.VCC }
+ diode(right_ dimen_*2/3); DP: dot
+ { line to (Here,QR.BOOST) then to QR.BOOST }
+ capacitor(right_ dimen_); {"\SI{22}{\micro\farad}" at last [].n above}
+ DZ: dot; reversed(`diode',down_ pinsep,Z); ground(,T)
+ "PDS5100H" at last [].w rjust below
+ resistor(right_ from QR.SW to (DP,QR.SW)); llabel(,\SI{10}{\ohm})
+ line to (DZ,Here); dot
+ {up_; M1: mosfet(,,TEDSQuB) with .e at (DZ,QR.TG); "Si850DP" at M1.e ljust
+ line from M1.G to QR.TG}
+ line from DZ to M1.S
+ line from M1.D up_ VIN.y-M1.D.y then to VIN
+ inductor(right_ dimen_ from DZ); llabel(,\SI{10}{\micro\henry}); dot
+ {line to (Here,QR.SENSEP) then to QR.SENSEP}
+ resistor(right_ dimen_); llabel(,\SI{0.015}{\ohm}); DQ: dot
+ line from QR.VFB to DL-(dimen_/2,0)
+ resistor(down_ Here.y-R7.end.y+dimen_/2); llabel(,\SI{130}{\kilo\ohm})
+ line to (DV,Here) then to DV
+ line from QR.SENSEM to (DQ,QR.SENSEM) then to DQ
+ { dot(at DQ+(dimen_/2,0))
+ capacitor(down_ pinsep); llabel(,\SI{68}{\micro\farad}); ground(,T) }
+ { dot(at DQ+(dimen_*3/2,0))
+ capacitor(down_ pinsep); llabel(,\SI{33}{\micro\farad}); ground(,T) }
+ line from DQ right_ dimen_*2.25; {line invis right_ 24bp__}
+ VOUT: Here
+ "V$_{\hbox{\tiny OUT}}$" at VOUT ljust
+ "\SI{12}{\volt}" at VOUT+(0,-blskip*1.2) ljust
+ "\SI{50}{\watt}" at VOUT+(0,-blskip*1.2*2) ljust
+
+ "High voltage step-down regulator" ljust at (M1.e.x+10bp__,QR.n.y) \
+ "\SI{48}{\volt} TO \SI{12}{\volt}, \SI{50}{\watt}" ljust
+ ]
+#showbox_
+#print last [].wid,last [].ht
+
+iflatex(command "}%")
+
+.PE
diff --git a/graphics/circuit_macros/examples/Loglog.m4 b/graphics/circuit_macros/examples/Loglog.m4
index 2985338b3d..dfd8960cf1 100644
--- a/graphics/circuit_macros/examples/Loglog.m4
+++ b/graphics/circuit_macros/examples/Loglog.m4
@@ -3,6 +3,7 @@
gen_init
s_init(Loglog)
sinclude(tst.dim)
+scale = 1/0.8
define(`rint',`sign(`$1')*int(abs(`$1')+.5)')
S:[
@@ -79,7 +80,61 @@ thicklines_
]
-# box wid S.wid ht S.ht at S
-# print (S.wid,S.ht)/(1 pc__)
+#.PE
+#.PS
+# ex06.m4
+#gen_init
+[
+F: box invis wid 1.6i ht 1.8i
+E: box invis wid F.wid ht F.ht
+G: box invis wid 1i ht F.ht
+
+ ell = F.ht-0.6i
+ r = 0.3i
+ offset = 8bp__
+ hatch = 0.1i
+ dhs = hatch * sqrt(2)
+ qmell = F.ht - ell
+ kwid = F.wid-qmell-r
+
+ hatchbox(wid G.e.x-F.w.x ht F.ht,hatch) with .sw at F.sw
+ box invis fill_(1) ht ell wid E.e.x-F.w.x with .nw at F.nw
+
+ box wid G.e.x-F.w.x ht F.ht with .sw at F.sw thick linethick*3/2
+ foreach_(`B',
+ `B`'T: B.se + (-qmell,qmell)
+ line invis fill_(1) from B.se to (B.se,B`'T) then to B`'T then to B.se
+ line from (B.w,B`'T) to B`'T chop 0 chop -offset
+ line from B`'T up ell chop -offset chop 0
+ line from B`'T + (-r,0) up ell
+ line dashed from B`'T to B.se
+ "\large $0$" at B`'T + (-r/2,ell/2)
+ "\large $0$" at B`'T + (qmell/2,ell/2)
+ "$t$" at (B`'T,B.n) + (-offset/2,offset)
+ sprintf("$\overbrace{\phantom{\hbox to %gin{}}}^{\hbox{$k$}}$",kwid/scale) \
+ at B.nw + (kwid/2,0) above
+ hatchbox(wid kwid ht ell,hatch,,90) with .nw at B.nw
+ line from B.ne to B.se thick linethick*3/2
+ ',F,E)
+
+ line from (G.w,ET) right G.wid
+ line from ET + (0,r) left ET.x-E.w.x
+ hatchbox(wid r ht r,hatch,,0) with .se at ET
+
+ "$q$" at F.sw + (-offset,offset/3)
+ "$\ell$" at (F.w,FT) + (-offset,offset/3)
+
+ "$n{+}p{+}m$" at G.ne + (0,offset)
+
+ foreach_(`B',`"\Large $B$" ht 0.2 with .n at B.s + (0,-offset/2)',F,E,G)
+
+ # extra left brace to avoid a psfrag problem (bug?)
+ sprintf(\
+ "$\vphantom{\{}\left.\vrule height %gin depth0pt width0pt\right\}r$",\
+ r/2*0.9) at ET + (offset,r/2)
+
+# Adjust the bounding box without using s_box:
+# move from F.nw+(-12bp__,21bp__) to G.se+(20bp__,-15bp__)
+ ] with .sw at last [].se+(0.15,0)
.PE
diff --git a/graphics/circuit_macros/examples/Makefile b/graphics/circuit_macros/examples/Makefile
index f2f54e02d0..30b761b5f1 100644
--- a/graphics/circuit_macros/examples/Makefile
+++ b/graphics/circuit_macros/examples/Makefile
@@ -70,15 +70,15 @@ TEXPICS = \
cbresistor.tex csc.tex Csource.tex Decoder.tex \
Demultiplexer.tex diamond.tex Dini.tex Diodes.tex Drive.tex \
EEP.tex Emarrows.tex Escher.tex EVplugs.tex \
- ex01.tex ex02.tex ex03.tex ex04.tex ex05.tex ex06.tex ex08.tex \
+ ex01.tex ex03.tex ex04.tex ex05.tex ex08.tex \
ex09.tex ex10.tex ex11.tex ex12.tex ex15.tex ex16.tex ex18.tex \
ex21.tex exp.tex fet.tex Flow.tex Fuses.tex \
Geometry.tex GrayCode.tex graysurf.tex Grounds.tex \
Headers.tex Heathkit.tex \
I2L.tex Incleps.tex Inductors.tex Jack.tex \
- lcct.tex Logic.tex Loglog.tex MC.tex Mixer.tex MoreTable.tex \
- MotorControl.tex Multiplexer.tex \
- NLG.tex NPDT.tex Nport.tex Opamp.tex Optoiso.tex \
+ lcct.tex Logic.tex Loglog.tex LT3724.tex \
+ MC.tex Mixer.tex MoreTable.tex MotorControl.tex Multiplexer.tex \
+ NLG.tex NPDT.tex Nport.tex OneLine.tex Opamp.tex Optoiso.tex \
Pconn.tex Plate.tex PushPull.tex pwrsupply.tex \
Quantum.tex quick.tex \
random.tex Rectifiers.tex recycle.tex relaycoil.tex Relay.tex \
@@ -133,9 +133,9 @@ LTXFILE=printf "|documentclass[11pt]{article}\n\
$(M4) $(CONF) $(DIMFILE) F_$*.dim $*.m4 > $*.pic
.m4.tex:
@touch $(DIMFILE) F_$*.dim
- $(M4) $(CONF) $(DIMFILE) F_$*.dim $*.m4 | $(PIC) $(MODE) > $*.tex
-# $(M4) $(CONF) $(DIMFILE) F_$*.dim $*.m4 > $*.pic
-# $(PIC) $(MODE) $*.pic > $*.tex
+# $(M4) $(CONF) $(DIMFILE) F_$*.dim $*.m4 | $(PIC) $(MODE) > $*.tex
+ $(M4) $(CONF) $(DIMFILE) F_$*.dim $*.m4 > $*.pic
+ $(PIC) $(MODE) $*.pic > $*.tex
.m4.dvi:
@touch $(DIMFILE) F_$*.dim
$(M4) pstricks.m4 $(DIMFILE) F_$*.dim $*.m4 | $(PIC) -p > $*.tex
@@ -201,7 +201,7 @@ LTXFILE=printf "|documentclass[11pt]{article}\n\
pdf2svg $*.pdf $*.svg
chmod 644 $*.svg
# rm $*.pdf
-
+ rm -f F_*
#########################################################################
diff --git a/graphics/circuit_macros/examples/extras/OneLine.m4 b/graphics/circuit_macros/examples/OneLine.m4
index 7b451b366a..7b451b366a 100644
--- a/graphics/circuit_macros/examples/extras/OneLine.m4
+++ b/graphics/circuit_macros/examples/OneLine.m4
diff --git a/graphics/circuit_macros/examples/Shapedefs.m4 b/graphics/circuit_macros/examples/Shapedefs.m4
new file mode 100644
index 0000000000..72a15118bd
--- /dev/null
+++ b/graphics/circuit_macros/examples/Shapedefs.m4
@@ -0,0 +1,226 @@
+ifdef(`View3d',,`threeD_init')
+divert(-1)
+# Shapedefs.m4
+# 3D structures with complex surfaces and hidden lines are the domain of more
+# sophisticated software packages, but basic shapes can be drawn with pic.
+
+#####################################################
+
+ `cylinder3D(xdispl,ydispl,zdispl,diameter,
+ [colored "color"])'
+define(`cylinder3D',`[ Start: (0,0)
+ xdispl = `$1'; ydispl = `$2'; zdispl = `$3'
+ define(`M4CL',`xdispl,ydispl,zdispl')dnl
+ lenc = length3D(M4CL)
+ diamc = ifelse(`$4',,(lenc/2),`$4') ; radc = diamc/2
+ cs = dot3D(View3D,M4CL)/lenc
+ End: Project(M4CL)
+ az = atan2(ydispl,xdispl)
+ ae = atan2(zdispl,sqrt(xdispl^2+ydispl^2))
+ CL: line invis from Start to End; C: CL.c
+ nls = int(twopi_*radc/lthick)
+ define(`M4PP',`rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,0,0,radc)))')dnl
+ for i=0 to nls-1 do { if dot3D(View3D,M4PP) > 0 then {
+ P: Project(M4PP)
+ ql = sqrta(dot3D(Light3D,M4PP)/radc)
+ line from P to End+P outlined rgbstring(ql,ql,ql) `$5' } }
+ Perp: (vperp(CL,radc))
+ if cs > 0 then { T: End; B: Start } else { T: Start; B: End }
+ rpoint_(from Start to Perp)
+ css = sqrta(cs)
+ Top: rotellipse(diamc,diamc*cs,
+ thick linethick/3 shaded rgbstring(css,css,css)) with .c at T
+ W: line thick linethick/3 from T+Perp to B+Perp
+ Bot: ellipsearc(diamc,diamc*cs,pi_,twopi_,rp_ang,cw,
+ thick linethick/3) with .C at B
+ E: line thick linethick/3 from B-Perp to T-Perp
+ rpoint_(from Start to End)
+`$6']')
+
+ `cone3D(xdispl,ydispl,zdispl,diameter,
+ [colored "color"])'
+ `internal positions:
+ Start (centre of base),
+ End (point),
+ C (axis centre)'
+define(`cone3D',`[ Start: (0,0)
+ xdispl = `$1'; ydispl = `$2'; zdispl = `$3'
+ define(`M4CL',`xdispl,ydispl,zdispl')dnl
+ lenc = length3D(M4CL)
+ diamc = ifelse(`$4',,(lenc/2),`$4') ; radc = diamc/2
+ End: Project(M4CL)
+ cs = dot3D(View3D,M4CL)/lenc
+ az = atan2(ydispl,xdispl)
+ ae = atan2(zdispl,sqrt(xdispl^2+ydispl^2))
+ CL: line invis from Start to End; C: CL.c
+ nls = int(twopi_*radc/lthick)
+ lt = sqrt(radc^2+lenc^2)
+ b = 0
+ for i=0 to nls-1 do { if dot3D(View3D,
+ rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,radc,0,lenc)))) > 0 then {
+ ql = sqrta(dot3D(Light3D,
+ rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,radc,0,lenc))))/lt)
+ P: Project(rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,0,0,radc))))
+ line from P to End outlined rgbstring(ql,ql,ql) `$5'
+ if !b then { WB: P; b = 1 }
+ } else { if b then { BW: P; b = 0 } } }
+ if vlength(CL.x,CL.y) != 0 then { Perp: (vperp(CL,radc,R)) } \
+ else { Perp: (radc,0) }
+ if cs >= 0 then { T: End; B: Start } else {T: Start; B: End }
+ rpoint_(from Start to Perp)
+ pout = (vlength(End.x,End.y) > abs(radc*cs))
+ if cs < 0 then { css = sqrta(cs)
+ if pout then { line thick linethick/3 from BW to End then to WB }
+ Bot: rotellipse(diamc,diamc*cs,thick linethick/3 \
+ ifelse(`$5',,`shaded rgbstring(css,css,css)',`$5')) with .c at T } \
+ else { if pout then {
+ line thick linethick/3 from BW to End then to WB
+ a = acos((WB.x*Perp.x+WB.y*Perp.y)/radc^2)
+ Bot: ellipsearc(diamc,diamc*cs,a,pi_-a,rp_ang,cw, thick linethick/3) \
+ with .C at B } \
+ else {
+ Bot: rotellipse(diamc,diamc*cs,thick linethick/3) with .c at B } }
+ rpoint_(from Start to End)
+`$6']')
+ `Arrow3D(xdispl,ydispl,zdispl,
+ diam,arrowwid,arrowht)'
+define(`Arrow3D',`[ diam_Ar = ifelse(`$4',,linewid/10,`$4')
+ wid_Ar = ifelse(`$5',,diam_Ar*2,`$5')
+ ht_Ar = ifelse(`$6',,wid_Ar*2,`$6')
+ x_Ar = ifelse(`$1',,1,`$1')
+ y_Ar = ifelse(`$2',,1,`$2')
+ z_Ar = ifelse(`$3',,1,`$3')
+ define(`M4Arrow3D',`x_Ar,y_Ar,z_Ar')dnl
+ len_Ar = length3D(M4Arrow3D)
+ len_Shaft = len_Ar - ht_Ar
+ cs_Ar = dot3D(View3D,M4Arrow3D)
+ if cs_Ar >= 0 then {
+ Shaft: cylinder3D(sprod3D(len_Shaft/len_Ar,M4Arrow3D),diam_Ar)
+ Head: cone3D(sprod3D(ht_Ar/len_Ar,M4Arrow3D),wid_Ar) \
+ with .Start at Shaft.End } \
+ else {
+ Head: cone3D(sprod3D(ht_Ar/len_Ar,M4Arrow3D),wid_Ar)
+ Shaft: cylinder3D(sprod3D(len_Shaft/len_Ar,M4Arrow3D),diam_Ar) \
+ with .End at Head.Start }
+ Start: Shaft.Start; End: Head.End
+ `$7']')
+
+define(`f2xyz3D',``$1'x = `$2'
+ `$1'y = `$3'
+ `$1'z = `$4' ')
+
+ `prism3D(xdispl,ydispl,zdispl,endwid,endht,
+ (rad)rotation)
+ args1-3 are the 3D coords of .End wrt .Start
+ arg6 is rotation about x axis
+ Defined points .Start, .End, .C'
+define(`prism3D',`[ Start: (0,0)
+ xdispl = ifelse(`$1',,linewid,`$1')
+ ydispl = ifelse(`$2',,linewid,`$2')
+ zdispl = ifelse(`$3',,linewid,`$3')
+ widp = ifelse(`$4',,(linewid/5),`$4')
+ htp = ifelse(`$5',,(linewid/10),`$5')
+ rotp = ifelse(`$6',,0,`$6')
+ End: Project(xdispl,ydispl,zdispl); C: 0.5 between Start and End
+ lenp = length3D(xdispl,ydispl,zdispl)
+ az = atan2(ydispl,xdispl); ae = atan2(zdispl,sqrt(xdispl^2+ydispl^2))
+ wp2 = widp/2; hp2 = htp/2
+# 3D coords of corners (B=back, F=front)
+ f2xyz3D(nwB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0,-wp2, hp2))))
+ f2xyz3D(swB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0,-wp2,-hp2))))
+ f2xyz3D(seB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0, wp2,-hp2))))
+ f2xyz3D(neB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0, wp2, hp2))))
+ f2xyz3D(nwF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp,-wp2, hp2))))
+ f2xyz3D(swF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp,-wp2,-hp2))))
+ f2xyz3D(seF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp, wp2,-hp2))))
+ f2xyz3D(neF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp, wp2, hp2))))
+# facets
+ M4Facet3D(neF,nwF,swF,seF)
+ M4Facet3D(neB,seB,swB,nwB)
+ M4Facet3D(neF,seF,seB,neB)
+ M4Facet3D(neF,neB,nwB,nwF)
+ M4Facet3D(seF,swF,swB,seB)
+ M4Facet3D(nwF,nwB,swB,swF)
+`$7']')
+
+ `M4Facet3D( a,b,c,d )'
+define(`M4Facet3D',`
+define(`PFacet',`cross3D(diff3D(`$2'x,`$2'y,`$2'z,`$1'x,`$1'y,`$1'z),
+ diff3D(`$3'x,`$3'y,`$3'z,`$2'x,`$2'y,`$2'z))')
+ if dot3D(View3D,PFacet) > 0 then {
+ fFacet = sqrta(dot3D(Light3D,PFacet)/length3D(PFacet))
+ P1: Project(`$1'x,`$1'y,`$1'z)
+ P2: Project(`$2'x,`$2'y,`$2'z)
+ P3: Project(`$3'x,`$3'y,`$3'z)
+ P4: Project(`$4'x,`$4'y,`$4'z)
+ line fill_(fFacet) invis from P1 to P2 then to P3 then to P4 then to P1
+ line from P1 to P2; round
+ line to P3; round
+ line to P4; round
+ line to P1; round } ')
+
+ `M4Pgram3D( c,dne,dnw )'
+define(`M4Pgram3D',`
+ f2xyz3D(ne,sum3D(`$1'x,`$1'y,`$1'z,`$3'x,`$3'y,`$3'z))
+ f2xyz3D(nw,sum3D(`$1'x,`$1'y,`$1'z,`$2'x,`$2'y,`$2'z))
+ f2xyz3D(sw,diff3D(`$1'x,`$1'y,`$1'z,`$2'x,`$2'y,`$2'z))
+ f2xyz3D(se,diff3D(`$1'x,`$1'y,`$1'z,`$3'x,`$3'y,`$3'z))
+ define(`PPgrapm',`cross3D(
+ diff3D(nwx,nwy,nwz,nex,ney,nez),
+ diff3D(swx,swy,swz,nwx,nwy,nwz))')
+ if dot3D(View3D,PPgram) > 0 then {
+ fPgram = sqrta(dot3D(Light3D,PPgram)/length3D(PPgram))
+ P1: Project(`$1'x,`$1'y,`$1'z)
+ P2: Project(`$2'x,`$2'y,`$2'z)
+ P3: Project(`$3'x,`$3'y,`$3'z)
+ P4: Project(`$4'x,`$4'y,`$4'z)
+ line fill_(fPgram) invis from P1 to P2 then to P3 then to P4 then to P1
+ line from P1 to P2; round
+ line to P3; round
+ line to P4; round
+ line to P1; round } ')
+ `prism3D(
+ xdispl,ydispl,zdispl,endwid,endht,(rad)rotation,
+ index,dataname,r,g,b)
+ Defined points .Start, .End, .C
+ args1-3 are the input 3D coords of .End wrt .Start
+ args4-5 define the end dimensions
+ arg6 is rotation about x axis
+ arg7 is the current depth of the data vector
+ arg8 is the name (e.g. X) of the vector of
+ stored face distance, color, and projected coords:
+ eg X0[n]=[d,r]; X1[n]=[g,b]
+ X2[n]=proj(C); X3[n]=proj(NE); X4[n]=proj(NW)'
+define(`prism3D',`[ Start: (0,0)
+ xdispl = ifelse(`$1',,linewid,`$1')
+ ydispl = ifelse(`$2',,linewid,`$2')
+ zdispl = ifelse(`$3',,linewid,`$3')
+ widp = ifelse(`$4',,(linewid/5),`$4')
+ htp = ifelse(`$5',,(linewid/10),`$5')
+ rotp = ifelse(`$6',,0,`$6')
+ End: Project(xdispl,ydispl,zdispl); C: 0.5 between Start and End
+ lenp = length3D(xdispl,ydispl,zdispl)
+ az = atan2(ydispl,xdispl); ae = atan2(zdispl,sqrt(xdispl^2+ydispl^2))
+ wp2 = widp/2; hp2 = htp/2
+# 3D coords of corners (B=back, F=front)
+ f2xyz3D(nwB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0,-wp2, hp2))))
+ f2xyz3D(swB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0,-wp2,-hp2))))
+ f2xyz3D(seB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0, wp2,-hp2))))
+ f2xyz3D(neB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0, wp2, hp2))))
+
+ f2xyz3D(nwF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp,-wp2, hp2))))
+ f2xyz3D(swF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp,-wp2,-hp2))))
+ f2xyz3D(seF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp, wp2,-hp2))))
+ f2xyz3D(neF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp, wp2, hp2))))
+# facets
+ M4Facet3D(neF,nwF,swF,seF)
+ M4Facet3D(neB,seB,swB,nwB)
+ M4Facet3D(neF,seF,seB,neB)
+ M4Facet3D(neF,neB,nwB,nwF)
+ M4Facet3D(seF,swF,swB,seB)
+ M4Facet3D(nwF,nwB,swB,swF)
+`$7']')
+
+
+#####################################################
+divert(0)dnl
diff --git a/graphics/circuit_macros/examples/UNO.m4 b/graphics/circuit_macros/examples/UNO.m4
index 6338c307c0..5baa82677a 100644
--- a/graphics/circuit_macros/examples/UNO.m4
+++ b/graphics/circuit_macros/examples/UNO.m4
@@ -58,7 +58,7 @@ define(`HeaderPin',`
define(`ATMEGA16U2',`[
Chip: box wid 10*lg_pinsep ht 25*lg_pinsep
- Loopover_(`x',
+ foreach_(`x',
`Arightpin(patsubst(x,;,`,'))',
6;PD0, 7;PD1, 8;PD2, 9;PD3, 10;PD4, 11;PD5, 12;PD6, 13;PD7,
131;nul,
@@ -66,7 +66,7 @@ define(`ATMEGA16U2',`[
132;nul,
133;nul,
14;PB0, 15;PB1, 16;PB2, 17;PB3, 18;PB4, 19;PB5, 20;PB6, 21;PB7)
- Loopover_(`x',
+ foreach_(`x',
`Aleftpin(patsubst(x,;,`,'))',
33;PAD,
100;nul,
@@ -93,14 +93,14 @@ define(`Arightpin',`move to Chip.se+(0,m4Lx*lg_pinsep)
define(`ATMEGA328P',`[
Chip: box wid 10*lg_pinsep ht 23*lg_pinsep
- Loopover_(`x',
+ foreach_(`x',
`Arightpin(patsubst(x,;,`,'))',
2;PD0, 3;PD1, 4;PD2, 5;PD3, 6;PD4, 11;PD5, 12;PD6, 13;PD7,
100;nul,
23;PC0, 24;PC1, 25;PC2, 26;PC3, 27;PC4, 28;PC5,
101;nul,
14;PB0, 15;PB1, 16;PB2, 17;PB3, 18;PB4, 19;PB5)
- Loopover_(`x',
+ foreach_(`x',
`Aleftpin(patsubst(x,;,`,'))',
201;nul, 202;nul, 203;nul, 204;nul, 205;nul, 206;nul, 207;nul, 208;nul,
209;nul,
@@ -204,7 +204,7 @@ divert(0)dnl
USB: [ K: box invis wid dimen_/2 ht 5*lg_pinsep
"USB" rjust at K.e
line thick 1.5 from K.nw to K.ne then to K.se then to K.sw
- Loopover_(`x',
+ foreach_(`x',
`Pin`'m4Lx: K.ne-(0,m4Lx/5*K.ht)
"x" at Pin`'m4Lx ljust above',
1 XUSB, 2 D$-$, 3 D$+$, 4 UGND)
@@ -280,7 +280,7 @@ USB: [ K: box invis wid dimen_/2 ht 5*lg_pinsep
continue to (Here,ICSP1.P2.end) then to ICSP1.P2.end
line from ICSP1.P5.end down 2*del; continue to (TPPB6.x+2*del,Here.y)
TRESET2: Here
- continue to (Here.x,D3.end.y+del) then to (RN1C.end.x-2.5*del,D3.end.y+del)
+ continue to (Here.x,D3.end.y+del) then to (RN1C.end.x-2*del,D3.end.y+del)
continue to (Here,U3.Pin24) then to U3.Pin24.end
G4: ground(at ICSP1.P6.end,,E); {"GND" at last line.c below }
line from ICSP1.P4.end right del then up U3.Pin16.y-ICSP1.P4.y \
diff --git a/graphics/circuit_macros/examples/cbresistor.m4 b/graphics/circuit_macros/examples/cbresistor.m4
index 152e42758c..4c3a6d4aee 100644
--- a/graphics/circuit_macros/examples/cbresistor.m4
+++ b/graphics/circuit_macros/examples/cbresistor.m4
@@ -1,7 +1,7 @@
.PS
# cbresistor.m4
# https://tex.stackexchange.com/questions/709339/create-command-with-decoration-in-tikz
-# https://www.google.com/search?client=firefox-b-d&q=resistor+color+code
+# https://www.digikey.ca/en/resources/conversion-calculators/conversion-calculator-resistor-color-code
cct_init
divert(-1)
diff --git a/graphics/circuit_macros/examples/diamond.m4 b/graphics/circuit_macros/examples/diamond.m4
index d16cfc91aa..5ee3dee2c1 100644
--- a/graphics/circuit_macros/examples/diamond.m4
+++ b/graphics/circuit_macros/examples/diamond.m4
@@ -1,25 +1,28 @@
.PS
# diamond.m4
gen_init
-# See LaTeX Graphics Companion pp 57-58
+NeedDpicTools
+# See LaTeX Graphics Companion pp 57-58 and
+# https://tex.stackexchange.com/questions/730392/rotating-triangle
ifdpic(`
-dimen = 1.5
-ratio = 0.9
-n = 30
+ dimen = 1.3
+ ratio = 0.9
+ n = 30
-North: (0,dimen)
-East: (dimen,0)
-South: (0,-dimen)
-West: (-dimen,0)
-
-define(`square',
- `shade(`$1',
- line from North to East then to South then to West then to North)
- ')
+ North: (0,dimen)
+ East: (dimen,0)
+ South: (0,-dimen)
+ West: (-dimen,0)
define(`diamond',`[
for i = 2 to n do {
- square(`$1')
+ ifelse(`$1',,
+ `hsvtorgb(hue,1,1,r0,g0,b0)
+ line from North to East then to South then to West then to North \
+ shaded rgbstring(r0,g0,b0)
+ hue = hue+360/(n-1)',
+ `shade(`$1',
+ line from North to East then to South then to West then to North)')
Tmp: North
North: ratio between East and North
East: ratio between South and East
@@ -27,11 +30,26 @@ for i = 2 to n do {
West: ratio between Tmp and West
}]')
-linethick = 0
-diamond( i % 2 )
-linethick = 0.4
-diamond( (n-i)/(n-2) ) with .w at last [].e+(0.25,0)
+define(`triangle',`[
+for i = 2 to n do {
+ hue = 180+(i-2)/(n-1)*360
+ hsvtorgb(hue,1,1,r0,g0,b0)
+ line from North to East then to West then to North shaded rgbstring(r0,g0,b0)
+ Tmp: North
+ North: ratio between East and North
+ East: ratio between West and East
+ West: ratio between Tmp and West
+ }]')
+ linethick = 0.4
+ diamond( (n-i)/(n-2) )
+ hue = 0
+ diamond with .w at last [].e+(0.125,0)
+ North: (0,dimen*sqrt(3)/2)
+ East: (dimen,-dimen*sqrt(3)/2)
+ West: (-dimen,-dimen*sqrt(3)/2)
+ hue = 180
+ triangle with .w at last [].e-(0.2,0)
',
`box "diamond.m4" "requires" "dpic"')
diff --git a/graphics/circuit_macros/examples/dpv/AlogixDPV.m4 b/graphics/circuit_macros/examples/dpv/AlogixDPV.m4
index c09a8a8fb8..819444a171 100644
--- a/graphics/circuit_macros/examples/dpv/AlogixDPV.m4
+++ b/graphics/circuit_macros/examples/dpv/AlogixDPV.m4
@@ -66,7 +66,7 @@ G: [
with .w at last [].sw+(0,-10pt__)
undefine(`extras')
-define(`extras')
+#efine(`extras')
ifdef(`extras',`
Q1: Autologix(Nor(Nor(A,And(B,C)),Nand(Not(B),D))) \
diff --git a/graphics/circuit_macros/examples/dpv/CsourceDPV.m4 b/graphics/circuit_macros/examples/dpv/CsourceDPV.m4
index c95aaff3d4..1d982f3f27 100644
--- a/graphics/circuit_macros/examples/dpv/CsourceDPV.m4
+++ b/graphics/circuit_macros/examples/dpv/CsourceDPV.m4
@@ -1,6 +1,7 @@
.PS
# Csource.m4
cct_init(svg_font(sans-serif,11bp__,2bp__))
+maxpswid = 10
# The default line separation is a bit small if the top line contains
# subscripts, so we space stacked lines explicitly:
diff --git a/graphics/circuit_macros/examples/dpv/JackDPV.m4 b/graphics/circuit_macros/examples/dpv/JackDPV.m4
index 6af8b6b301..781d6837e7 100644
--- a/graphics/circuit_macros/examples/dpv/JackDPV.m4
+++ b/graphics/circuit_macros/examples/dpv/JackDPV.m4
@@ -1,75 +1,60 @@
.PS
-# `Jack.m4'
-cct_init(svg_font(sans-serif,10bp__))
+# `JackDPV.m4'
+cct_init
+# https://tex.stackexchange.com/questions/720858/is-there-a-tikz-or-circuitikz-headphone-jack-connector-diagram
P: [
P1: plug
- "A" wid 0.1 at P1.A rjust
- "B" at P1.B rjust
- "TB" at P1.TB ljust above
- "TA" at P1.TA ljust below
+ foreach_(`Y',`"svg_it(Y)" wid 0.1 at P1.Y rjust',A,B)
+ "svg_it(TB)" at P1.TB ljust above
+ "svg_it(TA)" at P1.TA ljust below
+
P2: plug(,R) with .B at P1.A+(0.85,0)
- "A" wid 0.1 at P2.A rjust
- "B" at P2.B rjust
- P3: plug(,3) with .A at P2.B+(0.85,0)
- "A" at P3.A rjust
- "B" at P3.B rjust
- "C" at P3.C rjust
- P4: plug(L,3R) with .A at P3.A+(1,0)
- "A" wid 0.1 at P4.A ljust
- "B" at P4.B ljust
- "C" at P4.C ljust
- `"plug"' below at P1.s+(0,-0.1)
- `"plug(,R)"' below at P2.s+(0,-0.1)
- `"plug(,3)"' below at P3.s+(-0.1,-0.1)
- `"plug(L,3R)"' below at P4.s+(0.1,-0.1)
+ foreach_(`Y',`"svg_it(Y)" wid 0.1 at P2.Y rjust',A,B)
+
+ P4: plug(,3) with .A at P2.B+(0.85,0)
+ foreach_(`Y',`"svg_it(Y)" at P4.Y rjust',A,B,C)
+
+ P5: plug(L,3R) with .A at P4.A+(1,0)
+ foreach_(`Y',`"svg_it(Y)" wid 0.1 at P5.Y ljust',A,B,C)
+ "svg_tt(`plug')" below at P1.s+(0,-0.1)
+ "svg_tt(`plug(,R)')" below at P2.s+(0,-0.1)
+ "svg_tt(`plug(,3)')" below at P4.s+(-0.1,-0.1)
+ "svg_tt(`plug(L,3R)')" below at P5.s+(0.1,-0.1)
]
-L: [
+L: [ right_
J1: jack
thinlines_
- "L" wid 0.1 rjust at J1.L
- arrow <- right 0.1 from J1.F; "F" ljust
- arrow <- down 0.1 from J1.G then left 0.1 ; "G" rjust
- thicklines_
- J2: jack(,LMBS) with .F at J1.F+(1.2,0)
- thinlines_
- "L" rjust at J2.L
- arrow <- from J2.LM left 0.25; "LM" rjust
- arrow <- from J2.LB left 0.25; "LB" rjust
- "S" rjust at J2.S
- thicklines_
- J3: jack(L,RLS) with .F at J2.F+(0.4,0)
- thinlines_
- "L" ljust at J3.L
- "S" ljust at J3.S
+ "svg_it(L)" wid 0.1 rjust at J1.L
+ arrow <- right 0.1 from J1.F; "svg_it(F)" ljust
+ arrow <- down 0.1 left 0.1 from J1.G ; "svg_it(G)" rjust
+ arrow <- up 0.1 left 0.1 from J1.H ; "svg_it(H)" rjust
thicklines_
- J4: jack(L,RLBLMLMS) with .F at J3.F+(1,0)
- thinlines_
- "L1" ljust at J4.L1
- arrow <- right 0.3 from J4.LM1; "LM1" ljust
- "L2" ljust at J4.L2
-# arrow <- right 0.3 from J4.LM2; "LM2" ht 11pt__ ljust
- arrow <- right 0.3 from J4.LM2; "LM2" ljust
- "S" ljust at J4.S
- "L" ljust at J4.L
- arrow <- right 0.2 from J4.LB ; "LB" ljust
- J5: jack(,RSBSMLB) with .F at J4.F+(1.95,0)
+
+ J3: jack(L,RLS) with .F at J1.F+(0.4,0)
+ "svg_it(L)" ljust at J3.L
+ "svg_it(S)" ljust at J3.S
+
+ J2: jack(,LMBS) with .F at J3.F+(1.5,0)
thinlines_
- "L" rjust at J5.L
- "S" rjust at J5.S
- "S1" rjust at J5.S1
- arrow <- left 0.3 from J5.SM1; "SM1" rjust
- arrow <- left 0.25 then left 0.1 down 0.05 from J5.LB; "LB" rjust
- arrow <- left 0.25 then left 0.1 up 0.05 from J5.SB; "SB" rjust
+ "svg_it(L)" rjust at J2.L
+ arrow <- from J2.LM left 0.25; "svg_it(L)M" wid 0.18 rjust
+ arrow <- from J2.LB left 0.25; "svg_it(L)B" rjust
+ "svg_it(S)" rjust at J2.S
thicklines_
- `"jack"' below at J1.s+(0,-0.15)
- `"jack(,LMBS)"' at (J2,last "")
- `"..(L,RLS)"' at (J3,last "")
- `"..(L,RLBLMLMS)"' at (J4,last "")
- `"..(,RSBSMLB)"' wid 72bp__ at (J5,last "")
-] with .nw at P.sw + (0,0.1)
+ J11: jack(,LMBSX) with .w at last [].e+(0.5,0)
+ foreach_(`Y',`"svg_small(svg_it(Y))" rjust at J11.Y.w', L,LM,LB,S,G)
+
+ J8: jack(,XLLBSSBC) with .sw at last [].se+(0.75,0)
+ foreach_(`Y',`"svg_small(svg_it(Y))" rjust at J8.Y.w', L,L1,LB1,S,S1,SB1,G,C)
+
+ "svg_tt(`jack')" below at J1.s+(0,-0.15)
+ "svg_tt(`..(L,RLS)')" at (J3,last "")
+ "svg_tt(`..(,LMBS)')" at (J2,last "")
+ "svg_tt(`..(,LMBSX)')" at (J11,last "")
+ "svg_tt(`..(,XLLBSSBC)')" wid 80bp__ at (J8, last "")
+] with .nw at last [].sw + (0,0.1)
- command "</g>" # end font
.PE
diff --git a/graphics/circuit_macros/examples/dpv/LT3724DPV.m4 b/graphics/circuit_macros/examples/dpv/LT3724DPV.m4
new file mode 100644
index 0000000000..21d4991aea
--- /dev/null
+++ b/graphics/circuit_macros/examples/dpv/LT3724DPV.m4
@@ -0,0 +1,88 @@
+.PS
+# LT3724.m4
+# https://pdf1.alldatasheet.com/datasheet-pdf/view/547351/LINER/LT3724.html
+
+cct_init
+include(icsDPV.m4)
+
+ linethick = 1.2
+
+svg_font(sans-serif,9bp__)
+
+define(`pinsep',`svg_baselineskip*2.5')
+define(`hght',`9*pinsep')
+define(`wdth',`0.6*hght')
+
+[
+ Q: LT3724
+
+ line left_ dimen_/2 from Q.SYNC; ground
+ line left_ dimen_/2 from Q.FSET
+ R7: resistor(down_ dimen_); rlabel(,"49.9 k"); ground(,T)
+ line left_ dimen_ from Q.VC
+ {dot; capacitor(down_ pinsep); llabel(,"120 p"); ground(,T)}
+ resistor(left_ dimen_*5/4); rlabel(,"10 k")
+ capacitor(down_ pinsep); llabel(,"680 p"); ground(,T)
+ line left_ dimen_/2 from Q.BURST_EN then down_ Q.BURST_EN.y-Q.VFB.y; dot
+
+ DL: dot(at Q.VFB-(dimen_*13/4,0))
+ resistor(down_ pinsep*2); llabel(,"14.7 k"); ground(,T)
+
+ line left_ dimen_/2 from Q.VIN then up_ Q.n.y-Q.VIN.y+dimen_/3; VINL: dot
+ line left_ dimen_*3/2 from Q.SHDN; dot
+ {resistor(down_ dimen_); rlabel(,"82.5 k"); H: ground(,T)
+ capacitor(left_ dimen_ from Q.CSS); rlabel(,"1000 p")
+ line to (Here,H); ground(,T)}
+ resistor(up_ to (Here,VINL)); rlabel(,"1 M"); dot
+ dot(at (Here.x-dimen_,Here.y))
+ {capacitor(down_ pinsep); {"22 svg_micro" at last [].e ljust}
+ line left_ dimen_}
+ dot(at (Here.x-dimen_,Here.y))
+ {capacitor(down_ pinsep); {"68 svg_micro" at last [].e ljust}
+ dot; ground}
+ VIN: (Here.x-dimen_/2,Here.y); {line invis left_ 60bp__ from VIN}
+ "V`'svg_sub(IN)" at VIN rjust
+ "36 V TO 60 V" at VIN+(0,-svg_baselineskip*1.2) rjust
+
+ line right_ dimen_/2 from Q.SGND; dot; ground(at (Here,R7.end),T)
+ line to (Here,Q.PGND) then to Q.PGND
+ dot(at Q.VCC+(dimen_/2,0))
+ { capacitor(down_ pinsep); llabel(,"1 svg_micro"); dot }
+ dot(at Here+(dimen_*3/4,0))
+ { reversed(`diode',to (Here,Q.SENSEM)); DV: dot}
+ { line to Q.VCC }
+ diode(right_ dimen_*2/3); DP: dot
+ { line to (Here,Q.BOOST) then to Q.BOOST }
+ capacitor(right_ dimen_); {"22 svg_micro" at last [].n above}
+ DZ: dot; reversed(`diode',down_ pinsep,Z); ground(,T)
+ "PDS5100H" at last [].w rjust below
+ resistor(right_ from Q.SW to (DP,Q.SW)); llabel(,"10")
+ line to (DZ,Here); dot
+ {up_; M1: mosfet(,,TEDSQuB) with .e at (DZ,Q.TG); "Si850DP" at M1.e ljust
+ line from M1.G to Q.TG}
+ line from DZ to M1.S
+ line from M1.D up_ VIN.y-M1.D.y then to VIN
+ inductor(right_ dimen_ from DZ); llabel(,"10 svg_micro"); dot
+ {line to (Here,Q.SENSEP) then to Q.SENSEP}
+ resistor(right_ dimen_); llabel(,"0.015"); DQ: dot
+ line from Q.VFB to DL-(dimen_/2,0)
+ resistor(down_ Here.y-R7.end.y+dimen_/2); llabel(,"130 k")
+ line to (DV,Here) then to DV
+ line from Q.SENSEM to (DQ,Q.SENSEM) then to DQ
+ { dot(at DQ+(dimen_/2,0))
+ capacitor(down_ pinsep); llabel(,"68 svg_micro"); ground(,T) }
+ { dot(at DQ+(dimen_*3/2,0))
+ capacitor(down_ pinsep); llabel(,"33 svg_micro"); ground(,T) }
+ line from DQ right_ dimen_*2.25; {line invis right_ 24bp__}
+ VOUT: Here
+ "V`'svg_sub(OUT)" at VOUT ljust
+ "12 V" at VOUT+(0,-svg_baselineskip*1.2) ljust
+ "50 W" at VOUT+(0,-svg_baselineskip*1.2*2) ljust
+
+ "High voltage step-down regulator" ljust at (M1.e.x+10bp__,Q.n.y) \
+ "48 V TO 12 V, 50 W" ljust
+ ]
+#showbox_
+
+command "</g>" # font
+.PE
diff --git a/graphics/circuit_macros/examples/dpv/LT3757DPV.m4 b/graphics/circuit_macros/examples/dpv/LT3757DPV.m4
new file mode 100644
index 0000000000..ab75d1a5b9
--- /dev/null
+++ b/graphics/circuit_macros/examples/dpv/LT3757DPV.m4
@@ -0,0 +1,274 @@
+.PS
+# LT3757DPV.m4
+# https://html.alldatasheet.com/html-pdf/349964/LINER/LT3757/1234/8/LT3757.html
+# https://en.wikipedia.org/wiki/Single-ended_primary-inductor_converter
+# https://www.analog.com/media/en/technical-documentation/data-sheets/lt3757-3757a.pdf
+#
+# This diagram does not contain much repetitive structure so the code is long
+# but straightforward.
+cct_init
+include(icsDPV.m4)
+ linethick = 1.2
+
+ifelse(1,1,`
+# This draws the symbolic chip with external circuitry
+svg_font(sans-serif,9bp__)
+
+define(`pinsep',`svg_baselineskip*2.5')
+define(`hght',`9*pinsep')
+define(`wdth',`0.6*hght')
+
+Q1: LT3757
+
+ resistor(down_ dimen_*3/4 from Q1.VC); llabel(,22 k)
+ capacitor(down_ dimen_/2); llabel(6.8 nF); GNDL: dot
+ line from Q1.SS left_ dimen_/2; continue down_ to (Here,Q1.VC)
+ capacitor(to (Here,GNDL)); llabel(0.1 svg_micro`'F); dot
+ up_; M1: mosfet(,,TEDSQuB) with .G at Q1.GATE
+ dot(at (M1.S,Q1.SENSE)); {line to Q1.SENSE}; line from M1.S to (M1.S,Q1.VC)
+ resistor(down_ to (Here,GNDL)); llabel(,0.01 svg_ohm); dot
+ line from Q1.GND to (Q1.GND,GNDL); dot
+ capacitor(down_ from Q1.INTVCC to (Q1.INTVCC,GNDL))
+ llabel(,"4.7 svg_micro(F)" ljust "10 V" ljust "X5R" ljust); dot
+ ground
+ line up_ dimen_/3 from M1.D; DD: dot
+ diode(right_ dimen_,Z); DE: dot
+ { resistor(down_ to (Here,Q1.FBX)); llabel(,"226 k")
+ line to(Here,Q1.VC); resistor(to (Here,GNDL)); llabel(,"16.2 k"); dot }
+ dot(at Here+(dimen_,0))
+ { capacitor(down_ to (Here,GNDL),C+);
+ llabel(,"47 svg_micro(F)" ljust "35 V" ljust "x2"); dot }
+ dot(at Here+(dimen_,0))
+ { capacitor(down_ to (Here,GNDL));
+ llabel(,"10 svg_micro(F)" ljust "25 V" ljust "X5R"); GG: dot; ground }
+ line from DE to Here+(dimen_/2,0); {line invis right dimen_}
+ "V`'svg_sub(OUT)" ljust at Here+(2bp__,5bp__) "24 V" ljust "2 A" ljust
+ line from Q1.RT left_ dimen_; continue down_ to (Here,Q1.VC)
+ resistor(to (Here,GNDL)); rlabel(,"41.2 k" rjust "300 kHz" rjust)
+ line to GG
+ line from Q1.VIN up_ dimen_/3; dot
+ dot(at (Q1.w,Here)-(dimen_,0))
+ {resistor(down_ to (Here,Q1.SHU)); llabel(,"200 k"); dot; {line to Q1.SHU}
+ resistor(down_ to (Here,Q1.SYNC)); llabel(,"43.2 k"); dot
+ {line to Q1.SYNC}; ground }
+ dot(at Here-(dimen_,0))
+ {capacitor(down_ to (Here,Q1.SHU))
+ llabel(,"10 svg_micro(F)" ljust "25 V" ljust "X5R" ljust); ground }
+ VIN: Here+(-dimen_/2,0); {line invis left_ 70bp__}
+ {"V`'svg_sub(IN)" at VIN rjust "8 V TO 16 V" rjust}
+ line from VIN to (DD,VIN); inductor(down_ to DD); llabel(,"10 svg_micro(H)")
+
+ "High efficiency" ljust below at (DE,Q1.n) "boost converter" ljust
+
+ command "</g>" # end font
+',`
+# The operational diagram of the chip interior with external circuitry
+maxpswid = 10
+
+ textht = 5bp__
+ lw = dimen_/4
+
+ define(`Pin',`P`'in`$1': box wid dimen_/3 ht dimen_/3 "`$1'" fill_(1)')
+
+ boardw = 13.5
+ boardh = 14
+ Board: box thick 2 wid boardw*dimen_ ht boardh*dimen_
+ define(`coord',`Board.sw+(`$1',`$2')*dimen_')
+ A11: opamp at coord(2.5,boardh-5)
+ LH_symbol(,wdth=0.5) at A11.C; "A11" at A11.NE above ljust
+ A12: opamp at A11+(0,-A11.ht*5/4); LH_symbol(,wdth=0.5) at A12.C
+ "A12" at A12.NE above ljust
+ D1112: dot(at (A11.In2.x-lw,(A11.y+A12.y)/2))
+ line from A11.In2 to (D1112,A11.In2) then to (D1112,A12.In1) then to A12.In1
+ G6: OR_gate with .w at (A11.Out.x+3*L_unit,(A11.y+A12.y)/2); {"G6" at G6}
+ line from G6.In1 left_ lw*5/4 then up A11.Out.y-G6.In1.y then to A11.Out
+ line from G6.In2 left_ lw*5/4 then up A12.Out.y-G6.In2.y then to A12.Out
+ line left_ lw from A11.In1; { "1.72 V" rjust }
+ line left_ lw from A12.In2; { "-0.88 V" rjust }
+
+ up_; Q3: bi_tr(,R) with .C at G6.Out+(3*lw,A11.ht*2)
+ "Q3" at Q3.ne above rjust
+ ground(at Q3.E); line up_ lw then left_ lw from Q3.C; Q3C: dot
+ S2: source(down_ elen_ with .end at Q3C,G); "2.5 V" at S2.n above
+ rlabel(,"S2"); larrow; "10 svg_micro(A)" at last arrow ljust
+ left_; G4: OR_gate(3) with .Out at Q3.B+(lw,0); line from G4.Out to Q3.B
+ G3: NAND_gate with .Out at G4.In2+(lw*3/2,0); line from G3.Out to G4.In2
+ line from G3.In2 right_ lw then up_ A11.Out.y-G6.In1.y # then right_ lw
+ left_; A9: opamp with .Out at Here
+ left_; A8: opamp at A9-(0,A9.ht*5/4); LH_symbol(,wdth=0.5) at A8.C
+ "A8" at A8.SE above rjust
+ line from G3.In1 to (A8.Out,G3.In1) then to A8.Out
+ D89: dot(at (A9.In2.x+lw,(A9.y+A8.y)/2))
+ line from A9.In1 to (D89,A9.In1) then to (D89,A8.In2) then to A8.In2
+ line from A9.In2 right_ lw; "17.5 V" ljust above at A9.In2
+ line from A8.In1 right_ lw;"2.7 V UP" ljust "2.6 V DOWN" ljust
+
+ line from G4.In1 right_ lw then down_ 3/2*G3.ht then right_ lw
+ box wid boxwid*2/3 ht boxht*2/3 "TSD" "165 svg_deg`'C"
+
+ D8: dot(at D89+(boxwid*1.75,0))
+ down_; INTVcc: mosfet(,R,TEDSQdB) with .D at D8+(0,lw)
+ B72: box ht boxht/3 "7.2 V LDO" with .e at INTVcc.G
+ dot(at (B72,D89)); line to B72.s; line from D8 to INTVcc.D
+ Pin(8) at (Board.e,D8); "INTV`'svg_sub(CC)" at Pin8.n+(0,2bp__) above rjust
+ line from D89 to Pin8.w
+ line from B72.n up_ lw/2
+ CL: box ht boxht*2/3 "CURRENT" "LIMIT" with .s at Here
+ line from CL.e to (INTVcc.S,CL); dot
+
+ line from G4.In3 right_ lw then up_ CL.n.y-G4.In3.y-boxht/2+lw
+ UVLO: box "INTERNAL" "REGULATOR" "AND UVLO" with .s at Here
+ "UVLO" at UVLO.sw below ljust
+ line from UVLO.e to (D8,UVLO.e); dot
+ Pin(10) at (Here,Board.n); "V`'svg_sub(IN)" at Pin10.se below ljust
+ line from INTVcc.S to Pin10.s
+
+ line up_ 2*lw from UVLO.n; DUV: dot; left_
+ A10: opamp(,,,,R) at (UVLO.e,Here); LH_symbol at A10.C
+ "A10" at A10.SE above rjust
+ line from A10.In1 right_ lw; "1.22 V" ljust
+ arrow from A10.Out left A10.Out.x-UVLO.w.x+lw
+ S1: source(down_ elen_ with .c at Here+(-dimen_/6,0),G)
+ rarrow; "I`'svg_sub(S1)" rjust at last arrow above "2 svg_micro(A)" rjust
+ ground(at S1.end,T)
+ line from A10.In2 right_ lw then up_ S1.start.y-A10.In2.y
+ dot; { "SHDN/UVLO" at last [].e ljust }
+ { line from last [].e+(textoffset,3bp__) right_ 16bp__ }
+ { line to S1.start }
+ { Pin(9) at (Here,Board.n)}; line to Pin9.s
+
+ right_; A7: opamp with .n at (UVLO.x,G6.y-lw); "VC" at A7.nw rjust
+ line from A7.Out right_ A8.Out.x-A7.Out.x+lw
+ G5: OR_gate(3) with .In2 at Here
+ line from G5.In1 left_ lw then up G6.Out.y-G5.In1.y then to G6.Out; right_
+ G2: opamp(right_ dimen_,"","") with .NE at (D8.x,G5.y+A9.ht/4)
+ ground(at G2.SE)
+ Pin(7) at (Board.e,G2); "GATE" at Pin7.n above rjust
+ line from G2.E to Pin7.w; line from D8 to G2.NE
+ line from G2.w left_ dimen_*2/3
+ SR1: box ht G2.ht wid boxwid*2/3; "SR1" at SR1.n above
+ "R" at SR1.w ljust; "O" at SR1.e rjust; "S" at SR1.s above
+ line right_ from G5.Out to SR1.w
+
+ Pin(3) at (Q3C,Board.s); line from Q3C to Pin3.n; "SS" at Pin3.ne above ljust
+ D67: dot(at (G6.Out+(lw,0),A7.In1)); line to A7.In1
+ dot(at (Q3C.x,D67.y-dimen_)); down_
+ Q2: bi_tr(,R,P) with .B at Here; ground(at Q2.C); "Q2" at Q2.e ljust
+ line from Q2.E to (Q2.E,A7.In1); dot
+
+ A1: opamp(right_ dimen_,,,,R) at A12+(0,-3/2*dimen_); T1: dot(at (D67,A1))
+ A2: opamp(right_ dimen_,,,,R) at A1+(0,-A1.ht*5/4)
+ D12: dot(at (A1.w.x-lw,(A1.y+A2.y)/2))
+ Pin(2) at (Board.w,D12); line from Pin2.e to D12; "FBX" at Pin2.ne above ljust
+ line from A1.In2 to (D12,A1.In2) then to (D12,A2.In1) then to A2.In1
+ line from A1.In1 left_ lw; "1.6 V" rjust
+ line from A2.In2 left_ lw; "-0.8 V" rjust
+
+ Pin(1) at (Board.w,Q3C); "V`'svg_sub(CC)" at Pin1.ne above ljust
+ S3: source(down_ elen_ at ((Board.w+Pin3)/2,S2),G);rlabel(,"S3")
+ larrow("I`'svg_sub(S3)")
+ "2.5 V" at S3.start above; line from S3.end to (S3,Pin1); dot
+
+ diode(from T1 to A1.Out)
+ D2: diode(from (T1,A2) to A2.Out)
+ line from D2.start to (D2.start,Pin1) then to Pin1.e
+
+ left_; A6: opamp(,,,,R) with .Out at (SR1,A1)
+ A5: opamp at (A6,A6+(0,-A6.ht*5/4))
+ line from A6.In2 right_ lw; "108 mV" ljust
+ line from A5.In2 right_ lw; { dot; line to (Here,A6.In1) then to A6.In1 }
+ {Pin(6) at (Board.e,Here)}; line to Pin6.w; "SENSE" at Pin6.n above rjust
+ line from A5.In1 right_ lw then down_ dimen_
+ dot; ground; {Pin(11) at (Board.e,Here)}; line to Pin11.w
+ "GND" at Pin11.n above rjust
+ line from G5.In3 left_ lw then down G5.In3.y-A6.y then to A6.Out
+
+ Summer: circle rad 0.15 "svg_Sigma" with .w at (G5.Out,A5)
+ line from A7.In2 left lw then down_ A7.In2.y-Summer.y then to Summer.w
+ line from Summer.e to A5.Out
+ "V`'svg_sub(ISENSE)" at Summer.ne above ljust; "SLOPE" at Summer.nw above rjust
+ "RAMP" at Summer.sw below rjust
+ line down_ 2*lw from Summer.s
+ box ht boxht*2/3 with .n at Here "RAMP" "GENERATOR"
+ {[ line for_(1,3,1,`up_ dimen_/4 right_ dimen_/6 then down_ dimen_/4 then') \
+ up_ dimen_/4 right_ dimen_/6 ] with .sw at last box.n+(lw/2,lw/2)}
+ line down_ lw*3/2
+ OSC: box ht boxht*2/3 \
+ "100 kHZ-1 MHZ" "OSCILLATOR"
+ {[line right_ dimen_/2; [for_(1,4,1,`line from (m4x*dimen_/10,0) \
+ up_ dimen_/4')] with .s at last line ] with .sw at OSC.n+(lw/2,2bp__)}
+ line right_ from OSC.e to (SR1,OSC.e) then to SR1.s
+ G1: OR_gate with .Out at OSC.w+(-2*lw,0); line from G1.Out to OSC.w
+ A3: opamp with .Out at G1.In1+(-lw,0); line from A3.Out to G1.In1
+ line left_ lw from A3.In1; "1.25 V" rjust
+
+ line from OSC.s down_ A2.ht*3/4; up_
+ Q1: bi_tr with .C at Here; right_
+ A4: opamp(,,,,R) with .E at Q1.B; "+" at A4.w +(4pt__,0)
+ "FREQ" at A4.SE+(0,-lw) below ljust "PROG" ljust
+ line from A4.In2 left lw then down_ A4.ht/2; continue to (Q1.E,Here); dot
+ {Pin(4) at (Here,Board.s); "R`'svg_sub(T)" at Pin4.ne above ljust};
+ line from Q1.E to Pin4.n
+ line from A4.In1 left_ lw; "1.25 V " above
+ Pin(5) at (A4.w.x-3*lw,Board.s.y); "SYNC" at Pin5.ne above ljust
+ line from Pin5.n to (Pin5,G1.In2) then to G1.In2
+ line from A3.In2 left_ lw; continue to (Here,A4.w) then to A4.w
+ "FREQ" at (A3.In2.x-lw,A4.w.y+dimen_/2) ljust above "FOLD" ljust "BACK" ljust
+
+ D3: dot(at A3.In2-(lw,0)); right_
+ FFB: box ht boxht*2/3 "FREQUENCY" "FOLDBACK" at (A2,D3); line to D3
+ DFFB: dot(at Pin2.e+(2*lw,0))
+ line from FFB.w to (DFFB,FFB); continue to (Here,D1112) then to D1112
+ DF: dot(at (DFFB,FFB)); line down_ boxht
+ resistor(right_ elen_); llabel(,"R5") rlabel(,"8 k")
+ diode(right_ dimen_/3); llabel(,"D2")
+ reversed(`diode',right_ dimen_*2/3,Z); llabel(,"D3"); ground
+
+ foreach_(`gate',`"gate" at gate.C',A1,A2,A3,A4,A5,A6,A7,A9,G1,G2,G3,G4,G5)
+
+ line from Pin9.n up_ dimen_*2/3; dot
+ {resistor(left_ dimen_); rlabel(,"R4"); ground}
+ resistor(right_ dimen_); llabel(,"R3"); line up_ dimen_/2; VCC: dot
+ dot(at Here+(dimen_/2,0)); {capacitor(down_ dimen_/2,C+)
+ llabel(,"C`'svg_sub(IN)"); ground(,T)}
+ L1D: dot(at (Pin10,Here)); {line to Pin10.n}; {line to (Board.n,Here)
+ "V`'svg_sub(IN)" rjust}
+
+ line from Pin8.e right_ dimen_/4; capacitor(down_ dimen_/3)
+ {"C`'svg_sub(VCC)" at Pin8.ne ljust above}; ground
+ up_; M1: mosfet(,,TEDSQuB) with .G at Pin7.e; "M1" at M1.n above
+ inductor(right_ from L1D to (Board.e.x+lw,L1D.y),,,M); llabel(,"L1"); DL1: dot
+ line down_ 3*dimen_; continue to (M1.D,Here) then to M1.D
+ line from M1.S to (M1.S,Pin6); dot; {line to Pin6.e}
+ resistor(down_ to (Here,Pin11)); llabel(,"R`'svg_sub(SENSE)"); dot
+ ground; line to Pin11.e
+
+ capacitor(from DL1 right_ dimen_/2); llabel(,"C`'svg_sub(DC)"); T2: dot
+ diode(right_ dimen_,Z); { line right_ dimen_; "V`'svg_sub(OUT)" above}
+ dot(at Here+(dimen_/2,0)); line down_ lw; dot;
+ P3: parallel_(`Sep=dimen_*2/3; capacitor(down_ elen_)
+ rlabel("C`'svg_sub(OUT2)"); line down_ elen_/3',
+ `line down_ elen_/3; capacitor(down_ elen_*2/3,C)
+ llabel("C`'svg_sub(OUT1)")',
+ `resistor(down_ elen_*2/3); llabel(,"R2"); dot
+ { line left_ lw; "FBX" above }
+ R1: resistor(down_ elen_*2/3); llabel(,"R1"); dot')
+ dot; ground
+ inductor(from T2 to (T2,P3.E3.R1.end),,,M); rlabel(,"L2")
+ line to P3.E3.R1.end
+
+ resistor(from Pin4.s down_ dimen_*2/3); llabel(,"R`'svg_sub(T)"); ground(,T)
+ capacitor(from Pin3.s down_ dimen_*2/3); llabel(,"C`'svg_sub(SS)"); ground(,T)
+ line from Pin2.w left_ lw; "FBX" rjust
+ TV: dot(at Pin1-(dimen_/2,0))
+ resistor(down_ dimen_*2/3); llabel(,"R`'svg_sub(C)")
+ capacitor(down_ dimen_*2/3); llabel("C`'svg_sub(C1)"); dot; ground
+ line left_ dimen_*0.6
+ capacitor(down_ from (Here,TV) to Here); llabel("C`'svg_sub(C2)")
+ line from Pin1.w to last line.start
+
+ move to Board.se+(5bp__,20bp__)
+ "LT3757 block diagram" ljust "working as a" ljust "SEPIC converter" ljust
+')
+
+.PE
diff --git a/graphics/circuit_macros/examples/dpv/Makefile b/graphics/circuit_macros/examples/dpv/Makefile
index f9e04756c7..78303674c5 100644
--- a/graphics/circuit_macros/examples/dpv/Makefile
+++ b/graphics/circuit_macros/examples/dpv/Makefile
@@ -86,7 +86,8 @@ CCTDPV = \
ex01DPV.svg ex02DPV.svg ex03DPV.svg ex04DPV.svg ex05DPV.svg ex06DPV.svg \
ex08DPV.svg ex09DPV.svg ex10DPV.svg ex11DPV.svg ex12DPV.svg \
ex15DPV.svg ex16DPV.svg ex18DPV.svg ex21DPV.svg \
- expDPV.svg fetDPV.svg graysurfDPV.svg keyboardDPV.svg lcctDPV.svg \
+ expDPV.svg fetDPV.svg graysurfDPV.svg keyboardDPV.svg \
+ lcctDPV.svg LT3757DPV.svg \
pwrsupplyDPV.svg quickDPV.svg randomDPV.svg recycleDPV.svg relaycoilDPV.svg \
roseDPV.svg sfgDPV.svg shapesDPV.svg SmithchartDPV.svg paletteDPV.svg \
thyristorDPV.svg ujtDPV.svg UNODPV.svg wormDPV.svg XORDPV.svg Np.svg
diff --git a/graphics/circuit_macros/examples/dpv/SwitchesDPV.m4 b/graphics/circuit_macros/examples/dpv/SwitchesDPV.m4
index 47b8edbea9..dfff0e3a6f 100644
--- a/graphics/circuit_macros/examples/dpv/SwitchesDPV.m4
+++ b/graphics/circuit_macros/examples/dpv/SwitchesDPV.m4
@@ -141,7 +141,7 @@ movewid = 0.25
"svg_tt(`circle=\"M\")')" ljust}
move right_
dswitch(,,WBcDIGC,circle="M")
- {"svg_tt(`(,,WBcDIGC,')" ljust at last line.start+(0,-15bp__) \
+ {"svg_tt(`(,,WBcDIGC,')" wid 72bp__ ljust at last line.start+(0,-15bp__) \
"svg_tt(`circle=\"M\")')" ljust}
}
diff --git a/graphics/circuit_macros/examples/dpv/UNODPV.m4 b/graphics/circuit_macros/examples/dpv/UNODPV.m4
index 3e5fb11e93..1ea032520d 100644
--- a/graphics/circuit_macros/examples/dpv/UNODPV.m4
+++ b/graphics/circuit_macros/examples/dpv/UNODPV.m4
@@ -56,7 +56,7 @@ define(`HeaderPin',`
define(`ATMEGA16U2',`[
Chip: box wid 10*lg_pinsep ht 25*lg_pinsep
- Loopover_(`x',
+ foreach_(`x',
`Arightpin(patsubst(x,;,`,'))',
6;PD0, 7;PD1, 8;PD2, 9;PD3, 10;PD4, 11;PD5, 12;PD6, 13;PD7,
131;nul,
@@ -64,7 +64,7 @@ define(`ATMEGA16U2',`[
132;nul,
133;nul,
14;PB0, 15;PB1, 16;PB2, 17;PB3, 18;PB4, 19;PB5, 20;PB6, 21;PB7)
- Loopover_(`x',
+ foreach_(`x',
`Aleftpin(patsubst(x,;,`,'))',
33;PAD,
100;nul,
@@ -91,14 +91,14 @@ define(`Arightpin',`move to Chip.se+(0,m4Lx*lg_pinsep)
define(`ATMEGA328P',`[
Chip: box wid 10*lg_pinsep ht 23*lg_pinsep
- Loopover_(`x',
+ foreach_(`x',
`Arightpin(patsubst(x,;,`,'))',
2;PD0, 3;PD1, 4;PD2, 5;PD3, 6;PD4, 11;PD5, 12;PD6, 13;PD7,
100;nul,
23;PC0, 24;PC1, 25;PC2, 26;PC3, 27;PC4, 28;PC5,
101;nul,
14;PB0, 15;PB1, 16;PB2, 17;PB3, 18;PB4, 19;PB5)
- Loopover_(`x',
+ foreach_(`x',
`Aleftpin(patsubst(x,;,`,'))',
201;nul, 202;nul, 203;nul, 204;nul, 205;nul, 206;nul, 207;nul, 208;nul,
209;nul,
@@ -204,7 +204,7 @@ divert(0)dnl
USB: [ K: box invis wid dimen_/2 ht 5*lg_pinsep
"USB" rjust at K.e
line thick 1.5 from K.nw to K.ne then to K.se then to K.sw
- Loopover_(`x',
+ foreach_(`x',
`Pin`'m4Lx: K.ne-(0,m4Lx/5*K.ht)
"x" at Pin`'m4Lx ljust above',
1 XUSB, 2 D`'svg_it(-), 3 D`'svg_it(+), 4 UGND)
@@ -282,7 +282,7 @@ USB: [ K: box invis wid dimen_/2 ht 5*lg_pinsep
continue to (Here,ICSP1.P2.end) then to ICSP1.P2.end
line from ICSP1.P5.end down 2*del; continue to (TPPB6.x+2*del,Here.y)
TRESET2: Here
- continue to (Here.x,D3.end.y+del) then to (RN1C.end.x-2.5*del,D3.end.y+del)
+ continue to (Here.x,D3.end.y+del) then to (RN1C.end.x-2*del,D3.end.y+del)
continue to (Here,U3.Pin24) then to U3.Pin24.end
G4: ground(at ICSP1.P6.end,,E); {"GND" at last line.c below }
line from ICSP1.P4.end right del then up U3.Pin16.y-ICSP1.P4.y \
diff --git a/graphics/circuit_macros/examples/dpv/diamondDPV.m4 b/graphics/circuit_macros/examples/dpv/diamondDPV.m4
index 3c5e0f5bfe..a11a413e0b 100644
--- a/graphics/circuit_macros/examples/dpv/diamondDPV.m4
+++ b/graphics/circuit_macros/examples/dpv/diamondDPV.m4
@@ -1,24 +1,28 @@
.PS
-# diamond.m4
-# See LaTeX Graphics Companion pp 57-58
+# diamondDPV.m4
gen_init
-dimen = 1.5*scale
-ratio = 0.9
-n = 30
+NeedDpicTools
+# See LaTeX Graphics Companion pp 57-58 and
+# https://tex.stackexchange.com/questions/730392/rotating-triangle
+ifdpic(`
+ dimen = 1.3
+ ratio = 0.9
+ n = 30
-North: (0,dimen)
-East: (dimen,0)
-South: (0,-dimen)
-West: (-dimen,0)
-
-define(`square',
- `shade(`$1',
- line from North to East then to South then to West then to North)
- ')
+ North: (0,dimen)
+ East: (dimen,0)
+ South: (0,-dimen)
+ West: (-dimen,0)
define(`diamond',`[
for i = 2 to n do {
- square(`$1')
+ ifelse(`$1',,
+ `hsvtorgb(hue,1,1,r0,g0,b0)
+ line from North to East then to South then to West then to North \
+ shaded rgbstring(r0,g0,b0)
+ hue = hue+360/(n-1)',
+ `shade(`$1',
+ line from North to East then to South then to West then to North)')
Tmp: North
North: ratio between East and North
East: ratio between South and East
@@ -26,9 +30,27 @@ for i = 2 to n do {
West: ratio between Tmp and West
}]')
-linethick = 0
-diamond( i % 2 )
-linethick = 0.4
-diamond( (n-i)/(n-2) ) with .w at last [].e+(0.25,0)
+define(`triangle',`[
+for i = 2 to n do {
+ hue = 180+(i-2)/(n-1)*360
+ hsvtorgb(hue,1,1,r0,g0,b0)
+ line from North to East then to West then to North shaded rgbstring(r0,g0,b0)
+ Tmp: North
+ North: ratio between East and North
+ East: ratio between West and East
+ West: ratio between Tmp and West
+ }]')
+
+ linethick = 0.4
+ diamond( (n-i)/(n-2) )
+ hue = 0
+ diamond with .w at last [].e+(0.125,0)
+ North: (0,dimen*sqrt(3)/2)
+ East: (dimen,-dimen*sqrt(3)/2)
+ West: (-dimen,-dimen*sqrt(3)/2)
+ hue = 180
+ triangle with .w at last [].e
+',
+`box "diamond.m4" "requires" "dpic"')
.PE
diff --git a/graphics/circuit_macros/examples/dpv/examplesDPV.htmx b/graphics/circuit_macros/examples/dpv/examplesDPV.htmx
index 3406d8ec8a..93de48b0ad 100644
--- a/graphics/circuit_macros/examples/dpv/examplesDPV.htmx
+++ b/graphics/circuit_macros/examples/dpv/examplesDPV.htmx
@@ -184,7 +184,8 @@ There are other issues:
m4tt`'target="_blank"</g> unless
arg 3 = B)
<li>m4tt svgLinkString</g> as above but for strings attached to objects
- <li> Greek and other symbols:
+ <li> Greek and other symbols (typically of the form &#nnn; so care is
+ required when used in a macro argument):
<!--
Reference:
@@ -529,6 +530,9 @@ cfig(TubediagsDPV,
from F. Langford-Smith`,' <i>Radiotron Designers Handbook</i>`,' fourth
edition`,' Harrison`,' NJ: Radio Corporation of America`,' 1952)
+cfig(LT3757DPV,
+ LT3757 controller)
+
cfig(UNODPV,
An Arduino UNO circuit adapted and redrawn)
@@ -575,7 +579,7 @@ cfig(ABlogixDPV,
The m4tt`'Autologix</g> macro can draw inputs on the left but
the added drawing complexity may require hand tuning with
second-argument options: m4tt`'L</g> puts the inputs on the left`,'
- m4tt`'R reverses their order`,' m4tt`'V</g> scans the input arguments
+ m4tt`'R</g> reverses their order`,' m4tt`'V</g> scans the input arguments
in reverse order`,' and m4tt`'offset=</g>`'<i>value</i> displaces
the array of inputs)
diff --git a/graphics/circuit_macros/examples/dpv/examplesDPVs.htmx b/graphics/circuit_macros/examples/dpv/examplesDPVs.htmx
index 96a572b462..db28ee632f 100644
--- a/graphics/circuit_macros/examples/dpv/examplesDPVs.htmx
+++ b/graphics/circuit_macros/examples/dpv/examplesDPVs.htmx
@@ -174,7 +174,8 @@ There are other issues:
m4tt`'target="_blank"</g> unless
arg 3 = B)
<li>m4tt svgLinkString</g> as above but for strings attached to objects
- <li> Greek and other symbols:
+ <li> Greek and other symbols (typically of the form &#nnn; so care is
+ required when used in a macro argument):
<!--
Reference:
diff --git a/graphics/circuit_macros/examples/dpv/icsDPV.m4 b/graphics/circuit_macros/examples/dpv/icsDPV.m4
index e0acaa8661..99a117a67e 100644
--- a/graphics/circuit_macros/examples/dpv/icsDPV.m4
+++ b/graphics/circuit_macros/examples/dpv/icsDPV.m4
@@ -77,28 +77,28 @@ define(`ic74LS138',`[ Chip: box wid_ lg_chipwd ht_ 11*lg_pinsep
`$1']')
define(`ic4017',`[ Chip: DIP_chip_outline(16)
- Loopover_(`x',
+ foreach_(`x',
`lg_pin(Chip.nw-(0,lg_pinsep*m4Lx),x,Pin`'m4Lx,w,m4Lx)',
PL, Q3, I3, I0, CLE, Q0, TC, GND)
- Loopover_(`x',
+ foreach_(`x',
`lg_pin(Chip.se+(0,lg_pinsep*m4Lx),x,Pin`'eval(m4Lx+8),e,eval(m4Lx+8))',
MR, U/D, Q1, I1, I2, Q2, CLK, Vcc)
`$1']')
define(`ic4510',`[ Chip: DIP_chip_outline(16)
- Loopover_(`x',
+ foreach_(`x',
`lg_pin(Chip.nw-(0,lg_pinsep*m4Lx),x,Pin`'m4Lx,w,m4Lx)',
PL, Q3, I3, I0, CLE, Q0, TC, GND)
- Loopover_(`x',
+ foreach_(`x',
`lg_pin(Chip.se+(0,lg_pinsep*m4Lx),x,Pin`'eval(m4Lx+8),e,eval(m4Lx+8))',
MR, U/D, Q1, I1, I2, Q2, CLK, Vcc)
`$1']')
define(`icVS1053',`[ Chip: DIP_chip_outline(32)
- Loopover_(`x',
+ foreach_(`x',
`lg_pin(Chip.nw-(0,lg_pinsep*m4Lx),x,Pin`'m4Lx,w,m4Lx)',
LOUT,ROUT,GBUF,AGND,AGND,DREG,Vcc,3V3,GND,MISO,MOSI,sclk,RST,CS,DCS,DCS)
- Loopover_(`x',
+ foreach_(`x',
`lg_pin(Chip.se+(0,lg_pinsep*m4Lx),x,Pin`'eval(m4Lx+16),e,eval(m4Lx+16))',
SDCD,RX,TX,7,6,5,4,3,2,1,0,GND,3V3,AGND,MIC`'svg_it(-),MIC`'svg_it(+))
`$1']')
@@ -111,16 +111,16 @@ define(`ArduinoUno',`[
Connector: box wid m4bwid ht m4bht
#
- plen = ifelse(`$4',,`2*L_unit',`$4')
+ m4pl = ifelse(`$3',,`2*L_unit',`$3')
#
-Loopover_(`x',`ifelse(x,nul,,
- `Pin`'eval(5+m4Lx): line left_ plen from Connector.nw-(0,(5+m4Lx)*lg_pinsep)
+foreach_(`x',`ifelse(x,nul,,
+ `Pin`'eval(5+m4Lx): line left_ m4pl from Connector.nw-(0,(5+m4Lx)*lg_pinsep)
{ "x" ljust at last line.start }')',
IOREF, RESET,svg_it(+)3V3,svg_it(+)5V, GND, GND, VIN,
nul, A0, A1, A2, A3, A4, A5)
#
-Loopover_(`x',`ifelse(x,nul,,
- `Pin`'eval(22-m4Lx): line right_ plen from Connector.ne-(0,m4Lx*lg_pinsep)
+foreach_(`x',`ifelse(x,nul,,
+ `Pin`'eval(22-m4Lx): line right_ m4pl from Connector.ne-(0,m4Lx*lg_pinsep)
{ "x" rjust at last line.start }')',
SCL, SDA, AREF, GND, D13, D12, ~D11, ~D10, ~D9, D8,
nul, D7, ~D6, ~D5, D4, ~D3, D2, TX D1, RX D0)
@@ -134,16 +134,16 @@ define(`ArduinoLeonardo',`[
#
Connector: box wid m4bwid ht m4bht
#
- plen = ifelse(`$4',,`2*L_unit',`$4')
+ m4pl = ifelse(`$3',,`2*L_unit',`$3')
#
-Loopover_(`x',`ifelse(x,nul,,
- `Pin`'eval(5+m4Lx): line left_ plen from Connector.nw-(0,(5+m4Lx)*lg_pinsep)
+foreach_(`x',`ifelse(x,nul,,
+ `Pin`'eval(5+m4Lx): line left_ m4pl from Connector.nw-(0,(5+m4Lx)*lg_pinsep)
{ "x" ljust at last line.start }')',
IOREF, RESET,svg_it(+)3V3,svg_it(+)5V, GND, GND, VIN,
nul, A0, A1, A2, A3, A4, A5)
#
-Loopover_(`x',`ifelse(x,nul,,
- `Pin`'eval(22-m4Lx): line right_ plen from Connector.ne-(0,m4Lx*lg_pinsep)
+foreach_(`x',`ifelse(x,nul,,
+ `Pin`'eval(22-m4Lx): line right_ m4pl from Connector.ne-(0,m4Lx*lg_pinsep)
{ "x" rjust at last line.start }')',
SCL, SDA, AREF, GND,
~D13, D12, ~D11, ~D10, ~D9, D8,
@@ -157,15 +157,15 @@ define(`RPi',`[
define(`m4bht',`ifelse(`$2',,`21*lg_pinsep',`$2')')dnl
#
GPIO: box wid m4bwid ht m4bht
- plen = ifelse(`$4',,`6*L_unit',`$4')
+ m4pl = ifelse(`$3',,`6*L_unit',`$3')
#
define A_LeftGPIO {
- exec sprintf("Pin%g: line left_ plen from GPIO.nw-(0,%g)",\
+ exec sprintf("Pin%g: line left_ m4pl from GPIO.nw-(0,%g)",\
2*(`$'1)-1,(`$'1)*lg_pinsep)
{ "`$'3" ljust at last line.start }
"`$'2" at last line.c above }
#
-Loopover_(`x',`ifelse(x,nul,,`A_LeftGPIO(m4Lx,patsubst(x,;,`,'))')',
+foreach_(`x',`ifelse(x,nul,,`A_LeftGPIO(m4Lx,patsubst(x,;,`,'))')',
;3V3,
2;SDA1, 3;SCL1, 4;GPIO_GCLK,
;GND,
@@ -180,12 +180,12 @@ Loopover_(`x',`ifelse(x,nul,,`A_LeftGPIO(m4Lx,patsubst(x,;,`,'))')',
;GND )
#
define A_RightGPIO {
- exec sprintf("Pin%g: line right_ plen from GPIO.ne-(0,%g)",\
+ exec sprintf("Pin%g: line right_ m4pl from GPIO.ne-(0,%g)",\
2*(`$'1),(`$'1)*lg_pinsep)
{ "`$'3" rjust at last line.start }
"`$'2" at last line.c above }
#
-Loopover_(`x',`ifelse(x,nul,,`A_RightGPIO(m4Lx,patsubst(x,;,`,'))')',
+foreach_(`x',`ifelse(x,nul,,`A_RightGPIO(m4Lx,patsubst(x,;,`,'))')',
;5V,
;5V,
;GND,
@@ -209,17 +209,17 @@ define(`USB_C_Socket',`[
define(`m4bht',`ifelse(`$2',,`14*lg_pinsep',`$2')')dnl
#
Base: box wid m4bwid ht m4bht rad 5/3*lg_pinsep
- plen = ifelse(`$4',,`6*L_unit',`$4')
+ m4pl = ifelse(`$3',,`6*L_unit',`$3')
#
- Loopover_(`x',
+ foreach_(`x',
`B`'eval(13-m4Lx): dnl
- line left_ plen from Base.n-(m4bwid/2,(m4Lx+0.5)*lg_pinsep)
+ line left_ m4pl from Base.n-(m4bwid/2,(m4Lx+0.5)*lg_pinsep)
{"x" ljust at last line.start}',
GND, RX1`'svg_it(+), RX1`'svg_it(-), VBUS, SBU2, D`'svg_it(-),
D`'svg_it(+), CC2, VBUS, TX2`'svg_it(-), TX2`'svg_it(+), GND)
#
- Loopover_(`x',
- `A`'m4Lx: line right_ plen from Base.n+(m4bwid/2,-(m4Lx+0.5)*lg_pinsep)
+ foreach_(`x',
+ `A`'m4Lx: line right_ m4pl from Base.n+(m4bwid/2,-(m4Lx+0.5)*lg_pinsep)
{"x" rjust at last line.start}',
GND, TX1`'svg_it(+), TX1`'svg_it(-), VBUS, CC1, D`'svg_it(+),
D`'svg_it(-), SBU1, VBUS, RX2`'svg_it(-), RX2`'svg_it(+), GND)
@@ -235,26 +235,26 @@ define(`HDMI_micro',`[
then right m4bwid/3 down m4bwid/3 \
then down m4bht-2*m4bwid/3 then down m4bwid/3 left m4bwid/3 \
then left m4bwid*2/3 then to Here]
- plen = ifelse(`$4',,`6*L_unit',`$4')
+ m4pl = ifelse(`$3',,`6*L_unit',`$3')
#
- Loopover_(`x',
- `Pin`'m4Lx: line left_ plen from Base.nw-(0,m4bwid/3+(m4Lx-1/2)*lg_pinsep)
+ foreach_(`x',
+ `Pin`'m4Lx: line left_ m4pl from Base.nw-(0,m4bwid/3+(m4Lx-1/2)*lg_pinsep)
{"x" ljust at last line.start}
"m4Lx" at last line.c above',
HPD, UTILITY, D2`'svg_it(+), D2_SH, D2`'svg_it(-),
D1`'svg_it(+), D1_SH, D1`'svg_it(-),D0`'svg_it(+), D0_SH,
D0`'svg_it(-), CLK`'svg_it(+), CLK_SH, CLK`'svg_it(-),
CEC, GND, SCL, SDA,svg_it(+)5V)
-L1: line from Base.nw+(m4bwid*2/3-lg_pinsep,0) up plen
+L1: line from Base.nw+(m4bwid*2/3-lg_pinsep,0) up m4pl
svg_rot(90,"21",at last line.c +(-4bp__,0))
svg_rot(90,"SH2",at last line.start + (4bp__,-8bp__))
- line from Base.nw+(m4bwid*2/3-2*lg_pinsep,0) up plen
+ line from Base.nw+(m4bwid*2/3-2*lg_pinsep,0) up m4pl
svg_rot(90,"20",at last line.c+(-4bp__,0))
svg_rot(90,"SH1",at last line.start + (4bp__,-8bp__))
- line from Base.sw+(m4bwid*2/3-lg_pinsep,0) down plen
+ line from Base.sw+(m4bwid*2/3-lg_pinsep,0) down m4pl
svg_rot(90,"23",at last line.c+(-4bp__,0))
svg_rot(90,"SH4",at last line.start + (4bp__,14bp__))
- line from Base.sw+(m4bwid*2/3-2*lg_pinsep,0) down plen
+ line from Base.sw+(m4bwid*2/3-2*lg_pinsep,0) down m4pl
svg_rot(90,"22",at last line.c+(-4bp__,0))
svg_rot(90,"SH3",at last line.start + (4bp__,14bp__))
#
@@ -283,13 +283,13 @@ define(`DIP_chip_outline',
type=I|Q; (default I for uniform-length pins;
Q: staggered) '
define(`DIP',`[ pinct= ifelse(`$1',,8,`$1')
- Loopover_(`Z',`pushkey_(`$2',patsubst(Z,:.*),patsubst(Z,.*:))',
+ foreach_(`Z',`pushkey_(`$2',patsubst(Z,:.*),patsubst(Z,.*:))',
bodywid: 5*L_unit,
bodylen: m4pinpitch*int(pinct/2+0.5),
pinpitch:2*L_unit,
pinwid: 1.2*L_unit,
pinlen: L_unit)
- Loopover_(`Z',`pushkey_(`$2',patsubst(Z,:.*),patsubst(Z,.*:),N)',
+ foreach_(`Z',`pushkey_(`$2',patsubst(Z,:.*),patsubst(Z,.*:),N)',
direct:U,
type:I)
setdir_(m4direct,U)
@@ -308,4 +308,59 @@ define(`DIP',`[ pinct= ifelse(`$1',,8,`$1')
popdef(`m4bodywid',`m4bodylen',`m4pinpitch',`m4pinwid',`m4pinlen',`m4direct',
`m4type') ]'))
+ `There is more than one way to draw an IC and
+ label its pins; here is one:'
+
+ `LT3724( keys ) IC in a [] block
+ keys: pinsep=expr; (svg_baselineskip*2.5)
+ pincount=expr; (8 per side)
+ hght=expr; ((pincount+1)*pinsep)
+ wdth=expr; (0.6*hght)'
+ `8 pins per side; pin labels
+ VIN, SHDN, CSS, BURST_EN, VFB, VC, SYNC, FSET,
+ SGND, SENSEM, SENSEP, PGND, VCC, SW, TG, BOOST'
+define(`LT3724',`[ pushkeys_(`$1',`pinsep:svg_baselineskip*2.5; pincount:8;
+ hght:(m4`'m4pincount+1)*m4`'pinsep; wdth:0.6*m4`'hght')dnl
+ Chip: box wid wdth ht hght shaded rgbstring(.94,.68,.76) "`LT3724'"
+ foreach_(`m4hx',`ifelse(m4hx,nil,,
+ `patsubst(m4hx,^[^:]*:): Chip.nw-(0,m4Lx*hght/(m4pincount+1))
+ "patsubst(m4hx,:.*)" ljust at Chip.nw-(0,m4Lx*hght/(m4pincount+1))')',
+ V`'svg_sub(IN):VIN, SHDN, C`'svg_sub(SS):CSS, BURST_EN,
+ V`'svg_sub(FB):VFB, V`'svg_sub(C):VC, SYNC, f`'svg_sub(SET):FSET)
+ line right_ textht*4 from SHDN+(textoffset,textht/2+2bp__)
+ foreach_(`m4hx',`ifelse(m4hx,nil,,
+ `patsubst(m4hx,^[^:]*:): Chip.se+(0,m4Lx*hght/(m4pincount+1))
+ "patsubst(m4hx,:.*)" rjust at Chip.se+(0,m4Lx*hght/(m4pincount+1))')',
+ SGND, SENSE`'svg_sup(-):SENSEM, SENSE`'svg_sup(+):SENSEP, PGND,
+ V`'svg_sub(CC):VCC, SW, TG, BOOST)
+ `$2' popdef(`m4pinsep',`m4pincount',`m4hght',`m4wdth') ]')
+
+
+ `Here is another way to draw an IC and
+ label its pins:'
+
+ `LT3757( keys ) IC in a [] block
+ keys: pinsep=expr; (svg_baselineskip*2.5)
+ pincount=expr; (8 per side)
+ hght=expr; ((pincount+1)*pinsep)
+ wdth=expr; (0.6*hght)'
+ `8 pins per side; pin labels
+ top: VIN; left: SHU, SYNC, RT, SS;
+ right: GATE, SENSE, FBX;
+ bottom: VC, GND, INTVCC'
+define(`LT3757',`[ pushkeys_(`$1',`pinsep:svg_baselineskip*2.5; pincount:8;
+ hght:(m4`'pincount+1)*m4`'pinsep; wdth:0.6*m4`'hght')dnl
+ Chip: box wid wdth ht hght shaded rgbstring(0.65,0.52,0.325) "`LT3757'" above
+ VIN: Chip.n; "V`'svg_sub(IN)" at VIN below
+ foreach_(`LL',`m43757label(nw,sw,ljust,patsubst(LL,:,`,'))',
+ SHU:2:"SHDN/UVLO", SYNC:5, RT:7, SS:8)
+ line from SHU+(2bp__,5bp__) right_ 24bp__
+ foreach_(`LL',`m43757label(se,ne,rjust,patsubst(LL,:,`,'))',
+ FBX:1, SENSE:3, GATE:5)
+ foreach_(`LL',`m43757label(sw,se,+(0,textht/3) above,patsubst(LL,:,`,'))',
+ VC:2:"V`'svg_sub(C)", GND:5, INTVCC:8:"INTV`'svg_sub(CC)")
+ `$2' popdef(`m4pinsep',`m4pincount',`m4hght',`m4wdth') ]')
+define(`m43757label',``$4': `$5'/(m4pincount+1) between Chip.`$1' and Chip.`$2'
+ ifelse(`$6',,"`$4'",`$6') at `$4' `$3'')
+
divert(0)dnl
diff --git a/graphics/circuit_macros/examples/dpv/shapesDPV.m4 b/graphics/circuit_macros/examples/dpv/shapesDPV.m4
index d7c5df27ef..0886c9f5fe 100644
--- a/graphics/circuit_macros/examples/dpv/shapesDPV.m4
+++ b/graphics/circuit_macros/examples/dpv/shapesDPV.m4
@@ -1,159 +1,7 @@
.PS
# shapesDPV.m4
threeD_init
-
-divert(-1)
-# shapes.m4
-# 3D structures with complex surfaces and hidden lines are the domain of more
-# sophisticated software packages, but basic shapes can be drawn with pic.
-
-#####################################################
-
- `cylinder3D(xdispl,ydispl,zdispl,diameter,
- [colored "color"])'
-define(`cylinder3D',`[ Start: (0,0)
- xdispl = `$1'; ydispl = `$2'; zdispl = `$3'
- define(`M4CL',`xdispl,ydispl,zdispl')dnl
- lenc = length3D(M4CL)
- diamc = ifelse(`$4',,(lenc/2),`$4') ; radc = diamc/2
- cs = dot3D(View3D,M4CL)/lenc
- End: Project(M4CL)
- az = atan2(ydispl,xdispl)
- ae = atan2(zdispl,sqrt(xdispl^2+ydispl^2))
- CL: line invis from Start to End; C: CL.c
- nls = int(twopi_*radc/lthick)
- define(`M4PP',`rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,0,0,radc)))')dnl
- for i=0 to nls-1 do { if dot3D(View3D,M4PP) > 0 then {
- P: Project(M4PP)
- ql = sqrta(dot3D(Light3D,M4PP)/radc)
- line from P to End+P outlined rgbstring(ql,ql,ql) `$5' } }
- Perp: (vperp(CL,radc))
- if cs > 0 then { T: End; B: Start } else { T: Start; B: End }
- rpoint_(from Start to Perp)
- css = sqrta(cs)
- Top: rotellipse(diamc,diamc*cs,
- thick linethick/3 shaded rgbstring(css,css,css)) with .c at T
- W: line thick linethick/3 from T+Perp to B+Perp
- Bot: ellipsearc(diamc,diamc*cs,pi_,twopi_,rp_ang,cw,
- thick linethick/3) with .C at B
- E: line thick linethick/3 from B-Perp to T-Perp
- rpoint_(from Start to End)
-`$6']')
-
- `cone3D(xdispl,ydispl,zdispl,diameter,
- [colored "color"])'
-define(`cone3D',`[ Start: (0,0)
- xdispl = `$1'; ydispl = `$2'; zdispl = `$3'
- define(`M4CL',`xdispl,ydispl,zdispl')dnl
- lenc = length3D(M4CL)
- diamc = ifelse(`$4',,(lenc/2),`$4') ; radc = diamc/2
- End: Project(M4CL)
- cs = dot3D(View3D,M4CL)/lenc
- az = atan2(ydispl,xdispl)
- ae = atan2(zdispl,sqrt(xdispl^2+ydispl^2))
- CL: line invis from Start to End; C: CL.c
- nls = int(twopi_*radc/lthick)
- lt = sqrt(radc^2+lenc^2)
- b = 0
- for i=0 to nls-1 do { if dot3D(View3D,
- rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,radc,0,lenc)))) > 0 then {
- ql = sqrta(dot3D(Light3D,
- rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,radc,0,lenc))))/lt)
- P: Project(rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,0,0,radc))))
- line from P to End outlined rgbstring(ql,ql,ql) `$5'
- if !b then { WB: P; b = 1 }
- } else { if b then { BW: P; b = 0 } } }
- if vlength(CL.x,CL.y) != 0 then { Perp: (vperp(CL,radc,R)) } else { Perp: (radc,0) }
- if cs >= 0 then { T: End; B: Start } else {T: Start; B: End }
- rpoint_(from Start to Perp)
- pout = (vlength(End.x,End.y) > abs(radc*cs))
- if cs < 0 then { css = sqrta(cs)
- if pout then { line thick linethick/3 from BW to End then to WB }
- Bot: rotellipse(diamc,diamc*cs,thick linethick/3 \
- ifelse(`$5',,`shaded rgbstring(css,css,css)',`$5')) with .c at T } \
- else { if pout then {
- line thick linethick/3 from BW to End then to WB
- a = acos((WB.x*Perp.x+WB.y*Perp.y)/radc^2)
- Bot: ellipsearc(diamc,diamc*cs,a,pi_-a,rp_ang,cw, thick linethick/3) \
- with .C at B } \
- else {
- Bot: rotellipse(diamc,diamc*cs,thick linethick/3) with .c at B } }
- rpoint_(from Start to End)
-`$6']')
- `Arrow3D(xdispl,ydispl,zdispl,
- diam,arrowwid,arrowht)'
-define(`Arrow3D',`[ diam_Ar = ifelse(`$4',,linewid/10,`$4')
- wid_Ar = ifelse(`$5',,diam_Ar*2,`$5')
- ht_Ar = ifelse(`$6',,wid_Ar*2,`$6')
- x_Ar = ifelse(`$1',,1,`$1')
- y_Ar = ifelse(`$2',,1,`$2')
- z_Ar = ifelse(`$3',,1,`$3')
- define(`M4Arrow3D',`x_Ar,y_Ar,z_Ar')dnl
- len_Ar = length3D(M4Arrow3D)
- len_Shaft = len_Ar - ht_Ar
- cs_Ar = dot3D(View3D,M4Arrow3D)
- if cs_Ar >= 0 then {
- Shaft: cylinder3D(sprod3D(len_Shaft/len_Ar,M4Arrow3D),diam_Ar)
- Head: cone3D(sprod3D(ht_Ar/len_Ar,M4Arrow3D),wid_Ar) \
- with .Start at Shaft.End } \
- else {
- Head: cone3D(sprod3D(ht_Ar/len_Ar,M4Arrow3D),wid_Ar)
- Shaft: cylinder3D(sprod3D(len_Shaft/len_Ar,M4Arrow3D),diam_Ar) \
- with .End at Head.Start }
- Start: Shaft.Start; End: Head.End
- `$7']')
-
-define(`f2xyz3D',``$1'x = `$2'
-`$1'y = `$3'
-`$1'z = `$4' ')
-
- `prism3D(xdispl,ydispl,zdispl,wid,ht,rotation (rad))'
-define(`prism3D',`[ Start: (0,0)
- xdispl = ifelse(`$1',,linewid,`$1')
- ydispl = ifelse(`$2',,linewid,`$2')
- zdispl = ifelse(`$3',,linewid,`$3')
- widp = ifelse(`$4',,(linewid/5),`$4')
- htp = ifelse(`$5',,(linewid/10),`$5')
- rotp = ifelse(`$6',,0,`$6')
- End: Project(xdispl,ydispl,zdispl); C: 0.5 between Start and End
- lenp = length3D(xdispl,ydispl,zdispl)
- az = atan2(ydispl,xdispl); ae = atan2(zdispl,sqrt(xdispl^2+ydispl^2))
- wp2 = widp/2; hp2 = htp/2
-# corners
- f2xyz3D(nwB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0,-wp2, hp2))))
- f2xyz3D(swB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0,-wp2,-hp2))))
- f2xyz3D(seB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0, wp2,-hp2))))
- f2xyz3D(neB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0, wp2, hp2))))
- f2xyz3D(nwF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp,-wp2, hp2))))
- f2xyz3D(swF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp,-wp2,-hp2))))
- f2xyz3D(seF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp, wp2,-hp2))))
- f2xyz3D(neF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp, wp2, hp2))))
-# facets
- M4Facet3D(neF,nwF,swF,seF)
- M4Facet3D(neB,seB,swB,nwB)
- M4Facet3D(neF,seF,seB,neB)
- M4Facet3D(neF,neB,nwB,nwF)
- M4Facet3D(seF,swF,swB,seB)
- M4Facet3D(nwF,nwB,swB,swF)
-`$7']')
-
-define(`M4Facet3D',`
-define(`PFacet',`cross3D(diff3D(`$2'x,`$2'y,`$2'z,`$1'x,`$1'y,`$1'z),
- diff3D(`$3'x,`$3'y,`$3'z,`$2'x,`$2'y,`$2'z))')
- if dot3D(View3D,PFacet) > 0 then {
- fFacet = sqrta(dot3D(Light3D,PFacet)/length3D(PFacet))
- P1: Project(`$1'x,`$1'y,`$1'z)
- P2: Project(`$2'x,`$2'y,`$2'z)
- P3: Project(`$3'x,`$3'y,`$3'z)
- P4: Project(`$4'x,`$4'y,`$4'z)
- line fill_(fFacet) invis from P1 to P2 then to P3 then to P4 then to P1
- line from P1 to P2; round
- line to P3; round
- line to P4; round
- line to P1; round } ')
-
-#####################################################
-divert(0)dnl
+include(../Shapedefs.m4)
azimuth = 60
elev = 10
diff --git a/graphics/circuit_macros/examples/ex02.tex b/graphics/circuit_macros/examples/ex02.tex
new file mode 100644
index 0000000000..ef1057ee93
--- /dev/null
+++ b/graphics/circuit_macros/examples/ex02.tex
@@ -0,0 +1,1573 @@
+\begin{tikzpicture}[scale=2.54]%
+% dpic version 2024.01.01 option -g for TikZ and PGF 1.01
+\ifx\dpiclw\undefined\newdimen\dpiclw\fi
+\global\def\dpicdraw{\draw[line width=\dpiclw]}
+\global\def\dpicstop{;}
+\dpiclw=0.8bp
+\dpiclw=0.8bp
+\dpicdraw (0,0.491667)
+ --(0,0.691667)
+ --(0.4,0.491667)
+ --(0,0.291667)
+ --(0,0.491667)\dpicstop
+\dpicdraw (0.4,0.491667)
+ --(0.6,0.491667)\dpicstop
+\draw (0.055348,0.591667) node{{\scriptsize$-$}};
+\draw (0.055348,0.391667) node{{\scriptsize$+$}};
+\dpicdraw (0.175736,0.067403)
+ --(0.034315,0.208824)
+ --(0.458579,0.350245)
+ --(0.317157,-0.074019)
+ --(0.175736,0.067403)\dpicstop
+\dpicdraw (0.458579,0.350245)
+ --(0.6,0.491667)\dpicstop
+\draw (0.144162,0.17725) node{{\scriptsize$-$}};
+\draw (0.285584,0.035829) node{{\scriptsize$+$}};
+\dpicdraw (0.6,-0.108333)
+ --(0.4,-0.108333)
+ --(0.6,0.291667)
+ --(0.8,-0.108333)
+ --(0.6,-0.108333)\dpicstop
+\dpicdraw (0.6,0.291667)
+ --(0.6,0.491667)\dpicstop
+\draw (0.5,-0.052985) node{{\scriptsize$-$}};
+\draw (0.7,-0.052985) node{{\scriptsize$+$}};
+\dpicdraw (1.024264,0.067403)
+ --(0.882843,-0.074019)
+ --(0.741421,0.350245)
+ --(1.165685,0.208824)
+ --(1.024264,0.067403)\dpicstop
+\dpicdraw (0.741421,0.350245)
+ --(0.6,0.491667)\dpicstop
+\draw (0.914416,0.035829) node{{\scriptsize$-$}};
+\draw (1.055838,0.17725) node{{\scriptsize$+$}};
+\dpicdraw (1.2,0.491667)
+ --(1.2,0.291667)
+ --(0.8,0.491667)
+ --(1.2,0.691667)
+ --(1.2,0.491667)\dpicstop
+\dpicdraw (0.8,0.491667)
+ --(0.6,0.491667)\dpicstop
+\draw (1.144652,0.391667) node{{\scriptsize$-$}};
+\draw (1.144652,0.591667) node{{\scriptsize$+$}};
+\dpicdraw (1.024264,0.915931)
+ --(1.165685,0.774509)
+ --(0.741421,0.633088)
+ --(0.882843,1.057352)
+ --(1.024264,0.915931)\dpicstop
+\dpicdraw (0.741421,0.633088)
+ --(0.6,0.491667)\dpicstop
+\draw (1.055838,0.806083) node{{\scriptsize$-$}};
+\draw (0.914416,0.947504) node{{\scriptsize$+$}};
+\dpicdraw (0.6,1.091667)
+ --(0.8,1.091667)
+ --(0.6,0.691667)
+ --(0.4,1.091667)
+ --(0.6,1.091667)\dpicstop
+\dpicdraw (0.6,0.691667)
+ --(0.6,0.491667)\dpicstop
+\draw (0.7,1.036319) node{{\scriptsize$-$}};
+\draw (0.5,1.036319) node{{\scriptsize$+$}};
+\dpicdraw (0.175736,0.915931)
+ --(0.317157,1.057352)
+ --(0.458579,0.633088)
+ --(0.034315,0.774509)
+ --(0.175736,0.915931)\dpicstop
+\dpicdraw (0.458579,0.633088)
+ --(0.6,0.491667)\dpicstop
+\draw (0.285584,0.947504) node{{\scriptsize$-$}};
+\draw (0.144162,0.806083) node{{\scriptsize$+$}};
+\dpicdraw (0.6,-0.108333)
+ --(0.6,-0.208333)
+ --(0.633333,-0.225)
+ --(0.566667,-0.258333)
+ --(0.633333,-0.291667)
+ --(0.566667,-0.325)
+ --(0.633333,-0.358333)
+ --(0.566667,-0.391667)
+ --(0.6,-0.408333)
+ --(0.6,-0.508333)\dpicstop
+\dpicdraw (0.6,-0.508333)
+ --(0.6,-0.612799)\dpicstop
+\filldraw[line width=0bp](0.741071,-0.503813)
+ --(0.765763,-0.447693)
+ --(0.709644,-0.472386) --cycle\dpicstop
+\dpicdraw (0.635656,-0.577801)
+ --(0.754925,-0.458532)\dpicstop
+\filldraw[line width=0bp](0.776426,-0.539168)
+ --(0.801119,-0.483049)
+ --(0.744999,-0.507741) --cycle\dpicstop
+\dpicdraw (0.671011,-0.613156)
+ --(0.79028,-0.493887)\dpicstop
+\fill[fill=black,line width=0bp](0.6,-0.612799)
+ --(0.633333,-0.612799)
+ --(0.6,-0.664999)
+ --(0.566667,-0.612799)
+ --(0.6,-0.612799)--cycle
+\dpicstop
+\dpicdraw (0.6,-0.612799)
+ --(0.633333,-0.612799)
+ --(0.6,-0.664999)
+ --(0.566667,-0.612799)
+ --(0.6,-0.612799)\dpicstop
+\dpicdraw (0.562615,-0.670534)
+ --(0.637385,-0.670534)\dpicstop
+\dpicdraw (0.6,-0.670534)
+ --(0.6,-0.775)\dpicstop
+\dpicdraw (0.6,-0.775)
+ --(0.6,-0.879466)\dpicstop
+\filldraw[line width=0bp](0.455001,-0.774408)
+ --(0.398881,-0.749715)
+ --(0.423574,-0.805835) --cycle\dpicstop
+\dpicdraw (0.528989,-0.879823)
+ --(0.40972,-0.760554)\dpicstop
+\filldraw[line width=0bp](0.490356,-0.739053)
+ --(0.434237,-0.71436)
+ --(0.458929,-0.77048) --cycle\dpicstop
+\dpicdraw (0.564344,-0.844468)
+ --(0.445075,-0.725198)\dpicstop
+\fill[fill=black,line width=0bp](0.6,-0.879466)
+ --(0.633333,-0.879466)
+ --(0.6,-0.931666)
+ --(0.566667,-0.879466)
+ --(0.6,-0.879466)--cycle
+\dpicstop
+\dpicdraw (0.6,-0.879466)
+ --(0.633333,-0.879466)
+ --(0.6,-0.931666)
+ --(0.566667,-0.879466)
+ --(0.6,-0.879466)\dpicstop
+\dpicdraw (0.562615,-0.937201)
+ --(0.637385,-0.937201)\dpicstop
+\dpicdraw (0.6,-0.937201)
+ --(0.6,-1.041667)\dpicstop
+\dpicdraw (0.666667,-1.041667)
+ --(0.533333,-1.041667)\dpicstop
+\dpicdraw (0.644444,-1.066667)
+ --(0.555556,-1.066667)\dpicstop
+\dpicdraw (0.628571,-1.091667)
+ --(0.571429,-1.091667)\dpicstop
+\dpicdraw[fill=black](2.725171,0.033504) circle (0.006299in)\dpicstop
+\dpicdraw (2.425171,-1.086111)
+ --(2.625171,-1.086111)\dpicstop
+\dpicdraw (2.625171,-1.086111)
+ --(2.625171,-1.091667)\dpicstop
+\dpicdraw (2.625171,-1.086111)
+ ..controls (2.625171,-1.077179) and (2.629936,-1.068926)
+ ..(2.637671,-1.06446)
+ ..controls (2.645406,-1.059995) and (2.654936,-1.059995)
+ ..(2.662671,-1.06446)
+ ..controls (2.670406,-1.068926) and (2.675171,-1.077179)
+ ..(2.675171,-1.086111)\dpicstop
+\dpicdraw (2.675171,-1.086111)
+ --(2.675171,-1.091667)\dpicstop
+\dpicdraw (2.675171,-1.086111)
+ ..controls (2.675171,-1.077179) and (2.679936,-1.068926)
+ ..(2.687671,-1.06446)
+ ..controls (2.695406,-1.059995) and (2.704936,-1.059995)
+ ..(2.712671,-1.06446)
+ ..controls (2.720406,-1.068926) and (2.725171,-1.077179)
+ ..(2.725171,-1.086111)\dpicstop
+\dpicdraw (2.725171,-1.086111)
+ --(2.725171,-1.091667)\dpicstop
+\dpicdraw (2.725171,-1.086111)
+ ..controls (2.725171,-1.077179) and (2.729936,-1.068926)
+ ..(2.737671,-1.06446)
+ ..controls (2.745406,-1.059995) and (2.754936,-1.059995)
+ ..(2.762671,-1.06446)
+ ..controls (2.770406,-1.068926) and (2.775171,-1.077179)
+ ..(2.775171,-1.086111)\dpicstop
+\dpicdraw (2.775171,-1.086111)
+ --(2.775171,-1.091667)\dpicstop
+\dpicdraw (2.775171,-1.086111)
+ ..controls (2.775171,-1.077179) and (2.779936,-1.068926)
+ ..(2.787671,-1.06446)
+ ..controls (2.795406,-1.059995) and (2.804936,-1.059995)
+ ..(2.812671,-1.06446)
+ ..controls (2.820406,-1.068926) and (2.825171,-1.077179)
+ ..(2.825171,-1.086111)\dpicstop
+\dpicdraw (2.825171,-1.086111)
+ --(2.825171,-1.091667)\dpicstop
+\dpicdraw (2.825171,-1.086111)
+ --(3.025171,-1.086111)\dpicstop
+\dpicdraw (3.025171,-1.086111)
+ --(3.198376,-0.986111)\dpicstop
+\dpicdraw (3.198376,-0.986111)
+ --(3.201154,-0.990922)\dpicstop
+\dpicdraw (3.198376,-0.986111)
+ ..controls (3.19391,-0.978376) and (3.19391,-0.968846)
+ ..(3.198376,-0.961111)
+ ..controls (3.202842,-0.953376) and (3.211095,-0.948611)
+ ..(3.220027,-0.948611)
+ ..controls (3.228958,-0.948611) and (3.237211,-0.953376)
+ ..(3.241677,-0.961111)\dpicstop
+\dpicdraw (3.241677,-0.961111)
+ --(3.244455,-0.965922)\dpicstop
+\dpicdraw (3.241677,-0.961111)
+ ..controls (3.237211,-0.953376) and (3.237211,-0.943846)
+ ..(3.241677,-0.936111)
+ ..controls (3.246143,-0.928376) and (3.254396,-0.923611)
+ ..(3.263328,-0.923611)
+ ..controls (3.272259,-0.923611) and (3.280513,-0.928376)
+ ..(3.284978,-0.936111)\dpicstop
+\dpicdraw (3.284978,-0.936111)
+ --(3.287756,-0.940922)\dpicstop
+\dpicdraw (3.284978,-0.936111)
+ ..controls (3.280513,-0.928376) and (3.280513,-0.918846)
+ ..(3.284978,-0.911111)
+ ..controls (3.289444,-0.903376) and (3.297697,-0.898611)
+ ..(3.306629,-0.898611)
+ ..controls (3.315561,-0.898611) and (3.323814,-0.903376)
+ ..(3.32828,-0.911111)\dpicstop
+\dpicdraw (3.32828,-0.911111)
+ --(3.331057,-0.915922)\dpicstop
+\dpicdraw (3.32828,-0.911111)
+ ..controls (3.323814,-0.903376) and (3.323814,-0.893846)
+ ..(3.32828,-0.886111)
+ ..controls (3.332746,-0.878376) and (3.340999,-0.873611)
+ ..(3.34993,-0.873611)
+ ..controls (3.358862,-0.873611) and (3.367115,-0.878376)
+ ..(3.371581,-0.886111)\dpicstop
+\dpicdraw (3.371581,-0.886111)
+ --(3.374359,-0.890922)\dpicstop
+\dpicdraw (3.371581,-0.886111)
+ --(3.544786,-0.786111)\dpicstop
+\dpicdraw (3.544786,-0.786111)
+ --(3.644786,-0.612906)\dpicstop
+\dpicdraw (3.644786,-0.612906)
+ --(3.649597,-0.615684)\dpicstop
+\dpicdraw (3.644786,-0.612906)
+ ..controls (3.637051,-0.60844) and (3.632286,-0.600187)
+ ..(3.632286,-0.591255)
+ ..controls (3.632286,-0.582324) and (3.637051,-0.574071)
+ ..(3.644786,-0.569605)
+ ..controls (3.652521,-0.565139) and (3.662051,-0.565139)
+ ..(3.669786,-0.569605)\dpicstop
+\dpicdraw (3.669786,-0.569605)
+ --(3.674597,-0.572383)\dpicstop
+\dpicdraw (3.669786,-0.569605)
+ ..controls (3.662051,-0.565139) and (3.657286,-0.556886)
+ ..(3.657286,-0.547954)
+ ..controls (3.657286,-0.539022) and (3.662051,-0.530769)
+ ..(3.669786,-0.526303)
+ ..controls (3.677521,-0.521838) and (3.687051,-0.521838)
+ ..(3.694786,-0.526303)\dpicstop
+\dpicdraw (3.694786,-0.526303)
+ --(3.699597,-0.529081)\dpicstop
+\dpicdraw (3.694786,-0.526303)
+ ..controls (3.687051,-0.521838) and (3.682286,-0.513584)
+ ..(3.682286,-0.504653)
+ ..controls (3.682286,-0.495721) and (3.687051,-0.487468)
+ ..(3.694786,-0.483002)
+ ..controls (3.702521,-0.478536) and (3.712051,-0.478536)
+ ..(3.719786,-0.483002)\dpicstop
+\dpicdraw (3.719786,-0.483002)
+ --(3.724597,-0.48578)\dpicstop
+\dpicdraw (3.719786,-0.483002)
+ ..controls (3.712051,-0.478536) and (3.707286,-0.470283)
+ ..(3.707286,-0.461352)
+ ..controls (3.707286,-0.45242) and (3.712051,-0.444167)
+ ..(3.719786,-0.439701)
+ ..controls (3.727521,-0.435235) and (3.737051,-0.435235)
+ ..(3.744786,-0.439701)\dpicstop
+\dpicdraw (3.744786,-0.439701)
+ --(3.749597,-0.442479)\dpicstop
+\dpicdraw (3.744786,-0.439701)
+ --(3.844786,-0.266496)\dpicstop
+\dpicdraw (3.844786,-0.266496)
+ --(3.844786,-0.066496)\dpicstop
+\dpicdraw (3.844786,-0.066496)
+ --(3.850342,-0.066496)\dpicstop
+\dpicdraw (3.844786,-0.066496)
+ ..controls (3.835854,-0.066496) and (3.827601,-0.061731)
+ ..(3.823135,-0.053996)
+ ..controls (3.81867,-0.046261) and (3.81867,-0.036731)
+ ..(3.823135,-0.028996)
+ ..controls (3.827601,-0.021261) and (3.835854,-0.016496)
+ ..(3.844786,-0.016496)\dpicstop
+\dpicdraw (3.844786,-0.016496)
+ --(3.850342,-0.016496)\dpicstop
+\dpicdraw (3.844786,-0.016496)
+ ..controls (3.835854,-0.016496) and (3.827601,-0.011731)
+ ..(3.823135,-0.003996)
+ ..controls (3.81867,0.003739) and (3.81867,0.013269)
+ ..(3.823135,0.021004)
+ ..controls (3.827601,0.028739) and (3.835854,0.033504)
+ ..(3.844786,0.033504)\dpicstop
+\dpicdraw (3.844786,0.033504)
+ --(3.850342,0.033504)\dpicstop
+\dpicdraw (3.844786,0.033504)
+ ..controls (3.835854,0.033504) and (3.827601,0.038269)
+ ..(3.823135,0.046004)
+ ..controls (3.81867,0.053739) and (3.81867,0.063269)
+ ..(3.823135,0.071004)
+ ..controls (3.827601,0.078739) and (3.835854,0.083504)
+ ..(3.844786,0.083504)\dpicstop
+\dpicdraw (3.844786,0.083504)
+ --(3.850342,0.083504)\dpicstop
+\dpicdraw (3.844786,0.083504)
+ ..controls (3.835854,0.083504) and (3.827601,0.088269)
+ ..(3.823135,0.096004)
+ ..controls (3.81867,0.103739) and (3.81867,0.113269)
+ ..(3.823135,0.121004)
+ ..controls (3.827601,0.128739) and (3.835854,0.133504)
+ ..(3.844786,0.133504)\dpicstop
+\dpicdraw (3.844786,0.133504)
+ --(3.850342,0.133504)\dpicstop
+\dpicdraw (3.844786,0.133504)
+ --(3.844786,0.333504)\dpicstop
+\dpicdraw (3.844786,0.333504)
+ --(3.744786,0.506709)\dpicstop
+\dpicdraw (3.744786,0.506709)
+ --(3.749597,0.509487)\dpicstop
+\dpicdraw (3.744786,0.506709)
+ ..controls (3.732829,0.499806) and (3.717539,0.503903)
+ ..(3.710635,0.51586)
+ ..controls (3.703732,0.527817) and (3.707829,0.543107)
+ ..(3.719786,0.55001)\dpicstop
+\dpicdraw (3.719786,0.55001)
+ --(3.724597,0.552788)\dpicstop
+\dpicdraw (3.719786,0.55001)
+ ..controls (3.712051,0.545545) and (3.702521,0.545545)
+ ..(3.694786,0.55001)
+ ..controls (3.687051,0.554476) and (3.682286,0.562729)
+ ..(3.682286,0.571661)
+ ..controls (3.682286,0.580593) and (3.687051,0.588846)
+ ..(3.694786,0.593312)\dpicstop
+\dpicdraw (3.694786,0.593312)
+ --(3.699597,0.59609)\dpicstop
+\dpicdraw (3.694786,0.593312)
+ ..controls (3.682829,0.586408) and (3.667539,0.590505)
+ ..(3.660635,0.602462)
+ ..controls (3.653732,0.61442) and (3.657829,0.629709)
+ ..(3.669786,0.636613)\dpicstop
+\dpicdraw (3.669786,0.636613)
+ --(3.674597,0.639391)\dpicstop
+\dpicdraw (3.669786,0.636613)
+ ..controls (3.657829,0.629709) and (3.642539,0.633806)
+ ..(3.635635,0.645764)
+ ..controls (3.628732,0.657721) and (3.632829,0.673011)
+ ..(3.644786,0.679914)\dpicstop
+\dpicdraw (3.644786,0.679914)
+ --(3.649597,0.682692)\dpicstop
+\dpicdraw (3.644786,0.679914)
+ --(3.544786,0.853119)\dpicstop
+\dpicdraw (3.544786,0.853119)
+ --(3.371581,0.953119)\dpicstop
+\dpicdraw (3.371581,0.953119)
+ --(3.374359,0.957931)\dpicstop
+\dpicdraw (3.371581,0.953119)
+ ..controls (3.367115,0.945384) and (3.358862,0.940619)
+ ..(3.34993,0.940619)
+ ..controls (3.340999,0.940619) and (3.332746,0.945384)
+ ..(3.32828,0.953119)
+ ..controls (3.323814,0.960854) and (3.323814,0.970384)
+ ..(3.32828,0.978119)\dpicstop
+\dpicdraw (3.32828,0.978119)
+ --(3.331057,0.982931)\dpicstop
+\dpicdraw (3.32828,0.978119)
+ ..controls (3.323814,0.970384) and (3.315561,0.965619)
+ ..(3.306629,0.965619)
+ ..controls (3.297697,0.965619) and (3.289444,0.970384)
+ ..(3.284978,0.978119)
+ ..controls (3.280513,0.985854) and (3.280513,0.995384)
+ ..(3.284978,1.003119)\dpicstop
+\dpicdraw (3.284978,1.003119)
+ --(3.287756,1.007931)\dpicstop
+\dpicdraw (3.284978,1.003119)
+ ..controls (3.280513,0.995384) and (3.272259,0.990619)
+ ..(3.263328,0.990619)
+ ..controls (3.254396,0.990619) and (3.246143,0.995384)
+ ..(3.241677,1.003119)
+ ..controls (3.237211,1.010854) and (3.237211,1.020384)
+ ..(3.241677,1.028119)\dpicstop
+\dpicdraw (3.241677,1.028119)
+ --(3.244455,1.032931)\dpicstop
+\dpicdraw (3.241677,1.028119)
+ ..controls (3.237211,1.020384) and (3.228958,1.015619)
+ ..(3.220027,1.015619)
+ ..controls (3.211095,1.015619) and (3.202842,1.020384)
+ ..(3.198376,1.028119)
+ ..controls (3.19391,1.035854) and (3.19391,1.045384)
+ ..(3.198376,1.053119)\dpicstop
+\dpicdraw (3.198376,1.053119)
+ --(3.201154,1.057931)\dpicstop
+\dpicdraw (3.198376,1.053119)
+ --(3.025171,1.153119)\dpicstop
+\dpicdraw (3.025171,1.153119)
+ --(2.825171,1.153119)\dpicstop
+\dpicdraw (2.825171,1.153119)
+ --(2.825171,1.158675)\dpicstop
+\dpicdraw (2.825171,1.153119)
+ ..controls (2.825171,1.144188) and (2.820406,1.135935)
+ ..(2.812671,1.131469)
+ ..controls (2.804936,1.127003) and (2.795406,1.127003)
+ ..(2.787671,1.131469)
+ ..controls (2.779936,1.135935) and (2.775171,1.144188)
+ ..(2.775171,1.153119)\dpicstop
+\dpicdraw (2.775171,1.153119)
+ --(2.775171,1.158675)\dpicstop
+\dpicdraw (2.775171,1.153119)
+ ..controls (2.775171,1.144188) and (2.770406,1.135935)
+ ..(2.762671,1.131469)
+ ..controls (2.754936,1.127003) and (2.745406,1.127003)
+ ..(2.737671,1.131469)
+ ..controls (2.729936,1.135935) and (2.725171,1.144188)
+ ..(2.725171,1.153119)\dpicstop
+\dpicdraw (2.725171,1.153119)
+ --(2.725171,1.158675)\dpicstop
+\dpicdraw (2.725171,1.153119)
+ ..controls (2.725171,1.144188) and (2.720406,1.135935)
+ ..(2.712671,1.131469)
+ ..controls (2.704936,1.127003) and (2.695406,1.127003)
+ ..(2.687671,1.131469)
+ ..controls (2.679936,1.135935) and (2.675171,1.144188)
+ ..(2.675171,1.153119)\dpicstop
+\dpicdraw (2.675171,1.153119)
+ --(2.675171,1.158675)\dpicstop
+\dpicdraw (2.675171,1.153119)
+ ..controls (2.675171,1.144188) and (2.670406,1.135935)
+ ..(2.662671,1.131469)
+ ..controls (2.654936,1.127003) and (2.645406,1.127003)
+ ..(2.637671,1.131469)
+ ..controls (2.629936,1.135935) and (2.625171,1.144188)
+ ..(2.625171,1.153119)\dpicstop
+\dpicdraw (2.625171,1.153119)
+ --(2.625171,1.158675)\dpicstop
+\dpicdraw (2.625171,1.153119)
+ --(2.425171,1.153119)\dpicstop
+\dpicdraw (2.425171,1.153119)
+ --(2.251966,1.053119)\dpicstop
+\dpicdraw (2.251966,1.053119)
+ --(2.249188,1.057931)\dpicstop
+\dpicdraw (2.251966,1.053119)
+ ..controls (2.256432,1.045384) and (2.256432,1.035854)
+ ..(2.251966,1.028119)
+ ..controls (2.2475,1.020384) and (2.239247,1.015619)
+ ..(2.230315,1.015619)
+ ..controls (2.221383,1.015619) and (2.21313,1.020384)
+ ..(2.208664,1.028119)\dpicstop
+\dpicdraw (2.208664,1.028119)
+ --(2.205887,1.032931)\dpicstop
+\dpicdraw (2.208664,1.028119)
+ ..controls (2.21313,1.020384) and (2.21313,1.010854)
+ ..(2.208664,1.003119)
+ ..controls (2.204199,0.995384) and (2.195945,0.990619)
+ ..(2.187014,0.990619)
+ ..controls (2.178082,0.990619) and (2.169829,0.995384)
+ ..(2.165363,1.003119)\dpicstop
+\dpicdraw (2.165363,1.003119)
+ --(2.162585,1.007931)\dpicstop
+\dpicdraw (2.165363,1.003119)
+ ..controls (2.169829,0.995384) and (2.169829,0.985854)
+ ..(2.165363,0.978119)
+ ..controls (2.160897,0.970384) and (2.152644,0.965619)
+ ..(2.143713,0.965619)
+ ..controls (2.134781,0.965619) and (2.126528,0.970384)
+ ..(2.122062,0.978119)\dpicstop
+\dpicdraw (2.122062,0.978119)
+ --(2.119284,0.982931)\dpicstop
+\dpicdraw (2.122062,0.978119)
+ ..controls (2.126528,0.970384) and (2.126528,0.960854)
+ ..(2.122062,0.953119)
+ ..controls (2.117596,0.945384) and (2.109343,0.940619)
+ ..(2.100411,0.940619)
+ ..controls (2.09148,0.940619) and (2.083226,0.945384)
+ ..(2.078761,0.953119)\dpicstop
+\dpicdraw (2.078761,0.953119)
+ --(2.075983,0.957931)\dpicstop
+\dpicdraw (2.078761,0.953119)
+ --(1.905556,0.853119)\dpicstop
+\dpicdraw (1.905556,0.853119)
+ --(1.805556,0.679914)\dpicstop
+\dpicdraw (1.805556,0.679914)
+ --(1.800744,0.682692)\dpicstop
+\dpicdraw (1.805556,0.679914)
+ ..controls (1.813291,0.675448) and (1.818056,0.667195)
+ ..(1.818056,0.658264)
+ ..controls (1.818056,0.649332) and (1.813291,0.641079)
+ ..(1.805556,0.636613)
+ ..controls (1.797821,0.632147) and (1.788291,0.632147)
+ ..(1.780556,0.636613)\dpicstop
+\dpicdraw (1.780556,0.636613)
+ --(1.775744,0.639391)\dpicstop
+\dpicdraw (1.780556,0.636613)
+ ..controls (1.788291,0.632147) and (1.793056,0.623894)
+ ..(1.793056,0.614962)
+ ..controls (1.793056,0.606031) and (1.788291,0.597778)
+ ..(1.780556,0.593312)
+ ..controls (1.772821,0.588846) and (1.763291,0.588846)
+ ..(1.755556,0.593312)\dpicstop
+\dpicdraw (1.755556,0.593312)
+ --(1.750744,0.59609)\dpicstop
+\dpicdraw (1.755556,0.593312)
+ ..controls (1.763291,0.588846) and (1.768056,0.580593)
+ ..(1.768056,0.571661)
+ ..controls (1.768056,0.562729) and (1.763291,0.554476)
+ ..(1.755556,0.55001)
+ ..controls (1.747821,0.545545) and (1.738291,0.545545)
+ ..(1.730556,0.55001)\dpicstop
+\dpicdraw (1.730556,0.55001)
+ --(1.725744,0.552788)\dpicstop
+\dpicdraw (1.730556,0.55001)
+ ..controls (1.738291,0.545545) and (1.743056,0.537291)
+ ..(1.743056,0.52836)
+ ..controls (1.743056,0.519428) and (1.738291,0.511175)
+ ..(1.730556,0.506709)
+ ..controls (1.722821,0.502243) and (1.713291,0.502243)
+ ..(1.705556,0.506709)\dpicstop
+\dpicdraw (1.705556,0.506709)
+ --(1.700744,0.509487)\dpicstop
+\dpicdraw (1.705556,0.506709)
+ --(1.605556,0.333504)\dpicstop
+\dpicdraw (1.605556,0.333504)
+ --(1.605556,0.133504)\dpicstop
+\dpicdraw (1.605556,0.133504)
+ --(1.6,0.133504)\dpicstop
+\dpicdraw (1.605556,0.133504)
+ ..controls (1.614487,0.133504) and (1.62274,0.128739)
+ ..(1.627206,0.121004)
+ ..controls (1.631672,0.113269) and (1.631672,0.103739)
+ ..(1.627206,0.096004)
+ ..controls (1.62274,0.088269) and (1.614487,0.083504)
+ ..(1.605556,0.083504)\dpicstop
+\dpicdraw (1.605556,0.083504)
+ --(1.6,0.083504)\dpicstop
+\dpicdraw (1.605556,0.083504)
+ ..controls (1.614487,0.083504) and (1.62274,0.078739)
+ ..(1.627206,0.071004)
+ ..controls (1.631672,0.063269) and (1.631672,0.053739)
+ ..(1.627206,0.046004)
+ ..controls (1.62274,0.038269) and (1.614487,0.033504)
+ ..(1.605556,0.033504)\dpicstop
+\dpicdraw (1.605556,0.033504)
+ --(1.6,0.033504)\dpicstop
+\dpicdraw (1.605556,0.033504)
+ ..controls (1.614487,0.033504) and (1.62274,0.028739)
+ ..(1.627206,0.021004)
+ ..controls (1.631672,0.013269) and (1.631672,0.003739)
+ ..(1.627206,-0.003996)
+ ..controls (1.62274,-0.011731) and (1.614487,-0.016496)
+ ..(1.605556,-0.016496)\dpicstop
+\dpicdraw (1.605556,-0.016496)
+ --(1.6,-0.016496)\dpicstop
+\dpicdraw (1.605556,-0.016496)
+ ..controls (1.614487,-0.016496) and (1.62274,-0.021261)
+ ..(1.627206,-0.028996)
+ ..controls (1.631672,-0.036731) and (1.631672,-0.046261)
+ ..(1.627206,-0.053996)
+ ..controls (1.62274,-0.061731) and (1.614487,-0.066496)
+ ..(1.605556,-0.066496)\dpicstop
+\dpicdraw (1.605556,-0.066496)
+ --(1.6,-0.066496)\dpicstop
+\dpicdraw (1.605556,-0.066496)
+ --(1.605556,-0.266496)\dpicstop
+\dpicdraw (1.605556,-0.266496)
+ --(1.705556,-0.439701)\dpicstop
+\dpicdraw (1.705556,-0.439701)
+ --(1.700744,-0.442479)\dpicstop
+\dpicdraw (1.705556,-0.439701)
+ ..controls (1.713291,-0.435235) and (1.722821,-0.435235)
+ ..(1.730556,-0.439701)
+ ..controls (1.738291,-0.444167) and (1.743056,-0.45242)
+ ..(1.743056,-0.461352)
+ ..controls (1.743056,-0.470283) and (1.738291,-0.478536)
+ ..(1.730556,-0.483002)\dpicstop
+\dpicdraw (1.730556,-0.483002)
+ --(1.725744,-0.48578)\dpicstop
+\dpicdraw (1.730556,-0.483002)
+ ..controls (1.738291,-0.478536) and (1.747821,-0.478536)
+ ..(1.755556,-0.483002)
+ ..controls (1.763291,-0.487468) and (1.768056,-0.495721)
+ ..(1.768056,-0.504653)
+ ..controls (1.768056,-0.513584) and (1.763291,-0.521838)
+ ..(1.755556,-0.526303)\dpicstop
+\dpicdraw (1.755556,-0.526303)
+ --(1.750744,-0.529081)\dpicstop
+\dpicdraw (1.755556,-0.526303)
+ ..controls (1.763291,-0.521838) and (1.772821,-0.521838)
+ ..(1.780556,-0.526303)
+ ..controls (1.788291,-0.530769) and (1.793056,-0.539022)
+ ..(1.793056,-0.547954)
+ ..controls (1.793056,-0.556886) and (1.788291,-0.565139)
+ ..(1.780556,-0.569605)\dpicstop
+\dpicdraw (1.780556,-0.569605)
+ --(1.775744,-0.572383)\dpicstop
+\dpicdraw (1.780556,-0.569605)
+ ..controls (1.788291,-0.565139) and (1.797821,-0.565139)
+ ..(1.805556,-0.569605)
+ ..controls (1.813291,-0.574071) and (1.818056,-0.582324)
+ ..(1.818056,-0.591255)
+ ..controls (1.818056,-0.600187) and (1.813291,-0.60844)
+ ..(1.805556,-0.612906)\dpicstop
+\dpicdraw (1.805556,-0.612906)
+ --(1.800744,-0.615684)\dpicstop
+\dpicdraw (1.805556,-0.612906)
+ --(1.905556,-0.786111)\dpicstop
+\dpicdraw (1.905556,-0.786111)
+ --(2.078761,-0.886111)\dpicstop
+\dpicdraw (2.078761,-0.886111)
+ --(2.075983,-0.890922)\dpicstop
+\dpicdraw (2.078761,-0.886111)
+ ..controls (2.083226,-0.878376) and (2.09148,-0.873611)
+ ..(2.100411,-0.873611)
+ ..controls (2.109343,-0.873611) and (2.117596,-0.878376)
+ ..(2.122062,-0.886111)
+ ..controls (2.126528,-0.893846) and (2.126528,-0.903376)
+ ..(2.122062,-0.911111)\dpicstop
+\dpicdraw (2.122062,-0.911111)
+ --(2.119284,-0.915922)\dpicstop
+\dpicdraw (2.122062,-0.911111)
+ ..controls (2.126528,-0.903376) and (2.134781,-0.898611)
+ ..(2.143713,-0.898611)
+ ..controls (2.152644,-0.898611) and (2.160897,-0.903376)
+ ..(2.165363,-0.911111)
+ ..controls (2.169829,-0.918846) and (2.169829,-0.928376)
+ ..(2.165363,-0.936111)\dpicstop
+\dpicdraw (2.165363,-0.936111)
+ --(2.162585,-0.940922)\dpicstop
+\dpicdraw (2.165363,-0.936111)
+ ..controls (2.169829,-0.928376) and (2.178082,-0.923611)
+ ..(2.187014,-0.923611)
+ ..controls (2.195945,-0.923611) and (2.204199,-0.928376)
+ ..(2.208664,-0.936111)
+ ..controls (2.21313,-0.943846) and (2.21313,-0.953376)
+ ..(2.208664,-0.961111)\dpicstop
+\dpicdraw (2.208664,-0.961111)
+ --(2.205887,-0.965922)\dpicstop
+\dpicdraw (2.208664,-0.961111)
+ ..controls (2.21313,-0.953376) and (2.221383,-0.948611)
+ ..(2.230315,-0.948611)
+ ..controls (2.239247,-0.948611) and (2.2475,-0.953376)
+ ..(2.251966,-0.961111)
+ ..controls (2.256432,-0.968846) and (2.256432,-0.978376)
+ ..(2.251966,-0.986111)\dpicstop
+\dpicdraw (2.251966,-0.986111)
+ --(2.249188,-0.990922)\dpicstop
+\dpicdraw (2.251966,-0.986111)
+ --(2.425171,-1.086111)\dpicstop
+\dpicdraw (2.485171,-0.862188)
+ --(2.611784,-0.862188)\dpicstop
+\dpicdraw[line width=0.4bp](2.611784,-0.862188) circle (0.00109in)\dpicstop
+\dpicdraw (2.611784,-0.862188)
+ ..controls (2.603019,-0.843391) and (2.610075,-0.821012)
+ ..(2.628036,-0.810642)
+ ..controls (2.645998,-0.800272) and (2.668906,-0.805351)
+ ..(2.680802,-0.82234)
+ ..controls (2.692698,-0.83933) and (2.689636,-0.862594)
+ ..(2.673748,-0.875925)\dpicstop
+\dpicdraw[line width=0.4bp](2.673748,-0.875925) circle (0.00109in)\dpicstop
+\dpicdraw (2.673748,-0.875925)
+ ..controls (2.660866,-0.865116) and (2.65612,-0.847404)
+ ..(2.661872,-0.831603)
+ ..controls (2.667623,-0.815801) and (2.682643,-0.805283)
+ ..(2.699459,-0.805283)
+ ..controls (2.716275,-0.805283) and (2.731296,-0.815801)
+ ..(2.737047,-0.831603)
+ ..controls (2.742798,-0.847404) and (2.738053,-0.865116)
+ ..(2.725171,-0.875925)\dpicstop
+\dpicdraw[line width=0.4bp](2.725171,-0.875925) circle (0.00109in)\dpicstop
+\dpicdraw (2.725171,-0.875925)
+ ..controls (2.712289,-0.865116) and (2.707543,-0.847404)
+ ..(2.713295,-0.831603)
+ ..controls (2.719046,-0.815801) and (2.734066,-0.805283)
+ ..(2.750882,-0.805283)
+ ..controls (2.767698,-0.805283) and (2.782719,-0.815801)
+ ..(2.78847,-0.831603)
+ ..controls (2.794221,-0.847404) and (2.789476,-0.865116)
+ ..(2.776594,-0.875925)\dpicstop
+\dpicdraw[line width=0.4bp](2.776594,-0.875925) circle (0.00109in)\dpicstop
+\dpicdraw (2.776594,-0.875925)
+ ..controls (2.760706,-0.862594) and (2.757643,-0.83933)
+ ..(2.769539,-0.82234)
+ ..controls (2.781435,-0.805351) and (2.804344,-0.800272)
+ ..(2.822305,-0.810642)
+ ..controls (2.840267,-0.821012) and (2.847323,-0.843391)
+ ..(2.838558,-0.862188)\dpicstop
+\dpicdraw[line width=0.4bp](2.838558,-0.862188) circle (0.00109in)\dpicstop
+\dpicdraw (2.838558,-0.862188)
+ --(2.965171,-0.862188)\dpicstop
+\dpicdraw (2.965171,-0.862188)
+ --(3.074821,-0.798881)\dpicstop
+\dpicdraw[line width=0.4bp](3.074821,-0.798881) circle (0.00109in)\dpicstop
+\dpicdraw (3.074821,-0.798881)
+ ..controls (3.057832,-0.786985) and (3.052753,-0.764077)
+ ..(3.063123,-0.746115)
+ ..controls (3.073493,-0.728154) and (3.095872,-0.721098)
+ ..(3.114669,-0.729863)
+ ..controls (3.133466,-0.738628) and (3.142445,-0.760307)
+ ..(3.135352,-0.779796)\dpicstop
+\dpicdraw[line width=0.4bp](3.135352,-0.779796) circle (0.00109in)\dpicstop
+\dpicdraw (3.135352,-0.779796)
+ ..controls (3.118791,-0.776876) and (3.105825,-0.76391)
+ ..(3.102905,-0.74735)
+ ..controls (3.099985,-0.730789) and (3.107735,-0.714171)
+ ..(3.122298,-0.705763)
+ ..controls (3.136861,-0.697355) and (3.155127,-0.698953)
+ ..(3.168009,-0.709762)
+ ..controls (3.180891,-0.720571) and (3.185637,-0.738283)
+ ..(3.179885,-0.754085)\dpicstop
+\dpicdraw[line width=0.4bp](3.179885,-0.754085) circle (0.00109in)\dpicstop
+\dpicdraw (3.179885,-0.754085)
+ ..controls (3.163325,-0.751165) and (3.150359,-0.738199)
+ ..(3.147439,-0.721638)
+ ..controls (3.144519,-0.705078) and (3.152268,-0.688459)
+ ..(3.166831,-0.680051)
+ ..controls (3.181394,-0.671643) and (3.199661,-0.673242)
+ ..(3.212543,-0.684051)
+ ..controls (3.225425,-0.69486) and (3.23017,-0.712571)
+ ..(3.224419,-0.728373)\dpicstop
+\dpicdraw[line width=0.4bp](3.224419,-0.728373) circle (0.00109in)\dpicstop
+\dpicdraw (3.224419,-0.728373)
+ ..controls (3.203994,-0.724772) and (3.18971,-0.706156)
+ ..(3.191517,-0.685495)
+ ..controls (3.193325,-0.664833) and (3.210625,-0.648981)
+ ..(3.231365,-0.648981)
+ ..controls (3.252105,-0.648981) and (3.269405,-0.664833)
+ ..(3.271213,-0.685495)\dpicstop
+\dpicdraw[line width=0.4bp](3.271213,-0.685495) circle (0.00109in)\dpicstop
+\dpicdraw (3.271213,-0.685495)
+ --(3.380863,-0.622188)\dpicstop
+\dpicdraw (3.380863,-0.622188)
+ --(3.44417,-0.512538)\dpicstop
+\dpicdraw[line width=0.4bp](3.44417,-0.512538) circle (0.00109in)\dpicstop
+\dpicdraw (3.44417,-0.512538)
+ ..controls (3.423508,-0.51073) and (3.407656,-0.49343)
+ ..(3.407656,-0.47269)
+ ..controls (3.407656,-0.45195) and (3.423508,-0.43465)
+ ..(3.44417,-0.432842)
+ ..controls (3.464831,-0.431035) and (3.483447,-0.445319)
+ ..(3.487048,-0.465744)\dpicstop
+\dpicdraw[line width=0.4bp](3.487048,-0.465744) circle (0.00109in)\dpicstop
+\dpicdraw (3.487048,-0.465744)
+ ..controls (3.471246,-0.471496) and (3.453535,-0.46675)
+ ..(3.442726,-0.453868)
+ ..controls (3.431916,-0.440986) and (3.430318,-0.422719)
+ ..(3.438726,-0.408156)
+ ..controls (3.447134,-0.393593) and (3.463753,-0.385844)
+ ..(3.480313,-0.388764)
+ ..controls (3.496874,-0.391684) and (3.50984,-0.40465)
+ ..(3.51276,-0.42121)\dpicstop
+\dpicdraw[line width=0.4bp](3.51276,-0.42121) circle (0.00109in)\dpicstop
+\dpicdraw (3.51276,-0.42121)
+ ..controls (3.496958,-0.426962) and (3.479246,-0.422216)
+ ..(3.468437,-0.409334)
+ ..controls (3.457628,-0.396453) and (3.45603,-0.378186)
+ ..(3.464438,-0.363623)
+ ..controls (3.472846,-0.34906) and (3.489464,-0.34131)
+ ..(3.506025,-0.34423)
+ ..controls (3.522585,-0.347151) and (3.535551,-0.360116)
+ ..(3.538471,-0.376677)\dpicstop
+\dpicdraw[line width=0.4bp](3.538471,-0.376677) circle (0.00109in)\dpicstop
+\dpicdraw (3.538471,-0.376677)
+ ..controls (3.518982,-0.38377) and (3.497303,-0.374791)
+ ..(3.488538,-0.355994)
+ ..controls (3.479773,-0.337197) and (3.486829,-0.314818)
+ ..(3.50479,-0.304448)
+ ..controls (3.522752,-0.294078) and (3.54566,-0.299157)
+ ..(3.557556,-0.316146)\dpicstop
+\dpicdraw[line width=0.4bp](3.557556,-0.316146) circle (0.00109in)\dpicstop
+\dpicdraw (3.557556,-0.316146)
+ --(3.620863,-0.206496)\dpicstop
+\dpicdraw (3.620863,-0.206496)
+ --(3.620863,-0.079883)\dpicstop
+\dpicdraw[line width=0.4bp](3.620863,-0.079883) circle (0.00109in)\dpicstop
+\dpicdraw (3.620863,-0.079883)
+ ..controls (3.602066,-0.088648) and (3.579687,-0.081592)
+ ..(3.569317,-0.06363)
+ ..controls (3.558947,-0.045669) and (3.564026,-0.02276)
+ ..(3.581015,-0.010864)
+ ..controls (3.598005,0.001032) and (3.621268,-0.002031)
+ ..(3.6346,-0.017919)\dpicstop
+\dpicdraw[line width=0.4bp](3.6346,-0.017919) circle (0.00109in)\dpicstop
+\dpicdraw (3.6346,-0.017919)
+ ..controls (3.623791,-0.030801) and (3.606079,-0.035546)
+ ..(3.590277,-0.029795)
+ ..controls (3.574476,-0.024044) and (3.563958,-0.009023)
+ ..(3.563958,0.007793)
+ ..controls (3.563958,0.024609) and (3.574476,0.039629)
+ ..(3.590277,0.04538)
+ ..controls (3.606079,0.051132) and (3.623791,0.046386)
+ ..(3.6346,0.033504)\dpicstop
+\dpicdraw[line width=0.4bp](3.6346,0.033504) circle (0.00109in)\dpicstop
+\dpicdraw (3.6346,0.033504)
+ ..controls (3.623791,0.020622) and (3.606079,0.015877)
+ ..(3.590277,0.021628)
+ ..controls (3.574476,0.027379) and (3.563958,0.0424)
+ ..(3.563958,0.059216)
+ ..controls (3.563958,0.076032) and (3.574476,0.091052)
+ ..(3.590277,0.096803)
+ ..controls (3.606079,0.102555) and (3.623791,0.097809)
+ ..(3.6346,0.084927)\dpicstop
+\dpicdraw[line width=0.4bp](3.6346,0.084927) circle (0.00109in)\dpicstop
+\dpicdraw (3.6346,0.084927)
+ ..controls (3.621268,0.069039) and (3.598005,0.065976)
+ ..(3.581015,0.077873)
+ ..controls (3.564026,0.089769) and (3.558947,0.112677)
+ ..(3.569317,0.130639)
+ ..controls (3.579687,0.1486) and (3.602066,0.155656)
+ ..(3.620863,0.146891)\dpicstop
+\dpicdraw[line width=0.4bp](3.620863,0.146891) circle (0.00109in)\dpicstop
+\dpicdraw (3.620863,0.146891)
+ --(3.620863,0.273504)\dpicstop
+\dpicdraw (3.620863,0.273504)
+ --(3.557556,0.383154)\dpicstop
+\dpicdraw[line width=0.4bp](3.557556,0.383154) circle (0.00109in)\dpicstop
+\dpicdraw (3.557556,0.383154)
+ ..controls (3.54566,0.366165) and (3.522752,0.361086)
+ ..(3.50479,0.371456)
+ ..controls (3.486829,0.381826) and (3.479773,0.404205)
+ ..(3.488538,0.423002)
+ ..controls (3.497303,0.441799) and (3.518982,0.450779)
+ ..(3.538471,0.443685)\dpicstop
+\dpicdraw[line width=0.4bp](3.538471,0.443685) circle (0.00109in)\dpicstop
+\dpicdraw (3.538471,0.443685)
+ ..controls (3.535551,0.427125) and (3.522585,0.414159)
+ ..(3.506025,0.411239)
+ ..controls (3.489464,0.408319) and (3.472846,0.416068)
+ ..(3.464438,0.430631)
+ ..controls (3.45603,0.445194) and (3.457628,0.463461)
+ ..(3.468437,0.476343)
+ ..controls (3.479246,0.489224) and (3.496958,0.49397)
+ ..(3.51276,0.488219)\dpicstop
+\dpicdraw[line width=0.4bp](3.51276,0.488219) circle (0.00109in)\dpicstop
+\dpicdraw (3.51276,0.488219)
+ ..controls (3.50984,0.471658) and (3.496874,0.458692)
+ ..(3.480313,0.455772)
+ ..controls (3.463753,0.452852) and (3.447134,0.460602)
+ ..(3.438726,0.475165)
+ ..controls (3.430318,0.489728) and (3.431916,0.507994)
+ ..(3.442726,0.520876)
+ ..controls (3.453535,0.533758) and (3.471246,0.538504)
+ ..(3.487048,0.532752)\dpicstop
+\dpicdraw[line width=0.4bp](3.487048,0.532752) circle (0.00109in)\dpicstop
+\dpicdraw (3.487048,0.532752)
+ ..controls (3.483447,0.512327) and (3.464831,0.498043)
+ ..(3.44417,0.499851)
+ ..controls (3.423508,0.501658) and (3.407656,0.518958)
+ ..(3.407656,0.539698)
+ ..controls (3.407656,0.560439) and (3.423508,0.577738)
+ ..(3.44417,0.579546)\dpicstop
+\dpicdraw[line width=0.4bp](3.44417,0.579546) circle (0.00109in)\dpicstop
+\dpicdraw (3.44417,0.579546)
+ --(3.380863,0.689196)\dpicstop
+\dpicdraw (3.380863,0.689196)
+ --(3.271213,0.752503)\dpicstop
+\dpicdraw[line width=0.4bp](3.271213,0.752503) circle (0.00109in)\dpicstop
+\dpicdraw (3.271213,0.752503)
+ ..controls (3.269405,0.731842) and (3.252105,0.715989)
+ ..(3.231365,0.715989)
+ ..controls (3.210625,0.715989) and (3.193325,0.731842)
+ ..(3.191517,0.752503)
+ ..controls (3.18971,0.773164) and (3.203994,0.79178)
+ ..(3.224419,0.795381)\dpicstop
+\dpicdraw[line width=0.4bp](3.224419,0.795381) circle (0.00109in)\dpicstop
+\dpicdraw (3.224419,0.795381)
+ ..controls (3.23017,0.77958) and (3.225425,0.761868)
+ ..(3.212543,0.751059)
+ ..controls (3.199661,0.74025) and (3.181394,0.738652)
+ ..(3.166831,0.74706)
+ ..controls (3.152268,0.755468) and (3.144519,0.772086)
+ ..(3.147439,0.788647)
+ ..controls (3.150359,0.805207) and (3.163325,0.818173)
+ ..(3.179885,0.821093)\dpicstop
+\dpicdraw[line width=0.4bp](3.179885,0.821093) circle (0.00109in)\dpicstop
+\dpicdraw (3.179885,0.821093)
+ ..controls (3.185637,0.805291) and (3.180891,0.787579)
+ ..(3.168009,0.77677)
+ ..controls (3.155127,0.765961) and (3.136861,0.764363)
+ ..(3.122298,0.772771)
+ ..controls (3.107735,0.781179) and (3.099985,0.797798)
+ ..(3.102905,0.814358)
+ ..controls (3.105825,0.830919) and (3.118791,0.843884)
+ ..(3.135352,0.846804)\dpicstop
+\dpicdraw[line width=0.4bp](3.135352,0.846804) circle (0.00109in)\dpicstop
+\dpicdraw (3.135352,0.846804)
+ ..controls (3.142445,0.827315) and (3.133466,0.805637)
+ ..(3.114669,0.796871)
+ ..controls (3.095872,0.788106) and (3.073493,0.795162)
+ ..(3.063123,0.813124)
+ ..controls (3.052753,0.831085) and (3.057832,0.853994)
+ ..(3.074821,0.86589)\dpicstop
+\dpicdraw[line width=0.4bp](3.074821,0.86589) circle (0.00109in)\dpicstop
+\dpicdraw (3.074821,0.86589)
+ --(2.965171,0.929196)\dpicstop
+\dpicdraw (2.965171,0.929196)
+ --(2.838558,0.929196)\dpicstop
+\dpicdraw[line width=0.4bp](2.838558,0.929196) circle (0.00109in)\dpicstop
+\dpicdraw (2.838558,0.929196)
+ ..controls (2.847323,0.910399) and (2.840267,0.888021)
+ ..(2.822305,0.877651)
+ ..controls (2.804344,0.86728) and (2.781435,0.872359)
+ ..(2.769539,0.889349)
+ ..controls (2.757643,0.906338) and (2.760706,0.929602)
+ ..(2.776594,0.942933)\dpicstop
+\dpicdraw[line width=0.4bp](2.776594,0.942933) circle (0.00109in)\dpicstop
+\dpicdraw (2.776594,0.942933)
+ ..controls (2.789476,0.932124) and (2.794221,0.914413)
+ ..(2.78847,0.898611)
+ ..controls (2.782719,0.882809) and (2.767698,0.872292)
+ ..(2.750882,0.872292)
+ ..controls (2.734066,0.872292) and (2.719046,0.882809)
+ ..(2.713295,0.898611)
+ ..controls (2.707543,0.914413) and (2.712289,0.932124)
+ ..(2.725171,0.942933)\dpicstop
+\dpicdraw[line width=0.4bp](2.725171,0.942933) circle (0.00109in)\dpicstop
+\dpicdraw (2.725171,0.942933)
+ ..controls (2.738053,0.932124) and (2.742798,0.914413)
+ ..(2.737047,0.898611)
+ ..controls (2.731296,0.882809) and (2.716275,0.872292)
+ ..(2.699459,0.872292)
+ ..controls (2.682643,0.872292) and (2.667623,0.882809)
+ ..(2.661872,0.898611)
+ ..controls (2.65612,0.914413) and (2.660866,0.932124)
+ ..(2.673748,0.942933)\dpicstop
+\dpicdraw[line width=0.4bp](2.673748,0.942933) circle (0.00109in)\dpicstop
+\dpicdraw (2.673748,0.942933)
+ ..controls (2.689636,0.929602) and (2.692698,0.906338)
+ ..(2.680802,0.889349)
+ ..controls (2.668906,0.872359) and (2.645998,0.86728)
+ ..(2.628036,0.877651)
+ ..controls (2.610075,0.888021) and (2.603019,0.910399)
+ ..(2.611784,0.929196)\dpicstop
+\dpicdraw[line width=0.4bp](2.611784,0.929196) circle (0.00109in)\dpicstop
+\dpicdraw (2.611784,0.929196)
+ --(2.485171,0.929196)\dpicstop
+\dpicdraw (2.485171,0.929196)
+ --(2.375521,0.86589)\dpicstop
+\dpicdraw[line width=0.4bp](2.375521,0.86589) circle (0.00109in)\dpicstop
+\dpicdraw (2.375521,0.86589)
+ ..controls (2.39251,0.853994) and (2.397589,0.831085)
+ ..(2.387219,0.813124)
+ ..controls (2.376848,0.795162) and (2.35447,0.788106)
+ ..(2.335673,0.796871)
+ ..controls (2.316876,0.805637) and (2.307896,0.827315)
+ ..(2.31499,0.846804)\dpicstop
+\dpicdraw[line width=0.4bp](2.31499,0.846804) circle (0.00109in)\dpicstop
+\dpicdraw (2.31499,0.846804)
+ ..controls (2.33155,0.843884) and (2.344516,0.830919)
+ ..(2.347436,0.814358)
+ ..controls (2.350356,0.797798) and (2.342607,0.781179)
+ ..(2.328044,0.772771)
+ ..controls (2.313481,0.764363) and (2.295214,0.765961)
+ ..(2.282332,0.77677)
+ ..controls (2.269451,0.787579) and (2.264705,0.805291)
+ ..(2.270456,0.821093)\dpicstop
+\dpicdraw[line width=0.4bp](2.270456,0.821093) circle (0.00109in)\dpicstop
+\dpicdraw (2.270456,0.821093)
+ ..controls (2.287017,0.818173) and (2.299983,0.805207)
+ ..(2.302903,0.788647)
+ ..controls (2.305823,0.772086) and (2.298073,0.755468)
+ ..(2.28351,0.74706)
+ ..controls (2.268947,0.738652) and (2.25068,0.74025)
+ ..(2.237799,0.751059)
+ ..controls (2.224917,0.761868) and (2.220171,0.77958)
+ ..(2.225923,0.795381)\dpicstop
+\dpicdraw[line width=0.4bp](2.225923,0.795381) circle (0.00109in)\dpicstop
+\dpicdraw (2.225923,0.795381)
+ ..controls (2.246348,0.79178) and (2.260632,0.773164)
+ ..(2.258824,0.752503)
+ ..controls (2.257017,0.731842) and (2.239717,0.715989)
+ ..(2.218977,0.715989)
+ ..controls (2.198236,0.715989) and (2.180936,0.731842)
+ ..(2.179129,0.752503)\dpicstop
+\dpicdraw[line width=0.4bp](2.179129,0.752503) circle (0.00109in)\dpicstop
+\dpicdraw (2.179129,0.752503)
+ --(2.069479,0.689196)\dpicstop
+\dpicdraw (2.069479,0.689196)
+ --(2.006172,0.579546)\dpicstop
+\dpicdraw[line width=0.4bp](2.006172,0.579546) circle (0.00109in)\dpicstop
+\dpicdraw (2.006172,0.579546)
+ ..controls (2.026833,0.577738) and (2.042686,0.560439)
+ ..(2.042686,0.539698)
+ ..controls (2.042686,0.518958) and (2.026833,0.501658)
+ ..(2.006172,0.499851)
+ ..controls (1.985511,0.498043) and (1.966895,0.512327)
+ ..(1.963293,0.532752)\dpicstop
+\dpicdraw[line width=0.4bp](1.963293,0.532752) circle (0.00109in)\dpicstop
+\dpicdraw (1.963293,0.532752)
+ ..controls (1.979095,0.538504) and (1.996807,0.533758)
+ ..(2.007616,0.520876)
+ ..controls (2.018425,0.507994) and (2.020023,0.489728)
+ ..(2.011615,0.475165)
+ ..controls (2.003207,0.460602) and (1.986589,0.452852)
+ ..(1.970028,0.455772)
+ ..controls (1.953468,0.458692) and (1.940502,0.471658)
+ ..(1.937582,0.488219)\dpicstop
+\dpicdraw[line width=0.4bp](1.937582,0.488219) circle (0.00109in)\dpicstop
+\dpicdraw (1.937582,0.488219)
+ ..controls (1.953384,0.49397) and (1.971095,0.489224)
+ ..(1.981905,0.476343)
+ ..controls (1.992714,0.463461) and (1.994312,0.445194)
+ ..(1.985904,0.430631)
+ ..controls (1.977496,0.416068) and (1.960877,0.408319)
+ ..(1.944317,0.411239)
+ ..controls (1.927756,0.414159) and (1.914791,0.427125)
+ ..(1.91187,0.443685)\dpicstop
+\dpicdraw[line width=0.4bp](1.91187,0.443685) circle (0.00109in)\dpicstop
+\dpicdraw (1.91187,0.443685)
+ ..controls (1.93136,0.450779) and (1.953038,0.441799)
+ ..(1.961804,0.423002)
+ ..controls (1.970569,0.404205) and (1.963513,0.381826)
+ ..(1.945551,0.371456)
+ ..controls (1.92759,0.361086) and (1.904681,0.366165)
+ ..(1.892785,0.383154)\dpicstop
+\dpicdraw[line width=0.4bp](1.892785,0.383154) circle (0.00109in)\dpicstop
+\dpicdraw (1.892785,0.383154)
+ --(1.829479,0.273504)\dpicstop
+\dpicdraw (1.829479,0.273504)
+ --(1.829479,0.146891)\dpicstop
+\dpicdraw[line width=0.4bp](1.829479,0.146891) circle (0.00109in)\dpicstop
+\dpicdraw (1.829479,0.146891)
+ ..controls (1.848276,0.155656) and (1.870654,0.1486)
+ ..(1.881024,0.130639)
+ ..controls (1.891394,0.112677) and (1.886316,0.089769)
+ ..(1.869326,0.077873)
+ ..controls (1.852337,0.065976) and (1.829073,0.069039)
+ ..(1.815742,0.084927)\dpicstop
+\dpicdraw[line width=0.4bp](1.815742,0.084927) circle (0.00109in)\dpicstop
+\dpicdraw (1.815742,0.084927)
+ ..controls (1.826551,0.097809) and (1.844262,0.102555)
+ ..(1.860064,0.096803)
+ ..controls (1.875866,0.091052) and (1.886383,0.076032)
+ ..(1.886383,0.059216)
+ ..controls (1.886383,0.0424) and (1.875866,0.027379)
+ ..(1.860064,0.021628)
+ ..controls (1.844262,0.015877) and (1.826551,0.020622)
+ ..(1.815742,0.033504)\dpicstop
+\dpicdraw[line width=0.4bp](1.815742,0.033504) circle (0.00109in)\dpicstop
+\dpicdraw (1.815742,0.033504)
+ ..controls (1.826551,0.046386) and (1.844262,0.051132)
+ ..(1.860064,0.04538)
+ ..controls (1.875866,0.039629) and (1.886383,0.024609)
+ ..(1.886383,0.007793)
+ ..controls (1.886383,-0.009023) and (1.875866,-0.024044)
+ ..(1.860064,-0.029795)
+ ..controls (1.844262,-0.035546) and (1.826551,-0.030801)
+ ..(1.815742,-0.017919)\dpicstop
+\dpicdraw[line width=0.4bp](1.815742,-0.017919) circle (0.00109in)\dpicstop
+\dpicdraw (1.815742,-0.017919)
+ ..controls (1.829073,-0.002031) and (1.852337,0.001032)
+ ..(1.869326,-0.010864)
+ ..controls (1.886316,-0.02276) and (1.891394,-0.045669)
+ ..(1.881024,-0.06363)
+ ..controls (1.870654,-0.081592) and (1.848276,-0.088648)
+ ..(1.829479,-0.079883)\dpicstop
+\dpicdraw[line width=0.4bp](1.829479,-0.079883) circle (0.00109in)\dpicstop
+\dpicdraw (1.829479,-0.079883)
+ --(1.829479,-0.206496)\dpicstop
+\dpicdraw (1.829479,-0.206496)
+ --(1.892785,-0.316146)\dpicstop
+\dpicdraw[line width=0.4bp](1.892785,-0.316146) circle (0.00109in)\dpicstop
+\dpicdraw (1.892785,-0.316146)
+ ..controls (1.904681,-0.299157) and (1.92759,-0.294078)
+ ..(1.945551,-0.304448)
+ ..controls (1.963513,-0.314818) and (1.970569,-0.337197)
+ ..(1.961804,-0.355994)
+ ..controls (1.953038,-0.374791) and (1.93136,-0.38377)
+ ..(1.91187,-0.376677)\dpicstop
+\dpicdraw[line width=0.4bp](1.91187,-0.376677) circle (0.00109in)\dpicstop
+\dpicdraw (1.91187,-0.376677)
+ ..controls (1.914791,-0.360116) and (1.927756,-0.347151)
+ ..(1.944317,-0.34423)
+ ..controls (1.960877,-0.34131) and (1.977496,-0.34906)
+ ..(1.985904,-0.363623)
+ ..controls (1.994312,-0.378186) and (1.992714,-0.396453)
+ ..(1.981905,-0.409334)
+ ..controls (1.971095,-0.422216) and (1.953384,-0.426962)
+ ..(1.937582,-0.42121)\dpicstop
+\dpicdraw[line width=0.4bp](1.937582,-0.42121) circle (0.00109in)\dpicstop
+\dpicdraw (1.937582,-0.42121)
+ ..controls (1.940502,-0.40465) and (1.953468,-0.391684)
+ ..(1.970028,-0.388764)
+ ..controls (1.986589,-0.385844) and (2.003207,-0.393593)
+ ..(2.011615,-0.408156)
+ ..controls (2.020023,-0.422719) and (2.018425,-0.440986)
+ ..(2.007616,-0.453868)
+ ..controls (1.996807,-0.46675) and (1.979095,-0.471496)
+ ..(1.963293,-0.465744)\dpicstop
+\dpicdraw[line width=0.4bp](1.963293,-0.465744) circle (0.00109in)\dpicstop
+\dpicdraw (1.963293,-0.465744)
+ ..controls (1.966895,-0.445319) and (1.985511,-0.431035)
+ ..(2.006172,-0.432842)
+ ..controls (2.026833,-0.43465) and (2.042686,-0.45195)
+ ..(2.042686,-0.47269)
+ ..controls (2.042686,-0.49343) and (2.026833,-0.51073)
+ ..(2.006172,-0.512538)\dpicstop
+\dpicdraw[line width=0.4bp](2.006172,-0.512538) circle (0.00109in)\dpicstop
+\dpicdraw (2.006172,-0.512538)
+ --(2.069479,-0.622188)\dpicstop
+\dpicdraw (2.069479,-0.622188)
+ --(2.179129,-0.685495)\dpicstop
+\dpicdraw[line width=0.4bp](2.179129,-0.685495) circle (0.00109in)\dpicstop
+\dpicdraw (2.179129,-0.685495)
+ ..controls (2.180936,-0.664833) and (2.198236,-0.648981)
+ ..(2.218977,-0.648981)
+ ..controls (2.239717,-0.648981) and (2.257017,-0.664833)
+ ..(2.258824,-0.685495)
+ ..controls (2.260632,-0.706156) and (2.246348,-0.724772)
+ ..(2.225923,-0.728373)\dpicstop
+\dpicdraw[line width=0.4bp](2.225923,-0.728373) circle (0.00109in)\dpicstop
+\dpicdraw (2.225923,-0.728373)
+ ..controls (2.220171,-0.712571) and (2.224917,-0.69486)
+ ..(2.237799,-0.684051)
+ ..controls (2.25068,-0.673242) and (2.268947,-0.671643)
+ ..(2.28351,-0.680051)
+ ..controls (2.298073,-0.688459) and (2.305823,-0.705078)
+ ..(2.302903,-0.721638)
+ ..controls (2.299983,-0.738199) and (2.287017,-0.751165)
+ ..(2.270456,-0.754085)\dpicstop
+\dpicdraw[line width=0.4bp](2.270456,-0.754085) circle (0.00109in)\dpicstop
+\dpicdraw (2.270456,-0.754085)
+ ..controls (2.264705,-0.738283) and (2.269451,-0.720571)
+ ..(2.282332,-0.709762)
+ ..controls (2.295214,-0.698953) and (2.313481,-0.697355)
+ ..(2.328044,-0.705763)
+ ..controls (2.342607,-0.714171) and (2.350356,-0.730789)
+ ..(2.347436,-0.74735)
+ ..controls (2.344516,-0.76391) and (2.33155,-0.776876)
+ ..(2.31499,-0.779796)\dpicstop
+\dpicdraw[line width=0.4bp](2.31499,-0.779796) circle (0.00109in)\dpicstop
+\dpicdraw (2.31499,-0.779796)
+ ..controls (2.307896,-0.760307) and (2.316876,-0.738628)
+ ..(2.335673,-0.729863)
+ ..controls (2.35447,-0.721098) and (2.376848,-0.728154)
+ ..(2.387219,-0.746115)
+ ..controls (2.397589,-0.764077) and (2.39251,-0.786985)
+ ..(2.375521,-0.798881)\dpicstop
+\dpicdraw[line width=0.4bp](2.375521,-0.798881) circle (0.00109in)\dpicstop
+\dpicdraw (2.375521,-0.798881)
+ --(2.485171,-0.862188)\dpicstop
+\dpicdraw (2.545171,-0.638265)
+ --(2.625171,-0.638265)
+ --(2.641837,-0.604932)
+ --(2.675171,-0.671598)
+ --(2.708504,-0.604932)
+ --(2.741837,-0.671598)
+ --(2.775171,-0.604932)
+ --(2.808504,-0.671598)
+ --(2.825171,-0.638265)
+ --(2.905171,-0.638265)\dpicstop
+\dpicdraw (2.905171,-0.638265)
+ --(2.974453,-0.598265)
+ --(2.97222,-0.561064)
+ --(3.034421,-0.602133)
+ --(3.029955,-0.527731)
+ --(3.092156,-0.568799)
+ --(3.08769,-0.494398)
+ --(3.149891,-0.535466)
+ --(3.147658,-0.498265)
+ --(3.21694,-0.458265)\dpicstop
+\dpicdraw (3.21694,-0.458265)
+ --(3.25694,-0.388983)
+ --(3.236406,-0.357883)
+ --(3.310807,-0.362348)
+ --(3.269739,-0.300148)
+ --(3.344141,-0.304613)
+ --(3.303072,-0.242413)
+ --(3.377474,-0.246878)
+ --(3.35694,-0.215778)
+ --(3.39694,-0.146496)\dpicstop
+\dpicdraw (3.39694,-0.146496)
+ --(3.39694,-0.066496)
+ --(3.363607,-0.049829)
+ --(3.430273,-0.016496)
+ --(3.363607,0.016837)
+ --(3.430273,0.050171)
+ --(3.363607,0.083504)
+ --(3.430273,0.116837)
+ --(3.39694,0.133504)
+ --(3.39694,0.213504)\dpicstop
+\dpicdraw (3.39694,0.213504)
+ --(3.35694,0.282786)
+ --(3.319739,0.280553)
+ --(3.360807,0.342754)
+ --(3.286406,0.338288)
+ --(3.327474,0.400489)
+ --(3.253072,0.396023)
+ --(3.294141,0.458224)
+ --(3.25694,0.455991)
+ --(3.21694,0.525273)\dpicstop
+\dpicdraw (3.21694,0.525273)
+ --(3.147658,0.565273)
+ --(3.116557,0.544739)
+ --(3.121023,0.619141)
+ --(3.058822,0.578072)
+ --(3.063288,0.652474)
+ --(3.001087,0.611406)
+ --(3.005553,0.685807)
+ --(2.974453,0.665273)
+ --(2.905171,0.705273)\dpicstop
+\dpicdraw (2.905171,0.705273)
+ --(2.825171,0.705273)
+ --(2.808504,0.67194)
+ --(2.775171,0.738607)
+ --(2.741837,0.67194)
+ --(2.708504,0.738607)
+ --(2.675171,0.67194)
+ --(2.641837,0.738607)
+ --(2.625171,0.705273)
+ --(2.545171,0.705273)\dpicstop
+\dpicdraw (2.545171,0.705273)
+ --(2.475889,0.665273)
+ --(2.478122,0.628072)
+ --(2.415921,0.669141)
+ --(2.420387,0.594739)
+ --(2.358186,0.635807)
+ --(2.362652,0.561406)
+ --(2.300451,0.602474)
+ --(2.302684,0.565273)
+ --(2.233402,0.525273)\dpicstop
+\dpicdraw (2.233402,0.525273)
+ --(2.193402,0.455991)
+ --(2.213936,0.424891)
+ --(2.139534,0.429357)
+ --(2.180602,0.367156)
+ --(2.106201,0.371622)
+ --(2.147269,0.309421)
+ --(2.072867,0.313887)
+ --(2.093402,0.282786)
+ --(2.053402,0.213504)\dpicstop
+\dpicdraw (2.053402,0.213504)
+ --(2.053402,0.133504)
+ --(2.086735,0.116837)
+ --(2.020068,0.083504)
+ --(2.086735,0.050171)
+ --(2.020068,0.016837)
+ --(2.086735,-0.016496)
+ --(2.020068,-0.049829)
+ --(2.053402,-0.066496)
+ --(2.053402,-0.146496)\dpicstop
+\dpicdraw (2.053402,-0.146496)
+ --(2.093402,-0.215778)
+ --(2.130602,-0.213545)
+ --(2.089534,-0.275746)
+ --(2.163936,-0.27128)
+ --(2.122867,-0.333481)
+ --(2.197269,-0.329015)
+ --(2.156201,-0.391216)
+ --(2.193402,-0.388983)
+ --(2.233402,-0.458265)\dpicstop
+\dpicdraw (2.233402,-0.458265)
+ --(2.302684,-0.498265)
+ --(2.333784,-0.477731)
+ --(2.329318,-0.552133)
+ --(2.391519,-0.511064)
+ --(2.387053,-0.585466)
+ --(2.449254,-0.544398)
+ --(2.444788,-0.618799)
+ --(2.475889,-0.598265)
+ --(2.545171,-0.638265)\dpicstop
+\dpicdraw (2.605171,-0.414342)
+ --(2.705171,-0.414342)\dpicstop
+\dpicdraw (2.705171,-0.464342)
+ --(2.705171,-0.364342)\dpicstop
+\dpicdraw (2.745171,-0.464342)
+ ..controls (2.727308,-0.433402) and (2.727308,-0.395282)
+ ..(2.745171,-0.364342)\dpicstop
+\dpicdraw (2.731773,-0.414342)
+ --(2.845171,-0.414342)\dpicstop
+\dpicdraw (2.845171,-0.414342)
+ --(2.931773,-0.364342)\dpicstop
+\dpicdraw (2.956773,-0.407643)
+ --(2.906773,-0.321041)\dpicstop
+\dpicdraw (2.991414,-0.387643)
+ ..controls (2.960474,-0.36978) and (2.941414,-0.336767)
+ ..(2.941414,-0.301041)\dpicstop
+\dpicdraw (2.954812,-0.351041)
+ --(3.053017,-0.294342)\dpicstop
+\dpicdraw (3.053017,-0.294342)
+ --(3.103017,-0.207739)\dpicstop
+\dpicdraw (3.146318,-0.232739)
+ --(3.059716,-0.182739)\dpicstop
+\dpicdraw (3.166318,-0.198098)
+ ..controls (3.130592,-0.198098) and (3.097579,-0.179039)
+ ..(3.079716,-0.148098)\dpicstop
+\dpicdraw (3.116318,-0.184701)
+ --(3.173017,-0.086496)\dpicstop
+\dpicdraw (3.173017,-0.086496)
+ --(3.173017,0.013504)\dpicstop
+\dpicdraw (3.223017,0.013504)
+ --(3.123017,0.013504)\dpicstop
+\dpicdraw (3.223017,0.053504)
+ ..controls (3.192077,0.035641) and (3.153957,0.035641)
+ ..(3.123017,0.053504)\dpicstop
+\dpicdraw (3.173017,0.040107)
+ --(3.173017,0.153504)\dpicstop
+\dpicdraw (3.173017,0.153504)
+ --(3.123017,0.240107)\dpicstop
+\dpicdraw (3.166318,0.265107)
+ --(3.079716,0.215107)\dpicstop
+\dpicdraw (3.146318,0.299748)
+ ..controls (3.128455,0.268808) and (3.095442,0.249748)
+ ..(3.059716,0.249748)\dpicstop
+\dpicdraw (3.109716,0.263145)
+ --(3.053017,0.36135)\dpicstop
+\dpicdraw (3.053017,0.36135)
+ --(2.966414,0.41135)\dpicstop
+\dpicdraw (2.991414,0.454651)
+ --(2.941414,0.368049)\dpicstop
+\dpicdraw (2.956773,0.474651)
+ ..controls (2.956773,0.438925) and (2.937713,0.405912)
+ ..(2.906773,0.388049)\dpicstop
+\dpicdraw (2.943376,0.424651)
+ --(2.845171,0.48135)\dpicstop
+\dpicdraw (2.845171,0.48135)
+ --(2.745171,0.48135)\dpicstop
+\dpicdraw (2.745171,0.53135)
+ --(2.745171,0.43135)\dpicstop
+\dpicdraw (2.705171,0.53135)
+ ..controls (2.723034,0.50041) and (2.723034,0.46229)
+ ..(2.705171,0.43135)\dpicstop
+\dpicdraw (2.718568,0.48135)
+ --(2.605171,0.48135)\dpicstop
+\dpicdraw (2.605171,0.48135)
+ --(2.518568,0.43135)\dpicstop
+\dpicdraw (2.493568,0.474651)
+ --(2.543568,0.388049)\dpicstop
+\dpicdraw (2.458927,0.454651)
+ ..controls (2.489867,0.436788) and (2.508927,0.403776)
+ ..(2.508927,0.368049)\dpicstop
+\dpicdraw (2.49553,0.418049)
+ --(2.397325,0.36135)\dpicstop
+\dpicdraw (2.397325,0.36135)
+ --(2.347325,0.274748)\dpicstop
+\dpicdraw (2.304023,0.299748)
+ --(2.390626,0.249748)\dpicstop
+\dpicdraw (2.284023,0.265107)
+ ..controls (2.31975,0.265107) and (2.352763,0.246047)
+ ..(2.370626,0.215107)\dpicstop
+\dpicdraw (2.334023,0.251709)
+ --(2.277325,0.153504)\dpicstop
+\dpicdraw (2.277325,0.153504)
+ --(2.277325,0.053504)\dpicstop
+\dpicdraw (2.227325,0.053504)
+ --(2.327325,0.053504)\dpicstop
+\dpicdraw (2.227325,0.013504)
+ ..controls (2.258265,0.031367) and (2.296385,0.031367)
+ ..(2.327325,0.013504)\dpicstop
+\dpicdraw (2.277325,0.026902)
+ --(2.277325,-0.086496)\dpicstop
+\dpicdraw (2.277325,-0.086496)
+ --(2.327325,-0.173098)\dpicstop
+\dpicdraw (2.284023,-0.198098)
+ --(2.370626,-0.148098)\dpicstop
+\dpicdraw (2.304023,-0.232739)
+ ..controls (2.321887,-0.201799) and (2.354899,-0.182739)
+ ..(2.390626,-0.182739)\dpicstop
+\dpicdraw (2.340626,-0.196137)
+ --(2.397325,-0.294342)\dpicstop
+\dpicdraw (2.397325,-0.294342)
+ --(2.483927,-0.344342)\dpicstop
+\dpicdraw (2.458927,-0.387643)
+ --(2.508927,-0.301041)\dpicstop
+\dpicdraw (2.493568,-0.407643)
+ ..controls (2.493568,-0.371917) and (2.512628,-0.338904)
+ ..(2.543568,-0.321041)\dpicstop
+\dpicdraw (2.506966,-0.357643)
+ --(2.605171,-0.414342)\dpicstop
+\dpicdraw (2.665171,-0.190419)
+ --(2.696303,-0.190419)\dpicstop
+\fill[fill=black,line width=0bp](2.696303,-0.190419)
+ --(2.696303,-0.157086)
+ --(2.748504,-0.190419)
+ --(2.696303,-0.223752)
+ --(2.696303,-0.190419)--cycle
+\dpicstop
+\dpicdraw (2.696303,-0.190419)
+ --(2.696303,-0.157086)
+ --(2.748504,-0.190419)
+ --(2.696303,-0.223752)
+ --(2.696303,-0.190419)\dpicstop
+\dpicdraw (2.754038,-0.227804)
+ --(2.754038,-0.153034)\dpicstop
+\dpicdraw (2.754038,-0.190419)
+ --(2.785171,-0.190419)\dpicstop
+\dpicdraw (2.785171,-0.190419)
+ --(2.812132,-0.174853)\dpicstop
+\fill[fill=black,line width=0bp](2.812132,-0.174853)
+ --(2.795466,-0.145985)
+ --(2.857339,-0.148753)
+ --(2.828799,-0.20372)
+ --(2.812132,-0.174853)--cycle
+\dpicstop
+\dpicdraw (2.812132,-0.174853)
+ --(2.795466,-0.145985)
+ --(2.857339,-0.148753)
+ --(2.828799,-0.20372)
+ --(2.812132,-0.174853)\dpicstop
+\dpicdraw (2.880825,-0.178362)
+ --(2.84344,-0.113609)\dpicstop
+\dpicdraw (2.862132,-0.145985)
+ --(2.889094,-0.130419)\dpicstop
+\dpicdraw (2.889094,-0.130419)
+ --(2.90466,-0.103457)\dpicstop
+\fill[fill=black,line width=0bp](2.90466,-0.103457)
+ --(2.875793,-0.086791)
+ --(2.93076,-0.058251)
+ --(2.933528,-0.120124)
+ --(2.90466,-0.103457)--cycle
+\dpicstop
+\dpicdraw (2.90466,-0.103457)
+ --(2.875793,-0.086791)
+ --(2.93076,-0.058251)
+ --(2.933528,-0.120124)
+ --(2.90466,-0.103457)\dpicstop
+\dpicdraw (2.965904,-0.07215)
+ --(2.901151,-0.034765)\dpicstop
+\dpicdraw (2.933528,-0.053457)
+ --(2.949094,-0.026496)\dpicstop
+\dpicdraw (2.949094,-0.026496)
+ --(2.949094,0.004637)\dpicstop
+\fill[fill=black,line width=0bp](2.949094,0.004637)
+ --(2.915761,0.004637)
+ --(2.949094,0.056837)
+ --(2.982427,0.004637)
+ --(2.949094,0.004637)--cycle
+\dpicstop
+\dpicdraw (2.949094,0.004637)
+ --(2.915761,0.004637)
+ --(2.949094,0.056837)
+ --(2.982427,0.004637)
+ --(2.949094,0.004637)\dpicstop
+\dpicdraw (2.986479,0.062372)
+ --(2.911709,0.062372)\dpicstop
+\dpicdraw (2.949094,0.062372)
+ --(2.949094,0.093504)\dpicstop
+\dpicdraw (2.949094,0.093504)
+ --(2.933528,0.120466)\dpicstop
+\fill[fill=black,line width=0bp](2.933528,0.120466)
+ --(2.90466,0.103799)
+ --(2.907427,0.165672)
+ --(2.962395,0.137132)
+ --(2.933528,0.120466)--cycle
+\dpicstop
+\dpicdraw (2.933528,0.120466)
+ --(2.90466,0.103799)
+ --(2.907427,0.165672)
+ --(2.962395,0.137132)
+ --(2.933528,0.120466)\dpicstop
+\dpicdraw (2.937037,0.189158)
+ --(2.872284,0.151773)\dpicstop
+\dpicdraw (2.90466,0.170466)
+ --(2.889094,0.197427)\dpicstop
+\dpicdraw (2.889094,0.197427)
+ --(2.862132,0.212993)\dpicstop
+\fill[fill=black,line width=0bp](2.862132,0.212993)
+ --(2.845466,0.184126)
+ --(2.816926,0.239094)
+ --(2.878799,0.241861)
+ --(2.862132,0.212993)--cycle
+\dpicstop
+\dpicdraw (2.862132,0.212993)
+ --(2.845466,0.184126)
+ --(2.816926,0.239094)
+ --(2.878799,0.241861)
+ --(2.862132,0.212993)\dpicstop
+\dpicdraw (2.830825,0.274237)
+ --(2.79344,0.209485)\dpicstop
+\dpicdraw (2.812132,0.241861)
+ --(2.785171,0.257427)\dpicstop
+\dpicdraw (2.785171,0.257427)
+ --(2.754038,0.257427)\dpicstop
+\fill[fill=black,line width=0bp](2.754038,0.257427)
+ --(2.754038,0.224094)
+ --(2.701838,0.257427)
+ --(2.754038,0.290761)
+ --(2.754038,0.257427)--cycle
+\dpicstop
+\dpicdraw (2.754038,0.257427)
+ --(2.754038,0.224094)
+ --(2.701838,0.257427)
+ --(2.754038,0.290761)
+ --(2.754038,0.257427)\dpicstop
+\dpicdraw (2.696303,0.294812)
+ --(2.696303,0.220042)\dpicstop
+\dpicdraw (2.696303,0.257427)
+ --(2.665171,0.257427)\dpicstop
+\dpicdraw (2.665171,0.257427)
+ --(2.638209,0.241861)\dpicstop
+\fill[fill=black,line width=0bp](2.638209,0.241861)
+ --(2.654876,0.212993)
+ --(2.593003,0.215761)
+ --(2.621543,0.270728)
+ --(2.638209,0.241861)--cycle
+\dpicstop
+\dpicdraw (2.638209,0.241861)
+ --(2.654876,0.212993)
+ --(2.593003,0.215761)
+ --(2.621543,0.270728)
+ --(2.638209,0.241861)\dpicstop
+\dpicdraw (2.569517,0.24537)
+ --(2.606902,0.180617)\dpicstop
+\dpicdraw (2.588209,0.212993)
+ --(2.561248,0.197427)\dpicstop
+\dpicdraw (2.561248,0.197427)
+ --(2.545682,0.170466)\dpicstop
+\fill[fill=black,line width=0bp](2.545682,0.170466)
+ --(2.574549,0.153799)
+ --(2.519581,0.125259)
+ --(2.516814,0.187132)
+ --(2.545682,0.170466)--cycle
+\dpicstop
+\dpicdraw (2.545682,0.170466)
+ --(2.574549,0.153799)
+ --(2.519581,0.125259)
+ --(2.516814,0.187132)
+ --(2.545682,0.170466)\dpicstop
+\dpicdraw (2.484438,0.139158)
+ --(2.54919,0.101773)\dpicstop
+\dpicdraw (2.516814,0.120466)
+ --(2.501248,0.093504)\dpicstop
+\dpicdraw (2.501248,0.093504)
+ --(2.501248,0.062372)\dpicstop
+\fill[fill=black,line width=0bp](2.501248,0.062372)
+ --(2.534581,0.062372)
+ --(2.501248,0.010171)
+ --(2.467914,0.062372)
+ --(2.501248,0.062372)--cycle
+\dpicstop
+\dpicdraw (2.501248,0.062372)
+ --(2.534581,0.062372)
+ --(2.501248,0.010171)
+ --(2.467914,0.062372)
+ --(2.501248,0.062372)\dpicstop
+\dpicdraw (2.463863,0.004637)
+ --(2.538633,0.004637)\dpicstop
+\dpicdraw (2.501248,0.004637)
+ --(2.501248,-0.026496)\dpicstop
+\dpicdraw (2.501248,-0.026496)
+ --(2.516814,-0.053457)\dpicstop
+\fill[fill=black,line width=0bp](2.516814,-0.053457)
+ --(2.545682,-0.036791)
+ --(2.542914,-0.098664)
+ --(2.487946,-0.070124)
+ --(2.516814,-0.053457)--cycle
+\dpicstop
+\dpicdraw (2.516814,-0.053457)
+ --(2.545682,-0.036791)
+ --(2.542914,-0.098664)
+ --(2.487946,-0.070124)
+ --(2.516814,-0.053457)\dpicstop
+\dpicdraw (2.513305,-0.12215)
+ --(2.578058,-0.084765)\dpicstop
+\dpicdraw (2.545682,-0.103457)
+ --(2.561248,-0.130419)\dpicstop
+\dpicdraw (2.561248,-0.130419)
+ --(2.588209,-0.145985)\dpicstop
+\fill[fill=black,line width=0bp](2.588209,-0.145985)
+ --(2.604876,-0.117118)
+ --(2.633416,-0.172085)
+ --(2.571543,-0.174853)
+ --(2.588209,-0.145985)--cycle
+\dpicstop
+\dpicdraw (2.588209,-0.145985)
+ --(2.604876,-0.117118)
+ --(2.633416,-0.172085)
+ --(2.571543,-0.174853)
+ --(2.588209,-0.145985)\dpicstop
+\dpicdraw (2.619517,-0.207229)
+ --(2.656902,-0.142476)\dpicstop
+\dpicdraw (2.638209,-0.174853)
+ --(2.665171,-0.190419)\dpicstop
+\end{tikzpicture}%
diff --git a/graphics/circuit_macros/examples/ex06.m4 b/graphics/circuit_macros/examples/ex06.m4
deleted file mode 100644
index 1fb6b1bd7b..0000000000
--- a/graphics/circuit_macros/examples/ex06.m4
+++ /dev/null
@@ -1,55 +0,0 @@
-.PS
-# ex06.m4
-gen_init
-
-F: box invis wid 1.6i ht 1.8i
-E: box invis wid F.wid ht F.ht
-G: box invis wid 1i ht F.ht
-
- ell = F.ht-0.6i
- r = 0.3i
- offset = 8bp__
- hatch = 0.1i
- dhs = hatch * sqrt(2)
- qmell = F.ht - ell
- kwid = F.wid-qmell-r
-
- hatchbox(wid G.e.x-F.w.x ht F.ht,hatch) with .sw at F.sw
- box invis fill_(1) ht ell wid E.e.x-F.w.x with .nw at F.nw
-
- box wid G.e.x-F.w.x ht F.ht with .sw at F.sw thick linethick*3/2
- Loopover_(`B',
- `B`'T: B.se + (-qmell,qmell)
- line invis fill_(1) from B.se to (B.se,B`'T) then to B`'T then to B.se
- line from (B.w,B`'T) to B`'T chop 0 chop -offset
- line from B`'T up ell chop -offset chop 0
- line from B`'T + (-r,0) up ell
- line dashed from B`'T to B.se
- "\large $0$" at B`'T + (-r/2,ell/2)
- "\large $0$" at B`'T + (qmell/2,ell/2)
- "$t$" at (B`'T,B.n) + (-offset/2,offset)
- sprintf("$\overbrace{\phantom{\hbox to %gin{}}}^{\hbox{$k$}}$",kwid) \
- at B.nw + (kwid/2,0) above
- hatchbox(wid kwid ht ell,hatch,,90) with .nw at B.nw
- line from B.ne to B.se thick linethick*3/2
- ',F,E)
-
- line from (G.w,ET) right G.wid
- line from ET + (0,r) left ET.x-E.w.x
- hatchbox(wid r ht r,hatch,,0) with .se at ET
-
- "$q$" at F.sw + (-offset,offset/3)
- "$\ell$" at (F.w,FT) + (-offset,offset/3)
-
- "$n{+}p{+}m$" at G.ne + (0,offset)
-
- Loopover_(`B',`"\Large $B$" ht 0.2 with .n at B.s + (0,-offset/2)',F,E,G)
-
- # extra left brace to avoid a psfrag problem (bug?)
- sprintf(\
- "$\vphantom{\{}\left.\vrule height %gin depth0pt width0pt\right\}r$",r/2) \
- at ET + (offset,r/2)
-
-# Adjust the bounding box without using s_box:
- move from F.nw+(-12bp__,21bp__) to G.se+(20bp__,-15bp__)
-.PE
diff --git a/graphics/circuit_macros/examples/examples.pdf b/graphics/circuit_macros/examples/examples.pdf
index dd6c413740..79573a2f5e 100644
--- a/graphics/circuit_macros/examples/examples.pdf
+++ b/graphics/circuit_macros/examples/examples.pdf
Binary files differ
diff --git a/graphics/circuit_macros/examples/examples.tex b/graphics/circuit_macros/examples/examples.tex
index 110720cd6a..7223652463 100644
--- a/graphics/circuit_macros/examples/examples.tex
+++ b/graphics/circuit_macros/examples/examples.tex
@@ -22,25 +22,36 @@
\hfill\break
This is a collection of diagrams the author has had occasion to produce
- using m4 circuit macros and others, and dpic or gpic. In some cases
- there are other or better m4 or pic constructs for producing the same
- drawings, but names of the actual source-files are shown for reference.
+ using m4 circuit macros and others, and dpic or gpic.
+
+ Some lists of elements from the manual Circuit\_macros.pdf are included.
+ However, producing diagrams starting from a list of elements is like
+ writing poetry starting from a list of words, so a variety of small and
+ medium circuits and other diagrams are included here in the expectation
+ that you might wish to adapt some of them to your purposes. In some
+ cases there are other or better m4 or pic constructs for producing
+ the same drawings, but names of the actual source-files are shown
+ for reference.
+
Some of the later examples test the boundaries of what can be done
when employing a ``little language'' like pic. Most of the examples
can be processed using either dpic~-p, dpic~-g, or, with exceptions,
gpic~-t, but the possibility of other postprocessing has meant that
sometimes the source is slightly more complicated than it would be if
only one workflow had been assumed. The most simplicity and elegance
- is achieved by sticking to one pic interpreter and one postprocessor.
+ are achieved by sticking to one pic interpreter and one postprocessor.
Color and other embellishments are not included in the standards
documents for circuit elements but examples of their use to call
attention to particular elements are included.
- This document duplicates a few diagrams from the manual
- Circuit\_macros.pdf. There are also a few files in the
- examples directory that are not included in this document. To process
- {\sl file}.m4, for example, type "make {\sl file}.pdf".
+ There are a few files in the examples directory that are not included
+ in this document. To produce .pdf from {\sl file}.m4, for example,
+ type ``make {\sl file}.pdf''.
+
+ Type ``make'' in the extras directory to see more.
\input files
+
+ Type ``make'' in the extras directory to see more.
\endinput
diff --git a/graphics/circuit_macros/examples/extras/Chuck.m4 b/graphics/circuit_macros/examples/extras/Chuck.m4
index 3d85390e80..b926988d81 100644
--- a/graphics/circuit_macros/examples/extras/Chuck.m4
+++ b/graphics/circuit_macros/examples/extras/Chuck.m4
@@ -158,7 +158,7 @@ hidden_thick
line dashed from (-305/2,s*h) to (305/2,s*h)
line dashed from (-305/2,s*30.6) to (305/2,s*30.6)
line dashed from (-305/2,s*21.1) to (305/2,s*21.1)
- line dashed from (-305/2+25+2,s*21.1) to (305/2,s*21.1)
+# line dashed from (-305/2+25+2,s*21.1) to (305/2,s*21.1)
line dashed dashwid/2 from (-305/2+25,s*25/2) down -s*(40/2-25/2-2);
if s<0 then { arc dashed dashwid/4 ccw rad 2 } \
else { up; arc dashed dashwid/4 cw rad 2 }
diff --git a/graphics/circuit_macros/examples/extras/Shadow.m4 b/graphics/circuit_macros/examples/extras/HSVS.m4
index 1ad65d8eb4..1ad65d8eb4 100644
--- a/graphics/circuit_macros/examples/extras/Shadow.m4
+++ b/graphics/circuit_macros/examples/extras/HSVS.m4
diff --git a/graphics/circuit_macros/examples/extras/OpAmpFilter.m4 b/graphics/circuit_macros/examples/extras/OpAmpFilter.m4
index 8e8f82c980..b051ad1da0 100644
--- a/graphics/circuit_macros/examples/extras/OpAmpFilter.m4
+++ b/graphics/circuit_macros/examples/extras/OpAmpFilter.m4
@@ -2,6 +2,7 @@
# OpAmpFilter.m4
cct_init
command "{\small\sf"
+linewid = linewid*0.9
define(`SpecOpAmp',`$1: [ right_
lwtmp = linewid; linewid = 1*scale
diff --git a/graphics/circuit_macros/examples/extras/Planes.m4 b/graphics/circuit_macros/examples/extras/Planes.m4
index 9344bd2dda..236642d93f 100644
--- a/graphics/circuit_macros/examples/extras/Planes.m4
+++ b/graphics/circuit_macros/examples/extras/Planes.m4
@@ -1,5 +1,6 @@
.PS
# Planes.m4
+# https://tex.stackexchange.com/questions/727666/gate-all-around-fet-gaafet-nanosheet-3d-illustration
threeD_init
NeedDpicTools
@@ -7,169 +8,209 @@ NeedDpicTools
# use normal vectors to determine visibility, sort and plot the visible
# facets from back to front.
-# Store a point as x_[i], y_[i], z_[i]
-define(`mktriple',`
- x_[$1] = $2
- y_[$1] = $3
- z_[$1] = $4')
+divert(-1)
+#####################################################################
# Recover point coordinates
define(`triple',`x_[$1], y_[$1], z_[$1]')
+# Store a point as x_[i], y_[i], z_[i]
+define(`mktriple',
+ `x_[$1] = $2
+ y_[$1] = $3
+ z_[$1] = $4 ')
+# Normal vector to stored facet
define(`facetnormal',`cross3D(
- diff3D(triple($1*3+1),triple($1*3)),
- diff3D(triple($1*3+2),triple($1*3+1)))')
+ diff3D(triple((`$1')*3+1),triple((`$1')*3)),
+ diff3D(triple((`$1')*3+2),triple((`$1')*3+1)))')
define(`facetcenter',`sprod3D(0.5,sum3D(triple($1*3),triple($1*3+2)))')
-# Create npositive, arrays dcosine[1..npositive]
-# and index ix[1..npositive] of sorted facets
-# Uses macros facetnormal(i) and facetcenter(i)
-define(`processfacets',`
- npositive = 0
- for i=1 to `$1' do {
- mktriple(0,facetnormal(i))
- dx = dot3D(triple(0),View3D)
- if dx > 0 then {
- dcosine[i] = dx/length3D(triple(0)) # direction cosine normal wrt View3D
- npositive +=1
- dist[npositive] = dot3D(facetcenter(i),View3D) # distance
- ix[npositive] = i
- }
- }
- dpquicksort(dist,1,npositive,ix) ')
+# Facets are rectangles; store NW, NE, SE corners
+# `mkpfacet(index,NW2D,NE2D,-d)'
+define(`mkpfacet',`
+ mktriple((`$1')*3, 0,`$2'.x,`$2'.y) # This uses a right-hand set of
+ mktriple((`$1')*3+1, 0,`$3'.x,`$3'.y) # coords with depth 1st value
+ mktriple((`$1')*3+2,`$4',`$3'.x,`$3'.y)
+ mktriple(0,facetnormal(`$1'))
+ if dot3D(triple(0),View3D) < 0 then {
+ mktriple((`$1')*3,`$4',`$3'.x,`$3'.y)
+ mktriple((`$1')*3+2, 0,`$2'.x,`$2'.y) }
+ ')
-ifelse(1,1,`
-Threeplanes: [
+# View angles azimuth, elevation, rotation (degrees),
+# Implicitly increments m4x
+define(`mkthreeplanes',`
+#mkthreeplanes( wd2h param, ht param, dpth param )
# Size parameters
- a = 3/2
- b = 0.4
- d = 1
+ define(`m4a',`ifelse(`$1',,1.5,(`$1'))')
+ define(`m4b',`ifelse(`$1',,0.4,(`$2'))')
+ define(`m4d',`ifelse(`$1',,0.5,(`$3'))')
# Define intersecting lines in the plane
- A0: -a,-b
- A1: a,-b
- B0: Rot_(A0,120)
- B1: Rot_(A1,120)
- C0: Rot_(A0,240)
- C1: Rot_(A1,240)
-
-# Intersections
-define(`lintersect',`intersect_(`$1'0,`$1'1,`$2'0,`$2'1)')
- AB: lintersect(A,B)
- BC: lintersect(B,C)
- CA: lintersect(C,A)
-
-# Facets are rectangles here; store 3 corners
-define(`mkfacet',`
- mktriple((`$1')*3, 0,`$2'.x,`$2'.y)
- mktriple((`$1')*3+1, 0,`$3'.x,`$3'.y)
- mktriple((`$1')*3+2,-d,`$3'.x,`$3'.y)
- ')
-# Define the facets
- mkfacet(m4inx,A0,CA) mkfacet(m4inx,CA,A0)
- mkfacet(m4inx,CA,AB) mkfacet(m4inx,AB,CA)
- mkfacet(m4inx,AB,A1) mkfacet(m4inx,A1,AB)
-
- mkfacet(m4inx,B0,AB) mkfacet(m4inx,AB,B0)
- mkfacet(m4inx,AB,BC) mkfacet(m4inx,BC,AB)
- mkfacet(m4inx,BC,B1) mkfacet(m4inx,B1,BC)
-
- mkfacet(m4inx,C0,BC) mkfacet(m4inx,BC,C0)
- mkfacet(m4inx,BC,CA) mkfacet(m4inx,CA,BC)
- mkfacet(m4inx,CA,C1) mkfacet(m4inx,C1,CA)
- nfacets = m4x
+ A0: -m4a,-m4b; A1: m4a,-m4b
+ B0: Rot_(A0,120); B1: Rot_(A1,120)
+ C0: Rot_(A0,240); C1: Rot_(A1,240)
+ AB: intersect_(A0,A1,B0,B1)
+ BC: intersect_(B0,B1,C0,C1)
+ CA: intersect_(C0,C1,A0,A1)
+# Define the 9 visible facets
+ mkpfacet(m4inx,A0,CA,-m4d)
+ mkpfacet(m4inx,CA,AB,-m4d)
+ mkpfacet(m4inx,AB,A1,-m4d)
+
+ mkpfacet(m4inx,B0,AB,-m4d)
+ mkpfacet(m4inx,AB,BC,-m4d)
+ mkpfacet(m4inx,BC,B1,-m4d)
+
+ mkpfacet(m4inx,C0,BC,-m4d)
+ mkpfacet(m4inx,BC,CA,-m4d)
+ mkpfacet(m4inx,CA,C1,-m4d)
+')
-# Wierd color
-define(`colr',`ifelse(`$1',,"white",
- `rgbstring(`$1',ifelse(`$2',,`$1',`$2'),ifelse(`$3',,`$1',`$3'))')')
+# Cuboid
+# Requires centre plus three lengths plus 3 angles or equivalent, e.g. 9 dof
+# plus, somehow, color information. Implicitly increments m4cux
+#
+define(`mkcuboid',`# ( xC,yC,zC, wdh,hgt,depth, xrot,yrot,zrot)
+ pushdef(`m4cubx',`define(`m4cux',ifdef(`m4cux',`incr(m4cux)',1))m4cux')
+ pushdef(`xr',`$7') pushdef(`yr',`$8') pushdef(`zr',`$9') dnl
+ pushdef(`wd2',ifelse(`$4',,boxwd,(`$4'))/2) dnl
+ pushdef(`hg2',ifelse(`$5',,boxht,(`$5'))/2) dnl
+ pushdef(`de2',ifelse(`$6',,boxwd,(`$6'))/2) dnl
+ pushdef(`dx',`ifelse(`$1',,0,`$1')') pushdef(`dy',`ifelse(`$2',,0,`$2')') dnl
+ pushdef(`dz',`ifelse(`$3',,0,`$3')') dnl
+ ixc = m4cubx # Front:
+ placecorner(ixc*3,de2,wd2,-hg2) # FSE
+ placecorner(ixc*3+1,de2,wd2,hg2) # FNE
+ placecorner(ixc*3+2,de2,-wd2,hg2) # FNW
+ mktriple(0,facetnormal(ixc))
+ if dot3D(triple(0),View3D) < 0 then {
+ placecorner(ixc*3,-de2,-wd2,-hg2) # FSE
+ placecorner(ixc*3+1,-de2,-wd2,hg2) # FNE
+ placecorner(ixc*3+2,-de2,wd2,hg2)} # FNW
+ ixc = m4cubx # Right:
+ placecorner(ixc*3,-de2,wd2,-hg2) # RSE
+ placecorner(ixc*3+1,-de2,wd2,hg2) # RNE
+ placecorner(ixc*3+2,de2,wd2,hg2) # RNW
+ mktriple(0,facetnormal(ixc))
+ if dot3D(triple(0),View3D) < 0 then {
+ placecorner(ixc*3,de2,-wd2,-hg2) # LSE
+ placecorner(ixc*3+1,de2,-wd2,hg2) # LNE
+ placecorner(ixc*3+2,-de2,-wd2,hg2)}# LNW
+ ixc = m4cubx # Top:
+ placecorner(ixc*3,de2,wd2,hg2) # TSE
+ placecorner(ixc*3+1,-de2,wd2,hg2) # TNE
+ placecorner(ixc*3+2,-de2,-wd2,hg2) # TNW
+ mktriple(0,facetnormal(ixc))
+ if dot3D(triple(0),View3D) < 0 then {
+ placecorner(ixc*3,-de2,wd2,-hg2) # USE U=underside
+ placecorner(ixc*3+1,de2,wd2,-hg2) # UNE
+ placecorner(ixc*3+2,de2,-wd2,-hg2)}# UNW
+ popdef(`m4cubx',`xr',`yr',`zr',`wd2',`hg2',`de2',`dx',`dy',`dz')
+')
+define(`rots',`rot3Dz(ifelse(zr,,0,(zr)*dtor_),rot3Dy(ifelse(yr,,0,(yr)*dtor_),
+ rot3Dx(ifelse(xr,,0,(xr)*dtor_),`$1',`$2',`$3')))')
+define(`placecorner',`mktriple(`$1',sum3D(dx,dy,dz,rots(`$2',`$3',`$4')))')
-# Recover the 4th corner and draw
+# Recover the 4th (SW) corner and draw
+# `drawfacet(index,r,g,b)'
+# `drawfacet(index,line attributes)'
define(`drawfacet',`
- NW_facet: project(triple(($1)*3))
- NE_facet: project(triple(($1)*3+1))
- SE_facet: project(triple(($1)*3+2))
- SW_facet: project(x_[($1)*3+2],y_[($1)*3],z_[($1)*3])
- N_facet: 0.5 between NW_facet and NE_facet
- line from N_facet to NE_facet then to SE_facet then to SW_facet \
- then to NW_facet then to N_facet shaded colr(`$2',`$3',`$4')
-# fill_(ifelse(`$2',,1,`(1-`$2')'))
+dnl print "`$0'($@)"
+ SE[`$1']: project(triple((`$1')*3))
+ NE[`$1']: project(triple((`$1')*3+1))
+ NW[`$1']: project(triple((`$1')*3+2))
+ SW[`$1']: NW[`$1']+SE[`$1']-NE[`$1']
+ N[`$1']: 0.5 between NW[`$1'] and NE[`$1']
+ C[`$1']: 0.5 between NW[`$1'] and SE[`$1']
+ Line[`$1']: line from N[`$1'] to NE[`$1'] then to SE[`$1'] \
+ then to SW[`$1'] then to NW[`$1'] then to N[`$1'] invis `$2'
')
-# View angles azimuth, elevation, rotation (degrees)
- setview( 10, 40 )
-
-# Draw facets, shading with view cosines
- processfacets(nfacets)
- for i=1 to npositive do { drawfacet(ix[i],max(0,1-2*dcosine[ix[i]]),
- dcosine[ix[i]],
- dcosine[ix[i]])
-# for i=1 to npositive do { drawfacet(ix[i],dcosine[ix[i]])
- }
-
-] # Threeplanes
-')
-
-# Bowl
-# vertx_(facet_no,vertex_no)
- define vertx_ { ($1-1)*nvertices + $2 }
-
-# Normal vector to a facet
-define(`facetnormal',`cross3D(
- diff3D(triple(vertx_($1,2)),triple(vertx_($1,1))),
- diff3D(triple(vertx_($1,4)),triple(vertx_($1,1))))')
-
-# Facet center
-define(`facetcenter',`sprod3D(1/4,sum3D(
- sum3D(triple(vertx_(`$1',1)),triple(vertx_(`$1',2))),
- sum3D(triple(vertx_(`$1',3)),triple(vertx_(`$1',4)))))')
-
-define(`drawplane',`
- NW_plane: project(triple(vertx_($1,1)))
- SW_plane: project(triple(vertx_($1,2)))
- SE_plane: project(triple(vertx_($1,3)))
- NE_plane: project(triple(vertx_($1,4)))
- N_plane: 0.5 between NW_plane and NE_plane
- shd = (`$2')^(1/4)
- line from N_plane to NE_plane then to SE_plane then to SW_plane \
- then to NW_plane then to N_plane \
- fill_(ifelse(`$2',,1,shd)) outlined rgbstring(shd,shd,shd)
-# line from NW_plane to NE_plane
- line from SW_plane to SE_plane
- ')
+# Shortcut `processfacets(nfacets)'
+define(`processfacets',
+ `indexfacets(`$1',nvisible)
+ drawfacets(nvisible) ')
-ifelse(1,1,`
- nvertices = 4 # vertices per facet
-Bowl: [
- elevation = 30
- setview( 0, 30 )
- nplanes = 40
- bigradius = 2
- smallradius = 1
- cupht = 1.5
- thin = smallradius/10
-# Define the facet corners
- for i=1 to nplanes do {
- mktriple(vertx_(i,1),rot3Dz((i-1)/nplanes*twopi_,bigradius,0,0))
- mktriple(vertx_(i,2),rot3Dz((i-1)/nplanes*twopi_,smallradius,0,-cupht))
- mktriple(vertx_(i,3),rot3Dz((i )/nplanes*twopi_,smallradius,0,-cupht))
- mktriple(vertx_(i,4),rot3Dz((i )/nplanes*twopi_,bigradius,0,0))
- mktriple(vertx_(nplanes+i,1),triple(vertx_(i,4)))
- mktriple(vertx_(nplanes+i,2),triple(vertx_(i,3)))
- mktriple(vertx_(nplanes+i,3),triple(vertx_(i,2)))
- mktriple(vertx_(nplanes+i,4),triple(vertx_(i,1)))
+# Create nvisible, arrays dircos[1..nvisible],
+# dist[1..nvisible], and index
+# sorted[1..nvisible] of facets; then sort.
+# Uses macros facetnormal(i) and facetcenter(i)
+define(`indexfacets',`nvis = 0
+ for i=1 to `$1' do {
+ mktriple(0,facetnormal(i))
+ dx = dot3D(triple(0),View3D)
+ if dx > 0 then { nvis +=1
+ dircos[nvis] = abs(dx/length3D(triple(0))) # dir cosine normal wrt View3D
+ dist[nvis] = dot3D(facetcenter(i),View3D) # distance along View3D
+ sorted[nvis] = i }
+ }; `$2' = nvis
+ if nvis > 1 then { dpquicksort(dist,1,nvis,sorted) } ')
+
+# Compute posefactor and color, then draw.
+define(`drawfacets',
+ `for i=1 to `$1' do {
+ posefactor=sqrt(dircos[i]*i/(`$1'))
+ ifdef(`facetcolor', facetcolor,
+ mktriple(1,(2+posefactor)/3,(2+posefactor)/3,(2+posefactor)/3) )
+ drawfacet(sorted[i],shaded rgbstring(triple(1)))
}
-# for i=1 to nplanes do {
-# mktriple(vertx_(i,1),rot3Dz((i-1)/nplanes*twopi_,bigradius,0,0))
-# mktriple(vertx_(i,2),rot3Dz((i-1)/nplanes*twopi_,smallradius,0,-cupht))
-# mktriple(vertx_(i,3),rot3Dz((i-1)/nplanes*twopi_,smallradius-thin,0,-cupht))
-# mktriple(vertx_(i,4),rot3Dz((i-1)/nplanes*twopi_,bigradius-thin,0,0))
-# }
-# Find the visible facets and sort
- processfacets(nplanes*2)
-
- for i=1 to npositive do { drawplane(ix[i],dcosine[ix[i]]) }
- ellipse wid 2*bigradius ht 2*bigradius*sin(elevation*dtor_) at project(0,0,0)
-
-] #with .sw at Threeplanes.se
-')
+ ifdef(`facetcolor',`popdef(`facetcolor')')
+ ')
+#####################################################################
+divert(0)dnl
+
+# Threeplanes
+[
+ setview( 10, 40 )
+ define(`m4x',0)
+ mkthreeplanes(3/2,0.4,1); nfacets = m4x
+ pushdef(`facetcolor',`mktriple(1,max(0,1-2*dircos[sorted[i]]),
+ dircos[sorted[i]],dircos[sorted[i]])')
+ processfacets(nfacets)
+ ]
+
+ define setfacetcolor { dnl This reduces color saturation depending on pose
+ mktriple(1,
+ (2*($1)+posefactor)/3,(2*($2)+posefactor)/3,(2*($3)+posefactor)/3) }
+
+# Transistor
+[
+ hsvtorgb(220,0.75,1, r1,g1,b1) # blueish
+ hsvtorgb(60,0.75,1, r2,g2,b2) # greenish
+ setview(-40, 20 )
+ skale = 1/2
+ footw = 5*skale
+ footh = 0.5*skale
+ footd = 3.5*skale
+ cstripd = footd*0.3
+ bludp = (footd-cstripd)/2
+ twd = cstripd
+ srch = 0.35*skale
+ twh = 7.5*srch
+ define(`footcolor',`0.45,0.45,0.45')
+ define(`m4cux',0)
+# ( xC,yC,zC, wd2h,hg2t,depth, xrot,yrot,zrot)
+ mkcuboid(0,0,footh/2,footw,footh,footd)
+ mkcuboid(0,0,footh+bludp/2,footw,bludp,cstripd)
+ mkcuboid( footd/2-bludp/2,0,footh+bludp/2,footw,bludp,bludp)
+ mkcuboid(-footd/2+bludp/2,0,footh+bludp/2,footw,bludp,bludp)
+ mkcuboid(0,0,footh+bludp+twh/2,twd,twh,footd)
+ shelfw = (footw-twd)/2
+ for_(0,2,1,
+ `mkcuboid(0,-footw/2+shelfw/2,footh+bludp+srch*(3/2+2*m4x),
+ shelfw,srch,cstripd)
+ mkcuboid(0, footw/2-shelfw/2,footh+bludp+srch*(3/2+2*m4x),
+ shelfw,srch,cstripd) ')
+ nfacets = m4cux
+ pushdef(`facetcolor',
+ `if sorted[i]<=6 then { setfacetcolor(footcolor) } \# first two blocks
+ else { if sorted[i] <=12 then { setfacetcolor(r1,g1,b1) } \# blue blocks
+ else { if sorted[i] <=15 then {setfacetcolor(r2,g2,b2) } \
+ else { setfacetcolor(footcolor) }}}')
+ indexfacets(nfacets,nvisible) # Tweak the sort:
+ t = sorted[17]; sorted[17] = sorted[18]; sorted[18] = t
+ t = sorted[10]; sorted[10] = sorted[6]; sorted[6] = t
+ drawfacets(nvisible)
+ ] with .sw at last [].se+(0.2,0)
.PE
diff --git a/graphics/circuit_macros/examples/extras/README_extras b/graphics/circuit_macros/examples/extras/README_extras
index ebef7cfcd1..001f8f5002 100644
--- a/graphics/circuit_macros/examples/extras/README_extras
+++ b/graphics/circuit_macros/examples/extras/README_extras
@@ -6,7 +6,7 @@ tikz?" Producing drawings like these can be satisfying, as shown by the
alacrity with which knowledgable people assist when questions are asked.
The questions often have more to do with geometry than drawing language,
and the examples here using m4 with dpic confirm that the coding can
-often be done reasonably in several possible languages.
+be done efficiently in more than one possible language.
This directory is assumed to be a subdirectory of the examples directory
in order to include the necessary definition files.
diff --git a/graphics/circuit_macros/examples/ex02.m4 b/graphics/circuit_macros/examples/extras/ex02.m4
index 2265c1e317..2265c1e317 100644
--- a/graphics/circuit_macros/examples/ex02.m4
+++ b/graphics/circuit_macros/examples/extras/ex02.m4
diff --git a/graphics/circuit_macros/examples/files.tex b/graphics/circuit_macros/examples/files.tex
index 45000c231b..2dbfa7e504 100644
--- a/graphics/circuit_macros/examples/files.tex
+++ b/graphics/circuit_macros/examples/files.tex
@@ -80,6 +80,12 @@
}
\bfig{
+ \centerline{\getpic{Antennas}}
+ \caption{Antenna symbols
+ \src{Antennas.m4}.}
+ }
+
+\bfig{
\centerline{\getpic{Switches}}
\caption{The switch macros; {\tt switch(,,,L|B|D)} is a wrapper
for {\tt lswitch}, {\tt bswitch}, and {\tt dswitch}
@@ -87,12 +93,6 @@
}
\bfig{
- \centerline{\getpic{Antennas}}
- \caption{Antenna symbols
- \src{Antennas.m4}.}
- }
-
-\bfig{
{\small\centerline{\getpic{Opamp}} }
\caption{The opamp
\src{Opamp.m4}.}
@@ -161,7 +161,7 @@
\ifmpost\else\bfig{
\centerline{\getpic{cbresistor}}
\caption{Color-coded through-hole resistors. All are
- 10 percent tolerance except for the last,
+ 10 percent tolerance except the last,
which illustrates 5 percent
\src{cbresistor.m4}.}
}\fi
@@ -248,12 +248,6 @@
}
\bfig{
- \centerline{\getpic{ex02}}
- \caption{Elements at obtuse angles
- \src{ex02.m4}.}
- }
-
-\bfig{
{\small\centerline{\getpic{Optoiso}} }
\caption{Optical isolator: a circuit with right or left orientation
\src{Optoiso.m4}.}
@@ -350,12 +344,24 @@
}
\bfig{
+ \centerline{\getpic{LT3724}}
+ \caption{IC controller and auxiliary elements of a step-down converter
+ \src{LT3524.m4}.}
+ }
+
+\bfig{
\centerline{\getpic{ex04}}
\caption{Labels on non-manhattan elements
\src{ex04.m4}.}
}
\bfig{
+ \centerline{\getpic{Drive}}
+ \caption{Synchronous machine driven by variable-speed drive and rectifier
+ \src{Drive.m4}.}
+ }
+
+\bfig{
\centerline{\getpic{Csource}}
\caption{Realization of a controlled source
(illustrating stacked element labels)
@@ -363,12 +369,6 @@
}
\bfig{
- \centerline{\getpic{Drive}}
- \caption{Synchronous machine driven by variable-speed drive and rectifier
- \src{Drive.m4}.}
- }
-
-\bfig{
\centerline{\getpic{ex16}}
\caption{A rate $1/2$ binary convolutional coder and its state diagram
\src{ex16.m4}.}
@@ -387,9 +387,9 @@
}
\bfig{
- \centerline{\getpic{Rectifiers}}
- \caption{Rectifier circuits and waveforms
- \src{Rectifiers.m4}.}
+ \centerline{\getpic{OneLine}}
+ \caption{Single line distribution diagram
+ \src{OneLine.m4}.}
}
\begin{sidewaysfigure} %\rotatebox{90}{% \begin{landscape} %ignore%
@@ -568,14 +568,15 @@
\caption{Embellishments: the top row illustrates
{\tt shadowed(box|circle|ellipse|line,[at {\sl position}],{\sl keys})}
and the second row
- {\tt ColoredV(box|circle|ellipse,({\sl r,g,b})|(({\sl colorseq})),{\sl attributes})}
+ {\tt ColoredV(box|circle|ellipse,({\sl r,g,b})|(({\sl colorseq})),
+ {\sl attributes})}
\src{Shadowed.m4}.}
}\fi\fi
\bfig{
- \centerline{\getpic{ex06}}
- \caption{Crosshatching
- \src{ex06.m4}.}
+ \centerline{\getpic{Loglog}}
+ \caption{A graph and crosshatching example drawn using the pic language
+ \src{Loglog.m4}.}
}
\bfig{
@@ -584,12 +585,6 @@
\src{Geometry.m4}.}
}
-\bfig{
- \centerline{\getpic{Loglog}}
- \caption{A graph drawn using the pic language
- \src{Loglog.m4}.}
- }
-
\ifmpost\else\ifpostscript\else\bfig{
\centerline{\getpic{Smithchart}}
\caption{A Smith chart
diff --git a/graphics/circuit_macros/examples/ics.m4 b/graphics/circuit_macros/examples/ics.m4
index 5db6a17cea..4212f00bd1 100644
--- a/graphics/circuit_macros/examples/ics.m4
+++ b/graphics/circuit_macros/examples/ics.m4
@@ -1,6 +1,6 @@
divert(-1)
- Macros defining some integrated circuits and connectors for LaTeX
+ `Macros defining some integrated circuits and connectors for LaTeX'
`A sequence of pins along the east or west side of a chip:
lg_pinseq(initial pin no, final pin no,
@@ -121,16 +121,16 @@ define(`ArduinoUno',`[
#
Connector: box wid m4bwid ht m4bht
#
- plen = ifelse(`$4',,`2*L_unit',`$4')
+ m4pl = ifelse(`$3',,`2*L_unit',`$3')
#
foreach_(`x',`ifelse(x,nul,,
- `Pin`'eval(5+m4Lx): line left_ plen from Connector.nw-(0,(5+m4Lx)*lg_pinsep)
+ `Pin`'eval(5+m4Lx): line left_ m4pl from Connector.nw-(0,(5+m4Lx)*lg_pinsep)
{ "x" ljust at last line.start }')',
IOREF, RESET,$+${3}V3,$+${5}V, GND, GND, VIN,
nul, A0, A1, A2, A3, A4, A5)
#
foreach_(`x',`ifelse(x,nul,,
- `Pin`'eval(22-m4Lx): line right_ plen from Connector.ne-(0,m4Lx*lg_pinsep)
+ `Pin`'eval(22-m4Lx): line right_ m4pl from Connector.ne-(0,m4Lx*lg_pinsep)
{ "x" rjust at last line.start }')',
SCL, SDA, AREF, GND, D13, D12, ic_tilde`'D11, ic_tilde`'D10, ic_tilde`'D9, D8,
nul, D7, ic_tilde`'D6, ic_tilde`'D5, D4, ic_tilde`'D3, D2, TX D1, RX D0)
@@ -144,16 +144,16 @@ define(`ArduinoLeonardo',`[
#
Connector: box wid m4bwid ht m4bht
#
- plen = ifelse(`$4',,`2*L_unit',`$4')
+ m4pl = ifelse(`$3',,`2*L_unit',`$3')
#
foreach_(`x',`ifelse(x,nul,,
- `Pin`'eval(5+m4Lx): line left_ plen from Connector.nw-(0,(5+m4Lx)*lg_pinsep)
+ `Pin`'eval(5+m4Lx): line left_ m4pl from Connector.nw-(0,(5+m4Lx)*lg_pinsep)
{ "x" ljust at last line.start }')',
IOREF, RESET,$+${3}V3,$+${5}V, GND, GND, VIN,
nul, A0, A1, A2, A3, A4, A5)
#
foreach_(`x',`ifelse(x,nul,,
- `Pin`'eval(22-m4Lx): line right_ plen from Connector.ne-(0,m4Lx*lg_pinsep)
+ `Pin`'eval(22-m4Lx): line right_ m4pl from Connector.ne-(0,m4Lx*lg_pinsep)
{ "x" rjust at last line.start }')',
SCL, SDA, AREF, GND,
ic_tilde`'D13, D12, ic_tilde`'D11, ic_tilde`'D10, ic_tilde`'D9, D8,
@@ -167,10 +167,10 @@ define(`RPi',`[
define(`m4bht',`ifelse(`$2',,`21*lg_pinsep',`$2')')dnl
#
GPIO: box wid m4bwid ht m4bht
- plen = ifelse(`$4',,`6*L_unit',`$4')
+ m4pl = ifelse(`$3',,`6*L_unit',`$3')
#
define A_LeftGPIO { dnl pin downcount, internal label , pin no above line
- exec sprintf("Pin%g: line left_ plen from GPIO.nw-(0,%g)",\
+ exec sprintf("Pin%g: line left_ m4pl from GPIO.nw-(0,%g)",\
2*(`$'1)-1,(`$'1)*lg_pinsep)
{ "`$'3" ljust at last line.start }
"`$'2" at last line.c above }
@@ -188,7 +188,7 @@ foreach_(`x',`ifelse(x,nul,,`A_LeftGPIO(m4Lx,patsubst(x,;,`,'))')',
;GND )
#
define A_RightGPIO { dnl pin downcount, internal label , pin no above line
- exec sprintf("Pin%g: line right_ plen from GPIO.ne-(0,%g)",\
+ exec sprintf("Pin%g: line right_ m4pl from GPIO.ne-(0,%g)",\
2*(`$'1),(`$'1)*lg_pinsep)
{ "`$'3" rjust at last line.start }
"`$'2" at last line.c above }
@@ -216,17 +216,17 @@ define(`USB_C_Socket',`[
define(`m4bht',`ifelse(`$2',,`14*lg_pinsep',`$2')')dnl
#
Base: box wid m4bwid ht m4bht rad 5/3*lg_pinsep
- plen = ifelse(`$4',,`6*L_unit',`$4')
+ m4pl = ifelse(`$3',,`6*L_unit',`$3')
#
foreach_(`x',
`B`'eval(13-m4Lx): dnl
- line left_ plen from Base.n-(m4bwid/2,(m4Lx+0.5)*lg_pinsep)
+ line left_ m4pl from Base.n-(m4bwid/2,(m4Lx+0.5)*lg_pinsep)
{"x" ljust at last line.start}',
GND, RX1`$+$', RX1`$-$', VBUS, SBU2, D`$-$', D`$+$', CC2, VBUS, TX2`$-$',
TX2`$+$', GND)
#
foreach_(`x',
- `A`'m4Lx: line right_ plen from Base.n+(m4bwid/2,-(m4Lx+0.5)*lg_pinsep)
+ `A`'m4Lx: line right_ m4pl from Base.n+(m4bwid/2,-(m4Lx+0.5)*lg_pinsep)
{"x" rjust at last line.start}',
GND, TX1`$+$', TX1`$-$', VBUS, CC1, D`$+$', D`$-$', SBU1, VBUS, RX2`$-$',
RX2`$+$', GND)
@@ -242,25 +242,25 @@ define(`HDMI_micro',`[
then right m4bwid/3 down m4bwid/3 \
then down m4bht-2*m4bwid/3 then down m4bwid/3 left m4bwid/3 \
then left m4bwid*2/3 then to Here]
- plen = ifelse(`$4',,`6*L_unit',`$4')
+ m4pl = ifelse(`$3',,`6*L_unit',`$3')
#
foreach_(`x',
- `Pin`'m4Lx: line left_ plen from Base.nw-(0,m4bwid/3+m4Lx*lg_pinsep)
+ `Pin`'m4Lx: line left_ m4pl from Base.nw-(0,m4bwid/3+m4Lx*lg_pinsep)
{"x" ljust at last line.start}
"m4Lx" at last line.c above',
HPD, UTILITY, D2`$+$', D2\_SH, D2`$-$', D1`$+$', D1\_SH, D1`$-$',
D0`$+$', D0\_SH, D0`$-$', CLK`$+$', CLK\_SH, CLK`$-$',
CEC, GND, SCL, SDA,$+${5}V)
- line from Base.nw+(m4bwid*2/3-lg_pinsep,0) up plen
+ line from Base.nw+(m4bwid*2/3-lg_pinsep,0) up m4pl
r_text(,21,at last line.c+(-5bp__,0))
r_text(,SH2,at last line.start + (0,-10bp__))
- line from Base.nw+(m4bwid*2/3-2*lg_pinsep,0) up plen
+ line from Base.nw+(m4bwid*2/3-2*lg_pinsep,0) up m4pl
r_text(,20,at last line.c+(-5bp__,0))
r_text(,SH1,at last line.start + (0,-10bp__))
- line from Base.sw+(m4bwid*2/3-lg_pinsep,0) down plen
+ line from Base.sw+(m4bwid*2/3-lg_pinsep,0) down m4pl
r_text(,23,at last line.c+(-5bp__,0))
r_text(,SH4,at last line.start + (0, 10bp__))
- line from Base.sw+(m4bwid*2/3-2*lg_pinsep,0) down plen
+ line from Base.sw+(m4bwid*2/3-2*lg_pinsep,0) down m4pl
r_text(,22,at last line.c+(-5bp__,0))
r_text(,SH3,at last line.start + (0, 10bp__))
#
@@ -312,5 +312,59 @@ define(`DIP',`[ pinct= ifelse(`$1',,8,`$1')
`$3'; resetdir_
popdef(`m4bodywid',`m4bodylen',`m4pinpitch',`m4pinwid',`m4pinlen',`m4direct',
`m4type') ]'))
+ `There is more than one way to draw an IC and
+ label its pins; here is one:'
+ `LT3724( keys ) IC in a [] block
+ keys: pinsep=expr; (0.25)
+ pincount=expr; (8 per side)
+ hght=expr; ((pincount+1)*pinsep)
+ wdth=expr; (0.6*hght)'
+ `8 pins per side; pin labels
+ VIN, SHDN, CSS, BURST_EN, VFB, VC, SYNC, FSET,
+ SGND, SENSEM, SENSEP, PGND, VCC, SW, TG, BOOST'
+define(`LT3724',`[ pushkeys_(`$1',`pinsep:0.25; pincount:8;
+ hght:(m4`'m4pincount+1)*m4`'pinsep; wdth:0.6*m4`'hght')dnl
+ Chip: box wid wdth ht hght shaded rgbstring(.94,.68,.76) "`LT3724'"
+ foreach_(`m4hx',`ifelse(m4hx,nil,,
+ `patsubst(m4hx,^[^:]*:): Chip.nw-(0,m4Lx*hght/(m4pincount+1))
+ "patsubst(m4hx,:.*)" ljust at Chip.nw-(0,m4Lx*hght/(m4pincount+1))')',
+ V$_{\hbox{\tiny IN}}$:VIN, SHDN, C$_{\hbox{\tiny SS}}$:CSS,
+ BURST\_EN:BURST_EN, V$_{\hbox{\tiny FB}}$:VFB, V$_{\hbox{\tiny C}}$:VC, SYNC,
+ f$_{\hbox{\tiny SET}}$:FSET)
+ line right_ 23bp__ from SHDN+(textoffset,textht/2+4bp__)
+ foreach_(`m4hx',`ifelse(m4hx,nil,,
+ `patsubst(m4hx,^[^:]*:): Chip.se+(0,m4Lx*hght/(m4pincount+1))
+ "patsubst(m4hx,:.*)" rjust at Chip.se+(0,m4Lx*hght/(m4pincount+1))')',
+ SGND, SENSE$^-$:SENSEM, SENSE$^+$:SENSEP, PGND,
+ V$_{\hbox{\tiny CC}}$:VCC, SW, TG, BOOST)
+ `$2' popdef(`m4pinsep',`m4pincount',`m4hght',`m4wdth') ]')
+
+
+ `Here is another way to draw an IC and
+ label its pins:'
+ `LT3757( keys ) IC in a [] block
+ keys: pinsep=expr; (0.25)
+ pincount=expr; (8 per side)
+ hght=expr; ((pincount+1)*pinsep)
+ wdth=expr; (0.6*hght)'
+ `8 pins per side; pin labels
+ top: VIN; left: SHU, SYNC, RT, SS;
+ right: GATE, SENSE, FBX;
+ bottom: VC, GND, INTVCC'
+define(`LT3757',`[ pushkeys_(`$1',`pinsep:0.25; pincount:8;
+ hght:(m4`'pincount+1)*m4`'pinsep; wdth:0.6*m4`'hght')dnl
+ Chip: box wid wdth ht hght shaded rgbstring(0.65,0.52,0.325) "`LT3757'" above
+ VIN: Chip.n; "$V_{\hbox{\tiny IN}}$" at VIN below
+ foreach_(`LL',`m43757label(nw,sw,ljust, m4pincount, patsubst(LL,:,`,'))',
+ SHU:2:"SHDN/UVLO", SYNC:5, RT:7, SS:8)
+ line right_ 21bp__ from SHU+(textoffset,4bp__)
+ foreach_(`LL',`m43757label(se,ne,rjust, m4pincount,
+ patsubst(LL,:,`,'))', FBX:1, SENSE:3, GATE:5)
+ foreach_(`LL',`m43757label(sw,se,+(0,textht/3) above, m4pincount,
+ patsubst(LL,:,`,'))',
+ VC:1.5:"V$_{\hbox{\tiny C}}$", GND:5, INTVCC:7.5:"INTV$_{\hbox{\tiny CC}}$")
+ `$2' popdef(`m4pinsep',`m4pincount',`m4hght',`m4wdth') ]')
+define(`m43757label',``$5': `$6'/(`$4'+1) between Chip.`$1' and Chip.`$2'
+ ifelse(`$7',,"`$5'",`$7') at `$5' `$3'')
divert(0)dnl
diff --git a/graphics/circuit_macros/examples/mf/cct.mf b/graphics/circuit_macros/examples/mf/cct.mf
index 37b64057d3..b06f64bca0 100644
--- a/graphics/circuit_macros/examples/mf/cct.mf
+++ b/graphics/circuit_macros/examples/mf/cct.mf
@@ -1,5 +1,5 @@
% cct.mf, generated by Mfpic, v1.10 2012/12/03,
-% from TeX source "font" on 2024/05/30 at 10:30
+% from TeX source "font" on 2024/11/29 at 11:42
numeric mfpicversion; mfpicversion := 110;
if unknown mode: mode := localfont; fi
if unknown mag: mag := 1000/1000; fi
diff --git a/graphics/circuit_macros/examples/shapes.m4 b/graphics/circuit_macros/examples/shapes.m4
index f50b029230..90f0a4e286 100644
--- a/graphics/circuit_macros/examples/shapes.m4
+++ b/graphics/circuit_macros/examples/shapes.m4
@@ -1,163 +1,9 @@
.PS
# shapes.m4
threeD_init
+include(Shapedefs.m4)
divert(-1)
-# shapes.m4
-# 3D structures with complex surfaces and hidden lines are the domain of more
-# sophisticated software packages, but basic shapes can be drawn with pic.
-
-#####################################################
-
- `cylinder3D(xdispl,ydispl,zdispl,diameter,
- [colored "color"])'
-define(`cylinder3D',`[ Start: (0,0)
- xdispl = `$1'; ydispl = `$2'; zdispl = `$3'
- define(`M4CL',`xdispl,ydispl,zdispl')dnl
- lenc = length3D(M4CL)
- diamc = ifelse(`$4',,(lenc/2),`$4') ; radc = diamc/2
- cs = dot3D(View3D,M4CL)/lenc
- End: (Project(M4CL))
- az = atan2(ydispl,xdispl)
- ae = atan2(zdispl,sqrt(xdispl^2+ydispl^2))
- CL: line invis from Start to End; C: CL.c
- nls = int(twopi_*radc/lthick)
- define(`M4PP',`rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,0,0,radc)))')dnl
- for i=0 to nls-1 do { if dot3D(View3D,M4PP) > 0 then {
- P: (Project(M4PP))
- ql = sqrta(dot3D(Light3D,M4PP)/radc)
- line from P to End+P outlined rgbstring(ql,ql,ql) `$5' } }
- Perp: (vperp(CL,radc))
- if cs > 0 then { T: End; B: Start } else { T: Start; B: End }
- rpoint_(from Start to Perp)
- css = sqrta(cs)
- Top: rotellipse(diamc,diamc*cs,
- thick linethick/3 shaded rgbstring(css,css,css)) with .c at T
- W: line thick linethick/3 from T+Perp to B+Perp
- Bot: ellipsearc(diamc,diamc*cs,pi_,twopi_,rp_ang,cw,
- thick linethick/3) with .C at B
- E: line thick linethick/3 from B-Perp to T-Perp
- rpoint_(from Start to End)
-`$6']')
-
- `cone3D(xdispl,ydispl,zdispl,diameter,
- [colored "color"])'
- `internal positions:
- Start (centre of base),
- End (point),
- C (axis centre)'
-define(`cone3D',`[ Start: (0,0)
- xdispl = `$1'; ydispl = `$2'; zdispl = `$3'
- define(`M4CL',`xdispl,ydispl,zdispl')dnl
- lenc = length3D(M4CL)
- diamc = ifelse(`$4',,(lenc/2),`$4') ; radc = diamc/2
- End: (Project(M4CL))
- cs = dot3D(View3D,M4CL)/lenc
- az = atan2(ydispl,xdispl)
- ae = atan2(zdispl,sqrt(xdispl^2+ydispl^2))
- CL: line invis from Start to End; C: CL.c
- nls = int(twopi_*radc/lthick)
- lt = sqrt(radc^2+lenc^2)
- b = 0
- for i=0 to nls-1 do { if dot3D(View3D,
- rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,radc,0,lenc)))) > 0 then {
- ql = sqrta(dot3D(Light3D,
- rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,radc,0,lenc))))/lt)
- P: (Project(rot3Dz(az,rot3Dy(-ae,rot3Dx(-i/nls*twopi_,0,0,radc)))))
- line from P to End outlined rgbstring(ql,ql,ql) `$5'
- if !b then { WB: P; b = 1 }
- } else { if b then { BW: P; b = 0 } } }
- if vlength(CL.x,CL.y) != 0 then { Perp: (vperp(CL,radc,R)) } \
- else { Perp: (radc,0) }
- if cs >= 0 then { T: End; B: Start } else {T: Start; B: End }
- rpoint_(from Start to Perp)
- pout = (vlength(End.x,End.y) > abs(radc*cs))
- if cs < 0 then { css = sqrta(cs)
- if pout then { line thick linethick/3 from BW to End then to WB }
- Bot: rotellipse(diamc,diamc*cs,thick linethick/3 \
- ifelse(`$5',,`shaded rgbstring(css,css,css)',`$5')) with .c at T } \
- else { if pout then {
- line thick linethick/3 from BW to End then to WB
- a = acos((WB.x*Perp.x+WB.y*Perp.y)/radc^2)
- Bot: ellipsearc(diamc,diamc*cs,a,pi_-a,rp_ang,cw, thick linethick/3) \
- with .C at B } \
- else {
- Bot: rotellipse(diamc,diamc*cs,thick linethick/3) with .c at B } }
- rpoint_(from Start to End)
-`$6']')
- `Arrow3D(xdispl,ydispl,zdispl,
- diam,arrowwid,arrowht)'
-define(`Arrow3D',`[ diam_Ar = ifelse(`$4',,linewid/10,`$4')
- wid_Ar = ifelse(`$5',,diam_Ar*2,`$5')
- ht_Ar = ifelse(`$6',,wid_Ar*2,`$6')
- x_Ar = ifelse(`$1',,1,`$1')
- y_Ar = ifelse(`$2',,1,`$2')
- z_Ar = ifelse(`$3',,1,`$3')
- define(`M4Arrow3D',`x_Ar,y_Ar,z_Ar')dnl
- len_Ar = length3D(M4Arrow3D)
- len_Shaft = len_Ar - ht_Ar
- cs_Ar = dot3D(View3D,M4Arrow3D)
- if cs_Ar >= 0 then {
- Shaft: cylinder3D(sprod3D(len_Shaft/len_Ar,M4Arrow3D),diam_Ar)
- Head: cone3D(sprod3D(ht_Ar/len_Ar,M4Arrow3D),wid_Ar) \
- with .Start at Shaft.End } \
- else {
- Head: cone3D(sprod3D(ht_Ar/len_Ar,M4Arrow3D),wid_Ar)
- Shaft: cylinder3D(sprod3D(len_Shaft/len_Ar,M4Arrow3D),diam_Ar) \
- with .End at Head.Start }
- Start: Shaft.Start; End: Head.End
- `$7']')
-
-define(`f2xyz3D',``$1'x = `$2'
-`$1'y = `$3'
-`$1'z = `$4' ')
-
- `prism3D(xdispl,ydispl,zdispl,wid,ht,rotation (rad))'
-define(`prism3D',`[ Start: (0,0)
- xdispl = ifelse(`$1',,linewid,`$1')
- ydispl = ifelse(`$2',,linewid,`$2')
- zdispl = ifelse(`$3',,linewid,`$3')
- widp = ifelse(`$4',,(linewid/5),`$4')
- htp = ifelse(`$5',,(linewid/10),`$5')
- rotp = ifelse(`$6',,0,`$6')
- End: (Project(xdispl,ydispl,zdispl)); C: 0.5 between Start and End
- lenp = length3D(xdispl,ydispl,zdispl)
- az = atan2(ydispl,xdispl); ae = atan2(zdispl,sqrt(xdispl^2+ydispl^2))
- wp2 = widp/2; hp2 = htp/2
-# corners
- f2xyz3D(nwB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0,-wp2, hp2))))
- f2xyz3D(swB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0,-wp2,-hp2))))
- f2xyz3D(seB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0, wp2,-hp2))))
- f2xyz3D(neB,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp, 0, wp2, hp2))))
- f2xyz3D(nwF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp,-wp2, hp2))))
- f2xyz3D(swF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp,-wp2,-hp2))))
- f2xyz3D(seF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp, wp2,-hp2))))
- f2xyz3D(neF,rot3Dz(az,rot3Dy(-ae,rot3Dx(rotp,lenp, wp2, hp2))))
-# facets
- M4Facet3D(neF,nwF,swF,seF)
- M4Facet3D(neB,seB,swB,nwB)
- M4Facet3D(neF,seF,seB,neB)
- M4Facet3D(neF,neB,nwB,nwF)
- M4Facet3D(seF,swF,swB,seB)
- M4Facet3D(nwF,nwB,swB,swF)
-`$7']')
-
-define(`M4Facet3D',`
-define(`PFacet',`cross3D(diff3D(`$2'x,`$2'y,`$2'z,`$1'x,`$1'y,`$1'z),
- diff3D(`$3'x,`$3'y,`$3'z,`$2'x,`$2'y,`$2'z))')
- if dot3D(View3D,PFacet) > 0 then {
- fFacet = sqrta(dot3D(Light3D,PFacet)/length3D(PFacet))
- P1: (Project(`$1'x,`$1'y,`$1'z))
- P2: (Project(`$2'x,`$2'y,`$2'z))
- P3: (Project(`$3'x,`$3'y,`$3'z))
- P4: (Project(`$4'x,`$4'y,`$4'z))
- line fill_(fFacet) invis from P1 to P2 then to P3 then to P4 then to P1
- line from P1 to P2; round
- line to P3; round
- line to P4; round
- line to P1; round } ')
-
-#####################################################
divert(0)dnl
azimuth = 60
diff --git a/graphics/circuit_macros/examples/xfig/xfiglib.fig b/graphics/circuit_macros/examples/xfig/xfiglib.fig
index d67703acc6..91a2e37a53 100644
--- a/graphics/circuit_macros/examples/xfig/xfiglib.fig
+++ b/graphics/circuit_macros/examples/xfig/xfiglib.fig
@@ -289,8 +289,10 @@ Single
6 750 1575 1500 2175
2 1 0 1 0 -1 0 -1 -1 0 0 0 0 0 0 2
750 1875 825 1875
+6 825 1575 1425 2175
2 1 0 1 0 -1 0 -1 -1 0 0 0 0 0 0 4
1425 1875 825 1575 825 2175 1425 1875
+-6
2 1 0 1 0 -1 0 -1 -1 0 0 0 0 0 0 2
1425 1875 1500 1875
-6
diff --git a/graphics/circuit_macros/gpic.m4 b/graphics/circuit_macros/gpic.m4
index b53634ead2..6291a70ef7 100644
--- a/graphics/circuit_macros/gpic.m4
+++ b/graphics/circuit_macros/gpic.m4
@@ -1,7 +1,7 @@
divert(-1)
gpic.m4 Initialization for gpic.
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/lib3D.m4 b/graphics/circuit_macros/lib3D.m4
index 7cc49756ec..f9116d8cb8 100644
--- a/graphics/circuit_macros/lib3D.m4
+++ b/graphics/circuit_macros/lib3D.m4
@@ -3,7 +3,7 @@ lib3D.m4 Macros for rotation, projection, and other
operations on argument triples representing
3D vectors or colors.
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/libSLD.m4 b/graphics/circuit_macros/libSLD.m4
index c2b29ddcf8..65de315cb4 100644
--- a/graphics/circuit_macros/libSLD.m4
+++ b/graphics/circuit_macros/libSLD.m4
@@ -2,7 +2,7 @@ divert(-1)
libSLD.m4 Draft macros for single-line diagram elements
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/libcct.m4 b/graphics/circuit_macros/libcct.m4
index d46990f88a..acac0b3ef8 100644
--- a/graphics/circuit_macros/libcct.m4
+++ b/graphics/circuit_macros/libcct.m4
@@ -1,7 +1,7 @@
divert(-1)
libcct.m4
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
@@ -1760,12 +1760,11 @@ define(`m4R',`ifelse(`$2',R,-)')define(`m4sc',`dimen_/24')dnl
Amplifier'
define(`amp',`eleminit_(`$1') define(`m4wd',`ifelse(`$2',,`dimen_',`($2)')')dnl
{line to rvec_(max(0,rp_len/2-m4wd/2),0)
- {line from rvec_(m4wd,0) \
- to rvec_(0,m4wd/2) \
- then to rvec_(0,-m4wd/2) \
- then to rvec_(m4wd,0) `$3'}
- line from rvec_(m4wd,0) to rvec_(max(m4wd,rp_len/2+m4wd/2),0) }
- {[box invis ht_ m4wd wid_ m4wd] at rvec_(max(m4wd,rp_len)/2,0)}
+ {[ End: vec_(m4wd,0); line from End \
+ to vec_(0,m4wd/2) \
+ then to vec_(0,-m4wd/2) \
+ then to End `$3'] with .End at rvec_(m4wd,0) }
+ line from rvec_(m4wd,0) to rvec_(max(m4wd,rp_len/2+m4wd/2),0) }
line to rvec_(max(rp_len,m4wd),0) invis ')
`integrator( linespec,size,attributes )'
@@ -1800,7 +1799,7 @@ define(`opamp',
`[ pushdef(`m4dlgth',`ifinstr(`$4',=,dimen_,ifelse(`$4',,dimen_,`($4)'))')dnl
pushkeys_(`$4',`body::N; lgth:m4dlgth; wdth:m4`'lgth;')dnl
pushdef(`dna_',`$5')dnl
- eleminit_(`$1',max(elen_-m4lgth/4,m4lgth))
+ ifelse(`$1',,`lgt=elen_',`eleminit_(`$1'); lgt=max(rp_len,m4lgth)')
W: Here
N: vec_(0,m4wdth/2)
S: vec_(0,-m4wdth/2)
@@ -1811,7 +1810,7 @@ define(`opamp',
then to 0.75 between S and E then to S then to W m4body
line from 0.75 between W and E to E',
`line to N then to E then to S then to W m4body; move to E')
- if rp_len > m4lgth then { line to rvec_(rp_len-m4lgth,0) }
+ if lgt > m4lgth then { line to rvec_(lgt-m4lgth,0) }
Out: Here }
NE: vec_(m4lgth/2,m4wdth/4); E1: NE
SE: vec_(m4lgth/2,-m4wdth/4); E2: SE
@@ -2769,7 +2768,7 @@ define(`m4a',ifelse(substr($1,decr(m4I_),1),u,`define(`m4I_',decr(m4I_))'u,
define(`$1',substr($1,0,m4I_)`'substr($1,m4t))')')dnl
`Conditional subcomponent draw
- sc_draw(dna string, chars, iftrue, iffalse)'
+ sc_draw(dna string, substring, iftrue, iffalse)'
define(`sc_draw',`m4_dna(`$1',`$2')ifelse(m4I_,-1,`$4',`$3')')
`(r|l|c)label( label, label, label,
@@ -4030,62 +4029,74 @@ define(`tstrip',`[ setdir_(`$1')
`$4' popdef(`m4wid',`m4ht',`m4box')
resetdir_ ]')
- `jack(U|D|L|R|degrees, chars)
+ `jack(U|D|L|R|degrees, chars [;keys])
Phone jack; arg1 sets drawing direction
- chars:
- L|LM|LB|LMB=long and aux contacts; M|B make|break arrows
- S|SM|SB|SMB=short and aux contacts; M|B make|break arrows
- R=right orientation with respect to drawing direction '
+ chars: A sequence of letters L, S, C, each
+ possibly followed by M, B, MB, or BM, e.g. LLMSBM
+ L draws a long contac arm, M adds a Make contact,
+ B a Break contact, and MB or BM adds both
+ S similarly draws a short contact
+ C adds a central medium contact
+ also:
+ X=bring aux contacts to external dots
+ R=right jack orientation wrt to drawing direction
+ keys: dots=dot keys; (default circle=fill_(1))
+ arrowht=expr; (dimen_/8)
+ sleeve=attributes; e.g. shaded "red"
+ sleeveht=expr; (4.5*arrowht)
+ sleevewid=expr; (sleeveht/6)
+ armlen=expr; len of long armature (dimen_*.75) '
define(`jack',`[ setdir_(`$1')
- define(`dna_',`ifelse(`$2',,L,`$2',R,L,`$2')')dnl
- s=ifinstr(dna_,R,-1,1)
- ght = dimen_/2
- {Sleeve: [shade(1,lbox(dimen_/12,ght))] }
- G: Sleeve+vec_(0,-ght/2*s)
- F: Sleeve+vec_(dimen_/24,0)
- aht = dimen_/8
- Q: Sleeve+vec_(-dimen_*0.7,s*(ght*0.45-aht*3))
- define(`m4jbm',) m4auxcontacts(`dna_',L,s,)
- Q: Sleeve+vec_(-dimen_*0.7,(aht*3-ght*0.45)*s)
- define(`m4jbm',) m4auxcontacts(`dna_',S,-s,)
- `$3'; resetdir_ ] ')
-
-define(`m4auxcontacts',`ifinstr($1,$2,
- `define(`m4I_',index($1,$2))dnl
- define(`m4abm',ifelse(substr($1,incr(m4I_),1),M,
- M`'ifelse(substr($1,eval(2+m4I_),1),B,B),
- substr($1,incr(m4I_),1),B,
- B`'ifelse(substr($1,eval(2+m4I_),1),M,M)))dnl
- define(`$1',substr($1,0,m4I_)`'substr($1,eval(m4I_+len(m4abm)+1)))dnl
- cht = aht*ifelse(ifinstr(m4jbm,M,T)`'ifinstr(m4abm,B,T),TT,3.9,3)
- Z: jackcontact(ifelse(`$2',S,0.5,0.6)*dimen_,m4abm`'ifelse($4,,,H),$3) \
- with .T at Q+vec_(0,$3*cht)
- $2`'$4: Z.T; Q: $2`'$4 define(`m4jbm',m4abm)
- ifinstr(m4abm,M, $2`'M`'$4: Z.M) ifinstr(m4abm,B,; $2`'B`'$4: Z.B)
- m4auxcontacts(`$1',$2,$3,ifelse($4,,1,`incr($4)'))')')
-
- `jackcontact(length,chars,sign)
- Phone jack contact to left
- chars:
- R: right orientation to drawing direction
- M|B: make|break contact arrows '
-define(`jackcontact',`[ Point: (0,0)
- line from Point ifinstr(`$2',H,`-vec_(dimen_/10,0)',
- `to vec_(-dimen_/16,neg_(`$3')*dimen_/16) \
- then to vec_(-dimen_/8,0) then') \
- to vec_(neg_(`$1'),0)
- T: dot(,,1)
- C: T+vec_(dimen_/5,0)
- ifinstr(`$2',H,`
- Connector: [shade(1,lbox(dimen_/24,cht))] \
- at T+vec_((`$1')-dimen_*0.16,neg_(`$3')*cht/2)')dnl
- ifinstr(`$2',M,`
- M: C+vec_(0,`$3'*aht*1.9)
- arrow m4c_l <- ht aht wid aht from C+vec_(0,`$3'*aht*0.4) \
- to M ')dnl
- ifinstr(`$2',B,`
- B: C+vec_(0,neg_(`$3')*aht*1.5)
- arrow m4c_l <- ht aht wid aht from C to B ') ; `$4' ] ')
+ pushkeys_(`$2',`dots:circle=fill_(1):N;
+ arm::N; armlen:dimen_*0.75; arrowht:dimen_/8;
+ sleeve::N; sleeveht:m4`'arrowht*4.5; sleevewid:m4`'sleeveht/6; ')dnl
+ pushdef(`dna_',`$2') pushdef(`rght',sc_draw(`dna_',R,-)1)dnl
+ pushdef(`m4extrn',sc_draw(`dna_',X,X)) pushdef(`m4vd',`dimen_/16')dnl
+ ifelse(dna_,,`define(`dna_',L)')
+ Sleeve: [lbox(m4sleevewid,m4sleeveht,m4sleeve)]
+ F: Sleeve+vec_(m4sleevewid/2,0)
+ Ctr: (2 between F and Sleeve)+vec_(-(m4armlen+m4vd), 0);
+ G: Sleeve+vec_(0,-m4sleeveht/2*(rght)); Sx: G+(Ctr-Sleeve)
+ H: 2 between G and Sleeve; Lx: H+(Ctr-Sleeve)
+ Q: Ctr; m4jcontacts(dna_,L,rght,,m4armlen)
+ Q: Ctr; m4jcontacts(dna_,C,rght,,m4armlen)
+ Q: Ctr; m4jcontacts(dna_,S,neg_(rght),,m4armlen)
+ ifelse(m4extrn,X,`ifelse(rght,-1,
+ `T: Sleeve + (Lx-Ctr)+((Between_(G,H,dimen_/6))-G)
+ line from H to T then to T+(Ctr-Sleeve); H: dot(,m4dots); ',
+ `T: Sleeve + (Sx-Ctr)+((Between_(H,G,dimen_/6))-H)
+ line from G to T then to T+(Ctr-Sleeve); G: dot(,m4dots); ')')
+ `$3'; resetdir_ popdef(`m4dots',`m4arm', `m4armlen', `m4arrowht',
+ `m4sleeve', `m4sleeveht', `m4sleevewid',`dna_', `rght', `m4extrn', `m4vd')
+ ] ')
+ `m4jcontacts(dna_, L|S|C, 1|-1, blank|n, armlen)'
+define(`m4jcontacts',`ifinstr(`$1',`$2',
+ `pushdef(`dna_',$1) pushdef(`m4code',regexp(dna_,$2\(M\|B\|MB\|BM\)?,\&))dnl
+ sc_draw(`dna_',m4code,
+ `pushdef(`armln',`ifelse(`$2',S,0.55/0.75*,`$2',C,0.65/0.75*)'`$5')dnl
+ pushdef(`connht',`ifelse($4,,3,ifelse(m4code,$2`'B,4.5,3))')dnl
+ $2`'x: Q ifelse(`$2',C,,
+ `+vec_(0,$3*ifelse(`$4',,m4sleeveht/2,connht*m4arrowht)); Q: $2`'x')
+ $2`'$4: dot(at Q,m4dots)
+ Armature: line chop last [].wid/2 chop 0 to rvec_(armln-2*m4vd,0) dnl
+ ifelse($4,,`then to rvec_(armln-m4vd,neg_(`$3')*m4vd) \
+ then to rvec_(armln,0)')
+ Contact: Q+vec_(m4arrowht*2,0)
+ ifelse($4,,,`Connector: [lbox(m4vd,connht*m4arrowht,m4sleeve)] \
+ at last []+vec_(armln-3*m4vd,neg_(`$3')*connht*m4arrowht/2)')
+ ifinstr(m4code,M,`$2`'M`'$4: Contact+vec_(0,`$3'*m4arrowht*1.9)
+ $2`'M`'$4`'A: arrow m4c_l <- ht m4arrowht wid m4arrowht \
+ from Contact+vec_(0,`$3'*m4arrowht*0.4) \
+ to $2`'M`'$4 ifelse(m4extrn,X,`then to $2`'$4+vec_(0,`$3'*m4arrowht*1.9)
+ $2`'M`'$4: dot(,m4dots)'); $2`'x: $2`'M`'$4')
+ ifinstr(m4code,B,`$2`'B`'$4: Contact+vec_(0,neg_(`$3')*m4arrowht*1.5)
+ $2`'B`'$4`'A: arrow m4c_l <- ht m4arrowht wid m4arrowht from Contact \
+ to $2`'B`'$4 dnl
+ ifelse(m4extrn,X,`then to $2`'$4+vec_(0,neg_(`$3')*m4arrowht*1.5)
+ $2`'B`'$4:dot(,m4dots)')')
+ m4jcontacts(dna_,$2,$3,ifelse($4,,1,`incr($4)'),`$5')
+ popdef(`armln',`connht')')
+ popdef(`m4code',`dna_')')')
`plug(U|D|L|R|degrees, chars)
Phone plug; arg1 sets drawing direction
diff --git a/graphics/circuit_macros/libgen.m4 b/graphics/circuit_macros/libgen.m4
index f5f1be0d34..789759e141 100644
--- a/graphics/circuit_macros/libgen.m4
+++ b/graphics/circuit_macros/libgen.m4
@@ -2,7 +2,7 @@ divert(-1)
libgen.m4 Base macros for dpic and gpic diagrams
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
@@ -192,7 +192,7 @@ define(`latexcommand',
`$2')')
define(`m4announceprocessor',`dnl Do not change the format of the next line:
-`#' `$1' Version 10.6: ifelse(m4picprocessor,gpic,`Gpic',
+`#' `$1' Version 10.7: ifelse(m4picprocessor,gpic,`Gpic',
m4postprocessor,pstricks,`PSTricks',
m4postprocessor,pgf,`TikZ PGF',
m4postprocessor,mfpic,`Mfpic',
@@ -484,7 +484,7 @@ define(`intersect_',`((($3.x-$1.x)*($3.y-$4.y)-($3.y-$1.y)*($3.x-$4.x))/\
(($2.x-$1.x)*($3.y-$4.y)-($2.y-$1.y)*($3.x-$4.x))\
between `$1' and `$2')')
- `Dashed line drawn in detail
+ `Dashed line drawn in detail (dpic only)
dashline(
linespec,
thickness|<-|->|<->|color,
@@ -492,26 +492,25 @@ define(`intersect_',`((($3.x-$1.x)*($3.y-$4.y)-($3.y-$1.y)*($3.x-$4.x))/\
gap len,G)
Arg5=G ends (but does not start)
the line with a gap
- Note: can change default direction'
-define(`dashline',`rpoint_(`$1')define(`m4opts',`$2')
- define(`m4dsh',`ifelse(`$3',,dashwid,abs(`$3'))')dnl
- define(`m4gap',`ifelse(`$4',,m4dsh/2,abs(`$4'))')dnl
- define(`m4lar',)define(`m4rar',)dnl
- ifelse(m4xtract(`m4opts',<->),1,`define(`m4lar',<-)define(`m4rar',->)',dnl
- m4xtract(`m4opts',<-),1,`define(`m4lar',<-)',dnl
- m4xtract(`m4opts',->),1,`define(`m4rar',->)')
+ Shortens dash len as required to fit with
+ given gap len.'
+pushdef(`dashline',`line invis `$1'; M4S:last line.start; M4E:last line.end
+ m4dln=distance(M4S,M4E); move to M4S
+ pushdef(`m4opts',`patsubst($2,<->\|<-\|->)')dnl
+ pushdef(`m4dsh',`ifelse(`$3',,dashwid,abs(`$3'))')dnl
+ pushdef(`m4gap',`ifelse(`$4',,m4dsh/2,abs(`$4'))')dnl
if (m4dsh+m4gap)==0 then { dashline_n = 1 } \
- else {dashline_n = max(1,\
- int(abs((rp_len ifelse(`$5',G,,+m4gap))/(m4dsh+m4gap))))}
- dashline_f = (rp_len-(dashline_n ifelse(`$5',G,,-1))*m4gap)/dashline_n
- for m4ti=1 to dashline_n do {
- if m4ti==1 then { line m4opts m4lar to rvec_(dashline_f,0) } \
- else { if m4ti==dashline_n then { line m4opts m4rar to rvec_(dashline_f,0)}\
- else { line m4opts to rvec_(dashline_f,0) }}
- ifelse(`$5',G,,
- `if m4ti < dashline_n then {')move to rvec_(m4gap,0)ifelse(`$5',G,,})
- } ')
- filled circle for rounded corners'
+ else {dashline_n = 1+int((m4dln ifelse(`$5',G,-m4gap))/(m4dsh+m4gap))}
+ dashline_f = (m4dln-m4gap*(dashline_n ifelse(`$5',G,,-1)))/dashline_n
+ M4dsh: (M4E-M4S)*(dashline_f/m4dln); M4gap: (M4E-M4S)*(m4gap/m4dln)
+ {if dashline_n==1 then { line `$2' to M4S+M4dsh } \
+ else { line m4opts ifinstr($2,<-,<-) to M4S+M4dsh; M4S: Here+M4gap
+ for m4ti=2 to dashline_n-1 do { line m4opts \
+ from M4S to M4S+M4dsh; M4S: Here+M4gap }
+ line m4opts ifinstr($2,->,->) from M4S to M4S+M4dsh }}
+ line invis to M4E popdef(`m4gap',`m4dsh',`m4opts') ')
+
+ `filled circle for rounded corners'
define(`round',`{ circle thick ifelse(`$2',,`linethick/2',(`$2')/2) \
diameter ifelse(`$2',,`linethick',`($2)')/2 pt__ \
ifelse(`$1',,`at Here',`$1') $3} ifelse(`$1',,,`; move to last circle .c')')
@@ -1307,17 +1306,17 @@ define(`arcdimension_',`arc invis `$1' ; {
radv=expr; vertex radius
Defined internal points: C, V[0], ... V[nsides]'
define(`polygon',`[ C: Here; nsides=ifelse(`$1',,3,`$1')
- a=360/nsides; b=(180-a)/2 # interior angles
- pushkeys_(`$2',
- `line::N; rot:90; side:linewid; radv:0; rad:m4`'side*sind(b)/sind(a);')dnl
- for i=0 to nsides-1 do { V[i]: Rect_(m4rad,m4rot+a*i) }
+ a_poly=360/nsides; b_poly=(180-a_poly)/2 # interior angles
+ pushkeys_(`$2',`line::N; rot:90-((`$1'-1)%2)*180/(`$1'); side:linewid;
+ radv:0; rad:m4`'side*sind(b_poly)/sind(a_poly);')dnl
+ for i_poly=0 to nsides-1 do { V[i_poly]: Rect_(m4rad,m4rot+a_poly*i_poly) }
V[nsides]: 0.5 between V[nsides-1] and V[0]
-#for i=0 to nsides do { sprintf("%g",i) at V[i] above }
+#for i_poly=0 to nsides do { sprintf("%g",i_poly) at V[i_poly] above }
if m4radv!=0 then { move to V[nsides]
- for i=0 to nsides-1 do { arcto(V[i],V[i+1],m4radv,m4line) }
+ for i_poly=0 to nsides-1 do { arcto(V[i_poly],V[i_poly+1],m4radv,m4line) }
line m4line to V[nsides] } \
- else { line m4line from V[nsides] to V[0]; for i=1 to nsides do {
- continue to V[i] } }
+ else { line m4line from V[nsides] to V[0]; for i_poly=1 to nsides do {
+ continue to V[i_poly] } }
`$3' popdef(`m4line',`m4rot',`m4side',`m4radv',`m4rad') ]')
`shade(gray value,closed line specs)
@@ -1452,77 +1451,90 @@ m4postprocessor,xfig,
ifdef(`r_',`shaded rgbstring(r_,g_,b_)',`fill ifelse(`$1',,0,`$1')')')')
`sarrow(linespec,keys)
- Single-segment single-headed special arrow
+ One-segment single-headed special arrow
keys= type=O[pen] (default)
D[iamond]
C[rowfoot]
+ DI (disk)
P[lain]
- R[ight]
- L[eft]
+ R[ight] (half plain head)
+ L[eft] (half plain head)
+ PP[lain](double plain head)
wdth=expr (default arrowwid)
lgth=expr (default arrowht)
- shaft= attributes (dashed etc)
- head= attributes (shaded etc)
+ head=attributes (shaded etc)
+ shaft=attributes (default=head)
+ hook=[L|R|LR] (default none)
name=Name (default Sarrow_)'
define(`sarrow',
`pushkeys_(`$2',`type:O:N; head::N; shaft:m4`'head:N; wdth:arrowwid;
- lgth:arrowht; name:Sarrow_:N')dnl
+ lgth:arrowht; hook::N; name:Sarrow_:N')dnl
arrow `$1' m4head invis
- m4_dx = last arrow.end.x-last arrow.start.x
- m4_dy = last arrow.end.y-last arrow.start.y
- m4_t = last arrow.thick bp__
-m4name: [
- ifelse(ifelse(m4type,L,L,m4type,R,R),,,`poppushdef(`m4wdth',(m4wdth*2))')
- Point: Here; Shaft: Point-(m4_dx,m4_dy)
+ m4_sadx = last arrow.end.x-last arrow.start.x
+ m4_sady = last arrow.end.y-last arrow.start.y
+ m4_sath = last arrow.thick bp__
+{ m4name: [ dnl
+ ifelse(ifelse(m4type,L,L,m4type,R,R),,,`poppushdef(`m4wdth',(m4wdth*2))') dnl
+ Point: Here; Shaft: Point-(m4_sadx,m4_sady)
C: (Shaft-Point)/distance(Shaft,Point)
- X: m4affine(m4lgth,0,Point,C)
+ X: m4affine(m4lgth,0,Point,C) # hookless butt
if m4wdth == 0.0 then { po = 0.0 } \
- else { po = min((m4_t/m4wdth)*sqrt((m4lgth)^2+(m4wdth)^2/4),m4lgth) }
- P: m4affine(po,0,Point,C)
- h = m4lgth-m4_t/2;
+ else { po = min((m4_sath/m4wdth)*sqrt((m4lgth)^2+(m4wdth)^2/4),m4lgth) }
+ Pl: m4affine(po,0,Point,C) # line centre for point
+ h = m4lgth-m4_sath/2;
x = h - po;
if m4lgth == 0.0 then { v = 0.0 } else { v = ((m4wdth/2)/m4lgth)*x }
- R: m4affine(h, v,Point,C);
- L: m4affine(h,-v,Point,C);
+ Rl: m4affine(h, v,Point,C);
+ Ll: m4affine(h,-v,Point,C);
if x == 0.0 then { t = 1 } else { t = m4lgth/x }
- if m4lgth==0 then { y = 0 } else { y = m4lgth-po+m4_t*m4wdth/m4lgth/4 }
- Ly: (P*(x-y)+L*y)/x
- Ry: (P*(x-y)+R*y)/x
+ if m4lgth==0 then { y = 0 } else { y = m4lgth-po+m4_sath*m4wdth/m4lgth/4 }
+ Lo: (Pl*(x-y)+Ll*y)/x
+ Ro: (Pl*(x-y)+Rl*y)/x
+ Z: ifelse(m4hook,,`Shaft',`m4affine(-distance(Lo,Ro)/4,0,Shaft,C)')
ifinstr(m4type,O,
- `line from Shaft to (L+R)/2 m4shaft
- line to L then to P then to R then to Here m4head',
+ `line from Z to (Ll+Rl)/2 m4shaft
+ line to Ll then to Pl then to Rl then to Here m4head',
+ m4type,DI,
+ `line from Z to (Ll+Rl)/2 m4shaft
+ circle diam distance(Point,X)-m4_sath at (Point+X)/2 m4head',
m4type,D,
- `poppushdef(`m4lgth',(m4lgth+m4_t))dnl
+ `poppushdef(`m4lgth',(m4lgth+m4_sath))dnl
s = sqrt(m4lgth^2+m4wdth^2)/2
- if m4wdth==0 then { pd = 0 } else { pd = m4_t*s/m4wdth }
+ if m4wdth==0 then { pd = 0 } else { pd = m4_sath*s/m4wdth }
PD: m4affine(pd,0,Point,C)
- line from Shaft to X m4shaft
- if m4lgth==0 then { pb = 0 } else { pb = m4_t*s/m4lgth }
+ line from Z to X m4shaft
+ if m4lgth==0 then { pb = 0 } else { pb = m4_sath*s/m4lgth }
PL: m4affine(m4lgth/2, m4wdth/2-pb,Point,C)
PR: m4affine(m4lgth/2,-m4wdth/2+pb,Point,C)
line to PL then to PD then to PR then to X \
ifelse(m4head,,fill_(1),m4head)',
m4type,P,
- `line from Shaft to P m4shaft
- line from Ly to P then to Ry m4head',
+ `line from Z to Pl m4shaft
+ line from Lo to Pl then to Ro m4head
+ ifinstr(m4type,PP,`Px: Pl-(Ll+Rl)/2
+ line from Lo-Px to Pl-Px then to Ro-Px m4head')',
m4type,C,
- `line from Shaft to Point m4head
- Q: (-C.y,C.x)*((m4wdth-m4_t)/2)
- Y: m4affine(m4lgth-m4_t/2,0,Point,C)
+ `Q: (-C.y,C.x)*((m4wdth-m4_sath)/2)
+ Y: m4affine(m4lgth-m4_sath/2,0,Point,C)
+ line from Z to Y m4shaft; line to Point m4head
ifdpic(`spline 0.4 from Point+Q to Y+Q then to Y-Q then to Point-Q',
`spline from Point+(Q.x,Q.y) to Y+(Q.x,Q.y) \
then to Y-(Q.x,Q.y) then to Point-(Q.x,Q.y)') m4head',
m4type,R,
- `line from Shaft to P m4shaft
- circle diam m4_t/2 at Here m4shaft thick last line.thick/2
- line from 1bp__/distance(Ly,P) between P and Ly to P then to Ry m4shaft',
+ `line from Z to Pl m4shaft
+ circle diam m4_sath/2 at Here m4shaft thick last line.thick/2
+ line from 1bp__/distance(Lo,Pl) between Pl and Lo to Pl then to Ro m4shaft',
m4type,L,
- `line from Shaft to P m4shaft
- circle diam m4_t/2 at Here m4shaft thick last line.thick/2
- line from 1bp__/distance(Ry,P) between P and Ry to P then to Ly m4shaft')
- popdef(`m4type',`m4head',`m4shaft',`m4wdth',`m4lgth',`m4name')dnl
- ] with .Point at Here')
-define(`m4affine',
+ `line from Z to Pl m4shaft
+ circle diam m4_sath/2 at Here m4shaft thick last line.thick/2
+ line from 1bp__/distance(Ro,Pl) between Pl and Ro to Pl then to Lo m4shaft')
+ ifinstr(m4hook,L,`ZD: (Lo-Ro)/2
+ arc cw m4shaft from Z to Z+ZD with .c at Z+(ZD/2); ') dnl
+ ifinstr(m4hook,R,`ZD: (Ro-Lo)/2
+ arc m4shaft from Z to Z+ZD with .c at Z+(ZD/2)') dnl
+ popdef(`m4type',`m4head',`m4shaft',`m4wdth',`m4lgth',`m4hook',`m4name')dnl
+ ] with .Point at Here } ')
+define(`m4affine', dnl (x,y,Orig,(cost,sint)) Orig+rot(cost,sint)*(x,y)
``$3' + (`$4'.x*(`$1')-`$4'.y*(`$2'),`$4'.y*(`$1')+`$4'.x*(`$2'))')
`open_arrow(linespec, ht, wid, head attribs)
@@ -1530,7 +1542,6 @@ define(`m4affine',
define(`open_arrow',`sarrow(`$1',
type=O;ifelse(`$2',,,lgth=`$2';)ifelse(`$3',,,wdth=`$3';)head=`$4')')
-
`elchop(E,A) chop for ellipses
evaluates to "chop r" where r is the distance
from the centre of ellipse E to the
diff --git a/graphics/circuit_macros/liblog.m4 b/graphics/circuit_macros/liblog.m4
index 31dd9b2aca..2416551a70 100644
--- a/graphics/circuit_macros/liblog.m4
+++ b/graphics/circuit_macros/liblog.m4
@@ -1,7 +1,7 @@
divert(-1)
liblog.m4 Logic gates
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
@@ -75,24 +75,28 @@ define(`rsvec_',`Here+svec_(`$1',`$2')')
convenience for drawing NOT circles'
define(`NOT_circle',`circle diam N_diam*L_unit N_attr')
- `LH_symbol([U|D|L|R|degrees][I])
+ `LH_symbol([U|D|L|R|degrees][I],keys)
I=inverted
- logical hysteresis symbol'
+ logical hysteresis symbol
+ keys: hght=expr; (H_ht)
+ wdth=fraction; (body wdth=frac*hght) '
define(`LH_symbol',`[ define(`m4LH',patsubst(`$1',I))dnl
+ pushkeys_(`$2',`hght:H_ht; wdth:0.6;')dnl
define(`m4Hs',ifinstr(`$1',I,-)H_ht)setdir_(m4LH,R)dnl
line to svec_(H_ht,0) \
then to svec_(1.1*H_ht,m4Hs)
- line from rsvec_(0.4*H_ht,0) \
- to rsvec_(-0.6*H_ht,0) \
- then to rsvec_(-0.7*H_ht,-(m4Hs))
- `$2'; resetdir_ ] ')
+ line from rsvec_((1-m4wdth)*H_ht,0) \
+ to rsvec_(-m4wdth*H_ht,0) \
+ then to rsvec_(-(m4wdth+0.1)*H_ht,-(m4Hs))
+ `$2'; resetdir_ popdef(`m4hght',`m4wdth') ]')
- `LT_symbol(U|D|L|R|degrees)
- triangle_symbol'
-define(`LT_symbol', `[ setdir_(`$1',R)
- line to svec_(0,H_ht*5/8) then to svec_(H_ht,0) \
- then to svec_(0,-H_ht*5/8) then to Here
- `$2'; resetdir_ ] ')
+ `LT_symbol(U|D|L|R|degrees,keys)
+ triangle_symbol
+ keys: wdth=expr; (H_ht) '
+define(`LT_symbol', `[ setdir_(`$1',R) pushkeys_(`$2',`wdth:H_ht')
+ line to svec_(0,m4wdth*5/8) then to svec_(m4wdth,0) \
+ then to svec_(0,-m4wdth*5/8) then to Here
+ `$2'; resetdir_ popdef(`m4wdth') ] ')
`BOX_gate(inputs,output,swid,sht,label,
attributes)
diff --git a/graphics/circuit_macros/mfpic.m4 b/graphics/circuit_macros/mfpic.m4
index 2754139ec0..c9c520d0cd 100644
--- a/graphics/circuit_macros/mfpic.m4
+++ b/graphics/circuit_macros/mfpic.m4
@@ -1,7 +1,7 @@
divert(-1)
mfpic.m4 Initialization for mfpic.
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/mpost.m4 b/graphics/circuit_macros/mpost.m4
index 02a2375c27..8f103182ab 100644
--- a/graphics/circuit_macros/mpost.m4
+++ b/graphics/circuit_macros/mpost.m4
@@ -1,7 +1,7 @@
divert(-1)
mpost.m4 Initialization for metapost.
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/pdf.m4 b/graphics/circuit_macros/pdf.m4
index 71916a2f3d..33931b52b2 100644
--- a/graphics/circuit_macros/pdf.m4
+++ b/graphics/circuit_macros/pdf.m4
@@ -1,7 +1,7 @@
divert(-1)
pdf.m4 Initialization for pdf output.
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/pgf.m4 b/graphics/circuit_macros/pgf.m4
index 845427083c..06b82cd024 100644
--- a/graphics/circuit_macros/pgf.m4
+++ b/graphics/circuit_macros/pgf.m4
@@ -1,7 +1,7 @@
divert(-1)
pgf.m4 Initialization for Tikz-pgf.
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/postscript.m4 b/graphics/circuit_macros/postscript.m4
index 7e4882451d..01f3704b90 100644
--- a/graphics/circuit_macros/postscript.m4
+++ b/graphics/circuit_macros/postscript.m4
@@ -1,7 +1,7 @@
divert(-1)
postscript.m4 Initialization for Postscript output.
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/psfrag.m4 b/graphics/circuit_macros/psfrag.m4
index 31eff163d0..95a546a2dd 100644
--- a/graphics/circuit_macros/psfrag.m4
+++ b/graphics/circuit_macros/psfrag.m4
@@ -2,7 +2,7 @@ divert(-1)
psfrag.m4 Initialization for dpic -f processing:
Postscript with psfrag strings
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/pstricks.m4 b/graphics/circuit_macros/pstricks.m4
index 528fdcd147..3f69c35cd6 100644
--- a/graphics/circuit_macros/pstricks.m4
+++ b/graphics/circuit_macros/pstricks.m4
@@ -1,7 +1,7 @@
divert(-1)
pstricks.m4 Initialization for PSTricks.
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/circuit_macros/svg.m4 b/graphics/circuit_macros/svg.m4
index 4c3adb994b..02a5db08e4 100644
--- a/graphics/circuit_macros/svg.m4
+++ b/graphics/circuit_macros/svg.m4
@@ -1,7 +1,7 @@
divert(-1)
svg.m4 Initialization for svg output.
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
@@ -77,6 +77,7 @@ Some fairly safe choices: Arial, Helvetica, Times, Courier, Verdana, Georgia,
Palatino, Garamond, Bookman, Cursive, Trebuchet MS, Arial Black, Impact.
'
`svgfontratio(fontname)
+
reasonable dptextratio values for common fonts'
define(`svgfontratio',`ifinstr(
`$1',Times,0.66,
@@ -96,6 +97,8 @@ define(`svgfontratio',`ifinstr(
`$1',Impact,0.79,
dptextratio)')
+define(`svg_baselineskip',`(textht/svgfontratio)')
+
`see http://www.ascii.cl/htmlcodes.htm
and http://webdesign.about.com/od/localization/l/blhtmlcodes-gr.htm'
`These macros are used in strings so the double quote is entered as \". '
diff --git a/graphics/circuit_macros/xfig.m4 b/graphics/circuit_macros/xfig.m4
index c98819df7f..7ca0831a7d 100644
--- a/graphics/circuit_macros/xfig.m4
+++ b/graphics/circuit_macros/xfig.m4
@@ -1,7 +1,7 @@
divert(-1)
xfig.m4 Initialization for xfig.
-* Circuit_macros Version 10.6, copyright (c) 2024 J. D. Aplevich under *
+* Circuit_macros Version 10.7, copyright (c) 2024 J. D. Aplevich under *
* the LaTeX Project Public Licence in file Licence.txt. The files of *
* this distribution may be redistributed or modified provided that this *
* copyright notice is included and provided that modifications are clearly *
diff --git a/graphics/mahjong/Makefile b/graphics/mahjong/Makefile
deleted file mode 100644
index 6d40e37f25..0000000000
--- a/graphics/mahjong/Makefile
+++ /dev/null
@@ -1,115 +0,0 @@
-## Makefile for mahjong package
-# Directories
-BUILD=build
-TEXBUILD=$(BUILD)/tex
-OUT=out
-TEXMF_HOME:= $(shell kpsewhich -var-value TEXMFHOME)
-# TDS directories
-TDS=$(BUILD)/tds
-TDSDOC=$(TDS)/doc/latex/mahjong
-TDSSRC=$(TDS)/source/latex/mahjong
-TDSTEX=$(TDS)/tex/latex/mahjong
-# CTAN directories
-CTAN=$(BUILD)/ctan
-CTAN_MAHJONG=$(CTAN)/mahjong
-# Compilers
-LATEX=latex -output-directory $(TEXBUILD)
-LATEXMK=latexmk -lualatex -outdir=$(TEXBUILD) -auxdir=$(TEXBUILD) -interaction=nonstopmode -use-make
-ZIP=zip -r
-dir_guard=@mkdir -p $(@D)
-
-.PHONY: all clean install
-
-all: $(OUT)/mahjong-ctan.zip
-
-clean:
- rm -rf $(BUILD)
- rm -rf $(OUT)
- rm -f mahjong.sty
-
-install: all
- unzip $(CTAN)/mahjong.tds.zip -d $(TEXMF_HOME)
-
-
-# Extract package from DTX source
-$(TEXBUILD)/mahjong.sty: mahjong.ins mahjong.dtx
- $(dir_guard)
- $(LATEX) $<
-
-# Compile documentation
-$(TEXBUILD)/%.pdf: %.tex $(TEXBUILD)/mahjong.sty tiles
- $(LATEXMK) $<
- $(LATEXMK) $<
-
-%.gls: %.glo
- makeindex -s gglo.ist -o $@ $<
-
-# Move everything to TDS staging area where it belongs
-$(TDSDOC)/%.pdf: $(TEXBUILD)/%.pdf
- $(dir_guard)
- cp $< $@
-
-$(TDSDOC)/%.tex: %.tex
- $(dir_guard)
- cp $< $@
-
-$(TDSDOC)/README.md: README.md
- $(dir_guard)
- cp $< $@
-
-$(TDSDOC)/LICENSE: LICENSE
- $(dir_guard)
- cp $< $@
-
-$(TDSSRC)/mahjong.dtx: mahjong.dtx
- $(dir_guard)
- cp $< $@
-
-$(TDSSRC)/mahjong.ins: mahjong.ins
- $(dir_guard)
- cp $< $@
-
-$(TDSSRC)/Makefile: Makefile
- $(dir_guard)
- cp $< $@
-
-$(TDSTEX)/%.sty: $(TEXBUILD)/%.sty
- $(dir_guard)
- cp $< $@
-
-$(TDSTEX)/tiles: tiles
- cp -r $< $@
-
-# Create TDS zip and moved it to CTAN staging area
-$(CTAN)/mahjong.tds.zip: $(TDSDOC)/mahjong.pdf $(TDSDOC)/mahjong-code.pdf
-$(CTAN)/mahjong.tds.zip: $(TDSDOC)/mahjong.tex $(TDSDOC)/mahjong-code.tex
-$(CTAN)/mahjong.tds.zip: $(TDSDOC)/README.md $(TDSDOC)/LICENSE
-$(CTAN)/mahjong.tds.zip: $(TDSSRC)/mahjong.ins $(TDSSRC)/mahjong.dtx $(TDSSRC)/Makefile
-$(CTAN)/mahjong.tds.zip: $(TDSTEX)/mahjong.sty $(TDSTEX)/tiles
- $(dir_guard)
- cd $(TDS) && $(ZIP) $(@F) *
- mv $(TDS)/$(@F) $@
-
-# Move everything to CTAN staging area
-$(CTAN_MAHJONG)/%.pdf: $(TDSDOC)/%.pdf
- $(dir_guard)
- cp $< $@
-
-$(CTAN_MAHJONG)/%.tex: $(TDSDOC)/%.tex
- $(dir_guard)
- cp $< $@
-
-$(CTAN_MAHJONG)/%: %
- $(dir_guard)
- cp -r $< $@
-
-# Create final zip archive for upload to CTAN
-$(OUT)/mahjong-ctan.zip: $(CTAN_MAHJONG)/mahjong.tex $(CTAN_MAHJONG)/mahjong.pdf
-$(OUT)/mahjong-ctan.zip: $(CTAN_MAHJONG)/mahjong-code.tex $(CTAN_MAHJONG)/mahjong-code.pdf
-$(OUT)/mahjong-ctan.zip: $(CTAN_MAHJONG)/README.md $(CTAN_MAHJONG)/LICENSE
-$(OUT)/mahjong-ctan.zip: $(CTAN_MAHJONG)/mahjong.dtx $(CTAN_MAHJONG)/mahjong.ins
-$(OUT)/mahjong-ctan.zip: $(CTAN_MAHJONG)/Makefile
-$(OUT)/mahjong-ctan.zip: $(CTAN_MAHJONG)/tiles $(CTAN)/mahjong.tds.zip
- $(dir_guard)
- cd $(CTAN) && $(ZIP) $(@F) ./*
- mv $(CTAN)/$(@F) $@ \ No newline at end of file
diff --git a/graphics/mahjong/mahjong-code.pdf b/graphics/mahjong/mahjong-code.pdf
index 1040136689..99d38e46ba 100644
--- a/graphics/mahjong/mahjong-code.pdf
+++ b/graphics/mahjong/mahjong-code.pdf
Binary files differ
diff --git a/graphics/mahjong/mahjong.dtx b/graphics/mahjong/mahjong.dtx
index a357df3373..dc81c70d66 100644
--- a/graphics/mahjong/mahjong.dtx
+++ b/graphics/mahjong/mahjong.dtx
@@ -61,6 +61,7 @@
% \changes{v0.9}{2021/04/11}{Fully functional}
% \changes{v1.0}{2021/04/14}{First complete release}
% \changes{v1.0.1}{2021/04/16}{Added package prefix to filenames}
+% \changes{v1.1}{2025/01/06}{Added feature to control size of symbols. Adjusted vertical alignment.}
%
% \GetFileInfo{mahjong.sty}
% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ }
@@ -68,16 +69,15 @@
% \DoNotIndex{\closeout,\day,\def,\edef,\else,\empty,\endgroup}
% \title{The \textsf{mahjong} package\thanks{This document corresponds to \textsf{mahjong}~\fileversion, dated~\filedate}}
-% \author{Daniel Schmitz \\ \texttt{schmytzi@gmail.com}}
+% \author{Daniel Schmitz \\ \texttt{me@schmytzi.com}}
%
% \maketitle
% \tableofcontents
% \begin{abstract}
% The \textsf{mahjong} package provides a \LaTeXe{} and \LaTeX~3 interface for typesetting mahjong tiles using an extended version of MPSZ algebraic notation.
% Features include spaces, rotated, blank, and concealed tiles, as well as red fives.
-% The size of the mahjong tiles can be controlled using a package option and an optional argument of |\mahjong|.
-% It is primarily aimed at Riichi (aka. Japanese) Mahjong but can be used to typeset any style of mahjong.
-% However, flower tiles and jokers are currently missing.
+% The size of the mahjong tiles and their symbols can be controlled using package options and optional arguments.
+% It is primarily aimed at Riichi (aka. Japanese) Mahjong but can be used to typeset any style of mahjong, save for flower tiles.
% \end{abstract}
%
% \begin{documentation}
@@ -87,7 +87,7 @@
% This documentation assumes familiarity with the game in general but none of its many styles.
% Nonetheless, some basic terms will be defined because of differing vocabulary among players.
%
-% \newcommand{\rmahjong}[1]{\raisebox{-.4\height}{\mahjong{#1}}}
+% \newcommand{\rmahjong}[1]{\raisebox{-.15\height}{\mahjong{#1}}}
% \section{Mahjong Tiles}
% \subsection{Suited Tiles}
% The suited tiles are referred to as follows:
@@ -172,18 +172,28 @@
%
% \section{Typesetting Mahjong Tiles in Your Document}
% \DescribeMacro{\mahjong}
-% The main interface is |\mahjong| \oarg{height} \marg{hand}.
-% \meta{hand} refers to a tile sequence in MPSZ notation as discussed above and \meta{height} specifies the height of the rendered mahjong tiles.
-% If \meta{height} is not specified, the default height is used.
+% The main interface is |\mahjong| \oarg{height} \oarg{scale} \marg{hand}.
+% \meta{hand} refers to a tile sequence in MPSZ notation as discussed above.
+% \meta{height} specifies the height of the rendered mahjong tiles.
+% \meta{scale} specifies the fraction of vertical space that the tiles' symbols should occupy.
+% The value should be between 0 and 1.
+% If an optional argument is not given, the default (which can be set through a package argument) will be used.
%
% \DescribeMacro{\mahjong_typeset_hand:n} \DescribeMacro{\mahjong_typeset_hand:x}
% The \LaTeX~3 interface for rendering mahjong tiles are |\mahjong_typeset_hand:n| and its variants.
% This macro accepts the hand to be rendered in MPSZ notation.
% The height can be specified by setting |\l_mahjong_tile_height| \DescribeMacro{\l_mahjong_tile_height} and the default height is saved in |\g_mahjong_default_height|. \DescribeMacro{\g_mahjong_default_height}
+% The scale of the tiles' symbols can be changed by setting |\l_mahjong_tile_scale| \DescribeMacro{\l_mahjong_tile_scale} and the default scale is saved in |\g_mahjong_default_scale|.\DescribeMacro{\g_mahjong_default_scale}
%
-% The default height can be set using the package's |height| parameter.
-% For instance, |\usepackage[height=2\baselineskip]{mahjong}| sets the default size of mahjong tiles to double the value of |\baselineskip| in the context they are rendered in.
-% The parameter defaults to |\baselineskip|.
+% \subsection{Package Options}
+% \begin{description}
+% \item[height]
+% The default height can be set using the package's |height| parameter.
+% For instance, |\usepackage[height=2\baselineskip]{mahjong}| sets the default size of mahjong tiles to double the value of |\baselineskip| in the context they are rendered in.
+% \item[scale] The default scale can be set using the package's |scale| parameter.
+% It should ideally be set to a constant to ensure consistent typesetting.
+% The default is 0.75, i.e. the symbols take up 85\% of the tiles' vertical space.
+% \end{description}
%
% \section{Acknowledgments}
% The mahjong tiles used in this package were created by GitHub user \href{https://github.com/FluffyStuff}{FluffyStuff}.
@@ -196,7 +206,7 @@
%<@@=mahjong>
\NeedsTeXFormat{LaTeX2e}[2019/10/01]
\RequirePackage{expl3}
-\ProvidesExplPackage{mahjong}{2021/04/16}{1.0.1}{Typeset Mahjong Hands}
+\ProvidesExplPackage{mahjong}{2025/01/06}{1.1}{Typeset Mahjong Hands}
\RequirePackage{xparse}
\RequirePackage{l3keys2e}
\RequirePackage{graphicx}
@@ -215,7 +225,8 @@
{This ~ should ~ not ~ happen.~ Please ~ create ~ a ~ bug ~ report.}
\keys_define:nn {mahjong} {
- height .dim_gset:N = \g_mahjong_default_height
+ height .dim_gset:N = \g_mahjong_default_height,
+ scale .int_gset:N = \g_mahjong_default_scale
}
% Identifiers for all suits
@@ -236,6 +247,12 @@
\dim_set:Nn \g_mahjong_default_height {\baselineskip}
\dim_new:N \l_mahjong_tile_height
+\fp_set:Nn \g_mahjong_default_scale {0.75}
+\fp_new:N \l_mahjong_tile_scale
+
+\dim_new:N \l_@@_symbol_height
+\dim_new:N \l_@@_baseline_offset
+
\int_new:N \l_@@_tile_orientation_int
\seq_new:N \l_@@_tile_maps_seq
\str_new:N \l_@@_file_path_str
@@ -246,7 +263,7 @@
% \begin{macro}[aux]{\@@_make_tile:nn, \@@_make_tile:VV, \@@_make_tile:xV, \@@_make_tile:nV}
% Inserts a mahjong tile into the input stream.
-% This functions only handles that use the front background and have a forground,
+% This functions only handles tiles that use the front background and have a forground,
% i.e. regular and blank tiles.
% \begin{macrocode}
\cs_set:Npn \@@_make_tile:nn #1#2 {
@@ -256,7 +273,7 @@
\stackinset{c}{0pt}{c}{0pt}{
\includegraphics[
angle=0,
- height=.85\l_mahjong_tile_height]
+ height=\l_@@_symbol_height]
{#1}
}{
\includegraphics[
@@ -268,7 +285,7 @@
\stackinset{c}{0pt}{c}{0pt}{
\includegraphics[
angle=90,
- width=.85\l_mahjong_tile_height]
+ width=\l_@@_symbol_height]
{#1}
}{
\includegraphics[
@@ -296,11 +313,15 @@
% \end{macrocode}
% \end{macro}
% \begin{macro}{\mahjong_typeset_hand:n, \mahjong_typeset_hand:x}
-% Parseses and typesets a mahjong hand in MPSZ notation.
-% Set |\l_mahjong_tile_height| to control the tiles' size.
+% Parses and typesets a mahjong hand in MPSZ notation.
+% Set |\l_mahjong_tile_height| to control the tiles' size and |\l_mahjong_tile_scale| to control the size of the symbol relative to the tile.
% \begin{macrocode}
% Parses a full hand
\cs_set:Npn \mahjong_typeset_hand:n #1 {
+ % Set computed dimensions for symbol height and baseline offset
+ \dim_set:Nn \l_@@_symbol_height {\fp_to_decimal:n {\l_mahjong_tile_scale}\l_mahjong_tile_height}
+ \dim_set:Nn \l_@@_baseline_offset {(\l_mahjong_tile_height - \l_@@_symbol_height) / 2}
+ % Start sequence processing
\tl_set:Nx \l_@@_hand_tl {\text_lowercase:n {#1}}
% MPSZ notation is easier to parse right-to-left, so reverse string
% There is no string reversal function but we can reverse token lists
@@ -338,44 +359,46 @@
}
}
% Typesetting begins here. Sequence is in correct order
- \seq_map_variable:NNn \l_@@_tile_maps_seq \l_tmpa_prop {
- \prop_get:NnN \l_tmpa_prop {face} \l_tmpa_tl
- \prop_get:NnN \l_tmpa_prop {orientation} \l_tmpa_int
- \str_case:VnF \l_tmpa_tl {
- {-} {
- % If the current face is a dash, insert a space
- \includegraphics[height=\l_mahjong_tile_height]{tiles/mahjong-Space.pdf}
- } {x} {
- % Insert a flipped tile
- \int_case:nn {\l_tmpa_int} {
- {0} { % Upright
- \includegraphics[
- angle=0,
- height=\l_mahjong_tile_height]
- {tiles/mahjong-Back.pdf}
- } {1} { % Rotated
- \includegraphics[
- angle=90,
- width=\l_mahjong_tile_height]
- {tiles/mahjong-Back.pdf}
- } {2} { % Rotated and stacked
- \stackon [0pt] {
+ \raisebox{-\l_@@_baseline_offset}{
+ \seq_map_variable:NNn \l_@@_tile_maps_seq \l_tmpa_prop {
+ \prop_get:NnN \l_tmpa_prop {face} \l_tmpa_tl
+ \prop_get:NnN \l_tmpa_prop {orientation} \l_tmpa_int
+ \str_case:VnF \l_tmpa_tl {
+ {-} {
+ % If the current face is a dash, insert a space
+ \includegraphics[height=\l_mahjong_tile_height]{tiles/mahjong-Space.pdf}
+ } {x} {
+ % Insert a flipped tile
+ \int_case:nn {\l_tmpa_int} {
+ {0} { % Upright
\includegraphics[
- angle=90,
- width=\l_mahjong_tile_height]
- {tiles/mahjong-Back.pdf}
- } {
- \includegraphics[angle=90,
+ angle=0,
+ height=\l_mahjong_tile_height]
+ {tiles/mahjong-Back.pdf}
+ } {1} { % Rotated
+ \includegraphics[
+ angle=90,
width=\l_mahjong_tile_height]
{tiles/mahjong-Back.pdf}
+ } {2} { % Rotated and stacked
+ \stackon [0pt] {
+ \includegraphics[
+ angle=90,
+ width=\l_mahjong_tile_height]
+ {tiles/mahjong-Back.pdf}
+ } {
+ \includegraphics[angle=90,
+ width=\l_mahjong_tile_height]
+ {tiles/mahjong-Back.pdf}
+ }
}
}
+ } {?} { % Blank tile
+ \@@_make_tile:nV {tiles/mahjong-Blank.pdf} \l_tmpa_int
}
- } {?} { % Blank tile
- \@@_make_tile:nV {tiles/mahjong-Blank.pdf} \l_tmpa_int
+ } { % Any other tile identified by a code.
+ \@@_make_tile:xV {tiles/mahjong-\l_tmpa_tl\prop_item:Nn \l_tmpa_prop {suit}.pdf} \l_tmpa_int
}
- } { % Any other tile identified by a code.
- \@@_make_tile:xV {tiles/mahjong-\l_tmpa_tl\prop_item:Nn \l_tmpa_prop {suit}.pdf} \l_tmpa_int
}
}
% Clear the list for the next invocation
@@ -391,9 +414,10 @@
% This is the only \LaTeXe{} macro in this package.
% It typesets a mahjong hand.
% \begin{macrocode}
-\NewDocumentCommand{\mahjong}{O{\g_mahjong_default_height} m}{
+\NewDocumentCommand{\mahjong}{O{\g_mahjong_default_height} O{\g_mahjong_default_scale} m}{
\dim_set:Nn \l_mahjong_tile_height {#1}
- \mahjong_typeset_hand:n {#2}
+ \fp_set:Nn \l_mahjong_tile_scale {#2}
+ \mahjong_typeset_hand:n {#3}
}
%</pkg>
% \end{macrocode}
diff --git a/graphics/mahjong/mahjong.pdf b/graphics/mahjong/mahjong.pdf
index f3bc3d44a8..ba50b0c19c 100644
--- a/graphics/mahjong/mahjong.pdf
+++ b/graphics/mahjong/mahjong.pdf
Binary files differ
diff --git a/graphics/mcf2graph/CHANGELOG b/graphics/mcf2graph/CHANGELOG
index e239f9ec97..c5bbcf621b 100644
--- a/graphics/mcf2graph/CHANGELOG
+++ b/graphics/mcf2graph/CHANGELOG
@@ -1,6 +1,83 @@
*******************************************************************************
- Changelog of mcf2graph software package by Akira Yamaji 2024-02-25
+ Changelog of mcf2graph software package by Akira Yamaji 2025-02-16
*******************************************************************************
+[ver. 5.19 / 2025-02-16]
+ -update mcf_to_graph.cmd
+ -update template_soc.mp
+ -update mcf_exa_soc.mp
+ -update mcf2graph.mp
+ -update main_lib.mcf
+ -update template_lib.mcf
+
+[ver. 5.18 / 2025-02-02]
+ -fix bug in MOL file output
+ -update mcf2graph.mp
+ -update main_lib.mcf
+ -update MCF manual,example
+
+[ver. 5.17 / 2025-01-13]
+ -fix bug in group length inside group
+ -delete group command **
+ -delete option parameter sw_expand
+ -update mcf2graph.mp
+ -update main_lib.mcf
+ -update MCF manual,example
+
+[ver. 5.16 / 2025-01-05]
+ -change syntax of methyl group
+ /_ => ?
+ */_ => ?w
+ /*_ => ?z
+ //_ => ?d
+ -change syntax of just after jump atom
+ @n,\ => @n,!
+ @n,\\ => @n,!d
+ @n,*\ => @n,!w
+ @n,\* => @n,!z
+ @n,*\* => @n,!~wv
+ -change syntax of scaled fused ring
+ ?n[m] => #m'?n
+ -change option parameter name
+ sw_abbreviate => sw_omit
+ -change ratio parameter
+ ratio_char_bond => ratio_char_atom
+ -delete command \,\\,*\,\*,*\*,_
+ -delete option for sw_numbering
+ numbering_start,numbering_end
+ -delete Calc option for sw_output
+ -update mcf2graph.mp
+ -update main_lib.mcf
+ -update MCF manual,example,template
+
+[ver. 5.15 / 2024-12-01]
+ -change syntax of separator inside @(..)
+ @(a,b) => @(a'b)
+ -update mcf2graph.mp
+ -update main_lib.mcf
+ -update MCF manual,example
+
+[ver. 5.14 / 2024-11-17]
+ -change syntax of inverter inside {..}
+ {n1,n2',n3..} => {n1,*n2,n3..}
+ -change syntax of separator inside {..}
+ {n1,*n2,n3..} => {n1'*n2'n3..}
+ -update mcf2graph.mp
+ -update main_lib.mcf
+ -update MCF manual,example,template
+
+[ver. 5.13 / 2024-11-10]
+ -add binary operator '
+ a ' b : {a,b} or ''(a,b)
+ -delete binary operator +
+ -change command name
+ '() => ''()
+ ''() => '`()
+ -change syntax of group angle
+ >'(..) => >{..}
+ -update mcf2graph.mp
+ -update main_lib.mcf
+ -update MCF manual,example
+
[ver. 5.12 / 2024-02-25]
-add command `(),``()
define group "string"
diff --git a/graphics/mcf2graph/README b/graphics/mcf2graph/README
index 0dbc9d157f..416bc447ff 100644
--- a/graphics/mcf2graph/README
+++ b/graphics/mcf2graph/README
@@ -1,7 +1,7 @@
********************************************************************************
mcf2graph : Convert Molecular Coding Format to graphics with MetaPost
Author : Akira Yamaji
- version : 5.12 2024-02-25
+ version : 5.19 2025-02-16
E-mail : mcf2graph@gmail.com
Located at : http://www.ctan.org/pkg/mcf2graph
********************************************************************************
@@ -10,30 +10,44 @@
Molecular Coding Format(MCF) is new linear notation represent
chemical structure diagrams.
This Coding is named from programing technique
- such as operator, array, scope, macro, adressing, etc.
- mcf2graph convert from MCF to SVG, PNG, EPS, MOL file.
- It is also able to calculate molecular weight, exact mass, molecular formula.
+ such as operator,array,scope,macro,adressing,etc.
+ mcf2graph convert from MCF to SVG,PNG,EPS,MOL file.
+ It is also able to calculate molecular weight,exact mass,molecular formula.
2. The distribution of software
( 1) README This file
( 2) CHANGELOG Changelog file of mcf2graph
- ( 3) mcf_to_graph.cmd Batch file for compile MCF lib
+ ( 3) mcf_to_graph.cmd Batch file for compile mcf library file
+ drag and drop library file on this batch
+ >mcf_to_graph main_lib.mcf
+ create svg(default) in ./main_lib
>mcf_to_graph template_lib.mcf
- drag and drop library files on this batch
- create svg in ./template_lib
+ create svg(default) in ./template_lib
( 4) mcf2graph.mp Main macro of Metapost
- ( 5) mcf_exa_soc.mp Metapost source file example
- ( 6) main_lib.mcf MCF library file
- ( 7) template_lib.mcf Template library file
- ( 8) template_soc.mp Template metapost source file
+ ( 5) main_lib.mcf MCF library file
+ ( 6) template_lib.mcf Template library file
+ ( 7) mcf_exa_soc.mp Metapost source file for main_lib.mcf
+ ( 8) template_soc.mp Metapost source file for any library file
( 9) mcf_manual.tex MCF syntax manual
(10) mcf_manual.pdf PDF of (9) typeset with LuaLaTeX
(11) mcf_example.tex List of Molecule
(12) mcf_example.pdf PDF of (11) typeset with LuaLaTeX
-3. How to use mcf2graph with MetaPost
- Minimum requirement to use mcf2graph : mpost.exe,mpost.dll,mpost.mp,plain.mp
- (1) >mcf_to_graph filename.mcf => output svg(default),png,mol,report
+3. Minimum required files to use mcf2graph
+ Install texlive or other distribution
+ These files are available from texlive2024.iso in the case of texlive
+ (1) mpost.exe
+ (TeXLive2024/archive/metapost.<os>.r<number>.tar/bin/<os>/mpost.exe)
+ (2) mpost.dll
+ (TeXLive2024/archive/metapost.<os>.r<number>.tar/bin/<os>/mpost.dll)
+ (3) mpost.mp
+ (TeXLive2024/archive/metapost.r<number>.tar/texmf-dist/metapost/base/mpost.mp)
+ (4) plain.mp
+ (TeXLive2024/archive/metapost.r<number>.tar/texmf-dist/metapost/base/plain.mp)
+
+4. Use mcf2graph with MetaPost
+ -command line-
+ (1) >mcf_to_graph filename.mp => output svg(default),png,mol,report
(2) >mpost filename.mp => output svg file
(3) >mpost -s ahangle=1 filename.mp => output png file (600dpi)
(4) >mpost -s ahangle=11 filename.mp => output png file (1200dpi)
@@ -43,8 +57,8 @@
(8) >mpost -s ahlength=6 filename.mp => output mol file(V3000)
(9) >mpost -s ahlength=7 filename.mp => output report file
-4. License
- mcf2graph ver 5.12 Copyright (c) 2013-2024 Akira Yamaji
+5. License
+ mcf2graph ver 5.19 Copyright (c) 2013-2025 Akira Yamaji
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/graphics/mcf2graph/main_lib.mcf b/graphics/mcf2graph/main_lib.mcf
index f2868a7ab9..5b63cf0517 100644
--- a/graphics/mcf2graph/main_lib.mcf
+++ b/graphics/mcf2graph/main_lib.mcf
@@ -1,7 +1,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% molecular library file main_lib.mcf by Akira Yamaji 2024.01.25
+% molecular library file main_lib.mcf by Akira Yamaji 2025.02.16
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% must use version 5.12
+% must use version 5.19
% tag1:var1;tag2:var2;tag3:var3 .....
% first character of line "%" comment out
% first character of line ":" start MCF
@@ -12,11 +12,11 @@
% CAT = CATegory,EN = Name,MW = Molecular weight
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%==============================================================================
-CAT:-;EN:-;MW:0;EXA:-;
+CAT:nucleic acid;EN:Adenine;MW:135.13;EXA:-
=
- sw_frame:=Atom;
+ sw_frame:=Atom;
:
-<30,?6,3=?5,{1,3,5,9}=db,{2,6,9}:N,5:/NH2,7:NH
+ <30,?6,3=?5,1'3'5'9=db,2'6'9:N,5:/NH2,7:NH
*
defaultscale:=.5;
label.bot(decimal(fig_num)&":"&EN,(.5w,0));
@@ -26,321 +26,325 @@ CAT:-;EN:-;MW:0;EXA:-;
label.top("A6",A6) withcolor red;
label.top("A9",A9) withcolor red;
;
-%==============================================================================
-CAT:biological;EN:Adenine;MW:135.13;EXA:1
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% new molecular making lines (EXA:0) %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CAT:nucleic acid;EN:Adenine;MW:135.13;EXA:0
:
-<30,?6,3=?5,{1,3,5,9}=db,{2,6,9}:N,5:/NH2,7:NH
+<30,?6,3=?5,1'3'5'9=db,2'6'9:N,5:/NH2,7:NH
;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%------------------------------------------------------------------------------
-CAT:biological;EN:Guanine;MW:151.13;EXA:1
+CAT:nucleic acid;EN:Adenine;MW:135.13;EXA:1
:
-<30,?6,3=?5,{1,3,9}=db,{2,9}:N,{6,7}:NH,5:?O,1:/NH2
+<30,?6,3=?5,1'3'5'9=db,2'6'9:N,5:/NH2,7:NH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Cytosine;MW:111.10;EXA:1
+CAT:nucleic acid;EN:Guanine;MW:151.13;EXA:1
:
-<30,?6,{4,6}=db,4:N,3:?O,2:NH,5:/NH2
+<30,?6,3=?5,1'3'9=db,2'9:N,6'7:NH,5:?O,1:/NH2
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Thymine;MW:126.11;EXA:1
+CAT:nucleic acid;EN:Cytosine;MW:111.10;EXA:1
:
-<30,?6,3=db,{2,6}:NH,{1,5}:?O,4:/_
+<30,?6,4'6=db,4:N,3:?O,2:NH,5:/NH2
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Uracil;MW:112.09;EXA:1
+CAT:nucleic acid;EN:Thymine;MW:126.11;EXA:1
:
-<30,?6,6=db,{3,5}:?O,{2,4}:NH
+<30,?6,3=db,2'6:NH,1'5:?O,4:?
;
-%== Amino acid ================================================================
-CAT:biological;EN:Glycine;MW:75.07;EXA:-
+%------------------------------------------------------------------------------
+CAT:nucleic acid;EN:Uracil;MW:112.09;EXA:1
:
-<30,NH2,!2,COOH
+<30,?6,6=db,3'5:?O,2'4:NH
;
-%------------------------------------------------------------------------------
-CAT:biological;EN:Glycine;MW:75.07;EXA:-
+%== Amino acid ================================================================
+CAT:amino acid;EN:Glycine;MW:75.07;EXA:1
:
<30,NH2,!2,COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Alanine;MW:89.10;EXA:-
+CAT:amino acid;EN:L-Alanine;MW:89.10;EXA:1
:
<30,NH2,!wb,?!,COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Valine;MW:117.15;EXA:-
+CAT:amino acid;EN:L-Valine;MW:117.15;EXA:1
:
<30,NH2,!wb,/?!,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Leucine;MW:131.16;EXA:1
+CAT:amino acid;EN:L-Leucine;MW:131.16;EXA:1
:
<30,NH2,!wb,/!?!,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Isoleucine;MW:131.16;EXA:-
+CAT:amino acid;EN:L-Isoleucine;MW:131.16;EXA:1
:
-<30,NH2,!wb,/?z+!2,!COOH
+<30,NH2,!wb,/?z'!2,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Serine;MW:105.09;EXA:-
+CAT:amino acid;EN:L-Serine;MW:105.09;EXA:1
:
<30,NH2,!wb,/!OH,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Threonine;MW:119.12;EXA:-
+CAT:amino acid;EN:L-Threonine;MW:119.12;EXA:1
:
-<30,NH2,!wb,/?+!w+OH,!COOH
+<30,NH2,!wb,/?'!w'OH,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Cysteine;MW:121.16;EXA:-
+CAT:amino acid;EN:L-Cysteine;MW:121.16;EXA:1
:
<30,NH2,!wb,/!SH,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Methionine;MW:149.21;EXA:-
+CAT:amino acid;EN:L-Methionine;MW:149.21;EXA:1
:
-<30,NH2,!wb,/!2+S!,!COOH
+<30,NH2,!wb,/!2'S!,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Phenylalanine;MW:165.19;EXA:-
+CAT:amino acid;EN:L-Phenylalanine;MW:165.19;EXA:1
:
<30,NH2,!wb,/!Ph,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Tyrosine;MW:181.19;EXA:-
+CAT:amino acid;EN:L-Tyrosine;MW:181.19;EXA:1
:
-<30,NH2,!wb,/!Ph+(5:/OH),!COOH
+<30,NH2,!wb,/!Ph'(5:/OH),!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Triptophan;MW:204.21;EXA:-
+CAT:biological;EN:L-Triptophan;MW:204.21;EXA:1
:
-<30,NH2,!wb,!COOH,@2,\,!,<24,|,?5,2=dr,5=dl,2=Ph,4:NH
+<30,NH2,!wb,!COOH,@2,!2,<24,|,?5,2=dr,5=dl,2=Ph,4:NH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Proline;MW:115.13;EXA:-
+CAT:amino acid;EN:L-Proline;MW:115.13;EXA:1
:
<18,?5,3:NH,4:*/COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Glutamine;MW:146.15;EXA:-
+CAT:amino acid;EN:L-Glutamine;MW:146.15;EXA:1
:
-<30,NH2,!wb,!COOH,@2,\`1,!`1,!,?O!,NH2
+<30,NH2,!wb,!COOH,@2,!2`1,!?O!,NH2
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Asparagine;MW:132.12;EXA:-
+CAT:amino acid;EN:L-Asparagine;MW:132.12;EXA:1
:
-<30,NH2,!wb,/!?O!+NH2,!COOH
+<30,NH2,!wb,/!?O!'NH2,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Aspartic acid;MW:133.10;EXA:-
+CAT:amino acid;EN:L-Aspartic acid;MW:133.10;EXA:1
:
<30,NH2,!wb,/!COOH,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Glutamic acid;MW:147.13;EXA:-
+CAT:amino acid;EN:L-Glutamic acid;MW:147.13;EXA:1
:
-<30,NH2,!wb,/!2+COOH,!COOH
+<30,NH2,!wb,/!2'COOH,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Lysine;MW:146.19;EXA:-
+CAT:amino acid;EN:L-Lysine;MW:146.19;EXA:1
:
-<30,NH2,!wb,/!4+NH2,!COOH
+<30,NH2,!wb,/!4'NH2,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Arginine;MW:174.21;EXA:-
+CAT:amino acid;EN:L-Arginine;MW:174.21;EXA:1
:
-<30,NH2,!wb,!COOH,@2,\`1,!`1,!2,NH!,?NH,!NH2
+<30,NH2,!wb,!COOH,@2,!2`1,!2,NH!,?NH,!NH2
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Hystidine;MW:155.16;EXA:-
+CAT:amino acid;EN:L-Hystidine;MW:155.16;EXA:1
:
-<30,NH2,!wb,!COOH,@2,\,!,|,?5,{1,3}=dl,3:N,5:NH
+<30,NH2,!wb,!COOH,@2,!2,|,?5,1'3=dl,3:N,5:NH
;
%==============================================================================
-CAT:biological;EN:L-DOPA;MW:197.19;EXA:-
+CAT:amino acid;EN:L-DOPA;MW:197.19;EXA:1
:
-<30,NH2,!wb,/!Ph+({4,5}:/OH),!COOH
+<30,NH2,!wb,/!Ph'(4'5:/OH),!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Ornithine;MW:132.16;EXA:-
+CAT:amino acid;EN:Ornithine;MW:132.16;EXA:1
:
-<30,NH2,!wb,/!3+NH2,!COOH
+<30,NH2,!wb,/!3'NH2,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Citrulline;MW:175.2;EXA:-
+CAT:amino acid;EN:Citrulline;MW:175.2;EXA:1
:
-<30,NH2,!wb,/!3+NH!+?O!+NH2,!COOH
+<30,NH2,!wb,/!3'NH!'?O!'NH2,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:GABA;MW:103.12;EXA:-
+CAT:amino acid;EN:GABA;MW:103.12;EXA:1
:
<30,NH2,!4,COOH
;
%==============================================================================
-CAT:biological;EN:Citrate;MW:192.12;EXA:-
+CAT:biological;EN:Citrate;MW:192.12;EXA:1
:
<30,COOH,!2,/COOH^30,/OH^-30,!2,COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:cis-Aconitate;MW:174.11;EXA:-
+CAT:biological;EN:cis-Aconitate;MW:174.11;EXA:1
:
<30,COOH,!2,/COOH,!d,60,COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Isocitrate;MW:192.12;EXA:-
+CAT:biological;EN:Isocitrate;MW:192.12;EXA:1
:
<30,COOH,!4,COOH,3:!COOH,4:/OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Oxalosuccinate;MW:190.11;EXA:-
+CAT:biological;EN:Oxalosuccinate;MW:190.11;EXA:1
:
<30,COOH,!2,/COOH,!?O!,COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:alfa-Ketoglutarate;MW:146.1;EXA:-
+CAT:biological;EN:alfa-Ketoglutarate;MW:146.1;EXA:1
:
<30,COOH,!3,?O!,COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Succinate;MW:118.09;EXA:-
+CAT:biological;EN:Succinate;MW:118.09;EXA:1
:
<30,COOH,!3,COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Fumarate;MW:116.07;EXA:-
+CAT:biological;EN:Fumarate;MW:116.07;EXA:1
:
-<30,COOH,!,!d,!COOH
+<30,COOH,!!d,!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Malate;MW:134.09;EXA:-
+CAT:biological;EN:Malate;MW:134.09;EXA:1
:
<30,COOH,!3,COOH,3:/OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Oxaloacetate;MW:132.07;EXA:-
+CAT:biological;EN:Oxaloacetate;MW:132.07;EXA:1
:
<30,COOH,!,?O!2,COOH
;
%==============================================================================
-CAT:biological;EN:Glucose 1;MW:180.16;EXA:1
+CAT:sugar;EN:Glucose 1;MW:180.16;EXA:1
:
-<30,?6,5:O,2:*/OH,{1,3}:/*OH,4:*/*OH,6:*/!OH
+<30,?6,5:O,2:*/OH,1'3:/*OH,4:*/*OH,6:*/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Glucose 2;MW:180.16;EXA:1
+CAT:sugar;EN:Glucose 2;MW:180.16;EXA:1
:
-<-30,OH,!2,*/OH,!,/*OH,!,/*OH,!,/*OH,!,?O!,H
+<-30,OH,!2,*/OH,!,/*OH,!,/*OH,!,/*OH,!?O!,H
;
%------------------------------------------------------------------------------
-CAT:biological;EN:D-Glucose;MW:180.16;EXA:1
+CAT:sugar;EN:D-Glucose;MW:180.16;EXA:1
:
-hexose_hp,#.5,{1^$-90,2^$90,3^$-90,4^$-90}:/OH,6^$90:/!OH
+hexose_hp,#.5,{1^$270'2^$90'3^$270'4^$270}:/OH,6^$90:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Fructose 1;MW:180.16;EXA:1
+CAT:sugar;EN:Fructose 1;MW:180.16;EXA:1
:
<30,OH,!2,/*OH,!,*/OH,!,*/OH,!,?O!2,OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Fructose 2;MW:180.16;EXA:1
+CAT:sugar;EN:Fructose 2;MW:180.16;EXA:1
:
-<-18,?5,5:O,1^-48:*/*!OH,1^48:/OH,{2',3}:*/OH,4:/*!OH
+<-18,?5,5:O,1^-48:*/*!OH,1^48:/OH,*2'3:*/OH,4:/*!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:D-Fluctose;MW:180.16;EXA:1
+CAT:sugar;EN:D-Fluctose;MW:180.16;EXA:1
:
-Pyranose_hp,#.5,1^$-90:/OH,{2^$-90,3^$90}:/OH,{1^$90,4^$-90}:/!OH
+Pyranose_hp,#.5,1^$270:/OH,{2^$270'3^$90}:/OH,{1^$90'4^$270}:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:D-Galactose;MW:180.16;EXA:1
+CAT:sugar;EN:D-Galactose;MW:180.16;EXA:1
:
-hexose_hp,#.5,{1^$90,2^$90,3^$-90,4^$-90}:/OH,6^$90:/!OH
+hexose_hp,#.5,{1^$90'2^$90'3^$270'4^$270}:/OH,6^$90:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:D-Mannose;MW:180.16;EXA:1
+CAT:sugar;EN:D-Mannose;MW:180.16;EXA:1
:
-hexose_hp,#.5,{1^$-90,2^$90,3^$90,4^$-90}:/OH,6^$90:/!OH
+hexose_hp,#.5,{1^$270'2^$90'3^$90'4^$270}:/OH,6^$90:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:L-Fucose;MW:164.16;EXA:1
+CAT:sugar;EN:L-Fucose;MW:164.16;EXA:1
:
-hexose_hp,#.5,{1^$-90,2^$-90,3^$90,4^$90}:/OH,6^$-90:/_
+hexose_hp,#.5,{1^$270'2^$270'3^$90'4^$90}:/OH,6^$270:?
;
%------------------------------------------------------------------------------
-CAT:biological;EN:D-Ribose;MW:150.13;EXA:1
+CAT:sugar;EN:D-Ribose;MW:150.13;EXA:1
:
-Pyranose_hp,#.5,{2^$-90,3^$-90,4^$90}:/OH,1^$90:/!OH
+Pyranose_hp,#.5,{2^$270'3^$270'4^$90}:/OH,1^$90:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:D-Deoxyribose;MW:134.13;EXA:1
+CAT:sugar;EN:D-Deoxyribose;MW:134.13;EXA:1
:
-Pyranose_hp,#.5,{2^$-90,4^$90}:/OH,1^$90:/!OH
+Pyranose_hp,#.5,{2^$270'4^$90}:/OH,1^$90:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:D-Glucosamine;MW:179.17;EXA:1
+CAT:sugar;EN:D-Glucosamine;MW:179.17;EXA:1
:
-hexose_hp,#.5,{1^$-90,2^$90,4^$-90}:/OH,3^$-90:/NH2,6^$90:/!OH
+hexose_hp,#.5,{1^$270'2^$90'4^$270}:/OH,3^$270:/NH2,6^$90:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:N-acetyl-Glucosamine;MW:221.21;EXA:1
+CAT:sugar;EN:N-acetyl-Glucosamine;MW:221.21;EXA:1
:
-hexose_hp,#.5,{1^$-90,2^$90,4^$-90}:/OH,3^$-90>lr:/NH!+?O!,6^$90:/!OH
+hexose_hp,#.5,{1^$270'2^$90'4^$270}:/OH,3^$270>lr:/NH!'?O!,6^$90:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Glucuronic acid;MW:194.14;EXA:1
+CAT:sugar;EN:Glucuronic acid;MW:194.14;EXA:1
:
-hexose_hp,#.5,{1^$-90,2^$90,3^$-90,4^$-90}:/OH,6^$90:/COOH
+hexose_hp,#.5,{1^$270'2^$90'3^$270'4^$270}:/OH,6^$90:/COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Maltose;MW:342.3;EXA:1
+CAT:sugar;EN:Maltose;MW:342.3;EXA:1
:
-hexose_hp,#.5,{1^$-90,2^$90,3^$-90}:/OH,6^$90:/!OH,##,
- @4,$-50~arc_lb`1,O,$50~arc_br`1,<$0,
- |,hexose_hp,#.5,{2^$90,3^$-90,4^$-90}:/OH,6^$90:/!OH
+hexose_hp,#.5,{1^$270'2^$90'3^$270}:/OH,6^$90:/!OH,##,
+ @4,$310~arc_lb`1,O,$50~arc_br`1,<$0,
+ |,hexose_hp,#.5,{2^$90'3^$270'4^$270}:/OH,6^$90:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Sucrose;MW:342.3;EXA:1
+CAT:sugar;EN:Sucrose;MW:342.3;EXA:2
:
-hexose_hp,#.5,{1^$-90,2^$90,3^$-90}:/OH,6^$90:/!OH,##,
- @4,$-50~arc_lb`1,O,$50~arc_br`1,<$0,
+hexose_hp,#.5,{1^$270'2^$90'3^$270}:/OH,6^$90:/!OH,##,
+ @4,$310~arc_lb`1,O,$50~arc_br`1,<$0,
|,#1.4,-35~wf_r,35~bd_r`1,30~wb_r,130`1.66,O,&1,##,
- #.5,{2^$-90,3^$90}:/OH,{1^$90,4^$-90}:/!OH
+ #.5,{2^$270'3^$90}:/OH,{1^$90'4^$270}:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Lactose;MW:342.3;EXA:1
+CAT:sugar;EN:Lactose;MW:342.3;EXA:1
:
-hexose_hp,#.5,{1^$90,2^$90,3^$-90}:/OH,6^$90:/!OH,##,
+hexose_hp,#.5,{1^$90'2^$90'3^$270}:/OH,6^$90:/!OH,##,
@4,$0~arc_ltr,O,$0~arc_lbr,
- |,hexose_hp,#.5,{2^$90,3^$-90,4^$-90}:/OH,6^$90:/!OH
+ |,hexose_hp,#.5,{2^$90'3^$270'4^$270}:/OH,6^$90:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Cellobiose;MW:342.3;EXA:1
+CAT:sugar;EN:Cellobiose;MW:342.3;EXA:1
:
-hexose_hp,#.5,{1^$-90,2^$90,3^$-90}:/OH,6^$90:/!OH,##,
+hexose_hp,#.5,{1^$270'2^$90'3^$270}:/OH,6^$90:/!OH,##,
@4,$0~arc_lbr,O,$0~arc_ltr,
- |,hexose_hp,#.5,{2^$90,3^$-90,4^$-90}:/OH,6^$90:/!OH
+ |,hexose_hp,#.5,{2^$90'3^$270'4^$270}:/OH,6^$90:/!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Trehalose;MW:342.3;EXA:1
+CAT:sugar;EN:Trehalose;MW:342.3;EXA:1
:
-hexose_hp,#.5,{1^$-90,2^$90,3^$-90}:/OH,6^$90:/!OH,##,
- @4,@(1,0),|,hexose_hp,#.5,{1^$-90,2^$90,3^$-90}:/OH,6^$90:/!OH,##,
- ||,@4,$-37~arc_lb`3.25,O,&10~arc_br
+hexose_hp,#.5,{1^$270'2^$90'3^$270}:/OH,6^$90:/!OH,##,
+ @4,@(1'0),|,hexose_hp,#.5,{1^$270'2^$90'3^$270}:/OH,6^$90:/!OH,##,
+ ||,@4,$323~arc_lb`3.25,O,&10~arc_br
;
%==============================================================================
CAT:biological;EN:Geraniol;MW:154.25;EXA:1
:
-<30,!8,OH,{2,6}=dr,{2,6}:/_
+<30,!8,OH,2'6=dr,2'6:?
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Limonene;MW:136.24;EXA:-
+CAT:biological;EN:Limonene;MW:136.24;EXA:1
:
-<30,?6,2=dl,2:/_,5:*/?!d
+<30,?6,2=dl,2:?,5:*/?!d
;
%------------------------------------------------------------------------------
CAT:biological;EN:l-Menthol;MW:156.27;EXA:1
:
-<30,?6,2:/*?!,5:*/_,3:*/OH
+<30,?6,2:/*?!,5:?w,3:*/OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Allicin;MW:162.28;EXA:1
@@ -348,128 +352,129 @@ CAT:biological;EN:Allicin;MW:162.28;EXA:1
<-30,!d,!2,S?O,!,S,!2,!d
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Benzoic acid;MW:122.12;EXA:-
+CAT:biological;EN:Benzoic acid;MW:122.12;EXA:1
:
<30,Ph,3:/COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Gallic acid;MW:170.12;EXA:-
+CAT:biological;EN:Gallic acid;MW:170.12;EXA:1
:
-<30,Ph,3:/COOH,{1,5,6}:/OH
+<30,Ph,3:/COOH,1'5'6:/OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Salicylic acid;MW:138.12;EXA:-
+CAT:biological;EN:Salicylic acid;MW:138.12;EXA:1
:
<30,Ph,3:/COOH,4:/OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Cinnamic acid;MW:148.16;EXA:-
+CAT:biological;EN:Cinnamic acid;MW:148.16;EXA:1
:
-<30,Ph,3:/!dr+!COOH
+<30,Ph,3:/!dr'!COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Cinnamaldehyde;MW:132.16;EXA:-
+CAT:biological;EN:Cinnamaldehyde;MW:132.16;EXA:1
:
-<30,Ph,3:/!dr+!CHO
+<30,Ph,3:/!dr'!CHO
;
%------------------------------------------------------------------------------
CAT:biological;EN:Caffeic acid;MW:180.16;EXA:1
:
-<30,Ph,{1,6}:/OH,3:/!d+!COOH
+<30,Ph,1'6:/OH,3:/!d'!COOH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Vanillin;MW:152.15;EXA:1
:
<30,Ph,1:/OH,6:/O!,4:/CHO
;
-CAT:biological;EN:alfa-Terpinene;MW:136.24;EXA:-
+%------------------------------------------------------------------------------
+CAT:biological;EN:alfa-Terpinene;MW:136.24;EXA:1
:
-<30,?6,3:/?!,6:/_,{3,5}=db
+<30,?6,3:/?!,6:?,3'5=db
;
%------------------------------------------------------------------------------
-CAT:biological;EN:beta-Terpinene;MW:136.24;EXA:-
+CAT:biological;EN:beta-Terpinene;MW:136.24;EXA:1
:
-<30,?6,3:/?!,6://_,3=db
+<30,?6,3:/?!,6:?d,3=db
;
%------------------------------------------------------------------------------
-CAT:biological;EN:gamma-Terpinene;MW:136.24;EXA:-
+CAT:biological;EN:gamma-Terpinene;MW:136.24;EXA:1
:
-<30,?6,3:/?!,6:/_,{3,6}=db
+<30,?6,3:/?!,6:?,3'6=db
;
%------------------------------------------------------------------------------
-CAT:biological;EN:delta-Terpinene;MW:136.24;EXA:-
+CAT:biological;EN:delta-Terpinene;MW:136.24;EXA:1
:
-<30,?6,3://?!,6:/_,5=db
+<30,?6,3://?!,6:?,5=db
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Eugenol;MW:164.20;EXA:-
+CAT:biological;EN:Eugenol;MW:164.20;EXA:1
:
-<30,Ph,1:/OH,6:/O!,4:/!+!d
+<30,Ph,1:/OH,6:/O!,4:/!'!d
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Thymol;MW:150.22;EXA:-
+CAT:biological;EN:Thymol;MW:150.22;EXA:1
:
-<30,Ph,4:/OH,3:/?!,6:/_
+<30,Ph,4:/OH,3:/?!,6:?
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Anisaldehyde;MW:136.15;EXA:-
+CAT:biological;EN:Anisaldehyde;MW:136.15;EXA:1
:
<30,Ph,4:/CHO,1:/O!
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Benzaldehyde;MW:106.12;EXA:-
+CAT:biological;EN:Benzaldehyde;MW:106.12;EXA:1
:
<30,Ph,4:/CHO
;
%------------------------------------------------------------------------------
-CAT:biological;EN:gamma-Nonalactone;MW:156.23;EXA:-
+CAT:biological;EN:gamma-Nonalactone;MW:156.23;EXA:1
:
<18,?5,2:O,1:?O,3^-12:/!4
;
%------------------------------------------------------------------------------
-CAT:biological;EN:gamma-Undecalactone;MW:184.27;EXA:-
+CAT:biological;EN:gamma-Undecalactone;MW:184.27;EXA:1
:
<18,?5,2:O,1:?O,3^-12:/!6
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Muscone;MW:238.40;EXA:-
+CAT:biological;EN:Muscone;MW:238.40;EXA:1
:
-<-72,#1,60,-48,60,60,-48,60,60,-48,60,60,-48,60,60,-48,##,&1,9:?O,7:/_
+<-72,#1,60,-48,60,60,-48,60,60,-48,60,60,-48,60,60,-48,##,&1,9:?O,7:?
;
%------------------------------------------------------------------------------
-CAT:biological;EN:alfa-Pinene;MW:136.24;EXA:-
+CAT:biological;EN:alfa-Pinene;MW:136.24;EXA:1
:
-<30,?6,3:??,5:/_,5=db,@2,180~zf`1,&4~zb
+<30,?6,3:??,5:?,5=db,@2,180~zf`1,&4~zb
;
%------------------------------------------------------------------------------
-CAT:biological;EN:beta-Pinene;MW:136.24;EXA:-
+CAT:biological;EN:beta-Pinene;MW:136.24;EXA:1
:
-<30,?6,3:??,5://_,@2,180~zf`1,&4~zb
+<30,?6,3:??,5:?d,@2,180~zf`1,&4~zb
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Neral;MW:152.24;EXA:-
+CAT:biological;EN:Neral;MW:152.24;EXA:1
:
<30,!?,!d,!3,?,!d,-60,CHO
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Geranial;MW:152.24;EXA:-
+CAT:biological;EN:Geranial;MW:152.24;EXA:1
:
<30,!?,!d,!3,?,!d,!,CHO
;
%------------------------------------------------------------------------------
-CAT:biological;EN:p-Cymene;MW:134.21;EXA:-
+CAT:biological;EN:p-Cymene;MW:134.21;EXA:1
:
-<30,Ph,4:/?!,1:/_
+<30,Ph,4:/?!,1:?
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Benzyl-acetate;MW:150.18;EXA:-
+CAT:biological;EN:Benzyl-acetate;MW:150.18;EXA:1
:
-<30,Ph,@4,\,?O!,O!,!,Ph
+<30,Ph,@4,!?O!,O!,!,Ph
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Benzyl-benzoate;MW:212.25;EXA:-
+CAT:biological;EN:Benzyl-benzoate;MW:212.25;EXA:1
:
-<30,Ph,4:/!O!+?O!
+<30,Ph,4:/!O!'?O!
;
%------------------------------------------------------------------------------
CAT:biological;EN:Stearic acid;MW:284.48;EXA:1
@@ -479,7 +484,7 @@ CAT:biological;EN:Stearic acid;MW:284.48;EXA:1
%------------------------------------------------------------------------------
CAT:biological;EN:Linoleic acid;MW:280.45;EXA:1
:
-<30,!5,-30,-30,!,-30,-30,!7,COOH,{6,9}=dr
+<30,!5,-30,-30,!,-30,-30,!7,COOH,6'9=dr
;
%------------------------------------------------------------------------------
CAT:biological;EN:Sphingosine;MW:299.50;EXA:1
@@ -489,19 +494,19 @@ CAT:biological;EN:Sphingosine;MW:299.50;EXA:1
%------------------------------------------------------------------------------
CAT:biological;EN:Tocopherol;MW:430.717;EXA:1
:
-<30,Ph,3=?6,7:O,{1,2,5}:/_,8:/*_^60,6:/OH,@8,\,|,!12,{4,8}:/*_,12:/_
+<30,Ph,3=?6,7:O,1'2'5:?,8:?z^60,6:/OH,@8,!,|,!12,4'8:?z,12:?
;
%------------------------------------------------------------------------------
CAT:biological;EN:Thiamine;MW:265.35;EXA:1
:
-<30,Ph,4:/NH2,@3,\`1,!,<-12,?5,{-1,-4}=dl,{1,5,8}:N,11:S,{6,9}:/_,
- -3:/!2+OH^-12,8:p_^72
+<30,Ph,4:/NH2,@3,!`1,!,<-12,?5,-1'-4=dl,1'5'8:N,11:S,6'9:?,
+ -3^-12:/!2'OH,8:p_^72
;
%------------------------------------------------------------------------------
CAT:biological;EN:Riboflavin;MW:376.37;EXA:1
:
-<30,Ph,{3,9}=?6,{8,16}=dl,{7,10,14}:N,12:NH,{11,13}:?O,{1,6}:/_,
- @10,\`1.5,!,*/OH,!,/*OH,!,*/OH,!2,OH
+<30,Ph,3'9=?6,8'16=dl,7'10'14:N,12:NH,11'13:?O,1'6:?,
+ @10,!`1.5,!,*/OH,!,/*OH,!,*/OH,!2,OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Nicotinic acid;MW:123.11;EXA:1
@@ -511,7 +516,7 @@ CAT:biological;EN:Nicotinic acid;MW:123.11;EXA:1
%------------------------------------------------------------------------------
CAT:biological;EN:Nicotinamide;MW:122.12;EXA:1
:
-<30,Ph,2:N,4:/?O+!NH2
+<30,Ph,2:N,4:/?O'!NH2
;
%------------------------------------------------------------------------------
CAT:biological;EN:Pantothenic acid;MW:219.23;EXA:1
@@ -521,125 +526,124 @@ CAT:biological;EN:Pantothenic acid;MW:219.23;EXA:1
%------------------------------------------------------------------------------
CAT:biological;EN:Pyridoxine;MW:169.18;EXA:1
:
-<30,Ph,2:N,3:/_,4:/OH,{5,6}:/!OH
+<30,Ph,2:N,3:?,4:/OH,5'6:/!OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Biotin;MW:244.31;EXA:1
:
-<18,?5,4=?5,2:S,{6,8}:NH,7:?O,{4^-54,5^54}:*/H,3:/*!4+COOH^-12
+<18,?5,4=?5,2:S,6'8:NH,7:?O,{4^-54'5^54}:*/H,3^-12:/*!4'COOH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Folic acid;MW:441.3975;EXA:1
:
-<30,?6,3=Ph2,1=dl,{2,7,10}:N,6:NH,5:?O,1:/NH2,
- @9,\,!NH!,Ph,@-3,\,?O,!NH!,/*COOH,!3,COOH
+<30,?6,3=Ph2,1=dl,2'7'10:N,6:NH,5:?O,1:/NH2,
+ @9,!,!NH!,Ph,@-3,!?O,!NH!,/*COOH,!3,COOH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Carotene;MW:536.8726;EXA:1
:
-<30,?6,@4,\,!18,?6,
- {8,10,12,14,16,18,20,22,24}=dr,{5,9,13,18,22,-5}:/_,{4,-6}=dl,{3,-1}:??
+<30,?6,@4,!19,?6,8'10'12'14'16'18'20'22'24=dr,5'9'13'18'22'-5:?,4'-6=dl,3'-1:??
;
%------------------------------------------------------------------------------
CAT:biological;EN:Adrenalin;MW:183.21;EXA:1
:
-<30,Ph,{1,6}:/OH,@4,\,*/OH,!2,NH!
+<30,Ph,1'6:/OH,@4,!,*/OH,!2,NH!
;
%------------------------------------------------------------------------------
CAT:biological;EN:Caffeine;MW:194.194;EXA:1
:
-<30,?6,3=dl,{1,5}:?O,-4=?5,-3=dl,7:N,{2,6,9}:N?
+<30,?6,3=dl,1'5:?O,-4=?5,-3=dl,7:N,2'6'9:N?
;
%------------------------------------------------------------------------------
CAT:biological;EN:Nicotine;MW:162.23;EXA:1
:
-<30,Ph,2:N,4:/?5+(2:N?)
+<30,Ph,2:N,4:/?5'(2:N?)
;
%------------------------------------------------------------------------------
CAT:biological;EN:Capsaicin;MW:305.418;EXA:1
:
-<30,Ph,1:/OH,6:/O!,@4,\,!NH!,?O,!7,?!,-3=dl
+<30,Ph,1:/OH,6:/O!,@4,!,!NH!,?O,!7,?!,-3=dl
;
%------------------------------------------------------------------------------
CAT:biological;EN:Gibberellin A3;MW:346.379;EXA:1
:
-<18,?5,3=?7,5=?6[12],@8,160`1.3,&3,13=dl,6=wf,8=wb,
- @5,40~zf`1,O,50,?O^180,&14~zb,2:/COOH,7://_,{13,8'}:*/OH,14:*/_,{1,4}:*/H^60
+<18,?5,3=?7,5=#1.2'?6,@8,160`1.3,&3,13=dl,6=wf,8=wb,
+ @5,40~zf`1,O,50,?O^180,&14~zb,2:/COOH,7:?d,*8'13:*/OH,14:?w,1'4:*/H^60
;
%------------------------------------------------------------------------------
CAT:biological;EN:Cholesterol;MW:386.664;EXA:1
:
-<30,?6,{-4,-2}=?6,-4=?5,7=dl,
- 1:*/OH,{4,12}:*/_^60,{9'^60,10^180,11^-60,-1^-60}:/*H,@-1,17,/*_,!4,?!
+<30,?6,-4'-2=?6,-4=?5,7=dl,
+ 1:*/OH,4'12:?w^60,{*9^60'10^180'11^-60'-1^-60}:/*H,@-1,17,?z,!4,?!
;
%------------------------------------------------------------------------------
CAT:biological;EN:Resveratrol;MW:228.24;EXA:1
:
-<30,Ph,@4,\,!d,!Ph,{2,6,-3}:/OH
+<30,Ph,@4,!!d!,Ph,2'6'-3:/OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Glutathione;MW:307.33;EXA:1
:
-<-30,COOH,!,/*NH2,!3,?O,!NH!,*/!SH,!,?O!,NH,!2,COOH
+<-30,COOH,!,/*NH2,!3,?O,!NH!,*/!SH,!?O!,NH,!2,COOH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Trenbolone;MW:270.37;EXA:1
:
-<30,?6,{3,10}=?6,13=?5,{2,11,15}=dl,1:?O,12:*/_^60,-1:/*OH,{9^60,11'^-60}:*/H
+<30,?6,3'10=?6,13=?5,2'11'15=dl,1:?O,12:?w^60,-1:/*OH,{9^60'*11^-60}:*/H
;
%------------------------------------------------------------------------------
CAT:biological;EN:Luciferin;MW:280.33;EXA:1
:
-<30,Ph,3=?5,@8,\,?5,{9,16}=dl,{9,14}:N,{7,11}:S,1:/OH,-2:*/COOH
+<30,Ph,3=?5,@8,!,?5,9'16=dl,9'14:N,7'11:S,1:/OH,-2:*/COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Chlorophyll a;MW:893.509;EXA:1
+CAT:biological;EN:Chlorophyll a;MW:893.509;EXA:2
:
-<-36,#1,?5,@3,\,54,?5,@-2,\,54,?5,@-2,\,54,?5,@-2,\,&5,@6,22,70,&8,##,
- {4,6,8,10,14,16,18,21,23,27}=dl,@4,\`1.48~vf,Mg,&17~vb,@11,&27,@27,&23,
- {4,11,17,23}:N,{1~zf,9,15,21}:/_,14:/!,20:/!d,25:/*?O!+O!,26:?O,
- @2,*\^-6,!2,?O!,O!2,!d,|,!13,{1,5,9,13}:/_
+<-36,#1,?5,@3,!,54,?5,@-2,!,54,?5,@-2,!,54,?5,@-2,!,&5,@6,22,70,&8,##,
+ 4'6'8'10'14'16'18'21'23'27=dl,@4,!`1.48~vf,Mg,&17~vb,@11,&27,@27,&23,
+ 4'11'17'23:N,{1~zf'9'15'21}:?,14:/!,20:/!d,25:/*?O!'O!,26:?O,
+ @2,-6~wf,!2,?O!,O!2,!d,|,!13,1'5'9'13:?
;
%------------------------------------------------------------------------------
CAT:biological;EN:Alizarin;MW:240.21;EXA:1
:
-<30,Ph,3=?6,-3=Ph2,{7,10}:?O,{13,14}:/OH
+<30,Ph,3=?6,-3=Ph2,7'10:?O,13'14:/OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Indigo;MW:262.26;EXA:1
:
-<30,Ph,3=?5,@-2,\\,?5,-3=Ph2,{7,14}:NH,{9,11}:?O
+<30,Ph,3=?5,@-2,!d,?5,-3=Ph2,7'14:NH,9'11:?O
;
%------------------------------------------------------------------------------
CAT:biological;EN:6,6'-dibromoindigo;MW:420.0549;EXA:1
:
-<30,Ph,3=?5,@-2,\\,?5,-3=Ph2,{7,14}:NH,{9,11}:?O,{1,-2}:/Br
+<30,Ph,3=?5,@-2,!d,?5,-3=Ph2,7'14:NH,9'11:?O,1'-2:/Br
;
%------------------------------------------------------------------------------
CAT:biological;EN:Carminic Acid;MW:492.39;EXA:1
:
-<30,Ph,3=?6,-3=Ph2,{7,10}:?O,{2,5,6,13}:/OH,11:/_,12:/COOH,
- @1,\~wb`1,?6,-5:O,{-1,-2',-3}:/*OH,-4:*/!OH
+<30,Ph,3=?6,-3=Ph2,7'10:?O,2'5'6'13:/OH,11:?,12:/COOH,
+ @1,!~wb`1,?6,-5:O,-1'*-2'-3:/*OH,-4:*/!OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Curcumin;MW:368.38;EXA:1
:
-<30,Ph,@3,\,!7,Ph,{8,13}=dr,{9,11}:?O,{6,-3}:/OH,{5,-4}:/O!
+<30,Ph,@3,!8,Ph,8'13=dr,9'11:?O,6'-3:/OH,5'-4:/O!
;
%------------------------------------------------------------------------------
CAT:biological;EN:Berberine;MW:336.36;EXA:1
:
-<30,Ph,3=Ph,-3=?6,-2=Ph2,-3=?5,8:N,8:p_^60,{-1,-3}:O,{1>vt,2}:/!OH
+<30,Ph,3=Ph,-3=?6,-2=Ph2,-3=?5,8:N,8:p_^60,-1'-3:O,{1>vt'2}:/!OH
;
%==============================================================================
-CAT:biological;EN:Apigenin;MW:270.24;EXA:-
+CAT:biological;EN:Apigenin;MW:270.24;EXA:1
:
-<30,Ph,{2,6}:/OH,3=?6,9=dl,10:O,7:?O,9:/Ph+(-3:/OH)
+<30,Ph,2'6:/OH,3=?6,9=dl,10:O,7:?O,@9,!Ph,-3:/OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Luteolin;MW:286.24;EXA:-
+CAT:biological;EN:Luteolin;MW:286.24;EXA:1
:
-<30,Ph,{2,6}:/OH,3=?6,9=dl,10:O,7:?O,9:/Ph+({-2,-3}:/OH)
+<30,Ph,2'6:/OH,3=?6,9=dl,10:O,7:?O,@9,!Ph,-2'-3:/OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Flavone;MW:222.24;EXA:1
@@ -647,12 +651,12 @@ CAT:biological;EN:Flavone;MW:222.24;EXA:1
<30,Ph,3=?6,9=dl,10:O,7:?O,9:/Ph,
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Isoflavone;MW:222.24;EXA:-
+CAT:biological;EN:Isoflavone;MW:222.24;EXA:1
:
<30,Ph,3=?6,9=dl,10:O,7:?O,8:/Ph,
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Flavanone;MW:224.25;EXA:-
+CAT:biological;EN:Flavanone;MW:224.25;EXA:1
:
<30,Ph,3=?6,10:O,7:?O,9:/Ph,
;
@@ -664,31 +668,31 @@ CAT:biological;EN:Flavonol;MW:238.24;EXA:1
%------------------------------------------------------------------------------
CAT:biological;EN:Cianidanol;MW:290.27;EXA:1
:
-<30,Ph,3=?6,@8,*\,Ph,7:O,{1,5,9~zf,13,14}:/OH
+<30,Ph,3=?6,@8,!w,Ph,7:O,{1'5'9~zf'13'14}:/OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Quercetin;MW:302.24;EXA:1
:
-<30,Ph,3=?6,@9,\,Ph,9=dl,10:O,7:?O,{2,6,8,13,14}:/OH
+<30,Ph,3=?6,@9,!Ph,9=dl,10:O,7:?O,2'6'8'13'14:/OH
;
%==============================================================================
CAT:biological;EN:Limonin;MW:470.518;EXA:1
:
-<30,?6,{-3,-4}=?6,-5=?3,-2=wf,-1=wb,6=?5,-4=?6,-5=wf,{13,15,17,20}:O,
- {3,12,21}:?O,{4^60,8'^60}:*/_,18:??,{1^60,5^180,16^60}:/*H,
- @14,\*,|,?5,{1,4}=dl,3:O
+<30,?6,-3'-4=?6,-5=?3,-2=wf,-1=wb,6=?5,-4=?6,-5=wf,13'15'17'20:O,
+ 3'12'21:?O,4'*8:?w^60,18:??,{1^60'5^180'16^60}:/*H,
+ @14,!z,|,?5,1'4=dl,3:O
;
%------------------------------------------------------------------------------
CAT:biological;EN:Cromolyn;MW:468.37;EXA:1
:
<30,Ph,|,-1=?6,3=dl,1:O,4:?O,2:/COOH,
- @$2,\,O!2,/OH,!2,O,60,Ph,|,-5=?6,3=dl,4:O,1:?O,3:/COOH
+ @$2,!,O!2,/OH,!2,O,60,Ph,|,-5=?6,3=dl,4:O,1:?O,3:/COOH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Emetine;MW:480.649;EXA:1
:
-<30,Ph,{-4,-4}=?6,8:N,{1,6}:/O!,-2:/*!,{7^-60,12^-60}:/*H,
- @-3,\,!zb,<-60,|,?6,5=dl,2:NH,-6^-60:*/H,|,-2=?6,{2,4}=dl,{-2,-3}:/O!
+<30,Ph,-4'-4=?6,8:N,1'6:/O!,-2:/*!,7'12:/*H^-60,
+ @-3,!,!zb,<-60,|,?6,5=dl,2:NH,-6^-60:*/H,|,-2=?6,2'4=dl,-2'-3:/O!
;
%------------------------------------------------------------------------------
CAT:biological;EN:Acronycine;MW:321.376;EXA:1
@@ -698,318 +702,313 @@ CAT:biological;EN:Acronycine;MW:321.376;EXA:1
%------------------------------------------------------------------------------
CAT:biological;EN:Piperine;MW:285.343;EXA:1
:
-<30,Ph,-1=?5,{-1,-3}:O,@4,\,!d,!,!d,!,?O!,?6,-6:N
+<30,Ph,-1=?5,-1'-3:O,@4,!!d,!,!d,!?O!,?6,-6:N
;
%------------------------------------------------------------------------------
CAT:biological;EN:Febrifugine;MW:301.34;EXA:1
:
-<30,Ph,3=?6,@9,8=dl,\,!2,!zb,?6,{7,9}:N,-5:NH,{10,12}:?O,-1:*/OH
+<30,Ph,3=?6,8=dl,@9,!3,!zb,?6,7'9:N,-5:NH,10'12:?O,-1:*/OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Hypericin;MW:504.44;EXA:1
:
-<30,Ph,{-4,-3,11--4,16---17,19,23---24,22--29}=?6,
- {12,14,16,17,22',24,26,28,33,35}=dl,
- {7,25}:?O,{13,26}:/_,{2,6,11,21,23,28}:/OH
+<30,Ph,-4'-3'(11--4)'(16---17)'19'(23---24)'(22--29)=?6,
+ 12'14'16'17'*22'24'26'28'33'35=dl,7'25:?O,13'26:?,2'6'11'21'23'28:/OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Camphor;MW:152.23;EXA:1
:
-#1,15,-30,90,90,30,##,&1,@2,0~si_`1.6,&5,{-1^45,-1^-65,5^-45}:/_,4:?O
+#1,15,-30,90,90,30,##,&1,@2,0~si_`1.6,&5,{-1^45'-1^-65'5^-45}:?,4:?O
;
%------------------------------------------------------------------------------
CAT:biological;EN:Sparteine;MW:234.3803;EXA:1
:
-<30,?6,3=?6,9=wf,10=wb,@8,#1,60,60,N,60,##,&10,-3=?6,3:N,{4^60,11'^-60}:*/H
+<30,?6,3=?6,9=wf,10=wb,@8,#1,60,60,N,60,##,&10,-3=?6,3:N,{4^60'*11^-60}:*/H
;
%------------------------------------------------------------------------------
CAT:biological;EN:Mitomycine C;MW:334.332;EXA:1
:
-<30,?6,{3,6}=dl,{2,5}:?O,1:/_,-4=?5,-3:N,
- 6:/NH2,,-3=?5,-2=?3,-1=wb,-2=wf,-1:NH,8:/*O!^35,@$9,\,!,O,60,?O!,NH2
+<30,?6,3'6=dl,2'5:?O,1:?,-4=?5,-3:N,
+ 6:/NH2,,-3=?5,-2=?3,-1=wb,-2=wf,-1:NH,8:/*O!^35,@$9,!2,O,60,?O!,NH2
;
%------------------------------------------------------------------------------
CAT:biological;EN:Podophyllotoxin;MW:414.41;EXA:1
:
-<0,?5,{2,5}:O,-3=Ph2,-3=?6,-3=?5,-2:O,-1=wb,-3:?O,
- @10,\*,Ph,{-2,-3,-4}:/O!,13:/*OH,{11^-60,12'^60}:*/H
+<0,?5,2'5:O,-3=Ph2,-3=?6,-3=?5,-2:O,-1=wb,-3:?O,
+ @10,!z,Ph,-2'-3'-4:/O!,13:/*OH,{11^-60'*12^60}:*/H
;
%------------------------------------------------------------------------------
CAT:biological;EN:Warfarin;MW:308.333;EXA:1
:
-<30,Ph,3=?6,8=dl,10:O,7:/OH,9:?O,@8,\,/Ph`1,60,!,?O!
+<30,Ph,3=?6,8=dl,10:O,7:/OH,9:?O,@8,!,/Ph`1,60,!,?O!
;
%------------------------------------------------------------------------------
CAT:biological;EN:Genistein;MW:270.24;EXA:1
:
-<30,Ph,3=?6,9=dl,10:O,{2,6}:/OH,7:?O,8:/Ph+(-3:/OH)
+<30,Ph,3=?6,9=dl,10:O,2'6:/OH,7:?O,8:/Ph'(-3:/OH)
;
%------------------------------------------------------------------------------
CAT:biological;EN:Baicalein;MW:270.24;EXA:1
:
-<30,Ph,3=?6,9=dl,10:O,{1,2,6}:/OH,7:?O,8:/Ph
+<30,Ph,3=?6,9=dl,10:O,1'2'6:/OH,7:?O,8:/Ph
;
%------------------------------------------------------------------------------
CAT:biological;EN:Reserpine;MW:608.688;EXA:1
:
-<54,Ph,3=?5,{-2,-4,-3}=?6,9=dl,11:N,7:NH,{10'^-60,15^-60,16^60}:/*H,
- @20,*\,O!,?O,!Ph,{-2,-3,-4,1,19~zf>rl}:/O!,18:*/?O!+O!>lr
+<54,Ph,3=?5,-2'-4'-3=?6,9=dl,11:N,7:NH,{*10^-60'15^-60'16^60}:/*H,
+ @20,!w,O!,?O,!Ph,{-2'-3'-4'1'19~zf>rl}:/O!,18:*/?O!'O!>lr
;
%------------------------------------------------------------------------------
CAT:biological;EN:Rotenone;MW:394.423;EXA:1
:
-<-60,?5,{-3,-2,-3,-4}=?6,{3',7,9,17',-2,-4}=dl,
- {2,13,16}:O,10:?O,{11^-60,12^60}:*/H,{-2,-3}:/O!,1:*/?!d
+<-60,?5,-3'-2'-3'-4=?6,*3'7'9'*17'-2'-4=dl,
+ 2'13'16:O,10:?O,{11^-60'12^60}:*/H,-2'-3:/O!,1:*/?!d
;
%------------------------------------------------------------------------------
CAT:biological;EN:Pyrethrin I;MW:328.452;EXA:1
:
-<30,?3,{3^35,3'^-35}:*/_,@1,*\,!d,?!,
- @2,\*,?O!,O,-36~zb,|,?5,-2=dl,-1:/_,-3:?O,@-2,\,!4,{-1,-3}=dl
+<30,?3,{3^35'*3^-35}:?w,@1,!w,!d,?!,
+ @2,!z,?O!,O,-36~zb,|,?5,-2=dl,-1:?,-3:?O,@-2,!5,-1'-3=dl
;
%------------------------------------------------------------------------------
CAT:biological;EN:Oseltamivir;MW:312.40;EXA:1
:
-<30,?6,3=dl,6:*/NH2,@1,\*,NH!,?O!,@2,*\,O!,/!,!2,4:/?O!+O!2
+<30,?6,3=dl,6:*/NH2,@1,!z,NH!,?O!,@2,!w,O!,/!,!2,4:/?O!'O!2
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Paclitaxel;MW:853.918;EXA:1
+CAT:biological;EN:Paclitaxel;MW:853.918;EXA:2
:
?6,5=dl,@3,#1,36,45,45,45,45,##,&5,-4=?6,-4=?4,-1=wb,-3=wf,-1:O,
- 4:??,6:/_,{3^-60,15}:*/OH,8:/*H^-60,9:*/_^60,10:?O,
- @1,\,O!,?O!,*/OH,!,/Ph,60~wf,NH,-60,?O,60,Ph,
- @7,\*,O,-45,?O,60,Ph,{11>rl,12'^-15>lr}:*/O!+?O!
+ 4:??,6:?,{3^-60'15}:*/OH,8^-60:/*H,9^60:?w,10:?O,
+ @1,!O!,?O!,*/OH,!,/Ph,60~wf,NH,-60,?O,60,Ph,
+ @7,!z,O,-45,?O,60,Ph,{11>rl'*12^-15>lr}:*/O!'?O!
;
%------------------------------------------------------------------------------
CAT:biological;EN:Mevastatin;MW:390.52;EXA:1
:
-<30,?6,2=dl,4:*/H^60,-4=?6,-4=dl,9:*/_,
- @10,*\,!,60~wb,?6,6:O,-2:?O,-4:/*OH,@5,\*,O,60,?O!,*/_,!2
+<30,?6,2=dl,4^60:*/H,-4=?6,-4=dl,9:?w,
+ @10,!w,!,60~wb,?6,6:O,-2:?O,-4:/*OH,@5,!z,O,60,?O!,?w,!2
;
%------------------------------------------------------------------------------
CAT:biological;EN:Sesamine;MW:354.35;EXA:1
:
-<54,?5,1=?5,{4,7}:O,{1^-54,2^54}:*/H,
- 5^-12:*/Ph+(4=?5)+(7:O)+(9:O),8^-12:*/Ph+(4=?5)+(7:O)+(9:O)
+<54,?5,1=?5,4'7:O,{1^-54'2^54}:*/H,
+ 5^-12:*/Ph'(4=?5)'(7'9:O),8^-12:*/Ph'(4=?5)'(7'9:O)
;
%------------------------------------------------------------------------------
CAT:biological;EN:Morphine;MW:285.343;EXA:1
:
-<30,Ph,{2,-4}=?6,1---12=?5,-1:O,-1=zb,
+<30,Ph,2'-4=?6,1---12=?5,-1:O,-1=zb,
@7,60~wf`0.75,70~si_`1.3,45,N?,&9~wb,15=dl,6:/OH,8^180:*/H,12:/*OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Quinine;MW:324.424;EXA:1
:
<30,Ph,3=Ph,7:N,6:/O!,
- @10,\,*/OH,/*H^-60,!,|,?6,2:N,1:*/H^60,@4,*\,!d,@2,165~zf,60,&5~zb
+ @10,!,*/OH,/*H^-60,!,|,?6,2:N,1^60:*/H,4:*/!d,@2,165~zf,60,&5~zb
;
%------------------------------------------------------------------------------
CAT:biological;EN:Atoropin;MW:289.375;EXA:1
:
-<30,O!,?O!2,Ph,@$1,\~zb^-60,|,?7`1.1,@6,*\^190`1.25,N?,&3~wb,$3:/!OH~wv
+<30,O!,?O!2,Ph,@1,-60~zb,?7`1.1,@-2,190~wf`1.25,N?,&-5~wb,$3:/!OH~wv
;
%------------------------------------------------------------------------------
CAT:biological;EN:Colchicine;MW:399.443;EXA:1
:
-<30,Ph,{1,2,6}:/O!,{-4,-5}=?7,{-1,-4,-6}=dl,-2:?O,-3:/O!,9:/NH!+?O!
+<30,Ph,1'2'6:/O!,-4'-5=?7,-1'-4'-6=dl,-2:?O,-3:/O!,9:/NH!'?O!
;
%------------------------------------------------------------------------------
CAT:biological;EN:Lycorine;MW:287.315;EXA:1
:
-<30,Ph,{-4,-2}=?6,{6,9--12}=?5,13=dl,8:N,{15,17}:O,
- {9'^180,10^60}:*/H,{13,14'}:*/OH
+<30,Ph,-4'-2=?6,6'(9--12)=?5,13=dl,8:N,15'17:O,{*9^180'10^60}:*/H,13'*14:*/OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Ibotenic acid;MW:158.113;EXA:1
:
-<18,?5,4=dl,3:O,2:NH,1:?O,4:/?NH2+!COOH^-24
+<18,?5,4=dl,3:O,2:NH,1:?O,4^-24:/?NH2'!COOH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Illudin S;MW:264.3;EXA:1
:
-<30,?6,3=?5,6:**?3,{4,7}=dl,2:?O,5:/_,
- {1^35,8^35}:*/_,{1'^-35,9}:*/OH,8:/*!OH^-35
+<30,?6,3=?5,@6,?3,4'7=dl,2:?O,5:?,1'8:?w^35,{*1^-35'9}:*/OH,8^-35:/*!OH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Muscarine;MW:174.26;EXA:1
:
-<18,?5,2:O,1:*/_,5:/*OH,@3,*\,48,N,??,p_^180,!
+<18,?5,2:O,1:?w,5:/*OH,@3,!w,48,N,??,p_^180,!
;
%------------------------------------------------------------------------------
CAT:biological;EN:Psilocybin;MW:284.248;EXA:1
:
-<30,Ph,3=?5,8=dl,9:NH,@2,\,O,-60,P,?O^-45,/OH^45,90,OH,7:/!2+N?!>lr
+<30,Ph,3=?5,8=dl,9:NH,@2,!O,-60,P,?O^-45,/OH^45,90,OH,7:/!2'N?!>lr
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Tetrodotoxine;MW:319.27;EXA:1
+CAT:marine toxine;EN:Tetrodotoxine;MW:319.27;EXA:2
:
#1,<60,-90,60,-30`1.15,150,60,&1,@3,-135,60,-30`1.15,150,&4,
- @10,\,O,60`1.33,60,&$3~si_,@8,-15~si_,O,&12,##,
- @9,45,-60,OH,1^120://NH,{5~zf^-15,7,9^-75,12,13~zf}:/OH,2:NH,6^180:NH
+ @10,!O,60`1.33,60,&$3~si_,@8,-15~si_,O,&12,##,
+ @9,45,-60,OH,1^120:?NH,{5~zf^-15'7'9^-75'12'13~zf}:/OH,2:NH,6^180:NH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Aflatoxin B1;MW:312.27;EXA:1
+CAT:mycotoxin;EN:Aflatoxin B1;MW:312.27;EXA:1
:
-<30,Ph,6=?6,-2=?5,4=?5,-2=?5,{-2,10}=dl,{7,14,17}:O,
- 2:/O!,{8,11}:?O,{15^-54,16^54}:*/H
+<30,Ph,6=?6,-2'4'-2=?5,-2'10=dl,7'14'17:O,2:/O!,8'11:?O,{15^-54'16^54}:*/H
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Aflatoxin B2;MW:314.3;EXA:-
+CAT:mycotoxin;EN:Aflatoxin B2;MW:314.3;EXA:1
:
-<30,Ph,6=?6,-2=?5,4=?5,-2=?5,10=dl,{7,14,17}:O,
- 2:/O!,{8,11}:?O,{15^-54,16^54}:*/H
+<30,Ph,6=?6,-2'4'-2=?5,10=dl,7'14'17:O,2:/O!,8'11:?O,{15^-54'16^54}:*/H
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Aflatoxin G1;MW:328.27;EXA:2
+CAT:mycotoxin;EN:Aflatoxin G1;MW:328.27;EXA:1
:
-<30,Ph,6=?6,-2=?6,4=?5,-2=?5,{-2,10}=dl,{7,12,15,18}:O,
- 2:/O!,{8,11}:?O,{16^-54,17^54}:*/H
+<30,Ph,6'-2=?6,4'-2=?5,-2'10=dl,7'12'15'18:O,2:/O!,8'11:?O,{16^-54'17^54}:*/H
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Aflatoxin G2;MW:330.29;EXA:-
+CAT:mycotoxin;EN:Aflatoxin G2;MW:330.29;EXA:1
:
-<30,Ph,6=?6,-2=?6,4=?5,-2=?5,10=dl,{7,12,15,18}:O,
- 2:/O!,{8,11}:?O,{16^-54,17^54}:*/H
+<30,Ph,6'-2=?6,4'-2=?5,10=dl,7'12'15'18:O,2:/O!,8'11:?O,{16^-54'17^54}:*/H
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Aflatoxin M1;MW:328.3;EXA:-
+CAT:mycotoxin;EN:Aflatoxin M1;MW:328.3;EXA:1
:
-<30,Ph,6=?6,-2=?5,4=?5,-2=?5,{-2,10}=dl,{7,14,17}:O,
- 2:/O!,{8,11}:?O,15^-54:*/H,16^54:*/OH
+<30,Ph,6=?6,-2'4'-2=?5,-2'10=dl,7'14'17:O,2:/O!,8'11:?O,15^-54:*/H,16^54:*/OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Aflatoxin M2;MW:330.29;EXA:-
+CAT:mycotoxin;EN:Aflatoxin M2;MW:330.29;EXA:-
:
-<30,Ph,6=?6,-2=?5,4=?5,-2=?5,10=dl,{7,14,17}:O,
- 2:/O!,{8,11}:?O,15^-54:*/H,16^54:*/OH
+<30,Ph,6=?6,-2'4'-2=?5,10=dl,7'14'17:O,2:/O!,8'11:?O,15^-54:*/H,16^54:*/OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Ochratoxin A;MW:403.813;EXA:1
+CAT:mycotoxin;EN:Ochratoxin A;MW:403.813;EXA:1
:
-<30,Ph,@4,\,!,/*COOH,!`1.2,NH,!`1.2,?O!,
- Ph,-2:/Cl,-5:/OH,-4=?6,-3:O,-2:*/_,-4:?O
+<30,Ph,@4,!2,/*COOH,!`1.2,NH,!`1.2,?O!,Ph,-2:/Cl,-5:/OH,-4=?6,-3:O,-2:?w,-4:?O
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Deoxynivalenol;MW:296.32;EXA:1
+CAT:mycotoxin;EN:Deoxynivalenol;MW:296.32;EXA:1
:
-<30,?6,3=?6,5=dl,1:?O,6:/_,-1:O,{4'^60,-2}:*/H,7^30:*/_,@7,72`.9,80`1.3,&9,
- @8,?3,-3=wf_,-1=si_,-1:O,{2,12^18}:/*OH,3:/*!OH^-60`1
+<30,?6,3=?6,5=dl,1:?O,6:?,-1:O,{*4^60'-2}:*/H,7^30:?w,@7,72`.9,80`1.3,&9,
+ @8,?3,-3=wf_,-1=si_,-1:O,{2'12^18}:/*OH,3^-60`1:/*!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Patulin;MW:154.12;EXA:1
+CAT:mycotoxin;EN:Patulin;MW:154.12;EXA:1
:
-<30,?6,3=?5,{2,10}=dl,{6,7}:O,5:/OH,8:?O
+<30,?6,3=?5,2'10=dl,6'7:O,5:/OH,8:?O
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Citrinin;MW:250.247;EXA:1
+CAT:mycotoxin;EN:Citrinin;MW:250.247;EXA:1
:
-<30,?6,3=?6,{2,5,11}=dl,9:O,1:?O,2:/_,{7,8'}:*/_,5:/OH,6:/COOH
+<30,?6,3=?6,2'5'11=dl,9:O,1:?O,2:?,7'*8:?w,5:/OH,6:/COOH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Zearalenone;MW:318.364;EXA:1
+CAT:mycotoxin;EN:Zearalenone;MW:318.364;EXA:1
:
-<30,Ph,@3,#1,\,!5,60,60,!4,&4,##,{1,5,8}=dl,17:O,16:*/_,{1,5}:/OH,{12,18}:?O
+<30,Ph,@3,#1,!6,60,60,!4,&4,##,1'5'8=dl,17:O,16:?w,1'5:/OH,12'18:?O
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Fumonisin B1;MW:721.83;EXA:1
+CAT:mycotoxin;EN:Fumonisin B1;MW:721.83;EXA:1
:
-<30,!19,@6,*\,O!,?O!2,/COOH,!2,COOH,@7,\*`1.2,O!,?O!2,/COOH,!2,COOH,
- {5,9}:/*_,{11,16,18'}:*/OH,19:/*NH2
+<30,!19,@6,!w,O!,?O!2,/COOH,!2,COOH,@7,!z`1.2,O!,?O!2,/COOH,!2,COOH,
+ 5'9:?z,11'16'*18:*/OH,19:/*NH2
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Dicumarol;MW:336.295;EXA:-
+CAT:mycotoxin;EN:Puberulic acid;MW:198.13;EXA:1
:
-<30,Ph,3=?6,@8,\`1.5,!`1.5,?6,-4=Ph2,{8,14}=db,{10,16}:O,{9,17}:?O,{7,13}:/OH
+<38.5,?7,2'4'7=db,3:/COOH,1'5'7:/OH,6:?O
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Dihydroxybergamotin;MW:338.40;EXA:-
+CAT:biological;EN:Dicumarol;MW:336.295;EXA:1
:
-<30,Ph,3=?6,6=?5,{10,13}=db,{7,13}:O,8:?O,@5,\,O,!2,!d,/_,!3,/OH,!,??,!OH
+<30,Ph,3=?6,@8,!`1.5,!`1.5,?6,-4=Ph2,8'14=db,10'16:O,9'17:?O,7'13:/OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Bergamotin;MW:338.40;EXA:-
+CAT:biological;EN:Dihydroxybergamotin;MW:338.40;EXA:1
:
-<30,Ph,3=?6,6=?5,{10,13}=db,{7,13}:O,8:?O,@5,\,O,!2,!d,/_,!3,!d,?!
+<30,Ph,3=?6,6=?5,10'13=db,7'13:O,8:?O,@5,!O,!2,!d,?,!3,/OH,!??,!OH
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Alkannin;MW:288.29;EXA:-
+CAT:biological;EN:Bergamotin;MW:338.40;EXA:1
:
-<30,Ph,3=?6,9=db,{2,5}:/OH,{7,10}:?O,@8,\,/*OH,!2,!d,?!
+<30,Ph,3=?6,6=?5,10'13=db,7'13:O,8:?O,@5,!O,!2,!d,?,!3,!d,?!
+;
+%------------------------------------------------------------------------------
+CAT:biological;EN:Alkannin;MW:288.29;EXA:1
+:
+<30,Ph,3=?6,9=db,2'5:/OH,7'10:?O,@8,!,/*OH,!2,!d,?!
;
%==============================================================================
-CAT:synthetic;EN:Benzene;MW:78.11;EXA:-
+CAT:synthetic;EN:Benzene;MW:78.11;EXA:1
:
<30,Ph
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Phenol;MW:94.11;EXA:-
+CAT:synthetic;EN:Phenol;MW:94.11;EXA:1
:
<30,Ph,3:/OH
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Aniline;MW:93.13;EXA:-
+CAT:synthetic;EN:Aniline;MW:93.13;EXA:1
:
<30,Ph,3:/NH2
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Picric acid;MW:229.10;EXA:-
+CAT:synthetic;EN:Picric acid;MW:229.10;EXA:1
:
-<30,Ph,{1,3,5}:/NO2,2:/OH
+<30,Ph,1'3'5:/NO2,2:/OH
;
%------------------------------------------------------------------------------
CAT:synthetic;EN:Hexaphenylbenzene;MW:534.6876;EXA:1
:
-<30,Ph,{1,2,3,4,5,6}:/Ph
+<30,Ph,1'2'3'4'5'6:/Ph
;
%==============================================================================
-CAT:synthetic;EN:Naphthalene;MW:128.17;EXA:1
+CAT:aromatic;EN:Naphthalene;MW:128.17;EXA:1
:
<30,Ph,3=Ph
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Anthracene;MW:178.23;EXA:1
+CAT:aromatic;EN:Anthracene;MW:178.23;EXA:1
:
-<30,Ph,{3,6}=Ph
+<30,Ph,3'6=Ph
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Phenanthrene;MW:178.23;EXA:1
+CAT:aromatic;EN:Phenanthrene;MW:178.23;EXA:1
:
-<30,Ph,{4,6}=Ph
+<30,Ph,4'6=Ph
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Naphthacene;MW:228.3;EXA:1
+CAT:aromatic;EN:Naphthacene;MW:228.3;EXA:1
:
-<30,Ph,{6,3,-3}=Ph
+<30,Ph,6'3'-3=Ph
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Chrysene;MW:228.3;EXA:1
+CAT:aromatic;EN:Chrysene;MW:228.3;EXA:1
:
-<30,Ph2,{6,4,-4}=Ph
+<30,Ph2,6'4'-4=Ph
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Pyrene;MW:202.25;EXA:1
+CAT:aromatic;EN:Pyrene;MW:202.25;EXA:1
:
-<30,Ph2,{6,4}=Ph,16---7=?6,-2=dl
+<30,Ph2,6'4=Ph,16---7=?6,-2=dl
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Coronene;MW:300.35;EXA:1
+CAT:aromatic;EN:Coronene;MW:300.35;EXA:1
:
-<30,Ph,{1,11--2,15--3,19--4,23--5,27---7}=?6,{9,12,14,17,20,22,25,28,30}=dl
+<30,Ph,{1'11--2'15--3'19--4'23--5'27---7}=?6,9'12'14'17'20'22'25'28'30=dl
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Kekulene;MW:600.7;EXA:1
+CAT:aromatic;EN:Kekulene;MW:600.7;EXA:1
:
-<30,?6,{3,-3,-2,-3,-2,-3,-2,-3,-2,-3,-2----5,5---- -4}=?6,
- {1,5',7,9,11,13,17,19,21,23,27,29,31,33,37,39,41,43,47,49,51,53,57,60}=dl
+<30,?6,3'-3'-2'-3'-2'-3'-2'-3'-2'-3'(-2----5)'(5---- -4)=?6,
+ 1'*5'7'9'11'13'17'19'21'23'27'29'31'33'37'39'41'43'47'49'51'53'57'60=dl
;
%==============================================================================
-CAT:synthetic;EN:12-Crown-4;MW:176.21;EXA:-
+CAT:synthetic;EN:12-Crown-4;MW:176.21;EXA:1
:
<-180,O,30,60,60,O,-30,60,60,O,-30,60,60,O,-30,60,&1
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:15-Crown-5;MW:220.26;EXA:2
+CAT:synthetic;EN:15-Crown-5;MW:220.26;EXA:1
:
<-180,O,48,60,60,O,-48,60,60,O,-48,60,60,O,-48,60,60,O,-48,60,&1
;
@@ -1021,727 +1020,789 @@ CAT:synthetic;EN:18-Crown-6;MW:264.32;EXA:1
%==============================================================================
CAT:synthetic;EN:Porphyrin;MW:310.4;EXA:1
:
-<9,#1,?5,@3,\,54,?5,@-2,\,54,?5,@-2,\,54,?5,@-2,\,&5,##,
- {1,4,6,8,10,14,16,18,21,23,27}=dl,{4,17}:N,{11,23}:NH
+<9,#1,?5,@3,!,54,?5,@-2,!,54,?5,@-2,!,54,?5,@-2,!,&5,##,
+ 1'4'6'8'10'14'16'18'21'23'27=dl,4'17:N,11'23:NH
;
%------------------------------------------------------------------------------
CAT:synthetic;EN:Sulflower;MW:448.69;EXA:1
:
-<67.5,?8,{1,3,5,7}=?5,@11,30`1.15,&12,@14,30`1.15,&15,
- @17,30`1.15,&18,@20,30`1.15,&9,{9,12,13,16,17,20,21,24}=dl,
- {10,13,16,19,21,22,23,24}:S
+<67.5,?8,1'3'5'7=?5,@11,30`1.15,&12,@14,30`1.15,&15,
+ @17,30`1.15,&18,@20,30`1.15,&9,9'12'13'16'17'20'21'24=dl,
+ 10'13'16'19'21'22'23'24:S
;
%------------------------------------------------------------------------------
CAT:synthetic;EN:Arsphenamine x5;MW:915.2;EXA:1
:
-<18,?5,{1,2,3,4,5}:As,{1,2,3,4,5}:/Ph+(3:/NH2)+(4:/OH)
+<18,?5,1'2'3'4'5:As,1'2'3'4'5:/Ph'(3:/NH2)'(4:/OH)
;
%------------------------------------------------------------------------------
CAT:synthetic;EN:Melamine;MW:126.12;EXA:1
:
-<30,Ph,{2,4,6}:N,{1,3,5}:/NH2
+<30,Ph,2'4'6:N,1'3'5:/NH2
;
%==============================================================================
-CAT:synthetic;EN:Tartrazine;MW:534.3;EXA:1
+CAT:pigment;EN:Tartrazine;MW:534.3;EXA:1
:
-<30,Ph,1:/SO3Na,@4,\,N,!d,N,!,<-12,?5,{-2,-5}=dl,{-2,-3}:N,-1:/COONa,-4:/OH,
- -3:/Ph+(4:/SO3Na)
+<30,Ph,1:/SO3Na,@4,!N,!d,N!,<-12,?5,-2'-5=dl,-2'-3:N,-1:/COONa,-4:/OH,
+ -3:/Ph'(4:/SO3Na)
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Disperse yellow 3;MW:269.30;EXA:1
+CAT:pigment;EN:Disperse yellow 3;MW:269.30;EXA:1
:
-<30,Ph,2:/_,5:/OH,@4,\,N,!d,N,!Ph,-3:/NH!+?O!
+<30,Ph,2:?,5:/OH,@4,!N,!d,N,!Ph,-3:/NH!'?O!
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Disperse orenge 30;MW:450.27;EXA:1
+CAT:pigment;EN:Disperse orenge 30;MW:450.27;EXA:1
:
-<30,Ph,1:/NO2,{3,5}:/Cl,@4,\,N,!d,N,!Ph,@-3,\,N,/!2+CN,!2,O!,?O,!O!
+<30,Ph,1:/NO2,3'5:/Cl,@4,!N,!d,N,!Ph,@-3,!N,/!2'CN,!3,?O,!O!
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Disperse red 65;MW:371.82;EXA:1
+CAT:pigment;EN:Disperse red 65;MW:371.82;EXA:1
:
-<30,Ph,1:/NO2,3:/Cl,@4,\,N,!d,N,!Ph,-1:/_,@-3,\,N,/!2+CN,!2
+<30,Ph,1:/NO2,3:/Cl,@4,!N,!d,N,!Ph,-1:?,@-3,!N,/!2'CN,!2
;
%------------------------------------------------------------------------------
CAT:synthetic;EN:Erythrosine;MW:835.9;EXA:1
:
-<30,Ph,{3,9}=?6,{8,13,16}=dl,10:O,-2:?O,{1,5,12,14}:/I,@7,\,Ph,-1:/COOH,6:/OH
+<30,Ph,3'9=?6,8'13'16=dl,10:O,-2:?O,1'5'12'14:/I,@7,!Ph,-1:/COOH,6:/OH
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Sudan red 1;MW:248.28;EXA:1
+CAT:pigment;EN:Sudan red 1;MW:248.28;EXA:1
:
-<30,Ph,1=Ph,4:/OH,@3,\,N,!d,N,!Ph
+<30,Ph,1=Ph,4:/OH,@3,!N,!d,N,!Ph
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Basic blue 1;MW:319.86;EXA:1
+CAT:pigment;EN:Basic blue 1;MW:319.86;EXA:1
:
-<30,Ph,3=Ph,6=Ph,2:S,5:N,{8,13}:/N?!,2:p_,@2,@(3.5,1.5),Cl,n_^15
+<30,Ph,3=Ph,6=Ph,2:S,5:N,8'13:/N?!,2:p_,@2,@(3.5'1.5),Cl,n_^15
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Disperse red 11;MW:268.274;EXA:1
+CAT:pigment;EN:Disperse red 11;MW:268.274;EXA:1
:
-<30,Ph,3=?6,-3=dr,9=Ph,{7,10}:?O,{-1,-4}:/NH2,-2:/O!
+<30,Ph,3=?6,-3=dr,9=Ph,7'10:?O,-1'-4:/NH2,-2:/O!
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Disperse red 60;MW:331.326;EXA:1
+CAT:pigment;EN:Disperse red 60;MW:331.326;EXA:1
:
-<30,Ph,3=?6,-3=dr,9=Ph,{7,10}:?O,{-1,-4}:/NH2,-2:/O!+Ph
+<30,Ph,3=?6,-3=dr,9=Ph,7'10:?O,-1'-4:/NH2,-2:/O!'Ph
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Disperse violet 26;MW:422.438;EXA:1
+CAT:pigment;EN:Disperse violet 26;MW:422.438;EXA:1
:
-<30,Ph,3=?6,-3=dr,9=Ph,{7,10}:?O,{-1,-4}:/NH2,{-2>-30,-3>30}:/O!+Ph
+<30,Ph,3=?6,-3=dr,9=Ph,7'10:?O,-1'-4:/NH2,{-2>-30'-3>30}:/O!'Ph
;
%------------------------------------------------------------------------------
-CAT:synthetic;EN:Vat blue 1;MW:262.27;EXA:1
+CAT:pigment;EN:Vat blue 1;MW:262.27;EXA:1
:
-<30,Ph,3=?5,@8,\\,?5,-3=dr,-3=Ph,{7,14}:NH,{9,11}:?O
+<30,Ph,3=?5,@8,!d,?5,-3=dr,-3=Ph,7'14:NH,9'11:?O
+;
+%------------------------------------------------------------------------------
+CAT:pfas;EN:PFOA;MW:414.07;EXA:1
+:
+0,0,0,0,0,0,0,?O,-60,OH,{1^-90'1:7}:/F,{1:7}:/F^180
+;
+%------------------------------------------------------------------------------
+CAT:pfas;EN:PFOS;MW:500.13;EXA:1
+:
+0,0,0,0,0,0,0,0,S,?O,?O^-180,-.1,OH,{1^-90,1:8}:/F,{1:8}:/F^180
+;
+%------------------------------------------------------------------------------
+CAT:pfas;EN:PFHxS;MW:400.12;EXA:1
+:
+0,0,0,0,0,0,S,?O,?O^-180,-.1,OH,{1^-90'1:6}:/F,{1:6}:/F^180
+;
+%------------------------------------------------------------------------------
+CAT:pfas;EN:GenX;MW:330.05;EXA:1
+:
+0,0,0,O,0,0`1,?O,-60,OH,{1^-90,1:3}:/F,{1:3'5}:/F^180,5:/?F?F!F
+;
+%------------------------------------------------------------------------------
+CAT:pfas;EN:FOSA;MW:499.15;EXA:1
+:
+0,0,0,0,0,0,0,0,S,?O,?O^-180,-.1,NH2,{1^-90'1:8}:/F,{1:8}:/F^180
+;
+%------------------------------------------------------------------------------
+CAT:pfas;EN:8,2-FTOH;MW:464.12;EXA:1
+:
+0,0,0,0,0,0,0,0,-60,60,OH,{1^-90'1:8}:/F,{1:8}:/F^180
+;
+%------------------------------------------------------------------------------
+CAT:pfas;EN:6,2-FTS;MW:428.16;EXA:1
+:
+0,0,0,0,0,0,-60,60,S,?O,?O^-180,-.1,OH,{1^-90'1:6}:/F,{1:6}:/F^180
+;
+%------------------------------------------------------------------------------
+CAT:pfas;EN:PFOPA;MW:500.13;EXA:1
+:
+0,0,0,0,0,0,0,0,P,?O,/OH^-179.8,-.1,OH,{1^-90'1:8}:/F,{1:8}:/F^180
+;
+%------------------------------------------------------------------------------
+CAT:pfas;EN:6,6-FPi;MW:702.06;EXA:1
+:
+0,0,0,0,0,0,P,0,0,0,0,0,0,7^180:?O,7`1.5:/OH,
+ {1^-90,1:6'8:13,13^90,13^-90}:/F,{1:6'8:12}:/F^180
+;
+%------------------------------------------------------------------------------
+CAT:pfas;EN:9Cl-PF3ONS;MW:532.58;EXA:1
+:
+0,0,0,0,0,0,O,0,0,0,S,?O,?O^-180,-.1,OH,
+ {1:6'8'9}:/F,{1:6'8'9}:/F^180,1^-90:/Cl
;
%==============================================================================
CAT:antibiotics;EN:Amoxicillin;MW:365.4042;EXA:1
:
-<45,?4,-3=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH^-18,6:??,
- @4,*\^15,NH!,?O!,*/NH2,!Ph,-3:/OH
+<45,?4,2=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH,6:??,
+ @4,15~wf,NH!,?O!,*/NH2,!Ph,-3:/OH
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Ampicillin;MW:349.405;EXA:1
:
-<45,?4,-3=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH^-18,6:??,
- @4,*\^15,NH!,?O!,/*NH2,!Ph
+<45,?4,2=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH,6:??,@4,15~wf,NH!,?O!,/*NH2,!Ph
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Penicillin G;MW:334.4;EXA:1
:
-<45,?4,-3=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH^-18,6:??,
- @4,*\^15,NH!,?O!2,Ph
+<45,?4,2=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH,6:??,@4,15~wf,NH!,?O!2,Ph
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Penicillin V;MW:350.3895;EXA:1
:
-<45,?4,-3=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH^-18,6:??,
- @4,*\^15,NH!,?O!2,O,!Ph
+<45,?4,2=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH,6:??,@4,15~wf,NH!,?O!2,O,!Ph
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Mecillinam;MW:325.4264;EXA:1
:
-<45,?4,-3=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH^-18,6:??,
- @4,*\^15,N,!d,!,?7,-7:N
+<45,?4,2=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH,6:??,@4,15~wf,N,!d,!,?7,-7:N
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Nafcillin;MW:414.4748;EXA:1
:
-<45,?4,-3=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH^-18,6:??,
- @4,*\^15,NH!,?O,!Ph,-2=Ph,-9:/O!2
+<45,?4,2=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH,6:??,
+ @4,15~wf,NH!,?O,!Ph,-2=Ph,-9:/O!2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Oxacillin;MW:401.4363;EXA:1
:
-<45,?4,-3=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH^-18,6:??,
- @4,*\^15,NH!,?O!,<-24,?5,{-2,-5}=dl,-2:N,-3:O,-4:/_,@-1,-24,Ph
+<45,?4,2=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH,6:??,
+ @4,15~wf,NH!,?O!,<-24,?5,-2'-5=dl,-2:N,-3:O,-4:?,@-1,-24,Ph
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Cloxacillin;MW:435.8813;EXA:1
:
-<45,?4,-3=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH^-18,6:??,
- @4,*\^15,NH!,?O!,<-24,?5,{-2,-5}=dl,-2:N,-3:O,-4:/_,@-1,-24,Ph,-5:/Cl
+<45,?4,2=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH,6:??,
+ @4,15~wf,NH!,?O!,<-24,?5,-2'-5=dl,-2:N,-3:O,-4:?,@-1,-24,Ph,-5:/Cl
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Dicloxacillin;MW:470.3264;EXA:1
:
-<45,?4,-3=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH^-18,6:??,
- @4,*\^15,NH!,?O!,<-24,?5,{-2,-5}=dl,-2:N,-3:O,-4:/_,-1:/Ph+({2,6}:/Cl)^-24
+<45,?4,2=?5,2:N,7:S,3^45:/*H,1:?O^15,5:/*COOH,6:??,
+ @4,15~wf,NH!,?O!,<-24,?5,-2'-5=dl,-2:N,-3:O,-4:?,-1^-24:/Ph'(2'6:/Cl)
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Cefalexin;MW:347.3889;EXA:1
:
-<45,?4,-3=?6,-4=dl,2:N,8:S,3^45:/*H,1:?O^15,5:/*COOH,6:/_,
- @4,*\^15,NH!,?O!,*/NH2,!Ph
+<45,?4,2=?6,6=db,2:N,8:S,3^45:/*H,1:?O^15,5:/*COOH,6:?,
+ @4,15~wf,NH!,?O!,*/NH2,!Ph
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Cefalonium;MW:458.5107;EXA:1
:
-<45,?4,-3=?6,-4=dl,2:N,8:S,3^45:/*H,1:?O^15,@5,\*,?O!,O,n_^40,
- @4,*\^15,NH!,?O!2,?5,{-1,-3}=dl,-4:S,
- @6,\,!,|,Ph,1:N,1:p_^180,4:/?O!+NH2
+<45,?4,2=?6,6=db,2:N,8:S,3^45:/*H,1:?O^15,@5,!z,?O!,O,n_^40,
+ @4,15~wf,NH!,?O!2,?5,-1'-3=dl,-4:S,@6,!2,|,Ph,1:N,1:p_^180,4:/?O!'NH2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Cefazorin;MW:454.51;EXA:1
:
-<45,?4,-3=?6,-4=dl,2:N,8:S,3^45:/*H,1:?O^15,5:/*COOH,
- @4,*\^15,NH!,?O!2,?5,{-2,-4}=dl,{-1,-2,-3,-5}:N,
- @6,\,!,S,!,?5,{-3,-5}=dl,-1:S,-2:/_,{-3,-4}:N
+<45,?4,2=?6,6=db,2:N,8:S,3^45:/*H,1^15:?O,5:/*COOH,
+ @4,15~wf,NH!,?O!2,?5,-2'-4=dl,-1'-2'-3'-5:N,
+ @6,!2,S,!,?5,-3'-5=dl,-1:S,-2:?,-3'-4:N
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Cefoperazone;MW:645.67;EXA:1
+CAT:antibiotics;EN:Cefoperazone;MW:645.67;EXA:2
:
-<45,?4,-3=?6,-4=dl,2:N,8:S,3^45:/*H,1:?O^15,5:/*COOH,
- @4,*\^15,NH!,?O!,/*Ph+(4:/OH),!NH!,?O!,?6,{-3,-6}:N,{-4,-5}:?O,-3:/!,
- @6,\,!,S,!,?5,{-3,-5}=dl,-1:/_,{-1,-2,-3,-4}:N,
+<45,?4,2=?6,6=db,2:N,8:S,3^45:/*H,1:?O^15,5:/*COOH,
+ @4,15~wf,NH!,?O!,/*Ph'(4:/OH),!NH!,?O!,?6,-3'-6:N,-4'-5:?O,-3:/!,
+ @6,!2,S,!,?5,-3'-5=dl,-1:?,-1'-2'-3'-4:N,
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Cefquinome;MW:528.6;EXA:1
:
-<45,?4,-3=?6,-4=dl,2:N,8:S,3^45:/*H,1:?O^15,@5,\*,?O!,O,n_^40,
- @4,*\^15,NH!,?O!,//N!+O!,!,?5,{-2,-5}=dl,-3:S,-1:N,-2:/NH2,
- @6,\,!Ph,-2=?6,-10:N,-10:p_^180
+<45,?4,2=?6,6=db,2:N,8:S,3^45:/*H,1:?O^15,@5,!z,?O!,O,n_^40,
+ @4,15~wf,NH!,?O!,//N!'O!,!,?5,-2'-5=dl,-3:S,-1:N,-2:/NH2,
+ @6,!2,Ph,-2=?6,-10:N,-10:p_^180
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Ceftiofur;MW:523.5626;EXA:1
:
-<45,?4,-3=?6,-4=dl,2:N,8:S,3^45:/*H,1:?O^15,5:/*COOH,
- @4,*\^15,NH!,?O!,//N!+O!,!,?5,{-2,-5}=dl,-3:S,-1:N,-2:/NH2,
- @6,\,!,S,!,?O!,?5,{-1,-3}=dl,-4:O
+<45,?4,2=?6,6=db,2:N,8:S,3^45:/*H,1:?O^15,5:/*COOH,
+ @4,15~wf,NH!,?O!,//N!'O!,!,?5,-2'-5=dl,-3:S,-1:N,-2:/NH2,
+ @6,!2,S,!?O!,?5,-1'-3=dl,-4:O
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Cefuroxime;MW:424.3852;EXA:1
:
-<45,?4,-3=?6,-4=dl,2:N,8:S,3^45:/*H,1:?O^15,5:/*COOH,
- @4,*\^15,NH!,?O!,//N!+O!,!,?5,{-1,-3}=dl,-4:O,@6,\,!O!,?O!,NH2
+<45,?4,2=?6,6=db,2:N,8:S,3^45:/*H,1:?O^15,5:/*COOH,
+ @4,15~wf,NH!,?O!,//N!'O!,!,?5,-1'-3=dl,-4:O,@6,!2,O!,?O!,NH2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Apramycin;MW:539.58;EXA:1
:
-<30,?6,3=?6,{2,10}:O,@1,\*,O,60~zb,?6,@9,\*,O,-60~zb,?6,-5:O,
- {7,13,14',-1',-2}:*/OH,{6',15,17,-3'}:*/NH2,8:*/NH!^-20,
- -4:*/!OH,{3'^-60,4^60}:*/H
+<30,?6,3=?6,2'10:O,@1,!z,O,60~zb,?6,@9,!z,O,-60~zb,?6,-5:O,
+ 7'13'*14'*-1'-2:*/OH,*6'15'17'*-3:*/NH2,8:*/NH!^-20,-4:*/!OH,{*3^-60,4^60}:*/H
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Gentamycin;MW:477.596;EXA:1
:
-<-30,?6,@1,\*,O,0~zb,?6,-5:O,@5,\*,O,0~zb,?6,-5:O,{2,4,20'}:*/NH2,6:*/OH,
- 11:*/OH^-35,11:/*_^35,12:*/NH!,13:/*OH,17:*/?!+NH!
+<-30,?6,@1,!z,O,0~zb,?6,-5:O,@5,!z,O,0~zb,?6,-5:O,2'4'*20:*/NH2,6:*/OH,
+ 11:*/OH^-35,11:?z^35,12:*/NH!,13:/*OH,17:*/?!'NH!
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Kanamycin;MW:484.499;EXA:1
:
-<-30,?6,@1,\*,O,0~zb,?6,-5:O,@5,\,O,0,?6,-5:O,
- {2,4,12}:*/NH2,{6',11,13,18,19',20}:/*OH,10:*/!OH,17:*/!NH2
+<-30,?6,@1,!z,O,0~zb,?6,-5:O,@5,!O,0,?6,-5:O,
+ 2'4'12:*/NH2,*6'11'13'18'*19'20:/*OH,10:*/!OH,17:*/!NH2
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Neomycin;MW:614.644;EXA:1
+CAT:antibiotics;EN:Neomycin;MW:614.644;EXA:2
:
-<30,?6,3:O,2:/*!NH2,{1,6'}:*/OH,5:*/NH2,
- @4,*\,O,!wb,?6,{-3,-5^15}:/*NH2,-2:*/OH^-15,
- @-1,\*,O,-72~wb,?5,-4:O,-1:/*OH>vt,-3:*/!OH>vt,
- @-2,\*^-24,O,-60~zb,?6,-5:O,-1:/*NH2,{-2,-3'}:*/OH,-4:/*!NH2>60
+<30,?6,3:O,2:/*!NH2,1'*6:*/OH,5:*/NH2,
+ @4,!w,O,!wb,?6,{-3,-5^15}:/*NH2,-2:*/OH^-15,
+ @-1,!z,O,-72~wb,?5,-4:O,-1:/*OH>vt,-3:*/!OH>vt,
+ @-2,-24~zf,O,-60~zb,?6,-5:O,-1:/*NH2,-2'*-3:*/OH,-4:/*!NH2>60
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Streptmycin;MW:581.574;EXA:1
+CAT:antibiotics;EN:Streptmycin;MW:581.574;EXA:2
:
-<54,?5,3:O,4:/*_,5:/OH^45,@1,\*,O,-24~wb,?6,-5:O,@2,*\,O,24~zb,?6,
- 5:/!dO^-48,{10,11',15,16',18'}:*/OH,9:/*!OH,12:*/NH!,
- {17^-18,19}:*/NH!+?NH+!NH2
+<54,?5,3:O,4:?z,5:/OH^45,@1,!z,O,-24~wb,?6,-5:O,@2,!w,O,24~zb,?6,
+ 5:/!dO^-48,10'*11'15'*16'*18:*/OH,9:/*!OH,12:*/NH!,{17^-18'19}:*/NH!'?NH'!NH2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Streptmycin-H2O;MW:599.574;EXA:-
:
-<54,?5,3:O,4:/*_,5:/OH^60,@1,\*,O,-24~wb,?6,-5:O,@2,*\,O,24~zb,?6,
- @5,-18,/OH^15,45,OH,{10,11',15,16',18'}:*/OH,9:/*!OH,12:*/NH!,
- {17^-18,19}:*/NH!+?NH+!NH2
+<54,?5,3:O,4:?z,5:/OH^60,@1,!z,O,-24~wb,?6,-5:O,@2,!w,O,24~zb,?6,
+ @5,-18,/OH^15,45,OH,10'*11'15'*16'*18:*/OH,9:/*!OH,12:*/NH!,
+ {17^-18'19}:*/NH!'?NH'!NH2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:dihydro-Streptmycin;MW:583.574;EXA:1
:
-<54,?5,3:O,4:/*_,5:/!OH^-48,5:/*OH^35,@1,\*,O,-24~wb,?6,-5:O,@2,*\,O,24~zb,?6,
- {10,11',15,16',18'}:*/OH,9:/*!OH,12:*/NH!,{17^-18,19}:*/NH!+?NH+!NH2
+<54,?5,3:O,4:?z,5:/!OH^-48,5:/*OH^35,@1,!z,O,-24~wb,?6,-5:O,@2,!w,O,24~zb,?6,
+ 10'*11'15'*16'*18:*/OH,9:/*!OH,12:*/NH!,{17^-18'19}:*/NH!'?NH'!NH2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Spectinomycin;MW:332.35;EXA:1
:
-<30,?6,{3,9}=?6,7=zf,11=wb,{7,10,14}:O,9^60:*/H,11:?O,{1,5',8^-60}:*/OH,
- 13:/*_,{2,6}:*/NH!
+<30,?6,3'9=?6,7=zf,11=wb,7'10'14:O,9^60:*/H,11:?O,{1'*5'8^-60}:*/OH,
+ 13:?z,2'6:*/NH!
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Tobramycin;MW:467.51;EXA:1
:
-<-30,?6,@1,\*,O,0~zb,?6,-5:O,@5,\,O,0,?6,-5:O,
- {2,4,12,20'}:*/NH2,{6',11,13,18}:/*OH,10:*/!OH,17:*/!NH2
+<-30,?6,@1,!z,O,0~zb,?6,-5:O,@5,!O,0,?6,-5:O,
+ 2'4'12'*20:*/NH2,*6'11'13'18:/*OH,10:*/!OH,17:*/!NH2
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Spiramycin;MW:843.1;EXA:1
+CAT:antibiotics;EN:Spiramycin;MW:843.1;EXA:2
:
<-90,#1,60,60,-60,60,60,-60,60,60,-60,60,60,60,-60,60,-60,&1,##,
- {12,14}=dl,2:O,{1,10^-30}:/*_,5:/*OH,3:?O,6:/*O!>vt,8:/*!+!dO,
- @-6,\*^-30,O,!wb,?6`.7,-5:O,#.5,-3:/*N?!,-4:*/_,##,
- @7,\*,O,0~wb,?6`.7,-5:O,#.5,-2:*/N?!,-1:/*OH,-4:*/_,##,
- @-3,\*`1,O,60~wb,?6`.7,-5:O,#.5,{-2^35,-3}:*/OH,{-2^-35,-4}:/*_,##,
+ 12'14=dl,2:O,{1'10^-30}:?z,5:/*OH,3:?O,6:/*O!>vt,8:/*!'!dO,
+ @-6,!z^-30,O,!wb,?6`.7,-5:O,#.5,-3:/*N?!,-4:?w,##,
+ @7,!z,O,0~wb,?6`.7,-5:O,#.5,-2:*/N?!,-1:/*OH,-4:?w,##,
+ @-3,!z`1,O,60~wb,?6`.7,-5:O,#.5,{-2^35'-3}:*/OH,{-2^-35'-4}:?z,##,
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Neospiramycin;MW:698.9;EXA:1
+CAT:antibiotics;EN:Neospiramycin;MW:698.9;EXA:2
:
<-90,#1,60,60,-60,60,60,-60,60,60,-60,60,60,60,-60,60,-60,&1,##,
- {12,14}=dl,2:O,{1,10^-30}:/*_,5:/*OH,3:?O,6:/*O!>vt,8:/*!+!dO,
- @-6,\*^-30,O,!wb,?6`.7,-5:O,#.5,-3:/*N?!,-4:*/_,##,
- @7,\*,O,0~wb,?6`.7,-5:O,#.5,-2:*/N?!,-4:*/_,{-1,-3}:/*OH,##,
+ 12'14=dl,2:O,{1'10^-30}:?z,5:/*OH,3:?O,6:/*O!>vt,8:/*!'!dO,
+ @-6,!z^-30,O,!wb,?6`.7,-5:O,#.5,-3:/*N?!,-4:?w,##,
+ @7,!z,O,0~wb,?6`.7,-5:O,#.5,-2:*/N?!,-4:?w,-1'-3:/*OH,##,
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Josamycin;MW:827.995;EXA:1
+CAT:antibiotics;EN:Josamycin;MW:827.995;EXA:2
:
<-90,#1,60,60,-60,60,60,-60,60,60,-60,60,60,60,-60,60,-60,&1,##,
- {12,14}=dl,2:O,1:/*_,3:?O,10:/*_,6:/*O!>vt,-6:/*OH,5:/*O!+?O!^-25,8:/*!+!dO,
- @7,\*,O,0~wb,?6`.7,-5:O,#.5,-2:*/N?!,-1:/*OH,-4:*/_,##,
- @-3,\*`1,O,60~wb,?6`.7,-5:O,#.5,-2^35:*/OH,{-2^-35,-4}:/*_,##,
- @-3,*\,O,60,?O,60,-60,/_,!,
+ 12'14=dl,2:O,1:?z,3:?O,10:?z,6:/*O!>vt,-6:/*OH,5:/*O!'?O!^-25,8:/*!'!dO,
+ @7,!z,O,0~wb,?6`.7,-5:O,#.5,-2:*/N?!,-1:/*OH,-4:?w,##,
+ @-3,!z`1,O,60~wb,?6`.7,-5:O,#.5,-2^35:*/OH,{-2^-35'-4}:?z,##,
+ @-3,!w,O,60,?O,60,-60,?,!
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Leucomycin A5;MW:771.942;EXA:1
+CAT:antibiotics;EN:Leucomycin A5;MW:771.942;EXA:2
:
<-90,#1,60,60,-60,60,60,-60,60,60,-60,60,60,60,-60,60,-60,&1,##,
- {12,14}=dl,2:O,1:/*_,3:?O,10:/*_,6:/*O!>vt,-6:/*OH,5:/*OH,8:/*!+!dO,
- @7,\*,O,0~wb,?6`.7,-5:O,#.5,-2:*/N?!,-1:/*OH,-4:*/_,##,
- @-3,\*`1,O,60~wb,?6`.7,-5:O,#.5,-2^35:*/OH,{-2^-35,-4}:/*_,##,
- @-3,*\,O,60,?O,60,-60,60,
+ 12'14=dl,2:O,1:?z,3:?O,10:?z,6:/*O!>vt,-6:/*OH,5:/*OH,8:/*!'!dO,
+ @7,!z,O,0~wb,?6`.7,-5:O,#.5,-2:*/N?!,-1:/*OH,-4:?w,##,
+ @-3,!z`1,O,60~wb,?6`.7,-5:O,#.5,-2^35:*/OH,{-2^-35'-4}:?z,##,
+ @-3,!w,O,60,?O,60,-60,60
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Erythromycin;MW:733.93;EXA:1
+CAT:antibiotics;EN:Erythromycin;MW:733.93;EXA:2
:
<30,#1,<-120,60,60,60,-60,60,60,-60,60,60,60,-60,60,60,##,&1,
- 14:O,13:/*!,{1,9}:?O,{2',4,6^-35,8,10',12^35}:/*_,
- {6^35,11,12^-35}:*/OH,
- @$3,\*,O,30~zb,|,?6`.7,6:O,#.5,{5~wf,3^35}:/_,4:/*OH,3^-35:/*O!,##,
- @$5,\*^30`1.7,O,!zb,|,?6`.7,6:O,#.5,5:/*_,2:*/OH,3:/*N?!
+ 14:O,13:/*!,1'9:?O,{*2'4'6^-35'8'*10'12^35}:?z,
+ {6^35'11'12^-35}:*/OH,
+ @$3,!z,O,30~zb,|,?6`.7,6:O,#.5,{5~wf'3^35}:?,4:/*OH,3^-35:/*O!,##,
+ @$5,30~zf`1.7,O,!zb,|,?6`.7,6:O,#.5,5:?z,2:*/OH,3:/*N?!
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Emamectine;MW:886.133;EXA:1
+CAT:antibiotics;EN:Emamectine;MW:886.133;EXA:2
:
-<24,?6,6=?5,3=dl,9:O,2:*/OH,3:/_,6:/*OH^-60,
+<24,?6,6=?5,3=dl,9:O,2:*/OH,3:?,6:/*OH^-60,
@5,#1.04,6,?O,-60,O,60~wb,60,-60,60~wf,60,-60,60,60,60,-60,60,##,&7,
- {-1,-3,-7}=dl,-11--(-10)=?6,@-2,?6,-6=wf,-1=zb,-5=dl,
- {-1,-6}:O,-3:*/_,@-2,\,*/_,!2,
- 17:/_,19:/*_,@18,\,O!,?6`.7,-1:O,#.5,-2:*/_,-4:*/O!,##,
- @-3,\,O,60,?6`.7,-5:O,#.5,-4:*/_,-3:/*NH!,-2:*/O!
+ -1'-3'-7=dl,-11--(-10)=?6,@-2,?6,-6=wf,-1=zb,-5=dl,
+ -1'-6:O,-3:?w,@-2,!,?w,!2,
+ 17:?,19:?z,@18,!O!,?6`.7,-1:O,#.5,-2:?w,-4:*/O!,##,
+ @-3,!O,60,?6`.7,-5:O,#.5,-4:?w,-3:/*NH!,-2:*/O!
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Spinosad;MW:731.968;EXA:2
:
<30,#1,<-120,60,60,-60,60,60,60,-60,60,60,60,-60,&1,##,
- 5=?5,-1=dl,{-2^60,-3^-35}:/*H,-3=?6,-4=dl,
- {-1^35,-2'^-60}:*/H,-2=?5,2:O,{3^25,7^-25}:?O,1:*/!,
- @-2,\*,O,66~zb,?6`.7,-1:O,#.5,-2:*/_,{-3',-4,-5}:*/O!,8:*/_,5^-65:*/H,##,
- @9,\*,O,!zb,|,?6`.7,6:O,#.5,5:/*_,4:*/N?!
+ 5=?5,-1=dl,{-2^60'-3^-35}:/*H,-3=?6,-4=dl,
+ {-1^35'*-2^-60}:*/H,-2=?5,2:O,{3^25,7^-25}:?O,1:*/!,
+ @-2,!z,O,66~zb,?6`.7,-1:O,#.5,-2:?w,*-3'-4'-5:*/O!,8:?w,5^-65:*/H,##,
+ @9,!z,O,!zb,|,?6`.7,6:O,#.5,5:?z,4:*/N?!
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Natamycin;MW:665.733;EXA:1
+CAT:antibiotics;EN:Natamycin;MW:665.733;EXA:2
:
<-90,#1,60,60,-60,60,-60,60,-60,60,-60,60,60,60,O,-60,
60,60,-60,60,-60,60,-60,60,60,-60,&1,##,12--13=?6,
- {2,4,6,8,20}=dl,11=zb,23:O,-2:/*OH,-3:*/COOH,
- 18=?3,-1=wb,-2=wf,-1:O,22:?O,24:*/_,{14^60,16}:*/OH,
- @10,*\^15,O,90,?6`.7,-1:O,#.5,{-3,-5'}:*/OH,-4:/*NH2,-2:/*_
+ 2'4'6'8'20=dl,11=zb,23:O,-2:/*OH,-3:*/COOH,
+ 18=?3,-1=wb,-2=wf,-1:O,22:?O,24:?w,{14^60'16}:*/OH,
+ @10,15~wf,O,90,?6`.7,-1:O,#.5,-3'*-5:*/OH,-4:/*NH2,-2:?z
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Tylocin;MW:916.10;EXA:1
+CAT:antibiotics;EN:Tylocin;MW:916.10;EXA:2
:
<-90,#1,60,60,-60,60,60,-60,60,60,-60,60,60,60,-60,60,-60,&1,##,
- {12,14}=dl,2:O,1:/*!,5:/*OH,3:?O,10:/*_,6:/*_,-6:?O,-3:/_,8:/*!+!dO,
- @-1,*\,-60,O,0~wb,?6`.7,-5:O,#.5,-3:/*OH,-4:*/_,{-1,-2}:/*O!,##,
- @7,\*,O,0~wb,?6`.7,-5:O,#.5,-2:*/N?!,-1:/*OH,-4:*/_,##,
- @-3,\*`1,O,60~wb,?6`.7,-5:O,#.5,{-2^35,-3}:*/OH,{-2^-35,-4}:/*_,##,
+ 12'14=dl,2:O,1:/*!,5:/*OH,3:?O,10:?z,6:?z,-6:?O,-3:?,8:/*!'!dO,
+ @-1,!w,-60,O,0~wb,?6`.7,-5:O,#.5,-3:/*OH,-4:?w,-1'-2:/*O!,##,
+ @7,!z,O,0~wb,?6`.7,-5:O,#.5,-2:*/N?!,-1:/*OH,-4:?w,##,
+ @-3,!z`1,O,60~wb,?6`.7,-5:O,#.5,{-2^35'-3}:*/OH,{-2^-35'-4}:?z,##
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Tilmicosin;MW:869.133;EXA:1
+CAT:antibiotics;EN:Tilmicosin;MW:869.133;EXA:2
:
<-90,#1,60,60,-60,60,60,-60,60,60,-60,60,60,60,-60,60,-60,&1,##,
- {12,14}=dl,2:O,1:/*!,5:/*OH,{3,11}:?O,{6,10}:/*_,14:/_,
- @-1,*\,-60,O,0~zb,?6`.7,-5:O,#.5,{-1,-2}:*/O!,-3:*/OH,-4:/*_,##,
- @7,\*,O,0,?6`.7,-5:O,#.5,-2:*/N?!,{-1,-3}:/*OH,-4:*/_,##,
- @8,\*,!2,?6`.7,-6:N,#.5,{-2,-4}:*/_
+ 12'14=dl,2:O,1:/*!,5:/*OH,3'11:?O,6'10:?z,14:?,
+ @-1,!w,-60,O,0~zb,?6`.7,-5:O,#.5,-1'-2:*/O!,-3:*/OH,-4:?z,##,
+ @7,!z,O,0,?6`.7,-5:O,#.5,-2:*/N?!,-1'-3:/*OH,-4:?w,##,
+ @8,!z,!2,?6`.7,-6:N,#.5,-2'-4:?w
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Mirosamicin;MW:727.8791;EXA:1
+CAT:antibiotics;EN:Mirosamicin;MW:727.8791;EXA:2
:
<-90,#1,60,60,-60,60,60,-60,60,60,-60,60,60,60,-60,60,-60,&1,##,
- @8,\*,O,0,?6`.7,-5:O,#.5,-2:*/N?!,-1:/*OH,-4:*/_,##,
- {5,13}=dl,15=?3,-2=wf,-1=wb,-1:O,3:O,2:/*!,{4,12}:?O,{7,9,11'}:*/_,1:/*OH^-80,
- @1,*\,!,O,!wb,?6`.7,-5:O,#.5,-3:/*OH,-4:*/_,{-1,-2}:/O!
+ @8,!z,O,0,?6`.7,-5:O,#.5,-2:*/N?!,-1:/*OH,-4:?w,##,
+ 5'13=dl,15=?3,-2=wf,-1=wb,-1:O,3:O,2:/*!,4'12:?O,7'9'*11:?w,1:/*OH^-80,
+ @1,!w,!O,!wb,?6`.7,-5:O,#.5,-3:/*OH,-4:?w,-1'-2:/O!
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Chlortetracyclin;MW:478.88;EXA:1
:
-<30,Ph,{-4,-3,-3}=?6,{16,19}=dl,{10,18}:?O,7:*/_^-35,2:/Cl,
- {5,7~zf^35,13~wf^60,14,16}:/OH,15:*/N?!,17:/?O!+NH2
+<30,Ph,-4'-3'-3=?6,16'19=dl,10'18:?O,7:?w^-35,2:/Cl,
+ {5'7~zf^35'13~wf^60'14'16}:/OH,15:*/N?!,17:/?O!'NH2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Oxytetracyclin;MW:460.434;EXA:1
:
-<30,Ph,{-4,-3,-3}=?6,{16,19}=dl,{10,18}:?O,7:*/_^-35,11:*/OH,
- {5,7~zf^35,13~wf^60,14,16}:/OH,15:*/N?!,17:/?O!+NH2
+<30,Ph,-4'-3'-3=?6,16'19=dl,10'18:?O,7:?w^-35,11:*/OH,
+ {5'7~zf^35'13~wf^60'14'16}:/OH,15:*/N?!,17:/?O!'NH2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Tetracyclin;MW:444.435;EXA:1
:
-<30,Ph,{-4,-3,-3}=?6,{16,19}=dl,{10,18}:?O,7:*/_^-35,
- {5,7~zf^35,13~wf^60,14,16}:/OH,15:*/N?!,17:/?O!+NH2
+<30,Ph,-4'-3'-3=?6,16'19=dl,10'18:?O,7:?w^-35,
+ {5'7~zf^35'13~wf^60'14'16}:/OH,15:*/N?!,17:/?O!'NH2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Doxycyclin;MW:444.43;EXA:1
:
-<30,Ph,{-4,-3,-3}=?6,{16,19}=dl,{10,18}:?O,7:*/_,
- {5,13~wf^60,11~wf,14,16}:/OH,15:*/N?!,17:/?O!+NH2
+<30,Ph,-4'-3'-3=?6,16'19=dl,10'18:?O,7:?w,
+ {5'13~wf^60'11~wf'14'16}:/OH,15:*/N?!,17:/?O!'NH2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Tiamulin;MW:493.74;EXA:1
:
-<-45.5,?8,-3=?5,@8,#.8,-210~zf,/_^60,45,56,##,&6~zb,
- {3^-45,5,8}:*/_,@3,\*^30,!d,4:/*OH,11:?O,7:*/H^60,
+<-45.5,?8,-3=?5,@8,#.8,-210~zf,?^60,45,56,##,&6~zb,
+ {3^-45'5'8}:?w,@3,30~zf,!d,4:/*OH,11:?O,7:*/H^60,
@1,15,O!,?O!2,S,60,60,-60,N?2,!2
;
%------------------------------------------------------------------------------
CAT:antibiotics;EN:Rifampicin;MW:822.94;EXA:2
:
-<30,Ph,6:/_^30,5:/OH,-6=?5,-3:O,-8=?6,{-2,-4}=dl,{-1,-4}:/OH,
- #1,@-2,\,NH,60,-60,60~dl,60,60~dl,-60,
+<30,Ph,6:?^30,5:/OH,-6=?5,-3:O,-8=?6,-2'-4=dl,-1'-4:/OH,
+ #1,@-2,!,NH,60,-60,60~dl,60,60~dl,-60,
60,-60,60,60,-60,60,-53,66,-53~dl,66`1.2,O,##,&$8,
- ||,{9,15}:?O,16:/_,{20,24^30}:*/_,{21,23}:/*OH,{8^60,22,26^30}:/*_,
- -4:/*O!,@-6,-30,O!,?O!,@$11,\,!d,N,!,|,?6,1:N,4:N?
+ ||,9'15:?O,16:?,{20'24^30}:?w,21'23:/*OH,{8^60'22'26^30}:?z,
+ -4:/*O!,@-6,-30,O!,?O!,@$11,!!d,N!,|,?6,1:N,4:N?
;
%==============================================================================
CAT:pesticide;EN:BHC;MW:290.83;EXA:1
:
-<30,?6,{1,2',3,4,5',6}:*/Cl
+<30,?6,1'*2'3'4'*5'6:*/Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:pp-DDT;MW:354.49;EXA:1
:
-<30,Ph,6:/Cl,@3,\,/?Cl?Cl!Cl,!Ph,-3:/Cl
+<30,Ph,6:/Cl,@3,!,/?Cl?Cl!Cl,!Ph,-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:op-DDT;MW:354.49;EXA:-
+CAT:pesticide;EN:op-DDT;MW:354.49;EXA:1
:
-<30,Ph,4:/Cl,@3,\,/?Cl?Cl!Cl,!Ph,-3:/Cl
+<30,Ph,4:/Cl,@3,!,/?Cl?Cl!Cl,!Ph,-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:pp-DDD;MW:320;EXA:-
+CAT:pesticide;EN:pp-DDD;MW:320;EXA:1
:
-<30,Ph,6:/Cl,@3,\,/?Cl!Cl,!Ph,-3:/Cl
+<30,Ph,6:/Cl,@3,!,/?Cl!Cl,!Ph,-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:pp-DDE;MW:318;EXA:-
+CAT:pesticide;EN:pp-DDE;MW:318;EXA:1
:
-<30,Ph,6:/Cl,@3,\,//?Cl!Cl,!Ph,-3:/Cl
+<30,Ph,6:/Cl,@3,!,//?Cl!Cl,!Ph,-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:XMC;MW:179.2;EXA:-
+CAT:pesticide;EN:XMC;MW:179.2;EXA:1
:
-<30,Ph,{1,5}:/_,@3,\,O!,?O!,NH!
+<30,Ph,1'5:?,@3,!O!,?O!,NH!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Acrinathrin;MW:541.45;EXA:1
:
-<-30,?3,{2^-35,2'^35}:*/_,
- @1,\,!d,!,?O,!O!,/?F?F!F,!,?F?F!F,@3,\,?O,!O!,/CN,!Ph,-4:/O!+Ph>rl
+<-30,?3,{2^-35,*2^35}:?w,
+ @1,!!d,!?O,!O!,/?F?F!F,!,?F?F!F,@3,!?O,!O!,/CN,!Ph,-4:/O!'Ph>rl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Azaconazole;MW:300.139;EXA:1
:
-<30,Ph,{4,6}:/Cl,@3,\,!2,?5,{-2,-4}=dl,{-2,-4,-5}:N,@7,?5,{-1,-4}:O
+<30,Ph,4'6:/Cl,@3,!3,?5,-2'-4=dl,-2'-4'-5:N,@7,?5,-1'-4:O
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Acetochlor;MW:269.769;EXA:1
:
-<30,Ph,2:/_,4:/!,@3,\,N,/?O!2+Cl,!2,O!2
+<30,Ph,2:?,4:/!,@3,!N,/?O!2'Cl,!2,O!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Atrazine;MW:215.7;EXA:1
:
-<30,Ph,{2,4,6}:N,5:/Cl,1:/NH!2,3:/NH+!?!
+<30,Ph,2'4'6:N,5:/Cl,1:/NH!2,3:/NH'!?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Alachrol;MW:269.8;EXA:1
:
-<-30,!,O!2,N,/Ph+({-5,-1}:/!),!,?O!2,Cl
+<-30,!,O!2,N,/Ph'(-5'-1:/!),!,?O!2,Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Isoprcarb;MW:193.246;EXA:1
:
-<30,Ph,2:/?!,3:/O!+?O!+NH!
+<30,Ph,2:/?!,3:/O!'?O!'NH!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Isoprothiolane;MW:290.4;EXA:1
:
-<30,!?!,O!,?O!,//?5+({2,5}:S),!?O,!O,!?!
+<30,!?!,O!,?O!,//?5'(2'5:S),!?O,!O,!?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Iprobenfos;MW:288.34;EXA:1
:
-<30,!?!,O!,P,?O,/O+!?!^170,!,S,!2,Ph
+<30,!?!,O!,P,?O,/O'!?!^170,!,S,!2,Ph
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Uninnazole-P;MW:291.779;EXA:1
:
-<30,Ph,6:/Cl,@3,\,!d,!,/OH,!,??!,@8,\,|,?5,{2,4}=dl,{1,2,4}:N
+<30,Ph,6:/Cl,@3,!!d,!,/OH,!,??!,@8,!,|,?5,2'4=dl,1'2'4:N
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Esprocarb;MW:265.4;EXA:1
:
-<30,Ph,@3,\,!S!,?O!,N?2!,?!,?!
+<30,Ph,@3,!2,S!,?O!,N?2,!,?!,?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Ethalfluralin;MW:333.3;EXA:1
:
-<30,Ph,{1,3}:/NO2,5:/?F?F!F,@2,\`1.1,/!,N,!2,/_,!d
+<30,Ph,1'3:/NO2,5:/?F?F!F,@2,!`1.1,/!,N,!2,?,!d
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Ethofenprox;MW:376.5;EXA:1
:
-<30,Ph,@5,\,O,!Ph,@10,\,O!3,??,!Ph,-3:/O!2
+<30,Ph,@5,!O!,Ph,@10,!,O!3,??,!Ph,-3:/O!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Endrin;MW:380.91;EXA:1
:
<30,?6`1.3,3=?6,6=dl,9=?3,-1:O,
- @2,210~wf`1.5,&5~wb,@7,210~zf`1.5,&10~zb,{1,2,5,6,12^-210,12^-150}:/Cl
+ @2,210~wf`1.5,&5~wb,@7,210~zf`1.5,&10~zb,{1'2'5'6'12^-210'12^-150}:/Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Oxadiazon;MW:345.2;EXA:1
:
-<30,Ph,{4,6}:/Cl,1:/O+!?!,@3,\,|,?5,2=dl,{1,2}:N,4:O,5:?O,3:/??!
+<30,Ph,4'6:/Cl,1:/O'!?!,@3,!,|,?5,2=dl,1'2:N,4:O,5:?O,3:/??!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Oxadixyl;MW:278.3;EXA:1
:
-<30,Ph,{2,4}:/_,@3,\,N,!1,?O!2,O!,@7,\,|,?5,1:N,2:O,5:?O
+<30,Ph,2'4:?,@3,!N,!1,?O!2,O!,@7,!,|,?5,1:N,2:O,5:?O
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Oxyfluorfen;MW:361.701;EXA:1
:
-<30,Ph,6:/?F?F!F,4:/Cl,@3,\,O,!Ph,-3:/NO2,-4:/O!2
+<30,Ph,6:/?F?F!F,4:/Cl,@3,!O!,Ph,-3:/NO2,-4:/O!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Cafenstrole;MW:350.4;EXA:1
:
-<30,Ph,{2,4,6}:/_,@3,\,S?O?O,!,|,?5,{2,5}=dl,{2,4,5}:N,-2:/?O!+N?2+!2
+<30,Ph,2'4'6:?,@3,!,S?O?O,!,|,?5,2'5=dl,2'4'5:N,-2:/?O!'N?'!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Carfentrazone-ethyl;MW:412.19;EXA:1
:
-<30,Ph,4:/F,6:/Cl,@1,\,!,/Cl,!,?O!,O!2,
- @3,\,|,?5,4=dl,{1,3,5}:N,-4:?O,-3:/?F!F,-2:/_
+<30,Ph,4:/F,6:/Cl,@1,!2,/Cl,!?O!,O!2,
+ @3,!,|,?5,4=dl,1'3'5:N,-4:?O,-3:/?F!F,-2:?
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Carboxin;MW:235.301;EXA:1
:
-<30,?6,3=dl,2:S,5:O,4:/_,@3,\,?O,!NH!,Ph
+<30,?6,3=dl,2:S,5:O,4:?,@3,!?O,!NH!,Ph
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Quinoxyfen;MW:308.13;EXA:1
:
-<30,Ph,4=Ph,10:N,{2,6}:/Cl,@7,\,O,!Ph,-3:/F
+<30,Ph,4=Ph,10:N,2'6:/Cl,@7,!O!,Ph,-3:/F
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Quitozene;MW:295.3;EXA:1
:
-<30,Ph,{1,2,3,4,6}:/Cl,5:/NO2
+<30,Ph,1'2'3'4'6:/Cl,5:/NO2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Kresoxim-Methyl;MW:313.348;EXA:1
:
-<30,Ph,@3,\,/?O!+O!,!d,N,!O!,@4,\,!,O,!Ph,-1:/_
+<30,Ph,@3,!,/?O!'O!,!d,N,!O!,@4,!2,O,!Ph,-1:?
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Clomazone;MW:239.7;EXA:1
:
-<30,Ph,2:/Cl,@3,\,!,|,?5,1:N,2:O,-2:??,-1:?O
+<30,Ph,2:/Cl,@3,!2,|,?5,1:N,2:O,-2:??,-1:?O
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Chlorfenapyr;MW:407.62;EXA:1
:
-<18,?5,3=dl,5=dl,2:N,4:/CN,5:/Br,1:/?F?F!F,2:/!O!2,3:/Ph+(-3:/Cl)
+<18,?5,3=dl,5=dl,2:N,4:/CN,5:/Br,1:/?F?F!F,2:/!O'!2,3:/Ph'(-3:/Cl)
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Chlorfenson;MW:303.153;EXA:1
:
-<30,Ph,@3,\,O!,S?O?O,!Ph,{6,12}:/Cl
+<30,Ph,@3,!O!,S?O?O,!Ph,6'12:/Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Chlorpropham;MW:213.7;EXA:1
:
-<30,Ph,6:/Cl,@4,\,NH!,?O!,O,!?!
+<30,Ph,6:/Cl,@4,!NH!,?O!,O,!?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Chlorbenside;MW:269.183;EXA:1
:
-<30,Ph,@3,\,S,!2,Ph,{6,12}:/Cl
+<30,Ph,@3,!,S,!2,Ph,6'12:/Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Chlorobenzilate;MW:325.2;EXA:1
:
-<30,Ph,@3,\,/OH^-35,/?O!+O!2^30>lr,!Ph,{6,11}:/Cl
+<30,Ph,@3,!,/OH^-35,/?O!'O!2^30>lr,!Ph,6'11:/Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Chlorantraniliprole;MW:483.15;EXA:1
:
-<30,Ph,1:/Cl,3:/_,@5,\,?O,60,NH!,@4,\,NH!,?O!,<24,?5,
- {-1,-3}=db,{-3,-4}:N,-2:/Br,
+<30,Ph,1:/Cl,3:?,@5,!?O,60,NH!,@4,!NH!,?O!,<24,?5,-1'-3=db,-3'-4:N,-2:/Br,
@-4,24,Ph,-5:N,-1:/Cl
;
%------------------------------------------------------------------------------
+CAT:pesticide;EN:Chlorothalonil;MW:265.9;EXA:1
+:
+<30,Ph,4'6:/CN,1'2'3'5:/Cl
+;
+%------------------------------------------------------------------------------
+CAT:pesticide;EN:Chlorothalonil-4-Hydroxy;MW:247.5;EXA:-
+:
+<30,Ph,4'6:/CN,1'2'5:/Cl,3:/OH
+;
+%------------------------------------------------------------------------------
+CAT:pesticide;EN:Chlornitrofen;MW:318.5;EXA:1
+:
+<30,Ph,6:/NO2,@3,!O!,Ph,-1'-3'-5:/Cl
+;
+%------------------------------------------------------------------------------
+CAT:pesticide;EN:Fthalide;MW:271.9;EXA:1
+:
+<30,Ph,3=?5,8:O,9:?O,1'2'5'6:/Cl
+;
+%------------------------------------------------------------------------------
CAT:pesticide;EN:Azoxystrobin;MW:403.4;EXA:1
:
-<30,Ph,2:/CN,@3,\,O,!Ph,{-1,-3}:N,@-4,\,O,!Ph,@-5,\,/?O!+O!,!d,!O!
+<30,Ph,2:/CN,@3,!O!,Ph,-1'-3:N,@-4,!O!,Ph,@-5,!,/?O!'O!,!d,!O!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Thiuram;MW:240.43;EXA:1
:
-<30,!,N?!,//S,!,S,!,S,!,//S,!,N?!
+<30,!,N?!,?S,!,S,!,S,!,?S,!,N?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Probenazole;MW:223.25;EXA:1
:
-<12,Ph,3=?5,9=dl,7:S,8:N,{7^35,7^-35}:?O,9:/O!2+!d
+<12,Ph,3=?5,9=dl,7:S,8:N,{7^35'7^-35}:?O,9:/O!2'!d
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Penflufen;MW:317.41;EXA:1
:
-<30,Ph,@3,\,NH!,?O!,?5,{-1,-4}=db,{-2,-3}:N,{-2,-4}:/_,-1:/F,@4,\,/_,60,!?!
+<30,Ph,@3,!NH!,?O!,?5,-1'-4=db,-2'-3:N,-2'-4:?,-1:/F,@4,!?,60,!?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:MCPA;MW:200.62;EXA:1
:
-<30,Ph,1:/Cl,5:/_,4:/O!2+COOH
+<30,Ph,1:/Cl,5:?,4:/O!2'COOH
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Asulam;MW:230.2;EXA:1
:
-<30,Ph,1:/NH2,@3,\,S?O?O,!NH!,?O!,O!
+<30,Ph,1:/NH2,@3,!,S?O?O,!NH!,?O!,O!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Imazosulfuron;MW:412.81;EXA:1
:
-<-11.8,?6,3=?5,{1,5,7,9}=db,{4,7}:N,8:/Cl,
- @-1,\,S?O?O,!NH!,?O,!NH!,Ph,{-1,-5}:N,{-2,-4}:/O!
+<-11.8,?6,3=?5,1'5'7'9=db,4'7:N,8:/Cl,
+ @-1,!,S?O?O,!NH!,?O,!NH!,Ph,-1'-5:N,-2'-4:/O!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Triaziflam;MW:333.4;EXA:1
:,
-<30,Ph,{2,6}:/_,@4,\,O!2,?!,NH!,Ph,{-1,-3,-5}:N,-2:/NH2,-4:/??+!F
+<30,Ph,2'6:?,@4,!,O!2,?!,NH!,Ph,-1'-3'-5:N,-2:/NH2,-4:/??'!F
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Trichlopyr;MW:256.47;EXA:1
:,
-<30,Ph,2:N,{1,4,6}:/Cl,3:/O!2+COOH
+<30,Ph,2:N,1'4'6:/Cl,3:/O!2'COOH
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Halosulfuron-methyl;MW:434.82;EXA:1
:,
-<6,?5,{3,5}=db,{1,2}:N,2:/_,5:/Cl,@3,\,S?O?O,!NH!,?O,!NH!,Ph,{-2,-4}:/O!,
- 4:/?O!+O!
+<6,?5,3'5=db,1'2:N,2:?,5:/Cl,@3,!,S?O?O,!NH!,?O,!NH!,Ph,-2'-4:/O!,4:/?O!'O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Flupoxam;MW:460.8;EXA:2
+CAT:pesticide;EN:Flupoxam;MW:460.8;EXA:1
:
-<30,Ph,4:/Cl,@1,\,?5,{-2,-4}=db,{-2,-4,-5}:N,-1:/Ph,-3:/?O!+NH2,
- @3,\,!,O!2,/F^35,/F^-35,!,?F?F!F
+<30,Ph,4:/Cl,@1,!,?5,-2'-4=db,-2'-4'-5:N,-1:/Ph,-3:/?O!'NH2,
+ @3,!2,O!2,/F^35,/F^-35,!,?F?F!F
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Cyanazine;MW:240.7;EXA:1
:
-<30,Ph,{2,4,6}:N,5:/Cl,1:/NH!2,3:/NH!+??+!CN
+<30,Ph,2'4'6:N,5:/Cl,1:/NH!2,3:/NH!'??'!CN
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Diethofencarb;MW:267.3;EXA:1
:
-<30,Ph,@4,\,NH!,?O!,O,!?!,{1,6}:/O!2
+<30,Ph,@4,!NH!,?O!,O,!?!,1'6:/O!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Diclofop-methyl;MW:341.2;EXA:1
:
-<30,Ph,{4,6}:/Cl,@3,\,O,!Ph,@-4,\,O,!?!,?O,!O!
+<30,Ph,4'6:/Cl,@3,!O!,Ph,@-4,!O,!?!,?O,!O!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Cyhalothrin;MW:449.86;EXA:1
:
-<-30,?3,{2^-35,2'^35}:*/_,@1,\,!d,/?F?F!F,!Cl,
- @3,\,?O,!O!,/CN,!Ph,-4:/O!+Ph>rl
+<-30,?3,{2^-35'*2^35}:?w,@1,!!d,/?F?F!F,!Cl,@3,!?O,!O!,/CN,!Ph,-4:/O!'Ph>rl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Cyhalofop-Buthyl;MW:357.381;EXA:1
:
-<30,Ph,1:/CN,4:/F,@3,\,O,!Ph,@-3,\,O,!?!,?O!,O,!4
+<30,Ph,1:/CN,4:/F,@3,!O!,Ph,@-3,!O,!?!,?O!,O,!4
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Diphenamid;MW:239.3;EXA:1
:
-<30,Ph,@3,\,!Ph,-5:/?O!+N?!
+<30,Ph,@3,!2,Ph,-5:/?O!'N?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Cyfluthrin;MW:434.3;EXA:1
:
-<-30,?3,{2^-35,2'^35}:*/_,
- @1,\,!d,/Cl,!Cl,@3,\,?O,!O!,/CN,!Ph,-3:/F,-4:/O!+Ph>rl
+<-30,?3,{2^-35'*2^35}:?w,
+ @1,!!d,/Cl,!Cl,@3,!?O,!O!,/CN,!Ph,-3:/F,-4:/O!'Ph>rl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Diflufenican;MW:394.29;EXA:1
:
-<30,Ph,{1,5}:/F,@4,\,NH!,?O,!Ph,6:N,-5:/O!+Ph+(-3:/?F?F!F)
+<30,Ph,1'5:/F,@4,!NH!,?O,!Ph,6:N,-5:/O!'Ph'(-3:/?F?F!F)
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Cyproconazole;MW:291.8;EXA:1
:
-<30,?3,@2,\,?!,/OH^30,-90,!,|,<-18,?5,{2,4}=dl,{1,3,5}:N,@$5,-30,Ph,-3:/Cl
+<30,?3,@2,!,?!,/OH^30,-90,!,|,<-18,?5,2'4=dl,1'3'5:N,@$5,-30,Ph,-3:/Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Cypermethrin;MW:416.3;EXA:1
:
-<-30,?3,{2^-35,2'^35}:*/_,@1,\,!d,/Cl,!Cl,@3,\,?O,!O!,/CN,!Ph,-4:/O!+Ph>rl
+<-30,?3,{2^-35'*2^35}:?w,@1,!!d,/Cl,!Cl,@3,!?O,!O!,/CN,!Ph,-4:/O!'Ph>rl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Simazine;MW:201.7;EXA:1
:
-<30,Ph,{2,4,6}:N,5:/Cl,1:/NH!2,3:/NH!2
+<30,Ph,2'4'6:N,5:/Cl,1:/NH!2,3:/NH!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Dimethametryn;MW:255.4;EXA:1
:
-<30,Ph,{2,4,6}:N,5:/S!,1:/NH!2,3:/NH+!?!+?!
+<30,Ph,2'4'6:N,5:/S!,1:/NH!2,3:/NH'!?!'?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Dimethenamid;MW:275.8;EXA:1
:
-<-6,?5,{3,5}=dl,2:S,{3,5}:/_,@4,\,N,!,?O!2,Cl,6:/?!2+O!
+<-6,?5,3'5=dl,2:S,3'5:?,@4,!,N!,?O!2,Cl,6:/?!2'O!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Simetryn;MW:213.3;EXA:1
:
-<30,Ph,{2,4,6}:N,5:/S!,{1,3}:/NH!2
+<30,Ph,2'4'6:N,5:/S!,1'3:/NH!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Dimepiperate;MW:263.4;EXA:1
:
-<30,Ph,@3,\,??,!S!,?O!,?6,-6:N
+<30,Ph,@3,!??,!S!,?O!,?6,-6:N
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Diazinon;MW:304.35;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!O!,|,Ph,{4,6}:N,5:/_,3:/?!
+<30,!2,O!,P,?S,/O!2^160>rl,!O!,|,Ph,4'6:N,5:?,3:/?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Thiobencarb;MW:257.776;EXA:1
:
-<30,Ph,1:/Cl,@4,\,!S!,?O!,N?2,!2
+<30,Ph,1:/Cl,@4,!2,S!,?O!,N?2,!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Thiometon;MW:246.34;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,S!3,S!2
+<-30,!O!,P,?S,/O!^160,!,S!3,S!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Thifluzamide;MW:528.08;EXA:1
:
-<-12,?5,{3,5}=dl,2:S,5:N,3:/?F?F!F,1:/_,
- @4,\,?O,!NH!,<6,Ph,{-5,-1}:/Br,-3:/O!+?F?F!F
+<-12,?5,3'5=dl,2:S,5:N,3:/?F?F!F,1:?,
+ @4,!?O,!NH!,<6,Ph,-5'-1:/Br,-3:/O!'?F?F!F
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Dieldrin;MW:380.895;EXA:1
:
<30,?6`1.2,3=?6,6=dl,9=?3,-1:O,@2,148~wf`1.4,&5~wb,
- @7,*\^145`1.3,&10~zb,{1,2,5,6,12^-210,12^-150}:/Cl
+ @7,145~wf`1.3,&10~zb,{1'2'5'6'12^-210'12^-150}:/Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Aldrin;MW:364.908;EXA:1
:
-<30,?6`1.3,3=?6,{6,9}=dl,
- @2,210~wf`1.5,&5~wb,@7,210~zf`1.5,&10~zb,{1,2,5,6,11^-210,11^-150}:/Cl
+<30,?6`1.3,3=?6,6'9=dl,
+ @2,210~wf`1.5,&5~wb,@7,210~zf`1.5,&10~zb,{1'2'5'6'11^-210'11^-150}:/Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Tecnazene;MW:260.879;EXA:1
@@ -1751,149 +1812,148 @@ CAT:pesticide;EN:Tecnazene;MW:260.879;EXA:1
%------------------------------------------------------------------------------
CAT:pesticide;EN:Tetrachlorvinfos;MW:365.97;EXA:1
:
-<-30,!O!,P,?O,/O!^160,!O!,/Ph+({2,4,5}:/Cl),!d,!Cl
+<-30,!O!,P,?O,/O!^160,!O!,/Ph'(2'4'5:/Cl),!d,!Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Tetraconazole;MW:372.14;EXA:1
:
-<-6,?5,{2,5}=dl,{1,2,4}:N,@4,\,!3,O!,/F^35,/F^-35,!,?F!F,7:/Ph+({4,6}:/Cl)
+<-6,?5,2'5=dl,1'2'4:N,@4,!4,O!,/F^35,/F^-35,!,?F!F,7:/Ph'(4'6:/Cl)
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Tetradifon;MW:356.038;EXA:1
:
-<30,Ph,@3,\,S?O?O,!Ph,{6,10,11,13}:/Cl
+<30,Ph,@3,!,S?O?O,!Ph,6'10'11'13:/Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Thenylchlor;MW:323.835;EXA:1
:
-<6,?5,{2,5}=dl,4:S,2:/O!,@3,\,!,N,7:/Ph+({6,2}:/_)^-15,!,?O!2,Cl,
+<6,?5,2'5=dl,4:S,2:/O!,@3,!2,N,7^-15:/Ph'(6'2:?),!,?O!2,Cl,
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Tebuconazole;MW:307.8;EXA:1
:
-<36,?5,{1,4}=dl,{1,3,5}:N,@3,30,!4,Ph,-3:/Cl,7^-30:/??!,7^30:/OH
+<36,?5,1'4=dl,1'3'5:N,@3,30,!4,Ph,-3:/Cl,7^-30:/??!,7^30:/OH
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Tebufenpyrad;MW:333.86;EXA:1
:
-<6,?5,{3,5}=dl,{1,2}:N,4:/Cl,5:/!,2:/_,@3,\,?O!,NH,!2,Ph,-3:/??!
+<6,?5,3'5=dl,1'2:N,4:/Cl,5:/!,2:?,@3,!?O!,NH,!2,Ph,-3:/??!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Tefluthrin;MW:418.736;EXA:1
:
-<-30,?3,{2^-35,2'^35}:*/_,@1,\,!d,/?F?F!F,!Cl,@3,\,?O!,O!2,|,Ph,{2,3,5,6}:/F,4:/_
+<-30,?3,{2^-35'*2^35}:?w,@1,!!d,/?F?F!F,!Cl,@3,!?O!,O!2,|,Ph,2'3'5'6:/F,4:?
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Terbutryn;MW:241.4;EXA:1
:
-<30,Ph,{2,4,6}:N,5:/S!,1:/NH!2,3:/NH!+??!
+<30,Ph,2'4'6:N,5:/S!,1:/NH!2,3:/NH!'??!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Terbufos;MW:288.42;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!,S!2,S!,??!
+<30,!2,O!,P,?S,/O!2^160>rl,!,S!2,S!,??!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Triadimefon;MW:293.8;EXA:1
:
-<30,Ph,6:/Cl,@3,\,O!2,?O!,??!,@8,\,|,?5,{2,4}=dl,{1,2,4}:N
+<30,Ph,6:/Cl,@3,!,O!2,?O!,??!,@8,!,|,?5,2'4=dl,1'2'4:N
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Triazophos;MW:313.31;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!O!,<-12,|,?5,{2,5}=dl,{2,4,5}:N,4:/Ph
+<30,!2,O!,P,?S,/O!2^160>rl,!O!,<-12,|,?5,2'5=dl,2'4'5:N,4:/Ph
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Triallate;MW:304.7;EXA:1
:
-<-30,!?!,N,/?!,!,?O!,S!2,/Cl,!d,/Cl,!Cl
+<-30,!?!,N,/?!,!?O!,S!2,/Cl,!d,/Cl,!Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Dimethylvinphos;MW:331.52;EXA:1
:
-<-30,!O!,P,?O,/O!^160,!O!,/Ph+({2,4}:/Cl)`1,!d,!Cl
+<-30,!O!,P,?O,/O!^160,!O!,/Ph'(2'4:/Cl)`1,!d,!Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Trifluralin;MW:335.3;EXA:1
:
-<30,Ph,{1,3}:/NO2,5:/?F?F!F,@2,\,N,/!2,!3
+<30,Ph,1'3:/NO2,5:/?F?F!F,@2,!N,/!2,!3
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Napropamide;MW:271.4;EXA:1
:
-<-30,Ph,4=Ph,@10,\,O!,?!,?O!,N?2,!2
+<-30,Ph,4=Ph,@10,!O!,?!,?O!,N?2,!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Nitrothal-isopropyl;MW:295.3;EXA:-
+CAT:pesticide;EN:Nitrothal-isopropyl;MW:295.3;EXA:1
:
-<30,Ph,5:/NO2,{1,3}:/?O!+O!+?!
+<30,Ph,5:/NO2,1'3:/?O!'O!'?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Norflurazon;MW:303.7;EXA:-
+CAT:pesticide;EN:Norflurazon;MW:303.7;EXA:1
:
-<30,?6,{1,5}=dl,{4,5}:N,1:/NH!,3:?O,2:/Cl,4:/Ph+(3:/?F?F!F)
+<30,?6,1'5=dl,4'5:N,1:/NH!,3:?O,2:/Cl,4:/Ph'(3:/?F?F!F)
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Paclobutrazole;MW:293.795;EXA:-
+CAT:pesticide;EN:Paclobutrazole;MW:293.795;EXA:1
:
-<30,Ph,6:/Cl,@3,\,!2,/OH,!,??!,@8,\,|,?5,{2,4}=dl,{1,2,4}:N
+<30,Ph,6:/Cl,@3,!3,/OH,!,??!,@8,!,|,?5,2'4=dl,1'2'4:N
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Picolinafen;MW:376.331;EXA:-
+CAT:pesticide;EN:Picolinafen;MW:376.331;EXA:1
:
-<30,Ph,5:/?F?F!F,@3,\,O,!Ph,-5:N,@-4,\,?O,!NH!,Ph,-3:/F
+<30,Ph,5:/?F?F!F,@3,!O!,Ph,-5:N,@-4,!?O,!NH!,Ph,-3:/F
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Bitertanol;MW:337.4;EXA:-
+CAT:pesticide;EN:Bitertanol;MW:337.4;EXA:1
:
-<30,Ph,@3,\,Ph,@-3,\,O!2,/OH,!,??!,@14,\,|,?5,{2,4}=dl,{1,2,4}:N
+<30,Ph,@3,!Ph,@-3,!,O!2,/OH,!,??!,@14,!,|,?5,2'4=dl,1'2'4:N
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Bifenox;MW:342.14;EXA:-
+CAT:pesticide;EN:Bifenox;MW:342.14;EXA:1
:
-<30,Ph,{4,6}:/Cl,@3,\,O,!Ph,-4:/?O!+O!,-3:/NO2
+<30,Ph,4'6:/Cl,@3,!O!,Ph,-4:/?O!'O!,-3:/NO2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Bifenthrin;MW:422.88;EXA:-
+CAT:pesticide;EN:Bifenthrin;MW:422.88;EXA:1
:
-<-30,?3,{2^-35,2'^35}:*/_,
- @1,\,!d,/Cl,!,?F?F!F,@3,\,?O,!O!,-60,Ph,-1:/_,-2:/Ph
+<-30,?3,{2^-35'*2^35}:?w,@1,!!d,/Cl,!,?F?F!F,@3,!?O,!O!,-60,Ph,-1:?,-2:/Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pyraflufen-ethyl;MW:413.174;EXA:-
+CAT:pesticide;EN:Pyraflufen-ethyl;MW:413.174;EXA:1
:
-<30,Ph,6:/Cl,4:/F,@3,\,|,?5,{1,4}=dl,{2,3}:N,-3:/_,5:/Cl,
- @-2,\,O!,/F,!F,@$1,\,O!2,?O!,O!2
+<30,Ph,6:/Cl,4:/F,@3,!,|,?5,1'4=dl,2'3:N,-3:?,5:/Cl,
+ @-2,!O!,/F,!F,@$1,!,O!2,?O!,O!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pyridaben;MW:364.9;EXA:-
+CAT:pesticide;EN:Pyridaben;MW:364.9;EXA:1
:
-<30,?6,{2,4}=dl,{5,6}:N,6:/??!,1:?O,2:/Cl,@-4,\,S,!2,Ph,-3:/??!
+<30,?6,2'4=dl,5'6:N,6:/??!,1:?O,2:/Cl,@-4,!,S,!2,Ph,-3:/??!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Pyridaphenthion;MW:340.34;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!O!,|,?6,{1,5}=dl,{2,3}:N,4:?O,3:/Ph
+<30,!2,O!,P,?S,/O!2^160>rl,!O!,|,?6,1'5=dl,2'3:N,4:?O,3:/Ph
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Pyributicarb;MW:330.4;EXA:1
:
-<30,Ph,5:/??!,@3,\,?O!,S!,N?!,Ph,-5:N,-4:/O!
+<30,Ph,5:/??!,@3,!?O!,S!,N?!,Ph,-5:N,-4:/O!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Pyriproxyfen;MW:321.5;EXA:1
:
-<30,Ph,@5,\,O,!Ph,@-3,\,O!2,?!,O,-60,Ph,-5:N
+<30,Ph,@5,!O!,Ph,@-3,!,O!2,?!,O,-60,Ph,-5:N
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pyriminobac-Methyl;MW:361.354;EXA:-
+CAT:pesticide;EN:Pyriminobac-Methyl;MW:361.354;EXA:1
:
-<30,Ph,2:/O!+?O!,@5,\,/_,!d,N,!O!,@3,\,O!,|,Ph,{2,6}:N,{3,5}:/O!
+<30,Ph,2:/O!'?O!,@5,!?,!d,N,!O!,@3,!O!,|,Ph,2'6:N,3'5:/O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pyrimethanil;MW:199.257;EXA:-
+CAT:pesticide;EN:Pyrimethanil;MW:199.257;EXA:1
:
-<30,Ph,@3,\,NH!,|,Ph,{2,6}:N,{3,5}:/_
+<30,Ph,@3,!NH!,|,Ph,2'6:N,3'5:?
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Pyroquilon;MW:173.2;EXA:1
@@ -1903,857 +1963,847 @@ CAT:pesticide;EN:Pyroquilon;MW:173.2;EXA:1
%------------------------------------------------------------------------------
CAT:pesticide;EN:Vinclozolin;MW:286.108;EXA:1
:
-<36,?5,3:N,5:O,{2,4}:?O,1:/_^54,1:/!d^-30,3:/Ph+({3,5}:/Cl)
+<36,?5,3:N,5:O,2'4:?O,1:?^54,1:/!d^-30,3:/Ph'(3'5:/Cl)
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fipronil;MW:437.2;EXA:-
+CAT:pesticide;EN:Fipronil;MW:437.2;EXA:1
:
-<30,Ph,{2,4}:/Cl,6:/?F?F!F,@3,\,
- |,?5,{2,4}=dl,{1,2}:N,3:/CN,5:/NH2,-2:/S?O+!?F?F!F
+<30,Ph,2'4:/Cl,6:/?F?F!F,@3,!,|,?5,2'4=dl,1'2:N,3:/CN,5:/NH2,-2:/S?O'!'?F?F!F
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenomiphos;MW:303.36;EXA:-
+CAT:pesticide;EN:Fenomiphos;MW:303.36;EXA:1
:
-<30,!2,O!,P,?O,/NH+!?!^160,!,O,!Ph,-4:/_,-3:/S!
+<30,!2,O!,P,?O,/NH'!?!^160,!O!,Ph,-4:?,-3:/S!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenarimol;MW:331.2;EXA:-
+CAT:pesticide;EN:Fenarimol;MW:331.2;EXA:1
:
-<30,Ph,@3,\,!Ph,{4,11}:/Cl,7:/OH^30,7:/Ph+({3,5}:N)^-30
+<30,Ph,@3,!2,Ph,4'11:/Cl,7:/OH^30,7^-30:/Ph'(3'5:N)
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenothiocarb;MW:253.4;EXA:-
+CAT:pesticide;EN:Fenothiocarb;MW:253.4;EXA:1
:
-<30,Ph,@3,\,O,!5,S,!,?O!,N?!
+<30,Ph,@3,!O,!5,S,!?O!,N?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fensulfothion;MW:308.35;EXA:-
+CAT:pesticide;EN:Fensulfothion;MW:308.35;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!,O,!Ph,-3:/S+?O!
+<30,!2,O!,P,?S,/O!2^160>rl,!O!,Ph,-3:/S'?O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenitrothion;MW:277.23;EXA:-
+CAT:pesticide;EN:Fenitrothion;MW:277.23;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,O,!Ph,-4:/_,-3:/NO2
+<-30,!O!,P,?S,/O!^160,!O!,Ph,-4:?,-3:/NO2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Parathion-methyl;MW:263.2;EXA:-
+CAT:pesticide;EN:Parathion-methyl;MW:263.2;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,O,!Ph,-3:/NO2
+<-30,!O!,P,?S,/O!^160,!O!,Ph,-3:/NO2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Parathion;MW:291.3;EXA:-
+CAT:pesticide;EN:Parathion;MW:291.3;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!O,!Ph,-3:/NO2
+<30,!2,O!,P,?S,/O!2^160>rl,!O!,Ph,-3:/NO2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenthion;MW:278.33;EXA:-
+CAT:pesticide;EN:Fenthion;MW:278.33;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!O!,|,Ph,3:/_,4:/S!
+<-30,!O!,P,?S,/O!^160,!O!,|,Ph,3:?,4:/S!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Butamifos;MW:332.36;EXA:-
+CAT:pesticide;EN:Butamifos;MW:332.36;EXA:1
:
-<-30,!2,?!,NH!,P,//S,/O!2^170>rl,!O!,|,Ph,2:/NO2,5:/_
+<-30,!2,?!,NH!,P,?S,/O!2^170>rl,!O!,|,Ph,2:/NO2,5:?
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Phenthoate;MW:320.358;EXA:-
+CAT:pesticide;EN:Phenthoate;MW:320.358;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,S,!,/Ph,!,?O!,O!2
+<-30,!O!,P,?S,/O!^160,!,S,!,/Ph,!?O!,O!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Prothyophos;MW:329.18;EXA:-
+CAT:pesticide;EN:Prothyophos;MW:329.18;EXA:1
:
-<-30,!3,O!,P,//S,/O!2^160>rl,!O!,Ph,{-5,-3}:/Cl
+<-30,!3,O!,P,?S,/O!2^160>rl,!O!,Ph,-5'-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Propaphos;MW:304.343;EXA:-
+CAT:pesticide;EN:Propaphos;MW:304.343;EXA:1
:
<-30,!3,O!,P,?O,/O!3^160>rl,!O!,Ph,-3:/S!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Profenofos;MW:373.6;EXA:-
+CAT:pesticide;EN:Profenofos;MW:373.6;EXA:1
:
-<30,!2,O!,P,//S,/O!3^160>rl,!O,!Ph,-5:/Cl,-3:/Br
+<30,!2,O!,P,?S,/O!3^160>rl,!O!,Ph,-5:/Cl,-3:/Br
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Bromophos;MW:365.99;EXA:-
+CAT:pesticide;EN:Bromophos;MW:365.99;EXA:1
:
-<-30,!O!, P,//S,/O!^160,!O!,|,Ph,{3,6}:/Cl,4:/Br
+<-30,!O!, P,?S,/O!^160,!O!,|,Ph,3'6:/Cl,4:/Br
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Phosalone;MW:367.80;EXA:-
+CAT:pesticide;EN:Phosalone;MW:367.80;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!,S!2,|,?5,4=Ph,4=dr,1:N,2:?O,3:O,8:/Cl
+<30,!2,O!,P,?S,/O!2^160>rl,!,S!2,|,?5,4=Ph,4=dr,1:N,2:?O,3:O,8:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Phosmet;MW:317.32;EXA:-
+CAT:pesticide;EN:Phosmet;MW:317.32;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,S,!2,|,?5,3=Ph2,1:N,{2,5}:?O
+<-30,!O!,P,?S,/O!^160,!,S,!2,|,?5,3=Ph2,1:N,2'5:?O
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Phorate;MW:260.4;EXA:-
+CAT:pesticide;EN:Phorate;MW:260.4;EXA:1
:
-<30,!2,O!,P,//S,!,S!2,S!2,4:/O!2^160>rl
+<30,!2,O!,P,?S,!,S!2,S!2,4:/O!2^160>rl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Malathion;MW:330.35;EXA:-
+CAT:pesticide;EN:Malathion;MW:330.35;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!S!,/!?O!+O!2`1,!,?O!,O!2
+<-30,!O!,P,?S,/O!^160,!S!,/!?O!'O!2`1,!?O!,O!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Methidathion;MW:302.32;EXA:-
+CAT:pesticide;EN:Methidathion;MW:302.32;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,S!2,|,?5,4=dl,{1,5}:N,3:S,2:?O,4:/O!
+<-30,!O!,P,?S,/O!^160,!,S!2,|,?5,4=dl,1'5:N,3:S,2:?O,4:/O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Mevinphos;MW:224.15;EXA:-
+CAT:pesticide;EN:Mevinphos;MW:224.15;EXA:1
:
-<-30,!O!,P,?O,/O!^160,!O,!?,!d,!,?O!,O!
+<-30,!O!,P,?O,/O!^160,!O,!?,!d,!?O!,O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Chlorpyrifos;MW:350.59;EXA:-
+CAT:pesticide;EN:Chlorpyrifos;MW:350.59;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!O!,|,Ph,6:N,{2,4,5}:/Cl
+<30,!2,O!,P,?S,/O!2^160>rl,!O!,|,Ph,6:N,2'4'5:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Chlorpyrifos-methyl;MW:322.53;EXA:-
+CAT:pesticide;EN:Chlorpyrifos-methyl;MW:322.53;EXA:1
:
-<-30,!O!,P,//S,/O!^160>rl,!O!,|,Ph,6:N,{2,4,5}:/Cl
+<-30,!O!,P,?S,/O!^160>rl,!O!,|,Ph,6:N,2'4'5:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Cadusafos;MW:270.386;EXA:-
+CAT:pesticide;EN:Cadusafos;MW:270.386;EXA:1
:
<-30,!2,?!,S!,P,?O,/O!2^160>rl,!,S,!?,!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Dimethoate;MW:229.25;EXA:-
+CAT:pesticide;EN:Dimethoate;MW:229.25;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,S!2,?O,!NH!
+<-30,!O!,P,?S,/O!^160,!,S!2,?O,!NH!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Tribufos;MW:314.50;EXA:-
+CAT:pesticide;EN:Tribufos;MW:314.50;EXA:1
:
-<30,!4,S,!,P,?O,/S+!4^160>rl,!,S,!4
+<30,!4,S,!,P,?O,/S'!4^160>rl,!,S,!4
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Tolclofos-methyl;MW:301.13;EXA:-
+CAT:pesticide;EN:Tolclofos-methyl;MW:301.13;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!O!,|,Ph,{2,6}:/Cl,4:/_
+<-30,!O!,P,?S,/O!^160,!O!,|,Ph,2'6:/Cl,4:?
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Piperophos;MW:353.48;EXA:-
+CAT:pesticide;EN:Piperophos;MW:353.48;EXA:1
:
-<-30,!3,O!,P,//S,/O+!?!^160>rl,!,S!2,?O!,|,?6,1:N,6:/_
+<-30,!3,O!,P,?S,/O'!?!^160>rl,!,S!2,?O!,|,?6,1:N,6:?
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pyraclofos;MW:360.80;EXA:-
+CAT:pesticide;EN:Pyraclofos;MW:360.80;EXA:1
:
-<30,!2,O!,P,?O,/S!3^160>rl,!O!,
- <-12,|,?5,{1,4}=dl,{3,4}:N,@-3,-12,Ph,-3:/Cl
+<30,!2,O!,P,?O,/S!3^160>rl,!O!,<-12,|,?5,1'4=dl,3'4:N,@-3,-12,Ph,-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pyrazophos;MW:373.37;EXA:-
+CAT:pesticide;EN:Pyrazophos;MW:373.37;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!O!,
- |,?5,3=?6,{2,5,7,9}=dl,{4,5,6}:N,7:/_,-2:/?O!+O!2
+<30,!2,O!,P,?S,/O!2^160>rl,!O!,|,?5,3=?6,2'5'7'9=dl,4'5'6:N,7:?,-2:/?O!'O!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:EPN;MW:323.303;EXA:-
+CAT:pesticide;EN:EPN;MW:323.303;EXA:1
:
-<30,!2,O!,P,//S,/Ph^170,!,O,!Ph,-3:/NO2
+<30,!2,O!,P,?S,/Ph^170,!O!,Ph,-3:/NO2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Anilofos;MW:367.9;EXA:-
+CAT:pesticide;EN:Anilofos;MW:367.9;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,S,!2,?O!,N,/?!,!Ph,-3:/Cl
+<-30,!O!,P,?S,/O!^160,!,S,!2,?O!,N,/?!,!Ph,-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Isazofos;MW:313.74;EXA:-
+CAT:pesticide;EN:Isazofos;MW:313.74;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!O!,|,?5,{2,5}=dl,{2,4,5}:N,4:/Cl,3:/?!
+<30,!2,O!,P,?S,/O!2^160>rl,!O!,|,?5,2'5=dl,2'4'5:N,4:/Cl,3:/?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Ethion;MW:384.46;EXA:-
+CAT:pesticide;EN:Ethion;MW:384.46;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!,S,!2,S,!,P,//S,/O!2^200>lr,!,O!2
+<30,!2,O!,P,?S,/O!2^160>rl,!,S,!2,S,!,P,?S,/O!2^200>lr,!,O!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Edifenphos;MW:310.37;EXA:-
+CAT:pesticide;EN:Edifenphos;MW:310.37;EXA:1
:
-<30,Ph,@3,\,O!,P,//S,/O!2>rl^160,!,S,!Ph
+<30,Ph,@3,!O!,P,?S,/O!2>rl^160,!,S,!Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Ethoprophos;MW:242.33;EXA:-
+CAT:pesticide;EN:Ethoprophos;MW:242.33;EXA:1
:
<-30,!3,S,!,P,?O,/S!3^160>rl,!,O!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Ethrimfos;MW:292.29;EXA:-
+CAT:pesticide;EN:Ethrimfos;MW:292.29;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!O!,|,Ph,{2,4}:N,5:/!,3:/O!2
+<-30,!O!,P,?S,/O!^160,!O!,|,Ph,2'4:N,5:/!,3:/O!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Quinalphos;MW:298.30;EXA:-
+CAT:pesticide;EN:Quinalphos;MW:298.30;EXA:1
:
-<30,!,O!2,P,//S,/O!2^160>rl,!O!,|,Ph,3=Ph,{2,5}:N
+<30,!,O!2,P,?S,/O!2^160>rl,!O!,|,Ph,3=Ph,2'5:N
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Chlorfenvinphos;MW:359.58;EXA:-
+CAT:pesticide;EN:Chlorfenvinphos;MW:359.58;EXA:1
:
-<30,!2,O!,P,?O,/O!2^160>rl,!O!,/Ph+({2,4}:/Cl)`1,!d,!Cl
+<30,!2,O!,P,?O,/O!2^160>rl,!O!,/Ph'(2'4:/Cl)`1,!d,!Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pirimiphos-methyl;MW:305.333;EXA:-
+CAT:pesticide;EN:Pirimiphos-methyl;MW:305.333;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!O,!Ph,{-5,-3}:N,-2:/_,-4:/N?2+!2
+<-30,!O!,P,?S,/O!^160,!O!,Ph,-5'-3:N,-2:?,-4:/N?2'!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Cyanophos;MW:243.22;EXA:-
+CAT:pesticide;EN:Cyanophos;MW:243.22;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,O,!Ph,-3:/CN
+<-30,!O!,P,?S,/O!^160,!O!,Ph,-3:/CN
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Dichlofenthion;MW:315.2;EXA:-
+CAT:pesticide;EN:Dichlofenthion;MW:315.2;EXA:1
:
-<30,!2,O!,P,//S,/O!2^160>rl,!,O,!Ph,{-5,-3}:/Cl
+<30,!2,O!,P,?S,/O!2^160>rl,!O!,Ph,-5'-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenvalerate;MW:419.91;EXA:-
+CAT:pesticide;EN:Fenvalerate;MW:419.91;EXA:1
:
-<30,Ph,6:/Cl,@3,\,/?!,!,?O,!O!,/CN,!Ph,-4:/O+!Ph>rl
+<30,Ph,6:/Cl,@3,!,/?!,!?O,!O!,/CN,!Ph,-4:/O'!Ph>rl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenpropathrin;MW:349.4;EXA:-
+CAT:pesticide;EN:Fenpropathrin;MW:349.4;EXA:1
:
-<-30,?3,{1^35,2^-35}:*/_,{1^-35,2^35}:/*_,@3,\,?O,!O!,/CN,!Ph,-4:/O!+Ph>rl
+<-30,?3,{1^35'2^-35}:?w,{1^-35'2^35}:?z,@3,!?O,!O!,/CN,!Ph,-4:/O!'Ph>rl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Fenpropimorph;MW:303.49;EXA:1
:
-<30,?6,3:N,6:O,{1,5}:*/_,@3,\,!?,!2,Ph,-3:/??!
+<30,?6,3:N,6:O,1'5:?w,@3,!,!?,!2,Ph,-3:/??!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Phthalide;MW:271.9;EXA:1
+CAT:pesticide;EN:Butachlor;MW:311.85;EXA:1
:
-<30,Ph,3=?5,8:O,9:?O,{1,2,5,6}:/Cl
-;
-%------------------------------------------------------------------------------
-CAT:pesticide;EN:Butachlor;MW:311.85;EXA:-
-:
-<30,!4,O!2,N,/Ph+({-1,-5}:/!)`1,!,?O!2,Cl
+<30,!4,O!2,N,/Ph'(-1'-5:/!)`1,!,?O!2,Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Bupirimate;MW:316.42;EXA:1
:
-<30,Ph,{4,6}:N,1:/_,@3,\,O!,S?O?O,!,N?!,2:/!3,5:/NH!2
+<30,Ph,4'6:N,1:?,@3,!O!,S?O?O,!,N?!,2:/!3,5:/NH!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Buprofezin;MW:305.4;EXA:1
:
-<-30,?6,{1,5}:N,1:/Ph,3:S,6:?O,5:/?!,4://N+!??!
+<-30,?6,1'5:N,1:/Ph,3:S,6:?O,5:/?!,4://N'!??!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Flamprop-methyl;MW:335.8;EXA:-
+CAT:pesticide;EN:Flamprop-methyl;MW:335.8;EXA:1
:
-<30,Ph,1:/Cl,6:/F,@3,\,N,/?O!+Ph>rl,!?!,?O,!O!
+<30,Ph,1:/Cl,6:/F,@3,!N,/?O!'Ph>rl,!?!,?O,!O!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Fluacrypyrim;MW:426.392;EXA:1
:
-<30,Ph,{4,6}:N,1:/?F?F!F,5:/O+!?!,@3,\,O!2,Ph,@-1,\,|,!d,!O!,1:/?O!+O!
+<30,Ph,4'6:N,1:/?F?F!F,5:/O'!?!,@3,!,O!2,Ph,@-1,!,|,!d,!O!,1:/?O!'O!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Fluquinconazole;MW:376.2;EXA:1
:
-<30,Ph,3=?6,8=dl,{7,9}:N,6:/F,10:?O,@8,\,
- |,?5,{2,4}=dl,{1,3,5}:N,$9:/Ph+({4,6}:/Cl)
+<30,Ph,3=?6,8=dl,7'9:N,6:/F,10:?O,@8,!,|,?5,2'4=dl,1'3'5:N,$9:/Ph'(4'6:/Cl)
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Fludioxonil;MW:248.2;EXA:1
:
-<30,Ph,5=?5,{7,9}:O,{8^-40,8^40}:/F,@4,\,|,?5,{2,5}=dl,-2:NH,-4:/CN
+<30,Ph,5=?5,7'9:O,{8^-40'8^40}:/F,@4,!,|,?5,2'5=dl,-2:NH,-4:/CN
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Flucythrinate;MW:451.5;EXA:1
:
-<30,Ph,@6,\,O!,/F,!,F,@3,\,/?!,!,?O,!O!,/CN,!Ph,-4:/O!+Ph>rl
+<30,Ph,@6,!O!,/F,!,F,@3,!,/?!,!?O,!O!,/CN,!Ph,-4:/O!'Ph>rl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Flutolanil;MW:323.3;EXA:1
:
-<30,Ph,2:/?F?F!F,@3,\,?O,!NH!,Ph,-1:/O+!?!
+<30,Ph,2:/?F?F!F,@3,!?O,!NH!,Ph,-1:/O'!?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Fluvalinate;MW:502.92;EXA:1
:
-<30,Ph,5:/Cl,1:/?F?F!F,@4,\,NH!,/?!,!,?O,!O!,/CN,!Ph,-4:/O!+Ph>rl
+<30,Ph,5:/Cl,1:/?F?F!F,@4,!NH!,/?!,!?O,!O!,/CN,!Ph,-4:/O!'Ph>rl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Flumioxazin;MW:354.337;EXA:1
:
-<30,Ph,6:/F,3=?6,-1:O,-4:N,-3:?O,@-4,\,!,!t,
- @1,\,|,?5,3=?6,3=dr,1:N,{2,5}:?O
+<30,Ph,6:/F,3=?6,-1:O,-4:N,-3:?O,@-4,!2,!t,@1,!,|,?5,3=?6,3=dr,1:N,2'5:?O
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pretilachlor;MW:311.85;EXA:-
+CAT:pesticide;EN:Pretilachlor;MW:311.85;EXA:1
:
-<30,Ph,{2,4}:/!,@3,\,N,/?O!2+Cl`1,!3,O!3
+<30,Ph,2'4:/!,@3,!N,/?O!2'Cl`1,!3,O!3
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Procymidone;MW:284.136;EXA:-
+CAT:pesticide;EN:Procymidone;MW:284.136;EXA:1
:
-?6,1:N,@3,&5,{2,6}:?O,{3,5}:/_,1:/Ph+({3,5}:/Cl)
+?6,1:N,@3,&5,2'6:?O,3'5:?,1:/Ph'(3'5:/Cl)
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Propachlor;MW:211.689;EXA:-
+CAT:pesticide;EN:Propachlor;MW:211.689;EXA:1
:
-<30,Ph,@3,\,N,/?!,!,?O!2,Cl
+<30,Ph,@3,!N,/?!,!,?O!2,Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Propazine;MW:229.7;EXA:1
:
-<30,Ph,{2,4,6}:N,5:/Cl,{1,3}:/NH+!?!
+<30,Ph,2'4'6:N,5:/Cl,1'3:/NH'!?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Propanil;MW:218.077;EXA:-
+CAT:pesticide;EN:Propanil;MW:218.077;EXA:1
:
-<30,Ph,{1,6}:/Cl,3:/NH!+?O!2
+<30,Ph,1'6:/Cl,3:/NH!'?O!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Propyzamide;MW:256.1;EXA:1
:
-<30,Ph,{1,5}:/Cl,@3,\,?O,!NH,!??!,!t
+<30,Ph,1'5:/Cl,@3,!?O,!NH,!??!,!t
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Propiconazole;MW:342.22;EXA:-
+CAT:pesticide;EN:Propiconazole;MW:342.22;EXA:1
:
-<30,Ph,{4,6}:/Cl,@3,\,!2,|,?5,{2,4}=dl,{1,2,4}:N,@$7,?5,{-1,-4}:O,-3:/!2^-15
+<30,Ph,4'6:/Cl,@3,!3,|,?5,2'4=dl,1'2'4:N,@$7,?5,-1'-4:O,-3:/!2^-15
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Prohydrojasmon;MW:254.37;EXA:-
+CAT:pesticide;EN:Prohydrojasmon;MW:254.37;EXA:1
:
-<18,?5,2:?O,3:*/!4^-12,4:/*!?O!+O!3
+<18,?5,2:?O,3:*/!4^-12,4:/*!?O!'O!3
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Bromacil;MW:261.119;EXA:1
:
-<30,?6,6=dl,3:N,1:/Br,{2,4}:?O,5:NH,6:/_,3:/?!2
+<30,?6,6=dl,3:N,1:/Br,2'4:?O,5:NH,6:?,3:/?!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Prometryn;MW:241.4;EXA:-
+CAT:pesticide;EN:Prometryn;MW:241.4;EXA:1
:
-<30,Ph,{2,4,6}:N,5:/S!,{1,3}:/NH+!?!
+<30,Ph,2'4'6:N,5:/S!,1'3:/NH'!?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Bromobutide;MW:312.2;EXA:-
+CAT:pesticide;EN:Bromobutide;MW:312.2;EXA:1
:
-<30,Ph,@3,\,??,!NH!,?O!,/Br,!??!
+<30,Ph,@3,!??,!NH!,?O!,/Br,!??!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Bromopropylate;MW:428.12;EXA:-
+CAT:pesticide;EN:Bromopropylate;MW:428.12;EXA:1
:
-<30,Ph,@3,\,!Ph,{6,11}:/Br,7:/OH^-45,@7,30,?O!,O,-60,?!
+<30,Ph,@3,!2,Ph,6'11:/Br,7:/OH^-45,@7,30,?O!,O,-60,?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Hexaconazole;MW:314.2;EXA:-
+CAT:pesticide;EN:Hexaconazole;MW:314.2;EXA:1
:
-<36,?5,{1,4}=dl,{1,3,5}:N,@3,30,!5,-4^30:/OH,@-5,-30,Ph,{-3,-1}:/Cl
+<36,?5,1'4=dl,1'3'5:N,@3,30,!5,-4^30:/OH,@-5,-30,Ph,-3'-1:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Hexazinone;MW:252.31;EXA:-
+CAT:pesticide;EN:Hexazinone;MW:252.31;EXA:1
:
-<30,?6,3=dl,{2,4,6}:N,2:/_,{1,5}:?O,6:/?6,3:/N?!
+<30,?6,3=dl,2'4'6:N,2:?,1'5:?O,6:/?6,3:/N?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Benalaxyl;MW:325.4;EXA:-
+CAT:pesticide;EN:Benalaxyl;MW:325.4;EXA:1
:
-<30,Ph,@3,\,!,?O!,N,/Ph+({-5,-1}:/_),!?!,?O,!O!
+<30,Ph,@3,!2,?O!,N,/Ph'(-5'-1:?),!?!,?O,!O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Benoxacor;MW:260.1;EXA:-
+CAT:pesticide;EN:Benoxacor;MW:260.1;EXA:1
:
-<90,Ph,3=?6,7:N,10:O,8:/_,@7,\,?O!,/Cl,!Cl
+<90,Ph,3=?6,7:N,10:O,8:?,@7,!?O!,/Cl,!Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Heptachlor;MW:373.35;EXA:1
:
-<30,?6`1.3,3=?5,{6,8}=dl,@2,210~wf`1.5,&5~wb,{1,2,5,6,9,10^-210,10^-150}:/Cl
+<30,?6`1.3,3=?5,6'8=dl,@2,210~wf`1.5,&5~wb,{1'2'5'6'9'10^-210'10^-150}:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Permethrin;MW:391.30;EXA:-
+CAT:pesticide;EN:Permethrin;MW:391.30;EXA:1
:
-<-30,?3,{2^-35,2'^35}:*/_,@1,\,!d,/Cl,!Cl,@3,\,?O!,O!2,Ph,-4:/O!+Ph>rl
+<-30,?3,{2^-35'*2^35}:?w,@1,!!d,/Cl,!Cl,@3,!?O!,O!2,Ph,-4:/O!'Ph>rl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Penconazole;MW:284.184;EXA:-
+CAT:pesticide;EN:Penconazole;MW:284.184;EXA:1
:
-<30,Ph,{4,6}:/Cl,@3,\,/!2,!2,|,<30,?5,{2,4}=dl,{1,2,4}:N
+<30,Ph,4'6:/Cl,@3,!,/!2,!2,|,<30,?5,2'4=dl,1'2'4:N
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pendimethalin;MW:281.3;EXA:-
+CAT:pesticide;EN:Pendimethalin;MW:281.3;EXA:1
:
-<30,Ph,{3,5}:/NO2,{1,2}:/_,@4,\,NH,!?,!2
+<30,Ph,3'5:/NO2,1'2:?,@4,!,NH,!?,!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Benfluralin;MW:335.3;EXA:1
:
-<30,Ph,{1,3}:/NO2,5:/?F?F!F,2:/N?2+!4
+<30,Ph,1'3:/NO2,5:/?F?F!F,2:/N?2'!4
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Benfuresate;MW:256.3;EXA:1
:
-<30,Ph,3=?5,7:O,9:??,@6,\,O!,S?O?O,!2
+<30,Ph,3=?5,7:O,9:??,@6,!O!,S?O?O,!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Bensulide;MW:397.5;EXA:1
:
-<30,!?!,O!,P,//S,/O+!?!^160>rl,!,S!3,NH!,S?O?O,!Ph
+<30,!?!,O!,P,?S,/O'!?!^160>rl,!,S!3,NH!,S?O?O,!Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Myclobutanil;MW:288.8;EXA:-
+CAT:pesticide;EN:Myclobutanil;MW:288.8;EXA:1
:
-<36,?5,{1,4}=dl,{1,3,5}:N,@3,30,!,/CN^30,/Ph+(4:/Cl)^-30,!4
+<36,?5,1'4=dl,1'3'5:N,@3,30,!,/CN^30,/Ph'(4:/Cl)^-30,!4
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Methoxychlor;MW:345.644;EXA:-
+CAT:pesticide;EN:Methoxychlor;MW:345.644;EXA:1
:
-<30,Ph,@3,\,!Ph,{6,11}:/O!,7:/?Cl?Cl!Cl
+<30,Ph,@3,!2,Ph,6'11:/O!,7:/?Cl?Cl!Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Metolachlor;MW:283.8;EXA:-
+CAT:pesticide;EN:Metolachlor;MW:283.8;EXA:1
:
-<30,Ph,5:/!,3:/_,@4,\,N,/?!2+O!,!,?O!2,Cl
+<30,Ph,5:/!,3:?,@4,!N,/?!2'O!,!,?O!2,Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Mefenacet;MW:298.4;EXA:-
+CAT:pesticide;EN:Mefenacet;MW:298.4;EXA:1
:
-<12,Ph,3=?5,9=dl,9:N,7:S,@8,\,O!2,?O!,N?!,Ph
+<12,Ph,3=?5,9=dl,9:N,7:S,@8,!,O!2,?O!,N?!,Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Mefenpyr-diethyl;MW:373.23;EXA:-
+CAT:pesticide;EN:Mefenpyr-diethyl;MW:373.23;EXA:1
:
-<18,?5,5=dl,{4,5}:N,3^65:/_,{1^12,3^-12}:/?O!+O!2,@4,-24,Ph,{-3,-1}:/Cl
+<18,?5,5=dl,4'5:N,3^65:?,{1^12'3^-12}:/?O!'O!2,@4,-24,Ph,-3'-1:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Mepronil;MW:269.3;EXA:-
+CAT:pesticide;EN:Mepronil;MW:269.3;EXA:1
:
-<30,Ph,2:/_,@3,\,?O,!NH!,Ph,-2:/O+!?!
+<30,Ph,2:?,@3,!?O,!NH!,Ph,-2:/O'!?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Molinate;MW:187.3;EXA:1
:
-<47,?7,3:N,@3,\,?O!,S!2
+<47,?7,3:N,@3,!?O!,S!2
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Resmethrin;MW:338.4;EXA:1
:
-<-30,?3,{2^-35,2'^35}:*/_,@1,\,!d,?!,3:/?O!+O!2,|,?5,{3,5}=dl,2:O,3:/!Ph
+<-30,?3,{2^-35'*2^35}:?w,@1,!!d,?!,3:/?O!'O!2,|,?5,3'5=dl,2:O,3:/!Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Lenacil;MW:234.3;EXA:-
+CAT:pesticide;EN:Lenacil;MW:234.3;EXA:1
:
-<30,?6,3=?5,3=dl,6:N,2:NH,{1,5}:?O,6:/?6
+<30,?6,3=?5,3=dl,6:N,2:NH,1'5:?O,6:/?6
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Halfenprox;MW:477.4;EXA:1
:
-<30,Ph,@6,\,O!,/F^35,/F^-35,!,Br,@3,\,!??!,O!2,Ph,-2:/O!+Ph>rl
+<30,Ph,@6,!O!,/F^35,/F^-35,!,Br,@3,!,!??!,O!2,Ph,-2:/O!'Ph>rl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Paraquat;MW:257.16;EXA:1
:
-Ph,@4,\,Ph,{1,10}:N?,1:p_^-90,10:p_^90,@1,@(0,1.2),Cl,n_^15,
- @10,@(0,1.2),Cl,n_^15
+Ph,@4,!Ph,1'10:N?,1:p_^-90,10:p_^90,@1,@(0'1.2),Cl,n_^15,@10,@(0'1.2),Cl,n_^15
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Oxine-Copper;MW:351.852;EXA:1
:
-Ph,4:N,5=Ph,@-4,\,O,-60,<90,Cu,-90,O,60,Ph,-2=Ph,10:N,@4,&12~vf,@23,&12~vf
+Ph,4:N,5=Ph,@-4,!O,-60,<90,Cu,-90,O,60,Ph,-2=Ph,10:N,@4,&12~vf,@23,&12~vf
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Endosulfan;MW:406.904;EXA:1
:
-<26,?7,7=?6[13],@11,208~wf`1.45,&8~wb,10=dl,{3,5}:O,4:S,4:?O,
- {8,9,10,11,12^-210,12^-150}:/Cl
+<26,?7,7=#1.3'?6,@11,208~wf`1.45,&8~wb,10=dl,3'5:O,4:S,4:?O,
+ {8'9'10'11'12^-210'12^-150}:/Cl
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Uniconazole-P;MW:291.779;EXA:1
:
-<30,Ph,6:/Cl,@3,\,!d,!,/OH,!??!,@8,\,|,?5,{2,4}=dl,{1,2,4}:N
+<30,Ph,6:/Cl,@3,!!d,!,/OH,!??!,@8,!,|,?5,2'4=dl,1'2'4:N
+;
+%------------------------------------------------------------------------------
+CAT:pesticide;EN:Dimesulfazet;MW:336.33;EXA:1
+:
+<-60,Ph,@3,!2,?4,-4:N,-2:??,-3:?O,@4,30,NH!,S?O?O,!,?F?F!F
;
%******************************************************************************
-CAT:pesticide;EN:Azinphos-methyl;MW:317.318;EXA:-
+CAT:pesticide;EN:Azinphos-methyl;MW:317.318;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,S!2,|,?6,-3=?6,{2,4,8,10}=dl,{1:3}:N,6:?O
+<-30,!O!,P,?S,/O!^160,!,S!2,|,?6,-3=?6,2'4'8'10=dl,1'3:N,6:?O
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Azoxystorbin;MW:403.394;EXA:1
:
-<30,Ph,2:/CN,@3,\,O,!Ph,{-1,-3}:N,@-4,\,O,!Ph,@-5,\,//!O!,!,?O!,O!
+<30,Ph,2:/CN,@3,!O!,Ph,-1'-3:N,@-4,!O!,Ph,@-5,!,//!O!,!?O!,O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Aramite;MW:334.859;EXA:-
+CAT:pesticide;EN:Aramite;MW:334.859;EXA:1
:
-<30,Ph,6:/??!,@3,\,O!2,?!,O!,S,?O,!,O!3,Cl
+<30,Ph,6:/??!,@3,!,O!2,?!,O!,S,?O,!,O!3,Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Aldicarb;MW:190.3;EXA:-
+CAT:pesticide;EN:Aldicarb;MW:190.3;EXA:1
:
-<-30,!,S,!,??,!,!d,N,!O!,?O,!NH!
+<-30,!,S,!??,!!d,N,!O!,?O,!NH!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Aldoxycarb;MW:222.3;EXA:-
+CAT:pesticide;EN:Aldoxycarb;MW:222.3;EXA:1
:
-<30,!,?O,!NH!,O!,N,!d,!,??,!,S?O?O,!
+<30,!?O,!NH!,O!,N,!d,!??,!,S?O?O,!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Isoxaflutole;MW:359.319;EXA:-
+CAT:pesticide;EN:Isoxaflutole;MW:359.319;EXA:1
:
-<30,Ph,6:/?F?F!F,@4,\,S?O?O,!,@3,\`1,?O,!`1,<-12,|,?5,{1,4}=dl,3:O,4:N,2:/?3
+<30,Ph,6:/?F?F!F,@4,!,S?O?O,!,@3,!`1,?O,!`1,<-12,|,?5,1'4=dl,3:O,4:N,2:/?3
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Iprovalicarb;MW:320.4;EXA:-
+CAT:pesticide;EN:Iprovalicarb;MW:320.4;EXA:1
:
-<30,Ph,6:/_,@3,\,!?!,NH!,?O!,??,!NH!,?O!,O,!?!
+<30,Ph,6:?,@3,!,!?!,NH!,?O!,??,!NH!,?O!,O,!?!
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Imazalil;MW:297.2;EXA:1
:
-<-30,!,/Ph+({4,6}:/Cl),!,O!2,!d,@1,60,|,?5,{2,4}=dl,{1,3}:N
+<-30,!,/Ph'(4'6:/Cl),!,O!2,!d,@1,60,|,?5,2'4=dl,1'3:N
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Imidacloprid;MW:255.662;EXA:1
:
-<30,Ph,1:N,6:/Cl,@3,\,!,|,?5,1:N,3:NH,2://N+!NO2
+<30,Ph,1:N,6:/Cl,@3,!2,|,?5,1:N,3:NH,2://N'!NO2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Indanofan;MW:340.80;EXA:-
+CAT:pesticide;EN:Indanofan;MW:340.80;EXA:1
:
-<30,Ph,3=?5,{7,9}:?O,8^55>lr:/!,@8,-30,!2,Ph,-2:/Cl,@11,?3,-2:O
+<30,Ph,3=?5,7'9:?O,8^55>lr:/!,@8,-30,!2,Ph,-2:/Cl,@11,?3,-2:O
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Indoxacarb;MW:527.837;EXA:-
+CAT:pesticide;EN:Indoxacarb;MW:527.837;EXA:1
:
-<-6,Ph,3=?5,9=?6,15=dl,10:O,{12,13}:N,1:/Cl,8`1^-54:/?O!+O!,
- @12,\,?O!,N,/?O!+O!,!Ph,-3:/O!+?F?F!F
+<-6,Ph,3=?5,9=?6,15=dl,10:O,12'13:N,1:/Cl,
+ @12,!?O!,N,!Ph,-3:/O!'?F?F!F,{8^-54`1'15}:/?O!'O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Oxamyl;MW:219.3;EXA:-
+CAT:pesticide;EN:Oxamyl;MW:219.3;EXA:1
:
<-30,!,N?!,?O!,/S!,!d,N,!O!,?O!,NH!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Oryzalin;MW:346.4;EXA:-
+CAT:pesticide;EN:Oryzalin;MW:346.4;EXA:1
:
-<30,Ph,{1,3}:/NO2,5:/S?O?O+!NH2,2:/N?2+!3
+<30,Ph,1'3:/NO2,5:/S?O?O'!NH2,2:/N?2'!3
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Carbaryl;MW:201.22;EXA:-
+CAT:pesticide;EN:Carbaryl;MW:201.22;EXA:1
:
-<30,Ph,5=Ph,@4,\,?O,!O!,NH!
+<30,Ph,5=Ph,@4,!?O,!O!,NH!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Carpropamid;MW:334.665;EXA:-
+CAT:pesticide;EN:Carpropamid;MW:334.665;EXA:1
:
-<-30,?3,1:/_,{2^-35,2'^35}:*/Cl,3^70:/!,@3,\,?O!,NH,!?!,Ph,-3:/Cl
+<-30,?3,1:?,{2^-35'*2^35}:*/Cl,3^70:/!,@3,!?O!,NH,!?!,Ph,-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Cumyluron;MW:302.802;EXA:-
+CAT:pesticide;EN:Cumyluron;MW:302.802;EXA:1
:
-<30,Ph,@4,\,??,!NH!,?O!,NH,!2,Ph,-1:/Cl
+<30,Ph,@4,!??,!NH!,?O!,NH,!2,Ph,-1:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Cloquintocet-methyl;MW:335.83;EXA:-
+CAT:pesticide;EN:Cloquintocet-methyl;MW:335.83;EXA:1
:
-<90,Ph,4=Ph,2:N,10:/Cl,@7,\,O!2,?O!,O,!?,!5
+<90,Ph,4=Ph,2:N,10:/Cl,@7,!,O!2,?O!,O,!?,!5
;
%------------------------------------------------------------------------------
CAT:pesticide;EN:Clotianidin;MW:249.673;EXA:1
:
-<6,?5,{3,5}=dl,2:S,5:N,1:/Cl,@3,\,!NH!,/NH!,!d,N,!NO2
+<6,?5,3'5=dl,2:S,5:N,1:/Cl,@3,!2,NH!,/NH!,!d,N,!NO2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Chromafenozide;MW:394.515;EXA:-
+CAT:pesticide;EN:Chromafenozide;MW:394.515;EXA:1
:
-<30,?6,3=?6,5:O,{7,9,11}=dl,7:/_,@8,\,?O,!NH!,N,/??!,!,?O,!Ph,{-4,-3}:/_
+<30,?6,3=?6,5:O,7'9'11=dl,7:?,@8,!?O,!NH!,N,/??!,!?O,!Ph,-4'-3:?
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Clomeprop;MW:324.2;EXA:-
+CAT:pesticide;EN:Clomeprop;MW:324.2;EXA:1
:
-<30,Ph,{4,6}:/Cl,5:/_,@3,\,O,!?!,?O,!NH!,Ph
+<30,Ph,4'6:/Cl,5:?,@3,!O,!?!,?O,!NH!,Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Chloridazon;MW:221.6;EXA:-
+CAT:pesticide;EN:Chloridazon;MW:221.6;EXA:1
:
-<30,?6,{3,4}:N,{2,6}=dl,5:?O,1:/NH2,6:/Cl,4:/Ph
+<30,?6,3'4:N,2'6=dl,5:?O,1:/NH2,6:/Cl,4:/Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Chloroxuron;MW:290.745;EXA:-
+CAT:pesticide;EN:Chloroxuron;MW:290.745;EXA:1
:
-<30,Ph,6:/Cl,@3,\,O,!Ph,@-3,\,NH!,?O!,N?!
+<30,Ph,6:/Cl,@3,!O!,Ph,@-3,!NH!,?O!,N?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Cyazofamid;MW:324.783;EXA:-
+CAT:pesticide;EN:Cyazofamid;MW:324.783;EXA:1
:
-<18,?5,{2,5}=dl,{2,4}:N,1:/Cl,3:/CN,@4,\,S?O?O,!,N?!,5:/Ph+(4:/_)
+<18,?5,2'5=dl,2'4:N,1:/Cl,3:/CN,@4,!,S?O?O,!,N?!,@5,!Ph,-3:?
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Diuron;MW:233.1;EXA:-
+CAT:pesticide;EN:Diuron;MW:233.1;EXA:1
:
-<30,Ph,{1,6}:/Cl,@3,\,NH!,?O!,N?!
+<30,Ph,1'6:/Cl,@3,!NH!,?O!,N?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Cyflufenamid;MW:412.36;EXA:-
+CAT:pesticide;EN:Cyflufenamid;MW:412.36;EXA:1
:
-<30,Ph,4^20:/?F?F!F,{1,2}:/F,@3,\,!NH!,?O!2,Ph,@-10,\\,N,!,<-12,O!2,?3
+<30,Ph,4^20:/?F?F!F,1'2:/F,@3,!2,NH!,?O!2,Ph,@-10,!d,N!,<-12,O!2,?3
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Diflubenzuron;MW:310.7;EXA:-
+CAT:pesticide;EN:Diflubenzuron;MW:310.7;EXA:1
:
-<30,Ph,{2,4}:/F,@3,\,?O,!NH!,?O,!NH!,Ph,-3:/Cl
+<30,Ph,2'4:/F,@3,!?O,!NH!,?O,!NH!,Ph,-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Cyprodinil;MW:225.295;EXA:-
+CAT:pesticide;EN:Cyprodinil;MW:225.295;EXA:1
:
-<30,Ph,{2,4}:N,5:/_,1:/?3,3:/NH!+Ph
+<30,Ph,2'4:N,5:?,1:/?3,3:/NH!'Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Simeconazole;MW:293.417;EXA:-
+CAT:pesticide;EN:Simeconazole;MW:293.417;EXA:1
:
-<36,?5,{1,3,5}:N,{1,4}=dl,@3,30,!,/OH^30,!2,Si,??!,7:/Ph+(4:/F)^-30,
+<36,?5,1'3'5:N,1'4=dl,@3,30,!,/OH^30,!2,Si,??!,7^-30:/Ph'(4:/F),
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Dimethirimol;MW:209.29;EXA:-
+CAT:pesticide;EN:Dimethirimol;MW:209.29;EXA:1
:
-<30,?6,{3,5}=dl,1:?O,2:NH,3:/N?!,4:N,5:/_,6:/??!
+<30,?6,3'5=dl,1:?O,2:NH,3:/N?!,4:N,5:?,6:/??!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Dimethomorph;MW:387.86;EXA:-
+CAT:pesticide;EN:Dimethomorph;MW:387.86;EXA:1
:
-<30,?6,1:O,4:N,@4,\,?O!,!d`1,/Ph+(4:/Cl),!,|,Ph,{4,5}:/O!
+<30,?6,1:O,4:N,@4,!?O!,!d`1,/Ph'(4:/Cl),!,|,Ph,4'5:/O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Silafluofen;MW:408.588;EXA:-
+CAT:pesticide;EN:Silafluofen;MW:408.588;EXA:1
:
-<30,Ph,@5,\,O,!Ph,-1:/F,@10,\,!3,Si,??,!Ph,-3:/O!2
+<30,Ph,@5,!O!,Ph,-1:/F,@10,!4,Si,??,!Ph,-3:/O!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Di-allate;MW:270.212;EXA:-
+CAT:pesticide;EN:Di-allate;MW:270.212;EXA:1
:
-<-30,!?!,N,!,?O!,S,!2,!d,!Cl,3:/?!,7:/Cl
+<-30,!?!,N!,?O!,S,!2,!d,!Cl,3:/?!,7:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Daimuron;MW:268.4;EXA:-
+CAT:pesticide;EN:Daimuron;MW:268.4;EXA:1
:
-<30,Ph,@4,\,??,!NH!,?O,!NH!,Ph,-3:/_
+<30,Ph,@4,!??,!NH!,?O,!NH!,Ph,-3:?
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Thiacloprid;MW:252.72;EXA:-
+CAT:pesticide;EN:Thiacloprid;MW:252.72;EXA:1
:
-<30,Ph,1:N,6:/Cl,@3,\,!,<-12,|,?5,1:N,3:S,-4://N+!CN
+<30,Ph,1:N,6:/Cl,@3,!2,<-12,|,?5,1:N,3:S,-4://N'!CN
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Thiabendazole;MW:201.247;EXA:-
+CAT:pesticide;EN:Thiabendazole;MW:201.247;EXA:1
:
-<30,Ph,3=?5,8=dl,9:NH,7:N,@8,\,|,?5,{1,4}=dl,3:S,5:N
+<30,Ph,3=?5,8=dl,9:NH,7:N,@8,!,|,?5,1'4=dl,3:S,5:N
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Thiamethoxam;MW:291.71;EXA:-
+CAT:pesticide;EN:Thiamethoxam;MW:291.71;EXA:1
:
-<30,?6,2:O,{4,6}:N,6:/_,@5,\\,N,!NO2,@4,\,!,|,?5,{1,3}=dl,3:N,5:S,4:/Cl
+<30,?6,2:O,4'6:N,6:?,@5,!dm,N,!NO2,@4,!2,|,?5,1'3=dl,3:N,5:S,4:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Tebuthiuron;MW:228.3;EXA:-
+CAT:pesticide;EN:Tebuthiuron;MW:228.3;EXA:1
:
-<18,?5,{3,5}=dl,{4,5}:N,2:S,1:/??!,@3,\,N?!,?O,!NH!
+<18,?5,3'5=dl,4'5:N,2:S,1:/??!,@3,!,N?!,?O,!NH!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Tebufenozide;MW:352.5;EXA:-
+CAT:pesticide;EN:Tebufenozide;MW:352.5;EXA:1
:
-<30,Ph,6:/!,@3,\,?O,!NH!,N,/??!,!,?O,!Ph,{-4,-2}:/_
+<30,Ph,6:/!,@3,!?O,!NH!,N,/??!,!?O,!Ph,-4'-2:?
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Teflubenzuron;MW:381.1;EXA:-
+CAT:pesticide;EN:Teflubenzuron;MW:381.1;EXA:1
:
-<30,Ph,{2,4}:/F,@3,\,?O,!NH!,?O,!NH!,|,Ph,{3,5}:/Cl,{4,6}:/F
+<30,Ph,2'4:/F,@3,!?O,!NH!,?O,!NH!,|,Ph,3'5:/Cl,4'6:/F
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Tridemorph;MW:297.5;EXA:-
+CAT:pesticide;EN:Tridemorph;MW:297.5;EXA:1
:
-<30,?6,3:N,6:O,{1,5}:/_,3:/!12
+<30,?6,3:N,6:O,1'5:?,3:/!12
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Triflumuron;MW:358.701;EXA:-
+CAT:pesticide;EN:Triflumuron;MW:358.701;EXA:1
:
-<30,Ph,4:/Cl,@3,\,?O,!NH!,?O,!NH!,Ph,-2:/O!+?F?F!F
+<30,Ph,4:/Cl,@3,!?O,!NH!,?O,!NH!,Ph,-2:/O!'?F?F!F
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Naproanilide;MW:291.35;EXA:-
+CAT:pesticide;EN:Naproanilide;MW:291.35;EXA:1
:
-<30,Ph,4=Ph,@8,\,O,!?!,?O,!NH!,Ph
+<30,Ph,4=Ph,@8,!O,!?!,?O,!NH!,Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Novaluron;MW:492.706;EXA:-
+CAT:pesticide;EN:Novaluron;MW:492.706;EXA:1
:
-<30,Ph,{2,4}:/F,@3,\,?O,!NH!,?O,!NH!,
- Ph,-4:/Cl,@-3,\,O!,/F^-35,/F^35,!,/F,!O!,?F?F!F
+<30,Ph,2'4:/F,@3,!?O,!NH!,?O,!NH!,
+ Ph,-4:/Cl,@-3,!O!,/F^-35,/F^35,!,/F,!O!,?F?F!F
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pyraclostrobin;MW:387.817;EXA:-
+CAT:pesticide;EN:Pyraclostrobin;MW:387.817;EXA:1
:
-<30,Ph,@3,\,!O!,<12,|,?5,{2,5}=dl,{4,5}:N,
- @4,12,Ph,-3:/Cl,||,@2,\,N,/O!,!?O,!O!
+<30,Ph,@3,!2,O!,<12,|,?5,2'5=dl,4'5:N,@4,12,Ph,-3:/Cl,||,@2,!N,/O!,!?O,!O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pirimicarb;MW:238.291;EXA:-
+CAT:pesticide;EN:Pirimicarb;MW:238.291;EXA:1
:
-<30,Ph,{1,5}:N,{2,3}:/_,6:/N?!,@4,\,O!,?O!,N?!
+<30,Ph,1'5:N,2'3:?,6:/N?!,@4,!O!,?O!,N?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenoxycarb;MW:301.35;EXA:-
+CAT:pesticide;EN:Fenoxycarb;MW:301.35;EXA:1
:
-<30,Ph,@5,\,O,!Ph,@-3,\,O!3,NH!,?O!,O!2
+<30,Ph,@5,!O!,Ph,@-3,!,O!3,NH!,?O!,O!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenobucarb;MW:207.3;EXA:-
+CAT:pesticide;EN:Fenobucarb;MW:207.3;EXA:1
:
-<30,Ph,5:/?!2,@4,\,O!,?O,!NH!
+<30,Ph,5:/?!2,@4,!O!,?O,!NH!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Ferimzone;MW:254.337;EXA:-
+CAT:pesticide;EN:Ferimzone;MW:254.337;EXA:1
:
-<30,Ph,4:/_,@3,\,/_,!d,N,!NH!,|,Ph,{2,6}:N,{3,5}:/_
+<30,Ph,4:?,@3,!?,!d,N,!NH!,|,Ph,2'6:N,3'5:?
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenamidone;MW:311.403;EXA:-
+CAT:pesticide;EN:Fenamidone;MW:311.403;EXA:1
:
-<18,?5,4=dl,{3,5}:N,2:?O,@3,\,NH!,Ph,4:/S!,1^52:*/_,1^-48:/*Ph
+<18,?5,4=dl,3'5:N,2:?O,@3,!NH!,Ph,4:/S!,1^52:?w,1^-48:/*Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fenpyroximate;MW:421.49;EXA:-
+CAT:pesticide;EN:Fenpyroximate;MW:421.49;EXA:1
:
-<-6,?5,{3,5}=db,{1,2}:N,{2,5}:/_,@3,-15,O,!Ph,
- @4,\,!d,N!,O!2,Ph,@-3,\,?O,-60,O,!4
+<-6,?5,3'5=db,1'2:N,2'5:?,@3,-15,O,!Ph,@4,!!d,N!,O!2,Ph,@-3,!?O,!O,!4
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Phenmedipham;MW:300.32;EXA:-
+CAT:pesticide;EN:Phenmedipham;MW:300.32;EXA:1
:
-<30,Ph,5:/_,@3,\,NH!,?O!,O,!Ph,-4:/NH!+?O!+O!
+<30,Ph,5:?,@3,!NH!,?O!,O,!Ph,-4:/NH!'?O!'O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Butafenacil;MW:474.817;EXA:-
+CAT:pesticide;EN:Butafenacil;MW:474.817;EXA:1
:
-<30,?6,6=dl,{3,5}:N,{2,4}:?O,6:/?F?F!F,
- 3:/Ph+(4:/Cl),@-2,\,?O,!O!,??,!,?O!,O!2,!d
+<30,?6,5=dl,1'3:N,1:?,2'4:?O,6:/?F?F!F,@3,!Ph,-3:/Cl,
+ @-2,!?O,!O!,??!,?O!,O!2,!d
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Flufenacet;MW:363.331;EXA:-
+CAT:pesticide;EN:Flufenacet;MW:363.331;EXA:1
:
-<6,?5,{2,5}=dl,{1,2}:N,4:S,5:/?F?F!F,@3,\,O!,-60,?O!,N,/?!,!Ph,-3:/F
+<6,?5,2'5=dl,1'2:N,4:S,5:/?F?F!F,@3,!O!,!?O!,N,/?!,!Ph,-3:/F
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Flufenoxuron;MW:488.77;EXA:-
+CAT:pesticide;EN:Flufenoxuron;MW:488.77;EXA:1
:
-<30,Ph,{2,4}:/F,@3,\,?O,!NH!,?O,!NH!,Ph,-1:/F,@-3,\,O,!Ph,-3:/?F?F!F,-1:/Cl
+<30,Ph,2'4:/F,@3,!?O,!NH!,?O,!NH!,Ph,-1:/F,@-3,!O!,Ph,-3:/?F?F!F,-1:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Fluridone;MW:329.3;EXA:-
+CAT:pesticide;EN:Fluridone;MW:329.3;EXA:1
:
-<30,?6,{3,6}=dl,2:N,2:/_,5:?O,@4,\,Ph,-4:/?F?F!F,6:/Ph
+<30,?6,3'6=dl,2:N,2:?,5:?O,@4,!Ph,-4:/?F?F!F,6:/Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Propaquizafop;MW:443.884;EXA:-
+CAT:pesticide;EN:Propaquizafop;MW:443.884;EXA:1
:
-<90,Ph,3=?6,{8,10}=dl,{7,10}:N,1:/Cl,
- @8,\,O,!Ph,@-3,\,O,!?!,?O,!O,!3,O!,N,!dr,?!
+<90,Ph,3=?6,8'10=dl,7'10:N,1:/Cl,@8,!O!,Ph,@-3,!O,!?!,?O,!O,!3,O!,N,!dr,?!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Hexaflumuron;MW:461.14;EXA:-
+CAT:pesticide;EN:Hexaflumuron;MW:461.14;EXA:1
:
-<30,Ph,{2,4}:/F,@3,\,?O,!NH!,?O,!NH!,
- |,Ph,{3,5}:/Cl,@4,\,O!,/F^-35,/F^35,!,/F,!F
+<30,Ph,2'4:/F,@3,!?O,!NH!,?O,!NH!,|,Ph,3'5:/Cl,@4,!O!,/F^-35,/F^35,!,/F,!F
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Hexathiazox;MW:352.877;EXA:-
+CAT:pesticide;EN:Hexathiazox;MW:352.877;EXA:1
:
-<30,?6,@3,\,NH!,?O!,<-24,|,?5,1:N,3:S,2:?O,5:/_,4:/Ph+(4:/Cl)
+<30,?6,@3,!NH!,?O!,<-24,|,?5,1:N,3:S,2:?O,5:?,@4,!Ph,-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pencycuron;MW:328.84;EXA:-
+CAT:pesticide;EN:Pencycuron;MW:328.84;EXA:1
:
-<30,Ph,6:/Cl,@3,\,!N,/?5,!,?O,!NH!,Ph
+<30,Ph,6:/Cl,@3,!2,N,/?5,!?O,!NH!,Ph
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Bendiocarb;MW:223.228;EXA:-
+CAT:pesticide;EN:Bendiocarb;MW:223.228;EXA:1
:
-<30,Ph,5=?5,{7,9}:O,8:??,@4,\,O!,?O,!NH!
+<30,Ph,5=?5,7'9:O,8:??,@4,!O!,?O,!NH!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Pentoxazone;MW:353.774;EXA:-
+CAT:pesticide;EN:Pentoxazone;MW:353.774;EXA:1
:
-<66,?5,5://?!,1:O,3:N,{2,4}:?O,@3,\,|,Ph,4:/Cl,6:/F,3:/O!+?5
+<66,?5,5://?!,1:O,3:N,2'4:?O,@3,!,|,Ph,4:/Cl,6:/F,3:/O!'?5
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Boscalid;MW:343.21;EXA:-
+CAT:pesticide;EN:Boscalid;MW:343.21;EXA:1
:
-<30,Ph,5:N,4:/Cl,@3,\,?O,!NH!,Ph,-1:/Ph+(4:/Cl)
+<30,Ph,5:N,4:/Cl,@3,!?O,!NH!,Ph,@-1,!Ph,-3:/Cl
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Methabenzthiazuron;MW:221.3;EXA:-
+CAT:pesticide;EN:Methabenzthiazuron;MW:221.3;EXA:1
:
-Ph,3=?5,9=dl,7:S,9:N,@8,\,N?!,?O,!NH!
+Ph,3=?5,9=dl,7:S,9:N,@8,!,N?!,?O,!NH!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Methoxyfenozide;MW:368.48;EXA:-
+CAT:pesticide;EN:Methoxyfenozide;MW:368.48;EXA:1
:
-<30,Ph,2:/_,1:/O!,@3,\,?O,!NH!,N,/??!,!,?O,!Ph,{-4,-2}:/_
+<30,Ph,2:?,1:/O!,@3,!?O,!NH!,N,/??!,!?O,!Ph,-4'-2:?
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Monolinuron;MW:214.6;EXA:-
+CAT:pesticide;EN:Monolinuron;MW:214.6;EXA:1
:
-<30,Ph,6:/Cl,@3,\,NH!,?O!,N?!,O!
+<30,Ph,6:/Cl,@3,!NH!,?O!,N?!,O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Lactofen;MW:461.78;EXA:-
+CAT:pesticide;EN:Lactofen;MW:461.78;EXA:1
:
-<30,Ph,4:/Cl,6:/?F?F!F,@3,\,O,!Ph,-3:/NO2,@-4,\,?O!,O,!?!,?O!,O!2
+<30,Ph,4:/Cl,6:/?F?F!F,@3,!O!,Ph,-3:/NO2,@-4,!?O!,O,!?!,?O!,O!2
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Linuron;MW:249.1;EXA:-
+CAT:pesticide;EN:Linuron;MW:249.1;EXA:1
:
-<30,Ph,{1,6}:/Cl,@3,\,NH!,?O!,N?!,O!
+<30,Ph,1'6:/Cl,@3,!NH!,?O!,N?!,O!
;
%------------------------------------------------------------------------------
-CAT:pesticide;EN:Lufenuron;MW:511.15;EXA:-
+CAT:pesticide;EN:Lufenuron;MW:511.15;EXA:1
:
-<30,Ph,{2,4}:/F,
- @3,\,?O,!NH!,?O,!NH!,Ph,{-1,-4}:/Cl,@-3,\,O!,/F^35,/F^-35,!,/F,!,?F?F!F
+<30,Ph,2'4:/F,
+ @3,!?O,!NH!,?O,!NH!,Ph,-1'-4:/Cl,@-3,!O!,/F^35,/F^-35,!,/F,!,?F?F!F
;
%******************************************************************************
-CAT:antibacterial;EN:Sulfacetamide;MW:214.239;EXA:-
+CAT:antibacterial;EN:Sulfacetamide;MW:214.239;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,?O!
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,?O!
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfatiazole;MW:255.31;EXA:-
+CAT:antibacterial;EN:Sulfatiazole;MW:255.31;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,|,?5,{1,3}=dl,2:N,5:S
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,|,?5,1'3=dl,2:N,5:S
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Chlopidol;MW:192.039;EXA:-
+CAT:antibacterial;EN:Chlopidol;MW:192.039;EXA:1
:
-<30,Ph,{1,3}:/_,2:N,{4,6}:/Cl,5:/OH
+<30,Ph,1'3:?,2:N,4'6:/Cl,5:/OH
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfadiadine;MW:250.276;EXA:-
+CAT:antibacterial;EN:Sulfadiadine;MW:250.276;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,Ph,{-5,-1}:N
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,Ph,-5'-1:N
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Levamisole;MW:204.29;EXA:-
+CAT:antibacterial;EN:Levamisole;MW:204.29;EXA:1
:
-?5,3=?5,6=dl,2:S,{4,6}:N,7:/Ph
+?5,3=?5,6=dl,2:S,4'6:N,7:/Ph
;
%------------------------------------------------------------------------------
CAT:antibacterial;EN:5-(Propylsulphonyl)-1-H-Benzimidazole-2-Amine;MW:239.29;EXA:-
@@ -2761,241 +2811,256 @@ CAT:antibacterial;EN:5-(Propylsulphonyl)-1-H-Benzimidazole-2-Amine;MW:239.29;EXA
<30,Ph,3=?6,8=dl,7:N,9:NH,6:/S!3,8:/NH2
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfapyrizine;MW:249.288;EXA:-
+CAT:antibacterial;EN:Sulfapyrizine;MW:249.288;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,Ph,-1:N
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,Ph,-1:N
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Marbofloxacin;MW:362.361;EXA:-
+CAT:antibacterial;EN:Marbofloxacin;MW:362.361;EXA:1
:
-<30,Ph,{3,2--7}=?6,9=dl,6:/F,{7,13}:N,11:O,9:/COOH,10:?O,13:/_,
- 1:/?6+(1:N)+(4:N?)
+<30,Ph,3'(2--7)=?6,9=dl,6:/F,7'13:N,11:O,9:/COOH,10:?O,13:?,@1,!,?6,-6:N,-3:N?
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfamerazine;MW:264.303;EXA:-
+CAT:antibacterial;EN:Sulfamerazine;MW:264.303;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,Ph,{-5,-1}:N,-4:/_
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,Ph,-5'-1:N,-4:?
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Trimethoprim;MW:290.323;EXA:-
+CAT:antibacterial;EN:Trimethoprim;MW:290.323;EXA:1
:
-<30,Ph,{1,5}:N,{2,6}:/NH2,3:/!Ph+({4,5,6}:/O!)
+<30,Ph,1'5:N,2'6:/NH2,3:/!Ph'(4'5'6:/O!)
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Ofloxacin;MW:361.373;EXA:-
+CAT:antibacterial;EN:Ofloxacin;MW:361.373;EXA:1
:
-<30,Ph,{3,2--7}=?6,9=dl,7:N,11:O,
- 6:/F,9:/COOH,10:?O,13:/_,1:/?6+(1:N)+(4:N?)
+<30,Ph,3'(2--7)=?6,9=dl,7:N,11:O,6:/F,9:/COOH,10:?O,13:?,1:/?6'(1:N)'(4:N?)
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Ciprofloxacin;MW:331.347;EXA:-
+CAT:antibacterial;EN:Ciprofloxacin;MW:331.347;EXA:1
:
-<30,Ph,3=?6,9=dl,7:N,6:/F,7:/?3,9:/COOH,10:?O,1:/?6+(1:N)+(4:NH)
+<30,Ph,3=?6,9=dl,7:N,6:/F,7:/?3,9:/COOH,10:?O,1:/?6'(1:N)'(4:NH)
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Enrofloxacin;MW:359.401;EXA:-
+CAT:antibacterial;EN:Enrofloxacin;MW:359.401;EXA:1
:
-<30,Ph,3=?6,9=dl,7:N,6:/F,7:/?3,9:/COOH,10:?O,1:/?6+(1:N)+(4:N?2)
+<30,Ph,3=?6,9=dl,7:N,6:/F,7:/?3,9:/COOH,10:?O,@1,!,?6,-6:N,-3:N?2
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Danofloxacin;MW:357.385;EXA:-
+CAT:antibacterial;EN:Danofloxacin;MW:357.385;EXA:1
:
<30,Ph,3=?6,9=dl,7:N,6:/F,7:/?3,9:/COOH,10:?O,
- @1,\,|,?6,@2,-200`1.1,&5,{1,4}:N,4:*/_
+ @1,!,|,?6,@2,-200`1.1,&5,1'4:N,4:?w
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Ormetoprim;MW:274.324;EXA:-
+CAT:antibacterial;EN:Ormetoprim;MW:274.324;EXA:1
:
-<30,Ph,{1,5}:N,{2,6}:/NH2,@3,\,!,|,Ph,2:/_,{4,5}:/O!
+<30,Ph,1'5:N,2'6:/NH2,@3,!2,|,Ph,2:?,4'5:/O!
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfadimidine;MW:278.33;EXA:-
+CAT:antibacterial;EN:Sulfadimidine;MW:278.33;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,|,Ph,{2,4}:N,{3,5}:/_
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,|,Ph,2'4:N,3'5:?
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Orbifloxacin;MW:395.382;EXA:-
+CAT:antibacterial;EN:Orbifloxacin;MW:395.382;EXA:1
:
-<30,Ph,3=?6,9=dl,7:N,{2,5,6}:/F,7:/?3,9:/COOH,10:?O,
- @1,\,|,?6,1:N,{3,5}:*/_,4:NH
+<30,Ph,3=?6,9=dl,7:N,2'5'6:/F,7:/?3,9:/COOH,10:?O,@1,!,|,?6,1:N,3'5:?w,4:NH
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfamethoxypyridazine;MW:280.302;EXA:-
+CAT:antibacterial;EN:Sulfamethoxypyridazine;MW:280.302;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,|,Ph,{5,6}:N,4:/O!
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,|,Ph,5'6:N,4:/O!
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sarafloxacin;MW:385.371;EXA:-
+CAT:antibacterial;EN:Sarafloxacin;MW:385.371;EXA:1
:
-<30,Ph,3=?6,9=dl,7:N,6:/F,9:/COOH,10:?O,@1,\,?6,-6:N,-3:NH,7:/Ph+(4:/F)
+<30,Ph,3=?6,9=dl,7:N,6:/F,9:/COOH,10:?O,@1,!,?6,-6:N,-3:NH,7:/Ph'(4:/F)
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Difloxacin;MW:399.398;EXA:-
+CAT:antibacterial;EN:Difloxacin;MW:399.398;EXA:1
:
-<30,Ph,3=?6,9=dl,7:N,6:/F,9:/COOH,10:?O,7:/Ph+(4:/F),1:/?6+(1:N)+(4:N?)
+<30,Ph,3=?6,9=dl,7:N,6:/F,9:/COOH,10:?O,7:/Ph'(4:/F),1:/?6'(1:N)'(4:N?)
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfamonomethoxine;MW:280.302;EXA:-
+CAT:antibacterial;EN:Sulfamonomethoxine;MW:280.302;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,|,Ph,{2,4}:N,3:/O!
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,|,Ph,2'4:N,3:/O!
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfachlorpyridazine;MW:284.723;EXA:-
+CAT:antibacterial;EN:Sulfachlorpyridazine;MW:284.723;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,|,Ph,{5,6}:N,4:/Cl
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,|,Ph,5'6:N,4:/Cl
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfadoxine;MW:310.328;EXA:-
+CAT:antibacterial;EN:Sulfadoxine;MW:310.328;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,|,Ph,{4,6}:N,{2,3}:/O!
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,|,Ph,4'6:N,2'3:/O!
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfamethoxazole;MW:253.276;EXA:-
+CAT:antibacterial;EN:Sulfamethoxazole;MW:253.276;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,|,?5,{2,5}=dl,4:O,5:N,3:/_
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,|,?5,2'5=dl,4:O,5:N,3:?
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Pirimethamin;MW:248.714;EXA:-
+CAT:antibacterial;EN:Pirimethamin;MW:248.714;EXA:1
:
-<30,Ph,6:/Cl,@3,\,Ph,{-2,-4}:N,-1:/!,{-3,-5}:/NH2
+<30,Ph,6:/Cl,@3,!Ph,-2'-4:N,-1:/!,-3'-5:/NH2
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Oxibendazole;MW:249.27;EXA:-
+CAT:antibacterial;EN:Oxibendazole;MW:249.27;EXA:1
:
-<30,Ph,3=?5,9=dl,7:NH,9:N,1:/O!3,8:/NH!+COOH
+<30,Ph,3=?5,9=dl,7:NH,9:N,1:/O!3,8:/NH!'COOH
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Oxolinic acid;MW:261.233;EXA:-
+CAT:antibacterial;EN:Oxolinic acid;MW:261.233;EXA:1
:
-<30,Ph,3=?6,6=?5,9=dl,7:N,{11,13}:O,10:?O,7:/!,9:/COOH
+<30,Ph,3=?6,6=?5,9=dl,7:N,11'13:O,10:?O,7:/!,9:/COOH
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfabenzamide;MW:276.31;EXA:-
+CAT:antibacterial;EN:Sulfabenzamide;MW:276.31;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,?O,!Ph
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,?O,!Ph
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Ethopabate;MW:237.255;EXA:-
+CAT:antibacterial;EN:Ethopabate;MW:237.255;EXA:1
:
-<30,Ph,1:/NH!+?O!,3:/O!2,4:/?O!+O!
+<30,Ph,1:/NH!'?O!,3:/O!2,4:/?O!'O!
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfadimethoxine;MW:310.33;EXA:-
+CAT:antibacterial;EN:Sulfadimethoxine;MW:310.33;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,|,Ph,{2,4}:N,{3,5}:/O!
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,|,Ph,2'4:N,3'5:/O!
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Sulfaquinoxaline;MW:300.337;EXA:-
+CAT:antibacterial;EN:Sulfaquinoxaline;MW:300.337;EXA:1
:
-<30,Ph,1:/NH2,@4,\,S?O?O,!NH!,Ph,-4=Ph,{-5,-2}:N
+<30,Ph,1:/NH2,@4,!,S?O?O,!NH!,Ph,-4=Ph,-5'-2:N
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Nalidixic acid;MW:232.239;EXA:-
+CAT:antibacterial;EN:Nalidixic acid;MW:232.239;EXA:1
:
-<30,Ph,3=?6,9=dl,{5,10}:N,6:/_,7:?O,8:/COOH,10:/!
+<30,Ph,3=?6,9=dl,5'10:N,6:?,7:?O,8:/COOH,10:/!
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Flubendazole;MW:313.288;EXA:-
+CAT:antibacterial;EN:Flubendazole;MW:313.288;EXA:1
:
-<30,Ph,3=?5,9=dl,7:NH,9:N,@1,\,O,!Ph,8:/NH!+?O!+O!
+<30,Ph,3=?5,9=dl,7:NH,9:N,@1,!?O,!Ph,-2:/F,8:/NH!'?O!'O!
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Flumequine;MW:261.225;EXA:-
+CAT:antibacterial;EN:Flumequine;MW:261.225;EXA:1
:
-<30,Ph,{3,2--7}=?6,9=dl,7:N,6:/F,9:/COOH,10:?O,13:/_
+<30,Ph,3'(2--7)=?6,9=dl,7:N,6:/F,9:/COOH,10:?O,13:?
;
%------------------------------------------------------------------------------
-34;CAT:antibacterial;EN:Sulfanitran;MW:335.334;EXA:-
+CAT:antibacterial;EN:Sulfanitran;MW:335.334;EXA:1
:
-<30,Ph,@1,\,NH!,?O!,@4,\,S?O?O,!NH!,Ph,-3:/NO2
+<30,Ph,@1,!NH!,?O!,@4,!,S?O?O,!NH!,Ph,-3:/NO2
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Xylazine;MW:220.334;EXA:-
+CAT:antibacterial;EN:Xylazine;MW:220.334;EXA:1
:
-<30,?6,3=dl,2:S,4:N,@3,\,NH!,Ph,{-5,-1}:/_
+<30,?6,3=dl,2:S,4:N,@3,!NH!,Ph,-5'-1:?
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Famphur;MW:325.3;EXA:-
+CAT:antibacterial;EN:Famphur;MW:325.3;EXA:1
:
-<-30,!O!,P,//S,/O!^160,!,O,!Ph,-3:/S?O?O!+N?!
+<-30,!O!,P,?S,/O!^160,!O!,Ph,-3:/S?O?O!'N?!
;
%------------------------------------------------------------------------------
CAT:antibacterial;EN:Lincomycin;MW:406.54;EXA:1
:
-<6,?5,5:N,5:*/_,2:*/!2,
- @3,\*,?O,!NH!,!wb,?6,-1:O,{-3',-4,-5}:*/OH,-2:/*S!,8:/?!+OH^-30>lr
+<6,?5,5:N,5:?w,2:*/!2,
+ @3,!z,?O,!NH!,!wb,?6,-1:O,*-3'-4'-5:*/OH,-2:/*S!,8:/?!'OH^-30>lr
;
%------------------------------------------------------------------------------
CAT:antibacterial;EN:2-acethylamino-5-nitrothiazole;MW:187.178;EXA:-
:
-<18,?5,{2,5}=dl,2:N,4:S,3:/NH!+?O!,5:/NO2
+<18,?5,2'5=dl,2:N,4:S,3:/NH!'?O!,5:/NO2
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Chlorsulon;MW:380.66;EXA:-
+CAT:antibacterial;EN:Chlorsulon;MW:380.66;EXA:1
:
-<30,Ph,6:/NH2,{1,3}:/S?O?O+!NH2,@4,\,/Cl,60~dl,/Cl,!Cl
+<30,Ph,6:/NH2,1'3:/S?O?O'!NH2,@4,!,/Cl,60~dl,/Cl,!Cl
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Florfenicol;MW:358.21;EXA:-
+CAT:antibacterial;EN:Florfenicol;MW:358.21;EXA:1
:
-<30,Ph,1:/S?O?O!,@4,\,/OH,!,/!F,!NH!,?O!,/Cl,!Cl
+<30,Ph,1:/S?O?O!,@4,!,/OH,!,/!F,!NH!,?O!,/Cl,!Cl
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Thiamphenicol;MW:356.22;EXA:-
+CAT:antibacterial;EN:Thiamphenicol;MW:356.22;EXA:1
:
-<30,Ph,1:/S?O?O!,@4,\,/OH,!,/!OH,!`1.1,NH,!`1.1,?O!,/Cl,!Cl
+<30,Ph,1:/S?O?O!,@4,!,/OH,!,/!OH,!`1.1,NH,!`1.1,?O!,/Cl,!Cl
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Oxadiargyl;MW:341.19;EXA:-
+CAT:antibacterial;EN:Oxadiargyl;MW:341.19;EXA:1
:
-<30,Ph,{1,3}:/Cl,6:/O!2+!t,@4,\,|,?5,2=dl,{1,2}:N,4:O,5:?O,3:/??!
+<30,Ph,1'3:/Cl,6:/O!2'!t,@4,!,|,?5,2=dl,1'2:N,4:O,5:?O,3:/??!
;
%------------------------------------------------------------------------------
-CAT:antibacterial;EN:Oxaziclomefone;MW:376.277;EXA:-
+CAT:antibacterial;EN:Oxaziclomefone;MW:376.277;EXA:1
:
-<30,?6,6=dl,4:N,2:O,1:/_,5:?O,6:/Ph,@4,\,??,!Ph,{-4,-2}:/Cl
+<30,?6,6=dl,4:N,2:O,1:?,5:?O,6:/Ph,@4,!??,!Ph,-4'-2:/Cl
;
%------------------------------------------------------------------------------
-CAT:biological;EN:Pyrrolnitrin;MW:111;EXA:-
+CAT:biological;EN:Pyrrolnitrin;MW:257.07;EXA:1
:
-<30,Ph,@3,\,?5,{8,11}=db,{1,11}:/Cl,9:NH,2:/NO2,
+<30,Ph,@3,!,?5,8'11=db,1'11:/Cl,9:NH,2:/NO2
;
%******************************************************************************
-CAT:biological;EN:Okadaic acid;MW:805.00;EXA:2
+CAT:antibiotics;EN:Vancomycin;MW:1449.25;EXA:2
:
-<30,?6,@4,?6,@-4,\,!3,<-12,?5,@-3,<-12,?6,-3=?6,@-3,*\,!3,
- ?6,@-4,?6,@6,\,!,/*_^-40,*/OH^20,!,?O!,OH,
- 3=wb,11=dl,15=dr,17=wf,19=wf,38=wb,{5,7,16,24,25,33,42}:O,
- 32:*/H^60,10:/_,{12,31,37'}:*/_,27://_,28:/OH,{3,29}:/*OH
+<-30,#1,!12,1'3'12=zf,7=wf,60,60,Ph,@-3,!O!,Ph,@-4,!O!,Ph,@-3,!,&1,
+ @7,&26,@$1,60,60,NH,60,-60,Ph,@-1,!Ph,@-2,&4,##,
+ {36'3^40'6'9'12}:?O,2'5'8'11:NH,{1'4^180'*7^-60'*10^60'*14^60'35^-60}:*/H,
+ 41'43'46:/OH,14'*35:*/OH,{17'34^15}:/Cl,38^180:*/COOH,
+ @10,-60~wf,60,?O!,NH2,@13,!w,NH!,?O!,/??!,*/H^60,!z,NH!,
+ @23,!O,!z,|,?6`.7,2:O,3^10:*/!OH,*4'5:*/OH,
+ @-1,!z,O,!wb,|,?6`.7,6:O,{*3^35'5}:?w,3^-35:/NH2,4:/*OH
;
%------------------------------------------------------------------------------
-CAT:antibiotics;EN:Vancomycin;MW:1449.25;EXA:2
+CAT:marine toxine;EN:Okadaic acid;MW:805.00;EXA:2
+:
+<30,?6,@4,?6,@-4,!4,<-12,?5,@-3,<-12,?6,-3=?6,@-3,!w,!3,
+ ?6,@-4,?6,@6,!2,?z^-40,*/OH^20,!?O!,OH,
+ 3'38=wb,11=dl,15=dr,17'19=wf,5'7'16'24'25'33'42:O,
+ 32:*/H^60,10:?,12'31'*37:?w,27:?d,28:/OH,3'29:/*OH
+;
+%------------------------------------------------------------------------------
+CAT:marine toxine;EN:Ciguatoxine-1B;MW:1111.31;EXA:2
+:
+<30,?7,-5'-3=?6,-3'-3=?7,-4=?9,-3=?7,-4=?6,-3=?8,-5=?6,-3=?7,-4=?6,@-2,?5,
+ -5=zf,-1=wb,6'19'28'32=db,2'11'12'20'21'32'33'41'42'51'52'60'64:O,
+ 1:/*H^60,3'9'13'18'22'30'34'39'43'49'53:/*H^-60,
+ {4'10'14'19'23^75'31^55'40'44'50'54}:*/H^60,
+ {35^60'*46'56'*57'58}:?w`.8,*8'36'*55'62:*/OH,
+ @1,!,!dl,!,/*OH,!2,OH
+;
+%------------------------------------------------------------------------------
+CAT:marine toxine;EN:Ciguatoxine-3C;MW:1023.25;EXA:2
+:
+<30,?7,-5'-3=?6,-3=?7,-3=?8,-5=?9,-3=?7,-4=?6,-3=?8,-5=?6,-3=?7,-4=?6,@-2,?5,
+ -5=zf,-1=wb,6'19'28'33=db,2'11'12'20'21'33'34'42'43'52'53'61'65:O,
+ {3'9'13'18^-65'22'31^-70'35^-55'40^-65'44'50'54}:/*H^-60,
+ {4'10'14'19'23^75'32^65'41'45'51'55}:*/H^60,
+ {36^60'*47'57'*58'59}:?w`.8,*8'37'*56:*/OH
+;
+%------------------------------------------------------------------------------
+CAT:marine toxine;EN:Maitotoxin;MW:3425.86;EXA:2
:
-<-30,#1,!12,{1,3,12}=zf,7=wf,60,60,Ph,@-3,\,O,!Ph,@-4,\,O,!Ph,@-3,\,&1,
- @7,&26,@$1,60,60,NH,60,-60,Ph,@-1,\,Ph,@-2,&4,##,
- {36,3^40,6,9,12}:?O,{2,5,8,11}:NH,{1,4^180,7'^-60,10'^60,14'^60,35^-60}:*/H,
- {41,43,46}:/OH,{14,35'}:*/OH,{17,34^15}:/Cl,38^180:*/COOH,
- @10,*\^-60,60,?O!,NH2,@13,*\,NH!,?O!,/??!,*/H^60,!z,NH!,
- @23,\,O,!z,|,?6`.7,2:O,3^10:*/!OH,{4',5}:*/OH,
- @-1,\*,O,!wb,|,?6`.7,6:O,{3'^35,5}:*/_,3^-35:/NH2,4:/*OH,
-;
-%------------------------------------------------------------------------------
-CAT:biological;EN:Maitotoxin;MW:3425.86;EXA:2
-:
-<55.8,?6,-4=?7 ,{-4,-3,-3,-3}=?6,@-3,\,!3,?6,{-4,-3,-3,-3}=?6,@-3,\,?6,-3=?6,
- @-3,\,!3,60,<-30,?6,-3=?6,@-3,30,<30,?6,{-3,-3}=?6,-3=?7,{-4,-3,-3}=?6,
- @-2,\,?6,-3=?6,-3=?7,{-3,-3}=?6,-3=?8,-3=dl,{-5,-3,-3,-3}=?6,
- {5,7,15,16,23,24,32,40,41,48,49,58,59,72,73,82,83,90,91,99,
- 100,107,113,114,122,123,130,131,140,141,148,149}:O,
- {1^60,2,26,28,29,51,54,61,63,68,75^60,78,109}:*/OH,
- {11,20,35,45,52,55,65,69,86}:/*OH,
- {3,8,13,17,21,33,38,42,56,70,84,92,101,106,111,128,138,142,146,150}:/*H^-60,
- {4,14,22,34,39,43,47',57',71',81,89,98,102,116,121,125,129,133}:*/H^60,
- {6,46,50,53,60,67,74}:*/H^-60,
- {9,18,85,93,112,139,143,147}:*/_^60`1,{80,88,97,108',115,120,124}:/*_^-60`1,
- @$6,\,|,!11,60~dr,-60,60,OH,{2',7,10}:*/OH,{1,3,8'}:*/_,11://_,12:/_,
- @6,\,O,30,SO3Na,
+<55.8,?6,-4=?7,-4'-3'-3'-3=?6,@-3,!4,?6,-4'-3'-3'-3=?6,@-3,!,?6,-3=?6,
+ @-3,!4,60,<-30,?6,-3=?6,@-3,30,<30,?6,-3'-3=?6,-3=?7,-4'-3'-3=?6,
+ @-2,!,?6,-3=?6,-3=?7,-3'-3=?6,-3=?8,-3=dl,-5'-3'-3'-3=?6,
+ 5'7'15'16'23'24'32'40'41'48'49'58'59'72'73'82'83'90'91'99'
+ 100'107'113'114'122'123'130'131'140'141'148'149:O,
+ {1^60'2'26'28'29'51'54'61'63'68'75^60'78'109}:*/OH,
+ 11'20'35'45'52'55'65'69'86:/*OH,
+ 3'8'13'17'21'33'38'42'56'70'84'92'101'106'111'128'138'142'146'150:/*H^-60,
+ 4'14'22'34'39'43'*47'*57'*71'81'89'98'102'116'121'125'129'133:*/H^60,
+ 6'46'50'53'60'67'74:*/H^-60,
+ 9'18'85'93'112'139'143'147:?w^60`1,80'88'97'*108'115'120'124:?z^-60`1,
+ @$6,!,|,!11,60~dr,-60,60,OH,*2'7'10:*/OH,1'3'*8:?w,11:?d,12:?,@6,!O,30,SO3Na,
@$36,-45~zf,O,30,SO3Na,
- @$150,\,|,!7,{1,2}:/*OH,4:*/_,5:/*_,7=dl
+ @$150,!,|,!7,1'2:/*OH,4:?w,5:?z,7=dl
;
%------------------------------------------------------------------------------
diff --git a/graphics/mcf2graph/mcf2graph.mp b/graphics/mcf2graph/mcf2graph.mp
index 4f38b05612..cf334bf7ec 100644
--- a/graphics/mcf2graph/mcf2graph.mp
+++ b/graphics/mcf2graph/mcf2graph.mp
@@ -1,5 +1,5 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% mcf2graph ver 5.12 Copyright (c) 2013-2024 Akira Yamaji
+% mcf2graph ver 5.19 Copyright (c) 2013-2025 Akira Yamaji
%
% Permission is hereby granted, free of charge, to any person obtaining a copy of this software
% and associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -22,84 +22,54 @@
% This package is located at : http://www.ctan.org/pkg/mcf2graph
% Suggestion or request mail to : mcf2graph@gmail.com
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-message "* This is mcf2graph ver 5.12 2024.02.25";
-tracingstats:=1; prologues:=3; warningcheck:=0;
+message "* This is mcf2graph ver 5.19 2025.02.16";
+tracingstats:=1; prologues:=3;
%-------------------------------------------------------------------------------------------------
-newinternal string EN_;
-numeric save_num[],pcode_com[][],pcode_par[][],pcode_cnt[],tbl_atom[],tbl_group[][],tbl_atom_wt[],
- tbl_atom_mi[],tbl_char_wd[],tbl_char_ht[],at_char[],mc_indent[],op_indent[],ex_indent[],
- ad_indent[],unit_lines[],info[],tbl_asc[],lenw[];
+newinternal string EN_,tempc,temps,blanks,line_s,atom_s,forbiddens,firstc,file_output;
+newinternal numeric nA,nB,nC,nD,nE,nL,nN,nP,nR,nS,nU,nX,nY,pX,pY,pcode_int;
+numeric save_num[],pcode_x[][],pcode_y[][],param_e[][],pcode_cnt[],tbl_atom[],tbl_group[][],
+ tbl_atom_wt[],tbl_atom_mi[],tbl_char_wd[],tbl_char_ht[],at_char[],mc_indent[],op_indent[],
+ ex_indent[],ad_indent[],unit_lines[],info[],tbl_asc[],lenw[];
string row[][],save_str[],tbl_atom_str[],str_tbl[],arg_s[],mc[],ex[],ad[],op[],tag[],rw[],
- lib_tag[][],lib_val[][],mc,ex,ad,op,aux_delimiter,default_library,EN,FM,MW,MI,CAT,JN,CAS,
- USE,EXA,EXB,file_input,file_output,default_temp_file,mpfont,atomfont,tempc,temps,blanks,
- sC,sI,sS,sT,sV,forbiddens;
-pair save_pair[],msize,mposition,fsize,fmargin,save_mposition,?,?wf,?zf,?w,?z,?O,?NH;
+ lib_tag[][],lib_val[][],block_s[],mc,ex,ad,op,aux_delimiter,default_library,EN,FM,MW,MI,
+ CAT,JN,CAS,USE,EXA,EXB,file_input,default_temp_file,mpfont,atomfont,numberfont;
+pair save_pair[],msize,mposition,fsize,fmargin,save_mposition;
%-------------------------------------------------------------------------------------------------
-fig_num:=str_cnt:=tbl_cnt:=mangle:=sw_frame:=sw_trimming:=sw_ext_all:=sw_abbreviate:=sw_expand:=0;
-sw_comment:=sw_output:=sw_numbering:=tag_cnt:=rw_cnt:=pcode_all:=0;
-numbering_start:=1; numbering_end:=4095;
+fig_num:=str_cnt:=tbl_cnt:=mangle:=sw_frame:=sw_trimming:=sw_ext_all:=sw_omit:=0;
+sw_comment:=sw_output:=sw_numbering:=tag_cnt:=rw_cnt:=pcode_all:=MW_n:=f_expand:=0;
%-------------------------------------------------------------------------------------------------
-aux_delimiter:=";"; blanks:= " "; forbiddens:=" &()[]{}^=;!'+,`~";
for s="No","EN","JN","MW","MI","FM","CAT","CAS","USE","EXA","EXB": tag[incr tag_cnt]:=s; endfor
-MW_n:=0; Fig:=1; Mcode:=2; Calc:=4; Info:=8; Table:=16; Report:=32; MOL2k:=64; MOL3k:=128;
-Atom:=8; Bond:=16; Group:=32; Mol:=64; Outside:=1; Inside:=2; Bothside:=Outside+Inside;
-%-------------------------------------------------------------------------------------------------
-PRS:=ASCII("(");PRE:=ASCII(")");BRS:=ASCII("{");BRE:=ASCII("}");BKS:=ASCII("[");BKE:=ASCII("]");
-CMA:=ASCII(",");EQU:=ASCII("=");AST:=ASCII("*");SLS:=ASCII("/");GTN:=ASCII("<");LTN:=ASCII(">");
-AMP:=ASCII("&");HSH:=ASCII("#");HAT:=ASCII("^");TLD:=ASCII("~");BQT:=ASCII("`");CLN:=ASCII(":");
-AMK:=ASCII("@");QUT:=ASCII("'");BAR:=ASCII("|");PLS:=ASCII("+");MIS:=ASCII("-");BLK:=ASCII(" ");
-BSL:=ASCII("\");QES:=ASCII("?");
-%-------------------------------------------------------------------------------------------------
-for s="??!","!?!","!!!","!?","?!","??","*/*","/*","*/","//","**","##","||","\\":
- rw[incr rw_cnt]:=s; lenw[rw_cnt]:=length(s); endfor
-%-------------------------------------------------------------------------------------------------
-let DIV= /; let MUL= *; let LT= <; let GT= >; let AND= &; let :: = : ; let == = =; let ef=elseif;
-let ISP=intersectionpoint; def ]]]=] ] ] enddef; let +++ = ++; let +- = +;
-%-------------------------------------------------------------------------------------------------
-def ext(text t)= sw_ext_all:=1; def EXT_ALL = t enddef; enddef;
-def ext_clear= sw_ext_all:=0; def EXT_ALL = enddef; enddef;
-def wpcs expr n= withpen pencircle scaled n enddef;
-def ppcs expr n= pickup pencircle scaled n enddef;
-def sbp(expr m,n)expr p=subpath(m*length(p),n*length(p)) of p enddef;
-def printf expr s= write s to file_output enddef;
-def warning(expr s)= message "% "&decimal(fig_num)&fdr(3)(incr warning_cnt)&")"&s; enddef;
-%-------------------------------------------------------------------------------------------------
-vardef frac primary n= n-floor n enddef;
-vardef iif(expr a,b,c)=if a: b else: c fi enddef;
-vardef subc(expr i,s)= substring(i-1,i) of s enddef;
-vardef sfrt(expr a,b,c)= a shifted ((b,0) rotated c) enddef;
-vardef fsr(expr n)(expr s)= (substring(0,n-length(s)) of blanks)&s enddef;
-vardef fsl(expr n)(expr s)= s&(substring(0,n-length(s)) of blanks) enddef;
-vardef fdr(expr n)(expr s)=
- if length(decimal(s))>n: substring (0,n) of decimal(s) else: fsr(n)(decimal(s)) fi enddef;
-vardef fdl(expr n)(expr s)= fsl(n)(decimal(s)) enddef;
+Fig:=1; Mcode:=2; Info:=4; Report:=8; MOL2k:=16; MOL3k:=32; Atom:=2; Bond:=4; All:=8;
+Group:=8; Mol:=16; Outside:=1; Inside:=2; Bothside:=Outside+Inside;
%=================================================================================================
default_library:="main_lib.mcf"; default_temp_file:="temp.mcf";
-mpfont:="uhvr8r"; atomfont:="draw"; defaultfont:=mpfont;
+mpfont:="uhvr8r"; atomfont:=numberfont:="draw"; defaultfont:=mpfont; let ef=elseif;
%--default ahangle=45---------------------------------------------------------------------
-if ahangle=1: outputformat:="png"; hppp:=vppp:=0.12; % png format(600dpi)
-ef ahangle=11: outputformat:="png"; hppp:=vppp:=0.06; % png format(1200dpi)
-ef ahangle=2: outputformat:="eps"; % eps format(.eps)
-ef ahangle=3: outputformat:="eps"; % eps format(.mps)
-ef ahangle=45: outputformat:="svg"; % svg format *default
+if ahangle=1: outputformat:="png"; hppp:=vppp:=0.12; % png format(600dpi)
+ef ahangle=11: outputformat:="png"; hppp:=vppp:=0.06; % png format(1200dpi)
+ef ahangle=2: outputformat:="eps"; % eps format(.eps)
+ef ahangle=3: outputformat:="eps"; % eps format(.mps)
+ef ahangle=45: outputformat:="svg"; % svg format *default
fi
%--default ahlength=4---------------------------------------------------------------------
-if ahlength=3: sw_output:=Fig; sw_expand:=1; % output figure(expanded)
-ef ahlength=4: sw_output:=Fig; % output figure *default
-ef ahlength=5: sw_output:=MOL2k; sw_expand:=1; % output MOL(V2000)
-ef ahlength=6: sw_output:=MOL3k; sw_expand:=1; % output MOL(V3000)
-ef ahlength=7: sw_output:=Report; % output report
+if ahlength=3: sw_output:=Fig; f_expand:=1; % output figure(expanded)
+ef ahlength=4: sw_output:=Fig; % output figure *default
+ef ahlength=5: sw_output:=MOL2k; f_expand:=1; % output MOL(V2000) ** max 500files
+ef ahlength=6: sw_output:=MOL3k; f_expand:=1; % output MOL(V3000) ** max 500files
+ef ahlength=7: sw_output:=Report; % output report
fi
%-- default bboxmargin=2------------------------------------------------------------------
if bboxmargin=3: ext(defaultfont:=mpfont; defaultscale:=.3; label.rt(EN,(0,0));)
-ef bboxmargin=4: sw_output:=Fig+Calc;
+ef bboxmargin=4: sw_output:=Fig+Report;
ext(defaultfont:=mpfont; defaultscale:=.3;
- label.rt(EN&" / "&MW&" / "&decimal(MW_n-scantokens(MW)),(0,0));) fi
+ label.rt(EN&" / "&MW&" / "&decimal(MW_n-scantokens(MW)),(0,0));)
+fi
%--default outputtemplate:="%j-%3c."&"svg"------------------------------------------------
if outputformat="svg": outputtemplate:="s%3c-%{EN_}.svg";
ef outputformat="png": outputtemplate:="p%3c-%{EN_}.png";
ef (outputformat="eps")and(ahangle=3): outputtemplate:="%j-%3c.mps";
-else: outputtemplate:="%j-%3c."&outputformat; fi
+else: outputtemplate:="%j-%3c."&outputformat;
+fi
%-----------------------------------------------------------------------------------------
message "* jobname="&jobname;
message "* numbersystem="&numbersystem;
@@ -107,19 +77,45 @@ message "* outputformat="&outputformat;
message "* outputtemplate="&outputtemplate;
if ahlength=5: message "* output MOL file(V2000)"; message "* "&jobname&"-nnn-"&"EN"&".mol";
ef ahlength=6: message "* output MOL file(V3000)"; message "* "&jobname&"-nnn-"&"EN"&".mol";
-ef ahlength=7: message "* output report file"; message "* file name="&jobname&"-report.txt"; fi
+ef ahlength=7: message "* output report file"; message "* file name="&jobname&"-report.txt";
+fi
clearit;
%-------------------------------------------------------------------------------------------------
-ratio_chain_ring:=0.66; ratio_atom_bond:=0.36; ratio_thickness_bond:=0.015;
-ratio_thickness_char:=0.1; ratio_char_bond:=1.5; ratio_bondgap_bond:=0.15;
-ratio_hashgap_bond:=0.12; ratio_hash_black:=0.4; ratio_wedge_bond:=0.12; ratio_atomgap_atom:=0.04;
-offset_thickness:=0.2; offset_bond_gap:=0.3; offset_hash_gap:=0.1; offset_atom:=0.8;
-offset_wedge:=0.4; thickness_frame:=0.2;
+ratio_chain_ring:=0.66; ratio_atom_bond:=0.36; ratio_thickness_bond:=0.012; ratio_char_atom:=0.12;
+ratio_bondgap_bond:=0.15; ratio_hashgap_bond:=0.12; ratio_hash_black:=0.4;
+ratio_wedge_bond:=0.12; ratio_atomgap_atom:=0.05; offset_thickness:=0.25; offset_bond_gap:=0.3;
+offset_hash_gap:=0.1; offset_atom:=0.8; offset_wedge:=0.2; thickness_frame:=0.2;
max_blength:=10mm; blength:=mangle:=0; max_labelsize:=20mm; dottedline_gap:=1.5;
fsize:=(30mm,20mm); fmargin:=(0.4mm,0.4mm); msize:=(1,1); mposition:=(0.5,0.5);
ahangle:=45; ahlength:=4; defaultsize:=8; defaultscale:=1; labeloffset:=3; ext_defaultline:=0.5;
lonepairdiam:=lonepairspace:=circlediam:=circlepen:=bboxmargin:=0; mc_length:=100;
-outputformatoptions:="";
+%-------------------------------------------------------------------------------------------------
+let DIV= /; let MUL= *; let LT= <; let GT= >; let AND= &; let :: = : ; let == = =; let +++ = ++;
+let ISP=intersectionpoint; def ]]]=] ] ] enddef; vardef Incr suffix $ == $:=$+1; $ enddef;
+%-------------------------------------------------------------------------------------------------
+def ext(text t)= sw_ext_all:=1; def EXT_ALL = t enddef; enddef;
+def ext_clear= sw_ext_all:=0; def EXT_ALL = enddef; enddef;
+def wpcs expr n= withpen pencircle scaled n enddef;
+def ppcs expr n= pickup pencircle scaled n enddef;
+def sbp(expr m,n)expr p=subpath(m*length(p),n*length(p)) of p enddef;
+def puts expr s= write s to file_output enddef;
+%-------------------------------------------------------------------------------------------------
+vardef frac primary n= n-floor n enddef;
+vardef iif(expr a,b,c)=if a: b else: c fi enddef;
+vardef sfrt(expr a,b,c)= a shifted ((b,0) rotated c) enddef;
+vardef fsr(expr n)(expr s)= (substring(0,n-length(s)) of blanks)&s enddef;
+vardef fsl(expr n)(expr s)= s&(substring(0,n-length(s)) of blanks) enddef;
+vardef fdr(expr n)(expr s)=
+ if length(decimal(s))>n: substring (0,n) of decimal(s) else: fsr(n)(decimal(s)) fi enddef;
+vardef fdl(expr n)(expr s)= fsl(n)(decimal(s)) enddef;
+%-------------------------------------------------------------------------------------------------
+aux_delimiter:=";"; blanks:= " "; forbiddens:=" &()[]{}^=;!'+,`~";
+for s="*/*","/*","*/","//","##","||":rw[incr rw_cnt]:=s; lenw[rw_cnt]:=length(s); endfor
+%-------------------------------------------------------------------------------------------------
+PRS:=ASCII("(");PRE:=ASCII(")");BRS:=ASCII("{");BRE:=ASCII("}");QES:=ASCII("?");DOL:=ASCII("$");
+CMA:=ASCII(",");EQU:=ASCII("=");AST:=ASCII("*");SLS:=ASCII("/");GTN:=ASCII("<");LTN:=ASCII(">");
+AMP:=ASCII("&");HSH:=ASCII("#");HAT:=ASCII("^");TLD:=ASCII("~");BQT:=ASCII("`");CLN:=ASCII(":");
+AMK:=ASCII("@");QUT:=ASCII("'");BAR:=ASCII("|");PLS:=ASCII("+");MIS:=ASCII("-");BLK:=ASCII(" ");
%=================================================================================================
pcode_emb_start:=1001; % 1001 => 1900 for embedded pcode (max 900)
pcode_emi_start:=1901; % 1901 => 2000 for embedded internal pcode (max 100)
@@ -127,24 +123,25 @@ pcode_usr_start:=2001; % 2001 => 3000 for user pcode (max 1000)
pcode_int_start:=3000; % 3001 => 4000 for internal pcode (max 1000)
%-------------------------------------------------------------------------------------------------
def def_com(expr n)(text tx)= nA:=n; forsuffixes list=tx:: list:=nA; nA:=nA+1; endfor enddef;
-def_com(-4090)(_com,_jp_atom,_jp_absA,_jp_bond,_cyc,_cyc_sB,_cyc_eB,_set_line,_tmp_line,_chg_len,
- _get_len,_ring_len,_tmp_len,_rot_ang,_adj_ang,_chg_env,_tmp_env,_set_colorA,_set_colorB,
- _group_si,_group_dm,_group_wf,_group_zf,_set_adr,_mk_bond,_set_atom,_arrange_ang,_chg_atom,
- _tmp_rot,_fuse,_size_atom,_numeric,_jump_at,_set_add,_chg_add,_nop,_mark,_moff,_term,_len_s,
- _len_e,_len_ss,_len_ee,_group_s,_group_e,_rest,_charge,_from,_until,
- si,dl,dl_,dr,dr_,db,dm,dm_,tm,wf,wb,bd,bz,zf,zb,dt,wv,nl,vf,vb,nb,wf_r,wb_r,bd_r,arc_lb,arc_br,
+def_com(-4090)(_com,_jp_atom,_jp_absA,_jp_bond,_cyc,_cyc_sB,_cyc_eB,_set_line,_tmp_line,_tmp_rot,
+ _tmp_env,_tmp_len,_chg_len,_set_len,_get_len,_ring_len,_rot_ang,_adj_ang,_chg_env,_set_colorA,
+ _set_colorB,_group_si,_group_dm,_group_wf,_group_zf,_set_adr,_mk_bond,_set_atom,_arrange_ang,
+ _chg_atom,_fuse,_fuse_ext,_size_atom,_numeric,_numeric_inv,_numeric_rot,
+ _jump_at,_set_add,_chg_add,_nop,
+ _mark,_moff,_term,_len_s,_len_e,_len_ss,_len_ee,_group_s,_group_e,_rest,_charge,_from,_until,
+ si,dl,dl_,dr,dr_,db,dm,dm_,tm,wf,wb,bd,bz,zf,zb,dt,wv,nl,vf,vb,wf_r,wb_r,bd_r,arc_lb,arc_br,
arc_lbr,arc_ltr,si_,wf_,wb_,zf_,zb_,wv_,bd_);
%-------------------------------------------------------------------------------------------------
def parameter_list=
- sw_numbering,sw_expand,sw_output,sw_ext_all,sw_frame,sw_trimming,sw_abbreviate,ratio_atom_bond,
- ratio_thickness_bond,ratio_char_bond,ratio_chain_ring,ratio_bondgap_bond,ratio_hash_black,
- ratio_hashgap_bond,ratio_thickness_char,ratio_wedge_bond,ratio_atomgap_atom,lonepairdiam,
- lonepairspace,offset_atom,offset_wedge,max_blength,offset_hash_gap,offset_bond_gap,
- thickness_frame,offset_thickness,numbering_start,numbering_end,defaultsize,defaultscale,
+ sw_numbering,sw_output,sw_ext_all,sw_frame,sw_trimming,sw_omit,ratio_atom_bond,
+ ratio_thickness_bond,ratio_chain_ring,ratio_bondgap_bond,ratio_hash_black,ratio_hashgap_bond,
+ ratio_wedge_bond,ratio_atomgap_atom,ratio_char_atom,offset_atom,offset_wedge,max_blength,
+ offset_hash_gap,offset_bond_gap,thickness_frame,offset_thickness,defaultsize,defaultscale,
labeloffset,mangle,blength,fsize,fmargin,msize,mposition,defaultfont,atomfont,dottedline_gap
enddef;
%-------------------------------------------------------------------------------------------------
-def init_par(text t)= nA:=nB:=nC:=0;
+def init_par(text t)=
+ nA:=nB:=nC:=0;
for list=t: if numeric list: save_num[incr nA]:=list;
ef pair list: save_pair[incr nB]:=list;
ef string list: save_str[incr nC]:=list;
@@ -152,7 +149,8 @@ def init_par(text t)= nA:=nB:=nC:=0;
endfor
enddef;
%-------------------------------------------------------------------------------------------------
-def store_par(text t)= nA:=nB:=nC:=0;
+def store_par(text t)=
+ nA:=nB:=nC:=0;
for list=t: if numeric list: if save_num[incr nA]<>list: save_num[nA]:=list; fi
ef pair list: if save_pair[incr nB]<>list: save_pair[nB]:=list; fi
ef string list: if save_str[incr nC]<>list: save_str[nC]:=list; fi
@@ -160,7 +158,8 @@ def store_par(text t)= nA:=nB:=nC:=0;
endfor
enddef;
%-------------------------------------------------------------------------------------------------
-def restore_par(text t)= nA:=nB:=nC:=0;
+def restore_par(text t)=
+ nA:=nB:=nC:=0;
forsuffixes list=t: if numeric list: if list<>save_num[incr nA]: list:=save_num[nA]; fi
ef pair list: if list<>save_pair[incr nB]: list:=save_pair[nB]; fi
ef string list: if list<>save_str[incr nC]: list:=save_str[nC]; fi
@@ -170,117 +169,111 @@ enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def beginfigm=
begingroup
- save ','',`,``,//,@,#,#@,##,\,\\,\*,|=,|<,**,++,_,f_ext,blen,ext,add,ang_br,fw_n,bw_n,
- info_cnt,bond_cntA,firstc,warning_cnt,hideH,hideH_cnt,cntM,cntA,cntB,
- minX,minY,maxX,maxY,posA,posM,lineB,sB,eB,angB,angA,lenB,angX,numS,sumA,bond_num,wdM,htM,
- chargeA,addA,add_rot,mol_pic,color_list,filter_s,no,mw,mi,fm;
+ save ','',`,``,//,@,#,#@,##,\,\\,\*,|=,|<,**,++,f_ext,blen,ext,add,ang_br,fw_n,bw_n,adr_n,
+ bond_cntA,unknown_cnt,unknown_s,warning_cnt,warning_s,hideH,hideH_cnt,cntM,cntA,cntB,
+ minX,minY,maxX,maxY,posA,posM,lineB,sB,eB,angB,angA,lenB,angX,numS,sumA,bond_num,wdM,htM,
+ chargeA,addA,add_rot,mol_pic,color_list,no,mw,mi,fm,group_num,f_line,f_type,ay,bx,by,pcnt;
numeric hideH[],lineB[],sB[],eB[],angB[],angA[],lenB[],angX[],strA[],sumA[],bond_num[],
- wdM[],htM[],chargeA[],addA[],add_rot[];
+ wdM[],htM[],chargeA[],addA[],add_rot[];
pair posA[],posM[][];
- string mi,no,fm,mw,firstc,filter_s;
+ string unknown_s[],warning_s[],mi,no,fm,mw;
picture mol_pic[];
color color_list[];
%-----------------------------------------------------------------------------------------------
store_par(parameter_list);
- no:=mc:=ex:=ad:=op:=temps:=mw:=mi:=fm:=filter_s:="";
+ no:=mc:=ex:=ad:=op:=mw:=mi:=fm:="";
EN:=JN:=MW:=FM:=MI:=CAS:=CAT:=EXA:=EXB:=USE:="-";
- f_ext:=cntM:=mc_row:=ex_row:=ad_row:=op_row:=info_cnt:=err_cnt:=0;
+ f_ext:=cntM:=mc_row:=ex_row:=ad_row:=op_row:=err_cnt:=param_int:=unknown_cnt:=warning_cnt:=0;
let ext=ext_to_fig; let add=add_to_molecule; let ++=add_to_molecule; let **=ext_to_fig;
- def ' = define_parts enddef; def '' = readm enddef; def \ = drawm enddef; def \\ = putm enddef;
+ def '' = define_parts enddef; def '` = readm enddef; def \ = drawm enddef; def \\ = putm enddef;
def \* = checkm enddef; def $ = getm enddef; def @ expr p = mposition:=p; enddef;
def # expr p = fsize:=p; enddef; def #@ expr p = fmargin:=p; enddef;
def `(expr s) = define_group_string(s)() enddef; def `` = define_group_string enddef;
def ## expr p = msize:=p; enddef; def |=(expr n) = blength:=n; enddef;
- def |<(expr n) = max_blength:=n; enddef; def _ expr s = EN:=s; enddef;
+ def |<(expr n) = max_blength:=n; enddef;
pcode_num:=pcode_usr_start; pcode_int:=pcode_int_start; fig_num:=fig_num+1;
mol_pic[0]:=nullpicture;
enddef;
%-------------------------------------------------------------------------------------------------
def endfigm=
- %--------------------------------------------------------------------------------------------
if cntM>=1:
- %--------------------------------------------------------------------------------------------
- if scan_bit(sw_output,Fig):
- if EN<>"-": EN_:=forbidden_to_underbar(EN); fi
- beginfig(fig_num)
- %------------------------------------------------------------------------------------------
- if sw_ext_all=1: ext_to_fig(EXT_ALL); fi
- if sw_trimming>=1:
- nA:=nC:=4095; nB:=nD:=-4095;
- for i=1 upto cntM:
- if xpart(posM[1][i])<nA: nA:=xpart(posM[1][i]); fi
- if xpart(posM[2][i])>nB: nB:=xpart(posM[2][i]); fi
- if ypart(posM[1][i])<nC: nC:=ypart(posM[1][i]); fi
- if ypart(posM[2][i])>nD: nD:=ypart(posM[2][i]); fi
- endfor
- fig_wd:=nB-nA+2xpart(fmargin); fig_ht:=nD-nC+2ypart(fmargin); fsize:=(fig_wd,fig_ht);
+ if scan_bit(sw_output,Fig)::
+ if EN<>"-": EN_:=forbidden_to_underbar(EN); else: EN_:="no_name"; fi
+ beginfig(fig_num)
+ if sw_ext_all=1: ext_to_fig(EXT_ALL); fi
+ if sw_trimming>=1:
+ nA:=nC:=4095; nB:=nD:=-4095;
+ for i=1 upto cntM:
+ if xpart(posM[1][i])<nA: nA:=xpart(posM[1][i]); fi
+ if xpart(posM[2][i])>nB: nB:=xpart(posM[2][i]); fi
+ if ypart(posM[1][i])<nC: nC:=ypart(posM[1][i]); fi
+ if ypart(posM[2][i])>nD: nD:=ypart(posM[2][i]); fi
+ endfor
+ fig_wd:=nB-nA+2xpart(fmargin); fig_ht:=nD-nC+2ypart(fmargin); fsize:=(fig_wd,fig_ht);
+ for i=1 upto cntM:
+ posM[0][i]:=posM[0][i]+fmargin-(nA,nC); posM[1][i]:=posM[1][i]+fmargin-(nA,nC);
+ endfor
+ fi
+ if scan_bit(sw_frame,Outside): draw_frame((0,0),fsize,thickness_frame);
+ else: draw_corner(fsize,0.004);
+ fi
+ if scan_bit(sw_frame,Inside): draw_frame(fmargin,fsize-2fmargin,thickness_frame); fi
for i=1 upto cntM:
- posM[0][i]:=posM[0][i]+fmargin-(nA,nC); posM[1][i]:=posM[1][i]+fmargin-(nA,nC);
+ addto currentpicture also mol_pic[i] shifted posM[0][i]; mol_pic[i]:=nullpicture;
+ if scan_bit(sw_frame,Mol): ext(draw_frame(p[i],(w[i],h[i]),thickness_frame)) fi
endfor
- fi
- %----------------------------------------------------------------------------------------
- if scan_bit(sw_frame,Outside): draw_frame((0,0),fsize,thickness_frame);
- else: draw_corner(fsize,0.004); fi
- if scan_bit(sw_frame,Inside): draw_frame(fmargin,fsize-2fmargin,thickness_frame); fi
- for i=1 upto cntM:
- addto currentpicture also mol_pic[i] shifted posM[0][i]; mol_pic[i]:=nullpicture;
- if scan_bit(sw_frame,Mol): ext(draw_frame(p[i],(w[i],h[i]),thickness_frame)) fi
- endfor
- if f_ext=1: addto currentpicture also mol_pic[0]; mol_pic[0]:=nullpicture; fi
- %-----------------------------------------------------------------------------------------
- endfig;
- clearit;
- fi
- %---------------------------------------------------------------------------------------------
- if scan_bit(sw_output,Report): proc_report_out; fi
- if scan_bit(sw_output,MOL2k): proc_mol_out(2000); fi
- if scan_bit(sw_output,MOL3k): proc_mol_out(3000); fi
- %---------------------------------------------------------------------------------------------
+ if f_ext=1: addto currentpicture also mol_pic[0]; mol_pic[0]:=nullpicture; fi
+ endfig;
+ clearit;
+ fi
ef scan_bit(sw_output,Fig):
- EN_:="no_figure";
+ if EN<>"-": EN_:=forbidden_to_underbar(EN); else: EN_:="no_name"; fi
beginfig(fig_num)
- defaultscale:=.6; draw_frame((0,0),fsize,thickness_frame) label("no figure",0.5fsize);
+ defaultscale:=.6; draw_frame((0,0),fsize,thickness_frame) label("no figure",0.5fsize);
endfig;
clearit;
fi
- %---------------------------------------------------------------------------------------------
if err_cnt=0:
- if scan_bit(sw_output,Mcode): proc_mc_out; message "["&decimal(fig_num)&"]:"&EN; fi
- if scan_bit(sw_output,Report): proc_report_out; message "["&decimal(fig_num)&"]:"&EN; fi
- if scan_bit(sw_output,MOL2k): proc_mol_out(2000); message "["&decimal(fig_num)&"]:"&EN; fi
- if scan_bit(sw_output,MOL3k): proc_mol_out(3000); message "["&decimal(fig_num)&"]:"&EN; fi
+ if scan_bit(sw_output,Mcode): proc_mc_out; fi
+ if scan_bit(sw_output,Report): proc_report_out; fi
+ if scan_bit(sw_output,MOL2k): proc_mol_out(2000); fi
+ if scan_bit(sw_output,MOL3k): proc_mol_out(3000); fi
fi
- %---------------------------------------------------------------------------------------------
restore_par(parameter_list);
endgroup;
+ message "["&decimal(fig_num)&"]EN:"&EN; message "";
enddef;
%=================================================================================================
def readm(text s)=
- save fw_n,bw_n;
for list=s:
- fw_n:=scan_char(" ",list,1,1)-1; bw_n:=scan_char(" ",list,-1,1);
- mc_indent[incr mc_row]:=fw_n; mc[mc_row]:=substring(fw_n,bw_n) of list; mc:=mc&mc[mc_row];
+ fw_n:=scan_char(" ",list,1,1)-1;
+ bw_n:=scan_char(" ",list,-1,1);
+ mc_indent[incr mc_row]:=fw_n;
+ mc[mc_row]:=substring(fw_n,bw_n) of list;
+ mc:=mc&mc[mc_row];
endfor
enddef;
%=================================================================================================
def getm(expr a)=if string a: read_unit(get_adr("EN",a)) ef numeric a: read_unit(a) fi enddef;
%-------------------------------------------------------------------------------------------------
def read_unit(expr n)=
- save nF; nF:=0;
+ f_line:=0;
if (n>=1)and(n<=ucount):
for i=1 upto info[n]:
for j=1 upto tag_cnt: if lib_tag[n][i]=tag[j]: scantokens(tag[j]):=lib_val[n][i]; fi endfor
endfor
for i=1 upto unit_lines[n]:
- temps:=row[n][i]; firstc:=subc(1,temps); exitif firstc=";";
- if firstc=":": nF:=1; ef firstc="=": nF:=2; ef firstc="*": nF:=3; ef firstc="+": nF:=4;
+ line_s:=row[n][i]; firstc:=substring(0,1) of line_s; exitif firstc=";";
+ if firstc=":": f_line:=1; ef firstc="=": f_line:=2;
+ ef firstc="*": f_line:=3; ef firstc="+": f_line:=4;
ef firstc="%":
else:
- fw_n:=scan_char(" ",temps,1,1)-1; temps:=substring(fw_n,length(temps)) of temps;
- if nF=1: mc_indent[incr mc_row]:=fw_n; mc[mc_row]:=temps; mc:=mc&temps;
- ef nF=2: op_indent[incr op_row]:=fw_n; op[op_row]:=temps; op:=op&temps;
- ef nF=3: ex_indent[incr ex_row]:=fw_n; ex[ex_row]:=temps; ex:=ex&temps;
- ef nF=4: ad_indent[incr ad_row]:=fw_n; ad[ad_row]:=temps; ad:=ad&temps;
+ fw_n:=scan_char(" ",line_s,1,1)-1;
+ line_s:=substring(fw_n,length(line_s)) of line_s;
+ if f_line=1: mc_indent[incr mc_row]:=fw_n; mc[mc_row]:=line_s; mc:=mc&line_s;
+ ef f_line=2: op_indent[incr op_row]:=fw_n; op[op_row]:=line_s; op:=op&line_s;
+ ef f_line=3: ex_indent[incr ex_row]:=fw_n; ex[ex_row]:=line_s; ex:=ex&line_s;
+ ef f_line=4: ad_indent[incr ad_row]:=fw_n; ad[ad_row]:=line_s; ad:=ad&line_s;
fi
fi
endfor
@@ -288,7 +281,7 @@ def read_unit(expr n)=
enddef;
%=================================================================================================
vardef get_adr(expr t,v)=
- save adr_n; adr_n:=0;
+ adr_n:=0;
for n=1 upto ucount:
for i=1 upto info[n]:
for j=1 upto tag_cnt: if (lib_tag[n][i]=t)and(lib_val[n][i]=v): adr_n:=n; fi endfor
@@ -306,63 +299,73 @@ def putm=
if ex_row>=1: ext(scantokens(ex)) fi
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-vardef define_parts(text t)= pcode_num:=pcode_num+-1; read_mcf(pcode_num)(t); pcode_num enddef;
-vardef abs_adress primary n = if n LT 0:: (n+-360)-4095 else:: n-4095 fi enddef;
+vardef define_parts(text t)= pcode_num:=pcode_num+1; read_mcf(pcode_num)(t); pcode_num enddef;
+vardef pcode_extend(expr p,a,b,c,d)=
+ param_e[Incr param_int][1]:=a; param_e[param_int][2]:=b;
+ param_e[param_int][3]:=c; param_e[param_int][4]:=d; (p,param_int)
+enddef;
+def move_pos(expr n) =
+ <$0,angle(pcode_y[n][1],pcode_y[n][2])~0`length(pcode_y[n][1],pcode_y[n][2]),<$0 enddef;
+def message_unknown(expr n) =
+ unknown_s[incr unknown_cnt]:="*Unknown found in block("AND decimal(n)AND")";
+ message "["AND decimal(fig_num)AND"]"AND unknown_s[unknown_cnt];
+ message "";
+enddef;
+%-------------------------------------------------------------------------------------------------
+vardef abs_adress primary n =
+ if numeric n:: if (n>=si)and(n<=bd_):: (_tmp_line,n) else:: n-4095 fi else:: _nop fi enddef;
primarydef a from_until b = (_from,a),(_until,b) enddef;
-primarydef a op_plus b = define_parts(a,b) enddef;
-tertiarydef a bond__bond b = (a,b) enddef;
-tertiarydef a bond___bond b = (a+-2000,b) enddef;
-tertiarydef a bond____bond b = (a+-2000,b+-2000) enddef;
-tertiarydef a op_equ b = if (known a)and(known b):: change_bond(a,b) else:: _nop fi enddef;
-tertiarydef a op_col b = if (known a)and(known b):: change_atom(a,b) else:: _nop fi enddef;
-tertiarydef a op_hat b = if known b:: (_tmp_rot,b),a else:: _nop,a fi enddef;
-tertiarydef a op_til b = if known b:: (_tmp_line,b),a else:: _nop,a fi enddef;
-tertiarydef a op_lth b = if known b:: (_tmp_env,b),a else:: _nop,a fi enddef;
-tertiarydef a op_bqu b = if known b:: (_tmp_len,b),a else:: _nop,a fi enddef;
-def rot_angle primary n = (_rot_ang,n) enddef; def cyc_atom primary n = (_cyc,n) enddef;
-def jump_atom_abs primary a =
- if numeric a:: (_jp_atom,$a) ef pair a:: (_jp_atom,$1),<$0,angle(a)~0`length(a),<$0 fi enddef;
-def jump_atom primary a =
- if numeric a:: (_jp_atom,a) ef pair a:: <$0,angle(a)~0`length(a),<$0 fi enddef;
-def chg_length primary n = (_com,_len_s),(_chg_len,n) enddef;
-def group_si secondary n = if known n:: (_group_si,n) else:: _nop fi enddef;
-def group_dm secondary n = if known n:: (_group_dm,n) else:: _nop fi enddef;
-def group_wf secondary n = if known n:: (_group_wf,n) else:: _nop fi enddef;
-def group_zf secondary n = if known n:: (_group_zf,n) else:: _nop fi enddef;
-def group_wv secondary n = /n~wv enddef; def group_nb secondary n = /n~nb enddef;
+primarydef a bop_qut b = if (known a)and(known b):: add_parts(a,b) else:: _nop fi enddef;
+primarydef a fuse__ b = pcode_extend(_fuse_ext,a,b,2,0) enddef;
+primarydef a fuse___ b = pcode_extend(_fuse_ext,a,b,3,0) enddef;
+primarydef a fuse____ b = pcode_extend(_fuse_ext,a,b,4,0) enddef;
+tertiarydef a bop_equ b = if (known a)and(known b):: set_bond(a,b) else:: _nop fi enddef;
+tertiarydef a bop_col b = if (known a)and(known b):: set_atom(a,b) else:: _nop fi enddef;
+tertiarydef a bop_hat b = if (known a)and(numeric b):: (_tmp_rot,b),a else:: _nop fi enddef;
+tertiarydef a bop_til b = if (known a)and(numeric b):: (_tmp_line,b),a else:: _nop fi enddef;
+tertiarydef a bop_lth b = if (known a)and(numeric b):: (_tmp_env,b),a else:: _nop fi enddef;
+tertiarydef a bop_bqu b = if (known a)and(numeric b):: (_tmp_len,b),a else:: _nop fi enddef;
+def chg_length primary n = if numeric n:: (_set_len,n) else:: _nop fi enddef;
+def rot_angle primary n = if numeric n:: (_rot_ang,n) else:: _nop fi enddef;
+def cyc_atom primary n = if numeric n:: (_cyc,n) else:: _nop fi enddef;
+def jump_atom secondary n = if n>=pcode_int_start:: move_pos(n) else::(_jp_atom,n) fi enddef;
+def jump_atom_abs secondary n = if numeric n::
+ if n>=pcode_int_start::(_jp_atom,$1),move_pos(n) else::(_jp_atom,$n) fi else:: _nop fi enddef;
+def group_si secondary n = if numeric n:: (_group_si,n) else:: _nop fi enddef;
+def group_dm secondary n = if numeric n:: (_group_dm,n) else:: _nop fi enddef;
+def group_wf secondary n = if numeric n:: (_group_wf,n) else:: _nop fi enddef;
+def group_zf secondary n = if numeric n:: (_group_zf,n) else:: _nop fi enddef;
+def group_wv secondary n = if numeric n:: /n~wv else:: _nop fi enddef;
%=================================================================================================
def read_mcf(expr n)(text t)=
begingroup
if unknown inside_mc::
- save /,//,/*,*/,**,*/*,~,^,`,<,>,:,=,+,\,\\,*\,\*,*\*,@,@$,$,&,&$,#,##,{,},|,||,_,
- --,---,----,CP,CA,CC,DL,FR,inside_mc;
- inside_mc:=1; | :=mark_adress; || :=reset_adress; ##:=reset_length; _:=NO_ATOM;
- \:=0; \\:=zero_dm; *\:=zero_wf; \*:=zero_zf; *\*:=zero_wv;
- let = ==op_equ; let : ==op_col; let ^ ==op_hat; let ~ ==op_til; let > ==op_lth; let `==op_bqu;
- let -- == bond__bond; let --- == bond___bond; let ---- == bond____bond; let + ==op_plus;
- let } ==); let @$ ==jump_atom_abs; let < ==rot_angle; let @ ==jump_atom; let & ==cyc_atom;
+ save /,//,*,/*,*/,*/*,~,^,`,',<,>,:,=,@,@$,$,&,&$,#,##,{,},|,||,--,---,----,
+ CP,CA,CC,DL,FR,inside_mc;
+ inside_mc:=1; | :=mark_adress; || :=reset_adress; ##:=reset_length;
+ let ' == bop_qut; let = ==bop_equ; let : ==bop_col; let ^ ==bop_hat; let ~ ==bop_til;
+ let > ==bop_lth; let ` ==bop_bqu; let -- == fuse__; let --- == fuse___; let ---- == fuse____;
+ let } == ); let @$ ==jump_atom_abs; let < ==rot_angle; let @ ==jump_atom; let & ==cyc_atom;
let # ==chg_length; let / ==group_si; let // ==group_dm; let */ ==group_wf; let /* ==group_zf;
- let */*==group_wv; let **==group_nb; let CP == pcode_add; let CA == pcode_add_adr;
- let FR == fuse_ring_bonds; def DL(expr p)==CA(_set_line,dl,p) enddef;
- def CB(expr p)==CP(_mk_bond,p) enddef; def CC(expr p)==CP(_com,p) enddef;
- def $==abs_adress enddef; def &$==&.$ enddef; def {==read_number( enddef;
+ let */* ==group_wv; let CP == pcode_add; let CA == pcode_add_adr; let FR == fuse_ring_bonds;
+ def DL(expr p)==CA(_set_line,dl,p) enddef; def CB(expr p)==CP(_mk_bond,p) enddef;
+ def CC(expr p)==CP(_com,p) enddef; def $ ==abs_adress enddef; def &$ ==&.$ enddef;
+ def { ==read_adress( enddef; def * primary p == (_numeric_inv,p) enddef;
fi
%----------------------------------------------------------------------------------------------
- pcode_cnt[n]:=0;
+ pcode_cnt[n]:=block_cnt:=0;
for list==t::
+ block_cnt:=block_cnt+1;
if known list::
- if pair list:: pcode_cnt[n]:= pcode_cnt[n]+-1;
- pcode_com[n][pcode_cnt[n]]:=xpart(list);
- pcode_par[n][pcode_cnt[n]]:=ypart(list);
+ if pair list::
+ pcode_x[n][Incr pcode_cnt[n]]:=xpart(list); pcode_y[n][pcode_cnt[n]]:=ypart(list);
ef numeric list::
- if list==_nop:: message "unknown command in "AND decimal(n);
+ if list==_nop:: message_unknown(block_cnt);
ef list>=pcode_emb_start:: expand_pcode(n,list);
- else::
- pcode_cnt[n]:=pcode_cnt[n]+-1;
- pcode_com[n][pcode_cnt[n]]:=_mk_bond; pcode_par[n][pcode_cnt[n]]:=list;
+ else:: pcode_x[n][Incr pcode_cnt[n]]:=_mk_bond; pcode_y[n][pcode_cnt[n]]:=list;
fi
fi
- else:: message "unknown command in "AND decimal(n);
+ else:: message_unknown(block_cnt);
fi
endfor
endgroup
@@ -371,180 +374,194 @@ enddef;
def expand_pcode(expr n,a)=
if n==0::
for i==1 upto pcode_cnt[a]::
- if pcode_com[a][i]>=pcode_emb_start:: expand_pcode(n,pcode_com[a][i]);
- else:: pcode_cnt[n]:=pcode_cnt[n]+-1;
- pcode_com[n][pcode_cnt[n]]:=pcode_com[a][i];
- pcode_par[n][pcode_cnt[n]]:=pcode_par[a][i];
+ if pcode_x[a][i]>=pcode_emb_start:: expand_pcode(n,pcode_x[a][i]);
+ else::
+ pcode_x[n][Incr pcode_cnt[n]]:=pcode_x[a][i]; pcode_y[n][pcode_cnt[n]]:=pcode_y[a][i];
fi
endfor
- else::
- pcode_cnt[n]:=pcode_cnt[n]+-1; pcode_com[n][pcode_cnt[n]]:=a;
+ else:: pcode_x[n][Incr pcode_cnt[n]]:=a;
fi
enddef;
%-------------------------------------------------------------------------------------------------
-vardef read_number(text t)=
- save :,';
- let : == from_until; def ' == +-2000 enddef;
- pcode_int:=pcode_int+-1;
- nA:=0;
+vardef read_adress(text t)=
+ save :,',start_num;
+ let ' == , ; let : == from_until;
+ pcode_int:=pcode_int+1; pcnt:=0;
for list==t::
if known list::
if numeric list::
- if list==_nop:: message "unknown command in "AND decimal(pcode_int);
- else:: nA:=nA+-1; pcode_com[pcode_int][nA]:=_numeric; pcode_par[pcode_int][nA]:=list;
+ if list==_nop:: message_unknown(block_cnt);
+ else:: pcode_x[pcode_int][Incr pcnt]:=_numeric; pcode_y[pcode_int][pcnt]:=list;
fi
ef pair list::
- if xpart(list)==_from:: nB:=ypart(list);
- ef xpart(list)==_until:: nC:=ypart(list);
- for i==nB upto nC::
- nA:=nA+-1; pcode_com[pcode_int][nA]:=_numeric; pcode_par[pcode_int][nA]:=i;
+ if xpart(list)==_from:: start_num:=ypart(list);
+ ef xpart(list)==_until::
+ for i==start_num upto ypart(list)::
+ pcode_x[pcode_int][Incr pcnt]:=_numeric; pcode_y[pcode_int][pcnt]:=i;
endfor
- else:: nA:=nA+-1;
- pcode_com[pcode_int][nA]:=xpart(list); pcode_par[pcode_int][nA]:=ypart(list);
+ else:: pcode_x[pcode_int][Incr pcnt]:=xpart(list); pcode_y[pcode_int][pcnt]:=ypart(list);
fi
fi
- else:: message "unknown command in "AND decimal(pcode_int);
+ else:: message_unknown(block_cnt);
fi
endfor
- pcode_cnt[pcode_int]:=nA; pcode_int
+ pcode_cnt[pcode_int]:=pcnt; pcode_int
+enddef;
+%-------------------------------------------------------------------------------------------------
+vardef add_parts(expr a,b)=
+ if (pair a)and(pair b)::
+ pcode_x[Incr pcode_int][1]:=xpart a; pcode_y[pcode_int][1]:=ypart a;
+ pcode_x[pcode_int][2]:=xpart b; pcode_y[pcode_int][2]:=ypart b; pcode_cnt[pcode_int]:=2;
+ ef (pair a)and(numeric b)::
+ pcode_x[Incr pcode_int][1]:=xpart a; pcode_y[pcode_int][1]:=ypart a;
+ if b>=pcode_emb_start:: pcode_x[pcode_int][2]:=b;
+ else:: pcode_x[pcode_int][2]:=_numeric; pcode_y[pcode_int][2]:=b;
+ fi
+ pcode_cnt[pcode_int]:=2;
+ ef (numeric a)and(pair b)::
+ if a>=pcode_int_start::
+ pcode_x[a][Incr pcode_cnt[a]]:=xpart b; pcode_y[a][pcode_cnt[a]]:=ypart b;
+ elseif a>=pcode_emb_start::
+ pcode_x[Incr pcode_int][1]:=a;
+ pcode_x[pcode_int][2]:=xpart b; pcode_y[pcode_int][2]:=ypart b; pcode_cnt[pcode_int]:=2;
+ else::
+ pcode_x[Incr pcode_int][1]:=_numeric; pcode_y[pcode_int][1]:=a;
+ pcode_x[pcode_int][2]:=xpart b; pcode_y[pcode_int][2]:=ypart b; pcode_cnt[pcode_int]:=2;
+ fi
+ ef (a LT pcode_emb_start)and(b LT pcode_emb_start)::
+ pcode_x[Incr pcode_int][1]:=_numeric; pcode_y[pcode_int][1]:=a;
+ pcode_x[pcode_int][2]:=_numeric; pcode_y[pcode_int][2]:=b; pcode_cnt[pcode_int]:=2;
+ ef (a>=pcode_int_start)and(b LT pcode_int_start)::
+ if b>=pcode_emb_start:: pcode_x[a][Incr pcode_cnt[a]]:=b;
+ else:: pcode_x[a][Incr pcode_cnt[a]]:=_numeric; pcode_y[a][pcode_cnt[a]]:=b;
+ fi
+ else:: pcode_x[Incr pcode_int][1]:=a; pcode_x[pcode_int][2]:=b; pcode_cnt[pcode_int]:=2;
+ fi
+ pcode_int
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def fuse_ring(expr a,b) =
- CP(_jp_bond,a) CP(_rot_ang,180) CP(_get_len,a) CC(_len_s) CP(_chg_len,_ring_len)
+ CP(_jp_bond,a) CP(_rot_ang,180) CP(_get_len,a) CP(_set_len,_ring_len)
for i==1 upto b-2:: CB(360 DIV b) endfor
- CC(_len_e) if a<=0:: CP(_cyc_eB,a-b+-2) else:: CP(_cyc_eB,a) fi
+ CC(_len_e) if a<=0:: CP(_cyc_eB,a-b+2) else:: CP(_cyc_eB,a) fi
enddef;
%-------------------------------------------------------------------------------------------------
def fuse_ring_bonds(expr s,e,b,c) =
- CP(_jp_bond,s) CP(_rot_ang,180) CC(_len_s)
- if b==6:: CP(_chg_len,1) for i==1 upto c-1:: CB(60) endfor
- ef b==5:: if c==2:: CP(_chg_len,1.25) CB(80) ef c==3:: CP(_chg_len,1.1) CB(78) CB(72) fi
- ef b==4:: CP(_chg_len,1.225) CB(105)
- fi
- CC(_len_e) if e<=0:: CP(_cyc_eB,e-c+-1) else:: CP(_cyc_eB,e) fi
+ CP(_jp_bond,s) CP(_rot_ang,180)
+ if b==6:: CP(_set_len,1) for i==1 upto c-1:: CB(60) endfor
+ ef b==5:: if c==2:: CP(_set_len,1.25) CB(80) ef c==3:: CP(_set_len,1.1) CB(78) CB(72) fi
+ ef b==4:: CP(_set_len,1.225) CB(105) fi
+ CC(_len_e) if e<=0:: CP(_cyc_eB,e-c+1) else:: CP(_cyc_eB,e) fi
enddef;
%-------------------------------------------------------------------------------------------------
def fuse_ring_size(expr a,b,c) =
- CP(_jp_bond,a) CP(_rot_ang,180) CC(_len_s) CP(_chg_len,c DIV 10)
- if b==5:: CB(72-((c-9) MUL 1.5)) CB(72+-(c-9)) CB(72+-(c-9))
- ef b==6:: CB(60-(c-8)) for i==1 upto 3:: CB(60+-((c-8) DIV 2)) endfor
- ef b==7:: CB(360 DIV 7-(c-8)) for i==1 upto 4:: CB(360 DIV 7+-((c-8) DIV 2.5)) endfor
- ef b==8:: CB(45-(c-8)) for i==1 upto 5:: CB(45+-((c-8) DIV 3)) endfor
- fi
- CC(_len_e) if a<=0:: CP(_cyc_eB,a-b+-2) else:: CP(_cyc_eB,a) fi
+ CP(_jp_bond,a) CP(_rot_ang,180) CP(_set_len,c)
+ if b==5:: CB(72-((10c-9) MUL 1.5)) CB(63+10c) CB(63+10c)
+ ef b==6:: CB(68-10c) for i==1 upto 3:: CB(60+(5c-4)) endfor fi
+ CC(_len_e) if a<=0:: CP(_cyc_eB,a-b+2) else:: CP(_cyc_eB,a) fi
enddef;
%=================================================================================================
-vardef change_bond(expr a,b) =
- if known b:: pcode_int:=pcode_int+-1; nC:=0;
- if numeric b::
- if (b>=si)and(b<=bd_)::
+vardef set_bond(expr a,b) =
+ pcode_cnt[Incr pcode_int]:=0;
+ if numeric b::
+ if (b>=si)and(b<=bd_)::
+ if a>=pcode_int_start::
+ for i==1 upto pcode_cnt[a]::
+ if pcode_x[a][i]==_numeric:: CA(_set_line,b,pcode_y[a][i])
+ elseif pcode_x[a][i]==_numeric_inv::
+ if b==dl:: CA(_set_line,dr,pcode_y[a][i])
+ ef b==dr:: CA(_set_line,dl,pcode_y[a][i]) fi
+ fi
+ endfor
+ else:: CP(_set_adr,a) CP(_set_line,b)
+ fi
+ ef (b>=?3)and(b<=Ph2)or(b>=pcode_int_start)::
+ if numeric a::
if a>=pcode_int_start::
for i==1 upto pcode_cnt[a]::
- if pcode_com[a][i]==_numeric::
- if pcode_par[a][i]<=1800:: CA(_set_line,b,pcode_par[a][i])
- ef b==dl:: CA(_set_line,dr,pcode_par[a][i]-2000)
- ef b==dr:: CA(_set_line,dl,pcode_par[a][i]-2000)
- else:: CA(_set_line,b,pcode_par[a][i]-2000)
- fi
+ ay:=pcode_y[a][i];
+ if pcode_x[a][i]==_numeric::
+ if b==Ph1:: fuse_ring(ay,6) DL(-2) DL(-4)
+ ef b==Ph2:: fuse_ring(ay,6) DL(-1) DL(-3) DL(-5)
+ else:: fuse_ring(ay,b-?3+3) fi
+ ef pcode_x[a][i]==_fuse_ext::
+ if b==?6:: FR(param_e[ay][1],param_e[ay][2],6,6-param_e[ay][3])
+ ef b==?5:: FR(param_e[ay][1],param_e[ay][2],5,5-param_e[ay][3])
+ ef b==?4:: FR(param_e[ay][1],param_e[ay][2],4,2) fi
fi
endfor
- else:: CP(_set_adr,a) CP(_set_line,b)
- fi
- elseif (b>=?3)and(b<=?8[15])::
- if numeric a::
- if a>=pcode_int_start::
- for i==1 upto pcode_cnt[a]::
- if pcode_com[a][i]==_numeric::
- if b==Ph1:: fuse_ring(pcode_par[a][i],6) DL(-2) DL(-4)
- ef b==Ph2:: fuse_ring(pcode_par[a][i],6) DL(-1) DL(-3) DL(-5)
- ef (b>=?5[11])and(b<=?8[15]):: fuse_ring_size(a,pcode_com[b][1],pcode_par[b][1])
- else:: fuse_ring(pcode_par[a][i],b-?3+-3) fi
- else::
- if b==?6::
- if (pcode_com[a][i]<=1800)and(pcode_par[a][i]<=1800)::
- FR(pcode_com[a][i],pcode_par[a][i],6,4)
- ef pcode_par[a][i]<=1800:: FR(pcode_com[a][i]-2000,pcode_par[a][i],6,3)
- else:: FR(pcode_com[a][i]-2000,pcode_par[a][i]-2000,6,2)
- fi
- ef b==?5::
- if (pcode_com[a][i]<=1800)and(pcode_par[a][i]<=1800)::
- FR(pcode_com[a][i],pcode_par[a][i],5,3)
- ef pcode_par[a][i]<=1800:: FR(pcode_com[a][i]-2000,pcode_par[a][i],5,2)
- fi
- ef b==?4:: FR(pcode_com[a][i],pcode_par[a][i],4,2)
- ef b==Ph1:: FR(pcode_com[a][i],pcode_par[a][i],6,4) DL(-1) DL(-3)
- ef b==Ph2:: FR(pcode_com[a][i],pcode_par[a][i],6,4) DL(-2) DL(-4)
- fi
- fi
- endfor
- else::
- if b==Ph1:: fuse_ring(a,6) DL(-2) DL(-4)
- ef b==Ph2:: fuse_ring(a,6) DL(-1) DL(-3) DL(-5)
- ef (b>=?5[11])and(b<=?8[15]):: fuse_ring_size(a,pcode_com[b][1],pcode_par[b][1])
- else:: fuse_ring(a,b-?3+-3)
- fi
+ else::
+ if b==Ph1:: fuse_ring(a,6) DL(-2) DL(-4)
+ ef b==Ph2:: fuse_ring(a,6) DL(-1) DL(-3) DL(-5)
+ ef b>=pcode_int_start::
+ if (pcode_x[b][1]==_set_len)and(pcode_x[b][2]>=?5)and(pcode_x[b][2]<=?6)::
+ fuse_ring_size(a,pcode_x[b][2]-?3+3,pcode_y[b][1]) fi
+ else:: fuse_ring(a,b-?3+3)
fi
- ef pair a::
- if b==?6:: if (xpart a<=1800)and(ypart a<=1800):: FR(xpart a,ypart a,6,4)
- ef ypart a<=1800:: FR((xpart a)-2000,ypart a,6,3)
- else:: FR((xpart a)-2000,(ypart a)-2000,6,2)
- fi
- ef b==?5:: if (xpart a<=1800)and(ypart a<=1800):: FR(xpart a,ypart a,5,3)
- ef ypart a<=1800:: FR((xpart a)-2000,ypart a,5,2)
- fi
- ef b==?4:: FR(xpart a,ypart a,4,2)
fi
+ ef pair a::
+ if b==?6:: FR(param_e[ypart a][1],param_e[ypart a][2],6,6-param_e[ypart a][3])
+ ef b==?5:: FR(param_e[ypart a][1],param_e[ypart a][2],5,5-param_e[ypart a][3])
+ ef b==?4:: FR(xpart a,ypart a,4,2) fi
fi
+ else:: message_unknown(block_cnt);
fi
- elseif color b:: cntC:=cntC+-1; color_list[cntC]:=b; CA(_set_colorB,cntC,a) fi
- pcode_cnt[pcode_int]:=nC; pcode_int
- fi
+ elseif color b:: cntC:=cntC+1; color_list[cntC]:=b; CA(_set_colorB,cntC,a) fi
+ pcode_int
enddef;
%-------------------------------------------------------------------------------------------------
-vardef change_atom(expr a,b)=
- if known b:: pcode_int:=pcode_int+-1; nC:=0;
- if numeric b::
- if (b GT pcode_emb_start)and(b<=pcode_atm_end):: CA(_chg_atom,b,a)
- ef b==NH:: CA(_chg_atom,N,a) if sw_expand==0:: CP(_tmp_line,nl) fi
- CC(_group_s) CA(_group_si,H,a) CC(_group_e)
- ef b==N?:: CA(_chg_atom,N,a) CC(_group_s) CA(_group_si,_,a) CC(_group_e)
- ef b==N?2:: CA(_chg_atom,N,a) CC(_group_s) CA(_group_si,!,a) CC(_group_e)
- ef b==??:: CP(_tmp_rot, 35) CC(_group_s) CA(_group_si,_,a) CC(_group_e)
- CP(_tmp_rot,-35) CC(_group_s) CA(_group_si,_,a) CC(_group_e)
- ef b==n_:: CC(_group_s) CP(_set_add,MIS) CP(_chg_add,a) CC(_group_e)
- ef b==p_:: CC(_group_s) CP(_set_add,PLS) CP(_chg_add,a) CC(_group_e)
- fi
- ef pair b::
+vardef set_atom(expr a,b)=
+ pcode_cnt[Incr pcode_int]:=pcnt:=f_type:=0;
+ if numeric b:: if (b>=?)and(b<=?dm):: bx:=pcode_x[b][1]; by:=pcode_y[b][1]; f_type:=1; fi
+ ef pair b:: bx:=xpart(b); by:=ypart(b); f_type:=1;
+ ef color b:: f_type:=2;
+ fi
+ if f_type==0::
+ if (b GT pcode_emb_start)and(b<=pcode_atm_end):: CA(_chg_atom,b,a)
+ ef b==NH:: CA(_chg_atom,N,a) if f_expand==0:: CP(_tmp_line,nl) fi
+ CC(_group_s) CA(_group_si,H,a) CC(_group_e)
+ ef b==N?:: CA(_chg_atom,N,a) CC(_group_s) CA(_group_si,NO_ATOM,a) CC(_group_e)
+ ef b==N?2:: CA(_chg_atom,N,a) CC(_group_s) CA(_group_si,!,a) CC(_group_e)
+ ef b==?O:: CC(_group_s) CA(_group_dm,O,a) CC(_group_e)
+ ef b==?NH:: CC(_group_s) CA(_group_dm,NH,a) CC(_group_e)
+ ef b==??:: CP(_tmp_rot, 35) CC(_group_s) CA(_group_si,NO_ATOM,a) CC(_group_e)
+ CP(_tmp_rot,-35) CC(_group_s) CA(_group_si,NO_ATOM,a) CC(_group_e)
+ ef b==n_:: CC(_group_s) CP(_set_add,MIS) CP(_chg_add,a) CC(_group_e)
+ ef b==p_:: CC(_group_s) CP(_set_add,PLS) CP(_chg_add,a) CC(_group_e)
+ ef b==_nop:: message_unknown(block_cnt);
+ fi
+ ef f_type==1::
+ if a>=pcode_emb_start::
CC(_group_s)
- if a>=pcode_emb_start::
- for i==1 upto pcode_cnt[a]::
- if pcode_com[a][i]==_numeric::
- if pcode_par[a][i]<=1800:: CA(xpart(b),ypart(b),pcode_par[a][i])
- ef xpart(b)==_group_wf:: CA(_group_zf,ypart(b),pcode_par[a][i]-2000)
- ef xpart(b)==_group_zf:: CA(_group_wf,ypart(b),pcode_par[a][i]-2000)
- else:: CA(xpart(b),ypart(b),pcode_par[a][i])
- fi
- else:: CP(pcode_com[a][i],pcode_par[a][i])
+ for i==1 upto pcode_cnt[a]::
+ if pcode_x[a][i]==_numeric:: CA(bx,by,pcode_y[a][i])
+ ef pcode_x[a][i]==_numeric_inv::
+ if bx==_group_wf:: CA(_group_zf,by,pcode_y[a][i])
+ ef bx==_group_zf:: CA(_group_wf,by,pcode_y[a][i])
fi
- endfor
- else:: CA(xpart(b),ypart(b),a) fi
+ else:: CP(pcode_x[a][i],pcode_y[a][i])
+ fi
+ endfor
CC(_group_e)
- ef color b:: cntC:=cntC+-1; color_list[cntC]:=b; CA(_set_colorA,cntC,a)
+ else:: CC(_group_s) CA(bx,by,a) CC(_group_e)
fi
- pcode_cnt[pcode_int]:=nC; pcode_int
+ ef f_type==2:: cntC:=cntC+1; color_list[cntC]:=b; CA(_set_colorA,cntC,a)
fi
+ pcode_cnt[pcode_int]:=pcode_cnt[pcode_int]; pcode_int
enddef;
%-------------------------------------------------------------------------------------------------
-def pcode_add(expr c,p)=
- nC:=nC+-1; pcode_com[pcode_int][nC]:=c; pcode_par[pcode_int][nC]:=p; enddef;
-def pcode_add_adr(expr c,p,a)=
+def pcode_add(expr x,y)= pcode_x[pcode_int][Incr pcode_cnt[pcode_int]]:=x;
+ pcode_y[pcode_int][pcode_cnt[pcode_int]]:=y;
+enddef;
+%-------------------------------------------------------------------------------------------------
+def pcode_add_adr(expr x,y,a)=
if a>=pcode_emb_start::
for i==1 upto pcode_cnt[a]::
- if pcode_com[a][i]==_numeric:: pcode_add(_set_adr,pcode_par[a][i]) pcode_add(c,p)
- else:: pcode_add(pcode_com[a][i],pcode_par[a][i])
+ if pcode_x[a][i]==_numeric:: pcode_add(_set_adr,pcode_y[a][i]) pcode_add(x,y)
+ else:: pcode_add(pcode_x[a][i],pcode_y[a][i])
fi
endfor
- else:: pcode_add(_set_adr,a) pcode_add(c,p)
+ else:: pcode_add(_set_adr,a) pcode_add(x,y)
fi
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -606,23 +623,24 @@ enddef;
%=================================================================================================
def drawm(text t)=
begingroup
- save f_bra,temp_strA,temp_lenE,temp_lenF,temp_cntB,f_term,f_at,f_lineT,f_rotT,angL,lenL,cpos,
- tpos,f_lenT,f_envT,factor,m_wd,m_ht,raise_pos,slen,sdir,char_wd,char_ht,tcol,f_col,knownA,
- group_num,markA,markB,saveA,saveB,bondL,lenT,lineT,angT,rotT,envT,envB,rate_cr,posBs,posBe,
+ save f_bra,temp_strA,len_e_T,len_ee_T,temp_cntB,f_term,f_at,f_lineT,f_rotT,angL,lenL,cpos,tpos,
+ f_lenT,f_envT,factor,m_wd,m_ht,raise_pos,slen,sdir,char_wd,char_ht,tcol,f_col,
+ knownA,markA,markB,saveA,saveB,bondL,lenT,lineT,angT,rotT,envT,envB,rate_cr,posBs,posBe,
group_par,group_cnt,group_com,colorA,colorB,aW,aH,fW,fH,hW,hW,hH,qH,fP,hP,ww,aw,ap,am,
Ls,Le,pA,zA,zL;
numeric group_com[][],group_par[][],group_cnt[],colorA[],colorB[];
pair cpos,tpos,raise_pos,posBs,posBe,pA,Ls,Le;
path frameA[],zA,zL;
%-----------------------------------------------------------------------------------------------
- if sw_expand=1: rate_cr:=1; else: rate_cr:=-ratio_chain_ring; fi
+ if f_expand=1: rate_cr:=1; else: rate_cr:=-ratio_chain_ring; fi
cntA:=cntB:=cntC:=group_num:=0; str_tbl[0]:="C"; str_cnt:=2000;
%-----------------------------------------------------------------------------------------------
fig_wd:=xpart(fsize); fig_ht:=ypart(fsize);
%===============================================================================================
read_mcf(0)(t,(_com,_term));
proc_bond_atom(0)(1);
- if (group_num>0)and(not scan_bit(sw_abbreviate,Group)): expand_group(1); fi
+ backboneA:=cntA; backboneB:=cntB;
+ if (group_num>0)and(not scan_bit(sw_omit,Group)): expand_group(1); fi
%-scaling---------------------------------------------------------------------------------------
if blength>1: blen:=blength; proc_size_setup; proc_skeleton(0); proc_scaling;
elseif blength>0: blen:=fig_wd*blength; proc_size_setup; proc_skeleton(0); proc_scaling;
@@ -635,10 +653,13 @@ def drawm(text t)=
proc_skeleton(0); proc_scaling;
if (mol_ht/mol_wd)>(m_ht/m_wd):
if ypart(msize)>1: factor:=ypart(msize)/mol_ht;
- else: factor:=((fig_ht-2ypart(fmargin))*ypart(msize))/mol_ht; fi
+ else: factor:=((fig_ht-2ypart(fmargin))*ypart(msize))/mol_ht;
+ fi
else:
if xpart(msize)>1: factor:=xpart(msize)/mol_wd;
- else: factor:=((fig_wd-2xpart(fmargin))*xpart(msize))/mol_wd; fi fi
+ else: factor:=((fig_wd-2xpart(fmargin))*xpart(msize))/mol_wd;
+ fi
+ fi
exitif (factor>=1-eps)and(factor<=1+eps); blen:=blen*factor; proc_size_setup;
endfor
if blen>max_blength: blen:=max_blength; proc_size_setup; proc_skeleton(0); proc_scaling; fi
@@ -666,27 +687,25 @@ def drawm(text t)=
for i=1 upto cntB: if lineB[i]>=si_: draw_bond(i); fi endfor
%-atom numbering------------------------------------------------------------------------------
if scan_bit(sw_numbering,Atom):
- for i=1 upto cntA:
- if (i>=numbering_start)and(i<=numbering_end):
- defaultscale:=.18blen/defaultsize; nH:=1.2defaultsize*defaultscale;
- if i<=9: nW:=nH; ef i<=99: nW:=1.3nH; else: nW:=1.9nH; fi
- erase fill unitsquare xscaled nW yscaled nH shifted (posA[i]-(nW/2,nH/2));
- draw unitsquare xscaled nW yscaled nH shifted (posA[i]-(nW/2,nH/2)) wpcs 0.1;
- label(decimal(i),posA[i]);
- fi
+ if scan_bit(sw_numbering,All): numbering_end:=cntA; else: numbering_end:=backboneA; fi
+ for i=1 upto numbering_end:
+ defaultscale:=.2blen/defaultsize; nH:=1.2defaultsize*defaultscale;
+ if i<=9: nW:=nH; ef i<=99: nW:=1.3nH; else: nW:=1.9nH; fi
+ erase fill fullcircle xscaled 1.1nW yscaled 1.1nH shifted posA[i] wpcs 0.1;
+ draw fullcircle xscaled 1.1nW yscaled 1.1nH shifted posA[i] wpcs 0.1;
+ if numberfont="draw": draw_number(i,posA[i]); else: label(decimal(i),posA[i]); fi
endfor
fi
%-bond numbering------------------------------------------------------------------------------
if scan_bit(sw_numbering,Bond):
- for i=1 upto cntB:
- if (i>=numbering_start)and(i<=numbering_end):
- defaultscale:=.18blen/defaultsize; nH:=1.2defaultsize*defaultscale;
- if i<=9: nW:=nH; ef i<=99: nW:=1.3nH; else: nW:=1.9nH; fi
- nH:=defaultsize*defaultscale; tpos:=.5[posA[sB[i]],posA[eB[i]]];
- erase fill unitsquare xscaled nW yscaled nH shifted (tpos-(nW/2,nH/2));
- draw unitsquare xscaled nW yscaled nH shifted (tpos-(nW/2,nH/2)) wpcs 0.1;
- label(decimal(i),tpos);
- fi
+ if scan_bit(sw_numbering,All): numbering_end:=cntB; else: numbering_end:=backboneB; fi
+ for i=1 upto numbering_end:
+ defaultscale:=.18blen/defaultsize; nH:=1.2defaultsize*defaultscale;
+ if i<=9: nW:=nH; ef i<=99: nW:=1.3nH; else: nW:=1.9nH; fi
+ nH:=defaultsize*defaultscale; tpos:=.5[posA[sB[i]],posA[eB[i]]];
+ erase fill unitsquare xscaled nW yscaled 1.05nH shifted (tpos-(nW/2,1.05nH/2));
+ draw unitsquare xscaled nW yscaled 1.05nH shifted (tpos-(nW/2,1.05nH/2)) wpcs 0.1;
+ if numberfont="draw": draw_number(i,tpos); else: label(decimal(i),tpos); fi
endfor
fi
%---------------------------------------------------------------------------------------------
@@ -699,7 +718,7 @@ def drawm(text t)=
mol_pic[cntM]:=currentpicture;
clearit;
fi
- if sw_output>=Calc: proc_calc(0); fi
+ proc_calc(0);
endgroup;
enddef;
%-------------------------------------------------------------------------------------------------
@@ -708,8 +727,8 @@ def expand_group(expr n)=
for i=n upto group_num:
for j=1 upto group_cnt[i]:
if group_com[i][j]>=pcode_emb_start: expand_pcode(0,group_com[i][j]);
- else: pcode_com[0][incr pcode_cnt[0]]:=group_com[i][j];
- pcode_par[0][pcode_cnt[0]]:=group_par[i][j];
+ else: pcode_x[0][incr pcode_cnt[0]]:=group_com[i][j];
+ pcode_y[0][pcode_cnt[0]]:=group_par[i][j];
fi
endfor
endfor
@@ -738,7 +757,7 @@ def proc_scaling=
if strA[i]<>0:
nU:=nD:=nP:=nL:=nR:=0;
for j=1 upto length(str_tbl[strA[i]]):
- tempc:=subc(j,str_tbl[strA[i]]);
+ tempc:=substring(j-1,j) of str_tbl[strA[i]];
if tempc="^": nU:=.5atom_wd; ef tempc="_": nD:=.5atom_wd;
ef (tempc<>"{")and(tempc<>"}"): nP:=nP+atom_wd*tbl_char_wd[ASCII(tempc)];
fi
@@ -757,79 +776,76 @@ enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def proc_bond_atom(expr a)(expr n)=
f_bra:=f_term:=rotT:=f_lineT:=f_rotT:=f_lenT:=f_envT:=envT:=envB:=temp_strA:=f_at:=0;
- bondL:=rate_cr; lenT:=rate_cr; sB[0]:=0; eB[0]:=1; lineT:=si;
- addAT:=markA:=markB:=saveA:=saveB:=0;
+ addAT:=markA:=markB:=saveA:=saveB:=sB[0]:=0; bondL:=rate_cr; lenT:=rate_cr; eB[0]:=1; lineT:=si;
%-----------------------------------------------------------------------------------------------
- for i=n upto pcode_cnt[a]: nC:=pcode_com[a][i]; nP:=pcode_par[a][i];
- if nC=_mk_bond: if (nP=0)and(rotT<>0): rotT:=0; fi add_atom(0);
- ef nC=_set_adr: adrT:=nP;
- ef nC=_com: if nP=_mark: saveA:=markA; saveB:=markB; markA:=cntA; markB:=cntB;
- ef nP=_rest: markA:=saveA; markB:=saveB;
- ef nP=_moff: markA:=markB:=0;
- ef nP=_term: termA;
- ef nP=_len_s: temp_lenE:=bondL; ef nP=_len_e: bondL:=temp_lenE;
- ef nP=_len_ss: temp_lenF:=bondL; ef nP=_len_ee: bondL:=temp_lenF;
- ef nP=_group_s: f_at:=1; if lineT<>si: f_lineT:=1; fi if rotT<>0: f_rotT:=1; fi
+ for i=n upto pcode_cnt[a]: pX:=pcode_x[a][i]; pY:=pcode_y[a][i];
+ if pX=_mk_bond: if (pY=0)and(rotT<>0): rotT:=0; fi add_atom(0);
+ ef pX=_set_adr: adrT:=pY;
+ ef pX=_com: if pY=_mark: saveA:=markA; saveB:=markB; markA:=cntA; markB:=cntB;
+ ef pY=_rest: markA:=saveA; markB:=saveB;
+ ef pY=_moff: markA:=markB:=0;
+ ef pY=_term: termA;
+ ef pY=_len_s: len_e_T:=bondL; ef pY=_len_e: bondL:=len_e_T;
+ ef pY=_len_ss: len_ee_T:=bondL; ef pY=_len_ee: bondL:=len_ee_T;
+ ef pY=_group_s: f_at:=1; if lineT<>si: f_lineT:=1; fi if rotT<>0: f_rotT:=1; fi
if lenT<>rate_cr: f_lenT:=1; fi if envT<>hz: f_envT:=1; fi
- ef nP=_group_e: f_at:=0; f_lineT:=f_rotT:=f_lenT:=f_envT:=rotT:=envT:=0;
- lineT:=si; lenT:=rate_cr; fi
- ef nC=_set_atom: temp_strA:=nP;
- ef nC=_group_si: add_group;
- ef nC=_group_dm: lineT:=dm; add_group;
- ef nC=_group_wf: lineT:=wf; add_group;
- ef nC=_group_zf: lineT:=zf; add_group;
- ef nC=_jp_bond: termA; nA:=getB(nP); check_adrB(nA); sB[cntB+1]:=sB[nA]; f_bra:=1;
- ef nC=_jp_atom: termA; nA:=getA(nP); check_adrA(nA); sB[cntB+1]:=nA; f_bra:=1;
- ef nC=_jp_absA: sB[cntB+1]:=nP; f_bra:=1; temp_cntB:=cntB;
- ef nC=_chg_atom: strA[getA(adrT)]:=pcode_par[nP][1];
- ef nC=_chg_len: if nP=_ring_len: bondL:=ringL; else: bondL:=nP; fi
- ef nC=_get_len: if nP=_tmp_len: if bondL=rate_cr: bondL:=lenT; fi
- ef nP=_ring_len:
+ ef pY=_group_e: f_at:=f_lineT:=f_rotT:=f_lenT:=f_envT:=rotT:=envT:=0;
+ lineT:=si; lenT:=rate_cr;
+ fi
+ ef pX=_set_atom: temp_strA:=pY;
+ ef pX=_group_si: add_group(pY);
+ ef pX=_group_dm: lineT:=dm; add_group(pY);
+ ef pX=_group_wf: lineT:=wf; add_group(pY);
+ ef pX=_group_zf: lineT:=zf; add_group(pY);
+ ef pX=_jp_bond: termA; nA:=getB(pY); check_adrB(nA); sB[cntB+1]:=sB[nA]; f_bra:=1;
+ ef pX=_jp_atom: termA; nA:=getA(pY); check_adrA(nA); sB[cntB+1]:=nA; f_bra:=1;
+ ef pX=_jp_absA: sB[cntB+1]:=pY; f_bra:=1; temp_cntB:=cntB;
+ ef pX=_chg_atom: strA[getA(adrT)]:=pcode_y[pY][1];
+ ef pX=_chg_len: if pY=_ring_len: bondL:=ringL; else: bondL:=pY; fi
+ ef pX=_set_len: len_e_T:=bondL; if pY=_ring_len: bondL:=ringL; else: bondL:=pY; fi
+ ef pX=_get_len: if pY=_tmp_len: if bondL=rate_cr: bondL:=lenT; fi
+ ef pY=_ring_len:
if lenT<>rate_cr: bondL:=lenT; else: if bondL<0: bondL:=1; fi fi
- else: ringL:=lenB[getB(nP)]; fi
- ef nC=_tmp_len: lenT:=nP;
- ef nC=_set_line: lineB[getB(adrT)]:=nP;
- ef nC=_tmp_line: lineT:=nP;
- ef nC=_tmp_rot: rotT:=nP;
- ef nC=_cyc: check_adrA(getA(nP)); add_atom(getA(nP));
- ef nC=_cyc_eB: add_atom(eB[getB(nP)]);
- ef nC=_cyc_sB: add_atom(sB[getB(nP)]);
- ef nC=_chg_env: envB:=nP;
- ef nC=_tmp_env: envT:=nP;
- ef nC=_set_colorA: colorA[getA(adrT)]:=nP;
- ef nC=_set_colorB: colorB[getB(adrT)]:=nP;
- ef nC=_set_add: addAT:=nP;
- ef nC=_chg_add: addA[getA(nP)]:=addAT; addAT:=0; if rotT<>0: add_rot[getA(nP)]:=rotT; fi
+ else: ringL:=lenB[getB(pY)];
+ fi
+ ef pX=_tmp_len: lenT:=pY;
+ ef pX=_set_line: lineB[getB(adrT)]:=pY;
+ ef pX=_tmp_line: lineT:=pY;
+ ef pX=_tmp_rot: rotT:=pY;
+ ef pX=_cyc: check_adrA(getA(pY)); add_atom(getA(pY));
+ ef pX=_cyc_eB: add_atom(eB[getB(pY)]);
+ ef pX=_cyc_sB: add_atom(sB[getB(pY)]);
+ ef pX=_chg_env: envB:=pY;
+ ef pX=_tmp_env: envT:=pY;
+ ef pX=_set_colorA: colorA[getA(adrT)]:=pY;
+ ef pX=_set_colorB: colorB[getB(adrT)]:=pY;
+ ef pX=_set_add: addAT:=pY;
+ ef pX=_chg_add: addA[getA(pY)]:=addAT; addAT:=0; if rotT<>0: add_rot[getA(pY)]:=rotT; fi
else:
fi
endfor
enddef;
%-------------------------------------------------------------------------------------------------
-def add_group=
- if f_at=1: nE:=getA(adrT); check_adrA(nE); else: nE:=cntA+1; fi
- group_cnt[incr group_num]:=0; store_group(_jp_absA,nE)
- store_group(_com,_mark)
- store_group(_com,_len_s)
- if lineT<>nb: store_group(_tmp_line,lineT) fi
- if rotT<>0: store_group(_rot_ang,rotT) fi
- if lenT<>rate_cr: store_group(_chg_len,lenT)
- ef bondL<>rate_cr:
- if bondL>=0: store_group(_chg_len,-bondL) else: store_group(_chg_len,bondL) fi fi
- if envT<>hz: store_group(_chg_env,envT) fi
- if lineT=nl: store_group(_chg_len,_size_atom) store_group(_adj_ang,0) fi
- if lineT<>nb: store_group(_mk_bond,0) fi
- if nP<>NO_ATOM:
- for i=1 upto pcode_cnt[nP]: store_group(pcode_com[nP][i],pcode_par[nP][i]) endfor
+def add_group(expr n)=
+ group_cnt[incr group_num]:=0;
+ if f_at=1: nA:=getA(adrT); check_adrA(nA); else: nA:=cntA+1; fi
+ store_grp(_jp_absA,nA) store_grp(_com,_mark) store_grp(_com,_len_s) store_grp(_tmp_line,lineT)
+ if rotT<>0: store_grp(_rot_ang,rotT) fi
+ if (lenT<>rate_cr)and(lineT<>nl): store_grp(_tmp_len,lenT)
+ ef bondL<>rate_cr: if bondL>=0: store_grp(_chg_len,-bondL) else: store_grp(_chg_len,bondL) fi
fi
- store_group(_com,_len_e) store_group(_chg_env,hz) store_group(_com,_term)
- store_group(_com,_rest)
+ if envT<>hz: store_grp(_chg_env,envT) fi
+ if lineT=nl: store_grp(_tmp_len,_size_atom) store_grp(_adj_ang,0) else: fi
+ store_grp(_mk_bond,0)
+ if n<>NO_ATOM: for i=1 upto pcode_cnt[n]: store_grp(pcode_x[n][i],pcode_y[n][i]) endfor fi
+ store_grp(_com,_len_e) store_grp(_chg_env,hz) store_grp(_com,_term) store_grp(_com,_rest)
if f_lineT=0: lineT:=si; fi
if f_lenT=0: lenT:=rate_cr; fi
if f_rotT=0: rotT:=0; fi
if f_envT=0: envT:=hz; fi
enddef;
%-------------------------------------------------------------------------------------------------
-def store_group(expr a,b)=
+def store_grp(expr a,b)=
group_com[group_num][incr group_cnt[group_num]]:=a;
group_par[group_num][group_cnt[group_num]]:=b;
enddef;
@@ -840,7 +856,8 @@ def add_atom(expr n)=
if f_bra=0: strA[incr cntA]:=temp_strA; sB[cntB]:=cntA;
addA[cntA]:=addAT; addAT:=temp_strA:=add_rot[cntA]:=0;
if rotT<>0: add_rot[cntA]:=rotT; rotT:=0; fi
- else: f_bra:=0; fi
+ else: f_bra:=0;
+ fi
if n=0: eB[cntB]:=cntA+1; f_term:=0; else: eB[cntB]:=n; f_term:=1; fi
enddef;
%-------------------------------------------------------------------------------------------------
@@ -849,28 +866,29 @@ def check_adrA(expr n)=
def check_adrB(expr n)= if (n>cntB)or(n<=0): errmessage("cntB=[ "&decimal(n)&" ]"); fi enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def proc_skeleton(expr n)=
- markA:=markB:=cntA:=cntB:=f_bra:=rotT:=f_term:=0;
- envT:=envB:=f_lineT:=f_rotT:=f_lenT:=f_envT:=0; lineT:=si; angT:=mangle;
- angA[0]:=angB[0]:=angX[0]:=0; posA[0]:=posBs:=posBe:=(0,0);
+ markA:=markB:=cntA:=cntB:=f_bra:=rotT:=f_term:=envT:=envB:=0;
+ angA[0]:=angB[0]:=angX[0]:=0; lineT:=si; angT:=mangle; posA[0]:=posBs:=posBe:=(0,0);
%-----------------------------------------------------------------------------------------------
- for i=1 upto pcode_cnt[n]: nC:=pcode_com[n][i]; nP:=pcode_par[n][i];
- if nC=_mk_bond: if (nP=0)and(rotT<>0):nP:=rotT; rotT:=0; fi add_bond(nP,1);
- ef nC=_com: if nP=_mark: saveA:=markA; saveB:=markB; markA:=cntA; markB:=cntB;
- ef nP=_rest: markA:=saveA; markB:=saveB;
- ef nP=_moff: markA:=markB:=0; ef nP=_term: termB;
- ef nP=_group_e: lineT:=si; lenT:=rate_cr; rotT:=envT:=0; fi
- ef nC=_jp_bond: termB; nA:=getB(nP); posBs:=posA[sB[nA]]; angT:=angB[nA]; f_bra:=1; rotT:=0;
- ef nC=_jp_atom: termB; adrT:=getA(nP); posBs:=posA[adrT]; angT:=angX[adrT]; f_bra:=1; rotT:=0;
- ef nC=_jp_absA: adrT:=nP; posBs:=posA[adrT]; angT:=angX[adrT];
+ for i=1 upto pcode_cnt[n]:
+ pX:=pcode_x[n][i]; pY:=pcode_y[n][i];
+ if pX=_mk_bond: if (pY=0)and(rotT<>0):pY:=rotT; rotT:=0; fi add_bond(pY,1);
+ ef pX=_com: if pY=_mark: saveA:=markA; saveB:=markB; markA:=cntA; markB:=cntB;
+ ef pY=_rest: markA:=saveA; markB:=saveB;
+ ef pY=_moff: markA:=markB:=0; ef pY=_term: termB;
+ ef pY=_group_e: lineT:=si; lenT:=rate_cr; rotT:=envT:=0;
+ fi
+ ef pX=_jp_bond: termB; nA:=getB(pY); posBs:=posA[sB[nA]]; angT:=angB[nA]; f_bra:=1; rotT:=0;
+ ef pX=_jp_atom: termB; adrT:=getA(pY); posBs:=posA[adrT]; angT:=angX[adrT]; f_bra:=1; rotT:=0;
+ ef pX=_jp_absA: adrT:=pY; posBs:=posA[adrT]; angT:=angX[adrT];
f_bra:=1; rotT:=0; temp_cntB:=cntB;
- ef nC=_adj_ang: angT:=adjust_ang(angT);
- ef nC=_rot_ang: if nP>-3700: angT:=(angT+nP) mod 360; else: angT:=(nP+4095) mod 360; fi
- ef nC=_tmp_rot: rotT:=nP;
- ef nC=_chg_env: envB:=nP;
- ef nC=_tmp_env: envT:=nP;
- ef nC=_cyc: add_bond(angle(posA[getA(nP)]-posBs)-angT,0);
- ef nC=_cyc_sB: add_bond(angle(posA[sB[getB(nP)]]-posBs)-angT,0);
- ef nC=_cyc_eB: add_bond(angle(posA[eB[getB(nP)]]-posBs)-angT,0);
+ ef pX=_adj_ang: angT:=adjust_ang(angT);
+ ef pX=_rot_ang: if pY>-3700: angT:=(angT+pY) mod 360; else: angT:=(pY+4095) mod 360; fi
+ ef pX=_tmp_rot: rotT:=pY;
+ ef pX=_chg_env: envB:=pY;
+ ef pX=_tmp_env: envT:=pY;
+ ef pX=_cyc: add_bond(angle(posA[getA(pY)]-posBs)-angT,0);
+ ef pX=_cyc_sB: add_bond(angle(posA[sB[getB(pY)]]-posBs)-angT,0);
+ ef pX=_cyc_eB: add_bond(angle(posA[eB[getB(pY)]]-posBs)-angT,0);
else:
fi
endfor
@@ -885,23 +903,28 @@ def add_bond(expr n,f)=
cntB:=cntB+1;
if nA>-3700: angB[cntB]:=angT:=(angT+nA) mod 360; else: angB[cntB]:=angT:=nA+4095; fi
if f=1:
- if lenB[cntB]=_size_atom: posBe:=sfrt(posBs,atom_wd,angT);
+ if lenB[cntB]=_size_atom: posBe:=sfrt(posBs,1.1atom_wd,angT);
else:
nA:=lenB[cntB]; if nA<0: nB:=glu_atom(adrT)+glu_atom(cntA+1); nA:=abs(nA); else: nB:=0; fi
- posBe:=sfrt(posBs,nA*blen+nB,angT); fi
+ posBe:=sfrt(posBs,nA*blen+nB,angT);
+ fi
posA[cntA+1]:=posBe; f_term:=0;
- else: f_term:=1; fi
+ else: f_term:=1;
+ fi
posBs:=posBe;
enddef;
%-------------------------------------------------------------------------------------------------
vardef arrange_ang(expr n)=
- if cntB=0: angT:=(angT-180) mod 360; 180
- else: if envB>=pcode_emb_start: pcode_par[envB][cntB-temp_cntB]
- else: if envB=hz: if n=0: 60 ef n<=90: -60 ef n<=180: 60 ef n<270: -60 else: 60 fi
- ef envB=vt: if n=0: -60 ef n<90: 60 ef n<=180: -60 ef n<=270: 60 else: -60 fi
- ef abs(envB)<=180: envB
- fi
- fi
+ if f_bra=1: 0
+ else:
+ if cntB=0: angT:=(angT-180) mod 360; 180
+ else: if envB>=pcode_emb_start: pcode_y[envB][cntB-temp_cntB]
+ else: if envB=hz: if n=0: 60 ef n<=90: -60 ef n<=180: 60 ef n<270: -60 else: 60 fi
+ ef envB=vt: if n=0: -60 ef n<90: 60 ef n<=180: -60 ef n<=270: 60 else: -60 fi
+ ef abs(envB)<=180: envB
+ fi
+ fi
+ fi
fi
enddef;
%-------------------------------------------------------------------------------------------------
@@ -923,19 +946,22 @@ enddef;
def termB= if f_term=0: if f_bra=0: angX[incr cntA]:=angT; else:f_bra:=0; fi f_term:=1; fi enddef;
%-------------------------------------------------------------------------------------------------
vardef glu_atom(expr n)=
- if strA[n]<>0: nE:=angT mod 90; nF:=0.5atom_wd; (iif(nE<45,sind nE,cosd nE)*nF)+++nF else: 0 fi
+ if strA[n]<>0: nD:=angT mod 90; nC:=0.5atom_wd; nN:=(iif(nD<45,sind nD,cosd nD)*nC)+++nC; nN
+ else: 0
+ fi
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def draw_atom(expr n)=
if atomfont<>"draw": defaultfont:=atomfont; defaultsize:=atom_wd; fi
- temps:=str_tbl[strA[n]]; slen:=length(temps); nC:=nS:=0; raise_pos:=(0,0); tpos:=posA[n];
+ atom_s:=str_tbl[strA[n]]; slen:=length(atom_s); nC:=nS:=0; raise_pos:=(0,0); tpos:=posA[n];
if (angX[n]<=90)or(angX[n]>=270): sdir:=1; else: sdir:=-1; fi
for i=1 upto slen:
- if nC=0: tempc:=subc(i,temps);
+ if nC=0: tempc:=substring(i-1,i) of atom_s;
if (sdir=-1)and(tempc="{"):
- nD:=i; nC:=0; for j=nD upto slen: nC:=nC+1; exitif subc(j+1,temps)="}"; endfor
+ nD:=i; nC:=0; for j=nD upto slen: nC:=nC+1; exitif substring(j,j+1) of atom_s="}"; endfor
fi
- else: nC:=nC-1; tempc:=subc(nD+nC,temps); fi
+ else: nC:=nC-1; tempc:=substring(nD+nC-1,nD+nC) of atom_s;
+ fi
if tempc="_": raise_pos:=iif(raise_pos=(0,0),(0,-.5atom_wd),(0,0));
ef tempc="^": raise_pos:=iif(raise_pos=(0,0),(0, .5atom_wd),(0,0));
ef (tempc<>"{")and(tempc<>"}"):
@@ -955,6 +981,18 @@ def draw_atom(expr n)=
fi
if scan_bit(sw_frame,Atom): draw frameA[n] wpcs thickness_frame; fi
enddef;
+%-------------------------------------------------------------------------------------------------
+def draw_number(expr n,p)=
+ begingroup
+ save atom_wd,bond_pen_wd,slen,spos;
+ pair spos;
+ atom_wd:=.18blen; bond_pen_wd:=.012blen; temps:=decimal(n); slen:=length(temps); spos:=p;
+ for i=1 upto slen:
+ if i=1: spos:=spos-(slen*.35atom_wd-.35atom_wd,0); else: spos:=spos+(0.73atom_wd,0); fi
+ draw_char(substring(i-1,i) of temps,spos);
+ endfor
+ endgroup
+enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def draw_bond(expr n)=
nL:=lineB[n]; angL:=angB[n]; nS:=sB[n]; nE:=eB[n]; f_col:=0;
@@ -964,12 +1002,13 @@ def draw_bond(expr n)=
Ls:=posA[nS]; Le:=posA[nE]; pA:=(.1,.9);
ef strA[nS]=0: Ls:=posA[nS]; Le:=zL ISP frameA[nE]; pA:=(.15,1);
ef strA[nE]=0: Ls:=zL ISP frameA[nS]; Le:=posA[nE]; pA:=(0,.85);
- else: Ls:=zL ISP frameA[nS]; Le:=zL ISP frameA[nE]; pA:=(0,1); fi
+ else: Ls:=zL ISP frameA[nS]; Le:=zL ISP frameA[nE]; pA:=(0,1);
+ fi
zA:=Ls--Le; lenL:=length(Le-Ls);
%-----------------------------------------------------------------------------------------------
if known tcol: if tcol<>0: drawoptions(withcolor color_list[tcol]); f_col:=1;fi fi
pickup pencircle scaled bond_pen_wd;
- if (nL=si)or(scan_bit(sw_abbreviate,Bond)): draw zA;
+ if (nL=si)or(scan_bit(sw_omit,Bond)): draw zA;
ef nL=dl: draw zA; draw sfrt(subpath pA of zA,bondgap,ap);
ef nL=dr: draw zA; draw sfrt(subpath pA of zA,bondgap,am);
ef nL=dm: draw sfrt(zA,bondgap/1.75,ap); draw sfrt(zA,bondgap/1.75,am);
@@ -982,7 +1021,7 @@ def draw_bond(expr n)=
ef nL=bz: bz_put(sfrt(Ls,ww,ap),sfrt(Le,ww,ap),sfrt(Ls,ww,am),sfrt(Le,ww,am));
ef nL=zf: wz_put(Ls,sfrt(Le,ww,ap),sfrt(Le,ww,am));
ef nL=zb: wz_put(Le,sfrt(Ls,ww,am),sfrt(Ls,ww,ap));
- ef nL=dt: for i=0 step .75hash_gap/lenL until 1: drawdot i[Ls,Le]; endfor
+ ef nL=dt: for i=0 step .75hash_gap/lenL until 1: drawdot i[Ls,Le] wpcs 2bond_pen_wd; endfor
ef nL=wv: nA:=.4bondgap; nB:=round(lenL/nA);
draw Ls for i=1 upto nB: ..controls(point (i-.5)/nB of sfrt(zA,nA,iif(odd i,ap,am)))
..point i/nB of zA endfor
@@ -1014,7 +1053,6 @@ def draw_bond(expr n)=
wz_put(Le,sfrt(Ls,ww,am),sfrt(Ls,ww,ap));
ef nL=bd_: erase draw subpath(0.15,0.85) of zA wpcs 1.6bondgap;
draw zA withpen penrazor rotated ap scaled bondgap;
- ef nL=nb:
%-- bond type for glycan ----------------------------------------------------------------------
ef nL=arc_lb: draw Ls--Ls-(0,aw)..posA[nE]+(-1.2aw,0)..posA[nE]-(.6aw,0);
ef nL=arc_br: draw posA[nS]+(.6aw,0)..posA[nS]+(1.2aw,0)..Le-(0,aw)--Le;
@@ -1024,25 +1062,30 @@ def draw_bond(expr n)=
ef nL=arc_ltr: draw posA[nS]+(0,iif(strA[nS]=0,0,0.6aw))--posA[nS]+(0,.8aw)
..0.5[posA[nS],posA[nE]]+(0,1.7aw)..posA[nE]+(0,.8aw)
--posA[nE]+(0,iif(strA[nE]=0,0,.6aw));
- %----------------------------------------------------------------------------------------------
fi
if f_col=1: drawoptions(); fi
enddef;
%------------------------------------------------------------------------------------------------
-def wz_put(expr a,b,c)= nB:=round(lenL/hash_gap);
- for i=1 upto nB: nA:=i/nB; if i=1: nD:=0; else: nD:=(i-ratio_hash_black)/nB; fi
+def wz_put(expr a,b,c)=
+ nB:=round(lenL/hash_gap);
+ for i=1 upto nB:
+ nA:=i/nB; if i=1: nD:=0; else: nD:=(i-ratio_hash_black)/nB; fi
fill nD[a,b]--nD[a,c]--nA[a,c]--nA[a,b]--cycle;
endfor
enddef;
%------------------------------------------------------------------------------------------------
-def bz_put(expr a,b,c,d)= nB:=round(lenL/hash_gap);
- for i=0 upto nB-1: nA:=i/nB; nD:=nA+ratio_hash_black/nB;
+def bz_put(expr a,b,c,d)=
+ nB:=round(lenL/hash_gap);
+ for i=0 upto nB-1:
+ nA:=i/nB; nD:=nA+ratio_hash_black/nB;
fill nA[b,a]--nA[d,c]--nD[d,c]--nD[b,a]--cycle;
endfor
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def char_size_set(expr w,h)(expr s)=
- for j=1 upto length(s): nN:=ASCII(subc(j,s)); tbl_char_wd[nN]:=w; tbl_char_ht[nN]:=h; endfor
+ for j=1 upto length(s):
+ nA:=ASCII(substring(j-1,j) of s); tbl_char_wd[nA]:=w; tbl_char_ht[nA]:=h;
+ endfor
enddef;
%-------------------------------------------------------------------------------------------------
char_size_set( 1, 1)("CGHMNOQW");
@@ -1075,32 +1118,34 @@ def Z_y=(hW,hH) enddef; def Z_z=(fW,hP) enddef;
def circ_O = Z_o..(.8aW,fH-qP)..tension 1.5..(.2aW,fH-qP)..Z_m..
(.2aW,1.5hP)..tension 1.5..(.8aW,1.5hP)..cycle enddef;
def circ_Oh = (hP,qH)..Z_x..(fW,qH)..Z_y..cycle enddef;
+def circ_sOh = (hP,qH)..Z_x..(.98fW,qH)..Z_y..cycle enddef;
def circ_Oa = (hP,0.35aH)..Z_x..(fW,0.35aH)..(hW,.7aH)..cycle enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def draw_char(expr s,p)=
aW:=atom_wd*tbl_char_wd[ASCII(s)]*(1-2ratio_atomgap_atom);
aH:=atom_wd*tbl_char_ht[ASCII(s)]*(1-2ratio_atomgap_atom);
cpos:=p-(aW/2,atom_wd/2*(1-2ratio_atomgap_atom));
- fP:=bond_pen_wd*ratio_char_bond;
+ fP:=atom_wd*ratio_char_atom;
hP:=fP/2; qP:=fP/4; fW:=aW-hP; hW:=aW/2; fH:=aH-hP; hH:=aH/2; qH:=aH/4;
%-----------------------------------------------------------------------------------------------
pickup pencircle scaled fP;
- if s="C": cdw sbp(.05,.95)circ_O;
- ef s="H": dwv Z_b--Z_w; dw Z_m--Z_o; dwv Z_e--Z_t;
- ef s="O": dw circ_O;
- ef s="N": dwv Z_b--Z_w; dwv Z_e--Z_t; dwvs(1.4)(1.4hP,aH)--(aW-1.4hP,0);
- ef s="S": cdw sbp(.05,.45)circ_O; cdw sbp(.55,.95)circ_O; dw (fW,.3aH){up}..{up}(hP,.7aH);
- ef s="F": dwh Z_q--Z_u; dwh (0,.45aH)--(fW,.45aH); dw Z_b--Z_r;
- ef s="P": dwv Z_b--Z_w; dw Z_r--(.65aW,fH){right}..(fW,.7aH)..{left}(.65aW,.44aH)..(hP,.44aH);
+ if s="C": cdw sbp(.05,.95)circ_O;
+ ef s="H": dwv Z_b--Z_w; dw Z_m--Z_o; dwv Z_e--Z_t;
+ ef s="O": dw circ_O;
+ ef s="N": dwv Z_b--Z_w; dwv Z_e--Z_t; dwvs(1.4)(1.4hP,aH)--(aW-1.4hP,0);
+ ef s="S": cdw sbp(.05,.45)circ_O; cdw sbp(.55,.95)circ_O; dw (fW,.3aH){up}..{up}(hP,.7aH);
+ ef s="F": dwh Z_q--Z_u; dwh (.1hP,.48aH)--(fW-hP,.48aH); dwv Z_b--Z_r;
+ ef s="P": dwv Z_b--Z_w; dw Z_r--(.65aW,fH){right}..(fW,.7aH)..{left}(.65aW,.44aH)..(hP,.44aH);
ef s="I": dwv Z_x--Z_s; dwh (hW-fP,hP)--(hW+fP,hP); dwh (hW-fP,fH)--(hW+fP,fH);
ef s="l": dwv Z_g--Z_f; dwh Z_s--Z_r; dwh Z_x--Z_z;
ef s="2": cdw (hP,1.3hP)..(.4fW,.35fH)..(fW,.65aH)..Z_s..(hP,.65aH); dwh Z_d--Z_a;
- ef s="3": cdw sbp(0,.75)circ_Oh; cdw sbp(.25,.98)circ_Oh shifted (0,hH-hP); dwh (.3aW,hH)--Z_y;
+ ef s="3": cdw sbp(0,.75)circ_Oh; cdw sbp(.25,.95)circ_sOh shifted (.2hP,hH-hP);
+ dwh (.3aW,hH)--(.7aW,hH);
ef s="4": dwh Z_j--Z_k; dwv Z_l--(0.75aW,aH)--(1.2hP,qH+hP); dwv (.75aW+qP,aH)--(1.7hP,qH+hP);
ef s="-": dwh Z_m--Z_o;
ef s="+": dwv Z_x--Z_s; dwh Z_m--Z_o;
ef s="A": dwvs(1.14)Z_b--Z_f--Z_e; dw .33[Z_b,Z_f]--.33[Z_e,Z_f];
- ef s="B": dw Z_r--Z_s{right}..(.9fH,.75aH)..{left}Z_y--Z_m--Z_y{right}..(.9fH,qH)..
+ ef s="B": dw Z_r--Z_s{right}..(.85fH,.75aH)..{left}Z_y--Z_m--Z_y{right}..(.9fH,qH)..
{left}Z_x--Z_c; dwv Z_b--Z_w;
ef s="D": dw Z_r--Z_s..Z_o..Z_x--Z_c; dwv Z_b--Z_w;
ef s="E": pickup pensquare scaled fP; dw Z_z--Z_c--Z_r--Z_n; dw Z_m--Z_o;
@@ -1136,7 +1181,7 @@ def draw_char(expr s,p)=
ef s="o": dw Z_x..Z_o..Z_s..Z_m..cycle;
ef s="p": dw Z_x..Z_o..Z_s..Z_m..cycle; dwv Z_w--(hP,-.3aH);
ef s="q": dw Z_x..Z_o..Z_s..Z_m..cycle; dwv Z_t--(fW,-.3aH);
- ef s="r": cdw (sbp(.33,.72)Z_x..Z_o..Z_s..Z_m..cycle) shifted(0,-hP); dwv Z_b--Z_w;
+ ef s="r": cdw (sbp(.35,.72)Z_x..Z_o..Z_s..Z_m..cycle) shifted(0,-1.5hP); dwv Z_b--Z_w;
ef s="s": cdw sbp(.05,.45)circ_O; cdw sbp(.55,.95)circ_O; dw (fW,.3aH){up}..{up}(hP,.7aH);
ef s="t": dwv Z_g--Z_f; dwh (0,.66aH)--(aW,.66aH);
ef s="u": cdw Z_w..(hP,.55aH){down}..Z_x..(fW,.55aH){up}..Z_t; dwv Z_t--Z_e;
@@ -1147,8 +1192,8 @@ def draw_char(expr s,p)=
ef s="z": dwh Z_q--Z_u; dwvs(1.4)(1.4hP,fP)--(aW-1.4hP,aH-fP); dwh Z_a--Z_d;
ef s="0": dw Z_m...Z_s...Z_o...Z_x...cycle;
ef s="1": dwv Z_g--(hW,aH-.3hP)--(hW-fP,aH-fP)--(hW-fP,aH-1.5fP);
- ef s="5": dwh Z_q--Z_u; dwv Z_r--(hP,.55fH);
- cdw (qP,.18aH)..(.65aW,1.3hP)..(fW,.4aH)..(hW,.63aH)..(.7hP,.56aH);
+ ef s="5": dwh Z_q--Z_u-(hP,0); dwv Z_r--(hP,.55fH);
+ cdw (qP,.25aH)..(.65aW,1.3hP)..(fW,.4aH)..(hW,.63aH)..(.7hP,.56aH);
ef s="6": dw Z_x..(fW,.5fW)..Z_i..(hP,.5fW)..cycle; cdw (.8fP,hH)--Z_f;
ef s="7": dwh (0,.fH)--Z_u; dwvs(1.2)(aW-1.2hP,aH-fP)--(.4aW,0);
ef s="8": dw circ_Oh; dw (hP,.75aH)...Z_s...(fW,.75aH)...Z_y...cycle;
@@ -1157,29 +1202,37 @@ def draw_char(expr s,p)=
fi
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-def warning_bond(expr a)=
+def warn_valence(expr a)=
if addA[a]=0:
- warning("A"&decimal(a)&" ( "&fsl(8)(str_tbl[strA[a]])&") has"&fdr(2)(bond_cntA)&" bonds");
+ warning_s[incr warning_cnt]:="!Strange valence "&str_tbl[strA[a]]&"(A"&decimal(a)&") has"&
+ fdr(2)(bond_cntA)&" bonds";
+ message "["&decimal(fig_num)&"]"&warning_s[warning_cnt]; message "";
fi
enddef;
%-------------------------------------------------------------------------------------------------
vardef erase_char(expr s)=
- sS:="";
- if (length(s)>=4)and(s<>"COOH"):
- for i=1 upto length(s): sC:=subc(i,s); if scan_c(sC,"{}_^+-")=0: sS:=sS&sC; fi endfor sS
+ temps:=""; nA:=length(s);
+ if (nA>=4)and(s<>"COOH"):
+ for i=1 upto nA:
+ tempc:=substring(i-1,i) of s;
+ if scan_c(tempc,"{}_^+")=0: temps:=temps&tempc; fi
+ endfor
+ temps
else: s
fi
enddef;
%-------------------------------------------------------------------------------------------------
-vardef forbidden_to_underbar(expr t)= sS:="";
- for i=1 upto length(t):
- sC:=subc(i,t); if scan_c(sC,forbiddens)>0: sS:=sS&"_"; else: sS:=sS&sC; fi
+vardef forbidden_to_underbar(expr s)=
+ temps:=""; nA:=length(s);
+ for i=1 upto nA:
+ tempc:=substring(i-1,i) of s;
+ if scan_c(tempc,forbiddens)>0: temps:=temps&"_"; else: temps:=temps&tempc; fi
endfor
- sS
+ temps
enddef;
%=================================================================================================
def proc_calc(expr n)=
- MW_n:=MI_n:=tbl_atom_max:=warning_cnt:=hideH_cnt:=0; nE:=pcode_emb_start;
+ MW_n:=MI_n:=tbl_atom_max:=warning_cnt:=hideH_cnt:=0; nA:=pcode_emb_start;
for i=1 upto tbl_atom_end: sumA[i]:=0; endfor
for i=1 upto cntA:
knownA:=bond_cntA:=0; nS:=strA[i];
@@ -1188,23 +1241,23 @@ def proc_calc(expr n)=
if (sB[j]=i)or(eB[j]=i): bond_cntA:=bond_cntA+bond_num[j]; fi
endfor
Bcnt[i]:=bond_cntA;
- if ((nS=0)or(nS=(C-nE)))and(bond_cntA<4):
+ if ((nS=0)or(nS=(C-nA)))and(bond_cntA<4):
hideH[i]:=4-bond_cntA; hideH_cnt:=hideH_cnt+hideH[i]; else: hideH[i]:=0;
fi
- if nS=0: if bond_cntA>4: warning_bond(i) fi
- ef nS=(O-nE): if bond_cntA<>2: warning_bond(i) fi
- ef nS=(N-nE): if (bond_cntA<>3)and(bond_cntA<>5): warning_bond(i) fi
- ef nS=(S-nE): if (bond_cntA<>2)and(bond_cntA<>4)and(bond_cntA<>6): warning_bond(i) fi
- ef nS=(H-nE): if bond_cntA<>1: warning_bond(i) fi
- ef nS=(OH-nE): if bond_cntA<>1: warning_bond(i) fi
- ef nS=(COOH-nE): if bond_cntA<>1: warning_bond(i) fi
- ef nS=(NH2-nE): if bond_cntA<>1: warning_bond(i) fi
- ef nS=(CN-nE): if bond_cntA<>1: warning_bond(i) fi
- ef nS=(P-nE): if bond_cntA<>5: warning_bond(i) fi
- ef nS=(C-nE): if bond_cntA>4: warning_bond(i) fi
- ef nS=(F-nE): if bond_cntA<>1: warning_bond(i) fi
- ef nS=(Cl-nE): if bond_cntA<>1: warning_bond(i) fi
- ef nS=(Br-nE): if bond_cntA<>1: warning_bond(i) fi
+ if nS=0: if bond_cntA>4: warn_valence(i) fi
+ ef nS=(O-nA): if bond_cntA<>2: warn_valence(i) fi
+ ef nS=(N-nA): if (bond_cntA<>3)and(bond_cntA<>5): warn_valence(i) fi
+ ef nS=(S-nA): if (bond_cntA<>2)and(bond_cntA<>4)and(bond_cntA<>6): warn_valence(i) fi
+ ef nS=(H-nA): if bond_cntA<>1: warn_valence(i) fi
+ ef nS=(OH-nA): if bond_cntA<>1: warn_valence(i) fi
+ ef nS=(COOH-nA): if bond_cntA<>1: warn_valence(i) fi
+ ef nS=(NH2-nA): if bond_cntA<>1: warn_valence(i) fi
+ ef nS=(CN-nA): if bond_cntA<>1: warn_valence(i) fi
+ ef nS=(P-nA): if bond_cntA<>5: warn_valence(i) fi
+ ef nS=(C-nA): if bond_cntA>4: warn_valence(i) fi
+ ef nS=(F-nA): if bond_cntA<>1: warn_valence(i) fi
+ ef nS=(Cl-nA): if bond_cntA<>1: warn_valence(i) fi
+ ef nS=(Br-nA): if bond_cntA<>1: warn_valence(i) fi
fi
for j=1 upto tbl_group_end:
if str_tbl[nS]=tbl_atom_str[j]:
@@ -1219,7 +1272,7 @@ def proc_calc(expr n)=
fi
exitif knownA=1;
endfor
- if knownA=0: warning(" Unknown Str("&str_tbl[strA[i]]&") is used "&decimal(i)); fi
+ if knownA=0: message " Unknown Str("&str_tbl[strA[i]]&") is used "&decimal(i); fi
endfor
%-------------------------------------------------------------------------------------
sumA[2]:=sumA[2]+hideH_cnt; if (tbl_atom_max=1)and(sumA[2]>0): tbl_atom_max:=2; fi
@@ -1233,56 +1286,58 @@ def proc_calc(expr n)=
enddef;
%=================================================================================================
def proc_report_out=
+ block_cnt_s:=split_str(mc,",")(block_s);
file_output:=jobname&"-report.txt";
- printf "===========================================================================";
- printf " No["&decimal(fig_num)&"],Name<"& EN&">,Category<"&CAT&">,File<"&file_input&">";
- printf "---------------------------------------------------------------------------";
- for i=1 upto mc_row: printf (substring(0,mc_indent[i]) of blanks)&mc[i]; endfor
- printf "---------------------------------------------------------------------------";
- printf " Row["&decimal(mc_row)&"],Length["&decimal(length(mc))&"],Block"&
- "["&decimal(block_cnt+1)&"]"&",Code pair["&decimal(pcode_cnt[0])&
- "],Warning["&decimal(warning_cnt)&"]";
- printf "---------------------------------------------------------------------------";
- printf "" for i=EQU,CLN,QES,AMK,AMP,HSH,GTN,BAR,QUT,TLD,HAT,BQT,LTN:
- if tbl_asc[i]>=1: &" "&char(i)&"["&decimal(tbl_asc[i])&"]" fi
- endfor ;
- printf "---------------------------------------------------------------------------";
- printf " Width["&fdr(8)(mol_wd)&"],Height["&fdr(8)(mol_ht)&"],"&
+ puts "===========================================================================";
+ puts " No["&decimal(fig_num)&"],Name<"& EN&">,Category<"&CAT&">,File<"&file_input&">";
+ puts "---------------------------------------------------------------------------";
+ puts " Row["&decimal(mc_row)&"],Length["&decimal(length(mc))&"],Block"&
+ "["&decimal(block_cnt_s)&"]"&",BackboneA["&decimal(backboneA)&"]"&
+ ",BackboneB["&decimal(backboneB)&"]"&",Group["&decimal(group_num)&"]";
+ puts "---------------------------------------------------------------------------";
+ for i=1 upto mc_row: puts (substring(0,mc_indent[i]) of blanks)&mc[i]; endfor
+ puts "---------------------------------------------------------------------------";
+ for i=1 upto block_cnt_s: puts "["&fdl(3)(i)&"] "&block_s[i]; endfor
+ puts "- unknown and warning -----------------------------------------------------";
+ for i=1 upto unknown_cnt: puts unknown_s[i]; endfor
+ for i=1 upto warning_cnt: puts warning_s[i]; endfor
+ puts "---------------------------------------------------------------------------";
+ puts " Width["&fdr(8)(mol_wd)&"],Height["&fdr(8)(mol_ht)&"],"&
" Shift x["& fdr(8)(minX)&"],Shift y["&fdr(8)(minY)&"]";
- printf " Bond length["&fdr(8)(blen)&"],Atom size["&fdr(8)(atom_wd)&"]";
- printf "---------------------------------------------------------------------------";
- printf " Atom["&decimal(cntA)&"],Bond["&decimal(cntB)&
+ puts " Bond length["&fdr(8)(blen)&"],Atom size["&fdr(8)(atom_wd)&"]";
+ puts "---------------------------------------------------------------------------";
+ puts " Atom["&decimal(cntA)&"],Bond["&decimal(cntB)&
"],Ring["&decimal(cntB-cntA+1)&"],Hide H["&decimal(hideH_cnt)&"]";
- printf "< NO. ><atom(s) >( x axis , y axis )<bond><hideH><chg>";
+ puts "< NO. ><atom(s) >( x axis , y axis )<bond><hideH><chg>";
for i=1 upto cntA:
- printf " A"&fdl(6)(i)&fsl(8)(erase_char(str_tbl[strA[i]]))&
+ puts " A"&fdl(6)(i)&fsl(8)(erase_char(str_tbl[strA[i]]))&
" ("&fdr(10)(round(xpart(posA[i])/blen))&" , "&
fdr(10)(round(ypart(posA[i])/blen))&" ) "&fdr(4)(Bcnt[i])&
iif(hideH[i]>0,fdr(6)(hideH[i])," ") if chargeA[i]<>0: &fdr(4)(chargeA[i]) fi;
endfor
- printf "---------------------------------------------------------------------------";
- printf "< NO. >< bond (sdt)><angle +( +- )><length ( pt )>";
+ puts "---------------------------------------------------------------------------";
+ puts "< NO. >< bond (sdt)><angle +( +- )><length ( pt )>";
for i=1 upto cntB:
nC:=lenB[i]; if nC=_size_atom: nC:=ratio_atom_bond; elseif nC<0: nC:=-nC; fi
nB:=angB[i]; if nB>180: nB:=nB-360; fi
- printf " B"&fdl(4)(i)&fdr(3)(sB[i])&" -> "&fdr(3)(eB[i])&
+ puts " B"&fdl(4)(i)&fdr(3)(sB[i])&" -> "&fdr(3)(eB[i])&
" ("&fdr(3)(bond_num[i])&")"&fdr(8)(round(angB[i]))&
" ("&fdr(6)(round(nB))&")"&fdr(8)(nC)&" ("&fdr(8)(round(nC*blen))&")";
endfor
- printf "---------------------------------------------------------------------------";
- printf "<atom>( atom wt )[ mi wt ] < cnt > < sum wt >[ sum mi wt ]";
+ puts "---------------------------------------------------------------------------";
+ puts "<atom>( atom wt )[ mi wt ] < cnt > < sum wt >[ sum mi wt ]";
for i=1 upto tbl_atom_max:
if sumA[i]>=1:
- printf " "&fsl(5)(erase_char(tbl_atom_str[i]))&
+ puts " "&fsl(5)(erase_char(tbl_atom_str[i]))&
"("&fdr(9)(tbl_atom_wt[i])&")"&"["&fdr(9)(tbl_atom_mi[i])&"]"&" * "&fdr(8)(sumA[i])
&" "&fdr(7)(tbl_atom_wt[i]*sumA[i])&"["&fdr(12)(tbl_atom_mi[i]*sumA[i])&"]";
fi
endfor
- printf " Molecular Weight [Mono Isotopic] = "&fsr(12)(mw)&"["&fsr(12)(MI)&"]";
- printf "---------------------------------------------------------------------------";
- printf " Weight Calc: "&mw if MW<>"-": &" - Input: "&MW&" = "&fdr(9)(MW_n-scantokens(MW)) fi;
- printf " Fomula Calc: "&fm if FM<>"-": &" "&iif(fm=FM,"=","<>")&" Input: "&FM fi;
- printf "===========================================================================";
+ puts " Molecular Weight [Mono Isotopic] = "&fsr(12)(mw)&"["&fsr(12)(MI)&"]";
+ puts "---------------------------------------------------------------------------";
+ puts " Weight Calc: "&mw if MW<>"-": &" - Input: "&MW&" = "&fdr(9)(MW_n-scantokens(MW)) fi;
+ puts " Fomula Calc: "&fm if FM<>"-": &" "&iif(fm=FM,"=","<>")&" Data: "&FM fi;
+ puts "===========================================================================";
enddef;
%=================================================================================================
def proc_mol_out(expr n)=
@@ -1290,54 +1345,54 @@ def proc_mol_out(expr n)=
file_output:="m"&fit_zero(fig_num)&"-"&EN_&".mol";
%-V2000---------------------------------------------------------------------------------------
if n=2000:
- printf ""; printf " -MCFtoMOL- "&fsl(20)(EN); printf "";
- printf fdr(3)(cntA)&fdr(3)(cntB)&" 0 0 0 0 0 0 0 0999 V2000";
+ puts ""; puts " -MCFtoMOL- "&fsl(20)(EN); puts "";
+ puts fdr(3)(cntA)&fdr(3)(cntB)&" 0 0 0 0 0 0 0 0999 V2000";
for i=1 upto cntA:
- printf fdr(10)(xpart(posA[i])/blen)& fdr(10)(ypart(posA[i])/blen)&fdr(10)(0)&" "&
+ puts fdr(10)(xpart(posA[i])/blen)& fdr(10)(ypart(posA[i])/blen)&fdr(10)(0)&" "&
fsl(2)(erase_char(str_tbl[strA[i]]))&" 0"&fdr(3)(bond_charge(chargeA[i]))&" 0 0";
endfor
for i=1 upto cntB:
- if lineB[i]<>0: printf fdr(3)(sB[i])&fdr(3)(eB[i])&fdr(3)(bond_type(lineB[i]))&
+ if lineB[i]<>0: puts fdr(3)(sB[i])&fdr(3)(eB[i])&fdr(3)(bond_type(lineB[i]))&
fdr(3)(bond_stereo(lineB[i]))&" 0 0";
fi
endfor
- printf "M END";
+ puts "M END";
%-V3000---------------------------------------------------------------------------------------
elseif n=3000:
- printf ""; printf " -MCFtoMOL- "&fsl(20)(EN); printf "";
- printf " 0 0 0 0 0 0 0 0 0 0 0 V3000";
- printf "M V30 BEGIN CTAB";
- printf "M V30 COUNTS "&decimal(cntA)&" "&decimal(cntB)&" 0 0 0";
- printf "M V30 BEGIN ATOM";
+ puts ""; puts " -MCFtoMOL- "&fsl(20)(EN); puts "";
+ puts " 0 0 0 0 0 0 0 0 0 0 0 V3000";
+ puts "M V30 BEGIN CTAB";
+ puts "M V30 COUNTS "&decimal(cntA)&" "&decimal(cntB)&" 0 0 0";
+ puts "M V30 BEGIN ATOM";
for i=1 upto cntA:
- printf "M V30 "&decimal(i)&" "&erase_char(str_tbl[strA[i]])&" "&
+ puts "M V30 "&decimal(i)&" "&erase_char(str_tbl[strA[i]])&" "&
decimal(xpart(posA[i])/blen)&" "&decimal(ypart(posA[i])/blen)&" 0 0"
if chargeA[i]<>0: &" CHG="&decimal(chargeA[i]) fi;
endfor
- printf "M V30 END ATOM"; printf "M V30 BEGIN BOND";
+ puts "M V30 END ATOM"; puts "M V30 BEGIN BOND";
for i=1 upto cntB:
if lineB[i]<>0:
- printf "M V30 "&decimal(i)&" "&decimal(bond_type(lineB[i]))&
+ puts "M V30 "&decimal(i)&" "&decimal(bond_type(lineB[i]))&
" "&decimal(sB[i])&" "&decimal(eB[i])
if bond_stereo(lineB[i])<>0: &" CFG="&decimal(bond_config(lineB[i])) fi;
fi
endfor
- printf "M V30 END BOND"; printf "M V30 END CTAB"; printf "M END"; fi
+ puts "M V30 END BOND"; puts "M V30 END CTAB"; puts "M END"; fi
enddef;
%=================================================================================================
def proc_mc_out=
file_output:="temp-mc.aux";
if mc_length<100:
- nN:=split_str(mc,",")(arg_s); nA:=0; temps:="";
- for i=1 upto nN:
- if i=nN: temps:=temps&arg_s[i]; printf temps;
- ef at_char[i+1]-nA>mc_length: nA:=at_char[i]; printf temps&arg_s[i]&","; temps:="";
+ nB:=split_str(mc,",")(arg_s); nA:=0; temps:="";
+ for i=1 upto nB:
+ if i=nB: temps:=temps&arg_s[i]; puts temps;
+ ef at_char[i+1]-nA>mc_length: nA:=at_char[i]; puts temps&arg_s[i]&","; temps:="";
else: temps:=temps&arg_s[i]&",";
fi
endfor
- else: for i=1 upto mc_row: printf (substring(0,mc_indent[i]) of blanks)&mc[i]; endfor
+ else: for i=1 upto mc_row: puts (substring(0,mc_indent[i]) of blanks)&mc[i]; endfor
fi
- printf EOF;
+ puts EOF;
enddef;
%=================================================================================================
vardef fit_zero(expr n)= if n<=9: "00" ef n<=99: "0" else: "" fi &decimal(n) enddef;
@@ -1351,14 +1406,14 @@ vardef bond_config(expr n)=
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
vardef define_atom(expr s,WT,MI)=
str_cnt:=str_cnt+1; tbl_cnt:=tbl_cnt+1; pcode_num:=pcode_num+1;
- pcode_com[pcode_num][1]:=_set_atom; pcode_par[pcode_num][1]:=str_cnt; pcode_cnt[pcode_num]:=1;
+ pcode_x[pcode_num][1]:=_set_atom; pcode_y[pcode_num][1]:=str_cnt; pcode_cnt[pcode_num]:=1;
str_tbl[str_cnt]:=tbl_atom_str[tbl_cnt]:=s; tbl_atom[tbl_cnt]:=0;
tbl_atom_wt[tbl_cnt]:=WT; tbl_atom_mi[tbl_cnt]:=MI; pcode_num
enddef;
%-------------------------------------------------------------------------------------------------
vardef define_group_string(expr s)(text t)=
str_cnt:=str_cnt+1; tbl_cnt:=tbl_cnt+1; pcode_num:=pcode_num+1;
- pcode_com[pcode_num][1]:=_set_atom; pcode_par[pcode_num][1]:=str_cnt; pcode_cnt[pcode_num]:=1;
+ pcode_x[pcode_num][1]:=_set_atom; pcode_y[pcode_num][1]:=str_cnt; pcode_cnt[pcode_num]:=1;
str_tbl[str_cnt]:=tbl_atom_str[tbl_cnt]:=s; tbl_atom[tbl_cnt]:=0;
for list=t: tbl_group[tbl_cnt][incr tbl_atom[tbl_cnt]]:=list-pcode_emb_start; endfor
pcode_num
@@ -1398,48 +1453,47 @@ def define_atom_group_parts=
NO_ATOM:=`("",0,0);
tbl_atom_end:=tbl_cnt;
%-----------------------------------------------------------------------------------------------
- if sw_expand=0:
+ if f_expand=0:
CH3:=``("C{H_3_}")(C,H,H,H); CH2:=``("C{H_3_}")(C,H,H); CN:=``("CN")(C,N); OH:=``("OH")(O,H);
COOH:=``("COOH")(C,O,O,H); COONa:=``("COO{Na}")(C,O,O,Na); CHO:=``("CHO")(C,H,O);
NO:=``("NO")(N,O); NO2:=``("N{O_2_}")(N,O,O); NH2:=``("N{H_2_}")(N,H,H);
- SH:= ``("SH")(S,H); SO2H:=``("S{O_2_}H")(S,O,O,H); SO3H:=``("S{O_3_}H")(S,O,O,O,H);
+ SH:=``("SH")(S,H); SO2H:=``("S{O_2_}H")(S,O,O,H); SO3H:=``("S{O_3_}H")(S,O,O,O,H);
ONa:=``("O{Na}")(O,Na); SO3Na:=``("S{O_3_}{Na}")(S,O,O,O,Na);
fi
%-----------------------------------------------------------------------------------------------
tbl_group_end:=tbl_cnt; pcode_atm_end:=pcode_num;
- ?:=(_group_si,NO_ATOM); ?wf:=?w:=(_group_si,NO_ATOM); ?zf:=?z:=(_group_si,NO_ATOM);
- ?O:=(_group_dm,O); NH:='(N,/H~nl); ?NH:=(_group_dm,NH);
+ !:=!1:='((_mk_bond,_arrange_ang));
+ if f_expand=1:
+ NH:='(N,/H); CH3:='(/H,/H^60,/H^-60); NH2:='(N,/H^60,/H^-60); NO2:='(N,//O^60,//O^-60);
+ OH:='(O,!,H); NO:='(N,!~dm,O); SH:='(S,!,H); SO2H:='(S,//O,!,OH);
+ SO3H:='(S,//O^35,//O^-35,!,OH); CHO:='(//O,!,H); COOH:='(//O,!,OH); CN:='(!~tm,N);
+ ONa:='(O,!,Na); SO3Na:='(S,//O^35,//O^-35,!,Na);
+ else: NH:='(N,/H~nl);
+ fi
+ ?:='((_group_si,NO_ATOM)); ?wf:=?w:='((_group_wf,NO_ATOM));
+ ?zf:=?z:='((_group_zf,NO_ATOM)); ?dm:=?d:='((_group_dm,NO_ATOM));
+ ?O:='((_group_dm,O)); ?S:='((_group_dm,S)); ?NH:='((_group_dm,NH));
%-----------------------------------------------------------------------------------------------
?H:='(/H); ?F:='(/F); ?Cl:='(/Cl); ?OH:='(/OH); ?OH:='(/COOH); ?NH2:='(/NH2);
for i=3 upto 20: ?[i]:='((_com,_len_ss),(_get_len,_ring_len),<((-180 DIV i)-90)
for j==2 upto i:: ,(360 DIV i) endfor,(_cyc_sB,1-i),(_com,_len_ee));
endfor
Ph:=Ph1:='(?6,-2=dl,-4=dl,-6=dl); Ph2:='(?6,-1=dl,-3=dl,-5=dl);
- for i=5,6,7,8: for j=11 upto 15: ?[i][j]:='((i,j)); endfor endfor
%-----------------------------------------------------------------------------------------------
- !:=!1:='((_mk_bond,_arrange_ang)); !db:=!d:='(!~db); !tm:=!t:='(!~tm); !wf:=!w:='(!~wf);
- !zf:=!z:='(!~zf); !wb:='(!~wb); !zb:='(!~zb); !dl:='(!~dl); !dr:='(!~dr); !dm:='(!~dm);
+ !db:=!d:='(!~db); !tm:=!t:='(!~tm); !wf:=!w:='(!~wf); !zf:=!z:='(!~zf); !wb:='(!~wb);
+ !zb:='(!~zb); !dl:='(!~dl); !dr:='(!~dr); !dm:='(!~dm); !!d:='(!,!db); !!d!:='(!,!db,!);
for i==2 upto 20:
![i]:='((_com,_len_ss),(_get_len,_tmp_len),! for j==2 upto i::,! endfor ,(_com,_len_ee));
endfor
- ?!:='(/_,!); ?!d:='(/_,!d); ?!2:='(/_,!2); ??!:='(/_,/_^60,60); ??:='(/_^35,/_^-35);
- !?:='(!,/_); !?!:='(!?,!); !??!:='(!,??,!); ?2:='(/!); !?2:='(!,?2); ?2!:='(?2,!);
+ ?!:='(?,!); ?!d:='(?,!d); ?!2:='(?,!2); ??!:='(?,?^60,60); ??:='(?^35,?^-35);
+ !?:='(!,?); !?!:='(!?,!); !??!:='(!,??,!); !??:='(!,??); ?2:='(/!); !?2:='(!,?2); ?2!:='(?2,!);
n_:='((_set_add,MIS)); p_:='((_set_add,PLS));
- zero_wf:='(0~wf); zero_zf:='(0~zf); zero_dm:='(0~dm); zero_wv:='(0~wv);
mark_adress:='((_com,_mark)); reset_adress:='((_com,_moff)); reset_length:='((_com,_len_e));
%-----------------------------------------------------------------------------------------------
- if sw_expand=1:
- CH3:='(/H,/H^60,/H^-60); NH:='(N,/H); NH2:='(N,/H^60,/H^-60); NO2:='(N,//O^60,//O^-60);
- OH:='(O,!,H); NO:='(N,//O); CONH2:='(//O,!,NH2); SH:='(S,!,H); SO2H:='(S,//O^60,/OH^-60);
- SO3H:='(S,/OH,//O^60,//O^-60); CHO:='(//O^-60,/H^60); COOH:='(//O^-60,/OH^60); CN:='(!~tm,N);
- ONa:='(O,!,Na); SO3Na:='(S,/ONa,//O^60,//O^-60);
- fi
- %-----------------------------------------------------------------------------------------------
- ?F!F:='(/F,60,F); ?Cl!Cl:='(/Cl,60,Cl); ?Br!Br:='(/Br,60,Br); ?F?F!F:='(/F,/F^60,60,F);
+ ?F!F:='(/F,60,F); ?F?F!F:='(/F,/F^60,60,F); ?Br!Br:='(/Br,60,Br); ?Cl!Cl:='(/Cl,60,Cl);
?Cl?Cl!Cl:='(/Cl,/Cl^60,60,Cl);
%-----------------------------------------------------------------------------------------------
- N!:='(N,!); N?:='(N,/_); N!2:='(N,!3); N!2:='(N,!3); !N:='(!,N);
- N?!:='(N,?!); N?2:='(N,?2); N?2!:='(N?2,!); N?!2:='(N,?!2);
+ N!:='(N,!); N?:='(N,?); N!2:='(N,!3); N!2:='(N,!3); !N:='(!,N); N?!:='(N,?!); N?2:='(N,?2);
S?O:='(S,?O); S?O!:='(S?O,!); ?O?O:='(?O^-35,?O^35); S?O?O:='(S,?O?O); S?O?O!:='(S?O?O,!);
O!:='(O,!); O!2:='(O,!2); O!3:='(O,!3); S!:='(S,!); S!2:='(S,!2); S!3:='(S,!3);
%-----------------------------------------------------------------------------------------------
@@ -1447,10 +1501,8 @@ def define_atom_group_parts=
NH!:='(NH,!); NH!2:='(NH,!2); !NH:='(!,NH); !NH!:='(!,NH!);
%-----------------------------------------------------------------------------------------------
!OH:='(!,OH); !SH:='(!,SH); !NH2:='(!,NH2); !S?O:='(!,S?O); !O:='(!,O); !dO:='(!d,O);
- !O!:='(!,O!); !O!2:='(!,O!2); !O!3:='(!,O!3); !S!:='(!,S!); !S!2:='(!,S!2); !S!3:='(!,S!3);
+ !Cl:='(!,Cl); !Br:='(!,Br); !F:='(!,F); !O!:='(!,O!); !S!:='(!,S!);
!COOH:='(!,COOH); ?COOH:='(/COOH); !CH3:='(!,CH3); !CN:='(!,CN); !CHO:='(!,CHO); !NO2:='(!,NO2);
- !Cl:='(!,Cl); !Br:='(!,Br); !F:='(!,F); !?F!F:='(!,?F!F); !?Cl!Cl:='(!,?Cl!Cl);
- !?F?F!F:='(!,?F?F!F); !?Cl?Cl!Cl:='(!,?Cl?Cl!Cl);
!?3:='(!,?3); !?4:='(!,?4); !?5:='(!,?5); !?6:='(!,?6); !?7:='(!,?7); !?8:='(!,?8);
!Ph:='(!,Ph); !?OH:='(!,?OH); ?OH!:='(?OH,!);
%-----------------------------------------------------------------------------------------------
@@ -1470,25 +1522,27 @@ message "pcode_emb =" & decimal(pcode_emb_start) &" => " & decimal(pcode_num) &
message "pcode_emi =" & decimal(pcode_emi_start) &" => " & decimal(pcode_int);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
vardef checkm(expr s)=
- save mc_char,mc_adr,mc_asc,char_cnt,lens,f_depth;
- string err_type[];
+ save mc_char,mc_adr,mc_asc,err_type,char_cnt,lens,f_exit;
numeric mc_char[],mc_asc[],mc_adr[];
- err_cnt:=char_cnt:=block_cnt:=f_depth:=0; nA:=1; lens:=length(s);
- err_type[0]:="no mc-row "; err_type[1]:="mismatch () "; err_type[2]:="mismatch {} ";
- err_type[3]:="mismatch [] "; err_type[4]:="missing arg "; err_type[5]:="extra arg ";
+ %---------------------------------------------------------------------------------------------
+ string err_type[];
+ err_cnt:=char_cnt:=0; nA:=1; lens:=length(s);
+ err_type[0]:="Error no mc-row "; err_type[1]:="Error mismatch ()";
+ err_type[2]:="Error mismatch {}"; err_type[4]:="Error missing arg";
+ err_type[5]:="Error extra arg ";
%---------------------------------------------------------------------------------------------
if mc_row>=1:
for i=1 upto 128: tbl_asc[i]:=0; endfor
- for i=1 upto lens: mc_char[i]:=ASCII(subc(i,s)); endfor
+ for i=1 upto lens: mc_char[i]:=ASCII(substring(i-1,i) of s); endfor
forever:
- temps:=substring (nA-1,nA) of s;
- if (temps<>",")and(temps<>" "): nF:=0;
- for j=1 upto rw_cnt: nC:=lenw[j]-1;
+ tempc:=substring (nA-1,nA) of s;
+ if (tempc<>",")and(tempc<>" "): f_exit:=0;
+ for j=1 upto rw_cnt:
+ nC:=lenw[j]-1;
if substring (nA-1,nA+nC) of s=rw[j]:
- for k=1 upto nC: mc_char[nA]:=j; mc_char[nA+k]:=BLK; endfor
- nF:=1; nA:=nA+nC;
+ for k=1 upto nC: mc_char[nA]:=j; mc_char[nA+k]:=BLK; endfor nA:=nA+nC; f_exit:=1;
fi
- exitif nF=1;
+ exitif f_exit=1;
endfor
fi
nA:=nA+1; exitif nA>=lens;
@@ -1500,21 +1554,19 @@ vardef checkm(expr s)=
%-- argument check -------------------------------------------------------------------------
for i=1 upto char_cnt:
nA:=mc_asc[i-1]; nB:=mc_asc[i]; nC:=mc_asc[i+1]; tbl_asc[nB]:=tbl_asc[nB]+1;
- if nB=CMA: if f_depth=0: block_cnt:=block_cnt+1; fi
- ef (nB=EQU)or(nB=CLN)or(nB=HAT)or(nB=BQT)or(nB=TLD)or(nB=LTN): % =,:,^,`,~,>
- if (nA=CMA)or(nC=CMA): proc_err(4,i) fi
- ef (nB=AMK)or(nB=AMP)or(nB=GTN)or(nB=HSH): % @,&,<,#
- if nA<>CMA: proc_err(5,nB) fi if nC=CMA: proc_err(4,i) fi
- ef (nB=SLS)or((nB>=7)and(nB<=11)): % /,*/*,//,/*,*/,**
- if (nA<>CMA)and(nA<>CLN)and(nA<>PRS): proc_err(5,i) fi
- if nC=CMA: proc_err(4,i) fi
+ if (nB=EQU)or(nB=CLN)or(nB=HAT)or(nB=BQT)or(nB=TLD)or(nB=LTN)or(nB=QUT): % =,:,^,`,~,>,'
+ if (nA=CMA)or(nC=CMA)or(nA=QUT)or(nC=QUT): proc_err(4,i) fi
+ ef (nB=AMK)or(nB=AMP)or(nB=GTN): % @,&,<,$
+ if nA<>CMA: proc_err(5,nB) fi if (nC=CMA)or(nC=QUT): proc_err(4,i) fi
+ ef (nB=SLS)or((nB>=1)and(nB<=4)):
+ if (nA<>CMA)and(nA<>CLN)and(nA<>PRS): proc_err(5,i) fi % /,*/*,//,/*,*/
+ if (nC=CMA)or(nC=QUT): proc_err(4,i) fi
+ ef nB=DOL: if (nC=QUT)or(nC=CMA): proc_err(4,i) fi
fi
- if (nB=PRS)or(nB=BRS): f_depth:=f_depth+1; ef (nB=PRE)or(nB=BRE): f_depth:=f_depth-1; fi
endfor
%-- brackets balance check -----------------------------------------------------------------
if tbl_asc[PRS]<>tbl_asc[PRE]: proc_err(1,0) fi % mismatch ()
if tbl_asc[BRS]<>tbl_asc[BRE]: proc_err(2,0) fi % mismatch {}
- if tbl_asc[BKS]<>tbl_asc[BKE]: proc_err(3,0) fi % mismatch []
else: proc_err(0,0) fi
%---------------------------------------------------------------------------------------------
%%%%%%% err_cnt>0: readstring;
@@ -1523,26 +1575,25 @@ enddef;
%-------------------------------------------------------------------------------------------------
def proc_err(expr e,n)=
err_cnt:=err_cnt+1;
- message "["&decimal(fig_num)&"]:"&err_type[e]
+ message "["&decimal(fig_num)&"]#"&err_type[e]
if n>=1: &"("&fdr(3)(n)&") "&substring(mc_adr[n]-2,mc_adr[n]+3) of mc fi ;
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def savem(expr s)=
file_output:=s;
- for i=1 upto ucount: for j=1 upto unit_lines[i]: printf row[i][j]; endfor endfor
+ for i=1 upto ucount: for j=1 upto unit_lines[i]: puts row[i][j]; endfor endfor
closefrom file_output;
enddef;
%-------------------------------------------------------------------------------------------------
def loadm(text s)=
begingroup
- save f_mcf,f_line,lines,unit_cnt,row_s,row_cnt,semic_cnt,info_cnt,order,min_n,max_n,firstc,
- sign_at,sign_n,filter_n,filter_tag,filter_var,filter_sign,filter_cnt,filter_p,lib_unit_cnt,
- at_colon,at_equal,at_less,at_greater,at_n,sort_tbl,key_s,sort_s,sign_s,sV,sS,sT,sort_oder,
- tag_s,val_s;
- string row_s[][],sort_s,sort_tbl[],key_s,filter_tag[],filter_var[],sign_s[],sV,sS,sT,firstc,
- tag_s[][],val_s[][];
+ save f_mcf,lines,unit_cnt,row_s,row_cnt,info_cnt,order,min_n,max_n,sign_at,sign_n,tag_s,
+ val_s,filter_n,filter_tag,filter_val,filter_sign,filter_cnt,filter_p,lib_unit_cnt,at_colon,
+ at_equal,at_less,at_greater,at_n,sort_tbl,key_s,sort_s,sign_s,sV,sT,sort_oder;
+ string row_s[][],sort_s,sort_tbl[],key_s,filter_tag[],filter_val[],sign_s[],tag_s[][],val_s[][],
+ sV,sT;
numeric row_cnt[],order[],order_tbl[],filter_sign[],filter_p[];
- lines:=f_mcf:=mc_row:=info_cnt:=filter_cnt:=lib_unit_cnt:=0; unit_cnt:=1;
+ lines:=f_mcf:=mc_row:=info_cnt:=filter_cnt:=lib_unit_cnt:=0; unit_cnt:=1;
file_input:=default_library;
sign_s1:="="; sign_s2:="<>"; sign_s3:="<"; sign_s4:=">"; sign_s5:="<="; sign_s6:=">=";
%-----------------------------------------------------------------------------------------------
@@ -1553,27 +1604,36 @@ def loadm(text s)=
if at_colon>=2: sign_at:=at_colon; sign_n:=0; at_n:=1;
ef at_equal>=2: if (at_equal-1)=at_less: sign_at:=at_equal; sign_n:=5; at_n:=2;
ef (at_equal-1)=at_greater: sign_at:=at_equal; sign_n:=6; at_n:=2;
- else: sign_at:=at_equal; sign_n:=1; at_n:=1; fi
+ else: sign_at:=at_equal; sign_n:=1; at_n:=1;
+ fi
ef at_greater>=2: if (at_greater-1)=at_less: sign_at:=at_greater; sign_n:=2; at_n:=2;
- else: sign_at:=at_greater; sign_n:=4; at_n:=1; fi
- ef at_less>=2: sign_at:=at_less; sign_n:=3; at_n:=1; fi
- sT:=substring(0,sign_at-at_n) of list; sV:=substring(sign_at,length(list)) of list;
+ else: sign_at:=at_greater; sign_n:=4; at_n:=1;
+ fi
+ ef at_less>=2: sign_at:=at_less; sign_n:=3; at_n:=1;
+ fi
+ sT:=substring(0,sign_at-at_n) of list;
+ sV:=substring(sign_at,length(list)) of list;
%---------------------------------------------------------------------------------------------
if sign_n=0:
if sT="f": if scan_c(".",sV)=0: file_input:=sV&".mcf"; else: file_input:=sV; fi
ef sT="a": key_s:=sV; sort_oder:=0;
- ef sT="d": key_s:=sV; sort_oder:=1; fi
+ ef sT="d": key_s:=sV; sort_oder:=1;
+ fi
else:
- filter_tag[incr filter_cnt]:=sT; filter_sign[filter_cnt]:=sign_n;
- if (sign_n>=3)and(is_num(sV)=1): filter_var[filter_cnt]:=fix_num(sV);
- else: filter_var[filter_cnt]:=sV; fi
+ filter_tag[incr filter_cnt]:=sT;
+ filter_sign[filter_cnt]:=sign_n;
+ if (sign_n>=3)and(is_num(sV)=1): filter_val[filter_cnt]:=fix_num(sV);
+ else: filter_val[filter_cnt]:=sV;
+ fi
fi
endfor
%-----------------------------------------------------------------------------------------------
forever:
- temps:=readfrom file_input; exitif temps=EOF; firstc:=subc(1,temps);
+ line_s:=readfrom file_input;
+ exitif line_s=EOF;
+ firstc:=substring(0,1) of line_s;
if (firstc<>"%")or(sw_comment=1):
- row_s[unit_cnt][incr lines]:=temps;
+ row_s[unit_cnt][incr lines]:=line_s;
if firstc=";":
row_cnt[unit_cnt]:=lines; f_mcf:=lines:=0; filter_n:=1;
for i=1 upto filter_cnt: filter_p[i]:=0; endfor
@@ -1585,13 +1645,13 @@ def loadm(text s)=
for j=1 upto filter_cnt:
if filter_tag[j]=sT:
filter_p[j]:=1;
- if (filter_sign[j]>=3)and(is_num(sV)=1): temps:=fix_num(sV); else: temps:=sV; fi
- if filter_sign[j]=1: if not(temps= filter_var[j]): filter_n:=0; fi
- ef filter_sign[j]=2: if not(temps<>filter_var[j]): filter_n:=0; fi
- ef filter_sign[j]=3: if not(temps< filter_var[j]): filter_n:=0; fi
- ef filter_sign[j]=4: if not(temps> filter_var[j]): filter_n:=0; fi
- ef filter_sign[j]=5: if not(temps<=filter_var[j]): filter_n:=0; fi
- ef filter_sign[j]=6: if not(temps>=filter_var[j]): filter_n:=0; fi
+ if (filter_sign[j]>=3)and(is_num(sV)=1): line_s:=fix_num(sV); else: line_s:=sV; fi
+ if filter_sign[j]=1: if not(line_s= filter_val[j]): filter_n:=0; fi
+ ef filter_sign[j]=2: if not(line_s<>filter_val[j]): filter_n:=0; fi
+ ef filter_sign[j]=3: if not(line_s< filter_val[j]): filter_n:=0; fi
+ ef filter_sign[j]=4: if not(line_s> filter_val[j]): filter_n:=0; fi
+ ef filter_sign[j]=5: if not(line_s<=filter_val[j]): filter_n:=0; fi
+ ef filter_sign[j]=6: if not(line_s>=filter_val[j]): filter_n:=0; fi
fi
fi
endfor
@@ -1601,7 +1661,8 @@ def loadm(text s)=
if filter_n=1: if key_s<>"": sort_tbl[unit_cnt]:=sort_s; fi unit_cnt:=unit_cnt+1; fi
ef (firstc=":")or(firstc="="): f_mcf:=1; mc_row:=1;
ef (firstc<>"%")or(sw_comment=1):
- if f_mcf=1: mc_row:=mc_row+1; else: info[unit_cnt]:=info_cnt:=split_str(temps,";")(arg_s);
+ if f_mcf=1: mc_row:=mc_row+1;
+ else: info[unit_cnt]:=info_cnt:=split_str(line_s,";")(arg_s);
fi
fi
fi
@@ -1609,10 +1670,10 @@ def loadm(text s)=
ucount:=unit_cnt:=unit_cnt-1;
%=============================================================================================
message "* Input : "&file_input&" ["&decimal(lib_unit_cnt)&"]";
- message "* Output : ucount ["&decimal(ucount)&"]";
+ message "* Output : ucount ["&decimal(ucount)&"]"; message "";
if filter_cnt>=1:
for i=1 upto filter_cnt:
- message "* Filter("&decimal(i)&"): "&filter_tag[i]&" "&sign_s[filter_sign[i]]&filter_var[i];
+ message "* Filter("&decimal(i)&"): "&filter_tag[i]&" "&sign_s[filter_sign[i]]&filter_val[i];
endfor
if key_s<>"": message "* Sort key : "&key_s&iif(sort_oder=0," (ascending)"," (descending)");
fi
@@ -1621,14 +1682,14 @@ def loadm(text s)=
if key_s<>"":
for i=1 upto unit_cnt: order[i]:=0; endfor
for i=1 upto unit_cnt:
- if sort_oder=0: temps:="~";
+ if sort_oder=0: line_s:="~";
for j=1 upto unit_cnt:
- if order[j]=0: if sort_tbl[j]<temps: temps:=sort_tbl[j]; min_n:=j; fi fi
+ if order[j]=0: if sort_tbl[j]<line_s: line_s:=sort_tbl[j]; min_n:=j; fi fi
endfor
order[min_n]:=i; order_tbl[i]:=min_n;
- ef sort_oder=1: temps:=" ";
+ ef sort_oder=1: line_s:=" ";
for j=1 upto unit_cnt:
- if order[j]=0: if sort_tbl[j]>temps: temps:=sort_tbl[j]; max_n:=j; fi fi
+ if order[j]=0: if sort_tbl[j]>line_s: line_s:=sort_tbl[j]; max_n:=j; fi fi
endfor
order[max_n]:=i; order_tbl[i]:=max_n;
fi
@@ -1654,16 +1715,17 @@ def loadm(text s)=
enddef;
%=============================================================================================
vardef fix_num(expr s)=
- sS:=s; nN:=scan_c(".",sS);
- if nN=0: sS:=fsr(4)(sS); ef nN=1: sS:=" 0"&sS;
- ef nN=2: sS:=" "&sS; ef nN=3: sS:=" "&sS; ef nN=4: sS:=" "&sS;
+ temps:=s; nN:=scan_c(".",temps);
+ if nN=0: temps:=fsr(4)(temps); ef nN=1: temps:=" 0"&temps;
+ ef nN=2: temps:=" "&temps; ef nN=3: temps:=" "&temps; ef nN=4: temps:=" "&temps;
fi
- sS
+ temps
enddef;
%-------------------------------------------------------------------------------------------------
vardef is_num(expr s)=
for i=1 upto length(s):
- if ((subc(i,s)>="0")and(subc(i,s)<="9"))or(subc(i,s)="."): nN:=1; else: nN:=0; fi
+ tempc:=substring(i-1,i) of s;
+ if ((tempc>="0")and(tempc<="9"))or(tempc="."): nN:=1; else: nN:=0; fi
endfor
nN
enddef;
@@ -1671,19 +1733,24 @@ enddef;
vardef scan_bit(expr n,b)= if b>=1: odd(floor(n/b)) else: odd(floor((frac n)/b)) fi enddef;
%-------------------------------------------------------------------------------------------------
vardef scan_char(expr c,s,d,n)=
- nN:=0;
- if d=0: for i=n upto length(s): if subc(i,s)=c: nN:=i; fi exitif nN>0; endfor
- ef d=1: for i=n upto length(s): if subc(i,s)<>c: nN:=i; fi exitif nN>0; endfor
- ef d=-1: for i=length(s) downto n: if subc(i,s)<>c: nN:=i; fi exitif nN>0; endfor
+ nN:=0; nA:=length(s);
+ if d=0: for i=n upto nA: if substring(i-1,i) of s=c: nN:=i; fi exitif nN>0; endfor
+ ef d=1: for i=n upto nA: if substring(i-1,i) of s<>c: nN:=i; fi exitif nN>0; endfor
+ ef d=-1: for i=nA downto n: if substring(i-1,i) of s<>c: nN:=i; fi exitif nN>0; endfor
fi
nN
enddef;
%-------------------------------------------------------------------------------------------------
-def scan_c(expr c,s)= scan_char(c,s,0,1) enddef;
+vardef scan_c(expr c,s)=
+ nN:=0; nA:=length(s);
+ for i=1 upto nA: if substring(i-1,i) of s=c: nN:=i; fi exitif nN>0; endfor
+ nN
+enddef;
%-------------------------------------------------------------------------------------------------
vardef split_str(expr s,c)(suffix v)=
- at_char[0]:=nN:=0; for i=1 upto length(s): if subc(i,s)=c: at_char[incr nN]:=i; fi endfor
- nN:=nN+1; at_char[nN]:=length(s)+1;
+ at_char[0]:=nN:=0; nA:=length(s);
+ for i=1 upto nA: if substring(i-1,i) of s=c: at_char[incr nN]:=i; fi endfor
+ at_char[incr nN]:=nA+1;
for i=1 upto nN: v[i]:=substring (at_char[i-1],at_char[i]-1) of s; endfor
nN
enddef;
diff --git a/graphics/mcf2graph/mcf_exa_soc.mp b/graphics/mcf2graph/mcf_exa_soc.mp
index e746f27a20..b3144d2028 100644
--- a/graphics/mcf2graph/mcf_exa_soc.mp
+++ b/graphics/mcf2graph/mcf_exa_soc.mp
@@ -1,14 +1,21 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% MCF metapost souce file example by Akira Yamaji 2024.02.12
+% MCF metapost souce file example by Akira Yamaji 2025.02.16
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-if unknown mcftograph: input mcf2graph; fi %%% it must be version 5.12
-message "* mcf_template 2024.02.12";
+%------------------------------------------------------------------------------
+%%%%ahlength:=3; %%% output figure(expanded)
+%%%%ahlength:=5; %%% output MOL(V2000) ** max 500files
+%%%%ahlength:=6; %%% output MOL(V3000) ** max 500files
+%%%%ahlength:=7; %%% output report
+%------------------------------------------------------------------------------
+input mcf2graph; %%% it must be version 5.19
+message "* mcf_template 2025.02.16";
message "";
%------------------------------------------------------------------------------
+%%%%sw_output:=Fig+Report;
fsize:=(30mm,20mm);
max_blength:=4mm;
-%%%%sw_output:=Fig+Info;
-%%%%sw_output:=Fig+Calc;
+%%%%sw_numbering:=Atom+Bond;
+%%%%sw_frame:=Atom;
%%%%ext(defaultscale:=.3; label.rt(EN,(0,0));)
%------------------------------------------------------------------------------
%%%%ext(defaultfont:=mpfont; defaultscale:=.3;
@@ -18,9 +25,8 @@ max_blength:=4mm;
%%%%loadm("CAT=biological","MW<50.0","a:EN");
%%%%loadm("CAT=biological","MW>=285","MW<=288","a:EN");
%%%%sw_comment:=1; loadm("CAT=biological","MW>=100","MW<=250","a:MW");
-%%%%savem("temp.mcf"); % save to temp.mcf
%%%%loadm("EN<>*"); % select all
-loadm("EXA=1"); % select EXA=1
+loadm("EXA=0"); % select EXA=0
%------------------------------------------------------------------------------
for i=1 upto ucount: beginfigm $(i) \\ endfigm endfor
%******************************************************************************
diff --git a/graphics/mcf2graph/mcf_example.pdf b/graphics/mcf2graph/mcf_example.pdf
index efd7084173..de575c88ce 100644
--- a/graphics/mcf2graph/mcf_example.pdf
+++ b/graphics/mcf2graph/mcf_example.pdf
Binary files differ
diff --git a/graphics/mcf2graph/mcf_example.tex b/graphics/mcf2graph/mcf_example.tex
index e4464a0e43..ed2b633bf3 100644
--- a/graphics/mcf2graph/mcf_example.tex
+++ b/graphics/mcf2graph/mcf_example.tex
@@ -1,7 +1,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Example of MCF Typeset with LuaLaTeX(luamplib) by A.Yamaji 2024.02.25
+% Example of MCF Typeset with LuaLaTeX(luamplib) by A.Yamaji 2025.02.16
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% ** mcf2graph.mf must be version 5.12
+% ** mcf2graph.mf must be version 5.19
% ** use mcf_library.mcf
% ** typeset by LuaLaTeX(luamplib)
%-------------------------------------------------------------------------
@@ -12,31 +12,23 @@
\mplibnumbersystem{double}
\mpliblegacybehavior{disabled}
%-------------------------------------------------------------------------
-\pagestyle{empty}
-\topmargin=-24mm
-\oddsidemargin=-12mm
-\textwidth=192mm
-\textheight=280mm
-\parindent=0mm
-\newcount\headeroff
-\headeroff=0
-\makeatletter
+%\pagestyle{headings}
+\topmargin=-27mm%
+\oddsidemargin=-12mm%
+\textwidth=190mm%
+\textheight=280mm%
+\parindent=0mm%
+\newcount\headeroff%
+\headeroff=0%
+\makeatletter%
%-------------------------------------------------------------------------
\begin{document}
-\ifnum\z@=\headeroff%
\begin{center}
- {\Huge\sf Molecular Coding Format examples} \vspace{5mm} \\
- Author : Akira Yamaji \quad Date : \today \\
- Located at : http://www.ctan.org/pkg/mcf2graph
+ {\Huge\sf Molecular Coding Format examples} \vspace{4mm} \\
+ Author : Akira Yamaji \quad Date : \today \quad
+ Located at : http://www.ctan.org/pkg/mcf2graph \\
\end{center}
-{\small *use 'mcf2grapf.mp' ver 5.12 \quad
- *typeset with LuaLaTeX \quad
- *use molecular library file 'main\_lib.mcf' \\
- ** FM(fm):molecular formula (calculated) \quad
- * MW(mw):molecular weight (calculated)} \vspace{3mm} \\
-\fi%
%-------------------------------------------------------------------------
-\noindent%
\newbox \fig@box%
\newcount \fig@num%
\newcount \col@num%
@@ -45,68 +37,103 @@
\fig@num=0%
\col@num=0%
\unitlength=0.01mm%
-\noindent%
%-------------------------------------------------------------------------
\newif\ifCONT@%
\CONT@true%
%-------------------------------------------------------------------------
\begin{mplibcode}
input mcf2graph;
- sw_output:=Fig+Calc;
- fsize:=(35mm,24mm);
- max_blength:=4mm;
+ def make_frame=
+ draw (0,0)--(185mm,0)--(185mm,h)--(0,h)--cycle wpcs thickness_frame;
+ draw (w,h-header_h)--(185mm,h-header_h) wpcs thickness_frame;
+ draw (w,h)--(w,0) wpcs thickness_frame;
+ for col_w=85mm,110mm,130mm,150mm:
+ draw (col_w,h)--(col_w,h-header_h) wpcs thickness_frame;
+ endfor
+ enddef;
+%-------------------------------------------------------------------------
+ loadm("EN=Benzene");
+ fig_num:=0;
+ beginfigm
+ fsize:=(50mm,8mm);
+ fmargin:=(6mm,2mm);
+ mposition:=(1,0.5);
+ max_blength:=3.5mm;
+ row_h:=3.8mm;
+ header_h:=3.8mm;
+ getm(fig_num);
+ if checkm(mc)=0:
+ drawm(scantokens(mc))
+ ext(
+ defaultfont:="uhvr8r"; defaultscale:=0.5;
+ label.lrt("[No]",(0,h));
+ defaultscale:=0.6;
+ label.lrt("Name",(w,h));
+ label.rt("Molecular structure",(0mm,0.5h));
+ label.lrt("Category",(85mm,h));
+ label.lrt("Molecular Weight",(110mm,h));
+ label.lrt("MW calculated",(130mm,h));
+ label.lrt("Composition Formula calculated",(150mm,h));
+ label.lrt("Molecular Coding Format",(50mm,h-11.5));
+ make_frame;
+ )
+ fi
+ endfigm
+%------------------------------------------------------------------------------
loadm("EXA=1");
+ fig_num:=0;
+ fsize:=(50mm,15.2mm);
+ fmargin:=(8mm,0.5mm);
+ max_blength:=3.3mm;
+ row_h:=3.8mm;
+ header_h:=3.8mm;
\end{mplibcode}
-%-------------------------------------------------------------------------
+%------------------------------------------------------------------------------
+\CONT@true%
+\fig@num=0%
+\noindent%
\loop%
\advance\fig@num\@ne\relax%
-\advance\col@num\@ne\relax%
-\ifnum\fig@num=276 \CONT@false%
+\ifnum\fig@num=539 \CONT@false%
\else%
-\sbox{\fig@box}{%
-\begin{mplibcode}
+\begin{mplibcode}%
beginfigm
getm(fig_num);
if checkm(mc)=0:
drawm(scantokens(mc))
+ ext(
+ defaultfont:="uhvr8r"; defaultscale:=0.8;
+ label.lrt("["&decimal(fig_num)&"]",(0,2h)) scaled 0.5;
+ if length(EN)>20: defaultscale:=20/length(EN)*0.8; label.lrt(EN,(w,h)); defaultscale:=0.8;
+ else: label.lrt(EN,(w,h));
+ fi
+ label.lrt(CAT,(85mm,h));
+ label.lrt(MW,(110mm,h));
+ label.lrt(mw,(130mm,h));
+ label.lrt(fm,(150mm,h));
+ make_frame;
+ defaultfont:="cmtt9"; defaultscale:=1; row_h:=10;
+ for i=1 upto mc_row: label.lrt(mc[i],(w+mc_indent[i]*4.25,h-(i-1)*row_h-11.5)); endfor
+ )
VerbatimTeX("\gdef\EN{"&EN&"}");
- VerbatimTeX("\gdef\MW{"&MW&"}");
- VerbatimTeX("\gdef\mw{"&mw&"}");
- VerbatimTeX("\gdef\fm{"&fm&"}");
- fi
+ fi
endfigm
-\end{mplibcode}
-}%
-%------------------------------------------------------------------------
- \message{[\the\fig@num:\EN]}%
- \begin{picture}(3750,3350)%
- \put(20,3000){\footnotesize\bf \EN}%
- \put(20,2750){\labelM MW:\MW { / }fm:\fm}%
- \put(20,2530){\labelM mw:\mw { / }[\the\fig@num]}%
- \put(0,0){\makebox(3750,2530){\usebox{\fig@box}}}%
- \end{picture}%
- \ifnum\col@num=5 \\ \col@num=\z@ \fi%
+\end{mplibcode}\vspace{-1.2pt}\\
+%------------------------------------------------------------------------------
\fi%
-%------------------------------------------------------------------------
-\ifCONT@\repeat%
-\newpage
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\message{[\the\fig@num:\EN]}%
+\ifCONT@ \repeat%
+%------------------------------------------------------------------------------
+\newpage%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{mplibcode}
loadm("EXA=2");
fig_num:=0;
fsize:=(50mm,34mm);
- fmargin:=(1mm,1mm);
+ fmargin:=(2mm,2mm);
max_blength:=4mm;
row_h:=3.8mm;
header_h:=3.8mm;
- def make_frame=
- draw (0,0)--(185mm,0)--(185mm,h)--(0,h)--cycle wpcs thickness_frame;
- draw (w,h-header_h)--(185mm,h-header_h) wpcs thickness_frame;
- draw (w,h)--(w,0) wpcs thickness_frame;
- for col_w=75mm,105mm,130mm,155mm:
- draw (col_w,h)--(col_w,h-header_h) wpcs thickness_frame;
- endfor
- enddef;
\end{mplibcode}
%------------------------------------------------------------------------------
\noindent%
@@ -114,7 +141,7 @@
\fig@num=0%
\loop%
\advance\fig@num\@ne\relax%
-\ifnum\fig@num=9 \CONT@false%
+\ifnum\fig@num=25 \CONT@false%
\else%
\begin{mplibcode}%
beginfigm
@@ -122,31 +149,27 @@
if checkm(mc)=0:
drawm(scantokens(mc))
ext(
- defaultfont:="cmtt9";
- label.lrt("["&decimal(fig_num)&"]",(0,h));
- label.llft(EXA,(w,h));
- if length(EN)>23:
- nA:=defaultscale;
- defaultscale:=23/length(EN); label.lrt(EN, (w,h));
- defaultscale:=nA;
- else:
- label.lrt(EN, (w,h));
+ defaultfont:="uhvr8r"; defaultscale:=0.8;
+ label.lrt("["&decimal(fig_num)&"]",(0,2h)) scaled 0.5;
+ if length(EN)>20: defaultscale:=20/length(EN); label.lrt(EN,(w,h)); defaultscale:=1;
+ else: label.lrt(EN,(w,h));
fi
- label.lrt(CAT,(75mm,h));
- label.lrt(MW,(105mm,h));
+ label.lrt(CAT,(85mm,h));
+ label.lrt(MW,(110mm,h));
label.lrt(mw,(130mm,h));
- label.lrt(fm,(155mm,h));
+ label.lrt(fm,(150mm,h));
make_frame;
- if mc_row>12: defaultscale:=0.6; row_h:=5.25;
- ef mc_row>8: defaultscale:=0.8; row_h:=6.5;
- else: row_h:=10;
+ defaultfont:="cmtt9"; defaultscale:=1;
+ if mc_row>12: defaultscale:=0.6; row_h:=5.8;
+ ef mc_row>7: defaultscale:=0.8; row_h:=6.5;
+ ef mc_row>6: row_h:=10;
+ ef mc_row>5: row_h:=11;
+ else: row_h:=12;
fi
- for i=1 upto mc_row:
- label.lrt(mc[i],(w+mc_indent[i]*4.25,h-(i-1)*row_h-11.5));
- endfor
+ for i=1 upto mc_row: label.lrt(mc[i],(w+mc_indent[i]*4.25,h-(i-1)*row_h-12)); endfor
)
VerbatimTeX("\gdef\EN{"&EN&"}");
- fi
+ fi
endfigm
\end{mplibcode}\vspace{-1.2pt}\\
%------------------------------------------------------------------------
diff --git a/graphics/mcf2graph/mcf_manual.pdf b/graphics/mcf2graph/mcf_manual.pdf
index 4609060af5..669f144542 100644
--- a/graphics/mcf2graph/mcf_manual.pdf
+++ b/graphics/mcf2graph/mcf_manual.pdf
Binary files differ
diff --git a/graphics/mcf2graph/mcf_manual.tex b/graphics/mcf2graph/mcf_manual.tex
index aeae9c96d7..71bc7a55f5 100644
--- a/graphics/mcf2graph/mcf_manual.tex
+++ b/graphics/mcf2graph/mcf_manual.tex
@@ -1,7 +1,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Molecular Coding Format manual by Akira Yamaji 2024.02.25
+% Molecular Coding Format manual by Akira Yamaji 2025.02.16
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% ** mcf2graph.mf must be version 5.12
+% ** mcf2graph.mf must be version 5.19
% ** use main_lib.mcf
% ** typeset by LuaLaTeX(luamplib)
%----------------------------------------------------------------------------
@@ -37,7 +37,7 @@
\author{Akira Yamaji}
\date{\today}
\maketitle
-\begin{center} mcf2graph version 5.12 \end{center}
+\begin{center} mcf2graph version 5.19 \end{center}
\begin{center} Located at http://www.ctan.org/pkg/mcf2graph \end{center}
\begin{center} Suggestion or request mail to: mcf2graph@gmail.com \end{center}
%-----------------------------------------------------------------------------
@@ -45,7 +45,6 @@
\vspace{5mm}%
\quad
\begin{mplibcode}
-sw_output:=Fig+Calc;
max_blength:=10mm;
ratio_thickness_bond:=0.015;
ratio_atom_bond:=0.36;
@@ -56,75 +55,75 @@ sw_frame:=0;
% Glycine
beginfigm \(<30,NH2,!2,COOH) endfigm
% L-Alanine
-beginfigm \(<30,NH2,!~wb,/_,!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,?,!,COOH) endfigm
% L-Valine
beginfigm \(<30,NH2,!~wb,/?!,!,COOH) endfigm
% L-Leucine
-beginfigm \(<30,NH2,!~wb,/'(!,?!),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/!'?!,!,COOH) endfigm
\end{mplibcode}
\\
\begin{mplibcode}
% L-Isoleucine
-beginfigm \(<30,NH2,!~wb,/'(/*_,!2),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/?z'!2,!,COOH) endfigm
% L-Serine
beginfigm \(<30,NH2,!~wb,/!OH,!,COOH) endfigm
% L-Threonine
-beginfigm \(<30,NH2,!~wb,/'(/_,!~wf,OH),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/?'!w'OH,!,COOH) endfigm
% L-Cysteine
beginfigm \(<30,NH2,!~wb,/!SH,!,COOH) endfigm
\end{mplibcode}
\\
\begin{mplibcode}
% L-Methionine
-beginfigm \(<30,NH2,!~wb,/'(!2,S,!),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/!2'S!,!,COOH) endfigm
% L-Phenylalanine
beginfigm \(<30,NH2,!~wb,/!Ph,!,COOH) endfigm
% L-Tyrosine
-beginfigm \(<30,NH2,!~wb,/'(!Ph,-3:/OH),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/!Ph'(-3:/OH),!,COOH) endfigm
% L-Triptophan
-beginfigm \(<30,NH2,!~wb,!,COOH,@2,\,!,<24,|,?5,-4=Ph,2=dr,5=dl,4:NH) endfigm
+beginfigm \(<30,NH2,!~wb,!,COOH,@2,!2,<24,|,?5,-4=Ph,2=dr,5=dl,4:NH) endfigm
\end{mplibcode}
\\
\begin{mplibcode}
% L-Prorine
beginfigm \(<18,?5,3:NH,4:*/COOH) endfigm
% L-Glutamine
-beginfigm \(<30,NH2,!~wb,!,COOH,@2,\`1,!`1,!,//O,!,NH2) endfigm
+beginfigm \(<30,NH2,!~wb,!,COOH,@2,!2,!,?O,!,NH2) endfigm
% L-Asparagine
-beginfigm \(<30,NH2,!~wb,/'(!,//O,!,NH2),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/!'?O'!NH2,!,COOH) endfigm
% L-Aspartic acid
beginfigm \(<30,NH2,!~wb,/!COOH,!,COOH) endfigm
\end{mplibcode}
\\
\begin{mplibcode}
% L-Glutamic acid
-beginfigm \(<30,NH2,!~wb,/'(!2,COOH),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/!2'COOH,!,COOH) endfigm
% L-Lysine
-beginfigm \(<30,NH2,!~wb,/'(!4,NH2),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/!4'NH2,!,COOH) endfigm
% L-Arginine
-beginfigm \(<30,NH2,!~wb,!,COOH,@2,\`1,!`1,!2,NH,!,//NH,!,NH2) endfigm
+beginfigm \(<30,NH2,!~wb,!,COOH,@2,!2`1,!2,NH,!,//NH,!,NH2) endfigm
% L-Hystidine
-beginfigm \(<30,NH2,!~wb,!,COOH,@2,\,!,|,?5,{1,3}=dl,3:N,5:NH) endfigm
+beginfigm \(<30,NH2,!~wb,!,COOH,@2,!2,|,?5,1'3=dl,3:N,5:NH) endfigm
\end{mplibcode}
\\
\begin{mplibcode}
% L-DOPA
-beginfigm \(<30,NH2,!~wb,!,COOH,@2,\,!,Ph,{-3,-4}:/OH) endfigm
+beginfigm \(<30,NH2,!~wb,!,COOH,@2,!2,Ph,-3'-4:/OH) endfigm
% Ornithine
-beginfigm \(<30,NH2,!~wb,/'(!3,NH2),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/!3'NH2,!,COOH) endfigm
% Citrulline
-beginfigm \(<30,NH2,!~wb,/'(!3,NH,!,//O,!,NH2),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/!3'NH!'?O'!NH2,!,COOH) endfigm
% GABA
beginfigm \(<30,NH2,!4,COOH) endfigm
\end{mplibcode}
\\
\begin{mplibcode}
% amino Levulinic acid
-beginfigm \(<30,NH2,!2,//O,!3,COOH) endfigm
+beginfigm \(<30,NH2,!2,?O,!3,COOH) endfigm
% 4-amino benzoic acid
beginfigm \(<30,Ph,1:/NH2,4:/COOH) endfigm
% L-Carboxyl glutamic acid
-beginfigm \(<30,NH2,!~wb,/'(!,/COOH,!,COOH),!,COOH) endfigm
+beginfigm \(<30,NH2,!~wb,/!'?COOH'!COOH,!,COOH) endfigm
% L-Hydroxy Prorine
beginfigm \(<18,?5,1:/OH,3:NH,4:*/COOH) endfigm
\end{mplibcode}
@@ -160,13 +159,12 @@ $n (0<=n<360): absolute angle
sw_frame:=Outside;
blength:=0;
beginfigm
- #(60mm,17mm);
+ #(60mm,18mm);
sw_numbering:=Bond;
- numbering_end:=6;
ratio_chain_ring:=1;
%----------------------------------------------------------------------
\(<15,-30,45,-45,60,$300,$0,
- {1^$15,2^$345,3^$30,4^$345}:/_~dt,{5,6}=vf
+ {1^$15'2^$345'3^$30'4^$345}:?~dt,5'6=vf
)
++(
defaultscale:=0.5;
@@ -183,7 +181,7 @@ endfigm
\index{"!}%
\begin{verbatim}
! : take value 60 or -60 depend on
- current angle and environment
+ current angle
!6 : !,!,!,!,!,!
<-30,!6
@@ -191,13 +189,12 @@ endfigm
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,17mm);
+ #(60mm,20mm);
sw_numbering:=Bond;
- numbering_end:=6;
ratio_chain_ring:=1;
%----------------------------------------------------------------------
\(<-30,!6,
- {1^-120,2^60,3^-60,4^60,5^-60,6^60}:/_~dt
+ {1^-120'2^60'3^-60'4^60'5^-60'6^60}:?~dt
)
++(
defaultscale:=0.5;
@@ -212,13 +209,11 @@ beginfigm
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Jump to atom}
-\index{"@}%
\begin{verbatim}
-@n : Jump to An
-** An: atom number(-999<=n<=4095)
+take value 0 just after jump to atom
+@n,! : !=0
-<-30,!6,@3,0,!,@5,-30
+<-30,!5,@3,!
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
@@ -227,74 +222,78 @@ beginfigm
sw_trimming:=1;
sw_numbering:=Atom;
ratio_chain_ring:=1;
- \(<-30,!6,@3,0,!,@5,-30)
+ \(<-30,!6,@3,!)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Branch bond}
-\index{\textbackslash}%
+\subsubsection{Jump to atom}
+\index{"@}%
\begin{verbatim}
-\ : 0
+@n : Jump to An
+** An: atom number(-999<=n<=4095)
-<-30,!6,@3,\,!
+<-30,!6,@3,0,@5,-30
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(60mm,16mm) #@(2mm,2mm)
- sw_numbering:=Atom;
sw_trimming:=1;
+ sw_numbering:=Atom;
ratio_chain_ring:=1;
- \(<-30,!6,@3,\,!)
+ \(<-30,!6,@3,0,@5,-30)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Branch modified bond}
-\index{*\textbackslash}%
-\index{\textbackslash*}%
-\index{\textbackslash\textbackslash}%
-\index{*\textbackslash*}%
+\subsubsection{Branch bond}
+\index{\textasciicircum}% ^
+\index{\textasciitilde}% ~
+\index{`}%
+\index{"!w}%
+\index{"!z}%
+\index{"!d}%
\begin{verbatim}
-\ : 0
-*\ : 0~wf
-\* : 0~zf
-\\ : 0~dm
-*\* : 0~wv
+@n,! : @n,!
+@n,!w : @n,!~wf
+@n,!z : @n,!~zf
+@n,!d : @n,!~db
+@n,!dr : @n,!~dr
-<30,!8,
-@2,\,!,@4,*\,!,@6,\*,!,@8,\\,!,@10,*\*,!
+<30,!10,
+@2,!,!,@4,!w,!,@6,!z,!,@8,!d,!,@10,!dr,!
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,16mm) #@(2mm,2mm)
+ #(80mm,20mm) #@(2mm,2mm)
sw_numbering:=Atom;
- sw_trimming:=1;
- numbering_end:=10;
ratio_chain_ring:=1;
- \(<30,!10,@2,\,!,@4,*\,!,@6,\*,!,@8,\\,!,@10,*\*,!)
+ \(<30,!10,@2,!,!,@4,!w,!,@6,!z,!,@8,!d,!,@10,!dr,!)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\index{\textasciicircum}% ^
-\index{\textasciitilde}% ~
-\index{`}%
+\subsubsection{Rotate current angle}
+\index{\textgreater}%
\begin{verbatim}
-<30,!6,
-\~dr,!, : 0~dr,!
-\`1.5,-90 : 0`1.5,-90
-\^15,-60 : 0^15,-60
+<angle : rotate current angle
+
+0,0,<90,0,<-90,0,<$315,0,<$90,0,<$0,0
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,20mm) #@(2mm,2mm)
+ #(62mm,22mm) #@(2mm,3mm)
sw_trimming:=1;
- sw_numbering:=Atom;
- numbering_end:=7;
+ sw_numbering:=Bond;
ratio_chain_ring:=1;
- %-------------------------
- \(<30,!6,@2,\~dr,!,@4,\`1.5,-90,@6,15,-60)
+ defaultscale:=0.5;
+ labeloffset:=2bp;
+ \(#1,0,0,<90,0,<-90,0,<$315,0,<$90,0,<$0,0,{1:7}=vf,
+ {3,4^180}:?~dt)
+ ++(
+ drawarrow B8/*.7{B8left}..{B3left}B3/*.7; label.urt("90",B8/*.7);
+ drawarrow B9/*.7{B9right}..{B4right}B4/*.7; label.urt("-90",B9/*.7);
+ )
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -303,7 +302,7 @@ endfigm
\begin{verbatim}
&n : Connect to An
-<-30,!6,@3,\,!3,&6~bd,@9,&4~bz
+<-30,!6,@3,!,!3,&6~bd,@9,&4~bz
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
@@ -313,15 +312,14 @@ beginfigm
sw_numbering:=Atom;
ratio_chain_ring:=1;
%----------------------------------
- \(<-30,!6,@3,\,!3,&6~bd,@9,&4~bz)
+ \(<-30,!6,@3,!,!3,&6~bd,@9,&4~bz)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\subsubsection{Ring}
-\index{?}%
+\index{?n}%
\begin{verbatim}
?n : n membered ring(3<=n<=20)
-?6 : <-120,60,60,60,60,60,&1
?6
\end{verbatim}
%-----------------------------------------
@@ -335,29 +333,19 @@ beginfigm
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Rotate current angle}
-\index{\textgreater}%
+\subsubsection{Ring length}
\begin{verbatim}
-<angle : rotate current angle
+?n`length : change ring length
-0,0,<90,0,<-90,0,<$315,0,<$90,0,<$0,0
+?6,@4,!,?6`1.2
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,20mm) #@(2mm,3mm)
+ #(60mm,20mm) #@(2mm,2mm)
sw_trimming:=1;
sw_numbering:=Bond;
- ratio_chain_ring:=1;
- numbering_end:=7;
- defaultscale:=0.5;
- labeloffset:=2bp;
- \(#1,0,0,<90,0,<-90,0,<$315,0,<$90,0,<$0,0,{1:7}=vf,
- {3,4^180}:/_~dt)
- ++(
- drawarrow B8/*.7{B8left}..{B3left}B3/*.7; label.urt("90",B8/*.7);
- drawarrow B9/*.7{B9right}..{B4right}B4/*.7; label.urt("-90",B9/*.7);
- )
+ \(?6,@4,!,?6`1.2)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -425,8 +413,7 @@ wf: wedge forward
wb: wedge backward
zf: hashed(zebra stripe) wedge foward
zb: hashed(zebra stripe) wedge backward
-vf:vector forward
-vb:vector backward
+vf:vector forward / vb:vector backward
<-30,
!~wf,!,!~wb,!,!~zf,!,!~zb,!,!~vf,!~vb
@@ -503,8 +490,8 @@ dr_ : duble right over line
dm_ : duble over line
<30,!8,!,60,90`18,
-{2~si_,4~wf_,6~wb_,8~zf_,10~zb_,
- 12~bd_,14~dl_,16~dr_,18~dm_}:/_`2
+{2~si_'4~wf_'6~wb_'8~zf_'10~zb_'
+ 12~bd_'14~dl_'16~dr_'18~dm_}:?`2
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
@@ -513,8 +500,8 @@ beginfigm
#(75mm,20mm);
ratio_chain_ring:=1;
\(<30,!18,$90`1.5,90`15.5,
- {2~si_,4~wf_,6~wb_,8~zf_,10~zb_,
- 12~bd_,14~dl_,16~dr_,18~dm_}:/_`2)
+ {2~si_'4~wf_'6~wb_'8~zf_'10~zb_'
+ 12~bd_'14~dl_'16~dr_'18~dm_}:?`2)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -529,14 +516,14 @@ wb_r : wedge backward (half width)
#1.25,-30~wf_r,30~bd_r`1,30~wb_r,
120,O,30,&1,##,#.5,6^$90:/!OH,
- {1^$-90,2^$90,3^$-90,4^$90}:/OH,
+ {1^$270'2^$90'3^$270'4^$90}:/OH,
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(75mm,16mm);
@(0.05,0.5)\(#1.25,-30~wf_r,30~bd_r`1,30~wb_r,120,O,30,&1,##,
- #.5,{1^$-90,2^$90,3^$-90,4^$90}:/OH,6^$90:/!OH)
+ #.5,{1^$270'2^$90'3^$270'4^$90}:/OH,6^$90:/!OH)
defaultscale:=0.6;
@(0.5,0.7)\(0~wf_r) ++(label.lft("wf_r:",A1);)
@(0.5,0.2)\(0~wf) ++(label.lft("wf:",A1);)
@@ -550,21 +537,21 @@ endfigm
\subsubsection{Change multiple bond type}
\index{vf}%
\begin{verbatim}
-{2,4,6,8'}=dl : 2=dl,4=dl,6=dl,8=dr
+{2,4,6}=dl or 2'4'6=dl : 2=dl,4=dl,6=dl
-<30,!7,{2,4,6,8'}=dl
+<30,!7,{2,4,6}=dl or <30,!7,2'4'6=dl
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(60mm,8mm) #@(2mm,3mm)
ratio_chain_ring:=1;
- \(<30,!9,{2,4,6,8'}=dl)
+ \(<30,!7,2'4'6=dl)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\subsection{Change bond length}
-\subsubsection{Chain length}
+\subsubsection{Chanege chain length}
\index{`}%
\begin{verbatim}
(!,!n)`length : change length of !,!n
@@ -580,6 +567,7 @@ beginfigm
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
+\subsubsection{Change multiple bond length}
\index{\#}%
\index{\#\#}%
\begin{verbatim}
@@ -597,22 +585,6 @@ beginfigm
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Ring length}
-\begin{verbatim}
-?n`length : change ring length
-
-?6,@4,\,?6`1.2
-\end{verbatim}
-%-----------------------------------------
-\begin{mplibcode}
-beginfigm
- #(60mm,16mm) #@(2mm,2mm)
- sw_trimming:=1;
- sw_numbering:=Bond;
- \(?6,@4,\,?6`1.2)
-endfigm
-\end{mplibcode}
-%-----------------------------------------------------------------------------
\subsection{Change atom}
\subsubsection{Insert atom}
\begin{verbatim}
@@ -629,21 +601,21 @@ beginfigm
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Addressed atom}
+\subsubsection{Change atom}
\index{:}%
\begin{verbatim}
2:O : change A2 C to O
-{3,4}:N : change A3,A4 C to N
+{3,4}:N or 3'4:N : change A3,A4 C to N
-<30,!4,2:O,{3,4}:N
+<30,!4,2:O,{3,4}:N or <30,!4,2:O,3'4:N
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(70mm,10mm) ##(0.48,1)
- @(0,0.5)\(<30,!5,2:O,{3,4}:N)
+ @(0,0.5)\(<30,!5,2:O,3'4:N)
sw_numbering:=Atom;
- @(1,0.5)\(<30,!5,2:O,{3,4}:N)
+ @(1,0.5)\(<30,!5,2:O,3'4:N)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -652,16 +624,16 @@ endfigm
\begin{verbatim}
| : divide brock
-?6,@4,\,|,?6,2:O
+?6,@4,!,|,?6,2:O
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(70mm,14mm) #@(3mm,1.5mm)
- @(0,.5)\(?6,@4,\,|,?6,2:O)
+ @(0,.5)\(?6,@4,!,|,?6,2:O)
sw_numbering:=Atom;
##(1,.88)
- @(1,.5)\(?6,@4,\,|,?6,2:O)
+ @(1,.5)\(?6,@4,!,|,?6,2:O)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -670,57 +642,60 @@ endfigm
\begin{verbatim}
|| : reset brock adress
-?6,@4,\,|,?6,||,2:N
+?6,@4,!,|,?6,||,2:N
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(70mm,14mm) #@(3mm,1.5mm)
- @(0,.5)\(?6,@4,\,|,?6,||,2:N)
+ @(0,.5)\(?6,@4,!,|,?6,||,2:N)
sw_numbering:=Atom;
##(1,.88)
- @(1,.5)\(?6,@4,\,|,?6,||,2:N)
+ @(1,.5)\(?6,@4,!,|,?6,||,2:N)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\subsubsection{Absolute address}
\index{\$}% $
\begin{verbatim}
-$2:N : change A$2 C to N **1<=n<=3095
+$2:n : change A$2 C to N
+**1<=n<=3095
-?6,@4,\,|,?6,$2:N
+?6,@4,!,|,?6,$2:N
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(70mm,14mm) #@(3mm,1.5mm)
- @(0,.5)\(?6,@4,\,?6,$2:N)
+ @(0,.5)\(?6,@4,!,?6,$2:N)
sw_numbering:=Atom;
##(1,.88)
- @(1,.5)\(?6,@4,\,?6,$2:N)
+ @(1,.5)\(?6,@4,!,?6,$2:N)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\subsubsection{Relative address}
\begin{verbatim}
--2:N : change A(-2) C to N **-999<=n<=-1
+-2:n : change A(-2) C to N
+**-999<=n<=-1
-?6,@4,\,?6,-2:N
+?6,@4,!,?6,-2:N
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(70mm,14mm) #@(3mm,1.5mm)
- @(0,.5)\(?6,@4,\,?6,-2:N)
+ @(0,.5)\(?6,@4,!,?6,-2:N)
sw_numbering:=Atom;
##(1,.88)
- @(1,.5)\(?6,@4,\,?6,-2:N)
+ @(1,.5)\(?6,@4,!,?6,-2:N)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\subsubsection{Charged atom}
\begin{verbatim}
-p_ : positive / n_ : negative
+p_ : positive
+n_ : negative
<-30,!2,N,??,p_,!2,S,n_^180,
!6,7:N,7:??,9:S,7:n_,9:n_^180
@@ -760,7 +735,7 @@ endfigm
** fused ring size depend on
attached bond length
-?6,@4,\,?6`1.2,5=?6,11=?6
+?6,@4,!,?6`1.2,5=?6,11=?6
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
@@ -768,17 +743,17 @@ beginfigm
#(60mm,25mm) #@(2mm,2mm)
sw_trimming:=1;
sw_numbering:=Bond;
- \(?6,@4,\,?6`1.2,5=?6,11=?6,
- {14:23}=bd_r,{5,11}=dt)
+ \(?6,@4,!,?6`1.2,5=?6,11=?6,
+ {14:23}=bd_r,5'11=dt)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\begin{verbatim}
-?6,3=?6[13] : fuse ?6[13] at B3
-?6[13]: 6 membered ring scaled 13/10
-** ?m[n] (5<=m<=8,11<=n<=15)
+?6,3=#1.3'?6 : fuse #1.3'?6 at B3
+#1.3'?6 : 6 membered ring scaled 1.3
+** #n'?m (5<=m<=6,1.1<=n<=1.5)
-?6,3=?6[13]
+?6,3=#1.3'?6
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
@@ -787,13 +762,13 @@ beginfigm
margin_top_bottom:=1.5mm;
sw_numbering:=Bond;
sw_trimming:=1;
- \(<30,?6,3=?6[13],3=dt,{7:11}=bd_r)
+ \(<30,?6,3=#1.3'?6,3=dt,{7:11}=bd_r)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\begin{verbatim}
-?6,{-3,-4,-4,-2,-2,-4,-4}=?6
-?6,{4,8,13,20,25,28,33}=?6
+?6,-3'-4'-4'-2'-2'-4'-4=?6
+?6,4'8'13'20'25'28'33=?6
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
@@ -801,7 +776,7 @@ beginfigm
#(70mm,20mm) #@(2mm,2mm)
sw_numbering:=Bond;
sw_trimming:=1;
- \(<30,?6,{-3,-4,-4,-2,-2,-4,-4}=?6,{4,8,13,20,25,28,33}=dt)
+ \(<30,?6,-3'-4'-4'-2'-2'-4'-4=?6,4'8'13'20'25'28'33=dt)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -823,13 +798,13 @@ beginfigm
#(75mm,20mm) #@(2mm,2mm)
sw_numbering:=Bond;
##(1,.9)
- @( 0,.5)\(<30,?6,{3,11--4}=?6,{11,4}=dt,{12:15}=bd_r)
+ @( 0,.5)\(<30,?6,{3'11--4}=?6,11'4=dt,{12:15}=bd_r)
++(defaultscale:=0.4; label("(1)",p0);)
##(1,.9)
- @(.5,.5)\(<30,?6,3=?6,{11--4}=?5,{11,4}=dt,{12:14}=bd_r)
+ @(.5,.5)\(<30,?6,3=?6,{11--4}=?5,11'4=dt,{12:14}=bd_r)
++(defaultscale:=0.4; label("(2)",p0);)
##(1,.9)
- @( 1,.5)\(<30,?6,3=?6,{11--4}=?4,{11,4}=dt,{12,13}=bd_r)
+ @( 1,.5)\(<30,?6,3=?6,{11--4}=?4,11'4=dt,12'13=bd_r)
++(defaultscale:=0.4; label("(3)",p0);)
endfigm
\end{mplibcode}
@@ -842,8 +817,8 @@ endfigm
16---4=?6 : fuse 3/6 ring to B16..B4
16---4=?5 : fuse 2/5 ring to B16..B4
-1:?6,{3,10,16---4}=?6
-2:?6,{3,10}=?6,16---4=?5
+1:?6,3'10'(16---4)=?6
+2:?6,3'10=?6,16---4=?5
\end{verbatim}
%-----------------------------------------
@@ -851,9 +826,9 @@ endfigm
beginfigm
#(60mm,20mm) #@(2mm,2mm)
sw_numbering:=Bond;
- @(0,1)\(?6,{3,10}=?6,16---4=?6,{16,4}=dt,{17:19}=bd_r)
+ @(0,1)\(?6,3'10=?6,16---4=?6,16'4=dt,{17:19}=bd_r)
++(defaultscale:=0.4; label("(1)",p0);)
- @(1,0)\(?6,{3,10}=?6,16---4=?5,{16,4}=dt,{17,18}=bd_r)
+ @(1,0)\(?6,3'10=?6,16---4=?5,16'4=dt,17'18=bd_r)
++(defaultscale:=0.4; label("(2)",p0);)
endfigm
\end{mplibcode}
@@ -865,7 +840,7 @@ endfigm
21----4=?6 : fuse 2/6 ring to B21..B4
-<-30,?6,{3,10,15,21----4}=?6
+<-30,?6,3'10'15'(21----4)=?6
\end{verbatim}
%-----------------------------------------
@@ -873,7 +848,7 @@ endfigm
beginfigm
#(60mm,20mm) #@(2mm,2mm)
sw_numbering:=Bond;
- \(<-30,?6,{3,10,15}=?6,21----4=?6,{21,4}=dt,{22,23}=bd_r)
+ \(<-30,?6,3'10'15'(21----4)=?6,21'4=dt,22'23=bd_r)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -888,7 +863,6 @@ endfigm
beginfigm
#(40mm,15mm);
sw_numbering:=Atom;
- numbering_end:=7;
ratio_chain_ring:=1;
\(<30,!6,@4,?5)
endfigm
@@ -896,49 +870,71 @@ endfigm
%-----------------------------------------------------------------------------
\subsection{Group}
\subsubsection{Insert group}
+\index{?}%
+\index{methyl}%
+\index{??}%
+\index{dimethyl}%
+\index{?O}%
+\index{carbonyl}%
+\index{?S}%
+\index{thioketone}%
+\index{?NH}%
+\index{imino}%
+\index{ethyl}%
+\index{propyl}%
+\index{isopropyl}%
+\index{tert-butyl}%
\index{/}%
\index{Ph}%
+\index{phenyl}%
\begin{verbatim}
-/ : group start single bond
-
-/_ : methyl
+? : methyl
+?? : dimethyl
+?O : carbonyl
+?S : thioketone
+?NH : imino
/! : ethyl
/!2 : propyl
/?! : isopropyl
/??! : tert-butyl
/Ph : phenyl
-<30,!,/_,!2,/!,!2,/!2,!4,/?!,
- !4,/??!,!2,/Ph^-60,!
+<30,!,?,!2,??,!2,?O,!2,?S,!2,
+ ?NH,!2,/!,!2,/!2,!2`1,/?!,!2`1,
+ /??!,!2`1,/#.6'Ph,!
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(75mm,18mm);
- \(<30,!,/_,!2,/!,!2,/!,!4,/?!,!4,/??!,!2,/'(Ph`0.8)^-60,!)
+ #(70mm,20mm);
+ \(<30,!,?,!2,??,!2,?O,!2,?S,!2,?NH,!2,/!,!2,/!2,!2`1,
+ /?!,!2`1,/??!,!2`1,/#.6'Ph,!)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\subsubsection{Insert modified group}
\index{//}%
+\index{double}%
\index{*/}%
+\index{wedge forward}%
\index{/*}%
+\index{hashed wedge}%
\index{*/*}%
-\index{**}%
+\index{wave}%
+\index{direct}%
\begin{verbatim}
// : double (double middle)
*/ : wedge forward
/* : hashed wedge forward
*/* : wave
-** : direct
-<30,!,//O,!2,*/H,!2,/*H,!2,*/*H,!2,**?3,!
+<30,!,//!,!2,*/H,!2,/*H,!2,*/*H,!
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(70mm,14mm);
- \(<30,!`1,//O,!2`1,*/H,!2`1,/*H,!2`1,*/*H,!2`1,**?3,!`1)
+ \(<30,!`1,//!,!2`1,*/H,!2`1,/*H,!2`1,*/*H,!`1)
++(defaultscale:=0.75;
label("//",A2-(0,0.45l));
label("*/",A4-(0,0.45l));
@@ -953,38 +949,48 @@ endfigm
\index{\textasciitilde}% ~
\index{`}%
\index{\textless}%
+\index{change type}%
+\index{change angle}%
+\index{change length}%
+\index{change environment}%
\begin{verbatim}
~ : change type
^ : change angle
` : change length
> : change environment
-<-30,``1,!,
- /_`2^30,!2,/!2>lr,!2,/!2>rl,!)
+<-30,#1,!,
+ ?`2^30,!2,/!2>lr,!2,/!2>rl,!)
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(60mm,16mm);
sw_trimming:=1;
- \(<-30,#1,!2,/_`2^30,!2,/!2>lr,!2,/!2>rl,!)
+ \(<-30,#1,!2,?`2^30,!2,/!2>lr,!2,/!2>rl,!)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\subsubsection{Add group}
+\index{?w}%
+\index{?z}%
+\index{?d}%
\begin{verbatim}
-<30,!17,2:/_,3:/!,4:/!2,7:/iPr,
- 8:/tBu,10:/'(Ph`0.6)^-15,
- {11,12,13'}:*/_,{15,16,17'}:/*_
+?w : ?~wf
+?z : ?~zf
+?d : ?~dm
+
+<30,!17,2:?,3:/!,4:/!2,7:/?!,
+ 8:/??!,10^-15:/#.6'Ph,
+ 11'12':?w,13'14:?z,15'16:?d
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(75mm,25mm) #@(2mm,2mm)
sw_numbering:=Atom;
- numbering_end:=17;
- \(<30,!17,2:/_,3:/!,4:/!2,7:/iPr,8:/tBu,10:/'(Ph`0.6)^-15,
- {11,12,13'}:*/_,{15,16,17'}:/*_)
+ \(<30,!17,2:?,3:/!,4:/!2,7:/?!,8:/??!,10^-15:/#.6'Ph,
+ 11'12:?w,13'14:?z,15'16:?d)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -992,15 +998,15 @@ endfigm
\begin{verbatim}
~,^,` : change type,angle,length
-<30,!6,{2~wf,4~zf,6^-30,8^$120}:/_
+<30,!6,{2~wf'4~zf'6^-30'8^$120}:?
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(60mm,18mm) #@(2mm,2mm)
sw_trimming:=1;
- sw_numbering:=Atom; numbering_end:=9;
- \(<30,!8`1,{2~wf,4~zf,6^-30,8^$120}:/_)
+ sw_numbering:=Atom;
+ \(<30,!8`1,{2~wf'4~zf'6^-30'8^$120}:?)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -1008,7 +1014,7 @@ endfigm
^,`,> : change angle,length,environment
-<-30,!7`1,3:/_`2^30,5:/!2>lr,7:/!2>rl
+<-30,!7`1,3:?`2^30,5:/!2>lr,7:/!2>rl
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
@@ -1016,8 +1022,7 @@ beginfigm
#(60mm,16mm);
sw_trimming:=1;
sw_numbering:=Atom;
- numbering_end:=8;
- \(<-30,!7`1,3:/_`2^30,5:/!2>lr,7:/!2>rl)
+ \(<-30,!7`1,3:?`2^30,5:/!2>lr,7:/!2>rl)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -1033,17 +1038,17 @@ endfigm
>vt : vertical environment
?4,
-{3^-90,3^-30,3^90}:/!3>hz,
-{1^-60,1,1^60}:/!3>vt
+{3^-90'3^-30'3^90}:/!3>hz,
+{1^-60'1'1^60}:/!3>vt
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(50mm,25mm);
+ #(60mm,35mm);
sw_trimming:=1;
ratio_chain_ring:=1;
- \(?4,{3^-90,3^-30,3^90}:/!3>hz,
- {1^-60,1,1^60}:/!3>vt
+ \(?4,{3^-90'3^-30'3^90}:/!3>hz,
+ {1^-60'1'1^60}:/!3>vt
)
++(defaultscale:=0.5; labeloffset:=2bp;
label.rt(">hz",A8);
@@ -1064,18 +1069,17 @@ endfigm
>rl : right-left environment
<-30,!6,
-{3^-30,3,3^30}:/!3>lr,
-{5^-30,5,5^30}:/!3>rl
+{3^-30'3'3^30}:/!3>lr,
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
%%%%% EN:Left-right_right-left
- #(40mm,18mm);
- sw_trimming:=0;
+ #(50mm,24mm);
+% sw_trimming:=1;
\(<-30,!6,
- {3^-30,3,3^30}:/!3>lr,
- {5^-30,5,5^30}:/!3>rl)
+ {3^-30'3'3^30}:/!3>lr,
+ {5^-30'5'5^30}:/!3>rl)
++(defaultscale:=0.5; labeloffset:=2bp;
label.lft(">lr",A11);
label.lft(">lr",A15);
@@ -1100,7 +1104,7 @@ endfigm
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(40mm,20mm);
+ #(45mm,24mm);
sw_trimming:=1;
\(<30,!4,2:/!6>30,4:/!4>-45)
++(defaultscale:=0.5; labeloffset:=2bp;
@@ -1112,17 +1116,17 @@ endfigm
%-----------------------------------------------------------------------------
\subsubsection{Rotate multiple angle}
\begin{verbatim}
->'(90,-90,...) : rotate 90,-90,...
+>{90'-90,...} : rotate 90,-90,...
-<30,!6,6>'(90,-90,90,-90,90):/!5
+<30,!6,6>{90'-90'90'-90'90}:/!5
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,20mm);
- \(<30,!6,6>'(90,-90,90,-90,90):/!5)
+ #(62mm,24mm);
+ \(<30,!6,6>90'-90'90'-90'90:/!5)
++(defaultscale:=0.5; labeloffset:=2bp;
- label.lft(">'(90,-90,90,-90,90)",A13);
+ label.lft(">{90'-90'90'-90'90}",A13);
label.rt(">90",A12);
label.lft(">-90",A11);
label.rt(">90",A10);
@@ -1142,9 +1146,9 @@ endfigm
\index{S?O}%
\index{S?O?O}%
\begin{verbatim}
-NH : N,/H~nl N? : N,/_
-N?2 : N,/! S?O : S,//O
-S?O?O : S,//O^35,//^-35
+NH : N,/H~nl N? : N,?
+N?2 : N,/! S?O : S,?O
+S?O?O : S,?O^35,//^-35
<-30,!2,NH,!2,N?,!2,N?2,S?O,!2,S?O?O,!
\end{verbatim}
@@ -1161,8 +1165,9 @@ endfigm
\index{??}%
\index{??"!}%
\index{N?"!}%
+\index{dimethylamino}%
\begin{verbatim}
-?? : /_^35,/_-35 /?! : isopropyl
+?? : ?^35,?-35 /?! : isopropyl
/??! : tert-butyl /N?! : dimethylamino
<30,!11`1,2:??,4:/!,6:/?!,8:/??!,10:/N?!
@@ -1170,70 +1175,71 @@ endfigm
%-----------------------------------------
\begin{mplibcode}
beginfigm
-#(60mm,10mm);
+#(60mm,12mm);
sw_trimming:=1;
\(<30,!11`1.2,2:??,4:/!,6:/?!,8:/??!,10:/N?!)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\subsubsection{Define group,parts}
-\index{'}%
+\index{define group}%
+\index{define group with atoms}%
+\index{define parts}%
\index{`}%
\index{``}%
\begin{verbatim}
`(..) : define group
``(..)(..) : define group with atoms
-'(..) : define parts
+''(..) : define parts
CF3:=`("{CF3}"); % ** group weight =0
CF3:=``("{CF3}")(C,F,F,F);
** group weight =12(C)+19(F)*3=69
-iBuOH:='(!?!,OH);
-\(<30,?6,{4,6}:/iBuOH,3:/CF3)
+iBuOH:=''(!?!,OH);
+\(<30,?6,4'6:/iBuOH,3:/CF3)
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,10mm);
+ #(60mm,14mm);
sw_trimming:=1;
- iBuOH:='(!?!,OH);
+ iBuOH:=''(!?!,OH);
CF3:=``("{CF3}")(C,F,F,F);
- \(<30,?6,{4,6}:/iBuOH,3:/CF3)
+ \(<30,?6,4'6:/iBuOH,3:/CF3)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\subsubsection{Concatenate group,parts}
-\index{+}%
+\index{'}%
\begin{verbatim}
-a+b : '(a,b)
-/!?!+OH : /'(!?!,OH)
+a'b : ''(a,b)
- <30,!8,{2,6}:/!?!+OH
+ <30,!8,2'6:/!?!'OH
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,12mm) #@(2mm,1mm)
+ #(60mm,14mm) #@(2mm,1mm)
sw_trimming:=1;
- \(<30,!8,{2,6}:/!?!+OH)
+ \(<30,!8,2'6:/!?!'OH)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
\subsubsection{Move position [ @{ }]}
\index{@}%
\begin{verbatim}
-@(x,y) : Move l*(x,y) from current position
-@$(x,y): Move l*(x,y) from origin(@1)
+@(x'y) : Move l*(x,y) from current position
+@$(x'y): Move l*(x,y) from origin(@1)
** l=bond length of ring
-<30,?6,@3,!4,//O,!,O,n_^60,@$(6,1),H,p_^15
+<30,?6,@3,!4,?O,!,O,n_^60,@$(6'1),H,p_^15
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
- #(70mm,13mm) #@(2mm,1mm)
+ #(70mm,15mm) #@(2mm,1mm)
sw_trimming:=1;
- \(<30,?6,@3,\,!3,//O,!,O,n_^60,@$(6,1),H,p_^15)
+ \(<30,?6,@3,!,!3,?O,!,O,n_^60,@$(6'1),H,p_^15)
++(drawdot A1 withpen pencircle scaled 3bp;
drawdot A12 withpen pencircle scaled 3bp;
pickup pencircle scaled 0.1bp;
@@ -1251,14 +1257,14 @@ endfigm
\index{\-\-}%
\begin{verbatim}
6:10 : 6,7,8,9,10
-<30,!14,{2,6:10,14}:/_~bd_r`0.5
+<30,!14,{2,6:10,14}:?~bd_r`0.5
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(75mm,12mm) |<(8mm)
- sw_numbering:=Atom; numbering_end:=15;
- \(<30,!14,{2,6:10,14}:/_~bd_r`0.5)
+ sw_numbering:=Atom;
+ \(<30,!14,{2'6:10'14}:?~bd_r`0.5)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -1268,7 +1274,7 @@ endfigm
\index{green}%
\begin{verbatim}
beginfigm
- \(<30,Ph,{2,5}:N,3:/NH2,4:/COOH,
+ \(<30,Ph,2'5:N,3:/NH2,4:/COOH,
2:red, 5:blue, 3=green)
endfigm
\end{verbatim}
@@ -1276,7 +1282,7 @@ endfigm
\begin{mplibcode}
beginfigm
#(50mm,18mm) |<(8mm)
- \(<30,Ph,{2,5}:N,3:/NH2,4:/COOH,
+ \(<30,Ph,2'5:N,3:/NH2,4:/COOH,
2:red,5:blue,3=green)
endfigm
\end{mplibcode}
@@ -1286,17 +1292,17 @@ endfigm
\begin{verbatim}
beginfigm
%----------------
- atomfont:="cmr8";
+ atomfont:="phvro8g";
%----------------
- \(<30,Ph,{2,5}:N,3:/NH2,4:/COOH)
+ \(<30,Ph,2'5:N,3:/NH2,4:/COOH)
endfigm
\end{verbatim}
%-----------------------------------------
\begin{mplibcode}
beginfigm
#(50mm,18mm) |<(8mm)
- atomfont:="cmr8";
- \(<30,Ph,{2,5}:N,3:/NH2,4:/COOH)
+ atomfont:="phvro8g";
+ \(<30,Ph,2'5:N,3:/NH2,4:/COOH)
endfigm
\end{mplibcode}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1563,7 +1569,7 @@ endfigm
\subsubsection{Offset thickness of bond}
\index{offset\_thickness}%
\begin{verbatim}
-default: offset_thickness=0.2pt
+default: offset_thickness=0.25pt
\end{verbatim}
%---------------------------------------------
%%offset_thickness
@@ -1571,11 +1577,11 @@ default: offset_thickness=0.2pt
beginfigm
#(60mm,12mm);
offset_thickness:=0.0pt; @(0.1,0.5)\(<30,Ph)
- offset_thickness:=0.2pt; @(0.55,0.5)\(<30,Ph)
+ offset_thickness:=0.25pt; @(0.55,0.5)\(<30,Ph)
offset_thickness:=0.5pt; @(1,0.5)\(<30,Ph)
**(defaultscale:=0.6; labeloffset:=1bp;
label.urt("0.0pt",(0,1bp));
- label.urt("0.2pt",(0.36w,1bp));
+ label.urt("0.25pt",(0.36w,1bp));
label.urt("0.5pt",(0.7w,1bp));
)
endfigm
@@ -1624,19 +1630,19 @@ endfigm
\subsubsection{Offset of wedge width}
\index{offset\_wedge}%
\begin{verbatim}
-default: offset_wedge=0.4pt
+default: offset_wedge=0.2pt
\end{verbatim}
%---------------------------------------------
\begin{mplibcode}
beginfigm
#(60mm,12mm);
- offset_wedge:=0.0pt; @(0.1,0.5)\(<30,?6,5:*/_)
- offset_wedge:=0.4pt; @(0.55,0.5)\(<30,?6,5:*/_) %<<== default
- offset_wedge:=1.0pt; @(1, 0.5)\(<30,?6,5:*/_)
+ offset_wedge:=0.0pt; @(0.1,0.5)\(<30,?6,5:?w)
+ offset_wedge:=0.2pt; @(0.55,0.5)\(<30,?6,5:?w) %<<== default
+ offset_wedge:=0.5pt; @(1, 0.5)\(<30,?6,5:?w)
**(defaultscale:=0.6; labeloffset:=1bp;
label.urt("0.0pt",(0,1bp));
- label.urt("0.4pt",(0.36w,1bp));
- label.urt("1.0pt",(0.7w,1bp));
+ label.urt("0.2pt",(0.36w,1bp));
+ label.urt("0.5pt",(0.7w,1bp));
)
endfigm
\end{mplibcode}
@@ -1646,7 +1652,7 @@ endfigm
\index{\textbar\textless()}%
\begin{verbatim}
|<(n): abbreviated form of max_blength:=n;
-default: max_blength=10mm
+default: max_blength=10mm
\end{verbatim}
%---------------------------------------------
\begin{mplibcode}
@@ -1669,14 +1675,14 @@ endfigm
\subsubsection{Thickness/bond length}
\index{ratio\_thickness\_bond}%
\begin{verbatim}
-default: ratio_thickness_bond=0.015
+default: ratio_thickness_bond=0.012
\end{verbatim}
%---------------------------------------------
\begin{mplibcode}
beginfigm
#(60mm,12mm);
ratio_thickness_bond:=0.005; @(0.1,0.5)\(<30,Ph)
- ratio_thickness_bond:=0.015; @(.55,0.5)\(<30,Ph) %<<== default
+ ratio_thickness_bond:=0.012; @(.55,0.5)\(<30,Ph) %<<== default
ratio_thickness_bond:=0.03; @(1, 0.5)\(<30,Ph)
**(defaultscale:=0.6; labeloffset:=1bp;
label.urt("0.005",(0,1bp));
@@ -1686,62 +1692,62 @@ beginfigm
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Char/bond thickness}
-\index{ratio\_char\_bond}%
+\subsubsection{Atom/bond length}
+\index{ratio\_atom\_bond}%
\begin{verbatim}
-default: ratio_char_bond=1.5
+default: ratio_atom_bond= 0.36
\end{verbatim}
%---------------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,12mm)
- ratio_char_bond:=1.0; @(0, 0.5)\(<30,?6,6:O,3:NH)
- ratio_char_bond:=1.5; @(.5,0.5)\(<30,?6,6:O,3:NH) %<<== default
- ratio_char_bond:=2.0; @( 1,0.5)\(<30,?6,6:O,3:NH)
+ #(60mm,12mm);
+ ratio_atom_bond:=0.25; @(0.1,0.5)\(<30,?6,3:O)
+ ratio_atom_bond:=0.33; @(.55,0.5)\(<30,?6,3:O) %<<== default
+ ratio_atom_bond:=0.45; @(1, 0.5)\(<30,?6,3:O)
**(defaultscale:=0.6; labeloffset:=1bp;
- label.urt("1.0",(0,1bp));
- label.urt("1.5",(0.36w,1bp));
- label.urt("2.0",(0.7w,1bp));
+ label.urt("0.25",(0,1bp));
+ label.urt("0.33",(0.36w,1bp));
+ label.urt("0.45",(0.7w,1bp));
)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Bond gap/bond length}
-\index{ratio\_bondgap\_bond}%
+\subsubsection{Char thickness/Atom width}
+\index{ratio\_char\_atom}%
\begin{verbatim}
-default: ratio_bondgap_bond= 0.15
+default: ratio_char_atom=0.12
\end{verbatim}
%---------------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,12mm);
- ratio_bondgap_bond:=0.10; @(0.1,0.5)\(<30,Ph)
- ratio_bondgap_bond:=0.15; @(.55,0.5)\(<30,Ph) %<<== default
- ratio_bondgap_bond:=0.20; @(1 ,0.5)\(<30,Ph)
+ #(60mm,12mm)
+ ratio_char_atom:=0.1; @(0, 0.5)\(<30,?6,6:O,3:NH)
+ ratio_char_atom:=0.12; @(.5,0.5)\(<30,?6,6:O,3:NH) %<<== default
+ ratio_char_atom:=0.15; @( 1,0.5)\(<30,?6,6:O,3:NH)
**(defaultscale:=0.6; labeloffset:=1bp;
- label.urt("0.10",(0,1bp));
- label.urt("0.15",(0.36w,1bp));
- label.urt("0.20",(0.7w,1bp));
+ label.urt("0.1", (0,1bp));
+ label.urt("0.12",(0.36w,1bp));
+ label.urt("0.15",(0.7w,1bp));
)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Atom/bond length}
-\index{ratio\_atom\_bond}%
+\subsubsection{Bond gap/bond length}
+\index{ratio\_bondgap\_bond}%
\begin{verbatim}
-default: ratio_atom_bond= 0.36
+default: ratio_bondgap_bond= 0.15
\end{verbatim}
%---------------------------------------------
\begin{mplibcode}
beginfigm
#(60mm,12mm);
- ratio_atom_bond:=0.25; @(0.1,0.5)\(<30,?6,3:O)
- ratio_atom_bond:=0.33; @(.55,0.5)\(<30,?6,3:O) %<<== default
- ratio_atom_bond:=0.45; @(1, 0.5)\(<30,?6,3:O)
+ ratio_bondgap_bond:=0.10; @(0.1,0.5)\(<30,Ph)
+ ratio_bondgap_bond:=0.15; @(.55,0.5)\(<30,Ph) %<<== default
+ ratio_bondgap_bond:=0.20; @(1 ,0.5)\(<30,Ph)
**(defaultscale:=0.6; labeloffset:=1bp;
- label.urt("0.25",(0,1bp));
- label.urt("0.33",(0.36w,1bp));
- label.urt("0.45",(0.7w,1bp));
+ label.urt("0.10",(0,1bp));
+ label.urt("0.15",(0.36w,1bp));
+ label.urt("0.20",(0.7w,1bp));
)
endfigm
\end{mplibcode}
@@ -1749,15 +1755,15 @@ endfigm
\subsubsection{Wedge/bond length}
\index{ratio\_wedge\_bond}%
\begin{verbatim}
-default: ratio_wedge_bond=0.12
+default: ratio_wedge_bond=0.12
\end{verbatim}
%------------------------------------------------------
\begin{mplibcode}
beginfigm
#(70mm,12mm);
- ratio_wedge_bond:=0.1; @(0.05,.5)\(?6,4:*/_)
- ratio_wedge_bond:=0.12; @(.55, .5)\(?6,4:*/_) %<<== default
- ratio_wedge_bond:=0.2; @(1 , .5)\(?6,4:*/_)
+ ratio_wedge_bond:=0.1; @(0.05,.5)\(?6,4:?w)
+ ratio_wedge_bond:=0.12; @(.55, .5)\(?6,4:?w) %<<== default
+ ratio_wedge_bond:=0.2; @(1 , .5)\(?6,4:?w)
**(defaultscale:=0.6; labeloffset:=1bp;
label.urt("0.10",(0,1bp));
label.urt("0.12",(0.36w,1bp));
@@ -1775,16 +1781,16 @@ default: ratio_atomgap_atom= 0.050
%------------------------------------------------------
\begin{mplibcode}
beginfigm
- ''("<30,!2`0.5,2:O")
+ '`("<30,!2`0.5,2:O")
#(70mm,12mm)
- sw_frame:=sw_frame+Atom;
+ sw_frame:=Atom;
ratio_atomgap_atom:=0.00; @(0, .5)\(scantokens(mc))
ratio_atomgap_atom:=0.050; @(.5,.5)\(scantokens(mc)) %<<== default
ratio_atomgap_atom:=0.12; @(1, .5)\(scantokens(mc))
- **(defaultscale:=0.75; labeloffset:=1bp;
- label.urt("0.00",(0.05w,1bp));
- label.urt("0.05",(0.45w,1bp));
- label.urt("0.12",(0.85w,1bp));
+ **(defaultscale:=0.6; labeloffset:=1bp;
+ label.urt("0.00",(0.05w,3bp));
+ label.urt("0.05",(0.45w,3bp));
+ label.urt("0.12",(0.85w,3bp));
)
endfigm
\end{mplibcode}
@@ -1817,7 +1823,7 @@ default: ratio_hashgap_bond=0.12
%------------------------------------------------------
\begin{mplibcode}
beginfigm
- ''("<30,!2,2:/*_`1.5")
+ '`("<30,!2,2:?z`1.5")
#(70mm,15mm)
ratio_hashgap_bond:=0.06; @(0.08,.5)\(scantokens(mc))
ratio_hashgap_bond:=0.12; @( .55,.5)\(scantokens(mc)) %<<== default
@@ -1834,53 +1840,70 @@ endfigm
%-----------------------------------------------------------------------------
\subsection{Drawing mode}
%-----------------------------------------------------------------------------
-\subsubsection{Numbering atom}
+\subsubsection{Numbering atom,bond}
\index{sw\_numbering}%
\index{Atom}%
-\index{numbering\_start}%
-\index{numbering\_end}%
\begin{verbatim}
-sw_numbering=Atom
-numbering_start:=3;
-numbering_end:=8;
-default: sw_numbering=0
-
sw_numbering:=Atom;
-\(<-30,!9)
\end{verbatim}
%------------------------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,10mm);
+ #(60mm,7mm);
ratio_chain_ring:=1;
- numbering_start:=3; numbering_end:=8;
sw_numbering:=Atom; \(<-30,!9)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Numbering bond}
-\index{numbering\_start}%
-\index{numbering\_end}%
\index{Bond}%
\begin{verbatim}
-sw_numbering=Bond
-numbering_start:=3;
-numbering_end:=8;
-default: sw_numbering=0
-
sw_numbering:=Bond;
-\(<-30,!9)
\end{verbatim}
%------------------------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,10mm);
+ #(60mm,7mm);
ratio_chain_ring:=1;
- numbering_start:=3; numbering_end:=8;
sw_numbering:=Bond; \(<-30,!9)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
+\begin{verbatim}
+sw_numbering:=Atom+Bond;
+\end{verbatim}
+%------------------------------------------------------
+\begin{mplibcode}
+beginfigm
+ #(60mm,7mm);
+ ratio_chain_ring:=1;
+ sw_numbering:=Atom+Bond; \(<-30,!9)
+endfigm
+\end{mplibcode}
+%------------------------------------------------------
+\begin{verbatim}
+sw_numbering:=Atom+Bond;
+\end{verbatim}
+%------------------------------------------------------
+\begin{mplibcode}
+beginfigm
+ #(60mm,12mm);
+ ratio_chain_ring:=1;
+ sw_numbering:=Atom+Bond; \(<-30,!9,3'5'7'9:?w`.66)
+endfigm
+\end{mplibcode}
+%------------------------------------------------------
+\begin{verbatim}
+sw_numbering:=Atom+Bond+All;
+\end{verbatim}
+%------------------------------------------------------
+\begin{mplibcode}
+beginfigm
+ #(60mm,12mm);
+ ratio_chain_ring:=1;
+ sw_numbering:=Atom+Bond+All; \(<-30,!9,3'5'7'9:?w`.66)
+endfigm
+\end{mplibcode}
+%-----------------------------------------------------------------------------
\subsubsection{Trimming mode}
\index{sw\_trimming}%
\begin{verbatim}
@@ -1891,7 +1914,7 @@ sw_trimming:=0; ** default
%------------------------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,20mm) ##(1,.7)
+ #(60mm,15mm) ##(1,.7)
sw_frame:=Bothside+Mol;
@(.2,.3)\(Ph)
@(.8,.7)\(Ph)
@@ -1905,7 +1928,7 @@ sw_trimming:=1;
%------------------------------------------------------
\begin{mplibcode}
beginfigm
- #(60mm,20mm) ##(1,.7)
+ #(60mm,15mm) ##(1,.7)
sw_frame:=Bothside+Mol;
sw_trimming:=1;
@(.2,.3)\(Ph)
@@ -1913,58 +1936,34 @@ beginfigm
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Expand mode}
-\index{sw\_expand}%
-\begin{verbatim}
-** put before input mcf2graph
-sw_expand:=1;
-input mcf2graph.mp;
-
-(sw_expand=0) ** default
-@(0, .5)\(<30,Ph,4:/COOH,3:/NH2)
-(sw_expand=1)
-@(1, .5)\(<30,Ph,4:/COOH,3:/NH2)
-\end{verbatim}
-%------------------------------------------------------
-\begin{mplibcode}
-beginfigm
- #(60mm,15mm)
- @(0, .5)\(<30,Ph,1:/COOH,3:/NH2)
- sw_expand:=1;
- @(1, .5)\(<30,Ph,1:/'(//O^-60,/OH^60),3:/'(N,/H^60,/H^-60))
-endfigm
-\end{mplibcode}
-%-----------------------------------------------------------------------------
-\subsubsection{Abbreviate group}
+\subsubsection{Omit group}
\index{Group}%
-\index{sw\_abbreviate}%
\begin{verbatim}
-** default: sw_abbreviate=Group
+** default: sw_omit=Group
\end{verbatim}
%------------------------------------------------------
\begin{mplibcode}
beginfigm
- ''("<30,Ph,4:/Cl,3:/F")
+ '`("<30,Ph,4:/Cl,3:/F")
#(60mm,12mm)
@(.15, .5)\(scantokens(mc))
- sw_abbreviate:=Group;
+ sw_omit:=Group;
@(.85, .5)\(scantokens(mc))
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsubsection{Abbreviate bond type}
+\subsubsection{Omit bond type}
\index{Bond}%
-\index{sw\_abbreviate}%
\begin{verbatim}
-** default: sw_abbreviate=Bond
+** default: sw_omit=Bond
\end{verbatim}
%------------------------------------------------------
\begin{mplibcode}
beginfigm
- ''("<30,Ph,4:/Cl,3:/F")
+ '`("<30,Ph,4:/Cl,3:/F")
#(60mm,12mm)
@(.15, .5)\(scantokens(mc))
- sw_abbreviate:=Bond;
+ sw_omit:=Bond;
@(.85, .5)\(scantokens(mc))
endfigm
\end{mplibcode}
@@ -2045,7 +2044,7 @@ sw_frame=Atom
\begin{mplibcode}
beginfigm
#(60mm,10mm);
- sw_frame:=sw_frame+Atom;
+ sw_frame:=Atom;
\(<30,COOH,!,COOH)
endfigm
\end{mplibcode}
@@ -2064,7 +2063,7 @@ beginfigm
%--------------------------
\(Ph)
endfigm
-beginfigm
+beginfigm
\(Ph)
endfigm
\end{verbatim}
@@ -2084,6 +2083,7 @@ beginfigm
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
+\newpage
\subsubsection{Global parameter setting}
\begin{verbatim}
beginfigm
@@ -2098,6 +2098,9 @@ endfigm
beginfigm
\(Ph)
endfigm
+beginfigm
+ \(Ph)
+endfigm
\end{verbatim}
%----------------------------------------------------
\quad
@@ -2114,10 +2117,13 @@ endfigm
beginfigm
\(Ph)
endfigm
+beginfigm
+ \(Ph)
+endfigm
ratio_thickness_bond:=save_ratio;
\end{mplibcode}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Command}
+\section{Command of mcf2graph}
%-----------------------------------------------------------------------------
\subsection{drawm [ \textbackslash{ }]}
\index{drawm}%
@@ -2135,7 +2141,7 @@ d: y axis position
\(): abbreviated form of drawm()
drawm(<30,Ph,3:/F,4:/Cl)
- \(<30,Ph,3:/F,4:/Cl)
+ \(<30,Ph,3:/F,4:/Cl)
\end{verbatim}
%------------------------------------------------
\begin{mplibcode}
@@ -2146,19 +2152,30 @@ beginfigm
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
-\subsection{readm [ ' ' ]}
+\subsection{readm [ ' ` ]}
\index{readm()}%
-\index{''}%
+\index{'`}%
\begin{verbatim}
readm(string1,string2, ...);
** string = mcf code
-''(): abbreviated form of readm()
+'`(): abbreviated form of readm()
(example)
-''("<30,Ph,{1,2,6}:/O!,{-4,-5}=?7,",
- " {-1,-4,-6}=dl,-2://O,-3:/O!, ",
- " @9,\,NH,!,//O,! ")
+'`("<30,Ph,1'2'6:/O!,-4'-5=?7, ",
+ " -1'-4'-6=dl,-2:?O,-3:/O!, ",
+ " @9,!,NH,!,?O,! ")
+\\
\end{verbatim}
+
+\begin{mplibcode}
+beginfigm
+#(40mm,20mm);
+'`("<30,Ph,1'2'6:/O!,-4'-5=?7, ",
+ " -1'-4'-6=dl,-2:?O,-3:/O!, ",
+ " @9,!,NH,!,?O,! ")
+\\
+endfigm
+\end{mplibcode}
%-----------------------------------------------------------------------------
\subsection{checkm [ \textbackslash*{ }]}
\index{checkm()}%
@@ -2170,7 +2187,7 @@ beginfigm \(<30,Ph,2:N) endfigm
(check mcf and compile)
beginfigm
- ''("<30,Ph,2:") % ** '2:' missing arg
+ '`("<30,Ph,2:") % ** '2:' missing arg
if \*(mc)=0: \(scantokens(mc)) fi
endfigm
** \*(mc) : error count
@@ -2179,13 +2196,13 @@ endfigm
\quad
\begin{mplibcode}
beginfigm
- ''("<30,Ph,2:N")
+ '`("<30,Ph,2:N")
sw_trimming:=0;
#(12mm,12mm);
if \*(mc)=0: \(scantokens(mc)) fi
endfigm
beginfigm
- ''("<30,Ph,2:")
+ '`("<30,Ph,2:")
sw_trimming:=0;
#(12mm,12mm);
if \*(mc)=0: \(scantokens(mc)) fi
@@ -2211,10 +2228,11 @@ endfor
getm("name"): "name"=string
-beginfigm
- $("Adenine") % get data EN="Adenine"
- \\ % put figure
-endfigm
+(example)
+ beginfigm
+ $("Adenine")
+ \\
+ endfigm
\end{verbatim}
%-------------------------------------------------------------------------------
\subsection{putm [ \textbackslash\textbackslash{ }]}
@@ -2226,7 +2244,8 @@ putm: put figure
if op_row>=1: scantokens(op) fi
if mc_row>=1:
- if checkm(mc)=0: drawm(scantokens(mc))
+ if checkm(mc)=0:
+ drawm(scantokens(mc))
fi
fi
if ad_row>=1: add(scantokens(ad)) fi
@@ -2392,7 +2411,7 @@ beginfigm
B3m..A3+B2up#1.5aw..{A3down}A3;
)
%---------------------------------------
- @(1,0)\(<30,?6,{1,5}=dl,4://NH2)
+ @(1,0)\(<30,?6,1'5=dl,4://NH2)
%---------------------------------------
++(
labeloffset:=.7aw;
@@ -2418,7 +2437,7 @@ beginfigm
drawarrow B3m..A3+B2up#1.5aw..{A3down}A3;
)
%-------------------------------------------
- @(1,0)\(<30,?6,{1,5}=dl,4://NH2)
+ @(1,0)\(<30,?6,1'5=dl,4://NH2)
%-------------------------------------------
++(labeloffset:=.7aw;
label.top(plus,A7);
@@ -2497,7 +2516,7 @@ beginfigm
|=(0.065)
%---------------------------------------
@(0.1,0.5)\(
- <-210,60`1,60`1,60`1,{1,3}=dl)
+ <-210,60`1,60`1,60`1,1'3=dl)
++(
defaultscale:=0.6;
label.bot("Diene",p0+(0.5w,0));
@@ -2523,41 +2542,39 @@ endfigm
\subsubsection{Local ext setting}
\index{\_}%
\begin{verbatim}
-_s : abbreviated form of EN:=s;
-
beginfigm
- _"?3"@(0.5,1)\(<30,?3)
+ EN:="?3";@(0.5,1)\(<30,?3)
endfigm
beginfigm
- _"?4"@(0.5,1)\(?4)
+ EN:="?4";@(0.5,1)\(?4)
%-------------------------------
**(label.top(EN,(0.5w,0));)
%-------------------------------
endfigm
beginfigm
- _"?5"@(0.5,1)\(?5)
+ EN:="?5";@(0.5,1)\(?5)
endfigm
beginfigm
- _"?6"@(0.5,1)\(?6)
+ EN:="?6";@(0.5,1)\(?6)
endfigm
\end{verbatim}
%----------------------------------------------------
\quad
\begin{mplibcode}
beginfigm
- _"?3"#(12mm,15mm)@(0.5,1)\(<30,?3)
+ EN:="?3";#(12mm,15mm)@(0.5,1)\(<30,?3)
endfigm
beginfigm
- _"?4"#(12mm,15mm)@(0.5,1)\(?4)
+ EN:="?4";#(12mm,15mm)@(0.5,1)\(?4)
%-------------------------------
**(label.top(EN,(0.5w,0));)
%-------------------------------
endfigm
beginfigm
- _"?5"#(12mm,15mm)@(0.5,1)\(?5)
+ EN:="?5";#(12mm,15mm)@(0.5,1)\(?5)
endfigm
beginfigm
- _"?6"#(12mm,15mm)@(0.5,1)\(?6)
+ EN:="?6";#(12mm,15mm)@(0.5,1)\(?6)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -2567,47 +2584,47 @@ endfigm
ext_clear: reset global ext()
beginfigm
- _"?3"@(0.5,1)\(<30,?3)
+ EN:="?3";@(0.5,1)\(<30,?3)
endfigm
%-------------------------------
ext(label.top(EN,(0.5w,0));)
%-------------------------------
beginfigm
- _"?4"@(0.5,1)\(?4)
+ EN:="?4";@(0.5,1)\(?4)
endfigm
beginfigm
- _"?5"@(0.5,1)\(?5)
+ EN:="?5";@(0.5,1)\(?5)
endfigm
%---------
ext_clear;
%---------
beginfigm
- _"?6"@(0.5,1)\(?6)
+ EN:="?6";@(0.5,1)\(?6)
endfigm
\end{verbatim}
%-------------------------------------
\quad
\begin{mplibcode}
beginfigm
- _"?3"#(12mm,15mm)
+ EN:="?3";#(12mm,15mm)
@(0.5,1)\(<30,?3)
endfigm
%-------------------------------
ext(label.top(EN,(0.5w,0));)
%-------------------------------
beginfigm
- _"?4"#(12mm,15mm)
+ EN:="?4";#(12mm,15mm)
@(0.5,1)\(?4)
endfigm
beginfigm
- _"?5"#(12mm,15mm)
+ EN:="?5";#(12mm,15mm)
@(0.5,1)\(?5)
endfigm
%---------
ext_clear;
%---------
beginfigm
- _"?6"#(12mm,15mm)
+ EN:="?6";#(12mm,15mm)
@(0.5,1)\(?6)
endfigm
\end{mplibcode}
@@ -2622,7 +2639,7 @@ endfigm
\begin{verbatim}
beginfigm
#(50mm,15mm)
- \(<30,Ph,3=?5,@8,\,?5,{9,16}=dl,{9,14}:N,{7,11}:S,1:/OH,-2:*/COOH)
+ \(<30,Ph,3=?5,@8,!,?5,9'16=dl,9'14:N,7'11:S,1:/OH,-2:*/COOH)
endfigm
\end{verbatim}
%-------------------------------------------
@@ -2630,7 +2647,7 @@ endfigm
loadm("EN<>*");
beginfigm
#(50mm,15mm)
- \(<30,Ph,3=?5,@8,\,?5,{9,16}=dl,{9,14}:N,{7,11}:S,1:/OH,-2:*/COOH)
+ \(<30,Ph,3=?5,@8,!,?5,9'16=dl,9'14:N,7'11:S,1:/OH,-2:*/COOH)
endfigm
\end{mplibcode}
%-----------------------------------------------------------------------------
@@ -2639,10 +2656,10 @@ endfigm
\paragraph{(Colchicine)}
\begin{verbatim}
beginfigm
- ''(
- "<30,Ph,{1,2,6}:/O!,{-4,-5}=?7, ",
- " {-1,-4,-6}=dl,-2://O,-3:/O!, ",
- " 9:/NH!+?O! ")
+ '`(
+ "<30,Ph,1'2'6:/O!,-4'-5=?7, ",
+ " -1'-4'-6=dl,-2:?O,-3:/O!, ",
+ " 9:/NH!'?O! ")
#(40mm,20mm) \\
endfigm
\end{verbatim}
@@ -2650,10 +2667,10 @@ endfigm
% Colchicine MW:385.41
\begin{mplibcode}
beginfigm
- ''(
- "<30,Ph,{1,2,6}:/O!,{-4,-5}=?7, ",
- " {-1,-4,-6}=dl,-2://O,-3:/O!, ",
- " 9:/NH!+?O! ")
+ '`(
+ "<30,Ph,1'2'6:/O!,-4'-5=?7, ",
+ " -1'-4'-6=dl,-2:?O,-3:/O!, ",
+ " 9:/NH!'?O! ")
#(40mm,20mm) \\
endfigm
\end{mplibcode}
@@ -2668,14 +2685,12 @@ arc_br : arc bottom right
beginfigm
%"EN:Maltose","MW:342.3",
- ''(
- %----------------------------------------------------
- "#1.25,-30~wf_r,30~bd_r`1,30~wb_r,120,O,30,&1,##, ",
- "#.5,{1^$-90,2^$90,3^$-90}:/OH,6^$90:/!OH, ",
- "@4,$-50~arc_lb`1,O,$50~arc_br`1,<$0, ",
- "|,#1.25,-30~wf_r,30~bd_r`1,30~wb_r,120,O,30,&1,##, ",
- "#.5,{2^$90,3^$-90,4^$-90}:/OH,6^$90:/!OH ")
- %----------------------------------------------------
+ '`(
+ %--------------------------------------------------------
+ "hexose_hp,#.5,{1^$270'2^$90'3^$270}:/OH,6^$90:/!OH,##,",
+ "@4,$310~arc_lb`1,O,$50~arc_br`1,<$0, ",
+ "|,hexose_hp,#.5,{2^$90'3^$270'4^$270}:/OH,6^$90:/!OH ")
+ %--------------------------------------------------------
#(50mm,20mm) \\
endfigm
\end{verbatim}
@@ -2683,14 +2698,12 @@ endfigm
\begin{mplibcode}
beginfigm
%"EN:Maltose","MW:342.3",
- ''(
- %-------------------------------------------------------
- "#1.25,-30~wf_r,30~bd_r`1,30~wb_r,120,O,30,&1,##, ",
- "#.5,{1^$-90,2^$90,3^$-90}:/OH,6^$90:/!OH, ",
- "@4,$-50~arc_lb`1,O,$50~arc_br`1,<$0, ",
- "|,#1.25,-30~wf_r,30~bd_r`1,30~wb_r,120,O,30,&1,##, ",
- "#.5,{2^$90,3^$-90,4^$-90}:/OH,6^$90:/!OH ")
- %-------------------------------------------------------
+ '`(
+ %--------------------------------------------------------
+ "hexose_hp,#.5,{1^$270'2^$90'3^$270}:/OH,6^$90:/!OH,##,",
+ "@4,$310~arc_lb`1,O,$50~arc_br`1,<$0, ",
+ "|,hexose_hp,#.5,{2^$90'3^$270'4^$270}:/OH,6^$90:/!OH ")
+ %--------------------------------------------------------
#(50mm,20mm) \\
endfigm
\end{mplibcode}
@@ -2699,16 +2712,16 @@ endfigm
\paragraph{(Erythromycin)}
\begin{verbatim}
beginfigm
- _"Erythromycin" MW:="733.93";
+ EN:=Erythromycin"; MW:="733.93";
#(60mm,30mm) @(1,0.5)
- ''(
+ '`(
%-----------------------------------------------------------------------
- "<30,#1,<-120,60,60,60,-60,60,60,-60,60,60,60,-60,60,60,##,&1, ",
- " 14:O,13:/*Et,{1,9}://O, ",
- " {2',4,6^-35,8,10',12^35}:/*_, ",
- " {6^35,11,12^-35}:*/OH, ",
- " @$3,\*,O,30~zb,|,?6`.7,6:O,#.5,{5~wf,3^35}:/_,4:/*OH,3^-35:/*O!,##, ",
- " @$5,\*^30`1.7,O,!~zb,|,?6`.7,6:O,#.5,5:/*_,2:*/OH,3:/*N?! ")
+ "<30,#1,<-120,60,60,60,-60,60,60,-60,60,60,60,-60,60,60,##,&1, ",
+ " 14:O,13:/*!,1'9:?O, ",
+ " {*2'4'6^-35'8'*10'12^35}:?z, ",
+ " {6^35'11'12^-35}:*/OH, ",
+ " @$3,!z,O,30~zb,|,?6`.7,6:O,#.5,{5~wf'3^35}:?,4:/*OH,3^-35:/*O!,##,",
+ " @$5,!z^30`1.7,O,!~zb,|,?6`.7,6:O,#.5,5:?z,2:*/OH,3:/*N?! ")
%-----------------------------------------------------------------------
\\
**(defaultscale:=0.8;
@@ -2720,19 +2733,18 @@ beginfigm
endfigm;
\end{verbatim}
%----------------------------------------------------------------------------
-%%%% EN:Erythromycin MW:733.93
\begin{mplibcode}
beginfigm
- _"Erythromycin" MW:="733.93";
+ EN:="Erythromycin"; MW:="733.93";
#(60mm,30mm) @(1,0.5)
- ''(
+ '`(
%-----------------------------------------------------------------------
- "<30,#1,<-120,60,60,60,-60,60,60,-60,60,60,60,-60,60,60,##,&1, ",
- " 14:O,13:/*Et,{1,9}://O, ",
- " {2',4,6^-35,8,10',12^35}:/*_, ",
- " {6^35,11,12^-35}:*/OH, ",
- " @$3,\*,O,30~zb,|,?6`.7,6:O,#.5,{5~wf,3^35}:/_,4:/*OH,3^-35:/*O!,##, ",
- " @$5,\*^30`1.7,O,!~zb,|,?6`.7,6:O,#.5,5:/*_,2:*/OH,3:/*N?! ")
+ "<30,#1,<-120,60,60,60,-60,60,60,-60,60,60,60,-60,60,60,##,&1, ",
+ " 14:O,13:/*!,1'9:?O, ",
+ " {*2'4'6^-35'8'*10'12^35}:?z, ",
+ " {6^35'11'12^-35}:*/OH, ",
+ " @$3,!z,O,30~zb,|,?6`.7,6:O,#.5,{5~wf'3^35}:?,4:/*OH,3^-35:/*O!,##,",
+ " @$5,30~zf`1.7,O,!~zb,|,?6`.7,6:O,#.5,5:?z,2:*/OH,3:/*N?! ")
%-----------------------------------------------------------------------
\\
**(defaultscale:=0.8;
@@ -2748,19 +2760,19 @@ endfigm;
\begin{verbatim}
beginfigm
% "EN:Paclitaxel","MW:853.918",
- ''(
+ '`(
%------------------------------------------------------------------
"?6,5=dl,@3,#1,36,45,45,45,45,##,&5,-4=?6,-4=?4,-1=wb,-3=wf,-1:O, ",
- " 4:??,6:/_,{3^-60,15}:*/OH,8:/*H^-60,9:*/_^60,10://O, ",
- " @1,\,O,!,//O,!,*/OH,!,/Ph,60~wf,NH,-60,//O,60,Ph, ",
- " @7,\*,O,-45,//O,60,Ph,{11>rl,12'^-15>lr}:*/O!+?O! ")
+ " 4:??,6:?,{3^-60'15}:*/OH,8:/*H^-60,9:?w^60,10:?O, ",
+ " @1,!,O,!,?O,!,*/OH,!,/Ph,60~wf,NH,-60,?O,60,Ph, ",
+ " @7,!z,O,-45,?O,60,Ph,{11>rl'*12^-15>lr}:*/O!'?O! ")
%------------------------------------------------------------------
#(140mm,30mm)
if \*(mc)=0:
@(0,0.5)\(scantokens(mc))
- sw_numbering:=Atom;
+ sw_numbering:=Atom+All;
@(0.6,0.5)\(scantokens(mc))
- sw_numbering:=Bond;
+ sw_numbering:=Bond+All;
@(1,0.5)\(scantokens(mc))
fi
endfigm
@@ -2769,17 +2781,17 @@ endfigm
\begin{mplibcode}
beginfigm
% "EN:Paclitaxel","MW:853.918",
- ''(
+ '`(
%-------------------------------------------------------------------
"?6,5=dl,@3,#1,36,45,45,45,45,##,&5,-4=?6,-4=?4,-1=wb,-3=wf,-1:O, ",
- " 4:??,6:/_,{3^-60,15}:*/OH,8:/*H^-60,9:*/_^60,10://O, ",
- " @1,\,O,!,//O,!,*/OH,!,/Ph,60~wf,NH,-60,//O,60,Ph, ",
- " @7,\*,O,-45,//O,60,Ph,{11>rl,12'^-15>lr}:*/O!+?O! ")
+ " 4:??,6:?,{3^-60'15}:*/OH,8:/*H^-60,9:?w^60,10:?O, ",
+ " @1,!,O,!,?O,!,*/OH,!,/Ph,60~wf,NH,-60,?O,60,Ph, ",
+ " @7,!z,O,-45,?O,60,Ph,{11>rl'*12^-15>lr}:*/O!'?O! ")
%-------------------------------------------------------------------
#(160mm,40mm)
if \*(mc)=0: @(0, 0.5)\(scantokens(mc))
- sw_numbering:=Atom; @(0.5,0.5)\(scantokens(mc))
- sw_numbering:=Bond; @(1, 0.5)\(scantokens(mc))
+ sw_numbering:=Atom+All; @(0.5,0.5)\(scantokens(mc))
+ sw_numbering:=Bond+All; @(1, 0.5)\(scantokens(mc))
fi
endfigm
\end{mplibcode}
@@ -2814,21 +2826,21 @@ loadm("CAT=biological","MW>=285","MW<=288","a:EN");
row[1][1]="CAT:biological;EN:Luteolin;MW:286.24;EXA:-"
row[1][2]=":"
-row[1][3]="<30,Ph,3=?6,9=dl,10:O,7://O,@9,\,Ph,{2,6,14,15}:/OH"
+row[1][3]="<30,Ph,3=?6,9=dl,10:O,7:?O,@9,!,Ph,2'6'14'15:/OH"
row[1][4]=";"
row[2][1]="CAT:biological;EN:Lycorine;MW:287.315;EXA:1"
row[2][2]=":"
-row[2][3]="<30,Ph,{-4,-2}=?6,{6,9--12}=?5,13=dl,8:N,{15,17}:O,"
-row[2][4]="{9'^180,10^60}:*/H,{13,14'}:*/OH"
+row[2][3]="<30,Ph,-4'-2=?6,6'(9--12)=?5,13=dl,8:N,15'17:O,"
+row[2][4]="{*9^180'10^60}:*/H,13'*14:*/OH"
row[2][5]=";"
row[3][1]="CAT:biological;EN:Morphine;MW:285.343;EXA:1"
row[3][2]=":"
-row[3][3]="<30,Ph,{2,-4}=?6,1---12=?5,-1:O,-1=zb,"
+row[3][3]="<30,Ph,2'-4=?6,1---12=?5,-1:O,-1=zb,"
row[3][4]="@7,60~wf`0.75,70~si_`1.3,45,N!,&9~wb,15=dl,6:/OH,8^180:*/H,12:/*OH"
row[3][5]=";"
row[4][1]="CAT:biological;EN:Piperine;MW:285.343;EXA:1"
row[4][2]=":"
-row[4][3]="<30,Ph,-1=?5,{-1,-3}:O,@4,\,!d,!,!d,!,//O,!,?6,-6:N"
+row[4][3]="<30,Ph,-1=?5,-1'-3:O,@4,!,!d,!,!d,!,?O,!,?6,-6:N"
row[4][4]=";"
\end{verbatim}
%------------------------------------------------------------------------------
@@ -2839,7 +2851,7 @@ sw_comment=1:
row[1][1]="%------------------------------------------------------------------"
row[1][2]="CAT:biological;EN:Luteolin;MW:286.24;EXA:-"
row[1][3]=":"
-row[1][4]="<30,Ph,3=?6,9=dl,10:O,7://O,@9,\,Ph,{2,6,14,15}:/OH"
+row[1][4]="<30,Ph,3=?6,9=dl,10:O,7:?O,@9,!,Ph,2'6'14'15:/OH"
row[1][5]=";"
** default sw_comment=0
@@ -2861,7 +2873,7 @@ MI : monoisotopic mass from data USE : the use
\begin{verbatim}
beginfigm
$("Chlorophyll a")
- sw_output:=Fig+Calc+Mcode;
+ sw_output:=Fig+Mcode;
#(80mm,30mm)
\(scantokens(mc))
VerbatimTeX("\gdef\EN{"&EN&"}\gdef\MW{"&MW&"}");
@@ -2875,7 +2887,7 @@ endfigm
\begin{mplibcode}
beginfigm
$("Chlorophyll a")
- sw_output:=Fig+Calc+Mcode;
+ sw_output:=Fig+Mcode;
#(80mm,30mm)
\(scantokens(mc))
VerbatimTeX("\gdef\EN{"&EN&"}\gdef\MW{"&MW&"}");
@@ -2890,9 +2902,9 @@ endfigm
\begin{verbatim}
beginfigm
$("Okadaic acid")
- ''(",38:*/_,65=red") %%%% add methyl group (color red) %%%%
- sw_output:=Fig+Calc+Mcode; %%%% output temp-mc.aux %%%%
- _"Dinophysistoxin-1" #(90mm,20mm)
+ '`(",38:?w,65=red") %%%% add methyl group (color red) %%%%
+ sw_output:=Fig+Mcode; %%%% output temp-mc.aux %%%%
+ EN:="Dinophysistoxin-1"; #(90mm,20mm)
MW:="819";
if \*(mc)=0: \(scantokens(mc))
VerbatimTeX("\gdef\EN{"&EN&"}\gdef\MW{"&MW&"}");
@@ -2907,10 +2919,10 @@ endfigm;
\begin{mplibcode}
beginfigm
$("Okadaic acid")
- ''(",38:*/_,65=red") %%%% add methyl group (color red) %%%%
- sw_output:=Fig+Calc+Mcode; %%%% output temp-mc.aux %%%%
+ '`(",38:?w,65=red") %%%% add methyl group (color red) %%%%
+ sw_output:=Fig+Mcode; %%%% output temp-mc.aux %%%%
MW:="819";
- _"Dinophysistoxin-1" #(90mm,20mm);
+ EN:="Dinophysistoxin-1"; #(90mm,20mm);
if \*(mc)=0: \(scantokens(mc))
VerbatimTeX("\gdef\EN{"&EN&"}\gdef\MW{"&MW&"}");
VerbatimTeX("\gdef\mw{"&mw&"}\gdef\fm{"&fm&"}");
@@ -2930,7 +2942,7 @@ endfigm;
\begin{mplibcode}
beginfigm
$("Maitotoxin") #(150mm,80mm) #@(3mm,3mm)
- sw_output:=Fig+Calc+Mcode; %%%% output temp-mc.aux %%%%
+ sw_output:=Fig+Mcode; %%%% output temp-mc.aux %%%%
sw_frame:=Outside;
if \*(mc)=0: \(scantokens(mc))
VerbatimTeX("\gdef\EN{"&EN&"}\gdef\MW{"&MW&"}");
@@ -2946,7 +2958,7 @@ endfigm;
\begin{mplibcode}
beginfigm
$("Maitotoxin") #(150mm,80mm) #@(3mm,3mm)
- sw_output:=Fig+Calc+Mcode;
+ sw_output:=Fig+Mcode;
sw_frame:=Outside; %% mc_length:=40;
if \*(mc)=0: \(scantokens(mc))
VerbatimTeX("\gdef\EN{"&EN&"}\gdef\MW{"&MW&"}");
@@ -2963,18 +2975,18 @@ endfigm;
\noindent%
\begin{mplibcode}
beginfigm
-#(160mm,75mm) |<(5mm)
+#(160mm,75mm) |<(4mm)
%--------------------------------------------------------------------------------
-COOH:='(//O,!,OH);
-HOCO:='(OH,!,//O,);
+COOH:=''(?O,!,OH);
+HOCO:=''(OH,!,?O,);
S_CoA:=`("{S-CoA}");
-@(0.33, 1)\(<30,HOCO,!,//O,!2,COOH) % Oxaloacetate
-@(0.66, 1)\(<30,HOCO,!4,COOH,@-4`1,\,COOH,4:/OH^-165) % Citrate
-@(1, 1)\(<30,HOCO,!2,!~dr,!,COOH,@-4`1,\,COOH) % cis-Aconitate
-@(1, 0.58)\(<30,HOCO,!4,COOH,@-4,\`1,COOH,5:/OH) % Isocitrate
-@(1, 0.05)\(<30,HOCO,!3,//O,!,COOH,@-4,\`1,COOH) % Oxalosuccinate
-@(0.66,0.05)\(<30,HOCO,!3,//O,!,COOH) % alfa-Ketoglutarate
-@(0.33,0.05)\(<30,HOCO,!3,//O,!,S_CoA) % Succinyl-CoA
+@(0.33, 1)\(<30,HOCO,!,?O,!2,COOH) % Oxaloacetate
+@(0.66, 1)\(<30,HOCO,!4,COOH,@-4`1,!,COOH,4:/OH^-165) % Citrate
+@(1, 1)\(<30,HOCO,!2,!~dr,!,COOH,@-4`1,!,COOH) % cis-Aconitate
+@(1, 0.58)\(<30,HOCO,!4,COOH,@-4,!`1,COOH,5:/OH) % Isocitrate
+@(1, 0.05)\(<30,HOCO,!3,?O,!,COOH,@-4,!`1,COOH) % Oxalosuccinate
+@(0.66,0.05)\(<30,HOCO,!3,?O,!,COOH) % alfa-Ketoglutarate
+@(0.33,0.05)\(<30,HOCO,!3,?O,!,S_CoA) % Succinyl-CoA
@(0, 0.05)\(<30,HOCO,!3,COOH) % Succinate
@(0, 0.55)\(<30,HOCO,!,!~dr,!,COOH) % Fumarate
@(0, 1)\(<30,HOCO,!3,COOH,3:/OH) % L-Malate
@@ -3015,7 +3027,7 @@ sw_label_emu:=1;
ext_setup;
r_arrow(10mm)( 0)(p1+ ( 1.1w1, 0.3h1))("Acetyl-CoA",1.5)(" CoA-SH",1);
r_arrow(10mm)( 0)(p2+ ( 1.1w2, 0.4h2))("",0)("H2O",1);
-r_arrow( 8mm)(270)(p3+ ( 0.5w3,-0.4h3))("H2O",1)("",0);
+r_arrow( 8mm)(270)(p3+ ( 0.5w3,-0.6h3))("H2O",1)("",0);
r_arrow( 8mm)(270)(p4+ ( 0.5w4,-0.4h4))("NAD+",1)("NADH2+",1);
r_arrow(10mm)(180)(p5+ (-0.1w5, 0.4h5))("",0)("CO2",1);
r_arrow(10mm)(180)(p6+ (-0.1w6, 0.5h6))("NAD+,CoA-SH",1.7)("NADH2+,CO2",1);
@@ -3031,17 +3043,17 @@ endfigm
%------------------------------------------------------------------------
\begin{verbatim}
beginfigm
-#(160mm,75mm) |<(5mm)
-COOH:='(//O,!,OH); % define COOH
-HOCO:='(OH,!,//O,); % define HOCO
+#(160mm,75mm) |<(4mm)
+COOH:=''(?O,!,OH); % define COOH
+HOCO:=''(OH,!,?O,); % define HOCO
S_CoA:=`("{S-CoA}"); % define S_CoA
-@(0.33, 1)\(<30,HOCO,!,//O,!2,COOH) % Oxaloacetate
-@(0.66, 1)\(<30,HOCO,!4,COOH,@-4`1,\,COOH,4:/OH^-165) % Citrate
-@(1, 1)\(<30,HOCO,!2,!~dr,!,COOH,@-4`1,\,COOH) % cis-Aconitate
-@(1, 0.58)\(<30,HOCO,!4,COOH,@-4,\`1,COOH,5:/OH) % Isocitrate
-@(1, 0.05)\(<30,HOCO,!3,//O,!,COOH,@-4,\`1,COOH) % Oxalosuccinate
-@(0.66,0.05)\(<30,HOCO,!3,//O,!,COOH) % alfa-Ketoglutarate
-@(0.33,0.05)\(<30,HOCO,!3,//O,!,S_CoA) % Succinyl-CoA
+@(0.33, 1)\(<30,HOCO,!,?O,!2,COOH) % Oxaloacetate
+@(0.66, 1)\(<30,HOCO,!4,COOH,@-4`1,!,COOH,4:/OH^-165) % Citrate
+@(1, 1)\(<30,HOCO,!2,!~dr,!,COOH,@-4`1,!,COOH) % cis-Aconitate
+@(1, 0.58)\(<30,HOCO,!4,COOH,@-4,!`1,COOH,5:/OH) % Isocitrate
+@(1, 0.05)\(<30,HOCO,!3,?O,!,COOH,@-4,!`1,COOH) % Oxalosuccinate
+@(0.66,0.05)\(<30,HOCO,!3,?O,!,COOH) % alfa-Ketoglutarate
+@(0.33,0.05)\(<30,HOCO,!3,?O,!,S_CoA) % Succinyl-CoA
@(0, 0.05)\(<30,HOCO,!3,COOH) % Succinate
@(0, 0.55)\(<30,HOCO,!,!~dr,!,COOH) % Fumarate
@(0, 1)\(<30,HOCO,!3,COOH,3:/OH) % L-Malate
@@ -3058,7 +3070,7 @@ ext(
ext_setup;
r_arrow(10mm)( 0)(p1+ ( 1.1w1, 0.3h1))("Acetyl-CoA",1.5)(" CoA-SH",1);
r_arrow(10mm)( 0)(p2+ ( 1.1w2, 0.4h2))("",0)("H2O",1);
- r_arrow( 8mm)(270)(p3+ ( 0.5w3,-0.4h3))("H2O",1)("",0);
+ r_arrow( 8mm)(270)(p3+ ( 0.5w3,-0.6h3))("H2O",1)("",0);
r_arrow( 8mm)(270)(p4+ ( 0.5w4,-0.4h4))("NAD+",1)("NADH2+",1);
r_arrow(10mm)(180)(p5+ (-0.1w5, 0.4h5))("",0)("CO_2_",1);
r_arrow(10mm)(180)(p6+ (-0.1w6, 0.5h6))("NAD+,CoA-SH",1.7)("NADH2+,CO2",1);
@@ -3085,7 +3097,6 @@ endfigm
%------------------------------------------------------------------------------
input mcf2graph; > input main macro
%------------------------------------------------------------------------------
-sw_output:=Info; % aux(information) file output on > global setting
%%%% sw_output:=Report; > report output
%%%% sw_output:=MOL2000; > MOL file output
#(60mm,40mm); % (figure width,figure height) >
@@ -3095,17 +3106,17 @@ outputtemplate:="c%3c-%{EN_}.png"; >
beginfigm
% EN:Ampicillin MW:349.405
\(<45,?4,-3=?5,2:N,7:S, > immediately compile
- 3^45:/*H,1://O^15,5:/*COOH^-18,6:??, >
- @4,*\^15,NH,!,//O,!,/*NH2,!,Ph) >
+ 3^45:/*H,1:?O^15,5:/*COOH^-18,6:??, >
+ @4,!w^15,NH,!,?O,!,/*NH2,!,Ph) >
endfigm >
%------------------------------------------------------------------------------
beginfigm
% EN:Cholesterol MW:386.65
- ''( > read Mcode
- "<30,?6,{-4,-2}=?6,-4=?5,7=dl, ", > mc1
+ '`( > read Mcode
+ "<30,?6,-4'-2=?6,-4=?5,7=dl, ", > mc1
"10:/*H^180,11:/*H^-60,17:/*H^-54, ", > mc2
- "{4,12}:*/_^60, ", > mc3
- "@-1,18,/*_,-60,!3,?! ") > mc4
+ "4'12:?w^60, ", > mc3
+ "@-1,18,?z,-60,!3,?! ") > mc4
\\ > put figure
endfigm >
%------------------------------------------------------------------------------
@@ -3150,7 +3161,7 @@ CAT:-;EN:-;MW:0;EXA:-
=
sw_frame:=Atom;
:
-<30,?6,3=?5,{1,3,5,9}=dl,{2,6,9}:N,5:/NH2,7:NH
+<30,?6,3=?5,1'3'5'9=dl,2'6'9:N,5:/NH2,7:NH
*
defaultscale:=.5;
label.bot(decimal(fig_num)&":"&EN,(.5w,0));
@@ -3163,27 +3174,27 @@ CAT:-;EN:-;MW:0;EXA:-
%==============================================================================
CAT:biological;EN:Adenine;MW:135.13;EXA:1
:
-<30,?6,3=?5,{1,3,5,9}=dl,{2,6,9}:N,5:/NH2,7:NH
+<30,?6,3=?5,1'3'5'9=dl,2'6'9:N,5:/NH2,7:NH
;
%------------------------------------------------------------------------------
CAT:biological;EN:Guanine;MW:151.13;EXA:1
:
-<30,?6,3=?5,{1,3,9}=dl,{2,9}:N,{6,7}:NH,5://O,1:/NH2
+<30,?6,3=?5,1'3'9=dl,2'9:N,6'7:NH,5:?O,1:/NH2
;
%------------------------------------------------------------------------------
CAT:biological;EN:Cytosine;MW:111.10;EXA:1
:
-<30,?6,{4,6}=dl,4:N,3://O,2:NH,5:/NH2
+<30,?6,4'6=dl,4:N,3:?O,2:NH,5:/NH2
;
%------------------------------------------------------------------------------
CAT:biological;EN:Thymine;MW:126.11;EXA:1
:
-<30,?6,3=dl,{2,6}:NH,{1,5}://O,4:/_
+<30,?6,3=dl,2'6:NH,1'5:?O,4:?
;
%------------------------------------------------------------------------------
CAT:biological;EN:Uracil;MW:112.09;EXA:1
:
-<30,?6,6=dl,{3,5}://O,{2,4}:NH
+<30,?6,6=dl,3'5:?O,2'4:NH
;
%== Amino acid ================================================================
CAT:biological;EN:Glycine;MW:75.07;EXA:-
@@ -3203,25 +3214,14 @@ sw_output:=Mcode; %% output 'temp-mc.aux'
\end{verbatim}
\paragraph{(Command line)}
\begin{verbatim}
- >mpost -s ahlength=3 FILENAME (sw_output=Info+Mcode)
+ >mpost -s ahlength=3 FILENAME (sw_output=Fig Expand mode)
\end{verbatim}
\paragraph{(Output mcf file)}
\begin{verbatim}
sw_output=Mcode %% file name = 'temp-mc.aux'
(result)
-<30,?6,3=?5,{1,3,5,9}=dl,{2,6,9}:N,5:/NH2,7:NH
-
-\end{verbatim}
-\paragraph{(Output library file)}
-\begin{verbatim}
-sw_output=Info+Mcode %% file name = 'jobname-lib.aux'
-
-(result)
-CAT:biological;EN:Adenine;MW:135.13;EXA:1
-:
-<30,?6,3=?5,{1,3,5,9}=dl,{2,6,9}:N,5:/NH2,7:NH
-;
+<30,?6,3=?5,1'3'5'9=dl,2'6'9:N,5:/NH2,7:NH
\end{verbatim}
%------------------------------------------------------------------------
@@ -3244,10 +3244,10 @@ CAT:biological;EN:Adenine;MW:135.13;EXA:1
(result)
file name = 'temp-mc.aux'
-<30,?6,@4,?6,@-4,\,!3,<-12,?5,@-3,<-12,?6,-3=?6,@-3,*\,!3,
- ?6,@-4,?6,@6,\,!,/*Me^-40,*/OH^20,!,//O,!1,OH,
- 3=wb,11=dl,15=dr,17=wf,19=wf,38=wb,{5,7,16,24,25,33,42}:O,
- 32:*/H^60,10:/Me,{12,31}:*/_,27://_,37:/*_,28:/OH,{3,29}:/*OH
+<30,?6,@4,?6,@-4,!,!3,<-12,?5,@-3,<-12,?6,-3=?6,@-3,!w,!3,
+ ?6,@-4,?6,@6,!,!,?z^-40,*/OH^20,!,?O,!1,OH,
+ 3=wb,11=dl,15=dr,17'19=wf,38=wb,5'7'16'24'25'33'42:O,
+ 32:*/H^60,10:?,12'31:?w,27:?d,37:?z,28:/OH,3'29:/*OH
\end{verbatim}
%------------------------------------------------------------------------
\newpage
@@ -3266,49 +3266,47 @@ file name = 'temp-mc.aux'
\paragraph{(Output)}
\begin{verbatim}
===========================================================================
- No[5],Name<Cytosine>,Category<biological>,File<main_lib.mcf>
+ No[148],Name<Phenol>,Category<synthetic>,File<main_lib.mcf>
+---------------------------------------------------------------------------
+ Row[1],Length[12],Block[3],BackboneA[6],BackboneB[6],Group[1]
---------------------------------------------------------------------------
-<30,?6,{4,6}=db,4:N,3://O,2:NH,5:/NH2
+<30,Ph,3:/OH
---------------------------------------------------------------------------
- Row[1],Length[37],Block[7],Code pair[59],Warning[0]
+[1 ] <30
+[2 ] Ph
+[3 ] 3:/OH
---------------------------------------------------------------------------
- =[1] :[4] ?[1] <[1]
---------------------------------------------------------------------------
- Width[30.92419],Height[42.36527], Shift x[-1.77635],Shift y[-12.9921]
+ Width[35.80607],Height[24.55503], Shift x[-1.77635],Shift y[-7.54719]
Bond length[11.33855],Atom size[4.881881]
---------------------------------------------------------------------------
- Atom[9],Bond[9],Ring[1],Hide H[2]
+ Atom[7],Bond[7],Ring[1],Hide H[5]
< NO. ><atom(s) >( x axis , y axis )<bond><hideH><chg>
A1 C ( 0 , 0 ) 3 1
- A2 N ( 1 , -1 ) 3
+ A2 C ( 1 , -1 ) 3 1
A3 C ( 2 , 0 ) 4
- A4 N ( 2 , 1 ) 3
- A5 C ( 1 , 1 ) 4
+ A4 C ( 2 , 1 ) 3 1
+ A5 C ( 1 , 1 ) 3 1
A6 C ( 0 , 1 ) 3 1
- A7 O ( 3 , 0 ) 2
- A8 H ( 1 , -1 ) 1
- A9 NH2 ( 1 , 2 ) 1
+ A7 OH ( 3 , 0 ) 1
---------------------------------------------------------------------------
< NO. >< bond (sdt)><angle +( +- )><length ( pt )>
- B1 1 -> 2 ( 1) 330 ( -30) 1 ( 11)
+ B1 1 -> 2 ( 2) 330 ( -30) 1 ( 11)
B2 2 -> 3 ( 1) 30 ( 30) 1 ( 11)
- B3 3 -> 4 ( 1) 90 ( 90) 1 ( 11)
- B4 4 -> 5 ( 2) 150 ( 150) 1 ( 11)
- B5 5 -> 6 ( 1) 210 ( -150) 1 ( 11)
- B6 6 -> 1 ( 2) 270 ( -90) 1 ( 11)
- B7 3 -> 7 ( 2) 330 ( -30)0.660000 ( 7)
- B8 2 -> 8 ( 1) 270 ( -90)0.359999 ( 4)
- B9 5 -> 9 ( 1) 90 ( 90)0.660000 ( 7)
+ B3 3 -> 4 ( 2) 90 ( 90) 1 ( 11)
+ B4 4 -> 5 ( 1) 150 ( 150) 1 ( 11)
+ B5 5 -> 6 ( 2) 210 ( -150) 1 ( 11)
+ B6 6 -> 1 ( 1) 270 ( -90) 1 ( 11)
+ B7 3 -> 7 ( 1) 330 ( -30)0.660000 ( 7)
---------------------------------------------------------------------------
<atom>( atom wt )[ mi wt ] < cnt > < sum wt >[ sum mi wt ]
- C ( 12.0107)[ 12] * 4 48.0428[ 48]
- H (1.0079400)[1.0078250] * 5 5.03969[5.0391251611]
- N ( 14.0067)[14.003074] * 3 42.0200[42.009222013]
+ C ( 12.0107)[ 12] * 6 72.0642[ 72]
+ H (1.0079400)[1.0078250] * 6 6.04764[6.0469501933]
O ( 15.9994)[15.994914] * 1 15.9994[15.994914619]
- Molecular Weight [Mono Isotopic] = 111.1019[ 111.043261]
+ Molecular Weight [Mono Isotopic] = 94.11123[ 94.0418648]
---------------------------------------------------------------------------
- Weight Calc: 111.1019 - Input: 111.10 = 0.0019999
- Fomula Calc: C4H5N3O
+ Weight Calc: 94.11123 - Input: 94.11 = 0.0012399
+ Fomula Calc: C6H6O
===========================================================================
\end{verbatim}
\newpage
@@ -3396,14 +3394,14 @@ M END
MW="470.51";
beginfigm
#(50mm,50mm)
- ''(
+ '`(
%---------------------------------------
- "<30,?6,{-3,-4}=?6, ",
- " -5=?3,-2=wf,-1=wb,6=?5,-4=?6,-5=wf, ",
- " {13,15,17,20}:O,{3,12,21}://O, ",
- " {4~wf^60,8~zf^60,18^35,18^-35}:/_, ",
- " {1^60,5^180,16^60}:/*H, ",
- " @14,\*,|,?5,{1,4}=dl,3:O ")
+ "<30,?6,-3'-4=?6, ",
+ " -5=?3,-2=wf,-1=wb,6=?5,-4=?6,-5=wf, ",
+ " 13'15'17'20:O,3'12'21:?O, ",
+ " {4~wf^60'8~zf^60'18^35'18^-35}:?, ",
+ " {1^60'5^180'16^60}:/*H, ",
+ " @14,!z,|,?5,1'4=dl,3:O ")
%---------------------------------------
\\
endfigm
@@ -3414,12 +3412,12 @@ M END
MW:="536.87";
beginfigm
#(80mm,50mm)
- ''(
+ '`(
%-----------------------------------------
- "<30,?6,3=dl,{3,5^35,5^-35}:/_, ",
- " @4,\,|,!18,{1,3,5,7,9,11,13,15,17}=dr,",
- " {3,7,12,16}:/_, ",
- " |,?6,6=dl,{6,2^35,2^-35}:/_ ")
+ "<30,?6,3=dl,{3'5^35'5^-35}:?, ",
+ " @4,!,|,!18,1'3'5'7'9'11'13'15'17=dr, ",
+ " 3'7'12'16:?, ",
+ " |,?6,6=dl,{6'2^35'2^-35}:? ")
%-----------------------------------------
\\
endfigm
diff --git a/graphics/mcf2graph/mcf_to_graph.cmd b/graphics/mcf2graph/mcf_to_graph.cmd
index a324f062dd..060a5a025c 100644
--- a/graphics/mcf2graph/mcf_to_graph.cmd
+++ b/graphics/mcf2graph/mcf_to_graph.cmd
@@ -1,27 +1,26 @@
-rem Batch file for compile MCF 2023.05.07
-rem rename filename by purpose
-rem <drag and drop library files on this batch>
-
-@echo off
-for %%f in (%*) do (
- mkdir %%~nf
- copy %%f temp.mcf
-
- rem *** mcf_to_svg create svg in ./filename (default)
- mpost -output-directory=./%%~nf template_soc.mp
-
- rem *** mcf_to_png create png in ./filename
- rem mpost -output-directory=./%%~nf -s ahangle=1 template_soc.mp
-
- rem *** mcf_to_mol2k create MOL(V2000) in ./filename
- rem mpost -output-directory=./%%~nf -s ahlength=5 template_soc.mp
-
- rem *** mcf_to_mol3k create MOL(V3000) in ./filename
- rem mpost -output-directory=./%%~nf -s ahlength=6 template_soc.mp
-
- rem *** mcf_to_report create report
- rem mpost -numbersystem=double -s ahlength=7 template_soc.mp
-
- del temp.mcf
- )
- \ No newline at end of file
+rem Batch file for compile MCF 2025.02.16
+rem rename filename by purpose
+rem <drag and drop library files on this batch>
+
+@echo off
+for %%f in (%*) do (
+ mkdir %%~nf
+ copy %%f temp.mcf
+
+ rem *** mcf_to_svg create svg in ./filename (default)
+ mpost -output-directory=./%%~nf ./template_soc.mp
+
+ rem *** mcf_to_png create png in ./filename
+ rem mpost -output-directory=./%%~nf -s ahangle=1 ./template_soc.mp
+
+ rem *** mcf_to_mol2k create MOL(V2000) in ./filename
+ rem mpost -output-directory=./%%~nf -s ahlength=5 ./template_soc.mp
+
+ rem *** mcf_to_mol3k create MOL(V3000) in ./filename
+ rem mpost -output-directory=./%%~nf -s ahlength=6 ./template_soc.mp
+
+ rem *** mcf_to_report create report
+ rem mpost -numbersystem=double -s ahlength=7 ./template_soc.mp
+
+ del temp.mcf
+ )
diff --git a/graphics/mcf2graph/template_lib.mcf b/graphics/mcf2graph/template_lib.mcf
index 6b2c965ace..e2f72eb3d0 100644
--- a/graphics/mcf2graph/template_lib.mcf
+++ b/graphics/mcf2graph/template_lib.mcf
@@ -1,7 +1,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% mcf template file mcf_template.mcf by Akira Yamaji 2024.01.25
+% mcf template file mcf_template.mcf by Akira Yamaji 2025.02.16
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% must use version 5.12
+% must use version 5.19
% tag1:var1;tag2:var2;tag3:var3 .....
% first character of line "%" comment out
% first character of line ":" start MCF
@@ -11,10 +11,9 @@
% first character of line ";" end of unit
% Cat = Category,EN = Name,MW = Molecular weight
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-Cat:biological;EN:Paclitaxel;MW:853.918;EXA:1
+Cat:biological;EN:Paclitaxel;MW:853.918;EXA:0
%-------------------------------------------------------------------
= %%%%%% start parameter setting %%%%%%
- sw_output:=Fig+Calc;
sw_frame:=Outside;
fsize:=(50mm,30mm);
fmargin:=(2mm,2mm);
@@ -22,9 +21,9 @@ Cat:biological;EN:Paclitaxel;MW:853.918;EXA:1
%-------------------------------------------------------------------
: %%%%%%% start MCF %%%%%%
?6,5=dl,@3,#1,36,45,45,45,45,##,&5,-4=?6,-4=?4,-1=wb,-3=wf,-1:O,
- 4:??,6:/_,{3^-60,15}:*/OH,8:/*H^-60,9:*/_^60,10://O,
- @1,\,O!,?O!,*/OH,!,/Ph,60~wf,NH,-60,//O,60,Ph,
- @7,\*,O,-45,//O,60,Ph,{11>rl,12'^-15>lr}:*/O!+?O!
+ 4:??,6:?,{3^-60'15}:*/OH,8:/*H^-60,9:?w^60,10://O,
+ @1,!,O!,?O!,*/OH,!,/Ph,60~wf,NH,-60,//O,60,Ph,
+ @7,!z,O,-45,//O,60,Ph,{11>rl'*12^-15>lr}:*/O!'?O!
%-------------------------------------------------------------------
* %%%%%% start ext(...) %%%%%%
defaultscale:=0.5;
@@ -34,22 +33,20 @@ Cat:biological;EN:Paclitaxel;MW:853.918;EXA:1
label.lrt("MW:"&MW,(0,h-3em));
; %% end of unit
%==============================================================================
-Cat:biological;EN:Erythromycin;MW:733.93
+Cat:biological;EN:Erythromycin;MW:733.93;EXA:0
%-------------------------------------------------------------------
= %%%%%% start parameter setting %%%%%%
- sw_output:=Fig+Calc;
sw_frame:=Outside;
fsize:=(50mm,30mm);
fmargin:=(2mm,2mm);
mposition:=(1,0);
%-------------------------------------------------------------------
: %%%%%%% start MCF %%%%%%
- <30,#1,<-120,60,60,60,-60,60,60,-60,60,60,60,-60,60,60,##,&1,
- 14:O,13:/*!,{1,9}://O,
- {2',4,6^-35,8,10',12^35}:/*_,
- {6^35,11,12^-35}:*/OH,
- @$3,\*,O,30~zb,|,?6`.7,6:O,#.5,{5~wf,3^35}:/_,4:/*OH,3^-35:/*O!,##,
- @$5,\*^30`1.7,O,!~zb,|,?6`.7,6:O,#.5,5:/*_,2:*/OH,3:/*N?!
+<30,#1,<-120,60,60,60,-60,60,60,-60,60,60,60,-60,60,60,##,&1,
+ 14:O,13:/*!,1'9:?O,{*2'4'6^-35'8'*10'12^35}:?z,
+ {6^35'11'12^-35}:*/OH,
+ @$3,!z,O,30~zb,|,?6`.7,6:O,#.5,{5~wf'3^35}:?,4:/*OH,3^-35:/*O!,##,
+ @$5,30~zf`1.7,O,!zb,|,?6`.7,6:O,#.5,5:?z,2:*/OH,3:/*N?!
%-------------------------------------------------------------------
* %%%%%% start ext(...) %%%%%%
defaultscale:=0.5;
@@ -59,7 +56,7 @@ Cat:biological;EN:Erythromycin;MW:733.93
label.lrt("MW:"&MW,(0,h-3em));
; %% end of unit
%==============================================================================
-EN:chain strech direction
+EN:chain strech direction;EXA:0
= %%%%%% start parameter setting %%%%%%
fsize:=(40mm,30mm);
fmargin:=(2mm,2mm);
@@ -67,7 +64,7 @@ EN:chain strech direction
ratio_chain_ring:=1;
%-------------------------------------------------------------------
: %%%%%%% start MCF %%%%%%
- ?4,{3^-90,3^-30,3^90}:/!3>hz,{1^-60,1,1^60}:/!3>vt
+ ?4,{3^-90'3^-30'3^90}:/!3>hz,{1^-60'1'1^60}:/!3>vt
%-------------------------------------------------------------------
+ %%%%%% start add(...) %%%%%%
defaultscale:=0.5;
diff --git a/graphics/mcf2graph/template_soc.mp b/graphics/mcf2graph/template_soc.mp
index 63243412a9..2bd5f18fa5 100644
--- a/graphics/mcf2graph/template_soc.mp
+++ b/graphics/mcf2graph/template_soc.mp
@@ -1,20 +1,17 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% MCF compile template file by Akira Yamaji 2024.01.25
+% MCF metapost souce template file by Akira Yamaji 2025.02.16
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-if unknown mcftograph: input mcf2graph; fi %%% it must be version 5.12
-message "* mcf_template 2024.01.25";
-message "";
-%------------------------------------------------------------------------------
-%%%%ext(defaultscale:=.3; label.rt(EN,(0,0));)
%------------------------------------------------------------------------------
-%%%%ext(defaultfont:=mpfont; defaultscale:=.3;
-%%%%label.rt(EN&" / "&mw&" / "&decimal(num_MW-scantokens(MW)),(0,0));)
+input mcf2graph; %%% it must be version 5.19
+message "* mcf_template 2025.02.16";
+message "";
%------------------------------------------------------------------------------
-sw_output:=Fig+Calc;
+fsize:=(30mm,20mm);
+max_blength:=4mm;
%------------------------------------------------------------------------------
-loadm("f:temp");
+default_library:="temp.mcf"; % default main_lib.mcf
+loadm("EXA=0"); % select EXA=0 (new mcf making lines)
%------------------------------------------------------------------------------
-for i=1 upto ucount: beginfigm $(i) \\ endfigm endfor
-%******************************************************************************
+for i=1 upto ucount: beginfigm $(i) \\ endfigm endfor
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bye
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/LICENSE b/graphics/metapost/contrib/macros/mp-geom2d/LICENSE
new file mode 100644
index 0000000000..130ede1e51
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/LICENSE
@@ -0,0 +1,11 @@
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status “maintainedâ€.
+
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/README.md b/graphics/metapost/contrib/macros/mp-geom2d/README.md
new file mode 100644
index 0000000000..60f6690be8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/README.md
@@ -0,0 +1,73 @@
+# MP-GEOM2D
+
+Flat geometry with MetaPost.
+
+
+![Geometry illustration](illustration.jpg)
+
+
+## Purpose
+
+mp-geom2d was written with the aim of providing MetaPost macros for creating
+a geometry figure that closely matches an imperative description:
+
+- Let A be the point with coordinates (2,3).
+- Let B be the point with coordinates (4,5).
+- Draw the line (A, B).
+- ...
+
+## Documentation
+
+The documentation, in French, is in the form of a PDF file:
+
+* [mp-geom2d-doc.pdf](doc/mp-geom2d-doc.pdf)
+
+## CTAN
+
+* https://ctan.org/pkg/mp-geom2d
+
+## Contact
+
+- Jean-Michel Sarlat, `jm.sarlat(at)gmail.com`
+- Maxime Chupin, `notezik(at)gmail.com`
+
+## License
+
+LATEX Project Public License 1.3c.
+
+# mp-geom2d (français)
+
+De la géométrie plane avec MetaPost.
+
+
+![Illustration de géométrie](illustration.jpg)
+
+
+## Objectif
+
+mp-geom2d a été écrit avec le but de proposer des macros MetaPost permettant de réaliser
+une figure de géométrie en collant d’assez près à une description impérative :
+
+- Soit A le point de coordonnées (2,3).
+- Soit B le point de coordonnées (4,5).
+- Trace la droite (A, B).
+- ...
+
+## Documentation
+
+La documentation, en français, est sous forme d’un fichier PDF :
+
+* [mp-geom2d-doc.pdf](doc/mp-geom2d-doc.pdf)
+
+## CTAN
+
+* https://ctan.org/pkg/mp-geom2d
+
+## Contact
+
+- Jean-Michel Sarlat, `jm.sarlat(at)gmail.com`
+- Maxime Chupin, `notezik(at)gmail.com`
+
+## Licence
+
+LATEX Project Public License 1.3c. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/K001-1.dat b/graphics/metapost/contrib/macros/mp-geom2d/doc/K001-1.dat
new file mode 100644
index 0000000000..82bb5f73b3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/K001-1.dat
@@ -0,0 +1,441 @@
+-9.50332 39.03779
+-8.90985 36.92109
+-8.35830 34.94184
+-7.84242 33.07748
+-7.35647 31.30663
+-6.89478 29.60762
+-6.45128 27.95615
+-6.01847 26.32078
+-5.58493 24.65153
+-5.12641 22.83954
+-4.53013 20.37356
+-4.21630 18.99730
+-3.82624 17.15868
+-3.60655 16.02255
+-3.48053 15.31960
+-3.39084 14.78786
+-3.32137 14.35307
+-3.26497 13.98196
+-3.21775 13.65636
+-3.17735 13.36511
+-3.14222 13.10083
+-3.11127 12.85833
+-3.08371 12.63385
+-3.05896 12.42451
+-3.03656 12.22812
+-3.01615 12.04292
+-2.99745 11.86749
+-2.98023 11.70069
+-2.96428 11.54154
+-2.94946 11.38925
+-2.93563 11.24313
+-2.92266 11.10259
+-2.91047 10.96713
+-2.89896 10.83630
+-2.88807 10.70973
+-2.87772 10.58707
+-2.86785 10.46803
+-2.85843 10.35233
+-2.84940 10.23975
+-2.84071 10.13006
+-2.83235 10.02307
+-2.82426 9.91862
+-2.81643 9.81654
+-2.80883 9.71668
+-2.80143 9.61893
+-2.79421 9.52315
+-2.78715 9.42923
+-2.78023 9.33709
+-2.77343 9.24662
+-2.76675 9.15773
+-2.76016 9.07035
+-2.75365 8.98441
+-2.74721 8.89983
+-2.74083 8.81655
+-2.73449 8.73451
+-2.72820 8.65365
+-2.72193 8.57393
+-2.71568 8.49529
+-2.70944 8.41770
+-2.70321 8.34109
+-2.69697 8.26545
+-2.69072 8.19072
+-2.68446 8.11687
+-2.67818 8.04387
+-2.67186 7.97168
+-2.66552 7.90029
+-2.65914 7.82964
+-2.65272 7.75973
+-2.64625 7.69053
+-2.63973 7.62200
+-2.63316 7.55413
+-2.62653 7.48689
+-2.61983 7.42027
+-2.61308 7.35425
+-2.60625 7.28880
+-2.59935 7.22390
+-2.59238 7.15955
+-2.58533 7.09572
+-2.57821 7.03240
+-2.57100 6.96957
+-2.56370 6.90722
+-2.55632 6.84533
+-2.54885 6.78390
+-2.54129 6.72290
+-2.53363 6.66233
+-2.52588 6.60218
+-2.51803 6.54243
+-2.51009 6.48308
+-2.50204 6.42410
+-2.49389 6.36550
+-2.48564 6.30727
+-2.47728 6.24939
+-2.46881 6.19185
+-2.46024 6.13466
+-2.45155 6.07779
+-2.44276 6.02124
+-2.43385 5.96501
+-2.42483 5.90908
+-2.41569 5.85345
+-2.40644 5.79812
+-2.39707 5.74307
+-2.38758 5.68830
+-2.37797 5.63381
+-2.36823 5.57958
+-2.35838 5.52561
+-2.34841 5.47190
+-2.33831 5.41844
+-2.32808 5.36523
+-2.31773 5.31226
+-2.30726 5.25952
+-2.29665 5.20701
+-2.28592 5.15473
+-2.27506 5.10268
+-2.26406 5.05084
+-2.25294 4.99921
+-2.24168 4.94779
+-2.23030 4.89658
+-2.21877 4.84557
+-2.20712 4.79475
+-2.19532 4.74413
+-2.18340 4.69370
+-2.17133 4.64346
+-2.15913 4.59340
+-2.14679 4.54352
+-2.13431 4.49382
+-2.12169 4.44430
+-2.10893 4.39494
+-2.09603 4.34575
+-2.08299 4.29673
+-2.06981 4.24786
+-2.05648 4.19916
+-2.04301 4.15062
+-2.02939 4.10223
+-2.01563 4.05398
+-2.00172 4.00589
+-1.98766 3.95795
+-1.97346 3.91015
+-1.95911 3.86249
+-1.94461 3.81497
+-1.92996 3.76758
+-1.91516 3.72033
+-1.90020 3.67322
+-1.88510 3.62623
+-1.86984 3.57937
+-1.85443 3.53263
+-1.83887 3.48602
+-1.82315 3.43954
+-1.80727 3.39317
+-1.79124 3.34691
+-1.77505 3.30078
+-1.75870 3.25475
+-1.74219 3.20884
+-1.72552 3.16304
+-1.70869 3.11735
+-1.69170 3.07176
+-1.67455 3.02627
+-1.65723 2.98089
+-1.63975 2.93560
+-1.62210 2.89042
+-1.60429 2.84533
+-1.58631 2.80033
+-1.56816 2.75543
+-1.54984 2.71061
+-1.53135 2.66589
+-1.51269 2.62125
+-1.49386 2.57670
+-1.47485 2.53222
+-1.45567 2.48783
+-1.43631 2.44352
+-1.41677 2.39929
+-1.39705 2.35513
+-1.37716 2.31104
+-1.35708 2.26703
+-1.33682 2.22308
+-1.31637 2.17920
+-1.29574 2.13538
+-1.27492 2.09163
+-1.25392 2.04794
+-1.23272 2.00430
+-1.21133 1.96072
+-1.18974 1.91720
+-1.16796 1.87372
+-1.14598 1.83030
+-1.12380 1.78692
+-1.10142 1.74359
+-1.07884 1.70029
+-1.05605 1.65704
+-1.03305 1.61382
+-1.00984 1.57063
+-0.98641 1.52748
+-0.96277 1.48435
+-0.93892 1.44125
+-0.91484 1.39816
+-0.89054 1.35510
+-0.86601 1.31205
+-0.84125 1.26901
+-0.81625 1.22598
+-0.79102 1.18295
+-0.76556 1.13992
+-0.73984 1.09688
+-0.71388 1.05384
+-0.68767 1.01078
+-0.66120 0.96771
+-0.63447 0.92461
+-0.60747 0.88149
+-0.58020 0.83833
+-0.55266 0.79513
+-0.52484 0.75189
+-0.49673 0.70859
+-0.46833 0.66524
+-0.43962 0.62183
+-0.41062 0.57834
+-0.38130 0.53477
+-0.35165 0.49112
+-0.32168 0.44737
+-0.29137 0.40351
+-0.26072 0.35954
+-0.22971 0.31545
+-0.19833 0.27122
+-0.16657 0.22684
+-0.13443 0.18230
+-0.10188 0.13758
+-0.06892 0.09268
+-0.03553 0.04758
+-0.00169 0.00225
+0.03262 -0.04332
+0.06740 -0.08914
+0.10268 -0.13524
+0.13849 -0.18165
+0.17485 -0.22838
+0.21178 -0.27548
+0.24930 -0.32295
+0.28747 -0.37085
+0.32629 -0.41921
+0.36583 -0.46806
+0.40611 -0.51747
+0.44718 -0.56746
+0.48910 -0.61812
+0.53194 -0.66949
+0.57575 -0.72166
+0.62061 -0.77472
+0.66663 -0.82875
+0.71390 -0.88389
+0.76254 -0.94027
+0.81271 -0.99805
+0.86459 -1.05742
+0.91838 -1.11864
+0.97436 -1.18200
+1.03287 -1.24788
+1.09435 -1.31679
+1.15939 -1.38939
+1.22880 -1.46660
+1.30380 -1.54981
+1.38626 -1.64115
+1.47945 -1.74439
+1.59010 -1.86727
+1.73787 -2.03254
+2.00722 -2.34049
+2.21922 -2.59293
+2.36996 -2.78029
+2.47176 -2.91150
+2.55344 -3.01993
+2.62335 -3.11523
+2.68533 -3.20180
+2.74151 -3.28210
+2.79322 -3.35762
+2.84135 -3.42941
+2.88655 -3.49818
+2.92929 -3.56448
+2.96993 -3.62870
+3.00876 -3.69119
+3.04601 -3.75218
+3.08186 -3.81190
+3.11648 -3.87052
+3.14999 -3.92820
+3.18250 -3.98504
+3.21411 -4.04117
+3.24490 -4.09668
+3.27495 -4.15165
+3.30431 -4.20615
+3.33306 -4.26025
+3.36122 -4.31400
+3.38887 -4.36747
+3.41602 -4.42069
+3.44272 -4.47371
+3.46901 -4.52658
+3.49491 -4.57931
+3.52046 -4.63197
+3.54567 -4.68456
+3.57058 -4.73713
+3.59521 -4.78969
+3.61956 -4.84229
+3.64368 -4.89493
+3.66757 -4.94765
+3.69125 -5.00047
+3.71473 -5.05340
+3.73804 -5.10648
+3.76118 -5.15971
+3.78417 -5.21312
+3.80702 -5.26673
+3.82975 -5.32056
+3.85236 -5.37461
+3.87487 -5.42891
+3.89729 -5.48348
+3.91963 -5.53833
+3.94189 -5.59348
+3.96409 -5.64894
+3.98624 -5.70473
+4.00834 -5.76087
+4.03041 -5.81737
+4.05245 -5.87424
+4.07447 -5.93150
+4.09647 -5.98917
+4.11848 -6.04727
+4.14049 -6.10579
+4.16251 -6.16477
+4.18455 -6.22422
+4.20662 -6.28415
+4.22872 -6.34458
+4.25086 -6.40553
+4.27305 -6.46700
+4.29529 -6.52902
+4.31760 -6.59160
+4.33997 -6.65476
+4.36242 -6.71851
+4.38496 -6.78287
+4.40758 -6.84787
+4.43030 -6.91351
+4.45312 -6.97981
+4.47605 -7.04680
+4.49910 -7.11448
+4.52227 -7.18289
+4.54558 -7.25203
+4.56902 -7.32193
+4.59261 -7.39261
+4.61635 -7.46409
+4.64025 -7.53638
+4.66431 -7.60951
+4.68856 -7.68351
+4.71298 -7.75839
+4.73759 -7.83418
+4.76241 -7.91090
+4.78742 -7.98857
+4.81266 -8.06722
+4.83811 -8.14688
+4.86380 -8.22757
+4.88972 -8.30932
+4.91590 -8.39215
+4.94233 -8.47610
+4.96903 -8.56119
+4.99601 -8.64746
+5.02327 -8.73493
+5.05083 -8.82364
+5.07869 -8.91362
+5.10687 -9.00491
+5.13538 -9.09753
+5.16423 -9.19153
+5.19343 -9.28695
+5.22300 -9.38382
+5.25294 -9.48219
+5.28326 -9.58209
+5.31399 -9.68357
+5.34513 -9.78667
+5.37669 -9.89145
+5.40870 -9.99794
+5.44117 -10.10619
+5.47410 -10.21627
+5.50753 -10.32822
+5.54146 -10.44209
+5.57591 -10.55795
+5.61090 -10.67586
+5.64645 -10.79587
+5.68257 -10.91805
+5.71929 -11.04247
+5.75663 -11.16920
+5.79460 -11.29831
+5.83324 -11.42988
+5.87255 -11.56398
+5.91258 -11.70070
+5.95333 -11.84013
+5.99485 -11.98234
+6.03715 -12.12745
+6.08027 -12.27554
+6.12422 -12.42671
+6.16906 -12.58108
+6.21480 -12.73875
+6.26148 -12.89984
+6.30914 -13.06448
+6.35782 -13.23279
+6.40754 -13.40490
+6.45836 -13.58097
+6.51032 -13.76112
+6.56346 -13.94553
+6.61783 -14.13435
+6.67349 -14.32776
+6.73047 -14.52594
+6.78884 -14.72907
+6.84866 -14.93737
+6.90998 -15.15103
+6.97288 -15.37029
+7.03742 -15.59538
+7.10367 -15.82656
+7.17172 -16.06408
+7.24163 -16.30823
+7.31351 -16.55930
+7.38743 -16.81761
+7.46350 -17.08349
+7.54182 -17.35731
+7.62250 -17.63943
+7.70566 -17.93027
+7.79142 -18.23024
+7.87991 -18.53982
+7.97129 -18.85948
+8.06569 -19.18976
+8.16328 -19.53122
+8.26424 -19.88445
+8.36875 -20.25011
+8.47703 -20.62888
+8.58927 -21.02152
+8.70572 -21.42883
+8.82664 -21.85169
+8.95229 -22.29102
+9.08296 -22.74786
+9.21899 -23.22330
+9.36072 -23.71854
+9.50853 -24.23490
+9.66284 -24.77379
+9.82409 -25.33678
+9.99278 -25.92556
+10.16946 -26.54200
+10.35472 -27.18816
+10.54923 -27.86631
+10.75371 -28.57894
+10.96897 -29.32883
+11.19590 -30.11906
+11.43550 -30.95305
+11.68889 -31.83463
+11.95732 -32.76810
+12.24220 -33.75829
+12.54510 -34.81064
+12.86784 -35.93132
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/K001-2.dat b/graphics/metapost/contrib/macros/mp-geom2d/doc/K001-2.dat
new file mode 100644
index 0000000000..a9fb9ed80b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/K001-2.dat
@@ -0,0 +1,1208 @@
+6.76428 -0.94750
+6.97936 -0.97051
+7.14459 -0.97893
+7.26220 -0.98025
+7.36013 -0.97848
+7.44648 -0.97481
+7.52497 -0.96978
+7.59767 -0.96371
+7.66587 -0.95678
+7.73043 -0.94915
+7.79199 -0.94089
+7.85100 -0.93209
+7.90781 -0.92280
+7.96270 -0.91306
+8.01589 -0.90292
+8.06755 -0.89241
+8.11785 -0.88154
+8.16690 -0.87034
+8.21481 -0.85884
+8.26168 -0.84704
+8.30759 -0.83496
+8.35260 -0.82261
+8.39677 -0.81001
+8.44016 -0.79716
+8.48281 -0.78407
+8.52478 -0.77076
+8.56609 -0.75723
+8.60678 -0.74348
+8.64688 -0.72952
+8.68642 -0.71537
+8.72543 -0.70101
+8.76393 -0.68647
+8.80194 -0.67173
+8.83948 -0.65682
+8.87657 -0.64173
+8.91323 -0.62646
+8.94946 -0.61102
+8.98529 -0.59542
+9.02073 -0.57965
+9.05580 -0.56372
+9.09049 -0.54763
+9.12483 -0.53138
+9.15883 -0.51498
+9.19249 -0.49844
+9.22582 -0.48174
+9.25883 -0.46490
+9.29154 -0.44791
+9.32394 -0.43078
+9.35604 -0.41352
+9.38785 -0.39611
+9.41938 -0.37857
+9.45064 -0.36090
+9.48162 -0.34309
+9.51233 -0.32515
+9.54278 -0.30709
+9.57298 -0.28889
+9.60292 -0.27058
+9.63262 -0.25213
+9.66207 -0.23357
+9.69128 -0.21488
+9.72026 -0.19607
+9.74900 -0.17715
+9.77752 -0.15811
+9.80581 -0.13895
+9.83387 -0.11967
+9.86172 -0.10029
+9.88935 -0.08079
+9.91676 -0.06118
+9.94397 -0.04146
+9.97096 -0.02163
+9.99775 -0.00169
+10.02433 0.01835
+10.05071 0.03850
+10.07689 0.05876
+10.10287 0.07912
+10.12865 0.09958
+10.15424 0.12014
+10.17964 0.14080
+10.20484 0.16157
+10.22986 0.18243
+10.25469 0.20339
+10.27933 0.22444
+10.30379 0.24560
+10.32806 0.26684
+10.35215 0.28819
+10.37607 0.30962
+10.39980 0.33115
+10.42335 0.35277
+10.44673 0.37448
+10.46993 0.39628
+10.49295 0.41817
+10.51580 0.44014
+10.53848 0.46221
+10.56098 0.48436
+10.58332 0.50660
+10.60548 0.52892
+10.62748 0.55133
+10.64931 0.57382
+10.67097 0.59639
+10.69246 0.61905
+10.71379 0.64178
+10.73495 0.66460
+10.75594 0.68750
+10.77678 0.71047
+10.79745 0.73353
+10.81796 0.75666
+10.83830 0.77987
+10.85849 0.80315
+10.87851 0.82651
+10.89837 0.84995
+10.91808 0.87346
+10.93762 0.89704
+10.95701 0.92069
+10.97624 0.94442
+10.99531 0.96822
+11.01422 0.99209
+11.03298 1.01603
+11.05158 1.04003
+11.07002 1.06411
+11.08831 1.08825
+11.10644 1.11247
+11.12442 1.13674
+11.14225 1.16109
+11.15992 1.18549
+11.17744 1.20997
+11.19480 1.23450
+11.21201 1.25910
+11.22907 1.28377
+11.24598 1.30849
+11.26274 1.33328
+11.27934 1.35812
+11.29579 1.38303
+11.31209 1.40799
+11.32824 1.43302
+11.34424 1.45810
+11.36009 1.48324
+11.37579 1.50843
+11.39134 1.53368
+11.40674 1.55899
+11.42199 1.58435
+11.43709 1.60977
+11.45204 1.63523
+11.46685 1.66076
+11.48150 1.68633
+11.49601 1.71196
+11.51037 1.73763
+11.52458 1.76336
+11.53864 1.78914
+11.55256 1.81496
+11.56633 1.84084
+11.57995 1.86676
+11.59342 1.89273
+11.60675 1.91874
+11.61993 1.94480
+11.63296 1.97091
+11.64585 1.99706
+11.65859 2.02326
+11.67118 2.04950
+11.68363 2.07578
+11.69593 2.10211
+11.70809 2.12847
+11.72010 2.15488
+11.73196 2.18133
+11.74368 2.20781
+11.75526 2.23434
+11.76669 2.26091
+11.77797 2.28751
+11.78911 2.31415
+11.80010 2.34083
+11.81095 2.36754
+11.82166 2.39429
+11.83222 2.42107
+11.84263 2.44789
+11.85290 2.47474
+11.86303 2.50163
+11.87301 2.52855
+11.88285 2.55550
+11.89255 2.58248
+11.90210 2.60949
+11.91151 2.63653
+11.92077 2.66360
+11.92989 2.69070
+11.93887 2.71783
+11.94770 2.74499
+11.95639 2.77217
+11.96494 2.79938
+11.97334 2.82661
+11.98160 2.85387
+11.98972 2.88116
+11.99769 2.90847
+12.00552 2.93580
+12.01321 2.96316
+12.02076 2.99054
+12.02816 3.01794
+12.03542 3.04536
+12.04254 3.07280
+12.04952 3.10026
+12.05635 3.12774
+12.06304 3.15524
+12.06959 3.18276
+12.07600 3.21029
+12.08226 3.23784
+12.08839 3.26541
+12.09437 3.29299
+12.10021 3.32059
+12.10590 3.34821
+12.11146 3.37583
+12.11688 3.40347
+12.12215 3.43113
+12.12728 3.45879
+12.13227 3.48647
+12.13712 3.51416
+12.14183 3.54185
+12.14640 3.56956
+12.15082 3.59728
+12.15511 3.62500
+12.15925 3.65274
+12.16326 3.68048
+12.16712 3.70822
+12.17084 3.73598
+12.17442 3.76374
+12.17786 3.79150
+12.18117 3.81927
+12.18433 3.84704
+12.18735 3.87482
+12.19023 3.90259
+12.19297 3.93037
+12.19557 3.95816
+12.19803 3.98594
+12.20035 4.01372
+12.20253 4.04150
+12.20457 4.06928
+12.20648 4.09706
+12.20824 4.12484
+12.20986 4.15261
+12.21135 4.18038
+12.21269 4.20815
+12.21390 4.23591
+12.21496 4.26367
+12.21589 4.29142
+12.21668 4.31917
+12.21733 4.34691
+12.21785 4.37464
+12.21822 4.40236
+12.21845 4.43007
+12.21855 4.45778
+12.21851 4.48547
+12.21833 4.51316
+12.21801 4.54083
+12.21756 4.56849
+12.21697 4.59614
+12.21624 4.62378
+12.21537 4.65140
+12.21436 4.67901
+12.21322 4.70661
+12.21194 4.73419
+12.21052 4.76175
+12.20897 4.78930
+12.20728 4.81683
+12.20545 4.84434
+12.20349 4.87184
+12.20139 4.89931
+12.19915 4.92677
+12.19677 4.95421
+12.19426 4.98162
+12.19162 5.00902
+12.18884 5.03639
+12.18592 5.06374
+12.18287 5.09107
+12.17968 5.11837
+12.17635 5.14565
+12.17289 5.17291
+12.16930 5.20014
+12.16557 5.22735
+12.16170 5.25452
+12.15771 5.28168
+12.15357 5.30880
+12.14930 5.33590
+12.14490 5.36296
+12.14036 5.39000
+12.13569 5.41701
+12.13089 5.44398
+12.12595 5.47093
+12.12087 5.49784
+12.11567 5.52473
+12.11033 5.55157
+12.10486 5.57839
+12.09925 5.60517
+12.09351 5.63192
+12.08764 5.65863
+12.08164 5.68530
+12.07550 5.71194
+12.06923 5.73855
+12.06283 5.76511
+12.05630 5.79164
+12.04963 5.81812
+12.04283 5.84457
+12.03591 5.87098
+12.02885 5.89735
+12.02166 5.92367
+12.01433 5.94996
+12.00688 5.97620
+11.99930 6.00240
+11.99159 6.02856
+11.98374 6.05467
+11.97577 6.08074
+11.96766 6.10676
+11.95943 6.13273
+11.95107 6.15866
+11.94257 6.18455
+11.93395 6.21038
+11.92520 6.23617
+11.91632 6.26191
+11.90731 6.28760
+11.89817 6.31323
+11.88891 6.33882
+11.87951 6.36436
+11.86999 6.38984
+11.86034 6.41528
+11.85057 6.44066
+11.84066 6.46599
+11.83063 6.49126
+11.82047 6.51648
+11.81019 6.54164
+11.79977 6.56675
+11.78923 6.59180
+11.77857 6.61679
+11.76778 6.64173
+11.75686 6.66660
+11.74582 6.69142
+11.73465 6.71618
+11.72336 6.74088
+11.71194 6.76552
+11.70040 6.79010
+11.68873 6.81462
+11.67694 6.83907
+11.66503 6.86346
+11.65299 6.88779
+11.64083 6.91205
+11.62854 6.93625
+11.61613 6.96038
+11.60360 6.98445
+11.59094 7.00845
+11.57816 7.03239
+11.56526 7.05626
+11.55224 7.08005
+11.53910 7.10378
+11.52583 7.12744
+11.51244 7.15104
+11.49894 7.17456
+11.48531 7.19800
+11.47156 7.22138
+11.45769 7.24469
+11.44370 7.26792
+11.42958 7.29108
+11.41535 7.31416
+11.40100 7.33717
+11.38653 7.36011
+11.37195 7.38296
+11.35724 7.40575
+11.34241 7.42845
+11.32747 7.45108
+11.31241 7.47363
+11.29723 7.49610
+11.28193 7.51849
+11.26651 7.54080
+11.25098 7.56303
+11.23533 7.58518
+11.21957 7.60725
+11.20369 7.62923
+11.18769 7.65113
+11.17157 7.67295
+11.15534 7.69469
+11.13900 7.71633
+11.12254 7.73790
+11.10597 7.75938
+11.08928 7.78077
+11.07247 7.80207
+11.05556 7.82329
+11.03853 7.84441
+11.02138 7.86545
+11.00412 7.88640
+10.98675 7.90726
+10.96927 7.92803
+10.95168 7.94870
+10.93397 7.96929
+10.91615 7.98978
+10.89822 8.01018
+10.88018 8.03048
+10.86202 8.05069
+10.84376 8.07081
+10.82538 8.09082
+10.80690 8.11075
+10.78831 8.13057
+10.76960 8.15030
+10.75079 8.16993
+10.73186 8.18946
+10.71283 8.20889
+10.69369 8.22822
+10.67444 8.24745
+10.65509 8.26658
+10.63562 8.28561
+10.61605 8.30453
+10.59637 8.32335
+10.57659 8.34207
+10.55670 8.36068
+10.53670 8.37919
+10.51659 8.39759
+10.49638 8.41589
+10.47607 8.43408
+10.45565 8.45216
+10.43512 8.47013
+10.41449 8.48799
+10.39376 8.50575
+10.37292 8.52339
+10.35198 8.54092
+10.33093 8.55834
+10.30979 8.57565
+10.28853 8.59285
+10.26718 8.60993
+10.24572 8.62689
+10.22417 8.64375
+10.20251 8.66048
+10.18074 8.67710
+10.15888 8.69361
+10.13692 8.70999
+10.11485 8.72626
+10.09269 8.74241
+10.07043 8.75844
+10.04806 8.77435
+10.02560 8.79013
+10.00304 8.80580
+9.98038 8.82134
+9.95762 8.83676
+9.93476 8.85206
+9.91180 8.86723
+9.88875 8.88227
+9.86560 8.89719
+9.84235 8.91199
+9.81900 8.92665
+9.79556 8.94119
+9.77202 8.95560
+9.74839 8.96988
+9.72466 8.98402
+9.70083 8.99804
+9.67691 9.01192
+9.65290 9.02568
+9.62879 9.03929
+9.60458 9.05278
+9.58028 9.06613
+9.55589 9.07934
+9.53141 9.09241
+9.50683 9.10535
+9.48215 9.11815
+9.45739 9.13081
+9.43253 9.14333
+9.40758 9.15571
+9.38254 9.16795
+9.35741 9.18005
+9.33218 9.19200
+9.30686 9.20381
+9.28146 9.21547
+9.25596 9.22699
+9.23037 9.23836
+9.20469 9.24959
+9.17892 9.26066
+9.15306 9.27159
+9.12712 9.28236
+9.10108 9.29299
+9.07495 9.30346
+9.04874 9.31378
+9.02243 9.32394
+8.99604 9.33395
+8.96956 9.34380
+8.94299 9.35350
+8.91633 9.36304
+8.88959 9.37242
+8.86276 9.38164
+8.83584 9.39069
+8.80883 9.39959
+8.78174 9.40832
+8.75456 9.41689
+8.72729 9.42529
+8.69994 9.43353
+8.67250 9.44160
+8.64498 9.44950
+8.61737 9.45723
+8.58967 9.46478
+8.56189 9.47217
+8.53402 9.47938
+8.50607 9.48642
+8.47803 9.49328
+8.44991 9.49997
+8.42170 9.50647
+8.39341 9.51280
+8.36503 9.51894
+8.33657 9.52490
+8.30802 9.53068
+8.27939 9.53627
+8.25067 9.54168
+8.22187 9.54690
+8.19298 9.55192
+8.16401 9.55676
+8.13496 9.56140
+8.10582 9.56585
+8.07659 9.57010
+8.04728 9.57416
+8.01789 9.57801
+7.98841 9.58167
+7.95884 9.58512
+7.92920 9.58836
+7.89946 9.59140
+7.86964 9.59423
+7.83974 9.59686
+7.80975 9.59926
+7.77967 9.60146
+7.74951 9.60344
+7.71926 9.60520
+7.68892 9.60674
+7.65850 9.60805
+7.62799 9.60914
+7.59740 9.61001
+7.56671 9.61064
+7.53594 9.61104
+7.50508 9.61121
+7.47413 9.61114
+7.44309 9.61083
+7.41196 9.61027
+7.38074 9.60947
+7.34943 9.60843
+7.31802 9.60713
+7.28653 9.60557
+7.25494 9.60376
+7.22326 9.60169
+7.19148 9.59935
+7.15960 9.59674
+7.12763 9.59386
+7.09557 9.59071
+7.06340 9.58728
+7.03113 9.58356
+6.99877 9.57955
+6.96630 9.57526
+6.93373 9.57066
+6.90105 9.56577
+6.86827 9.56057
+6.83538 9.55506
+6.80238 9.54923
+6.76926 9.54308
+6.73604 9.53660
+6.70270 9.52979
+6.66924 9.52264
+6.63567 9.51514
+6.60197 9.50729
+6.56815 9.49908
+6.53420 9.49050
+6.50012 9.48155
+6.46591 9.47221
+6.43156 9.46248
+6.39708 9.45235
+6.36244 9.44181
+6.32767 9.43084
+6.29274 9.41944
+6.25765 9.40761
+6.22240 9.39531
+6.18699 9.38255
+6.15141 9.36931
+6.11565 9.35557
+6.07970 9.34132
+6.04356 9.32654
+6.00722 9.31122
+5.97068 9.29533
+5.93392 9.27886
+5.89694 9.26179
+5.85972 9.24408
+5.82225 9.22573
+5.78452 9.20669
+5.74652 9.18694
+5.70822 9.16645
+5.66963 9.14518
+5.63071 9.12309
+5.59144 9.10015
+5.55181 9.07629
+5.51178 9.05147
+5.47133 9.02564
+5.43043 8.99871
+5.38904 8.97063
+5.34711 8.94130
+5.30460 8.91063
+5.26145 8.87850
+5.21760 8.84478
+5.17296 8.80932
+5.12744 8.77194
+5.08093 8.73241
+5.03329 8.69047
+4.98434 8.64578
+4.93386 8.59790
+4.88154 8.54628
+4.82698 8.49015
+4.76961 8.42843
+4.70857 8.35952
+4.64243 8.28078
+4.56857 8.18739
+4.48095 8.06825
+4.35469 7.87798
+4.24481 7.69069
+4.12202 7.45061
+4.04236 7.27224
+3.99228 7.14844
+3.95432 7.04733
+3.92342 6.95961
+3.89728 6.88103
+3.87460 6.80919
+3.85459 6.74262
+3.83671 6.68030
+3.82057 6.62151
+3.80591 6.56571
+3.79249 6.51251
+3.78015 6.46157
+3.76875 6.41263
+3.75819 6.36548
+3.74837 6.31994
+3.73922 6.27587
+3.73067 6.23313
+3.72266 6.19162
+3.71515 6.15124
+3.70810 6.11191
+3.70147 6.07355
+3.69522 6.03610
+3.68933 5.99951
+3.68378 5.96371
+3.67854 5.92867
+3.67358 5.89433
+3.66890 5.86067
+3.66447 5.82765
+3.66027 5.79523
+3.65631 5.76339
+3.65255 5.73209
+3.64900 5.70132
+3.64563 5.67105
+3.64245 5.64126
+3.63943 5.61193
+3.63658 5.58304
+3.63388 5.55458
+3.63133 5.52652
+3.62892 5.49885
+3.62664 5.47157
+3.62449 5.44464
+3.62246 5.41807
+3.62055 5.39184
+3.61875 5.36594
+3.61705 5.34036
+3.61546 5.31508
+3.61397 5.29011
+3.61257 5.26542
+3.61127 5.24101
+3.61005 5.21688
+3.60891 5.19302
+3.60786 5.16941
+3.60688 5.14605
+3.60598 5.12293
+3.60516 5.10006
+3.60440 5.07741
+3.60371 5.05499
+3.60309 5.03279
+3.60253 5.01081
+3.60203 4.98903
+3.60159 4.96746
+3.60121 4.94609
+3.60088 4.92491
+3.60061 4.90392
+3.60039 4.88312
+3.60022 4.86250
+3.60010 4.84206
+3.60003 4.82179
+3.60000 4.80169
+3.60002 4.78176
+3.60008 4.76199
+3.60019 4.74238
+3.60033 4.72293
+3.60052 4.70363
+3.60074 4.68449
+3.60100 4.66549
+3.60130 4.64663
+3.60164 4.62792
+3.60201 4.60934
+3.60241 4.59091
+3.60285 4.57260
+3.60332 4.55443
+3.60382 4.53639
+3.60435 4.51848
+3.60492 4.50069
+3.60551 4.48302
+3.60613 4.46547
+3.60677 4.44805
+3.60745 4.43074
+3.60815 4.41354
+3.60888 4.39646
+3.60963 4.37948
+3.61041 4.36262
+3.61121 4.34586
+3.61203 4.32921
+3.61288 4.31266
+3.61375 4.29622
+3.61464 4.27987
+3.61556 4.26363
+3.61649 4.24748
+3.61745 4.23143
+3.61843 4.21547
+3.61942 4.19961
+3.62044 4.18384
+3.62147 4.16816
+3.62253 4.15256
+3.62360 4.13706
+3.62469 4.12164
+3.62579 4.10631
+3.62692 4.09106
+3.62806 4.07590
+3.62922 4.06082
+3.63039 4.04582
+3.63158 4.03089
+3.63278 4.01605
+3.63400 4.00129
+3.63524 3.98660
+3.63649 3.97198
+3.63775 3.95744
+3.63903 3.94298
+3.64033 3.92858
+3.64163 3.91426
+3.64295 3.90001
+3.64429 3.88583
+3.64563 3.87172
+3.64699 3.85767
+3.64836 3.84370
+3.64975 3.82979
+3.65115 3.81594
+3.65255 3.80216
+3.65397 3.78844
+3.65541 3.77479
+3.65685 3.76120
+3.65830 3.74767
+3.65977 3.73420
+3.66125 3.72079
+3.66273 3.70744
+3.66423 3.69415
+3.66574 3.68092
+3.66726 3.66774
+3.66879 3.65463
+3.67033 3.64156
+3.67188 3.62856
+3.67343 3.61560
+3.67500 3.60270
+3.67658 3.58986
+3.67817 3.57707
+3.67976 3.56433
+3.68137 3.55164
+3.68298 3.53900
+3.68461 3.52641
+3.68624 3.51388
+3.68788 3.50139
+3.68953 3.48895
+3.69118 3.47656
+3.69285 3.46422
+3.69452 3.45192
+3.69620 3.43967
+3.69789 3.42747
+3.69959 3.41532
+3.70130 3.40320
+3.70301 3.39114
+3.70473 3.37912
+3.70646 3.36714
+3.70820 3.35520
+3.70994 3.34331
+3.71169 3.33146
+3.71345 3.31965
+3.71522 3.30789
+3.71699 3.29616
+3.71877 3.28448
+3.72056 3.27283
+3.72235 3.26123
+3.72415 3.24966
+3.72596 3.23814
+3.72778 3.22665
+3.72960 3.21520
+3.73142 3.20379
+3.73326 3.19242
+3.73510 3.18108
+3.73695 3.16978
+3.73880 3.15852
+3.74066 3.14729
+3.74253 3.13610
+3.74440 3.12494
+3.74628 3.11382
+3.74817 3.10274
+3.75006 3.09168
+3.75196 3.08067
+3.75386 3.06968
+3.75577 3.05873
+3.75769 3.04781
+3.75961 3.03692
+3.76154 3.02607
+3.76347 3.01525
+3.76541 3.00446
+3.76736 2.99370
+3.76931 2.98297
+3.77127 2.97227
+3.77323 2.96160
+3.77520 2.95097
+3.77718 2.94036
+3.77916 2.92978
+3.78115 2.91923
+3.78314 2.90871
+3.78514 2.89822
+3.78714 2.88776
+3.78915 2.87733
+3.79116 2.86692
+3.79318 2.85654
+3.79521 2.84619
+3.79724 2.83586
+3.79928 2.82557
+3.80132 2.81529
+3.80337 2.80505
+3.80542 2.79483
+3.80748 2.78464
+3.80954 2.77447
+3.81161 2.76433
+3.81369 2.75421
+3.81577 2.74412
+3.81786 2.73405
+3.81995 2.72401
+3.82204 2.71399
+3.82415 2.70399
+3.82625 2.69402
+3.82837 2.68407
+3.83049 2.67414
+3.83261 2.66424
+3.83474 2.65436
+3.83687 2.64451
+3.83901 2.63467
+3.84116 2.62486
+3.84331 2.61507
+3.84547 2.60530
+3.84763 2.59555
+3.84979 2.58582
+3.85197 2.57612
+3.85414 2.56643
+3.85633 2.55677
+3.85852 2.54713
+3.86071 2.53750
+3.86291 2.52790
+3.86511 2.51832
+3.86732 2.50875
+3.86954 2.49921
+3.87176 2.48968
+3.87399 2.48018
+3.87622 2.47069
+3.87846 2.46122
+3.88070 2.45177
+3.88295 2.44234
+3.88520 2.43293
+3.88746 2.42353
+3.88973 2.41415
+3.89200 2.40479
+3.89427 2.39545
+3.89656 2.38613
+3.89884 2.37682
+3.90114 2.36753
+3.90343 2.35825
+3.90574 2.34900
+3.90805 2.33975
+3.91036 2.33053
+3.91268 2.32132
+3.91501 2.31213
+3.91734 2.30295
+3.91968 2.29379
+3.92203 2.28464
+3.92438 2.27551
+3.92673 2.26640
+3.92909 2.25729
+3.93146 2.24821
+3.93383 2.23914
+3.93621 2.23008
+3.93860 2.22104
+3.94099 2.21201
+3.94339 2.20299
+3.94579 2.19399
+3.94820 2.18501
+3.95061 2.17603
+3.95303 2.16707
+3.95546 2.15813
+3.95790 2.14919
+3.96033 2.14027
+3.96278 2.13137
+3.96523 2.12247
+3.96769 2.11359
+3.97016 2.10472
+3.97263 2.09586
+3.97510 2.08702
+3.97759 2.07818
+3.98008 2.06936
+3.98257 2.06055
+3.98508 2.05175
+3.98759 2.04297
+3.99010 2.03419
+3.99263 2.02543
+3.99515 2.01667
+3.99769 2.00793
+4.00023 1.99920
+4.00278 1.99048
+4.00534 1.98177
+4.00790 1.97307
+4.01047 1.96438
+4.01305 1.95570
+4.01563 1.94703
+4.01822 1.93837
+4.02082 1.92972
+4.02343 1.92108
+4.02604 1.91245
+4.02866 1.90382
+4.03128 1.89521
+4.03392 1.88661
+4.03656 1.87801
+4.03921 1.86943
+4.04186 1.86085
+4.04453 1.85228
+4.04720 1.84372
+4.04987 1.83517
+4.05256 1.82663
+4.05525 1.81809
+4.05795 1.80956
+4.06066 1.80104
+4.06338 1.79253
+4.06610 1.78403
+4.06884 1.77553
+4.07158 1.76704
+4.07433 1.75856
+4.07708 1.75008
+4.07985 1.74162
+4.08262 1.73315
+4.08540 1.72470
+4.08819 1.71625
+4.09099 1.70781
+4.09379 1.69938
+4.09661 1.69095
+4.09943 1.68252
+4.10226 1.67411
+4.10511 1.66570
+4.10795 1.65729
+4.11081 1.64889
+4.11368 1.64050
+4.11656 1.63211
+4.11944 1.62373
+4.12233 1.61535
+4.12524 1.60698
+4.12815 1.59861
+4.13107 1.59025
+4.13400 1.58189
+4.13694 1.57354
+4.13989 1.56519
+4.14285 1.55685
+4.14582 1.54851
+4.14880 1.54017
+4.15179 1.53184
+4.15479 1.52351
+4.15780 1.51519
+4.16082 1.50687
+4.16385 1.49856
+4.16689 1.49024
+4.16994 1.48193
+4.17300 1.47363
+4.17607 1.46533
+4.17915 1.45703
+4.18224 1.44873
+4.18534 1.44043
+4.18846 1.43214
+4.19158 1.42386
+4.19472 1.41557
+4.19786 1.40729
+4.20102 1.39900
+4.20419 1.39072
+4.20737 1.38245
+4.21056 1.37417
+4.21377 1.36590
+4.21698 1.35763
+4.22021 1.34936
+4.22345 1.34109
+4.22670 1.33282
+4.22997 1.32455
+4.23324 1.31629
+4.23653 1.30803
+4.23983 1.29976
+4.24314 1.29150
+4.24647 1.28324
+4.24981 1.27498
+4.25316 1.26672
+4.25653 1.25846
+4.25991 1.25020
+4.26330 1.24194
+4.26670 1.23368
+4.27012 1.22542
+4.27355 1.21715
+4.27700 1.20889
+4.28046 1.20063
+4.28393 1.19237
+4.28742 1.18411
+4.29093 1.17584
+4.29444 1.16758
+4.29798 1.15931
+4.30152 1.15104
+4.30509 1.14278
+4.30866 1.13451
+4.31225 1.12623
+4.31586 1.11796
+4.31949 1.10969
+4.32313 1.10141
+4.32678 1.09313
+4.33045 1.08485
+4.33414 1.07656
+4.33784 1.06828
+4.34156 1.05999
+4.34530 1.05170
+4.34905 1.04340
+4.35282 1.03510
+4.35661 1.02680
+4.36042 1.01850
+4.36424 1.01019
+4.36808 1.00188
+4.37194 0.99357
+4.37582 0.98525
+4.37972 0.97693
+4.38363 0.96860
+4.38756 0.96027
+4.39151 0.95193
+4.39549 0.94360
+4.39948 0.93525
+4.40349 0.92690
+4.40752 0.91855
+4.41157 0.91019
+4.41564 0.90183
+4.41973 0.89346
+4.42384 0.88508
+4.42798 0.87670
+4.43213 0.86832
+4.43631 0.85993
+4.44050 0.85153
+4.44472 0.84313
+4.44896 0.83472
+4.45323 0.82630
+4.45752 0.81788
+4.46183 0.80945
+4.46616 0.80101
+4.47052 0.79257
+4.47490 0.78412
+4.47930 0.77566
+4.48373 0.76719
+4.48819 0.75872
+4.49267 0.75024
+4.49717 0.74175
+4.50171 0.73325
+4.50626 0.72474
+4.51085 0.71623
+4.51546 0.70770
+4.52009 0.69917
+4.52476 0.69063
+4.52945 0.68208
+4.53417 0.67352
+4.53892 0.66495
+4.54370 0.65637
+4.54851 0.64778
+4.55334 0.63918
+4.55821 0.63057
+4.56311 0.62195
+4.56804 0.61332
+4.57300 0.60467
+4.57799 0.59602
+4.58302 0.58735
+4.58807 0.57868
+4.59316 0.56999
+4.59828 0.56129
+4.60344 0.55258
+4.60863 0.54385
+4.61386 0.53512
+4.61912 0.52637
+4.62442 0.51760
+4.62976 0.50883
+4.63513 0.50004
+4.64054 0.49123
+4.64599 0.48242
+4.65148 0.47358
+4.65700 0.46474
+4.66257 0.45588
+4.66818 0.44700
+4.67383 0.43811
+4.67952 0.42921
+4.68525 0.42028
+4.69103 0.41135
+4.69685 0.40239
+4.70271 0.39342
+4.70862 0.38444
+4.71458 0.37543
+4.72058 0.36641
+4.72664 0.35737
+4.73274 0.34831
+4.73889 0.33924
+4.74509 0.33014
+4.75134 0.32103
+4.75764 0.31190
+4.76399 0.30275
+4.77040 0.29358
+4.77687 0.28439
+4.78339 0.27518
+4.78996 0.26594
+4.79660 0.25669
+4.80329 0.24742
+4.81005 0.23812
+4.81686 0.22880
+4.82374 0.21946
+4.83068 0.21009
+4.83768 0.20071
+4.84475 0.19129
+4.85189 0.18186
+4.85910 0.17240
+4.86637 0.16291
+4.87372 0.15340
+4.88114 0.14386
+4.88863 0.13430
+4.89621 0.12470
+4.90385 0.11509
+4.91158 0.10544
+4.91939 0.09576
+4.92728 0.08606
+4.93526 0.07633
+4.94332 0.06656
+4.95147 0.05677
+4.95971 0.04694
+4.96804 0.03708
+4.97647 0.02719
+4.98500 0.01727
+4.99362 0.00731
+5.00235 -0.00268
+5.01118 -0.01271
+5.02012 -0.02277
+5.02916 -0.03287
+5.03832 -0.04301
+5.04760 -0.05318
+5.05699 -0.06340
+5.06650 -0.07365
+5.07614 -0.08395
+5.08591 -0.09428
+5.09581 -0.10466
+5.10584 -0.11508
+5.11602 -0.12555
+5.12634 -0.13606
+5.13680 -0.14662
+5.14742 -0.15723
+5.15820 -0.16789
+5.16914 -0.17859
+5.18024 -0.18935
+5.19152 -0.20016
+5.20298 -0.21102
+5.21462 -0.22194
+5.22645 -0.23292
+5.23848 -0.24395
+5.25071 -0.25505
+5.26316 -0.26620
+5.27582 -0.27742
+5.28872 -0.28871
+5.30185 -0.30006
+5.31523 -0.31149
+5.32886 -0.32298
+5.34276 -0.33455
+5.35694 -0.34620
+5.37141 -0.35792
+5.38619 -0.36973
+5.40128 -0.38162
+5.41670 -0.39360
+5.43248 -0.40567
+5.44862 -0.41783
+5.46514 -0.43009
+5.48207 -0.44246
+5.49943 -0.45493
+5.51724 -0.46752
+5.53553 -0.48022
+5.55433 -0.49305
+5.57367 -0.50600
+5.59359 -0.51909
+5.61412 -0.53232
+5.63530 -0.54570
+5.65720 -0.55925
+5.67986 -0.57296
+5.70334 -0.58685
+5.72773 -0.60094
+5.75309 -0.61524
+5.77952 -0.62976
+5.80714 -0.64452
+5.83607 -0.65955
+5.86648 -0.67488
+5.89854 -0.69052
+5.93249 -0.70652
+5.96862 -0.72294
+6.00730 -0.73982
+6.04901 -0.75724
+6.09440 -0.77530
+6.14442 -0.79416
+6.20046 -0.81401
+6.26480 -0.83521
+6.34164 -0.85836
+6.44070 -0.88489
+6.60174 -0.92047
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude-1.pdf
new file mode 100644
index 0000000000..02861f899f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude.1 b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude.1
new file mode 100644
index 0000000000..5429141f81
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude.1
@@ -0,0 +1,350 @@
+%!PS
+%%BoundingBox: -185 -185 351 130
+%%HiResBoundingBox: -184.75018 -184.75018 350.57535 129.47513
+%%Creator: MetaPost 2.10
+%%CreationDate: 2024.10.13:1449
+%%Pages: 1
+%*Font: cmr10 9.96263 9.96265 41:80000000189839
+%*Font: cmr7 6.97385 6.97385 31:e
+%*Font: cmmi10 9.96265 9.96265 43:a2
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+gsave newpath -184.25018 -184.25018 moveto
+-184.25018 128.97513 lineto
+350.07535 128.97513 lineto
+350.07535 -184.25018 lineto
+ closepath clip
+ 0.6552 0.7448 0.84001 setrgbcolor
+newpath 313.28333 0.00839 moveto
+-184.24129 -71.80072 lineto
+-184.24452 -71.8012 -184.25018 -71.81084 -184.25018 -71.80405 curveto
+-184.25018 71.80447 lineto
+-184.25018 71.81917 -184.236 71.79997 -184.22711 71.79869 curveto
+313.25258 -0.00392 lineto
+313.27377 -0.00697 313.3094 0.01216 313.28333 0.00839 curveto closepath fill
+ 0.5148 0.5852 0.66 setrgbcolor
+newpath 27.63303 24.44064 moveto
+3.69157 0.0059 lineto
+3.6894 0.00371 3.66844 0.01772 3.67947 0.00645 curveto
+27.64157 -24.45049 lineto
+27.64903 -24.4581 27.63753 -24.44553 27.63753 -24.44109 curveto
+27.63753 24.44263 lineto
+27.63753 24.44481 27.63507 24.44273 27.63303 24.44064 curveto closepath fill
+newpath -27.63326 -31.96431 moveto
+3.68849 0.00275 lineto
+3.69342 0.00778 3.68306 0.00278 3.68193 0.00394 curveto
+-27.63858 31.97127 lineto
+-27.63937 31.97208 -27.63753 31.97284 -27.63753 31.97162 curveto
+-27.63753 -31.97179 lineto
+-27.63753 -31.97998 -27.63583 -31.96693 -27.63326 -31.96431 curveto closepath fill
+ 1 1 1 setrgbcolor 0 0.99626 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -18.42502 0 moveto
+-18.42502 14.6605 -24.24976 28.71881 -34.61551 39.08456 curveto
+-44.98126 49.45032 -59.03957 55.27505 -73.70007 55.27505 curveto
+-88.36058 55.27505 -102.41888 49.45032 -112.78464 39.08456 curveto
+-123.15039 28.71881 -128.97513 14.6605 -128.97513 0 curveto
+-128.97513 -14.6605 -123.15039 -28.71881 -112.78464 -39.08456 curveto
+-102.41888 -49.45032 -88.36058 -55.27505 -73.70007 -55.27505 curveto
+-59.03957 -55.27505 -44.98126 -49.45032 -34.61551 -39.08456 curveto
+-24.24976 -28.71881 -18.42502 -14.6605 -18.42502 0 curveto closepath
+gsave fill grestore stroke
+newpath 92.12509 0 moveto
+92.12509 9.77367 88.24194 19.14587 81.33144 26.05638 curveto
+74.42093 32.96689 65.04872 36.85004 55.27505 36.85004 curveto
+45.50139 36.85004 36.12918 32.96689 29.21867 26.05638 curveto
+22.30817 19.14587 18.42502 9.77367 18.42502 0 curveto
+18.42502 -9.77367 22.30817 -19.14587 29.21867 -26.05638 curveto
+36.12918 -32.96689 45.50139 -36.85004 55.27505 -36.85004 curveto
+65.04872 -36.85004 74.42093 -32.96689 81.33144 -26.05638 curveto
+88.24194 -19.14587 92.12509 -9.77367 92.12509 0 curveto closepath
+gsave fill grestore stroke
+newpath 18.42502 -73.70007 moveto
+18.42502 -68.81323 16.48344 -64.12714 13.02818 -60.67189 curveto
+9.57294 -57.21663 4.88684 -55.27505 0 -55.27505 curveto
+-4.88684 -55.27505 -9.57294 -57.21663 -13.02818 -60.67189 curveto
+-16.48344 -64.12714 -18.42502 -68.81323 -18.42502 -73.70007 curveto
+-18.42502 -78.58691 -16.48344 -83.27301 -13.02818 -86.72826 curveto
+-9.57294 -90.18352 -4.88684 -92.12509 0 -92.12509 curveto
+4.88684 -92.12509 9.57294 -90.18352 13.02818 -86.72826 curveto
+16.48344 -83.27301 18.42502 -78.58691 18.42502 -73.70007 curveto closepath
+gsave fill grestore stroke
+ 0.468 0.532 0.6 setrgbcolor
+newpath -18.42502 0 moveto
+-18.42502 14.6605 -24.24976 28.71881 -34.61551 39.08456 curveto
+-44.98126 49.45032 -59.03957 55.27505 -73.70007 55.27505 curveto
+-88.36058 55.27505 -102.41888 49.45032 -112.78464 39.08456 curveto
+-123.15039 28.71881 -128.97513 14.6605 -128.97513 0 curveto
+-128.97513 -14.6605 -123.15039 -28.71881 -112.78464 -39.08456 curveto
+-102.41888 -49.45032 -88.36058 -55.27505 -73.70007 -55.27505 curveto
+-59.03957 -55.27505 -44.98126 -49.45032 -34.61551 -39.08456 curveto
+-24.24976 -28.71881 -18.42502 -14.6605 -18.42502 0 curveto closepath stroke
+newpath 92.12509 0 moveto
+92.12509 9.77367 88.24194 19.14587 81.33144 26.05638 curveto
+74.42093 32.96689 65.04872 36.85004 55.27505 36.85004 curveto
+45.50139 36.85004 36.12918 32.96689 29.21867 26.05638 curveto
+22.30817 19.14587 18.42502 9.77367 18.42502 0 curveto
+18.42502 -9.77367 22.30817 -19.14587 29.21867 -26.05638 curveto
+36.12918 -32.96689 45.50139 -36.85004 55.27505 -36.85004 curveto
+65.04872 -36.85004 74.42093 -32.96689 81.33144 -26.05638 curveto
+88.24194 -19.14587 92.12509 -9.77367 92.12509 0 curveto closepath stroke
+newpath 18.42502 -73.70007 moveto
+18.42502 -68.81323 16.48344 -64.12714 13.02818 -60.67189 curveto
+9.57294 -57.21663 4.88684 -55.27505 0 -55.27505 curveto
+-4.88684 -55.27505 -9.57294 -57.21663 -13.02818 -60.67189 curveto
+-16.48344 -64.12714 -18.42502 -68.81323 -18.42502 -73.70007 curveto
+-18.42502 -78.58691 -16.48344 -83.27301 -13.02818 -86.72826 curveto
+-9.57294 -90.18352 -4.88684 -92.12509 0 -92.12509 curveto
+4.88684 -92.12509 9.57294 -90.18352 13.02818 -86.72826 curveto
+16.48344 -83.27301 18.42502 -78.58691 18.42502 -73.70007 curveto closepath stroke
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ 1 setlinecap
+newpath 1216.05121 0 moveto
+-1234.47623 0 lineto stroke
+newpath 552.75055 663.30066 moveto
+-497.4755 -737.00073 lineto stroke
+newpath 663.30066 -737.00073 moveto
+-737.00073 663.30066 lineto stroke
+ 0 0 0.545 setrgbcolor [3 3 ] 0 setdash
+newpath -3371.77554 -1473.99866 moveto
+3629.72607 1326.59879 lineto stroke
+ 0.545 0 0 setrgbcolor
+newpath 313.22531 0 moveto
+-18.42502 -55.27505 lineto stroke
+newpath 3.68579 0 moveto
+36.85004 -110.55011 lineto stroke
+newpath 3.68579 0 moveto
+-55.27478 -147.39987 lineto stroke
+ 1 1 0 setrgbcolor
+newpath -72.20007 0 moveto
+-72.20007 0.39784 -72.35814 0.77934 -72.63943 1.06064 curveto
+-72.92073 1.34193 -73.30223 1.5 -73.70007 1.5 curveto
+-74.09792 1.5 -74.47942 1.34193 -74.76071 1.06064 curveto
+-75.042 0.77934 -75.20007 0.39784 -75.20007 0 curveto
+-75.20007 -0.39784 -75.042 -0.77934 -74.76071 -1.06064 curveto
+-74.47942 -1.34193 -74.09792 -1.5 -73.70007 -1.5 curveto
+-73.30223 -1.5 -72.92073 -1.34193 -72.63943 -1.06064 curveto
+-72.35814 -0.77934 -72.20007 -0.39784 -72.20007 0 curveto closepath fill
+ 0 0 0 setrgbcolor [] 0 setdash
+newpath -72.20007 0 moveto
+-72.20007 0.39784 -72.35814 0.77934 -72.63943 1.06064 curveto
+-72.92073 1.34193 -73.30223 1.5 -73.70007 1.5 curveto
+-74.09792 1.5 -74.47942 1.34193 -74.76071 1.06064 curveto
+-75.042 0.77934 -75.20007 0.39784 -75.20007 0 curveto
+-75.20007 -0.39784 -75.042 -0.77934 -74.76071 -1.06064 curveto
+-74.47942 -1.34193 -74.09792 -1.5 -73.70007 -1.5 curveto
+-73.30223 -1.5 -72.92073 -1.34193 -72.63943 -1.06064 curveto
+-72.35814 -0.77934 -72.20007 -0.39784 -72.20007 0 curveto closepath stroke
+ 1 1 0 setrgbcolor
+newpath 56.77505 0 moveto
+56.77505 0.39784 56.61699 0.77934 56.3357 1.06064 curveto
+56.0544 1.34193 55.6729 1.5 55.27505 1.5 curveto
+54.87721 1.5 54.49571 1.34193 54.21442 1.06064 curveto
+53.93312 0.77934 53.77505 0.39784 53.77505 0 curveto
+53.77505 -0.39784 53.93312 -0.77934 54.21442 -1.06064 curveto
+54.49571 -1.34193 54.87721 -1.5 55.27505 -1.5 curveto
+55.6729 -1.5 56.0544 -1.34193 56.3357 -1.06064 curveto
+56.61699 -0.77934 56.77505 -0.39784 56.77505 0 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 56.77505 0 moveto
+56.77505 0.39784 56.61699 0.77934 56.3357 1.06064 curveto
+56.0544 1.34193 55.6729 1.5 55.27505 1.5 curveto
+54.87721 1.5 54.49571 1.34193 54.21442 1.06064 curveto
+53.93312 0.77934 53.77505 0.39784 53.77505 0 curveto
+53.77505 -0.39784 53.93312 -0.77934 54.21442 -1.06064 curveto
+54.49571 -1.34193 54.87721 -1.5 55.27505 -1.5 curveto
+55.6729 -1.5 56.0544 -1.34193 56.3357 -1.06064 curveto
+56.61699 -0.77934 56.77505 -0.39784 56.77505 0 curveto closepath stroke
+ 1 1 0 setrgbcolor
+newpath 1.5 -73.70007 moveto
+1.5 -73.30223 1.34193 -72.92073 1.06064 -72.63943 curveto
+0.77934 -72.35814 0.39784 -72.20007 0 -72.20007 curveto
+-0.39784 -72.20007 -0.77934 -72.35814 -1.06064 -72.63943 curveto
+-1.34193 -72.92073 -1.5 -73.30223 -1.5 -73.70007 curveto
+-1.5 -74.09792 -1.34193 -74.47942 -1.06064 -74.76071 curveto
+-0.77934 -75.042 -0.39784 -75.20007 0 -75.20007 curveto
+0.39784 -75.20007 0.77934 -75.042 1.06064 -74.76071 curveto
+1.34193 -74.47942 1.5 -74.09792 1.5 -73.70007 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 1.5 -73.70007 moveto
+1.5 -73.30223 1.34193 -72.92073 1.06064 -72.63943 curveto
+0.77934 -72.35814 0.39784 -72.20007 0 -72.20007 curveto
+-0.39784 -72.20007 -0.77934 -72.35814 -1.06064 -72.63943 curveto
+-1.34193 -72.92073 -1.5 -73.30223 -1.5 -73.70007 curveto
+-1.5 -74.09792 -1.34193 -74.47942 -1.06064 -74.76071 curveto
+-0.77934 -75.042 -0.39784 -75.20007 0 -75.20007 curveto
+0.39784 -75.20007 0.77934 -75.042 1.06064 -74.76071 curveto
+1.34193 -74.47942 1.5 -74.09792 1.5 -73.70007 curveto closepath stroke
+ 0 0 0.545 setrgbcolor
+newpath 314.72531 0 moveto
+314.72531 0.39784 314.56725 0.77934 314.28595 1.06064 curveto
+314.00465 1.34193 313.62315 1.5 313.22531 1.5 curveto
+312.82747 1.5 312.44597 1.34193 312.16467 1.06064 curveto
+311.88338 0.77934 311.72531 0.39784 311.72531 0 curveto
+311.72531 -0.39784 311.88338 -0.77934 312.16467 -1.06064 curveto
+312.44597 -1.34193 312.82747 -1.5 313.22531 -1.5 curveto
+313.62315 -1.5 314.00465 -1.34193 314.28595 -1.06064 curveto
+314.56725 -0.77934 314.72531 -0.39784 314.72531 0 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 314.72531 0 moveto
+314.72531 0.39784 314.56725 0.77934 314.28595 1.06064 curveto
+314.00465 1.34193 313.62315 1.5 313.22531 1.5 curveto
+312.82747 1.5 312.44597 1.34193 312.16467 1.06064 curveto
+311.88338 0.77934 311.72531 0.39784 311.72531 0 curveto
+311.72531 -0.39784 311.88338 -0.77934 312.16467 -1.06064 curveto
+312.44597 -1.34193 312.82747 -1.5 313.22531 -1.5 curveto
+313.62315 -1.5 314.00465 -1.34193 314.28595 -1.06064 curveto
+314.56725 -0.77934 314.72531 -0.39784 314.72531 0 curveto closepath stroke
+ 0 0 0.545 setrgbcolor
+newpath 38.35004 -110.55011 moveto
+38.35004 -110.15227 38.19197 -109.77077 37.91068 -109.48947 curveto
+37.62938 -109.20818 37.24788 -109.05011 36.85004 -109.05011 curveto
+36.4522 -109.05011 36.0707 -109.20818 35.7894 -109.48947 curveto
+35.5081 -109.77077 35.35004 -110.15227 35.35004 -110.55011 curveto
+35.35004 -110.94795 35.5081 -111.32945 35.7894 -111.61075 curveto
+36.0707 -111.89204 36.4522 -112.05011 36.85004 -112.05011 curveto
+37.24788 -112.05011 37.62938 -111.89204 37.91068 -111.61075 curveto
+38.19197 -111.32945 38.35004 -110.94795 38.35004 -110.55011 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 38.35004 -110.55011 moveto
+38.35004 -110.15227 38.19197 -109.77077 37.91068 -109.48947 curveto
+37.62938 -109.20818 37.24788 -109.05011 36.85004 -109.05011 curveto
+36.4522 -109.05011 36.0707 -109.20818 35.7894 -109.48947 curveto
+35.5081 -109.77077 35.35004 -110.15227 35.35004 -110.55011 curveto
+35.35004 -110.94795 35.5081 -111.32945 35.7894 -111.61075 curveto
+36.0707 -111.89204 36.4522 -112.05011 36.85004 -112.05011 curveto
+37.24788 -112.05011 37.62938 -111.89204 37.91068 -111.61075 curveto
+38.19197 -111.32945 38.35004 -110.94795 38.35004 -110.55011 curveto closepath stroke
+ 0 0 0.545 setrgbcolor
+newpath -53.77478 -147.39987 moveto
+-53.77478 -147.00203 -53.93285 -146.62053 -54.21414 -146.33923 curveto
+-54.49544 -146.05794 -54.87694 -145.89987 -55.27478 -145.89987 curveto
+-55.67262 -145.89987 -56.05412 -146.05794 -56.33542 -146.33923 curveto
+-56.61671 -146.62053 -56.77478 -147.00203 -56.77478 -147.39987 curveto
+-56.77478 -147.79771 -56.61671 -148.17921 -56.33542 -148.46051 curveto
+-56.05412 -148.7418 -55.67262 -148.89987 -55.27478 -148.89987 curveto
+-54.87694 -148.89987 -54.49544 -148.7418 -54.21414 -148.46051 curveto
+-53.93285 -148.17921 -53.77478 -147.79771 -53.77478 -147.39987 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -53.77478 -147.39987 moveto
+-53.77478 -147.00203 -53.93285 -146.62053 -54.21414 -146.33923 curveto
+-54.49544 -146.05794 -54.87694 -145.89987 -55.27478 -145.89987 curveto
+-55.67262 -145.89987 -56.05412 -146.05794 -56.33542 -146.33923 curveto
+-56.61671 -146.62053 -56.77478 -147.00203 -56.77478 -147.39987 curveto
+-56.77478 -147.79771 -56.61671 -148.17921 -56.33542 -148.46051 curveto
+-56.05412 -148.7418 -55.67262 -148.89987 -55.27478 -148.89987 curveto
+-54.87694 -148.89987 -54.49544 -148.7418 -54.21414 -148.46051 curveto
+-53.93285 -148.17921 -53.77478 -147.79771 -53.77478 -147.39987 curveto closepath stroke
+ 0.545 0 0 setrgbcolor
+newpath 5.18579 0 moveto
+5.18579 0.39784 5.02773 0.77934 4.74643 1.06064 curveto
+4.46513 1.34193 4.08363 1.5 3.68579 1.5 curveto
+3.28795 1.5 2.90645 1.34193 2.62515 1.06064 curveto
+2.34386 0.77934 2.18579 0.39784 2.18579 0 curveto
+2.18579 -0.39784 2.34386 -0.77934 2.62515 -1.06064 curveto
+2.90645 -1.34193 3.28795 -1.5 3.68579 -1.5 curveto
+4.08363 -1.5 4.46513 -1.34193 4.74643 -1.06064 curveto
+5.02773 -0.77934 5.18579 -0.39784 5.18579 0 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 5.18579 0 moveto
+5.18579 0.39784 5.02773 0.77934 4.74643 1.06064 curveto
+4.46513 1.34193 4.08363 1.5 3.68579 1.5 curveto
+3.28795 1.5 2.90645 1.34193 2.62515 1.06064 curveto
+2.34386 0.77934 2.18579 0.39784 2.18579 0 curveto
+2.18579 -0.39784 2.34386 -0.77934 2.62515 -1.06064 curveto
+2.90645 -1.34193 3.28795 -1.5 3.68579 -1.5 curveto
+4.08363 -1.5 4.46513 -1.34193 4.74643 -1.06064 curveto
+5.02773 -0.77934 5.18579 -0.39784 5.18579 0 curveto closepath stroke
+ 0.545 0 0 setrgbcolor
+newpath -16.92502 -55.27505 moveto
+-16.92502 -54.87721 -17.08308 -54.49571 -17.36438 -54.21442 curveto
+-17.64568 -53.93312 -18.02718 -53.77505 -18.42502 -53.77505 curveto
+-18.82286 -53.77505 -19.20436 -53.93312 -19.48566 -54.21442 curveto
+-19.76695 -54.49571 -19.92502 -54.87721 -19.92502 -55.27505 curveto
+-19.92502 -55.6729 -19.76695 -56.0544 -19.48566 -56.3357 curveto
+-19.20436 -56.61699 -18.82286 -56.77505 -18.42502 -56.77505 curveto
+-18.02718 -56.77505 -17.64568 -56.61699 -17.36438 -56.3357 curveto
+-17.08308 -56.0544 -16.92502 -55.6729 -16.92502 -55.27505 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -16.92502 -55.27505 moveto
+-16.92502 -54.87721 -17.08308 -54.49571 -17.36438 -54.21442 curveto
+-17.64568 -53.93312 -18.02718 -53.77505 -18.42502 -53.77505 curveto
+-18.82286 -53.77505 -19.20436 -53.93312 -19.48566 -54.21442 curveto
+-19.76695 -54.49571 -19.92502 -54.87721 -19.92502 -55.27505 curveto
+-19.92502 -55.6729 -19.76695 -56.0544 -19.48566 -56.3357 curveto
+-19.20436 -56.61699 -18.82286 -56.77505 -18.42502 -56.77505 curveto
+-18.02718 -56.77505 -17.64568 -56.61699 -17.36438 -56.3357 curveto
+-17.08308 -56.0544 -16.92502 -55.6729 -16.92502 -55.27505 curveto closepath stroke
+ 0.545 0 0 setrgbcolor
+newpath 19.92474 -49.13376 moveto
+19.92474 -48.73592 19.76668 -48.35442 19.48538 -48.07312 curveto
+19.20409 -47.79182 18.82259 -47.63376 18.42474 -47.63376 curveto
+18.0269 -47.63376 17.6454 -47.79182 17.3641 -48.07312 curveto
+17.08281 -48.35442 16.92474 -48.73592 16.92474 -49.13376 curveto
+16.92474 -49.5316 17.08281 -49.9131 17.3641 -50.1944 curveto
+17.6454 -50.4757 18.0269 -50.63376 18.42474 -50.63376 curveto
+18.82259 -50.63376 19.20409 -50.4757 19.48538 -50.1944 curveto
+19.76668 -49.9131 19.92474 -49.5316 19.92474 -49.13376 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 19.92474 -49.13376 moveto
+19.92474 -48.73592 19.76668 -48.35442 19.48538 -48.07312 curveto
+19.20409 -47.79182 18.82259 -47.63376 18.42474 -47.63376 curveto
+18.0269 -47.63376 17.6454 -47.79182 17.3641 -48.07312 curveto
+17.08281 -48.35442 16.92474 -48.73592 16.92474 -49.13376 curveto
+16.92474 -49.5316 17.08281 -49.9131 17.3641 -50.1944 curveto
+17.6454 -50.4757 18.0269 -50.63376 18.42474 -50.63376 curveto
+18.82259 -50.63376 19.20409 -50.4757 19.48538 -50.1944 curveto
+19.76668 -49.9131 19.92474 -49.5316 19.92474 -49.13376 curveto closepath stroke
+305.3278 7.49442 moveto
+(E) cmmi10 9.96265 fshow
+312.6822 6.00002 moveto
+(12) cmr7 6.97385 fshow
+28.95253 -123.35791 moveto
+(E) cmmi10 9.96265 fshow
+36.30693 -124.85231 moveto
+(31) cmr7 6.97385 fshow
+-63.17229 -160.20767 moveto
+(E) cmmi10 9.96265 fshow
+-55.81789 -161.70207 moveto
+(23) cmr7 6.97385 fshow
+-2.72421 7.49442 moveto
+(I) cmmi10 9.96265 fshow
+1.65518 6.00002 moveto
+(12) cmr7 6.97385 fshow
+-35.445 -66.28284 moveto
+(I) cmmi10 9.96265 fshow
+-31.06561 -67.77724 moveto
+(31) cmr7 6.97385 fshow
+22.62473 -60.14154 moveto
+(I) cmmi10 9.96265 fshow
+27.00412 -61.63594 moveto
+(23) cmr7 6.97385 fshow
+-79.49503 7.49442 moveto
+(C) cmmi10 9.96265 fshow
+-72.37453 6.00002 moveto
+(1) cmr7 6.97385 fshow
+49.4801 7.49442 moveto
+(C) cmmi10 9.96265 fshow
+56.6006 6.00002 moveto
+(2) cmr7 6.97385 fshow
+-5.79495 -86.50787 moveto
+(C) cmmi10 9.96265 fshow
+1.32555 -88.00227 moveto
+(3) cmr7 6.97385 fshow
+gsave [0.92719 0.3746 -0.3746 0.92719 128.9754 -70.6998 ] concat 0 0 moveto
+(Axe) cmr10 9.96263 fshow grestore
+gsave [0.92719 0.3746 -0.3746 0.92719 147.96304 -63.02837 ] concat 0 0 moveto
+(de) cmr10 9.96263 fshow grestore
+gsave [0.92719 0.3746 -0.3746 0.92719 160.2793 -58.05234 ] concat 0 0 moveto
+(similitude) cmr10 9.96263 fshow grestore
+grestore
+ 1 1 1 setrgbcolor 0 1 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath -184.25018 -184.25018 moveto
+-184.25018 128.97513 lineto
+350.07535 128.97513 lineto
+350.07535 -184.25018 lineto
+ closepath stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude.mp
new file mode 100644
index 0000000000..fd4a0f4755
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/axessimilitude.mp
@@ -0,0 +1,98 @@
+input geom2d;
+%%% depuis Drawing with Metapost de Toby Thurston
+labeloffset := 6;
+gddTaillePoint := 3;
+gddCouleurPoint := Yellow;
+gddU:=0.65cm;
+beginfig(1);
+ C1 = Cercle((-4,0),3);
+ C2 = Cercle((3,0),2);
+ C3 = Cercle((0,-4),1);
+
+ T1 = TangenteCommuneExterieure(C1,C2);
+ T2 = TangenteCommuneExterieure(C2,C1);
+ T3 = TangenteCommuneInterieure(C1,C2);
+ T4 = TangenteCommuneInterieure(C2,C1);
+
+ T5 = TangenteCommuneExterieure(C2,C3);
+ T6 = TangenteCommuneExterieure(C3,C2);
+ T7 = TangenteCommuneInterieure(C2,C3);
+ T8 = TangenteCommuneInterieure(C3,C2);
+
+ T9 = TangenteCommuneExterieure(C1,C3);
+ T10 = TangenteCommuneExterieure(C3,C1);
+ T11 = TangenteCommuneInterieure(C1,C3);
+ T12 = TangenteCommuneInterieure(C3,C1);
+
+ E12 = IntersectionDroites(T1,T2);
+ E23 = IntersectionDroites(T5,T6);
+ E31 = IntersectionDroites(T9,T10);
+ I12 = IntersectionDroites(T3,T4);
+ I23 = IntersectionDroites(T7,T8);
+ I31 = IntersectionDroites(T11,T12);
+
+ path t[];
+ t1 :=(gddTraceObjet T1) gddEnPlace;
+ t2 := (gddTraceObjet T2) gddEnPlace;
+ t3 := (-10*gddU,-10*gddU)--(-10gddU,10*gddU);
+ fill buildcycle(t1, t3,reverse t2) withcolor 1.4*LightSlateGrey;
+
+ t4 :=(gddTraceObjet T3) gddEnPlace;
+ t5 := (gddTraceObjet T4) gddEnPlace;
+ t6 := (1.5*gddU,-10*gddU)--(1.5*gddU,10*gddU);
+ fill buildcycle(t4, t5,reverse t6) withcolor 1.1*LightSlateGrey;
+
+ t7 :=(gddTraceObjet T3) gddEnPlace;
+ t8 := (gddTraceObjet T4) gddEnPlace;
+ t9 := (-1.5*gddU,-10*gddU)--(-1.5*gddU,10*gddU);
+ fill buildcycle(t7, t8,reverse t9) withcolor 1.1*LightSlateGrey;
+
+ drawoptions(withpen pencircle scaled 1pt withcolor LightSlateGrey);
+ colorie C1 withcolor white;
+ colorie C2 withcolor white;
+ colorie C3 withcolor white;
+ trace C1; trace C2; trace C3;
+
+ drawoptions();
+ trace Droite(Centre(C1),Centre(C2));
+ trace Droite(Centre(C3),Centre(C2));
+ trace Droite(Centre(C1),Centre(C3));
+
+ D_E = Droite(E12,E23);
+ trace D_E dashed evenly withcolor DarkBlue;
+
+ E_I = Segment(E12,I31);
+ trace E_I dashed evenly withcolor DarkRed;
+ I_E1 = Segment(I12,E31);
+ trace I_E1 dashed evenly withcolor DarkRed;
+ I_E2 = Segment(I12,E23);
+ trace I_E2 dashed evenly withcolor DarkRed;
+
+
+ drawoptions();
+ pointe Centre(C1);
+ pointe Centre(C2);
+ pointe Centre(C3);
+ gddCouleurPoint := DarkBlue;
+ pointe E12; pointe E31; pointe E23;
+ gddCouleurPoint := DarkRed;
+ pointe I12; pointe I31; pointe I23;
+
+ label.top(btex $E_{12}$ etex,PointTOPair(E12) gddEnPlace);
+ label.bot(btex $E_{31}$ etex,PointTOPair(E31) gddEnPlace);
+ label.bot(btex $E_{23}$ etex,PointTOPair(E23) gddEnPlace);
+
+ label.top(btex $I_{12}$ etex,PointTOPair(I12) gddEnPlace);
+ label.llft(btex $I_{31}$ etex,PointTOPair(I31) gddEnPlace);
+ label.lrt(btex $I_{23}$ etex,PointTOPair(I23) gddEnPlace);
+
+
+ label.top(btex $C_{1}$ etex,PointTOPair(Centre(C1)) gddEnPlace);
+ label.top(btex $C_{2}$ etex,PointTOPair(Centre(C2)) gddEnPlace);
+ label.bot(btex $C_{3}$ etex,PointTOPair(Centre(C3)) gddEnPlace);
+
+ draw textext("Axe de similitude") rotated (22) shifted (0.5[Pt(E23),Pt(E12)]
+ gddEnPlace +(0,3));
+ Fenetre(-10,-10,19,7);
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1-1.pdf
new file mode 100644
index 0000000000..b32e7b092c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1-1.png b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1-1.png
new file mode 100644
index 0000000000..5288505bf3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1-1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1.mp
new file mode 100644
index 0000000000..c7f1c99699
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles1.mp
@@ -0,0 +1,37 @@
+input geom2d;
+
+labeloffset := 6;
+
+gddTaillePoint := 3;
+gddCouleurPoint := Yellow;
+
+beginfig(1);
+
+ Repere(9,9,4,5,0.8,0.8);
+ Axes;
+ Debut;
+ Graduations;
+ Unites(1);
+
+ C1 = Cercle((1,1),3);
+ C2 = Cercle((-1,-2),1);
+
+ P1 = IntersectionCercles(C1,C2);
+ P2 = IntersectionCercles(C2,C1);
+
+ drawoptions(withcolor LightSlateGrey);
+ trace C1;
+ trace C2;
+
+ drawoptions();
+ pointe Point(1,1);
+ pointe Point(-1,-2);
+ pointe P1;
+ pointe P2;
+ label.urt(textext("\(P_1\)"),PtR(P1));
+ label.top(textext("\(P_2\)"),PtR(P2));
+
+ Fin;
+
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2-1.pdf
new file mode 100644
index 0000000000..d39a73d14f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2-1.png b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2-1.png
new file mode 100644
index 0000000000..c32660dfd6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2-1.png
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2.mp
new file mode 100644
index 0000000000..9020be7c20
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles2.mp
@@ -0,0 +1,34 @@
+input geom2d;
+
+labeloffset := 6;
+gddTaillePoint := 2;
+gddCouleurPoint := Yellow;
+
+beginfig(1);
+ Repere(9,9,4,5,0.8,0.8);
+ Axes;
+ Debut;
+ Axes;
+ Graduations; Unites(1);
+
+ C1 = Cercle((1,1),3);
+ C2 = Cercle((-1,-2),1);
+
+ T1 = TangenteCommuneExterieure(C1,C2);
+ T2 = TangenteCommuneExterieure(C2,C1);
+
+ drawoptions(withcolor LightSlateGrey);
+ trace C1;
+ trace C2;
+
+ drawoptions(withcolor Olive);
+ trace T1;
+ trace T2;
+
+ drawoptions();
+ pointe Point(1,1);
+ pointe Point(-1,-2);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-001.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-001.pdf
new file mode 100644
index 0000000000..5f16f972ac
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-001.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-1.pdf
new file mode 100644
index 0000000000..9e9d57dacb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-2.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-2.pdf
new file mode 100644
index 0000000000..c3f83f5ae6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3-2.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3.001 b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3.001
new file mode 100644
index 0000000000..29a5d6af67
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3.001
@@ -0,0 +1,76 @@
+%!PS
+%%BoundingBox: -1033 -2116 849 2051
+%%HiResBoundingBox: -1032.62207 -2115.02084 848.11754 2050.78284
+%%Creator: MetaPost 2.02
+%%CreationDate: 2023.11.19:1336
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 0.468 0.532 0.6 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 113.3858 28.34645 moveto
+113.3858 50.90129 104.42459 72.52965 88.47713 88.47713 curveto
+72.52965 104.42459 50.90129 113.3858 28.34645 113.3858 curveto
+5.79161 113.3858 -15.83675 104.42459 -31.78423 88.47713 curveto
+-47.73169 72.52965 -56.6929 50.90129 -56.6929 28.34645 curveto
+-56.6929 5.79161 -47.73169 -15.83675 -31.78423 -31.78423 curveto
+-15.83675 -47.73169 5.79161 -56.6929 28.34645 -56.6929 curveto
+50.90129 -56.6929 72.52965 -47.73169 88.47713 -31.78423 curveto
+104.42459 -15.83675 113.3858 5.79161 113.3858 28.34645 curveto closepath stroke
+newpath -56.6929 -85.03935 moveto
+-56.6929 -77.52107 -59.67998 -70.31161 -64.99579 -64.99579 curveto
+-70.31161 -59.67998 -77.52107 -56.6929 -85.03935 -56.6929 curveto
+-92.55763 -56.6929 -99.76709 -59.67998 -105.08292 -64.99579 curveto
+-110.39873 -70.31161 -113.3858 -77.52107 -113.3858 -85.03935 curveto
+-113.3858 -92.55763 -110.39873 -99.76709 -105.08292 -105.08292 curveto
+-99.76709 -110.39873 -92.55763 -113.3858 -85.03935 -113.3858 curveto
+-77.52107 -113.3858 -70.31161 -110.39873 -64.99579 -105.08292 curveto
+-59.67998 -99.76709 -56.6929 -92.55763 -56.6929 -85.03935 curveto closepath stroke
+ 0.5 0.5 0 setrgbcolor 1 setlinecap
+newpath 847.86754 2050.53284 moveto
+-1032.37207 -2114.77084 lineto stroke
+newpath 589.01413 188.14299 moveto
+-799.40399 -438.61998 lineto stroke
+ 1 1 0 setrgbcolor
+newpath 29.34645 28.34645 moveto
+29.34645 28.61168 29.24107 28.86601 29.05354 29.05354 curveto
+28.86601 29.24107 28.61168 29.34645 28.34645 29.34645 curveto
+28.08122 29.34645 27.82689 29.24107 27.63936 29.05354 curveto
+27.45183 28.86601 27.34645 28.61168 27.34645 28.34645 curveto
+27.34645 28.08122 27.45183 27.82689 27.63936 27.63936 curveto
+27.82689 27.45183 28.08122 27.34645 28.34645 27.34645 curveto
+28.61168 27.34645 28.86601 27.45183 29.05354 27.63936 curveto
+29.24107 27.82689 29.34645 28.08122 29.34645 28.34645 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 29.34645 28.34645 moveto
+29.34645 28.61168 29.24107 28.86601 29.05354 29.05354 curveto
+28.86601 29.24107 28.61168 29.34645 28.34645 29.34645 curveto
+28.08122 29.34645 27.82689 29.24107 27.63936 29.05354 curveto
+27.45183 28.86601 27.34645 28.61168 27.34645 28.34645 curveto
+27.34645 28.08122 27.45183 27.82689 27.63936 27.63936 curveto
+27.82689 27.45183 28.08122 27.34645 28.34645 27.34645 curveto
+28.61168 27.34645 28.86601 27.45183 29.05354 27.63936 curveto
+29.24107 27.82689 29.34645 28.08122 29.34645 28.34645 curveto closepath stroke
+ 1 1 0 setrgbcolor
+newpath -84.03935 -85.03935 moveto
+-84.03935 -84.77412 -84.14473 -84.51979 -84.33226 -84.33226 curveto
+-84.51979 -84.14473 -84.77412 -84.03935 -85.03935 -84.03935 curveto
+-85.30458 -84.03935 -85.55891 -84.14473 -85.74644 -84.33226 curveto
+-85.93398 -84.51979 -86.03935 -84.77412 -86.03935 -85.03935 curveto
+-86.03935 -85.30458 -85.93398 -85.55891 -85.74644 -85.74644 curveto
+-85.55891 -85.93398 -85.30458 -86.03935 -85.03935 -86.03935 curveto
+-84.77412 -86.03935 -84.51979 -85.93398 -84.33226 -85.74644 curveto
+-84.14473 -85.55891 -84.03935 -85.30458 -84.03935 -85.03935 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath -84.03935 -85.03935 moveto
+-84.03935 -84.77412 -84.14473 -84.51979 -84.33226 -84.33226 curveto
+-84.51979 -84.14473 -84.77412 -84.03935 -85.03935 -84.03935 curveto
+-85.30458 -84.03935 -85.55891 -84.14473 -85.74644 -84.33226 curveto
+-85.93398 -84.51979 -86.03935 -84.77412 -86.03935 -85.03935 curveto
+-86.03935 -85.30458 -85.93398 -85.55891 -85.74644 -85.74644 curveto
+-85.55891 -85.93398 -85.30458 -86.03935 -85.03935 -86.03935 curveto
+-84.77412 -86.03935 -84.51979 -85.93398 -84.33226 -85.74644 curveto
+-84.14473 -85.55891 -84.03935 -85.30458 -84.03935 -85.03935 curveto closepath stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3.mp
new file mode 100644
index 0000000000..aff09b49ea
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/cercles3.mp
@@ -0,0 +1,58 @@
+input geom2d;
+
+labeloffset := 6;
+
+gddTaillePoint := 2;
+gddCouleurPoint := Yellow;
+
+
+
+beginfig(1);
+
+
+ C1 = Cercle((1,1),3);
+ C2 = Cercle((-3,-3),1);
+
+ T1 = TangenteCommuneExterieure(C1,C2);
+ T2 = TangenteCommuneExterieure(C2,C1);
+ T3 = TangenteCommuneInterieure(C1,C2);
+ T4 = TangenteCommuneInterieure(C2,C1);
+
+
+ drawoptions(withcolor LightSlateGrey);
+ trace C1;
+ trace C2;
+
+ drawoptions(withcolor Olive);
+ trace T1;
+ trace T2;
+
+
+ drawoptions(withcolor DarkRed);
+ trace T3;
+ trace T4;
+
+ drawoptions();
+ pointe Centre(C1);
+ pointe Centre(C2);
+
+ a = angle((0,-1));
+ show a;
+
+endfig;
+
+beginfig(2);
+
+ A = Point(0,0);
+ B = Point(2,1);
+ C = Point(1,3);
+
+ K = CercleTroisPoints(A,B,C);
+
+ trace K;
+ pointe A;
+ pointe B;
+ pointe C;
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/inter-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/inter-1.pdf
new file mode 100644
index 0000000000..e56765abe6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/inter-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/inter.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/inter.mp
new file mode 100644
index 0000000000..4fd719ca0c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cercles/inter.mp
@@ -0,0 +1,22 @@
+input geom2d;
+
+beginfig(1);
+gddPointeType:="croix";
+A = Point(1,1);
+pointe A avecCrayon(1,green);
+B = Point(4,4);
+
+CA = CercleD(A,1);
+trace CA;
+CB = CercleD(B,2);
+trace CB;
+%C = IntersectionCercles(CA,CA);
+%trace C;
+D = Point(2,3);
+E = Point(4,-1);
+DE = Droite(D,E);
+trace DE;
+%C = IntersectionDroiteCercle(DE,CA,1);
+%pointe C;
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-1.pdf
new file mode 100644
index 0000000000..41fa9854bd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-2.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-2.pdf
new file mode 100644
index 0000000000..377acbfc82
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-2.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-3.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-3.pdf
new file mode 100644
index 0000000000..4dca328210
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-3.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-4.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-4.pdf
new file mode 100644
index 0000000000..9f4c93c43f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse-4.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse.mp
new file mode 100644
index 0000000000..b95e3d82d2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/ellipse.mp
@@ -0,0 +1,105 @@
+input geom2d;
+
+beginfig(1);
+ C = Point(3,2);
+ A = Point(5,1);
+ B = Point(3.5,3) ;
+ E = Ellipse(C,A,B);
+ F = EllipseF(C,A,2.5);
+ D = Centre(F);
+ pointe D;
+ trace E;
+ trace F;
+ pointe C;
+ pointe A;
+ pointe B;
+endfig;
+
+
+
+beginfig(2);
+ F1 = Point(3,1);
+ F2 = Point(1.5,0.5);
+ E := EllipseF(F1,F2,1.2);
+ trace E;
+
+ bboxmargin := 1cm;
+ path cadre; cadre = bbox currentpicture;
+
+ pair M;
+ M = point 3.5 of (gddTraceObjet(E)) ;
+ M' = PointImp(M);
+
+ d:=Longueur(M',F1)+Longueur(M',F2);
+ show d; % Pour vérifier que l'on obtient bien 2a
+
+ trace Segment(F1,M');
+ trace Segment(F2,M');
+ D := TangenteEllipse(E,M);
+ trace D;
+
+ gddTaillePoint := 1.5;
+ gddCouleurPoint := Yellow;
+ pointe M';
+ gddCouleurPoint := Gainsboro;
+ pointe F1;
+ pointe F2;
+
+ setbounds currentpicture to cadre;
+endfig;
+
+
+beginfig(3);
+ F1 := Point(3,1);
+ F2 := Point(1.5,0.5);
+ E := EllipseF(F1,F2,1.2);
+ trace E;
+
+ bboxmargin := 5cm;
+ path cadre; cadre = bbox currentpicture;
+ numeric M;
+ P = Point(1,-1);
+ C1 = CercleCP(P,F1);
+ trace C1;
+ C2 = Cercle(F2,2*DemiGrandAxe(E));
+ trace C2;
+ T1 = IntersectionCercles(C1,C2);
+ T2 = IntersectionCercles(C2,C1);
+ if(Longueur(F1,T1)<Longueur(F1,T2)):
+ U = T1;
+ else:
+ U = T2;
+ fi
+ DU = Segment(F2,U);
+ pair Ip;
+ Ip := (gddTraceObjet(DU)) intersectionpoint (gddTraceObjet(E));
+ M = PointImp(Ip);
+ trace DU;
+ marque.urt "M";
+ marque.urt "P";
+ marque.urt "F1";
+ marque.urt "F2";
+ marque.urt "T1";
+ marque.urt "T2";
+
+ setbounds currentpicture to cadre;
+endfig;
+beginfig(4);
+ F1 := Point(3,1);
+ F2 := Point(1.5,0.5);
+ E := EllipseF(F1,F2,1.2);
+ trace E;
+ P := Point(4,1);
+ bboxmargin := 5cm;
+ path cadre; cadre = bbox currentpicture;
+ T1 := TangenteExterieureEllipse(E,P,1);
+ trace T1;
+ T2 := TangenteExterieureEllipse(E,P,2);
+ trace T2;
+ marque.urt "P";
+ pointe gddB[T1];
+
+ pointe gddB[T2];
+ setbounds currentpicture to cadre;
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/hyper-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/hyper-1.pdf
new file mode 100644
index 0000000000..7bd2bd78e6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/hyper-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/hyper.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/hyper.mp
new file mode 100644
index 0000000000..f01557feb6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/coniques/hyper.mp
@@ -0,0 +1,41 @@
+input geom2d;
+
+beginfig(1);
+ A = Point(0,0);
+ B = Point(3,2);
+ AB = Droite(A,B);
+ F_1 = Point(-1,1);
+ Hyper = HyperboleFD(F_1,AB,1.5);
+ O = Centre(Hyper);
+ F_2 = Foyer(Hyper,2);
+ Axe = Droite(F_1,F_2);
+ S_1 = Sommet(Hyper,1);
+ S_2 = Sommet(Hyper,2);
+
+ trace Axe dashed evenly;
+ C = CerclePrincipale(Hyper) ;
+ trace C avecCrayon(0.5,LightSlateGray) dashed evenly;
+ A_1 = AsymptoteHyperbole(Hyper,1);
+ A_2 = AsymptoteHyperbole(Hyper,2);
+ trace A_1 dashed evenly;
+ trace A_2 dashed evenly;
+
+ D_1 = Directrice(Hyper,1);
+ D_2 = Directrice(Hyper,2);
+
+ trace D_1 avecCrayon(1.1,CornflowerBlue);
+ trace D_2 avecCrayon(1.1,CornflowerBlue);
+ trace DemiHyperbole(Hyper,1) avecCrayon(1.5,Crimson);
+ trace DemiHyperbole(Hyper,2) avecCrayon(1.5,Crimson);
+
+ marque.lft "O";
+ marque.lft "S_1";
+ marque.lft "S_2";
+ marque.lft "F_1";
+ marque.lft "F_2";
+ label.lft(textext("\(\mathcal{C}\)"),Pt(PointDe(C,0.6)) gddEnPlace) withcolor LightSlateGray;
+ label.top(textext("\(\mathcal{D}_1\)"),Pt(PointDe(D_1,0.47)) gddEnPlace) withcolor CornflowerBlue;
+ label.top(textext("\(\mathcal{D}_2\)"),Pt(PointDe(D_2,0.46)) gddEnPlace) withcolor CornflowerBlue;
+ Fenetre(-4,-7,4,4);
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/construction/ogiveentiers-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/construction/ogiveentiers-1.pdf
new file mode 100644
index 0000000000..91f4a16e7d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/construction/ogiveentiers-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/construction/ogiveentiers.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/construction/ogiveentiers.mp
new file mode 100644
index 0000000000..b02c8e0bce
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/construction/ogiveentiers.mp
@@ -0,0 +1,126 @@
+input geom2d;
+
+beginfig(1);
+ % les points de base pour l'ogive
+ O = Point(0,0);
+ A = Point(-3,0);
+ A2 = Point(-4,0);
+ B = Point(3,0);
+ B2 = Point(4,0);
+ % la droite de base de l'ogive
+ AB = Droite(A,B);
+ % on se prend une droite quelconque
+ Ct = Point(0.8,-2); % point quelconque
+ AC = Droite(A,Ct); % droite quelconque
+ % on prend trois longueures égales sur la droite
+ longueurTier := 1.4;
+ C1 = ReportSurDroite(A,AC,longueurTier);
+ C2 = ReportSurDroite(C1,AC,longueurTier);
+ C3 = ReportSurDroite(C2,AC,longueurTier);
+ % on définit la droite qui passe par B et le dernier point
+ BC = Droite(B,C3);
+ % on construit une droite perpendiculaire à BC
+ D = Point(-4,0);
+ perpD = DroitePerpendiculaire(BC,D);
+ DD = IntersectionDroites(perpD,BC);
+ % on projette C2 et C1 sar la droite AB pour diviser [AB] en 3 parties
+ % égales
+ perpC2 = DroitePerpendiculaire(perpD,C2);
+ perpC1 = DroitePerpendiculaire(perpD,C1);
+ D1 = IntersectionDroites(AB,perpC1);
+ D2 = IntersectionDroites(AB,perpC2);
+ % on construit l'enveloppe de l'ogive
+ C_DA = CercleCP(D2,A);
+ C_DB = CercleCP(D1,B);
+ C_DA2 = CercleCP(D2,A2);
+ C_DB2 = CercleCP(D1,B2);
+ % on construit le point P pour la projection finale
+ C_AB = CercleCP(A,B);
+ C_BA = CercleCP(B,A);
+ P = IntersectionCercles(C_BA,C_AB);
+ % on prend 5 longueures égales sur la droite quelconque du début
+ longueurCinq :=0.8;
+ F1 = ReportSurDroite(A,AC,longueurCinq);
+ F2 = ReportSurDroite(F1,AC,longueurCinq);
+ F3 = ReportSurDroite(F2,AC,longueurCinq);
+ F4 = ReportSurDroite(F3,AC,longueurCinq);
+ F5 = ReportSurDroite(F4,AC,longueurCinq);
+ % on projette les points sur AB pour diviser [AB] en 5 parties égale
+ BF5 = Droite(B,F5);
+ perpF5 = DroitePerpendiculaire(BF5,A2);
+ CC = IntersectionDroites(BF5,perpF5);
+ perpF4 = DroitePerpendiculaire(perpF5,F4);
+ perpF3 = DroitePerpendiculaire(perpF5,F3);
+ perpF2 = DroitePerpendiculaire(perpF5,F2);
+ perpF1 = DroitePerpendiculaire(perpF5,F1);
+ G1 = IntersectionDroites(AB,perpF1);
+ G2 = IntersectionDroites(AB,perpF2);
+ G3 = IntersectionDroites(AB,perpF3);
+ G4 = IntersectionDroites(AB,perpF4);
+ % on projette les Gi sur l'ogive avec le point P
+ PG1 = Droite(P,G1);
+ PG2 = Droite(P,G2);
+ PG3 = Droite(P,G3);
+ PG4 = Droite(P,G4);
+ I1 = IntersectionDroiteCercle(PG1,C_DA,1);
+ I2 = IntersectionDroiteCercle(PG2,C_DA,2);
+ I3 = IntersectionDroiteCercle(PG3,C_DB,2);
+ I4 = IntersectionDroiteCercle(PG4,C_DB,2);
+ % à partir des 2 points issus de la division en 3 de [AB]
+ % on trace les séparations des pierres qui constituent l'ogive
+ Dvoute1 = Droite(D2,I1);
+ Dvoute2 = Droite(D2,I2);
+ Dvoute3 = Droite(D1,I3);
+ Dvoute4 = Droite(D1,I4);
+
+ % les tracés
+ drawoptions(withcolor 1.3*Grey);
+ trace perpC2; trace perpC1;
+ trace AB;
+ trace AC;
+ trace BC;
+ trace perpD;
+ trace SigneOrtho(B,DD,A2,0.2);
+
+ drawoptions(withcolor Bisque);
+ trace BF5;
+ trace perpF5;trace perpF4;trace perpF3;trace perpF2;trace perpF1;
+ trace SigneOrtho(B,CC,A2,0.2);
+
+ drawoptions(withcolor SteelBlue withpen pencircle scaled 0.85pt);
+ trace gddTraceArcDeCercle(C_DA,Pi/2,Pi);
+ trace gddTraceArcDeCercle(C_DA2,Pi/2,Pi);
+ trace gddTraceArcDeCercle(C_DB2,0,Pi/2);
+ trace gddTraceArcDeCercle(C_DB,0,Pi/2);
+
+ drawoptions();
+ trace gddTraceArcDeCercle(C_AB,0,-Pi/2) dashed evenly;
+ trace gddTraceArcDeCercle(C_BA,Pi,3Pi/2) dashed evenly;
+
+ drawoptions(withcolor DarkSalmon);
+ trace PG1; trace PG2; trace PG3; trace PG4;
+
+ drawoptions(withcolor SteelBlue withpen pencircle scaled 0.85pt);
+ trace Dvoute1; trace Dvoute2; trace Dvoute3; trace Dvoute4;
+ drawoptions();
+
+ gddCouleurPoint := DarkRed;
+ pointe O;
+ pointe A;
+ pointe B; pointe D;
+ pointe B2;
+
+ gddCouleurPoint := Bisque;
+ pointe F1; pointe F2; pointe F3; pointe F4; pointe F5;
+ pointe G1; pointe G2;pointe G3;pointe G4;
+ gddCouleurPoint := 1.3*Grey;
+ pointe DD;
+ pointe C1; pointe C2; pointe C3;
+ pointe D1; pointe D2;
+
+ gddCouleurPoint := DarkSalmon;
+ pointe P;
+ pointe I1; pointe I2; pointe I3; pointe I4;
+ Fenetre(-5,-7,5,5);
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp01-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp01-1.pdf
new file mode 100644
index 0000000000..f3e9c46b9f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp01-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp01.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp01.mp
new file mode 100644
index 0000000000..615e1cca93
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp01.mp
@@ -0,0 +1,38 @@
+input geom2d;
+
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef f(expr t) = 2*cos(t)*cos(t)*cos(t) enddef;
+vardef g(expr t) = 2*sin(t)*sin(t)*sin(t) enddef;
+
+
+beginfig(1);
+ Repere(8,8,4,4,1.8,1.8);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+ drawoptions(withpen pencircle scaled 0.5 withcolor LightSlateGrey);
+ trace ((-2,-2)--(-2,2)--(2,2)--(2,-2)--cycle);
+
+ nb = 80;
+ pas = 2*Pi/nb;
+ for i=0 upto nb: trace (0,2*sin(i*pas))--(2*cos(i*pas),0); endfor;
+
+ fleche Segment((2,0),(1.2,0)) avecCrayon(1,RoyalBlue);
+ fleche Segment((-2,0),(-1.2,0)) avecCrayon(1,RoyalBlue);
+ fleche Segment((0,2),(0,1.2)) avecCrayon(1,RoyalBlue);
+ fleche Segment((0,-2),(0,-1.2)) avecCrayon(1,RoyalBlue);
+
+ trace Courbe(f,g,0,2*Pi,500) avecCrayon(1.5,DarkOrange);
+
+ pointe Point(0,0);
+ pointe Point(2,0);
+ pointe Point(0,2);
+ pointe Point(0,-2);
+ pointe Point(-2,0);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp02-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp02-1.pdf
new file mode 100644
index 0000000000..456b3d7eb2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp02-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp02.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp02.mp
new file mode 100644
index 0000000000..6e0162b6d9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp02.mp
@@ -0,0 +1,35 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef f(expr t) = sin(2*t+Pi/3) enddef;
+vardef g(expr t) = sin(3*t) enddef;
+
+beginfig(1);
+ Repere(8,8,4,4,3,3);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+
+ drawoptions(withcolor LightSlateGrey);
+ trace ((-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle);
+ trace ((-1,-1)--(1,1));
+ trace (1,-1)--(-1,1);
+ trace Cercle(origine,1);
+ trace ((-1,0.5)--(1,0.5));
+ trace ((-1,-0.5)--(1,-0.5));
+ trace ((0.5,-1)--(0.5,1));
+ trace ((-0.5,-1)--(-0.5,1));
+ trace ((-1,sqrt(3)/2)--(1,sqrt(3)/2));
+ trace ((-1,-sqrt(3)/2)--(1,-sqrt(3)/2));
+ trace ((sqrt(3)/2,-1)--(sqrt(3)/2,1));
+ trace ((-sqrt(3)/2,-1)--(-sqrt(3)/2,1));
+
+ trace Courbe(f,g,0,2*Pi,500) avecCrayon(1.5,Orchid);
+
+ pointe Point(0,0);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp03-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp03-1.pdf
new file mode 100644
index 0000000000..a40bc09ec5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp03-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp03.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp03.mp
new file mode 100644
index 0000000000..f96fdfed5c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp03.mp
@@ -0,0 +1,21 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1cm;
+
+vardef f(expr t) = t*t enddef;
+vardef g(expr t) = t*t*t enddef;
+
+beginfig(1);
+
+ Repere(8,12,2,6,1,1);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+ fleche Segment((0,0),(2,0)) avecCrayon(1,Crimson);
+ trace Courbe(f,g,-3,3,300) avecCrayon(1.5,DarkTurquoise);
+ pointe Point(0,0);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp04-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp04-1.pdf
new file mode 100644
index 0000000000..53791974cd
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp04-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp04.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp04.mp
new file mode 100644
index 0000000000..d179e05f05
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp04.mp
@@ -0,0 +1,37 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef f(expr t) = t*t+2/t enddef;
+vardef g(expr t) = t+1/t enddef;
+vardef fp(expr t) = t*t enddef;
+vardef gp(expr t) = t enddef;
+
+beginfig(1);
+
+ Repere(12,10,5,4,0.7,0.7);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+
+ drawoptions(withcolor LightSlateGrey);
+ trace Droite(Point(-4,-2),Point(4,2));
+ trace (3,0)--(3,2)--(0,2) dashed evenly;
+ trace (-1,0)--(-1,-2)--(0,-2) dashed evenly;
+ trace Courbe(fp,gp,-4,4,500);
+
+ fleche Segment((3,2),(5,8/3)) avecCrayon(1,DeepPink);
+ fleche Segment((-1,-2),(-2.8,-2)) avecCrayon(1,DeepPink);
+ fleche Segment((-1,-2),(0.8,-2)) avecCrayon(1,DeepPink);
+
+ trace Courbe(f,g,-5,-0.1,100) avecCrayon(1.5,DarkCyan);
+ trace Courbe(f,g,0.1,5,100) avecCrayon(1.5,DarkCyan);
+
+ pointe Point(0,0);
+ pointe Point(3,2);
+ pointe Point(-1,-2);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp05-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp05-1.pdf
new file mode 100644
index 0000000000..d44adddc0d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp05-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp05.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp05.mp
new file mode 100644
index 0000000000..902fff5db3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp05.mp
@@ -0,0 +1,37 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef f(expr t) = t*t-2*t enddef;
+vardef g(expr t) = t*t + 1/(t*t) enddef;
+vardef fp(expr t) = 2*t+t*t enddef;
+vardef gp(expr t) = t*t enddef;
+
+beginfig(1);
+
+ Repere(8,10,2,1,1,1);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+
+ drawoptions(withcolor LightSlateGrey);
+ trace (3,0)--(3,2)--(-1,2)--(-1,0) dashed evenly;
+ trace (1,0)--(1,6)--(0,6) dashed evenly;
+ trace Courbe(fp,gp,-5,5,500);
+
+ fleche Segment((-1,2),(-1,2)+(0.5,2)) avecCrayon(1,Crimson);
+ fleche Segment((3,2),(4,2)) avecCrayon(1,Crimson);
+ fleche Segment((3,2),(2,2)) avecCrayon(1,Crimson);
+
+ trace Courbe(f,g,-10,-0.05,300) avecCrayon(1.5,DarkGoldenrod);
+ trace Courbe(f,g,0.05,10,300) avecCrayon(1.5,DarkGoldenrod);
+
+ pointe Point(0,0);
+ pointe Point(-1,2);
+ pointe Point(3,2);
+ pointe Point(1,6);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp06-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp06-1.pdf
new file mode 100644
index 0000000000..ac66491dcf
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp06-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp06.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp06.mp
new file mode 100644
index 0000000000..9c0b170d2c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp06.mp
@@ -0,0 +1,31 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef f(expr t) = 1/t + 1/(t+1) enddef;
+vardef g(expr t) = 1/t + 1/(1+2*t+t**2) enddef;
+vardef p(expr x) = x*(x+2)+2 enddef;
+
+beginfig(1);
+
+ Repere(10,10,5,5,1,1);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+
+ drawoptions(withcolor LightSlateGrey);
+ trace Droite(origine,Point(1,1));
+ trace Representation(p,-3,1,20);
+
+ trace Courbe(f,g,-20,-1.1,300) avecCrayon(1.5,Teal);
+ trace Courbe(f,g,-0.9,-0.1,300) avecCrayon(1.5,Teal);
+ trace Courbe(f,g,0.1,20,300) avecCrayon(1.5,Teal);
+
+ pointe Point(0,0);
+ pointe Point(-1,0);
+ pointe Point(-0.526,-0.140);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp07-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp07-1.pdf
new file mode 100644
index 0000000000..8d20576d7e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp07-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp07.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp07.mp
new file mode 100644
index 0000000000..7b595e0ea9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp07.mp
@@ -0,0 +1,26 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef f(expr t) = t/sqrt(1+t*t) enddef;
+vardef g(expr t) = t*(1+f(t)) enddef;
+vardef h(expr t) = -t*(1+f(t)) enddef;
+
+beginfig(1);
+
+ Repere(6,10,3,5,2,2);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+
+ trace Droite((1,-2),(1,2)) withcolor MidnightBlue;
+
+ trace (-1,0)..Courbe(f,g,-18,18,200) avecCrayon(1.5,DarkSalmon);
+ trace (-1,0)..Courbe(f,h,-18,18,200) avecCrayon(1.5,DarkSalmon);
+
+ pointe Point(0,0);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp08-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp08-1.pdf
new file mode 100644
index 0000000000..182205040d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp08-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp08.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp08.mp
new file mode 100644
index 0000000000..6a2f749580
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/courbes/cp08.mp
@@ -0,0 +1,38 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1cm;
+
+vardef f(expr t) = 2*sin(t) enddef;
+vardef g(expr t) = 2*cos(t)*cos(t)/(2-cos(t)) enddef;
+vardef h(expr t) = -t*(1+f(t)) enddef;
+
+def traceDoubleVecteur(expr o,d)= drawdblarrow ((o-d)--(o+d)) gddEnPlace enddef;
+
+path bicorne;
+bicorne = Courbe(f,g,-Pi,Pi,200)--cycle;
+
+beginfig(1);
+
+ Repere(9,6,4.5,1,2,2);
+ Axes;
+ Debut;
+ Axes;
+ Graduations; Unites(1);
+
+ colorieAvecTransparence(bicorne,CadetBlue,0.2);
+
+ traceDoubleVecteur((0,2),(0.5,0)) avecCrayon(1,Crimson);
+ traceDoubleVecteur((0,2/3),(0.5,0)) avecCrayon(1,Crimson);
+ fleche Segment((2,0),(1.6,0.4)) avecCrayon(1,Crimson);
+ fleche Segment((-2,0),(-1.6,0.4)) avecCrayon(1,Crimson);
+
+ trace bicorne avecCrayon(1.5,CadetBlue);
+
+ pointe Point(0,0);
+ pointe Point(2,0);
+ pointe Point(-2,0);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-1.dat b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-1.dat
new file mode 100644
index 0000000000..82bb5f73b3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-1.dat
@@ -0,0 +1,441 @@
+-9.50332 39.03779
+-8.90985 36.92109
+-8.35830 34.94184
+-7.84242 33.07748
+-7.35647 31.30663
+-6.89478 29.60762
+-6.45128 27.95615
+-6.01847 26.32078
+-5.58493 24.65153
+-5.12641 22.83954
+-4.53013 20.37356
+-4.21630 18.99730
+-3.82624 17.15868
+-3.60655 16.02255
+-3.48053 15.31960
+-3.39084 14.78786
+-3.32137 14.35307
+-3.26497 13.98196
+-3.21775 13.65636
+-3.17735 13.36511
+-3.14222 13.10083
+-3.11127 12.85833
+-3.08371 12.63385
+-3.05896 12.42451
+-3.03656 12.22812
+-3.01615 12.04292
+-2.99745 11.86749
+-2.98023 11.70069
+-2.96428 11.54154
+-2.94946 11.38925
+-2.93563 11.24313
+-2.92266 11.10259
+-2.91047 10.96713
+-2.89896 10.83630
+-2.88807 10.70973
+-2.87772 10.58707
+-2.86785 10.46803
+-2.85843 10.35233
+-2.84940 10.23975
+-2.84071 10.13006
+-2.83235 10.02307
+-2.82426 9.91862
+-2.81643 9.81654
+-2.80883 9.71668
+-2.80143 9.61893
+-2.79421 9.52315
+-2.78715 9.42923
+-2.78023 9.33709
+-2.77343 9.24662
+-2.76675 9.15773
+-2.76016 9.07035
+-2.75365 8.98441
+-2.74721 8.89983
+-2.74083 8.81655
+-2.73449 8.73451
+-2.72820 8.65365
+-2.72193 8.57393
+-2.71568 8.49529
+-2.70944 8.41770
+-2.70321 8.34109
+-2.69697 8.26545
+-2.69072 8.19072
+-2.68446 8.11687
+-2.67818 8.04387
+-2.67186 7.97168
+-2.66552 7.90029
+-2.65914 7.82964
+-2.65272 7.75973
+-2.64625 7.69053
+-2.63973 7.62200
+-2.63316 7.55413
+-2.62653 7.48689
+-2.61983 7.42027
+-2.61308 7.35425
+-2.60625 7.28880
+-2.59935 7.22390
+-2.59238 7.15955
+-2.58533 7.09572
+-2.57821 7.03240
+-2.57100 6.96957
+-2.56370 6.90722
+-2.55632 6.84533
+-2.54885 6.78390
+-2.54129 6.72290
+-2.53363 6.66233
+-2.52588 6.60218
+-2.51803 6.54243
+-2.51009 6.48308
+-2.50204 6.42410
+-2.49389 6.36550
+-2.48564 6.30727
+-2.47728 6.24939
+-2.46881 6.19185
+-2.46024 6.13466
+-2.45155 6.07779
+-2.44276 6.02124
+-2.43385 5.96501
+-2.42483 5.90908
+-2.41569 5.85345
+-2.40644 5.79812
+-2.39707 5.74307
+-2.38758 5.68830
+-2.37797 5.63381
+-2.36823 5.57958
+-2.35838 5.52561
+-2.34841 5.47190
+-2.33831 5.41844
+-2.32808 5.36523
+-2.31773 5.31226
+-2.30726 5.25952
+-2.29665 5.20701
+-2.28592 5.15473
+-2.27506 5.10268
+-2.26406 5.05084
+-2.25294 4.99921
+-2.24168 4.94779
+-2.23030 4.89658
+-2.21877 4.84557
+-2.20712 4.79475
+-2.19532 4.74413
+-2.18340 4.69370
+-2.17133 4.64346
+-2.15913 4.59340
+-2.14679 4.54352
+-2.13431 4.49382
+-2.12169 4.44430
+-2.10893 4.39494
+-2.09603 4.34575
+-2.08299 4.29673
+-2.06981 4.24786
+-2.05648 4.19916
+-2.04301 4.15062
+-2.02939 4.10223
+-2.01563 4.05398
+-2.00172 4.00589
+-1.98766 3.95795
+-1.97346 3.91015
+-1.95911 3.86249
+-1.94461 3.81497
+-1.92996 3.76758
+-1.91516 3.72033
+-1.90020 3.67322
+-1.88510 3.62623
+-1.86984 3.57937
+-1.85443 3.53263
+-1.83887 3.48602
+-1.82315 3.43954
+-1.80727 3.39317
+-1.79124 3.34691
+-1.77505 3.30078
+-1.75870 3.25475
+-1.74219 3.20884
+-1.72552 3.16304
+-1.70869 3.11735
+-1.69170 3.07176
+-1.67455 3.02627
+-1.65723 2.98089
+-1.63975 2.93560
+-1.62210 2.89042
+-1.60429 2.84533
+-1.58631 2.80033
+-1.56816 2.75543
+-1.54984 2.71061
+-1.53135 2.66589
+-1.51269 2.62125
+-1.49386 2.57670
+-1.47485 2.53222
+-1.45567 2.48783
+-1.43631 2.44352
+-1.41677 2.39929
+-1.39705 2.35513
+-1.37716 2.31104
+-1.35708 2.26703
+-1.33682 2.22308
+-1.31637 2.17920
+-1.29574 2.13538
+-1.27492 2.09163
+-1.25392 2.04794
+-1.23272 2.00430
+-1.21133 1.96072
+-1.18974 1.91720
+-1.16796 1.87372
+-1.14598 1.83030
+-1.12380 1.78692
+-1.10142 1.74359
+-1.07884 1.70029
+-1.05605 1.65704
+-1.03305 1.61382
+-1.00984 1.57063
+-0.98641 1.52748
+-0.96277 1.48435
+-0.93892 1.44125
+-0.91484 1.39816
+-0.89054 1.35510
+-0.86601 1.31205
+-0.84125 1.26901
+-0.81625 1.22598
+-0.79102 1.18295
+-0.76556 1.13992
+-0.73984 1.09688
+-0.71388 1.05384
+-0.68767 1.01078
+-0.66120 0.96771
+-0.63447 0.92461
+-0.60747 0.88149
+-0.58020 0.83833
+-0.55266 0.79513
+-0.52484 0.75189
+-0.49673 0.70859
+-0.46833 0.66524
+-0.43962 0.62183
+-0.41062 0.57834
+-0.38130 0.53477
+-0.35165 0.49112
+-0.32168 0.44737
+-0.29137 0.40351
+-0.26072 0.35954
+-0.22971 0.31545
+-0.19833 0.27122
+-0.16657 0.22684
+-0.13443 0.18230
+-0.10188 0.13758
+-0.06892 0.09268
+-0.03553 0.04758
+-0.00169 0.00225
+0.03262 -0.04332
+0.06740 -0.08914
+0.10268 -0.13524
+0.13849 -0.18165
+0.17485 -0.22838
+0.21178 -0.27548
+0.24930 -0.32295
+0.28747 -0.37085
+0.32629 -0.41921
+0.36583 -0.46806
+0.40611 -0.51747
+0.44718 -0.56746
+0.48910 -0.61812
+0.53194 -0.66949
+0.57575 -0.72166
+0.62061 -0.77472
+0.66663 -0.82875
+0.71390 -0.88389
+0.76254 -0.94027
+0.81271 -0.99805
+0.86459 -1.05742
+0.91838 -1.11864
+0.97436 -1.18200
+1.03287 -1.24788
+1.09435 -1.31679
+1.15939 -1.38939
+1.22880 -1.46660
+1.30380 -1.54981
+1.38626 -1.64115
+1.47945 -1.74439
+1.59010 -1.86727
+1.73787 -2.03254
+2.00722 -2.34049
+2.21922 -2.59293
+2.36996 -2.78029
+2.47176 -2.91150
+2.55344 -3.01993
+2.62335 -3.11523
+2.68533 -3.20180
+2.74151 -3.28210
+2.79322 -3.35762
+2.84135 -3.42941
+2.88655 -3.49818
+2.92929 -3.56448
+2.96993 -3.62870
+3.00876 -3.69119
+3.04601 -3.75218
+3.08186 -3.81190
+3.11648 -3.87052
+3.14999 -3.92820
+3.18250 -3.98504
+3.21411 -4.04117
+3.24490 -4.09668
+3.27495 -4.15165
+3.30431 -4.20615
+3.33306 -4.26025
+3.36122 -4.31400
+3.38887 -4.36747
+3.41602 -4.42069
+3.44272 -4.47371
+3.46901 -4.52658
+3.49491 -4.57931
+3.52046 -4.63197
+3.54567 -4.68456
+3.57058 -4.73713
+3.59521 -4.78969
+3.61956 -4.84229
+3.64368 -4.89493
+3.66757 -4.94765
+3.69125 -5.00047
+3.71473 -5.05340
+3.73804 -5.10648
+3.76118 -5.15971
+3.78417 -5.21312
+3.80702 -5.26673
+3.82975 -5.32056
+3.85236 -5.37461
+3.87487 -5.42891
+3.89729 -5.48348
+3.91963 -5.53833
+3.94189 -5.59348
+3.96409 -5.64894
+3.98624 -5.70473
+4.00834 -5.76087
+4.03041 -5.81737
+4.05245 -5.87424
+4.07447 -5.93150
+4.09647 -5.98917
+4.11848 -6.04727
+4.14049 -6.10579
+4.16251 -6.16477
+4.18455 -6.22422
+4.20662 -6.28415
+4.22872 -6.34458
+4.25086 -6.40553
+4.27305 -6.46700
+4.29529 -6.52902
+4.31760 -6.59160
+4.33997 -6.65476
+4.36242 -6.71851
+4.38496 -6.78287
+4.40758 -6.84787
+4.43030 -6.91351
+4.45312 -6.97981
+4.47605 -7.04680
+4.49910 -7.11448
+4.52227 -7.18289
+4.54558 -7.25203
+4.56902 -7.32193
+4.59261 -7.39261
+4.61635 -7.46409
+4.64025 -7.53638
+4.66431 -7.60951
+4.68856 -7.68351
+4.71298 -7.75839
+4.73759 -7.83418
+4.76241 -7.91090
+4.78742 -7.98857
+4.81266 -8.06722
+4.83811 -8.14688
+4.86380 -8.22757
+4.88972 -8.30932
+4.91590 -8.39215
+4.94233 -8.47610
+4.96903 -8.56119
+4.99601 -8.64746
+5.02327 -8.73493
+5.05083 -8.82364
+5.07869 -8.91362
+5.10687 -9.00491
+5.13538 -9.09753
+5.16423 -9.19153
+5.19343 -9.28695
+5.22300 -9.38382
+5.25294 -9.48219
+5.28326 -9.58209
+5.31399 -9.68357
+5.34513 -9.78667
+5.37669 -9.89145
+5.40870 -9.99794
+5.44117 -10.10619
+5.47410 -10.21627
+5.50753 -10.32822
+5.54146 -10.44209
+5.57591 -10.55795
+5.61090 -10.67586
+5.64645 -10.79587
+5.68257 -10.91805
+5.71929 -11.04247
+5.75663 -11.16920
+5.79460 -11.29831
+5.83324 -11.42988
+5.87255 -11.56398
+5.91258 -11.70070
+5.95333 -11.84013
+5.99485 -11.98234
+6.03715 -12.12745
+6.08027 -12.27554
+6.12422 -12.42671
+6.16906 -12.58108
+6.21480 -12.73875
+6.26148 -12.89984
+6.30914 -13.06448
+6.35782 -13.23279
+6.40754 -13.40490
+6.45836 -13.58097
+6.51032 -13.76112
+6.56346 -13.94553
+6.61783 -14.13435
+6.67349 -14.32776
+6.73047 -14.52594
+6.78884 -14.72907
+6.84866 -14.93737
+6.90998 -15.15103
+6.97288 -15.37029
+7.03742 -15.59538
+7.10367 -15.82656
+7.17172 -16.06408
+7.24163 -16.30823
+7.31351 -16.55930
+7.38743 -16.81761
+7.46350 -17.08349
+7.54182 -17.35731
+7.62250 -17.63943
+7.70566 -17.93027
+7.79142 -18.23024
+7.87991 -18.53982
+7.97129 -18.85948
+8.06569 -19.18976
+8.16328 -19.53122
+8.26424 -19.88445
+8.36875 -20.25011
+8.47703 -20.62888
+8.58927 -21.02152
+8.70572 -21.42883
+8.82664 -21.85169
+8.95229 -22.29102
+9.08296 -22.74786
+9.21899 -23.22330
+9.36072 -23.71854
+9.50853 -24.23490
+9.66284 -24.77379
+9.82409 -25.33678
+9.99278 -25.92556
+10.16946 -26.54200
+10.35472 -27.18816
+10.54923 -27.86631
+10.75371 -28.57894
+10.96897 -29.32883
+11.19590 -30.11906
+11.43550 -30.95305
+11.68889 -31.83463
+11.95732 -32.76810
+12.24220 -33.75829
+12.54510 -34.81064
+12.86784 -35.93132
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-1.pdf
new file mode 100644
index 0000000000..6f500479b5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-2.dat b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-2.dat
new file mode 100644
index 0000000000..a9fb9ed80b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001-2.dat
@@ -0,0 +1,1208 @@
+6.76428 -0.94750
+6.97936 -0.97051
+7.14459 -0.97893
+7.26220 -0.98025
+7.36013 -0.97848
+7.44648 -0.97481
+7.52497 -0.96978
+7.59767 -0.96371
+7.66587 -0.95678
+7.73043 -0.94915
+7.79199 -0.94089
+7.85100 -0.93209
+7.90781 -0.92280
+7.96270 -0.91306
+8.01589 -0.90292
+8.06755 -0.89241
+8.11785 -0.88154
+8.16690 -0.87034
+8.21481 -0.85884
+8.26168 -0.84704
+8.30759 -0.83496
+8.35260 -0.82261
+8.39677 -0.81001
+8.44016 -0.79716
+8.48281 -0.78407
+8.52478 -0.77076
+8.56609 -0.75723
+8.60678 -0.74348
+8.64688 -0.72952
+8.68642 -0.71537
+8.72543 -0.70101
+8.76393 -0.68647
+8.80194 -0.67173
+8.83948 -0.65682
+8.87657 -0.64173
+8.91323 -0.62646
+8.94946 -0.61102
+8.98529 -0.59542
+9.02073 -0.57965
+9.05580 -0.56372
+9.09049 -0.54763
+9.12483 -0.53138
+9.15883 -0.51498
+9.19249 -0.49844
+9.22582 -0.48174
+9.25883 -0.46490
+9.29154 -0.44791
+9.32394 -0.43078
+9.35604 -0.41352
+9.38785 -0.39611
+9.41938 -0.37857
+9.45064 -0.36090
+9.48162 -0.34309
+9.51233 -0.32515
+9.54278 -0.30709
+9.57298 -0.28889
+9.60292 -0.27058
+9.63262 -0.25213
+9.66207 -0.23357
+9.69128 -0.21488
+9.72026 -0.19607
+9.74900 -0.17715
+9.77752 -0.15811
+9.80581 -0.13895
+9.83387 -0.11967
+9.86172 -0.10029
+9.88935 -0.08079
+9.91676 -0.06118
+9.94397 -0.04146
+9.97096 -0.02163
+9.99775 -0.00169
+10.02433 0.01835
+10.05071 0.03850
+10.07689 0.05876
+10.10287 0.07912
+10.12865 0.09958
+10.15424 0.12014
+10.17964 0.14080
+10.20484 0.16157
+10.22986 0.18243
+10.25469 0.20339
+10.27933 0.22444
+10.30379 0.24560
+10.32806 0.26684
+10.35215 0.28819
+10.37607 0.30962
+10.39980 0.33115
+10.42335 0.35277
+10.44673 0.37448
+10.46993 0.39628
+10.49295 0.41817
+10.51580 0.44014
+10.53848 0.46221
+10.56098 0.48436
+10.58332 0.50660
+10.60548 0.52892
+10.62748 0.55133
+10.64931 0.57382
+10.67097 0.59639
+10.69246 0.61905
+10.71379 0.64178
+10.73495 0.66460
+10.75594 0.68750
+10.77678 0.71047
+10.79745 0.73353
+10.81796 0.75666
+10.83830 0.77987
+10.85849 0.80315
+10.87851 0.82651
+10.89837 0.84995
+10.91808 0.87346
+10.93762 0.89704
+10.95701 0.92069
+10.97624 0.94442
+10.99531 0.96822
+11.01422 0.99209
+11.03298 1.01603
+11.05158 1.04003
+11.07002 1.06411
+11.08831 1.08825
+11.10644 1.11247
+11.12442 1.13674
+11.14225 1.16109
+11.15992 1.18549
+11.17744 1.20997
+11.19480 1.23450
+11.21201 1.25910
+11.22907 1.28377
+11.24598 1.30849
+11.26274 1.33328
+11.27934 1.35812
+11.29579 1.38303
+11.31209 1.40799
+11.32824 1.43302
+11.34424 1.45810
+11.36009 1.48324
+11.37579 1.50843
+11.39134 1.53368
+11.40674 1.55899
+11.42199 1.58435
+11.43709 1.60977
+11.45204 1.63523
+11.46685 1.66076
+11.48150 1.68633
+11.49601 1.71196
+11.51037 1.73763
+11.52458 1.76336
+11.53864 1.78914
+11.55256 1.81496
+11.56633 1.84084
+11.57995 1.86676
+11.59342 1.89273
+11.60675 1.91874
+11.61993 1.94480
+11.63296 1.97091
+11.64585 1.99706
+11.65859 2.02326
+11.67118 2.04950
+11.68363 2.07578
+11.69593 2.10211
+11.70809 2.12847
+11.72010 2.15488
+11.73196 2.18133
+11.74368 2.20781
+11.75526 2.23434
+11.76669 2.26091
+11.77797 2.28751
+11.78911 2.31415
+11.80010 2.34083
+11.81095 2.36754
+11.82166 2.39429
+11.83222 2.42107
+11.84263 2.44789
+11.85290 2.47474
+11.86303 2.50163
+11.87301 2.52855
+11.88285 2.55550
+11.89255 2.58248
+11.90210 2.60949
+11.91151 2.63653
+11.92077 2.66360
+11.92989 2.69070
+11.93887 2.71783
+11.94770 2.74499
+11.95639 2.77217
+11.96494 2.79938
+11.97334 2.82661
+11.98160 2.85387
+11.98972 2.88116
+11.99769 2.90847
+12.00552 2.93580
+12.01321 2.96316
+12.02076 2.99054
+12.02816 3.01794
+12.03542 3.04536
+12.04254 3.07280
+12.04952 3.10026
+12.05635 3.12774
+12.06304 3.15524
+12.06959 3.18276
+12.07600 3.21029
+12.08226 3.23784
+12.08839 3.26541
+12.09437 3.29299
+12.10021 3.32059
+12.10590 3.34821
+12.11146 3.37583
+12.11688 3.40347
+12.12215 3.43113
+12.12728 3.45879
+12.13227 3.48647
+12.13712 3.51416
+12.14183 3.54185
+12.14640 3.56956
+12.15082 3.59728
+12.15511 3.62500
+12.15925 3.65274
+12.16326 3.68048
+12.16712 3.70822
+12.17084 3.73598
+12.17442 3.76374
+12.17786 3.79150
+12.18117 3.81927
+12.18433 3.84704
+12.18735 3.87482
+12.19023 3.90259
+12.19297 3.93037
+12.19557 3.95816
+12.19803 3.98594
+12.20035 4.01372
+12.20253 4.04150
+12.20457 4.06928
+12.20648 4.09706
+12.20824 4.12484
+12.20986 4.15261
+12.21135 4.18038
+12.21269 4.20815
+12.21390 4.23591
+12.21496 4.26367
+12.21589 4.29142
+12.21668 4.31917
+12.21733 4.34691
+12.21785 4.37464
+12.21822 4.40236
+12.21845 4.43007
+12.21855 4.45778
+12.21851 4.48547
+12.21833 4.51316
+12.21801 4.54083
+12.21756 4.56849
+12.21697 4.59614
+12.21624 4.62378
+12.21537 4.65140
+12.21436 4.67901
+12.21322 4.70661
+12.21194 4.73419
+12.21052 4.76175
+12.20897 4.78930
+12.20728 4.81683
+12.20545 4.84434
+12.20349 4.87184
+12.20139 4.89931
+12.19915 4.92677
+12.19677 4.95421
+12.19426 4.98162
+12.19162 5.00902
+12.18884 5.03639
+12.18592 5.06374
+12.18287 5.09107
+12.17968 5.11837
+12.17635 5.14565
+12.17289 5.17291
+12.16930 5.20014
+12.16557 5.22735
+12.16170 5.25452
+12.15771 5.28168
+12.15357 5.30880
+12.14930 5.33590
+12.14490 5.36296
+12.14036 5.39000
+12.13569 5.41701
+12.13089 5.44398
+12.12595 5.47093
+12.12087 5.49784
+12.11567 5.52473
+12.11033 5.55157
+12.10486 5.57839
+12.09925 5.60517
+12.09351 5.63192
+12.08764 5.65863
+12.08164 5.68530
+12.07550 5.71194
+12.06923 5.73855
+12.06283 5.76511
+12.05630 5.79164
+12.04963 5.81812
+12.04283 5.84457
+12.03591 5.87098
+12.02885 5.89735
+12.02166 5.92367
+12.01433 5.94996
+12.00688 5.97620
+11.99930 6.00240
+11.99159 6.02856
+11.98374 6.05467
+11.97577 6.08074
+11.96766 6.10676
+11.95943 6.13273
+11.95107 6.15866
+11.94257 6.18455
+11.93395 6.21038
+11.92520 6.23617
+11.91632 6.26191
+11.90731 6.28760
+11.89817 6.31323
+11.88891 6.33882
+11.87951 6.36436
+11.86999 6.38984
+11.86034 6.41528
+11.85057 6.44066
+11.84066 6.46599
+11.83063 6.49126
+11.82047 6.51648
+11.81019 6.54164
+11.79977 6.56675
+11.78923 6.59180
+11.77857 6.61679
+11.76778 6.64173
+11.75686 6.66660
+11.74582 6.69142
+11.73465 6.71618
+11.72336 6.74088
+11.71194 6.76552
+11.70040 6.79010
+11.68873 6.81462
+11.67694 6.83907
+11.66503 6.86346
+11.65299 6.88779
+11.64083 6.91205
+11.62854 6.93625
+11.61613 6.96038
+11.60360 6.98445
+11.59094 7.00845
+11.57816 7.03239
+11.56526 7.05626
+11.55224 7.08005
+11.53910 7.10378
+11.52583 7.12744
+11.51244 7.15104
+11.49894 7.17456
+11.48531 7.19800
+11.47156 7.22138
+11.45769 7.24469
+11.44370 7.26792
+11.42958 7.29108
+11.41535 7.31416
+11.40100 7.33717
+11.38653 7.36011
+11.37195 7.38296
+11.35724 7.40575
+11.34241 7.42845
+11.32747 7.45108
+11.31241 7.47363
+11.29723 7.49610
+11.28193 7.51849
+11.26651 7.54080
+11.25098 7.56303
+11.23533 7.58518
+11.21957 7.60725
+11.20369 7.62923
+11.18769 7.65113
+11.17157 7.67295
+11.15534 7.69469
+11.13900 7.71633
+11.12254 7.73790
+11.10597 7.75938
+11.08928 7.78077
+11.07247 7.80207
+11.05556 7.82329
+11.03853 7.84441
+11.02138 7.86545
+11.00412 7.88640
+10.98675 7.90726
+10.96927 7.92803
+10.95168 7.94870
+10.93397 7.96929
+10.91615 7.98978
+10.89822 8.01018
+10.88018 8.03048
+10.86202 8.05069
+10.84376 8.07081
+10.82538 8.09082
+10.80690 8.11075
+10.78831 8.13057
+10.76960 8.15030
+10.75079 8.16993
+10.73186 8.18946
+10.71283 8.20889
+10.69369 8.22822
+10.67444 8.24745
+10.65509 8.26658
+10.63562 8.28561
+10.61605 8.30453
+10.59637 8.32335
+10.57659 8.34207
+10.55670 8.36068
+10.53670 8.37919
+10.51659 8.39759
+10.49638 8.41589
+10.47607 8.43408
+10.45565 8.45216
+10.43512 8.47013
+10.41449 8.48799
+10.39376 8.50575
+10.37292 8.52339
+10.35198 8.54092
+10.33093 8.55834
+10.30979 8.57565
+10.28853 8.59285
+10.26718 8.60993
+10.24572 8.62689
+10.22417 8.64375
+10.20251 8.66048
+10.18074 8.67710
+10.15888 8.69361
+10.13692 8.70999
+10.11485 8.72626
+10.09269 8.74241
+10.07043 8.75844
+10.04806 8.77435
+10.02560 8.79013
+10.00304 8.80580
+9.98038 8.82134
+9.95762 8.83676
+9.93476 8.85206
+9.91180 8.86723
+9.88875 8.88227
+9.86560 8.89719
+9.84235 8.91199
+9.81900 8.92665
+9.79556 8.94119
+9.77202 8.95560
+9.74839 8.96988
+9.72466 8.98402
+9.70083 8.99804
+9.67691 9.01192
+9.65290 9.02568
+9.62879 9.03929
+9.60458 9.05278
+9.58028 9.06613
+9.55589 9.07934
+9.53141 9.09241
+9.50683 9.10535
+9.48215 9.11815
+9.45739 9.13081
+9.43253 9.14333
+9.40758 9.15571
+9.38254 9.16795
+9.35741 9.18005
+9.33218 9.19200
+9.30686 9.20381
+9.28146 9.21547
+9.25596 9.22699
+9.23037 9.23836
+9.20469 9.24959
+9.17892 9.26066
+9.15306 9.27159
+9.12712 9.28236
+9.10108 9.29299
+9.07495 9.30346
+9.04874 9.31378
+9.02243 9.32394
+8.99604 9.33395
+8.96956 9.34380
+8.94299 9.35350
+8.91633 9.36304
+8.88959 9.37242
+8.86276 9.38164
+8.83584 9.39069
+8.80883 9.39959
+8.78174 9.40832
+8.75456 9.41689
+8.72729 9.42529
+8.69994 9.43353
+8.67250 9.44160
+8.64498 9.44950
+8.61737 9.45723
+8.58967 9.46478
+8.56189 9.47217
+8.53402 9.47938
+8.50607 9.48642
+8.47803 9.49328
+8.44991 9.49997
+8.42170 9.50647
+8.39341 9.51280
+8.36503 9.51894
+8.33657 9.52490
+8.30802 9.53068
+8.27939 9.53627
+8.25067 9.54168
+8.22187 9.54690
+8.19298 9.55192
+8.16401 9.55676
+8.13496 9.56140
+8.10582 9.56585
+8.07659 9.57010
+8.04728 9.57416
+8.01789 9.57801
+7.98841 9.58167
+7.95884 9.58512
+7.92920 9.58836
+7.89946 9.59140
+7.86964 9.59423
+7.83974 9.59686
+7.80975 9.59926
+7.77967 9.60146
+7.74951 9.60344
+7.71926 9.60520
+7.68892 9.60674
+7.65850 9.60805
+7.62799 9.60914
+7.59740 9.61001
+7.56671 9.61064
+7.53594 9.61104
+7.50508 9.61121
+7.47413 9.61114
+7.44309 9.61083
+7.41196 9.61027
+7.38074 9.60947
+7.34943 9.60843
+7.31802 9.60713
+7.28653 9.60557
+7.25494 9.60376
+7.22326 9.60169
+7.19148 9.59935
+7.15960 9.59674
+7.12763 9.59386
+7.09557 9.59071
+7.06340 9.58728
+7.03113 9.58356
+6.99877 9.57955
+6.96630 9.57526
+6.93373 9.57066
+6.90105 9.56577
+6.86827 9.56057
+6.83538 9.55506
+6.80238 9.54923
+6.76926 9.54308
+6.73604 9.53660
+6.70270 9.52979
+6.66924 9.52264
+6.63567 9.51514
+6.60197 9.50729
+6.56815 9.49908
+6.53420 9.49050
+6.50012 9.48155
+6.46591 9.47221
+6.43156 9.46248
+6.39708 9.45235
+6.36244 9.44181
+6.32767 9.43084
+6.29274 9.41944
+6.25765 9.40761
+6.22240 9.39531
+6.18699 9.38255
+6.15141 9.36931
+6.11565 9.35557
+6.07970 9.34132
+6.04356 9.32654
+6.00722 9.31122
+5.97068 9.29533
+5.93392 9.27886
+5.89694 9.26179
+5.85972 9.24408
+5.82225 9.22573
+5.78452 9.20669
+5.74652 9.18694
+5.70822 9.16645
+5.66963 9.14518
+5.63071 9.12309
+5.59144 9.10015
+5.55181 9.07629
+5.51178 9.05147
+5.47133 9.02564
+5.43043 8.99871
+5.38904 8.97063
+5.34711 8.94130
+5.30460 8.91063
+5.26145 8.87850
+5.21760 8.84478
+5.17296 8.80932
+5.12744 8.77194
+5.08093 8.73241
+5.03329 8.69047
+4.98434 8.64578
+4.93386 8.59790
+4.88154 8.54628
+4.82698 8.49015
+4.76961 8.42843
+4.70857 8.35952
+4.64243 8.28078
+4.56857 8.18739
+4.48095 8.06825
+4.35469 7.87798
+4.24481 7.69069
+4.12202 7.45061
+4.04236 7.27224
+3.99228 7.14844
+3.95432 7.04733
+3.92342 6.95961
+3.89728 6.88103
+3.87460 6.80919
+3.85459 6.74262
+3.83671 6.68030
+3.82057 6.62151
+3.80591 6.56571
+3.79249 6.51251
+3.78015 6.46157
+3.76875 6.41263
+3.75819 6.36548
+3.74837 6.31994
+3.73922 6.27587
+3.73067 6.23313
+3.72266 6.19162
+3.71515 6.15124
+3.70810 6.11191
+3.70147 6.07355
+3.69522 6.03610
+3.68933 5.99951
+3.68378 5.96371
+3.67854 5.92867
+3.67358 5.89433
+3.66890 5.86067
+3.66447 5.82765
+3.66027 5.79523
+3.65631 5.76339
+3.65255 5.73209
+3.64900 5.70132
+3.64563 5.67105
+3.64245 5.64126
+3.63943 5.61193
+3.63658 5.58304
+3.63388 5.55458
+3.63133 5.52652
+3.62892 5.49885
+3.62664 5.47157
+3.62449 5.44464
+3.62246 5.41807
+3.62055 5.39184
+3.61875 5.36594
+3.61705 5.34036
+3.61546 5.31508
+3.61397 5.29011
+3.61257 5.26542
+3.61127 5.24101
+3.61005 5.21688
+3.60891 5.19302
+3.60786 5.16941
+3.60688 5.14605
+3.60598 5.12293
+3.60516 5.10006
+3.60440 5.07741
+3.60371 5.05499
+3.60309 5.03279
+3.60253 5.01081
+3.60203 4.98903
+3.60159 4.96746
+3.60121 4.94609
+3.60088 4.92491
+3.60061 4.90392
+3.60039 4.88312
+3.60022 4.86250
+3.60010 4.84206
+3.60003 4.82179
+3.60000 4.80169
+3.60002 4.78176
+3.60008 4.76199
+3.60019 4.74238
+3.60033 4.72293
+3.60052 4.70363
+3.60074 4.68449
+3.60100 4.66549
+3.60130 4.64663
+3.60164 4.62792
+3.60201 4.60934
+3.60241 4.59091
+3.60285 4.57260
+3.60332 4.55443
+3.60382 4.53639
+3.60435 4.51848
+3.60492 4.50069
+3.60551 4.48302
+3.60613 4.46547
+3.60677 4.44805
+3.60745 4.43074
+3.60815 4.41354
+3.60888 4.39646
+3.60963 4.37948
+3.61041 4.36262
+3.61121 4.34586
+3.61203 4.32921
+3.61288 4.31266
+3.61375 4.29622
+3.61464 4.27987
+3.61556 4.26363
+3.61649 4.24748
+3.61745 4.23143
+3.61843 4.21547
+3.61942 4.19961
+3.62044 4.18384
+3.62147 4.16816
+3.62253 4.15256
+3.62360 4.13706
+3.62469 4.12164
+3.62579 4.10631
+3.62692 4.09106
+3.62806 4.07590
+3.62922 4.06082
+3.63039 4.04582
+3.63158 4.03089
+3.63278 4.01605
+3.63400 4.00129
+3.63524 3.98660
+3.63649 3.97198
+3.63775 3.95744
+3.63903 3.94298
+3.64033 3.92858
+3.64163 3.91426
+3.64295 3.90001
+3.64429 3.88583
+3.64563 3.87172
+3.64699 3.85767
+3.64836 3.84370
+3.64975 3.82979
+3.65115 3.81594
+3.65255 3.80216
+3.65397 3.78844
+3.65541 3.77479
+3.65685 3.76120
+3.65830 3.74767
+3.65977 3.73420
+3.66125 3.72079
+3.66273 3.70744
+3.66423 3.69415
+3.66574 3.68092
+3.66726 3.66774
+3.66879 3.65463
+3.67033 3.64156
+3.67188 3.62856
+3.67343 3.61560
+3.67500 3.60270
+3.67658 3.58986
+3.67817 3.57707
+3.67976 3.56433
+3.68137 3.55164
+3.68298 3.53900
+3.68461 3.52641
+3.68624 3.51388
+3.68788 3.50139
+3.68953 3.48895
+3.69118 3.47656
+3.69285 3.46422
+3.69452 3.45192
+3.69620 3.43967
+3.69789 3.42747
+3.69959 3.41532
+3.70130 3.40320
+3.70301 3.39114
+3.70473 3.37912
+3.70646 3.36714
+3.70820 3.35520
+3.70994 3.34331
+3.71169 3.33146
+3.71345 3.31965
+3.71522 3.30789
+3.71699 3.29616
+3.71877 3.28448
+3.72056 3.27283
+3.72235 3.26123
+3.72415 3.24966
+3.72596 3.23814
+3.72778 3.22665
+3.72960 3.21520
+3.73142 3.20379
+3.73326 3.19242
+3.73510 3.18108
+3.73695 3.16978
+3.73880 3.15852
+3.74066 3.14729
+3.74253 3.13610
+3.74440 3.12494
+3.74628 3.11382
+3.74817 3.10274
+3.75006 3.09168
+3.75196 3.08067
+3.75386 3.06968
+3.75577 3.05873
+3.75769 3.04781
+3.75961 3.03692
+3.76154 3.02607
+3.76347 3.01525
+3.76541 3.00446
+3.76736 2.99370
+3.76931 2.98297
+3.77127 2.97227
+3.77323 2.96160
+3.77520 2.95097
+3.77718 2.94036
+3.77916 2.92978
+3.78115 2.91923
+3.78314 2.90871
+3.78514 2.89822
+3.78714 2.88776
+3.78915 2.87733
+3.79116 2.86692
+3.79318 2.85654
+3.79521 2.84619
+3.79724 2.83586
+3.79928 2.82557
+3.80132 2.81529
+3.80337 2.80505
+3.80542 2.79483
+3.80748 2.78464
+3.80954 2.77447
+3.81161 2.76433
+3.81369 2.75421
+3.81577 2.74412
+3.81786 2.73405
+3.81995 2.72401
+3.82204 2.71399
+3.82415 2.70399
+3.82625 2.69402
+3.82837 2.68407
+3.83049 2.67414
+3.83261 2.66424
+3.83474 2.65436
+3.83687 2.64451
+3.83901 2.63467
+3.84116 2.62486
+3.84331 2.61507
+3.84547 2.60530
+3.84763 2.59555
+3.84979 2.58582
+3.85197 2.57612
+3.85414 2.56643
+3.85633 2.55677
+3.85852 2.54713
+3.86071 2.53750
+3.86291 2.52790
+3.86511 2.51832
+3.86732 2.50875
+3.86954 2.49921
+3.87176 2.48968
+3.87399 2.48018
+3.87622 2.47069
+3.87846 2.46122
+3.88070 2.45177
+3.88295 2.44234
+3.88520 2.43293
+3.88746 2.42353
+3.88973 2.41415
+3.89200 2.40479
+3.89427 2.39545
+3.89656 2.38613
+3.89884 2.37682
+3.90114 2.36753
+3.90343 2.35825
+3.90574 2.34900
+3.90805 2.33975
+3.91036 2.33053
+3.91268 2.32132
+3.91501 2.31213
+3.91734 2.30295
+3.91968 2.29379
+3.92203 2.28464
+3.92438 2.27551
+3.92673 2.26640
+3.92909 2.25729
+3.93146 2.24821
+3.93383 2.23914
+3.93621 2.23008
+3.93860 2.22104
+3.94099 2.21201
+3.94339 2.20299
+3.94579 2.19399
+3.94820 2.18501
+3.95061 2.17603
+3.95303 2.16707
+3.95546 2.15813
+3.95790 2.14919
+3.96033 2.14027
+3.96278 2.13137
+3.96523 2.12247
+3.96769 2.11359
+3.97016 2.10472
+3.97263 2.09586
+3.97510 2.08702
+3.97759 2.07818
+3.98008 2.06936
+3.98257 2.06055
+3.98508 2.05175
+3.98759 2.04297
+3.99010 2.03419
+3.99263 2.02543
+3.99515 2.01667
+3.99769 2.00793
+4.00023 1.99920
+4.00278 1.99048
+4.00534 1.98177
+4.00790 1.97307
+4.01047 1.96438
+4.01305 1.95570
+4.01563 1.94703
+4.01822 1.93837
+4.02082 1.92972
+4.02343 1.92108
+4.02604 1.91245
+4.02866 1.90382
+4.03128 1.89521
+4.03392 1.88661
+4.03656 1.87801
+4.03921 1.86943
+4.04186 1.86085
+4.04453 1.85228
+4.04720 1.84372
+4.04987 1.83517
+4.05256 1.82663
+4.05525 1.81809
+4.05795 1.80956
+4.06066 1.80104
+4.06338 1.79253
+4.06610 1.78403
+4.06884 1.77553
+4.07158 1.76704
+4.07433 1.75856
+4.07708 1.75008
+4.07985 1.74162
+4.08262 1.73315
+4.08540 1.72470
+4.08819 1.71625
+4.09099 1.70781
+4.09379 1.69938
+4.09661 1.69095
+4.09943 1.68252
+4.10226 1.67411
+4.10511 1.66570
+4.10795 1.65729
+4.11081 1.64889
+4.11368 1.64050
+4.11656 1.63211
+4.11944 1.62373
+4.12233 1.61535
+4.12524 1.60698
+4.12815 1.59861
+4.13107 1.59025
+4.13400 1.58189
+4.13694 1.57354
+4.13989 1.56519
+4.14285 1.55685
+4.14582 1.54851
+4.14880 1.54017
+4.15179 1.53184
+4.15479 1.52351
+4.15780 1.51519
+4.16082 1.50687
+4.16385 1.49856
+4.16689 1.49024
+4.16994 1.48193
+4.17300 1.47363
+4.17607 1.46533
+4.17915 1.45703
+4.18224 1.44873
+4.18534 1.44043
+4.18846 1.43214
+4.19158 1.42386
+4.19472 1.41557
+4.19786 1.40729
+4.20102 1.39900
+4.20419 1.39072
+4.20737 1.38245
+4.21056 1.37417
+4.21377 1.36590
+4.21698 1.35763
+4.22021 1.34936
+4.22345 1.34109
+4.22670 1.33282
+4.22997 1.32455
+4.23324 1.31629
+4.23653 1.30803
+4.23983 1.29976
+4.24314 1.29150
+4.24647 1.28324
+4.24981 1.27498
+4.25316 1.26672
+4.25653 1.25846
+4.25991 1.25020
+4.26330 1.24194
+4.26670 1.23368
+4.27012 1.22542
+4.27355 1.21715
+4.27700 1.20889
+4.28046 1.20063
+4.28393 1.19237
+4.28742 1.18411
+4.29093 1.17584
+4.29444 1.16758
+4.29798 1.15931
+4.30152 1.15104
+4.30509 1.14278
+4.30866 1.13451
+4.31225 1.12623
+4.31586 1.11796
+4.31949 1.10969
+4.32313 1.10141
+4.32678 1.09313
+4.33045 1.08485
+4.33414 1.07656
+4.33784 1.06828
+4.34156 1.05999
+4.34530 1.05170
+4.34905 1.04340
+4.35282 1.03510
+4.35661 1.02680
+4.36042 1.01850
+4.36424 1.01019
+4.36808 1.00188
+4.37194 0.99357
+4.37582 0.98525
+4.37972 0.97693
+4.38363 0.96860
+4.38756 0.96027
+4.39151 0.95193
+4.39549 0.94360
+4.39948 0.93525
+4.40349 0.92690
+4.40752 0.91855
+4.41157 0.91019
+4.41564 0.90183
+4.41973 0.89346
+4.42384 0.88508
+4.42798 0.87670
+4.43213 0.86832
+4.43631 0.85993
+4.44050 0.85153
+4.44472 0.84313
+4.44896 0.83472
+4.45323 0.82630
+4.45752 0.81788
+4.46183 0.80945
+4.46616 0.80101
+4.47052 0.79257
+4.47490 0.78412
+4.47930 0.77566
+4.48373 0.76719
+4.48819 0.75872
+4.49267 0.75024
+4.49717 0.74175
+4.50171 0.73325
+4.50626 0.72474
+4.51085 0.71623
+4.51546 0.70770
+4.52009 0.69917
+4.52476 0.69063
+4.52945 0.68208
+4.53417 0.67352
+4.53892 0.66495
+4.54370 0.65637
+4.54851 0.64778
+4.55334 0.63918
+4.55821 0.63057
+4.56311 0.62195
+4.56804 0.61332
+4.57300 0.60467
+4.57799 0.59602
+4.58302 0.58735
+4.58807 0.57868
+4.59316 0.56999
+4.59828 0.56129
+4.60344 0.55258
+4.60863 0.54385
+4.61386 0.53512
+4.61912 0.52637
+4.62442 0.51760
+4.62976 0.50883
+4.63513 0.50004
+4.64054 0.49123
+4.64599 0.48242
+4.65148 0.47358
+4.65700 0.46474
+4.66257 0.45588
+4.66818 0.44700
+4.67383 0.43811
+4.67952 0.42921
+4.68525 0.42028
+4.69103 0.41135
+4.69685 0.40239
+4.70271 0.39342
+4.70862 0.38444
+4.71458 0.37543
+4.72058 0.36641
+4.72664 0.35737
+4.73274 0.34831
+4.73889 0.33924
+4.74509 0.33014
+4.75134 0.32103
+4.75764 0.31190
+4.76399 0.30275
+4.77040 0.29358
+4.77687 0.28439
+4.78339 0.27518
+4.78996 0.26594
+4.79660 0.25669
+4.80329 0.24742
+4.81005 0.23812
+4.81686 0.22880
+4.82374 0.21946
+4.83068 0.21009
+4.83768 0.20071
+4.84475 0.19129
+4.85189 0.18186
+4.85910 0.17240
+4.86637 0.16291
+4.87372 0.15340
+4.88114 0.14386
+4.88863 0.13430
+4.89621 0.12470
+4.90385 0.11509
+4.91158 0.10544
+4.91939 0.09576
+4.92728 0.08606
+4.93526 0.07633
+4.94332 0.06656
+4.95147 0.05677
+4.95971 0.04694
+4.96804 0.03708
+4.97647 0.02719
+4.98500 0.01727
+4.99362 0.00731
+5.00235 -0.00268
+5.01118 -0.01271
+5.02012 -0.02277
+5.02916 -0.03287
+5.03832 -0.04301
+5.04760 -0.05318
+5.05699 -0.06340
+5.06650 -0.07365
+5.07614 -0.08395
+5.08591 -0.09428
+5.09581 -0.10466
+5.10584 -0.11508
+5.11602 -0.12555
+5.12634 -0.13606
+5.13680 -0.14662
+5.14742 -0.15723
+5.15820 -0.16789
+5.16914 -0.17859
+5.18024 -0.18935
+5.19152 -0.20016
+5.20298 -0.21102
+5.21462 -0.22194
+5.22645 -0.23292
+5.23848 -0.24395
+5.25071 -0.25505
+5.26316 -0.26620
+5.27582 -0.27742
+5.28872 -0.28871
+5.30185 -0.30006
+5.31523 -0.31149
+5.32886 -0.32298
+5.34276 -0.33455
+5.35694 -0.34620
+5.37141 -0.35792
+5.38619 -0.36973
+5.40128 -0.38162
+5.41670 -0.39360
+5.43248 -0.40567
+5.44862 -0.41783
+5.46514 -0.43009
+5.48207 -0.44246
+5.49943 -0.45493
+5.51724 -0.46752
+5.53553 -0.48022
+5.55433 -0.49305
+5.57367 -0.50600
+5.59359 -0.51909
+5.61412 -0.53232
+5.63530 -0.54570
+5.65720 -0.55925
+5.67986 -0.57296
+5.70334 -0.58685
+5.72773 -0.60094
+5.75309 -0.61524
+5.77952 -0.62976
+5.80714 -0.64452
+5.83607 -0.65955
+5.86648 -0.67488
+5.89854 -0.69052
+5.93249 -0.70652
+5.96862 -0.72294
+6.00730 -0.73982
+6.04901 -0.75724
+6.09440 -0.77530
+6.14442 -0.79416
+6.20046 -0.81401
+6.26480 -0.83521
+6.34164 -0.85836
+6.44070 -0.88489
+6.60174 -0.92047
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001.mp
new file mode 100644
index 0000000000..5bb0ab195c
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/cubiques/K001.mp
@@ -0,0 +1,71 @@
+input geom2d;
+gddU := 0.5cm;
+labeloffset := 8pt;
+gddTailleLabel := 1;
+
+beginfig(1);
+ A := Point(3.6,4.8);
+ B := Point(0,0);
+ C := Point(10,0);
+ T := Triangle(A,B,C);
+ X_74 := Point(3.6,-4.8);
+
+ C1 := CourbeDat("K001-1",0);
+ C2 := CourbeDat("K001-2",1);
+
+ CE1 := CercleExinscrit(T,1);
+ CE2 := CercleExinscrit(T,2);
+ CE3 := CercleExinscrit(T,3);
+ I_1 := Centre(CE1);
+ I_2 := Centre(CE2);
+ I_3 := Centre(CE3);
+ CC := CercleCirconscrit(T);
+ O := Centre(CC);
+
+ drawoptions(withcolor LightBlue);
+ trace Droite(A,B);
+ trace Droite(B,C);
+ trace Droite(C,A);
+ trace Droite(I_1,I_2);
+ trace Droite(I_2,I_3);
+ trace Droite(I_3,I_1);
+ trace CE1;
+ trace CE2;
+ trace CE3;
+ trace CC;
+ colorie T withcolor LightGrey;
+ drawoptions(withpen pencircle scaled 1.5);
+ trace T;
+ drawoptions(withcolor DodgerBlue withpen pencircle scaled 1.5);
+ trace Droite(O,A);
+ trace Droite(X_74, Point(2.2,0));
+ drawoptions(withpen pencircle scaled 2);
+ trace C1 withcolor FireBrick;
+ trace C2 withcolor FireBrick;
+ drawoptions(withcolor Olive);
+ trace Droite(A,X_74);
+ trace Droite(B,X_74);
+ trace Droite(C,X_74);
+ drawoptions();
+ pointe A;
+ pointe B;
+ pointe C;
+ pointe I_1;
+ pointe I_2;
+ pointe I_3;
+ pointe O;
+ pointe X_74;
+
+ marque.urt "A";
+ marque.llft "B";
+ marque.lrt "C";
+ marque.rt "I_1";
+ marque.rt "I_2";
+ marque.lft "I_3";
+ marque.bot "O";
+ marque.llft "X_74";
+
+ Fenetre(-4,-13,16,15);
+endfig;
+
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/brach-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/brach-1.pdf
new file mode 100644
index 0000000000..afeb4adb35
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/brach-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/brach.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/brach.mp
new file mode 100644
index 0000000000..12bdb994c3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/brach.mp
@@ -0,0 +1,54 @@
+input geom2d;
+
+color darkred,darkblue;
+darkred=(.6,0,0);
+darkblue=(0,0,.6);
+
+labeloffset := 6;
+gddTaillePoint := 3;
+gddCouleurPoint := (1,1,1);
+
+
+% la cycloide
+vardef f(expr t)=
+ t-sin(t)
+enddef;
+vardef g(expr t)=
+ cos(t)-1
+enddef;
+
+
+beginfig(1);
+ Repere(6,4,1,3,1,1);
+ Axes;
+ Debut;
+ Axes;
+ Graduations; Unites(2);
+
+ A = Point(0,0);
+ B = Point(f(3),g(3));
+ C = Point(2.4,-1);
+ M = Point(f(2.4),g(2.4));
+ N = Point(2.4,0);
+ C1 = Cercle(C,1);
+ trace Arc(C,.3,Pi/2,Pi/2+2.4);
+ trace Droite((2.4,0),C) dashed evenly;
+ trace Courbe(f,g,0,3,500) withcolor darkred withpen pencircle scaled 1pt;
+ trace Courbe(f,g,3,4.5,100) dashed evenly;
+ trace Courbe(f,g,-2,0,100) dashed evenly;
+ trace C1;
+ trace Segment(C,M);
+ trace Arc(C,1,Pi/2,Pi/2+2.4) withcolor darkblue withpen pencircle scaled .7pt;
+ trace Segment(A,N) withcolor darkblue withpen pencircle scaled .7pt;
+
+ marque.rt "C";
+ marque.llft "M";
+ pointe(N);
+ label.urt(textext("$N$"),PtR(N));
+ label.ulft(textext("$\theta$"),PtR(C)+.2*gddU*(cos(Pi/2+1.2),sin(Pi/2+1.2)));
+ gddCouleurPoint := Yellow;
+ marque.urt "A";
+ marque.llft "B";
+ Fin;
+endfig;
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/divers-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/divers-1.pdf
new file mode 100644
index 0000000000..2605afcf7d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/divers-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/divers.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/divers.mp
new file mode 100644
index 0000000000..ec691d5e5e
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/divers.mp
@@ -0,0 +1,14 @@
+input geom2d;
+
+beginfig(1);
+
+A = Point(2,2);
+B = Rotation(A,Pi/2);
+pointe origine;
+pointe A;
+pointe B;
+C = RotationCentre(B,A,Pi/2);
+pointe C;
+
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/epicycloide-const-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/epicycloide-const-1.pdf
new file mode 100644
index 0000000000..141ce02802
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/epicycloide-const-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/epicycloide-const.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/epicycloide-const.mp
new file mode 100644
index 0000000000..5b743ff695
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/epicycloide-const.mp
@@ -0,0 +1,66 @@
+input geom2d;
+input geom2d-rep;
+input geom2d-lbl;
+input geom2d-tra;
+input geom2d-fct;
+input geom2d-plt;
+input geom2d-arc;
+input svgnames;
+
+lblPreambule := "\usepackage[frenchb]{babel}" &
+ "\usepackage[garamond]{mathdesign}" &
+ "\usepackage{amsmath}";
+
+labeloffset := 4;
+gddU:=1.3cm;
+
+def avecCrayon(expr t,c) = withpen pencircle scaled t withcolor c enddef;
+
+beginfig(1);
+
+ Repere(10,10,5,4,3,3);
+ Axes;
+ Debut;
+ Graduations;
+ Axes;
+ ColorieAvecTransparence(Cercle(origine,1),LightSlateGrey,0.5);
+ trace Cercle(origine,1) avecCrayon(1.5,LightSlateGrey);
+
+ trace Cercle(4/3(cosd(130),sind(130)),1/3);
+
+ drawoptions(withcolor LightSlateGrey);
+ trace Cercle((0,4/3),1/3);
+
+ centre = Point(4/3cosd(130),4/3sind(130));
+ mobile = Point(4/3cosd(130)+1/3cosd(70),4/3sind(130)+1/3sind(70));
+
+ trace (0,0)--Pt(centre)--Pt(mobile) dashed evenly;
+
+ trace Arc(centre,1/3,-5Pi/18,7Pi/18) avecCrayon(1,DodgerBlue);
+ trace Arc(origine,1,Pi/2,13Pi/18) avecCrayon(1,DodgerBlue);
+ fleche Arc(centre,1/6,-5Pi/18,7Pi/18);
+ fleche Arc(origine,1/3,Pi/2,13Pi/18);
+
+ pointe Point(0,4/3);
+ pointe centre;
+ pointe Point(0,0);
+ pointe Point(cosd(130),sind(130));
+
+ gddCouleurPoint := Crimson;
+
+ pointe Point(0,1);
+ pointe mobile;
+
+ drawoptions(withcolor black);
+
+ label.lrt(TEX("\(O\)"),PtR(origine));
+ label.ulft(TEX("\(\Omega(\theta)\)"),PtR(centre));
+ label.urt(TEX("\(M(\theta)\)"),PtR(mobile));
+ label.top(TEX("\(\theta\)"),(1/3cos(11Pi/18),1/3sin(11Pi/18)) gddEnPlace);
+ label.rt(TEX("\(3\theta\)"),PtR(Addition(centre,(1/6,0))));
+ label.bot(TEX("\(N(\theta)\)"),(cos(13Pi/18),sin(13Pi/18)) gddEnPlace);
+ Fin;
+
+endfig;
+
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/pascalline-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/pascalline-1.pdf
new file mode 100644
index 0000000000..f08d33ee17
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/pascalline-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/pascalline.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/pascalline.mp
new file mode 100644
index 0000000000..f7471da779
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/pascalline.mp
@@ -0,0 +1,28 @@
+input geom2d;
+
+beginfig(1);
+C = Cercle(origine,3);
+for i:=1 upto 6:
+ rd := uniformdeviate(1.0/6)+(i-1)/6;
+ P[i] := PointDe(C,rd);
+endfor;
+D1 = Droite(P1,P3); S1 = Segment(P1,P3);
+D2 = Droite(P3,P5); S2 = Segment(P3,P5);
+D3 = Droite(P6,P2); S3 = Segment(P6,P2);
+D4 = Droite(P4,P6); S4 = Segment(P4,P6);
+D5 = Droite(P5,P2); S5 = Segment(P5,P2);
+D6 = Droite(P1,P4); S6 = Segment(P1,P4);
+I1 = IntersectionDroites(D1,D3);
+I2 = IntersectionDroites(D2,D4);
+I3 = IntersectionDroites(D5,D6);
+PL = Segment(I1,I2);
+trace C;
+drawoptions(withcolor (0.7,0.1,0.1));
+trace S1; trace S2; trace S3; trace S4; trace S5; trace S6;
+drawoptions(withcolor (0.1,0.7,0.1));
+trace PL;
+drawoptions();
+pointe(P1); pointe P2; pointe P3; pointe P4; pointe P5; pointe P6;
+pointe I1; pointe I2; pointe I3;
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point-0.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point-0.pdf
new file mode 100644
index 0000000000..9256dd2d2d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point-0.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point.0 b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point.0
new file mode 100644
index 0000000000..a620b964b9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point.0
@@ -0,0 +1,446 @@
+%!PS
+%%BoundingBox: 26 15 144 99
+%%HiResBoundingBox: 26.3517 15.35753 143.727 98.02957
+%%Creator: MetaPost 2.10
+%%CreationDate: 2024.05.27:1529
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 141.73225 28.34602 moveto
+145.4914 35.8643 143.12198 46.06082 135.14781 56.69247 curveto
+127.17451 67.32455 114.24915 77.52065 99.21259 85.03893 curveto
+84.17601 92.5572 68.26358 96.78001 54.97446 96.77959 curveto
+41.68446 96.78044 32.10559 92.55806 28.34645 85.03978 curveto
+24.58731 77.5215 26.95673 67.32498 34.9309 56.69333 curveto
+42.90419 46.06125 55.82956 35.86516 70.86613 28.34688 curveto
+85.9027 20.8286 101.81512 16.60579 115.10425 16.60622 curveto
+128.39424 16.60536 137.97311 20.82774 141.73225 28.34602 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 143.23225 28.34602 moveto
+143.23225 28.74387 143.07419 29.12537 142.7929 29.40666 curveto
+142.5116 29.68796 142.1301 29.84602 141.73225 29.84602 curveto
+141.33441 29.84602 140.95291 29.68796 140.67162 29.40666 curveto
+140.39032 29.12537 140.23225 28.74387 140.23225 28.34602 curveto
+140.23225 27.94818 140.39032 27.56668 140.67162 27.28539 curveto
+140.95291 27.00409 141.33441 26.84602 141.73225 26.84602 curveto
+142.1301 26.84602 142.5116 27.00409 142.7929 27.28539 curveto
+143.07419 27.56668 143.23225 27.94818 143.23225 28.34602 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 143.23225 28.34602 moveto
+143.23225 28.74387 143.07419 29.12537 142.7929 29.40666 curveto
+142.5116 29.68796 142.1301 29.84602 141.73225 29.84602 curveto
+141.33441 29.84602 140.95291 29.68796 140.67162 29.40666 curveto
+140.39032 29.12537 140.23225 28.74387 140.23225 28.34602 curveto
+140.23225 27.94818 140.39032 27.56668 140.67162 27.28539 curveto
+140.95291 27.00409 141.33441 26.84602 141.73225 26.84602 curveto
+142.1301 26.84602 142.5116 27.00409 142.7929 27.28539 curveto
+143.07419 27.56668 143.23225 27.94818 143.23225 28.34602 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 140.75471 50.38484 moveto
+140.75471 50.78268 140.59665 51.16418 140.31535 51.44548 curveto
+140.03406 51.72678 139.65256 51.88484 139.25471 51.88484 curveto
+138.85687 51.88484 138.47537 51.72678 138.19408 51.44548 curveto
+137.91278 51.16418 137.75471 50.78268 137.75471 50.38484 curveto
+137.75471 49.987 137.91278 49.6055 138.19408 49.3242 curveto
+138.47537 49.04291 138.85687 48.88484 139.25471 48.88484 curveto
+139.65256 48.88484 140.03406 49.04291 140.31535 49.3242 curveto
+140.59665 49.6055 140.75471 49.987 140.75471 50.38484 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 140.75471 50.38484 moveto
+140.75471 50.78268 140.59665 51.16418 140.31535 51.44548 curveto
+140.03406 51.72678 139.65256 51.88484 139.25471 51.88484 curveto
+138.85687 51.88484 138.47537 51.72678 138.19408 51.44548 curveto
+137.91278 51.16418 137.75471 50.78268 137.75471 50.38484 curveto
+137.75471 49.987 137.91278 49.6055 138.19408 49.3242 curveto
+138.47537 49.04291 138.85687 48.88484 139.25471 48.88484 curveto
+139.65256 48.88484 140.03406 49.04291 140.31535 49.3242 curveto
+140.59665 49.6055 140.75471 49.987 140.75471 50.38484 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 117.55756 74.87787 moveto
+117.55756 75.27571 117.39949 75.65721 117.1182 75.9385 curveto
+116.8369 76.2198 116.4554 76.37787 116.05756 76.37787 curveto
+115.65971 76.37787 115.27821 76.2198 114.99692 75.9385 curveto
+114.71562 75.65721 114.55756 75.27571 114.55756 74.87787 curveto
+114.55756 74.48003 114.71562 74.09853 114.99692 73.81723 curveto
+115.27821 73.53593 115.65971 73.37787 116.05756 73.37787 curveto
+116.4554 73.37787 116.8369 73.53593 117.1182 73.81723 curveto
+117.39949 74.09853 117.55756 74.48003 117.55756 74.87787 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 117.55756 74.87787 moveto
+117.55756 75.27571 117.39949 75.65721 117.1182 75.9385 curveto
+116.8369 76.2198 116.4554 76.37787 116.05756 76.37787 curveto
+115.65971 76.37787 115.27821 76.2198 114.99692 75.9385 curveto
+114.71562 75.65721 114.55756 75.27571 114.55756 74.87787 curveto
+114.55756 74.48003 114.71562 74.09853 114.99692 73.81723 curveto
+115.27821 73.53593 115.65971 73.37787 116.05756 73.37787 curveto
+116.4554 73.37787 116.8369 73.53593 117.1182 73.81723 curveto
+117.39949 74.09853 117.55756 74.48003 117.55756 74.87787 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 82.46533 92.42181 moveto
+82.46533 92.81966 82.30727 93.20116 82.02597 93.48245 curveto
+81.74467 93.76375 81.36317 93.92181 80.96533 93.92181 curveto
+80.56749 93.92181 80.18599 93.76375 79.9047 93.48245 curveto
+79.6234 93.20116 79.46533 92.81966 79.46533 92.42181 curveto
+79.46533 92.02397 79.6234 91.64247 79.9047 91.36118 curveto
+80.18599 91.07988 80.56749 90.92181 80.96533 90.92181 curveto
+81.36317 90.92181 81.74467 91.07988 82.02597 91.36118 curveto
+82.30727 91.64247 82.46533 92.02397 82.46533 92.42181 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 82.46533 92.42181 moveto
+82.46533 92.81966 82.30727 93.20116 82.02597 93.48245 curveto
+81.74467 93.76375 81.36317 93.92181 80.96533 93.92181 curveto
+80.56749 93.92181 80.18599 93.76375 79.9047 93.48245 curveto
+79.6234 93.20116 79.46533 92.81966 79.46533 92.42181 curveto
+79.46533 92.02397 79.6234 91.64247 79.9047 91.36118 curveto
+80.18599 91.07988 80.56749 90.92181 80.96533 90.92181 curveto
+81.36317 90.92181 81.74467 91.07988 82.02597 91.36118 curveto
+82.30727 91.64247 82.46533 92.02397 82.46533 92.42181 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 48.95618 96.27957 moveto
+48.95618 96.67741 48.79811 97.05891 48.51682 97.34021 curveto
+48.23552 97.6215 47.85402 97.77957 47.45618 97.77957 curveto
+47.05833 97.77957 46.67683 97.6215 46.39554 97.34021 curveto
+46.11424 97.05891 45.95618 96.67741 45.95618 96.27957 curveto
+45.95618 95.88173 46.11424 95.50023 46.39554 95.21893 curveto
+46.67683 94.93764 47.05833 94.77957 47.45618 94.77957 curveto
+47.85402 94.77957 48.23552 94.93764 48.51682 95.21893 curveto
+48.79811 95.50023 48.95618 95.88173 48.95618 96.27957 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 48.95618 96.27957 moveto
+48.95618 96.67741 48.79811 97.05891 48.51682 97.34021 curveto
+48.23552 97.6215 47.85402 97.77957 47.45618 97.77957 curveto
+47.05833 97.77957 46.67683 97.6215 46.39554 97.34021 curveto
+46.11424 97.05891 45.95618 96.67741 45.95618 96.27957 curveto
+45.95618 95.88173 46.11424 95.50023 46.39554 95.21893 curveto
+46.67683 94.93764 47.05833 94.77957 47.45618 94.77957 curveto
+47.85402 94.77957 48.23552 94.93764 48.51682 95.21893 curveto
+48.79811 95.50023 48.95618 95.88173 48.95618 96.27957 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 29.84386 85.03459 moveto
+29.84386 85.43243 29.68579 85.81393 29.4045 86.09523 curveto
+29.1232 86.37653 28.7417 86.53459 28.34386 86.53459 curveto
+27.94601 86.53459 27.56451 86.37653 27.28322 86.09523 curveto
+27.00192 85.81393 26.84386 85.43243 26.84386 85.03459 curveto
+26.84386 84.63675 27.00192 84.25525 27.28322 83.97395 curveto
+27.56451 83.69266 27.94601 83.53459 28.34386 83.53459 curveto
+28.7417 83.53459 29.1232 83.69266 29.4045 83.97395 curveto
+29.68579 84.25525 29.84386 84.63675 29.84386 85.03459 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 29.84386 85.03459 moveto
+29.84386 85.43243 29.68579 85.81393 29.4045 86.09523 curveto
+29.1232 86.37653 28.7417 86.53459 28.34386 86.53459 curveto
+27.94601 86.53459 27.56451 86.37653 27.28322 86.09523 curveto
+27.00192 85.81393 26.84386 85.43243 26.84386 85.03459 curveto
+26.84386 84.63675 27.00192 84.25525 27.28322 83.97395 curveto
+27.56451 83.69266 27.94601 83.53459 28.34386 83.53459 curveto
+28.7417 83.53459 29.1232 83.69266 29.4045 83.97395 curveto
+29.68579 84.25525 29.84386 84.63675 29.84386 85.03459 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 32.3279 62.99316 moveto
+32.3279 63.391 32.16983 63.7725 31.88853 64.0538 curveto
+31.60724 64.3351 31.22574 64.49316 30.8279 64.49316 curveto
+30.43005 64.49316 30.04855 64.3351 29.76726 64.0538 curveto
+29.48596 63.7725 29.3279 63.391 29.3279 62.99316 curveto
+29.3279 62.59532 29.48596 62.21382 29.76726 61.93253 curveto
+30.04855 61.65123 30.43005 61.49316 30.8279 61.49316 curveto
+31.22574 61.49316 31.60724 61.65123 31.88853 61.93253 curveto
+32.16983 62.21382 32.3279 62.59532 32.3279 62.99316 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 32.3279 62.99316 moveto
+32.3279 63.391 32.16983 63.7725 31.88853 64.0538 curveto
+31.60724 64.3351 31.22574 64.49316 30.8279 64.49316 curveto
+30.43005 64.49316 30.04855 64.3351 29.76726 64.0538 curveto
+29.48596 63.7725 29.3279 63.391 29.3279 62.99316 curveto
+29.3279 62.59532 29.48596 62.21382 29.76726 61.93253 curveto
+30.04855 61.65123 30.43005 61.49316 30.8279 61.49316 curveto
+31.22574 61.49316 31.60724 61.65123 31.88853 61.93253 curveto
+32.16983 62.21382 32.3279 62.59532 32.3279 62.99316 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 55.53067 38.50102 moveto
+55.53067 38.89886 55.3726 39.28036 55.09131 39.56166 curveto
+54.81001 39.84296 54.42851 40.00102 54.03067 40.00102 curveto
+53.63283 40.00102 53.25133 39.84296 52.97003 39.56166 curveto
+52.68874 39.28036 52.53067 38.89886 52.53067 38.50102 curveto
+52.53067 38.10318 52.68874 37.72168 52.97003 37.44038 curveto
+53.25133 37.15909 53.63283 37.00102 54.03067 37.00102 curveto
+54.42851 37.00102 54.81001 37.15909 55.09131 37.44038 curveto
+55.3726 37.72168 55.53067 38.10318 55.53067 38.50102 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 55.53067 38.50102 moveto
+55.53067 38.89886 55.3726 39.28036 55.09131 39.56166 curveto
+54.81001 39.84296 54.42851 40.00102 54.03067 40.00102 curveto
+53.63283 40.00102 53.25133 39.84296 52.97003 39.56166 curveto
+52.68874 39.28036 52.53067 38.89886 52.53067 38.50102 curveto
+52.53067 38.10318 52.68874 37.72168 52.97003 37.44038 curveto
+53.25133 37.15909 53.63283 37.00102 54.03067 37.00102 curveto
+54.42851 37.00102 54.81001 37.15909 55.09131 37.44038 curveto
+55.3726 37.72168 55.53067 38.10318 55.53067 38.50102 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 90.62419 20.96053 moveto
+90.62419 21.35837 90.46613 21.73987 90.18483 22.02116 curveto
+89.90353 22.30246 89.52203 22.46053 89.12419 22.46053 curveto
+88.72635 22.46053 88.34485 22.30246 88.06355 22.02116 curveto
+87.78226 21.73987 87.62419 21.35837 87.62419 20.96053 curveto
+87.62419 20.56268 87.78226 20.18118 88.06355 19.89989 curveto
+88.34485 19.61859 88.72635 19.46053 89.12419 19.46053 curveto
+89.52203 19.46053 89.90353 19.61859 90.18483 19.89989 curveto
+90.46613 20.18118 90.62419 20.56268 90.62419 20.96053 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 90.62419 20.96053 moveto
+90.62419 21.35837 90.46613 21.73987 90.18483 22.02116 curveto
+89.90353 22.30246 89.52203 22.46053 89.12419 22.46053 curveto
+88.72635 22.46053 88.34485 22.30246 88.06355 22.02116 curveto
+87.78226 21.73987 87.62419 21.35837 87.62419 20.96053 curveto
+87.62419 20.56268 87.78226 20.18118 88.06355 19.89989 curveto
+88.34485 19.61859 88.72635 19.46053 89.12419 19.46053 curveto
+89.52203 19.46053 89.90353 19.61859 90.18483 19.89989 curveto
+90.46613 20.18118 90.62419 20.56268 90.62419 20.96053 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 124.13162 17.10753 moveto
+124.13162 17.50537 123.97356 17.88687 123.69226 18.16817 curveto
+123.41096 18.44946 123.02946 18.60753 122.63162 18.60753 curveto
+122.23378 18.60753 121.85228 18.44946 121.57098 18.16817 curveto
+121.28969 17.88687 121.13162 17.50537 121.13162 17.10753 curveto
+121.13162 16.70969 121.28969 16.32819 121.57098 16.04689 curveto
+121.85228 15.7656 122.23378 15.60753 122.63162 15.60753 curveto
+123.02946 15.60753 123.41096 15.7656 123.69226 16.04689 curveto
+123.97356 16.32819 124.13162 16.70969 124.13162 17.10753 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 124.13162 17.10753 moveto
+124.13162 17.50537 123.97356 17.88687 123.69226 18.16817 curveto
+123.41096 18.44946 123.02946 18.60753 122.63162 18.60753 curveto
+122.23378 18.60753 121.85228 18.44946 121.57098 18.16817 curveto
+121.28969 17.88687 121.13162 17.50537 121.13162 17.10753 curveto
+121.13162 16.70969 121.28969 16.32819 121.57098 16.04689 curveto
+121.85228 15.7656 122.23378 15.60753 122.63162 15.60753 curveto
+123.02946 15.60753 123.41096 15.7656 123.69226 16.04689 curveto
+123.97356 16.32819 124.13162 16.70969 124.13162 17.10753 curveto closepath stroke
+newpath 141.73225 28.34645 moveto
+99.21259 85.03935 lineto
+85.03935 56.6929 lineto
+ closepath stroke
+ 1 1 1 setrgbcolor
+newpath 143.23225 28.34645 moveto
+143.23225 28.7443 143.07419 29.1258 142.7929 29.40709 curveto
+142.5116 29.68839 142.1301 29.84645 141.73225 29.84645 curveto
+141.33441 29.84645 140.95291 29.68839 140.67162 29.40709 curveto
+140.39032 29.1258 140.23225 28.7443 140.23225 28.34645 curveto
+140.23225 27.94861 140.39032 27.56711 140.67162 27.28581 curveto
+140.95291 27.00452 141.33441 26.84645 141.73225 26.84645 curveto
+142.1301 26.84645 142.5116 27.00452 142.7929 27.28581 curveto
+143.07419 27.56711 143.23225 27.94861 143.23225 28.34645 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 143.23225 28.34645 moveto
+143.23225 28.7443 143.07419 29.1258 142.7929 29.40709 curveto
+142.5116 29.68839 142.1301 29.84645 141.73225 29.84645 curveto
+141.33441 29.84645 140.95291 29.68839 140.67162 29.40709 curveto
+140.39032 29.1258 140.23225 28.7443 140.23225 28.34645 curveto
+140.23225 27.94861 140.39032 27.56711 140.67162 27.28581 curveto
+140.95291 27.00452 141.33441 26.84645 141.73225 26.84645 curveto
+142.1301 26.84645 142.5116 27.00452 142.7929 27.28581 curveto
+143.07419 27.56711 143.23225 27.94861 143.23225 28.34645 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 130.47557 45.35536 moveto
+130.47557 45.7532 130.3175 46.1347 130.03621 46.416 curveto
+129.75491 46.6973 129.37341 46.85536 128.97557 46.85536 curveto
+128.57773 46.85536 128.19623 46.6973 127.91493 46.416 curveto
+127.63364 46.1347 127.47557 45.7532 127.47557 45.35536 curveto
+127.47557 44.95752 127.63364 44.57602 127.91493 44.29472 curveto
+128.19623 44.01343 128.57773 43.85536 128.97557 43.85536 curveto
+129.37341 43.85536 129.75491 44.01343 130.03621 44.29472 curveto
+130.3175 44.57602 130.47557 44.95752 130.47557 45.35536 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 130.47557 45.35536 moveto
+130.47557 45.7532 130.3175 46.1347 130.03621 46.416 curveto
+129.75491 46.6973 129.37341 46.85536 128.97557 46.85536 curveto
+128.57773 46.85536 128.19623 46.6973 127.91493 46.416 curveto
+127.63364 46.1347 127.47557 45.7532 127.47557 45.35536 curveto
+127.47557 44.95752 127.63364 44.57602 127.91493 44.29472 curveto
+128.19623 44.01343 128.57773 43.85536 128.97557 43.85536 curveto
+129.37341 43.85536 129.75491 44.01343 130.03621 44.29472 curveto
+130.3175 44.57602 130.47557 44.95752 130.47557 45.35536 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 117.71889 62.36427 moveto
+117.71889 62.76212 117.56082 63.14362 117.27953 63.42491 curveto
+116.99823 63.7062 116.61673 63.86427 116.21889 63.86427 curveto
+115.82104 63.86427 115.43954 63.7062 115.15825 63.42491 curveto
+114.87695 63.14362 114.71889 62.76212 114.71889 62.36427 curveto
+114.71889 61.96643 114.87695 61.58493 115.15825 61.30363 curveto
+115.43954 61.02234 115.82104 60.86427 116.21889 60.86427 curveto
+116.61673 60.86427 116.99823 61.02234 117.27953 61.30363 curveto
+117.56082 61.58493 117.71889 61.96643 117.71889 62.36427 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 117.71889 62.36427 moveto
+117.71889 62.76212 117.56082 63.14362 117.27953 63.42491 curveto
+116.99823 63.7062 116.61673 63.86427 116.21889 63.86427 curveto
+115.82104 63.86427 115.43954 63.7062 115.15825 63.42491 curveto
+114.87695 63.14362 114.71889 62.76212 114.71889 62.36427 curveto
+114.71889 61.96643 114.87695 61.58493 115.15825 61.30363 curveto
+115.43954 61.02234 115.82104 60.86427 116.21889 60.86427 curveto
+116.61673 60.86427 116.99823 61.02234 117.27953 61.30363 curveto
+117.56082 61.58493 117.71889 61.96643 117.71889 62.36427 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 104.9622 79.37274 moveto
+104.9622 79.77058 104.80414 80.15208 104.52284 80.43338 curveto
+104.24155 80.71468 103.86005 80.87274 103.4622 80.87274 curveto
+103.06436 80.87274 102.68286 80.71468 102.40157 80.43338 curveto
+102.12027 80.15208 101.9622 79.77058 101.9622 79.37274 curveto
+101.9622 78.9749 102.12027 78.5934 102.40157 78.3121 curveto
+102.68286 78.0308 103.06436 77.87274 103.4622 77.87274 curveto
+103.86005 77.87274 104.24155 78.0308 104.52284 78.3121 curveto
+104.80414 78.5934 104.9622 78.9749 104.9622 79.37274 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 104.9622 79.37274 moveto
+104.9622 79.77058 104.80414 80.15208 104.52284 80.43338 curveto
+104.24155 80.71468 103.86005 80.87274 103.4622 80.87274 curveto
+103.06436 80.87274 102.68286 80.71468 102.40157 80.43338 curveto
+102.12027 80.15208 101.9622 79.77058 101.9622 79.37274 curveto
+101.9622 78.9749 102.12027 78.5934 102.40157 78.3121 curveto
+102.68286 78.0308 103.06436 77.87274 103.4622 77.87274 curveto
+103.86005 77.87274 104.24155 78.0308 104.52284 78.3121 curveto
+104.80414 78.5934 104.9622 78.9749 104.9622 79.37274 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 97.87733 79.36755 moveto
+97.87733 79.7654 97.71927 80.1469 97.43797 80.42819 curveto
+97.15668 80.70949 96.77518 80.86755 96.37733 80.86755 curveto
+95.97949 80.86755 95.59799 80.70949 95.3167 80.42819 curveto
+95.0354 80.1469 94.87733 79.7654 94.87733 79.36755 curveto
+94.87733 78.96971 95.0354 78.58821 95.3167 78.30692 curveto
+95.59799 78.02562 95.97949 77.86755 96.37733 77.86755 curveto
+96.77518 77.86755 97.15668 78.02562 97.43797 78.30692 curveto
+97.71927 78.58821 97.87733 78.96971 97.87733 79.36755 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 97.87733 79.36755 moveto
+97.87733 79.7654 97.71927 80.1469 97.43797 80.42819 curveto
+97.15668 80.70949 96.77518 80.86755 96.37733 80.86755 curveto
+95.97949 80.86755 95.59799 80.70949 95.3167 80.42819 curveto
+95.0354 80.1469 94.87733 79.7654 94.87733 79.36755 curveto
+94.87733 78.96971 95.0354 78.58821 95.3167 78.30692 curveto
+95.59799 78.02562 95.97949 77.86755 96.37733 77.86755 curveto
+96.77518 77.86755 97.15668 78.02562 97.43797 78.30692 curveto
+97.71927 78.58821 97.87733 78.96971 97.87733 79.36755 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 93.62424 70.86397 moveto
+93.62424 71.26181 93.46617 71.64331 93.18488 71.9246 curveto
+92.90358 72.2059 92.52208 72.36397 92.12424 72.36397 curveto
+91.7264 72.36397 91.3449 72.2059 91.0636 71.9246 curveto
+90.7823 71.64331 90.62424 71.26181 90.62424 70.86397 curveto
+90.62424 70.46613 90.7823 70.08463 91.0636 69.80333 curveto
+91.3449 69.52203 91.7264 69.36397 92.12424 69.36397 curveto
+92.52208 69.36397 92.90358 69.52203 93.18488 69.80333 curveto
+93.46617 70.08463 93.62424 70.46613 93.62424 70.86397 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 93.62424 70.86397 moveto
+93.62424 71.26181 93.46617 71.64331 93.18488 71.9246 curveto
+92.90358 72.2059 92.52208 72.36397 92.12424 72.36397 curveto
+91.7264 72.36397 91.3449 72.2059 91.0636 71.9246 curveto
+90.7823 71.64331 90.62424 71.26181 90.62424 70.86397 curveto
+90.62424 70.46613 90.7823 70.08463 91.0636 69.80333 curveto
+91.3449 69.52203 91.7264 69.36397 92.12424 69.36397 curveto
+92.52208 69.36397 92.90358 69.52203 93.18488 69.80333 curveto
+93.46617 70.08463 93.62424 70.46613 93.62424 70.86397 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 89.37201 62.35951 moveto
+89.37201 62.75735 89.21394 63.13885 88.93265 63.42015 curveto
+88.65135 63.70145 88.26985 63.85951 87.87201 63.85951 curveto
+87.47417 63.85951 87.09267 63.70145 86.81137 63.42015 curveto
+86.53008 63.13885 86.37201 62.75735 86.37201 62.35951 curveto
+86.37201 61.96167 86.53008 61.58017 86.81137 61.29887 curveto
+87.09267 61.01758 87.47417 60.85951 87.87201 60.85951 curveto
+88.26985 60.85951 88.65135 61.01758 88.93265 61.29887 curveto
+89.21394 61.58017 89.37201 61.96167 89.37201 62.35951 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 89.37201 62.35951 moveto
+89.37201 62.75735 89.21394 63.13885 88.93265 63.42015 curveto
+88.65135 63.70145 88.26985 63.85951 87.87201 63.85951 curveto
+87.47417 63.85951 87.09267 63.70145 86.81137 63.42015 curveto
+86.53008 63.13885 86.37201 62.75735 86.37201 62.35951 curveto
+86.37201 61.96167 86.53008 61.58017 86.81137 61.29887 curveto
+87.09267 61.01758 87.47417 60.85951 87.87201 60.85951 curveto
+88.26985 60.85951 88.65135 61.01758 88.93265 61.29887 curveto
+89.21394 61.58017 89.37201 61.96167 89.37201 62.35951 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 92.21634 53.85506 moveto
+92.21634 54.2529 92.05827 54.6344 91.77698 54.9157 curveto
+91.49568 55.19699 91.11418 55.35506 90.71634 55.35506 curveto
+90.3185 55.35506 89.937 55.19699 89.6557 54.9157 curveto
+89.3744 54.6344 89.21634 54.2529 89.21634 53.85506 curveto
+89.21634 53.45721 89.3744 53.07571 89.6557 52.79442 curveto
+89.937 52.51312 90.3185 52.35506 90.71634 52.35506 curveto
+91.11418 52.35506 91.49568 52.51312 91.77698 52.79442 curveto
+92.05827 53.07571 92.21634 53.45721 92.21634 53.85506 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 92.21634 53.85506 moveto
+92.21634 54.2529 92.05827 54.6344 91.77698 54.9157 curveto
+91.49568 55.19699 91.11418 55.35506 90.71634 55.35506 curveto
+90.3185 55.35506 89.937 55.19699 89.6557 54.9157 curveto
+89.3744 54.6344 89.21634 54.2529 89.21634 53.85506 curveto
+89.21634 53.45721 89.3744 53.07571 89.6557 52.79442 curveto
+89.937 52.51312 90.3185 52.35506 90.71634 52.35506 curveto
+91.11418 52.35506 91.49568 52.51312 91.77698 52.79442 curveto
+92.05827 53.07571 92.21634 53.45721 92.21634 53.85506 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 109.22482 45.35017 moveto
+109.22482 45.74802 109.06676 46.12952 108.78546 46.41081 curveto
+108.50417 46.69211 108.12267 46.85017 107.72482 46.85017 curveto
+107.32698 46.85017 106.94548 46.69211 106.66418 46.41081 curveto
+106.38289 46.12952 106.22482 45.74802 106.22482 45.35017 curveto
+106.22482 44.95233 106.38289 44.57083 106.66418 44.28954 curveto
+106.94548 44.00824 107.32698 43.85017 107.72482 43.85017 curveto
+108.12267 43.85017 108.50417 44.00824 108.78546 44.28954 curveto
+109.06676 44.57083 109.22482 44.95233 109.22482 45.35017 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 109.22482 45.35017 moveto
+109.22482 45.74802 109.06676 46.12952 108.78546 46.41081 curveto
+108.50417 46.69211 108.12267 46.85017 107.72482 46.85017 curveto
+107.32698 46.85017 106.94548 46.69211 106.66418 46.41081 curveto
+106.38289 46.12952 106.22482 45.74802 106.22482 45.35017 curveto
+106.22482 44.95233 106.38289 44.57083 106.66418 44.28954 curveto
+106.94548 44.00824 107.32698 43.85017 107.72482 43.85017 curveto
+108.12267 43.85017 108.50417 44.00824 108.78546 44.28954 curveto
+109.06676 44.57083 109.22482 44.95233 109.22482 45.35017 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 126.23372 36.84572 moveto
+126.23372 37.24356 126.07565 37.62506 125.79436 37.90636 curveto
+125.51306 38.18765 125.13156 38.34572 124.73372 38.34572 curveto
+124.33588 38.34572 123.95438 38.18765 123.67308 37.90636 curveto
+123.39178 37.62506 123.23372 37.24356 123.23372 36.84572 curveto
+123.23372 36.44788 123.39178 36.06638 123.67308 35.78508 curveto
+123.95438 35.50378 124.33588 35.34572 124.73372 35.34572 curveto
+125.13156 35.34572 125.51306 35.50378 125.79436 35.78508 curveto
+126.07565 36.06638 126.23372 36.44788 126.23372 36.84572 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 126.23372 36.84572 moveto
+126.23372 37.24356 126.07565 37.62506 125.79436 37.90636 curveto
+125.51306 38.18765 125.13156 38.34572 124.73372 38.34572 curveto
+124.33588 38.34572 123.95438 38.18765 123.67308 37.90636 curveto
+123.39178 37.62506 123.23372 37.24356 123.23372 36.84572 curveto
+123.23372 36.44788 123.39178 36.06638 123.67308 35.78508 curveto
+123.95438 35.50378 124.33588 35.34572 124.73372 35.34572 curveto
+125.13156 35.34572 125.51306 35.50378 125.79436 35.78508 curveto
+126.07565 36.06638 126.23372 36.44788 126.23372 36.84572 curveto closepath stroke
+ 1 1 1 setrgbcolor
+newpath 100.71259 85.03806 moveto
+100.71259 85.4359 100.55452 85.8174 100.27322 86.0987 curveto
+99.99193 86.37999 99.61043 86.53806 99.21259 86.53806 curveto
+98.81474 86.53806 98.43324 86.37999 98.15195 86.0987 curveto
+97.87065 85.8174 97.71259 85.4359 97.71259 85.03806 curveto
+97.71259 84.64021 97.87065 84.25871 98.15195 83.97742 curveto
+98.43324 83.69612 98.81474 83.53806 99.21259 83.53806 curveto
+99.61043 83.53806 99.99193 83.69612 100.27322 83.97742 curveto
+100.55452 84.25871 100.71259 84.64021 100.71259 85.03806 curveto closepath fill
+ 0 0 0 setrgbcolor
+newpath 100.71259 85.03806 moveto
+100.71259 85.4359 100.55452 85.8174 100.27322 86.0987 curveto
+99.99193 86.37999 99.61043 86.53806 99.21259 86.53806 curveto
+98.81474 86.53806 98.43324 86.37999 98.15195 86.0987 curveto
+97.87065 85.8174 97.71259 85.4359 97.71259 85.03806 curveto
+97.71259 84.64021 97.87065 84.25871 98.15195 83.97742 curveto
+98.43324 83.69612 98.81474 83.53806 99.21259 83.53806 curveto
+99.61043 83.53806 99.99193 83.69612 100.27322 83.97742 curveto
+100.55452 84.25871 100.71259 84.64021 100.71259 85.03806 curveto closepath stroke
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point.mp
new file mode 100644
index 0000000000..24c969abd1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/point.mp
@@ -0,0 +1,25 @@
+input geom2d;
+
+beginfig(0);
+
+ C = Point(3,2);
+ A = Point(5,1);
+ B = Point(3.5,3) ;
+ E = Ellipse(C,A,B);
+ trace E;
+for i=0 step 0.1 until 1:
+pointe PointDe(E,i);
+endfor
+
+T = Triangle(A,B,C);
+trace T;
+
+for i=0 step 0.1 until 1:
+pointe PointDe(T,i);
+endfor
+
+pointe PointDe(0.33333,T);
+
+endfig;
+
+end.
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/polygone-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/polygone-1.pdf
new file mode 100644
index 0000000000..e3c0e1d154
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/polygone-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/polygone.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/polygone.mp
new file mode 100644
index 0000000000..619e978fa5
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/polygone.mp
@@ -0,0 +1,20 @@
+input geom2d;
+
+beginfig(1);
+
+
+ A = Point(0,0);
+ B = Point(3,3);
+ C = Point(3,4);
+ D = Point(2,2.4);
+ F = Point(0,5);
+ G = Barycentre(A,B,C,D,F);
+ P = Polygone(A,B,C,D,F);
+ Q1 = PolygoneRegulier(10,2,0,(2,2));
+ trace(P);
+ pointe(G);
+ trace(Q1);
+ pointe(PointPolygone(Q1,1));
+ pointe(CentrePolygone(Q1));
+endfig;
+end \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/vecteurs-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/vecteurs-1.pdf
new file mode 100644
index 0000000000..787f569ced
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/vecteurs-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/vecteurs.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/vecteurs.mp
new file mode 100644
index 0000000000..95a6dff144
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/divers/vecteurs.mp
@@ -0,0 +1,14 @@
+input geom2d;
+
+beginfig(1);
+ A = Point(2,0);
+ B = Point(3,3);
+ C = Vecteur(2,2);
+ D = Segment(A,B);
+ fleche C;
+ fleche D;
+ E = SegmentToVecteur(D);
+ fleche E;
+ show ProduitScalaire(C,E);
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/cos-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/cos-1.pdf
new file mode 100644
index 0000000000..6c5a08e777
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/cos-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/cos.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/cos.mp
new file mode 100644
index 0000000000..471fe58e10
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/cos.mp
@@ -0,0 +1,10 @@
+input geom2d;
+beginfig(1);
+RepereMinMax(-2Pi,2Pi,-1.1,1.1,0.5,1);
+Axes;
+Graduations;
+Debut;
+trace Representation(cos,-2Pi,2Pi,100);
+Fin;
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction1-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction1-1.pdf
new file mode 100644
index 0000000000..69a7e72076
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction1-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction1.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction1.mp
new file mode 100644
index 0000000000..f81d13067b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction1.mp
@@ -0,0 +1,25 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef f(expr x) = sqrt(x+3-4*sqrt(x-1))+sqrt(x+8-6*sqrt(x-1)) enddef;
+
+
+beginfig(1);
+
+Repere(10,6,1,2,.8,0.8);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+
+ trace Representation(f,1,12,100) avecCrayon(1.5,Indigo);
+
+ pointe Point(5,1);
+ pointe Point(10,1);
+
+ label.top(textext("\(y=\sqrt{x+3-4\sqrt{x-1}}+\sqrt{x+8-6\sqrt{x-1}}\)"),
+ (7,2.5) gddEnPlace) withcolor Olive;
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction2-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction2-1.pdf
new file mode 100644
index 0000000000..f25b1b9d27
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction2-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction2.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction2.mp
new file mode 100644
index 0000000000..695c65842a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/fonctions/fonction2.mp
@@ -0,0 +1,53 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=0.9cm;
+
+vardef f(expr x) = x*(Pi-x) enddef; % f
+vardef g(expr x) = Pi-2*x enddef; % f'
+vardef h(expr x) = -2 enddef; % f''
+
+beginfig(1);
+
+Repere(9,6,5,3,.8,0.8);
+Axes;
+ Debut;
+ Graduations;
+
+ trace (Pi,-2)--(Pi,2) dashed evenly;
+ trace (-Pi,-2)--(-Pi,2) dashed evenly;
+
+ trace Representation(f,0,Pi,100) avecCrayon(1.5,Indigo);
+ trace (Representation(f,0,Pi,100) scaled -1) avecCrayon(1.5,Indigo);
+ trace (Representation(f,0,Pi,100) shifted (-2*Pi,0)) avecCrayon(1.5,Indigo);
+ trace (Representation(f,0,Pi,100) scaled -1 shifted (2*Pi,0)) avecCrayon(1.5,Indigo);
+
+ trace Representation(g,0,Pi,100) avecCrayon(1.5,Olive);
+ trace (Representation(g,0,Pi,100) xscaled -1) avecCrayon(1.5,Olive);
+ trace (Representation(g,0,Pi,100) shifted (-2*Pi,0)) avecCrayon(1.5,Olive);
+ trace (Representation(g,0,Pi,100) xscaled -1 shifted (2*Pi,0)) avecCrayon(1.5,Olive);
+
+ trace Representation(h,0,Pi,100) avecCrayon(1.5,Orange);
+ trace (Representation(h,0,Pi,100) scaled -1) avecCrayon(1.5,Orange);
+ trace (Representation(h,0,Pi,100) shifted (-2*Pi,0)) avecCrayon(1.5,Orange);
+ trace (Representation(h,0,Pi,100) scaled -1 shifted (2*Pi,0)) avecCrayon(1.5,Orange);
+
+ pointe Point(Pi,2);
+ pointe Point(Pi,-2);
+ pointe Point(-Pi,2);
+ pointe Point(-Pi,-2);
+
+ label.urt(textext("\(-\pi\)"), (-Pi,0) gddEnPlace) withcolor Peru;
+ label.ulft(textext("\(\pi\)"), (Pi,0) gddEnPlace) withcolor Peru;
+Fin;
+
+trace (0,-0.5)--(1,-0.5) avecCrayon(1.5,Indigo);
+label.rt(textext("\(f\)"), (1,-0.5) gddEnPlace);
+trace (2,-0.5)--(3,-0.5) avecCrayon(1.5,Olive);
+label.rt(textext("\(f'\)"), (3,-0.5) gddEnPlace);
+trace (4,-0.5)--(5,-0.5) avecCrayon(1.5,Orange);
+label.rt(textext("\(f''\)"), (5,-0.5) gddEnPlace);
+
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol01-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol01-1.pdf
new file mode 100644
index 0000000000..b2d5723139
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol01-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol01.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol01.mp
new file mode 100644
index 0000000000..a806fb6e56
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol01.mp
@@ -0,0 +1,40 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef r(expr t) = 1/(cos(t)-cos(2*t)) enddef;
+vardef rp(expr t) = (r(t)*cos(t),r(t)*sin(t)) enddef;
+vardef f(expr t) = 3/2*t*t-7/18 enddef;
+
+def DroiteN(expr r, t) = Droite((r*cos(t),r*sin(t)), (r*cos(t)-2*sin(t),r*sin(t)+2*cos(t))) enddef;
+def traceDoubleVecteur(expr o,d)= drawdblarrow ((o-d)--(o+d)) gddEnPlace enddef;
+
+def Crayon(expr t,c) = drawoptions(withpen pencircle scaled t withcolor c) enddef;
+
+beginfig(1);
+Repere(10,10,2,5,3.5,3.5);
+Axes;
+ Debut;
+ Graduations; Unites(1);
+ trace Cercle(origine,1);
+ Crayon(0.75,1.1*LightSlateGrey);
+ trace rp(-arccos(1/4))--(0,0)--rp(arccos(1/4)) dashed evenly;
+ Crayon(0.75,1.1*FireBrick);
+ trace DroiteN(-2/3/sqrt(3),7*Pi/6);
+ trace DroiteN(-2/3/sqrt(3),5*Pi/6);
+ trace Representation(f,-3,3,100) rotated -90;
+ Crayon(1.5,0.8*LightSlateGrey);
+ trace CourbeEnPolaires(r,0.1,2*Pi/3-0.1,100);
+ trace CourbeEnPolaires(r,-0.1,-2*Pi/3+0.1,100);
+ trace CourbeEnPolaires(r,2*Pi/3+0.1,4*Pi/3-0.1,100);
+ Crayon(1,DodgerBlue);
+ traceDoubleVecteur(rp(Pi),(0,0.2));
+ traceDoubleVecteur(rp(arccos(1/4)),0.05*(-sqrt(15),1));
+ traceDoubleVecteur(rp(-arccos(1/4)),0.05*(sqrt(15),1));
+ pointe rp(Pi);
+ pointe rp(arccos(1/4));
+ pointe rp(-arccos(1/4));
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol02-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol02-1.pdf
new file mode 100644
index 0000000000..9b66ecc5ef
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol02-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol02.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol02.mp
new file mode 100644
index 0000000000..017fe938e8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol02.mp
@@ -0,0 +1,52 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=0.8cm;
+
+vardef r(expr t) = 1+cos(t) enddef;
+vardef rp(expr t) = (r(t)*cos(t),r(t)*sin(t)) enddef;
+
+def traceDoubleVecteur(expr o,d)= drawdblarrow ((o-d)--(o+d)) gddEnPlace enddef;
+
+beginfig(1);
+ Repere(10,10,2,5,3.5,3.5);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+
+ drawoptions(withcolor LightSlateGrey);
+ draw fullcircle shifted (0.5,0) gddEnPlace avecCrayon(1,Gold);
+
+ nb = 80;
+ pas = 2Pi / nb;
+ for i=0 upto nb:
+ theta := i * pas;
+ draw (fullcircle scaled 2cos(theta)
+ shifted (cos(theta)*cos(theta),cos(theta)*sin(theta))) gddEnPlace;
+ endfor;
+
+
+ traceDoubleVecteur(rp(0),(0,0.3)) avecCrayon(1,LightPink);
+ traceDoubleVecteur(rp(Pi/3),(0.3,0)) avecCrayon(1,LightPink);
+ traceDoubleVecteur(rp(Pi/2),(0.2,0.2)) avecCrayon(1,LightPink);
+ traceDoubleVecteur(rp(2Pi/3),(0,0.3)) avecCrayon(1,LightPink);
+ traceDoubleVecteur(rp(-Pi/3),(0.3,0)) avecCrayon(1,LightPink);
+ traceDoubleVecteur(rp(-Pi/2),(0.2,-0.2)) avecCrayon(1,LightPink);
+ traceDoubleVecteur(rp(-2Pi/3),(0,0.3)) avecCrayon(1,LightPink);
+
+ fleche Segment(origine,(-0.3,0)) avecCrayon(1,LightPink);
+ trace CourbeEnPolaires(r,-Pi,Pi,100) avecCrayon(1.5,Indigo);
+
+ pointe Point(0,0);
+ pointe Point(2,0);
+ pointe PairTOPoint(rp(Pi/3));
+ pointe PairTOPoint(rp(-Pi/3));
+ pointe PairTOPoint(rp(2Pi/3));
+ pointe PairTOPoint(rp(-2Pi/3));
+ pointe Point(0,1);
+ pointe Point(0,-1);
+
+ label.urt(textext("\(\mathcal{C}\)"),PtR(Point(1,0))) withcolor Magenta;
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol03-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol03-1.pdf
new file mode 100644
index 0000000000..d542588f38
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol03-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol03.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol03.mp
new file mode 100644
index 0000000000..20f1a95fb6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol03.mp
@@ -0,0 +1,33 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef r(expr t) = 1+2*cos(t) enddef;
+vardef rp(expr t) = (r(t)*cos(t),r(t)*sin(t)) enddef;
+
+def traceDoubleVecteur(expr o,d)= drawdblarrow ((o-d)--(o+d)) gddEnPlace enddef;
+
+beginfig(1);
+ Repere(10,10,2.2,5,2,2);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+ drawoptions(withcolor LightSlateGrey);
+
+ nb = 50;
+ pas = 4 / nb;
+ for i=1 upto nb:
+ vardef rt(expr t) = 1 + (-1+i*pas)*cos(t) enddef;
+ trace CourbeEnPolaires(rt,-Pi,Pi,100) withcolor ((i/nb)[Gainsboro,Chartreuse]);
+ endfor;
+
+ trace CourbeEnPolaires(r,-Pi,Pi,100) avecCrayon(1.5,LightSeaGreen);
+
+ pointe Point(0,0);
+ pointe Point(0,1);
+ pointe Point(0,-1);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol04-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol04-1.pdf
new file mode 100644
index 0000000000..bdc593c6b3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol04-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol04.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol04.mp
new file mode 100644
index 0000000000..385f876f98
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol04.mp
@@ -0,0 +1,44 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef r(expr t) = cos(2t)+cos(t)*cos(t) enddef;
+vardef rp(expr t) = (r(t)*cos(t),r(t)*sin(t)) enddef;
+
+def traceDoubleVecteur(expr o,d)= drawdblarrow ((o-d)--(o+d)) gddEnPlace enddef;
+
+a = arccos(1/sqrt(3));
+
+beginfig(1);
+ Repere(10,8,5,4,2,2);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+ drawoptions(withcolor LightBlue);
+
+ nb = 60;
+ pas = 2Pi/ nb;
+ for i:=0 upto nb:
+ trace (0,0) -- rp(i*pas);
+ endfor;
+
+ traceDoubleVecteur((0,0),0.5(cos(a),sin(a))) avecCrayon(1,MediumVioletRed);
+ traceDoubleVecteur((0,0),0.5(-cos(a),sin(a))) avecCrayon(1,MediumVioletRed);
+ traceDoubleVecteur((2,0),(0,0.5)) avecCrayon(1,MediumVioletRed);
+ traceDoubleVecteur((-2,0),(0,0.5)) avecCrayon(1,MediumVioletRed);
+ traceDoubleVecteur((0,1),(0.5,0)) avecCrayon(1,MediumVioletRed);
+ traceDoubleVecteur((0,-1),(-0.5,0)) avecCrayon(1,MediumVioletRed);
+
+ trace CourbeEnPolaires(r,-Pi,Pi,150) avecCrayon(1.5,DarkOliveGreen);
+
+ pointe Point(0,0);
+ pointe Point(0,1);
+ pointe Point(0,-1);
+ pointe Point(2,0);
+ pointe Point(-2,0);
+
+ Fin;
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol05-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol05-1.pdf
new file mode 100644
index 0000000000..45e6e36582
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol05-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol05.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol05.mp
new file mode 100644
index 0000000000..376990a5b4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol05.mp
@@ -0,0 +1,57 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.2cm;
+
+vardef r(expr t) = sqrt(cos(2*t)) enddef;
+vardef ri(expr t) = -sqrt(cos(2*t)) enddef;
+vardef rh(expr t) = 1 / r(t) enddef;
+vardef rhi(expr t) = 1 / ri(t) enddef;
+
+vardef u(expr v) = sqrt(v*v+4) enddef;
+vardef rp(expr t) = (r(t)*cos(t),r(t)*sin(t)) enddef;
+
+def traceDoubleVecteur(expr o,d)= drawdblarrow ((o-d)--(o+d)) gddEnPlace enddef;
+
+a = arccos(1/sqrt(3));
+
+beginfig(1);
+ Repere(10,6,5,3,3,3);
+ Axes;
+ Debut;
+ Graduations;
+ drawoptions(withcolor Gainsboro);
+
+ nb = 40;
+ pas = Pi / (2*nb);
+ for i:=0 upto nb:
+ trace Droite((0,0),(cos(-Pi/4+i*pas),sin(-Pi/4+i*pas)));
+ endfor;
+
+ trace Droite((0,0),(1,1));
+ trace Droite((0,0),(-1,1));
+
+ trace CourbeEnPolaires(rh,-Pi/4+0.01,Pi/4-0.01,150)
+ avecCrayon(0.75,Crimson);
+ trace CourbeEnPolaires(rhi,-Pi/4+0.01,Pi/4-0.01,150)
+ avecCrayon(0.75,Crimson);
+
+ traceDoubleVecteur((0,0),0.25(1,1)) avecCrayon(1,LightSalmon);
+ traceDoubleVecteur((0,0),0.25(-1,1)) avecCrayon(1,LightSalmon);
+ traceDoubleVecteur((1,0),(0,0.2)) avecCrayon(1,LightSalmon);
+ traceDoubleVecteur((-1,0),(0,0.2)) avecCrayon(1,LightSalmon);
+ traceDoubleVecteur(rp(Pi/6),(0.2,0)) avecCrayon(1,LightSalmon);
+ traceDoubleVecteur(rp(-Pi/6),(0.2,0)) avecCrayon(1,LightSalmon);
+ traceDoubleVecteur(rp(5Pi/6),(0.2,0)) avecCrayon(1,LightSalmon);
+ traceDoubleVecteur(rp(-5Pi/6),(0.2,0)) avecCrayon(1,LightSalmon);
+
+ trace (0,0)--CourbeEnPolaires(r,-Pi/4+0.0001,Pi/4-0.0001,150)--cycle
+ avecCrayon(1.5,LightSlateGrey);
+ trace (0,0)--CourbeEnPolaires(ri,-Pi/4+0.0001,Pi/4-0.0001,150)--cycle
+ avecCrayon(1.5,LightSlateGrey);
+
+ pointe Point(0,0);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol06-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol06-1.pdf
new file mode 100644
index 0000000000..526f1f8063
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol06-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol06.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol06.mp
new file mode 100644
index 0000000000..74a2fd81ac
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol06.mp
@@ -0,0 +1,42 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.5cm;
+
+vardef r(expr t) = cos(t)*cos(t)*cos(t)-sin(t)*sin(t)*sin(t) enddef;
+vardef rp(expr t) = (r(t)*cos(t),r(t)*sin(t)) enddef;
+
+def traceDoubleVecteur(expr o,d)= drawdblarrow ((o-d)--(o+d)) gddEnPlace enddef;
+
+a = arccos(1/sqrt(3));
+
+beginfig(1);
+
+ Repere(6,6,2,4,3,3);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+
+ drawoptions(withcolor Gainsboro);
+
+ trace (0,0)--rp(-Pi/12);
+ trace (0,0)--rp(-Pi/4);
+ trace (0,0)--rp(-5Pi/12);
+
+ traceDoubleVecteur(rp(Pi/4),(0.18,0.18)) avecCrayon(1,DarkOrchid);
+ traceDoubleVecteur(rp(-Pi/4),(0.18,0.18)) avecCrayon(1,DarkOrchid);
+ traceDoubleVecteur(rp(-Pi/12),(0.18,0.18)) avecCrayon(1,DarkOrchid);
+ traceDoubleVecteur(rp(-5Pi/12),(0.18,0.18)) avecCrayon(1,DarkOrchid);
+
+ trace CourbeEnPolaires(r,-Pi/2,Pi/2,150) avecCrayon(1.5,Crimson);
+
+ drawoptions(withcolor LightGoldenrod);
+
+ pointe Point(0,0);
+ pointe rp(-Pi/12);
+ pointe rp(-Pi/4);
+ pointe rp(-5Pi/12);
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol07-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol07-1.pdf
new file mode 100644
index 0000000000..2b2f5a7d11
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol07-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol07.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol07.mp
new file mode 100644
index 0000000000..35ba629654
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/polaires/pol07.mp
@@ -0,0 +1,29 @@
+input geom2d;
+
+labeloffset := 6;
+gddU:=1.5cm;
+
+vardef r(expr t) = 4*cos(t/3)*cos(t/3)*cos(t/3) enddef;
+vardef rp(expr t) = (r(t)*cos(t),r(t)*sin(t)) enddef;
+
+def traceDoubleVecteur(expr o,d)= drawdblarrow ((o-d)--(o+d)) gddEnPlace enddef;
+
+
+
+beginfig(1);
+ Repere(8,8,2,4,1,1);
+ Axes;
+ Debut;
+ Graduations; Unites(1);
+
+ drawoptions(withcolor Gainsboro);
+
+ trace CourbeEnPolaires(r,0,3Pi,450)
+ avecCrayon(1.5,Crimson);
+
+ drawoptions(withcolor LightGoldenrod);
+
+ pointe Point(0,0);
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/mptextmp.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/mptextmp.mp
new file mode 100644
index 0000000000..3ca1aafb46
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/mptextmp.mp
@@ -0,0 +1 @@
+btex $\vec\jmath$ etex
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/mpxerr.tex b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/mpxerr.tex
new file mode 100644
index 0000000000..8d1b74bb84
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/mpxerr.tex
@@ -0,0 +1,14 @@
+\gdef\mpxshipout{\shipout\hbox\bgroup%
+ \setbox0=\hbox\bgroup}%
+\gdef\stopmpxshipout{\egroup \dimen0=\ht0 \advance\dimen0\dp0
+ \dimen1=\ht0 \dimen2=\dp0
+ \setbox0=\hbox\bgroup
+ \box0
+ \ifnum\dimen0>0 \vrule width1sp height\dimen1 depth\dimen2
+ \else \vrule width1sp height1sp depth0sp\relax
+ \fi\egroup
+ \ht0=0pt \dp0=0pt \box0 \egroup}
+\mpxshipout% line 1 ./mptextmp.mp
+\(y\vec\jmath\)%
+\stopmpxshipout
+\end{document}
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes1-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes1-1.pdf
new file mode 100644
index 0000000000..0363226636
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes1-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes1.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes1.mp
new file mode 100644
index 0000000000..55feff5ce4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes1.mp
@@ -0,0 +1,49 @@
+input geom2d;
+
+labeloffset := 4;
+gddU:=1.3cm;
+
+beginfig(1);
+
+
+ O = Point(0,0);
+ I = Point(1,0);
+ J = Point(0.3,0.8);
+ M = PointDansRepere(5,3,O,I,J);
+ H = PointDansRepere(5,0,O,I,J);
+ K = PointDansRepere(0,3,O,I,J);
+
+ Repere(8,6,1.5,1.5,1,1);
+ Debut;
+
+ trace Droite(O,I);
+ trace Droite(O,J);
+ trace Pt(K)--Pt(M)--Pt(H) dashed evenly;
+
+ marque.urt "M";
+
+ drawoptions(withpen pencircle scaled 1pt withcolor DodgerBlue);
+ trace Vecteur(O,K);
+ trace Vecteur(O,H);
+ trace Vecteur(O,M);
+ label.top(textext("$x\vec\imath$"),PtR(Milieu(O,H)));
+ label.rt(textext("$y\vec\jmath$"),PtR(Milieu(O,K)));
+
+ drawoptions(withpen pencircle scaled 1.5pt withcolor Crimson);
+ trace Vecteur(O,I);
+ trace Vecteur(O,J);
+
+ drawoptions();
+ marque.llft "O";
+
+ label.bot(textext("$x$"), PtR(H));
+ label.lft(textext("$y$"), PtR(K));
+ label.bot(textext("$\vec\imath$"), PtR(I));
+ label.lft(textext("$\vec\jmath$"), PtR(J));
+
+ Fin;
+
+
+endfig;
+
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes2-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes2-1.pdf
new file mode 100644
index 0000000000..eaa6100c43
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes2-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes2.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes2.mp
new file mode 100644
index 0000000000..bdb86d553b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/reperes/reperes2.mp
@@ -0,0 +1,69 @@
+input geom2d;
+
+labeloffset := 4;
+gddU:=1.cm;
+
+beginfig(1);
+ O = Point(0,0);
+ I = Point(1,0);
+ J = Point(0.3,0.8);
+ M = PointDansRepere(5,3,O,I,J);
+ H = PointDansRepere(5,0,O,I,J);
+ K = PointDansRepere(0,3,O,I,J);
+ O' = Point(3,2);
+ I' = Point(3.7,1.8);
+ J' = Point(2.8,3);
+
+ pair Mt;
+ Mt = CoordonneesRepere(M,O',I',J');
+ H' = PointDansRepere(xpart Mt,0,O',I',J');
+ K' = PointDansRepere(0,ypart Mt,O',I',J');
+
+ Repere(8,6,1.5,1.5,1,1);
+ Debut;
+ trace Droite(O,I);
+ trace Droite(O,J);
+ trace Droite(O',I');
+ trace Droite(O',J');
+
+ trace Pt(K)--Pt(M)--Pt(H) dashed evenly;
+ trace Pt(K')--Pt(M)--Pt(H') dashed evenly;
+
+ marque.urt "M";
+
+ drawoptions(withpen pencircle scaled 1pt withcolor DodgerBlue);
+ fleche Segment(O,K);
+ fleche Segment(O,H);
+ fleche Segment(O,M);
+
+ drawoptions(withpen pencircle scaled 1pt withcolor LimeGreen);
+ fleche Segment(O',M);
+ fleche Segment(O',H');
+ fleche Segment(O',K');
+
+ drawoptions(withpen pencircle scaled 1.5pt withcolor Crimson);
+ fleche Segment(O,I);
+ fleche Segment(O,J);
+ fleche Segment(O',I');
+ fleche Segment(O',J');
+
+ drawoptions(withpen pencircle scaled 1pt withcolor LightCoral);
+ fleche Segment(O,O');
+
+ drawoptions();
+ marque.llft "O";
+ marque.llft "O'";
+
+ label.bot(textext("\(x\)"), PtR(H));
+ label.lft(textext("\(y\)"), PtR(K));
+ label.bot(textext("\(\vec\imath\)"), PtR(I));
+ label.lft(textext("\(\vec\jmath\)"), PtR(J));
+
+ label.bot(textext("\(x'\)"), PtR(H'));
+ label.urt(textext("\(y'\)"), PtR(K'));
+ label.bot(textext("\(\vec\imath'\)"), PtR(I'));
+ label.lft(textext("\(\vec\jmath'\)"), PtR(J'));
+
+ Fin;
+endfig;
+end
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette-1.pdf
new file mode 100644
index 0000000000..090883d771
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette.1 b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette.1
new file mode 100644
index 0000000000..79db8deef8
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette.1
@@ -0,0 +1,2343 @@
+%!PS
+%%BoundingBox: -1 -437 438 10
+%%HiResBoundingBox: -0.25 -436.56975 437.76807 9.32108
+%%Creator: MetaPost 2.10
+%%CreationDate: 2024.10.13:2206
+%%Pages: 1
+%*Font: cmr9 8.96637 8.96637 0b:a0000000000003defdda03effffb
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 0.94 0.972 1 setrgbcolor
+newpath 0 0 moveto
+18.14215 0 lineto
+18.14215 9.07108 lineto
+0 9.07108 lineto
+ closepath fill
+ 0 0 0 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 0 0 moveto
+18.14215 0 lineto
+18.14215 9.07108 lineto
+0 9.07108 lineto
+ closepath stroke
+21.14215 1.42218 moveto
+(AliceBlue) cmr9 8.96637 fshow
+ 0.98 0.92 0.844 setrgbcolor
+newpath 108.8529 0 moveto
+126.99506 0 lineto
+126.99506 9.07108 lineto
+108.8529 9.07108 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 0 moveto
+126.99506 0 lineto
+126.99506 9.07108 lineto
+108.8529 9.07108 lineto
+ closepath stroke
+129.99506 2.29393 moveto
+(An) cmr9 8.96637 fshow
+141.76886 2.29393 moveto
+(tiqueWhite) cmr9 8.96637 fshow
+ 0 1 1 setrgbcolor
+newpath 217.70581 0 moveto
+235.84796 0 lineto
+235.84796 9.07108 lineto
+217.70581 9.07108 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 0 moveto
+235.84796 0 lineto
+235.84796 9.07108 lineto
+217.70581 9.07108 lineto
+ closepath stroke
+238.84796 2.34378 moveto
+(Aqua) cmr9 8.96637 fshow
+ 0.498 1 0.83 setrgbcolor
+newpath 326.55872 0 moveto
+344.70087 0 lineto
+344.70087 9.07108 lineto
+326.55872 9.07108 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 0 moveto
+344.70087 0 lineto
+344.70087 9.07108 lineto
+326.55872 9.07108 lineto
+ closepath stroke
+347.70087 2.34378 moveto
+(Aquamarine) cmr9 8.96637 fshow
+ 0.94 1 1 setrgbcolor
+newpath 0 -11.79242 moveto
+18.14215 -11.79242 lineto
+18.14215 -2.72134 lineto
+0 -2.72134 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -11.79242 moveto
+18.14215 -11.79242 lineto
+18.14215 -2.72134 lineto
+0 -2.72134 lineto
+ closepath stroke
+21.14215 -10.32039 moveto
+(Azure) cmr9 8.96637 fshow
+ 0.96 0.96 0.864 setrgbcolor
+newpath 108.8529 -11.79242 moveto
+126.99506 -11.79242 lineto
+126.99506 -2.72134 lineto
+108.8529 -2.72134 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -11.79242 moveto
+126.99506 -11.79242 lineto
+126.99506 -2.72134 lineto
+108.8529 -2.72134 lineto
+ closepath stroke
+129.99506 -9.44864 moveto
+(Beige) cmr9 8.96637 fshow
+ 1 0.894 0.77 setrgbcolor
+newpath 217.70581 -11.79242 moveto
+235.84796 -11.79242 lineto
+235.84796 -2.72134 lineto
+217.70581 -2.72134 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -11.79242 moveto
+235.84796 -11.79242 lineto
+235.84796 -2.72134 lineto
+217.70581 -2.72134 lineto
+ closepath stroke
+238.84796 -9.44864 moveto
+(Bisque) cmr9 8.96637 fshow
+newpath 326.55872 -11.79242 moveto
+344.70087 -11.79242 lineto
+344.70087 -2.72134 lineto
+326.55872 -2.72134 lineto
+ closepath fill
+newpath 326.55872 -11.79242 moveto
+344.70087 -11.79242 lineto
+344.70087 -2.72134 lineto
+326.55872 -2.72134 lineto
+ closepath stroke
+347.70087 -10.37024 moveto
+(Blac) cmr9 8.96637 fshow
+365.23497 -10.37024 moveto
+(k) cmr9 8.96637 fshow
+ 1 0.92 0.804 setrgbcolor
+newpath 0 -23.58485 moveto
+18.14215 -23.58485 lineto
+18.14215 -14.51378 lineto
+0 -14.51378 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -23.58485 moveto
+18.14215 -23.58485 lineto
+18.14215 -14.51378 lineto
+0 -14.51378 lineto
+ closepath stroke
+21.14215 -22.16267 moveto
+(Blanc) cmr9 8.96637 fshow
+43.79594 -22.16267 moveto
+(hedAlmond) cmr9 8.96637 fshow
+ 0 0 1 setrgbcolor
+newpath 108.8529 -23.58485 moveto
+126.99506 -23.58485 lineto
+126.99506 -14.51378 lineto
+108.8529 -14.51378 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -23.58485 moveto
+126.99506 -23.58485 lineto
+126.99506 -14.51378 lineto
+108.8529 -14.51378 lineto
+ closepath stroke
+129.99506 -22.16267 moveto
+(Blue) cmr9 8.96637 fshow
+ 0.54 0.17 0.888 setrgbcolor
+newpath 217.70581 -23.58485 moveto
+235.84796 -23.58485 lineto
+235.84796 -14.51378 lineto
+217.70581 -14.51378 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -23.58485 moveto
+235.84796 -23.58485 lineto
+235.84796 -14.51378 lineto
+217.70581 -14.51378 lineto
+ closepath stroke
+238.84796 -22.16267 moveto
+(BlueViolet) cmr9 8.96637 fshow
+ 0.648 0.165 0.165 setrgbcolor
+newpath 326.55872 -23.58485 moveto
+344.70087 -23.58485 lineto
+344.70087 -14.51378 lineto
+326.55872 -14.51378 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -23.58485 moveto
+344.70087 -23.58485 lineto
+344.70087 -14.51378 lineto
+326.55872 -14.51378 lineto
+ closepath stroke
+347.70087 -22.11282 moveto
+(Bro) cmr9 8.96637 fshow
+362.18396 -22.11282 moveto
+(wn) cmr9 8.96637 fshow
+ 0.87 0.72 0.53 setrgbcolor
+newpath 0 -35.37727 moveto
+18.14215 -35.37727 lineto
+18.14215 -26.3062 lineto
+0 -26.3062 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -35.37727 moveto
+18.14215 -35.37727 lineto
+18.14215 -26.3062 lineto
+0 -26.3062 lineto
+ closepath stroke
+21.14215 -33.08334 moveto
+(BurlyW) cmr9 8.96637 fshow
+52.51865 -33.08334 moveto
+(o) cmr9 8.96637 fshow
+57.38235 -33.08334 moveto
+(o) cmr9 8.96637 fshow
+62.24605 -33.08334 moveto
+(d) cmr9 8.96637 fshow
+ 0.372 0.62 0.628 setrgbcolor
+newpath 108.8529 -35.37727 moveto
+126.99506 -35.37727 lineto
+126.99506 -26.3062 lineto
+108.8529 -26.3062 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -35.37727 moveto
+126.99506 -35.37727 lineto
+126.99506 -26.3062 lineto
+108.8529 -26.3062 lineto
+ closepath stroke
+129.99506 -33.9551 moveto
+(CadetBlue) cmr9 8.96637 fshow
+ 0.498 1 0 setrgbcolor
+newpath 217.70581 -35.37727 moveto
+235.84796 -35.37727 lineto
+235.84796 -26.3062 lineto
+217.70581 -26.3062 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -35.37727 moveto
+235.84796 -35.37727 lineto
+235.84796 -26.3062 lineto
+217.70581 -26.3062 lineto
+ closepath stroke
+238.84796 -33.9551 moveto
+(Chartreuse) cmr9 8.96637 fshow
+ 0.824 0.41 0.116 setrgbcolor
+newpath 326.55872 -35.37727 moveto
+344.70087 -35.37727 lineto
+344.70087 -26.3062 lineto
+326.55872 -26.3062 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -35.37727 moveto
+344.70087 -35.37727 lineto
+344.70087 -26.3062 lineto
+326.55872 -26.3062 lineto
+ closepath stroke
+347.70087 -33.9551 moveto
+(Cho) cmr9 8.96637 fshow
+364.33977 -33.9551 moveto
+(colate) cmr9 8.96637 fshow
+ 1 0.498 0.312 setrgbcolor
+newpath 0 -47.16971 moveto
+18.14215 -47.16971 lineto
+18.14215 -38.09863 lineto
+0 -38.09863 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -47.16971 moveto
+18.14215 -47.16971 lineto
+18.14215 -38.09863 lineto
+0 -38.09863 lineto
+ closepath stroke
+21.14215 -45.74753 moveto
+(Coral) cmr9 8.96637 fshow
+ 0.392 0.585 0.93 setrgbcolor
+newpath 108.8529 -47.16971 moveto
+126.99506 -47.16971 lineto
+126.99506 -38.09863 lineto
+108.8529 -38.09863 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -47.16971 moveto
+126.99506 -47.16971 lineto
+126.99506 -38.09863 lineto
+108.8529 -38.09863 lineto
+ closepath stroke
+129.99506 -45.74753 moveto
+(Corn\015o) cmr9 8.96637 fshow
+159.45386 -45.74753 moveto
+(w) cmr9 8.96637 fshow
+165.85336 -45.74753 moveto
+(erBlue) cmr9 8.96637 fshow
+ 1 0.972 0.864 setrgbcolor
+newpath 217.70581 -47.16971 moveto
+235.84796 -47.16971 lineto
+235.84796 -38.09863 lineto
+217.70581 -38.09863 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -47.16971 moveto
+235.84796 -47.16971 lineto
+235.84796 -38.09863 lineto
+217.70581 -38.09863 lineto
+ closepath stroke
+238.84796 -45.74753 moveto
+(Cornsilk) cmr9 8.96637 fshow
+ 0.864 0.08 0.235 setrgbcolor
+newpath 326.55872 -47.16971 moveto
+344.70087 -47.16971 lineto
+344.70087 -38.09863 lineto
+326.55872 -38.09863 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -47.16971 moveto
+344.70087 -47.16971 lineto
+344.70087 -38.09863 lineto
+326.55872 -38.09863 lineto
+ closepath stroke
+347.70087 -45.69768 moveto
+(Crimson) cmr9 8.96637 fshow
+ 0 1 1 setrgbcolor
+newpath 0 -58.96213 moveto
+18.14215 -58.96213 lineto
+18.14215 -49.89105 lineto
+0 -49.89105 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -58.96213 moveto
+18.14215 -58.96213 lineto
+18.14215 -49.89105 lineto
+0 -49.89105 lineto
+ closepath stroke
+21.14215 -56.61835 moveto
+(Cy) cmr9 8.96637 fshow
+32.40535 -56.61835 moveto
+(an) cmr9 8.96637 fshow
+ 0 0 0.545 setrgbcolor
+newpath 108.8529 -58.96213 moveto
+126.99506 -58.96213 lineto
+126.99506 -49.89105 lineto
+108.8529 -49.89105 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -58.96213 moveto
+126.99506 -58.96213 lineto
+126.99506 -49.89105 lineto
+108.8529 -49.89105 lineto
+ closepath stroke
+129.99506 -57.53995 moveto
+(DarkBlue) cmr9 8.96637 fshow
+ 0 0.545 0.545 setrgbcolor
+newpath 217.70581 -58.96213 moveto
+235.84796 -58.96213 lineto
+235.84796 -49.89105 lineto
+217.70581 -49.89105 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -58.96213 moveto
+235.84796 -58.96213 lineto
+235.84796 -49.89105 lineto
+217.70581 -49.89105 lineto
+ closepath stroke
+238.84796 -56.6682 moveto
+(DarkCy) cmr9 8.96637 fshow
+270.22586 -56.6682 moveto
+(an) cmr9 8.96637 fshow
+ 0.72 0.525 0.044 setrgbcolor
+newpath 326.55872 -58.96213 moveto
+344.70087 -58.96213 lineto
+344.70087 -49.89105 lineto
+326.55872 -49.89105 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -58.96213 moveto
+344.70087 -58.96213 lineto
+344.70087 -49.89105 lineto
+326.55872 -49.89105 lineto
+ closepath stroke
+347.70087 -57.53995 moveto
+(DarkGoldenro) cmr9 8.96637 fshow
+405.02097 -57.53995 moveto
+(d) cmr9 8.96637 fshow
+ 0.664 0.664 0.664 setrgbcolor
+newpath 0 -70.75455 moveto
+18.14215 -70.75455 lineto
+18.14215 -61.68347 lineto
+0 -61.68347 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -70.75455 moveto
+18.14215 -70.75455 lineto
+18.14215 -61.68347 lineto
+0 -61.68347 lineto
+ closepath stroke
+21.14215 -68.46062 moveto
+(DarkGra) cmr9 8.96637 fshow
+56.44424 -68.46062 moveto
+(y) cmr9 8.96637 fshow
+ 0 0.392 0 setrgbcolor
+newpath 108.8529 -70.75455 moveto
+126.99506 -70.75455 lineto
+126.99506 -61.68347 lineto
+108.8529 -61.68347 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -70.75455 moveto
+126.99506 -70.75455 lineto
+126.99506 -61.68347 lineto
+108.8529 -61.68347 lineto
+ closepath stroke
+129.99506 -69.33237 moveto
+(DarkGreen) cmr9 8.96637 fshow
+ 0.664 0.664 0.664 setrgbcolor
+newpath 217.70581 -70.75455 moveto
+235.84796 -70.75455 lineto
+235.84796 -61.68347 lineto
+217.70581 -61.68347 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -70.75455 moveto
+235.84796 -70.75455 lineto
+235.84796 -61.68347 lineto
+217.70581 -61.68347 lineto
+ closepath stroke
+238.84796 -68.46062 moveto
+(DarkGrey) cmr9 8.96637 fshow
+ 0.74 0.716 0.42 setrgbcolor
+newpath 326.55872 -70.75455 moveto
+344.70087 -70.75455 lineto
+344.70087 -61.68347 lineto
+326.55872 -61.68347 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -70.75455 moveto
+344.70087 -70.75455 lineto
+344.70087 -61.68347 lineto
+326.55872 -61.68347 lineto
+ closepath stroke
+347.70087 -69.33237 moveto
+(DarkKhaki) cmr9 8.96637 fshow
+ 0.545 0 0.545 setrgbcolor
+newpath 0 -82.54698 moveto
+18.14215 -82.54698 lineto
+18.14215 -73.4759 lineto
+0 -73.4759 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -82.54698 moveto
+18.14215 -82.54698 lineto
+18.14215 -73.4759 lineto
+0 -73.4759 lineto
+ closepath stroke
+21.14215 -80.25305 moveto
+(DarkMagen) cmr9 8.96637 fshow
+67.88115 -80.25305 moveto
+(ta) cmr9 8.96637 fshow
+ 0.332 0.42 0.185 setrgbcolor
+newpath 108.8529 -82.54698 moveto
+126.99506 -82.54698 lineto
+126.99506 -73.4759 lineto
+108.8529 -73.4759 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -82.54698 moveto
+126.99506 -82.54698 lineto
+126.99506 -73.4759 lineto
+108.8529 -73.4759 lineto
+ closepath stroke
+129.99506 -81.1248 moveto
+(DarkOliv) cmr9 8.96637 fshow
+167.00465 -81.1248 moveto
+(eGreen) cmr9 8.96637 fshow
+ 1 0.55 0 setrgbcolor
+newpath 217.70581 -82.54698 moveto
+235.84796 -82.54698 lineto
+235.84796 -73.4759 lineto
+217.70581 -73.4759 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -82.54698 moveto
+235.84796 -82.54698 lineto
+235.84796 -73.4759 lineto
+217.70581 -73.4759 lineto
+ closepath stroke
+238.84796 -80.25305 moveto
+(DarkOrange) cmr9 8.96637 fshow
+ 0.6 0.196 0.8 setrgbcolor
+newpath 326.55872 -82.54698 moveto
+344.70087 -82.54698 lineto
+344.70087 -73.4759 lineto
+326.55872 -73.4759 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -82.54698 moveto
+344.70087 -82.54698 lineto
+344.70087 -73.4759 lineto
+326.55872 -73.4759 lineto
+ closepath stroke
+347.70087 -81.1248 moveto
+(DarkOrc) cmr9 8.96637 fshow
+382.42737 -81.1248 moveto
+(hid) cmr9 8.96637 fshow
+ 0.545 0 0 setrgbcolor
+newpath 0 -94.3394 moveto
+18.14215 -94.3394 lineto
+18.14215 -85.26833 lineto
+0 -85.26833 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -94.3394 moveto
+18.14215 -94.3394 lineto
+18.14215 -85.26833 lineto
+0 -85.26833 lineto
+ closepath stroke
+21.14215 -92.91722 moveto
+(DarkRed) cmr9 8.96637 fshow
+ 0.912 0.59 0.48 setrgbcolor
+newpath 108.8529 -94.3394 moveto
+126.99506 -94.3394 lineto
+126.99506 -85.26833 lineto
+108.8529 -85.26833 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -94.3394 moveto
+126.99506 -94.3394 lineto
+126.99506 -85.26833 lineto
+108.8529 -85.26833 lineto
+ closepath stroke
+129.99506 -92.91722 moveto
+(DarkSalmon) cmr9 8.96637 fshow
+ 0.56 0.736 0.56 setrgbcolor
+newpath 217.70581 -94.3394 moveto
+235.84796 -94.3394 lineto
+235.84796 -85.26833 lineto
+217.70581 -85.26833 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -94.3394 moveto
+235.84796 -94.3394 lineto
+235.84796 -85.26833 lineto
+217.70581 -85.26833 lineto
+ closepath stroke
+238.84796 -92.91722 moveto
+(DarkSeaGreen) cmr9 8.96637 fshow
+ 0.284 0.24 0.545 setrgbcolor
+newpath 326.55872 -94.3394 moveto
+344.70087 -94.3394 lineto
+344.70087 -85.26833 lineto
+326.55872 -85.26833 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -94.3394 moveto
+344.70087 -94.3394 lineto
+344.70087 -85.26833 lineto
+326.55872 -85.26833 lineto
+ closepath stroke
+347.70087 -92.91722 moveto
+(DarkSlateBlue) cmr9 8.96637 fshow
+ 0.185 0.31 0.31 setrgbcolor
+newpath 0 -106.13184 moveto
+18.14215 -106.13184 lineto
+18.14215 -97.06076 lineto
+0 -97.06076 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -106.13184 moveto
+18.14215 -106.13184 lineto
+18.14215 -97.06076 lineto
+0 -97.06076 lineto
+ closepath stroke
+21.14215 -103.8379 moveto
+(DarkSlateGra) cmr9 8.96637 fshow
+76.41435 -103.8379 moveto
+(y) cmr9 8.96637 fshow
+ 0.185 0.31 0.31 setrgbcolor
+newpath 108.8529 -106.13184 moveto
+126.99506 -106.13184 lineto
+126.99506 -97.06076 lineto
+108.8529 -97.06076 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -106.13184 moveto
+126.99506 -106.13184 lineto
+126.99506 -97.06076 lineto
+108.8529 -97.06076 lineto
+ closepath stroke
+129.99506 -103.8379 moveto
+(DarkSlateGrey) cmr9 8.96637 fshow
+ 0 0.808 0.82 setrgbcolor
+newpath 217.70581 -106.13184 moveto
+235.84796 -106.13184 lineto
+235.84796 -97.06076 lineto
+217.70581 -97.06076 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -106.13184 moveto
+235.84796 -106.13184 lineto
+235.84796 -97.06076 lineto
+217.70581 -97.06076 lineto
+ closepath stroke
+238.84796 -103.8379 moveto
+(DarkT) cmr9 8.96637 fshow
+264.85027 -103.8379 moveto
+(urquoise) cmr9 8.96637 fshow
+ 0.58 0 0.828 setrgbcolor
+newpath 326.55872 -106.13184 moveto
+344.70087 -106.13184 lineto
+344.70087 -97.06076 lineto
+326.55872 -97.06076 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -106.13184 moveto
+344.70087 -106.13184 lineto
+344.70087 -97.06076 lineto
+326.55872 -97.06076 lineto
+ closepath stroke
+347.70087 -104.70966 moveto
+(DarkViolet) cmr9 8.96637 fshow
+ 1 0.08 0.576 setrgbcolor
+newpath 0 -117.92426 moveto
+18.14215 -117.92426 lineto
+18.14215 -108.85318 lineto
+0 -108.85318 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -117.92426 moveto
+18.14215 -117.92426 lineto
+18.14215 -108.85318 lineto
+0 -108.85318 lineto
+ closepath stroke
+21.14215 -115.63033 moveto
+(DeepPink) cmr9 8.96637 fshow
+ 0 0.75 1 setrgbcolor
+newpath 108.8529 -117.92426 moveto
+126.99506 -117.92426 lineto
+126.99506 -108.85318 lineto
+108.8529 -108.85318 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -117.92426 moveto
+126.99506 -117.92426 lineto
+126.99506 -108.85318 lineto
+108.8529 -108.85318 lineto
+ closepath stroke
+129.99506 -115.63033 moveto
+(DeepSkyBlue) cmr9 8.96637 fshow
+ 0.41 0.41 0.41 setrgbcolor
+newpath 217.70581 -117.92426 moveto
+235.84796 -117.92426 lineto
+235.84796 -108.85318 lineto
+217.70581 -108.85318 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -117.92426 moveto
+235.84796 -117.92426 lineto
+235.84796 -108.85318 lineto
+217.70581 -108.85318 lineto
+ closepath stroke
+238.84796 -115.58047 moveto
+(DimGra) cmr9 8.96637 fshow
+271.31346 -115.58047 moveto
+(y) cmr9 8.96637 fshow
+ 0.41 0.41 0.41 setrgbcolor
+newpath 326.55872 -117.92426 moveto
+344.70087 -117.92426 lineto
+344.70087 -108.85318 lineto
+326.55872 -108.85318 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -117.92426 moveto
+344.70087 -117.92426 lineto
+344.70087 -108.85318 lineto
+326.55872 -108.85318 lineto
+ closepath stroke
+347.70087 -115.58047 moveto
+(DimGrey) cmr9 8.96637 fshow
+ 0.116 0.565 1 setrgbcolor
+newpath 0 -129.71669 moveto
+18.14215 -129.71669 lineto
+18.14215 -120.64561 lineto
+0 -120.64561 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -129.71669 moveto
+18.14215 -129.71669 lineto
+18.14215 -120.64561 lineto
+0 -120.64561 lineto
+ closepath stroke
+21.14215 -127.42276 moveto
+(Do) cmr9 8.96637 fshow
+33.04465 -127.42276 moveto
+(dgerBlue) cmr9 8.96637 fshow
+ 0.698 0.132 0.132 setrgbcolor
+newpath 108.8529 -129.71669 moveto
+126.99506 -129.71669 lineto
+126.99506 -120.64561 lineto
+108.8529 -120.64561 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -129.71669 moveto
+126.99506 -129.71669 lineto
+126.99506 -120.64561 lineto
+108.8529 -120.64561 lineto
+ closepath stroke
+129.99506 -128.29451 moveto
+(FireBric) cmr9 8.96637 fshow
+162.80435 -128.29451 moveto
+(k) cmr9 8.96637 fshow
+ 1 0.98 0.94 setrgbcolor
+newpath 217.70581 -129.71669 moveto
+235.84796 -129.71669 lineto
+235.84796 -120.64561 lineto
+217.70581 -120.64561 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -129.71669 moveto
+235.84796 -129.71669 lineto
+235.84796 -120.64561 lineto
+217.70581 -120.64561 lineto
+ closepath stroke
+238.84796 -128.29451 moveto
+(FloralWhite) cmr9 8.96637 fshow
+ 0.132 0.545 0.132 setrgbcolor
+newpath 326.55872 -129.71669 moveto
+344.70087 -129.71669 lineto
+344.70087 -120.64561 lineto
+326.55872 -120.64561 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -129.71669 moveto
+344.70087 -129.71669 lineto
+344.70087 -120.64561 lineto
+326.55872 -120.64561 lineto
+ closepath stroke
+347.70087 -128.24466 moveto
+(F) cmr9 8.96637 fshow
+352.94777 -128.24466 moveto
+(orestGreen) cmr9 8.96637 fshow
+ 1 0 1 setrgbcolor
+newpath 0 -141.50911 moveto
+18.14215 -141.50911 lineto
+18.14215 -132.43803 lineto
+0 -132.43803 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -141.50911 moveto
+18.14215 -141.50911 lineto
+18.14215 -132.43803 lineto
+0 -132.43803 lineto
+ closepath stroke
+21.14215 -140.08693 moveto
+(F) cmr9 8.96637 fshow
+26.38905 -140.08693 moveto
+(uc) cmr9 8.96637 fshow
+35.34845 -140.08693 moveto
+(hsia) cmr9 8.96637 fshow
+ 0.864 0.864 0.864 setrgbcolor
+newpath 108.8529 -141.50911 moveto
+126.99506 -141.50911 lineto
+126.99506 -132.43803 lineto
+108.8529 -132.43803 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -141.50911 moveto
+126.99506 -141.50911 lineto
+126.99506 -132.43803 lineto
+108.8529 -132.43803 lineto
+ closepath stroke
+129.99506 -140.08693 moveto
+(Gainsb) cmr9 8.96637 fshow
+158.52396 -140.08693 moveto
+(oro) cmr9 8.96637 fshow
+ 0.972 0.972 1 setrgbcolor
+newpath 217.70581 -141.50911 moveto
+235.84796 -141.50911 lineto
+235.84796 -132.43803 lineto
+217.70581 -132.43803 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -141.50911 moveto
+235.84796 -141.50911 lineto
+235.84796 -132.43803 lineto
+217.70581 -132.43803 lineto
+ closepath stroke
+238.84796 -140.08693 moveto
+(GhostWhite) cmr9 8.96637 fshow
+ 1 0.844 0 setrgbcolor
+newpath 326.55872 -141.50911 moveto
+344.70087 -141.50911 lineto
+344.70087 -132.43803 lineto
+326.55872 -132.43803 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -141.50911 moveto
+344.70087 -141.50911 lineto
+344.70087 -132.43803 lineto
+326.55872 -132.43803 lineto
+ closepath stroke
+347.70087 -140.08693 moveto
+(Gold) cmr9 8.96637 fshow
+ 0.855 0.648 0.125 setrgbcolor
+newpath 0 -153.30153 moveto
+18.14215 -153.30153 lineto
+18.14215 -144.23045 lineto
+0 -144.23045 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -153.30153 moveto
+18.14215 -153.30153 lineto
+18.14215 -144.23045 lineto
+0 -144.23045 lineto
+ closepath stroke
+21.14215 -151.87935 moveto
+(Goldenro) cmr9 8.96637 fshow
+58.34755 -151.87935 moveto
+(d) cmr9 8.96637 fshow
+ 0.5 0.5 0.5 setrgbcolor
+newpath 108.8529 -153.30153 moveto
+126.99506 -153.30153 lineto
+126.99506 -144.23045 lineto
+108.8529 -144.23045 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -153.30153 moveto
+126.99506 -153.30153 lineto
+126.99506 -144.23045 lineto
+108.8529 -144.23045 lineto
+ closepath stroke
+129.99506 -150.95775 moveto
+(Gra) cmr9 8.96637 fshow
+145.18245 -150.95775 moveto
+(y) cmr9 8.96637 fshow
+ 0 0.5 0 setrgbcolor
+newpath 217.70581 -153.30153 moveto
+235.84796 -153.30153 lineto
+235.84796 -144.23045 lineto
+217.70581 -144.23045 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -153.30153 moveto
+235.84796 -153.30153 lineto
+235.84796 -144.23045 lineto
+217.70581 -144.23045 lineto
+ closepath stroke
+238.84796 -151.8295 moveto
+(Green) cmr9 8.96637 fshow
+ 0.68 1 0.185 setrgbcolor
+newpath 326.55872 -153.30153 moveto
+344.70087 -153.30153 lineto
+344.70087 -144.23045 lineto
+326.55872 -144.23045 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -153.30153 moveto
+344.70087 -153.30153 lineto
+344.70087 -144.23045 lineto
+326.55872 -144.23045 lineto
+ closepath stroke
+347.70087 -151.87935 moveto
+(GreenY) cmr9 8.96637 fshow
+377.99677 -151.87935 moveto
+(ello) cmr9 8.96637 fshow
+391.56726 -151.87935 moveto
+(w) cmr9 8.96637 fshow
+ 0.5 0.5 0.5 setrgbcolor
+newpath 0 -165.09396 moveto
+18.14215 -165.09396 lineto
+18.14215 -156.02289 lineto
+0 -156.02289 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -165.09396 moveto
+18.14215 -165.09396 lineto
+18.14215 -156.02289 lineto
+0 -156.02289 lineto
+ closepath stroke
+21.14215 -162.75018 moveto
+(Grey) cmr9 8.96637 fshow
+ 0.94 1 0.94 setrgbcolor
+newpath 108.8529 -165.09396 moveto
+126.99506 -165.09396 lineto
+126.99506 -156.02289 lineto
+108.8529 -156.02289 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -165.09396 moveto
+126.99506 -165.09396 lineto
+126.99506 -156.02289 lineto
+108.8529 -156.02289 lineto
+ closepath stroke
+129.99506 -162.80003 moveto
+(Honeydew) cmr9 8.96637 fshow
+ 1 0.41 0.705 setrgbcolor
+newpath 217.70581 -165.09396 moveto
+235.84796 -165.09396 lineto
+235.84796 -156.02289 lineto
+217.70581 -156.02289 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -165.09396 moveto
+235.84796 -165.09396 lineto
+235.84796 -156.02289 lineto
+217.70581 -156.02289 lineto
+ closepath stroke
+238.84796 -163.67178 moveto
+(HotPink) cmr9 8.96637 fshow
+ 0.804 0.36 0.36 setrgbcolor
+newpath 326.55872 -165.09396 moveto
+344.70087 -165.09396 lineto
+344.70087 -156.02289 lineto
+326.55872 -156.02289 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -165.09396 moveto
+344.70087 -165.09396 lineto
+344.70087 -156.02289 lineto
+326.55872 -156.02289 lineto
+ closepath stroke
+347.70087 -163.67178 moveto
+(IndianRed) cmr9 8.96637 fshow
+ 0.294 0 0.51 setrgbcolor
+newpath 0 -176.88638 moveto
+18.14215 -176.88638 lineto
+18.14215 -167.8153 lineto
+0 -167.8153 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -176.88638 moveto
+18.14215 -176.88638 lineto
+18.14215 -167.8153 lineto
+0 -167.8153 lineto
+ closepath stroke
+21.14215 -174.59245 moveto
+(Indigo) cmr9 8.96637 fshow
+ 1 1 0.94 setrgbcolor
+newpath 108.8529 -176.88638 moveto
+126.99506 -176.88638 lineto
+126.99506 -167.8153 lineto
+108.8529 -167.8153 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -176.88638 moveto
+126.99506 -176.88638 lineto
+126.99506 -167.8153 lineto
+108.8529 -167.8153 lineto
+ closepath stroke
+129.99506 -174.5426 moveto
+(Iv) cmr9 8.96637 fshow
+137.92915 -174.5426 moveto
+(ory) cmr9 8.96637 fshow
+ 0.94 0.9 0.55 setrgbcolor
+newpath 217.70581 -176.88638 moveto
+235.84796 -176.88638 lineto
+235.84796 -167.8153 lineto
+217.70581 -167.8153 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -176.88638 moveto
+235.84796 -176.88638 lineto
+235.84796 -167.8153 lineto
+217.70581 -167.8153 lineto
+ closepath stroke
+238.84796 -175.4642 moveto
+(Khaki) cmr9 8.96637 fshow
+ 0.9 0.9 0.98 setrgbcolor
+newpath 326.55872 -176.88638 moveto
+344.70087 -176.88638 lineto
+344.70087 -167.8153 lineto
+326.55872 -167.8153 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -176.88638 moveto
+344.70087 -176.88638 lineto
+344.70087 -167.8153 lineto
+326.55872 -167.8153 lineto
+ closepath stroke
+347.70087 -175.4642 moveto
+(La) cmr9 8.96637 fshow
+357.81146 -175.4642 moveto
+(v) cmr9 8.96637 fshow
+362.41917 -175.4642 moveto
+(ender) cmr9 8.96637 fshow
+ 1 0.94 0.96 setrgbcolor
+newpath 0 -188.67882 moveto
+18.14215 -188.67882 lineto
+18.14215 -179.60774 lineto
+0 -179.60774 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -188.67882 moveto
+18.14215 -188.67882 lineto
+18.14215 -179.60774 lineto
+0 -179.60774 lineto
+ closepath stroke
+21.14215 -187.25664 moveto
+(La) cmr9 8.96637 fshow
+31.25275 -187.25664 moveto
+(v) cmr9 8.96637 fshow
+35.86046 -187.25664 moveto
+(enderBlush) cmr9 8.96637 fshow
+ 0.488 0.99 0 setrgbcolor
+newpath 108.8529 -188.67882 moveto
+126.99506 -188.67882 lineto
+126.99506 -179.60774 lineto
+108.8529 -179.60774 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -188.67882 moveto
+126.99506 -188.67882 lineto
+126.99506 -179.60774 lineto
+108.8529 -179.60774 lineto
+ closepath stroke
+129.99506 -187.20679 moveto
+(La) cmr9 8.96637 fshow
+140.10565 -187.20679 moveto
+(wnGreen) cmr9 8.96637 fshow
+ 1 0.98 0.804 setrgbcolor
+newpath 217.70581 -188.67882 moveto
+235.84796 -188.67882 lineto
+235.84796 -179.60774 lineto
+217.70581 -179.60774 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -188.67882 moveto
+235.84796 -188.67882 lineto
+235.84796 -179.60774 lineto
+217.70581 -179.60774 lineto
+ closepath stroke
+238.84796 -187.25664 moveto
+(LemonChi\013on) cmr9 8.96637 fshow
+ 0.68 0.848 0.9 setrgbcolor
+newpath 326.55872 -188.67882 moveto
+344.70087 -188.67882 lineto
+344.70087 -179.60774 lineto
+326.55872 -179.60774 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -188.67882 moveto
+344.70087 -188.67882 lineto
+344.70087 -179.60774 lineto
+326.55872 -179.60774 lineto
+ closepath stroke
+347.70087 -186.38489 moveto
+(Ligh) cmr9 8.96637 fshow
+365.49097 -186.38489 moveto
+(tBlue) cmr9 8.96637 fshow
+ 0.94 0.5 0.5 setrgbcolor
+newpath 0 -200.47124 moveto
+18.14215 -200.47124 lineto
+18.14215 -191.40016 lineto
+0 -191.40016 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -200.47124 moveto
+18.14215 -200.47124 lineto
+18.14215 -191.40016 lineto
+0 -191.40016 lineto
+ closepath stroke
+21.14215 -198.1773 moveto
+(Ligh) cmr9 8.96637 fshow
+38.93225 -198.1773 moveto
+(tCoral) cmr9 8.96637 fshow
+ 0.88 1 1 setrgbcolor
+newpath 108.8529 -200.47124 moveto
+126.99506 -200.47124 lineto
+126.99506 -191.40016 lineto
+108.8529 -191.40016 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -200.47124 moveto
+126.99506 -200.47124 lineto
+126.99506 -191.40016 lineto
+108.8529 -191.40016 lineto
+ closepath stroke
+129.99506 -198.1773 moveto
+(Ligh) cmr9 8.96637 fshow
+147.78516 -198.1773 moveto
+(tCy) cmr9 8.96637 fshow
+162.63216 -198.1773 moveto
+(an) cmr9 8.96637 fshow
+ 0.933 0.867 0.51 setrgbcolor
+newpath 217.70581 -200.47124 moveto
+235.84796 -200.47124 lineto
+235.84796 -191.40016 lineto
+217.70581 -191.40016 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -200.47124 moveto
+235.84796 -200.47124 lineto
+235.84796 -191.40016 lineto
+217.70581 -191.40016 lineto
+ closepath stroke
+238.84796 -198.1773 moveto
+(Ligh) cmr9 8.96637 fshow
+256.63806 -198.1773 moveto
+(tGoldenro) cmr9 8.96637 fshow
+297.42715 -198.1773 moveto
+(d) cmr9 8.96637 fshow
+ 0.98 0.98 0.824 setrgbcolor
+newpath 326.55872 -200.47124 moveto
+344.70087 -200.47124 lineto
+344.70087 -191.40016 lineto
+326.55872 -191.40016 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -200.47124 moveto
+344.70087 -200.47124 lineto
+344.70087 -191.40016 lineto
+326.55872 -191.40016 lineto
+ closepath stroke
+347.70087 -198.1773 moveto
+(Ligh) cmr9 8.96637 fshow
+365.49097 -198.1773 moveto
+(tGoldenro) cmr9 8.96637 fshow
+406.28006 -198.1773 moveto
+(dY) cmr9 8.96637 fshow
+417.54196 -198.1773 moveto
+(ello) cmr9 8.96637 fshow
+431.11247 -198.1773 moveto
+(w) cmr9 8.96637 fshow
+ 0.828 0.828 0.828 setrgbcolor
+newpath 0 -212.26366 moveto
+18.14215 -212.26366 lineto
+18.14215 -203.19258 lineto
+0 -203.19258 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -212.26366 moveto
+18.14215 -212.26366 lineto
+18.14215 -203.19258 lineto
+0 -203.19258 lineto
+ closepath stroke
+21.14215 -209.96973 moveto
+(Ligh) cmr9 8.96637 fshow
+38.93225 -209.96973 moveto
+(tGra) cmr9 8.96637 fshow
+57.70335 -209.96973 moveto
+(y) cmr9 8.96637 fshow
+ 0.565 0.932 0.565 setrgbcolor
+newpath 108.8529 -212.26366 moveto
+126.99506 -212.26366 lineto
+126.99506 -203.19258 lineto
+108.8529 -203.19258 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -212.26366 moveto
+126.99506 -212.26366 lineto
+126.99506 -203.19258 lineto
+108.8529 -203.19258 lineto
+ closepath stroke
+129.99506 -209.96973 moveto
+(Ligh) cmr9 8.96637 fshow
+147.78516 -209.96973 moveto
+(tGreen) cmr9 8.96637 fshow
+ 0.828 0.828 0.828 setrgbcolor
+newpath 217.70581 -212.26366 moveto
+235.84796 -212.26366 lineto
+235.84796 -203.19258 lineto
+217.70581 -203.19258 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -212.26366 moveto
+235.84796 -212.26366 lineto
+235.84796 -203.19258 lineto
+217.70581 -203.19258 lineto
+ closepath stroke
+238.84796 -209.96973 moveto
+(Ligh) cmr9 8.96637 fshow
+256.63806 -209.96973 moveto
+(tGrey) cmr9 8.96637 fshow
+ 1 0.712 0.756 setrgbcolor
+newpath 326.55872 -212.26366 moveto
+344.70087 -212.26366 lineto
+344.70087 -203.19258 lineto
+326.55872 -203.19258 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -212.26366 moveto
+344.70087 -212.26366 lineto
+344.70087 -203.19258 lineto
+326.55872 -203.19258 lineto
+ closepath stroke
+347.70087 -209.96973 moveto
+(Ligh) cmr9 8.96637 fshow
+365.49097 -209.96973 moveto
+(tPink) cmr9 8.96637 fshow
+ 1 0.628 0.48 setrgbcolor
+newpath 0 -224.05609 moveto
+18.14215 -224.05609 lineto
+18.14215 -214.98502 lineto
+0 -214.98502 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -224.05609 moveto
+18.14215 -224.05609 lineto
+18.14215 -214.98502 lineto
+0 -214.98502 lineto
+ closepath stroke
+21.14215 -221.76216 moveto
+(Ligh) cmr9 8.96637 fshow
+38.93225 -221.76216 moveto
+(tSalmon) cmr9 8.96637 fshow
+ 0.125 0.698 0.668 setrgbcolor
+newpath 108.8529 -224.05609 moveto
+126.99506 -224.05609 lineto
+126.99506 -214.98502 lineto
+108.8529 -214.98502 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -224.05609 moveto
+126.99506 -224.05609 lineto
+126.99506 -214.98502 lineto
+108.8529 -214.98502 lineto
+ closepath stroke
+129.99506 -221.76216 moveto
+(Ligh) cmr9 8.96637 fshow
+147.78516 -221.76216 moveto
+(tSeaGreen) cmr9 8.96637 fshow
+ 0.53 0.808 0.98 setrgbcolor
+newpath 217.70581 -224.05609 moveto
+235.84796 -224.05609 lineto
+235.84796 -214.98502 lineto
+217.70581 -214.98502 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -224.05609 moveto
+235.84796 -224.05609 lineto
+235.84796 -214.98502 lineto
+217.70581 -214.98502 lineto
+ closepath stroke
+238.84796 -221.76216 moveto
+(Ligh) cmr9 8.96637 fshow
+256.63806 -221.76216 moveto
+(tSkyBlue) cmr9 8.96637 fshow
+ 0.518 0.44 1 setrgbcolor
+newpath 326.55872 -224.05609 moveto
+344.70087 -224.05609 lineto
+344.70087 -214.98502 lineto
+326.55872 -214.98502 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -224.05609 moveto
+344.70087 -224.05609 lineto
+344.70087 -214.98502 lineto
+326.55872 -214.98502 lineto
+ closepath stroke
+347.70087 -221.76216 moveto
+(Ligh) cmr9 8.96637 fshow
+365.49097 -221.76216 moveto
+(tSlateBlue) cmr9 8.96637 fshow
+ 0.468 0.532 0.6 setrgbcolor
+newpath 0 -235.84851 moveto
+18.14215 -235.84851 lineto
+18.14215 -226.77744 lineto
+0 -226.77744 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -235.84851 moveto
+18.14215 -235.84851 lineto
+18.14215 -226.77744 lineto
+0 -226.77744 lineto
+ closepath stroke
+21.14215 -233.55458 moveto
+(Ligh) cmr9 8.96637 fshow
+38.93225 -233.55458 moveto
+(tSlateGra) cmr9 8.96637 fshow
+77.67355 -233.55458 moveto
+(y) cmr9 8.96637 fshow
+ 0.468 0.532 0.6 setrgbcolor
+newpath 108.8529 -235.84851 moveto
+126.99506 -235.84851 lineto
+126.99506 -226.77744 lineto
+108.8529 -226.77744 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -235.84851 moveto
+126.99506 -235.84851 lineto
+126.99506 -226.77744 lineto
+108.8529 -226.77744 lineto
+ closepath stroke
+129.99506 -233.55458 moveto
+(Ligh) cmr9 8.96637 fshow
+147.78516 -233.55458 moveto
+(tSlateGrey) cmr9 8.96637 fshow
+ 0.69 0.77 0.87 setrgbcolor
+newpath 217.70581 -235.84851 moveto
+235.84796 -235.84851 lineto
+235.84796 -226.77744 lineto
+217.70581 -226.77744 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -235.84851 moveto
+235.84796 -235.84851 lineto
+235.84796 -226.77744 lineto
+217.70581 -226.77744 lineto
+ closepath stroke
+238.84796 -233.55458 moveto
+(Ligh) cmr9 8.96637 fshow
+256.63806 -233.55458 moveto
+(tSteelBlue) cmr9 8.96637 fshow
+ 1 1 0.88 setrgbcolor
+newpath 326.55872 -235.84851 moveto
+344.70087 -235.84851 lineto
+344.70087 -226.77744 lineto
+326.55872 -226.77744 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -235.84851 moveto
+344.70087 -235.84851 lineto
+344.70087 -226.77744 lineto
+326.55872 -226.77744 lineto
+ closepath stroke
+347.70087 -233.55458 moveto
+(Ligh) cmr9 8.96637 fshow
+365.49097 -233.55458 moveto
+(tY) cmr9 8.96637 fshow
+375.21687 -233.55458 moveto
+(ello) cmr9 8.96637 fshow
+388.78746 -233.55458 moveto
+(w) cmr9 8.96637 fshow
+ 0 1 0 setrgbcolor
+newpath 0 -247.64095 moveto
+18.14215 -247.64095 lineto
+18.14215 -238.56987 lineto
+0 -238.56987 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -247.64095 moveto
+18.14215 -247.64095 lineto
+18.14215 -238.56987 lineto
+0 -238.56987 lineto
+ closepath stroke
+21.14215 -246.16891 moveto
+(Lime) cmr9 8.96637 fshow
+ 0.196 0.804 0.196 setrgbcolor
+newpath 108.8529 -247.64095 moveto
+126.99506 -247.64095 lineto
+126.99506 -238.56987 lineto
+108.8529 -238.56987 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -247.64095 moveto
+126.99506 -247.64095 lineto
+126.99506 -238.56987 lineto
+108.8529 -238.56987 lineto
+ closepath stroke
+129.99506 -246.16891 moveto
+(LimeGreen) cmr9 8.96637 fshow
+ 0.98 0.94 0.9 setrgbcolor
+newpath 217.70581 -247.64095 moveto
+235.84796 -247.64095 lineto
+235.84796 -238.56987 lineto
+217.70581 -238.56987 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -247.64095 moveto
+235.84796 -247.64095 lineto
+235.84796 -238.56987 lineto
+217.70581 -238.56987 lineto
+ closepath stroke
+238.84796 -246.16891 moveto
+(Linen) cmr9 8.96637 fshow
+ 1 0 1 setrgbcolor
+newpath 326.55872 -247.64095 moveto
+344.70087 -247.64095 lineto
+344.70087 -238.56987 lineto
+326.55872 -238.56987 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -247.64095 moveto
+344.70087 -247.64095 lineto
+344.70087 -238.56987 lineto
+326.55872 -238.56987 lineto
+ closepath stroke
+347.70087 -245.29716 moveto
+(Magen) cmr9 8.96637 fshow
+374.32516 -245.29716 moveto
+(ta) cmr9 8.96637 fshow
+ 0.5 0 0 setrgbcolor
+newpath 0 -259.43336 moveto
+18.14215 -259.43336 lineto
+18.14215 -250.36229 lineto
+0 -250.36229 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -259.43336 moveto
+18.14215 -259.43336 lineto
+18.14215 -250.36229 lineto
+0 -250.36229 lineto
+ closepath stroke
+21.14215 -257.96133 moveto
+(Maro) cmr9 8.96637 fshow
+42.66405 -257.96133 moveto
+(on) cmr9 8.96637 fshow
+ 0.4 0.804 0.668 setrgbcolor
+newpath 108.8529 -259.43336 moveto
+126.99506 -259.43336 lineto
+126.99506 -250.36229 lineto
+108.8529 -250.36229 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -259.43336 moveto
+126.99506 -259.43336 lineto
+126.99506 -250.36229 lineto
+108.8529 -250.36229 lineto
+ closepath stroke
+129.99506 -257.13943 moveto
+(MediumAquamarine) cmr9 8.96637 fshow
+ 0 0 0.804 setrgbcolor
+newpath 217.70581 -259.43336 moveto
+235.84796 -259.43336 lineto
+235.84796 -250.36229 lineto
+217.70581 -250.36229 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -259.43336 moveto
+235.84796 -259.43336 lineto
+235.84796 -250.36229 lineto
+217.70581 -250.36229 lineto
+ closepath stroke
+238.84796 -258.01118 moveto
+(MediumBlue) cmr9 8.96637 fshow
+ 0.73 0.332 0.828 setrgbcolor
+newpath 326.55872 -259.43336 moveto
+344.70087 -259.43336 lineto
+344.70087 -250.36229 lineto
+326.55872 -250.36229 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -259.43336 moveto
+344.70087 -259.43336 lineto
+344.70087 -250.36229 lineto
+326.55872 -250.36229 lineto
+ closepath stroke
+347.70087 -258.01118 moveto
+(MediumOrc) cmr9 8.96637 fshow
+395.33647 -258.01118 moveto
+(hid) cmr9 8.96637 fshow
+ 0.576 0.44 0.86 setrgbcolor
+newpath 0 -271.2258 moveto
+18.14215 -271.2258 lineto
+18.14215 -262.15472 lineto
+0 -262.15472 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -271.2258 moveto
+18.14215 -271.2258 lineto
+18.14215 -262.15472 lineto
+0 -262.15472 lineto
+ closepath stroke
+21.14215 -268.93187 moveto
+(MediumPurple) cmr9 8.96637 fshow
+ 0.235 0.7 0.444 setrgbcolor
+newpath 108.8529 -271.2258 moveto
+126.99506 -271.2258 lineto
+126.99506 -262.15472 lineto
+108.8529 -262.15472 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -271.2258 moveto
+126.99506 -271.2258 lineto
+126.99506 -262.15472 lineto
+108.8529 -262.15472 lineto
+ closepath stroke
+129.99506 -269.80362 moveto
+(MediumSeaGreen) cmr9 8.96637 fshow
+ 0.484 0.408 0.932 setrgbcolor
+newpath 217.70581 -271.2258 moveto
+235.84796 -271.2258 lineto
+235.84796 -262.15472 lineto
+217.70581 -262.15472 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -271.2258 moveto
+235.84796 -271.2258 lineto
+235.84796 -262.15472 lineto
+217.70581 -262.15472 lineto
+ closepath stroke
+238.84796 -269.80362 moveto
+(MediumSlateBlue) cmr9 8.96637 fshow
+ 0 0.98 0.604 setrgbcolor
+newpath 326.55872 -271.2258 moveto
+344.70087 -271.2258 lineto
+344.70087 -262.15472 lineto
+326.55872 -262.15472 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -271.2258 moveto
+344.70087 -271.2258 lineto
+344.70087 -262.15472 lineto
+326.55872 -262.15472 lineto
+ closepath stroke
+347.70087 -268.93187 moveto
+(MediumSpringGreen) cmr9 8.96637 fshow
+ 0.284 0.82 0.8 setrgbcolor
+newpath 0 -283.01822 moveto
+18.14215 -283.01822 lineto
+18.14215 -273.94714 lineto
+0 -273.94714 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -283.01822 moveto
+18.14215 -283.01822 lineto
+18.14215 -273.94714 lineto
+0 -273.94714 lineto
+ closepath stroke
+21.14215 -280.72429 moveto
+(MediumT) cmr9 8.96637 fshow
+60.05356 -280.72429 moveto
+(urquoise) cmr9 8.96637 fshow
+ 0.78 0.084 0.52 setrgbcolor
+newpath 108.8529 -283.01822 moveto
+126.99506 -283.01822 lineto
+126.99506 -273.94714 lineto
+108.8529 -273.94714 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -283.01822 moveto
+126.99506 -283.01822 lineto
+126.99506 -273.94714 lineto
+108.8529 -273.94714 lineto
+ closepath stroke
+129.99506 -281.59604 moveto
+(MediumVioletRed) cmr9 8.96637 fshow
+ 0.098 0.098 0.44 setrgbcolor
+newpath 217.70581 -283.01822 moveto
+235.84796 -283.01822 lineto
+235.84796 -273.94714 lineto
+217.70581 -273.94714 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -283.01822 moveto
+235.84796 -283.01822 lineto
+235.84796 -273.94714 lineto
+217.70581 -273.94714 lineto
+ closepath stroke
+238.84796 -280.72429 moveto
+(Midnigh) cmr9 8.96637 fshow
+272.12436 -280.72429 moveto
+(tBlue) cmr9 8.96637 fshow
+ 0.96 1 0.98 setrgbcolor
+newpath 326.55872 -283.01822 moveto
+344.70087 -283.01822 lineto
+344.70087 -273.94714 lineto
+326.55872 -273.94714 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -283.01822 moveto
+344.70087 -283.01822 lineto
+344.70087 -273.94714 lineto
+326.55872 -273.94714 lineto
+ closepath stroke
+347.70087 -281.54619 moveto
+(Min) cmr9 8.96637 fshow
+363.57037 -281.54619 moveto
+(tCream) cmr9 8.96637 fshow
+ 1 0.894 0.884 setrgbcolor
+newpath 0 -294.81064 moveto
+18.14215 -294.81064 lineto
+18.14215 -285.73956 lineto
+0 -285.73956 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -294.81064 moveto
+18.14215 -294.81064 lineto
+18.14215 -285.73956 lineto
+0 -285.73956 lineto
+ closepath stroke
+21.14215 -292.46686 moveto
+(Mist) cmr9 8.96637 fshow
+39.11075 -292.46686 moveto
+(yRose) cmr9 8.96637 fshow
+ 1 0.894 0.71 setrgbcolor
+newpath 108.8529 -294.81064 moveto
+126.99506 -294.81064 lineto
+126.99506 -285.73956 lineto
+108.8529 -285.73956 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -294.81064 moveto
+126.99506 -294.81064 lineto
+126.99506 -285.73956 lineto
+108.8529 -285.73956 lineto
+ closepath stroke
+129.99506 -293.33861 moveto
+(Mo) cmr9 8.96637 fshow
+143.30475 -293.33861 moveto
+(ccasin) cmr9 8.96637 fshow
+ 1 0.87 0.68 setrgbcolor
+newpath 217.70581 -294.81064 moveto
+235.84796 -294.81064 lineto
+235.84796 -285.73956 lineto
+217.70581 -285.73956 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -294.81064 moveto
+235.84796 -294.81064 lineto
+235.84796 -285.73956 lineto
+217.70581 -285.73956 lineto
+ closepath stroke
+238.84796 -292.51671 moveto
+(Na) cmr9 8.96637 fshow
+250.10976 -292.51671 moveto
+(v) cmr9 8.96637 fshow
+254.46156 -292.51671 moveto
+(a) cmr9 8.96637 fshow
+259.58116 -292.51671 moveto
+(joWhite) cmr9 8.96637 fshow
+ 0 0 0.5 setrgbcolor
+newpath 326.55872 -294.81064 moveto
+344.70087 -294.81064 lineto
+344.70087 -285.73956 lineto
+326.55872 -285.73956 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -294.81064 moveto
+344.70087 -294.81064 lineto
+344.70087 -285.73956 lineto
+326.55872 -285.73956 lineto
+ closepath stroke
+347.70087 -292.46686 moveto
+(Na) cmr9 8.96637 fshow
+358.96266 -292.46686 moveto
+(vy) cmr9 8.96637 fshow
+ 0 0 0.5 setrgbcolor
+newpath 0 -306.60307 moveto
+18.14215 -306.60307 lineto
+18.14215 -297.532 lineto
+0 -297.532 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -306.60307 moveto
+18.14215 -306.60307 lineto
+18.14215 -297.532 lineto
+0 -297.532 lineto
+ closepath stroke
+21.14215 -304.30914 moveto
+(Na) cmr9 8.96637 fshow
+32.40395 -304.30914 moveto
+(vyBlue) cmr9 8.96637 fshow
+ 0.992 0.96 0.9 setrgbcolor
+newpath 108.8529 -306.60307 moveto
+126.99506 -306.60307 lineto
+126.99506 -297.532 lineto
+108.8529 -297.532 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -306.60307 moveto
+126.99506 -306.60307 lineto
+126.99506 -297.532 lineto
+108.8529 -297.532 lineto
+ closepath stroke
+129.99506 -305.1809 moveto
+(OldLace) cmr9 8.96637 fshow
+ 0.5 0.5 0 setrgbcolor
+newpath 217.70581 -306.60307 moveto
+235.84796 -306.60307 lineto
+235.84796 -297.532 lineto
+217.70581 -297.532 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -306.60307 moveto
+235.84796 -306.60307 lineto
+235.84796 -297.532 lineto
+217.70581 -297.532 lineto
+ closepath stroke
+238.84796 -305.1809 moveto
+(Oliv) cmr9 8.96637 fshow
+255.74286 -305.1809 moveto
+(e) cmr9 8.96637 fshow
+ 0.42 0.556 0.136 setrgbcolor
+newpath 326.55872 -306.60307 moveto
+344.70087 -306.60307 lineto
+344.70087 -297.532 lineto
+326.55872 -297.532 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -306.60307 moveto
+344.70087 -306.60307 lineto
+344.70087 -297.532 lineto
+326.55872 -297.532 lineto
+ closepath stroke
+347.70087 -305.1809 moveto
+(Oliv) cmr9 8.96637 fshow
+364.59576 -305.1809 moveto
+(eDrab) cmr9 8.96637 fshow
+ 1 0.648 0 setrgbcolor
+newpath 0 -318.3955 moveto
+18.14215 -318.3955 lineto
+18.14215 -309.32442 lineto
+0 -309.32442 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -318.3955 moveto
+18.14215 -318.3955 lineto
+18.14215 -309.32442 lineto
+0 -309.32442 lineto
+ closepath stroke
+21.14215 -316.05171 moveto
+(Orange) cmr9 8.96637 fshow
+ 1 0.27 0 setrgbcolor
+newpath 108.8529 -318.3955 moveto
+126.99506 -318.3955 lineto
+126.99506 -309.32442 lineto
+108.8529 -309.32442 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -318.3955 moveto
+126.99506 -318.3955 lineto
+126.99506 -309.32442 lineto
+108.8529 -309.32442 lineto
+ closepath stroke
+129.99506 -316.10156 moveto
+(OrangeRed) cmr9 8.96637 fshow
+ 0.855 0.44 0.84 setrgbcolor
+newpath 217.70581 -318.3955 moveto
+235.84796 -318.3955 lineto
+235.84796 -309.32442 lineto
+217.70581 -309.32442 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -318.3955 moveto
+235.84796 -318.3955 lineto
+235.84796 -309.32442 lineto
+217.70581 -309.32442 lineto
+ closepath stroke
+238.84796 -316.97331 moveto
+(Orc) cmr9 8.96637 fshow
+253.45976 -316.97331 moveto
+(hid) cmr9 8.96637 fshow
+ 0.932 0.91 0.668 setrgbcolor
+newpath 326.55872 -318.3955 moveto
+344.70087 -318.3955 lineto
+344.70087 -309.32442 lineto
+326.55872 -309.32442 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -318.3955 moveto
+344.70087 -318.3955 lineto
+344.70087 -309.32442 lineto
+326.55872 -309.32442 lineto
+ closepath stroke
+347.70087 -316.97331 moveto
+(P) cmr9 8.96637 fshow
+353.71576 -316.97331 moveto
+(aleGoldenro) cmr9 8.96637 fshow
+402.18776 -316.97331 moveto
+(d) cmr9 8.96637 fshow
+ 0.596 0.985 0.596 setrgbcolor
+newpath 0 -330.18793 moveto
+18.14215 -330.18793 lineto
+18.14215 -321.11685 lineto
+0 -321.11685 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -330.18793 moveto
+18.14215 -330.18793 lineto
+18.14215 -321.11685 lineto
+0 -321.11685 lineto
+ closepath stroke
+21.14215 -328.76575 moveto
+(P) cmr9 8.96637 fshow
+27.15704 -328.76575 moveto
+(aleGreen) cmr9 8.96637 fshow
+ 0.688 0.932 0.932 setrgbcolor
+newpath 108.8529 -330.18793 moveto
+126.99506 -330.18793 lineto
+126.99506 -321.11685 lineto
+108.8529 -321.11685 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -330.18793 moveto
+126.99506 -330.18793 lineto
+126.99506 -321.11685 lineto
+108.8529 -321.11685 lineto
+ closepath stroke
+129.99506 -327.894 moveto
+(P) cmr9 8.96637 fshow
+136.00995 -327.894 moveto
+(aleT) cmr9 8.96637 fshow
+153.16426 -327.894 moveto
+(urquoise) cmr9 8.96637 fshow
+ 0.86 0.44 0.576 setrgbcolor
+newpath 217.70581 -330.18793 moveto
+235.84796 -330.18793 lineto
+235.84796 -321.11685 lineto
+217.70581 -321.11685 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -330.18793 moveto
+235.84796 -330.18793 lineto
+235.84796 -321.11685 lineto
+217.70581 -321.11685 lineto
+ closepath stroke
+238.84796 -328.76575 moveto
+(P) cmr9 8.96637 fshow
+244.86285 -328.76575 moveto
+(aleVioletRed) cmr9 8.96637 fshow
+ 1 0.936 0.835 setrgbcolor
+newpath 326.55872 -330.18793 moveto
+344.70087 -330.18793 lineto
+344.70087 -321.11685 lineto
+326.55872 -321.11685 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -330.18793 moveto
+344.70087 -330.18793 lineto
+344.70087 -321.11685 lineto
+326.55872 -321.11685 lineto
+ closepath stroke
+347.70087 -327.894 moveto
+(P) cmr9 8.96637 fshow
+353.71576 -327.894 moveto
+(apa) cmr9 8.96637 fshow
+367.79477 -327.894 moveto
+(y) cmr9 8.96637 fshow
+372.40247 -327.894 moveto
+(aWhip) cmr9 8.96637 fshow
+ 1 0.855 0.725 setrgbcolor
+newpath 0 -341.98035 moveto
+18.14215 -341.98035 lineto
+18.14215 -332.90927 lineto
+0 -332.90927 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -341.98035 moveto
+18.14215 -341.98035 lineto
+18.14215 -332.90927 lineto
+0 -332.90927 lineto
+ closepath stroke
+21.14215 -340.55817 moveto
+(P) cmr9 8.96637 fshow
+27.15704 -340.55817 moveto
+(eac) cmr9 8.96637 fshow
+39.70364 -340.55817 moveto
+(hPu\013) cmr9 8.96637 fshow
+ 0.804 0.52 0.248 setrgbcolor
+newpath 108.8529 -341.98035 moveto
+126.99506 -341.98035 lineto
+126.99506 -332.90927 lineto
+108.8529 -332.90927 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -341.98035 moveto
+126.99506 -341.98035 lineto
+126.99506 -332.90927 lineto
+108.8529 -332.90927 lineto
+ closepath stroke
+129.99506 -340.50832 moveto
+(P) cmr9 8.96637 fshow
+136.00995 -340.50832 moveto
+(eru) cmr9 8.96637 fshow
+ 1 0.752 0.796 setrgbcolor
+newpath 217.70581 -341.98035 moveto
+235.84796 -341.98035 lineto
+235.84796 -332.90927 lineto
+217.70581 -332.90927 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -341.98035 moveto
+235.84796 -341.98035 lineto
+235.84796 -332.90927 lineto
+217.70581 -332.90927 lineto
+ closepath stroke
+238.84796 -340.55817 moveto
+(Pink) cmr9 8.96637 fshow
+ 0.868 0.628 0.868 setrgbcolor
+newpath 326.55872 -341.98035 moveto
+344.70087 -341.98035 lineto
+344.70087 -332.90927 lineto
+326.55872 -332.90927 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -341.98035 moveto
+344.70087 -341.98035 lineto
+344.70087 -332.90927 lineto
+326.55872 -332.90927 lineto
+ closepath stroke
+347.70087 -340.55817 moveto
+(Plum) cmr9 8.96637 fshow
+ 0.69 0.88 0.9 setrgbcolor
+newpath 0 -353.77277 moveto
+18.14215 -353.77277 lineto
+18.14215 -344.70169 lineto
+0 -344.70169 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -353.77277 moveto
+18.14215 -353.77277 lineto
+18.14215 -344.70169 lineto
+0 -344.70169 lineto
+ closepath stroke
+21.14215 -352.35059 moveto
+(P) cmr9 8.96637 fshow
+27.15704 -352.35059 moveto
+(o) cmr9 8.96637 fshow
+31.50874 -352.35059 moveto
+(wderBlue) cmr9 8.96637 fshow
+ 0.5 0 0.5 setrgbcolor
+newpath 108.8529 -353.77277 moveto
+126.99506 -353.77277 lineto
+126.99506 -344.70169 lineto
+108.8529 -344.70169 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -353.77277 moveto
+126.99506 -353.77277 lineto
+126.99506 -344.70169 lineto
+108.8529 -344.70169 lineto
+ closepath stroke
+129.99506 -351.47884 moveto
+(Purple) cmr9 8.96637 fshow
+ 1 0 0 setrgbcolor
+newpath 217.70581 -353.77277 moveto
+235.84796 -353.77277 lineto
+235.84796 -344.70169 lineto
+217.70581 -344.70169 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -353.77277 moveto
+235.84796 -353.77277 lineto
+235.84796 -344.70169 lineto
+217.70581 -344.70169 lineto
+ closepath stroke
+238.84796 -352.35059 moveto
+(Red) cmr9 8.96637 fshow
+ 0.736 0.56 0.56 setrgbcolor
+newpath 326.55872 -353.77277 moveto
+344.70087 -353.77277 lineto
+344.70087 -344.70169 lineto
+326.55872 -344.70169 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -353.77277 moveto
+344.70087 -353.77277 lineto
+344.70087 -344.70169 lineto
+326.55872 -344.70169 lineto
+ closepath stroke
+347.70087 -351.42899 moveto
+(RosyBro) cmr9 8.96637 fshow
+382.07306 -351.42899 moveto
+(wn) cmr9 8.96637 fshow
+ 0.255 0.41 0.884 setrgbcolor
+newpath 0 -365.5652 moveto
+18.14215 -365.5652 lineto
+18.14215 -356.49413 lineto
+0 -356.49413 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -365.5652 moveto
+18.14215 -365.5652 lineto
+18.14215 -356.49413 lineto
+0 -356.49413 lineto
+ closepath stroke
+21.14215 -363.27127 moveto
+(Ro) cmr9 8.96637 fshow
+32.27666 -363.27127 moveto
+(y) cmr9 8.96637 fshow
+36.88435 -363.27127 moveto
+(alBlue) cmr9 8.96637 fshow
+ 0.545 0.27 0.075 setrgbcolor
+newpath 108.8529 -365.5652 moveto
+126.99506 -365.5652 lineto
+126.99506 -356.49413 lineto
+108.8529 -356.49413 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -365.5652 moveto
+126.99506 -365.5652 lineto
+126.99506 -356.49413 lineto
+108.8529 -356.49413 lineto
+ closepath stroke
+129.99506 -364.14302 moveto
+(SaddleBro) cmr9 8.96637 fshow
+171.10376 -364.14302 moveto
+(wn) cmr9 8.96637 fshow
+ 0.98 0.5 0.448 setrgbcolor
+newpath 217.70581 -365.5652 moveto
+235.84796 -365.5652 lineto
+235.84796 -356.49413 lineto
+217.70581 -356.49413 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -365.5652 moveto
+235.84796 -365.5652 lineto
+235.84796 -356.49413 lineto
+217.70581 -356.49413 lineto
+ closepath stroke
+238.84796 -364.14302 moveto
+(Salmon) cmr9 8.96637 fshow
+ 0.956 0.644 0.376 setrgbcolor
+newpath 326.55872 -365.5652 moveto
+344.70087 -365.5652 lineto
+344.70087 -356.49413 lineto
+326.55872 -356.49413 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -365.5652 moveto
+344.70087 -365.5652 lineto
+344.70087 -356.49413 lineto
+326.55872 -356.49413 lineto
+ closepath stroke
+347.70087 -363.27127 moveto
+(SandyBro) cmr9 8.96637 fshow
+387.01427 -363.27127 moveto
+(wn) cmr9 8.96637 fshow
+ 0.18 0.545 0.34 setrgbcolor
+newpath 0 -377.35762 moveto
+18.14215 -377.35762 lineto
+18.14215 -368.28654 lineto
+0 -368.28654 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -377.35762 moveto
+18.14215 -377.35762 lineto
+18.14215 -368.28654 lineto
+0 -368.28654 lineto
+ closepath stroke
+21.14215 -375.88559 moveto
+(SeaGreen) cmr9 8.96637 fshow
+ 1 0.96 0.932 setrgbcolor
+newpath 108.8529 -377.35762 moveto
+126.99506 -377.35762 lineto
+126.99506 -368.28654 lineto
+108.8529 -368.28654 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -377.35762 moveto
+126.99506 -377.35762 lineto
+126.99506 -368.28654 lineto
+108.8529 -368.28654 lineto
+ closepath stroke
+129.99506 -375.93544 moveto
+(Seashell) cmr9 8.96637 fshow
+ 0.628 0.32 0.176 setrgbcolor
+newpath 217.70581 -377.35762 moveto
+235.84796 -377.35762 lineto
+235.84796 -368.28654 lineto
+217.70581 -368.28654 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -377.35762 moveto
+235.84796 -377.35762 lineto
+235.84796 -368.28654 lineto
+217.70581 -368.28654 lineto
+ closepath stroke
+238.84796 -375.88559 moveto
+(Sienna) cmr9 8.96637 fshow
+ 0.752 0.752 0.752 setrgbcolor
+newpath 326.55872 -377.35762 moveto
+344.70087 -377.35762 lineto
+344.70087 -368.28654 lineto
+326.55872 -368.28654 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -377.35762 moveto
+344.70087 -377.35762 lineto
+344.70087 -368.28654 lineto
+326.55872 -368.28654 lineto
+ closepath stroke
+347.70087 -375.93544 moveto
+(Silv) cmr9 8.96637 fshow
+362.54787 -375.93544 moveto
+(er) cmr9 8.96637 fshow
+ 0.53 0.808 0.92 setrgbcolor
+newpath 0 -389.15005 moveto
+18.14215 -389.15005 lineto
+18.14215 -380.07898 lineto
+0 -380.07898 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -389.15005 moveto
+18.14215 -389.15005 lineto
+18.14215 -380.07898 lineto
+0 -380.07898 lineto
+ closepath stroke
+21.14215 -386.85612 moveto
+(SkyBlue) cmr9 8.96637 fshow
+ 0.415 0.352 0.804 setrgbcolor
+newpath 108.8529 -389.15005 moveto
+126.99506 -389.15005 lineto
+126.99506 -380.07898 lineto
+108.8529 -380.07898 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -389.15005 moveto
+126.99506 -389.15005 lineto
+126.99506 -380.07898 lineto
+108.8529 -380.07898 lineto
+ closepath stroke
+129.99506 -387.72787 moveto
+(SlateBlue) cmr9 8.96637 fshow
+ 0.44 0.5 0.565 setrgbcolor
+newpath 217.70581 -389.15005 moveto
+235.84796 -389.15005 lineto
+235.84796 -380.07898 lineto
+217.70581 -380.07898 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -389.15005 moveto
+235.84796 -389.15005 lineto
+235.84796 -380.07898 lineto
+217.70581 -380.07898 lineto
+ closepath stroke
+238.84796 -386.85612 moveto
+(SlateGra) cmr9 8.96637 fshow
+274.00546 -386.85612 moveto
+(y) cmr9 8.96637 fshow
+ 0.44 0.5 0.565 setrgbcolor
+newpath 326.55872 -389.15005 moveto
+344.70087 -389.15005 lineto
+344.70087 -380.07898 lineto
+326.55872 -380.07898 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -389.15005 moveto
+344.70087 -389.15005 lineto
+344.70087 -380.07898 lineto
+326.55872 -380.07898 lineto
+ closepath stroke
+347.70087 -386.85612 moveto
+(SlateGrey) cmr9 8.96637 fshow
+ 1 0.98 0.98 setrgbcolor
+newpath 0 -400.94247 moveto
+18.14215 -400.94247 lineto
+18.14215 -391.8714 lineto
+0 -391.8714 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -400.94247 moveto
+18.14215 -400.94247 lineto
+18.14215 -391.8714 lineto
+0 -391.8714 lineto
+ closepath stroke
+21.14215 -399.47044 moveto
+(Sno) cmr9 8.96637 fshow
+35.73315 -399.47044 moveto
+(w) cmr9 8.96637 fshow
+ 0 1 0.498 setrgbcolor
+newpath 108.8529 -400.94247 moveto
+126.99506 -400.94247 lineto
+126.99506 -391.8714 lineto
+108.8529 -391.8714 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -400.94247 moveto
+126.99506 -400.94247 lineto
+126.99506 -391.8714 lineto
+108.8529 -391.8714 lineto
+ closepath stroke
+129.99506 -398.5987 moveto
+(SpringGreen) cmr9 8.96637 fshow
+ 0.275 0.51 0.705 setrgbcolor
+newpath 217.70581 -400.94247 moveto
+235.84796 -400.94247 lineto
+235.84796 -391.8714 lineto
+217.70581 -391.8714 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -400.94247 moveto
+235.84796 -400.94247 lineto
+235.84796 -391.8714 lineto
+217.70581 -391.8714 lineto
+ closepath stroke
+238.84796 -399.5203 moveto
+(SteelBlue) cmr9 8.96637 fshow
+ 0.824 0.705 0.55 setrgbcolor
+newpath 326.55872 -400.94247 moveto
+344.70087 -400.94247 lineto
+344.70087 -391.8714 lineto
+326.55872 -391.8714 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -400.94247 moveto
+344.70087 -400.94247 lineto
+344.70087 -391.8714 lineto
+326.55872 -391.8714 lineto
+ closepath stroke
+347.70087 -399.47044 moveto
+(T) cmr9 8.96637 fshow
+353.58847 -399.47044 moveto
+(an) cmr9 8.96637 fshow
+ 0 0.5 0.5 setrgbcolor
+newpath 0 -412.7349 moveto
+18.14215 -412.7349 lineto
+18.14215 -403.66382 lineto
+0 -403.66382 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -412.7349 moveto
+18.14215 -412.7349 lineto
+18.14215 -403.66382 lineto
+0 -403.66382 lineto
+ closepath stroke
+21.14215 -411.31271 moveto
+(T) cmr9 8.96637 fshow
+27.02975 -411.31271 moveto
+(eal) cmr9 8.96637 fshow
+ 0.848 0.75 0.848 setrgbcolor
+newpath 108.8529 -412.7349 moveto
+126.99506 -412.7349 lineto
+126.99506 -403.66382 lineto
+108.8529 -403.66382 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -412.7349 moveto
+126.99506 -412.7349 lineto
+126.99506 -403.66382 lineto
+108.8529 -403.66382 lineto
+ closepath stroke
+129.99506 -411.31271 moveto
+(Thistle) cmr9 8.96637 fshow
+ 1 0.39 0.28 setrgbcolor
+newpath 217.70581 -412.7349 moveto
+235.84796 -412.7349 lineto
+235.84796 -403.66382 lineto
+217.70581 -403.66382 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -412.7349 moveto
+235.84796 -412.7349 lineto
+235.84796 -403.66382 lineto
+217.70581 -403.66382 lineto
+ closepath stroke
+238.84796 -411.26286 moveto
+(T) cmr9 8.96637 fshow
+244.73557 -411.26286 moveto
+(omato) cmr9 8.96637 fshow
+ 0.25 0.88 0.815 setrgbcolor
+newpath 326.55872 -412.7349 moveto
+344.70087 -412.7349 lineto
+344.70087 -403.66382 lineto
+326.55872 -403.66382 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -412.7349 moveto
+344.70087 -412.7349 lineto
+344.70087 -403.66382 lineto
+326.55872 -403.66382 lineto
+ closepath stroke
+347.70087 -410.39111 moveto
+(T) cmr9 8.96637 fshow
+353.58847 -410.39111 moveto
+(urquoise) cmr9 8.96637 fshow
+ 0.932 0.51 0.932 setrgbcolor
+newpath 0 -424.52733 moveto
+18.14215 -424.52733 lineto
+18.14215 -415.45625 lineto
+0 -415.45625 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -424.52733 moveto
+18.14215 -424.52733 lineto
+18.14215 -415.45625 lineto
+0 -415.45625 lineto
+ closepath stroke
+21.14215 -423.10515 moveto
+(Violet) cmr9 8.96637 fshow
+ 0.816 0.125 0.565 setrgbcolor
+newpath 108.8529 -424.52733 moveto
+126.99506 -424.52733 lineto
+126.99506 -415.45625 lineto
+108.8529 -415.45625 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -424.52733 moveto
+126.99506 -424.52733 lineto
+126.99506 -415.45625 lineto
+108.8529 -415.45625 lineto
+ closepath stroke
+129.99506 -423.10515 moveto
+(VioletRed) cmr9 8.96637 fshow
+ 0.96 0.87 0.7 setrgbcolor
+newpath 217.70581 -424.52733 moveto
+235.84796 -424.52733 lineto
+235.84796 -415.45625 lineto
+217.70581 -415.45625 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -424.52733 moveto
+235.84796 -424.52733 lineto
+235.84796 -415.45625 lineto
+217.70581 -415.45625 lineto
+ closepath stroke
+238.84796 -423.10515 moveto
+(Wheat) cmr9 8.96637 fshow
+ 1 1 1 setrgbcolor
+newpath 326.55872 -424.52733 moveto
+344.70087 -424.52733 lineto
+344.70087 -415.45625 lineto
+326.55872 -415.45625 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 326.55872 -424.52733 moveto
+344.70087 -424.52733 lineto
+344.70087 -415.45625 lineto
+326.55872 -415.45625 lineto
+ closepath stroke
+347.70087 -423.10515 moveto
+(White) cmr9 8.96637 fshow
+ 0.96 0.96 0.96 setrgbcolor
+newpath 0 -436.31975 moveto
+18.14215 -436.31975 lineto
+18.14215 -427.24867 lineto
+0 -427.24867 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 0 -436.31975 moveto
+18.14215 -436.31975 lineto
+18.14215 -427.24867 lineto
+0 -427.24867 lineto
+ closepath stroke
+21.14215 -434.89757 moveto
+(WhiteSmok) cmr9 8.96637 fshow
+67.98904 -434.89757 moveto
+(e) cmr9 8.96637 fshow
+ 1 1 0 setrgbcolor
+newpath 108.8529 -436.31975 moveto
+126.99506 -436.31975 lineto
+126.99506 -427.24867 lineto
+108.8529 -427.24867 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 108.8529 -436.31975 moveto
+126.99506 -436.31975 lineto
+126.99506 -427.24867 lineto
+108.8529 -427.24867 lineto
+ closepath stroke
+129.99506 -434.89757 moveto
+(Y) cmr9 8.96637 fshow
+136.13725 -434.89757 moveto
+(ello) cmr9 8.96637 fshow
+149.70776 -434.89757 moveto
+(w) cmr9 8.96637 fshow
+ 0.604 0.804 0.196 setrgbcolor
+newpath 217.70581 -436.31975 moveto
+235.84796 -436.31975 lineto
+235.84796 -427.24867 lineto
+217.70581 -427.24867 lineto
+ closepath fill
+ 0 0 0 setrgbcolor
+newpath 217.70581 -436.31975 moveto
+235.84796 -436.31975 lineto
+235.84796 -427.24867 lineto
+217.70581 -427.24867 lineto
+ closepath stroke
+238.84796 -434.89757 moveto
+(Y) cmr9 8.96637 fshow
+244.99016 -434.89757 moveto
+(ello) cmr9 8.96637 fshow
+258.56067 -434.89757 moveto
+(wGreen) cmr9 8.96637 fshow
+showpage
+%%EOF
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette.mp
new file mode 100644
index 0000000000..f3f4ee137b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/svgnames/palette.mp
@@ -0,0 +1,168 @@
+input geom2d;
+
+gddU:=0.32cm;
+beginfig(1);
+i:=0;
+N:=4;
+for t=
+"AliceBlue",
+"AntiqueWhite",
+"Aqua",
+"Aquamarine",
+"Azure",
+"Beige",
+"Bisque",
+"Black",
+"BlanchedAlmond",
+"Blue",
+"BlueViolet",
+"Brown",
+"BurlyWood",
+"CadetBlue",
+"Chartreuse",
+"Chocolate",
+"Coral",
+"CornflowerBlue",
+"Cornsilk",
+"Crimson",
+"Cyan",
+"DarkBlue",
+"DarkCyan",
+"DarkGoldenrod",
+"DarkGray",
+"DarkGreen",
+"DarkGrey",
+"DarkKhaki",
+"DarkMagenta",
+"DarkOliveGreen",
+"DarkOrange",
+"DarkOrchid",
+"DarkRed",
+"DarkSalmon",
+"DarkSeaGreen",
+"DarkSlateBlue",
+"DarkSlateGray",
+"DarkSlateGrey",
+"DarkTurquoise",
+"DarkViolet",
+"DeepPink",
+"DeepSkyBlue",
+"DimGray",
+"DimGrey",
+"DodgerBlue",
+"FireBrick",
+"FloralWhite",
+"ForestGreen",
+"Fuchsia",
+"Gainsboro",
+"GhostWhite",
+"Gold",
+"Goldenrod",
+"Gray",
+"Green",
+"GreenYellow",
+"Grey",
+"Honeydew",
+"HotPink",
+"IndianRed",
+"Indigo",
+"Ivory",
+"Khaki",
+"Lavender",
+"LavenderBlush",
+"LawnGreen",
+"LemonChiffon",
+"LightBlue",
+"LightCoral",
+"LightCyan",
+"LightGoldenrod",
+"LightGoldenrodYellow",
+"LightGray",
+"LightGreen",
+"LightGrey",
+"LightPink",
+"LightSalmon",
+"LightSeaGreen",
+"LightSkyBlue",
+"LightSlateBlue",
+"LightSlateGray",
+"LightSlateGrey",
+"LightSteelBlue",
+"LightYellow",
+"Lime",
+"LimeGreen",
+"Linen",
+"Magenta",
+"Maroon",
+"MediumAquamarine",
+"MediumBlue",
+"MediumOrchid",
+"MediumPurple",
+"MediumSeaGreen",
+"MediumSlateBlue",
+"MediumSpringGreen",
+"MediumTurquoise",
+"MediumVioletRed",
+"MidnightBlue",
+"MintCream",
+"MistyRose",
+"Moccasin",
+"NavajoWhite",
+"Navy",
+"NavyBlue",
+"OldLace",
+"Olive",
+"OliveDrab",
+"Orange",
+"OrangeRed",
+"Orchid",
+"PaleGoldenrod",
+"PaleGreen",
+"PaleTurquoise",
+"PaleVioletRed",
+"PapayaWhip",
+"PeachPuff",
+"Peru",
+"Pink",
+"Plum",
+"PowderBlue",
+"Purple",
+"Red",
+"RosyBrown",
+"RoyalBlue",
+"SaddleBrown",
+"Salmon",
+"SandyBrown",
+"SeaGreen",
+"Seashell",
+"Sienna",
+"Silver",
+"SkyBlue",
+"SlateBlue",
+"SlateGray",
+"SlateGrey",
+"Snow",
+"SpringGreen",
+"SteelBlue",
+"Tan",
+"Teal",
+"Thistle",
+"Tomato",
+"Turquoise",
+"Violet",
+"VioletRed",
+"Wheat",
+"White",
+"WhiteSmoke",
+"Yellow",
+"YellowGreen":
+fill ((0,0)--(2,0)--(2,1)--(0,1)--cycle) scaled gddU shifted (((i mod N)
+)*(gddU+11*gddU),-(i div N)*1.3*gddU) withcolor scantokens t;
+draw ((0,0)--(2,0)--(2,1)--(0,1)--cycle) scaled gddU shifted ((i mod
+N )*(gddU+11*gddU),-(i div N)*1.3*gddU);
+label.rt(textext("\small "&t),(((i mod N)
+)*(gddU+11*gddU)+2*gddU,-(i div N)*1.3*gddU+0.5*gddU));
+i:=i+1;
+endfor;
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/homothetie-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/homothetie-1.pdf
new file mode 100644
index 0000000000..5f3a9ac552
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/homothetie-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/homothetie.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/homothetie.mp
new file mode 100644
index 0000000000..f398d17da2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/homothetie.mp
@@ -0,0 +1,36 @@
+input geom2d;
+
+beginfig(1);
+ O = Point(0,0);
+ P = Point(2,1);
+ A = Point(3,2);
+ Q = Point(-1,2);
+ R = Point(0,4);
+ B = Homothetie(A,P,3);
+ fleche Segment(O,P);
+ fleche Segment(P,A);
+ fleche Segment(A,B);
+
+ T = Triangle(A,Q,R);
+ T'= Homothetie(T,P,3);
+ trace T;
+ trace T';
+
+ C = Cercle(A,1.5);
+ trace C;
+ CC = Homothetie(C,P,3);
+ trace CC;
+
+ path p;
+ p:=Pt(A)..Pt(Q)..Pt(R);
+ W = Chemin(p);
+ trace W;
+ X = Homothetie(W,P,3);
+ trace X;
+
+ Q1 = PolygoneRegulier(10,2,0,(2,2));
+ trace Q1;
+ Q2 = Homothetie(Q1,P,3);
+ trace Q2;
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/inversion-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/inversion-1.pdf
new file mode 100644
index 0000000000..cce481b377
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/inversion-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/inversion.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/inversion.mp
new file mode 100644
index 0000000000..fcd762b574
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/inversion.mp
@@ -0,0 +1,40 @@
+input geom2d;
+
+beginfig(1);
+A = Point(2,2);
+C = Cercle(A,2);
+trace C;
+marque.rt "A";
+B = Point(0,1);
+D = Inversion(B,C);
+drawoptions(withcolor DarkRed);
+CB = Cercle(B,1);
+trace CB;
+CD = Inversion(CB,C);
+trace CB;
+trace CD;
+ marque.rt "B"; marque.rt "D";
+
+drawoptions(withcolor DarkBlue);
+E = Point(3,1);
+CE = Cercle(E,0.5);
+trace CE;
+marque.rt "E";
+iCE = Inversion(CE,C);
+trace iCE;
+
+
+drawoptions(withcolor DarkGreen);
+d = Droite((3,3),(4,2));
+trace d;
+Cd = Inversion(d,C);
+trace Cd;
+
+drawoptions(withcolor Salmon);
+S = Point(1,3);
+CS = CercleCP(S,A);
+trace CS;
+dS = Inversion(CS,C);
+trace dS;
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrie-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrie-1.pdf
new file mode 100644
index 0000000000..1c4288a545
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrie-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrie.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrie.mp
new file mode 100644
index 0000000000..d152d9018a
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrie.mp
@@ -0,0 +1,26 @@
+input geom2d;
+
+beginfig(1);
+
+A = Point(2,2);
+a = Point(-1,-1);
+b = Point(2,0);
+c = Point(3,-2);
+aa = Point(-1,-1.5);
+DD = Droite(aa,c);
+D = Droite(a,b);
+B = SymetrieAxialePoint(A,D);
+pointe A;
+pointe B;
+trace D;
+C = Cercle(A,2);
+P = ParaboleFD(A,DD);
+trace C;
+CC = SymetrieAxiale(C,D);
+PP = SymetrieAxiale(P,D);
+trace CC;
+trace P;
+trace PP;
+
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrieCentrale-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrieCentrale-1.pdf
new file mode 100644
index 0000000000..c32b7f91f2
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrieCentrale-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrieCentrale.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrieCentrale.mp
new file mode 100644
index 0000000000..077b216de6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/transformations/symetrieCentrale.mp
@@ -0,0 +1,27 @@
+input geom2d;
+
+beginfig(1);
+
+A = Point(2,2);
+a = Point(-1,-1);
+b = Point(2,0);
+c = Point(3,-2);
+aa = Point(-1,-1.5);
+DD = Droite(aa,c);
+D = Droite(a,b);
+B = SymetrieCentralePoint(A,a);
+pointe a avecCrayon(1,red);
+pointe A;
+pointe B;
+%trace D;
+C = Cercle(A,2);
+P = ParaboleFD(A,DD);
+trace C;
+CC = SymetrieCentrale(C,a);
+PP = SymetrieCentrale(P,a);
+trace CC;
+trace P;
+trace PP;
+
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/apollonius-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/apollonius-1.pdf
new file mode 100644
index 0000000000..0af9a23393
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/apollonius-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/apollonius.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/apollonius.mp
new file mode 100644
index 0000000000..8658139b1b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/apollonius.mp
@@ -0,0 +1,90 @@
+input geom2d;
+gddU:=0.35cm;
+beginfig(1);
+% nos trois points
+A = Point(0,0);
+B = Point(6,0);
+C = Point(0.8,4);
+T_ABC = Triangle(A,B,C);
+
+C_I = CercleInscrit(T_ABC);
+C_A = CercleExinscrit(T_ABC,2);
+C_B = CercleExinscrit(T_ABC,3);
+C_C = CercleExinscrit(T_ABC,1);
+
+d_AB = Droite(A,B);
+d_BC = Droite(B,C);
+d_CA = Droite(C,A);
+
+I = Centre(C_I);
+I_C_A = Centre(C_A);
+I_C_B = Centre(C_B);
+I_C_C = Centre(C_C);
+d_CAA = Droite(A,I_C_A);
+d_CAB = Droite(B,I_C_B);
+d_CAC = Droite(C,I_C_C);
+
+A_S = AxeDeSimilitude(C_A,C_B,C_C);
+P_CA = ProjectionPointSurDroite(I_C_A,A_S);
+P_CB = ProjectionPointSurDroite(I_C_B,A_S);
+P_CC = ProjectionPointSurDroite(I_C_C,A_S);
+
+P_A = Inversion(P_CA,C_A);
+P_B = Inversion(P_CB,C_B);
+P_C = Inversion(P_CC,C_C);
+
+C_R = CentreRadical(C_A,C_B,C_C);
+% les neuf points pour les cercles d’euler (tangent intérieur)
+% et d’apollonius (tangent extérieur)
+D1 = Droite(C_R,P_A);
+P1 = IntersectionDroiteCercle(D1,C_A,1);
+Q1 = IntersectionDroiteCercle(D1,C_A,2);
+
+D2 = Droite(C_R,P_B);
+P2 = IntersectionDroiteCercle(D2,C_B,1);
+Q2 = IntersectionDroiteCercle(D2,C_B,2);
+
+D3 = Droite(C_R,P_C);
+P3 = IntersectionDroiteCercle(D3,C_C,2);
+Q3 = IntersectionDroiteCercle(D3,C_C,1);
+
+% le cercle d’apollonius
+Apol = CercleTroisPoints(P1,P2,P3);
+colorie Apol withcolor 1.05*Lavender;
+trace Apol withcolor CadetBlue;
+
+% cercle inscrit
+colorie C_I withcolor LightBlue;
+% cercles exinscrits
+colorie C_A withcolor PapayaWhip;
+colorie C_B withcolor PapayaWhip;
+colorie C_C withcolor PapayaWhip;
+
+trace d_AB;
+trace d_BC;
+trace d_CA;
+
+trace d_CAA dashed evenly;
+trace d_CAB dashed evenly;
+trace d_CAC dashed evenly;
+
+trace T_ABC withpen pencircle scaled 2 withcolor Chocolate;
+
+C_E = CercleEuler(T_ABC);
+trace C_E withcolor Goldenrod;
+
+pointe P1;
+pointe P2;
+pointe P3;
+
+pointe Q1;
+pointe Q2;
+pointe Q3;
+
+
+marque.llft "A";
+marque.urt "B";
+marque.urt "C";
+Fenetre(-7,-12,20,15)
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/pedale-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/pedale-1.pdf
new file mode 100644
index 0000000000..d3adab46ec
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/pedale-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/pedale.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/pedale.mp
new file mode 100644
index 0000000000..b581ddfbda
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/pedale.mp
@@ -0,0 +1,106 @@
+input geom2d;
+gddU:=1.5cm;
+beginfig(1);
+numeric A[],B[],C[],E[],F[],G[],U[],W[],V[],T[],R[],P[];
+A[1] = Point(0,0);
+B1 = Point(1,2);
+C1 = Point(2.5,0.2);
+W1 = PointDe(Segment(A1,B1),0.2);
+U1 = PointDe(Segment(B1,C1),0.23);
+V1 = PointDe(Segment(C1,A1),0.3);
+G1 = ProjectionPointSurDroite(B1,Droite(A1,C1));
+F1 = ProjectionPointSurDroite(C1,Droite(A1,B1));
+E1 = ProjectionPointSurDroite(A1,Droite(B1,C1));
+
+
+
+for i:=0 step 3 until 3:
+
+D[1+i] = Droite(B[1+i],C[1+i]);
+A[2+i] = SymetrieAxiale(A[1+i],D[1+i]);
+
+B[2+i] = B[1+i];
+C[2+i] = C[1+i];
+
+W[2+i] = SymetrieAxiale(W[1+i],D[1+i]);
+V[2+i] = SymetrieAxiale(V[1+i],D[1+i]);
+U[2+i] = U[1+i];
+
+G[2+i] = SymetrieAxiale(G[1+i],D[1+i]);
+F[2+i] = SymetrieAxiale(F[1+i],D[1+i]);
+E[2+i] = E[1+i];
+
+D[2+i] = Droite(A[2+i],C[2+i]);
+B[3+i] = SymetrieAxiale(B[2+i],D[2+i]);
+A[3+i] = A[2+i];
+C[3+i] = C[2+i];
+W[3+i] = SymetrieAxiale(W[2+i],D[2+i]);
+U[3+i] = SymetrieAxiale(U[2+i],D[2+i]);
+V[3+i] = V[2+i];
+E[3+i] = SymetrieAxiale(E[2+i],D[2+i]);
+F[3+i] = SymetrieAxiale(F[2+i],D[2+i]);
+G[3+i] = G[2+i];
+
+D[3+i] = Droite(A[3+i],B[3+i]);
+C[4+i] = SymetrieAxiale(C[3+i],D[3+i]);
+A[4+i] = A[3+i];
+B[4+i] = B[3+i];
+U[4+i] = SymetrieAxiale(U[3+i],D[3+i]);
+V[4+i] = SymetrieAxiale(V[3+i],D[3+i]);
+W[4+i] = W[3+i];
+E[4+i] = SymetrieAxiale(E[3+i],D[3+i]);
+G[4+i] = SymetrieAxiale(G[3+i],D[3+i]);
+F[4+i] = F[3+i];
+endfor;
+
+for i:=1 upto 7:
+ T[i] = Triangle(A[i],B[i],C[i]);
+ Q[i] = Triangle(U[i],V[i],W[i]);
+ P[i] = Triangle(E[i],F[i],G[i]);
+ colorie Q[i] avecCrayon(0.5,LightGray);
+ trace P[i] avecCrayon(0.8,MediumSlateBlue);
+endfor;
+for i:=1 upto 7:
+ trace T[i] avecCrayon(1,black);
+endfor;
+
+trace LigneBrisee(U1,V2,W3,U4,V5,W6,U7) avecCrayon(1,Peru) ;
+trace Segment(U1,U7) dashed evenly;
+trace Segment(E1,E7) dashed evenly;
+pointe A1; pointe B1; pointe C1;
+pointe A2; pointe B3; pointe C4;
+pointe A5; pointe B6; pointe C7;
+gddLabel.lft(textext("$A$"),A1);
+gddLabel.lft(textext("$B$"),B1);
+gddLabel.bot(textext("$C$"),C1);
+gddLabel.top(textext("$A'$"),A2);
+gddLabel.bot(textext("$B'$"),B3);
+gddLabel.top(textext("$C'$"),C4);
+gddLabel.bot(textext("$A''$"),A5);
+gddLabel.top(textext("$B''$"),B7);
+gddLabel.bot(textext("$C''$"),C7);
+
+pointe U1; pointe V1; pointe W1;
+label.lft(textext("$U$"),PtR(U1)) withcolor Gray;
+label.bot(textext("$V$"),PtR(V1)) withcolor Gray;
+label.lft(textext("$W$"),PtR(W1)) withcolor Gray;
+
+label.lft(textext("$U'$"),PtR(U4)) withcolor Gray;
+label.lrt(textext("$V'$"),PtR(V2)) withcolor Gray;
+label.urt(textext("$W'$"),PtR(W3)) withcolor Gray;
+label.urt(textext("$U''$"),PtR(U7)) withcolor Gray;
+label.urt(textext("$V''$"),PtR(V5)) withcolor Gray;
+label.lrt(textext("$W''$"),PtR(W7)) withcolor Gray;
+pointe U4; pointe V2; pointe W3;
+pointe U7; pointe V5; pointe W7;
+pointe E1; pointe F1; pointe G1;
+label.lrt(textext("$E$"),PtR(E1)) withcolor MediumSlateBlue;
+label.lft(textext("$F$"),PtR(F1)) withcolor MediumSlateBlue;
+label.bot(textext("$G$"),PtR(G1)) withcolor MediumSlateBlue;
+
+label.ulft(textext("$F''$"),PtR(F7)) withcolor MediumSlateBlue;
+pointe F7;
+label.rt(textext("$E''$"),PtR(E7)) withcolor MediumSlateBlue;
+pointe E7;
+endfig;
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/triangles-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/triangles-1.pdf
new file mode 100644
index 0000000000..e3afa92dd4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/triangles-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/triangles.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/triangles.mp
new file mode 100644
index 0000000000..882335af1f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/triangles/triangles.mp
@@ -0,0 +1,27 @@
+input geom2d;
+
+beginfig(1);
+
+ A = Point(0,0);
+ B = Point(7,0.3);
+ C = Point(1,3);
+ TABC = Triangle(A,B,C);
+ D = Orthocentre(TABC);
+ C_C = CercleCirconscrit(TABC);
+ C_E = CercleEuler(TABC);
+ trace TABC;
+ trace C_C withcolor DarkBlue;
+ trace C_E withcolor DarkRed;
+ pointe A;
+ pointe B;
+ pointe C;
+ pointe D;
+ pointe Centre(C_C);
+ pointe Centre(C_E);
+ marque.lft "A";
+ marque.rt "B";
+ marque.lft "C";
+ marque.rt "D";
+endfig;
+
+end. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/vecteur/vecteur-1.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/vecteur/vecteur-1.pdf
new file mode 100644
index 0000000000..e8626844e4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/vecteur/vecteur-1.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/vecteur/vecteur.mp b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/vecteur/vecteur.mp
new file mode 100644
index 0000000000..082aea0dd3
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/exemples/vecteur/vecteur.mp
@@ -0,0 +1,10 @@
+input geom2d;
+beginfig(1);
+AB = Vecteur(2,3);
+pair a;
+a := (3,2);
+A = VecteurP(a);
+trace AB;
+trace A;
+endfig;
+end.
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/figure.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/figure.pdf
new file mode 100644
index 0000000000..54db90cf07
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/figure.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/fond.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/fond.pdf
new file mode 100644
index 0000000000..22218152cc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/fond.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/locctan.bib b/graphics/metapost/contrib/macros/mp-geom2d/doc/locctan.bib
new file mode 100644
index 0000000000..0b05da83d4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/locctan.bib
@@ -0,0 +1,78 @@
+@manual{ctan-metapost,
+ title = {The \texttt{metapost} package},
+ subtitle = {A development of Metafont for creating graphics},
+ author = {{The MetaPost Team} and John Hobby},
+ date = {2021-08-26},
+ license = {lgpl},
+ url = {https://ctan.org/pkg/metapost},
+ annotation = {MetaPost uses a language based on that of
+ to produce precise
+ technical illustrations. Its output is scalable PostScript or
+ SVG, rather than the bitmaps Metafont creates.},
+}
+
+@manual{ctan-luamplib,
+ title = {The \texttt{luamplib} package},
+ subtitle = {Use LuaTeX’s built-in MetaPost interpreter},
+ author = {Hans Hagen and Taco Hoekwater and Élie Roux and Manuel Pégourié-Gonnard and Philipp Gesang and Dohyun Kim},
+ date = {2024-08-03},
+ version = {2.34.5},
+ license = {gpl2},
+ mirror = {https://mirror.ctan.org/macros/luatex/generic/luamplib},
+ url = {https://ctan.org/pkg/luamplib},
+}
+
+@manual{ctan-minim-mp,
+ title = {The \texttt{minim-mp} package},
+ subtitle = {Low-level mplib integration for LuaTeX},
+ author = {Esger Renkema},
+ date = {2024-04-06},
+ version = {2024/1.6},
+ license = {eupl},
+ mirror = {https://mirror.ctan.org/macros/luatex/generic/minim-mp},
+ url = {https://ctan.org/pkg/minim-mp},
+}
+
+@manual{ctan-latexmp,
+ title = {The \texttt{latexMP} package},
+ subtitle = {Interface for \LaTeX{}-based typesetting in MetaPost},
+ author = {Jens-Uwe Morawski},
+ date = {2020-06-21},
+ version = {1.2.1},
+ license = {pd},
+ mirror = {https://mirror.ctan.org/graphics/metapost/contrib/macros/latexmp},
+ url = {https://ctan.org/pkg/latexmp},
+ annotation = {The MetaPost package latexMP implements a user-friendly
+ interface to access \LaTeX{}-based typesetting capabilities in
+ MetaPost. The text to be typeset is given as string. This
+ allows even dynamic text elements, for example counters, to be
+ used in labels. Compared to other implementations it is much
+ more flexible, since it can be used as direct replacement for
+ , and much faster, compared for example to the
+ solution provided by .},
+}
+
+@book{toeplitz,
+ Author = {Rademacher, Hans and Toeplitz, Otto},
+ Title = {The enjoyment of math. {Translated} from the {German}. {With} a new foreword by {Alex} {Kontorovich}},
+ Edition = {Reprint},
+ FSeries = {Princeton Science Library},
+ Series = {Princeton Sci. Libr.},
+ ISBN = {978-0-691-24154-8; 978-0-691-24153-1},
+ Year = {2023},
+ Publisher = {Princeton, NJ: Princeton University Press},
+ Language = {English},
+ DOI = {10.1515/9780691241531},
+ Keywords = {00A08,01A75},
+}
+
+@manual{ctan-drawing-with-metapost,
+ title = {The \texttt{Drawing-with-Metapost} package},
+ subtitle = {How to draw technical diagrams with MetaPost},
+ author = {Toby Thurston},
+ date = {2023-04-16},
+ version = {},
+ license = {opl},
+ mirror = {https://mirror.ctan.org/info/drawing-with-metapost},
+ url = {https://ctan.org/pkg/drawing-with-metapost},
+} \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/mp-geom2d-doc.pdf b/graphics/metapost/contrib/macros/mp-geom2d/doc/mp-geom2d-doc.pdf
new file mode 100644
index 0000000000..a233a118e9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/mp-geom2d-doc.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/mp-geom2d-doc.tex b/graphics/metapost/contrib/macros/mp-geom2d/doc/mp-geom2d-doc.tex
new file mode 100644
index 0000000000..857a38e8a6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/mp-geom2d-doc.tex
@@ -0,0 +1,3491 @@
+
+%! TEX root
+\documentclass[a4paper,french]{article}
+
+\usepackage[math-style=ISO]{xcharter-otf}
+\usepackage[left=4cm]{geometry}
+\usepackage{xspace}
+\usepackage[svgnames]{xcolor}
+\usepackage{multicol}
+\usepackage{hologo}
+\usepackage{listings}
+\usepackage{showexpl} % examples
+\usepackage{mflogo}
+\usepackage{babel}
+\usepackage{tikz}
+\usepackage{url}
+\usepackage{tikz}
+\usepackage{luamplib}
+\usepackage{siunitx}
+\usepackage{pdflscape}
+\usepackage{fancyvrb,xparse,xargs}
+\usepackage{imakeidx}
+\usepackage[colorlinks]{hyperref}
+\setmonofont{FiraMono}[
+%BoldFont=FiraCode-Bold,
+%Contextuals=Alternate, % Activate the calt feature
+%Scale=MatchLowercase
+]
+\usepackage{biblatex}
+
+\makeindex[title=Index, columns=2]
+%\usepackage[verbatim]{lstfiracode} % Activate ligatures in verbatim
+\usepackage[most]{tcolorbox}
+\tcbuselibrary{listings,breakable}
+\addbibresource{locctan.bib}
+\newcommand\package[1]{\href{https://ctan.org/pkg/#1}{#1}}
+
+\newtcolorbox{colourband}[1][]{%
+arc=0pt,outer arc=0pt,enhanced, breakable, spread sidewards, left*=0pt, right*=0pt, boxrule=0pt, colback=LightSteelBlue!10, #1}
+
+
+\definecolor{hellgelb}{rgb}{1,1,0.85}
+\definecolor{colKeys}{rgb}{0,0,1}
+\definecolor{colIdentifier}{rgb}{0,0,0}
+\definecolor{colComments}{rgb}{0.3,0.7,0.3}
+\definecolor{colString}{rgb}{0,0.5,0}
+\definecolor{mpcode}{rgb}{0.5,0.1,0.1}
+
+\lstset{%
+ language=metapost,%
+ float=hbp,%
+ basicstyle=\ttfamily, %
+ identifierstyle=\color{DarkSlateGrey}, %
+ keywordstyle=\color{DarkBlue}, %
+ stringstyle=\color{Green}, %
+ commentstyle=\color{LightSlateGrey}\itshape, %
+ columns=flexible, %
+ tabsize=4, %
+ extendedchars=true, %
+ showspaces=false, %
+ showstringspaces=false, %
+ numbers=left,
+ numbersep=1em,
+ numberstyle=\tiny\color{gray}, %
+ breaklines=true, %
+ breakautoindent=true,
+ captionpos=b,
+ xleftmargin=0em,
+ sensitive=true,
+ morekeywords=[10]{colorie, trace,fermeture,fleche,pointe,marque,gddLabel,avecCrayon,ChampVecteurs,ChampVecteursDD,EtiquetteChemin},
+ keywordstyle=[10]\color{Salmon},
+ morekeywords=[7]{Abscisse,Addition,AdditionAbscisses,AdditionOrdonnee,AdditionVecteur,AireTriangle,Arc,arccos,arctan,arcsin,AsymptoteHyperbole,AxeDeSimilitude,AxeRadical,Axes,AxesBords,
+ Barycentre,Bissectrice,
+ CadreRepere,Centre,CentreRadical,Cercle,CercleCirconscrit,CercleCP,CercleD,CercleEuler,CercleExinscrit,CercleInscrit,CerclePrincipale,CercleTroisPoints,ch,Chemin,cos,Courbe,CourbeDat,CourbeEnPolaires,
+ CoVertex,
+ Debut,DemiHyperbole,DemiGrandAxe,DemiPetitAxe,Directrice,DistancePointDroite,Droite,DroitePerpendiculaire,
+ Ellipse,EllipseF, EquationDroite,Excentricite,exp,
+ Fenetre, Fin,Foyer,
+ gddEnPlace,gddTraceArcDeCercle,gddTraceObjet,Graduations,GraduationsBords,GrilleRepere,
+ Homothetie,HyperboleFD,
+ Inclinaison,IntersectionCercles,IntersectionDroiteCercle,IntersectionDroites,Inversion,IsoBarycentre,
+ LigneBrisee,ln,Longueur,LongueurSegment,
+ Marque,MarqueTrait,Milieu,
+ NombreCotesPolygone,
+ Norme,
+ Ordonnee,OrdonneeRelativePointDroite,Orthocentre,
+ PairImp,PairTOPoint,ParaboleFD,Point,PointDansRepere,PointDe,
+ PointImp,PointPolygone,PointTOPair,Polygone,PolygoneRegulier,ProduitScalaire,ProjectionPointSurDroite,ProjectionPointSurDroite,
+ Rayon,Repere,RepereMinMax,ReportSurDroite,Representation,Rotation,RotationCentre,
+ ScalaireVecteur,Segment,SegmentTOVecteur,sh,SigneOrtho,sin,Sommet,SoustractionVecteur,SymetrieAxiale,SymetrieCentrale,
+ tan,TangenteCommuneExterieure,TangenteCommuneInterieure,TangenteExterieureEllipse,TangenteEllipse,th,Triangle,
+ Unites,
+ Vecteur,VecteurP,Vertex},
+ keywordstyle=[7]\color{FireBrick},
+ morekeywords=[8]{gddO,gddA,gddB,gddC,gddD,gddE,gddF,gddT,gddP,gddS,gddX,gddPX,gddU,gddW,gddCouleurCerclePoint,gddCouleurPoint,gddExtensionDroite,gddTaillePoint,gddPointType,
+ gddXlabel,gddYlabel, _E, Pi, gddC2Dparam ,
+ AliceBlue,
+AntiqueWhite,
+Aqua,
+Aquamarine,
+Azure,
+Beige,
+Bisque,
+Black,
+BlanchedAlmond,
+Blue,
+BlueViolet,
+Brown,
+BurlyWood,
+CadetBlue,
+Chartreuse,
+Chocolate,
+Coral,
+CornflowerBlue,
+Cornsilk,
+Crimson,
+Cyan,
+DarkBlue,
+DarkCyan,
+DarkGoldenrod,
+DarkGray,
+DarkGreen,
+DarkGrey,
+DarkKhaki,
+DarkMagenta,
+DarkOliveGreen,
+DarkOrange,
+DarkOrchid,
+DarkRed,
+DarkSalmon,
+DarkSeaGreen,
+DarkSlateBlue,
+DarkSlateGray,
+DarkSlateGrey,
+DarkTurquoise,
+DarkViolet,
+DeepPink,
+DeepSkyBlue,
+DimGray,
+DimGrey,
+DodgerBlue,
+FireBrick,
+FloralWhite,
+ForestGreen,
+Fuchsia,
+Gainsboro,
+GhostWhite,
+Gold,
+Goldenrod,
+Gray,
+Green,
+GreenYellow,
+Grey,
+Honeydew,
+HotPink,
+IndianRed,
+Indigo,
+Ivory,
+Khaki,
+Lavender,
+LavenderBlush,
+LawnGreen,
+LemonChiffon,
+LightBlue,
+LightCoral,
+LightCyan,
+LightGoldenrod,
+LightGoldenrodYellow,
+LightGray,
+LightGreen,
+LightGrey,
+LightPink,
+LightSalmon,
+LightSeaGreen,
+LightSkyBlue,
+LightSlateBlue,
+LightSlateGray,
+LightSlateGrey,
+LightSteelBlue,
+LightYellow,
+Lime,
+LimeGreen,
+Linen,
+Magenta,
+Maroon,
+MediumAquamarine,
+MediumBlue,
+MediumOrchid,
+MediumPurple,
+MediumSeaGreen,
+MediumSlateBlue,
+MediumSpringGreen,
+MediumTurquoise,
+MediumVioletRed,
+MidnightBlue,
+MintCream,
+MistyRose,
+Moccasin,
+NavajoWhite,
+Navy,
+NavyBlue,
+OldLace,
+Olive,
+OliveDrab,
+Orange,
+OrangeRed,
+Orchid,
+PaleGoldenrod,
+PaleGreen,
+PaleTurquoise,
+PaleVioletRed,
+PapayaWhip,
+PeachPuff,
+Peru,
+Pink,
+Plum,
+PowderBlue,
+Purple,
+Red,
+RosyBrown,
+RoyalBlue,
+SaddleBrown,
+Salmon,
+SandyBrown,
+SeaGreen,
+Seashell,
+Sienna,
+Silver,
+SkyBlue,
+SlateBlue,
+SlateGray,
+SlateGrey,
+Snow,
+SpringGreen,
+SteelBlue,
+Tan,
+Teal,
+Thistle,
+Tomato,
+Turquoise,
+Violet,
+VioletRed,
+Wheat,
+White,
+WhiteSmoke,
+Yellow,
+YellowGreen},
+ keywordstyle=[8]\color{Sienna},
+ morekeywords=[9]{},
+ keywordstyle=[9]\color{Olive}
+}
+\lstset{explpreset={pos=t,wide=false,rframe={},preset=\centering}}
+\lstdefinestyle{syntax}{backgroundcolor=\color{blue!15},numbers=none,xleftmargin=0pt,xrightmargin=0pt,
+ frame=single}
+\lstdefinestyle{code}{backgroundcolor=\color{red!15},%numbers=left,
+ xleftmargin=0pt,xrightmargin=0pt,
+ frame=single}
+
+\newtcblisting{mpcode}{
+ arc=0pt,outer arc=0pt,
+ colback=mpcode!3,
+ breakable,
+ boxsep=0pt,left=2pt,right=2pt,top=0pt,bottom=0pt, bottomtitle =
+ 3pt, toptitle=3pt,
+ boxrule=0pt,bottomrule=0.pt,toprule=0.pt, toprule at break =
+ 0pt, bottomrule at break = 0pt,
+ listing only,boxsep=0pt,listing
+ options={breaklines}
+}
+
+\makeatletter
+\tcbset{%
+ listing metapost/.code={%
+ \def\tcbuselistingtext@input{\begin{mplibcode}
+ background:=(.988,.976,.976); input \jobname.listing;
+ \end{mplibcode}}%
+ }
+}
+\makeatother
+\newtcblisting[auto counter,]{ExempleMP}[1][]{%
+ arc=0pt,outer arc=0pt,
+ colback=FireBrick!3,
+ colframe=FireBrick,
+ breakable,fontupper=\small,
+ boxsep=0pt,left=2pt,right=2pt,top=0pt,bottom=2pt, bottomtitle =
+ 3pt, toptitle=3pt, lefttitle=5pt,
+ boxrule=0pt,bottomrule=0.5pt,toprule=0.5pt, toprule at break =
+ 0pt, bottomrule at break = 0pt,
+ listing side text,
+ listing metapost,
+ title={\bfseries\sffamily Exemple~\thetcbcounter},
+ listing options={breaklines},#1
+}
+
+
+\newcommand\mpgeomdd{\texttt{mp-geom2d}\xspace}
+\newcommand\fichier[1]{\texttt{#1}}
+\newcommand\variableGDD[1]{\texttt{\color{Sienna}#1}}
+\newcommand\typeMP[1]{\texorpdfstring{\texttt{\color{Tomato}#1}}{#1}}
+\newcommand\typeGDD[1]{\texorpdfstring{\texttt{\color{Sienna}#1}}{#1}}
+\newcommand\foncGDD[1]{\texorpdfstring{\texttt{\color{Sienna}#1}}{#1}}
+
+\newenvironment{Note}{
+ \noindent\textbf{Note~---~}}
+ {}
+
+
+
+%
+\colorlet{code}{blue!80!black}
+\newcommand\cmd{\texttt}
+\newcommand\code[1]{\texorpdfstring{\texttt{\color{code}#1}}{#1}}
+\newcommand*\cs[1]{\code{\textbackslash #1}}
+\newcommand*\macro{\par\bigskip\noindent\hspace{-30pt}%
+ \SaveVerb[aftersave={%
+ \UseVerb{Vitem}%
+ }%
+ ]{Vitem}%
+ % \bigskip
+}
+\newcommand\vitem[1][]{\SaveVerb[%
+ aftersave={\item[\textnormal{\UseVerb[#1]{vsave}}]}]{vsave}}
+\newcommand*\textme[1]{\textcolor{black}{\rmfamily\textit{#1}}}
+\newcommand*\meta[1]{% % meta
+ \textme{\ensuremath{\langle}#1\ensuremath{\rangle}}%
+}
+\newcommand*\optstar{% % optional star
+ \meta{\ensuremath{*}}\xspace
+}
+\DefineShortVerb{\|}
+\setlength{\fboxsep}{2pt}
+\fvset{%
+ codes={\catcode`\«\active \catcode`\×\active },
+ defineactive={\makefancyog\makefancytimes},
+ formatcom=\color{FireBrick},
+ frame=single
+}
+% rendre «...» équivalent à \meta{...}
+{\catcode`\«\active
+ \newcommandx\makefancyog[0][addprefix=\global]{%
+ \def«##1»{\meta{##1}}}}
+% rendre × équivalent à \optstar
+{\catcode`\×\active
+ \newcommandx\makefancytimes[0][addprefix=\global]{%
+ \def×{\optstar{}}}}
+
+\NewDocumentEnvironment{Macro}{ov}{%
+\Verb+#2+
+}{%
+}
+\newcommand{\return}[1]{~$\rightarrow$~#1}
+\newcommand{\indication}[1]{\hfill(\itshape #1)}
+
+\newcommand{\R}{\mathbf{R}}
+
+\begin{document}
+%% === Page de garde ===================================================
+\thispagestyle{empty}
+\begin{tikzpicture}[remember picture, overlay]
+ \node[below right, shift={(-4pt,4pt)}] at (current page.north west) {%
+ \includegraphics{fond.pdf}%
+ };
+\end{tikzpicture}%
+
+\noindent
+{\includegraphics{mp-geom2d}\\
+\Large Paquet \MP{} pour des figures de géométrie plane}\\[1cm]
+\parbox{0.5\textwidth}{
+\includegraphics[scale=0.86]{figure.pdf}
+}\hfill
+\parbox{0.5\textwidth}{\Large\raggedleft
+ \textbf{Contributeurs}\\
+ Maxime \textsc{Chupin}\\
+ Jean-Michel \textsc{Sarlat}
+}
+\vfill
+\begin{center}
+Version 1.1 du 22 octobre 2024\\
+\url{https://gitlab.gutenberg-asso.fr/mchupin/mp-geom2d}\\
+\url{https://ctan.org/pkg/mp-geom2d}
+\end{center}
+%% == Page de garde ====================================================
+\newpage
+
+
+
+\section{Objectif}
+
+\mpgeomdd a été écrit avec le but de proposer des macros \MP{} permettant
+de réaliser une figure de géométrie \emph{en collant} d'assez près
+à une description impérative:
+\begin{quote}\itshape
+Soit \(A\) le point de coordonnées (2,3).\\
+Soit \(B\) le point de coordonnées (4,5).\\
+Trace la droite \((A,B)\).\\
+....
+\end{quote}
+Dans ce cadre, les objets géométriques sont le plus souvent nommés
+(\(A\), \(B\), etc.) ou désignés par leur nature et leurs attributs
+(droite \((A,B)\), etc.). Pour ne pas avoir à dépasser ce mode de
+description, en particulier pour éviter d'avoir à déclarer le
+\emph{type} de ces objets, le choix a été fait de les identifier par
+un \emph{index}\footnote{Le type \typeMP{numeric}, qui est le type par
+défaut dans \MP, ne demande pas de déclaration préalable.} dans des
+tables qui en précisent les caractéristiques.
+
+\begin{Note} À ce jour, l'objectif n'est pas atteint, le
+développement est loin d'être achevé; il est encore nécessaire de
+faire appel à des commandes \MP{} ou à des \emph{macros
+intermédiaires} pour décrire une figure. Cela évoluera sans doute
+avec le temps, le temps de trouver une syntaxe satisfaisante...
+\end{Note}
+
+
+\section{Les fichiers}
+
+\mpgeomdd est un ensemble d'outils pour la géométrie plane avec
+\MP~\cite{ctan-metapost}. Cet
+ensemble est organisé en plusieurs fichiers :
+
+\begin{enumerate}
+\item \fichier{geom2d.mp} : c'est le fichier principal, qui charge tous les
+autres ;
+\item \fichier{geom2d-main.mp} : il contient
+ les structures et fonctions générales ;
+\item \fichier{geom2d-arc.mp} :
+ contient tout ce qui concerne les arcs de cercles ;
+\item \fichier{geom2d-c2d.mp} :
+ contient tout ce qui concerne les courbes du second degré ;
+\item \fichier{geom2d-fct.mp} :
+ contient quelques fonctions mathématiques usuelles ;
+\item \fichier{geom2d-lbl.mp} :
+ contient les fonctions relatives aux labels ;
+\item \fichier{geom2d-plt.mp} :
+ contient des fonctions facilitant la représentation de fonctions
+ mathématiques ;
+\item \fichier{geom2d-rep.mp}
+ contient différents outils pour le tracé de figure dans un repère ;
+\item \fichier{geom2d-tra.mp}
+ contient les fonctions permettant de gérer la transparence (code
+ emprunté à Anthony \bsc{Phan}) ;
+\item \fichier{geom2d-svgnames.mp} fournit les 150 couleurs de la spécification
+SVG.
+\end{enumerate}
+
+Nous allons, dans la suite, décrire plus en détails chacune de ces
+fonctions. Certaines fonctions s'appuient sur
+l'extension \fichier{graph.mp} présente dans toutes les bonnes
+distributions \TeX.
+
+\section{Principe général de fonctionnement}
+
+\mpgeomdd utilise des tables comme structure principale. Chaque objet est
+numéroté \emph{via} le compteur \variableGDD{gddO}, son type\footnote{Les types
+sont propres à \mpgeomdd et seront décrits plus tard.} est stocké dans
+la table \variableGDD{gddT[]} à la place \variableGDD{gddT[gddO]}. Les
+propriétés des objets sont définies dans, là encore, des tables de
+type \typeMP{numeric} qui sont \variableGDD{gddA[]}, \variableGDD{gddB[]},
+\dots, \variableGDD{gddF[]}.
+
+Par exemple, pour un \typeGDD{Point} (type \mpgeomdd), la première coordonnée
+se trouve dans \variableGDD{gddA[]} et la seconde dans \variableGDD{gddB[]}
+(les autres table ne sont pas utilisées pour un tel objet).
+
+Il y a trois tables particulières \variableGDD{gddP[]} qui est du type
+\typeMP{path}, \variableGDD{gddPX[][]} qui est sa version étendue, et \variableGDD{gddS[]} qui est du type
+\typeMP{string}. Nous verrons plus tard quelle est leur utilité.
+
+Bien entendu, lors d'une utilisation classique de \mpgeomdd, l'appel à
+toutes ces tables n'est pas chose courante. Les fonctions que nous
+allons décrire dans la suite de ce document permettent de ne pas
+avoir recours trop précisément à cette machinerie.
+
+
+\section{Tracés}
+
+\mpgeomdd fournit des macros pour tracer des objets. Une commande permet de tracer
+la plupart des objets de \mpgeomdd (qui sont décrits dans la
+section~\ref{sec:types}), ainsi que certains type \MP. Les exemples tout au long
+de la documentation permettront d'illustrer les commandes de tracé.
+
+Pour comprendre comment fonctionne les représentations avec \mpgeomdd, il nous faut
+tout d'abord décrire le mécanisme de gestion des unités.
+
+\subsection{Unité}
+
+\mpgeomdd définit une unité générale avec la variable globale
+\lstinline+gddU+. Ce \typeMP{numeric} vaut par
+défaut \SI{1}{cm}.
+\begin{colourband}
+ \macro|gddU|
+ \index{gddU@\lstinline+gddU+}
+ \end{colourband}
+\subsection{En place}
+
+Lors de l'utilisation des commandes de tracé, \mpgeomdd utilise la macro\label{gddEnPlace}
+\begin{colourband}
+\macro|gddEnPlace|
+\index{gddEnPlace@\lstinline+gddEnPlace+}
+\end{colourband}
+Cette macro permet de spécifier les transformations géométriques nécessaires au
+placement de l'objet, notamment le facteur d'échelle relatif à l'unité
+\lstinline+gddU+.
+
+En interne, cette macro est un \lstinline+scantoken+ de la variable globale
+\variableGDD{gddW}\index{gddW@\lstinline+gddW+} (\typeMP{string}) qui contient les transformations.
+
+\subsection{Commandes de tracés}\label{sec:trace}
+
+La macro de tracé la plus courante est la macro \lstinline+trace+.
+\begin{colourband}
+\macro|trace(«objet»)|
+\begin{description}
+ \item[\meta{objet}:]
+ \begin{itemize}
+ \item pour le côté \MP, un \typeMP{path}, une
+ \typeMP{picture} ou un \typeMP{pair}, et dans ce cas \lstinline+trace+ sera
+ équivalent à \lstinline+draw+;
+ \item du côté de \mpgeomdd,
+ n'importe quel des 6 objets définis jusque là : \typeGDD{triangle},
+ \typeGDD{segment}, \typeGDD{droite}, \typeGDD{cercle}, \typeGDD{ellipse},
+ \typeGDD{parabole}, \typeGDD{hyperbole},
+ \typeGDD{polygone}, \typeGDD{chemin},
+ \typeGDD{courbe} ou \typeGDD{vecteur} (pour ce dernier, une flèche sera
+ ajoutée à l'extrémité du vecteur).
+ \end{itemize}
+\end{description}\index{trace@\lstinline+trace+}
+\end{colourband}
+
+Lorsque \lstinline+trace+ est utilisée sur un objet de \mpgeomdd, la macro fait
+appel à la commande \MP\ \lstinline+draw+ avec le mécanisme de mise en place
+décrit plus haut.
+
+\mpgeomdd fournit un tracé avec flèche faisant non plus appel à \lstinline+draw+
+mais à \lstinline+drawarrow+.
+
+\begin{colourband}
+\macro|fleche(«objet»)|
+\begin{description}
+ \item[\meta{objet}:]
+ \begin{itemize}
+ \item pour le côté \MP, un \typeMP{path}, une
+ \typeMP{picture} ou un \typeMP{pair}, et dans ce cas \lstinline+trace+ sera
+ équivalent à \lstinline+drawarrow+;
+ \item du côté de \mpgeomdd,
+ n'importe quel des 6 objets définis jusque là : \typeGDD{triangle},
+ \typeGDD{segment}, \typeGDD{droite}, \typeGDD{cercle}, \typeGDD{ellipse},
+ \typeGDD{polygone}, \typeGDD{chemin},
+ \typeGDD{courbe} ou \typeGDD{vecteur} (pour ce dernier, une flèche sera
+ ajoutée à l'extrémité du vecteur).
+ \end{itemize}
+\end{description}\index{fleche@\lstinline+fleche+}
+\end{colourband}
+
+On peut aussi colorier un objet grâce à la macro suivante.
+\begin{colourband}
+\macro|colorie(«objet»)|
+\begin{description}
+ \item[\meta{objet}:] peut être:
+ \begin{itemize}
+ \item pour le côté \MP, uniquement un \typeMP{path} et dans ce cas \lstinline+trace+ sera équivalent à \lstinline+fill+;
+ \item du côté de \mpgeomdd,
+ n'importe quel objet coloriable : \typeGDD{triangle},
+ \typeGDD{cercle}, \typeGDD{ellipse}, \typeGDD{polygone}, \typeGDD{chemin}, ou
+ \typeGDD{courbe}.
+ \end{itemize}
+\end{description}\index{colorie@\lstinline+colorie+}
+\end{colourband}
+
+
+Les commandes de tracés de \mpgeomdd font appel aux macros de
+base de \MP : \lstinline+draw+ et \lstinline+fill+. Ainsi, pour spécifier la
+couleur, on pourra
+utiliser la commande \lstinline+withcolor+ ou bien la macro
+\lstinline+drawoptions+.
+
+
+On peut aussi colorier avec de la transparence\footnote{En réalité, on simule de
+la transparence avec le code emprunté à Anthony Phan :
+\url{http://www-math.univ-poitiers.fr/~phan/metalpha.html}} avec la commande
+suivante.
+\begin{colourband}
+\macro|colorieAvecTransparence(«objet»,«couleur»,«coefficient de transparence»)|
+\begin{description}
+ \item[\meta{objet}:] peut être:
+ \begin{itemize}
+ \item pour le côté \MP, uniquement un \typeMP{path} et dans ce cas \lstinline+trace+ sera équivalent à \lstinline+fill+;
+ \item du côté de \mpgeomdd,
+ n'importe quel objet coloriable : \typeGDD{triangle},
+ \typeGDD{cercle}, \typeGDD{ellipse}, \typeGDD{polygone}, \typeGDD{chemin}, ou
+ \typeGDD{courbe}.
+ \end{itemize}
+ \item[\meta{couleur}:] est une \typeMP{color}.
+ \item[\meta{coefficient de transparence}:] est un \typeMP{numeric} compris
+ entre 0 et 1, 0 pour un coloriage opaque et 1 pour un coloriage invisible.
+\end{description}\index{colorie@\lstinline+colorie+}
+\end{colourband}
+
+
+
+
+Les macros ci-dessus, font appel à une macro plus bas niveau qui permet de
+retourner le \typeMP{path} à tracer ou colorier pour tous les objets \mpgeomdd.
+
+\begin{colourband}
+\macro|gddTraceObjet(«objet»)|\return{\typeMP{path}}
+\begin{description}
+ \item[\meta{objet}:]
+ \typeGDD{triangle}, \typeGDD{segment}, \typeGDD{vecteur},
+ \typeGDD{cercle}, \typeGDD{ellipse}, \typeGDD{parabole}, \typeGDD{hyperbole},\typeGDD{polygone}, \typeGDD{chemin}, ou
+ \typeGDD{courbe}.
+\end{description}\index{gddTraceObjet@\lstinline+gddTraceObjet+}
+\end{colourband}
+
+Si l'objet n'est pas fermé, \mpgeomdd fournit la macro suivante qui ajoute un
+\lstinline+--cycle+ à la suite du chemin :
+\begin{colourband}
+\macro|fermeture(«objet»)|\return{\typeMP{path}}\indication{fermé \lstinline+--cycle+}
+\begin{description}
+ \item[\meta{objet}:]
+ \begin{itemize}
+ \item du côté de \MP, \typeMP{path} ;
+ \item du côté de \mpgeomdd, \typeGDD{triangle}, \typeGDD{segment}, \typeGDD{vecteur},
+ \typeGDD{cercle}, \typeGDD{chemin}, ou
+ \typeGDD{courbe}.
+ \end{itemize}
+\end{description}\index{fermeture@\lstinline+fermeture+}
+\end{colourband}
+
+On pourra spécifier le \emph{crayon} utilisé pour les tracés avec la commande
+suivante:
+
+\begin{colourband}
+ \macro|avecCrayon(«taille»,«couleur»)|
+ \begin{description}
+ \item[\meta{taille}:] facteur d'échelle \typeMP{numeric} du \typeMP{pen}
+ \lstinline+pencircle+ de \MP{} utilisé ;
+ \item[\meta{couleur}:] couleur \typeMP{color} à utiliser.
+ \end{description}\index{avecCrayon@\lstinline+avecCrayon+}
+\end{colourband}
+
+Cette macro est un raccourci pour le \emph{classique} \texttt{withpen
+pencircle scaled ... withcolor ...}. On peut d'ailleurs évidemment toujours
+utiliser les commandes \MP{} pour le dessin.
+
+On peut représenter les objets de type \typeGDD{point}. Pour cela, on dispose
+d'une commande qui trace un petit cercle coloré à l'endroit du point. La
+commande est la suivante :
+
+\begin{colourband}
+\macro|pointe(«point»)|
+\begin{description}
+ \item[\meta{point}:] \typeGDD{point} ou \typeMP{pair}
+\end{description}\index{pointe@\lstinline+pointe+}
+\end{colourband}
+
+Cette macro utilise deux variables globales de \mpgeomdd qui sont
+\begin{colourband}
+\macro|gddTaillePoint|\indication{\typeMP{numeric}, valeur par défaut 3}
+\index{gddTaillePoint@\lstinline+gddTaillePoint+}
+\end{colourband}
+et
+\begin{colourband}
+\macro|gddCouleurPoint| \indication{\typeMP{color}, valeur par défaut \lstinline+white+}
+\index{gddCouleurPoint@\lstinline+gddCouleurPoint+}
+\end{colourband}
+
+Il existe deux autres types de pointage de point : la simple croix et le simple
+disque. Pour choisir un autre type de pointage (en utilisant la même commande
+\lstinline+pointe+), on modifiera la variable globale suivante:
+\begin{colourband}
+ \macro|gddPointType| \indication{\typeMP{string}, valeur par défaut
+ \lstinline+"pointe"+}
+ \par
+
+ Peut valoir : \lstinline+"pointe"+, \lstinline+"croix"+ ou \lstinline+"disque"+.
+ \index{gddPointType@\lstinline+gddPointType+}
+\end{colourband}
+\subsection{Contenir les tracés}
+
+Il est souvent nécessaire de restreindre les tracés à une zone du plan $\R^2$.
+Pour cela, \mpgeomdd fournit la commande \lstinline+Fenetre+:
+\begin{colourband}
+\macro|Fenetre(«Xmin»,«Ymin»,«Xmax»,«Ymin»)|
+\index{Fenetre@\lstinline+Fenetre+}
+\end{colourband}
+Cette fonction trace un rectangle dont deux sommets opposés sont les points
+\lstinline|(Xmin,Ymin)| et \lstinline|(Xmax,Ymax)| avec la couleur \MP{}
+\lstinline+background+ et découpe l'image courante autour de ce cadre (avec la
+commande \MP{} \lstinline+clip currentpicture+).
+
+
+\section{Les types}\label{sec:types}
+
+\mpgeomdd, fournit plusieurs types d'objets. Le type d'objet est
+stocké dans la table \variableGDD{gddT[]}, et les tables \variableGDD{gddA[]}
+à \variableGDD{gddF[]}, ainsi que la table \variableGDD{gddX} contiennent les propriétés des objets.
+
+Nous allons ici décrire chaque type de l'extension \mpgeomdd,
+leurs propriétés respectives, ainsi que des méthodes associées directement à
+l'objet.
+
+\subsection{Le type \typeGDD{point}}
+
+Ce type correspond au point de
+l'espace euclidien.
+
+\subsubsection{Constructeur}
+
+Pour être plus clair voici la fonction principale
+pour créer un tel objet :
+%
+\begin{mpcode}
+vardef Point(expr a,b) =
+ gddT[incr gddO] = "point";
+ gddA[gddO] = a; gddB[gddO] = b; gddO
+enddef;
+\end{mpcode}
+
+\begin{colourband}
+\macro|Point(«x»,«y»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{x}:] \typeMP{numeric} ;
+ \item[\meta{y}:] \typeMP{numeric}.
+\end{description}\index{Point@\lstinline+Point+}
+\end{colourband}
+\bigskip
+
+
+Cette fonction \og{}retourne\fg{} le compteur \variableGDD{gdd0} et crée dans la
+table de type une entrée \typeGDD{point} et les attributs (coordonnées)
+correspondants \variableGDD{a} et \variableGDD{b} dans les tables
+\variableGDD{gddA} et \variableGDD{gddB}.
+
+Avec un tel type de fonctionnement, la plupart des manipulations se
+fait sur des \typeMP{numeric}s. En effet, pour déclarer un
+\typeGDD{point}, il suffit d'écrire
+\begin{mpcode}
+A = Point(2,3);
+\end{mpcode}
+\variableGDD{A} prend alors la valeur courante de \variableGDD{gddO}. C'est
+l'identifiant du point.
+
+On peut aussi définir un \typeGDD{point} par ses coordonnées \emph{polaires}
+avec la commande suivante.
+
+\begin{colourband}
+\macro|PointPolaire(«r»,«a»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{r}:] \typeMP{numeric}, module du point;
+ \item[\meta{a}:] \typeMP{numeric}, angle par rapport à l'axe des abscisses.
+\end{description}\index{Point@\lstinline+Point+}
+\end{colourband}
+\bigskip
+
+
+
+On peut définir un point dans un repère défini lui par un point
+d'origine et deux vecteurs avec la fonction suivante:
+\begin{colourband}
+\macro|PointDansRepere(«x»,«y»,«o»,«i»,«j»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{x}:] \typeMP{numeric} ;
+ \item[\meta{y}:] \typeMP{numeric} ;
+ \item[\meta{o}:] \typeGDD{point} d'origine du repère ;
+ \item[\meta{i}:] \typeGDD{vecteur} (ou \typeGDD{point}) définissant l'axe des abscisses ;
+ \item[\meta{j}:] \typeGDD{vecteur} (ou \typeGDD{point}) définissant l'axe des ordonnées.
+\end{description}\index{PointDansRepere@\lstinline+PointDansRepere+}
+\end{colourband}
+
+\bigskip
+
+Le code suivant illustre l'utilisation de cette commande (avec des
+\typeGDD{point}s au lieu de \typeGDD{vecteur}s, type décrit plus tard).
+\begin{mpcode}
+O = Point(0,0);
+I = Point(2,0);
+J = Point(0,3);
+A = PointDansRepere(2,3,O,I,J);
+\end{mpcode}
+
+
+\subsubsection{Macros associées}
+
+On peut récupérer l'abscisse et l'ordonnée d'un point avec les commandes
+suivantes :
+\begin{colourband}
+\macro|Abscisse(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point}, \typeGDD{vecteur} ou \typeMP{pair}.
+\end{description}\index{Abscisse@\lstinline+Abscisse+}
+\end{colourband}
+
+\begin{colourband}
+\macro|Ordonnee(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point}, \typeGDD{vecteur} ou \typeMP{pair}.
+\end{description}\index{Ordonnee@\lstinline+Ordonnee+}
+\end{colourband}
+
+On pourra ajouter les abscisses, les ordonnées ou bien, à la manière des
+vecteurs, des points entre eux avec les commandes suivantes.
+\begin{colourband}
+\macro|AdditionAbscisses(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair}.
+\end{description}\index{AdditionAbscisses@\lstinline+AdditionAbscisses+}
+\end{colourband}
+\begin{colourband}
+\macro|AdditionOrdonnee(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair}.
+\end{description}\index{AdditionOrdonnee@\lstinline+AdditionOrdonnee+}
+\end{colourband}
+et
+\begin{colourband}
+\macro|Addition(«a»,«b»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair};
+ \item[\meta{b}:] \typeGDD{point} ou \typeMP{pair}.
+\end{description}\index{Addition@\lstinline+Addition+}
+\end{colourband}
+
+On peut aussi calculer la longueur entre deux points grâce à la commande
+suivante:
+\begin{colourband}
+\macro|Longueur(«a»,«b»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair};
+ \item[\meta{b}:] \typeGDD{point} ou \typeMP{pair}.
+\end{description}\index{Longueur@\lstinline+Longueur+}
+\end{colourband}
+
+On peut calculer le point équidistant de deux points, le milieu :
+\begin{colourband}
+\macro|Milieu(«a»,«b»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair};
+ \item[\meta{b}:] \typeGDD{point} ou \typeMP{pair}.
+\end{description}\index{Milieu@\lstinline+Milieu+}
+\end{colourband}
+
+On peut réaliser la rotation d'un point autour de l'origine $(0,0)$ avec la
+commande suivante:
+\begin{colourband}
+\macro|Rotation(«a»,«b»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair};
+ \item[\meta{b}:] \typeMP{numeric}, l'angle de rotation en radian.
+\end{description}\index{Rotation@\lstinline+Rotation+}
+\end{colourband}
+
+Si on veut réaliser la rotation d'un point autour d'un autre, on utilisera la
+commande suivante:
+\begin{colourband}
+\macro|RotationCentre(«a»,«b»,«c»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair};
+ \item[\meta{b}:] \typeGDD{point} ou \typeMP{pair}, centre de rotation;
+ \item[\meta{c}:] \typeMP{numeric}, l'angle de rotation en radian.
+\end{description}\index{RotationCentre@\lstinline+RotationCentre+}
+\end{colourband}
+
+On peut calculer l'isobarycentre d'une liste de points (ou de \typeMP{pair} de \MP) avec la commande suivante.
+\begin{colourband}
+\macro|IsoBarycentre(«a»,«b»,«c», etc.)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair};
+ \item[\meta{b}:] \typeGDD{point} ou \typeMP{pair} ;
+ \item[] etc.
+\end{description}\index{IsoBarycentre@\lstinline+IsoBarycentre+}
+\end{colourband}
+
+On peut calculer le barycentre d'une liste de points associées à des poids (mais
+ici, il n'est pas possible d'utiliser des \typeMP{pair} de \MP).
+\begin{colourband}
+\macro|Barycentre((«A»,«a»),(«B»,«b»),(«C»,«c»), etc.)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{A}:] \typeGDD{point} ;
+ \item[\meta{a}:] \typeMP{numeric}, poids associé à \meta{A} ;
+ \item[\meta{B}:] \typeGDD{point} ;
+ \item[\meta{b}:] \typeMP{numeric}, poids associé à \meta{B} ;
+ \item[] etc.
+\end{description}\index{Barycentre@\lstinline+Barycentre+}
+\end{colourband}
+
+
+On peut déterminer la bissectrice d'un secteur angulaire défini par trois
+points. La fonction retourne une \typeGDD{droite}.
+\begin{colourband}
+\macro|Bissectrice(«A»,«B»,«C»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{A}:] \typeGDD{point} ;
+ \item[\meta{B}:] \typeGDD{point} ;
+ \item[\meta{C}:] \typeGDD{point}.
+\end{description}\index{Bissectrice@\lstinline+Bissectrice+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,0);
+B = Point(0,0);
+C = Point(1,1);
+D = Bissectrice(A,B,C);
+trace D;
+marque.bot "A";
+marque.bot "B";
+marque.bot "C";
+Fenetre(-0.5,-0.5,2,2);
+endfig;
+\end{ExempleMP}
+
+
+Le type \typeGDD{point} est évidemment lié au type \MP{} \typeMP{pair}.
+
+\mpgeomdd fournit des macros qui permettent de passer de \typeGDD{point} à
+\typeMP{pair} et réciproquement.
+\begin{colourband}
+\macro|PointTOPair(«a»,«b»)|\return{\typeMP{pair}}
+\begin{description}
+ \item[\meta{a}:] \typeMP{numeric}, abscisse ;
+ \item[\meta{b}:] \typeMP{numeric}, ordonnée.
+\end{description}\index{PointTOPair@\lstinline+PointTOPair+}
+\end{colourband}
+
+
+\begin{colourband}
+\macro|PairTOPoint(«p»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{p}:] \typeMP{pair}.
+\end{description}\index{PairTOPoint@\lstinline+PairTOPoint+}
+\end{colourband}
+
+Ces deux commandes sont complétées par deux autres qui assure qu'un élément est
+d'un type donné:
+\begin{colourband}
+\macro|PairImp(«p»)|\return{\typeGDD{pair}}
+\begin{description}
+ \item[\meta{p}:] \typeGDD{point} ou \typeMP{pair}.
+\end{description}\index{PairImp@\lstinline+PairImp+}
+\end{colourband}
+
+
+\begin{colourband}
+\macro|PointImp(«p»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{p}:] \typeGDD{point} ou \typeMP{pair}.
+\end{description}\index{PointImp@\lstinline+PointImp+}
+\end{colourband}
+
+On peut aussi récupérer un point le long d'un objet \mpgeomdd (décrit dans les
+sections suivantes). La macro suivante retourne un \typeGDD{point} le long du
+chemin (cyclique ou non) de l'objet le paramétrant entre 0 et 1.
+
+\begin{colourband}
+\macro|PointDe(«o»,«t»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{o}:] n'importe quel objet \mpgeomdd (même un \typeGDD{point} pour
+ lequel lui-même est retourné);
+ \item[\meta{t}:] \typeMP{numeric} compris entre 0 et 1 (qui paramètre le
+ chemin de l'objet entre 0 et 1).
+\end{description}\index{PointDe@\lstinline+PointDe+}
+\end{colourband}
+
+
+
+\subsection{Le type \typeGDD{vecteur}}
+
+Ce type correspond aux vecteurs
+définis à l'aide de deux coordonnées de l'espace euclidien.
+
+\subsubsection{Constructeurs}
+
+La fonction
+créatrice d'un tel objet est celle-ci
+%
+\begin{mpcode}
+vardef Vecteur(expr a,b) =
+ save n; n = incr gddO;
+ gddT[n] = "vecteur"; gddA[n] = a; gddB[n] = b; n
+enddef;
+\end{mpcode}
+
+\begin{colourband}
+\macro|Vecteur(«a»,«b»)|\return{\typeGDD{vecteur}}
+\begin{description}
+ \item[\meta{a}:] \typeMP{numeric} ;
+ \item[\meta{b}:] \typeMP{numeric}.
+\end{description}\index{Vecteur@\lstinline+Vecteur+}
+\end{colourband}
+\bigskip
+
+Cette fonction a la même architecture que celle correspondante au
+\typeGDD{point} : elle retourne la valeur courante de \variableGDD{gddO}
+après incrémentation, puis affecte le type \typeGDD{vecteur} à
+l'entrée correspondante dans la table \variableGDD{gddT}.
+
+On peut aussi définir un vecteur à partir d'un \typeMP{pair} \MP.
+\begin{mpcode}
+vardef VecteurP(expr a) =
+ save n; n = incr gddO;
+ gddT[n] = "vecteur"; gddA[n] = xpart a; gddB[n] = ypart a; n
+enddef;
+\end{mpcode}
+
+\begin{colourband}
+\macro|VecteurP(«a»)|\return{\typeGDD{vecteur}}
+\begin{description}
+ \item[\meta{a}:] \typeMP{pair}.
+\end{description}\index{VecteurP@\lstinline+VecteurP+}
+\end{colourband}
+\bigskip
+
+Un vecteur peut se définir alors comme ceci:
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+AB = Vecteur(2,3);
+pair a;
+a := (3,2);
+A = VecteurP(a);
+trace AB;
+trace A;
+endfig;
+\end{ExempleMP}
+
+\subsubsection{Macros associées}
+
+Comme les objets de \mpgeomdd ne sont pas des \typeMP{numeric}s, les opérations classiques
+de l'espace vectoriel ne peuvent pas s'écrire avec les simples caractères
+\lstinline-+-, \lstinline+-+, et \lstinline-*-.
+
+\begin{colourband}
+\macro|AdditionVecteur(«a»,«b»)|\return{\typeGDD{vecteur}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{vecteur} ;
+ \item[\meta{b}:] \typeGDD{vecteur}.
+\end{description}\index{AdditionVecteur@\lstinline+AdditionVecteur+}
+\end{colourband}
+\bigskip
+
+
+\begin{colourband}
+\macro|SoustractionVecteur(«a»,«b»)|\return{\typeGDD{vecteur}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{vecteur} ;
+ \item[\meta{b}:] \typeGDD{vecteur}.
+\end{description}\index{SoustractionVecteur@\lstinline+SoustractionVecteur+}
+\end{colourband}
+\bigskip
+
+
+\begin{colourband}
+\macro|ScalaireVecteur(«k»,«b»)|\return{\typeGDD{vecteur}}
+\begin{description}
+ \item[\meta{k}:] \typeMP{numeric} ;
+ \item[\meta{b}:] \typeGDD{vecteur}.
+\end{description}\index{ScalaireVecteur@\lstinline+ScalaireVecteur+}
+\end{colourband}
+\bigskip
+
+On pourra alors faire les opérations classiques sur les vecteurs.
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+AB = Vecteur(2,3);
+BC = Vecteur(1,0);
+AC = AdditionVecteur(AB,BC);
+kAC = ScalaireVecteur(3.0,AC);
+trace AB;
+trace BC;
+trace AC;
+endfig;
+\end{ExempleMP}
+
+On peut aussi calculer le produit scalaire de deux vecteurs avec la commande
+suivante.
+
+\begin{colourband}
+\macro|ProduitScalaire(«a»,«b»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{vecteur} ;
+ \item[\meta{b}:] \typeGDD{vecteur}.
+\end{description}\index{ProduitScalaire@\lstinline+ProduitScalaire+}
+\end{colourband}
+\bigskip
+
+On peut aussi calculer la norme euclidienne d'un vecteur.
+\begin{colourband}
+\macro|Norme(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{vecteur}.
+\end{description}\index{Norme@\lstinline+Norme+}
+\end{colourband}
+\bigskip
+
+La commande suivante permet d'obtenir l'angle, en radian, entre $[0,\uppi]$ formé
+entre deux vecteurs. Si on note $u$ et $v$ les deux vecteurs de $\R^2$, l'angle
+calculé par la commande suivante est obtenu avec la formule suivante :
+\[\theta = \arccos \left(\frac{u\cdot v}{\|u\|\|v\|}\right).\]
+
+\begin{colourband}
+\macro|Angle(«a»,«b»)|\return{\typeMP{numeric} (dans $[0,\uppi]$)}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{vecteur} ;
+ \item[\meta{b}:] \typeGDD{vecteur}.
+\end{description}\index{Norme@\lstinline+Norme+}
+\end{colourband}
+\bigskip
+
+
+\subsection{Le type \typeGDD{segment}}
+Les segments sont
+définis par deux points de $\R^2$.
+
+
+\subsubsection{Constructeur}
+La fonction créatrice de cet objet est
+celle-ci
+\begin{mpcode}
+vardef Segment (expr a,b) =
+ save n; n = incr gddO;
+ gddT[n] = "segment"; gddA[n] = PointImp(a); gddB[n] = PointImp(b); n
+enddef;
+\end{mpcode}
+
+\begin{colourband}
+\macro|Segment(«a»,«b»)|\return{\typeGDD{segment}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ;
+ \item[\meta{b}:] \typeGDD{point}.
+\end{description}\index{Segment@\lstinline+Segment+}
+\end{colourband}
+
+\bigskip
+
+Un segment se définit alors comme ceci:
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(2,3);
+B = Point(4,5);
+C = Point(2,1);
+AB = Segment(A,B);
+BC = Segment(B,C);
+AC = Segment(A,C);
+fleche AB;
+fleche BC;
+fleche AC;
+endfig;
+\end{ExempleMP}
+
+\subsubsection{Macros associées}
+
+On peut calculer la longueur d'un segment avec la macro suivante.
+\begin{colourband}
+\macro|LongueurSegment(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{segment}.
+\end{description}\index{LongueurSegment@\lstinline+LongueurSegment+}
+\end{colourband}
+
+On peut aussi convertir un segment en vecteur avec la macro suivante qui fait la
+différence des coordonnées des deux points définissant le segment.
+\begin{colourband}
+\macro|SegmentTOVecteur(«a»)|\return{\typeGDD{vecteur}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{segment}.
+\end{description}\index{SegmentTOVecteur@\lstinline+SegmentTOVecteur+}
+\end{colourband}
+
+
+
+\subsection{Le type \typeGDD{droite}}
+Une droite est simplement définie par
+deux points.
+
+\subsubsection{Constructeur}
+
+Ainsi la fonction créatrice de cet objet est la suivante
+\begin{mpcode}
+vardef Droite (expr a,b) =
+ save n; n = incr gddO;
+ gddT[n] = "droite"; gddA[n] = PointImp(a); gddB[n] = PointImp(b); n
+enddef;
+\end{mpcode}
+\begin{colourband}
+\macro|Droite(«a»,«b»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ;
+ \item[\meta{b}:] \typeGDD{point}.
+\end{description}\index{Droite@\lstinline+Droite+}
+\end{colourband}
+\bigskip
+
+Lors de la représentation des droites (voir section~\ref{sec:trace}), le
+caractère \emph{infini} de la droite est géré par la variable globale
+\lstinline+gddExtensionDroite+
+\index{gddExtensionDroite@\lstinline+gddExtensionDroite+}
+qui vaut 10 par défaut.
+
+\subsubsection{Macros associées}
+
+
+La macro suivante permet, sous forme d'un triplet, et donc d'une \typeMP{color},
+d'obtenir les coefficients d'une droite donnée. Pour une droite $(D)$, la macro
+donne le triplet $(u,v,w)\in\R^3$ tel que $\forall (x,y)\in(D)$, $ux+vy+w=0$.
+
+\begin{colourband}
+\macro|EquationDroite(«a»)|\return{\typeMP{color}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{droite}.
+\end{description}\index{EquationDroite@\lstinline+EquationDroite+}
+\end{colourband}
+
+On peut calculer la projection d'un point sur une droite avec la commande
+suivante.
+
+\begin{colourband}
+\macro|ProjectionPointSurDroite(«p»,«a»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{p}:] \typeGDD{point} ;
+ \item[\meta{a}:] \typeGDD{droite}.
+\end{description}\index{ProjectionPointSurDroite@\lstinline+ProjectionPointSurDroite+}
+\end{colourband}
+
+On peut obtenir l'ordonnée relative d'un point sur une droite avec la macro
+suivante.
+\begin{colourband}
+\macro|OrdonneeRelativePointDroite(«p»,«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{p}:] \typeGDD{point} ;
+ \item[\meta{a}:] \typeGDD{droite}.
+\end{description}\index{OrdonneeRelativePointDroite@\lstinline+OrdonneeRelativePointDroite+}
+\end{colourband}
+
+Le calcul de la distance d'un point à une droite se fait avec la macro suivante.
+\begin{colourband}
+\macro|DistancePointDroite(«p»,«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{p}:] \typeGDD{point} ;
+ \item[\meta{a}:] \typeGDD{droite}.
+\end{description}\index{DistancePointDroite@\lstinline+DistancePointDroite+}
+\end{colourband}
+
+La macro suivante permet d'obtenir la droite perpendiculaire à un droite passant
+par un point.
+\begin{colourband}
+\macro|DroitePerpendiculaire(«a»,«p»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{droite} ;
+ \item[\meta{p}:] \typeGDD{point}.
+\end{description}\index{DroitePerpendiculaire@\lstinline+DroitePerpendiculaire+}
+\end{colourband}
+
+On pourra obtenir le \typeGDD{point} d'intersection de deux droites avec la
+macro suivante.
+\begin{colourband}
+\macro|IntersectionDroites(«a»,«b»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{droite} ;
+ \item[\meta{b}:] \typeGDD{droite}.
+\end{description}\index{IntersectionDroites@\lstinline+IntersectionDroites+}
+\end{colourband}
+
+La macro suivante permet de reporter un point sur une droite avec une certaine
+longueur (signée), à la manière d'un compas.
+
+\begin{colourband}
+\macro|ReportSurDroite(«P»,«D»,«l»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{P}:] \typeGDD{point} ;
+ \item[\meta{D}:] \typeGDD{droite} ;
+ \item[\meta{l}:] \typeMP{numeric} (peut être négatif).
+\end{description}\index{ReportSurDroite@\lstinline+ReportSurDroite+}
+\end{colourband}
+
+Le côté du report par rapport au point \meta{P} dépend de la définition de
+la droite : pour une droite définie par deux \typeGDD{point}s $A$ et $B$, alors
+la direction du report sera suivant le vecteur $\overrightarrow{AB}$. Pour
+changer de direction, il suffira de multiplier le paramètre de distance \meta{l}
+par $-1$.
+
+Voici un exemple permettant d'illustrer l'utilisation de quelques commandes
+relatives aux droites.
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(0,0);
+B = Point(3,2);
+AB = Droite(A,B);
+trace AB;
+pointe A;
+pointe B;
+C = Point(0,2);
+DC = DroitePerpendiculaire(AB,C);
+trace DC;
+pointe C;
+D = ProjectionPointSurDroite(C,AB);
+pointe D;
+Fenetre(-2,-2,4,4);
+endfig;
+\end{ExempleMP}
+
+
+
+
+
+\subsection{Le type \typeGDD{cercle}}
+Un cercle est défini par un point et un
+rayon.
+
+\subsubsection{Constructeurs}
+La fonction créatrice de base de cet objet est la suivante
+\begin{mpcode}
+vardef Cercle (expr a,b) =
+ save n; n = incr gddO;
+ gddT[n] = "cercle"; gddA[n] = PointImp(a); gddB[n] = b; n
+enddef;
+\end{mpcode}
+\begin{colourband}
+\macro|Cercle(«a»,«b»)|\return{\typeGDD{cercle}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair},
+ centre du cercle ;
+ \item[\meta{b}:] \typeMP{numeric}, rayon du cercle.
+\end{description}\index{Cercle@\lstinline+Cercle+}
+\end{colourband}
+\bigskip
+
+
+Deux autres fonctions permettent de définir des cercles. La fonction
+\foncGDD{CercleCP} définit le cercle par un centre et un point par lequel passe
+le cercle.
+\begin{colourband}
+\macro|CercleCP(«a»,«b»)|\return{\typeGDD{cercle}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair},
+ centre du cercle ;
+ \item[\meta{b}:] \typeGDD{point},
+ tel que \meta{b}$-$\meta{a} est le rayon.
+\end{description}\index{CercleCP@\lstinline+CercleCP+}
+\end{colourband}
+\bigskip
+
+
+
+On peut aussi définir un cercle par deux points définissant son diamètre. La
+fonction correspondante est la suivante
+
+\begin{colourband}
+\macro|CercleD(«a»,«b»)|\return{\typeGDD{cercle}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair} ;
+ \item[\meta{b}:] \typeGDD{point} ou \typeMP{pair},
+ tel que $($\meta{a}$-$\meta{b}$)$ est le diamètre du cercle.
+\end{description}\index{CercleD@\lstinline+CercleD+}
+\end{colourband}
+\bigskip
+
+On peut aussi définir un cercle comme le cercle qui passe par trois points avec
+la macro suivante.
+
+\begin{colourband}
+\macro|CercleTroisPoints(«a»,«b»,«c»)|\return{\typeGDD{cercle}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair} ;
+ \item[\meta{b}:] \typeGDD{point} ou \typeMP{pair} ;
+ \item[\meta{c}:] \typeGDD{point} ou \typeMP{pair}.
+\end{description}\index{CercleTroisPoints@\lstinline+CercleTroisPoints+}
+\end{colourband}
+\bigskip
+
+
+
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(3,1);
+B = Point(0,2);
+O = Point(0,0);
+r = 1.0;
+COr = Cercle(O,r);
+COA = CercleCP(O,A);
+CAB = CercleD(A,B);
+COAB = CercleTroisPoints(O,A,B);
+trace COr;
+trace COA;
+trace CAB;
+trace COAB;
+pointe A; pointe B; pointe O;
+endfig;
+\end{ExempleMP}
+
+\subsubsection{Macros associées}
+
+De nombreuses macros sont associées aux cercles.
+
+On pourra récupérer le rayon d'un cercle avec la commande suivante.
+
+
+\begin{colourband}
+\macro|Rayon(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{cercle}.
+\end{description}\index{Rayon@\lstinline+Rayon+}
+\end{colourband}
+\bigskip
+
+On pourra obtenir le centre (\typeGDD{point}) d'un cercle avec la commande :
+\begin{colourband}
+\macro|Centre(«a»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{cercle}, \typeGDD{ellipse} ou \typeGDD{hyperbole}.
+\end{description}\index{Centre@\lstinline+Centre+}
+\end{colourband}
+\bigskip
+
+On peut calculer l'intersection entre deux cercles grâce à la macro suivante.
+
+\begin{colourband}
+\macro|IntersectionCercles(«a»,«b»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{cercle} ;
+ \item[\meta{b}:] \typeGDD{cercle}.
+\end{description}\index{IntersectionCercles@\lstinline+IntersectionCercles+}
+\end{colourband}
+\bigskip
+
+Cette macro ne donnera qu'un seul point d'intersection. Pour obtenir les deux
+points d'intersection, il faudra inverser l'ordre d'appel sur les cercles comme
+l'exemple suivant l'illustre.
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(0,0);
+CA = Cercle(A,1);
+B = Point(1.5,0);
+CB = Cercle(B,2);
+D1 = IntersectionCercles(CA,CB);
+D2 = IntersectionCercles(CB,CA);
+trace CA; trace CB;
+pointe A; pointe B; pointe D1; pointe D2;
+endfig;
+\end{ExempleMP}
+
+Si il n'existe pas d'intersection, alors la compilation échouera avec l'erreur
+\texttt{! Pythagorean subtraction X.XXXX+-+X.XXXX has been replaced by 0}. Si
+les deux cercles sont confondus, alors l'erreur sera \texttt{! Division by zero.}.
+
+\mpgeomdd fournit aussi une macro permettant d'obtenir les intersections entre une
+droite et un cercle.
+
+\begin{colourband}
+\macro|IntersectionDroiteCercle(«d»,«c»,«n»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{d}:] \typeGDD{droite} ;
+ \item[\meta{c}:] \typeGDD{cercle} ;
+ \item[\meta{n}:] \typeMP{numeric} qui vaut 1 ou 2 suivant le point
+ d'intersection que l'on souhaite (s'il n'existe qu'un point d'intersection
+ alors les deux valeurs renvoient le même point).
+\end{description}\index{IntersectionDroiteCercle@\lstinline+IntersectionDroiteCercle+}
+\end{colourband}
+\bigskip
+
+S'il n'existe pas d'intersection entre la droite et le cercle, vous obtiendrez
+l'erreur \texttt{! Intersection between line and circle does not exist}.
+
+L'exemple suivant permet d'illuster cette macro.
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(2,2);
+C_A = Cercle(A,1);
+B = Point(0,1);
+C = Point(4,2);
+BC = Droite(B,C);
+E1 = IntersectionDroiteCercle(BC,C_A,1);
+trace C_A;
+trace BC dashed evenly;
+pointe A; pointe B; pointe C; pointe E1;
+Fenetre(-0.5,-0.5,5,4);
+endfig;
+\end{ExempleMP}
+
+
+
+On peut obtenir les tangentes intérieures et extérieures communes à deux cercles
+avec les deux macros suivantes. Là encore, comme il existe deux tangentes, pour
+obtenir les deux, on inversera l'ordre d'appel des deux cercles.
+
+\begin{colourband}
+\macro|TangenteCommuneExterieure(«a»,«b»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{cercle} ;
+ \item[\meta{b}:] \typeGDD{cercle}.
+\end{description}\index{TangenteCommuneExterieure@\lstinline+TangenteCommuneExterieure+}
+\end{colourband}
+\bigskip
+
+
+\begin{colourband}
+\macro|TangenteCommuneInterieure(«a»,«b»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{cercle} ;
+ \item[\meta{b}:] \typeGDD{cercle}.
+\end{description}\index{TangenteCommuneInterieure@\lstinline+TangenteCommuneInterieure+}
+\end{colourband}
+\bigskip
+
+L'exemple suivante illustre l'utilisation de ces deux macros.
+\begin{ExempleMP}[sidebyside=false]
+input geom2d;
+beginfig(1);
+C1 = Cercle((-2,0),2);
+C2 = Cercle((1.5,0),1);
+T1 = TangenteCommuneExterieure(C1,C2);
+T2 = TangenteCommuneExterieure(C2,C1);
+T3 = TangenteCommuneInterieure(C1,C2);
+T4 = TangenteCommuneInterieure(C2,C1);
+trace C1; trace C2;
+trace T1; trace T2;
+trace T3; trace T4;
+
+Fenetre(-5,-3,6,3);
+endfig;
+\end{ExempleMP}
+
+La macro suivante permet de calculer l'axe radical (\typeGDD{droite}) de deux
+cercles\footnote{La méthode de construction a été largement inspirée du code de
+T.~Thurston dans son document \emph{Drawing with \MP}~\cite{ctan-drawing-with-metapost}.}.
+\begin{colourband}
+\macro|AxeRadical(«a»,«b»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{cercle} ;
+ \item[\meta{b}:] \typeGDD{cercle}.
+\end{description}\index{AxeRadical@\lstinline+AxeRadical+}
+\end{colourband}
+\bigskip
+
+La macro suivante permet d'obtenir le centre radical de trois cercles.
+\begin{colourband}
+\macro|CentreRadical(«a»,«b»,«c»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{cercle} ;
+ \item[\meta{b}:] \typeGDD{cercle} ;
+ \item[\meta{c}:] \typeGDD{cercle}.
+\end{description}\index{CentreRadical@\lstinline+CentreRadical+}
+\end{colourband}
+\bigskip
+
+La macro suivante permet de calculer l'axe de similitude de trois cercles.
+\begin{colourband}
+\macro|AxeDeSimilitude(«a»,«b»,«c»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{cercle} ;
+ \item[\meta{b}:] \typeGDD{cercle} ;
+ \item[\meta{c}:] \typeGDD{cercle}.
+\end{description}\index{AxeDeSimilitude@\lstinline+AxeDeSimilitude+}
+\end{colourband}
+\bigskip
+
+\subsection{Le type \typeGDD{ellipse}}
+\subsubsection{Constructeurs}
+
+Les ellipses peuvent être définies de plusieurs façons. Tout d'abord, on peut la
+définir avec son centre, un des points de l'ellipse sur le grand axe (appelé
+vertex), et un des points de l'ellipse sur le petit axe (appelé co-vertex).
+Cependant, lors de la création d'une ellipse de nombreux attributs sont calculés.
+
+Le code du contructeur est le suivant:
+\begin{mpcode}
+vardef Ellipse(expr C,A,B) =
+ % C : centre
+ % A : vertex
+ % B : co-vertex
+ save n,a,b,c,e,_tmp,slope;
+ pair _tmp;
+ n = incr gddO;
+ gddT[n] = "ellipse"; gddA[n] = PointImp(C); gddB[n] = PointImp(A);
+ gddC[n] = PointImp(B);
+ % calcul des deux foyers
+ a = Longueur(C,A);
+ b = Longueur(C,B);
+ c = sqrt(a**2-b**2);
+ e = c/a;
+ _tmp = e*(Pt(A)-Pt(C));
+ % les foyers
+ gddD[n] = PairTOPoint(Pt(C)+_tmp);
+ gddE[n] = PairTOPoint(Pt(C)-_tmp);
+ gddX[n][1] = a;
+ gddX[n][2] = b;
+ gddX[n][3] = e;
+ % angle du demi-grand axe
+ slope = angle(PairImp(A)-PairImp(C));
+ gddX[n][4] = slope;
+ n
+enddef;
+\end{mpcode}
+
+\begin{colourband}
+\macro|Ellipse(«c»,«a»,«b»)|\return{\typeGDD{ellipse}}
+\begin{description}
+ \item[\meta{c}:] \typeGDD{point} ou \typeMP{pair}, le centre ;
+ \item[\meta{a}:] \typeGDD{point} ou \typeMP{pair}, le vertex ;
+ \item[\meta{b}:] \typeGDD{point} ou \typeMP{pair}, le co-vertex.
+\end{description}\index{Ellipse@\lstinline+Ellipse+}
+\end{colourband}
+\bigskip
+
+Cette macro s'utilise comme le montre l'exemple suivant.
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+C = Point(0,0);
+A = Point(3,1);
+B = Rotation((1.5,0.5),Pi/2);
+E = Ellipse(C,A,B);
+trace E;
+pointe A; pointe B; pointe C;
+endfig;
+\end{ExempleMP}
+
+On pourra définir une ellipse avec la donnée de ses deux foyers et du
+demi-grand axe avec la commande suivante:
+\begin{colourband}
+\macro|EllipseF(«A»,«B»,«a»)|\return{\typeGDD{ellipse}}
+\begin{description}
+ \item[\meta{A}:] \typeGDD{point} ou \typeMP{pair}, premier foyer ;
+ \item[\meta{B}:] \typeGDD{point} ou \typeMP{pair}, deuxième foyer ;
+ \item[\meta{a}:] \typeGDD{numeric}, le demi-grand axe.
+\end{description}\index{EllipseF@\lstinline+EllipseF+}
+\end{colourband}
+\bigskip
+
+
+Cette macro s'utilise comme le montre l'exemple suivant.
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+F1 = Point(3,1);
+F2 = Point(1.5,0.5);
+E = EllipseF(F1,F2,1.7);
+trace E;
+pointe F1; pointe F2;
+endfig;
+\end{ExempleMP}
+
+\subsubsection{Macros associées}
+
+On pourra obtenir le centre (\typeGDD{point}) d'une ellipse avec la commande :
+\begin{colourband}
+ \macro|Centre(«a»)|\return{\typeGDD{point}}
+ \begin{description}
+ \item[\meta{a}:] \typeGDD{cercle}, \typeGDD{ellipse} ou \typeGDD{hyperbole}.
+ \end{description}\index{Centre@\lstinline+Centre+}
+\end{colourband}
+
+On obtient le vertex et le co-vertex avec les commandes suivantes:
+\begin{colourband}
+\macro|Vertex(«a»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse}.
+\end{description}\index{Vertex@\lstinline+Vertex+}
+\end{colourband}
+\bigskip
+
+\begin{colourband}
+\macro|CoVertex(«a»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse}.
+\end{description}\index{CoVertex@\lstinline+CoVertex+}
+\end{colourband}
+\bigskip
+
+La commande suivante permet d'obtenir les deux foyers selon l'entier passé en
+argument.
+\begin{colourband}
+\macro|Foyer(«a»,«n»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse} ;
+ \item[\meta{n}:] \typeMP{numeric}, entier qui vaut 1 ou 2 pour obtenir chaque
+ foyer.
+\end{description}\index{Foyer@\lstinline+Foyer+}
+\end{colourband}
+\bigskip
+
+On peut obtenir le demi-grand axe et le demi-petit axe avec les commandes
+suivantes.
+\begin{colourband}
+\macro|DemiGrandAxe(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse}.
+\end{description}\index{DemiGrandAxe@\lstinline+DemiGrandAxe+}
+\end{colourband}
+\bigskip
+
+
+\begin{colourband}
+\macro|DemiPetitAxe(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse}.
+\end{description}\index{DemiPetitAxe@\lstinline+DemiPetitAxe+}
+\end{colourband}
+\bigskip
+
+On obtient l'excentricité, souvent notée $e$, avec la commande suivante.
+
+\begin{colourband}
+\macro|Excentricite(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse}, \typeGDD{parabole} ou \typeGDD{hyperbole}.
+\end{description}\index{Excentricite@\lstinline+Excentricite+}
+\end{colourband}
+\bigskip
+
+Pour obtenir l'inclinaison (coefficient directeur de la droite passant par les
+foyers de l'ellipse), on utilisera la commande suivante.
+
+\begin{colourband}
+\macro|Inclinaison(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse}, \typeGDD{parabole} ou \typeGDD{hyperbole}.
+\end{description}\index{Inclinaison@\lstinline+Inclinaison+}
+\end{colourband}
+\bigskip
+
+Pour obtenir la tangente (\typeGDD{droite}) à un point de l'ellipse, on
+utilisera la commande suivante.
+
+\begin{colourband}
+\macro|TangenteEllipse(«e»,«p»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{e}:] \typeGDD{ellipse} ;
+ \item[\meta{p}:] \typeGDD{point} ou \typeMP{pair}.
+\end{description}\index{TangenteEllipse@\lstinline+TangenteEllipse+}
+\end{colourband}
+\bigskip
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+F1 = Point(3,1);
+F2 = Point(1.5,0.5);
+E = EllipseF(F1,F2,2.4);
+pointe F1; pointe F2;
+trace E;
+M' = PointDe(E,0.5);
+D = TangenteEllipse(E,M');
+trace D;
+pointe M';
+pointe Foyer(E,1);
+pointe Foyer(E,2);
+Fenetre(-0.2,-2.5,6,4);
+endfig;
+\end{ExempleMP}
+
+
+Pour obtenir les tangentes (\typeGDD{droite}) passant par un point extérieur à
+l'ellipse, on utilisera la commande suivante. Si le point choisi n'est pas
+extérieur à l'ellipse, alors il y aura une erreur de compilation.
+
+\begin{colourband}
+\macro|TangenteExterieureEllipse(«e»,«p»,«n»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{e}:] \typeGDD{ellipse} ;
+ \item[\meta{p}:] \typeGDD{point} ou \typeGDD{pair} ;
+ \item[\meta{n}:] \typeMP{numeric} qui vaut 1 ou 2 pour choisir la tangente
+ parmi les deux possibles.
+\end{description}\index{TangenteExterieureEllipse@\lstinline+TangenteExterieureEllipse+}
+\end{colourband}
+\bigskip
+
+Les points de tangence sont accessibles comme deuxième point de la définition de
+la \typeGDD{droite} grâce à la table \variableGDD{gddB[]}.
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+F1 = Point(3,1);
+F2 = Point(1.5,0.5);
+E = EllipseF(F1,F2,2.4);
+pointe F1; pointe F2;
+trace E;
+M = Point(4,3);
+D1 = TangenteExterieureEllipse(E,M,1);
+trace D1;
+pointe gddB[D1];
+D2 = TangenteExterieureEllipse(E,M,2);
+trace D2;
+pointe gddB[D2];
+pointe M;
+pointe Foyer(E,1);
+pointe Foyer(E,2);
+Fenetre(-0.2,-2.5,6,4);
+endfig;
+\end{ExempleMP}
+
+\subsection{Le type \typeGDD{parabole}}
+
+Le constructeur de base de la parabole définit cet objet à partir du foyer et
+de la directrice.
+
+Le code du constructeur est le suivant:
+\begin{mpcode}
+vardef ParaboleFD(expr F,D) =
+ % F : foyer (point)
+ % D : directrice (droite)
+ save u, v, w, d, i, n,_tmp,slope;
+ pair _tmp;
+ n = incr gddO;
+ (u,v,w) = EquationDroite(D);
+ % ordonnée relative
+ d := u * gddA[F] + v * gddB[F] + w;
+ gddT[n] := "parabole";
+ gddX[n][1] := D; % on stocke la directrice
+ gddX[n][2] := D; % on stocke la directrice (compatibilité avec hyperbole)
+ % sommet
+ _tmp := (((-d/2)*(u,v)) shifted PairImp(F));
+ gddB[n] = PointImp(_tmp);
+ gddC[n] = PointImp(_tmp);
+ % le foyer (doublé pour compatibilité)
+ gddD[n] := F;
+ gddE[n] := F;
+ gddX[n][3] := 1.0; % excentricité
+ % angle du demi-grand axe
+ slope = angle(PairImp(gddA[D])-PairImp(gddB[D]))+90;
+ gddX[n][4] = slope;
+ i := -gddC2Dparam-1;
+ gddP[n] := (
+ ((i*(v,-u)+((i*i-d*d)/(2d))*(u,v))
+ for i:= -gddC2Dparam upto gddC2Dparam:
+ ..(i*(v,-u)+((i*i-d*d)/(2d))*(u,v))
+ endfor)) shifted PairImp(F);
+ n
+enddef;
+\end{mpcode}
+
+\begin{colourband}
+ \macro|ParaboleFD(«f»,«d»)|\return{\typeGDD{chemin}}
+ \begin{description}
+ \item[\meta{f}:] est le foyer (\typeGDD{point}) de la parabole;
+ \item[\meta{d}:] est la directrice (\typeGDD{droite}) de la parabole.
+ \end{description}
+ \index{ParaboleFD@\lstinline+ParaboleFD+}
+\end{colourband}
+
+Lors de la représentation d'une parabole, le caractère \emph{infini} est géré
+par la variable globale \lstinline+gddC2Dparam+ qui vaut 15 par défaut.
+
+\subsubsection{Fonctions associées}
+
+
+On obtient l'excentricité, souvent notée $e$, avec la commande suivante.
+
+\begin{colourband}
+\macro|Excentricite(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse}, \typeGDD{parabole} ou \typeGDD{hyperbole}.
+\end{description}\index{Excentricite@\lstinline+Excentricite+}
+\end{colourband}
+\bigskip
+
+
+Pour obtenir l'inclinaison (coefficient directeur de la droite axe de symétrie
+de la parabole), on utilisera la commande suivante:
+
+\begin{colourband}
+\macro|Inclinaison(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse}, \typeGDD{parabole} ou \typeGDD{hyperbole}.
+\end{description}\index{Inclinaison@\lstinline+Inclinaison+}
+\end{colourband}
+\bigskip
+
+On peut obtenir le sommet de la parabole avec la commande suivante:
+
+\begin{colourband}
+\macro|Sommet(«a»,«n»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{parabole} ou \typeGDD{hyperbole} ;
+ \item[\meta{n}:] 1 ou 2 (\typeMP{numeric}), argument utile pour l'hyperbole
+ qui possède deux sommets. Ici, peu importe la valeur de \meta{n}, l'unique
+ sommet sera donné.
+\end{description}\index{Sommet@\lstinline+Sommet+}
+\end{colourband}
+\bigskip
+
+On peut obtenir la directrice de la parabole avec la commande suivante:
+
+\begin{colourband}
+\macro|Directrice(«a»,«n»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{parabole} ou \typeGDD{hyperbole} ;
+ \item[\meta{n}:] 1 ou 2 (\typeMP{numeric}), argument utile pour l'hyperbole
+ qui possède deux directrices. Ici, peu importe la valeur de \meta{n},
+ l'unique directrice sera donnée.
+\end{description}\index{Directrice@\lstinline+Directrice+}
+\end{colourband}
+\bigskip
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(0,0);
+B = Point(3,2);
+AB = Droite(A,B);
+F = Point(-1,1);
+Para = ParaboleFD(F,AB);
+trace AB;
+trace Para;
+pointe Sommet(Para,1);
+pointe F;
+Fenetre(-4,-5,2,5);
+endfig;
+\end{ExempleMP}
+
+
+\subsection{Le type \typeGDD{hyperbole}}
+
+Le constructeur de base de l'hyperbole définit cet objet à partir du foyer et
+de la directrice.
+
+Le code du constructeur est le suivant:
+\begin{mpcode}
+vardef HyperboleFD(expr F,D,e) =
+ % F : foyer (point)
+ % D : directrice (droite)
+ % e : exentricité (numeric)
+ % pm : +1 ou -1 pour les deux branches
+ save u, v, w, d, i, n,_tmp,slope,aa,bb;
+ pair _tmp;
+ n = incr gddO;
+
+ (u,v,w) = EquationDroite(D);
+ d := u * gddA[F] + v * gddB[F] + w;
+ gddT[n] := "hyperbole";
+
+ % sommets
+ _tmp := -(d+1*sqrt(e*e*d*d))/(e*e-1)*(u,v)shifted (ProduitScalaire(F,Vecteur(v,-u))*(v,-u));
+ gddB[n] := PointImp(_tmp);
+ _tmp := -(d-1*sqrt(e*e*d*d))/(e*e-1)*(u,v)shifted
+ (ProduitScalaire(F,Vecteur(v,-u))*(v,-u));
+ gddC[n] := PointImp(_tmp);
+ % centre comme milieu des deux sommets
+ gddA[n] = Milieu(gddB[n],gddC[n]);
+ % le foyer (doublé pour compatibilité)
+ gddD[n] := F;
+ gddE[n] := RotationCentre(F, gddA[n], Pi);
+ gddX[n][3] := e; % excentricité
+ % directrices
+ gddX[n][1] := D; % on stocke la directrice
+ gddX[n][2] := Droite(RotationCentre(gddA[D], gddA[n], Pi),RotationCentre(gddB[D], gddA[n], Pi));
+ % angle de l'axe
+ slope = angle(PairImp(gddA[D])-PairImp(gddB[D]))+90;
+ gddX[n][4] = slope;
+ % cercle principale
+ gddX[n][5] = CercleD(gddB[n],gddC[n]);
+ % asymptotes
+ aa = IntersectionDroiteCercle(D,gddX[n][5],1);
+ bb = IntersectionDroiteCercle(D,gddX[n][5],2);
+ gddX[n][6] = Droite(gddA[n],aa);
+ gddX[n][7] = Droite(gddA[n],bb);
+ % tracés des moitiés
+ i := -gddC2Dparam-1;
+ gddPX[n][1] := (
+ (
+ (i*(v,-u)-(d+sqrt(e*e*d*d+i*i*(e*e-1)))/(e*e-1)*(u,v))
+ for i:= -gddC2Dparam upto gddC2Dparam:
+ ..(i*(v,-u)-(d+sqrt(e*e*d*d+i*i*(e*e-1)))/(e*e-1)*(u,v))
+ endfor
+ ) shifted (ProduitScalaire(F,Vecteur(v,-u))*(v,-u))
+ );
+ gddPX[n][2] := (
+ (
+ (i*(v,-u)-(d-sqrt(e*e*d*d+i*i*(e*e-1)))/(e*e-1)*(u,v))
+ for i:= -gddC2Dparam upto gddC2Dparam:
+ ..(i*(v,-u)-(d-sqrt(e*e*d*d+i*i*(e*e-1)))/(e*e-1)*(u,v))
+ endfor
+ ) shifted (ProduitScalaire(F,Vecteur(v,-u))*(v,-u))
+ );
+ n
+enddef;
+\end{mpcode}
+
+On peut voir dans ce constructeur l'utilisation de la table de \typeMP{path}
+étendu \variableGDD{gddPX[][]} qui permet d'associer plusieurs \typeMP{path}s à
+un seul objet.
+
+\begin{colourband}
+ \macro|HyperboleFD(«f»,«d»,«e»)|\return{\typeGDD{chemin}}
+ \begin{description}
+ \item[\meta{f}:] est le foyer (\typeGDD{point}) de la parabole;
+ \item[\meta{d}:] est la directrice (\typeGDD{droite}) de la parabole;
+ \item[\meta{e}:] est l'excentricité de l'hyperbole.
+ \end{description}
+ \index{HyperboleFD@\lstinline+HyperboleFD+}
+\end{colourband}
+
+\subsubsection{Fonctions associées}
+
+On pourra obtenir le centre (\typeGDD{point}) d'une hyperbole avec la commande :
+\begin{colourband}
+ \macro|Centre(«a»)|\return{\typeGDD{point}}
+ \begin{description}
+ \item[\meta{a}:] \typeGDD{cercle}, \typeGDD{ellipse} ou \typeGDD{hyperbole}.
+ \end{description}\index{Centre@\lstinline+Centre+}
+\end{colourband}
+
+
+On obtient l'excentricité, souvent notée $e$, avec la commande suivante.
+
+\begin{colourband}
+\macro|Excentricite(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse}, \typeGDD{parabole} ou \typeGDD{hyperbole}.
+\end{description}\index{Excentricite@\lstinline+Excentricite+}
+\end{colourband}
+\bigskip
+
+
+Pour obtenir l'inclinaison (coefficient directeur de la droite passant par les
+foyers de l'hyperbole), on utilisera la commande suivante.
+
+\begin{colourband}
+\macro|Inclinaison(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{ellipse}, \typeGDD{parabole} ou \typeGDD{hyperbole}.
+\end{description}\index{Inclinaison@\lstinline+Inclinaison+}
+\end{colourband}
+\bigskip
+
+On peut obtenir les sommets de l'hyperbole avec la commande suivante:
+
+\begin{colourband}
+\macro|Sommet(«a»,«n»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{parabole} ou \typeGDD{hyperbole} ;
+ \item[\meta{n}:] 1 ou 2 (\typeMP{numeric}), pour choisir l'un des deux sommets.
+\end{description}\index{Sommet@\lstinline+Sommet+}
+\end{colourband}
+\bigskip
+
+On peut obtenir les directrices de l'hyperbole avec la commande suivante:
+
+\begin{colourband}
+\macro|Directrice(«a»,«n»)|\return{\typeGDD{droite}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{parabole} ou \typeGDD{hyperbole} ;
+ \item[\meta{n}:] 1 ou 2 (\typeMP{numeric}), pour choisir l'une des deux
+ directrices.
+\end{description}\index{Directrice@\lstinline+Directrice+}
+\end{colourband}
+\bigskip
+
+Pour obtenir le \emph{cercle principal} de l'hyperbole, on pourra utiliser la
+commande suivante:
+
+
+\begin{colourband}
+ \macro|CerclePrincipale(«h»)|\return{\typeGDD{cercle}}
+ \begin{description}
+ \item[\meta{h}:] \typeGDD{hyperbole}.
+ \end{description}\index{CerclePrincipale@\lstinline+CerclePrincipale+}
+\end{colourband}
+\bigskip
+
+On pourra aussi obtenir les deux asymptotes de l'hyperbole avec la commande
+suivante:
+
+\begin{colourband}
+ \macro|AsymptoteHyperbole(«h»,«n»)|\return{\typeGDD{droite}}
+ \begin{description}
+ \item[\meta{h}:] \typeGDD{hyperbole} ;
+ \item[\meta{n}:] 1 ou 2 (\typeMP{numeric}), pour choisir l'une des deux
+ asymptotes.
+ \end{description}\index{AsymptoteHyperbole@\lstinline+AsymptoteHyperbole+}
+\end{colourband}
+\bigskip
+
+Parce qu'une hyperbole est constituée de deux parties disjointes, on ne peut
+pas, comme pour les autres objets \mpgeomdd, utiliser directement la commande
+\lstinline+trace+ directement sur l'objet. Il faudra utiliser la commande
+suivante pour obtenir le \typeMP{path} associé à une des deux parties de
+l'hyperbole.
+
+\begin{colourband}
+ \macro|DemiHyperbole(«h»,«n»)|\return{\typeGDD{path}}
+ \begin{description}
+ \item[\meta{h}:] \typeGDD{hyperbole} ;
+ \item[\meta{n}:] 1 ou 2 (\typeMP{numeric}), pour choisir l'une des deux
+ parties.
+ \end{description}\index{DemiHyperbole@\lstinline+DemiHyperbole+}
+\end{colourband}
+\bigskip
+
+
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(0,0);
+B = Point(3,2);
+AB = Droite(A,B);
+F = Point(-1,1);
+Hyper = HyperboleFD(F,AB,1.5);
+trace AB;
+trace DemiHyperbole(Hyper,1);
+trace DemiHyperbole(Hyper,2);
+trace Directrice(Hyper,2);
+trace CerclePrincipale(Hyper) dashed evenly;
+trace AsymptoteHyperbole(Hyper,1) dashed evenly;
+trace AsymptoteHyperbole(Hyper,2) dashed evenly;
+pointe Centre(Hyper);
+pointe Foyer(Hyper,1);
+pointe Foyer(Hyper,2);
+pointe Sommet(Hyper,1);
+pointe Sommet(Hyper,2);
+Fenetre(-3,-5,3,5);
+endfig;
+\end{ExempleMP}
+
+
+\subsection{Le type \typeGDD{triangle}}
+
+Les triangles sont définis par trois
+points de $\R^2$.
+
+\subsubsection{Constructeur}
+La fonction créatrice de cet objet est la suivante
+\begin{mpcode}
+vardef Triangle (expr a,b,c) =
+ save n; n = incr gddO; gddT[n] = "triangle";
+ gddA[n] = PointImp(a); gddB[n] = PointImp(b); gddC[n] = PointImp(c); n
+enddef;
+\end{mpcode}
+
+\begin{colourband}
+\macro|Triangle(«a»,«b»,«c»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{point} ;
+ \item[\meta{b}:] \typeGDD{point} ;
+ \item[\meta{c}:] \typeGDD{point}.
+\end{description}\index{Triangle@\lstinline+Triangle+}
+\end{colourband}
+
+
+\bigskip
+
+Ici, on voit l'appel à la troisième table \variableGDD{gddC} pour stocker le
+troisième point.
+
+Un triangle se définit alors comme ceci:
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(3,1);
+B = Point(1,3);
+C = Point(0,0);
+ABC = Triangle(A,B,C);
+trace ABC;
+endfig;
+\end{ExempleMP}
+
+\subsubsection{Macros associées}
+
+La macro suivante permet de calculer l'aire d'un triangle.
+\begin{colourband}
+\macro|AireTriangle(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{triangle}.
+\end{description}\index{AireTriangle@\lstinline+AireTriangle+}
+\end{colourband}
+
+On peut calculer aussi l'orthocentre d'un triangle avec la commande suivante.
+\begin{colourband}
+\macro|Orthocentre(«a»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{triangle}.
+\end{description}\index{Orthocentre@\lstinline+Orthocentre+}
+\end{colourband}
+
+La macro suivante calcule le cercle inscrit d'un triangle.
+\begin{colourband}
+\macro|CercleInscrit(«a»)|\return{\typeGDD{cercle}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{triangle}.
+\end{description}\index{CercleInscrit@\lstinline+CercleInscrit+}
+\end{colourband}
+
+On peut aussi obtenir le cercle circonscrit avec la macro suivante.
+\begin{colourband}
+\macro|CercleCirconscrit(«a»)|\return{\typeGDD{cercle}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{triangle}.
+\end{description}\index{CercleCirconscrit@\lstinline+CercleCirconscrit+}
+\end{colourband}
+
+On peut aussi calculer les cercles exinscrits. Soient $A$, $B$ et $C$ trois points
+définissant un triangle $ABC$\footnote{Évidemment, les points peuvent s'appeler
+autrement.}. La commande suivante permet d'obtenir, au choix, un des trois
+cercles exinscrits.
+\begin{colourband}
+\macro|CercleExinscrit(«a»,«n»)|\return{\typeGDD{cercle}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{triangle} ;
+ \item[\meta{n}:] \typeMP{numeric} qui vaut 1, 2 ou 3. Si \meta{n}$=1$, c'est
+ le cercle exinscrit tangent au côté $[BC]$ du triangle, si \meta{n}$=2$, c'est
+ celui tangent au côté $[AC]$ et si \meta{n}$=3$, c'est celui tangent au côté $[AB]$.
+\end{description}\index{CercleExinscrit@\lstinline+CercleExinscrit+}
+\end{colourband}
+
+On peut aussi obtenir le cercle d'Euler d'un triangle avec la commande suivante.
+\begin{colourband}
+\macro|CercleEuler(«a»)|\return{\typeGDD{cercle}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{triangle}.
+\end{description}\index{CercleEuler@\lstinline+CercleEuler+}
+\end{colourband}
+
+Voici un exemple d'illustration des quelques unes des macros relatives aux
+triangles.
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(3,1);
+B = Point(1,3);
+C = Point(0,0);
+AB = Droite(A,B);
+BC = Droite(B,C);
+ABC = Triangle(A,B,C);
+trace AB dashed evenly;
+trace BC dashed evenly;
+trace ABC avecCrayon(1.5,black);
+Euler = CercleEuler(ABC);
+trace Euler avecCrayon(1,DarkRed);
+C_E1 = CercleExinscrit(ABC,2);
+trace C_E1 avecCrayon(1,LightBlue);
+C_C = CercleCirconscrit(ABC);
+trace C_C avecCrayon(1,LightCoral);
+Fenetre(-1,-4,4,4);
+endfig;
+\end{ExempleMP}
+
+\subsection{Le type \typeGDD{polygone}}
+Les triangles sont définis par $N$
+points de $\R^2$.
+
+\subsubsection{Constructeurs}
+
+La fonction créatrice de cet objet est la suivante
+\begin{mpcode}
+vardef Polygone (text plist) =
+ save n,_point,i; n = incr gddO; gddT[n] = "polygone";
+ i:=1;
+ for _point = plist:
+ gddX[gddO][i] = PointImp(_point);
+ i:=i+1;
+ endfor
+ gddA[n] = i-1; % nombre de côté
+ gddB[n] = IsoBarycentre(plist); % centre
+ n
+enddef;
+\end{mpcode}
+
+\begin{colourband}
+\macro|Polygone(«liste»)|\return{\typeGDD{polygone}}
+\begin{description}
+ \item[\meta{liste}:] est une liste de \typeGDD{point} ou de \typeMP{pair}.
+\end{description}\index{Polygone@\lstinline+Polygone+}
+\end{colourband}
+
+
+\bigskip
+
+Ici, on voit l'appel à la \emph{double} table \variableGDD{gddX} pour stocker
+les $N$ points.
+
+Un polygone se définit alors comme ceci:
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(2,0);
+B = Point(3,1);
+C = Point(0,2);
+D = Point(0,0);
+P = Polygone(A,B,C,D);
+trace P;
+endfig;
+\end{ExempleMP}
+
+On pourra aussi construire des polygones réguliers avec la commande suivante.
+\begin{colourband}
+\macro|PolygoneRegulier(«N»,«rayon»,«rotation»,«translation»)|\return{\typeGDD{polygone}}
+\begin{description}
+ \item[\meta{N}:] entier (\typeMP{numeric}) indiquant le nombre de points ;
+ \item[\meta{rayon}:] \typeMP{numeric}, rayon du cercle circonscrit ;
+ \item[\meta{rotation}:] \typeMP{numeric}, rotation du polygone ;
+ \item[\meta{translation}:] \typeGDD(point) ou \typeGDD{vecteur} (ou même
+ \typeMP{pair}), déplacement du centre du polygone.
+\end{description}\index{PolygoneRegulier@\lstinline+PolygoneRegulier+}
+\end{colourband}
+
+\begin{ExempleMP}
+ input geom2d;
+ beginfig(1);
+ P = PolygoneRegulier(7,3,0,origine);
+ trace P;
+ endfig;
+ \end{ExempleMP}
+
+\subsubsection{Macros associées}
+
+On pourra obtenir le nombre de côté d'un polygone avec la commande suivante.
+
+\begin{colourband}
+\macro|NombreCotesPolygone(«a»)|\return{\typeMP{numeric}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{polygone}.
+\end{description}\index{NombreCotesPolygone@\lstinline+NombreCotesPolygone+}
+\end{colourband}
+\bigskip
+
+On pourra avoir accès aux différents sommets du polygone, numérotés à partir de
+1, avec la macro suivante.
+
+\begin{colourband}
+\macro|PointPolygone(«a»,«i»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{a}:] \typeGDD{polygone} ;
+ \item[\meta{i}:] \typeMP{numeric}, entier plus grand que 1, permettant
+ d'accéder au $i$\ieme{} point du polygone.
+\end{description}\index{PointPolygone@\lstinline+PointPolygone+}
+\end{colourband}
+ \bigskip
+
+\subsection{Le type \typeGDD{chemin}} Pour ce type particulier, \mpgeomdd stocke
+le \typeMP{path} dans la table \variableGDD{gddP} réservée. Ainsi la fonction
+créatrice de ce type d'objet est la suivante
+\begin{mpcode}
+vardef Chemin (expr p) =
+gddT[incr gddO] = "chemin"; gddP[gddO] = p; gddO
+enddef;
+\end{mpcode}
+\begin{colourband}
+\macro|Chemin(«p»)|\return{\typeGDD{chemin}}
+\begin{description}
+ \item[\meta{p}:] un \typeMP{path} de \MP
+\end{description}\index{Chemin@\lstinline+Chemin+}
+\end{colourband}
+
+
+\subsubsection{Macros associées}
+
+La macro suivante contruit, à partir d'une liste de \typeGDD{point}s, une ligne
+brisée de type \typeGDD{chemin}.
+
+\begin{colourband}
+ \macro|LigneBrisee(«liste»)|\return{\typeGDD{chemin}}
+ \begin{description}
+ \item[\meta{liste}:] est une liste de \typeGDD{point} ou de \typeMP{pair}.
+ \end{description}\index{LigneBrisee@\lstinline+LigneBrisee+}
+\end{colourband}
+
+
+\subsection{Le type \typeGDD{courbe}}
+
+Pour ce type particulier, \mpgeomdd stocke
+une chaine de caractère (un nom de fichier à exploiter avec l'extension
+\fichier{graph.mp}) dans la table \variableGDD{gddS} réservée.
+
+\subsubsection{Constructeur}
+
+Ainsi la fonction
+créatrice de ce type d'objet est la suivante
+\begin{mpcode}
+vardef CourbeDat (expr s) =
+ gddT[incr gddO] = "courbe"; gddS[gddO] = s; gddO
+enddef;
+\end{mpcode}
+\begin{colourband}
+\macro|CourbeDat(«s»)|\return{\typeGDD{courbe}}
+\begin{description}
+ \item[\meta{s}:] un nom de fichier sous forme de \typeMP{string} de \MP
+\end{description}\index{CourbeDat@\lstinline+CourbeDat+}
+\end{colourband}
+
+\bigskip
+
+\section{Arc de cercle}
+
+Avec \mpgeomdd{}, quelques commandes permettent de travailler avec les arcs de
+cercle. Tout d'abord, on peut décider de ne représenter qu'un arc de cercle d'un
+\typeGDD{cercle} précédemment défini. Ceci se fait avec la commande suivante qui
+prend en argument un \typeGDD{cercle} et deux angles en radian, et retourne un
+\typeMP{path} de \MP{} correspondant à l'arc de cercle compris entre les deux
+angles donnés (l'angle 0 étant parallèle à l'axe $Ox$).
+
+\begin{colourband}
+\macro|gddTraceArcDeCercle(«C»,«a»,«b»)|\return{\typeMP{path}}
+\begin{description}
+ \item[\meta{C}:] \typeGDD{cercle} dont on souhaite représenter un arc ;
+ \item[\meta{a}:] premier angle en radian (\typeMP{numeric}) ;
+ \item[\meta{b}:] deuxième angle en radian (\typeMP{numeric}).
+\end{description}\index{gddTraceArcDeCercle@\lstinline+gddTraceArcDeCercle+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+C = Cercle(origine,2);
+trace C;
+trace gddTraceArcDeCercle(C,Pi/3,Pi) avecCrayon(2,DarkRed);
+endfig;
+\end{ExempleMP}
+
+On peut aussi définir un objet \typeGDD{chemin}. Pour cela on pourra utiliser
+les deux commandes suivantes. La première permet de définir un arc de cercle à
+partir d'un point, d'un rayon et de deux angles.
+
+\begin{colourband}
+\macro|Arc(«P»,«r»,«a»,«b»)|\return{\typeGDD{chemin}}
+\begin{description}
+ \item[\meta{P}:] \typeGDD{point} ou \typeMP{pair} centre de l'arc de cercle ;
+ \item[\meta{r}:] rayon de l'arc de cercle (\typeMP{numeric}) ;
+ \item[\meta{a}:] premier angle en radian (\typeMP{numeric}) ;
+ \item[\meta{b}:] premier angle en radian (\typeMP{numeric}).
+\end{description}\index{Arc@\lstinline+Arc+}
+\end{colourband}
+
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(2,2);
+Ac = Arc(A,2,Pi/3,Pi);
+pointe A;
+trace Ac;
+endfig;
+\end{ExempleMP}
+
+La deuxième commande définissant un \typeGDD{chemin} est la suivante. Elle prend
+comme arguments trois points, notons les $C$, $A$ et $B$ : le centre de l'arc de
+cercle $C$, et les points $A$ et $B$. Elle prend ensuite comme argument le rayon
+de l'arc défini entre les segments $[C,A]$ et $[C,B]$.
+
+\begin{colourband}
+\macro|ArcEntrePoints(«P»,«r»,«A»,«B»,«s»)|\return{\typeGDD{chemin}}
+\begin{description}
+ \item[\meta{P}:] \typeGDD{point} ou \typeMP{pair} centre de l'arc de cercle ;
+ \item[\meta{r}:] rayon de l'arc de cercle (\typeMP{numeric}) ;
+ \item[\meta{A}:] premier \typeGDD{point} ou \typeMP{pair} ;
+ \item[\meta{B}:] deuxième \typeGDD{point} ou \typeMP{pair} ;
+ \item[\meta{s}:] \typeMP{numeric}, $-1$ ou $1$ suivant le sens choisi.
+\end{description}\index{Arc@\lstinline+Arc+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+C = Point(0,0);
+A = Point(2,2);
+B = Point(0,3);
+Cab = ArcEntrePoints(C,1,A,B,1);
+Cba = ArcEntrePoints(C,1,A,B,-1);
+trace Segment(C,A);
+trace Segment(C,B);
+pointe A; pointe B; pointe C;
+fleche Cab;
+fleche Cba avecCrayon(1,DarkRed);
+endfig;
+\end{ExempleMP}
+
+
+\section{Quelques transformations}
+
+\subsection{Homothétie}
+
+On peut réaliser une homothétie sur n'importe quel objet \mpgeomdd avec la commande
+suivante.
+
+\begin{colourband}
+\macro|Homothetie(«p»,«o»,«k»)|\return{du même type que \meta{p}}
+\begin{description}
+ \item[\meta{p}:] un objet \mpgeomdd ;
+ \item[\meta{o}:] \typeGDD{point} ou \typeMP{pair}, centre de l'homothétie ;
+ \item[\meta{k}:] \typeMP{numeric}, facteur de l'homothétie.
+\end{description}\index{Homothetie@\lstinline+Homothetie+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,2);
+B = Point(0,2);
+C_B = Cercle(B,1);
+T = Triangle((1,1),(0,0),(0,1));
+C_H = Homothetie(C_B, A, 2);
+T_H = Homothetie(T, A ,-1);
+trace C_B; trace C_H;
+trace T; trace T_H;
+pointe A; pointe B;
+endfig;
+\end{ExempleMP}
+
+\subsection{Symétrie axiale}
+
+On peut réaliser une symétrie axiale sur n'importe quel objet \mpgeomdd avec la
+commande suivante.
+
+\begin{colourband}
+\macro|SymetrieAxiale(«p»,«d»)|\return{du même type que \meta{p}}
+\begin{description}
+ \item[\meta{p}:] un objet \mpgeomdd ;
+ \item[\meta{d}:] \typeGDD{droite} définissant l'axe de symétrie.
+\end{description}\index{SymetrieAxiale@\lstinline+SymetrieAxiale+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,2);
+B = Point(0,2);
+C_B = Cercle(B,1);
+T = Triangle((1,1),(0,0),(0,1));
+D = Droite((-1,0),(3,-1));
+C_H = SymetrieAxiale(C_B, D);
+T_H = SymetrieAxiale(T, D);
+trace C_B; trace C_H;
+trace T; trace T_H;
+trace D;
+pointe A; pointe B;
+Fenetre(-2.5,-3.5,3,3.2);
+endfig;
+\end{ExempleMP}
+
+\subsection{Symétrie centrale}
+
+On peut réaliser une symétrie centrale sur n'importe quel objet \mpgeomdd avec la
+commande suivante.
+
+\begin{colourband}
+\macro|SymetrieCentrale(«p»,«d»)|\return{du même type que \meta{p}}
+\begin{description}
+ \item[\meta{p}:] un objet \mpgeomdd ;
+ \item[\meta{d}:] \typeGDD{point} définissant le centre de symétrie.
+\end{description}\index{SymetrieCentrale@\lstinline+SymetrieCentrale+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,2);
+B = Point(0,2);
+C_B = Cercle(B,1);
+T = Triangle((1,1),(0,0),(0,1));
+D = Point(-1,0);
+C_H = SymetrieCentrale(C_B, D);
+T_H = SymetrieCentrale(T, D);
+trace C_B; trace C_H;
+trace T; trace T_H;
+pointe D;
+pointe A; pointe B;
+Fenetre(-3.5,-3.5,3,3.2);
+endfig;
+\end{ExempleMP}
+
+\subsection{Inversion}
+
+On peut calculer l'inversion d'un point, d'un cercle ou d'une droite par rapport à un cercle avec la macro
+suivante.
+\begin{colourband}
+\macro|Inversion(«p»,«c»)|\return{\typeGDD{point}}
+\begin{description}
+ \item[\meta{p}:] \typeGDD{point}, \typeGDD{cercle} ou \typeGDD{droite} ;
+ \item[\meta{c}:] \typeGDD{cercle}.
+\end{description}\index{Inversion@\lstinline+Inversion+}
+\end{colourband}
+\bigskip
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+ A = Point(2,2);
+ C = Cercle(A,2);
+ trace C;
+ marque.rt "A";
+ B = Point(-0.5,1);
+ D = Inversion(B,C);
+ drawoptions(withcolor DarkRed);
+ marque.rt "B"; marque.rt "D";
+
+ drawoptions(withcolor DarkBlue);
+ E = Point(3,1);
+ CE = Cercle(E,0.5);
+ trace CE;
+ marque.rt "E";
+ iCE = Inversion(CE,C);
+ trace iCE;
+
+
+ drawoptions(withcolor DarkGreen);
+ d = Droite((3,3),(4,2));
+ trace d;
+ Cd = Inversion(d,C);
+ trace Cd;
+ Fenetre(-1,-1,5.5,6);
+endfig;
+\end{ExempleMP}
+
+
+\section{Annotations et labels}
+
+\subsection{Signes}
+
+\mpgeomdd fournit la macro suivante pour marquer un angle droit formé par trois
+points:
+\begin{colourband}
+\macro|SigneOrtho(«a»,«b»,«c»,«x»)|
+\begin{description}
+ \item[\meta{a},\meta{b},\meta{c}:] sont les trois \typeGDD{point}s formant
+ l'angle droit $\widehat{ABC}$ ;
+ \item[\meta{x}:] est la \og{}taille\fg{} (\typeMP{numeric}) du signe d'orthogonalité.
+\end{description}\index{SigneOrtho@\lstinline+SigneOrtho+}
+\end{colourband}
+
+On peut aussi réaliser des marques entre deux points ou sur un segment, un
+vecteur, ou tout type d'objet. Pour cela, la première macro est la suivante:
+\begin{colourband}
+\macro|Marque(«a»,«b»,«n»)|
+\begin{description}
+ \item[\meta{a}:] premier \typeGDD{point} formant
+ le segment à marquer;
+ \item[\meta{b}:] deuxième \typeGDD{point} formant
+ le segment à marquer;
+ \item[\meta{n}:] est le type (\typeMP{numeric}) de marque, il y en a quatre
+ \meta{n}$=1$, $2$, $3$ ou $4$.
+\end{description}\index{Marque@\lstinline+Marque+}
+\end{colourband}
+
+On peut aussi marquer n'importe quel type de trait avec la macro suivante:
+\begin{colourband}
+\macro|MarqueTrait(«a»,«n»)|
+\begin{description}
+ \item[\meta{a}:] est n'importe quel objet \mpgeomdd ou même un \typeMP{path} \MP;
+ \item[\meta{n}:] est le type (\typeMP{numeric}) de marque, il y en a quatre
+ \meta{n}$=1$, $2$, $3$ ou $4$.
+\end{description}\index{MarqueTrait@\lstinline+MarqueTrait+}
+\end{colourband}
+
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(4,0);
+B = Point(0,0);
+C = Point(0,2);
+trace Segment(B,A);
+trace Segment(B,C);
+marque.bot "A";
+marque.bot "B";
+marque.lft "C";
+trace SigneOrtho(A,B,C,0.5);
+trace Marque(A,B,1);
+trace MarqueTrait(Segment(B,C),3);
+endfig;
+\end{ExempleMP}
+
+
+\subsection{Labels}
+
+Comme le code produit avec \mpgeomdd est un code \MP{}\cite{ctan-metapost}, on peut utiliser les outils
+classiques de labélisation. Cependant, pour permettre plus de flexibilité (et
+notamment une compatibilité avec \hologo{LuaLaTeX} et
+\package{luamplib}~\cite{ctan-luamplib} ou
+\package{minim-mp}~\cite{ctan-minim-mp}), si le code est compilé avec \MP{},
+alors le package~\package{latexmp}~\cite{ctan-latexmp} est chargé et fournit la
+commande \lstinline+textext()+.
+
+De plus, \mpgeomdd fournit quelques commandes pour se faciliter la vie.
+
+On peut marquer les points avec la commande suivante. Cette commande
+\emph{pointe} le point (avec la commande \lstinline+pointe+, voir
+section~\ref{sec:trace}) et inscrit un label.
+\begin{colourband}
+\macro|marque.«place» "«nom»"|
+\begin{description}
+ \item[\meta{place}:] peut être les classiques placement de \MP{} :
+ \lstinline+top+, \lstinline+bot+, \lstinline+rt+,
+ \lstinline+lft+,+\lstinline+urt+, \lstinline+ulft+, \lstinline+lrt+, \lstinline+llft+.
+ \item[\meta{nom}:] entre double quote, doit être un nom de variable de
+ point. Le nom sera composé en mode mathématique (entre \lstinline+$+). Si le
+ nom contient un \lstinline+_+, tout ce qui sera après sera mis en
+ indice (ex. \lstinline+A_be+ deviendra $A_{be}$). Si le nom est
+ \lstinline+alpha+, \lstinline+beta+, \lstinline+gamma+ ou \lstinline+delta+,
+ alors le résultat donnera la lettre grecque composée en mode mathématique.
+\end{description}\index{marque@\lstinline+marque+}
+\end{colourband}
+
+
+\mpgeomdd fournit aussi une adaptation au classique \lstinline+label+ de \MP{}.
+
+\begin{colourband}
+\macro|gddLabel.«place»(«materiel»,«point»)|
+\begin{description}
+ \item[\meta{place}:] peut être les classiques placement de \MP{} :
+ \lstinline+top+, \lstinline+bot+, \lstinline+rt+,
+ \lstinline+lft+,+\lstinline+urt+, \lstinline+ulft+, \lstinline+lrt+, \lstinline+llft+.
+ \item[\meta{materiel}:] classiquement ce qu'on donne à \lstinline+label+, une
+ chaîne de caractères, ou une \typeMP{picture} (qui peut-être produite par
+ exemple avec \lstinline+btex ... etex+ ou, puisque \package{latexmp} est
+ chargé par \mpgeomdd, \lstinline+textext()+).
+ \item[\meta{point}:] doit être un \typeGDD{point} de \mpgeomdd.
+\end{description}\index{gddLabel@\lstinline+gddLabel+}
+\end{colourband}
+
+On peut aussi étiquetter un \typeGDD{chemin}, une \typeGDD{courbe} ou un
+\typeMP{path} avec la macro suivante:
+
+\begin{colourband}
+\macro|EtiquetteChemin.«place»(«materiel»,«chemin»,«position»)|
+\begin{description}
+ \item[\meta{place}:] peut être les classiques placement de \MP{} :
+ \lstinline+top+, \lstinline+bot+, \lstinline+rt+,
+ \lstinline+lft+,+\lstinline+urt+, \lstinline+ulft+, \lstinline+lrt+, \lstinline+llft+.
+ \item[\meta{materiel}:] classiquement ce qu'on donne à \lstinline+label+, une
+ chaîne de caractères, ou une \typeMP{picture} (qui peut-être produite par
+ exemple avec \lstinline+btex ... etex+ ou, puisque \package{latexmp} est
+ chargé par \mpgeomdd, \lstinline+textext()+).
+ \item[\meta{chemin}:] doit être un \typeGDD{chemin}, une \typeGDD{courbe}, ou
+ un \typeMP{path}.
+\end{description}\index{EtiquetteChemin@\lstinline+EtiquetteChemin+}
+\end{colourband}
+
+
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(0,0);
+B_23 = Point(3,3);
+alpha = Point(0,2);
+trace Segment(A,B_23);
+C = Milieu(A,B_23);
+pointe C;
+gddLabel.top(textext("Milieu"),C);
+marque.top "A";
+marque.urt "B_23";
+marque.llft "alpha";
+P = Chemin(Pt(A)..Pt(alpha)..Pt(B_23));
+trace P;
+EtiquetteChemin.top("Test",P,0.6);
+endfig;
+\end{ExempleMP}
+
+
+\section{Repère}
+
+\mpgeomdd fournit un ensemble de commandes permettant de faciliter le dessin de
+repère.
+
+La commande principale est la définition du repère, c'est-à-dire la boîte dans
+laquelle le dessin sera représenté.
+\begin{colourband}
+ \macro|Repere(«l»,«h»,«ox»,«oy»,«ux»,«uy»)|
+ \begin{description}
+ \item[\meta{l}:] \typeMP{numeric}, largeur du repère (en unité \lstinline+gddU+) ;
+ \item[\meta{h}:] \typeMP{numeric}, hauteur du repère (en unité \lstinline+gddU+) ;
+ \item[\meta{ox}:] \typeMP{numeric}, distance (en unité \lstinline+gddU+) de
+ l'origine (\typeGDD{point} $(0,0)$) par rapport au bord gauche ;
+ \item[\meta{oy}:] \typeMP{numeric}, distance (en unité \lstinline+gddU+) de
+ l'origine (\typeGDD{point} $(0,0)$) par rapport au bord bas ;
+ \item[\meta{ux}:] \typeMP{numeric}, unité de l'axe $(Ox)$ (en unité \lstinline+gddU+) ;
+ \item[\meta{uy}:] \typeMP{numeric}, unité de l'axe $(Oy)$ (en unité \lstinline+gddU+).
+ \end{description}\index{Repere@\lstinline+Repere+}
+\end{colourband}
+
+Ce commande ne retourne, ni ne trace rien. Elle sert à spécifier quelques
+variables internes de définition du dessin. Elle modifie d'ailleurs le
+comportement de la macro \lstinline+gddEnPlace+ (voir
+page~\pageref{gddEnPlace}). Noter que cette commande impose le fait que
+l'origine (c'est-à-dire le \typeGDD{point} $(0,0)$) soit à l'intérieur du
+repère.
+
+Cette macro s'accompagne de deux autres, elles aussi \emph{silencieuses}, ne
+servant qu'à :
+\begin{itemize}
+\item sauvegarder la \typeMP{picture} courante ;
+\item construire une \typeMP{picture} avec le contenu se trouvant entre
+\lstinline+Debut+ et \lstinline+Fin+ ;
+\item rogner (avec \lstinline+clip+) la \typeMP{picture} aux cadre du repère
+construit ;
+\item ajouter la \typeMP{picture} courant à celle sauvegarder ;
+\item enfin rétablir le
+fonctionnement de \lstinline+gddEnPlace+ comme avant l'utilisation de
+\lstinline+Repere+.
+\end{itemize}
+
+Ces deux commandes sont appelées \lstinline+Debut+ et
+\lstinline+Fin+.
+
+\begin{colourband}
+\macro|Debut|
+\index{Debut@\lstinline+Debut+}
+\end{colourband}
+
+
+\begin{colourband}
+\macro|Fin|
+\index{Fin@\lstinline+Fin+}
+\end{colourband}
+
+Ainsi, il est très simple d'illustrer le fait qu'à un changement de base
+orthogonale prêt, un cercle est une ellipse.
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,1);
+CA = Cercle(A,2);
+Repere(5,5,1,1,1,0.5);
+Debut;
+trace CA;
+Fin;
+endfig;
+\end{ExempleMP}
+
+On dispose de deux commandes pour tracer les axes du repère. La première trace
+les axes passant par l'origine.
+\begin{colourband}
+\macro|Axes|\indication{trace un ensemble d'éléments sur le repère}
+\index{Axes@\lstinline+Axes+}
+\end{colourband}
+
+Cette commande inscrit aussi les labels des axes des abscisses et des ordonnées
+qui sont stockées dans les variables globales dédiées suivantes:
+\begin{colourband}
+\macro|gddXlabel|\indication{\typeMP{string}, valeur par défaut \lstinline+"$x$"+}
+\index{gddXlabel@\lstinline+gddXlabel+}
+\end{colourband}
+
+\begin{colourband}
+\macro|gddYlabel|\indication{\typeMP{string}, valeur par défaut \lstinline+"$y$"+}
+\index{gddYlabel@\lstinline+gddYlabel+}
+\end{colourband}
+
+Attention, ces commandes doivent s'utiliser avant l'appel à \lstinline+Debut+.
+
+L'exemple suivant permet d'illustrer le tracé des axes.
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,1);
+CA = Cercle(A,2);
+Repere(5,5,1,1,1,1);
+gddYlabel:="$z$";
+Axes;
+Debut;
+trace CA;
+Fin;
+endfig;
+\end{ExempleMP}
+
+On pourra aussi définir un repère en utilisant une syntaxe permettant de
+spécifier les abscisses et les ordonnées extrémales.
+
+\begin{colourband}
+ \macro|RepereMinMax(«xmin»,«xmax»,«ymin»,«ymax»,«ux»,«uy»)|
+ \begin{description}
+ \item[\meta{xmin}:] \typeMP{numeric}, abscisse minimum (en unité \lstinline+gddU+).
+ \item[\meta{xmax}:] \typeMP{numeric}, abscisse maximum (en unité \lstinline+gddU+).
+ \item[\meta{ymin}:] \typeMP{numeric}, ordonnée minimum (en unité \lstinline+gddU+).
+ \item[\meta{ymax}:] \typeMP{numeric}, ordonnée maximum (en unité \lstinline+gddU+).
+ \item[\meta{ux}:] \typeMP{numeric}, unité de l'axe $(Ox)$ (en unité \lstinline+gddU+).
+ \item[\meta{uy}:] \typeMP{numeric}, unité de l'axe $(Oy)$ (en unité \lstinline+gddU+).
+ \end{description}\index{RepereMinMax@\lstinline+RepereMinMax+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,1);
+CA = Cercle(A,2);
+RepereMinMax(-1,4,-1,4,1,1);
+Axes;
+Debut;
+trace CA;
+Fin;
+endfig;
+\end{ExempleMP}
+
+\mpgeomdd fournit aussi de quoi tracer les axes sur le bord du cadre avec la
+commande suivante.
+\begin{colourband}
+\macro|AxesBords|\indication{trace un ensemble d'éléments sur le repère}
+\index{AxesBords@\lstinline+AxesBords+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,1);
+CA = Cercle(A,2);
+RepereMinMax(-1,4,-1,4,1,1);
+AxesBords;
+Debut;
+trace CA;
+Fin;
+endfig;
+\end{ExempleMP}
+
+Les commandes suivantes permettent de graduer les axes (classiques ou sur le
+bord). Là encore, ce sont des commandes qui n'ont pas d'arguments ni ne
+retournent rien et qui tracent.
+
+\begin{colourband}
+\macro|Graduations|\indication{trace un ensemble d'éléments sur le repère}
+\index{Graduations@\lstinline+Graduations+}
+\end{colourband}
+
+
+\begin{colourband}
+\macro|GraduationsBords|\indication{trace un ensemble d'éléments sur le repère}
+\index{GraduationsBords@\lstinline+GraduationsBords+}
+\end{colourband}
+
+On utilisera la version en cohérence avec les axes choisis.
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,1);
+CA = Cercle(A,2);
+RepereMinMax(-1,4,-1,4,1,1);
+AxesBords;
+GraduationsBords;
+Debut;
+trace CA;
+Fin;
+endfig;
+\end{ExempleMP}
+
+Si on désire marquer les unités, \mpgeomdd{} propose la macro suivante (qui n'est
+utilisable que si l'on ne place pas les axes sur le bord).
+\begin{colourband}
+\macro|Unites(«unité»)|\indication{trace un ensemble d'éléments sur le repère}
+\begin{description}
+ \item[\meta{unité}:] \typeMP{numeric}, valeur à inscrire sur les deux axes.
+\end{description}
+\index{Unites@\lstinline+Unites+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,1);
+CA = Cercle(A,2);
+RepereMinMax(-1,4,-1,4,1,1);
+Axes;
+Debut;
+ Graduations;
+ Unites(2);
+ trace CA;
+Fin;
+endfig;
+\end{ExempleMP}
+
+On peut aussi ajouter une grille sur notre repère avec la macro suivante.
+\begin{colourband}
+\macro|GrilleRepere|\indication{trace un ensemble d'éléments sur le repère}
+\index{GrilleRepere@\lstinline+GrilleRepere+}
+\end{colourband}
+Dans l'exemple suivant, on règle la couleur de la grille avec la commande
+\hologo{MetaPost} \lstinline+drawoptions+.
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,1);
+CA = Cercle(A,2);
+RepereMinMax(-1,4,-1,4,1,1);
+drawoptions(withcolor LightGrey);
+GrilleRepere;
+drawoptions();
+Axes;
+Debut;
+ Graduations;
+ Unites(1);
+ trace CA;
+Fin;
+endfig;
+\end{ExempleMP}
+On pourra aussi ajouter un cadre au repère avec la macro suivante.
+\begin{colourband}
+ \macro|CadreRepere|\return{\typeMP{path}}
+ \index{CadreRepere@\lstinline+CadreRepere+}
+\end{colourband}
+ Dans l'exemple suivant, on règle la couleur de la grille avec la commande
+ \hologo{MetaPost} \lstinline+drawoptions+.
+ \begin{ExempleMP}
+input geom2d;
+beginfig(1);
+A = Point(1,1);
+CA = Cercle(A,2);
+RepereMinMax(-1,4,-1,4,1,1);
+drawoptions(withcolor LightGrey);
+GrilleRepere;
+drawoptions();
+Axes;
+Debut;
+ Graduations;
+ Unites(1);
+ trace CA;
+ trace CadreRepere withcolor OrangeRed;
+Fin;
+endfig;
+ \end{ExempleMP}
+
+\section{Quelques constantes et fonctions mathématiques}
+
+\mpgeomdd définit deux constantes mathématiques \lstinline+Pi+ et \lstinline+_E+
+\index{Pi@\lstinline+Pi+}\index{_E@\lstinline+_E+} pour les constantes
+$\uppi\simeq 3.14159265$ et $\mathrm{e}=2.71828183$.
+
+De plus, le package définit quelques fonctions mathématiques de la variable
+réelle :
+\begin{colourband}
+\macro|sin(«x»)| \index{sin@\lstinline+sin+}
+\macro|cos(«x»)| \index{cos@\lstinline+cos+}
+\macro|tan(«x»)| \index{tan@\lstinline+tan+}
+\macro|exp(«x»)| \index{exp@\lstinline+exp+}
+\macro|ln(«x»)| \index{ln@\lstinline+ln+}
+\macro|ch(«x»)| \index{ch@\lstinline+ch+}
+\macro|sh(«x»)| \index{sh@\lstinline+sh+}
+\macro|th(«x»)| \index{th@\lstinline+th+}
+\macro|arcsin(«x»)| \index{arcsin@\lstinline+arcsin+}
+\macro|arccos(«x»)| \index{arccos@\lstinline+arccos+}
+\macro|arctan(«x»)| \index{arctan@\lstinline+arctan+}
+\end{colourband}
+
+\section{Représentation de courbes et de fonctions}
+
+\mpgeomdd{} fournit aussi quelques macros facilitant la représentation simple de
+courbes et de fonctions mathématiques.
+
+\subsection{Fonction de la variable réelle}
+
+Pour représenter une fonction de la variable réelle, on utilisera la macro
+suivante:
+\begin{colourband}
+ \macro|Representation(«fonction»)(«ti»,«tf»,«n»)|\return{\typeMP{path}}
+ \begin{description}
+ \item[\meta{fonction}:] est une macro \MP{} qui définit la fonction
+ mathématique d'une variable réelle que l'on souhaite représenter ;
+ \item[\meta{ti}:] est la valeur (\typeMP{numeric}) initiale de la variable à
+ partir de laquelle on souhaite construire la représentation de la fonction ;
+ \item[\meta{tf}:] est la valeur (\typeMP{numeric}) finale de la variable
+ jusqu'à laquelle on souhaite construire la représentation de la fonction ;
+ \item[\meta{n}:] est le nombre de pas (\typeMP{numeric}) utilisé pour la
+ discrétisation de la représentation.
+ \end{description}
+ \index{Representation@\lstinline+Representation+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+beginfig(1);
+RepereMinMax(-2Pi,2Pi,-1.1,1.1,0.4,1);
+Axes;
+Debut;
+ Graduations;
+ trace Representation(cos,-2Pi,2Pi,100);
+Fin;
+endfig;
+ \end{ExempleMP}
+
+\subsection{Courbe paramétrique}
+
+Pour représenter une courbe plane définie par deux fonctions décrivant
+l'abscisse et l'ordonnée en fonction d'un paramètre, on utilisera la macro suivante:
+\begin{colourband}
+ \macro|Courbe(«fct_abscisse»)(«fct_ordonnee»)(«ti»,«tf»,«n»)|\return{\typeMP{path}}
+ \begin{description}
+ \item[\meta{fct\_abscisse}:] est une macro \MP{} qui définit la fonction
+ mathématique d'une variable réelle décrivant l'évolution de l'abscisse des
+ points de la courbe que l'on souhaite représenter ;
+ \item[\meta{fct\_ordonnee}:] est une macro \MP{} qui définit la fonction
+ mathématique d'une variable réelle décrivant l'évolution de l'ordonnée des
+ points de la courbe que l'on souhaite représenter ;
+ \item[\meta{ti}:] est la valeur (\typeMP{numeric}) initiale de la variable à
+ partir de laquelle on souhaite construire la représentation de la fonction ;
+ \item[\meta{tf}:] est la valeur (\typeMP{numeric}) finale de la variable
+ jusqu'à laquelle on souhaite construire la représentation de la fonction ;
+ \item[\meta{n}:] est le nombre de pas (\typeMP{numeric}) utilisé pour la
+ discrétisation de la représentation.
+ \end{description}
+ \index{Courbe@\lstinline+Courbe+}
+\end{colourband}
+
+\begin{ExempleMP}
+input geom2d;
+vardef f_a(expr t)= cos(t) enddef;
+vardef f_o(expr t)= sin(2*t) enddef;
+
+beginfig(1);
+RepereMinMax(-1.1,1.1,-1.1,1.1,2,2);
+Axes;
+Debut;
+ Graduations;
+ trace Courbe(f_a,f_o,-2Pi,2Pi,100);
+Fin;
+endfig;
+ \end{ExempleMP}
+
+ Pour représenter une courbe plane définie par une fonction décrivant les
+ coordonées polaires en fonction d'un paramètre, on utilisera la macro suivante:
+ \begin{colourband}
+ \macro|CourbeEnPolaires(«fonction»)(«ti»,«tf»,«n»)|\return{\typeMP{path}}
+ \begin{description}
+ \item[\meta{fonction}:] est une macro \MP{} qui définit la fonction
+ mathématique d'une variable réelle décrivant l'évolution des coordonnées polaires des
+ points de la courbe que l'on souhaite représenter ;
+ \item[\meta{ti}:] est la valeur (\typeMP{numeric}) initiale de la variable à
+ partir de laquelle on souhaite construire la représentation de la fonction ;
+ \item[\meta{tf}:] est la valeur (\typeMP{numeric}) finale de la variable
+ jusqu'à laquelle on souhaite construire la représentation de la fonction ;
+ \item[\meta{n}:] est le nombre de pas (\typeMP{numeric}) utilisé pour la
+ discrétisation de la représentation.
+ \end{description}
+ \index{CourbeEnPolaires@\lstinline+CourbeEnPolaires+}
+ \end{colourband}
+
+ \begin{ExempleMP}
+input geom2d;
+a := 2;
+vardef cardioide(expr t)= a*(1+cos(t)) enddef;
+beginfig(1);
+RepereMinMax(-1.1,4.1,-2.8,2.8,1,1);
+Axes;
+Debut;
+ Graduations;
+ trace CourbeEnPolaires(cardioide,0,2Pi,100);
+Fin;
+endfig;
+ \end{ExempleMP}
+
+
+\subsection{Champs de vecteurs}
+
+\mpgeomdd fournit des macros pour la représentation des champs de vecteurs.
+
+Tout d'abord, on peut tracer des champs de vecteurs associée à une équation
+différentielle du premier ordre pour une fonction $y$ de la variable $x$:
+\[y'=F(x,y).\]
+La macro associée est la suivante:
+\begin{colourband}
+ \macro|ChampVecteurs(«fonction»)(«x»,«y»,«px»,«py»,«dx»,«couleur»)|\return{\typeMP{path}}
+ \begin{description}
+ \item[\meta{fonction}:] est une macro \MP{} qui définit une fonction
+ mathématique de $\R^2$ dans $\R$ ;
+ \item[\meta{x}:] est une valeur (\typeMP{numeric}), en unité \variableGDD{gddU}, qui permet de décaler la
+ grille des vecteurs suivant la direction $x$, les points étant tous les
+ \meta{x}$+i$\meta{px} pour $i$ entier ;
+ \item[\meta{y}:] est une valeur (\typeMP{numeric}), en unité \variableGDD{gddU}, qui permet de décaler la
+ grille des vecteurs suivant la direction $y$, les points étant tous les
+ \meta{y}$+i$\meta{py} pour $i$ entier ;
+ \item[\meta{px}:] est la valeur (\typeMP{numeric}), en unité
+ \variableGDD{gddU}, du pas de la grille suivant l'axe $x$ pour
+ la représentation des vecteurs ;
+ \item[\meta{py}:] est la valeur (\typeMP{numeric}), en unité
+ \variableGDD{gddU}, du pas de la grille suivant l'axe $y$ pour
+ la représentation des vecteurs ;
+ \item[\meta{dx}:] est la norme (\typeMP{numeric}), en unité
+ \variableGDD{gddU}, des vecteurs du champ de vecteur ;
+ \item[\meta{couleur}:] est la couleur (\typeMP{color}) utilisée pour tracer
+ les vecteurs.
+ \end{description}
+ \index{ChampVecteurs@\lstinline+ChampVecteurs+}
+\end{colourband}
+
+Comme cette macro utilise la macro \lstinline+drawarrow+ de \MP{}, il faudra
+jouer avec le paramètre \lstinline+ahlength+ pour régler la taille du triangle
+des flèches (voir~\cite{ctan-metapost}).
+
+\begin{ExempleMP}
+input geom2d;
+vardef F(expr x,y) = x - 2 * x * y enddef;
+vardef f(expr x) = 1/2 + a * exp(- x*x) enddef;
+beginfig(1);
+RepereMinMax(-2.5,2.5,-2.8,2.8,1,1);
+Axes;
+Debut;
+Graduations;
+ahlength := 1;
+ChampVecteurs(F,0,0,0.2,0.2,0.1,0.5white);
+% Courbes intégrales
+for n = 0 upto 16:
+ a := (n/2) - 4;
+ trace Representation(f,-2.5,2.5,50)
+ avecCrayon(1,(0.7,0.2,0.2));
+endfor
+Fin;
+endfig;
+ \end{ExempleMP}
+
+Sur le même modèle, on peut tracer des champs de vecteurs d'une fonction de
+$\R^2$ dans $\R^2$.
+La macro associée est la suivante:
+\begin{colourband}
+ \macro|ChampVecteursDD(«fonction»)(«x»,«y»,«px»,«py»,«dx»,«couleur»)|\return{\typeMP{path}}
+ \begin{description}
+ \item[\meta{fonction}:] est une macro \MP{} qui définit une fonction
+ mathématique de $\R^2$ dans $\R^2$ (donc qui retourne une \typeMP{pair}) ;
+ \item[\meta{x}:] est une valeur (\typeMP{numeric}), en unité \variableGDD{gddU}, qui permet de décaler la
+ grille des vecteurs suivant la direction $x$, les points étant tous les
+ \meta{x}$+i$\meta{px} pour $i$ entier ;
+ \item[\meta{y}:] est une valeur (\typeMP{numeric}), en unité \variableGDD{gddU}, qui permet de décaler la
+ grille des vecteurs suivant la direction $y$, les points étant tous les
+ \meta{y}$+i$\meta{py} pour $i$ entier ;
+ \item[\meta{px}:] est la valeur (\typeMP{numeric}), en unité
+ \variableGDD{gddU}, du pas de la grille suivant l'axe $x$ pour
+ la représentation des vecteurs ;
+ \item[\meta{py}:] est la valeur (\typeMP{numeric}), en unité
+ \variableGDD{gddU}, du pas de la grille suivant l'axe $y$ pour
+ la représentation des vecteurs ;
+ \item[\meta{dx}:] est la norme (\typeMP{numeric}), en unité
+ \variableGDD{gddU}, des vecteurs du champ de vecteur ;
+ \item[\meta{couleur}:] est la couleur (\typeMP{color}) utilisée pour tracer
+ les vecteurs.
+ \end{description}
+ \index{ChampVecteursDD@\lstinline+ChampVecteursDD+}
+\end{colourband}
+
+ \begin{ExempleMP}[sidebyside=false]
+input geom2d;
+gddXlabel := "$\theta$";
+gddYlabel := "$\dot\theta$";
+numeric b,c;
+b:=0.5;
+c=1.0;
+
+vardef F(expr x,y) = (y,-b*y-c*sin(x)) enddef;
+
+beginfig(1);
+Repere(10,6,2,4,2,2);
+Axes;
+Unites(1);
+Debut;
+Graduations;
+trajectoire := CourbeDat("solution0",0);
+ChampVecteursDD(F,0.5,0.5,0.2,0.2,0.15,0.5white);
+trace trajectoire avecCrayon(1,(0.7,0.2,0.2));
+pointe Point(0,0) avecCrayon(1,(0.7,0.2,0.2));
+pointe Point(3.1415,0) avecCrayon(1,(0.7,0.2,0.2));
+Fin;
+endfig;
+ \end{ExempleMP}
+
+
+
+
+\section{Couleurs \texttt{svgnames}}
+
+\begin{mplibcode}
+input exemples/svgnames/palette.mp
+\end{mplibcode}
+
+
+
+\pagestyle{empty}
+\begin{landscape}
+ \section{Galerie}
+ \subsection{Repère et tangentes extérieure}
+ \begin{minipage}{0.5\linewidth}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/cercles/cercles2.mp;
+ \end{mplibcode}
+ \end{center}
+ \end{minipage}
+ \begin{minipage}{0.5\linewidth}
+ \lstinputlisting[basicstyle=\ttfamily\small]{exemples/cercles/cercles2.mp}
+ \end{minipage}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Vecteur dans un repère}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/reperes/reperes2.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/reperes/reperes2.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Théorème de Pascal}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/divers/pascalline.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/divers/pascalline.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Hyperbole}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/coniques/hyper.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/coniques/hyper.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Astroïde comme enveloppe de droites}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/courbes/cp01.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/courbes/cp01.mp}
+ \end{multicols}
+\end{landscape}
+
+
+\begin{landscape}
+ \subsection{Courbe de Lissajous}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/courbes/cp02.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/courbes/cp02.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Étude de fonctions}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/courbes/cp05.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/courbes/cp05.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Le bicorne}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/courbes/cp08.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/courbes/cp08.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Une fonction et ses dérivées}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/fonctions/fonction2.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/fonctions/fonction2.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Cardioïde}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/polaires/pol02.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/polaires/pol02.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Axe de similitude}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/cercles/axessimilitude.mp;
+ \end{mplibcode}
+ \end{center}
+ \begin{multicols}{2}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/cercles/axessimilitude.mp}
+ \end{multicols}
+\end{landscape}
+
+
+\begin{landscape}
+ \subsection{Tracé d'une cubique}
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/cubiques/K001.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/cubiques/K001.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Apollonius}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/triangles/apollonius.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/triangles/apollonius.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Épure d'ogive}
+
+ \begin{multicols}{2}
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/construction/ogiveentiers.mp;
+ \end{mplibcode}
+ \end{center}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/construction/ogiveentiers.mp}
+ \end{multicols}
+\end{landscape}
+
+\begin{landscape}
+ \subsection{Triangle orthique et problème de Fagnano}
+
+ Figure 21 de~\cite{toeplitz}.
+ \begin{center}
+ \begin{mplibcode}
+ input exemples/triangles/pedale.mp;
+ \end{mplibcode}
+ \end{center}
+ \begin{multicols}{2}
+ \lstinputlisting[basicstyle=\ttfamily\scriptsize]{exemples/triangles/pedale.mp}
+ \end{multicols}
+\end{landscape}
+\newpage
+\section{Historique}
+\begin{description}
+ \item[21 octobre 2024:] corrections de Quark67 (merci à lui) sur la
+ documentation et modifications suite à ses remarques.
+ \lstinline+DemieHyperbole+ devient
+ \lstinline+DemiHyperbole+ (sans compatibilité). Création de deux nouveaux
+ types
+ de pointage de \typeGDD{point} : croix et disque (voir commande \lstinline+pointe+).
+ \item[13 octobre 2024:] publication de la version 1.0 sur le CTAN.
+\end{description}
+
+\printbibliography
+\addcontentsline{toc}{section}{Références}%Including it as a chapter
+\printindex
+\addcontentsline{toc}{section}{Index}%Including it as a chapter
+
+
+\end{document}
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/doc/solution0.dat b/graphics/metapost/contrib/macros/mp-geom2d/doc/solution0.dat
new file mode 100644
index 0000000000..225ff5a9c9
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/doc/solution0.dat
@@ -0,0 +1,101 @@
+3.13159 0.00000
+3.13129 -0.00237
+3.13042 -0.00461
+3.12899 -0.00686
+3.12698 -0.00924
+3.12434 -0.01189
+3.12100 -0.01494
+3.11683 -0.01850
+3.11169 -0.02274
+3.10539 -0.02783
+3.09769 -0.03396
+3.08830 -0.04137
+3.07687 -0.05035
+3.06297 -0.06124
+3.04606 -0.07446
+3.02550 -0.09050
+3.00052 -0.10997
+2.97017 -0.13357
+2.93332 -0.16218
+2.88859 -0.19678
+2.83433 -0.23856
+2.76860 -0.28883
+2.68909 -0.34904
+2.59313 -0.42065
+2.47770 -0.50493
+2.33954 -0.60261
+2.17531 -0.71326
+1.98203 -0.83441
+1.75769 -0.96045
+1.50220 -1.08156
+1.21850 -1.18348
+0.91349 -1.24911
+0.59833 -1.26236
+0.28752 -1.21344
+-0.00322 -1.10279
+-0.25960 -0.94110
+-0.47092 -0.74535
+-0.63096 -0.53366
+-0.73772 -0.32146
+-0.79260 -0.12012
+-0.79935 0.06255
+-0.76333 0.22118
+-0.69110 0.35173
+-0.59008 0.45099
+-0.46841 0.51659
+-0.33468 0.54751
+-0.19748 0.54459
+-0.06496 0.51084
+0.05578 0.45130
+0.15908 0.37245
+0.24099 0.28137
+0.29933 0.18501
+0.33357 0.08961
+0.34466 0.00047
+0.33468 -0.07822
+0.30668 -0.14334
+0.26432 -0.19281
+0.21167 -0.22558
+0.15292 -0.24161
+0.09218 -0.24180
+0.03320 -0.22790
+-0.02079 -0.20232
+-0.06722 -0.16793
+-0.10427 -0.12778
+-0.13089 -0.08493
+-0.14675 -0.04218
+-0.15220 -0.00202
+-0.14814 0.03354
+-0.13594 0.06298
+-0.11725 0.08531
+-0.09392 0.10007
+-0.06785 0.10727
+-0.04088 0.10737
+-0.01469 0.10118
+0.00928 0.08981
+0.02989 0.07453
+0.04634 0.05669
+0.05814 0.03764
+0.06516 0.01863
+0.06755 0.00076
+0.06571 -0.01505
+0.06025 -0.02812
+0.05192 -0.03802
+0.04153 -0.04453
+0.02993 -0.04768
+0.01795 -0.04768
+0.00633 -0.04488
+-0.00430 -0.03980
+-0.01343 -0.03298
+-0.02070 -0.02504
+-0.02590 -0.01657
+-0.02898 -0.00812
+-0.03001 -0.00020
+-0.02916 0.00681
+-0.02671 0.01260
+-0.02298 0.01697
+-0.01835 0.01983
+-0.01319 0.02120
+-0.00787 0.02117
+-0.00271 0.01991
+0.00200 0.01763
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-arc.mp b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-arc.mp
new file mode 100644
index 0000000000..931f4af3d4
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-arc.mp
@@ -0,0 +1,56 @@
+%%% --------------------------------------------------------------------------
+%%% Arcs de cercles
+%%% --------------------------------------------------------------------------
+
+vardef Arc(expr c,r,a,b) =
+ % c: centre de l’arc (point ou pair)
+ % r: rayon (numeric)
+ % a: angle de départ (numeric)
+ % b: angle d’arrivée (numeric)
+ save n,centre,pas; n = incr gddO;
+ gddT[n] = "chemin";
+ pair centre; centre = PairImp(c); pas =(b-a)/10;
+ gddP[n]:=(centre+r*(cos(a),sin(a))) for i=0 upto 10: ..
+ (centre+r*(cos(a+i*pas),sin(a+i*pas))) endfor;
+ n
+enddef;
+
+vardef ArcEntrePoints(expr C, r, A, B,s) =
+ % C : centre de l’arc (point ou pair)
+ % r : rayon (numeric)
+ % A : point ou pair de départ de l’arc
+ % B : point ou pair d’arrivée
+ % s : sens 1 ou -1
+ save n,cercle,t; n = incr gddO;
+ gddT[n] = "chemin";
+ numeric t[];
+ path cercle;
+ cercle := fullcircle scaled 2r shifted PairImp(C);
+ (t1,t2) = cercle intersectiontimes (PairImp(C)--5[PairImp(C),PairImp(A)]);
+ (t3,t4) = cercle intersectiontimes (PairImp(C)--5[PairImp(C),PairImp(B)]);
+
+ if(t1<t3):
+ t5 = t1;
+ t6 = t3;
+ else:
+ t5 = t3;
+ t6 = t1;
+ fi
+ if(s=1):
+ gddP[n] := subpath (t5,t6) of cercle;
+ else:
+ gddP[n] := subpath (t5,t6-8) of cercle;
+ fi
+ n
+enddef;
+
+
+% obtenir seulement une partie d’un cercle déjà défini
+vardef gddTraceArcDeCercle(expr C,r,d)=
+ % C : cercle 4
+ % r : premier angle en radian
+ % d : deuxième angle en radian
+ (subpath(r/Pi*4,d/Pi*4) of gddTraceObjet(C))
+enddef;
+
+endinput \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-c2d.mp b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-c2d.mp
new file mode 100644
index 0000000000..900d64582b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-c2d.mp
@@ -0,0 +1,300 @@
+%%% --------------------------------------------------------------------------
+%%% mp-gdd %%% Courbes du second degré
+%%% --------------------------------------------------------------------------
+
+gddC2Dparam := 15; % pour les tracés des parabole et hyperbole
+
+% macros factorisées
+
+vardef Foyer(expr c,n) =
+ % c : ellipse, parabole, hyperbole
+ % n : 1 ou 2
+ if(n=1):
+ gddD[c]
+ else:
+ if(gddT[c]="parabole"): % si parabole c’est le même foyer
+ gddD[c]
+ else:
+ gddE[c]
+ fi
+ fi
+enddef;
+
+vardef Excentricite(expr c)=
+ gddX[c][3]
+enddef;
+
+vardef Inclinaison(expr c)=
+ gddX[c][4]
+enddef;
+
+% Ellipse ----------------------------------------------------------------------
+
+vardef Ellipse(expr C,A,B) =
+ % C : centre
+ % A : vertex
+ % B : co-vertex
+ save n,a,b,c,e,_tmp,slope;
+ pair _tmp;
+ n = incr gddO;
+ gddT[n] = "ellipse"; gddA[n] = PointImp(C); gddB[n] = PointImp(A);
+ gddC[n] = PointImp(B);
+ % calcul des deux foyers
+ a = Longueur(C,A);
+ b = Longueur(C,B);
+ c = sqrt(a**2-b**2);
+ e = c/a;
+ _tmp = e*(Pt(A)-Pt(C));
+ % les foyers
+ gddD[n] = PairTOPoint(Pt(C)+_tmp);
+ gddE[n] = PairTOPoint(Pt(C)-_tmp);
+ gddX[n][1] = a;
+ gddX[n][2] = b;
+ gddX[n][3] = e;
+ % angle du demi grand axe
+ slope = angle(PairImp(A)-PairImp(C));
+ gddX[n][4] = slope;
+ n
+enddef;
+
+vardef EllipseF(expr A,B,a) =
+ % A : foyer 1
+ % B : foyer 2
+ save n,b,c,e,_tmp,slope;
+ pair _tmp;
+ n = incr gddO;
+ gddT[n] = "ellipse";
+ % Foyers
+ gddD[n] = PointImp(A);
+ gddE[n] = PointImp(B);
+ % centre
+ gddA[n] = Milieu(A,B);
+ % La distance entre les deux foyers est égale à 2c
+ c = Longueur(A,B)/2;
+ if(c>a):
+ errmessage("le demi grand axe est trop petit");
+ fi
+ e = c/a;
+
+ b = sqrt(a**2-c**2);
+
+ % vertex et co-vertex
+ _tmp := 1.0/c*(Pt(B)-Pt(gddA[n]));
+ gddB[n] = PairTOPoint(Pt(gddA[n])+a*_tmp);
+ gddC[n] = PairTOPoint(Pt(gddA[n])+b*Pt(Rotation(_tmp,Pi/2)));
+ gddX[n][1] = a;
+ gddX[n][2] = b;
+ gddX[n][3] = e;
+ % angle du demi grand axe
+ slope = angle(PairImp(gddB[n])-PairImp(gddA[n]));
+ gddX[n][4] = slope;
+ n
+enddef;
+
+
+
+vardef Vertex(expr c) =
+ gddB[c]
+enddef;
+
+vardef Covertex(expr c) =
+ gddC[c]
+enddef;
+
+
+
+vardef DemiGrandAxe(expr c)=
+ gddX[c][1]
+enddef;
+
+vardef DemiPetitAxe(expr c)=
+ gddX[c][2]
+enddef;
+
+
+
+
+vardef TangenteEllipse(expr e,p) =
+ % détermine la tangente à une ellipse e au point p
+ % appartenant à l’ellipse
+ % par la méthode de la bissectrice
+ save F,Fp,M,B;
+ F = Foyer(e,1);
+ Fp = Foyer(e,2);
+ M = PointImp(p);
+ B = Bissectrice(F,M,Fp);
+ DroitePerpendiculaire(B,M)
+enddef;
+
+vardef TangenteExterieureEllipse(expr ell, p,n) =
+ % ell : ellipse
+ % p : point
+ % n : 1 ou 2 pour choisir la tangente
+ % http://choumac44.free.fr/NGEOMETRIE/Ellipse.htm
+ % Du point p comme centre tracer un arc de cercle de rayon PF'
+ % Du foyer F comme centre tracer un arc de cercle de rayon 2a
+ % l'intersection des 2 arcs donne le point T
+ % Tracer la droite TF puis la droite TF' et sa médiatrice , l'intersection de
+ % la médiatrice et la droite TF nous donne le point ( M ) ( contact avec la
+ % courbe) -> ici on laisse MetaPost trouver l’intersection segment,ellipse
+ save F,P,T,C,Ip,U,DU,M;
+ P = PointImp(p);
+ if(n=1):
+ F1 = Foyer(ell,1);
+ F2 = Foyer(ell,2);
+ else:
+ F1 = Foyer(ell,2);
+ F2 = Foyer(ell,1);
+ fi
+ C1 = CercleCP(P,F1);
+ C2 = Cercle(F2,2*DemiGrandAxe(ell));
+ T1 = IntersectionCercles(C1,C2);
+ T2 = IntersectionCercles(C2,C1);
+ if(Longueur(F1,T1)<Longueur(F1,T2)):
+ U = T1;
+ else:
+ U = T2;
+ fi
+ DU = Segment(F2,U);
+ pair Ip;
+ Ip := (gddTraceObjet(DU)) intersectionpoint (gddTraceObjet(ell));
+ M = PointImp(Ip);
+ Droite(P,M)
+enddef;
+
+
+%%% Paraboles ----------------------------------------------------------------
+
+% Parabole par Foyer-Directrice.
+
+
+
+vardef ParaboleFD(expr F,D) =
+ % F : foyer (point)
+ % D : directrice (droite)
+ save u, v, w, d, i, n,_tmp,slope;
+ pair _tmp;
+ n = incr gddO;
+ (u,v,w) = EquationDroite(D);
+ % ordonnée relative
+ d := u * gddA[F] + v * gddB[F] + w;
+ gddT[n] := "parabole";
+ gddX[n][1] := D; % on stock la directrice
+ gddX[n][2] := D; % on stock la directrice (compatibilité avec hyperbole)
+ % sommet
+ _tmp := (((-d/2)*(u,v)) shifted PairImp(F));
+ gddB[n] = PointImp(_tmp);
+ gddC[n] = PointImp(_tmp);
+ % le foyer (doublé pour compatibilité)
+ gddD[n] := F;
+ gddE[n] := F;
+ gddX[n][3] := 1.0; % excentricité
+ % angle du demi grand axe
+ slope = angle(PairImp(gddA[D])-PairImp(gddB[D]))+90;
+ gddX[n][4] = slope;
+ i := -gddC2Dparam-1;
+ gddP[n] := (
+ ((i*(v,-u)+((i*i-d*d)/(2d))*(u,v))
+ for i:= -gddC2Dparam upto gddC2Dparam:
+ ..(i*(v,-u)+((i*i-d*d)/(2d))*(u,v))
+ endfor)) shifted PairImp(F);
+ n
+enddef;
+
+% Parabole par Foyer-Sommet
+vardef ParaboleFS(expr F,S) =
+enddef;
+
+
+%% Hyperbole ----------------------------------------------------------
+
+vardef HyperboleFD(expr F,D,e) =
+ % F : foyer (point)
+ % D : directrice (droite)
+ % e : exentricité (numeric)
+ % pm : +1 ou -1 pour les deux branches
+ save u, v, w, d, i, n,_tmp,slope,aa,bb;
+ pair _tmp;
+ n = incr gddO;
+
+ (u,v,w) = EquationDroite(D);
+ d := u * gddA[F] + v * gddB[F] + w;
+ gddT[n] := "hyperbole";
+
+ % sommets
+ _tmp := -(d+1*sqrt(e*e*d*d))/(e*e-1)*(u,v)shifted (ProduitScalaire(F,Vecteur(v,-u))*(v,-u));
+ gddB[n] := PointImp(_tmp);
+ _tmp := -(d-1*sqrt(e*e*d*d))/(e*e-1)*(u,v)shifted
+ (ProduitScalaire(F,Vecteur(v,-u))*(v,-u));
+ gddC[n] := PointImp(_tmp);
+ % centre comme milieu des deux sommets
+ gddA[n] = Milieu(gddB[n],gddC[n]);
+ % le foyer (doublé pour compatibilité)
+ gddD[n] := F;
+ gddE[n] := RotationCentre(F, gddA[n], Pi);
+ gddX[n][3] := e; % excentricité
+ % directrices
+ gddX[n][1] := D; % on stock la directrice
+ gddX[n][2] := Droite(RotationCentre(gddA[D], gddA[n], Pi),RotationCentre(gddB[D], gddA[n], Pi));
+ % angle de l’axe
+ slope = angle(PairImp(gddA[D])-PairImp(gddB[D]))+90;
+ gddX[n][4] = slope;
+ % cercle principale
+ gddX[n][5] = CercleD(gddB[n],gddC[n]);
+ % asymptotes
+ aa = IntersectionDroiteCercle(D,gddX[n][5],1);
+ bb = IntersectionDroiteCercle(D,gddX[n][5],2);
+ gddX[n][6] = Droite(gddA[n],aa);
+ gddX[n][7] = Droite(gddA[n],bb);
+ % tracés des moitiées
+ i := -gddC2Dparam-1;
+ gddPX[n][1] := (
+ (
+ (i*(v,-u)-(d+sqrt(e*e*d*d+i*i*(e*e-1)))/(e*e-1)*(u,v))
+ for i:= -gddC2Dparam upto gddC2Dparam:
+ ..(i*(v,-u)-(d+sqrt(e*e*d*d+i*i*(e*e-1)))/(e*e-1)*(u,v))
+ endfor
+ ) shifted (ProduitScalaire(F,Vecteur(v,-u))*(v,-u))
+ );
+ gddPX[n][2] := (
+ (
+ (i*(v,-u)-(d-sqrt(e*e*d*d+i*i*(e*e-1)))/(e*e-1)*(u,v))
+ for i:= -gddC2Dparam upto gddC2Dparam:
+ ..(i*(v,-u)-(d-sqrt(e*e*d*d+i*i*(e*e-1)))/(e*e-1)*(u,v))
+ endfor
+ ) shifted (ProduitScalaire(F,Vecteur(v,-u))*(v,-u))
+ );
+ n
+enddef;
+
+vardef CerclePrincipale(expr h)=
+ %h : hyperbole
+ gddX[h][5]
+enddef;
+
+vardef AsymptoteHyperbole(expr h,n)=
+ % h : hyperbole
+ % n : 1 ou 2 pour choisir l’hyperbole
+ gddX[h][5+n]
+enddef;
+
+vardef DemiHyperbole(expr h,n)=
+ gddPX[h][n]
+enddef;
+
+% sommet
+vardef Sommet(expr p,n) =
+ % p : parabole ou hyperbole
+ % n : 1 ou 2, choisir un des sommets (le même pour la parabole)
+ if n=1:
+ gddB[p]
+ else:
+ gddC[p]
+ fi
+enddef;
+
+vardef Directrice(expr p,n) =
+ % p : parabole ou hyperbole
+ gddX[p][n]
+enddef;
+endinput \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-fct.mp b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-fct.mp
new file mode 100644
index 0000000000..8d70154b5f
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-fct.mp
@@ -0,0 +1,22 @@
+numeric Pi;
+numeric _E;
+
+Pi := 3.14159265;
+_E := 2.71828183;
+
+vardef sin(expr x) = sind(x/Pi*180) enddef;
+vardef cos(expr x) = cosd(x/Pi*180) enddef;
+vardef tan(expr x) = sin(x)/cos(x) enddef;
+
+vardef exp(expr x) = _E**x enddef;
+
+vardef ln(expr x) = mlog(x)/256 enddef;
+vardef ch(expr x) = (_E**x + _E**(-x))/2 enddef;
+vardef sh(expr x) = (_E**x - _E**(-x))/2 enddef;
+vardef th(expr x) = (_E**(2*x) - 1)/(_E**(2*x) + 1) enddef;
+
+vardef arcsin(expr t) = angle((sqrt(1-t**2),t)) / 180 * Pi enddef;
+vardef arccos(expr t) = angle(t,(sqrt(1-t**2))) / 180 * Pi enddef;
+vardef arctan(expr t) = angle(1,t) / 180 * Pi enddef;
+
+endinput \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-lbl.mp b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-lbl.mp
new file mode 100644
index 0000000000..562a321b23
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-lbl.mp
@@ -0,0 +1,84 @@
+
+string lblS[];
+lblS[0] = "alpha";
+lblS[1] = "beta";
+lblS[2] = "gamma";
+lblS[3] = "delta";
+lblN = 3;
+
+
+vardef lTEX primary s =
+ textext("$"&scanchaine_label(s)&"$")
+enddef;
+
+vardef gddLabel.@#(expr s,p) =
+ % comme label mais qui s’applique à un point
+ % s : matériel de l’annotation
+ % p : point mpgdd
+ label.@#(s,Pt(p) gddEnPlace)
+enddef;
+
+vardef Etiquette.@#(expr s,t,p) = label.@#(textext(s) scaled t,p gddEnPlace) enddef;
+
+vardef EtiquetteChemin.@#(expr s,p,pos) = % label, chemin, position
+ save chemin;
+ path chemin;
+ if path p:
+ chemin:=p;
+ else:
+ chemin:=gddP[p]; % fonction pour chemin et courbe
+ fi;
+ label.@#(textext(s), _milieuChemin(chemin,pos) gddEnPlace)
+enddef;
+
+vardef _milieuChemin(expr p,pos) = % p est du type path
+ save midtime;
+ midtime = arctime (pos*(arclength(p))) of p;
+ point infinity of (subpath (0,midtime) of p)
+enddef;
+
+vardef FICHIER primary s =
+ save _s; string _s; _s = "input " & s;
+ scantokens _s
+enddef;
+
+vardef m_arque.@# expr p =
+ pointe p;
+ label.@#(gddL[p] scaled gddTailleLabel,PointTOPair(p) gddEnPlace);
+enddef;
+
+vardef m_a_rque.@# expr p =
+ pointe(scantokens p);
+ label.@#(lTEX(p) scaled gddTailleLabel,PointTOPair(scantokens p) gddEnPlace);
+enddef;
+
+vardef marque.@# expr p =
+ if string p: m_a_rque.@# p else: m_arque.@# p fi
+enddef;
+
+
+
+vardef scanchaine_label(expr s) =
+ save d,m,f,c,l,flag,i; string d,m,f,c;
+ d := ""; m := ""; f := "";
+ l = length(s); flag := 0;
+ for i:=0 upto l:
+ c := substring (i,i+1) of s;
+ if c = "'":
+ f := f & c; flag := 2;
+ elseif c = "_":
+ flag := 1;
+ else:
+ if flag = 0:
+ d := d & c
+ else:
+ m := m & c
+ fi;
+ fi
+ endfor;
+ for i:=0 upto lblN:
+ if d = lblS[i]: d := "\" & d fi
+ endfor;
+ d := d & "_{" & m & "}" & f; d
+enddef;
+endinput \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-main.mp b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-main.mp
new file mode 100644
index 0000000000..9e09c6f672
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-main.mp
@@ -0,0 +1,1071 @@
+
+
+%%% ----------------------------------------------------------------------------
+%%% Déclarations
+%%% ----------------------------------------------------------------------------
+
+numeric gddA[];
+numeric gddB[];
+numeric gddC[];
+numeric gddD[];
+numeric gddE[];
+numeric gddF[];
+numeric gddX[][];
+picture gddL[]; % Table des labels TeX (btex .. etex)
+numeric gddO; % Compteur des objets
+path gddP[]; % Table des chemins (paths internes)
+path gddPX[][]; % Tables des chemins étendues
+string gddS[]; % Table des chaînes (noms de fichiers)
+string gddT[]; % Table des types
+numeric gddU; % Unité graphique
+string gddW; % Chaîne spécifiant le placement des objets
+
+%%% ----------------------------------------------------------------------------
+%%% Initialisations
+%%% ----------------------------------------------------------------------------
+
+% Initialisation de gddO -------------------------------------------------------
+gddO := 0;
+
+% Valeur par défaut de gddU ----------------------------------------------------
+gddU := 1cm;
+
+% Initialisation de gddW et procédure associée ---------------------------------
+gddW = "scaled gddU";
+def gddEnPlace = scantokens gddW enddef;
+
+%%% ----------------------------------------------------------------------------
+%%% Définition des objets
+%%% ----------------------------------------------------------------------------
+
+% Point ------------------------------------------------------------------------
+vardef Point(expr a,b) =
+ gddT[incr gddO] = "point";
+ gddA[gddO] = a; gddB[gddO] = b; gddO
+enddef;
+
+vardef PointPolaire(expr r,a) =
+ % r : rayon
+ % a : angle en radian
+ gddT[incr gddO] = "point";
+ gddA[gddO] = r*cos(a); gddB[gddO] = r*sin(a); gddO
+enddef;
+
+vardef PointDansRepere(expr x,y,o,i,j) =
+ gddT[incr gddO] = "point";
+ gddA[gddO] = gddA[o] + x*(gddA[i]-gddA[o]) + y*(gddA[j]-gddA[o]);
+ gddB[gddO] = gddB[o] + x*(gddB[i]-gddB[o]) + y*(gddB[j]-gddB[o]);
+ gddO
+enddef;
+
+vardef CoordonneesRepere(expr m,o,i,j) =
+ save x,y; numeric x,y;
+ gddA[m] = (gddA[i]-gddA[o])*x + (gddA[j]-gddA[o])*y + gddA[o];
+ gddB[m] = (gddB[i]-gddB[o])*x + (gddB[j]-gddB[o])*y + gddB[o];
+ (x,y)
+enddef;
+
+vardef Milieu(expr a,b) =
+ gddT[incr gddO] = "point";
+ gddA[gddO] = 0.5*(gddA[a]+gddA[b]);
+ gddB[gddO] = 0.5*(gddB[a]+gddB[b]);
+ gddO
+enddef;
+
+vardef Rotation(expr A, a) =
+ % A : point
+ % a : angle
+ save _tmp,n;
+ n = incr gddO;
+ _tmp = PointImp(A);
+ gddT[n] = "point";
+ gddA[n] = cos(a)*gddA[_tmp]-sin(a)*gddB[_tmp];
+ gddB[n] = sin(a)*gddA[_tmp]+cos(a)*gddB[_tmp];
+ n
+enddef;
+
+vardef RotationCentre(expr A, C, a) =
+ % A : point
+ % C : point centre de la rotation
+ % a : angle
+ save _tmp,_tmp,n;
+ n = incr gddO;
+ _tmp1 = PointImp(A);
+ _tmp2 = PointImp(C);
+ gddT[n] = "point";
+ gddA[n] = cos(a)*(gddA[_tmp1]-gddA[_tmp2])-sin(a)*(gddB[_tmp1]-gddB[_tmp2])+gddA[_tmp2];
+ gddB[n] = sin(a)*(gddA[_tmp1]-gddA[_tmp2])+cos(a)*(gddB[_tmp1]-gddB[_tmp2])+gddB[_tmp2];
+ n
+enddef;
+
+vardef IsoBarycentre(text t) =
+ save n, G;
+ pair G; numeric n;
+ G := origin; n:=0;
+ for a=t:
+ G:=G+PairImp(a);
+ n:=n+1;
+ endfor;
+ PointImp(G/n)
+enddef;
+
+vardef Barycentre(text t) =
+ % liste sous la forme (A,a),(B,b),(C,c), etc.
+ save n, Gs;
+ pair G; numeric n;
+ G := origin; n:=0;
+ for a=t:
+ G:=G+((ypart a)*Pt(xpart a));
+ n:=n+(ypart a);
+ endfor;
+ PointImp(G/n)
+enddef;
+
+
+% Transformations pair <-> Point -----------------------------------------------
+def PointTOPair(expr a) = (gddA[a],gddB[a]) enddef;
+def PairTOPoint(expr p) = Point(xpart p,ypart p) enddef;
+def PairImp(expr a) = if pair a: a else: PointTOPair(a) fi enddef;
+def PointImp(expr a) = if pair a: PairTOPoint(a) else: a fi enddef;
+def Pt(expr a) = (gddA[a],gddB[a]) enddef;
+def PtR(expr a) = (gddA[a],gddB[a]) gddEnPlace enddef;
+
+% Transformations pair <-> Point -----------------------------------------------
+def VecteurTOPair(expr a) = (gddA[a],gddB[a]) enddef;
+def PairTOVecteur(expr p) = Vecteur(xpart p,ypart p) enddef;
+
+% Abscisse et ordonnées --------------------------------------------------------
+vardef Abscisse(expr a) = if pair a: xpart a else: gddA[a] fi enddef;
+vardef Ordonnee(expr a) = if pair a: ypart a else: gddB[a] fi enddef;
+
+
+% Addition ---------------------------------------------------------------------
+vardef AdditionAbscisses(expr a,b) = if pair a: xpart a else: gddA[a] fi + if pair b: xpart b else: gddA[b] fi enddef;
+vardef AdditionOrdonnees(expr a,b) = if pair a: ypart a else: gddB[a] fi + if pair b: ypart b else: gddB[b] fi enddef;
+vardef Addition(expr a,b) =
+ gddT[incr gddO] = "point";
+ gddA[gddO] = AdditionAbscisses(a,b);
+ gddB[gddO] = AdditionOrdonnees(a,b);
+ gddO
+enddef;
+
+vardef Longueur (expr a,b) =
+ abs(PairImp(a)-PairImp(b))
+enddef;
+
+vardef Bissectrice(expr a,b,c) =
+ % bisectrice du secteur angulaire défini par les points (abc)
+ save dba,dbc,ap,cp;
+ dba = Droite(b,a);
+ dbc = Droite(b,c);
+ ap = ReportSurDroite(b,dba,2);
+ cp = ReportSurDroite(b,dbc,2);
+ %% C'est une bonne idée cette procédure ReportSurDroite !
+ %% Pour obtenir la bissectrice il suffit de prendre la droite qui joint
+ %% le sommet au milieu du segment dont les extrémités sont les reports.
+ %% Ainsi le cas où les droites (b,a) et (b,c) sont confondues est traité.
+ Droite(b,Milieu(ap,cp))
+enddef;
+
+% Vecteur ----------------------------------------------------------------------
+vardef Vecteur (expr a,b) =
+ save n; n = incr gddO;
+ gddT[n] = "vecteur"; gddA[n] = a; gddB[n] = b; n
+enddef;
+
+vardef VecteurP (expr a) =
+ % définition d’un vecteur à partir d’un pair
+ save n; n = incr gddO;
+ gddT[n] = "vecteur"; gddA[n] =xpart a; gddB[n] = ypart a; n
+enddef;
+
+vardef ScalaireVecteur (expr k,a) =
+ % multiplication par un scalaire
+ % k : scalaire
+ % a : vecteur
+ save x,y;
+ x = k*gddA[a];
+ y = k*gddB[a];
+ Vecteur(x,y)
+enddef;
+
+vardef AdditionVecteur (expr u,v) =
+ save n,x,y; n = incr gddO;
+ gddT[n] = "vecteur";
+ x = gddA[u]+gddA[v];
+ y = gddB[u]+gddB[v];
+ gddA[n] = x; gddB[n] = y; n
+enddef;
+
+vardef SoustractionVecteur (expr u,v) =
+ save n,x,y; n = incr gddO;
+ gddT[n] = "vecteur";
+ x = gddA[u]-gddA[v];
+ y = gddB[u]-gddB[v];
+ gddA[n] = x; gddB[n] = y; n
+enddef;
+
+
+vardef ProduitScalaire (expr u,v)=
+ (gddA[u]*gddA[v]+gddB[u]*gddB[v])
+enddef;
+
+vardef Norme (expr s) =
+ sqrt(gddA[s]**2+gddB[s]**2)
+enddef;
+
+vardef VecteursAngle (expr u,v)=
+ arccos((ProduitScalaire(u,v))/(Norme(u)*Norme(v)))
+enddef;
+
+% Segment ----------------------------------------------------------------------
+vardef Segment (expr a,b) =
+ save n; n = incr gddO;
+ gddT[n] = "segment"; gddA[n] = PointImp(a); gddB[n] = PointImp(b); n
+enddef;
+
+vardef LongueurSegment (expr s) =
+ abs(Pt(gddA[s])-Pt(gddB[s]))
+enddef;
+
+vardef SegmentTOVecteur (expr s)=
+ VecteurP(Pt(gddB[s])-Pt(gddA[s]))
+enddef;
+
+
+% Triangle ---------------------------------------------------------------------
+vardef Triangle (expr a,b,c) =
+ save n; n = incr gddO; gddT[n] = "triangle";
+ gddA[n] = PointImp(a); gddB[n] = PointImp(b); gddC[n] = PointImp(c); n
+enddef;
+
+% Drawing with Metapost, Thurston
+vardef Orthocentre (expr t) =
+ save A,B,C,D,p,q;
+ pair A,B,C,D,p,q;
+ A = PointTOPair(gddA[t]);
+ B = PointTOPair(gddB[t]);
+ C = PointTOPair(gddC[t]);
+ p = whatever[B,C] ; A-p = whatever*(B-C) rotated 90;
+ q = whatever[C,A] ; B-q = whatever*(C-A) rotated 90;
+ D = whatever[A,p] = whatever[B,q];
+ PairTOPoint(D)
+enddef;
+
+
+
+vardef AireTriangle ( expr t) =
+ save droite,h,l;
+ droite = Droite(gddA[t],gddB[t]);
+ h = ProjectionPointSurDroite(gddC[t],droite);
+ l = Longueur(gddC[t],h);
+ (Longueur(gddA[t],gddB[t])*l/2.0)
+enddef;
+
+vardef CercleInscrit(expr t) =
+ save AB,BC,CA,a,b,c,I,Aire,rayon;
+ c = Longueur(gddA[t],gddB[t]);
+ a = Longueur(gddB[t],gddC[t]);
+ b = Longueur(gddC[t],gddA[t]);
+ I = Barycentre((gddA[t],a),(gddB[t],b),(gddC[t],c));
+ Aire = AireTriangle(t);
+ rayon = 2*Aire/(a+b+c);
+ Cercle(I,rayon)
+enddef;
+
+
+vardef CercleExinscrit(expr t,n) =
+ % t : gdd triangle
+ % s : 1,2 ou 3 pour choisir AB, BC ou CA
+ save AB,BC,CA,a,b,c,I,p,Aire,rayon;
+ c = Longueur(gddA[t],gddB[t]);
+ a = Longueur(gddB[t],gddC[t]);
+ b = Longueur(gddC[t],gddA[t]);
+ p = (a+b+c)/2.0;
+ Aire = AireTriangle(t);
+ if(n=1):
+ rayon = Aire/(p-a);
+ I = Barycentre((gddA[t],-a),(gddB[t],b),(gddC[t],c));
+ elseif(n=2):
+ rayon = Aire/(p-b);
+ I = Barycentre((gddA[t],a),(gddB[t],-b),(gddC[t],c));
+ elseif(n=3):
+ rayon = Aire/(p-c);
+ I = Barycentre((gddA[t],a),(gddB[t],b),(gddC[t],-c));
+ fi
+ Cercle(I,rayon)
+enddef;
+
+vardef CercleCirconscrit(expr t) =
+ % t : gdd triangle
+ CercleTroisPoints(gddA[t],gddB[t],gddC[t])
+enddef;
+
+vardef CercleEuler(expr t) =
+ % t : gdd triangle
+ % cercle des neuf points
+ save D,C,N,r;
+ pair N;
+ D = Orthocentre(t);
+ C = CercleCirconscrit(t);
+ N = 0.5[Pt(D),Pt(Centre(C))];
+ r = abs(N-1/2[Pt(gddA[t]),Pt(gddB[t])]); % un des neuf points est le
+ % milieu de [A,B]
+ Cercle(N,r)
+enddef;
+
+
+% Polygones --------------------------------------------------------------------
+vardef Polygone (text plist) =
+ save n,_point,i; n = incr gddO; gddT[n] = "polygone";
+ i:=1;
+ for _point = plist:
+ gddX[gddO][i] = PointImp(_point);
+ i:=i+1;
+ endfor
+ gddB[n] = i-1; % nombre de côté
+ gddA[n] = IsoBarycentre(plist); % centre
+ n
+enddef;
+
+vardef PolygoneRegulier (expr N,s,r,t)=
+ % N : (entier) nombre de côtés
+ % s : (numeric) rayon du cercle circonscrit
+ % r : (numeric en degré) rotation du polygone (premier point
+ % commence sur l’axe des abscisses)
+ % t : (pair ou point) translation
+ save n,_point,i; n = incr gddO; gddT[n] = "polygone";
+ pair _point;
+ for i=1 upto N:
+ _point := (s*cos((2*Pi/N)*(i-1)+r/180*Pi),s*sin((2*Pi/N)*(i-1)+r/180*Pi))+PairImp(t);
+ gddX[n][i] = PointImp(_point);
+ endfor
+ gddB[n] = N; % nombre de côtés
+ gddA[n] = PointImp(t); % centre
+ n
+enddef;
+
+def NombreCotesPolygone(expr p) =
+ gddA[p]
+enddef;
+
+def PointPolygone(expr p,i) =
+ gddX[p][i]
+enddef;
+
+% Droite -----------------------------------------------------------------------
+vardef Droite (expr a,b) =
+ save n; n = incr gddO;
+ gddT[n] = "droite"; gddA[n] = PointImp(a); gddB[n] = PointImp(b); n
+enddef;
+
+% Équation de droite : triplet (u,v,w) tel que ux+vy+w=0 -----------------------
+% L'équation rendue est normalisée !
+vardef EquationDroite(expr d) =
+ save u, v, w, n;
+ u := gddB[gddB[d]] - gddB[gddA[d]];
+ v := gddA[gddA[d]] - gddA[gddB[d]];
+ w := - u * gddA[gddA[d]] - v * gddB[gddA[d]];
+ n := u ++ v;
+ (u/n,v/n,w/n)
+enddef;
+
+% Ordonnée relative à une droite orientée --------------------------------------
+vardef OrdonneeRelativePointDroite(expr p, d) =
+ savec u, v, w;
+ (u,v,w) = EquationDroite(d);
+ u * gddA[p] + v * gddB[p] + w
+enddef;
+
+% Distance d'un point à une droite ---------------------------------------------
+def DistancePointDroite(expr p, d) =
+ abs(OrdonneeRelativePointDroite(p, d))
+enddef;
+
+% Projection d'un point sur une droite -----------------------------------------
+vardef ProjectionPointSurDroite(expr p, d) =
+ save u,v,w, l;
+ (u,v,w) = EquationDroite(d);
+ l := - u * gddA[p] - v * gddB[p] - w;
+ Point(gddA[p] + l * u, gddB[p] + l * v)
+enddef;
+
+% Droite perpendicalaire -------------------------------------------------------
+
+vardef DroitePerpendiculaire (expr D,p) =
+ % D : droite par rapport à laquelle on doit être perpendiculaire
+ % p : point par lequel doit passer la droite
+ save n,_t,A,B,v,pP,pD; n = incr gddO;
+ pair _t,A,B,v,q;
+ A := Pt(gddA[D]);
+ B := Pt(gddB[D]);
+ v := B-A; v := (-(ypart v), xpart v); %% Vecteur normal à B-A
+ q := Pt(p) + v;
+ Droite(p,q)
+enddef;
+
+vardef ReportSurDroite(expr P,D,d) =
+ % P : point de départ du segment
+ % D : droite sur laquelle construire le point
+ % d : longueure du segment
+ save n,_t; n = incr gddO;
+ pair _t;
+ _t := PairImp(P)+d*unitvector(Pt(gddB[D])-Pt(gddA[D]));
+ gddT[n] = "point"; gddA[n] = xpart _t; gddB[n] = ypart _t; n
+enddef;
+
+% Intersection de deux droites -------------------------------------------------
+vardef IntersectionDroites (expr a,b) =
+ save _p;
+ pair _p;
+ _p := mpIntersectionDroites(Pt(gddA[a]),Pt(gddB[a]),Pt(gddA[b]),Pt(gddB[b]));
+ PairTOPoint(_p)
+enddef;
+
+% Cercles ----------------------------------------------------------------------
+vardef Cercle (expr a,b) =
+ save n; n = incr gddO;
+ gddT[n] = "cercle"; gddA[n] = PointImp(a); gddB[n] = b; n
+enddef;
+
+
+vardef Rayon(expr c) =
+ gddB[c]
+enddef;
+
+
+vardef CercleCP(expr a,b) = Cercle(a,abs(Pt(a)-Pt(b))) enddef;
+vardef CercleD(expr a,b) = CercleCP(Milieu(a,b),a) enddef;
+
+% Drawing with MetaPost Thurston
+vardef CercleTroisPoints(expr A, B, C) =
+ save o; pair o;
+ o = whatever * (Pt(A)-Pt(B)) rotated 90 shifted 1/2 [Pt(A),Pt(B)] = whatever * (Pt(B)-Pt(C)) rotated 90 shifted 1/2 [Pt(B),Pt(C)];
+ Cercle(o,abs(Pt(A)-o))
+enddef;
+
+vardef AxeDeSimilitude(expr a,b,c) =
+ % Axe de similitude de trois cercles
+ save T,E;
+ numeric T[],E[];
+ T1 = TangenteCommuneExterieure(a,b);
+ T2 = TangenteCommuneExterieure(b,a);
+ T3 = TangenteCommuneExterieure(b,c);
+ T4 = TangenteCommuneExterieure(c,b);
+ E1 = IntersectionDroites(T1,T2);
+ E2 = IntersectionDroites(T3,T4);
+ Droite(E1,E2)
+enddef;
+
+
+
+% Tangente commune extérieure à deux cercles -----------------------------------
+vardef TangenteCommuneExterieure(expr a, b) =
+ save O, A, d, f; pair O, A;
+ O = (gddB[a]/(gddB[a]-gddB[b]))[Pt(gddA[a]),Pt(gddA[b])]; % Centre de l'homothétie
+ d = abs(O-Pt(gddA[a]));
+ f := if gddA[a] < gddA[b] : 1 else: -1 fi;
+ A = Pt(gddA[a]) rotatedaround(O,angle(d+-+gddB[a],f*gddB[a]));
+ Droite(O,A)
+enddef;
+
+% Tangente commune intérieure à deux cercles -----------------------------------
+vardef TangenteCommuneInterieure(expr a, b) =
+ save O, A, d, f; pair O, A;
+ O = (gddB[a]/(gddB[a]+gddB[b]))[Pt(gddA[a]),Pt(gddA[b])]; % Centre de l'homothétie
+ d = abs(O-Pt(gddA[a]));
+ f := if gddA[a] < gddA[b] : 1 else: -1 fi;
+ A = Pt(gddA[a]) rotatedaround(O,angle(d+-+gddB[a],f*gddB[a]));
+ Droite(O,A)
+enddef;
+
+
+% Intersection de deux cercles -------------------------------------------------
+vardef IntersectionCercles (expr a, b) =
+ save d, x, y, u; pair u;
+ u = unitvector(Pt(gddA[b])-Pt(gddA[a]));
+ d = abs(Pt(gddA[a])-Pt(gddA[b]));
+ x = (gddB[a]**2-gddB[b]**2+d**2)/(2d);
+ y = gddB[a]+-+x;
+ PairTOPoint(Pt(gddA[a])+x*u+y*(u rotated 90))
+enddef;
+
+
+
+% Intersection d’une droite et d’un cercle ------------------------------------
+vardef IntersectionDroiteCercle (expr D, CC, n) =
+ % D : droite
+ % CC : cercle
+ % n : identification du point 1 ou 2, le même si point unique
+ % résolution par le calcul
+ save a,b,c,Xc,Yc,R,A,B,C,Delta,Xp,Yp;
+ numeric a,b,c,Xc,Yc,R,A,B,C,Delta,Xp,Yp;
+ (a,b,c) = EquationDroite(D);
+ (Xc,Yc) = Pt(Centre(CC));
+ R := Rayon(CC);
+ if(b=0): % si la droite est verticale
+ Xp := xpart Pt(gddA[D]);
+ A := 1;
+ B := 2*(-Yc);
+ C := Yc**2+(Xp-Xc)**2-R**2;
+ Delta := B**2-4*A*C;
+ if(Delta>0):
+ if(n=1):
+ Yp := (-B - sqrt(Delta))/(2*A);
+ elseif(n=2):
+ Yp := (-B + sqrt(Delta))/(2*A);
+ fi
+ elseif(Delta=0):
+ Yp := -B/(2*A);
+ fi
+ else:
+ if(abs(a/b)<8): % si la droite est suffisamment horizontale
+ A := 1+(-a/b)**2;
+ B := 2*((-a/b)*(-c/b-Yc)-Xc);
+ C := Xc**2+(-c/b-Yc)**2-R**2;
+ Delta := B**2-4*A*C;
+ if(Delta>0):
+ if(n=1):
+ Xp := (-B - sqrt(Delta))/(2*A);
+ Yp := (-a/b*Xp-c/b);
+ elseif(n=2):
+ Xp := (-B + sqrt(Delta))/(2*A);
+ Yp := (-a/b*Xp-c/b);
+ fi
+ elseif(Delta=0):
+ Xp := -B/(2*A);
+ Yp := -a/b*Xp-c/b;
+ else:
+ errmessage("! Intersection between line and circle does not exist")
+ fi
+ else: % sinon
+ A := 1+(b/a)**2;
+ B := 2*((b/a)*(c/a+Xc)-Yc);
+ C := Yc**2+(c/a+Xc)**2-R**2;
+ Delta := B**2-4*A*C;
+ if(Delta>0):
+ if(n=1):
+ Yp := (-B - sqrt(Delta))/(2*A);
+ Xp := (-b/a*Yp-c/a);
+ elseif(n=2):
+ Yp := (-B + sqrt(Delta))/(2*A);
+ Xp := (-b/a*Yp-c/a);
+ fi
+ elseif(Delta=0):
+ Yp := -B/(2*A);
+ Xp := -b/a*Yp-c/a;
+ else:
+ errmessage("! Intersection between line and circle does not exist")
+ fi
+ fi
+ fi
+ Point(Xp,Yp)
+enddef;
+
+
+% Inversion par rapport à un cercle -------------------------------------------
+vardef Inversion (expr P, C) =
+ save O,r,s,Cc,Pp,rr,Co,Po,ro,M,iM,R;
+ O = Centre(C);
+ r = Rayon(C);
+ if(gddT[P]="point"):
+ s = r / Longueur(P,O);
+ PairTOPoint(Pt(O) + (Pt(P) - Pt(O)) * s * s)
+ elseif(gddT[P]="cercle"):
+ Cc = Centre(P);
+ rr = Rayon(P);
+ if(Longueur(O,Cc)=rr): % si le cercle objet passe par le centre du cercle
+ % % d’inversion
+ % point du cercle sur rayon passant par les deux centre
+ M = PairTOPoint(Pt(Cc)+Pt(Cc)-Pt(O));
+ % inversion de ce point
+ iM = Inversion(M,C);
+ R = Droite(O,iM);
+ DroitePerpendiculaire(R,iM)
+ else:
+ Pp = PairTOPoint(Pt(Cc)+rr*right);
+ Co = Inversion(Cc,C);
+ Po = Inversion(Pp,C);
+ CercleCP(Co,Po)
+ fi
+ elseif(gddT[P]="droite"):
+ R = DroitePerpendiculaire(P,O);
+ iM = IntersectionDroites(R,P);
+ M = Inversion(iM,C);
+ Cc = Milieu(O,M);
+ CercleCP(Cc,O)
+ fi
+enddef;
+
+
+% Axe radical entre deux cercles -----------------------------------------------
+% drawing with metapost Thurston
+vardef AxeRadical (expr CA, CB) =
+ save O,ra,rb,d,t,C_CA,C_CB,_p,_q;
+ pair _p,_q;
+ ra = Rayon(CA);
+ rb = Rayon(CB);
+ C_CA = Centre(CA);
+ C_CB = Centre(CB);
+ d = abs(Pt(C_CA) - Pt(C_CB));
+ 2t = 1 + (ra+rb) / d * (ra-rb) / d;
+ _p := up scaled 2*gddU
+ rotated angle (Pt(C_CB) - Pt(C_CA))
+ shifted t[Pt(C_CA), Pt(C_CB)];
+ _q := down scaled 2*gddU
+ rotated angle (Pt(C_CB) - Pt(C_CA))
+ shifted t[Pt(C_CA), Pt(C_CB)];
+ Droite(_p,_q)
+enddef;
+
+% Centre radical de trois cercles ---------------------------------------------
+% drawing with metapost Thurston
+vardef CentreRadical (expr CA, CB, CC) =
+ save DAB,DAC;
+ DAB = AxeRadical(CA,CB);
+ DAC = AxeRadical(CA,CC);
+ IntersectionDroites(DAB,DAC)
+enddef;
+
+vardef Centre(expr c) =
+ % pour cercle, ellipse et polygone
+ if((gddT[c] = "ellipse") or (gddT[c] = "cercle") or (gddT[c] = "polygone") or (gddT[c] = "hyperbole")):
+ gddA[c]
+ fi
+enddef;
+
+% Chemin -----------------------------------------------------------------------
+vardef Chemin (expr p) =
+ gddT[incr gddO] = "chemin"; gddP[gddO] = p; gddO
+enddef;
+
+vardef LigneBrisee(text t)=
+ save n, _p,a,i;
+ path _p;
+ i:=0;
+ for a=t:
+ if(i=0):
+ _p:=PairImp(a);
+ else:
+ _p:=_p--PairImp(a);
+ fi
+ i:=i+1;
+ endfor;
+ Chemin(_p)
+enddef;
+
+% Courbe -----------------------------------------------------------------------
+vardef CourbeDat (expr s, c) =
+ % c = 1 ou 0, selon que la courbe doit être fermée ou pas !
+ gddT[incr gddO] = "courbe"; gddS[gddO] = s; gddA[gddO] = c; gddO
+enddef;
+
+% Homothétie ------------------------------------------------------------------
+vardef HomothetiePoint (expr p,o,k) =
+ % p : point
+ % o : centre homothetie
+ % k : facteur
+ save OP,OM;
+ pair OP,OM;
+ OP = PairImp(p)-PairImp(o);
+ OM = k*OP;
+ PairTOPoint(PairImp(o)+OM)
+enddef;
+
+
+vardef Homothetie (expr p,o,k) =
+ % p : objet
+ % o : centre homothetie
+ % k : facteur
+ save A,B,C,R,_p,X,n;
+ numeric X[];
+ pair _p;
+ if((gddT[p]="point")):
+ HomothetiePoint(p,o,k)
+ elseif((gddT[p]="vecteur")):
+ A = HomothetiePoint(p,o,k);
+ Vecteur(gddA[A],gddB[A])
+ elseif((gddT[p]="segment")):
+ A = HomothetiePoint(gddA[p],o,k);
+ B = HomothetiePoint(gddB[p],o,k);
+ Segment(A,B)
+ elseif((gddT[p]="droite")):
+ A = HomothetiePoint(gddA[p],o,k);
+ B = HomothetiePoint(gddB[p],o,k);
+ Droite(A,B)
+ elseif(gddT[p]="triangle"):
+ A = HomothetiePoint(gddA[p],o,k);
+ B = HomothetiePoint(gddB[p],o,k);
+ C = HomothetiePoint(gddC[p],o,k);
+ Triangle(A,B,C)
+ elseif(gddT[p]="cercle"):
+ A = HomothetiePoint(gddA[p],o,k);
+ R = k*Rayon(p);
+ Cercle(A,R)
+ elseif(gddT[p]="ellipse"):
+ % homothetie des foyers
+ A = HomothetiePoint(gddD[p],o,k);
+ B = HomothetiePoint(gddE[p],o,k);
+ % echelle du demi grand axe
+ R = k*gddX[p][1];
+ EllipseF(A,B,R)
+ elseif(gddT[p]="parabole"):
+ A = HomothetiePoint(Foyer(p,1),o,k);
+ B = Directrice(p,1);
+ C = Homothetie(B,o,k);
+ ParaboleFD(A,C)
+ elseif(gddT[p]="hyperbole"):
+ A = HomothetiePoint(Foyer(p,1),o,k);
+ B = Directrice(p,1);
+ C = Homothetie(B,o,k);
+ HyperboleFD(A,C)
+ elseif(gddT[p]="polygone"):
+ % reprise du constructeur
+ n = incr gddO; gddT[n] = "polygone";
+ for i=1 upto gddA[p]:
+ gddX[n][i] := HomothetiePoint(gddX[p][i],o,k);
+ endfor
+ gddA[n] := gddA[p]; % nombre de côté
+ gddB[n] := HomothetiePoint(gddB[p],o,k); % centre
+ n
+ elseif(gddT[p]="chemin"):
+ _p := PairImp(o);
+ Chemin(((gddP[p] shifted (-_p)) scaled k) shifted _p)
+ fi
+enddef;
+
+% Symétrie ------------------------------------------------------------------
+vardef SymetrieAxialePoint (expr p,d) =
+ % p : point
+ % d : axe de symétrie
+ save O,l,D;
+ O = ProjectionPointSurDroite(p,d);
+ l = Longueur(p,O);
+ D = Droite(p,O);
+ ReportSurDroite(p,D,2*l)
+enddef;
+
+
+vardef SymetrieAxiale (expr p,d) =
+ % p : objet
+ % d : axe de symétrie
+ save A,B,C,R,_p,X,n;
+ numeric X[];
+ pair _p;
+ if((gddT[p]="point")):
+ SymetrieAxialePoint(p,d)
+ elseif((gddT[p]="vecteur")):
+ A = SymetrieAxialePoint(p,d);
+ Vecteur(gddA[A],gddB[A])
+ elseif((gddT[p]="segment")):
+ A = SymetrieAxialePoint(gddA[p],d);
+ B = SymetrieAxialePoint(gddB[p],d);
+ Segment(A,B)
+ elseif((gddT[p]="droite")):
+ A = SymetrieAxialePoint(gddA[p],d);
+ B = SymetrieAxialePoint(gddB[p],d);
+ Droite(A,B)
+ elseif(gddT[p]="triangle"):
+ A = SymetrieAxialePoint(gddA[p],d);
+ B = SymetrieAxialePoint(gddB[p],d);
+ C = SymetrieAxialePoint(gddC[p],d);
+ Triangle(A,B,C)
+ elseif(gddT[p]="cercle"):
+ A = SymetrieAxialePoint(gddA[p],d);
+ R = Rayon(p);
+ Cercle(A,R)
+ elseif(gddT[p]="ellipse"):
+ % homothetie des foyers
+ A = SymetrieAxialePoint(gddD[p],d);
+ B = SymetrieAxialePoint(gddE[p],d);
+ % echelle du demi grand axe
+ R = gddX[p][1];
+ EllipseF(A,B,R)
+ elseif(gddT[p]="parabole"):
+ A = SymetrieAxialePoint(Foyer(p,1),d);
+ B = Directrice(p,1);
+ C = SymetrieAxiale(B,d);
+ ParaboleFD(A,C)
+ elseif(gddT[p]="hyperbole"):
+ A = SymetrieAxialePoint(Foyer(p,1),d);
+ B = Directrice(p,1);
+ C = SymetrieAxiale(B,d);
+ HyperboleFD(A,C)
+ elseif(gddT[p]="polygone"):
+ % reprise du constructeur
+ n = incr gddO; gddT[n] = "polygone";
+ for i=1 upto gddA[p]:
+ gddX[n][i] := SymetrieAxialePoint(gddX[p][i],d);
+ endfor
+ gddA[n] := gddA[p]; % nombre de côté
+ gddB[n] := SymetrieAxialePoint(gddB[p],d); % centre
+ n
+ fi
+enddef;
+
+% Symétrie ------------------------------------------------------------------
+vardef SymetrieCentralePoint (expr p,d) =
+ % p : point
+ % d : point centre de symétrie
+ save O,l,D;
+ RotationCentre(p,d,Pi)
+enddef;
+
+
+vardef SymetrieCentrale (expr p,d) =
+ % p : objet
+ % d : point centre de symétrie
+ save A,B,C,R,X,n;
+ numeric X[];
+ if((gddT[p]="point")):
+ SymetrieCentralePoint(p,d)
+ elseif((gddT[p]="vecteur")):
+ A = SymetrieCentralePoint(p,d);
+ Vecteur(gddA[A],gddB[A])
+ elseif((gddT[p]="segment")):
+ A = SymetrieCentralePoint(gddA[p],d);
+ B = SymetrieCentralePoint(gddB[p],d);
+ Segment(A,B)
+ elseif((gddT[p]="droite")):
+ A = SymetrieCentralePoint(gddA[p],d);
+ B = SymetrieCentralePoint(gddB[p],d);
+ Droite(A,B)
+ elseif(gddT[p]="triangle"):
+ A = SymetrieCentralePoint(gddA[p],d);
+ B = SymetrieCentralePoint(gddB[p],d);
+ C = SymetrieCentralePoint(gddC[p],d);
+ Triangle(A,B,C)
+ elseif(gddT[p]="cercle"):
+ A = SymetrieCentralePoint(gddA[p],d);
+ R = Rayon(p);
+ Cercle(A,R)
+ elseif(gddT[p]="ellipse"):
+ % homothetie des foyers
+ A = SymetrieCentralePoint(gddD[p],d);
+ B = SymetrieCentralePoint(gddE[p],d);
+ % echelle du demi grand axe
+ R = gddX[p][1];
+ EllipseF(A,B,R)
+ elseif(gddT[p]="parabole"):
+ A = SymetrieCentralePoint(Foyer(p,1),d);
+ B = Directrice(p,1);
+ C = SymetrieCentrale(B,d);
+ ParaboleFD(A,C)
+ elseif(gddT[p]="hyperbole"):
+ A = SymetrieCentralePoint(Foyer(p,1),d);
+ B = Directrice(p,1);
+ C = SymetrieCentrale(B,d);
+ HyperboleFD(A,C)
+ elseif(gddT[p]="polygone"):
+ % reprise du constructeur
+ n = incr gddO; gddT[n] = "polygone";
+ for i=1 upto gddA[p]:
+ gddX[n][i] := SymetrieCentralePoint(gddX[p][i],d);
+ endfor
+ gddA[n] := gddA[p]; % nombre de côté
+ gddB[n] := SymetrieCentralePoint(gddB[p],d); % centre
+ n
+ fi
+enddef;
+
+vardef PointDe(expr o,t)=
+ % t: paramètre le long de l’objet entre 0 et 1
+ % o: objet mpgdd
+ save _l,_t,_p;
+ path _p;
+ if((gddT[o]="point")):
+ o
+ else:
+ _p := gddTraceObjet(o);
+ _l := length(_p);
+ PointImp(point (t*_l) of _p)
+ fi
+enddef;
+
+%%% ----------------------------------------------------------------------------
+%%% Définitions liées au repère
+%%% ----------------------------------------------------------------------------
+
+% Définition de l'origine ------------------------------------------------------
+origine = Point(0,0);
+
+% Définition des axes ----------------------------------------------------------
+AxeOx = Droite(origin,right);
+AxeOy = Droite(origin,up);
+
+%%% ----------------------------------------------------------------------------
+%%% Calculs MetaPost
+%%% ----------------------------------------------------------------------------
+
+vardef mpIntersectionDroites (expr a,b,c,d) =
+ save t; pair t; t = whatever [a,b]; t = whatever [c,d]; t
+enddef;
+
+%%% --------------------------------------------------------------------------
+%%% Tracés des courbes
+%%% --------------------------------------------------------------------------
+vardef gddTraceCourbe (expr f, c) =
+ save s; gdata(f, s, if i>1:..fi (scantokens s1,scantokens s2)) if c>0:..cycle fi
+enddef;
+
+%%% ----------------------------------------------------------------------------
+%%% Tracés des objets
+%%% ----------------------------------------------------------------------------
+
+gddExtensionDroite := 10;
+
+
+def gddTracePolygone expr o=
+%show "test";
+ for i=1 upto gddB[o]:
+ PointTOPair(gddX[o][i])--
+ endfor
+ cycle
+enddef;
+
+def gddTraceEllipse expr o=
+ (fullcircle xscaled (2*gddX[o][1]) yscaled (2*gddX[o][2])) rotated gddX[o][4] shifted PairImp(gddA[o])
+enddef;
+
+def gddTraceObjet expr o =
+ if gddT[o] = "triangle":
+ PointTOPair(gddA[o])--PointTOPair(gddB[o])--
+ PointTOPair(gddC[o])--cycle
+ elseif (gddT[o] = "segment") :
+ PointTOPair(gddA[o])--PointTOPair(gddB[o])
+ elseif (gddT[o] = "vecteur"):
+ (0,0)--(gddA[o],gddB[o])
+ elseif gddT[o] = "droite":
+ (gddExtensionDroite [ PointTOPair(gddA[o]), PointTOPair(gddB[o]) ]) --
+ (gddExtensionDroite [ PointTOPair(gddB[o]), PointTOPair(gddA[o]) ])
+ elseif gddT[o] = "cercle":
+ fullcircle scaled (gddB[o]*2) shifted PointTOPair(gddA[o])
+ elseif gddT[o] = "ellipse":
+ gddTraceEllipse (o)
+ elseif ((gddT[o] = "chemin") or (gddT[o] = "parabole")):
+ gddP[o]
+ elseif gddT[o] = "courbe":
+ %message "This is a debug message.";
+ gddTraceCourbe (gddS[o] & ".dat", gddA[o])
+ elseif gddT[o] = "polygone":
+ gddTracePolygone (o)
+ fi
+enddef;
+
+def trace expr p =
+ if path p or picture p or pair p: draw (p)
+ elseif gddT[p] = "vecteur": drawarrow (gddTraceObjet p)
+ else: draw (gddTraceObjet p)
+ fi
+ gddEnPlace
+enddef;
+
+def fleche expr p =
+ if path p or picture p: drawarrow (p)
+ else: drawarrow (gddTraceObjet p)
+ fi gddEnPlace
+enddef;
+
+def colorie expr p =
+ if path p: fill p else: fill (gddTraceObjet p) fi gddEnPlace
+enddef;
+
+def fermeture expr p =
+ if path p: p else: (gddTraceObjet p) fi -- cycle
+enddef;
+
+def avecCrayon(expr t,c) = withpen pencircle scaled t withcolor c enddef;
+
+%%% --------------------------------------------------------------------------
+%%% Marque et label des points
+%%% --------------------------------------------------------------------------
+gddTaillePoint := 3; % Diamètre des cercles marquant un point.
+color gddCouleurPoint; % Couleur de fond de la marque d'un point.
+gddCouleurPoint := white;
+gddTailleLabel := 1; % Taille d'un label.
+string gddPointeType;
+gddPointeType := "pointe";
+
+
+def gddPointe(expr p) =
+ fill (fullcircle scaled gddTaillePoint) shifted (p gddEnPlace)
+ withcolor gddCouleurPoint;
+ draw (fullcircle scaled gddTaillePoint) shifted (p gddEnPlace)
+enddef;
+
+def gddDisque(expr p) =
+ fill (fullcircle scaled gddTaillePoint) shifted (p gddEnPlace)
+enddef;
+
+def gddCroix(expr p) =
+ draw (gdd_marque2 scaled (gddTaillePoint/7)) shifted (p gddEnPlace)
+enddef;
+
+def pointe expr p =
+ if(gddPointeType="pointe"):
+ gddPointe(if pair p: p else: PointTOPair(p) fi)
+ elseif(gddPointeType="croix"):
+ gddCroix(if pair p: p else: PointTOPair(p) fi)
+ elseif(gddPointeType="disque"):
+ gddDisque(if pair p: p else: PointTOPair(p) fi)
+ fi
+enddef;
+
+
+
+%%% --------------------------------------------------------------------------
+%%% Signes
+%%% --------------------------------------------------------------------------
+def SigneOrtho(expr a,b,c,x) =
+ (Pt(b) + x * unitvector(Pt(a)-Pt(b)))
+ -- (Pt(b) + x * unitvector(Pt(a) - Pt(b))
+ + x * unitvector(Pt(c) - Pt(b)))
+ -- (Pt(b) + x * unitvector(Pt(c) - Pt(b)))
+enddef;
+
+picture gdd_marque[];
+gdd_marque1 = image(draw (-7,-7)--(7,7));
+gdd_marque2 = image(draw (-7,-7)--(7,7); draw (-7,7)--(7,-7));
+gdd_marque3 = image(draw (-9,-7)--(5,7); draw (-5,-7)--(9,7);
+ draw (-7,7)--(7,-7));
+gdd_marque4 = image(draw (-9,-7)--(5,7); draw (-5,-7)--(9,7);
+ draw (-9,7)--(5,-7); draw (-5,7)--(9,-7));
+
+def Marque(expr a,b,n) =
+ gdd_marque[n] rotated angle(PairImp(b)-PairImp(a)) scaled (0.5/gddU)
+ shifted 0.5[PairImp(a),PairImp(b)]
+enddef;
+
+vardef MarqueTrait(expr s,n) =
+ save chemin;
+ path chemin;
+ if path s:
+ chemin:=s;
+ elseif(numeric s):
+ chemin:= gddTraceObjet(s)
+ fi;
+ gdd_marque[n] scaled (0.5/gddU)
+ shifted _milieuChemin(chemin,0.5)
+enddef;
+
+%%% --------------------------------------------------------------------------
+%%% Fenêtrage
+%%% --------------------------------------------------------------------------
+
+def Fenetre(expr xg,yg,xd,yd) =
+ gddXG := xg;
+ gddYB := yg;
+ gddXD := xd;
+ gddYH := yd;
+ extra_endfig := "gddFenetre;" & extra_endfig;
+enddef;
+
+def gddFenetre =
+ clip currentpicture to
+ ((gddXG,gddYB)--(gddXG,gddYH)--(gddXD,gddYH)--(gddXD,gddYB)--cycle)
+ gddEnPlace;
+ draw ((gddXG,gddYB)--(gddXG,gddYH)--(gddXD,gddYH)--(gddXD,gddYB)--cycle)
+ gddEnPlace withpen pencircle scaled 1 withcolor background;
+enddef;
+
+endinput
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-plt.mp b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-plt.mp
new file mode 100644
index 0000000000..6ab6ff7a35
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-plt.mp
@@ -0,0 +1,97 @@
+%
+% Courbe param�tr�e
+% ------------------------------------------------------------------------------
+vardef Courbe(suffix fx)(suffix fy)(expr ti,tf,n) =
+ save fpas; fpas := (tf-ti)/n;
+ (fx(ti),fy(ti)) for i=1 upto n: ..(fx(ti+i*fpas),fy(ti+i*fpas)) endfor
+enddef;
+
+%
+% Repr�sentation de fonction
+% ------------------------------------------------------------------------------
+vardef Representation(suffix f)(expr ti,tf,n) =
+ save fpas;
+ fpas := (tf-ti)/n;
+ (ti,f(ti)) for i=1 upto n: ..(ti+i*fpas,f(ti+i*fpas)) endfor
+enddef;
+
+%
+% Courbe en polaire
+% ------------------------------------------------------------------------------
+vardef CourbeEnPolaires(suffix r)(expr ti,tf,n) =
+ save fpas,t;
+ fpas := (tf-ti)/n;
+ r(ti)*(cos(ti),sin(ti))
+ for i=1 upto n: hide(t:=ti+i*fpas) .. r(t)*(cos(t),sin(t)) endfor
+enddef;
+
+%
+% Champs de vecteurs
+% ------------------------------------------------------------------------------
+vardef ChampVecteurs(suffix f)(expr x,y,px,py,dx,couleur) =
+ for i = 0 upto (x - repXmin)/px:
+ for j = 0 upto (y - repYmin)/py:
+ drawarrow
+ (((0,0)--dx*unitvector((1,f(x-i*px,y-j*py))))
+ shifted (x-i*px,y-j*py)) gddEnPlace
+ withcolor couleur;
+ endfor
+ for j = 0 upto (repYmax - y)/py:
+ drawarrow
+ (((0,0)--dx*unitvector((1,f(x-i*px,y+j*py))))
+ shifted (x-i*px,y+j*py)) gddEnPlace
+ withcolor couleur;
+ endfor
+ endfor
+ for i = 0 upto (repXmax - x)/px:
+ for j = 0 upto (y - repYmin)/py:
+ drawarrow
+ (((0,0)--dx*unitvector((1,f(x+i*px,y-j*py))))
+ shifted (x+i*px,y-j*px)) gddEnPlace
+ withcolor couleur;
+ endfor
+ for j = 0 upto (repYmax - y)/py:
+ drawarrow
+ (((0,0)--dx*unitvector((1,f(x+i*px,y+j*py))))
+ shifted (x+i*px,y+j*py)) gddEnPlace
+ withcolor couleur;
+ endfor
+ endfor
+enddef;
+
+
+%
+% Champs de vecteurs f R^2 -> R^2
+% ------------------------------------------------------------------------------
+vardef ChampVecteursDD(suffix f)(expr x,y,px,py,dx,couleur) =
+ for i = 0 upto (x - repXmin)/px:
+ for j = 0 upto (y - repYmin)/py:
+ drawarrow
+ (((0,0)--dx*unitvector(f(x-i*px,y-j*py)))
+ shifted (x-i*px,y-j*py)) gddEnPlace
+ withcolor couleur;
+ endfor
+ for j = 0 upto (repYmax - y)/py:
+ drawarrow
+ (((0,0)--dx*unitvector(f(x-i*px,y+j*py)))
+ shifted (x-i*px,y+j*py)) gddEnPlace
+ withcolor couleur;
+ endfor
+ endfor
+ for i = 0 upto (repXmax - x)/px:
+ for j = 0 upto (y - repYmin)/py:
+ drawarrow
+ (((0,0)--dx*unitvector(f(x+i*px,y-j*py)))
+ shifted (x+i*px,y-j*px)) gddEnPlace
+ withcolor couleur;
+ endfor
+ for j = 0 upto (repYmax - y)/py:
+ drawarrow
+ (((0,0)--dx*unitvector(f(x+i*px,y+j*py)))
+ shifted (x+i*px,y+j*py)) gddEnPlace
+ withcolor couleur;
+ endfor
+ endfor
+enddef;
+
+endinput;
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-rep.mp b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-rep.mp
new file mode 100644
index 0000000000..299f3086a1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-rep.mp
@@ -0,0 +1,136 @@
+picture repSavePict;
+string repSaveW;
+
+% x and y labels
+string gddXlabel;
+gddXlabel := "$x$";
+string gddYlabel;
+gddYlabel := "$y$";
+
+def Repere(expr l,h,ox,oy,ux,uy) =
+ repLargeur := l; repHauteur := h;
+ repOX := ox ; repOY := oy;
+ repXmin := - ox / ux; repXmax := repXmin + l / ux;
+ repYmin := - oy / uy; repYmax := repYmin + h / uy;
+ repUX := ux; repUY := uy;
+ repSaveW := gddW;
+ gddW := "xscaled repUX yscaled repUY shifted (repOX,repOY) scaled gddU";
+enddef;
+
+def RepereMinMax(expr xmin,xmax,ymin,ymax,ux,uy) =
+ repLargeur := (xmax-xmin)*ux; repHauteur := (ymax-ymin)*uy;
+ repOX := -xmin*ux ; repOY := -ymin*uy;
+ repXmin := xmin; repXmax := xmax;
+ repYmin := ymin; repYmax := ymax;
+ repUX := ux; repUY := uy;
+ repSaveW := gddW;
+ gddW := "xscaled repUX yscaled repUY shifted (repOX,repOY) scaled gddU";
+enddef;
+
+def Debut =
+ repSavePict := currentpicture; currentpicture := nullpicture;
+enddef;
+
+def repClip =
+ clip currentpicture to (%
+ ((0,0)--(repLargeur,0)--(repLargeur,repHauteur)--(0,repHauteur)--cycle)
+ scaled gddU);
+enddef;
+
+def repStroke (expr c) =
+ draw ((0,0)--(repLargeur,0)--(repLargeur,repHauteur)--(0,repHauteur)--cycle)
+ scaled gddU withcolor c;
+enddef;
+
+def Fin =
+ repClip;
+ addto repSavePict also currentpicture; currentpicture := repSavePict;
+ gddW := repSaveW;
+enddef;
+
+def Axes =
+ drawarrow ((repXmin,0)--(repXmax,0)) gddEnPlace;
+ drawarrow ((0,repYmin)--(0,repYmax)) gddEnPlace;
+ label.lrt(textext(gddXlabel),(repXmax,0) gddEnPlace);
+ label.ulft(textext(gddYlabel),(0,repYmax) gddEnPlace);
+enddef;
+
+def AxesBords =
+ drawarrow ((repXmin,repYmin)--(repXmax,repYmin)) gddEnPlace;
+ drawarrow ((repXmin,repYmin)--(repXmin,repYmax)) gddEnPlace;
+ label.lrt(textext(gddXlabel),(repXmax,repYmin) gddEnPlace);
+ label.ulft(textext(gddYlabel),(repXmin,repYmax) gddEnPlace);
+enddef;
+
+
+vardef Graduations =
+ save xmin, xmax, ymin, ymax;
+ xmin = round(repXmin); xmax = round(repXmax) ;
+ ymin = round(repYmin); ymax = round(repYmax) ;
+ SequenceTirets((xmin,0),(1,0),(0,-4),xmax-xmin);
+ SequenceTirets((xmin+0.5,0),(1,0),(0,-2),xmax-xmin);
+ SequenceTirets((0,ymin),(0,1),(-4,0),ymax-ymin+1);
+ SequenceTirets((0,ymin+0.5),(0,1),(-2,0),ymax-ymin);
+enddef;
+
+
+vardef GraduationsBords =
+ save xmin, xmax, ymin, ymax;
+ xmin = round(repXmin); xmax = round(repXmax) ;
+ ymin = round(repYmin); ymax = round(repYmax) ;
+ SequenceTirets((xmin,repYmin),(1,0),(0,+4),xmax-xmin);
+ SequenceTirets((xmin+0.5,repYmin),(1,0),(0,+2),xmax-xmin);
+ SequenceTirets((repXmin,ymin),(0,1),(+4,0),ymax-ymin);
+ SequenceTirets((repXmin,ymin+0.5),(0,1),(+2,0),ymax-ymin);
+enddef;
+
+def ClipRepere =
+ extra_endfig := extra_endfig & "repClip;";
+enddef;
+
+%
+% SequenceTirets
+% ------------------------------------------------------------------------------
+vardef SequenceTirets(expr o,p,t,n) text a=
+ save ot; pair ot; ot := o gddEnPlace;
+ for i:=1 upto n:
+ % tiret
+ draw ot -- (ot shifted t) a;
+ % avancement
+ ot := (o + i*p) gddEnPlace;
+ endfor
+enddef;
+
+vardef Unites(expr t) =
+ label.bot(textext("$+"&decimal(t)&"$"),(t,-(3/gddU/repUY)) gddEnPlace);
+ label.lft(textext("$+"&decimal(t)&"$"),(-(3/gddU/repUX),t) gddEnPlace);
+enddef;
+
+%vardef ValeursGraduations =
+% label.bot(textext("$+"&decimal(t)&"$"),(t,-(3/gddU/repUY)) gddEnPlace);
+% label.lft(textext("$+"&decimal(t)&"$"),(-(3/gddU/repUX),t) gddEnPlace);
+%enddef;
+%%% ----------------------------------------------------------------------------
+%%% Grille
+%%% ----------------------------------------------------------------------------
+
+def GrilleRepere =
+ save xmin, xmax, ymin, ymax;
+ xmin = floor(repXmin); xmax = floor(repXmax) ;
+ ymin = floor(repYmin); ymax = floor(repYmax) ;
+ for i:=xmin upto xmax:
+ draw ((i,ymin)--(i,ymax)) gddEnPlace;
+ endfor;
+ for i:=ymin upto ymax:
+ draw ((xmin,i)--(xmax,i)) gddEnPlace;
+ endfor;
+enddef;
+
+%%% ----------------------------------------------------------------------------
+%%% CadreRepere
+%%% ----------------------------------------------------------------------------
+def CadreRepere =
+ (repXmin,repYmin)--(repXmin,repYmax)--(repXmax,repYmax)--(repXmax,repYmin)--cycle
+enddef;
+
+endinput
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-svgnames.mp b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-svgnames.mp
new file mode 100644
index 0000000000..3a871678df
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-svgnames.mp
@@ -0,0 +1,152 @@
+color AliceBlue; AliceBlue = (.94,.972,1);
+color AntiqueWhite; AntiqueWhite = (.98,.92,.844);
+color Aqua; Aqua = (0,1,1);
+color Aquamarine; Aquamarine = (.498,1,.83);
+color Azure; Azure = (.94,1,1);
+color Beige; Beige = (.96,.96,.864);
+color Bisque; Bisque = (1,.894,.77);
+color Black; Black = (0,0,0);
+color BlanchedAlmond; BlanchedAlmond = (1,.92,.804);
+color Blue; Blue = (0,0,1);
+color BlueViolet; BlueViolet = (.54,.17,.888);
+color Brown; Brown = (.648,.165,.165);
+color BurlyWood; BurlyWood = (.87,.72,.53);
+color CadetBlue; CadetBlue = (.372,.62,.628);
+color Chartreuse; Chartreuse = (.498,1,0);
+color Chocolate; Chocolate = (.824,.41,.116);
+color Coral; Coral = (1,.498,.312);
+color CornflowerBlue; CornflowerBlue = (.392,.585,.93);
+color Cornsilk; Cornsilk = (1,.972,.864);
+color Crimson; Crimson = (.864,.08,.235);
+color Cyan; Cyan = (0,1,1);
+color DarkBlue; DarkBlue = (0,0,.545);
+color DarkCyan; DarkCyan = (0,.545,.545);
+color DarkGoldenrod; DarkGoldenrod = (.72,.525,.044);
+color DarkGray; DarkGray = (.664,.664,.664);
+color DarkGreen; DarkGreen = (0,.392,0);
+color DarkGrey; DarkGrey = (.664,.664,.664);
+color DarkKhaki; DarkKhaki = (.74,.716,.42);
+color DarkMagenta; DarkMagenta = (.545,0,.545);
+color DarkOliveGreen; DarkOliveGreen = (.332,.42,.185);
+color DarkOrange; DarkOrange = (1,.55,0);
+color DarkOrchid; DarkOrchid = (.6,.196,.8);
+color DarkRed; DarkRed = (.545,0,0);
+color DarkSalmon; DarkSalmon = (.912,.59,.48);
+color DarkSeaGreen; DarkSeaGreen = (.56,.736,.56);
+color DarkSlateBlue; DarkSlateBlue = (.284,.24,.545);
+color DarkSlateGray; DarkSlateGray = (.185,.31,.31);
+color DarkSlateGrey; DarkSlateGrey = (.185,.31,.31);
+color DarkTurquoise; DarkTurquoise = (0,.808,.82);
+color DarkViolet; DarkViolet = (.58,0,.828);
+color DeepPink; DeepPink = (1,.08,.576);
+color DeepSkyBlue; DeepSkyBlue = (0,.75,1);
+color DimGray; DimGray = (.41,.41,.41);
+color DimGrey; DimGrey = (.41,.41,.41);
+color DodgerBlue; DodgerBlue = (.116,.565,1);
+color FireBrick; FireBrick = (.698,.132,.132);
+color FloralWhite; FloralWhite = (1,.98,.94);
+color ForestGreen; ForestGreen = (.132,.545,.132);
+color Fuchsia; Fuchsia = (1,0,1);
+color Gainsboro; Gainsboro = (.864,.864,.864);
+color GhostWhite; GhostWhite = (.972,.972,1);
+color Gold; Gold = (1,.844,0);
+color Goldenrod; Goldenrod = (.855,.648,.125);
+color Gray; Gray = (.5,.5,.5);
+color Green; Green = (0,.5,0);
+color GreenYellow; GreenYellow = (.68,1,.185);
+color Grey; Grey = (.5,.5,.5);
+color Honeydew; Honeydew = (.94,1,.94);
+color HotPink; HotPink = (1,.41,.705);
+color IndianRed; IndianRed = (.804,.36,.36);
+color Indigo; Indigo = (.294,0,.51);
+color Ivory; Ivory = (1,1,.94);
+color Khaki; Khaki = (.94,.9,.55);
+color Lavender; Lavender = (.9,.9,.98);
+color LavenderBlush; LavenderBlush = (1,.94,.96);
+color LawnGreen; LawnGreen = (.488,.99,0);
+color LemonChiffon; LemonChiffon = (1,.98,.804);
+color LightBlue; LightBlue = (.68,.848,.9);
+color LightCoral; LightCoral = (.94,.5,.5);
+color LightCyan; LightCyan = (.88,1,1);
+color LightGoldenrod; LightGoldenrod = (.933,.867,.51);
+color LightGoldenrodYellow; LightGoldenrodYellow = (.98,.98,.824);
+color LightGray; LightGray = (.828,.828,.828);
+color LightGreen; LightGreen = (.565,.932,.565);
+color LightGrey; LightGrey = (.828,.828,.828);
+color LightPink; LightPink = (1,.712,.756);
+color LightSalmon; LightSalmon = (1,.628,.48);
+color LightSeaGreen; LightSeaGreen = (.125,.698,.668);
+color LightSkyBlue; LightSkyBlue = (.53,.808,.98);
+color LightSlateBlue; LightSlateBlue = (.518,.44,1);
+color LightSlateGray; LightSlateGray = (.468,.532,.6);
+color LightSlateGrey; LightSlateGrey = (.468,.532,.6);
+color LightSteelBlue; LightSteelBlue = (.69,.77,.87);
+color LightYellow; LightYellow = (1,1,.88);
+color Lime; Lime = (0,1,0);
+color LimeGreen; LimeGreen = (.196,.804,.196);
+color Linen; Linen = (.98,.94,.9);
+color Magenta; Magenta = (1,0,1);
+color Maroon; Maroon = (.5,0,0);
+color MediumAquamarine; MediumAquamarine = (.4,.804,.668);
+color MediumBlue; MediumBlue = (0,0,.804);
+color MediumOrchid; MediumOrchid = (.73,.332,.828);
+color MediumPurple; MediumPurple = (.576,.44,.86);
+color MediumSeaGreen; MediumSeaGreen = (.235,.7,.444);
+color MediumSlateBlue; MediumSlateBlue = (.484,.408,.932);
+color MediumSpringGreen; MediumSpringGreen = (0,.98,.604);
+color MediumTurquoise; MediumTurquoise = (.284,.82,.8);
+color MediumVioletRed; MediumVioletRed = (.78,.084,.52);
+color MidnightBlue; MidnightBlue = (.098,.098,.44);
+color MintCream; MintCream = (.96,1,.98);
+color MistyRose; MistyRose = (1,.894,.884);
+color Moccasin; Moccasin = (1,.894,.71);
+color NavajoWhite; NavajoWhite = (1,.87,.68);
+color Navy; Navy = (0,0,.5);
+color NavyBlue; NavyBlue = (0,0,.5);
+color OldLace; OldLace = (.992,.96,.9);
+color Olive; Olive = (.5,.5,0);
+color OliveDrab; OliveDrab = (.42,.556,.136);
+color Orange; Orange = (1,.648,0);
+color OrangeRed; OrangeRed = (1,.27,0);
+color Orchid; Orchid = (.855,.44,.84);
+color PaleGoldenrod; PaleGoldenrod = (.932,.91,.668);
+color PaleGreen; PaleGreen = (.596,.985,.596);
+color PaleTurquoise; PaleTurquoise = (.688,.932,.932);
+color PaleVioletRed; PaleVioletRed = (.86,.44,.576);
+color PapayaWhip; PapayaWhip = (1,.936,.835);
+color PeachPuff; PeachPuff = (1,.855,.725);
+color Peru; Peru = (.804,.52,.248);
+color Pink; Pink = (1,.752,.796);
+color Plum; Plum = (.868,.628,.868);
+color PowderBlue; PowderBlue = (.69,.88,.9);
+color Purple; Purple = (.5,0,.5);
+color Red; Red = (1,0,0);
+color RosyBrown; RosyBrown = (.736,.56,.56);
+color RoyalBlue; RoyalBlue = (.255,.41,.884);
+color SaddleBrown; SaddleBrown = (.545,.27,.075);
+color Salmon; Salmon = (.98,.5,.448);
+color SandyBrown; SandyBrown = (.956,.644,.376);
+color SeaGreen; SeaGreen = (.18,.545,.34);
+color Seashell; Seashell = (1,.96,.932);
+color Sienna; Sienna = (.628,.32,.176);
+color Silver; Silver = (.752,.752,.752);
+color SkyBlue; SkyBlue = (.53,.808,.92);
+color SlateBlue; SlateBlue = (.415,.352,.804);
+color SlateGray; SlateGray = (.44,.5,.565);
+color SlateGrey; SlateGrey = (.44,.5,.565);
+color Snow; Snow = (1,.98,.98);
+color SpringGreen; SpringGreen = (0,1,.498);
+color SteelBlue; SteelBlue = (.275,.51,.705);
+color Tan; Tan = (.824,.705,.55);
+color Teal; Teal = (0,.5,.5);
+color Thistle; Thistle = (.848,.75,.848);
+color Tomato; Tomato = (1,.39,.28);
+color Turquoise; Turquoise = (.25,.88,.815);
+color Violet; Violet = (.932,.51,.932);
+color VioletRed; VioletRed = (.816,.125,.565);
+color Wheat; Wheat = (.96,.87,.7);
+color White; White = (1,1,1);
+color WhiteSmoke; WhiteSmoke = (.96,.96,.96);
+color Yellow; Yellow = (1,1,0);
+color YellowGreen; YellowGreen = (.604,.804,.196);
+endinput
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-tra.mp b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-tra.mp
new file mode 100644
index 0000000000..894dff145d
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d-tra.mp
@@ -0,0 +1,44 @@
+%% === Pseudo-transparence =====================================================
+%% Code emprunté à Anthony Phan :
+%% http://www-math.univ-poitiers.fr/~phan/metalpha.html
+
+color gdd_tc;
+numeric gdd_ta;
+picture gdd_ap;
+
+def gdd_AlphaFill expr c =
+ gdd_ap := nullpicture;
+ gdd_AlphaPicture(currentpicture,c);
+ addto currentpicture also gdd_ap;
+enddef;
+
+vardef gdd_AlphaPicture(expr p,c) =
+ save p_; picture p_;
+ p_ := nullpicture;
+ addto p_ contour c withcolor gdd_ta[background,gdd_tc];
+ for p__ within p:
+ if (not clipped p__) and (not bounded p__):
+ addto p_ also p__ withcolor
+ gdd_ta[(redpart p__,greenpart p__,bluepart p__), gdd_tc];
+ else:
+ begingroup save gdd_ap;
+ picture gdd_ap; gdd_ap = nullpicture;
+ gdd_AlphaPicture(p__,pathpart p__);
+ addto p_ also gdd_ap;
+ endgroup;
+ fi
+ endfor;
+ clip p_ to c;
+ addto gdd_ap also p_;
+enddef;
+
+vardef colorieAvecTransparence(expr p,c,a) =
+ gdd_tc := c; gdd_ta := a;
+ if path p:
+ gdd_AlphaFill (p gddEnPlace)
+ else:
+ gdd_AlphaFill ((gddTraceObjet p) gddEnPlace)
+ fi
+enddef;
+
+endinput; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d.mp b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d.mp
new file mode 100644
index 0000000000..5861fd5df1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-geom2d/metapost/geom2d.mp
@@ -0,0 +1,14 @@
+%
+if not known mplib: input latexmp fi;
+
+
+input geom2d-arc;
+input geom2d-c2d;
+input geom2d-fct;
+input geom2d-lbl;
+input geom2d-plt;
+input geom2d-rep;
+input geom2d-tra;
+input geom2d-svgnames;
+input geom2d-main;
+input graph; \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-neuralnetwork/LICENSE b/graphics/metapost/contrib/macros/mp-neuralnetwork/LICENSE
new file mode 100644
index 0000000000..130ede1e51
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-neuralnetwork/LICENSE
@@ -0,0 +1,11 @@
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status “maintainedâ€.
+
diff --git a/graphics/metapost/contrib/macros/mp-neuralnetwork/README.md b/graphics/metapost/contrib/macros/mp-neuralnetwork/README.md
new file mode 100644
index 0000000000..4a77cff637
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-neuralnetwork/README.md
@@ -0,0 +1,16 @@
+# Neural Network with MetaPost
+
+This METAPOST package allows to draw artificial neural networks. It is
+based on the METAOBJ package which provides many tools to draw and
+arrange nodes.
+
+This package is in beta version—do not hesitate to report bugs, as well as
+requests for improvement.
+
+## Contact
+
+Maxime Chupin, `notezik(at)gmail.com`
+
+## Licenses
+
+This projet is under LATEX Project Public License 1.3c. \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/ctan.bib b/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/ctan.bib
new file mode 100644
index 0000000000..5ad7b88ab0
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/ctan.bib
@@ -0,0 +1,56 @@
+
+@manual{ctan-metapost,
+ title = {The \texttt{metapost} package},
+ subtitle = {A development of Metafont for creating graphics},
+ author = {{The MetaPost Team} and John Hobby},
+ date = {2021-08-26},
+ license = {lgpl},
+ url = {https://ctan.org/pkg/metapost},
+ annotation = {MetaPost uses a language based on that of
+ to produce precise
+ technical illustrations. Its output is scalable PostScript or
+ SVG, rather than the bitmaps Metafont creates.},
+}
+
+
+@manual{ctan-metaobj,
+ title = {The \texttt{metaobj} package},
+ subtitle = {MetaPost package providing high-level objects},
+ author = {Denis B. Roegel},
+ date = {2016-06-24},
+ version = {0.93},
+ license = {lppl},
+ mirror = {https://mirror.ctan.org/graphics/metapost/contrib/macros/metaobj},
+ url = {https://ctan.org/pkg/metaobj},
+}
+
+
+@manual{ctan-latexmp,
+ title = {The \texttt{latexMP} package},
+ subtitle = {Interface for \LaTeX{}-based typesetting in MetaPost},
+ author = {Jens-Uwe Morawski},
+ date = {2020-06-21},
+ version = {1.2.1},
+ license = {pd},
+ mirror = {https://mirror.ctan.org/graphics/metapost/contrib/macros/latexmp},
+ url = {https://ctan.org/pkg/latexmp},
+ annotation = {The MetaPost package latexMP implements a user-friendly
+ interface to access \LaTeX{}-based typesetting capabilities in
+ MetaPost. The text to be typeset is given as string. This
+ allows even dynamic text elements, for example counters, to be
+ used in labels. Compared to other implementations it is much
+ more flexible, since it can be used as direct replacement for
+ , and much faster, compared for example to the
+ solution provided by .},
+}
+
+@manual{ctan-metapost-colorbrewer,
+ title = {The \texttt{metapost-colorbrewer} package},
+ subtitle = {An implementation of the colorbrewer2.org colours for MetaPost},
+ author = {Toby Thurston},
+ date = {2018-09-25},
+ version = {},
+ license = {gpl3+},
+ mirror = {https://mirror.ctan.org/graphics/metapost/contrib/macros/metapost-colorbrewer},
+ url = {https://ctan.org/pkg/metapost-colorbrewer},
+} \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/fond.pdf b/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/fond.pdf
new file mode 100644
index 0000000000..22218152cc
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/fond.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-doc-en.pdf b/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-doc-en.pdf
new file mode 100644
index 0000000000..b54ddd0e6b
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-doc-en.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-doc-en.tex b/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-doc-en.tex
new file mode 100644
index 0000000000..9a789edfa6
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-doc-en.tex
@@ -0,0 +1,520 @@
+
+% LTeX: language=en
+
+% huffman : draw binary huffman trees with MetaPost/MetaObj
+%
+% Originally written by Maxime Chupin <notezik@gmail.com>,
+% 2023.
+%
+% Distributed under the terms of the GNU free documentation licence:
+% http://www.gnu.org/licenses/fdl.html
+% without any invariant section or cover text.
+
+\documentclass[english]{ltxdoc}
+
+\input{mp-neuralnetwork-preamble.tex}
+
+\usepackage[english]{babel}
+
+\makeindex[title=Command Index, columns=2]
+
+
+
+%\lstset{moredelim=*[s][\color{red}\rmfamily\itshape]{<}{>}}
+%\lstset{moredelim=*[s][\color{blue}\rmfamily\itshape]{<<}{>>}}
+
+\begin{document}
+
+\title{{\mpneural} : drawing artificial neural networks with \MP and \MO/}
+\author{Maxime Chupin, \url{notezik@gmail.com}}
+\date{\today}
+
+%% === Page de garde ===================================================
+\thispagestyle{empty}
+\begin{tikzpicture}[remember picture, overlay]
+ \node[below right, shift={(-4pt,4pt)}] at (current page.north west) {%
+ \includegraphics{fond.pdf}%
+ };
+\end{tikzpicture}%
+
+\noindent
+{\Huge \mpneural}\par\bigskip
+\noindent
+{\Large drawing artificial neural networks \\[0.2cm]with \hologo{METAPOST} and \MO/}\\[1cm]
+\parbox{0.6\textwidth}{
+ \begin{mplibcode}[mpneural]
+ input mp-neuralnetwork;
+
+
+beginfig(1);
+framed_output(false);
+framed_input(false);
+drawANN("x","n","a","p","b","q","y","m") "circmargin(3pt)";
+endfig;
+ \end{mplibcode}
+}\hfill
+\parbox{0.5\textwidth}{\Large\raggedleft
+ \textbf{Contributor}\\
+ Maxime \textsc{Chupin}\\
+ \url{notezik@gmail.com}
+}
+\vfill
+\begin{center}
+ Version 0.1, 2025, January, 27th \\
+ \url{https://gitlab.gutenberg-asso.fr/mchupin/mp-neuralnetwork}
+\end{center}
+%% == Page de garde ====================================================
+\newpage
+
+%\maketitle
+
+\begin{abstract}
+ This \hologo{METAPOST} package allows to draw artificial neural networks.
+ It is based on the \MO/ package which
+ provides many tools to draw and arrange nodes.
+\end{abstract}
+
+
+\begin{center}
+ \url{https://gitlab.gutenberg-asso.fr/mchupin/mp-neuralnetwork}
+\end{center}
+
+\tableofcontents
+
+
+
+\bigskip
+
+\begin{tcolorbox}[ arc=0pt,outer arc=0pt,
+ colback=darkred!3,
+ colframe=darkred,
+ breakable,
+ boxsep=0pt,left=5pt,right=5pt,top=5pt,bottom=5pt, bottomtitle =
+ 3pt, toptitle=3pt,
+ boxrule=0pt,bottomrule=0.5pt,toprule=0.5pt, toprule at break =
+ 0pt, bottomrule at break = 0pt,]
+ \itshape
+ This package is in beta version---do not hesitate to report bugs, as well as requests for improvement.
+\end{tcolorbox}
+
+\section{Installation}
+
+\mpneural is on \ctan{} and can also be installed via the package manager of your
+distribution.
+
+\begin{center}
+ \url{https://www.ctan.org/pkg/mp-neuralnetwork}
+\end{center}
+
+
+\subsection{With \TeX live under Linux or macOS}
+
+To install \mpneural with \TeX Live, you will have to create the directory
+\lstinline+texmf+ in your \lstinline+home+.
+
+\begin{commandshell}
+mkdir ~/texmf
+\end{commandshell}
+
+Then, you will have to place the \lstinline+neuralnetwork.mp+ and
+\lstinline+metaobj-patch.mp+\footnote{Thanks to Denis Roegel, this file define a
+\texttt{Group} object to group different \MO/ objects.
+} files in
+\begin{center}
+ \lstinline+~/texmf/metapost/mp-neuralnetwork/+
+\end{center}
+
+
+Once this is done, \mpneural will be loaded with the classic \MP{}
+input code
+\begin{mpcode}
+input mp-neuralnetwork
+\end{mpcode}
+
+\subsection{With Mik\TeX{} and Windows}
+
+These two systems are unknown to the author of \mpneural, so we
+refer you to the Mik\TeX documentation concerning the addition of local packages:
+\begin{center}
+ \url{http://docs.miktex.org/manual/localadditions.html}
+\end{center}
+
+
+
+\subsection{Dependencies}
+
+
+\mpneural depends:
+\begin{itemize}
+\item of course on \MP~\cite{ctan-metapost};
+\item on the package\package{metaobj}~\cite{ctan-metaobj};
+\item if \mpneural is not used with
+\hologo{LuaLaTeX} and the \package{luamplib} package, on the \package{latexmp}
+package\cite{ctan-latexmp};
+\item and on the package \package{colorbrewer-rgb}~\cite{ctan-metapost-colorbrewer}.
+\end{itemize}
+\section{Main Command}
+
+The package \mpneural provides one principal command that has two possible
+invocations.
+
+\subsection{Finite network}
+
+\commande|drawANN(«name1»,«size1»,«name2»,«size2», etc.)|\smallskip\index{drawANN@\lstinline+drawANN+}
+
+Each layer of the network is described by a couple \meta{name} and \meta{size}, where:
+\begin{description}
+ \item[\meta{name}:] is the names of the layers. It a
+ string, and this is the prefix of each node (for instance \lstinline+"x"+ will
+ produce nodes $x_i$).
+ \item[\meta{size}:] is the size (integer) of the layer (for instance if
+ \meta{size}$=4$, the layer will be composed by nodes $x_1$, $x_2$, $x_3$ and $x_4$).
+\end{description}
+Here, a simple example.
+\begin{ExempleMP}
+input mp-neuralnetwork
+
+beginfig(1);
+drawANN("x",4,"y",5,"z",1);
+endfig;
+\end{ExempleMP}
+
+
+\subsection{Abstract network}
+
+You can set variables for the size of each layers with the same command using
+the string notation for the size instead of an integer.
+
+\commande|drawANN(«name1»,«size1»,«name2»,«size2», etc.)|\smallskip\index{drawANN@\lstinline+drawANN+}
+
+Each layer of the network is described by a couple \meta{name} and \meta{size}, where:
+\begin{description}
+ \item[\meta{name}:] is the names of the layers. It a
+ string, and this is the prefix of each node (for instance \lstinline+"x"+ will
+ produce nodes $x_i$).
+ \item[\meta{size}:] is the notation for size (string) of the layer (for instance
+ \lstinline+"p"+, the layer will be composed by nodes $x_1$, $x_2$, $\dots$ and $x_p$).
+\end{description}
+Here, a simple example.
+\begin{ExempleMP}
+input mp-neuralnetwork
+
+beginfig(1);
+drawANN("x","m","y","n","z","p");
+endfig;
+\end{ExempleMP}
+
+The first and the last layers are composed with four nodes, and intern layers
+with five nodes.
+
+\section{Options}
+
+\mpneural allows to customize the network representation. If you want to restore
+default behaviour, you can use the following command.
+\commande|mpneural_init_values|\smallskip\index{mpneural_init_values@\lstinline+mpneural_init_values+}
+
+
+\subsection{Colors}
+
+We can see, in the previous examples, that the nodes are colored. If you do not
+want them to be colored, use the following command.
+
+\commande|colored_layers(«boolean»)|\smallskip\index{colored_layers@\lstinline+colored_layers+}
+
+\begin{description}
+ \item[\meta{boolean}:] is a \MP{} boolean (true by default) to choose if we
+ want or not colored layers.
+\end{description}
+
+If the layers are colored, \mpneural{} uses \lstinline+Spectral+ colors defined
+in \package{colorbrewer-rgb}\footnote{Up to 11 colors. If there are more layers,
+the colors cycle.}.
+
+You can also define colors for each layer using the following command.
+
+
+\commande|set_layer_colors(«layer number1»,«color1»,«layer number 1»,«color1»,etc.)|\smallskip\index{set_layer_colors@\lstinline+set_layer_colors+}
+
+\begin{description}
+ \item[\meta{layer number 1}, \meta{color1}:] is a couple with the integer of
+ the layer we want to color with \meta{color1}.
+\end{description}
+
+The rest of layers are set to white by default.
+
+For example:
+\begin{ExempleMP}
+input mp-neuralnetwork
+
+colored_layers(false);
+beginfig(1);
+drawANN("x",5,"y",1);
+endfig;
+\end{ExempleMP}
+
+and
+\begin{ExempleMP}
+input mp-neuralnetwork
+
+colored_layers(true);
+set_layer_colors(1,red,3,(0.7,0.7,0.7));
+
+beginfig(1);
+drawANN("x",5,"y",1,"z",4);
+endfig;
+\end{ExempleMP}
+
+Connections are colored. The default color is gray (\lstinline+0.4*white+) but
+you can modify that with the following command.
+
+\commande|set_connection_color(«color»)|\smallskip\index{set_connection_color@\lstinline+set_connection_color+}
+
+\begin{description}
+ \item[\meta{color}:] is the color for drawing the connections between layers
+ (default \lstinline+0.4*white+).
+\end{description}
+
+
+\subsection{Annotations}
+
+\mpneural provides some tools to annotate the network. However, because we use
+\MO/ behind the scene, you can always use \MO/ tools to draw above the graph
+build with \mpneural (see section~\ref{sec:mo}).
+
+\subsubsection{Frames}
+
+You can add frames around three different blocks: input, output and hidden
+layers.
+
+To draw a frame around these three types of layers (or stop the drawing of theses frames), you
+can use the following commands.
+
+
+\commande|framed_input(«boolean»)|\smallskip\index{framed_input@\lstinline+framed_input+}
+
+
+\commande|framed_output(«boolean»)|\smallskip\index{framed_output@\lstinline+framed_output+}
+
+
+\commande|framed_hidden(«boolean»)|\smallskip\index{framed_hidden@\lstinline+framed_hidden+}
+\begin{description}
+ \item[\meta{boolean}:] true or false (default).
+\end{description}
+
+\subsubsection{Positioning nodes}
+
+We can adjust the vertical and horizontal distance between nodes with the
+following commands.
+
+\commande|set_vspace(«distance»)|\smallskip\index{set_vspace@\lstinline+set_vspace+}
+
+\begin{description}
+ \item[\meta{distance}:] is a numeric (default \lstinline+1.5cm+).
+\end{description}
+
+
+\commande|set_hspace(«distance»)|\smallskip\index{set_hspace@\lstinline+set_hspace+}
+
+\begin{description}
+ \item[\meta{distance}:] is a numeric (default \lstinline+2.2cm+).
+\end{description}
+
+\begin{ExempleMP}
+input mp-neuralnetwork
+
+beginfig(1);
+set_vspace(2cm);
+set_hspace(3cm);
+drawANN("x",5,"u",6,"v",3,"y",2);
+endfig;
+\end{ExempleMP}
+
+\subsubsection{Labels and sections}
+
+
+First, if you do not want to label the nodes, use the following command to
+deactivate the function.
+
+\commande|show_node_labels(«boolean»)|\smallskip\index{show_node_labels@\lstinline+show_node_labels+}
+
+You can also add legends to these part of the network (independently of the
+frame draw). For that, you can use the following command.
+
+\commande|print_legends(«boolean»)|\smallskip\index{print_legends@\lstinline+print_legends+}
+\begin{description}
+ \item[\meta{boolean}:] true or false (default).
+\end{description}
+
+The default value for the legends of the three parts (input, output, and
+hidden), are \lstinline+"Input layer"+, \lstinline+"Output layer"+, and
+\lstinline+"Hidden layer(s)"+. You can modify these string with the following
+commands.
+
+
+\commande|set_input_legend(«string»)|\smallskip\index{set_input_legend@\lstinline+set_input_legend+}
+
+\commande|set_output_legend(«string»)|\smallskip\index{set_output_legend@\lstinline+set_output_legend+}
+
+\commande|set_hidden_legend(«string»)|\smallskip\index{set_hidden_legend@\lstinline+set_hidden_legend+}
+
+
+\begin{description}
+ \item[\meta{string}:] is a string for the legend (default are \lstinline+"Input layer"+, \lstinline+"Output layer"+, and
+ \lstinline+"Hidden layer(s)"+).
+\end{description}
+
+
+\begin{ExempleMP}
+input mp-neuralnetwork
+
+colored_layers(false);
+beginfig(1);
+print_legends(true);
+set_input_legend("Entrées");
+set_output_legend("Sortie");
+framed_hidden(true);
+drawANN("x",5,"u",6,"v",8,"y",2);
+endfig;
+\end{ExempleMP}
+
+You may also want to print the \emph{weights} on the network. To do that, use
+the following commands.
+\commande|print_weights(«boolean»)|\smallskip\index{print_weights@\lstinline+print_weights+}
+
+By default, weights are denoted by $w$, but you can change that with the
+following command.
+
+
+\commande|set_weights_notation(«string»)|\smallskip\index{set_weights_notation@\lstinline+set_weights_notation+}
+\begin{description}
+ \item[\meta{string}:] is a string for the weights (default is
+ \lstinline+"w"+).
+ This is a prefix: for instance, with the default value, the weights are, in
+ math mode, $w_{ij}^{(k)}$ for the $k$-th layer.
+\end{description}
+
+
+
+\begin{ExempleMP}
+input mp-neuralnetwork
+
+colored_layers(false);
+beginfig(1);
+print_legends(false);
+print_weights(true);
+drawANN("x",4,"u",6,"v",5,"y",2);
+endfig;
+\end{ExempleMP}
+
+You can add labels positioning them with relative coordinates that is $(0,0)$ at
+bottom left of the bounding box of the complete graph and $(1,1)$ at top right.
+For that, you can use the following command.
+
+\commande|labelANN(«string»)(«xpart»,«ypart») «\MO/ options»|\smallskip\index{labelANN@\lstinline+labelANN+}
+\begin{description}
+ \item[\meta{string}:] is a string for the label (process by
+ \lstinline+textext+ command).
+ \item[\meta{xpart},\meta{ypart}:] are numeric in the relative coordinates (but
+ can be lower or greater than 0 and 1.).
+\end{description}
+
+This command build a \MO/ box. It is the center of the box that is put at the
+relative coordinate. Moreover, you can add the \MO/ options at the end to
+customize the box.
+
+\begin{ExempleMP}
+input mp-neuralnetwork
+
+colored_layers(false);
+beginfig(1);
+print_legends(false);
+print_weights(true);
+drawANN("x",4,"u",6,"v",5,"y",2);
+labelANN("My fabulous network")(0.5,-0.2) "filled(true)","fillcolor((0.8,0.5,0.5))";
+endfig;
+\end{ExempleMP}
+
+
+
+
+\section{With MetaObj}\label{sec:mo}
+
+Because \mpneural is built above \MO/~\cite{ctan-metaobj}, the tools of the
+incredible package are available.
+
+The nodes of the network are \MO/ boxes, with names:
+\begin{itemize}
+\item with the prefix \texttt{ANN};
+\item the instance number of the network (useful if you draw
+multiple networks);
+\item an underscore \texttt{\_};
+\item the identifier of the layer (specified in the \lstinline+drawANN+ command);
+\item the number of the node in the layer.
+\end{itemize}
+
+The boxes of weights are named as follows:
+\begin{itemize}
+\item with the prefix \texttt{ANN};
+\item the instance number of the network (useful if you draw
+multiple networks);
+\item an underscore \texttt{\_};
+\item \texttt{weights};
+\item the number of the left layer.
+\end{itemize}
+
+The boxes of label for input, output and hidden layers are named as follows:
+\begin{itemize}
+\item with the prefix \texttt{ANN};
+\item the instance number of the network (useful if you draw
+multiple networks);
+\item an underscore \texttt{\_};
+\item \texttt{input}, \texttt{output} or \texttt{hidden}.
+\end{itemize}
+
+
+
+
+Labels generated by \lstinline+labelANN+ are also \MO/ boxes named as follows:
+\begin{itemize}
+\item with the prefix \texttt{ANN};
+\item the instance number of the network (useful if you draw
+multiple networks);
+\item an underscore \texttt{\_};
+\item \texttt{label};
+\item then the number of the label.
+\end{itemize}
+
+For example, if you draw the following network:
+\begin{mpcode}
+input mp-neuralnetwork
+
+beginfig(1);
+drawANN("x",3,"y",2);
+endfig;
+\end{mpcode}
+
+The nodes will be named \texttt{ANN1\_x1}, \texttt{ANN1\_x2}, \texttt{ANN1\_x3},
+\texttt{ANN1\_y1}, and \texttt{ANN1\_y2}. The weights will be named
+\texttt{ANN1\_weights1}.
+
+Here is a real example (this is the 10th instance of a network drawing in this
+document). \lstinline+ncline+ is a \MO/ command.
+\begin{ExempleMP}
+input mp-neuralnetwork;
+
+beginfig(1);
+ print_legends(true);
+ show_node_labels(true);
+ drawANN("x","n","a","p","b","q","y","m") "circmargin(3pt)";
+ labelANN("Test")(1.3,0.4);
+ labelANN("Test")(0.5,1.1) "framed(false)";
+ ncline(ANN10_label2)(ANN10_x2)"doubleline(true)","coilwidth(2mm)",
+ "angleA(0)",
+ "linewidth(1pt)";
+endfig;
+\end{ExempleMP}
+
+
+\printbibliography
+\printindex
+\end{document}
diff --git a/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-preamble.tex b/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-preamble.tex
new file mode 100644
index 0000000000..1d352763fb
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-neuralnetwork/doc/mp-neuralnetwork-preamble.tex
@@ -0,0 +1,188 @@
+\usepackage{tcolorbox}
+\tcbuselibrary{listings,breakable}
+%\tcbuselibrary{documentation}
+\usepackage{enumitem}
+\usepackage[tikz]{bclogo}
+\usepackage{mflogo}
+\usepackage{hologo}
+\usepackage{luamplib}
+\mplibtextextlabel{enable}
+\usepackage{biblatex}
+\addbibresource{ctan.bib}
+\usepackage{wrapfig}
+\usepackage{accsupp}
+\usepackage{siunitx}
+\usepackage{imakeidx}
+%\usepackage{csquotes}
+\usepackage{fancyvrb,xparse,xargs}
+\usepackage[sfdefault]{FiraSans}
+\usepackage[mathrm=sym]{firamath-otf}
+\setmonofont{Fira Mono}
+%\setmonofont{FiraCode-Regular.ttf}[BoldFont= FiraCode-Bold.ttf,ItalicFont= FiraCode-RegularItalic.otf,BoldItalicFont= FiraCode-BoldItalic.otf,Ligatures={NoCommon, NoDiscretionary, NoHistoric, NoRequired, NoContextual}]
+
+\usepackage{xspace}
+\usepackage{animate}
+\newcommand{\ctan}{\textsc{ctan}}
+\NewDocumentCommand{\package}{ m }{%
+ \href{https://ctan.org/pkg/#1}{#1}\xspace
+}
+
+\definecolor{darkred}{rgb}{0.6,0.1,0.1}
+\definecolor{vert}{rgb}{0.1,0.4,0.1}
+\definecolor{bleu}{rgb}{0.2,0.2,0.6}
+\definecolor{orange}{rgb}{0.6,0.4,0.}
+\colorlet{code}{blue!80!black}
+
+\usepackage[colorlinks=true,urlcolor=orange,linkcolor=orange,menucolor=black,citecolor=orange]{hyperref}
+
+\newcommand \file {\nolinkurl}
+\renewcommand \cmd {\texttt}
+\renewcommand \code [1] {\texorpdfstring {\texttt{\color{code}#1}} {#1}}
+\renewcommand*\cs [1] {\code{\textbackslash #1}}
+
+
+
+\newcommand*\commande{\par\bigskip\noindent\hspace{-30pt}%
+ \SaveVerb[aftersave={%
+ \UseVerb{Vitem}%
+ }%
+ ]{Vitem}%
+ }
+ \newcommand\vitem[1][]{\SaveVerb[%
+ aftersave={\item[\textnormal{\UseVerb[#1]{vsave}}]}]{vsave}}
+\newcommand*\textme[1]{\textcolor{black}{\rmfamily\textit{#1}}}
+%\renewcommand*\meta[1]{% % meta
+% \textme{\ensuremath{\langle}#1\ensuremath{\rangle}}}
+\newcommand*\optstar{% % optional star
+ \meta{\ensuremath{*}}\xspace}
+\DefineShortVerb{\|}
+\newcommand\R{\mathbf{R}}
+\setlength{\fboxsep}{2pt}
+\fvset{%
+ codes={\catcode`\«\active \catcode`\×\active },
+ defineactive={\makefancyog\makefancytimes},
+ formatcom=\color{darkred},
+ frame=single
+}
+% rendre «...» équivalent à \meta{...}
+{\catcode`\«\active
+ \newcommandx\makefancyog[0][addprefix=\global]{%
+ \def«##1»{\meta{##1}}}}
+% rendre × équivalent à \optstar
+{\catcode`\×\active
+ \newcommandx\makefancytimes[0][addprefix=\global]{%
+ \def×{\optstar{}}}}
+
+
+\newcommand\mpneural{\texttt{mp-neuralnetwork}\xspace}
+\usepackage{fetamont}
+\def\MO/{\textffm{META\-OBJ}}
+
+%\addbibresource{biblio.bib}
+
+
+\lstset{
+ numberstyle=\footnotesize\color{vert},
+ keywordstyle=\ttfamily\bfseries\color{bleu},
+ basicstyle=\ttfamily,
+ commentstyle=\itshape\color{vert},
+ stringstyle=\ttfamily\color{orange},
+ showstringspaces=false,
+ language=MetaPost,
+ breaklines=true,
+ breakindent=30pt,
+ defaultdialect=MetaPost,
+ classoffset=1,% frame=tb
+ morekeywords={colored_layers,
+ print_weights,
+ drawANN,
+ set_connection_color,
+ set_hidden_legend,
+ set_hspace,
+ set_input_legend,
+ set_layer_colors,
+ set_output_legend,
+ set_vspace,
+ set_weights_notation,
+ show_node_labels,
+ framed_hidden,
+ framed_input,
+ framed_output,
+ labelANN,
+ mpneural_init_values,
+ print_legends, },
+ keywordstyle=\color{darkred},
+ classoffset=2,% frame=tb
+ morekeywords={},
+ keywordstyle=\color{vert},
+ classoffset=0,% frame=tb
+ morekeywords={ncline},
+ keywordstyle=\color{bleu}
+}
+
+
+\extractcolorspecs{darkred!3}\modelcmd\colorcmd
+\makeatletter
+\tcbset{%
+ listing metapost/.code={%
+ \def\tcbuselistingtext@input{\begin{mplibcode}[mpneural] verbatimtex
+ \leavevmode etex;input mp-neuralnetwork;mpneural_init_values;background:=(\colorcmd); input \jobname.listing;
+ \end{mplibcode}}%
+ }
+}
+\makeatother
+\newtcblisting[auto counter,]{ExempleMP}[1][]{%
+ arc=0pt,outer arc=0pt,
+ colback=darkred!3,
+ colframe=darkred,
+ breakable,fontupper=\small,
+ boxsep=0pt,left=5pt,right=5pt,top=5pt,bottom=5pt, bottomtitle =
+ 3pt, toptitle=3pt,
+ boxrule=0pt,bottomrule=0.5pt,toprule=0.5pt, toprule at break =
+ 0pt, bottomrule at break = 0pt,
+ %listing side text,
+ listing metapost,
+ title=Exemple~\thetcbcounter,
+ listing options={breaklines},#1
+}
+
+\newtcblisting{commandshell}{colback=black,colupper=white,colframe=black,
+ arc=0pt,
+ listing only,boxsep=0pt,listing
+ options={style=tcblatex,language=sh},
+ every listing line={\BeginAccSupp{ActualText={}}\textcolor{red}{\small\ttfamily\bfseries user \$> }}\EndAccSupp{}}
+
+
+ \newtcblisting{mpcode}[1][]{
+ arc=0pt,outer arc=0pt,
+ colback=darkred!3,
+ colframe=darkred,
+ breakable,
+ boxsep=0pt,left=5pt,right=5pt,top=5pt,bottom=5pt, bottomtitle =
+ 3pt, toptitle=3pt,
+ boxrule=0pt,bottomrule=0.5pt,toprule=0.5pt, toprule at break =
+ 0pt, bottomrule at break = 0pt,
+ listing only,boxsep=0pt,listing
+ options={breaklines},#1
+}
+
+\newtcblisting{latexcode}{
+ arc=0pt,outer arc=0pt,
+ colback=darkred!3,
+ colframe=darkred,
+ breakable,
+ boxsep=0pt,left=5pt,right=5pt,top=5pt,bottom=5pt, bottomtitle =
+ 3pt, toptitle=3pt,
+ boxrule=0pt,bottomrule=0.5pt,toprule=0.5pt, toprule at break =
+ 0pt, bottomrule at break = 0pt,
+ listing only,boxsep=0pt,listing
+ options={breaklines,language={[LaTeX]TeX}}
+}
+
+
+\newcommand\pdf{\textsc{pdf}}
+
+\usepackage{array,booktabs}
+\usepackage{collcell}
+
+\newcolumntype{H}{>{\collectcell\lstinline}l<{\endcollectcell}} \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-neuralnetwork/metapost/mp-neuralnetwork-metaobj-patch.mp b/graphics/metapost/contrib/macros/mp-neuralnetwork/metapost/mp-neuralnetwork-metaobj-patch.mp
new file mode 100644
index 0000000000..5b07a8cd68
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-neuralnetwork/metapost/mp-neuralnetwork-metaobj-patch.mp
@@ -0,0 +1,74 @@
+%=====================================================================
+% |Group| class (DR, 4 December 2024, after idea by Maximum Chupin)
+% based on the |HBox| class
+
+% |Group|: Generic Group
+% |@#| is a name for an object (must be a suffix)
+% |@#| will be the number of the object, but will also be used
+% as a prefix for other variables.
+vardef newGroup@#(text sublist) text options =
+ ExecuteOptions(@#)(options);
+ assignObj(@#,"Group");
+ StandardInterface;
+ save n,i,eq;numeric n,i;string eq;
+ n=0;
+ forsuffixes $:=sublist:n:=n+1;endfor;
+ ObjSubArray(sb)(n); % |n| is the number of elements
+ ObjNumeric nst,leftmax,rightmax,botmax,topmax;
+ setNumeric(nst)(n);
+ i=0;
+ forsuffixes $:=sublist:i:=i+1;
+ SubObjectOfArray(sb[i],$);
+ endfor;
+ setMaxBB@#;
+ % we now build the equations:
+ % horizontal equation: horizontal space at left and right
+ eq="xpart(obj(@#sb[@#leftmax]).w-@#w)" &
+ "=xpart(@#e-obj(@#sb[@#rightmax]).e)=" &
+ decimal(OptionValue@#("dx")) & ";";
+ % vertical equation: vertical space at top and bottom
+ eq:= eq & "ypart(obj(@#sb[@#botmax]).s-@#s)" &
+ "=ypart(@#n-obj(@#sb[@#topmax]).n)=" &
+ decimal(OptionValue@#("dy")) & ";";
+ ObjCode StandardEquations,eq;
+ StandardTies;
+enddef;
+
+vardef setMaxBB@#=
+ @#leftmax:=1; % initialization of indexes
+ @#rightmax:=1;
+ @#botmax:=1;
+ @#topmax:=1;
+ for i:=2 upto @#nst:
+ if xpart(obj(@#sb[i]).w-obj(@#sb[@#leftmax]).w)<0:@#leftmax:=i;fi;
+ if xpart(obj(@#sb[i]).e-obj(@#sb[@#rightmax]).e)>0:@#rightmax:=i;fi;
+ if ypart(obj(@#sb[i]).s-obj(@#sb[@#botmax]).s)<0:@#botmax:=i;fi;
+ if ypart(obj(@#sb[i]).n-obj(@#sb[@#topmax]).n)>0:@#topmax:=i;fi;
+ endfor;
+enddef;
+
+streamline("Group")("(text sublist)","suffixlist(sublist)");
+
+def BpathGroup(suffix n)= StandardBpath(n) enddef;
+
+def drawGroup(suffix n)=
+ drawFramedOrFilledObject_(n);
+ drawObjArray(n)(sb);
+ drawMemorizedPaths_(n);
+enddef;
+
+% Default values of |Group|:
+setObjectDefaultOption("Group")("dx")(0mm);
+setObjectDefaultOption("Group")("dy")(0mm);
+setObjectDefaultOption("Group")("framed")(false);
+setObjectDefaultOption("Group")("filled")(false);
+setObjectDefaultOption("Group")("fillcolor")(black);
+setObjectDefaultOption("Group")("framewidth")(.5bp);
+setObjectDefaultOption("Group")("framecolor")(black);
+setObjectDefaultOption("Group")("framestyle")("");
+setObjectDefaultOption("Group")("shadow")(false); % no shadow by default
+setObjectDefaultOption("Group")("shadowcolor")(black);
+%---------------------------------------------------------------------------
+
+
+endinput \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mp-neuralnetwork/metapost/mp-neuralnetwork.mp b/graphics/metapost/contrib/macros/mp-neuralnetwork/metapost/mp-neuralnetwork.mp
new file mode 100644
index 0000000000..b57ef108de
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mp-neuralnetwork/metapost/mp-neuralnetwork.mp
@@ -0,0 +1,361 @@
+% Don't load this package twice:
+if known neuralnetwork_version: expandafter endinput; fi;
+
+numeric neuralnetwork_version;string neuralnetwork_date;
+neuralnetwork_version=0.1;
+neuralnetwork_date="2025/01/27";
+% The banner:
+message "******* mp-neuralnetwork " & decimal (neuralnetwork_version) &
+ " (c) Maxime Chupin (" & neuralnetwork_date & ") *******";message "";
+
+input metaobj;
+input mp-neuralnetwork-metaobj-patch;
+if not known mplib: input latexmp fi;
+input colorbrewer-rgb;
+
+interim ahangle := 40;
+interim ahlength := 2;
+
+numeric _ANN_Vspace,_ANN_Hspace;
+_ANN_Vspace:=1.5cm;
+_ANN_Hspace:=2.2cm;
+
+
+
+boolean
+_ANN_Hidden_b,_ANN_Input_b,_ANN_Output_b,_ANN_Legends_b,_ANN_show_node_labels_b,_ANN_weights_b,_ANN_abstract_b,_ANN_Legends_b,_ANN_colored_b,_ANN_user_color;
+
+string _ANN_input_legend,_ANN_output_legend, _ANN_hidden_legend;
+string _ANN_weights;
+
+numeric _ANN_instance_nbr;
+numeric _ANN_label_nbr;
+color _ANN_colors[],_ANN_connect_color;
+
+
+
+% init of colors
+for ii:=0 upto 30:
+ _ANN_colors[ii]:=white;
+endfor;
+
+_ANN_connect_color := 0.4*white;
+
+_ANN_input_legend := "Input layer";
+_ANN_output_legend := "Output layer";
+_ANN_hidden_legend := "Hidden layer(s)";
+
+_ANN_colored_b := true;
+_ANN_Legends_b:=false;
+_ANN_abstract_b:=false;
+_ANN_Hidden_b := false;
+_ANN_Input_b := false;
+_ANN_Output_b := false;
+_ANN_show_node_labels_b := true;
+_ANN_weights_b := false;
+_ANN_user_color:=false;
+_ANN_weights := "w";
+
+def mpneural_init_values=
+ _ANN_Vspace:=1.5cm;
+ _ANN_Hspace:=2.2cm;
+ _ANN_input_legend := "Input layer";
+ _ANN_output_legend := "Output layer";
+ _ANN_hidden_legend := "Hidden layer(s)";
+
+ _ANN_colored_b := true;
+ _ANN_Legends_b:=false;
+ _ANN_abstract_b:=false;
+ _ANN_Hidden_b := false;
+ _ANN_Input_b := false;
+ _ANN_Output_b := false;
+ _ANN_show_node_labels_b := true;
+ _ANN_weights_b := false;
+ _ANN_user_color:=false;
+ _ANN_weights := "w";
+ _ANN_connect_color := 0.4*white;
+enddef;
+
+
+
+
+def set_vspace(expr d)=
+ _ANN_Vspace:=d;
+enddef;
+
+def set_hspace(expr d)=
+ _ANN_Hspace:=d;
+enddef;
+def set_connection_color(expr c)=
+ _ANN_connect_color:=c;
+enddef;
+
+
+def show_node_labels(expr b)=
+ _ANN_show_node_labels_b:=b;
+enddef;
+
+def framed_input(expr b)=
+ _ANN_Input_b:=b;
+enddef;
+
+def framed_output(expr b)=
+ _ANN_Output_b:=b;
+enddef;
+
+def framed_hidden(expr b)=
+ _ANN_Hidden_b:=b;
+enddef;
+
+def print_legends(expr b)=
+ _ANN_Legends_b:=b;
+enddef;
+
+def colored_layers(expr b)=
+ _ANN_colored_b:=b;
+enddef;
+
+vardef set_layer_colors(text t)=
+ save ii,_i_layer;
+ % initialisation
+ % init of colors
+ for ii:=1 upto 30:
+ _ANN_colors[ii]:=(1,1,1);
+ endfor;
+ for c=t:
+ show(c);
+ if(numeric c):
+ _i_layer:=c;
+ elseif(color c):
+ _ANN_colors[_i_layer]:=c;
+ fi
+ endfor;
+ _ANN_user_color:=true;
+enddef;
+
+def print_weights(expr b)=
+ _ANN_weights_b:=b;
+enddef;
+
+def set_weights_notation(expr s)=
+ _ANN_weights:=s;
+enddef;
+
+
+def set_input_legend(expr s)=
+ _ANN_input_legend := s;
+enddef;
+
+def set_output_legend(expr s)=
+ _ANN_output_legend := s;
+enddef;
+
+def set_hidden_legend(expr s)=
+ _ANN_hidden_legend := s;
+enddef;
+
+
+_ANN_instance_nbr :=0;
+
+def drawANN(text t) text options=
+ % t : list of ("str1",int1,"str2",int2, etc.)
+
+ save prefixANN,_ANN_i,_ANN_i_couple,_ANN_n,_ANN_lb,_ANN_lb_int;
+ string prefixANN;
+
+ numeric _ANN_n[],_ANN_i,_ANN_i_couple;
+ string _ANN_lb[],_ANN_lb_int[];
+
+ _ANN_instance_nbr := _ANN_instance_nbr+1;
+
+ prefixANN:="ANN"&decimal(_ANN_instance_nbr);
+ _ANN_abstract_b:=false;
+ _ANN_i:=1;
+ _ANN_i_couple:=1;
+ % parsing the list
+ for x=t:
+ if(odd _ANN_i):
+ _ANN_lb[_ANN_i_couple]:=prefixANN&"_"&x;
+ else:
+ if(numeric x):
+ _ANN_n[_ANN_i_couple]:=x;
+ _ANN_i_couple:=_ANN_i_couple+1;
+ else:
+ _ANN_abstract_b:=true;
+ _ANN_n[_ANN_i_couple]:=5;
+ _ANN_lb_int[_ANN_i_couple]:=x;
+ _ANN_i_couple:=_ANN_i_couple+1;
+ fi
+ fi
+ _ANN_i:=_ANN_i+1;
+ endfor
+
+ % colors
+ if(_ANN_user_color=false):
+ for i:=1 upto _ANN_i_couple-1:
+ _ANN_colors[i]:=Spectral[min(11,_ANN_i_couple-1)][i mod 11];
+ endfor
+ fi
+
+ if(_ANN_abstract_b=true): % small size for input and output
+ _ANN_n[1]:=4;
+ _ANN_n[_ANN_i_couple-1]:=4;
+ fi
+ for i:=1 upto _ANN_i_couple -1:
+ for j:=1 upto _ANN_n[i]:
+ if( not _ANN_show_node_labels_b):
+ newCircle.scantokens(_ANN_lb[i])[j](textext("$\phantom{a}$"))
+ if(_ANN_colored_b): "filled(true)","fillcolor("&str _ANN_colors[i] &")", fi options;
+ elseif(_ANN_abstract_b): % abstract
+
+ if(j<3): % for the two first ones
+ newCircle.scantokens(_ANN_lb[i])[j](textext("$"&substring
+ (4+length(decimal(_ANN_instance_nbr)),length _ANN_lb[i]) of
+ _ANN_lb[i]&"_{"&decimal(j)&"}$")) if(_ANN_colored_b): "filled(true)","fillcolor("&str _ANN_colors[i] &")", fi options;
+ elseif(j=3): % dots
+ newBox.scantokens(_ANN_lb[i])[j](image(drawoptions(withpen
+ pencircle scaled 1bp);drawdot (0,0);drawdot
+ (0,0.1cm);drawdot
+ (0,0.2cm);drawoptions();)) if(_ANN_colored_b):
+ "filled(true)","fillcolor("&str _ANN_colors[i] &")", fi ;
+ else: % lasts
+
+ if((i=1) or (i=_ANN_i_couple-1)): %if input or output only last
+ newCircle.scantokens(_ANN_lb[i])[j](textext("$"&substring
+ (4+length(decimal(_ANN_instance_nbr)),length _ANN_lb[i]) of
+ _ANN_lb[i]&"_{"&_ANN_lb_int[i]&"}$")) if(_ANN_colored_b): "filled(true)","fillcolor("&str _ANN_colors[i] &")", fi options;
+ else:
+ if(j=4):
+ newBox.scantokens(_ANN_lb[i])[j](image(drawoptions(withpen
+ pencircle scaled 1bp);drawdot (0,0);drawdot
+ (0,0.1cm);drawdot (0,0.2cm);drawoptions();)) if(_ANN_colored_b): "filled(true)","fillcolor("&str _ANN_colors[i] &")", fi ;
+ else:
+ newCircle.scantokens(_ANN_lb[i])[j](textext("$"&substring
+ (4+length(decimal(_ANN_instance_nbr)),length _ANN_lb[i]) of
+ _ANN_lb[i]&"_{"&_ANN_lb_int[i]&"}$")) if(_ANN_colored_b): "filled(true)","fillcolor("&str _ANN_colors[i] &")", fi options;
+ fi
+ fi
+ fi
+ else:
+ newCircle.scantokens(_ANN_lb[i])[j](textext("$"&substring
+ (4+length(decimal(_ANN_instance_nbr)),length _ANN_lb[i]) of
+ _ANN_lb[i]&"_{"&decimal(j)&"}$")) if(_ANN_colored_b):
+ "filled(true)","fillcolor("&str _ANN_colors[i] &")", fi options;
+ fi
+ if(j=1):
+ if(i=1):
+ scantokens(_ANN_lb[i])[j].c = origin;
+ else:
+ scantokens(_ANN_lb[i])[j].c = scantokens(_ANN_lb[i-1])[j].c+(_ANN_Hspace,0)+(0,-(_ANN_n[i]-_ANN_n[i-1])/3.5*_ANN_Vspace);
+ fi
+ else:
+ scantokens(_ANN_lb[i])[j].n-scantokens(_ANN_lb[i])[j-1].s=(0,_ANN_Vspace);
+ fi
+ endfor
+ for j:=1 upto _ANN_n[i]:
+ drawObj(scantokens(_ANN_lb[i])[j]);
+ endfor
+ endfor
+ % group for hiddenlayer
+
+ if(_ANN_i_couple-1>3):
+ newGroup.scantokens(prefixANN)_hidden( for i:=2 upto (_ANN_i_couple-2): for j:=1 upto _ANN_n[i]:
+ scantokens(_ANN_lb[i])[j] if((i<_ANN_i_couple-2)or(j<_ANN_n[i])): , fi
+ endfor endfor) "framed(true)","dx(3pt)","dy(3pt)";
+ fi
+ if(_ANN_Hidden_b):
+ drawObj(scantokens(prefixANN)_hidden) ;
+ fi
+ % rectangle for inputlayer
+
+ if(_ANN_n[1]>1):
+ newGroup.scantokens(prefixANN)_input(for j:=1 upto _ANN_n[1]:
+ scantokens(_ANN_lb[1])[j] if(j<_ANN_n[1]): , fi
+ endfor)
+ "framed(true)","dx(3pt)","dy(3pt)";
+ else:
+ newBox.scantokens(prefixANN)_input(scantokens(_ANN_lb[1])[1]) "filled(false)","framed(true)","dx(3pt)","dy(3pt)";
+ fi
+ if(_ANN_Input_b):
+ drawObj(scantokens(prefixANN)_input);
+ fi
+
+ % rectangle for outputlayer
+
+ if(_ANN_n[_ANN_i_couple-1]>1):
+ newGroup.scantokens(prefixANN)_output(for j:=1 upto _ANN_n[_ANN_i_couple-1]:
+ scantokens(_ANN_lb[_ANN_i_couple-1])[j] if(j<_ANN_n[_ANN_i_couple-1]): , fi
+ endfor)
+ "framed(true)","dx(3pt)","dy(3pt)";
+ else:
+ newBox.scantokens(prefixANN)_output(scantokens(_ANN_lb[_ANN_i_couple-1])[1]) "filled(false)","framed(true)","dx(3pt)","dy(3pt)";
+ fi
+ if(_ANN_Output_b):
+ drawObj(scantokens(prefixANN)_output);
+ fi
+
+ % links
+ for i:=1 upto _ANN_i_couple-1:
+ if(i>1):
+ for j:=1 upto _ANN_n[i-1]:
+ for k:=1 upto _ANN_n[i]:
+ ncline(scantokens(_ANN_lb[i-1])[j])(scantokens(_ANN_lb[i])[k])
+ "linecolor(_ANN_connect_color)"
+ ;
+ endfor
+ endfor
+
+ fi
+ endfor
+ % weights
+ if(_ANN_weights_b):
+ for j:=1 upto _ANN_i_couple-2:
+ newBox.scantokens(prefixANN)_weights[j](textext("$"&_ANN_weights&"_{ij}^{("&decimal(j)&")}$"));
+ scantokens(prefixANN)_weights.[j].c=1/4*(scantokens(_ANN_lb[j])[1].c+scantokens(_ANN_lb[j])[_ANN_n[j]].c+scantokens(_ANN_lb[j+1])[1].c+scantokens(_ANN_lb[j+1])[_ANN_n[j+1]].c);
+ drawObj(scantokens(prefixANN)_weights[j]);
+ endfor;
+ fi
+ % labels
+ if(_ANN_Legends_b):
+ newBox.scantokens(prefixANN)_legend_input(textext(_ANN_input_legend)) "framed(false)";
+ scantokens(prefixANN)_legend_input.n=scantokens(prefixANN)_input.s;
+ drawObj(scantokens(prefixANN)_legend_input);
+ newBox.scantokens(prefixANN)_legend_output(textext(_ANN_output_legend)) "framed(false)";
+ scantokens(prefixANN)_legend_output.n=scantokens(prefixANN)_output.s;
+ drawObj(scantokens(prefixANN)_legend_output);
+
+ if(_ANN_i_couple-1>3):
+ newBox.scantokens(prefixANN)_legend_hidden(textext(_ANN_hidden_legend)) "framed(false)";
+ scantokens(prefixANN)_legend_hidden.n=scantokens(prefixANN)_hidden.s;
+ drawObj(scantokens(prefixANN)_legend_hidden);
+ fi
+ fi
+ % build global group
+ newGroup.scantokens(prefixANN)_global(for i:=1 upto (_ANN_i_couple-1): for j:=1 upto _ANN_n[i]:
+ scantokens(_ANN_lb[i])[j] if((i<_ANN_i_couple-1)or(j<_ANN_n[i])): , fi
+ endfor endfor);
+enddef;
+
+
+_ANN_label_nbr:=0;
+vardef labelANN(expr s)(expr a,b) text options=
+ % s: string for the label
+ % (a,b): point at which put the label in relative coordinate, that is
+ % $(0,0)$ at bottom left of the bounding box of the complete graph and
+ % $(1,1)$ at top right.
+
+ save _xmin, _xmax, _ymin,_ymax;
+ save prefixANN;
+ string prefixANN;
+ _ANN_label_nbr:=_ANN_label_nbr+1;
+
+ prefixANN:="ANN"&decimal(_ANN_instance_nbr);
+ (_xmin,_ymin)=scantokens(prefixANN)_global.sw;
+ (_xmax,_ymax)=scantokens(prefixANN)_global.ne;
+ newBox.scantokens(prefixANN)_label scantokens(decimal(_ANN_label_nbr))(textext(s)) options;
+ scantokens(prefixANN)_label
+ scantokens(decimal(_ANN_label_nbr)).c=(_xmin+a*(_xmax-_xmin),_ymin+b*(_ymax-_ymin));
+ drawObj(scantokens(prefixANN)_label scantokens(decimal(_ANN_label_nbr)));
+enddef;
+
+endinput \ No newline at end of file
diff --git a/graphics/metapost/contrib/macros/mpchess/README.md b/graphics/metapost/contrib/macros/mpchess/README.md
index 296db6d543..9156971db3 100644
--- a/graphics/metapost/contrib/macros/mpchess/README.md
+++ b/graphics/metapost/contrib/macros/mpchess/README.md
@@ -71,7 +71,7 @@ A piece set has been designed for this package. It has also be added to
A dedicated git repository is available:
[https://plmlab.math.cnrs.fr/mchupin/mpchess-pieces](https://plmlab.math.cnrs.fr/mchupin/mpchess-pieces)
and
-[https://github.com/chupinmaxime/mpchess](https://github.com/chupinmaxime/mpchess).
+[https://github.com/chupinmaxime/mpchess-pieces](https://github.com/chupinmaxime/mpchess-pieces).
A TrueType font is available.
## Contact
diff --git a/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-en.pdf b/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-en.pdf
index 741544029e..bfde99b627 100644
--- a/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-en.pdf
+++ b/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-en.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-en.tex b/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-en.tex
index 5ad5abdb1a..e11a860be4 100644
--- a/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-en.tex
+++ b/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-en.tex
@@ -68,8 +68,8 @@
}
\vfill
\begin{center}
- Version 0.7, 2023, July, 20th \\
- \url{https://plmlab.math.cnrs.fr/mchupin/mpchess}
+ Version 0.9, 2024, Decembre, 16th \\
+ \url{https://gitlab.gutenberg-asso.fr/mchupin/mpchess}
\end{center}
%% == Page de garde ====================================================
\newpage
@@ -86,7 +86,7 @@
\begin{center}
- \url{https://plmlab.math.cnrs.fr/mchupin/mpchess}
+ \url{https://gitlab.gutenberg-asso.fr/mchupin/mpchess}
\url{https://github.com/chupinmaxime/mpchess}
\end{center}
@@ -297,7 +297,9 @@ command:
\item \lstinline+"GreenLichess"+;
\item \lstinline+"PinkPyramidalLichess"+;
\item \lstinline+"Wood"+;
-\item or \lstinline+"Classical"+.
+\item \lstinline+"Classical"+;
+\item \lstinline+"Dotted"+;
+\item or \lstinline+"User"+;
\end{itemize}
\end{description}
@@ -359,11 +361,41 @@ The table~\ref{tab:color} shows the different results of the different themes.
draw backboard;
endfig;
\end{mplibcode}\\
+\lstinline+"Dotted"+ theme& \\
+\begin{mplibcode}
+ input mpchess
+ beginfig(0);
+ init_chessboard;
+ set_backboard_width(4cm);
+ set_color_theme("Dotted");
+ init_backboard;
+ draw backboard;
+ endfig;
+\end{mplibcode}&\\
\end{tabular}
\caption{The different color themes provided by \mpchess.}\label{tab:color}
\end{table}
-
+The use of \lstinline+"User"+ is a special case, as it allows you to
+define black and white squares. For this to work
+a another macro
+\lstinline+buildUserSquare+\index{buildUserSquare@\lstinline+buildUserSquare+}
+should be difined. It must build the
+images (\lstinline+picture+) \lstinline+_blackSquarePic+\index{_blackSquarePic@\lstinline+_blackSquarePic+} and
+\lstinline+_whiteSquarePic+\index{_whiteSquarePic@\lstinline+_whiteSquarePic+}.
+Here is a prototype of such a command.
+\begin{mpcode}
+ def buildUserSquare(expr _SquareUnit)=
+ _blackSquarePic:=image(
+ fill (unitsquare scaled _SquareUnit) withcolor red;
+ );
+ _whiteSquarePic:=image(
+ fill unitsquare scaled _SquareUnit withcolor green;
+ );
+ enddef;
+\end{mpcode}
+The macro takes a unit as argument, and must construct two squares with length
+equal to this unit.
\subsubsection{Configuring a Personal Color Theme}
@@ -654,6 +686,64 @@ in version 0.6, \lstinline+set_whos_to_move+ and
\commande|hide_whos_to_move|\index{hide_whos_to_move@\lstinline+hide_whos_to_move+}\smallskip
+It is now possible to change the appearance of the marker (since
+version 0.9\footnote{Thanks to Udi Fogiel for fixing a placement bug and
+for suggesting improvements.}. For this purpose, \mpchess provides three styles:
+\lstinline+"triangle"+ (default), \lstinline+"square"+ and \lstinline+"disk"+.
+To select the marker type, use the following command:
+
+\commande|set_marker_type(«string»)|\index{set_marker_type@\lstinline+set_marker_type+}\smallskip
+
+\begin{description}
+ \item[\meta{string}] may be
+\begin{itemize}
+ \item \lstinline+"triangle"+ (default value);
+ \item \lstinline+"square"+;
+\item \lstinline+"disk"+;
+\item \lstinline+"custom"+.
+\end{itemize}
+\end{description}
+
+You can adjust the size (by a factor of the unit dimension) with the following
+command:
+
+\commande|set_marker_scale(«numeric»)|\index{set_marker_scale@\lstinline+set_marker_scale+}\smallskip
+
+\begin{description}
+ \item[\meta{numeric}:] is a unit dimension factor for enlarging or
+ shrink the mark (default value is \num{0.35}).
+\end{description}
+
+The \lstinline+"custom"+ marker type value lets you define the marker's
+appearance. When this option is called, a
+macro \MP{} \lstinline+custom_maker(expr s,r)+ must be defined. The
+\lstinline+s+ parameter is the scale factor setting: the markers supplied by
+\mpchess are drawings contained in a square of side 1 (\MP{} unit) and scaled
+by \lstinline+s*_chessSquareU+. The \lstinline+r+ parameter is a boolean that
+handles the case where the marker is rotated 180 degrees
+when placed at the top of the chessboard.
+
+For example, a \lstinline+custom_marker+ macro reproducing the triangle symbol might be as follows:
+\begin{mpcode}
+def custom_marker(expr s, r)=
+ ((0,0)--(1,0)--(0.5,0.5)--cycle) if r: rotatedaround((0.5, 0.5/3), 180) fi scaled (s*_chessSquareU)
+enddef;
+\end{mpcode}
+
+Only the outline is defined, which will be filled by either white or black.
+
+
+\begin{ExempleMP}
+input mpchess
+beginfig(0);
+set_marker_type("disk");
+set_marker_scale(0.5);
+init_backboard;
+draw backboard;
+init_chessboard;
+draw chessboard;
+endfig;
+\end{ExempleMP}
\subsection{Draw a Position}
The commands described below allow you to build a position in several ways
@@ -1448,8 +1538,14 @@ endfig;
\section{History}
\begin{description}
-\item[v0.7, juillet 2023:] Black knight adjustment, adding color board themes (\lstinline+GreenLichess+, \lstinline+PinkPyramidalLichess+,
-\lstinline+Wood+ with color type (\lstinline+set_board_type+).
+\item[v0.9, December 16, 2024:] Correction of a bug in the placement of the
+trait marker (by Udi Fogiel), added different marker features (\lstinline
++"triangle"+, \lstinline+"square"+,\lstinline+"disk"+ and \lstinline+"custom"+). Filling of the white marker.
+\item[v0.8, October 26, 2024:] Adding \lstinline+"Dotted"+ board theme, and
+\lstinline+"User"+ board theme that allows user to define black and white
+squares.
+\item[v0.7, July, 2023:] Black knight adjustment, adding color board themes (\lstinline+GreenLichess+, \lstinline+PinkPyramidalLichess+,
+\lstinline+Wood+ with color type (\lstinline+set_board_type+)).
\item[v0.6, April 26, 2023:] Fixed bugs concerning castling management, and
moves ambiguities in \textsc{pgn} format.
Changed \lstinline+set_white_color+ to
@@ -1461,8 +1557,6 @@ Changed \lstinline+set_white_color+ to
\lstinline+hide_whos_to_move+. Change \lstinline+set_coords_inside+ and
\lstinline+set_coords_outside+ to \lstinline+set_coordinates_position+.
Change \lstinline+set_coords_font+ to \lstinline+set_coordinates_font+.
-
-Translated with www.DeepL.com/Translator (free version)
\item[v0.5, April 20, 2023:] Bug fixed, \textbf{changing the
default piece set} for the \lstinline+mpchess+ set (which has been added to Lichess), added TrueType font, and updated documentation.
\item[v0.4, April 6, 2023:] Corrections in the documentation, especially the
diff --git a/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.pdf b/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.pdf
index bcca5a85f9..4f133242cc 100644
--- a/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.pdf
+++ b/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.tex b/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.tex
index db6a5f8b86..5a5b0bdf6c 100644
--- a/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.tex
+++ b/graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.tex
@@ -71,8 +71,8 @@
}
\vfill
\begin{center}
- Version 0.7, 20 juillet 2023 \\
- \url{https://plmlab.math.cnrs.fr/mchupin/mpchess}
+ Version 0.9, 16 décembre 2024 \\
+ \url{https://gitlab.gutenberg-asso.fr/mchupin/mpchess}
\end{center}
%% == Page de garde ====================================================
\newpage
@@ -89,7 +89,7 @@ excellent packages \LaTeX{}.
\begin{center}
- \url{https://plmlab.math.cnrs.fr/mchupin/mpchess}
+ \url{https://gitlab.gutenberg-asso.fr/mchupin/mpchess}
\url{https://github.com/chupinmaxime/mpchess}
\end{center}
@@ -292,11 +292,13 @@ Plusieurs thèmes de couleurs sont accessibles. Pour choisir un thème de couleu
\item \lstinline+"GreenLichess"+;
\item \lstinline+"PinkPyramidalLichess"+;
\item \lstinline+"Wood"+;
-\item ou \lstinline+"Classical"+.
+\item \lstinline+"Classical"+;
+\item \lstinline+"Dotted"+;
+\item ou \lstinline+"User"+.
\end{itemize}
\end{description}
-Les exemples suivants montrent les résultats obtenus.
+Les exemples suivants montrent les résultats obtenus pour les thèmes prédéfinis.
\begin{ExempleMP}
input mpchess
beginfig(0);
@@ -355,10 +357,40 @@ Thème \lstinline+"PinkPyramidalLichess"+&Thème \lstinline+"Wood"+\\
draw backboard;
endfig;
\end{mplibcode}\\
+Thème \lstinline+"Dotted"+&\\
+\begin{mplibcode}
+ input mpchess
+ beginfig(0);
+ init_chessboard;
+ set_backboard_width(4cm);
+ set_color_theme("Dotted");
+ init_backboard;
+ draw backboard;
+ endfig;
+\end{mplibcode}&\\
\end{tabular}
\caption{Les différents thèmes de couleur fournis par \mpchess.}\label{tab:color}
\end{table}
+L’utilisation de \lstinline+"User"+ est un cas particulier, car il permet de
+définir soit même les casses noires et blanches. Pour que cela fonctionne, il
+faut définir en plus une macro \lstinline+buildUserSquare+\index{buildUserSquare@\lstinline+buildUserSquare+} qui construit les
+images (\lstinline+picture+) internes \lstinline+_blackSquarePic+\index{_blackSquarePic@\lstinline+_blackSquarePic+} et
+\lstinline+_whiteSquarePic+\index{_whiteSquarePic@\lstinline+_whiteSquarePic+} dont voici un prototype :
+\begin{mpcode}
+def buildUserSquare(expr _SquareUnit)=
+ _blackSquarePic:=image(
+ fill (unitsquare scaled _SquareUnit) withcolor red;
+ );
+ _whiteSquarePic:=image(
+ fill unitsquare scaled _SquareUnit withcolor green;
+ );
+enddef;
+\end{mpcode}
+La macro prend en argument une unité, et doit construire deux carrés de côté
+cette unité.
+
+
\subsubsection{Configuration d’un thème personnel}
\paragraph{Couleurs.}
@@ -637,6 +669,67 @@ lors du passage à la version 0.6, \lstinline+set_whos_to_move+ et
\commande|hide_whos_to_move|\index{hide_whos_to_move@\lstinline+hide_whos_to_move+}\smallskip
+Il est désormais possible de changer l’apparence du marqueur de trait (depuis la
+version 0.9\footnote{Merci à Udi Fogiel d’avoir corrigé un bug de placement et
+d’avoir proposé des améliorations.}). Pour cela, \mpchess fournit trois styles:
+\lstinline+"triangle"+ (par défaut), \lstinline+"square"+ et \lstinline+"disk"+.
+Pour choisir le type de marquer, on utilisera la commande suivante:
+
+
+\commande|set_marker_type(«string»)|\index{set_marker_type@\lstinline+set_marker_type+}\smallskip
+
+\begin{description}
+ \item[\meta{string}:] peut valoir:
+\begin{itemize}
+ \item \lstinline+"triangle"+ (valeur par défaut) ;
+ \item \lstinline+"square"+;
+\item \lstinline+"disk"+;
+\item \lstinline+"custom"+.
+\end{itemize}
+\end{description}
+
+Vous pouvez ajuster la taille (par un facteur de la dimension d’unité) avec la
+commande suivante:
+
+\commande|set_marker_scale(«numeric»)|\index{set_marker_scale@\lstinline+set_marker_scale+}\smallskip
+
+\begin{description}
+ \item[\meta{numeric}:] est un facteur de la dimension d’unité pour agrandir ou
+ rétrécir le marquer (la valeur par défaut est \num{0.35}).
+\end{description}
+
+La valeur \lstinline+"custom"+ du type de marqueur permet de définir soi même
+l’apparence du marqueur. Lorsque cette option est appelée, il faut définir une
+macro \MP{} \lstinline+custom_maker(expr s,r)+. Le paramètre \lstinline+s+ est
+le réglage du facteur d’échelle : pour les marqueurs fournis par \mpchess, ce
+sont des dessins contenus dans un carré de côté 1 (unité \MP) est mis à
+l’échelle par \lstinline+s*_chessSquareU+. Le paramètre \lstinline+r+ est un
+booléen qui permet de traiter le cas où le marqueur est tourné de 180 degrés
+lorsqu’il est placé en haut de l’échiquier.
+
+Par exemple, une macro \lstinline+custom_marker+ reproduisant le symbole en
+triangle pourrait être la suivante:
+\begin{mpcode}
+def custom_marker(expr s, r)=
+ ((0,0)--(1,0)--(0.5,0.5)--cycle) if r: rotatedaround((0.5, 0.5/3), 180) fi scaled (s*_chessSquareU)
+enddef;
+\end{mpcode}
+
+On ne définit que le contour qui sera, suivant le cas, colorié en blanc ou en
+noir.
+
+\begin{ExempleMP}
+input mpchess
+beginfig(0);
+set_marker_type("disk");
+set_marker_scale(0.5);
+init_backboard;
+draw backboard;
+init_chessboard;
+draw chessboard;
+endfig;
+\end{ExempleMP}
+
\subsection{Dessiner une position}
Les commandes décrites ci-dessous permet de construire une position de plusieurs
@@ -1424,6 +1517,13 @@ endfig;
\section{Historique}
\begin{description}
+ \item[v0.9, 16 décembre 2024:] Correction d’un bug de placement de la marque
+ de trait (par Udi Fogiel), ajout de différents marqueur de traits (\lstinline"triangle",
+ \lstinline"square",\lstinline"disk" and \lstinline"custom"). Colloriage du
+ marqueur blanc.
+ \item[v0.8, 26 octobre 2024:] Ajout du thème d’échiquier \lstinline+"Dotted"+
+ et ajout du thème d’échiquier \lstinline+"User"+ qui permet à l’utilisateur ou
+ l’utilisatrice de définir les casses blanches et noires.
\item[v0.7, juillet 2023:] Ajustement du cavalier noir, ajout de thèmes
d'échiquier (\lstinline+GreenLichess+, \lstinline+PinkPyramidalLichess+,
\lstinline+Wood+ avec des types de coloriage (\lstinline+set_board_type+).
diff --git a/graphics/metapost/contrib/macros/mpchess/doc/mpchess-preamble.tex b/graphics/metapost/contrib/macros/mpchess/doc/mpchess-preamble.tex
index 6a7f11d747..01428cc16b 100644
--- a/graphics/metapost/contrib/macros/mpchess/doc/mpchess-preamble.tex
+++ b/graphics/metapost/contrib/macros/mpchess/doc/mpchess-preamble.tex
@@ -97,7 +97,7 @@
set_no_coords,set_white_view,set_black_view,
set_white_player,set_black_player,set_pieces_theme,set_players_side,init_chessboard,set_empty_chessboard,add_white_pieces,add_black_pieces,clear_areas,clear_files,clear_ranks,clear_squares,build_chessboard_from_fen,build_chessboards_from_pgn,clear_chessboard,
color_square,draw_arrows,draw_circles,draw_comment,draw_crosses,get_halfmove_number,get_totalmove_number,
- reset_mpchess,set_black_to_move,set_last_move_color,set_comment_color,set_white_to_move,set_whos_to_move,show_last_move,unset_whos_to_move,set_arrow_width,clip_chessboard,build_chessboard_from_fen_file,build_chessboard_from_pgn_file,draw_black_main_lines,draw_black_main_lines_step,draw_white_main_lines,draw_white_main_lines_step,set_main_lines_color,set_possible_moves_color,show_possible_moves,show_possible_moves_step,hide_coordinates,hide_whos_to_move,set_black_squares_color,set_coordinates_font,set_coordinates_position,set_white_squares_color,show_coordinates,show_whos_to_move,set_board_type},
+ reset_mpchess,set_black_to_move,set_last_move_color,set_comment_color,set_white_to_move,set_whos_to_move,show_last_move,unset_whos_to_move,set_arrow_width,clip_chessboard,build_chessboard_from_fen_file,build_chessboard_from_pgn_file,draw_black_main_lines,draw_black_main_lines_step,draw_white_main_lines,draw_white_main_lines_step,set_main_lines_color,set_possible_moves_color,show_possible_moves,show_possible_moves_step,hide_coordinates,hide_whos_to_move,set_black_squares_color,set_coordinates_font,set_coordinates_position,set_white_squares_color,show_coordinates,show_whos_to_move,set_board_type,buildUserSquare,_blackSquarePic,_whiteSquarePic,set_marker_scale,set_marker_type},
keywordstyle=\color{darkred},
classoffset=2,% frame=tb
morekeywords={backboard,chessboard,chessboard_step},
diff --git a/graphics/metapost/contrib/macros/mpchess/metapost/mpchess.mp b/graphics/metapost/contrib/macros/mpchess/metapost/mpchess.mp
index 3883ca0bc3..59cf31a8c5 100644
--- a/graphics/metapost/contrib/macros/mpchess/metapost/mpchess.mp
+++ b/graphics/metapost/contrib/macros/mpchess/metapost/mpchess.mp
@@ -2,7 +2,7 @@
%% mpchess.mp %%
%% draw chessboards with metapost %%
%% notezik@gmail.com %%
-%% Version 0.7 (juillet 2023) %%
+%% Version 0.9 (decembre 2024) %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This work may be distributed and/or modified under the conditions of
@@ -12,9 +12,21 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Don't load this package twice:
+if known mpchess_version: expandafter endinput; fi;
+
+numeric mpchess_version;string mpchess_date;
+mpchess_version=0.9;
+mpchess_date="2024/12/16";
+% The banner:
+message "******* mpchess " & decimal (mpchess_version) &
+ " (c) Maxime Chupin (" & mpchess_date & ") *******";message "";
+
%input format;
input hatching;
+%input minim-mp;
+%input minim-hatching;
input mpchess-pieces; % piece of mpchess package
input mpchess-cburnett; % piece of lichess cburnett
input mpchess-skak; % piece of skak package
@@ -258,6 +270,27 @@ def _buildClassicalSquare(expr _SquareUnit)=
);
enddef;
+def _buildDottedSquare(expr _SquareUnit)=
+ _blackSquarePic:=image(
+ fill (unitsquare scaled _SquareUnit) withcolor white;
+ save N;
+ N:= 11;
+ for i:=0 upto N+1:
+ for j:=0 upto N+1:
+ fill (fullcircle shifted (1/N*i*_SquareUnit if odd(j): +1/(2*N)*_SquareUnit fi,1/N*j*_SquareUnit))
+ ;
+ endfor;
+ endfor;
+ draw (unitsquare scaled _SquareUnit);
+ clip currentpicture to (unitsquare scaled _SquareUnit);
+ );
+ _whiteSquarePic:=image(
+ fill unitsquare scaled _SquareUnit withcolor white;
+ draw (unitsquare scaled _SquareUnit);
+ clip currentpicture to (unitsquare scaled _SquareUnit);
+ );
+enddef;
+
% default theme lichess blue
_blackSquarePic:=_blackSquareColoredPic;
_whiteSquarePic:=_whiteSquareColoredPic;
@@ -287,6 +320,9 @@ def set_color_theme(expr t)=
elseif(t="Classical"):
_blackColorSquare:=black;
_whiteColorSquare:=black;
+ elseif(t="Dotted"):
+ _blackColorSquare:=black;
+ _whiteColorSquare:=black;
fi
enddef;
@@ -561,6 +597,10 @@ _chessSquareU:=_chessWidth/_chessSize;
_init_piece(_chessSquareU);
if(_chessTheme="Classical"):
_buildClassicalSquare(_chessSquareU);
+elseif(_chessTheme="Dotted"):
+ _buildDottedSquare(_chessSquareU);
+elseif(_chessTheme="User"):
+ buildUserSquare(_chessSquareU);
else: % colored themes
_buildColoredSquare(_chessSquareU,_blackColorSquare,_whiteColorSquare);
fi
@@ -704,9 +744,7 @@ def _int_to_piece(expr i)=
fi
enddef;
-def _triangle(expr s)=
- ((0,0)--(1,0)--(0.5,0.5)--cycle) scaled (s*_chessSquareU)
-enddef;
+
color _chess_last_move_color;
@@ -734,6 +772,72 @@ def show_last_move(expr k)=
enddef;
+%% markers
+
+numeric _marker_size;
+
+_marker_size := 0.35;
+
+def set_marker_scale(expr s)=
+ _marker_size:=s;
+enddef;
+
+def _triangle_marker(expr s, r)=
+ ((0,0)--(1,0)--(0.5,0.5)--cycle) if r: rotatedaround((0.5, 0.5/3), 180) fi scaled (s*_chessSquareU)
+enddef;
+
+def _square_marker(expr s, r)=
+ ((0,0)--(1,0)--(1,1)--(0,1)--cycle) scaled (s*_chessSquareU)
+enddef;
+
+
+def _disk_marker(expr s, r)=
+ (fullcircle shifted (0.5,0.5)) scaled (s*_chessSquareU)
+enddef;
+
+string _marker_type;
+
+_marker_type := "triangle";
+
+def _marker(expr s,r)=
+ if(_marker_type="square"):
+ _square_marker(s,r)
+ elseif(_marker_type="disk"):
+ _disk_marker(s,r)
+ elseif(_marker_type="custom"):
+ custom_marker(s,r)
+ else:
+ _triangle_marker(s,r)
+ fi
+enddef;
+
+def set_marker_type(expr s)=
+ _marker_type:=s;
+enddef;
+
+
+vardef _draw_marker(expr c,b)=
+ % c : black or white (color)
+ % b : true or false for placing top (with rotation) or bottom
+ save _height,_width,_pic,_shifted,_margin;
+ picture _pic;
+ pair _shifted;
+ _pic := image(draw _marker(_marker_size,false););
+ _height := abs(ulcorner _pic - llcorner _pic);
+ _width := abs(urcorner _pic-ulcorner _pic);
+ _margin:=0.01*_chessSquareU;
+ if(b): % top rotating
+ _shifted:= (_chessSquareU*_chessSize+_width/2.0+_margin,_chessSquareU*_chessSize);
+ else:
+ _shifted:= (_chessSquareU*_chessSize+_width/2.0+_margin,-_height);
+ fi
+ draw _marker(_marker_size,b) shifted _shifted ;
+ fill _marker(_marker_size,b) shifted _shifted withcolor c;
+enddef;
+
+%%%% end markers
+
+
vardef _chess_build_chessboard_pic(expr k)=
save chessboard_pic;
save shiftPiece;
@@ -756,15 +860,15 @@ vardef _chess_build_chessboard_pic(expr k)=
if(_show_whos_to_move):
if(_chess_view_wb): %white side
if(not _white_to_move):
- fill _triangle(0.3) rotated 180 shifted (_chessSquareU*(_chessSize+0.35),_chessSquareU*(_chessSize)+0.3*_chessSquareU)
+ _draw_marker(black,true);
else:
- draw _triangle(0.35) shifted (_chessSquareU*(_chessSize+0.3),-0.3*_chessSquareU) ;
+ _draw_marker(white,false);
fi
else: % black side
if(_white_to_move):
- draw _triangle(0.3) rotated 180 shifted (_chessSquareU*(_chessSize+0.35),_chessSquareU*(_chessSize)+0.3*_chessSquareU)
+ _draw_marker(white,true);
else:
- fill _triangle(0.35) shifted (_chessSquareU*(_chessSize+0.3),-0.3*_chessSquareU) ;
+ _draw_marker(black,false);
fi
fi
fi
@@ -1067,4 +1171,4 @@ def draw_comment(expr ind, pos)=
else:
draw _img scaled (_commentScale*_chessSquareU/max(_width,_height)) shifted ((8+1-_letter)*_chessSquareU-0.15*(_chessSquareU-_width),(8+1-_nbr)*_chessSquareU-0.15*_chessSquareU);
fi
-enddef; \ No newline at end of file
+enddef;
diff --git a/graphics/pgf/contrib/aiplans/Aiplans-Introduction.pdf b/graphics/pgf/contrib/aiplans/Aiplans-Introduction.pdf
new file mode 100644
index 0000000000..9c8cc89460
--- /dev/null
+++ b/graphics/pgf/contrib/aiplans/Aiplans-Introduction.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/aiplans/LICENSE.txt b/graphics/pgf/contrib/aiplans/LICENSE.txt
new file mode 100644
index 0000000000..4db9b5af29
--- /dev/null
+++ b/graphics/pgf/contrib/aiplans/LICENSE.txt
@@ -0,0 +1,415 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2005 M. Y. Name
+ %
+ % This work may be distributed and/or modified under the
+ % conditions of the LaTeX Project Public License, either version 1.3
+ % of this license or (at your option) any later version.
+ % The latest version of this license is in
+ % http://www.latex-project.org/lppl.txt
+ % and version 1.3 or later is part of all distributions of LaTeX
+ % version 2005/12/01 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
diff --git a/graphics/pgf/contrib/aiplans/README.md b/graphics/pgf/contrib/aiplans/README.md
new file mode 100644
index 0000000000..7e50eef9c0
--- /dev/null
+++ b/graphics/pgf/contrib/aiplans/README.md
@@ -0,0 +1,80 @@
+# <aiplans>: A TikZ-Based Library for Drawing POCL Plans
+
+<aiplans> is a specialized LaTeX package designed to assist scientists, students, and professionals in creating high-quality graphical representations, particularly Partial Order Causal Link (POCL) plans. Built on the robust TikZ framework, this library simplifies the process of generating complex, precise diagrams that are essential for academic and scientific communication. Our package is especially useful in fields such as artificial intelligence and automated planned, where visualizing causal relationships and dependencies is fundamental.
+
+## Content
+
+- [Project Structure](#project-structure)
+- [License](#license)
+- [Future Improvements Plan](#future-improvements-plan)
+- [Contact Information](#contact-information)
+- [Team Members](#team-members)
+
+## Project Structure
+
+Aiplans/
+
+├── **README.md**
+
+├── **README.pdf**
+
+├── **Aiplans-Introdution-source-code.zip**
+
+├── **Aiplans-Introdution.pdf**
+
+├── **tikzlibraryaiplans.code.tex**
+
+└── **License.txt**
+
+
+### Explanation
+
+- **README**: This file provides an overview of the project, including installation instructions, system requirements, and other essential information.
+- **Aiplans-Introdution-source-code.zip**: Introduction file Latex source code.
+- **Aiplans-Introdution.pdf**: Detailed instructions on how to use the TikZ library included in this package. It covers the steps needed to generate diagrams using LaTeX.
+- **tikzlibraryaiplans.code.tex**: The core of the project, this file contains the TikZ library specifically designed for generating AI plan diagrams. This package is crucial for the functionality provided by this project.
+- **License.txt**: The license file outlines the terms under which the package can be used, modified, and distributed.
+
+
+## License
+
+This material is subject to the [LaTeX Project Public License 1.3c](https://ctan.org/license/lppl1.3).
+
+## Future Improvements Plan
+
+As we continue to improve and expand the `<aiplans>` package, the following developments are planned for the upcoming future:
+
+### In Scope
+
+1. **Extension Features for v1.0**:
+ - **Vertical Diagram Support**: We aim to enhance the package by introducing the ability to create vertical diagrams, which will provide more flexibility in visualizing POCL plans.
+ - **Dynamic Precondition/Effect Lengths**: After the package update, the lengths of the lines will be automatically adjusted based on the actual length of the text labels. In other words, if the label's text content is longer, the corresponding line will also be lengthened; if the label's text content is shorter, the line will be shortened accordingly. This dynamic adjustment allows the diagram to more flexibly adapt to various content requirements, resulting in a final diagram that is more visually appealing and clear.
+
+2. **Code Translator**:
+ - **PDDL/HDDL Code Translation**: We are developing a code translator that can accurately convert PDDL (Planning Domain Definition Language) and HDDL (Hierarchical Domain Definition Language) code into the schema format used by our `<aiplans>` library. This feature will streamline the process of diagram creation from existing codebases or at least allow to specify the tikz code in another syntax that might be more familiar to some.
+
+## Contact Information
+
+If you have any questions, feedback, or suggestions regarding this project, please feel free to reach out to us. We are always happy to assist and appreciate your input.
+
+**Email:** [u7166251@anu.edu.au](mailto:u7166251@anu.edu.au) (Yikai Ge)
+For reporting bugs or requesting features.
+
+We strive to respond to all inquiries as quickly as possible.
+
+## Team Members
+
+This project is developed by a team of students from the Australian National University (ANU), guided by our client. He provided us with the initial idea and relevant references, playing a crucial role in shaping the direction of our research.
+
+### Client
+- **Pascal Bercher**
+
+### Maintainers
+- **Yikai Ge**
+- **Chen Wang**
+- **Cheng Zhou**
+- **Lujia Li**
+- **Yinyin Chen**
+- **Xinni Song**
+
+We have worked closely with our client to ensure that the project meets their requirements and delivers high-quality results.
diff --git a/graphics/pgf/contrib/aiplans/README.pdf b/graphics/pgf/contrib/aiplans/README.pdf
new file mode 100644
index 0000000000..cca41d75a7
--- /dev/null
+++ b/graphics/pgf/contrib/aiplans/README.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/aiplans/tikzlibraryaiplans.code.tex b/graphics/pgf/contrib/aiplans/tikzlibraryaiplans.code.tex
new file mode 100644
index 0000000000..5b6d23860c
--- /dev/null
+++ b/graphics/pgf/contrib/aiplans/tikzlibraryaiplans.code.tex
@@ -0,0 +1,121 @@
+\ProvidesPackage{aiplan}
+\RequirePackage{tikz}
+\RequirePackage{listofitems}
+\usetikzlibrary{calc}
+\usetikzlibrary{decorations.pathreplacing, decorations.markings}
+
+
+\tikzset{
+ action/.style n args={8}{
+ draw,
+ minimum width=3cm,
+ fill=blue,
+ rounded corners,
+ minimum height={max(#1,#2)*\baseHeight cm + 0.5*\baseHeight cm},
+ label={center:#7},
+ append after command={
+ \pgfextra{
+ % Define the node name
+ \edef\nodename{\tikzlastnode}
+ \ifx#3\empty % Check if label list is empty
+ \else % Process only if not empty
+ % Read the label content
+ \setsepchar{,}
+ \readlist\nameparts{\nodename}
+ \setsepchar{,}
+
+ \ifnum#8=0\relax
+ % Define positions for preconditions and effects relative to the node with shifts
+ \ifnum#1>0
+ \readlist\labellist{#3}
+ \foreach \i in {1,...,#1} {
+ % Precondition coordinates and lines
+ \coordinate (\nodename-pre-\i) at ([xshift=-#5cm, yshift=(-\i + (#1)/2+0.25) * \baseHeight cm] \nodename.west);
+ \draw (\nodename.west |- \nodename-pre-\i) -- +(-#5,0) node [midway, above, sloped, font=\scriptsize] {\labellist[\i]};
+ }
+ \fi;
+ \readlist\labellist{#4}
+ \ifnum#2>0
+ \foreach \j in {1,...,#2} {
+ % Effect coordinates and lines
+ \coordinate (\nodename-eff-\j) at ([xshift=#6cm, yshift=(-\j + (#2)/2+0.25) * \baseHeight cm] \nodename.east);
+ \draw (\nodename.east |- \nodename-eff-\j) -- +(#6,0) node [midway, above, sloped, font=\scriptsize] {\labellist[\j]};
+ }
+ \fi;
+ \else
+ \ifnum#1>0
+ \readlist\labellist{#3}
+ \foreach \i in {1,...,#1} {
+ % Precondition coordinates and lines
+ \coordinate (\nodename-pre-\i) at ([xshift=-#5 cm, yshift=(-\i + (#1)/2+0.25) * \baseHeight cm] \nodename.west);
+ \draw (\nodename.west |- \nodename-pre-\i) -- +(-#5,0) node [midway, anchor=east, xshift=-0.5 cm, sloped, font=\scriptsize]{\labellist[\i]};
+ }
+ \fi;
+ \readlist\labellist{#4}
+ \ifnum#2>0
+ \foreach \j in {1,...,#2} {
+ % Effect coordinates and lines
+ \coordinate (\nodename-eff-\j) at ([xshift=#6 cm, yshift=(-\j + (#2)/2+0.25) * \baseHeight cm] \nodename.east);
+ \draw (\nodename.east |- \nodename-eff-\j) -- +(#6,0) node [midway,anchor=west, xshift=0.5 cm, font=\scriptsize] {\labellist[\j]};
+ }
+ \fi;
+ \fi;
+ \fi;
+ }
+ },
+ label content/.initial={#3}
+ }
+}
+
+
+% Common base style for nodes
+\tikzset{
+ % COMMENT MISSING
+ base/.style n args={5}{
+ draw,
+ minimum width=0.05cm,
+ fill=black,
+ minimum height={#1*\baseHeight cm},
+ append after command={
+ \pgfextra{
+ \edef\nodename{\tikzlastnode}
+ \setsepchar{,}
+ \readlist\labellist{#2}
+ \foreach \i in {1,...,#1} {
+ \coordinate (\nodename-#5-\i) at ([xshift=#3 cm, yshift=(-\i + (#1)/2+0.25) * \baseHeight cm] \nodename.#4);
+ \draw (\nodename.#4 |- \nodename-#5-\i) -- +(#3,0)
+ node [midway, above, sloped, font=\scriptsize] {\labellist[\i]};
+ }
+ }
+ }
+ }
+}
+
+\tikzset{
+ % Init style
+ init/.style n args={3}{
+ base={#1}{#2}{#3}{east}{eff}
+ }
+}
+
+\tikzset{
+ % Goal style
+ goal/.style n args={3}{
+ base={#1}{#2}{-#3}{west}{pre}
+ }
+}
+
+
+
+\tikzset{
+ dot/.style={
+ circle,fill,inner sep=0.1em
+ }
+}
+
+\tikzset{
+ causallink/.style={
+ ->, shorten <= 0.2cm, shorten >= 0.1cm
+ }
+}
+
diff --git a/graphics/pgf/contrib/argumentation/README.md b/graphics/pgf/contrib/argumentation/README.md
index b0df71dbd0..c6a5ab27ec 100644
--- a/graphics/pgf/contrib/argumentation/README.md
+++ b/graphics/pgf/contrib/argumentation/README.md
@@ -4,5 +4,5 @@ The argumentation package provides utility to create abstract argumentation fram
For bug reports and feedback, please contact:
Lars Bengel <lars.bengel@fernuni-hagen.de>
-Version: 1.2 [2024/06/07]
+Version: 1.5 [2025/02/09]
This package is subject to the LaTeX Project Public License 1.3c \ No newline at end of file
diff --git a/graphics/pgf/contrib/argumentation/argumentation-doc.pdf b/graphics/pgf/contrib/argumentation/argumentation-doc.pdf
index 48f396a1fe..b3a4066158 100644
--- a/graphics/pgf/contrib/argumentation/argumentation-doc.pdf
+++ b/graphics/pgf/contrib/argumentation/argumentation-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/argumentation/argumentation-doc.tex b/graphics/pgf/contrib/argumentation/argumentation-doc.tex
index d524e50afd..ad1f7a6fd0 100644
--- a/graphics/pgf/contrib/argumentation/argumentation-doc.tex
+++ b/graphics/pgf/contrib/argumentation/argumentation-doc.tex
@@ -1,142 +1,164 @@
-\documentclass{article}
-
-\title{The \argumentation Package}
-\author{Lars Bengel\footnote{Please report any issues at \url{https://github.com/aig-hagen/tikz_argumentation}}\\\small lars.bengel@fernuni-hagen.de}
-\date{Version 1.2 [2024/06/07]}
-
-%%%%%%%%% IMPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\usepackage[]{argumentation} % Main Package
-\usepackage{amsmath} % For example environment
-\usepackage{xspace} % For dynamic spacing after commands
-\usepackage{xcolor} % Coloring
-\usepackage[hidelinks]{hyperref} % Hyperlinks
-\usepackage{subcaption} % For two-part figures
+\documentclass{scrartcl}
+
+\usepackage[top=1.35in, bottom=1.33in, left=1.35in, right=1.35in]{geometry}
+\usepackage[macros,beamer]{argumentation} % Main Package
+\usepackage[T1]{fontenc} % Font Encoding
+\usepackage[utf8]{inputenc} % Input font encoding
+\usepackage[english]{babel} % Language
+\usepackage{subcaption} % Multi-part Figures
+\usepackage[nohyperref]{doc} % Showing Commands (must load before tcolorbox)
+\usepackage[breakable]{tcolorbox} % Fancier Examples
+\usepackage{booktabs} % Fancier Tables
+\usepackage{enumitem} % Fancier Enumeration
+\usepackage[hidelinks, % Setting Meta-Data and hyperlinks
+ pdfauthor={Lars Bengel},
+ pdftitle={The argumentation LaTeX-package},
+ pdfsubject={Documentation of the argumentation LaTeX-package},
+ pdfkeywords={argumentation,tikz,graphs}]{hyperref}
+
+%%% Document settings
+\KOMAoptions{
+ paper=a4,
+ fontsize=10pt,
+ cleardoublepage=empty,
+ footinclude=true
+}
%%% Various commands used in the document
\newcommand{\todo}[1]{\textcolor{magenta}{TODO: #1}} % for todos
\newcommand{\tikzname}{Ti\emph{k}Z\xspace}
\newcommand{\argumentation}{\texttt{argumentation}\xspace}
-\newcommand{\opt}[2][red]{\ensuremath{\textcolor{#1}{\langle #2\rangle}}}
\newtheorem{example}{Example}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\tcolorboxenvironment{example}{colframe=aigblue,colback=aigyellow!30,breakable,before skip=10pt,after skip=10pt}
+\newcommand{\mopt}[2][red]{\textcolor{#1}{\ttfamily \meta{#2}}}
+\newcommand{\oopt}[2][orange]{\textcolor{#1}{\ttfamily \meta{#2}}}
+\newcommand{\popt}[2][magenta]{\textcolor{#1}{\ttfamily \meta{#2}}}
+\newcommand{\sopt}[2][green]{\textcolor{#1}{\ttfamily \meta{#2}}}
+
+%%% Taken from ltxdoc-class
+\def\cmd#1{\cs{\expandafter\cmd@to@cs\string#1}}
+\def\cmd@to@cs#1#2{\char\number`#2\relax}
+\DeclareRobustCommand\cs[2][-1.6cm]{\hspace{#1}\texttt{\char`\\#2}}
+
+\title{The \argumentation Package}
+\author{Lars Bengel\footnote{Please report any issues at \url{https://github.com/aig-hagen/tikz_argumentation}}\\\small lars.bengel@fernuni-hagen.de}
+\date{Version 1.5 [2025/02/09]}
\begin{document}
\maketitle
-\begin{minipage}{.28\textwidth}
+\begin{minipage}{.26\textwidth}
\centering
- \begin{af}
- \argument{$a$}
- \argument[right=of a1]{$b$}
- \argument[below=of a1]{$c$}
- \argument[right=of a3]{$d$}
+ \begin{af}[argumentstyle=gray,namestyle=monospace]
+ \argument{a}
+ \argument[right=of a1]{b}
+ \argument[below=of a1]{c}
+ \argument[right=of a3]{d}
\attack{a1}{a2}
\attack{a2}{a3}
\attack[bend right]{a3}{a4}
+ \label{af:example}
\end{af}
\end{minipage}
\begin{minipage}{.5\textwidth}
+ \begin{small}
\begin{verbatim}
- \begin{af}
- \argument{$a$}
- \argument[right=of a1]{$b$}
- \argument[below=of a1]{$c$}
- \argument[right=of a3]{$d$}
+ \begin{af}[argumentstyle=gray,namestyle=monospace]
+ \argument{a}
+ \argument[right=of a1]{b}
+ \argument[below=of a1]{c}
+ \argument[right=of a3]{d}
\attack{a1}{a2}
\attack{a2}{a3}
\attack[bend right]{a3}{a4}
+ \label{af:example}
\end{af}
\end{verbatim}
+ \end{small}
\end{minipage}
\tableofcontents
\newpage
+%\sffamily
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Quick Guide}\label{sec:quick}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
\noindent
-To create an argumentation framework in your \LaTeX document, you have to import the \argumentation package:\\
+To create an argumentation framework in your \LaTeX-document, you first have to import the \argumentation package in the preamble:\\
-\vspace{-0.3cm}
-\verb|\usepackage{argumentation}|\\
+\noindent\cs[0cm]{usepackage\{argumentation\}}\\
-\noindent
You can then create a new \texttt{af} environment in which the argumentation framework can then be built:\\
-\vspace{-0.3cm}
-\verb|\begin{af}|
+\noindent\cs[0cm]{begin\{af\}}
-\quad\opt[green]{environment~content}
+\quad\sopt{environment~contents}
-\verb|\end{af}|\\
+\noindent\cs[0cm]{end\{af\}}\\
-\noindent
You may want to wrap the \texttt{af} environment in a \texttt{figure} environment in order to add a caption and reference label.
-The easiest way to create an argument in the argumentation framework is:\\
+You can also add a label inside the \texttt{af} environment via \verb|\label{|\sopt{label}\verb|}|.
+Anywhere in your document, you can then reference the af with \verb|\ref{|\sopt{label}\verb|}|.
-\vspace{-0.3cm}
-\verb|\argument{|\opt{name}\verb|}|\\
+Inside the \texttt{af} environment, you can then add an argument as follows:\\
-\noindent
-Here, \opt{name} is the name of the argument displayed in the graph and the argument is automatically assigned an \emph{identifier} of the form: $a1$, $a2$, \dots.
+\noindent\cs[0cm]{argument\{\mopt{name}\}}\\
+
+Here, \mopt{name} is the name of the argument displayed in the graph and the argument is automatically assigned an \emph{identifier} of the form: $a1$, $a2$, \dots.
To properly add further arguments, you also need to specify a position.
The \argumentation package offers two easy ways of doing that:\\
-\vspace{-0.3cm}
-\verb|\argument[|\opt{dir}\verb|=of |\opt{arg\_id}\verb|]{|\opt{name}\verb|}|
+\noindent\cs[0cm]{argument[\mopt{dir}=of \mopt{argId}]\{\mopt{name}\}}\\
-\verb|\argument{|\opt{name}\verb|}| \verb|at (|\opt{posX},\opt{posY}\verb|)|\\
+\noindent\cs[0cm]{argument\{\mopt{name}\} at (\popt{posX},\popt{posY})}\\
-\noindent
-The first instance is \emph{relative position} where \opt{dir} is the direction of placement relative to the argument with the identifier \opt{arg\_id}, with \opt{dir} typically being one of the values: \textsf{right}, \textsf{left}, \textsf{above}, \textsf{below}.
+The first instance is \emph{relative positioning} where \mopt{dir} is the direction of placement relative to the argument with the identifier \mopt{argId}, with \mopt{dir} typically being one of: \textsf{right}, \textsf{left}, \textsf{above}, \textsf{below}.
-The second instance is \emph{absolute positioning} where (\opt{posX}, \opt{posY}) is a set of coordinates, for example something like $(2, 0)$, $(0, -2)$ or $(2, 4)$.\\
+The second instance is \emph{absolute positioning} where \texttt{(\popt{posX}, \popt{posY})} is a set of coordinates, for example something like $\texttt{(2, 0)}$, $\texttt{(0, -2)}$ or $\texttt{(-1, 3.5)}$.
-\noindent
-To create an attack between two arguments, you simply use the command:\\
+The next step is adding attacks.
+For that you can simply use the following command:\\
-\vspace{-0.3cm}
-\verb|\attack{|\opt{a1}\verb|}{|\opt{a2}\verb|}|\\
+\noindent\cs[0cm]{attack\{\mopt{a1}\}\{\mopt{a2}\}}\\
\noindent
-Substitute \opt{a1} and \opt{a2} with the identifier of the two arguments.
+Substitute \mopt{a1} and \mopt{a2} with the identifier of the two arguments.
Alternatively, you can also directly create bidirectional attacks and self-attacks with the following two commands:\\
-\vspace{-0.3cm}
-\verb|\dualattack{|\opt{a1}\verb|}{|\opt{a2}\verb|}|
+\noindent\cs[0cm]{dualattack\{\mopt{a1}\}\{\mopt{a2}\}}\\
+\noindent\cs[0cm]{selfattack\{\mopt{a1}\}}\\
-\verb|\selfattack{|\opt{a1}\verb|}|\\
-\noindent
To customize the look of the arguments and attacks and for a detailed overview over all options and commands provided by this package, please refer to the following example or to the full documentation in Section~\ref{sec:documentation}.
+
+\newpage
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newpage\section{Example}\label{sec:example}
+\section{Example Usage}\label{sec:example}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\vspace{-0.7cm}
+\vspace{-0.5cm}
\begin{figure}[ht]
\centering
- \begin{af}
+ \begin{af}[namestyle=math]
\argument{a}
\argument[right=of a1]{b}
\argument[right=of a2]{c}
- \argument[right=of a3]{d}
+ \argument[rejected,right=of a3]{d}
\argument[right=of a4,incomplete]{e}
\argument[below=of a1]{f}
\argument[inactive,right=of a6]{g}
- \argument[inactive,argin,right=of a7]{h}
+ \argument[accepted,right=of a7]{h}
\argument[right=of a8]{i}
\argument[right=of a9]{j}
- %\annotation[right]{a5}{$a\lor b$}
+ \annotation[right,yshift=-0.4cm]{a5}{$a\lor b$}
- \afname[left of=a1,yshift=-0.8cm,xshift=-0.2cm]{\textbf{F:}}
+ \afname{$F_{\ref{af:ex2}}$} at (-1,-1)
\selfattack{a1}
\dualattack{a1}{a6}
@@ -144,96 +166,632 @@ To customize the look of the arguments and attacks and for a detailed overview o
\attack[inactive]{a8}{a7}
\attack[inactive]{a7}{a2}
- \annotatedattack{a3}{a2}{$3$}
- \attack[incomplete]{a4}{a5}
+ \annotatedattack[above]{a3}{a2}{$3$}
+ \annotatedattack[below,incomplete]{a4}{a5}{$x$}
\attack{a5}{a10}
\attack{a10}{a9}
\attack{a9}{a4}
\support{a4}{a3}
\support{a9}{a3}
+ \label{af:ex2}
\end{af}
- \caption{An exemplary AF created with the \argumentation package.}
+ \caption{The AF $F_{\ref{af:ex2}}$ created with the \argumentation package.}
\label{fig:example}
\end{figure}
-\vspace{-0.4cm}
+
\begin{verbatim}
- \usepackage{argumentation}
- \begin{figure}[ht]
+\usepackage[namestyle=math]{argumentation}
+...
+\begin{document}
+...
+\begin{figure}[ht]
+ \centering
+ \begin{af}
+ \argument{a}
+ \argument[right=of a1]{b}
+ \argument[right=of a2]{c}
+ \argument[rejected,right=of a3]{d}
+ \argument[right=of a4,incomplete]{e}
+ \argument[below=of a1]{f}
+ \argument[inactive,right=of a6]{g}
+ \argument[accepted,right=of a7]{h}
+ \argument[right=of a8]{i}
+ \argument[right=of a9]{j}
+
+ \annotation[right,yshift=-0.4cm]{a5}{$a\lor b$}
+ \afname{$F_{\ref{af:ex2}}$} at (-1,-1)
+
+ \selfattack{a1}
+ \dualattack{a1}{a6}
+ \dualattack[inactive]{a6}{a7}
+
+ \attack[inactive]{a8}{a7}
+ \attack[inactive]{a7}{a2}
+ \attack{a5}{a10}
+ \attack{a10}{a9}
+ \attack{a9}{a4}
+
+ \annotatedattack[above]{a3}{a2}{$3$}
+ \annotatedattack[below,incomplete]{a4}{a5}{$x$}
+ \support{a4}{a3}
+ \support{a9}{a3}
+ \label{af:ex2}
+ \end{af}
+ \caption{The AF $F_{\ref{af:ex2}}$ created with the \argumentation package.}
+ \label{fig:example}
+\end{figure}
+...
+\end{document}
+\end{verbatim}
+
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Documentation for Version 1.5 [2025/02/09]}\label{sec:documentation}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+The \argumentation package provides an easy way for creating argumentation frameworks\footnote{Dung, P. M. (1995). On the acceptability of arguments and its fundamental role in non-monotonic reasoning, logic programming and n-person games. Artificial intelligence.} in \LaTeX-documents.
+It builds on the \tikzname package for drawing the argumentation graphs.
+The \argumentation package provides simplified syntax while keeping the same customisation options and keeping full compatibility with all \tikzname features.
+In addition to that, the \argumentation package provides the ability to label and reference the created argumentation frameworks as well as some other additional features.
+
+The \argumentation package can be imported via the command\\
+
+\noindent\cs{usepackage[\oopt{options}]\{argumentation\}}\\
+
+\vspace{-0.2cm}
+In the following, we give an overview over the functionality of the \argumentation package.
+Most importantly, that includes the \texttt{af} environment to encapsulate the created argumentation frameworks, the command \verb|\argument{ }| to create argument nodes and the \verb|attack{ }{ }| command to create attack edges.
+Options to customise the appearance of arguments and attacks are described in Section~\ref{sec:options}.
+
+\vspace{-0.2cm}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{The \texttt{af} Environment}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+The \argumentation package provides an environment for creating argumentation frameworks in \LaTeX-documents.\\
+
+\noindent\cs{begin\{af\} [\oopt{options}]}
+
+ \hspace{-1cm}\sopt{environment~contents}
+
+\noindent\cs[-1.6cm]{end\{af\}}\\
+
+\vspace{-0.2cm}
+The \texttt{af} environment supports referencing.
+For that add the command \cs[0cm]{label\{\sopt{label}\}} anywhere inside an \texttt{af} environment.
+The AFs are automatically numbered in ascending order of occurrence.
+The \sopt{label} allows you to reference the corresponding AF via \cs[0cm]{ref\{\sopt{label}\}} anywhere in the document.
+
+If you want to create an AF that is excluded from the automatic numbering, the \argumentation package provides the \texttt{af*} version of the environment, which has the same functionality otherwise:\\
+
+\noindent\cs{begin\{af*\} [\oopt{options}]}
+
+ \hspace{-1cm}\sopt{environment~contents}
+
+\noindent\cs[-1.6cm]{end\{af*\}}\\
+
+\vspace{-0.2cm}
+The \texttt{af} (and \texttt{af*}) environment also accepts the package style options (see Section~\ref{sec:options}).
+Locally set style options override defaults and the values set globally with the package import.
+
+In general, the \texttt{af} environment extends the \texttt{tikzpicture} environment, meaning all \tikzname commands and parameters can be used for the \texttt{af} environment.
+The \argumentation package also provides the options \textsf{small} or \textsf{tiny} for the \texttt{af} environment to create smaller AFs.
+This is especially useful for two-column layout documents.
+
+
+\begin{figure}[!ht]
+ \begin{subfigure}{0.48\textwidth}
\centering
- \begin{af}
+ \begin{af}[small,namestyle=math]
+ \label{af:small}
\argument{a}
\argument[right=of a1]{b}
\argument[right=of a2]{c}
\argument[right=of a3]{d}
- \argument[right=of a4,incomplete]{e}
+ \argument[right=of a4]{e}
\argument[below=of a1]{f}
\argument[inactive,right=of a6]{g}
\argument[inactive,argin,right=of a7]{h}
\argument[right=of a8]{i}
\argument[right=of a9]{j}
- \afname[left of=a1,yshift=-0.8cm,xshift=-0.2cm]{\textbf{F:}}
+ \afname[left of=a1,yshift=-0.55cm,xshift=-0.2cm]{\afref{af:small}}
\selfattack{a1}
- \dualattack{a1}{a6}
+ \dualattack[]{a1}{a6}
\dualattack[inactive]{a6}{a7}
-
\attack[inactive]{a8}{a7}
+
\attack[inactive]{a7}{a2}
- \annotatedattack{a3}{a2}{$3$}
- \attack[incomplete]{a4}{a5}
- \attack{a5}{a10}
- \attack{a10}{a9}
- \attack{a9}{a4}
-
- \support{a4}{a3}
- \support{a9}{a3}
+ \attack[]{a3}{a2}
+
+ \support[]{a4}{a3}
+ \support[]{a9}{a3}
+
+ \attack[]{a4}{a5}
+ \attack[]{a5}{a10}
+ \attack[]{a10}{a9}
+ \attack[]{a9}{a4}
\end{af}
- \caption{An exemplary AF created with the \argumentation package.}
- \label{fig:example}
- \end{figure}
-\end{verbatim}
+ \caption{An AF created with the \textsf{small} option set.}
+ \label{fig:example_small}
+ \end{subfigure}
+ \hfill
+ \begin{subfigure}{0.48\textwidth}
+ \centering
+ \begin{af}[tiny,namestyle=math]
+ \label{af:tiny}
+ \argument{a}
+ \argument[right=of a1]{b}
+ \argument[right=of a2]{c}
+ \argument[right=of a3]{d}
+ \argument[right=of a4]{e}
+ \argument[below=of a1]{f}
+ \argument[inactive,right=of a6]{g}
+ \argument[inactive,argin,right=of a7]{h}
+ \argument[right=of a8]{i}
+ \argument[right=of a9]{j}
+
+ \afname[left of=a1,yshift=-0.4cm,xshift=-0.2cm]{\afref{af:tiny}}
+
+ \selfattack{a1}
+ \dualattack[]{a1}{a6}
+ \dualattack[inactive]{a6}{a7}
+ \attack[inactive]{a8}{a7}
+
+ \attack[inactive]{a7}{a2}
+ \attack[]{a3}{a2}
+
+ \support[]{a4}{a3}
+ \support[]{a9}{a3}
+
+ \attack[]{a4}{a5}
+ \attack[]{a5}{a10}
+ \attack[]{a10}{a9}
+ \attack[]{a9}{a4}
+ \end{af}
+ \caption{An AF created with the \textsf{tiny} option set.}
+ \label{fig:example_tiny}
+ \end{subfigure}
+ \caption{Argumentation frameworks using the \textsf{small} and \textsf{tiny} option of the \texttt{af} environment.}
+ \label{fig:mini_afs}
+\end{figure}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newpage\section{Documentation for Version 1.2 [2024/06/07]}\label{sec:documentation}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-The \argumentation package provides an easy way for creating argumentation frameworks\footnote{Dung, P. M. (1995). On the acceptability of arguments and its fundamental role in nonmonotonic reasoning, logic programming and n-person games. Artificial intelligence.} in \LaTeX documents.
-It builds on the \tikzname package for drawing the graphs and provides simplified syntax while keeping the same customisation options and keeping full compatibility with all \tikzname commands.
-The package comes with multiple predefined style options for arguments, attacks and supports.
-In the following, we give an overview over the functionality of the \argumentation package.
-The \argumentation package can be imported via the command
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Creating Arguments}\label{sec:arguments}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Inside an \texttt{af} (or \texttt{af*}) environment, you can create argument nodes for the argumentation framework with the following command\\
+
+\noindent\cs{argument [\oopt{options}] (\popt{id}) \{\mopt{name}\} at (\popt{posX},\popt{posY})}
+
+\begin{description}
+ \item[\oopt{options}] (optional) a list of \tikzname style parameters and/or relative positioning information.
+ \item[\popt{id}] (optional) the identifier of the new argument. Per default, when omitted, arguments will automatically be assigned an identifier of the form: $a1, a2, a3,...$.
+ \item[\mopt{name}] the displayed name of the argument.
+ \item[\popt{posX},\popt{posY}] (optional) the coordinates where the argument is placed. Must be omitted if relative positioning is used.
+\end{description}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsubsection{Positioning}\label{sec:positioning}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+The \argumentation package also provides the ability to use \emph{relative positioning} instead of absolute positioning via coordinates.
+For that, it relies on relative placement via the \tikzname-library \textsf{positioning}.
+The relative positioning information is provided as an optional parameter via \texttt{[\oopt{options}]} as follows\\
+
+\noindent\cs{argument[\mopt{dir}=of \mopt{argId}]\{\mopt{name}\}}
+
+\begin{description}
+ \item[\mopt{dir}] The direction of placement relative to the argument \mopt{argId}. Typically one of: \textsf{above}, \textsf{right}, \textsf{left} or \textsf{below}.
+ \item[\mopt{argId}] The identifier of another argument.
+ \item[\mopt{name}] The displayed name of the argument.
+\end{description}
+
+Additionally, you can adjust the horizontal/vertical position of an argument by adding \verb|xshift=|\mopt{v} or \verb|yshift=|\mopt{v} inside the \texttt{[...]}.
+The value \mopt{v} is hereby the horizontal/vertical offset, e.\,g., \verb|-6.6ex| or \verb|1cm|.
+
+In the following, we list some useful style options for the \verb|\argument| command, provided by the\argumentation package:
+
+\vspace{-0.15cm}
+\begin{table}[ht]
+ \centering
+ \begin{tabular}{ll}
+ \textsf{inactive} &\quad \text{The argument is displayed with grey outline and text.}\\
+ \textsf{incomplete} &\quad \text{The argument is displayed with a dotted outline.}\\
+ \textsf{invisible} &\quad \text{The argument node is completely transparent.}\\
+ \textsf{accepted} &\quad \text{The argument is displayed with green background color.}\\
+ \textsf{rejected} &\quad \text{The argument is displayed with red background color.}\\
+ \textsf{undecided} &\quad \text{The argument is displayed with cyan background color.}\\
+ \textsf{highlight} &\quad \text{The argument is displayed with yellow background color.}\\
+ \end{tabular}
+ \caption{Some style options for the \cs[0cm]{argument} command (for exact definition see Section~\ref{sec:parameters}).}
+ \label{tab:argument_style}
+\end{table}
+
+\vspace{-0.4cm}
+\begin{example}~
+
+ \vspace{-0.2cm}
+ \begin{minipage}{0.3\textwidth}
+ \centering
+ \begin{af}[namestyle=math]
+ \argument{a}
+ \argument{b} at (1,0)
+ \argument[below=of a1,accepted](c){c}
+ \argument(x){d} at (1,-1)
+ \argument[right=of x,yshift=0.5cm]{e}
+ \argument[inactive]{f} at (2,-1.5)
+ \end{af}
+ \end{minipage}%
+ \begin{minipage}{0.7\textwidth}
+ \begin{small}
+ \begin{verbatim}
+ \begin{af}[namestyle=math]
+ \argument{a}
+ \argument{b} at (1,0)
+ \argument[below=of a1,accepted](c){c}
+ \argument(x){d} at (1,-1)
+ \argument[right=of x,yshift=0.5cm]{e}
+ \argument[inactive]{f} at (2,-1.5)
+ \end{af}
+ \end{verbatim}
+ \end{small}
+ \end{minipage}
+ \vspace{-0.3cm}
+\end{example}
+
+
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Creating Attacks}\label{sec:attacks}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+To create an directed attack between two argument nodes, you can use the following command.
+The parameters \mopt{arg1} and \mopt{arg2} are the identifiers of the two arguments.\\
+
+\noindent\cs{attack [\oopt{options}] \{\mopt{argId1}\} \{\mopt{argId2}\}}
+\begin{description}
+ \item[\oopt{options}] (optional) a list of \tikzname style parameters.
+ \item[\mopt{arg1}] Identifier of the attacking argument.
+ \item[\mopt{arg2}] Identifier of the attacked argument.\\
+\end{description}
+
+To simplify creating special types of attacks, like bidirectional attacks or self-attacks, the following two commands are provided.\\
+
+\noindent\cs{dualattack [\oopt{options}] \{\mopt{argId1}\} \{\mopt{argId2}\}}
+\begin{description}
+ \item[\oopt{options}] (optional) a list of \tikzname style parameters.
+ \item[\mopt{arg1}] Identifier of the first argument.
+ \item[\mopt{arg2}] Identifier of the second argument.
+\end{description}
+
+\noindent\cs{selfattack [\oopt{options}] \{\mopt{argId}\}}
+\begin{description}
+ \item[\oopt{options}] (optional) a list of \tikzname style parameters.
+ \item[\mopt{arg1}] Identifier of the self-attacking argument.
+\end{description}
+
+For \verb|\selfattack| you might want to specify the position of the attack loop.
+For that, you should provide the start and end point of the attack-edge (as a degree from \verb|0| to \verb|360|) via the optional \tikzname-parameters \texttt{in=\oopt{degree1}} and \texttt{out=\oopt{degree2}}.
+The default values are \texttt{in=0} and \texttt{out=60}.\\
+
+If you want to attach a value to an attack edge, you may use the following command.\\
+
+\noindent\cs{annotatedattack [\oopt{options}] \{\mopt{argId1}\} \{\mopt{argId2}\} \{\mopt{value}\}}
+\begin{description}
+ \item[\oopt{options}] Optional \tikzname parameters. Must also include one of the following parameters to specify placement of the annotation relative to the attack arrow: \textsf{above}, \textsf{below}, \textsf{left}, \textsf{right}.
+ \item[\mopt{arg1}] Identifier of the attacking argument.
+ \item[\mopt{arg2}] Identifier of the attacked argument.
+ \item[\mopt{value}] The text that is annotated.\\
+\end{description}
+
+As an alternative to the standard attack arrow, you can use the following command.\\
+
+\noindent\cs{support [\oopt{options}] \{\mopt{argId1}\} \{\mopt{argId2}\}}
+\begin{description}
+ \item[\oopt{options}] (optional) a list of \tikzname style parameters.
+ \item[\mopt{arg1}] Identifier of the supporting argument.
+ \item[\mopt{arg2}] Identifier of the supported argument.\\
+\end{description}
+
+\newpage
+Some useful style options for the attacks (and other edges) are listed below:
+
+\begin{table}[ht]
+ \centering
+ \begin{tabular}{ll}
+ \textsf{inactive} &\quad \text{The attack is displayed in grey.}\\
+ \textsf{incomplete} &\quad \text{The attack is displayed with a dotted line.}\\
+ \textsf{invisible} &\quad \text{The attack is completely transparent.}\\
+ \textsf{selfattack} &\quad \text{Use if source and target of the attack are the same node.}\\
+ \textsf{bend~right} &\quad \text{The attack arrow is bent to the right.}\\
+ &\quad \text{Can additionally provide the angle, e.\,g., \textsf{bend~right=40}.}\\
+ \textsf{bend~left} &\quad \text{The attack arrow is bent to the left. Can also provide an angle.}
+ \end{tabular}
+ \caption{Some useful style options for the \cs[0cm]{attack} (and related) commands. For the exact definition see Section~\ref{sec:parameters}.}
+ \label{tab:attack_style}
+\end{table}
+
+\begin{example}~
+
+ \begin{minipage}{0.3\textwidth}
+ \centering
+ \begin{af}[namestyle=math]
+ \argument{a}
+ \argument[right=of a1]{b}
+ \argument[below=of a1]{c}
+ \argument[right=of a3]{d}
+
+ \attack{a3}{a1}
+ \selfattack[incomplete]{a3}
+ \dualattack{a1}{a2}
+ \annotatedattack[right]{a2}{a4}{$x$}
+ \support[bend left]{a4}{a3}
+ \end{af}
+ \end{minipage}%
+ \begin{minipage}{0.7\textwidth}
+ \begin{verbatim}
+ \begin{af}[namestyle=math]
+ ...
- \verb|\usepackage{argumentation}|
+ \attack{a3}{a1}
+ \selfattack[incomplete]{a3}
+ \dualattack{a1}{a2}
+ \annotatedattack[right]{a2}{a4}{$x$}
+ \support[bend left]{a4}{a3}
+ \end{af}
+ \end{verbatim}
+ \end{minipage}
+\end{example}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Beamer}\label{sec:beamer}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+Most commands provided by the \argumentation package support \emph{overlay specifications} used for creating presentations with \textsf{beamer}\footnote{\url{https://tug.ctan.org/macros/latex/contrib/beamer/doc/beameruserguide.pdf}}.
+To specify overlay information, use \verb|<X>| directly after the command name, where \verb|X| is for instance a number, a list of numbers or any other form of overlay specification (see \textsf{beamer} documentation for more information).
+All commands for creating AFs introduced so far support overlay specifications.
+
+\begin{example}~
+\begin{verbatim}
+\begin{frame}{Example AF}
+\begin{af}
+ \argument<1>{a} % Argument visible on slide 1
+ \argument<1,2>[right=of a1]{b} % Argument visible on slides 2 and 3
+ \argument<2-4>[right=of a2]{c} % Argument visible on slides 2 to 4
+
+ \attack<2->{a2}{a3} % Attack is visible on slide 2
+ % and any following slides
+\end{af}
+\end{frame}
+\end{verbatim}
+\end{example}
+
+In accordance with the \textsf{beamer} cover types, the \argumentation package provides the two cover modes: \textsf{transparent} and \textsf{invisible}.
+In \textsf{transparent} mode arguments and attacks that are inactive on a slide are rendered in gray, and in \textsf{invisible} mode they are completely invisible on inactive slides.
+
+\subsubsection{Experimental Features}
+\textbf{Warning: The following features are experimental and the performance is not necessarily optimized yet.}
+If you want to reuse (parts of) previously created argumentation frameworks in some form, the \argumentation package provides some useful commands that can be enabled via the package option $\textsf{beamer}{=}\textsf{true}$.
+While primarily intended for the use inside the $\textsf{beamer}$ document class when creating presentations, the commands also work in any other document class.
+Each command required the label of some argumentation framework and a list of argument IDs of that framework and then creates a copy of that framework, with some changes depending on the command.\\
+
+\noindent\cs{aflabeling \{\mopt{af-label}\} \{\mopt{argument list}\}}
\noindent
- Alternatively, one can also adjust the appearance by providing some package options via
+ Applies the style parameter \textsf{accepted} to all arguments in \mopt{argument list}, the parameter \textsf{rejected} to those attacked by arguments in \mopt{argument list} and \textsf{undecided} to all other arguments.\\
- \verb|\usepackage[|\opt{options}\verb|]{argumentation}|
+\noindent\cs{afextension \{\mopt{af-label}\} \{\mopt{argument list}\}}
-\subsection{Style Options}\label{sec:style}
- \begin{list}{}{\leftmargin=\parindent\rightmargin=0pt}
- \item The \argumentation package provides the following options to customize the look of the argumentation frameworks. They can both be set globally (as an option for the \emph{usepackage} command) and also locally for each \texttt{af} environment (see Section~\ref{sec:af}).
- \end{list}
- \vspace{-0.3cm}
- \begin{align*}
- \mathsf{argumentstyle} &\quad \text{Customizes the appearance of argument nodes.}\\
- \mathsf{attackstyle} &\quad \text{Customizes the appearance of attack edges.}\\
- \mathsf{supportstyle} &\quad \text{Customizes the appearance of support edges.}\\
- \mathsf{namestyle} &\quad \text{Customizes the font style of the argument names.}\\
- \end{align*}
+ \noindent
+ Applies the style parameter \textsf{accepted} to all arguments in \mopt{argument list}.\\
+
+\noindent\cs{afreduct \{\mopt{af-label}\} \{\mopt{argument list}\}}
+
+ \noindent
+ Applies the style parameter \textsf{inactive} to all arguments in \mopt{argument list} and those attacked by them.
+ All attacks involving at least one such argument also receive the parameter \textsf{inactive}.\\
+
+\noindent\cs{afrestriction \{\mopt{af-label}\} \{\mopt{argument list}\}}
+
+ \noindent
+ Applies the style parameter \textsf{invisible} to all arguments \emph{not} in \mopt{argument list}.
+ All attacks involving at least one such argument also receive the parameter \textsf{invisible}.\\
+
+
+See Figure~\ref{fig:beamer} for some examples.
+
+\begin{figure}[!ht]
+ %\setafstyle{small}
+ \setargumentstyle{argument thick}
+ %\centering
+ \begin{subfigure}{0.48\textwidth}
+ \centering
+ \begin{af*}[namestyle=monospace]
+ \aflabeling{af:example}{a1}
+ \end{af*}
+ \caption{Result of \cs[0cm]{aflabeling\{af:example\}\{a1\}}.}
+ \end{subfigure}
+ \begin{subfigure}{0.48\textwidth}
+ \centering
+ \begin{af*}[namestyle=monospace]
+ \afextension{af:example}{a1,a3}
+ \end{af*}
+ \caption{Result of \cs[0cm]{afextension\{af:example\}\{a1,a3\}}.}
+ \end{subfigure}
+
+ \par\bigskip
+
+ \begin{subfigure}{0.48\textwidth}
+ \centering
+ \begin{af*}[namestyle=monospace]
+ \afreduct{af:example}{a2}
+ \end{af*}
+ \caption{Result of \cs[0cm]{afreduct\{af:example\}\{a2\}}.}
+ \end{subfigure}
+ \begin{subfigure}{0.48\textwidth}
+ \centering
+ \begin{af*}[namestyle=monospace]
+ \afrestriction{af:example}{a3,a4}
+ \end{af*}
+ \caption{Result of \cs[0cm]{afrestriction\{af:example\}\{a3,a4\}}.}
+ \end{subfigure}
+ \caption{Example usage of the four commands provided by the \textsf{beamer} package option.}
+ \label{fig:beamer}
+\end{figure}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Other Commands}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The \argumentation package also provides some additional features.
+The following command can be used to create a text annotation next to an argument node in the argumentation framework.
+The annotation we be placed above the argument node, to adjust its position you should use \texttt{xshift} and \texttt{yshift}.\\
+
+\noindent\cs{annotation [\oopt{options}] \{\mopt{argId}\} \{\mopt{value}\}}
+\begin{description}
+ \item[\oopt{options}] Optional \tikzname style parameters.
+ \item[\mopt{argId}] Identifier of the argument.
+ \item[\mopt{value}] The annotation text.\\
+\end{description}
+
+The command \cs[0cm]{afname} can be used to create a simple text node inside the AF.
+Mainly intended to add the name of the AF into the picture, you can generally put any text there.
+The command behaves essentially exactly like the \cs[0cm]{argument} command.\\
+
+\noindent\cs{afname [\oopt{options}] (\popt{id}) \{\mopt{name}\} at (\popt{posX}, \popt{posY})}
+\begin{description}
+ \item[\oopt{options}] (optional) a list of \tikzname style parameters and/or relative positioning parameters.
+ \item[\popt{id}] (optional) Identifier of the text node. If omitted the identifier will be \textsf{caption}.
+ \item[\mopt{text}] Text to be displayed.
+ \item[\popt{posX},\popt{posY}] (optional) the coordinates for placement. Omit if using relative positioning.
+\end{description}
+
+If you want to define your own style for arguments, attacks or supports, you may use one of the following commands to override the package-wide settings to your liking.
+For that you may also reuse some of the pre-defined parameters of the \argumentation package (see Section~\ref{sec:parameters}).\\
+
+\noindent\cs{setargumentstyle \{\mopt{style parameters}\}}
+
+\noindent\cs{setatackstyle \{\mopt{style parameters}\}}
+
+\noindent\cs{setsupportstyle \{\mopt{style parameters}\}}\\
+
+Similarly, you can also use the following command to override the default settings of the \texttt{af} environment, e.\,g., the \texttt{node distance}.\\
+
+\noindent\cs{setafstyle \{\mopt{style parameters}\}}\\
+
+Finally, when using the $\textsf{argumentstyle}{=}\emph{colored}$ package option, you may use the following command to set the color scheme.\\
+
+\noindent\cs{setargumentcolorscheme \{\mopt{outer color}\} \{\mopt{inner color}\}}
+
+\begin{example}~
+
+ \begin{minipage}{0.22\textwidth}
+ \centering
+ \setargumentstyle{argument thick,text=blue}
+ \setafstyle{node distance=0.75cm}
+ \begin{af}
+ \label{af:8}
+ \argument{a}
+ \argument[right=of a1]{b}
+ \argument[below=of a1]{c}
+ \argument[right=of a3]{d}
+
+ \annotation[yshift=-0.2cm]{a4}{$\top$}
+ \afname{$F_{\ref{af:8}}$} at (-1,-0.75)
+
+ \attack{a1}{a2}
+ \dualattack{a1}{a3}
+ \attack{a4}{a3}
+ \end{af}
+ \end{minipage}%
+ \begin{minipage}{0.7\textwidth}
+ \begin{verbatim}
+ \setargumentstyle{argument thick,text=blue}
+ \setafstyle{node distance=0.75cm}
+ \begin{af}\label{af:8}
+ ...
+
+ \annotation[yshift=-0.2cm]{a4}{$\top$}
+ \afname{$F_{\ref{af:8}}$} at (-1,-0.75)
+ \end{af}
+ \end{verbatim}
+ \end{minipage}
+\end{example}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsubsection{Argumentation Macros}\label{sec:macros}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+To facilitate referencing argumentation frameworks and working with them in general, the \argumentation package provides some additional macros that can be enabled with the package option \textsf{macros=true}.
+Most importantly, there is the macro \verb|\afref{|\sopt{label}\verb|}| which works like the \verb|ref| command but adds the reference number directly into the index of the \verb|\AF| symbol.
+You may redefine any of the first four commands if you prefer a different naming scheme for AFs.
+
+\begin{table}[ht]
+ \centering
+ \begin{tabular}{lll}
+ \verb|\AF|&& \AF \\
+ \verb|\arguments|&& \arguments\\
+ \verb|\attacks|&&\attacks\\
+ \verb|\AFcomplete|&&\AFcomplete\\
+ \verb|\afref{af:example}|&&\afref{af:example}\\
+ \verb|\fullafref{af:example}|&\qquad\qquad\qquad&\fullafref{af:example}
+ \end{tabular}
+ \caption{Macros provided by the package option \textsf{macros=true} and their respective output.}
+ \label{tab:macros}
+\end{table}
+
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Package Options}\label{sec:options}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+The \argumentation package comes with some package options to customize the appearance of the created argumentation frameworks as well as some additional features.
+All style package options can both be set globally when importing the package and also locally for each \texttt{af} environment.
+To import the \argumentation package, use the following command in the preamble of your \LaTeX-document:\\
+
+\noindent\cs[0cm]{usepackage[\oopt{options}]\{argumentation\}}\\
- In the following, we list the available options for each of the style parameters.\\
+The following package options are currently available:
+
+\begin{description}
+ \item[argumentstyle] (default \texttt{standard}) Globally sets the appearance of the argument nodes.
+ The \argumentation package provides five options: \texttt{standard}, \texttt{large}, \texttt{thick}, \texttt{gray} and \texttt{colored}.
+ Detailed descriptions of these options can be found below.
+
+ \item[attackstyle] (default \texttt{standard}) Globally sets the appearance of the attack edges.
+ The package comes with three available options: \texttt{standard}, \texttt{large} and \texttt{modern}.
+ Detailed descriptions of these options can be found below.
+
+ \item[supportstyle] (default \texttt{standard}) Globally sets the appearance of the support edges.
+ The package comes with three available options: \texttt{standard}, \texttt{dashed} and \texttt{double}.
+ Detailed descriptions of these options can be found below.
+
+ \item[namestyle] (default \texttt{none}) Sets the text formatting applied to the argument names in the document.
+ The package comes with five available options: \texttt{none}, \texttt{math}, \texttt{bold}, \texttt{monospace} and \texttt{monoemph}.
+ Detailed descriptions of these options can be found below.
+
+ \item[indexing] (default \texttt{numeric}) Enables or disables automatic generation of \tikzname node-IDs for the created arguments.
+ The available options are: \texttt{none}, \texttt{numeric} and \texttt{alphabetic}.
+ Under the default numeric indexing the generated argument IDs are of the form $a1, a2, \dots$.
+ With alphabetic indexing the IDs will simply be letters: $a,b,\dots$.
+ If \texttt{none} is selected, no IDs will be generated and you are required to provide them for each argument via the parameter \texttt{(\popt{id})} of the \verb|\argument| command.
+
+ \item[macros] Boolean (default \texttt{false}) When enabled provides additional macros for naming and referencing argumentation frameworks (see Table~\ref{tab:macros}).
+ \item[beamer] Boolean (default \texttt{false}) When enabled, provides the commands for recreating argumentations frameworks described in Section~\ref{sec:beamer}.
+\end{description}
-\noindent\texttt{argumentstyle=}\opt{option}
+In the following we give an overview of the different options for the style parameters that can be used to customise the created argumentation frameworks.
+For the exact definitions of these parameters, refer to Section~\ref{sec:parameters}.
- The \textsf{argumentstyle} parameter accepts three options
- \begin{align*}
- \mathsf{standard} &\quad \text{(default) Standard style for the argument nodes.}\\
- \mathsf{large} &\quad \text{Same node size, but larger font.}\\
- \mathsf{thick} &\quad \text{Same node size, thicker outline.}\\
- \end{align*}
+\newpage
+\paragraph{\sffamily argumentstyle=\mopt{option}}
+\begin{align*}
+ \mathsf{standard} &\quad \text{Circular argument node with normal size argument name.}\\
+ \mathsf{large} &\quad \text{Larger font of the argument name.}\\
+ \mathsf{thick} &\quad \text{Thick black outline and normal size argument name.}\\
+ \mathsf{gray} &\quad \text{Thick gray outline, light gray background.}\\
+ \mathsf{colored} &\quad \text{Thick blue outline, light blue background.}
+\end{align*}
\begin{figure}[!h]
\begin{subfigure}{0.32\textwidth}
@@ -272,19 +830,45 @@ The \argumentation package can be imported via the command
\caption{\textsf{argumentstyle}=\textit{thick}}
\label{fig:argumentstyle_thick}
\end{subfigure}
- \caption{The available options for \textsf{argumentstyle}.}
+
+ \par\bigskip
+
+ \begin{subfigure}{0.49\textwidth}
+ \centering
+ \begin{af}[argumentstyle=gray]
+ \argument{a}
+ \argument[right=of a1]{b}
+
+ \attack[]{a1}{a2}
+ \end{af}
+ \caption{\textsf{argumentstyle}=\textit{gray}}
+ \label{fig:argumentstyle_gray}
+ \end{subfigure}
+ \hfill
+ \begin{subfigure}{0.49\textwidth}
+ \centering
+ \begin{af}[argumentstyle=colored]
+ \argument{a}
+ \argument[right=of a1]{b}
+
+ \attack[]{a1}{a2}
+ \end{af}
+ \caption{\textsf{argumentstyle}=\textit{colored}}
+ \label{fig:argumentstyle_colored}
+ \end{subfigure}
+
+ \caption{Available options for \textsf{argumentstyle}.}
\label{fig:argumentstyle}
\end{figure}
-\newpage
-\noindent\texttt{attackstyle=}\opt{option}
+
+\paragraph{\sffamily attackstyle=\mopt{option}}
- The \textsf{attackstyle} parameter accepts three options
- \begin{align*}
- \mathsf{standard} &\quad \text{(default) Standard style for the attack arrow tips.}\\
- \mathsf{large} &\quad \text{Arrow tip is larger and sharper.}\\
- \mathsf{modern} &\quad \text{\tikzname ModernCS arrow tip.}\\
- \end{align*}
+\begin{align*}
+ \mathsf{standard} &\quad \text{Standard 'stealth' \tikzname arrow tip.}\\
+ \mathsf{large} &\quad \text{Arrow tip is larger and sharper.}\\
+ \mathsf{modern} &\quad \text{\tikzname ModernCS arrow tip.}
+\end{align*}
\begin{figure}[!h]
\begin{subfigure}{0.32\textwidth}
@@ -322,18 +906,18 @@ The \argumentation package can be imported via the command
\caption{\textsf{attackstyle}=\textit{modern}}
\label{fig:attackstyle_thick}
\end{subfigure}
- \caption{The available options for \textsf{attackstyle}.}
+ \caption{Available options for \textsf{attackstyle}.}
\label{fig:attackstyle}
\end{figure}
-\noindent\texttt{supportstyle=}\opt{option}
+
+\paragraph{\sffamily supportstyle=\mopt{option}}
- The \textsf{supportstyle} parameter accepts three options
- \begin{align*}
- \mathsf{standard} &\quad \text{(default) Standard style for the attack arrow tips.}\\
- \mathsf{dashed} &\quad \text{Dashed arrow line, same tip.}\\
- \mathsf{double} &\quad \text{Double arrow line and large flat tip.}\\
- \end{align*}
+\begin{align*}
+ \mathsf{standard} &\quad \text{Same tip as attack arrow, perpendicular mark on arrow line.}\\
+ \mathsf{dashed} &\quad \text{Dashed arrow line and same tip as attack arrow.}\\
+ \mathsf{double} &\quad \text{Double arrow line and large flat tip.}
+\end{align*}
\begin{figure}[!h]
\begin{subfigure}{0.32\textwidth}
@@ -371,29 +955,26 @@ The \argumentation package can be imported via the command
\caption{\textsf{supportstyle}=\textit{double}}
\label{fig:supportstyle_double}
\end{subfigure}
- \caption{The available options for \textsf{supportstyle}. Note that for \textit{standard} and \textit{dashed} the arrow tip of the selected \textsf{attackstyle} will be used.}
+ \caption{Available options for \textsf{supportstyle}. Note that for \textit{standard} and \textit{dashed} the arrow tip of the selected \textsf{attackstyle} will be used.}
\label{fig:supportstyle}
\end{figure}
-\newpage
-\noindent\texttt{namestyle=}\opt{option}
-
- The \textsf{namestyle} parameter offers five different options
- \begin{align*}
- \mathsf{none} &\quad \text{(default) No effect applied to argument name.}\\
- \mathsf{math} &\quad \text{The argument name is rendered as $math$ text.}\\
- &\quad\quad \text{(name must be given without mathmode).}\\
- \mathsf{italics} &\quad \text{The argument name is rendered in \textit{italics}.}\\
- &\quad\quad \text{(name must be given in mathmode to apply effect).}\\
- \mathsf{bold} &\quad \text{The argument name is rendered in $\boldsymbol{bold}$.}\\
- &\quad\quad \text{(name must be given in mathmode to apply effect).}\\
- \mathsf{monospace} &\quad \text{The argument name is rendered in \texttt{monospace} font.}\\
- &\quad\quad \text{(name must be given in mathmode to apply effect).}\\
- \end{align*}
-
-\begin{figure}[!h]
- \begin{subfigure}{0.3\textwidth}
+\paragraph{\sffamily namestyle=\mopt{option}}
+
+\begin{align*}
+ \mathsf{none} &\quad \text{No effect applied to argument name.}\\
+ \mathsf{math} &\quad \text{The argument name is rendered as $math$ text.}\\
+ &\quad\quad \text{(name must be given without mathmode).}\\
+ \mathsf{bold} &\quad \text{The argument name is rendered in $\boldsymbol{bold}$.}\\
+ &\quad\quad \text{(name must be given without mathmode).}\\
+ \mathsf{monospace} &\quad \text{The argument name is rendered in \texttt{monospace} font.}\\
+ &\quad\quad \text{(name must be given without mathmode).}\\
+ \mathsf{monoemph} &\quad \text{The argument name is rendered as {\ttfamily\emph{name}}.}
+\end{align*}
+
+\begin{figure}[!ht]
+ \begin{subfigure}{0.32\textwidth}
\centering
\begin{af}[namestyle=none]
\argument{a}
@@ -405,7 +986,7 @@ The \argumentation package can be imported via the command
\label{fig:namestyle_none}
\end{subfigure}
\hfill
- \begin{subfigure}{0.3\textwidth}
+ \begin{subfigure}{0.32\textwidth}
\centering
\begin{af}[namestyle=math]
\argument{a}
@@ -417,23 +998,11 @@ The \argumentation package can be imported via the command
\label{fig:namestyle_math}
\end{subfigure}
\hfill
- \begin{subfigure}{0.3\textwidth}
- \centering
- \begin{af}[namestyle=italics]
- \argument{$a$}
- \argument[right=of a1]{$b$}
-
- \attack[]{a1}{a2}
- \end{af}
- \caption{\textsf{namestyle}=\textit{italics}}
- \label{fig:namestyle_italics}
- \end{subfigure}
- \par\bigskip
- \begin{subfigure}{0.49\textwidth}
+ \begin{subfigure}{0.32\textwidth}
\centering
\begin{af}[namestyle=bold]
- \argument{$a$}
- \argument[right=of a1]{$b$}
+ \argument{a}
+ \argument[right=of a1]{b}
\attack[]{a1}{a2}
\end{af}
@@ -441,483 +1010,117 @@ The \argumentation package can be imported via the command
\label{fig:namestyle_bold}
\end{subfigure}
\hfill
+ \par\bigskip
\begin{subfigure}{0.49\textwidth}
\centering
\begin{af}[namestyle=monospace]
- \argument{$a$}
- \argument[right=of a1]{$b$}
+ \argument{a}
+ \argument[right=of a1]{b}
\attack[]{a1}{a2}
\end{af}
\caption{\textsf{namestyle}=\textit{monospace}}
\label{fig:namestyle_monospace}
\end{subfigure}
- \caption{The available options for \textsf{namestyle}. You can of course apply any formatting yourself when using the default \textsf{namestyle}=\textit{none}.}
- \label{fig:namestyle}
-\end{figure}
-
-\subsection{The \texttt{af} Environment}\label{sec:af}
-The \argumentation package provides an environment for creating abstract argumentation frameworks and many of its extensions in \LaTeX-documents.\\
-
-\vspace{-0.2cm}
-\noindent
-\verb|\begin{af}[|\opt{options}\verb|]|
-
-\opt[green]{environment~content}
-
-\noindent
-\verb|\end{af}|
-
-\begin{list}{}{\leftmargin=\parindent\rightmargin=0pt}
- \item
- The above described style options can be set locally for each instance of the \texttt{af} environment by setting the respective parameters in the options of the environment.
- Local settings override the defaults and globally set values (See Section~\ref{sec:style}
- for examples).
-
- The \texttt{af} environment extends the \textsf{tikzpicture} environment, meaning all \tikzname commands can be used inside the \texttt{af} environment as well.
- Furthermore, all options for the \textsf{tikzpicture} environment can be used for the \texttt{af} environment as well, e.\,g the option \verb|node distance|, which is set to \verb|1cm| per default.
-
- If you want to create an argumentation framework with limited space available, you can use one of the following predefined options for the \texttt{af} environment.
- This is especially useful for two-column layout documents.
- \begin{align*}
- \mathsf{tiny} &\quad \text{\textsf{node distance} is set to $0.35cm$ and nodes are smaller.}\\
- \mathsf{small} &\quad \text{\textsf{node distance} is set to $0.55cm$ and nodes are smaller.}
- %TODO:& argument size as parameter
- \end{align*}
-
- %\begin{example}
- % Consider the two AFs in Figure~\ref{fig:mini_afs} created with the \textsf{small} and \textsf{tiny} option respectively.
- %\end{example}
-\end{list}
-
-\begin{figure}[ht]
- \begin{subfigure}{0.48\textwidth}
- \centering
- \begin{af}[small]
- \argument{a}
- \argument[right=of a1]{b}
- \argument[right=of a2]{c}
- \argument[right=of a3]{d}
- \argument[right=of a4]{e}
- \argument[below=of a1]{f}
- \argument[inactive,right=of a6]{g}
- \argument[inactive,argin,right=of a7]{h}
- \argument[right=of a8]{i}
- \argument[right=of a9]{j}
-
- \afname[left of=a1,yshift=-0.55cm,xshift=-0.2cm]{\textbf{F:}}
-
- \selfattack{a1}
- \dualattack[]{a1}{a6}
- \dualattack[inactive]{a6}{a7}
- \attack[inactive]{a8}{a7}
-
- \attack[inactive]{a7}{a2}
- \attack[]{a3}{a2}
-
- \support[]{a4}{a3}
- \support[]{a9}{a3}
-
- \attack[]{a4}{a5}
- \attack[]{a5}{a10}
- \attack[]{a10}{a9}
- \attack[]{a9}{a4}
- \end{af}
- \caption{An exemplary AF created with the \textsf{small} option set.}
- \label{fig:example_small}
- \end{subfigure}
\hfill
- \begin{subfigure}{0.48\textwidth}
+ \begin{subfigure}{0.49\textwidth}
\centering
- \begin{af}[tiny]
- \argument{a}
- \argument[right=of a1]{b}
- \argument[right=of a2]{c}
- \argument[right=of a3]{d}
- \argument[right=of a4]{e}
- \argument[below=of a1]{f}
- \argument[inactive,right=of a6]{g}
- \argument[inactive,argin,right=of a7]{h}
- \argument[right=of a8]{i}
- \argument[right=of a9]{j}
-
- \afname[left of=a1,yshift=-0.4cm,xshift=-0.2cm]{\textbf{F:}}
-
- \selfattack{a1}
- \dualattack[]{a1}{a6}
- \dualattack[inactive]{a6}{a7}
- \attack[inactive]{a8}{a7}
-
- \attack[inactive]{a7}{a2}
- \attack[]{a3}{a2}
-
- \support[]{a4}{a3}
- \support[]{a9}{a3}
-
- \attack[]{a4}{a5}
- \attack[]{a5}{a10}
- \attack[]{a10}{a9}
- \attack[]{a9}{a4}
- \end{af}
- \caption{An exemplary AF created with the \textsf{tiny} option set.}
- \label{fig:example_tiny}
- \end{subfigure}
- \caption{Two AFs with smaller nodes, created by using the \textsf{small} and \textsf{tiny} options of the \texttt{af} environment.}
- \label{fig:mini_afs}
-\end{figure}
-
-While the following commands are intended to be used inside the \texttt{af} environment, they can also be used inside the \textsf{tikzpicture} environment.
-
-\subsection{Creating Arguments}
- Arguments can be created with the \verb|\argument| command.
- The full command is defined as follows\\
-
- \noindent
- \verb|\argument[|\opt{options}\verb|](|\opt{id}\verb|){|\opt{name}\verb|}| \verb|at| (\opt{posX}, \opt{posY})
-
- \begin{list}{}{\leftmargin=\parindent\rightmargin=0pt}
- \item\opt{options}~ (optional) a list of \tikzname style parameters and/or relative positioning information (see Section~\ref{sec:relpos}).
- \item\opt{id}~ (optional) the identifier of the new argument. When omitted, arguments will automatically be assigned an identifier of the form: $a1, a2, a3,...$
- \item\opt{name}~ the displayed name of the argument.
- \item\opt{posX}, \opt{posY}~ (optional) the coordinates where the argument is placed. Should be omitted if relative positioning is used.
-
- \item When creating an argument you only have to provide the \opt{name}, all other parameters are optional.
- The \opt{id} of an argument is used for referencing, e.\,g., when creating attacks or for the relative positioning of other arguments.
- \end{list}
-
-\newpage
-\begin{example}~
- \begin{verbatim}
- \begin{af}
- \argument{$a$}
- \argument{$b$} at (1, 1)
- \argument[right=of a2]{$c$}
- \argument(argD){$d$} at (-2, 0)
- \argument[above=of argD]{$e$}
- \end{af}
- \end{verbatim}
-
- \begin{center}
- \begin{af}
- \argument{$a$}
- \argument{$b$} at (1, 1)
- \argument[right=of a2]{$c$}
- \argument(argD){$d$} at (-2, 0)
- \argument[above=of argD]{$e$}
- \end{af}
- \end{center}
-\end{example}
-
-\subsubsection{Relative Positioning}\label{sec:relpos}
- Placement of argument nodes with the \argumentation package relies on relative placement via the \tikzname-library \textsf{positioning}.
- The relative positioning information is provided as an optional parameter as follows\\
-
- \noindent
- \verb|\argument[|\opt{dir}\verb|=of |\opt{arg\_id}\verb|](|\opt{id}\verb|){|\opt{name}\verb|}|
-
- \begin{list}{}{\leftmargin=\parindent\rightmargin=0pt}
- \item\opt{dir}~ has to be one of: \emph{right}, \emph{left}, \emph{below} and \emph{above}
- \item\opt{arg\_id}~ is the identifier of another argument
- \item Additionally, you can adjust the horizontal/vertical position of an argument via the options \verb|xshift=|\opt{v} and \verb|yshift=|\opt{v}.
- The value \opt{v} is the horizontal/vertical offset, e.\,g., \verb|5pt|, \verb|-3ex| or \verb|0.2cm|.
- \end{list}
-
-
- \begin{example}~
-
- \begin{verbatim}
- \begin{af}
- \argument{a}
- \argument[below=of a1]{b}
- \argument[right=of a1, yshift=-24pt,xshift=-8pt]{c}
- \argument[right=of a3, xshift=-0.5cm]{d}
- \argument[right=of a4, yshift=5ex]{e}
- \end{af}
- \end{verbatim}
-
- \begin{center}
- \begin{af}
- \argument{a}
- \argument[below=of a1]{b}
- \argument[right=of a1, yshift=-24pt,xshift=-8pt]{c}
- \argument[right=of a3, xshift=-0.5cm]{d}
- \argument[right=of a4, yshift=5ex]{e}
- \end{af}
- \end{center}
-
- \end{example}
-
-%\subsubsection{Absolute Positioning}
-
-\subsubsection{Argument Identifiers}
- When creating an argument, it is automatically assigned an identifier for the sake of simplicity.
- You can override this identifier by giving another identifier in parenthesis to the \verb|\argument| command.
- Per default, the argument identifiers will be numerical of the form $a1, a2, a3, \dots$ based on their order of creation inside the \texttt{af} environment.
- If you preferred alphabetical identifiers, you can set the package option \textsf{indexing}=\emph{alphabetic} and the argument identifiers will instead be $a, b, c, \dots$.
-
-\subsubsection{Additional Argument Styles}
- Furthermore, you can provide optional parameters to adjust the style of the argument node.
- For that you can use all \tikzname-style options and additionally the following predefined style parameters:
- \begin{align*}
- \mathsf{inactive} &\quad \text{The argument is displayed with grey outline and text.}\\
- \mathsf{incomplete} &\quad \text{The argument is displayed with a dotted outline.}\\
- \mathsf{invisible} &\quad \text{The argument node is completely transparent.}\\
- \mathsf{accepted} &\quad \text{The argument is displayed with green background color.}\\
- \mathsf{rejected} &\quad \text{The argument is displayed with red background color.}\\
- \mathsf{undecided} &\quad \text{The argument is displayed with cyan background color.}\\
- \end{align*}
-
- %Some relevant \tikzname style-parameters are
- %\begin{align*}
- %\textsf{circle} &\quad \text{the shape of the argument.}\\
- % \textsf{minimum~size=0.75cm} &\quad \text{the minimum size of the circle, to ensure consistent}\\
- % &\quad \text{argument size.}\\
- % \textsf{draw=black} &\quad \text{outline and text color of the argument.}\\
- %\textsf{thick} &\quad \text{the outline of the circle is rendered in \textsf{thick} mode.}\\
- % \textsf{fill=white} &\quad \text{the background color of the argument.}\\
- % \textsf{font=large} &\quad \text{the font size of the argument name.}\\
- %\textsf{text~centered} &\quad \text{positioning of the argument name inside the circle.}\\
- % \textsf{inner~sep=0} &\quad \text{inner margins of the circle, set to \textsf{0} to optimize space.}
- %\end{align*}
-
-
-\subsection{Creating Attacks}
- Attacks between two arguments can be created with the command\\
-
- \noindent
- \verb|\attack{|\opt{arg1}\verb|}{|\opt{arg2}\verb|}|
-
- \begin{list}{}{\leftmargin=\parindent\rightmargin=0pt}
- \item where \opt{arg1} and \opt{arg2} are the identifiers of two previously defined arguments.
- \end{list}
-
-
-\subsubsection{Additional Attack Styles}
- To customize an attack you can provide additional optional parameters:
- \begin{align*}
- \mathsf{inactive} &\quad \text{The attack is displayed in grey.}\\
- \mathsf{incomplete} &\quad \text{The attack is displayed with a dotted line.}\\
- \mathsf{invisible} &\quad \text{The attack is completely transparent.}\\
- \mathsf{selfattack} &\quad \text{Use if source and target of the attack are the same node.}\\
- \mathsf{bend~right} &\quad \text{The attack arrow is bent to the right.}\\
- &\quad \text{Can additionally provide the angle, e.\,g., \textsf{bend~right=40}.}\\
- \mathsf{bend~left} &\quad \text{The attack arrow is bent to the left. Can also provide an angle.}
- \end{align*}
-
- Of course, all \tikzname style parameters can be used here as well.
-
- \begin{example}~
- \begin{verbatim}
- \begin{af}
- \argument{a}
- \argument[right=of a1]{b}
- \argument[right=of a2]{c}
- \argument[right=of a3]{d}
-
- \attack{a1}{a2}
- \attack[bend right]{a2}{a3}
- \attack[bend left=10,inactive]{a3}{a4}
- \end{af}
- \end{verbatim}
-
- \begin{center}
- \begin{af}
- \argument{a}
- \argument[right=of a1]{b}
- \argument[right=of a2]{c}
- \argument[right=of a3]{d}
-
- \attack{a1}{a2}
- \attack[bend right]{a2}{a3}
- \attack[bend left=10,inactive]{a3}{a4}
- \end{af}
- \end{center}
- \end{example}
-
- Additionally, there is a shortcut for creating a symmetric attack between two arguments with
-
- \noindent
- \verb|\dualattack{|\opt{arg1}\verb|}{|\opt{arg2}\verb|}|\\
-
- \noindent
- and a shortcut for a self-attack for an argument with
-
- \noindent
- \verb|\selfattack{|\opt{arg1}\verb|}|\\
-
- \noindent
- For both commands, you can use the same optional parameters as for the \verb|\attack| command.
-
- \begin{example}~
- \begin{verbatim}
- \begin{af}
- \argument{a}
- \argument[right=of a1]{b}
-
- \selfattack{a2}
- \dualattack{a1}{a2}
- \end{af}
- \end{verbatim}
-
- \begin{center}
- \begin{af}
- \argument{a}
- \argument[right=of a1]{b}
-
- \selfattack{a2}
- \dualattack{a1}{a2}
- \end{af}
- \end{center}
- \end{example}
-
-
-\subsection{Creating Support Relations}
- You can create a support relation between two arguments with the command\\
-
- \noindent
- \verb|\support{|\opt{arg1}\verb|}{|\opt{arg2}\verb|}|
-
- \begin{list}{}{\leftmargin=\parindent\rightmargin=0pt}
- \item where \opt{arg1} and \opt{arg2} are the identifiers of two previously defined arguments.
- The support arrow use the same tip as the attack arrows, but have a perpendicular mark to distinguish them from attacks.
- Supports can be customized in the same way as attacks.
- \end{list}
- \begin{example}~
- \begin{verbatim}
- \begin{af}
- \argument{a}
- \argument[right=of a1]{b}
- \argument[right=of a2]{c}
-
- \support{a1}{a2}
- \support[bend right]{a2}{a3}
- \end{af}
- \end{verbatim}
-
- \begin{center}
- \begin{af}
- \argument{a}
- \argument[right=of a1]{b}
- \argument[right=of a2]{c}
-
- \support{a1}{a2}
- \support[bend right]{a2}{a3}
- \end{af}
- \end{center}
- \end{example}
-
-\subsection{Annotated Attacks}
- Many extensions of the original abstract argumentation framework rely on attacks with an associated value.
- This may, for instance, be probabilities in the case of probabilistic argumentation frameworks or numerical weights in the case of weighted argumentation frameworks.
- These annotations can be added manually via \tikzname or via the following command\\
-
- \noindent
- \verb|\annotatedattack[|\opt{position}\verb|]{|\opt{arg1}\verb|}{|\opt{arg2}\verb|}{|\opt{value}\verb|}|
-
- \begin{list}{}{\leftmargin=\parindent\rightmargin=0pt}
- \item where \opt{arg1} and \opt{arg2} are the identifiers of two previously defined arguments and \opt{value} is the text or number that should be annotated to the attack.
- \opt{position} specifies where the annotation should be placed relative to the attack arrow and should be one of: \textsf{above}, \textsf{below}, \textsf{left}, \textsf{right}.
- \end{list}
-
- \begin{example}~
- \begin{verbatim}
- \begin{af}
- \argument{a}
- \argument[right=of a1]{b}
- \argument[right=of a2]{c}
-
- \annotatedattack[below]{a1}{a2}{$x$}
- \annotatedattack[above,bend right]{a2}{a3}{$0.6$}
- \end{af}
- \end{verbatim}
-
- \begin{center}
- \begin{af}
- \argument{a}
- \argument[right=of a1]{b}
- \argument[right=of a2]{c}
-
- \annotatedattack[below]{a1}{a2}{$x$}
- \annotatedattack[above,bend right]{a2}{a3}{$0.6$}
- \end{af}
- \end{center}
- \end{example}
-
-\subsection{Further Commands}
- If you want to display an name (or some other text) for your argumentation framework in the picture, you can use the \verb|\afname| command.
- Just like the \verb|\argument| command it can include an optional identifier and supports both relative and absolute positioning.
- Some example usages:\\
-
- \vspace{-0.25cm}
- \noindent\verb|\afname{|\opt{name}\verb|}|
-
- \noindent\verb|\afname(|\opt{id}\verb|){|\opt{name}\verb|}|
-
- \noindent\verb|\afname[|\opt{relPos}\verb|]{|\opt{name}\verb|}|
-
- \noindent\verb|\afname{|\opt{name}\verb|}| \verb|at (|\opt{posX},\opt{posY}\verb|)|
-
- \begin{list}{}{\leftmargin=\parindent\rightmargin=0pt}
- \item where \opt{id} is an (optional) identifier for the created node (if omitted, the default identifier will be \textit{cap}) and \opt{name} is the text displayed in the picture.
- Additional positioning information, via \textsf{xshift} or \textsf{yshift}, can be provided via the optional parameters.
- \end{list}
-
- \noindent
- To create an annotation, e.\,g., an acceptance condition or a weight, next to an argument, the following command can be used.\\
-
- \noindent
- \verb|\annotation[|\opt{optional}\verb|]{|\opt{arg\_id}\verb|}{|\opt{text}\verb|}|
-
- \begin{list}{}{\leftmargin=\parindent\rightmargin=0pt}
- \item where \opt{arg\_id} is the identifier of some argument and \opt{text} is the text to be displayed.
- Additionally, positioning information, via \textsf{xshift} or \textsf{yshift}, can be provided via the optional parameters.
- \end{list}
-
- \begin{example}~
- \begin{verbatim}
- \begin{af}
- \argument{a}
- \argument[right=of a1]{b}
- \afname{$F:$} at (-1,0)
- \annotation[yshift=-0.4cm,xshift=0.4cm]{a2}{$\neg a$}
-
- \support{a1}{a2}
- \end{af}
- \end{verbatim}
-
- \begin{center}
- \begin{af}
+ \begin{af}[namestyle=monoemph]
\argument{a}
\argument[right=of a1]{b}
- \afname{$F:$} at (-1,0)
- \annotation[yshift=-0.4cm,xshift=0.4cm]{a2}{$\neg a$}
- \support{a1}{a2}
+ \attack[]{a1}{a2}
\end{af}
- \end{center}
- \end{example}
-
- You can manually override the \textsf{argumentstyle}, \textsf{attackstyle} and \textsf{supportstyle} parameters and set a custom style globally via the following commands respectively.\\
-
- \vspace{-0.3cm}
- \noindent
- \verb|\setargumentstyle{|\opt{style}\verb|}|
-
- \noindent
- \verb|\setattackstyle{|\opt{style}\verb|}|
-
- \noindent
- \verb|\setsupportstyle{|\opt{style}\verb|}|
-
- \begin{list}{}{\leftmargin=\parindent\rightmargin=0pt}
- \item
- where \opt{style} is a list of \tikzname style parameters.
- \end{list}
+ \caption{\textsf{namestyle}=\textit{monoemph}}
+ \label{fig:namestyle_monoemph}
+ \end{subfigure}
+ \caption{Available options for \textsf{namestyle}. You can of course apply any formatting yourself when using the default \textsf{namestyle}=\textit{none}.}
+ \label{fig:namestyle}
+\end{figure}
-%\section{Style Definitions}
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Style Parameter Reference}\label{sec:parameters}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+For reference, the style parameters provided by this package are listed below.
+You may use or redefine them at your own discretion.
+\begin{table}[ht]
+ \centering
+ \ttfamily
+ \begin{tabular}{l|l}
+ \toprule
+ \tikzname-keyword & style parameters \\
+ \midrule
+ \textsf{argument size} & \emph{contains the currently selected argument size}\\
+ \textsf{argument} & \emph{contains the currently selected argument style and size}\\
+ \textsf{argument standard} & circle,inner sep=0,outer sep=0,draw=black\\
+ \textsf{argument large} & circle,inner sep=0,outer sep=0,draw=black,font=\verb|\|large\\
+ \textsf{argument thick} & circle,inner sep=0,outer sep=0,draw=black,line width=0.1em\\
+ \textsf{argument gray} & argument thick,fill=gray!30,draw=gray!65,text=black!80\\
+ \textsf{argument colored} & argument thick,fill=aigblue!40,draw=aigblue!80,text=black!80\\
+ \midrule
+ \textsf{attack} & \emph{contains the currently selected attack style}\\
+ \textsf{attack standard} & -\{stealth'\}\\
+ \textsf{attack large} & -\{Stealth[scale=1.25]\}\\
+ \textsf{attack modern} & -\{To[sharp,length=0.65ex,line width=0.05em]\}\\
+ \textsf{selfattack} & loop,min distance=0.4em,in=0,out=60,looseness=4.5\\
+ \midrule
+ \textsf{support} & \emph{contains the currently selected support style}\\
+ \textsf{support standard} & attack,postaction=\{decorate,decoration=\{\dots\}\}\\
+ \textsf{support dashed} & attack,densely dashed\\
+ \textsf{support double} & -\{Classical TikZ Rightarrow\},double\\
+ \midrule
+ \textsf{inactive} & fill=none,draw=gray!50,text=gray!60\\
+ \textsf{incomplete} & densely dashed\\
+ \textsf{accepted} & fill=green!40\\
+ \textsf{rejected} & fill=red!40\\
+ \textsf{undecided} & fill=cyan!40\\
+ \textsf{highlight} & fill=aigyellow!60\\
+ \textsf{invisible} & draw=none,fill=none,opacity=0.0\\
+ \midrule
+ \textsf{standard} & node distance=6.6ex,argument size/.style={minimum size=4.5ex},\\
+ & attack width/.style={line width=0.05em}\\
+ \textsf{small} & node distance=3.5ex,argument size/.style={minimum size=3.4ex},\\
+ & attack width/.style={line width=0.045em}\\
+ \textsf{tiny} & node distance=2.3ex,argument size/.style={minimum size=2.6ex,}\\
+ & attack width/.style={line width=0.03em},font=\verb|\small|\\
+ \bottomrule
+ \end{tabular}
+ \caption{Reference list of \tikzname-style parameters provided by the \argumentation package.}
+ \label{tab:styles}
+ \end{table}
\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Version History}\label{sec:history}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection*{[v1.5 2025/02/09]}
+\begin{itemize}
+ \item Added support for beamer overlay specifications to \verb|\argument{ }|, \verb|\attack{ }{ }| and related commands.
+ \item Added \textsf{covered} parameter for \texttt{af} environment to select between \textit{transparent} and \textit{invisible} rendering of inactive arguments/attacks on slides.
+ \item Bugfix related to experimental beamer commands.
+\end{itemize}
+
+\subsection*{[v1.4 2024/10/31]}
+\begin{itemize}
+ \item Added functions \verb|\aflabeling|, \verb|\afextension|, \verb|\afreduct| and \verb|\afrestriction| that recreate (parts of) previously created argumentation frameworks. Can be enabled via the package option \textsf{beamer=true}.
+ \item Added internal storage of arguments and attacks of an argumentation framework to enable further computations.
+ \item Added environment \verb|af*| for argumentation frameworks that are unlabeled/uncounted.
+ \item Added command \verb|\setargumentcolorscheme{ }{ }| to change color scheme of the \textsf{colored} argument style.
+ \item Added command \verb|\setafstyle{ }| to set global style options for the AFs.
+ \item Added optional parameter (\popt{value}) to \verb|\attack| command to add a label to the attack edge (undocumented for now).
+ \item Major revision of the documentation.
+ \item Various minor changes to internal functions, naming scheme and comments.
+\end{itemize}
+\subsection*{[v1.3 2024/09/25]}
+\begin{itemize}
+ \item Added support for \verb|\label{ }| and \verb|\ref{ }| to \texttt{af} environment.
+ \item Added commands \verb|\AF|, \verb|\arguments|, \verb|\attacks| and \verb|\AFcomplete| to facilitate consistent naming of AFs. Have to be loaded with the package option \textsf{macros=true}.
+ \item Added commands \verb|\afref{ }| and \verb|\fullafref{ }| to reference AFs.
+ \item adjusted scaling of nodes and arrows for larger page sizes.
+ \item added new style options for arguments.
+ \item Various minor fixes and changes regarding the \textsf{namestyle} package option.
+\end{itemize}
\subsection*{[v1.2 2024/06/07]}
\begin{itemize}
@@ -944,4 +1147,4 @@ While the following commands are intended to be used inside the \texttt{af} envi
\item First Version.
\end{itemize}
-\end{document}
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/argumentation/argumentation.sty b/graphics/pgf/contrib/argumentation/argumentation.sty
index f247cd959a..e7c42ece84 100644
--- a/graphics/pgf/contrib/argumentation/argumentation.sty
+++ b/graphics/pgf/contrib/argumentation/argumentation.sty
@@ -1,78 +1,150 @@
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{argumentation}[2024/05/03 Argumentation]
+\ProvidesPackage{argumentation}[2025/02/09 Argumentation]
% Author: Lars Bengel
% E-Mail: lars.bengel@fernuni-hagen.de
-% Version: 1.1
-% Date: 2023/12/03
+% Version: 1.5
+% Date: 2025/02/09
% License: LaTeX Project Public License 1.3c
-%%%%%%%%%%% Package Requirements %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\RequirePackage{amsbsy,amsmath} % For proper bold letters in math mode
-\RequirePackage{pgfopts} % For managing package options
-\RequirePackage{tikz} % For drawing the argumentation frameworks
-\usetikzlibrary{positioning} % For relative node positioning
-\usetikzlibrary{arrows.meta} % For directed edges / attack arrows
-\usetikzlibrary{arrows} % For directed edges / attack arrows
-\usetikzlibrary{decorations.markings} % For creating the support edge markings
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%% Package Tikz Style Definitions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newcounter{argument}
-%\newcommand{\argument}{\relax}
-\newcommand{\argstyle}[1]{#1} % Defines the font style in which argument names are displayed
+
+%%%%%%%%%%% Package Requirements %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{amsbsy,amsmath} % Proper bold letters in math mode
+\RequirePackage{pgfopts} % Managing package options
+\RequirePackage{etoolbox} % Internal list handling
+\RequirePackage{refcount} % Expandable ref-counter value
+\RequirePackage{xspace} % Dynamic spaces after math commands
+\RequirePackage{xcolor} % Defining colors
+\RequirePackage{tikz} % Drawing the argumentation frameworks
+\usetikzlibrary{positioning} % Relative node positioning
+\usetikzlibrary{arrows.meta} % Directed edges / attack arrows
+\usetikzlibrary{arrows} % Directed edges / attack arrows
+\usetikzlibrary{decorations.markings} % Creating the support edge markings
+
+
+%%%%%%%%%%% Package Style Definitions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Color definitions
+\definecolor{aigyellow}{RGB}{210,149,81} % Highlight color
+\definecolor{aigblue}{RGB}{0,76,151} % Node color
%%% Argument Style Definitions
-\tikzset{ % global base styles
- argument size/.style={minimum size=0.7cm}, % Standard size of argument nodes
- argument/.style={}, % Base style for argument nodes
- argument standard/.style={circle,draw=black,inner sep=0,outer sep=0, argument size},
- argument large/.style={circle,draw=black,inner sep=0,outer sep=0, argument size, font=\large},
- argument thick/.style={circle,draw=black,inner sep=0,outer sep=0, argument size, thick},
+\tikzset{
+ argument size/.style={}, % Size of argument nodes
+ argument/.style={}, % Base style for argument nodes
+ argument standard/.style={circle,draw=black,inner sep=0,outer sep=0}, % Standard argument style
+ argument large/.style={circle,draw=black,inner sep=0,outer sep=0, font=\large}, % Large argument style
+ argument thick/.style={circle,draw=black,inner sep=0,outer sep=0, line width=0.1em}, % Thick outline argument style
+ argument gray/.style={argument thick,fill=gray!30,draw=gray!65,text=black!80}, % Gray argument style
+ argument colored/.style={argument thick,fill=aigblue!40,draw=aigblue!80}, % Colored argument stlye
}
%%% Attack/Support Edge Definitions
-\tikzset{ % global base styles
+\tikzset{
+ attack width/.style={}, % Width of attack arrows
attack/.style={}, % Base style for attack arrow
attack standard/.style={-{stealth'}}, % Standard attack arrow
attack large/.style={-{Stealth[scale=1.25]}}, % Larger arrow tip
- attack modern/.style={-{To[sharp,length=0.9mm,line width=0.7pt]}}, % Mordern rightarrow style tip
- support/.style={},
- support standard/.style = {attack, postaction = {decorate,decoration={markings,mark=at position 0.36 with {\draw[-] (0,-0.1) -- (0.1,0.1);}}}}, % Standard support arrow
- support dashed/.style={attack,densely dashed},
- support double/.style={-{Classical TikZ Rightarrow},double},
+ attack modern/.style={-{To[sharp,length=0.65ex,line width=0.05em]}}, % Mordern rightarrow style tip
+ support/.style={}, % Base style for support
+ support standard/.style = {attack, postaction = {decorate,decoration={markings,mark=at position 0.36 with {\draw[-] (0,-0.1) -- (0.1,0.1);}}}}, % Standard support arrow
+ support dashed/.style={attack,densely dashed}, % Dashed Support arrow
+ support double/.style={-{Classical TikZ Rightarrow},double}, % double-line support arrow
+}
+
+%%% Additional Style Parameters
+\tikzset{
+ selfattack/.style={loop,min distance=0.4em,in=0,out=60,looseness=4.5}, % Self-attack
+ inactive/.style={fill=none,draw=gray!50,text=gray!60}, % Inactive argument or edge (reduct)
+ incomplete/.style={densely dashed}, % incomplete argument or edge
+ accepted/.style={fill=green!40}, % Accepted argument (in)
+ rejected/.style={fill=red!40}, % Rejected argument (out)
+ undecided/.style={fill=cyan!40}, % Undecided Argument (undec)
+ highlight/.style={fill=aigyellow!60}, % Highlighted argument
+ caption/.style={draw=none}, % Caption or text
+ invisible/.style={draw=none,fill=none,opacity=0.0}, % Invisible argument or edge
+ annotation/.style={font=\small}, % Argument annotation
+ argin/.style={accepted},
+ argout/.style={rejected},
+ argundec/.style={undecided},
+}
+
+%%% Style-Options for af environment
+\pgfkeys{/tikz/.cd,
+ af/.style={}, % Base style for af
+ standard/.style={node distance=6.6ex,argument size/.style={minimum size=4.5ex},attack width/.style={line width=0.05em}}, % Standard size style for af
+ small/.style={node distance=3.5ex,argument size/.style={minimum size=3.4ex},attack width/.style={line width=0.045em},caption/.append style={font=\small}}, % Small size style for af
+ tiny/.style={node distance=2.3ex,argument size/.style={minimum size=2.6ex,font=\small},attack width/.style={line width=0.03em},caption/.append style={font=\small}}, % Tiny size style for af
+}
+
+%%% Option for switching beamer cover type in af
+\makeatletter
+\newif\if@afoverlay
+\pgfkeys{/tikz/.cd,
+ covered/.is choice,
+ covered/transparent/.code={\@afoverlaytrue},
+ covered/invisible/.code={\@afoverlayfalse},
+ covered/.default=transparent,
+ covered=transparent,
+}
+\makeatother
+
+
+%%%%%%%%%% Internal Utility Functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\makeatletter
+\newif\ifmacros
+\newif\ifbeamer
+\newif\if@numericidx
+\newif\if@alphaidx
+\newif\if@insideaf
+
+%%% Defines the font style in which argument names are displayed
+\newcommand{\@arg@style}[1]{#1}
+
+%%% Auxilliary command for splitting a given pair x,y into two macros
+\def\@split@pair#1,#2\relax{%
+ \def\@attacker{#1}%
+ \def\@attacked{#2}%
}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%% Package Options %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Dummy command in case the beamer documentclass is not loaded
+\ProvideDocumentCommand{ \alt } {r<> m m} {#2}
+
+
+\makeatother
+
+%%%%%%%%%% Package Options %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Options for style of the argument node itself
\pgfkeys{/tikz/.cd,
argumentstyle/.is choice,
- argumentstyle/standard/.code={\tikzset{argument/.style={argument standard}}},
- argumentstyle/large/.code={\tikzset{argument/.style={argument large}}},
- argumentstyle/thick/.code={\tikzset{argument/.style={argument thick}}},
+ argumentstyle/standard/.code={\tikzset{argument/.style={argument standard,argument size}}},
+ argumentstyle/large/.code={\tikzset{argument/.style={argument large,argument size}}},
+ argumentstyle/thick/.code={\tikzset{argument/.style={argument thick,argument size}}},
+ argumentstyle/gray/.code={\tikzset{argument/.style={argument gray,argument size}}},
+ argumentstyle/colored/.code={\tikzset{argument/.style={argument colored,argument size}}},
}
\pgfkeys{/argumentation/.cd,
.unknown/.code={},
argumentstyle/.is choice,
- argumentstyle/standard/.code={\tikzset{argument/.style={argument standard}}},
- argumentstyle/large/.code={\tikzset{argument/.style={argument large}}},
- argumentstyle/thick/.code={\tikzset{argument/.style={argument thick}}},
+ argumentstyle/standard/.code={\tikzset{argument/.style={argument standard,argument size}}},
+ argumentstyle/large/.code={\tikzset{argument/.style={argument large,argument size}}},
+ argumentstyle/thick/.code={\tikzset{argument/.style={argument thick,argument size}}},
+ argumentstyle/gray/.code={\tikzset{argument/.style={argument gray,argument size}}},
+ argumentstyle/colored/.code={\tikzset{argument/.style={argument colored,argument size}}},
argumentstyle=standard,
}
%%% Options for the style of the attack edges
\pgfkeys{/tikz/.cd,
attackstyle/.is choice,
- attackstyle/standard/.code={\tikzset{attack/.style={attack standard}}},
- attackstyle/large/.code={\tikzset{attack/.style={attack large}}},
- attackstyle/modern/.code={\tikzset{attack/.style={attack modern}}},
+ attackstyle/standard/.code={\tikzset{attack/.style={attack width,attack standard}}},
+ attackstyle/large/.code={\tikzset{attack/.style={attack width,attack large}}},
+ attackstyle/modern/.code={\tikzset{attack/.style={attack width,attack modern}}},
attackstyle=standard,
}
\pgfkeys{/argumentation/.cd,
attackstyle/.is choice,
- attackstyle/standard/.code={\tikzset{attack/.style={attack standard}}},
- attackstyle/large/.code={\tikzset{attack/.style={attack large}}},
- attackstyle/modern/.code={\tikzset{attack/.style={attack modern}}},
+ attackstyle/standard/.code={\tikzset{attack/.style={attack width,attack standard}}},
+ attackstyle/large/.code={\tikzset{attack/.style={attack width,attack large}}},
+ attackstyle/modern/.code={\tikzset{attack/.style={attack width,attack modern}}},
attackstyle=standard,
}
@@ -93,150 +165,491 @@
}
%%% Options for the automatic text formatting for the argument names
+\makeatletter
\pgfkeys{/tikz/.cd,
namestyle/.is choice,
- namestyle/none/.code={\renewcommand{\argstyle}[1]{##1}},
- namestyle/math/.code={\renewcommand{\argstyle}[1]{\ensuremath{##1}}},
- namestyle/italics/.code={\renewcommand{\argstyle}[1]{\ensuremath{\mathit{\text{##1}}}}},
- namestyle/bold/.code={\renewcommand{\argstyle}[1]{\ensuremath{\boldsymbol{\text{##1}}}}},
- namestyle/monospace/.code={\renewcommand{\argstyle}[1]{\ensuremath{\mathtt{\text{##1}}}}},
+ namestyle/none/.code={\renewcommand{\@arg@style}[1]{##1}},
+ namestyle/math/.code={\renewcommand{\@arg@style}[1]{\ensuremath{##1}}},
+ namestyle/bold/.code={\renewcommand{\@arg@style}[1]{\ensuremath{\boldsymbol{##1}}}},
+ namestyle/monospace/.code={\renewcommand{\@arg@style}[1]{{\ttfamily##1}}},
+ namestyle/monoemph/.code={\renewcommand{\@arg@style}[1]{{\ttfamily\itshape##1}}},
namestyle=none,
}
\pgfkeys{/argumentation/.cd,
namestyle/.is choice,
- namestyle/none/.code={\renewcommand{\argstyle}[1]{##1}},
- namestyle/math/.code={\renewcommand{\argstyle}[1]{\ensuremath{##1}}},
- namestyle/italics/.code={\renewcommand{\argstyle}[1]{\ensuremath{\mathit{##1}}}},
- namestyle/bold/.code={\renewcommand{\argstyle}[1]{\ensuremath{\boldsymbol{\text{##1}}}}},
- namestyle/monospace/.code={\renewcommand{\argstyle}[1]{\ensuremath{\mathtt{##1}}}},
+ namestyle/none/.code={\renewcommand{\@arg@style}[1]{##1}},
+ namestyle/math/.code={\renewcommand{\@arg@style}[1]{\ensuremath{##1}}},
+ namestyle/bold/.code={\renewcommand{\@arg@style}[1]{\ensuremath{\boldsymbol{##1}}}},
+ namestyle/monospace/.code={\renewcommand{\@arg@style}[1]{{\ttfamily##1}}},
+ namestyle/monoemph/.code={\renewcommand{\@arg@style}[1]{{\ttfamily\itshape##1}}},
namestyle=none,
}
-%%% Options for automatic indexing (and naming) of argument nodes
-\NewDocumentCommand { \argument } {} {\relax}
+
+%%% Option for automatic indexing of arguments
\pgfkeys{/argumentation/.cd,
indexing/.is choice,
- indexing/none/.code={
- \RenewDocumentCommand { \argument } {O{} r() m dat d()} {
- \IfNoValueTF {##5}{%
- \node[argument size,argument,##1](##2) {\argstyle{##3}};
+ indexing/numeric/.code={\@numericidxtrue},
+ indexing/alphabetic/.code={\@alphaidxtrue},
+ indexing/none/.code={\@numericidxfalse\@alphaidxfalse},
+ indexing/.default=numeric,
+ indexing=numeric,
+}
+\makeatother
+
+%%% Option for enabling additional macros
+\pgfkeys{/argumentation/.cd,
+ macros/.is choice,
+ macros/true/.code={\macrostrue},
+ macros/false/.code={\macrosfalse},
+ macros/.default=true,
+ macros=false,
+}
+
+%%% Option for enabling beamer functionality
+\pgfkeys{/argumentation/.cd,
+ beamer/.is choice,
+ beamer/true/.code={\beamertrue},
+ beamer/false/.code={\beamerfalse},
+ beamer/.default=true,
+ beamer=false,
+}
+
+\ProcessPgfPackageOptions{/argumentation}
+
+
+%%%%%%%%%%%%%%% Arguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\makeatletter
+% Internal counter for argument IDs
+\newcounter{@argument}
+
+%%% Command for creating arguments
+% #1 beamer overlay specification (optional)
+% #2 TikZ parameters (optional)
+% #3 unique argument ID (optional)
+% #4 argument display name
+% #5 ignored
+% #6 absolute positioning values (optional)
+\NewDocumentCommand { \argument } {D<>{.-} O{} d() m dat d()} {%
+ \stepcounter{@argument}
+ \IfNoValueTF {#3}{%
+ \if@alphaidx
+ \edef\@argid{\alph{@argument}}
+ \else\if@numericidx
+ \edef\@argid{a\arabic{@argument}}
+ \else
+ \PackageError{argumentation}{Missing argument ID}{Must either provide argument ID inside () or activate auto-indexing}
+ \fi\fi
+ }{%
+ \edef\@argid{#3}
+ }
+ \ifbeamer
+ \if@insideaf
+ \@make@argument{#2}{\@argid}{#4}{#5}{#6}{\arabic{af}}
+ \csname @af@\arabic{af}@arg@\@argid\endcsname{}
+ \else
+ \@create@argument{#1}{#2}{}{\@argid}{#4}{#6}
+ \fi
+ \else
+ \@create@argument{#1}{#2}{}{\@argid}{#4}{#6}
+ \fi
+}
+
+%%% Auxilliary command for creating arguments
+% #1 beamer overlay specification (optional)
+% #2 TikZ parameters (optional)
+% #3 TikZ parameters (optional)
+% #4 unique argument ID (optional)
+% #5 argument display name
+% #6 absolute positioning value (optional)
+\NewDocumentCommand { \@create@argument } {mmmmmm} {%
+ \alt<#1>{
+ \IfNoValueTF {#6}{%
+ \node[argument size,argument,#2,#3](#4) {\@arg@style{#5}};
+ }{%
+ \node[argument size,argument,#2,#3](#4) at (#6) {\@arg@style{#5}};
+ }
+ }{%
+ \if@afoverlay
+ \IfNoValueTF {#6}{%
+ \node[argument size,argument,inactive,#2,#3](#4) {\@arg@style{#5}};
}{%
- \node[argument size,argument,##1](##2) at (##5) {\argstyle{##3}};
+ \node[argument size,argument,inactive,#2,#3](#4) at (#6) {\@arg@style{#5}};
}
- }
- },
- indexing/numeric/.code={
- \RenewDocumentCommand { \argument } {O{} d() m dat d()} {
- \stepcounter{argument}
- \IfNoValueTF {##2}{%
- \IfNoValueTF {##5}{%
- \node[argument size,argument,##1](a\arabic{argument}) {\argstyle{##3}};
- }{%
- \node[argument size,argument,##1](a\arabic{argument}) at (##5) {\argstyle{##3}};
- }
+ \else
+ \IfNoValueTF {#6}{%
+ \node[argument size,argument,invisible,#2,#3](#4) {\@arg@style{#5}};
}{%
- \IfNoValueTF {##5}{%
- \node[argument size,argument,##1](##2) {\argstyle{##3}};
- }{%
- \node[argument size,argument,##1](##2) at (##5) {\argstyle{##3}};
- }
+ \node[argument size,argument,invisible,#2,#3](#4) at (#6) {\@arg@style{#5}};
}
+ \fi
+ }
+}
+
+\ifbeamer
+%%% Auxilliary command for creating unique argument macros
+% #1 TikZ parameters
+% #2 unique argument ID
+% #3 argument display name
+% #4 ignored
+% #5 absolute positioning values
+% #6 unique AF ID
+\NewDocumentCommand { \@make@argument } {mmmmmm} {%
+ \expandafter\listxadd\csname @arguments@#6\endcsname{#2}
+ \expandafter\global\expandafter\edef\csname @af@#6@arg@#2\endcsname##1{%
+ \@create@argument{.-}{#1}{##1}{#2}{#3}{#5}
+ }
+}
+\fi
+\makeatother
+
+
+%%%%%%%%%%%%%%% Attacks & Support %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\makeatletter
+%%% Command for creating attacks
+% #1 beamer overlay specification (optional)
+% #2 TikZ parameters (optional)
+% #3 attacking argument ID
+% #4 attacked argument ID
+% #5 annotation text (optional)
+\NewDocumentCommand { \attack } {D<>{.-} O{} m m d()} {%
+ \ifbeamer
+ \if@insideaf
+ \@make@attack{#2}{#3}{#4}{#5}{\arabic{af}}
+ \csname @af@\arabic{af}@att@#3#4\endcsname{}
+ \else
+ \@create@attack{#1}{#2}{}{#3}{#4}{#5}
+ \fi
+ \else
+ \@create@attack{#1}{#2}{}{#3}{#4}{#5}
+ \fi
+}
+
+%%% Internal command for creating the attack in TikZ
+% #1 beamer overlay specification (optional)
+% #2 TikZ parameters (optional)
+% #3 TikZ parameters (optional)
+% #4 attacking argument ID
+% #5 attacked argument ID
+% #6 annotation text
+\NewDocumentCommand { \@create@attack } {mmmmmm} {%
+ \alt<#1>{
+ \IfNoValueTF{#6}{%
+ \path(#4) edge [attack,#2,#3] (#5);
+ }{%
+ \path(#4) edge [attack,#2,#3] node[annotation](p_#4_#5){#6} (#5);
}
- },
- indexing/alphabetic/.code={
- \RenewDocumentCommand { \argument } {O{} d() m dat d()} {
- \stepcounter{argument}
- \IfNoValueTF {##2}{%
- \IfNoValueTF {##5}{%
- \node[argument size,argument,##1](\alph{argument}) {\argstyle{##3}};
- }{%
- \node[argument size,argument,##1](\alph{argument}) at (##5) {\argstyle{##3}};
- }
+ }{%
+ \if@afoverlay
+ \IfNoValueTF{#6}{%
+ \path(#4) edge [attack,inactive,#2,#3] (#5);
}{%
- \IfNoValueTF {##5}{%
- \node[argument size,argument,##1](##2) {\argstyle{##3}};
- }{%
- \node[argument size,argument,##1](##2) at (##5) {\argstyle{##3}};
- }
+ \path(#4) edge [attack,inactive,#2,#3] node[annotation](p_#4_#5){#6} (#5);
}
- }
- },
- indexing/.default=numeric,
- indexing=numeric,
+ \else
+ \IfNoValueTF{#6}{%
+ \path(#4) edge [attack,invisible,#2,#3] (#5);
+ }{%
+ \path(#4) edge [attack,invisible,#2,#3] node[annotation](p_#4_#5){#6} (#5);
+ }
+ \fi
+ }
}
-\ProcessPgfPackageOptions{/argumentation}
+\ifbeamer
+%%% Auxilliary command for creating unique attack macros
+% #1 TikZ parameters
+% #2 attacking argument ID
+% #3 attacked argument ID
+% #4 annotation text
+% #5 unique AF ID
+\NewDocumentCommand { \@make@attack } {mmmmm} {%
+ \expandafter\listgadd\csname @attacks@#5\endcsname{#2,#3}
+ \expandafter\global\expandafter\edef\csname @af@#5@att@#2#3\endcsname##1{
+ \@create@attack{.-}{#1}{##1}{#2}{#3}{#4}
+ }
+}
+\fi
-%%%%%%%%%%%%%%% AF Environment %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%% Additional AF Style Parameters
-\tikzset{ % global predefined tikz-styles
- selfattack/.style={loop,min distance=2mm,in=0,out=60,looseness=5}, % Standard style for self-attacks
- inactive/.style={draw=black!30,text=black!40}, % Make a node or edge inactive, i.e., greyed out
- incomplete/.style={densely dashed}, % Style for displaying incomplete nodes or attacks
- accepted/.style={fill=green}, % Color an argument that is labelled in
- rejected/.style={fill=red}, % Color an argument that is labelled out
- undecided/.style={fill=cyan}, % Color an argument that is labelled undecided
- caption/.style={draw=none}, % Style for displaying AF name in Figure
- invisible/.style={draw=none,text=black!0}, % Make a node or edge invisible
- annotation/.style={font=\small}, % text annotation style
- argin/.style={accepted},
- argout/.style={rejected},
- argundec/.style={undecided},
+%%% Self-attack edge
+% #1 TikZ parameters (optional)
+% #2 argument ID
+\NewDocumentCommand { \selfattack } {D<>{.-} O{} m} {%
+ \attack<#1>[selfattack,#2]{#3}{#3}
}
-%%% Options for af environment
-\pgfkeys{/tikz/.cd,
- small/.style = {node distance=0.55cm,argument size/.style={minimum size=0.55cm},caption/.append style={font=\small}},
- tiny/.style = {node distance=0.35cm,argument size/.style={minimum size=0.4cm,font=\small},caption/.append style={font=\small}},
+%%% Symmetric attack edges between two arguments
+% #1 TikZ parameters (optional)
+% #2 first argument ID
+% #3 second argument ID
+\NewDocumentCommand { \dualattack } {D<>{.-} O{} m m} {%
+ \attack<#1>[bend right,#2]{#3}{#4}
+ \attack<#1>[bend right,#2]{#4}{#3}
}
-%%% Initializing the af environment
+%%% Create attack edge with value (DEPRECATED as of v1.4)
+% #1 TikZ parameters (optional)
+% #2 attacking argument ID
+% #3 attacked argument ID
+% #4 annotation text
+\NewDocumentCommand{ \annotatedattack } {D<>{.-} O{} m m m} {%
+ \attack<#1>[#2]{#3}{#4}(#5)
+}
+
+%%% Support edge
+% #1 overlay specification (optional)
+% #2 TikZ parameters (optional)
+% #3 supporting argument ID
+% #4 supported argument ID
+\NewDocumentCommand { \support } {D<>{.-} O{} m m} {%
+ \alt<#1>{%
+ \path(#3) edge [support=0.35,#2] (#4);
+ }{%
+ \if@afoverlay
+ \path(#3) edge [support=0.35,inactive,#2] (#4);
+ \else
+ \path(#3) edge [support=0.35,invisible,#2] (#4);
+ \fi
+ }
+}
+\makeatother
+
+
+%%%%%%%%%%%%%%% AF Environment %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcounter{af}
-\newenvironment{af}[1][]{
- \refstepcounter{af}
- \setcounter{argument}{0}
+
+%%% Uncounted version of the environment
+\makeatletter
+\NewDocumentEnvironment {af*} {O{}} {%
+ \setcounter{@argument}{0}
\pgfkeys{/argumentation/.cd, #1}
- \tikzpicture[#1]
+ \tikzpicture[standard,af,#1]
}{%
\endtikzpicture
}
-%%%%%%%%%%%%%%%% Commands %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Standard version of af environment
+\NewDocumentEnvironment {af} {O{}} {%
+ \refstepcounter{af}
+ \ifbeamer
+ \global\expandafter\def\csname @arguments@\arabic{af}\endcsname{}
+ \global\expandafter\def\csname @attacks@\arabic{af}\endcsname{}
+ \fi
+ \@insideaftrue
+ \begin{af*}[#1]
+}{%
+ \end{af*}
+ \@insideaffalse
+}
+\makeatother
+
-% Creates a node displaying the name of the AF
-\NewDocumentCommand { \afname } { O{} D(){caption} m dat d()} {
- \IfNoValueTF {#5}{%
- \node[caption,#1](#2){#3};
+%%%%%%%%%%%%%%%% Additional Commands %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Definitions for referencing
+\ifmacros
+ \providecommand{\AF}{\ensuremath{F}\xspace} % AF abbreviation
+ \providecommand{\arguments}{\ensuremath{A}\xspace} % Set of arguments
+ \providecommand{\attacks}{\ensuremath{R}\xspace} % Set of attacks
+ \providecommand{\AFcomplete}{\ensuremath{\AF = (\arguments, \attacks)}\xspace} % Full AF
+ \newcommand{\afref}[1]{\ensuremath{\AF_{\ref{#1}}}\xspace} % Reference an AF
+ \newcommand{\fullafref}[1]{\ensuremath{\afref{#1} = (\arguments_{\ref{#1}}, \attacks_{\ref{#1}})}\xspace} % Full AF with reference
+\fi
+
+%%% Creates a node displaying the name of the AF
+% #1 overlay specification (optional)
+% #2 TikZ-parameters (optional)
+% #3 node identifier (optional)
+% #4 node name
+% #5 ignored
+% #6 node position
+\NewDocumentCommand { \afname } { D<>{.-} O{} D(){caption} m dat d()} {%
+ \alt<#1>{
+ \IfNoValueTF {#6}{%
+ \node[caption,#2](#3){#4};
+ }{%
+ \node[caption,#2](#3) at (#6) {#4};
+ }
}{%
- \node[caption,#1](#2) at (#5) {#3};
+ \IfNoValueTF {#6}{%
+ \node[caption,invisible,#2](#3){#4};
+ }{%
+ \node[caption,invisible,#2](#3) at (#6) {#4};
+ }
}
-
}
-\newcommand{\annotation}[3][]{\node[annotation,above of=#2,#1](an_#2){#3};}
+%%% Create a text annotation next to another node
+\NewDocumentCommand { \annotation } {D<>{.-} O{} m m} {%
+ \alt<#1>{%
+ \node[annotation,above of=#3,#2](an_#3){#4};
+ }{%
+ \node[annotation,above of=#3,invisible,#2](an_#3){#4};
+ }
+}
-% Creates an attack edge
-\newcommand{\attack}[3][]{\path(#2) edge [attack,#1] (#3);}
+%%% Commands for setting custom tikz-style parameters
+\newcommand{\setafstyle}[1]{\tikzset{af/.style={#1}}}
+\newcommand{\setargumentcolorscheme}[2]{\tikzset{argument colored/.style={argument thick,fill=#2,draw=#1}}}
+\newcommand{\setargumentstyle}[1]{\tikzset{argument/.style={argument size,#1}}}
+\newcommand{\setattackstyle}[1]{\tikzset{attack/.style={attack width,#1}}}
+\newcommand{\setsupportstyle}[1]{\tikzset{support/.style={#1}}}
+\newcommand{\setannotationstyle}[1]{\tikzset{annotation/.style={#1}}}
-% Creates a self-attack
-\newcommand{\selfattack}[2][]{\path(#2) edge [attack,selfattack,#1] (#2);}
-% Creates two symmetric attack edges between two arguments
-\newcommand{\dualattack}[3][]{\path(#2) edge [attack, bend right,#1] (#3);\path(#3) edge [attack, bend right,#1] (#2);}
+%%%%%%%%%%%% Beamer Commands %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifbeamer
+\makeatletter
+%%% Prints an extension of an AF for the given list of accepted arguments
+% #1 unique ID of an AF
+% #2 a comma-separated list of argument IDs
+\NewDocumentCommand { \afextension } {mm} {%
+ \@prepare@af{#1}
+ % Collect accepted arguments in list
+ \forcsvlist{\listeadd\@accepted@arguments}{#2}
-% Creates a weighted attack
-\newcommand{\annotatedattack}[4][]{\path(#2) edge [attack,#1] node[annotation](p_#2_#3){#4} (#3);}
+ % render the af with the given information
+ \@render@af{\@afid}{accepted}{}{}{}{}
+}
-% Creates a support edge between two arguments
-\newcommand{\support}[3][]{\path(#2) edge [support=0.35,#1] (#3);}
+%%% Prints a labeling of an AF for the given list of accepted arguments
+% #1 unique ID of an AF
+% #2 a comma-separated list of argument IDs
+\NewDocumentCommand { \aflabeling } {mm} {%
+ \@prepare@af{#1}
+ % Collect accepted arguments in list
+ \forcsvlist{\listeadd\@accepted@arguments}{#2}
-%%% Commands for setting custom tikz-style parameters
-\newcommand{\setargumentstyle}[1]{\tikzset{argument/.style={#1}}}
-\newcommand{\setattackstyle}[1]{\tikzset{attack/.style={#1}}}
-\newcommand{\setsupportstyle}[1]{\tikzset{support/.style={#1}}}
-\newcommand{\setannotationstyle}[1]{\tikzset{annotation/.style={#1}}}
+ % Collect rejected arguments in list
+ \renewcommand*{\do}[1]{
+ \expandafter\@split@pair##1\relax
+ \xifinlist{\@attacker}{\@accepted@arguments}{%
+ \listeadd\@rejected@arguments{\@attacked}
+ }{}
+ }
+ \dolistcsloop{@attacks@\@afid}
-%\newcommand{\setloopstyle}[1]{\tikzset{selfattack/.style={#1}}}
-%\newcommand{\adjustargumentstyle}[1]{\tikzset{argument/.append style={#1}}}
-%\newcommand{\adjustattackstyle}[1]{\tikzset{attack/.append style={#1}}}
+ % Collect undecided arguments in list
+ \renewcommand*{\do}[1]{
+ \xifinlist{##1}{\@accepted@arguments}{}{
+ \xifinlist{##1}{\@rejected@arguments}{}{
+ \listadd\@undecided@arguments{##1}
+ }
+ }
+ }
+ \dolistcsloop{@arguments@\@afid}
+
+ % render the af with the given information
+ \@render@af{\@afid}{accepted}{rejected}{undecided}{}{}
+}
+%%% Prints the reduct of an AF wrt. the given list of arguments
+% #1 unique ID of an AF
+% #2 a comma-separated list of argument IDs
+\NewDocumentCommand { \afreduct } {mm} {%
+ \@prepare@af{#1}
+ \forcsvlist{\listeadd\@accepted@arguments}{#2}
+ \forcsvlist{\listeadd\@inactive@arguments}{#2}
+
+ \renewcommand*{\do}[1]{
+ \expandafter\@split@pair##1\relax
+ \xifinlist{\@attacker}{\@accepted@arguments}{%
+ \listeadd\@rejected@arguments{\@attacked}
+ \listeadd\@inactive@arguments{\@attacked}
+ }{}
+ }
+ \dolistcsloop{@attacks@\@afid}
+
+ \@render@af{\@afid}{inactive}{inactive}{}{inactive}{}
+}
+
+%%% Prints an AF restricted to the given list of arguments
+% #1 unique ID of an AF
+% #2 a comma-separated list of argument IDs
+\NewDocumentCommand { \afrestriction } {mm} {%
+ \@prepare@af{#1}
+ \forcsvlist{\listeadd\@accepted@arguments}{#2}
+
+ \renewcommand*{\do}[1]{%
+ \ifinlist{##1}{\@accepted@arguments}{}{
+ \listeadd\@inactive@arguments{##1}
+ }
+ }
+ \dolistcsloop{@arguments@\@afid}
+
+ \@render@af{\@afid}{}{}{}{invisible}{}
+}
+
+%%% Prepares recreation of an AF. Parses AF label to letter ID and defines lists to partition arguments
+% #1 unique ID of the AF to recreate
+\NewDocumentCommand { \@prepare@af } {m} {%
+ \edef\@afid{\getrefnumber{#1}}
+ \def\@accepted@arguments{}
+ \def\@rejected@arguments{}
+ \def\@undecided@arguments{}
+ \def\@inactive@arguments{}
+}
+
+%%% name of innermost af environment
+\def\@afenvname{af*}
+
+%%% Prepares recreation of AF by making sure we are inside an af environment
+% #1 unique ID of the AF to recreate
+% #2-#6 style parameters (see \@render@afdo)
+\NewDocumentCommand { \@render@af } {mmmmmm} {%
+ \ifx\@currenvir\@afenvname
+ \@render@afdo{#1}{#2}{#3}{#4}{#5}{#6}
+ \else
+ \begin{af*}
+ \@render@afdo{#1}{#2}{#3}{#4}{#5}{#6}
+ \end{af*}
+ \fi
+}
+
+%%% Recreates an AF
+%% Utilises lists defined in \@prepare@af
+% #1 unique ID of the AF to recreate
+% #2 style of accepted arguments
+% #3 style of rejected arguments
+% #4 style of undecided arguments
+% #5 style of inactive arguments/attacks
+% #6 style of normal attacks
+\NewDocumentCommand { \@render@afdo } {mmmmmm} {%
+ % handle arguments for rendering
+ \renewcommand*{\do}[1]{%
+ \ifinlist{##1}{\@accepted@arguments}{
+ \csname @af@#1@arg@##1\endcsname{#2}
+ }{%
+ \ifinlist{##1}{\@rejected@arguments}{%
+ \csname @af@#1@arg@##1\endcsname{#3}
+ }{%
+ \ifinlist{##1}{\@undecided@arguments}{%
+ \csname @af@#1@arg@##1\endcsname{#4}
+ }{%
+ \ifinlist{##1}{\@inactive@arguments}{%
+ \csname @af@#1@arg@##1\endcsname{#5}
+ }{%
+ \csname @af@#1@arg@##1\endcsname{}
+ }
+ }
+ }
+ }
+ }
+ \dolistcsloop{@arguments@#1}
+
+ % handle attack rendering
+ \renewcommand*{\do}[1]{%
+ \expandafter\@split@pair##1\relax
+ \xifinlist{\@attacker}{\@inactive@arguments}{%
+ \csname @af@#1@att@\@attacker\@attacked\endcsname{#5,fill=none}
+ }{%
+ \xifinlist{\@attacked}{\@inactive@arguments}{%
+ \csname @af@#1@att@\@attacker\@attacked\endcsname{#5,fill=none}
+ }{%
+ \csname @af@#1@att@\@attacker\@attacked\endcsname{#6}
+ }
+ }
+ }
+ \dolistcsloop{@attacks@#1}
+}
+\makeatother
+\fi \ No newline at end of file
diff --git a/graphics/pgf/contrib/atableau/LICENSE b/graphics/pgf/contrib/atableau/LICENSE
new file mode 100644
index 0000000000..329bcef402
--- /dev/null
+++ b/graphics/pgf/contrib/atableau/LICENSE
@@ -0,0 +1,417 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2008 M. Y. Name
+ %
+ % This work may be distributed and/or modified under the
+ % conditions of the LaTeX Project Public License, either version 1.3
+ % of this license or (at your option) any later version.
+ % The latest version of this license is in
+ % https://www.latex-project.org/lppl.txt
+ % and version 1.3c or later is part of all distributions of LaTeX
+ % version 2008 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
+
+
diff --git a/graphics/pgf/contrib/atableau/README.md b/graphics/pgf/contrib/atableau/README.md
new file mode 100644
index 0000000000..f659fb20ed
--- /dev/null
+++ b/graphics/pgf/contrib/atableau/README.md
@@ -0,0 +1,44 @@
+![version](https://img.shields.io/github/v/tag/AndrewMathas/aTableau?color=success&label=version)
+![LPPL](https://img.shields.io/github/license/note286/xduts?style=flat-square)
+![LaTeX](https://img.shields.io/badge/LaTeX-008080?logo=latex&logoColor=fff&style=flat)
+
+# aTableau
+
+A LaTeX package for symmetric group combinatorics, with commands for:
+
+ - Young diagrams
+ - tableaux
+ - tabloids
+ - skew tableaux
+ - shifted tableaux
+ - ribbon tableaux
+ - multitableaux
+ - abacuses
+
+``` latex
+\Tableau{12345,678,9{10},{11}}
+\Diagram[french]{4^4,2,1^3}
+\Tabloid{1379{11},249{10},6,8}
+\SkewTableau[ukrainian]{3,2,1}{345,56,9{10}}
+\SkewDiagram[skew border style={dashed,fill=red!10},skew border]{1^2}{2^3}
+\ShiftedTableau[skew boxes]{1*23,4*5}
+\ShiftedDiagram[skew border]{3,2}
+\RibbonTableau[ukrainian, skew={4,1^2}]{16rcrrrccrcc, 26, 34rc}
+\Multidiagram[australian]{3,2^2|2,1,1|1}
+\Multitableau[box font=\tiny]{123,45,67|89,{10},{11}|{12}{13}{14}}
+\Abacus[rows=3, abacus ends=..]{3}{0,2,3,4,5}
+\Abacus{3}{0,2,3,4,5}
+```
+
+### Dependencies
+[LaTeX3](https://www.latex-project.org/latex3/) and [TikZ](https://tikz.net/)
+
+## Author
+Andrew Mathas
+
+## Licence
+LPPL Version 1.3 2003-12-01
+
+## Repository
+[github.com/AndrewMathas/aTableau/](github.com/AndrewMathas/aTableau/)
+
diff --git a/graphics/pgf/contrib/atableau/atableau.ini b/graphics/pgf/contrib/atableau/atableau.ini
new file mode 100644
index 0000000000..bd80bd3baa
--- /dev/null
+++ b/graphics/pgf/contrib/atableau/atableau.ini
@@ -0,0 +1,13 @@
+author_email = andrew.mathas@sydney.edu.au
+authors = Andrew Mathas
+copyright = 2023-2025
+description = A LaTeX package for tableaux, abacuses, ...
+email = andrew.mathas@gmail.com
+keywords = tableaux, Yougn diagrans, abacuses
+license = LPPL Version 1.3 2003-12-01
+name = Andrew Mathas
+package = atableau
+repository = github.com/AndrewMathas/aTableau/
+requirements = LaTeX2e
+release date = 24 January 2025 AEDT
+version = 2.1.0
diff --git a/graphics/pgf/contrib/atableau/atableau.pdf b/graphics/pgf/contrib/atableau/atableau.pdf
new file mode 100644
index 0000000000..4ccc1130ef
--- /dev/null
+++ b/graphics/pgf/contrib/atableau/atableau.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/atableau/atableau.sty b/graphics/pgf/contrib/atableau/atableau.sty
new file mode 100644
index 0000000000..05692c3550
--- /dev/null
+++ b/graphics/pgf/contrib/atableau/atableau.sty
@@ -0,0 +1,3394 @@
+% ---------------------------------------------------------------------------
+%
+% atableau - Andrew Mathas (C) 2022-2025
+%
+% A latex package for symmetric group combinatorics, including:
+% - abacuses
+% - multitableau
+% - ribbon tableau
+% - shifted tableau
+% - skew tableau
+% - tableaux
+% - tabloids
+% - Young diagrams
+%
+% E-mail: andrew.mathas@gmail.com
+% Released under the LaTeX Project Public License v1.3c or later
+% See http://www.latex-project.org/lppl.txt
+
+% ---------------------------------------------------------------------------
+
+% load TikZ early to avoid \ExplSyntaxOn...\ExplSyntaxOff wrappers
+\RequirePackage{tikz}
+\usetikzlibrary{shapes.geometric,matrix}
+
+% Correct for negative signs in contents being too long to fit in a tableau
+\RequirePackage{amsfonts} %% <- also included by amssymb
+\DeclareMathSymbol{\shortminus}{\mathbin}{AMSa}{"39}
+
+% ---------------------------------------------------------------------------
+% package date and version
+\def\atableau@version{2.1.0}
+\def\atableau@release{2025-01-24}
+
+\providecommand\DeclareRelease[3]{}
+\providecommand\DeclareCurrentRelease[2]{}
+\DeclareRelease{\atableau@version}{\atableau@release}{atableau.sty}
+\DeclareCurrentRelease{}{\atableau@release}
+
+\ProvidesExplPackage{atableau} {\atableau@release} {\atableau@version}
+ {A latex package for symmetric group combinatorics }
+
+
+% Give a warning if the LaTeX installation is older than TeXLive 2024
+\IfFormatAtLeastTF { 2024-04-13 } {}
+{
+ \PackageWarning {aTableau}
+ {
+ The~aTableau~package~uses~many~recent~features~from~
+ ~LaTeX3.~Your~LaTeX ~installation~appears~to~be~quite~,
+ ~which~might~result~in~errors~from~the ~package.~You~
+ ~may~need~to~update~your~LaTeX~installation~to~at~
+ ~least~TeXLive~2024
+ }
+}
+
+% ---------------------------------------------------------------------------
+% package errors
+
+\msg_new:nnnn { aTableau } { empty-tableau-row }
+ { Row~#1~of~tableau~is~empty }
+ { Empty~tableau~rows~are~not~supported}
+
+\msg_new:nnnn { aTableau } { missing-runner-labels }
+{ Your~abacus~has~a~different~number~of~runners~and~runner~labels }
+{ The~number~of~labels~given~to~the~'runner~labels'~must~match~the~number~of~abacus~runners }
+
+\msg_new:nnnn { aTableau } { missing-style }
+{ The~'#1'~styles~key~is~missing~a~value }
+{ The~styles~key~accepts~a~comma~separated~list~of~key-value~pairs~for~defining~TikZ~styles }
+
+\msg_new:nnnn { aTableau } { invalid-dots}
+ { Invalid~specifications~for~dotted~rows~or~dotted~cols }
+ { You~can~only~use~these~options~for~interior~rows~and~columns~in~the~diagrams}
+
+\msg_new:nnnn { aTableau } { invalid-ribbon-head }
+ { Invalid~ribbon~head:~the~row~and~column~indices~of~the~ribbon~head~must~be~given:~'#1'}
+ { Ribbon~specifications~must~be~for~the~form:~(optional~ribbon~style)[style]<row><col>+sequences~of~r's~and~c's~with~style}
+
+\msg_new:nnnn { aTableau } { invalid-ribbon-specification }
+ { Invalid~ribbon~specification~'#1':~expecting~r~or~c. }
+ { Ribbon~specifications~must~be~for~the~form:~[optional~style]<row><col>~sequences~of~r's and~c's~with~style}
+
+\msg_new:nnnn { aTableau } { unrecognised-abacus-label }
+ { Unrecognised~abacus~label~'#1'. }
+ { The~possible~abacus~labels~are~betas,~residues,~rows~and~shape}
+
+\msg_new:nnnn { aTableau } { unrecognised-entries }
+ { Unrecognised~entries~value:~'#1' }
+ { The~possible~diagram~values~for~entries~are:~contents,~first,~hooks,~last,~and~residues}
+
+\msg_new:nnnn { aTableau } { unrecognised-style }
+ { Unrecognised~style:~'#1' }
+ { The~available~tableau~styles~are~australian,~english,~french~and~ukrainian~and~the~available~abacus~styles~are~north,~south,~east~and~west~}
+
+\msg_new:nnnn { aTableau } { unknown-abacus-ends }
+ { Unrecognised~abacus~ends~setting:~'#1' }
+ { The~supported~ends~for~the~top/bottom~of~the~abacus~are:~-,~_~,.~,|,~and~>}
+
+\msg_new:nnnn { aTableau } { unknown-cartan }
+ { Unrecognised~Cartan~type~'#1' }
+ { The~supported~Cartan~types~are~(affine)~types~A,~AA,~C~and~DD}
+
+\msg_new:nnnn { aTableau } { unknown-baseline }
+ { Unrecognised~baseline~option:~'#1' }
+ { The~supported~halign~options~are~bottom,~centre,~left,~and~top }
+
+\msg_new:nnnn { aTableau } { unknown-halign }
+ { Unrecognised~halign~option:~'#1' }
+ { The~supported~halign~options~are~centre,~left,~and~right }
+
+\msg_new:nnnn { aTableau } { unknown-top }
+ { Unrecognised~format~for~abacus~top;~'#1' }
+ { The~supported~formats~are:~blank,~dots,~and~frame}
+
+\msg_new:nnnn { aTableau } { unknown-valign }
+ { Unrecognised~valign~option:~#1 }
+ { The~supported~valign~options~are~bottom,~centre~and~top }
+
+% ---------------------------------------------------------------------------
+% package variables
+
+\bool_new:N \l__atableau_beta_numbers_bool% true if specifying beta numbers
+\bool_new:N \l__atableau_frame_bool % true if drawing framed abacus runners
+\bool_new:N \l__atableau_conjugate_bool % true if drawing conjugate tableau/diagram
+\bool_new:N \l__atableau_border_bool % true if drawing tableau border
+\bool_new:N \l__atableau_boxes_bool % true if drawing inner tableau walls
+\bool_new:N \l__atableau_shifted_bool % true if a shifted tableau
+\bool_new:N \l__atableau_skew_border_bool % true if drawing skew border
+\bool_new:N \l__atableau_skew_boxes_bool % true if drawing skew boxes
+\bool_new:N \l__atableau_tabloid_bool % true if a tabloid
+\bool_new:N \l__atableau_separators_bool % true if drawing separators for multishapes
+
+\fp_new:N \l__atableau_ab_col_dx_fp % change in x-coordinate between columns in an abacus
+\fp_new:N \l__atableau_ab_col_dy_fp % change in y-coordinate between columns in an abacus
+\fp_new:N \l__atableau_ab_row_dx_fp % change in x-coordinate between rows in an abacus
+\fp_new:N \l__atableau_ab_row_dy_fp % change in y-coordinate between rows in an abacus
+\fp_new:N \l__atableau_abacus_ht_fp % height of the tableaux nodes/separation between abacus beads
+\fp_new:N \l__atableau_abacus_wd_fp % width of the tableaux nodes/separation between abacus runners
+\fp_new:N \l__atableau_bead_size_fp % bead radius
+\fp_new:N \l__atableau_box_ht_fp % height of a tableau box
+\fp_new:N \l__atableau_box_wd_fp % width of a tableau box
+\fp_new:N \l__atableau_rows_fp % number of rows in abacus/tableau
+\fp_new:N \l__atableau_separation_fp % distance between multitableau
+\fp_new:N \l__atableau_script_fp % scaling when used as a subscript
+\fp_new:N \l__atableau_sscriptscript_fp % scaling when used as a subsubscript
+\fp_new:N \l__atableau_tab_col_dx_fp % change in x-coordinate between columns in a tableau
+\fp_new:N \l__atableau_tab_col_dy_fp % change in y-coordinate between columns in a tableau
+\fp_new:N \l__atableau_tab_row_dx_fp % change in x-coordinate between rows in a tableau
+\fp_new:N \l__atableau_tab_row_dy_fp % change in y-coordinate between rows in a tableau
+\fp_new:N \l__atableau_tick_length_fp % half the length of the abacus ticks
+\fp_new:N \l__atableau_x_fp % x-coordinate of the origin of the diagram
+\fp_new:N \l__atableau_xa_fp % scratch x-coordinate of a node/bead
+\fp_new:N \l__atableau_xb_fp % scratch x-coordinate of a node/bead
+\fp_new:N \l__atableau_xl_fp % x-coordinate of a tableau node/bead
+\fp_new:N \l__atableau_xmax_fp % maximum x-coordinate for multidiagrams and multitableaux
+\fp_new:N \l__atableau_xoffsets_seq % x-offsets for the (1,1)-nodes in a multi-tableau
+\fp_new:N \l__atableau_xscale_fp % scaling in the x-direction
+\fp_new:N \l__atableau_xsep_fp % x-coordinate difference to next separator for multishapes
+\fp_new:N \l__atableau_y_fp % y-coordinate of the origin of the diagram
+\fp_new:N \l__atableau_ya_fp % scratch y-coordinate of a node/bead
+\fp_new:N \l__atableau_yb_fp % scratch y-coordinate of a node/bead
+\fp_new:N \l__atableau_yl_fp % y-coordinate of a tableau node/bead
+\fp_new:N \l__atableau_ymax_fp % maximum y-coordinate for multidiagrams and multitableaux
+\fp_new:N \l__atableau_ymin_fp % minimum y-coordinate for multidiagrams and multitableaux
+\fp_new:N \l__atableau_yoffsets_seq % t-offsets for the (1,1)-nodes in a multi-tableau
+\fp_new:N \l__atableau_yscale_fp % scaling in the x-direction
+
+\int_new:N \l__atableau_beads_int % number of beads in abacus
+\int_new:N \l__atableau_charge_int % charge for current component
+\int_new:N \l__atableau_col_int % current column index
+\int_new:N \l__atableau_c_int % scratch column counter
+\int_new:N \l__atableau_cols_int % number of columns in a multitableau/abacus
+\int_new:N \l__atableau_component_int % component in multidiagrams and tableaux
+\int_new:N \l__atableau_e_int % quantum characteristic
+\int_new:N \l__atableau_row_int % current row index
+\int_new:N \l__atableau_r_int % scratch row counter
+\int_new:N \l__atableau_rows_int % number of rows in abacus
+
+\seq_new:N \l__atableau_charge_seq % sequences of charges = residue/content offset
+\seq_new:N \l__atableau_component_seq % multipartition
+\seq_new:N \l__atableau_conjugate_seq % conjugate partition
+\seq_new:N \l__atableau_dotted_cols_seq % columns with dots
+\seq_new:N \l__atableau_dotted_rows_seq % rows with dots
+\seq_new:N \l__atableau_multidotted_cols_seq % sequence of dotted columns for multi shapes
+\seq_new:N \l__atableau_multidotted_rows_seq % sequence of dotted rows for multi shapes
+\seq_new:N \l__atableau_multilabel_seq % a sequence of labels for multi shapes
+\seq_new:N \l__atableau_multipaths_seq % a sequence of ribbon paths for multi shapes
+\seq_new:N \l__atableau_multiribbons_seq % a sequence of ribbon for multi shapes
+\seq_new:N \l__atableau_multiskew_seq % a sequence of skew partitions for multi shapes
+\seq_new:N \l__atableau_multisnobs_seq % a sequence of snobs for multi shapes
+\seq_new:N \l__atableau_paths_seq % ribbon paths to add to tableau/diagram
+\seq_new:N \l__atableau_rcs_seq % ribbon row, column indices
+\seq_new:N \l__atableau_ribbons_seq % ribbons to add to tableau/diagram
+\seq_new:N \l__atableau_runner_labels_seq % labels for the abacus runners
+\seq_new:N \l__atableau_shape_seq % a partition
+\seq_new:N \l__atableau_skew_seq % the inner partition for a skew shape
+\seq_new:N \l__atableau_snobs_seq % snob ribbons to add to tableau/diagram
+\seq_new:N \l__atableau_styles_seq % ribbon/bead styles
+\seq_new:N \l__atableau_texts_seq % ribbon/bead texts
+\seq_new:N \l__atableau_xsep_seq % x-coordinates separators for multishapes
+
+\tl_new:N \l__atableau_abacus_bottom_tl % specifies the bottom of the abacus
+\tl_new:N \l__atableau_abacus_top_tl % specifies the top of the abacus
+\tl_new:N \l__atableau_bead_font_tl % font for abacus beads
+\tl_new:N \l__atableau_bead_shape_tl % shape of abacus beads
+\tl_new:N \l__atableau_bead_text_tl % text colour of abacus beads
+\tl_new:N \l__atableau_bead_tl % abacus head colour
+\tl_new:N \l__atableau_border_tl % diagram border
+\tl_new:N \l__atableau_box_fill_tl % fill colour for tableau boxes
+\tl_new:N \l__atableau_box_font_tl % font for tableau boxes
+\tl_new:N \l__atableau_box_shape_tl % shape of tableau boxes
+\tl_new:N \l__atableau_box_text_tl % text colour for tableau boxes
+\tl_new:N \l__atableau_capture_exp_tl % contains captured exponent
+\tl_new:N \l__atableau_capture_part_tl % contains captured part
+\tl_new:N \l__atableau_capture_style_tl % contains captured style
+\tl_new:N \l__atableau_capture_txt_tl % contains captured text
+\tl_new:N \l__atableau_cartan_tl % the Cartan type
+\tl_new:N \l__atableau_empty_tl % symbol for empty tableau/diagram in a multi tableau/diagram
+\tl_new:N \l__atableau_entries_tl % custom entries in tableau
+\tl_new:N \l__atableau_inner_tl % colour of tableau inner walls
+\tl_new:N \l__atableau_label_tl % a label to print on an tableau/diagram
+\tl_new:N \l__atableau_left_delimiter_tl % the left delimiter for multitableau and multidiagrams
+\tl_new:N \l__atableau_multiprefix_tl % prefix used when constructing multinode names
+\tl_new:N \l__atableau_name_tl % name of a tableau node
+\tl_new:N \l__atableau_outer_tl % colour of tableau outer walls
+\tl_new:N \l__atableau_path_box_tl % node for ribbon paths
+\tl_new:N \l__atableau_prefix_tl % prefix for node names
+\tl_new:N \l__atableau_ribbon_box_tl % box entry for ribbons
+\tl_new:N \l__atableau_ribbon_style_tl % optional style used for current path< ribbon or snob
+\tl_new:N \l__atableau_ribbon_path_tl % a ribbon in the ribbon tableau
+\tl_new:N \l__atableau_ribbon_type_tl % the type of ribbon, which is either path, ribbon or snob
+\tl_new:N \l__atableau_right_delimiter_tl % the right delimiter for multitableau and multidiagrams
+\tl_new:N \l__atableau_runner_tl % abacus runner colour
+\tl_new:N \l__atableau_snob_box_tl % box entry for snobs
+\tl_new:N \l__atableau_separator_fg_tl % foreground colour of the separator
+\tl_new:N \l__atableau_separator_tl % the separator between multitableau: | or , or ...
+\tl_new:N \l__atableau_shading_tl % the type of shading to use for the abacus beads
+\tl_new:N \l__atableau_show_tl % automatic tableau/bead labelling
+\tl_new:N \l__atableau_skew_border_tl % skew border colour
+\tl_new:N \l__atableau_starstyle_tl % current star style in use
+\tl_new:N \l__atableau_styled_nodes_tl % token lists of nodes with non-default style
+\tl_new:N \l__atableau_tick_tl % abacus tick colour
+\tl_new:N \l__atableau_tikz_after_tl % TikZ commands for after the diagram
+\tl_new:N \l__atableau_tikz_before_tl % TikZ commands for before the diagram
+\tl_new:N \l__atableau_tikzpicture_tl % TikZ environment settings
+\tl_new:N \l__atableau_unstyled_nodes_tl % token lists of nodes with efault style
+
+% ---------------------------------------------------------------------------
+% Variable defaults -- most defaults are given in the settings: \keys_set:nn {aTableau} {...}
+\tl_set:Nn \l__atableau_ribbon_type_tl {ribbon} % by default, ribbons are ribbons
+
+% ---------------------------------------------------------------------------
+% default colours
+\definecolor{aTableauMain} {HTML} {00008B}
+\definecolor{aTableauInner} {HTML} {0073e6}
+\definecolor{aTableauSkew} {HTML} {818589}
+\definecolor{aTableauSkewFill} {HTML} {F8F8F8}
+\definecolor{aTableauStarStyle} {HTML} {E6F7FF}
+
+% ---------------------------------------------------------------------------
+% TikZ styling of aTableau components
+
+\tikzset{
+ % -----------------------------------------------------------------------
+ % Allow ball shading to be disabled via shade=none.
+ % The essential idea comes from https://tex.stackexchange.com/a/85750/234252
+ no~shade/.code={ \tikz@addmode{\tikz@mode@shadefalse } },
+ % -----------------------------------------------------------------------
+ % all tikz settings are in the aTableau family
+ aTableau/.is~family,
+ aTableau/.cd,
+ % -----------------------------------------------------------------------
+ % Styles for tableaux and diagrams
+ % -----------------------------------------------------------------------
+ % inner tableau wall
+ innerWall/.style = {
+ line~cap = rect,
+ thin,
+ },
+ % outer tableau wall
+ borderStyle/.style = {
+ % shifting allows us to use \__atableau_set_box_coordinates:nnn when drawing the border
+ shift = {(\fp_eval:n{-(\l__atableau_tab_row_dx_fp+\l__atableau_tab_col_dx_fp)*\l__atableau_box_wd_fp/2},
+ \fp_eval:n{-(\l__atableau_tab_row_dy_fp+\l__atableau_tab_col_dy_fp)*\l__atableau_box_ht_fp/2})},
+ line~cap = rect,
+ very~thick,
+ draw = \l__atableau_outer_tl,
+ },
+ % skew walls
+ skewBorder/.style = {
+ % shifting allows us to use \__atableau_set_box_coordinates:nnn when drawing the border
+ shift = {(\fp_eval:n{-(\l__atableau_tab_row_dx_fp+\l__atableau_tab_col_dx_fp)*\l__atableau_box_wd_fp/2},
+ \fp_eval:n{-(\l__atableau_tab_row_dy_fp+\l__atableau_tab_col_dy_fp)*\l__atableau_box_ht_fp/2})},
+ draw = \l__atableau_skew_border_tl,
+ thick
+ },
+ % styles for tableau boxes in Young diagrams
+ % -----------------------------------------------------------------------
+ node/.style = {
+ anchor = center,
+ inner~sep = 0pt,
+ minimum~height = \fp_use:N \l__atableau_box_ht_fp cm,
+ minimum~width = \fp_use:N \l__atableau_box_wd_fp cm,
+ shape = \l__atableau_box_shape_tl,
+ font = \l__atableau_box_font_tl,
+ text = \l__atableau_box_text_tl,
+ },
+ boxStyle/.style = {
+ aTableau/node,
+ aTableau/innerWall,
+ draw = \l__atableau_inner_tl,
+ fill = \l__atableau_box_fill_tl,
+ },
+ % default skew box style
+ skewBox/.style = {
+ aTableau/node,
+ aTableau/innerWall,
+ draw = \l__atableau_skew_border_tl,
+ fill = aTableauSkewFill,
+ },
+ % box styles for paths, ribbons and snobs
+ % -----------------------------------------------------------------------
+ pathBox/.style = {
+ aTableau/node,
+ draw = none, % border disabled by default
+ },
+ ribbonBox/.style = {
+ aTableau/node,
+ },
+ snobBox/.style = {
+ aTableau/node,
+ },
+ % styles for paths, ribbons and snobs
+ % -----------------------------------------------------------------------
+ % default path style
+ pathStyle/.style = {
+ draw = \l__atableau_inner_tl,
+ },
+ ribbonStyle/.style = {
+ aTableau/innerWall,
+ draw = \l__atableau_inner_tl,
+ },
+ % default ribbon style
+ snobStyle/.style = {
+ aTableau/innerWall,
+ draw = \l__atableau_inner_tl,
+ },
+ % label styles
+ % -----------------------------------------------------------------------
+ labelStyle/.style = {
+ shift = {(\fp_eval:n{-0.2*(\l__atableau_tab_row_dx_fp+\l__atableau_tab_col_dx_fp)*\l__atableau_box_wd_fp},
+ \fp_eval:n{-0.2*(\l__atableau_tab_row_dy_fp+\l__atableau_tab_col_dy_fp)*\l__atableau_box_ht_fp})},
+ font=\scriptsize,
+ text = \l__atableau_inner_tl,
+ },
+ % tableau star style
+ % -----------------------------------------------------------------------
+ tableauStarStyle/.style = {
+ fill = aTableauStarStyle,
+ text = \l__atableau_box_text_tl,
+ },
+ % cleared boxes for dotted rows and columns
+ % -----------------------------------------------------------------------
+ clearBoxes/.style = {
+ draw = white,
+ fill = white,
+ },
+ % dots used for dotted rows and columns
+ % -----------------------------------------------------------------------
+ dottedLine/.style = {
+ densely~dotted,
+ thick,
+ draw = \l__atableau_outer_tl,
+ },
+ % separators and delimiters
+ % -----------------------------------------------------------------------
+ separatorSymbol/.style = {
+ text = \l__atableau_separator_fg_tl,
+ },
+ % default separator line style
+ separatorLine/.style = {
+ thick,
+ draw = \l__atableau_separator_fg_tl,
+ },
+ % Delimiters around multitableaux and multidiagrams. To change the colour
+ % of the delimiters we need to use \path[aTableau/delimiterPath] (x,y) node...
+ delimiterStyle/.style = {
+ align = center,
+ inner~sep = 0pt,
+ minimum~height = \fp_use:N\l__atableau_ymax_fp cm,
+ },
+ % hack to set the colour
+ delimiterPath/.style = {
+ every~delimiter/.style = { \l__atableau_separator_fg_tl, },
+ },
+ leftDelimiter/.style = {
+ aTableau/delimiterStyle,
+ left~delimiter = \l__atableau_left_delimiter_tl,
+ xshift = 2pt,
+ },
+ rightDelimiter/.style = {
+ aTableau/delimiterStyle,
+ right~delimiter = \l__atableau_right_delimiter_tl,
+ xshift = -2pt,
+ },
+ % -----------------------------------------------------------------------
+ % abacus beads and runners
+ % -----------------------------------------------------------------------
+ % abacus beads
+ beadStyle/.style = {
+ ball~color = \l__atableau_bead_tl,
+ font = \l__atableau_bead_font_tl,
+ minimum~height = \fp_to_decimal:N \l__atableau_bead_size_fp cm,
+ minimum~width = \fp_to_decimal:N \l__atableau_bead_size_fp cm,
+ shading = \l__atableau_shading_tl,
+ shape = \l__atableau_bead_shape_tl,
+ text = \l__atableau_bead_text_tl,
+ anchor = center,
+ inner~sep = 0pt,
+ },
+ % abacus runners
+ runnerStyle/.style = {
+ line~cap = rect,
+ very~thick,
+ draw = \l__atableau_runner_tl,
+ },
+ runnerLabelStyle/.style = {
+ aTableau/node,
+ text = aTableauInner,
+ font = \scriptsize
+ },
+ % style for the top and bottom of the abacus
+ abacusEnds/.style = {
+ aTableau/runnerStyle,
+ },
+ % abacus star style
+ abacusStarStyle/.style = {
+ text = aTableauMain,
+ ball~color = aTableauStarStyle,
+ },
+ % abacus ticks
+ tickStyle/.style = {
+ draw = \l__atableau_tick_tl,
+ semithick,
+ },
+ % the named coordinate for an abacus tick
+ namedTick/.style = {
+ minimum~height = \fp_to_decimal:N \l__atableau_bead_size_fp cm,
+ minimum~width = \fp_to_decimal:N \l__atableau_bead_size_fp cm,
+ shape = \l__atableau_bead_shape_tl,
+ draw=none,
+ }
+}
+
+% ---------------------------------------------------------------------------
+
+% usage: \__atableau_set_style:nn {abacus|tableau} {style}
+% sets the basic styles for the tableaux and abacus commands
+\cs_new:Npn \__atableau_set_style:nn #1 #2
+{
+ \str_case:enF { #1/#2 }
+ {
+ {tableau/english}
+ {
+ \fp_set:Nn \l__atableau_tab_col_dx_fp {1}
+ \fp_set:Nn \l__atableau_tab_col_dy_fp {0}
+ \fp_set:Nn \l__atableau_tab_row_dx_fp {0}
+ \fp_set:Nn \l__atableau_tab_row_dy_fp {-1}
+ \fp_set:Nn \l__atableau_box_ht_fp {\l__atableau_yscale_fp*0.5}
+ \fp_set:Nn \l__atableau_box_wd_fp {\l__atableau_xscale_fp*0.5}
+ \tl_set:Nn \l__atableau_box_shape_tl {rectangle}
+ }
+
+ {tableau/french}
+ {
+ \fp_set:Nn \l__atableau_tab_col_dx_fp {1}
+ \fp_set:Nn \l__atableau_tab_col_dy_fp {0}
+ \fp_set:Nn \l__atableau_tab_row_dx_fp {0}
+ \fp_set:Nn \l__atableau_tab_row_dy_fp {1}
+ \fp_set:Nn \l__atableau_box_ht_fp {\l__atableau_yscale_fp*0.5}
+ \fp_set:Nn \l__atableau_box_wd_fp {\l__atableau_xscale_fp*0.5}
+ \tl_set:Nn \l__atableau_box_shape_tl {rectangle}
+ }
+
+ {tableau/australian}
+ {
+ \fp_set:Nn \l__atableau_tab_col_dx_fp {0.5}
+ \fp_set:Nn \l__atableau_tab_col_dy_fp {-0.5}
+ \fp_set:Nn \l__atableau_tab_row_dx_fp {-0.5}
+ \fp_set:Nn \l__atableau_tab_row_dy_fp {-0.5}
+ \fp_set:Nn \l__atableau_box_ht_fp {\l__atableau_yscale_fp*0.7012} % 1/sqrt(2)
+ \fp_set:Nn \l__atableau_box_wd_fp {\l__atableau_xscale_fp*0.7012}
+ \tl_set:Nn \l__atableau_box_shape_tl {diamond}
+ }
+
+ {tableau/ukrainian}
+ {
+ \fp_set:Nn \l__atableau_tab_col_dx_fp {0.5}
+ \fp_set:Nn \l__atableau_tab_col_dy_fp {0.5}
+ \fp_set:Nn \l__atableau_tab_row_dx_fp {-0.5}
+ \fp_set:Nn \l__atableau_tab_row_dy_fp {0.5}
+ \fp_set:Nn \l__atableau_box_ht_fp {\l__atableau_yscale_fp*0.7012}
+ \fp_set:Nn \l__atableau_box_wd_fp {\l__atableau_xscale_fp*0.7012}
+ \tl_set:Nn \l__atableau_box_shape_tl {diamond}
+ }
+
+ {abacus/south}
+ {
+ \fp_set:Nn \l__atableau_ab_col_dx_fp {1}
+ \fp_set:Nn \l__atableau_ab_col_dy_fp {0}
+ \fp_set:Nn \l__atableau_ab_row_dx_fp {0}
+ \fp_set:Nn \l__atableau_ab_row_dy_fp {-1}
+ \fp_set:Nn \l__atableau_abacus_ht_fp {\l__atableau_yscale_fp*0.5}
+ \fp_set:Nn \l__atableau_abacus_wd_fp {\l__atableau_xscale_fp*0.5}
+ \tl_set:Nn \l__atableau_bead_shape_tl {circle}
+ }
+
+ {abacus/north}
+ {
+ \fp_set:Nn \l__atableau_ab_col_dx_fp {1}
+ \fp_set:Nn \l__atableau_ab_col_dy_fp {0}
+ \fp_set:Nn \l__atableau_ab_row_dx_fp {0}
+ \fp_set:Nn \l__atableau_ab_row_dy_fp {1}
+ \tl_set:Nn \l__atableau_bead_shape_tl {circle}
+ \fp_set:Nn \l__atableau_abacus_wd_fp {\l__atableau_xscale_fp*0.5}
+ \fp_set:Nn \l__atableau_abacus_ht_fp {\l__atableau_yscale_fp*0.5}
+ }
+
+ {abacus/east}
+ {
+ \fp_set:Nn \l__atableau_ab_col_dx_fp {0}
+ \fp_set:Nn \l__atableau_ab_col_dy_fp {-1}
+ \fp_set:Nn \l__atableau_ab_row_dx_fp {1}
+ \fp_set:Nn \l__atableau_ab_row_dy_fp {0}
+ \tl_set:Nn \l__atableau_bead_shape_tl {circle}
+ \fp_set:Nn \l__atableau_abacus_wd_fp {\l__atableau_xscale_fp*0.5}
+ \fp_set:Nn \l__atableau_abacus_ht_fp {\l__atableau_yscale_fp*0.5}
+ }
+
+ {abacus/west}
+ {
+ \fp_set:Nn \l__atableau_ab_col_dx_fp {0}
+ \fp_set:Nn \l__atableau_ab_col_dy_fp {1}
+ \fp_set:Nn \l__atableau_ab_row_dx_fp {-1}
+ \fp_set:Nn \l__atableau_ab_row_dy_fp {0}
+ \tl_set:Nn \l__atableau_bead_shape_tl {circle}
+ \fp_set:Nn \l__atableau_abacus_wd_fp {\l__atableau_xscale_fp*0.5}
+ \fp_set:Nn \l__atableau_abacus_ht_fp {\l__atableau_yscale_fp*0.5}
+ }
+ }
+ {
+ \msg_error:nnx {aTableau} {unrecognised-style} {#1/#2}
+ }
+}
+
+% usage: \__atableau_set_xscale:n {x-scale} : rescale the x-dimension
+\cs_new_protected:Npn \__atableau_set_xscale:n #1
+{
+ \fp_set:Nn \l__atableau_xscale_fp {#1} % makes scale persistent
+ \fp_set:Nn \l__atableau_abacus_wd_fp {#1*\l__atableau_abacus_wd_fp}
+ \fp_set:Nn \l__atableau_box_wd_fp {#1*\l__atableau_box_wd_fp}
+ \fp_set:Nn \l__atableau_separation_fp {#1*\l__atableau_separation_fp }
+}
+% usage: \__atableau_set_yscale:n {y-scale} : rescale the y-dimension
+\cs_new_protected:Npn \__atableau_set_yscale:n #1
+{
+ \fp_set:Nn \l__atableau_yscale_fp {#1} % makes scale persistent
+ \fp_set:Nn \l__atableau_abacus_ht_fp {#1*\l__atableau_abacus_ht_fp}
+ \fp_set:Nn \l__atableau_box_ht_fp {#1*\l__atableau_box_ht_fp}
+}
+
+
+% usage: \__atableau_set_delimiters:nn {left delimiter} {right delimiter}
+\cs_new_protected:Npn \__atableau_set_delimiters:nn #1 #2
+{
+ \tl_set:Nn \l__atableau_left_delimiter_tl #1
+ \tl_set:Nn \l__atableau_right_delimiter_tl #2
+}
+
+% usage: \__atableau_set_multiseq_key:nn {name} {value}
+% Set up a sequence, for keys used with multishapes
+\cs_new_protected:Npn \__atableau_set_multiseq_key:nn #1 #2
+{
+ \tl_if_in:nnTF {#2} {|}
+ {
+ % unpack the ribbons into \l__atableau_multiribbons_seq
+ \seq_set_split:cnn {l__atableau_multi#1_seq} {|} {#2}
+ }
+ { \seq_set_from_clist:cn {l__atableau_#1_seq} {#2} }
+}
+
+% usage: \__atableau_set_abacus_ends:nn {top} {top}
+% Set the abacus ends abacus_top and abacus_bottom and give an error
+% message if the ends are not one of =,-,.,|,>
+\cs_new_protected:Npn \__atableau_set_abacus_ends:nn #1 #2
+{
+ \tl_set:Nn \l__atableau_abacus_top_tl {#1}
+ \str_if_in:nnF {-.>|\c_underscore_str*} {#1}
+ { \msg_error:nne {aTableau} {unknown-abacus-ends} {#1}}
+
+ \tl_set:Nn \l__atableau_abacus_bottom_tl {#2}
+ \str_if_in:nnF {-.>|\c_underscore_str*} {#2}
+ { \msg_error:nne {aTableau} {unknown-abacus-ends} {#2}}
+}
+
+% ---------------------------------------------------------------------------
+% command variants
+
+\cs_generate_variant:Nn \fp_add:Nn {NV}
+\cs_generate_variant:Nn \int_set:Nn {No}
+\cs_generate_variant:Nn \seq_put_right:Nn {Nx}
+\cs_generate_variant:Nn \seq_set_item:Nnn {NVx, Nnx, Nox}
+\cs_generate_variant:Nn \seq_set_from_clist:Nn {co}
+\cs_generate_variant:Nn \seq_set_split:Nnn {cnn}
+
+\cs_generate_variant:Nn \__atableau_add_ribbon:n {V}
+\cs_generate_variant:Nn \__atableau_count_row:n {x}
+\cs_generate_variant:Nn \__atableau_draw_tableau:n {V}
+\cs_generate_variant:Nn \__atableau_entry:n {x}
+\cs_generate_variant:Nn \__atableau_draw_abacus_end:nnn {noo}
+\cs_generate_variant:Nn \__atableau_set_bead_coordinates:nnn {nVV, nnV, noo, non, noV}
+\cs_generate_variant:Nn \__atableau_set_box_coordinates:nnn {nVV, nVn, noo }
+\cs_generate_variant:Nn \__atableau_set_partition:nn {no}
+\cs_generate_variant:Nn \__atableau_tl_put_right_braced:Nn { NV, Nx, No, Ne }
+
+% ---------------------------------------------------------------------------
+% utility functions
+
+% usage: \__atableau_tl_put_right_braced:Nn #1 #2
+% Add braces around #2 and append to #1
+\cs_new_protected:Nn \__atableau_tl_put_right_braced:Nn
+{
+ \tl_put_right:Nn #1 { {#2} }
+}
+
+% ---------------------------------------------------------------------------
+% expandable residue functions
+
+% usage: \__atableau_residue_A:nn
+% Computes the residue of #1 mod #2. This is positive integer remainder when
+% dividing by #2. As with \int_mod:n, the result is left in the input stream.
+\cs_new:Npn \__atableau_residue_A:nn #1 #2
+{
+ \int_compare:nNnTF {#1} > {0}
+ { \int_mod:nn {#1} {#2} }
+ { \int_eval:n {\int_mod:nn {#2 + \int_mod:nn {#1} {#2}} {#2}} }% \int_mod:nn is negative
+}
+
+% usage: \__atableau_residue_C:nn
+% Computes the residue of #1 in affine type C. When e=3 this residue pattern is
+% 0 1 2 3 2 1 0 1 2 3 2 1 0 1 ...
+% As with \int_mod:n, the result is left in the input stream.
+\cs_new:Npn \__atableau_residue_C:nn #1 #2
+{
+ \int_compare:nNnTF {#1} < {0}
+ { % #1 is negative
+ \int_compare:nNnTF {\int_mod:nn {#1} {2*#2}} < {-#2}
+ { \int_eval:n { 2*#2 + \int_mod:nn {#1} {2*#2} } }
+ { \int_eval:n { \int_mod:nn {-#1} {2*#2} } }
+ }
+ { % #1 is non-negative
+ \int_compare:nNnTF {\int_mod:nn {#1} {2*#2}} > {#2}
+ { \int_eval:n { 2*#2 - \int_mod:nn {#1} {2*#2} } }
+ { \int_eval:n { \int_mod:nn {#1} {2*#2} } }
+ }
+}
+
+% usage: \__atableau_residue_AA:nn
+% Computes the residue of #1 in twisted type A. When e=3 this residue pattern is
+% 0 1 2 3 3 2 1 0 1 2 3 3 2 1 0 1 ...
+% As with \int_mod:n, the result is left in the input stream.
+\cs_new:Npn \__atableau_residue_AA:nn #1 #2
+{
+ \int_compare:nNnTF {#1} < {0}
+ { % #1 is negative
+ \int_compare:nNnTF {\int_mod:nn {#1} {2*#2+1}} < {-#2}
+ { \int_eval:n { 2*#2+1 + \int_mod:nn {#1} {2*#2+1}} }
+ { \int_eval:n { \int_mod:nn {-#1} {2*#2+1} } }
+ }
+ { % #1 is non-negative
+ \int_compare:nNnTF {\int_mod:nn {#1} {2*#2+1}} > {#2}
+ { \int_eval:n { 2*#2+1 - \int_mod:nn {#1} {2*#2+1} } }
+ { \int_eval:n { \int_mod:nn {#1} {2*#2+1} } }
+ }
+}
+
+% usage: \__atableau_residue_D:nn
+% Computes the residue of #1 in affine type C. When e=3 this residue pattern is
+% 0 1 2 3 3 2 1 0 0 1 2 3 3 2 1 0 0 1 ...
+% As with \int_mod:n, the result is left in the input stream.
+\cs_new:Npn \__atableau_residue_DD:nn #1 #2
+{
+ \int_compare:nNnTF {#1} < {0}
+ { % #1 is negative
+ \int_compare:nNnTF {\int_mod:nn {#1} {2*#2+2}} < {-#2}
+ { \int_eval:n {2*#2+1 + \int_mod:nn {#1} {2*#2+2}} }
+ { \int_eval:n { -\int_mod:nn {#1} {2*#2+2} } }
+ }
+ { % #1 is non-negative
+ \int_compare:nNnTF {\int_mod:nn {#1} {2*#2+2}} > {#2}
+ { \int_eval:n {2*#2+1- \int_mod:nn {#1} {2*#2+2} } }
+ { \int_eval:n { \int_mod:nn {#1} {2*#2+2} } }
+ }
+}
+
+
+% use type A residues by default
+\cs_set_eq:NN \__atableau_residue:nn \__atableau_residue_A:nn
+
+% ---------------------------------------------------------------------------
+% Parsing input
+
+% \seq_set_split:Nnn does not respect braces around singleton entries
+% such as in { 1345, 8{10}, {11}, {12} }, with the result that {11}
+% and {12} are treated as {1}{1} and {1}{2}, respectively. As this is
+% not what we want, we use \peek_charcode:NTF to do this ourselves.
+\cs_new_protected:Npn \__atableau_peek_tableau:w
+{
+ \peek_remove_spaces:n { % ignore spaces
+ \peek_charcode_remove:NTF ,
+ {
+ % record the column index in the shape for drawing the border
+ \seq_put_right:NV \l__atableau_shape_seq \l__atableau_col_int
+
+ % increment the row index
+ \int_incr:N \l__atableau_row_int
+
+ % reset the column index, and update the skew shape for shifted tableau
+ \bool_if:NTF \l__atableau_shifted_bool
+ {
+ \seq_put_right:No \l__atableau_skew_seq {\int_use:N \l__atableau_row_int}
+ \int_set_eq:NN \l__atableau_col_int \l__atableau_row_int
+
+ }
+ {
+ \int_set:Nn \l__atableau_col_int { 0\seq_item:Nn \l__atableau_skew_seq {\l__atableau_row_int+1}}
+ }
+
+ % look for the next entry
+ \__atableau_peek_tableau:w
+ }
+ {
+ \__atableau_peek_style:nw {draw_entry:nn}
+ }
+ }
+}
+
+% ---------------------------------------------------------------------------
+
+% usage: \__atableau_peek_style:nw {command suffix}
+% Read the next entry in the input sequence, with any optional style given by
+% a * or [...], and then pass this data to the command \__atableau_#1.
+\cs_new_protected:Npn \__atableau_peek_style:nw #1
+{
+ \peek_remove_spaces:n { % ignore spaces
+ \peek_charcode:NTF [
+ { \use:c{__atableau_#1} }
+ {
+ \peek_charcode_remove:NTF *
+ { \use:c{__atableau_#1} [\l__atableau_starstyle_tl] }
+ { \use:c{__atableau_#1} [] }
+ }
+ }
+}
+
+% To parse the bead specifications used by \Abacus we need to accept the
+% a "bead specification" of the following form
+% [style]m^k_txt
+% where the [style] could simply be a *, the m is an integer, a part of the
+% partition being constructed, the k its exponent and txt is the text for the
+% node. Except for m, all of of these components are optional, with the
+% exponent being 1 if it is omitted. As is customary, the order of the
+% superscript and subscript is interchangeable. To parse these expressions we
+% first use \__atableau_peek_style:nw to strip off the style specification, via
+% \__atableau_record_style:nn, and then pass between \__atableau_peek_beads:nw
+% and \__atableau_record:nn to look ahead for the characters ^ and _ to decide
+% which of the following token lists the next character is added to:
+\cs_new_protected:Npn \__atableau_record_style:nn [#1] #2
+{
+ % clear the bead token lists
+ \tl_set:Nn \l__atableau_capture_style_tl {#1}
+ \tl_set:Nn \l__atableau_capture_part_tl {#2}
+ \tl_clear:N \l__atableau_capture_exp_tl
+ \tl_clear:N \l__atableau_capture_txt_tl
+ \__atableau_peek_beads:nw {part}
+}
+
+% look for a caret or an underscore and pass on to \__atableau_record_bead:nn
+\cs_new_protected:Npn \__atableau_peek_beads:nw #1
+{
+ \peek_remove_spaces:n { % ignore spaces
+ \peek_charcode_remove:NTF _
+ { \__atableau_record_bead:nn {txt} {}}
+ {
+ \peek_charcode_remove:NTF ^ { \__atableau_record_bead:nn {exp} {}}
+ { \__atableau_record_bead:nn {#1} }
+ }
+ }
+}
+
+% #1 is one of part, exp or txt
+\cs_new_protected:Npn \__atableau_record_bead:nn #1 #2
+{
+ \quark_if_recursion_tail_stop_do:nn {#2}
+ {
+ % the data in the sequences \l__atableau_capture_exp_tl times
+ \tl_if_empty:NT \l__atableau_capture_exp_tl { \tl_set:Nn \l__atableau_capture_exp_tl {1}}
+ \int_step_inline:nn { \l__atableau_capture_exp_tl }
+ {
+ \int_incr:N \l__atableau_beads_int
+ \seq_put_right:NV \l__atableau_shape_seq \l__atableau_capture_part_tl
+ \seq_put_right:NV \l__atableau_texts_seq \l__atableau_capture_txt_tl
+ \seq_put_right:NV \l__atableau_styles_seq \l__atableau_capture_style_tl
+ }
+ }
+ \tl_put_right:cn {l__atableau_capture_#1_tl} {#2}
+ \__atableau_peek_beads:nw {#1}
+}
+
+
+% usage: \__atableau_count_entries:nn [style] {entry}
+% Count the number of entries in the row, storing the result in c_int
+\cs_new_protected:Npn \__atableau_count_entries:nn [#1] #2
+{
+ % exit when we reach the end of the row
+ \quark_if_recursion_tail_stop:n {#2}
+
+ \int_incr:N \l__atableau_c_int
+ \__atableau_peek_style:nw {count_entries:nn}
+}
+
+% usage: \__atableau_count_row:n {entries}
+\cs_new_protected:Npn \__atableau_count_row:n #1
+{
+ \__atableau_peek_style:nw {count_entries:nn} #1 \q_recursion_tail \q_recursion_stop
+}
+
+% ---------------------------------------------------------------------------
+% creating custom diagrams
+
+% usage: \__atableau_compute_conjugate_partition:N {seq}
+% compute the conjugate partition of <seq> and store in \l__atableau_conjugate_seq
+\cs_new_protected:Npn \__atableau_compute_conjugate_partition:N #1
+{
+ \seq_clear:N \l__atableau_conjugate_seq
+ \int_zero:N \l_tmpa_int % previous part
+ \int_set:No \l__atableau_r_int {\seq_count:N #1}
+ \int_while_do:nn {\l__atableau_r_int > 0}
+ {
+ \int_set:No \l_tmpb_int {\seq_item:NV #1 \l__atableau_r_int }
+ \int_step_inline:nn { \l_tmpb_int - \l_tmpa_int }
+ {
+ \seq_put_right:NV \l__atableau_conjugate_seq \l__atableau_r_int
+ }
+ \int_set_eq:NN \l_tmpa_int \l_tmpb_int
+ \int_decr:N \l__atableau_r_int
+ }
+}
+
+% usage: \__atableau_set_partition:nn {shape|skew} {csv for partition}
+% This function allows the partition to be given either as a comma separated
+% list of integers, or as a comma separated list of integers with exponents
+% giving the multiplicity of each part. For example, 4,3,3,3,2 and 4,3^3,2
+% are both supported.
+% TODO? Rewrite using quarks?
+\cs_new_protected:Npn \__atableau_set_partition:nn #1 #2
+{
+ \seq_clear:c {l__atableau_#1_seq}
+ \clist_map_inline:nn {#2} { \__atableau_add_to_partition:nn {#1} {##1} }
+}
+
+% add parts to the partition \l__atableau_#1_seq given input
+% of the form k or k^r
+\cs_new_protected:Npn \__atableau_add_to_partition:nn #1 #2
+{
+ % split #1 on ^: the trailing ^1 sets the exponent to 1 if it's omitted
+ \seq_set_split:Nnn \l_tmpa_seq {^} {#2 ^1}
+ % given k or k^r, set \l_tmpa_int=k and \l_tmpb_int=r, where r=1 with input k
+ \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl % part
+ \seq_pop_left:NN \l_tmpa_seq \l_tmpb_tl % exponent
+ % now add \l_tmpa_int to \l__atableau_#1_seq b times
+ \int_step_inline:nn {\l_tmpb_tl} { \seq_put_right:ce {l__atableau_#1_seq} {\l_tmpa_tl} }
+}
+
+% usage: \__atableau_diagram_for_shape:N {partition}
+% Young diagrams are drawn using the \Tableau command by generating
+% a sequence of ~ for the partition. For example,
+% it replaces the sequence 3,2,2,1 with
+% the dot-sequence ~~~,~~,~~,~,
+\cs_new_protected:Npn \__atableau_diagram_for_shape:N #1
+{
+ \tl_clear:N \l__atableau_entries_tl
+ \tl_set:Nn \l_tmpb_tl {}
+ \seq_map_inline:Nn #1
+ {
+ \tl_put_right:No \l__atableau_entries_tl \l_tmpb_tl
+ \tl_put_right:Nx \l__atableau_entries_tl { \prg_replicate:nn {##1} {{{~}}} }
+ \tl_set:Nn \l_tmpb_tl {,}
+ }
+}
+
+% usage: \__atableau_shape_to_content:Nn {partition sequence}
+% Return the content sequence to for a tableau of this shape
+\cs_new_protected:Npn \__atableau_shape_to_content:N #1
+{
+ \tl_clear:N \l__atableau_entries_tl
+ \int_zero:N \l__atableau_row_int
+ \tl_set:Nn \l_tmpb_tl {}
+ \seq_map_inline:Nn #1
+ {
+ \tl_put_right:No \l__atableau_entries_tl \l_tmpb_tl
+ \int_incr:N \l__atableau_row_int
+ \int_step_inline:nn {##1}
+ {
+ \int_set:Nn \l_tmpa_int { \l__atableau_charge_int + ####1 - \l__atableau_row_int + 0\seq_item:NV \l__atableau_skew_seq \l__atableau_row_int }
+ \int_compare:nNnTF {\l_tmpa_int} < {0}
+ { \__atableau_tl_put_right_braced:Ne \l__atableau_entries_tl {\exp_not:N\shortminus\int_eval:n{-\l_tmpa_int}} }
+ { \__atableau_tl_put_right_braced:No \l__atableau_entries_tl {\int_use:N \l_tmpa_int} }
+ }
+ \tl_set:Nn \l_tmpb_tl {,}
+ }
+}
+
+% Diagrams with show=last are drawn using the \Tableau command, with
+% usage: \__atableau_shape_to_last:N {partition sequence}
+\cs_new_protected:Npn \__atableau_shape_to_last:N #1
+{
+ % compute conjugate of #1 as \l__atableau_conjugate_seq
+ %\__atableau_compute_conjugate_partition:N #1
+
+ % initialise \l_tmpc_seq -- should not be necessary but otherwise \seq_item:NV fails
+ \seq_clear:N \l_tmpc_seq % construct the tableau in this sequence and then decant
+ \seq_map_inline:Nn #1 {\seq_put_right:Nn \l_tmpc_seq {}}
+
+ % value of last entry added to the tableau
+ \int_set:Nn \l__atableau_c_int {\l__atableau_charge_int}
+
+ % length of the first row of the partition/seq #1
+ \int_set:Nn \l__atableau_row_int {0\seq_item:Nn #1 {1}}
+
+ \int_step_inline:nn {\l__atableau_row_int} % ##1 is the column index
+ {
+ \int_zero:N \l__atableau_r_int % r_int is the row index
+ \seq_map_inline:Nn #1 % ####1 is the rth entry of the partition #1
+ {
+ \int_incr:N \l__atableau_r_int
+ \tl_set:Nn \l_tmpa_tl { 0\seq_item:NV \l__atableau_skew_seq \l__atableau_r_int}
+ \bool_if:nT { \int_compare_p:nNn {##1} > {\l_tmpa_tl} && \int_compare_p:nNn {\l_tmpa_tl+####1+1} > {##1}}
+ {
+ \int_incr:N \l__atableau_c_int
+ \tl_set:No \l_tmpa_tl { \seq_item:Nn \l_tmpc_seq {\l__atableau_r_int} }
+ \__atableau_tl_put_right_braced:No \l_tmpa_tl {\int_use:N \l__atableau_c_int}
+ \seq_set_item:NVx \l_tmpc_seq \l__atableau_r_int {\l_tmpa_tl}
+ }
+ }
+ }
+
+ % finally, unpack \l_tmpc_tl into l__atableau_entries_tl
+ \tl_clear:N \l__atableau_entries_tl
+ \tl_set:Nn \l_tmpb_tl {}
+ \seq_map_inline:Nn \l_tmpc_seq {
+ \tl_put_right:No \l__atableau_entries_tl \l_tmpb_tl
+ \tl_put_right:Nn \l__atableau_entries_tl {##1}
+ \tl_set:Nn \l_tmpb_tl {,}
+ }
+}
+
+% Diagrams with show=first are drawn using the \Tableau command, with
+% usage: \__atableau_shape_to_first:N {partition sequence}
+\cs_new_protected:Npn \__atableau_shape_to_first:N #1
+{
+ \tl_clear:N \l__atableau_entries_tl
+ \int_set:Nn \l__atableau_r_int {\l__atableau_charge_int}
+ \tl_set:Nn \l_tmpb_tl {}
+ \seq_map_inline:Nn #1
+ {
+ \tl_put_right:No \l__atableau_entries_tl \l_tmpb_tl
+ \int_step_inline:nn {##1}
+ {
+ \int_incr:N \l__atableau_r_int
+ \__atableau_tl_put_right_braced:NV \l__atableau_entries_tl \l__atableau_r_int
+ }
+ \tl_set:Nn \l_tmpb_tl {,}
+ }
+ \seq_put_right:No \l__atableau_charge_seq {\int_use:N\l__atableau_r_int}
+}
+
+% usage: \__atableau_shape_to_hook:N {partition_seq}
+% Return a string for the hooks length tableau
+% Diagrams with show=hooks are drawn using the \Tableau command
+\cs_new_protected:Npn \__atableau_shape_to_hook:N #1
+{
+ % now construct the hook tableau
+ \tl_clear:N \l__atableau_entries_tl
+ \bool_if:NTF \l__atableau_shifted_bool
+ { % shifted tableau
+ % initialise l_tmpc_seq because we will construct the entries in it and unpack at the end
+ \seq_clear:N \l_tmpc_seq
+ \seq_map_inline:Nn #1 {\seq_put_right:Nn \l_tmpc_seq {}}
+ \int_set:Nn \l__atableau_col_int { 0\seq_item:Nn #1 {1} } % length of first row
+ \int_step_inline:nn { \l__atableau_col_int }
+ { % add hooks column by column, starting by determining the rows in columns ##1
+ \int_zero:N \l__atableau_row_int
+ \seq_map_inline:Nn #1
+ {
+ \bool_if:nT { \int_compare_p:nNn {##1} > {\l__atableau_row_int} && \int_compare_p:nNn {####1+\l__atableau_row_int+1} > {##1} }
+ {
+ \int_incr:N \l__atableau_row_int
+ }
+ }
+ % record length of row col+1
+ \int_set:Nn \l_tmpa_int {0\seq_item:Nn #1 {##1+1}}
+ % loop through rows 1,...,row and add the hook lengths
+ \int_step_inline:nn {\l__atableau_row_int}
+ {
+ \tl_set:Nx \l_tmpa_tl { \seq_item:Nn \l_tmpc_seq {####1} }
+ \tl_set:Nx \l_tmpb_tl { \int_eval:n {\seq_item:Nn #1 {####1} + \l__atableau_row_int - ##1 + \l_tmpa_int } }
+ \__atableau_tl_put_right_braced:NV \l_tmpa_tl \l_tmpb_tl
+ \seq_set_item:Nnx \l_tmpc_seq {####1} {\l_tmpa_tl}
+
+ }
+ }
+ \tl_set:Nx \l__atableau_entries_tl { \seq_use:Nn \l_tmpc_seq {,} }
+ }
+ { % unshifted (although could be skew, when all bets are off...)
+ % compute conjugate of #1 as \l__atableau_conjugate_seq
+ \int_zero:N \l__atableau_row_int
+ \tl_set:Nn \l_tmpb_tl {}
+ \__atableau_compute_conjugate_partition:N #1
+ \seq_map_inline:Nn #1
+ {
+ \tl_put_right:No \l__atableau_entries_tl \l_tmpb_tl
+ \int_incr:N \l__atableau_row_int
+ \int_step_inline:nn {##1}
+ {
+ \tl_set:Ne \l_tmpc_tl { \int_eval:n {##1+\seq_item:Nn \l__atableau_conjugate_seq {####1} -\l__atableau_row_int-####1+1} }
+ \__atableau_tl_put_right_braced:NV \l__atableau_entries_tl \l_tmpc_tl
+ }
+ \tl_set:Nn \l_tmpb_tl {,}
+ }
+ }
+}
+
+% Residue diagrams are drawn using the \Tableau command, with
+% usage: \__atableau_shape_to_residue:N {partition sequence}
+\cs_new_protected:Npn \__atableau_shape_to_residue:N #1
+{
+ \tl_clear:N \l__atableau_entries_tl
+ \int_zero:N \l__atableau_row_int
+ \tl_set:Nn \l_tmpb_tl {}
+ \seq_map_inline:Nn #1
+ {
+ \tl_put_right:No \l__atableau_entries_tl \l_tmpb_tl
+ \int_incr:N \l__atableau_row_int
+ \int_step_inline:nn {##1}
+ {
+ \int_set:Nn \l_tmpa_int { \l__atableau_charge_int + ####1 - \l__atableau_row_int }
+ \int_add:Nn \l_tmpa_int { + 0\seq_item:NV \l__atableau_skew_seq \l__atableau_row_int }
+ \tl_set:Nx \l_tmpa_tl { \__atableau_residue:nn { \l_tmpa_int } {\l__atableau_e_int} }
+ \__atableau_tl_put_right_braced:Nx \l__atableau_entries_tl { \l_tmpa_tl }
+ }
+ \tl_set:Nn \l_tmpb_tl {,}
+ }
+}
+
+% ---------------------------------------------------------------------------
+% draw diagram border
+
+% usage: \__atableau_draw_border:nn #1 #2 {name of sequence} {name of style}
+% The name of the sequence is either skew or shape
+\cs_new_protected:Npn \__atableau_draw_border:nn #1 #2
+{
+ \int_zero:N \l__atableau_r_int % row index
+ \int_zero:N \l__atableau_c_int % column index
+ \tl_clear:N \l__atableau_border_tl % will hold the border
+
+ \seq_map_inline:cn {l__atableau_#1_seq}
+ {
+ % compute the endpoints of this row
+ \str_if_eq:nnF {skew} {#1}
+ {
+ \int_set:Nn \l__atableau_c_int { 0\seq_item:Nn \l__atableau_skew_seq {\l__atableau_r_int+1}}
+ \bool_if:nT { \l__atableau_tabloid_bool && \int_compare_p:nNn {\l__atableau_r_int} > {0} }
+ {
+ \int_set:Nn \l__atableau_c_int { \int_min:nn {\l__atableau_c_int} {0\seq_item:Nn \l__atableau_skew_seq {\l__atableau_r_int}} }
+ }
+ }
+ \__atableau_set_box_coordinates:nVV {a} \l__atableau_r_int \l__atableau_c_int
+ \__atableau_set_box_coordinates:nVn {b} \l__atableau_r_int {##1}
+ \bool_if:nTF { \int_compare_p:n {\l__atableau_r_int = 0} || \l__atableau_tabloid_bool }
+ {
+ % add line along "top" of the row
+ \tl_put_right:Nx \l__atableau_border_tl {(\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp)}
+ \__atableau_add_row_ends:
+ }
+ {
+ % add lines for second and later rows
+ \tl_put_left:Nx \l__atableau_border_tl {(\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--}
+ \tl_put_right:Nx \l__atableau_border_tl {--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp)}
+ \__atableau_add_row_ends:
+ }
+ \int_incr:N \l__atableau_r_int
+ }
+
+ % draw the border that we have constructed
+ \tl_if_empty:NF \l__atableau_border_tl
+ {
+ % fill in the last line
+ \bool_if:nT { \l__atableau_tabloid_bool && \int_compare_p:nNn {\l__atableau_r_int} > {0} }
+ {
+ \int_set:Nn \l__atableau_c_int { 0\seq_item:NV \l__atableau_skew_seq \l__atableau_r_int }
+ \__atableau_set_box_coordinates:nVV {a} \l__atableau_r_int \l__atableau_c_int
+ }
+ \tl_put_right:Nx \l__atableau_border_tl {(\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp)}
+ % draw the border
+ \draw[aTableau/#2] \l__atableau_border_tl;
+ }
+}
+
+
+% usage: \__atableau_remove_dotted_tableau_rows:
+% Poke some holes in the border for the rows in dotted_rows_seq
+\cs_new_protected:Nn \__atableau_remove_dotted_tableau_rows:
+{
+ % To collect repeated rows in dotted_rows_seq
+ % we use \seq_map_inline:Nn and then compare ##1 with \l__atableau_r_int to
+ % determine if this is a new row.
+
+ % take a copy of \l__atableau_dotted_rows_seq so that the pop_left's below
+ % do not destroy it
+ \seq_set_eq:NN \l_tmpb_seq \l__atableau_dotted_rows_seq
+ \bool_do_until:nn { \seq_if_empty_p:N \l_tmpb_seq }
+ {
+ \seq_pop_left:NN \l_tmpb_seq \l_tmpa_tl
+ \int_set:Nn \l__atableau_row_int {\l_tmpa_tl}
+ \int_set:Nn \l__atableau_r_int {\l__atableau_row_int+1}
+
+ % LaTeX3 does not provide \seq_if_in_p:NN, so ...
+ \bool_set_true:N \l_tmpa_bool
+ \bool_do_while:nn { \l_tmpa_bool }
+ {
+ \int_set:Nn \l_tmpa_int {0\seq_item:Nn \l_tmpb_seq 1}
+ \int_compare:nNnTF {\l__atableau_r_int} = {\l_tmpa_int}
+ {
+ \seq_pop_left:NN \l_tmpb_seq \l_tmpa_tl
+ \int_incr:N \l__atableau_r_int
+ }
+ { \bool_set_false:N \l_tmpa_bool }
+ }
+
+ % We want to blank out the rows between the four coordinates
+ % a=(row,tmpa) .... b=(row,col)
+ % | |
+ % c=(r,tmpb) .... d=(r,c)
+
+ % set tmpa and tmpb to the column index for rows row and r, respectively
+ \int_set:No \l__atableau_col_int { 0\seq_item:NV \l__atableau_shape_seq \l__atableau_row_int } % mu_row
+ \int_set:No \l__atableau_c_int { 0\seq_item:NV \l__atableau_shape_seq \l__atableau_r_int } % mu_r
+
+ % shift in col-direction
+ \fp_set:Nn \l__atableau_xa_fp {\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp}
+ \fp_set:Nn \l__atableau_ya_fp {\l__atableau_tab_col_dy_fp*\l__atableau_box_ht_fp}
+
+ % shift in row-direction
+ \fp_set:Nn \l__atableau_xb_fp {\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp}
+ \fp_set:Nn \l__atableau_yb_fp {\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp}
+
+ % a draw between the coordinates a, b, c, d
+ \__atableau_set_box_coordinates:noo {l} {\l__atableau_row_int-1} {\l__atableau_col_int-1} % point b
+
+ \draw[aTableau/clearBoxes]
+ (\fp_eval:n{\l__atableau_xl_fp+0.58*\l__atableau_xa_fp-0.42*\l__atableau_xb_fp},
+ \fp_eval:n{\l__atableau_yl_fp+0.58*\l__atableau_ya_fp-0.42*\l__atableau_yb_fp})
+ --++(\fp_eval:n{(\l__atableau_r_int-\l__atableau_row_int)*\l__atableau_xb_fp},
+ \fp_eval:n{(\l__atableau_r_int-\l__atableau_row_int)*\l__atableau_yb_fp})
+ --++(\fp_eval:n{(\l__atableau_c_int-\l__atableau_col_int)*\l__atableau_xa_fp},
+ \fp_eval:n{(\l__atableau_c_int-\l__atableau_col_int)*\l__atableau_ya_fp})
+ --++(\fp_eval:n{-0.12*\l__atableau_xb_fp}, \fp_eval:n{-0.12*\l__atableau_yb_fp})
+ --++(\fp_eval:n{-(0.15+\l__atableau_c_int)*\l__atableau_xa_fp}, \fp_eval:n{-(0.15+\l__atableau_c_int)*\l__atableau_ya_fp})
+ --++(\fp_eval:n{(\l__atableau_row_int-\l__atableau_r_int+0.12)*\l__atableau_xb_fp},
+ \fp_eval:n{(\l__atableau_row_int-\l__atableau_r_int+0.12)*\l__atableau_yb_fp})
+ --cycle
+ ;
+
+ % finally, we need to add dots between b and d
+ \draw[aTableau/dottedLine]
+ (\fp_eval:n{0.5*\l__atableau_xa_fp-0.5*\l__atableau_xb_fp+\l__atableau_xl_fp},
+ \fp_eval:n{0.5*\l__atableau_ya_fp-0.5*\l__atableau_yb_fp+\l__atableau_yl_fp})
+ --++(\fp_eval:n{(\l__atableau_c_int-\l__atableau_col_int)*\l__atableau_xa_fp+(\l__atableau_r_int-\l__atableau_row_int)*\l__atableau_xb_fp},
+ \fp_eval:n{(\l__atableau_c_int-\l__atableau_col_int)*\l__atableau_ya_fp+(\l__atableau_r_int-\l__atableau_row_int)*\l__atableau_yb_fp})
+ ;
+
+ % and between a and c, which is trickier as the skew shape plays a role
+ \int_set:No \l_tmpa_int { \int_eval:n {0\seq_item:Nn \l__atableau_skew_seq \l__atableau_row_int} }
+ \int_set:No \l_tmpb_int { \int_eval:n {\int_max:nn{\l_tmpa_int}{0\seq_item:Nn \l__atableau_skew_seq \l__atableau_r_int} }}
+ \int_decr:N \l__atableau_row_int
+ \int_decr:N \l__atableau_r_int
+ \draw[aTableau/dottedLine]
+ (\fp_eval:n{\l__atableau_x_fp+\l_tmpa_int*\l__atableau_xa_fp+\l__atableau_row_int*\l__atableau_xb_fp},
+ \fp_eval:n{\l__atableau_y_fp+\l_tmpa_int*\l__atableau_ya_fp+\l__atableau_row_int*\l__atableau_yb_fp})
+ --(\fp_eval:n{\l__atableau_x_fp+\l_tmpb_int*\l__atableau_xa_fp+\l__atableau_r_int*\l__atableau_xb_fp},
+ \fp_eval:n{\l__atableau_y_fp+\l_tmpb_int*\l__atableau_ya_fp+\l__atableau_r_int*\l__atableau_yb_fp})
+ ;
+
+ \bool_if:nT { \int_compare_p:nNn {\l_tmpa_int}>{0} && \l__atableau_skew_border_bool }
+ {
+ \draw[aTableau/dottedLine,draw=\l__atableau_skew_border_tl]
+ (\fp_eval:n{\l__atableau_x_fp+\l__atableau_row_int*\l__atableau_xb_fp},
+ \fp_eval:n{\l__atableau_y_fp+\l__atableau_row_int*\l__atableau_yb_fp})
+ --(\fp_eval:n{\l__atableau_x_fp+\l__atableau_r_int*\l__atableau_xb_fp},
+ \fp_eval:n{\l__atableau_y_fp+\l__atableau_r_int*\l__atableau_yb_fp})
+ ;
+ }
+ }
+}
+
+% usage: \__atableau_remove_dotted_tableau_cols:
+% Poke some holes in the border for the cols in dotted_rows_seq
+\cs_new_protected:Nn \__atableau_remove_dotted_tableau_cols:
+{
+ % To collect repeated columns in dotted_cols_seq
+ % we use \seq_map_inline:Nn and then compare ##1 with \l__atableau_c_int to
+ % determine if this is a new column.
+
+ % conjugate partition and skew shape
+ \__atableau_compute_conjugate_partition:N \l__atableau_skew_seq
+ \seq_set_eq:NN \l_tmpa_seq \l__atableau_conjugate_seq % \l_tmpa_seq is the conjugate skew
+ \__atableau_compute_conjugate_partition:N \l__atableau_shape_seq % conjugate shape
+
+ % take a copy of \l__atableau_dotted_cols_seq so that the pop_left's below
+ % do not destroy it
+ \seq_set_eq:NN \l_tmpb_seq \l__atableau_dotted_cols_seq
+ \bool_do_until:nn { \seq_if_empty_p:N \l_tmpb_seq }
+ {
+ \seq_pop_left:NN \l_tmpb_seq \l_tmpa_tl
+ \int_set:Nn \l__atableau_col_int {\l_tmpa_tl}
+ \int_set:Nn \l__atableau_c_int {\l__atableau_col_int+1}
+
+ % LaTeX3 does not provide \seq_if_in_p:NN, so ...
+ \bool_set_true:N \l_tmpa_bool
+ \bool_do_while:nn { \l_tmpa_bool }
+ {
+ \int_set:Nn \l_tmpa_int {0\seq_item:Nn \l_tmpb_seq 1}
+ \int_compare:nNnTF {\l__atableau_c_int} = {\l_tmpa_int}
+ {
+ \seq_pop_left:NN \l_tmpb_seq \l_tmpa_tl
+ \int_incr:N \l__atableau_c_int
+ }
+ { \bool_set_false:N \l_tmpa_bool }
+ }
+
+ % We want to blank out the rows between the four coordinates
+ % a=(row,tmpa) .... b=(r,tmpb)
+ % | |
+ % c=(row,col) .... d=(r,c)
+
+ % set row and r to the row indices for col and c, respectively
+ \int_set:No \l__atableau_row_int { 0\seq_item:NV \l__atableau_conjugate_seq \l__atableau_col_int } % mu_row
+ \int_set:No \l__atableau_r_int { 0\seq_item:NV \l__atableau_conjugate_seq \l__atableau_c_int } % mu_r
+
+
+ % shift in col-direction
+ \fp_set:Nn \l__atableau_xa_fp {\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp}
+ \fp_set:Nn \l__atableau_ya_fp {\l__atableau_tab_col_dy_fp*\l__atableau_box_ht_fp}
+
+ % shift in row-direction
+ \fp_set:Nn \l__atableau_xb_fp {\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp}
+ \fp_set:Nn \l__atableau_yb_fp {\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp}
+
+ % a draw between the coordinates a, b, c, d
+ \__atableau_set_box_coordinates:noo {l} {\l__atableau_row_int-1} {\l__atableau_col_int-1} % point b
+
+ \draw[aTableau/clearBoxes]
+ (\fp_eval:n{\l__atableau_xl_fp-0.42*\l__atableau_xa_fp+0.58*\l__atableau_xb_fp},
+ \fp_eval:n{\l__atableau_yl_fp-0.42*\l__atableau_ya_fp+0.58*\l__atableau_yb_fp})
+ --++(\fp_eval:n{(\l__atableau_c_int-\l__atableau_col_int)*\l__atableau_xa_fp},
+ \fp_eval:n{(\l__atableau_c_int-\l__atableau_col_int)*\l__atableau_ya_fp})
+ --++(\fp_eval:n{(\l__atableau_r_int-\l__atableau_row_int)*\l__atableau_xb_fp},
+ \fp_eval:n{(\l__atableau_r_int-\l__atableau_row_int)*\l__atableau_yb_fp})
+ --++(\fp_eval:n{-0.12*\l__atableau_xa_fp}, \fp_eval:n{-0.12*\l__atableau_ya_fp})
+ --++(\fp_eval:n{-(0.15+\l__atableau_r_int)*\l__atableau_xb_fp}, \fp_eval:n{-(0.15+\l__atableau_r_int)*\l__atableau_yb_fp})
+ --++(\fp_eval:n{(\l__atableau_col_int-\l__atableau_c_int+0.12)*\l__atableau_xa_fp},
+ \fp_eval:n{(\l__atableau_col_int-\l__atableau_c_int+0.12)*\l__atableau_ya_fp})
+ --cycle
+ ;
+
+ % finally, we need to add dots between b and d
+ \draw[aTableau/dottedLine]
+ (\fp_eval:n{\l__atableau_xl_fp-0.5*\l__atableau_xa_fp+0.5*\l__atableau_xb_fp},
+ \fp_eval:n{\l__atableau_yl_fp-0.5*\l__atableau_ya_fp+0.5*\l__atableau_yb_fp})
+ --++(\fp_eval:n{(\l__atableau_r_int-\l__atableau_row_int)*\l__atableau_xb_fp+(\l__atableau_c_int-\l__atableau_col_int)*\l__atableau_xa_fp},
+ \fp_eval:n{(\l__atableau_r_int-\l__atableau_row_int)*\l__atableau_yb_fp+(\l__atableau_c_int-\l__atableau_col_int)*\l__atableau_ya_fp})
+ ;
+
+ % and between a and c, which is trickier as the skew shape plays a role
+ \int_set:No \l_tmpa_int { \int_eval:n {0\seq_item:Nn \l_tmpa_seq \l__atableau_col_int} }
+ \int_set:No \l_tmpb_int { \int_eval:n {\int_max:nn{\l_tmpa_int}{0\seq_item:Nn \l_tmpa_seq \l__atableau_c_int} }}
+ \int_decr:N \l__atableau_col_int
+ \int_decr:N \l__atableau_c_int
+ \draw[aTableau/dottedLine]
+ (\fp_eval:n{\l__atableau_x_fp+\l_tmpa_int*\l__atableau_xb_fp+\l__atableau_col_int*\l__atableau_xa_fp},
+ \fp_eval:n{\l__atableau_y_fp+\l_tmpa_int*\l__atableau_yb_fp+\l__atableau_col_int*\l__atableau_ya_fp})
+ --(\fp_eval:n{\l__atableau_x_fp+\l_tmpb_int*\l__atableau_xb_fp+\l__atableau_c_int*\l__atableau_xa_fp},
+ \fp_eval:n{\l__atableau_y_fp+\l_tmpb_int*\l__atableau_yb_fp+\l__atableau_c_int*\l__atableau_ya_fp})
+ ;
+
+ \bool_if:nT { \int_compare_p:nNn {\l_tmpa_int}>{0} && \l__atableau_skew_border_bool }
+ {
+ \draw[aTableau/dottedLine,draw=\l__atableau_skew_border_tl]
+ (\fp_eval:n{\l__atableau_x_fp+\l__atableau_col_int*\l__atableau_xa_fp},
+ \fp_eval:n{\l__atableau_y_fp+\l__atableau_col_int*\l__atableau_ya_fp})
+ --(\fp_eval:n{\l__atableau_x_fp+\l__atableau_c_int*\l__atableau_xa_fp},
+ \fp_eval:n{\l__atableau_y_fp+\l__atableau_c_int*\l__atableau_ya_fp})
+ ;
+ }
+ }
+}
+
+% usage: \__atableau_draw_label:
+% Add the label to a diagram
+\cs_new_protected:Nn \__atableau_draw_label:
+{
+ % determine where the label should be attached, which is the (1,1)-box by default
+ \fp_set_eq:NN \l__atableau_xa_fp \l__atableau_x_fp
+ \fp_set_eq:NN \l__atableau_ya_fp \l__atableau_y_fp
+ \bool_if:nF { \seq_if_empty_p:N \l__atableau_skew_seq || \l__atableau_skew_border_bool }
+ { % attach label to the (1,skew_1)-box
+ \tl_set:Nn \l_tmpa_tl { 0\seq_item:Nn \l__atableau_skew_seq {1} }
+ \fp_add:Nn \l__atableau_xa_fp {\l_tmpa_tl*\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp}
+ \fp_add:Nn \l__atableau_ya_fp {\l_tmpa_tl*\l__atableau_tab_col_dy_fp*\l__atableau_box_wd_fp}
+ }
+ % add the label
+ \node[aTableau/labelStyle] at (\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp) { \__atableau_entry:n{\l__atableau_label_tl} };
+}
+
+% usage: \__atableau_draw_skew_boxes:
+% Draw the skew boxes using ribbons
+\cs_new_protected:Nn \__atableau_draw_skew_boxes:
+{
+ \group_begin:
+ % override the style of the skew boxes inside this group
+ \tikzset{aTableau/ribbonBox/.style=aTableau/skewBox}
+ \tikzset{aTableau/ribbonStyle/.style={draw=none,fill=none}}
+ \tl_set:Nn \l__atableau_ribbon_type_tl {ribbon} % change ribbon type to ribbon
+ \int_zero:N \l__atableau_r_int
+ \seq_map_inline:Nn \l__atableau_skew_seq
+ {
+ \int_incr:N \l__atableau_r_int
+ \int_compare:nNnT {##1} > {0}
+ {
+ \tl_clear:N \l_tmpa_tl
+ \tl_put_right:Ne \l_tmpa_tl { {\int_use:N \l__atableau_r_int} }
+ \tl_put_right:Ne \l_tmpa_tl { {##1} }
+ \tl_put_right:Ne \l_tmpa_tl { \prg_replicate:nn {##1-1} {c} }
+ \__atableau_add_ribbon:V \l_tmpa_tl
+ }
+ }
+ \group_end:
+}
+
+% usage: \__atableau_add_row_ends: increment the (xa,ya) and (xb,yb) coordinates down
+% one row and add the lines at the left and right hand ends of the row to
+% \l__atableau_border_tl. If this is a tabloid then we only want to add the
+% coordinates but otherwise we join them up
+\cs_new_protected:Nn \__atableau_add_row_ends:
+{
+ \bool_if:NTF \l__atableau_conjugate_bool
+ {
+ % adding to the left-hand side
+ \fp_add:Nn \l__atableau_xa_fp {\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp}
+ \fp_add:Nn \l__atableau_ya_fp {\l__atableau_tab_col_dy_fp*\l__atableau_box_ht_fp}
+
+ % adding to the right-hand side
+ \fp_add:Nn \l__atableau_xb_fp {\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp}
+ \fp_add:Nn \l__atableau_yb_fp {\l__atableau_tab_col_dy_fp*\l__atableau_box_ht_fp}
+
+ \bool_if:NTF \l__atableau_tabloid_bool
+ {
+ \tl_put_left:Nx \l__atableau_border_tl {--(\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)}
+ \tl_put_right:Nx \l__atableau_border_tl {(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp)--}
+ }
+ {
+ \tl_put_left:Nx \l__atableau_border_tl {(\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--}
+ \tl_put_right:Nx \l__atableau_border_tl {--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp)}
+ }
+ }
+ {
+ % adding to the left-hand side
+ \fp_add:Nn \l__atableau_xa_fp {\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp}
+ \fp_add:Nn \l__atableau_ya_fp {\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp}
+
+ % adding to the right-hand side
+ \fp_add:Nn \l__atableau_xb_fp {\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp}
+ \fp_add:Nn \l__atableau_yb_fp {\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp}
+
+ \bool_if:NTF \l__atableau_tabloid_bool
+ {
+ \tl_put_left:Nx \l__atableau_border_tl {(\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)}
+ \tl_put_right:Nx \l__atableau_border_tl {(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp)--}
+ }
+ {
+ \tl_put_left:Nx \l__atableau_border_tl {(\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--}
+ \tl_put_right:Nx \l__atableau_border_tl {--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp)}
+ }
+ }
+}
+
+% ---------------------------------------------------------------------------
+% Tableaux
+
+% usage: \__atableau_draw_tableau:n {tableau specifications}
+% The entries are first primarily because the \Diagram commands need
+% to force the entries to expand
+\cs_new_protected:Npn \__atableau_draw_tableau:n #1
+{
+ % set the star style
+ \tl_set:Nn \l__atableau_starstyle_tl {aTableau/tableauStarStyle}
+
+ % disable interior boxes if boxes_bool is false
+ \bool_if:NF \l__atableau_boxes_bool { \__atableau_tikzset_append:nn {boxStyle} {draw=none} }
+
+ % initialise the skew shape for a shifted tableaux
+ \bool_if:NT \l__atableau_shifted_bool
+ {
+ \seq_clear:N \l__atableau_skew_seq
+ \seq_put_right:No \l__atableau_skew_seq {0}
+ }
+
+ % record the tableau shape as we go so that we can draw the border
+ % in finalise_tableau
+ \seq_clear:N \l__atableau_shape_seq
+
+ % the styled boxes are drawn at the end
+ \tl_clear:N \l__atableau_styled_nodes_tl
+
+ % set initial row and column
+ \int_zero:N \l__atableau_row_int
+ \int_set:Nn \l__atableau_col_int { 0\seq_item:Nn \l__atableau_skew_seq {1}}
+
+ % Parse #1 into the rows and columns with style. Initially we used
+ % \seq_set_split:Nnn here, but this required double bracing
+ % multi-character entries whenever they were he only entry in their
+ % column. Now we peek for the commas and the style simultaneously.
+ \__atableau_peek_tableau:w #1 \q_recursion_tail \q_recursion_stop
+
+ % add the nodes with style
+ \l__atableau_styled_nodes_tl
+
+ % add the labels, ribbons, snobs and border
+ \__atableau_finalise_tableau:
+}
+
+% usage: \__atableau_finalise_tableau:
+% As it is used in several places, collect the code that finishes
+% drawing the tableau by adding the ribbons, paths, snobs, skew boxes,
+% border and the dotted rows and columns.
+\cs_new_protected:Nn \__atableau_finalise_tableau:
+{
+ % prevent paths and ribbons from updating shape
+ \cs_set_eq:NN \__atableau_update_shape: \prg_do_nothing:
+
+ % add paths
+ \seq_if_empty:NF \l__atableau_paths_seq
+ {
+ \tl_set:Nn \l__atableau_ribbon_type_tl {path} % change ribbon type to path
+ \seq_map_inline:Nn \l__atableau_paths_seq {\__atableau_add_ribbon:n {##1}}
+ }
+
+ % add ribbons
+ \tl_set:Nn \l__atableau_ribbon_type_tl {ribbon} % change ribbon type to ribbon
+ \seq_map_inline:Nn \l__atableau_ribbons_seq {\__atableau_add_ribbon:n {##1}}
+
+ % paths and ribbons are inside the delimiters, but snobs are not
+ \cs_set_eq:NN \__atableau_update_extrema:n \use_none:n
+
+ % draw border
+ \tl_if_blank:VF \l__atableau_label_tl { \__atableau_draw_label: }
+ \bool_if:NT \l__atableau_skew_boxes_bool { \__atableau_draw_skew_boxes: }
+ \bool_if:NT \l__atableau_skew_border_bool { \__atableau_draw_border:nn {skew} {skewBorder} }
+ \bool_if:NT \l__atableau_border_bool { \__atableau_draw_border:nn {shape} {borderStyle} }
+
+ % remove dotted rows and columns
+ \seq_if_empty:NF \l__atableau_dotted_rows_seq \__atableau_remove_dotted_tableau_rows:
+ \seq_if_empty:NF \l__atableau_dotted_cols_seq \__atableau_remove_dotted_tableau_cols:
+
+ % add snobs
+ \tl_set:Nn \l__atableau_ribbon_type_tl {snob} % change ribbon type to snob
+ \seq_map_inline:Nn \l__atableau_snobs_seq {\__atableau_add_ribbon:n {##1}}
+}
+
+% ---------------------------------------------------------------------------
+% box and bead coordinates
+
+% usage: \__atableau_update_multi_extrema:n {letter}
+% Update xmax, ymax and ymin using the x#1_fp and y#1_fp
+\cs_new_protected:Npn \__atableau_update_multi_extrema:n #1
+{
+ % adjust xmax, ymin and ymax for multishapes
+ \fp_set:Nn \l__atableau_xmax_fp { max(\l__atableau_xmax_fp, \use:c{l__atableau_x#1_fp}) }
+ \fp_set:Nn \l__atableau_ymax_fp { max(\l__atableau_ymax_fp, \use:c{l__atableau_y#1_fp}) }
+ \fp_set:Nn \l__atableau_ymin_fp { min(\l__atableau_ymin_fp, \use:c{l__atableau_y#1_fp}) }
+}
+
+\cs_new_protected:Npn \__atableau_update_multi_xtrema:n #1
+{
+ % adjust xmax for multishapes
+ \fp_set:Nn \l__atableau_xmax_fp { max(\l__atableau_xmax_fp, \use:c{l__atableau_x#1_fp}) }
+}
+
+% By default, we do not update ymin, ymax and xmax. This only happens for multishapes
+\cs_set_eq:NN \__atableau_update_extrema:n \use_none:n
+
+% usage: \__atableau_set_box_coordinates_normal:nnn <letter> <row> <col>: given the row and columns
+% indices, row and col, define the corresponding coordinates in a tableau
+% - \l__atableau_xl_fp : x-coordinates
+% - \l__atableau_yl_fp : y-coordinate
+% - \l__atableau_name_tl : the node name
+% Used by the tableau and diagram commands. Note that row and col both start
+% from 0, so the (1,1)-box has row=col=0.
+\cs_new_protected:Npn \__atableau_set_box_coordinates_normal:nnn #1 #2 #3
+{
+ \tl_set:Nx \l__atableau_name_tl {\l__atableau_prefix_tl-\int_eval:n{1+#2}-\int_eval:n {1+#3}}
+ \fp_set:cn {l__atableau_x#1_fp} {\l__atableau_x_fp+((#2+0.5)*\l__atableau_tab_row_dx_fp+(#3+0.5)*\l__atableau_tab_col_dx_fp)*\l__atableau_box_wd_fp }
+ \fp_set:cn {l__atableau_y#1_fp} {\l__atableau_y_fp+((#2+0.5)*\l__atableau_tab_row_dy_fp+(#3+0.5)*\l__atableau_tab_col_dy_fp)*\l__atableau_box_ht_fp }
+ \__atableau_update_extrema:n #1
+}
+
+% usage: \__atableau_set_box_coordinates_conjugate:nnn <letter> <row> <col>: given the row and columns
+% indices, row and col, define the corresponding coordinates in the conjugate tableau
+% - \l__atableau_xl_fp : x-coordinates
+% - \l__atableau_yl_fp : y-coordinate
+% - \l__atableau_name_tl : the node name
+% Used by the tableau and diagram commands
+\cs_new_protected:Npn \__atableau_set_box_coordinates_conjugate:nnn #1 #2 #3
+{
+ \tl_set:Nx \l__atableau_name_tl {\l__atableau_prefix_tl-\int_eval:n{1+#3}-\int_eval:n {1+#2}}
+ \fp_set:cn {l__atableau_x#1_fp} {\l__atableau_x_fp+((#3+0.5)*\l__atableau_tab_row_dx_fp+(#2+0.5)*\l__atableau_tab_col_dx_fp)*\l__atableau_box_wd_fp }
+ \fp_set:cn {l__atableau_y#1_fp} {\l__atableau_y_fp+((#3+0.5)*\l__atableau_tab_row_dy_fp+(#2+0.5)*\l__atableau_tab_col_dy_fp)*\l__atableau_box_ht_fp }
+ \__atableau_update_extrema:n #1
+}
+
+% by default , normal coordinates are used
+\cs_set_eq:NN \__atableau_set_box_coordinates:nnn \__atableau_set_box_coordinates_normal:nnn
+
+
+% usage: \__atableau_set_bead_coordinates:nnn <letter> <row> <col>: given the row and columns
+% indices, row and col, define the corresponding coordinates in a tableau or abacus:
+% - \l__atableau_xl_fp : x-coordinates
+% - \l__atableau_yl_fp : y-coordinate
+% - \l__atableau_name_tl : the node name
+% Used by both the tableaux and abacus commands
+\cs_new_protected:Npn \__atableau_set_bead_coordinates:nnn #1 #2 #3
+{
+ \tl_set:Nx \l__atableau_name_tl {\l__atableau_prefix_tl-\fp_to_int:n{#2-1}-\fp_to_int:n{#3}}
+ \fp_set:cn {l__atableau_x#1_fp} {\l__atableau_x_fp+(#2*\l__atableau_ab_row_dx_fp+#3*\l__atableau_ab_col_dx_fp)*\l__atableau_abacus_wd_fp }
+ \fp_set:cn {l__atableau_y#1_fp} {\l__atableau_y_fp+(#2*\l__atableau_ab_row_dy_fp+#3*\l__atableau_ab_col_dy_fp)*\l__atableau_abacus_ht_fp }
+}
+
+% ---------------------------------------------------------------------------
+% tableaux boxes/nodes
+
+\cs_new_protected:Npn \__atableau_valign_bottom:n #1 { \vbox_to_zero:n { #1 \vss } }
+\cs_new_protected:Npn \__atableau_valign_centre:n #1 { \vbox_to_zero:n { \vss #1 \vss } }
+\cs_new_protected:Npn \__atableau_valign_top:n #1 { \vbox_to_zero:n { \vss #1 } }
+\cs_set_eq:NN \__atableau_valign_center:n \__atableau_valign_centre:n
+
+% We use \vbox_to_zero:n and \hbox_overlap_center:n to ensure that an entry
+% does not change the height or width of the node when it is too large.
+\cs_new_protected:Npn \__atableau_entry_math:n #1
+{
+ \__atableau_valign:n
+ {
+ \__atableau_halign:n
+ {
+ \tl_if_blank:VF \tikz@textcolor {\color{\tikz@textcolor}}
+ \tikz@textfont $~#1 $
+ }
+ }
+}
+
+% and a text version
+\cs_new_protected:Npn \__atableau_entry_text:n #1
+{
+ \__atableau_valign:n
+ {
+ \__atableau_halign:n
+ {
+ \tl_if_blank:VF \tikz@textcolor {\color{\tikz@textcolor}}
+ \tikz@textfont #1
+ }
+ }
+}
+
+% By default tableau nodes are typeset in math-mode.
+\cs_set_eq:NN \__atableau_entry:n \__atableau_entry_math:n
+
+% usage: \__atableau_draw_entry:nn [style] {entry}
+% Used by draw_tableau to draw the node entry #2 in the tableau using the style #1
+\cs_new_protected:Npn \__atableau_draw_entry:nn [#1] #2
+{
+ % exit when we reach the end of the row
+ \quark_if_recursion_tail_stop_do:nn {#2}
+ {
+ % record the column index in the shape for drawing the border
+ \seq_put_right:NV \l__atableau_shape_seq \l__atableau_col_int
+ }
+
+ % compute the node name and its (x,y)-coordinates
+ \__atableau_set_box_coordinates:nVV {l} \l__atableau_row_int \l__atableau_col_int
+
+ \tl_if_empty:nTF {#1}
+ { % draw box if it has the default styling
+ \node[aTableau/boxStyle] (\l__atableau_name_tl)
+ at (\fp_use:N\l__atableau_xl_fp, \fp_use:N\l__atableau_yl_fp)
+ {\__atableau_entry:n{#2}};
+ }
+ { % save the node to \l__atableau_styled_nodes_tl if it is styled
+ \tl_put_right:Nx \l__atableau_styled_nodes_tl
+ {
+ \exp_not:N \node [aTableau/boxStyle,#1] (\l__atableau_name_tl)
+ at (\fp_use:N\l__atableau_xl_fp, \fp_use:N\l__atableau_yl_fp)
+ {\exp_not:N\__atableau_entry:n{#2}};
+ }
+ }
+
+ % look for the next entry, or finish
+ \int_incr:N \l__atableau_col_int
+ \__atableau_peek_tableau:w
+}
+
+% ---------------------------------------------------------------------------
+% diagrams
+
+% usage: \__atableau_draw_diagram:n {partition}
+\cs_new_protected:Npn \__atableau_draw_diagram:n #1
+{
+ % convert #1 to the partition \l__atableau_shape_seq
+ \__atableau_set_partition:nn {shape} {#1}
+
+ % set the skew shape for shifted tableaux
+ \bool_if:NT \l__atableau_shifted_bool
+ {
+ \seq_clear:N \l__atableau_skew_seq
+ \seq_map_inline:Nn \l__atableau_shape_seq
+ {
+ \seq_put_right:No \l__atableau_skew_seq {\int_use:N \l__atableau_row_int}
+ \int_incr:N \l__atableau_row_int
+ }
+ \int_zero:N \l__atableau_row_int
+ }
+
+ % depending on \l__atableau_show_tl, generate the tableau entries
+ \str_case:VnF \l__atableau_show_tl
+ {
+ {contents} { \__atableau_shape_to_content:N \l__atableau_shape_seq }
+ {last} { \__atableau_shape_to_last:N \l__atableau_shape_seq }
+ {hooks} { \__atableau_shape_to_hook:N \l__atableau_shape_seq }
+ {first} { \__atableau_shape_to_first:N \l__atableau_shape_seq }
+ {residues} { \__atableau_shape_to_residue:N \l__atableau_shape_seq }
+ {} { \__atableau_diagram_for_shape:N \l__atableau_shape_seq }
+ }
+ {
+ \msg_error:nnx {aTableau} {unrecognised-entries} {\l__atableau_show_tl}
+ }
+ \__atableau_draw_tableau:V \l__atableau_entries_tl
+}
+
+
+% ---------------------------------------------------------------------------
+% multitableau and their diagrams
+
+% usage: \__atableau_draw_multishape:n diagram|tableau
+% Draw a multitableau or multidiagram. Most of the work is in calculating the
+% x-coordinates of the origins and each diagram, their separators and the
+% maximal y-coordinates, for drawing the delimiters. We also need to set
+% various keys for the components, so that they work correctly.
+\cs_new_protected:Npn \__atableau_draw_multishape:n #1
+{
+ % save the prefix name so that we can modify it
+ \tl_set_eq:NN \l__atableau_multiprefix_tl \l__atableau_prefix_tl
+
+ % check for conjugation
+ \bool_if:NT \l__atableau_conjugate_bool { \seq_reverse:N \l__atableau_component_seq }
+
+ % reset the variables that we need
+ \int_zero:N \l__atableau_component_int % component index
+
+ % We will increment x_fp to give the origins of the component diagrams.
+ % For now we record the position of the x-coordinates of the left brace,
+ % which will be placed after the diagrams have been drawn we first have to
+ % determine their height.
+ \seq_clear:N \l__atableau_xsep_seq
+ \seq_put_right:Nx \l__atableau_xsep_seq {\fp_to_decimal:N\l__atableau_x_fp}
+
+ % keep track of min/max y-coordinates used and max x-coordinate
+ \fp_set_eq:NN \l__atableau_xmax_fp \l__atableau_x_fp
+ \fp_set:Nn \l__atableau_ymax_fp {\l__atableau_y_fp + \l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp/2} % middle of box
+ \fp_set_eq:NN \l__atableau_ymin_fp \l__atableau_ymax_fp
+
+ \seq_map_inline:Nn \l__atableau_component_seq
+ {
+ % increment component and set prefix, charge, skew, ribbons and snobs
+ \int_incr:N \l__atableau_component_int
+
+ % update ymin, ymax and xmax (re-enable each time as this is disabled when placing ribbons)
+ \fp_compare:nNnTF {\l__atableau_rows_fp} = {0}
+ { \cs_set_eq:NN \__atableau_update_extrema:n \__atableau_update_multi_extrema:n } % update xmax, ymin, ymax
+ { \cs_set_eq:NN \__atableau_update_extrema:n \__atableau_update_multi_xtrema:n } % update only xmax
+
+ % change the node prefix to include the component index
+ \tl_set:No \l__atableau_prefix_tl {\l__atableau_multiprefix_tl-\int_use:N\l__atableau_component_int}
+
+ % charge defaults to zero if not set
+ \int_set:Nn \l__atableau_charge_int {0\seq_item:NV \l__atableau_charge_seq \l__atableau_component_int}
+
+ % set the multi-component keys from the corresponding multi sequence
+ \clist_map_inline:nn {dotted_rows, dotted_cols, paths, ribbons, snobs}
+ {
+ % if multi####1 is empty then clear the ####1 sequence, otherwise set it equal to component value
+ \seq_if_empty:cTF {l__atableau_multi####1_seq}
+ { \seq_clear:c {l__atableau_####1_seq} }
+ {
+ \tl_set:Nx \l_tmpb_tl {\seq_item:cV {l__atableau_multi####1_seq} \l__atableau_component_int}
+ \seq_set_from_clist:co {l__atableau_####1_seq} {\l_tmpb_tl}
+ }
+ }
+
+ % labels are handled separately because they are not sequences
+ \seq_if_empty:NTF \l__atableau_multilabel_seq
+ { \seq_clear:N \l__atableau_label_seq }
+ {
+ \tl_set:Nx \l_tmpb_tl {\seq_item:NV \l__atableau_multilabel_seq \l__atableau_component_int}
+ \tl_set:No \l__atableau_label_tl {\l_tmpb_tl}
+ }
+
+ % skew is handled separately because it uses set_partition
+ \seq_if_empty:NTF \l__atableau_multiskew_seq
+ { \seq_clear:N \l__atableau_skew_seq }
+ {
+ \tl_set:Nx \l_tmpb_tl {\seq_item:NV \l__atableau_multiskew_seq \l__atableau_component_int}
+ \__atableau_set_partition:no {skew} {\l_tmpb_tl}
+ }
+
+ % determine the coordinates for the diagram/tableau
+ % - \l__atableau_c_int: number of columns in first row
+ % - \l__atableau_r_int: number of rows in components
+ \bool_if:nTF { \str_if_empty_p:n {##1} || \str_if_eq_p:nn {##1} {...} }
+ {
+ \int_set:Nn \l__atableau_c_int {1}
+ \int_set:Nn \l__atableau_r_int {1}
+ }
+ {
+ % the component is nonempty
+ \tl_if_eq:nnTF {#1} {diagram}
+ {
+ \__atableau_set_partition:nn {shape} {##1}
+ \int_set:No \l__atableau_c_int {\seq_item:Nn \l__atableau_shape_seq {1}+0\seq_item:Nn \l__atableau_skew_seq {1}}
+
+ % set r_int equal to the number of nonzero rows in shape_seq
+ \int_set:No \l__atableau_r_int { \seq_count:N \l__atableau_shape_seq }
+ }
+ { % coordinates for tableaux
+ \seq_set_from_clist:Nn \l_tmpa_seq {##1}
+ \int_set:No \l__atableau_c_int {0\seq_item:Nn \l__atableau_skew_seq {1}} % initialise to skew length
+ \tl_set:Nx \l_tmpc_tl {\seq_item:Nn \l_tmpa_seq {1}} % first row of tableau
+ \__atableau_count_row:x \l_tmpc_tl % length of first row + skew
+
+ % set r_int equal to the number of nonzero rows in shape_seq
+ \int_set:No \l__atableau_r_int { \seq_count:N \l_tmpa_seq }
+ }
+ }
+
+ % now that we have the coordinates we need, we compute the
+ % x-coordinates of the diagram origin and the separators
+
+ % need to switch for conjugate partitions
+ \bool_if:NTF \l__atableau_conjugate_bool
+ { % conjugating
+ % the origin is c * col_dx units from the separator + xoffset
+ \fp_add:Nn \l__atableau_x_fp
+ {
+ abs(\l__atableau_c_int*\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp) % number of columns
+ + 0\seq_item:NV \l__atableau_xoffsets_seq \l__atableau_component_int % x-offset
+ }
+ % the next separator is is r * row_dx units from the origin
+ \fp_set:Nn \l__atableau_xsep_fp {
+ abs(\l__atableau_r_int*\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp)
+ + \l__atableau_separation_fp
+ }
+
+ % compute maximum height of the diagram
+ \fp_set:Nn \l__atableau_yb_fp
+ {
+ \l__atableau_c_int*\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp
+ + \l__atableau_r_int*abs(\l__atableau_tab_col_dy_fp)*\l__atableau_box_ht_fp
+ + 0\seq_item:NV \l__atableau_yoffsets_seq \l__atableau_component_int
+ }
+ }
+ { % not conjugating
+ % the origin is r * row_dx units from the separator + xoffset
+ \fp_add:Nn \l__atableau_x_fp
+ {
+ abs(\l__atableau_r_int*\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp) % number of columns
+ + 0\seq_item:NV \l__atableau_xoffsets_seq \l__atableau_component_int % x-offset
+ }
+ % the next separator is is c * col_dx units from the origin
+ \fp_set:Nn \l__atableau_xsep_fp
+ {
+ abs(\l__atableau_c_int*\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp) % number of columns
+ + \l__atableau_separation_fp
+ }
+ % compute maximum height of the diagram
+ \fp_set:Nn \l__atableau_yb_fp
+ {
+ \l__atableau_r_int*\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp
+ + \l__atableau_c_int*\l__atableau_tab_col_dy_fp*\l__atableau_box_ht_fp
+ + 0\seq_item:NV \l__atableau_yoffsets_seq \l__atableau_component_int
+ }
+ }
+
+ % Having determined the positions of the diagram origins and separators, we are ready to draw the diagram
+ % First set the y-coordinate for the origin of the current component
+ \fp_add:Nn \l__atableau_y_fp {0\seq_item:NV \l__atableau_yoffsets_seq \l__atableau_component_int}
+
+ % special processing for empty diagrams and ...
+ \str_case:nnF {##1}
+ {
+ {}
+ {
+ % an empty diagram -> \l__atableau_empty_tl
+ \__atableau_set_box_coordinates:nnn {a} {0} {0}
+ \node[aTableau/separatorSymbol] at (\fp_use:N \l__atableau_xa_fp, \fp_use:N \l__atableau_ya_fp){\l__atableau_empty_tl};
+ }
+ {...}
+ {
+ % insert dots. ?? Replace \cdots with \l__atableau_dots_tl ??
+ \__atableau_set_box_coordinates:nnn {a} {0} {0}
+ \node[aTableau/separatorSymbol] at (\fp_use:N \l__atableau_xa_fp, \fp_use:N \l__atableau_ya_fp){$\cdots$};
+ }
+ }
+ {
+ % draw the diagram/tableau
+ \use:c {__atableau_draw_#1:n} {##1}
+ }
+
+ % increment the origin by the separation distance and record the
+ % x-coordinate of the separator
+ \fp_set:Nn \l__atableau_x_fp { \l__atableau_xmax_fp+\l__atableau_box_wd_fp/2+\l__atableau_separation_fp }
+ \seq_put_right:Nx \l__atableau_xsep_seq {\fp_to_decimal:N\l__atableau_x_fp}
+
+ % add the separation distance to x_fp for the next component
+ \fp_add:NV \l__atableau_x_fp \l__atableau_separation_fp % separation
+
+ } % end of seq_map_inline to draw component diagrams/tableau
+
+ % All of the component diagrams/tableaux have been drawn
+ % It remains to add the separators. First we adjust ymin and ymax
+ \bool_if:NT \l__atableau_separators_bool
+ {
+
+ % when rows_fp is nonzero it sets the maximum y-coordinate, otherwise we
+ % need to adjust ymin and ymax by half the box height
+ \fp_compare:nNnTF {\l__atableau_rows_fp} > {0}
+ {
+ \fp_compare:nNnTF {\l__atableau_tab_row_dy_fp} > {0}
+ {
+ \fp_add:Nn \l__atableau_ymax_fp { (\l__atableau_rows_fp-0.5)*\l__atableau_box_ht_fp }
+ \fp_add:Nn \l__atableau_ymin_fp { -0.5*\l__atableau_box_ht_fp }
+ }
+ {
+ \fp_add:Nn \l__atableau_ymin_fp { (0.5-\l__atableau_rows_fp)*\l__atableau_box_ht_fp }
+ \fp_add:Nn \l__atableau_ymax_fp { 0.5*\l__atableau_box_ht_fp }
+ }
+ }
+ {
+ % adjust ymin and ymax count as they count from the centre of the box
+ \fp_add:Nn \l__atableau_ymax_fp { \l__atableau_box_ht_fp/2}
+ \fp_add:Nn \l__atableau_ymin_fp {-\l__atableau_box_ht_fp/2}
+ }
+
+ \fp_set:Nn \l__atableau_y_fp {(\l__atableau_ymin_fp+\l__atableau_ymax_fp)/2} % midway between ymin and ymax
+ \fp_set:Nn \l__atableau_ymax_fp { \l__atableau_ymax_fp-\l__atableau_ymin_fp } % maximum height
+
+ % add left delimiter: need to use \path to set the colour
+ \seq_pop_left:NN \l__atableau_xsep_seq \l_tmpa_tl
+ \tl_if_blank:VF \l__atableau_left_delimiter_tl
+ {
+ \path[aTableau/delimiterPath] (\fp_eval:n{\l_tmpa_tl-\l__atableau_separation_fp/2}, \fp_use:N \l__atableau_y_fp)
+ node[aTableau/leftDelimiter] {};
+ }
+
+ % add right delimiter
+ \seq_pop_right:NN \l__atableau_xsep_seq \l_tmpa_tl
+ \tl_if_blank:VF \l__atableau_right_delimiter_tl
+ {
+ \path[aTableau/delimiterPath] (\fp_eval:n{\l_tmpa_tl-\l__atableau_separation_fp/2}, \fp_use:N \l__atableau_y_fp)
+ node[aTableau/rightDelimiter] {};
+ }
+
+ % the internal separators
+ \tl_set:Ne \l_tmpa_tl {\fp_to_decimal:N \l__atableau_ymin_fp } % ymin
+ \tl_set:Ne \l_tmpb_tl {\fp_to_decimal:n {\l__atableau_y_fp + \l__atableau_ymax_fp/2}} % ymax
+ \seq_map_inline:Nn \l__atableau_xsep_seq
+ {
+ % add the separator
+ \str_case:VnF \l__atableau_separator_tl
+ {
+ {|} { \draw[aTableau/separatorLine](##1,\l_tmpa_tl)--(##1,\l_tmpb_tl); }
+ }
+ { % any other separator is assumed to be text
+ \node[aTableau/separatorSymbol] at (##1,\fp_use:N \l__atableau_y_fp){\l__atableau_separator_tl};
+ }
+ }
+ }
+}
+
+
+% usage: \__atableau_multidiagram:n {entries}
+% The entries are first primarily because the \Diagram commands needs
+% to force the entries to expand
+\cs_new_protected:Npn \__atableau_multidiagram:n #1
+{
+ % separate the component partitions
+ \seq_set_split:Nnn \l__atableau_component_seq {|} {#1}
+
+ % when entries=last, we need to set the charge
+ \tl_if_eq:NnT \l__atableau_show_tl {last}
+ {
+ \seq_clear:N \l__atableau_charge_seq
+ \int_zero:N \l__atableau_c_int % cumulative total of component sizes
+ \seq_set_eq:NN \l_tmpc_seq \l__atableau_component_seq
+ \seq_reverse:N \l_tmpc_seq
+ \seq_map_inline:Nn \l_tmpc_seq
+ {
+ \seq_put_left:No \l__atableau_charge_seq {\int_use:N \l__atableau_c_int}
+ \__atableau_set_partition:nn {shape} {##1}
+ \seq_map_inline:Nn \l__atableau_shape_seq { \int_add:Nn \l__atableau_c_int {####1} }
+ }
+ }
+
+ % determine the coordinates of the components of the diagram
+ \__atableau_draw_multishape:n {diagram}
+}
+
+% usage: \__atableau_multitableau:n {entries}
+% The entries are first primarily because the \Diagram commands need
+% to force the entries to expand
+\cs_new_protected:Npn \__atableau_multitableau:n #1
+{
+ % separate the entries of the component tableaux
+ \seq_set_split:Nnn \l__atableau_component_seq {|} {#1}
+
+ % determine the coordinates of the components of the tableau
+ \__atableau_draw_multishape:n {tableau}
+}
+
+% ---------------------------------------------------------------------------
+% Ribbon tableaux
+
+% usage: \__atableau_ribbon_tableau:n {ribbons}
+% Draw a ribbon tableau. The ribbons are specified by
+% (ribbon style) ij sequences of r's and c's with optional style and
+% with text as a subscript. Here i and j are the row and column
+% indices of the head of the ribbon
+\cs_new_protected:Npn \__atableau_ribbon_tableau:n #1
+{
+ % set the star style
+ \tl_set:Nn \l__atableau_starstyle_tl {aTableau/tableauStarStyle}
+
+ % record the shape as we draw the border
+ \seq_clear:N \l__atableau_shape_seq
+ \cs_set_eq:NN \__atableau_update_shape: \__atableau_update_ribbon_tableau_shape:
+
+ % draw the ribbon tableau by drawing each of the ribbons
+ \tl_set:Nn \l__atableau_ribbon_type_tl {ribbon} % change ribbon type to ribbon
+ \clist_map_inline:nn {#1} { \__atableau_add_ribbon:n {##1} }
+
+ % draw the tableau border, adding associated bells and whistles
+ \__atableau_finalise_tableau:
+}
+
+% usage: \__atableau_add_ribbon:n {ribbon} add a ribbon to the tableau
+% The code for adding ribbons is slightly different dependning onf on whether
+% \l__atableau_ribbbon_ty[e is equal to 'ribbon' or 'path'
+\cs_new_protected:Npn \__atableau_add_ribbon:n #1
+{
+ % reset the sequences that store the ribbon specifications data
+ \seq_clear:N \l__atableau_texts_seq % will contain node text
+ \seq_clear:N \l__atableau_styles_seq % will contain node styles
+ \seq_clear:N \l__atableau_rcs_seq % will contain node (row,col)-indices
+ \__atableau_peek_ribbon_style:w #1 \q_recursion_tail \q_recursion_stop
+}
+
+% usage: \__atableau_peek_ribbon_style:w {ribbon specifications}
+% look for (ribbon) style inside parentheses: (style)
+\cs_new_protected:Npn \__atableau_peek_ribbon_style:w
+{
+ \peek_remove_spaces:n { % ignore spaces
+ \peek_charcode:NTF (
+ { \__atableau_save_ribbon_style:n }
+ { \__atableau_save_ribbon_style:n ()}
+ }
+}
+
+% usage: \__atableau_save_ribbon_style:n {style}
+% read the style (style) and save in \l__atableau_ribbon_style_tl
+% and then peek for [style]rc...
+\cs_new_protected:Npn \__atableau_save_ribbon_style:n (#1)
+{
+ \tl_set:Nn \l__atableau_ribbon_style_tl {#1}
+ \__atableau_peek_style:nw {save_ribbon_head:nnn}
+}
+
+
+% usage: \__atableau_initialise_path_head:
+% Start \l__atableau_ribbon_path_tl for a path
+\cs_new_protected:Nn \__atableau_initialise_path_head:
+{ % adding a ribbon path
+ \tl_set:Nx \l__atableau_ribbon_path_tl
+ {
+ (\fp_use:N\l__atableau_xl_fp,\fp_use:N\l__atableau_yl_fp)
+ node[aTableau/pathBox,\l__atableau_ribbon_style_tl]{\__atableau_entry:n{\l__atableau_path_box_tl}}
+ }
+}
+
+% usage: \__atableau_initialise_ribbon_head:
+% Start \l__atableau_ribbon_path_tl for a ribbon
+\cs_new_protected:Nn \__atableau_initialise_ribbon_head:
+{
+ % 1. Make (xl,yl) the top corner of the ribbon and add it
+ \fp_add:Nn \l__atableau_xl_fp { 0.5*(\l__atableau_tab_col_dx_fp-\l__atableau_tab_row_dx_fp)*\l__atableau_box_wd_fp }
+ \fp_add:Nn \l__atableau_yl_fp { 0.5*(\l__atableau_tab_col_dy_fp-\l__atableau_tab_row_dy_fp)*\l__atableau_box_ht_fp }
+ \tl_set:Nx \l__atableau_ribbon_path_tl { (\fp_use:N\l__atableau_xl_fp,\fp_use:N\l__atableau_yl_fp) }
+
+ % 2. Make (xa,ya) the top left of the ribbon and add it on the left (decreasing column)
+ \fp_set:Nn \l__atableau_xa_fp {\l__atableau_xl_fp-\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp}
+ \fp_set:Nn \l__atableau_ya_fp {\l__atableau_yl_fp-\l__atableau_tab_col_dy_fp*\l__atableau_box_ht_fp}
+ \tl_put_left:Nx \l__atableau_ribbon_path_tl { (\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)-- }
+
+ % 3. Make (xb,yb) the bottom right corner and add it on the right (increasing row)
+ \fp_set:Nn \l__atableau_xb_fp {\l__atableau_xl_fp+\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp}
+ \fp_set:Nn \l__atableau_yb_fp {\l__atableau_yl_fp+\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp}
+ \tl_put_right:Nx \l__atableau_ribbon_path_tl { --(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp) }
+}
+
+% usage: \__atableau_save_ribbon_head:nnnn {path/ribbon} [style] {row index} {col index}
+% save the style, row and column indices for the head of the ribbon
+% and then compute the coordinates of the three "external nodes" in the
+% head.
+\cs_new_protected:Npn \__atableau_save_ribbon_head:nnn [#1] #2 #3
+{
+ % check for syntax errors to prevent an endless loop
+ \quark_if_recursion_tail_stop_do:nn {#2} { \msg_error:nnn {aTableau} {invalid-ribbon-head} {no~x-coordinate~given} }
+ \quark_if_recursion_tail_stop_do:nn {#3} { \msg_error:nnn {aTableau} {invalid-ribbon-head} {no~y-coordinate~given} }
+
+ % save any style
+ \seq_put_right:Nx \l__atableau_styles_seq {#1}
+
+ % record the row and column indices of the head
+ \int_set:No \l__atableau_row_int { \int_eval:n {#2-1} }
+ \int_set:No \l__atableau_col_int { \int_eval:n {#3-1} }
+ \seq_put_right:NV \l__atableau_rcs_seq \l__atableau_row_int
+ \seq_put_right:NV \l__atableau_rcs_seq \l__atableau_col_int
+
+ % update the shape to include the head node (#3,#4)
+ \__atableau_update_shape:
+
+ % add initial coordinates to \l__atableau_ribbon_path_tl
+ \__atableau_set_box_coordinates:nVV {l} \l__atableau_row_int \l__atableau_col_int
+
+ % initialise the start of the path/ribbon
+ \use:c {__atableau_initialise_ \l__atableau_ribbon_type_tl _head:}
+
+ %\message{row=\int_use:N\l__atableau_row_int,~col=\int_use:N\l__atableau_col_int}
+ \__atableau_peek_ribbon_text:w
+}
+
+% usage: \__atableau_peek_ribbon_text:nw {path/ribbon}
+% peek for subscripted text _{text} in the ribbon
+\cs_new_protected:Npn \__atableau_peek_ribbon_text:w
+{
+ \peek_remove_spaces:n { % ignore spaces
+ \peek_charcode_remove:NTF _
+ { \__atableau_save_ribbon_text:n }
+ {
+ \seq_put_right:Nn \l__atableau_texts_seq {} % empty text
+ \__atableau_peek_style:nw {save_ribbon:nn}
+ }
+ }
+}
+
+% usage: \__atableau_save_ribbon_text:n {text}
+% save any text for a rode in the ribbon in \l__atableau_texts_seq
+\cs_new_protected:Npn \__atableau_save_ribbon_text:n #1
+{
+ \seq_put_right:No \l__atableau_texts_seq {#1}
+ \__atableau_peek_style:nw {save_ribbon:nn}
+}
+
+% usage: \__atableau_add_to_ribbon:n
+% Extend a ribbon path. Here #1 is either r or c
+\cs_new_protected:Npn \__atableau_extend_ribbon:n #1
+{
+ \str_case:enF {#1}
+ {
+ {c} { % move back one column
+ \int_decr:N \l__atableau_col_int
+
+ % Move (xa,ya) back one column add it to the ribbon on the left
+ \fp_sub:Nn \l__atableau_xa_fp {\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp}
+ \fp_sub:Nn \l__atableau_ya_fp {\l__atableau_tab_col_dy_fp*\l__atableau_box_ht_fp}
+ \tl_put_left:Nx \l__atableau_ribbon_path_tl { (\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)-- }
+
+ % Move (xb,xb) back one column add it to the ribbon on the right
+ \fp_sub:Nn \l__atableau_xb_fp {\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp}
+ \fp_sub:Nn \l__atableau_yb_fp {\l__atableau_tab_col_dy_fp*\l__atableau_box_ht_fp}
+ \tl_put_right:Nx \l__atableau_ribbon_path_tl { --(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp) }
+ }
+ {r} { % move forward one row
+ \int_incr:N \l__atableau_row_int
+
+ % Move (xa,ya) forward one row add it to the ribbon on the left
+ \fp_add:Nn \l__atableau_xa_fp {\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp}
+ \fp_add:Nn \l__atableau_ya_fp {\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp}
+ \tl_put_left:Nx \l__atableau_ribbon_path_tl { (\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)-- }
+
+ % Move (xb,xb) forward one row add it to the ribbon on the right
+ \fp_add:Nn \l__atableau_xb_fp {\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp}
+ \fp_add:Nn \l__atableau_yb_fp {\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp}
+ \tl_put_right:Nx \l__atableau_ribbon_path_tl { --(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp) }
+ }
+ }
+ {
+ \msg_error:nnx {aTableau} {invalid-ribbon-specification} {#1}
+ }
+
+}
+
+% usage: \__atableau_add_to_path:n
+% Extend a ribbon path. Here #1 is either r or c
+\cs_new_protected:Npn \__atableau_extend_path:n #1
+{
+
+ % the ribbon hasn't finished, so move row and col according to the ribbon
+ % specification and update the nodes (xa,ya) and (xb,yb) in the ribbon
+ \str_case:enF {#1}
+ {
+ {c} { % move back one column
+ \int_decr:N \l__atableau_col_int
+
+ \fp_sub:Nn \l__atableau_xl_fp {\l__atableau_tab_col_dx_fp*\l__atableau_box_wd_fp}
+ \fp_sub:Nn \l__atableau_yl_fp {\l__atableau_tab_col_dy_fp*\l__atableau_box_ht_fp}
+ \tl_put_right:Nx \l__atableau_ribbon_path_tl
+ {
+ --(\fp_use:N\l__atableau_xl_fp,\fp_use:N\l__atableau_yl_fp)
+ node[aTableau/pathBox,\l__atableau_ribbon_style_tl]{\__atableau_entry:n{\l__atableau_path_box_tl}}
+ }
+ }
+ {r} { % move forward one row
+ \int_incr:N \l__atableau_row_int
+
+ \fp_add:Nn \l__atableau_xl_fp {\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp}
+ \fp_add:Nn \l__atableau_yl_fp {\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp}
+ \tl_put_right:Nx \l__atableau_ribbon_path_tl
+ {
+ --(\fp_use:N\l__atableau_xl_fp,\fp_use:N\l__atableau_yl_fp)
+ node[aTableau/pathBox,\l__atableau_ribbon_style_tl]{\__atableau_entry:n{\l__atableau_path_box_tl}}
+ }
+ }
+ }
+ {
+ \msg_error:nnx {aTableau} {invalid-ribbon-specification} {#1}
+ }
+}
+
+% For each successive r and c in the ribbon specification, determine the
+% surrpouding coordinates in the ribbon and save any custom styles in
+% \l__atableau_styles_seq and then repeat
+\cs_new_protected:Npn \__atableau_save_ribbon:nn [#1] #2
+{
+ % draw the ribbon when we run out of nodes
+ \quark_if_recursion_tail_stop_do:nn {#2} { \__atableau_draw_ribbon: }
+
+ % Add the new coordinate(s) to \l__atableau_ribbon_path_tl. This is
+ % different for ribbons and paths
+ \use:c {__atableau_extend_ \l__atableau_ribbon_type_tl :n} {#2}
+
+ % update the shape to include the new node
+ \__atableau_update_shape:
+
+ % save the style and row and column indices
+ \seq_put_right:No \l__atableau_styles_seq {#1} % record the style of the head
+ \seq_put_right:NV \l__atableau_rcs_seq \l__atableau_row_int % record the row of the node
+ \seq_put_right:NV \l__atableau_rcs_seq \l__atableau_col_int % record the column of the node
+
+ % check to see if this node has any text
+ \__atableau_peek_ribbon_text:w
+}
+
+
+% update the shape of the ribbon tableau using the current values of
+% \l__atableau_row_int and \l__atableau_col_int
+\cs_new_protected:Nn \__atableau_update_ribbon_tableau_shape:
+{
+ % ensure that \l__atableau_shape_seq has at least a 0 in each row
+ \int_step_inline:nn { \l__atableau_row_int+1 - \seq_count:N \l__atableau_shape_seq }
+ {
+ \seq_put_right:Nn \l__atableau_shape_seq {0}
+ }
+ % for shifted tableaux we also need to ensure that skew is big enough
+ \bool_if:NT \l__atableau_shifted_bool
+ {
+ \int_set:Nn \l_tmpa_int {\seq_count:N \l__atableau_skew_seq}
+ \int_step_inline:nn { \l__atableau_row_int+1 - \l_tmpa_int }
+ {
+ \seq_put_right:Nx \l__atableau_skew_seq {\int_eval:n{\l_tmpa_int+##1-1 }}
+ }
+ }
+ \int_compare:nNnT {0\seq_item:Nn \l__atableau_shape_seq {\l__atableau_row_int+1}} < {\l__atableau_col_int+1}
+ {
+ \seq_set_item:Nox \l__atableau_shape_seq {\l__atableau_row_int+1} { \int_eval:n{\l__atableau_col_int+1} }
+ }
+}
+
+% usage: \__atableau_finalise_ribbon:n
+% Add the final node to the ribbon
+\cs_new_protected:Nn \__atableau_finalise_ribbon:
+{
+ % Add the last node to the ribbon
+ \fp_add:Nn \l__atableau_xa_fp {\l__atableau_tab_row_dx_fp*\l__atableau_box_wd_fp}
+ \fp_add:Nn \l__atableau_ya_fp {\l__atableau_tab_row_dy_fp*\l__atableau_box_ht_fp}
+ \tl_put_left:Nx \l__atableau_ribbon_path_tl { (\fp_use:N\l__atableau_xa_fp, \fp_use:N\l__atableau_ya_fp)-- }
+
+ % add a closing cycle
+ \tl_put_right:Nn \l__atableau_ribbon_path_tl {--cycle}
+}
+
+
+% usage: \__atableau_finalise_path:n
+% We do not need to do anything to finalise a path
+\cs_set_eq:NN \__atableau_finalise_path:n \prg_do_nothing:
+
+% by default, snobs have the same styles and coordinates as ribbons
+\cs_set_eq:NN \__atableau_extend_snob:n \__atableau_extend_ribbon:n
+\cs_set_eq:NN \__atableau_finalise_snob: \__atableau_finalise_ribbon:
+\cs_set_eq:NN \__atableau_initialise_snob_head: \__atableau_initialise_ribbon_head:
+
+% \__atableau_draw_ribbon: use the various sequences we have constructed
+% to draw the ribbon. We first place the nodes with default styling and
+% no text, then draw the ribbon with its supplied style and then,
+% finally, add the nodes with custom styling or text.
+\cs_new_protected:Nn \__atableau_draw_ribbon:
+{
+
+ \use:c { __atableau_finalise_ \l__atableau_ribbon_type_tl :}
+
+ % We want to first draw the ribbon, with its outline and any filling, and
+ % then place the node with the default styling (or unstyled), and styled
+ % nodes in the ribbon. To do this we build the two token lists
+ % \l__atableau_unstyled_nodes_tl and \l__atableau_styled_nodes_tl for these
+ % two types of nodes
+ \tl_clear:N \l__atableau_styled_nodes_tl
+ \tl_clear:N \l__atableau_unstyled_nodes_tl
+
+ % We need to add ribbon_node to every box in a ribbon, so we do the
+ % check here rather than in \seq_map_inline:Nn
+ \tl_if_eq:VnTF \l__atableau_ribbon_type_tl {path}
+ { \tl_clear:N \l_tmpc_tl }
+ { \tl_set_eq:Nc \l_tmpc_tl { l__atableau_ \l__atableau_ribbon_type_tl _box_tl } }
+
+ \seq_map_inline:Nn \l__atableau_styles_seq
+ {
+ % pop the text and row and column indices
+ \seq_pop_left:NN \l__atableau_texts_seq \l_tmpa_tl % text
+ \seq_pop_left:NN \l__atableau_rcs_seq \l_tmpb_tl % row index
+ \int_set:Nn \l__atableau_row_int {\l_tmpb_tl}
+ \seq_pop_left:NN \l__atableau_rcs_seq \l_tmpb_tl % column index
+ \int_set:Nn \l__atableau_col_int {\l_tmpb_tl}
+
+ % compute the box coordinates
+ \__atableau_set_box_coordinates:nVV {l} \l__atableau_row_int \l__atableau_col_int
+ \tl_if_empty:eTF {##1\l_tmpa_tl}
+ { % nodes with default style and no text are added to \l__atableau_unstyled_nodes_tl
+ \tl_put_right:Nx \l__atableau_unstyled_nodes_tl
+ {
+ \exp_not:N \node [aTableau/\l__atableau_ribbon_type_tl Box](\l__atableau_name_tl)
+ at (\fp_use:N\l__atableau_xl_fp,\fp_use:N\l__atableau_yl_fp)
+ { \exp_not:N \__atableau_entry:n{\l_tmpc_tl }};
+ }
+ }
+ { % nodes with styling are added to \l__atableau_styled_nodes_tl
+ \tl_put_right:Nx \l__atableau_styled_nodes_tl
+ {
+ \exp_not:N \node [aTableau/\l__atableau_ribbon_type_tl Box,##1](\l__atableau_name_tl)
+ at (\fp_use:N\l__atableau_xl_fp,\fp_use:N\l__atableau_yl_fp)
+ {\exp_not:N \__atableau_entry:n{\l_tmpa_tl}};
+ }
+ }
+ }
+ % draw the ribbon, applying any style
+ \exp_last_unbraced:Ne\draw { [aTableau/\l__atableau_ribbon_type_tl Style,\l__atableau_ribbon_style_tl] } \l__atableau_ribbon_path_tl;
+
+ % finally, add the unstyled and the styled nodes on top of the ribbon
+ \l__atableau_unstyled_nodes_tl
+ \l__atableau_styled_nodes_tl
+}
+
+
+% ---------------------------------------------------------------------------
+
+% abacuses
+% usage: \__atableau_draw_abacus_end:nnn {abacus_top/abacus_bottom} % {0/row index} {±1}
+% Draw the top/bottom on gthe abacus. Here #1 is either
+% \l__atableau_abacus_top_tl or \l__atableau_abacus_bottom_tl and #2 is
+% either 0, for top, or the row index of the last row, for bottom
+\cs_new_protected:Npn \__atableau_draw_abacus_end:nnn #1 #2 #3
+{
+ \str_case:Vn #1
+ {
+ {-}
+ { % draw a line
+ \__atableau_set_bead_coordinates:non {a} {#2} {0}
+ \__atableau_set_bead_coordinates:noo {b} {#2} { \int_eval:n {\l__atableau_cols_int-1} }
+ \draw[aTableau/abacusEnds]
+ (\fp_eval:n{\l__atableau_xa_fp-\l__atableau_ab_col_dx_fp*\l__atableau_abacus_wd_fp/2},
+ \fp_eval:n{\l__atableau_ya_fp-\l__atableau_ab_col_dy_fp*\l__atableau_abacus_ht_fp/2})
+ -- (\fp_eval:n{\l__atableau_xb_fp+\l__atableau_ab_col_dx_fp*\l__atableau_abacus_wd_fp/2},
+ \fp_eval:n{\l__atableau_yb_fp+\l__atableau_ab_col_dy_fp*\l__atableau_abacus_ht_fp/2});
+
+ % set default "row height" of the runner labels for use below
+ \fp_set:Nn \l_tmpa_fp {-0.4}
+ }
+ {_}
+ { % draw a line
+ \__atableau_set_bead_coordinates:non {a} {#2} {0}
+ \__atableau_set_bead_coordinates:noo {b} {#2} { \int_eval:n {\l__atableau_cols_int-1} }
+ \draw[aTableau/abacusEnds] (\fp_use:N\l__atableau_xa_fp, \fp_use:N\l__atableau_ya_fp)
+ -- (\fp_use:N\l__atableau_xb_fp, \fp_use:N\l__atableau_yb_fp);
+
+ % set default "row height" of the runner labels for use below
+ \fp_set:Nn \l_tmpa_fp {-0.4}
+ }
+ {.}
+ { % draw dots
+ \int_step_inline:nn {\l__atableau_cols_int}
+ {
+ \seq_if_in:NeF \l__atableau_dotted_cols_seq { \int_eval:n{##1-1} }
+ {
+ % draw the abacus runners from (xa,ya) to (xb,yb)
+ \__atableau_set_bead_coordinates:noo {a} { #2 } { \int_eval:n{##1-1} }
+ \__atableau_set_bead_coordinates:noo {b} { #3 } { \int_eval:n{##1-1} }
+ \draw[aTableau/abacusEnds, dotted] (\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+ }
+ }
+
+ % set default "row height" of the runner labels for use below
+ \fp_set:Nn \l_tmpa_fp {-1.4}
+ }
+ {>}
+ { % draw dots
+ \int_step_inline:nn {\l__atableau_cols_int}
+ {
+ \seq_if_in:NeF \l__atableau_dotted_cols_seq { \int_eval:n{##1-1} }
+ {
+ % draw the abacus runners from (xa,ya) to (xb,yb)
+ \int_compare:nNnTF {#2} = {0}
+ {
+ \__atableau_set_bead_coordinates:noo {a} { \fp_eval:n{#2+0.5} } { \fp_eval:n{##1-1} }
+ \__atableau_set_bead_coordinates:noo {b} { \fp_eval:n{#3+0.5} } { \fp_eval:n{##1-1} }
+ }
+ {
+ \__atableau_set_bead_coordinates:noo {a} { \fp_eval:n{#2-0.5} } { \fp_eval:n{##1-1} }
+ \__atableau_set_bead_coordinates:noo {b} { \fp_eval:n{#3-0.5} } { \fp_eval:n{##1-1} }
+ }
+ \draw[aTableau/abacusEnds,->] (\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+ }
+ }
+
+ % set default "row height" of the runner labels for use below
+ \fp_set:Nn \l_tmpa_fp {-0.8}
+ }
+
+ {*}
+ { % draw dots
+ \int_step_inline:nn {\l__atableau_cols_int}
+ {
+ \seq_if_in:NeF \l__atableau_dotted_cols_seq { \int_eval:n{##1-1} }
+ {
+ % draw the abacus runners from (xa,ya) to (xb,yb)
+ \int_compare:nNnTF {#2} = {0}
+ {
+ \__atableau_set_bead_coordinates:noo {a} { \fp_eval:n{#2} } { \fp_eval:n{##1-1} }
+ \__atableau_set_bead_coordinates:noo {b} { \fp_eval:n{#3-0.5} } { \fp_eval:n{##1-1} }
+ }
+ {
+ \__atableau_set_bead_coordinates:noo {a} { \fp_eval:n{#2} } { \fp_eval:n{##1-1} }
+ \__atableau_set_bead_coordinates:noo {b} { \fp_eval:n{#3+0.5} } { \fp_eval:n{##1-1} }
+ }
+ \draw[aTableau/abacusEnds,dotted,->] (\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+ }
+ }
+
+ % set default "row height" of the runner labels for use below
+ \fp_set:Nn \l_tmpa_fp {-1.8}
+ }
+
+ {|} {
+ % set default "row height" of the runner labels for use below
+ \fp_set:Nn \l_tmpa_fp {-0.4}
+ }
+ }
+}
+
+
+% usage: \__atableau_abacus:nn { #runners } { bead specifications }
+\cs_new_protected:Npn \__atableau_abacus:nn #1 #2
+{
+ % set the star style
+ \tl_set:Nn \l__atableau_starstyle_tl {aTableau/abacusStarStyle}
+
+ \int_set:Nn \l__atableau_cols_int {#1}
+
+
+ \seq_if_empty:NF \l__atableau_runner_labels_seq
+ {
+ \int_set:No \l_tmpa_int { \seq_count:N \l__atableau_runner_labels_seq }
+ \int_compare:nNnF {\l__atableau_cols_int-\l_tmpa_int } = {0}
+ {
+ \msg_error:nn {aTableau} {missing-runner-labels }
+ }
+ }
+
+ % Extract the bead positions and their styles into
+ % \l__atableau_shape_seq, \l__atableau_styles_seq and \l__atableau_text_tl
+ % We allow all of the following expressions
+ % m, m^r, [style]m, [style]m^2, *m, *m^2,
+ % m_text, m_text^r, [style]m_text, [style]m_text^2, *m_text, *m_text^2,
+ % m_text^r, [style]m_text^2, *m_text^2
+ % where m is a part of the partition \l__atableau_shape_seq and r is
+ % its' exponent. First, clear all of the sequences and zero the bead
+ % counter
+ \seq_clear:N \l__atableau_shape_seq % will record the partition
+ \seq_clear:N \l__atableau_styles_seq % will record the bead style
+ \seq_clear:N \l__atableau_texts_seq % will record the bead text
+ \int_zero:N \l__atableau_beads_int % will record the number of beads
+
+ % determine the partition/beta numbers
+ \clist_map_inline:nn {#2}
+ {
+ \__atableau_peek_style:nw {record_style:nn} ##1 \q_recursion_tail \q_recursion_stop
+ }
+
+ % unless they have been set, determine the number of abacus rows
+ \int_compare:nNnT {\l__atableau_rows_int} = {0}
+ {
+ \bool_if:NTF \l__atableau_beta_numbers_bool
+ { \int_set:Nn \l__atableau_rows_int { 1+\int_div_truncate:nn { 0\seq_item:Nn \l__atableau_shape_seq 1} {#1} } }
+ { \int_set:Nn \l__atableau_rows_int { 1+\int_div_truncate:nn {\l__atableau_beads_int-1 + 0\seq_item:Nn \l__atableau_shape_seq 1} {#1} } }
+ }
+
+ % draw the abacus runners
+ \int_zero:N \l__atableau_col_int
+ \int_step_inline:nn {\l__atableau_cols_int}
+ {
+ \int_set:Nn \l_tmpa_int {##1-1} % save recalculating this many times
+ % skip the runners in dotted_cols_seq
+ \seq_if_in:NVF \l__atableau_dotted_cols_seq \l_tmpa_int
+ {
+ % draw the abacus runners from (xa,ya) to (xb,yb)
+ \__atableau_set_bead_coordinates:nnV {a} { 0 } \l_tmpa_int
+ \__atableau_set_bead_coordinates:noV {b} { \int_eval:n{\l__atableau_rows_int+1} } \l_tmpa_int
+ \draw[aTableau/runnerStyle] (\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+
+ % draw ticks
+ \int_step_inline:nn {\l__atableau_rows_int}
+ {
+ \__atableau_set_bead_coordinates:noV {l} { ####1 } \l_tmpa_int
+ % add a named node
+ \node[aTableau/namedTick] (\l__atableau_name_tl) at (\fp_use:N\l__atableau_xl_fp,\fp_use:N\l__atableau_yl_fp){};
+ % add and subtract (half) tick width
+ \fp_set:Nn \l__atableau_xa_fp {\l__atableau_xl_fp+\l__atableau_tick_length_fp*\l__atableau_ab_col_dx_fp}
+ \fp_set:Nn \l__atableau_ya_fp {\l__atableau_yl_fp+\l__atableau_tick_length_fp*\l__atableau_ab_col_dy_fp}
+ \fp_set:Nn \l__atableau_xb_fp {\l__atableau_xl_fp-\l__atableau_tick_length_fp*\l__atableau_ab_col_dx_fp}
+ \fp_set:Nn \l__atableau_yb_fp {\l__atableau_yl_fp-\l__atableau_tick_length_fp*\l__atableau_ab_col_dy_fp}
+
+ \draw[aTableau/tickStyle,name=\l__atableau_name_tl] (\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+ }
+ }
+ }
+
+ % set e when entries=residues
+ \tl_if_eq:VnT \l__atableau_show_tl {residues}
+ {
+ % if it is not set already, then set e based on the number of runners and the Cartan type
+ \int_compare:nNnT {\l__atableau_e_int} = {0}
+ {
+ \str_case:Vn \l__atableau_cartan_tl
+ {
+ {A } { \int_set_eq:NN \l__atableau_e_int \l__atableau_cols_int }
+ {C } { \int_set:Nn \l__atableau_e_int {\l__atableau_cols_int/2} }
+ {AA} { \int_set:Nn \l__atableau_e_int {(\l__atableau_cols_int-1)/2} }
+ {DD} { \int_set:Nn \l__atableau_e_int {\l__atableau_cols_int/2-1} }
+ }
+ }
+ }
+
+ % draw the beads on the abacus
+ \int_step_inline:nn { \l__atableau_beads_int } % finally, add the beads, with labels and styles
+ {
+
+ % determine the row and column indices for the bead
+ \bool_if:NTF \l__atableau_beta_numbers_bool
+ {
+ \int_set:No \l_tmpa_int { \seq_item:Nn \l__atableau_shape_seq {##1} } % beta number
+ }
+ {
+ \int_set:No \l_tmpa_int { \l__atableau_beads_int - ##1 + \seq_item:Nn \l__atableau_shape_seq {##1} } % part -> beta number
+ }
+ \int_set:Nn \l__atableau_row_int { \int_div_truncate:nn {\l_tmpa_int} {\l__atableau_cols_int} }
+ \int_set:Nn \l__atableau_col_int { \int_mod:nn {\l_tmpa_int} {\l__atableau_cols_int} }
+
+ % determine the bead coordinates: push everything 0.5 of a
+ % unit down to allow space of the top of the abacus
+ \__atableau_set_bead_coordinates:noV {l} {\int_eval:n{\l__atableau_row_int+1} } \l__atableau_col_int
+
+ \seq_if_in:NVF \l__atableau_dotted_rows_seq \l__atableau_row_int
+ {
+ \seq_if_in:NVF \l__atableau_dotted_cols_seq \l__atableau_col_int
+ {
+ \str_case:VnF \l__atableau_show_tl
+ {
+ {betas} { \tl_set:No \l_tmpa_tl { \int_use:N\l_tmpa_int } }
+ {residues} {
+ \int_set:Nn \l_tmpb_int { \l__atableau_charge_int+\l_tmpa_int-\l__atableau_beads_int }
+ \tl_set:No \l_tmpa_tl { \__atableau_residue:nn {\l_tmpb_int} {\l__atableau_e_int} }
+ }
+ {rows } {
+ \int_set:Nn \l_tmpb_int { \l_tmpa_int-\l__atableau_beads_int+##1 }
+ \int_compare:nNnTF {\l_tmpb_int} > {0}
+ { \tl_set:No \l_tmpa_tl { ##1 } }
+ { \tl_set:No \l_tmpa_tl { {-} } }
+ }
+ {shape} { \tl_set:No \l_tmpa_tl { \seq_item:Nn \l__atableau_shape_seq {##1} } }
+ {} { \tl_set:No \l_tmpa_tl { \seq_item:Nn \l__atableau_texts_seq {##1} } }
+ }
+ {
+ \msg_error:nnx {aTableau} {unrecognised-abacus-label} { \l__atableau_show_tl }
+ }
+ % draw the bead with style
+ \tl_set:No \l_tmpb_tl { \seq_item:Nn \l__atableau_styles_seq {##1} }
+ \exp_last_unbraced:Nx \node{[aTableau/beadStyle, \l_tmpb_tl]}
+ at (\fp_use:N\l__atableau_xl_fp,\fp_use:N\l__atableau_yl_fp){\__atableau_entry:x {\l_tmpa_tl}};
+ }
+ }
+ }
+
+ % draw the top ends of the abacus -- and set \l_tmpa_fp for the runner labels
+ \__atableau_draw_abacus_end:nnn \l__atableau_abacus_top_tl {0} {-1}
+ \int_zero:N \l__atableau_c_int
+
+ % add the runner labels using the "row height" \l_tmpa_fp
+ \int_zero:N \l__atableau_c_int
+ \seq_map_inline:Nn \l__atableau_runner_labels_seq
+ {
+ \__atableau_set_bead_coordinates:nVV {a} \l_tmpa_fp \l__atableau_c_int
+ \seq_if_in:NVF \l__atableau_dotted_cols_seq \l__atableau_c_int
+ {
+ \node[aTableau/runnerLabelStyle] at (\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp){ \__atableau_entry:n{##1} };
+ }
+ \int_incr:N \l__atableau_c_int
+ }
+
+ % draw the bottom ends of the abacus
+ \__atableau_draw_abacus_end:noo \l__atableau_abacus_bottom_tl {\int_eval:n {\l__atableau_rows_int+1}} {\int_eval:n {\l__atableau_rows_int+2}}
+
+ % remove dotted rows and columns
+ \seq_if_empty:NF \l__atableau_dotted_rows_seq \__atableau_remove_dotted_abacus_rows:
+ \seq_if_empty:NF \l__atableau_dotted_cols_seq \__atableau_remove_dotted_abacus_cols:
+
+}
+
+% usage: \__atableau_remove_dotted_abacus_cols:
+% Add dots to the columns of the abacus in \l__atableau_dotted_cols_seq
+\cs_new_protected:Nn \__atableau_remove_dotted_abacus_cols:
+{
+ % shift in row-direction
+ \fp_set:Nn \l_tmpa_fp {\l__atableau_ab_row_dx_fp*\l__atableau_abacus_wd_fp}
+ \fp_set:Nn \l_tmpb_fp {\l__atableau_ab_row_dy_fp*\l__atableau_abacus_ht_fp}
+
+ % take a copy of \l__atableau_dotted_cols_seq so that the pop_left's below
+ % do not destroy it
+ \seq_set_eq:NN \l_tmpb_seq \l__atableau_dotted_cols_seq
+ \bool_do_until:nn { \seq_if_empty_p:N \l_tmpb_seq }
+ {
+ \seq_pop_left:NN \l_tmpb_seq \l_tmpa_tl
+ \int_set:Nn \l__atableau_col_int {\l_tmpa_tl}
+ \int_set:Nn \l__atableau_c_int {\l__atableau_col_int+1}
+
+ % LaTeX3 does not provide \seq_if_in_p:NN, so ...
+ \bool_set_true:N \l_tmpa_bool
+ \bool_do_while:nn { \l_tmpa_bool }
+ {
+ \int_set:Nn \l_tmpa_int {0\seq_item:Nn \l_tmpb_seq 1}
+ \int_compare:nNnTF {\l__atableau_c_int} = {\l_tmpa_int}
+ {
+ \seq_pop_left:NN \l_tmpb_seq \l_tmpa_tl
+ \int_incr:N \l__atableau_c_int
+ }
+ { \bool_set_false:N \l_tmpa_bool }
+ }
+
+ \__atableau_set_bead_coordinates:nnV {l} { 0 } \l__atableau_col_int
+
+ % set (xa,ya) and (xb,yb) to the "left" and "right" hand coordinates that we want remove
+ \fp_set:Nn \l__atableau_xa_fp {\l__atableau_xl_fp-0.35*\l__atableau_ab_col_dx_fp*\l__atableau_abacus_wd_fp}
+ \fp_set:Nn \l__atableau_ya_fp {\l__atableau_yl_fp-0.35*\l__atableau_ab_col_dy_fp*\l__atableau_abacus_ht_fp}
+ \fp_set:Nn \l__atableau_xb_fp {\l__atableau_xl_fp+(\l__atableau_c_int-\l__atableau_col_int-0.65)*\l__atableau_ab_col_dx_fp*\l__atableau_abacus_wd_fp}
+ \fp_set:Nn \l__atableau_yb_fp {\l__atableau_yl_fp+(\l__atableau_c_int-\l__atableau_col_int-0.65)*\l__atableau_ab_col_dy_fp*\l__atableau_abacus_ht_fp}
+
+ % blank out any line at the top of the abacus and replace it with dots
+ \tl_if_in:nVT {-_} \l__atableau_abacus_top_tl
+ {
+ \draw[aTableau/clearBoxes]
+ (\fp_eval:n{\l__atableau_xa_fp-0.1*\l_tmpa_fp}, \fp_eval:n{\l__atableau_ya_fp-0.1*\l_tmpb_fp})
+ --++(\fp_eval:n{0.2*\l_tmpa_fp},\fp_eval:n{0.2*\l_tmpb_fp})
+ --(\fp_eval:n{\l__atableau_xb_fp+0.1*\l_tmpa_fp}, \fp_eval:n{\l__atableau_yb_fp+0.1*\l_tmpb_fp})
+ --++(\fp_eval:n{-0.2*\l_tmpa_fp},\fp_eval:n{-0.2*\l_tmpb_fp})
+ --cycle
+ ;
+ % first blank out the possible header line and replace with dots
+ %\draw[fill=white,draw=none](\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+ \draw[aTableau/dottedLine](\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+ }
+
+ % now draw the dots
+ \int_zero:N \l__atableau_row_int
+ \int_step_inline:nn {\l__atableau_rows_int}
+ {
+ \fp_add:Nn \l__atableau_xa_fp {\l_tmpa_fp}
+ \fp_add:Nn \l__atableau_ya_fp {\l_tmpb_fp}
+ \fp_add:Nn \l__atableau_xb_fp {\l_tmpa_fp}
+ \fp_add:Nn \l__atableau_yb_fp {\l_tmpb_fp}
+ \draw[aTableau/dottedLine](\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+ }
+
+ % blank out any line at the bottom of the abacus and replace it with dots
+ \tl_if_in:nVT {-_} \l__atableau_abacus_bottom_tl
+ {
+ \fp_add:Nn \l__atableau_xa_fp {\l_tmpa_fp}
+ \fp_add:Nn \l__atableau_ya_fp {\l_tmpb_fp}
+ \fp_add:Nn \l__atableau_xb_fp {\l_tmpa_fp}
+ \fp_add:Nn \l__atableau_yb_fp {\l_tmpb_fp}
+ \draw[aTableau/clearBoxes]
+ (\fp_eval:n{\l__atableau_xa_fp-0.1*\l_tmpa_fp}, \fp_eval:n{\l__atableau_ya_fp-0.1*\l_tmpb_fp})
+ --++(\fp_eval:n{0.2*\l_tmpa_fp},\fp_eval:n{0.2*\l_tmpb_fp})
+ --(\fp_eval:n{\l__atableau_xb_fp+0.1*\l_tmpa_fp}, \fp_eval:n{\l__atableau_yb_fp+0.1*\l_tmpb_fp})
+ --++(\fp_eval:n{-0.2*\l_tmpa_fp},\fp_eval:n{-0.2*\l_tmpb_fp})
+ --cycle
+ ;
+ % first blank out the possible header line and replace with dots
+ \draw[aTableau/dottedLine](\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+ }
+ }
+}
+
+% usage: \__atableau_remove_dotted_abacus_rows:
+% Add dots to the rows of the abacus in \l__atableau_dotted_rows_seq
+\cs_new_protected:Nn \__atableau_remove_dotted_abacus_rows:
+{
+ % shift in column-direction
+ \fp_set:Nn \l_tmpa_fp {\l__atableau_ab_col_dx_fp*\l__atableau_abacus_wd_fp}
+ \fp_set:Nn \l_tmpb_fp {\l__atableau_ab_col_dy_fp*\l__atableau_abacus_ht_fp}
+
+ % take a copy of \l__atableau_dotted_rows_seq so that the pop_left's below
+ % do not destroy it
+ \seq_set_eq:NN \l_tmpb_seq \l__atableau_dotted_rows_seq
+ \bool_do_until:nn { \seq_if_empty_p:N \l_tmpb_seq }
+ {
+ \seq_pop_left:NN \l_tmpb_seq \l_tmpa_tl
+ \int_set:Nn \l__atableau_row_int {\l_tmpa_tl}
+ \int_set:Nn \l__atableau_r_int {\l__atableau_row_int+1}
+
+ % LaTeX3 does not provide \seq_if_in_p:NN, so ...
+ \bool_set_true:N \l_tmpa_bool
+ \bool_do_while:nn { \l_tmpa_bool }
+ {
+ \int_set:Nn \l_tmpa_int {0\seq_item:Nn \l_tmpb_seq 1}
+ \int_compare:nNnTF {\l__atableau_r_int} = {\l_tmpa_int}
+ {
+ \seq_pop_left:NN \l_tmpb_seq \l_tmpa_tl
+ \int_incr:N \l__atableau_r_int
+ }
+ { \bool_set_false:N \l_tmpa_bool }
+ }
+
+ \__atableau_set_bead_coordinates:non {l} { \int_eval:n{\l__atableau_row_int+1} } { 0 }
+
+ % set (xa,ya) and (xb,yb) to the "left" and "right" hand coordinates that we want remove
+ \fp_set:Nn \l__atableau_xa_fp {\l__atableau_xl_fp-0.35*\l__atableau_ab_row_dx_fp*\l__atableau_abacus_wd_fp}
+ \fp_set:Nn \l__atableau_ya_fp {\l__atableau_yl_fp-0.35*\l__atableau_ab_row_dy_fp*\l__atableau_abacus_ht_fp}
+ \fp_set:Nn \l__atableau_xb_fp {\l__atableau_xl_fp+(\l__atableau_r_int-\l__atableau_row_int-0.65)*\l__atableau_ab_row_dx_fp*\l__atableau_abacus_wd_fp}
+ \fp_set:Nn \l__atableau_yb_fp {\l__atableau_yl_fp+(\l__atableau_r_int-\l__atableau_row_int-0.65)*\l__atableau_ab_row_dy_fp*\l__atableau_abacus_ht_fp}
+
+ \draw[aTableau/clearBoxes]
+ (\fp_eval:n{\l__atableau_xa_fp-0.12*\l_tmpa_fp}, \fp_eval:n{\l__atableau_ya_fp-0.12*\l_tmpb_fp})
+ --++(\fp_eval:n{(\l__atableau_cols_int+0.24)*\l_tmpa_fp},\fp_eval:n{(\l__atableau_cols_int+0.24)*\l_tmpb_fp})
+ --(\fp_eval:n{\l__atableau_xb_fp+(\l__atableau_cols_int+0.12)*\l_tmpa_fp}, \fp_eval:n{\l__atableau_yb_fp+(\l__atableau_cols_int+0.12)*\l_tmpb_fp})
+ --(\fp_eval:n{\l__atableau_xb_fp-0.12*\l_tmpa_fp}, \fp_eval:n{\l__atableau_yb_fp-0.12*\l_tmpb_fp})
+ --cycle
+ ;
+ % first blank out the possible header line and replace with dots
+ \draw[aTableau/dottedLine](\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+
+ % now draw the dots
+ \int_step_inline:nnn {2} {\l__atableau_cols_int}
+ {
+ \fp_add:Nn \l__atableau_xa_fp {\l_tmpa_fp}
+ \fp_add:Nn \l__atableau_ya_fp {\l_tmpb_fp}
+ \fp_add:Nn \l__atableau_xb_fp {\l_tmpa_fp}
+ \fp_add:Nn \l__atableau_yb_fp {\l_tmpb_fp}
+ \draw[aTableau/dottedLine](\fp_use:N\l__atableau_xa_fp,\fp_use:N\l__atableau_ya_fp)--(\fp_use:N\l__atableau_xb_fp,\fp_use:N\l__atableau_yb_fp);
+ }
+
+ }
+}
+
+% ---------------------------------------------------------------------------
+% Keys for the package options and their defaults
+
+% setting TikZ styles via styles = { ... }
+\cs_new_protected:Npn \__atableau_tikzset:nn #1 #2 { \pgfqkeys{/tikz}{#1/.style={#2}} }
+
+% appending to aTableau styles
+\cs_new_protected:Npn \__atableau_tikzset_append:nn #1 #2 { \pgfqkeys{/tikz/aTableau}{#1/.append~style={#2}} }
+
+% aTableau options/keys
+\keys_define:nn { atableau }
+{
+ % ---------------------------------------------------------------------------
+ % general settings
+
+ % tableaux alignment
+ align .choice:,
+ align/top .code:n = { \tikzset{baseline=(current~bounding~box.north)} },
+ align/north .code:n = { \tikzset{baseline=(current~bounding~box.north)} },
+ align/center .code:n = { \tikzset{baseline=(current~bounding~box.center)}},
+ align/centre .code:n = { \tikzset{baseline=(current~bounding~box.center)}},
+ align/bottom .code:n = { \tikzset{baseline=(current~bounding~box.south)} },
+ align/south .code:n = { \tikzset{baseline=(current~bounding~box.south)} },
+ align .unknown .code:n = { \msg_error:nnn { aTableau } { unknown-baseline } {#1} },
+ align .initial:n = centre,
+
+ % set the Cartan type
+ cartan .choices:nn = { A, C, AA, DD }
+ {
+ % record the Cartan type for use in abacuses
+ \tl_set:Nn \l__atableau_cartan_tl {#1}
+ % define all of the type dependent functions here...
+ \cs_set_eq:Nc \__atableau_residue:nn {__atableau_residue_#1:nn}
+ },
+ cartan/unknown .code:n = { \msg_error:nne { aTableau } { unknown-cartan } {#1} },
+ cartan .initial:n = A,
+
+ charge .code:n =
+ {
+ % To cater for multipartitions, the charge is a sequence .
+ % Set l__atableau_charge_int is the first item in the sequence
+ \regex_split:nnN {[,\|]} {#1} \l__atableau_charge_seq
+ \int_set:Nn \l__atableau_charge_int { \seq_item:Nn \l__atableau_charge_seq {1} }
+ },
+ charge .value_required:n = true,
+ charge .initial:n = 0,
+
+ % dotted rows and columns for tableaux and abacuses
+ dotted~cols .code:n = { \__atableau_set_multiseq_key:nn {dotted_cols} {#1} },
+ dotted~cols .value_required:n = true,
+
+ dotted~rows .code:n = { \__atableau_set_multiseq_key:nn {dotted_rows} {#1} },
+ dotted~rows .value_required:n = true,
+
+ e .int_set:N = \l__atableau_e_int,
+ e .initial:n = 0,
+
+ entries .tl_set:N = \l__atableau_show_tl, % automatic bead labelling
+ entries .value_required:n = false,
+ entries .initial:n = ,
+
+ halign .choice:,
+ halign/center .code = {\cs_set_eq:NN \__atableau_halign:n \hbox_overlap_center:n},
+ halign/centre .code = {\cs_set_eq:NN \__atableau_halign:n \hbox_overlap_center:n},
+ halign/left .code = {\cs_set_eq:NN \__atableau_halign:n \hbox_overlap_left:n},
+ halign/right .code = {\cs_set_eq:NN \__atableau_halign:n \hbox_overlap_right:n},
+ halign .unknown .code:n = { \msg_error:nne { aTableau } { unknown-halign } {#1} },
+ halign .initial:n = centre,
+
+ % math/text mode for boxes and beads
+ math~entries .code:n = { \cs_set_eq:NN \__atableau_entry:n \__atableau_entry_math:n },
+ text~entries .code:n = { \cs_set_eq:NN \__atableau_entry:n \__atableau_entry_text:n },
+
+ % tableau node name prefix
+ name .tl_set:N = \l__atableau_prefix_tl,
+ name .value_required:n = true,
+ name .initial:n = A,
+
+ % scaling
+ scale .code:n = { \__atableau_set_xscale:n {#1} \__atableau_set_yscale:n {#1} },
+ scale .value_required:n = true,
+
+ % subscript an subsubscript scalinmg
+ script .fp_set:N = \l__atableau_script_fp,
+ script .value_required:n = true,
+ script .initial:n = 0.5,
+
+ scriptscript .fp_set:N = \l__atableau_scriptscript_fp,
+ scriptscript .value_required:n = true,
+ scriptscript .initial:n = 0.4,
+
+ star~style .code:n = { \__atableau_tikzset_append:nn {tableauStarStyle} {#1} },
+ star~style .value_required:n = true,
+
+ % shortcut for setting TikZ styles, following a suggestion of Skillmon to use \keyval_parse:nnn
+ styles .code:n =
+ { \keyval_parse:nnn { \msg_error:nnn {aTableau}{missing-style} } { \__atableau_tikzset:nn } { #1 } },
+
+ % tikzpicture environment
+ tikzpicture .tl_set:N= \l__atableau_tikzpicture_tl,
+ tikzpicture .value_required:n = true,
+ tikzpicture .initial:n =,
+
+ % tikz code after
+ tikz~after .tl_set:N = \l__atableau_tikz_after_tl,
+ tikz~after .value_required:n = true,
+ tikz~after .initial:n = ,
+
+ % tikz~ code before
+ tikz~before .tl_set:N = \l__atableau_tikz_before_tl,
+ tikz~before .value_required:n = true,
+ tikz~before .initial:n = ,
+
+ valign .choices:nn = { bottom, center, centre, top }
+ {
+ \cs_set_eq:Nc \__atableau_valign:n { __atableau_valign_#1:n }
+ },
+ valign .unknown .code:n = { \msg_error:nne { aTableau } { unknown-valign } {#1} },
+ valign .initial:n = centre,
+
+ xscale .code:n = { \__atableau_set_xscale:n {#1} },
+ xscale .value_required:n = true,
+ xscale .initial:n =1,
+
+ yscale .code:n = { \__atableau_set_yscale:n {#1} },
+ yscale .value_required:n = true,
+ yscale .initial:n =1,
+
+ % ---------------------------------------------------------------------------
+ % tableau settings
+
+ % convention switches
+ Australian .code:n = \__atableau_set_style:nn {tableau} {australian},
+ australian .code:n = \__atableau_set_style:nn {tableau} {australian},
+ australian .value_required:n = false,
+
+ English .code:n = \__atableau_set_style:nn {tableau} {english},
+ english .code:n = \__atableau_set_style:nn {tableau} {english},
+ english .value_required:n = false,
+ english .initial:n =, % default style
+
+ French .code:n = \__atableau_set_style:nn {tableau} {french},
+ french .code:n = \__atableau_set_style:nn {tableau} {french},
+ french .value_required:n = false,
+
+ ukrainian .code:n = \__atableau_set_style:nn {tableau} {ukrainian},
+ Ukrainian .code:n = \__atableau_set_style:nn {tableau} {ukrainian},
+ ukrainian .value_required:n = false,
+
+ Russian .code:n = \__atableau_set_style:nn {tableau} {ukrainian},
+ russian .code:n = \__atableau_set_style:nn {tableau} {ukrainian},
+
+ border .bool_set:N = \l__atableau_border_bool,
+ border .default:n = true,
+ border .initial:n = true,
+
+ no~border .bool_set_inverse:N = \l__atableau_border_bool,
+ no~border .default:n = true,
+
+ % border colours
+
+ border~color .tl_set:N = \l__atableau_outer_tl, % an alias
+ border~color .value_required:n = true,
+ border~colour .tl_set:N = \l__atableau_outer_tl,
+ border~colour .value_required:n = true,
+ border~colour .initial:n = aTableauMain,
+
+ border~style .code:n = { \__atableau_tikzset_append:nn {borderStyle} {#1} },
+ border~style .value_required:n = true,
+
+ % node height and width
+ box~height .fp_set:N = \l__atableau_box_ht_fp,
+ box~height .value_required:n = true,
+ box~height .initial:n = 0.5,
+
+ box~width .fp_set:N = \l__atableau_box_wd_fp,
+ box~width .value_required:n = true,
+ box~width .initial:n = 0.5,
+
+ % box styling
+ box~fill .tl_set:N = \l__atableau_box_fill_tl,
+ box~fill .value_required:n = true,
+ box~fill .initial:n = white,
+
+ box~font .tl_set:N = \l__atableau_box_font_tl,
+ box~font .value_required:n = true,
+ box~font .initial:n =,
+
+ box~shape .tl_set:N = \l__atableau_box_shape_tl,
+ box~shape .value_required:n = true,
+ box~shape .initial:n = rectangle,
+
+ box~text .tl_set:N = \l__atableau_box_text_tl,
+ box~text .value_required:n = true,
+ box~text .initial:n = aTableauMain,
+
+ box~style .code:n = { \__atableau_tikzset_append:nn {boxStyle} {#1} },
+ box~style .value_required:n = true,
+
+ boxes .bool_set:N = \l__atableau_boxes_bool,
+ boxes .default:n = true,
+ boxes .initial:n = true,
+
+ no~boxes .bool_set_inverse:N = \l__atableau_boxes_bool,
+ no~boxes .default:n = true,
+
+ conjugate .code:n =
+ {
+ \tl_set:Nx \l_tmpa_tl {\str_lowercase:n {#1}}
+ \str_if_eq:VnTF \l_tmpa_tl {true}
+ {
+ \bool_set_true:N \l__atableau_conjugate_bool
+ \cs_set_eq:NN \__atableau_set_box_coordinates:nnn \__atableau_set_box_coordinates_conjugate:nnn
+ }
+ {
+ \bool_set_false:N \l__atableau_conjugate_bool
+ \cs_set_eq:NN \__atableau_set_box_coordinates:nnn \__atableau_set_box_coordinates_normal:nnn
+ }
+ },
+ conjugate .default:n = true,
+ conjugate .initial:n = false,
+
+ inner~wall .tl_set:N = \l__atableau_inner_tl,
+ inner~wall .value_required:n = true,
+ inner~wall .initial:n = aTableauInner,
+
+ inner~style .code:n = { \__atableau_tikzset_append:nn {innerWall} {#1} },
+ inner~style .value_required:n = true,
+
+ % label
+ label .code:n = {
+ \tl_if_in:nnTF {#1} {|}
+ {
+ % unpack the ribbons into \l__atableau_multiribbons_seq
+ \seq_set_split:cnn {l__atableau_multilabel_seq} {|} {#1}
+ }
+ { \tl_set:No \l__atableau_label_tl {#1} }
+ },
+
+ label~style .code:n = { \__atableau_tikzset_append:nn {labelStyle} {#1} },
+ label~style .value_required:n = true,
+
+ % -- paths ---------------------------------------
+ paths .code:n = { \__atableau_set_multiseq_key:nn {paths} {#1} },
+ paths .initial:n = ,
+
+ path~style .code:n = { \__atableau_tikzset_append:nn {pathStyle} {#1} },
+ path~style .value_required:n = true,
+ path~style .initial:n =,
+
+ path~box .tl_set:N = \l__atableau_path_box_tl,
+ path~box .initial:n = ,
+
+ path~box~style .code:n = { \__atableau_tikzset_append:nn {pathBox} {#1} },
+ path~box~style .value_required:n = true,
+ path~box~style .initial:n =,
+
+ % -- ribbons ---------------------------------------
+ ribbons .code:n = { \__atableau_set_multiseq_key:nn {ribbons} {#1} },
+ ribbons .initial:n = ,
+
+ ribbon~style .code:n = { \__atableau_tikzset_append:nn {ribbonStyle} {#1} },
+ ribbon~style .value_required:n = true,
+ ribbon~style .initial:n =,
+
+ ribbon~box .tl_set:N = \l__atableau_ribbon_box_tl,
+ ribbon~box .initial:n = ,
+
+ ribbon~box~style .code:n = { \__atableau_tikzset_append:nn {ribbonBox} {#1} },
+ ribbon~box~style .value_required:n = true,
+ ribbon~box~style .initial:n =,
+
+ % -- snobs ---------------------------------------
+ snobs .code:n = { \__atableau_set_multiseq_key:nn {snobs} {#1} },
+ snobs .initial:n = ,
+
+ snob~style .code:n = { \__atableau_tikzset_append:nn {snobStyle} {#1} },
+ snob~style .value_required:n = true,
+ snob~style .initial:n =,
+
+ snob~box .tl_set:N = \l__atableau_snob_box_tl,
+ snob~box .initial:n = ,
+
+ snob~box~style .code:n = { \__atableau_tikzset_append:nn {snobBox} {#1} },
+ snob~box~style .value_required:n = true,
+ snob~box~style .initial:n =,
+
+ % -- shifted, skew and tabloid shapes ------------
+ shifted .bool_set:N = \l__atableau_shifted_bool,
+ shifted .initial:n = false,
+
+ skew .code:n =
+ {
+ \tl_if_in:nnTF {#1} {|}
+ {
+ % unpack the skew tableau into \l__atableau_multiskew_seq
+ \seq_set_split:Nnn \l__atableau_multiskew_seq {|} {#1}
+ }
+ { \__atableau_set_partition:nn {skew} {#1} }
+ },
+ skew .value_required:n = true,
+ skew .initial:n = 0,
+
+ skew~border .bool_set:N = \l__atableau_skew_border_bool,
+ skew~border .initial:n = false,
+
+ no~skew~border .bool_set_inverse:N = \l__atableau_skew_border_bool,
+ no~skew~border .default:n = true,
+
+ skew~border~style .code:n = { \__atableau_tikzset_append:nn {skewBorder} {#1} },
+ skew~border~style .value_required:n = true,
+
+ skew~boxes .bool_set:N = \l__atableau_skew_boxes_bool,
+ skew~boxes .default:n = true,
+ skew~boxes .initial:n = false,
+
+ no~skew~boxes .bool_set_inverse:N = \l__atableau_skew_boxes_bool,
+
+ skew~box~style .code:n = { \__atableau_tikzset_append:nn {skewBox} {#1} },
+ skew~box~style .value_required:n = true,
+
+ skew colour .tl_set:N = \l__atableau_skew_border_tl,
+ skew color .tl_set:N = \l__atableau_skew_border_tl,
+ skew colour .initial:n = aTableauSkew,
+
+ tabloid .bool_set:N = \l__atableau_tabloid_bool,
+ tabloid .initial:n = false,
+
+ % -- multitableaux and multidiagrams --------------------
+
+ delimiters .code:n = { \__atableau_set_delimiters:nn #1 },
+ delimiters .value_required:n = true,
+ delimiters .initial:n = (),
+
+ left~delimiter .tl_set:N = \l__atableau_left_delimiter_tl,
+ left~delimiter .value_required:n = true,
+
+ right~delimiter .tl_set:N = \l__atableau_right_delimiter_tl,
+ right~delimiter .value_required:n = true,
+
+ empty .tl_set:N = \l__atableau_empty_tl,
+ empty .initial:n = \textendash,
+
+ separators .bool_set:N = \l__atableau_separators_bool,
+ separators .default:n = true,
+ separators .initial:n = true,
+
+ no~separators .bool_set_inverse:N = \l__atableau_separators_bool,
+ no~separators .default:n = true,
+
+ separation .fp_set:N = \l__atableau_separation_fp,
+ separation .value_required:n = true,
+ separation .initial:n = 0.3,
+
+ separator .tl_set:N = \l__atableau_separator_tl,
+ separator .value_required:n = true,
+ separator .initial:n = |,
+
+ separator~colour .tl_set:N = \l__atableau_separator_fg_tl,
+ separator~colour .value_required:n = true,
+ separator~colour .initial:n = aTableauMain,
+
+ separator~color .tl_set:N = \l__atableau_separator_fg_tl,
+ separator~color .value_required:n = true,
+
+ % set rows in abacuses, multitableau and multidiagrams
+ rows .code:n = {
+ \fp_set:Nn \l__atableau_rows_fp {#1}
+ \int_set:No \l__atableau_rows_int {\fp_to_int:N \l__atableau_rows_fp}
+ },
+ rows .value_required:n = true,
+ rows .initial:n = 0,
+
+ xoffsets .code:n = { \regex_split:nnN {[\|,]} {#1} \l__atableau_xoffsets_seq },
+ xoffsets .value_required:n = true,
+ xoffsets .initial:n = 0,
+
+ yoffsets .code:n = { \regex_split:nnN {[\|,]} {#1} \l__atableau_yoffsets_seq },
+ yoffsets .value_required:n = true,
+ yoffsets .initial:n = 0,
+
+ % ---------------------------------------------------------------------------
+ % abacus keys
+
+ south .code:n = \__atableau_set_style:nn {abacus} {south},
+ south .initial:n =,
+ east .code:n = \__atableau_set_style:nn {abacus} {east},
+ north .code:n = \__atableau_set_style:nn {abacus} {north},
+ west .code:n = \__atableau_set_style:nn {abacus} {west},
+
+ % abacus style
+ abacus~ends .code:n = { \__atableau_set_abacus_ends:nn #1 },
+ abacus~ends .value_required:n = true,
+ abacus~ends .initial:n = {-|},
+
+ abacus~ends~style .code:n = { \__atableau_tikzset_append:nn {abacusEnds} {#1} },
+ abacus~ends~style .value_required:n = true,
+
+ abacus~star~style .code:n = { \__atableau_tikzset_append:nn {abacusStarStyle} {#1} },
+ abacus~star~style .value_required:n = true,
+
+ bead .tl_set:N = \l__atableau_bead_tl, % bead colour
+ bead .value_required:n = true,
+ bead .initial:n = aTableauMain,
+
+ bead~font .tl_set:N = \l__atableau_bead_font_tl, % bead font
+ bead~font .initial:n = \small,
+ bead~font .value_required:n = true,
+
+ bead~size .fp_set:N = \l__atableau_bead_size_fp,
+ bead~size .initial:n = 0.4,
+
+ bead~sep .fp_set:N = \l__atableau_abacus_ht_fp, % bead separation
+ bead~sep .value_required:n = true,
+ bead~sep .initial:n = 0.42,
+
+ bead~shape .tl_set:N = \l__atableau_bead_shape_tl, % bead shape colour
+ bead~shape .value_required:n = true,
+ bead~shape .initial:n = circle,
+
+ bead~style .code:n = { \__atableau_tikzset_append:nn {beadStyle} {#1} },
+ bead~style .value_required:n = true,
+
+ bead~text .tl_set:N = \l__atableau_bead_text_tl, % bead text colour
+ bead~text .value_required:n = true,
+ bead~text .initial:n = white,
+
+ beta~numbers .bool_set:N = \l__atableau_beta_numbers_bool,
+ beta~numbers .initial:n = false,
+
+ no~shade .code:n = { \__atableau_tikzset_append:nn {beadStyle} {no~shade,} },
+ no~shade .value_required:n = false,
+
+ runner .tl_set:N = \l__atableau_runner_tl, % runner colour
+ runner .value_required:n = true,
+ runner .initial:n = aTableauInner,
+
+ runner~style .code:n = { \__atableau_tikzset_append:nn {runnerStyle} {#1} },
+ runner~style .value_required:n = true,
+
+ runner~labels .code:n = { \seq_set_split:Nnn \l__atableau_runner_labels_seq {,} {#1} },
+ runner~labels .value_required:n = true,
+
+ runner~label~style .code:n = { \__atableau_tikzset_append:nn {runnerLabelStyle} {#1} },
+ runner~label~style .value_required:n = true,
+
+ runner~sep .fp_set:N = \l__atableau_abacus_wd_fp, % runner separation
+ runner~sep .value_required:n = true,
+ runner~sep .initial:n = 0.42,
+
+ shading .tl_set:N = \l__atableau_shading_tl,
+ shading .value_required:n = true,
+ shading .initial:n = ball,
+
+ tick .tl_set:N = \l__atableau_tick_tl, % tick colour
+ tick .initial:n = aTableauInner,
+
+ tick~length .code:n = { \fp_set:Nn \l__atableau_tick_length_fp {#1/2} }, % (half) tick width separation
+ tick~length .value_required:n = true,
+ tick~length .initial:n = 0.1,
+
+ tick~style .code:n = { \__atableau_tikzset_append:nn {tickStyle} {#1} },
+ tick~style .value_required:n = true,
+}
+
+
+% ---------------------------------------------------------------------------
+% Usage: \__atableau_set_origin:nn (x,y)
+% Set the Cartesian coordinates for the corner of the (1,1) box
+% TODO: allow general TikZ-coorindates. To do this we could, for example, use ideas from
+% https://tex.stackexchange.com/questions/33703/extract-x-y-coordinate-of-an-arbitrary-point-in-tikz
+\cs_new_protected:Npn \__atableau_set_origin:nn (#1,#2)
+{
+ \fp_set:Nn \l__atableau_x_fp {#1}
+ \fp_set:Nn \l__atableau_y_fp {#2}
+}
+
+% usage: \__atableau_tikzpicture:nnn {settings} {origin} {aTableau command}
+% where
+% - #1: settings are a comma separated list of aTableau settings
+% - #2: origin are Cartesian coordinates in the form x,y, or NoValue
+% - #3: an internal aTableau command with parameters for drawing something
+% Apply settings and wrap an aTableau command inside a tikzpicture environment.
+% Add any tikzpicture environments settings and before and after TikZ commands
+\cs_new_protected:Npn \__atableau_tikzpicture:nnn #1 #2 #3
+{
+ \group_begin:
+ % keep changes to settings local by working inside a group
+ \keys_set:nn {atableau} {#1}
+ \IfNoValueTF {#2}
+ { % wrap inside a tikzpicture environment, placing the picture at (0,0)
+ \__atableau_set_origin:nn (0,0)
+
+ \mode_if_math:TF
+ {
+ % We want to automatically rescale when used as a subscript, which
+ % we do by putting the tikz code inside a box and then using
+ % \mathchoice to adjust for script size, using an idea of cfr's
+
+ \hbox_set:Nw \l_tmpa_box
+ \exp_last_unbraced:Ne \tikz{[\l__atableau_tikzpicture_tl]}
+ { \l__atableau_tikz_before_tl #3 \l__atableau_tikz_after_tl }
+ \hbox_set_end:
+
+ \mathchoice
+ { % display style: do nothing
+ \box_use:N \l_tmpa_box
+ }
+ { % text style: do nothing
+ \box_use:N \l_tmpa_box
+ }
+ { % script style: rescale
+ \box_scale:Nnn \l_tmpa_box {\l__atableau_script_fp*\l__atableau_xscale_fp}
+ {\l__atableau_script_fp*\l__atableau_yscale_fp}
+ \box_use:N \l_tmpa_box
+ }
+ { % scriptscript style: rescale
+ \box_scale:Nnn \l_tmpa_box {\l__atableau_scriptscript_fp*\l__atableau_xscale_fp}
+ {\l__atableau_scriptscript_fp*\l__atableau_yscale_fp}
+ \box_use:N \l_tmpa_box
+ }
+ }
+ { % Not in maths-mode. tcolorbox objects to using a box here
+ \exp_last_unbraced:Ne \tikz{[\l__atableau_tikzpicture_tl]}
+ { \l__atableau_tikz_before_tl #3 \l__atableau_tikz_after_tl }
+ }
+ }
+ { % already inside a tikzpicture environment
+ \__atableau_set_origin:nn (#2)
+ \l__atableau_tikz_before_tl #3 \l__atableau_tikz_after_tl
+ }
+ \group_end:
+}
+
+% ---------------------------------------------------------------------------
+% Public facing package commands
+
+% Almost all public-facing routines call \__atableau_tikzpicture:nnn,
+% which applies the settings, sets the coordinates of the origin and
+% then ensures that the requested diagram is drawn inside a tikzpicture
+% environment.
+
+% \Abacus (x,y) [style] {#runners} {partition}
+\NewDocumentCommand\Abacus{ d() O{} m m }
+{
+ \__atableau_tikzpicture:nnn {#2} {#1} { \__atableau_abacus:nn {#3} {#4} }
+}
+
+% \Diagram (x,y) [style] {shape}
+\NewDocumentCommand\Diagram{ d() O{} m }
+{
+ \__atableau_tikzpicture:nnn {#2} {#1} { \__atableau_draw_diagram:n {#3} }
+}
+
+% \Multidiagram (x,y) [style] {entries}
+\NewDocumentCommand\Multidiagram{ d() O{} m }
+{
+ \__atableau_tikzpicture:nnn {#2} {#1} { \__atableau_multidiagram:n {#3} }
+}
+
+% \Multitableau (x,y) [style] {entries}
+\NewDocumentCommand\Multitableau{ d() O{} m }
+{
+ \__atableau_tikzpicture:nnn {#2} {#1} { \__atableau_multitableau:n {#3} }
+}
+
+% \RibbonTableau (x,y) [style] {entries}
+\NewDocumentCommand\RibbonTableau{ d() O{} m }
+{
+ \__atableau_tikzpicture:nnn {#2} {#1} { \__atableau_ribbon_tableau:n {#3} }
+}
+
+% \ShiftedDiagram (x,y) [style] {entries}
+\NewDocumentCommand\ShiftedDiagram{ d() O{} m }
+{
+ \__atableau_tikzpicture:nnn {shifted,#2} {#1} { \__atableau_draw_diagram:n {#3} }
+}
+
+% \ShiftedTableau (x,y) [style] {entries}
+\NewDocumentCommand\ShiftedTableau{ d() O{} m }
+{
+ \__atableau_tikzpicture:nnn {shifted,#2} {#1} { \__atableau_draw_tableau:n {#3} }
+}
+
+% \SkewDiagram (x,y) [style] {skew shape} {entries}
+\NewDocumentCommand\SkewDiagram{ d() O{} m m }
+{
+ \__atableau_tikzpicture:nnn {skew={#3},#2} {#1} { \__atableau_draw_diagram:n {#4} }
+}
+
+% \SkewTableau (x,y) [style] {skew shape} {entries}
+\NewDocumentCommand\SkewTableau{ d() O{} m m }
+{
+ \__atableau_tikzpicture:nnn {skew={#3},#2} {#1} { \__atableau_draw_tableau:n {#4} }
+}
+
+% \Tableau (x,y) [style] {entries}
+\NewDocumentCommand\Tableau{ d() O{} m }
+{
+ \__atableau_tikzpicture:nnn {#2} {#1} { \__atableau_draw_tableau:n {#3} }
+}
+
+% \Tabloid (x,y) [style] {entries}
+\NewDocumentCommand\Tabloid{ d() O{} m }
+{
+ \__atableau_tikzpicture:nnn {tabloid,#2} {#1} { \__atableau_draw_tableau:n {#3} }
+}
+
+\NewDocumentCommand\aTabset{ m }{ \keys_set:nn { atableau } {#1} }
+
+% ---------------------------------------------------------------------------
+% Finally, now that everything is defined, process the package options.
+
+\IfFormatAtLeastTF { 2022-06-01 }
+ { \ProcessKeyOptions [ atableau ] }
+ {
+ \RequirePackage { l3keys2e }
+ \ProcessKeysOptions { atableau }
+ }
+
+\endinput
+
+% ---------------------------------------------------------------------------
+% CHANGE LOG
+%
+% Version 1.0.0 - 2023-10-06
+% - initial version
+% - Young diagrams, tabloids, tableaux, shifted tableaux, Ukrainian tableaux, abacuses, braids
+%
+% Version 2.0.0 - 2025-01-22
+% - completely rewritten using LaTeX3
+% - key interface for the tableaux options
+% - macros can be used both in and outside tikzpicture environments
+% - a quark-based interface allows styles to be applied to each tableau entry
+% - support for different conventions (english, french, ukrainian, australian)
+% - support diagrams, tableaux, including tabloids, skew and shifted tableaux and ribbon tableaux
+% - stars and styles
+%
+% Version 2.1.0 - 2025-01-24
+% - support for using aTableau commands in super and subscripts
+% - warning about using older versions of LaTeX3
+
+
+% ---------------------------------------------------------------------------
+%
+% Copyright (C) 2022-25 by Andrew Mathas <andrew.mathas@gmail.com>
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License (LPPL), either
+% version 1.3c of this license or (at your option) any later
+% version. The latest version of this license is in the file:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% This work is "maintained" (as per LPPL maintenance status) by
+% Andrew Mathas.
+%
+% This package consists of the files:
+% atableau.ini
+% atableau.pdf
+% atableau.sty
+% atableau.tex
+% LICENSE
+% README.md
+%
+% ---------------------------------------------------------------------------
+
+% end of atableau.sty
diff --git a/graphics/pgf/contrib/atableau/atableau.tex b/graphics/pgf/contrib/atableau/atableau.tex
new file mode 100644
index 0000000000..a91636eb8c
--- /dev/null
+++ b/graphics/pgf/contrib/atableau/atableau.tex
@@ -0,0 +1,4441 @@
+% ----------------------------------------------------------------------
+% Title: aTableau. Author: Andrew Mathas Created: October 2023
+% Modified: 16:58 Friday, 24 January 2025
+% ----------------------------------------------------------------------
+\documentclass{amsart}
+\usepackage[svgnames,table]{xcolor}
+\usepackage{atableau}
+\usepackage{xspace}
+\usepackage{manfnt}
+\usepackage{booktabs}
+\usepackage{longtable}
+\usepackage{xltabular}
+\usepackage{siunitx}
+\usepackage{array}
+\newcolumntype{L}{>{\sffamily\color{MidnightBlue}\textbackslash}l}
+
+% ----------------------------------------------------------------------
+\usepackage{bm}
+\usepackage{mathtools}
+
+% ----------------------------------------------------------------------
+\usepackage{bbding}
+\newcommand\No{\textcolor{red}{\XSolidBrush}}
+% \Yes, which adds a hyperlink, is defined below
+
+% ----------------------------------------------------------------------
+\usepackage[a4paper,hmargin=24mm, vmargin=18mm, footskip=10mm]{geometry}
+\synctex=1
+\hfuzz=5pt
+\parindent=0pt
+\parskip=4mm
+
+\makeatletter
+\def\@evenhead{\hfill\aTableau\hfill}
+\let\@oddhead\@evenhead
+\def\@oddfoot {\color{aTableauInner} Version \atableau@version~(\atableau@release)\hfill\thepage}
+\def\@evenfoot{\color{aTableauInner} \thepage\hfill Version \atableau@version~(\atableau@release)}
+\makeatother
+
+% ----------------------------------------------------------------------
+\newcommand\aTableauColour[1]{%
+ \tikz[baseline={(current bounding box.south)}]\node[minimum width=8mm, minimum height=2ex,fill=aTableau#1]{};%
+}
+
+\ExplSyntaxOn
+% \optionlabel applies \option to the csv in #1 except in the case
+% when #1 starts with a * when the rest of #1 is printed
+\NewDocumentCommand\optionlabel{ m }
+{
+ \str_if_eq:eeTF { \str_head:n {#1} } {*}
+ {
+ \tl_set:Nx \l_tmpb_tl { \str_tail:n {#1} }
+ \tl_put_left:Nn \l_tmpb_tl {\sffamily\color{aTableauInner}}
+ }
+ {
+ \tl_clear:N \l_tmpa_tl
+ \tl_clear:N \l_tmpb_tl
+ \clist_map_inline:nn {#1}
+ {
+ \tl_put_right:Ne \l_tmpb_tl { \l_tmpa_tl \exp_not:N\option{##1}}
+ \tl_set:Nn \l_tmpa_tl {,~}
+ }
+ }
+ \l_tmpb_tl\hss
+}
+
+\NewDocumentCommand\Yes{o d()}
+{
+ \IfNoValueTF{#1}
+ {
+ \IfNoValueTF{#2}
+ { \hyperref[\g_lastlink_tl]{\textcolor{ForestGreen}{\CheckmarkBold}} }
+ { \hyperref[Key:#2]{\textcolor{ForestGreen}{\CheckmarkBold}} }
+ }
+ {
+ \hyperref[\g_lastlink_tl-\str_lowercase:f{#1}]{\textcolor{ForestGreen}{\CheckmarkBold}}
+ }
+}
+
+% Add hyperinks for (new displayed) options
+\tl_new:N \g_lastlink_tl
+\prop_new:N \l__atableau_options_prop
+\NewDocumentCommand\AddKeyLink{m}
+{
+ \tl_gset:Nx \g_lastlink_tl {Key:\str_lowercase:f{#1}}
+ \prop_if_in:NVF \l__atableau_options_prop \g_lastlink_tl
+ {
+ \phantomsection\exp_args:Nf\label{Key:\str_lowercase:f{#1}}% add a label for references
+ \prop_put:NVn \l__atableau_options_prop \g_lastlink_tl {}
+ }
+}
+% \option*[default value]{option name}[accepted values]<hyperlink context>(link name)
+% The \option command is slightly overloaded, both in terms of arguments
+% (there are five) and in terms of use.
+% 1. If #2 is given then \option gives the syntax for the using this key:
+% - #1=* determines whether a \newline or \bigskip is inserted. The
+% *-version is used when a block of keys are listed together
+% - #2 gives the default options
+% - #3 is the key name and optionally may take the form key=value
+% to describe the allowed values. If the value is given then it is
+% printed in orange after the key inside \langle...\rangle. This is
+% intended for "generic values like 'value' or 'style'.
+% The key component of #2 is used to add a hyperlink to the current
+% location, which takes the form Key:<key>-<context>, where the
+% <context> is added only if #5 is supplied
+% - any accepted values in #3 are printed in the right-hand margin
+% 2. When #2 is omitted, this an inline citation of the key. A
+% hyperlink is added
+
+% The *-version does not do a \bigskip before the option. A hyperlink is
+% added for new displayed options. If #2 is blank then the *-version
+% puts (no) before the option key. If #5 is given then it is added to
+% to the hyperlink.
+\NewDocumentCommand\option{ somo d<> d()}
+{%
+ \seq_set_split:Nnn \l_tmpa_seq {=} {#3}%
+ \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl%
+ \seq_if_empty:NTF \l_tmpa_seq
+ { \tl_clear:N \l_tmpb_tl }
+ { \tl_set:No \l_tmpb_tl { \seq_use:Nn \l_tmpa_seq {=} } }
+ \IfNoValueTF{#2}
+ {%
+ \IfNoValueTF{#6}
+ {
+ \tl_gset:Nx \g_lastlink_tl {Key:\str_lowercase:f{\l_tmpa_tl}}
+ \IfNoValueF{#5} { \tl_gput_right:No \g_lastlink_tl {\str_lowercase:f{-#5}} }
+ }
+ { \tl_gset:Ne \g_lastlink_tl {Key:#6} }
+ \hyperref[\g_lastlink_tl]{\textsf{\color{aTableauInner}\IfBooleanT{#1}{(no)~}\l_tmpa_tl}}
+ \index{\l_tmpa_tl}%
+ \tl_if_empty:NF \l_tmpb_tl { \textsf{\,$=$\,}\textsf{\textcolor{orange}{\l_tmpb_tl}} }
+ }
+ {%
+ % encourage page breaks *before* the option, rather than after it
+ \IfBooleanTF{#1}{\newline}{\bigskip\pagebreak[0]}%
+ % adjust #3 if it contains a *, when we add = <value>
+ % add a label for references
+ \IfNoValueTF{#5} { \AddKeyLink{\l_tmpa_tl} }{ \AddKeyLink{\l_tmpa_tl-#5} }
+ \noindent\textsf
+ {
+ \textcolor{aTableauInner}{\l_tmpa_tl}
+ \tl_if_empty:NF \l_tmpb_tl { \textcolor{orange}{$\,=\,\langle$\l_tmpb_tl$\rangle$} }
+ }
+ \tl_if_blank:nF {#2}
+ { ~ \tl_if_eq:nnTF{#2} {-} {(default)} {(default:~\textcolor{DarkRed}{#2})} }%
+ \hfill%
+ \IfNoValueF{#4}{\textcolor{Grey}{[accepts:~#4]}}%
+ \index{\l_tmpa_tl|underline}%
+ \nopagebreak[4]%
+ }%
+}
+
+% index command ignoring the backslash and capitalisation
+\cs_new_protected:Npn \l_addto_index:nn #1#2 { \index{#2@\textbackslash #1} }
+\cs_generate_variant:Nn \l_addto_index:nn {Vo}
+\NewDocumentCommand\indexcmd{m}
+{
+ \tl_set:Nn \l_index_tl {#1}
+ \l_addto_index:Vo \l_index_tl { \str_lower_case:n\l_index_tl }
+}
+
+\clist_new:N \l_atableau_keys_clist
+\clist_set:Nn \l_atableau_keys_clist
+{
+ Australian,
+ English,
+ French,
+ Ukrainian,
+ align,
+ australian,
+ border,
+ box,
+ boxes,
+ no boxes,
+ color,
+ colour,
+ cols,
+ conjugate,
+ left delimiter,
+ right delimiter,
+ delimiters,
+ dotted,
+ e,
+ east,
+ english,
+ entries,
+ font,
+ french,
+ halign,
+ height,
+ inner,
+ label,
+ left,
+ math,
+ nodes,
+ north,
+ ribbon,
+ ribbons,
+ right,
+ rows,
+ scale,
+ separator,
+ separators,
+ shape,
+ shifted,
+ skew,
+ snobs,
+ snob style,
+ ribbon style,
+ path style,
+ snob box,
+ ribbon box,
+ path box,
+ snob box style,
+ ribbon box style,
+ path box style,
+ valign,
+ south,
+ star style,
+ abacus star style,
+ tabloid,
+}
+\NewDocumentCommand\HighlightKeys{m}
+{
+ \clist_if_in:NnTF \l_atableau_keys_clist {#1}
+ {
+ \textcolor{orange}{#1}
+ }
+ {
+ #1
+ }
+}
+\ExplSyntaxOff
+
+% ---------------------------------------------------------------------------
+\usepackage{enumitem}
+\setlist{itemsep=2mm, parsep=2mm}
+\newlist{options}{description}{1}
+% remove the colon from the description label by redefining \makelabel
+\setlist[options]{
+ before=\let\makelabel\optionlabel,
+ labelwidth=\textwidth,
+ nosep,
+}
+
+% ---------------------------------------------------------------------------
+% the index
+
+\usepackage{imakeidx}
+\indexsetup{level=\section*, toclevel=section, noclearpage}
+\makeindex[columns=3]
+\renewcommand*{\seename}{see}
+
+% ---------------------------------------------------------------------------
+%\renewcommand\thesubsection{\thesection\Alph{subsection}}
+\setcounter{secnumdepth}{3}
+\setcounter{tocdepth}{3}
+\renewcommand\thesubsection{\thesection\Alph{subsection}}
+\renewcommand\thesubsubsection{\thesubsection.\arabic{subsubsection}}
+
+\makeatletter
+\def\l@subsection{\@tocline{2}{0pt}{2.5pc}{5pc}{}}
+\def\l@subsubsection{\@tocline{2}{0pt}{3.5pc}{3pc}{}}
+\makeatother
+
+\newenvironment{warning}{\trivlist\item[\hskip\labelsep\textcolor{red}{\textdbend}]}{\endtrivlist}
+
+% ---------------------------------------------------------------------------
+\usepackage[skins]{tcolorbox}
+\usepackage{hyperref}
+\hypersetup{
+ colorlinks=true,
+ linkcolor=MediumBlue,
+ citecolor=FireBrick,
+}
+\tcbuselibrary{listings, breakable}
+
+\DeclareTotalTCBox\keyword{ O{} v }
+{
+ bottom=0pt,
+ colback = Ivory,
+ colupper = aTableauInner,
+ fontupper= \bfseries,
+ fontlower= \bfseries,
+ left = 0mm,
+ right = 0mm,
+ size = tight,
+ skin = tile,
+ top = 0pt,
+ nobeforeafter,
+ on line,
+ shrink tight,
+ verbatim,
+ #1}
+{#2}
+
+\newcommand\aTableau{\textcolor{aTableauMain}{\sffamily aTableau}\xspace}
+
+% hyperref links to ctan
+\newcommand\ctan[1]{\href{https://www.ctan.org/pkg/#1}{\texttt{#1}}}
+\newcommand\TikZ{\href{https://www.ctan.org/pkg/tikz}{Ti\textit{k}Z}\xspace}
+
+\lstdefinestyle{atableau}
+{
+ style=tcblatex,
+ classoffset=0,
+ texcsstyle=*\color{MediumBlue},%
+ deletetexcs={begin, end},
+ commentstyle=\color{Peru},
+ moretexcs={,% aTableau package commands
+ aTabset,
+ Abacus,
+ Diagram,
+ Multidiagram,
+ Multitableau,
+ RibbonTableau,
+ ShiftedDiagram,
+ ShiftedTableau,
+ SkewTableau,
+ SkewDiagram,
+ Tableau,
+ Tabloid,
+ },%
+% classoffset=1, % aTableau package options
+% keywordstyle=\color{aTableauInner},%
+% morekeywords={
+% Australian,
+% English,
+% French,
+% Ukrainian,
+% align,
+% australian,
+% border,
+% box,
+% boxes,
+% color,
+% colour,
+% cols,
+% conjugate,
+% delimiter,
+% delimiters,
+% dotted,
+% e,
+% east,
+% english,
+% entries,
+% finite,
+% font,
+% french,
+% halign,
+% height,
+% infinite,
+% inner,
+% label,
+% left,
+% math,
+% no,
+% nodes,
+% north,
+% only,
+% ribbon,
+% ribbons,
+% right,
+% rows,
+% scale,
+% separator,
+% separators,
+% shape,
+% shifted,
+% skew,
+% snobs,
+% valign,
+% south,
+%% star,
+%% style,
+% tabloid,
+% text,
+% text,
+% type,
+% ukrainian,
+% wall,
+% west,
+% width,
+% xoffset,
+% xscale,
+% yoffset,
+% yscale,
+% },
+% classoffset=2, % aTableau values
+% keywordstyle=\color{orange},%
+% morekeywords={
+% A, C, DD, AA,
+% beta,
+% bottom,
+% center,
+% centre,
+% contents,
+% false,
+% first,
+% hooks,
+% last,
+% left,
+% residues,
+% right,
+% row,
+% top,
+% true,
+% },
+% classoffset=3, % TikZ and LaTeX commands
+% keywordstyle=\color{teal},%
+% morekeywords={
+% draw,
+% foreach,
+% node,
+% small,
+% tiny,
+% tikz,
+% tikzpicture,
+% tikzset,
+% },
+% classoffset=4,% TikZ keys
+% keywordstyle=\color{red},
+% morekeywords={
+% circle,
+% fill,
+% overlay,
+% picture,
+% radius,
+% remember,
+% style,
+% },
+ classoffset=5, % commands that we want to hide :)
+ keywordstyle=\color{LightSkyBlue!10},
+ morekeywords={
+ bigskip,
+ medskip,
+ newline,
+ par,
+ qquad,
+ quad,
+ smallskip,
+ },
+}
+
+\newcounter{examples}
+\numberwithin{examples}{subsection}
+\newcommand\examplesautorefname{Example}
+
+\NewTCBListing[use counter=examples, number within=subsection,%crefname={Example}{Examples}
+]{example}{ !O{} }{%
+ enhanced,
+ skin=bicolor,
+ colframe=RoyalBlue!70,
+ colbacklower=OldLace,
+ colback=LightSkyBlue!10,
+ colbacktitle=RoyalBlue!70,
+ attach boxed title to top right={xshift=0mm,yshift=-3.1mm},
+ boxed title style={
+ size=small,
+ arc=1mm,
+ bottom=-1mm,
+ sharp corners=northwest,
+ sharp corners=southeast,
+ },
+ title={\tiny\thetcbcounter},
+ sharp corners=northeast,
+ parbox=false,
+ lefthand width=0.34\textwidth,
+ listing style=atableau,
+ parbox=false,
+ parskip=4mm
+ sidebyside,
+ sidebyside align=top seam,
+ sidebyside gap=2mm,
+ text and listing,
+ text outside listing,
+ boxsep = 0pt,
+ left=0mm,
+ #1
+}
+
+\let\thetcolorboxnumber\relax
+
+\DeclareTCBListing[use counter=examples, number within=subsection,%crefname={Example}{Examples}
+]{Example}{ !O{} }{%
+ enhanced,
+ skin=bicolor,
+ colframe=RoyalBlue!50,
+ colbacklower=OldLace,
+ colback=LightSkyBlue!20,
+ colbacktitle=RoyalBlue!70,
+ breakable,
+ width=\textwidth,
+ attach boxed title to top right={xshift=0mm,yshift=-3.1mm},
+ boxed title style={
+ size=small,
+ arc=1mm,
+ bottom=-1mm,
+ sharp corners=northwest,
+ sharp corners=southeast,
+ },
+ title={\tiny\thetcbcounter},
+ sharp corners=northeast,
+ parbox=false,
+ listing style=atableau,
+ text and listing,
+ listing above text,
+ %text outside listing,
+ center lower,
+ #1
+}
+
+% ---------------------------------------------------------------------------
+\NewDocumentCommand\set{ O{} >{\SplitArgument{1}{|}}m }{#1\{\,\SetContents{#1}#2\,#1\}}
+\NewDocumentCommand\SetContents{mmm}{\IfNoValueTF{#3}{#2}{#2\,#1|\,\mathopen{}#3}}
+
+\newcommand\T{\mathsf{t}}
+\newcommand\blam{{\bm{\lambda}}}
+
+% ---------------------------------------------------------------------------
+% manual title
+\makeatletter
+\author{Andrew Mathas}
+\usepackage{tikz}
+\usetikzlibrary{
+ backgrounds,
+ decorations.pathmorphing,
+ matrix,
+ patterns,
+ shadows.blur,
+ shapes.geometric,
+}
+\tikzset{
+ shadowed/.style={
+ blur shadow={shadow blur steps=5},
+ bottom color=RoyalBlue,
+ draw=NavyBlue!70,
+ shade,
+ font=\normalfont\Huge\bfseries\scshape,
+ %rounded corners=8pt,
+ top color=LightSkyBlue!30,
+ },
+ boxes/.style={draw=RoyalBlue,
+ fill=AliceBlue,
+ font=\sffamily\small,
+ inner sep=5pt,
+ rectangle,
+ rounded corners=8pt,
+ text=MidnightBlue,
+ }
+}
+
+% define the heading as a command because it contains \atableau@version
+\newcommand\aTableauHeader{%
+ \begin{center}
+ \begin{tikzpicture}
+ \aTabset{border=false}
+ \draw[shadowed, rounded corners](30mm,0) rectangle node[white]{ } (\paperwidth-30mm,22mm);
+ \begin{scope}[shift={(2.6,-0.2)}]
+ \aTabset{scale=0.5, ribbon style={fill=LightSkyBlue!10}, inner wall=MidnightBlue}
+ \Diagram(4,2) [ribbons={11,12,13,21,23,31,32,33,41,43,51,53}]{} % A
+ \Diagram(5,2) [ribbons={11,12,13,22,32,42,52}]{} % T
+ \Diagram(6,2) [ribbons={11,12,13,21,23,31,32,33,41,43,51,53}]{} % A
+ \Diagram(7,2) [ribbons={11,12,13,21,23,31,32,33,41,43,51,52,53}]{} % B
+ \Diagram(8,2) [ribbons={11,21,31,41,51,52,53}]{} % L
+ \Diagram(9,2) [ribbons={11,12,13,21,31,32,33,41,51,52,53}]{} % E
+ \Diagram(10,2)[ribbons={11,12,13,21,23,31,32,33,41,43,51,53}]{} % A
+ \Diagram(11,2)[ribbons={11,13,21,23,31,33,41,43,51,52,53}]{} % U
+ \end{scope}
+ \node[anchor=west,boxes] at (4cm,0cm) {Andrew Mathas};
+ \node[anchor=east,boxes] at (\paperwidth-4cm,0) {Version \atableau@version};
+ \end{tikzpicture}
+ \end{center}
+}
+
+% ----------------------------------------------------------------------
+\hypersetup{
+ pdfcreator={ Generated by pdfLaTeX },
+ pdfinfo={
+ Author ={ Andrew Mathas },
+ Keywords={ Algebraic combinatorics, representation theory, abacus, Young diagram, tableau, symmetric groups },
+ License ={ LaTeX Project Public License v1.3c or later },
+ Subject ={ LaTeXing tableaux and friends },
+ Title ={ ATableau - \atableau@version }
+ },
+ colorlinks=true,
+ linkcolor=blue,
+ urlcolor=MediumBlue,
+}
+
+\makeatother
+
+% ----------------------------------------------------------------------
+\numberwithin{equation}{subsection}
+\def\equationautorefname~#1\null{(#1)\null}
+\renewcommand\sectionautorefname{Chapter}
+\renewcommand\subsectionautorefname{Section}
+\def\subsubsectionautorefname~#1\null{\S#1\null}
+
+\begin{document}
+
+ % --------------------------------------------------------------
+ % title page
+ \begin{center}
+
+ \aTableauHeader
+
+ \begin{quote}
+ A \LaTeX\ package for symmetric group combinatorics, including Young
+ diagrams, tableaux, tabloids, skew tableaux, shifted tableaux, ribbon
+ tableaux, multitableaux, abacuses.
+ \end{quote}
+
+ \begin{minipage}{0.75\textwidth}
+ \tableofcontents
+ \end{minipage}
+
+ \aTabset{scale=0.6}
+ \tikzset{
+ B/.style={fill=blue,text=white},
+ G/.style={fill=ForestGreen,text=yellow},
+ R/.style={fill=red,text=white},
+ Y/.style={fill=yellow,text=ForestGreen},
+ b/.style={ball color=blue},
+ r/.style={ball color=red},
+ w/.style={ball color=white},
+ }
+ \begin{tikzpicture}
+ \Tableau(0,0){[R]1[B]2,[G]3,[Y]4} \quad
+ \Tableau(2.25,1)[australian]{[R]1[B]2,[G]3,[Y]4} \quad
+ \Tableau(3.5,1.75)[skew={0,2}]{[Y]4[G]3[R]1,[B]2} \quad
+ \Tableau(6,0)[ukrainian,skew={0,1^2}]{[B]2[R]1,[G]3,[Y]4} \quad
+ \Tableau(7.5,-1)[french,skew={0,1^2}]{[B]2[R]1,[G]3,[Y]4} \quad
+ \Tableau(6.0,-2.25)[ukrainian]{[R]1[G]3[Y]4,[B]2} \quad
+ \Tableau(3.5,-3.0)[french]{[R]1[G]3[Y]4,[B]2} \quad
+ \Tableau(2,-1)[australian]{[B]2,[R]1[G]3[Y]4} \quad
+ \Abacus(4,0.5)[abacus ends=--,scale=1.4]{3}{[b]9,[w]8,[r]8,[b]6,[b]6,[r]2,[b]1}
+ \end{tikzpicture}
+
+ \end{center}
+
+ % --------------------------------------------------------------
+ \section{Introduction}
+
+ The package provides commands for drawing common objects in algebraic
+ combinatorics and representation theory, together with styling options
+ and a key-value interface for additional customization. Under the
+ hood, everything is drawn using \TikZ (and \LaTeX3). These commands
+ can be used either as standalone commands or as part of a
+ \keyword{tikzpicture} environment. This package started as code for
+ drawing the diagrams that I need in my own research. It is written as
+ flexibly as possible in the hope that it will draw the diagrams that
+ others need.
+
+ For the impatient, here is a basic example that shows how to use the
+ two main commands provided by the \aTableau package:
+
+ \begin{example}
+ \Abacus{4}{4^3,2,1^2,0} \qquad
+ \Tableau{1239,456{10},78}
+ \end{example}
+
+ If you already know what tableaux and abacuses are, then you can
+ probably work out the (basic) syntax of these two commands from this
+ example and start using the package. If you do not know what tableaux
+ and abacuses are, then you probably don't need this package! In any
+ case, you will not find the precise mathematical definitions of these
+ objects in this manual, so please consult textbooks like
+ \cite{Mathas:ULect,Macdonald} if you need them. For more advanced
+ usage, such as adding styling, I recommend skimming through the
+ manual, and looking at the many examples. \autoref{S:keys} gives
+ quick summary of all \aTableau commands and their options.
+
+ The \aTableau commands are intended to be easy to use and easy to
+ customise. For example, partitions can be entered either as a (weakly
+ decreasing list of non-negative) integers, or using exponential
+ notation, or as a sequence of beta numbers (for the \keyword{\Abacus}
+ command), and tableaux are entered as comma-separated words. The
+ commands support the main conventions for drawing tableaux and
+ diagrams.
+
+ By way of example, the following table shows how to draw a
+ Young diagram of shape $\lambda=(4,3^2,2)$ using the four tableaux
+ conventions supported by \aTableau:
+
+ \begin{center}
+ \aTabset{align=centre}
+ \begin{longtable}{lp{0.6\textwidth}l} \toprule % longtable allows footnotes
+ \textcolor{aTableauMain}{Convention} &\textcolor{aTableauMain}{\aTableau command} & \textcolor{aTableauMain}{Picture} \\ \midrule
+ English & \keyword{\Tableau[english]{1234,567,89{10},{11}{12}}}\newline(the default)
+ & \Tableau{1234,567,89{10},{11}{12}}\\[10mm]
+ French & \keyword{\Tableau[french]{1234,567,89{10},{11}{12}}}
+ & \Tableau[french]{1234,567,89{10},{11}{12}}\\[10mm]
+ Ukrainian
+ \footnote{Some authors call this the Russian convention. The \option{russian}(ukrainian) key may also be used.}
+ & \keyword{\Tableau[ukrainian]{1234,567,89{10},{11}{12}}}
+ & \Tableau[ukrainian]{1234,567,89{10},{11}{12}}\\[10mm]
+ Australian
+ \footnote{I have not seen a name for this convention in the literature. Calling this the \textit{Australian convention} seems apt.}
+ & \keyword{\Tableau[australian]{1234,567,89{10},{11}{12}}}
+ & \Tableau[australian]{1234,567,89{10},{11}{12}} \\[10mm]
+ \bottomrule
+ \end{longtable}
+ \index{english@English}
+ \index{french@French}
+ \index{ukrainian@Ukrainian}
+ \index{australian@Australian}
+ \end{center}
+
+ This table shows how the commands provided by \aTableau work: there
+ are basic commands for drawing pictures, and these pictures can be
+ embellished using optional arguments, which use a key-value interface.
+
+ The different conventions for diagrams, and tableaux, are listed in
+ order of (my perception of) their popularity in the literature. By
+ default, the \textit{English} convention is used, so we can omit
+ \emph{english}:
+ \begin{example}[lefthand width=0.4\textwidth]
+ \Tableau{1234,567,89{10},{11}{12}}
+ \end{example}
+ for the first tableau in the table. These four conventions are used
+ in exactly the same way with the \keyword{\Diagram} command:
+ \begin{example}[lefthand width=0.4\textwidth]
+ \Diagram{4,3,3,1} \qquad
+ \Diagram[ukrainian]{4,3^2,1}
+ \end{example}
+ This example shows that partitions can either be typed out in full, as
+ a comma-separated list of positive integers, or using exponential
+ notation, which is usually shorter and easier to read.
+
+ To use the package, add the following line to your document preamble:
+
+ \indexcmd{usepackage}
+ \begin{quote}
+ \keyword{\usepackage[options]{atableau}}
+ \end{quote}
+
+ Here, the \textit{options} is an optional comma-separated list of
+ \aTableau options, or keys. We describe the possible options below.
+ For example, to make the tableaux and Young diagrams commands use the
+ \option{French} convention, by default, you could write:
+
+ \begin{quote}
+ \keyword{\usepackage[french]{atableau}}
+ \end{quote}
+
+ You can change the default options at any point in your document using
+ the \keyword{\aTabset} command, and you can change them for any
+ diagram.
+ \indexcmd{aTabset}
+
+ Each of the \aTableau commands is designed to be easy to use, easy to read,
+ and easy to customise. Each command accepts an optional list
+ of key-value options that modify and embellish the diagrams. In addition, optional
+ styling can be applied to entries of a tableau and the beads in an
+ abacus. Each command can be used as a standalone object in a
+ document, or they can be incorporated into a larger
+ \keyword{tikzpicture} environment, making it possible to use
+ these commands to create more complicated pictures.
+
+ The general syntax of an \aTableau command is:
+ \begin{quote}
+ \keyword{\Command (x,y) [options] {...specifications...}}
+ \end{quote}
+
+ \index{Cartesian coordinates}
+ The $(x,y)$-Cartesian coordinates%
+ \footnote{Currently, only Cartesian coordinates are supported. For
+ example, it is not possible to use named or polar coordinates.}
+ are optional, being necessary if (and only if), the diagram is part of
+ a~\keyword{tikzpicture} environment. See \autoref{SS:coordinates} and
+ \autoref{SS:abcoordinates} for more detail about how to use these coordinates
+ for tableaux and abacuses, respectively.
+
+ The key-value \emph{options}, or \emph{keys}, control the style and
+ appearance of the final diagram. The keys are optional and are
+ described in detail below, with examples. This section emphasises only
+ some of these options together with the fact that every key can be set
+ ``globally'' (inside the current \LaTeX\ group), by using
+ \keyword{\aTabset{...options...}}, or ``locally'', for the current
+ picture. As discussed already, the default options for the entire
+ document can also be set via
+ \keyword{\usepackage[options]{atableau}}.\indexcmd{aTabset}
+
+ Many of the \aTableau options are specific to the particular diagrams
+ being drawn. The full list of the \aTableau commands and their options
+ is given in \autoref{S:keys}, with the following sections giving more
+ details and many examples. The keys that are common to all
+ \aTableau commands are:
+
+ \begin{options}
+ \item[align]\index{align}
+ Sets the baseline for vertically aligning diagrams. The options
+ are \keyword{align=top}, \keyword{align=center}, and
+ \keyword{align=bottom}, which aligns the baseline of the diagram
+ with the top, centre or bottom of the surrounding objects,
+ respectively. By default, all \aTableau pictures are centered.
+
+ \item[math entries, text entries]\index{math entries}\index{text entries}
+ Determines whether tableaux entries, and bead labels, are typeset as
+ mathematics or text.
+
+ \item[name]\index{name}
+ Set the prefix for the \TikZ \emph{named anchors} for the boxes and
+ beads in \aTableau diagrams.
+
+ \item[scale, xscale, yscale, script, scriptscript]
+ \index{scale}\index{xscale}\index{yscale}\index{script}\index{scriptscript}
+ Use \option{scale} to rescale all \aTableau diagrams. Use
+ \option{xscale} to rescale in the $x$-direction and \option{yscale}
+ to rescale in the $y$-direction. The \option{script} and
+ \option{scriptscript} keys can be used to fine-tune the size of
+ \aTableau commands when used as subscripts (rare) and subsubscripts
+ (unlikely).
+
+ \item[styles]\index{styles}
+ A short-hand for defining single-use \TikZ-styles for the current
+ picture.
+
+ \item[tikzpicture]\index{tikzpicture}
+ When used without Cartesian coordinates, all \aTableau commands are
+ implicitly drawn inside a \keyword{tikzpicture} environment. Use
+ \option{tikzpicture=keys} to set the optional argument of this
+ environment: \keyword{\begin{tikzpicture}[ keys ]...\end{tikzpicture}}.
+
+ \item[tikz before, tikz after]\index{tikz before}\index{tikz after}
+ Use the \option{tikz before} and \option{tikz after} keys to inject
+ \TikZ code into the \keyword{tikzpicture} environment, before and
+ after the picture drawn by \aTableau.
+
+ \end{options}
+
+ With boolean options, which are set to \textsf{true} or
+ \textsf{false}, the value can typically be omitted. For example,
+ \option{border} is equivalent to \option{border=true} and to
+ \option{no border=false}. The \option{no border} key is inverse to
+ \option{border}, so \option{no border} is equivalent to \option{no
+ border=true}, and to \option{border=false}.
+
+ \index{American dialect}
+ For all keys, American spelling variations are tolerated. For example, you
+ can use \emph{center} and \emph{color} instead of the correct
+ spellings of \emph{centre} and \emph{colour}, respectively.
+
+ \begin{warning}
+ Unlike the egalitarian \aTableau settings, \TikZ-style settings
+ \emph{do not} countenance English spelling of the English language!
+ \end{warning}
+
+ The next example contrasts using the \keyword{\Diagram} command both
+ outside and inside a \keyword{tikzpicture} environment. More
+ explicitly, the second \keyword{\Diagram} command has Cartesian
+ coordinates because it is being used inside a \keyword{tikzpicture}
+ environment. Otherwise, these two \keyword{\Diagram} commands are
+ identical, except that the second diagram is embellished with labels
+ that are drawn by the other commands in the \keyword{tikzpicture}
+ environment.
+
+ \begin{Example}
+ % \usetikzlibrary{patterns}
+ \tikzset{
+ B/.style={pattern=north east lines, pattern color=blue},
+ G/.style={pattern=north west lines, pattern color=ForestGreen},
+ }
+ \Diagram[ribbons={(G)16ccccrrr, (B)16crrcccr}]{6,5^2,2} % outside tikzpicture
+ \qquad \qquad
+ \begin{tikzpicture} % inside tikzpicture with labels
+ \Diagram(0,0)[ribbons={(G)16ccccrrr, (B)16crrcccr}]{6,5^2,2}
+ % add the labels
+ \draw[->](1.5, 0.5)node[right]{$\alpha=(1,2)$} to [out=180,in=90] (A-1-2.base);
+ \draw[->](1.5,-2.5)node[right]{$f_\alpha=(4,2)$} to [out=180,in=270] (A-4-2.base);
+ \draw[red,<->]([xshift=-1mm]A-1-1.south west)
+ --node[rotate=90,above]{$l_\alpha=3$}([xshift=-1mm]A-4-1.south west);
+ \end{tikzpicture}
+ \end{Example}
+
+ The first diagram shows that most of the right-hand diagram is drawn
+ by the~\keyword{\Diagram} command, even though most of the commands in
+ the example are \TikZ commands. In particular, the shading of the
+ boxes in the \emph{$(1,2)$-hook}, and the \emph{$(1,2)$-rim hook}, is
+ done by the \option{ribbons} key. (In fact, the right-hand picture
+ could be drawn without using a \keyword{tikzpicture} environment by
+ using the \option{tikz after} key to add the three
+ \keyword{\draw}-commands.)
+
+ \begin{warning}
+ Unlike the \TikZ-commands, you should \emph{not} put a semicolon
+ after an \aTableau-command when it is used inside a
+ \keyword{tikzpicture} environment. If you accidentally add a
+ semicolon then, most of the time it will not cause any harm and
+ \TikZ will just give you a warning.
+ \end{warning}
+
+ The top of the last example defines two \TikZ-styles, \textsf{B} and
+ \text{G}, which add the \textsf{b}lue and \textsf{g}reen coloured
+ hatchings of the two hooks. Inside the \keyword{tikzpicture}
+ environment, the Young diagram is placed at position $(0,0)$ by the
+ \keyword{\Diagram} command. The three \keyword{\draw} commands are
+ used to add the three labelled arrows to the picture. Please consult
+ the very readable \TikZ manual for more details on the \TikZ-commands
+ in this example.
+
+ From the viewpoint of \aTableau, the most important point of the last
+ example is that the first \keyword{\Diagram} command is a standalone
+ diagram, whereas the second one is part of a \keyword{tikzpicture}
+ environment because it was given the Cartesian coordinate $(0,0)$. The
+ second important point is that this example uses four \emph{named
+ coordinates}: (\textsf{A-1-1}), (\textsf{A-1-2}), (\textsf{A-4-1}),
+ and (\textsf{A-4-2}). When \aTableau draws a tableau, or a diagram, it
+ creates a \TikZ named coordinate (\textsf{A-r-c}) for every box in the
+ diagram, where (\textsf{A-r-c}) is the box in row~\textsf{r} and
+ column~\textsf{c}. These named coordinates, or anchors, are
+ \textit{only} defined for the boxes in the tableau. Giving finer
+ control, the following standard \TikZ \textit{anchors} are available,
+ depending on which tableaux convention you are using:
+
+ \begin{equation}\label{E:NodeNames}
+ \begin{tikzpicture}[every node/.style={font=\tiny, text=gray}]
+ \Diagram(0,0)[scale=4]{1}
+ \node[label={above:(A-r-c)}] at (A-1-1){$\color{red}\bullet$};
+ \node[label={above:(A-r-c.north)}] at (A-1-1.north){$\color{red}\bullet$};
+ \node[label={below:(A-r-c.south)}] at (A-1-1.south){$\color{red}\bullet$};
+ \node[label={right:(A-r-c.east)}] at (A-1-1.east){$\color{red}\bullet$};
+ \node[label={left:(A-r-c.west)}] at (A-1-1.west){$\color{red}\bullet$};
+ \node[label={above right:(A-r-c.north east)}] at (A-1-1.north east){$\color{red}\bullet$};
+ \node[label={above left:(A-r-c.north west)}] at (A-1-1.north west){$\color{red}\bullet$};
+ \node[label={below right:(A-r-c.south east)}] at (A-1-1.south east){$\color{red}\bullet$};
+ \node[label={below left:(A-r-c.south west)}] at (A-1-1.south west){$\color{red}\bullet$};
+ \end{tikzpicture}
+ \qquad
+ \begin{tikzpicture}[every node/.style={font=\tiny, text=gray}]
+ \Diagram(0,0)[ukrainian, scale=4]{1}
+ \node[label={above:(A-r-c)}] at (A-1-1){$\color{red}\bullet$};
+ \node[label={above:(A-r-c.north)}] at (A-1-1.north){$\color{red}\bullet$};
+ \node[label={below:(A-r-c.south)}] at (A-1-1.south){$\color{red}\bullet$};
+ \node[label={right:(A-r-c.east)}] at (A-1-1.east){$\color{red}\bullet$};
+ \node[label={left:(A-r-c.west)}] at (A-1-1.west){$\color{red}\bullet$};
+ \node[label={above right:(A-r-c.north east)}] at (A-1-1.north east){$\color{red}\bullet$};
+ \node[label={above left:(A-r-c.north west)}] at (A-1-1.north west){$\color{red}\bullet$};
+ \node[label={below right:(A-r-c.south east)}] at (A-1-1.south east){$\color{red}\bullet$};
+ \node[label={below left:(A-r-c.south west)}] at (A-1-1.south west){$\color{red}\bullet$};
+ \end{tikzpicture}
+ \end{equation}
+
+ You can change the prefix \textsf{A} in these anchors using the
+ \option{name} key. Similar anchors are created for abacus beads.
+ These \textit{anchors} are a standard part of \TikZ. If you change
+ the shape of the node, then the available anchors may change; for more
+ information see the \TikZ manual.
+
+% The previous example also shows that the \keyword{\Diagram} command
+% accepts a \option{ribbons} option, which adds one or more
+% \textit{ribbons} to the diagram. Both the ribbon and the individual
+% boxes in the ribbon can be given \TikZ styling; see
+% \autoref{S:RibbonTableaux}. All of the options to these commands are
+% described in the following sections.
+
+ In the example above, the Cartesian coordinate $(0,0)$ is necessary
+ because the \keyword{\Diagram} command is used inside a
+ \keyword{tikzpicture} environment, but the choice of coordinate is not
+ important in the sense that changing the coordinate will not change
+ the picture. Cartesian coordinates become more meaningful when the
+ \keyword{tikzpicture} environment has more components. In the next
+ example, the key \option{name=B} makes the named
+ coordinates for the second diagram take the form (\textsf{B-r-c}),
+ instead of the default node names (\textsf{A-r-c}), which are used in
+ the first diagram. This allows us to draw (wavy) lines between boxes
+ in the two tableaux.
+
+ \begin{example}[lefthand width=0.14\textwidth, sidebyside gap=0mm,label={Ex:ABnames}]
+ % \usetikzlibrary{decorations.pathmorphing}
+ \begin{tikzpicture}[wave/.style={thick,red,->,decorate,decoration=snake}]
+ \aTabset{ribbon style={fill=blue!20, opacity=0.4}}
+ \Diagram(0,0)[e=2,entries=residues,ribbons={13crc}]{3,2}
+ \Diagram(0,-2.5)[e=2,entries=residues,ribbons={12rcr},name=B]{2^2,1}
+ \draw[wave]([shift={(0,-0.05)}]A-2-1.south east)
+ --([shift={(0,0.05)}]B-1-1.north east);
+ \end{tikzpicture}
+ \end{example}
+
+ In this example, the entries in the two tableaux were added by the key
+ \option{entries=residues}, which automatically puts the
+ \option{e}-residue into each of the boxes in the two tableaux. The
+ shading is done by the \option{ribbons} commands. Notice that
+ \option{ribbon style}, which sets the \TikZ-style of the ribbons,
+ includes \keyword{opacity=0.4}. This necessary because the ribbons
+ are drawn \textit{after} the tableau entries; see \autoref{SS:order}.
+ Alternatively, these tableau entries could be included in the ribbon
+ specifications, as described in \autoref{S:RibbonTableaux}.
+
+ The final example in the introduction uses \keyword{\ShiftedTableau}
+ inside a \emph{matrix of nodes}:
+
+ \begin{Example}
+ % \usetikzlibrary{matrix}
+ \begin{tikzpicture}[scale=0.8, arr/.style={->,SteelBlue, thick}]
+ \matrix (M)[matrix of nodes,row sep=4mm,column sep=4mm]{
+ & & & \ShiftedTableau{1234,567} \\
+ & & \ShiftedTableau{1235,467}
+ & & \ShiftedTableau{1243,567}\\
+ & \ShiftedTableau{1236,457}
+ & & \ShiftedTableau{1245,367}
+ & & \ShiftedTableau{1253,467}\\
+ \ShiftedTableau{1237,456}
+ & & \ShiftedTableau{1246,357}
+ & & \ShiftedTableau{1254,367}\\
+ & \ShiftedTableau{1247,356}\\
+ };
+ \draw[arr](M-1-4)--node[above]{$\sigma_4$}(M-2-3);
+ \draw[arr](M-1-4)--node[above]{$\sigma_3$}(M-2-5);
+ \draw[arr](M-2-3)--node[above]{$\sigma_5$}(M-3-2);
+ \draw[arr](M-2-3)--node[above]{$\sigma_3$}(M-3-4);
+ \draw[arr](M-2-5)--node[above]{$\sigma_4$}(M-3-6);
+ \draw[arr](M-3-2)--node[above]{$\sigma_6$}(M-4-1);
+ \draw[arr](M-3-2)--node[above]{$\sigma_3$}(M-4-3);
+ \draw[arr](M-3-4)--node[above]{$\sigma_5$}(M-4-3);
+ \draw[arr](M-3-4)--node[above]{$\sigma_4$}(M-4-5);
+ \draw[arr](M-3-6)--node[above]{$\sigma_3$}(M-4-5);
+ \draw[arr](M-4-1)--node[above]{$\sigma_3$}(M-5-2);
+ \draw[arr](M-4-3)--node[above]{$\sigma_6$}(M-5-2);
+ \end{tikzpicture}
+ \end{Example}
+
+ Notice that even though the \keyword{\SkewTableau} commands are being
+ used inside a \keyword{tikzpicture} environment they do not need
+ coordinates because the skew tableaux are being placed by the \TikZ
+ \keyword{\matrix} command. That is, the \keyword{\SkewTableau}
+ commands are not explicit components of the \keyword{tikzpicture}
+ environment as hey are all (implicitly) inside \TikZ-nodes.
+
+ The following sections describe the commands defined by the \aTableau
+ package and how to use them. We start with the \keyword{\Tableau}
+ command because all of the diagram and tableau commands, except for
+ \keyword{\RibbonTableau}, are derived from \keyword{\Tableau}.
+
+
+ \begin{warning}
+ The \aTableau package relies heavily on \ctan{LaTeX3}, so it
+ requires an update-to-date version of \LaTeX. You may need to update
+ your \LaTeX\ installation if it is older than \TeX Live 2024.
+ \end{warning}
+
+ % --------------------------------------------------------------
+ \section{Tableaux and Young diagrams}
+
+ \emph{Partitions} are weakly decreasing sequences of non-negative
+ integers. They are fundamental objects in algebraic combinatorics
+ and representation theory.\index{partition} Rather than working
+ with sequences of integers, it is often useful to visualise
+ partitions as Young \emph{diagrams}, which are arrays of
+ \emph{boxes}, or \emph{nodes}, in the plane\footnote{In this manual,
+ we normally refer to the entries of tableaux and diagrams as
+ \textit{boxes}, rather than \textit{nodes}. This is to avoid any
+ ambiguity with \TikZ-nodes.}. A \emph{tableau} is a (Young) diagram
+ where the boxes are labelled using some alphabet. Equivalently, a
+ diagram is a tableau with empty labels.
+ \index{young diagram@Young diagram|see{diagram}}
+ \index{diagram}
+ \index{tableau}
+ \index{box}
+ \index{node}
+ \index{node|see{box}}
+ \index{exponential notation}
+ \index{partition!exponential notation}
+
+ For example, $\lambda=(4,3,3,2,0,0,\dots)$ is a partition of $12$,
+ since the entries sum to~$12$. It is customary to omit the zeros
+ when writing partitions and to use exponents for repeated parts, so
+ we can write this partition in \emph{exponential notation} as
+ $\lambda=(4,3^2,2)$. Many authors identity a
+ partition~$\lambda=(\lambda_1,\lambda_2,\dots)$ with its
+ \emph{diagram}, which is the set $[\lambda] = \set{(r,c)|1\le
+ c\le\lambda_r\text{ for }r\ge1}$. When using the \emph{English
+ convention}, the diagram of~$\lambda$ is visualised as a left
+ justified array of boxes in the plane, where the first row has~$4$
+ boxes, the next two lower rows have~$3$ boxes and the last row
+ has~$2$ boxes. The \emph{shape} of a diagram is the partition that
+ gives the number of boxes in each row. Diagrams and tableaux drawn
+ using the \emph{French} convention are given by reflecting in a
+ horizontal line above the diagrams, whereas the \emph{Ukrainian} and
+ \emph{Australian} conventions are given by appropriately rotating
+ these diagrams. All of these conventions are used in the literature,
+ with some papers using more than one convention.
+
+ % --------------------------------------------------------------
+ \subsection{Tableaux}
+ \indexcmd{Tableau}
+ \label{S:Tableau}
+ This section describes the \keyword{\Tableau} command, which draws
+ tableaux or labelled diagrams. The syntax of this command is:
+
+ \keyword{\Tableau (x,y) [options] {tableau entries}}
+
+ where:
+
+ \begin{options}
+ \item[*$(x,y)$]\index{xy@$(x,y)$} The Cartesian coordinates $(x,y)$
+ are needed if, and only if, the tableau is a component of a
+ \keyword{tikzpicture} environment.
+ \item[*options] Optional arguments. Described, with examples, below.
+ \item[*tableau entries]\index{tableau entries} The
+ \keyword{tableau entries} are given as a comma-separated list, with commas
+ separating rows and each \textit{token}, or braced-group of
+ tokens, being in a separate column. As we explain below, each
+ tableau entry can be prefixed by (optional) \TikZ-styling
+ specifications.
+ \end{options}
+
+ We show by example how to use the \keyword{\Tableau} command,
+ starting with basic usage and finishing with style. Inside
+ \keyword{\Tableau}\!, the rows are separated by commas, with the
+ columns given by the ``letters'' in the word for each row:
+
+ \begin{example}
+ \Tableau{ 1234, 56, 7, 8 } \qquad
+ \Tableau{ \alpha\gamma\delta q,
+ xy\eta,
+ \lambda\mu,
+ \pi\sum }
+ \end{example}
+
+ The tableau specifications can be put on a single line, without any
+ spaces. Alternatively, as shown here, spaces and line breaks can be
+ added to improve readability. The one restriction is that you cannot
+ have blank lines inside a \keyword{\Tableau} command. As this example
+ suggests, by default, the entries in a tableau are typeset in
+ mathematics-mode, but this can be changed using the
+ \option{text entries} key, which is described below.
+
+ As the examples above show, the tableau entries can be individual
+ characters, or they can be \TeX\ commands. Tableaux frequently contain
+ entries that are not single characters, or given by commands. Such
+ entries can be added to a tableau by enclosing them in braces:
+
+ \begin{example}
+ \Tableau{ 13{10}{11}{2x}, 2{x^2}, {r_1} }
+ \end{example}
+
+ % There is one additional caveat for braced-entries: any
+ % \textit{singleton} braced entry \keyword{{...}} in a row needs to be
+ % \textit{double-braced}. Double-bracing is only necessary when you have
+ % a row that has only one column, and you have a multi-letter column
+ % entry. The need for double-bracing is a consequence of how \LaTeX3
+ % detects braced commas in comma-separated lists.
+ % \index{tableau entries!double-braced}
+ % \index{double-braced}
+
+ % The following example shows the difference between single and
+ % double-bracing for tableau entries.
+ % \index{tableau entries!double-braced}
+
+ % \begin{example}
+ % \Tableau{ 1345, 8{10}, {11}, {12} } \qquad
+ % \Tableau{ 1345, 8{10}, {{11}}, {{12}} }
+ % \end{example}
+
+ % The $10$'s in these tableaux do not need to be doubled-braced because
+ % they appear in a row of length~$2$, whichi s greater than~$1$!. In
+ % contrast, because they are not doubled-braced, the~$11$ and~$12$ in
+ % the first tableau are both treated as being two characters in
+ % different columns in the first tableau. In the second tableau,
+ % the~$11$ and~$12$ each appear in a separate column because they are
+ % double-braced.
+
+ % --------------------------------------------------------------
+ \subsubsection{Adding style}
+ \index{star}
+ \index{*|see{star}}
+ \index{tableau entries!style}
+ \index{tableau entries!star}
+
+ The \aTableau package provides several different ways to add \TikZ
+ style specifications to the boxes in diagrams and tableaux. This is
+ done by adding style prefixes to the tableau entries. To take
+ advantage of these styles you need to have at least rudimentary
+ knowledge of \TikZ-styling. The examples in this manual might be
+ enough to get you started as they give a good indication of what is
+ possible. For anything more exotic, please consult the \TikZ manual.
+
+ The simplest way to change the style of an entry in a tableau is to
+ add a $*$-prefix to the entry:
+
+ \begin{example}
+ \Tableau{ 1*2*3*4*5, 6*789, {10}*{11}{12}, {13} }
+ \end{example}
+
+ In this tableau, there is an asterisk before each of the entries $2$,
+ $3$, $4$, $5$ and $8$, which gives the corresponding boxes the
+ \option{star style}. The $*$-entries are given the
+ \TikZ-styling, which is \keyword{fill=}\aTableauColour{StarStyle} by default. You can
+ change the default $*$-style using the \option{star style} key:
+
+ \begin{example}
+ \Tableau[star style={fill=red!20,draw=red,thick}]
+ { 1*2*3*4*5, 6*789, {10}*{11}{12}, {13} }
+ \end{example}
+
+ Note that the $*$-styling overrides the default styling of the
+ surrounding boxes. This is because the boxes with the default styling
+ are placed first, in the order that they are entered, after which the
+ boxes with custom styles are placed.
+
+ The $*$-syntax is a quick shorthand for adding emphasis to some boxes
+ in a tableau, but all of the $*$-entries are given the same style.
+ It is possible to give every box in the tableau different styles by
+ putting \TikZ-styling specifications inside square brackets,
+ \keyword{[...]}, before the corresponding letter in the tableau
+ specification. You can mix the $*$-syntax and the
+ \keyword{[...]}-style syntax for different entries, although only one
+ of these style settings can be applied to any given box.
+
+ \begin{example}
+ \Tableau[french]{
+ 1 [blue!20]2 [circle]3 [red]4 [cyan]5,
+ 6 *7 8 9,
+ {10} *{11} {12},
+ {13} }
+ \end{example}
+
+ It is not necessary to add spaces between the entries in the way that
+ this example does. This is done only to make it clearer how the
+ style specifications are applied to the different entries in the tableau.
+
+ Omitting some technicalities, each box in a tableau is constructed as
+ a \TikZ node, so any \TikZ-styling specifications for a node can be
+ used. This example shows that some care is needed when changing the
+ style because simply giving a colour changes both the colour used to
+ \textit{fill} the box and the \textit{text colour}, which is why some
+ of tableau entries in the last example appear to be blank. If you are
+ already familiar with \TikZ then you probably already know what to do.
+ If not, then here is a short list of useful style specifications for
+ \TikZ nodes:
+ \begin{center}\index{fill}\index{text}\index{draw}\index{font}
+ \begin{tabular}{ll}\toprule
+ Style & Meaning \\\midrule
+ \keyword{draw}$=\langle\text{colour}\rangle$
+ & Sets the boundary colour of the node\\
+ \keyword{fill}$=\langle\text{colour}\rangle$
+ & Sets the fill, or background, colour of the node\\
+ \keyword{font}$=\langle\text{font commands}\rangle$
+ & Sets the font \\
+ \keyword{opacity}$=\langle\text{value}\rangle$
+ & Sets both the drawing and filling opacity to $=\langle\text{value}\rangle$\\
+ \keyword{text}$=\langle\text{colour}\rangle$
+ & Sets the text colour in the node \\
+ \bottomrule
+ \end{tabular}
+ \end{center}
+ In the style settings, any valid \LaTeX\ colour name can be used; see, for
+ example, the \ctan{xcolor} manual. In addition, the style specifications
+ \keyword{thin}\!,
+ \keyword{thick}\!,
+ \keyword{very thick}\!,
+ \keyword{ultra thick}\!,
+ \keyword{dashed}\!,
+ \keyword{dotted}\!, $\dots$.
+ change the border thickness, and its properties.
+ \autoref{SS:TableauOptions} below describes how to use these options
+ to customise the tableau style.
+
+ If you want to apply ``complicated'' style settings, such as
+ \keyword{draw=cyan,ultra thick}, which consists of a comma-separated
+ list of $\TikZ-$style settings, then the entire style must be put
+ inside matching square brackets and curly braces \keyword{[{...}]}.
+ This is necessary to ensure that \LaTeX\ does not get confused by the
+ commas in the style setting (since commas are also used to separate
+ the rows of the tableau).
+
+ \begin{example}
+ \Tableau[australian]{
+ 1 [fill=blue!20]2 3 [text=red]4 5,
+ [{circle,fill=orange}]6 *7 8 9,
+ [{draw=cyan,ultra thick}]{10} *{11} {12},
+ [{dashed,draw=red,ultra thick}]{13} }
+ \end{example}
+
+ % The last example shows that it is not necessary to double-brace
+ % singleton entries when they have a style specification.
+
+ This example shows that modifying the borders of a box is problematic
+ because boxes placed later are likely to overwrite the new border
+ style (see \autoref{SS:order}). As a result, modifying the borders of
+ the boxes is often not a good way to add emphasis to a tableau, so
+ use this sparingly. In addition, the orange circle in this example
+ looks too big, but it is what we asked for because the diameter of the
+ circle is the horizontal width of the box. The next example shows that
+ we get a better result with \textit{minimum size} specification when
+ using the \textit{Australian} and \textit{Ukrainian} conventions for
+ tableaux.
+
+ For complex or frequently used styles, we recommend using the
+ \keyword{\tikzset} command to define the style outside of the
+ \keyword{\Tableau} command. This makes your code both easier to read
+ and easier to change. If you need to define a style for a single
+ picture, then you can also use the \option{styles} key.
+
+ \begin{example}[lefthand width=0.3\textwidth]
+ \tikzset{
+ B/.style={fill=blue!40, text=yellow},
+ G/.style={fill=green!80!blue,circle,minimum size=5mm},
+ R/.style={fill=red,text=white, font=\tiny},
+ Y/.style={fill=yellow!20, text=blue}
+ }
+ \Tableau[french]{[R]1[B]2,[G]3,[Y]4} \quad
+ \Tableau[ukrainian]{[R]1[B]2,[G]3,[Y]4} \newline
+ \Tableau[english]{[R]1[B]2,[G]3,[Y]4} \quad
+ \Tableau[australian]{[R]1[B]2,[G]3,[Y]4}
+ \end{example}
+
+ In this example, the \TikZ-styles \textsf{B}, \textsf{G} \textsf{R},
+ and \textsf{Y} are applied to the tableaux entries labelled $1$, $2$,
+ $3$, and $4$, respectively. Note the use of \emph{minimum size} to
+ control the size of the circle. The colours used here, and throughout
+ this manual, are for demonstration purposes only. I recommend against
+ such garish choices in any self-respecting document!
+
+ % --------------------------------------------------------------
+ \subsubsection{Tableau coordinates}\label{SS:coordinates}
+ \index{xy@$(x,y)$}
+ \index{Cartesian coordinates!tableau}
+
+ The $(x,y)$-coordinates are required if, and only if, the
+ \keyword{\Tableau}command is used inside a \keyword{tikzpicture}
+ environment, in which case $(x,y)$ gives the coordinates of the
+ ``outside corner'' of the box in row~$1$ and column~$1$ of the
+ tableau. The following example shows how tableaux are placed using
+ $(x,y)$-coordinates inside a \keyword{tikzpicture} environment. The example
+ also shows that, by default, the tableau boxes are square and half a unit wide.
+
+ \tikzset{
+ add grid/.code = {
+ % draw coordinate axes
+ \draw[help lines, step=0.5,thin, LightGrey](-0.5,-1.5) grid (4,2.5);
+ \draw[help lines, step=1,thin, Grey](-0.5,-1.5) grid (4,2.5);
+ \foreach \pt in {0,...,3} {
+ \node[below,font=\tiny] at (\pt,-1.5){$\pt$};
+ }
+ \foreach \pt in {-1,...,2} {
+ \node[left, font=\tiny] at (-0.5,\pt){$\pt$};
+ }
+ }
+ }
+
+ \begin{example}
+ \begin{tikzpicture}[add grid]
+ \Tableau(0,0) [english] {123,45}
+ \Tableau(0,0.5) [french] {123,45}
+ \Tableau(2.5,0.5)[ukrainian] {123,45}
+ \Tableau(2.5,0) [australian]{123,45}
+ \end{tikzpicture}
+ \end{example}
+
+ % --------------------------------------------------------------
+ \subsubsection{Tableau keys}
+ \label{SS:TableauOptions}
+
+ The optional $*$-styles and $[\ldots]$-styles are the main mechanism
+ for styling the individual boxes in a tableau. Using a key-value
+ syntax, you can change aspects of the tableau produced by the
+ \keyword{\Tableau} command. The rest of this section describes these
+ keys, their default values, and gives examples of how to use them.
+
+ The options below can be applied to the \keyword{\Tableau}
+ command by giving them as a comma-separated list inside square
+ brackets:
+ \begin{center}
+ \keyword{\Tableau [options] {tableau entries}}\quad or \quad
+ \keyword{\Tableau (x,y) [options] {tableau entries}}.
+ \end{center}
+ The options can appear in any order, with later options having
+ precedence over earlier ones.
+
+ When used inside a \keyword{\Tableau} command, the options only affect
+ that particular tableau. Most of these options, or keys, can also be
+ used in the \keyword{\aTabset} command, to change the default settings
+ of all tableaux in the same \LaTeX\ group, or as optional arguments in
+ \keyword{\usepackage[..]{atableau}}, to change the default settings
+ for the entire document. For example, if you put the command
+ \keyword{\aTabset[ukrainian]} in the preamble of your document then,
+ by default, all subsequent tableaux and Young diagrams will be drawn
+ using the Ukrainian convention.
+
+ \option[-]{english}
+ \option*[]{french}
+ \option*[]{ukrainian}
+ \option*[]{australian}
+
+ These four (mutually exclusive) options change the convention, or
+ orientation, that is used when drawing the tableaux. Rather than
+ defining these conventions precisely, we use the tired and true method
+ in combinatorics of defining by example.
+
+ \begin{example}[lefthand width=0.3\textwidth]
+ \Tableau[ukrainian, styles={R={fill=red!20,draw=red}}]
+ {12[R]3,45}
+ \end{example}
+
+ \begin{example}[lefthand width=0.3\textwidth]
+ \tikzset{R/.style={fill=red!20, circle, draw=red, ultra thick}}
+ \Tableau[french]{12[R]3,45}
+ \end{example}
+
+ \begin{example}[lefthand width=0.3\textwidth]
+ \tikzset{B/.style={fill=blue!20, dashed, thick}}
+ \Tableau[english]{12[B]3,45}
+ \end{example}
+
+ \begin{example}[lefthand width=0.3\textwidth]
+ \Tableau[australian, styles={B={fill=blue!20, text=white}}]
+ {12[B]3,45}
+ \end{example}
+
+ Changing the convention sets the \option{box height} and \option{box
+ width}, relative to the current \option{scale}. If you want to use a
+ custom box height and box width, then you need to set them
+ \emph{after} specifying the convention.
+
+ By default, the \option{english} convention is used to draw tableaux
+ and Young diagrams. The default convention can be changed using
+ \keyword{\aTabset}. Capitalised names, \keyword{Australian}\!,
+ \keyword{English}\!, \keyword{French} and \keyword{Ukrainian}\!, are also
+ recognised. If, for example, your document is only going to draw
+ \option{french} tableaux and diagrams, then you can specify this when
+ you load the package using \keyword{\usepackage[french]{atableau}}\!,
+ or by adding \keyword{\aTabset{french}} to your document preamble.
+
+ \option[centre]{align=value}[centre/bottom/top]
+
+ By default, the baseline of a tableau is its centre. This can be
+ changed using the \option{align} key.
+
+ \begin{example}
+ % the default
+ Some \Tableau[align=centre]{124,357,68} words
+ \end{example}
+
+ \begin{example}
+ Some \Tableau[align=top]{124,357,68} words
+ \end{example}
+
+ \begin{example}
+ Some \Tableau[align=bottom]{124,357,68} words
+ \end{example}
+
+ Similarly, use \option{align} to control how tableaux are aligned
+ in displayed equations.
+
+ \begin{example}
+ \aTabset{align=bottom}
+ \Tableau{124,357,68}\qquad
+ \Tableau{124,35}
+ \end{example}
+
+ \begin{example}
+ % by default: align=centre
+ \Tableau{124,357,68}\qquad
+ \Tableau{124,35}
+ \end{example}
+
+ \begin{example}
+ \aTabset{align=top}
+ \Tableau{124,357,68}\qquad
+ \Tableau{124,35}
+ \end{example}
+
+ \option[true]{border}[true/false] \newline
+ \option[false]{no border}[false/true]
+
+ The \option{border} and \option{no border} keys enable and disable The
+ \option{no border} key is inverse to \option{border}, so \option{no
+ border} is equivalent to \option{no border=true}the drawing of the
+ (thick) border wall around a tableau.
+
+ \begin{example}
+ \Tableau[ukrainian, border=false]{123,455,674} \qquad
+ \Tableau[french, no border]{123,455,674} \qquad
+ \end{example}
+
+ \option[\aTableauColour{Main}]{border colour=colour}[a \LaTeX~colour]
+ \option*[thick, line~cap=rect]{border style=style}[\TikZ-styling]
+
+ The \option{border colour} option sets the colour of the border wall,
+ whereas \option{border style} sets the \TikZ-styling of the border wall.
+ (So, \option{border style} can override \option{border colour}.)
+
+ \begin{example}
+ \Tableau[ukrainian, border colour=red]{123,455,674} \qquad
+ \Tableau[french, border style={dashed,orange}]{123,455}
+ \end{example}
+
+ The \option{border style} key \emph{appends} any \TikZ-styles to the
+ current styling of the wall.
+
+ % nodes
+ \option[none]{box fill=colour}[a \LaTeX~colour]
+
+ The \option{box fill} option sets the background colour of a box in a
+ tableau, which is used in exactly the same way as the \textsf{fill} key for a \TikZ-node. If you use
+ a dark fill colour, then you will almost certainly want to change the
+ text colour using the \option{box text} key -- and you may also want to
+ change the colours of the border walls and inner walls using
+ \option{border colour} and \option{inner wall}, respectively.
+
+ \begin{example}
+ \Tableau[box fill=blue, box text=yellow]{123,455,674} \qquad
+ \Tableau[box fill=red!10]{123,455}
+ \end{example}
+
+ \option[]{box font=font command}[\LaTeX\ font command]
+
+ The \option{box font} key sets the font used to type the entries of a
+ tableau. By default, tableau entries are typeset as mathematics, so
+ this is mainly useful for changing the font size (because, for example
+ \keyword{\bfseries $1$} does not make the $1$ bold). It is only when
+ you are using \option{text entries} that font commands like
+ \keyword{\itshape} and \keyword{\bfseries} will have any effect.
+
+ \begin{example}
+ \Tableau[box font=\tiny]{123,455,674} \qquad
+ \Tableau[text entries, box font=\bfseries]{123,455}
+ \end{example}
+
+ \option[0.5]{box height=number}[a decimal giving the height in \unit{cm}]
+ \option*[0.5]{box width=number}[a decimal giving the width in \unit{cm}]
+
+ Sets the width and height of the boxes in the tableau. The default
+ height and width of the boxes is \qty{0.5}{cm} when using the
+ \option{english} and \option{french} conventions and
+ \qty{0.7012}{cm}, which is approximately $1/\sqrt{2}$\unit{cm}, when
+ using the \option{ukrainian} and \option{australian} conventions. (In
+ all cases, the default side length of the boxes is \qty{0.5}{cm}.)
+
+ \begin{example}
+ \aTabset{align=top}
+ \Tableau[box height=0.8]{123,455,674} \qquad
+ \Tableau[box width=0.2, ukrainian]{123,455}
+ \end{example}
+
+ The \option{box height} and \option{box width} keys need to be set
+ \emph{after} changing the tableau convention using
+ \option{australian}, \option{english}, \option{french}, or
+ \option{ukrainian} because the conventions change the height and width
+ of the tableau boxes (and later conventions override earlier ones). In
+ particular, in the last example, \option{box width=0.2} has no effect
+ because following \option{ukrainian} key sets the box width to
+ \qty{0.7012}{cm}.
+
+ \begin{example}
+ \aTabset{align=top}
+ \Tableau[box height=0.3]{123,455,674} \qquad
+ \Tableau[ukrainian, box width=0.3]{123,455}
+ \end{example}
+
+ See also the \option{scale}, \option{xscale} and \option{yscale}
+ options.
+
+ \option[\aTableauColour{Main}]{box text=colour}[a \LaTeX~colour]
+
+ As for a \TikZ-nodes, use \option{box text} to set the default text
+ colour for the entries of the tableau boxes.
+
+ \begin{example}
+ \Tableau[box text=red]{123,45} \qquad
+ \Tableau[box text=blue, french]{123,45}
+ \end{example}
+
+ \option[]{box style=style}[\TikZ~styling]
+
+ All of the preceding keys for tableau boxes can be overridden by using
+ \option{box style} to set the style of the tableau boxes directly.
+
+ \begin{example}
+ \Tableau[box style={text=red, draw=orange,shape=circle}]{123,45} \qquad
+ \Tableau[box style={font=\small}, french]{123,45}
+ \end{example}
+
+ \option[false]{conjugate}[false/true]
+
+ Draws the \emph{conjugate} tableau, where the rows and columns are
+ swapped.
+
+ \begin{example}
+ \Tableau{123,45,67} \qquad
+ \Tableau[conjugate]{123,45,67}
+ \end{example}
+
+ \option[centre]{halign=value}[centre, left, right]
+ \option*[centre]{valign=value}[bottom, centre, top]
+
+ By default, the entries in tableaux are centered, both horizontally
+ and vertically, and it is your responsibility to ensure that the
+ entries fit inside the tableau boxes (you can change the box
+ dimensions using the \option{box height}, \option{box width} and
+ \option{scale} keys). The \option{halign} and \option{valign} keys
+ provide a crude way to change the horizontal and vertical alignment of
+ the box entries.
+
+ \begin{example}
+ \Tableau[halign=left]{1{11}{11},{11}1} \quad
+ \Tableau[halign=centre]{1{11}{11},{11}1} \quad
+ \Tableau[halign=right]{1{11}{11},{11}1}
+ \end{example}
+
+ \begin{example}
+ \Tableau[valign=bottom]{qf,gpt,jb} \quad
+ \Tableau[valign=centre]{qf,gpt,jb} \quad
+ \Tableau[valign=top]{qf,gpt,jb}
+ \end{example}
+
+ These keys are provided for completeness only. We recommend not using them!
+
+ \option[\aTableauColour{Inner}]{inner wall=colour}[\LaTeX~colour]
+ \option*[thin, line cap=rect]{inner style=style}[\TikZ-styling]
+
+ The \option{inner wall} option sets the colour of the inner wall,
+ whereas \option{inner style} sets the \TikZ-styling of the inner wall.
+ (In particular, \option{inner style} can be used to override
+ \option{inner wall}.)
+
+ \begin{example}[label=Ex:dashed]
+ \Tableau[australian, inner wall=red]{123,455,674} \qquad
+ \Tableau[inner style=dashed]{123,455}
+ \end{example}
+
+
+ \index{dashed}
+ \index{style!dashed}
+ If you look closely at the second tableau in \autoref{Ex:dashed}, you will
+ notice that the dashes are not very clean. This is because, for
+ example, the dashes on bottom of one box do not properly match up with
+ the dashes on the top of the adjacent box below it. Rather than
+ using \option{inner style=dashes} it is better to use something like
+ \option{inner style=\{dash pattern=on 1pt off 2pt\}}.
+
+ \begin{example}
+ \Tableau[inner style={dash pattern=on 1pt off 2pt}]
+ {123,455}
+ \end{example}
+
+ You can use \option{inner wall=none}, to remove the inner tableau walls. Alternatively, use \option{no boxes}.
+
+ \begin{example}
+ \Tableau[ukrainian, inner wall=none]{123,45,67} \qquad
+ \Tableau[ukrainian, no boxes]{123,45,67}
+ \end{example}
+
+ \option[none]{label=text}[any character/text]
+ \option*[font=\textbackslash scriptsize, text=\aTableauColour{Inner}]{label style=style}[\TikZ-styling]
+
+ The \option{label} key adds a label to a tableau next to the
+ $(1,1)$-box. The style of the label can
+ be changed using the \option{label style} key.
+
+ \begin{example}
+ \Tableau[ukrainian, label={\mathtt{t}}]{13,25,4} \quad
+ \Tableau[french, label=0, label style={red}]{13,5} \quad
+ \Tableau[label style={draw=orange,circle, inner sep=0pt,
+ minimum size=2mm}, label=1] {12,35,5}
+ \end{example}
+
+ Like tableau entries, \option{label} is typeset as mathematics by default .
+
+ \option[true]{math entries}[true/false]
+ \option*[false]{text entries}[true/false]
+
+ Use the \option{math entries} and \option{text entries} keys to have
+ the tableau entries typeset as either mathematics or text,
+ respectively. By default, the entries of a tableau are typeset as
+ mathematics.
+
+ \begin{example}
+ \Tableau[math entries]{ABCD, efg, HI}\qquad% the default
+ \Tableau[text entries]{ABCD, efg, HI}
+ \end{example}
+
+ \option[A]{name=text}[string]
+
+ By default, the boxes can be referenced using the node names
+ \textsf{(A-1-1)}, \textsf{(A-1-2)}, \textsf{(A-1-3)}, \dots, with
+ \textsf{(A-$r$-$c$)} referring to the box in row~$r$ and column~$c$.
+ Use \option{name} to change the \emph{prefix} \textsf{A} to
+ anything else that you like. This feature is most useful when you
+ have several tableaux inside a \keyword{tikzpicture} environment
+ because by using \option{name} you can refer to boxes in the different
+ diagrams. If you only have one tableau, then you would not normally
+ need to change the default prefix for the node names. See
+ \autoref{E:NodeNames} for a description of the extended anchor names.
+ For examples using node names and anchors see \autoref{Ex:ABnames},
+ \autoref{Ex:pointing} and \autoref{Ex:waves}.
+
+ \option[]{paths=path specifications}[list of paths]
+ \option*[]{path style=style}[\TikZ-styling]
+
+ Use the \option{paths} key to add a comma-separated list of
+ \emph{ribbon paths} to the tableau. This allows you to draw certain
+ types of paths inside your tableaux and diagrams.
+
+ Ribbon paths are specified using the \keyword{\RibbonTableau} syntax,
+ where you first specify the row and column indices of the \emph{head}
+ of the ribbon, which is the unique node of maximal content in the
+ ribbon, and then give a sequence of \textsf{r}'s and \textsf{c}'s
+ depending on whether the row index increases, or the column index
+ decreases, respectively. As always, you have the option of adding
+ style --- and you can also specify the contents of each box in the
+ ribbon. For more details about the ribbon specifications, with
+ examples, see \autoref{S:RibbonTableaux}, which describes the
+ \keyword{\RibbonTableau} command.
+
+ \begin{example}
+ \Tableau[styles={R={red,thick}, C={cyan,thick}},
+ paths={(R)14ccrc,(C)23rcc}]{1234,567,89{10}}
+ \end{example}
+
+ The \option{path style} key changes the default style of the path:
+
+ \begin{example}
+ \Tableau[styles={R={red,thick}, C={cyan,thick}},
+ paths={(R)14ccrc,(C)23rcc},
+ path style={rounded corners}]{1234,567,89{10}}
+ \end{example}
+
+ \option[]{path box=text}[a node entry]
+ \option*[]{path box style=style}[\TikZ-styling]
+
+ The \option{path box} sets the default entry for every box on a path.
+ The \option{path box} is only used if you have not specified a box
+ entry as a subscript in the path/ribbon specification. This key is
+ useful if you want to mark all of the boxes in every path with the
+ same symbol.
+
+ \begin{example}
+ \tikzset{R/.style={red,thick},C/.style={cyan,thick}}
+ \Tableau[paths={(R)14ccrc,(C)23rcc},
+ path box=\bullet
+ ]{1234,567,89{10}}
+ \end{example}
+
+ Use \option{path box style} to change the style of the boxes in
+ the path.
+
+ \begin{example}
+ \Tableau[styles={R={red,thick}, C={cyan,thick}},
+ paths={(R)14ccrc,(C)23rcc},
+ path box style={draw,circle, minimum size=4mm}
+ ]{1234,567,89{10}}
+ \end{example}
+
+ By combining \option{path box style} and \option{path style}, you can
+ ``decorate'' the boxes on a path.
+
+ \begin{example}
+ \Tableau[styles={R={red,thick}, C={cyan,thick}},
+ paths={(R)14ccrc,(C)23rcc},
+ path box style={draw,circle, minimum size=4mm},
+ path style={draw=none},
+ ]{1234,567,89{10}}
+ \end{example}
+
+ Another way to do this is to change the style of the individual paths,
+ which gives more control because different paths can be given
+ different styling.
+
+ \begin{example}
+ \Tableau[styles={R={draw=none,text=red,thick},
+ C={cyan,thick}},
+ paths={(R)14ccrc,(C)23rcc},
+ path box style={draw,circle, minimum size=4mm},
+ ]{1234,567,89{10}}
+ \end{example}
+
+ \option[]{ribbons=ribbon specifications}[list of ribbons]
+ \option*[draw=\aTableauColour{Inner}, thin]{ribbon style=style}[\TikZ-styling]
+ \option*[]{ribbon box=text}[A node entry]
+ \option*[]{ribbon box style=style}[\TikZ-styling]
+
+ Use the \option{ribbons} key to add a comma-separated list of
+ \emph{ribbons} to a tableau. The ribbon specifications are identical
+ to those used for \option{paths}. For more details see
+ \autoref{S:RibbonTableaux}, which describes the
+ \keyword{\RibbonTableau} command.
+
+ The \option{ribbons} key works in almost exactly the same way
+ as the \option{paths} key, with the difference being that we are
+ adding ribbons to the tableau rather than lines. The
+ \option{ribbon style} key controls the default ribbon style. The
+ \option{ribbon box} and \option{ribbon box style} keys work in the
+ same way as \option{path box} and \option{path box style},
+ respectively.
+
+ \TikZ-styling can be added to ribbons using \option{ribbon style} and
+ \option{ribbon box style}. The \option{ribbon style} changes the
+ default style of the entire ribbon, whereas \option{ribbon box style}
+ changes the default style of the individual boxes in the ribbon.
+
+ \begin{example}
+ \Tableau[ribbon style={fill=blue!20,opacity=0.4},
+ ribbons={22rc}]{123,45,67}
+ \end{example}
+
+ Use \option{ribbon box style} to change the default style of the
+ boxes in a ribbon. For example, noting that a box is a ribbon of
+ length~$1$, the following code uses ribbons of length one (that is,
+ nodes), to highlight the addable nodes of this tableau.
+
+ \begin{example}
+ \Tableau[star style={fill=green!80!blue,text=white},
+ ribbon style={fill=yellow,text=red},
+ ribbons={15_A,24_B,42_C,51_D},
+ ]{123*4,567,89*{10},*{11}}
+ \end{example}
+
+ As this example indicates, ribbons are assumed to be contained inside
+ the diagram of the tableau, so they do not change the border of a
+ tableau.
+
+ \option[]{snobs=snob specifications}[list snobs]
+ \option*[draw=\aTableauColour{Inner}, thin]{snob style=style}[\TikZ-styling]
+ \option*[]{snob box=text}[A node entry]
+ \option*[]{snob box style=style}[\TikZ-styling]
+
+ Use \option{snobs} to add ribbons to the tableau, which are ribbons
+ that are placed \textit{after} the border of the diagram is drawn.
+ (Writing \textit{ribbons} backwards gives \textit{snob}bir.) The
+ \option{snob style} key controls the default style of snobs.
+
+ \begin{example}
+ \Tableau[star style={fill=green!80!blue, text=white},
+ snob style={fill=yellow, text=red},
+ snobs={15_A,24_B,42_C,51_D},
+ ]{123*4,567,89*{10},*{11}}
+ \end{example}
+
+ The difference between this pictures and the one given above using
+ \option{ribbons} is that in the \option{snobs} are drawn over the top
+ of the tableau border, causing the border to disappear for these
+ nodes. For this reason, in most cases you should normally avoid
+ \option{snobs} and use \option{ribbons}. This said, \option{snobs} are
+ exactly what are needed in \autoref{Ex:Garnir}.
+
+ The \option{snob box} and \option{snob box style} keys work in the
+ same way as the \option{path box} and \option{ribbon box}, and
+ \option{path box style} and \option{ribbon box style}, keys.
+
+ \option[1]{scale=number}[a decimal number]
+ \option*[1]{xscale=number}[a decimal number]
+ \option*[1]{yscale=number}[a decimal number]
+
+ By design, boxes in tableaux do not automatically resize to fit
+ their contents. For example, consider:
+
+ \begin{example}
+ \Tableau{ 13{10}{11}{1+x}, 2{1+x} }
+ \end{example}
+
+ This is unlikely to be the desired output! The options \option{scale},
+ \option{xscale} and \option{yscale} can be used to rescale the boxes
+ in tableaux and diagrams. The names are slightly misleading because
+ \option{xscale} rescales in the direction of increasing column index
+ and \option{yscale} rescales in the direction of increasing row index.
+
+ \begin{example}
+ \Tableau[scale=2]{ 13{10}{11}{1+x}, 2{1+x} }
+ \end{example}
+
+ \begin{example}
+ \Tableau[xscale=2]{ 13{10}{11}{1+x}, 2{1+x} }
+ \end{example}
+
+ When using the \textsf{australian} and \textsf{ukrainian} conventions,
+ \option{xscale} and \option{yscale} scale in both the \textsf{x}
+ direction and the \textsf{y}-direction, reflecting how these tableaux
+ grow with increasing column and row index, respectively.
+
+ \begin{example}
+ \Tableau[ukrainian, xscale=2]{ 13{10}{11}{1+x}, 2{1+x} }
+ \end{example}
+
+ \begin{example}
+ \Tableau[australian, yscale=2]{ 13{10}{11}{1+x},2{1+x} }
+ \end{example}
+
+ \begin{warning}
+ The options, \option{scale}, \option{xscale}, and \option{yscale},
+ affect all \aTableau diagrams, including tableaux, Young diagrams
+ and abacuses. If you want to use \keyword{\aTabset} to change the
+ default sizes of the diagrams and tableaux in your document, then it
+ is probably better to use the \option{box height} and \option{box
+ width} options.
+ \end{warning}
+
+ \option[0.5]{script=value}[decimal number]
+ \option*[0.4]{scriptscript=value}[decimal number]
+
+ Although rare, tableaux and diagrams are sometimes used as subscripts
+ and superscripts. The pacakage automatically rescales tableau when
+ they are used as subscripts and superscripts, with the \option{script}
+ and \option{scriptscript} keys giving finer control over the scaling
+ of subscripts and subsubscripts, respectively. The current values of
+ the \option{scale}, \option{xscale} and \option{yscale} keys are taken
+ into account.
+
+ \begin{example}
+ $v_{\Tableau{123,45}}$ \qquad% the default
+ $v_{\Tableau[script=0.3, xscale=2]{123,45}}$
+ \end{example}
+
+ \option[false]{shifted}[true/false]
+
+ Set to \textsf{true} for a shifted tableau or shifted diagram. Shifted
+ tableaux, and shifted diagrams, are discussed in more detail in
+ \autoref{S:Shifted}, which describes the \keyword{\ShiftedDiagram} and
+ \keyword{\ShiftedTableau} commands.
+
+ \begin{example}
+ \Tableau[shifted]{123,45} \qquad
+ \Diagram[shifted]{3,2^2}
+ \end{example}
+
+ See \autoref{S:Shifted} for the options specific to shifted tableaux and
+ shifted diagrams.
+
+ \option[0]{skew=partition}[a partition]
+
+ Specify the skew shape for a skew tableau or skew diagram. Skew
+ tableaux, and skew diagrams, are discussed in more detail in
+ \autoref{S:Skew}, which describes the \keyword{\SkewDiagram} and
+ \keyword{\SkewTableau} commands.
+
+ \begin{example}
+ \Tableau[skew={2}]{123,45} \qquad
+ \Diagram[skew={2^2,1}]{3,2^2}
+ \end{example}
+
+ See \autoref{S:Skew} for the options specific to skew tableaux and skew diagrams.
+
+ \option[fill=\aTableauColour{StarStyle}]{star style=style}[\TikZ-styling]
+
+ Use \option{star style} to change the style of the starred entries
+ of a tableau. (In \TikZ parlance, \option{star style} \emph{appends}
+ appends these styles to the default \option{star style}.)
+
+ \begin{example}
+ \Tableau[star style={text=magenta, draw=cyan, thick}]
+ {1*2*3,4*5} \qquad
+ \Tableau[star style={fill=orange!50}]{1*2*3,4*5}
+ \end{example}
+
+ Note that the tableau border is drawn \textit{after} the
+ \option{star style} is applied. You can use \option{snobs} to draw
+ over the top of the border.
+
+ \option[]{styles=\TikZ styles}[List of styles]
+
+ The \option{styles} key is a shorthand for defining \TikZ-styles that
+ are only used in the current picture. For example, instead of writing
+
+ \begin{example}
+ \tikzset{
+ B/.style={fill=blue!40, text=yellow},
+ G/.style={fill=green!80!blue,circle,minimum size=5mm},
+ R/.style={fill=red,text=white, font=\tiny},
+ Y/.style={fill=yellow!20, text=blue}
+ }
+ \Tableau[french]{[R]1[B]2,[G]3,[Y]4}
+ \end{example}
+
+ you can save some typing using the \option{styles} key:
+
+ \begin{example}
+ \Tableau[french, styles={
+ B={fill=blue!40, text=yellow},
+ G={fill=green!80!blue,circle,minimum size=5mm},
+ R={fill=red,text=white, font=\tiny},
+ Y={fill=yellow!20, text=blue},
+ }]{[R]1[B]2,[G]3,[Y]4}
+ \end{example}
+
+ Styles defined this way will only be available in the current picture.
+ Use \keyword{\tikzset} whenever you are defining styles that are likely
+ to be used more than once.
+
+ \option[false]{tabloid}[true/false]
+
+ Use the \option{tabloid} key to draw a tabloid. This key is discussed in
+ more detail in \autoref{S:Tabloid}, which describes the
+ \keyword{\Tabloid} command.
+
+ \begin{example}
+ \Tableau[tabloid]{123,45} \qquad
+ \Diagram[tabloid]{3,2^2}
+ \end{example}
+
+ See \autoref{S:Tabloid} for the options specific to tabloids.
+
+ \option[]{tikz before=commands}[\TikZ commands]
+ \option*[]{tikz after=commands}[\TikZ commands]
+
+ These keys inject \TikZ code into the underlying \keyword{tikzpicture}
+ environment, where the tableau is constructed, before and after the
+ \keyword{\Tableau} command, respectively.
+
+ \begin{example}[lefthand width=0.24\textwidth]
+ \Tableau[
+ tikz before={\draw[help lines, step=0.5](-0.5,-2)grid(2,0.5);},
+ tikz after={\draw[ultra thick, red]
+ (A-1-3.north east)--(A-1-3.south east)
+ --(A-2-1.north east)--(A-3-1.south east)
+ --(A-3-1.south west);
+ }]{134,567,89}
+ \end{example}
+
+ Both before and after hooks are provided because the order in which
+ you place \TikZ commands affects the final picture because later commands
+ are drawn over the top of earlier ones. Note that the \emph{before}
+ code cannot use the named nodes \textsf{A-r-c} because this code is
+ executed before these nodes are constructed, which happens when the
+ tableau is drawn. For more examples, see \autoref{SS:order}.
+
+ \option[]{tikzpicture=keys}[\TikZ-keys]
+
+ This command adds an optional argument to the underlying
+ \keyword{tikzpicture} environment, which contains the tableau. The
+ \option{tikzpicture} option is ignored when the \keyword{\Tableau}
+ command is equipped with $(x,y)$-coordinates.
+
+ As a first example, we can use \keyword{tikzpicture={rotate=30}}
+ to rotate a tableau by 90 degrees:
+
+ \begin{example}
+ \Tableau[tikzpicture={rotate=90}]{123,45} \qquad
+ \begin{tikzpicture}[rotate=90]
+ \Tableau(0,0){123,45}
+ \end{tikzpicture}
+ \end{example}
+
+ The two tableaux constructions in this example are equivalent. An
+ oddity with both of these examples is that the numbers in the tableaux
+ have not been rotated, which is because the \TikZ \emph{rotate} key
+ does not affect component objects, such as nodes, inside a \TikZ
+ picture. You can rotate the entire picture using the
+ \TikZ-key \textit{transform canvas}
+
+ \vspace*{15mm}
+
+ \begin{example}[valign=top, lefthand width=0.3\textwidth]
+ \Tableau[tikzpicture={transform canvas={rotate=90}}]{123,45}
+ \end{example}
+
+ A more interesting application is using
+ \option{tikzpicture=remember picture} to annotate a tableau:
+
+ \begin{example}[lefthand width=0.3\textwidth, label={Ex:pointing}]
+ \Tableau[ukrainian, name=A,
+ tikzpicture={remember picture}]
+ { 1[fill=blue!20]23[text=red]45,
+ 6*78[{draw=cyan,ultra thick}]9,
+ [{circle,fill=orange}]{10}*{11}{12},
+ [{dashed,draw=red,ultra thick}]{13}
+ }
+ \end{example}
+
+ Since \option{name}=A, the nodes in this tableau are referenced as
+ \textsf{(A-1-1)}, \textsf{(A-1-2)}, \textsf{(A-1-3)}, \dots. As the
+ example uses \textit{remember picture}, other \keyword{tikzpicture}
+ environments can reference the node names in last tableau, which
+ allows us to refer back to the table above using:
+
+ \vspace*{3mm}
+
+ \begin{example}[lefthand width=0.3\textwidth]
+ \tikz[remember picture, overlay]
+ \draw[very thick, ->, red]
+ (0,0) node[right,align=left]
+ {This circle is too big!\\Use minimum size=5mm}
+ to [out=135, in=225](A-3-1);
+ \end{example}
+
+ (See the \ctan{tikzmark} package for extensions of this idea.)
+
+ % --------------------------------------------------------------
+ \subsubsection{Compositions}
+ \index{composition}
+
+ As we have defined them, tableaux are always of \textit{partition}
+ shape, in the sense that the lengths of the rows is a weakly
+ decreasing sequence. In fact, the \keyword{\Tableau} command also
+ accepts tableaux of \emph{composition} shape, where the lengths of the
+ rows are not necessarily in decreasing order:
+
+ \begin{example}
+ \Tableau{ 45,2751,31 } \qquad
+ \SkewTableau{1,2}{ 45,27,31 }
+ \end{example}
+
+ Even though it is possible to draw compositions, and tableaux of
+ composition shape, compositions are not supported in the sense that
+ many of the options/keys assume that the diagrams are of partition
+ shape. In addition, some options assume that tableaux and diagrams do
+ not contain empty rows, and that the diagrams are \textit{connected}.
+ (For disconnected tableaux and diagrams, see the
+ \keyword{\Multidiagram} and \keyword{\Multitableau} commands in
+ \autoref{S:Multitableau}.)
+
+ % --------------------------------------------------------------
+ \subsubsection{Drawing order}
+ \label{SS:order}
+ \index{tableau!drawing order}
+
+ When \TikZ constructs a picture, later objects are drawn over the top
+ of earlier ones, which can obscure earlier features. Consequently,
+ for more complicated diagrams and tableaux it helps to know the order
+ in which the different parts of these diagrams are drawn, which is the
+ following:
+ \begin{itemize}[nosep]
+ \item First, the tableau entries that use the default styling are
+ placed, in the order that they appear in the \textit{tableau
+ specifications}.
+ \item Secondly, the styled tableau entries are placed, in the order
+ that they appear in the \textit{tableau specifications}.
+ \item Next, the nodes in any \option{ribbons} and ribbon
+ \option{paths} are placed, again in the order that the ribbons are
+ listed. For each ribbon, first the border of the ribbon is drawn,
+ together with any styling for the ribbon, and then the boxes in the
+ ribbon, together with any styling, are added.
+ \item When enabled by \option{skew border}, the skew border is
+ drawn, after which the border of the tableau is drawn.
+ \item The \option{dotted rows} and \option{dotted cols} keys are
+ applied to replace the specified rows and columns with dots.
+ \item Finally, any \option{snobs} are drawn, in the order that they are listed.
+ \end{itemize}
+
+ All of the tableau and Young diagram commands use this drawing order.
+
+ % --------------------------------------------------------------
+ \subsubsection{Special characters}
+ \index{tableau!special characters}
+ \index{tableau!comma}
+ \index{tableau!*}
+ \index{tableau![}
+
+ The characters \textsf{[}, \textsf{,}, and \textsf{*} have
+ special meanings in the \textit{tableau specifications}. Enclose these characters in
+ braces when you want to use these characters as entries in a tableau:
+
+ \begin{example}
+ \Tableau{ 13{,}5], 8{[}, {*} }
+ \end{example}
+
+ There is no need to enclose~\keyword{]} in braces because it only
+ becomes special when it has a partner~\keyword{[}.
+
+ % --------------------------------------------------------------
+ \subsection{Young diagrams}
+ \label{S:Diagram}
+ \indexcmd{Diagram}
+ \index{young diagram@Young diagram|see{diagram}}
+ \index{diagram}
+ \index{diagram}
+ \index{partition!diagram}
+
+ A \emph{Young diagram}, or simply a \emph{diagram}, is an unlabelled
+ tableau. Diagrams can be drawn using the \keyword{\Tableau} command:
+
+ \begin{example}
+ \Tableau{~~~,~~~,~~,~}
+ \end{example}
+
+ This approach works, but it is cumbersome, hard to proofread, and easy
+ to get wrong. For this reason, \aTableau provides the
+ \keyword{\Diagram} command. The \keyword{\Diagram} command uses
+ almost the same syntax as the \keyword{\Tableau} command:
+
+ \keyword{\Diagram (x,y) [options] {partition}}
+
+ As with the \keyword{\Tableau} command, the $(x,y)$-coordinates are
+ needed if, and only if, the diagram is inside a \keyword{tikzpicture}
+ environment. The \keyword{\Diagram} command allows the
+ \emph{partition} to be specified as either a comma-separated list of
+ \emph{weakly decreasing positive integers}, or by using \emph{exponential
+ notation}:
+ \index{exponential notation}
+ \index{partition!exponential notation}
+ \index{diagram!exponential notation}
+
+ \begin{example}
+ \Diagram{4,3^2,1^3} \qquad
+ \Diagram{4,3,3,1}
+ \end{example}
+
+ Internally, \keyword{\Diagram} actually does something like the first
+ example in this section, so all of the options for the
+ \keyword{\Tableau} command can be used with \keyword{\Diagram}. Rather
+ than repeating all of the \keyword{\Tableau} options in this section,
+ we highlight the more interesting options together with some new,
+ diagram specific, options.
+
+ \begin{samepage}
+ Just like the \keyword{\Tableau} command, \keyword{\Diagram} supports the
+ four different conventions for diagrams, with \option{english} being
+ the default:
+
+ \option[-]{english}
+ \option*[]{french}
+ \option*[]{ukrainian}
+ \option*[]{australian}
+ \end{samepage}
+
+ \begin{example}
+ \Diagram[australian]{3,2,1} \qquad
+ \Diagram[australian]{3,1^3}
+ \end{example}
+
+ \begin{example}
+ % English is the default convention
+ \Diagram[english]{3,2,1} \qquad
+ \Diagram{3,1^3}
+ \end{example}
+
+ \begin{example}
+ \Diagram[french]{3,2,1} \qquad
+ \Diagram[french]{3,1^3}
+ \end{example}
+
+ \begin{example}
+ \Diagram[ukrainian]{3,2,1} \qquad
+ \Diagram[ukrainian]{3,1^3}
+ \end{example}
+
+ \option[true]{border}[true/false]
+ \option*[false]{no border}[false/true]
+
+ If \option{border} is true, which it is by default, then the border of
+ the tableau is drawn. If \option{border} is false, then the border of
+ the tableau is not drawn. Notice that the border refers only to the
+ outside border of the diagram, and not to the internal borders of the
+ boxes on the diagram, which can be disabled using
+ \option{no boxes}.
+
+ \begin{example}
+ \Diagram[border=false]{3,2,1} \qquad
+ \Diagram[no border, french]{3^2,1}
+ \end{example}
+
+ The \option{no border} option, and similar options, are provided only
+ for completeness because it is the inverse of \option{border}. That
+ is, \option{no border} is equivalent to \option{border=false}, and
+ \option{no border=false} is equivalent to \option{border=true}.
+
+ \option[true]{boxes}[true/false]
+ \option*[false]{no boxes}[false/true]
+
+ The \option{boxes} and \option{no boxes} keys control whether or not
+ the internal wall around the boxes are drawn, with these two keys
+ being inverses of each other. By default, \option{boxes} is true, so
+ the internal boxes are drawn. When \option{no boxes} is in force
+ (equivalently, \option{boxes} is false), the internal walls around
+ boxes are not drawn.
+
+ \begin{example}
+ \Diagram[no boxes]{3,2,1} \qquad
+ \Tableau[french, no boxes, no border]{123,45}
+ \end{example}
+
+ \option[false]{conjugate}[false/true]
+
+ Draws the conjugate diagram, which has the rows and columns
+ interchanged.
+
+ \begin{example}
+ \Diagram[conjugate]{3,2,2} \qquad
+ \Diagram[ukrainian, conjugate]{2,1^3}
+ \end{example}
+
+ \option[]{dotted cols=column indices}[comma separated list of columns]
+ \option*[]{dotted rows=row indices}[comma separated list of rows]
+
+ The \option{dotted rows} and \option{dotted cols} keys draw diagrams
+ where the specified rows and columns are replaced with dots. This
+ makes it possible to draw \emph{generic} diagrams, where the number of
+ rows and columns is not fully specified.
+
+ \begin{example}
+ \aTabset{scale=0.7}
+ \Diagram[dotted rows={2,4,5}]{4^2,2^2,1^3} \qquad
+ \Diagram[dotted cols={5,3,4},
+ no boxes] {6,5,4,3,2,1}
+ \end{example}
+
+ As shown, if row and columns indices are in increasing
+ \textit{consecutive} order, then the corresponding rows or columns are
+ replaced as a block. Non-consecutive indices are treated separately.
+
+ \begin{example}
+ \aTabset{scale=0.7, no boxes}
+ \Diagram[dotted rows={4,5,3}] {6,5,5,5,2,1} \qquad
+ \Diagram[dotted cols={5,3,4}] {6,5,5,5,2,1}
+ \end{example}
+
+ \index{tableau!dotted rows}
+ \index{tableau!dotted cols}
+ The \option{dotted rows} and \option{dotted cols} keys work by
+ overwriting the content on the specified rows and columns, so
+ anything that was drawn in these rows and columns will disappear. The
+ \option{dotted rows} and \option{dotted cols} keys can be used with
+ the \keyword{\Tableau} command, with the caveat that this will remove
+ all boxes, with their contents, in the specified rows and columns.
+
+ When the \option{dotted rows} and \option{dotted cols} keys are
+ used together, the \option{dotted rows} are applied first.
+
+ \begin{example}
+ \Diagram[scale=0.7, no boxes,
+ dotted rows={4,5},
+ dotted cols={4,5},
+ ] {6,5,5,5,2,1}
+ \end{example}
+
+ When using these two keys together, you need to be careful when
+ choosing which rows and columns to remove because, otherwise,
+ artefacts can remain. Ideally, the endpoints of the rows and columns
+ being removed should not overlap. For example, consider the two
+ pictures:
+
+ \begin{example}
+ \aTabset{scale=0.7, no boxes}
+ \Diagram[dotted cols={3}]{6,5,5,5,2,1}\qquad
+ \Diagram[dotted cols={4,5,3}, dotted rows={4,5,3},
+ tikz after={ \draw[red](0.9,-1.4)circle(0.2); }
+ ]{6,5,5,5,2,1}
+ \end{example}
+
+ The circled horizontal dots in the right-hand diagram are a ``user
+ error'', not a bug. The left-hand diagram shows that these dots come
+ from column $3$ with \option{dotted cols} \emph{after} first removing
+ rows 4--5 with \option{dotted rows}.
+
+ The \option{dotted rows} and \option{dotted cols} keys are not
+ designed to be used with the \option{conjugate} key.
+
+ \option[]{ribbons=ribbon specifications}[list of ribbon specifications]
+ \option*[]{paths=path specifications}[list of ribbon specifications]
+ \option*[]{snobs=snobs specifications}[list of ribbon specifications]
+
+ Use \option{ribbons}, \option{paths} and \option{snobs} to add
+ ribbons, ribbon paths and snobs to a diagram, respectively. The
+ \option{snobs} are drawn after the border of the diagram.
+
+ \begin{example}
+ \Diagram[french, ribbons={*22*c_4*r*r}]{3,2^2,1} \qquad
+ \end{example}
+
+ As described in \autoref{S:Tabloid}, there are additional keys that
+ control the behaviour of paths, ribbons and snob. For example, the
+ keys \option{path style}, \option{path box} and \option{path box
+ style} are associated to \option{paths}.
+
+ \begin{example}
+ \Diagram[ukrainian, inner style=dotted,
+ styles={b={fill=blue!20,opacity=0.4},
+ R={red,text=red,thick},
+ B={blue,text=blue,thick},
+ }, path style={thick},
+ path box=\bullet,
+ paths={(R)15rccrc[b]rc,(B)43[b]rcc}
+ ]{5^2,3^3}
+ \end{example}
+
+ A description of the ribbon specifications, with examples, can be
+ found in \autoref{S:RibbonTableaux}, which describes the
+ \keyword{\RibbonTableau} command.
+
+ % --------------------------------------------------------------
+ \subsubsection{Diagrams with entries}\label{SS:entries}
+ \index{contents}
+ \index{first tableau}
+ \index{hooks}
+ \index{last tableau}
+ \index{residues}
+ \index{first tableau}
+ \index{tableau!contents}
+ \index{tableau!first}
+ \index{tableau!hooks}
+ \index{tableau!last}
+ \index{tableau!residues}
+
+ The \option{entries} key provides a shortcut for drawing some common
+ tableaux of a specified shape.
+
+ \option[]{entries=value}[contents, first, hooks, last, residues]
+
+ The possible choices are:
+
+ \begin{itemize}
+
+ \item\option{entries=first} print the \emph{first}
+ \textbf{standard} tableau of this shape, with respect to the Bruhat
+ order. This is the tableau that has the numbers $1,2\dots,n$ entered
+ in order from top left to right along down successive rows (with
+ appropriate modifications for the non-English conventions).
+
+ \index{first tableau}
+ \index{tableau!first}
+ \index{entries!first}
+ \begin{example}
+ \Diagram[entries=first]{3,2,2} \qquad
+ \Diagram[ukrainian, entries=first]{3^2,2}
+ \end{example}
+
+ \item\option{entries=last} print the \emph{last} \textbf{standard}
+ tableau of this shape, with respect to the Bruhat order. This is the
+ tableau that has the numbers $1,2\dots,n$ entered in order from top
+ to bottom down successive columns (with appropriate modifications
+ for the non-English conventions).
+
+ \index{last tableau}
+ \index{tableau!last}
+ \index{entries!last}
+ \begin{example}
+ \Diagram[entries=last]{3,2,2} \qquad
+ \Diagram[australian, entries=last]{2^2,1}
+ \end{example}
+
+ \item\option{entries=hooks} print the diagram where each box is
+ labelled by the corresponding \emph{hook length}. If $\lambda$ is a
+ partition and $\lambda'$ is its conjugate partition then the hook
+ length of the box in row~$i$ and column~$j$ is
+ $\lambda_i-i+\lambda'_j-j+1$.
+
+ \index{tableau!hook lengths}
+ \index{hook lengths}
+ \index{entries!hook lengths}
+ \begin{example}
+ \Diagram[entries=hooks]{3,2,2} \qquad
+ \Diagram[ukrainian, entries=hooks]{2^2,1}
+ \end{example}
+
+ \item\option{entries=contents} print the diagram where each box is
+ labelled by its \emph{content}, which is the row index minus the
+ column index.
+
+ \index{tableau!contents}
+ \index{contents}
+ \index{entries!contents}
+ \begin{example}
+ \Diagram[entries=contents]{3,2,1} \qquad
+ \Diagram[french, entries=contents]{2^2,1}
+ \end{example}
+ \AddKeyLink{contents}
+ \AddKeyLink{residues}
+ \AddKeyLink{charge}
+
+ \smallskip\noindent Inside a tableau, the default minus sign for a
+ negative number looks too long, so \aTableau uses
+ \keyword{\shortminus} for negative contents. For example, it prints
+ \keyword{\shortminus 1} instead of \keyword{-1}, which look like
+ $\shortminus1$ and $-1$, respectively.\indexcmd{shortminus}
+
+ \item\option{entries=residues} prints the diagram where each box is
+ labelled by its \emph{residue}, which is the row index minus the
+ column index modulo an integer~$e\ge2$, which must also be supplied.
+
+ \index{residue}
+ \index{tableau!residues}
+ \index{affine quiver}
+ \begin{example}
+ \Diagram[entries=residues, e=2]{3,2,1} \qquad
+ \Diagram[french, entries=residues, e=3]{3,2,1}
+ \end{example}
+
+ \noindent\AddKeyLink{cartan}\AddKeyLink{e}
+ By default, residue sequences for affine type $A^{(1)}_e$, or the symmetric
+ group and friends, are given. In addition, residues in affine types
+ $C^{(1)}_e$, $A^{(2)}_{2e}$ and $D^{(2)}_e$, which can be accessed
+ using \option{cartan=C}, \option{cartan=AA}, and \option{cartan=DD},
+ respectively.
+
+ \smallskip
+ \begin{example}
+ % affine type C
+ \Diagram[french, entries=residues,
+ e=2, cartan=C] {8,4,2}
+ \end{example}
+
+ \begin{example}
+ % twisted affine type A
+ \Diagram[ukrainian, entries=residues,
+ e=2, cartan=AA] {8,4,2}
+ \end{example}
+
+ \begin{example}
+ % twisted affine type D
+ \Diagram[australian, entries=residues,
+ e=2, cartan=DD] {8,4,2}
+ \end{example}
+
+ \end{itemize}
+ Use \option{charge} to add offsets to the \option{contents} and \option{residues}.
+
+ \begin{example}
+ \Diagram[entries=contents, charge=2]{3,2,1} \qquad
+ \Diagram[entries=residues, e=3, charge=1]{3,2,1}
+ \end{example}
+
+ % --------------------------------------------------------------
+ \subsection{Skew tableaux and skew diagrams}
+ \label{S:Skew}
+ \indexcmd{SkewTableau}
+ \indexcmd{SkewDiagram}
+ \index{diagram!skew}
+ \index{partition!skew}
+ \index{tableau!skew}
+
+ A partition $\mu$ is \emph{contained} in another partition $\lambda$, which
+ is written as~$\mu\subseteq\lambda$, if $\mu_k\le\lambda_k$, for
+ $k\ge0$. If $\mu\subseteq\lambda$ then the \emph{skew partition}
+ $\lambda/\mu=\set{(r,c)\in\lambda|(r,c)\notin\mu}$ is the set of nodes
+ that are in~$\lambda$ and not in~$\mu$. In this manual, $\mu$ is
+ the \emph{inner shape} and $\lambda/\mu$ is the outer shape. A
+ \emph{skew tableau} is a labelling of the nodes in the diagram of a
+ skew partition. Skew partitions and skew tableau can be drawn using
+ the commands:
+
+ \keyword{\SkewDiagram (x,y) [options] {inner shape} {outer shape}}\newline
+ \keyword{\SkewTableau (x,y) [options] {inner shape} {skew tableau specifications}}
+
+ \index{exponential notation}
+ As with the previous commands, the $(x,y)$--coordinates should be given
+ if, and only if, the picture is inside a \keyword{tikzpicture}
+ environment. The inner and outer shapes can either be given as a
+ comma-separated list of non-negative integers, or in exponential notation.
+
+ Skew tableau and skew diagrams should always be connected. Use
+ \keyword{\Multidiagram} and \keyword{\Multitableau} to draw
+ disconnected diagrams.
+
+ In fact, the \keyword{\SkewTableau} is just an alias for the
+ \keyword{\Tableau}, using the \option{skew} key to set the inner
+ shape. For this reason, all of the options for the \keyword{\Tableau}
+ command can be used with \keyword{\SkewTableau}. The entries in a
+ \keyword{\SkewTableau} are specified in exactly the same way as in the
+ \keyword{\Tableau} command. In particular, the entries of skew
+ tableaux can, optionally, be given style prefixes, both using a~$*$ to
+ add the current \option{star style}, or arbitrary \TikZ-styling using
+ \keyword{[...]}.
+
+ \begin{example}
+ \tikzset{R/.style={fill=red!20,text=red}}
+ \SkewTableau[french]{1^2}{13,5*7,[R]79} \qquad
+ \Tableau[french, skew={1^2}]{13,5*7,[R]79}
+ \end{example}
+
+ Similarly, the \keyword{\SkewDiagram} command is an alias for the
+ \keyword{\Diagram} command, with a \option{skew} key.
+
+ \begin{example}
+ \SkewDiagram[french]{1^2}{2^3} \qquad
+ \Diagram[french, skew={1^2}]{2^3}
+ \end{example}
+
+ As the \keyword{\SkewTableau} and \keyword{\SkewTableaua} commands
+ are shortcuts, all of the options for the \keyword{\Tableau} and
+ \keyword{\Diagram} commands can be used with the
+ \keyword{\SkewTableau} and \keyword{\SkewDiagram} commands,
+ respectively. In addition, the following options are supported:
+
+ \option[false]{skew border}[true/false]
+ \option*[true]{no skew border}[false/true]
+
+ These two keys are inverse to each other. When
+ \option{skew border} is \textsf{true}, the border of the (inner) skew
+ shape is drawn.
+
+ \begin{example}
+ \tikzset{R/.style={fill=red!20,circle}}
+ \SkewTableau[skew border]{2,1^2}{12[R]3,45,67}
+ \SkewTableau[french, skew border]{2,1^2}{12[R]3,45,67}
+ \end{example}
+
+ Note that \option{skew border} only draws the border of the skew shape
+ and not the boxes inside the inner skew shape. Use \option{skew boxes}
+ to draw the interior walls of the boxes in the skew shape.
+
+ \option[draw=\aTableauColour{Skew}, fill=\aTableauColour{SkewFill}, thick]{skew border style=style}[\TikZ-styling]
+
+ Use \option{skew border style} to change the style of the skew border.
+ Since the skew border is only drawn when \option{skew border} is set,
+ the \option{skew border style} does not have any effect unless
+ \option{skew border} has been set to \textsf{true}.
+
+ \begin{example}
+ \SkewTableau[skew border style={draw=yellow},
+ skew border]{2,1^2}{123,45,67} \qquad
+ \SkewDiagram[skew border style={dashed,fill=red!10},
+ skew border]{1^2}{2^3}
+ \end{example}
+
+ \option[false]{skew boxes}[false/true]
+ \option*[true]{no skew boxes}[true/false]
+ \option*[thin, fill=\aTableauColour{SkewFill}]{skew box style=style}[\TikZ-styling]
+
+ The \option{skew boxes} key adds walls to the boxes inside the inner
+ partition of a skew shape. Use \option{skew box style} to change the
+ default shading of these boxes.
+
+ \begin{example}
+ \SkewTableau[skew boxes] {2,1^2}{123,45,67}
+ \SkewTableau[skew boxes,
+ skew box style={dash pattern=on 1pt off 2pt}
+ ] {2,1^2}{123,45,67,89}
+ \end{example}
+
+ Using the options \option{skew border} and the \option{skew boxes}
+ together gives the skew (inner) shape both inner and outer borders.
+
+ \begin{example}
+ \SkewTableau[skew border, skew boxes] {2^2,1}{123,45,67}
+ \end{example}
+
+ % --------------------------------------------------------------
+ \subsection{Shifted tableaux and shifted diagrams}
+ \label{S:Shifted}
+ \indexcmd{ShiftedTableau}
+ \indexcmd{ShiftedDiagram}
+ \index{diagram!shifted}
+ \index{strict partition}
+ \index{partition!strict}
+ \index{shifted tableau}
+ \index{tableau!shifted }
+
+ \emph{Strict partitions}, which have strictly increasing parts, and
+ \emph{shifted tableaux}, which are of strict partition shape, appear
+ in several places in representation theory, such as in the study of
+ projective representations of the symmetric groups. These tableaux and
+ diagrams are drawn with row~$r$ shifted by $(r-1)$-units along the
+ row, so that the first box in each row has content~$0$. These diagrams
+ and tableaux can be drawn using the following commands:
+
+ \keyword{\ShiftedDiagram (x,y) [options] {partition }}\newline
+ \keyword{\ShiftedTableau (x,y) [options] {tableau specification}}
+
+ As usual, the $(x,y)$-coordinates are necessary if, and only if, these
+ commands are used inside a \keyword{tikzpicture} environment. The
+ partition in a~\keyword{\ShiftedDiagram} can be given using
+ exponential notation and the tableau specification for a
+ \keyword{\ShiftedTableau} can include the usual optional style
+ prefixes.
+
+ \begin{example}
+ \tikzset{R/.style={fill=red!20,circle}}
+ \ShiftedTableau{12[R]3,45,*6} \qquad
+ \ShiftedDiagram[french]{3,2,1}
+ \end{example}
+
+ In the literature, shifted tableaux and shifted diagrams almost
+ always have strict partition shape, however, this is not enforced by
+ these commands. Under the hood, the \keyword{\ShiftedTableau} is the
+ \keyword{\Tableau} command with the \option{shifted} option set
+ to true. Similarly, \keyword{\ShiftedDiagram} is the same as using
+ the \keyword{\Diagram} command with the \option{shifted} option. Consequently,
+ all of the options for the \keyword{\Tableau} and \keyword{\Diagram}
+ commands can be used with \keyword{\ShiftedTableau} and
+ \keyword{\ShiftedDiagram}, respectively. In particular, options like
+ \option{skew boxes} can be used to highlight the shifted part of the
+ diagram
+
+ \begin{example}
+ \ShiftedTableau[skew boxes]{1*23,4*5} \quad
+ \ShiftedDiagram[skew border]{3,2}
+ \end{example}
+
+ The \option{entries} key works as expected for shifted diagrams:
+
+ \begin{Example}
+ \ShiftedDiagram[entries=contents]{3,2,1} \qquad
+ \ShiftedDiagram[entries=first]{4,2,1} \qquad
+ \ShiftedDiagram[entries=hooks]{4,2,1} \qquad
+ \ShiftedDiagram[entries=last]{4,2,1} \qquad
+ \ShiftedDiagram[entries=residues, e=3]{4,2,1}
+ \end{Example}
+
+ The definition of hook lengths for shifted diagrams can be found, for
+ example, in \cite{Konvalinka:ShiftedHookLengths}.
+
+ % --------------------------------------------------------------
+ \subsection{Tabloids}
+ \label{S:Tabloid}
+ \indexcmd{Tabloid}
+
+ A \emph{tabloid} is an equivalence class of tableau, where two tableaux
+ are equivalent if they have the same entries in each row, up to a
+ permutation. In the literature, tabloids are usually drawn with lines
+ above and below each row, and without side borders. Tabloids can be
+ drawn with the \keyword{\Tabloid} command.
+
+ \keyword{\Tabloid (x,y) [options] {partition }}
+
+ The \keyword{\Tabloid} command functions in the same way as the
+ \keyword{\Tableau} command, except that it draws tabloids. In fact,
+ the \keyword{\Tabloid} is a special case of the \keyword{\Tableau}
+ command with the \option{tabloid} option set.
+
+ \begin{example}
+ \tikzset{R/.style={fill=red!20,circle,minimum size=5mm}}
+ \Tabloid[ukrainian]{12[R]3,45}\quad
+ \Tabloid[english] {12[R]3,45}\quad
+ \Tabloid[french] {12[R]3,45}
+ \end{example}
+
+ The \aTableau package does not provide a dedicated command for tabloid
+ diagrams, however, they can be drawn using the \keyword{\Diagram}
+ command together with the \option{tabloid} option:
+
+ \begin{example}
+ \Diagram[tabloid]{3^2,1} \qquad
+ \Diagram[tabloid, french]{3,1^2}
+ \end{example}
+
+ Some authors work with \emph{column tabloids}. Such tableaux do not
+ have a dedicated \aTableau command, however, they can be drawn using the
+ \option{conjugate} option: \index{tabloids!column}
+
+ \begin{example}
+ \Tabloid[conjugate]{123,4} \qquad
+ \Diagram[conjugate, tabloid]{3,1} \qquad
+ \end{example}
+
+ Similarly, skew tabloids and shifted tabloids can be drawn using the \option{skew}
+ option.
+ \label{tabloids!skew}
+
+ \begin{example}
+ \Tabloid[skew={2,1}]{19{11},29{10},6} \qquad
+ \Tabloid[conjugate, skew={0,1,2}]{19{11}7,29{10},6}
+ \end{example}
+
+
+ % --------------------------------------------------------------
+ \subsection{Ribbon tableaux}\label{S:RibbonTableaux}
+ \indexcmd{RibbonTableau}
+ \index{ribbon!head}
+ \index{tableau!ribbon tableau}
+
+ A \emph{ribbon} in a tableau, or a diagram, is a connected strip of
+ boxes~$R$ that are totally ordered by their contents. (Recall from
+ \autoref{SS:entries} that the content of the box in row~$a$ and
+ column~$b$ is $b-a$.) Therefore, a ribbon does not contain a
+ \Diagram[scale=0.3, border=false, align=bottom]{2^2}-square, and if
+ $(a,b)\in R$ then at most one of $(a+1,b)$ and $(a,b-1)$ belongs
+ to~$R$. The \emph{head} of a ribbon~$R$ is the unique node of maximal
+ content. A \emph{ribbon tableau} is a tableau that is tiled by
+ ribbons. A box is a ribbon of length~$1$, so every tableau is a ribbon
+ tableau.
+
+ \keyword{\RibbonTableau (x,y) [options] {ribbon specifications}}
+
+ Like the other commands, the $(x,y)$-coordinates are optional and are
+ required if, and only if, the diagram is being used as part of a
+ \keyword{tikzpicture} environment. All options for the
+ \keyword{\Tableau} command can be used for the ribbon command, so we
+ refer to \autoref{S:Tableau} for a description of the available
+ options.
+
+ % --------------------------------------------------------------
+ \subsubsection{Ribbon specifications}
+ Unlike the \keyword{\Tableau} command, the entries of a ribbon tableau
+ are given by ribbon specifications (rather than tableau)
+ specifications. Ribbon specifications are also used by the three keys
+ \option{ribbons}, \option{paths}, and \option{snobs}, which were
+ introduced in \autoref{SS:TableauOptions}.
+
+ To understand the ribbon specifications, observe that if $(a,b)$ is
+ the head of a ribbon, then we can walk along the ribbon by specifying
+ whether the \textsf{r}ow index increases or the \textsf{c}olumn index
+ decreases. That is, a ribbon is uniquely determined by specifying its
+ head $(a,b)$ together with a sequence of $\textsf{r}$'s and
+ \textsf{c}'s to indicate when the row index increases, or the column
+ index decreases, respectively. For example, vertical and horizontal
+ ribbons are given by a sequences of \textsf{r}'s and \textsf{c}'s,
+ respectively:
+
+ \begin{example}
+ \aTabset{align=top, no border}
+ \RibbonTableau{11rrrr} \qquad
+ \RibbonTableau{16ccccc}
+ \end{example}
+
+ The border of a ribbon tableau is the smallest (skew) partition that
+ contains all of its ribbons. In the last example shows, the
+ \option{no border} key is used to disable the ribbon tableau border so
+ that we can better see the ribbon, which is the full diagram in these
+ two cases.
+
+ The following diagram shows a see-sawing ribbon with head in row~$1$
+ and column~10, and tail in row~$5$ and column~$1$.
+
+ \begin{example}
+ \RibbonTableau{1{10}crcrcrcrccccc}
+ \end{example}
+
+ As with tableau entries, each box in a ribbon can be preceded with a
+ style specification, either using \keyword{*} for the \option{star
+ style} or using \keyword{[...]} for more customised style
+ specifications.
+
+ \begin{example}
+ \RibbonTableau{
+ *1{10}c*rc*rc*rc*rc*cc*cc,
+ *18c[fill=red]rc[fill=blue]rc*rc*cc[fill=teal]c,
+ [fill=green]16c*rc*rc*cc,
+ *14c[{draw=purple,ultra thick}]cc[fill=orange]r,
+ [{fill=yellow,draw=red,ultra thick}]23
+ }
+ \end{example}
+
+ In particular, the yellow box in this example highlights that boxes
+ are ribbons of length~$1$. Most of the time, you want to style the
+ entire ribbon rather than styling the individual boxes in the ribbon.
+ Optionally, the style for the entire ribbon can be given inside
+ parentheses $(...)$ at the \textit{start} of the ribbon. Unlike the
+ other style specifications, the $*$-shorthand for the \option{star
+ style} cannot be applied to an entire ribbon.
+
+ \begin{example}
+ \RibbonTableau{
+ (fill=red)1{10}crcrcrcrccc_Ccc,
+ (fill=orange)18crcrc*rcc_Bcc,
+ (fill=yellow)16crcr[fill=cyan]c_Acc,
+ (fill=green)14cccr,
+ (fill=blue)23
+ }
+ \end{example}
+
+ Any styles for a ribbon are applied to the region bounded by the
+ closed path given by the border of the ribbon. The ribbon style is
+ applied first, after which any styled boxes in ribbon are drawn. As
+ this example shows, the optional style of any box in the ribbon takes
+ precedence over the style of the full ribbon.
+
+ Finally, it is often necessary to label some of the boxes in the
+ ribbon. Optionally, text can be added to the boxes in a ribbon by
+ supplying it as a \textit{subscript} to the corresponding entry in the
+ ribbon specification:
+
+ \begin{example}
+ \RibbonTableau[french] { 12_1 c_2 r_3 } \quad
+ \RibbonTableau[ukrainian] { 12_a c_b r_c } \quad
+ \RibbonTableau[australian]{ 12_{1_a} c_{2_b} r_{3_c} }
+ \end{example}
+
+ Here we have put spaces between the entries for the different boxes
+ in the ribbon for clarity. There are often many ways to draw the same
+ ribbon tableau, especially if the entries have styling.
+
+ \begin{example}
+ \tikzset{Fill/.style={fill=#1!20!white},
+ B/.style={Fill=blue}, R/.style={Fill=red}, Y/.style={Fill=yellow}}
+ \RibbonTableau{ [B]12_1 [R]c_2 [Y]r_3} \qquad
+ \RibbonTableau{ [B]12_1, [R]11_2, [Y]21_3 } \qquad
+ \Tableau{ [B]2 [R]1, [Y]3 }
+ \end{example}
+
+ As shown, the easiest way to draw this particular tableau is using the \keyword{\Tableau} command.
+
+ There is no dedicated syntax for putting a label on the boundary
+ between two boxes in the diagram, but this can be done using the named
+ anchors of~\autoref{E:NodeNames}.
+
+ \begin{example}
+ \RibbonTableau[shifted, tikz after={
+ \node at (A-1-2.east){$1$};
+ \node at (A-2-2.east){$2$};
+ }]{ 14c, 12c, 23c }
+ \end{example}
+
+ Here is an example of a $3$-ribbon skew tableau.
+
+ \begin{example}
+ \RibbonTableau[skew={2^2,1^2}, skew border]{
+ 14c_0r,15r_1c, 18c_7c,26r_9r,
+ 34c_2c,35r_8r,42r_3c, 44c_4r,
+ 54r_6c,62c_5r
+ }
+ \end{example}
+
+ We have now seen the full ribbon specifications. To summarise:
+ \begin{itemize}[nosep]
+ \item The ribbon specification starts with optional \TikZ-styling
+ for the ribbon (or path), enclosed in $(...)$.
+ \item The first entry in the ribbon is given as
+ \textsf{a}\textsf{b}, if the head of the ribbon is in row
+ \textsf{a} and column \textsf{b}. The remaining entries in the
+ ribbon are specified by a sequence of \textsf{r}'s and \textsf{c}'s,
+ depending on whether the next box in the ribbon is given by
+ increasing the row index, or decreasing the column index,
+ respectively.
+ \item Optionally, each box in the ribbon, including the head, can be
+ given \TikZ-styling by prefixing it with a $*$, which gives the
+ box the \option{star style}, or by giving \TikZ-styling keys inside
+ square brackets $[...]$.
+ \end{itemize}
+
+ Finally, when drawing the border, all ribbons in a
+ \keyword{\RibbonTableau} are assumed to be contained in the smallest
+ Young diagram that contains the ribbons. This said, it is up to you to
+ ensure that the boxes in the ribbon do not have negative column
+ indices. Inside a \keyword{\Diagram} or \keyword{\Tableau} command,
+ any ribbons added using \option{paths}, \option{ribbons}, or
+ \option{snobs} do not affect the border of the diagram or tableau. You
+ can draw paths, ribbons, and snobs so that their boxes are either
+ inside or outside the border of the diagram or tableau. It can be
+ useful to place boxes outside of the diagrams.
+
+ \option[]{paths=path specifications}[comma separated ribbon specifications]<ribbons>
+ \option*[]{ribbons=ribbon specifications}[comma separated ribbon specifications]<ribbons>
+ \option*[]{snobs=snob specifications}[comma separated ribbon specifications]<ribbons>
+
+ You can add \option{ribbons}<ribbons>, \option{paths}<ribbons> and
+ \option{snobs}<ribbons> to a \keyword{\RibbonTableau} in exactly the
+ same way that you add them to \keyword{\Tableau}. At first sight, it
+ seems unnecessary to add \option{ribbons}<ribbons> and
+ \option{snobs}<ribbons> because ribbon tableaux are composed of
+ ribbons. The point is that any ribbon added to a tableau using
+ \option{ribbons}<ribbons> or \option{snobs}<ribbons> is not assumed to
+ be inside the border of the tableau.
+
+ \begin{example}
+ \RibbonTableau[
+ styles={A={fill=green!10, text=teal}, R={fill=yellow!10, text=red}},
+ ribbons={[A]15_A,[A]24_A,[A]41_A, [R]14_R,[R]33_R}
+ ]{11, (fill=blue!10)12rc, 14crrcc}
+ \end{example}
+
+ Here is a cute use of \option{paths} to add arrows to a skew
+ $2$-ribbon tableau:
+
+ \begin{example}[lefthand width=0.35\textwidth]
+ \RibbonTableau[skew={4,3,2,1},
+ styles={L={red,semithick,->}, R={red,semithick,<-}},
+ paths ={ (L)15c, (L)17c, (L)24c, (L)26c,
+ (R)32r,(R)41r,(R)52r,(R)61r, (R)34c},
+ tikz after = { % node labels: row/col/label
+ \foreach \r/\c/\l in {1/6/0,1/8/6,2/5/3,2/7/8}
+ { \node at (A-\r-\c.west){\l};}
+ \foreach \r/\c/\l in {5/1/1,4/2/2,3/3/5,7/1/4,6/2/7}
+ { \node at (A-\r-\c.south){\l};}
+ }
+ ]{ 16c,18c, 25c, 27c, 33r, 42r, 51r, 62r,71r }
+ \end{example}
+
+ The arrows are added by the \option{paths} key using the two styles
+ \textsf{L} and \textsf{R}, which draws ``left'' and ``right'' arrows
+ between the two boxes, where left and right is with respect to the
+ line-order of the two boxes in the corresponding draw command. The
+ two \keyword{\foreach}-statements might look complicated, but they are
+ just loops that add the entries to the tableau. These loops set
+ \keyword{\r}, \keyword{\c} and \keyword{\l} equal to the row index,
+ column index and label, respectively, using the two lists of
+ \keyword{\r}\!/\!\keyword{\c}\!/\!\keyword{\l} triples given above.
+
+ \option[draw=\aTableauColour{Inner}, thin]{ribbon style=style}{\TikZ-styling}
+ \option*[]{ribbon box style=style}{\TikZ-styling}
+
+ Use the \option{ribbon style} and \option{ribbon box} keys to
+ append to the default styling of the ribbons, and the boxes in the
+ ribbons, respectively. By default, the full ribbon has inner wall
+ styling, but the boxes in ribbons have no styling. If you want inner
+ walls, then they can be added using the \option{ribbon box} key.
+
+ \begin{example}
+ \RibbonTableau[ribbon style={draw=red, thick,
+ fill=orange!20}]{16_1r_2c_3c_4c_5c_6r_7c_8}
+ \RibbonTableau[ribbon box style={fill=orange!20,
+ draw=magenta}]{16_1r_2c_3c_4c_5c_6r_7c_8}
+ \end{example}
+
+ Ribbons are drawn by first drawing the full ribbon, applying
+ \option{ribbon style}, then the empty boxes in the ribbon are drawn,
+ and, finally, any boxes in the ribbon that have styling or an entry
+ are added. In particular, if the style \option{ribbon box} draws an
+ outline around a box then this has precedence over any outline added
+ by \option{ribbon style} since \option{ribbon box} is applied last.
+
+ \option[]{ribbon box=text}{default box contents}
+
+ You can add content to the boxes in a ribbon using subscripts in
+ the ribbon specifications. Alternatively, you can use
+ \option{ribbon box} if you want to add the same
+ content to each box in the ribbon.
+
+ \begin{example}
+ \RibbonTableau[ribbon box=\times]{14rccrc}\qquad
+ \RibbonTableau[ribbon box=\bullet]{14_1rc_2cr_3c}
+ \end{example}
+
+ As shown, whenever a box entry is given as a subscript it is used
+ instead of the value of \option{ribbon box}. If a ribbon
+ tableau contains multiple ribbons, then \option{ribbon box} is used
+ for all ribbons.
+
+ Similarly, there are keys \option{path style}, \option{path box},
+ \option{path box style}, \option{snob style}, \option{snob box} and
+ \option{snob box style} that work in exactly the same way. Most of the
+ \keyword{\Tableau} keys work as expected for ribbon tableaux.
+
+ % --------------------------------------------------------------
+ \subsection{Multidiagrams and multitableaux}\label{S:Multitableau}
+ \indexcmd{Multidiagram}
+ \indexcmd{Multitableau}
+ \index{diagram!multidiagram}
+ \index{tableau!multitableau}
+
+ Multitableaux and multidiagrams are $\ell$-tuples of tableaux and
+ diagrams, respectively. Such diagrams appear in many places in representation
+ theory, such as when considering representations of wreath products
+ or cyclotomic Hecke algebras. For convenience, \aTableau provides
+ the \keyword{\Multidiagram} and \keyword{\Multitableau} commands for
+ drawing these diagrams, even though it is possible to construct
+ such tableaux and diagrams using the \keyword{\Tableau} and
+ \keyword{\Diagram} commands.
+
+ \keyword{\Multidiagram (x,y) [options] {multipartition specifications} }\newline
+ \keyword{\Multitableau (x,y) [options] {multitableau specifications} }
+
+ \index{components}
+ \index{multidiagram!components}
+ \index{multitableau!components}
+ Our preferred notation for a multipartition $\blam$ is to write
+ $\blam=(\lambda^{(1)}|\lambda^{(2)}|\dots|\lambda^{(\ell)})$, where
+ $\ell\ge1$ is the \emph{level} and the partitions
+ $\lambda^{(1)},\dots,\lambda^{(\ell)}$ are the \emph{components}
+ of~$\blam$. Similarly, a multitableau is written as
+ $\T=(\T^{(1)}|\dots|\T^{(\ell)})$, where the tableaux
+ $\T^{(1)},\dots,\T^{(\ell)}$ are the \emph{components} of~$\T$.
+ Accordingly, in the \keyword{\Multidiagram} and
+ \keyword{\Multitableau} commands, the pipe symbol \keyword{|} is used
+ to separate components:
+
+ \begin{example}
+ \aTabset{scale=0.7}
+ \Multidiagram{3,2^2|2,1,1|1}
+ \Multitableau[box font=\tiny]
+ { 123,45,67 | 89,{10},{11} | {12}{13}{14} }
+\end{example}
+
+ As shown, the \keyword{\Multidiagram} command accepts exponential
+ notation for multipartitions. The entries in a \keyword{\Multitableau} can
+ be given optional styling specifications, exactly as inside the
+ \keyword{\Tableau} command.
+
+ \begin{example}
+ \tikzset{R/.style={fill=red!10,text=magenta}}
+ \Multitableau{1*24,*68 | [R]9{10},{11}}
+ \end{example}
+
+ Multitableaux and multidiagrams can, in principle, have arbitrary
+ level. In practice, the level is constrained by the page width.
+
+ \begin{example}
+ \Multitableau[french]{1,2 | 3,4 | 5,6 | 7,8 | 9,{10}}
+ \end{example}
+
+ Both the \keyword{\Multitableau} and \keyword{\Multidiagram} commands
+ accept a special component, \keyword{...}, that is used to add dots between the
+ separators:
+
+ \begin{example}
+ \aTabset{scale=0.7}
+ \Multidiagram{3,2^2|...|1}
+ \Multitableau[box font=\tiny]
+ {123,45,67 | ... | {12}{13}{14}}
+ \end{example}
+
+ The \keyword{\Multitableau} and \keyword{\Multidiagram} commands
+ accept most of the options of the \keyword{\Tableau} and
+ \keyword{\Diagram} commands, together with a few options that are
+ specific to multitableaux and multidiagrams. This section describes
+ the new options, and highlights how some of the other options are used.
+
+ \option[-]{english}
+ \option*[]{french}
+ \option*[]{ukrainian}
+ \option*[]{australian}
+
+ All four tableaux conventions are supported for multitableaux and
+ multidiagrams, with the caveat that all component diagrams use the
+ same convention.
+
+ \begin{example}
+ \aTabset{scale=0.7}
+ \Multidiagram[french]{3,2^2|...|1}
+ \Multitableau[ukrainian, box font=\tiny]
+ {123,45,67 | ... | {12}{13}{14}}
+ \end{example}
+
+ \option[]{conjugate}
+ \index{conjugate!multidiagram}
+ \index{conjugate!multitableau}
+ \index{multidiagram!conjugate}
+ \index{multitableau!conjugate}
+
+ The \option{conjugate} option prints the conjugate multitableaux and
+ multidiagrams. Conjugation for multitableaux and multidiagrams reverses
+ the order of the components and then conjugates the component
+ diagrams.
+
+ \begin{example}
+ \aTabset{scale=0.6, box font=\scriptsize}
+ \Multitableau[conjugate]{ 123,45 | 67,89} \quad
+ \Multidiagram[conjugate]{ 3,2 | 1^2 }
+ \end{example}
+
+ \option[()]{delimiters}[pair of \LaTeX{} delimiters]
+ \option*[(]{left delimiter}[a \LaTeX{} delimiter]
+ \option*[)]{right delimiter}[a \LaTeX{} delimiter]
+
+ The delimiter options control the delimiters that are put on the left
+ and right of multitableaux and multidiagrams. These options accept any
+ \LaTeX{} delimiter.
+
+ \begin{example}
+ \aTabset{scale=0.7}
+ \Multidiagram[left delimiter=\langle,
+ right delimiter={]}]{2,1|1} \quad
+ \Multidiagram[delimiters={\|}{\}} ]{1^2|2}
+ \end{example}
+
+ To remove a delimiter, set \option{left delimiter} or
+ \option{right delimiter} to nothing.
+
+ \begin{example}
+ \Multitableau[left delimiter=, right delimiter=]
+ {123,45,67|{12}{14}}
+ \end{example}
+
+ \option[\textbackslash textendash]{empty=text}[any \LaTeX{}]
+
+ The \option{empty} option determines what is printed when a component
+ diagram is empty. By default, the en-dash symbol \textendash{} is
+ used.
+
+ \begin{example}
+ \Multitableau{ 123,45 | | 67,89} \par\bigskip
+ \Multidiagram[empty=$\emptyset$]{ 3,2 | | 2^2 }
+ \end{example}
+
+ \begin{warning}
+ By default, the \option{empty} key is typeset as text and \emph{not}
+ as mathematics, which is the default for the tableau boxes.
+ \end{warning}
+
+ \option[]{entries=value}[contents, first, hooks, last, residues]<multitableau>
+ \option*[]{charge=offsets}[$|$-separated list of charges]<multitableau>
+
+ \index{contents}
+ \index{residues}
+ \index{contents!multitableau}
+ \index{first tableau!multitableau}
+ \index{hooks!multitableau}
+ \index{last tableau!multitableau}
+ \index{residues!multitableau}
+ \index{entries!multitableau}
+ \index{multidiagram!show}
+ \index{multitableau!contents}
+ \index{multitableau!first}
+ \index{multitableau!hooks}
+ \index{multitableau!last}
+ \index{multitableau!residue}
+
+ The \option{entries} key automatically fills in particular types of
+ entries for you to draw the requested tableau of the specified shape.
+ Use \option{charge} to provide offsets in each component when using
+ \option{entries=contents} and \option{entries=residues} {(}the
+ \option{charge} is ignored when using \option{entries=first} and
+ \option{entries=last}).
+
+ \nopagebreak[0]
+ The possible choices are:
+ \begin{itemize}
+
+ \item\option{entries=first} print the \emph{first} \textbf{standard} tableau of this
+ shape, which has the numbers $1,2\dots,n$ entered in order from top
+ left to right along down successive rows (with appropriate modifications for
+ the non-English conventions).
+
+ \begin{example}
+ \Multidiagram[entries=first]{3,1^2|2^2,1}
+ \end{example}
+
+ \item\option{entries=last} print the \emph{last} \textbf{standard} tableau of this
+ shape, which has the numbers $1,2\dots,n$ entered in order from top
+ to bottom down successive columns, and right to left along components (with appropriate modifications for
+ the non-English conventions).
+
+ \begin{example}
+ \Multidiagram[entries=last]{3,2,2|2^2}
+ \end{example}
+
+ \item\option{entries=hooks} print the diagram where each box in each
+ component is labelled by the corresponding \emph{hook length}.
+
+ \begin{example}
+ \Multidiagram[entries=hooks]{3,1^2|3^3}
+ \end{example}
+
+ \item\option{entries=contents} print the diagram where each box is
+ labelled by its \emph{content}, which is the row index minus the
+ column index.
+
+ \begin{example}
+ \Multidiagram[entries=contents,
+ charge={0,2}] {3,2,1|2^2}
+ \end{example}
+
+ As shown, the \option{charge} offsets the contents in each
+ component.
+
+ \item\option{entries=residues} print the diagram where each box is
+ labelled by its \emph{residue}, which is the row index minus the
+ column index modulo some integer~$e$, which must also be supplied.
+
+ \index{residues}
+ \index{tableau!residues}
+ \begin{example}
+ \Multidiagram[entries=residues, e=2]{3,2,1|1^3}
+ \end{example}
+
+ Specifying the \option{charge} offsets the residues in each component.
+
+ \begin{example}
+ \Multidiagram[french, entries=residues, e=3,
+ charge={1,2}]{3,2,1|1^2}
+ \end{example}
+
+ \medskip\noindent
+ As in \autoref{SS:entries}, residues for the other affine Cartan types
+ can be specified using \option{cartan=value}.
+
+ \end{itemize}
+
+ \option[]{label=labels}[a $|$-separated list of labels]
+
+ Use \option{label} to add labels to the component diagrams.
+
+ \begin{example}
+ \Multitableau[label={1|2}]{123,45,67|{12}{14}}
+ \end{example}
+
+ No extra space is allowed for the labels, so use the
+ \option{separation} key, or \option{xoffsets} and \option{yoffsets},
+ to adjust for wide labels.
+
+ \option[A]{name=text}[character]<multi>
+
+ The \option{name} option is used to change the default prefix for the
+ box node names. In a tableau, or diagram, the box names depend on the
+ \emph{row} and \emph{column} indices. In a multitableau, or
+ multidiagram, the box names depend on the \emph{component}, \emph{row}
+ and \emph{column} indices. Explicitly, by default, in multitableaux
+ and multidiagrams the names of the take the form \textsf{A-k-r-c},
+ where~\textsf{k} is the component index,~\textsf{r} is the row index,
+ and~\textsf{c} is the column index of the box.
+ \footnote{This follows the convention for nodes in multidiagrams
+ from~\cite{EvseevMathas:DeformedKLR}, rather than the somewhat misguided
+ convention that the author introduced in~\cite{DJM:cyc}.}
+ The \textsf{B} can be changed like using the \option{name} key.
+
+ \begin{example}
+ \Multitableau[name=A, tikz after = {
+ \draw[red, thick,<->](A-1-2-2.south east) to
+ [out=315,in=225] (A-2-2-1.south west);
+ }] { 123,4*5 | 67,*89}
+ \end{example}
+
+ \option[]{paths=path specifications}[a $|$-separated list of ribbon path specifications]<multi>
+ \option*[]{ribbons=ribbon specifications}[a $|$-separated list of ribbon specifications]<multi>
+ \option*[]{snobs=snob specifications}[a $|$-separated list of ribbon specifications]<multi>
+
+ The \option{paths}<multi>, \option{ribbons}<multi>, and
+ \option{snobs}<multi> keys work in exactly the same way for
+ multitableaux and multidiagrams as they do for tableaux and diagrams,
+ except that the ribbons for different components are separated by a
+ pipe $|$.
+
+ \begin{example}
+
+ \Multitableau[ribbons={(R)11*r | (Y)12rc},
+ styles={R={fill=red!10, opacity=0.5},
+ Y={fill=yellow!20, opacity=0.5}
+ }] { 123,45 | 67,89}
+ \end{example}
+
+ Notice that the $4$ is the first component has disappeared because
+ the second node in the ribbon \textsf{(R)11*r} has $*$-styling, which
+ writes over the $4$. (One way to recover the missing entry is to use the
+ ribbon specification \textsf{(R)11*r\textunderscore4}.)
+
+ \option[]{rows=number}[a decimal number]
+
+ The \option{rows} option sets the number of rows covered by the
+ delimiters in multitableaux and multidiagram. By default, the
+ \keyword{\Multitableau} and \keyword{\Multidiagram} set
+ the size of the delimiters so that they match the component diagrams, which may
+ not be what you want especially when using the \option{australian} and
+ \option{ukrainian} conventions. The value of \option{rows} can be a
+ decimal number.
+
+ \begin{example}
+ \Multidiagram[ukrainian, scale=0.5]{3,2^2|...|2,1^2}
+ \end{example}
+
+ \begin{example}
+ \Multitableau[rows=3, scale=0.8, box font=\tiny]
+ {{1_1}{1_1}{1_1}{2_1},{2_1}{2_1}{2_1} |
+ {1_2}{3_3},{2_2} |
+ {1_3}{1_3},{2_3}}
+ \end{example}
+
+ \begin{example}
+ \Multitableau[ukrainian, rows=2.5, scale=0.8, box font=\tiny]
+ {{1_1}{1_1}{1_1}{2_1},{2_1}{2_1}{2_1} |
+ {1_2}{3_3},{2_2} |
+ {1_3}{1_3},{2_3}}
+ \end{example}
+
+ \option[true]{separators}[true/false]
+ \option*[false]{no separators}[false/true]
+
+ When \option{separators} is true, delimiters are drawn around the
+ component diagrams in a multitableaux and a multidiagram and
+ separators are drawn between the component shapes, and
+ \option{no separators} is the inverse option. By default, separators
+ and delimiters are drawn.
+
+ \begin{example}
+ \Multitableau[separators, scale=0.8]
+ {123,45,67 | 89,{10}{11}} \par\bigskip
+ \Multidiagram[no separators, scale=0.7]
+ {3,2^2|2,1^2} \par\bigskip
+ \end{example}
+
+ \option[$|$]{separator=text}[character]
+
+ The \option{separator} determines what is printed between the
+ component diagrams in multitableaux and multipartition. By default,
+ \option{separator=$|$} draws a straight line between the
+ components, but any character can be used.
+
+ \begin{example}
+ \Multitableau[separator={,}]{ 123,45 | 67,89} \par\bigskip
+ \Multidiagram[separator=:]{ 3,2 | 2^2 }
+ \end{example}
+
+ \option[\aTableauColour{Main}]{separator colour=colour}[a \LaTeX{} colour]
+
+ The \option{separator colour} sets the colour of the delimiters and
+ the separator between component diagrams. By default, the separators
+ are the same colour as the diagram border.
+
+ \begin{example}
+ \Multitableau[separator colour=red]{123,45 | 67,89} \par\bigskip
+ \Multidiagram[separator color=brown, separator=:]
+ {3,2 | 2^2 }
+ \end{example}
+
+ \option[0.3]{separation=number}[a decimal number (the distance in \unit{cm})]
+
+ The \option{separation} key sets the distance between the separators
+ and the component tableaux and diagrams.
+
+ \begin{example}
+ \Multitableau[separation=0.1]{123,45 | 67,89} \par\bigskip
+ \Multidiagram[separation=0.8]{3,2 | 2^2}
+ \end{example}
+
+ \option[]{skew=partitions}{a $|$-separated list of partitions}
+
+ Skew multishapes can be drawn using the \option{skew} option to
+ specify a $|$-separated list of inner shapes.
+
+ \begin{example}
+ \Multitableau[skew={2,1|1}]{ 123,45 | 7{10},89} \par\bigskip
+ \Multidiagram[skew={1|2,1}, skew boxes]{ 3,2 | 2^2 }
+ \end{example}
+
+ There is no command for drawing shifted multitableau or multidiagrams.
+ Such diagrams can be drawn using the
+ \option{skew} key. In the same way, it is possible to draw
+ multitableaux and multidiagrams with components that are a mixture of
+ non-skew, skew and shifted shapes.
+
+ \begin{example}
+ \Multitableau[skew={0,1|0,1}]{ 1236,45 | 7{10}{11},89} \par\bigskip
+ \Multidiagram[skew={|0,1}]{ 3,2 | 2,1 }
+ \end{example}
+
+ \option[true]{tabloid}[true/false]
+
+ Use the \option{tabloid} key for multitabloid diagrams and tableaux.
+
+ \begin{example}
+ \Multitableau[tabloid]{ 123,45 | 67,89} \par\bigskip
+ \Multidiagram[tabloid]{ 4,2 | 2^2 }
+ \end{example}
+
+ \option[0]{xoffsets=offsets}[$|$-separated list of $x$-offsets]
+ \option*[0]{yoffsets=offsets}[$|$-separated list of $y$-offsets]
+
+ The \keyword{\Multitableau} and \keyword{\Multidiagram} commands try
+ to draw the diagrams as compactly as possible with their first rows
+ aligned, and the distance between the separators given by the value of
+ \option{separation}. Use \option{xoffsets} to offset the
+ $x$-coordinates of the component diagrams and \option{yoffsets} to
+ offset their $y$-coordinates.
+
+ \begin{example}
+ \Multitableau[xoffsets={0.5,0.2}]{ 123,45 | 67,89} \par\bigskip
+ \Multidiagram[yoffsets={0,1.5}]{ 4,2 | 2^2 }
+ \end{example}
+
+ When using \option{xoffsets} or \option{yoffsets}, you may want to use
+ \option{no separators} to disable the separators between component
+ shapes. For example, here is a homogeneous Garnir tableau using the
+ style of~\cite{KMR:UniversalSpecht}, where no separators are used and
+ the component tableaux are stacked vertically.
+
+ \begin{example}[label=Ex:Garnir]
+ \Multidiagram[entries=first, no separators,
+ xoffsets={0|-1.1}, yoffsets={0|-1},
+ styles={O={fill=orange!50}, P={fill=purple!50}},
+ snob style={draw=red,double,thick,fill=white},
+ snobs={|(O)24_{15}c_{14}, (P)26_{17}c_{16}, 27_{18},
+ 31_{11}, (P)33_{13}c_{12}}
+ ]{1|7^2,4,1}
+ \end{example}
+
+ This is a slightly lazy way of drawing this multitableau because
+ \option{entries=first} is used to automatically populate most of the
+ entries and then \option{snobs=...} are used to rewrite the ``bricks''
+ in the homogeneous Garnir belt.
+
+ % --------------------------------------------------------------
+ \section{Abacuses} \label{S:Abacus} \index{abacus} \indexcmd{Abacus}
+
+ Gordon James introduced the abacus, with beads and runners, as another
+ way to represent a partition~\cite{James:YoungD}. The abacus is
+ particularly useful in modular representation theory, where the number
+ of runners is the (quantum) characteristic. Abacus combinatorics are
+ now used to help many algebras beyond their initial appearance in the
+ representation theory of the symmetric groups.
+
+ The partition corresponding to an abacus is given by counting the
+ number of empty bead positions before each bead on the abacus. The
+ \keyword{\Abacus} command, which draws an abacus representation of a
+ partition, has a similar syntax to the tableau and diagram commands.
+
+ \keyword{\Abacus (x,y) [options] {number of runners} {bead specifications}}
+
+ As with other \aTableau commands, the $(x,y)$-coordinates are
+ necessary if, and only if, the abacus is part of a
+ \keyword{tikzpicture} environment. The number of runners is a
+ positive integer that specifies the number of abacus runners.
+
+ % --------------------------------------------------------------
+ \subsection{Bead specifications}
+
+ In their simplest form, the bead specifications are a comma separated
+ list of non-negative integers specifying a partition. Partitions can
+ be given either as comma separated lists of non-negative integers, or
+ using exponential notation. The full bead specifications add optional
+ styling and bead labels.
+
+ Here are some examples showing basic usage of the \keyword{\Abacus}
+ command:
+
+ \begin{Example}
+ \aTabset{align=top}
+ \Abacus{1}{2,1,1} \qquad \Abacus{2}{2,1^2,0^3} \qquad \Abacus{3}{2,1^2,0^5} \qquad
+ \Abacus{4}{2,1^2,0^5} \qquad \Abacus{5}{2,1^2,0^5} \qquad \Abacus{6}{2,1^2,0^5}
+ \end{Example}
+
+ The beads in an abacus correspond to the parts of the partition. Just
+ as with the \keyword{\Tableau} command, each of the beads can be given
+ optional styling, which can either be given by prepending a
+ \keyword{*}, which applies the \option{abacus star style}, or by
+ giving \TikZ styling-keys inside square brackets \keyword{[...]}.
+ When exponential notation is used, the styles are applied to all of the
+ associated beads.
+
+ \begin{example}
+ \aTabset{align=top}
+ \Abacus{3}{3,*2^3,1} \qquad
+ \Abacus{4}{2,*1,[ball color=red]1^2, *1,
+ [ball color=orange]1,[ball color=brown]0}
+ \end{example}
+
+ In particular, in the right-hand abacus, the two beads corresponding
+ to \keyword{1^2} are coloured red, whereas the other three beads that
+ correspond to a~$1$ are either orange or an off-white colour, which is
+ the default \option{abacus star style}. As with the tableaux commands,
+ we recommend using \keyword{\tikzset} to define more complicated bead styles.
+
+ In addition to applying style to the individual beads on the abacus,
+ \emph{labels} for any bead can (optionally) be given as a subscript in the
+ bead specifications. Again, the same labels are applied to all of the
+ corresponding beads when exponential notation is used.
+
+ \begin{example}
+ \Abacus{2}{5_5, 4_4, 3_3, 2_2,0_0} \qquad
+ \Abacus[styles={R={ball color=red, text=yellow}}]
+ {3}{*5^2_5, [R]4^3_4, 3, 2_2,*0^2_{oo}} \qquad
+ \Abacus{4}{8^2_-,7_+,5_a,4^2_b,1_\times^3,1_d}
+ \end{example}
+
+ The bead labels are arbitrary, however, anything wider than the bead
+ will spill into the abacus. Traditionally, abacus beads are not labelled,
+ but you can give labels to as many beads as you like.
+
+ You can remove beads that you have placed on the abacus using the \emph{no shade} style%
+ \footnote{\TikZ \emph{does not} provide a way to disable
+ a shading that is already in effect. The \emph{no shade} style, which is
+ based on a \href{https://tex.stackexchange.com/a/85750/234252}{stack exchange post},
+ is available whenever the \aTableau package is loaded.}.
+ The point of being able to remove beads in this way is that this
+ allows you to put something else in its place using the bead label.
+ In such cases, you probably want to change the text colour, which is white
+ by default.
+
+ \begin{example}[label=Ex:NoShade]
+ \Abacus[styles={C={no shade,text=red}}]
+ {5}{8^2_-,7_+,5_a,4^2_b,[C]1_\bullet^3,1_d}
+ \end{example}
+ \index{no shade}
+
+ As with tableau boxes, the bead labels are typeset in
+ mathematics~mode by default. This can changed using
+ \option{math entries} and \option{text entries}.
+ \index{math entries!abacus}
+ \index{text entries!abacus}
+
+ % --------------------------------------------------------------
+ \subsubsection{Abacus coordinates}\label{SS:abcoordinates}
+ \index{xy@$(x,y)$}
+ \index{Cartesian coordinates!abacus}
+
+ The $(x,y)$-coordinates are required if, and only if, the
+ \keyword{\Abacus}command is used inside a \keyword{tikzpicture}
+ environment, in which case $(x,y)$ gives the coordinates of the
+ ``outside corner'' of the box in row~$1$ and column~$1$ of the
+ tableau. The following example shows how tableaux are placed using
+ $(x,y)$-coordinates inside a \keyword{tikzpicture} environment. The
+ example also shows that, by default, the beads and runners in an
+ abacus are half a unit apart.
+
+ \begin{example}
+ \begin{tikzpicture}[add grid]
+ \aTabset{abacus ends=_|}
+ \Abacus(0,0.5) [south] {3}{2,1^2}
+ \Abacus(0,2) [east, bead=red] {3}{2,1^2}
+ \Abacus(2.5,0.5)[north, bead=orange] {3}{2,1^2}
+ \Abacus(3.5,-1) [west, bead=brown] {3}{2,1^2}
+ \end{tikzpicture}
+ \end{example}
+
+ % --------------------------------------------------------------
+ \subsection{Abacus keys}
+
+ The abacus keys, or options, control the general appearance of the
+ abacuses drawn by the \keyword{\Abacus} command. Many of the options,
+ or keys, for tableaux and diagrams can be applied to abacuses, and we
+ do not discuss all of these options here. For example, the
+ \keyword{\Abacus} command accepts the following keys:
+ \option{align}, \AddKeyLink{align-abacus}\AddKeyLink{halign-abacus}\AddKeyLink{valign-abacus}
+ \option{math entries}, \AddKeyLink{math entries-abacus}
+ \option{text entries}, \AddKeyLink{text entries-abacus}
+ \option{name}, \AddKeyLink{name-abacus}
+ \option{scale}, \AddKeyLink{scale-abacus}\AddKeyLink{xscale-abacus}\AddKeyLink{yscale-abacus}
+ \option{styles}, \AddKeyLink{styles-abacus}
+ \option{tikz after}, \AddKeyLink{tikz after-abacus}
+ \option{tikz before}, and \AddKeyLink{tikz before-abacus}
+ \option{tikzpicture}. \AddKeyLink{tikzpicture-abacus}
+ See \autoref{S:keys} for the complete list.
+
+ \option[-]{south}
+ \option*[]{east}
+ \option*[]{north}
+ \option*[]{west}
+
+ Just like tableaux, abacus have four different conventions. By
+ default, abacuses are drawn with the runners pointing to the south,
+ from top to bottom, and runners increasing from left to right. Similar
+ to tableaux, we number the rows $0,1,\dots$, and we number the
+ runners, or columns, $0,1,\dots,e-1$, from left to right (when using
+ \option{south}). If there are $e$ runners, then the bead in row~$r$
+ and column~$c$ is in position $er+c$. See \autoref{Ex:BeadPositions}
+ for an example.
+
+ Using the keys \option{east}, \option{north} and \option{west},
+ abacuses can be drawn so that the row index increases to the east,
+ north, and west, respectively.
+
+ \begin{Example}
+\Abacus[south,entries=betas]{2}{4^2,2,1}\qquad\Abacus[east,entries=betas]{2}{4^2,2,1}\qquad
+\Abacus[north,entries=betas]{2}{4^2,2,1}\qquad\Abacus[west,entries=betas]{2}{4^2,2,1}
+ \end{Example}
+
+ To make these conventions clearer, we have used
+ \option{entries=betas}<abacus> to label the beads in these abacuses by
+ their bead positions, or \emph{beta numbers}.
+
+ \option[$-|$]{abacus ends} [any pair of: $-$, \_\!\_, ., *, $|$, \textgreater]
+ \option*[very thick, draw=\aTableauColour{Inner}]{abacus ends style=style}[\TikZ-styling]
+
+ The \option{abacus ends} key sets the style used for the top and
+ bottom of the abacus. The meaning of these six symbols is the
+ following:
+
+ \begin{quote}
+ \begin{options}[labelwidth=1em, nosep]
+ \item[*$-$] Adds a line that extends slightly past the first and last runners
+ \item[*\_\!\_] Adds a line between the first and last runners
+ \item[*.] Add dots to the end of each runner
+ \item[**] Add dots and an arrow to the end of each runner
+ \item[*$|$] The runners do not have any additional decoration
+ \item[*$>$] Add arrows to the end of each runner
+ \end{options}
+ \end{quote}
+
+ Exactly two of these styling characters must be given when setting
+ \option{abacus ends}. There are six options for the top of the abacus,
+ and six options for the bottom, so there are 36 possible
+ configurations (most of which will never be used...). We do not list
+ all of them, but here are some examples.
+
+ \begin{Example}
+ \aTabset{align=top}
+ \Abacus[abacus ends=-|]{3}{2,1^2,0^3}\qquad\Abacus[abacus ends=-_]{3}{2,1^2,0^3}\qquad
+ \Abacus[abacus ends=_.]{3}{2,1^2,0^3}\qquad\Abacus[abacus ends=>>]{3}{2,1^2,0^3}\qquad
+ \Abacus[abacus ends=>|]{3}{2,1^2,0^3}\qquad\Abacus[abacus ends=_-]{3}{2,1^2,0^3}\qquad
+ \Abacus[abacus ends=>-]{3}{2,1^2,0^3}\qquad\Abacus[abacus ends=-*]{3}{2,1^2,0^3}
+ \end{Example}
+
+ As one more example, \emph{beta numbers} can be displayed on a single
+ runner using:
+
+ \begin{example}
+ \Abacus[abacus ends=**, east, rows=7]{1}{2,1^2,*0^2}
+ \end{example}
+
+ The \option{abacus ends style} key changes the \TikZ-styling of the
+ ends of the abacus. By default, this styling is the same as the
+ styling for the abacus runners, which is set using
+ \option{runner style}. Changes to \option{runner style} also change
+ the style of the abacus ends, but their style is ultimately determined
+ by \option{abacus ends style}.
+
+ \begin{example}
+ \Abacus[abacus ends style={aTableauMain,
+ ultra thick}]{3}{2,1^2,0^3}\qquad
+ \Abacus[runner style=cyan]{3}{2,1^2,0^3}\qquad
+ \Abacus[abacus ends style=aTableauMain,
+ runner style=cyan] {3}{2,1^2,0^3}
+ \end{example}
+
+ \option[ball color=\aTableauColour{StarStyle}, text=\aTableauColour{Main}]{abacus star style=style}
+ [\TikZ-styling]
+
+ The \option{abacus star style} key appends \TikZ-style keys to the
+ abacus $*$-style:
+
+ \begin{example}
+ \Abacus{3}{5,*4_a,*1^2,0^4} \qquad
+ \Abacus[abacus star style={ball color=yellow,text=black}]
+ {3}{5,*4_a,*1^2,0^4}
+ \end{example}
+
+ \option[\aTableauColour{Main}]{bead=colour}[a \LaTeX colour]
+
+ The \option{bead} key sets the bead colour.
+
+ \begin{example}
+ \Abacus{2}{2^3,1} \qquad
+ \Abacus[bead=black]{3}{4^3,2,1} \qquad
+ \Abacus[bead=red]{4}{4^3,[ball color=blue]2,1}
+ \end{example}
+
+ The \option{bead} key changes the colour of every bead on the
+ abacus. As shown, the colour of individual beads can be changed by
+ applying the \TikZ-style \keyword{ball color} to the bead.
+
+ \option[\textbackslash small]{bead font=font command}[\LaTeX\ font command]
+
+ The \option{bead font} key sets the font used for the bead labels.
+ By default, these labels are typeset as mathematics, so
+ this is mainly useful for changing the font size (because, for example
+ \keyword{\bfseries $1$} does not make the $1$ bold). It is only when
+ you are using \option{text entries} that font commands like
+ \keyword{\itshape} and \keyword{\bfseries} will have any effect.
+
+ \begin{example}
+ \Abacus{3}{3_3,2^2,1^3} \qquad
+ \Abacus[bead font=\tiny]{3}{3_3,2^2,1^3} \qquad
+ \Abacus[text entries, bead font=\bfseries]{3}{3_3,2^2,1^3}
+ \end{example}
+
+ The \option{scale} key can also be used to resize abacuses.
+
+ \option[0.4]{bead size=number}[decimal number, distance in \unit{cm}]
+ \option*[0.42]{bead sep=number}[decimal number, distance in \unit{cm}]
+ \option*[0.42]{runner sep=number}[decimal number, distance in \unit{cm}]
+
+ These three keys control the size of the beads and the distance
+ between them, so they would normally be used together. By default, the
+ \emph{diameter} of the abacus beads is \qty{0.4}{cm}, the distance
+ between adjacent beads on the same runner is \qty{.42}{cm}, and the
+ distance between consecutive runners is \qty{0.42}{cm}.
+
+ \begin{example}
+ \Abacus[bead size=0.6,
+ bead sep=0.65,
+ runner sep=0.65]
+ {3}{3_3,2^2,1^3}
+ \end{example}
+
+ As with tableau, you can also change the size of the abacuses using
+ \option{scale}<abacus>, \option{xscale}<abacus> and
+ \option{yscale}<abacus>. Changing these keys globally affects both
+ abacuses and tableaux.
+
+ \option[]{bead style=style}[\TikZ-styling]
+
+ The keys above are usually sufficient for fine-tuning the style of the
+ abacus beads. Alternatively, the \option{bead style} key appends
+ \TikZ-styling to the default bead style, which has many moving parts.
+
+ \begin{example}
+ \Abacus[bead style={shading=axis}, bead text=red] {3}{3_3,2^2,1^3} \qquad
+ \Abacus[bead style={no shade, fill=aTableauMain}] {3}{3_3,2^2,1^3}
+ \end{example}
+
+ By default, the beads look like balls (they use the
+ \TikZ-styling \keyword{shading=ball, ball color=}\aTableauColour{Main}).
+ In contrast, the beads on the left look like go beads, and those
+ on the right are flat.
+
+ \option[white]{bead text=colour}[a \LaTeX~colour]
+
+ The \option{bead text} key sets the text colour of the abacus labels.
+
+ \begin{example}
+ \Abacus[bead=blue, bead text=yellow] {3}{3_3,2^2,1^3}
+ \end{example}
+
+ \option[false]{beta numbers}[false/true]
+
+ When \option{beta numbers} is set, the numbers in the bead
+ specifications are entered as \emph{beta numbers}. The beta numbers
+ give the bead positions, which are numbered $0,1,\dots$, starting from
+ the first row and then continuing in this way in subsequent rows. More
+ explicitly, if there are $e$ runners then the bead in row~$r$ and
+ column~$c$ is in position $er+c$. Up to shift, bead numbers are first
+ column hook lengths. In particular, beta numbers are pairwise
+ distinct.
+
+ \begin{example}
+ \Abacus{3}{3,2^2} \qquad
+ \Abacus[beta numbers]{3}{5,3,2} \qquad
+ \Abacus[beta numbers]{3}{6,4,3,[ball color=red]0}
+ \end{example}
+
+ There is no inverse key to \option{beta numbers}, however,
+ \option{beta numbers=false} will remove the requirement to use beta
+ numbers in the bead specifications.
+
+ \option[]{dotted cols=column indices}[list of runner indices]<abacus>
+ \option*[]{dotted rows=row indices}[list of row indices]<abacus>
+
+ The \option{dotted rows}<abacus> and \option{dotted cols}<abacus> keys
+ draw abacuses where the specified rows and columns are replaced with
+ dots. This makes it possible to draw \emph{generic} abacuses, where
+ the number of rows and columns is not fully specified. Note that for
+ abacuses, both the row and column indexing starts from~$0$.
+
+ \begin{example}
+ \Abacus[dotted rows={2,4}]{4}{8,5,4,3,2,1} \qquad
+ \Abacus[dotted cols={1,3},abacus ends=-*]{6}{9,8,5,4,3^3,2}
+ \end{example}
+
+ As with tableau, consecutive rows and columns are treated together.
+
+ \begin{example}
+ \Abacus[dotted rows={1,2,3}]{4}{8,5,4,3,2,1} \qquad
+ \Abacus[dotted cols={1,2,3},abacus ends=-*]{6}{9,8,5,4,3^3,2}
+ \end{example}
+
+ Comparing these two examples shows that the beads and runners in the
+ dotted rows and columns are removed by \option{dotted rows}<abacus>
+ and \option{dotted cols}<abacus>, respectively. Named coordinates,
+ for use with \option{name}<abacus>, are not created for the bead and
+ tick positions on the dotted rows and columns.
+
+ The \option{dotted cols}<abacus> ad \option{dotted rows}<abacus> keys
+ can be used together, in which case the \option{dotted rows}<abacus>
+ are removed first, after which the \option{dotted cols}<abacus> are
+ removed. The output may need to be adjusted if the dotted rows and
+ columns overlap. For example, consider the abacus:
+
+ \begin{example}
+ \Abacus[dotted cols={2,3},
+ dotted rows={2,3}
+ ]{6}{26,21^2,5^2,3,2^2,0^2}
+ \end{example}
+
+ The cross-hatched dots in the centre of the abacus are not ideal. The
+ following trick addresses this:
+
+ \begin{example}[lefthand width=0.16\textwidth, label=Ex:DottedAbacus]
+ \Abacus[dotted cols={2,3}, dotted rows={2,3},
+ tikz after = {
+ \draw[aTableau/clearBoxes](A-1-1.south east)rectangle(A-4-4.north west);
+ \draw[aTableau/dottedLine](A-1-1.south east)--(A-4-4.north west);
+ }
+ ]{6}{26,21^2,5^2,3,2^2,0^2}
+ \end{example}
+
+ \option[]{entries=value}[betas, residues, rows, shape]<abacus>
+
+ Like the \option{entries} key for tableaux, the
+ \option{entries}<abacus> key for abacuses provides a shortcut for
+ labelling the abacus beads by some common choices. The possible
+ choices are:
+
+ \begin{itemize}
+
+ \item\option{entries=betas}\index{entries!beta}\index{beta numbers!entries}
+ \label{beta numbers!abacuses}
+ Labels the beads by the corresponding \emph{beta numbers}.
+ \begin{example}
+ \Abacus[entries=betas]{3}{3,2^2,0^2} \qquad
+ \Abacus[entries=betas]{4}{3,2^2,1^3,0^2}
+ \end{example}
+
+ \item\option{entries=residues}\index{entries!residues}
+ Labels the beads by their residues. Unlike for tableaux, it is not
+ necessary to specify the quantum characteristic \option{e}<abacus>,
+ because this is determined by the number of runners and the
+ \option{cartan}<abacus> type. You can override this by setting
+ \option{e}<abacus> manually.
+ \begin{example}
+ \Abacus[entries=residues,]{3}{3,2^2,0^2} \qquad
+ \Abacus[entries=residues, cartan=C]
+ {4}{3,2^2,1^3,0^2}
+ \end{example}
+
+ \AddKeyLink{e-abacus}
+ \AddKeyLink{charge-abacus}
+ \AddKeyLink{cartan-abacus}
+ \noindent
+ As with (multi)tableau, use the \option{charge}<abacus> key to
+ add an offset to the residues, and the \option{cartan}<abacus> key for
+ residues of other Cartan types.
+
+ \item\option{entries=rows}\index{entries!rows}
+ Labels the beads by their rows index of the corresponding part in the
+ partition.
+ \begin{example}
+ \Abacus[entries=rows]{3}{3,2^2,0^2} \qquad
+ \Abacus[entries=rows]{4}{3,2^2,1^3,0^2}
+ \end{example}
+ \noindent
+ As shown, the beads corresponding to zero parts of the corresponding
+ partition are marked with a dash, since there is no corresponding row
+ in partition for such beads.
+
+ \item\option{entries=shape}\index{entries!partition}
+ Labels the beads by their shape. That is, each bead is labelled by the
+ corresponding by the corresponding part of the partition.
+ \begin{example}
+ \Abacus[entries=shape]{3}{3,2^2,0^2} \qquad
+ \Abacus[entries=shape]{4}{3,2^2,1^3,0^2}
+ \end{example}
+
+ \end{itemize}
+
+ \option[A]{name=text}{text}
+
+ Just like the tableaux commands, the \keyword{abacus} command defines
+ named coordinates for all of the \emph{beads} and \emph{ticks} on the
+ abacus. By default, the named coordinates take the form
+ $(\mathsf{A{-}r{-}c})$, for the bead or tick in row~$r$ and column~$c$ of the
+ abacus. Note that for abacuses, both the row and column indexing starts
+ from~$0$. The key \option{name} changes the prefix used for the names.
+ For example, after \option{name=X} the bead and tick names take the
+ form~$(\mathsf{X{-}r{-}c})$.
+
+ \begin{Example}[label=Ex:BeadPositions]
+ \Abacus[name=X,
+ tikz after={
+ \draw[orange,<-,thick] (X-0-0.west) -- ++(-1,0)
+ node[blue,align=left,anchor=east] {Empty bead\\ position};
+ \draw[red,<-,thick] (X-2-2.east) -- ++(2,0)
+ node[blue,align=left,anchor=west] {First part of\\the partition};
+ }]{3}{4^3,1^2}
+ \end{Example}
+
+ \option[]{no shade}[]
+
+ The abacus balls are drawn with the \TikZ style
+ \keyword{shading=ball}. As noted in \autoref{Ex:NoShade}, you can
+ disable the \TikZ-ball shading for individual beads using the \TikZ-style \keyword{no shade}. The
+ \option{no shade} key disables the ball shading for \emph{all} beads,
+ which allows you to fully customise how the abacus beads are
+ displayed.
+
+ \begin{example}
+ \Abacus[no shade, bead text=red]{3}{3_1,2_2,2_3} \qquad
+ \Abacus[bead style={no shade, shape=diamond,
+ fill=brown, text=yellow}]{3}{3_1,2_2,2_3,0^2}
+ \end{example}
+
+ As the first example shows, if you use the \option{no shade} key then
+ you need to define a new style for the abacus beads. As the second
+ example shows, rather than using \option{no shade} as an
+ \keyword{\Abacus} key, you can use it inside \option{bead style} as a
+ \TikZ-style. (We include the \option{no shade} option partly for
+ convenience and partly to advertise how to use it.)
+
+ \option[]{rows=row index}[non-negative integer]<abacus>
+
+ By default, the \keyword{\Abacus} command uses the smallest number of
+ rows necessary to display all of the beads on the abacus. Use
+ \option{rows}<abacus> to change the number of rows displayed. If you use
+ the \option{rows}<abacus> key, then it is your responsibility to ensure that
+ the abacus has enough rows to display all of the beads.
+
+ \begin{example}
+ \Abacus{3}{3,2^2,0^2} \qquad
+ \Abacus[rows=4]{3}{3,2^2,0^2} \qquad
+ \Abacus[rows=5]{3}{3,2^2,0^2}
+ \end{example}
+
+ \option[draw=\aTableauColour{Inner}]{runner=colour}[a \LaTeX colour]
+ \option*[very thick]{runner style=style}[\TikZ-styling]
+
+ Use \option{runner} to set the colour of abacus runners.
+
+ \begin{example}
+ \Abacus{3}{3,2^2} \qquad
+ \Abacus[runner=red]{3}{5,3,2,0^2} \qquad
+ \Abacus[runner=brown, bead=blue]
+ {3}{6,4,3,[ball color=red]0^2}
+ \end{example}
+
+ The \option{runner style} key appends \TikZ-styling to the abacus
+ runner style.
+
+ \begin{example}
+ \Abacus[runner style={dashed}]{3}{3,2^2} \quad
+ \end{example}
+
+ \option[]{runner labels=labels}{list of labels for the abacus runners}
+ \option*[font=\textbackslash scriptsize, text=\aTableauColour{Inner}]{runner label style=style}[\TikZ-styling]
+
+ The \option{runner labels} key adds labels to the each runner. An
+ error if given if the number of labels does not match the number of
+ runners. Use \option{runner label style} to change the style of the
+ label.
+
+ \begin{example}
+ \Abacus[runner labels={1,2,0},
+ entries=residues]{3}{3,2^2,0^2} \qquad
+ \Abacus[runner labels={2,3,0,1}, entries=residues,
+ runner label style={circle, draw=cyan, inner sep=0pt,
+ minimum size=2.5mm}] {4}{5,3,2^2,0^2}
+ \end{example}
+
+ As with the \option{label} key for tableau, the runner labels are
+ typeset as mathematics, by default.
+
+ \option[\aTableauColour{Inner}]{tick=colour}[a \LaTeX colour]
+ \option*[semithick]{tick style=style}[\TikZ-styling]
+ \option*[0.1]{tick length=number}[length in \unit{cm}]
+
+ These three keys control the ticks on the abacus runners, which mark
+ the empty bead positions. Use \option{tick} to the colour of the
+ ticks on the abacus runners. The other two key have the obvious meanings.
+
+ \begin{example}
+ \Abacus[tick=red]{3}{6,4,3,1,0} \qquad
+ \Abacus[tick style={ultra thick,orange}]{3}{6,4,3,1,0} \qquad
+ \Abacus[tick length=0.3]{3}{6,4,3,1,0} \qquad
+ \end{example}
+
+ % --------------------------------------------------------------
+ \section{Examples from the literature}
+
+ This section shows how to draw some tableaux that appear in the
+ literature. All of these diagrams predate this package. The aim of
+ this section is to show how these pictures can be drawn using this
+ package.
+
+ Diagrams like the following are common. Note the use of a ribbon to
+ add the $\alpha$ in row~$6$ and column~$8$.
+
+ \begin{example}
+ \Diagram[french, no boxes, ribbons={*68_\alpha}]
+ {15,13,12,9,8^2,5,3}
+ \end{example}
+
+ Mendes~ \cite{Mendes:hooks} uses tableaux like these to give a new
+ proof of the Murnaghan-Nakayama rule.
+
+ \begin{example}
+ \tikzset{C/.style={circle,draw=blue,
+ minimum size=3.5mm, fill=white,thick}}
+ \Diagram[paths={
+ [C]13_1cc_\bullet, [C]21_2r_\bullet,
+ [C]23_3c_\bullet, [C]14_4
+ }]{4,3,1} \qquad
+ \Diagram[path style={rounded corners},
+ paths={[C]12_1cr_\bullet, [C]14_2c_\bullet,
+ [C]23_3c_\bullet, [C]31_4}]{4,3,1}
+ \end{example}
+
+ The following ribbon tableau comes from a nice paper by
+ Fayers~\cite{Fayers:DyckTilings}, which is uses Dyck tilings to
+ understand homogeneous Garnir relations for KLR algebras of type~$A$.
+
+ \begin{example}
+ \RibbonTableau[skew={1^2}, ukrainian, scale=0.7,
+ ribbons={(draw=none)21_m}
+ ]{
+ 12,16c_\circ c_\circ c_\circ r_\circ r_\circ *r,
+ 18crcccrr*r,19,1{10},1{11},1{12},
+ 22,29crcccrr*rccrcrr,
+ 2{12}ccrcrcccrr*r_lccrcrrr,
+ 31,*32,41,42,51,52,53,
+ 62cr,81,91,{10}1,{10}2,{11}1,{11}2
+ }
+ \end{example}
+
+ The entries of a tableau are usually single characters, or numbers,
+ but they can be more complicated. The paper
+ \cite{bowman2023quiverpresentationsisomorphismshecke} contains
+ tableaux with entries that are \emph{symbols}, which are produced by
+ the \keyword{\Symb} command below.
+
+ \begin{example}
+ \newcommand\Symb[2]{\genfrac{}{}{0pt}{}{#1}{#2}}
+ \Tableau[ukrainian, box font=\scriptsize,
+ tikz after = {\draw[ultra thick, red]
+ (A-2-3.east)--(A-2-2.south)--(A-3-2.west)
+ --(A-3-3.north)--cycle;
+ }]{
+ {\Symb11}{\Symb11}{\Symb11}{\Symb0s},
+ {\Symb11}{\Symb11}{\Symb11}{\Symb0s},
+ {\Symb11}{\Symb11}{\Symb{s^*}s}{\Symb0f},
+ {\Symb11}{\Symb11}{\Symb11},
+ {\Symb11}{\Symb11}
+ }
+ \end{example}
+
+ The next example, also from
+ \cite{bowman2023quiverpresentationsisomorphismshecke}, is a little
+ more involved. Most of the diagram is drawn using \emph{pics} from
+ \TikZ, which are a good way to add repeating features to a
+ \keyword{tikzpicture}. In the code below, \emph{pics} are used to add
+ the up and down strings to this drawing, taking as input the string
+ colour, the starting box, the list of the boxes the strings goes
+ through, and the final box. At the risk of further obfuscation, this
+ could be done a little more efficiently. From the perspective of this
+ manual, the most interesting feature of this picture is that it is a
+ non-trivial example that uses the named nodes for
+ the tableaux boxes; see \autoref{E:NodeNames}.
+
+\begin{Example}[label=Ex:waves]
+\begin{tikzpicture}[
+ Cap/.style={out=45, in=135}, % caps are drawn with to[Cap]
+ Cup/.style={out=315,in=225}, % cups are drawn with to[Cup]
+ every node/.style={font=\scriptsize},
+ redribbon/.style={fill=red!40,opacity=0.4},
+ % define pics for drawing the curvy up and down strings
+ pics/ustring/.style n args = {4}{% {colour}{first coord}{wave coords}{last coord}
+ code = {
+ \def\last{#2} % should not be necessary
+ \draw[thick,#1](T-|#2.north west)node[above=-3.5]{$\vee$}--(#2.north west)
+ foreach [remember=\pt as \last (initially #2)] \pt in {#3}
+ {to[Cup](\last.north east) to[Cap] (\pt.north west)}
+ to[Cup] (#4.north east) -- (#4.north east|-T)node[below=-3.5]{$\wedge$};
+ }
+ },
+ pics/dstring/.style n args = {4}{% {colour}{first coord}{wave coords}{last coord}
+ code = {
+ \def\last{#2} % should not be necessary
+ \draw[thick,#1](O-|#2.south west)node[below=-3.5]{$\wedge$}--(#2.south west)
+ foreach [remember=\pt as \last (initially #2)] \pt in {#3}
+ {to[Cap](\last.south east) to[Cup] (\pt.south west)}
+ to[Cap] (#4.south east) -- (#4.south east|-O)node[above=-3.5]{$\vee$};
+ }
+ },
+ ]
+ \coordinate (O) at (0,0); \coordinate (T) at (0,3.2);
+ \draw(-2,0)--(2.5,0) (-2,3.2)--(2.5,3.2);
+ \Diagram(0,0)[ukrainian, inner style=dotted, ribbons={(redribbon)24rcrcrc}]{5,4^3,3}
+ \pic at (T) {ustring={gray}{A-1-5}{}{A-1-5}}; % up strings
+ \pic at (T) {ustring={gray}{A-4-4}{}{A-4-4}};
+ \pic at (T) {ustring={gray}{A-5-2}{A-4-3,A-3-4}{A-3-4}};
+ \pic at (T) {ustring={gray}{A-5-3}{}{A-5-3}};
+ \pic at (T) {ustring={red}{A-5-1}{A-4-2,A-3-3,A-2-4}{A-2-4}};
+ \pic at (O) {dstring={gray}{A-1-1}{}{A-1-1}}; % down strings
+ \pic at (O) {dstring={gray}{A-2-1}{A-1-2}{A-1-2}};
+ \pic at (O) {dstring={gray}{A-3-1}{A-2-2,A-1-3}{A-1-3}};
+ \pic at (O) {dstring={gray}{A-4-1}{A-3-2,A-2-3,A-1-4}{A-1-4}};
+ \pic at (O) {dstring={gray}{A-5-1}{A-4-2,A-3-3,A-2-4,A-1-5}{A-1-5}};
+\end{tikzpicture}
+\end{Example}
+
+ % --------------------------------------------------------------
+ \section{Summary of \aTableau commands and options}\label{S:keys}
+ \rowcolors{2}{LightSkyBlue!10}{}
+
+ For this impatient, this section compactly lists the \aTableau
+ commands and their options. The sections above show these commands and
+ options are used, with examples.
+
+ The \aTableau package provides the following commands:
+
+ \begin{center}
+ \begin{tabular}{Lll}\toprule
+ \large\sffamily\color{MidnightBlue}Command
+ & \large\sffamily\color{MidnightBlue} Picture
+ & \large\sffamily\color{MidnightBlue} Section \\\midrule
+ Abacus & An abacus for a partition & \autoref{S:Abacus}\\
+ Diagram & A Young diagram for a partition & \autoref{S:Diagram}\\
+ Multidiagram & An $\ell$-tuple of Young diagrams & \autoref{S:Multitableau} \\
+ Multitableau & An $\ell$-tuple of tableaux & \autoref{S:Multitableau} \\
+ RibbonTableau & A ribbon tableau & \autoref{S:RibbonTableaux} \\
+ ShiftedDiagram & A shifted Young diagram & \autoref{S:Shifted} \\
+ ShiftedTableau & A shifted tableau & \autoref{S:Shifted} \\
+ SkewDiagram & A skew Young diagram & \autoref{S:Skew} \\
+ SkewTableau & A skew tableau & \autoref{S:Skew} \\
+ Tableau & A tableau & \autoref{S:Tableau} \\
+ Tabloid & A tabloid & \autoref{S:Tabloid} \\
+ \bottomrule
+ \end{tabular}
+ \end{center}
+
+ In addition, the \keyword{\aTabset} command is provided for setting
+ can default \aTableau values for the \aTableau options.
+
+ For easier reference, here is the list of the \aTableau keys, together
+ with a quick explanation of what they do. The last two columns
+ indicate whether the options apply to tableau (and diagrams), or to
+ abacuses~--- or both! Options starting with \keyword{(no)} are a pair
+ of boolean options and their inverses. If not given a true or false
+ value then they are implicitly set to true. Although not explicitly
+ listed, spelling variations of keys from the American dialect
+ of English are tolerated.
+
+ Both the key names and the green ticks below are hyperlinks to the
+ relevant sections of the manual.
+
+ \newcommand\heading[1]{\textcolor{MidnightBlue}{\textsf{\large#1}}}
+ \rowcolors{2}{LightSkyBlue!10}{}
+ \begin{xltabular}{0.9\textwidth}{l>{\raggedright}Xcc}\toprule
+ \heading{Key} & \heading{Meaning} & \heading{Tableau} & \heading{Abacus} \\
+ \midrule
+ \endhead
+ \option{abacus ends} & Set the top and bottom of the abacus & \No & \Yes\\
+ \option{abacus ends style} & Set the style of the top and bottom of the abacus & \No & \Yes\\
+ \option{align} & Set baseline alignment of \aTableau diagram & \Yes & \Yes[abacus]\\
+ \option{australian} & Use the Australian convention for tableaux & \Yes & \No \\
+ \option{bead} & Set the colour of the abacus beads & \No & \Yes \\
+ \option{bead font} & Set the font used for the abacus bead labels & \No & \Yes \\
+ \option{bead sep} & The distance between adjacent beads on a runner & \No & \Yes \\
+ \option{bead size} & The diameter of the abacus beads & \No & \Yes \\
+ \option{bead style} & Set the style of the abacus beads & \No & \Yes \\
+ \option{bead text} & Set the colour of the abacus bead labels & \No & \Yes \\
+ \option{beta numbers} & Enter bead specification as beta numbers & \No & \Yes \\
+ \option*{border} & Draw the tableau border & \Yes & \No \\
+ \option{border colour} & Set tableau border colour & \Yes & \No \\
+ \option{border style} & Set tableau border style & \Yes & \No \\
+ \option{box height} & Set tableau box height & \Yes & \No \\
+ \option{box style} & Set tableau box style & \Yes & \No \\
+ \option{box width} & Set tableau box width & \Yes & \No \\
+ \option*{boxes} & Draw inner walls around boxes & \Yes & \No \\
+ \option{cartan} & Set Cartan type for residues & \Yes & \Yes[abacus] \\
+ \option{charge} & Set charge for contents and residues & \Yes & \Yes[abacus] \\
+ \option{conjugate} & Draw the conjugate tableau/diagram & \Yes & \No \\
+ \option{e} & Set the quantum characteristic for residues & \Yes & \Yes[abacus] \\
+ \option{east} & Make abacus grow in the easterly direction & \Yes & \No \\
+ \option{delimiters} & Set delimiters for multitableau and multidiagrams & \Yes & \No \\
+ \option{empty} & Symbol for empty tableau in multitableau & \Yes & \No \\
+ \option{dotted cols} & Specify columns to replace with dots & \Yes & \Yes[abacus] \\
+ \option{dotted rows} & Specify rows to replace with dots & \Yes & \Yes[abacus] \\
+ \option{english} & Use the English convention for tableaux & \Yes & \No \\
+ \option{entries} & Add entries to tableaux and abacuses & \Yes & \Yes[abacus] \\
+ \option{french} & Use the French convention for tableaux & \Yes & \No \\
+ \option{halign} & Horizontal alignment of box entries and bead labels & \Yes & \Yes[abacus] \\
+ \option{inner style} & Set style of inner tableau wall & \Yes & \No \\
+ \option{inner wall} & Set colour of inner tableau wall & \Yes & \No \\
+ \option{label} & Set tableau label & \Yes & \No \\
+ \option{label style} & Set style of tableau labels & \Yes & \No \\
+ \option{left delimiter} & Set left delimiter for multitableau & \Yes & \No \\
+ \option{math entries} & Typeset box and label entries in math-mode & \Yes & \Yes[abacus] \\
+ \option{name} & Prefix of named nodes & \Yes & \Yes[abacus] \\
+ \option{north} & Make abacus grow in the northerly direction & \No & \Yes\\
+ \option{paths} & Add paths to a diagram or tableau & \Yes & \No \\
+ \option{path box} & Adds default box entry for each path & \Yes & \No \\
+ \option{path box style} & Sets style of boxes on each path & \Yes & \No \\
+ \option{path style} & Sets style of a path & \Yes & \No \\
+ \option{ribbons} & Add ribbons to tableau & \Yes & \No \\
+ \option{ribbon box} & Adds default box entry for each ribbon & \Yes & \No \\
+ \option{ribbon style} & Set ribbon style & \Yes & \No \\
+ \option{ribbon box style} & Sets style of boxes on each ribbon & \Yes & \No \\
+ \option{right delimiter} & List of labels for the abacus runners & \No & Yes \\
+ \option{rows} & Set number of rows in multitableau or abacus & \Yes & \Yes[abacus] \\
+ \option{runner} & Set runner colour & \No & \Yes \\
+ \option{runner labels} & Set the colour of the abacus runners & \No & \Yes \\
+ \option{runner label style}& Set the style for e abacus labels & \No & \Yes \\
+ \option{runner sep} & Set distance between consecutive abacus runners & \No & \Yes \\
+ \option{runner style} & Set the colour of the abacus runners & \No & \Yes \\
+ \option{scale} & Sets the \aTableau scale & \Yes & \Yes[abacus] \\
+ \option{script} & Sets the \aTableau scale for subscripts & \Yes & \Yes(scale-abacus) \\
+ \option{scriptscript} & Sets the \aTableau scale for subsubscripts & \Yes & \Yes(scale-abacus) \\
+ \option{separation} & Set distance between components in multitableau & \Yes & \No \\
+ \option{separator colour} & Set separator colour for multitableau & \Yes & \No \\
+ \option{separator} & Set separator colour in multitableau & \Yes & \No \\
+ \option*{separators} & Enable separators in multitableau & \Yes & \No \\
+ \option{shifted} & True for a shifted tableau & \Yes & \No \\
+ \option{skew} & Set inner skew shape & \Yes & \No \\
+ \option*{skew border} & Set skew border colour & \Yes & \No \\
+ \option{skew border style} & Set \TikZ-style of the skew border & \Yes & \No \\
+ \option*{skew boxes} & Enable drawing of skew boxes & \Yes & \No \\
+ \option{skew box style} & Set \TikZ-style of the skew boxes & \Yes & \No \\
+ \option{snobs} & add snobs to tableau & \Yes & \No \\
+ \option{snob box} & Adds default box entry for each snob & \Yes & \No \\
+ \option{snob box style} & Sets style of boxes on each snob & \Yes & \No \\
+ \option{snob style} & Sets style of a snob & \Yes & \No \\
+ \option{south} & Make abacus grow in the southerly direction & \Yes & \No \\
+ \option{star style} & Set \TikZ-style of tableau $*$-nodes & \Yes & \No \\
+ \option{styles} & Short-hand for defining single use \TikZ-styles & \Yes & \Yes[abacus] \\
+ \option{tabloid} & True for a shifted tableau & \Yes & \No \\
+ \option{text entries} & Typeset box and label entries in text-mode & \Yes & \Yes[abacus] \\
+ \option{tick} & Set the colour of the ticks on the abacus runner & \No & \Yes \\
+ \option{tick length} & Set the length of the ticks on the abacus runners & \No & \Yes \\
+ \option{tick style} & Set the style of the ticks on the abacus runners & \No & \Yes \\
+ \option{tikz after} & \TikZ-code injected after \aTableau picture & \Yes & \Yes[abacus] \\
+ \option{tikz before} & \TikZ-code injected before \aTableau picture & \Yes & \Yes[abacus] \\
+ \option{tikzpicture} & Sets tikzpicture environment keys & \Yes & \No \\
+ \option{ukrainian} & Use the Ukrainian convention for tableaux & \Yes & \No \\
+ \option{valign} & Set vertical alignment & \Yes & \Yes[abacus] \\
+ \option{west} & Make abacus grow in the westerly direction & \Yes & \No \\
+ \option{xoffsets} & Set $x$-offsets for components in a multitableau & \Yes & \No \\
+ \option{xscale} & Set \aTableau $x$-scale & \Yes & \Yes(scale-abacus) \\
+ \option{yoffsets} & Set $y$-offsets for components in a multitableau & \Yes & \No \\
+ \option{yscale} & Set \aTableau $y$-scale & \Yes & \Yes(scale-abacus) \\
+ \bottomrule
+ \end{xltabular}
+
+ \emph{Most readers should ignore the following two subsections.}
+
+ % --------------------------------------------------------------
+ \subsection{\aTableau Colours}\label{S:Colours}
+
+ The \aTableau package defines and uses the following colours:
+
+ \rowcolors{2}{LightSkyBlue!10}{}
+ \begin{center}
+ \begin{tabular}{lll}\toprule
+ \heading{Colour} & \heading{Name} & \heading{HTML}\\
+ \midrule
+ \aTableauColour{Inner} & aTableauInner & 0073E6 \\
+ \aTableauColour{Main} & aTableauMain & 00008B \\
+ \aTableauColour{SkewFill} & aTableauSkewFill & F8F8F8 \\
+ \aTableauColour{Skew} & aTableauSkew & 818589 \\
+ \aTableauColour{StarStyle} & aTableauStarStyle & E6F7FF \\
+ \bottomrule
+ \end{tabular}
+ \end{center}
+
+ All of these colours are defined as HTML colours using the
+ \keyword{\definecolor} command provided by \ctan{xcolor}.
+
+ We recommend using the key-value interface to change the
+ colours used in the pictures created by \aTableau, rather than
+ changing these colours. It is sometimes useful to be able to use these
+ colour names directly in your own styles.
+
+ % --------------------------------------------------------------
+ \subsection{\aTableau styles}\label{S:TikZStyles}
+
+ This package is little than a glorified interface to some \TikZ
+ commands. Under the hood there are many custom \TikZ styles that control the
+ pictures drawn by the \aTableau package. It is possible, and sometimes
+ useful (see, for example, \autoref{Ex:DottedAbacus}), to use these
+ styles in your own drawings.
+ The key-value interface to the \aTableau commands is the recommended
+ way of changing these styles. You can, if you want, change these
+ styles directly using \keyword{\tikzset}, but there is a risk that you
+ may break some of the \aTableau commands if you do this. If you do
+ change these styles, we strongly recommend that you \emph{append} to
+ these styles rather than setting them directly.
+
+ \begin{center}
+ \begin{xltabular}{0.9\textwidth}{ll}\toprule
+ \heading{Names} & \heading{Adds \TikZ-styling to...}\\
+ \midrule
+ aTableau/innerWall & Inner tableau walls\\
+ aTableau/borderStyle & Tableau borders \\
+ aTableau/skewBorder & Skew tableau borders \\
+ aTableau/boxStyle & Tableau boxes\\
+ aTableau/skewBox & Skew tableau boxes \\
+ aTableau/pathBox & Boxes on paths \\
+ aTableau/ribbonBox & Boxes on ribbons \\
+ aTableau/snobBox & Boxes on snobs \\
+ aTableau/pathStyle & Paths \\
+ aTableau/ribbonStyle & Ribbons \\
+ aTableau/snobStyle & Snobs \\
+ aTableau/labelStyle & Tableau labels \\
+ aTableau/tableauStarStyle & Star style for tableaux \\
+ aTableau/clearBoxes & Erase material. Used by \option{dotted rows} and \option{dotted cols}\\
+ aTableau/dottedLine & Adds dotted lines. Used by \option{dotted rows} and \option{dotted cols}\\
+ aTableau/separatorSymbol & Separators in multitableau\\
+ aTableau/separatorLine & Separator lines in multitableau\\
+ aTableau/leftDelimiter & Left delimiter in multitableau\\
+ aTableau/rightDelimiter & Right delimiter in multitableau\\
+ aTableau/beadStyle & Abacus beads\\
+ aTableau/runnerStyle & Abacus runners\\
+ aTableau/runnerLabelStyle & Style of abacus runner labels\\
+ aTableau/abacusEnds & Tops and bottoms of abacuses\\
+ aTableau/abacusStarStyle & Abacus stars \\
+ aTableau/tickStyle & Abacus ticks \\
+ \bottomrule
+ \end{xltabular}
+ \end{center}
+
+ Most of these styles are quite basic, but some of them are more
+ involved, which is why we recommend not changing them directly. In
+ some cases, such as the tableau boxes, the \TikZ styling does not
+ fully control the rendering of these features. Most of these styles
+ can be augmented by styles supplied by the key-value interface, which
+ is another reason to avoid changing them directly.
+
+ % --------------------------------------------------------------
+ \section{Feature requests and bug reports}
+
+ Please make any feature requests and bug reports on the package github
+ page
+ \begin{center}
+ \href{https://github.com/AndrewMathas/aTableau/}{github.com/AndrewMathas/aTableau/}.
+ \end{center}
+ Please give as much detail as possible when making such requests.
+
+ Bug reports must be a accompanied by a \textit{minimal working
+ example}, which is the smallest possible amount of \LaTeX\ code that
+ demonstrates the problem and compiles, unless you are reporting a
+ problem that gives a compilation error in which case your example
+ should give the error. This is necessary because if I cannot reproduce
+ your problem, then it is unlikely that I will be able to fix it.
+
+
+ % --------------------------------------------------------------
+ \subsection*{Acknowledgements}
+
+ Several features in the package have benefited from discussions on
+ \url{tex.stackexchange}. In particular, I thank
+ Max Chernoff,
+ Lars Madsen,
+ Clea F. Rees,
+ and
+ Jonathan P. Spratte.
+
+% ----------------------------------------------------------------------
+% bibliography
+% \bibliography{papers}
+% \bibliographystyle{andrew}
+
+\begin{thebibliography}{10}
+
+\bibitem{bowman2023quiverpresentationsisomorphismshecke}
+\textsc{C.~Bowman, M.~D. Visscher, A.~Hazi, and C.~Stroppel},
+ \href{https://arxiv.org/abs/2309.13695}{\textit{Quiver presentations and
+ isomorphisms of Hecke categories and Khovanov arc algebras}}, 2023.
+\newblock \href{http://arxiv.org/abs/2309.13695}{arXiv:2309.13695}.
+
+\bibitem{DJM:cyc}
+\textsc{R.~Dipper, G.~James, and A.~Mathas},
+ \href{http://dx.doi.org/10.1007/PL00004665}{\textit{Cyclotomic {$q$}-{S}chur
+ algebras}}, Math. Z., \textbf{229} (1998), 385--416.
+
+\bibitem{EvseevMathas:DeformedKLR}
+\textsc{A.~Evseev and A.~Mathas},
+ \href{http://dx.doi.org/10.5802/art.8}{\textit{Content systems and
+ deformations of cyclotomic {KLR} algebras of type~$A$ and~$C$}}, Annals of
+ Representation Theory, \textbf{1} (2024), 193--297.
+\newblock \href{http://arxiv.org/abs/2209.00134}{arXiv:2209.00134}.
+
+\bibitem{Fayers:DyckTilings}
+\textsc{M.~Fayers}, \textit{Dyck tilings and the homogeneous Garnir relations
+ for graded Specht modules}, 2013, preprint.
+\newblock \href{http://arxiv.org/abs/1309.6467}{arXiv:1309.6467}.
+
+\bibitem{James:YoungD}
+\textsc{G.~James}, \textit{Some combinatorial results involving {Y}oung
+ diagrams}, Math. Proc. Cambridge Philos. Soc., \textbf{83} (1978), 1--10.
+
+\bibitem{KMR:UniversalSpecht}
+\textsc{A.~Kleshchev, A.~Mathas, and A.~Ram},
+ \href{http://dx.doi.org/10.1112/plms/pds019}{\textit{Universal graded
+ {S}pecht modules for cyclotomic {H}ecke algebras}}, Proc. Lond. Math. Soc.
+ (3), \textbf{105} (2012), 1245--1289.
+\newblock \href{http://arxiv.org/abs/1102.3519}{arXiv:1102.3519}.
+
+\bibitem{Konvalinka:ShiftedHookLengths}
+\textsc{M.~z. Konvalinka}, \href{http://dx.doi.org/10.37236/588}{\textit{The
+ weighted hook length formula {III}: {S}hifted tableaux}}, Electron. J.
+ Combin., \textbf{18} (2011), Paper 101, 29.
+
+\bibitem{Macdonald}
+\textsc{I.~G. Macdonald}, \textit{Symmetric functions and {H}all polynomials},
+ Oxford Mathematical Monographs, The Clarendon Press Oxford University Press,
+ New York, second~ed., 1995.
+\newblock With contributions by A. Zelevinsky, Oxford Science Publications.
+
+\bibitem{Mathas:ULect}
+\textsc{A.~Mathas},
+ \href{http://dx.doi.org/10.1090/ulect/015}{\textit{Iwahori-{H}ecke algebras
+ and {S}chur algebras of the symmetric group}}, University Lecture Series,
+ \textbf{15}, American Mathematical Society, Providence, RI, 1999.
+
+\bibitem{Mendes:hooks}
+\textsc{A.~Mendes}, \textit{The combinatorics of rim hook tableaux}, Australas.
+ J. Combin., \textbf{73} (2019), 132--148.
+
+\end{thebibliography}
+
+% ----------------------------------------------------------------------
+% indices
+\printindex
+
+\end{document}
diff --git a/graphics/pgf/contrib/circuitikz/README.md b/graphics/pgf/contrib/circuitikz/README.md
index 30e3589b74..9af5cd284b 100644
--- a/graphics/pgf/contrib/circuitikz/README.md
+++ b/graphics/pgf/contrib/circuitikz/README.md
@@ -84,12 +84,12 @@ This file may be distributed and/or modified
1. under the LaTeX Project Public License and/or
2. under the GNU Public License.
-Copyright 2018-2024 by Romano Giannetti
+Copyright 2018-2025 by Romano Giannetti
-Copyright 2015-2024 by Stefan Lindner
+Copyright 2015-2025 by Stefan Lindner
-Copyright 2013-2024 by Stefan Erhardt
+Copyright 2013-2025 by Stefan Erhardt
-Copyright 2007-2024 by Massimo Redaelli
+Copyright 2007-2025 by Massimo Redaelli
diff --git a/graphics/pgf/contrib/circuitikz/doc/changelog.tex b/graphics/pgf/contrib/circuitikz/doc/changelog.tex
index 0806a20b78..8fa2397c54 100644
--- a/graphics/pgf/contrib/circuitikz/doc/changelog.tex
+++ b/graphics/pgf/contrib/circuitikz/doc/changelog.tex
@@ -5,6 +5,76 @@ full list of changes.
\begin{itemize}
\item
+ Version 1.7.1 (2025-01-10)
+
+ Various new blocks have been added, and several fixes have been
+ applied (the barrier one is slightly backward-incompatible\ldots).
+
+ \begin{itemize}
+ \tightlist
+ \item
+ Added a flag to have German style TVS (suggested by
+ \href{https://github.com/circuitikz/circuitikz/issues/836}{Dr.~Matthias
+ Jung}, implemented by Romano)
+ \item
+ Added many blocks all over the map (suggested by
+ \href{https://github.com/circuitikz/circuitikz/issues/693}{Dr.~Matthias
+ Jung}, with tweaks by Romano)
+ \item
+ Fix for straight voltage on \texttt{open} bipoles (reported by
+ \href{https://github.com/circuitikz/circuitikz/issues/821}{Oliver
+ Wallscheid on GitHub})
+ \item
+ Fix a very, very old bug about aliases for american/european sources
+ \item
+ Fix \texttt{barrier} wire linewidth (issue
+ \href{https://github.com/circuitikz/circuitikz/issues/833}{\#833} by
+ schtandard).
+ \item
+ Fix stroke-type transorb (which did not work at all)
+ \item
+ Reduce \texttt{barrier} and \texttt{openbarrier} default widths so
+ no wire is drawn by default. This breaks backward-compatibility and
+ changes the meaning of some associated keys, but the appearance with
+ the default settings remains unchanged. See
+ \href{https://github.com/circuitikz/circuitikz/pull/835}{\#835} for
+ rationale.
+ \item
+ Documentation enhancement (example of chopper macro)
+ \end{itemize}
+\item
+ Version 1.7.0 (2024-08-03)
+
+ There are no big changes here, but the change to the resistor code
+ (maybe one of the most used by the package) well deserves a minor
+ version bump. A couple of new components, and several minor fixes.
+
+ \begin{itemize}
+ \tightlist
+ \item
+ New component: new kind of current tap (suggested by
+ \href{https://github.com/circuitikz/circuitikz/issues/807}{EEpchi
+ and Dr4UX on GitHub})
+ \item
+ New arrow tip \texttt{Jack\ Tap} to help drawing jack connectors
+ (suggested by
+ \href{https://github.com/circuitikz/circuitikz/issues/806}{Anisio
+ Rogerio Braga})
+ \item
+ Change the drawing of the thermocouple (suggested by
+ \href{https://github.com/circuitikz/circuitikz/issues/811}{Dr4UX on
+ GitHub})
+ \item
+ Change and enhancement to the drawing of the American resistors
+ (triggered by
+ \href{https://github.com/circuitikz/circuitikz/issues/814}{Dr4UX on
+ GitHub}), fixing a long-standing small asymmetry that nobody noticed
+ \item
+ Minor adjustment for joins in \texttt{viscoe} component
+ \item
+ Minor additions (\texttt{rectjoinfill}) and fixes in documentation
+ \end{itemize}
+\item
Version 1.6.9 (2024-05-25)
Several new components and a bug fix for a nasty long-standing bug
@@ -495,7 +565,7 @@ full list of changes.
Robustify some shapes: do not let arrows option pass to the inner
drawing (see
\href{https://tex.stackexchange.com/a/632084/38080}{here} and
- \href{https://matrix.to/\#/!NuxCISwYQJuyWwNsEI:matrix.org/$vQO6luq1F66LJ79dERmaqKI46qMBcjStqYCPi725uZE?via=matrix.org&via=2krueger.de&via=im.f3l.de}{here})
+ \href{https://matrix.to/\#/!NuxCISwYQJuyWwNsEI:matrix.org/$vQO6luq1F66LJ79dERmaqKI46qMBcjStqYCPi725uZE?via=matrix.org\&via=2krueger.de\&via=im.f3l.de}{here})
\item
Add warning about global draw options in the manual
\item
diff --git a/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf b/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
index cc6865c72f..264a3929e6 100644
--- a/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
+++ b/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.tex b/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.tex
index cf033189f9..92f030f3a4 100644
--- a/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.tex
+++ b/graphics/pgf/contrib/circuitikz/doc/circuitikz-context.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
index 9f3d2b57e0..73d435b14b 100644
--- a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
+++ b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
index ac116af09e..064ab954c2 100644
--- a/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
+++ b/graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
@@ -5,10 +5,10 @@
% !TeX spellcheck = en_US
% !TeX encoding = utf8
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -126,10 +126,10 @@ The use of \Circuitikz\ is, of course, not limited to academic teaching. The pac
\subsection{License}
Copyright \copyright{}
-2007--2024 by Massimo Redaelli,
-2013--2024 by Stefan Erhardt,
-2015--2024 by Stefan Lindner,
-and 2018--2024 by Romano Giannetti.
+2007--2025 by Massimo Redaelli,
+2013--2025 by Stefan Erhardt,
+2015--2025 by Stefan Lindner,
+and 2018--2025 by Romano Giannetti.
This package is author-maintained. Permission is granted to copy, distribute and/or modify this software under the terms of the \LaTeX\ Project Public License, version 1.3.1, or the GNU Public License. This software is provided ‘as is’, without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose.
\subsection{Loading the package}
@@ -195,8 +195,8 @@ Finally, the \TikZ{} library \texttt{bending} is loaded by the package, and its
\subsubsection{Related packages}
-At the Friedrich-Alexander-Universität, a group of developers are implementing a graphical interface to draw circuits with \Circuitikz{}.
-You can find more information \href{https://github.com/circuitikz/circuitikz/issues/782}{in this GitHub issue} or, better, in their \href{https://ussi.e-technik.uni-erlangen.de/}{main site}.
+At the Friedrich-Alexander-Universität, a group of developers are implementing a graphical user interface to draw circuits with \Circuitikz{}.
+You can find more information \href{https://github.com/circuitikz/circuitikz/issues/782}{in this GitHub issue} or, better, on their \href{https://circuit2tikz.tf.fau.de/}{main site}. You can try out the GUI \href{https://circuit2tikz.tf.fau.de/designer/}{here}.
\subsubsection{Extension packages}
@@ -264,10 +264,14 @@ Nevertheless, \href{https://tex.stackexchange.com/a/529159/38080}{Schrödinger'
The \texttt{use fpu reciprocal} key seems to have no side effects, but given that it is patching an internal interface of \TikZ{} it can break any time, so it is advisable to use it only if and when needed.
-\subsection{Incompabilities between versions}\label{sec:incompatible-changes}
+\subsection{Incompatibilities between versions}\label{sec:incompatible-changes}
Here, we will provide a list of incompatibilities between different versions of \Circuitikz. We will try to hold this list short, but sometimes it is easier to break with old syntax than include a lot of switches and compatibility layers. In general, changes that would invalidate a circuit (changes of polarity of components and so on) are almost always protected by a flag; the same is not true for purely aesthetic changes.
If unsure, you can check the version in your local installation by using the macro \verb!\pgfcircversion{}!.
\begin{itemize}
+ \item In version \texttt{1.7.1}, the default widths of \texttt{barrier} and \texttt{openbarrier} were reduced so that no wire is drawn as part of the symbols by default.
+ This is accompanied by a change to the meanings of the configuration keys \texttt{bipoles/barrier/width}, \texttt{bipoles/barrier/height} and \texttt{bipoles/openbarrier/gap} (as well as the new key \texttt{bipoles/openbarrier/width}).
+ The change avoids problems when using barriers on short pieces of path or as nodes, cf.~the details in \href{https://github.com/circuitikz/circuitikz/pull/835}{the relevant pull request on GitHub}.
+ The new default values are chosen such that the components are identical to the default appearance before the change.
\item Since version \texttt{1.6.3} the default symbol for the minus sign changed from the simple \verb|$-$| to \verb|$\vphantom{+}-$|. The reason is that in some (most?) font, the minus sign is enclosed in a smaller bounding box than the plus sign and that leads to poorly aligned minus symbols in \texttt{american} and \texttt{raised} voltages. This was not noticed before because the two symbols share the same bounding box in the default Computer Modern font. You can look at \href{https://github.com/circuitikz/circuitikz/issues/721}{this issue on GitHub} for more details; if you want to go back to the previous definitions you can write
\begin{lstlisting}
\ctikzset{amplifiers/minus=$-$}
@@ -507,7 +511,7 @@ You can use a single path or multiple paths when drawing your circuit, it's just
\end{circuitikz}
\end{LTXexample}
-One of the problems with this circuit is that we would like to have the current labels in a different position, such as for example on the upper side of the resistors, so that Kirchoff's Current Law at the node is better shown to students. No problem; as you can see in section~\ref{curr-and-volt} you can use the position specifiers \verb|<>^_| after the key \texttt{i}:
+One of the problems with this circuit is that we would like to have the current labels in a different position, such as for example on the upper side of the resistors, so that Kirchhoff's Current Law at the node is better shown to students. No problem; as you can see in section~\ref{curr-and-volt} you can use the position specifiers \verb|<>^_| after the key \texttt{i}:
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}[american]
@@ -1942,6 +1946,118 @@ And finally do:
\end{tikzpicture}
\end{LTXexample}
+\subsubsection{Using macros}
+
+Sometimes, a good old \LaTeX{} macro can solve a problem instead of designing a new component.
+For example, GitHub's user Patrick Jansky asked for a generic ``chopper'' block;\footnote{%
+ See \href{https://github.com/circuitikz/circuitikz/issues/828}{the original issue on GitHub}.}
+Unfortunately, this kind of block is quite difficult to implement as a node: it should change size and orientation on the base of the ``port'' terminals you need.
+
+In this case, probably an old-fashioned macro, using partway coordinate specifiers,
+\footnote{See \href{https://tikz.dev/tikz-coordinates\#sec-13.5.3}{\TikZ{} manual section 13.5}}
+could be the best option for this task. Below, one possible example (not optimized at all!).
+
+\begin{lstlisting}
+\NewDocumentCommand{\ChopperByTerminals}{O{} O{0.2cm} m m m}{%
+ % #1 -> options to the draw command
+ % #2 -> half width
+ % by default is drawn to the right (if vertical), to the left if #2 is negative
+ % If horizontal, by default is above, below if #2 is negative
+ % #3 -> terminal A on port 1
+ % #4 -> terminal B on port 2
+ % #5 -> name for the "anchors"
+ \coordinate(#5-P1A) at (#3);
+ \coordinate(#5-P1B) at (#4);
+ % the center of the block is midway P1A to P1B, at distance #2 at 90 clockwise
+ % degrees from the center of the line
+ \coordinate(#5-C1) at ($(#5-P1A)!0.5!(#5-P1B)$);
+ \coordinate(#5-C) at ($(#5-C1)!#2!90:(#5-P1B)$);
+ \coordinate(#5-P2B) at ($(#5-P1A)!2!(#5-C)$);
+ \coordinate(#5-P2A) at ($(#5-P1B)!2!(#5-C)$);
+ \coordinate(#5-T1A) at ($(#5-P1B)!1.2!(#5-P1A)$);
+ \coordinate(#5-T1B) at ($(#5-P1A)!1.2!(#5-P1B)$);
+ \coordinate(#5-T2A) at ($(#5-P2B)!1.2!(#5-P2A)$);
+ \coordinate(#5-T2B) at ($(#5-P2A)!1.2!(#5-P2B)$);
+ \coordinate(#5-CKA) at ($(#5-T1A)!0.5!(#5-T2A)$);
+ \coordinate(#5-CKB) at ($(#5-T1B)!0.5!(#5-T2B)$);
+ \coordinate(#5-C2) at ($(#5-P2A)!0.5!(#5-P2B)$);
+ \draw [draw, thick, fill=white, #1] (#5-T1A) rectangle (#5-T2B);
+ \draw [draw, thick, line join=round, #1] (#5-P1A) -- (#5-P2B) --
+ (#5-P1B) -- (#5-P2A) -- (#5-P1A);
+}
+\end{lstlisting}
+
+You can use this definition as follows, for example:
+
+\begin{lstlisting}
+\begin{tikzpicture}[]
+ \node[op amp](A) at (0,0) {};
+ \ChopperByTerminals[draw=red][-0.2cm]{A.-}{A.+}{chopper in}
+ \draw [red, <-] (chopper in-CKA) -- ++(0,.5) node[above]{$f_c$};
+ \ChopperByTerminals[draw=red]{[xshift=1.2cm]A.-}{[xshift=1.2cm]A.+}{chopper out}
+ \draw [red, <-] (chopper out-CKA) -- ++(0,.5) node[above]{$f_c$};
+ %Try another one
+ \draw (4,1) node[npn](Q1){} (7,1) node[npn, xscale=-1](Q2){};
+ \coordinate (Qcenter) at ($(Q1.E)!0.5!(Q2.E)$);
+ \ChopperByTerminals[][-0.2cm]{Q1.E}{Q2.E}{cE}
+ \draw [<-] (cE-CKA) -- ++(-0.5,0) node[left]{$f_c$};
+ % pseudo-anchors
+ \ChopperByTerminals[draw=blue][-1cm]{4,-1.25}{7,-1.25}{C}
+ \foreach \a in {P1A, P1B, P2A, P2B, CKA, CKB, C, C1, C2}
+ \node[circle, draw, inner sep=1pt, pin={[font=\tiny, fill=white]60:C-\a}]
+ at (C-\a) {};
+\end{tikzpicture}
+\end{lstlisting}
+
+Obtaining:
+
+\begin{center} %% to insulate the definition, you never know
+\NewDocumentCommand{\ChopperByTerminals}{O{} O{0.2cm} m m m}{%
+ % #1 -> options to the draw command
+ % #2 -> half width
+ % by default is drawn to the right (if vertical), to the left if #2 is negative
+ % If horizontal, by default is above, below if #2 is negative
+ % #3 -> terminal A on port 1
+ % #4 -> terminal B on port 2
+ % #5 -> name for the "anchors"
+ \coordinate(#5-P1A) at (#3);
+ \coordinate(#5-P1B) at (#4);
+ % the center of the block is midway P1A and P1B, distance #2 at 90 clockwise
+ % degrees from the center
+ \coordinate(#5-C1) at ($(#5-P1A)!0.5!(#5-P1B)$);
+ \coordinate(#5-C) at ($(#5-C1)!#2!90:(#5-P1B)$);
+ \coordinate(#5-P2B) at ($(#5-P1A)!2!(#5-C)$);
+ \coordinate(#5-P2A) at ($(#5-P1B)!2!(#5-C)$);
+ \coordinate(#5-T1A) at ($(#5-P1B)!1.2!(#5-P1A)$);
+ \coordinate(#5-T1B) at ($(#5-P1A)!1.2!(#5-P1B)$);
+ \coordinate(#5-T2A) at ($(#5-P2B)!1.2!(#5-P2A)$);
+ \coordinate(#5-T2B) at ($(#5-P2A)!1.2!(#5-P2B)$);
+ \coordinate(#5-CKA) at ($(#5-T1A)!0.5!(#5-T2A)$);
+ \coordinate(#5-CKB) at ($(#5-T1B)!0.5!(#5-T2B)$);
+ \coordinate(#5-C2) at ($(#5-P2A)!0.5!(#5-P2B)$);
+ \draw [draw, thick, fill=white, #1] (#5-T1A) rectangle (#5-T2B);
+ \draw [draw, thick, line join=round, #1] (#5-P1A) -- (#5-P2B) -- (#5-P1B) -- (#5-P2A) -- (#5-P1A);
+}
+\begin{tikzpicture}[]
+ \node[op amp](A) at (0,0) {};
+ \ChopperByTerminals[draw=red][-0.2cm]{A.-}{A.+}{chopper in}
+ \draw [red, <-] (chopper in-CKA) -- ++(0,.5) node[above]{$f_c$};
+ \ChopperByTerminals[draw=red]{[xshift=1.2cm]A.-}{[xshift=1.2cm]A.+}{chopper out}
+ \draw [red, <-] (chopper out-CKA) -- ++(0,.5) node[above]{$f_c$};
+ %Try another one
+ \draw (4,1) node[npn](Q1){} (7,1) node[npn, xscale=-1](Q2){};
+ \coordinate (Qcenter) at ($(Q1.E)!0.5!(Q2.E)$);
+ \ChopperByTerminals[][-0.2cm]{Q1.E}{Q2.E}{cE}
+ \draw [<-] (cE-CKA) -- ++(-0.5,0) node[left]{$f_c$};
+ % pseudo-anchors
+ \ChopperByTerminals[draw=blue][-1cm]{4,-1.25}{7,-1.25}{C}
+ \foreach \a in {P1A, P1B, P2A, P2B, CKA, CKB, C, C1, C2}
+ \node[circle, draw, inner sep=1pt, pin={[font=\tiny, fill=white]60:C-\a}] at (C-\a) {};
+\end{tikzpicture}
+\end{center}
+
+
+
\section{The components: list}
@@ -2200,6 +2316,83 @@ For the \texttt{photoresistor} and the two ``flavors'' of the light-dependent re
\end{tikzpicture}
\end{LTXexample}
+\begingroup % protect changes to resistors
+\newcommand\showjoin[1]{%
+\begin{tikzpicture}[scale=4, transform shape]
+ \clip (0.2,-0.05) rectangle (0.6,0.3);
+ \draw[ultra thick] (0,0) to[R, resistors/thickness=#1] ++(2,0);
+\end{tikzpicture}%
+}
+\newcommand{\splat}{\begin{center}\ttfamily\scriptsize\begin{tabular}{cccc}
+ \showjoin{1}&\showjoin{2}&\showjoin{3}&\showjoin{4}\\
+ thickness=1 & thickness=2 & thickness=3 & thickness=4 \\
+ \end{tabular}\end{center}%
+}
+\newcommand{\rdivider}[1]{\begin{tikzpicture}
+ \ctikzset{resistors/thickness=#1}
+ \draw (0,0) node[ground]{} to[V] ++(0,2) to[R] ++(2,0)
+ to[R] ++(0,-2) to[short,-*] (0,0);
+\end{tikzpicture}\qquad}
+\newcommand{\divsplat}[1]{#1\par
+ \begin{center}
+ \rdivider{1}\rdivider{2}\rdivider{3}\rdivider{4}
+\end{center}}
+
+\paragraph{Details of American (``zig-zag'') resistors.\label{sec:zigzag-details}} American (zig-zag) resistors have a little joining problem\footnote{Noticed by \href{https://github.com/circuitikz/circuitikz/issues/811}{user Dr4UX on GitHub} and later \href{https://github.com/circuitikz/circuitikz/discussions/814}{discussed here}.} with the leading wires if the thickness is greater than two. In the following drawing you can see the problem when the thickness grows from 1 to 4.
+
+\splat
+
+Since \texttt{v1.7.0}, one possibility to correct the problem is to change the type of joining of the zig-zag line, using the key \texttt{resistors/zigzag join}, which is a command that by default is void. For example, the following effect is obtained by using
+
+\begin{lstlisting}[numbers=none]
+\ctikzset{resistors/zigzag hook/.code={\pgfsetroundcap}}
+\end{lstlisting}
+{\ctikzset{resistors/zigzag hook/.code={\pgfsetroundcap}}
+\splat}
+
+or you can even go full rounded
+
+\begin{lstlisting}[numbers=none]
+\ctikzset{resistors/zigzag hook/.code={\pgfsetroundcap\pgfsetroundjoin}}
+\end{lstlisting}
+{\ctikzset{resistors/zigzag hook/.code={\pgfsetroundcap\pgfsetroundjoin}}
+\splat}
+
+Another possibility is to add a little horizontal ``stub'' to the shape, with the key \texttt{resistors/zigzag stub} (default \texttt{0}), which will add a first part which is a continuation of the wire:
+\begin{lstlisting}[numbers=none]
+\ctikzset{resistors/zigzag stub=0.05}% this is relative to the resistor's length
+\end{lstlisting}
+{\ctikzset{resistors/zigzag stub=0.05}
+\splat}
+
+\dots or you can just combine all of them as you prefer. With the standard join/cap options, the look of the resistors for thickness from 1 to 4 is shown here:
+
+\ctikzset{american}
+\divsplat{Standard drawing of American resistors}
+\divsplat{With a 5\% stub: \ctikzset{resistors/zigzag stub=0.05}}
+\divsplat{With a 20\% stub: \ctikzset{resistors/zigzag stub=0.2}}
+
+
+\bigskip
+Finally, here is the detailed shape with thickness 2 (red=0, blue=0.05, green=0.2), magnified six times:
+
+\vspace*{2cm}% this vspace fences are needed because the transform canvas wreak havoc with the bbox
+\begin{tikzpicture}[transform canvas={scale=6}]
+ \ctikzset{resistors/zigzag stub=0}
+ \draw[red] (0,0.2) to [resistor, resistors/thickness=4] ++(2,0);
+ \ctikzset{resistors/zigzag stub=0.05}
+ \draw[blue] (0,0.1) to [resistor, resistors/thickness=4] ++(2,0);
+ \ctikzset{resistors/zigzag stub=0.2}
+ \draw[green] (0,0) to [resistor, resistors/thickness=4] ++(2,0);
+ % \draw [very thin](1,0.5) -- (1,-0.5);
+ % \draw [very thin](0,0) -- ++(2,0);
+ % \draw [very thin](0,0.1) -- ++(2,0);
+ % \draw [very thin](0,0.2) -- ++(2,0);
+\end{tikzpicture}
+\vspace*{2cm}
+
+\endgroup % changes to resistors stops here
+
\subsection{Capacitors and inductors: dynamical bipoles}
@@ -2431,9 +2624,9 @@ The package options \texttt{fulldiode}, \texttt{strokediode}, and \texttt{emptyd
\footnotetext{Added by André Alves in \texttt{v1.4.4}}
\circuitdescbip*[emptyvarcap]{empty varcap}{Empty varcap}{VCo}
\circuitdescbip*[emptytvsdiode]{empty TVS diode}{Empty TVS diode, transorb\footnotemark}{tvsDo}
- \footnotetext{Transobs were suggested by \href{Anisio Braga}{https://tex.stackexchange.com/q/642219/38080}}
+ \footnotetext{Transorbs were suggested by \href{https://tex.stackexchange.com/q/642219/38080}{Anisio Braga}}
\circuitdescbip*[emptyshdiode]{empty Shockley diode}{Empty Shockley diode\footnotemark}{shDo}
- \footnotetext{Shockley diodes were suggested by \href{@Dauph}{https://tex.stackexchange.com/q/646039/38080}}
+ \footnotetext{Shockley diodes were suggested by \href{https://tex.stackexchange.com/q/646039/38080}{@Dauph}}
\circuitdescbip*[emptybidirectionaldiode]{empty bidirectionaldiode}{Empty bidirectionaldiode}{biDo}
\circuitdescbip[fulldiode] {full diode}{Full diode}{D*}
\circuitdescbip[fullsdiode]{full Schottky diode}{Full Schottky diode}{sD*}
@@ -2461,6 +2654,7 @@ These shapes have no exact node-style counterpart, because the stroke line is bu
\circuitdescbip*[emptylediode]{stroke led}{Stroke led}{leD-}(arrows/-30/0.3)
\circuitdescbip*[emptylaserdiode]{stroke laser diode}{Stroke laser diode}{lasD-}(arrows/-30/0.3)
\circuitdescbip*[emptyvarcap]{stroke varcap}{Stroke varcap}{VC-}
+ \circuitdescbip*[emptytvsdiode]{stroke TVS diode}{Stroke TVS diode, transorb}{tvsD-}
\end{groupdesc}
\subsubsection{Tripole-like diodes}\label{sec:othertrip} The following tripoles are entered with the usual command, of the form \texttt{to[Tr, \dots]}. In the following list you can see the traditional, or \texttt{legacy}, shape of the Thyristors-type devices.
@@ -2616,6 +2810,17 @@ As you can see, you can also have the option to globally change the color, relat
\end{tikzpicture}
\end{LTXexample}
+\paragraph{Zener and TVS diode options} You can change the shape of the Zener \texttt{ZZener} and \texttt{TVS} diodes using the flag \texttt{diode straight whiskers} (and reset it with the option \texttt{diode sloped whiskers}); this will change the ``whiskers'' of the diodes to be at a right angle\footnote{Suggested by \href{https://github.com/circuitikz/circuitikz/issues/836}{Dr. Matthias Jung}} instead the sloped normal way.
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{tikzpicture}
+ \draw (0,1) to [zzDo] ++(1,0) to[zzD-] ++(1,0)
+ to[zzD*] ++(1,0) to[tvsD-] ++(2,0);
+ \ctikzset{diode straight whiskers}
+ \draw (0,0) to [zzDo] ++(1,0) to[zzD-] ++(1,0)
+ to[zzD*] ++(1,0) to[tvsD-] ++(2,0);
+\end{tikzpicture}
+\end{LTXexample}
\subsection{Sources and generators}
@@ -2626,16 +2831,18 @@ Notice that source and generators are divided in three classes that can be style
\circuitdescbip{battery}{Battery}{}
\circuitdescbip{battery1}{Single battery cell}{}
\circuitdescbip{battery2}{Single battery cell}{}
+ \circuitdescbip{solar}{Solar-driven battery (arrows follow the same style options as photodiodes, see \ref{sec:opto-arrows})\footnotemark}{}
+ \footnotetext{Contributed by \href{https://github.com/circuitikz/circuitikz/pull/693}{Dr. Matthias Jung}.}
\circuitdescbip{baertty}{Randall Munroe's baertty\footnotemark}{}
\footnotetext{\href{https://xkcd.com/2818}{Mandatory xkcd}}
\end{groupdesc}
\subsubsection{Stationary sources}
\begin{groupdesc}
- \circuitdescbip*[vsource]{european voltage source}{Voltage source (european style)}{vsource}
+ \circuitdescbip*[vsource]{european voltage source}{Voltage source (european style)}{vsource, vsourceEU}
\circuitdescbip*[vsourceC]{cute european voltage source}{Voltage source (cute european style)}{vsourceC, ceV}
\circuitdescbip*[vsourceAM]{american voltage source}{Voltage source (american style)}{vsourceAM}
- \circuitdescbip*[isource]{european current source}{Current source (european style)}{isource}
+ \circuitdescbip*[isource]{european current source}{Current source (european style)}{isource, isourceEU}
\circuitdescbip*[isourceC]{cute european current source}{Current source (cute european style)}{isourceC, ceI}
\circuitdescbip*[isourceAM]{american current source}{Current source (american style)}{isourceAM}
\end{groupdesc}
@@ -2666,10 +2873,10 @@ Similarly, if (default behavior) \texttt{europeanvoltages} option is active (or
\subsubsection{Controlled sources}
\begin{groupdesc}
- \circuitdescbip*[cvsource]{european controlled voltage source}{Controlled voltage source (european style)}{cvsource}
+ \circuitdescbip*[cvsource]{european controlled voltage source}{Controlled voltage source (european style)}{cvsource, cvsourceEU}
\circuitdescbip*[cvsourceC]{cute european controlled voltage source}{Voltage source (cute european style)}{cvsourceC, cceV}
\circuitdescbip*[cvsourceAM]{american controlled voltage source}{Controlled voltage source (american style)}{cvsourceAM}
- \circuitdescbip*[cisource]{european controlled current source}{Controlled current source (european style)}{cisource}
+ \circuitdescbip*[cisource]{european controlled current source}{Controlled current source (european style)}{cisource, cisourceEU}
\circuitdescbip*[cisourceC]{cute european controlled current source}{Current source (cute european style)}{cisourceC, cceI}
\circuitdescbip*[cisourceAM]{american controlled current source}{Controlled current source (american style)}{cisourceAM}
\circuitdescbip*[ecsource]{empty controlled source}{Empty controlled source}{ecsource}
@@ -2852,9 +3059,9 @@ Notice that the size of the double-circle sources (and of the triple-circle one)
\end{LTXexample}
\paragraph{Waveform symbols.}
-Internal symbols of sinusoidal, triangular and square sources are drawn with the same line thickness as the component by default. You can modify this by setting the key \texttt{sources/symbols/thickness} for independent sources and the corresponding \texttt{csource/...} for dependent ones. The value used here is relative to the component (i.e. the circle) value.
+Internal symbols of sinusoidal, triangular and square sources are drawn with the same line thickness as the component by default. You can modify this by setting the key \texttt{sources/symbol/thickness} for independent sources and the corresponding \texttt{csource/...} for dependent ones. The value used here is relative to the component (i.e. the circle) value.
-Normally the symbol is oriented in the same direction as the line, and rotate rigidly with the component; you can change this orientation using the key \texttt{sources/symbols/rotate} or \texttt{csource/...}. The default value is \texttt{90} which correspond to the ``line'' direction (remember, path components are defined as horizontal ones).
+Normally the symbol is oriented in the same direction as the line, and rotate rigidly with the component; you can change this orientation using the key \texttt{sources/symbol/rotate} or \texttt{csource/...}. The default value is \texttt{90} which correspond to the ``line'' direction (remember, path components are defined as horizontal ones).
If instead of an angle value you use \texttt{auto}, the symbol will be rotated so that the waveform is always vertical, similar to what happens in instruments:
\begin{LTXexample}[varwidth=true]
@@ -3019,12 +3226,44 @@ Sometimes it is better to use a shape for instruments which is very different fr
\footnotetext{Suggested by \texttt{@nobrl} on GitHub}
\circuitdescbip{iloop}{Current loop (symbolic)}{}(left/135/0.2, right/45/0.2, center/-90/0.3, i/30/0.4)
\circuitdescbip{iloop2}{Current loop (real)}{}(left/135/0.2, right/-45/0.2, center/-90/0.3, i+/135/0.4, i-/45/0.4)
+ \circuitdescbip{currtap}{Current tap (probe)\footnotemark}{}(tap/-90/0.2)
+ \footnotetext{Suggested by \href{https://github.com/circuitikz/circuitikz/issues/807}{user EEpchi on GitHub}.}
\end{groupdesc}
\subsubsection{Instruments customizations}\label{sec:tweak-instruments}
You can change the scale of all the instruments (including the current loops) by setting the key \texttt{instruments/scale} to something different from the default \texttt{1.0}.
+\paragraph{Current probes.}
+You can change the inner dot in several way, by changing the following keys under the \verb!\ctikzset! key \texttt{bipoles/currtap}:
+\begin{center}
+ \begin{tabular}{>{\ttfamily}l>{\ttfamily}lp{0.7\linewidth}}
+ \toprule
+ parameter & default & description \\
+ \midrule
+ thickness & default & Set the thickness of the line (\texttt{default}: do not change the class thickness) \\
+ color & default & stroke color: \texttt{default} is the same as the component \\
+ dash & default & dash pattern: none means solid line, default means keep the global pattern\footnotemark \\
+ fill & default & fill the inner dot; \texttt{default} means use the wire color, \texttt{none} do not fill, other keys must be a valid color \\
+ dot size& 0.5 & relative size of the inner dot \\
+ \bottomrule
+ \end{tabular}
+ \footnotetext{Follows the syntax of the pattern sequence \texttt{\textbackslash pgfsetdash} --- see \TikZ{} manual for details; phase is always zero. Basically you pass pairs of dash-length -- blank-length dimensions, see the examples.}
+\end{center}
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily]
+\begin{circuitikz}
+ \draw (0,2) to[currtap, bipoles/currtap/fill=none, *-]
+ ++(2,0) to[currtap, bipoles/currtap/.cd,
+ fill=yellow, color=red, thickness=3,
+ dash={{1.14pt}{2pt}}] ++(2,0);
+ \draw (0,0) to[currtap=I, *-, name=ct] ++(2,0)
+ to[currtap, -*, name=ct2,
+ bipoles/currtap/dot size=0.3] ++(2,0);
+ \draw (ct.tap) -- ++(0,-1) (ct2.tap) -- ++(0,-1);
+\end{circuitikz}
+\end{LTXexample}
+
\paragraph{Oscilloscope waveform.} You can change the waveform shown in the oscilloscope ``screen''\footnote{Suggested by \href{https://tex.stackexchange.com/q/595062/38080}{Mario Tafur on TeX.SX}}. To change it, you just set the key \texttt{bipoles/oscope/waveform} to one of the available shape. You have available the shapes in the following list (the default is \texttt{ramps}):
\begin{LTXexample}[pos=t, basicstyle=\small\ttfamily]
@@ -3273,7 +3512,9 @@ Here you'll find bipoles that are not easily grouped in the categories above.
\circuitdescbip{openbarrier}{Open barrier}{}
\end{groupdesc}
-You can tune how big is the gap in the \texttt{openbarrier} component by setting the key \texttt{bipoles/openbarrier/gap} (default value \texttt{0.5}; \texttt{0} means no gap and \texttt{1} full gap).
+You can tune how big the gap in the \texttt{openbarrier} is by setting \texttt{bipole/openbarrier/gap} (default value \texttt{1} meaning full width).
+The default width \texttt{bipole/openbarrier/width} is \texttt{0.21}, while \texttt{bipole/barrier/width} is \texttt{0}.
+These settings ensure minimal width without drawing any wire when the components' node shapes are used.
\begin{groupdesc}
\circuitdescbip*{european gas filled surge arrester}{European gas filled surge arrester}{}
@@ -3320,6 +3561,7 @@ You can use microphones and loudspeakers with \texttt{waves} (see section~\ref{s
\end{circuitikz}
\end{LTXexample}
+
You have two types of microphones; \texttt{mic} has protruding connection and \texttt{tlmic} (for tail-less microphone) is inline. This last one is handy for use as a separate shape (which is named \texttt{tlmicshape}). You can change the (relative) thickness of the straight bar using the key \texttt{bipoles/mic/bar thickness} (default \texttt{1}).
\begin{LTXexample}[varwidth=true]
@@ -3478,9 +3720,9 @@ While the horizontal line will be drawn with the current path values, you can ch
\end{circuitikz}
\end{LTXexample}
-\subsection{Arrows}\label{sec:arrows}
+\subsection{Arrows (fake and real)}\label{sec:arrows}
-These are pseudo-arrows used in lot of places in the packages (for transistors, flows, currents, and so on). The first three arrows are magnified by a factor~3 in the boxes below; for the \texttt{trarrow}, the anchor \texttt{tip} is exactly on the tip and \texttt{btip} is slightly receded.
+The main arrow shapes in \Circuitikz{} are really shapes, used as pseudo-arrows in lot of places in the packages (for transistors, flows, currents, and so on). The first three arrows are magnified by a factor~3 in the boxes below; for the \texttt{trarrow}, the anchor \texttt{tip} is exactly on the tip and \texttt{btip} is slightly receded.
\begin{groupdesc}
\circuitdesc[3]{currarrow}{Arrow for current and voltage}{}(center/0/0.2)
@@ -3540,6 +3782,30 @@ The arrows are the ones set with the keys \texttt{tunable start arrow} and \text
Notice also the need to force a transparency group if you want a semitransparent arrow.
+\subsubsection{Arrow tips}\label{sec:arrow-tips}
+
+In addition to the pseudo-arrows, \Circuitikz{} also adds a couple of ``real'' arrow tips.
+The package automatically loads the \texttt{arrows.meta} \TikZ{} library but \emph{not} the deprecated \texttt{arrows} library; in the first versions of the package it used quite a lot the \texttt{latex'} tip, which is not available anymore. To maintain the backward compatibility, the `latexslim` tip has been added, and used by default in several components. This is an old-style arrow tip, with no customization possible.
+
+The other tip is \texttt{Jack Tap}\footnote{Added after a suggestion from \href{https://github.com/circuitikz/circuitikz/issues/806}{Anisio Rogerio Braga} on GitHub}, which is mainly used to build jack connectors (see section~\ref{sec:jacks}). This is a new-style arrow tip, and accepts the parameter \texttt{length} (default \texttt{0.3 cm}), \texttt{width} (default \texttt{0.15 cm}), and the boolean \texttt{swap}.
+
+
+\begin{LTXexample}[varwidth=true]
+\begin{circuitikz}
+ \draw (0,.25) (0,0) edge[-latexslim] ++(1,0)
+ ++(0, -0.5) edge[-{Jack Tap[swap]}] ++(1,0)
+ ++(0, -0.5) edge[-Jack Tap] ++(1,0)
+ ++(0, -0.5) edge[-{Jack Tap[fill=cyan]}] ++(1,0)
+ ++(0, -0.5) edge[-{Jack Tap[width=.3cm,fill]}]++(1,0)
+ ++(0, -0.5) edge[-{Jack Tap[width=.3cm,line join=round,
+ line cap=round]}, thick] ++(1,0)
+ ++(0, -0.5) edge[^-^f] ++(1,0)
+ ++(0, -0.5) edge[vf-v] ++(1,0);
+\end{circuitikz}
+\end{LTXexample}
+You can also have a filled version, by adding the key \texttt{fill} (without arguments\footnote{This usage of the \texttt{fill} key in arrow tips will be added to \TikZ{} in version \texttt{3.1.11}, see \href{https://github.com/pgf-tikz/pgf/pull/1352}{this PR by Henri Menke}; \Circuitikz{} will add it to older versions.}) or \texttt{fill=color} if you want a color different from the stroke ones, and they accept the \texttt{line join} and \texttt{line cap} as most of the standard \TikZ{} arrows.
+As you can see, the normal and swapped \texttt{Jack Tap} tips have the shorthands \texttt{v} and \verb|^| (and \texttt{vf} and \verb|^f| for their filled counterparts). Notice that the tips are automatically reversed when they are at the \emph{start} of the path.
+
\subsection{Terminal shapes}\label{sec:terminals}
These are the so-called ``bipole nodes'' shapes, or poles (see section~\ref{sec:bipole-nodes}). These nodes are always filled; the ``open'' versions (starting with an \texttt{o}) are by default filled with the color specified by the key \texttt{open nodes fill} (by default \texttt{white}), but you can override locally it with the \texttt{fill} parameter.
@@ -3553,6 +3819,12 @@ These are the so-called ``bipole nodes'' shapes, or poles (see section~\ref{sec:
\circuitdesc{osquarepole}{Open square-shape terminal}{}
\end{groupdesc}
+This is not a pole, but it's used to "fill" nasty corners (look closer, and see ~\ref{sec:line-joins}).
+
+\begin{groupdesc}
+ \circuitdesc{rectjoinfill}{Filling square with line width size}{}
+\end{groupdesc}
+
Since version 0.9.0, ``bipole nodes'' shapes have all the standard geographical anchors, so you can do things like these:
\begin{LTXexample}[varwidth=true]
@@ -3672,6 +3944,33 @@ You can use the \texttt{plug center} anchor to add the IEC ``multiplier'':
\end{circuitikz}
\end{LTXexample}
+\subsubsection{Jack connectors}\label{sec:jacks}
+
+There are \emph{lots} of different jack connectors symbols --- see the \href{https://github.com/circuitikz/circuitikz/issues/806}{discussion here} for examples. So instead of creating a monster component, it has been decided to add elements to simplify the drawing of such connectors. The first (and for now only) such element is the \texttt{Jack Tap} arrow tip (see section~\ref{sec:arrow-tips}) with its shorthands \texttt{v} and \verb|^|.
+
+For example, and audio jack can be drawn like this:
+
+\begin{LTXexample}[pos=t, varwidth=true]
+% drawing based on one by Anisio Rogerio Braga
+% https://github.com/circuitikz/circuitikz/issues/806
+\newcommand\dx{1.5}\newcommand\dy{1}
+\begin{circuitikz}
+ \draw[-v] (0,\dy/3*4) to[short, o-] ++(\dx,0);
+ \draw[-Triangle] (0,\dy) node[ocirc]{} -| ++(\dx/3,\dy/3);
+ \draw[-Triangle] (0,\dy/3*2) node[ocirc]{} -| ++(\dx/3,-\dy/3);
+ \draw[-^] (0,\dy/3) to[short, o-] ++(2*\dx/3,0);
+ \draw (0,0.0) to[short, o-] ++(1.75*\dx,0) rectangle ++(0.2,4*\dy/3);
+\end{circuitikz}\qquad\qquad
+%---% audio jack with an inserted plug
+\begin{circuitikz}
+ \draw[-v] (0,\dy/3*4) to[short, o-] ++(\dx,0.2);
+ \draw[-Triangle] (0,\dy) node[ocirc]{} -| ++(\dx/3,\dy/3);
+ \draw[-Triangle] (0,\dy/3*2) node[ocirc]{} -| ++(\dx/3,-\dy/3);
+ \draw[-^] (0,\dy/3) to[short, o-] ++(2*\dx/3,-0.2);
+ \draw (0,0.0) to[short, o-] ++(1.75*\dx,0) rectangle ++(0.2,4*\dy/3);
+\end{circuitikz}
+\end{LTXexample}
+
\subsection{Block diagram components}
\noindent Contributed by Stefan Erhardt.
@@ -3702,6 +4001,14 @@ You can use the \texttt{plug center} anchor to add the IEC ``multiplier'':
\circuitdescbip*{highpass}{highpass}{}
\circuitdescbip*{lowpass}{lowpass}{}
\circuitdescbip*{allpass}{allpass}{}
+ \circuitdescbip*{vallpass}{variable allpass\footnotemark}{}
+ \footnotetext{This block, as well as \texttt{bgenerator}, \texttt{cgenerator}, \texttt{qgenerator}, \texttt{ngenerator},
+ \texttt{biast}, \texttt{sinetable}, \texttt{register}, \texttt{harmonics}, and the TV/Radio system blocks have been
+ contributed by \href{https://github.com/circuitikz/circuitikz/pull/693}{Dr. Matthias Jung}.}
+ \circuitdescbip*{bgenerator}{Block generator (use \texttt{t=\dots} to specify text)}{}
+ \circuitdescbip*{qgenerator}{Crystal generator (use \texttt{t=\dots} to specify text)}{}
+ \circuitdescbip*{cgenerator}{Clock generator}{}
+ \circuitdescbip*{ngenerator}{Generic generator (use \texttt{t=\dots} to specify text)}{}
\circuitdescbip*{highpass2}{simplified highpass (with only 2 waves)}{}
\circuitdescbip*{lowpass2}{simplified lowpass (with only 2 waves)}{}
\circuitdescbip*{adc}{A/D converter}{}
@@ -3717,6 +4024,9 @@ You can use the \texttt{plug center} anchor to add the IEC ``multiplier'':
\circuitdescbip*{vtattenuator}{var.\ T attenuator}{}
\circuitdescbip*{phaseshifter}{phase shifter}{}
\circuitdescbip*{vphaseshifter}{var.\ phase shifter}{}
+ \circuitdescbip*{biast}{BIAS-T circuit as block}{}
+ \circuitdescbip*{sinetable}{Sine lookup table}{}
+ \circuitdescbip*{register}{Register (use \texttt{t=\dots} to specify text)}{}(clk/180/0.2)
\circuitdescbip*{detector}{detector}{}
\circuitdescbip*{saturation}{Saturation\footnotemark}{}
\footnotetext{Contributed by \href{https://github.com/circuitikz/circuitikz/issues/758}{P. Sacco \texttt{<paul.sacco@estaca.eu>}}}
@@ -3733,6 +4043,16 @@ You can use the \texttt{plug center} anchor to add the IEC ``multiplier'':
\circuitdescbip*{tacac}{three phases AC/DC converter}{}(ac up in/135/.3, ac mid in/185/.3, ac down in/-135/.3, ac up out/45/.3, ac mid out/-5/.3, ac down out/-45/.3)
\end{groupdesc}
+Blocks to draw TV/radio system schematics, contributed by \href{https://github.com/circuitikz/circuitikz/pull/693}{Dr. Matthias Jung}.
+\begin{groupdesc}
+ % radio/tv block sets
+ \circuitdescbip*{camera}{Videocamera}{}
+ \circuitdescbip*{tvset}{Television (TV)}{}
+ \circuitdescbip*{trx}{Radio tranceiver (HAM-Radio)}{}(plus/160/0.2, minus/200/0.2)
+ \circuitdescbip*{swr}{Standing Wave Ratio (SWR) meter}{}
+ \circuitdescbip*{power}{Power Supply}{}(u1/160/0.2, u2/200/0.2, plus/45/0.2, minus/-45/0.2)
+\end{groupdesc}
+
\begin{groupdesc}
\circuitdesc*{fourport}{Generic fourport}{}(port1/180/0.1, port2/0/0.1, port3/0/0.2, port4/180/0.1)
\circuitdesc*{coupler}{Coupler}{}(left down/180/0.1, right down/0/0.1, right up/0/0.2, left up/180/0.1)
@@ -3915,6 +4235,7 @@ With the option \texttt{>} you can draw an arrow to the input of the block diagr
\end{circuitikz}
\end{LTXexample}
+
You can also change the width for the generic block:
\begin{LTXexample}[pos=t, varwidth=t, basicstyle=\small\ttfamily]
@@ -3928,7 +4249,6 @@ You can also change the width for the generic block:
\end{circuitikz}
\end{LTXexample}
-
\paragraph{Multi ports}
Since inputs and outputs can vary, input arrows can be placed as nodes. Note that you have to rotate the arrow on your own:
@@ -3943,6 +4263,26 @@ Since inputs and outputs can vary, input arrows can be placed as nodes. Note tha
\end{circuitikz}
\end{LTXexample}
+You can use additional anchors to mix different kinds of elements.
+
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily, pos=t]
+% Author: Prof. Dr. Matthias Jung Year: 2023
+\begin{tikzpicture}
+ %\useasboundingbox (-3.75,-1.0) rectangle (10.5,3);
+ \node[draw, powershape] at (0,0) (supply) {};
+ \draw(supply.south) node[anchor=north]{\qty{13,8}{V}};
+ \node[draw, trxshape] at (5,0) (trx) {};
+ \draw(trx.east) -- ++(1,0) node[swrshape, anchor=west](swr){};
+ \draw(swr.east) -- ++(1,0) node[antenna]{};
+ \draw(trx.south) node[ground]{};
+ \draw[red](supply.plus) to [fuse, color=red] ++(2.5,0)
+ to [short, i={I}, color=red] (trx.plus);
+ \draw(trx.minus) to [short, i={}] (supply.minus);
+ \draw(supply.u1) to [short, -o] ++(-1,0) coordinate(c1);
+ \draw(supply.u2) to [short, -o] ++(-1,0) coordinate(c2);
+ \draw(c1) to [open, l_={$\sim\qty{230}{\volt}$}] (c2);
+\end{tikzpicture}
+\end{LTXexample}
\paragraph{Labels and custom two-port boxes}
@@ -3965,6 +4305,15 @@ Some two-ports have the option to place a normal label (\texttt{l=}) and a inner
\end{circuitikz}
\end{LTXexample}
+Each block determines where the text is added:
+\begin{LTXexample}[varwidth=true]
+\begin{circuitikz} \draw
+ (0,0) to[qgenerator, t=G,*-] ++(2,0)
+ to[vallpass,>] ++(2,0)
+ to[ngenerator, t=FM,>] ++(2,0)
+ to[short,-o] ++(0.3,0);
+\end{circuitikz}
+\end{LTXexample}
\paragraph{Box option}
Several devices have the possibility to add a box around them with the \texttt{box} or \texttt{boxed} option. The inner symbol scales down to fit inside the box. For the ``circled'' devices (mixer, adder, oscillator and circulator) the inner circle is normally drawn, unless you use the \texttt{box only} or \texttt{boxed only} option.\footnote{Since 1.5.0, suggested by \href{https://github.com/circuitikz/circuitikz/issues/621}{GitHub user myzinsky}}
@@ -4222,7 +4571,7 @@ You can also change\footnote{Thanks to the idea by \href{https://github.com/circ
\end{tikzpicture}
\end{LTXexample}
-\paragraph{Circles.} Since \texttt{1.2.6}, you can add a circle\footnote{Suggested by Matthias Jung \href{https://github.com/circuitikz/circuitikz/issues/442}{on GitHub}} to most of the transistor shapes --- with the exception of multi-terminal (\texttt{bjtnpn} and \texttt{bjtpnp}, where it would be awkward anyway) and graphene FETs. The circle is intended in some case as the component's housing, and used to distinguish discrete components from integrated ones.
+\paragraph{Circles.} Since \texttt{1.2.6}, you can add a circle\footnote{Suggested by Dr. Matthias Jung \href{https://github.com/circuitikz/circuitikz/issues/442}{on GitHub}} to most of the transistor shapes --- with the exception of multi-terminal (\texttt{bjtnpn} and \texttt{bjtpnp}, where it would be awkward anyway) and graphene FETs. The circle is intended in some case as the component's housing, and used to distinguish discrete components from integrated ones.
To add the circle to a single transistor, you use the \texttt{tr circle} keys in the node; if you want all of your transistors with a circle, you can set the property \texttt{tr circle} with a \verb|\ctikzset| command (it will respect normal grouping, of course); in that case, you can use \texttt{tr circle=false} to locally disable them.
@@ -5171,6 +5520,7 @@ Notes that in the transmission and receiving antennas, the ``waves'' are outside
\circuitdesc{waves}{Waves}{}( north/90/0.4, north east/45/0.4, east/-45/0.4, south east/-45/0.4,
south/-90/0.4, south west/-135/0.4, west/180/0.4, north west/135/0.4,
left/135/0.2, top/45/0.2, right/45/0.2, bottom/-45/0.2 )
+ \circuitdesc{harmonics}{Harmonics which could be combined with waves}{}
\circuitdescbip*{mstline}{Microstrip transmission line\footnotemark}{}(left/135/0.2, right/45/0.2, center/-90/0.3)
\circuitdesc*{mslstub}{Microstrip linear stub}{text}(left/135/0.2, right/45/0.2, center/-45/0.3)
\circuitdesc*{msport}{Microstrip port}{T}(left/135/0.2, right/45/0.2, center/-45/0.3)
@@ -5185,6 +5535,27 @@ Notes that in the transmission and receiving antennas, the ``waves'' are outside
\circuitdesc{match}{match}{}
\end{groupdesc}
+The \texttt{waves} and \texttt{harmonics} can help with RF block diagrams
+\begin{LTXexample}[varwidth=true, basicstyle=\small\ttfamily, pos=t]
+% Author: Prof. Dr. Matthias Jung, DL9MJ % Year: 2023
+\begin{circuitikz}[european]
+ \draw(0,0) node [dinantenna](ant1){};
+ \draw[thick](ant1.south) -- ++(0,-1)
+ node[anchor=south west](){$f=\qty{145,9}{\mega\hertz}$};
+ \draw(3.5,0) node [dinantenna](ant2){};
+ \draw(3.75,-0.5) node[tvsetshape, anchor=west, fill=gray](tv){};
+ \draw[thick] (ant2) |- (tv);
+ \draw(tv.north) node[above](){TV};
+ %
+ \draw[gray](ant1.right) node[harmonics, xscale=2, anchor=left](){};
+ \draw[thick](ant1.right) node[waves, xscale=2, anchor=left](){};
+ %
+ \draw(tv.south) ++(0,-0.25)
+ node[below](foo){$f=$\,\qtyrange{582}{590}{\mega\hertz}};
+ \draw(foo.south) node[below](){DVB-T2 Kanal 35};
+\end{circuitikz}
+\end{LTXexample}
+
\subsubsection{RF elements customization}
The RF elements can be scaled using the key \texttt{RF/scale}, default \texttt{1.0}.
@@ -6596,7 +6967,7 @@ with the parameter \texttt{number inputs} :
\end{circuitikz}
\end{LTXexample}
-You can suppress the drawing of the logic ports input leads by using the boolean key \texttt{logic ports draw input leads} (default \texttt{true}) or, locally, with the style \texttt{no inputs leads} (that can be reverted with \texttt{input leads}), like in the following example. The anchors do not change and you have to take responsibility to make the connection to the ``border''-anchors.
+You can suppress the drawing of the logic ports input leads by using the boolean key \texttt{logic ports draw input leads} (default \texttt{true}) or, locally, with the style \texttt{no input leads} (that can be reverted with \texttt{input leads}), like in the following example. The anchors do not change and you have to take responsibility to make the connection to the ``border''-anchors.
\begin{LTXexample}[varwidth=true]
\begin{circuitikz}
@@ -7436,9 +7807,9 @@ External pins' length is controlled by the key \texttt{multipoles/external pins
like in chips. In addition, like in logic ports, you can suppress the
drawing of the leads by using the boolean key
\texttt{logic ports draw input leads} (default \texttt{true}) or, locally,
-with the style \texttt{no inputs leads} (that can be reverted with
+with the style \texttt{no input leads} (that can be reverted with
\texttt{input leads}).
-The main difference between setting \texttt{external pins width} to \texttt{0} or using \texttt{no inputs lead} is that in the first case the normal pin anchors and the border anchors will coincide, and in the second case they will not move and stay where they should have been if the leads were drawn.
+The main difference between setting \texttt{external pins width} to \texttt{0} or using \texttt{no input lead} is that in the first case the normal pin anchors and the border anchors will coincide, and in the second case they will not move and stay where they should have been if the leads were drawn.
You can draw only selected pins and leave out the rest by setting the keys
\texttt{multipoles/draw only \emph{side} pins} and the corresponding style
@@ -7840,7 +8211,7 @@ You can, if you want, avoid printing the numbers of the pin with \texttt{hide nu
\end{LTXexample}
-Also, you can suppress the drawing of the pins, by using the style \texttt{no inputs leads} (that can be reverted with \texttt{input leads}). The main difference between setting \texttt{external pins width} to \texttt{0} or using \texttt{no inputs lead} is that in the first case the normal pin anchors and the border anchors will coincide, and in the second case they will not move and stay where they should have been if the leads were drawn.
+Also, you can suppress the drawing of the pins, by using the style \texttt{no input leads} (that can be reverted with \texttt{input leads}). The main difference between setting \texttt{external pins width} to \texttt{0} or using \texttt{no input lead} is that in the first case the normal pin anchors and the border anchors will coincide, and in the second case they will not move and stay where they should have been if the leads were drawn.
For special use you can suppress the orientation mark with the key \texttt{no topmark} (default \texttt{topmark}).
diff --git a/graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty b/graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
index 1104d2c0d2..beb5505701 100644
--- a/graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
+++ b/graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4-body.tex b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4-body.tex
index fa6fb3c2a8..ca5392fa83 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4-body.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4-body.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4.sty
index faa09eb32f..3d552d4eaa 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6-body.tex b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6-body.tex
index 0630698e49..6aee9b47e4 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6-body.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6-body.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6.sty
index 3d41bfcc1d..d282f55cd5 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7-body.tex b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7-body.tex
index 91f5dabcd0..4e3ba24e3a 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7-body.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7-body.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7.sty
index efe138d2a2..4162977f99 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3-body.tex b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3-body.tex
index b65bc59c8f..e058f29ecf 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3-body.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3-body.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3.sty
index ccd07fea83..da59d5636b 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3-body.tex b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3-body.tex
index dfaa1bb4d6..0f077a1deb 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3-body.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3-body.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3.sty
index 2ce27f90e2..9f90dc99bd 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6-body.tex b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6-body.tex
index 450ac4fcff..83d7eac703 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6-body.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6-body.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6.sty
index 49fe5703fa..8b357c6f91 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0-body.tex b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0-body.tex
index b4cbf9d327..f632aefb0a 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0-body.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0-body.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -342,10 +342,10 @@
%%%%%%%%%
%%%%%%%%%%% Springe nach tex/pgfcirc.defines
%%%---------- open: tex/pgfcirc.defines.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2304,10 +2304,10 @@
%%%---------- close: tex/pgfcirc.defines
%%%%%%%%%%% Springe nach tex/pgfcircutils
%%%---------- open: tex/pgfcircutils.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2376,10 +2376,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircshapes
%%%---------- open: tex/pgfcircshapes.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -3182,10 +3182,10 @@
%%%---------- close: tex/pgfcircshapes
%%%%%%%%%%% Springe nach tex/pgfcircmonopoles
%%%---------- open: tex/pgfcircmonopoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -4198,10 +4198,10 @@
%%%---------- close: tex/pgfcircmonopoles
%%%%%%%%%%% Springe nach tex/pgfcircbipoles
%%%---------- open: tex/pgfcircbipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -9302,10 +9302,10 @@
%%%---------- close: tex/pgfcircbipoles
%%%%%%%%%%% Springe nach tex/pgfcirctripoles
%%%---------- open: tex/pgfcirctripoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -15010,10 +15010,10 @@
%%%---------- close: tex/pgfcirctripoles
%%%%%%%%%%% Springe nach tex/pgfcircquadpoles
%%%---------- open: tex/pgfcircquadpoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -16161,10 +16161,10 @@
%%%---------- close: tex/pgfcircquadpoles
%%%%%%%%%%% Springe nach tex/pgfcircmultipoles
%%%---------- open: tex/pgfcircmultipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -17939,10 +17939,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirclabel
%%%---------- open: tex/pgfcirclabel.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -18308,10 +18308,10 @@
%%%---------- close: tex/pgfcirclabel
%%%%%%%%%%% Springe nach tex/pgfcircvoltage
%%%---------- open: tex/pgfcircvoltage.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -18807,10 +18807,10 @@
%%%---------- close: tex/pgfcircvoltage
%%%%%%%%%%% Springe nach tex/pgfcirccurrent
%%%---------- open: tex/pgfcirccurrent.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -19022,10 +19022,10 @@
%%%---------- close: tex/pgfcirccurrent
%%%%%%%%%%% Springe nach tex/pgfcircflow
%%%---------- open: tex/pgfcircflow.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -19236,10 +19236,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircpath
%%%---------- open: tex/pgfcircpath.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0.sty
index 9771552881..b5a2c5aa66 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2-body.tex b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2-body.tex
index 9d25525027..9219fbd4bb 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2-body.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2-body.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -343,10 +343,10 @@
%%%%%%%%%
%%%%%%%%%%% Springe nach tex/pgfcirc.defines
%%%---------- open: tex/pgfcirc.defines.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2449,10 +2449,10 @@
%%%---------- close: tex/pgfcirc.defines
%%%%%%%%%%% Springe nach tex/pgfcircutils
%%%---------- open: tex/pgfcircutils.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2535,10 +2535,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircshapes
%%%---------- open: tex/pgfcircshapes.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -3341,10 +3341,10 @@
%%%---------- close: tex/pgfcircshapes
%%%%%%%%%%% Springe nach tex/pgfcircmonopoles
%%%---------- open: tex/pgfcircmonopoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -4357,10 +4357,10 @@
%%%---------- close: tex/pgfcircmonopoles
%%%%%%%%%%% Springe nach tex/pgfcircbipoles
%%%---------- open: tex/pgfcircbipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -10254,10 +10254,10 @@
%%%---------- close: tex/pgfcircbipoles
%%%%%%%%%%% Springe nach tex/pgfcirctripoles
%%%---------- open: tex/pgfcirctripoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -16161,10 +16161,10 @@
%%%---------- close: tex/pgfcirctripoles
%%%%%%%%%%% Springe nach tex/pgfcircquadpoles
%%%---------- open: tex/pgfcircquadpoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -17448,10 +17448,10 @@
%%%---------- close: tex/pgfcircquadpoles
%%%%%%%%%%% Springe nach tex/pgfcircmultipoles
%%%---------- open: tex/pgfcircmultipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -20142,10 +20142,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirclabel
%%%---------- open: tex/pgfcirclabel.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -20511,10 +20511,10 @@
%%%---------- close: tex/pgfcirclabel
%%%%%%%%%%% Springe nach tex/pgfcircvoltage
%%%---------- open: tex/pgfcircvoltage.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -21060,10 +21060,10 @@
%%%---------- close: tex/pgfcircvoltage
%%%%%%%%%%% Springe nach tex/pgfcirccurrent
%%%---------- open: tex/pgfcirccurrent.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -21275,10 +21275,10 @@
%%%---------- close: tex/pgfcirccurrent
%%%%%%%%%%% Springe nach tex/pgfcircflow
%%%---------- open: tex/pgfcircflow.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -21489,10 +21489,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircpath
%%%---------- open: tex/pgfcircpath.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2.sty
index 0a3ea7c761..cdb974752f 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7-body.tex b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7-body.tex
index e36e6ff66c..ce976529cd 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7-body.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7-body.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -320,10 +320,10 @@
%%%%%%%%%
%%%%%%%%%%% Springe nach tex/pgfcirc.defines
%%%---------- open: tex/pgfcirc.defines.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2641,10 +2641,10 @@
%%%---------- close: tex/pgfcirc.defines
%%%%%%%%%%% Springe nach tex/pgfcircutils
%%%---------- open: tex/pgfcircutils.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2736,10 +2736,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircshapes
%%%---------- open: tex/pgfcircshapes.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -3548,10 +3548,10 @@
%%%---------- close: tex/pgfcircshapes
%%%%%%%%%%% Springe nach tex/pgfcircmonopoles
%%%---------- open: tex/pgfcircmonopoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -4650,10 +4650,10 @@
%%%---------- close: tex/pgfcircmonopoles
%%%%%%%%%%% Springe nach tex/pgfcircbipoles
%%%---------- open: tex/pgfcircbipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -10813,10 +10813,10 @@
%%%---------- close: tex/pgfcircbipoles
%%%%%%%%%%% Springe nach tex/pgfcirctripoles
%%%---------- open: tex/pgfcirctripoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -17247,10 +17247,10 @@
%%%---------- close: tex/pgfcirctripoles
%%%%%%%%%%% Springe nach tex/pgfcircquadpoles
%%%---------- open: tex/pgfcircquadpoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -18993,10 +18993,10 @@
%%%---------- close: tex/pgfcircquadpoles
%%%%%%%%%%% Springe nach tex/pgfcircmultipoles
%%%---------- open: tex/pgfcircmultipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -22024,10 +22024,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirclabel
%%%---------- open: tex/pgfcirclabel.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -22395,10 +22395,10 @@
%%%---------- close: tex/pgfcirclabel
%%%%%%%%%%% Springe nach tex/pgfcircvoltage
%%%---------- open: tex/pgfcircvoltage.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -23026,10 +23026,10 @@
%%%---------- close: tex/pgfcircvoltage
%%%%%%%%%%% Springe nach tex/pgfcirccurrent
%%%---------- open: tex/pgfcirccurrent.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -23256,10 +23256,10 @@
%%%---------- close: tex/pgfcirccurrent
%%%%%%%%%%% Springe nach tex/pgfcircflow
%%%---------- open: tex/pgfcircflow.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -23497,10 +23497,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircpath
%%%---------- open: tex/pgfcircpath.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7.sty
index 10621785e2..ea2e861f54 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6-body.tex b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6-body.tex
index 4182695e66..39e989317e 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6-body.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6-body.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -324,10 +324,10 @@
%% we have to load this before options to define the magics for compatibility
%%%%%%%%%%% Springe nach tex/pgfcirc.defines
%%%---------- open: tex/pgfcirc.defines.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -1225,10 +1225,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircutils
%%%---------- open: tex/pgfcircutils.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -1630,10 +1630,10 @@
%%%---------- close: tex/pgfcircutils
%%%%%%%%%%% Springe nach tex/pgfcircpath
%%%---------- open: tex/pgfcircpath.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -1995,10 +1995,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircshapes
%%%---------- open: tex/pgfcircshapes.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2817,10 +2817,10 @@
%%%---------- close: tex/pgfcircshapes
%%%%%%%%%%% Springe nach tex/pgfcircmonopoles
%%%---------- open: tex/pgfcircmonopoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -4020,10 +4020,10 @@
%%%---------- close: tex/pgfcircmonopoles
%%%%%%%%%%% Springe nach tex/pgfcircbipoles
%%%---------- open: tex/pgfcircbipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -10250,10 +10250,10 @@
%%%---------- close: tex/pgfcircbipoles
%%%%%%%%%%% Springe nach tex/pgfcirctripoles
%%%---------- open: tex/pgfcirctripoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -18818,10 +18818,10 @@
%%%---------- close: tex/pgfcirctripoles
%%%%%%%%%%% Springe nach tex/pgfcircquadpoles
%%%---------- open: tex/pgfcircquadpoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -22579,10 +22579,10 @@
%%%---------- close: tex/pgfcircquadpoles
%%%%%%%%%%% Springe nach tex/pgfcircmultipoles
%%%---------- open: tex/pgfcircmultipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -24740,10 +24740,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirclabel
%%%---------- open: tex/pgfcirclabel.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -25142,10 +25142,10 @@
%%%---------- close: tex/pgfcirclabel
%%%%%%%%%%% Springe nach tex/pgfcircvoltage
%%%---------- open: tex/pgfcircvoltage.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -25852,10 +25852,10 @@
%%%---------- close: tex/pgfcircvoltage
%%%%%%%%%%% Springe nach tex/pgfcirccurrent
%%%---------- open: tex/pgfcirccurrent.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -26098,10 +26098,10 @@
%%%---------- close: tex/pgfcirccurrent
%%%%%%%%%%% Springe nach tex/pgfcircflow
%%%---------- open: tex/pgfcircflow.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6.sty
index fb63155a42..62fad943ae 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty b/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
index afa91d4b2b..a6da82fba5 100644
--- a/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
+++ b/graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -16,8 +16,8 @@
\providecommand\DeclareRelease[3]{}
\providecommand\DeclareCurrentRelease[2]{}
-\def\pgfcircversion{1.6.9}
-\def\pgfcircversiondate{2024/05/25}
+\def\pgfcircversion{1.7.1}
+\def\pgfcircversiondate{2025/01/10}
\DeclareRelease{0.4}{2012/12/20}{circuitikz-0.4-body.tex}
\DeclareRelease{v0.4}{2012/12/20}{circuitikz-0.4-body.tex}
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
index 943745bf7a..b932385e57 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -266,6 +266,58 @@
%
%>>>
+%% check loaded TikZ/pgf version %<<<`
+%
+% parse the release date, thanks to Skillmon
+% https://github.com/pgf-tikz/pgf/issues/1348#issuecomment-2231681032
+% date can be yyyy-mm-dd or (older TikZ) yyyy/mm/dd
+\begingroup
+ \pgfutil@protected\def\parsedate#1%
+ {%
+ \afterassignment\parsedate@month
+ \pgf@circ@count@a=#1\relax
+ }
+ \pgfutil@protected\def\parsedate@month#1%
+ {%
+ \afterassignment\parsedate@day
+ \pgf@circ@count@b=%
+ }
+ \pgfutil@protected\def\parsedate@day#1%
+ {%
+ \afterassignment\parsedate@cleanup
+ \pgf@circ@count@c=%
+ }
+ \def\parsedate@cleanup#1\relax{}%
+ \parsedate{\pgfrevisiondate}%
+ \xdef\ctikz@@pgfyear{\the\pgf@circ@count@a}%
+ \xdef\ctikz@@pgfmonth{\the\pgf@circ@count@b}%
+ \xdef\ctikz@@pgfday{\the\pgf@circ@count@c}%
+\endgroup
+% The following code thanks to Skillmon:
+% https://tex.stackexchange.com/a/722570/38080
+% modified by romano to check the date
+\def\ctikz@@ifpgfafter@auxi#1#2%
+ {%
+ \ifnum#1
+ \ctikz@@ifpgfafter@auxii{#2}%
+ \fi
+ }
+\def\ctikz@@ifpgfafter@auxii#1\fi#2\ctikz@@ifpgfafter#3{\fi#1}
+\def\ctikz@@ifpgfafter#1-#2-#3#%
+ {%
+ \ctikz@@ifpgfafter@auxi{\ctikz@@pgfyear>#1}\pgfutil@firstoftwo
+ \ctikz@@ifpgfafter@auxi{\ctikz@@pgfyear<#1}\pgfutil@secondoftwo
+ \ctikz@@ifpgfafter@auxi{\ctikz@@pgfmonth>#2}\pgfutil@firstoftwo
+ \ctikz@@ifpgfafter@auxi{\ctikz@@pgfmonth<#2}\pgfutil@secondoftwo
+ \ctikz@@ifpgfafter@auxi{\ctikz@@pgfday<#3}\pgfutil@secondoftwo
+ \pgfutil@gobble\ctikz@@ifpgfafter\pgfutil@firstoftwo
+ }
+%
+% usage \ctikz@@ifpgfafter 2023-01-16{true}{false}
+% ^^^ no spaces here, braces needed.
+%
+%>>>
+
%% arrow tips macros and utilities %<<<1
% the default arrow is latexslim, which has been ported over old arrows library (deprecated)
@@ -298,9 +350,70 @@
\pgfpathclose
\pgfusepathqfill
}
-
\pgfarrowsdeclarereversed{latexslim reversed}{latexslim reversed}{latexslim}{latexslim}
-
+%% Jack Tap, see
+%% https://github.com/circuitikz/circuitikz/issues/806
+\pgfdeclarearrow{name=Jack Tap,
+ parameters = {%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \ifpgfarrowswap s\fi%
+ \ifpgfarrowopen o\fi%
+ \ifpgfarrowroundjoin j\fi
+ \ifpgfarrowroundcap c\fi%
+ },
+ setup code = {
+ \pgfarrowssettipend{.5\pgfarrowlength}
+ \pgfarrowssetlineend{-.6\pgfarrowlength}
+ \pgfarrowssetvisualbackend{-.6\pgfarrowlength}
+ \pgfarrowssetbackend{-.6\pgfarrowlength}
+ % hull
+ \pgfarrowshullpoint{.5\pgfarrowlength}{0pt}
+ \pgfarrowshullpoint{0pt}{\pgfarrowwidth}
+ \pgfarrowshullpoint{-.6\pgfarrowlength}{0pt}
+ % Saves: Only the length:
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowssavethe\pgfarrowwidth
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \pgfarrowlinewidth=\pgflinewidth
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifpgfarrowroundcap\pgfsetroundcap\else\pgfsetbuttcap\fi
+ \pgfpathmoveto{\pgfqpoint{-.6\pgfarrowlength}{0pt}}
+ \pgfpathlineto{\pgfqpoint{-.5\pgfarrowlength}{0pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfarrowwidth}}
+ \pgfpathlineto{\pgfqpoint{.5\pgfarrowlength}{0pt}}
+ \ifpgfarrowopen
+ \pgfusepathqstroke
+ \else
+ \pgfpathclose
+ \ifdim\pgfarrowlinewidth>0pt\pgfusepathqfillstroke\else\pgfusepathqfill\fi
+ \fi
+ },
+ defaults = {length = 0.3cm, width=0.15cm, open},
+ % cache=false, % breaks everything
+}
+% the new "fill without arg" will be in TikZ 3.1.11. Apply it here if we have an
+% older version
+\ctikz@@ifpgfafter 2023-01-16{\relax}{%
+ % thanks @muzimuzhi https://github.com/pgf-tikz/pgf/issues/1348#issuecomment-2229075269
+ % undo the fill/.value required key
+ \expandafter\let\csname pgfk@/pgf/arrow keys/fill/.@def\endcsname\@undefined
+ \pgfkeys{/pgf/arrow keys/fill/.code={%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@nonetext%
+ \pgfarrowsaddtooptions{\pgfarrowopentrue}%
+ \else\ifx\pgf@temp\pgfkeysnovalue@text%
+ \pgfarrowsaddtooptions{\pgfarrowopenfalse}%
+ \else
+ \pgfarrowsaddtooptions{\pgfarrowopenfalse\def\pgf@arrows@fill@color{#1}}%
+ \fi\fi
+ }}%
+}
+\tikzset{v/.tip={Jack Tap[swap]}, ^/.tip={Jack Tap},
+ vf/.tip={Jack Tap[swap,fill]}, ^f/.tip={Jack Tap[fill]}}
+%
% select the arrows using available defaults.
\def\pgfcirc@arrow@default{default}
% choose the arrows to use. Use #2 and #3 if the key is equal to "default"
@@ -466,7 +579,30 @@
\fi
\fi
}
-
+% similar o the above, use the fill parameter to set fill or draw
+% for a subset of the shape
+\def\pgf@circ@subset@fill@or@draw#1{%
+ % You *must* be sure that this is called inside a \pgfscope!
+ \edef\@@none{none}\edef\@@default{default}
+ \edef\@@tmp{\ctikzvalof{#1/fill}}
+ \ifx\@@tmp\@@none
+ \pgfusepath{draw}
+ \else
+ \ifx\@@tmp\@@default\else
+ \pgfsetfillcolor{\@@tmp}
+ \fi
+ \pgfusepath{draw, fill}
+ \fi
+}
+% ...and for the thickness
+\def\pgf@circ@subset@thickness#1{%
+ % You *must* be sure that this is called inside a \pgfscope!
+ \edef\@@default{default}
+ \edef\@@tmp{\ctikzvalof{#1/thickness}}
+ \ifx\@@tmp\@@default\else
+ \pgfsetlinewidth{\@@tmp\pgflinewidth}%
+ \fi
+}
% set the text color (via \color) if the color is not default or none
% needed in some strange case (like bodydiode' dots)
\def\pgf@circ@maybe@color#1{%
@@ -557,6 +693,7 @@
% #7 - macros drawing the bipole
%
\long\def\pgfcircdeclarebipolescaled#1#2#3#4#5#6#7{
+ % \typeout{Declaring bipole:\space #4,}
\pgfdeclareshape{#4shape}{
\savedmacro{\ctikzclass}{\edef\ctikzclass{#1}}
\saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}}
@@ -602,97 +739,33 @@
\pgf@y=.5\pgf@y
}
\anchor{center}{\pgfpointorigin}
- \anchor{n}{
- \northeast
- \pgf@x=0cm
- }
- \anchor{north east}{
- \northeast
- }
- \anchor{north west}{
- \northeast
- \pgf@x=-\pgf@x
- }
- \anchor{ne}{
- \northeast
- }
- \anchor{nw}{
- \northeast
- \pgf@x=-\pgf@x
- }
- \anchor{e}{
- \northeast
- \pgf@y=0cm
- }
- \anchor{s}{
- \southwest
- \pgf@x=0cm
- }
- \anchor{south east}{
- \southwest
- \pgf@x=-\pgf@x
- }
- \anchor{south west}{
- \southwest
- }
- \anchor{se}{
- \southwest
- \pgf@x=-\pgf@x
- }
- \anchor{sw}{
- \southwest
- }
- \anchor{w}{
- \southwest
- \pgf@y=0cm
- }
- \anchor{north}{
- \northeast
- \pgf@x=0cm
- }
- \anchor{east}{
- \northeast
- \pgf@y=0cm
- }
- \anchor{south}{
- \southwest
- \pgf@x=0cm
- }
- \anchor{west}{
- \southwest
- \pgf@y=0cm
- }
- \anchor{right}{
- \northeast
- \pgf@y=0cm
- }
- \anchor{above}{
- \northeast
- \pgf@x=0cm
- }
- \anchor{left}{
- \southwest
- \pgf@y=0cm
- }
- \anchor{below}{
- \southwest
- \pgf@x=0cm
- }
- \anchor{a}{
- \northeast
- \pgf@y=0cm
- }
- \anchor{b}{
- \southwest
- \pgf@y=0cm
- }
+ \anchor{n}{\northeast\pgf@x=0cm }
+ \anchor{north east}{\northeast}
+ \anchor{north west}{\northeast\pgf@x=-\pgf@x}
+ \anchor{ne}{\northeast}
+ \anchor{nw}{\northeast\pgf@x=-\pgf@x}
+ \anchor{e}{\northeast\pgf@y=0cm }
+ \anchor{s}{\southwest\pgf@x=0cm }
+ \anchor{south east}{\southwest\pgf@x=-\pgf@x}
+ \anchor{south west}{\southwest}
+ \anchor{se}{\southwest\pgf@x=-\pgf@x}
+ \anchor{sw}{\southwest}
+ \anchor{w}{\southwest\pgf@y=0cm }
+ \anchor{north}{\northeast\pgf@x=0cm }
+ \anchor{east}{\northeast\pgf@y=0cm }
+ \anchor{south}{\southwest\pgf@x=0cm }
+ \anchor{west}{\southwest\pgf@y=0cm }
+ \anchor{right}{\northeast\pgf@y=0cm }
+ \anchor{above}{\northeast\pgf@x=0cm }
+ \anchor{left}{\southwest\pgf@y=0cm }
+ \anchor{below}{\southwest\pgf@x=0cm }
+ \anchor{a}{\northeast\pgf@y=0cm }
+ \anchor{b}{\southwest\pgf@y=0cm }
\savedanchor{\textanchor}{%
\pgf@y=\ht\pgfnodeparttextbox
\pgf@x=-.5\wd\pgfnodeparttextbox
}
- \anchor{text}{
- \textanchor
- }
+ \anchor{text}{ \textanchor }
\anchorborder{%
\ifpgf@circuit@bipole@inverted
\pgf@circ@res@left=-\pgf@x
@@ -711,7 +784,6 @@
#2%
\pgf@circ@draw@component{
\pgf@circ@setcolor
-
\northeast
\pgf@circ@res@up = \pgf@y
\pgf@circ@res@zero = 0cm
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
index 626ed28812..c1292d4969 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -632,13 +632,21 @@
\pgfusepath{draw}
\endpgfscope
}%
-
%% Zig-zag resistors
+% see https://github.com/circuitikz/circuitikz/discussions/814
+\ctikzset{resistors/zigzag stub/.initial=0}
+\ctikzset{resistors/zigzag hook/.code={}}
\def\pgf@circ@zigzag#1{%
+ \pgf@circ@res@temp=\ctikzvalof{resistors/zigzag stub}\pgf@circ@res@step
+ \advance \pgf@circ@res@step by -2\pgf@circ@res@temp
\divide \pgf@circ@res@step by \numexpr4*\zigs\relax
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{\pgf@circ@res@zero}}
+ \ifdim\pgf@circ@res@temp>0pt
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@left+\pgf@circ@res@temp -\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{\pgf@circ@res@zero}}
+ \fi
\pgf@circ@res@other = \pgf@circ@res@left
+ \advance\pgf@circ@res@other by \pgf@circ@res@temp
\pgf@circ@count@a=\zigs\relax
% first half zig
\advance\pgf@circ@res@other by \pgf@circ@res@step
@@ -655,11 +663,14 @@
\advance\pgf@circ@res@other by 2\pgf@circ@res@step
\pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{#1\pgf@circ@res@down}}
\advance\pgf@circ@res@other by \pgf@circ@res@step
- \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@zero}}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@other+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{\pgf@circ@res@zero}}
+ \ifdim\pgf@circ@res@temp>0pt
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@other+\pgf@circ@res@temp+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{\pgf@circ@res@zero}}
+ \fi
\pgfsetbeveljoin
+ \pgfkeys{/tikz/circuitikz/resistors/zigzag hook}
\pgfusepath{draw}
}
-
%% Resistor
\pgfcircdeclarebipolescaled{resistors}
{
@@ -672,7 +683,7 @@
{
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgftransformationadjustments
- \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/resistor/width}*\scaledRlen+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}
+ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/resistor/width}*\scaledRlen}
\pgf@circ@zigzag{1}
}
@@ -692,7 +703,7 @@
{
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgftransformationadjustments
- \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/vresistor/width}*\scaledRlen+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}
+ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/vresistor/width}*\scaledRlen}
\pgf@circ@zigzag{.5}
\pgfscope
@@ -731,7 +742,7 @@
{
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgftransformationadjustments
- \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/potentiometer/width}*\scaledRlen+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}
+ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/potentiometer/width}*\scaledRlen}
\pgf@circ@zigzag{1}
\pgfscope
@@ -761,7 +772,7 @@
{%
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgftransformationadjustments
- \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/resistivesens/width}*\scaledRlen+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}
+ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/resistivesens/width}*\scaledRlen}
\pgf@circ@zigzag{.5}
\pgfscope
@@ -810,7 +821,7 @@
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right/\@@intscale+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{+0pt}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{+0pt}}
\pgftransformationadjustments
- \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/ldresistor/width}*\scaledRlen+\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}
+ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{bipoles/ldresistor/width}*\scaledRlen}
\pgf@circ@zigzag{\@@hscale}
}%
@@ -1955,6 +1966,9 @@
\ctikzset{bipoles/battery1/width/.initial=.3}
\ctikzset{bipoles/battery2/height/.initial=.6}
\ctikzset{bipoles/battery2/width/.initial=.3}
+\ctikzset{bipoles/solar/height/.initial=.6}
+\ctikzset{bipoles/solar/width/.initial=.3}
+
% noise sources
\ctikzset{bipoles/noise sources/fillcolor/.initial=gray!50}
@@ -2128,6 +2142,41 @@
\pgfusepath{draw}
}
+% Solar cell
+\pgfcircdeclarebipolescaled{batteries}
+{}
+{\ctikzvalof{bipoles/solar/height}}
+{solar}
+{\ctikzvalof{bipoles/solar/height}}
+{\ctikzvalof{bipoles/solar/width}}
+{
+ \pgfpathmoveto{\pgfpoint{.33\pgf@circ@res@right}{0}}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{0}}
+ \pgfpathmoveto{\pgfpoint{.33\pgf@circ@res@left}{0}}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{0}}
+ \pgfusepath{draw}
+
+ \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
+ \ifpgf@circ@fixbatteries
+ \pgfpathmoveto{\pgfpoint{.33\pgf@circ@res@right}{\pgf@circ@res@up}}
+ \pgfpathlineto{\pgfpoint{.33\pgf@circ@res@right}{\pgf@circ@res@down}}
+ \pgfusepath{draw}
+ \pgfsetlinewidth{3\pgflinewidth}
+ \pgfpathmoveto{\pgfpoint{.33\pgf@circ@res@left}{.5\pgf@circ@res@up}}
+ \pgfpathlineto{\pgfpoint{.33\pgf@circ@res@left}{.5\pgf@circ@res@down}}
+ \else
+ \pgfpathmoveto{\pgfpoint{.33\pgf@circ@res@left}{\pgf@circ@res@up}}
+ \pgfpathlineto{\pgfpoint{.33\pgf@circ@res@left}{\pgf@circ@res@down}}
+ \pgfusepath{draw}
+ \pgfsetlinewidth{3\pgflinewidth}
+ \pgfpathmoveto{\pgfpoint{.33\pgf@circ@res@right}{.5\pgf@circ@res@up}}
+ \pgfpathlineto{\pgfpoint{.33\pgf@circ@res@right}{.5\pgf@circ@res@down}}
+ \fi
+
+ \pgfusepath{draw}
+ \pgf@circ@draw@pdarrows
+}
+
%%%
%%% https://xkcd.com/2818/
%%% Also https://chat.stackexchange.com/transcript/message/64238058#64238058
@@ -3430,6 +3479,9 @@
\circuitikzbasekey/bipole/is voltageoutsideofsymbol=true}
\pgfcirc@activate@bipole@opt{v}{batterytwo}{battery2}{battery2}{\circuitikzbasekey/bipole/is voltage=true,
\circuitikzbasekey/bipole/is voltageoutsideofsymbol=true}
+\pgfcirc@activate@bipole@opt{v}{solarsource}{solar}{solar}{\circuitikzbasekey/bipole/is voltage=true,
+ \circuitikzbasekey/bipole/is voltageoutsideofsymbol=true}
+
%% Sources: voltage
\pgfcirc@activate@bipole@opt{v}{vsource}{vsource}{european voltage source}{%
@@ -3452,6 +3504,11 @@
\pgfcirc@style@to@style{controlled voltage source}{cvsource}
\pgfcirc@style@to@style{controlled voltage source}{controlled vsource}
\pgfcirc@style@to@style{controlled voltage source}{cV}
+%% fix the mess about not having the shortcut accessible in every mode...
+\pgfcirc@style@to@style{american voltage source}{vsourceAM}
+\pgfcirc@style@to@style{american controlled voltage source}{cvsourceAM}
+\pgfcirc@style@to@style{european voltage source}{vsourceEU}
+\pgfcirc@style@to@style{european controlled voltage source}{cvsourceEU}
\pgfcirc@activate@bipole@simple@opt{v}{esource}{%
\circuitikzbasekey/bipole/is voltage=true,
@@ -3547,6 +3604,11 @@
\pgfcirc@style@to@style{controlled current source}{cisource}
\pgfcirc@style@to@style{controlled current source}{controlled isource}
\pgfcirc@style@to@style{controlled current source}{cI}
+%% fix the mess about not having the shortcut accessible in every mode...
+\pgfcirc@style@to@style{american current source}{isourceAM}
+\pgfcirc@style@to@style{american controlled current source}{cisourceAM}
+\pgfcirc@style@to@style{european current source}{isourceEU}
+\pgfcirc@style@to@style{european controlled current source}{cisourceEU}
\pgfcirc@activate@bipole@opt{i}{isourcesin}{isourcesin}{sinusoidal current source}{%
\circuitikzbasekey/bipole/is current=true}
@@ -3673,6 +3735,13 @@
}}
%
+% Whiskers for ZZener and TVS
+%
+\newif\ifpgf@zz@straightwhisk
+\pgf@zz@straightwhiskfalse
+\ctikzset{diode straight whiskers/.code=\pgf@zz@straightwhisktrue}
+\ctikzset{diode sloped whiskers/.code=\pgf@zz@straightwhiskfalse}
+%
% Flipping arrows in LED and photodiodes
%
\newif\ifpgf@led@fliparrows
@@ -3766,10 +3835,15 @@
{
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgf@circ@fulldiode@triangle@shift
- \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right-1.8\pgf@circ@res@left}{\pgf@circ@res@down-0.5\pgf@circ@res@up}}
+ \ifpgf@zz@straightwhisk
+ \edef\@@tmp{0.0}
+ \else
+ \edef\@@tmp{0.5}
+ \fi
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right-1.8\pgf@circ@res@left}{\pgf@circ@res@down-\@@tmp\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right-\pgf@circ@res@left}{\pgf@circ@res@down}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right-\pgf@circ@res@left}{\pgf@circ@res@up}}
- \pgfpathlineto{\pgfpoint{\pgf@circ@res@right-0.2\pgf@circ@res@left}{\pgf@circ@res@up-0.5\pgf@circ@res@down}}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@right-0.2\pgf@circ@res@left}{\pgf@circ@res@up-\@@tmp\pgf@circ@res@down}}
\pgfusepath{draw}
}
@@ -4051,10 +4125,15 @@
\pgfscope
\pgf@circ@basicdiodeshape
- \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right-1.8\pgf@circ@res@left}{\pgf@circ@res@down-0.5\pgf@circ@res@up}}
+ \ifpgf@zz@straightwhisk
+ \edef\@@tmp{0.0}
+ \else
+ \edef\@@tmp{0.5}
+ \fi
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right-1.8\pgf@circ@res@left}{\pgf@circ@res@down-\@@tmp\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right-\pgf@circ@res@left}{\pgf@circ@res@down}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right-\pgf@circ@res@left}{\pgf@circ@res@up}}
- \pgfpathlineto{\pgfpoint{\pgf@circ@res@right-0.2\pgf@circ@res@left}{\pgf@circ@res@up-0.5\pgf@circ@res@down}}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@right-0.2\pgf@circ@res@left}{\pgf@circ@res@up-\@@tmp\pgf@circ@res@down}}
\pgfusepath{draw}
\endpgfscope
}
@@ -4232,10 +4311,15 @@
\pgftransformxshift{\pgf@circ@res@left}
\pgf@circ@basicdiodeshape
\endpgfscope
- \pgfpathmoveto{\pgfpoint{0.4\pgf@circ@res@left}{1.3\pgf@circ@res@up}}
+ \ifpgf@zz@straightwhisk
+ \edef\@@tmp{1.0}
+ \else
+ \edef\@@tmp{1.3}
+ \fi
+ \pgfpathmoveto{\pgfpoint{0.4\pgf@circ@res@left}{\@@tmp\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}}
- \pgfpathlineto{\pgfpoint{0.4\pgf@circ@res@right}{1.3\pgf@circ@res@down}}
+ \pgfpathlineto{\pgfpoint{0.4\pgf@circ@res@right}{\@@tmp\pgf@circ@res@down}}
\pgfusepath{draw}
\endpgfscope
}
@@ -4260,10 +4344,15 @@
\pgftransformxshift{\pgf@circ@res@left}
\pgf@circ@fulldiode@triangle@shift
\endpgfscope
- \pgfpathmoveto{\pgfpoint{0.4\pgf@circ@res@left}{1.3\pgf@circ@res@up}}
+ \ifpgf@zz@straightwhisk
+ \edef\@@tmp{1.0}
+ \else
+ \edef\@@tmp{1.3}
+ \fi
+ \pgfpathmoveto{\pgfpoint{0.4\pgf@circ@res@left}{\@@tmp\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}}
- \pgfpathlineto{\pgfpoint{0.4\pgf@circ@res@right}{1.3\pgf@circ@res@down}}
+ \pgfpathlineto{\pgfpoint{0.4\pgf@circ@res@right}{\@@tmp\pgf@circ@res@down}}
\pgfusepath{draw}
}
@@ -4741,6 +4830,8 @@
\pgfcirc@style@to@style{#1 agtobar}{aGTOb#2}
\pgfcirc@node@to@style{l}{emptytriac}{#1 triac}{\circuitikzbasekey/bipole/is strokedsymbol=true}
\pgfcirc@style@to@style{#1 triac}{Tr#2}
+ \pgfcirc@node@to@style{l}{emptytvsdiode}{#1 tvsdiode}{\circuitikzbasekey/bipole/is strokedsymbol=true}
+ \pgfcirc@style@to@style{#1 tvsdiode}{Tr#2}
}
\pgfcirc@tmp@generatestrokeddiodes{stroke}{-}
\def\pgfcircdiodestylemacro{\ifpgf@circuit@strokediode stroke \else\ifpgf@circuit@fulldiode full \else empty \fi\fi}
@@ -6031,6 +6122,13 @@
\ctikzset{bipoles/qpprobe/voltage/additional shift/.initial=.5}
\ctikzset{bipoles/iloop/width/.initial=.40}
\ctikzset{bipoles/iloop/height/.initial=.60}
+% currtap see https://github.com/circuitikz/circuitikz/issues/807
+\ctikzset{bipoles/currtap/height/.initial=0.4}
+\ctikzset{bipoles/currtap/dot size/.initial=0.5}
+\ctikzset{bipoles/currtap/fill/.initial=default}
+\ctikzset{bipoles/currtap/dash/.initial=none}
+\ctikzset{bipoles/currtap/color/.initial=default}
+\ctikzset{bipoles/currtap/thickness/.initial=default}
\ctikzset{bipoles/oscope/height/.initial=.60}
\ctikzset{bipoles/oscope/width/.initial=.60}
@@ -6607,6 +6705,28 @@
\pgfusepath{draw}
\endpgfscope
}
+%% currtap
+\pgfcircdeclarebipolescaled{instruments}
+{
+ \savedmacro{\@@dotsize}{\def\@@dotsize{\ctikzvalof{bipoles/currtap/dot size}}}
+ \anchor{tap}{\northeast\pgf@x=0pt\pgf@y=\@@dotsize\pgf@y\pgf@y=-\pgf@y}
+}
+{\ctikzvalof{bipoles/currtap/height}}
+{currtap}
+{\ctikzvalof{bipoles/currtap/height}}
+{\ctikzvalof{bipoles/currtap/height}}
+{
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
+ \pgfpathlineto{\pgfpoint{0.95\pgf@circ@res@left}{0pt}}
+ \pgfpatharc{180}{0}{0.95\pgf@circ@res@right}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{0pt}}
+ \pgfusepath{draw}
+ \pgf@circ@subset@color@dash{bipoles/currtap}
+ \pgf@circ@subset@thickness{bipoles/currtap}
+ \pgfusepath{draw}
+ \pgfpathcircle{\pgfpoint{0pt}{0pt}}{\@@dotsize*\pgf@circ@res@up}
+ \pgf@circ@subset@fill@or@draw{bipoles/currtap}
+}
% %>>>
% Path definitions for Instruments%<<<
@@ -6619,8 +6739,8 @@
\pgfcirc@activate@bipole@simple{l}{rmeterwa}
\pgfcirc@activate@bipole@simple{l}{smeter}
\pgfcirc@activate@bipole@simple{l}{iloop}
-% \pgfcirc@activate@bipole@simple{l}{iloop2} that was wrong
\pgfcirc@activate@bipole{l}{ilooptwo}{iloop2}{iloop2}
+\pgfcirc@activate@bipole@simple{l}{currtap}
\pgfcirc@activate@bipole@simple{l}{qvprobe}
\pgfcirc@activate@bipole@simple{l}{qiprobe}
\pgfcirc@activate@bipole@simple{l}{qpprobe}
@@ -6774,16 +6894,22 @@
% spring into the damper
\pgfscope
- \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@zero}}
+ \pgfscope
+ \pgftransformationadjustments
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*0.5*\pgflinewidth}{\pgf@circ@res@zero}}
+ \pgfpathlineto{\pgfpoint{.95\pgf@circ@res@left}{\pgf@circ@res@zero}}
\pgfsetcornersarced{\pgfpoint{.25\pgf@circ@res@up}{.25\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{.75\pgf@circ@res@left}{.75\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{.5\pgf@circ@res@left}{-.75\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{.25\pgf@circ@res@left}{.75\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{0pt}{-.75\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{\ctikzvalof{bipoles/damper/length}\pgf@circ@res@right}{.75\pgf@circ@res@up}}
+ \pgfsetbuttcap
+ \pgfsetbeveljoin
\pgfusepath{stroke}
\endpgfscope
+ \endpgfscope
% damper box
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@down}}
@@ -7020,9 +7146,10 @@
%
\ctikzset{bipoles/squid/height/.initial=.60}
\ctikzset{bipoles/squid/width/.initial=.60}
-\ctikzset{bipoles/barrier/height/.initial=.60}
-\ctikzset{bipoles/barrier/width/.initial=.60}
-\ctikzset{bipoles/openbarrier/gap/.initial=0.5}
+\ctikzset{bipoles/barrier/height/.initial=.21}
+\ctikzset{bipoles/barrier/width/.initial=.0}
+\ctikzset{bipoles/openbarrier/width/.initial=.3}
+\ctikzset{bipoles/openbarrier/gap/.initial=1}
\ctikzset{bipoles/thermocouple/height/.initial=.250}
\ctikzset{bipoles/thermocouple/height 2/.initial=.60}
\ctikzset{bipoles/thermocouple/width/.initial=.140}
@@ -7171,18 +7298,18 @@
{\ctikzvalof{bipoles/thermocouple/height}}
{\ctikzvalof{bipoles/thermocouple/width}}
{
+ \pgfsetrectcap
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{.5\pgf@circ@res@down}}
- \pgfusepath{draw}
- \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{.5\pgf@circ@res@down}}
- \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
\pgfpathlineto{\pgfpoint{0}{\pgf@circ@res@down}}
- \pgfusepath{draw}
- \pgfsetlinewidth{\pgfstartlinewidth}
- \pgfpathmoveto{\pgfpoint{0}{\pgf@circ@res@down}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{.5\pgf@circ@res@down}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{0}}
\pgfusepath{draw}
+ \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
+ \pgfsetroundcap
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{.5\pgf@circ@res@down}}
+ \pgfpathlineto{\pgfpoint{0}{\pgf@circ@res@down}}
+ \pgfusepath{draw}
}
%% fuse
\pgfcircdeclarebipolescaled{misc}
@@ -7297,46 +7424,39 @@
{\ctikzvalof{bipoles/barrier/height}}
{\ctikzvalof{bipoles/barrier/width}}
{
- \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
-
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@step}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@step}}
- \pgfpathmoveto{\pgfpoint{0.35*\pgf@circ@res@left}{0.35*\pgf@circ@res@up}}
- \pgfpathlineto{\pgfpoint{0.35*\pgf@circ@res@right}{0.35*\pgf@circ@res@down}}
- \pgfpathmoveto{\pgfpoint{0.35*\pgf@circ@res@left}{0.35*\pgf@circ@res@down}}
- \pgfpathlineto{\pgfpoint{0.35*\pgf@circ@res@right}{0.35*\pgf@circ@res@up}}
-
+ \pgfusepath{draw}
+ \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@down}{\pgf@circ@res@up}}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@up}{\pgf@circ@res@down}}
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@down}{\pgf@circ@res@down}}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@up}{\pgf@circ@res@up}}
\pgfusepath{draw}
}
-%
% open version of the barrier symbol
% suggested by Radványi Patrik Tamás <patrikradvanyi@gmail.com>
-%
\pgfcircdeclarebipolescaled{misc}
{}
{\ctikzvalof{bipoles/barrier/height}}
{openbarrier}
{\ctikzvalof{bipoles/barrier/height}}
-{\ctikzvalof{bipoles/barrier/width}}
+{\ctikzvalof{bipoles/openbarrier/width}}
{
- % this is set with normal wire linewidth
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
\pgfpathlineto{\pgfpoint{\ctikzvalof{bipoles/openbarrier/gap}*\pgf@circ@res@left}{0pt}}
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
\pgfpathlineto{\pgfpoint{\ctikzvalof{bipoles/openbarrier/gap}*\pgf@circ@res@right}{0pt}}
\pgfusepath{draw}
-
- % do the cross part
\pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
-
- \pgfpathmoveto{\pgfpoint{0.35*\pgf@circ@res@left}{0.35*\pgf@circ@res@up}}
- \pgfpathlineto{\pgfpoint{0.35*\pgf@circ@res@right}{0.35*\pgf@circ@res@down}}
- \pgfpathmoveto{\pgfpoint{0.35*\pgf@circ@res@left}{0.35*\pgf@circ@res@down}}
- \pgfpathlineto{\pgfpoint{0.35*\pgf@circ@res@right}{0.35*\pgf@circ@res@up}}
-
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@down}{\pgf@circ@res@up}}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@up}{\pgf@circ@res@down}}
+ \pgfpathmoveto{\pgfpoint{\pgf@circ@res@down}{\pgf@circ@res@down}}
+ \pgfpathlineto{\pgfpoint{\pgf@circ@res@up}{\pgf@circ@res@up}}
\pgfusepath{draw}
}
+
%% Lamp
\pgfcircdeclarebipolescaled{misc}
{}
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex
index e1843d5da8..4d00670a54 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex
index 364c56a414..b620979ec5 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcirclabel.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcirclabel.tex
index a81bfdc6c6..09bae28f18 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcirclabel.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcirclabel.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircmonopoles.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircmonopoles.tex
index 84fa6c6d1e..77b6edc904 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircmonopoles.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircmonopoles.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -49,6 +49,7 @@
\ctikzset{monopoles/dinantenna/width/.initial=.2}
\ctikzset{monopoles/dinantenna/height/.initial=.6}
\ctikzset{monopoles/waves/width/.initial=0.5}%
+\ctikzset{monopoles/harmonics/width/.initial=0.5}%
%>>>
%% Node shapes for grounds and power supply%<<<
@@ -617,6 +618,56 @@
}
}
+\pgfdeclareshape{harmonics}{
+ \savedmacro{\ctikzclass}{\edef\ctikzclass{RF}}
+ \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}}
+ \anchor{center}{\pgfpointorigin}
+ \savedanchor{\northeast}{
+ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}
+ \pgf@circ@res@step=\ctikzvalof{monopoles/harmonics/width}\pgf@circ@scaled@Rlen
+ \pgf@x=\pgf@circ@res@step
+ \pgf@y=\pgf@circ@res@step
+ }
+ \anchor{text}{
+ \northeast
+ \pgf@y=\dimexpr\pgf@y+.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax
+ }
+ \anchor{top}{\northeast\pgf@x=0pt}
+ \anchor{right}{\northeast\pgf@y=0pt}
+ \anchor{left}{\northeast\pgf@x=-\pgf@x\pgf@y=0pt}
+ \anchor{bottom}{\northeast\pgf@y=-\pgf@y\pgf@x=0pt}
+ \anchor{north}{\northeast\pgf@x=0pt}
+ \anchor{north east}{\northeast}
+ \anchor{east}{\northeast\pgf@y=0pt}
+ \anchor{south east}{\northeast\pgf@y=-\pgf@y}
+ \anchor{south}{\northeast\pgf@y=-\pgf@y\pgf@x=0pt}
+ \anchor{south west}{\northeast\pgf@y=-\pgf@y\pgf@x=-\pgf@x}
+ \anchor{west}{\northeast\pgf@x=-\pgf@x\pgf@y=0pt}
+ \anchor{north west}{\northeast\pgf@x=-\pgf@x}
+ \pgf@circ@draw@component{
+ \pgf@circ@scaled@Rlen=\scaledRlen
+ \pgf@circ@res@step=\ctikzvalof{monopoles/waves/width}\pgf@circ@scaled@Rlen
+ \pgf@circ@res@step=0.5\pgf@circ@res@step
+ \pgf@circ@setcolor
+ \pgfscope
+ % define a triangle for clipping the waves
+ \pgfpathmoveto{\pgfpoint{-2\pgf@circ@res@step}{0pt}}
+ \pgfpathlineto{\pgfpoint{2.1\pgf@circ@res@step}{1\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{2.1\pgf@circ@res@step}{-1\pgf@circ@res@step}}
+ \pgfpathclose
+ \pgfusepath{clip}
+ % ...and build the waves as clipped circles
+ \c@pgf@counta=32\pgf@circ@res@other=0.125\pgf@circ@res@step
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>1
+ \pgfpathcircle{\pgfpoint{-2\pgf@circ@res@step}{0pt}}{\the\c@pgf@counta*\pgf@circ@res@other}
+ \advance\c@pgf@counta-1\relax%
+ \repeatpgfmathloop
+ \pgfusepath{draw}
+ \endpgfscope
+ }
+}
+
% the four types of antennas: simple, din, TX, RX. Notice that you can flip them...
%
\pgfdeclareshape{bareantenna}{
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircmultipoles.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircmultipoles.tex
index e403a53fa6..5f98f3b91b 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircmultipoles.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircmultipoles.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
index e3665b8862..7d94de4959 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -231,13 +231,15 @@
\compattikzset{#2/.style={\comnpatname #1, #3={##1}}}%
}
% create a bipole
-\def\pgfcirc@activate@bipole#1#2#3#4{% path name, base node name, style name
+\def\pgfcirc@activate@bipole#1#2#3#4{% type of label, path name, base node name, style name
+ % \typeout{Activate bipole:\space #4,}
\expandafter\def\csname pgf@circ@#2@path\endcsname##1{\pgf@circ@bipole@path{#3}{##1}}%
\pgfcirc@path@to@style{#1}{#2}{#4}{}% no options here, let's see
}
\def\pgfcirc@activate@bipole@simple#1#2{\pgfcirc@activate@bipole{#1}{#2}{#2}{#2}}
% create a bipole with options
-\def\pgfcirc@activate@bipole@opt#1#2#3#4#5{% path name, base node name, style name
+\def\pgfcirc@activate@bipole@opt#1#2#3#4#5{% type of label, path name, base node name, style name, options
+ % \typeout{Activate bipole:\space #4,}
\expandafter\def\csname pgf@circ@#2@path\endcsname##1{\pgf@circ@bipole@path{#3}{##1}}%
\pgfcirc@path@to@style{#1}{#2}{#4}{#5}% no options here, let's see
}
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircquadpoles.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircquadpoles.tex
index 2cc6e461aa..cca01b5bee 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircquadpoles.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircquadpoles.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -544,6 +544,11 @@
\ctikzset{bipoles/lowpass/width/.initial=.7}
\ctikzset{bipoles/lowpass2/width/.initial=.7}
\ctikzset{bipoles/allpass/width/.initial=.7}
+\ctikzset{bipoles/vallpass/width/.initial=.7}
+\ctikzset{bipoles/bgenerator/width/.initial=.7}
+\ctikzset{bipoles/qgenerator/width/.initial=.7}
+\ctikzset{bipoles/cgenerator/width/.initial=.7}
+\ctikzset{bipoles/ngenerator/width/.initial=.7}
\ctikzset{bipoles/adc/width/.initial=.7}
\ctikzset{bipoles/dac/width/.initial=.7}
\ctikzset{bipoles/dsp/width/.initial=.7}
@@ -557,10 +562,26 @@
\ctikzset{bipoles/vtattenuator/width/.initial=.7}
\ctikzset{bipoles/phaseshifter/width/.initial=.7}
\ctikzset{bipoles/vphaseshifter/width/.initial=.7}
+\ctikzset{bipoles/biast/width/.initial=.7}
+\ctikzset{bipoles/sinetable/width/.initial=.7}
+\ctikzset{bipoles/register/width/.initial=.7}
\ctikzset{bipoles/detector/width/.initial=.7}
\ctikzset{bipoles/saturation/width/.initial=.7}
\ctikzset{bipoles/sigmoid/width/.initial=.7}
\ctikzset{bipoles/allornothing/width/.initial=.7}
+
+\ctikzset{bipoles/camera/height/.initial=1.2}
+\ctikzset{bipoles/camera/depth/.initial=.3}
+\ctikzset{bipoles/camera/width/.initial=.4}
+\ctikzset{bipoles/tvset/width/.initial=0.6}
+\ctikzset{bipoles/tvset/height/.initial=.4}
+\ctikzset{bipoles/trx/width/.initial=1}
+\ctikzset{bipoles/trx/height/.initial=.4}
+\ctikzset{bipoles/swr/width/.initial=0.6}
+\ctikzset{bipoles/swr/height/.initial=.4}
+\ctikzset{bipoles/power/width/.initial=1}
+\ctikzset{bipoles/power/height/.initial=.4}
+
\ctikzset{tripoles/mixer/width/.initial=0.7}
\ctikzset{tripoles/adder/width/.initial=0.7}
\ctikzset{tripoles/circulator/width/.initial=.7}
@@ -719,6 +740,19 @@
\endpgfscope
}
%
+\def\pgfcirc@twoport@draw@narrowsine#1{% #1 -> y shift
+ \pgfscope
+ \pgfsetlinewidth{\pgfstartlinewidth}
+ \pgftransformyshift{#1\pgf@circ@res@step}
+ \pgfpathmoveto{\pgfpoint{.125\pgf@circ@res@step}{0\pgf@circ@res@step}}
+ \pgfpathsine{\pgfpoint{.125\pgf@circ@res@step}{.125\pgf@circ@res@step}}
+ \pgfpathcosine{\pgfpoint{.125\pgf@circ@res@step}{-.125\pgf@circ@res@step}}
+ \pgfpathsine{\pgfpoint{.125\pgf@circ@res@step}{-.125\pgf@circ@res@step}}
+ \pgfpathcosine{\pgfpoint{.125\pgf@circ@res@step}{.125\pgf@circ@res@step}}
+ \pgfusepath{draw}
+ \endpgfscope
+}
+%
\def\pgfcirc@twoport@draw@splitline{%
\pgfscope
\pgfcirc@twoport@maybedash
@@ -889,6 +923,90 @@
\pgfcirc@twoport@draw@sine{0.0}{0}
\pgfcirc@twoport@draw@sine{-0.5}{0}
}
+%% variable allpass filter
+\pgfcirc@define@twoports{blocks}
+{}
+{\ctikzvalof{bipoles/vallpass/width}}
+{vallpass}
+{\ctikzvalof{bipoles/vallpass/width}}
+{\ctikzvalof{bipoles/vallpass/width}}
+{
+ \pgfcirc@twoport@draw@sine{0.5}{0}
+ \pgfcirc@twoport@draw@sine{0.0}{0}
+ \pgfcirc@twoport@draw@sine{-0.5}{0}
+ \pgfcirc@set@arrows{tunable}{}{latex}
+ \pgfpathmoveto{\pgfpoint{0.7\pgf@circ@res@left}{0.5\pgf@circ@res@down}}
+ \pgfpathlineto{\pgfpoint{0.7\pgf@circ@res@right}{0.8\pgf@circ@res@up}}
+ \pgfusepath{draw}
+}
+%% Block Generator
+\pgfcirc@define@twoports{blocks}
+{}
+{\ctikzvalof{bipoles/bgenerator/width}}
+{bgenerator}
+{\ctikzvalof{bipoles/bgenerator/width}}
+{\ctikzvalof{bipoles/bgenerator/width}}
+{
+ \pgfcirc@twoport@draw@narrowsine{0.25}
+ \pgfcirc@twoport@draw@narrowsine{0.0}
+ \pgfcirc@twoport@draw@narrowsine{-0.25}
+ \pgftext[x=0.45\pgf@circ@res@left]{\ctikzvalof{bipoles/twoport/text}}
+}
+%% Crystal Generator
+\pgfcirc@define@twoports{blocks}
+{}
+{\ctikzvalof{bipoles/qgenerator/width}}
+{qgenerator}
+{\ctikzvalof{bipoles/qgenerator/width}}
+{\ctikzvalof{bipoles/qgenerator/width}}
+{
+ \pgfcirc@twoport@draw@narrowsine{0.45}
+ \pgfcirc@twoport@draw@narrowsine{0.20}
+ \pgfcirc@twoport@draw@narrowsine{-0.05}
+ \pgftext[x=0.45\pgf@circ@res@left,y=0.25\pgf@circ@res@up]{\ctikzvalof{bipoles/twoport/text}}
+ \pgfpathlineto{\pgfpoint{-0.7\pgf@circ@res@step}{-0.4\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{ 0.7\pgf@circ@res@step}{-0.4\pgf@circ@res@step}}
+ \pgfusepath{draw}
+ \pgfpathrectangle{\pgfpoint{-0.7\pgf@circ@res@step}{-0.7\pgf@circ@res@step}}
+ {\pgfpoint{1.4\pgf@circ@res@step}{0.2\pgf@circ@res@step}}
+ \pgfusepath{draw}
+ \pgfpathmoveto{\pgfpoint{-0.7\pgf@circ@res@step}{-0.8\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{ 0.7\pgf@circ@res@step}{-0.8\pgf@circ@res@step}}
+ \pgfpathmoveto{\pgfpoint{-0.7\pgf@circ@res@step}{-0.4\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{ 0.7\pgf@circ@res@step}{-0.4\pgf@circ@res@step}}
+ \pgfusepath{draw}
+}
+%% Clock generator
+\pgfcirc@define@twoports{blocks}
+{}
+{\ctikzvalof{bipoles/cgenerator/width}}
+{cgenerator}
+{\ctikzvalof{bipoles/cgenerator/width}}
+{\ctikzvalof{bipoles/cgenerator/width}}
+{
+ \pgfpathmoveto{\pgfpoint{-0.70\pgf@circ@res@step}{-0.35\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.42\pgf@circ@res@step}{-0.35\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.42\pgf@circ@res@step}{+0.35\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.14\pgf@circ@res@step}{+0.35\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.14\pgf@circ@res@step}{-0.35\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{+0.14\pgf@circ@res@step}{-0.35\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{+0.14\pgf@circ@res@step}{+0.35\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{+0.42\pgf@circ@res@step}{+0.35\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{+0.42\pgf@circ@res@step}{-0.35\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{+0.70\pgf@circ@res@step}{-0.35\pgf@circ@res@step}}
+ \pgfusepath{draw}
+}
+%% Generic generator
+\pgfcirc@define@twoports{blocks}
+{}
+{\ctikzvalof{bipoles/ngenerator/width}}
+{ngenerator}
+{\ctikzvalof{bipoles/ngenerator/width}}
+{\ctikzvalof{bipoles/ngenerator/width}}
+{
+ \pgfcirc@twoport@draw@sine{0.5}{0}
+ \pgftext[y=-0.35\pgf@circ@res@up]{\ctikzvalof{bipoles/twoport/text}}
+}
%% ADC
\pgfcirc@define@twoports{blocks}
{}
@@ -1056,6 +1174,89 @@
\pgf@circ@text@strokecolor
\pgftext[center,x=0,y=0]{\Large$\varphi$}
}
+%% BIAS-T
+\pgfcirc@define@twoports{blocks}
+{}
+{\ctikzvalof{bipoles/biast/width}}
+{biast}
+{\ctikzvalof{bipoles/biast/width}}
+{\ctikzvalof{bipoles/biast/width}}
+{
+ \pgfpathmoveto{\pgfpoint{-0.80\pgf@circ@res@step}{-0.50\pgf@circ@res@step}} % Line to Plate 1
+ \pgfpathlineto{\pgfpoint{-0.50\pgf@circ@res@step}{-0.50\pgf@circ@res@step}}
+ \pgfpathmoveto{\pgfpoint{-0.50\pgf@circ@res@step}{-0.50\pgf@circ@res@step}} % Plate 1
+ \pgfpathlineto{\pgfpoint{-0.50\pgf@circ@res@step}{-0.20\pgf@circ@res@step}}
+ \pgfpathmoveto{\pgfpoint{-0.50\pgf@circ@res@step}{-0.50\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.50\pgf@circ@res@step}{-0.80\pgf@circ@res@step}}
+ \pgfpathmoveto{\pgfpoint{-0.30\pgf@circ@res@step}{-0.50\pgf@circ@res@step}} % Plate 1
+ \pgfpathlineto{\pgfpoint{-0.30\pgf@circ@res@step}{-0.20\pgf@circ@res@step}}
+ \pgfpathmoveto{\pgfpoint{-0.30\pgf@circ@res@step}{-0.50\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.30\pgf@circ@res@step}{-0.80\pgf@circ@res@step}}
+ \pgfpathmoveto{\pgfpoint{-0.30\pgf@circ@res@step}{-0.50\pgf@circ@res@step}} % Line to Center
+ \pgfpathlineto{\pgfpoint{ 0.00\pgf@circ@res@step}{-0.50\pgf@circ@res@step}}
+ \pgfusepath{draw}
+ \pgfpathcircle{\pgfpoint{ 0.00\pgf@circ@res@step}{-0.50\pgf@circ@res@step}}{0.075\pgf@circ@res@step}
+ \pgfusepath{fill}
+ \pgfpathmoveto{\pgfpoint{ 0.00\pgf@circ@res@step}{-0.50\pgf@circ@res@step}} % Line to Right
+ \pgfpathlineto{\pgfpoint{ 0.80\pgf@circ@res@step}{-0.50\pgf@circ@res@step}}
+ \pgfusepath{draw}
+ \pgfpathmoveto{\pgfpoint{ 0.00\pgf@circ@res@step}{-0.50\pgf@circ@res@step}} % Line to Coils
+ \pgfpathlineto{\pgfpoint{ 0.00\pgf@circ@res@step}{-0.20\pgf@circ@res@step}}
+ \pgfusepath{draw}
+ \pgfpathmoveto{\pgfpoint{ 0.00\pgf@circ@res@step}{-0.20\pgf@circ@res@step}} % Arc1
+ \pgfpatharc{-90}{90}{0.09\pgf@circ@res@step}
+ \pgfpathmoveto{\pgfpoint{ 0.00\pgf@circ@res@step}{-0.02\pgf@circ@res@step}} % Arc2
+ \pgfpatharc{-90}{90}{0.09\pgf@circ@res@step}
+ \pgfpathmoveto{\pgfpoint{ 0.00\pgf@circ@res@step}{+0.16\pgf@circ@res@step}} % Arc3
+ \pgfpatharc{-90}{90}{0.09\pgf@circ@res@step}
+ \pgfpathmoveto{\pgfpoint{ 0.00\pgf@circ@res@step}{+0.36\pgf@circ@res@step}} % Arc4
+ \pgfpatharc{-90}{90}{0.09\pgf@circ@res@step}
+ \pgfusepath{draw}
+ \pgfpathmoveto{\pgfpoint{ 0.00\pgf@circ@res@step}{+0.52\pgf@circ@res@step}} % Line to Coils
+ \pgfpathlineto{\pgfpoint{ 0.00\pgf@circ@res@step}{+0.80\pgf@circ@res@step}}
+ \pgfusepath{draw}
+}
+%% Sine table
+\pgfcirc@define@twoports{blocks}
+{}
+{\ctikzvalof{bipoles/sinetable/width}}
+{sinetable}
+{\ctikzvalof{bipoles/sinetable/width}}
+{\ctikzvalof{bipoles/sinetable/width}}
+{
+ \pgfcirc@twoport@draw@sine{0.0}{0}
+ \pgfcirc@set@arrows{tunable}{}{latex}
+ \pgfpathmoveto{\pgfpoint{-0.70\pgf@circ@res@step}{-0.70\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{+0.70\pgf@circ@res@step}{-0.70\pgf@circ@res@step}}
+ \pgfusepath{draw}
+ \pgfpathmoveto{\pgfpoint{-0.70\pgf@circ@res@step}{-0.70\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.70\pgf@circ@res@step}{+0.70\pgf@circ@res@step}}
+ \pgfusepath{draw}
+}
+%% Register
+\pgfcirc@define@twoports{blocks}
+{
+ \savedanchor\northwest{
+ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}
+ \pgf@y=\ctikzvalof{bipoles/twoport/width}\pgf@circ@scaled@Rlen
+ \pgf@y=.5\pgf@y
+ \pgf@x=-\ctikzvalof{bipoles/twoport/width}\pgf@circ@scaled@Rlen
+ \pgf@x=.5\pgf@x
+ }
+ \anchor{clk}{\northwest\pgf@y=0.5\pgf@y}
+}
+{\ctikzvalof{bipoles/register/width}}
+{register}
+{\ctikzvalof{bipoles/register/width}}
+{\ctikzvalof{bipoles/register/width}}
+{
+ \pgfpathmoveto{\pgfpoint{-1.00\pgf@circ@res@step}{+0.70\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.60\pgf@circ@res@step}{+0.50\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-1.00\pgf@circ@res@step}{+0.30\pgf@circ@res@step}}
+ \pgfusepath{draw}
+ \pgf@circ@text@strokecolor
+ \pgftext[center,x=0,y=0]{\ctikzvalof{bipoles/twoport/text}}
+}
%% detector
\pgfcirc@define@twoports@norotate{blocks}
{}
@@ -1130,6 +1331,139 @@
\pgfpathlineto{\pgfpoint{0.55\pgf@circ@res@step}{.4\pgf@circ@res@step}}
\pgfusepath{draw}
}
+
+%% Camera:
+\pgfcircdeclarebipolescaled{misc}
+{}
+{\ctikzvalof{bipoles/camera/depth}}
+{camera}
+{\ctikzvalof{bipoles/camera/height}}
+{\ctikzvalof{bipoles/camera/width}}{
+ \pgfpathrectanglecorners{\pgfpoint{\pgf@circ@res@left}{.7\pgf@circ@res@up}}
+ {\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down}}
+ \pgfpathmoveto{\pgfpoint{0.5\pgf@circ@res@left}{.7\pgf@circ@res@up}}
+ \pgfpathlineto{\pgfpoint{0.8\pgf@circ@res@left}{\pgf@circ@res@up}}
+ \pgfpathlineto{\pgfpoint{0.8\pgf@circ@res@right}{\pgf@circ@res@up}}
+ \pgfpathlineto{\pgfpoint{0.5\pgf@circ@res@right}{.7\pgf@circ@res@up}}
+ \pgfpathclose
+ \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
+ \pgf@circ@draworfill
+}
+
+% TV:
+\pgfcirc@define@twoports{blocks}
+{}
+{\ctikzvalof{bipoles/tvset/height}}
+{tvset}
+{\ctikzvalof{bipoles/tvset/height}}
+{\ctikzvalof{bipoles/tvset/width}}
+{
+ \pgfsetlinewidth{2\pgflinewidth} % double in size
+ % Legs
+ \pgfpathmoveto{\pgfpoint{+0.60\pgf@circ@res@step}{-1.10\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{+0.30\pgf@circ@res@step}{-0.70\pgf@circ@res@step}}
+ \pgfusepath{draw}
+ %
+ \pgfpathmoveto{\pgfpoint{-0.60\pgf@circ@res@step}{-1.10\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.30\pgf@circ@res@step}{-0.70\pgf@circ@res@step}}
+ \pgfusepath{draw}
+}
+
+% Transceiver (TRX)
+\pgfcirc@define@twoports{blocks}
+{
+ \anchor{plus}{\northeast \advance\pgf@y by -0.2\pgf@x\pgf@x=-\pgf@x}
+ \anchor{minus}{\northeast \advance\pgf@y by -0.2\pgf@x\pgf@x=-\pgf@x\pgf@y=-\pgf@y}
+}
+{\ctikzvalof{bipoles/trx/height}}
+{trx}
+{\ctikzvalof{bipoles/trx/height}}
+{\ctikzvalof{bipoles/trx/width}}
+{
+ % VFO-Wheel:
+ \pgfpathcircle{\pgfpoint{0.60\pgf@circ@res@step}{0.00\pgf@circ@res@step}}{0.25\pgf@circ@res@step}
+ \pgfpathcircle{\pgfpoint{0.68\pgf@circ@res@step}{0.10\pgf@circ@res@step}}{0.06\pgf@circ@res@step}
+ % Volume and Squelch:
+ \pgfpathcircle{\pgfpoint{-0.8\pgf@circ@res@step}{+0.15\pgf@circ@res@step}}{0.1\pgf@circ@res@step}
+ \pgfpathcircle{\pgfpoint{-0.8\pgf@circ@res@step}{-0.15\pgf@circ@res@step}}{0.1\pgf@circ@res@step}
+ % Display:
+ \pgfpathrectangle{\pgfpoint{-0.55\pgf@circ@res@step}{-0.25\pgf@circ@res@step}}
+ {\pgfpoint{+0.75\pgf@circ@res@step}{+0.5\pgf@circ@res@step}}%
+ \pgfusepath{draw}
+}
+% Standing Wave Ratio (SWR) Meter
+\pgfcirc@define@twoports{blocks}
+{}
+{\ctikzvalof{bipoles/swr/height}}
+{swr}
+{\ctikzvalof{bipoles/swr/height}}
+{\ctikzvalof{bipoles/swr/width}}
+{
+ % Screen:
+ \pgfscope
+ \pgfsetstrokecolor{gray}\pgfsetdash{{1.5pt}{1pt}}{0pt}
+ \pgfpathmoveto{\pgfpoint{-0.5\pgf@circ@res@step}{-0.25\pgf@circ@res@step}}
+ \pgfpatharc{160}{110}{1.1\pgf@circ@res@step}
+ \pgfpathmoveto{\pgfpoint{0.5\pgf@circ@res@step}{-0.25\pgf@circ@res@step}}
+ \pgfpatharc{-160}{-110}{-1.1\pgf@circ@res@step}
+ \pgfusepath{draw}
+ \endpgfscope
+ \pgfpathmoveto{\pgfpoint{-0.7\pgf@circ@res@step}{0.5\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{0.7\pgf@circ@res@step}{0.5\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{0.7\pgf@circ@res@step}{-0.2\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{0pt}{-0.4\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.7\pgf@circ@res@step}{-0.2\pgf@circ@res@step}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{-0.35\pgf@circ@res@step}{-0.3\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{0.3\pgf@circ@res@step}{0.3\pgf@circ@res@step}}
+ \pgfpathmoveto{\pgfpoint{0.35\pgf@circ@res@step}{-0.3\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.3\pgf@circ@res@step}{0.3\pgf@circ@res@step}}
+ \pgfusepath{draw}
+}
+% Power supply
+\pgfcirc@define@twoports{blocks}
+{
+ \anchor{u1}{\northeast \advance\pgf@y by -0.2\pgf@x\pgf@x=-\pgf@x}
+ \anchor{u2}{\northeast \advance\pgf@y by -0.2\pgf@x\pgf@x=-\pgf@x\pgf@y=-\pgf@y}
+ \anchor{plus}{\northeast \advance\pgf@y by -0.2\pgf@x \advance\pgf@x by -0.25\pgf@x}
+ \anchor{minus}{\northeast \advance\pgf@y by -0.2\pgf@x\pgf@y=-\pgf@y \advance\pgf@x by -0.25\pgf@x}
+}
+{\ctikzvalof{bipoles/power/height}}
+{power}
+{\ctikzvalof{bipoles/power/height}}
+{\ctikzvalof{bipoles/power/width}}
+{
+ % Plus:
+ \color{red}
+ \pgfsetstrokecolor{red}
+ \pgfpathcircle{\pgfpoint{0.75\pgf@circ@res@step}{0.20\pgf@circ@res@step}}{0.075\pgf@circ@res@step}%
+ \pgfusepath{fill}
+ \pgfpathmoveto{\pgfpoint{0.50\pgf@circ@res@step}{0.20\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{0.60\pgf@circ@res@step}{0.20\pgf@circ@res@step}}
+ \pgfpathmoveto{\pgfpoint{0.55\pgf@circ@res@step}{0.25\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{0.55\pgf@circ@res@step}{0.15\pgf@circ@res@step}}
+ \pgfusepath{stroke}
+ % Minus:
+ \color{black}
+ \pgfsetstrokecolor{black}
+ \pgfpathcircle{\pgfpoint{0.75\pgf@circ@res@step}{-0.20\pgf@circ@res@step}}{0.075\pgf@circ@res@step}%
+ \pgfusepath{fill}
+ \pgfpathmoveto{\pgfpoint{0.50\pgf@circ@res@step}{-0.20\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{0.60\pgf@circ@res@step}{-0.20\pgf@circ@res@step}}
+ \pgfusepath{stroke}
+ % Displays:
+ \pgfpathrectangle{\pgfpoint{-0.5\pgf@circ@res@step}{0.00\pgf@circ@res@step}}{\pgfpoint{+0.4\pgf@circ@res@step}{+0.25\pgf@circ@res@step}}%
+ \pgfpathrectangle{\pgfpoint{-0.0\pgf@circ@res@step}{0.00\pgf@circ@res@step}}{\pgfpoint{+0.4\pgf@circ@res@step}{+0.25\pgf@circ@res@step}}%
+ % Poti:
+ \pgfpathcircle{\pgfpoint{-0.30\pgf@circ@res@step}{-0.20\pgf@circ@res@step}}{0.075\pgf@circ@res@step}%
+ \pgfusepath{draw}
+ % Switch:
+ \pgfpathrectangle{\pgfpoint{-0.9\pgf@circ@res@step}{0.00\pgf@circ@res@step}}{\pgfpoint{+0.15\pgf@circ@res@step}{+0.25\pgf@circ@res@step}}%
+ \pgfpathmoveto{\pgfpoint{-0.90\pgf@circ@res@step}{0.125\pgf@circ@res@step}}
+ \pgfpathlineto{\pgfpoint{-0.75\pgf@circ@res@step}{0.125\pgf@circ@res@step}}
+ \pgfusepath{draw}
+}
+
%% converters help function
%% definition for styling the DC symbols (GitHub issue #680)
\ctikzset{blocks dc in segments/.initial=1}
@@ -1574,6 +1908,11 @@
\pgfcirc@activate@bipole@simple{l}{lowpass}
\pgfcirc@activate@bipole@simple{l}{lowpass2}
\pgfcirc@activate@bipole@simple{l}{allpass}
+\pgfcirc@activate@bipole@simple{l}{vallpass}
+\pgfcirc@activate@bipole@simple{l}{bgenerator}
+\pgfcirc@activate@bipole@simple{l}{qgenerator}
+\pgfcirc@activate@bipole@simple{l}{cgenerator}
+\pgfcirc@activate@bipole@simple{l}{ngenerator}
\pgfcirc@activate@bipole@simple{l}{adc}
\pgfcirc@activate@bipole@simple{l}{dac}
\pgfcirc@activate@bipole@simple{l}{dsp}
@@ -1587,10 +1926,18 @@
\pgfcirc@activate@bipole@simple{l}{vtattenuator}
\pgfcirc@activate@bipole@simple{l}{phaseshifter}
\pgfcirc@activate@bipole@simple{l}{vphaseshifter}
+\pgfcirc@activate@bipole@simple{l}{biast}
+\pgfcirc@activate@bipole@simple{l}{sinetable}
+\pgfcirc@activate@bipole@simple{l}{register}
\pgfcirc@activate@bipole@simple{l}{detector}
\pgfcirc@activate@bipole@simple{l}{saturation}
\pgfcirc@activate@bipole@simple{l}{sigmoid}
\pgfcirc@activate@bipole@simple{l}{allornothing}
+\pgfcirc@activate@bipole@simple{l}{camera}
+\pgfcirc@activate@bipole@simple{l}{tvset}
+\pgfcirc@activate@bipole@simple{l}{trx}
+\pgfcirc@activate@bipole@simple{l}{swr}
+\pgfcirc@activate@bipole@simple{l}{power}
\pgfcirc@activate@bipole@simple{l}{fiber}
\pgfcirc@activate@bipole@simple{l}{sacdc}
\pgfcirc@activate@bipole@simple{l}{sdcac}
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircshapes.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircshapes.tex
index f633ba1c5b..b402557279 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircshapes.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircshapes.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
index d8d089dd92..85995946f3 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircutils.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircutils.tex
index 08535b7bc0..caf50139cd 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircutils.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircutils.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
index e041b3b524..f797ce312b 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -192,12 +192,14 @@
\pgfmathsetlength{\absvshift}{\absvshift+sign(\absvshift)*height{"Q"}} % with the current font.
\fi
% apply the same shift to open "straight" voltage as raised
- \ifpgf@circuit@bipole@voltage@straight
- \ifx\@@kind\@@open
- \def\pgf@circ@bipole@voltage@label@anchor{center}
- \pgfmathsetlength{\absvshift}{\absvshift+sign(\absvshift)*height{"Q"}} % with the current font.
- \fi
- \fi
+ % commented out due to https://github.com/circuitikz/circuitikz/issues/821
+ % but I'm not sure if it's correct
+ % \ifpgf@circuit@bipole@voltage@straight
+ % \ifx\@@kind\@@open
+ % \def\pgf@circ@bipole@voltage@label@anchor{center}
+ % \pgfmathsetlength{\absvshift}{\absvshift+sign(\absvshift)*height{"Q"}} % with the current font.
+ % \fi
+ % \fi
}
% %\pgf@circ@Rlen/\ctikzvalof{current arrow scale} is equal to the length of the currarrow
%absolute move, minimum space is length of arrowhead
diff --git a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.0.tex b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.0.tex
index 9f955a4654..45433f03e1 100644
--- a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.0.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.0.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -31,10 +31,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirc.defines
%%%---------- open: tex/pgfcirc.defines.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -1993,10 +1993,10 @@
%%%---------- close: tex/pgfcirc.defines
%%%%%%%%%%% Springe nach tex/pgfcircutils
%%%---------- open: tex/pgfcircutils.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2065,10 +2065,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircshapes
%%%---------- open: tex/pgfcircshapes.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2871,10 +2871,10 @@
%%%---------- close: tex/pgfcircshapes
%%%%%%%%%%% Springe nach tex/pgfcircmonopoles
%%%---------- open: tex/pgfcircmonopoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -3887,10 +3887,10 @@
%%%---------- close: tex/pgfcircmonopoles
%%%%%%%%%%% Springe nach tex/pgfcircbipoles
%%%---------- open: tex/pgfcircbipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -8991,10 +8991,10 @@
%%%---------- close: tex/pgfcircbipoles
%%%%%%%%%%% Springe nach tex/pgfcirctripoles
%%%---------- open: tex/pgfcirctripoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -14699,10 +14699,10 @@
%%%---------- close: tex/pgfcirctripoles
%%%%%%%%%%% Springe nach tex/pgfcircquadpoles
%%%---------- open: tex/pgfcircquadpoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -15850,10 +15850,10 @@
%%%---------- close: tex/pgfcircquadpoles
%%%%%%%%%%% Springe nach tex/pgfcircmultipoles
%%%---------- open: tex/pgfcircmultipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -17628,10 +17628,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirclabel
%%%---------- open: tex/pgfcirclabel.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -17997,10 +17997,10 @@
%%%---------- close: tex/pgfcirclabel
%%%%%%%%%%% Springe nach tex/pgfcircvoltage
%%%---------- open: tex/pgfcircvoltage.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -18496,10 +18496,10 @@
%%%---------- close: tex/pgfcircvoltage
%%%%%%%%%%% Springe nach tex/pgfcirccurrent
%%%---------- open: tex/pgfcirccurrent.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -18711,10 +18711,10 @@
%%%---------- close: tex/pgfcirccurrent
%%%%%%%%%%% Springe nach tex/pgfcircflow
%%%---------- open: tex/pgfcircflow.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -19008,10 +19008,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircpath
%%%---------- open: tex/pgfcircpath.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.1.2.tex b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.1.2.tex
index ea2d3e5b14..aedc4b598d 100644
--- a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.1.2.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.1.2.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -32,10 +32,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirc.defines
%%%---------- open: tex/pgfcirc.defines.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2138,10 +2138,10 @@
%%%---------- close: tex/pgfcirc.defines
%%%%%%%%%%% Springe nach tex/pgfcircutils
%%%---------- open: tex/pgfcircutils.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2224,10 +2224,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircshapes
%%%---------- open: tex/pgfcircshapes.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -3030,10 +3030,10 @@
%%%---------- close: tex/pgfcircshapes
%%%%%%%%%%% Springe nach tex/pgfcircmonopoles
%%%---------- open: tex/pgfcircmonopoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -4046,10 +4046,10 @@
%%%---------- close: tex/pgfcircmonopoles
%%%%%%%%%%% Springe nach tex/pgfcircbipoles
%%%---------- open: tex/pgfcircbipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -9943,10 +9943,10 @@
%%%---------- close: tex/pgfcircbipoles
%%%%%%%%%%% Springe nach tex/pgfcirctripoles
%%%---------- open: tex/pgfcirctripoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -15850,10 +15850,10 @@
%%%---------- close: tex/pgfcirctripoles
%%%%%%%%%%% Springe nach tex/pgfcircquadpoles
%%%---------- open: tex/pgfcircquadpoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -17137,10 +17137,10 @@
%%%---------- close: tex/pgfcircquadpoles
%%%%%%%%%%% Springe nach tex/pgfcircmultipoles
%%%---------- open: tex/pgfcircmultipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -19831,10 +19831,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirclabel
%%%---------- open: tex/pgfcirclabel.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -20200,10 +20200,10 @@
%%%---------- close: tex/pgfcirclabel
%%%%%%%%%%% Springe nach tex/pgfcircvoltage
%%%---------- open: tex/pgfcircvoltage.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -20749,10 +20749,10 @@
%%%---------- close: tex/pgfcircvoltage
%%%%%%%%%%% Springe nach tex/pgfcirccurrent
%%%---------- open: tex/pgfcirccurrent.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -20964,10 +20964,10 @@
%%%---------- close: tex/pgfcirccurrent
%%%%%%%%%%% Springe nach tex/pgfcircflow
%%%---------- open: tex/pgfcircflow.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -21261,10 +21261,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircpath
%%%---------- open: tex/pgfcircpath.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.2.7.tex b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.2.7.tex
index 52008ac993..9def87d0ae 100644
--- a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.2.7.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.2.7.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -32,10 +32,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirc.defines
%%%---------- open: tex/pgfcirc.defines.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2353,10 +2353,10 @@
%%%---------- close: tex/pgfcirc.defines
%%%%%%%%%%% Springe nach tex/pgfcircutils
%%%---------- open: tex/pgfcircutils.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2448,10 +2448,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircshapes
%%%---------- open: tex/pgfcircshapes.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -3260,10 +3260,10 @@
%%%---------- close: tex/pgfcircshapes
%%%%%%%%%%% Springe nach tex/pgfcircmonopoles
%%%---------- open: tex/pgfcircmonopoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -4362,10 +4362,10 @@
%%%---------- close: tex/pgfcircmonopoles
%%%%%%%%%%% Springe nach tex/pgfcircbipoles
%%%---------- open: tex/pgfcircbipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -10525,10 +10525,10 @@
%%%---------- close: tex/pgfcircbipoles
%%%%%%%%%%% Springe nach tex/pgfcirctripoles
%%%---------- open: tex/pgfcirctripoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -16959,10 +16959,10 @@
%%%---------- close: tex/pgfcirctripoles
%%%%%%%%%%% Springe nach tex/pgfcircquadpoles
%%%---------- open: tex/pgfcircquadpoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -18705,10 +18705,10 @@
%%%---------- close: tex/pgfcircquadpoles
%%%%%%%%%%% Springe nach tex/pgfcircmultipoles
%%%---------- open: tex/pgfcircmultipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -21736,10 +21736,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirclabel
%%%---------- open: tex/pgfcirclabel.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -22107,10 +22107,10 @@
%%%---------- close: tex/pgfcirclabel
%%%%%%%%%%% Springe nach tex/pgfcircvoltage
%%%---------- open: tex/pgfcircvoltage.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -22738,10 +22738,10 @@
%%%---------- close: tex/pgfcircvoltage
%%%%%%%%%%% Springe nach tex/pgfcirccurrent
%%%---------- open: tex/pgfcirccurrent.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -22968,10 +22968,10 @@
%%%---------- close: tex/pgfcirccurrent
%%%%%%%%%%% Springe nach tex/pgfcircflow
%%%---------- open: tex/pgfcircflow.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -23292,10 +23292,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircpath
%%%---------- open: tex/pgfcircpath.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.4.6.tex b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.4.6.tex
index 422784d674..1ae3bf3d7d 100644
--- a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.4.6.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.4.6.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -32,10 +32,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirc.defines
%%%---------- open: tex/pgfcirc.defines.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -927,10 +927,10 @@
%%%---------- close: tex/pgfcirc.defines
%%%%%%%%%%% Springe nach tex/pgfcircutils
%%%---------- open: tex/pgfcircutils.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -1332,10 +1332,10 @@
%%%---------- close: tex/pgfcircutils
%%%%%%%%%%% Springe nach tex/pgfcircpath
%%%---------- open: tex/pgfcircpath.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -1697,10 +1697,10 @@
%%%%%%%%%%% Springe nach tex/pgfcircshapes
%%%---------- open: tex/pgfcircshapes.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -2519,10 +2519,10 @@
%%%---------- close: tex/pgfcircshapes
%%%%%%%%%%% Springe nach tex/pgfcircmonopoles
%%%---------- open: tex/pgfcircmonopoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -3722,10 +3722,10 @@
%%%---------- close: tex/pgfcircmonopoles
%%%%%%%%%%% Springe nach tex/pgfcircbipoles
%%%---------- open: tex/pgfcircbipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -9952,10 +9952,10 @@
%%%---------- close: tex/pgfcircbipoles
%%%%%%%%%%% Springe nach tex/pgfcirctripoles
%%%---------- open: tex/pgfcirctripoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -18520,10 +18520,10 @@
%%%---------- close: tex/pgfcirctripoles
%%%%%%%%%%% Springe nach tex/pgfcircquadpoles
%%%---------- open: tex/pgfcircquadpoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -22281,10 +22281,10 @@
%%%---------- close: tex/pgfcircquadpoles
%%%%%%%%%%% Springe nach tex/pgfcircmultipoles
%%%---------- open: tex/pgfcircmultipoles.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -24442,10 +24442,10 @@
%%%%%%%%%%% Springe nach tex/pgfcirclabel
%%%---------- open: tex/pgfcirclabel.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -24844,10 +24844,10 @@
%%%---------- close: tex/pgfcirclabel
%%%%%%%%%%% Springe nach tex/pgfcircvoltage
%%%---------- open: tex/pgfcircvoltage.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -25554,10 +25554,10 @@
%%%---------- close: tex/pgfcircvoltage
%%%%%%%%%%% Springe nach tex/pgfcirccurrent
%%%---------- open: tex/pgfcirccurrent.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -25800,10 +25800,10 @@
%%%---------- close: tex/pgfcirccurrent
%%%%%%%%%%% Springe nach tex/pgfcircflow
%%%---------- open: tex/pgfcircflow.tex
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
diff --git a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
index 4e4861071f..6f3c8c364f 100644
--- a/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
@@ -1,7 +1,7 @@
-% Copyright 2018-2024 by Romano Giannetti
-% Copyright 2015-2024 by Stefan Lindner
-% Copyright 2013-2024 by Stefan Erhardt
-% Copyright 2007-2024 by Massimo Redaelli
+% Copyright 2018-2025 by Romano Giannetti
+% Copyright 2015-2025 by Stefan Lindner
+% Copyright 2013-2025 by Stefan Erhardt
+% Copyright 2007-2025 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
@@ -16,8 +16,8 @@
\startmodule[circuitikz]
\usemodule[tikz]
-\def\pgfcircversion{1.6.9}
-\def\pgfcircversiondate{2024/05/25}
+\def\pgfcircversion{1.7.1}
+\def\pgfcircversiondate{2025/01/10}
\writestatus{loading}{\pgfcircversiondate{} The CircuiTikz circuit drawing package version \pgfcircversion}
diff --git a/graphics/pgf/contrib/dynkin-diagrams/README b/graphics/pgf/contrib/dynkin-diagrams/README
index 5abe74143c..105afe57df 100644
--- a/graphics/pgf/contrib/dynkin-diagrams/README
+++ b/graphics/pgf/contrib/dynkin-diagrams/README
@@ -1,6 +1,6 @@
Dynkin diagrams
-v3.14159265358979323846
-6 July 2024
+v3.141592653589793238462
+4 December 2024
Authors:
Ben McKay
diff --git a/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.pdf b/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.pdf
index dceef35936..4f440b3170 100644
--- a/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.pdf
+++ b/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.sty b/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.sty
index 7a92e22048..b2af571c4c 100644
--- a/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.sty
+++ b/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.sty
@@ -1,6 +1,6 @@
% The Dynkin Diagrams package.
%
-% Version 3.141 592 653 589 793 238 46
+% Version 3.141 592 653 589 793 238 462
%
% This package draws Dynkin diagrams in LaTeX
% documents, using the TikZ package.
@@ -13,7 +13,7 @@
% Released under the LaTeX Project Public License v1.3c or later, see
% http://www.latex-project.org/lppl.txt
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
-\ProvidesPackage{dynkin-diagrams}[2024/07/05 Dynkin diagrams]
+\ProvidesPackage{dynkin-diagrams}[2024/12/04 Dynkin diagrams]
\RequirePackage{tikz}
\RequirePackage{xstring}
\RequirePackage{etoolbox}
@@ -3460,7 +3460,8 @@
{%
\global#5=%
\stringCharacterInPosition%
- {13456782}{#4}%
+ {87654312}{#4}%
+ %% {13456782}{#4}% <-- Old error!
\relax%
}%
{Kac}%
@@ -3623,7 +3624,8 @@
{%
\global#5=%
\stringCharacterInPosition%
- {18234567}{#3}%
+ {78654321}{#3}%
+% {18234567}{#3}% <<--- Old error.
\relax%
}%
{Kac}%
@@ -3753,7 +3755,8 @@
{%
{Adams}{\global\dynkin@Root@Number=\stringCharacterInPosition{13245678}{#1}\relax}%
{Carter}{\global\dynkin@Root@Number=\stringCharacterInPosition{86754321}{#1}\relax}%
- {Dynkin}{\global\dynkin@Root@Number=\stringCharacterInPosition{18234567}{#1}\relax}%
+ {Dynkin}{\global\dynkin@Root@Number=\stringCharacterInPosition{78654321%%18234567
+}{#1}\relax}%
{Kac}{\global\dynkin@Root@Number=\stringCharacterInPosition{78654321}{#1}\relax}%
}%
[\global\dynkin@Root@Number=#1\relax]%
@@ -5044,6 +5047,12 @@
\else%
\global\dynkin@reverse@arrowstrue\relax%
\fi\relax}%
+% {Carter}{%
+% \ifdynkin@reverse@arrows%
+% \global\dynkin@reverse@arrowsfalse\relax%
+% \else%
+% \global\dynkin@reverse@arrowstrue\relax%
+% \fi\relax}%
{Carter}{\relax}%
{Dynkin}{\relax}%
{Kac}{\relax}%
@@ -5080,7 +5089,13 @@
\else%
\global\dynkin@reverse@arrowstrue\relax%
\fi\relax}%
- {Carter}{\relax}%
+% {Carter}{%
+% \ifdynkin@reverse@arrows%
+% \global\dynkin@reverse@arrowsfalse\relax%
+% \else%
+% \global\dynkin@reverse@arrowstrue\relax%
+% \fi\relax}%
+ {Carter}{\relax}% <<--- This was wrong for a long time!
{Dynkin}{\relax}%
{Kac}{\relax}%
}%
diff --git a/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.tex b/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.tex
index b3f0be4341..e97a5d2f2c 100644
--- a/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.tex
+++ b/graphics/pgf/contrib/dynkin-diagrams/dynkin-diagrams.tex
@@ -1,7 +1,7 @@
\documentclass{amsart}
\title[The Dynkin diagrams package]%
{The Dynkin diagrams package \\
-Version 3.141\,592\,653\,589\,793\,238\,46}
+Version 3.141\,592\,653\,589\,793\,238\,462}
%% My name:
\makeatletter
\DeclareRobustCommand{\scotsMc}{\scotsMcx{c}}
@@ -20,7 +20,7 @@ Version 3.141\,592\,653\,589\,793\,238\,46}
\author{Ben \scotsMc{}Kay}
\address{School of Mathematical Sciences, University College Cork, Cork, Ireland}
\email{b.mckay@ucc.ie}
-\date{6 July 2024}
+\date{4 December 2024}
\thanks{Thanks to Jeffrey Adams, Paul Aspinwall, Mikhail Borovoi, Fran Burstall, Michiel Van Couwenberghe, Xu Gao, Skip Garibaldi, Enrico Gregorio, Mamuka Jibladze, Tasho Kaletha, Jordan Lambert, Sriotchilism O'Zaic, Gopal Prasad, Anthony Pulido, Andres Sambarino, Paul Schwahn, Felix Weinstein, Niels Wen and Gordon Williams.}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenx}
@@ -210,6 +210,9 @@ The Dynkin diagram of \(B_3\) is
\draw[very thick,red] (root 1) to [out=-45, in=-135] (root 3);
\end{dynkinDiagram}
\end{tcblisting}
+
+\newpage
+
\section{Interaction with \TikZ}
Inside a \TikZ environment, default behaviour is to draw from the origin, so you can draw around the diagram:
\begin{tcblisting}{title={Inside a \TikZ environment}}
@@ -235,6 +238,8 @@ The Dynkin diagram of \(B_3\) is
\end{tikzpicture}
\end{tcblisting}
+\newpage
+
\section{Set options globally}
\begin{tcolorbox}[title={Most options set globally \dots}]
@@ -510,6 +515,8 @@ Optionally, you can add label directions to say where to put each label relative
\end{tcblisting}
Many options to the package admit an \verb!expand! in front of them to get more expansion.
+\newpage
+
\section{Label subscripts}
Note the slight improvement that \verb!\drlap! makes: the labels are centered on the middle of the letter \(\alpha\), ignoring the space taken up by the subscripts, using the \verb!mathtools! command \verb!\mathrlap!, but only for labels which are \emph{not} placed to the left or right of a root.
\begin{tcblisting}{title={Label subscript spacing}}
@@ -1001,7 +1008,7 @@ D_4 &
\dynkin[label,ordering=Kac]E6
\end{tcblisting}
Default is Bourbaki.
-Sources are Adams \cite{Adams:1996} p. 56--57, Bourbaki \cite{Bourbaki:2002} p. 265--290 plates I-IX, Carter \cite{Carter:2005} p. 540--609, Dynkin \cite{Dynkin:1952} (reprinted, translated into English, in Dynkin \cite{Dynkin:2000} p. 180), Kac \cite{Kac:1990} p. 43.
+Sources are Adams \cite{Adams:1996} p. 11, pp. 56--57, Bourbaki \cite{Bourbaki:2002} pp. 265--290 plates I-IX, Carter \cite{Carter:2005} pp. 540--609, Dynkin \cite{Dynkin:1952} (reprinted, translated into English, in Dynkin \cite{Dynkin:2000} p. 180), Kac \cite{Kac:1990} p. 53.
\NewDocumentCommand\tablerow{mm}%
{%
diff --git a/graphics/pgf/contrib/euclidean-lattice/README.md b/graphics/pgf/contrib/euclidean-lattice/README.md
new file mode 100644
index 0000000000..b45a8b02ff
--- /dev/null
+++ b/graphics/pgf/contrib/euclidean-lattice/README.md
@@ -0,0 +1,8 @@
+This is the `euclidean-lattice` package,
+written by Jérôme Plût <jerome.plut@ssi.gouv.fr>.
+
+This package provides a simple and efficient way
+of drawing TikZ pictures of two-dimensional Euclidean lattices.
+
+This material is distributed according to the LaTeX Project Public
+License version 1.3c (https://www.latex-project.org/lppl.txt).
diff --git a/graphics/pgf/contrib/euclidean-lattice/euclidean-lattice-doc.pdf b/graphics/pgf/contrib/euclidean-lattice/euclidean-lattice-doc.pdf
new file mode 100644
index 0000000000..fe52fc6e6c
--- /dev/null
+++ b/graphics/pgf/contrib/euclidean-lattice/euclidean-lattice-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/euclidean-lattice/euclidean-lattice.dtx b/graphics/pgf/contrib/euclidean-lattice/euclidean-lattice.dtx
new file mode 100644
index 0000000000..bced9a5cb9
--- /dev/null
+++ b/graphics/pgf/contrib/euclidean-lattice/euclidean-lattice.dtx
@@ -0,0 +1,695 @@
+%% \iffalse
+%% Copyright (C) 2024 Jerome Plut
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008-05-04 or later.
+%%
+%% This work has the LPPL maintenance status "maintained".
+%%
+%% The Current Maintainer of this work is Jerome Plut.
+%%
+%% This work consists of the files `euclidean-lattice.ins`
+%% and `euclidean-lattice.dtx`,
+%% as well as the derived file `euclidean-lattice.sty`.
+%% \fi
+
+% \iffalse
+%<*driver>
+\ProvidesFile{euclidean-lattice.dtx}
+%</driver>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{color}
+\usepackage{euclidean-lattice}
+\usepackage[listings]{tcolorbox}
+\tcbuselibrary{skins}
+\usepackage[margin=25mm]{geometry}
+\usepackage{amsmath,amsfonts,amssymb}
+\usepackage{titling}
+\setlength{\droptitle}{-30mm}
+
+\sloppy
+\definecolor{blue1}{RGB}{0,53,130}
+\definecolor{red1}{RGB}{218,41,28}
+\definecolor{green1}{RGB}{0,150,59}
+\definecolor{purple1}{RGB}{114,36,108}
+\definecolor{cyan1}{RGB}{242,249,245}
+\definecolor{cyan2}{RGB}{28,133,115}
+\parindent 0pt
+\parskip 1ex
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\newtcblisting{example}{%
+ listing side text,tikz lower={scale=.5},
+ listing options={basicstyle=\ttfamily\fontsize{8pt}{9pt}\selectfont,
+ breaklines=true,language=tex,commentstyle=\color{cyan2}\itshape},
+ sharp corners,boxrule=.4pt,righthand width=55mm,boxsep=0mm,left=2mm,
+ sidebyside gap=2mm,
+ skin=bicolor,colback=cyan1,colframe=black,colbacklower=white,
+}
+\makeatletter
+\def\makecompact#1{\g@addto@macro#1{%
+ \setlength{\itemsep}{\z@}\setlength{\parsep}{\z@}%
+ \setlength{\topsep}{\z@}\setlength{\partopsep}{\z@}%
+}}\makecompact\itemize \makecompact\enumerate
+\makeatother
+\let\labelitemi\textendash
+
+\begin{document}
+ \DocInput{euclidean-lattice.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+%<*doc>
+\fi
+
+\GetFileInfo{euclidean-lattice.sty}
+
+\title{The \textsf{euclidean-lattice} package}
+\author{J\'er\^ome Pl\^ut
+ \textlangle\texttt{jerome.plut@cyber.gouv.fr}\textrangle}
+\date{\textsf{euclidean-lattice}~\fileversion, dated~\filedate}
+
+
+\maketitle
+
+This package provides a simple and efficient way
+of drawing \textsf{TikZ} pictures of two-dimensional Euclidean lattices.
+
+\section{Usage}
+
+\subsection{The \texttt{\textbackslash lattice} command}
+
+\DescribeMacro{\lattice}
+{\color{red1}|\lattice|}%
+{\color{green1}|<|\textit{overlay specification}|>|}%
+{\color{blue1}|[|\textit{options...}|]|}%
+|(|$a$|,|$b$|)(|$c$|,|$d$|);|
+This commands draws a part of the two-dimensional lattice
+generated by the vectors $(a,b)$ and $(c,d)$.
+
+The {\color{green1}\textit{overlay specification}} is optional
+and follows~\textsf{beamer} syntax.
+It will only work if the \textsf{beamer} class is loaded.
+
+The {\color{blue1}\textit{options}} enable customizing how the lattice
+is displayed. They follow the standard \textsf{TikZ/PGF} key-value
+interface. The following options are available.
+
+\DescribeMacro{x}
+\DescribeMacro{y}
+{{\color{blue1}\texttt{x=}$x_1$|:|$x_2$}
+and {\color{blue1}\texttt{y=}$y_1$|:|$y_2$}}
+(default value |x=-2:2|,|y=-2:2|).
+
+These two options specify a bounding box which determines
+which part of the lattice is drawn.
+As a shortcut, passing the value |x=|$x_1$
+is equivalent to |x=|$-x_1$|:|$x_1$, and likewise for~|y|.
+\begin{example}
+\draw[help lines,gray!25] (-5,0) grid (5,2);
+\lattice[x=5,y=0:2](3,0)(1,1);
+\node[inner sep=1.5pt,circle,fill=red] at (0,0){};
+\end{example}
+
+\DescribeMacro{grid}
+{{\color{blue1}\texttt{grid=}\textit{options...}}}
+
+This option specifies how to draw
+the grid generated by the two given lattice vectors.
+It may take either a single value (generally a color name),
+or several values grouped in braces.
+Note that this grid depends on the basis vectors and not only on the
+lattice; see the example below.
+\begin{example}
+\lattice[y=0:2,x=0:5,grid=gray](2,-1)(1,1);
+% Same lattice, different basis:
+\lattice[y=0:2,x=6:11,grid={yellow,very thick}]
+ (3,0)(4,1);
+\end{example}
+
+\DescribeMacro{bounding box}
+{{\color{blue1}\texttt{bounding box=}\textit{options...}}}
+
+This option specifies how to draw
+the bounding box given by the |x| and |y| options.
+It may take either a single value (generally a color name),
+or several values grouped in braces.
+\begin{example}
+\lattice[bounding box=green,x=-5:5,y=0:2](3,0)(1,1);
+\end{example}
+
+\DescribeMacro{each point}
+{{\color{blue1}\texttt{each point/.code n args=\{5\}\{}%
+\textit{code...}\texttt{\}}}}
+
+This option contains contains the code to execute for each
+lattice point. This code is called with the five following parameters:
+\begin{itemize}
+\item (|#1|) the parsed lattice node options,
+\item (|#2|,|#3|) the $(x,y)$ coordinates of the current lattice point
+(as \textsf{TikZ} canvas coordinates);
+\item (|#4|,|#5|) the coordinates of the same point
+relative to the provided lattice basis (as integers).
+\end{itemize}
+Note that, due to this parameter being expanded inside a macro, all the
+|#| signs must be doubled in its definition, as in the following example.
+\begin{example}
+\lattice[x=-5:5,y=0:2,each point/.code n args=
+ {5}{\node[##1,fill=cyan!10] at (##2,##3){(##4,##5)};}]
+ (3,0)(1,1);
+\end{example}
+
+
+\textbf{Other options}
+
+Any remaining options are directly passed to
+the |\node| calls for each lattice point.
+\begin{example}
+\lattice[red,rectangle,inner sep=2pt,x=-5:5,y=0:2]
+ (3,0)(1,1);
+\end{example}
+
+
+\subsection{Configuring default behaviour}
+
+\DescribeMacro{x}
+\DescribeMacro{y}
+\DescribeMacro{grid}
+\DescribeMacro{bounding box}
+\DescribeMacro{each point}
+The |/lattice/x|, |/lattice/y|, |/lattice/grid|, |/lattice/bounding box|,
+|/lattice/each point| PGF keys contain
+the default parameters for the correspondingly-named options.
+Note that the |#| signs must \emph{not} be doubled in |/lattice/each point|.
+\begin{example}
+\pgfqkeys{/lattice}{x=-5:5,y=-.1:2.1,
+ grid={blue!10,very thick},
+ bounding box={red,fill=gray!5},
+ each point/.code n args={5}{%
+ \node[#1,fill=cyan!10,rectangle] at (#2,#3)
+ {\tiny (#4,#5)};}}
+\lattice[grid,bounding box](3,0)(1,1);
+\end{example}
+
+\DescribeMacro{node}
+The |/lattice/node| key contains the default parameters for the |\node|
+call for each point.
+Equivalently, these are the default options passed to each |\lattice| call.
+\begin{example}
+\pgfkeys{/lattice/node={fill=yellow!25,draw=red}}
+\lattice[x=-5:5,y=0:2](3,0)(1,1);
+\end{example}
+
+\subsection{Exactness and limitations}
+
+This command only outputs lattices containing the origin.
+An offset lattice may still be obtained by using
+the PGF transformation mechanism
+and correspondingly adjusting the |x|,|y| bounding box parameters:
+\begin{example}
+\begin{scope}\pgftransformshift{\pgfpoint{1cm}{0}}
+\lattice[x=-3:1,red,rectangle](2,0)(1,1);
+\end{scope}
+\lattice(2,0)(1,1);
+\end{example}
+
+
+This command might be executed a large number of times in a single
+document, for example in the case of a \textsf{beamer} presentation
+with a large number of overlays.
+This means that we need to be careful to make it efficient.
+
+Therefore, all computations are performed using \TeX\ registers.
+Since these registers only implement 32-bit integer arithmetic,
+we use fixed-point arithmetic with 16-bit offset for numeric computations
+(which include matrix inversion).
+This implies some precision loss and enforces some numeric limits.
+The use of fixed-point arithmetic means that
+the products appearing in the determinant of the lattice
+must not exceed $2^{15}$.
+In particular, this package should work
+as long as all the coordinates (in absolute value) do not exceed~$128$,
+which should cover most typical scales of \textsf{TikZ} pictures.
+
+We compensate for the precision loss by sampling a bit too many
+lattice points (relative to the required bounding box)
+and then filtering \emph{a posteriori} to ensure that all points
+are in the bounding box.
+This last step should remain exact, at least as soon as
+the coordinates of the lattice vectors are integers
+(or integer multiples of $2^{-8}$).
+
+Therefore, we expect that in most cases, the command will exactly output
+the lattice points inside the bounding box.
+If this were to fail, however, as a last-resort option,
+enlarging the bounding box by a small number in all directions
+should ensure that all lattice points appear.
+
+%\iffalse
+%</doc>
+%\fi
+% \section{Implementation}
+%
+% \paragraph{Initialization.}
+% We obviously depend on~\textsf{tikz}
+% (and more precisely on~\textsf{pgfkeys}).
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{euclidean-lattice}[2024-07-26 Euclidean~lattices 1.0]
+\RequirePackage{tikz}
+% \end{macrocode}
+% We use fixed-point arithmetic in the 31-bit registers supported by
+% \TeX, using 16 bits for offset.
+%
+% TODO: we could slightly enhance the precision of computations by
+% correctly rounding the last bit (instead of truncating).
+% Depending on the value's sign,
+% |\advance XXX by .5\la@unit| should do the trick.
+%
+% This means that we represent a real number~$x$
+% using the integer $f(x) = B x$, where $B = 2^{16}$.
+% To multiply two such integers, we note that
+% $f(xy) = B x y = f(x) f(y)/B$,
+% which we compute as $(f(x)/\beta) \cdot (f(y)/\beta)$,
+% where $\beta = \sqrt{B} = 2^{8}$.
+% We store this value in the register |\la@unit|.
+% \begin{macrocode}
+\newdimen\la@unit \la@unit=256sp
+\def\lattice@mul#1#2{% writes #1*#2 in #1
+ \@tempdimc=#2 \divide\@tempdimc\la@unit
+ \divide #1\la@unit
+ \multiply #1\@tempdimc}%
+% \end{macrocode}
+% We perform division using
+% $f(x/y) = B x/y = B f(x)/f(y)$,
+% which we compute as $\frac{\beta f(x)}{f(y)/\beta}$.
+% \begin{macrocode}
+\def\lattice@div#1#2{%
+ \@tempdimc=#2\divide\@tempdimc\la@unit
+ \multiply #1\la@unit \divide#1\@tempdimc}%
+\def\lattice@invert#1{% writes 1/#1 in #1
+ \@tempdimc=#1 \divide\@tempdimc\la@unit
+ #1=256\p@ \divide #1\@tempdimc}%
+% \end{macrocode}
+% The next macro is our main enumeration routine.
+% It enumerates all the point in the lattice~$\Lambda$ generated
+% by the vectors $(a=|#1|,b=|#2|)$ and $(c=|#3|,d=|#4|)$
+% inside the box~$R$ delimited by the registers
+% $[|\la@Ax|,|\la@Bx|] \times [|\la@Ay|,|\la@By|]$.
+% On each such point, it invokes the macro
+% |\lattice@donode|.
+%
+% Since $\Lambda = B \cdot \mathbb{Z}^2$,
+% instead of enumerating $S = \Lambda \cap R$
+% we enumerate $B^{-1} S = \mathbb{Z}^2 \cap (B^{-1} R)$.
+% We use $(x,y)$ coordinates to describe elements of~$S$
+% and $(w,z)$ coordinates to describes elements of~$B^{-1} S$.
+%
+% We declare several numeric registers, all prefixed with |\la@|:
+% \begin{itemize}
+% \item $(a,b)$ and $(c,d)$ are the vectors of the lattice basis~$B$;
+% \item $R := [Ax, Bx] \times [Ay, By]$ is the bounding box for the drawing;
+% \item $U := (Ux, Uy)$ and $V := (Vx, Vy)$ are the side vectors
+% of the parallelogram $P := B^{-1} \cdot R$,
+% and~$C := (Cx, Cy)$~is its center;
+% \item $sM < sL$ are the slopes of the vectors $U$ and~$V$;
+% \item $wA, wB, wM$ are the horizontal parameters for enumerating
+% the parallelogram;
+% \item $zA, zB, zC$ are the vertical parameters for enumerating the
+% parallelogram;
+% \item $D$ plays a double role, first as the (inverse) determinant of
+% the lattice, and then as a vertical enumeration parameter.
+% \end{itemize}
+% \begin{macrocode}
+\newdimen\la@a \newdimen\la@b \newdimen\la@c \newdimen\la@d
+\newdimen\la@Ax\newdimen\la@Bx\newdimen\la@Ay\newdimen\la@By
+\newdimen\la@D
+\newdimen\la@Ux\newdimen\la@Uy \newdimen\la@Vx\newdimen\la@Vy
+\newdimen\la@Cx\newdimen\la@Cy
+
+\newdimen\la@sL \newdimen\la@sM
+\newdimen\la@zA \newdimen\la@zB \newdimen\la@zC
+\newdimen\la@wA \newdimen\la@wB
+\newcount\la@wM
+% \end{macrocode}
+% \begin{macrocode}
+\def\lattice@enumerate#1#2#3#4{%
+ \la@a=#1\p@ \la@b=#2\p@ \la@c=#3\p@ \la@d=#4\p@
+% \end{macrocode}
+% First we store the \textrm{inverse} of the determinant in |\la@D|.
+% \begin{macrocode}
+ \la@D=\la@a \lattice@mul\la@D\la@d
+ \@tempdima=\la@b \lattice@mul\@tempdima\la@c
+ \advance\la@D -\@tempdima
+ \lattice@invert\la@D
+% \end{macrocode}
+% Compute the inverse image $B^{-1} R = P$.
+% We first compute the sides $U$, $V$ of the parallelogram,
+% multiplying by $-1$ if needed so that both $w$-coordinates are
+% $\geqslant 0$.
+% \begin{macrocode}
+ \la@Ux=\la@Ax \advance\la@Ux-\la@Bx
+ \lattice@mul\la@Ux \la@D
+ \la@Uy=-\la@Ux
+ \lattice@mul\la@Ux \la@d \ifdim\la@Ux <\z@
+ \multiply\la@Ux -1 \multiply\la@Uy -1 \fi
+ \lattice@mul\la@Uy\la@b
+ \la@Vx=\la@By \advance\la@Vx-\la@Ay \lattice@mul\la@Vx\la@D
+ \la@Vy=-\la@Vx
+ \lattice@mul\la@Vx\la@c \ifdim\la@Vx<\z@
+ \multiply\la@Vx -1 \multiply\la@Vy -1\fi
+ \lattice@mul\la@Vy \la@a
+% \end{macrocode}
+% We ensure that $\det(U,V) > 0$, swapping both vectors if needed.
+% Since we only need the sign of this determinant, we scale down the
+% values to help prevent a numeric overflow.
+% \begin{macrocode}
+ \@tempdima \la@Ux
+ \@tempdimb \la@Vx
+ \ifdim\@tempdima<100\p@\else
+ \ifdim\@tempdimb<100\p@\else
+ \divide\@tempdima 1024
+ \divide\@tempdimb 1024\fi\fi
+ \lattice@mul\@tempdima\la@Vy
+ \lattice@mul\@tempdimb\la@Uy
+ \ifdim \@tempdimb>\@tempdima
+ \@tempdimc=\la@Ux \la@Ux=\la@Vx \la@Vx=\@tempdimc
+ \@tempdimc=\la@Uy \la@Uy=\la@Vy \la@Vy=\@tempdimc
+ \fi
+% \end{macrocode}
+% Compute the center of the parallelogram.
+% Note that we also use |\la@sL|, |\la@sM| (not yet needed)
+% as temporaries here.
+% \begin{macrocode}
+ \la@sL=\la@Ax \advance\la@sL\la@Bx \divide\la@sL 2
+ \la@sM=\la@Ay \advance\la@sM\la@By \divide\la@sM 2
+ \la@Cx=\la@sL \lattice@mul\la@Cx\la@d
+ \@tempdima=\la@sM \lattice@mul\@tempdima\la@c
+ \advance\la@Cx -\@tempdima
+ \la@Cy=\la@sM \lattice@mul\la@Cy\la@a
+ \@tempdima=\la@sL \lattice@mul\@tempdima\la@b
+ \advance\la@Cy -\@tempdima
+ \lattice@mul \la@Cx\la@D
+ \lattice@mul \la@Cy\la@D
+% \end{macrocode}
+% Compute the bounding-box in $(w,z)$ space.
+% Note that the |\la@wA|,|\la@wB| values will be re-used below
+% for enumerating all lattice points;
+% on the other hand, |\la@zA| and |\la@zB| are used here
+% as temporary values.
+% \begin{macrocode}
+ \@tempdima\la@Ux \advance\@tempdima\la@Vx
+ \la@wA=\la@Cx \advance\la@wA -.5\@tempdima
+ \la@wB=\la@wA \advance\la@wB \@tempdima
+ \@tempdima\la@Uy \ifdim\@tempdima<\z@ \multiply\@tempdima -1\fi
+ \ifdim\la@Vy<\z@ \advance\@tempdima -\la@Vy
+ \else\advance\@tempdima\la@Vy\fi
+ \la@zA=\la@Cy \advance\la@zA -.5\@tempdima
+ \la@zB=\la@zA \advance\la@zB \@tempdima
+% \end{macrocode}
+% Draw the grid if the options require it.
+% \begin{macrocode}
+ \ifx\lattice@grid\@empty\else \begin{scope}%
+ \clip (\strip@pt\la@Ax,\strip@pt\la@Ay)
+ rectangle (\strip@pt\la@Bx,\strip@pt\la@By);
+ \pgftransformcm{\strip@pt\la@a}{\strip@pt\la@b}%
+ {\strip@pt\la@c}{\strip@pt\la@d}{\pgfpointorigin}%
+ \expandafter\draw\expandafter[\lattice@grid]
+ (\strip@pt\la@wA,\strip@pt\la@zA) grid (\strip@pt\la@wB,\strip@pt\la@zB);
+ \end{scope}\fi
+% \end{macrocode}
+% Compute the last values required to enumerate over $\mathbb{Z}^2 \cap P$.
+% We represent the parallelogram~$P$ as the intersection of four half-planes.
+% Let $A_1=(w_1,z_1)$ and $A_2=(w_2,z_2)$ be
+% the left-most and right-most vertices of~$P$,
+% and $\lambda, \mu$ be the slopes of the sides
+% (the condition $\det(U,V) > 0$ guarantees that $\lambda < \mu$).
+%
+% The two sides originating from~$A_i (i=1,2)$ have equations
+% \[ z=z_i+\lambda(w-w_i), \qquad z=z_i+\mu(w-w_i); \]
+% By defining $z_3 = z_2 - \lambda (w_2 - w_1)$ and $z_4=z_2-\mu(w_2-w_1)$,
+% we may rewrite both equations from~$A_2$ as:
+% \[ z= z_3 + \mu(w-w_1),
+% \qquad z = z_4 + \lambda(w-w_1) \]
+% The parallelogram~$P$ is then defined by the following inequations,
+% where we write $t = w - w_1$:
+% \[ \max(z_3+\mu t, z_1+\lambda t) \;\leqslant\; z \;\leqslant\;
+% \min(z_1+\mu t, z_4+\lambda t). \]
+% For any given value of~$w$ we store the value of these four affine
+% functions in the variables |\la@zB|, |\la@zA|, |\la@D| (not a typo),
+% |\la@zC|, in this order.
+% When increasing the value of~$w$ we only need to increase the values
+% of these four registers respectively by $\mu$, $\lambda$, $\mu$,
+% $\lambda$.
+%
+% First we compute the values $z_2 = z_C + \frac 12(z_U+z_V)$
+% and~$w_2 - w_1 = w_U + w_V$.
+% \begin{macrocode}
+ \@tempdima=\la@Uy \advance\@tempdima\la@Vy
+ \@tempdimb=\la@Cy \advance\@tempdimb .5\@tempdima % z2
+ \@tempdima=\la@Ux \advance\@tempdima\la@Vx % w_2-w_1 = w(U+V)
+% \end{macrocode}
+% Then we compute the slopes $\lambda = |\la@sL|$ and $\mu = |\la@sM|$.
+% A Special case happens when either $w_U$ or $w_V$ is zero.
+% In the first case, $\lambda = -\infty$.
+% This means that the comparisons with |\la@zA| and |\la@zC| must be
+% ignored.
+% \begin{macrocode}
+ \ifdim\la@Ux=\z@
+ \la@sL=\z@ \la@zC=\maxdimen \la@zA=-\maxdimen
+ \else
+ \la@sL=\la@Uy \lattice@div\la@sL\la@Ux
+ \la@zC=-\@tempdima \lattice@mul\la@zC\la@sL \advance\la@zC \@tempdimb
+ \la@zA=\@tempdimb \advance\la@zA -\la@Uy \advance\la@zA -\la@Vy
+ \fi
+% \end{macrocode}
+% Likewise, if $w_V = 0$ then $\mu = +\infty$
+% and the comparisons with |\la@zB| and |\la@D| are ignored.
+% \begin{macrocode}
+ \ifdim\la@Vx=\z@
+ \la@sM=\z@ \la@zB=-\maxdimen \la@D=\maxdimen
+ \else
+ \la@sM=\la@Vy \lattice@div\la@sM\la@Vx
+ \la@zB=-\@tempdima \lattice@mul\la@zB\la@sM \advance\la@zB \@tempdimb
+ \la@D=\@tempdimb \advance\la@D -\la@Uy \advance\la@D -\la@Vy
+ \fi
+% \end{macrocode}
+%
+% At this point the enumerator for $B^{-1} S$ is fully computed;
+% it uses the registers |\la@sL|, |\la@sM| for the slopes,
+% |\la@wA|, |\la@wB| for the boundaries,
+% |\la@zA|, |\la@zB|, |\la@zC|, |\la@D| for the four affine functions,
+% as well as the original matrix~$B$ in |\la@a|, |\la@b|, |\la@c|, |\la@d|
+% (to recompute the points of~$\Lambda$).
+%
+% We re-use the freed registers in the following way:
+% \begin{itemize}
+% \item $(|\la@Vx|,|\la@Vy|)$ hold the $(w,z)$ coordinates
+% of the current lattice point (stored as integers);
+% \item $(|\la@Ux|,|\la@Uy|)$ hold the corresponding point
+% in $(x,y)$ space (stored as \textsf{dimen}s);
+% \item $(|\la@Cx|,|\la@Cy|)$ hold the $(x,y)$ coordinates
+% of the $(w,0)$ point, which is used for each column.
+% \end{itemize}
+%
+% Because the fixed-point arithmetic is imprecise, we might miss some
+% lattice points on the boundaries. We compensate for this by enlarging
+% the bounds ($-1$ for lower bounds, $+1$ for upper bounds)
+% and \emph{a posteriori} checking that all the computed points
+% are in the bounding box.
+%
+% Store in |\la@Vx| our starting $(w,z)$ coordinate,
+% which is the integer $\lceil|\la@wA|\rceil -1$.
+% Since \TeX\ knows only \emph{signed} division (groumpf),
+% computing the ceiling is sign-dependent.
+% \begin{macrocode}
+ \la@Vx=\la@wA \advance\la@Vx\expandafter\ifdim\la@Vx>\z@ -1sp\else-\p@\fi
+ \divide\la@Vx \p@
+% \end{macrocode}
+% Compute the upper boundary $|\la@wB|=\lfloor|\la@wB|\rfloor+1$.
+% \begin{macrocode}
+ \ifdim\la@wB<\z@ \advance\la@wB 1sp\else\advance\la@wB\p@\fi
+ \divide\la@wB\p@
+% \end{macrocode}
+% Compute the difference $t = \lceil w_1\rceil-w_1$
+% and correspondingly advance the four affine functions.
+% \begin{macrocode}
+ \@tempdima=\la@Vx \multiply\@tempdima\p@
+ \advance\@tempdima -\la@wA
+ \@tempdimb=\@tempdima \lattice@mul\@tempdimb\la@sL
+ \advance\la@zA\@tempdimb \advance\la@zC\@tempdimb
+ \@tempdimb=\@tempdima \lattice@mul\@tempdimb\la@sM
+ \advance\la@zB\@tempdimb \advance\la@D\@tempdimb
+% \end{macrocode}
+% Store in |\la@Cx|, |\la@Cy| the $(x,y)$ coordinates of the
+% lattice vector $w \cdot (a,b)$:
+% \begin{macrocode}
+ \la@Cx=\la@a \multiply\la@Cx\la@Vx
+ \la@Cy=\la@b \multiply\la@Cy\la@Vx
+% \end{macrocode}
+% The main $w$-loop starts here.
+% \begin{macrocode}
+ \loop
+% \end{macrocode}
+% Compute the range of $z=|\la@Vy|$ for this value of $w=|\la@Vx|$.
+% The minimum value is $\max(|\la@zA|,|\la@zB|)-1$:
+% \begin{macrocode}
+ \la@Vy=\la@zA \ifdim\la@Vy<\la@zB \la@Vy=\la@zB\fi
+ \advance\la@Vy\expandafter\ifdim\la@Vy>\z@ -1sp\else-\p@\fi
+ \divide\la@Vy\p@
+% \end{macrocode}
+% The maximum value is $|\la@wM|=\min(|\la@zC|,|\la@D|)$:
+% \begin{macrocode}
+ \la@wM=\la@zC \ifnum\la@wM>\la@D \la@wM=\la@D\fi
+ \advance\la@wM\expandafter\ifnum\la@wM<\z@\@ne\else\p@\fi
+ \divide\la@wM\p@
+% \end{macrocode}
+% Compute the $(|\la@Ux|,|\la@Uy|)$ point in $(x,y)$ space:
+% \begin{macrocode}
+ \la@Ux=\la@c \multiply\la@Ux\la@Vy \advance\la@Ux\la@Cx
+ \la@Uy=\la@d \multiply\la@Uy\la@Vy \advance\la@Uy\la@Cy
+% \end{macrocode}
+% Inner ($z$) loop. Nested loops require grouping.
+% \begin{macrocode}
+ {\loop
+% \end{macrocode}
+% If the point is inside the bounding box, we invoke |\lattice@donode|.
+% Note the use of |\expandafter| to ensure that the |\node| call inside
+% the PGF key |/lattice/each node| gets the expanded options list.
+% \begin{macrocode}
+ \ifdim\la@Ux<\la@Ax\else\ifdim\la@Ux>\la@Bx\else
+ \ifdim\la@Uy<\la@Ay\else\ifdim\la@Uy>\la@By\else
+ \expandafter\lattice@donode\expandafter{\lattice@node}%
+ \fi\fi\fi\fi
+% \end{macrocode}
+% End of the $z$ loop. We increase $z$ and correspondingly advance the vector.
+% \begin{macrocode}
+ \ifnum\la@Vy<\la@wM
+ \advance\la@Vy 1sp
+ \advance\la@Ux\la@c \advance\la@Uy\la@d
+ \repeat}
+% \end{macrocode}
+% End of the $w$ loop. We increase $w$ and correspondingly advance
+% the $w\cdot (a,b)$ vector as well as the four affine functions.
+% \begin{macrocode}
+ \ifnum\la@Vx<\la@wB
+ \advance\la@Vx 1sp
+ \advance\la@Cx\la@a \advance\la@Cy\la@b
+ \advance\la@zA \la@sL \advance\la@zC \la@sL
+ \advance\la@zB \la@sM \advance\la@D \la@sM
+ \repeat
+}
+% \end{macrocode}
+% This macro gets called for each found lattice point.
+% Its main job is to ensure that the node options (here |#1|)
+% are correctly expanded.
+% \begin{macrocode}
+\def\lattice@donode#1{%
+ \pgfkeys{/lattice/arg/each point={#1}{\strip@pt\la@Ux}{\strip@pt\la@Uy}%
+ {\number\la@Vx}{\number\la@Vy}}}
+
+% \end{macrocode}
+% The PGF keys used for parsing the arguments of the |\lattice| command;
+% they correspond to the options passed in square brackets.
+% \begin{macrocode}
+\pgfqkeys{/lattice/arg}{
+ x/.store in=\lattice@x,
+ y/.store in=\lattice@y,
+ grid/.store in=\lattice@grid,
+ each point/.code n args={5}{\pgfkeys{/lattice/each point={#1}{#2}{#3}{#4}{#5}}},
+ bounding box/.store in=\lattice@bbox,
+ .unknown/.code={%
+ \expandafter\lattice@setnode\pgfkeyscurrentkey=#1\lattice@eov
+ }}
+% \end{macrocode}
+% The PGF keys used for user configuration of the default values.
+% \begin{macrocode}
+\pgfqkeys{/lattice}{
+ x/.initial=-2:2,y/.initial=-2:2,
+ node/.initial={circle,inner sep=1pt,draw=none,fill=black},
+ grid/.style={/lattice/arg/grid/.default={#1}},
+ grid={gray,very thin},
+ bounding box/.style={/lattice/arg/bounding box/.default={#1}},
+ bounding box={cyan,thin},
+ each point/.code n args={5}{\node[#1] at (#2,#3){};},
+}
+% \end{macrocode}
+% This handles the passing of any unknown |\lattice| keys
+% down to the |\node| calls.
+% \begin{macrocode}
+\def\lattice@setnode/lattice/arg/#1\lattice@eov{%
+ \edef\lattice@node{\expandafter\noexpand\lattice@node,#1}}
+% \end{macrocode}
+% This macro parses the bounding-box |x| and |y| coordinates,
+% replacing |x=10| by |x=-10:10|.
+% The |detokenize| trick was nicely provided by David Carlisle:
+% |https://tex.stackexchange.com/questions/724989/|.
+% \begin{macrocode}
+\def\lattice@getxy#1#2#3{%
+ \def\m@gic##1:##2:##3\end{\ifx ##3: #2=##1\p@ #3=##2\p@\else
+ #2=-##1\p@ #3=##1\p@\fi}%
+ \expandafter\m@gic\detokenize{#1:}:\end
+}
+% \end{macrocode}
+% The following macros parse the possible combinations of overlays
+% and square-bracket options.
+% They are similar to the way |\tikz@command@path| is defined
+% in |tikz.code.tex|.
+% Just as in that case, the overlay is handled by a |\alt| call,
+% which will fail if \textsf{beamer} is not loaded.
+% \begin{macrocode}
+\def\lattice{\@ifnextchar<\lattice@I{\@ifnextchar[\lattice@II{\lattice@@[]}}}
+\def\lattice@I{\ifnum\the\catcode`\;=\active\relax
+ \let\lattice@next\lattice@Iactive\else
+ \let\lattice@next\lattice@Inormal\fi
+ \lattice@next}
+\long\def\lattice@Inormal<#1>#2;{\alt<#1>{\lattice@I@#2;}{}}
+{\catcode`\;=\active
+ \long\gdef\lattice@Iactive<#1>#2;{\alt<#1>{\lattice@I@#2;}{}}
+}
+\def\lattice@I@{\@ifnextchar[\lattice@@{\lattice@@[]}}
+\def\lattice@II[#1]{\@ifnextchar<{\lattice@IIi[#1]}{\lattice@@[#1]}}
+\def\lattice@IIi[#1]<#2>{\lattice@I<#2>[#1]}
+% \end{macrocode}
+% This macros parses the basis vectors and calls the main loop.
+% |#4| and |#7| are dummy parameters swallowing a possible space between
+% the parentheses and the final semicolon.
+% \begin{macrocode}
+\def\lattice@@[#1](#2,#3)#4(#5,#6)#7{
+ \let\lattice@grid\@empty%
+ \let\lattice@bbox\@empty%
+ \edef\lattice@x{\pgfkeysvalueof{/lattice/x}}%
+ \edef\lattice@y{\pgfkeysvalueof{/lattice/y}}%
+ \edef\lattice@node{\pgfkeysvalueof{/lattice/node}}%
+ \pgfqkeys{/lattice/arg}{#1}%
+% \end{macrocode}
+% Read the bounding-box coordinates from the |x| and |y| keys:
+% \begin{macrocode}
+ \expandafter\lattice@getxy\expandafter{\lattice@x}\la@Ax\la@Bx
+ \expandafter\lattice@getxy\expandafter{\lattice@y}\la@Ay\la@By
+% \end{macrocode}
+% Draw the bounding-box if it was required by the options.
+% \begin{macrocode}
+ \ifx\lattice@bbox\@empty\else
+ \expandafter\draw\expandafter[\lattice@bbox]
+ (\strip@pt\la@Ax,\strip@pt\la@Ay)
+ rectangle (\strip@pt\la@Bx,\strip@pt\la@By);
+ \fi
+% \end{macrocode}
+% Call the main loop.
+% \begin{macrocode}
+ \lattice@enumerate{#2}{#3}{#5}{#6}%
+}
+% \end{macrocode}
+%
+% \Finale
+\endinput
diff --git a/graphics/pgf/contrib/euclidean-lattice/euclidean-lattice.ins b/graphics/pgf/contrib/euclidean-lattice/euclidean-lattice.ins
new file mode 100644
index 0000000000..d34ef1970a
--- /dev/null
+++ b/graphics/pgf/contrib/euclidean-lattice/euclidean-lattice.ins
@@ -0,0 +1,23 @@
+%%
+%% Copyright (C) 2024 Jerome Plut
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008-05-04 or later.
+%%
+%% This work has the LPPL maintenance status "maintained".
+%%
+%% The Current Maintainer of this work is Jerome Plut.
+%%
+%% This work consists of the files `euclidean-lattice.ins`
+%% and `euclidean-lattice.dtx`,
+%% as well as the derived file `euclidean-lattice.sty`.
+
+\input docstrip.tex
+\keepsilent
+\generate{\file{euclidean-lattice.sty}{\from{euclidean-lattice.dtx}{package}}}
+\endbatchfile
diff --git a/graphics/pgf/contrib/fancyqr/README.md b/graphics/pgf/contrib/fancyqr/README.md
index 63432f93e0..ea4ab04b69 100644
--- a/graphics/pgf/contrib/fancyqr/README.md
+++ b/graphics/pgf/contrib/fancyqr/README.md
@@ -5,30 +5,37 @@
[<img src="https://github.com/EagleoutIce/fancyqr/blob/gh-pages/preview-1.png?raw=true" width="600"/>](qr-example.tex)
A simple package to create fancy qr-codes with the help of the [`qrcode`][qrcode]-package.
-You may use `\fancyqr` just like the normal `\qrcode` (`\fancyqr[<qr-options>]{<url>}`). See the [documentation](https://media.githubusercontent.com/media/EagleoutIce/fancyqr/gh-pages/build/fancyqr-doc.pdf).
+You may use `\fancyqr` just like the normal `\qrcode` (`\fancyqr[<qr-options>]{<url>}`). See the [documentation](https://media.githubusercontent.com/media/EagleoutIce/fancyqr/gh-pages/build/fancyqr-doc.pdf). If you just want to create a simple qr-code, please refer to the [minimal example](qr-minimal.tex).
*fancyqr* is actively developed by *Florian Sihler* (contact me at: <florian.sihler@uni-ulm.de>) under the [GPLv3 License](LICENSE). I am very happy about every contribution (see [CONTRIBUTING.md](CONTRIBUTING.md)). You can find it on CTAN (<https://www.ctan.org/pkg/fancyqr>).
-If you do want to hide a center square (e.g., because you want to embed an image), you can use `\FancyQrDoNotPrintSquare{<x>}{<y>}` to hide a rectangle with radius x and y set from the center. If you choose this option, the default `\FancyQrRoundCut` that rounds cut corners can be changed with `\FancyQrHardCut`.
+If you do want to hide a center square (e.g., because you want to embed an image), you can use `\FancyQrDoNotPrintSquare{<x>}{<y>}` to hide a rectangle with radius x and y set from the center (with `\FancyQrDoNotPrintRadius{<factor>}` you can apply a [rounding](https://github.com/EagleoutIce/fancyqr/pull/41) to this!). If you choose this option, the default `\FancyQrRoundCut` that rounds cut corners can be changed with `\FancyQrHardCut`.
At the moment, there are six other styles (`flat`, `frame`, `blobs`, `glitch`, and `dots`) that you can load (locally) by using `\FancyQrLoad{<name>}`. The default style is named `default` and can be 'reset' by `\FancyQrLoad{default}` or `\FancyQrLoadDefault`.
There are the following extra qr-options (you can set all of them with `\fancyqrset{<keys>}`):
-| Option | Type | Default | Explanation |
-| ----------------- | ------- | :------: | ---------------------------------------------------------- |
-| `image` | LaTeX | | Automatically center an image.[^1] |
-| `image padding` | number | | Additionally hide blocks (x & y) around the image. |
-| `image x padding` | number | `0` | Additionally hide blocks (x) around the image. |
-| `image y padding` | number | `0` | Additionally hide blocks (y) around the image. |
-| `gradient` | boolean | true | Toggle the color gradient |
-| `color` | color | | Disables the `gradient` and sets the qr color accordingly. |
-| `l color` | color | `purple` | Set the top left gradient color. |
-| `left color` | color | | Alias for `l color`. |
-| `r color` | color | `teal` | Set the bottom right gradient color. |
-| `right color` | color | | Alias for `r color`. |
-| `gradient angle` | angle | `135` | Change the gradient angle. |
-| `random color` | colors | | Allow to set a random color pool to pick from. |
-| `width` | length | | Alias for [`qrcode`'s][qrcode] `height` option. |
-| `size` | length | | Alias for [`qrcode`'s][qrcode] `height` option. |
+
+| Option | Type | Default | Explanation |
+| ----------------- | ----------- | :------: | ------------------------------------------------------------------------------------------------------------------------------------------ |
+| `classic` | boolean | `false` | Use the classic qr-code style (black with flat rectangles, this loads the `flat` style). |
+| `color` | color | | Disables the `gradient` and sets the qr color accordingly. |
+| `compensate` | length | `0.15pt` | Compensating overlap to add to avoid glitches. |
+| `gradient angle` | angle | `135` | Change the gradient angle. |
+| `gradient` | boolean | true | Toggle the color gradient |
+| `image` | LaTeX | | Automatically center an image (you have to care for the size and maybe adjust the `version` and `level` to keep the qr-code readable).[^1] |
+| `image padding` | number | | Additionally hide blocks (x & y) around the image. |
+| `image x padding` | number | `0` | Additionally hide blocks (x) around the image. |
+| `image y padding` | number | `0` | Additionally hide blocks (y) around the image. |
+| `l color` | color | `purple` | Set the top left gradient color. |
+| `left color` | color | | Alias for `l color`. |
+| `level` | L/M/Q/H | `M` | [`qrcode`][qrcode] option affecting error correction (low, medium, quartile, high). |
+| `padding` | flag | | [`qrcode`][qrcode] option adding sufficient additional space around the qr-code. |
+| `r color` | color | `teal` | Set the bottom right gradient color. |
+| `random color` | colors | | Allow to set a random color pool to pick from. |
+| `right color` | color | | Alias for `r color`. |
+| `size` | length | | Alias for [`qrcode`'s][qrcode] `height` option. |
+| `tight` | flag | | [`qrcode`][qrcode] option adding no additional space around the qr-code. |
+| `version` | [0..40] ∈ ℕ | `0` | [`qrcode`][qrcode] option affecting the size (tries to be as small as possible). |
+| `width` | length | | Alias for [`qrcode`'s][qrcode] `height` option. |
The defaults are set like this:
diff --git a/graphics/pgf/contrib/fancyqr/fancyqr-doc.pdf b/graphics/pgf/contrib/fancyqr/fancyqr-doc.pdf
index c96c62abbc..f716affdf9 100644
--- a/graphics/pgf/contrib/fancyqr/fancyqr-doc.pdf
+++ b/graphics/pgf/contrib/fancyqr/fancyqr-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/fancyqr/fancyqr-doc.tex b/graphics/pgf/contrib/fancyqr/fancyqr-doc.tex
index 1f3b00ba2d..9e099d9f02 100644
--- a/graphics/pgf/contrib/fancyqr/fancyqr-doc.tex
+++ b/graphics/pgf/contrib/fancyqr/fancyqr-doc.tex
@@ -18,6 +18,7 @@
\usepackage{fancyqr}
\usepackage{xcolor}
\usepackage[tex]{listings}
+\usepackage{amssymb}
\lstdefinelanguage{ltx}{
language={[LaTeX]TeX},
@@ -34,17 +35,16 @@
\texorpdfstring{Florian Sihler\medskip\\*
\fancyqr{https://github.com/EagleoutIce/fancyqr}
}{Florian Sihler}}
-\date{Version v2.0 \textendash{} 2024/04/13}
-
+\date{Version v2.2 \textendash{} 2024/11/27}
\begin{document}
\maketitle
- \texttt{fancyqr} is a simple package to create fancy qr codes with the help of the \textit{\href{https://www.ctan.org/pkg/qrcode}{qrcode}}-package.
+ \texttt{fancyqr} is a simple package to create fancy qr-codes with the help of the \textit{\href{https://www.ctan.org/pkg/qrcode}{qrcode}}-package.
You can use the |\fancyqr|-macro just like the normal |\qrcode|.\footnote{\ltx{\\fancyqr[<qr-options>]\{<url>\}}}
- If you do want to hide a center square (e.g, because you want to embed an image) you can use |\FancyQrDoNotPrintSquare{<x>}{<y>}| to hide a rectangle with radius x and y set from the center. If you choose this option, the default |\FancyQrRoundCut| that rounds cut corners can be changed with |\FancyQrHardCut|.
+ If you do want to hide a center square (e.g, because you want to embed an image) you can use |\FancyQrDoNotPrintSquare{<x>}{<y>}| to hide a rectangle with radius x and y set from the center (with |\FancyQrDoNotPrintRadius{<factor>}| you can apply a \href{https://github.com/EagleoutIce/fancyqr/pull/41}{rounding} to this!). If you choose this option, the default |\FancyQrRoundCut| that rounds cut corners can be changed with |\FancyQrHardCut|.
At the moment, there are six other styles for the qr-code |flat|, |frame|, |blobs|, |glitch|, and |dots|, that you can load (locally) by using |\FancyQrLoad{<name>}|. The default style is named |default| and can be 'reset' by |\FancyQrLoad{default}| or |\FancyQrLoadDefault|.
All of the extra qr-options (you can set all of them with |\fancyqrset{<keys>}|) are showcased in \autoref{tbl:extra-keys}.
@@ -66,20 +66,26 @@
\toprule
\multicolumn{1}{l}{Option} & Type & \multicolumn{1}{c}{Default} & Explanation \\
\midrule
- image & \LaTeX & & Automatically center an image.\footnote{The package will automatically calculate the required \ltx{\\FancyQrDoNotPrintSquare} (you have to make sure that the qr code still has enough information to be readable). Therefore, the image will not scale with the qr code.} \\
+ classic & boolean & false & Use the classic qr-code style (black with flat rectangles, this loads the |flat| style). \\
+ color & color & & Disables the |gradient| and sets the color accordingly. \\
+ compensate & length & 0.15pt & Compensating overlap to add to avoid glitches. \\
+ gradient & boolean & true & Toggle the color gradient \\
+ gradient angle & angle & 135 & Change the gradient angle. \\
+ image & \LaTeX & & Automatically center an image (you have to care for the size and maybe adjust the |version| and |level| to keep the qr-code readable).\footnote{The package will automatically calculate the required \ltx{\\FancyQrDoNotPrintSquare} (you have to make sure that the qr-code still has enough information to be readable). Therefore, the image will not scale with the qr-code.} \\
image padding & number & & Additionally hide blocks (x \& y) around the image. \\
image x padding & number & 0 & Additionally hide blocks (x) around the image. \\
image y padding & number & 0 & Additionally hide blocks (y) around the image. \\
- gradient & boolean & true & Toggle the color gradient \\
- color & color & & Disables the |gradient| and sets the color accordingly. \\
l color & color & purple & Set the top left gradient color. \\
left color & color & & Alias for |l color|. \\
+ level & L/M/Q/H & M & |qrcode| option affecting error correction (low, medium, quartile, high). \\
+ padding & flag & & |qrcode| option adding sufficient additional space around the qr-code. \\
r color & color & teal & Set the bottom right gradient color. \\
- right color & color & & Alias for |r color|. \\
- gradient angle & angle & 135 & Change the gradient angle. \\
random color & colors & & Allow to set a random color pool to pick from. \\
- width & length & & Alias for |qrcode|'s |height| option. \\
+ right color & color & & Alias for |r color|. \\
size & length & & Alias for |qrcode|'s |height| option. \\
+ tight & flag & & |qrcode| option adding no additional space around the qr-code. \\
+ version & \([0..40] \in \mathbb{N}\) & 0 & |qrcode| option affecting the size (tries to be as small as possible). \\
+ width & length & & Alias for |qrcode|'s |height| option. \\
\bottomrule
\end{tabular}
\caption{Overview of special qr-options.}
diff --git a/graphics/pgf/contrib/fancyqr/fancyqr-style-blobs.code b/graphics/pgf/contrib/fancyqr/fancyqr-style-blobs.code
index bfc7e776ec..9746c52376 100644
--- a/graphics/pgf/contrib/fancyqr/fancyqr-style-blobs.code
+++ b/graphics/pgf/contrib/fancyqr/fancyqr-style-blobs.code
@@ -3,11 +3,11 @@
\@tempcnta=\z@
\roundjoin
\roundcap
-\moveto(0,0)
+\moveto(.5,.5)
\loop
\advance\@tempcnta by 30
-\edef\rad{\fpeval{.2*\qr@modulesize+.115*\qr@modulesize*abs(rand())}}% fixed rand for both
-\lineto(\fpeval{cos(\@tempcnta)*\rad},\fpeval{sin(\@tempcnta)*\rad})
+\edef\rad{\fpeval{.1*\qr@modulesize+.13*\qr@modulesize*abs(rand())}}% fixed rand for both
+\lineto(\fpeval{cos(\@tempcnta)*\rad+.5},\fpeval{sin(\@tempcnta)*\rad+.5})
\ifnum\@tempcnta<360\relax
\repeat
\fillpath
diff --git a/graphics/pgf/contrib/fancyqr/fancyqr-style-dots.code b/graphics/pgf/contrib/fancyqr/fancyqr-style-dots.code
index f7fd55e139..ced7e7a720 100644
--- a/graphics/pgf/contrib/fancyqr/fancyqr-style-dots.code
+++ b/graphics/pgf/contrib/fancyqr/fancyqr-style-dots.code
@@ -1,4 +1,4 @@
-\def\fancyqr@dots@circle{\put(.5,.5){\circle*{\@ne}}}
+\def\fancyqr@dots@circle{\put(.5,.5){\circle*{\@ne}}}%
% .
\newpattern0000{\fancyqr@dots@circle}%
% | | - -
diff --git a/graphics/pgf/contrib/fancyqr/fancyqr-style-flat.code b/graphics/pgf/contrib/fancyqr/fancyqr-style-flat.code
index 023dd3d4a4..649f27d1bc 100644
--- a/graphics/pgf/contrib/fancyqr/fancyqr-style-flat.code
+++ b/graphics/pgf/contrib/fancyqr/fancyqr-style-flat.code
@@ -1,3 +1,4 @@
+\FancyQrHardCut%
\def\fancyqr@flat@rect{\moveto(0,0)\lineto(0,1)\lineto(1,1)\lineto(1,0)\lineto(0,0)\fillpath}
% .
\newpattern0000{\fancyqr@flat@rect}%
diff --git a/graphics/pgf/contrib/fancyqr/fancyqr-style-swift.code b/graphics/pgf/contrib/fancyqr/fancyqr-style-swift.code
deleted file mode 100644
index 529213f04f..0000000000
--- a/graphics/pgf/contrib/fancyqr/fancyqr-style-swift.code
+++ /dev/null
@@ -1,2 +0,0 @@
-\PackageWarning{fancyqr}{Currently, swift is not supported :/}
-\FancyQrLoadDefault \ No newline at end of file
diff --git a/graphics/pgf/contrib/fancyqr/fancyqr.sty b/graphics/pgf/contrib/fancyqr/fancyqr.sty
index bb2b9f3ebb..88a4dc9dae 100644
--- a/graphics/pgf/contrib/fancyqr/fancyqr.sty
+++ b/graphics/pgf/contrib/fancyqr/fancyqr.sty
@@ -2,7 +2,7 @@
% Licensed under GNU General Public License version 3
% https://opensource.org/licenses/gpl-3.0.html
\def\filename{fancyqr}
-\ProvidesPackage{\filename}[2024/04/13 version v2.0 Fancy QR-Codes]
+\ProvidesPackage{\filename}[2024/11/27 version v2.2 Fancy QR-Codes]
\RequirePackage{pict2e, xfp, qrcode}
% element
@@ -32,18 +32,21 @@
\def\GetPattern{%
\ifcsname qcc\@up\@left\@right\@down\endcsname
\csname qcc\@up\@left\@right\@down\endcsname
-\else\rule\qr@modulesize\z@\fi}
+\fi}
% backwards compatibility
\def\fancyqr@clap#1{\hb@xt@\z@{\hss#1\hss}}
-\newdimen\fancyqr@edge@compensate
-\fancyqr@edge@compensate=.15\p@
+\newdimen\fancyqr@edge@compensate \fancyqr@edge@compensate=.15\p@
% is larger to be compensated by overlaps
\def\qrm{\dimexpr\qr@modulesize+\fancyqr@edge@compensate\relax}
\long\def\qr@newpattern#1#2#3#4#5{%
-\expandafter\def\csname qcc#1#2#3#4\endcsname{\parbox[b][\qr@modulesize]\qr@modulesize{\kern-\fancyqr@edge@compensate\relax\smash{\fancyqr@clap{\picture(\@ne,\@ne)#5\endpicture}}}%
-}}
+\expandafter\def\csname qcc#1#2#3#4\endcsname{% scaling happens implicitly by the unitlength
+ \put(\the\j,\the\numexpr\@max@y-\the\i){%
+ \advance\unitlength by\fancyqr@edge@compensate\relax
+ #5%
+ }}%
+}
% [#3][#2]
% [#4][#1]
@@ -97,11 +100,13 @@
\def\@fancy@qr@default@name{default}
\def\FancyQrLoad#1{%
+\protected@edef\fancyqr@loaded@style{#1}%
\def\fancyqr@rounded@rect@close{\fillpath}%
-\let\@tmp\newpattern\let\newpattern\qr@newpattern\@bsphack\def\@@tmp{#1}\ifx\@@tmp\@fancy@qr@default@name\FancyQrLoadDefault\else
+\let\@tmp\newpattern\let\newpattern\qr@newpattern\@bsphack\def\@@tmp{#1}%
+\ifx\@@tmp\@fancy@qr@default@name\FancyQrLoadDefault\else
\expandafter\edef\csname pingu@lib@#1@atcode\endcsname{\the\catcode`\@}%
\catcode`\@=11\relax
-\input{fancyqr-style-#1.code}
+\input{fancyqr-style-#1.code}%
\catcode`\@=\csname pingu@lib@#1@atcode\endcsname
\fi\@esphack\let\newpattern\@tmp\let\@tmp\relax}
@@ -116,12 +121,30 @@
\else\qr@white@format\fi
}%
-\def\FancyQrDoNotPrintSquare#1#2{\def\fancy@qr@donotprint@center@x{#1}\def\fancy@qr@donotprint@center@y{#2}}
+% #1 width
+% #2 height
+\def\FancyQrDoNotPrintSquare#1#2{%
+ \def\fancy@qr@donotprint@center@x{#1}%
+ \def\fancy@qr@donotprint@center@y{#2}%
+}
\FancyQrDoNotPrintSquare00
+% is a factor between 0 and 1
+\def\FancyQrDoNotPrintRadius#1{%
+ \def\fancy@qr@donotprint@center@r{#1}%
+}
+\FancyQrDoNotPrintRadius0
\newif\iffancy@qr@do@print@
\def\qr@fancy@updateif#1#2{\fancy@qr@do@print@true
-\ifnum#1>\@do@y@min\relax \ifnum#1<\@do@y@max\relax \ifnum#2>\@do@x@min\relax \ifnum#2<\@do@x@max\relax \fancy@qr@do@print@false \fi\fi\fi\fi}
+\ifdim\fancy@qr@donotprint@center@r\p@>\z@
+ \ifnum#1>\@do@y@min\relax \ifnum#1<\@do@y@max\relax \ifnum#2>\@do@x@min\relax \ifnum#2<\@do@x@max\relax
+ \ifdim\fpeval{sqrt((#1-\@half@max@y)^2 + (#2-\@half@max@x)^2)}\p@<\@max@rcrad\p@
+ \fancy@qr@do@print@false
+ \fi
+ \fi\fi\fi\fi
+\else
+\ifnum#1>\@do@y@min\relax \ifnum#1<\@do@y@max\relax \ifnum#2>\@do@x@min\relax \ifnum#2<\@do@x@max\relax \fancy@qr@do@print@false \fi\fi\fi\fi\fi
+}
\newif\iffancy@qr@roundcut@
\fancy@qr@roundcut@true
@@ -142,60 +165,67 @@
\newif\if@fancyqr@image@
+\def\qr@white{0}\def\qr@black{1}%
\def\fancy@qr@printmatrix#1{%
- \def\qr@white{0}\def\qr@black{1}%
\protected@edef\fancyqr@currprint{#1}%
- \let\qr@black@fixed\qr@black
- \let\qr@white@fixed\qr@white
- \let\qr@black@format\qr@black
- \let\qr@white@format\qr@white
+ \let\qr@black@fixed\qr@black \let\qr@white@fixed\qr@white
+ \let\qr@black@format\qr@black \let\qr@white@format\qr@white
%Set module size
- \qr@modulesize=\qr@desiredheight
+ \qr@modulesize=\qr@desiredheight\relax
\divide\qr@modulesize by \qr@size\relax
- \unitlength=\dimexpr\qr@modulesize+\fancyqr@edge@compensate\relax % initialize unitlength once
+ \unitlength=\dimexpr\qr@modulesize\relax % will be re-set in placement
\if@fancyqr@image@% image is in \fancyqr@imgbox
\edef\@x{\fpeval{ceil((.5\wd\fancyqr@imgbox)/\qr@modulesize)+\fancyqr@img@padding@x}}%
\edef\@y{\fpeval{ceil((.5\ht\fancyqr@imgbox+.5\dp\fancyqr@imgbox)/\qr@modulesize)+\fancyqr@img@padding@y}}%
\FancyQrDoNotPrintSquare\@x\@y
\fi
\qr@minipagewidth=\qr@desiredheight
- \ifqr@tight \advance\qr@minipagewidth by -\qr@modulesize \else \advance\qr@minipagewidth by 7\qr@modulesize \fi
- \minipage\qr@minipagewidth%
- \hfuzz=\qr@modulesize
- \baselineskip=\qr@modulesize
- \lineskiplimit=\z@ \lineskip=\z@ \parskip=\z@
- \ifqr@tight\else\rule\z@{4\qr@modulesize}\par\fi% %Blank space at top.
+ \ifqr@tight\else \advance\qr@minipagewidth by 8\qr@modulesize\relax \fi
+ \begingroup
\edef\@max@x{\qr@numberofrowsinmatrix\fancyqr@currprint}\edef\@half@max@x{\the\numexpr\@max@x/2}%
\edef\@max@y{\qr@numberofcolsinmatrix\fancyqr@currprint}\edef\@half@max@y{\the\numexpr\@max@y/2}%
+ % redefine the border to be white!
+ \qr@for \i=\@ne to \@max@y by \@ne{%
+ % redefine the limits to be white!
+ \qr@storetomatrix\fancyqr@currprint{\the\numexpr\z@}{\the\i}{\qr@white}%
+ \qr@storetomatrix\fancyqr@currprint{\the\numexpr\@max@x+\@ne}{\the\i}{\qr@white}%
+ }%
+ \qr@for \i=\@ne to \@max@x by \@ne{%
+ \qr@storetomatrix\fancyqr@currprint{\the\i}{\the\numexpr\z@}{\qr@white}%
+ \qr@storetomatrix\fancyqr@currprint{\the\i}{\the\numexpr\@max@y+\@ne}{\qr@white}%
+ }%
\edef\@do@x@min{\the\numexpr\@half@max@x-\fancy@qr@donotprint@center@x-\@ne}%
\edef\@do@x@max{\the\numexpr\@half@max@x+\fancy@qr@donotprint@center@x+\@ne}%
\edef\@do@y@min{\the\numexpr\@half@max@y-\fancy@qr@donotprint@center@y-\@ne}%
\edef\@do@y@max{\the\numexpr\@half@max@y+\fancy@qr@donotprint@center@y+\@ne}%
- \qr@for \i=\@ne to \@max@y by \@ne{%
- \ifqr@tight\else\rule{4\qr@modulesize}\z@\fi% %Blank space at left.
- \qr@for \j=\@ne to \@max@x by \@ne{%
+ \edef\@max@rcrad{\fpeval{max((\@ne-\fancy@qr@donotprint@center@r)*\fancy@qr@donotprint@center@x,(\@ne-\fancy@qr@donotprint@center@r)*\fancy@qr@donotprint@center@y)+\fancyqr@edge@compensate}}%
+ \edef\@tmp@tight{\ifqr@tight\z@\else-4\fi}%
+ \picture(\qr@minipagewidth,\qr@minipagewidth)(\the\numexpr\@ne+\@tmp@tight,\@tmp@tight)
+ \qr@for \i=\@ne to \@max@y by \@ne{\qr@for \j=\@ne to \@max@x by \@ne{%
\qr@fancy@updateif\i\j
\iffancy@qr@do@print@
- \edef\@mid{\qr@matrixentry\fancyqr@currprint{\the\i}{\the\j}}%
- \ifnum\@mid=\qr@white
- \rule\qr@modulesize\z@
- \else% if not white, get its pattern
- \iffancy@qr@roundcut@\qr@fancy@clear@surround\fancyqr@currprint{\the\i}{\the\j}\fi
- \edef\@up{\qr@matrixentry\fancyqr@currprint{\the\numexpr\the\i-1}{\the\j}}%
- \edef\@left{\qr@matrixentry\fancyqr@currprint{\the\i}{\the\numexpr\the\j-1}}%
- \edef\@right{\qr@matrixentry\fancyqr@currprint{\the\i}{\the\numexpr\the\j+1}}%
- \edef\@down{\qr@matrixentry\fancyqr@currprint{\the\numexpr\the\i+1}{\the\j}}%
- \FancyQrColor{\GetPattern}%
- \fi\else \rule\qr@modulesize\z@\fi
- }\par}%
- \ifqr@tight\else\rule\z@{4\qr@modulesize}\par\fi
- \endminipage
- \if@fancyqr@image@\nobreak
- \llap{\parbox\qr@minipagewidth{\centering\usebox\fancyqr@imgbox}%
- % if half the width is odd, offset by half a module width, done by centering
- \edef\@halfcheck{\fpeval{round(\fancy@qr@donotprint@center@x/2)}}%
- \ifodd\@halfcheck \kern.5\qr@modulesize\fi
- }\fi
+ \edef\@mid{\qr@matrixentry\fancyqr@currprint{\the\i}{\the\j}}%
+ \ifnum\@mid=\qr@black\relax
+ \iffancy@qr@roundcut@\qr@fancy@clear@surround\fancyqr@currprint{\the\i}{\the\j}\fi
+ \edef\@up{\qr@matrixentry\fancyqr@currprint{\the\numexpr\the\i-\@ne}{\the\j}}%
+ \edef\@left{\qr@matrixentry\fancyqr@currprint{\the\i}{\the\numexpr\the\j-\@ne}}%
+ \edef\@right{\qr@matrixentry\fancyqr@currprint{\the\i}{\the\numexpr\the\j+\@ne}}%
+ \edef\@down{\qr@matrixentry\fancyqr@currprint{\the\numexpr\the\i+\@ne}{\the\j}}%
+ \FancyQrColor{\GetPattern}%
+ \fi\fi
+ }}%
+ \if@fancyqr@image@
+ % floating point mid
+ \put(\fpeval{.5*\@max@x+.5},\fpeval{.5*\@max@y}){%
+ \edef\@halfcheck{\fpeval{round(\fancy@qr@donotprint@center@x/2)}}%
+ \raisebox{-.5\height}{\clap{% TODO: remove this offset
+ \ifodd\@halfcheck \else\kern\qr@modulesize\fi
+ \usebox\fancyqr@imgbox
+ }}%
+ }%
+ \fi
+ \endpicture
+ \endgroup
}%
\def\fancy@qr@setup#1{%
@@ -263,6 +293,16 @@
\define@key{fancyqr}{random color}{\@fancyqr@randomcolor@true\def\@fancyqr@random@colors{#1}}
\define@key{fancyqr}{width}{\setkeys{qr}{height=#1}}
\define@key{fancyqr}{size}{\setkeys{qr}{height=#1}}
+\define@key{fancyqr}{compensate}{\setlength\fancyqr@edge@compensate{#1}}
+% \fancyqr@loaded@style
+\def\fancyqr@flat@style{flat}
+\define@boolkey{fancyqr}[@fancyqr@]{classic}[true]{} % if@fancyqr@classic
+\def\fancyqr@classic{%
+\ifx\fancyqr@loaded@style\fancyqr@flat@style\else\FancyQrLoad{\fancyqr@flat@style}\fi
+\setkeys{fancyqr}{%
+ gradient=false,color=black,l color=black,r color=black,compensate=\z@\relax
+}%
+}
\def\fancyqrset#1{\setkeys{qr,fancyqr}{#1}}
\fancyqrset{image padding=0,gradient=true,gradient angle=135,r color=teal,l color=purple}
@@ -275,12 +315,10 @@
\newcommand\@@fancyqr[1][]{\begingroup\@fancyqr@init
\ifqr@starinvoked\qr@hyperlinkfalse\fi
\setkeys{qr,fancyqr}{#1}%
+\if@fancyqr@classic\fancyqr@classic\fi%
\if@fancyqr@randomcolor@%
\ifcsname pgfmathdeclarerandomlist\endcsname\else
\PackageError{fancyqr}{Random colors requested but pgfmath not loaded}{Please load pgfmath if you want this}\fi
\pgfmathdeclarerandomlist{@@fancyqr@@randomcol}{\@fancyqr@random@colors}\let\FancyQrColor\@@fancyqr@color@random\else\if@fancyqr@gradient\let\FancyQrColor\@@fancyqr@color@gradient\fi\fi
\bgroup\qr@verbatimcatcodes\qr@setescapedspecials\qrcode@in}
\endinput
-
-% TODO: NEGATIVE PATTERNS IF MIDDLE IS 0
-% => make rounded negative corners
diff --git a/graphics/pgf/contrib/fancyqr/qr-example.tex b/graphics/pgf/contrib/fancyqr/qr-example.tex
index e0518297eb..fe32ae73c9 100644
--- a/graphics/pgf/contrib/fancyqr/qr-example.tex
+++ b/graphics/pgf/contrib/fancyqr/qr-example.tex
@@ -3,6 +3,7 @@
% https://opensource.org/licenses/gpl-3.0.html
\documentclass{article}
+\usepackage[T1]{fontenc}
\usepackage{fontawesome}
\usepackage{fancyqr}
@@ -13,13 +14,18 @@
% to showcase scalebox
\usepackage{graphicx}
+% for the coding font
+\usepackage{FiraMono}
+
\usepackage[active,tightpage]{preview} % for presentation
\setlength\PreviewBorder{15pt}
-\fancyqrset{size=3.25cm,level=H,padding}
+\fancyqrset{size=3.25cm, level=H, padding}
+\errorcontextlines=9999
\begin{document}
\preview
+\begin{center}
% \FancyQrDoNotPrintSquare{8}{9}
% \FancyQrHardCut
\mbox{\FancyQrLoad{blobs}%
@@ -28,6 +34,8 @@
\fancyqr{https://github.com/EagleoutIce/fancyqr}%
\FancyQrLoad{dots}%
\fancyqr[image={\textsf{\textbf{\textcolor{gray}{fancy}qr}}}, random color={@Red}{@Pink}{@Purple}{@DeepPurple}{@Indigo}{@Blue}{@Cyan}{@Teal}{@Green}{@Amber}{@Orange}{@DeepOrange}{@Brown}]{https://github.com/EagleoutIce/fancyqr}%
-}%
+}\\[4mm]
+\texttt{\textbackslash \textbf{fancyqr}\{\textcolor{@Grey}{https://github.com/EagleoutIce/fancyqr}\}}
+\end{center}
\endpreview
\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/fancyqr/qr-minimal.tex b/graphics/pgf/contrib/fancyqr/qr-minimal.tex
new file mode 100644
index 0000000000..b912709808
--- /dev/null
+++ b/graphics/pgf/contrib/fancyqr/qr-minimal.tex
@@ -0,0 +1,12 @@
+\documentclass{article}
+
+\usepackage{fancyqr}
+
+\usepackage[active,tightpage]{preview}
+\setlength\PreviewBorder{0pt}
+
+\begin{document}
+\preview
+\fancyqr[classic,padding]{https://github.com/EagleoutIce/fancyqr}
+\endpreview
+\end{document}
diff --git a/graphics/pgf/contrib/lie-hasse/README b/graphics/pgf/contrib/lie-hasse/README
index 1bd63c4cba..01eef69fb8 100644
--- a/graphics/pgf/contrib/lie-hasse/README
+++ b/graphics/pgf/contrib/lie-hasse/README
@@ -2,9 +2,9 @@ ___________________________________
Lie Hasse
- v1.01
+ v1.02
- 9 July 2024
+ 4 December 2024
___________________________________
Authors : Ben McKay
diff --git a/graphics/pgf/contrib/lie-hasse/lie-hasse.pdf b/graphics/pgf/contrib/lie-hasse/lie-hasse.pdf
index ed444cc7d1..ca9f2ffbe8 100644
--- a/graphics/pgf/contrib/lie-hasse/lie-hasse.pdf
+++ b/graphics/pgf/contrib/lie-hasse/lie-hasse.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/lie-hasse/lie-hasse.sty b/graphics/pgf/contrib/lie-hasse/lie-hasse.sty
index 6d727c841c..7e74fa73ca 100644
--- a/graphics/pgf/contrib/lie-hasse/lie-hasse.sty
+++ b/graphics/pgf/contrib/lie-hasse/lie-hasse.sty
@@ -1,5 +1,5 @@
% The Lie Hasse package.
-% Version 1.01
+% Version 1.02
%
%
% This package draws Hasse diagrams of root system posets of simple
@@ -11,7 +11,7 @@
% Released under the LaTeX Project Public License v1.3c or later, see
% http://www.latex-project.org/lppl.txt
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
-\ProvidesPackage{lie-hasse}[2024/07/09 Lie Hasse]
+\ProvidesPackage{lie-hasse}[2024/12/04 Lie Hasse]
\RequirePackage[rgb]{xcolor}
\RequirePackage{dynkin-diagrams}
\RequirePackage[outline]{contour}
@@ -263,14 +263,33 @@
}%
\fi%
}%
+%\NewDocumentCommand\hasseAttachGtwoBackwards{}%
+%{%
+% \dynkin[vertical shift=0,%
+% edge length=\lie@hasse@edge@length,%
+% reverse arrows]{G}{\dynkin@roots}%
+%}%
+%\NewDocumentCommand\hasseAttachGtwoForwards{}%
+%{%
+% \dynkin[vertical shift=0,%
+% edge length=\lie@hasse@edge@length]{G}{\dynkin@roots}%
+%}%
\NewDocumentCommand\hasseAttachGtwo{}%
{%
\dynkin[vertical shift=0,%
- edge length=\lie@hasse@edge@length,%
-% label,%
-% backwards,%
-% x shift in edge lengths=-1
-]{G}{\dynkin@roots}%
+ edge length=\lie@hasse@edge@length]{G}{\dynkin@roots}%
+%\IfStrEqCase{\dynkin@ordering}{%
+% {Adams}{\hasseAttachGtwoForwards}%
+% {Bourbaki}{\hasseAttachGtwoForwards}%
+% {Carter}{\hasseAttachGtwoBackwards}%
+% {Dynkin}{\hasseAttachGtwoBackwards}%
+% {Kac}{\hasseAttachGtwoBackwards}%
+%}%
+%[\ClassError%
+% {Lie Hasse}%
+% {Root ordering \dynkin@ordering{} %
+% not Adams, Bourbaki, Carter, Dynkin or Kac when attaching G2 Dynkin diagram}%
+% {}]%
}%
\newcount\lie@hasse@E@shift%
\NewDocumentCommand\attachDynkin{}%
@@ -372,6 +391,7 @@
%%%
%%% Package internals:
%%%
+\tikzset{/Dynkin diagram/ordering=Carter}
\pgfdeclarelayer{Dynkin middle}
\pgfdeclarelayer{Dynkin above}
\pgfsetlayers{background,Dynkin behind,Dynkin middle,Dynkin above,main}
@@ -1833,9 +1853,29 @@
#2 1%
\fi\fi\fi%
}%
+\NewDocumentCommand\hasse@G@AB{}%
+{%
+\hasse@X{{0,2},{1},{1},{1},{1}}{{1+2<1,2+1>1},{1+1<1},{1+1<1},{1+2<1}}%AB
+}%
+\NewDocumentCommand\hasse@G@CDK{}%
+{%
+\hasse@X{{0,2},{1},{1},{1},{1}}{{1+2<1,2+1>1},{1+2<1},{1+2<1},{1+1<1}}%CDK
+}%
\NewDocumentCommand\hasse@G{}%
{%
-\hasse@X{{0,2},{1},{1},{1},{1}}{{1+2<1,2+1>1},{1+1<1},{1+1<1},{1+2<1}}%
+\IfStrEqCase{\dynkin@ordering}%
+{%
+ {Adams}{\hasse@G@AB}%
+ {Bourbaki}{\hasse@G@AB}%
+ {Carter}{\hasse@G@CDK}%
+ {Dynkin}{\hasse@G@CDK}%
+ {Kac}{\hasse@G@CDK}%
+}%
+[\ClassError%
+ {Lie Hasse}%
+ {Root ordering ``\dynkin@ordering'' %
+ not Adams, Bourbaki, Carter, Dynkin or Kac when attaching G2 Dynkin diagram}%
+ {}]%
}%
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\lie@hasse@repeat@string}{O{}mm}
@@ -2479,7 +2519,7 @@
10;1=1.3.4.2,%
11;1=2.3.4.2}%
}%
-\NewDocumentCommand\hasse@set@G@root@sums{}%
+\NewDocumentCommand\hasse@set@G@root@sums@AB{}%
{%
\forcsvlist{\do@hasse@list}{%
1;1=1.0,%
@@ -2489,6 +2529,32 @@
4;1=3.1,%
5;1=3.2}%
}%
+\NewDocumentCommand\hasse@set@G@root@sums@CDK{}%
+{%
+\forcsvlist{\do@hasse@list}{%
+1;1=1.0,%
+1;2=0.1,%
+2;1=1.1,%
+3;1=1.2,%
+4;1=1.3,%
+5;1=2.3}%
+}%
+\NewDocumentCommand\hasse@set@G@root@sums{}%
+{%
+\IfStrEqCase{\dynkin@ordering}%
+{%
+ {Adams}{\hasse@set@G@root@sums@AB}%
+ {Bourbaki}{\hasse@set@G@root@sums@AB}%
+ {Carter}{\hasse@set@G@root@sums@CDK}%
+ {Dynkin}{\hasse@set@G@root@sums@CDK}%
+ {Kac}{\hasse@set@G@root@sums@CDK}%
+}%
+[\ClassError%
+ {Lie Hasse}%
+ {Root ordering ``\dynkin@ordering'' %
+ not Adams, Bourbaki, Carter, Dynkin or Kac when setting root sums for G2 Dynkin diagram}%
+ {}]%
+}%
\NewDocumentCommand\forAllPositiveRoots{m}%
{%
\rootSystemHeight{\lie@hasse@height}%
diff --git a/graphics/pgf/contrib/lie-hasse/lie-hasse.tex b/graphics/pgf/contrib/lie-hasse/lie-hasse.tex
index 762639c603..752af00af7 100644
--- a/graphics/pgf/contrib/lie-hasse/lie-hasse.tex
+++ b/graphics/pgf/contrib/lie-hasse/lie-hasse.tex
@@ -1,5 +1,5 @@
\documentclass{amsart}
-\title[The Lie Hasse package]{The Lie Hasse package \\ Version 1.01}
+\title[The Lie Hasse package]{The Lie Hasse package \\ Version 1.02}
%% My name:
\makeatletter
\DeclareRobustCommand{\scotsMc}{\scotsMcx{c}}
@@ -19,7 +19,7 @@
\author{\authorsname}
\address{School of Mathematical Sciences, University College Cork, Cork, Ireland}
\email{b.mckay@ucc.ie}
-\date{9 July 2024}
+\date{4 December 2024}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenx}
\usepackage{etoolbox}
@@ -135,6 +135,9 @@ The Hasse diagram of \(B_4\) is
\hasse[attach Dynkin diagram=true]B4
\end{center}
\end{tcblisting}
+
+\newpage
+
Unfortunately, attaching a Dynkin diagram looks terrible for \(D\) or \(E\) series, so a Dynkin diagram appears below.
\begin{tcblisting}{title={Attaching the Dynkin diagram}}
The Hasse diagram of \(D_5\) is
@@ -262,8 +265,10 @@ The \verb!show height! option:
\tikzset{/Lie Hasse diagram,show name=true,show height=true}
\hasseDiagrams{G2}
\end{Verbatim}
+\begin{center}
\tikzset{/Lie Hasse diagram,show name=true,show height=true}
\hasse G2
+\end{center}
The \verb!show widths! option:
\begin{Verbatim}
@@ -356,6 +361,7 @@ Inside a \TikZ{} or \verb!dynkinDiagram! environment:
\forAllPositiveRoots{\foo}%
\end{tikzpicture}
\end{Verbatim}
+\begin{center}
\begingroup
\tikzset{/Lie Hasse diagram/edge quotes/.style={opacity=0},
/Dynkin diagram/edge length=1.5cm}
@@ -363,16 +369,19 @@ Inside a \TikZ{} or \verb!dynkinDiagram! environment:
\hasse D6%
\forAllPositiveRoots{\foo}%
\end{tikzpicture}
+\end{center}
If you put this into the \verb!for all roots! option, it executes on its own:
\begin{Verbatim}
\tikzset{/Lie Hasse diagram/for all roots/.code 2 args={\foo{#1}{#2}}}
\hasseDiagrams{C4;D4}
\end{Verbatim}
+\begin{center}
\begingroup
\tikzset{/Lie Hasse diagram/for all roots/.code 2 args={\foo{#1}{#2}}}
\hasseDiagrams{C4;D4}
\endgroup
+\end{center}
\endgroup
\section{Three dimensional effect}
@@ -436,7 +445,9 @@ Ringel \cite{Ringel:2013} labels his edges like
\begin{Verbatim}
\hasse[labels={f,e,d,c,u,b,a}]E7
\end{Verbatim}
+\begin{center}
\hasse[labels={f,e,d,c,u,b,a}]E7
+\end{center}
\section{Parabolic subgroups}
This package offers nothing over Ringel's original pictures, except that the user can pick some simple roots whose associated edges are drawn differently.
@@ -447,8 +458,10 @@ We let the reader explore the notation for parabolic subgroups in the Dynkin dia
\hasse D{**x*x*x*}
\end{Verbatim}
\begingroup
+\begin{center}
\tikzset{/Lie Hasse diagram,attach Dynkin diagram=true,three D=false}
\hasse D{**x*x*x*}
+\end{center}
\endgroup
Our motivation comes from trying to identify the invariant vector subbundles of the tangent bundle of a rational homogeneous variety \cite{MathOverflow:123801}.
@@ -459,33 +472,47 @@ By default, noncompact root edges are not drawn.
\begin{Verbatim}
\hasse E{*xx*x*}
\end{Verbatim}
+\begin{center}
\hasse E{*xx*x*}
+\end{center}
\begin{Verbatim}
\hasse A{x*x*}
\end{Verbatim}
+\begin{center}
\hasse A{x*x*}
+\end{center}
\begin{Verbatim}
\hasse[parabolic=113]B8
\end{Verbatim}
+\begin{center}
\hasse[parabolic=113]B8
+\end{center}
\begin{Verbatim}
\hasse C{**xx*x**}
\end{Verbatim}
+\begin{center}
\hasse C{**xx*x**}
+\end{center}
\newpage
\begin{Verbatim}
\hasse E{*x*x*x**}
\end{Verbatim}
+\begin{center}
\hasse E{*x*x*x**}
+\end{center}
\newpage
\begin{Verbatim}
\hasse F{**xx}
\end{Verbatim}
+\begin{center}
\hasse F{**xx}
+\end{center}
\begin{Verbatim}
\hasse G{*x}
\end{Verbatim}
+\begin{center}
\hasse G{*x}
+\end{center}
\endgroup
\section{Examples}
diff --git a/graphics/pgf/contrib/luatikz/README.txt b/graphics/pgf/contrib/luatikz/README.txt
new file mode 100644
index 0000000000..14930dc4d3
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/README.txt
@@ -0,0 +1,9 @@
+-----------------
+Luatikz is a graphics library to draw tikz graphics
+using the Lua programming language.
+-----------------
+
+License:
+
+LaTeX Project Public License 1.3c
+MIT License (expat)
diff --git a/graphics/pgf/contrib/luatikz/example/bezier2.lua b/graphics/pgf/contrib/luatikz/example/bezier2.lua
new file mode 100644
index 0000000000..55f7766ec0
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/bezier2.lua
@@ -0,0 +1,11 @@
+tikz.within( '*' )
+
+local bz =
+ bezier2{
+ p1 = p{ 0, 0 },
+ pc = p{ 2, 2 },
+ p2 = p{ 4, 0 },
+ }
+
+draw{ line_width=1, bz }
+bz.drawHelpers( 'p' )
diff --git a/graphics/pgf/contrib/luatikz/example/bezier3a.lua b/graphics/pgf/contrib/luatikz/example/bezier3a.lua
new file mode 100644
index 0000000000..5c91a4238f
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/bezier3a.lua
@@ -0,0 +1,12 @@
+tikz.within( '*' )
+
+local bz =
+ bezier3{
+ p1 = p{ 0, 0 },
+ pc1 = p{ 1, 2 },
+ pc2 = p{ 3, 3 },
+ p2 = p{ 4, 0 },
+ }
+
+draw{ line_width=1, bz }
+bz.drawHelpers( 'p' )
diff --git a/graphics/pgf/contrib/luatikz/example/bezier3b.lua b/graphics/pgf/contrib/luatikz/example/bezier3b.lua
new file mode 100644
index 0000000000..54a2a982ce
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/bezier3b.lua
@@ -0,0 +1,32 @@
+tikz.within( '*' )
+
+local bz =
+ bezier3{
+ p1 = p{ 0, 0 },
+ pc1 = p{ 1, 2 },
+ pc2 = p{ 3, 3 },
+ p2 = p{ 4, 0 },
+ }
+
+draw{ line_width = 1, bz }
+
+for t = 0, 1, 0.1
+do
+ local pt = bz.pt( t )
+ draw{
+ fill = black,
+ circle{
+ at = pt,
+ radius = 0.05,
+ }
+ }
+
+ local phit = bz.phit( t ) + math.pi / 2
+ draw{
+ line{
+ p1 = pt,
+ phi = phit,
+ length = 1,
+ }
+ }
+end
diff --git a/graphics/pgf/contrib/luatikz/example/blinea.lua b/graphics/pgf/contrib/luatikz/example/blinea.lua
new file mode 100644
index 0000000000..8a49476e51
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/blinea.lua
@@ -0,0 +1,23 @@
+tikz.within( '*' )
+
+local l1 = bline{ p{ 0, 0 }, p{ 2, 3 }, bend_right = 45 }
+local l2 = bline{ p{ 0, 3 }, p{ 2, 1 }, bend_left = 30 }
+
+draw{ draw=red, l1 }
+draw{ draw=blue, l2 }
+put{
+ node{
+ at = l1.pc,
+ anchor = south,
+ rotate = l1.line.phi * 180 / math.pi,
+ text = 'red',
+ }
+}
+put{
+ node{
+ at = l2.pc,
+ anchor = south,
+ rotate = l2.line.phi * 180 / math.pi,
+ text = 'blue',
+ }
+}
diff --git a/graphics/pgf/contrib/luatikz/example/circle.lua b/graphics/pgf/contrib/luatikz/example/circle.lua
new file mode 100644
index 0000000000..ba85c04e5a
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/circle.lua
@@ -0,0 +1,12 @@
+tikz.within( '*' )
+
+draw{
+ circle{
+ at = p{ 0, 0 },
+ radius = 2,
+ },
+ circle{
+ at = p{ 2, 1 },
+ radius = 1,
+ }
+}
diff --git a/graphics/pgf/contrib/luatikz/example/curvea.lua b/graphics/pgf/contrib/luatikz/example/curvea.lua
new file mode 100644
index 0000000000..b1d6b85506
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/curvea.lua
@@ -0,0 +1,14 @@
+tikz.within( '*' )
+
+local c =
+ curve{
+ points =
+ {
+ p{ 0, 0 },
+ p{ 2, 2 },
+ p{ 4, 0 },
+ },
+ }
+
+draw{ line_width=1, c }
+c.drawHelpers( 'p' )
diff --git a/graphics/pgf/contrib/luatikz/example/curveb.lua b/graphics/pgf/contrib/luatikz/example/curveb.lua
new file mode 100644
index 0000000000..194127837a
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/curveb.lua
@@ -0,0 +1,16 @@
+tikz.within( '*' )
+
+local c =
+ curve{
+ points =
+ {
+ p{ 0, 0 },
+ p{ 2, 2 },
+ p{ 4, 0 },
+ },
+ cycle = true,
+ tension = 1.0,
+ }
+
+draw{ line_width=1, c }
+c.drawHelpers( 'p' )
diff --git a/graphics/pgf/contrib/luatikz/example/ellipse.lua b/graphics/pgf/contrib/luatikz/example/ellipse.lua
new file mode 100644
index 0000000000..c648e81320
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/ellipse.lua
@@ -0,0 +1,14 @@
+tikz.within( '*' )
+
+draw{
+ ellipse{
+ at = p{ 0, 0 },
+ xradius = 3,
+ yradius = 2,
+ },
+ ellipse{
+ at = p{ 2, 1 },
+ xradius = 1.5,
+ yradius = 1,
+ }
+}
diff --git a/graphics/pgf/contrib/luatikz/example/ellipseArc.lua b/graphics/pgf/contrib/luatikz/example/ellipseArc.lua
new file mode 100644
index 0000000000..97536d3836
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/ellipseArc.lua
@@ -0,0 +1,18 @@
+tikz.within( '*' )
+
+draw{
+ ellipseArc{
+ at = p{ 0, 0 },
+ from = 0,
+ to = 90,
+ xradius = 3,
+ yradius = 2,
+ },
+ ellipseArc{
+ at = p{ 2, 1 },
+ xradius = 1.5,
+ yradius = 1,
+ from = -45,
+ to = 45,
+ }
+}
diff --git a/graphics/pgf/contrib/luatikz/example/immute1.lua b/graphics/pgf/contrib/luatikz/example/immute1.lua
new file mode 100644
index 0000000000..39b0e08a42
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/immute1.lua
@@ -0,0 +1,4 @@
+tikz.within( '*' )
+
+local p1 = p{ 1, 1 }
+p1.x = p1.x + 2
diff --git a/graphics/pgf/contrib/luatikz/example/immute2.lua b/graphics/pgf/contrib/luatikz/example/immute2.lua
new file mode 100644
index 0000000000..3c69f4b6b5
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/immute2.lua
@@ -0,0 +1,6 @@
+tikz.within( '*' )
+
+local p1 = p{ 1, 1 }
+p1 = p{ p1.x + 2, p1.y }
+-- or
+p1 = p1 + p{ 2, 0 }
diff --git a/graphics/pgf/contrib/luatikz/example/intro.lua b/graphics/pgf/contrib/luatikz/example/intro.lua
new file mode 100644
index 0000000000..9752fd464e
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/intro.lua
@@ -0,0 +1,8 @@
+tikz.within( '*' )
+
+local p1 = p{ 1, 1 }
+local p2 = p{ 6, 2 }
+local l1 = line{ p1, p2 }
+
+draw{ l1 }
+draw{ line{ p{ 2, 2 }, p{ 3, 3 } } }
diff --git a/graphics/pgf/contrib/luatikz/example/linea.lua b/graphics/pgf/contrib/luatikz/example/linea.lua
new file mode 100644
index 0000000000..fcc4a78989
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/linea.lua
@@ -0,0 +1,7 @@
+tikz.within( '*' )
+
+local l1 = line{ p{ 0, 0 }, p{ 2, 3 } }
+local l2 = line{ p1 = p{ 0, 3 }, p2 = p{ 2, 1 } }
+
+draw{ l1 }
+draw{ l2 }
diff --git a/graphics/pgf/contrib/luatikz/example/lineb.lua b/graphics/pgf/contrib/luatikz/example/lineb.lua
new file mode 100644
index 0000000000..0faf904967
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/lineb.lua
@@ -0,0 +1,9 @@
+tikz.within( '*' )
+
+local l1 = line{ p{ 0, 0 }, p{ 2, 3 } }
+local l2 = line{ p1 = p{ 0, 3 }, p2 = p{ 2, 1 } }
+local pi = l1.intersectLine( l2 )
+
+draw{ l1 }
+draw{ l2 }
+draw{ circle{ at = pi, radius = 0.1 } }
diff --git a/graphics/pgf/contrib/luatikz/example/linec.lua b/graphics/pgf/contrib/luatikz/example/linec.lua
new file mode 100644
index 0000000000..115def104b
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/linec.lua
@@ -0,0 +1,7 @@
+tikz.within( '*' )
+
+draw{ line{
+ p1 = p{ 0, 0 },
+ phi = -math.pi / 4,
+ length = 2,
+} }
diff --git a/graphics/pgf/contrib/luatikz/example/lined.lua b/graphics/pgf/contrib/luatikz/example/lined.lua
new file mode 100644
index 0000000000..38bc0eaa08
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/lined.lua
@@ -0,0 +1,15 @@
+tikz.within( '*' )
+
+local l = line{ p{ 0, 0 }, p{ 5, 0 } }
+draw{ l }
+
+for i = 1, 10
+do
+ l =
+ line{
+ p1 = l.p2,
+ phi = l.phi + math.pi / 5,
+ length = l.length * 2 / 3,
+ }
+ draw{ l }
+end
diff --git a/graphics/pgf/contrib/luatikz/example/nodea.lua b/graphics/pgf/contrib/luatikz/example/nodea.lua
new file mode 100644
index 0000000000..4d34f2c099
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/nodea.lua
@@ -0,0 +1,12 @@
+tikz.within( '*' )
+
+put{
+ node{
+ at = p{ 0, 0 },
+ text = [[$a^2 + b^2 = c^2$]],
+ },
+ node{
+ at = p{ 2, 1 },
+ text = [[$sin(\phi) = \frac{b}{a}$]],
+ }
+}
diff --git a/graphics/pgf/contrib/luatikz/example/nodeb.lua b/graphics/pgf/contrib/luatikz/example/nodeb.lua
new file mode 100644
index 0000000000..85d8aeb49e
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/nodeb.lua
@@ -0,0 +1,18 @@
+tikz.within( '*' )
+
+local r1 =
+ rect{
+ pc = p{ 0, 0 },
+ size = p{ 3, 3 },
+ }
+
+draw{ r1 }
+
+put{
+ node{
+ at = r1.pc,
+ text = [[this is the center of a rect]],
+ text_width = '2cm',
+ rotate = 45,
+ },
+}
diff --git a/graphics/pgf/contrib/luatikz/example/plota.lua b/graphics/pgf/contrib/luatikz/example/plota.lua
new file mode 100644
index 0000000000..1a5721082e
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/plota.lua
@@ -0,0 +1,14 @@
+tikz.within( '*' )
+
+draw{
+ plot{
+ at = p{ 0, 0 },
+ from = 0,
+ to = 5,
+ step = 0.05,
+ func =
+ function( d )
+ return p{ d, math.pow( d - 2.5, 2 ) / 2 }
+ end
+ }
+}
diff --git a/graphics/pgf/contrib/luatikz/example/polylinea.lua b/graphics/pgf/contrib/luatikz/example/polylinea.lua
new file mode 100644
index 0000000000..f19954798a
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/polylinea.lua
@@ -0,0 +1,11 @@
+tikz.within( '*' )
+
+draw{
+ polyline{
+ p{ 0, 0 },
+ p{ 2, 2 },
+ p{ 4, 0 },
+ p{ 3, -1 },
+ 'cycle',
+ }
+}
diff --git a/graphics/pgf/contrib/luatikz/example/radon1.lua b/graphics/pgf/contrib/luatikz/example/radon1.lua
new file mode 100644
index 0000000000..166c44c763
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/radon1.lua
@@ -0,0 +1,119 @@
+tikz.within( '*' )
+
+local cos = math.cos
+local sin = math.sin
+local pi = math.pi
+
+-- granularity of calculation
+local fine = 10
+
+-- factor the projection length is reduced
+local fproj = 0.35
+
+-- strength of the ellipse mediums
+local s1 = 1.00
+local s2 = 1.50
+local s3 = 1.75
+
+local e1 = ellipse{ at=p{ 0.00, 0.00 }, xradius=3.00, yradius=3.00 }
+local e2 = ellipse{ at=p{ 0.40, 1.20 }, xradius=0.85, yradius=0.50 }
+local e3 = ellipse{ at=p{ 0.00, -0.89 }, xradius=1.00, yradius=0.60 }
+
+draw{ fill='black!08!white', line_width=1, e1 }
+draw{ fill='black!16!white', line_width=1, e2 }
+draw{ fill='black!24!white', line_width=1, e3 }
+
+-- list of projection angles
+local listphi =
+{
+ -1/4 * pi,
+ 2/4 * pi,
+ 5/4 * pi,
+}
+
+-- length of projection lines
+local lenmaintop = 5.0
+local lenmainbot = 6.5
+
+for proji, phimain in ipairs( listphi )
+do
+ local lmain =
+ line{
+ p{ cos( phimain ), sin( phimain ) } * -lenmaintop,
+ p{ cos( phimain ), sin( phimain ) } * lenmainbot,
+ }
+ local phinorm = phimain - pi/2
+
+ -- gets a point on the projection.
+ -- dp: distance from projection center
+ -- dv: projection value
+ function getpproj( dp, dv )
+ return(
+ lmain.p2
+ + p{ cos( phinorm ) * dp, sin( phinorm ) * dp }
+ + p{ cos( phimain ) * dv * fproj, sin( phimain ) * dv * fproj }
+ )
+ end
+
+ -- distance of projection line
+ local ddis = 1 / fine
+
+ -- list of all projection points
+ local listp = { }
+
+ for i = -3.5 * fine, 3.5 * fine
+ do
+ local p1i =
+ lmain.p1
+ + p{ cos( phinorm ) * ddis * i, sin( phinorm ) * ddis * i }
+ local li = line{ p1i, p1i + ( lmain.p2 - lmain.p1 ) }
+ local lv = 0
+ local is1 = e1.intersectLine( li )
+
+ if is1 and #is1 > 1
+ then
+ local lis = line{ is1[ 1 ], is1[ 2 ] }
+ lv = lv + lis.length * s1
+ end
+
+ local is2 = e2.intersectLine( li )
+ if is2 and #is2 > 1
+ then
+ local lis = line{ is2[ 1 ], is2[ 2 ] }
+ lv = lv + lis.length * s2
+ end
+
+ local is3 = e3.intersectLine( li )
+ if is3 and #is3 > 1
+ then
+ local lis = line{ is3[ 1 ], is3[ 2 ] }
+ lv = lv + lis.length * s3
+ end
+
+ local pproj = getpproj( ddis * i, lv )
+ if i % ( 0.7 * fine ) == 0
+ then
+ draw{
+ dotted, arrow, line_width=0.5,
+ line{ li.p1, getpproj( ddis * i, -0.20 ) },
+ }
+ draw{
+ dotted, line_width=0.5,
+ line{ li.p1, pproj },
+ }
+ end
+ table.insert( listp, pproj )
+ end
+
+ -- draws the projection screen
+ local lenlproj = 8
+ draw{
+ line{
+ getpproj( lenlproj / 2, 0 ),
+ getpproj( -lenlproj / 2, 0 ),
+ }
+ }
+
+ -- draws the projection curve
+ draw{ line_width=1, polyline{ table.unpack( listp ) } }
+end
diff --git a/graphics/pgf/contrib/luatikz/example/recta.lua b/graphics/pgf/contrib/luatikz/example/recta.lua
new file mode 100644
index 0000000000..91c8203ef7
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/recta.lua
@@ -0,0 +1,21 @@
+tikz.within( '*' )
+
+local r1 =
+ rect{
+ pnw = p{ 0, 3 },
+ pse = p{ 3, 0 },
+ }
+
+local r2 =
+ rect{
+ psw = r1.pse,
+ size = p{ 1, 1 },
+ }
+
+local r3 =
+ rect{
+ pc = r1.pc,
+ size = p{ 1.5, 1.5 },
+ }
+
+draw{ r1, r2, r3 }
diff --git a/graphics/pgf/contrib/luatikz/example/shadea.lua b/graphics/pgf/contrib/luatikz/example/shadea.lua
new file mode 100644
index 0000000000..31e28dd314
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/shadea.lua
@@ -0,0 +1,9 @@
+tikz.within( '*' )
+
+shade{
+ ball_color = gray,
+ circle{
+ at = p0,
+ radius = 2,
+ },
+}
diff --git a/graphics/pgf/contrib/luatikz/example/sierpinski.lua b/graphics/pgf/contrib/luatikz/example/sierpinski.lua
new file mode 100644
index 0000000000..0b5588bf91
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/sierpinski.lua
@@ -0,0 +1,41 @@
+tikz.within( '*' )
+
+local s60 = math.sin( 60 / 180 * math.pi )
+local c60 = math.cos( 60 / 180 * math.pi )
+
+-- creates a table object having ptop, pleft and pright as points
+-- and a "draw yourself" function
+function equilateralTriangle( ptop, len )
+ return {
+ ptop = ptop,
+ pleft = ptop + p{ -len/2, -len*s60 },
+ pright = ptop + p{ len/2, -len*s60 },
+ draw =
+ function( self )
+ draw{
+ fill = black,
+ draw = none,
+ polyline{ self.ptop, self.pleft, self.pright, 'cycle' }
+ }
+ end
+ }
+end
+
+-- one step into the fractal
+-- ptop: top point of triangle
+-- len: current length
+-- level: current fractal level
+function drawFractal( ptop, len, level )
+ if level == 1
+ then
+ local t = equilateralTriangle( ptop, len )
+ t:draw( )
+ else
+ local ttop = equilateralTriangle( ptop, len / 2 )
+ drawFractal( ttop.ptop, len / 2, level - 1 )
+ drawFractal( ttop.pleft, len / 2, level - 1 )
+ drawFractal( ttop.pright, len / 2, level - 1 )
+ end
+end
+
+drawFractal( p{ 0, 0 }, 8, 6 )
diff --git a/graphics/pgf/contrib/luatikz/example/spiral.lua b/graphics/pgf/contrib/luatikz/example/spiral.lua
new file mode 100644
index 0000000000..12c135062e
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/spiral.lua
@@ -0,0 +1,16 @@
+tikz.within( '*' )
+
+local pi = p{ 0, 0 }
+local pdx = p{ 0.25, 0 }
+local pdy = p{ 0, 0.25 }
+
+for k = 1, 20
+do
+ local sign = 1
+ if k % 2 == 0 then sign = -1 end
+ local pn = pi + sign * k * pdx
+ local pn2 = pn + sign * k * pdy
+ draw{ line{ pi, pn }, line{ pn, pn2 } }
+ pi = pn2
+end
+
diff --git a/graphics/pgf/contrib/luatikz/example/stylea.lua b/graphics/pgf/contrib/luatikz/example/stylea.lua
new file mode 100644
index 0000000000..ef3805cdd0
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/stylea.lua
@@ -0,0 +1,19 @@
+tikz.within( '*' )
+
+local l1 = line{ p{ 0, 0 }, p{ 3, 1 } }
+local l2 = line{ p{ 0, -1 }, p{ 3, 0 } }
+local l3 = line{ p{ 0, -2 }, p{ 3, -1 } }
+
+draw{ arrow, l1 }
+draw{ double_arrow, dashed, l2 }
+draw{ color = purple, line_width = 2, dotted, l3 }
+
+put{ node{
+ at = l3.pc,
+ anchor = center,
+ align = center,
+ color = purple,
+ rotate = l3.phi * 180 / math.pi,
+ text = 'label for purple line',
+ text_width = '2cm',
+} }
diff --git a/graphics/pgf/contrib/luatikz/example/superEllipse.lua b/graphics/pgf/contrib/luatikz/example/superEllipse.lua
new file mode 100644
index 0000000000..32c629008c
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/example/superEllipse.lua
@@ -0,0 +1,22 @@
+tikz.within( '*' )
+
+local list = { 1, 1.5, 2, 4, 999 }
+
+for i, v in ipairs( list )
+do
+ local pi = p{ ( i - 1 ) * 2.5, 0 }
+ draw{
+ superEllipse{
+ at = pi,
+ n = v,
+ xradius = 1,
+ yradius = 1,
+ }
+ }
+ put{
+ node{
+ at = pi,
+ text = 'n = ' .. v,
+ }
+ }
+end
diff --git a/graphics/pgf/contrib/luatikz/luatikz.lua b/graphics/pgf/contrib/luatikz/luatikz.lua
new file mode 100644
index 0000000000..1c18f2f627
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/luatikz.lua
@@ -0,0 +1,1999 @@
+local _version = '2.12.0'
+
+if tikz
+then
+ if tikz.version ~= _version
+ then
+ error( 'version chaos' )
+ end
+ return
+end
+
+tikz = { version = _version }
+
+--==========================================================================--
+-- DEFINES
+--==========================================================================--
+
+-- directions
+tikz.north = 'north'
+tikz.north_east = 'north east'
+tikz.east = 'east'
+tikz.south_east = 'south east'
+tikz.south = 'south'
+tikz.south_west = 'south west'
+tikz.west = 'west'
+tikz.north_west = 'north west'
+
+-- colors
+tikz.black = 'black'
+tikz.blue = 'blue'
+tikz.brown = 'brown'
+tikz.cyan = 'cyan'
+tikz.darkgray = 'darkgray'
+tikz.gray = 'gray'
+tikz.green = 'green'
+tikz.lightgray = 'lightgray'
+tikz.lime = 'lime'
+tikz.magenta = 'magenta'
+tikz.olive = 'olive'
+tikz.orange = 'orange'
+tikz.pink = 'pink'
+tikz.purple = 'purple'
+tikz.red = 'red'
+tikz.teal = 'teal'
+tikz.violet = 'violet'
+tikz.yellow = 'yellow'
+tikz.white = 'white'
+
+-- align
+tikz.center = 'center'
+tikz.left = 'left'
+tikz.right = 'right'
+
+tikz.none = 'none'
+
+-- line caps
+tikz.round = 'round'
+
+--==========================================================================--
+-- HELPERS --
+--==========================================================================--
+
+-- if defined writes output here
+local outfile
+
+--
+-- Prints arguments to tex and to stdout.
+--
+local function tprint( ... )
+ local args = {...}
+ print( table.concat( args ) )
+
+ if tex
+ then
+ tex.print( table.concat( args ) )
+ end
+
+ if outfile
+ then
+ outfile:write( table.concat( args ) )
+ outfile:write( '\n%%% DO NOT EDIT THIS FILE %%%\n' )
+ end
+end
+tikz.tprint = tprint
+
+--
+-- Flattens an object stack.
+--
+-- The content of all numerated unclassed objects
+-- are put into a copy of obj.
+--
+local function flatten( o )
+ local r = { }
+ for _, v in ipairs( o )
+ do
+ if type( v ) == 'table' and getmetatable( v ) == nil
+ then
+ local fv = flatten( v )
+ for _, fvv in ipairs( fv )
+ do
+ table.insert( r, fvv )
+ end
+ for k, vv in pairs( fv )
+ do
+ if type( k ) ~= 'number'
+ then
+ r[ k ] = vv
+ end
+ end
+ else
+ table.insert( r, v )
+ end
+ end
+ -- copies (and overwrites) all named attributes
+ for k, v in pairs( o )
+ do
+ if type( k ) ~= 'number'
+ then
+ r[ k ] = v
+ end
+ end
+ return r
+end
+
+--
+-- A key marking an object having a zString function.
+--
+local _zString = { }
+
+--
+-- Converts everything to a tikz string.
+--
+local function zString( v )
+ if type( v ) == 'table' and v[ _zString ]
+ then
+ return v[ _zString ]( v )
+ end
+ return tostring( v )
+end
+
+--
+-- Creates an immutable class.
+--
+local function immutable( definer )
+ local def = { }
+ local lazy = { }
+ local proto = { }
+ def.lazy = lazy
+ def.proto = proto
+ definer( def ) -- the callee fills in data
+ local k = { } -- key the hidden table
+
+ local mt = { }
+ mt.__index =
+ function( self, key )
+ if key == 'id' then return def.id end
+
+ -- first check if native value
+ local v = self[ k ][ key ]
+ if v then return v end
+
+ -- then if a lazy function
+ local f = lazy[ key ]
+ if f
+ then
+ local v = f( self )
+ self[ k ][ key ] = v -- cache
+ return v
+ end
+
+ -- then if a proto value
+ v = proto[ key ]
+ if v
+ then
+ if type( v ) == 'function'
+ then
+ return(
+ function(...)
+ return v( self, table.unpack( {...} ) )
+ end
+ )
+ else
+ return v
+ end
+ end
+
+ -- otherwise
+ -- error( 'invalid property' )
+ end
+
+ mt.__newindex =
+ function( )
+ error( 'this is an immutable' )
+ end
+
+ if def.add
+ then
+ mt.__add = def.add
+ end
+
+ if def.concat
+ then
+ mt.__concat = def.concat
+ end
+
+ if def.div
+ then
+ mt.__div = def.div
+ end
+
+ if def.mul
+ then
+ mt.__mul = def.mul
+ end
+
+ if def.sub
+ then
+ mt.__sub = def.sub
+ end
+
+ if def.tostring
+ then
+ mt.__tostring = def.tostring
+ end
+
+ return function(...)
+ local args = {...}
+ local nt = def.constructor( table.unpack( args ) )
+ local o = { [ k ] = nt, [ _zString ] = def.zString }
+ setmetatable( o, mt )
+ return o
+ end
+end
+tikz.immutable = immutable
+
+--
+-- writes out direct options
+--
+local function _opts( s, _opts, haveOpts )
+ if not _opts
+ then
+ return haveOpts
+ end
+
+ for k, v in pairs( _opts )
+ do
+ if not haveOpts
+ then
+ table.insert( s, '[' )
+ else
+ table.insert( s, ',' )
+ end
+ haveOpts = true
+ if type( k ) == 'number'
+ then
+ table.insert( s, v )
+ else
+ table.insert( s, k..'='..v )
+ end
+ end
+ return haveOpts
+end
+
+-------------------------------------------------------------------------------
+-- Point.
+-------------------------------------------------------------------------------
+tikz.p =
+immutable( function( def )
+ def.id = 'point'
+
+ def.add =
+ function( left, right )
+ if right.id == 'line'
+ or right.id == 'bezier3'
+ then
+ return right + left
+ end
+
+ return tikz.p{ left.x + right.x, left.y + right.y }
+ end
+
+ def.concat =
+ function( left, right )
+ return zString( left )..zString( right )
+ end
+
+ -- constructor
+ def.constructor =
+ function( args )
+ return { x = args[ 1 ], y = args[ 2 ] }
+ end
+
+ -- divisor
+ def.div =
+ function( left, right )
+ return tikz.p{ left.x / right, left.y / right }
+ end
+
+ def.mul =
+ function( left, right )
+ if type( right ) == 'number'
+ then
+ return tikz.p{ left.x * right, left.y * right }
+ elseif type( left ) == 'number'
+ then
+ return tikz.p{ left * right.x, left * right.y }
+ elseif type( right ) == 'table'
+ then
+ if right.id == 'point'
+ then
+ return tikz.p{ left.x * right.x, left.y * right.y }
+ end
+ end
+ error( 'invalid operation' )
+ end
+
+ def.sub =
+ function( left, right )
+ return tikz.p{ left.x - right.x, left.y - right.y }
+ end
+
+ def.tostring =
+ function( self )
+ return 'p{ '..self.x..', '..self.y..' }'
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ return '('..self.x..','..self.y..')'
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- A full circle.
+-------------------------------------------------------------------------------
+tikz.circle =
+immutable( function( def )
+ def.id = 'circle'
+
+ -- constructor
+ def.constructor =
+ function( args )
+ return {
+ at = args.at,
+ radius = args.radius,
+ }
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ return zString( self.at )..' circle ('.. self.radius .. ')'
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- A quadratic bezier curve.
+-------------------------------------------------------------------------------
+tikz.bezier2 =
+immutable( function( def )
+ def.id = 'bezier2'
+
+ -- constructor
+ def.constructor =
+ function( args )
+ local p1 = args.p1
+ local pc = args.pc
+ local p2 = args.p2
+
+ return {
+ p1 = p1,
+ pc = pc,
+ p2 = p2,
+ }
+ end
+
+ -- draws helping information
+ def.proto.drawHelpers =
+ function( self, prefix )
+ tikz.draw{ draw = 'red', tikz.line{ self.p1, self.pc } }
+ tikz.draw{ draw = 'blue', tikz.line{ self.pc, self.p2 } }
+ if prefix ~= nil
+ then
+ tikz.put{ tikz.node{
+ at = self.p1,
+ anchor = 'north west',
+ text = prefix .. '1',
+ } }
+ tikz.put{ tikz.node{
+ at = self.pc,
+ anchor = 'north west',
+ text = prefix .. 'c',
+ } }
+ tikz.put{ tikz.node{
+ at = self.p2,
+ anchor = 'north west',
+ text = prefix .. '2',
+ } }
+ end
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ local s = { }
+ table.insert( s, zString( self.p1 ) )
+ table.insert( s, '.. controls' )
+ table.insert( s, zString( self.pc ) )
+ table.insert( s, '..' )
+ table.insert( s, zString( self.p2 ) )
+ return table.concat( s, ' ' )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- A cubic bezier curve.
+-------------------------------------------------------------------------------
+tikz.bezier3 =
+immutable( function( def )
+ def.id = 'bezier3'
+
+ def.add =
+ function( left, right )
+ if right.id == 'point'
+ then
+ return tikz.bezier3{
+ p1 = left.p1 + right,
+ pc1 = left.pc1 + right,
+ pc2 = left.pc2 + right,
+ p2 = left.p2 + right,
+ }
+ end
+ error( 'unknown operation' )
+ end
+
+ -- constructor
+ def.constructor =
+ function( args )
+ local p1 = args.p1
+ local pc1 = args.pc1
+ local pc2 = args.pc2
+ local p2 = args.p2
+
+ return {
+ p1 = p1,
+ pc1 = pc1,
+ pc2 = pc2,
+ p2 = p2,
+ }
+ end
+
+ -- draws helping information
+ def.proto.drawHelpers =
+ function( self, prefix )
+ tikz.draw{ draw = 'red', tikz.line{ self.p1, self.pc1 } }
+ tikz.draw{ draw = 'yellow', tikz.line{ self.pc1, self.pc2 } }
+ tikz.draw{ draw = 'blue', tikz.line{ self.pc2, self.p2 } }
+ if prefix ~= nil
+ then
+ tikz.put{ tikz.node{
+ at = self.p1,
+ anchor = 'north west',
+ text = prefix .. '1',
+ } }
+ tikz.put{ tikz.node{
+ at = self.pc1,
+ anchor = 'north west',
+ text = prefix .. 'c1',
+ } }
+ tikz.put{ tikz.node{
+ at = self.pc2,
+ anchor = 'north west',
+ text = prefix .. 'c2',
+ } }
+ tikz.put{ tikz.node{
+ at = self.p2,
+ anchor = 'north west',
+ text = prefix .. '2',
+ } }
+ end
+ end
+
+ def.mul =
+ function( left, right )
+ if type( right ) == 'number'
+ then
+ return tikz.bezier3 {
+ p1 = left.p1 * right,
+ pc1 = left.pc1 * right,
+ pc2 = left.pc2 * right,
+ p2 = left.p2 * right,
+ }
+ elseif type( left ) == 'number'
+ then
+ return tikz.bezier3 {
+ p1 = right.p1 * left,
+ pc1 = right.pc1 * left,
+ pc2 = right.pc2 * left,
+ p2 = right.p2 * left,
+ }
+ else
+ error( 'invalid operation' )
+ end
+ end
+
+ -- point in center
+ def.lazy.pc =
+ function( self )
+ return self.pt( 0.5 )
+ end
+
+ -- gets angle at t (0-1)
+ def.proto.phit =
+ function( self, t )
+ local p1 = self.p1
+ local pc1 = self.pc1
+ local pc2 = self.pc2
+ local p2 = self.p2
+
+ local u = 1 - t
+ local uu3 = 3 * u * u
+ local ut6 = 6 * u * t
+ local tt3 = 3 * t * t
+
+ return math.atan2(
+ -uu3 * p1.y + uu3 * pc1.y - ut6 * pc1.y + ut6 * pc2.y - tt3 * pc2.y + tt3 * p2.y,
+ -uu3 * p1.x + uu3 * pc1.x - ut6 * pc1.x + ut6 * pc2.x - tt3 * pc2.x + tt3 * p2.x
+ )
+ end
+
+ -- reverts p1 and p2 and pc1 and pc2 respectively
+ def.lazy.revert =
+ function( self )
+ return tikz.bezier3{
+ p1 = self.p2,
+ pc1 = self.pc2,
+ pc2 = self.pc1,
+ p2 = self.p1,
+ }
+ end
+
+ -- gets point at t (0-1)
+ def.proto.pt =
+ function( self, t )
+ if type( t ) ~= 'number' or t < 0 or t > 1
+ then
+ error( 'invalid pt' )
+ end
+
+ local p1 = self.p1
+ local pc1 = self.pc1
+ local pc2 = self.pc2
+ local p2 = self.p2
+ local t1 = 1 - t
+
+ return(
+ tikz.p{
+ t1^3*p1.x + 3*t*t1^2*pc1.x + 3 *t^2*t1*pc2.x + t^3*p2.x,
+ t1^3*p1.y + 3*t*t1^2*pc1.y + 3 *t^2*t1*pc2.y + t^3*p2.y
+ }
+ )
+ end
+
+ def.sub =
+ function( left, right )
+ if right.id == 'point'
+ then
+ return tikz.bezier3{
+ p1 = left.p1 - right,
+ pc1 = left.pc1 - right,
+ pc2 = left.pc2 - right,
+ p2 = left.p2 - right,
+ }
+ end
+ error( 'unknown operation' )
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ local s = { }
+ table.insert( s, zString( self.p1 ) )
+ table.insert( s, '.. controls' )
+ table.insert( s, zString( self.pc1 ) )
+ table.insert( s, 'and' )
+ table.insert( s, zString( self.pc2 ) )
+ table.insert( s, '..' )
+ table.insert( s, zString( self.p2 ) )
+ return table.concat( s, ' ' )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- A bend line
+-------------------------------------------------------------------------------
+tikz.bline =
+immutable( function( def )
+ def.id = 'bline'
+
+ -- moves the line.
+ def.add =
+ function( left, right )
+ if right.id == 'point'
+ then
+ return tikz.line{ p1 = left.p1 + right, p2 = left.p2 + right }
+ end
+ error( 'unknown operation' )
+ end
+
+ -- constructor
+ --
+ -- either
+ -- { p1, p2 }, (a list )
+ -- { p1 = ..., p2 = ... },
+ -- { pc = ..., phi = ..., length = ... },
+ def.constructor =
+ function( args )
+ local p1
+ local p2
+
+ if #args > 1
+ then
+ -- list
+ p1 = args[ 1 ]
+ p2 = args[ 2 ]
+ elseif type( args.p1 ) ~= 'nil' and type( args.p2 ) ~= 'nil'
+ then
+ p1 = args.p1
+ p2 = args.p2
+ elseif args.phi ~= nil
+ then
+ local phi = args.phi
+ if args.pc ~= nil
+ then
+ if args.p1 ~= nil
+ or args.p2 ~= nil
+ then
+ error( 'invalid line options', 2 )
+ end
+ local pc = args.pc
+ local len05 = args.length / 2
+ p1 = pc + tikz.p{ math.cos( phi ), math.sin( phi ) } * len05
+ p2 = pc - tikz.p{ math.cos( phi ), math.sin( phi ) } * len05
+ elseif type( args.p1 ) ~= 'nil'
+ then
+ if args.pc ~= nil
+ or args.p2 ~= nil
+ then
+ error( 'invalid line options', 2 )
+ end
+ p1 = args.p1
+ p2 = p1 + tikz.p{ math.cos( phi ), math.sin( phi ) } * args.length
+ else
+ error( 'invalid line options', 2 )
+ end
+ else
+ error( 'invalid line options', 2 )
+ end
+
+ return {
+ bend_left = args.bend_left,
+ bend_right = args.bend_right,
+ p1 = p1,
+ p2 = p2,
+ }
+ end
+
+ -- converts to a cubic bezier (that should look the same)
+ def.lazy.bezier3 =
+ function( self )
+ local phi
+ if self.bend_right ~= nil then
+ phi = self.bend_right * math.pi / 180
+ else
+ phi = -self.bend_left * math.pi / 180
+ end
+ local line = self.line
+ local phil = line.phi
+ local len = line.length * 0.3915
+ local lt1 =
+ tikz.line{
+ p1 = line.p1,
+ phi = phil-phi,
+ length = len
+ }
+ local lt2 =
+ tikz.line{
+ p1 = line.p2,
+ phi = phil+phi+math.pi,
+ length = len
+ }
+
+ return tikz.bezier3{
+ p1 = line.p1,
+ pc1 = lt1.p2,
+ pc2 = lt2.p2,
+ p2 = line.p2,
+ }
+ end
+
+ -- converts to a straight line.
+ def.lazy.line =
+ function( self )
+ return tikz.line{
+ p1 = self.p1,
+ p2 = self.p2,
+ }
+ end
+
+ -- point in center
+ def.lazy.pc =
+ function( self )
+ return self.bezier3.pc
+ end
+
+ -- gets point at t (0-1).
+ def.proto.pt =
+ function( self, t )
+ return self.bezier3.pt( t )
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ local s = { }
+ table.insert( s, zString( self.p1 ) )
+ table.insert( s, 'to' )
+ if self.bend_left ~= nil
+ then
+ table.insert( s, '[bend left='..self.bend_left..']' )
+ end
+ if self.bend_right ~= nil
+ then
+ table.insert( s, '[bend right='..self.bend_right..']' )
+ end
+ table.insert( s, zString( self.p2 ) )
+ return table.concat( s, ' ' )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- A curve is defined by a list of points.
+-------------------------------------------------------------------------------
+curve =
+immutable( function( def )
+ def.id = 'curve'
+
+ -- constructor
+ def.constructor =
+ function( args )
+ return {
+ points = args.points,
+ tension = args.tension,
+ cycle = args.cycle,
+ }
+ end
+
+ -- draws helping information
+ def.proto.drawHelpers =
+ function( self, prefix )
+ local points = self.points
+ for i, pi in ipairs( points )
+ do
+ tikz.draw{
+ fill = 'black',
+ tikz.circle{
+ at = pi,
+ radius = 0.05,
+ }
+ }
+ if prefix ~= nil
+ then
+ tikz.put{ tikz.node{
+ at = pi,
+ anchor = 'north west',
+ text = prefix .. i,
+ } }
+ end
+ end
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ local s = { 'plot' }
+ table.insert( s, '[' )
+ if self.cycle
+ then
+ table.insert( s, 'smooth cycle' )
+ else
+ table.insert( s, 'smooth' )
+ end
+ if self.tension then
+ table.insert( s, ',tension='..self.tension )
+ end
+ table.insert( s, ']' )
+ local points = self.points
+ table.insert( s, 'coordinates' )
+ table.insert( s, '{' )
+ for _, p in ipairs( points )
+ do
+ table.insert( s, zString( p ) )
+ end
+ table.insert( s, '}' )
+ return table.concat( s, ' ' )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- A full ellipse.
+-------------------------------------------------------------------------------
+tikz.ellipse =
+immutable( function( def )
+ def.id = 'ellipse'
+
+ -- constructor
+ def.constructor =
+ function( args )
+ local at = args.at
+ local xradius = args.xradius
+ local yradius = args.yradius
+
+ return {
+ at = at,
+ xradius = xradius,
+ yradius = yradius,
+ }
+ end
+
+ -- intersect with a line.
+ def.proto.intersectLine =
+ function( self, line )
+ local at = self.at
+ local rx = self.xradius
+ local ry = self.yradius
+ local p1 = line.p1
+ local p2 = line.p2
+
+ local x0 = p1.x
+ local y0 = p1.y
+ local x1 = p2.x
+ local y1 = p2.y
+ local cx = at.x
+ local cy = at.y
+
+ x0 = x0 - cx
+ y0 = y0 - cy
+ x1 = x1 - cx
+ y1 = y1 - cy
+
+ local A = ((x1 - x0) * (x1 - x0)) / rx / rx + ((y1 - y0) * (y1 - y0)) / ry / ry
+ local B = (2 * x0 * (x1 - x0)) / rx / rx + (2 * y0 * (y1 - y0)) / ry / ry
+ local C = (x0 * x0) / rx / rx + (y0 * y0) / ry / ry - 1
+ local D = B * B - 4 * A * C
+
+ local tv = { }
+ if D == 0
+ then
+ table.insert( tv, -B / 2 / A )
+ else
+ table.insert( tv, (-B + math.sqrt(D)) / 2 / A )
+ table.insert( tv, (-B - math.sqrt(D)) / 2 / A )
+ end
+
+ local r = { }
+ for _, t in ipairs( tv )
+ do
+ if t >= 0 and t <= 1
+ then
+ table.insert(
+ r,
+ p1 + tikz.p{ t * line.length * math.cos( line.phi ), t * line.length * math.sin( line.phi ) }
+ )
+ end
+ end
+
+ if #r == 0
+ then
+ return
+ elseif #r == 1
+ then
+ return r[ 1 ]
+ else
+ return r
+ end
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ s = { }
+ table.insert( s, zString( self.at ) )
+ table.insert( s, 'ellipse' )
+ table.insert( s, '[' )
+ table.insert( s, 'x radius =' )
+ table.insert( s, zString( self.xradius ) )
+ table.insert( s, ', y radius =' )
+ table.insert( s, zString( self.yradius ) )
+ table.insert( s, ']' )
+ return table.concat( s, ' ' )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- An ellipse part.
+-------------------------------------------------------------------------------
+tikz.ellipseArc =
+immutable( function( def )
+ def.id = 'ellipseArc'
+
+ -- constructor
+ def.constructor =
+ function( args )
+ return {
+ at = args.at,
+ from = args.from,
+ to = args.to,
+ xradius = args.xradius,
+ yradius = args.yradius,
+ }
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ s = { }
+ table.insert( s, 'plot' )
+ table.insert( s, '[domain =' )
+ table.insert( s, self.from )
+ table.insert( s, ':' )
+ table.insert( s, self.to )
+ table.insert( s, ',variable = \\phi,smooth]' )
+ table.insert( s,
+ '({ '..zString(self.at.x)..'+'..zString(self.xradius)..'*cos(\\phi)},'
+ ..'{ '..zString(self.at.y)..'+'..zString(self.yradius)..'*sin(\\phi)})'
+ )
+ return table.concat( s, ' ' )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- Single line (segment).
+-------------------------------------------------------------------------------
+tikz.line =
+immutable( function( def )
+ def.id = 'line'
+
+ -- moves the line.
+ def.add =
+ function( left, right )
+ if right.id == 'point'
+ then
+ return tikz.line{
+ p1 = left.p1 + right,
+ p2 = left.p2 + right,
+ }
+ end
+ error( 'unknown operation' )
+ end
+
+ -- multiplicator
+ def.mul =
+ function( left, right )
+ if type( left ) == 'number'
+ then
+ return tikz.line{
+ p1 = right.p1 * left,
+ p2 = right.p2 * left,
+ }
+ elseif type( right ) == 'number'
+ then
+ return tikz.line{
+ p1 = left.p1 * right,
+ p2 = left.p2 * right,
+ }
+ end
+ error( 'unknown operation' )
+ end
+
+ -- constructor
+ --
+ -- either
+ -- { p1, p2 }, (a list )
+ -- { p1 = ..., p2 = ... },
+ -- { pc = ..., phi = ..., length = ... },
+ def.constructor =
+ function( args )
+ local p1
+ local p2
+
+ if #args > 1
+ then
+ -- list
+ p1 = args[ 1 ]
+ p2 = args[ 2 ]
+ elseif type( args.p1 ) ~= 'nil' and type( args.p2 ) ~= 'nil'
+ then
+ p1 = args.p1
+ p2 = args.p2
+ elseif args.phi ~= nil
+ then
+ local phi = args.phi
+ if args.pc ~= nil
+ then
+ if args.p1 ~= nil
+ or args.p2 ~= nil
+ then
+ error( 'invalid line options', 2 )
+ end
+ local pc = args.pc
+ local len05 = args.length / 2
+ p1 = pc + tikz.p{ math.cos( phi ), math.sin( phi ) } * len05
+ p2 = pc - tikz.p{ math.cos( phi ), math.sin( phi ) } * len05
+ elseif type( args.p1 ) ~= 'nil'
+ then
+ if args.pc ~= nil
+ or args.p2 ~= nil
+ then
+ error( 'invalid line options', 2 )
+ end
+ p1 = args.p1
+ p2 = p1 + tikz.p{ math.cos( phi ), math.sin( phi ) } * args.length
+ else
+ error( 'invalid line options', 2 )
+ end
+ else
+ error( 'invalid line options', 2 )
+ end
+
+ return {
+ p1 = p1,
+ p2 = p2,
+ }
+ end
+
+ -- divisor
+ def.div =
+ function( left, right )
+ if type( right ) == 'number'
+ then
+ return tikz.line{
+ p1 = left.p1 / right,
+ p2 = left.p2 / right,
+ }
+ end
+ error( 'unknown operation' )
+ end
+
+ -- length of line.
+ def.lazy.length =
+ function( self )
+ local p1 = self.p1
+ local p2 = self.p2
+ local dx = p2.x - p1.x
+ local dy = p2.y - p1.y
+ local result = math.sqrt( dx*dx + dy*dy )
+ return result
+ end
+
+ -- center of line.
+ def.lazy.pc =
+ function( self )
+ local p1 = self.p1
+ local p2 = self.p2
+ local result = tikz.p{ ( p1.x + p2.x ) / 2, ( p1.y + p2.y ) / 2 }
+ return result
+ end
+
+ -- angle of line.
+ def.lazy.phi =
+ function( self )
+ local p1 = self.p1
+ local p2 = self.p2
+ local result = math.atan2( p2.y - p1.y, p2.x - p1.x )
+ return result
+ end
+
+ -- gets point at t (0-1).
+ def.proto.pt =
+ function( self, t )
+ if type( t ) ~= 'number' or t < 0 or t > 1
+ then
+ error( 'invalid pt' )
+ end
+
+ local p1 = self.p1
+ local p2 = self.p2
+ local phi = self.phi
+ local lt = self.length * t
+
+ return(
+ tikz.p{
+ p1.x + lt * math.cos( phi ),
+ p1.y + lt * math.sin( phi ),
+ }
+ )
+ end
+
+ -- intersects the line with another.
+ def.proto.intersectLine =
+ function( self, line )
+ local p1 = self.p1
+ local p2 = self.p2
+ local p3 = line.p1
+ local p4 = line.p2
+
+ if p1.x == p3.x and p1.y == p3.y then return p1 end
+ if p1.x == p4.x and p1.y == p4.y then return p1 end
+ if p2.x == p3.x and p2.y == p3.y then return p2 end
+ if p2.x == p4.x and p2.y == p4.y then return p2 end
+
+ local den = ( p1.x - p2.x )*( p3.y - p4.y ) - ( p1.y - p2.y )*( p3.x - p4.x );
+ if den == 0
+ then
+ -- doesn't intersect
+ return
+ end
+
+ local a = p1.x*p2.y - p1.y*p2.x;
+ local b = p3.x*p4.y - p3.y*p4.x;
+ local x = ( a*( p3.x - p4.x ) - ( p1.x - p2.x )*b ) / den;
+ local y = ( a*( p3.y - p4.y ) - ( p1.y - p2.y )*b ) / den;
+
+ if
+ (
+ ( x >= p1.x and x <= p2.x or x <= p1.x and x >= p2.x )
+ and ( x >= p3.x and x <= p4.x or x <= p3.x and x >= p4.x )
+ )
+ or
+ (
+ ( y >= p1.y and y <= p2.y or y <= p1.y and y >= p2.y )
+ and ( y >= p3.y and y <= p4.y or y <= p3.y and y >= p4.y )
+ )
+ then
+ return tikz.p{ x, y }
+ end
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ local s = { }
+ table.insert( s, zString( self.p1 ) )
+ table.insert( s, '--' )
+ table.insert( s, zString( self.p2 ) )
+ return table.concat( s, ' ' )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- Function plot.
+-------------------------------------------------------------------------------
+tikz.plot =
+immutable( function( def )
+ def.id = 'plot'
+
+ -- constructor
+ def.constructor =
+ function( args )
+ return {
+ at = args.at,
+ from = args.from,
+ to = args.to,
+ step = args.step,
+ tension = args.tension,
+ func = args.func,
+ }
+ end
+
+ def.lazy.points =
+ function( self )
+ local from = self.from
+ local to = self.to
+ local step = self.step
+ if step == nil
+ then
+ step = ( to - from ) / 100
+ end
+ local points = { }
+ local d
+ local at = self.at or tikz.p0
+ for d = from, to, step
+ do
+ table.insert( points, at + self.func( d ) )
+ end
+ return points
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ local s = { 'plot' }
+ table.insert( s, '[' )
+ table.insert( s, 'smooth' )
+ if self.tension
+ then
+ table.insert( s, ',tension='..self.tension )
+ end
+ table.insert( s, ']' )
+
+ local points = self.points
+
+ table.insert( s, 'coordinates' )
+ table.insert( s, '{' )
+ for _, p in ipairs( points )
+ do
+ table.insert( s, zString( p ) )
+ end
+ table.insert( s, '}' )
+ return table.concat( s, ' ' )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- A superEllipse
+-------------------------------------------------------------------------------
+tikz.superEllipse =
+immutable( function( def )
+ def.id = 'superEllipse'
+
+ -- constructor
+ def.constructor =
+ function( args )
+ local at = args.at
+ local n = args.n
+ local xradius = args.xradius
+ local yradius = args.yradius
+
+ return {
+ at = at,
+ n = n,
+ xradius = xradius,
+ yradius = yradius,
+ }
+ end
+
+ -- returns p on degree (0-360)
+ def.proto.pdeg =
+ function( self, t )
+ if type( t ) ~= 'number' or t < 0 or t > 360
+ then
+ error( 'invalid pdeg' )
+ end
+
+ local at = self.at
+ local n = self.n
+ local xo = self.xradius * math.abs( math.cos( t * math.pi / 180 ) )^(2/n)
+ local yo = self.yradius * math.abs( math.sin( t * math.pi / 180 ) )^(2/n)
+
+ if t <= 90
+ then
+ return tikz.p{ at.x + xo, at.y + yo }
+ elseif t <= 180
+ then
+ return tikz.p{ at.x - xo, at.y + yo }
+ elseif t <= 270
+ then
+ return tikz.p{ at.x - xo, at.y - yo }
+ else
+ return tikz.p{ at.x + xo, at.y - yo }
+ end
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ local s = { }
+ local at = self.at
+ local xa = at.x
+ local ya = at.y
+ local n = self.n
+ local xr = self.xradius
+ local yr = self.yradius
+ table.insert( s, 'plot[domain=0:90,variable=\\t,smooth]' )
+ table.insert( s, '({'..xr..'*cos(\\t)^(2/'..n..')+'..xa..'},{'..yr..'*sin(\\t)^(2/'..n..')+'..ya..'})' )
+ table.insert( s, '--' )
+ table.insert( s, 'plot[domain=90:0,variable=\\t,smooth]' )
+ table.insert( s, '({-'..xr..'*cos(\\t)^(2/'..n..')+'..xa..'},{'..yr..'*sin(\\t)^(2/'..n..')+'..ya..'})' )
+ table.insert( s, '--' )
+ table.insert( s, 'plot[domain=0:90,variable=\\t,smooth]' )
+ table.insert( s, '({-'..xr..'*cos(\\t)^(2/'..n..')+'..xa..'},{-'..yr..'*sin(\\t)^(2/'..n..')+'..ya..'})' )
+ table.insert( s, '--' )
+ table.insert( s, 'plot[domain=90:0,variable=\\t,smooth]' )
+ table.insert( s, '({'..xr..'*cos(\\t)^(2/'..n..')+'..xa..'},{-'..yr..'*sin(\\t)^(2/'..n..')+'..ya..'})' )
+ table.insert( s, '-- cycle' )
+ return table.concat( s, ' ' )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- A reference to a named node.
+-------------------------------------------------------------------------------
+local optionsNamed =
+{
+ ref = false,
+ xshift = 'xshift',
+ yshift = 'yshift',
+}
+
+tikz.named =
+immutable( function( def )
+ def.id = 'named'
+
+ -- constructor
+ def.constructor =
+ function( args )
+ local s = { }
+ _doOptions( s, args, optionsNamed, false, 2 )
+ return {
+ opts = table.concat( s, ' ' ),
+ ref = args.ref,
+ }
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ local s = { }
+ table.insert( s, '(' )
+ if self.opts
+ then
+ table.insert( s, self.opts )
+ end
+ table.insert( s, self.ref )
+ table.insert( s, ')' )
+ return table.concat( s )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- Multiple connected lines.
+-------------------------------------------------------------------------------
+tikz.polyline =
+immutable( function( def )
+ def.id = 'polyline'
+
+ -- constructor
+ def.constructor =
+ function( args )
+ local o = { }
+ for _, v in ipairs( args )
+ do
+ table.insert( o, v )
+ end
+ return o
+ end
+
+ -- converts to a tikz string.
+ def.zString =
+ function( self )
+ local s = { '' }
+ for k, v in ipairs( self )
+ do
+ if k > 1 then table.insert( s, '--' ) end
+ table.insert( s, zString( v ) )
+ end
+ return table.concat( s, ' ' )
+ end
+end )
+
+-------------------------------------------------------------------------------
+-- A rectangle
+-------------------------------------------------------------------------------
+tikz.rect =
+immutable( function( def )
+ def.id = 'rect'
+
+ -- constructor
+ def.constructor =
+ function( args )
+ local psw
+ local pne
+
+ if args.pnw ~= nil
+ then
+ if args.pse ~= nil
+ then
+ psw = tikz.p{ args.pnw.x, args.pse.y }
+ pne = tikz.p{ args.pse.x, args.pnw.y }
+ elseif args.size ~= nil
+ then
+ psw = tikz.p{ args.pnw.x, args.pnw.y - args.size.y }
+ pne = tikz.p{ args.pnw.x + args.size.x, args.pnw.y }
+ else
+ error( 'invalid rect options', 2 )
+ end
+ elseif args.psw ~= nil
+ then
+ psw = args.psw
+ if args.pne ~= nil
+ then
+ pne = args.pne
+ elseif args.size ~= nil
+ then
+ pne = psw + args.size
+ else
+ error( 'invalid rect options', 2 )
+ end
+ elseif args.pse ~= nil
+ then
+ if args.size ~= nil
+ then
+ psw = tikz.p{ args.pse.x - args.size.x, args.pse.y }
+ pne = tikz.p{ args.pse.x, args.pse.y + args.size.y }
+ else
+ error( 'invalid rect options', 2 )
+ end
+ elseif args.pc ~= nil
+ then
+ if args.size ~= nil
+ then
+ psw = tikz.p{ args.pc.x - args.size.x / 2, args.pc.y - args.size.y / 2 }
+ pne = tikz.p{ args.pc.x + args.size.x / 2, args.pc.y + args.size.y / 2 }
+ else
+ error( 'invalid rect options', 2 )
+ end
+ else
+ error( 'invalid rect options', 2 )
+ end
+
+ return {
+ psw = psw,
+ pne = pne,
+ }
+ end
+
+ def.zString =
+ function( self )
+ local s = { }
+ table.insert( s, zString( self.psw ) )
+ table.insert( s, 'rectangle' )
+ table.insert( s, zString( self.pne ) )
+ return table.concat( s, ' ' )
+ end
+
+ def.lazy.e =
+ function( self )
+ return self.pne.x
+ end
+
+ def.lazy.height =
+ function( self )
+ return self.pne.y - self.psw.y
+ end
+
+ def.lazy.n =
+ function( self )
+ return self.pne.y
+ end
+
+ def.lazy.pc =
+ function( self )
+ return tikz.p{ self.psw.x + self.width / 2, self.psw.y + self.height / 2 }
+ end
+
+ def.lazy.pe =
+ function( self )
+ return tikz.p{ self.pne.x, self.psw.y + self.height / 2 }
+ end
+
+ def.lazy.pn =
+ function( self )
+ return tikz.p{ self.psw.x + self.width / 2, self.pne.y }
+ end
+
+ def.lazy.pnw =
+ function( self )
+ return tikz.p{ self.psw.x, self.pne.y }
+ end
+
+ def.lazy.ps =
+ function( self )
+ return tikz.p{ self.psw.x + self.width / 2, self.psw.y }
+ end
+
+ def.lazy.pse =
+ function( self )
+ return tikz.p{ self.pne.x, self.psw.y }
+ end
+
+ def.lazy.pw =
+ function( self )
+ return tikz.p{ self.psw.x, self.psw.y + self.height / 2 }
+ end
+
+ def.lazy.s =
+ function( self )
+ return self.psw.y
+ end
+
+ def.lazy.size =
+ function( self )
+ return tikz.p{ self.width, self.height }
+ end
+
+ def.lazy.w =
+ function( self )
+ return self.psw.x
+ end
+
+ def.lazy.width =
+ function( self )
+ return self.pne.x - self.psw.x
+ end
+end )
+
+
+--==========================================================================--
+-- STYLES --
+--==========================================================================--
+tikz.style =
+immutable( function( def )
+ def.id = 'style'
+
+ -- constructor
+ def.constructor =
+ function( name )
+ return { name=name }
+ end
+end )
+
+tikz.above = tikz.style( 'above' )
+tikz.arrow = tikz.style( '-{Latex}' )
+tikz.below = tikz.style( 'below' )
+tikz.dashed = tikz.style( 'dashed' )
+tikz.dotted = tikz.style( 'dotted' )
+tikz.double_arrow = tikz.style( '{Latex}-{Latex}' )
+tikz.even_odd_rule = tikz.style( 'even odd rule' )
+tikz.midway = tikz.style( 'midway' )
+
+--==========================================================================--
+-- OUTPUT ---
+--==========================================================================--
+
+--
+-- Writes out a named option.
+--
+-- ~s: string to build
+-- ~args: arguments
+-- ~name: name of option
+-- ~haveOpts: true if had options
+-- ~rename: if defined rename options on output
+--
+local function optionNamed( s, args, name, haveOpts, rename )
+
+ local v = args[ name ]
+
+ if not v
+ then
+ return haveOpts
+ end
+
+ if not rename
+ then
+ return haveOpts
+ end
+
+ if not haveOpts
+ then
+ table.insert( s, '[' )
+ else
+ table.insert( s, ',' )
+ end
+
+ if v == true
+ then
+ table.insert( s, rename )
+ else
+ table.insert( s, rename..'='..v )
+ end
+
+ return true
+end
+
+--
+-- Writes out an unnamed option.
+--
+-- ~s: string to build
+-- ~name: name of option
+-- ~haveOpts: true if had options
+--
+local function unnamedOption( s, name, haveOpts )
+ if not haveOpts
+ then
+ table.insert( s, '[' )
+ else
+ table.insert( s, ',' )
+ end
+ table.insert( s, name )
+ return true
+end
+
+--
+-- Custom key compare.
+--
+-- keys to put on top
+local topKeys =
+{
+ node_distance = true,
+}
+
+local function kcompare( ka, kb )
+ local ta = topKeys[ ka ]
+ local tb = topKeys[ kb ]
+ if ta and not tb then return true end
+ if not ta and tb then return false end
+ return ka < kb
+end
+
+--
+-- A helper to parse arguments to pass as drawing options to hand to tikz.
+--
+-- s: string to build
+-- args: the arguments to parse.
+-- opts: named options to pass on
+-- haveOpts: true [ has already been built
+-- level: call level for error throwing
+--
+local function _doOptions( s, args, opts, haveOpts, level )
+ args = flatten( args )
+
+ for _, v in ipairs( args )
+ do
+ if v.id == 'style'
+ then
+ haveOpts = unnamedOption( s, v.name, haveOpts )
+ end
+ end
+
+ local nkeys = { }
+ for key in pairs( args )
+ do
+ if type( key ) ~= 'number'
+ then
+ table.insert( nkeys, key )
+ end
+ end
+ table.sort( nkeys, kcompare )
+
+ for _, k in ipairs( nkeys )
+ do
+ local ok = opts[ k ]
+ if ok
+ then
+ haveOpts = optionNamed( s, args, k, haveOpts, ok )
+ elseif ok == nil
+ then
+ error( 'unknown option '..k, level + 1 )
+ end
+ end
+
+ haveOpts = _opts( s, args._opts, haveOpts )
+
+ if haveOpts
+ then
+ table.insert( s, ']' )
+ end
+end
+
+-------------------------------------------------------------------------------
+-- Drawing shapes.
+-------------------------------------------------------------------------------
+local optionsDraw =
+{
+ decorate = 'decorate',
+ decoration = 'decoration',
+ dash_pattern = 'dash pattern',
+ color = 'color',
+ draw = 'draw',
+ fill = 'fill',
+ line_cap = 'line cap',
+ line_width = 'line width',
+ opacity = 'opacity',
+ pattern = 'pattern',
+ rotate = 'rotate',
+ transform_canvas = 'transform canvas',
+ xshift = 'xshift',
+ yshift = 'yshift',
+ _butt_cap = '-Butt Cap',
+ butt_cap_ = 'Butt Cap-',
+ _round_cap = '-{Round Cap[]}',
+ round_cap_ = '{Round Cap[]}-',
+ _round_cap_ = '{Round Cap[]}-{Round Cap[]}',
+}
+
+--
+-- Puts out a bounding box command
+--
+tikz.boundingbox =
+function( args )
+ tprint( '\\pgfresetboundingbox' )
+ local s = { '\\path [use as bounding box] ' }
+ for _, v in ipairs( args )
+ do
+ if v.id ~= 'style'
+ then
+ table.insert( s, zString( v ) )
+ end
+ end
+ table.insert( s, ';' )
+ tprint( table.unpack( s ) )
+end
+
+--
+-- Puts out a draw command.
+--
+tikz.draw =
+function( args )
+ local s = { '\\draw ' }
+ _doOptions( s, args, optionsDraw, false, 2 )
+
+ for _, v in ipairs( args )
+ do
+ if v.id ~= 'style'
+ then
+ table.insert( s, zString( v ) )
+ end
+ end
+
+ table.insert( s, ';' )
+ tprint( table.unpack( s ) )
+end
+
+--
+-- Puts out a path command.
+--
+tikz.path =
+function( args )
+ local s = { '\\path' }
+ _doOptions( s, args, optionsDraw, false, 2 )
+
+ for _, v in ipairs( args )
+ do
+ if v.id ~= 'style'
+ then
+ table.insert( s, zString( v ) )
+ end
+ end
+ table.insert( s, ';' )
+ tprint( table.unpack( s ) )
+end
+
+--
+-- Puts out a bounding box.
+--
+tikz.clip =
+function( args )
+ local s = { '\\begin{pgfinterruptboundingbox}', '\\clip' }
+ _doOptions( s, args, optionsDraw, false, 2 )
+
+ for _, v in ipairs( args )
+ do
+ if v.id ~= 'style' then table.insert( s, zString( v ) ) end
+ end
+ table.insert( s, ';' )
+ table.insert( s, '\\end{pgfinterruptboundingbox}' )
+ tprint( table.unpack( s ) )
+end
+
+local shadeOptions =
+{
+ ball_color = 'ball color',
+ left_color = 'left color',
+ lower_left_color = 'lower left',
+ lower_right_color = 'lower right',
+ opacity = 'opacity',
+ right_color = 'right color',
+ shading = 'shading',
+ upper_left_color = 'upper left',
+ upper_right_color = 'upper right',
+}
+
+--
+-- Puts out a shade command.
+--
+tikz.shade =
+function( args )
+ local s = { '\\shade' }
+ _doOptions( s, args, shadeOptions, false, 2 )
+
+ for _, v in ipairs( args )
+ do
+ if v.id ~= 'style' then table.insert( s, zString( v ) ) end
+ end
+ table.insert( s, ';' )
+ tprint( table.unpack( s ) )
+end
+
+--
+-- Puts out z stuff.
+--
+tikz.put =
+function( args )
+ for _, v in ipairs( args )
+ do
+ local s = { }
+ if v.id == 'node'
+ then
+ table.insert( s, '\\' )
+ table.insert( s, zString( v ) )
+ table.insert( s, ';' )
+ else
+ error( 'unknown: ' .. v.id, 1 )
+ end
+ tprint( table.unpack( s ) )
+ end
+end
+
+tikz.declarehorizonalshading =
+function( args )
+ local steps = args.steps
+ local name = args.name
+ local s = { '\\pgfdeclarehorizontalshading{' .. name .. '}{100bp}{' }
+
+ local keys = { }
+ for k, _ in pairs( steps )
+ do
+ table.insert( keys, k )
+ end
+
+ table.sort( keys )
+ for _, k in ipairs( keys )
+ do
+ if _ > 1 then table.insert( s, ';' ) end
+ table.insert( s, 'color(' .. k .. 'bp)=(' .. steps[ k ] .. ')' )
+ end
+ table.insert( s, '}' )
+
+ tprint( table.unpack( s ) )
+end
+
+-------------------------------------------------------------------------------
+-- A node to be defined to tikZ
+-------------------------------------------------------------------------------
+local optionsNode =
+{
+ above = 'above',
+ anchor = 'anchor',
+ align = 'align',
+ at = false,
+ below = 'below',
+ color = 'color',
+ draw = 'draw',
+ left = 'left',
+ minimum_height = 'minimum height',
+ node_distance = 'node distance',
+ name = false,
+ right = 'right',
+ rotate = 'rotate',
+ text = false,
+ text_width = 'text width',
+}
+
+tikz.node =
+immutable( function( def )
+ def.id = 'node';
+
+ def.zString =
+ function( self )
+ local s = { 'node' }
+
+ table.insert( s, self.opts )
+ if self.name
+ then
+ table.insert( s, ' (' )
+ table.insert( s, self.name )
+ table.insert( s, ')' )
+ end
+
+ if self.at
+ then
+ table.insert( s, ' at ' )
+ table.insert( s, zString( self.at ) )
+ end
+
+ if self.text
+ then
+ table.insert( s, ' {' )
+ local text = string.gsub( self.text, '\n', '' )
+ table.insert( s, text )
+ table.insert( s, '}' )
+ end
+
+ return table.concat( s )
+ end
+
+ -- constructor
+ def.constructor =
+ function( args )
+ local s = { }
+ _doOptions( s, args, optionsNode, false, 2 )
+ return {
+ at = args.at,
+ name = args.name,
+ opts = table.concat( s, ' ' ),
+ text = args.text
+ }
+ end
+end )
+
+tikz.outfile =
+function( filename )
+ outfile = io.open( filename, 'w' )
+ outfile:write( '%%% DO NOT EDIT THIS FILE %%%\n' )
+end
+
+--
+-- Hacking help.
+--
+function _direct( args )
+ tprint( table.unpack( args ) )
+end
+
+--
+-- Checks version metch.
+--
+tikz.checkVersion =
+function( v )
+ if v ~= tikz.version
+ then
+ error( 'version mismatch', 1 )
+ end
+end
+
+--
+-- Creates a color.
+--
+tikz.colorRGB =
+function( red, green, blue )
+ return '{rgb,255:red,'..red..'; green,'..green..'; blue,'..blue..'}'
+end
+
+--
+-- Makes a tikz scope.
+-- Argument must be a function to call.
+--
+tikz.scope =
+function( args )
+ args = flatten( args )
+ if #args ~= 1 or type( args[ 1 ] ) ~= 'function'
+ then
+ error( 'scope needs a function parameter' )
+ end
+ _direct{ [[\begin{scope}]] }
+ args[ 1 ]( )
+ _direct{ [[\end{scope}]] }
+end
+
+--==========================================================================--
+-- SHORTCUTS
+--==========================================================================--
+tikz.p0 = tikz.p{ 0, 0 }
+
+
+--==========================================================================--
+-- Running code within tikz environment.
+--==========================================================================--
+
+local env_nesting = 0
+local org_env
+tikz.within =
+function( version )
+ if version ~= '*' and version ~= tikz.version
+ then
+ error( 'version mismatch', 1 )
+ end
+
+ env_nesting = env_nesting + 1
+ if env_nesting > 1
+ then
+ return
+ end
+
+ org_env = _ENV
+ local nenv = { }
+ local mt = { }
+ mt.__index =
+ function( _, key )
+ local zk = tikz[ key ]
+ if zk ~= nil
+ then
+ return zk
+ else
+ return org_env[ key ]
+ end
+ end
+ setmetatable( nenv, mt )
+ local func = debug.getinfo( 2 ).func
+ debug.setupvalue( func, 1, nenv )
+end
+
+tikz.without =
+function( )
+ env_nesting = env_nesting - 1
+ if env_nesting > 0 then return end
+ local func = debug.getinfo( 2 ).func
+ debug.setupvalue( func, 1, org_env )
+end
diff --git a/graphics/pgf/contrib/luatikz/luatikz.pdf b/graphics/pgf/contrib/luatikz/luatikz.pdf
new file mode 100644
index 0000000000..983105ad7f
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/luatikz.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/luatikz/luatikz.sty b/graphics/pgf/contrib/luatikz/luatikz.sty
new file mode 100644
index 0000000000..5847ab888a
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/luatikz.sty
@@ -0,0 +1,5 @@
+\ProvidesPackage{luatikz}[2024/12/04 2.12.0 Luatikz]
+%This package is just wrapper to load the luatikz code.
+\RequirePackage{luacode}
+\directlua{require('luatikz')}
+\endinput
diff --git a/graphics/pgf/contrib/luatikz/luatikz.tex b/graphics/pgf/contrib/luatikz/luatikz.tex
new file mode 100644
index 0000000000..d4bf734b1d
--- /dev/null
+++ b/graphics/pgf/contrib/luatikz/luatikz.tex
@@ -0,0 +1,204 @@
+\documentclass[a4paper,11pt]{ltxdoc}
+
+\usepackage[utf8]{inputenc}
+\usepackage{makeidx}\makeindex
+\usepackage{luatextra}
+\usepackage[margin=1in]{geometry}
+
+\usepackage{fancyvrb}
+\fvset{frame=single,numbers=left,numbersep=3pt,tabsize=4}
+
+\usepackage{tikz}
+\usetikzlibrary{math,backgrounds,calc,intersections,arrows.meta,external,decorations.pathreplacing,shadings}
+\directlua{dofile('./luatikz.lua')}
+
+\newcommand{\example}[2]
+{
+\par#2
+\VerbatimInput{example/#1.lua}
+{\centering
+\begin{tikzpicture}[framed,scale=1]
+\directlua{dofile('example/#1.lua')tikz.without()}
+\end{tikzpicture}\par}
+}
+
+\newcommand{\examplecode}[2]
+{
+\bigskip\par\noindent #2
+\VerbatimInput{example/#1.lua}
+}
+
+
+\title{luatikz}
+\author{Axel Kittenberger}
+\def\version{2.12.0}
+\date{luatikz version \version}
+
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{1ex}
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+Luatikz is a graphics library to draw tikz graphics using the Lua programming language.
+
+\example{intro}
+{Following code draws two lines by specifying begin and end points. First using intermediatery variables and the second line within a single codeline:}
+
+Following \TeX{} wrapper can be used to compile the luatikz Lua code.
+\VerbatimInput{example/wrapper.tex}
+
+Luatikz obviously needs \LuaLaTeX{} to compile.
+
+Note that 2D graphics is a vast topic, functionality to luatikz has been and will be added on a per need basis.
+
+\section{Pointer math}
+
+Mathematical operations are possible with points, adding them with each other or multiplying them with a scalar.
+\example{spiral}{This example uses pointer math to create a spiral:}
+
+\newpage
+\section{Immutability}
+
+In luatikz pointers like all objects are immutable. That means a object once created in memory can no longer be changed.
+However the variable holding an object can be changed to another object with different attributes.
+
+\examplecode{immute1}{Thus following example is invalid:}
+\examplecode{immute2}{This on the other hand are two valid methods to change the value of p1}
+
+\newpage
+\section{luatikz objects}
+
+\subsection{Bezier (quatratic)}
+\example{bezier2}{A quadratic bezier curve is defined by it begin, end and a control point:}
+
+\newpage
+\subsection{Bezier (cubic)}
+\example{bezier3a}{A cubic bezier curve is defined by it begin, end and two control points:}
+
+\newpage
+A cubic bezier has the functions pt and phit that return the point and angle ranging from 0..1 on the curve.
+\example{bezier3b}{This example draw 10 normal lines onto the bezier curve:}
+
+\newpage
+\subsection{BLine}
+\example{blinea}{A bline is defined by it's begin and it's end. Additionally to the standard line it is bend}
+
+\newpage
+\subsection{Circle}
+\example{circle}{A circle is defined by it's center (``at'') and the circle ``radius'':}
+
+\newpage
+\subsection{Curve}
+\example{curvea}{A curve is defined by a list of points:}
+
+\newpage
+\example{curveb}{A curve can cycle and has a changeable tension:}
+
+\newpage
+\subsection{Ellipse}
+\example{ellipse}{An ellipse is difined by it's center (``at'') and a x- and yradius:}
+
+\newpage
+\subsection{EllipseArc}
+\example{ellipseArc}{An ellipse arc is a an ellipse limited by it's ``from'' and ``to'' angle:}
+
+\newpage
+\subsection{Line}
+\example{linea}{A line is defined by it's begin and it's end. There are two basic variants to define a line:}
+
+\example{lineb}{You can use intersectLine() to find the intersection of a line with another. If there is none ``nil'' will be returned:}
+
+\newpage
+\example{linec}{A line can also be defined by it's starting point, angle and length:}
+
+\example{lined}{``length'' and ``phi'' are attributes of a line:}
+
+\newpage
+\subsection{Plot}
+\example{plota}{A plot uses a function to determine a series of points on a curve. It takes values going ``from''--``to''. The function is to be a lua function that takes the input scalar and returns a point. The whole curve is offset ``at'' a point:}
+
+%\newpage
+%\subsection{SuperEllipse}
+%\example{superEllipse}{A ``super'' ellipse is just as an ellipse, but additionally has a strength factor ``n'' that ranges from diamond, to ellipse to rectangle:}
+
+\newpage
+\subsection{Polyline}
+\example{polylinea}{A polyline is a list of points to be connected via straight lines. If the string ``cycle'' is given at the end, it cycles:}
+
+\newpage
+\subsection{Rect}
+\example{recta}{Rectangles have various creation options. Also they provide a wide range of attributes of their points ``pnw'', ``pne'', ``psw'', ``pse'', ``pn'', ``pe'', ``ps'', ``pw'', ``pc'', ``height'', and ``width'':
+}
+
+\newpage
+\section{Labels a.k.a Nodes}
+
+Labels are created as nodes. Contrary to all other objects they do not need the ``draw'' command to be printed, but the ``put'' command. This is due any call to ``draw'' is turned into exactly one ``draw'' command to tikz and nodes in tikz are not using the ``draw'' command.
+
+\example{nodea}{In it's simplest form a node is specified by it's position and text. The double square brackets are Lua's way to make string constants that may contain simple blackslashes:}
+
+All constructors options of node are as follows; they correspond to the standard tikz options:
+\begin{itemize}
+ \item above
+ \item anchor
+ \item align
+ \item at
+ \item below
+ \item color
+ \item draw
+ \item left
+ \item minimum\_height
+ \item node\_distance
+ \item name
+ \item right
+ \item rotate
+ \item text
+ \item text\_width
+\end{itemize}
+\newpage
+
+\example{nodeb}{Another node example}
+
+\newpage
+\section{Styling}
+
+Styling is applied to draw commands by specifying style options, luatikz autodetects the difference between objects and styles.
+
+\example{stylea}{An example using arrows and dashes}
+
+\newpage
+\section{Shades}
+
+The ``shade'' command works analogous to classical tikz.
+
+\example{shadea}{For example a ball:}
+
+Recognized shade options are:
+\begin{itemize}
+ \item ball\_color
+ \item left\_color
+ \item lower\_left\_color
+ \item lower\_right\_color
+ \item opacity
+ \item right\_color
+ \item shading
+ \item upper\_left\_color
+ \item upper\_right\_color
+\end{itemize}
+
+\newpage
+\section{Some larger examples}
+
+\subsection{A radon projection}
+\example{radon1}{A radon projection, calculating correct projection curves:}
+
+\newpage
+\subsection{A sierpiński fractal}
+\example{sierpinski}{A sierpiński fractal. This one creates own temporary lua objects:}
+
+\printindex
+
+\end{document}
diff --git a/graphics/pgf/contrib/maritime/LICENSE b/graphics/pgf/contrib/maritime/LICENSE
new file mode 100644
index 0000000000..d470a91845
--- /dev/null
+++ b/graphics/pgf/contrib/maritime/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 N. E. Davis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION 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/graphics/pgf/contrib/maritime/README.md b/graphics/pgf/contrib/maritime/README.md
new file mode 100644
index 0000000000..bd84664f1d
--- /dev/null
+++ b/graphics/pgf/contrib/maritime/README.md
@@ -0,0 +1,39 @@
+# `maritime`
+
+International maritime signal flags using TikZ.
+
+The `maritime` package provides LaTeX commands for drawing international maritime signal flags using TikZ. The [documentation](./doc/maritime-doc.pdf) covers the basic usage of the package.
+
+## Contact
+
+Author: N. E. Davis
+Email: neal.davis@protonmail.com
+GitHub username: @sigilante
+
+## License
+
+The `maritime` package is made available under the MIT License.
+
+```
+MIT License
+
+Copyright (c) 2025 N. E. Davis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION 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/graphics/pgf/contrib/maritime/doc/maritime-doc.pdf b/graphics/pgf/contrib/maritime/doc/maritime-doc.pdf
new file mode 100644
index 0000000000..08e4947289
--- /dev/null
+++ b/graphics/pgf/contrib/maritime/doc/maritime-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/maritime/doc/maritime-doc.tex b/graphics/pgf/contrib/maritime/doc/maritime-doc.tex
new file mode 100644
index 0000000000..9f0cebc06c
--- /dev/null
+++ b/graphics/pgf/contrib/maritime/doc/maritime-doc.tex
@@ -0,0 +1,160 @@
+\documentclass{article}
+\usepackage{maritime}
+\usepackage{longtable} % For multi-page tables
+\usepackage{hyperref} % For hyperlinks
+\usepackage{xcolor} % For color in examples if needed
+
+\title{International Maritime Signal Flags Documentation}
+\author{N.\ E.\ Davis, \texttt{@sigilante}, \texttt{\textasciitilde lagrev-nocfep}}
+\date{\today}
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+The \textbf{maritime} package provides LaTeX commands for drawing international maritime signal flags using TikZ. This documentation covers the basic usage of the package.
+
+\section{Installation}
+To use this package, ensure your \texttt{maritime.sty} file is in a directory where LaTeX can find it (like \texttt{texmf-local/tex/latex/maritime/}) or in the same directory as your document.
+
+\section{Usage}
+
+\subsection{Drawing Flags}
+Flags are drawn using specific commands:
+
+\begin{itemize}
+ \item \verb|\flagZ|: Draws flag Z.
+ \item \verb|\flagO|: Draws flag O.
+ \item \verb|\flagR|: Draws flag R.
+ \item \verb|\flagP|: Draws flag P.
+\end{itemize}
+
+Here's how to use them. We suggest using \verb|\quad| to separate the flags as otherwise they abut.
+
+\begin{verbatim}
+ \flagZ
+ \flagO
+ \flagR
+ \flagP
+\end{verbatim}
+
+Example:
+
+\flagZ \quad \flagO \quad \flagR \quad \flagP
+
+Furthermore, we provide the standard name at \verb|\flagXname| and the blazon at \verb|\flagXblazon| for each flag \verb|X|.
+
+Example:
+
+\begin{verbatim}
+ \flagZname: \flagZblazon
+ \flagOname: \flagOblazon
+ \flagRname: \flagRblazon
+ \flagPname: \flagPblazon
+\end{verbatim}
+
+\noindent
+\flagZname: \flagZblazon \\
+\flagOname: \flagOblazon \\
+\flagRname: \flagRblazon \\
+\flagPname: \flagPblazon
+
+\section{The Flags}
+
+We supply the alphabetical International Code of Symbols maritime flags and the NATO number flags.
+
+\begin{longtable}{lcl}
+ \caption{International Maritime Signal Flags, Letters} \\
+ A \flagAname & \flagA & \flagAblazon \\
+ B \flagBname & \flagB & \flagBblazon \\
+ C \flagCname & \flagC & \flagCblazon \\
+ D \flagDname & \flagD & \flagDblazon \\
+ E \flagEname & \flagE & \flagEblazon \\
+ F \flagFname & \flagF & \flagFblazon \\
+ G \flagGname & \flagG & \flagGblazon \\
+ H \flagHname & \flagH & \flagHblazon \\
+ I \flagIname & \flagI & \flagIblazon \\
+ J \flagJname & \flagJ & \flagJblazon \\
+ K \flagKname & \flagK & \flagKblazon \\
+ L \flagLname & \flagL & \flagLblazon \\
+ M \flagMname & \flagM & \flagMblazon \\
+ N \flagNname & \flagN & \flagNblazon \\
+ O \flagOname & \flagO & \flagOblazon \\
+ P \flagPname & \flagP & \flagPblazon \\
+ Q \flagQname & \flagQ & \flagQblazon \\
+ R \flagRname & \flagR & \flagRblazon \\
+ S \flagSname & \flagS & \flagSblazon \\
+ T \flagTname & \flagT & \flagTblazon \\
+ U \flagUname & \flagU & \flagUblazon \\
+ V \flagVname & \flagV & \flagVblazon \\
+ W \flagWname & \flagW & \flagWblazon \\
+ X \flagXname & \flagX & \flagXblazon \\
+ Y \flagYname & \flagY & \flagYblazon \\
+ Z \flagZname & \flagZ & \flagZblazon \\
+\end{longtable}
+
+\begin{longtable}{lcl}
+ \caption{International Maritime Signal Flags, Numbers} \\
+ 0 \flagZeroName & \flagZero & \flagZeroBlazon \\
+ 1 \flagOneName & \flagOne & \flagOneBlazon \\
+ 2 \flagTwoName & \flagTwo & \flagTwoBlazon \\
+ 3 \flagThreeName & \flagThree & \flagThreeBlazon \\
+ 4 \flagFourName & \flagFour & \flagFourBlazon \\
+ 5 \flagFiveName & \flagFive & \flagFiveBlazon \\
+ 6 \flagSixName & \flagSix & \flagSixBlazon \\
+ 7 \flagSevenName & \flagSeven & \flagSevenBlazon \\
+ 8 \flagEightName & \flagEight & \flagEightBlazon \\
+ 9 \flagNineName & \flagNine & \flagNineBlazon \\
+\end{longtable}
+
+\subsection{Customization}
+
+\subsubsection{Size}
+
+The standard flag size is \verb|15ex|, meaning the height of the flag is 15 times the height of the letter `x'.
+
+\begin{verbatim}
+ \flagSix
+ \flagNine
+\end{verbatim}
+
+Example:
+
+\flagSix \quad \flagNine
+
+Flags can be scaled using standard LaTeX font size commands:
+
+\begin{verbatim}
+{\Large \flagU}
+{\normalsize \flagR}
+{\tiny \flagB}
+\end{verbatim}
+
+Example:
+
+{\Large \flagU} \quad {\normalsize \flagR} \quad {\tiny \flagB}
+
+They may also be explicitly scaled using the \verb|\resizebox| command:
+
+\begin{verbatim}
+ \resizebox{!}{5cm}{\flagI}
+ \resizebox{!}{0.5cm}{\flagT}
+\end{verbatim}
+
+Example:
+
+\resizebox{!}{5cm}{\flagI} \quad \resizebox{!}{0.5cm}{\flagT}
+
+\section{Conclusion}
+
+% enjoy yourself
+\begin{center}
+\flagE \space \flagN \space \flagJ \space \flagO \space \flagY \\
+
+\flagY \quad \flagO \quad \flagU \quad \flagR \\
+\quad \flagS \quad \flagE \quad \flagL \quad \flagF
+\end{center}
+
+\end{document}
diff --git a/graphics/pgf/contrib/maritime/tex/maritime.sty b/graphics/pgf/contrib/maritime/tex/maritime.sty
new file mode 100644
index 0000000000..fde4922fa7
--- /dev/null
+++ b/graphics/pgf/contrib/maritime/tex/maritime.sty
@@ -0,0 +1,671 @@
+% =============================================================================
+% worldflags.sty - International Maritime Signal Flags with TikZ
+% (c) N. E. Davis 2025-02-15
+% =============================================================================
+\ProvidesPackage{maritime}[2025/02/15 v1.0 International Maritime Signal Flags with TikZ]
+\RequirePackage{tikz}
+\RequirePackage{xcolor}
+\RequirePackage{etex}
+\RequirePackage{xkeyval}
+\RequirePackage{graphicx}
+\RequirePackage{xstring}
+\usetikzlibrary{calc,shadows,shapes,shapes.symbols,positioning,math,decorations.text}
+
+% ----------------------------------------------------------------------------
+% Default values
+% ----------------------------------------------------------------------------
+\makeatletter
+\newdimen\fl@gwidth
+\newdimen\fl@glength
+\newdimen\cutdepth
+\newdimen\saltiredepth
+
+\def\setflagdimensions{%
+ \fl@gwidth=15ex
+ \fl@glength=\fl@gwidth
+ \cutdepth=0.75\fl@gwidth
+ % 1.414 / 10 = 0.1414
+ \saltiredepth=0.1414\fl@gwidth
+}
+\def\fl@gvariant{0} % 2022-07-09
+\def\fl@gstretch{0}
+\def\fr@mecolor{black!60}
+\def\gr@dcolor{black!80}
+\newif\if@mbl@m\@mbl@mtrue
+\newif\if@rid\@ridfalse
+\newif\ifn@@mbl@m\n@@mbl@mtrue
+\def\view@ngle{0}
+\def\hang@ngle{0}
+
+% ----------------------------------------------------------------------------
+% Colors
+% ----------------------------------------------------------------------------
+\definecolor{gridcolor}{rgb}{0.8,0.8,0.8}
+
+\definecolor{argent}{rgb}{1.0,1.0,1.0}
+\definecolor{or}{rgb}{1.0,1.0,0.0}
+\definecolor{gules}{rgb}{1.0,0.0,0.0}
+\definecolor{azure}{rgb}{0.0,0.5,1.0}
+\definecolor{vert}{rgb}{0.0,0.5,0.0}
+\definecolor{sable}{rgb}{0.0,0.0,0.0}
+
+% ----------------------------------------------------------------------------
+% Base flag
+% ----------------------------------------------------------------------------
+% A Alfa, swallowtailed per pale argent and azure
+\newcommand{\flagAname}{Alfa}
+\newcommand{\flagAblazon}{swallowtailed per pale argent and azure}
+\newcommand{\flagA}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [argent] (0,0) rectangle (0.5\fl@gwidth,\fl@glength);
+ \fill [azure] (0.5\fl@gwidth,0)
+ -- (\fl@gwidth,0)
+ -- (\cutdepth,0.5\fl@glength)
+ -- (\fl@gwidth,\fl@glength)
+ -- (0.5\fl@gwidth,\fl@glength)
+ -- cycle;
+ \draw [gridcolor] (0,0)
+ -- (\fl@gwidth,0)
+ -- (\cutdepth,0.5\fl@glength)
+ -- (\fl@gwidth,\fl@glength)
+ -- (0,\fl@glength)
+ -- cycle;
+ \end{tikzpicture}%
+}
+
+% B Bravo, swallowtailed gules
+\newcommand{\flagBname}{Bravo}
+\newcommand{\flagBblazon}{swallowtailed gules}
+\newcommand{\flagB}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [gules] (00,0)
+ -- (\fl@gwidth,0)
+ -- (\cutdepth,0.5\fl@glength)
+ -- (\fl@gwidth,\fl@glength)
+ -- (0,\fl@glength)
+ -- cycle;
+ \draw [gridcolor] (0,0)
+ -- (\fl@gwidth,0)
+ -- (\cutdepth,0.5\fl@glength)
+ -- (\fl@gwidth,\fl@glength)
+ -- (0,\fl@glength)
+ -- cycle;
+ \end{tikzpicture}%
+}
+
+% C Charlie, azure a fess gules fimbriated argent
+\newcommand{\flagCname}{Charlie}
+\newcommand{\flagCblazon}{azure a fess gules fimbriated argent}
+\newcommand{\flagC}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [azure] (0,0) rectangle (\fl@gwidth,0.2\fl@glength);
+ \fill [argent] (0,0.2\fl@glength) rectangle (\fl@gwidth,0.4\fl@glength);
+ \fill [gules] (0,0.4\fl@glength) rectangle (\fl@gwidth,0.6\fl@glength);
+ \fill [argent] (0,0.6\fl@glength) rectangle (\fl@gwidth,0.8\fl@glength);
+ \fill [azure] (0,0.8\fl@glength) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% D Delta, gules a pale argent
+\newcommand{\flagDname}{Delta}
+\newcommand{\flagDblazon}{gules a pale argent}
+\newcommand{\flagD}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) rectangle (\fl@gwidth,0.25\fl@glength);
+ \fill [azure] (0,0.25\fl@glength) rectangle (\fl@gwidth,0.75\fl@glength);
+ \fill [or] (0,0.75\fl@glength) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% E Echo, per fess azure and gules
+\newcommand{\flagEname}{Echo}
+\newcommand{\flagEblazon}{per fess azure and gules}
+\newcommand{\flagE}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [gules] (0,0) rectangle (\fl@gwidth,0.5\fl@glength);
+ \fill [azure] (0,0.5\fl@glength) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% F Foxtrot, argent, a lozenge throughout gules
+\newcommand{\flagFname}{Foxtrot}
+\newcommand{\flagFblazon}{argent, a lozenge throughout gules}
+\newcommand{\flagF}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [argent] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [gules] (0.5\fl@gwidth,0)
+ -- (\fl@gwidth,0.5\fl@glength)
+ -- (0.5\fl@gwidth,\fl@glength)
+ -- (0,0.5\fl@glength)
+ -- cycle;
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% G Golf, Paly of six or and azure
+\newcommand{\flagGname}{Golf}
+\newcommand{\flagGblazon}{Paly of six or and azure}
+\newcommand{\flagG}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) rectangle (0.1666667\fl@gwidth,\fl@glength);
+ \fill [azure] (0.1666667\fl@gwidth,0) rectangle (0.3333333\fl@gwidth,\fl@glength);
+ \fill [or] (0.3333333\fl@gwidth,0) rectangle (0.5\fl@gwidth,\fl@glength);
+ \fill [azure] (0.5\fl@gwidth,0) rectangle (0.6666667\fl@gwidth,\fl@glength);
+ \fill [or] (0.6666667\fl@gwidth,0) rectangle (0.8333333\fl@gwidth,\fl@glength);
+ \fill [azure] (0.8333333\fl@gwidth,0) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% H Hotel, per pale argent and gules
+\newcommand{\flagHname}{Hotel}
+\newcommand{\flagHblazon}{per pale argent and gules}
+\newcommand{\flagH}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [argent] (0,0) rectangle (0.5\fl@gwidth,\fl@glength);
+ \fill [gules] (0.5\fl@gwidth,0) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% I India, or, a pellet
+\newcommand{\flagIname}{India}
+\newcommand{\flagIblazon}{or, a pellet}
+\newcommand{\flagI}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [sable] (0.5\fl@gwidth,0.5\fl@glength) circle (0.25\fl@gwidth);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% J Juliet, azure, a fess argent
+\newcommand{\flagJname}{Juliet}
+\newcommand{\flagJblazon}{azure, a fess argent}
+\newcommand{\flagJ}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [azure] (0,0) rectangle (\fl@gwidth,0.333333*\fl@glength);
+ \fill [argent] (0,0.333333*\fl@glength) rectangle (\fl@gwidth,0.666667*\fl@glength);
+ \fill [azure] (0,0.666667*\fl@glength) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% K Kilo, per pale or and azure
+\newcommand{\flagKname}{Kilo}
+\newcommand{\flagKblazon}{per pale or and azure}
+\newcommand{\flagK}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) rectangle (0.5\fl@gwidth,\fl@glength);
+ \fill [azure] (0.5\fl@gwidth,0) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% L Lima, quarterly or and sable
+\newcommand{\flagLname}{Lima}
+\newcommand{\flagLblazon}{quarterly or and sable}
+\newcommand{\flagL}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [sable] (0,0) rectangle (0.5\fl@gwidth,0.5\fl@glength);
+ \fill [or] (0.5\fl@gwidth,0) rectangle (\fl@gwidth,0.5\fl@glength);
+ \fill [or] (0,0.5\fl@glength) rectangle (0.5\fl@gwidth,\fl@glength);
+ \fill [sable] (0.5\fl@gwidth,0.5\fl@glength) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% M Mike, azure, a saltire argent
+\newcommand{\flagMname}{Mike}
+\newcommand{\flagMblazon}{azure, a saltire argent}
+\newcommand{\flagM}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [azure] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [argent] (0,0)
+ -- (\saltiredepth,0)
+ -- (\fl@gwidth,\fl@glength-\saltiredepth)
+ -- (\fl@gwidth,\fl@glength)
+ -- (\fl@gwidth-\saltiredepth,\fl@glength)
+ -- (0,\saltiredepth)
+ -- cycle;
+ \fill [argent] (0,\fl@glength)
+ -- (\saltiredepth,\fl@glength)
+ -- (\fl@gwidth,\saltiredepth)
+ -- (\fl@gwidth,0)
+ -- (\fl@gwidth-\saltiredepth,0)
+ -- (0,\fl@glength-\saltiredepth)
+ -- cycle;
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% N November, chequy of sixteen azure and argent
+\newcommand{\flagNname}{November}
+\newcommand{\flagNblazon}{chequy of sixteen azure and argent}
+\newcommand{\flagN}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [argent] (0,0) rectangle (0.25\fl@gwidth,0.25\fl@glength);
+ \fill [azure] (0.25\fl@gwidth,0) rectangle (0.5\fl@gwidth,0.25\fl@glength);
+ \fill [argent] (0.5\fl@gwidth,0) rectangle (0.75\fl@gwidth,0.25\fl@glength);
+ \fill [azure] (0.75\fl@gwidth,0) rectangle (\fl@gwidth,0.25\fl@glength);
+ \fill [azure] (0,0.25\fl@glength) rectangle (0.25\fl@gwidth,0.5\fl@glength);
+ \fill [argent] (0.25\fl@gwidth,0.25\fl@glength) rectangle (0.5\fl@gwidth,0.5\fl@glength);
+ \fill [azure] (0.5\fl@gwidth,0.25\fl@glength) rectangle (0.75\fl@gwidth,0.5\fl@glength);
+ \fill [argent] (0.75\fl@gwidth,0.25\fl@glength) rectangle (\fl@gwidth,0.5\fl@glength);
+ \fill [argent] (0,0.5\fl@glength) rectangle (0.25\fl@gwidth,0.75\fl@glength);
+ \fill [azure] (0.25\fl@gwidth,0.5\fl@glength) rectangle (0.5\fl@gwidth,0.75\fl@glength);
+ \fill [argent] (0.5\fl@gwidth,0.5\fl@glength) rectangle (0.75\fl@gwidth,0.75\fl@glength);
+ \fill [azure] (0.75\fl@gwidth,0.5\fl@glength) rectangle (\fl@gwidth,0.75\fl@glength);
+ \fill [azure] (0,0.75\fl@glength) rectangle (0.25\fl@gwidth,\fl@glength);
+ \fill [argent] (0.25\fl@gwidth,0.75\fl@glength) rectangle (0.5\fl@gwidth,\fl@glength);
+ \fill [azure] (0.5\fl@gwidth,0.75\fl@glength) rectangle (0.75\fl@gwidth,\fl@glength);
+ \fill [argent] (0.75\fl@gwidth,0.75\fl@glength) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% O Oscar, per bend gules and or
+\newcommand{\flagOname}{Oscar}
+\newcommand{\flagOblazon}{per bend gules and or}
+\newcommand{\flagO}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) -- (0,\fl@glength) -- (\fl@gwidth,0) -- cycle;
+ \fill [gules] (0,\fl@glength) -- (\fl@gwidth,\fl@glength) -- (\fl@gwidth,0) -- cycle;
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% P Papa, azure, an inescutcheon argent
+\newcommand{\flagPname}{Papa}
+\newcommand{\flagPblazon}{azure, an inescutcheon argent}
+\newcommand{\flagP}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [azure] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [argent] (0.333333\fl@gwidth,0.333333\fl@glength) rectangle (0.666667\fl@gwidth,0.666667\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% Q Quebec, or
+\newcommand{\flagQname}{Quebec}
+\newcommand{\flagQblazon}{or}
+\newcommand{\flagQ}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% R Romeo, gules, a cross or
+\newcommand{\flagRname}{Romeo}
+\newcommand{\flagRblazon}{gules, a cross or}
+\newcommand{\flagR}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [gules] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [or] (0.4\fl@gwidth,0) rectangle (0.6\fl@gwidth,\fl@glength);
+ \fill [or] (0,0.4\fl@glength) rectangle (\fl@gwidth,0.6\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% S Sierra, argent, an inescutcheon azure
+\newcommand{\flagSname}{Sierra}
+\newcommand{\flagSblazon}{argent, an inescutcheon azure}
+\newcommand{\flagS}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [argent] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [azure] (0.333333\fl@gwidth,0.333333\fl@glength) rectangle (0.666667\fl@gwidth,0.666667\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% T Tango, tierced in pale gules, argent and azure
+\newcommand{\flagTname}{Tango}
+\newcommand{\flagTblazon}{tierced in pale gules, argent and azure}
+\newcommand{\flagT}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [gules] (0,0) rectangle (0.333333\fl@gwidth,\fl@glength);
+ \fill [argent] (0.333333\fl@gwidth,0) rectangle (0.666667\fl@gwidth,\fl@glength);
+ \fill [azure] (0.666667\fl@gwidth,0) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% U Uniform, quarterly gules and argent
+\newcommand{\flagUname}{Uniform}
+\newcommand{\flagUblazon}{quarterly gules and argent}
+\newcommand{\flagU}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [argent] (0,0) rectangle (0.5\fl@gwidth,0.5\fl@glength);
+ \fill [gules] (0.5\fl@gwidth,0) rectangle (\fl@gwidth,0.5\fl@glength);
+ \fill [gules] (0,0.5\fl@glength) rectangle (0.5\fl@gwidth,\fl@glength);
+ \fill [argent] (0.5\fl@gwidth,0.5\fl@glength) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% V Victor, argent, a saltire gules
+\newcommand{\flagVname}{Victor}
+\newcommand{\flagVblazon}{argent, a saltire gules}
+\newcommand{\flagV}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [argent] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [gules] (0,0)
+ -- (\saltiredepth,0)
+ -- (\fl@gwidth,\fl@glength-\saltiredepth)
+ -- (\fl@gwidth,\fl@glength)
+ -- (\fl@gwidth-\saltiredepth,\fl@glength)
+ -- (0,\saltiredepth)
+ -- cycle;
+ \fill [gules] (0,\fl@glength)
+ -- (\saltiredepth,\fl@glength)
+ -- (\fl@gwidth,\saltiredepth)
+ -- (\fl@gwidth,0)
+ -- (\fl@gwidth-\saltiredepth,0)
+ -- (0,\fl@glength-\saltiredepth)
+ -- cycle;
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% W Whiskey, azure, an inescutcheon gules fimbriated argent
+\newcommand{\flagWname}{Whiskey}
+\newcommand{\flagWblazon}{azure, an inescutcheon gules fimbriated argent}
+\newcommand{\flagW}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [azure] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [argent] (0.2\fl@gwidth,0.2\fl@glength) rectangle (0.8\fl@gwidth,0.8\fl@glength);
+ \fill [gules] (0.4\fl@gwidth,0.4\fl@glength) rectangle (0.6\fl@gwidth,0.6\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% X X-ray, argent, a cross azure
+\newcommand{\flagXname}{X-ray}
+\newcommand{\flagXblazon}{argent, a cross azure}
+\newcommand{\flagX}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [argent] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [azure] (0.4\fl@gwidth,0) rectangle (0.6\fl@gwidth,\fl@glength);
+ \fill [azure] (0,0.4\fl@glength) rectangle (\fl@gwidth,0.6\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% Y Yankee, bendy sinister of ten or and gules
+\newcommand{\flagYname}{Yankee}
+\newcommand{\flagYblazon}{bendy sinister of ten or and gules}
+\newcommand{\flagY}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [gules] (0,0.8\fl@glength)
+ -- (0.2\fl@gwidth,\fl@glength)
+ -- (0.4\fl@gwidth,\fl@glength)
+ -- (0,0.6\fl@glength)
+ -- cycle;
+ \fill [gules] (0,0.4\fl@glength)
+ -- (0.6\fl@gwidth,\fl@glength)
+ -- (0.8\fl@gwidth,\fl@glength)
+ -- (0,0.2\fl@glength)
+ -- cycle;
+ \fill [gules] (0,0)
+ -- (\fl@gwidth,\fl@glength)
+ -- (\fl@gwidth,0.8\fl@glength)
+ -- (0.2\fl@gwidth,0)
+ -- cycle;
+ \fill [gules] (0.4\fl@gwidth,0)
+ -- (\fl@gwidth,0.6\fl@glength)
+ -- (\fl@gwidth,0.4\fl@glength)
+ -- (0.6\fl@gwidth,0)
+ -- cycle;
+ \fill [gules] (0.8\fl@gwidth,0)
+ -- (\fl@gwidth,0.2\fl@glength)
+ -- (\fl@gwidth,0)
+ -- cycle;
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% Z Zulu, per saltire or, sable, gules, and azure
+\newcommand{\flagZname}{Zulu}
+\newcommand{\flagZblazon}{per saltire or, sable, gules, and azure}
+\newcommand{\flagZ}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [sable] (0,0) -- (0,\fl@glength) -- (0.5\fl@gwidth,0.5\fl@glength) -- cycle;
+ \fill [gules] (0,0) -- (\fl@gwidth,0) -- (0.5\fl@gwidth,0.5\fl@glength) -- cycle;
+ \fill [azure] (\fl@gwidth,0) -- (\fl@gwidth,\fl@glength) -- (0.5\fl@gwidth,0.5\fl@glength) -- cycle;
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% 0 Zero, argent, five crosses hummetty azure in saltire
+\newcommand{\flagZeroName}{Zero}
+\newcommand{\flagZeroBlazon}{argent, five crosses hummetty azure in saltire}
+\newcommand{\flagZero}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [argent] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ %
+ \fill [azure] (0.066667\fl@gwidth,0.066667\fl@glength) rectangle (0.266667\fl@gwidth,0.266667\fl@glength);
+ \fill [argent] (0.066667\fl@gwidth,0.066667\fl@glength) rectangle (0.133333\fl@gwidth,0.133333\fl@glength);
+ \fill [argent] (0.066667\fl@gwidth,0.2\fl@glength) rectangle (0.133333\fl@gwidth,0.266667\fl@glength);
+ \fill [argent] (0.2\fl@gwidth,0.066667\fl@glength) rectangle (0.266667\fl@gwidth,0.133333\fl@glength);
+ \fill [argent] (0.2\fl@gwidth,0.2\fl@glength) rectangle (0.266667\fl@gwidth,0.266667\fl@glength);
+ \draw [argent] (0.066667\fl@gwidth,0.066667\fl@glength) rectangle (0.266667\fl@gwidth,0.266667\fl@glength);
+ %
+ \fill [azure] (0.066667\fl@gwidth,0.733333\fl@glength) rectangle (0.266667\fl@gwidth,0.933333\fl@glength);
+ \fill [argent] (0.066667\fl@gwidth,0.733333\fl@glength) rectangle (0.133333\fl@gwidth,0.8\fl@glength);
+ \fill [argent] (0.066667\fl@gwidth,0.866667\fl@glength) rectangle (0.133333\fl@gwidth,0.933333\fl@glength);
+ \fill [argent] (0.2\fl@gwidth,0.733333\fl@glength) rectangle (0.266667\fl@gwidth,0.8\fl@glength);
+ \fill [argent] (0.2\fl@gwidth,0.866667\fl@glength) rectangle (0.266667\fl@gwidth,0.933333\fl@glength);
+ \draw [argent] (0.066667\fl@gwidth,0.733333\fl@glength) rectangle (0.266667\fl@gwidth,0.933333\fl@glength);
+ %
+ \fill [azure] (0.733333\fl@gwidth,0.066667\fl@glength) rectangle (0.933333\fl@gwidth,0.266667\fl@glength);
+ \fill [argent] (0.733333\fl@gwidth,0.066667\fl@glength) rectangle (0.8\fl@gwidth,0.133333\fl@glength);
+ \fill [argent] (0.733333\fl@gwidth,0.2\fl@glength) rectangle (0.8\fl@gwidth,0.266667\fl@glength);
+ \fill [argent] (0.866667\fl@gwidth,0.066667\fl@glength) rectangle (0.933333\fl@gwidth,0.133333\fl@glength);
+ \fill [argent] (0.866667\fl@gwidth,0.2\fl@glength) rectangle (0.933333\fl@gwidth,0.266667\fl@glength);
+ \draw [argent] (0.733333\fl@gwidth,0.066667\fl@glength) rectangle (0.933333\fl@gwidth,0.266667\fl@glength);
+ %
+ \fill [azure] (0.733333\fl@gwidth,0.733333\fl@glength) rectangle (0.933333\fl@gwidth,0.933333\fl@glength);
+ \fill [argent] (0.733333\fl@gwidth,0.733333\fl@glength) rectangle (0.8\fl@gwidth,0.8\fl@glength);
+ \fill [argent] (0.733333\fl@gwidth,0.866667\fl@glength) rectangle (0.8\fl@gwidth,0.933333\fl@glength);
+ \fill [argent] (0.866667\fl@gwidth,0.733333\fl@glength) rectangle (0.933333\fl@gwidth,0.8\fl@glength);
+ \fill [argent] (0.866667\fl@gwidth,0.866667\fl@glength) rectangle (0.933333\fl@gwidth,0.933333\fl@glength);
+ \draw [argent] (0.733333\fl@gwidth,0.733333\fl@glength) rectangle (0.933333\fl@gwidth,0.933333\fl@glength);
+ % cross centered on 0.5\fl@gwidth, 0.5\fl@glength
+ \fill [azure] (0.4\fl@gwidth,0.4\fl@glength) rectangle (0.6\fl@gwidth,0.6\fl@glength);
+ \fill [argent] (0.4\fl@gwidth,0.4\fl@glength) rectangle (0.466667\fl@gwidth,0.466667\fl@glength);
+ \fill [argent] (0.4\fl@gwidth,0.533333\fl@glength) rectangle (0.466667\fl@gwidth,0.6\fl@glength);
+ \fill [argent] (0.533333\fl@gwidth,0.4\fl@glength) rectangle (0.6\fl@gwidth,0.466667\fl@glength);
+ \fill [argent] (0.533333\fl@gwidth,0.533333\fl@glength) rectangle (0.6\fl@gwidth,0.6\fl@glength);
+ \draw [argent] (0.4\fl@gwidth,0.4\fl@glength) rectangle (0.6\fl@gwidth,0.6\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% 1 One, gules, a fess or
+\newcommand{\flagOneName}{One}
+\newcommand{\flagOneBlazon}{gules, a fess or}
+\newcommand{\flagOne}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [gules] (0,0) rectangle (\fl@gwidth,0.333333\fl@glength);
+ \fill [or] (0,0.333333\fl@glength) rectangle (\fl@gwidth,0.666667\fl@glength);
+ \fill [gules] (0,0.666667\fl@glength) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% 2 Two, or, a fess gules
+\newcommand{\flagTwoName}{Two}
+\newcommand{\flagTwoBlazon}{or, a fess gules}
+\newcommand{\flagTwo}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) rectangle (\fl@gwidth,0.333333\fl@glength);
+ \fill [gules] (0,0.333333\fl@glength) rectangle (\fl@gwidth,0.666667\fl@glength);
+ \fill [or] (0,0.666667\fl@glength) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% 3 Three, azure, a fess gules
+\newcommand{\flagThreeName}{Three}
+\newcommand{\flagThreeBlazon}{azure, a fess gules}
+\newcommand{\flagThree}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [azure] (0,0) rectangle (\fl@gwidth,0.333333\fl@glength);
+ \fill [gules] (0,0.333333\fl@glength) rectangle (\fl@gwidth,0.666667\fl@glength);
+ \fill [azure] (0,0.666667\fl@glength) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% 4 Four, gules, a saltire argent
+\newcommand{\flagFourName}{Four}
+\newcommand{\flagFourBlazon}{gules, a saltire argent}
+\newcommand{\flagFour}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [gules] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [argent] (0,0)
+ -- (\saltiredepth,0)
+ -- (\fl@gwidth,\fl@glength-\saltiredepth)
+ -- (\fl@gwidth,\fl@glength)
+ -- (\fl@gwidth-\saltiredepth,\fl@glength)
+ -- (0,\saltiredepth)
+ -- cycle;
+ \fill [argent] (0,\fl@glength)
+ -- (\saltiredepth,\fl@glength)
+ -- (\fl@gwidth,\saltiredepth)
+ -- (\fl@gwidth,0)
+ -- (\fl@gwidth-\saltiredepth,0)
+ -- (0,\fl@glength-\saltiredepth)
+ -- cycle;
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% 5 Five, or, a saltire azure
+\newcommand{\flagFiveName}{Five}
+\newcommand{\flagFiveBlazon}{or, a saltire azure}
+\newcommand{\flagFive}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [azure] (0,0)
+ -- (\saltiredepth,0)
+ -- (\fl@gwidth,\fl@glength-\saltiredepth)
+ -- (\fl@gwidth,\fl@glength)
+ -- (\fl@gwidth-\saltiredepth,\fl@glength)
+ -- (0,\saltiredepth)
+ -- cycle;
+ \fill [azure] (0,\fl@glength)
+ -- (\saltiredepth,\fl@glength)
+ -- (\fl@gwidth,\saltiredepth)
+ -- (\fl@gwidth,0)
+ -- (\fl@gwidth-\saltiredepth,0)
+ -- (0,\fl@glength-\saltiredepth)
+ -- cycle;
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% 6 Six, bendy sinister of seven argent and azure
+\newcommand{\flagSixName}{Six}
+\newcommand{\flagSixBlazon}{bendy sinister of seven argent and azure}
+\newcommand{\flagSix}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [argent] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \fill [azure] (0,0.142857\fl@glength)
+ -- (0.857143\fl@gwidth,\fl@glength)
+ -- (\fl@gwidth,\fl@glength)
+ -- (\fl@gwidth,0.857143\fl@glength)
+ -- (0.142857\fl@gwidth,0)
+ -- (0,0)
+ -- cycle;
+ \fill [azure] (0,0.428571\fl@glength)
+ -- (0.571429\fl@gwidth,\fl@glength)
+ -- (0.285714\fl@gwidth,\fl@glength)
+ -- (0,0.714286\fl@glength)
+ -- cycle;
+ \fill [azure] (\fl@gwidth,0.571429\fl@glength)
+ -- (\fl@gwidth,0.285714\fl@glength)
+ -- (0.714286\fl@gwidth,0)
+ -- (0.428571\fl@gwidth,0)
+ -- cycle;
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% 7 Seven, gules, a pale argent
+\newcommand{\flagSevenName}{Seven}
+\newcommand{\flagSevenBlazon}{gules, a pale argent}
+\newcommand{\flagSeven}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [gules] (0,0) rectangle (0.333333\fl@gwidth,\fl@glength);
+ \fill [argent] (0.333333\fl@gwidth,0) rectangle (0.666667\fl@gwidth,\fl@glength);
+ \fill [gules] (0.666667\fl@gwidth,0) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% 8 Eight, or, a pale azure
+\newcommand{\flagEightName}{Eight}
+\newcommand{\flagEightBlazon}{or, a pale azure}
+\newcommand{\flagEight}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [or] (0,0) rectangle (0.333333\fl@gwidth,\fl@glength);
+ \fill [azure] (0.333333\fl@gwidth,0) rectangle (0.666667\fl@gwidth,\fl@glength);
+ \fill [or] (0.666667\fl@gwidth,0) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
+
+% 9 Nine, azure, a pale argent
+\newcommand{\flagNineName}{Nine}
+\newcommand{\flagNineBlazon}{azure, a pale argent}
+\newcommand{\flagNine}{%
+ \setflagdimensions
+ \begin{tikzpicture}
+ \fill [azure] (0,0) rectangle (0.333333\fl@gwidth,\fl@glength);
+ \fill [argent] (0.333333\fl@gwidth,0) rectangle (0.666667\fl@gwidth,\fl@glength);
+ \fill [azure] (0.666667\fl@gwidth,0) rectangle (\fl@gwidth,\fl@glength);
+ \draw [gridcolor] (0,0) rectangle (\fl@gwidth,\fl@glength);
+ \end{tikzpicture}%
+}
diff --git a/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.pdf b/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.pdf
index bf929693ef..aa999d601b 100644
--- a/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.pdf
+++ b/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.tex b/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.tex
index b05a67fe68..f3c60c9d00 100644
--- a/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.tex
+++ b/graphics/pgf/contrib/outilsgeomtikz/doc/OutilsGeomTikz-doc.tex
@@ -1,13 +1,16 @@
% !TeX TXS-program:compile = txs:///arara
-% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode}
-% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
+% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode}
+% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
\documentclass[french,a4paper,11pt]{article}
\usepackage[margin=2cm,includefoot]{geometry}
-\def\TPversion{0.1.5}
-\def\TPdate{13 décembre 2023}
+\def\TPversion{0.1.6}
+\def\TPdate{29 août 2024}
+\usepackage{amssymb}
\usepackage[table,svgnames]{xcolor}
-\usepackage[bold-style=ISO,math-style=french]{concmath-otf}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+%\usepackage[bold-style=ISO,math-style=french]{concmath-otf}
%\usepackage[bold-style=ISO,math-style=french]{unicode-math}
%\setmainfont{TeX Gyre Schola}
%\setmathfont{TeX Gyre Schola Math}
@@ -91,8 +94,8 @@
\newcommand\affichegrille[4]{%
\draw[xstep=1,ystep=1,lightgray] (#1,#3) grid (#2,#4) ;
- \foreach \x in {#1,\inteval{1+#1},...,#2} \draw[lightgray] (\x,#4)--++(0,3pt) node[font=\scriptsize,above] {$\x$} ;
- \foreach \y in {#3,\inteval{1+#3},...,#4} \draw[lightgray] (#1,\y)--++(-3pt,0) node[font=\scriptsize,left] {$\y$} ;
+ \foreach \x in {#1,\inteval{1+#1},...,#2} {\draw[lightgray] (\x,#4)--++(0,3pt) node[font=\scriptsize,above] {$\x$} ;}
+ \foreach \y in {#3,\inteval{1+#3},...,#4} {\draw[lightgray] (#1,\y)--++(-3pt,0) node[font=\scriptsize,left] {$\y$} ;}
}
\newcommand\pointsutiles[1]{%
\foreach \point in {#1} {\draw[thick,fill=red] \point circle[radius=3pt] ;}
@@ -170,7 +173,7 @@
\vfill
-\hfill\textit{Merci à Arnaud pour ses retours et idées !!}
+\hfill\textit{Merci à Arnaud et Cyril pour leurs retours et idées !!}
\vfill
@@ -197,7 +200,9 @@
\part{Historique}
-\verb|v0.1.4 : |Modification de la graduation intérieure pour les rapporteurs 180°
+\verb|v0.1.6 : |Correction d'un bug avec une compilation en \textsf{pdflatex} + Améliorations pour les rotations des labels
+
+\verb|v0.1.5 : |Modification de la graduation intérieure pour les rapporteurs 180°
\verb|v0.1.4 : |Possibilité de positionner certains outils avec deux points (angle calculé automatiquement)
@@ -288,10 +293,8 @@ Les différents outils disponibles ont \textit{grosso-modo} le même mode de fon
\item pour certains outils, des dimensions minimales sont requises pour un aspect acceptable ;
\item les options personnalisables sont (sauf exceptions) :
\begin{itemize}
- \item la \textit{taille} ;
- \item l'\textit{échelle} globale ou l'\textit{échelle} des éventuels labels ;
- \item les \textit{couleurs} ;
- \item le \textit{fond} (couleur et opacité) ;
+ \item la \textit{taille}, l'\textit{échelle} globale ou l'\textit{échelle} des éventuels labels ;
+ \item les \textit{couleurs}, le \textit{fond} (couleur et opacité) ;
\item la position (\textit{placement} et/ou \textit{rotation}) ;
\item un \textit{placement automatique} avec la données de 2 points.
\end{itemize}
@@ -326,7 +329,7 @@ Les outils disponibles sont à insérer dans un environnement \TikZ, et pour le
\tkzCompas[clés]{pointe}{mine}
\end{PresentationCode}
-\subsection{Utilisation d'unités}
+\subsection{Utilisation d'unités et/ou de rotations}
\begin{tipblock}
Les outils ont été créés avec unité de base de 1~cm, afin que les graduations soient \textit{en taille réelle}.
@@ -338,6 +341,10 @@ Il est toutefois possible de modifier les unités de l'environnement \TikZ, dans
\smallskip
Ce choix est donc à \textit{réserver} dans l'optique de faire des petits schémas pour illustrer des positions d'outils.
+
+\smallskip
+
+Du fait des rotations effectuées par le code pour correctement placer les objets et les graduations, il est conseillé (même si cela devrait fonctionner) de ne pas trop spécifier de rotation globale pour l'environnement \texttt{tikzpicture}\ldots
\end{tipblock}
\pagebreak
@@ -430,6 +437,7 @@ Quelques \Cle{clés} de personnalisation sont disponibles :
\item \Cle{CouleurFond} pour la couleur du fond de la règle ;\hfill~(défaut : \Cle{black})
\item \Cle{Opacite} pour régler l'opacité du fond de la règle ;\hfill~(défaut : \Cle{0.5})
\item le booléen \Cle{AfficheValeurs} pour afficher les valeurs des graduations ;\hfill~(défaut : \Cle{true})
+ \item \Cle{EchelleValeurs} pour l'échelle (relative) des valeurs ;\hfill~(défaut : \Cle{0.8})
\item \Cle{PosVal} pour spécifier la position (haut, milieu, etc) des valeurs, parmi \Cle{h/m/b/hb}.
\hfill~(défaut : \Cle{m})
@@ -501,6 +509,7 @@ Quelques \Cle{clés} de personnalisation sont disponibles :
\item \Cle{CouleurFond} pour la couleur du fond de la règle-repère ;\hfill~(défaut : \Cle{black})
\item \Cle{Opacite} pour régler l'opacité du fond de la règle-repère ;\hfill~(défaut : \Cle{0.5})
\item le booléen \Cle{AfficheValeurs} pour afficher les valeurs des graduations ;\hfill~(défaut : \Cle{true})
+ \item \Cle{EchelleValeurs} pour l'échelle (relative) des valeurs ;\hfill~(défaut : \Cle{0.8})
\item le booléen \Cle{Retourne} pour \textit{inverser la position des graduations}.
\hfill~(défaut : \Cle{false})
@@ -564,6 +573,7 @@ Quelques \Cle{clés} de personnalisation sont disponibles :
\item \Cle{Origine} pour le placer l'équerre (au niveau du coin) ;\hfill~(défaut : \Cle{\{(0,0)\}})
\item \Cle{Rotation} pour pivoter l'équerre (au niveau du coin) ;\hfill~(défaut : \Cle{0})
\item \Cle{Echelle} pour l'échelle globale de l'équerre ;\hfill~(défaut : \Cle{1})
+ \item \Cle{EchelleValeurs} pour l'échelle (relative) des valeurs ;\hfill~(défaut : \Cle{0.8})
\item \Cle{Couleur} pour la couleur des éléments de l'équerre ;\hfill~(défaut : \Cle{black})
\item le booléen \Cle{Fond} pour afficher une couleur de fond pour l'équerre ;\hfill~(défaut : \Cle{false})
\item \Cle{CouleurFond} pour la couleur du fond de l'équerre ;\hfill~(défaut : \Cle{black})
@@ -749,7 +759,8 @@ Quelques \Cle{clés} de personnalisation sont disponibles :
\item le booléen \Cle{Fond} pour afficher une couleur de fond pour la réquerre ;\hfill~(défaut : \Cle{false})
\item \Cle{CouleurFond} pour la couleur du fond de la réquerre ;\hfill~(défaut : \Cle{black})
\item \Cle{Opacite} pour régler l'opacité du fond de la réquerre ;\hfill~(défaut : \Cle{0.5})
- \item le booléen \Cle{AfficheValeurs} pour afficher les valeurs des graduations.\hfill~(défaut : \Cle{true})
+ \item le booléen \Cle{AfficheValeurs} pour afficher les valeurs des graduations ;\hfill~(défaut : \Cle{true})
+ \item \Cle{EchelleValeurs} pour l'échelle (relative) des valeurs.\hfill~(défaut : \Cle{0.8})
\end{itemize}
À noter que pour la clé \Cle{Rotation}, il est possible de préciser un deuxième point, et dans ce cas la clé sera précisée sous la forme \Cle{Rotation=auto/pt}. Dans \textbf{ce cas}, les points \textit{support} \textbf{devront} avoir été déclarés au préalable !
diff --git a/graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty b/graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty
index bb79723d21..5f6cd30410 100644
--- a/graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty
+++ b/graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty
@@ -2,7 +2,8 @@
% licence........: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{OutilsGeomTikz}[2023/12/13 v0.1.5 Outils geometriques en TikZ]
+\ProvidesPackage{OutilsGeomTikz}[2024/08/29 v0.1.6 Outils geometriques en TikZ]
+% 0.1.6 Correction de bugs avec pdflatex + amélioration de la gestion des rotations/échelles des labels (tks Cyril I. ^^)
% 0.1.5 Modification de la graduation intérieure pour les rapporteurs 180°
% 0.1.4 Possibilité de positionner les outils avec deux points (angle calculé automatiquement)
% 0.1.3 Ajout du pourcenteur
@@ -60,7 +61,8 @@
Origine=\xdef\REGLposOrigin{#1},%
Rotation=\def\REGLangle{#1},%
Opacite=\def\REGLopac{#1},%
- PosVal=\def\REGLposval{#1}
+ PosVal=\def\REGLposval{#1},%
+ EchelleValeurs=\def\REGLechlabel{#1}
}
\setKVdefault[RegleGeom]{%
@@ -74,7 +76,8 @@
AfficheValeurs=true,%
Fond=false,%
Opacite=0.5,%
- PosVal=m
+ PosVal=m,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzRegle}{ O{} }{%
@@ -88,7 +91,7 @@
}{}%
\xdef\REGLlongueur{\fpeval{max(3,\REGLlongueur)}}%valeurs mini
\xdef\REGLlargeur{\fpeval{max(1.5,\REGLlargeur)}}
- \begin{scope}[shift={(\REGLposOrigin)},rotate=\REGLangle,scale=\REGLechelle]
+ \begin{scope}[shift={(\REGLposOrigin)},rotate=\REGLangle,scale=\REGLechelle,transform shape]
\ifboolKV[RegleGeom]{Fond}
{%
\begin{scope}
@@ -104,13 +107,13 @@
\ifboolKV[RegleGeom]{AfficheValeurs}%
{%
\IfSubStr{\REGLposval}{h}
- {\foreach \i in {0,1,...,\REGLlongueur} \draw[\REGLcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLangle,scale={0.8*\REGLechelle},font=\small,below] {$\i$} ;}
+ {\foreach \i in {0,1,...,\REGLlongueur} {\draw[\REGLcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLechlabel},font=\small,below] {$\i$} ;}}
{}
\IfSubStr{\REGLposval}{m}
- {\foreach \i in {0,1,...,\REGLlongueur} \draw[\REGLcouleur] (\i,{-0.5*\REGLlargeur}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLangle,scale={0.8*\REGLechelle},font=\small] {$\i$} ;}
+ {\foreach \i in {0,1,...,\REGLlongueur} {\draw[\REGLcouleur] (\i,{-0.5*\REGLlargeur}) node[inner sep=1pt,outer sep=1pt,scale={\REGLechlabel},font=\small] {$\i$} ;}}
{}
\IfSubStr{\REGLposval}{b}
- {\foreach \i in {0,1,...,\REGLlongueur} \draw[\REGLcouleur] (\i,{-\REGLlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLangle,scale={0.8*\REGLechelle},font=\small,above] {\rotatebox{180}{$\fpeval{trunc(\REGLlongueur)-\i}$}} ;}
+ {\foreach \i in {0,1,...,\REGLlongueur} {\draw[\REGLcouleur] (\i,{-\REGLlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLechlabel},font=\small,above] {\rotatebox{180}{$\fpeval{trunc(\REGLlongueur)-\i}$}} ;}}
{}
}%
{}%
@@ -126,7 +129,8 @@
CouleurFond=\def\REGLREPcouleurfond{#1},%
Origine=\def\REGLREPposOrigin{#1},%
Rotation=\def\REGLREPangle{#1},%
- Opacite=\def\REGLREPopac{#1}
+ Opacite=\def\REGLREPopac{#1},%
+ EchelleValeurs=\def\REGLREPechlabel{#1}
}
\setKVdefault[RegleRepereGeom]{%
@@ -140,7 +144,8 @@
AfficheValeurs=true,%
Fond=false,%
Opacite=0.5,%
- Retourne=false
+ Retourne=false,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzRegleRepere}{ O{} }{%
@@ -154,7 +159,7 @@
\pgfmathanglebetweenpoints{\pgfpointanchor{\REGLREPposOrigin}{center}}{\pgfpointanchor{\tmppointdeux}{center}}%
\edef\REGLREPangle{\pgfmathresult}%
}{}%
- \begin{scope}[shift={(\REGLREPposOrigin)},rotate=\REGLREPangle,scale=\REGLREPechelle]
+ \begin{scope}[shift={(\REGLREPposOrigin)},rotate=\REGLREPangle,scale=\REGLREPechelle,transform shape]
%bases de la règle-repère
\ifboolKV[RegleRepereGeom]{Fond}%
{\draw[draw=none,fill=\REGLREPcouleurfond!10!white,fill opacity=\REGLREPopac,rounded corners] (-0.5,0) rectangle++ ({\REGLREPlongueur+1},{-\REGLREPlargeur}) ;}%
@@ -175,12 +180,12 @@
{%
\ifboolKV[RegleRepereGeom]{Retourne}%
{%
- {\foreach \i in {0,1,...,\REGLREPlongueur} \draw[\REGLREPcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLREPangle,scale={0.8*\REGLREPechelle},font=\small,below] {$\fpeval{-trunc(0.5*\REGLREPlongueur)+\i}$} ;}
- {\foreach \i in {0,1,...,\REGLREPlongueur} \draw[\REGLREPcouleur] (\i,{-\REGLREPlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLREPangle,scale={0.8*\REGLREPechelle},font=\small,above] {\rotatebox{180}{$\inteval{\REGLREPlongueur-\i}$}} ;}
+ {\foreach \i in {0,1,...,\REGLREPlongueur} {\draw[\REGLREPcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLREPechlabel},font=\small,below] {$\fpeval{-trunc(0.5*\REGLREPlongueur)+\i}$} ;}}
+ {\foreach \i in {0,1,...,\REGLREPlongueur} {\draw[\REGLREPcouleur] (\i,{-\REGLREPlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLREPechlabel},font=\small,above] {\rotatebox{180}{$\inteval{\REGLREPlongueur-\i}$}} ;}}
}%
{%
- {\foreach \i in {0,1,...,\REGLREPlongueur} \draw[\REGLREPcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLREPangle,scale={0.8*\REGLREPechelle},font=\small,below] {$\i$} ;}
- {\foreach \i in {0,1,...,\REGLREPlongueur} \draw[\REGLREPcouleur] (\i,{-\REGLREPlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,rotate=\REGLREPangle,scale={0.8*\REGLREPechelle},font=\small,above] {\rotatebox{180}{$\fpeval{trunc(0.5*\REGLREPlongueur)-\i}$}} ;}
+ {\foreach \i in {0,1,...,\REGLREPlongueur} {\draw[\REGLREPcouleur] (\i,{-0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLREPechlabel},font=\small,below] {$\i$} ;}}
+ {\foreach \i in {0,1,...,\REGLREPlongueur} {\draw[\REGLREPcouleur] (\i,{-\REGLREPlargeur+0.5}) node[inner sep=1pt,outer sep=1pt,scale={\REGLREPechlabel},font=\small,above] {\rotatebox{180}{$\fpeval{trunc(0.5*\REGLREPlongueur)-\i}$}} ;}}
}%
}
{}%
@@ -196,7 +201,8 @@
CouleurFond=\def\REQcouleurfond{#1},%
Origine=\def\REQposOrigin{#1},%
Rotation=\def\REQangle{#1},%
- Opacite=\def\REQopac{#1}
+ Opacite=\def\REQopac{#1},%
+ EchelleValeurs=\def\REQechlabel{#1}
}
\setKVdefault[RequerreGeom]{%
@@ -209,7 +215,8 @@
Rotation=0,%
AfficheValeurs=true,%
Fond=false,%
- Opacite=0.5
+ Opacite=0.5,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzRequerre}{ O{} }{%
@@ -223,7 +230,7 @@
\pgfmathanglebetweenpoints{\pgfpointanchor{\REQposOrigin}{center}}{\pgfpointanchor{\tmppointdeux}{center}}%
\edef\REQangle{\pgfmathresult}%
}{}%
- \begin{scope}[shift={(\REQposOrigin)},rotate=\REQangle,scale=\REQechelle]
+ \begin{scope}[shift={(\REQposOrigin)},rotate=\REQangle,scale=\REQechelle,transform shape]
\ifboolKV[RequerreGeom]{Fond}
{
\fill[draw=none,rounded corners,fill=\REQcouleurfond!10!white,fill opacity=\REQopac] ({-\REQlongueur*0.5},0) rectangle ({\REQlongueur*0.5},{-\REQlargeur}) ;
@@ -243,10 +250,10 @@
\end{scope}
\ifboolKV[RequerreGeom]{AfficheValeurs}%
{%
- \draw[\REQcouleur] (0,-0.5) node[inner sep=1pt,outer sep=1pt,rotate=\REQangle,scale={0.8*\REQechelle},font=\small,below] {$0$} ;
+ \draw[\REQcouleur] (0,-0.5) node[inner sep=1pt,outer sep=1pt,scale={\REQechlabel},font=\small,below] {$0$} ;
\foreach \i in {1,2,...,\fpeval{0.5*\REQlongueur-0.5}}{%
- \draw[\REQcouleur] (\i,-0.5) node[inner sep=1pt,outer sep=1pt,rotate=\REQangle,scale={0.8*\REQechelle},font=\small,below] {$\i$} ;
- \draw[\REQcouleur] (-\i,-0.5) node[inner sep=1pt,outer sep=1pt,rotate=\REQangle,scale={0.8*\REQechelle},font=\small,below] {$-\i$} ;}
+ \draw[\REQcouleur] (\i,-0.5) node[inner sep=1pt,outer sep=1pt,scale={\REQechlabel},font=\small,below] {$\i$} ;
+ \draw[\REQcouleur] (-\i,-0.5) node[inner sep=1pt,outer sep=1pt,scale={\REQechlabel},font=\small,below] {$-\i$} ;}
}%
{}%
\end{scope}
@@ -260,7 +267,8 @@
CouleurFond=\def\EQcouleurfond{#1},%
Origine=\def\EQposOrigin{#1},%
Rotation=\def\EQangle{#1},%
- Opacite=\def\EQopac{#1}
+ Opacite=\def\EQopac{#1},%
+ EchelleValeurs=\def\EQechlabel{#1}
}
\setKVdefault[EquerreGeom]{%
@@ -273,7 +281,8 @@
AfficheValeurs=true,%
Fond=false,%
Opacite=0.5,%
- PetitCote=false
+ PetitCote=false,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzEquerre}{ O{} }{%
@@ -293,7 +302,7 @@
\edef\EQangle{\fpeval{\pgfmathresult-90}}%
}%
}{}%
- \begin{scope}[shift={(\EQposOrigin)},rotate=\EQangle,scale=\EQechelle]
+ \begin{scope}[shift={(\EQposOrigin)},rotate=\EQangle,scale=\EQechelle,transform shape]
\ifboolKV[EquerreGeom]{Fond}
{%
\begin{scope} %diff extérieur-intérieur
@@ -318,10 +327,12 @@
\foreach \y in {0,1,...,\fpeval{0.925*\EQlongueur}} {\draw[\EQcouleur] (0,\y)--(0.4,\y) ;}
\ifboolKV[EquerreGeom]{AfficheValeurs}%
{%
- \foreach \i in {1,2,...,\fpeval{0.9*\EQlongueur-1}}
- \draw[\EQcouleur] (0.4,\i) node[inner sep=1pt,outer sep=1pt,rotate=\EQangle,scale={0.8*\EQechelle},font=\small,right] {\rotatebox{90}{$\i$}} ;
- \foreach \i in {1,2,...,\fpeval{0.9*\EQlargeur-0.5}}
- \draw[\EQcouleur] (\i,0.4) node[inner sep=1pt,outer sep=1pt,rotate=\EQangle,scale={0.8*\EQechelle},font=\small,above] {\rotatebox{180}{$\i$}} ;
+ \foreach \i in {1,2,...,\fpeval{0.9*\EQlongueur-1}}{%
+ \draw[\EQcouleur] (0.4,\i) node[inner sep=1pt,outer sep=1pt,scale={\EQechlabel},font=\small,right] {\rotatebox{90}{$\i$}} ;
+ }%
+ \foreach \i in {1,2,...,\fpeval{0.9*\EQlargeur-0.5}}{%
+ \draw[\EQcouleur] (\i,0.4) node[inner sep=1pt,outer sep=1pt,scale={\EQechlabel},font=\small,above] {\rotatebox{180}{$\i$}} ;
+ }%
}%
{}%
\end{scope}
@@ -336,7 +347,8 @@
CouleurFond=\def\RAPPcouleurfond{#1},%
Origine=\def\RAPPposOrigin{#1},%
Rotation=\def\RAPPangle{#1},%
- Opacite=\def\RAPPopac{#1}
+ Opacite=\def\RAPPopac{#1},%
+ EchelleValeurs=\def\RAPPechlabel{#1}
}
\setKVdefault[RapporteurGeom]{%
@@ -350,13 +362,14 @@
Fond=false,%
Opacite=0.5,%
Complet=false,%
- GraduationsInt=false
+ GraduationsInt=false,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzRapporteur}{ O{} }{%
\useKVdefault[RapporteurGeom]%
\setKV[RapporteurGeom]{#1}%
- \begin{scope}[shift={(\RAPPposOrigin)},rotate=\RAPPangle,scale=\RAPPechelle,every node/.style={rotate=\RAPPangle}]
+ \begin{scope}[shift={(\RAPPposOrigin)},rotate=\RAPPangle,scale=\RAPPechelle,transform shape]
\ifboolKV[RapporteurGeom]{Complet}
{
%fond
@@ -382,27 +395,27 @@
%valeurs si booléen
\ifboolKV[RapporteurGeom]{AfficheAngles}
{%
- \draw[\RAPPcouleur] (0:2.75) node[rotate=90,scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$0$} ;
- \draw[\RAPPcouleur] (180:3.25) node[rotate=90,scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\pm 180$} ;
- \draw[\RAPPcouleur] (180:2.75) node[rotate=90,scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\pm \pi$} ;
+ \draw[\RAPPcouleur] (0:2.75) node[rotate=90,scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$0$} ;
+ \draw[\RAPPcouleur] (180:3.25) node[rotate=90,scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\pm 180$} ;
+ \draw[\RAPPcouleur] (180:2.75) node[rotate=90,scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\pm \pi$} ;
\foreach \i in {0,10,...,170}
- {\draw[\RAPPcouleur] (\i:3.25) node[rotate={\i-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\i$} ;}
- \draw[\RAPPcouleur] (30:2.75) node[rotate={30-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{6}$} ;
- \draw[\RAPPcouleur] (45:2.75) node[rotate={45-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{4}$} ;
- \draw[\RAPPcouleur] (60:2.75) node[rotate={60-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{3}$} ;
- \draw[\RAPPcouleur] (90:2.75) node[rotate={90-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{2}$} ;
- \draw[\RAPPcouleur] (120:2.75) node[rotate={120-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{2\pi}{3}$} ;
- \draw[\RAPPcouleur] (135:2.75) node[rotate={135-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{3\pi}{4}$} ;
- \draw[\RAPPcouleur] (150:2.75) node[rotate={150-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{5\pi}{6}$} ;
+ {\draw[\RAPPcouleur] (\i:3.25) node[rotate={\i-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\i$} ;}
+ \draw[\RAPPcouleur] (30:2.75) node[rotate={30-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{6}$} ;
+ \draw[\RAPPcouleur] (45:2.75) node[rotate={45-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{4}$} ;
+ \draw[\RAPPcouleur] (60:2.75) node[rotate={60-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{3}$} ;
+ \draw[\RAPPcouleur] (90:2.75) node[rotate={90-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{\pi}{2}$} ;
+ \draw[\RAPPcouleur] (120:2.75) node[rotate={120-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{2\pi}{3}$} ;
+ \draw[\RAPPcouleur] (135:2.75) node[rotate={135-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{3\pi}{4}$} ;
+ \draw[\RAPPcouleur] (150:2.75) node[rotate={150-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{5\pi}{6}$} ;
\foreach \i in {10,20,...,170}
- {\draw[\RAPPcouleur] ({-\i}:3.25) node[rotate={270-\i},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$-\i$} ;}
- \draw[\RAPPcouleur] (-30:2.75) node[rotate={270-30},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{6}$} ;
- \draw[\RAPPcouleur] (-45:2.75) node[rotate={270-45},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{4}$} ;
- \draw[\RAPPcouleur] (-60:2.75) node[rotate={270-60},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{3}$} ;
- \draw[\RAPPcouleur] (-90:2.75) node[rotate={270-90},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{2}$} ;
- \draw[\RAPPcouleur] (-120:2.75) node[rotate={270-120},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-2\pi}{3}$} ;
- \draw[\RAPPcouleur] (-135:2.75) node[rotate={270-135},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-3\pi}{4}$} ;
- \draw[\RAPPcouleur] (-150:2.75) node[rotate={270-150},scale=\fpeval{0.8*\RAPPechelle*\RAPPechangle},font=\tiny] {$\nicefrac{-5\pi}{6}$} ;
+ {\draw[\RAPPcouleur] ({-\i}:3.25) node[rotate={270-\i},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$-\i$} ;}
+ \draw[\RAPPcouleur] (-30:2.75) node[rotate={270-30},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{6}$} ;
+ \draw[\RAPPcouleur] (-45:2.75) node[rotate={270-45},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{4}$} ;
+ \draw[\RAPPcouleur] (-60:2.75) node[rotate={270-60},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{3}$} ;
+ \draw[\RAPPcouleur] (-90:2.75) node[rotate={270-90},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-\pi}{2}$} ;
+ \draw[\RAPPcouleur] (-120:2.75) node[rotate={270-120},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-2\pi}{3}$} ;
+ \draw[\RAPPcouleur] (-135:2.75) node[rotate={270-135},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-3\pi}{4}$} ;
+ \draw[\RAPPcouleur] (-150:2.75) node[rotate={270-150},scale=\fpeval{\RAPPechlabel*\RAPPechangle},font=\tiny] {$\nicefrac{-5\pi}{6}$} ;
}{}
}
{
@@ -440,9 +453,9 @@
\ifboolKV[RapporteurGeom]{AfficheAngles}
{%
\foreach \i in {0,10,...,180}
- {\draw[\RAPPcouleur] (\i:3.2) node[rotate={\i-90},scale=\fpeval{\RAPPechelle*\RAPPechangle},font=\tiny] {\i} ;}
+ {\draw[\RAPPcouleur] (\i:3.2) node[rotate={\i-90},scale=\fpeval{\RAPPechangle},font=\tiny] {\i} ;}
\foreach \i in {0,10,...,180}
- {\draw[\RAPPcouleur] (\i:2.7) node[rotate={\i-90},scale=\fpeval{\RAPPechelle*\RAPPechangle},font=\tiny] {\inteval{180-\i}} ;}
+ {\draw[\RAPPcouleur] (\i:2.7) node[rotate={\i-90},scale=\fpeval{\RAPPechangle},font=\tiny] {\inteval{180-\i}} ;}
}{}
}
\end{scope}
@@ -455,7 +468,8 @@
CouleurFond=\def\POURCcouleurfond{#1},%
Origine=\def\POURCposOrigin{#1},%
Rotation=\def\POURCangle{#1},%
- Opacite=\def\POURCopac{#1}
+ Opacite=\def\POURCopac{#1},%
+ EchelleValeurs=\def\POURCechlabel{#1}
}
\setKVdefault[Pourcenteur]{%
@@ -468,13 +482,14 @@
AfficheValeurs=true,%
Fond=false,%
Opacite=0.5,%
- Decoration=true
+ Decoration=true,%
+ EchelleValeurs=0.8
}
\NewDocumentCommand{\tkzPourcenteur}{ O{} }{%
\useKVdefault[Pourcenteur]%
\setKV[Pourcenteur]{#1}%
- \begin{scope}[shift={(\POURCposOrigin)},rotate=\POURCangle,scale=\POURCechelle,every node/.style={rotate=\POURCangle}]
+ \begin{scope}[shift={(\POURCposOrigin)},rotate=\POURCangle,scale=\POURCechelle,transform shape]
\ifboolKV[Pourcenteur]{Fond}
{%
\fill[draw=none,fill=\POURCcouleurfond!10!white,fill opacity=\POURCopac] (0,0) circle[radius=3] ;
@@ -483,7 +498,7 @@
\draw[\POURCcouleur,semithick] (0,0) circle[radius=3] ;
\draw[\POURCcouleur,semithick] ({-0.15*3},0)--({0.15*3},0) (0,{-0.15*3})--(0,{0.15*3}) ;
\foreach \pct in {0,1,...,199}
- {\draw[\POURCcouleur,thin] ({0.5*\pct*3.6}:{3})--({0.5*\pct*3.6}:{3-0.2}) ;}
+ {\draw[\POURCcouleur,thin] ({0.5*\pct*3.6}:{3})--({0.5*\pct*3.6}:{3-0.2}) ;}
\foreach \pct in {0,10,...,90}{%
\draw[\POURCcouleur,thin] ({(\pct+1)*3.6}:{3})--({(\pct+1)*3.6}:{3-0.35}) ;
\filldraw[\POURCcouleur] ({(\pct+1)*3.6}:{3-0.35}) circle[fill=\POURCcouleur,radius=0.75pt] ;
@@ -505,14 +520,14 @@
\foreach \pct in {5,10,15,20,30,35,40,45,55,60,65,70,80,85,90,95}{%
\draw[\POURCcouleur,semithick] ({\pct*3.6}:{3})--({\pct*3.6}:{3-0.5}) ;
\ifboolKV[Pourcenteur]{AfficheValeurs}
- {\draw ({-\pct*3.6+90}:{3-0.6}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{0.8*\POURCechelle*\POURCechangle},font=\tiny] {\pct\,\%} ;}{}
+ {\draw ({-\pct*3.6+90}:{3-0.6}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{\POURCechlabel*\POURCechangle},font=\tiny] {\pct\,\%} ;}{}
}
\foreach \pct in {0,25,50,75}{%
\draw[\POURCcouleur,semithick] ({\pct*3.6}:{3})--({\pct*3.6}:{3-0.5}) ;
\ifboolKV[Pourcenteur]{AfficheValeurs}
{%
- \draw ({-\pct*3.6+90}:{3-0.61}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{0.8*\POURCechelle*\POURCechangle},font=\scriptsize\bfseries] {\pct\,\%} ;
- \draw ({-\pct*3.6+90}:{2+0.15}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{0.8*\POURCechelle*\POURCechangle},font=\tiny\bfseries] {\pct\,\%} ;
+ \draw ({-\pct*3.6+90}:{3-0.61}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{\POURCechlabel*\POURCechangle},font=\scriptsize\bfseries] {\pct\,\%} ;
+ \draw ({-\pct*3.6+90}:{2+0.15}) node[\POURCcouleur,rotate={-3.6*\pct},scale=\fpeval{\POURCechlabel*\POURCechangle},font=\tiny\bfseries] {\pct\,\%} ;
}{}%
}
\draw[\POURCcouleur,semithick] (0,1)--(0,2) (1.6,0)--(2,0) (0,-1.6)--(0,-2) (-1.6,0)--(-2,0) ;
@@ -533,7 +548,7 @@
CouleurFond=\def\RAPPEQcouleurfond{#1},%
Origine=\def\RAPPEQposOrigin{#1},%
Rotation=\def\RAPPEQangle{#1},%
- Opacite=\def\RAPPEQopac{#1}
+ Opacite=\def\RAPPEQopac{#1},%
}
\setKVdefault[RapporteurEquerreGeom]{%
@@ -561,7 +576,7 @@
\pgfmathanglebetweenpoints{\pgfpointanchor{\RAPPEQposOrigin}{center}}{\pgfpointanchor{\tmppointdeux}{center}}%
\edef\RAPPEQangle{\pgfmathresult}%
}{}%
- \begin{scope}[shift={(\RAPPEQposOrigin)},rotate=\RAPPEQangle,scale=\RAPPEQechelle,every node/.style={rotate=\RAPPEQangle}]
+ \begin{scope}[shift={(\RAPPEQposOrigin)},rotate=\RAPPEQangle,scale=\RAPPEQechelle,transform shape]
%fond
\ifboolKV[RapporteurEquerreGeom]{Fond}
{%
@@ -591,16 +606,16 @@
\ifboolKV[RapporteurEquerreGeom]{AfficheAngles}
{%
\foreach \i in {10,20,...,170}
- {\draw[\RAPPEQcouleur] ({-\i}:{0.6125*\RAPPEQlargeur}) node[rotate={90-\i},scale=\fpeval{\RAPPEQlargeur/8*\RAPPEQechelle*\RAPPEQechangle},font=\tiny] {\i} ;}
+ {\draw[\RAPPEQcouleur] ({-\i}:{0.6125*\RAPPEQlargeur}) node[rotate={90-\i},scale=\fpeval{\RAPPEQlargeur/8*\RAPPEQechangle},font=\tiny] {\i} ;}
%angles "extérieurs"
\foreach \i in {10,20,...,170}
- {\draw[\RAPPEQcouleur] ({-\i}:{0.6375*\RAPPEQlargeur}) node[rotate={90-\i},scale=\fpeval{\RAPPEQlargeur/8*\RAPPEQechelle*\RAPPEQechangle},font=\tiny] {\inteval{180-\i}} ;}
+ {\draw[\RAPPEQcouleur] ({-\i}:{0.6375*\RAPPEQlargeur}) node[rotate={90-\i},scale=\fpeval{\RAPPEQlargeur/8*\RAPPEQechangle},font=\tiny] {\inteval{180-\i}} ;}
}%
{}%
\ifboolKV[RapporteurEquerreGeom]{AfficheValeurs}
{%
\foreach \i in {-1,0,1}
- {\draw[\RAPPEQcouleur] ({\i},-0.375) node[scale=\fpeval{\RAPPEQechelle*\RAPPEQechangle},font=\tiny] {$\i$} ;}
+ {\draw[\RAPPEQcouleur] ({\i},-0.375) node[scale=\fpeval{\RAPPEQechangle},font=\tiny] {$\i$} ;}
}%
{}%
%tracés intérieurs
diff --git a/graphics/pgf/contrib/pgf-periodictable/README b/graphics/pgf/contrib/pgf-periodictable/README
index b1a6ef2279..6015fa1578 100644
--- a/graphics/pgf/contrib/pgf-periodictable/README
+++ b/graphics/pgf/contrib/pgf-periodictable/README
@@ -1,11 +1,11 @@
-This is pgf-PeriodicTable, version 2.1.1 (2024/07/07).
+This is pgf-PeriodicTable, version 2.1.5 (2025/02/10).
The purpose of this package is to provide the Periodic Table of Elements in
a simple way. It relies on pgf/TikZ to offer a full or partial periodic table with
a variety of options and displaying the desired data for all the 118
elements. It can be done in different languages: English, French, German,
Portuguese (from Portugal and from Brazil), Spanish, Italian and translations
-by user contributions (currently Dutch).
+by user contributions - currently in Dutch and Chinese.
____________________________________________________________
Just typeset \pgfPT to get a Periodic Table of Elements or \pgfPT[<options list>]
@@ -21,6 +21,56 @@ ____________________________________________________________
____________________________________________________________
Major changes:
+*** v2.1.5 (10/02/2025) ***
+New options for loading the package, fixing the interaction of pgf-PeriodicTable with the beamer class and pdfLaTeX (small caps):
+- beamer (requires the lmodern package)
+- beamer*
+- beamer** (requires the silence package)
+New translation:
+- Chinese translation provided by Fan Hongtao
+New commands for Chinese language:
+- \pgfPTzhFontFeatures
+- \pgfPTzhtextfontSS
+- \pgfPTzhtextfontSSB
+- \pgfPTzhtextfontLv
+Changes to the default values of the following keys when the Chinese langauge is loaded:
+- name font
+- CS font
+- title font
+- Z font
+- Z padding
+Changes in Mandarin numerals:
+- default font is now BabelStone Han
+- the \pgfPTzhfont command has been renamed to \pgfPTzhnumberfont (\pgfPTzhfont is still defined for backwards compatibility)
+New keys:
+- decimal separator (sets the decimal separator in the numerical values of quantities)
+- legend acronyms font size (sets the font size of the text used in the legend acronyms description)
+New color schemes:
+- pgfPTWikipediaI
+- pgfPTWikipediaII
+New styles:
+- comma separator
+- dot separator
+- csWikipediaI
+- csWikipediaII
+The Z list key supports a new syntax which makes possible to get empty cells anywhere in the Periodic Table.
+Fixed an incorrect translation for 'fermium' in German.
+New section in package documentation 'Tips & Tricks: inspired by user questions'.
+
+*** v2.1.4 (08/09/2024) ***
+Fixed wrong box width on extra legend of Country of Discovery.
+Fixed minor issues in pgfPTbuildcell macros.
+Added the prefix 'pgfPT' to the built-in back color schemes. They are now 'pgfPTdefault', 'pgfPTSoft', 'pgfPTJmol',
+'pgfPTCPK', 'pgfPTRasmol', 'pgfPTRasmolNew', 'pgfPTWikipedia', 'pgfPTMNM', 'pgfPTPS', 'pgfPTRadio' and 'pgfPTBlocks'.
+Fixed some typos in the manual.
+
+*** v2.1.3 (07/08/2024) ***
+The engine's detection mechanism (pdfLaTeX, LuaLaTeX or XeTeX) has been changed to prevent erroneous detection when the packages 'hyperref' or 'bookmark' are loaded and the document is compiled with LuaLaTeX - in this case, pgf-PeriodicTable disturbs the selection of the document font.
+Fixed an issue with the Chemical Symbol color when a non-rgb color is used, such as cyan or yellow , which are defined in the xcolor package using the cmyk model (when loaded without options).
+
+*** v2.1.2 (01/08/2024) ***
+Fixed incorrect Spanish translations of some element names.
+Minor code improvements to eliminate runtime warnings («LaTeX Font Warning: Font shape `TU/TeXGyreHeros(0)/l/n' undefined» or «Missing character: There is no m (U+006D) in font nullfont!» ... )
*** v2.1.1 (07/07/2024) ***
New keys:
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DiscY.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DiscY.tex
index 66e67fc3c7..9a18c1f8dd 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DiscY.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DiscY.tex
@@ -1,23 +1,23 @@
%\vfill%
-\subsubsection{\texorpdfstring{\ding{224} The discovery year}{The discovery year}}\vspace{6pt}%
+\subsubsection{\texorpdfstring{\ding{224} The year of discovery}{The year of discovery}}\vspace{6pt}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DiscY color
\pgfPTMoption{4}{DiscY color}{black}{%
-Sets the discovery year color.
+Sets the color of the discovery year.
}
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPTdisc,DiscY color=red]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=pgfPTdisc,DiscY color=red]}}%
\\ [5pt]\pgfPTendoption%
% DiscY font
\pgfPTMoption{4}{DiscY font}{\string\tiny\string\bfseries}{%
-Sets the discovery year font.
+Sets the font of the discovery year.
}
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPTdisc,DiscY font=\string\fontfamily{pbk}\string\selectfont\string\tiny\string\bfseries]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=pgfPTdisc,DiscY font=\fontfamily{pbk}\selectfont\tiny\bfseries]}}%
\\ [5pt]\pgfPTendoption%
% DiscY BC scale
\pgfPTMoption{4}{DiscY BC scale}{1}{%
-Sets the font factor scaling for the Before Christ (BC) acronym in the discovery year.
+Sets the font factor scaling for the Before Christ (BC) acronym in the year of discovery.
}
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPTdisc,DiscY BC scale=.8]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=pgfPTdisc,DiscY BC scale=.8]}}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex
index b9b76f64d1..4b9211dc54 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex
@@ -71,7 +71,7 @@ The following examples could be used for students or for any other purposes.
\def\grupo[#1][#2] #3{%
\begin{tikzpicture}[inner xsep=0pt]
\node[below left,text width=1.75cm,text centered] (figura) at (0,0) %
-{\scalebox{.5}{\pgfPT[show title=false,show label LaAc=true,show legend=false,back color scheme=MNM,%
+{\scalebox{.5}{\pgfPT[show title=false,show label LaAc=true,show legend=false,back color scheme=pgfPTMNM,%
font=Roboto-TLF,CS font=\fontfamily{RobotoSlab-TLF}\bfseries\large,eDist color=blue!70!black,%
DiscC font=\fontsize{4}{4}\selectfont,DiscY font=\fontsize{4}{4}\selectfont\bfseries,%
name font=\fontseries{l}\fontsize{6pt}{6pt}\selectfont,name color=red!50!black,%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_OtherCont.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_OtherCont.tex
index c90a4cae94..6b57de7bb0 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_OtherCont.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_OtherCont.tex
@@ -7,7 +7,7 @@ For all the \textit{other contents} available for the cells of the periodic tabl
\begin{itemlist}
%\item\red{\textbf{name}}:\hspace{.5ex}element name
\item\red{\textbf{R}}:\hspace{.5ex}atomic radius
-\item\red{\textbf{Rcov}}:\hspace{.5ex}covalente radius
+\item\red{\textbf{Rcov}}:\hspace{.5ex}covalent radius
\item\red{\textbf{Rion}}:\hspace{.5ex}ionic radius
\item\red{\textbf{Ei}}:\hspace{.5ex}first ionization energy
\item\red{\textbf{eneg}}:\hspace{.5ex}electronegativity (Pauling)
@@ -29,7 +29,7 @@ For all the \textit{other contents} available for the cells of the periodic tabl
\item\red{\textbf{lsb}}:\hspace{.5ex}lattice constant -- b
\item\red{\textbf{lsc}}:\hspace{.5ex}lattice constant -- c
\item\red{\textbf{lsca}}:\hspace{.5ex}lattice c/a ratio
-\item\red{\textbf{DiscC}}:\hspace{.5ex}discover country
+\item\red{\textbf{DiscC}}:\hspace{.5ex}country of discovery
\item\red{\textbf{spectra}}:\hspace{.5ex}visible range spectral lines
\end{itemlist}
\end{minipage}
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TipsTricks.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TipsTricks.tex
new file mode 100644
index 0000000000..ed1dbca3d0
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TipsTricks.tex
@@ -0,0 +1,58 @@
+\vfill%
+\subsection{Control overall width of table}
+\tikz{\node[text width=\linewidth-6mm,draw=green!70,rounded corners=2pt,fill=black!10!green!10,inner sep=3mm] {%
+Is there a simple way to set the periodic table to text width, column width, etc.?
+};}%
+\\ [6pt]Yes, there is. It can be done using the \textsf{\large\textbackslash resizebox} command provided by the graphicx package (and also by the graphics package). For example:
+\\ [2pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\begin{minipage}{\linewidth}%
+\begin{verbatim}
+\resizebox{\linewidth}{!}{\pgfPT}
+\end{verbatim}
+\end{minipage}};}%
+\\ or
+\\ [2pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\begin{minipage}{\linewidth}%
+\begin{verbatim}
+\resizebox{\linewidth}{!}{\pgfPT[show title=false]}
+\end{verbatim}
+\end{minipage}};}%
+\\ [2pt]will produce a Periodic Table with the width of the current \textsf{\large\textbackslash linewidth}, whatever is its value (the text width, the column width, the width of a minipage,\ldots), and with the proper scaling of its height.
+\\ There is no need of loading the graphicx package since pgf-PeriodicTable loads the tikz package, which in turn loads the graphicx package.
+\\ [2pt]\tikz{\path[draw=green!70,rounded corners=2pt,fill=black!10!green!10,rounded corners=2pt] (0,0) rectangle ++(\textwidth,-4.5pt);}%
+\subsection{Compact Periodic Table}
+\tikz{\node[text width=\linewidth-6mm,draw=green!70,rounded corners=2pt,fill=black!10!green!10,inner sep=3mm] {%
+Is there a way to put groups 1 and 2 really next to group 13 to 18? That would make the whole thing more compact. I sometimes need just the representative elements for teaching purposes.
+};}%
+\\ [6pt]Although it is not common usage, it can be done:
+\\ [2pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\begin{minipage}{\linewidth}%
+\begin{verbatim}
+\documentclass[border=10pt]{standalone}
+\usepackage{pgf-PeriodicTable}
+\usepgfPTlibrary{colorschemes}
+\pgfPTGroupColors{example}{G1=blue!50!white,G2=green!90!white}
+\pgfPTsetLanguage{de}
+\begin{document}
+% \pgfPTstyle[show title=false, back color scheme=example,show legend=false]
+% \pgfPT[Z list = G1]\foreach \n in {2,13,14,15,16,17,18} {%
+% \pgfPT[show period numbers=false,Z list = G\n]%
+% }% make sure there are no spaces between \pgfPT
+% or
+% \pgfPTstyle[show title=false,show period numbers=false,back color scheme=example,
+% show legend=false]
+% \pgfPT[show period numbers,Z list = G1]\pgfPT[Z list = G2]\pgfPT[Z list = p]% make
+% sure there are no spaces between \pgfPT
+% or
+ \pgfPTstyle[show title=false,show period numbers=false,back color scheme=example,
+ show legend=false]
+ \pgfPT[show period numbers,Z list = s]\pgfPT[Z list = p]
+\end{document}
+\end{verbatim}
+\end{minipage}};}%
+\newpage%
+\begin{center}
+\scalebox{.6}{\includegraphics{manualfiles/pgfPT_user_compactPT.pdf}}
+\end{center}
+\tikz{\path[draw=green!70,rounded corners=2pt,fill=black!10!green!10,rounded corners=2pt] (0,0) rectangle ++(\textwidth,-4.5pt);}%
+\endinput
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TitleLegend.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TitleLegend.tex
index a17797548a..600538875c 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TitleLegend.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TitleLegend.tex
@@ -61,21 +61,30 @@ When set to \red{false}, only the cell is displayed with the des\-criptions in p
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend acronyms=false]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend acronyms=false]}}%
\\ [0pt]\pgfPTendoption%
+% legend acronyms
+\label{option_legend_acronyms_font_size}%
+\vfill%
+\pgfPTMoption[\pgfPTnewinversion{2.1.5}]{4}{legend acronyms font size}{document font size}%
+{Sets the font size of the text used in the \red{legend acronyms} description. It must be a valid \TeX\ dimension and \textit{it only works when the key \red{legend acronyms} is set to \red{true}}.
+\vskip0pt\relax}%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend acronyms font size=14pt]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend acronyms font size=14pt]}}%
+\\ [0pt]\pgfPTendoption%
+\vfill%
+\newpage\vspace{-34pt}\ %
% legend box (style)
\label{style_legend box}%
-\vfill%
\pgfPTMstyle{4}{legend box}{left color=black!20,right color=black!10,draw=black!30}%
{Style to define the appearance of the box around the legend, legend pins and acronym descriptions, built with any of the \txttikz\ keys that can be applied to a path construction.
\textit{It only works when the key \red{legend acronyms} is set to \red{true}}.}%
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36}]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36}]}}%
-\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend box={draw=blue!20,fill=blue!10}]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend box={draw=blue!20,fill=blue!10}]}}%
-\newpage%\\ [10pt]
-\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend box={draw=blue!20,fill=blue!10,legend acronyms=false}]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend box={draw=blue!20,fill=blue!10},legend acronyms=false]}}%
-\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend box={}]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend box={}]}}%
+\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36}]}}%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend box={draw=blue!20,fill=blue!10}]%
+\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend box={draw=blue!20,fill=blue!10}]}}%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend box={draw=blue!20,fill=blue!10,legend acronyms=false}]%
+\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend box={draw=blue!20,fill=blue!10},legend acronyms=false]}}%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend box={}]%
+\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend box={}]}}%
\\ [0pt]\pgfPTendstyle%
% legend back color
\label{option_legend back color}%
@@ -98,6 +107,7 @@ When set to \red{false}, only the cell is displayed with the des\-criptions in p
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend radio color=red,legend acronyms=false]}}%
\\ [0pt]\pgfPTendoption%
% legend CS color
+\vfill%
\label{option_legend CS color}%
\pgfPTMoption{4}{legend CS color}{black!50}%
{Sets the color of the Chemical Symbol acronym and corresponding description.}%
@@ -108,6 +118,7 @@ When set to \red{false}, only the cell is displayed with the des\-criptions in p
\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend CS color=red,legend acronyms=false]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend CS color=red,legend acronyms=false]}}%
\\ [0pt]\pgfPTendoption%
+\newpage\vspace{-34pt}\ %
% legend Z color
\label{option_legend Z color}%
\pgfPTMoption{4}{legend Z color}{\{\}}%
@@ -119,15 +130,16 @@ When set to \red{false}, only the cell is displayed with the des\-criptions in p
\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend Z color=red,legend acronyms=false]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend Z color=red,legend acronyms=false]}}%
\\ [0pt]\pgfPTendoption%
+\newpage\vspace{-34pt}\ %
% show legend pins
\label{option_show legend pins}%
\pgfPTMoption{4}{show legend pins}{true}%
{When set to \red{true} the legend pins are shown, otherwise they are not shown.}%
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36}]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36}]}}%
+\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36}]}}%
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},show legend pins=false]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},show legend pins=false]}}%
-\\ [0pt]\pgfPTendoption%
+\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},show legend pins=false]}}%
+\\ [-5pt]\pgfPTendoption%
% legend pins (style)
\label{style_legend pins}%
\pgfPTMstyle{4}{legend pins}{\raisebox{-\baselineskip}{%
@@ -136,9 +148,10 @@ When set to \red{false}, only the cell is displayed with the des\-criptions in p
{\ \\ [4pt]Style to define the appearance of the legend pins, built with any of the \txttikz\ keys that can be applied to a path construction.}%
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36}]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36}]}}%
-\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend pins={draw=red,fill=red!10}]%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend pins={draw=red,fill=red!10}]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend pins={draw=red,fill=red!10}]}}%
-\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend pins={draw=red,fill=red!10},legend acronyms=false]%
+\newpage%\\ [10pt]
+\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},legend pins={draw=red,fill=red!10},legend acronyms=false]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},legend pins={draw=red,fill=red!10},legend acronyms=false]}}%
\\ [0pt]\pgfPTendstyle%
% show extra legend
@@ -153,12 +166,14 @@ When set to \red{false}, only the cell is displayed with the des\-criptions in p
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=myname,show extra legend=false]}}%
\\ [0pt]\pgfPTendoption%
% extra legend (style)
+\vfill%
\label{style_extra legend}%
\pgfPTMstyle{4}{extra legend}{\raisebox{-\baselineskip}{%
\vbox{\hsize=.5\linewidth\hbox{\{draw=black!50,fill=black!10,line width=.05pt,}\hbox{rounded corners=2pt\}}}}
}%
{\ \\ [4pt]Style to define the appearance of the extra legend, built with any of the \txttikz\ keys that can be applied to a path construction.}%
-\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPTdisc]%
+\newpage%\\ [5pt]
+\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPTdisc]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=pgfPTdisc]}}%
\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPTdisc,extra legend={draw=red,fill=red!10}]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=pgfPTdisc,extra legend={draw=red,fill=red!10}]}}%
@@ -176,11 +191,10 @@ The key \red{show legend} is set to \red{true}.
\textcolor{cyan!10!white}{legend=\{}radio=<color>,CS=<color>,Z=<color>,pins style=<tikz path keys>,\\ %
\textcolor{cyan!10!white}{legend=\{}extra style=<tikz path keys>,box=<tikz path keys>\}};}}}%
}%
-\vfill%
-\newpage%\\ [5pt]
+\newpage%
\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=myname,legend={bc=black!10,extra=false}]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=myname,legend={bc=black!10,extra=false}]}}%
-\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=myname,legend={acro=false,extra=false}]%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=myname,legend={acro=false,extra=false}]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=myname,legend={acro=false,extra=false}]}}%
\\ [0pt]\pgfPTendstyle%
\endinput
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex
index 3d1f256bd6..27356e91c3 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex
@@ -1,3 +1,4 @@
+\vfill%
\subsubsection{\texorpdfstring{\ding{224} The atomic number}{The atomic number}}%\vspace{6pt}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Z backcolor
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex
index 9e1ba55405..354278b015 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex
@@ -15,7 +15,7 @@
\item\pgfPTMmacro{pgfPTpreviewcellstyle}[]\lb\red{name}\rb%
\ or \pgfPTMmacro{pgfPTpreviewcellstyle}[]\lp\red{scale factor}\rp\lb\red{name}\rb%
\ -- preview the named builded cell with an optional scale factor.
-\item\pgfPTMmacro{pgfPTnewcolorscheme}[trailing color]\lb\red{name}\rb\lb\red{color list}\rb%
+\item\pgfPTMmacro{pgfPTnewColorScheme}[trailing color]\lb\red{name}\rb\lb\red{color list}\rb%
\ -- makes a color scheme to fill the cells along the Periodic Table.
\item\pgfPTMmacro{pgfPTnewZlist}[]\lb\red{name}\rb%
\ -- create a user defined atomic numbers (Z) \red{named} list.
@@ -33,8 +33,8 @@
\\ [0pt]\pgfPTMline%
\newpage%
This command can also be used with options -- as described in section \hyperlink{OPTIONS}{Options for \textbackslash pgfPT: creating a «Periodic Table»} -- to modify, for instance, the font of the Periodic Table or the colors of the cells:
-\\ [10pt]\pgfPTMmacrobox{pgfPT}[font=pnc,back color scheme=MNM]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[font=pnc,back color scheme=MNM]}}%
+\\ [10pt]\pgfPTMmacrobox{pgfPT}[font=pnc,back color scheme=pgfPTMNM]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[font=pnc,back color scheme=pgfPTMNM]}}%
\\ [0pt]\pgfPTMline%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\\ [-32pt]\ %
@@ -87,7 +87,7 @@ It is possible to locally override the \textit{global style} defined:
\\ [-32pt]\ %
\def\tmpSection{\bs{pgfPTresetcell}}%
\subsection*{}{\normalfont\large\bfseries\raisebox{1.25pt}{\color{black}$\mathbf{\blacktriangleright}$}\ Utilization of \tmpSection}%
-\label{command:pgfPTresetcell}\addcontentsline{toc}{subsection}{\texorpdfstring{\tmpSection{}}{\textbackslash pgfPTbuildcellstyle}}%
+\label{command:pgfPTresetcell}\addcontentsline{toc}{subsection}{\texorpdfstring{\tmpSection{}}{\textbackslash pgfPTresetcell}}%
\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTresetcell}%
\\ [4pt]The \pgfPTMmacro{pgfPTresetcell}[] resets the cell to its default layout.
\\ [-32pt]\ %
@@ -154,16 +154,16 @@ It is possible to locally override the \textit{global style} defined:
There are a few \textit{color schemes} predefined:
\index{BUILT-IN@\textbf{BUILT-IN}!color schemes}%
\begin{itembar}
-\item\textbf{default}, the default built-in color scheme, which is loaded if no value is passed to the \red{back color scheme} key.
-\item\textbf{Soft}, a soft color pattern for cells, differentiating metals, non metals, semimetals, lanthanides and actinides.
-\item\textbf{Jmol}, a color scheme based upon \href{http://www.jmol.org/}{Jmol: an open-source Java viewer for chemical structures in 3D}.
-\item\textbf{CPK}, a color scheme that is based upon the colors of the popular plastic spacefilling models which were developed by Corey, Pauling and later improved by Kultun.
-\item\textbf{Rasmol} and \textbf{RasmolNew}, two color schemes based upon the computer program \href{http://www.rasmol.org/}{RasMol}.
-\item\textbf{Wikipedia}, a color scheme built on the Periodic Table of Elements available at \href{https://en.wikipedia.org/wiki/Periodic_table#Classification_of_elements}{Wikipedia}.
-\item\textbf{MNM}, a color pattern which distinguishes between \textbf{M}etals, semimetals and \textbf{N}on \textbf{M}etals.
-\item\textbf{PS}, a color scheme depicting the \textbf{P}hysical \textbf{S}tate at room temperature.
-\item\textbf{Radio}, a two color color scheme showing the radioactivity of the elements.
-\item\textbf{Blocks}, a four colored color scheme showing the \textit{s}, \textit{p}, \textit{d} and \textit{f} blocks of the Periodic Table.
+\item\textbf{pgfPTdefault}, the default built-in color scheme, which is loaded if no value is passed to the \red{back color scheme} key.
+\item\textbf{pgfPTSoft}, a soft color pattern for cells, differentiating metals, non metals, semimetals, lanthanides and actinides.
+\item\textbf{pgfPTJmol}, a color scheme based upon \href{http://www.jmol.org/}{Jmol: an open-source Java viewer for chemical structures in 3D}.
+\item\textbf{pgfPTCPK}, a color scheme that is based upon the colors of the popular plastic spacefilling models which were developed by Corey, Pauling and later improved by Kultun.
+\item\textbf{pgfPTRasmol} and \textbf{pgfPTRasmolNew}, two color schemes based upon the computer program \href{http://www.rasmol.org/}{RasMol}.
+\item\textbf{pgfPTWikipedia}, a color scheme built on the Periodic Table of Elements available at \href{https://en.wikipedia.org/wiki/Periodic_table#Classification_of_elements}{Wikipedia}.
+\item\textbf{pgfPTMNM}, a color pattern which distinguishes between \textbf{M}etals, semimetals and \textbf{N}on \textbf{M}etals.
+\item\textbf{pgfPTPS}, a color scheme depicting the \textbf{P}hysical \textbf{S}tate at room temperature.
+\item\textbf{pgfPTRadio}, a two color color scheme showing the radioactivity of the elements.
+\item\textbf{pgfPTBlocks}, a four colored color scheme showing the \textit{s}, \textit{p}, \textit{d} and \textit{f} blocks of the Periodic Table.
\end{itembar}
\vspace{5pt}
Writing a color scheme can be painstaking work, so a \textit{script} is provided for that:
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_decSep.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_decSep.tex
new file mode 100644
index 0000000000..a6e4d3f97a
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_decSep.tex
@@ -0,0 +1,24 @@
+\subsubsection{\texorpdfstring{\ding{224} \itshape Decimal separator in numbers}{Decimal separator in numbers}}\vspace{6pt}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Decimal separator
+\pgfPTMoption[\pgfPTnewinversion{2.1.5}]{4}{decimal separator}{.}{%
+Sets the decimal separator in the numeric values of quantities. \textit{If the separator character is a comma it must be provided between curly braces -- \{,\}}. \\ Note that the decimal separator key is used to perform a direct replacement of the dot with the specified character. Therefore, there is no validation and any character can be used as a decimal separator (usually a dot or a comma).
+}%
+\newpage%\\ [5pt]
+\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},decimal separator={,}]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},decimal separator={,}]}}%
+\\ [0pt]\pgfPTendoption%
+\\ [5pt]
+\pgfPTMstyle[\pgfPTnewinversion{2.1.5}]{4}{comma separator}{no value}%
+{A style equivalent to \red{decimal separator=\{,\}}}%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[comma separator]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[comma separator]}}%
+\\ [0pt]\pgfPTendstyle%
+\\ [5pt]
+\pgfPTMstyle[\pgfPTnewinversion{2.1.5}]{4}{dot separator}{no value}%
+{A style equivalent to \red{decimal separator=.}}%
+\newpage%\\ [5pt]
+\pgfPTMmacrobox{pgfPT}[dot separator]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[dot separator]}}%
+\\ [0pt]\pgfPTendstyle%
+\endinput
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex
index 2eb989abae..00f6da0af4 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex
@@ -1,7 +1,7 @@
\vfill%
\subsubsection{\texorpdfstring{\ding{224} \itshape Exercise layout}{Exercise layout}}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-The \red{keys} described in this section enable the \textit{exercise layout} of the Periodic Table, \ie, in this mode the \textit{structure} of the Periodic Table is drawn, but there are only a few contents available in the cells.
+The \red{keys} \hypertarget{exMODE}{described in this} section enable the \textit{exercise layout} of the Periodic Table, \ie, in this mode the \textit{structure} of the Periodic Table is drawn, but there are only a few contents available in the cells.
% only cells=false
\pgfPTMoption{4}{only cells}{false}%
{When set to \red{true} the Periodic Table is drawn with only the cells without any contents.
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex
index 6658536639..ed6f4ad78f 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex
@@ -2,11 +2,11 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Z list
\label{option_Z list}%
-\pgfPTMoption{4}{Z list}{all}%
-{Set's the list of the elements to display in the Periodic Table. It could be a \lblue{name} or a \lblue{comma sepa\-rated} list of atomic numbers, which in turn supports \textit{the dots notation} as explained in the section \textit{Repeating Things: The Foreach Statement} in the \href{https://www.ctan.org/pkg/pgf}{pgfmanual}.}
+\pgfPTMoption[\pgfPTchangedinversion{2.1.5}]{4}{Z list}{all}%
+{Set's the list of the elements to display in the Periodic Table. It could be a \lblue{name} or a \lblue{comma sepa\-rated} list of atomic numbers (\hyperlink{Zlistdesc}{see below}), which in turn supports \textit{the dots notation} as explained in the section \textit{Repeating Things: The Foreach Statement} in the \href{https://www.ctan.org/pkg/pgf}{pgfmanual}.\vskip0pt\relax}
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36}]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36}]}}%
-\\ [10pt]\pgfPTMoptiontxt{%
+\\ [5pt]\pgfPTMoptiontxt{%
The possible \lblue{name} is one of the following:
\begin{itembar}
\item\textbf{built-in}:
@@ -20,11 +20,36 @@ The possible \lblue{name} is one of the following:
\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{ P1}, \myldots\ , \sq{P7}, \sq{P6*}, \sq{P7*}, which are used, respectively, for the elements of the \textit{1\raisebox{3pt}{\scriptsize st} period}, \myldots\ , \textit{7\raisebox{3pt}{\scriptsize\hspace{.5pt}th} period}, \textit{6\raisebox{3.5pt}{\scriptsize\hspace{.25pt}th} period and lanthanoids}\red{$\,^\dag$}, \textit{7\raisebox{3pt}{\scriptsize\hspace{.5pt}th} period and actinoids}\red{$\,^\dag$}.
\\ [3pt]\makebox[\linewidth][r]{\scriptsize\red{$^\dag\,$}\textit{Depending on the value of the \red{IUPAC} key, the Lanthanum or Actinium are or are not included}.}
\end{itemize}
-\item
-any \textbf{user defined} name via \pgfPTMmacro{pgfPTnewZlist}[]\{name\}\{list\}
+\item any \textbf{user defined} name via \pgfPTMmacro{pgfPTnewZlist}[]\{name\}\{list\}
\end{itembar}%
}%
-\\ [-10pt]\pgfPTendoption%
+\newpage%\vspace{-34pt}\ %
+\pgfPTMoptiontxt{%
+\hypertarget{Zlistdesc}{Since} \blue{v2.1.5} the \red{Z list} supports a new syntax which makes possible to get \textit{empty} cells \textit{anywhere} in the Periodic Table. The \red{Z list} can be:
+\vspace{6pt}
+\begin{itembar}
+\item a list of numbers -- \green{Z list=\{1,...,118\}} or \green{Z list=\{1,2,3,4,5,6,11,12,13,14,15,16\}}.
+\item[]
+\item a list of numbers preceded with a star -- \green{Z list=*\{1,...,5,9,10,...,24\}} or \green{Z list=*(\red{options})\{1,...,5,9, 10,...,24\}}.
+\begin{itemize}
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}] \red{Z list} preceded only with a star:
+\\ It is used to draw the cells skipped in the list without information, but with the atomic number and filling.
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list=*{1,...,5,9,10,...,18}]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list=*{1,...,5,9,10,...,18}]}}%
+\item[]
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}] \red{Z list} is preceded with a star followed by \red{options}:
+\\ It is used to draw the cells skipped in the list without information, with what is shown and how it is shown controlled by the options. There are only two options available -- \red{hide Z} and \red{back color=<color>} -- which can be used separately or as a comma separated pair in any order.
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list=*(hide Z){1,...,5,9,10,...,18}]%
+\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list=*(hide Z){1,...,5,9,10,...,18}]}}%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list=*({back color=white}){1,...,5,9,10,...,18}]%
+\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list=*({back color=white}){1,...,5,9,10,...,18}]}}%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list=*({hide Z,back color=white}){1,...,5,9,10,...,18}]%
+\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list=*({hide Z,back color=white}){1,...,5,9,10,...,18}]}}%
+\\ [10pt]The \textit{starred} version of the \red{Z list} can be used as an alternative or a complement to the \hyperlink{exMODE}{Exercise layout} mode of the Periodic Table.
+\end{itemize}
+\end{itembar}%
+}%
+\\ [-5pt]\pgfPTendoption%
\newpage\vspace{-34pt}\ %
% cell width
\label{option_cell width}%
@@ -84,10 +109,15 @@ any \textbf{user defined} name via \pgfPTMmacro{pgfPTnewZlist}[]\{name\}\{list\}
% font
\vfill%
\label{option_font}%
-\pgfPTMoption[\pgfPTchangedinversion{2.1.0}]{4}{font}{phv (\textrm{pdf\LaTeX}); TeX Gyre Heros (\textrm{Xe\LaTeX} or \textrm{Lua\LaTeX})}%
-{Sets the font family, via the proper \textit{\textrm{\LaTeX} font name}, to use in the Periodic Table.
-\\ [2pt]When \textrm{pdf\LaTeX} is used to typeset the Periodic Table the \textit{default} font is \textit{phv}, \ie, the Helvetica font. In this case the value of the \red{font} key can be any \textit{\textrm{\LaTeX} font name} known to the local \textrm{\LaTeX} installation.
-\\ [2pt]When \textrm{Xe\LaTeX} or \textrm{Lua\LaTeX} are used to typeset the Periodic Table the \textit{default} font is \textit{TeX Gyre Heros}, a closest alternative to Helvetica font. In this case the value of the \red{font} key can be any \textit{font name known to your Operating System} and with \textrm{Lua\LaTeX} it can also be any \textit{font name available in your \textrm{TEXMF} tree}.
+\pgfPTMoption[\pgfPTchangedinversion{2.1.5}]{4}{font}{\raisebox{-\baselineskip}{%
+\vbox{\hsize=.675\linewidth\hbox{phv (\textrm{pdf\LaTeX}); TeX Gyre Heros (\textrm{Xe\LaTeX} or \textrm{Lua\LaTeX});}%
+\hbox{BabelStone Han (for Chinese)}}}%
+}%
+%phv (\textrm{pdf\LaTeX}); TeX Gyre Heros (\textrm{Xe\LaTeX} or \textrm{Lua\LaTeX});\par BabelStone Han (for Chinese)}%
+{\ \\ [8pt]Sets the font family, via the proper \textrm{\LaTeX} \textit{font name}, to use in the Periodic Table.
+\\ [2pt]When \textrm{pdf\LaTeX} is used to typeset the Periodic Table the \textit{default} font is \textit{phv}, \ie, the Helvetica font. In this case the value of the \red{font} key can be any \textrm{\LaTeX} \textit{font name} known to the local \textrm{\LaTeX} installation.
+\\ [2pt]When \textrm{Xe\LaTeX} or \textrm{Lua\LaTeX} are used to typeset the Periodic Table the \textit{default} font is \textit{TeX Gyre Heros}, a closest alternative to Helvetica font. In this case the value of the \red{font} key can be any \textit{font name known to your Operating System or} \textrm{\LaTeX} \textit{distribuition} and with \textrm{Lua\LaTeX} it can also be any \textit{font name available in your} \textrm{TEXMF} \textit{tree}.
+\\ [2pt]If the Chinese language is loaded the default font is BabelStone Han. See \hyperlink{subsec::zhLang}{Chinese} user language for more details.
\\ \hfill\scriptsize See \textit{\textrm{\LaTeX} font names} below or the \href{https://ftp.eq.uc.pt/software/TeX/macros/unicodetex/latex/fontspec/fontspec.pdf\#page=9}{fontspec documentation} for further details.\normalsize\\ \ }%
\\ [10pt]Examples with \textrm{pdf\LaTeX}:
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=ptm]%
@@ -148,45 +178,51 @@ any \textbf{user defined} name via \pgfPTMmacro{pgfPTnewZlist}[]\{name\}\{list\}
\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=Arial,CS font=\string\fontspec{LCALLIG.TTF}\string\selectfont]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTfontLuaXeLaTeX2.pdf}}}%
\\ [5pt]\pgfPTendoption%
+\vfill
+% back color
+\label{option_back color}%
+\pgfPTMoption{4}{back color}{white}%
+{Sets the background of each cell of the Periodic Table. It only takes effect if the \red{back color scheme} key is set to \red{solid}}%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},back color=black!15]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},back color=black!15]}}%
+\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},back color scheme=solid,back color=black!15]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},back color scheme=solid,back color=black!15]}}%
+\\ [5pt]\pgfPTendoption%
+\newpage\vspace{-34pt}\ %
% back color scheme
\label{option_back color scheme}%
-\vfill
-\pgfPTMoption{4}{back color scheme}{default}%
+\pgfPTMoption{4}{back color scheme}{pgfPTdefault}%
{Sets a \blue{named} back color scheme for the Periodic Table.}%
-\\ [5pt]\pgfPTMmacrobox{pgfPT}[back color scheme=Soft]%
-\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[back color scheme=Soft]}}%
-\newpage%
+\\ [2.5pt]\pgfPTMmacrobox{pgfPT}[back color scheme=pgfPTSoft]%
+\\ [2.5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[back color scheme=pgfPTSoft]}}%
+\vfill
\pgfPTMoptiontxt{%
The possible \lblue{name} is one of the following:
\begin{itembar}
\item\textbf{built-in}:
\begin{itemize}
-\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{Soft}, a soft color scheme that distinguishes metal, non metals, silicon and germanium, lanthanoids and actinoids.
-\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{Jmol}, is the color scheme used in the computer software \href{http://jmol.sourceforge.net/}{Jmol}: an open-source Java viewer for chemical structures in 3D.
-\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{CPK}, is the color scheme of the popular color convention for distinguishing atoms of different chemical
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTSoft}, a soft color scheme that distinguishes metals, non metals, silicon and germanium, lanthanoids and actinoids.
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTJmol}, is the color scheme used in the computer software \href{http://jmol.sourceforge.net/}{Jmol}: an open-source Java viewer for chemical structures in 3D.
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTCPK}, is the color scheme of the popular color convention for distinguishing atoms of different chemical
elements in molecular models. The scheme is named after the CPK molecular models designed by chemists Robert Corey and Linus Pauling, and improved by Walter Koltun.
-\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{Rasmol}, is the color scheme used in the computer software \href{http://www.rasmol.org/}{RasMol}, a program for molecular graphics visualization originally developed by Roger Sayle.
-\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{RasmolNew}, is a color scheme used in RasMol with revision of CPK colors made by C. Chigbo (RasMol 2.7.3).
-\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{Wikipedia}, is the color scheme based on the \href{https://en.wikipedia.org/wiki/Periodic_table\#Classification_of_elements}{Wikipedia Periodic Table of Elements}.
-\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{MNM}, is designed to show \textbf{M}etals and \textbf{N}on \textbf{M}etals in two different colors, showing also the semi-metals in a third color.
-\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{PS}, is designed to show the \textbf{P}hysical \textbf{S}tate of the elements at normal temperature and pressure (NTP) in different colors.
-\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{Radio}, is designed to show the \textbf{R}adioactive elements in one color and the non radioactive elements in another color.
-\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{Blocks}, for showing the elements in each block of the Periodic Table with the same color.
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTRasmol}, is the color scheme used in the computer software \href{http://www.rasmol.org/}{RasMol}, a program for molecular graphics visualization originally developed by Roger Sayle.
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTRasmolNew}, is a color scheme used in RasMol with revision of CPK colors made by C. Chigbo (RasMol 2.7.3).
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTWikipediaII}, is the color scheme based on the most recent (\href{https://commons.wikimedia.org/wiki/File:Simple_Periodic_Table_Chart-en.svg\#filehistory}{November 2020 to present}) \href{https://en.wikipedia.org/wiki/Periodic_table\#Classification_of_elements}{Wikipedia Periodic Table of Elements}.
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTWikipediaI}, is the color scheme based on the previous (\href{https://commons.wikimedia.org/wiki/File:Simple_Periodic_Table_Chart-en.svg\#filehistory}{until October 2020}) Wikipedia Periodic Table of Elements.
+ \\ [2pt]\tikz{\node[text width=\linewidth-3mm,draw=green!70,rounded corners=2pt,fill=black!10!green!10,inner sep=1.5mm] {%
+ The higher the number on Wikipedia, the more recent the color scheme.
+ \\ For backwards compatibility (and also for simplicity) pgfPTWikipedia points to pgfPTWikipediaII.% and csWikipedia points to csWikipediaII,
+ };}
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTMNM}, is designed to show \textbf{M}etals and \textbf{N}on \textbf{M}etals in two different colors, showing also the semi-metals in a third color.
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTPS}, is designed to show the \textbf{P}hysical \textbf{S}tate of the elements at normal temperature and pressure (NTP) in different colors.
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTRadio}, is designed to show the \textbf{R}adioactive elements in one color and the non radioactive elements in another color.
+\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{pgfPTBlocks}, for showing the elements in each block of the Periodic Table with the same color.
\item[\raisebox{1pt}{\scriptsize$\vartriangleright\,$}]\sq{solid}, to show the background of each cell of the Periodic Table with the same color specified by the key \sq{\red{back color}}.
\end{itemize}
\item any \textbf{user defined} name via \bs{pgfPTnewColorScheme}\lb\red{name}\rb\lb\red{color list}\rb%
\end{itembar}%
}%
-\\ [-5pt]\pgfPTendoption%
-% back color
-\label{option_back color}%
-\pgfPTMoption{4}{back color}{white}%
-{Sets the background of each cell of the Periodic Table. It only takes effect if the \red{back color scheme} key is set to \red{solid}}%
-\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},back color=black!15]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},back color=black!15]}}%
-\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},back color scheme=solid,back color=black!15]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},back color scheme=solid,back color=black!15]}}%
-\\ [5pt]\pgfPTendoption%
+\\ [-7.5pt]\pgfPTendoption%
\newpage\ \vfill%
\textit{It is possible to set the \red{back color scheme} key with the built-in names using the following styles}:\vfill%
% STYLES for back color schemes -> csSoft,csJmol,csCPK,csRasmol,csRasmolNew,csWikipedia,csMNM,csPS,csRadio,csBlocks,csSolid
@@ -199,9 +235,11 @@ elements in molecular models. The scheme is named after the CPK molecular models
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[csSolid=black!15]}}%
\\ [5pt]\pgfPTendstyle%
\newpage\vspace{-34pt}\ %
-\foreach \csName/\x in {Soft/0,Jmol/1,CPK/0,Rasmol/1,RasmolNew/0,Wikipedia/1,MNM/0,PS/1,Radio/0,Blocks/1}{%
+%\foreach \csName/\x in {Soft/0,Jmol/1,CPK/0,Rasmol/1,RasmolNew/0,Wikipedia/1,MNM/0,PS/1,Radio/0,Blocks/1}{%
+\foreach \csName/\x\desc in {Soft/0/Soft,Jmol/1/Jmol,CPK/0/CPK,Rasmol/1/Rasmol,RasmolNew/0/RasmolNew,%
+Wikipedia/1/WikipediaII,WikipediaI/0/WikipediaI,WikipediaII/1/WikipediaII,MNM/0/MNM,PS/1/PS,Radio/0/Radio,Blocks/1/Blocks}{%
\pgfPTMstyletxt{4}{cs\csName}{no value}%
-{A style equivalent to \red{back color scheme=\csName}}%
+{A style equivalent to \red{back color scheme=pgfPT\desc}}%
\\ [5pt]\pgfPTMmacrobox{pgfPT}[cs\csName]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[cs\csName]}}%
\\ [0pt]\pgfPTendstyle%
@@ -262,7 +300,7 @@ elements in molecular models. The scheme is named after the CPK molecular models
\vfill
\label{option_languages}%
\pgfPTMoption[\pgfPTchangedinversion{2.1.0}]{4}{languages}{\{\}}%
-{Sets a language list to use in the Periodic Table. It is a comma separated list of language flags: \sq{pt}, \sq{en}, \sq{fr}, \sq{de}, \sq{it}, \sq{es} or \sq{br}. If a user language has been loaded, the corresponding ISO 639-1 code can also be used as a language flag. \textit{This key overrides the default language, that is, the language loaded at package inclusion}.\\ \ }%
+{Sets a language list to use in the Periodic Table. It is a comma separated list of language flags: \sq{pt}, \sq{en}, \sq{fr}, \sq{de}, \sq{it}, \sq{es} or \sq{br}. If a user language has been loaded, the corresponding ISO 639-1 code can also be used as a language flag. \textit{This key locally overrides the default language, that is, the language loaded at package inclusion}.\\ \ }%
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},languages=pt]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},languages=pt]}}%
\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPT2lang,languages={en,fr}]%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_libCS.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_libCS.tex
index 5e8ffea167..e973146b7f 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_libCS.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_libCS.tex
@@ -232,7 +232,7 @@ P6=*[RGB:62;82;126],P7=*[RGB:101;117;153]}\rb%
\label{command:pgfPTCScombine}\addcontentsline{toc}{subsubsection}{\texorpdfstring{\tmpSectionIII{}}{\textbackslash pgfPTCScombine}}%
\index{LIBRARIES@\textbf{\cyan{LIBRARIES}}!colorschemes@\textbf{\red{Color Schemes Library}}!\tmpSectionIII}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\\ [10pt]This command \textbf{combines two named Color Schemes} and merges the result in a new Color Scheme with \red{name of the new color scheme}.
+\\ [10pt]This command \textbf{combines two named Color Schemes} and merges the result into a new Color Scheme with \red{name of the new color scheme}.
\\ For example \bs{pgfPTCScombine}\lb\red{myCSA,myCSB,myCSC}\rb\ adds the color scheme \red{myCSA} to the color scheme \red{myCSB} and their sum will be available as the color scheme \red{myCSC}.
\\ [3pt]\blue{\textbf{NOTE}}: if the Color Schemes have different sizes (\ie, different number of colors), the last color from the color scheme that ends first will be used until the other color scheme also ends.
\\ [3pt]The optional parameters \lp\red{prop1:prop2,mode}\rp\ are for controlling how the two Color Schemes are combined:
@@ -292,24 +292,24 @@ P6=*[RGB:62;82;126],P7=*[RGB:101;117;153]}\rb%
}{%
\scalebox{.425}{\pgfPT[back color scheme=mix,show title=false]}%
}% -----
-\vfill\pgfPTCScombine[add]{Soft,group,mix}%
+\vfill\pgfPTCScombine[add]{pgfPTSoft,group,mix}%
\textit{Built-in color schemes can also be mixed}:
\\ [10pt]\pgfPTMlibexample{%
-\bs{pgfPTCScombine}\lp\red{add}\rp\lb\red{Soft,group,mix}\rb%
+\bs{pgfPTCScombine}\lp\red{add}\rp\lb\red{pgfPTSoft,group,mix}\rb%
\\ \pgfPTMmacro{pgfPT}[back color scheme=mix,show title=false]%
}{%
\scalebox{.425}{\pgfPT[back color scheme=mix,show title=false]}%
}% -----
-\newpage\pgfPTCScombine[add,3:1]{Soft,PS,mix}%
+\newpage\pgfPTCScombine[add,3:1]{pgfPTSoft,pgfPTPS,mix}%
\pgfPTMlibexample{%
-\bs{pgfPTCScombine}\lp\red{add,3:1}\rp\lb\red{Soft,PS,mix}\rb%
+\bs{pgfPTCScombine}\lp\red{add,3:1}\rp\lb\red{pgfPTSoft,pgfPTPS,mix}\rb%
\\ \pgfPTMmacro{pgfPT}[back color scheme=mix,show title=false]%
}{%
\scalebox{.425}{\pgfPT[back color scheme=mix,show title=false]}%
}% -----
-\\ [4pt]\pgfPTCScombine{Radio,Wikipedia,mix}%
+\\ [4pt]\pgfPTCScombine{pgfPTRadio,pgfPTWikipedia,mix}%
\pgfPTMlibexample{%
-\bs{pgfPTCScombine}\lp\red{add}\rp\lb\red{Radio,Wikipedia,mix}\rb%
+\bs{pgfPTCScombine}\lp\red{add}\rp\lb\red{pgfPTRadio,pgfPTWikipedia,mix}\rb%
\\ \pgfPTMmacro{pgfPT}[back color scheme=mix,show title=false]%
}{%
\scalebox{.425}{\pgfPT[back color scheme=mix,show title=false]}%
@@ -322,7 +322,7 @@ P6=*[RGB:62;82;126],P7=*[RGB:101;117;153]}\rb%
\index{LIBRARIES@\textbf{\cyan{LIBRARIES}}!colorschemes@\textbf{\red{Color Schemes Library}}!\tmpSectionIV}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\\ [10pt]This command \textbf{writes the provided Color Schemes to a file} for later use without loading this library. It has a mandatory argument, the \red{list of the color schemes names} to be written and an optional argument, the \red{filename}. If no \red{filename} is provided the first name on the \red{list of the color schemes names} is used.
-\\ For example, \bs{pgfPTCSwrite}\lp\red{myGroupColors}\rp\lb\red{myGroupGradGreenToRed,myGroupGreens, myGroupGradYellowToRed}\rb, \dcyan{\textit{will create (or overwrite), in the current working directory, a file with name} \texttt{\large myGroupColors.tex} \textit{with the follwing contents}}:
+\\ For example, \bs{pgfPTCSwrite}\lp\red{myGroupColors}\rp\lb\red{myGroupGradGreenToRed,myGroupGreens, myGroupGradYellowToRed}\rb, \dcyan{\textit{will create (or overwrite), in the current working directory, a file with name} \texttt{\large myGroupColors.tex} \textit{with the following contents}}:
\mymfbox{\textsf{%
\textbackslash pgfPTnewColorScheme\{myGroupGradGreenToRed\}\{0/1/0,\myldots%
\\ \textbackslash pgfPTnewColorScheme\{myGroupGreens\}\{0/1/.1,\myldots%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
index 78f8178826..0fcc955dd2 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
@@ -11,7 +11,7 @@ Sets the color of the element name.
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},name color=red]}}%
\\ [0pt]\pgfPTendoption%
% name font
-\pgfPTMoption{4}{name font}{\string\fontseries\{l\}\string\selectfont\string\tiny}{%
+\pgfPTMoption{4}{name font}{\string\tiny}{% \string\fontseries\{l\}\string\selectfont (removed @v2.1.2)
Sets the font of the element name.
}
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},name font=\string\itshape\string\tiny]%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex
index ff09b0b2e1..07bf420037 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex
@@ -10,6 +10,7 @@
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},show period numbers=false]}}%
\\ [5pt]\pgfPTendoption%
% show group numbers
+\newpage\vspace{-34pt}\ %
\label{option_show group numbers}%
\pgfPTMoption{4}{show group numbers}{true}%
{When set to \red{true} the group numbers are shown, otherwise they are not shown.}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_variations.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_variations.tex
index 04a606adfd..019fcf8e2b 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_variations.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_variations.tex
@@ -21,7 +21,7 @@
{Sets the color used in the filling of the \textit{arrows} for the atomic radius variations.
\\ [10pt]\tikz{\node[text width=\linewidth-.6666em,fill=orange!5!white,draw=orange,rounded corners=2pt] {\textbf{\orange{NOTE}}:\\ The color provided to \red{varR color} could be any defined color via the command \texttt{\normalsize\textbackslash definecolor} or by \textit{mixing} colors, using, for instance, the syntax \texttt{\normalsize color1!value!color2}, as explained in the \href{https://ctan.org/pkg/xcolor}{xcolor} package documentation.};}
}%
-\\ [5pt]\pgfPTMmacrobox{pgfPT}[show periodic variations,cell style=pgfPTR,varR color=teal,R color=purple]%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[show periodic variations,cell style=pgfPTR,varR color=purple!50!white,R color=purple]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[show periodic variations,cell style=pgfPTR,varR color=purple!50!white, R color=purple]}}%
\\ [5pt]\pgfPTendoption%
% varR font
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_user_compactPT.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_user_compactPT.pdf
new file mode 100644
index 0000000000..adc5c41f5f
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_user_compactPT.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_1.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_1.pdf
new file mode 100644
index 0000000000..ec28f5dc44
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_1.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_1.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_1.tex
new file mode 100644
index 0000000000..b0d2008a90
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_1.tex
@@ -0,0 +1,10 @@
+\documentclass{article}
+\usepackage[userlang=zh]{pgf-PeriodicTable}%
+
+\usepackage[active,tightpage]{preview}
+\PreviewEnvironment{tikzpicture}
+\setlength\PreviewBorder{0pt}%
+
+\begin{document}\noindent%
+\pgfPT
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_2.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_2.pdf
new file mode 100644
index 0000000000..046a4210ea
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_2.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_2.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_2.tex
new file mode 100644
index 0000000000..4775b8e009
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_2.tex
@@ -0,0 +1,10 @@
+\documentclass{article}
+\usepackage[userlang=zh,numerals=zh]{pgf-PeriodicTable}%
+
+\usepackage[active,tightpage]{preview}
+\PreviewEnvironment{tikzpicture}
+\setlength\PreviewBorder{0pt}%
+
+\begin{document}\noindent%
+\pgfPT
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_3.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_3.pdf
new file mode 100644
index 0000000000..41ede02fc5
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_3.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_3.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_3.tex
new file mode 100644
index 0000000000..f0af937479
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_3.tex
@@ -0,0 +1,17 @@
+\documentclass{article}
+\usepackage[userlang=zh]{pgf-PeriodicTable}%
+
+\usepackage[active,tightpage]{preview}
+\PreviewEnvironment{tikzpicture}
+\setlength\PreviewBorder{0pt}%
+
+\begin{document}\noindent%
+\setmainfont{SimSun}
+\pgfPTzhtextfontSS{SimSun}% font for names of elements Z={109,112.113,117,118} ->
+% meitnerium, copernicium, nihonium, tennessine, oganesson
+\pgfPTzhtextfontSSB{SimSun-ExtB}% font for names of elements Z={104,105,106,107,108,110,111,114} ->
+% rutherfordium, dubnium, seaborgium, bohrium, hassium,darmstadtium, roentgenium, flerovium
+\pgfPTzhtextfontLv{SimSun-ExtB}% font for name of element Z={116} -> livermorium
+
+\pgfPT[font=SimSun]
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_fonts.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_fonts.pdf
new file mode 100644
index 0000000000..0afcb0d885
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_fonts.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_fonts.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_fonts.tex
new file mode 100644
index 0000000000..896f22bb61
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_zh_fonts.tex
@@ -0,0 +1,105 @@
+% !TeX TS-program = XeLaTeX
+
+\documentclass{article}
+
+\usepackage{fontspec}[2020/02/03]
+\setmainfont{Verdana}
+\usepackage{tikz}
+
+\usepackage[active,tightpage]{preview}
+\PreviewEnvironment{tikzpicture}
+\setlength\PreviewBorder{0pt}%
+
+\newcount\nl\nl=1\relax% line number
+\newcount\nc\nc=0\relax% column number
+\newdimen\wdc\wdc=75pt\relax% column width
+
+% TeX Live 2024 Fonts:
+% FandolSong,FandolFang,FandolHei,FandolKai,AR PL SungtiL GB,AR PL KaitiM GB (collection-langcjk + collection-langchinese)
+% Microsoft Fonts:
+% Win10 & 11: SimSun & SimSun-ExtB
+% Win10 & 11: Microsoft YaHei & Microsoft YaHei UI
+% Win10 & 11: Microsoft JhengHei & Microsoft JhengHei UI
+
+% Testing the Fonts:
+\def\pgfPTzhTF#1{\begingroup\setmainfont{\typeface}#1\endgroup}
+
+\begin{document}
+\begin{tikzpicture}[every node/.style={below right,text depth=0pt}]
+\node[minimum height=14pt,text width=100pt,align=center,inner sep=0pt,draw]
+at (0,0) {\bfseries ELEMENT};
+\foreach \element in {hydrogen,\ldots,lawrencium,%
+rutherfordium,dubnium,seaborgium,bohrium,hassium,meitnerium,darmstadtium,%
+roentgenium,copernicium,nihonium,flerovium,livermorium,tennessine,oganesson%
+}%
+{%
+\node[minimum height=14pt,text width=100pt,align=center,inner sep=0pt,draw]
+at (0,-14pt*\nl) {\element};
+\global\advance\nl by1\relax%
+}%
+% ------------- BabelStoneHan Font ---------------------------------------------------------
+\node[minimum height=14pt,text width=\wdc,align=center,inner sep=0pt,fill=green!5]
+at (100pt,14pt) {\itshape\resizebox{.9\wdc}{\height}{BabelStone Fonts}};%
+\foreach \typeface in {BabelStone Han}
+{
+\global\nl=1\relax%
+\node[minimum height=14pt,text width=\wdc,align=center,inner sep=0pt,draw]
+at (100pt+\wdc*\nc,0) {\bfseries\resizebox{.9\wdc}{\height}{\typeface}};
+ \foreach \zhElement in {æ°¢,\ldots,铹,𬬻,𬭊,𬭳,𬭛,𬭶,é¿,𫟼,𬬭,é¿”,é¿­,𫓧,ð«Ÿ·,鿬,é¿«}{
+ \node[minimum height=14pt,text width=\wdc,align=center,inner sep=0pt,draw,fill=green!5]
+ at (100pt+\wdc*\nc,-14pt*\nl) {\pgfPTzhTF{\zhElement}};
+ \global\advance\nl by1\relax%
+ }
+\global\advance\nc by1\relax%
+}
+% ------------- Win Fonts -------------------------------------------------------------------
+\node[minimum height=14pt,text width=5*\wdc,align=center,inner sep=0pt,fill=orange!10]
+at (100pt+\wdc,14pt) {\itshape Windows 10 \& Windows 11 Fonts};%
+\foreach \typeface in {SimSun,SimSun-ExtB,Microsoft YaHei,Microsoft JhengHei,MingLiU-ExtB}
+{
+\global\nl=1\relax%
+\node[minimum height=14pt,text width=\wdc,align=center,inner sep=0pt,draw]
+at (100pt+\wdc*\nc,0) {\bfseries\setbox0=\hbox{\typeface}%
+ \ifdim\wd0>.9\wdc\relax\resizebox{.9\wdc}{\height}{\typeface}\else%
+ \typeface\fi};
+ \foreach \zhElement in {æ°¢,\ldots,铹,𬬻,𬭊,𬭳,𬭛,𬭶,é¿,𫟼,𬬭,é¿”,é¿­,𫓧,ð«Ÿ·,鿬,é¿«}{
+ \node[minimum height=14pt,text width=\wdc,align=center,inner sep=0pt,draw]
+ at (100pt+\wdc*\nc,-14pt*\nl) {\pgfPTzhTF{\zhElement}};
+ \global\advance\nl by1\relax%
+ }
+\global\advance\nc by1\relax%
+}
+% ------------- «newline» -------------------------------------------
+\node[minimum height=14pt,text width=100pt,align=center,inner sep=0pt,draw]
+at (0,-266pt) {\bfseries ELEMENT};
+\global\advance\nl by2\relax%
+\global\nc=0\relax%
+\foreach \element in {hydrogen,\ldots,lawrencium,%
+rutherfordium,dubnium,seaborgium,bohrium,hassium,meitnerium,darmstadtium,%
+roentgenium,copernicium,nihonium,flerovium,livermorium,tennessine,oganesson%
+}%
+{%
+\node[minimum height=14pt,text width=100pt,align=center,inner sep=0pt,draw]
+at (0,-14pt*\nl) {\element};
+\global\advance\nl by1\relax%
+}%
+% ------------- TeX Live 2024 Fonts --------------------------------
+\node[minimum height=14pt,text width=6*\wdc,align=center,inner sep=0pt,fill=red!10]
+at (100pt,-252pt) {\itshape TeX Live 2024 Fonts};%
+\foreach \typeface in {FandolSong,FandolFang,FandolHei,FandolKai,AR PL SungtiL GB,AR PL KaitiM GB}
+{
+\global\nl=1\relax%
+\node[minimum height=14pt,text width=\wdc,align=center,inner sep=0pt,draw]
+at (100pt+\wdc*\nc,-266pt) {\bfseries\setbox0=\hbox{\typeface}%
+ \ifdim\wd0>.9\wdc\relax\resizebox{.9\wdc}{\height}{\typeface}\else%
+ \typeface\fi};
+ \foreach \zhElement in {æ°¢,\ldots,铹,𬬻,𬭊,𬭳,𬭛,𬭶,é¿,𫟼,𬬭,é¿”,é¿­,𫓧,ð«Ÿ·,鿬,é¿«}{
+ \node[minimum height=14pt,text width=\wdc,align=center,inner sep=0pt,draw]
+ at (100pt+\wdc*\nc,-266pt-14pt*\nl) {\pgfPTzhTF{\zhElement}};
+ \global\advance\nl by1\relax%
+ }
+\global\advance\nc by1\relax%
+}
+
+\end{tikzpicture}
+\end{document}
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
index ddaee71477..73abb57f78 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
@@ -1,5 +1,9 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definitions for pgf-PeriodicTable Manual
+% Hugo Gomes @ 10/02/2025 v2.1.5
+% Hugo Gomes @ 08/09/2024 v2.1.4
+% Hugo Gomes @ 07/08/2024 v2.1.3
+% Hugo Gomes @ 01/08/2024 v2.1.2
% Hugo Gomes @ 07/07/2024 v2.1.1
% Hugo Gomes @ 03/04/2024 v2.1.0a
% Hugo Gomes @ 14/02/2024 v2.1.0
@@ -7,7 +11,7 @@
% Hugo Gomes @ 20/02/2023 v2.0.0
% Hugo Gomes @ 08/11/2022 v1.0.1
% Hugo Gomes @ 10/10/2022 v1.0.0
-\def\pgfPTversion{2.1.1}%
+\def\pgfPTversion{2.1.5}%
\def\pgfPTnewinversion#1{new in v#1}%
\def\pgfPTchangedinversion#1{changed in v#1}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -22,31 +26,6 @@
\setcounter{secnumdepth}{1}%
\setcounter{tocdepth}{4}
%
-\makeatletter%
-\global\renewcommand\thesection{}%
-\renewcommand\thesubsection{\@arabic\c@subsection}%
-\renewcommand\section{\@startsection{section}{1}{\z@}%
- {-3.5ex \@plus -1ex \@minus -.2ex}%
- {2.3ex \@plus.2ex}%
- {\hskip-1.4395em\normalfont\Large\bfseries}}%
-\renewcommand*\l@section[2]{%
- \ifnum \c@tocdepth >\z@%
- \addpenalty\@secpenalty%
- \addvspace{1.0em \@plus\p@}%
- \setlength\@tempdima{0em}%
- \begingroup%
- \parindent \z@ \rightskip \@pnumwidth%
- \parfillskip -\@pnumwidth%
- \leavevmode \bfseries%
- \advance\leftskip\@tempdima%
- \hskip -\leftskip%
- #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par%
- \endgroup%
- \fi}%
-\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{1.5em}}%
-\renewcommand*\l@subsubsection{\@dottedtocline{3}{3.0em}{2.4em}}%
-\renewcommand*\l@paragraph{\@dottedtocline{4}{4.25em}{1.35em}}%
-\makeatother%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pgfdeclarelayer{back}%
\pgfsetlayers{back,main}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
index d3e8d4cbe1..e29d0f458d 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
+++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
@@ -1,4 +1,8 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Hugo Gomes @ 10/02/2025 v2.1.5
+% Hugo Gomes @ 08/09/2024 v2.1.4
+% Hugo Gomes @ 07/08/2024 v2.1.3
+% Hugo Gomes @ 01/08/2024 v2.1.2
% Hugo Gomes @ 07/07/2024 v2.1.1
% Hugo Gomes @ 03/04/2024 v2.1.0a
% Hugo Gomes @ 14/02/2024 v2.1.0
@@ -8,7 +12,7 @@
% Hugo Gomes @ 10/10/2022 v1.0.0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NeedsTeXFormat{LaTeX2e}%
-\ProvidesPackage{pgf-PeriodicTable}[07/07/2024 pgf-PeriodicTable v2.1.1]%%
+\ProvidesPackage{pgf-PeriodicTable}[10/02/2025 pgf-PeriodicTable v2.1.5]%%
\RequirePackage{tikz}%
\usetikzlibrary{fadings}%
\tikzfading[name=aumentax, left color=transparent!80, right color=transparent!1]%
@@ -17,17 +21,26 @@
\tikzfading[name=diminuiy, bottom color=transparent!80, top color=transparent!1]%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% check the engine and load font packages
-\ifx\pdfliteral\undefined\relax% XeLaTeX or LuaLaTeX
-\RequirePackage{fontspec}[2020/02/03]\edef\pgfPT@fontspec{1}%
-\else% pdfLaTeX
-\RequirePackage[T1]{fontenc}\edef\pgfPT@fontspec{0}%
-\fi%
+% changed in v2.1.3
+% pdfLaTeX --------------------------------------------------
+\ifx\pdftexversion\undefined\else%
+\RequirePackage[T1]{fontenc}\edef\pgfPT@fontspec{0}\edef\pgfPT@engine{0}%
+\fi% -----------------------------------------------------------
+% LuaLaTeX --------------------------------------------------
+\ifx\directlua\undefined\else%
+\RequirePackage{fontspec}[2020/02/03]\edef\pgfPT@fontspec{1}\edef\pgfPT@engine{1}%
+\fi% -----------------------------------------------------------
+% XeLaTeX ---------------------------------------------------
+\ifx\XeTeXrevision\undefined\else%
+\RequirePackage{fontspec}[2020/02/03]\edef\pgfPT@fontspec{1}\edef\pgfPT@engine{2}%
+\fi% -----------------------------------------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ifs to user language and list of user translations available
\newif\ifpgfPT@user@lang\pgfPT@user@langfalse%
\newif\ifpgfPT@user@lang@isvalid\pgfPT@user@lang@isvalidfalse%
% ISO code language list ------------------------------------->
-\def\pggPT@userlanguage@ISOcode@list{nl/Nederlands}%
+% added zh in v2.1.5
+\def\pggPT@userlanguage@ISOcode@list{nl/Nederlands,zh/Chinese}%
% ----------------------------------------------------------------
\def\pggPT@userlanguage@ISOcode@check#1{%
\edef\pgfPT@tmpISOcode{#1}%
@@ -57,6 +70,10 @@
\DeclareOption{it}{\def\pgfPT@defaultLanguage{it}}%
\DeclareOption{es}{\def\pgfPT@defaultLanguage{es}}%
\DeclareOption{br}{\def\pgfPT@defaultLanguage{br}}%
+\DeclareOption{beamer}{\def\pgfPT@beamer{setting small caps compatibility with beamer via 'lmodern' package.}}% new in v2.1.5
+\DeclareOption{beamer*}{\def\pgfPT@beamerstar{setting small caps compatibility with beamer via T1 cmr fonts.}}% new in v2.1.5
+\DeclareOption{beamer**}{\def\pgfPT@beamerstar{setting small caps compatibility with beamer via T1 cmr fonts.}%
+\def\pgfPT@suppressfontwrn{suppressing small caps font substitution warnings with the 'silence' package.}}% new in v2.1.5
\DeclareOption{dvnnumerals}{%
\ifnum\pgfPT@fontspec=0\relax%
\def\pgfPT@dvn@wrn{\PackageError{pgfPT}{package option 'numerals=dvn' (Devanagari Numerals) requires 'fontspec' package with XeLaTeX engine...}}%
@@ -88,6 +105,8 @@
\pggPT@userlanguage@ISOcode@check{##2}%
\ifpgfPT@user@lang@isvalid%
\message{Loading \pggPT@userlanguage@ISOcode@Name\space language data...}%
+\edef\pgfPT@langtest{zh}\ifx\pgfPT@langtest\pggPT@userlanguage@ISOcode\relax% if Chinese...
+\def\pgfPT@lang@zh{}\fi% new v2.1.5
\pgfPT@user@langtrue\def\pgfPT@defaultLanguage{user}%
\else%
\@latex@error{Unknown language ISO code '\pgfPT@tmpISOcode' for \@cls@pkg\space`\@currname'}%
@@ -107,19 +126,69 @@
}% END \DeclareOption*
\ExecuteOptions{en}%
\ProcessOptions\relax%
+% setting beamer \textsc compatibility with beamer and pdfLaTeX. new in v2.1.5
+\ifx\pgfPT@beamer\undefined\relax\else%
+\ifnum\pgfPT@fontspec=0\relax% pdfLaTeX
+\RequirePackage{lmodern}%
+\PackageWarning{pgfPT}{\pgfPT@beamer}\else% XeLaTeX or LuaLaTeX
+\PackageWarning{pgfPT}{option 'beamer' ignored.}\fi\fi%
+\ifx\pgfPT@beamerstar\undefined\relax\else%
+\ifnum\pgfPT@fontspec=0\relax% pdfLaTeX
+\DeclareFontShape{T1}{cmss}{m}{sc}{<->sub*cmr/m/sc}{}%
+\DeclareFontShape{T1}{cmss}{m}{scsl}{<->sub*cmr/m/scsl}{}%
+\DeclareFontShape{T1}{cmss}{bx}{sc}{<->sub*cmr/bx/sc}{}%
+\DeclareFontShape{T1}{cmss}{bx}{scsl}{<->sub*cmr/bx/scsl}{}%
+\PackageWarning{pgfPT}{\pgfPT@beamerstar}
+\ifx\pgfPT@suppressfontwrn\undefined\relax\else% suppressing font warnings
+\PackageWarning{pgfPT}{\pgfPT@suppressfontwrn}%
+\RequirePackage{silence}%
+\WarningFilter{latexfont}{Font shape `T1/cmss/m/sc'}%
+\WarningFilter{latexfont}{Font shape `T1/cmss/m/scsl'}%
+\WarningFilter{latexfont}{Font shape `T1/cmss/bx/sc'}%
+\WarningFilter{latexfont}{Font shape `T1/cmss/bx/scsl'}%
+\WarningFilter{latexfont}{Font shape `T1/cmss/m/scit'}%
+\WarningFilter{latexfont}{Font shape `T1/cmss/bx/scit'}%
+\fi%
+\else% XeLaTeX or LuaLaTeX
+\PackageWarning{pgfPT}{Option 'beamer' ignored.}\fi\fi%
+%
\ifx\pgfPT@dvn@wrn\undefined\relax\else\pgfPT@dvn@wrn\fi%
\ifx\pgfPT@zh@wrn\undefined\relax\else\pgfPT@zh@wrn\fi%
\ifx\pgfPT@zhnumerals\undefined\relax\else%
\RequirePackage{zhnumber}%
\pgfPT@zhnumbers@Ztrue\pgfPT@zhnumbers@pertrue\pgfPT@zhnumbers@grtrue%
-\newfontfamily\pgfPTzhnumberfont[Script=CJK,AutoFakeBold=4]{SimSun}%
-\def\pgfPTzhfont{\@ifnextchar[{\@pgfPTzhfont}{\@pgfPTzhfont[]}}%
-\def\@pgfPTzhfont[#1]#2{\renewfontfamily\pgfPTzhnumberfont[Script=CJK,#1]{#2}}%
-\let\pgfPTnumberfont\pgfPTzhnumberfont%
+%\newfontfamily\pgfPTzhthenumberfont[Script=CJK,AutoFakeBold=4]{SimSun}% changed in v2.1.5 to ->
+\newfontfamily\pgfPTzhthenumberfont[Script=CJK,AutoFakeBold=4]{BabelStoneHan.ttf}%
+\def\pgfPTzhnumberfont{\@ifnextchar[{\@pgfPTzhnumfont}{\@pgfPTzhnumfont[]}}% changed in v2.1.5
+\def\@pgfPTzhnumfont[#1]#2{\renewfontfamily\pgfPTzhthenumberfont[Script=CJK,#1]{#2}}%
+\let\pgfPTnumberfont\pgfPTzhthenumberfont% changed in v2.1.5
+\let\pgfPTzhfont\pgfPTzhnumberfont% new in v2.1.5 for compatibility with previous versions
\let\pgfPT@printnum\zhnumber%
\fi%
\ifx\pgfPT@printnum\undefined\relax\let\pgfPT@printnum\relax\let\pgfPTnumberfont\relax\fi%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Chinese language
+\ifx\pgfPT@lang@zh\undefined\relax\else% Chinese
+\ifnum\pgfPT@fontspec=0\relax%
+\PackageError{pgfPT}{package option 'userlang=zh' (Chinese) requires 'fontspec' package with XeLaTeX or LuaLaTeX engines...}%
+\else%
+% setting font features
+\def\pgfPT@zhFontFeatures{[Script=CJK,AutoFakeBold=4]}%
+\def\pgfPTzhFontFeatures#1{\def\pgfPT@zhFontFeatures{[Script=CJK,#1]}}%
+% extra font selection for ideographs not available in «common» fonts (UTF-8 ranges not available)
+% - defaults:
+\def\pgfPT@fontzhSS{BabelStoneHan.ttf}% font for names of elements Z={109,112.113,117,118} ->
+% meitnerium, copernicium, nihonium, tennessine, oganesson
+\def\pgfPT@fontzhSSB{BabelStoneHan.ttf}% font for names of elements Z={104,105,106,107,108,110,111,114} ->
+% rutherfordium, dubnium, seaborgium, bohrium, hassium,darmstadtium, roentgenium, flerovium
+\def\pgfPT@fontzhSSLv{BabelStoneHan.ttf}% font for name of element Z={116} -> livermorium
+% - user choices
+\def\pgfPTzhtextfontSS#1{\def\pgfPT@fontzhSS{#1}}%
+\def\pgfPTzhtextfontSSB#1{\def\pgfPT@fontzhSSB{#1}}%
+\def\pgfPTzhtextfontLv#1{\def\pgfPT@fontzhSSLv{#1}}%
+\fi%
+\fi%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% process user language
\ifpgfPT@user@lang%
\input{translations/pgfPT.lang.\pggPT@userlanguage@ISOcode.tex}%
@@ -143,6 +212,7 @@
\newif\ifpgfPTis@backcolorsolid%
\newif\ifpgfPTis@labeldrawn%
\newif\ifpgfPT@drawLaAc%
+\newif\ifpgfPT@Zliststar\pgfPT@Zliststarfalse% v2.1.5
\def\pgfPT@true{true}%
\def\pgfPT@TRUE{TRUE}%
\def\pgfPT@false{false}%
@@ -188,11 +258,11 @@
% Resetting global style for the Periodic Table
\def\pgfPTresetstyle{\tikzset{/pgfPerTable/.cd,languages,other languages font,other languages color,%
font,IUPAC,capitalize element names=false,show title,show period numbers,show group numbers,%
-show legend,legend acronyms,legend back color,show legend pins,show extra legend,legend radio color,%
+show legend,legend acronyms,legend acronyms font size,legend back color,show legend pins,show extra legend,legend radio color,%
legend CS color,legend Z color,show blocks=false,show families=false,show MNM line,show periodic variations=false,%
show label LaAc,title font,title color,cell width,cell height,cell style,label font,period label color,group label color,%
label LaAc font,group numbers,Roman label color,Z list,CS solid, CS liquid,CS gas,CS synt,CS font,CS render mode,CS outline color,CS outline width,%
-Z backcolor,Z color,Z font,Z align,Z padding,Z use box width=false,name color,name font,name align,Ar color,Ar font,Ar label,Ar precision,%
+decimal separator,Z backcolor,Z color,Z font,Z align,Z padding,Z use box width=false,name color,name font,name align,Ar color,Ar font,Ar label,Ar precision,%
R color,R font,Rcov color,Rcov font,Rion color,Rion font,Ei color,Ei font,eneg color,eneg font,eaff color,eaff font,%
O color,O font,O Roman=false,Tmelt color,Tmelt font,TmeltC color,TmeltC font,Tboil color,Tboil font,TboilC color,TboilC font,%
eDist color,eDist font,eDist sep,eConfign color,eConfign font,eConfignl color,eConfignl font,d color,d font,Cp color,Cp font,%
@@ -218,15 +288,28 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\def\pgfPT@draw[#1]{%
\@pgfPT@setlayers%
\tikz[every node/.append style={inner sep=0pt,below right}]{%
+% changing defaults for Chinese -> new in v2.1.5
+\ifnum\pgfPT@fontspec=1\relax% fontspec is loaded
+\ifx\pgfPT@lang@zh\undefined\relax% other languages
+\else% Chinese
+\let\pgfPTnamefont\footnotesize\relax\let\pgfPTCSfont\large\relax\let\pgfPTtitlefont\LARGE\relax%
+\ifpgfPT@zhnumbers@Z\relax\else\let\pgfPTZfont\scriptsize\relax\edef\@pgf@zhZspace{0ex}\let\pgfPTZspace\@pgf@zhZspace\relax\fi%
+\fi\fi%
\pgfkeys{/pgfPerTable/.cd,#1}%
% setting the font
\ifnum\pgfPT@fontspec=1\relax% fontspec is loaded
-\edef\pgfPT@defaultfont{phv}%
-\ifx\pgfPTglobalfont\pgfPT@defaultfont\relax\edef\pgfPTglobalfont{TeX Gyre Heros}\fi% replacing 'phv' by 'TeX Gyre Heros'
-\setmainfont{\pgfPTglobalfont}%
-\ifx\NoAutoSpacing\undefined\relax\else\NoAutoSpacing\fi% XeLaTeX/LuaLaTeX -> removing «extra space» before ':' for babel:french
+ \edef\pgfPT@defaultfont{phv}%
+ \ifx\pgfPT@lang@zh\undefined\relax% other languages -> new if in v2.1.5
+ \ifx\pgfPTglobalfont\pgfPT@defaultfont\relax\edef\pgfPTglobalfont{TeX Gyre Heros}\fi% replacing 'phv' by 'TeX Gyre Heros'
+ \setmainfont{\pgfPTglobalfont}%
+ \ifx\NoAutoSpacing\undefined\relax\else\NoAutoSpacing\fi% XeLaTeX/LuaLaTeX -> removing «extra space» before ':' for babel:french
+ \else% Chinese -> new in v2.1.5
+ \ifx\pgfPTglobalfont\pgfPT@defaultfont\relax\edef\pgfPTglobalfont{BabelStoneHan.ttf}\fi% replacing 'phv' by 'BabelStone Han'
+ \setmainfont[\pgfPT@zhFontFeatures]{\pgfPTglobalfont}%
+ \fi% Chinese
\else% fontenc is loaded (with T1 option)
\fontfamily{\pgfPTglobalfont}\selectfont\renewcommand*\rmdefault{\pgfPTglobalfont}\fi%
+%
\edef\pgfPT@doc@fsize{\f@size}%
\input{pgfPT.coordinates.tex}%
% loading the cell style
@@ -297,6 +380,15 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\savebox{\pgfPT@radiobox}{\includegraphics[height=\pgfPT@dima]{pgfPT_radio_symbol.pdf}}
% computing and defining the font size for standard atomic weight ----->
\ifpgfPT@Arstar\pgfPTArfont\selectfont\pgfmathsetlength{\pgfPT@dimb}{.825*\f@size}\relax\fi%
+% shifts for Z, if in the corners of the cell
+\newdimen\pgfPT@tmpwd\pgfmathsetlength{\pgfPT@tmpwd}{\pgfPTcellwd}%
+\newdimen\pgfPT@tmpht\pgfmathsetlength{\pgfPT@tmpht}{\pgfPTcellht}%
+\ifx\pgfPT@data@Z@x\undefined\relax\else%
+\ifdim\pgfPT@data@Z@x=0pt\relax\xdef\@pgfPT@Zxshift{\pgfPTcelllinewd}\fi%
+\ifdim\pgfPT@data@Z@x=\pgfPT@tmpwd\relax\xdef\@pgfPT@Zxshift{-\pgfPTcelllinewd}\fi%
+\ifdim\pgfPT@data@Z@y=0pt\relax\xdef\@pgfPT@Zyshift{\pgfPTcelllinewd}\fi%
+\ifdim\pgfPT@data@Z@y=\pgfPT@tmpht\relax\xdef\@pgfPT@Zyshift{-\pgfPTcelllinewd}\fi%
+\fi%
% drawing the cells of lanthanides and actinides ----->
\ifpgfPTIUPACMMIX%
\global\pgfPT@drawLaAcfalse%
@@ -320,35 +412,36 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifpgfPT@Z
\ifpgfZuseboxwidth{\pgfPTZfont\pgfPTnumberfont%
\ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
- \pgfmathparse{width("\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \pgfmathparse{width("\pgfPT@printnum{57}\ -\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
\ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax%
\pgfmathparse{\pgfPT@data@Z@wd-2*\pgfPTZspace-.3333em}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
\node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
- at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}}\hspace{\pgfPTZspace}\vfil}};%
+ at ([xshift=.5*\@pgfPT@Zxshift,yshift=-.5*\@pgfPT@Zyshift]xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{57}\ -\ \pgfPT@printnum{71}}\hspace{\pgfPTZspace}\vfil}};%
\else%
\node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
- at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}\hspace{\pgfPTZspace}\vfil}};%
+ at ([xshift=.5*\@pgfPT@Zxshift,yshift=-.5*\@pgfPT@Zyshift]xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{57}\ -\ \pgfPT@printnum{71}\hspace{\pgfPTZspace}\vfil}};%
\fi%
\else\let\pgfPT@printnum\relax%
\node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
- at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{57--71}\hspace{\pgfPTZspace}\vfil}};%
+ at ([xshift=.5*\@pgfPT@Zxshift,yshift=-.5*\@pgfPT@Zyshift]xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{57--71}\hspace{\pgfPTZspace}\vfil}};%
\fi%
}%
\else{%
\ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
- \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
- \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}%
+ \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{57}\ -\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}\edef\pgfPT@zh@scale{1}% \pgfPT@zh@scale -> new in v2.1.5 to scale the Z background in Chinese without zhnumbers
\pgfmathparse{\pgfPT@data@Z@wd-1ex}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}\else\edef\@pgfPT@resizebox{0}\fi%
\else\let\pgfPT@printnum\relax%
\pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifx\pgfPT@lang@zh\undefined\relax\edef\pgfPT@zh@scale{1}\else\edef\pgfPT@zh@scale{.8}\fi%
\fi%
- \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]%
- at (xLa) {%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width={\pgfPT@zh@scale*\pgfPT@data@Z@natwd},inner xsep=.5ex]%
+ at ([xshift=.5*\@pgfPT@Zxshift,yshift=-.5*\@pgfPT@Zyshift]xLa) {%
\ifpgfPT@zhnumbers@Z%
\ifnum\@pgfPT@resizebox=1\relax%
- \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}}\vfil}%
+ \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{57}\ -\ \pgfPT@printnum{71}}\vfil}%
\else%
- \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}\vfil}%
+ \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{57}\ -\ \pgfPT@printnum{71}\vfil}%
\fi%
\else%
\vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{57--71}\vfil}%
@@ -391,35 +484,36 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifpgfPT@Z%
\ifpgfZuseboxwidth{\pgfPTZfont\pgfPTnumberfont%
\ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
- \pgfmathparse{width("\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \pgfmathparse{width("\pgfPT@printnum{89}\ -\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
\ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax%
\pgfmathparse{\pgfPT@data@Z@wd-2*\pgfPTZspace-.3333em}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
\node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
- at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}}\hspace{\pgfPTZspace}\vfil}};%
+ at ([xshift=.5*\@pgfPT@Zxshift,yshift=-.5*\@pgfPT@Zyshift]xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{89}\ -\ \pgfPT@printnum{103}}\hspace{\pgfPTZspace}\vfil}};%
\else%
\node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
- at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}\hspace{\pgfPTZspace}\vfil}};%
+ at ([xshift=.5*\@pgfPT@Zxshift,yshift=-.5*\@pgfPT@Zyshift]xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{89}\ -\ \pgfPT@printnum{103}\hspace{\pgfPTZspace}\vfil}};%
\fi%
\else\let\pgfPT@printnum\relax%
\node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
- at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{89--103}\hspace{\pgfPTZspace}\vfil}};%
+ at ([xshift=.5*\@pgfPT@Zxshift,yshift=-.5*\@pgfPT@Zyshift]xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{89--103}\hspace{\pgfPTZspace}\vfil}};%
\fi%
}%
\else{%
\ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
- \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
- \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}%
+ \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{89}\ -\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}\edef\pgfPT@zh@scale{1}%
\pgfmathparse{\pgfPT@data@Z@wd-1ex}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}\else\edef\@pgfPT@resizebox{0}\fi%
\else\let\pgfPT@printnum\relax%
\pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifx\pgfPT@lang@zh\undefined\relax\edef\pgfPT@zh@scale{1}\else\edef\pgfPT@zh@scale{.85}\fi%
\fi%
- \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]%
- at (xAc) {%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width={\pgfPT@zh@scale*\pgfPT@data@Z@natwd},inner xsep=.5ex]%
+ at ([xshift=.5*\@pgfPT@Zxshift,yshift=-.5*\@pgfPT@Zyshift]xAc) {%
\ifpgfPT@zhnumbers@Z%
\ifnum\@pgfPT@resizebox=1\relax%
- \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}}\vfil}%
+ \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{89}\ -\ \pgfPT@printnum{103}}\vfil}%
\else%
- \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}\vfil}%
+ \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{89}\ -\ \pgfPT@printnum{103}\vfil}%
\fi%
\else%
\vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{89--103}\vfil}%
@@ -447,15 +541,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\edef\pgfPT@teststra{lanthanoids}\ifx\pgfPT@teststra\pgfPT@teststrb\pgfPT@drawLaAcfalse\xdef\pgfPT@@cellslist{\pgfPT@cells@La}\fi%
\edef\pgfPT@teststra{actinoids}\ifx\pgfPT@teststra\pgfPT@teststrb\pgfPT@drawLaAcfalse\xdef\pgfPT@@cellslist{\pgfPT@cells@Ac}\fi%
\fi%
-% shifts for Z, if in the corners of the cell
-\newdimen\pgfPT@tmpwd\pgfmathsetlength{\pgfPT@tmpwd}{\pgfPTcellwd}%
-\newdimen\pgfPT@tmpht\pgfmathsetlength{\pgfPT@tmpht}{\pgfPTcellht}%
-\ifx\pgfPT@data@Z@x\undefined\relax\else%
-\ifdim\pgfPT@data@Z@x=0pt\relax\xdef\@pgfPT@Zxshift{\pgfPTcelllinewd}\fi%
-\ifdim\pgfPT@data@Z@x=\pgfPT@tmpwd\relax\xdef\@pgfPT@Zxshift{-\pgfPTcelllinewd}\fi%
-\ifdim\pgfPT@data@Z@y=0pt\relax\xdef\@pgfPT@Zyshift{\pgfPTcelllinewd}\fi%
-\ifdim\pgfPT@data@Z@y=\pgfPT@tmpht\relax\xdef\@pgfPT@Zyshift{-\pgfPTcelllinewd}\fi%
-\fi%
% drawing the cells of the Periodic Table ----->
\foreach \Z in \pgfPT@@cellslist {%
\ifpgfPTis@backcolorsolid\relax\else\pgfPT@processbackcolor{\Z}\fi%
@@ -560,16 +645,17 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifpgfPT@Ar%
\ifnum\pgfPTArprecision<0\relax%
\node[font=\pgfPTArfont,text=\pgfPTArcolor,text width=\pgfPT@data@Ar@wd,text centered]%
- at ([xshift=\pgfPT@data@Ar@x,yshift=-\pgfPT@data@Ar@y]\Z) {\vbox to\pgfPT@data@Ar@ht{\vfil\pgfPT@box@zerodepth{\pgfPT@data@Ar}\vfil}};%
+ at ([xshift=\pgfPT@data@Ar@x,yshift=-\pgfPT@data@Ar@y]\Z) {\vbox to\pgfPT@data@Ar@ht{\vfil\pgfPT@box@zerodepth{\pgfPT@formatnumber{-1}{\pgfPT@data@Ar}}\vfil}};% changed in v2.1.5
\else\ifnum\pgfPTArprecision>3\relax%
\node[font=\pgfPTArfont,text=\pgfPTArcolor,text width=\pgfPT@data@Ar@wd,text centered]%
- at ([xshift=\pgfPT@data@Ar@x,yshift=-\pgfPT@data@Ar@y]\Z) {\vbox to\pgfPT@data@Ar@ht{\vfil\pgfPT@box@zerodepth{\pgfPT@data@Ar}\vfil}};%
+ at ([xshift=\pgfPT@data@Ar@x,yshift=-\pgfPT@data@Ar@y]\Z) {\vbox to\pgfPT@data@Ar@ht{\vfil\pgfPT@box@zerodepth{\pgfPT@formatnumber{-1}{\pgfPT@data@Ar}}\vfil}};% % changed in v2.1.5
\else%
\node[font=\pgfPTArfont,text=\pgfPTArcolor,text width=\pgfPT@data@Ar@wd,text centered]%
at ([xshift=\pgfPT@data@Ar@x,yshift=-\pgfPT@data@Ar@y]\Z) {\vbox to\pgfPT@data@Ar@ht{\vfil\pgfPT@box@zerodepth{\pgfPT@formatnumber{\pgfPTArprecision}{\pgfPT@data@Ar}}\vfil}};%
\fi\fi%\fi%
\fi%
- \ifpgfPT@Arstar%
+ \ifpgfPT@Arstar% changed in v2.1.5
+ \ifx\pgfPTdecimalseparator\pgfPT@dot\relax%
\node[font=\pgfPTArfont,%
text=\pgfPTArcolor,text width=\pgfPT@data@Arstar@wd,text centered]%
at ([xshift=\pgfPT@data@Arstar@x,yshift=-\pgfPT@data@Arstar@y]\Z) %
@@ -577,6 +663,15 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\vbox to\pgfPT@data@Arstar@ht{\vfil\resizebox{.95\textwidth}{!}{\pgfPT@box@zerodepth{\pgfPT@data@Arstar}}\vfil}%
\else\vbox to\pgfPT@data@Arstar@ht{\vfil\pgfPT@box@zerodepth{\pgfPT@data@Arstar}\vfil}\fi%
};%
+ \else% replace . in value1/2 by user decimal separator and the , by ; in [value1,value2] if it is the case
+ \node[font=\pgfPTArfont,%
+ text=\pgfPTArcolor,text width=\pgfPT@data@Arstar@wd,text centered]%
+ at ([xshift=\pgfPT@data@Arstar@x,yshift=-\pgfPT@data@Arstar@y]\Z) %
+ {\setbox0=\hbox{\expandafter\pgfPT@formatArstar\pgfPT@data@Arstar\relax}\ifdim\wd0>.95\textwidth\relax%
+ \vbox to\pgfPT@data@Arstar@ht{\vfil\resizebox{.95\textwidth}{!}{\pgfPT@box@zerodepth{\usebox0}}\vfil}%
+ \else\vbox to\pgfPT@data@Arstar@ht{\vfil\pgfPT@box@zerodepth{\usebox0}\vfil}\fi%
+ };%
+ \fi%
\fi%
% radioactivity
\ifpgfPT@radio\relax\ifnum\pgfPT@data@radio=1\relax%
@@ -633,10 +728,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifpgfPT@Ei\relax%
\ifnum\pgfPTEprecision<0\relax%
\node[font=\pgfPTEifont,text=\pgfPTEicolor,text width=\pgfPT@data@Ei@wd,text centered]%
- at ([xshift=\pgfPT@data@Ei@x,yshift=-\pgfPT@data@Ei@y]\Z) {\vbox to\pgfPT@data@Ei@ht{\vfil\pgfPT@data@Ei\vfil}};%
- \else\ifnum\pgfPTEprecision>2\relax%
+ at ([xshift=\pgfPT@data@Ei@x,yshift=-\pgfPT@data@Ei@y]\Z) {\vbox to\pgfPT@data@Ei@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@Ei}\vfil}};% changed in v2.1.5
+ \else\ifnum\pgfPTEprecision>2\relax%0
\node[font=\pgfPTEifont,text=\pgfPTEicolor,text width=\pgfPT@data@Ei@wd,text centered]%
- at ([xshift=\pgfPT@data@Ei@x,yshift=-\pgfPT@data@Ei@y]\Z) {\vbox to\pgfPT@data@Ei@ht{\vfil\pgfPT@data@Ei\vfil}};%
+ at ([xshift=\pgfPT@data@Ei@x,yshift=-\pgfPT@data@Ei@y]\Z) {\vbox to\pgfPT@data@Ei@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@Ei}\vfil}};% changed in v2.1.5
\else%
\node[font=\pgfPTEifont,text=\pgfPTEicolor,text width=\pgfPT@data@Ei@wd,text centered]%
at ([xshift=\pgfPT@data@Ei@x,yshift=-\pgfPT@data@Ei@y]\Z) {\vbox to\pgfPT@data@Ei@ht{\vfil\pgfPT@formatnumber{\pgfPTEprecision}{\pgfPT@data@Ei}\vfil}};%
@@ -651,10 +746,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifpgfPT@eaff\relax%
\ifnum\pgfPTEprecision<0\relax%
\node[font=\pgfPTeafffont,text=\pgfPTeaffcolor,text width=\pgfPT@data@eaff@wd,text centered]%
- at ([xshift=\pgfPT@data@eaff@x,yshift=-\pgfPT@data@eaff@y]\Z) {\vbox to\pgfPT@data@eaff@ht{\vfil\pgfPT@data@eaff\vfil}};%
+ at ([xshift=\pgfPT@data@eaff@x,yshift=-\pgfPT@data@eaff@y]\Z) {\vbox to\pgfPT@data@eaff@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@eaff}\vfil}};% changed in v2.1.5
\else\ifnum\pgfPTEprecision>1\relax%
\node[font=\pgfPTeafffont,text=\pgfPTeaffcolor,text width=\pgfPT@data@eaff@wd,text centered]%
- at ([xshift=\pgfPT@data@eaff@x,yshift=-\pgfPT@data@eaff@y]\Z) {\vbox to\pgfPT@data@eaff@ht{\vfil\pgfPT@data@eaff\vfil}};%
+ at ([xshift=\pgfPT@data@eaff@x,yshift=-\pgfPT@data@eaff@y]\Z) {\vbox to\pgfPT@data@eaff@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@eaff}\vfil}};% changed in v2.1.5
\else%
\node[font=\pgfPTeafffont,text=\pgfPTeaffcolor,text width=\pgfPT@data@eaff@wd,text centered]%
at ([xshift=\pgfPT@data@eaff@x,yshift=-\pgfPT@data@eaff@y]\Z) {\vbox to\pgfPT@data@eaff@ht{\vfil\pgfPT@formatnumber{\pgfPTEprecision}{\pgfPT@data@eaff}\vfil}};%
@@ -689,19 +784,19 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
at ([xshift=\pgfPT@data@Tmelt@x,yshift=-\pgfPT@data@Tmelt@y]\Z) {%
\setbox0=\hbox{\pgfPT@data@Tmelt}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
\ifdim\pgfPT@dima>.975\linewidth\relax%
- \vbox to\pgfPT@data@Tmelt@ht{\vfil\resizebox{.95\linewidth}{\height}{\pgfPT@data@Tmelt}\vfil}%
+ \vbox to\pgfPT@data@Tmelt@ht{\vfil\resizebox{.95\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@Tmelt}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@Tmelt@ht{\vfil\pgfPT@data@Tmelt\vfil}%
+ \vbox to\pgfPT@data@Tmelt@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@Tmelt}\vfil}% changed in v2.1.5
\fi%
};%
\else\ifnum\pgfPTTprecision>4\relax%
\node[font=\pgfPTTmeltfont,text=\pgfPTTmeltcolor,text width=\pgfPT@data@Tmelt@wd,text centered]%
at ([xshift=\pgfPT@data@Tmelt@x,yshift=-\pgfPT@data@Tmelt@y]\Z) {
- \setbox0=\hbox{\pgfPT@data@Tmelt}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@Tmelt}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.975\linewidth\relax%
- \vbox to\pgfPT@data@Tmelt@ht{\vfil\resizebox{.95\linewidth}{\height}{\pgfPT@data@Tmelt}\vfil}%
+ \vbox to\pgfPT@data@Tmelt@ht{\vfil\resizebox{.95\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@Tmelt}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@Tmelt@ht{\vfil\pgfPT@data@Tmelt\vfil}%
+ \vbox to\pgfPT@data@Tmelt@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@Tmelt}\vfil}% changed in v2.1.5
\fi%
};%
\else%
@@ -721,21 +816,21 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifnum\pgfPTTprecision<0\relax%
\node[font=\pgfPTTmeltCfont,text=\pgfPTTmeltCcolor,text width=\pgfPT@data@TmeltC@wd,text centered]%
at ([xshift=\pgfPT@data@TmeltC@x,yshift=-\pgfPT@data@TmeltC@y]\Z) {%
- \setbox0=\hbox{\pgfPT@data@TmeltC}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@TmeltC}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.95\linewidth\relax%
- \vbox to\pgfPT@data@TmeltC@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@data@TmeltC}\vfil}%
+ \vbox to\pgfPT@data@TmeltC@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@TmeltC}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@TmeltC@ht{\vfil\pgfPT@data@TmeltC\vfil}%
+ \vbox to\pgfPT@data@TmeltC@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@TmeltC}\vfil}% changed in v2.1.5
\fi%
};%
\else\ifnum\pgfPTTprecision>4\relax%
\node[font=\pgfPTTmeltCfont,text=\pgfPTTmeltCcolor,text width=\pgfPT@data@TmeltC@wd,text centered]%
at ([xshift=\pgfPT@data@TmeltC@x,yshift=-\pgfPT@data@TmeltC@y]\Z) {%
- \setbox0=\hbox{\pgfPT@data@TmeltC}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@TmeltC}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.95\linewidth\relax%
- \vbox to\pgfPT@data@TmeltC@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@data@TmeltC}\vfil}%
+ \vbox to\pgfPT@data@TmeltC@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@TmeltC}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@TmeltC@ht{\vfil\pgfPT@data@TmeltC\vfil}%
+ \vbox to\pgfPT@data@TmeltC@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@TmeltC}\vfil}% changed in v2.1.5
\fi%
};%
\else%
@@ -755,21 +850,21 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifnum\pgfPTTprecision<0\relax%
\node[font=\pgfPTTboilfont,text=\pgfPTTboilcolor,text width=\pgfPT@data@Tboil@wd,text centered]%
at ([xshift=\pgfPT@data@Tboil@x,yshift=-\pgfPT@data@Tboil@y]\Z) {%
- \setbox0=\hbox{\pgfPT@data@Tboil}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@Tboil}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.95\linewidth\relax%
- \vbox to\pgfPT@data@Tboil@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@data@Tboil}\vfil}%
+ \vbox to\pgfPT@data@Tboil@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@Tboil}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@Tboil@ht{\vfil\pgfPT@data@Tboil\vfil}%
+ \vbox to\pgfPT@data@Tboil@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@Tboil}\vfil}% changed in v2.1.5
\fi%
};%
\else\ifnum\pgfPTTprecision>2\relax%
\node[font=\pgfPTTboilfont,text=\pgfPTTboilcolor,text width=\pgfPT@data@Tboil@wd,text centered]%
at ([xshift=\pgfPT@data@Tboil@x,yshift=-\pgfPT@data@Tboil@y]\Z) {%
- \setbox0=\hbox{\pgfPT@data@Tboil}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@Tboil}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.95\linewidth\relax%
- \vbox to\pgfPT@data@Tboil@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@data@Tboil}\vfil}%
+ \vbox to\pgfPT@data@Tboil@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@Tboil}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@Tboil@ht{\vfil\pgfPT@data@Tboil\vfil}%
+ \vbox to\pgfPT@data@Tboil@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@Tboil}\vfil}% changed in v2.1.5
\fi%
};%
\else%
@@ -789,21 +884,21 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifnum\pgfPTTprecision<0\relax%
\node[font=\pgfPTTboilCfont,text=\pgfPTTboilCcolor,text width=\pgfPT@data@TboilC@wd,text centered]%
at ([xshift=\pgfPT@data@TboilC@x,yshift=-\pgfPT@data@TboilC@y]\Z) {%
- \setbox0=\hbox{\pgfPT@data@TboilC}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@TboilC}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.95\linewidth\relax%
- \vbox to\pgfPT@data@TboilC@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@data@TboilC}\vfil}%
+ \vbox to\pgfPT@data@TboilC@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@TboilC}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@TboilC@ht{\vfil\pgfPT@data@TboilC\vfil}%
+ \vbox to\pgfPT@data@TboilC@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@TboilC}\vfil}% changed in v2.1.5
\fi%
};%
\else\ifnum\pgfPTTprecision>2\relax%
\node[font=\pgfPTTboilCfont,text=\pgfPTTboilCcolor,text width=\pgfPT@data@TboilC@wd,text centered]%
at ([xshift=\pgfPT@data@TboilC@x,yshift=-\pgfPT@data@TboilC@y]\Z) {%
- \setbox0=\hbox{\pgfPT@data@TboilC}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@TboilC}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.95\linewidth\relax%
- \vbox to\pgfPT@data@TboilC@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@data@TboilC}\vfil}%
+ \vbox to\pgfPT@data@TboilC@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@TboilC}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@TboilC@ht{\vfil\pgfPT@data@TboilC\vfil}%
+ \vbox to\pgfPT@data@TboilC@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@TboilC}\vfil}% changed in v2.1.5
\fi%
};%
\else%
@@ -837,21 +932,21 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifnum\pgfPTdprecision<0\relax%
\node[font=\pgfPTdfont,text=\pgfPTdcolor,text width=\pgfPT@data@d@wd,text centered]%
at ([xshift=\pgfPT@data@d@x,yshift=-\pgfPT@data@d@y]\Z) {%
- \setbox0=\hbox{\pgfPT@data@d}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@d}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.95\linewidth\relax%
- \vbox to\pgfPT@data@d@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@data@d}\vfil}%
+ \vbox to\pgfPT@data@d@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@d}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@d@ht{\vfil\pgfPT@data@d\vfil}%
+ \vbox to\pgfPT@data@d@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@d}\vfil}% changed in v2.1.5
\fi%
};%
\else\ifnum\pgfPTdprecision>\pgfPT@maxprecision\relax%
\node[font=\pgfPTdfont,text=\pgfPTdcolor,text width=\pgfPT@data@d@wd,text centered]%
at ([xshift=\pgfPT@data@d@x,yshift=-\pgfPT@data@d@y]\Z) {%
- \setbox0=\hbox{\pgfPT@data@d}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@d}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.95\linewidth\relax%
- \vbox to\pgfPT@data@d@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@data@d}\vfil}%
+ \vbox to\pgfPT@data@d@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@d}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@d@ht{\vfil\pgfPT@data@d\vfil}%
+ \vbox to\pgfPT@data@d@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@d}\vfil}% changed in v2.1.5
\fi%
};%
\else%
@@ -870,10 +965,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifpgfPT@Cp\relax%
\ifnum\pgfPTCpprecision<0\relax%
\node[font=\pgfPTCpfont,text=\pgfPTCpcolor,text width=\pgfPT@data@Cp@wd,text centered]%
- at ([xshift=\pgfPT@data@Cp@x,yshift=-\pgfPT@data@Cp@y]\Z) {\vbox to\pgfPT@data@Cp@ht{\vfil\pgfPT@data@Cp\vfil}};%
+ at ([xshift=\pgfPT@data@Cp@x,yshift=-\pgfPT@data@Cp@y]\Z) {\vbox to\pgfPT@data@Cp@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@Cp}\vfil}};% changed in v2.1.5
\else\ifnum\pgfPTCpprecision>2\relax%
\node[font=\pgfPTCpfont,text=\pgfPTCpcolor,text width=\pgfPT@data@Cp@wd,text centered]%
- at ([xshift=\pgfPT@data@Cp@x,yshift=-\pgfPT@data@Cp@y]\Z) {\vbox to\pgfPT@data@Cp@ht{\vfil\pgfPT@data@Cp\vfil}};%
+ at ([xshift=\pgfPT@data@Cp@x,yshift=-\pgfPT@data@Cp@y]\Z) {\vbox to\pgfPT@data@Cp@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@Cp}\vfil}};% changed in v2.1.5
\else%
\node[font=\pgfPTCpfont,text=\pgfPTCpcolor,text width=\pgfPT@data@Cp@wd,text centered]%
at ([xshift=\pgfPT@data@Cp@x,yshift=-\pgfPT@data@Cp@y]\Z) {\vbox to\pgfPT@data@Cp@ht{\vfil\pgfPT@formatnumber{\pgfPTCpprecision}{\pgfPT@data@Cp}\vfil}};%
@@ -884,21 +979,21 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifnum\pgfPTkTprecision<0\relax%
\node[font=\pgfPTkTfont,text=\pgfPTkTcolor,text width=\pgfPT@data@kT@wd,text centered]%
at ([xshift=\pgfPT@data@kT@x,yshift=-\pgfPT@data@kT@y]\Z) {%
- \setbox0=\hbox{\pgfPT@data@kT}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@kT}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.95\linewidth\relax%
- \vbox to\pgfPT@data@kT@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@data@kT}\vfil}%
+ \vbox to\pgfPT@data@kT@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@kT}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@kT@ht{\vfil\pgfPT@data@kT\vfil}%
+ \vbox to\pgfPT@data@kT@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@kT}\vfil}% changed in v2.1.5
\fi%
};%
\else\ifnum\pgfPTkTprecision>4\relax%
\node[font=\pgfPTkTfont,text=\pgfPTkTcolor,text width=\pgfPT@data@kT@wd,text centered]%
at ([xshift=\pgfPT@data@kT@x,yshift=-\pgfPT@data@kT@y]\Z) {%
- \setbox0=\hbox{\pgfPT@data@kT}\pgfmathsetlength{\pgfPT@dima}{\wd0}%
+ \setbox0=\hbox{\pgfPT@formatnumber{-1}{\pgfPT@data@kT}}\pgfmathsetlength{\pgfPT@dima}{\wd0}% changed in v2.1.5
\ifdim\pgfPT@dima>.95\linewidth\relax%
- \vbox to\pgfPT@data@kT@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@data@kT}\vfil}%
+ \vbox to\pgfPT@data@kT@ht{\vfil\resizebox{.925\linewidth}{\height}{\pgfPT@formatnumber{-1}{\pgfPT@data@kT}}\vfil}% changed in v2.1.5
\else%
- \vbox to\pgfPT@data@kT@ht{\vfil\pgfPT@data@kT\vfil}%
+ \vbox to\pgfPT@data@kT@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@kT}\vfil}% changed in v2.1.5
\fi%
};%
\else%
@@ -950,10 +1045,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
\ifnum\pgfPTlsprecision<0\relax%
\node[font=\pgfPTlsafont,text=\pgfPTlsacolor,text width=\pgfPT@data@lsa@wd,text centered]%
- at ([xshift=\pgfPT@data@lsa@x,yshift=-\pgfPT@data@lsa@y]\Z) {\vbox to\pgfPT@data@lsa@ht{\vfil\pgfPT@data@lsa\vfil}};%
+ at ([xshift=\pgfPT@data@lsa@x,yshift=-\pgfPT@data@lsa@y]\Z) {\vbox to\pgfPT@data@lsa@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@lsa}\vfil}};% changed in v2.1.5
\else\ifnum\pgfPTlsprecision>\pgfPT@maxprecision\relax%
\node[font=\pgfPTlsafont,text=\pgfPTlsacolor,text width=\pgfPT@data@lsa@wd,text centered]%
- at ([xshift=\pgfPT@data@lsa@x,yshift=-\pgfPT@data@lsa@y]\Z) {\vbox to\pgfPT@data@lsa@ht{\vfil\pgfPT@data@lsa\vfil}};%
+ at ([xshift=\pgfPT@data@lsa@x,yshift=-\pgfPT@data@lsa@y]\Z) {\vbox to\pgfPT@data@lsa@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@lsa}\vfil}};% changed in v2.1.5
\else%
\node[font=\pgfPTlsafont,text=\pgfPTlsacolor,text width=\pgfPT@data@lsa@wd,text centered]%
at ([xshift=\pgfPT@data@lsa@x,yshift=-\pgfPT@data@lsa@y]\Z) {\vbox to\pgfPT@data@lsa@ht{\vfil\pgfPT@formatnumber{\pgfPTlsprecision}{\pgfPT@data@lsa}\vfil}};%
@@ -968,10 +1063,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
\ifnum\pgfPTlsprecision<0\relax%
\node[font=\pgfPTlsbfont,text=\pgfPTlsbcolor,text width=\pgfPT@data@lsb@wd,text centered]%
- at ([xshift=\pgfPT@data@lsb@x,yshift=-\pgfPT@data@lsb@y]\Z) {\vbox to\pgfPT@data@lsb@ht{\vfil\pgfPT@data@lsb\vfil}};%
+ at ([xshift=\pgfPT@data@lsb@x,yshift=-\pgfPT@data@lsb@y]\Z) {\vbox to\pgfPT@data@lsb@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@lsb}\vfil}};% changed in v2.1.5
\else\ifnum\pgfPTlsprecision>\pgfPT@maxprecision\relax%
\node[font=\pgfPTlsbfont,text=\pgfPTlsbcolor,text width=\pgfPT@data@lsb@wd,text centered]%
- at ([xshift=\pgfPT@data@lsb@x,yshift=-\pgfPT@data@lsb@y]\Z) {\vbox to\pgfPT@data@lsb@ht{\vfil\pgfPT@data@lsb\vfil}};%
+ at ([xshift=\pgfPT@data@lsb@x,yshift=-\pgfPT@data@lsb@y]\Z) {\vbox to\pgfPT@data@lsb@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@lsb}\vfil}};% changed in v2.1.5
\else%
\node[font=\pgfPTlsbfont,text=\pgfPTlsbcolor,text width=\pgfPT@data@lsb@wd,text centered]%
at ([xshift=\pgfPT@data@lsb@x,yshift=-\pgfPT@data@lsb@y]\Z) {\vbox to\pgfPT@data@lsb@ht{\vfil\pgfPT@formatnumber{\pgfPTlsprecision}{\pgfPT@data@lsb}\vfil}};%
@@ -986,10 +1081,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
\ifnum\pgfPTlsprecision<0\relax%
\node[font=\pgfPTlscfont,text=\pgfPTlsccolor,text width=\pgfPT@data@lsc@wd,text centered]%
- at ([xshift=\pgfPT@data@lsc@x,yshift=-\pgfPT@data@lsc@y]\Z) {\vbox to\pgfPT@data@lsc@ht{\vfil\pgfPT@data@lsc\vfil}};%
+ at ([xshift=\pgfPT@data@lsc@x,yshift=-\pgfPT@data@lsc@y]\Z) {\vbox to\pgfPT@data@lsc@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@lsc}\vfil}};% changed in v2.1.5
\else\ifnum\pgfPTlsprecision>\pgfPT@maxprecision\relax%
\node[font=\pgfPTlscfont,text=\pgfPTlsccolor,text width=\pgfPT@data@lsc@wd,text centered]%
- at ([xshift=\pgfPT@data@lsc@x,yshift=-\pgfPT@data@lsc@y]\Z) {\vbox to\pgfPT@data@lsc@ht{\vfil\pgfPT@data@lsc\vfil}};%
+ at ([xshift=\pgfPT@data@lsc@x,yshift=-\pgfPT@data@lsc@y]\Z) {\vbox to\pgfPT@data@lsc@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@lsc}\vfil}};% changed in v2.1.5
\else%
\node[font=\pgfPTlscfont,text=\pgfPTlsccolor,text width=\pgfPT@data@lsc@wd,text centered]%
at ([xshift=\pgfPT@data@lsc@x,yshift=-\pgfPT@data@lsc@y]\Z) {\vbox to\pgfPT@data@lsc@ht{\vfil\pgfPT@formatnumber{\pgfPTlsprecision}{\pgfPT@data@lsc}\vfil}};%
@@ -999,10 +1094,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifpgfPT@lsca\relax%
\ifnum\pgfPTlsprecision<0\relax%
\node[font=\pgfPTlscafont,text=\pgfPTlscacolor,text width=\pgfPT@data@lsca@wd,text centered]%
- at ([xshift=\pgfPT@data@lsca@x,yshift=-\pgfPT@data@lsca@y]\Z) {\vbox to\pgfPT@data@lsca@ht{\vfil\pgfPT@data@lsca\vfil}};%
+ at ([xshift=\pgfPT@data@lsca@x,yshift=-\pgfPT@data@lsca@y]\Z) {\vbox to\pgfPT@data@lsca@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@lsca}\vfil}};% changed in v2.1.5
\else\ifnum\pgfPTlsprecision>1\relax%
\node[font=\pgfPTlscafont,text=\pgfPTlscacolor,text width=\pgfPT@data@lsca@wd,text centered]%
- at ([xshift=\pgfPT@data@lsca@x,yshift=-\pgfPT@data@lsca@y]\Z) {\vbox to\pgfPT@data@lsca@ht{\vfil\pgfPT@data@lsca\vfil}};%
+ at ([xshift=\pgfPT@data@lsca@x,yshift=-\pgfPT@data@lsca@y]\Z) {\vbox to\pgfPT@data@lsca@ht{\vfil\pgfPT@formatnumber{-1}{\pgfPT@data@lsca}\vfil}};% changed in v2.1.5
\else%
\node[font=\pgfPTlscafont,text=\pgfPTlscacolor,text width=\pgfPT@data@lsca@wd,text centered]%
at ([xshift=\pgfPT@data@lsca@x,yshift=-\pgfPT@data@lsca@y]\Z) {\vbox to\pgfPT@data@lsca@ht{\vfil\pgfPT@formatnumber{\pgfPTlsprecision}{\pgfPT@data@lsca}\vfil}};%
@@ -1025,6 +1120,86 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
}% end foreach \Z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% new in v2.1.5
+% process the empty list
+\ifpgfPT@Zliststar%
+\ifx\pgfPT@emptycellslist@options\undefined\relax\else%
+\edef\pgfPT@emptycellslist@option@noZ{hide Z}%
+\edef\pgfPT@emptycellslist@option@bc{back color}%
+\def\pgfPT@emptycellslist@option@decompose##1=##2\relax{%
+ \edef\pgfPT@emptycellslist@option@decompose@i{##1}%
+ \edef\pgfPT@emptycellslist@option@decompose@ii{##2}}%
+\@for\@pgfPT@tmp:=\pgfPT@emptycellslist@options\do{%
+ \ifx\@pgfPT@tmp\pgfPT@emptycellslist@option@noZ\relax\edef\pgfPT@emptycellslist@noZ{}%
+ \else%
+ \expandafter\pgfPT@emptycellslist@option@decompose\@pgfPT@tmp\relax%
+ \ifx\pgfPT@emptycellslist@option@decompose@i\pgfPT@emptycellslist@option@bc\relax%
+ \edef\pgfPT@emptycellslist@bc{\pgfPT@emptycellslist@option@decompose@ii}%
+ \else%
+ \PackageError{pgfPT}{Unknown option '\@pgfPT@tmp'. It will be ignored...}{}%
+ \fi%
+ \fi%
+ }%
+\fi%
+\foreach \Z in \pgfPT@@emptycellslist {%
+\ifx\pgfPT@emptycellslist@bc\undefined\relax%
+\ifpgfPTis@backcolorsolid\relax\else\pgfPT@processbackcolor{\Z}\fi%
+\else\colorlet{cpgfPTTMP}{\pgfPT@emptycellslist@bc}%
+\fi%
+ % drawing the cell
+ \draw[fill=cpgfPTTMP,line width=\pgfPTcelllinewd,draw=\pgfPTcelllinecolor] (\Z) rectangle ++(\pgfPTcellwd,-\pgfPTcellht);
+\ifx\pgfPT@emptycellslist@noZ\undefined\relax%
+ % append the Z box
+ \ifpgfPT@Z%
+ \ifpgfZuseboxwidth{\pgfPTZfont\pgfPTnumberfont%
+ \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
+ \pgfmathparse{width("\pgfPT@printnum{\Z}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax%
+ \pgfmathparse{\pgfPT@data@Z@wd-2*\pgfPTZspace-.3333em}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z)
+ {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{\Z}}\hspace{\pgfPTZspace}\vfil}};
+ \else%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z)
+ {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{\Z}\hspace{\pgfPTZspace}\vfil}};
+ \fi%
+ \else\let\pgfPT@printnum\relax%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z)
+ {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{\Z}\hspace{\pgfPTZspace}\vfil}};
+ \fi%
+ }%
+ \else%
+ {%
+ \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
+ \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{\Z}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}%
+ \pgfmathparse{\pgfPT@data@Z@wd-1ex}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}\else\edef\@pgfPT@resizebox{0}\fi%
+ \else\let\pgfPT@printnum\relax%
+ \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{\Z}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \fi%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]%
+ at ([xshift=\pgfPT@data@Z@x+.5*\@pgfPT@Zxshift,yshift=-\pgfPT@data@Z@y-.5*\@pgfPT@Zyshift]\Z) {%
+ \ifpgfPT@zhnumbers@Z%
+ \ifnum\@pgfPT@resizebox=1\relax%
+ \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{\Z}}\vfil}%
+ \else%
+ \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{\Z}\vfil}%
+ \fi%
+ \else%
+ \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{\Z}\vfil}%
+ \fi%
+ };}%
+ \fi%
+ \fi%
+\fi%
+\let\pgfPT@emptycellslist@noZ\undefined\relax%
+\let\pgfPT@emptycellslist@bc\undefined\relax%
+}%
+\pgfPT@Zliststarfalse\edef\pgfPT@@cellslist{\pgfPT@@cellslist,\pgfPT@@emptycellslist}%
+\fi%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifpgfPTexMode%
\expandafter\pgfPT@get@limits\pgfPT@@cellslist\relax%
\pgfmathsetcount{\pgfPT@countc}{\pgfPT@limits@min-1}%
@@ -1055,6 +1230,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
% periods -->
\ifpgfPTperlabels%
\global\pgfPTis@labeldrawnfalse%
+\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\foreach \per in {1,...,7} {%
\edef\pgfPT@@perlist{\csname pgfPT@cells@P\@Roman\per\endcsname}%
\foreach \Zsearch in \pgfPT@@perlist{%
@@ -1197,7 +1373,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
-% groups -->
+% groups --> changed in v2.1.5 to accommodate IUPAC*/CAS* with zhnumbers
\ifpgfPTgrlabels%
\global\pgfPTis@labeldrawnfalse%
\pgfPT@gr@numbers{\pgfPTgrnum}% new in v2.1.1
@@ -1207,13 +1383,15 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\foreach \Zsearch in \pgfPT@@grlist{%
\foreach \Z in \pgfPT@@cellslist {%
\ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
- {\pgfPTlabfont\pgfPTnumberfont\colorlet{pgfPT@grcolor}{\pgfPTlabgrcolor}\ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else%
+ {\pgfPTlabfont\pgfPTnumberfont\colorlet{pgfPT@grcolor}{\pgfPTlabgrcolor}\ifpgfPT@zhnumbers@gr%\let\pgfPT@printnum\zhnumber\else%
+ \ifpgfPT@grRoman\let\pgfPT@printnum\pgfPT@gr@Roman\colorlet{pgfPT@grcolor}{\pgfPTRomanlabgrcolor}\else\let\pgfPT@printnum\zhnumber\fi\else%
\ifpgfPT@grRoman\let\pgfPT@printnum\pgfPT@gr@Roman\colorlet{pgfPT@grcolor}{\pgfPTRomanlabgrcolor}\else\let\pgfPT@printnum\relax\fi\fi%
\node[above,font=\pgfPTlabfont,text=pgfPT@grcolor] at%
([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\pgfPT@printnum{\group}};
\ifpgfPT@grarabic\colorlet{pgfPT@grcolor}{\pgfPTlabgrcolor}%
+ \ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
\node[above,font=\pgfPTlabfont,text=pgfPT@grcolor] at%
- ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift+2ex]\Z) {\group};\fi}%
+ ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift+2ex]\Z) {\pgfPT@printnum{\group}};\fi}%
\breakforeach\fi%
}%
\ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi%
@@ -1223,13 +1401,15 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\foreach \Zsearch in \pgfPT@cells@GIIILaAc{%
\foreach \Z in \pgfPT@@cellslist {%
\ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
- {\pgfPTlabfont\pgfPTnumberfont\colorlet{pgfPT@grcolor}{\pgfPTlabgrcolor}\ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else%
+ {\pgfPTlabfont\pgfPTnumberfont\colorlet{pgfPT@grcolor}{\pgfPTlabgrcolor}\ifpgfPT@zhnumbers@gr%\let\pgfPT@printnum\zhnumber\else%
+ \ifpgfPT@grRoman\let\pgfPT@printnum\pgfPT@gr@Roman\colorlet{pgfPT@grcolor}{\pgfPTRomanlabgrcolor}\else\let\pgfPT@printnum\zhnumber\fi\else%
\ifpgfPT@grRoman\let\pgfPT@printnum\pgfPT@gr@Roman\colorlet{pgfPT@grcolor}{\pgfPTRomanlabgrcolor}\else\let\pgfPT@printnum\relax\fi\fi%
\node[above,font=\pgfPTlabfont,text=pgfPT@grcolor] at%
([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\pgfPT@printnum{3}};
\ifpgfPT@grarabic\colorlet{pgfPT@grcolor}{\pgfPTlabgrcolor}%
+ \ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
\node[above,font=\pgfPTlabfont,text=pgfPT@grcolor] at%
- ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift+2ex]\Z) {3};\fi}%
+ ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift+2ex]\Z) {\pgfPT@printnum{3}};\fi}%
\breakforeach\fi%
}%
\ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi%
@@ -1240,13 +1420,15 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\foreach \Zsearch in \pgfPT@@grlist{%
\foreach \Z in \pgfPT@@cellslist {%
\ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
- {\pgfPTlabfont\pgfPTnumberfont\colorlet{pgfPT@grcolor}{\pgfPTlabgrcolor}\ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else%
+ {\pgfPTlabfont\pgfPTnumberfont\colorlet{pgfPT@grcolor}{\pgfPTlabgrcolor}\ifpgfPT@zhnumbers@gr%
+ \ifpgfPT@grRoman\let\pgfPT@printnum\pgfPT@gr@Roman\colorlet{pgfPT@grcolor}{\pgfPTRomanlabgrcolor}\else\let\pgfPT@printnum\zhnumber\fi\else%
\ifpgfPT@grRoman\let\pgfPT@printnum\pgfPT@gr@Roman\colorlet{pgfPT@grcolor}{\pgfPTRomanlabgrcolor}\else\let\pgfPT@printnum\relax\fi\fi%
\node[above,font=\pgfPTlabfont,text=pgfPT@grcolor] at%
([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\pgfPT@printnum{\group}};%
\ifpgfPT@grarabic\colorlet{pgfPT@grcolor}{\pgfPTlabgrcolor}%
+ \ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
\node[above,font=\pgfPTlabfont,text=pgfPT@grcolor] at%
- ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift+2ex]\Z) {\group};\fi}%
+ ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift+2ex]\Z) {\pgfPT@printnum{\group}};\fi}%
\breakforeach\fi%
}%
\ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi%
@@ -1307,7 +1489,8 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\draw[fill=black!30,line width=.05pt,draw=black!50] (LCS.east) circle(.05*\pgfPTcellwd) ++(.05*\pgfPTcellwd,0) -- ++(\pgfPT@dimc+.35*\pgfPTcellwd,0);
\pgfPTCSfont\selectfont\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.35*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.25*\f@size}
\else\pgfmathsetlength{\pgfPT@dima}{.4*\f@size}\fi%
- \fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax%
+ %\fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax%
+ %\fontsize{\pgfPTlegendacrofontsize}{\pgfPTlegendacrofontsize}\selectfont\relax%
\node[legendpins,%
text width={.7*\pgfPTcellwd+.2*(\pgfPT@countb-1)*\pgfPTcellwd-4pt},font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,inner xsep=2pt,inner ysep=1pt]%
at ([xshift={\pgfPT@dimc+.2*\pgfPTcellwd},yshift={.25*\pgfPT@data@CS@ht}]LCS.east)%
@@ -1678,7 +1861,8 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{\pgfPT@theacro};%
\fi%
% acronyms description
- \fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont%
+ %\fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont% changed in v2.1.5
+ \fontsize{\pgfPTlegendacrofontsize}{\pgfPTlegendacrofontsize}\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.4*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.3*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.2*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{.45*\f@size}\fi\fi%
@@ -2436,7 +2620,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\tikz{%
\node[text width=\pgfPT@boxwd,text centered,inner sep=0pt] (exFlag) at (0,0) {\includegraphics[height=\pgfPT@boxht]{flags/\pgfPT@country@flag.pdf}};%
\global\pgfPT@countc=0%
- \node[below right,text width=3.75*\pgfPTcellwd,inner xsep=0pt] at ([xshift=.025*\pgfPTcellwd]exFlag.north east) {%
+ \node[below right,text width=2.2*\pgfPTcellwd,inner xsep=0pt] at ([xshift=.025*\pgfPTcellwd]exFlag.north east) {%
\@for\pgfPT@tmp:=\pgfPTlanguages\do{%
\ifnum\pgfPT@countc=0\relax%
\pgfPT@box@zerodepth{\csname pgfPT@country@name@\pgfPT@tmp\endcsname}%
@@ -3007,7 +3191,9 @@ rectangle
\fi% \pgfPT@element@count=118
\fi\fi% min=1 & max 118
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\@pgfPT@resetlayers% Restoring pgf layers to those used in the document
+% corrected in v2.1.2: \@pgfPT@resetlayers -> \pgfsetlayers{\@pgfPT@resetlayers}
+% ... Warning: Missing character: There is no m (U+006D) in font nullfont! ...
+\pgfsetlayers{\@pgfPT@resetlayers}% Restoring pgf layers to those used in the document
\fontseries{\seriesdefault}\fontshape{\shapedefault}\fontfamily{\familydefault}\selectfont% Restoring the font settings to normal mode in the document
}% end tikz
}%
@@ -3018,8 +3204,13 @@ rectangle
% internal macro -> pgfPT@processlist -----------------------------------------------------------
% Analyze the key and store the list of Z numbers in \pgfPT@@cellslist ------------------------
\def\pgfPT@processlist{%
-\def\pgfPT@processlist@firstchar##1##2\relax{\edef\pgfPT@tmp{##1}}%
+\def\pgfPT@processlist@firstchar##1##2\relax{\edef\pgfPT@tmp{##1}\edef\pgfPT@theotherchars{##2}}% changed in v2.1.5
\expandafter\pgfPT@processlist@firstchar\pgfPTcells\relax%
+ %\pgfPTcells is a list of Z numbers preceded with a star -> new in v2.1.5
+ \edef\pgfPT@liststar{*}%
+ \ifx\pgfPT@tmp\pgfPT@liststar\relax%
+ \expandafter\pgfPT@processZlist@star@makeTheLists\pgfPT@theotherchars\relax%
+ \else%
\ifcat1\pgfPT@tmp\relax%
%\pgfPTcells is a list of Z numbers
\edef\pgfPT@@cellslist{\pgfPTcells}%
@@ -3045,7 +3236,45 @@ rectangle
\fi%
\fi%
\fi%
+ \fi%
}%
+% ---- new in v2.1.5
+% \pgfPT@processZlist@star@makeTheLists
+% store the original list in \pgfPT@@cellslist
+% and makes the list \pgfPT@@emptycellslist with the 'gaps' in the original list
+% Example: original list=*({empty list options}){1,...,5,9,10,...24} -> \pgfPT@@cellslist={1,...,5,9,10,...24} and \pgfPT@@emptycellslist={6,7,8}
+% empty list options available: hide Z, back color
+\def\pgfPT@processZlist@star@makeTheLists#1\relax{\ignorespaces%
+\expandafter\pgfPT@processlist@firstchar#1\relax%
+\edef\pgfPT@leftpar{(}%
+\ifx\pgfPT@tmp\pgfPT@leftpar\relax% options to empty cells
+\message{make::parenthesis found::\pgfPT@tmp}%
+\def\pgfPT@emptycellslist@get@options(##1)##2\relax{\edef\pgfPT@emptycellslist@options{##1}\edef\pgfPT@@cellslist{##2}}%
+\expandafter\pgfPT@emptycellslist@get@options#1\relax%
+\else%
+\edef\pgfPT@@cellslist{#1}%
+\fi%
+\def\pgfPT@@emptycellslist{}%
+\expandafter\@pgfPT@processZlist@star@makeTheLists\pgfPT@@cellslist\relax%
+}%
+\def\@pgfPT@processZlist@star@makeTheLists#1\relax{\ignorespaces%
+\pgfPT@countf=0% counter to indicate the start (0 -> first list element; 1 -> other list elements)
+\foreach \n in {#1} {%
+ \ifnum\pgfPT@countf=0\relax\xdef\pgfPT@@auxlist@start{\n}\global\pgfPT@countf=1\relax\else%
+ \xdef\pgfPT@@auxlist@finish{\n}\fi%
+ }%
+\foreach \n in {\pgfPT@@auxlist@start,...,\pgfPT@@auxlist@finish} {%
+ \gdef\pgfPT@foundinlist{0}% false
+ \foreach \p in {#1} {%
+ \ifnum\n=\p\relax\gdef\pgfPT@foundinlist{1}\breakforeach\fi% true
+ }%
+ \ifnum\pgfPT@foundinlist=1\relax\else\xdef\pgfPT@@emptycellslist{\pgfPT@@emptycellslist,\n}\fi%
+ }%
+\def\pgfPT@cleanemptycellslist,##1\relax{\edef\pgfPT@@emptycellslist{##1}}%
+\ifx\pgfPT@@emptycellslist\empty\relax\else%
+\pgfPT@Zliststartrue\expandafter\pgfPT@cleanemptycellslist\pgfPT@@emptycellslist\relax\fi%
+}%
+% ----
% END !! \pgfPT@processlist ----------------------------------------------------------------------
%
% INPUT: number list -> {??,...,??}
@@ -3082,15 +3311,14 @@ rectangle
% renders text via pdfliteral: -------------
% #1 outline width width #2 txt #3 #4 #5 rgb stroke color #6 #7 #8 rgb fill color -----------
% #9 txt render mode (0 - fill 1 - stroke 2 - fill then stroke ---------
-\ifx\pdfliteral\undefined\relax%
-\ifx\pdfextension\undefined\relax% XeLaTeX
-\def\pgfPT@lt[#1](#2)(#3,#4,#5)(#6,#7,#8)(#9){\special{pdf:literal direct #1 w #3 #4 #5 RG #6 #7 #8 rg #9 Tr}#2\special{pdf:literal direct 0 0 0 rg 1 w 0 Tr}}%
-\else% LuaLaTeX
-\protected\def\pdfliteral{\pdfextension literal}
+% changed in v2.1.3
+\ifcase\pgfPT@engine\relax% pdfLaTeX
\def\pgfPT@lt[#1](#2)(#3,#4,#5)(#6,#7,#8)(#9){\pdfliteral direct {#1 w #3 #4 #5 RG #6 #7 #8 rg #9 Tr}{#2}\pdfliteral direct {0 0 0 rg 1 w 0 Tr}}%
-\fi%
-\else% pdfLaTeX
+\or% LuaLaTeX
+\protected\def\pdfliteral{\pdfextension literal}%
\def\pgfPT@lt[#1](#2)(#3,#4,#5)(#6,#7,#8)(#9){\pdfliteral direct {#1 w #3 #4 #5 RG #6 #7 #8 rg #9 Tr}{#2}\pdfliteral direct {0 0 0 rg 1 w 0 Tr}}%
+\or% XeLaTeX
+\def\pgfPT@lt[#1](#2)(#3,#4,#5)(#6,#7,#8)(#9){\special{pdf:literal direct #1 w #3 #4 #5 RG #6 #7 #8 rg #9 Tr}#2\special{pdf:literal direct 0 0 0 rg 1 w 0 Tr}}%
\fi%
% END !! \pgfPT@lt --------------------------------------------------------------------------------
%
@@ -3101,9 +3329,10 @@ rectangle
% auxiliary macros to set the rgb components of one color ---------------------------------------
% with use of \extractcolorspecs from xcolor package ---------------------------------------------
% each component is stored in \pgfPT@«r, g or b» & «s or f» -------------------------------------
-\def\pgfPT@extract@rgb@stroke#1{\extractcolorspecs{#1}{\pgfPTcolmodel}{\pgfPTcolinfo}\expandafter\pgfPT@set@rgb@stroke\pgfPTcolinfo\relax}%
+% v3.1.3: added conversion of the color to rgb :: \colorlet{#1}[rgb]{#1}
+\def\pgfPT@extract@rgb@stroke#1{\colorlet{#1}[rgb]{#1}\extractcolorspecs{#1}{\pgfPTcolmodel}{\pgfPTcolinfo}\expandafter\pgfPT@set@rgb@stroke\pgfPTcolinfo\relax}%
\def\pgfPT@set@rgb@stroke#1,#2,#3\relax{\def\pgfPT@rs{#1}\def\pgfPT@gs{#2}\def\pgfPT@bs{#3}}%
-\def\pgfPT@extract@rgb@fill#1{\extractcolorspecs{#1}{\pgfPTcolmodel}{\pgfPTcolinfo}\expandafter\pgfPT@set@rgb@fill\pgfPTcolinfo\relax}%
+\def\pgfPT@extract@rgb@fill#1{\colorlet{#1}[rgb]{#1}\extractcolorspecs{#1}{\pgfPTcolmodel}{\pgfPTcolinfo}\expandafter\pgfPT@set@rgb@fill\pgfPTcolinfo\relax}%
\def\pgfPT@set@rgb@fill#1,#2,#3\relax{\def\pgfPT@rf{#1}\def\pgfPT@gf{#2}\def\pgfPT@bf{#3}}%
% END !! \pgfPT@«color macros» ------------------------------------------------------------------
%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
index c588490c48..c395dc96fa 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
+++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex
index c2b22dd9ad..44ceaf521e 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex
@@ -10,7 +10,7 @@
\date{\today}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}%
-\usefont{T1}{vna}{m}{n}
+\usefont{T1}{verdana}{m}{n}%
\begin{titlepage}
\vspace{\stretch{1}}%
\maketitle\thispagestyle{empty}%
@@ -21,7 +21,7 @@
\makebox[\linewidth][c]{\tikz{%
\node[text width=.9\linewidth+.5cm,text justified,draw=blue!10!black,rounded corners=10pt,fill=blue!5] at (0,0) {\color{blue!10!black}
\begin{abstract}
-\noindent The purpose of this package is to provide the Periodic Table of Elements in a simple way. It relies on pgf/\txttikz{} to offer a full or partial periodic table with a variety of options and displaying the desired data. The data available, from all the actual 118 elements, is: atomic number, element name, chemical symbol, relative atomic mass, standard relative atomic mass, radioactivity, atomic radius (empirycal), covalente radius, ionic radius, first ionization energy, electronegati\-vity (Pauling), electroaffinity, oxidation states, melting point (in Kelvin and Celsius degrees), boiling point (in Kelvin and Celsius degrees), electron distribuition, electronic configuration (increasing $n$ and increasing $n+\ell$), density, specific heat capacity, thermal condutivity, lattice structure, lattice constants (a, b, c and c/a ratio), discovery year, discovery country and visible range spectral lines. It is possible to get the Periodic Table in different languages: English, French, German, Portuguese (from Portugal and from Brazil), Spanish, Italian and translations provided by user contributions -- currently in Dutch only.
+\noindent The purpose of this package is to provide the Periodic Table of Elements in a simple way. It relies on pgf/\txttikz{} to offer a full or partial periodic table with a variety of options and displaying the desired data. The data available, from all the actual 118 elements, is: atomic number, element name, chemical symbol, relative atomic mass, standard relative atomic mass, radioactivity, atomic radius (empirical), covalent radius, ionic radius, first ionization energy, electronegati\-vity (Pauling), electroaffinity, oxidation states, melting point (in Kelvin and Celsius degrees), boiling point (in Kelvin and Celsius degrees), electron distribution, electronic configuration (increasing $n$ and increasing $n+\ell$), density, specific heat capacity, thermal conductivity, lattice structure, lattice constants (a, b, c and c/a ratio), discovery year, discovery country and visible range spectral lines. It is possible to get the Periodic Table in different languages: English, French, German, Portuguese (from Portugal and from Brazil), Spanish, Italian and translations provided by user contributions -- currently in Dutch and Chinese.
\\ [6pt]
\end{abstract}
};}}
@@ -43,7 +43,7 @@
\\ [6pt]You need to put the package files (pgf-PeriodicTable.sty \&\ \textit{friends}) in a location where \textrm{PDF\LaTeX}, \textrm{Lua\LaTeX} or \textrm{Xe\LaTeX} can find them. According to the TDS conventions this may be a subdirectory named \textit{tex/latex/pgf-PeriodicTable/} or \textit{tex/latex/misc/} in your (site specific) installation tree (insert your appropriate directory delimiter instead of /, if needed).
\subsection{Package loading and options}
If you are using \textrm{PDF\LaTeX}, \textrm{Lua\LaTeX} or \textrm{Xe\LaTeX} you can just simply include the style file without any option via the \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}} command, \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
-\\ [6pt]It can also be loaded with a comma separated list of \textit{options} to select the desired default language or to use Devanagari or Mandarin numerals in the Atomic Number, Periods and/or Groups.
+\\ [6pt]It can also be loaded with a comma separated list of \textit{options} to select the desired default language, to use Devanagari or Mandarin numerals in the Atomic Number, Periods and/or Groups or to fix the interaction with the beamer class.
\subsubsection{Language Option}
There are six \textit{built-in }languages -- English, French, German, Portuguese (from Portugal and Brazil), Spanish and Italian. The default language used in the package may be selected at package loading:
\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{language flag}\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
@@ -64,10 +64,17 @@ There are six \textit{built-in }languages -- English, French, German, Portuguese
\vspace{4pt}\hrule\vspace{12pt}
A \textit{user language} can also be chosen as default language loading the package with the following option syntax:
\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{userlang=<ISO 639-1 CODE>}\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
-\\ [6pt]In the present version only a Dutch translation is available. It can be loaded by:
-\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{userlang=nl}%
-\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
-\\ [6pt]\tikz{\node[text width=\linewidth-6mm,draw=green!70,rounded corners=2pt,fill=black!10!green!10,inner sep=3mm] {Anyone who wishes to contribute with translations for use in this package can go to the \tikz[baseline=(b.base)]{\node[inner sep=0pt] (a) {\includegraphics[height=10pt]{manualfiles/pgfPTgithub-mark.pdf}}; \node[right,inner sep=0pt,xshift=.1em] (b) at (a.east) {\href{https://github.com/HugoPGomes/pgf-periodictable}{pgf-periodictable}};} project page.};}
+\\ [6pt]\textit{The \textcolor{brown!60!black}{user language ISO CODES} available are:}
+\vspace{2pt}\hrule\vspace{4pt}
+\begin{minipage}[t]{.5\linewidth}
+\begin{itemize}
+\item[$\checkmark$]\textbf{nl} for Dutch,
+\end{itemize}\end{minipage}\begin{minipage}[t]{.5\linewidth}
+\begin{itemize}
+\item[$\checkmark$]\textbf{zh} for Chinese (simplified).
+\end{itemize}\end{minipage}
+\vspace{4pt}\hrule\vspace{12pt}
+\tikz{\node[text width=\linewidth-6mm,draw=green!70,rounded corners=2pt,fill=black!10!green!10,inner sep=3mm] {Anyone who wishes to contribute with translations for use in this package can go to the \tikz[baseline=(b.base)]{\node[inner sep=0pt] (a) {\includegraphics[height=10pt]{manualfiles/pgfPTgithub-mark.pdf}}; \node[right,inner sep=0pt,xshift=.1em] (b) at (a.east) {\href{https://github.com/HugoPGomes/pgf-periodictable}{pgf-periodictable}};} project page.};}
\\ [6pt]\textbf{Note that the \textit{built-in} languages are always available for the \textcolor{red!60!black}{languages} option of the \bs{pgfPT} command, but the \textit{user language} is only available if loaded with the package.}
\subsubsection{Devanagari numerals}
It is possible to get some numbers in the Periodic Table with Devanagari numerals: the atomic number and the numeration of periods and groups. To get this feature enabled the package must be loaded with the option \textit{numerals} set to \textbf{dvn}:
@@ -98,9 +105,10 @@ This option works with the \textrm{Xe\LaTeX} and \textrm{Lua\LaTeX} engines to t
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTnumMand1.pdf}}}%
\\ [3pt]\pgfPTMline
\\ [6pt]As with the Devanagari numerals, the following command loads the specified font for the Mandarin numerals:
-\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTzhfont}%
-\\ [3pt]\bs{pgfPTzhfont}\lp\red{font options}\rp\lb\red{font name}\rb
-\\ [3pt]The default font is \textit{SimSun} loaded with the \textit{AutoFakeBold=4} option.
+\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTzhnumberfont}%\pgfPTzhnumberfont
+\\ [3pt]\bs{pgfPTzhnumberfont}\lp\red{font options}\rp\lb\red{font name}\rb
+\\ [3pt]\textit{For backwards compatibility (up to v2.1.4) the previous \bs{pgfPTzhfont} command now points to \bs{pgfPTzhnumberfont}, so older documents do not need any changes}.
+\\ [3pt]The default font is \textit{BabelStone Han} (since v2.1.5) loaded with the \textit{AutoFakeBold=4} option. For details on installing this font, see the \hyperlink{subsec::zhLang}{Chinese (zh) subsection} below.
\\ [6pt]It is also possible to enable or disable the numbers shown in Mandarin with the command:
\\ [3pt]\bs{pgfPTzhnumber}\lp\red{<true|false>}\rp\lb\red{comma separated list}\rb
\\ [3pt] The list can have \red{Z} for the atomic number, \red{per} for the period numbers and \red{gr} for the group numbers. At package loading, with this option, they are set to \red{true}.
@@ -112,6 +120,87 @@ This option works with the \textrm{Xe\LaTeX} and \textrm{Lua\LaTeX} engines to t
\\ [-4pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36}]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTnumMand2.pdf}}}%
\\ [3pt]\pgfPTMline
+\newpage%
+\subsection{User languages}
+\textit{User languages} are provided by user translations. They are only available if passed as an option when loading the package. In addition to the \textit{built-in} languages, the chosen language is the only one available and becomes the default language for the Periodic Table.
+\bigskip
+\subsubsection{Dutch (nl)}
+The Dutch language is loaded by:
+\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{userlang=nl}%
+\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
+\\ [10pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[userlang=nl]\{pgf-PeriodicTable\}}};}%
+\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPT_nl.pdf}}}%
+\\ [3pt]\pgfPTMline
+\bigskip
+\subsubsection{Chinese (zh)}
+\hypertarget{subsec::zhLang}{The Chinese language} is loaded by:
+\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{userlang=zh}%
+\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
+\\ [6pt]\tikz{\node[text width=\linewidth-6mm,draw=orange!70,rounded corners=2pt,fill=black!10!orange!10,inner sep=3mm] {%
+The default font is \textit{BabelStone Han} \textbf{which is not available in TeX Live}.
+\\ It can be downloaded for free from the BabelStone website:
+\\ [3pt]\hfil\href{https://www.babelstone.co.uk/Fonts/Han.html}{https://www.babelstone.co.uk/Fonts/Han.html}\hfil};}
+\\ [6pt]The use of a font which is not included in the TeX Live software distribution, nor in common Operating Systems, circumvents the missing Ideographs for the most recent elements -- from rutherfordium to oganesson. The BabelStone Han has all of them as can be seen in the following table:
+\begin{center}\small
+\includegraphics[width=\linewidth]{manualfiles/pgfPT_zh_fonts.pdf}
+\\ [3pt]Glyphs available in \textsf{BabelStone Han} font and in some Windows and TeX Live fonts.
+\end{center}
+\vfill%
+To use the BabelStone Han it is necessary to \href{https://www.babelstone.co.uk/Fonts/Download/BabelStoneHan.zip}{download it}, unzip it and install the extracted font file:
+\begin{itemize}\small
+\item for Windows users, just right click on \textsf{BabelStoneHan.ttf} and choose \textsf{install for all users}. This can also be done in Windows Settings $\rightarrow$ Personalization $\rightarrow$ Fonts.
+\item for Linux users, open the Linux Terminal and type \textsf{sudo apt install fonts-BabelStoneHan.ttf}
+\item for macOS users, just copy or drag the font file (\textsf{BabelStoneHan.ttf}) into \textsf{/Library/Fonts} or \mbox{double-click} on \textsf{BabelStoneHan.ttf} to open the preview window. Click on \textsf{Install font} button at the bottom of the preview window.
+\end{itemize}\medskip
+Make sure the \textsf{BabelStone Han} font is \textit{visible} to the \textrm{Xe\LaTeX} or \textrm{Lua\LaTeX} engines.
+\\ [9pt]If you do not want to install this font on your operating system, you can place it in the \textsf{truetype} fonts folder in the TeX Live distribution and \textit{Update filename database} in the TeX Live manager. After that, the font will be known only by the filename \textsf{BabelStoneHan.ttf} instead of its name, \textsf{BabelStone Han}.
+
+\newpage%
+\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[userlang=zh]\{pgf-PeriodicTable\}}};}%
+\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPT_zh_1.pdf}}}%
+\\ [3pt]\pgfPTMline
+\vfill
+To get the Periodic Table with the atomic number and the period/group numbers in mandarin numerals load the package with the correponding options:
+\\ [10pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[userlang=zh,numerals=zh]\{pgf-PeriodicTable\}}};}%
+\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPT_zh_2.pdf}}}%
+\\ [3pt]\pgfPTMline
+\newpage%
+When the Chinese language is loaded four extra commands are defined:
+\begin{itemize}
+\item\bs{pgfPTzhFontFeatures}\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTzhFontFeatures} can be used to set font features for the loaded Chinese font (set by the \red{font} option). For more details see the \textsf{fontspec} package documentation.
+\item\bs{pgfPTzhtextfontSS}\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTzhtextfontSS} is used to set the font for the elements meitnerium, copernicium, nihonium, tennessine and oganesson (Z=109, 112. 113, 117 and 118).
+\item\bs{pgfPTzhtextfontSSB}\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTzhtextfontSSB} is used to set the font for the elements rutherfordium, dubnium, seaborgium, bohrium, hassium,darmstadtium, roentgenium and flerovium (Z=104, 105, 106, 107, 108, 110, 111 and 114).
+\item\bs{pgfPTzhtextfontLv}\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTzhtextfontLv} is used to set the livermorium (Z=116) font.
+\end{itemize}
+The defaults for some features of the Periodic Table are also changed:
+\begin{itemize}
+\item[--]the \red{name font} is switched from \texttt{\large\textbackslash tiny} to \texttt{\large\textbackslash footnotesize}.
+\item[--]the \red{CS font} is switched from \texttt{\large\textbackslash small\textbackslash bfseries} to \texttt{\large\textbackslash large}.
+\item[--]the \red{title font} is switched from \texttt{\large\textbackslash Large\textbackslash bfseries} to \texttt{\large\textbackslash LARGE}.
+\item[--]when not using the Chinese numerals (loaded with the option \textcolor{brown!60!black}{numerals=zh}) the \red{Z font} is switched from \texttt{\large\textbackslash tiny\textbackslash bfseries} to \texttt{\large\textbackslash scriptsize}, as well the \red{Z padding} is changed from \texttt{\large 0.25ex} to \texttt{\large 0ex}.
+\end{itemize}
+\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[userlang=zh]\{pgf-PeriodicTable\}}};}%
+\\ [-4pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt,text=black!50] %
+{\bs{pgfPTzhtextfontSS}\lb\red{SimSun}\rb\% font for Z=\{109,112.113,117,118\}
+\\ \makebox[8em][s]{}\% meitnerium, copernicium, nihonium, tennessine, oganesson
+\\ \bs{pgfPTzhtextfontSSB}\lb\red{SimSun-ExtB}\rb\% font for
+\\ \makebox[8em][s]{}\% Z=\{104,105,106,107,108,110,111,114\}
+\\ \makebox[8em][s]{}\% rutherfordium, dubnium, seaborgium, bohrium, hassium,
+\\ \makebox[8em][s]{}\% darmstadtium, roentgenium, flerovium
+\\ \bs{pgfPTzhtextfontLv}\lb\red{SimSun-ExtB}\rb\% font for Z=116
+\\ \makebox[8em][s]{}\% livermorium
+};}%
+\\ [-4pt]\pgfPTMmacrobox[l]{pgfPT}[font=SimSun]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPT_zh_3.pdf}}}%
+\\ [3pt]\pgfPTMline
+\newpage%
\subsection{Interaction with other packages}
\subsubsection{fontspec}
To correctly set the font in each cell contents the command \bs{fontspec} must be used. For example if you want to use \textit{Arial} for the \red{name font}, it must be set using \red{name font=\bs{fontspec}\lb Arial\rb\bs{selectfont}}.\\ All other font selection commands, \eg, \bs{large}, \mbox{\bs{itshape}}, are used as usual. For example if you want to use \textit{Arial}\hfil\ in\hfil\ \textit{large}\hfil\ size\hfil\ and\hfil\ \textit{bold}\hfil\ weight\hfil\ for\hfil\ the \red{name font}, then you type
@@ -122,8 +211,27 @@ Using \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textco
\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{ragged2e}\textcolor{purple!40!black}{\}}} and \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}%
\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} together, the Periodic Table will be completely fractured and out of the page.
\\ [6pt]\textit{Solution}:
-\vspace{4pt}\hrule\vspace{4pt}Use a local group: \{\bs{justifying}\bs{pgfPT}\}\vspace{4pt}\hrule
-\vfill\vfill\vfill\newpage\ \vfill%
+\vspace{4pt}\hrule\vspace{4pt}Use a local group: \{\bs{justifying}\bs{pgfPT}\}\vspace{4pt}\hrule%
+\subsubsection{beamer}
+\textrm{\large beamer}, \pack{} and \textrm{PDF\LaTeX} in combination have an issue: the \texttt{\large\textbackslash textsc} fails to produce the correct small caps. The error given is:
+\smallskip\hrule\begin{verbatim}
+Font shape `T1/cmss/m/sc' undefined
+(Font) using `T1/cmss/m/n' instead on input line ...
+\end{verbatim}\hrule
+\smallskip\hrule\smallskip\bigskip
+To avoid this, the \pack{} package can be loaded with one of the following options:
+\begin{description}
+\item[\red{beamer}] which loads the \textrm{\large lmodern} package, setting small caps compatibility with beamer via `lmodern' package.
+\\ \tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[beamer]\{pgf-PeriodicTable\}}};}%
+\item[\red{beamer*}] which sets small caps compatibility with beamer via T1 \textrm{\large cmr} fonts.
+\\ \tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[beamer*]\{pgf-PeriodicTable\}}};}%
+\item[\red{beamer**}] which sets small caps compatibility with beamer via T1 \textrm{\large cmr} fonts and loads the \textrm{\large silence} package to suppress small caps font substitution warnings.
+\\ \tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[beamer**]\{pgf-PeriodicTable\}}};}%
+\end{description}
+\newpage
\section{The data}
The data available in \pack{} was mainly compiled with selected and filtered data from Wikipedia, taken from November 2021 to July 2022.
\\ [12pt]\header
@@ -133,7 +241,7 @@ Commission on Isotopic Abundances and Atomic Weights,\newline\bfseries\textsf{\t
\newline(\href{https://ciaaw.org/impressum.htm}{https://ciaaw.org/impressum.htm})}%
\\ [-1pt]\linhaimpar{radio}{Radioactivity}{}{(gperiodic-3.0.3, Dec 26 2018)}%
\\ [-1pt]\linhapar{R}{Atomic Radius}{$\mathsf{pm}$}{Calculated (Wikidata @04/jul/2022)}%
-\\ [-1pt]\linhaimpar{Rcov}{Covalente Radius}{$\mathsf{pm}$}{Single bond, Wikidata @04/jul/2022)}%
+\\ [-1pt]\linhaimpar{Rcov}{Covalent Radius}{$\mathsf{pm}$}{Single bond, Wikidata @04/jul/2022)}%
\\ [-1pt]\linhapar{Rion}{Ionic Radius}{$\mathsf{pm}$}{(Wikidata @04/jul/2022)}%
\\ [-1pt]\linhaimpar{Ei}{First Ionization Energy}{$\mathsf{kJ\cdot mol^{-1}}$}{(Wikidata @04/jul/2022)}%
\\ [-1pt]\linhapar{eneg}{Electronegativity\newline (Pauling)}{}{(Wikidata @04/jul/2022)}%
@@ -193,8 +301,11 @@ The following options and styles are used to \textit{control} the Periodic Table
\input{manualfiles/pgf-PeriodicTableManual_DarkMode.tex}%
\label{file:exerciselayout}%
\input{manualfiles/pgf-PeriodicTableManual_exerciselayout.tex}%
+\vfill%
\subsection{\texorpdfstring{$\maltese$ Cell contents options: keys, styles and \itshape pseudo styles}{Cell contents options}}
The following options and styles are used for customizing the contents available in each individual cell of the Periodic Table, like the \textit{fonts} or the \textit{colors} used in the shown contents.
+\label{file:decSep}%
+\input{manualfiles/pgf-PeriodicTableManual_decSep.tex}%
\label{file:Z}%
\input{manualfiles/pgf-PeriodicTableManual_Z.tex}%
\label{file:CS}%
@@ -231,6 +342,10 @@ In this part the \hypertarget{sec:lib}{library} packages are documented. They pr
\\ [1.6cm]%
\input{manualfiles/pgf-PeriodicTableManual_libCS.tex}%
\newpage%
+\section{Tips \& Tricks: inspired by user questions}
+In this section a list of selected user questions and the corresponding answers can be found, hoping it can be useful to anyone using this package.
+\input{manualfiles/pgf-PeriodicTableManual_TipsTricks}
+\newpage%
\section{A few more examples}
\input{manualfiles/pgf-PeriodicTableManual_Examples.tex}%
\newpage\small%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.backcolors.keys.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.backcolors.keys.tex
index 076f588ca0..fe18893047 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.backcolors.keys.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.backcolors.keys.tex
@@ -6,24 +6,27 @@
%
% defining PGF keys: the colors of the cells of the periodic table to be drawn -----------------
% list names available to use in key 'back color scheme', e.g. ----------------------------------
-% «back color scheme=CPK» or «back color scheme=Wikipedia» ------------------------------
+% v2.1.4 -> add prefix pgfPT to the built-in names
+% «back color scheme=pgfPTCPK» or «back color scheme=pgfPTWikipedia» ------------------
% if «back color scheme=solid» the «back color» key is used to fill the cells -------------------
-\def\pgfPT@backColorsScheme@default{.769/.812/.961,.678/.733/.925,.871/.89/.875,.922/.886/.71,.8/.878/.859,.706/.871/.827,.612/.859/.796,.42/.89/.769,.671/.608/.749,.588/.655/.89,.871/.89/.875,.922/.886/.71,.8/.878/.859,.706/.871/.827,.612/.859/.796,.42/.89/.769,.671/.608/.749,.588/.655/.89,.871/.89/.875,.922/.886/.71,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.8/.878/.859,.706/.871/.827,.612/.859/.796,.42/.89/.769,.671/.608/.749,.588/.655/.89,.871/.89/.875,.922/.886/.71,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.8/.878/.859,.706/.871/.827,.612/.859/.796,.42/.89/.769,.671/.608/.749,.588/.655/.89,.871/.89/.875,.922/.886/.71,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.8/.878/.859,.706/.871/.827,.612/.859/.796,.42/.89/.769,.671/.608/.749,.588/.655/.89,.871/.89/.875,.922/.886/.71,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741}%
-\def\pgfPT@backColorsScheme@Soft{.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.843/.839/.659,.843/.839/.659,.843/.839/.659,.843/.839/.659,.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.945/.941/.918,.973/.945/.78,.843/.839/.659,.843/.839/.659,.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.973/.945/.78,.843/.839/.659,.843/.839/.659,.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.843/.839/.659,.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918}%
-\def\pgfPT@backColorsScheme@Jmol{1/1/1,.851/1/1,.8/.502/1,.761/1/0,1/.71/.71,.565/.565/.565,.188/.314/.973,1/.051/.051,.565/.878/.314,.702/.89/.961,.671/.361/.949,.541/1/0,.749/.651/.651,.941/.784/.627,1/.502/0,1/1/.188,.122/.941/.122,.502/.82/.89,.561/.251/.831,.239/1/0,.902/.902/.902,.749/.761/.78,.651/.651/.671,.541/.6/.78,.612/.478/.78,.878/.4/.2,.941/.565/.627,.314/.816/.314,.784/.502/.2,.49/.502/.69,.761/.561/.561,.4/.561/.561,.741/.502/.89,1/.631/0,.651/.161/.161,.361/.722/.82,.439/.18/.69,0/1/0,.58/1/1,.58/.878/.878,.451/.761/.788,.329/.71/.71,.231/.62/.62,.141/.561/.561,.039/.49/.549,0/.412/.522,.753/.753/.753,1/.851/.561,.651/.459/.451,.4/.502/.502,.62/.388/.71,.831/.478/0,.58/0/.58,.259/.62/.69,.341/.09/.561,0/.788/0,.439/.831/1,1/1/.78,.851/1/.78,.78/1/.78,.639/1/.78,.561/1/.78,.38/1/.78,.271/1/.78,.188/1/.78,.122/1/.78,0/1/.612,0/.902/.459,0/.831/.322,0/.749/.22,0/.671/.141,.302/.761/1,.302/.651/1,.129/.58/.839,.149/.49/.671,.149/.4/.588,.09/.329/.529,.816/.816/.878,1/.82/.137,.722/.722/.816,.651/.329/.302,.341/.349/.38,.62/.31/.71,.671/.361/0,.459/.31/.271,.259/.51/.588,.259/0/.4,0/.49/0,.439/.671/.98,0/.729/1,0/.631/1,0/.561/1,0/.502/1,0/.42/1,.329/.361/.949,.471/.361/.89,.541/.31/.89,.631/.212/.831,.702/.122/.831,.702/.122/.729,.702/.051/.651,.741/.051/.529,.78/0/.4,.8/0/.349,.82/0/.31,.851/0/.271,.878/0/.22,.902/0/.18,.922/0/.149,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1}%
-\def\pgfPT@backColorsScheme@CPK{1/1/1,0/1/1,.467/0/1,0/.467/0,1/.667/.467,.133/.133/.133,.133/.2/1,1/.133/0,.122/.941/.122,0/1/1,.467/0/1,0/.467/0,.867/.467/1,.867/.467/1,1/.6/0,1/.898/.133,.122/.941/.122,0/1/1,.467/0/1,0/.467/0,1/.667/.467,.6/.6/.6,1/.667/.467,1/.667/.467,1/.667/.467,.867/.467/0,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.6/.133/0,0/1/1,.467/0/1,0/.467/0,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.4/0/.733,0/1/1,.467/0/1,0/.467/0,1/.667/.467,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.467/0/1,0/.467/0,1/.667/.467,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1}%
-\def\pgfPT@backColorsScheme@Rasmol{1/1/1,1/.753/.796,.698/.133/.133,1/.078/.576,0/1/0,.784/.784/.784,.561/.561/1,.941/0/0,.855/.647/.125,1/.078/.576,0/0/1,.133/.545/.133,.502/.502/.565,.855/.647/.125,1/.647/0,1/.784/.196,0/1/0,1/.078/.576,1/.078/.576,.502/.502/.565,1/.078/.576,.502/.502/.565,1/.078/.576,.502/.502/.565,.502/.502/.565,1/.647/0,1/.078/.576,.647/.165/.165,.647/.165/.165,.647/.165/.165,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.647/.165/.165,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.502/.502/.565,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.627/.125/.941,1/.078/.576,1/.078/.576,1/.647/0,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.855/.647/.125,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1}%
-\def\pgfPT@backColorsScheme@RasmolNew{1/1/1,1/.753/.796,.698/.129/.129,1/.078/.58,0/1/.004,.827/.827/.827,.529/.808/.902,1/0/0,.855/.647/.129,1/.078/.58,0/0/1,.133/.545/.137,.412/.412/.412,.855/.647/.129,1/.667/0,1/1/0,0/1/.004,1/.078/.576,1/.078/.576,.412/.412/.412,1/.078/.58,.412/.412/.412,1/.078/.58,.412/.412/.412,.412/.412/.412,1/.667/0,1/.078/.58,.502/.157/.157,.502/.157/.157,.502/.157/.157,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.502/.157/.157,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.412/.412/.412,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.627/.125/.945,1/.078/.576,1/.078/.576,1/.667/0,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.855/.647/.129,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576}%
-\def\pgfPT@backColorsScheme@Wikipedia{.941/1/.561,.753/1/1,1/.4/.4,1/.871/.678,.8/.8/.6,.941/1/.561,.941/1/.561,.941/1/.561,.941/1/.561,.753/1/1,1/.4/.4,1/.871/.678,.8/.8/.8,.8/.8/.6,.941/1/.561,.941/1/.561,.941/1/.561,.753/1/1,1/.4/.4,1/.871/.678,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.8/.8/.8,.8/.8/.6,.8/.8/.6,.941/1/.561,.941/1/.561,.753/1/1,1/.4/.4,1/.871/.678,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.8/.8/.8,.8/.8/.8,.8/.8/.6,.8/.8/.6,.941/1/.561,.753/1/1,1/.4/.4,1/.871/.678,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.8/.8/.8,.8/.8/.8,.8/.8/.8,.8/.8/.8,.8/.8/.8,.753/1/1,1/.4/.4,1/.871/.678,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91}%
-\def\pgfPT@backColorsScheme@MNM{.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.878/.816/.753,.91/.839/.659,.91/.839/.659,.91/.839/.659,.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.886/.886/.847,.878/.816/.753,.91/.839/.659,.91/.839/.659,.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.878/.816/.753,.878/.816/.753,.91/.839/.659,.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.878/.816/.753,.878/.816/.753,.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847}%
-\def\pgfPT@backColorsScheme@PS{.553/.706/.89,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.553/.706/.89,.553/.706/.89,.553/.706/.89,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.553/.706/.89,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.714/.867/.91,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.647/.647/.647,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.647/.647/.647,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.714/.867/.91,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647}%
-\def\pgfPT@backColorsScheme@Radio{.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.957/.933/0,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.957/.933/0,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0}%
-\def\pgfPT@backColorsScheme@Blocks{1/.937/.671,1/.937/.671,1/.937/.671,1/.937/.671,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,1/.937/.671,1/.937/.671,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,1/.937/.671,1/.937/.671,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,1/.937/.671,1/.937/.671,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,1/.937/.671,1/.937/.671,.98/.667/.541,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,1/.937/.671,1/.937/.671,.98/.667/.541,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635}%
+\def\pgfPT@backColorsScheme@pgfPTdefault{.769/.812/.961,.678/.733/.925,.871/.89/.875,.922/.886/.71,.8/.878/.859,.706/.871/.827,.612/.859/.796,.42/.89/.769,.671/.608/.749,.588/.655/.89,.871/.89/.875,.922/.886/.71,.8/.878/.859,.706/.871/.827,.612/.859/.796,.42/.89/.769,.671/.608/.749,.588/.655/.89,.871/.89/.875,.922/.886/.71,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.8/.878/.859,.706/.871/.827,.612/.859/.796,.42/.89/.769,.671/.608/.749,.588/.655/.89,.871/.89/.875,.922/.886/.71,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.8/.878/.859,.706/.871/.827,.612/.859/.796,.42/.89/.769,.671/.608/.749,.588/.655/.89,.871/.89/.875,.922/.886/.71,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.631/.6/.435,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.8/.878/.859,.706/.871/.827,.612/.859/.796,.42/.89/.769,.671/.608/.749,.588/.655/.89,.871/.89/.875,.922/.886/.71,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.522/.49/.329,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.62/.604/.522,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741,.78/.788/.741}%
+\def\pgfPT@backColorsScheme@pgfPTSoft{.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.843/.839/.659,.843/.839/.659,.843/.839/.659,.843/.839/.659,.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.945/.941/.918,.973/.945/.78,.843/.839/.659,.843/.839/.659,.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.973/.945/.78,.843/.839/.659,.843/.839/.659,.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.843/.839/.659,.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.827/.824/1,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.843/.839/.659,.843/.839/.659,.945/.941/.918,.945/.941/.918,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.71/.706/1,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918,.945/.941/.918}%
+\def\pgfPT@backColorsScheme@pgfPTJmol{1/1/1,.851/1/1,.8/.502/1,.761/1/0,1/.71/.71,.565/.565/.565,.188/.314/.973,1/.051/.051,.565/.878/.314,.702/.89/.961,.671/.361/.949,.541/1/0,.749/.651/.651,.941/.784/.627,1/.502/0,1/1/.188,.122/.941/.122,.502/.82/.89,.561/.251/.831,.239/1/0,.902/.902/.902,.749/.761/.78,.651/.651/.671,.541/.6/.78,.612/.478/.78,.878/.4/.2,.941/.565/.627,.314/.816/.314,.784/.502/.2,.49/.502/.69,.761/.561/.561,.4/.561/.561,.741/.502/.89,1/.631/0,.651/.161/.161,.361/.722/.82,.439/.18/.69,0/1/0,.58/1/1,.58/.878/.878,.451/.761/.788,.329/.71/.71,.231/.62/.62,.141/.561/.561,.039/.49/.549,0/.412/.522,.753/.753/.753,1/.851/.561,.651/.459/.451,.4/.502/.502,.62/.388/.71,.831/.478/0,.58/0/.58,.259/.62/.69,.341/.09/.561,0/.788/0,.439/.831/1,1/1/.78,.851/1/.78,.78/1/.78,.639/1/.78,.561/1/.78,.38/1/.78,.271/1/.78,.188/1/.78,.122/1/.78,0/1/.612,0/.902/.459,0/.831/.322,0/.749/.22,0/.671/.141,.302/.761/1,.302/.651/1,.129/.58/.839,.149/.49/.671,.149/.4/.588,.09/.329/.529,.816/.816/.878,1/.82/.137,.722/.722/.816,.651/.329/.302,.341/.349/.38,.62/.31/.71,.671/.361/0,.459/.31/.271,.259/.51/.588,.259/0/.4,0/.49/0,.439/.671/.98,0/.729/1,0/.631/1,0/.561/1,0/.502/1,0/.42/1,.329/.361/.949,.471/.361/.89,.541/.31/.89,.631/.212/.831,.702/.122/.831,.702/.122/.729,.702/.051/.651,.741/.051/.529,.78/0/.4,.8/0/.349,.82/0/.31,.851/0/.271,.878/0/.22,.902/0/.18,.922/0/.149,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1}%
+\def\pgfPT@backColorsScheme@pgfPTCPK{1/1/1,0/1/1,.467/0/1,0/.467/0,1/.667/.467,.133/.133/.133,.133/.2/1,1/.133/0,.122/.941/.122,0/1/1,.467/0/1,0/.467/0,.867/.467/1,.867/.467/1,1/.6/0,1/.898/.133,.122/.941/.122,0/1/1,.467/0/1,0/.467/0,1/.667/.467,.6/.6/.6,1/.667/.467,1/.667/.467,1/.667/.467,.867/.467/0,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.6/.133/0,0/1/1,.467/0/1,0/.467/0,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.4/0/.733,0/1/1,.467/0/1,0/.467/0,1/.667/.467,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.467/0/1,0/.467/0,1/.667/.467,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,.867/.467/1,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/.667/.467,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1}%
+\def\pgfPT@backColorsScheme@pgfPTRasmol{1/1/1,1/.753/.796,.698/.133/.133,1/.078/.576,0/1/0,.784/.784/.784,.561/.561/1,.941/0/0,.855/.647/.125,1/.078/.576,0/0/1,.133/.545/.133,.502/.502/.565,.855/.647/.125,1/.647/0,1/.784/.196,0/1/0,1/.078/.576,1/.078/.576,.502/.502/.565,1/.078/.576,.502/.502/.565,1/.078/.576,.502/.502/.565,.502/.502/.565,1/.647/0,1/.078/.576,.647/.165/.165,.647/.165/.165,.647/.165/.165,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.647/.165/.165,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.502/.502/.565,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.627/.125/.941,1/.078/.576,1/.078/.576,1/.647/0,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.855/.647/.125,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1,1/1/1}%
+\def\pgfPT@backColorsScheme@pgfPTRasmolNew{1/1/1,1/.753/.796,.698/.129/.129,1/.078/.58,0/1/.004,.827/.827/.827,.529/.808/.902,1/0/0,.855/.647/.129,1/.078/.58,0/0/1,.133/.545/.137,.412/.412/.412,.855/.647/.129,1/.667/0,1/1/0,0/1/.004,1/.078/.576,1/.078/.576,.412/.412/.412,1/.078/.58,.412/.412/.412,1/.078/.58,.412/.412/.412,.412/.412/.412,1/.667/0,1/.078/.58,.502/.157/.157,.502/.157/.157,.502/.157/.157,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.502/.157/.157,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.412/.412/.412,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.627/.125/.945,1/.078/.576,1/.078/.576,1/.667/0,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,.855/.647/.129,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576,1/.078/.576}%
+\def\pgfPT@backColorsScheme@pgfPTWikipediaI{.941/1/.561,.753/1/1,1/.4/.4,1/.871/.678,.8/.8/.6,.941/1/.561,.941/1/.561,.941/1/.561,.941/1/.561,.753/1/1,1/.4/.4,1/.871/.678,.8/.8/.8,.8/.8/.6,.941/1/.561,.941/1/.561,.941/1/.561,.753/1/1,1/.4/.4,1/.871/.678,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.8/.8/.8,.8/.8/.6,.8/.8/.6,.941/1/.561,.941/1/.561,.753/1/1,1/.4/.4,1/.871/.678,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.8/.8/.8,.8/.8/.8,.8/.8/.6,.8/.8/.6,.941/1/.561,.753/1/1,1/.4/.4,1/.871/.678,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.8/.8/.8,.8/.8/.8,.8/.8/.8,.8/.8/.8,.8/.8/.8,.753/1/1,1/.4/.4,1/.871/.678,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91,.91/.91/.91}%
+\def\pgfPT@backColorsScheme@pgfPTWikipediaII{.627/1/.627,.753/1/1,1/.616/.616,1/.871/.678,.8/.8/.6,.627/1/.627,.627/1/.627,.627/1/.627,1/1/.6,.753/1/1,1/.616/.616,1/.871/.678,.8/.8/.8,.8/.8/.6,.627/1/.627,.627/1/.627,1/1/.6,.753/1/1,1/.616/.616,1/.871/.678,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.8/.8/.8,.8/.8/.6,.8/.8/.6,.627/1/.627,1/1/.6,.753/1/1,1/.616/.616,1/.871/.678,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.8/.8/.8,.8/.8/.8,.8/.8/.6,.8/.8/.6,1/1/.6,.753/1/1,1/.616/.616,1/.871/.678,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.749/1,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.8/.8/.8,.8/.8/.8,.8/.8/.8,.8/.8/.8,1/1/.6,.753/1/1,1/.616/.616,1/.871/.678,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.6/.8,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,1/.753/.753,.8/.8/.8,.8/.8/.8,.8/.8/.8,.8/.8/.8,1/1/.6,.753/1/1}%
+\let\pgfPT@backColorsScheme@pgfPTWikipedia\pgfPT@backColorsScheme@pgfPTWikipediaII\relax%
+\def\pgfPT@backColorsScheme@pgfPTMNM{.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.878/.816/.753,.91/.839/.659,.91/.839/.659,.91/.839/.659,.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.886/.886/.847,.878/.816/.753,.91/.839/.659,.91/.839/.659,.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.878/.816/.753,.878/.816/.753,.91/.839/.659,.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.878/.816/.753,.878/.816/.753,.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.91/.839/.659,.91/.839/.659,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847,.886/.886/.847}%
+\def\pgfPT@backColorsScheme@pgfPTPS{.553/.706/.89,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.553/.706/.89,.553/.706/.89,.553/.706/.89,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.553/.706/.89,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.714/.867/.91,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.647/.647/.647,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.647/.647/.647,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.714/.867/.91,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.553/.706/.89,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,1/.878/.718,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647,.647/.647/.647}%
+\def\pgfPT@backColorsScheme@pgfPTRadio{.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.957/.933/0,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.957/.933/0,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.761/.839/.604,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0,.957/.933/0}%
+\def\pgfPT@backColorsScheme@pgfPTBlocks{1/.937/.671,1/.937/.671,1/.937/.671,1/.937/.671,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,1/.937/.671,1/.937/.671,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,1/.937/.671,1/.937/.671,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,1/.937/.671,1/.937/.671,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,1/.937/.671,1/.937/.671,.98/.667/.541,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,1/.937/.671,1/.937/.671,.98/.667/.541,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.757/.835/.914,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.98/.667/.541,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635,.718/.871/.635}%
% user defined color schemes(s): -----------------------------------------------------------------
% \pgfPTnewcolorscheme[<trailing color (default=1/1/1 e.g. white)>]{name}{list} -----
\def\pgfPTnewColorScheme{\@ifnextchar[\pgfPT@newColorScheme@withoptions{\pgfPT@newColorScheme@noptions}}%
\def\pgfPT@newColorScheme@withoptions[#1/#2/#3]#4#5{%
-\expandafter\def\csname pgfPT@backColorsScheme@#4\endcsname{#5,#1/#2/#3}%
+\expandafter\gdef\csname pgfPT@backColorsScheme@#4\endcsname{#5,#1/#2/#3}%
\definecolor{cpgfPTTMP}{rgb}{#1,#2,#3}%
\xglobal\colorlet{cpgfPTTMP}{cpgfPTTMP}%
}%
@@ -36,22 +39,24 @@
\pgfkeys{/pgfPerTable/.cd,%
back color scheme/.get=\pgfPTbcs,%
back color scheme/.store in=\pgfPTbcs,%
-back color scheme/.default=default,%
+back color scheme/.default=pgfPTdefault,%
back color/.get=\pgfPTbcsolid,%
back color/.store in=\pgfPTbcsolid,%
back color/.default=white,%
-csSoft/.style={back color scheme=Soft},%
-csJmol/.style={back color scheme=Jmol},%
-csCPK/.style={back color scheme=CPK},%
-csRasmol/.style={back color scheme=Rasmol},%
-csRasmolNew/.style={back color scheme=RasmolNew},%
-csWikipedia/.style={back color scheme=Wikipedia},%
-csMNM/.style={back color scheme=MNM},%
-csPS/.style={back color scheme=PS},%
-csRadio/.style={back color scheme=Radio},%
-csBlocks/.style={back color scheme=Blocks},%
+csSoft/.style={back color scheme=pgfPTSoft},%
+csJmol/.style={back color scheme=pgfPTJmol},%
+csCPK/.style={back color scheme=pgfPTCPK},%
+csRasmol/.style={back color scheme=pgfPTRasmol},%
+csRasmolNew/.style={back color scheme=pgfPTRasmolNew},%
+csWikipediaI/.style={back color scheme=pgfPTWikipediaI},%
+csWikipediaII/.style={back color scheme=pgfPTWikipediaII},%
+csWikipedia/.style={back color scheme=pgfPTWikipediaII},%
+csMNM/.style={back color scheme=pgfPTMNM},%
+csPS/.style={back color scheme=pgfPTPS},%
+csRadio/.style={back color scheme=pgfPTRadio},%
+csBlocks/.style={back color scheme=pgfPTBlocks},%
csSolid/.style={back color scheme=solid,back color=#1}%
-}% STYLES -> csSoft,csJmol,csCPK,csRasmol,csRasmolNew,csWikipedia,csMNM,csPS,csRadio,csBlocks,csSolid
+}% STYLES -> csSoft,csJmol,csCPK,csRasmol,csRasmolNew,csWikipediaI,csWikipediaII,csWikipedia,csMNM,csPS,csRadio,csBlocks,csSolid
% setting keys with default values ---------------------------------------------------------------
\pgfkeys{/pgfPerTable/.cd,back color scheme,back color}%
% end !! PGF keys: the cells of the periodic table to be drawn ----------------------------------
@@ -59,7 +64,7 @@ csSolid/.style={back color scheme=solid,back color=#1}%
\def\pgfPTcolorSchemeInfo{%
\global\pgfPT@dima=0pt\relax%
\foreach \Z in {1,...,118}{\path (-\pgfPTcellwd,-10pt*\Z) rectangle node[midway,font=\tiny\bfseries] {Z=\Z} ++(\pgfPTcellwd,-10pt);}%
-\foreach \cs in {default,Soft,Jmol,CPK,Rasmol,RasmolNew,Wikipedia,MNM,PS,Radio,Blocks}{%
+\foreach \cs in {pgfPTdefault,pgfPTSoft,pgfPTJmol,pgfPTCPK,pgfPTRasmol,pgfPTRasmolNew,pgfPTWikipedia,pgfPTWikipediaI,pgfPTWikipediaII,pgfPTMNM,pgfPTPS,pgfPTRadio,pgfPTBlocks}{%
\node[below right,text width=\pgfPTcellwd,text centered,font=\tiny,inner xsep=0pt] at (\pgfPT@dima,0pt) {\cs};%
\path (\pgfPTcellwd+\pgfPT@dima,0pt) rectangle node[midway,font=\tiny\bfseries] {(r,g,b)} ++(2*\pgfPTcellwd,-10pt);%
\edef\pgfPT@@colorlist{\csname pgfPT@backColorsScheme@\cs\endcsname}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex
index a9a3699c36..7684834830 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex
@@ -38,7 +38,9 @@
\newif\ifpgfPT@dot\pgfPT@dotfalse%
\newif\ifpgfPT@unnamedcell\pgfPT@unnamedcelltrue%
\newdimen\pgfPT@cell@collumnwd\pgfPT@cell@collumnwd=0pt%
+\newdimen\pgfPT@cell@collumnwd@unnamedcell\pgfPT@cell@collumnwd@unnamedcell=0pt%
\newdimen\pgfPT@cell@lineht\pgfPT@cell@lineht=0pt%
+\newdimen\pgfPT@cell@lineht@unnamedcell\pgfPT@cell@lineht@unnamedcell=0pt%
\newdimen\pgfPT@tmpx\pgfPT@tmpx=0pt%
\newdimen\pgfPT@tmpy\pgfPT@tmpy=0pt%
\newdimen\pgfPT@tmpwd\pgfPT@tmpwd=0pt%
@@ -47,10 +49,10 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\pgfPTbuildcellstyle#1(#2,#3)[#4]{\pgfPT@unnamedcellfalse\relax%
\pgfPTbuildcell(#2,#3)[#4]%
-\expandafter\edef\csname pgfPT@cellcontents@#1\endcsname{\pgfPT@cellcontents}%
-\expandafter\edef\csname ppfPT@thebuildcellcom@#1\endcsname{\textbackslash pgfPTbuildcell(\detokenize{#2},\detokenize{#3})\%\par[\detokenize{#4}]}%
-\expandafter\edef\csname pgfPT@nlinhas@#1\endcsname{#2}%
-\expandafter\edef\csname pgfPT@ncolunas@#1\endcsname{#3}%
+\expandafter\xdef\csname pgfPT@cellcontents@#1\endcsname{\pgfPT@cellcontents}%
+\expandafter\xdef\csname ppfPT@thebuildcellcom@#1\endcsname{\textbackslash pgfPTbuildcell(\detokenize{#2},\detokenize{#3})\%\par[\detokenize{#4}]}%
+\expandafter\xdef\csname pgfPT@nlinhas@#1\endcsname{#2}%
+\expandafter\xdef\csname pgfPT@ncolunas@#1\endcsname{#3}%
\pgfPT@unnamedcelltrue\relax%
}%
\def\pgfPT@builtincellstyle#1(#2,#3)[#4]{\pgfPT@unnamedcellfalse\relax%
@@ -66,7 +68,8 @@
% \pgfPTbuildcell(<lines>,<columns>)[<entries>]
%
\def\pgfPTbuildcell(#1,#2)[#3]{%
-\ifpgfPT@unnamedcell\gdef\ppfPT@thebuildcellcom{\textbackslash pgfPTbuildcell(\detokenize{#1},\detokenize{#2})\%\par[\detokenize{#3}]}\fi%
+\ifpgfPT@unnamedcell\gdef\pgfPT@numlinhas@unnamedcell{#1}\gdef\pgfPT@numcolunas@unnamedcell{#2}%
+\gdef\ppfPT@thebuildcellcom{\textbackslash pgfPTbuildcell(\detokenize{#1},\detokenize{#2})\%\par[\detokenize{#3}]}\fi%
\gdef\pgfPT@numlinhas{#1}\gdef\pgfPT@numcolunas{#2}%
\pgfPT@cellcontentssize=0%
\xdef\pgfPT@cellcontents{}% vanishes list contents
@@ -74,6 +77,10 @@
\pgfmathsetlength{\pgfPT@cell@lineht}{\pgfPTcellht/#1}%
\global\pgfPT@cell@lineht=\pgfPT@cell@lineht%
\global\pgfPT@cell@collumnwd=\pgfPT@cell@collumnwd%
+\ifpgfPT@unnamedcell%
+\global\pgfPT@cell@lineht@unnamedcell=\pgfPT@cell@lineht%
+\global\pgfPT@cell@collumnwd@unnamedcell=\pgfPT@cell@collumnwd%
+\fi%
\expandafter\pgfPTg@bblespaces#3\relax%
\@for\@tmp:=\pgfPT@listn@spaces\do{\expandafter\pgfPT@buildcellcontents\@tmp\relax}%
\ifpgfPT@unnamedcell\global\let\pgfPT@cellcontents@unnamed\pgfPT@cellcontents\relax\fi%
@@ -186,7 +193,7 @@
\@for\pgfPT@tmp:=\pgfPT@builtincells@names\do{\edef\pgfPT@tempb{\pgfPT@tmp}\ifx\pgfPT@tempa\pgfPT@tempb\relax\def\pgfPT@builtin{1}\fi}%
\ifnum\pgfPT@builtin=1\relax\textit{Built-in style}\else\textit{User style}\fi\ \textbf{#2}\relax%
\if\pgfPT@preview@cellcontents\@empty\relax%
-\textit{ doesn't exist!}%
+\textit{ doesn't exist!} (\pgfPT@preview@cellcontents)%
\else%
\edef\pgfPT@numlinhas{\csname pgfPT@nlinhas@#2\endcsname}%
\edef\pgfPT@numcolunas{\csname pgfPT@ncolunas@#2\endcsname}%
@@ -204,6 +211,8 @@
\\ [2pt]The build command:\\ \textcolor{green!70!black}{\footnotesize\ppfPT@thebuildcellcom}\\ %
\else\textbf{Using the last cell built}%
\edef\pgfPT@preview@cellcontents{\csname pgfPT@cellcontents@unnamed\endcsname}%
+\let\pgfPT@numlinhas\pgfPT@numlinhas@unnamedcell\let\pgfPT@numcolunas\pgfPT@numcolunas@unnamedcell%
+\let\pgfPT@cell@lineht\pgfPT@cell@lineht@unnamedcell\let\pgfPT@cell@collumnwd\pgfPT@cell@collumnwd@unnamedcell%
\\ [2pt]The build command:\\ \textcolor{green!70!black}{\footnotesize\ppfPT@thebuildcellcom}\\ %
\fi\fi%
\makebox[\linewidth][c]{%
@@ -354,7 +363,7 @@ at (-.5*\pgfPT@cell@collumnwd+\pgfPT@cell@collumnwd*\coluna,\pgfPT@cell@lineht)
% wd -> \pgfPT@<what>@wd
% ht -> \pgfPT@<what>@ht
% and turning the if<what> to true
-% what -> \@pgfPT@<what>rtue
+% what -> \@pgfPT@<what>true
\ifdim\pgfPTcellwd=34pt\relax%
\xdef\pgfPT@loadcell@scaleX{1}%
\else%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.colorSchemes.info.pdf b/graphics/pgf/contrib/pgf-periodictable/pgfPT.colorSchemes.info.pdf
index a621b09057..68481a1175 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.colorSchemes.info.pdf
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.colorSchemes.info.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex
index 0a87ee38dd..b04a4ba5a7 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex
@@ -38,7 +38,8 @@
% spectra: visible range spectral lines
% cor: Physical state color
% --------------------------------------------------------------------------------------------------
-\def\pgfPT@virgula{,\noexpand\hspace{.2ex}}%
+%\def\pgfPT@virgula{,\noexpand\hspace{.2ex}}%
+\def\pgfPT@virgula{,{\hskip.2ex}}% changed in v2.1.5 (to \pgfPT@formatArstar work...)
\def\pgfPT@virgtxt{,\ }%
\def\pgfPT@espaco{\noexpand\hspace{.2ex}}%
\edef\pgfPT@BClabel{\csname pgfPT@labels@BC@\pgfPT@defaultLanguage\endcsname}\relax%
@@ -144,16 +145,16 @@
%
\def\pgfPT@data@i{H/CS,1.008/Ar,[1.0078\noexpand\pgfPT@virgula1.0082]/Arstar,0/radio,53/R,32/Rcov,139.9\noexpand\pgfPT@espaco(1-)/Rion,1312/Ei,2.2/eneg,72.77/eaff,\noexpand\pgfPT@pm1/O,\noexpand\pgfPT@pm I/ORoman,13.99/Tmelt,-259.16/TmeltC,20.271/Tboil,-252.879/TboilC,1/eDist,::1s+1/eConfign,::1s+1/eConfignl,0.08988/d,28.836/Cp,0.1805/kT,hex/ls,470/lsa,470/lsb,340/lsc,0.72/lsca,1766/DiscY,21/DiscC,1/spectra,gasoso/cor}%
\def\pgfPT@data@ii{He/CS,4.0026/Ar,4.0026/Arstar,0/radio,31/R,46/Rcov,---/Rion,2372.3/Ei,---/eneg,0/eaff,---/O,---/ORoman,---/Tmelt,---/TmeltC,4.222/Tboil,-268.928/TboilC,2/eDist,::1s+2/eConfign,::1s+2/eConfignl,0.1786/d,20.786/Cp,0.1513/kT,fcc/ls,424.4/lsa,/lsb,/lsc,/lsca,1895/DiscY,19/DiscC,1/spectra,gasoso/cor}%
-\def\pgfPT@data@iii{Li/CS,6.94/Ar,[6.938\noexpand\pgfPT@virgula6.997] /Arstar,0/radio,167/R,133/Rcov,76\noexpand\pgfPT@espaco(1+)/Rion,520.2/Ei,0.98/eneg,59.63/eaff,+1/O,+I/ORoman,453.65/Tmelt,180.5/TmeltC,1603/Tboil,1330/TboilC,2\noexpand\pgfPTeDistsep1/eDist,[He]::2s+1/eConfign,[He]::2s+1/eConfignl,534/d,24.86/Cp,84.8/kT,bcc/ls,350.93/lsa,/lsb,/lsc,/lsca,1817/DiscY,18/DiscC,1/spectra,solido/cor}%
+\def\pgfPT@data@iii{Li/CS,6.94/Ar,[6.938\noexpand\pgfPT@virgula6.997]/Arstar,0/radio,167/R,133/Rcov,76\noexpand\pgfPT@espaco(1+)/Rion,520.2/Ei,0.98/eneg,59.63/eaff,+1/O,+I/ORoman,453.65/Tmelt,180.5/TmeltC,1603/Tboil,1330/TboilC,2\noexpand\pgfPTeDistsep1/eDist,[He]::2s+1/eConfign,[He]::2s+1/eConfignl,534/d,24.86/Cp,84.8/kT,bcc/ls,350.93/lsa,/lsb,/lsc,/lsca,1817/DiscY,18/DiscC,1/spectra,solido/cor}%
\def\pgfPT@data@iv{Be/CS,9.0122/Ar,9.0122/Arstar,0/radio,112/R,10/Rcov,45\noexpand\pgfPT@espaco(2+)/Rion,899.5/Ei,1.57/eneg,0/eaff,+2/O,+II/ORoman,1560/Tmelt,1287/TmeltC,2742/Tboil,2469/TboilC,2\noexpand\pgfPTeDistsep2/eDist,[He]::2s+2/eConfign,[He]::2s+2/eConfignl,1850/d,16.443/Cp,200/kT,hcp/ls,228.56/lsa,/lsb,358.32/lsc,1.57/lsca,1798/DiscY,5/DiscC,1/spectra,solido/cor}%
-\def\pgfPT@data@v{B/CS,10.81/Ar,[10.806\noexpand\pgfPT@virgula10.821] /Arstar,0/radio,87/R,85/Rcov,27\noexpand\pgfPT@espaco(3+)/Rion,800.6/Ei,2.04/eneg,26.99/eaff,+3/O,+III/ORoman,2349/Tmelt,2076/TmeltC,4200/Tboil,3927/TboilC,2\noexpand\pgfPTeDistsep3/eDist,[He]::2s+2\noexpand\pgfPT@virgula2p+1/eConfign,[He]::2s+2\noexpand\pgfPT@virgula2p+1/eConfignl,2340/d,11.087/Cp,27.4/kT,rho/ls,505.66/lsa,/lsb,/lsc,/lsca,1808/DiscY,7/DiscC,1/spectra,solido/cor}%
+\def\pgfPT@data@v{B/CS,10.81/Ar,[10.806\noexpand\pgfPT@virgula10.821]/Arstar,0/radio,87/R,85/Rcov,27\noexpand\pgfPT@espaco(3+)/Rion,800.6/Ei,2.04/eneg,26.99/eaff,+3/O,+III/ORoman,2349/Tmelt,2076/TmeltC,4200/Tboil,3927/TboilC,2\noexpand\pgfPTeDistsep3/eDist,[He]::2s+2\noexpand\pgfPT@virgula2p+1/eConfign,[He]::2s+2\noexpand\pgfPT@virgula2p+1/eConfignl,2340/d,11.087/Cp,27.4/kT,rho/ls,505.66/lsa,/lsb,/lsc,/lsca,1808/DiscY,7/DiscC,1/spectra,solido/cor}%
\def\pgfPT@data@vi{C/CS,12.011/Ar,[12.009\noexpand\pgfPT@virgula12.012]/Arstar,0/radio,67/R,75/Rcov,16\noexpand\pgfPT@espaco(4+)/Rion,1086.5/Ei,2.55/eneg,121.78/eaff,0\noexpand\pgfPT@virgula\noexpand\pgfPT@pm1\noexpand\pgfPT@virgula\noexpand\pgfPT@pm2\noexpand\pgfPT@virgula\noexpand\pgfPT@pm3\noexpand\pgfPT@virgula\noexpand\pgfPT@pm4/O,0\noexpand\pgfPT@virgula\noexpand\pgfPT@pm I\noexpand\pgfPT@virgula\noexpand\pgfPT@pm II\noexpand\pgfPT@virgula\noexpand\pgfPT@pm III\noexpand\pgfPT@virgula\noexpand\pgfPT@pm IV/ORoman,3823/Tmelt,3550/TmeltC,4300/Tboil,4027/TboilC,2\noexpand\pgfPTeDistsep4/eDist,[He]::2s+2\noexpand\pgfPT@virgula2p+2/eConfign,[He]::2s+2\noexpand\pgfPT@virgula2p+2/eConfignl,2267/d,8.517/Cp,140/kT,hex/ls,246.12/lsa,/lsb,670.79/lsc,2.73/lsca,3750\noexpand\pgfPT@scaletxt{\pgfPTDiscYBCscale}{\noexpand\pgfPT@espaco\noexpand\pgfPT@BClabel}/DiscY,12/DiscC,1/spectra,solido/cor}%
\def\pgfPT@data@vii{N/CS,14.007/Ar,[14.006\noexpand\pgfPT@virgula14.008]/Arstar,0/radio,56/R,71/Rcov,146\noexpand\pgfPT@espaco(3-)\noexpand\pgfPT@virgula16\noexpand\pgfPT@espaco(3+)\noexpand\pgfPT@virgula13\noexpand\pgfPT@espaco(5+)/Rion,1402.3/Ei,3.04/eneg,0/eaff,\noexpand\pgfPT@pm3\noexpand\pgfPT@virgula+4\noexpand\pgfPT@virgula+5/O,\noexpand\pgfPT@pm III\noexpand\pgfPT@virgula+IV\noexpand\pgfPT@virgula+V/ORoman,63.15/Tmelt,-210/TmeltC,77.355/Tboil,-195.795/TboilC,2\noexpand\pgfPTeDistsep5/eDist,[He]::2s+2\noexpand\pgfPT@virgula2p+3/eConfign,[He]::2s+2\noexpand\pgfPT@virgula2p+3/eConfignl,1.251/d,29.124/Cp,0.02583/kT,hex/ls,386.1/lsa,386.1/lsb,626.5/lsc,1.62/lsca,1772/DiscY,21/DiscC,1/spectra,gasoso/cor}%
\def\pgfPT@data@viii{O/CS,15.999/Ar,[15.999\noexpand\pgfPT@virgula16.000]/Arstar,0/radio,48/R,63/Rcov,140\noexpand\pgfPT@espaco(2-)/Rion,1313.9/Ei,3.44/eneg,140.98/eaff,--2/O,--II/ORoman,54.36/Tmelt,-218.79/TmeltC,90.188/Tboil,-182.962/TboilC,2\noexpand\pgfPTeDistsep6/eDist,[He]::2s+2\noexpand\pgfPT@virgula2p+4/eConfign,[He]::2s+2\noexpand\pgfPT@virgula2p+4/eConfignl,1.429/d,29.378/Cp,0.02658/kT,mono/ls,540.3/lsa,342.9/lsb,508.6/lsc,0.94/lsca,1771/DiscY,19/DiscC,1/spectra,gasoso/cor}%
\def\pgfPT@data@ix{F/CS,18.998/Ar,18.998/Arstar,0/radio,42/R,64/Rcov,133\noexpand\pgfPT@espaco(1-)/Rion,1681/Ei,3.98/eneg,328.16/eaff,--1/O,--I/ORoman,53.48/Tmelt,-219.67/TmeltC,85.04/Tboil,-188.11/TboilC,2\noexpand\pgfPTeDistsep7/eDist,[He]::2s+2\noexpand\pgfPT@virgula2p+5/eConfign,[He]::2s+2\noexpand\pgfPT@virgula2p+5/eConfignl,1.7/d,31.304/Cp,0.0277/kT,mono/ls,550/lsa,328/lsb,728/lsc,1.32/lsca,1886/DiscY,5/DiscC,1/spectra,gasoso/cor}%
\def\pgfPT@data@x{Ne/CS,20.18/Ar,20.18/Arstar,0/radio,38/R,67/Rcov,---/Rion,2080.7/Ei,---/eneg,0/eaff,---/O,---/ORoman,24.56/Tmelt,-248.59/TmeltC,27.104/Tboil,-246.046/TboilC,2\noexpand\pgfPTeDistsep8/eDist,[He]::2s+2\noexpand\pgfPT@virgula2p+6/eConfign,[He]::2s+2\noexpand\pgfPT@virgula2p+6/eConfignl,0.9002/d,20.786/Cp,0.0491/kT,fcc/ls,442.9/lsa,/lsb,/lsc,/lsca,1898/DiscY,21/DiscC,1/spectra,gasoso/cor}%
\def\pgfPT@data@xi{Na/CS,22.99/Ar,22.99/Arstar,0/radio,190/R,155/Rcov,102\noexpand\pgfPT@espaco(1+)/Rion,495.8/Ei,0.93/eneg,52.87/eaff,+1/O,+I/ORoman,370.944/Tmelt,97.794/TmeltC,1156.09/Tboil,882.94/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep1/eDist,[Ne]::3s+1/eConfign,[Ne]::3s+1/eConfignl,968/d,28.23/Cp,142/kT,bcc/ls,429.06/lsa,/lsb,/lsc,/lsca,1807/DiscY,21/DiscC,1/spectra,solido/cor}%
-\def\pgfPT@data@xii{Mg/CS,24.305/Ar,[24.304\noexpand\pgfPT@virgula24.307] /Arstar,0/radio,145/R,139/Rcov,72\noexpand\pgfPT@espaco(2+)/Rion,737.7/Ei,1.31/eneg,0/eaff,+2/O,+II/ORoman,923/Tmelt,650/TmeltC,1363/Tboil,1090/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep2/eDist,[Ne]::3s+2/eConfign,[Ne]::3s+2/eConfignl,1738/d,24.869/Cp,156/kT,hcp/ls,320.94/lsa,/lsb,521.05/lsc,1.62/lsca,1755/DiscY,21/DiscC,1/spectra,solido/cor}%
+\def\pgfPT@data@xii{Mg/CS,24.305/Ar,[24.304\noexpand\pgfPT@virgula24.307]/Arstar,0/radio,145/R,139/Rcov,72\noexpand\pgfPT@espaco(2+)/Rion,737.7/Ei,1.31/eneg,0/eaff,+2/O,+II/ORoman,923/Tmelt,650/TmeltC,1363/Tboil,1090/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep2/eDist,[Ne]::3s+2/eConfign,[Ne]::3s+2/eConfignl,1738/d,24.869/Cp,156/kT,hcp/ls,320.94/lsa,/lsb,521.05/lsc,1.62/lsca,1755/DiscY,21/DiscC,1/spectra,solido/cor}%
\def\pgfPT@data@xiii{Al/CS,26.982/Ar,26.982/Arstar,0/radio,118/R,126/Rcov,53.5\noexpand\pgfPT@espaco(3+)/Rion,577.5/Ei,1.61/eneg,41.76/eaff,+3/O,+III/ORoman,933.47/Tmelt,660.32/TmeltC,2743/Tboil,2470/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep3/eDist,[Ne]::3s+2\noexpand\pgfPT@virgula3p+1/eConfign,[Ne]::3s+2\noexpand\pgfPT@virgula3p+1/eConfignl,2700/d,24.2/Cp,237/kT,fcc/ls,404.95/lsa,/lsb,/lsc,/lsca,1824/DiscY,2/DiscC,1/spectra,solido/cor}%
\def\pgfPT@data@xiv{Si/CS,28.085/Ar,[28.084\noexpand\pgfPT@virgula28.086]/Arstar,0/radio,111/R,116/Rcov,40\noexpand\pgfPT@espaco(4+)/Rion,786.5/Ei,1.9/eneg,134.07/eaff,\noexpand\pgfPT@pm4/O,\noexpand\pgfPT@pm IV/ORoman,1687/Tmelt,1414/TmeltC,3538/Tboil,3265/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep4/eDist,[Ne]::3s+2\noexpand\pgfPT@virgula3p+2/eConfign,[Ne]::3s+2\noexpand\pgfPT@virgula3p+2/eConfignl,2330/d,19.789/Cp,149/kT,dia/ls,543.095/lsa,/lsb,/lsc,/lsca,1823/DiscY,18/DiscC,1/spectra,solido/cor}%
\def\pgfPT@data@xv{P/CS,30.974/Ar,30.974/Arstar,0/radio,98/R,111/Rcov,212\noexpand\pgfPT@espaco(3-)\noexpand\pgfPT@virgula44\noexpand\pgfPT@espaco(3+)\noexpand\pgfPT@virgula38\noexpand\pgfPT@espaco(5+)/Rion,1011.8/Ei,2.19/eneg,72.04/eaff,\noexpand\pgfPT@pm3\noexpand\pgfPT@virgula+5/O,\noexpand\pgfPT@pm III\noexpand\pgfPT@virgula+V/ORoman,317.3/Tmelt,44.15/TmeltC,550/Tboil,277/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep5/eDist,[Ne]::3s+2\noexpand\pgfPT@virgula3p+3/eConfign,[Ne]::3s+2\noexpand\pgfPT@virgula3p+3/eConfignl,1823/d,23.824/Cp,0.236/kT,tric/ls,1145/lsa,550.3/lsb,1126.1/lsc,0.98/lsca,1669/DiscY,8/DiscC,1/spectra,solido/cor}%
@@ -202,7 +203,7 @@
\def\pgfPT@data@lviii{Ce/CS,140.12/Ar,140.12/Arstar,0/radio,210/R,163/Rcov,101\noexpand\pgfPT@espaco(3+)\noexpand\pgfPT@virgula87\noexpand\pgfPT@espaco(4+)/Rion,534.4/Ei,1.12/eneg,55/eaff,+3\noexpand\pgfPT@virgula+4/O,+III\noexpand\pgfPT@virgula+IV/ORoman,1068/Tmelt,795/TmeltC,3716/Tboil,3443/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep18\noexpand\pgfPTeDistsep19\noexpand\pgfPTeDistsep9\noexpand\pgfPTeDistsep2/eDist,[Xe]::4f+1\noexpand\pgfPT@virgula5d+1\noexpand\pgfPT@virgula6s+2/eConfign,[Xe]::6s+2\noexpand\pgfPT@virgula4f+1\noexpand\pgfPT@virgula5d+1/eConfignl,6770/d,26.94/Cp,11.3/kT,hex/ls,362/lsa,/lsb,599/lsc,1.65/lsca,1803/DiscY,9/DiscC,1/spectra,solido/cor}%
\def\pgfPT@data@lix{Pr/CS,140.91/Ar,140.91/Arstar,0/radio,247/R,17/Rcov,99\noexpand\pgfPT@espaco(3+)/Rion,527/Ei,1.13/eneg,10.54/eaff,+3/O,+III/ORoman,1208/Tmelt,935/TmeltC,3403/Tboil,3130/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep18\noexpand\pgfPTeDistsep21\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep2/eDist,[Xe]::4f+3\noexpand\pgfPT@virgula6s+2/eConfign,[Xe]::6s+2\noexpand\pgfPT@virgula4f+3/eConfignl,6770/d,27.2/Cp,12.5/kT,hex/ls,367.21/lsa,/lsb,1183.26/lsc,3.22/lsca,1885/DiscY,1/DiscC,1/spectra,solido/cor}%
\def\pgfPT@data@lx{Nd/CS,144.24/Ar,144.24/Arstar,0/radio,206/R,17/Rcov,98.3\noexpand\pgfPT@espaco(3+)/Rion,533.1/Ei,1.14/eneg,9.41/eaff,+3/O,+III/ORoman,1297/Tmelt,1024/TmeltC,3347/Tboil,3074/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep18\noexpand\pgfPTeDistsep22\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep2/eDist,[Xe]::4f+4\noexpand\pgfPT@virgula6s+2/eConfign,[Xe]::6s+2\noexpand\pgfPT@virgula4f+4/eConfignl,7010/d,27.45/Cp,16.5/kT,hex/ls,365.82/lsa,/lsb,1179.66/lsc,3.22/lsca,1885/DiscY,1/DiscC,1/spectra,solido/cor}%
-\def\pgfPT@data@lxi{Pm/CS,[145]/Ar,[145]/Arstar,1/radio,205/R,173/Rcov,97\noexpand\pgfPT@espaco(3+)/Rion,540/Ei,1.13/eneg,12.45/eaff,+3/O,+III/ORoman,1315/Tmelt,1042/TmeltC,3273/Tboil,3000/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep18\noexpand\pgfPTeDistsep23\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep2/eDist,[Xe]::4f+5\noexpand\pgfPT@virgula6s+2/eConfign,[Xe]::6s+2\noexpand\pgfPT@virgula4f+5/eConfignl,7260/d,---/Cp,17.9/kT,hex/ls,365/lsa,/lsb,1165/lsc,3.19/lsca,1945/DiscY,22/DiscC,1/spectra,sintetico/cor}%
+\def\pgfPT@data@lxi{Pm/CS,[145]/Ar,/Arstar,1/radio,205/R,173/Rcov,97\noexpand\pgfPT@espaco(3+)/Rion,540/Ei,1.13/eneg,12.45/eaff,+3/O,+III/ORoman,1315/Tmelt,1042/TmeltC,3273/Tboil,3000/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep18\noexpand\pgfPTeDistsep23\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep2/eDist,[Xe]::4f+5\noexpand\pgfPT@virgula6s+2/eConfign,[Xe]::6s+2\noexpand\pgfPT@virgula4f+5/eConfignl,7260/d,---/Cp,17.9/kT,hex/ls,365/lsa,/lsb,1165/lsc,3.19/lsca,1945/DiscY,22/DiscC,1/spectra,sintetico/cor}%
\def\pgfPT@data@lxii{Sm/CS,150.36/Ar,150.36(2)/Arstar,0/radio,238/R,172/Rcov,95.8\noexpand\pgfPT@espaco(3+)/Rion,544.5/Ei,1.17/eneg,15.63/eaff,+3/O,+III/ORoman,1345/Tmelt,1072/TmeltC,2173/Tboil,1900/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep18\noexpand\pgfPTeDistsep24\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep2/eDist,[Xe]::4f+6\noexpand\pgfPT@virgula6s+2/eConfign,[Xe]::6s+2\noexpand\pgfPT@virgula4f+6/eConfignl,7520/d,29.54/Cp,13.3/kT,rho/ls,362.1/lsa,/lsb,2625/lsc,7.25/lsca,1879/DiscY,5/DiscC,1/spectra,solido/cor}%
\def\pgfPT@data@lxiii{Eu/CS,151.96/Ar,151.96/Arstar,0/radio,231/R,168/Rcov,117\noexpand\pgfPT@espaco(2+)\noexpand\pgfPT@virgula94.7\noexpand\pgfPT@espaco(3+)/Rion,547.1/Ei,1.2/eneg,11.2/eaff,+2\noexpand\pgfPT@virgula+3/O,+II\noexpand\pgfPT@virgula+III/ORoman,1099/Tmelt,826/TmeltC,1802/Tboil,1529/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep18\noexpand\pgfPTeDistsep25\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep2/eDist,[Xe]::4f+7\noexpand\pgfPT@virgula6s+2/eConfign,[Xe]::6s+2\noexpand\pgfPT@virgula4f+7/eConfignl,5244/d,27.66/Cp,13.9/kT,bcc/ls,458.1/lsa,/lsb,/lsc,/lsca,1901/DiscY,5/DiscC,1/spectra,solido/cor}%
\def\pgfPT@data@lxiv{Gd/CS,157.25/Ar,157.25(3)/Arstar,0/radio,233/R,169/Rcov,93.5\noexpand\pgfPT@espaco(3+)/Rion,593.4/Ei,1.2/eneg,13.22/eaff,+3/O,+III/ORoman,1585/Tmelt,1312/TmeltC,3273/Tboil,3000/TboilC,2\noexpand\pgfPTeDistsep8\noexpand\pgfPTeDistsep18\noexpand\pgfPTeDistsep25\noexpand\pgfPTeDistsep9\noexpand\pgfPTeDistsep2/eDist,[Xe]::4f+7\noexpand\pgfPT@virgula5d+1\noexpand\pgfPT@virgula6s+2/eConfign,[Xe]::6s+2\noexpand\pgfPT@virgula4f+7\noexpand\pgfPT@virgula5d+1/eConfignl,7900/d,37.03/Cp,10.6/kT,hcp/ls,363.6/lsa,/lsb,578.26/lsc,1.59/lsca,1880/DiscY,20/DiscC,1/spectra,solido/cor}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
index 8406d1a9a7..4b835ce7e2 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
@@ -86,6 +86,9 @@ show group numbers/.is if=pgfPTgrlabels,%
show legend pins/.is if=pgfPTlegendapins,%
show legend/.is if=pgfPTlegenda,%
legend acronyms/.is if=pgfPTlegacro,%
+legend acronyms font size/.get=\pgfPTlegendacrofontsize,% new in v2.1.5
+legend acronyms font size/.store in=\pgfPTlegendacrofontsize,%
+legend acronyms font size/.default=\pgfPT@doc@fsize,%
legend back color/.get=\pgfPTlegendbackcolor,%
legend back color/.store in=\pgfPTlegendbackcolor,%
legend back color/.default=white,%
@@ -119,7 +122,7 @@ title/.code=\pgfPT@titlestyle{#1},%
title/.default={f=\Large\bfseries,c=black}%
}%
% setting key with default value -----------------------------------------------------------------
-\pgfkeys{/pgfPerTable/.cd,show title,show period numbers,show group numbers,show legend,legend acronyms,legend back color,%
+\pgfkeys{/pgfPerTable/.cd,show title,show period numbers,show group numbers,show legend,legend acronyms,legend acronyms font size,legend back color,%
show legend pins,show extra legend,legend radio color,legend CS color,legend Z color,show blocks=false,show families=false,%
show MNM line,show periodic variations=false,show label LaAc,title font,title color}%
% «mixed styles»
@@ -342,6 +345,20 @@ CS/.default={r=fill and outline,c=black,w=.05,f=\small\bfseries,s=solido,l=liqui
\pgfkeys{/pgfPerTable/.cd,CS font,CS render mode,CS outline color,CS outline width}%
% end !! PGF keys: style for the chemical symbol of the element --------------------------------
%
+% --------------------------------------------------------------------------------------------------
+% defining PGF keys: decimal separator to use in numerical values ----------------------------
+% new in v2.1.5
+\pgfkeys{/pgfPerTable/.cd,%
+decimal separator/.get=\pgfPTdecimalseparator,%
+decimal separator/.store in=\pgfPTdecimalseparator,%
+decimal separator/.default=.,%
+comma separator/.style={decimal separator={,}},%
+dot separator/.style={decimal separator=.}%
+}%
+% setting key with default value ------------------------------------------------------------------
+\pgfkeys{/pgfPerTable/.cd,decimal separator}%
+% end !! PGF keys: decimal separator to use in numerical values -------------------------------
+%
% setting the style for the atomic number box -----------------------------------------------------
\newif\ifpgfZuseboxwidth%
\pgfkeys{/pgfPerTable/.cd,%
@@ -376,7 +393,7 @@ name color/.store in=\pgfPTnamecolor,%
name color/.default=black,%
name font/.get=\pgfPTnamefont,%
name font/.store in=\pgfPTnamefont,%
-name font/.default=\fontseries{l}\selectfont\tiny,%
+name font/.default=\tiny,% \fontseries{l}\selectfont (removed @ v2.1.2)
name align/.get=\pgfPTnamealign,% new v1.0.0
name align/.store in=\pgfPTnamealign,% left|center|right
name align/.default=center%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.formatNumbers.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.formatNumbers.tex
index 1220d5c229..4a0ff1a907 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.formatNumbers.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.formatNumbers.tex
@@ -20,8 +20,15 @@
% \pgfPT@formatnumber{decimal places}{number}
\def\pgfPT@formatnumber#1#2{%
\ifx#2\@empty\relax\else%
-\ifnum#1=-1\relax#2% print the number as-is
-\else%
+%\ifnum#1=-1\relax#2% print the number as-is
+\ifnum#1=-1\relax% print the number as-is -> changed in v2.1.5
+\ifx\pgfPTdecimalseparator\pgfPT@dot\relax#2\else% replace . by user decimal separator
+\pgfPT@counta=0\pgfPT@countb=0\pgfPT@countc=0\pgfPT@countd=0\pgfPT@tempfalse\pgfPT@foundfalse%
+\edef\pgfPT@digits@todot{}\edef\pgfPT@digits@afterdot{}\pgfPT@has@minus{#2}%
+\expandafter\pgfPT@numberdecompose\pgfPT@thenum\relax\relax%
+\ifpgfPT@found\expandafter\pgfPT@replaceDot#2\relax\else#2\fi%
+\fi% end replacing . by user decimal separator
+\else% format number to the #1 decimal places
\pgfPT@counta=0\pgfPT@countb=0\pgfPT@countc=0\pgfPT@countd=0\pgfPT@tempfalse\pgfPT@foundfalse%
\edef\pgfPT@digits@todot{}\edef\pgfPT@digits@afterdot{}%
\pgfPT@has@minus{#2}%
@@ -36,7 +43,8 @@
\pgfPT@counte=#1%
\pgfPT@temptrue\expandafter\pgfPT@str@insertdot\pgfPT@digits@toround\relax%
\fi%
-{\pgfPT@num@sign\pgfPT@digits@todot\ifnum#1>0\relax\ifpgfPT@found.\fi\fi\pgfPT@digits@afterdot}%
+%{\pgfPT@num@sign\pgfPT@digits@todot\ifnum#1>0\relax\ifpgfPT@found.\fi\fi\pgfPT@digits@afterdot}%
+{\pgfPT@num@sign\pgfPT@digits@todot\ifnum#1>0\relax\ifpgfPT@found\pgfPTdecimalseparator\fi\fi\pgfPT@digits@afterdot}% changed 1n v2.1.5
\fi\fi%
}%
% --------------------------------------------------------------------------------------------------
@@ -206,4 +214,16 @@
\ifx\pgfPT@tmp\pgfPT@relax\relax\else\@pgfPT@str@len#2 \relax\fi%
}%
% --------------------------------------------------------------------------------------------------
+\def\pgfPT@replaceDot#1.#2\relax{#1\pgfPTdecimalseparator#2}% new in v2.15
+% --------------------------------------------------------------------------------------------------
+\def\pgfPT@formatArstar#1\relax{% new in v2.15
+\setbox0=\hbox{#1}\ifdim\wd0=0pt\relax\relax% no value for Arstar
+\else\expandafter\@pgfPT@formatArstar#1\relax\fi}%
+\def\@pgfPT@formatArstar#1#2\relax{\edef\@pgfPT@sb{[}\edef\@pgfPT@test{#1}%
+\ifx\@pgfPT@sb\@pgfPT@test\relax% Arstar is [value1,value2]
+\def\@pgfPT@Arstarreplacedot[##1.##2,##3.##4]\relax{[##1\pgfPTdecimalseparator##2;##3\pgfPTdecimalseparator##4]}%
+\expandafter\@pgfPT@Arstarreplacedot#1#2\relax\relax%
+\else% Arstar is a number
+\expandafter\pgfPT@replaceDot#1#2\relax\relax%
+\fi}%
\endinput%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
index 2c321dcd34..b171210b3e 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
@@ -27,7 +27,7 @@
\def\pgfPT@nomes@iii{l\'{i}tio/pt,lithium/en,lithium/fr,Lithium/de,litio/it,litio/es,l\'{i}tio/br,\pgfPT@user@CSname@Li/user}%
\def\pgfPT@nomes@iv{ber\'{i}lio/pt,beryllium/en,b\'{e}ryllium/fr,Beryllium/de,berillio/it,berilio/es,ber\'{i}lio/br,\pgfPT@user@CSname@Be/user}%
\def\pgfPT@nomes@v{boro/pt,boron/en,bore/fr,Bor/de,boro/it,boro/es,boro/br,\pgfPT@user@CSname@B/user}%
-\def\pgfPT@nomes@vi{carbono/pt,carbon/en,carbone/fr,Kohlenstoff/de,carbonio/it,carb\'{o}n/es,carbono/br,\pgfPT@user@CSname@C/user}%
+\def\pgfPT@nomes@vi{carbono/pt,carbon/en,carbone/fr,Kohlenstoff/de,carbonio/it,carbono/es,carbono/br,\pgfPT@user@CSname@C/user}%
\def\pgfPT@nomes@vii{azoto/pt,nitrogen/en,azote/fr,Stickstoff/de,azoto/it,nitr\'{o}geno/es,nitrog\^{e}nio/br,\pgfPT@user@CSname@N/user}%
\def\pgfPT@nomes@viii{oxig\'{e}nio/pt,oxygen/en,oxyg\`{e}ne/fr,Sauerstoff/de,ossigeno/it,ox\'{i}geno/es,oxig\^{e}nio/br,\pgfPT@user@CSname@O/user}%
\def\pgfPT@nomes@ix{fl\'{u}or/pt,fluorine/en,fluor/fr,Fluor/de,fluoro/it,fl\'{u}or/es,fl\'{u}or/br,\pgfPT@user@CSname@F/user}%
@@ -47,7 +47,7 @@
\def\pgfPT@nomes@xxiii{van\'{a}dio/pt,vanadium/en,vanadium/fr,Vanadium/de,vanadio/it,vanadio/es,van\'{a}dio/br,\pgfPT@user@CSname@V/user}%
\def\pgfPT@nomes@xxiv{cr\'{o}mio/pt,chromium/en,chrome/fr,Chrom/de,cromo/it,cromo/es,cr\^{o}mio/br,\pgfPT@user@CSname@Cr/user}%
\def\pgfPT@nomes@xxv{mangan\'{e}sio/pt,manganese/en,mangan\`{e}se/fr,Mangan/de,manganese/it,manganeso/es,mangan\^{e}s/br,\pgfPT@user@CSname@Mn/user}%
-\def\pgfPT@nomes@xxvi{ferro/pt,iron/en,fer/fr,Eisen/de,ferro/it,planchar/es,ferro/br,\pgfPT@user@CSname@Fe/user}%
+\def\pgfPT@nomes@xxvi{ferro/pt,iron/en,fer/fr,Eisen/de,ferro/it,hierro/es,ferro/br,\pgfPT@user@CSname@Fe/user}%
\def\pgfPT@nomes@xxvii{cobalto/pt,cobalt/en,cobalt/fr,Kobalt/de,cobalto/it,cobalto/es,cobalto/br,\pgfPT@user@CSname@Co/user}%
\def\pgfPT@nomes@xxviii{n\'{i}quel/pt,nickel/en,nickel/fr,Nickel/de,nichel/it,n\'{i}quel/es,n\'{i}quel/br,\pgfPT@user@CSname@Ni/user}%
\def\pgfPT@nomes@xxix{cobre/pt,copper/en,cuivre/fr,Kupfer/de,rame/it,cobre/es,cobre/br,\pgfPT@user@CSname@Cu/user}%
@@ -82,7 +82,7 @@
\def\pgfPT@nomes@lviii{c\'{e}rio/pt,cerium/en,c\'{e}rium/fr,Cer/de,cerio/it,cerio/es,c\'{e}rio/br,\pgfPT@user@CSname@Ce/user}%
\def\pgfPT@nomes@lix{praseod\'{i}mio/pt,praseodymium/en,pras\'{e}odyme/fr,Praseodym/de,praseodimio/it,praseodimio/es,praseod\'{i}mio/br,\pgfPT@user@CSname@Pr/user}%
\def\pgfPT@nomes@lx{neod\'{i}mio/pt,neodymium/en,n\'{e}odyme/fr,Neodym/de,neodimio/it,neodimio/es,neod\'{i}mio/br,\pgfPT@user@CSname@Nd/user}%
-\def\pgfPT@nomes@lxi{prom\'{e}cio/pt,promethium/en,prom\'{e}thium/fr,Promethium/de,prometeo/it,prometeo/es,prom\'{e}cio/br,\pgfPT@user@CSname@Pm/user}%
+\def\pgfPT@nomes@lxi{prom\'{e}cio/pt,promethium/en,prom\'{e}thium/fr,Promethium/de,prometeo/it,prometio/es,prom\'{e}cio/br,\pgfPT@user@CSname@Pm/user}%
\def\pgfPT@nomes@lxii{sam\'{a}rio/pt,samarium/en,samarium/fr,Samarium/de,samario/it,samario/es,sam\'{a}rio/br,\pgfPT@user@CSname@Sm/user}%
\def\pgfPT@nomes@lxiii{eur\'{o}pio/pt,europium/en,europium/fr,Europium/de,europium/it,europio/es,eur\'{o}pio/br,\pgfPT@user@CSname@Eu/user}%
\def\pgfPT@nomes@lxiv{gadol\'{i}nio/pt,gadolinium/en,gadolinium/fr,Gadolinium/de,gadolinio/it,gadolinio/es,gadol\'{i}nio/br,\pgfPT@user@CSname@Gd/user}%
@@ -121,23 +121,23 @@
\def\pgfPT@nomes@xcvii{berqu\'{e}lio/pt,berkelium/en,berkelium/fr,Berkelium/de,berkelium/it,berkelio/es,berqu\'{e}lio/br,\pgfPT@user@CSname@Bk/user}%
\def\pgfPT@nomes@xcviii{calif\'{o}rnio/pt,californium/en,californium/fr,Californium/de,californio/it,californio/es,calif\'{o}rnio/br,\pgfPT@user@CSname@Cf/user}%
\def\pgfPT@nomes@xcix{einst\'{e}nio/pt,einsteinium/en,einsteinium/fr,Einsteinium/de,einsteinio/it,einstenio/es,einst\^{e}nio/br,\pgfPT@user@CSname@Es/user}%
-\def\pgfPT@nomes@c{f\'{e}rmio/pt,fermium/en,fermium/fr,Rermium/de,fermium/it,fermio/es,f\'{e}rmio/br,\pgfPT@user@CSname@Fm/user}%
+\def\pgfPT@nomes@c{f\'{e}rmio/pt,fermium/en,fermium/fr,Fermium/de,fermium/it,fermio/es,f\'{e}rmio/br,\pgfPT@user@CSname@Fm/user}%
\def\pgfPT@nomes@ci{mendel\'{e}vio/pt,mendelevium/en,mendelevium/fr,Mendelevium/de,mendelevio/it,mendelevio/es,mendel\'{e}vio/br,\pgfPT@user@CSname@Md/user}%
\def\pgfPT@nomes@cii{nob\'{e}lio/pt,nobelium/en,nobelium/fr,Nobelium/de,nobelium/it,nobelio/es,nob\'{e}lio/br,\pgfPT@user@CSname@No/user}%
-\def\pgfPT@nomes@ciii{laur\^{e}ncio/pt,lawrencium/en,lawrencium/fr,Lawrencium/de,laurenzio/it,lawrencium/es,laur\^{e}ncio/br,\pgfPT@user@CSname@Lr/user}%
+\def\pgfPT@nomes@ciii{laur\^{e}ncio/pt,lawrencium/en,lawrencium/fr,Lawrencium/de,laurenzio/it,lawrencio/es,laur\^{e}ncio/br,\pgfPT@user@CSname@Lr/user}%
\def\pgfPT@nomes@civ{rutherf\'{o}rdio/pt,rutherfordium/en,rutherfordium/fr,Rutherfordium/de,rutherfordium/it,rutherfordio/es,rutherf\'{o}rdio/br,\pgfPT@user@CSname@Rf/user}%
-\def\pgfPT@nomes@cv{d\'{u}bnio/pt,dubnium/en,dubnium/fr,Dubnium/de,dubnio/it,dubnium/es,d\'{u}bnio/br,\pgfPT@user@CSname@Db/user}%
+\def\pgfPT@nomes@cv{d\'{u}bnio/pt,dubnium/en,dubnium/fr,Dubnium/de,dubnio/it,dubnio/es,d\'{u}bnio/br,\pgfPT@user@CSname@Db/user}%
\def\pgfPT@nomes@cvi{seab\'{o}rgio/pt,seaborgium/en,seaborgium/fr,Seaborgium/de,seaborgio/it,seaborgio/es,seab\'{o}rgio/br,\pgfPT@user@CSname@Sg/user}%
-\def\pgfPT@nomes@cvii{b\'{o}rio/pt,bohrium/en,bohrium/fr,Bohrium/de,bohrio/it,bohrium/es,b\'{o}hrio/br,\pgfPT@user@CSname@Bh/user}%
-\def\pgfPT@nomes@cviii{h\'{a}ssio/pt,hassium/en,hassium/fr,Hassium/de,hassio/it,hassium/es,h\'{a}ssio/br,\pgfPT@user@CSname@Hs/user}%
+\def\pgfPT@nomes@cvii{b\'{o}rio/pt,bohrium/en,bohrium/fr,Bohrium/de,bohrio/it,bohrio/es,b\'{o}hrio/br,\pgfPT@user@CSname@Bh/user}%
+\def\pgfPT@nomes@cviii{h\'{a}ssio/pt,hassium/en,hassium/fr,Hassium/de,hassio/it,hasio/es,h\'{a}ssio/br,\pgfPT@user@CSname@Hs/user}%
\def\pgfPT@nomes@cix{meitn\'{e}rio/pt,meitnerium/en,meitnerium/fr,Meitnerium/de,meitnerio/it,meitnerio/es,meitn\'{e}rio/br,\pgfPT@user@CSname@Mt/user}%
-\def\pgfPT@nomes@cx{darmst\'{a}dio/pt,darmstadtium/en,darmstadtium/fr,Darmstadtium/de,darmstadtium/it,darmstadtium/es,darmst\'{a}dtio/br,\pgfPT@user@CSname@Ds/user}%
+\def\pgfPT@nomes@cx{darmst\'{a}dio/pt,darmstadtium/en,darmstadtium/fr,Darmstadtium/de,darmstadtium/it,darmstatio/es,darmst\'{a}dtio/br,\pgfPT@user@CSname@Ds/user}%
\def\pgfPT@nomes@cxi{roentg\'{e}nio/pt,roentgenium/en,roentgenium/fr,R\"{o}ntgenium/de,roentgenio/it,roentgenio/es,roentg\^{e}nio/br,\pgfPT@user@CSname@Rg/user}%
\def\pgfPT@nomes@cxii{copern\'{i}cio/pt,copernicium/en,copernicium/fr,Copernicium/de,copernicium/it,copernicio/es,copern\'{i}cio/br,\pgfPT@user@CSname@Cn/user}%
\def\pgfPT@nomes@cxiii{nip\'{o}nio/pt,nihonium/en,nihonium/fr,Nihonium/de,nihonium/it,nihonio/es,nip\^{o}nio/br,\pgfPT@user@CSname@Nh/user}%
\def\pgfPT@nomes@cxiv{fler\'{o}vio/pt,flerovium/en,flerovium/fr,Flerovium/de,flerovio/it,flerovio/es,fler\'{o}vio/br,\pgfPT@user@CSname@Fl/user}%
\def\pgfPT@nomes@cxv{mosc\'{o}vio/pt,moscovium/en,moscovium/fr,Moscovium/de,moscovium/it,moscovio/es,mosc\'{o}vio/br,\pgfPT@user@CSname@Mc/user}%
-\def\pgfPT@nomes@cxvi{liverm\'{o}rio/pt,livermorium/en,livermorium/fr,Livermorium/de,livermorio/it,livermorium/es,liverm\'{o}rio/br,\pgfPT@user@CSname@Lv/user}%
+\def\pgfPT@nomes@cxvi{liverm\'{o}rio/pt,livermorium/en,livermorium/fr,Livermorium/de,livermorio/it,livermorio/es,liverm\'{o}rio/br,\pgfPT@user@CSname@Lv/user}%
\def\pgfPT@nomes@cxvii{tenesso/pt,tennessine/en,tennessine/fr,Tenness/de,tennessine/it,teneso/es,tenesso/br,\pgfPT@user@CSname@Ts/user}%
\def\pgfPT@nomes@cxviii{ogan\'{e}sson/pt,oganesson/en,oganesson/fr,Oganesson/de,oganesson/it,oganes\'{o}n/es,oganess\^{o}nio/br,\pgfPT@user@CSname@Og/user}%
\endinput%
diff --git a/graphics/pgf/contrib/pgf-periodictable/translations/pgfPT.lang.zh.tex b/graphics/pgf/contrib/pgf-periodictable/translations/pgfPT.lang.zh.tex
new file mode 100644
index 0000000000..afbb70e089
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/translations/pgfPT.lang.zh.tex
@@ -0,0 +1,269 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% --------------------------------------------------------------------------------------------------
+% subfile of pgf-PeriodicTable package ----------------------------------------------------------
+% --------------------------------------------------------------------------------------------------
+%
+% Translation file for Chinese
+% Author: Fan Hongtao @2024/10/03
+%
+% --------------------------------------------------------------------------------------------------
+% This is file lang.zh.tex
+% Version: 1
+% Revision: 0
+% Date: 2024/10/03
+% Provides translation of data used
+% in pgf-PeriodicTable files
+% Language: Chinese
+% ISO 639-1 code: zh
+% ----------------------------
+\def\pgfPT@user@labels@titulo{元素周期表}%
+% ----------------------------
+\def\pgfPT@user@labels@La{镧系元素}%
+\def\pgfPT@user@labels@Ac{锕系元素}%
+% ----------------------------
+\def\pgfPT@user@labels@solido{固æ€}%
+\def\pgfPT@user@labels@liquido{液æ€}%
+\def\pgfPT@user@labels@gasoso{æ°”æ€}%
+\def\pgfPT@user@labels@sintetico{人造}%
+% ----------------------------
+% labels for legend
+\def\pgfPT@user@labels@Z{原å­åºæ•°}%
+\def\pgfPT@user@labels@name{元素å称}%
+\def\pgfPT@user@labels@CS{元素符å·}%
+\def\pgfPT@user@labels@Ar@m{相对原å­è´¨é‡}%
+\def\pgfPT@user@labels@Arstar@m{标准相对原å­è´¨é‡}%
+\def\pgfPT@user@labels@Ar@w{原å­é‡}%
+\def\pgfPT@user@labels@Arstar@w{原å­é‡}%
+\def\pgfPT@user@labels@radio{放射性}%
+\def\pgfPT@user@labels@R{原å­åŠå¾„}%
+\def\pgfPT@user@labels@Rcov{共价åŠå¾„}%
+\def\pgfPT@user@labels@Rion{离å­åŠå¾„}%
+\def\pgfPT@user@labels@Ei{电离能}%
+\def\pgfPT@user@labels@eneg{电负性}%
+\def\pgfPT@user@labels@eaff{电亲和性}%
+\def\pgfPT@user@labels@O{氧化æ€}%
+\def\pgfPT@user@labels@Tmelt{熔点}%
+\def\pgfPT@user@labels@TmeltC{熔点}%
+\def\pgfPT@user@labels@Tboil{沸点}%
+\def\pgfPT@user@labels@TboilC{沸点}%
+\def\pgfPT@user@labels@eDist{电å­åˆ†å¸ƒ}%
+\def\pgfPT@user@labels@eConfig{电å­æž„åž‹}%
+\def\pgfPT@user@labels@d{密度}%
+\def\pgfPT@user@labels@Cp{比热容}%
+\def\pgfPT@user@labels@kT{导热系数}%
+\def\pgfPT@user@labels@ls{晶格结构}%
+\def\pgfPT@user@labels@lsa{晶格常数: a}%
+\def\pgfPT@user@labels@lsb{晶格常数: b}%
+\def\pgfPT@user@labels@lsc{晶格常数: c}%
+\def\pgfPT@user@labels@lsca{晶格c/a比}%
+\def\pgfPT@user@labels@DiscY{å‘现年份}%
+% Before Christ acronym:
+\def\pgfPT@user@labels@BC{公元å‰}%
+\def\pgfPT@user@labels@DiscC{å‘现国}%
+\def\pgfPT@user@labels@spectra{å‘射光谱}%
+% ----------------------------
+% acronym to use in legend
+% for 'Name'
+\def\pgfPT@user@acr@name{N}%
+% for 'Chemical Symbol'
+\def\pgfPT@user@acr@CS{CS}%
+% for 'Radioactive'
+\def\pgfPT@user@acr@radio{Ra}%
+% for 'Melting Point'
+\def\pgfPT@user@acr@Tmelt{MP}%
+% for 'Boiling Point'
+\def\pgfPT@user@acr@Tboil{BP}%
+% for 'Electron Distribution'
+\def\pgfPT@user@acr@eDist{ed}%
+% for 'Electronic Configuration'
+\def\pgfPT@user@acr@eConfign{ec}%
+% for 'Lattice Structure'
+\def\pgfPT@user@acr@ls{ls}%
+% for 'Lattice constant: a'
+\def\pgfPT@user@acr@lsa{ls a}%
+% for 'Lattice constant: b'
+\def\pgfPT@user@acr@lsb{ls b}%
+% for 'Lattice constant: c'
+\def\pgfPT@user@acr@lsc{ls c}%
+% for 'Lattice c/a ratio'
+\def\pgfPT@user@acr@lsca{ls ca}%
+% for 'Year of Discovery'
+\def\pgfPT@user@acr@DiscY{yd}%
+% for 'Country of Discovery'
+\def\pgfPT@user@acr@DiscC{cd}%
+% for 'Emission Spectrum'
+\def\pgfPT@user@acr@spectra{es}%
+% ----------------------------
+% blocks
+\def\pgfPT@user@labels@blocos{S区元素}%
+\def\pgfPT@user@labels@blocop{P区元素}%
+\def\pgfPT@user@labels@blocod{D区元素}%
+\def\pgfPT@user@labels@blocof{F区元素}%
+% ----------------------------
+\def\pgfPT@user@labels@blocor{代表性元素}%
+\def\pgfPT@user@labels@blocot{过渡金属}%
+\def\pgfPT@user@labels@blocoi{内部过渡金属}%
+% ----------------------------
+% periodic variations
+\def\pgfPT@user@labels@Raum{原å­åŠå¾„沿群增加}%
+\def\pgfPT@user@labels@Rdim{原å­åŠå¾„éšç€æ—¶é—´çš„推移而å‡å°}%
+\def\pgfPT@user@labels@Eiaum{电离能éšç€æ—¶é—´çš„推移而增加}%
+\def\pgfPT@user@labels@Eidim{电离能沿群方å‘é™ä½Ž}%
+\def\pgfPT@user@labels@eaffaum{电å­äº²å’ŒåŠ›éšç€æ—¶é—´çš„推移而增加}%
+\def\pgfPT@user@labels@eaffdim{电å­äº²å’ŒåŠ›æ²¿åŸºå›¢æ–¹å‘é™ä½Ž}%
+% ----------------------------
+% lattice structure:
+\def\pgfPT@user@labels@ls@bcc{体心立方}%
+\def\pgfPT@user@labels@ls@bcort{底心正交}%
+\def\pgfPT@user@labels@ls@ctetr{体心四方}%
+\def\pgfPT@user@labels@ls@dia{è±å½¢}%
+\def\pgfPT@user@labels@ls@fcc{é¢å¿ƒç«‹æ–¹}%
+\def\pgfPT@user@labels@ls@fcort{é¢å¿ƒæ­£äº¤}%
+\def\pgfPT@user@labels@ls@hcp{密排六方}%
+\def\pgfPT@user@labels@ls@hex{å…­æ–¹}%
+\def\pgfPT@user@labels@ls@mono{å•æ–œ}%
+\def\pgfPT@user@labels@ls@rho{è±é¢}%
+\def\pgfPT@user@labels@ls@sc{简å•ç«‹æ–¹}%
+\def\pgfPT@user@labels@ls@tric{简å•ä¸‰æ–œ}%
+\def\pgfPT@user@labels@ls@tetr{四方}%
+% ----------------------------
+% element names
+\def\pgfPT@user@CSname@H{æ°¢}%
+\def\pgfPT@user@CSname@He{æ°¦}%
+\def\pgfPT@user@CSname@Li{锂}%
+\def\pgfPT@user@CSname@Be{é“}%
+\def\pgfPT@user@CSname@B{硼}%
+\def\pgfPT@user@CSname@C{碳}%
+\def\pgfPT@user@CSname@N{æ°®}%
+\def\pgfPT@user@CSname@O{æ°§}%
+\def\pgfPT@user@CSname@F{æ°Ÿ}%
+\def\pgfPT@user@CSname@Ne{æ°–}%
+\def\pgfPT@user@CSname@Na{é’ }%
+\def\pgfPT@user@CSname@Mg{é•}%
+\def\pgfPT@user@CSname@Al{é“}%
+\def\pgfPT@user@CSname@Si{ç¡…}%
+\def\pgfPT@user@CSname@P{磷}%
+\def\pgfPT@user@CSname@S{ç¡«}%
+\def\pgfPT@user@CSname@Cl{æ°¯}%
+\def\pgfPT@user@CSname@Ar{æ°©}%
+\def\pgfPT@user@CSname@K{é’¾}%
+\def\pgfPT@user@CSname@Ca{é’™}%
+\def\pgfPT@user@CSname@Sc{é’ª}%
+\def\pgfPT@user@CSname@Ti{é’›}%
+\def\pgfPT@user@CSname@V{é’’}%
+\def\pgfPT@user@CSname@Cr{铬}%
+\def\pgfPT@user@CSname@Mn{é”°}%
+\def\pgfPT@user@CSname@Fe{é“}%
+\def\pgfPT@user@CSname@Co{é’´}%
+\def\pgfPT@user@CSname@Ni{é•}%
+\def\pgfPT@user@CSname@Cu{铜}%
+\def\pgfPT@user@CSname@Zn{锌}%
+\def\pgfPT@user@CSname@Ga{é•“}%
+\def\pgfPT@user@CSname@Ge{é”—}%
+\def\pgfPT@user@CSname@As{ç ·}%
+\def\pgfPT@user@CSname@Se{ç¡’}%
+\def\pgfPT@user@CSname@Br{溴}%
+\def\pgfPT@user@CSname@Kr{æ°ª}%
+\def\pgfPT@user@CSname@Rb{é“·}%
+\def\pgfPT@user@CSname@Sr{锶}%
+\def\pgfPT@user@CSname@Y{é’‡}%
+\def\pgfPT@user@CSname@Zr{锆}%
+\def\pgfPT@user@CSname@Nb{铌}%
+\def\pgfPT@user@CSname@Mo{é’¼}%
+\def\pgfPT@user@CSname@Tc{é”}%
+\def\pgfPT@user@CSname@Ru{钌}%
+\def\pgfPT@user@CSname@Rh{é“‘}%
+\def\pgfPT@user@CSname@Pd{é’¯}%
+\def\pgfPT@user@CSname@Ag{银}%
+\def\pgfPT@user@CSname@Cd{镉}%
+\def\pgfPT@user@CSname@In{é“Ÿ}%
+\def\pgfPT@user@CSname@Sn{锡}%
+\def\pgfPT@user@CSname@Sb{锑}%
+\def\pgfPT@user@CSname@Te{碲}%
+\def\pgfPT@user@CSname@I{碘}%
+\def\pgfPT@user@CSname@Xe{æ°™}%
+\def\pgfPT@user@CSname@Cs{铯}%
+\def\pgfPT@user@CSname@Ba{é’¡}%
+\def\pgfPT@user@CSname@La{镧}%
+\def\pgfPT@user@CSname@Ce{铈}%
+\def\pgfPT@user@CSname@Pr{镨}%
+\def\pgfPT@user@CSname@Nd{é’•}%
+\def\pgfPT@user@CSname@Pm{é’·}%
+\def\pgfPT@user@CSname@Sm{é’}%
+\def\pgfPT@user@CSname@Eu{é“•}%
+\def\pgfPT@user@CSname@Gd{é’†}%
+\def\pgfPT@user@CSname@Tb{铽}%
+\def\pgfPT@user@CSname@Dy{é•}%
+\def\pgfPT@user@CSname@Ho{é’¬}%
+\def\pgfPT@user@CSname@Er{é“’}%
+\def\pgfPT@user@CSname@Tm{é“¥}%
+\def\pgfPT@user@CSname@Yb{镱}%
+\def\pgfPT@user@CSname@Lu{é•¥}%
+\def\pgfPT@user@CSname@Hf{铪}%
+\def\pgfPT@user@CSname@Ta{é’½}%
+\def\pgfPT@user@CSname@W{é’¨}%
+\def\pgfPT@user@CSname@Re{铼}%
+\def\pgfPT@user@CSname@Os{锇}%
+\def\pgfPT@user@CSname@Ir{铱}%
+\def\pgfPT@user@CSname@Pt{é“‚}%
+\def\pgfPT@user@CSname@Au{金}%
+\def\pgfPT@user@CSname@Hg{汞}%
+\def\pgfPT@user@CSname@Tl{é“Š}%
+\def\pgfPT@user@CSname@Pb{é“…}%
+\def\pgfPT@user@CSname@Bi{é“‹}%
+\def\pgfPT@user@CSname@Po{é’‹}%
+\def\pgfPT@user@CSname@At{ç ¹}%
+\def\pgfPT@user@CSname@Rn{æ°¡}%
+\def\pgfPT@user@CSname@Fr{é’«}%
+\def\pgfPT@user@CSname@Ra{é•­}%
+\def\pgfPT@user@CSname@Ac{锕}%
+\def\pgfPT@user@CSname@Th{é’}%
+\def\pgfPT@user@CSname@Pa{镤}%
+\def\pgfPT@user@CSname@U{é“€}%
+\def\pgfPT@user@CSname@Np{é•Ž}%
+\def\pgfPT@user@CSname@Pu{é’š}%
+\def\pgfPT@user@CSname@Am{é•…}%
+\def\pgfPT@user@CSname@Cm{é””}%
+\def\pgfPT@user@CSname@Bk{锫}%
+\def\pgfPT@user@CSname@Cf{锎}%
+\def\pgfPT@user@CSname@Es{锿}%
+\def\pgfPT@user@CSname@Fm{é•„}%
+\def\pgfPT@user@CSname@Md{é’”}%
+\def\pgfPT@user@CSname@No{锘}%
+\def\pgfPT@user@CSname@Lr{铹}%
+\def\pgfPT@user@CSname@Rf{{\setmainfont{\pgfPT@fontzhSSB}𬬻}}%
+\def\pgfPT@user@CSname@Db{{\setmainfont{\pgfPT@fontzhSSB}𬭊}}%
+\def\pgfPT@user@CSname@Sg{{\setmainfont{\pgfPT@fontzhSSB}𬭳}}%
+\def\pgfPT@user@CSname@Bh{{\setmainfont{\pgfPT@fontzhSSB}𬭛}}%
+\def\pgfPT@user@CSname@Hs{{\setmainfont{\pgfPT@fontzhSSB}𬭶}}%
+\def\pgfPT@user@CSname@Mt{{\setmainfont{\pgfPT@fontzhSS}é¿}}%
+\def\pgfPT@user@CSname@Ds{{\setmainfont{\pgfPT@fontzhSSB}𫟼}}%
+\def\pgfPT@user@CSname@Rg{{\setmainfont{\pgfPT@fontzhSSB}𬬭}}%
+\def\pgfPT@user@CSname@Cn{{\setmainfont{\pgfPT@fontzhSS}é¿”}}%
+\def\pgfPT@user@CSname@Nh{{\setmainfont{\pgfPT@fontzhSS}é¿­}}%
+\def\pgfPT@user@CSname@Fl{{\setmainfont{\pgfPT@fontzhSSB}𫓧}}%
+\def\pgfPT@user@CSname@Mc{镆}%
+\def\pgfPT@user@CSname@Lv{{\setmainfont{\pgfPT@fontzhSSLv}ð«Ÿ·}}%
+\def\pgfPT@user@CSname@Ts{{\setmainfont{\pgfPT@fontzhSS}鿬}}%
+\def\pgfPT@user@CSname@Og{{\setmainfont{\pgfPT@fontzhSS}é¿«}}%
+% ----------------------------
+% Country (or Region) names
+\def\pgfPT@user@country@AM{å°äºšç»†äºš}%
+\def\pgfPT@user@country@au{奥地利}%
+\def\pgfPT@user@country@dn{丹麦}%
+\def\pgfPT@user@country@eg{埃åŠ}%
+\def\pgfPT@user@country@fl{芬兰}%
+\def\pgfPT@user@country@fr{法国}%
+\def\pgfPT@user@country@de{德国}%
+\def\pgfPT@user@country@it{æ„大利}%
+\def\pgfPT@user@country@ME{中东}%
+\def\pgfPT@user@country@pe{秘é²}%
+\def\pgfPT@user@country@ro{罗马尼亚}%
+\def\pgfPT@user@country@ru{ä¿„ç½—æ–¯}%
+\def\pgfPT@user@country@es{西ç­ç‰™}%
+\def\pgfPT@user@country@sw{ç‘žå…¸}%
+\def\pgfPT@user@country@ch{瑞士}%
+\def\pgfPT@user@country@uk{英国}%
+\def\pgfPT@user@country@us{美国}%
+\def\pgfPT@user@country@mx{墨西哥}%
+\endinput%
diff --git a/graphics/pgf/contrib/pgfornament-han/README.md b/graphics/pgf/contrib/pgfornament-han/README.md
index 893666ec52..61d023c759 100644
--- a/graphics/pgf/contrib/pgfornament-han/README.md
+++ b/graphics/pgf/contrib/pgfornament-han/README.md
@@ -1,17 +1,17 @@
-# pgfornament-han 2023/10/29
-A pgfornament library for Chinese traditional motifs and patterns.
+# pgfornament-han 2024/10/22
+A pgfornament library for Chinese traditional motifs and patterns. We also provide three beamer themes namely XiaoShan, HeavenlyClouds and TianQing based on these motifs. With some modifications, these themes can also be used to create posters using the `beamerposter` package; sample .tex files are provided.
-以 pgfornament å®åŒ…的机制,实现绘制汉风图纹。在此基础上设计了三款beamer主题:「è§å±±ã€(XiaoShan)ã€ã€Œç¥žé©¬æµ®äº‘ã€(Heavenly Clouds)ã€ã€Œå¤©é’ã€(TianQing)。
+以 pgfornament å®åŒ…的机制,实现绘制汉风图纹。在此基础上设计了三款beamer主题:「è§å±±ã€(XiaoShan)ã€ã€Œç¥žé©¬æµ®äº‘ã€(HeavenlyClouds)ã€ã€Œå¤©é’ã€(TianQing),并å¯ç•¥åŠ ä¿®æ”¹åº”用在海报设计上。详情请å‚考范例 .tex 文档。
-# Maintainers å®åŒ…维护
+## Maintainers å®åŒ…维护
LianTze Lim æž—èŽ²æž (liantze@gmail.com)
-# Contributors å¼€å‘人员
+## Contributors å¼€å‘人员
Chennan Zhang (23637935@qq.com) drew the motifs using a CAD application,
re-drew them in `TikZ`, and granted permission for these to be turned into
a library suitable for use with the `pgfornament` package by LianTze Lim.
所有图纹å‡ç”±å¼ æ™¨å—以 CAD 设计ã€ä»¥TikZ绘制,å†ç”±æž—莲æžè½¬ä¸ºé€‚用 pgfornament 机制的å®åŒ…代ç ã€‚
-# License
+## License 许å¯åè®®
[LaTeX Project Public License (LPPL 1.3c)](https://www.latex-project.org/lppl/lppl-1-3c/)
diff --git a/graphics/pgf/contrib/pgfornament-han/beamerthemeHeavenlyClouds.sty b/graphics/pgf/contrib/pgfornament-han/beamerthemeHeavenlyClouds.sty
index 00bc63cd78..afee91585d 100644
--- a/graphics/pgf/contrib/pgfornament-han/beamerthemeHeavenlyClouds.sty
+++ b/graphics/pgf/contrib/pgfornament-han/beamerthemeHeavenlyClouds.sty
@@ -1,4 +1,4 @@
-% beamerthemeHeavenlyClouds.sty v1.1.1 2023/10/29
+% beamerthemeHeavenlyClouds.sty v1.2 2024/10/15
% by LianTze Lim (liantze@gmail.com)
\ProvidesPackage{beamerthemeHeavenlyClouds}
@@ -24,6 +24,7 @@
\renewcommand{\CJKrmdefault}{zhfs}
\setbeamerfont{frametitle}{shape=\itshape,family=\lishu,series=\bfseries,size=\LARGE}
+\setbeamerfont{framesubtitle}{shape=\itshape,family=\lishu,series=\bfseries,size=\normalsize}
% \setbeamercolor{frametitle}{fg=茜色}
\setbeamerfont{title}{family=\lishu,series=\bfseries,size=\huge}
@@ -66,7 +67,8 @@
}
\appto{\maketitle}{\end{minipage}}
-
+\newcommand{\addheight}{\parbox{0pt}{\rule{0pt}{1.3\ccwd}}}
+% \setbeamerfont{block title}{series=\addheight}
% \setbeamerfont{block title}{series=\centering}
% \addtobeamertemplate{block alerted begin}{}{\centering}
% \addtobeamertemplate{block example begin}{}{\centering}
@@ -95,25 +97,27 @@
}%
}
+\newlength{\ShenmaMarkerWidth}
+\setlength{\ShenmaMarkerWidth}{2.5em}
\AddToHook{begindocument/before}{%
\newbox{\clouds@shenma}
\savebox{\clouds@shenma}{%
\usebeamercolor[fg]{headline}%
\tikzset{pgfornamentstyle/.style={line width=0pt}}%
- \pgfornamenthan[width=2.5em]{78}%
+ \pgfornamenthan[width=\ShenmaMarkerWidth]{78}%
}
}
\newcommand{\shenmaprogressmarker}{%
\renewcommand{\clouds@progressmarker}{%
- \clip (-1.3em,4em) rectangle (\paperwidth,0pt);
+ \clip (-1.3em,\dimexpr\ht\clouds@shenma + 4em\relax) rectangle (\paperwidth,0pt);
\node[anchor=south,inner sep=1pt] at (\clouds@progressinheadfoot,1.25em)
{\usebox{\clouds@shenma}};
}
}%
-\AtBeginDocument{%
+\AddToHook{begindocument/before}{%
\shenmaprogressmarker
\newbox{\clouds@title@deco}
\savebox{\clouds@title@deco}{%
@@ -130,6 +134,9 @@
\parbox{\dimexpr\clouds@frametitle@actualwidth-5em}{\centering\insertframetitle}%
\hfill\raisebox{0.5ex}{\usebox{\clouds@title@deco}}%
\end{minipage}\par%
+ % 2024-10-08 add frame subtitle
+ \smallskip%
+ {\centering\usebeamerfont{framesubtitle}\mbox{}\insertframesubtitle\par}%
}
\newbox{\clouds@smallhuiwen}
@@ -151,9 +158,8 @@
\begin{tikzpicture}[decoration={markings, mark=between positions 0 and 1 step 2.5em
with { \node[transform shape]{\usebox{\clouds@smallhuiwen}}; }} ]
\path [postaction={decorate}] (0,0) -- (\paperwidth,0);
- \draw[headline.fg!50,line width=0.6pt] (-1.25em,1.25em) -- (\paperwidth,1.25em);
+ \draw[headline.fg!50,line width=0.2ex] (-1.25em,1.25em) -- (\paperwidth,1.25em);
\clouds@progressmarker
- % \fill[headline.fg] (\clouds@progressinheadfoot,1.25em) circle (2pt); %<-- TODO
\end{tikzpicture}
}
}
@@ -194,13 +200,17 @@
\pgfmathsetmacro{\myx}{rnd * 0.8}
\pgfmathsetmacro{\myy}{rnd * 0.8}
\pgfmathtruncatemacro{\myorn}{random(0,1) + #1}
+ \begingroup
+ \ifodd \myorn \tikzset{pgfornamentstyle/.append style={line width=1pt]}} \fi
\node at (\myx * \paperwidth, \myy * \paperheight) {\pgfornamenthan[
color=normal text.bg!\myintensity!white,symmetry=\myflip,scale=\myscale]{\myorn}};
+ \endgroup
}
+\newcommand{\BackgroundOrns}{\randorn{66}\randorn{68}\randorn{66}\randorn{70}\randorn{68}}
\setbeamertemplate{background}{%
\begin{tikzpicture}
\clip (0,0) rectangle (\paperwidth,\paperheight);
- \randorn{66}\randorn{68}\randorn{66}\randorn{70}\randorn{68}
+ \BackgroundOrns%
\end{tikzpicture}
}
diff --git a/graphics/pgf/contrib/pgfornament-han/beamerthemeTianQing.sty b/graphics/pgf/contrib/pgfornament-han/beamerthemeTianQing.sty
index 7d4bdfea49..b612979423 100644
--- a/graphics/pgf/contrib/pgfornament-han/beamerthemeTianQing.sty
+++ b/graphics/pgf/contrib/pgfornament-han/beamerthemeTianQing.sty
@@ -1,4 +1,4 @@
-% beamerthemeXiaoshan.sty v1.01 2023/10/29
+% beamerthemeXiaoshan.sty v1.02 2024/09/19
% by LianTze Lim (liantze@gmail.com)
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{beamerthemeTianQing}
@@ -35,12 +35,20 @@
\setbeamerfont{section name}{family=\kaishu,size=\Large}
\setbeamerfont{section title}{family=\kaishu,size=\huge}
\setbeamerfont{section in toc}{family=\kaishu,size=\large}
+\setbeamerfont{block title}{family=\kaishu\romankai,series=\bfseries}
\setbeamercolor{alerted text}{fg=樱桃色}
\setbeamercolor{example text}{fg=绿沉}
\setbeamercolor{block title}{fg=å®è“}
\setbeamercolor{mini frame}{bg=天é’色}
+\newlength{\TQTopDecoWidth}
+\newlength{\TQBottomDecoWidth}
+\setlength{\TQTopDecoWidth}{.5\paperheight}
+\setlength{\TQBottomDecoWidth}{.2\paperheight}
+\newcommand{\TQTopDecoOpacity}{.2}
+\newcommand{\TQBottomDecoOpacity}{.9}
+
\AddToHook{begindocument/before}{%
\newsavebox{\bulletboxone}
\savebox{\bulletboxone}{\usebeamercolor[fg]{structure}\tikz\node[line width=0pt,inner sep=0pt,outer sep=0pt]{\pgfornamenthan[height=1ex]{43}};}
@@ -55,12 +63,12 @@
\savebox{\topcornermotif}{%
\usebeamercolor{deco outline}%
\usebeamercolor{top deco}%
- \tikzset{pgfornamentstyle/.style={rotate=30,color=top deco.fg,draw=deco outline.fg,opacity=.2,inner sep=0pt,ultra thick}}\pgfornamenthan[width=.5\paperheight]{64}}
+ \tikzset{pgfornamentstyle/.style={rotate=30,color=top deco.fg,draw=deco outline.fg,opacity=\TQTopDecoOpacity,inner sep=0pt,ultra thick}}\pgfornamenthan[width=\TQTopDecoWidth]{64}}
\newsavebox{\bottomcornermotif}
\savebox{\bottomcornermotif}{%
\usebeamercolor{structure}%
- \tikzset{pgfornamentstyle/.style={color=structure.fg,opacity=.9,inner sep=0pt,very thick}}\pgfornamenthan[width=.2\paperheight,symmetry=v]{74}}%
+ \tikzset{pgfornamentstyle/.style={color=structure.fg,opacity=\TQBottomDecoOpacity,inner sep=0pt,very thick}}\pgfornamenthan[width=\TQBottomDecoWidth,symmetry=v]{74}}%
}
\setbeamertemplate{itemize item}{\raisebox{.08\ccwd}{\usebox{\bulletboxone}}}
@@ -108,7 +116,7 @@
coltitle = alerted text.fg!70!black,
colback = alerted text.bg,
halign title = flush center,
- fonttitle=\kaishu\romankai\bfseries,
+ fonttitle=\usebeamerfont{block title alerted},
title = #2,
#1
}
@@ -128,7 +136,7 @@
coltitle = example text.fg!70!black,
colback = example text.bg,
halign title = flush center,
- fonttitle=\kaishu\romankai\bfseries,
+ fonttitle=\usebeamerfont{block title example},
title = #2,
#1
}
@@ -150,7 +158,7 @@
coltitle = block title.fg!70!black,
colback = block title.bg,
halign title = flush center,
- fonttitle=\kaishu\romankai\bfseries,
+ fonttitle=\usebeamerfont{block title},
title = #2,
#1
}
diff --git a/graphics/pgf/contrib/pgfornament-han/beamerthemeXiaoshan.sty b/graphics/pgf/contrib/pgfornament-han/beamerthemeXiaoshan.sty
index 52daf7b8ad..03800a5a50 100644
--- a/graphics/pgf/contrib/pgfornament-han/beamerthemeXiaoshan.sty
+++ b/graphics/pgf/contrib/pgfornament-han/beamerthemeXiaoshan.sty
@@ -1,4 +1,4 @@
-% beamerthemeXiaoshan.sty v1.1 2023/04/23
+% beamerthemeXiaoshan.sty v1.2 2024/10/19
% by LianTze Lim (liantze@gmail.com)
\ProvidesPackage{beamerthemeXiaoshan}
@@ -48,8 +48,9 @@
\linespread{1.0}%
\inserttitle%
\hspace*{2em}\par%
-\vspace*{0.5em}
}
+% Frankly I have no idea if this is the right way to shove in a framesubtitle for metropolis
+\apptocmd{\metropolis@frametitlestrut@end}{\ifx\insertframesubtitle\@empty\else\par\usebeamerfont{framesubtitle}\insertframesubtitle\par\vskip1.5ex\fi}{}{}
\setbeamertemplate{subtitle}{
\raggedleft%
diff --git a/graphics/pgf/contrib/pgfornament-han/heavenlyclouds-sample.pdf b/graphics/pgf/contrib/pgfornament-han/heavenlyclouds-sample.pdf
deleted file mode 100644
index e8a3837826..0000000000
--- a/graphics/pgf/contrib/pgfornament-han/heavenlyclouds-sample.pdf
+++ /dev/null
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.pdf b/graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.pdf
index e2abf948f9..45926eaca9 100644
--- a/graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.pdf
+++ b/graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.tex b/graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.tex
index a5c6be5f1c..ffb8e95018 100644
--- a/graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.tex
+++ b/graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.tex
@@ -1,10 +1,8 @@
-% !TEX option = --shell-escape
-% !TEX program = xelatex
\documentclass[fontset=fandol]{ctexart}
-
\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}
+\usepackage{multicol}
\usepackage{ragged2e}
\usepackage[svgnames]{xcolor}
\usepackage{pgfornament-han}
@@ -100,10 +98,11 @@
\fancypagestyle{plain}{\pagestyle{fancy}}
\usepackage[colorlinks]{hyperref}
+\usepackage{cleveref}
\title{汉风图纹 \texttt{pgfornament-han}}
\author{林莲æžã€å¼ æ™¨å—}
-\date{2023/10/29\\\url{https://github.com/liantze/pgfornament-han}}
+\date{2024/10/22\\\url{https://github.com/liantze/pgfornament-han}}
\begin{document}
@@ -111,7 +110,7 @@
\begin{abstract}
利用 \texttt{pgfornament} å®åŒ…å¯ä»¥åœ¨ \LaTeX{} 文件里便æ·åœ°ç”»å‡ºå分典雅漂亮的ã€æ¬§å¼é£Žæ ¼çš„花纹。(详情请自行访问 \url{http://ctan.org/pkg/pgfornament})
- \texttt{pgfornament-han} å®åŒ…的用æ„,正是为了å°è¯•ç”¨ \texttt{pgfornament} 的已有机制,æ供一些汉风的传统图纹。所有图纹å‡ç”±\emph{张晨å—}以 CAD 程å¼å®šç¨¿ã€TikZ 绘制,å†ç”±\emph{林莲æž}è½¬ä¸ºé€‚åˆ \texttt{pgfornament} 机制使用的å®åŒ…代ç ã€‚
+ \texttt{pgfornament-han} å®åŒ…的用æ„,正是为了å°è¯•ç”¨ \texttt{pgfornament} 的已有机制,æ供一些汉风的传统图纹。所有图纹å‡ç”±\emph{张晨å—}以 CAD 程å¼å®šç¨¿ã€TikZ 绘制,å†ç”±\emph{林莲æž}è½¬ä¸ºé€‚åˆ \texttt{pgfornament} 机制使用的å®åŒ…代ç ã€‚我们也基于这些图纹å°è¯•è®¾è®¡äº†ä¸€äº›beamerå¹»ç¯ç‰‡åŠæµ·æŠ¥ä¸»é¢˜ï¼Œè¯¦è§é™„录\ref{app:beamer-xiaoshan}ã€\ref{app:beamer-heavenlyclouds}ã€\ref{app:beamer-tianqing}。
\end{abstract}
\part{基本用法}
@@ -515,9 +514,10 @@
\appendix
\setlength{\parindent}{2\ccwd}\justifying
\ctexset{section/name={附录}}
-\phantomsection\addcontentsline{toc}{part}{附录}
+\phantomsection\label{appendix-start}\addcontentsline{toc}{part}{附录}
\section{传统中国颜色 \texttt{cncolours.sty}}
+\label{app:cncolours}
\begingroup
@@ -1955,12 +1955,13 @@
\clearpage
\section{è§å±± Beamer 主题 Xiaoshan Beamer Theme \texttt{beamerthemeXiaoshan.sty}}
+\label{app:beamer-xiaoshan}
-这个Beamer主题是以 \href{https://ctan.org/pkg/beamertheme-metropolis}{Metropolis} 为基础,用 \texttt{cncolours.sty} 调了一下颜色,加入少许汉风纹样。
+这个Beamer主题是以 \href{https://ctan.org/pkg/beamertheme-metropolis}{Metropolis} 为基础,用 \texttt{cncolours.sty} 调了一下颜色,加入少许汉风纹样。请å‚考\texttt{xiaoshan-beamer-sample.tex}示范文档。
\bigskip
-\begin{tcblisting}{listing side comment,title={使用范例},pdf comment={xiaoshan-sample.pdf}}
+\begin{tcblisting}{listing side comment,title={使用范例},pdf comment={samples/xiaoshan-beamer-sample.pdf}}
\documentclass[linespread=1.2,aspectratio=1610]{ctexbeamer}
\usetheme{Xiaoshan}
@@ -1990,15 +1991,45 @@
å¯ä»¥è‡ªè¡ŒæŸ¥é˜…\href{https://ctan.org/pkg/beamertheme-metropolis}{Metropolis}的详细å®åŒ…手册,有很多å¯å®¢åˆ¶åŒ–的机制,包括å„ç§å…ƒç´ çš„é…色。
+这些设置(以åŠbeamer本身自带的设置å‚数)ç»è¿‡ä¸€äº›é€‚当更改,也å¯ä»¥é…åˆ\texttt{beamerposter}å®åŒ…制作学术海报。请å‚考 \texttt{xiaoshan-poster-sample.tex} 示范文档。
+
+\begin{tcblisting}{listing side comment,title={海报范例},image comment={width=\hsize}{samples/xiaoshan-poster-sample.pdf}}
+\documentclass[t]{ctexbeamer}
+\usepackage[size=a4,orientation=portrait,
+scale=1.4]{beamerposter}
+\usetheme{Xiaoshan}
+
+\setbeamertemplate{frame numbering}[none]
+\setbeamerfont{frametitle}{series=\mdseries\huge}
+% ...以åŠå…¶å®ƒé€‚当改动,
+% 详è§tianqing-poster.tex
+
+\title{当è§å±±beamer主题拿æ¥åšæµ·æŠ¥}
+\author{作者甲ã€ä½œè€…ä¹™ã€ä½œè€…丙}
+\begin{document}
+\begin{frame}
+\frametitle{\insertshorttitle}
+\framesubtitle{\insertshortauthor}
+\begin{block}{è§å±±åŸŽå¸‚图景}
+ \begin{itemize}
+ \item 长忆è§ç„¶å±±ä¸‹åŽ¿ï¼ŒåŽ»ç§‹ä¸ºå®¢æ—¥æ‹›é‚€ã€‚
+ \item ...
+ \end{itemize}
+\end{block}
+\end{frame}
+\end{document}
+\end{tcblisting}
+
\clearpage
\section{神马浮云 Beamer 主题 Heavenly Clouds Beamer Theme \texttt{beamerthemeHeavenlyClouds.sty}}
+\label{app:beamer-heavenlyclouds}
-这个Beamer主题是我一次病中摸鱼摸出æ¥çš„,脑洞略大。æ¯ä¸€é¡µçš„背景的云彩纹样,ä½ç½®ã€å¤§å°ã€æ·±æµ…都是éšæœºçš„,所以如果内容页数比较多,编译时è¿ç®—å¯èƒ½ä¼šæ¯”较花时间,请自行斟酌使用此主题。
+这个Beamer主题是我一次病中摸鱼摸出æ¥çš„,脑洞略大。请å‚考\texttt{heavenlyclouds-beamer-sample.tex}示范文档。æ¯ä¸€é¡µçš„背景的云彩纹样,ä½ç½®ã€å¤§å°ã€æ·±æµ…都是éšæœºçš„,所以如果内容页数比较多,编译时è¿ç®—å¯èƒ½ä¼šæ¯”较花时间,请自行斟酌使用此主题。
\bigskip
-\begin{tcblisting}{listing side comment,title={使用范例},pdf comment={heavenlyclouds-sample.pdf}}
+\begin{tcblisting}{listing side comment,title={使用范例},pdf comment={samples/heavenlyclouds-beamer-sample.pdf}}
\documentclass[aspectratio=1610,linespread=1.2]{ctexbeamer}
\usetheme{HeavenlyClouds}
@@ -2063,17 +2094,51 @@
\end{minted}
\end{itemize}
+这些设置(以åŠbeamer本身自带的设置å‚数)ç»è¿‡ä¸€äº›é€‚当更改,也å¯ä»¥é…åˆ\texttt{beamerposter}å®åŒ…制作学术海报。请å‚考 \texttt{heavenlyclouds-poster-sample.tex} 示范文档。
+
+\begin{tcblisting}{listing side comment,title={海报范例},image comment={width=\hsize}{samples/heavenlyclouds-poster-sample.pdf}}
+\documentclass[t,linespread=1.3]{ctexbeamer}
+\usepackage[size=a4,orientation=portrait,
+scale=1.5]{beamerposter}
+
+\usetheme{HeavenlyClouds}
+
+\setbeamerfont{frametitle}{size=\Huge}
+\setbeamerfont{framesubtitle}{size=\Large}
+\setbeamerfont{headline}{size=\small}
+\setbeamerfont{footline}{size=\small}
+% ...以åŠå…¶å®ƒé€‚当改动,
+% 详è§heavenlyclouds-poster-sample.tex
+
+\title{当神马浮云beamer主题拿æ¥åšæµ·æŠ¥}
+\author{作者甲ã€ä½œè€…ä¹™ã€ä½œè€…丙}
+\begin{document}
+\begin{frame}
+\frametitle{\insertshorttitle}
+\framesubtitle{\insertshortauthor}
+\begin{block}{套马的汉å­ä½ å¨æ­¦é›„壮}
+ \begin{itemize}
+ \item 飞驰的éªé©¬åƒç–¾é£Žä¸€æ ·
+ \item ...
+ \end{itemize}
+\end{block}
+\end{frame}
+\end{document}
+\end{tcblisting}
+
\clearpage
+
\section{å¤©é’ Beamer 主题 Tian Qing Beamer Theme \texttt{beamerthemeTianqing.sty}}
+\label{app:beamer-tianqing}
-几年å‰çœ‹åˆ°ä¸€ä¸ªå¾ˆå–œæ¬¢çš„舞å°æ¼”出,根æ®ä¸ªäººå°è±¡åšçš„一个Beamer主题。本æ¥æƒ³å–å「é’花瓷ã€çš„。ä¸è¿‡å§‹ç»ˆæ²¡èƒ½åŠ›é‡çŽ°å‡ºæ¥é‚£ç§æ„Ÿè§‰å•¦ï¼Œçœ¼é«˜æ‰‹ä½Žï¼Œæƒ­æ„§ã€‚
+几年å‰çœ‹åˆ°ä¸€ä¸ª\href{https://www.bilibili.com/video/BV1my4y1B7Vx/?p=156}{很喜欢的舞å°æ¼”出},根æ®ä¸ªäººå°è±¡åšçš„一个Beamer主题。本æ¥æƒ³å–å「é’花瓷ã€çš„。ä¸è¿‡å§‹ç»ˆæ²¡èƒ½åŠ›é‡çŽ°å‡ºæ¥é‚£ç§æ„Ÿè§‰å•¦ï¼Œçœ¼é«˜æ‰‹ä½Žï¼Œæƒ­æ„§ã€‚请å‚考\texttt{tianqing-beamer-sample.tex}示范文档。
(è¯è¯´æ‹¿è¿™ä¸ªæ¨¡æ¿åŽ»åšç§‘研学术性报告,真的ä¸ä¼šè¢«å¯¼å¸ˆä¸¢å‡ºæ¥å—。)
\bigskip
-\begin{tcblisting}{listing side comment,title={使用范例},pdf comment={tianqing-sample.pdf}}
+\begin{tcblisting}{listing side comment,title={使用范例},pdf comment={samples/tianqing-beamer-sample.pdf}}
\documentclass[aspectratio=1610,linespread=1.2]{ctexbeamer}
\usetheme{TianQing}
@@ -2102,7 +2167,8 @@
\mintinline{latex}|\setCJKfamilyfont{zhkai}{Xingkai SC}|
-一些å¯ä»¥è‡ªå·±æ›´æ”¹çš„颜色:
+\begin{multicols}{2}
+\noindent 一些å¯ä»¥è‡ªå·±æ›´æ”¹çš„颜色:
\begin{minted}{latex}
\setbeamercolor{structure}{fg=墨色}
\setbeamercolor{section page}{fg=紫檀}
@@ -2112,5 +2178,43 @@
\setbeamercolor{example text}{fg=鸦é’}
\setbeamercolor{block title}{fg=绀é’}
\end{minted}
+\columnbreak
+\noindent 其它一些å¯ä»¥è‡ªå·±æ›´æ”¹çš„设置:
+\begin{minted}{latex}
+\setlength{\TQTopDecoWidth}{0.7\paperwidth}
+\setlength{\TQBottomDecoWidth}{0.2\paperwidth}
+\renewcommand{\TQTopDecoOpacity}{0.3}
+\renewcommand{\TQBottomDecoOpacity}{0.45}
+\end{minted}
+\end{multicols}
+
+这些设置(以åŠbeamer本身自带的设置å‚数)ç»è¿‡ä¸€äº›é€‚当更改,也å¯ä»¥é…åˆ\texttt{beamerposter}å®åŒ…制作学术海报。请å‚考 \texttt{tianqing-poster-sample.tex} 示范文档。
+
+\begin{tcblisting}{listing side comment,title={海报范例},image comment={width=\hsize}{samples/tianqing-poster-sample.pdf}}
+ \documentclass[t,linespread=1.2]{ctexbeamer}
+ \usepackage[size=a4,orientation=portrait,
+ scale=1.4]{beamerposter}
+ \usetheme{TianQing}
+
+ \setbeamerfont{block title}{size=\Large}
+ \setlength{\TQBottomDecoWidth}{0.2\paperwidth}
+ % ...以åŠå…¶å®ƒé€‚当改动,
+ % 详è§tianqing-poster-sample.tex
+
+ \title{当天é’beamer主题拿æ¥åšæµ·æŠ¥}
+ \author{作者甲ã€ä½œè€…ä¹™ã€ä½œè€…丙}
+ \begin{document}
+ \begin{frame}
+ \frametitle{\insertshorttitle}
+ \framesubtitle{\insertshortauthor}
+ \begin{block}{天é’色等烟雨}
+ \begin{itemize}
+ \item 炊烟袅袅å‡èµ·ï¼Œ 隔江åƒä¸‡é‡Œã€‚
+ \item ...
+ \end{itemize}
+ \end{block}
+ \end{frame}
+ \end{document}
+ \end{tcblisting}
\end{document}
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/Cloud_types_en.pdf b/graphics/pgf/contrib/pgfornament-han/samples/Cloud_types_en.pdf
new file mode 100644
index 0000000000..9d7a641dd4
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/Cloud_types_en.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/SiO2.jpg b/graphics/pgf/contrib/pgfornament-han/samples/SiO2.jpg
new file mode 100644
index 0000000000..f62d8acf57
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/SiO2.jpg
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/hangzhou-arch.jpg b/graphics/pgf/contrib/pgfornament-han/samples/hangzhou-arch.jpg
new file mode 100644
index 0000000000..2303d312c1
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/hangzhou-arch.jpg
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-beamer-sample.pdf b/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-beamer-sample.pdf
new file mode 100644
index 0000000000..6dbaf406ad
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-beamer-sample.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/heavenlyclouds-sample.tex b/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-beamer-sample.tex
index d39932feaa..cdfd80c848 100644
--- a/graphics/pgf/contrib/pgfornament-han/heavenlyclouds-sample.tex
+++ b/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-beamer-sample.tex
@@ -1,10 +1,10 @@
-% !TEX program=xelatex
\documentclass[aspectratio=1610,linespread=1.2]{ctexbeamer}
\usetheme{HeavenlyClouds}
% Mac 或 Linux 上请自己设定 \lishu!!
% \providecommand{\lishu}{\CJKfontspec{Libian SC}[BoldFont=Baoli SC,Scale=1.2]}
+% \providecommand{\lishu}{\CJKfontspec{鸿雷æ¿ä¹¦ç®€ä½“-æ­£å¼ç‰ˆ.otf}[Path=fonts/]}
\author{林莲æž}
\title{神马浮云\\Beamer主题}
@@ -15,13 +15,7 @@
% \alttitlecircle %% 试试å–消注释,有惊喜
% \simpleprogressmarker %% 神马太过引人注目的è¯ï¼Œå¯ä»¥ç”¨ç®€å•åœ†ç‚¹å–代。
-
-% \setbeamercolor{structure}{fg=绀é’}
-% \setbeamercolor{headline}{fg=群é’}
-% \setbeamercolor{page number in head/foot}{fg=è—é’}
-% \setbeamercolor{normal text}{bg=æ·¡é’}
-% \setbeamercolor{alerted text}{fg=正黄}
-% \setbeamercolor{example text}{fg=绿沉}
+% \setlength{\ShenmaMarkerWidth}{4em} % å¯ä»¥æ”¹å˜ç¥žé©¬çš„大å°
\begin{document}
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-poster-sample.pdf b/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-poster-sample.pdf
new file mode 100644
index 0000000000..595feef6b6
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-poster-sample.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-poster-sample.tex b/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-poster-sample.tex
new file mode 100644
index 0000000000..f28769dde4
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/heavenlyclouds-poster-sample.tex
@@ -0,0 +1,128 @@
+\documentclass[t,linespread=1.3]{ctexbeamer}
+
+\usepackage[size=a4,orientation=portrait,scale=1.5]{beamerposter}
+
+\usetheme{HeavenlyClouds}
+% Mac 或 Linux 上请自己设定 \lishu!!
+% \providecommand{\lishu}{\CJKfontspec{Libian SC}[BoldFont=Baoli SC,Scale=1.2]}
+% \providecommand{\lishu}{\CJKfontspec{鸿雷æ¿ä¹¦ç®€ä½“-æ­£å¼ç‰ˆ.otf}[Path=fonts/]}
+% 如果实在没有,就用楷书蒙混过关一下……
+% \providecommand{\lishu}{\kaishu}
+% 当然也å¯ä»¥æ›¿æ¢åˆ«çš„仿宋字体,自己喜欢哈自己喜欢
+% \setCJKfamilyfont{zhfs}{ZhuqueFangsong-Regular.ttf}[Path=fonts/]
+
+\usepackage[style=gb7714-2015]{biblatex}
+\addbibresource{sample-refs.bib}
+\usepackage{graphicx}
+\usepackage{ccicons}
+
+% å¹»ç¯ç‰‡->海报需è¦çš„一些改动
+\setbeamerfont{frametitle}{size=\Huge}
+\setbeamerfont{framesubtitle}{size=\Large}
+\setbeamerfont{block title}{size=\large}
+\setbeamerfont{headline}{size=\small}
+\setbeamerfont{footline}{size=\small}
+\AddToHook{begindocument/before}{%
+ \addtobeamertemplate{frametitle}{\vskip-1.5ex}{}
+}
+
+% 让神马放大一些
+\setlength{\ShenmaMarkerWidth}{3.5em}
+% patch for default scaling, make clouds larger
+\patchcmd{\randorn}{rnd * 0.4 + 0.1}{rnd * 0.8 + 0.3}{}{}
+% patch for default opacity, make clouds more prominent on poster
+\patchcmd{\randorn}{rnd * 20 + 65}{rnd * 45 + 40}{}{}
+% when in portrait mode, allow clouds to be higher up
+\patchcmd{\randorn}{\pgfmathsetmacro{\myy}{rnd * 0.8}}{\pgfmathsetmacro{\myy}{rnd * 0.95}}{}{}
+% and further to the right too; probably more important in landscape form
+\patchcmd{\randorn}{\pgfmathsetmacro{\myx}{rnd * 0.8}}{\pgfmathsetmacro{\myx}{rnd * 0.95}}{}{}
+% let there be more clouds in the background
+\renewcommand{\BackgroundOrns}{%
+ \randorn{66}\randorn{68}\randorn{66}\randorn{70}\randorn{68}%
+ \randorn{70}\randorn{68}\randorn{70}\randorn{70}%
+}
+
+\title{当神马浮云beamer主题拿æ¥åšæµ·æŠ¥}
+\author{作者甲ã€ä½œè€…ä¹™ã€ä½œè€…丙}
+
+\begin{document}
+\begin{frame}[fragile]
+% ……简å•åˆç²—暴的,解决footline里神马的ä½ç½®çš„方法,嗯。
+\gdef\inserttotalframenumber{10}
+\gdef\insertframenumber{3}
+
+
+% ……懒得折腾了,\frametitle挺好看的,就这样å§ã€èººå¹³ing
+\frametitle{\insertshorttitle}
+\framesubtitle{\insertshortauthor}
+
+\begin{block}{此主题脑洞略大}
+
+ \begin{itemize}
+ \item 背景的云彩纹样,ä½ç½®ã€å¤§å°ã€æ·±æµ…都是éšæœºçš„。刷一次ä¸å–œæ¬¢æ•ˆæžœçš„è¯å°±å†åˆ·ä¸€æ¬¡ç¢°ä¸€ä¸‹è¿æ°”å§ã€‚
+ \item 若觉得进度æ¡ä¸Šçš„神马太过引人注(侧)目,å¯ä»¥ç”¨ \verb|\simpleprogressmarker| 简å•åœ†ç‚¹å–代。(默认是\verb|\shenmaprogressmarker|)。……但是这是海报啊海报,åªç”¨åœ†ç‚¹å¯èƒ½çœŸçš„太没存在感了。
+ \end{itemize}
+
+\end{block}
+
+\begin{columns}[T]
+\column{.45\textwidth}
+
+\begin{exampleblock}{算了我也ä¸çŸ¥é“在写什么,do you?}
+ Now solve $x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a}$. 对å„ä½åŒå­¦æ¥è¯´åº”该挑战ä¸å¤§ã€‚
+\end{exampleblock}
+
+\begin{alertblock}{算了我也ä¸çŸ¥é“在写什么,do you?}
+ \[ x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a} \]
+\end{alertblock}
+
+\begin{block}{算了我也ä¸çŸ¥é“在写什么,do you?}
+ \[ x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a} \]
+\end{block}
+
+% 个人觉得这个主题,多æ ä¹‹é—´éœ€è¦æœ‰ä¸ªé—´éš”。但是高度需è¦è‡ªå·±è°ƒæ•´ã€‚
+\column{.01\textwidth}
+\textcolor{structure!80}{\rule{.1mm}{.27\textheight}}
+
+\column{.45\textwidth}
+
+\begin{block}{套马的汉å­ä½ å¨æ­¦é›„壮}
+
+ \begin{itemize}
+ \item 飞驰的éªé©¬åƒç–¾é£Žä¸€æ ·
+ \item 一望无际的原野éšä½ åŽ»æµæµª
+ \item 你的心海和大地一样宽广
+ \end{itemize}
+
+ \begin{enumerate}
+ \item 你是我天边最美的云彩
+ \item 让我用心把你留下æ¥
+ \end{enumerate}
+\end{block}
+
+\begin{proof}
+ 显而易è§ï¼Œ$1+1=2$.
+\end{proof}
+
+\begin{theorem}
+ 有一件很美好的事情将è¦å‘生,它终会å‘生。
+\end{theorem}
+
+\end{columns}
+
+\begin{block}{云的分类}
+This is just a sample sentence with a sample citation\cite{BurroughsCrowder2007}.
+
+\smallskip
+\includegraphics[width=.6\textwidth]{Cloud_types_en}\par
+Valentin de Bruyn / Coton. This illustration has been created for Coton, the cloud identification guide for mobile. \ccbysa\ 3.0 via Wikimedia Commons. \url{https://commons.wikimedia.org/wiki/File:Cloud_types_en.svg}
+\end{block}
+
+\vfill
+
+\begin{block}{\refname}
+\printbibliography[heading=none]
+\end{block}
+
+\end{frame}
+\end{document}
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/sample-refs.bib b/graphics/pgf/contrib/pgfornament-han/samples/sample-refs.bib
new file mode 100644
index 0000000000..8875337216
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/sample-refs.bib
@@ -0,0 +1,35 @@
+@article{ShaoShen2022,
+ author = {邵æ¾é›ª and 沈海云},
+ title = {é’花瓷选美记},
+ journal = {大学化学},
+ year = {2022},
+ volume = {37},
+ number = {9},
+ pages = {2110061},
+ doi = {10.3866/PKU.DXHX202110061}
+}
+
+@book{BurroughsCrowder2007,
+ author = {Burroughs, William James and Crowder, Bob},
+ year = {2007},
+ title = {Weather},
+ publisher = {Fog City Press, San Francisco}
+}`
+
+@article{ChenCai2021,
+ author = {陈力新 and 蔡磊},
+ title = {国土空间治ç†èƒŒæ™¯ä¸‹å…¨åŸŸæŽ§åˆ¶æ€§è¯¦ç»†è§„划编制探æžâ€”—以æ­å·žå¸‚è§å±±åŒºè¿›åŒ–镇为例},
+ journal = {浙江建筑},
+ year = {2021},
+ volume = {1},
+ pages = {1--4,9}
+}
+
+@article{ZhuEtal2021,
+ author = {朱鸿寅 and 洪玲笑 and 黄胜兰 and 马俊},
+ title = {绿色亚è¿æ‘,生æ€æœªæ¥åŸŽâ€”—æ­å·žäºšè¿æ‘绿色生æ€åŸŽåŒºå®žè·µ},
+ journal = {建筑节能},
+ year = {2021},
+ number = {6},
+ pages= {10--13}
+}
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/tianqing-beamer-sample.pdf b/graphics/pgf/contrib/pgfornament-han/samples/tianqing-beamer-sample.pdf
new file mode 100644
index 0000000000..8af1fcf099
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/tianqing-beamer-sample.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/tianqing-sample.tex b/graphics/pgf/contrib/pgfornament-han/samples/tianqing-beamer-sample.tex
index 70c1b3d938..c26c27850b 100644
--- a/graphics/pgf/contrib/pgfornament-han/tianqing-sample.tex
+++ b/graphics/pgf/contrib/pgfornament-han/samples/tianqing-beamer-sample.tex
@@ -1,4 +1,3 @@
-% !TEX program=xelatex
\documentclass[aspectratio=1610,linespread=1.2]{ctexbeamer}
\usetheme{TianQing}
% å¯ä»¥æŠŠzhkai更改æˆè‡ªå·±å–œæ¬¢çš„美术字体ã€ä¹¦æ³•å­—体等
@@ -12,9 +11,13 @@
% \setbeamercolor{section page deco}{fg=紫檀}
% \setbeamercolor{top deco}{fg=è€é“¶}
% \setbeamercolor{normal text}{bg=铅白}
-% \setbeamercolor{alerted text}{fg=玄色}
-% \setbeamercolor{example text}{fg=鸦é’}
-% \setbeamercolor{block title}{fg=绀é’}
+% \setbeamercolor{alerted text}{fg=栗色}
+% \setbeamercolor{example text}{fg=è‹é’}
+% \setbeamercolor{block title}{fg=é›é’}
+% \setlength{\TQTopDecoWidth}{0.7\paperwidth}
+% \setlength{\TQBottomDecoWidth}{0.2\paperwidth}
+% \renewcommand{\TQTopDecoOpacity}{0.3}
+% \renewcommand{\TQBottomDecoOpacity}{0.45}
\begin{document}
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/tianqing-poster-sample.pdf b/graphics/pgf/contrib/pgfornament-han/samples/tianqing-poster-sample.pdf
new file mode 100644
index 0000000000..8e7dc0c514
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/tianqing-poster-sample.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/tianqing-poster-sample.tex b/graphics/pgf/contrib/pgfornament-han/samples/tianqing-poster-sample.tex
new file mode 100644
index 0000000000..0ef1f20b74
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/tianqing-poster-sample.tex
@@ -0,0 +1,131 @@
+\documentclass[t,linespread=1.2]{ctexbeamer}
+
+\usepackage[size=a4,orientation=portrait,scale=1.4]{beamerposter}
+
+\usetheme{TianQing}
+% å¯ä»¥æŠŠzhkai,zhfs更改æˆè‡ªå·±å–œæ¬¢çš„美术字体ã€ä¹¦æ³•å­—体等
+% \setCJKfamilyfont{zhkai}{STXingkai} % Win有
+% \setCJKfamilyfont{zhkai}{Xingkai SC} % Mac有
+% \setCJKfamilyfont{zhkai}{鸿雷æ¿ä¹¦ç®€ä½“-æ­£å¼ç‰ˆ.otf}[Path=fonts/] % 自行下载
+% \setCJKfamilyfont{zhfs}{ZhuqueFangsong-Regular.ttf}[Path=fonts/] % 自行下载
+
+\usepackage[style=gb7714-2015]{biblatex}
+\addbibresource{sample-refs.bib}
+\usepackage{chemformula}
+\usepackage{qrcode}
+\usepackage{graphicx}
+
+% å¹»ç¯ç‰‡->海报需è¦çš„一些改动
+\setbeamerfont{frametitle}{size=\Huge}
+\setbeamerfont{framesubtitle}{size=\large}
+\setbeamerfont{block title}{size=\Large}
+% 。左上角ã€å³ä¸‹è§’的装饰å¯ä»¥é…Œæƒ…调整大å°â€¦â€¦ä¸ç„¶å³ä¸‹çœŸçš„有点太大
+% (或者è¦æ•…æ„ä¿ç•™åŽŸå¤§å°æ¥å……版é¢ä¹Ÿä¸æ˜¯ä¸å¯ä»¥å“ˆå“ˆå“ˆ
+% \setlength{\TQTopDecoWidth}{0.5\paperwidth}
+\setlength{\TQBottomDecoWidth}{0.2\paperwidth}
+% \renewcommand{\TQTopDecoOpacity}{0.3}
+% \renewcommand{\TQBottomDecoOpacity}{0.45}
+
+\title{当天é’beamer主题拿æ¥åšæµ·æŠ¥}
+\author{作者甲ã€ä½œè€…ä¹™ã€ä½œè€…丙}
+
+\begin{document}
+
+\begin{frame}
+
+% ……懒得折腾了,\frametitle挺好看的,就这样å§ã€èººå¹³ing
+\frametitle{\insertshorttitle}
+\framesubtitle{\insertshortauthor}
+
+\begin{block}{天é’色等烟雨}
+ \begin{itemize}
+ \item 炊烟袅袅å‡èµ·ï¼Œ 隔江åƒä¸‡é‡Œã€‚
+ \begin{itemize}
+ \item 在瓶底书刻隶仿å‰æœçš„飘逸
+ \begin{itemize}
+ \item 就当我为é‡è§ä½ ä¼ç¬”
+ \end{itemize}
+ \end{itemize}
+ \end{itemize}
+
+ \begin{enumerate}
+ \item 本æ¥è¿™ä¸ªbeamer主题样å¼ï¼Œæƒ³å–å“é’花瓷â€çš„。ä¸è¿‡å§‹ç»ˆæ²¡èƒ½åŠ›é‡çŽ°å‡ºæ¥é‚£ç§æ„Ÿè§‰å•¦ï¼Œå°±ç®—了。
+ \item è¯è¯´æ‹¿è¿™ä¸ªæ¨¡æ¿åŽ»åšç§‘研学术性报告,真的ä¸ä¼šè¢«å¯¼å¸ˆä¸¢å‡ºæ¥å—。
+ \end{enumerate}
+\end{block}
+
+\begin{columns}[T]
+ \column{.47\textwidth}
+
+ \begin{exampleblock}{算了我也ä¸çŸ¥é“在写什么,do you?}
+ Now solve $x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a}$. 对å„ä½åŒå­¦æ¥è¯´åº”该挑战ä¸å¤§ã€‚
+ \end{exampleblock}
+
+ \begin{alertblock}{算了我也ä¸çŸ¥é“在写什么,do you?}
+ \[ x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a} \]
+ \end{alertblock}
+
+ \begin{block}{算了我也ä¸çŸ¥é“在写什么,do you?}
+ \[ x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a} \]
+ \end{block}
+
+ \begin{proof}
+ 显而易è§ï¼Œ$1+1=2$.
+ \end{proof}
+
+ \begin{theorem}
+ 有一件很美好的事情将è¦å‘生,它终会å‘生。
+ \end{theorem}
+
+ \column{.47\textwidth}
+
+ \begin{block}{é’花瓷}
+ \begin{itemize}
+ \item 炊烟袅袅å‡èµ·ï¼Œ 隔江åƒä¸‡é‡Œã€‚
+ \begin{itemize}
+ \item 在瓶底书刻隶仿å‰æœçš„飘逸
+ \begin{itemize}
+ \item 就当我为é‡è§ä½ ä¼ç¬”
+ \end{itemize}
+ \end{itemize}
+ \end{itemize}
+
+ \begin{enumerate}
+ \item 本æ¥è¿™ä¸ªbeamer主题样å¼ï¼Œæƒ³å–å“é’花瓷â€çš„。ä¸è¿‡å§‹ç»ˆæ²¡èƒ½åŠ›é‡çŽ°å‡ºæ¥é‚£ç§æ„Ÿè§‰å•¦ï¼Œå°±ç®—了。
+ \item è¯è¯´æ‹¿è¿™ä¸ªæ¨¡æ¿åŽ»åšç§‘研学术性报告,真的ä¸ä¼šè¢«å¯¼å¸ˆä¸¢å‡ºæ¥å—。
+ \item \begin{minipage}[t]{.8\hsize}(其实我当åˆè®¾è®¡è¿™ä¸ªbeamer主题的å°è±¡ä¸å®Œå…¨æºè‡ªåŽŸæ›²ï¼Œæ›´å¤šæ˜¯æ¥è‡ªè¿™ä¸ªç‰‡æ®µï¼‰\end{minipage}\quad
+ \raisebox{-.5em}{\structure{\qrcode[height=2\ccwd]{https://www.bilibili.com/video/BV1my4y1B7Vx/?p=156}}}
+ \end{enumerate}
+ \end{block}
+
+ 有时ä¸ç”¨blocks也挺好的。
+ \begin{enumerate}
+ \item 雨纷纷 旧故里è‰æœ¨æ·±
+ \item 我å¬é—» 你始终一个人
+ \begin{enumerate}
+ \item 斑驳的城门 盘踞ç€è€æ ‘æ ¹
+ \begin{enumerate}
+ \item 石æ¿ä¸Šå›žè¡çš„是 å†ç­‰
+ \item 石æ¿ä¸Šå›žè¡çš„是 å†ç­‰
+ \end{enumerate}
+ \end{enumerate}
+ \end{enumerate}
+\end{columns}
+
+\begin{block}{\ch{SiO2}与\ch{Al2O3}å—热å˜åŒ–过程 \cite{ShaoShen2022}}
+ \Large\centering
+\ch{!(高岭石)( Al2O3*2 SiO2*2 H2O ) ->[脱水] !(å高岭石)( Al2O3 * 2 SiO2 ) ->[加热] !(ç¡…é“尖晶石)( 2 Al2O3 * 3 SiO2 ) ->[加热] !(莫æ¥çŸ³)( 3 Al2O3 * 2 SiO2 )}
+\end{block}
+
+\begin{block}{二氧化硅结构åŠå­˜åœ¨å½¢æ€\cite{ShaoShen2022}}
+\centering
+\includegraphics[width=.8\textwidth]{SiO2}\par
+(1) 二氧化硅(SiO2)结构;(2) 结晶二氧化硅;(3) 无定形二氧化硅
+\end{block}
+
+\begin{block}[width=.9\textwidth]{\refname}
+\printbibliography[heading=none]
+\end{block}
+
+\end{frame}
+\end{document}
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-beamer-sample.pdf b/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-beamer-sample.pdf
new file mode 100644
index 0000000000..b00952c2f9
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-beamer-sample.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/xiaoshan-sample.tex b/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-beamer-sample.tex
index 366b5a537a..389a2b781c 100644
--- a/graphics/pgf/contrib/pgfornament-han/xiaoshan-sample.tex
+++ b/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-beamer-sample.tex
@@ -1,4 +1,3 @@
-% !TEX program = xelatex
\documentclass[linespread=1.2,aspectratio=1610]{ctexbeamer}
\usetheme{Xiaoshan}
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-poster-sample.pdf b/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-poster-sample.pdf
new file mode 100644
index 0000000000..41bfa11853
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-poster-sample.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-poster-sample.tex b/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-poster-sample.tex
new file mode 100644
index 0000000000..6e4bbbd95c
--- /dev/null
+++ b/graphics/pgf/contrib/pgfornament-han/samples/xiaoshan-poster-sample.tex
@@ -0,0 +1,111 @@
+\documentclass[t]{ctexbeamer}
+
+\usepackage[size=a4,orientation=portrait,scale=1.4]{beamerposter}
+
+\usetheme{Xiaoshan}
+\setmonofont{Inconsolata}
+\usepackage[style=gb7714-2015]{biblatex}
+\addbibresource{sample-refs.bib}
+\usepackage{graphicx}
+
+% å¹»ç¯ç‰‡->海报需è¦çš„一些改动
+\linespread{1.2} % metropolis从\documentclass选项设置ä¸åˆ°linespreadçš„
+\setbeamertemplate{frame numbering}[none]
+\setbeamerfont{frametitle}{series=\mdseries\huge}
+% frankly idk why the additional space is needed on the poster
+\makeatletter
+\setbeamerfont{framesubtitle}{size=\large\hskip0.25\metropolis@frametitle@padding}
+\makeatother
+\addtobeamertemplate{block begin}{\large}{\normalsize}
+\setbeamerfont{block title}{size=\large}
+\addtobeamertemplate{block example begin}{\large}{\normalsize}
+\setbeamerfont{block title example}{size=\large}
+\addtobeamertemplate{block alerted begin}{\large}{\normalsize}
+\setbeamerfont{block title alerted}{size=\large}
+\setbeamercolor{bibliography entry note}{fg=block body.fg}
+
+% adjust itemize/enumerate list indents if necessary
+\setlength{\leftmargini}{1em}
+
+
+\urlstyle{tt}
+
+\title{当è§å±±beamer主题拿æ¥åšæµ·æŠ¥}
+\author{作者甲ã€ä½œè€…ä¹™ã€ä½œè€…丙}
+
+\begin{document}
+
+\begin{frame}
+
+% ……懒得折腾了,\frametitle挺好看的,就这样å§ã€èººå¹³ing
+\frametitle{\insertshorttitle}
+\framesubtitle{\insertshortauthor}
+
+\begin{block}{è§å±±åŸŽå¸‚图景}
+\begin{itemize}
+\item 绿地宋都·æ­å·žä¸–纪中心是æ­å·žç›®å‰è§„划的最高地标建筑,ä½äºŽé’±æ±Ÿä¸–纪城奥体æ¿å—核心ä½ç½®ã€‚
+\item è§å±±åŸŽå¸‚规划的一些相关æ€è€ƒ\cite{ChenCai2021,ZhuEtal2021}
+\item \textbf{《次韵è§å±±å‹äººã€‹çŽ‹ç¥Žï¼š}
+长忆è§ç„¶å±±ä¸‹åŽ¿ï¼ŒåŽ»ç§‹ä¸ºå®¢æ—¥æ‹›é‚€ã€‚
+夕阳玄度飞轮塔,晓雨文通梦笔桥。
+æœæ£€è™«é±¼ç©·ã€Šå°”雅》,å’æ­Œè‰æœ¨ç»­ã€Šç¦»éªšã€‹ã€‚
+旧游回首æˆå‡‹è°¢ï¼ŒèŽ«é£éŸ³ä¹¦ä¼¼è·¯é¥ã€‚
+\end{itemize}
+
+\end{block}
+
+\smallskip
+
+\begin{columns}[T]
+\column{.45\textwidth}
+
+\begin{exampleblock}{算了我也ä¸çŸ¥é“在写什么,do you?}
+ Now solve $x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a}$. 对å„ä½åŒå­¦æ¥è¯´åº”该挑战ä¸å¤§ã€‚
+\end{exampleblock}
+
+\begin{alertblock}{算了我也ä¸çŸ¥é“在写什么,do you?}
+ \[ x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a} \]
+\end{alertblock}
+
+\begin{block}{算了我也ä¸çŸ¥é“在写什么,do you?}
+ \[ x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a} \]
+\end{block}
+
+% 个人觉得这个主题,多æ ä¹‹é—´éœ€è¦æœ‰ä¸ªé—´éš”。但是高度需è¦è‡ªå·±è°ƒæ•´ã€‚
+\column{.01\textwidth}
+\textcolor{structure!80}{\rule{.1mm}{.22\textheight}}
+
+\column{.45\textwidth}
+\begin{proof}
+ 显而易è§ï¼Œ$1+1=2$.
+\end{proof}
+
+\begin{theorem}
+ 有一件很美好的事情将è¦å‘生,它终会å‘生。
+\end{theorem}
+
+\begin{block}{è§å±±åŸŽå¸‚图景}
+\begin{itemize}
+\item 绿地宋都·æ­å·žä¸–纪中心是æ­å·žç›®å‰è§„划的最高地标建筑,ä½äºŽé’±æ±Ÿä¸–纪城奥体æ¿å—核心ä½ç½®ã€‚
+\item è§å±±åŸŽå¸‚规划的一些相关æ€è€ƒ\cite{ChenCai2021,ZhuEtal2021}
+\end{itemize}
+\end{block}
+
+\end{columns}
+
+\begin{block}{æ­å·žå¸‚è§å±±å¥¥ä½“绿地宋都·æ­å·žä¸–纪中心}
+\smallskip
+\centering
+\includegraphics[width=\textwidth,clip,trim=0pt 2cm 0pt 8cm,]{hangzhou-arch.jpg}\\
+图æ¥è‡ª \url{https://www.sohu.com/a/717899399_220260}
+\end{block}
+
+
+\begin{block}{\refname}
+\renewcommand*{\bibfont}{\small\linespread{1}\selectfont}
+\setlength{\biblabelsep}{0.25em}
+\printbibliography[heading=none]
+\end{block}
+
+\end{frame}
+\end{document}
diff --git a/graphics/pgf/contrib/pgfornament-han/tianqing-sample.pdf b/graphics/pgf/contrib/pgfornament-han/tianqing-sample.pdf
deleted file mode 100644
index 174e0865d0..0000000000
--- a/graphics/pgf/contrib/pgfornament-han/tianqing-sample.pdf
+++ /dev/null
Binary files differ
diff --git a/graphics/pgf/contrib/pgfornament-han/xiaoshan-sample.pdf b/graphics/pgf/contrib/pgfornament-han/xiaoshan-sample.pdf
deleted file mode 100644
index 938436b852..0000000000
--- a/graphics/pgf/contrib/pgfornament-han/xiaoshan-sample.pdf
+++ /dev/null
Binary files differ
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/DEPENDS.txt b/graphics/pgf/contrib/pgfplotsthemebeamer/DEPENDS.txt
new file mode 100644
index 0000000000..1c4fa2d593
--- /dev/null
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/DEPENDS.txt
@@ -0,0 +1,3 @@
+hard beamer
+hard tools
+hard pgfplots \ No newline at end of file
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/README.md b/graphics/pgf/contrib/pgfplotsthemebeamer/README.md
new file mode 100644
index 0000000000..47c815caaf
--- /dev/null
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/README.md
@@ -0,0 +1,39 @@
+# pgfplotsthemebeamer
+
+[![License](https://img.shields.io/github/license/samcarter/pgfplotsthemebeamer.svg?color=blue)](http://www.latex-project.org/lppl.txt)
+[![GitHub tag](https://img.shields.io/github/tag/samcarter/pgfplotsthemebeamer.svg?label=current%20version&color=blue)](https://github.com/samcarter/pgfplotsthemebeamer/releases/latest)
+[![CTAN](https://img.shields.io/ctan/v/pgfplotsthemebeamer.svg?color=blue)](https://ctan.org/pkg/pgfplotsthemebeamer)
+
+A package for using colours from the current beamer theme in pgfplots diagrams.
+
+This project is licensed under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt .
+
+The project repository, including a bug tracker, can be found at https://github.com/samcarter/pgfplotsthemebeamer/issues .
+
+### Usage
+
+```latex
+\documentclass{beamer}
+
+\usetheme{moloch}% just as an example for a colour theme
+\usepackage{pgfplotsthemebeamer}
+
+\begin{document}
+
+\begin{frame}[plain]
+\centering
+\begin{tikzpicture}
+ \begin{axis}[
+ beamercolors
+ ]
+ \addplot {x}; \addplot {x-1}; \addplot {x-2};
+ \addplot {x-3}; \addplot {x-4}; \addplot {x-5};
+ \addplot {x-6}; \addplot {x-7}; \addplot {x-8};
+ \end{axis}
+\end{tikzpicture}
+\end{frame}
+
+\end{document}
+```
+
+For more details, please consult the [package documentation](https://github.com/samcarter/pgfplotsthemebeamer/blob/main/DOCUMENTATION.pdf).
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc-settings.sty b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc-settings.sty
new file mode 100644
index 0000000000..cd57229fcf
--- /dev/null
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc-settings.sty
@@ -0,0 +1,200 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Personal helper theme for package documentations
+% Copyright samcarter
+%
+% This file may be distributed and/or modified
+% under the LaTeX Project Public License 1.3c or later
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Usage:
+% ln ~/Life/latex/beamertheme-sam/themesam.sty package-doc-settings.sty
+% \usepackage[
+% themecolor=samdblue
+% ]{\jobname-settings}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Colours
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{xcolor}
+\definecolor{samyellow}{RGB}{246,193,65}
+\definecolor{samorange}{RGB}{241,147,45}% pgfplotsthemebeamer
+\definecolor{samred}{RGB}{191,26,46}% TikZbricks
+\definecolor{sammagenta}{RGB}{170,42,104}% TikZmarmots
+\definecolor{samviolet}{RGB}{136,46,114}% TikZlings
+\definecolor{samlila}{RGB}{101,67,159}% Rainbow beamer theme
+\definecolor{samdblue}{RGB}{0,51,134}% beamer theme
+\definecolor{samlblue}{RGB}{22,89,155}% TikZducks
+\definecolor{samteal}{RGB}{25,143,157}% Tcolorbox beamer theme
+\definecolor{samlgreen}{RGB}{68,170,153}% Jigsaw
+\definecolor{samdgreen}{RGB}{78,178,125}
+\definecolor{samlgray}{RGB}{160,160,185}
+\definecolor{samdgray}{RGB}{60,60,85}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Package options
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{xkeyval}
+\DeclareOptionX{themecolor}[samdblue]{\colorlet{themecolor}{#1}}
+\DeclareOptionX{listingcolor}[samlblue]{\colorlet{listingcolor}{#1}}
+\ExecuteOptionsX{themecolor,listingcolor}
+\ProcessOptionsX
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Packages
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\@ifclassloaded{beamer}{}{%
+ \RequirePackage[english]{babel}
+ \RequirePackage[paper=a4paper,margin=2.9cm]{geometry}
+ \RequirePackage{scrlayer-scrpage}
+ \let\hrulefillx\hrulefill
+ \RequirePackage[bitstream-charter]{mathdesign}
+ \let\hrulefill\hrulefillx
+ \RequirePackage[hang,flushmargin,bottom]{footmisc}
+ \RequirePackage{footnotehyper}
+ \makesavenoteenv{tcolorbox}
+ \RequirePackage[all]{nowidow}
+ \RequirePackage[colorlinks=true,breaklinks=true,allcolors=themecolor,hyperfootnotes=false]{hyperref}
+}
+\RequirePackage[T1]{fontenc}
+\RequirePackage{xspace}
+\RequirePackage{inconsolata}% mono font with bold, but italic is missing
+% \RequirePackage[scale=0.85]{cascadia-code}
+% \AddToHook{cmd/ttfamily/before}{\fontseries{sl}}
+\RequirePackage{iexec}
+\usepackage{synthslant}% to fake slented comments in inconsolata
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Listings
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage[
+ cachedir=$TMPDIR/minted/
+]{minted}
+
+% smuggling custom pygmentize style in cache folder
+% (a real pygmentise style would need installtion in some python folder)
+\begin{filecontents*}[noheader,overwrite]{./sam.pygstyle}
+\makeatletter
+\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax%
+ \let\PYG@ul=\relax \let\PYG@tc=\relax%
+ \let\PYG@bc=\relax \let\PYG@ff=\relax}
+\def\PYG@tok#1{\csname PYG@tok@#1\endcsname}
+\def\PYG@toks#1+{\ifx\relax#1\empty\else%
+ \PYG@tok{#1}\expandafter\PYG@toks\fi}
+\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{%
+ \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}}
+\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}}
+
+% optional arguments
+\expandafter\def\csname PYG@tok@na\endcsname{\def\PYG@tc##1{\textcolor{black}{##1}}}
+
+% macros
+\expandafter\def\csname PYG@tok@k\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
+% curly brakets
+\expandafter\def\csname PYG@tok@nb\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
+
+% comments (italics won't work with the inconsolata font)
+\expandafter\def\csname PYG@tok@c\endcsname{\def\PYG@tc##1{\textcolor{gray}{\textsynthslant{##1}}}}
+
+\def\PYGZbs{\char`\\}
+\def\PYGZus{\char`\_}
+\def\PYGZob{\char`\{}
+\def\PYGZcb{\char`\}}
+\def\PYGZca{\char`\^}
+\def\PYGZam{\char`\&}
+\def\PYGZlt{\char`\<}
+\def\PYGZgt{\char`\>}
+\def\PYGZsh{\char`\#}
+\def\PYGZpc{\char`\%}
+\def\PYGZdl{\char`\$}
+\def\PYGZhy{\char`\-}
+\def\PYGZsq{\char`\'}
+\def\PYGZdq{\char`\"}
+\def\PYGZti{\char`\~}
+% for compatibility with earlier versions
+\def\PYGZat{@}
+\def\PYGZlb{[}
+\def\PYGZrb{]}
+\makeatother
+\end{filecontents*}
+
+\iexec{mkdir -p $TMPDIR/minted && mv sam.pygstyle $TMPDIR/minted/.}
+
+\usemintedstyle{sam}
+\setminted{
+ breaksymbolleft={},
+ tabsize=2,
+ breaklines=true,
+}
+\newminted[samcode]{latex}{}
+\newmintinline[saminline]{latex}{}
+
+% use non-bold and all coloured for inline code in articles
+\ifdefined\insertaspectratio\else
+ \patchcmd{\minted@inputpyg@inline}{\minted@input}{\color{listingcolor}\renewcommand\textcolor[3][]{##3}\renewcommand\bfseries{}\minted@input}{}{}
+\fi
+
+\RequirePackage[most]{tcolorbox}
+\tcbuselibrary{minted}
+\tcbset{%
+ colframe=themecolor,
+ fonttitle=\bfseries,
+ sidebyside,
+ center lower,
+ righthand width=5.7cm,
+ bottom=2pt,
+ top=2pt,
+ left=3pt,
+ right=3pt,
+ sidebyside gap=10pt,
+ lower separated=false,
+ listing engine=minted,
+ minted language=latex,
+ colback=themecolor!10,
+ sharp corners,
+ boxrule=0pt,
+ before title={\strut}
+}
+
+% avoid page breaks right in front of the tcolorbox
+\@ifclassloaded{beamer}{}{
+ \tcbuselibrary{hooks}
+ \tcbset{before pre={\nopagebreak[4]}}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% document settings
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\@ifclassloaded{scrartcl}{%
+ \KOMAoptions{parskip=half}
+ \addtokomafont{sectioning}{\color{themecolor}}
+ \addtokomafont{date}{\normalsize}
+ \addtokomafont{author}{\normalsize}
+ \setlength{\footnotemargin}{0.7em}
+}{}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Custom macros
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\providecommand*{\CTAN}{\textsc{CTAN}\xspace}
+\providecommand*{\TikZ}{Ti\emph{k}Z\xspace}
+\providecommand*{\miktex}{MiK\TeX\xspace}
+\providecommand*{\texlive}{\TeX{}Live\xspace}
+\providecommand*{\tikzbrick}{Ti\emph{k}Zbrick\xspace}
+\providecommand*{\tikzducks}{Ti\emph{k}Zducks\xspace}
+\providecommand*{\tikzlings}{Ti\emph{k}Zlings\xspace}
+\providecommand*{\tikzmarmots}{Ti\emph{k}Zmarmots\xspace}
+\providecommand*{\ConTeXt}{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt} \ No newline at end of file
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.pdf b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.pdf
new file mode 100644
index 0000000000..a312a05245
--- /dev/null
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.tex b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.tex
new file mode 100644
index 0000000000..3beb6c99b6
--- /dev/null
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer-doc.tex
@@ -0,0 +1,119 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Documentation for the pgfplotsthemebeamer package
+% Using colours from the current beamer theme in pgfplots
+% Maintained by samcarter
+%
+% Project repository and bug tracker:
+% https://github.com/samcarter/pgfplotstheme-beamer
+%
+% Released under the LaTeX Project Public License v1.3c or later
+% See http://www.latex-project.org/lppl.txt
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% !TeX program = txs:///arara
+% arara: latexmk: {
+% arara: --> engine: pdflatex,
+% arara: --> options: [
+% arara: --> '-shell-escape',
+% arara: --> '-synctex=1',
+% arara: --> '-interaction=nonstopmode',
+% arara: --> ]
+% arara: --> }
+\documentclass{scrartcl}
+
+% meta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\title{The pgfplotsthemebeamer package}
+\subtitle{Using colours from the current beamer theme in pgfplots}
+\author{%
+ \texorpdfstring{
+ \texttt{samcarter}\\
+ \url{https://github.com/samcarter/pgfplotsthemebeamer}\\
+ \url{https://ctan.org/pkg/pgfplotsthemebeamer}
+ }{samcarter}}
+\date{Version v0.2 \textendash{} 2024/08/02}
+
+\usepackage[
+ themecolor=samorange
+]{\jobname-settings}
+
+% customisation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\prefix}{./include}
+\tcbset{
+ compilable listing/.style={listing file={\prefix/\jobname-listing-\thetcblistingcount.tex}},
+ run pdflatex/.style={run@system@command={cd\space \prefix;\space pdflatex}{\jobname-listing-\thetcblistingcount.tex}},%
+}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+\label{intro}
+
+Beamer themes often use carefully composed colour schemes. The \saminline|pgfplotsthemebeamer| package allows to reuse these colours in diagrams created with \saminline|pfgplots|. This ensures a consistent colour scheme throughout the presentation and avoids unsightly colour clashes.
+
+The package is included in \TeX{}Live
+%and MiK\TeX\
+and available from \textsc{CTAN} (\url{https://www.ctan.org/pkg/pgfplotsthemebeamer}).
+The development version of this package is located at \url{https://github.com/samcarter/pgfplotsthemebeamer}. If you have any problems, ideas or other feedback, please make constructive use of the issue tracker.
+
+Copyright \raisebox{0.2em}{\tiny\fontfamily{cmr}\selectfont\textcopyright} \texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the LaTeX project public licence, version 1.3c or later \url{http://www.latex-project.org/lppl.txt}.
+
+\section{Usage}
+
+The basic usage is fairly simple. After loading the \saminline|pgfplotsthemebeamer| package, plots can use the \saminline|beamercolor| option to use the colours from the current beamer theme in the diagram:
+\begin{tcolorbox}[title={Usage}]
+\begin{samcode}
+\usepackage{pgfplotsthemebeamer}
+
+\begin{axis}[
+ beamercolors
+]
+...
+\end{axis}
+\end{samcode}
+\end{tcolorbox}
+The graphs will be coloured in the beamer colours \saminline|structure|, \saminline|alerted text| and \saminline|example text|. In most beamer themes, these three colours form an easily distinguishable set of colours.
+
+Users who would like to use the \saminline|beamercolors| scheme for all \saminline|pgfplots| diagrams in the presentation, can load the package with the \saminline|all| option, which will make this colour scheme the default.
+\begin{tcolorbox}[title={Usage}]
+\begin{samcode}
+\usepackage[all]{pgfplotsthemebeamer}
+\end{samcode}
+\end{tcolorbox}
+
+\section{Full example}
+\begin{tcblisting}{
+ listing only,
+ freeze pdf,
+ compilable listing,
+ run pdflatex,
+ title={Basic example},
+ righthand width=0pt
+}
+\documentclass{beamer}
+
+\usetheme{moloch}% just as an example for a colour theme
+\usepackage{pgfplotsthemebeamer}
+
+\begin{document}
+
+\begin{frame}[plain]
+\centering
+\begin{tikzpicture}
+ \begin{axis}[
+ beamercolors
+ ]
+ \addplot {x}; \addplot {x-1}; \addplot {x-2}; \addplot {x-3}; \addplot {x-4}; \addplot {x-5}; \addplot {x-6}; \addplot {x-7}; \addplot {x-8};
+ \end{axis}
+\end{tikzpicture}
+\end{frame}
+
+\end{document}
+\end{tcblisting}
+\vfill
+\centering
+\setlength{\fboxsep}{0pt}%
+\fbox{\includegraphics[width=.75\textwidth]{pgfplotsthemebeamer-doc-listing-1.pdf}}%
+
+\end{document}
diff --git a/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer.sty b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer.sty
new file mode 100644
index 0000000000..23006e89c5
--- /dev/null
+++ b/graphics/pgf/contrib/pgfplotsthemebeamer/pgfplotsthemebeamer.sty
@@ -0,0 +1,37 @@
+% !TeX root = ./testing/test.tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% The pgfplotsthemebeamer package
+% Using colours from the current beamer theme in pgfplots
+% Maintained by samcarter
+%
+% Project repository and bug tracker:
+% https://github.com/samcarter/pgfplotstheme-beamer
+%
+% Released under the LaTeX Project Public License v1.3c or later
+% See http://www.latex-project.org/lppl.txt
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ProvidesPackage{pgfplotsthemebeamer}[2024/08/02 version v0.2 PGFplots colours based the colours of the current beamer theme]
+
+% error if used with a class other than beamer
+\IfClassLoadedF{beamer}{%
+ \PackageError{pgfplotsthemebeamer}{This pgfplots theme needs to be used in conjunction with the beamer class}{}
+}
+
+% setting up colours
+\RequirePackage{pgfplots}
+\pgfplotsset{
+ beamercolors/.style={
+ cycle multi list={
+ mark=*\\mark=x\\mark=square*\\mark=o\\mark=+\\mark=square\\\nextlist
+ structure.fg\\alerted text.fg\\example text.fg\\
+ }
+ }
+}
+
+% making beamercolors default if package is loaded with `all` option
+\DeclareOption{all}{
+ \pgfplotsset{beamercolors}
+}
+\ProcessOptions\relax
diff --git a/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.pdf b/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.pdf
index 160751afc2..ecb80966c2 100644
--- a/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.pdf
+++ b/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.tex b/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.tex
index ae34054bba..ca2ce649d4 100644
--- a/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.tex
+++ b/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.tex
@@ -45,9 +45,9 @@
\usepackage[margin=1.5cm]{geometry}
\setlength{\parindent}{0pt}
-\def\TPversion{0.1.4}
-\def\TPdate{16/04/2024}
-
+\def\TPversion{0.1.6}
+\def\TPdate{04/01/2025}
+\usepackage{minted2}
\usepackage[most]{tcolorbox}
\tcbuselibrary{minted}
\NewTCBListing{PresentationCode}{ O{blue} m }{%
@@ -453,6 +453,33 @@ In the following example, the \textit{symbols} to print can't be used for the \t
\pagebreak
+\subsection{Symbols within list(s)}
+
+List of symbols can be given within list(s), picked randomly.
+
+\begin{PresentationCode}{}
+\begin{filecontents*}[overwrite]{testlist.csv}
+A,B,C,A
+A,B,B,C
+B,A,C,B
+C,A,B,C
+\end{filecontents*}
+
+\textbf{Notice : }
+
+Multiples of 5 : red\\
+Multiples of 3 : green\\
+Multiples of 2 : blue
+
+\PixlArtTikz[Codes=ABC,Symbols={5§25§35,3§9§21§27,2§4§8§14§16},Symb,Style=\large\sffamily,Unit=0.85]{testlist.csv}
+\hspace{5mm}
+\PixlArtTikz[Codes=ABC,Symbols={5§25§35,3§9§21§27,2§4§8§14§16},Symb,Style=\large\sffamily,Unit=0.85]{testlist.csv}
+\hspace{5mm}
+\PixlArtTikz[Codes=ABC,Colors={red,green,blue},Correction,Style=\large\sffamily,Unit=0.85]{testlist.csv}
+\end{PresentationCode}
+
+\pagebreak
+
\subsection{Starred macro}
The starred macro \texttt{\textbackslash PixlArtTikz*} is to be used within an already created environment. It can be useful for adding code after the PixelArt.
@@ -877,10 +904,43 @@ In this paragraph, we use the data \texttt{PAsorciere}, which corresponds to the
\end{tabular}
\end{PresentationCode}
+\pagebreak
+
+\section{With datatool}
+
+\subsection{Macros}
+
+\begin{PresentationCode}{listing only}
+%reading of csv
+\readdtcsv{file.csv}{readname}
+
+%full pixelart (french keys for the moment...)
+\dtpixlarttikz[keys]{readname}
+
+%cut pixelart (french keys for the moment...)
+\dtpixlarttikzblock[clés]{readname}{LxC or L+C}{numblock}
+\end{PresentationCode}
+
+\begin{PresentationCode}{}
+%reading of csv (koala)
+\readdtcsv{PAkoala.csv}{DTkoala}
+
+%full pixelart
+\dtpixlarttikz[Correction,Unite=0.125,Codes=ABCDEFGHI,Couleurs={\listcoulkoala},Decoupage=8x8]{DTkoala}
+
+%cut pixelart (french keys for the moment...)
+\dtpixlarttikzblock[Unite=0.125,Correction,Codes=ABCDEFGHI,Couleurs={\listcoulkoala}]%
+ {DTkoala}{8x8}{1/1}
+\end{PresentationCode}
+
\newpage
\part{History}
+\verb|v0.1.6|~:~~~~Styles for lines + \textsf{datatool} for alternative version
+
+\verb|v0.1.5|~:~~~~Symbols can be given with list(s) + Enhancements of internal code
+
\verb|v0.1.4|~:~~~~Anamorphic cylinder PixelArts
\verb|v0.1.3|~:~~~~Cut PixelArts within several PixelArts
diff --git a/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.pdf b/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.pdf
index dba701f59d..29070143dc 100644
--- a/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.pdf
+++ b/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.tex b/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.tex
index 94e9f30b37..794d20bd36 100644
--- a/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.tex
+++ b/graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.tex
@@ -44,9 +44,10 @@
\usepackage[margin=1.5cm]{geometry}
\setlength{\parindent}{0pt}
-\def\TPversion{0.1.4}
-\def\TPdate{16 avril 2024}
+\def\TPversion{0.1.6}
+\def\TPdate{4 janvier 2025}
+\usepackage{minted2}
\usepackage[most]{tcolorbox}
\tcbuselibrary{minted}
\NewTCBListing{PresentationCode}{ O{blue} m }{%
@@ -206,12 +207,12 @@ Avant toute chose, quelques petites infos sur les données au format \textsf{csv
Le fichier \textsf{csv} peut être déclaré directement dans le fichier \textsf{tex}, grâce à l'environnement \textsf{filecontents} (intégré en natif sur les dernières versions de \LaTeX) :
\begin{PresentationCode}{listing only}
- \begin{filecontents*}{nomfichier.csv}
- A,B,C,D
- A,B,D,C
- B,A,C,D
- B,A,D,C
- \end{filecontents*}
+\begin{filecontents*}{nomfichier.csv}
+ A,B,C,D
+ A,B,D,C
+ B,A,C,D
+ B,A,D,C
+\end{filecontents*}
\end{PresentationCode}
À la compilation, le fichier \textsf{nomfichier.csv} sera créé automatiquement, et l'option \Cle{[overwrite]} permet (logiquement) de propager les modifications au fichier \textsf{csv}.
@@ -237,6 +238,8 @@ L'option \Cle{[csvii]} permet de passer l'appel au package en version \hologo{La
%\RequirePackage[legacy]{csvsimple}
\end{PresentationCode}
+À noter qu'une version alternative \textit{simple}, avec le package \textsf{datatool}, est également disponible.
+
\subsection{Packages utilisés}
Le package est compatible avec les compilations usuelles en \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} ou \textsf{xelatex}.
@@ -504,6 +507,35 @@ Dans l'exemple suivant, les \textit{symboles} à afficher ne peuvent pas servir
\pagebreak
+\subsection{Symboles dans une liste}
+
+À noter qu'il est possible de donner comme symboles des listes dans lesquelles seront choisies aléatoirement les symboles.
+
+\begin{PresentationCode}{}
+%codes à afficher, avec utiliser des symboles "alétaoires" dans une liste
+
+\begin{filecontents*}[overwrite]{testlist.csv}
+A,B,C,A
+A,B,B,C
+B,A,C,B
+C,A,B,C
+\end{filecontents*}
+
+\textbf{Notice : }
+
+Multiples de 5 : Rouge\\
+Multiples de 3 : Vert\\
+Multiples de 2 : Bleu
+
+\PixelArtTikz[Codes=ABC,Symboles={5§25§35,3§9§21§27,2§4§8§14§16},Symb,Style=\large\sffamily,Unite=0.85]{testlist.csv}
+\hspace{5mm}
+\PixelArtTikz[Codes=ABC,Symboles={5§25§35,3§9§21§27,2§4§8§14§16},Symb,Style=\large\sffamily,Unite=0.85]{testlist.csv}
+\hspace{5mm}
+\PixelArtTikz[Codes=ABC,Couleurs={red,green,blue},Correction,Style=\large\sffamily,Unite=0.85]{testlist.csv}
+\end{PresentationCode}
+
+\pagebreak
+
\subsection{Commande étoilée}
La commande \textit{étoilée} \texttt{\textbackslash PixelArtTikz*} permet d'intégrer le PixelArt dans un environnement créé par l'utilisateur. Cela permet par exemple de pouvoir rajouter du code en parallèle du PixelArt.
@@ -1110,8 +1142,49 @@ Il est également possible de créer le tableau \textit{manuellement}, avec une
\pagebreak
+\section{Avec le package datatool}
+
+\subsection{Commandes}
+
+Le package \textsf{datatool}, chargé par \textsf{PixelArtTikz}, permet de représenter un PixelArt (sans environnement).
+
+Les clés sont les mêmes que pour la version \textsf{csvsimple}, mais il est nécessaire de \textit{traiter} le ficher \textsf{csv} en amont des tracés.
+
+\begin{PresentationCode}{listing only}
+%lecture du fichier csv
+\readdtcsv{fichier.csv}{nomlecture}
+
+%traitement du PixelArt complet
+\dtpixlarttikz[clés]{nomlecture}
+
+%traitement du PixelArt en mode découpage
+\dtpixlarttikzblock[clés]{nomlecture}{LxC ou L+C}{numbloc}
+\end{PresentationCode}
+
+À noter que la commande est autonome, ne permet pas d'ajouts éventuels, mais est compatible avec le traitement par découpage (mais sans création automatique des blocs de découpage avec présentation).
+
+\subsection{Exemple}
+
+\begin{PresentationCode}{}
+%lecture du fichier csv (koala)
+\readdtcsv{PAkoala.csv}{DTkoala}
+
+%traitement du PixelArt complet
+\dtpixlarttikz[Correction,Unite=0.125,Codes=ABCDEFGHI,Couleurs={\listcoulkoala},Decoupage=8x8]{DTkoala}
+
+%traitement du PixelArt en mode découpage
+\dtpixlarttikzblock[Unite=0.125,Correction,Codes=ABCDEFGHI,Couleurs={\listcoulkoala}]%
+ {DTkoala}{8x8}{1/1}
+\end{PresentationCode}
+
+\pagebreak
+
\part{Historique}
+\verb|v0.1.6|~:~~~~Ajout d'un style pour les traits + utilisation de \textsf{datatool} (plus rapide ?)
+
+\verb|v0.1.5|~:~~~~Symboles sous forme de liste(s) (éléments tirés aléatoirement) + Amélioration du traitement
+
\verb|v0.1.4|~:~~~~PixelArts avec anamorphose cylindrique
\verb|v0.1.3|~:~~~~Possibilité de créer des PixelArts collaboratifs
diff --git a/graphics/pgf/contrib/pixelarttikz/doc/testlist.csv b/graphics/pgf/contrib/pixelarttikz/doc/testlist.csv
new file mode 100644
index 0000000000..ab1d24e697
--- /dev/null
+++ b/graphics/pgf/contrib/pixelarttikz/doc/testlist.csv
@@ -0,0 +1,4 @@
+A,B,C,A
+A,B,B,C
+B,A,C,B
+C,A,B,C
diff --git a/graphics/pgf/contrib/pixelarttikz/tex/PixelArtTikz.sty b/graphics/pgf/contrib/pixelarttikz/tex/PixelArtTikz.sty
index 711b0e919a..bcd4f6c79a 100644
--- a/graphics/pgf/contrib/pixelarttikz/tex/PixelArtTikz.sty
+++ b/graphics/pgf/contrib/pixelarttikz/tex/PixelArtTikz.sty
@@ -1,8 +1,10 @@
% Author.........: C. Pierquet
-% licence........: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
+% licence........: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{PixelArtTikz}[2024/04/16 v0.1.4 PixelArts with csv and TikZ]
+\ProvidesPackage{PixelArtTikz}[2025/01/04 v0.1.6 PixelArts with csv and TikZ]
+% 0.1.6 Ajout d'un style pour les traits + utilisation de datatool (plus rapide ?)
+% 0.1.5 Amélioration du code interne + possibilité de créer des grilles avec des symboles choisis dans une liste
% 0.1.4 Cylinder anamorphic pixelart
% 0.1.3 Split PA into grid
% 0.1.2 Mini pixerlart
@@ -23,8 +25,7 @@
\RequirePackage{xstring}
\RequirePackage{multicol}
\RequirePackage{listofitems}
-%librairies tikz
-%\usetikzlibrary{calc,shapes.geometric}
+\RequirePackage{ifthen}
%cvs
\if@csvii
\RequirePackage[legacy]{csvsimple}
@@ -33,6 +34,24 @@
\RequirePackage[l3]{csvsimple}
\fi
+%------Styles tikz
+\tikzset{pixlarttrait/.style={}}
+\tikzset{pixlarttraitdecoup/.style={thick,purple}}
+\tikzset{pixlartnoticedecoup/.style={font=\large\sffamily}}
+
+\NewDocumentCommand\TraiteListeSymbPixelArt{ m }{%
+ \IfSubStr{#1}{§}%
+ {%
+ \setsepchar{§}%
+ \readlist*\lstPAchoices{#1}%
+ \xdef\lstPAchoicesrand{\fpeval{randint(1,\lstPAchoiceslen)}}%
+ \lstPAchoices[\lstPAchoicesrand]%
+ }%
+ {%c'est normal
+ #1%
+ }%
+}
+
%------clés [fr] / keys [en]
\defKV[pixelarttkz]{%
Codes=\def\PATlettres{#1},%
@@ -60,36 +79,31 @@
\IfBooleanTF{#1}{}{\begin{tikzpicture}[x=\PATunit cm,y=\PATunit cm,#3]}
\ifboolKV[pixelarttkz]{Correction}%
{%
+ \readlist*\LCPA\PATcouleurs%
\csvloop{file=#4,no head,command={%
\foreach \l [count=\n] in \csvline {%
\StrDel{\l}{ }[\l]%
- \setsepchar{,}%
- \readlist*\LCPA\PATcouleurs%
\StrPosition{\PATlettres}{\l}[\pixcnt]%
- \xintifboolexpr{\pixcnt>0}%
- {%
- \itemtomacro\LCPA[\pixcnt]\pixcol%
- \ifboolKV[pixelarttkz]{BordCases}%
- {\draw[fill=\pixcol] ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) ;}%
- {\filldraw[\pixcol] ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) ;}%
- }%
- {}%
+ \ifnum\pixcnt>0%
+ \ifboolKV[pixelarttkz]{BordCases}%
+ {\draw[fill={\LCPA[\pixcnt]}] ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) ;}%
+ {\filldraw[{\LCPA[\pixcnt]}] ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) ;}%
+ \fi%
}%
}%
}%
}%
{%
\ifboolKV[pixelarttkz]{Symb}{%affichage du pixelart versions chiffres si besoin
+ \readlist*\LCNA\PATchiffres%
\csvloop{file=#4,no head,command={%
\foreach \l [count=\n] in \csvline {%
\StrDel{\l}{ }[\l]%
- \setsepchar{,}%
- \readlist*\LCNA\PATchiffres%
\StrPosition{\PATlettres}{\l}[\pixpos]%
\xintifboolexpr{\pixpos>0}%
{%
\itemtomacro\LCNA[\pixpos]\pixchf%
- \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\pixchf} ;%
+ \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
}%
{}%
}%
@@ -120,8 +134,8 @@
\IfSubStr{\PATdecoup}{x}%
{%
\StrCut{\PATdecoup}{x}{\NbLigBloc}{\NbColBloc}%tracés des traits
- \foreach \i in {0,\NbLigBloc,...,\NbLigTot}{\draw[thick,purple] ({0.5-0.33},{-\i-0.5}) -- ({\thecsvcolumncount+0.5+0.33},{-\i-0.5}) ;}%
- \foreach \j in {0,\NbColBloc,...,\NbColTot}{\draw[thick,purple] ({\j+0.5},{-0.5+0.33}) -- ({\j+0.5},{-\thecsvinputline+0.5-0.33}) ;}%
+ \foreach \i in {0,\NbLigBloc,...,\NbLigTot}{\draw[pixlarttraitdecoup] ({0.5-0.33},{-\i-0.5}) -- ({\thecsvcolumncount+0.5+0.33},{-\i-0.5}) ;}%
+ \foreach \j in {0,\NbColBloc,...,\NbColTot}{\draw[pixlarttraitdecoup] ({\j+0.5},{-0.5+0.33}) -- ({\j+0.5},{-\thecsvinputline+0.5-0.33}) ;}%
}%
{}%
\IfSubStr{\PATdecoup}{+}%
@@ -129,8 +143,8 @@
\StrCut{\PATdecoup}{+}{\NbBlocLIG}{\NbBlocCOL}%
\def\NbLigBloc{\xintieval{(\NbLigTot-1)/\NbBlocLIG}}%
\def\NbColBloc{\xintieval{(\NbColTot)/\NbBlocCOL}}%
- \foreach \i in {0,\NbLigBloc,...,\NbLigTot}{\draw[thick,purple] ({0.5-0.33},{-\i-0.5}) -- ({\thecsvcolumncount+0.5+0.33},{-\i-0.5}) ;}%
- \foreach \j in {0,\NbColBloc,...,\NbColTot}{\draw[thick,purple] ({\j+0.5},{-0.5+0.33}) -- ({\j+0.5},{-\thecsvinputline+0.5-0.33}) ;}%
+ \foreach \i in {0,\NbLigBloc,...,\NbLigTot}{\draw[pixlarttraitdecoup] ({0.5-0.33},{-\i-0.5}) -- ({\thecsvcolumncount+0.5+0.33},{-\i-0.5}) ;}%
+ \foreach \j in {0,\NbColBloc,...,\NbColTot}{\draw[pixlarttraitdecoup] ({\j+0.5},{-0.5+0.33}) -- ({\j+0.5},{-\thecsvinputline+0.5-0.33}) ;}%
}%
{}%
}%
@@ -145,11 +159,10 @@
\begin{tikzpicture}[x=\PATunit cm,y=\PATunit cm,#2]
\ifboolKV[pixelarttkz]{Correction}%
{%
+ \readlist*\LCPA\PATcouleurs%
\csvloop{file=#3,no head,command={%
\foreach \l [count=\n] in \csvline {%
\StrDel{\l}{ }[\l]%
- \setsepchar{,}%
- \readlist*\LCPA\PATcouleursù
\StrPosition{\PATlettres}{\l}[\pixcnt]%
\xintifboolexpr{\pixcnt>0}%
{%
@@ -165,16 +178,15 @@
}%
{%
\ifboolKV[pixelarttkz]{Symb}{%affichage du pixelart versions chiffres si besoin
+ \readlist*\LCNA\PATchiffres%
\csvloop{file=#3,no head,command={%
\foreach \l [count=\n] in \csvline {%
\StrDel{\l}{ }[\l]%
- \setsepchar{,}%
- \readlist*\LCNA\PATchiffres%
\StrPosition{\PATlettres}{\l}[\pixpos]%
\xintifboolexpr{\pixpos>0}%
{%
\itemtomacro\LCNA[\pixpos]\pixchf%
- \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\pixchf} ;%
+ \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
}%
{}%
}%
@@ -226,11 +238,10 @@
\IfBooleanTF{#1}{}{\begin{tikzpicture}[x=\PATunit cm,y=\PATunit cm,#3]}
\ifboolKV[pixelarttkzen]{Correction}%
{%
+ \readlist*\LCPA\PATcouleurs%
\csvloop{file=#4,no head,command={%
\foreach \l [count=\n] in \csvline {%
\StrDel{\l}{ }[\l]%
- \setsepchar{,}%
- \readlist*\LCPA\PATcouleurs%
\StrPosition{\PATlettres}{\l}[\pixcnt]%
\xintifboolexpr{\pixcnt>0}%
{%
@@ -246,16 +257,15 @@
}%
{%
\ifboolKV[pixelarttkzen]{Symb}{%affichage du pixelart versions chiffres si besoin
+ \readlist*\LCNA\PATchiffres%
\csvloop{file=#4,no head,command={%
\foreach \l [count=\n] in \csvline {%
\StrDel{\l}{ }[\l]%
- \setsepchar{,}%
- \readlist*\LCNA\PATchiffres%
\StrPosition{\PATlettres}{\l}[\pixpos]%
\xintifboolexpr{\pixpos>0}%
{%
\itemtomacro\LCNA[\pixpos]\pixchf%
- \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\pixchf} ;%
+ \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
}%
{}%
}%
@@ -311,11 +321,10 @@
\begin{tikzpicture}[x=\PATunit cm,y=\PATunit cm,#2]
\ifboolKV[pixelarttkzen]{Correction}%
{%
+ \readlist*\LCPA\PATcouleurs%
\csvloop{file=#3,no head,command={%
\foreach \l [count=\n] in \csvline {%
\StrDel{\l}{ }[\l]%
- \setsepchar{,}%
- \readlist*\LCPA\PATcouleurs%
\StrPosition{\PATlettres}{\l}[\pixcnt]%
\xintifboolexpr{\pixcnt>0}%
{%
@@ -331,16 +340,15 @@
}%
{%
\ifboolKV[pixelarttkzen]{Symb}{%affichage du pixelart versions chiffres si besoin
+ \readlist*\LCNA\PATchiffres%
\csvloop{file=#3,no head,command={%
\foreach \l [count=\n] in \csvline {%
\StrDel{\l}{ }[\l]%
- \setsepchar{,}%
- \readlist*\LCNA\PATchiffres%
\StrPosition{\PATlettres}{\l}[\pixpos]%
\xintifboolexpr{\pixpos>0}%
{%
\itemtomacro\LCNA[\pixpos]\pixchf%
- \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\pixchf} ;%
+ \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
}%
{}%
}%
@@ -472,17 +480,20 @@
\StrCut{#5}{/}{\NumBlocLig}{\NumBlocCol}%
\xdef\PAfirstline{\xinteval{\NbLigBloc*(\NumBlocLig-1)+1}}%
\xdef\PAlastline{\xinteval{\NbLigBloc*(\NumBlocLig-1)+\NbLigBloc}}%
+ \xdef\PAblocmin{\xinteval{(\NbColBloc*(\NumBlocCol-1)+1)}}%
+ \xdef\PAblocmax{\xinteval{(\NbColBloc*(\NumBlocCol-1)+\NbColBloc)}}%
%affichage du corrigé / display of correction
\begin{tikzpicture}[x=\PATunit cm,y=\PATunit cm,#2]
\ifboolKV[pixelarttkz]{Correction}%
{%
+ \readlist*\LCPA\PATcouleurs%
\csvloop{file=#3,range=\PAfirstline-\PAlastline,no head,command={%
\foreach \l [count=\n] in \csvline {%
- \xintifboolexpr{ \n >= (\NbColBloc*(\NumBlocCol-1)+1) 'and' \n <= (\NbColBloc*(\NumBlocCol-1)+\NbColBloc)}%
+ \xintifboolexpr{ \n >= \PAblocmin 'and' \n <= \PAblocmax}%
{%
\StrDel{\l}{ }[\l]%
\setsepchar{,}%
- \readlist*\LCPA\PATcouleurs%
+ %\readlist*\LCPA\PATcouleurs%
\StrPosition{\PATlettres}{\l}[\pixcnt]%
\xintifboolexpr{\pixcnt>0}%
{%
@@ -500,18 +511,19 @@
}%
{%
\ifboolKV[pixelarttkz]{Symb}{%affichage du pixelart versions chiffres si besoin
+ \readlist*\LCNA\PATchiffres%
\csvloop{file=#3,range=\PAfirstline-\PAlastline,no head,command={%
\foreach \l [count=\n] in \csvline {%
- \xintifboolexpr{ \n >= (\NbColBloc*(\NumBlocCol-1)+1) 'and' \n <= (\NbColBloc*(\NumBlocCol-1)+\NbColBloc)}%
+ \xintifboolexpr{ \n >= \PAblocmin 'and' \n <= \PAblocmax}%
{%
\StrDel{\l}{ }[\l]%
\setsepchar{,}%
- \readlist*\LCNA\PATchiffres%
+ %\readlist*\LCNA\PATchiffres%
\StrPosition{\PATlettres}{\l}[\pixpos]%
\xintifboolexpr{\pixpos>0}%
{%
\itemtomacro\LCNA[\pixpos]\pixchf%
- \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\pixchf} ;%
+ \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
}%
{}%
}%
@@ -523,7 +535,7 @@
{%affichage du pixelart versions lettres ou chiffres simples (<=9) / display of letters/symbols PixelArt
\csvloop{file=#3,range=\PAfirstline-\PAlastline,no head,command={%
\foreach \l [count=\n] in \csvline {%
- \xintifboolexpr{ \n >= (\NbColBloc*(\NumBlocCol-1)+1) 'and' \n <= (\NbColBloc*(\NumBlocCol-1)+\NbColBloc)}%
+ \xintifboolexpr{ \n >= \PAblocmin 'and' \n <= \PAblocmax}%
{%
\StrDel{\l}{ }[\l]%
\IfSubStr{\PATlettres}{\l}%
@@ -593,7 +605,7 @@
\begin{tikzpicture}[scale=#2,transform shape]
\xintFor* ##1 in {\xintSeq{1}{\NbTotLig}}\do{%
\xintFor* ##2 in {\xintSeq{1}{\NbTotCol}}\do{%
- \draw[semithick] (##2,-##1) rectangle++(1,-1) node[midway] {\IfBooleanTF{#1}{##1.}{\StrChar{\PAalphabet}{##1}}##2} ;
+ \draw[semithick] (##2,-##1) rectangle++(1,-1) node[midway,pixlartnoticedecoup] {\IfBooleanTF{#1}{##1.}{\StrChar{\PAalphabet}{##1}}##2} ;
}%
}%
\end{tikzpicture}%
@@ -625,17 +637,20 @@
\StrCut{#5}{/}{\NumBlocLig}{\NumBlocCol}%
\xdef\PAfirstline{\xinteval{\NbLigBloc*(\NumBlocLig-1)+1}}%
\xdef\PAlastline{\xinteval{\NbLigBloc*(\NumBlocLig-1)+\NbLigBloc}}%
+ \xdef\PAblocmin{\xinteval{(\NbColBloc*(\NumBlocCol-1)+1)}}%
+ \xdef\PAblocmax{\xinteval{(\NbColBloc*(\NumBlocCol-1)+\NbColBloc)}}%
%affichage du corrigé / display of correction
\begin{tikzpicture}[x=\PATunit cm,y=\PATunit cm,#2]
\ifboolKV[pixelarttkzen]{Correction}%
{%
+ \readlist*\LCPA\PATcouleurs%
\csvloop{file=#3,range=\PAfirstline-\PAlastline,no head,command={%
\foreach \l [count=\n] in \csvline {%
- \xintifboolexpr{ \n >= (\NbColBloc*(\NumBlocCol-1)+1) 'and' \n <= (\NbColBloc*(\NumBlocCol-1)+\NbColBloc)}%
+ \xintifboolexpr{ \n >= \PAblocmin 'and' \n <= \PAblocmax}%
{%
\StrDel{\l}{ }[\l]%
\setsepchar{,}%
- \readlist*\LCPA\PATcouleurs%
+ %\readlist*\LCPA\PATcouleurs%
\StrPosition{\PATlettres}{\l}[\pixcnt]%
\xintifboolexpr{\pixcnt>0}%
{%
@@ -653,18 +668,19 @@
}%
{%
\ifboolKV[pixelarttkzen]{Symb}{%affichage du pixelart versions chiffres si besoin
+ \readlist*\LCNA\PATchiffres%
\csvloop{file=#3,range=\PAfirstline-\PAlastline,no head,command={%
\foreach \l [count=\n] in \csvline {%
- \xintifboolexpr{ \n >= (\NbColBloc*(\NumBlocCol-1)+1) 'and' \n <= (\NbColBloc*(\NumBlocCol-1)+\NbColBloc)}%
+ \xintifboolexpr{ \n >= \PAblocmin 'and' \n <= \PAblocmax}%
{%
\StrDel{\l}{ }[\l]%
\setsepchar{,}%
- \readlist*\LCNA\PATchiffres%
+ %\readlist*\LCNA\PATchiffres%
\StrPosition{\PATlettres}{\l}[\pixpos]%
\xintifboolexpr{\pixpos>0}%
{%
\itemtomacro\LCNA[\pixpos]\pixchf%
- \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\pixchf} ;%
+ \draw ({\n-0.5},{-\thecsvrow+0.5}) rectangle ({\n+0.5},{-\thecsvrow-0.5}) node[inner sep=0,midway,font=\PATtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
}%
{}%
}%
@@ -676,7 +692,7 @@
{%affichage du pixelart versions lettres ou chiffres simples (<=9) / display of letters/symbols PixelArt
\csvloop{file=#3,range=\PAfirstline-\PAlastline,no head,command={%
\foreach \l [count=\n] in \csvline {%
- \xintifboolexpr{ \n >= (\NbColBloc*(\NumBlocCol-1)+1) 'and' \n <= (\NbColBloc*(\NumBlocCol-1)+\NbColBloc)}%
+ \xintifboolexpr{ \n >= \PAblocmin 'and' \n <= \PAblocmax}%
{%
\StrDel{\l}{ }[\l]%
\IfSubStr{\PATlettres}{\l}%
@@ -909,10 +925,10 @@
\itemtomacro\LCNA[\pixpos]\pixchf%
\ifboolKV[PixelArtCylinder]{Swap}%
{%
- \draw ({0.5*\CylindAng+(\nnnn-1)*\CylindAng}:{-\AAanamcyllarg+(\thecsvrow-0.5)*\CylindSect}) node[rotate={-90+0.5*\CylindAng+(\nnnn-1)*\CylindAng},font=\PATAAtaille] {\pixchf};%
+ \draw ({0.5*\CylindAng+(\nnnn-1)*\CylindAng}:{-\AAanamcyllarg+(\thecsvrow-0.5)*\CylindSect}) node[rotate={-90+0.5*\CylindAng+(\nnnn-1)*\CylindAng},font=\PATAAtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
}%
{%
- \draw ({0.5*\CylindAng+(\nnnn-1)*\CylindAng}:{-\AAanamcylcenter-(\thecsvrow-0.5)*\CylindSect}) node[rotate={-90+0.5*\CylindAng+(\nnnn-1)*\CylindAng},font=\PATAAtaille] {\pixchf};%
+ \draw ({0.5*\CylindAng+(\nnnn-1)*\CylindAng}:{-\AAanamcylcenter-(\thecsvrow-0.5)*\CylindSect}) node[rotate={-90+0.5*\CylindAng+(\nnnn-1)*\CylindAng},font=\PATAAtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
}%
}%
{%
@@ -1002,10 +1018,10 @@
\itemtomacro\LCNA[\pixpos]\pixchf%
\ifboolKV[PixlArtCylinder]{Swap}%
{%
- \draw ({0.5*\CylindAng+(\nnnn-1)*\CylindAng}:{-\AAanamcyllarg+(\thecsvrow-0.5)*\CylindSect}) node[rotate={-90+0.5*\CylindAng+(\nnnn-1)*\CylindAng},font=\PATAAtaille] {\pixchf};%
+ \draw ({0.5*\CylindAng+(\nnnn-1)*\CylindAng}:{-\AAanamcyllarg+(\thecsvrow-0.5)*\CylindSect}) node[rotate={-90+0.5*\CylindAng+(\nnnn-1)*\CylindAng},font=\PATAAtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
}%
{%
- \draw ({0.5*\CylindAng+(\nnnn-1)*\CylindAng}:{-\AAanamcylcenter-(\thecsvrow-0.5)*\CylindSect}) node[rotate={-90+0.5*\CylindAng+(\nnnn-1)*\CylindAng},font=\PATAAtaille] {\pixchf};%
+ \draw ({0.5*\CylindAng+(\nnnn-1)*\CylindAng}:{-\AAanamcylcenter-(\thecsvrow-0.5)*\CylindSect}) node[rotate={-90+0.5*\CylindAng+(\nnnn-1)*\CylindAng},font=\PATAAtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
}%
}%
{%
@@ -1033,5 +1049,199 @@
}%
}
+%-----With datatool, faster ?
+\RequirePackage{datatool}
+
+\NewDocumentCommand\readdtcsv{ m m }{%
+ \DTLsetseparator{|}%
+ \DTLloaddb[noheader,keys={cvsline}]{#2}{#1}%
+}
+
+\NewDocumentCommand\dtpixlarttikz{ O{} D<>{} m }{%commande autonome
+ \useKVdefault[pixelarttkz]%
+ \setKV[pixelarttkz]{#1}%
+ %affichage du corrigé / display of correction
+ \begin{tikzpicture}[x=\PATunit cm,y=\PATunit cm,#2]
+ \ifboolKV[pixelarttkz]{Correction}%
+ {%
+ \readlist*\LCPA\PATcouleurs%
+ \DTLforeach*{#3}{\csvline=cvsline}{%
+ \setsepchar{,}%
+ \readlist*\tmpcsvline\csvline%
+ \foreachitem\PAchar\in\tmpcsvline{%
+ \StrPosition{\PATlettres}{\PAchar}[\pixcnt]%
+ \ifnum\pixcnt>0%
+ \ifboolKV[pixelarttkz]{BordCases}%
+ {\draw[fill={\LCPA[\pixcnt]}] ({\PAcharcnt-0.5},{-\theDTLrowi+0.5}) rectangle++(1,-1) ;}%
+ {\filldraw[{\LCPA[\pixcnt]}] ({\PAcharcnt-0.5},{-\theDTLrowi+0.5}) rectangle++(1,-1) ;}%
+ \fi%
+ }
+ % \foreach \l [count=\n] in \csvline {%old vesion, with foreach ?
+ % \StrPosition{\PATlettres}{\l}[\pixcnt]%
+ % \ifnum\pixcnt>0%
+ % \ifboolKV[pixelarttkz]{BordCases}%
+ % {\draw[fill={\LCPA[\pixcnt]}] ({\n-0.5},{-\theDTLrowi+0.5}) rectangle ({\n+0.5},{-\theDTLrowi-0.5}) ;}%
+ % {\filldraw[{\LCPA[\pixcnt]}] ({\n-0.5},{-\theDTLrowi+0.5}) rectangle ({\n+0.5},{-\theDTLrowi-0.5}) ;}%
+ % \fi%
+ % }%
+ }%
+ }%
+ {%
+ \ifboolKV[pixelarttkz]{Symb}%
+ {%affichage du pixelart versions chiffres si besoin
+ \readlist*\LCNA\PATchiffres%
+ \DTLforeach*{#3}{\csvline=cvsline}{%
+ \setsepchar{,}%
+ \readlist*\tmpcsvline\csvline%
+ \foreachitem\PAchar\in\tmpcsvline{%
+ \StrPosition{\PATlettres}{\PAchar}[\pixpos]%
+ \xintifboolexpr{\pixpos>0}%
+ {%
+ \itemtomacro\LCNA[\pixpos]\pixchf%
+ \draw ({\PAcharcnt-0.5},{-\theDTLrowi+0.5}) rectangle++(1,-1) node[inner sep=0,midway,font=\PATtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
+ }%
+ {}%
+ }
+ }%
+ }%
+ {%affichage du pixelart versions lettres ou chiffres simples (<=9) / display of letters/symbols PixelArt
+ \DTLforeach*{#3}{\csvline=cvsline}{%
+ \setsepchar{,}%
+ \readlist*\tmpcsvline\csvline%
+ \foreachitem\PAchar\in\tmpcsvline{%
+ \IfSubStr{\PATlettres}{\PAchar}%
+ {%
+ \draw ({\PAcharcnt-0.5},{-\theDTLrowi+0.5}) rectangle++(1,-1) node[inner sep=0,midway,font=\PATtaille] {\PAchar};%
+ }%
+ {}%
+ }%
+ }%
+ }%
+ }%
+ %affichage des découpages éventuels
+ \IfStrEq{\PATdecoup}{}%
+ {}%
+ {%
+ \xdef\NbLigTot{\DTLrowcount{#3}}%
+ \DTLgetvalue{\myvalrowone}{#3}{1}{1}%
+ \StrCount{\myvalrowone}{,}[\NbColTot]%
+ \xdef\NbColTot{\inteval{\NbColTot+1}}%
+ \IfSubStr{\PATdecoup}{x}%
+ {%
+ \StrCut{\PATdecoup}{x}{\NbLigBloc}{\NbColBloc}%tracés des traits
+ \foreach \i in {0,\NbLigBloc,...,\NbLigTot}{\draw[pixlarttraitdecoup] ({0.5-0.33},{-\i-0.5}) -- ({\NbColTot+0.5+0.33},{-\i-0.5}) ;}%
+ \foreach \j in {0,\NbColBloc,...,\NbColTot}{\draw[pixlarttraitdecoup] ({\j+0.5},{-0.5+0.33}) -- ({\j+0.5},{-\NbLigTot-0.5-0.33}) ;}%
+ }%
+ {}%
+ \IfSubStr{\PATdecoup}{+}%
+ {%
+ \StrCut{\PATdecoup}{+}{\NbBlocLIG}{\NbBlocCOL}%
+ \def\NbLigBloc{\xintieval{(\NbLigTot-1)/\NbBlocLIG}}%
+ \def\NbColBloc{\xintieval{(\NbColTot)/\NbBlocCOL}}%
+ \foreach \i in {0,\NbLigBloc,...,\NbLigTot}{\draw[pixlarttraitdecoup] ({0.5-0.33},{-\i-0.5}) -- ({\NbColTot+0.5+0.33},{-\i-0.5}) ;}%
+ \foreach \j in {0,\NbColBloc,...,\NbColTot}{\draw[pixlarttraitdecoup] ({\j+0.5},{-0.5+0.33}) -- ({\j+0.5},{-\NbLigTot-0.5-0.33}) ;}%
+ }%
+ {}%
+ }%
+ \end{tikzpicture}%
+}
+
+\NewDocumentCommand\dtpixlarttikzblock{ O{} D<>{} m m m }{%commande individuelle avec loi & datatool...
+ %3=fichier
+ %4=taille blocs (LxC) ou nombre de blocs (L+C)
+ %5=numbloc
+ \useKVdefault[pixelarttkz]%
+ \setKV[pixelarttkz]{#1}%
+ \xdef\NbLigTot{\DTLrowcount{#3}}%
+ \DTLgetvalue{\myvalrowone}{#3}{1}{1}%
+ \StrCount{\myvalrowone}{,}[\NbColTot]%
+ \xdef\NbColTot{\inteval{\NbColTot+1}}%
+ \IfSubStr{#4}{x}%
+ {%
+ \StrCut{#4}{x}{\NbLigBloc}{\NbColBloc}%
+ }%
+ {}%
+ \IfSubStr{#4}{+}%
+ {%
+ \StrCut{#4}{+}{\NbBlocLIG}{\NbBlocCOL}%
+ \xdef\NbLigBloc{\xinteval{(\NbLigTot-1)/\NbBlocLIG}}%
+ \xdef\NbColBloc{\xinteval{(\NbColTot)/\NbBlocCOL}}%
+ }%
+ {}%
+ \StrCut{#5}{/}{\NumBlocLig}{\NumBlocCol}%
+ \xdef\PAfirstline{\xinteval{\NbLigBloc*(\NumBlocLig-1)+1}}%
+ \xdef\PAlastline{\xinteval{\NbLigBloc*(\NumBlocLig-1)+\NbLigBloc}}%
+ \xdef\PAblocmin{\xinteval{(\NbColBloc*(\NumBlocCol-1)+1)}}%
+ \xdef\PAblocmax{\xinteval{(\NbColBloc*(\NumBlocCol-1)+\NbColBloc)}}%
+ %affichage du corrigé / display of correction
+ \begin{tikzpicture}[x=\PATunit cm,y=\PATunit cm,#2]
+ \ifboolKV[pixelarttkz]{Correction}%
+ {%
+ \readlist*\LCPA\PATcouleurs%
+ \foreach \line in {\PAfirstline,...,\PAlastline}{%
+ \DTLgetvalue{\csvline}{#3}{\line}{1}%
+ \setsepchar{,}%
+ \readlist*\tmpcsvline\csvline%
+ \foreachitem\PAchar\in\tmpcsvline{%
+ \xintifboolexpr{ \PAcharcnt >= \PAblocmin 'and' \PAcharcnt <= \PAblocmax}%
+ {%
+ \StrPosition{\PATlettres}{\PAchar}[\pixcnt]%
+ \xintifboolexpr{\pixcnt>0}%
+ {%
+ \itemtomacro\LCPA[\pixcnt]\pixcol%
+ \ifboolKV[pixelarttkz]{BordCases}%
+ {\draw[fill=\pixcol] ({\PAcharcnt-0.5},{-\line+0.5}) rectangle++(1,-1) ;}%
+ {\filldraw[\pixcol] ({\PAcharcnt-0.5},{-\line+0.5}) rectangle++(1,-1) ;}%
+ }%
+ {}%
+ }%
+ {}%
+ }%
+ }%
+ }%
+ {%
+ \ifboolKV[pixelarttkz]{Symb}%
+ {%affichage du pixelart versions chiffres si besoin
+ \readlist*\LCNA\PATchiffres%
+ \foreach \line in {\PAfirstline,...,\PAlastline}{%
+ \DTLgetvalue{\csvline}{#3}{\line}{1}%
+ \setsepchar{,}%
+ \readlist*\tmpcsvline\csvline%
+ \foreachitem\PAchar\in\tmpcsvline{%
+ \xintifboolexpr{ \PAcharcnt >= \PAblocmin 'and' \PAcharcnt <= \PAblocmax}%
+ {%
+ \StrPosition{\PATlettres}{\PAchar}[\pixpos]%
+ \xintifboolexpr{\pixpos>0}%
+ {%
+ \itemtomacro\LCNA[\pixpos]\pixchf%
+ \draw ({\PAcharcnt-0.5},{-\line+0.5}) rectangle++(1,-1) node[inner sep=0,midway,font=\PATtaille] {\TraiteListeSymbPixelArt{\pixchf}} ;%
+ }%
+ {}%
+ }%
+ {}%
+ }%
+ }%
+ }%
+ {%affichage du pixelart versions lettres ou chiffres simples (<=9) / display of letters/symbols PixelArt
+ \foreach \line in {\PAfirstline,...,\PAlastline}{%
+ \DTLgetvalue{\csvline}{#3}{\line}{1}%
+ \setsepchar{,}%
+ \readlist*\tmpcsvline\csvline%
+ \foreachitem\PAchar\in\tmpcsvline{%
+ \xintifboolexpr{ \PAcharcnt >= \PAblocmin 'and' \PAcharcnt <= \PAblocmax}%
+ {%
+ \IfSubStr{\PATlettres}{\PAchar}%
+ {%
+ \draw ({\PAcharcnt-0.5},{-\line+0.5}) rectangle++(1,-1) node[inner sep=0,midway,font=\PATtaille] {\PAchar};%
+ }%
+ {}%
+ }%
+ {}%
+ }%
+ }%
+ }%
+ }%
+ \end{tikzpicture}%
+}
\endinput \ No newline at end of file
diff --git a/graphics/pgf/contrib/pmdraw/README.md b/graphics/pgf/contrib/pmdraw/README.md
index dfc3e2924d..2d62b23d91 100644
--- a/graphics/pgf/contrib/pmdraw/README.md
+++ b/graphics/pgf/contrib/pmdraw/README.md
@@ -1,12 +1,12 @@
pmdraw
======
-*README V1.4 2024-06-02*
+*README V1.7 2025-01-28*
<!--
*------------------------------*
-|6````````````````````````````5|
+|4````````````````````````````4|
|`````____````____`````````````|
|````|MFMF\ /MFMF|````````````|
|````|MF|MF\/MF|MF|````````````|
@@ -18,7 +18,7 @@ pmdraw
|``````````````|MF|````````````|
|``````````````|MF|````````````|
|``````````````|MF|````````````|
-|4````````````````````````````1|
+|0````````````````````````````3|
*------------------------------*
-->
diff --git a/graphics/pgf/contrib/pmdraw/pmdraw.pdf b/graphics/pgf/contrib/pmdraw/pmdraw.pdf
index 1cc4de9135..638ede3542 100644
--- a/graphics/pgf/contrib/pmdraw/pmdraw.pdf
+++ b/graphics/pgf/contrib/pmdraw/pmdraw.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pmdraw/pmdraw.sty b/graphics/pgf/contrib/pmdraw/pmdraw.sty
index 36f506b51f..bc4e6e82e0 100644
--- a/graphics/pgf/contrib/pmdraw/pmdraw.sty
+++ b/graphics/pgf/contrib/pmdraw/pmdraw.sty
@@ -1,8 +1,8 @@
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{pmdraw}[2024-06-02 v1.4 pmdraw]
+\ProvidesPackage{pmdraw}[2025-01-28 v1.7 pmdraw]
% *------------------------------*
-% |7````````````````````````````4|
+% |2````````````````````````````1|
% |`````____````____`````````````|
% |````|MFMF\ /MFMF|````````````|
% |````|MF|MF\/MF|MF|````````````|
@@ -14,7 +14,7 @@
% |``````````````|MF|````````````|
% |``````````````|MF|````````````|
% |``````````````|MF|````````````|
-% |3````````````````````````````4|
+% |4````````````````````````````2|
% *------------------------------*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -24,7 +24,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \RequirePackage{datetime}
-\RequirePackage{keyval}
+\RequirePackage{xkeyval}
\RequirePackage{tikz}
\usetikzlibrary{math,decorations.pathreplacing,calligraphy,backgrounds}
@@ -41,15 +41,16 @@
\newcommand{\pmdraw@diagSep}{1}% Vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram
\newcommand{\pmdraw@drawAedgesOptions}{}% Draw options for added edges in product diagram
+\newcommand{\pmdraw@drawAedgesOptionsDefault}{}% Default draw options for added edges in product diagram
\newcommand{\pmdraw@drawAedges}[2]{% Draws added edges in product diagram from #1 vertex to #2 vertex, assumes #1<#2
\@ifclassloaded{beamer}{% If in beamer
\uncover<\pmdraw@edgesAddedUncover>{% Uncovers added edges
\foreach \x in {#1,...,#2} {% For each vertex in range
\ifnum\value{pmdraw@ifEdgesAdded}=0% If drawing added edges
- \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
+ \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptionsDefault,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
\else% If hiding top vertices
\phantom{%
- \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
+ \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptionsDefault,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
}%
\fi%
}%
@@ -57,10 +58,10 @@
}{% If not in beamer
\foreach \x in {#1,...,#2} {% For each vertex in range
\ifnum\value{pmdraw@ifEdgesAdded}=0% If drawing added edges
- \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
+ \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptionsDefault,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
\else% If hiding top vertices
\phantom{%
- \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
+ \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptionsDefault,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
}%
\fi%
}%
@@ -123,10 +124,11 @@
\let\pmdraw@drawLabelTop\pmdraw@drawLabelTopDefault% For top row, draws the label #3 for a vertex at (#1,#2)
\newcommand{\pmdraw@drawLedgesDrawOptions}{}% Draw options for lower non-transversal edges
+\newcommand{\pmdraw@drawLedgesDrawOptionsDefault}{}% Default draw options for lower non-transversal edges
\newcommand{\pmdraw@drawLedgesDrawDefault}[2]{% Draws lower non-transversal edge from #1 vertex to #2 vertex, assumes #1<#2 - DEFAULT
- \draw[apply style/.expand once=\pmdraw@drawLedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1,0) arc (180:90:\pmdraw{edgeHeight});% Draw left arch
- \draw[apply style/.expand once=\pmdraw@drawLedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1+\pmdraw{edgeHeight},\pmdraw{edgeHeight}) -- (#2-\pmdraw{edgeHeight},\pmdraw{edgeHeight});% Draw straight line
- \draw[apply style/.expand once=\pmdraw@drawLedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2-\pmdraw{edgeHeight},\pmdraw{edgeHeight}) arc (90:0:\pmdraw{edgeHeight});% Draw right arc
+ \draw[apply style/.expand once=\pmdraw@drawLedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawLedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1,0) arc (180:90:\pmdraw{edgeHeight});% Draw left arch
+ \draw[apply style/.expand once=\pmdraw@drawLedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawLedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1+\pmdraw{edgeHeight},\pmdraw{edgeHeight}) -- (#2-\pmdraw{edgeHeight},\pmdraw{edgeHeight});% Draw straight line
+ \draw[apply style/.expand once=\pmdraw@drawLedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawLedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2-\pmdraw{edgeHeight},\pmdraw{edgeHeight}) arc (90:0:\pmdraw{edgeHeight});% Draw right arc
\renewcommand{\pmdraw@drawEdgeDrawOptions}{}% Reset draw options for edge
}
\let\pmdraw@drawLedgesDraw\pmdraw@drawLedgesDrawDefault% Draws lower non-transversal edge from #1 vertex to #2 vertex, assumes #1<#2
@@ -170,18 +172,19 @@
\newcommand{\pmdraw@drawNoVertexTi}{-1}% 9th vertex to skip in top row
\newcommand{\pmdraw@drawTedgesDrawOptions}{}% Draw options for transversal edges
+\newcommand{\pmdraw@drawTedgesDrawOptionsDefault}{}% Default draw options for transversal edges
\newcommand{\pmdraw@drawTedgesDrawDefault}[2]{% Draws transversal edge from #1 vertex in top row to #2 vertex in bottom row - DEFAULT
\ifnum\pmdraw@ifTedgeHorizontal=0% If drawing a straight line edge
- \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1,\pmdraw@rowSep) -- (#2,0);% Draw straight line
+ \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1,\pmdraw@rowSep) -- (#2,0);% Draw straight line
\else% If transversal edge is drawn horizontally
\ifnum#1>#2% If edge goes from top right to bottom left
- \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2,0) arc (180:90:\pmdraw{Tlevel});% Draw bottom arch
- \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2+\pmdraw{Tlevel},\pmdraw{Tlevel}) -- (#1-\pmdraw@rowSep+\pmdraw{Tlevel}, \pmdraw{Tlevel});% Draw straight line
- \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1-\pmdraw@rowSep+\pmdraw{Tlevel},\pmdraw{Tlevel}) arc (270:360:{\pmdraw@rowSep-\pmdraw{Tlevel}});% Draw top arc
+ \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2,0) arc (180:90:\pmdraw{Tlevel});% Draw bottom arch
+ \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2+\pmdraw{Tlevel},\pmdraw{Tlevel}) -- (#1-\pmdraw@rowSep+\pmdraw{Tlevel}, \pmdraw{Tlevel});% Draw straight line
+ \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1-\pmdraw@rowSep+\pmdraw{Tlevel},\pmdraw{Tlevel}) arc (270:360:{\pmdraw@rowSep-\pmdraw{Tlevel}});% Draw top arc
\else% If edge goes from top left to bottom right
- \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2,0) arc (0:90:\pmdraw{Tlevel});% Draw bottom arch
- \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2-\pmdraw{Tlevel},\pmdraw{Tlevel}) -- (#1+\pmdraw@rowSep-\pmdraw{Tlevel}, \pmdraw{Tlevel});% Draw straight line
- \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1+\pmdraw@rowSep-\pmdraw{Tlevel},\pmdraw{Tlevel}) arc (270:180:{\pmdraw@rowSep-\pmdraw{Tlevel}});% Draw top arc
+ \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2,0) arc (0:90:\pmdraw{Tlevel});% Draw bottom arch
+ \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2-\pmdraw{Tlevel},\pmdraw{Tlevel}) -- (#1+\pmdraw@rowSep-\pmdraw{Tlevel}, \pmdraw{Tlevel});% Draw straight line
+ \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1+\pmdraw@rowSep-\pmdraw{Tlevel},\pmdraw{Tlevel}) arc (270:180:{\pmdraw@rowSep-\pmdraw{Tlevel}});% Draw top arc
\fi%
\renewcommand{\pmdraw@ifTedgeHorizontal}{0}% Reset flag to default
\fi%
@@ -190,18 +193,21 @@
\let\pmdraw@drawTedgesDraw\pmdraw@drawTedgesDrawDefault% Draws transversal edge from #1 vertex in top row to #2 vertex in bottom row
\newcommand{\pmdraw@drawUedgesDrawOptions}{}% Draw options for upper non-transversal edges
+\newcommand{\pmdraw@drawUedgesDrawOptionsDefault}{}% Default draw options for upper non-transversal edges
\newcommand{\pmdraw@drawUedgesDrawDefault}[2]{% Draws upper non-transversal edge from #1 vertex to #2 vertex, assumes #1<#2 - DEFAULT
- \draw[apply style/.expand once=\pmdraw@drawUedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1,\pmdraw@rowSep) arc (180:270:\pmdraw{edgeHeight});% Draw left arch
- \draw[apply style/.expand once=\pmdraw@drawUedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1+\pmdraw{edgeHeight},\pmdraw@rowSep-\pmdraw{edgeHeight}) -- (#2-\pmdraw{edgeHeight},\pmdraw@rowSep-\pmdraw{edgeHeight});% Draw straight line
- \draw[apply style/.expand once=\pmdraw@drawUedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2-\pmdraw{edgeHeight},\pmdraw@rowSep-\pmdraw{edgeHeight}) arc (270:360:\pmdraw{edgeHeight});% Draw right arc
+ \draw[apply style/.expand once=\pmdraw@drawUedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawUedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1,\pmdraw@rowSep) arc (180:270:\pmdraw{edgeHeight});% Draw left arch
+ \draw[apply style/.expand once=\pmdraw@drawUedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawUedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1+\pmdraw{edgeHeight},\pmdraw@rowSep-\pmdraw{edgeHeight}) -- (#2-\pmdraw{edgeHeight},\pmdraw@rowSep-\pmdraw{edgeHeight});% Draw straight line
+ \draw[apply style/.expand once=\pmdraw@drawUedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawUedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2-\pmdraw{edgeHeight},\pmdraw@rowSep-\pmdraw{edgeHeight}) arc (270:360:\pmdraw{edgeHeight});% Draw right arc
\renewcommand{\pmdraw@drawEdgeDrawOptions}{}% Reset draw options for edge
}
\let\pmdraw@drawUedgesDraw\pmdraw@drawUedgesDrawDefault% Draws upper non-transversal edge from #1 vertex to #2 vertex, assumes #1<#2
\newcommand{\pmdraw@drawVertexOptions}{}% Draw options for vertices
-\newcommand{\pmdraw@drawVertex}[2]{% Draws a vertex at (#1,#2)
- \fill[apply style/.expand once=\pmdraw@drawVertexOptions] (#1,#2) circle (.17);%
+\newcommand{\pmdraw@drawVertexOptionsDefault}{}% Default draw options for vertices
+\newcommand{\pmdraw@drawVertexDefault}[2]{% Draws a vertex at (#1,#2) - Default
+ \fill[apply style/.expand once=\pmdraw@drawVertexOptionsDefault,apply style/.expand once=\pmdraw@drawVertexOptions] (#1,#2) circle (.17);%
}
+\let\pmdraw@drawVertex\pmdraw@drawVertexDefault% Draws a vertex at (#1,#2)
\newcommand{\pmdraw@edgeUncover}{1-}% Sets the uncover options of edge
\newcommand{\pmdraw@edgesAddedUncover}{1-}% Sets the uncover options of added edges
@@ -315,175 +321,456 @@
\setcounter{pmdraw@degreeB}{#1}% Sets degree (number of vertices per row) for bottom row
\setcounter{pmdraw@degreeT}{#1}% Sets degree (number of vertices per row) for top row
}
+\define@key{pmdraw@brickDefault}{degree}{% Sets default degree (number of vertices per row) of diagram
+ \setkeys{pmdraw@brick}{%
+ \savevalue{degree bottom}=#1%
+ }%
+ \setkeys{pmdraw@brick}{%
+ \savevalue{degree top}=#1%
+ }%
+}
\define@key{pmdraw@brick}{degree bottom}{% Sets degree (number of vertices per row) for bottom row
\setcounter{pmdraw@degreeB}{#1}%
}
+\define@key{pmdraw@brickDefault}{degree bottom}{% Sets default degree (number of vertices per row) for bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{degree bottom}=#1%
+ }%
+}
\define@key{pmdraw@brick}{degree top}{% Sets degree (number of vertices per row) for top row
\setcounter{pmdraw@degreeT}{#1}%
}
+\define@key{pmdraw@brickDefault}{degree top}{% Sets default degree (number of vertices per row) for top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{degree top}=#1%
+ }%
+}
\define@key{pmdraw@brick}{blank bottom}{% Sets the number of blank vertices on left of bottom row
\setcounter{pmdraw@blankB}{#1}%
}
+\define@key{pmdraw@brickDefault}{blank bottom}{% Sets the default number of blank vertices on left of bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{blank bottom}=#1%
+ }%
+}
\define@key{pmdraw@brick}{blank top}{% Sets the number of blank vertices on left of top row
\setcounter{pmdraw@blankT}{#1}%
}
+\define@key{pmdraw@brickDefault}{blank top}{% Sets the default number of blank vertices on left of top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{blank top}=#1%
+ }%
+}
\define@key{pmdraw@brick}{row sep}{% Sets vertical separation between rows of vertices in brick
\renewcommand{\pmdraw@rowSep}{#1}%
}
+\define@key{pmdraw@brickDefault}{row sep}{% Sets default vertical separation between rows of vertices in brick
+ \setkeys{pmdraw@brick}{%
+ \savevalue{row sep}=#1%
+ }%
+}
\define@key{pmdraw@brick}{vertices}{% Sets the draw options of vertices
\renewcommand{\pmdraw@drawVertexOptions}{#1}%
}
+\define@key{pmdraw@brick}{verticesDefault}{% Sets the default draw options of vertices
+ \renewcommand{\pmdraw@drawVertexOptionsDefault}{#1}%
+}
+\define@key{pmdraw@brickDefault}{vertices}{% Sets the default draw options of vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{verticesDefault}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex bottom 1}{% Sets 1st vertex to skip in bottom row
\renewcommand{\pmdraw@drawNoVertexBa}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex bottom 1}{% Sets default 1st vertex to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex bottom 1}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex bottom 2}{% Sets 2nd vertex to skip in bottom row
\renewcommand{\pmdraw@drawNoVertexBb}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex bottom 2}{% Sets default 2nd vertex to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex bottom 2}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex bottom 3}{% Sets 3rd vertex to skip in bottom row
\renewcommand{\pmdraw@drawNoVertexBc}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex bottom 3}{% Sets default 3rd vertex to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex bottom 3}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex bottom 4}{% Sets 4th vertex to skip in bottom row
\renewcommand{\pmdraw@drawNoVertexBd}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex bottom 4}{% Sets default 4th vertex to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex bottom 4}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex bottom 5}{% Sets 5th vertex to skip in bottom row
\renewcommand{\pmdraw@drawNoVertexBe}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex bottom 5}{% Sets default 5th vertex to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex bottom 5}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex bottom 6}{% Sets 6th vertex to skip in bottom row
\renewcommand{\pmdraw@drawNoVertexBf}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex bottom 6}{% Sets default 6th vertex to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex bottom 6}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex bottom 7}{% Sets 7th vertex to skip in bottom row
\renewcommand{\pmdraw@drawNoVertexBg}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex bottom 7}{% Sets default 7th vertex to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex bottom 7}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex bottom 8}{% Sets 8th vertex to skip in bottom row
\renewcommand{\pmdraw@drawNoVertexBh}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex bottom 8}{% Sets default 8th vertex to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex bottom 8}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex bottom 9}{% Sets 9th vertex to skip in bottom row
\renewcommand{\pmdraw@drawNoVertexBi}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex bottom 9}{% Sets default 9th vertex to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex bottom 9}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex top 1}{% Sets 1st vertex to skip in top row
\renewcommand{\pmdraw@drawNoVertexTa}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex top 1}{% Sets default 1st vertex to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex top 1}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex top 2}{% Sets 2nd vertex to skip in top row
\renewcommand{\pmdraw@drawNoVertexTb}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex top 2}{% Sets default 2nd vertex to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex top 2}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex top 3}{% Sets 3rd vertex to skip in top row
\renewcommand{\pmdraw@drawNoVertexTc}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex top 3}{% Sets default 3rd vertex to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex top 3}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex top 4}{% Sets 4th vertex to skip in top row
\renewcommand{\pmdraw@drawNoVertexTd}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex top 4}{% Sets default 4th vertex to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex top 4}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex top 5}{% Sets 5th vertex to skip in top row
\renewcommand{\pmdraw@drawNoVertexTe}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex top 5}{% Sets default 5th vertex to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex top 5}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex top 6}{% Sets 6th vertex to skip in top row
\renewcommand{\pmdraw@drawNoVertexTf}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex top 6}{% Sets default 6th vertex to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex top 6}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex top 7}{% Sets 7th vertex to skip in top row
\renewcommand{\pmdraw@drawNoVertexTg}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex top 7}{% Sets default 7th vertex to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex top 7}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex top 8}{% Sets 8th vertex to skip in top row
\renewcommand{\pmdraw@drawNoVertexTh}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex top 8}{% Sets default 8th vertex to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex top 8}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no vertex top 9}{% Sets 9th vertex to skip in top row
\renewcommand{\pmdraw@drawNoVertexTi}{#1}%
}
+\define@key{pmdraw@brickDefault}{no vertex top 9}{% Sets default 9th vertex to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no vertex top 9}=#1%
+ }%
+}
\define@key{pmdraw@brick}{vertices options}{% Sets the draw command of vertices
\renewcommand{\pmdraw@drawVertex}[2]{#1}%
}
-\define@key{pmdraw@brick}{labels}[]{% Draws labels for vertices
- \renewcommand{\pmdraw@ifLabelsB}{1}%
- \renewcommand{\pmdraw@ifLabelsT}{1}%
+\define@key{pmdraw@brick}{labels}[1]{% Draws labels for vertices
+ \renewcommand{\pmdraw@ifLabelsB}{#1}%
+ \renewcommand{\pmdraw@ifLabelsT}{#1}%
}
-\define@key{pmdraw@brick}{labels bottom}[]{% Draws labels for bottom vertices
- \renewcommand{\pmdraw@ifLabelsB}{1}%
+\define@key{pmdraw@brickDefault}{labels}[1]{% Sets the default drawing labels for vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{labels}=#1%
+ }%
+}
+\define@key{pmdraw@brick}{labels bottom}[1]{% Draws labels for bottom vertices
+ \renewcommand{\pmdraw@ifLabelsB}{#1}%
+}
+\define@key{pmdraw@brickDefault}{labels bottom}[1]{% Sets the default drawing labels for bottom vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{labels bottom}=#1%
+ }%
+}
+\define@key{pmdraw@brick}{labels top}[1]{% Draws labels for top vertices
+ \renewcommand{\pmdraw@ifLabelsT}{#1}%
}
-\define@key{pmdraw@brick}{labels top}[]{% Draws labels for top vertices
- \renewcommand{\pmdraw@ifLabelsT}{1}%
+\define@key{pmdraw@brickDefault}{labels top}[1]{% Sets the default drawing labels for top vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{labels top}=#1%
+ }%
}
\define@key{pmdraw@brick}{labels start}{% Sets starting number for vertex labels
\setcounter{pmdraw@labelStartT}{#1}%
\setcounter{pmdraw@labelStartB}{#1}%
}
+\define@key{pmdraw@brickDefault}{labels start}{% Sets the default starting number for vertex labels
+ \setkeys{pmdraw@brick}{%
+ \savevalue{labels start}=#1%
+ }%
+}
\define@key{pmdraw@brick}{labels bottom start}{% Sets starting number for bottom vertex labels
\setcounter{pmdraw@labelStartB}{#1}%
}
+\define@key{pmdraw@brickDefault}{labels bottom start}{% Sets the default starting number for bottom vertex labels
+ \setkeys{pmdraw@brick}{%
+ \savevalue{labels bottom start}=#1%
+ }%
+}
\define@key{pmdraw@brick}{labels top start}{% Sets starting number for top vertex labels
\setcounter{pmdraw@labelStartT}{#1}%
}
+\define@key{pmdraw@brickDefault}{labels top start}{% Sets the default starting number for top vertex labels
+ \setkeys{pmdraw@brick}{%
+ \savevalue{labels top start}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label bottom 1}{% Sets 1st label to skip in bottom row
\renewcommand{\pmdraw@drawNoLabelBa}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label bottom 1}{% Sets the default 1st label to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label bottom 1}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label bottom 2}{% Sets 2nd label to skip in bottom row
\renewcommand{\pmdraw@drawNoLabelBb}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label bottom 2}{% Sets the default 2nd label to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label bottom 2}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label bottom 3}{% Sets 3rd label to skip in bottom row
\renewcommand{\pmdraw@drawNoLabelBc}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label bottom 3}{% Sets the default 3rd label to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label bottom 3}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label bottom 4}{% Sets 4th label to skip in bottom row
\renewcommand{\pmdraw@drawNoLabelBd}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label bottom 4}{% Sets the default 4th label to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label bottom 4}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label bottom 5}{% Sets 5th label to skip in bottom row
\renewcommand{\pmdraw@drawNoLabelBe}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label bottom 5}{% Sets the default 5th label to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label bottom 5}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label bottom 6}{% Sets 6th label to skip in bottom row
\renewcommand{\pmdraw@drawNoLabelBf}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label bottom 6}{% Sets the default 6th label to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label bottom 6}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label bottom 7}{% Sets 7th label to skip in bottom row
\renewcommand{\pmdraw@drawNoLabelBg}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label bottom 7}{% Sets the default 7th label to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label bottom 7}=#1%
+ }%
+}
+\define@key{pmdraw@brickDefault}{no label bottom 8}{% Sets the default 8th label to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label bottom 8}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label bottom 8}{% Sets 8th label to skip in bottom row
\renewcommand{\pmdraw@drawNoLabelBh}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label bottom 8}{% Sets the default 8th label to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label bottom 8}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label bottom 9}{% Sets 9th label to skip in bottom row
\renewcommand{\pmdraw@drawNoLabelBi}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label bottom 9}{% Sets the default 9th label to skip in bottom row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label bottom 9}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label top 1}{% Sets 1st label to skip in top row
\renewcommand{\pmdraw@drawNoLabelTa}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label top 1}{% Sets the default 1st label to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label top 1}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label top 2}{% Sets 2nd label to skip in top row
\renewcommand{\pmdraw@drawNoLabelTb}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label top 2}{% Sets the default 2nd label to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label top 2}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label top 3}{% Sets 3rd label to skip in top row
\renewcommand{\pmdraw@drawNoLabelTc}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label top 3}{% Sets the default 3rd label to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label top 3}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label top 4}{% Sets 4th label to skip in top row
\renewcommand{\pmdraw@drawNoLabelTd}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label top 4}{% Sets the default 4th label to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label top 4}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label top 5}{% Sets 5th label to skip in top row
\renewcommand{\pmdraw@drawNoLabelTe}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label top 5}{% Sets the default 5th label to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label top 5}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label top 6}{% Sets 6th label to skip in top row
\renewcommand{\pmdraw@drawNoLabelTf}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label top 6}{% Sets the default 6th label to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label top 6}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label top 7}{% Sets 7th label to skip in top row
\renewcommand{\pmdraw@drawNoLabelTg}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label top 7}{% Sets the default 7th label to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label top 7}=#1%
+ }%
+}
+\define@key{pmdraw@brickDefault}{no label top 8}{% Sets the default 8th label to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label top 8}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label top 8}{% Sets 8th label to skip in top row
\renewcommand{\pmdraw@drawNoLabelTh}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label top 8}{% Sets the default 8th label to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label top 8}=#1%
+ }%
+}
\define@key{pmdraw@brick}{no label top 9}{% Sets 9th label to skip in top row
\renewcommand{\pmdraw@drawNoLabelTi}{#1}%
}
+\define@key{pmdraw@brickDefault}{no label top 9}{% Sets the default 9th label to skip in top row
+ \setkeys{pmdraw@brick}{%
+ \savevalue{no label top 9}=#1%
+ }%
+}
\define@key{pmdraw@brick}{labels bottom draw}{% Sets the draw options for labels of bottom vertices
\renewcommand{\pmdraw@drawLabelBDrawOptions}{#1}%
}
+\define@key{pmdraw@brickDefault}{labels bottom draw}{% Sets the default draw options for labels of bottom vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{labels bottom draw}=#1%
+ }%
+}
\define@key{pmdraw@brick}{labels bottom node}{% Sets the node options for labels of bottom vertices
\renewcommand{\pmdraw@drawLabelBNodeOptions}{#1}%
}
+\define@key{pmdraw@brickDefault}{labels bottom node}{% Sets the default node options for labels of bottom vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{labels bottom node}=#1%
+ }%
+}
\define@key{pmdraw@brick}{labels top draw}{% Sets the draw options for labels of top vertices
\renewcommand{\pmdraw@drawLabelTDrawOptions}{#1}%
}
+\define@key{pmdraw@brickDefault}{labels top draw}{% Sets the default draw options for labels of top vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{labels top draw}=#1%
+ }%
+}
\define@key{pmdraw@brick}{labels top node}{% Sets the node options for labels of top vertices
\renewcommand{\pmdraw@drawLabelTNodeOptions}{#1}%
}
+\define@key{pmdraw@brickDefault}{labels top node}{% Sets the default node options for labels of top vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{labels top node}=#1%
+ }%
+}
\define@key{pmdraw@brick}{labels bottom options}{% Sets the draw command of labels of bottom vertices
\renewcommand{\pmdraw@drawLabelBottom}[3]{#1}%
@@ -492,30 +779,60 @@
\renewcommand{\pmdraw@drawLabelTop}[3]{#1}%
}
-\define@key{pmdraw@brick}{no dots}[]{% Does not draw dots in bricks
- \setcounter{pmdraw@ifDiagWDotsFirst}{1}%
+\define@key{pmdraw@brick}{no dots}[1]{% Does not draw dots in bricks
+ \setcounter{pmdraw@ifDiagWDotsFirst}{#1}%
}
\define@key{pmdraw@brick}{dots draw}{% Sets the draw options for drawing of dots
\renewcommand{\pmdraw@drawDotsDrawOptions}{#1}%
}
+\define@key{pmdraw@brickDefault}{dots draw}{% Sets the default draw options for drawing of dots
+ \setkeys{pmdraw@brick}{%
+ \savevalue{dots draw}=#1%
+ }%
+}
\define@key{pmdraw@brick}{dots node}{% Sets the node options for drawing of dots
\renewcommand{\pmdraw@drawDotsNodeOptions}{#1}%
}
+\define@key{pmdraw@brickDefault}{dots node}{% Sets the default node options for drawing of dots
+ \setkeys{pmdraw@brick}{%
+ \savevalue{dots node}=#1%
+ }%
+}
-\define@key{pmdraw@brick}{vertices bottom phantom}[]{% Does not draw bottom vertices
- \setcounter{pmdraw@ifVerticesBottom}{1}%
+\define@key{pmdraw@brick}{vertices bottom phantom}[1]{% Does not draw bottom vertices
+ \setcounter{pmdraw@ifVerticesBottom}{#1}%
+}
+\define@key{pmdraw@brickDefault}{vertices bottom phantom}{% Sets the default to not draw bottom vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{vertices bottom phantom}=#1%
+ }%
}
-\define@key{pmdraw@brick}{vertices top phantom}[]{% Does not draw top vertices
- \setcounter{pmdraw@ifVerticesTop}{1}%
+\define@key{pmdraw@brick}{vertices top phantom}[1]{% Does not draw top vertices
+ \setcounter{pmdraw@ifVerticesTop}{#1}%
+}
+\define@key{pmdraw@brickDefault}{vertices top phantom}{% Sets the default to not draw top vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{vertices top phantom}=#1%
+ }%
}
\define@key{pmdraw@brick}{vertices bottom uncover}{% Sets the uncover options of bottom vertices
\renewcommand{\pmdraw@verticesBottomUncover}{#1}%
}
+\define@key{pmdraw@brickDefault}{vertices bottom uncover}{% Sets the default uncover options of bottom vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{vertices bottom uncover}=#1%
+ }%
+}
\define@key{pmdraw@brick}{vertices top uncover}{% Sets the uncover options of top vertices
\renewcommand{\pmdraw@verticesTopUncover}{#1}%
}
+\define@key{pmdraw@brickDefault}{vertices top uncover}{% Sets the default uncover options of top vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{vertices top uncover}=#1%
+ }%
+}
\define@key{pmdraw@brick}{levels}[1]{% Sets number of horizontal levels for non-transversal edges and evenly spaces them
\tikzmath{%
@@ -523,16 +840,31 @@
\pmdraw{edgeSepL} = \pmdraw{edgeSepU};% Calculates vertical separation between each edge
}%
}
+\define@key{pmdraw@brickDefault}{levels}{% Sets the default number of horizontal levels for non-transversal edges and evenly spaces them
+ \setkeys{pmdraw@brick}{%
+ \savevalue{levels}=#1%
+ }%
+}
\define@key{pmdraw@brick}{levels bottom}{% Sets number of horizontal levels for lower non-transversal edges and evenly spaces them
\tikzmath{%
\pmdraw{edgeSepL} = (0.5*\pmdraw@rowSep)/(#1 + 1);% Calculates vertical separation between each edge
}%
}
+\define@key{pmdraw@brickDefault}{levels bottom}{% Sets the default number of horizontal levels for lower non-transversal edges and evenly spaces them
+ \setkeys{pmdraw@brick}{%
+ \savevalue{levels bottom}=#1%
+ }%
+}
\define@key{pmdraw@brick}{levels top}{% Sets number of horizontal levels for upper non-transversal edges and evenly spaces them
\tikzmath{%
\pmdraw{edgeSepU} = (0.5*\pmdraw@rowSep)/(#1 + 1);% Calculates vertical separation between each edge
}%
}
+\define@key{pmdraw@brickDefault}{levels top}{% Sets the default number of horizontal levels for upper non-transversal edges and evenly spaces them
+ \setkeys{pmdraw@brick}{%
+ \savevalue{levels top}=#1%
+ }%
+}
\define@key{pmdraw@brick}{levels sep}{% Sets vertical separation of horizontal levels for non-transversal edges
\tikzmath{%
@@ -540,70 +872,178 @@
\pmdraw{edgeSepL} = \pmdraw{edgeSepU};%
}%
}
+\define@key{pmdraw@brickDefault}{levels sep}{% Sets the default vertical separation of horizontal levels for non-transversal edges
+ \setkeys{pmdraw@brick}{%
+ \savevalue{levels sep}=#1%
+ }%
+}
\define@key{pmdraw@brick}{levels sep bottom}{% Sets vertical separation of lower horizontal levels for non-transversal edges
\tikzmath{%
\pmdraw{edgeSepL} = #1;%
}%
}
+\define@key{pmdraw@brickDefault}{levels sep bottom}{% Sets the default vertical separation of lower horizontal levels for non-transversal edges
+ \setkeys{pmdraw@brick}{%
+ \savevalue{levels sep bottom}=#1%
+ }%
+}
\define@key{pmdraw@brick}{levels sep top}{% Sets vertical separation of upper horizontal levels for non-transversal edges
\tikzmath{%
\pmdraw{edgeSepU} = #1;%
}%
}
+\define@key{pmdraw@brickDefault}{levels sep top}{% Sets the default vertical separation of upper horizontal levels for non-transversal edges
+ \setkeys{pmdraw@brick}{%
+ \savevalue{levels sep top}=#1%
+ }%
+}
\define@key{pmdraw@brick}{edges}{% Sets the draw options of all edges
\renewcommand{\pmdraw@drawUedgesDrawOptions}{#1}%
\renewcommand{\pmdraw@drawLedgesDrawOptions}{#1}%
\renewcommand{\pmdraw@drawTedgesDrawOptions}{#1}%
}
+\define@key{pmdraw@brick}{edgesDefault}{% Sets the default draw options of all edges
+ \renewcommand{\pmdraw@drawUedgesDrawOptionsDefault}{#1}%
+ \renewcommand{\pmdraw@drawLedgesDrawOptionsDefault}{#1}%
+ \renewcommand{\pmdraw@drawTedgesDrawOptionsDefault}{#1}%
+}
+\define@key{pmdraw@brickDefault}{edges}{% Sets the default draw options of all edges
+ \setkeys{pmdraw@brick}{%
+ \savevalue{edgesDefault}=#1%
+ }%
+}
\define@key{pmdraw@brick}{edges non-transversal}{% Sets the draw options of non-transversal edges
\renewcommand{\pmdraw@drawUedgesDrawOptions}{#1}%
\renewcommand{\pmdraw@drawLedgesDrawOptions}{#1}%
}
+\define@key{pmdraw@brick}{edges non-transversalDefault}{% Sets the default draw options of non-transversal edges
+ \renewcommand{\pmdraw@drawUedgesDrawOptionsDefault}{#1}%
+ \renewcommand{\pmdraw@drawLedgesDrawOptionsDefault}{#1}%
+}
+\define@key{pmdraw@brickDefault}{edges non-transversal}{% Sets the default draw options of non-transversal edges
+ \setkeys{pmdraw@brick}{%
+ \savevalue{edges non-transversalDefault}=#1%
+ }%
+}
\define@key{pmdraw@brick}{edges upper}{% Sets the draw options of upper non-transversal edges
\renewcommand{\pmdraw@drawUedgesDrawOptions}{#1}%
}
+\define@key{pmdraw@brick}{edges upperDefault}{% Sets the default draw options of upper non-transversal edges
+ \renewcommand{\pmdraw@drawUedgesDrawOptionsDefault}{#1}%
+}
+\define@key{pmdraw@brickDefault}{edges upper}{% Sets the default draw options of upper non-transversal edges
+ \setkeys{pmdraw@brick}{%
+ \savevalue{edges upperDefault}=#1%
+ }%
+}
\define@key{pmdraw@brick}{edges lower}{% Sets the draw options of lower non-transversal edges
\renewcommand{\pmdraw@drawLedgesDrawOptions}{#1}%
}
+\define@key{pmdraw@brick}{edges lowerDefault}{% Sets the defaultdraw options of lower non-transversal edges
+ \renewcommand{\pmdraw@drawLedgesDrawOptionsDefault}{#1}%
+}
+\define@key{pmdraw@brickDefault}{edges lower}{% Sets the default draw options of lower non-transversal edges
+ \setkeys{pmdraw@brick}{%
+ \savevalue{edges lowerDefault}=#1%
+ }%
+}
\define@key{pmdraw@brick}{edges transversal}{% Sets the draw options of transversal edges
\renewcommand{\pmdraw@drawTedgesDrawOptions}{#1}%
}
+\define@key{pmdraw@brick}{edges transversalDefault}{% Sets the default draw options of transversal edges
+ \renewcommand{\pmdraw@drawTedgesDrawOptionsDefault}{#1}%
+}
+\define@key{pmdraw@brickDefault}{edges transversal}{% Sets the default draw options of transversal edges
+ \setkeys{pmdraw@brick}{%
+ \savevalue{edges transversalDefault}=#1%
+ }%
+}
-\define@key{pmdraw@brick}{edges first}[]{% Draws edges before vertices
- \renewcommand{\pmdraw@ifEdgesFirst}{1}%
+\define@key{pmdraw@brick}{edges first}[1]{% Draws edges before vertices
+ \renewcommand{\pmdraw@ifEdgesFirst}{#1}%
+}
+\define@key{pmdraw@brickDefault}{edges first}{% Sets the default to draw edges before vertices
+ \setkeys{pmdraw@brick}{%
+ \savevalue{edges first}=#1%
+ }%
}
-\define@key{pmdraw@brick}{transversals first}[]{% Draws transversal edges before non-transversal edges
- \renewcommand{\pmdraw@ifTedgesFirst}{1}%
+\define@key{pmdraw@brick}{transversals first}[1]{% Draws transversal edges before non-transversal edges
+ \renewcommand{\pmdraw@ifTedgesFirst}{#1}%
+}
+\define@key{pmdraw@brickDefault}{transversals first}{% Sets the default to draw transversal edges before non-transversal edges
+ \setkeys{pmdraw@brick}{%
+ \savevalue{transversals first}=#1%
+ }%
}
-\define@key{pmdraw@brick}{edges phantom}[]{% Does not draw edges
- \setcounter{pmdraw@ifEdges}{1}%
+\define@key{pmdraw@brick}{edges phantom}[1]{% Does not draw edges
+ \setcounter{pmdraw@ifEdges}{#1}%
+}
+\define@key{pmdraw@brickDefault}{edges phantom}{% Sets the default to not draw edge
+ \setkeys{pmdraw@brick}{%
+ \savevalue{edges phantom}=#1%
+ }%
}
\define@key{pmdraw@brick}{edges uncover}{% Sets the uncover options of edges
\renewcommand{\pmdraw@edgesUncover}{#1}%
}
+\define@key{pmdraw@brickDefault}{edges uncover}{% Sets the default uncover options of edges
+ \setkeys{pmdraw@brick}{%
+ \savevalue{edges uncover}=#1%
+ }%
+}
\define@key{pmdraw@brick}{brace}{% Draws a brace
+ \setkeys{pmdraw@brace}{% Sets default keys for brace
+ left=\usevalue{left},
+ right=\usevalue{right},
+ above=\usevalue{above}
+ }%
\setkeys{pmdraw@brace}{#1}% Processes details of brace
\pmdraw@drawBrace{\value{pmdraw@braceL}}{\value{pmdraw@braceR}}{\pmdraw@braceLabel}% Draws brace
\let\pmdraw@drawBrace\pmdraw@drawBraceDefault% Resets brace options if changed
}
+\define@key{pmdraw@brickDefault}{brace}{% Sets the default brace
+ \setkeys{pmdraw@brick}{%
+ \savevalue{brace}=#1%
+ }%
+}
\define@key{pmdraw@brick}{brace draw}{% Sets the draw options for drawing of brace
\renewcommand{\pmdraw@drawBraceDrawOptions}{#1}%
}
+\define@key{pmdraw@brickDefault}{brace draw}{% Sets the default draw options for drawing of brace
+ \setkeys{pmdraw@brick}{%
+ \savevalue{brace draw}=#1%
+ }%
+}
\define@key{pmdraw@brick}{brace node}{% Sets the node options for drawing of brace
\renewcommand{\pmdraw@drawBraceNodeOptions}{#1}%
}
+\define@key{pmdraw@brickDefault}{brace node}{% Sets the default node options for drawing of brace
+ \setkeys{pmdraw@brick}{%
+ \savevalue{brace node}=#1%
+ }%
+}
\define@key{pmdraw@brick}{decorate before}{% Hook for decorations before brick is drawn
\renewcommand{\pmdraw@hookBeforeBrick}{#1}%
}
+\define@key{pmdraw@brickDefault}{decorate before}{% Sets the default hook for decorations before brick is drawn
+ \setkeys{pmdraw@brick}{%
+ \savevalue{decorate before}=#1%
+ }%
+}
\define@key{pmdraw@brick}{decorate after}{% Hook for decorations after brick is drawn
\renewcommand{\pmdraw@hookAfterBrick}{#1}%
}
+\define@key{pmdraw@brickDefault}{decorate after}{% Sets the default hook for decorations after brick is drawn
+ \setkeys{pmdraw@brick}{%
+ \savevalue{decorate after}=#1%
+ }%
+}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
@@ -615,40 +1055,95 @@
\define@key{pmdraw@NTedges}{level}{% Sets level of non-transversal edge
\setcounter{pmdraw@NTlevel}{#1}%
}
+\define@key{pmdraw@NTedgesDefault}{level}{% Sets the default level of non-transversal edge
+ \setkeys{pmdraw@NTedges}{%
+ \savevalue{level}=#1%
+ }%
+}
+
\define@key{pmdraw@NTedges}{height}{% Sets manual height of non-transversal edge
\renewcommand{\pmdraw@NTedgesHeight}{#1}%
}
+\define@key{pmdraw@NTedgesDefault}{height}{% Sets the default manual height of non-transversal edge
+ \setkeys{pmdraw@NTedges}{%
+ \savevalue{height}=#1%
+ }%
+}
+
\define@key{pmdraw@NTedges}{edge draw}{% Sets the draw options for drawing of edge
\renewcommand{\pmdraw@drawEdgeDrawOptions}{#1}%
}
+\define@key{pmdraw@NTedgesDefault}{edge draw}{% Sets the default draw options for drawing of edge
+ \setkeys{pmdraw@NTedges}{%
+ \savevalue{edge draw}=#1%
+ }%
+}
+
\define@key{pmdraw@NTedges}{options}{% Sets the draw command of non-transversal edge
\renewcommand{\pmdraw@drawUedgesDraw}[2]{#1}%
\renewcommand{\pmdraw@drawLedgesDraw}[2]{#1}%
}
-\define@key{pmdraw@NTedges}{phantom}[]{% Does not draw edge
- \setcounter{pmdraw@ifEdge}{1}%
+
+\define@key{pmdraw@NTedges}{phantom}[1]{% Does not draw edge
+ \setcounter{pmdraw@ifEdge}{#1}%
+}
+\define@key{pmdraw@NTedgesDefault}{phantom}{% Sets the default to not draw edge
+ \setkeys{pmdraw@NTedges}{%
+ \savevalue{phantom}=#1%
+ }%
}
+
\define@key{pmdraw@NTedges}{uncover}{% Sets the uncover options of edge
\renewcommand{\pmdraw@edgeUncover}{#1}%
}
+\define@key{pmdraw@NTedgesDefault}{uncover}{% Sets the default uncover options of edge
+ \setkeys{pmdraw@NTedges}{%
+ \savevalue{uncover}=#1%
+ }%
+}
+
\define@key{pmdraw@Tedges}{height}{% Sets manual height of transversal edge
\tikzmath{%
\pmdraw{Tlevel} = #1;%
}%
\renewcommand{\pmdraw@ifTedgeHorizontal}{1}% Flags manual height
}
+\define@key{pmdraw@TedgesDefault}{height}{% Sets the default manual height of transversal edge
+ \setkeys{pmdraw@Tedges}{%
+ \savevalue{height}=#1%
+ }%
+}
+
\define@key{pmdraw@Tedges}{edge draw}{% Sets the draw options for drawing of edge
\renewcommand{\pmdraw@drawEdgeDrawOptions}{#1}%
}
+\define@key{pmdraw@TedgesDefault}{edge draw}{% Sets the default draw options for drawing of edge
+ \setkeys{pmdraw@Tedges}{%
+ \savevalue{edge draw}=#1%
+ }%
+}
+
\define@key{pmdraw@Tedges}{options}{% Sets the draw command of transversal edge
\renewcommand{\pmdraw@drawTedgesDraw}[2]{#1}%
}
-\define@key{pmdraw@Tedges}{phantom}[]{% Does not draw edge
- \setcounter{pmdraw@ifEdge}{1}%
+
+\define@key{pmdraw@Tedges}{phantom}[1]{% Does not draw edge
+ \setcounter{pmdraw@ifEdge}{#1}%
+}
+\define@key{pmdraw@TedgesDefault}{phantom}{% Sets the default to not draw edge
+ \setkeys{pmdraw@Tedges}{%
+ \savevalue{phantom}=#1%
+ }%
}
+
\define@key{pmdraw@Tedges}{uncover}{% Sets the uncover options of edge
\renewcommand{\pmdraw@edgeUncover}{#1}%
}
+\define@key{pmdraw@TedgesDefault}{uncover}{% Sets the default uncover options of edge
+ \setkeys{pmdraw@Tedges}{%
+ \savevalue{uncover}=#1%
+ }%
+}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
@@ -660,15 +1155,34 @@
\define@key{pmdraw@brace}{left}{% Sets starting position of brace
\setcounter{pmdraw@braceL}{#1}%
}
+\define@key{pmdraw@braceDefault}{left}{% Sets the default starting position of brace
+ \setkeys{pmdraw@brace}{%
+ \savevalue{left}=#1%
+ }%
+}
+
\define@key{pmdraw@brace}{right}{% Sets terminating position of brace
\setcounter{pmdraw@braceR}{#1}%
}
+\define@key{pmdraw@braceDefault}{right}{% Sets the default terminating position of brace
+ \setkeys{pmdraw@brace}{%
+ \savevalue{right}=#1%
+ }%
+}
+
\define@key{pmdraw@brace}{label}{% Sets label of brace
\renewcommand{\pmdraw@braceLabel}{#1}%
}
-\define@key{pmdraw@brace}{above}[]{% Set flag to draw brace above diagram
- \renewcommand{\pmdraw@ifProdDiag}{1}%
+
+\define@key{pmdraw@brace}{above}[1]{% Set flag to draw brace above diagram
+ \renewcommand{\pmdraw@ifProdDiag}{#1}%
+}
+\define@key{pmdraw@braceDefault}{above}{% Sets the default flag to draw brace above diagram
+ \setkeys{pmdraw@brace}{%
+ \savevalue{above}=#1%
+ }%
}
+
\define@key{pmdraw@brace}{options}{% Sets the draw command of brace
\renewcommand{\pmdraw@drawBrace}[3]{#1}%
}
@@ -683,37 +1197,123 @@
\define@key{pmdraw@diagram}{row sep}{% Sets vertical separation between rows of vertices in diagram
\renewcommand{\pmdraw@rowSep}{#1}%
}
+\define@key{pmdraw@diagramDefault}{row sep}{% Sets the default vertical separation between rows of vertices in diagram
+ \setkeys{pmdraw@diagram}{%
+ \savevalue{row sep}=#1%
+ }%
+}
+
\define@key{pmdraw@diagram}{tikz}{% Sets the tikz options
\renewcommand{\pmdraw@tikz}{#1}%
}
+\define@key{pmdraw@diagramDefault}{tikz}{% Sets the default tikz options
+ \setkeys{pmdraw@diagram}{%
+ \savevalue{tikz}=#1%
+ }%
+}
+
\define@key{pmdraw@diagram}{dots options}{% Sets the draw command of dots between bricks
\renewcommand{\pmdraw@drawDots}[2]{#1}%
}
-\define@key{pmdraw@diagram}{grid}[]{% Flag for drawing coordinate grid
- \renewcommand{\pmdraw@ifGrid}{1}%
+
+
+\define@key{pmdraw@diagram}{grid}[1]{% Flag for drawing coordinate grid
+ \renewcommand{\pmdraw@ifGrid}{#1}%
}
+\define@key{pmdraw@diagramDefault}{grid}{% Sets the default flag for drawing coordinate grid
+ \setkeys{pmdraw@diagram}{%
+ \savevalue{grid}=#1%
+ }%
+}
+
\define@key{pmdraw@diagram}{decorate before}{% Hook before drawing diagrams
\renewcommand{\pmdraw@hookBeforeDiagram}{#1}%
}
+\define@key{pmdraw@diagramDefault}{decorate before}{% Sets the default hook before drawing diagrams
+ \setkeys{pmdraw@diagram}{%
+ \savevalue{decorate before}=#1%
+ }%
+}
\define@key{pmdraw@diagram}{decorate after}{% Hook after drawing diagrams
\renewcommand{\pmdraw@hookAfterDiagram}{#1}%
}
+\define@key{pmdraw@diagramDefault}{decorate after}{% Sets the default hook after drawing diagrams
+ \setkeys{pmdraw@diagram}{%
+ \savevalue{decorate after}=#1%
+ }%
+}
\define@key{pmdraw@diagram}{diagram sep}{% Sets vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram
\renewcommand{\pmdraw@diagSep}{#1}%
}
+\define@key{pmdraw@diagramDefault}{diagram sep}{% Sets the default vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram
+ \setkeys{pmdraw@diagram}{%
+ \savevalue{diagram sep}=#1%
+ }%
+}
\define@key{pmdraw@diagram}{vertex sep}{% Sets vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram not for added edges
\renewcommand{\pmdraw@vertexSep}{#1}%
}
+\define@key{pmdraw@diagramDefault}{vertex sep}{% Sets the default vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram not for added edges
+ \setkeys{pmdraw@diagram}{%
+ \savevalue{vertex sep}=#1%
+ }%
+}
+
\define@key{pmdraw@diagram}{edges added}{% Sets the draw options for drawing of added edges in product diagram
\renewcommand{\pmdraw@drawAedgesOptions}{#1}%
}
-\define@key{pmdraw@diagram}{edges added phantom}[]{% Does not draw added edges
- \setcounter{pmdraw@ifEdgesAdded}{1}%
+\define@key{pmdraw@diagram}{edges addedDefault}{% Sets the default draw options for drawing of added edges in product diagram
+ \renewcommand{\pmdraw@drawAedgesOptionsDefault}{#1}%
+}
+\define@key{pmdraw@diagramDefault}{edges added}{% Sets the default draw options for drawing of added edges in product diagram
+ \setkeys{pmdraw@diagram}{%
+ \savevalue{edges addedDefault}=#1%
+ }%
+}
+\define@key{pmdraw@diagram}{edges added phantom}[1]{% Does not draw added edges
+ \setcounter{pmdraw@ifEdgesAdded}{#1}%
+}
+\define@key{pmdraw@diagramDefault}{edges added phantom}{% Sets the default to not draw added edges
+ \setkeys{pmdraw@diagram}{%
+ \savevalue{edges added phantom}=#1%
+ }%
}
\define@key{pmdraw@diagram}{edges added uncover}{% Sets the uncover options of added edges
\renewcommand{\pmdraw@edgesAddedUncover}{#1}%
}
+\define@key{pmdraw@diagramDefault}{edges added uncover}{% Sets the default uncover options of added edges
+ \setkeys{pmdraw@diagram}{%
+ \savevalue{edges added uncover}=#1%
+ }%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% Keys for default key settings %
+% - ordered as per manual %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\define@key{pmdraw@default}{brick}{% Sets the default key options of brick keys
+ \setkeys{pmdraw@brickDefault}{#1}%
+}
+
+\define@key{pmdraw@default}{NTedges}{% Sets the default key options of non-transversal edge keys
+ \setkeys{pmdraw@NTedgesDefault}{#1}%
+}
+
+\define@key{pmdraw@default}{Tedges}{% Sets the default key options of transversal edge keys
+ \setkeys{pmdraw@TedgesDefault}{#1}%
+}
+
+\define@key{pmdraw@default}{brace}{% Sets the default key options of brace keys
+ \setkeys{pmdraw@braceDefault}{#1}%
+}
+
+\define@key{pmdraw@default}{diagram}{% Sets the default key options of diagram keys
+ \setkeys{pmdraw@diagramDefault}{#1}%
+}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
@@ -733,6 +1333,17 @@
\newcommand{\pmdDiagram}[2][]{% Draws diagram
% #1 Options
% #2 List of bricks
+ \setkeys{pmdraw@diagram}{% Sets default key values for diagrams
+ row sep=\usevalue{row sep},
+ tikz=\usevalue{tikz},
+ grid=\usevalue{grid},
+ decorate before=\usevalue{decorate before},
+ decorate after=\usevalue{decorate after},
+ diagram sep=\usevalue{diagram sep},
+ vertex sep=\usevalue{vertex sep},
+ edges added phantom=\usevalue{edges added phantom},
+ edges added uncover=\usevalue{edges added uncover}
+ }%
\setkeys{pmdraw@diagram}{#1}% Processes options
\renewcommand{\pmdraw@ifDiagWDots}{1}% Flags that diagram has dots
\setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
@@ -775,6 +1386,17 @@
% #2 List of added edges
% #3 Top diagram as list of bricks
% #4 Bottom diagram as list of bricks
+ \setkeys{pmdraw@diagram}{% Sets default key values for diagrams
+ row sep=\usevalue{row sep},
+ tikz=\usevalue{tikz},
+ grid=\usevalue{grid},
+ decorate before=\usevalue{decorate before},
+ decorate after=\usevalue{decorate after},
+ diagram sep=\usevalue{diagram sep},
+ vertex sep=\usevalue{vertex sep},
+ edges added phantom=\usevalue{edges added phantom},
+ edges added uncover=\usevalue{edges added uncover}
+ }%
\setkeys{pmdraw@diagram}{#1}% Processes options
\ifmmode% If drawing diagram in a maths equation
\,% Add space
@@ -840,6 +1462,234 @@
\pmdraw@reset% Resets user keys and other flags to default values
}
+\newcommand{\pmdProductTriple}[6][]{% Draws triple product diagram
+ % #1 Options
+ % #2 List of top added edges
+ % #3 List of bottom added edges
+ % #4 Top diagram as list of bricks
+ % #5 Middle diagram as list of bricks
+ % #6 Bottom diagram as list of bricks
+ \setkeys{pmdraw@diagram}{% Sets default key values for diagrams
+ row sep=\usevalue{row sep},
+ tikz=\usevalue{tikz},
+ grid=\usevalue{grid},
+ decorate before=\usevalue{decorate before},
+ decorate after=\usevalue{decorate after},
+ diagram sep=\usevalue{diagram sep},
+ vertex sep=\usevalue{vertex sep},
+ edges added phantom=\usevalue{edges added phantom},
+ edges added uncover=\usevalue{edges added uncover}
+ }%
+ \setkeys{pmdraw@diagram}{#1}% Processes options
+ \ifmmode% If drawing diagram in a maths equation
+ \,% Add space
+ \ifnum\pmdraw@ifGrid=1% If displaying helper grid
+ \begin{tikzpicture}[scale=.5,baseline=-1.0975cm,show grid=true,apply style/.expand once=\pmdraw@tikz]%
+ \else% If not displaying helper grid
+ \begin{tikzpicture}[scale=.5,baseline=-1.0975cm,apply style/.expand once=\pmdraw@tikz]%
+ \fi%
+ \pmdraw@hookBeforeDiagram% Hook before drawing diagrams
+ \pmdraw@AedgesLoop% Commences loop for top added edges to be drawn
+ #2%
+ \pmdEmpty% Terminates loop
+ \renewcommand{\pmdraw@ifDiagWDots}{1}% Flags that diagram has dot
+ \renewcommand{\pmdraw@ifProdDiag}{1}% Flags that diagram is product
+ \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
+ \pmdraw@bricksLoop% Commences loop for each top brick to be drawn
+ #4%
+ \pmdEmpty% Terminates loop
+ \renewcommand{\pmdraw@ifProdDiag}{0}% Resets flag that diagram is product
+ \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
+ \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
+ \begin{scope}[shift={(0,-\pmdraw@diagSep-\pmdraw@rowSep-\pmdraw@vertexSep)}]% Shift coordinates to be underneath top diagram
+ \pmdraw@AedgesLoop% Commences loop for bottom added edges to be drawn
+ #3%
+ \pmdEmpty% Terminates loop
+ \pmdraw@bricksLoop% Commences loop for each middle brick to be drawn
+ #5%
+ \pmdEmpty% Terminates loop
+ \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
+ \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
+ \begin{scope}[shift={(0,-\pmdraw@diagSep-\pmdraw@rowSep-\pmdraw@vertexSep)}]% Shift coordinates to be underneath middle diagram
+ \pmdraw@bricksLoop% Commences loop for each bottom brick to be drawn
+ #6%
+ \pmdEmpty% Terminates loop
+ \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
+ \end{scope}%
+ \end{scope}%
+ \renewcommand{\pmdraw@ifDiagWDots}{0}% Reset if drawing a diagram with dots
+ \pmdraw@hookAfterDiagram% Hook after drawing diagrams
+ \end{tikzpicture}%
+ \,% Add space
+ \else% If drawing diagram in normal text
+ \raisebox{2cm}{% Raise diagram so bottom row is on text baseline
+ \ifnum\pmdraw@ifGrid=1% If displaying helper grid
+ \begin{tikzpicture}[scale=.5,baseline=-1.095cm,show grid=true,apply style/.expand once=\pmdraw@tikz]%
+ \else% If not displaying helper grid
+ \begin{tikzpicture}[scale=.5,baseline=-1.095cm,apply style/.expand once=\pmdraw@tikz]%
+ \fi%
+ \pmdraw@hookBeforeDiagram% Hook before drawing diagrams
+ \pmdraw@AedgesLoop% Commences loop for added edges to be drawn
+ #2%
+ \pmdEmpty% Terminates loop
+ \renewcommand{\pmdraw@ifDiagWDots}{1}% Flags that diagram has dot
+ \renewcommand{\pmdraw@ifProdDiag}{1}% Flags that diagram is product
+ \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
+ \pmdraw@bricksLoop% Commences loop for each brick to be drawn
+ #4%
+ \pmdEmpty% Terminates loop
+ \renewcommand{\pmdraw@ifProdDiag}{0}% Resets flag that diagram is product
+ \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
+ \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
+ \begin{scope}[shift={(0,-\pmdraw@diagSep-\pmdraw@rowSep-\pmdraw@vertexSep)}]% Shift coordinates to be underneath top diagram
+ \pmdraw@AedgesLoop% Commences loop for bottom added edges to be drawn
+ #3%
+ \pmdEmpty% Terminates loop
+ \pmdraw@bricksLoop% Commences loop for each middle brick to be drawn
+ #5%
+ \pmdEmpty% Terminates loop
+ \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
+ \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
+ \begin{scope}[shift={(0,-\pmdraw@diagSep-\pmdraw@rowSep-\pmdraw@vertexSep)}]% Shift coordinates to be underneath middle diagram
+ \pmdraw@bricksLoop% Commences loop for each bottom brick to be drawn
+ #6%
+ \pmdEmpty% Terminates loop
+ \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
+ \end{scope}%
+ \end{scope}%
+ \renewcommand{\pmdraw@ifDiagWDots}{0}% Reset if drawing a diagram with dots
+ \pmdraw@hookAfterDiagram% Hook after drawing diagrams
+ \end{tikzpicture}%
+ }%
+ \fi%
+ \pmdraw@reset% Resets user keys and other flags to default values
+}
+
+\newcommand{\pmdSetDefault}[1]{% Sets the entered styles as the default
+ \setkeys{pmdraw@default}{#1}%
+}
+
+\newcommand{\pmdSetToOriginalDefault}{% Sets the styles as the default of the package
+ \setkeys{pmdraw@default}{% Saves values
+ brick={% Sets default for brick keys
+ degree=0,
+ degree bottom=0,
+ degree top=0,
+ blank bottom=0,
+ blank top=0,
+ row sep=2,
+ no vertex bottom 1=-1,
+ no vertex bottom 2=-1,
+ no vertex bottom 3=-1,
+ no vertex bottom 4=-1,
+ no vertex bottom 5=-1,
+ no vertex bottom 6=-1,
+ no vertex bottom 7=-1,
+ no vertex bottom 8=-1,
+ no vertex bottom 9=-1,
+ no vertex top 1=-1,
+ no vertex top 2=-1,
+ no vertex top 3=-1,
+ no vertex top 4=-1,
+ no vertex top 5=-1,
+ no vertex top 6=-1,
+ no vertex top 7=-1,
+ no vertex top 8=-1,
+ no vertex top 9=-1,
+ labels=0,
+ labels bottom=0,
+ labels top=0,
+ labels start=1,
+ labels bottom start=1,
+ labels top start=1,
+ no label bottom 1=-1,
+ no label bottom 2=-1,
+ no label bottom 3=-1,
+ no label bottom 4=-1,
+ no label bottom 5=-1,
+ no label bottom 6=-1,
+ no label bottom 7=-1,
+ no label bottom 8=-1,
+ no label bottom 9=-1,
+ no label top 1=-1,
+ no label top 2=-1,
+ no label top 3=-1,
+ no label top 4=-1,
+ no label top 5=-1,
+ no label top 6=-1,
+ no label top 7=-1,
+ no label top 8=-1,
+ no label top 9=-1,
+ labels bottom draw={},
+ labels bottom node={},
+ labels top draw={},
+ labels top node={},
+ dots draw={},
+ dots node={},
+ vertices bottom phantom=0,
+ vertices top phantom=0,
+ vertices bottom uncover={1-},
+ vertices top uncover={1-},
+ levels=1,
+ levels bottom=1,
+ levels top=1,
+ levels sep=(0.5*\pmdraw@rowSep)/2,
+ levels sep bottom=(0.5*\pmdraw@rowSep)/2,
+ levels sep top=(0.5*\pmdraw@rowSep)/2,
+ edges first=0,
+ transversals first=0,
+ edges phantom=0,
+ edges uncover={1-},
+ brace draw={},
+ brace node={},
+ decorate before={},
+ decorate after={}
+ }
+ }
+ \setkeys{pmdraw@default}{% Saves values
+ NTedges={% Sets default for non-transversal edge keys
+ level=1,
+ height=-1000,
+ edge draw={},
+ phantom=0,
+ uncover={1-}
+ }
+ }
+ \setkeys{pmdraw@default}{% Saves values
+ Tedges={% Sets default for transversal edge keys
+ edge draw={},
+ phantom=0,
+ uncover={1-}
+ }
+ }
+ \setkeys{pmdraw@default}{% Saves values
+ brace={% Sets default for brace keys
+ left=0,
+ right=0,
+ above=0
+ }
+ }
+ \setkeys{pmdraw@default}{% Saves values
+ diagram={% Sets default for diagram keys
+ row sep=2,
+ tikz={},
+ grid=0,
+ decorate before={},
+ decorate after={},
+ diagram sep=1,
+ vertex sep=0,
+ edges added phantom=0,
+ edges added uncover={1-}
+ }
+ }
+ \renewcommand{\pmdraw@drawVertexOptionsDefault}{}% Resets default draw options for vertices
+ \renewcommand{\pmdraw@drawLedgesDrawOptionsDefault}{}% Resets default draw options for lower non-transversal edges
+ \renewcommand{\pmdraw@drawUedgesDrawOptionsDefault}{}% Resets default draw options for upper non-transversal edges
+ \renewcommand{\pmdraw@drawTedgesDrawOptionsDefault}{}% Resets Default draw options for transversal edges
+ \renewcommand{\pmdraw@drawAedgesOptionsDefault}{}% Resets default draw options for added edges in product diagram
+}
+\pmdSetToOriginalDefault% Sets original default values
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% For loop commands %
@@ -970,6 +1820,79 @@
% #2 Upper non-transversal edges, as list [<options>]{<left vertex>}{<right vertex>}, eg [level=1]{2}{3}
% #3 Lower non-transversal edges, as list [<options>]{<left vertex>}{<right vertex>}, eg [level=1]{2}{3}
% #4 Transversals, as list [<options>]{<upper vertex>}{<lower vertex>}, eg [level=1]{2}{3}
+ \setkeys{pmdraw@brick}{% Set default values for brick keys
+ degree bottom=\usevalue{degree bottom},
+ degree top=\usevalue{degree top},
+ blank bottom=\usevalue{blank bottom},
+ blank top=\usevalue{blank top},
+ row sep=\usevalue{row sep},
+ no vertex bottom 1=\usevalue{no vertex bottom 1},
+ no vertex bottom 2=\usevalue{no vertex bottom 2},
+ no vertex bottom 3=\usevalue{no vertex bottom 3},
+ no vertex bottom 4=\usevalue{no vertex bottom 4},
+ no vertex bottom 5=\usevalue{no vertex bottom 5},
+ no vertex bottom 6=\usevalue{no vertex bottom 6},
+ no vertex bottom 7=\usevalue{no vertex bottom 7},
+ no vertex bottom 8=\usevalue{no vertex bottom 8},
+ no vertex bottom 9=\usevalue{no vertex bottom 9},
+ no vertex top 1=\usevalue{no vertex top 1},
+ no vertex top 2=\usevalue{no vertex top 2},
+ no vertex top 3=\usevalue{no vertex top 3},
+ no vertex top 4=\usevalue{no vertex top 4},
+ no vertex top 5=\usevalue{no vertex top 5},
+ no vertex top 6=\usevalue{no vertex top 6},
+ no vertex top 7=\usevalue{no vertex top 7},
+ no vertex top 8=\usevalue{no vertex top 8},
+ no vertex top 9=\usevalue{no vertex top 9},
+ labels=\usevalue{labels},
+ labels bottom=\usevalue{labels bottom},
+ labels top=\usevalue{labels top},
+ labels start=\usevalue{labels start},
+ labels bottom start=\usevalue{labels bottom start},
+ labels top start=\usevalue{labels top start},
+ no label bottom 1=\usevalue{no label bottom 1},
+ no label bottom 2=\usevalue{no label bottom 2},
+ no label bottom 3=\usevalue{no label bottom 3},
+ no label bottom 4=\usevalue{no label bottom 4},
+ no label bottom 5=\usevalue{no label bottom 5},
+ no label bottom 6=\usevalue{no label bottom 6},
+ no label bottom 7=\usevalue{no label bottom 7},
+ no label bottom 8=\usevalue{no label bottom 8},
+ no label bottom 9=\usevalue{no label bottom 9},
+ no label top 1=\usevalue{no label top 1},
+ no label top 2=\usevalue{no label top 2},
+ no label top 3=\usevalue{no label top 3},
+ no label top 4=\usevalue{no label top 4},
+ no label top 5=\usevalue{no label top 5},
+ no label top 6=\usevalue{no label top 6},
+ no label top 7=\usevalue{no label top 7},
+ no label top 8=\usevalue{no label top 8},
+ no label top 9=\usevalue{no label top 9},
+ labels bottom draw=\usevalue{labels bottom draw},
+ labels bottom node=\usevalue{labels bottom node},
+ labels top draw=\usevalue{labels top draw},
+ labels top node=\usevalue{labels top node},
+ dots draw=\usevalue{dots draw},
+ dots node=\usevalue{dots node},
+ vertices bottom phantom=\usevalue{vertices bottom phantom},
+ vertices top phantom=\usevalue{vertices top phantom},
+ vertices bottom uncover=\usevalue{vertices bottom uncover},
+ vertices top uncover=\usevalue{vertices top uncover},
+ levels=\usevalue{levels},
+ levels bottom=\usevalue{levels bottom},
+ levels top=\usevalue{levels top},
+ levels sep=\usevalue{levels sep},
+ levels sep bottom=\usevalue{levels sep bottom},
+ levels sep top=\usevalue{levels sep top},
+ edges first=\usevalue{edges first},
+ transversals first=\usevalue{transversals first},
+ edges phantom=\usevalue{edges phantom},
+ edges uncover=\usevalue{edges uncover},
+ brace draw=\usevalue{brace draw},
+ brace node=\usevalue{brace node},
+ decorate before=\usevalue{decorate before},
+ decorate after=\usevalue{decorate after}
+ }%
\setkeys{pmdraw@brick}{levels,#1}% Processes options and set default levels
\pmdraw@hookBeforeBrick% Hook before drawing brick
\ifnum\pmdraw@ifEdgesFirst=0% If drawing vertices first
@@ -1299,6 +2222,7 @@
\let\pmdraw@drawLabelBottom\pmdraw@drawLabelBottomDefault%
\let\pmdraw@drawLabelTop\pmdraw@drawLabelTopDefault%
\let\pmdraw@drawLabelBottom\pmdraw@drawLabelBottomDefault%
+ \let\pmdraw@drawVertex\pmdraw@drawVertexDefault%
\setcounter{pmdraw@blankB}{0}%
\setcounter{pmdraw@blankT}{0}%
\setcounter{pmdraw@labelStartB}{1}%
@@ -1309,6 +2233,13 @@
}
\newcommand{\pmdraw@drawLedges}[3][]{% Draws lower non-transversal edge, #1 options, #2 L vertex, #3 R vertex
\setcounter{pmdraw@NTlevel}{1}% Store default level of edge
+ \setkeys{pmdraw@NTedges}{% Sets default non-transversal edge keys
+ level=\usevalue{level},
+ height=\usevalue{height},
+ edge draw=\usevalue{edge draw},
+ phantom=\usevalue{phantom},
+ uncover=\usevalue{uncover}
+ }%
\setkeys{pmdraw@NTedges}{#1}% Processes options
\ifdim\pmdraw@NTedgesHeight pt=-1000pt% If using default heights
\tikzmath{%
@@ -1346,6 +2277,11 @@
\pmdraw@LedgesLoop% Restart for loop
}
\newcommand{\pmdraw@drawTedges}[3][]{% Draws transversal edge, #1 options, #2 upper vertex, #3 lower vertex
+ \setkeys{pmdraw@Tedges}{% Sets default key values for transversal edges
+ edge draw=\usevalue{edge draw},
+ phantom=\usevalue{phantom},
+ uncover=\usevalue{uncover}
+ }%
\setkeys{pmdraw@Tedges}{#1}% Processes options
\@ifclassloaded{beamer}{% If in beamer
\uncover<\pmdraw@edgeUncover>{% Uncovers edge
@@ -1421,6 +2357,13 @@
}
\newcommand{\pmdraw@drawUedges}[3][]{% Draws upper non-transversal edge, #1 options, #2 L vertex, #3 R vertex
\setcounter{pmdraw@NTlevel}{1}% Store default level of edge
+ \setkeys{pmdraw@NTedges}{% Sets default non-transversal edge keys
+ level=\usevalue{level},
+ height=\usevalue{height},
+ edge draw=\usevalue{edge draw},
+ phantom=\usevalue{phantom},
+ uncover=\usevalue{uncover}
+ }%
\setkeys{pmdraw@NTedges}{#1}% Processes options
\ifdim\pmdraw@NTedgesHeight pt=-1000pt% If using default heights
\tikzmath{%
diff --git a/graphics/pgf/contrib/pmdraw/pmdraw.tex b/graphics/pgf/contrib/pmdraw/pmdraw.tex
index b4111bcff2..03ffc279e7 100644
--- a/graphics/pgf/contrib/pmdraw/pmdraw.tex
+++ b/graphics/pgf/contrib/pmdraw/pmdraw.tex
@@ -1,7 +1,7 @@
\documentclass{ltxdoc}
% *------------------------------*
-% |6````````````````````````````2|
+% |8````````````````````````````2|
% |`````____````____`````````````|
% |````|MFMF\ /MFMF|````````````|
% |````|MF|MF\/MF|MF|````````````|
@@ -13,7 +13,7 @@
% |``````````````|MF|````````````|
% |``````````````|MF|````````````|
% |``````````````|MF|````````````|
-% |3````````````````````````````0|
+% |3````````````````````````````5|
% *------------------------------*
\usepackage{pmdraw}
@@ -26,7 +26,7 @@
\hypersetup{colorlinks, linkcolor=blue, urlcolor=blue}
\title{The \textsf{pmdraw} package\thanks{This document
- corresponds to \textsf{pmdraw}~v1.4, 2024-06-02.}}
+ corresponds to \textsf{pmdraw}~v1.7, 2025-01-28.}}
\author{Matthias Fresacher \\ \texttt{matthias.ypg37@slmail.me}}
\maketitle
@@ -55,6 +55,7 @@ This package has at its core the basic drawing macro of a diagram as used by Jam
I thank everybody that has helped me proof read, spot bugs, provide feedback, suggest improvements or has otherwise contributed to this package. Those that are happy to be named are (in chronological order):
\begin{itemize}
\item Nik Ru\v{s}kuc
+ \item Luka Carroll
\end{itemize}
This package heavily uses commands that can accept an arbitrary number of arguments as inputs. I thank \texttt{egreg} for their template upon which my commands are based (\url{https://tex.stackexchange.com/a/72915}).
@@ -86,7 +87,7 @@ The following are a list of currently known bugs that will be addressed:
The following are a list of known problems or incompatibilities that are not scheduled to be resolved anytime soon:
\begin{enumerate}
- \item None at the moment
+ \item Whilst not strictly an incompatibility, when using \texttt{beamer}, frames have to be \texttt{fragile}.
\end{enumerate}
\section{Usage}
@@ -569,6 +570,223 @@ is a list of bricks that correspond to the bottom diagram, with each brick enclo
}
\end{center}
+\DescribeMacro{\pmdProductTriple}
+draws three diagrams on top of each other as is the case during multiplication or concatenation of three diagrams and has the syntax
+\begin{verbatim}
+\pmdProductTriple[<options>]{<ATedges>}{<ABedges>}{<Tbricks>}}{<Mbricks>}{<Bbricks>}
+\end{verbatim}
+where
+\DescribeMacro{diagram/<options>}
+the \texttt{<options>} are described in Section~\ref{sec: diagram/options}.
+
+\DescribeMacro{<ATedges>}\DescribeMacro{<ABedges>}
+is a list of edges that are added during the concatenation process. \texttt{<ATedges>} is the list of edges between the top and middle diagrams, whilst \texttt{<ABedges>} is the list of edges between the middle and bottom diagrams. An added edge has two components, namely \texttt{<ATedges>~=~\{<Svertex>\}\{<Tvertex>\}} and \texttt{<ABedges>~=~\{<Svertex>\}\{<Tvertex>\}}, where \texttt{\{<Svertex>\}} is the starting vertex and \texttt{\{<Tvertex>\}} is the terminating vertex of the collection of added edges. Both \texttt{\{<Svertex>\}} and \texttt{\{<Tvertex>\}} are a \( x \)-coordinate and it is assumed that \( \texttt{\{<Svertex>\}} < \texttt{\{<Tvertex>\}} \).
+
+\DescribeMacro{<Tbricks>}
+is a list of bricks that correspond to the top diagram, with each brick enclosed in curly brackets.
+
+\DescribeMacro{<Mbricks>}
+is a list of bricks that correspond to the top diagram, with each brick enclosed in curly brackets.
+
+\DescribeMacro{<Bbricks>}
+is a list of bricks that correspond to the bottom diagram, with each brick enclosed in curly brackets.
+\begin{center}
+ \begin{minipage}{\dimexpr0.85\textwidth-2\fboxrule-2\fboxsep\relax}
+ \begin{minipage}[c]{0.4\linewidth}
+\begin{verbatim}
+\pmdProductTriple{ % Top added edges
+ {1}{5}
+ {7}{8}
+}{ % Bottom added edges
+ {1}{5}
+ {7}{8}
+}{ % Top diagram
+ { % Brick 1
+ [ % Options
+ degree=5
+ ]{ % Upper non-transversal edges
+ \pmdEmpty
+ }{ % Lower non-transversal edges
+ \pmdEmpty
+ }{ % Transversal edges
+ {1}{1}
+ {2}{2}
+ {3}{3}
+ {4}{4}
+ {5}{5}
+ }
+ }{ % Brick 2
+ [ % Options
+ degree=2
+ ]{ % Upper non-transversal edges
+ \pmdEmpty
+ }{ % Lower non-transversal edges
+ \pmdEmpty
+ }{ % Transversal edges
+ {1}{1}
+ {2}{2}
+ }
+ }
+}{ % Middle diagram
+ % Continued on next page ...
+\end{verbatim}
+ \end{minipage}
+ \end{minipage}
+\end{center}
+\begin{center}
+ \begin{minipage}{\dimexpr0.85\textwidth-2\fboxrule-2\fboxsep\relax}
+ \begin{minipage}[c]{0.4\linewidth}
+\begin{verbatim}
+ % ... continued from previous page (note repeated line)
+}{ % Middle diagram
+ { % Brick 1
+ [ % Options
+ degree=5
+ ]{ % Upper non-transversal edges
+ \pmdEmpty
+ }{ % Lower non-transversal edges
+ \pmdEmpty
+ }{ % Transversal edges
+ {1}{1}
+ {2}{3}
+ {3}{2}
+ {4}{5}
+ {5}{4}
+ }
+ }{ % Brick 2
+ [ % Options
+ degree=2
+ ]{ % Upper non-transversal edges
+ \pmdEmpty
+ }{ % Lower non-transversal edges
+ \pmdEmpty
+ }{ % Transversal edges
+ {1}{2}
+ {2}{1}
+ }
+ }
+}{ % Bottom diagram
+ { % Brick 1
+ [ % Options
+ degree=5
+ ]{ % Upper non-transversal edges
+ {2}{3}
+ {4}{5}
+ }{ % Lower non-transversal edges
+ {2}{3}
+ {4}{5}
+ }{ % Transversal edges
+ {1}{1}
+ }
+ }{ % Brick 2
+ [ % Options
+ degree=2
+ ]{ % Upper non-transversal edges
+ {1}{2}
+ }{ % Lower non-transversal edges
+ {1}{2}
+ }{ % Transversal edges
+ \pmdEmpty
+ }
+ }
+}
+\end{verbatim}
+ \end{minipage}
+ \hfill
+ \begin{minipage}[c]{0.4\linewidth}
+ \end{minipage}
+ \end{minipage}%
+\end{center}
+\begin{center}
+\pmdProductTriple{ % Top added edges
+ {1}{5}
+ {7}{8}
+}{ % Bottom added edges
+ {1}{5}
+ {7}{8}
+}{ % Top diagram
+ { % Brick 1
+ [ % Options
+ degree=5
+ ]{ % Upper non-transversal edges
+ \pmdEmpty
+ }{ % Lower non-transversal edges
+ \pmdEmpty
+ }{ % Transversal edges
+ {1}{1}
+ {2}{2}
+ {3}{3}
+ {4}{4}
+ {5}{5}
+ }
+ }{ % Brick 2
+ [ % Options
+ degree=2
+ ]{ % Upper non-transversal edges
+ \pmdEmpty
+ }{ % Lower non-transversal edges
+ \pmdEmpty
+ }{ % Transversal edges
+ {1}{1}
+ {2}{2}
+ }
+ }
+}{ % Middle diagram
+ { % Brick 1
+ [ % Options
+ degree=5
+ ]{ % Upper non-transversal edges
+ \pmdEmpty
+ }{ % Lower non-transversal edges
+ \pmdEmpty
+ }{ % Transversal edges
+ {1}{1}
+ {2}{3}
+ {3}{2}
+ {4}{5}
+ {5}{4}
+ }
+ }{ % Brick 2
+ [ % Options
+ degree=2
+ ]{ % Upper non-transversal edges
+ \pmdEmpty
+ }{ % Lower non-transversal edges
+ \pmdEmpty
+ }{ % Transversal edges
+ {1}{2}
+ {2}{1}
+ }
+ }
+}{ % Bottom diagram
+ { % Brick 1
+ [ % Options
+ degree=5
+ ]{ % Upper non-transversal edges
+ {2}{3}
+ {4}{5}
+ }{ % Lower non-transversal edges
+ {2}{3}
+ {4}{5}
+ }{ % Transversal edges
+ {1}{1}
+ }
+ }{ % Brick 2
+ [ % Options
+ degree=2
+ ]{ % Upper non-transversal edges
+ {1}{2}
+ }{ % Lower non-transversal edges
+ {1}{2}
+ }{ % Transversal edges
+ \pmdEmpty
+ }
+ }
+}
+\end{center}
+
+\section{Options}
+
\subsection{Brick options} \label{sec: brick/options}
The following are all of the keys that are available for bricks.
@@ -779,7 +997,7 @@ passes through options to the \verb`\draw` command of vertices. The default is n
\DescribeMacro{no vertex top 1}
\DescribeMacro{ \vdots}
\DescribeMacro{no vertex top 9}
-specifies a vertex that is not drawn. Any of the nine available keys can be used in any order. It can be used to draw single vertices that are different to the others. If more than nine vertices need to be excluded, simply draw multiple bricks next to each other. The default is no argument.
+specifies a vertex that is not drawn. Any of the nine available keys can be used in any order. It can be used to draw single vertices that are different to the others. If more than nine vertices need to be excluded, simply draw multiple bricks next to each other. The default is -1.
\begin{center}
\begin{minipage}{\dimexpr0.85\textwidth-2\fboxrule-2\fboxsep\relax}
\begin{minipage}[c]{0.4\linewidth}
@@ -970,7 +1188,7 @@ sets the starting value of the labels for the vertices. The default is one.
\DescribeMacro{no labels top 1}
\DescribeMacro{ \vdots}
\DescribeMacro{no labels top 9}
-specifies a vertex for which no label is drawn. Any of the nine available keys can be used in any order. It can be used to insert single unique labels that are different to the others. If more than nine labels need to be excluded, simply draw multiple bricks next to each other. The default is no argument.
+specifies a vertex for which no label is drawn. Any of the nine available keys can be used in any order. It can be used to insert single unique labels that are different to the others. If more than nine labels need to be excluded, simply draw multiple bricks next to each other. The default is -1.
\begin{center}
\begin{minipage}{\dimexpr0.85\textwidth-2\fboxrule-2\fboxsep\relax}
\begin{minipage}[c]{0.4\linewidth}
@@ -1191,7 +1409,7 @@ The \texttt{no dots} flag removes the drawing of dots to the left of the current
}{ % Brick 2
[ % Options
degree=1,
- no dots
+ % no dots
]{ % Upper non-transversal edges
\pmdEmpty
}{ % Lower non-transversal edges
@@ -1321,7 +1539,7 @@ These flags allow for all of the top or bottom vertices to be hidden using the \
\end{center}
\DescribeMacro{vertices top uncover}\DescribeMacro{vertices bottom uncover}
-allows for all of the top or bottom vertices to be uncovered in a \texttt{beamer} presentation using the command \verb`\uncover<n->{text}`. Simply passes the slide uncover information \verb`<n->` to the embedded \texttt{uncover} command within the vertex drawing macros. This uncover will also apply to the labels of that row (top or bottom) of vertices. To only uncover a selected number of vertices, use seperate bricks. The default is~\texttt{1-}.
+allows for all of the top or bottom vertices to be uncovered in a \texttt{beamer} presentation\footnote{Make sure to use a \texttt{fragile} frame.} using the command \verb`\uncover<n->{text}`. Simply passes the slide uncover information \verb`<n->` to the embedded \texttt{uncover} command within the vertex drawing macros. This uncover will also apply to the labels of that row (top or bottom) of vertices. To only uncover a selected number of vertices, use seperate bricks. The default is~\texttt{1-}.
\begin{center}
\begin{minipage}{\dimexpr0.85\textwidth-2\fboxrule-2\fboxsep\relax}
\begin{minipage}[c]{0.4\linewidth}
@@ -1712,7 +1930,7 @@ This flag allows for all edges to be hidden using the \texttt{phantom} command.
\end{center}
\DescribeMacro{edges uncover}
-allows for all edges to be uncovered in a \texttt{beamer} presentation using the command \verb`\uncover<n->{text}`. Simply passes the slide uncover information \verb`<n->` to the embedded \texttt{uncover} command within the edge drawing macros. The default is~\texttt{1-}.
+allows for all edges to be uncovered in a \texttt{beamer} presentation\footnote{Make sure to use a \texttt{fragile} frame.} using the command \verb`\uncover<n->{text}`. Simply passes the slide uncover information \verb`<n->` to the embedded \texttt{uncover} command within the edge drawing macros. The default is~\texttt{1-}.
\begin{center}
\begin{minipage}{\dimexpr0.85\textwidth-2\fboxrule-2\fboxsep\relax}
\begin{minipage}[c]{0.4\linewidth}
@@ -2283,7 +2501,7 @@ This flag allows for the edge to be hidden using the \texttt{phantom} command. S
\end{center}
\DescribeMacro{uncover}
-allows for that edge to be uncovered in a \texttt{beamer} presentation using the command \verb`\uncover<n->{text}`. Simply passes the slide uncover information \verb`<n->` to the embedded \texttt{uncover} command within the edge drawing macros. This uncover is nested inside the \texttt{edges uncover} and hence the limitations of nested uncovers are present here. For example, an individual edge will not uncover until the \texttt{edges uncover} has been uncovered. In such instances only use individual uncovers for each edge. The default is~\texttt{1-}.
+allows for that edge to be uncovered in a \texttt{beamer} presentation\footnote{Make sure to use a \texttt{fragile} frame.} using the command \verb`\uncover<n->{text}`. Simply passes the slide uncover information \verb`<n->` to the embedded \texttt{uncover} command within the edge drawing macros. This uncover is nested inside the \texttt{edges uncover} and hence the limitations of nested uncovers are present here. For example, an individual edge will not uncover until the \texttt{edges uncover} has been uncovered. In such instances only use individual uncovers for each edge. The default is~\texttt{1-}.
\begin{center}
\begin{minipage}{\dimexpr0.85\textwidth-2\fboxrule-2\fboxsep\relax}
\begin{minipage}[c]{0.4\linewidth}
@@ -2589,7 +2807,7 @@ This flag allows for the edge to be hidden using the \texttt{phantom} command. S
\end{center}
\DescribeMacro{uncover}
-allows for that edge to be uncovered in a \texttt{beamer} presentation using the command \verb`\uncover<n->{text}`. Simply passes the slide uncover information \verb`<n->` to the embedded \texttt{uncover} command within the edge drawing macros. This uncover is nested inside the \texttt{edges uncover} and hence the limitations of nested uncovers are present here. For example, an individual edge will not uncover until the \texttt{edges uncover} has been uncovered. In such instances only use individual uncovers for each edge. The default is~\texttt{1-}.
+allows for that edge to be uncovered in a \texttt{beamer} presentation\footnote{Make sure to use a \texttt{fragile} frame.} using the command \verb`\uncover<n->{text}`. Simply passes the slide uncover information \verb`<n->` to the embedded \texttt{uncover} command within the edge drawing macros. This uncover is nested inside the \texttt{edges uncover} and hence the limitations of nested uncovers are present here. For example, an individual edge will not uncover until the \texttt{edges uncover} has been uncovered. In such instances only use individual uncovers for each edge. The default is~\texttt{1-}.
\begin{center}
\begin{minipage}{\dimexpr0.85\textwidth-2\fboxrule-2\fboxsep\relax}
\begin{minipage}[c]{0.4\linewidth}
@@ -3203,7 +3421,7 @@ And this is default drawing order for a product diagram:
For the drawing order of a brick see Section~\ref{sec: order}.
-\subsubsection{For product diagrams only}
+\subsubsection{For product diagrams only} \label{sec: prod only}
The following options can only be used for product diagrams (\verb`\pmdProduct`).
@@ -3554,7 +3772,7 @@ This flag allows for the added edges to be hidden using the \texttt{phantom} com
\end{center}
\DescribeMacro{edges added uncover}
-allows for the added edges to be uncovered in a \texttt{beamer} presentation using the command \verb`\uncover<n->{text}`. Simply passes the slide uncover information \verb`<n->` to the embedded \texttt{uncover} command within the added edge drawing macros. The default is~\texttt{1-}.
+allows for the added edges to be uncovered in a \texttt{beamer} presentation\footnote{Make sure to use a \texttt{fragile} frame.} using the command \verb`\uncover<n->{text}`. Simply passes the slide uncover information \verb`<n->` to the embedded \texttt{uncover} command within the added edge drawing macros. The default is~\texttt{1-}.
\begin{center}
\begin{minipage}{\dimexpr0.85\textwidth-2\fboxrule-2\fboxsep\relax}
\begin{minipage}[c]{0.4\linewidth}
@@ -3639,6 +3857,139 @@ allows for the added edges to be uncovered in a \texttt{beamer} presentation usi
}
\end{center}
+\subsection{Global options}
+
+The following are all of the commands that change all diagrams after the command is given.
+
+\DescribeMacro{\pmdSetDefault}
+sets the default style of all diagrams and has the syntax \verb`\pmdSetDefault{<keys>}`, where the input keys are one of the following:
+\begin{itemize}
+ \item \texttt{brick} -- see Section~\ref{sec: brick/options},
+ \item \texttt{NTedges} -- non-transversal edges, see Section~\ref{sec: NT edge/options},
+ \item \texttt{Tedges} -- transversal edges, see Section~\ref{sec: T edge/options},
+ \item \texttt{brace} -- see Section~\ref{sec: brace},
+ \item \texttt{diagram} -- see Section~\ref{sec: diagram/options}.
+\end{itemize}
+Only the keys (both families, for example brick, and individual keys, for example degree) that are to be changed need to be given. Unspecified keys will retain their existing default values.
+
+The follow is an example use:
+\begin{center}
+ \begin{minipage}{\dimexpr0.85\textwidth-2\fboxrule-2\fboxsep\relax}
+ \begin{minipage}[c]{0.4\linewidth}
+\begin{verbatim}
+\pmdSetDefault{% Set default keys
+ brick={% Brick keys
+ degree=5,
+ vertices=blue
+ },
+ Tedges={% Transversal edge keys
+ edge draw=red
+ }
+}
+
+\pmdBrick[ % Options
+ % degree=5% Not needed anymore
+]{ % Upper non-transversal edges
+ {1}{2}
+ {2}{5}
+}{ % Lower non-transversal edges
+ {1}{2}
+ {3}{4}
+}{ % Transversal edges
+ {1}{1}
+ {3}{4}
+}
+\end{verbatim}
+ \end{minipage}
+ \hfill
+ \begin{minipage}[c]{0.4\linewidth}
+\pmdSetDefault{% Set default keys
+ brick={% Brick keys
+ degree=5,
+ vertices=blue
+ },
+ Tedges={% Transversal edge keys
+ edge draw=red
+ }
+}
+
+\pmdBrick[ % Options
+ % degree=5% Not needed anymore
+]{ % Upper non-transversal edges
+ {1}{2}
+ {2}{5}
+}{ % Lower non-transversal edges
+ {1}{2}
+ {3}{4}
+}{ % Transversal edges
+ {1}{1}
+ {3}{4}
+}
+ \end{minipage}
+ \end{minipage}%
+\end{center}
+
+By default, any keys that are provided in a specific instance of a diagram completely override the default value of those keys for that specific instance of a diagram. However, the following keys work differently in that the default value is loaded and then the specific instance of that key in a diagram is appended to the list of options given:
+\begin{itemize}
+ \item \texttt{brick} keys:
+ \begin{itemize}
+ \item \texttt{vertices},
+ \item \texttt{edges},
+ \item \texttt{edges non-transversal},
+ \item \texttt{edges upper},
+ \item \texttt{edges lower},
+ \item \texttt{edges transversal}.
+ \end{itemize}
+ \item \texttt{diagram} keys:
+ \begin{itemize}
+ \item \texttt{edges added}.
+ \end{itemize}
+\end{itemize}
+This means that, for example, if the default \texttt{brick/edges} key is set to \texttt{red} and for a specific diagram the \texttt{brick/edges} key is set to \texttt{thick}, the resulting edge will be \verb`{red, thick}`. In short, this works in the default way that \texttt{tikz} handles multiple options, including repeated options, given to a \verb`\draw` command. Options are appended in the following order:
+\begin{enumerate}
+ \item Global default value,
+ \item Diagram value,
+ \item Brick value,
+ \item Edge value (if key is for an edge).
+\end{enumerate}
+The following keys cannot be changed using the \verb`\pmdSetDefault` command:
+\begin{itemize}
+ \item \texttt{brick} keys:
+ \begin{itemize}
+ \item \texttt{vertices options},
+ \item \texttt{labels bottom options},
+ \item \texttt{labels top options},
+ \item \texttt{no dots},
+ \item \texttt{brace}.
+ \end{itemize}
+ \item \texttt{NTedges} keys:
+ \begin{itemize}
+ \item \texttt{options}.
+ \end{itemize}
+ \item \texttt{Tedges} keys:
+ \begin{itemize}
+ \item \texttt{height},
+ \item \texttt{options}.
+ \end{itemize}
+ \item \texttt{brace} keys:
+ \begin{itemize}
+ \item \texttt{label},
+ \item \texttt{options}.
+ \end{itemize}
+ \item \texttt{diagram} keys:
+ \begin{itemize}
+ \item \texttt{dots options}.
+ \end{itemize}
+\end{itemize}
+Instead their default commands should be changed as a work around. For example, the key \texttt{labels bottom options} can be set to a different default value by finding the corresponding default command in the style file, \verb`\pmdraw@drawLabelBottomDefault` for this example, and redefining that command to the new default value sought.
+
+It should be noted that for some of these keys the above mentioned work around does not work. An example of this is for the \texttt{height} key as this is defined more complexly than just via a single command.
+
+Due to the use of the \texttt{xkeyval} package which only has the ability to save one value for a key, it is not possible to have more than one default option defined. A substantial rewrite of the package would be needed to have an arbitrary number of predefined styles that can quickly be used.
+
+\DescribeMacro{\pmdSetToOriginalDefault}
+sets the style of all diagrams to the default original style of the package. In effect it undoes any and all changes made with \verb`\pmdSetDefault`.
+
\section{Future features/work}
I have attempted to make most use cases easy to use with dedicated functionality that does not require significant \LaTeX\ knowledge whilst at the same time provide more advanced interfaces to allow for hopefully almost complete customisability for those who put in the effort.
@@ -3652,7 +4003,6 @@ The following are some of the aims for the future for this package:
\item Allow all brick keys to work as diagram keys that apply to all bricks in a diagram. This will require setting up a flag for each key so that the diagram key sets the brick key but the brick key is not reset after drawing the first brick. This process also will need to be able to handle when a single brick has a custom special different key value and that this is reset to the digram key value and not the global default key value.
\item Allow appropriate diagram keys to work as brick keys. Notably the \texttt{grid} key.
\item The creation of user profiles that allows for fast and efficient setting of default key values that are different to the package defaults. Hence within a diagram, there can be a number of different diagram styles that can be accessed with one command. That is, in the options for a diagram, have this profile key.
- \item Have global settings so that all diagrams in a document have the specified options.
\item Allow for adjusting the horizontal spacing of vertices. Need to think about making that a simple scale factor so that integer interface for edge positions is the same but then hooks will have very messy coordinates or keep it as absolute coordinates with messy edges. Alternatively, do both, allowing the user to choose which option to do and somehow distinguish between the two in the background.
\item Create \texttt{pmdMirror} command that mirrors all upper non-transversals into lower non-transversals.
\item Create \texttt{invert} key for bricks, diagrams and product diagrams that inverts everything. Probably easiest done with a \texttt{scope} environment around everything and \texttt{yscale=-1}.
@@ -3661,6 +4011,7 @@ The following are some of the aims for the future for this package:
\item Create \texttt{shift} key for edges that shifts horizontal position.
\item Decouple the uncover of labels from \texttt{vertices top uncover}/\texttt{vertices bottom uncover}.
\item Decouple the phantom of labels from \texttt{vertices top phantom}/\texttt{vertices bottom phantom}.
+ \item For all of the keys in Section~\ref{sec: prod only}, create a top and bottom version to be used in \texttt{pmdProductTriple}.
\end{enumerate}
\section{Examples}
diff --git a/graphics/pgf/contrib/polyomino/README.md b/graphics/pgf/contrib/polyomino/README.md
new file mode 100644
index 0000000000..7f3c8023ad
--- /dev/null
+++ b/graphics/pgf/contrib/polyomino/README.md
@@ -0,0 +1,25 @@
+# `polyomino`
+
+## Polyominoes using Ti*k*Z and LaTeX3
+
+Version 1.0 (2024/08/01)
+
+This package is based on the package [Ti*k*Z](https://ctan.org/pkg/pgf) and can be used to draw polyominoes. It is possible to define custom styles, pics and grids.
+
+%% README.md
+%% Copyright 2024 Matthias Floré
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Matthias Floré.
+%
+% This work consists of the files polyomino.pdf, polyomino.sty,
+% polyomino.tex and README.md. \ No newline at end of file
diff --git a/graphics/pgf/contrib/polyomino/polyomino.pdf b/graphics/pgf/contrib/polyomino/polyomino.pdf
new file mode 100644
index 0000000000..597c00c4db
--- /dev/null
+++ b/graphics/pgf/contrib/polyomino/polyomino.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/polyomino/polyomino.sty b/graphics/pgf/contrib/polyomino/polyomino.sty
new file mode 100644
index 0000000000..7a85590118
--- /dev/null
+++ b/graphics/pgf/contrib/polyomino/polyomino.sty
@@ -0,0 +1,286 @@
+%% polyomino.sty
+%% Copyright 2024 Matthias Floré
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Matthias Floré.
+%
+% This work consists of the files polyomino.pdf, polyomino.sty,
+% polyomino.tex and README.md.
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{tikz}
+\ProvidesExplPackage{polyomino}{2024/08/01}{1.0}{Polyominoes using TikZ and LaTeX3}
+
+%%> \subsection{Variables and variants}
+
+\bool_new:N \l__polyomino_grid_bool
+\bool_new:N \l__polyomino_pic_bool
+
+\int_new:N \l__polyomino_col_int
+\int_new:N \l__polyomino_dir_int
+\int_new:N \l__polyomino_max_int
+\int_new:N \l__polyomino_row_int
+\int_new:N \l__polyomino_x_int
+\int_new:N \l__polyomino_y_int
+
+\seq_new:N \l__polyomino_add_seq
+\seq_new:N \l__polyomino_cols_seq
+
+\tl_new:N \l__polyomino_path_tl
+\tl_new:N \l__polyomino_pic_tl
+
+\cs_generate_variant:Nn \tl_map_inline:nn { en }
+
+%%> \subsection{Pgfkeys}
+
+\pgfkeys
+ {
+ / polyomino /. is~family ,
+ / polyomino /. search~also = / polyomino / p_2 ,
+ / polyomino ,
+ at /. initial = { ( 0 , 0 ) } ,
+ empty~cell /. initial = . ,
+ grid /. code = \bool_set:Nn \l__polyomino_grid_bool { \cs:w c_#1_bool \cs_end: } ,
+ grid /. default = true ,
+ grid = false ,
+ grid~style /. style = { grid_style /. style = {#1} } ,
+ grid_style /. style = {} ,
+ row~sep /. initial = { , } ,
+ }
+
+\pgfkeys
+ {%a separate key family so that the second argument of the key p only accepts keys which apply to a separate polyomino
+ / polyomino / p_2 /. is~family ,
+ / polyomino / p_2 ,
+ connected /. code = \bool_set_false:N \l__polyomino_pic_bool ,
+ connected /. value~forbidden ,
+ discrete /. code = \bool_set_true:N \l__polyomino_pic_bool ,
+ discrete /. value~forbidden ,
+ p /. style~2~args = { #1__style /. style = {#2} } ,%2 underscores to avoid the same name as for example the key style_style
+ pic /. code =
+ {
+ \bool_set_true:N \l__polyomino_pic_bool
+ \tl_set:Nn \l__polyomino_pic_tl {#1}
+ } ,
+ style /. style = { style_style /. style = {#1} } ,
+ style_style /. style = {} ,
+ }
+
+%%> \subsection{The command \textbackslash polyomino}
+
+\NewDocumentCommand \polyomino { O {} m }
+ {
+ {%note the double braces {{...}} so that the contents is in a group and in particular, \pgfkeys is applied locally
+ \pgfkeys { / polyomino , #1 }
+ \int_zero:N \l__polyomino_col_int
+ \int_set:Nn \l__polyomino_row_int { 1 }
+ \seq_clear:N \l__polyomino_cols_seq
+ \tl_map_inline:en {#2}
+ %it is convenient that this ignores spaces in #2
+ %e argument specifier for the case that #2 is given by a command or contains a command
+ {
+ \tl_if_eq:neTF {##1} { \pgfkeysvalueof { / polyomino / row~sep } }
+ {
+ \seq_put_right:NV \l__polyomino_cols_seq \l__polyomino_col_int
+ \int_incr:N \l__polyomino_row_int
+ \int_zero:N \l__polyomino_col_int
+ }
+ {
+ \int_incr:N \l__polyomino_col_int
+ \tl_clear_new:c { l__polyomino_\int_use:N \l__polyomino_row_int _\int_use:N \l__polyomino_col_int _tl }
+ \tl_if_eq:neF {##1} { \pgfkeysvalueof { / polyomino / empty~cell } }
+ { \tl_set:cn { l__polyomino_\int_use:N \l__polyomino_row_int _\int_use:N \l__polyomino_col_int _tl } {##1} }
+ \tl_gclear_new:c { g__polyomino_\int_use:N \l__polyomino_row_int _\int_use:N \l__polyomino_col_int _tl }
+ }
+ }
+ \seq_put_right:NV \l__polyomino_cols_seq \l__polyomino_col_int
+ \int_set:Nn \l__polyomino_max_int { \fp_eval:n { max ( \seq_use:Nn \l__polyomino_cols_seq { , } ) } }
+ \seq_map_indexed_inline:Nn \l__polyomino_cols_seq
+ {
+ \tl_clear_new:c { l__polyomino_##1_0_tl }
+ \int_step_inline:nnn { ##2 + 1 } { \l__polyomino_max_int + 1 }
+ { \tl_clear_new:c { l__polyomino_##1_####1_tl } }
+ }
+ \int_step_inline:nnn { 0 } { \l__polyomino_max_int + 1 }
+ {
+ \tl_clear_new:c { l__polyomino_0_##1_tl }
+ \tl_clear_new:c { l__polyomino_\int_eval:n { \l__polyomino_row_int + 1 }_##1_tl }
+ }
+ \pgfkeys
+ {
+ / tikz ,
+ shift /. expanded = { \pgfkeysvalueof { / polyomino / at } } ,
+ shift = { ( 0 , \seq_count:N \l__polyomino_cols_seq ) }
+ }
+ \seq_map_indexed_inline:Nn \l__polyomino_cols_seq
+ {
+ \int_step_inline:nn {##2}
+ {
+ \tl_if_empty:cF { l__polyomino_##1_####1_tl }
+ {
+ {%note the double braces {{...}} so that \pgfkeys is applied locally
+ \pgfkeys { / polyomino / p_2 , \cs:w l__polyomino_##1_####1_tl \cs_end: __style }
+ \bool_if:NTF \l__polyomino_pic_bool
+ { \pic [ / polyomino / p_2 / style_style ] at ( ####1 - 0.5 , 0.5 - ##1 ) { code = { \l__polyomino_pic_tl } } ; }
+ {
+ \seq_clear:N \l__polyomino_add_seq
+ \tl_if_eq:ccF { l__polyomino_##1_####1_tl } { l__polyomino_##1_\int_eval:n { ####1 - 1 }_tl }
+ {
+ \tl_if_empty:cT { g__polyomino_##1_####1_tl }
+ {
+ \int_set:Nn \l__polyomino_dir_int { 1 }
+ \int_set:Nn \l__polyomino_col_int {####1}
+ \int_set:Nn \l__polyomino_row_int {##1}
+ \int_set:Nn \l__polyomino_x_int {####1}
+ \int_set:Nn \l__polyomino_y_int { 1 - ##1 }
+ \tl_build_begin:N \l__polyomino_path_tl
+ \fp_do_until:nn { ####1 - 1 = \l__polyomino_x_int && 1 - ##1 = \l__polyomino_y_int }
+ {
+ %concerning \tl_build_put_right:Ne \l__polyomino_path_tl,
+ %for example (0,0)--(0,1)--(0,2) results in a larger file size than (0,0)--(0,2)
+ \tl_if_eq:ccTF
+ { l__polyomino_##1_####1_tl }
+ {
+ l__polyomino
+ _\int_eval:n
+ { \l__polyomino_row_int + \clist_item:nn { 0 , 1 , 0 , -1 } { \l__polyomino_dir_int } }
+ _\int_eval:n
+ { \l__polyomino_col_int + \clist_item:nn { 1 , 0 , -1 , 0 } { \l__polyomino_dir_int } }
+ _tl
+ }
+ {
+ \tl_if_eq:ccTF
+ { l__polyomino_##1_####1_tl }
+ {
+ l__polyomino
+ _\int_eval:n
+ { \l__polyomino_row_int + \clist_item:nn { -1 , 1 , 1 , -1 } { \l__polyomino_dir_int } }
+ _\int_eval:n
+ { \l__polyomino_col_int + \clist_item:nn { 1 , 1 , -1 , -1 } { \l__polyomino_dir_int } }
+ _tl
+ }
+ {
+ \tl_build_put_right:Ne \l__polyomino_path_tl
+ { -- ( \int_use:N \l__polyomino_x_int , \int_use:N \l__polyomino_y_int ) }
+ \int_add:Nn \l__polyomino_row_int
+ { \clist_item:nn { -1 , 1 , 1 , -1 } { \l__polyomino_dir_int } }
+ \int_add:Nn \l__polyomino_col_int
+ { \clist_item:nn { 1 , 1 , -1 , -1 } { \l__polyomino_dir_int } }
+ \int_compare:nNnTF { \l__polyomino_dir_int } = { 1 }
+ { \int_set:Nn \l__polyomino_dir_int { 4 } }
+ { \int_decr:N \l__polyomino_dir_int }
+ }
+ {
+ \int_add:Nn \l__polyomino_row_int
+ { \clist_item:nn { 0 , 1 , 0 , -1 } { \l__polyomino_dir_int } }
+ \int_add:Nn \l__polyomino_col_int
+ { \clist_item:nn { 1 , 0 , -1 , 0 } { \l__polyomino_dir_int } }
+ }
+ \tl_if_empty:cTF
+ { g__polyomino_\int_use:N \l__polyomino_row_int _\int_use:N \l__polyomino_col_int _tl }
+ {
+ \seq_put_right:Ne \l__polyomino_add_seq
+ { \int_use:N \l__polyomino_row_int _\int_use:N \l__polyomino_col_int }
+ }
+ {
+ \bool_set_true:N \l__polyomino_pic_bool
+ \int_set:Nn \l__polyomino_x_int { ####1 - 1 }
+ \int_set:Nn \l__polyomino_y_int { 1 - ##1 }
+ }
+ }
+ {
+ \tl_build_put_right:Ne \l__polyomino_path_tl
+ { -- ( \int_use:N \l__polyomino_x_int , \int_use:N \l__polyomino_y_int ) }
+ \int_compare:nNnTF { \l__polyomino_dir_int } = { 4 }
+ { \int_set:Nn \l__polyomino_dir_int { 1 } }
+ { \int_incr:N \l__polyomino_dir_int }
+ }
+ \bool_if:NF \l__polyomino_pic_bool
+ {
+ \int_add:Nn \l__polyomino_x_int { \clist_item:nn { 1 , 0 , -1 , 0 } { \l__polyomino_dir_int } }
+ \int_add:Nn \l__polyomino_y_int { \clist_item:nn { 0 , -1 , 0 , 1 } { \l__polyomino_dir_int } }
+ }
+ }
+ \tl_build_end:N \l__polyomino_path_tl
+ \bool_if:NF \l__polyomino_pic_bool
+ { \fill [ / polyomino / p_2 / style_style ] ( ####1 - 1 , 1 - ##1 ) \l__polyomino_path_tl -- cycle ; }
+ }
+ }
+ \tl_gset:cn { g__polyomino_##1_####1_tl } { c }
+ \seq_map_inline:Nn \l__polyomino_add_seq
+ { \tl_gset:cn { g__polyomino_########1_tl } { c } }
+ }
+ }
+ }
+ }
+ }
+ \bool_if:NT \l__polyomino_grid_bool
+ {
+ \int_step_inline:nn { \seq_count:N \l__polyomino_cols_seq - 1 }
+ {
+ \int_zero:N \l__polyomino_col_int
+ \int_zero:N \l__polyomino_x_int
+ \int_set:Nn \l__polyomino_y_int
+ { \int_min:nn { \seq_item:Nn \l__polyomino_cols_seq {##1} } { \seq_item:Nn \l__polyomino_cols_seq { ##1 + 1 } } }
+ \int_while_do:nNnn { \l__polyomino_x_int } < { \l__polyomino_y_int }
+ {
+ \bool_do_while:nn
+ {
+ \tl_if_eq_p:cc
+ { l__polyomino_##1_\int_use:N \l__polyomino_x_int _tl }
+ { l__polyomino_\int_eval:n { ##1 + 1 }_\int_use:N \l__polyomino_x_int _tl }
+ &&
+ ! \tl_if_empty_p:c { g__polyomino_##1_\int_use:N \l__polyomino_x_int _tl }
+ &&
+ \int_compare_p:nNn { \l__polyomino_x_int } < { \l__polyomino_y_int + 1 }
+ }
+ { \int_incr:N \l__polyomino_x_int }
+ \int_compare:nNnT { \l__polyomino_x_int } > { \l__polyomino_col_int + 1 }
+ {
+ \draw [ / polyomino / grid_style ]
+ ( \int_use:N \l__polyomino_col_int , -##1 ) -- ( \int_use:N \l__polyomino_x_int - 1 , -##1 ) ;
+ }
+ \int_set_eq:NN \l__polyomino_col_int \l__polyomino_x_int
+ }
+ }
+ \int_set:Nn \l__polyomino_x_int { \seq_count:N \l__polyomino_cols_seq }
+ \int_step_inline:nn { \l__polyomino_max_int - 1 }
+ {
+ \int_zero:N \l__polyomino_row_int
+ \int_zero:N \l__polyomino_y_int
+ \int_while_do:nNnn { \l__polyomino_y_int } < { \l__polyomino_x_int }
+ {
+ \bool_do_while:nn
+ {
+ \tl_if_eq_p:cc
+ { l__polyomino_\int_use:N \l__polyomino_y_int _##1_tl }
+ { l__polyomino_\int_use:N \l__polyomino_y_int _\int_eval:n { ##1 + 1 }_tl }
+ &&
+ ! \tl_if_empty_p:c { g__polyomino_\int_use:N \l__polyomino_y_int _##1_tl }
+ &&
+ \int_compare_p:nNn { \l__polyomino_y_int } < { \l__polyomino_x_int + 1 }
+ &&
+ \int_compare_p:nNn {##1} < { \seq_item:Nn \l__polyomino_cols_seq { \l__polyomino_y_int } + 0 }
+ }
+ { \int_incr:N \l__polyomino_y_int }
+ \int_compare:nNnT { \l__polyomino_y_int } > { \l__polyomino_row_int + 1 }
+ {
+ \draw [ / polyomino / grid_style ]
+ ( ##1 , -\int_use:N \l__polyomino_row_int ) -- ( ##1 , 1 - \int_use:N \l__polyomino_y_int ) ;
+ }
+ \int_set_eq:NN \l__polyomino_row_int \l__polyomino_y_int
+ }
+ }
+ }
+ }
+ }
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/contrib/polyomino/polyomino.tex b/graphics/pgf/contrib/polyomino/polyomino.tex
new file mode 100644
index 0000000000..c512cec895
--- /dev/null
+++ b/graphics/pgf/contrib/polyomino/polyomino.tex
@@ -0,0 +1,278 @@
+%% polyomino.tex
+%% Copyright 2024 Matthias Floré
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Matthias Floré.
+%
+% This work consists of the files polyomino.pdf, polyomino.sty,
+% polyomino.tex and README.md.
+\documentclass[a4paper,english,dvipsnames]{ltxdoc}
+\usepackage[english]{babel}
+\usepackage{graphicx}
+\usepackage[a4paper,left=2.25cm,right=2.25cm,top=2.5cm,bottom=2.5cm,nohead]{geometry}
+\usepackage{parskip}
+\usepackage{iftex}
+\ifluatex
+\else
+\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\fi
+\usepackage{mathtools}
+\usepackage{amssymb}
+\allowdisplaybreaks
+\usepackage{pdflscape}
+\usepackage{polyomino}
+\input{pgfmanual-en-macros.tex}
+\usepackage{codehigh}
+\usepackage{fancyhdr}
+\pagestyle{fancy}
+\renewcommand{\headrulewidth}{0pt}
+\fancyhead{}
+\ExplSyntaxOn
+\NewExpandableDocumentCommand \repeatnumber {}
+ { \prg_replicate:nn { \thepage } { * } }
+\ExplSyntaxOff
+\fancyfoot[C]{\IfRefUndefinedExpandable{Thesourcecode}{}{\begin{tikzpicture}[scale=0.9]
+\polyomino[
+ grid,
+ p={*}{style={teal,draw=black}}
+]{\repeatnumber}
+\end{tikzpicture}}}
+\usepackage[nottoc]{tocbibind}
+\usepackage{imakeidx}
+\makeindex[program=makeindex,columns=2,intoc=true]
+\indexsetup{othercode={\thispagestyle{fancy}}}
+\AtEndPreamble{\hypersetup{%
+linktoc=all,
+pdfstartview=FitH,
+colorlinks=true,
+linkcolor=Mahogany,
+citecolor=ForestGreen,
+urlcolor=MidnightBlue,
+bookmarksnumbered=true,
+pdftitle={The polyomino package},
+pdfauthor={Matthias Floré},
+pdfsubject={Manual},
+pdfkeywords={polyomino}}}
+\setcounter{tocdepth}{2}
+\setcounter{secnumdepth}{2}
+\title{The \texttt{polyomino} package\\[12pt]\large Polyominoes using \tikzname{} and \LaTeX3}
+\author{Matthias Floré}
+\date{Version 1.0 (2024/08/01)}%\\[12pt]
+\begin{document}
+\maketitle
+\thispagestyle{fancy}
+\begin{abstract}
+\noindent This package is based on the package |tikz| (see \cite{TtTaPGFp}) and can be used to draw polyominoes. It is possible to define custom styles, pics and grids.% This is the manual for version .
+\end{abstract}
+\tableofcontents
+\section{Usage}
+The package |polyomino| can be used by putting the following in the preamble.
+\begin{codeexample}[code only]
+\usepackage{polyomino}
+\end{codeexample}
+The package |polyomino| loads the package |tikz|.
+\section{The command \textbackslash polyomino}
+\begin{command}{\polyomino\opt{\oarg{options}}\marg{polyomino specification}}
+This command can be placed inside a |tikzpicture| environment. The \meta{polyomino specification} is a token list. Spaces in this list are ignored. With the initial settings, a |,| starts a new row. Otherwise each element in this list corresponds to a cell. An element can consist of multiple characters by surrounding it with braces. The \meta{options} can be given with the keys described in Section \ref{Keys}.
+\begin{codeexample}[width=8cm]
+\pgfkeys{
+ /polyomino,
+ p={F}{style={blue,draw=black,ultra thick}},
+ p={I}{style={brown,draw=black,ultra thick}},
+ p={L}{style={cyan,draw=black,ultra thick}},
+ p={N}{style={gray,draw=black,ultra thick}},
+ p={P}{style={lime,draw=black,ultra thick}},
+ p={T}{style={magenta,draw=black,ultra thick}},
+ p={U}{style={olive,draw=black,ultra thick}},
+ p={V}{style={orange,draw=black,ultra thick}},
+ p={W}{style={pink,draw=black,ultra thick}},
+ p={X}{style={purple,draw=black,ultra thick}},
+ p={Y}{style={red,draw=black,ultra thick}},
+ p={Z}{style={teal,draw=black,ultra thick}}
+}
+\begin{tikzpicture}
+\polyomino[
+ grid
+]{
+ UUUVVV,
+ UXUZZV,
+ XXXFZV,
+ IXFFZZ,
+ ILLFFT,
+ ILNTTT,
+ ILNWWT,
+ ILNNWW,
+ PPPNYW,
+ PPYYYY
+}
+\end{tikzpicture}
+\end{codeexample}
+The algorithm constructs the border of each polyomino. It does not consider holes determined by empty cells. Although it does detect a cell inside a polyomino which has a different style. This is illustrated in the example below.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}[scale=0.8]
+\polyomino[
+ p={a}{style={gray,draw=black,thick}}
+]{
+ aaaaa,
+ a.a.a,
+ aaaaa
+}
+\polyomino[
+ at={(0,-4)},
+ p={a}{style={gray,draw=black,thick}},
+ p={*}{style={white,draw=black,thick}}
+]{
+ aaaaa,
+ a*a*a,
+ aaaaa
+}
+\end{tikzpicture}
+\end{codeexample}
+\end{command}
+\section{Keys}\label{Keys}
+The keys in this Section can be given as \meta{options} to the command |\polyomino|.
+
+There are two key families: |/polyomino| and |/polyomino/p_2|. The key family |/polyomino| is intended for usage in documents whereas |/polyomino/p_2| is not. In the key family |/polyomino|, also keys from the key family |/polyomino/p_2| will be looked up. The second argument from the key |p| only accepts keys from the key family |/polyomino/p_2|.
+\begin{key}{/polyomino/at=\marg{point} (initially (0,0))}
+This key defines the bottom left coordinate of the polyomino.
+\end{key}
+\begin{key}{/polyomino/p\_2/connected}
+This key sets the |pic| type (which is activated by the key |pic|) to false. This is the initial setting.
+\end{key}
+\begin{key}{/polyomino/p\_2/discrete}
+This key sets the |pic| type (which is activated by the key |pic|) to true.
+\end{key}
+\begin{key}{/polyomino/empty cell=\marg{token list} (initially .)}
+A cell corresponding to the \meta{token list} in the \meta{polyomino specification} will be left empty.
+
+A cell corresponding to the empty token list will always be left empty.
+\end{key}
+\begin{key}{/polyomino/grid=\opt{\meta{boolean}} (default true, initially false)}
+If true then a grid is drawn. The grid does not apply to borders of polyominoes. The style of this grid is determined by the key |grid style|. A grid does not apply to a cell with a |pic|.
+\end{key}
+\begin{stylekey}{/polyomino/grid style=\marg{options} (initially \normalfont empty)}
+This key determines the style of the grid.
+\begin{codeexample}[width=6.5cm]
+\begin{tikzpicture}[rotate=90]
+\polyomino[
+ grid,
+ grid style={gray,dash pattern=on 3mm off 4mm on 3mm off 0mm},
+ p={L}{style={darkgray,draw=black}},
+ p={P}{style={green,draw=black}},
+ p={T}{style={violet,draw=black}},
+ p={V}{style={yellow,draw=black}}
+]{
+ LTVVV,
+ LTTTV,
+ LTPPV,
+ LLPPP
+}
+\end{tikzpicture}
+\end{codeexample}
+\end{stylekey}
+\begin{stylekey}{/polyomino/p\_2/p=\marg{name}\marg{options} (initially \normalfont empty)}
+This key determines the style of the polyomino with \meta{name} in the \meta{polyomino specification}.
+
+The \meta{options} only accept keys from the key family |/polyomino/p_2|.
+
+In the example below, the polyominoes have the same shape but are differentiated by using different names.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\pgfkeys{
+ /polyomino,
+ p={a}{},
+ p={b}{},
+ style={fill=none,draw}
+}
+\def\example{
+ aa,
+ ab,
+ ab,
+ bb
+}
+\polyomino{\example}
+\polyomino[
+ at={(2,0)}
+]{\example}
+\end{tikzpicture}
+\end{codeexample}
+\end{stylekey}
+\begin{key}{/polyomino/p\_2/pic=\marg{code}}
+The \meta{code} defines the |pic| which is used for each cell of the polyomino.
+
+A grid does not apply to a cell with a |pic|.
+\begin{codeexample}[width=7cm]
+\begin{tikzpicture}
+\polyomino[
+ empty cell=*,
+ grid,
+ p={a}{style={red,draw=black}},
+ p={b}{style={blue,draw=black}},
+ p={c}{style={orange,draw=black}},
+ p={circle}{pic={\fill[green] (0,0) circle[radius=0.4];}},
+ row sep=;
+]{
+ {} * * b {} c ;
+ a a b b {circle} c ;
+ {circle} a a b c c
+}
+\end{tikzpicture}
+\end{codeexample}
+\begin{codeexample}[width=5cm]
+\begin{tikzpicture}
+\polyomino[
+ p={circle}{
+ pic={\path[pic actions] (0,0) circle[radius=0.45];},
+ style={right color=cyan,left color=red,draw,dashed}
+ },
+ p={L}{
+ pic={
+ \fill[yellow!80!black] (-0.5,-0.5) rectangle +(1,1);
+ \fill[yellow!50,rounded corners] (-0.4,-0.4) rectangle +(0.8,0.8);
+ }
+ },
+ p={square}{
+ pic={\path[pic actions] (-0.45,-0.45) rectangle +(0.9,0.9);},
+ style={fill=magenta,draw,rounded corners}
+ }
+]{
+ L {circle} {square} {square} ,
+ L {circle} {circle} {square} ,
+ L L {circle} {circle}
+}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/polyomino/row sep=\marg{token list} (initially ,)}
+The \meta{token list} in the \meta{polyomino specification} will start a new row.
+\end{key}
+\begin{stylekey}{/polyomino/p\_2/style=\marg{options} (initially \normalfont empty)}
+This key determines the style of the polyomino.
+\end{stylekey}
+\begin{thebibliography}{9}
+\bibitem{TtTaPGFp}
+Till Tantau,
+\emph{The \tikzname{} and {\upshape\pgfname} Packages},
+Manual for version 3.1.10,
+\url{https://ctan.org/pkg/pgf},
+2023.
+\end{thebibliography}
+\printindex
+\newgeometry{left=2.25cm,right=2.25cm,top=2.25cm,bottom=2.25cm}
+\pagestyle{plain}
+\appendix
+\begin{landscape}
+\section{The source code}\label{Thesourcecode}
+\dochighinput[language=latex/latex3]{polyomino.sty}
+\end{landscape}
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe71.pdf b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe71.pdf
index a95ad30ad7..af15730e34 100644
--- a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe71.pdf
+++ b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe71.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe71.tex b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe71.tex
index f29587bab9..e3073d3bac 100644
--- a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe71.tex
+++ b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe71.tex
@@ -15,4 +15,4 @@
\GrilleCCFSIO[Session=2025,Type={7-1},PoliceManuscrite={\poltuto}]{LOVELACE Ada}{21 mai 2024}{Quelques propriétés de la suite de Syracuse}
-\end{document}
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe72.pdf b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe72.pdf
index 7e7ca969ea..5995eee9c0 100644
--- a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe72.pdf
+++ b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe72.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe72.tex b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe72.tex
index 00af2e5e36..1c3fb34c96 100644
--- a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe72.tex
+++ b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe72.tex
@@ -16,4 +16,4 @@
\def\grccfcompetsyr{variables et types/listes et tableaux/tests et boucles/fonctions}
\GrilleCCFSIO[Session=2025,Type={7-2},PoliceManuscrite={\poltuto}]{LOVELACE Ada}{21 mai 2024}{Quelques propriétés de la suite de Syracuse}<\grccfcompetsyr>
-\end{document}
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe73.pdf b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe73.pdf
index b9c6d73803..efefc42595 100644
--- a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe73.pdf
+++ b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe73.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe73.tex b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe73.tex
index 24747750c8..188aeaad52 100644
--- a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe73.tex
+++ b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-annexe73.tex
@@ -16,4 +16,4 @@
\def\grccfcompetsyr{variables et types/listes et tableaux/tests et boucles/fonctions}
\GrilleCCFSIO[Session=2024,Type={7-3},PoliceManuscrite={\poltuto}]{LOVELACE Ada}{14 mai 2024}{Calculs booléens + Graphes + Chiffrements}
-\end{document}
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.pdf b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.pdf
index 265dc41596..6ce8f3e1b1 100644
--- a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.pdf
+++ b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.tex b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.tex
index 59ae3cd132..6c03b52cf2 100644
--- a/graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.tex
+++ b/graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.tex
@@ -5,8 +5,8 @@
\documentclass[french,a4paper,11pt]{article}
\usepackage[margin=2cm,includefoot]{geometry}
-\def\TPversion{0.2.8}
-\def\TPdate{18 mai 2024}
+\def\TPversion{0.3.0}
+\def\TPdate{3 février 2025}
%\usepackage[utf8]{inputenc}
%\usepackage[T1]{fontenc}
\usepackage{amsmath,amssymb}
@@ -142,7 +142,7 @@
\begin{center}
\begin{tabular}{c}
\texttt{Cédric Pierquet} ({\ttfamily c pierquet -- at -- outlook . fr})\\
- \texttt{\url{https://github.com/cpierquet/profsio}}
+ \texttt{\url{https://forge.apps.education.fr/pierquetcedric/packages-latex}}
\end{tabular}
\end{center}
@@ -256,6 +256,10 @@
\section{Historique}
+\verb|v0.3.0|~:~~~~Mise en conformité pour les grilles de CCF (E3)
+
+\verb|v0.2.9|~:~~~~Correction d'un bug dans les simplifications de Karnaugh
+
\verb|v0.2.8|~:~~~~Grilles d'évaluation des CCF
\verb|v0.2.7|~:~~~~Correction d'un bug dans les simplifications de Karnaugh
diff --git a/graphics/pgf/contrib/profsio/tex/ProfSio.sty b/graphics/pgf/contrib/profsio/tex/ProfSio.sty
index 3b70f9a1e3..71f6d62bf6 100644
--- a/graphics/pgf/contrib/profsio/tex/ProfSio.sty
+++ b/graphics/pgf/contrib/profsio/tex/ProfSio.sty
@@ -1,9 +1,11 @@
% Author : C. Pierquet
-% licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
+% licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
% : Luatruthtable from Chetan Shirore and Dr. Ajit Kumar https://ctan.org/pkg/luatruthtable
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{ProfSio}[2024/05/18 0.2.8 Pour les enseignants de Maths en BTS SIO]
+\ProvidesPackage{ProfSio}[2025/02/03 0.3.0 Pour les enseignants de Maths en BTS SIO]
+%0.3.0 Mise en conformité des grilles d'évaluation CCF
+%0.2.9 Correction d'un bug dans les simplifications de Karnaugh
%0.2.8 Ajout des grilles de CCF (E2)
%0.2.7 Correction d'un bug dans les simplifications de Karnaugh
%0.2.6 Corrections dans les simplifications de Karnaugh
@@ -39,7 +41,8 @@
\RequirePackage{calc}
\RequirePackage{nicematrix}
%------Librairies
-\usetikzlibrary{positioning,decorations.pathreplacing,decorations.markings,arrows,arrows.meta,calc,babel,shapes,shapes.geometric}
+\usetikzlibrary{positioning,decorations.pathreplacing,decorations.markings,arrows,arrows.meta,calc,shapes,shapes.geometric}
+\usetikzlibrary{babel}
%------Divers
\def\§{\mkern1.5mu\relax}
@@ -2041,32 +2044,32 @@ end
%calculs pour 1 lettre
\IfSubStr{\knghbintransf}{(AA)}{\xdef\knghbinres{\inteval{\knghbinres+11110000}}}{}%
\IfSubStr{\knghbintransf}{(BB)}{\xdef\knghbinres{\inteval{\knghbinres+11001100}}}{}%
- \IfSubStr{\knghbintransf}{(CC)}{\xdef\knghbinres{\inteval{\knghbinres+01100110}}}{}%
+ \IfSubStr{\knghbintransf}{(CC)}{\xdef\knghbinres{\inteval{\knghbinres+01100110}}}{}%version c intérieure !!
\IfSubStr{\knghbintransf}{(AA*)}{\xdef\knghbinres{\inteval{\knghbinres+00001111}}}{}%
\IfSubStr{\knghbintransf}{(BB*)}{\xdef\knghbinres{\inteval{\knghbinres+00110011}}}{}%
- \IfSubStr{\knghbintransf}{(CC*)}{\xdef\knghbinres{\inteval{\knghbinres+10011001}}}{}%
+ \IfSubStr{\knghbintransf}{(CC*)}{\xdef\knghbinres{\inteval{\knghbinres+10011001}}}{}%version bar(c) extérieure
%calculs pour 2 lettres
\IfSubStr{\knghbintransf}{(AABB)}{\xdef\knghbinres{\inteval{\knghbinres+11000000}}}{}%
- \IfSubStr{\knghbintransf}{(AACC*)}{\xdef\knghbinres{\inteval{\knghbinres+01100000}}}{}%
+ \IfSubStr{\knghbintransf}{(AACC*)}{\xdef\knghbinres{\inteval{\knghbinres+10010000}}}{}%=====!
\IfSubStr{\knghbintransf}{(AABB*)}{\xdef\knghbinres{\inteval{\knghbinres+00110000}}}{}%
\IfSubStr{\knghbintransf}{(AA*BB)}{\xdef\knghbinres{\inteval{\knghbinres+00001100}}}{}%
- \IfSubStr{\knghbintransf}{(AA*CC*)}{\xdef\knghbinres{\inteval{\knghbinres+00000110}}}{}%
+ \IfSubStr{\knghbintransf}{(AA*CC*)}{\xdef\knghbinres{\inteval{\knghbinres+00001001}}}{}%=====!
\IfSubStr{\knghbintransf}{(AA*BB*)}{\xdef\knghbinres{\inteval{\knghbinres+00000011}}}{}%
- \IfSubStr{\knghbintransf}{(AACC)}{\xdef\knghbinres{\inteval{\knghbinres+10010000}}}{}%
- \IfSubStr{\knghbintransf}{(AA*CC)}{\xdef\knghbinres{\inteval{\knghbinres+00001001}}}{}%
- \IfSubStr{\knghbintransf}{(BBCC)}{\xdef\knghbinres{\inteval{\knghbinres+10001000}}}{}%
- \IfSubStr{\knghbintransf}{(BBCC*)}{\xdef\knghbinres{\inteval{\knghbinres+01000100}}}{}%
- \IfSubStr{\knghbintransf}{(BB*CC*)}{\xdef\knghbinres{\inteval{\knghbinres+00100010}}}{}%
- \IfSubStr{\knghbintransf}{(BB*CC)}{\xdef\knghbinres{\inteval{\knghbinres+00010001}}}{}%
+ \IfSubStr{\knghbintransf}{(AACC)}{\xdef\knghbinres{\inteval{\knghbinres+01100000}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(AA*CC)}{\xdef\knghbinres{\inteval{\knghbinres+00000110}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(BBCC)}{\xdef\knghbinres{\inteval{\knghbinres+01000100}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(BBCC*)}{\xdef\knghbinres{\inteval{\knghbinres+10001000}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(BB*CC*)}{\xdef\knghbinres{\inteval{\knghbinres+00010001}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(BB*CC)}{\xdef\knghbinres{\inteval{\knghbinres+00100010}}}{}%=====!
%calculs pour 3 lettres
- \IfSubStr{\knghbintransf}{(AABBCC)}{\xdef\knghbinres{\inteval{\knghbinres+10000000}}}{}%
- \IfSubStr{\knghbintransf}{(AABBCC*)}{\xdef\knghbinres{\inteval{\knghbinres+01000000}}}{}%
- \IfSubStr{\knghbintransf}{(AABB*CC*)}{\xdef\knghbinres{\inteval{\knghbinres+00100000}}}{}%
- \IfSubStr{\knghbintransf}{(AABB*CC)}{\xdef\knghbinres{\inteval{\knghbinres+00010000}}}{}%
- \IfSubStr{\knghbintransf}{(AA*BBCC)}{\xdef\knghbinres{\inteval{\knghbinres+00001000}}}{}%
- \IfSubStr{\knghbintransf}{(AA*BBCC*)}{\xdef\knghbinres{\inteval{\knghbinres+00000100}}}{}%
- \IfSubStr{\knghbintransf}{(AA*BB*CC*)}{\xdef\knghbinres{\inteval{\knghbinres+00000010}}}{}%
- \IfSubStr{\knghbintransf}{(AA*BB*CC)}{\xdef\knghbinres{\inteval{\knghbinres+00000001}}}{}%
+ \IfSubStr{\knghbintransf}{(AABBCC)}{\xdef\knghbinres{\inteval{\knghbinres+01000000}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(AABBCC*)}{\xdef\knghbinres{\inteval{\knghbinres+10000000}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(AABB*CC*)}{\xdef\knghbinres{\inteval{\knghbinres+00010000}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(AABB*CC)}{\xdef\knghbinres{\inteval{\knghbinres+00100000}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(AA*BBCC)}{\xdef\knghbinres{\inteval{\knghbinres+00000100}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(AA*BBCC*)}{\xdef\knghbinres{\inteval{\knghbinres+00001000}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(AA*BB*CC*)}{\xdef\knghbinres{\inteval{\knghbinres+00000001}}}{}%=====!
+ \IfSubStr{\knghbintransf}{(AA*BB*CC)}{\xdef\knghbinres{\inteval{\knghbinres+00000010}}}{}%=====!
%on complète
\StrLen{\knghbinres}[\knghbinresnbchiffres]
\ifnum\knghbinresnbchiffres<8%
@@ -2867,7 +2870,7 @@ end
\hline
BTS SERVICES INFORMATIQUES AUX ORGANISATIONS\hfill{}SESSION {\grccfsioannee}\hspace*{1cm} \\
ANNEXE 7-1 : Document de préparation au déroulement de la situation 1 \\
- Épreuve E2 – Mathématiques pour l’informatique (CCF) \\
+ Épreuve E3 – Mathématiques pour l’informatique (CCF) \\
\hline
\end{tblr}
@@ -2921,7 +2924,7 @@ end
\hline
BTS SERVICES INFORMATIQUES AUX ORGANISATIONS\hfill{}SESSION {\grccfsioannee}\hspace*{1cm} \\
ANNEXE 7-2 : Grille d’aide à l’évaluation de la situation 1 (recto) \\
- Épreuve E2 – Mathématiques pour l’informatique (CCF) \\
+ Épreuve E3 – Mathématiques pour l’informatique (CCF) \\
\hline
\end{tblr}
@@ -2988,7 +2991,7 @@ end
\hline
BTS SERVICES INFORMATIQUES AUX ORGANISATIONS\hfill{}SESSION {\grccfsioannee}\hspace*{1cm} \\
ANNEXE 7-2 : Grille d’aide à l’évaluation de la situation 1 (verso) \\
- Épreuve E2 – Mathématiques pour l’informatique (CCF) \\
+ Épreuve E3 – Mathématiques pour l’informatique (CCF) \\
\hline
\end{tblr}
@@ -3035,7 +3038,7 @@ end
\hline
BTS SERVICES INFORMATIQUES AUX ORGANISATIONS\hfill{}SESSION {\grccfsioannee}\hspace*{1cm} \\
ANNEXE 7-3 : Grille d’aide à l’évaluation de la situation 2 (recto) \\
- Épreuve E2 – Mathématiques pour l’informatique (CCF) \\
+ Épreuve E3 – Mathématiques pour l’informatique (CCF) \\
\hline
\end{tblr}
@@ -3096,7 +3099,7 @@ end
\hline
BTS SERVICES INFORMATIQUES AUX ORGANISATIONS\hfill{}SESSION {\grccfsioannee}\hspace*{1cm} \\
ANNEXE 7-3 : Grille d’aide à l’évaluation de la situation 2 (verso) \\
- Épreuve E2 – Mathématiques pour l’informatique (CCF) \\
+ Épreuve E3 – Mathématiques pour l’informatique (CCF) \\
\hline
\end{tblr}
diff --git a/graphics/pgf/contrib/prooftrees/README b/graphics/pgf/contrib/prooftrees/README
deleted file mode 100644
index 687eddf510..0000000000
--- a/graphics/pgf/contrib/prooftrees/README
+++ /dev/null
@@ -1,39 +0,0 @@
-%% Copyright 2019 Clea F. Rees
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clea F. Rees.
-%
-% This work consists of all files listed in manifest.txt.
-
-This package supports drawing tableaux (proof trees) of the kind often used in
-introductory logic classes, especially those aimed at students without strong
-mathemtical backgrounds. Hodges (1991) is one example of a text which uses
-this system. When teaching such a system it is especially useful to annotate
-the tree with line numbers, justifications and explanations of branch
-closures.
-
-prooftrees provides a single environment, prooftree, and a variety of tools
-for annotating, customising and highlighting such trees. A cross-referencing
-system is provided for trees which cite line numbers in justifications for
-proof lines or branch closures.
-
-prooftrees is based on Forest and, hence, TikZ. The package requires version
-2.1+ of Forest for expected results and will not work with version 1.
-
-The author is certain that some of her beliefs are false, but sure that her
-belief that prooftrees has bugs is not among them.
-
-Clea F. Rees
-ReesC21 <at> cardiff <dot> ac <dot> uk
-2019/09/30
-
-vim: set nospell:
diff --git a/graphics/pgf/contrib/prooftrees/README.md b/graphics/pgf/contrib/prooftrees/README.md
new file mode 100644
index 0000000000..dced983574
--- /dev/null
+++ b/graphics/pgf/contrib/prooftrees/README.md
@@ -0,0 +1,66 @@
+$Id: README.md 10529 2024-10-25 21:19:36Z cfrees $
+
+# prooftrees
+
+A LaTeX package for drawing logical tableaux.
+
+## Licence
+
+Copyright 2016-2024 Clea F. Rees
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2008-05-04 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Clea F. Rees.
+
+This file may only be distributed together with a copy of the package
+prooftrees. You may however distribute the package prooftrees without
+such generated files.
+
+This work consists of all files listed in manifest.txt.
+
+## Features
+
+This package supports drawing tableaux (proof trees) of the kind often used in
+introductory logic classes, especially those aimed at students without strong
+mathemtical backgrounds. Hodges (1991) is one example of a text which uses
+this system. When teaching such a system it is especially useful to annotate
+the tree with line numbers, justifications and explanations of branch
+closures.
+
+prooftrees provides a single environment - either prooftree or tableau - and a
+variety of tools for annotating, customising and highlighting such trees. A
+cross-referencing system is provided for trees which cite line numbers in
+justifications for proof lines or branch closures.
+
+prooftrees is based on Forest and, hence, TikZ. The package requires version
+2.1+ of Forest for expected results and will not work with version 1.
+
+Version 0.9 adds out-of-the-box support for externalisation of tableaux using
+memoize.
+
+## Code Repositories
+
+Code for the package is hosted at
+ https://codeberg.org/cfr/prooftrees
+For convenience, the repository is mirrored at
+ https://github.com/cfr42/prooftrees
+
+## Contact Details
+
+Bug reports, feature requests etc. should be filed at
+ https://codeberg.org/cfr/prooftrees/issues
+
+
+Clea F. Rees
+Version 0.9
+2024-10-25
+
+vim: et:tw=80:
diff --git a/graphics/pgf/contrib/prooftrees/manifest.txt b/graphics/pgf/contrib/prooftrees/manifest.txt
index e6116e22a9..0890ae8ff5 100644
--- a/graphics/pgf/contrib/prooftrees/manifest.txt
+++ b/graphics/pgf/contrib/prooftrees/manifest.txt
@@ -1,6 +1,13 @@
-Copyright 2023 Clea F. Rees
+# Manifest for prooftrees
-This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 of this license or (at your option) any later version. The latest version of this license is in http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all distributions of LaTeX version 2005/12/01 or later.
+Copyright (C) 2016-2024 Clea F. Rees
+
+This work may be distributed and/or modified under the conditions of the LaTeX
+Project Public License, either version 1.3c of this license or (at your option)
+any later version. The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of LaTeX version
+2008-05-04 or later.
This work has the LPPL maintenance status `maintained'.
@@ -8,11 +15,40 @@ The Current Maintainer of this work is Clea F. Rees.
This work consists of all files listed in manifest.txt.
-prooftrees.sty
-prooftrees.tex
-prooftrees_biber.bib
-manifest.txt
-README
+This file was automatically generated by `l3build manifest`.
+
+## Source files
+
+
+### Package files
+
+
+* manifest.txt
+* README.md
+* prooftrees_biber.bib
+* prooftrees.sty
+* prooftrees.tex
+
+### Development files
+
+
+* build.lua
+* manifest.lua
+* tag.lua
+* config-mem.lua
+* prooftrees-memoize-t1.lvt
+* prooftrees-memoize-t1.tlg
+* prooftrees-conflicts-t1.lvt
+* prooftrees-egs.lvt
+* prooftrees-conflicts-t1.tlg
+* prooftrees-egs.luatex.tlg
+* prooftrees-egs.pdftex.tlg
+* prooftrees-egs.xetex.tlg
+
+
+## Derived files
+
+
+### Typeset documentation
-Derived files:
-prooftrees.pdf
+* prooftrees.pdf
diff --git a/graphics/pgf/contrib/prooftrees/prooftrees.pdf b/graphics/pgf/contrib/prooftrees/prooftrees.pdf
index 6535d91236..8aaabf2ef9 100644
--- a/graphics/pgf/contrib/prooftrees/prooftrees.pdf
+++ b/graphics/pgf/contrib/prooftrees/prooftrees.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/prooftrees/prooftrees.sty b/graphics/pgf/contrib/prooftrees/prooftrees.sty
index c28a6c9688..ea15ae2748 100644
--- a/graphics/pgf/contrib/prooftrees/prooftrees.sty
+++ b/graphics/pgf/contrib/prooftrees/prooftrees.sty
@@ -1,23 +1,26 @@
-%% Copyright 2020 Clea F. Rees
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clea F. Rees.
-%
-% This work consists of all files listed in manifest.txt.
+%% Copyright 2016-2024 Clea F. Rees
%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008-05-04 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Clea F. Rees.
+%%
+%% This file may only be distributed together with a copy of the package
+%% prooftrees.
+%%
+%% This work consists of all files listed in manifest.txt.
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{svn-prov}
-\ProvidesPackageSVN{$Id: prooftrees.sty 9103 2022-04-02 04:28:09Z cfrees $}[v0.8 \revinfo]
-\RequirePackage{etoolbox}
+\ProvidesPackageSVN{$Id: prooftrees.sty 10522 2024-10-23 16:31:08Z cfrees $}[v0.9 \revinfo]
% define \prooftrees@enw to hold the name of the environment
% default is to name the environment prooftree, this ensures backwards compatibility
\newcommand*\prooftrees@enw{prooftree}
@@ -27,7 +30,12 @@
\DeclareOption{tableau}{\renewcommand*\prooftrees@enw{tableau}}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{forest}}
% if \prooftree is not yet defined, set the name to prooftree; otherwise, use tableau to avoid conflict with bussproofs (which uses 'prooftree' rather than 'bussproof' as one might expect)
-\ifundef\prooftree{\renewcommand*\prooftrees@enw{prooftree}}{\renewcommand*\prooftrees@enw{tableau}}
+\ifcsname prooftree\endcsname
+ \renewcommand*\prooftrees@enw{tableau}%
+\else
+ \renewcommand*\prooftrees@enw{prooftree}%
+\fi
+% \ifundef\prooftree{\renewcommand*\prooftrees@enw{prooftree}}{\renewcommand*\prooftrees@enw{tableau}}
% let users override the default prooftree in case they need to load bussproofs later
\ProcessOptions
\RequirePackage{forest}[2016/12/04]
@@ -457,7 +465,7 @@
}{},
where={%
>{O _O< O &&}{grouped}{1}{level}{proof tree rhifo}%
- }{% this searches for certain kinds of structural asymmetry in the tree and attempts to move lines appropriately in such cases - the algorithm is intended to be relatively conservative (not in the sense of 'cautious' or 'safe' but in the sense of 'reflection of the overlapping consensus of reasonable users' / 'what would be rationally agreed behind the prooftrees veil of ignorance'; apologies for the inconvenience if you are an unreasonable user)
+ }{% this searches for certain kinds of structural asymmetry in the tree and attempts to move lines appropriately in such cases - the algorithm is intended to be relatively conservative (not in the sense of 'cautious' or 'safe' but in the sense of 'reflection of the overlapping consensus of reasonable users' / 'what would be rationally agreed behind the prooftrees veil of ignorance'; however, I should have realised I actually had 'the overlapping concensus of reasonable Beamer users' in mind rather than 'the overlapping consensus of reasonable users', so there is now an option to turn it off;apologies if this comment previously misclassified you as 'unreasonable'; apologies for the inconvenience if you are an unreasonable user)
not tempboola,
for root/.process={Ow1}{level}{%
for level={##1}{%
@@ -867,9 +875,9 @@
},
},
}
-\environbodyname\prooftreebody
+% \environbodyname\prooftreebody
\bracketset{action character=@}
-\NewEnviron{\prooftrees@enw}[1]{% \forest/\endforest from egreg's answer at http://tex.stackexchange.com/a/229608/
+\NewDocumentEnvironment{\prooftrees@enw}{ m +b }{% \forest/\endforest from egreg's answer at http://tex.stackexchange.com/a/229608/
\forest
(%
stages={% customised definition of stages - we don't use any custom stages, but we do use several custom keylists, where the processing order of these is critical
@@ -896,7 +904,26 @@
)%
proof tree,% apply the proof tree style, which sets keylists from both forest's defaults and our custom additions
#1,% insert user's preamble, empty or otherwise - this allows the user both to override our defaults (e.g. by setting a non-empty proof statement or a custom format for line numbers) and to customise the tree using forest's facilities in the usual way - BUT customisations of the latter kind may or may not be effective, may or may not have undesirable - not to say chaotic - consequences, and may or may not cause compilation failures (structural changes, in particular, should be avoided completely)
- [, name=proof statement @\prooftreebody]%
- \endforest}
+ [, name=proof statement @#2]%
+ \endforest
+}{}
+
+\ExplSyntaxOn
+\cs_new_protected_nopar:Npn \__prooftrees_memoize:n #1
+{
+ \mmzset{
+ auto = { #1 } { memoize },
+ }
+}
+\cs_generate_variant:Nn \__prooftrees_memoize:n { V }
+\hook_gput_code:nnn { begindocument / before } { . }
+{% paid â memoize bussproofs prooftree ...
+ \@ifpackageloaded{memoize}{
+ \__prooftrees_memoize:V \prooftrees@enw
+ }{}
+}
+\ExplSyntaxOff
+
\endinput
%% end prooftrees.sty
+
diff --git a/graphics/pgf/contrib/prooftrees/prooftrees.tex b/graphics/pgf/contrib/prooftrees/prooftrees.tex
index 0b479838f9..2f9250201f 100644
--- a/graphics/pgf/contrib/prooftrees/prooftrees.tex
+++ b/graphics/pgf/contrib/prooftrees/prooftrees.tex
@@ -1,26 +1,36 @@
-%% Copyright 2023 Clea F. Rees
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clea F. Rees.
-%
-% This work consists of all files listed in manifest.txt.
+\iffalse
+%% Copyright 2016-2024 Clea F. Rees
%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008-05-04 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Clea F. Rees.
+%%
+%% This file may only be distributed together with a copy of the package
+%% prooftrees.
+%%
+%% This work consists of all files listed in manifest.txt.
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% arara: pdflatex: { synctex: true, shell: false }
+% arara: biber
+% arara: makeindex
+% arara: pdflatex: { synctex: true, shell: false }
% arara: pdflatex: { synctex: true, shell: false }
% biber --output_format=bibtex --output_resolve prooftrees.bcf to generate .bib for upload
% sed -i '/1977/s/DATE/YEAR'
-%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\fi
\pdfminorversion=7
\RequirePackage{svn-prov}
-\ProvidesFileSVN{$Id: prooftrees.tex 9582 2023-06-18 01:00:05Z cfrees $}[v0.8 \revinfo]
+\ProvidesFileSVN{$Id: prooftrees.tex 10525 2024-10-24 06:31:34Z cfrees $}[v0.9 \revinfo]
\GetFileInfoSVN*
\let\prooftreesdocversion\fileversion
\let\prooftreesdocbase\filebase
@@ -28,8 +38,30 @@
\let\prooftreesdocdate\filedate
% BEGIN preamble
\documentclass[10pt,british,a4paper,doc2]{ltxdoc}
-\usepackage{babel,geometry,pageslts,fancyhdr,enumitem}
-\usepackage[utf8]{inputenc}
+\usepackage[extract=python]{memoize}
+\mmzset{%
+ prefix={memos/},
+ include context in ccmemo,
+ auto=\cref{multiref},
+ auto=\Cref{multiref},
+ auto=\labelcref{multiref},
+ auto=\cpageref{multiref},
+ auto=\labelcpageref{multiref},
+ auto=\namecref{ref},
+ auto=\nameCref{ref},
+ auto=\namecrefs{ref},
+ auto=\nameCrefs{ref},
+ auto=\lcnamecrefs{ref},
+ auto=\lcnamecrefs{ref},
+ auto=\crefrange{refrange},
+ auto=\cpagerefrange{refrange},
+ auto=\Cpagerefrange{refrange},
+ mkdir,
+}
+% \CodelineIndex
+% \RecordChanges
+% \EnableCrossrefs
+\usepackage{babel,geometry,fancyhdr,enumitem}
\usepackage{csquotes}
\MakeAutoQuote{‘}{’}
\MakeAutoQuote*{“}{â€}
@@ -41,7 +73,7 @@
\bibliography{prooftrees_biber.bib}% generate for upload (gweler uchod)
\usepackage{etoolbox,verbatim,parskip,changepage,titling,makeidx}
\usepackage[dvipsnames,svgnames,rgb,x11names]{xcolor}
-\usepackage{prooftrees}
+\usepackage[tableaux]{prooftrees}
\usepackage{mathtools,turnstile,pifont}
\newcommand*{\fycheck}{\text{\ding{52}}}
\newcommand*{\fycross}{\text{\ding{56}}}
@@ -60,7 +92,12 @@
},
}
\usepackage{tcolorbox}
-\tcbuselibrary{listings,xparse,breakable}% if you use skins, you need to disable externalisation for boxes which use the relevant options - gweler nodiadau/tex/tex.se/tcolorbox-coursepacket-exp.tex
+\tcbuselibrary{listingsutf8}% if you use skins, you need to disable externalisation for boxes which use the relevant options - gweler nodiadau/tex/tex.se/tcolorbox-coursepacket-exp.tex
+%%%%%%%%%%%%%%%%
+% Sašo Živanović: https://github.com/sasozivanovic/memoize/issues/31#issuecomment-2424700001
+\csappto{tcb@shield@@externalize}{\ifdefined\memoizefalse\memoizefalse\fi}
+\tcbset{shield externalize}
+%%%%%%%%%%%%%%%%
\usepackage[%
loadHyperref=true,
createIndexEntries=false,
@@ -83,7 +120,7 @@
\raggedleft\PrintDescribeMacro{#1}\par
\PrintLabelName[\macrolabelfont]{\macrolabelname}%
}%
- \expandafter\prooftrees@index{\macrolabelname}{\protect\verb \protect #1}\@esphack\ignorespaces}
+ \expandafter\prooftrees@index{\macrolabelname}{\protect\ttfamily\protect\string\protect#1}\@esphack\ignorespaces}
\renewcommand*\Describe@Env[1]{\endgroup
\marginpar{%
\raggedleft\PrintDescribeMacro{#1}\par
@@ -106,7 +143,7 @@
\renewcommand*\do[1]{\ifcyntafun ##1\else\\##1\fi\cyntafunfalse}%
\cyntafuntrue
\marginpar{%
- \raggedleft\PrintDescribeMacro{ % peid â dileu'r gwagle hwn!!
+ \raggedleft\PrintDescribeMacro{ % paid â dileu'r gwagle hwn!!
\expandafter\docsvlist{#2}%
}\par
\PrintLabelName[\macrolabelfont]{\csname #1labelname\endcsname}%
@@ -184,6 +221,16 @@
commentstyle=\color{doc@commentcolor},
frame=none,
}
+\lstdefinestyle{lstsrc}{%
+ style=lstDemoStyleLaTeXCode,
+ stringstyle=\color{doc@stringcolor},
+ keywordstyle=\color{doc@keywordcolor},
+ commentstyle=\color{doc@commentcolor},
+ texcsstyle=\color{doc@keywordcolor},
+ frame=none,
+ numbers=left,
+ moretexcs={forestset,linenumberstyle,ifcsname,ProcessOptions,DeclareOption,ProvidesPackageSVN,bracketset,NewDocumentEnvironment,ExplSyntaxOn,mmzset,ExplSyntaxOff,forest,prooftrees@enw,foresteregister,foresteoption,forestregister,forestoption,PackageError,PackageWarning,PassOptionsToPackage,CurrentOption,@ifpackageloaded,endforest,draw},
+}
\geometry{headheight=12pt,marginparwidth=45mm,hmarginratio=4:1,vscale=.8,hscale=.7,verbose}
\newlength\tewadjust
\setlength\tewadjust{\marginparwidth+\marginparsep-\paperwidth+\textwidth+\oddsidemargin+1in}
@@ -269,20 +316,83 @@
Version \prooftreesdocversion{} \prooftreesdocinfo
\end{center}%
}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ExplSyntaxOn
+% \NewDocumentCommand \ivals { +m }
+% {
+% {
+% \clist_if_empty:nF { #1 }
+% {
+% \normalfont
+% \itshape
+% < \clist_use:nn { #1 } { >\texttt{,} ~ < } >
+% }
+% }
+% }
+\keys_define:nn { prooftrees / doc }
+{
+ unknown .code:n = {
+ \cs_if_free:cT { \l_keys_key_str }
+ {
+ \tl_gset:cn { \l_keys_key_str } { #1 }
+ }
+ },
+}
+\NewDocumentCommand \prooftreesdocset { +m }
+{
+ \keys_set:nn { prooftrees / doc } { #1 }
+}
+\ExplSyntaxOff
+\prooftreesdocset{%
+ bug={\href{https://codeberg.org/cfr/prooftrees/issues}{\textsc{bugtracker}}},
+ codeberg={\href{https://codeberg.org/cfr/prooftrees}{\textsc{codeberg}}},
+ github={\href{https://github.com/cfr42/prooftrees}{\textsc{github}}},
+ ctan={\href{https://ctan.org/}{\textsc{ctan}}},
+}
+% \newcommand*{\lpack}[1]{\textsf{#1}}
+\title{\filebase}
+\author{Clea F. Rees\thanks{%
+ Bug tracker:
+ \href{https://codeberg.org/cfr/prooftrees/issues}{\url{codeberg.org/cfr/prooftrees/issues}}
+ \textbar{} Code:
+ \href{https://codeberg.org/cfr/prooftrees}{\url{codeberg.org/cfr/prooftrees}}
+ \textbar{} Mirror:
+ \href{https://github.com/cfr42/prooftrees}{\url{github.com/cfr42/prooftrees}}%
+}}
+% \date{\fileversion~\filedate}
+\date{\prooftreesdocdate}%
+\title{\prooftreesdocbase}%
+\ExplSyntaxOn
+\hook_gput_code:nnn {shipout/lastpage} {.}
+{
+ \property_record:nn {t:lastpage}{abspage,page,pagenum}
+}
+\cs_new_protected_nopar:Npn \lastpage
+{
+ \property_ref:nn {t:lastpage}{page}
+}
+% \NewDocumentCommand \plarg {+m} {{\ttfamily (\ivals{#1})}}
+\ExplSyntaxOff
+% \NewDocumentCommand \istable{m}{\texttt{= \{}\ivals{#1}\texttt{\}}\par\noindent}
+% \NewDocumentCommand \isstring{m}{\texttt{= ''}\meta{#1}\texttt{''}\par\noindent}
+% \definecolor{strawberry}{rgb}{1.000,0.000,0.502}
+% \definecolor{blueberry}{rgb}{0.000,0.000,1.000}
+% \definecolor{moss}{rgb}{0.000,0.502,0.251}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pagestyle{fancy}
\fancyhf{}
\fancyhf[lh]{\textit{\leftmark}}
\fancyhf[rh]{\textit{\rightmark}}
-\fancyhf[cf]{\textit{--- \thepage{} of \lastpageref*{LastPage} ---}}
+\fancyhf[cf]{\textit{--- \thepage{} of \lastpage{} ---}}
\fancypagestyle{fancyplain}{%
\fancyhf{}%
\fancyhf[lh]{\textit{\leftmark}}%
\renewcommand*\headrulewidth{0pt}%
- \fancyhf[cf]{\textit{--- \thepage{} of \lastpageref*{LastPage} ---}}}
+ \fancyhf[cf]{\textit{--- \thepage{} of \lastpage{} ---}}}
\fancypagestyle{plain}{%
\fancyhf{}%
\renewcommand*\headrulewidth{0pt}%
- \fancyhf[cf]{\textit{--- \thepage{} of \lastpageref*{LastPage} ---}}}
+ \fancyhf[cf]{\textit{--- \thepage{} of \lastpage{} ---}}}
\patchcmd{\sectionmark}{\MakeUppercase}{}{\typeout{sectionmark patched OK!}}{\typeout{sectionmark patch failed!}}
\patchcmd{\tableofcontents}{\MakeUppercase}{}{\typeout{sectionmark patched OK!}}{\typeout{sectionmark patch failed!}}
\patchcmd{\tableofcontents}{\MakeUppercase\contentsname}{}{\typeout{sectionmark patched OK!}}{\typeout{sectionmark patch failed!}}
@@ -297,9 +407,6 @@
% END preamble
\begin{document}
-\title{\prooftreesdocbase}%
-\author{Clea F. Rees\texorpdfstring{\thanks{reesc21 <at> cardiff <dot> ac <dot> uk}}{}}%
-\date{\prooftreesdocdate}%
\newgeometry{headheight=12pt,scale=.8,marginparwidth=0pt,marginparsep=0pt}%
\savegeometry{safonol}%
\setlength\tewadjust{\marginparwidth+\marginparsep}%
@@ -309,8 +416,9 @@
\bigskip
\begin{abstract}
- \noindent \keyname[pkg]{\pkg{prooftrees}} is a \LaTeXe{} package, based on \keyname[pkg]{\pkg{forest}}, designed to support the typesetting of proof trees in styles sometimes used in teaching introductory logic courses, especially those aimed at students without a strong background in mathematics.
+ \noindent \keyname[pkg]{\pkg{prooftrees}} is a \LaTeXe{} package, based on \keyname[pkg]{\pkg{forest}}, designed to support the typesetting of logical tableaux --- ‘proof trees’ or ‘truth trees’ --- in styles sometimes used in teaching introductory logic courses, especially those aimed at students without a strong background in mathematics.
One textbook which uses proofs of this kind is \textcite{hodges-logic}.
+ Like \pkg{forest}, \pkg{prooftrees} supports \keyname[pkg]{\pkg{memoize}} out-of-the-box.
\end{abstract}
\bigskip
@@ -318,7 +426,7 @@
\begin{adjustwidth}{-3em}{-5em}
\centering
\begin{minipage}[t]{.475\linewidth}
- \begin{prooftree}
+ \begin{tableau}
{
to prove={S \liff \lnot T, T \liff \lnot R \sststile{\mathcal{L}}{} S \liff R},
highlight format={text=WildStrawberry},
@@ -387,10 +495,10 @@
]
]
]
- \end{prooftree}%
+ \end{tableau}%
\end{minipage}\hfill
\begin{minipage}[t]{.525\linewidth}
- \begin{prooftree}
+ \begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \Rightarrow (x = y)) \cdot Px) \sststile{\mathcal{L}_1}{} (\exists x)(\forall y)(Py \Leftrightarrow (x = y))},
line no sep=.35em,
@@ -441,7 +549,7 @@
]
]
]
- \end{prooftree}%
+ \end{tableau}%
\end{minipage}%
\end{adjustwidth}
\end{figure}
@@ -512,7 +620,7 @@ The package supports a small number of options which can be configured to custom
The code for a \pkg{prooftrees} proof tree is shown in \cref{ptdefaults}, together with the output obtained using the default settings.
\begin{codcoeden}*[label=ptdefaults]{\pkg{prooftrees}: default settings}
-\begin{prooftree}
+\begin{tableau}
{
to prove={\{P \vee (Q \vee \lnot R), P \lif \lnot R, Q \lif \lnot R\} \sststile{}{} \lnot R}
}
@@ -528,7 +636,7 @@ The code for a \pkg{prooftrees} proof tree is shown in \cref{ptdefaults}, togeth
[\lnot Q, close={:!u,!c}]
[\lnot R, close={:not conc,!c}, just={$\lif$ Elim:last premise}]]
[\lnot R, close={:not conc,!c}, move by=1, just={$\vee$ Elim:!u}]]]]]]
-\end{prooftree}
+\end{tableau}
\end{codcoeden}
More extensive configuration can be achieved by utilising \pkg{forest} \autocite{saso-forest-manual} and/or \TikZ{} \autocite{tantau-tikz-pgf-manual} directly.
A sample of supported proof tree styles are shown in \cref{sample}.
@@ -537,7 +645,7 @@ The package is \emph{\bfseries not} intended for the typesetting of proof trees
\thispagestyle{plain}%
\begin{coeden}[label=sample, floatplacement={!bp}, grow to left by=3em, grow to right by=3em]{\pkg{prooftrees}: sample output}
\centering
- \begin{prooftree}
+ \begin{tableau}
{
to prove={\{ P \lor (Q \lor \lnot R), P \lif \lnot R, Q \lif \lnot R \} \sststile{}{} \lnot R},
line no sep=.35em,
@@ -566,9 +674,9 @@ The package is \emph{\bfseries not} intended for the typesetting of proof trees
]
]
]
- \end{prooftree}\hfill
+ \end{tableau}\hfill
{\renewcommand*\linenumberstyle[1]{#1)}%
- \begin{prooftree}
+ \begin{tableau}
{
close with={\ensuremath{\ast}},
just format={text=gray, font=\itshape},
@@ -602,9 +710,9 @@ The package is \emph{\bfseries not} intended for the typesetting of proof trees
]
]
]
- \end{prooftree}}
+ \end{tableau}}
- \begin{prooftree}
+ \begin{tableau}
{
not line numbering,
single branches,
@@ -636,8 +744,8 @@ The package is \emph{\bfseries not} intended for the typesetting of proof trees
]
]
]
- \end{prooftree}%
- \hfill\begin{prooftree}
+ \end{tableau}%
+ \hfill\begin{tableau}
{
to prove={\{ P \lor (Q \lor \lnot R), P \lif \lnot R, Q \lif \lnot R \} \therefore \lnot R},
close with={\ensuremath{\times}},
@@ -668,9 +776,9 @@ The package is \emph{\bfseries not} intended for the typesetting of proof trees
]
]
]
- \end{prooftree}
+ \end{tableau}
- \begin{prooftree}
+ \begin{tableau}
{
to prove={(\exists x)(Lx \lor Mx) \sststile{}{} (\exists x) Lx \lor (\exists x) Mx},
highlight format={text=blue!50!cyan},
@@ -695,8 +803,8 @@ The package is \emph{\bfseries not} intended for the typesetting of proof trees
]
]
]
- \end{prooftree}%
- \hfill\begin{prooftree}
+ \end{tableau}%
+ \hfill\begin{tableau}
{
for tree={%
plain content,
@@ -717,7 +825,7 @@ The package is \emph{\bfseries not} intended for the typesetting of proof trees
]
]
]
- \end{prooftree}
+ \end{tableau}
\end{coeden}
% END sec:raisondetre
@@ -730,7 +838,7 @@ The package is \emph{\bfseries not} intended for the typesetting of proof trees
\begin{itemize}
\item All derivation rules yield equal numbers of \wff{}s on all branches.
\begin{center}
- \begin{prooftree}
+ \begin{tableau}
{
not line numbering,
for tree={plain content},
@@ -740,7 +848,7 @@ The package is \emph{\bfseries not} intended for the typesetting of proof trees
[\wff[\wff[\wff]][\wff[\wff, label={[text=Green3]right:{\fycheck}}]]]
[\wff[\wff][\wff[\wff, label={[text=red]right:{\fycross}}]]]
[\wff[\wff[\wff]][\wff[\phantom{\wff}, label={[text=red]right:{\fycross}}]]]
- \end{prooftree}
+ \end{tableau}
\end{center}
If $\mathcal{L}$ fails to satisfy this condition, \pkg{prooftrees} is likely to violate the requirements of affected derivation rules by splitting branches ‘mid-inference’.
\item No derivation rule yields \wff{}s on more than two branches.
@@ -780,17 +888,17 @@ Suppose that we wish to typeset the proof tree for
and we would like to typeset the entailment established by our proof at the top of the tree.
Then we should begin like this:
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
-\end{prooftree}
+\end{tableau}
\end{latexcode}
That is all the preamble we want, so we move onto consider the \meta{tree specification}.
\pkg{forest} uses square brackets to specify trees' structures.
To typeset a proof, think of it as consisting of nested trees, trunks upwards, and work from the outside in and the trunks down (\cref{nythod}).
\begin{coeden}[label=nythod]{Nested structure of proof tree}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)},
just sep*=3,
@@ -900,7 +1008,7 @@ To typeset a proof, think of it as consisting of nested trees, trunks upwards, a
]
]
]
-\end{prooftree}
+\end{tableau}
\end{coeden}
Starting with the outermost tree \nyth*{} and the topmost trunk, we replace the \bocsnyth{} with square brackets and enter the first \wff{} inside, adding \verb|just=Pr.| for the justification on the right and \verb|checked=a| so that the line will be marked as discharged with $a$ substituted for $x$.
@@ -908,13 +1016,13 @@ We also use \pkg{forest}'s \keyname*[fopttoks]{name} to label the line for ease
(Technically, it is the node rather than the line which is named, but, for our purposes, this doesn't matter.
\pkg{forest} will create a name if we don't specify one, but it will not necessarily be one we would have chosen for ease of use!)
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
[{(\exists x)((\forall y)(Py \lif x = y) \land Px)}, checked=a, just=Pr., name=pr
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
We can refer to this line later as \verb|pr|.
@@ -923,7 +1031,7 @@ Its \bocsnyth{} goes inside that for \nyth[1], so the square brackets containing
Again, we add the justification with \keyname[foptautotoks]{just}, but we use \verb|subs=a| rather than \verb|checked=a| as we want to mark substitution of $a$ for $x$ without discharging the line.
Again, we use \keyname*[fopttoks]{name} so that we can refer to the line later as \verb|neg conc|.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -931,7 +1039,7 @@ Again, we use \keyname*[fopttoks]{name} so that we can refer to the line later a
[{\lnot (\exists x)(\forall y)(Py \liff x = y)}, subs=a, just=Conc.~neg., name=neg conc
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
Turning to tree \nyth*{}, we again note that its \bocsnyth{} is nested within the previous two, so the square brackets for its \wff{} need to be nested within those for the previous \wff{}s.
@@ -941,7 +1049,7 @@ This justification also refers to an earlier line in the proof.
We could write this as \verb|just=1 $\exists\elim$|, but instead we use the name we assigned earlier with the referencing feature provided by \pkg{prooftrees}.
To do this, we put the reference, \verb|pr| \emph{after} the rest of the justification, separating the two parts by a colon i.e.~\verb|$\exists\elim$:pr| and allow \pkg{prooftrees} to figure out the correct number.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -951,7 +1059,7 @@ To do this, we put the reference, \verb|pr| \emph{after} the rest of the justifi
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
Continuing in the same way, we surround each of the \wff{}s for \nyth*{}, \nyth*{}, \nyth*{} and \nyth*{} within square brackets nested within those surrounding the previous \wff{} since each of the trees is nested within the previous one.
@@ -961,7 +1069,7 @@ For example, in the next line we add, we specify the justification as \verb|just
\verb|!u| refers to the current line's parent line --- in this case, \verb|{(\forall y)(Py \lif a = y) \land Pa}, checked, just=$\exists\elim$:pr|.
\verb|!uu| refers to the current line's parent line's parent line and so on.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -979,14 +1087,14 @@ For example, in the next line we add, we specify the justification as \verb|just
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
Reaching \nyth*{}, things get a little more complex since we now have not one, but \emph{two} \bocsnyth{} nested within \nyth[7].
This means that we need \emph{two} sets of square brackets for \nyth{} --- one for each of its two trees.
Again, both of these should be nested within the square brackets for \nyth[7] but neither should be nested within the other because the trees for the two branches at \nyth{} are distinct.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1008,14 +1116,14 @@ Again, both of these should be nested within the square brackets for \nyth[7] bu
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
At this point, we need to work separately or in parallel on each of our two branches since each constitutes its own tree.
Turning to trees \nyth*{}, each needs to be nested within the relevant tree \nyth[8], since each \bocsnyth{} is nested within the applicable branch's tree.
Hence, we nest square brackets for each of the \wff{}s at \nyth{} within the previous set.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1041,7 +1149,7 @@ Hence, we nest square brackets for each of the \wff{}s at \nyth{} within the pre
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
We only have one tree \nyth*{} as there is no corresponding tree in the left-hand branch.
@@ -1054,7 +1162,7 @@ We can use \verb|close={8,10}| for this or we can use the same referencing syste
In either case, we again surrounding the argument with curly brackets to protect the comma.
\verb|!c| refers to the current line --- something useful in many close annotations, but not helpful in specifying non-circular justifications.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1082,13 +1190,13 @@ In either case, we again surrounding the argument with curly brackets to protect
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
This completes the main right-hand branch of the tree and we can focus solely on the remaining left-hand one.
Tree \nyth*{} is straightforward --- we just need to nest it within the left-hand tree \nyth[9].
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1118,14 +1226,14 @@ Tree \nyth*{} is straightforward --- we just need to nest it within the left-han
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
At this point, the main left-hand branch itself branches, so we have two trees \nyth*{}.
Treating this in the same way as the earlier branch at \nyth[8], we use two sets of square brackets nested within those for tree \nyth{}, but with neither nested within the other.
Since we also want to mark the leftmost branch as closed, we add \verb|close={:to Pb or not to Pb,!c}| in the same way as before.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1159,12 +1267,12 @@ Since we also want to mark the leftmost branch as closed, we add \verb|close={:t
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
We complete our initial specification by nesting \nyth*{} within the appropriate tree \nyth[12], again marking closure appropriately.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1200,12 +1308,12 @@ We complete our initial specification by nesting \nyth*{} within the appropriate
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
Compiling our code, we find that the line numbering is not quite right:
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1241,7 +1349,7 @@ Compiling our code, we find that the line numbering is not quite right:
]
]
]
-\end{prooftree}
+\end{tableau}
\pkg{prooftrees} warns us about this:
\begin{latexcode}
@@ -1258,7 +1366,7 @@ by
\end{latexcode}
giving us the following code:
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1294,11 +1402,11 @@ giving us the following code:
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
which produces our desired result:
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1334,7 +1442,7 @@ which produces our desired result:
]
]
]
-\end{prooftree}
+\end{tableau}
% END sec:ee
@@ -1393,7 +1501,7 @@ The following diagram provides an overview of the configuration and anatomy of a
Detailed documentation is provided in \cref{sec:ops} and \cref{sec:macros}.
\forestset{declare count register={cau},cau'=0}
-\begin{prooftree}
+\begin{tableau}
{
to prove={proof statement},
for tree={%
@@ -1472,7 +1580,7 @@ Detailed documentation is provided in \cref{sec:ops} and \cref{sec:macros}.
\end{scope}
}
[[[[][]]]][[[[[]][[[]]]][[]]]]]]]
-\end{prooftree}
+\end{tableau}
% END sec:anatomy
@@ -1916,6 +2024,54 @@ For example, if for some reason you would like bold line numbers, try
% END sec:macros
+\section{Memoization}\label{sec:memoize}
+% BEGIN sec:memoize
+
+Tableaux created by \pkg{prooftrees} cannot, in general, be externalised with \TikZ's \keyname[pkg]{\pkg{external}} library.
+Since \keyname[pkg]{\pkg{pgf}}/\TikZ{}, in general, and \pkg{prooftrees}, in particular, can be rather slow to compile, this is a serious issue.
+If you only have a two or three small tableaux, the compilation time will be negligible.
+But if you have large, complex proofs or many smaller ones, compilation time will quickly become excessive.
+
+Version 0.9 does not cure the disease, but it does offer an extremely effective remedy for the condition.
+While it does not make \pkg{prooftrees} any faster, it supports the \keyname[pkg]{\pkg{memoize}} package developed by \pkg{forest}'s author, Sašo Živanović \autocite*{saso-memoize-manual}.
+Memoization is faster, more secure, more robust and easier to use than \TikZ's externalisation.
+\begin{description}
+ \item[It is faster.] It does not require separate compilations for each memoized object, so it is comparatively fast even when memoizing.
+ \item[It is more secure.] It requires only restricted shell-escape, which almost all \TeX{} installations enable by default, so it is considerably more secure and can be utilised even where shell-escape is disabled.
+ \item[It is more robust.] It can successfully memoize code which defeats all ordinary mortals' attempts to externalize with the older \TikZ{} library.
+ \item[It is easier to use.] It requires less configuration and less intervention.
+ For example, it detects problematic code and aborts memoization automatically in many cases in which \TikZ's \pkg{external} would either cause a compilation error or silently produce nonsense output, forcing the user to manually disable the process for relevant code.
+\end{description}
+
+There is always a ‘but’, but this is a pretty small ‘but’ as ‘but’s go.
+\begin{description}
+ \item[But installation requires slightly more work.] To reap the full benefits, you want to use either the \texttt{perl} or the \texttt{python} ‘extraction’ method.
+ There is a third method, which does not require any special installation, but this lacks several of the advantages explained above and is not recommended.
+
+ If you use \TeX{} Live, you have \texttt{perl} already, but you may need to install a couple of libraries.
+ \texttt{python} is not a prerequisite for \TeX{} Live but, if you happen to have it installed, you will probably only need an additional library to use this method.
+
+ See \citetitle{saso-memoize-manual} \autocite{saso-memoize-manual} for further details.
+\end{description}
+
+Once you have the prerequisites setup, all you need do is load \pkg{memoize} \emph{before} \pkg{prooftrees}.
+
+\begin{latexcode}
+\usepackage[extraction method=perl]{memoize}% or python
+\usepackage{prooftrees}
+\end{latexcode}
+
+After a single compilation, your document will have expanded to include extra pages.
+At this point, it will look pretty weird.
+After the next compilation, your document will return to its normal self, the only difference being the speed with which it does so as all your memoized tableaux will simply be included, as opposed to recompiled.
+Only when you alter the code for a tableau, delete the generated files, disable memoization or explicitly request it will the proof be recompiled.
+
+Memoization is compatible with both \pkg{prooftrees}'s cross-referencing system and \LaTeXe's cross-references, but the latter require an additional compilation.
+In general, if a document element takes $n$ compilations to stabilise, it will take $n+1$ compilations to complete the memoization process.
+See \citetitle{saso-memoize-manual} \autocite{saso-memoize-manual} for details.
+
+% END sec:memoize
+
\section{Compatibility}\label{sec:compat}
% BEGIN sec:compat
@@ -1933,6 +2089,13 @@ This allows you to use \env{tableau} for \pkg{prooftrees} trees and \env{prooftr
\section{Version History}\label{sec:hanes}
% BEGIN sec:hanes
+\subsection{0.9}\label{subsec:0.9}
+% BEGIN subsec:0.9
+Add support for \pkg{memoize} and utilise for documentation.
+
+Use \cs{NewDocumentEnvironment}, removing direct dependency on \pkg{environ}.
+% END subsec:0.9
+
\subsection{0.8}
Add previously unnoticed dependency on \pkg{amstext}.
Attempt to fix straying closure symbols evident in documentation and a \TeX\ SE question\footnote{\url{https://tex.stackexchange.com/q/619314/}.}
@@ -1948,7 +2111,7 @@ See \cref{subsec:go}.
The main point of this option is to allow automatic moves to be switched off if one teaches students to first apply all available non-branching rules for the tableau as a whole, as opposed to all non-branching rules for the sub-tree.
The automatic algorithm is consistent with the latter, but not former, approach.
The algorithm favours compact trees, which are more likely to fit on \pkg{beamer} slides.
-Switching the algorithm off permits users to specify exactly how things should or should not be move.
+Switching the algorithm off permits users to specify exactly how things should or should not be moved.
Thanks to Peter Smith for prompting this.
Fix bug reported at \href{https://tex.stackexchange.com/q/479263/39222}{tex.stackexchange.com/q/479263/39222}.
@@ -2001,10 +2164,25 @@ First CTAN release.
% END sec:hanes
\printbibliography
-\clearpage
\loadgeometry{safonol}%
\fancyheadoffset[lh]{0pt}%
+
\printindex
+
+\onecolumn
+\appendix
+
+\section{Implementation}\label{sec:imp}
+
+{%
+ % \makeatletter
+ % \def\@xobeysp{\leavevmode\penalty100\ }%
+ % \makeatother
+ % \verbatiminput{prooftrees.sty}%
+}
+\lstinputlisting[style=lstsrc,numbers=left,inputencoding=utf8/latin1]{prooftrees.sty}
+
+
\end{document}
diff --git a/graphics/pgf/contrib/prooftrees/prooftrees_biber.bib b/graphics/pgf/contrib/prooftrees/prooftrees_biber.bib
index 021c9d1cfd..0a3ab30332 100644
--- a/graphics/pgf/contrib/prooftrees/prooftrees_biber.bib
+++ b/graphics/pgf/contrib/prooftrees/prooftrees_biber.bib
@@ -31,3 +31,12 @@
TITLE = {Forest: A {PGF}/Ti\mkbibemph{k}{Z}-Based Package for Drawing Linguistic Trees},
}
+@MANUAL{saso-memoize-manual,
+ AUTHOR = ZIVANOVIC-SASO,
+ URL = {https://www.ctan.org/pkg/memoize},
+ DATE = {2023-10-10},
+ EDITION = {1.0.0},
+ KEYWORDS = {TeX,LaTeX,PGF,TikZ,Forest,Memoize},
+ TITLE = {Memoize},
+}
+
diff --git a/graphics/pgf/contrib/sankey/README b/graphics/pgf/contrib/sankey/README
index aa0a7f627a..576bac9aaa 100644
--- a/graphics/pgf/contrib/sankey/README
+++ b/graphics/pgf/contrib/sankey/README
@@ -10,7 +10,7 @@ the flow rate.
license
=======
-Copyright (C) 2016-2021 by Paul Gaborit
+Copyright (C) 2016-2025 by Paul Gaborit
This file may be distributed and/or modified
diff --git a/graphics/pgf/contrib/sankey/sankey.dtx b/graphics/pgf/contrib/sankey/sankey.dtx
index 0338d1f761..c8de03c5f2 100644
--- a/graphics/pgf/contrib/sankey/sankey.dtx
+++ b/graphics/pgf/contrib/sankey/sankey.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2016, 2021 by Paul Gaborit
+% Copyright (C) 2016-2025 by Paul Gaborit
% -----------------------------------
%
% This work may be distributed and/or modified under the conditions of
@@ -30,6 +30,7 @@
%
%<*driver>
\documentclass[a4paper,10pt,draft]{ltxdoc}
+\SetupDoc{reportchangedates}
\usepackage{sankey-doc-preamble}
\EnableCrossrefs
\CodelineIndex
@@ -40,26 +41,6 @@
%</driver>
% \fi
%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-%
-% \CheckSum{1718}
-%
-%
% \GetFileInfo{\jobname.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment}
@@ -68,6 +49,7 @@
% \DoNotIndex{\def,\edef,\gdef,\xdef,\ifx,\else,\string,\relax}
% \DoNotIndex{\csname,\endcsname,\ifcsdef,\expandafter,\ifnumgreater}
% \DoNotIndex{\NewDocumentCommand,\NewDocumentEnvironment,\IfBooleanTF}
+% \DoNotIndex{\NewCommandCopy,\NewExpandableDocumentCommand}
% \DoNotIndex{\NeedsTeXFormat,\ProvidesPackage,\RequirePackage,\PackageError,\PackageWarning}
% \DoNotIndex{\newtoggle,\toggletrue,\togglefalse,\iftoggle,\ifdefempty,\ifundef,\ifdefstrequal}
% \DoNotIndex{\ifbool,\ifdef,\ifnumequal,\colorlet,\fpeval,\inteval,\newbool}
@@ -104,10 +86,11 @@
% pdfauthor=Paul Gaborit,
% }
%
+% \def\ttintitle#1{\textmd{\textcolor{red!50!black}{\texttt{#1}}}}
%
%
% \begin{abstract}
-% The \texttt{sankey} package provides macros and environments to
+% The \code{sankey} package provides macros and environments to
% build \emph{Sankey
% diagrams}\footnote{\url{https://en.wikipedia.org/wiki/Sankey_diagram}},
% i.e. \emph{flow diagrams} in which the width of the arrows is
@@ -119,6 +102,11 @@
%
% \end{abstract}
%
+%
+% \manualparts
+%
+% \clearpage
+%
% \manualparts
%
% \begin{quote}
@@ -131,11 +119,17 @@
% \label{usermanual}
%^^A % ------------------------------------------------------------
%
+% \changes{v3.0.2}{2025/10/10}{Update for new version of \protect\code{ltxdoc} class}
+%
+% \changes{v3.0.2}{2025/10/10}{Fixed extra parentheses in some code examples}
+%
% {
% \setlength{\parskip}{0pt}
% \localtableofcontents
% }
%
+% \clearpage
+%
%^^A % ------------------------------------------------------------
% \section{Preamble}
%^^A % ------------------------------------------------------------
@@ -149,13 +143,13 @@
% {\small Note: the
% \code{sankey} package requires automatically the
% \code{xparse}, \code{etoolbox}, \code{xfp} and
-% \code{tikz} packages, and the \code{calc},
+% \code{tikz} packages, as well as the \code{calc},
% \code{decorations.markings} and
% \code{dubins} (cf. \vref{sec:dubins}) TikZ libraries.\par}
%
%
%^^A % ------------------------------------------------------------
-% \section{The \texttt{sankeydiagram} environment}
+% \section{The \ttintitle{sankeydiagram} environment}
%^^A % ------------------------------------------------------------
%
% \DescribeEnv{sankeydiagram} %
@@ -175,35 +169,41 @@
%^^A % ------------------------------------------------------------
%
% The \code{sankey} package uses \code{pgfkeys} to set options via
-% \emph{key=value} pairs with default path \texttt{/sankey} (and
-% \texttt{/sankey/node parameters} for Sankey node parameters).
+% \emph{key=value} pairs with default path \code{/sankey} (and
+% \code{/sankey/node parameters} for Sankey node parameters).
+%
%
-% The options can be defined via the optional argument of the
-% \code{sankeydiagram} environment:
+% Options can be defined in three ways:
%
+% \begin{itemize}
+% \item via the optional argument of the
+% \code{sankeydiagram} environment:
+%
% \begin{lstlisting}[style=LaTeXsmall]
% \begin{sankeydiagram}[debug=true]
% \sankeynode{name=a,quantity=1,angle=0,at={0,0}}
% \end{sankeydiagram}
% \end{lstlisting}
-%
-% \DescribeMacro{\sankeyset} %
-% The options can also be modified via the \code{\sankeyset} macro:
-%
+%
+% \item \DescribeMacro{\sankeyset} %
+% via the \code{\sankeyset} macro:
+%
% \begin{lstlisting}[style=LaTeXsmall]
% \begin{sankeydiagram}
% \sankeyset{debug=true}
% \sankeynode{name=a,quantity=1,angle=0,at={0,0}}
% \end{sankeydiagram}
% \end{lstlisting}
-%
-% The options can be temporarily modified for a single macro:
+%
+% \item temporarily modified for a single macro:
% \begin{lstlisting}[style=LaTeXsmall]
% \begin{sankeydiagram}
% \sankeynode[debug=true]{name=a,quantity=1,angle=0,at={0,0}}
% \end{sankeydiagram}
% \end{lstlisting}
-%
+%
+% \end{itemize}
+%
% At the begining of each Sankey diagram, all options are initialized
% with initial values then the \code{every diagram} style is applied.
%
@@ -340,9 +340,9 @@
%^^A % ------------------------------------------------------------
%
% \begin{miniblock}
+% \DescribeMacro{\sankeynode} %
% \MACRO\code{\sankeynode}\OPTARG{\VAR{options}}\ARG{\VAR{node parameters}}
%
-% \DescribeMacro{\sankeynode} %
% The \code{\sankeynode} macro defines a Sankey node. The \VAR{options}
% can be any Sankey diagram keys. To define a Sankey node, you must
% provide a \emph{name}, a \emph{quantity} and an \emph{angle} as
@@ -363,8 +363,8 @@
% \end{sankeyoption}
%
% \begin{sankeyoption}[/sankey/node parameters]{at}{\VAR{at}}{}{0,0}
-% The position of the new Sankey node (a TikZ coordinate \emph{without}
-% round brackets or parentheses).
+% The position of the new Sankey node (a TikZ coordinate
+% \textbf{without} round brackets or parentheses).
% \end{sankeyoption}
%
% \begin{sankeyoption}[/sankey/node parameters]{anchor}{\VAR{anchor}}{}{center}
@@ -392,8 +392,7 @@
% \begin{sankeydiagram}[debug]
% \sankeynode{name=a,quantity=10}
% \sankeynode{name=b,quantity=5,angle=45,at={2,1},anchor=left}
-% \sankeynode{name=c,quantity=20,angle=-90,at={5,1},anchor=right}
-%
+% \sankeynode{name=c,quantity=20,angle=-90,at={5,0},anchor=right}
% \foreach \nodename/\pos in {a/left,b/below left,c/above}{
% \foreach \ancname in {left,center,right}{
% \node[node font=\ttfamily\footnotesize,\pos=1mm of \nodename.\ancname,
@@ -410,6 +409,9 @@
% %
% \lstinputlisting[style=LaTeXsmall]{\samplecodename}
% \end{miniblock}
+%
+%^^A % \clearpage
+%
%^^A % ------------------------------------------------------------
% \subsubsection{Choose default parameters}
%^^A % ------------------------------------------------------------
@@ -424,9 +426,9 @@
%^^A % ------------------------------------------------------------
%
% \begin{miniblock}
+% \DescribeMacro{\sankeynodestart} %
% \MACRO\code{\sankeynodestart}\OPTARG{\VAR{options}}\ARG{\VAR{node parameters}}
%
-% \DescribeMacro{\sankeynodestart} %
% The \code{\sankeynodestart} creates and fills/draws a starting Sankey
% node:
%
@@ -449,10 +451,10 @@
%
%
% \begin{miniblock}
+% \DescribeMacro{\sankeynodeend} %
% \MACRO\code{\sankeynodeend}\OPTARG{\VAR{options}}\ARG{\VAR{node
% parameters}}
%
-% \DescribeMacro{\sankeynodeend} %
% The \code{\sankeynodeend} creates and fills/draws an ending Sankey
% node:
%
@@ -547,21 +549,21 @@
% \subsection{Retrieve information from Sankey nodes}
%^^A % ------------------------------------------------------------
%
+% \DescribeMacro{\sankeygetnodeqty} %
% \MACRO\code{\sankeygetnodeqty}\ARG{\VAR{node name}}
%
-% \DescribeMacro{\sankeygetnodeqty} %
% The expandable command \code{\sankeygetnodeqty} returns the quantity
% assigned to the Sankey node named \VAR{node name}.
%
+% \DescribeMacro{\sankeyqtytolen} %
% \MACRO\code{\sankeyqtytolen}\ARG{\VAR{quantity}}
%
-% \DescribeMacro{\sankeyqtytolen} %
% The expandable \code{\sankeyqtytolen} macro converts \VAR{quantity} to
% graphical length using the current ratio.
%
+% \DescribeMacro{\sankeygetnodeorient} %
% \MACRO\code{\sankeygetnodeorient}\ARG{\VAR{node name}}
%
-% \DescribeMacro{\sankeygetnodeorient} %
% The expandable command \code{\sankeygetnodeorient} returns the angle
% (orientation) assigned to the Sankey node named \VAR{node name}.
%
@@ -658,13 +660,14 @@
%
%
% \begin{miniblock}
+% \DescribeMacro{\sankeyadvance} %
% \MACRO\code{\sankeyadvance}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{distance}}
%
-% \DescribeMacro{\sankeyadvance} The \code{\sankeyadvance} moves the
-% sankey node straight ahead and fills/draws this portion of the
-% sankey path. A positive \VAR{distance} moves forward while a
-% negative \VAR{distance} moves backward.
+% The \code{\sankeyadvance} moves the sankey node straight ahead and
+% fills/draws this portion of the sankey path. A positive
+% \VAR{distance} moves forward while a negative \VAR{distance} moves
+% backward.
%
% \begin{VerbatimOut}[gobble=2]{\samplecodename}
% \begin{tikzpicture}
@@ -677,6 +680,7 @@
% \sankeyadvance{b}{1cm}
% \sankeynodestart{name=c,quantity=10,angle=-90,at={5,1},anchor=right}
% \sankeyadvance{c}{5mm}
+% \fill[cyan] (0,0) circle(2pt) (2,1) circle(2pt) (5,1) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -689,11 +693,9 @@
% \begin{miniblock}
% \MACRO\code{\sankeyadvance*}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{distance}}
-%
-% \DescribeMacro{\sankeyadvance*} The \code{\sankeyadvance*} moves
-% the sankey node straight back and fills/draws this portion of the
-% sankey path. A positive \VAR{distance} moves backward while a
-% negative \VAR{distance} moves forward.
+%
+% The
+% \code{\sankeyadvance*} moves the sankey node straight back and fills/draws this portion of the sankey path. A positive \VAR{distance} moves backward while a negative \VAR{distance} moves forward.
%
% \begin{VerbatimOut}[gobble=2]{\samplecodename}
% \begin{tikzpicture}
@@ -706,6 +708,7 @@
% \sankeyadvance*{b}{1cm}
% \sankeynodeend{name=c,quantity=10,angle=-90,at={5,1},anchor=right}
% \sankeyadvance*{c}{5mm}
+% \fill[cyan] (0,0) circle(2pt) (2,1) circle(2pt) (5,1) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -720,10 +723,11 @@
%^^A % ------------------------------------------------------------
%
%\begin{miniblock}
+% \DescribeMacro{\sankeyturn} %
% \MACRO\code{\sankeyturn}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{angle}}
%
-% \DescribeMacro{\sankeyturn} The \code{\sankeyturn} macro moves the
+% The \code{\sankeyturn} macro moves the
% sankey node by turning to one side or the other and fills/draws
% this portion of the sankey path. A \emph{positive} \VAR{angle}
% turns left while a \emph{negative} \VAR{angle} turns right.
@@ -739,6 +743,7 @@
% \sankeyturn[minimum radius=1cm]{b}{-45}
% \sankeynodestart{name=c,quantity=10,angle=-90,at={5,1},anchor=right}
% \sankeyturn{c}{180}
+% \fill[cyan] (0,0) circle(2pt) (2,1) circle(2pt) (5,1) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -752,7 +757,7 @@
% \MACRO\code{\sankeyturn*}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{angle}}
%
-% \DescribeMacro{\sankeyturn*} The \code{\sankeyturn*} macro moves the
+% The \code{\sankeyturn*} macro moves the
% sankey node backward by turning right or left and fills/draws this
% portion of the sankey path. A \emph{positive} \VAR{angle} turns left
% while a \emph{negative} \VAR{angle} turns right.
@@ -768,6 +773,7 @@
% \sankeyturn*[minimum radius=1cm]{b}{-45}
% \sankeynodeend{name=c,quantity=10,angle=-90,at={3,1},anchor=right}
% \sankeyturn*{c}{180}
+% \fill[cyan] (0,0) circle(2pt) (2,1) circle(2pt) (3,1) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -782,13 +788,14 @@
%^^A % ------------------------------------------------------------
%
% \begin{miniblock}
+% \DescribeMacro{\sankeyturnleft} %
% \MACRO\code{\sankeyturnleft}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{angle}}
%
-% \DescribeMacro{\sankeyturnleft} The
-% \code{\sankeyturnleft} macro moves the sankey node by turning left
-% and fills/draws this portion of the sankey path. A \emph{positive}
-% \VAR{angle} turns forward while a \emph{negative} \VAR{angle} turns backward.
+% The \code{\sankeyturnleft} macro moves the sankey node by turning
+% left and fills/draws this portion of the sankey path. A
+% \emph{positive} \VAR{angle} turns forward while a \emph{negative}
+% \VAR{angle} turns backward.
%
% \begin{VerbatimOut}[gobble=2]{\samplecodename}
% \begin{tikzpicture}
@@ -801,6 +808,7 @@
% \sankeyset{fill/.style={fill=lime!20}}
% \sankeynodeend{name=b,quantity=5,angle=-135,at={1,2},anchor=left}
% \sankeyturnleft[minimum radius=1cm]{b}{-225}
+% \fill[cyan] (0,0) circle(2pt) (1,2) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -814,7 +822,7 @@
% \MACRO\code{\sankeyturnleft*}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{angle}}
%
-% \DescribeMacro{\sankeyturnleft*} The
+% The
% \code{\sankeyturnleft*} macro moves the sankey node backward
% by turning left and fills/draws this portion of the sankey path.
% A \emph{positive} \VAR{angle} turns backward while a
@@ -831,6 +839,7 @@
% \sankeyset{fill/.style={fill=lime!20}}
% \sankeynodestart{name=b,quantity=5,angle=-135,at={1,2},anchor=left}
% \sankeyturnleft*[minimum radius=.75cm]{b}{-225}
+% \fill[cyan] (0,0) circle(2pt) (1,2) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -841,13 +850,13 @@
% \end{miniblock}
%
% \begin{miniblock}
+% \DescribeMacro{\sankeyturnleftbackward} %
% \MACRO\code{\sankeyturnleftbackward}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{angle}}
%
-% \DescribeMacro{\sankeyturnleftbackward} The
-% \code{\sankeyturnleftbackward} macro moves the sankey node backward
-% by turning left and fills/draws this portion of the sankey path.
-% A \emph{positive} \VAR{angle} turns backward while a
+% The \code{\sankeyturnleftbackward} macro moves the sankey node
+% backward by turning left and fills/draws this portion of the sankey
+% path. A \emph{positive} \VAR{angle} turns backward while a
% \emph{negative} \VAR{angle} turns forward.
%
% \begin{VerbatimOut}[gobble=2]{\samplecodename}
@@ -861,6 +870,7 @@
% \sankeyset{fill/.style={fill=lime!20}}
% \sankeynodestart{name=b,quantity=5,angle=-135,at={1,2},anchor=left}
% \sankeyturnleftbackward[minimum radius=.75cm]{b}{-225}
+% \fill[cyan] (0,0) circle(2pt) (1,2) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -874,7 +884,7 @@
% \MACRO\code{\sankeyturnleftbackward*}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{angle}}
%
-% \DescribeMacro{\sankeyturnleftbackward*} The
+% The
% \code{\sankeyturnleftbackward*} macro moves the sankey node by turning left
% and fills/draws this portion of the sankey path. A \emph{positive}
% \VAR{angle} turns forward while a \emph{negative} \VAR{angle} turns backward.
@@ -890,6 +900,7 @@
% \sankeyset{fill/.style={fill=lime!20}}
% \sankeynodeend{name=b,quantity=5,angle=-135,at={1,2},anchor=left}
% \sankeyturnleftbackward*[minimum radius=1cm]{b}{-225}
+% \fill[cyan] (0,0) circle(2pt) (1,2) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -905,13 +916,14 @@
%^^A % ------------------------------------------------------------
%
% \begin{miniblock}
+% \DescribeMacro{\sankeyturnright} %
% \MACRO\code{\sankeyturnright}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{angle}}
%
-% \DescribeMacro{\sankeyturnright} The \code{\sankeyturnright} macro
-% moves the sankey node by turning right and fills/draws this portion
-% of the sankey path. A \emph{positive} \VAR{angle} turns forward
-% while a \emph{negative} \VAR{angle} turns backward.
+% The \code{\sankeyturnright} macro moves the sankey node by turning
+% right and fills/draws this portion of the sankey path. A
+% \emph{positive} \VAR{angle} turns forward while a \emph{negative}
+% \VAR{angle} turns backward.
%
% \begin{VerbatimOut}[gobble=2]{\samplecodename}
% \begin{tikzpicture}
@@ -924,6 +936,7 @@
% \sankeyset{fill/.style={fill=lime!20}}
% \sankeynodeend{name=b,quantity=5,angle=45,at={2,1},anchor=left}
% \sankeyturnright[minimum radius=.75cm]{b}{-225}
+% \fill[cyan] (0,0) circle(2pt) (2,1) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -937,7 +950,7 @@
% \MACRO\code{\sankeyturnright*}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{angle}}
%
-% \DescribeMacro{\sankeyturnright*} The \code{\sankeyturnright*} macro
+% The \code{\sankeyturnright*} macro
% moves the sankey node backward by turning right and fills/draws
% this portion of the sankey path. A \emph{positive} \VAR{angle} turns
% backward while a \emph{negative} \VAR{angle} turns forward.
@@ -953,6 +966,7 @@
% \sankeyset{fill/.style={fill=lime!20}}
% \sankeynodestart{name=b,quantity=5,angle=45,at={1,1},anchor=left}
% \sankeyturnright*[minimum radius=.75cm]{b}{-225}
+% \fill[cyan] (0,0) circle(2pt) (1,1) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -963,10 +977,10 @@
% \end{miniblock}
%
% \begin{miniblock}
+% \DescribeMacro{\sankeyturnrightbackward} %
% \MACRO\code{\sankeyturnrightbackward}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{angle}}
%
-% \DescribeMacro{\sankeyturnrightbackward}
% The \code{\sankeyturnrightbackward} macro
% moves the sankey node backward by turning right and fills/draws
% this portion of the sankey path. A \emph{positive} \VAR{angle} turns
@@ -983,6 +997,7 @@
% \sankeyset{fill/.style={fill=lime!20}}
% \sankeynodestart{name=b,quantity=5,angle=45,at={1,1},anchor=left}
% \sankeyturnrightbackward[minimum radius=.75cm]{b}{-225}
+% \fill[cyan] (0,0) circle(2pt) (1,1) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -996,7 +1011,7 @@
% \MACRO\code{\sankeyturnrightbackward*}\OPTARG{\VAR{options}}\ARG{\VAR{node
% name}}\ARG{\VAR{angle}}
%
-% \DescribeMacro{\sankeyturnrightbackward*} The
+% The
% \code{\sankeyturnrightbackward*} macro moves the sankey
% node forward by turning right and fills/draws this portion
% of the sankey path. A \emph{positive} \VAR{angle} turns forward
@@ -1013,6 +1028,7 @@
% \sankeyset{fill/.style={fill=lime!20}}
% \sankeynodeend{name=b,quantity=5,angle=45,at={2,1},anchor=left}
% \sankeyturnrightbackward*[minimum radius=.75cm]{b}{-225}
+% \fill[cyan] (0,0) circle(2pt) (2,1) circle(2pt);
% \end{sankeydiagram}
% \end{tikzpicture}
% \end{VerbatimOut}
@@ -1035,31 +1051,36 @@
% node to \code{A} node!
%
% \begin{miniblock}
+% \DescribeMacro{\sankeyoutin} %
% \MACRO\code{\sankeyoutin}\OPTARG{\VAR{options}}\ARG{\VAR{node
% A}}\ARG{\VAR{node B}}
%
-% \DescribeMacro{\sankeyoutin} The \code{\sankeyoutin} macro
+% The \code{\sankeyoutin} macro
% fills/draws a lane from \VAR{node A} to \VAR{node B} using a
% Bézier curve with regular steps (10 steps by default) to
% simulate constant width lane.
%
-% The constant width and the minimum curvature are \emph{not} guaranteed!
+% \textbf{Note:} The constant width and the minimum curvature are
+% \emph{not} guaranteed!
% \end{miniblock}
%
% \begin{miniblock}
+% \DescribeMacro{\sankeydubins} %
% \MACRO\code{\sankeydubins}\OPTARG{\VAR{options}}\ARG{\VAR{node
% A}}\ARG{\VAR{node B}}
%
-% \DescribeMacro{\sankeydubins} %
% The \code{\sankeydubins} macro fills/draws a lane between
% \VAR{node A} and \VAR{node B} using a Dubins
% path\footnote{\url{https://en.wikipedia.org/wiki/Dubins_path}}.
%
-% The constant width and the minimum curvature are guaranteed.
+% \textbf{Note:} The constant width and the minimum curvature are
+% guaranteed.
% \end{miniblock}
%
+% \clearpage
+%
%^^A % ------------------------------------------------------------
-% \subsubsection{Comparison between \texttt{outin} and \texttt{dubins}
+% \subsubsection{Comparison between \ttintitle{outin} and \ttintitle{dubins}
% paths}
%^^A % ------------------------------------------------------------
%
@@ -1083,7 +1104,7 @@
%
% \sankeyset{fill/.style={fill=lime!40}}
% \sankeynodestart{name=a,at={4,0},quantity=5}
-% \sankeynodeend{name=b,at={(8,3},quantity=5}
+% \sankeynodeend{name=b,at={8,3},quantity=5}
% \sankeydubins[minimum radius=5mm]{a}{b}
% \end{sankeydiagram}
% \end{tikzpicture}
@@ -1110,7 +1131,7 @@
%
% \sankeyset{fill/.style={fill=lime!40}}
% \sankeynodestart{name=a,at={4,0},quantity=5}
-% \sankeynodeend{name=b,at={(6,3},quantity=5}
+% \sankeynodeend{name=b,at={6,3},quantity=5}
% \sankeydubins[minimum radius=5mm]{a}{b}
% \end{sankeydiagram}
% \end{tikzpicture}
@@ -1137,7 +1158,7 @@
%
% \sankeyset{fill/.style={fill=lime!40}}
% \sankeynodestart{name=a,at={4,0},quantity=5}
-% \sankeynodeend{name=b,at={(4,3},quantity=5}
+% \sankeynodeend{name=b,at={4,3},quantity=5}
% \sankeydubins[minimum radius=5mm]{a}{b}
% \end{sankeydiagram}
% \end{tikzpicture}
@@ -1149,7 +1170,7 @@
% \end{miniblock}
%
%^^A % ------------------------------------------------------------
-% \subsubsection{Examples of \texttt{dubins} paths}
+% \subsubsection{Examples of \ttintitle{dubins} paths}
%^^A % ------------------------------------------------------------
%
% \begin{miniblock}
@@ -1195,13 +1216,13 @@
%^^A % ------------------------------------------------------------
%
% \begin{miniblock}
-% \MACRO\code{\sankeystart}\OPTARG{\VAR{options}}\ARG{\VAR{name}}
-%
-% \DescribeMacro{\sankeystart} %
-% The \code{\sankeystart} fills/draws a starting extremity attached to
-% the preexisting Sankey node \VAR{name}:
-%
-%
+% \DescribeMacro{\sankeystart} %
+% \MACRO\code{\sankeystart}\OPTARG{\VAR{options}}\ARG{\VAR{name}}
+%
+% The \code{\sankeystart} fills/draws a starting extremity attached to
+% the preexisting Sankey node \VAR{name}:
+%
+%
% \begin{VerbatimOut}[gobble=2]{\samplecodename}
% \begin{tikzpicture}
% \begin{sankeydiagram}
@@ -1224,9 +1245,9 @@
%
%
% \begin{miniblock}
+% \DescribeMacro{\sankeyend} %
% \MACRO\code{\sankeyend}\OPTARG{\VAR{options}}\ARG{\VAR{name}}
%
-% \DescribeMacro{\sankeyend} %
% The \code{\sankeyend} fills/draws an ending extremity attached to
% the preexisting Sankey node \VAR{name}:
%
@@ -1257,7 +1278,7 @@
% \subsubsection{Create and fork a Sankey node}
%^^A % ------------------------------------------------------------
%
-% \changes{v3.0}{2021/03/14}{add keys to fork a Sankey node during its
+% \changes{v3.0}{2021/03/14}{Add keys to fork a Sankey node during its
% creation}
%
% \begin{miniblock}
@@ -1314,9 +1335,9 @@
% \subsubsection{Fork a Sankey node}
%^^A % ------------------------------------------------------------
% \begin{miniblock}
+% \DescribeMacro{\sankeyfork} %
% \MACRO\code{\sankeyfork}\OPTARG{\VAR{options}}\ARG{\VAR{name}}\ARG{\VAR{quantity/name pairs}}
%
-% \DescribeMacro{\sankeyfork} %
% The \code{\sankeyfork} macro splits the preexisting Sankey node
% named \VAR{name} in a list of new Sankey subnodes. The
% \VAR{quantity/name pairs} is a comma separated list of
@@ -1344,7 +1365,7 @@
%^^A % ------------------------------------------------------------
%
%^^A % ------------------------------------------------------------
-% \subsection{The \texttt{debug} layer}
+% \subsection{The \ttintitle{debug} layer}
%^^A % ------------------------------------------------------------
%
% The options \code{debug} key uses the \code{sankeydebug} layer to draw
@@ -1378,7 +1399,7 @@
% \end{lstlisting}
%
%^^A % ------------------------------------------------------------
-% \subsection{The \texttt{dubins} TikZ library}
+% \subsection{The \ttintitle{dubins} TikZ library}
% \label{sec:dubins}
%^^A % ------------------------------------------------------------
%
@@ -1390,9 +1411,9 @@
% \subsection{How to duplicate a Sankey node}
%^^A % ------------------------------------------------------------
%
+% \DescribeMacro{\sankeynodealias} %
% \MACRO\code{\sankeynodealias}\ARG{\VAR{origname}}\ARG{\VAR{clonename}}
%
-% \DescribeMacro{\sankeynodealias} %
% The \code{\sankeynodealias} macro clones the Sankey node named
% \VAR{origname} into the Sankey node named \VAR{clonename}.
%
@@ -1727,7 +1748,7 @@
% \section{Example from question on TeX.se}
%^^A % ------------------------------------------------------------
%
-% \changes{v3.0}{2021/03/14}{fix bad names in second example}
+% \changes{v3.0}{2021/03/14}{Fix bad names in second example}
%
% \embedfile[mimetype=text/plain]{sankey-example2.tex}
%
@@ -1946,7 +1967,7 @@
% \section{Reproduction of an example from Google Charts documentation}
%^^A % ------------------------------------------------------------
%
-% \changes{v3.0}{2021/03/14}{add the reproduction of an example from
+% \changes{v3.0}{2021/03/14}{Add the reproduction of an example from
% Google Charts documentation}
%
% \embedfile[mimetype=text/plain]{sankey-example3.tex}
@@ -2313,7 +2334,7 @@
% for Adyen's second half 2018 report to shareholders. It is coded here
% with her kind permission.
%
-% You can change the data values between lines 28 and 53.
+% You can change the data values between lines 27 and 52.
%
% See figure~\vref{fig:nice-example}. The \code{sankey-example4.tex}
% file contains the following code and is an attachement of the current
@@ -2585,13 +2606,13 @@
% }
%
%
-% \changes{v3.0.1}{2022/02/04}{fix options used by the new version of siunitx}
+% \changes{v3.0.1}{2022/02/04}{Fix options used by the new version of \protect\code{siunitx} package}
%
%^^A % ------------------------------------------------------------
-% \section{Compiling \texttt{sankey}}
+% \section{Compiling \ttintitle{sankey}}
%^^A % ------------------------------------------------------------
%
-% \changes{v3.0.1}{2022/02/04}{instructions for compiling and installing the
+% \changes{v3.0.1}{2022/02/04}{Add instructions for compiling and installing the
% package}
%
% To produce the \code{sankey} package:
@@ -2618,15 +2639,15 @@
%
%
%^^A % ------------------------------------------------------------
-% \section{The \texttt{sankey.sty} file}
+% \section{The \ttintitle{sankey.sty} file}
%^^A % ------------------------------------------------------------
%
% Poorly commented source code...
%
-% \changes{v1.0}{2016/03/06}{first version}
-% \changes{v2.0}{2021/01/27}{first public version (on \CTAN)}
-% \changes{v3.0}{2021/03/14}{better naming rule}
-% \changes{v3.0}{2021/03/14}{use .ins and .dtx files}
+% \changes{v1.0}{2016/03/06}{First version}
+% \changes{v2.0}{2021/01/27}{First public version (on \CTAN)}
+% \changes{v3.0}{2021/03/14}{Better naming rule}
+% \changes{v3.0}{2021/03/14}{Use \protect\code{.ins} and \protect\code{.dtx} files}
%
% \iffalse
%<*sankey>
@@ -2636,7 +2657,7 @@
%
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[2015/10/01]
-\ProvidesPackage{sankey}[2022/02/04 v3.0.1 to draw Sankey diagrams]
+\ProvidesPackage{sankey}[2025/01/10 v3.0.2 to draw Sankey diagrams]
% \end{macrocode}
%
% All required packages and TikZ libraries:
@@ -2700,7 +2721,7 @@
%
%^^A % ------------------------------------------------------------
% \subsubsection{Definition of \emph{global} and \emph{expanded} fields (using
-% \texttt{\protect\string\xdef})}
+% \ttintitle{\protect\string\xdef})}
%^^A % ------------------------------------------------------------
%
% \begin{macro}{\snk@setnodeqty}
@@ -2728,7 +2749,7 @@
% \end{macro}
%
%^^A % ------------------------------------------------------------
-% \subsubsection{Definitions of \emph{local} fields (using \texttt{\protect\string\def})}
+% \subsubsection{Definitions of \emph{local} fields (using \ttintitle{\protect\string\def})}
%^^A % ------------------------------------------------------------
%
% \begin{macro}{\snk@setstartfill}
@@ -2795,7 +2816,7 @@
% \end{macro}
%
%^^A % ------------------------------------------------------------
-% \subsection{The \texttt{sankey node} shape}
+% \subsection{The \ttintitle{sankey node} shape}
%^^A % ------------------------------------------------------------
%
%
@@ -3191,21 +3212,6 @@
},
}
% \end{macrocode}
-%
-%^^A % ------------------------------------------------------------
-% \subsection{The \texttt{sankeydiagram} environment}
-% ^^A % ------------------------------------------------------------
-%
-% \begin{environment}{sankeydiagram}
-%
-% The \code{sankeydiagram} environment defines locally all the macros
-% used by a Sankey diagram. Then it applies the %
-% \code{@initial options} and \code{every diagram} styles (in this
-% order) and applies all the keys provided in its optional argument.
-%
-% \begin{macrocode}
-\NewDocumentEnvironment{sankeydiagram}{O{}}{
-% \end{macrocode}
%
%^^A % ------------------------------------------------------------
% \subsection{Internal macros}
@@ -3217,10 +3223,10 @@
% node\footnote{Thanks to Andrew Stacey \url{https://tex.stackexchange.com/a/33765/14500}}.
%
% \begin{macrocode}
- \def\snk@getpos##1##2{%
- \tikz@scan@one@point\pgfutil@firstofone(##2)\relax%
- \edef##1{\the\pgf@x,\the\pgf@y}%
- }
+\def\snk@getpos#1#2{%
+ \tikz@scan@one@point\pgfutil@firstofone(#2)\relax%
+ \edef#1{\the\pgf@x,\the\pgf@y}%
+}
% \end{macrocode}
% \end{macro}
%
@@ -3229,7 +3235,7 @@
% The \code{\snk@modulo} macro evaluates \#1 modulo \#2 using \code{\fpeval}.
%
% \begin{macrocode}
- \def\snk@modulo##1##2{\fpeval{##1-(floor((##1)/(##2),0)*##2)}}
+\def\snk@modulo#1#2{\fpeval{#1-(floor((#1)/(#2),0)*#2)}}
% \end{macrocode}
% \end{macro}
%
@@ -3239,9 +3245,9 @@
% $-180$ and $180$ (using \code{\fpeval}).
%
% \begin{macrocode}
- \def\snk@normalize@angle##1{%
- \fpeval{\snk@modulo{(##1)+180}{360}-180}%
- }
+\def\snk@normalize@angle#1{%
+ \fpeval{\snk@modulo{(#1)+180}{360}-180}%
+}
% \end{macrocode}
% \end{macro}
%
@@ -3254,22 +3260,22 @@
% \code{/sankey/debug normal} and \code{/sankey/debug label} Tikz styles.
%
% \begin{macrocode}
- \def\snk@show@debug##1{% node name
- \iftoggle{sankey debug}{
- \begingroup
- \edef\name{##1}
- \edef\qty{\sankeygetnodeqty{\name}}
- \edef\orient{\sankeygetnodeorient{\name}}
- \begin{pgfonlayer}{sankeydebug}
- \path[/sankey/debug line] (\name.left) -- (\name.right);
- \pgfmathsetmacro{\snk@len}{\sankeyqtytolen{\qty}/3}
- \path[/sankey/debug normal] (\name.center)
- -- ($(\name.center)!\snk@len pt!90:(\name.right)$)
- node[/sankey/debug label,rotate=\orient+90+\snk@rotate,anchor=north];
- \end{pgfonlayer}
- \endgroup
- }{}
- }
+\def\snk@show@debug#1{% node name
+ \iftoggle{sankey debug}{
+ \begingroup
+ \edef\name{#1}
+ \edef\qty{\sankeygetnodeqty{\name}}
+ \edef\orient{\sankeygetnodeorient{\name}}
+ \begin{pgfonlayer}{sankeydebug}
+ \path[/sankey/debug line] (\name.left) -- (\name.right);
+ \pgfmathsetmacro{\snk@len}{\sankeyqtytolen{\qty}/3}
+ \path[/sankey/debug normal] (\name.center)
+ -- ($(\name.center)!\snk@len pt!90:(\name.right)$)
+ node[/sankey/debug label,rotate=\orient+90+\snk@rotate,anchor=north];
+ \end{pgfonlayer}
+ \endgroup
+ }{}
+}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\snk@makeforkednode}
@@ -3281,47 +3287,47 @@
% The \code{\snk@makeforkednode} forks a Sankey node.
%
% \begin{macrocode}
- \def\snk@makeforkednode{
- \begingroup
- \ifdefempty{\snk@listofforks}{
- \ifdefempty{\snk@forkanchor}{}{
- \PackageWarning{sankey}%
- {Can't use 'fork anchor' key without 'forked' key}
- }
- }{
- \def\snk@tot{0}
- \def\snk@added@values{}
- \sankeyset{
- @add forked node/.code args={####1/####2}{
- \coordinate (####2) at ($(\name.left)%
- !\fpeval{(\snk@tot+.5*(####1))/\qty}%
- !(\name.right)$);
- \edef\snk@orient{\orient}
- \sankeynode[debug=false]
- {name=####2,quantity=####1,at=####2,angle=\snk@orient}
- \edef\snk@tot{\fpeval{\snk@tot+####1}}
- \edef\snk@added@values{\snk@added@values+####1}
- },
- @add forked node/.list/.expand once=\snk@listofforks,
- }
- \edef\snk@diff{\fpeval{abs(\qty-\snk@tot)}}
- \ifnumequal{\snk@diff}{0}{}{
- \PackageWarning{sankey}%
- {^^J*** Warning: bad sankey fork: %
- \qty\space!=\space\snk@added@values(=\snk@tot)%
- ^^J\snk@listofforks}
- }
- \ifdefempty{\snk@forkanchor}{
- \edef\snk@forkanchor{\name.\snk@anchor}
- }{}
- \snk@getpos\snk@c{$(\snk@forkanchor) - (\pos)$}
- \sankeynode{as=\name,at={$(\name) - (\snk@c)$}}
- \foreach \snk@subnodeqty/\snk@subnodename in \snk@listofforks {
- \sankeynode{as=\snk@subnodename,at={$(\snk@subnodename) - (\snk@c)$}}
- }
+\def\snk@makeforkednode{
+ \begingroup
+ \ifdefempty{\snk@listofforks}{
+ \ifdefempty{\snk@forkanchor}{}{
+ \PackageWarning{sankey}%
+ {Can't use 'fork anchor' key without 'forked' key}
+ }
+ }{
+ \def\snk@tot{0}
+ \def\snk@added@values{}
+ \sankeyset{
+ @add forked node/.code args={##1/##2}{
+ \coordinate (##2) at ($(\name.left)%
+ !\fpeval{(\snk@tot+.5*(##1))/\qty}%
+ !(\name.right)$);
+ \edef\snk@orient{\orient}
+ \sankeynode[debug=false]
+ {name=##2,quantity=##1,at=##2,angle=\snk@orient}
+ \edef\snk@tot{\fpeval{\snk@tot+##1}}
+ \edef\snk@added@values{\snk@added@values+##1}
+ },
+ @add forked node/.list/.expand once=\snk@listofforks,
+ }
+ \edef\snk@diff{\fpeval{abs(\qty-\snk@tot)}}
+ \ifnumequal{\snk@diff}{0}{}{
+ \PackageWarning{sankey}%
+ {^^J*** Warning: bad sankey fork: %
+ \qty\space!=\space\snk@added@values(=\snk@tot)%
+ ^^J\snk@listofforks}
+ }
+ \ifdefempty{\snk@forkanchor}{
+ \edef\snk@forkanchor{\name.\snk@anchor}
+ }{}
+ \snk@getpos\snk@c{$(\snk@forkanchor) - (\pos)$}
+ \sankeynode{as=\name,at={$(\name) - (\snk@c)$}}
+ \foreach \snk@subnodeqty/\snk@subnodename in \snk@listofforks {
+ \sankeynode{as=\snk@subnodename,at={$(\snk@subnodename) - (\snk@c)$}}
}
- \endgroup
}
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3337,15 +3343,15 @@
% by default) at \code{\pos} position.
%
% \begin{macrocode}
- \def\snk@makenode{
- \begingroup
- \snk@setnodeqty{\name}{\qty}
- \edef\orient{\snk@normalize@angle{\orient}}
- \snk@setnodeorient{\name}{\orient}
- \ifundef{\snk@anchor}{\def\snk@anchor{center}}{}
- \node[/sankey/@sankey node={\name}{\pos}{\snk@anchor}];
- \endgroup
- }
+\def\snk@makenode{
+ \begingroup
+ \snk@setnodeqty{\name}{\qty}
+ \edef\orient{\snk@normalize@angle{\orient}}
+ \snk@setnodeorient{\name}{\orient}
+ \ifundef{\snk@anchor}{\def\snk@anchor{center}}{}
+ \node[/sankey/@sankey node={\name}{\pos}{\snk@anchor}];
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
%
@@ -3358,12 +3364,12 @@
% the Sankey node named \code{\name}.
%
% \begin{macrocode}
- \def\snk@filldrawstart{
- \begin{scope}[shift={(\name)},rotate=\orient]
- \path[/sankey/fill] \snk@getstartfill{\snk@startstyle};
- \path[/sankey/draw] \snk@getstartdraw{\snk@startstyle};
- \end{scope}
- }
+\def\snk@filldrawstart{
+ \begin{scope}[shift={(\name)},rotate=\orient]
+ \path[/sankey/fill] \snk@getstartfill{\snk@startstyle};
+ \path[/sankey/draw] \snk@getstartdraw{\snk@startstyle};
+ \end{scope}
+}
% \end{macrocode}
% \end{macro}
%
@@ -3376,12 +3382,12 @@
% the Sankey node named \code{\name}.
%
% \begin{macrocode}
- \def\snk@filldrawend{
- \begin{scope}[shift={(\name)},rotate=\sankeygetnodeorient{\name}]
- \path[/sankey/fill] \snk@getendfill{\snk@endstyle};
- \path[/sankey/draw] \snk@getenddraw{\snk@endstyle};
- \end{scope}
- }
+\def\snk@filldrawend{
+ \begin{scope}[shift={(\name)},rotate=\sankeygetnodeorient{\name}]
+ \path[/sankey/fill] \snk@getendfill{\snk@endstyle};
+ \path[/sankey/draw] \snk@getenddraw{\snk@endstyle};
+ \end{scope}
+}
% \end{macrocode}
% \end{macro}
%
@@ -3394,19 +3400,19 @@
% of the macro which requested the verification).
%
% \begin{macrocode}
- \def\snk@checkquantities##1##2##3{
- \begingroup
- \edef\snk@qtyi{\sankeygetnodeqty{##1}}
- \edef\snk@qtyii{\sankeygetnodeqty{##2}}
- \ifdefstrequal{\snk@qtyi}{\snk@qtyii}{}{
- \PackageError{sankey}%
- {^^J*** \string##3: quantities differ between %
- ##1 (\snk@qtyi) and ##2 (\snk@qtyii)%
- ^^J}%
- {The quantities of the two Sankey nodes must be equal.}
- }
- \endgroup
+\def\snk@checkquantities#1#2#3{
+ \begingroup
+ \edef\snk@qtyi{\sankeygetnodeqty{#1}}
+ \edef\snk@qtyii{\sankeygetnodeqty{#2}}
+ \ifdefstrequal{\snk@qtyi}{\snk@qtyii}{}{
+ \PackageError{sankey}%
+ {^^J*** \string#3: quantities differ between %
+ #1 (\snk@qtyi) and #2 (\snk@qtyii)%
+ ^^J}%
+ {The quantities of the two Sankey nodes must be equal.}
}
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3416,76 +3422,80 @@
% \subsection{User macros}
%^^A % ------------------------------------------------------------
%
-% \begin{macro}{\sankeydubins}
-%
-% The \code{\sankeydubins} macro links two Sankey nodes via
-% a Dubins path. First, it computes the Dubins path between
-% centers (left and right radii are the same) and stores the
-% result in \code{sankey}. Then it uses the stored result
-% to fill and draw the lane (left border and right borders
-% use Dubins paths with asymmetric radii).
-%
+% The user macros are globally defined as internal (with \code{snk@}
+% prefix) and locally defined in the \code{sankeydiagram} environment as
+% user macros (without the \code{snk@} prefix).
+%
+% \begin{macro}{\snk@sankeydubins}
+%
+% The \code{\snk@sankeydubins} macro links two Sankey nodes via a
+% Dubins path. First, it computes the Dubins path between centers
+% (left and right radii are the same) and stores the result in
+% \code{sankey}. Then it uses the stored result to fill and draw the
+% lane (left border and right borders use Dubins paths with asymmetric
+% radii).
+%
% \begin{macrocode}
- \NewDocumentCommand\sankeydubins{O{}mm}{% options, sn, en
- \snk@errorifnotdefined{##2}
- \snk@errorifnotdefined{##3}
- \snk@checkquantities{##2}{##3}{\sankeydubins}
- \begingroup
- \sankeyset{##1}
- \pgfmathsetmacro\qty{\sankeygetnodeqty{##2}}
- \dubinspathset{
- sankey/.style={
- start point=##2.center,start angle=\sankeygetnodeorient{##2},
- end point=##3.center,end angle=\sankeygetnodeorient{##3},
- minimum radius=\snk@minradius + .5 * \sankeyqtytolen{\qty} pt,
- },
- }
- \dubinspathcalc{sankey,store=sankey}
- \dubinspathset{
- left border/.style={
- sankey, use store=sankey,
- left and right minimum radii={\snk@minradius}
- and {\snk@minradius + \sankeyqtytolen{\qty} pt},
- },
- right border/.style={
- sankey, use store=sankey,
- left and right minimum radii=
- {\snk@minradius + \sankeyqtytolen{\qty} pt}
- and {\snk@minradius},
- },
- }
- % fill the region
- \path[/sankey/fill] (##2.left) \dubinspath{left border}
- -- (##3.left) -- (##3.right) \dubinspath{right border,reverse}
- -- (##2.right) -- cycle;
- % draw left and right borders
- \path[/sankey/draw] (##2.left) \dubinspath{left border}
- (##2.right) \dubinspath{right border};
- \endgroup
+\NewDocumentCommand\snk@sankeydubins{O{}mm}{% options, sn, en
+ \snk@errorifnotdefined{#2}
+ \snk@errorifnotdefined{#3}
+ \snk@checkquantities{#2}{#3}{\sankeydubins}
+ \begingroup
+ \sankeyset{#1}
+ \pgfmathsetmacro\qty{\sankeygetnodeqty{#2}}
+ \dubinspathset{
+ sankey/.style={
+ start point=#2.center,start angle=\sankeygetnodeorient{#2},
+ end point=#3.center,end angle=\sankeygetnodeorient{#3},
+ minimum radius=\snk@minradius + .5 * \sankeyqtytolen{\qty} pt,
+ },
+ }
+ \dubinspathcalc{sankey,store=sankey}
+ \dubinspathset{
+ left border/.style={
+ sankey, use store=sankey,
+ left and right minimum radii={\snk@minradius}
+ and {\snk@minradius + \sankeyqtytolen{\qty} pt},
+ },
+ right border/.style={
+ sankey, use store=sankey,
+ left and right minimum radii=
+ {\snk@minradius + \sankeyqtytolen{\qty} pt}
+ and {\snk@minradius},
+ },
}
+ % fill the region
+ \path[/sankey/fill] (#2.left) \dubinspath{left border}
+ -- (#3.left) -- (#3.right) \dubinspath{right border,reverse}
+ -- (#2.right) -- cycle;
+ % draw left and right borders
+ \path[/sankey/draw] (#2.left) \dubinspath{left border}
+ (#2.right) \dubinspath{right border};
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\snk@sankeyoutin}
%
-% \begin{macro}{\sankeyoutin}
-%
-% The \code{\sankeyoutin} macro links two Sankey nodes via a Bézier curve.
-% First, to simulate constant width, it creates \code{\snk@stepoutin}
-% intermediate Sankey nodes along the Bézier curve. Then, the lane is
-% filled and drawn linking all the intermediate Sankey node via smaller
-% Bézier curves.
-%
+% The \code{\snk@sankeyoutin} macro links two Sankey nodes via a
+% Bézier curve. First, to simulate constant width, it creates
+% \code{\snk@stepoutin} intermediate Sankey nodes along the Bézier
+% curve. Then, the lane is filled and drawn linking all the
+% intermediate Sankey node via smaller Bézier curves.
+%
% \begin{macrocode}
- \NewDocumentCommand\sankeyoutin{O{}mm}{% options, sn, en
- \snk@errorifnotdefined{##2}
- \snk@errorifnotdefined{##3}
- \snk@checkquantities{##2}{##3}{\sankeyoutin}
- \begingroup
- \sankeyset{##1}
- \edef\qty{\sankeygetnodeqty{##2}}
- \pgfmathsetmacro\snk@len{\sankeyqtytolen{\qty}/2}
- \edef\snk@step{\fpeval{1/\snk@stepoutin}}
- \edef\snk@laststep{\inteval{\snk@stepoutin-1}}
- \path[overlay,decorate,decoration={
+\NewDocumentCommand\snk@sankeyoutin{O{}mm}{% options, sn, en
+ \snk@errorifnotdefined{#2}
+ \snk@errorifnotdefined{#3}
+ \snk@checkquantities{#2}{#3}{\sankeyoutin}
+ \begingroup
+ \sankeyset{#1}
+ \edef\qty{\sankeygetnodeqty{#2}}
+ \pgfmathsetmacro\snk@len{\sankeyqtytolen{\qty}/2}
+ \edef\snk@step{\fpeval{1/\snk@stepoutin}}
+ \edef\snk@laststep{\inteval{\snk@stepoutin-1}}
+ \path[overlay,decorate,decoration={
markings,
mark=between positions \snk@step and {\fpeval{1-.5*\snk@step}}
step \snk@step with {
@@ -3500,533 +3510,563 @@
;
}
}]
- (##2.center)
- to[out=\sankeygetnodeorient{##2},in=\sankeygetnodeorient{##3}+180]
- (##3.center);
- \foreach \snk@ptnum in {1,...,\snk@laststep}{
- \edef\snk@outinmidptname{snk@outinmidpt-\snk@ptnum}
- \dbp@anglebetween\snk@outinmidptangle%
- {\snk@outinmidptname-r}{\snk@outinmidptname-l}
- \sankeynode[debug=false]{%
- name=\snk@outinmidptname,
- quantity=\qty,
- angle=\snk@outinmidptangle-90,%
- at=\snk@outinmidptname%
- }
- }
+ (#2.center)
+ to[out=\sankeygetnodeorient{#2},in=\sankeygetnodeorient{#3}+180]
+ (#3.center);
+ \foreach \snk@ptnum in {1,...,\snk@laststep}{
+ \edef\snk@outinmidptname{snk@outinmidpt-\snk@ptnum}
+ \dbp@anglebetween\snk@outinmidptangle%
+ {\snk@outinmidptname-r}{\snk@outinmidptname-l}
\sankeynode[debug=false]{%
- name={snk@outinmidpt-0},
- quantity=\sankeygetnodeqty{##2},
- angle=\sankeygetnodeorient{##2},%
- at={##2}%
+ name=\snk@outinmidptname,
+ quantity=\qty,
+ angle=\snk@outinmidptangle-90,%
+ at=\snk@outinmidptname%
}
- \sankeynode[debug=false]{%
- name={snk@outinmidpt-\snk@stepoutin},
- quantity={\sankeygetnodeqty{##3}},
- angle={\sankeygetnodeorient{##3}},%
- at={##3}%
- }
- \path[/sankey/fill,looseness=1]
- (snk@outinmidpt-0.left)
- \foreach \snk@curpt
- [remember=\snk@curpt as \snk@prevpt (initially 0)]
- in {1,...,\snk@stepoutin}{
- to[out=\sankeygetnodeorient{snk@outinmidpt-\snk@prevpt},
+ }
+ \sankeynode[debug=false]{%
+ name={snk@outinmidpt-0},
+ quantity=\sankeygetnodeqty{#2},
+ angle=\sankeygetnodeorient{#2},%
+ at={#2}%
+ }
+ \sankeynode[debug=false]{%
+ name={snk@outinmidpt-\snk@stepoutin},
+ quantity={\sankeygetnodeqty{#3}},
+ angle={\sankeygetnodeorient{#3}},%
+ at={#3}%
+ }
+ \path[/sankey/fill,looseness=1]
+ (snk@outinmidpt-0.left)
+ \foreach \snk@curpt
+ [remember=\snk@curpt as \snk@prevpt (initially 0)]
+ in {1,...,\snk@stepoutin}{
+ to[out=\sankeygetnodeorient{snk@outinmidpt-\snk@prevpt},
in=\sankeygetnodeorient{snk@outinmidpt-\snk@curpt}+180]
- (snk@outinmidpt-\snk@curpt.left)
- }
- --
- (snk@outinmidpt-\snk@stepoutin.right)
- \foreach \snk@curpt
- [remember=\snk@curpt as \snk@prevpt (initially \snk@stepoutin)]
- in {\snk@laststep,...,0}{
- to[out=\sankeygetnodeorient{snk@outinmidpt-\snk@prevpt}+180,
+ (snk@outinmidpt-\snk@curpt.left)
+ }
+ --
+ (snk@outinmidpt-\snk@stepoutin.right)
+ \foreach \snk@curpt
+ [remember=\snk@curpt as \snk@prevpt (initially \snk@stepoutin)]
+ in {\snk@laststep,...,0}{
+ to[out=\sankeygetnodeorient{snk@outinmidpt-\snk@prevpt}+180,
in=\sankeygetnodeorient{snk@outinmidpt-\snk@curpt}]
- (snk@outinmidpt-\snk@curpt.right)
- }
- -- cycle;
- \path[/sankey/draw,looseness=1]
- (snk@outinmidpt-0.left)
- \foreach \snk@curpt
- [remember=\snk@curpt as \snk@prevpt (initially 0)]
- in {1,...,\snk@stepoutin}{
- to[out=\sankeygetnodeorient{snk@outinmidpt-\snk@prevpt},
+ (snk@outinmidpt-\snk@curpt.right)
+ }
+ -- cycle;
+ \path[/sankey/draw,looseness=1]
+ (snk@outinmidpt-0.left)
+ \foreach \snk@curpt
+ [remember=\snk@curpt as \snk@prevpt (initially 0)]
+ in {1,...,\snk@stepoutin}{
+ to[out=\sankeygetnodeorient{snk@outinmidpt-\snk@prevpt},
in=\sankeygetnodeorient{snk@outinmidpt-\snk@curpt}+180]
- (snk@outinmidpt-\snk@curpt.left)
- }
- (snk@outinmidpt-\snk@stepoutin.right)
- \foreach \snk@curpt
- [remember=\snk@curpt as \snk@prevpt (initially \snk@stepoutin)]
- in {\snk@laststep,...,0}{
- to[out=\sankeygetnodeorient{snk@outinmidpt-\snk@prevpt}+180,
- in=\sankeygetnodeorient{snk@outinmidpt-\snk@curpt}]
- (snk@outinmidpt-\snk@curpt.right)
- };
- \endgroup
+ (snk@outinmidpt-\snk@curpt.left)
}
+ (snk@outinmidpt-\snk@stepoutin.right)
+ \foreach \snk@curpt
+ [remember=\snk@curpt as \snk@prevpt (initially \snk@stepoutin)]
+ in {\snk@laststep,...,0}{
+ to[out=\sankeygetnodeorient{snk@outinmidpt-\snk@prevpt}+180,
+ in=\sankeygetnodeorient{snk@outinmidpt-\snk@curpt}]
+ (snk@outinmidpt-\snk@curpt.right)
+ };
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\sankeynodealias}
-%
-% The \code{\sankeynodealias} macro clones the Sankey node
-% named \code{#1} into a Sankey node named \code{#2}.
+% \begin{macro}{\snk@sankeynodealias}
+%
+% The \code{\snk@sankeynodealias} macro clones the Sankey node named
+% \code{#1} into a Sankey node named \code{#2}.
%
% \begin{macrocode}
- \NewDocumentCommand\sankeynodealias{mm}{%name, alias
- \snk@errorifnotdefined{##1}
- \path[late options={name=##1,alias=##2}];
- \snk@setnodeqty{##2}{\sankeygetnodeqty{##1}}
- \snk@setnodeorient{##2}{\sankeygetnodeorient{##1}}
- }
+\NewDocumentCommand\snk@sankeynodealias{mm}{%name, alias
+ \snk@errorifnotdefined{#1}
+ \path[late options={name=#1,alias=#2}];
+ \snk@setnodeqty{#2}{\sankeygetnodeqty{#1}}
+ \snk@setnodeorient{#2}{\sankeygetnodeorient{#1}}
+}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\sankeynode}
-%
-% The \code{\sankeynode} macro creates the new Sankey
-% node named \code{#2}.
-%
+%
+% \begin{macro}{\snk@sankeynode}
+%
+% The \code{\snk@sankeynode} macro creates the new Sankey
+% node named \code{#2}.
+%
% \begin{macrocode}
- \NewDocumentCommand\sankeynode{O{}m}{% options, node parameters
- \begingroup
- \sankeyset{##1}
- \sankeyset{node parameters,@initial parameters,/sankey/every node,##2}
- \snk@makenode{}
- \snk@makeforkednode{}
- \iftoggle{sankey node start}{\snk@filldrawstart}{}
- \iftoggle{sankey node end}{\snk@filldrawend}{}
- \snk@show@debug{\name}
- \endgroup
- }
+\NewDocumentCommand\snk@sankeynode{O{}m}{% options, node parameters
+ \begingroup
+ \sankeyset{#1}
+ \sankeyset{node parameters,@initial parameters,/sankey/every node,#2}
+ \snk@makenode{}
+ \snk@makeforkednode{}
+ \iftoggle{sankey node start}{\snk@filldrawstart}{}
+ \iftoggle{sankey node end}{\snk@filldrawend}{}
+ \snk@show@debug{\name}
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\sankeystart}
-%
-% The \code{\sankeystart} macro fills and draws a starting lane
-% attached to the Sankey node named \code{#2}.
+%
+% \begin{macro}{\snk@sankeystart}
+%
+% The \code{\snk@sankeystart} macro fills and draws a starting lane
+% attached to the Sankey node named \code{#2}.
%
% \begin{macrocode}
- \NewDocumentCommand\sankeystart{O{}m}{% options, name
- \snk@errorifnotdefined{##2}
- \begingroup
- \sankeyset{##1}
- \edef\name{##2}
- \edef\orient{\sankeygetnodeorient{##2}}
- \edef\qty{\sankeygetnodeqty{##2}}
- \snk@filldrawstart
- \endgroup
- }
+\NewDocumentCommand\snk@sankeystart{O{}m}{% options, name
+ \snk@errorifnotdefined{#2}
+ \begingroup
+ \sankeyset{#1}
+ \edef\name{#2}
+ \edef\orient{\sankeygetnodeorient{#2}}
+ \edef\qty{\sankeygetnodeqty{#2}}
+ \snk@filldrawstart
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\sankeynodestart}
-%
-% The \code{\sankeynodestart} macro creates the new Sankey
-% node named \code{#2} then fills and draws a starting lane
-% attached to this new Sankey node.
-%
+%
+% \begin{macro}{\snk@sankeynodestart}
+%
+% The \code{\snk@sankeynodestart} macro creates the new Sankey
+% node named \code{#2} then fills and draws a starting lane
+% attached to this new Sankey node.
+%
% \begin{macrocode}
- \NewDocumentCommand\sankeynodestart{O{}m}{% option, node parameters
- \sankeynode[##1]{start,##2}
- }
+\NewDocumentCommand\snk@sankeynodestart{O{}m}{% option, node parameters
+ \sankeynode[#1]{start,#2}
+}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\sankeyend}
-%
-% The \code{\sankeyend} macro fills and draws an ending lane
-% attached to the Sankey node named \code{#2}.
-%
+%
+% \begin{macro}{\snk@sankeyend}
+%
+% The \code{\snk@sankeyend} macro fills and draws an ending lane
+% attached to the Sankey node named \code{#2}.
+%
% \begin{macrocode}
- \NewDocumentCommand\sankeyend{O{}m}{%options, name
- \snk@errorifnotdefined{##2}
- \begingroup
- \sankeyset{##1}
- \edef\name{##2}
- \edef\orient{\sankeygetnodeorient{##2}}
- \edef\qty{\sankeygetnodeqty{##2}}
- \snk@filldrawend
- \endgroup
- }
+\NewDocumentCommand\snk@sankeyend{O{}m}{%options, name
+ \snk@errorifnotdefined{#2}
+ \begingroup
+ \sankeyset{#1}
+ \edef\name{#2}
+ \edef\orient{\sankeygetnodeorient{#2}}
+ \edef\qty{\sankeygetnodeqty{#2}}
+ \snk@filldrawend
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\sankeynodeend}
-%
-% The \code{\sankeynodeend} macro creates the new Sankey
-% node named \code{#2} then fills and draws an ending lane
-% attached to this new Sankey node.
-%
+%
+% \begin{macro}{\snk@sankeynodeend}
+%
+% The \code{\snk@sankeynodeend} macro creates the new Sankey
+% node named \code{#2} then fills and draws an ending lane
+% attached to this new Sankey node.
+%
% \begin{macrocode}
- \NewDocumentCommand\sankeynodeend{O{}m}{% options, node parameters
- \sankeynode[##1]{end,##2}
- }
+\NewDocumentCommand\snk@sankeynodeend{O{}m}{% options, node parameters
+ \sankeynode[#1]{end,#2}
+}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\sankeyadvance}
-% \begin{macro}{\sankeyadvance*}
+% \begin{macro}{\snk@init@move}
%
-% The \code{\sankeyadvance} macro moves toward (or backward if
-% \emph{starred} calls -- \code{#1}) the Sankey node named \code{#3}.
-% \code{#4} is a distance. The previous position is keeped
-% by a Sankey node named \code{#3-old}.
+% \changes{v3.0.2}{2025/10/10}{Factorization of the node move initialization code}
+%
+% The \code{\snk@init@move} macro applies options et clones the
+% current node before its moving.
%
% \begin{macrocode}
- \NewDocumentCommand\sankeyadvance{sO{}mm}{%
- %params: *(reverse), options, name, distance
- \snk@errorifnotdefined{##3}
- \begingroup
- \sankeyset{##2}
- \edef\name{##3}
- \edef\snk@oldname{##3-old}
- \sankeynodealias{\name}{\snk@oldname}
- \IfBooleanTF{##1}{
- % move backward
- \sankeynode{
- at={$(\snk@oldname.center)!##4!90:(\snk@oldname.left)$},
- angle=\sankeygetnodeorient{\snk@oldname},
- quantity=\sankeygetnodeqty{\snk@oldname},
- name=\name,
- }
- \path[/sankey/fill]
- (\name.left) -- (\snk@oldname.left)
- -- (\snk@oldname.right) -- (\name.right) -- cycle;
- \path[/sankey/draw]
- (\name.left) -- (\snk@oldname.left)
- (\snk@oldname.right) -- (\name.right);
- }{
- % move forward
- \sankeynode{
- at={$(\snk@oldname.center)!##4!-90:(\snk@oldname.left)$},
- angle=\sankeygetnodeorient{\snk@oldname},
- quantity=\sankeygetnodeqty{\snk@oldname},
- name=\name,
- }
- \path[/sankey/fill]
- (\snk@oldname.left) -- (\name.left)
- -- (\name.right) -- (\snk@oldname.right) -- cycle;
- \path[/sankey/draw]
- (\snk@oldname.left) -- (\name.left)
- (\name.right) -- (\snk@oldname.right);
- }
- \snk@show@debug{\name}
- \endgroup
- }
+\def\snk@init@move#1#2{% params: options, name
+ \sankeyset{#1}
+ \edef\name{#2}
+ \edef\snk@oldname{#2-old}
+ \sankeynodealias{\name}{\snk@oldname}
+ \edef\qty{\sankeygetnodeqty{\name}}
+}
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \begin{macro}{\sankeyturnright}
-% \begin{macro}{\sankeyturnright*}
-%
-% \changes{v3.0}{2021/03/14}{new macro}
%
-% The \code{sankeyturnright} macro moves forward the Sankey node
-% named \code{#3} by turning right. The angle is \code{#4} (the starred
-% version uses the opposite of \code{#4}). If the angle is \emph{negative}, the
-% macro calls the \code{\sankeyturnrightbackward} macro to move backward else
-% the macro fills/draws the lane between the previous position and the new
-% position. The previous position is keeped by a Sankey
-% node named \code{#3-old}.
+% \begin{macro}{\snk@sankeyadvance}
%
+% The \code{\snk@sankeyadvance} macro moves toward (or backward if
+% \emph{starred} calls -- \code{#1}) the Sankey node named \code{#3}.
+% \code{#4} is a distance. The previous position is keeped
+% by a Sankey node named \code{#3-old}.
+%
% \begin{macrocode}
- \NewDocumentCommand\sankeyturnright{sO{}mm}{
- % *(reverse), options, name, angle
- \snk@errorifnotdefined{##3}
- \begingroup
- \IfBooleanTF{##1}
- {\edef\snk@angle{\fpeval{-1*##4}}}
- {\edef\snk@angle{\fpeval{1*##4}}}
- \edef\snk@anglesign{\fpeval{sign(\snk@angle)}}
- \ifnumgreater{\snk@anglesign}{-1}{
- \sankeyset{##2}
- \edef\name{##3}
- \edef\snk@oldname{##3-old}
- \sankeynodealias{\name}{\snk@oldname}
- \edef\qty{\sankeygetnodeqty{\name}}
- \edef\orient{\snk@normalize@angle{\sankeygetnodeorient{\name}-\snk@angle}}
- \snk@getpos\snk@c{$(\name.right)!-\snk@minradius!(\name.left)$}
- \snk@getpos\pos{$(\snk@c)!1!-\snk@angle:(\name.center)$}
- \snk@makenode{}
- % fill the region
- \path[/sankey/fill] let
- \p1=(\snk@oldname.left),\p2=(\snk@oldname.right),
- \p3=(\name.left),\p4=(\name.right),
- \n1={\sankeyqtytolen{\qty}},
- \n{maxr}={\snk@minradius+\n1},
- \n{minr}={\snk@minradius}
- in
- (\p1) arc(\orient+\snk@angle+90:\orient+90:\n{maxr}) -- (\p3) --
- (\p4) arc(\orient+90:\orient+\snk@angle+90:\n{minr}) -- (\p2) -- cycle;
- % draw left and right borders
- \path[/sankey/draw] let
- \p1=(\snk@oldname.left),\p2=(\snk@oldname.right),
- \p3=(\name.left),\p4=(\name.right),
- \n1={\sankeyqtytolen{\qty}},
- \n{maxr}={\snk@minradius+\n1},
- \n{minr}={\snk@minradius}
- in
- (\p1) arc(\orient+\snk@angle+90:\orient+90:\n{maxr})
- (\p4) arc(\orient+90:\orient+\snk@angle+90:\n{minr});
- \snk@show@debug{\name}
- }{
- \sankeyturnrightbackward[##2]{##3}{-1*\snk@angle}
+\NewDocumentCommand\snk@sankeyadvance{sO{}mm}{%
+ % params: *(reverse), options, name, distance
+ \snk@errorifnotdefined{#3}
+ \begingroup
+ \snk@init@move{#2}{#3}
+ \IfBooleanTF{#1}{
+ % move backward
+ \sankeynode{
+ at={$(\snk@oldname.center)!#4!90:(\snk@oldname.left)$},
+ angle=\sankeygetnodeorient{\snk@oldname},
+ quantity=\sankeygetnodeqty{\snk@oldname},
+ name=\name,
}
- \endgroup
+ \path[/sankey/fill]
+ (\name.left) -- (\snk@oldname.left)
+ -- (\snk@oldname.right) -- (\name.right) -- cycle;
+ \path[/sankey/draw]
+ (\name.left) -- (\snk@oldname.left)
+ (\snk@oldname.right) -- (\name.right);
+ }{
+ % move forward
+ \sankeynode{
+ at={$(\snk@oldname.center)!#4!-90:(\snk@oldname.left)$},
+ angle=\sankeygetnodeorient{\snk@oldname},
+ quantity=\sankeygetnodeqty{\snk@oldname},
+ name=\name,
+ }
+ \path[/sankey/fill]
+ (\snk@oldname.left) -- (\name.left)
+ -- (\name.right) -- (\snk@oldname.right) -- cycle;
+ \path[/sankey/draw]
+ (\snk@oldname.left) -- (\name.left)
+ (\name.right) -- (\snk@oldname.right);
}
+ \snk@show@debug{\name}
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\sankeyturnrightbackward}
-% \begin{macro}{\sankeyturnrightbackward*}
-%
-% \changes{v3.0}{2021/03/14}{new macro}
-%
-% The \code{sankeyturnrightbackward} macro moves backward the Sankey node
-% named \code{#3} by turning right. The angle is \code{#4} (the starred
-% version uses the opposite of \code{#4}). If the angle is \emph{negative}, the
-% macro calls the \code{\sankeyturnright} macro to move forward else
-% the macro fills/draws the lane between the previous position and the new
-% position. The previous position is keeped by a Sankey
-% node named \code{#3-old}.
+% \begin{macro}{\snk@sankeyturnright}
+%
+% \changes{v3.0}{2021/03/14}{New macro}
+%
+% The \code{sankeyturnright} macro moves forward the Sankey node named
+% \code{#3} by turning right. The angle is \code{#4} (the starred
+% version uses the opposite of \code{#4}). If the angle is
+% \emph{negative}, the macro calls the \code{\sankeyturnrightbackward}
+% macro to move backward else the macro fills/draws the lane between
+% the previous position and the new position. The previous position is
+% keeped by a Sankey node named \code{#3-old}.
%
% \begin{macrocode}
- \NewDocumentCommand\sankeyturnrightbackward{sO{}mm}{
- % *(reverse), options, name, angle
- \snk@errorifnotdefined{##3}
- \begingroup
- \IfBooleanTF{##1}
- {\edef\snk@angle{\fpeval{-1*##4}}}
- {\edef\snk@angle{\fpeval{1*##4}}}
- \edef\snk@anglesign{\fpeval{sign(\snk@angle)}}
- \ifnumgreater{\snk@anglesign}{-1}{
- \sankeyset{##2}
- \edef\name{##3}
- \edef\snk@oldname{##3-old}
- \sankeynodealias{\name}{\snk@oldname}
- \edef\qty{\sankeygetnodeqty{\name}}
- \edef\orient{\snk@normalize@angle{\sankeygetnodeorient{\name}+\snk@angle}}
- \snk@getpos\snk@c{$(\name.right)!-\snk@minradius!(\name.left)$}
- \snk@getpos\pos{$(\snk@c)!1!\snk@angle:(\name.center)$}
- \snk@makenode{}
- % fill the region
- \path[/sankey/fill] let
- \p1=(\name.left),\p2=(\name.right),
- \p3=(\snk@oldname.left),\p4=(\snk@oldname.right),
- \n1={\sankeyqtytolen{\qty}},
- \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
- in
- (\p1) arc(\orient+90:\orient-\snk@angle+90:\n{maxr}) -- (\p3) --
- (\p4) arc(\orient-\snk@angle+90:\orient+90:\n{minr}) -- (\p2) -- cycle;
- % draw left and right borders
- \path[/sankey/draw] let
- \p1=(\name.left),\p2=(\name.right),
- \p3=(\snk@oldname.left),\p4=(\snk@oldname.right),
- \n1={\sankeyqtytolen{\qty}},
- \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
- in
- (\p1) arc(\orient+90:\orient-\snk@angle+90:\n{maxr})
- (\p4) arc(\orient-\snk@angle+90:\orient+90:\n{minr});
- \snk@show@debug{\name}
- }{
- \sankeyturnright[##2]{##3}{-1*\snk@angle}
- }
- \endgroup
+\NewDocumentCommand\snk@sankeyturnright{sO{}mm}{
+ % *(reverse), options, name, angle
+ \snk@errorifnotdefined{#3}
+ \begingroup
+ \IfBooleanTF{#1}
+ {\edef\snk@angle{\fpeval{-1*#4}}}
+ {\edef\snk@angle{\fpeval{1*#4}}}
+ \edef\snk@anglesign{\fpeval{sign(\snk@angle)}}
+ \ifnumgreater{\snk@anglesign}{-1}{
+ \snk@init@move{#2}{#3}
+ \edef\orient{\snk@normalize@angle{\sankeygetnodeorient{\name}-\snk@angle}}
+ \snk@getpos\snk@c{$(\name.right)!-\snk@minradius!(\name.left)$}
+ \snk@getpos\pos{$(\snk@c)!1!-\snk@angle:(\name.center)$}
+ \snk@makenode{}
+ % fill the region
+ \path[/sankey/fill] let
+ \p1=(\snk@oldname.left),\p2=(\snk@oldname.right),
+ \p3=(\name.left),\p4=(\name.right),
+ \n1={\sankeyqtytolen{\qty}},
+ \n{maxr}={\snk@minradius+\n1},
+ \n{minr}={\snk@minradius}
+ in
+ (\p1) arc(\orient+\snk@angle+90:\orient+90:\n{maxr}) -- (\p3) --
+ (\p4) arc(\orient+90:\orient+\snk@angle+90:\n{minr}) -- (\p2) -- cycle;
+ % draw left and right borders
+ \path[/sankey/draw] let
+ \p1=(\snk@oldname.left),\p2=(\snk@oldname.right),
+ \p3=(\name.left),\p4=(\name.right),
+ \n1={\sankeyqtytolen{\qty}},
+ \n{maxr}={\snk@minradius+\n1},
+ \n{minr}={\snk@minradius}
+ in
+ (\p1) arc(\orient+\snk@angle+90:\orient+90:\n{maxr})
+ (\p4) arc(\orient+90:\orient+\snk@angle+90:\n{minr});
+ \snk@show@debug{\name}
+ }{
+ \sankeyturnrightbackward[#2]{#3}{-1*\snk@angle}
}
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \begin{macro}{\sankeyturnleft}
-% \begin{macro}{\sankeyturnleft*}
-%
-% \changes{v3.0}{2021/03/14}{new macro}
-%
-% The \code{sankeyturnleft} macro moves forward the Sankey node
-% named \code{#3} by turning left. The angle is \code{#4} (the starred
-% version uses the opposite of \code{#4}). If the angle is \emph{negative}, the
-% macro calls the \code{\sankeyturnleftbackward} macro to move backward else
-% the macro fills/draws the lane between the previous position and the new
-% position. The previous position is keeped by a Sankey
-% node named \code{#3-old}.
+%
+% \begin{macro}{\snk@sankeyturnrightbackward}
+%
+% \changes{v3.0}{2021/03/14}{New macro}
+%
+% The \code{\snk@sankeyturnrightbackward} macro moves backward the
+% Sankey node named \code{#3} by turning right. The angle is \code{#4}
+% (the starred version uses the opposite of \code{#4}). If the angle
+% is \emph{negative}, the macro calls the \code{\sankeyturnright}
+% macro to move forward else the macro fills/draws the lane between
+% the previous position and the new position. The previous position is
+% keeped by a Sankey node named \code{#3-old}.
%
% \begin{macrocode}
- \NewDocumentCommand\sankeyturnleft{sO{}mm}{
- % *(reverse), options, name, angle
- \snk@errorifnotdefined{##3}
- \begingroup
- \IfBooleanTF{##1}
- {\edef\snk@angle{\fpeval{-1*##4}}}
- {\edef\snk@angle{\fpeval{1*##4}}}
- \edef\snk@anglesign{\fpeval{sign(\snk@angle)}}
- \ifnumgreater{\snk@anglesign}{-1}{
- \sankeyset{##2}
- \edef\name{##3}
- \edef\snk@oldname{##3-old}
- \sankeynodealias{\name}{\snk@oldname}
- \edef\qty{\sankeygetnodeqty{\name}}
- \edef\orient{\snk@normalize@angle{\sankeygetnodeorient{\name}+\snk@angle}}
- \snk@getpos\snk@c{$(\name.left)!-\snk@minradius!(\name.right)$}
- \snk@getpos\pos{$(\snk@c)!1!\snk@angle:(\name.center)$}
- \snk@makenode{}
- % fill the region
- \path[/sankey/fill] let
- \p1=(\snk@oldname.left),\p2=(\snk@oldname.right),
- \p3=(\name.left),\p4=(\name.right),
- \n1={\sankeyqtytolen{\qty}},
- \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
- in
- (\p1) arc(\orient-\snk@angle-90:\orient-90:\n{minr}) -- (\p3) --
- (\p4) arc(\orient-90:\orient-\snk@angle-90:\n{maxr}) -- (\p2) -- cycle;
- % draw left and right borders
- \path[/sankey/draw] let
- \p1=(\snk@oldname.left),\p2=(\snk@oldname.right),
- \p3=(\name.left),\p4=(\name.right),
- \n1={\sankeyqtytolen{\qty}},
- \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
- in
- (\p1) arc(\orient-\snk@angle-90:\orient-90:\n{minr})
- (\p4) arc(\orient-90:\orient-\snk@angle-90:\n{maxr});
- \snk@show@debug{\name}
- }{
- \sankeyturnleftbackward[##2]{##3}{-1*\snk@angle}
- }
- \endgroup
+\NewDocumentCommand\snk@sankeyturnrightbackward{sO{}mm}{
+ % *(reverse), options, name, angle
+ \snk@errorifnotdefined{#3}
+ \begingroup
+ \IfBooleanTF{#1}
+ {\edef\snk@angle{\fpeval{-1*#4}}}
+ {\edef\snk@angle{\fpeval{1*#4}}}
+ \edef\snk@anglesign{\fpeval{sign(\snk@angle)}}
+ \ifnumgreater{\snk@anglesign}{-1}{
+ \snk@init@move{#2}{#3}
+ \edef\orient{\snk@normalize@angle{\sankeygetnodeorient{\name}+\snk@angle}}
+ \snk@getpos\snk@c{$(\name.right)!-\snk@minradius!(\name.left)$}
+ \snk@getpos\pos{$(\snk@c)!1!\snk@angle:(\name.center)$}
+ \snk@makenode{}
+ % fill the region
+ \path[/sankey/fill] let
+ \p1=(\name.left),\p2=(\name.right),
+ \p3=(\snk@oldname.left),\p4=(\snk@oldname.right),
+ \n1={\sankeyqtytolen{\qty}},
+ \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
+ in
+ (\p1) arc(\orient+90:\orient-\snk@angle+90:\n{maxr}) -- (\p3) --
+ (\p4) arc(\orient-\snk@angle+90:\orient+90:\n{minr}) -- (\p2) -- cycle;
+ % draw left and right borders
+ \path[/sankey/draw] let
+ \p1=(\name.left),\p2=(\name.right),
+ \p3=(\snk@oldname.left),\p4=(\snk@oldname.right),
+ \n1={\sankeyqtytolen{\qty}},
+ \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
+ in
+ (\p1) arc(\orient+90:\orient-\snk@angle+90:\n{maxr})
+ (\p4) arc(\orient-\snk@angle+90:\orient+90:\n{minr});
+ \snk@show@debug{\name}
+ }{
+ \sankeyturnright[#2]{#3}{-1*\snk@angle}
}
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \begin{macro}{\sankeyturnleftbackward}
-% \begin{macro}{\sankeyturnleftbackward*}
-%
-% \changes{v3.0}{2021/03/14}{new macro}
-%
-% The \code{sankeyturnleftbackward} macro moves backward the Sankey node
-% named \code{#3} by turning left. The angle is \code{#4} (the starred
-% version uses the opposite of \code{#4}). If the angle is \emph{negative}, the
-% macro calls the \code{\sankeyturnleft} macro to move forward else
-% the macro fills/draws the lane between the previous position and the new
-% position. The previous position is keeped by a Sankey
-% node named \code{#3-old}.
+% \begin{macro}{\snk@sankeyturnleft}
+%
+% \changes{v3.0}{2021/03/14}{New macro}
+%
+% The \code{\snk@sankeyturnleft} macro moves forward the Sankey node
+% named \code{#3} by turning left. The angle is \code{#4} (the starred
+% version uses the opposite of \code{#4}). If the angle is
+% \emph{negative}, the macro calls the \code{\sankeyturnleftbackward}
+% macro to move backward else the macro fills/draws the lane between
+% the previous position and the new position. The previous position is
+% keeped by a Sankey node named \code{#3-old}.
%
% \begin{macrocode}
- \NewDocumentCommand\sankeyturnleftbackward{sO{}mm}{
- % *(reverse), options, name, angle
- \snk@errorifnotdefined{##3}
- \begingroup
- \IfBooleanTF{##1}
- {\edef\snk@angle{\fpeval{-1*##4}}}
- {\edef\snk@angle{\fpeval{1*##4}}}
- \edef\snk@anglesign{\fpeval{sign(\snk@angle)}}
- \ifnumgreater{\snk@anglesign}{-1}{
- \sankeyset{##2}
- \edef\name{##3}
- \edef\snk@oldname{##3-old}
- \sankeynodealias{\name}{\snk@oldname}
- \edef\qty{\sankeygetnodeqty{\name}}
- \edef\orient{\snk@normalize@angle{\sankeygetnodeorient{\name}-\snk@angle}}
- \snk@getpos\snk@c{$(\name.left)!-\snk@minradius!(\name.right)$}
- \snk@getpos\pos{$(\snk@c)!1!-\snk@angle:(\name.center)$}
- \snk@makenode{}
- % fill the region
- \path[/sankey/fill] let
- \p1=(\name.left),\p2=(\name.right),
- \p3=(\snk@oldname.left),\p4=(\snk@oldname.right),
- \n1={\sankeyqtytolen{\qty}},
- \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
- in
- (\p1) arc(\orient-90:\orient+\snk@angle-90:\n{minr}) -- (\p3) --
- (\p4) arc(\orient+\snk@angle-90:\orient-90:\n{maxr}) -- (\p2) -- cycle;
- % draw left and right borders
- \path[/sankey/draw] let
- \p1=(\name.left),\p2=(\name.right),
- \p3=(\snk@oldname.left),\p4=(\snk@oldname.right),
- \n1={\sankeyqtytolen{\qty}},
- \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
- in
- (\p1) arc(\orient-90:\orient+\snk@angle-90:\n{minr})
- (\p4) arc(\orient+\snk@angle-90:\orient-90:\n{maxr});
- \snk@show@debug{\name}
- }{
- \sankeyturnleft[##2]{##3}{-1*\snk@angle}
- }
- \endgroup
+\NewDocumentCommand\snk@sankeyturnleft{sO{}mm}{
+ % *(reverse), options, name, angle
+ \snk@errorifnotdefined{#3}
+ \begingroup
+ \IfBooleanTF{#1}
+ {\edef\snk@angle{\fpeval{-1*#4}}}
+ {\edef\snk@angle{\fpeval{1*#4}}}
+ \edef\snk@anglesign{\fpeval{sign(\snk@angle)}}
+ \ifnumgreater{\snk@anglesign}{-1}{
+ \snk@init@move{#2}{#3}
+ \edef\orient{\snk@normalize@angle{\sankeygetnodeorient{\name}+\snk@angle}}
+ \snk@getpos\snk@c{$(\name.left)!-\snk@minradius!(\name.right)$}
+ \snk@getpos\pos{$(\snk@c)!1!\snk@angle:(\name.center)$}
+ \snk@makenode{}
+ % fill the region
+ \path[/sankey/fill] let
+ \p1=(\snk@oldname.left),\p2=(\snk@oldname.right),
+ \p3=(\name.left),\p4=(\name.right),
+ \n1={\sankeyqtytolen{\qty}},
+ \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
+ in
+ (\p1) arc(\orient-\snk@angle-90:\orient-90:\n{minr}) -- (\p3) --
+ (\p4) arc(\orient-90:\orient-\snk@angle-90:\n{maxr}) -- (\p2) -- cycle;
+ % draw left and right borders
+ \path[/sankey/draw] let
+ \p1=(\snk@oldname.left),\p2=(\snk@oldname.right),
+ \p3=(\name.left),\p4=(\name.right),
+ \n1={\sankeyqtytolen{\qty}},
+ \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
+ in
+ (\p1) arc(\orient-\snk@angle-90:\orient-90:\n{minr})
+ (\p4) arc(\orient-90:\orient-\snk@angle-90:\n{maxr});
+ \snk@show@debug{\name}
+ }{
+ \sankeyturnleftbackward[#2]{#3}{-1*\snk@angle}
}
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \begin{macro}{\sankeyturn}
-% \begin{macro}{\sankeyturn*}
-%
-% \changes{v3.0}{2021/03/14}{simplification by using new \emph{turn} macros}
+% \begin{macro}{\snk@sankeyturnleftbackward}
%
-% The \code{\sankeyturn} macro moves toward (or backward if
-% \emph{starred} calls -- \code{#1}) the Sankey node named
-% \code{#3} by turning left (angle \code{#4} is positive)
-% or right (angle \code{#4} is negative).
-% The previous position is keeped by a Sankey node named
-% \code{#3-old}.
+% \changes{v3.0}{2021/03/14}{New macro}
+%
+% The \code{\snk@sankeyturnleftbackward} macro moves backward the
+% Sankey node named \code{#3} by turning left. The angle is \code{#4}
+% (the starred version uses the opposite of \code{#4}). If the angle
+% is \emph{negative}, the macro calls the \code{\sankeyturnleft} macro
+% to move forward else the macro fills/draws the lane between the
+% previous position and the new position. The previous position is
+% keeped by a Sankey node named \code{#3-old}.
%
% \begin{macrocode}
- \NewDocumentCommand\sankeyturn{sO{}mm}{%
- % *(reverse), options, name, angle
- \snk@errorifnotdefined{##3}
- \begingroup
- \edef\snk@anglesign{\fpeval{sign(##4)}}
- \IfBooleanTF{##1}{
- \ifnumgreater{\snk@anglesign}{-1}
- {\sankeyturnleftbackward[##2]{##3}{##4}}
- {\sankeyturnrightbackward[##2]{##3}{-1*##4}}
- }{
- \ifnumgreater{\snk@anglesign}{-1}
- {\sankeyturnleft[##2]{##3}{##4}}
- {\sankeyturnright[##2]{##3}{-1*##4}}
- }
- \endgroup
+\NewDocumentCommand\snk@sankeyturnleftbackward{sO{}mm}{
+ % *(reverse), options, name, angle
+ \snk@errorifnotdefined{#3}
+ \begingroup
+ \IfBooleanTF{#1}
+ {\edef\snk@angle{\fpeval{-1*#4}}}
+ {\edef\snk@angle{\fpeval{1*#4}}}
+ \edef\snk@anglesign{\fpeval{sign(\snk@angle)}}
+ \ifnumgreater{\snk@anglesign}{-1}{
+ \snk@init@move{#2}{#3}
+ \edef\orient{\snk@normalize@angle{\sankeygetnodeorient{\name}-\snk@angle}}
+ \snk@getpos\snk@c{$(\name.left)!-\snk@minradius!(\name.right)$}
+ \snk@getpos\pos{$(\snk@c)!1!-\snk@angle:(\name.center)$}
+ \snk@makenode{}
+ % fill the region
+ \path[/sankey/fill] let
+ \p1=(\name.left),\p2=(\name.right),
+ \p3=(\snk@oldname.left),\p4=(\snk@oldname.right),
+ \n1={\sankeyqtytolen{\qty}},
+ \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
+ in
+ (\p1) arc(\orient-90:\orient+\snk@angle-90:\n{minr}) -- (\p3) --
+ (\p4) arc(\orient+\snk@angle-90:\orient-90:\n{maxr}) -- (\p2) -- cycle;
+ % draw left and right borders
+ \path[/sankey/draw] let
+ \p1=(\name.left),\p2=(\name.right),
+ \p3=(\snk@oldname.left),\p4=(\snk@oldname.right),
+ \n1={\sankeyqtytolen{\qty}},
+ \n{maxr}={\snk@minradius+\n1}, \n{minr}={\snk@minradius}
+ in
+ (\p1) arc(\orient-90:\orient+\snk@angle-90:\n{minr})
+ (\p4) arc(\orient+\snk@angle-90:\orient-90:\n{maxr});
+ \snk@show@debug{\name}
+ }{
+ \sankeyturnleft[#2]{#3}{-1*\snk@angle}
}
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \begin{macro}{\sankeyfork}
-%
-% The \code{\sankeyfork} macro forks the Sankey node named
-% \code{#2} to the list of subnodes given by \code{#3}.
-% The subnodes are cloned to take into account
-% the \code{debug} option.
+% \begin{macro}{\snk@sankeyturn}
+%
+% \changes{v3.0}{2021/03/14}{Simplification by using new \emph{turn} macros}
+%
+% The \code{\snk@sankeyturn} macro moves toward (or backward if
+% \emph{starred} calls -- \code{#1}) the Sankey node named \code{#3}
+% by turning left (angle \code{#4} is positive) or right (angle
+% \code{#4} is negative). The previous position is keeped by a Sankey
+% node named \code{#3-old}.
%
% \begin{macrocode}
- \NewDocumentCommand\sankeyfork{O{}mm}{%options, name, list of forks
- \snk@errorifnotdefined{##2}
- \begingroup
- \sankeyset{##1}
- \sankeynode[debug=false]{as={##2},forked={##3}}
- \foreach \qty/\snk@subnodename in {##3}{\sankeynode{as={\snk@subnodename}}}
- \endgroup
+\NewDocumentCommand\snk@sankeyturn{sO{}mm}{%
+ % *(reverse), options, name, angle
+ \snk@errorifnotdefined{#3}
+ \begingroup
+ \edef\snk@anglesign{\fpeval{sign(#4)}}
+ \IfBooleanTF{#1}{
+ \ifnumgreater{\snk@anglesign}{-1}
+ {\sankeyturnleftbackward[#2]{#3}{#4}}
+ {\sankeyturnrightbackward[#2]{#3}{-1*#4}}
+ }{
+ \ifnumgreater{\snk@anglesign}{-1}
+ {\sankeyturnleft[#2]{#3}{#4}}
+ {\sankeyturnright[#2]{#3}{-1*#4}}
}
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\sankeyqtytolen}
-%
-% The \code{\sankeyqtytolen} macro converts quantity
-% to length using \code{\fpeval} and the ratio determined
-% by \code{\snk@totalqty} and \code{\snk@totallen}.
+% \begin{macro}{\snk@sankeyfork}
+%
+% The \code{\snk@sankeyfork} macro forks the Sankey node named
+% \code{#2} to the list of subnodes given by \code{#3}.
+% The subnodes are cloned to take into account
+% the \code{debug} option.
+%
+% \begin{macrocode}
+\NewDocumentCommand\snk@sankeyfork{O{}mm}{%options, name, list of forks
+ \snk@errorifnotdefined{#2}
+ \begingroup
+ \sankeyset{#1}
+ \sankeynode[debug=false]{as={#2},forked={#3}}
+ \foreach \qty/\snk@subnodename in {#3}{\sankeynode{as={\snk@subnodename}}}
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\snk@sankeyqtytolen}
+%
+% The \code{\snk@sankeyqtytolen} macro converts quantity to length
+% using \code{\fpeval} and the ratio determined by
+% \code{\snk@totalqty} and \code{\snk@totallen}.
%
% \begin{macrocode}
- \def\sankeyqtytolen##1{\fpeval{(##1)/\snk@totalqty*\snk@totallen}}
+\NewExpandableDocumentCommand\snk@sankeyqtytolen{m}{%
+ \fpeval{(#1)/\snk@totalqty*\snk@totallen}%
+}
% \end{macrocode}
% \end{macro}
%
%^^A % ------------------------------------------------------------
-% \subsection{The \protect\texttt{sankeydiagram} environment (the end)}
+% \subsection{The \protect\ttintitle{sankeydiagram} environment}
%^^A % ------------------------------------------------------------
%
-% Here is the end of the definition of the \code{sankeydiagram}
-% environment. The \code{@initial options} style and the %
-% \code{every diagram} style are applied before options provided by
-% user.
+%
+% \begin{environment}{sankeydiagram}
+%
+% \changes{v3.0.2}{2025/01/10}{Simplification of the environment by copying internal macros}
+%
+% The \code{sankeydiagram} environment allows the creation of Sankey
+% diagrams.
+%
+% \DescribeMacro{\sankeyadvance}%
+% \DescribeMacro{\sankeydubins}%
+% \DescribeMacro{\sankeyend}%
+% \DescribeMacro{\sankeyfork}%
+% \DescribeMacro{\sankeynodealias}%
+% \DescribeMacro{\sankeynodeend}%
+% \DescribeMacro{\sankeynodestart}%
+% \DescribeMacro{\sankeynode}%
+% \DescribeMacro{\sankeyoutin}%
+% \DescribeMacro{\sankeyqtytolen}%
+% \DescribeMacro{\sankeystart}%
+% \DescribeMacro{\sankeyturnleftbackward}%
+% \DescribeMacro{\sankeyturnleft}%
+% \DescribeMacro{\sankeyturnrightbackward}%
+% \DescribeMacro{\sankeyturnright}%
+% \DescribeMacro{\sankeyturn}%
+% It defines locally all the macros used by a Sankey diagram.
+%
+% Then it applies the \code{@initial options} and \code{every diagram}
+% styles (in this order) and applies all the keys provided in its
+% optional argument.
%
% \begin{macrocode}
+\NewDocumentEnvironment{sankeydiagram}{O{}}{
+ \NewCommandCopy{\sankeyadvance}{\snk@sankeyadvance}
+ \NewCommandCopy{\sankeydubins}{\snk@sankeydubins}
+ \NewCommandCopy{\sankeyend}{\snk@sankeyend}
+ \NewCommandCopy{\sankeyfork}{\snk@sankeyfork}
+ \NewCommandCopy{\sankeynodealias}{\snk@sankeynodealias}
+ \NewCommandCopy{\sankeynodeend}{\snk@sankeynodeend}
+ \NewCommandCopy{\sankeynodestart}{\snk@sankeynodestart}
+ \NewCommandCopy{\sankeynode}{\snk@sankeynode}
+ \NewCommandCopy{\sankeyoutin}{\snk@sankeyoutin}
+ \NewCommandCopy{\sankeyqtytolen}{\snk@sankeyqtytolen}
+ \NewCommandCopy{\sankeystart}{\snk@sankeystart}
+ \NewCommandCopy{\sankeyturnleftbackward}{\snk@sankeyturnleftbackward}
+ \NewCommandCopy{\sankeyturnleft}{\snk@sankeyturnleft}
+ \NewCommandCopy{\sankeyturnrightbackward}{\snk@sankeyturnrightbackward}
+ \NewCommandCopy{\sankeyturnright}{\snk@sankeyturnright}
+ \NewCommandCopy{\sankeyturn}{\snk@sankeyturn}
\sankeyset{
@initial options,
every diagram,
@@ -4097,7 +4137,7 @@
% \fi
%
%^^A % ------------------------------------------------------------
-% \section{\texttt{tikzlibrarydubins.code.tex}}
+% \section{\ttintitle{tikzlibrarydubins.code.tex}}
%^^A % ------------------------------------------------------------
%
% Not yet documented nor commented...
@@ -4108,8 +4148,8 @@
% \begin{macro}{\tikzlibrarydubins@version}
% \begin{macro}{\tikzlibrarydubins@date}
% \begin{macrocode}
-\def\tikzlibrarydubins@version{v3.0.1}
-\def\tikzlibrarydubins@date{2022/02/04}
+\def\tikzlibrarydubins@version{v3.0.2}
+\def\tikzlibrarydubins@date{2025/01/10}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -4453,7 +4493,8 @@
+\dbp@rsrlen
+angtodist(\dbp@rsrangtwo,\dbp@radius)
}
- \dbp@setparams{rsr}{\dbp@rsrdist}{\dbp@rsrangone}{\dbp@rsrlen}{\dbp@rsrangtwo}
+ \dbp@setparams%
+ {rsr}{\dbp@rsrdist}{\dbp@rsrangone}{\dbp@rsrlen}{\dbp@rsrangtwo}
% LSL (al and bl)
\dbp@anglebetween\dbp@lslalbl{\p{al}}{\p{bl}}
@@ -4564,21 +4605,29 @@
%
% \PrintChanges
%
-% \setcounter{IndexColumns}{2}
-% \PrintIndex
-%
+% {
+% \setcounter{IndexColumns}{2}
+% \let\code\relax
+% \IndexPrologue{\section{Index} Italic numbers refer page where the
+% corresponding entry is described; Underlined numbers refer to the
+% code line of the definition; Roman numbers refer to the code lines
+% where the entry is used.}
+%
+% \PrintIndex
+% }
% \Finale
%
% \iffalse
-%<*sankeydocpreamble>
+%<*sankey-doc-preamble>
\usepackage[paper=a4paper,vmargin=1.5cm,left=4.5cm,right=3.5cm,marginparwidth=3.5cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{cmap}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
+\usepackage{inconsolata}
\usepackage[final,protrusion=true,expansion=true]{microtype}
\usepackage{xcolor}
-\PassOptionsToPackage{final,colorlinks,linkcolor=red!60!orange!85!black}{hyperref}
+\PassOptionsToPackage{final,colorlinks,linkcolor=cyan!25!blue!75!black}{hyperref}
\usepackage{dtxdescribe}
\usepackage[numbered]{hypdoc}
\usepackage{fancyvrb}
@@ -4743,17 +4792,17 @@
% \vspace{.25\baselineskip plus .25\baselineskip minus 0mm}
\parfillskip 0pt plus 1fil%
\leavevmode%
- \DescribeKey{\key}%
+ \expandafter\DescribeKey\expandafter{\key}%
\ttfamily%
%\hspace*{-1cm}%
\textcolor{red!75!black}{\texttt{\docprefix{\keypath/}\key}}%
\ifdefempty{\val}{}{=\val}%
\hfill%
- \ifdefempty{\default}{\null}{(default:\,\constant{\default})}%
- \ifdefempty{\initially}{\null}{(initially:\,\constant{\initially})}%
+ \ifdefempty{\default}{\null}{{\rmfamily (default:\,\constant{\default})}}%
+ \ifdefempty{\initially}{\null}{{\rmfamily (initially:\,\constant{\initially})}}%
\mynobreakpar%
\endgroup%
- \parskip=.5\baselineskip plus .25\baselineskip minus .25\baselineskip
+ \parskip=.5\baselineskip plus .25\baselineskip minus .3\baselineskip
\parfillskip=30pt plus 1fil
\itemize[topsep=0pt,partopsep=0pt,itemsep=0pt]\item[]
}{%
@@ -4809,37 +4858,7 @@
\footnotesize
}
-\renewcommand*{\DescribeMacro}[2][]{%
- \@bsphack%
- \@ifundefined{@captype}{% not float?
- \leavevmode%
- \marginpar{%
- \hbadness=10000%
- \hfuzz=5em%
- \raggedleft%
- \ifblank{#1}{}{{\scriptsize\textsf{[#1]}} }% class
- \MacroFont\cmd{#2}% name
- }% marginpar
- }{}% not float?
- \begingroup%
- \DTXD@origwrindex{%
- \DTXD@macroname{#2}\actualchar\DTXD@verbatimcmd{#2}% name
- \ifblank{#1}{}{\levelchar[#1]}% class
- \encapchar usage}%
- \ifblank{#1}%
- {}% no class
- {% class given
- \begingroup%
- \DTXD@origwrindex{%
- #1\actualchar[#1]:\levelchar%
- \DTXD@macroname{#2}\actualchar\DTXD@verbatimcmd{#2}%
- \encapchar usage}%
- }% class given
- \@esphack%
- \ignorespaces%
-}
-
-%</sankeydocpreamble>
+%</sankey-doc-preamble>
% \fi
\endinput
diff --git a/graphics/pgf/contrib/sankey/sankey.ins b/graphics/pgf/contrib/sankey/sankey.ins
index ab11ca1dc1..d6df36b89f 100644
--- a/graphics/pgf/contrib/sankey/sankey.ins
+++ b/graphics/pgf/contrib/sankey/sankey.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2016, 2021 by Paul Gaborit
+%% Copyright (C) 2016-2022 by Paul Gaborit
%%
%% This work may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3 of this license
@@ -31,7 +31,7 @@
This is a generated file.
-Copyright (C) 2016, 2021 by Paul Gaborit
+Copyright (C) 2016-2022 by Paul Gaborit
This work may be distributed and/or modified under the conditions of the
LaTeX Project Public License, either version 1.3 of this license or (at
@@ -65,7 +65,7 @@ sankey-example-energy.tex
\file{sankey-example3.tex}{\nopreamble\nopostamble\from{sankey.dtx}{example3}}%
\file{sankey-example3-variation.tex}{\nopreamble\nopostamble\from{sankey.dtx}{example3-variation}}%
\file{sankey-example4.tex}{\nopreamble\nopostamble\from{sankey.dtx}{example4}}%
- \file{sankey-doc-preamble.sty}{\from{sankey.dtx}{sankeydocpreamble}}%
+ \file{sankey-doc-preamble.sty}{\from{sankey.dtx}{sankey-doc-preamble}}%
}
\Msg{*********************************************************}
@@ -82,4 +82,4 @@ sankey-example-energy.tex
\Msg{* Happy TeXing!}
\Msg{*********************************************************}
-\endbatchfile \ No newline at end of file
+\endbatchfile
diff --git a/graphics/pgf/contrib/sankey/sankey.pdf b/graphics/pgf/contrib/sankey/sankey.pdf
index 97bf902ff4..e9acaad541 100644
--- a/graphics/pgf/contrib/sankey/sankey.pdf
+++ b/graphics/pgf/contrib/sankey/sankey.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/sunpath/README.md b/graphics/pgf/contrib/sunpath/README.md
new file mode 100644
index 0000000000..108f45025d
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/README.md
@@ -0,0 +1,60 @@
+# `sunpath` -- Draw Sun Path #
+
+
+(C) 2024 Hồng-Phúc Bùi
+
+
+## Description ##
+
+This package provides tool to draw a sunpath chart like this:
+
+![sunpath chart](https://raw.githubusercontent.com/hpb-htw/sunpath/refs/heads/master/sunpath.track.svg)
+
+## Licence ##
+
+
+This package may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+License or any later version. The latest version
+of this license is in the file https://www.latex-project.org/lppl.txt
+
+## Build and Install (for Distributor) ##
+
+
+* To build the style file `sunpath.sty` just run **one** of
+
+```
+latex sunpath.ins
+pdflatex sunpath.ins
+xelatex sunpath.ins
+lualatex sunpath.ins
+```
+
+then you can copy `sunpath.sty` to your local `texmf` tree, where latex can find it.
+
+* To create PDF Document manual you must use `lualatex` via `l3build doc`:
+
+```
+l3build doc
+```
+
+You also need the TikZ-library hobby to create the curve.
+
+```
+\usetikzlibrary{hobby}
+```
+
+(`lualatex` because of my name, really ego right! It needs unicode to be typeset correctly.)
+
+## Development ##
+
+
+I try to use latex3 as much as posible. You can use
+
+```
+l3build doc
+```
+
+to create the style file and documentation files at once. You can also (like I also do) use `make`
+to call repeatly tasks.
+
diff --git a/graphics/pgf/contrib/sunpath/horizontal-coordinate.pdf b/graphics/pgf/contrib/sunpath/horizontal-coordinate.pdf
new file mode 100644
index 0000000000..676516d93d
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/horizontal-coordinate.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/sunpath/horizontal-coordinate.tex b/graphics/pgf/contrib/sunpath/horizontal-coordinate.tex
new file mode 100644
index 0000000000..2d121e761e
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/horizontal-coordinate.tex
@@ -0,0 +1,183 @@
+\documentclass[tikz]{standalone}
+
+\usepackage{fontspec}
+\usepackage{mathtools}
+\usepackage{unicode-math}
+\usepackage{siunitx}
+
+\newcommand{\az}{\ensuremath{\Phi}}
+\newcommand{\el}{\ensuremath{\theta}}
+
+% Tikz Style
+\usepackage{tikz}
+
+\usetikzlibrary{decorations.markings}
+\usetikzlibrary{arrows.meta}
+
+\usepackage{pgfplots}
+\pgfplotsset{
+ compat=1.18
+ ,width=15cm
+ ,lua debug
+}
+
+\definecolor{celestial}{rgb}{1,0,1}%{0.0, 0.51, 0.5}
+\definecolor{elevation}{rgb}{0,1,0}%{0.6, 0.4, 0.8}
+\definecolor{horizon}{rgb}{0,0,1}%{0.54, 0.81, 0.94}
+\definecolor{sun}{rgb}{0.83, 0.0, 0.25}
+
+\tikzstyle{help circle} = [dashed, thick]
+\tikzstyle{coordinate curve} = [ultra thick]
+\tikzstyle{sun position} = [color=sun,ultra thick]
+\tikzstyle{navi direction} = [font=\sffamily\Large]
+\tikzstyle{coordinate angle} = [font=\Large]
+\tikzstyle{base plane} = [font=\sffamily]
+
+\begin{document}
+\begin{tikzpicture}
+\begin{axis}[view={5}{5}
+ ,axis lines=none,
+ ,plot box ratio={1 1 1}
+ ,xlabel=$x$
+ ,ylabel=$y$
+ ,zlabel=$z$
+ ,xmin=-1.4
+ ,xmax=1.4
+% ,ymin=-1.2
+% ,ymax=1.2
+% ,zmin=-1.2
+% ,zmax=1.2
+ ,declare function={
+% Sun position
+ azimuth=-110; % Positive = westward from north
+ elevation = 65; % Positive = from Horizon to Zenith
+ sunx = cos(azimuth)*cos(elevation);
+ suny = sin(azimuth)*cos(elevation);
+ sunz = sin(elevation);
+% Text Az coordinates
+ textazx = cos(3/5*azimuth);
+ textazy = sin(3/5*azimuth);
+ textazz = 0;
+% Text El coordinates
+ textelx = cos(azimuth)*cos(elevation/2);
+ textely = sin(azimuth)*cos(elevation/2);
+ textelz = sin(elevation/2);
+% Celestial Meridian
+ ucx = 1;
+ ucy = 0;
+ ucz = 0;
+%
+ vcx = 0;
+ vcy = 0;
+ vcz = 1;
+ celestialx(\t) = cos(\t)*ucx + sin(\t)*vcx;
+ celestialy(\t) = cos(\t)*ucy + sin(\t)*vcy;
+ celestialz(\t) = cos(\t)*ucz + sin(\t)*vcz;
+% Horizon => Azimut
+ uhx = 1;
+ uhy = 0;
+ uhz = 0;
+%
+ vhx = 0;
+ vhy = 1;
+ vhz = 0;
+ horizonx(\t) = cos(\t)*uhx + sin(\t)*vhx;
+ horizony(\t) = cos(\t)*uhy + sin(\t)*vhy;
+ horizonz(\t) = cos(\t)*uhz + sin(\t)*vhz;
+% Elevation
+ uex = cos(azimuth);
+ uey = sin(azimuth);
+ uez = 0;
+%
+ vex = 0;
+ vey = 0;
+ vez = 1;
+ elevationx(\t) = cos(\t)*uex + sin(\t)*vex;
+ elevationy(\t) = cos(\t)*uey + sin(\t)*vey;
+ elevationz(\t) = cos(\t)*uez + sin(\t)*vez;
+ }
+]
+%
+\draw[->] (0,0,0) -- (1.1,0,0) node[anchor=west,navi direction] {North};
+\draw[->] (0,0,0) -- (0,-1.5,0) node[anchor=north,navi direction] {East};
+\draw[->] (0,0,0) -- (0,0,1.1) node[anchor=south,navi direction] {Zenith};
+\node at ( 0.71, 0,0.71)[anchor=west,outer sep=1ex,base plane] {Meridian}; %0.71 app sqrt(2)/2
+\node at (-0.71, 0.71,0) [anchor=south,base plane] {Horizon};
+% Plot the Meridian through Nord
+\addplot3 [
+ domain=0:360,
+ samples=60,
+ samples y=1,
+ variable=t,
+ celestial,help circle
+] (
+ {celestialx(t)},
+ {celestialy(t)},
+ {celestialz(t)}
+);
+% Plot the horizon circle
+\addplot3 [
+ domain=0:360,
+ samples=60,
+ samples y=1,
+ variable=t,
+ horizon,help circle
+] (
+ {horizonx(t)},
+ {horizony(t)},
+ {horizonz(t)}
+);
+% Plot the azimuth curve
+\addplot3 [
+ domain=0:azimuth+0.5,
+ samples=60,
+ samples y=1,
+ variable=t,
+ horizon,coordinate curve,
+ postaction={decorate},
+ decoration={markings,
+ mark=at position 0.55 with {\arrow{Latex[round]}}
+ }
+] (
+ {horizonx(t)},
+ {horizony(t)},
+ {horizonz(t)}
+);
+% Plot the great circle through the sun
+\addplot3 [
+ domain=0:360,
+ samples=60,
+ samples y=1,
+ variable=t,
+ elevation,help circle
+] (
+ {elevationx(t)},
+ {elevationy(t)},
+ {elevationz(t)}
+);
+% Plot the elevation curve
+\addplot3 [
+ domain=0.5:elevation,
+ samples=60,
+ samples y=1,
+ variable=t,
+ elevation,coordinate curve,
+ postaction={decorate},
+ decoration={markings,
+ mark=at position 0.5 with {\arrow{Latex[round]}}
+ }
+] (
+ {elevationx(t)},
+ {elevationy(t)},
+ {elevationz(t)}
+) ;
+\draw [-{Latex[round]}, sun position] (0,0,0) -- (sunx, suny, sunz) node[anchor=south east,inner sep=0] {$\odot$};
+\draw [sun position, thin](0,0,0) -- (uex, uey, 0);
+\node at (textazx, textazy, textazz) [anchor=north,coordinate angle] {\az};
+\node at (textelx, textely, textelz) [anchor=east ,coordinate angle] {\el};
+\end{axis}
+\end{tikzpicture}
+
+\end{document}
+
+
diff --git a/graphics/pgf/contrib/sunpath/releasenote.txt b/graphics/pgf/contrib/sunpath/releasenote.txt
new file mode 100644
index 0000000000..e13301084a
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/releasenote.txt
@@ -0,0 +1,2 @@
+* [breaking change] Rename prefix draw to sp in exposed command
+* [intern] let build.lua also check release date
diff --git a/graphics/pgf/contrib/sunpath/sunpath.article.pdf b/graphics/pgf/contrib/sunpath/sunpath.article.pdf
new file mode 100644
index 0000000000..0f68980307
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.article.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/sunpath/sunpath.article.tex b/graphics/pgf/contrib/sunpath/sunpath.article.tex
new file mode 100644
index 0000000000..0904568fec
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.article.tex
@@ -0,0 +1,39 @@
+\documentclass{article}
+
+\usepackage{fontspec}
+\usepackage{luaotfload}
+\usepackage{tikz}
+\usepackage{graphicx}
+\usepackage{float}
+
+\usepackage{sunpath}
+
+\usetikzlibrary{hobby} % this library let one connect points to curve.
+
+\newcommand{\TikZ}{Ti\textit{k}Z}
+
+\title{
+ \textsf{sunpath} -- Draw Sun Path\\
+ (Test Compatibility only)
+}%
+%
+\author{%
+ Hồng-Phúc Bùi%
+}
+
+
+
+\begin{document}
+%
+\parindent0pt
+%
+\maketitle
+\tableofcontents
+
+\section{Object}
+
+This file tests if this package can be used within a \texttt{article} class.
+
+\input{sunpath.docpart.tex}
+
+\end{document}
diff --git a/graphics/pgf/contrib/sunpath/sunpath.docpart.tex b/graphics/pgf/contrib/sunpath/sunpath.docpart.tex
new file mode 100644
index 0000000000..810bc8c6b9
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.docpart.tex
@@ -0,0 +1,447 @@
+\section{Documentation}
+
+\subsection{Context and Terms}
+The position of the sun from perspective of an observer is defined by two parameters:
+
+\begin{itemize}
+ \item the azimuth $\Phi$, which tells the observer, how far (in degree) he must turn around from the North direction,
+ \item the altitude $\theta$, which tells the observer, how height (in degree) about the horizon he must look to see the sun.
+\end{itemize}
+The azimuth can take a value in the interval $[0,360)$.
+The altitude can take a value in the interval $[0,90]$, whereas 0 is the horizon, 90 is the zenith.
+We do not care so much about how far is the sun, so we normalize this distance to 1.
+
+
+The figure~\ref{fig:hz-coordinate} shows these parameter.
+The coordinate system, which takes the position of the observer as the centre,
+and the observer's local horizon as the fundamental plane,
+is called horizontal coordinate system.\footnote{dt.: topozentrisches Koordinatensystem}
+
+\begin{figure}[H]
+\centering
+\includegraphics[scale=0.75]{horizontal-coordinate.pdf}
+\caption{Horizontal coordinate system}
+\label{fig:hz-coordinate}
+\end{figure}
+
+In this package, the cardinal points have specifics values of azimuth as following:
+
+\begin{tabular}{c c c c}
+North & East & South & West \\
+0° & 90° & 180° & 270°
+\end{tabular}
+
+
+The projection of the sun on the horizon plane is a point, which can be defined by two parameters:
+\begin{itemize}
+\item the angle $\Phi$,
+\item the distance $r = \cos(\theta)$ from the centre to the sun.
+\end{itemize}
+
+Figure~\ref{fig:sun-projection} shows the projection of the sun on the horizontal plane.
+If we track the position of sun on the horizontal plane changes from time to time, we will get a curve.
+This curve is called the sun path.
+A chart which shows position of the sun from time to time is called a sun path chart.
+Of course there are many type of sun path chart.
+This package provides tools to plot sun path on the horizontal plane.
+
+\begin{figure}[H]
+\centering
+\begin{tikzpicture}[spradius=3]
+\spcrosshair
+\spaltitudecircle{{0}}
+\spgeodirection[0pt]
+\path[draw=red,fill=red](sunpath cs:azi=110,alt=66) circle[radius=2pt] ;
+\end{tikzpicture}
+\caption{Projection of the sun on the horizon plane}
+\label{fig:sun-projection}
+\end{figure}
+
+
+\subsection{Draw a Sun path chart}
+
+Figure~\ref{fig:sun-projection} is a very rudimentary sun path chart.
+There is neither scalar, nor time on the chart.
+A more usable Sun path chart may look like one in the figure~\ref{fig:full-sun-path-chart}.
+In this section we will create this chart.
+
+
+\begin{figure}[H]
+\centering
+\begin{tikzpicture}
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+
+\spazimuthtick
+
+\spgeodirection
+\spaltitudelabel{{10,20,...,80,85}}
+\spazimuthlabel{{0,15,...,350}}
+
+\path[draw=red,fill=red](sunpath cs:azi=110,alt=66) circle[radius=2pt] node[below] {{9:30}};
+\end{tikzpicture}
+\caption{A Sun path chart}
+\label{fig:full-sun-path-chart}
+\end{figure}
+
+\subsubsection{Outlines}
+
+User has to place \verb:\usepackage{sunpath}: in the preamble part of the document.
+
+The chart is a \TikZ-picture, so we need a \texttt{tikzpicture}-environment.
+We can also customize the distance from the centre of the chart to the horizon line by setup the option \texttt{spradius}.
+By default it is 5.5 in PGF xy coordinate.
+In this example we make it a little bigger:
+
+\marginpar{\texttt{spradius}}
+\begin{verbatim}
+\begin{tikzpicture}[spradius=6]
+\end{tikzpicture}
+\end{verbatim}
+
+We also need the crosshair, the horizon line --in this type of sun path chart it is a circle--,
+the fours geographic direction.
+This can be done by adding more commands into the \texttt{tikzpicture}
+
+\begin{verbatim}
+\begin{tikzpicture}[spradius=6]
+\spcrosshair
+\spaltitudecircle{{0}}
+\spgeodirection
+\end{tikzpicture}
+\end{verbatim}
+
+\marginpar{\texttt{drawcrosshair\\ drawgeodirection\\ drawaltitudecircle}}
+\begin{tikzpicture}[spradius=6]
+\spcrosshair
+\spaltitudecircle{{0}}
+\spgeodirection
+\end{tikzpicture}
+
+
+Man has to pay attention to the double curry brackets in the command \texttt{drawaltitudecircle}.
+The outer brackets delimit the argument of the command.
+The argument of the command is a valid \TikZ-range, which is used in a \verb:\foreach: command,
+so it has be placed in between a pair of curry bracket.
+That is the inner brackets.
+
+
+\subsubsection{Scalar and labels}
+
+
+As the name of the commando says, we can also draw more than the horizon line by adding some values of altitude in the range of the argument of the command \verb|\spaltitudecircle|.
+For example \verb:\spaltitudecircle{{0,10,...,80,85}}: draws 10 circles of altitude.
+
+\marginpar{\texttt{drawaltitudecircle}}
+\begin{verbatim}
+\begin{tikzpicture}[spradius=6]
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spgeodirection
+\end{tikzpicture}
+\end{verbatim}
+
+\begin{tikzpicture}[spradius=6]
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spgeodirection
+\end{tikzpicture}
+
+
+We can use the command \verb:\drawazumuthline{r}{h}{l}: to draw azimuth lines in range \verb:r:,
+from the higher altitude \verb:h: to the lower altitude \verb:l:.
+
+For example
+
+\begin{itemize}
+ \item \verb:\spazimuthline{{0,10,...,360}}{85}{70}: draws every 10° azimuth from the 85° altitude to to 70° altitude.
+ \item \verb:\spazimuthline{{0,5,...,360}}{80}{0}: draws every 5° azimuth from the 80° altitude to to 0° altitude.
+\end{itemize}
+
+\begin{verbatim}
+\begin{tikzpicture}[spradius=6]
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+
+\spgeodirection
+\end{tikzpicture}
+\end{verbatim}
+
+\marginpar{\texttt{drawazimuthline}}
+\begin{tikzpicture}[spradius=6]
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+
+\spgeodirection
+\end{tikzpicture}
+
+To draw azimuth ticks outside the horizon line, we can use
+\verb:\spazimuthtick:.
+This command expects for now no argument.
+
+\begin{verbatim}
+\begin{tikzpicture}[spradius=6]
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+\spazimuthtick
+
+\spgeodirection
+\end{tikzpicture}
+\end{verbatim}
+
+\marginpar{\texttt{drawazimuthtick}}
+\begin{tikzpicture}[spradius=6]
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+\spazimuthtick
+
+\spgeodirection
+\end{tikzpicture}
+
+
+To draw labels of azimuth lines and altitude circles in the chart, we can use the commands
+
+\verb:\spaltitudelabel{r}: and
+
+\verb:\spazimuthlabel{r}:.
+
+\begin{tikzpicture}[spradius=6]
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+\spazimuthtick
+
+\spaltitudelabel{{10,20,...,80,85}}
+\spazimuthlabel{{0,15,...,350}}
+\spgeodirection
+\end{tikzpicture}
+
+That it's, now we have a nice chart, on which we can draw positions of the sun from time to time.
+
+\subsubsection{Position of the sun}
+
+We can easily plot the position of the sun in the chart with the coordinate \texttt{sunpath},
+if the azimuth and the altitude are given.
+For example, to plot the position of the sun with 150° Azimuth and 22° Altitude,
+we just use the \texttt{path} command as following:
+
+\verb|\path[fill=red,draw=red] (sunpath cs:azi=150,alt=22);|
+
+The result would be
+
+\begin{verbatim}
+% ...
+\path[fill=red,draw=red] (sunpath cs:azi=150,alt=35) circle[radius=2pt];
+\spaltitudelabel{{10,20,...,80,85}}[160]
+% ...
+\end{verbatim}
+
+\marginpar{\texttt{sunpath cs}}
+\begin{tikzpicture}[spradius=6]
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+\spazimuthtick
+
+\path[fill=red,draw=red] (sunpath cs:azi=150,alt=35) circle[radius=2pt];
+
+\spaltitudelabel{{10,20,...,80,85}}[160]
+\spazimuthlabel{{0,15,...,350}}
+\spgeodirection
+\end{tikzpicture}
+
+The command \verb:\spaltitudelabel: can also take an optional argument to set altitude label on other azimuth.
+This can be useful if the labels cover distract important points on chart.
+In this chart it is set to be 160°. So one can easily read the azimuth of the sun on the chart.
+
+We can also connect the position of the sun to a path, for example with the positions given in the following table
+
+{\ttfamily
+\begin{tabular}{c c c}
+Time & Azimuth & Altitude \\
+07:44 & 98.968673 & -0.208672 \\
+08:00 & 102.009695 & 2.035492 \\
+10:00 & 126.513583 & 19.499874 \\
+12:00 & 156.854847 & 31.593335 \\
+14:00 & 192.292832 & 33.425294 \\
+16:00 & 224.708002 & 24.034984 \\
+18:00 & 250.626597 & 7.619801 \\
+18:53 & 260.810553 & -0.244637 \\
+\end{tabular}
+}
+
+we can get a sun path like this:
+
+\begin{tikzpicture}[spradius=6]
+\tikzset{
+ sunpath curve/.style={draw,fill=red},
+ sunpath point/.style={radius=2pt,draw=red},
+ sunpath node/.style={below,inner sep=0.5pt,outer sep=4.5pt,fill=white}
+}
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+\spazimuthtick
+
+\path[sunpath curve]
+ (sunpath cs:azi=98.968673,alt=-0.208672) circle[sunpath point] node[sunpath node]{ { 07:44 } }
+--(sunpath cs:azi=102.009695,alt=2.035492) circle[sunpath point] node[sunpath node]{ { 08:00 } }
+--(sunpath cs:azi=126.513583,alt=19.499874) circle[sunpath point] node[sunpath node]{ { 10:00 } }
+--(sunpath cs:azi=156.854847,alt=31.593335) circle[sunpath point] node[sunpath node]{ { 12:00 } }
+--(sunpath cs:azi=192.292832,alt=33.425294) circle[sunpath point] node[sunpath node]{ { 14:00 } }
+--(sunpath cs:azi=224.708002,alt=24.034984) circle[sunpath point] node[sunpath node]{ { 16:00 } }
+--(sunpath cs:azi=250.626597,alt=7.619801) circle[sunpath point] node[sunpath node]{ { 18:00 } }
+--(sunpath cs:azi=260.810553,alt=-0.244637) circle[sunpath point] node[sunpath node]{ { 18:53 } }
+;
+
+\spaltitudelabel{{10,20,...,80,85}}
+\spazimuthlabel{{0,15,...,350}}
+\spgeodirection
+\end{tikzpicture}
+
+But this chart is not nice.
+If the data is machine readable, we can generate all stuffs of the chart automatically.
+This chart below is generated from the table above.
+Just use your favourite programming language to process sun data.
+
+\begin{tikzpicture}[spradius=6]
+\tikzset{
+ sun path curve/.style={draw=red!20,thick},
+ sun point/.style={radius=2pt,draw=red,fill=red},
+ sun label/.style={below,fill=white,outer sep=4pt,text=red},
+}
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+\spazimuthtick
+
+\coordinate (P0) at (sunpath cs:azi=98.968673,alt=-0.208672);
+\coordinate (P1) at (sunpath cs:azi=102.009695,alt=2.035492);
+\coordinate (P2) at (sunpath cs:azi=126.513583,alt=19.499874);
+\coordinate (P3) at (sunpath cs:azi=156.854847,alt=31.593335);
+\coordinate (P4) at (sunpath cs:azi=192.292832,alt=33.425294);
+\coordinate (P5) at (sunpath cs:azi=224.708002,alt=24.034984);
+\coordinate (P6) at (sunpath cs:azi=250.626597,alt=7.619801);
+\coordinate (P7) at (sunpath cs:azi=260.810553,alt=-0.244637);
+\path[sun point] (P0) circle;
+\path[sun point] (P1) circle;
+\path[sun point] (P2) circle;
+\path[sun point] (P3) circle;
+\path[sun point] (P4) circle;
+\path[sun point] (P5) circle;
+\path[sun point] (P6) circle;
+\path[sun point] (P7) circle;
+\node[sun label,anchor=270-98.968673] at (P0) {07:44};
+\node[sun label,anchor=270-102.009695] at (P1) {08:00};
+\node[sun label,anchor=270-126.513583] at (P2) {10:00};
+\node[sun label,anchor=270-156.854847] at (P3) {12:00};
+\node[sun label,anchor=270-192.292832] at (P4) {14:00};
+\node[sun label,anchor=270-224.708002] at (P5) {16:00};
+\node[sun label,anchor=270-250.626597] at (P6) {18:00};
+\node[sun label,anchor=270-260.810553] at (P7) {18:53};
+\path[sun path curve] (P0) to [curve through={ (P1) .. (P2) .. (P3) .. (P4) .. (P5) .. (P6) }] (P7) ;
+
+\spaltitudelabel{{10,20,...,80,85}}[170]
+\spazimuthlabel{{0,15,...,350}}
+\spgeodirection
+\end{tikzpicture}
+
+\vfill\newpage
+The part, which makes the chart nicer, is there:
+
+\begin{verbatim}
+%...
+\coordinate (P0) at (sunpath cs:azi=98.968673,alt=-0.208672);
+\coordinate (P1) at (sunpath cs:azi=102.009695,alt=2.035492);
+\coordinate (P2) at (sunpath cs:azi=126.513583,alt=19.499874);
+\coordinate (P3) at (sunpath cs:azi=156.854847,alt=31.593335);
+\coordinate (P4) at (sunpath cs:azi=192.292832,alt=33.425294);
+\coordinate (P5) at (sunpath cs:azi=224.708002,alt=24.034984);
+\coordinate (P6) at (sunpath cs:azi=250.626597,alt=7.619801);
+\coordinate (P7) at (sunpath cs:azi=260.810553,alt=-0.244637);
+\path[sun point] (P0) circle;
+\path[sun point] (P1) circle;
+\path[sun point] (P2) circle;
+\path[sun point] (P3) circle;
+\path[sun point] (P4) circle;
+\path[sun point] (P5) circle;
+\path[sun point] (P6) circle;
+\path[sun point] (P7) circle;
+\node[sun label,anchor=270-98.968673] at (P0) {07:44};
+\node[sun label,anchor=270-102.009695] at (P1) {08:00};
+\node[sun label,anchor=270-126.513583] at (P2) {10:00};
+\node[sun label,anchor=270-156.854847] at (P3) {12:00};
+\node[sun label,anchor=270-192.292832] at (P4) {14:00};
+\node[sun label,anchor=270-224.708002] at (P5) {16:00};
+\node[sun label,anchor=270-250.626597] at (P6) {18:00};
+\node[sun label,anchor=270-260.810553] at (P7) {18:53};
+\path[sun path curve] (P0) to [curve through={
+ (P1) .. (P2) .. (P3) .. (P4) .. (P5) .. (P6)
+ }]
+ (P7) ;
+%...
+\end{verbatim}
+
+To set the altitude scale (and also the altitude lines) equidistance, just use the option \verb|altitude mapping=equidistance|.
+The chart above with same data looks like the chart below with this option.
+
+\marginpar{\texttt{altitude mapping}} \texttt{ = equidistance}
+
+\begin{tikzpicture}[spradius=6,altitude mapping=equidistance]
+\tikzset{
+ sun path curve/.style={draw=red!20,thick},
+ sun point/.style={radius=2pt,draw=red,fill=red},
+ sun label/.style={below,fill=white,outer sep=4pt,text=red},
+}
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+\spazimuthtick
+
+\coordinate (P0) at (sunpath cs:azi=98.968673,alt=-0.208672);
+\coordinate (P1) at (sunpath cs:azi=102.009695,alt=2.035492);
+\coordinate (P2) at (sunpath cs:azi=126.513583,alt=19.499874);
+\coordinate (P3) at (sunpath cs:azi=156.854847,alt=31.593335);
+\coordinate (P4) at (sunpath cs:azi=192.292832,alt=33.425294);
+\coordinate (P5) at (sunpath cs:azi=224.708002,alt=24.034984);
+\coordinate (P6) at (sunpath cs:azi=250.626597,alt=7.619801);
+\coordinate (P7) at (sunpath cs:azi=260.810553,alt=-0.244637);
+\path[sun point] (P0) circle;
+\path[sun point] (P1) circle;
+\path[sun point] (P2) circle;
+\path[sun point] (P3) circle;
+\path[sun point] (P4) circle;
+\path[sun point] (P5) circle;
+\path[sun point] (P6) circle;
+\path[sun point] (P7) circle;
+\node[sun label,anchor=270-98.968673] at (P0) {07:44};
+\node[sun label,anchor=270-102.009695] at (P1) {08:00};
+\node[sun label,anchor=270-126.513583] at (P2) {10:00};
+\node[sun label,anchor=270-156.854847] at (P3) {12:00};
+\node[sun label,anchor=270-192.292832] at (P4) {14:00};
+\node[sun label,anchor=270-224.708002] at (P5) {16:00};
+\node[sun label,anchor=270-250.626597] at (P6) {18:00};
+\node[sun label,anchor=270-260.810553] at (P7) {18:53};
+\path[sun path curve] (P0) to [curve through={ (P1) .. (P2) .. (P3) .. (P4) .. (P5) .. (P6) }] (P7) ;
+
+\spaltitudelabel{{10,20,...,80,85}}[170]
+\spazimuthlabel{{0,15,...,350}}
+\spgeodirection
+\end{tikzpicture}
+
+
diff --git a/graphics/pgf/contrib/sunpath/sunpath.dtx b/graphics/pgf/contrib/sunpath/sunpath.dtx
new file mode 100644
index 0000000000..916443f98f
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.dtx
@@ -0,0 +1,353 @@
+% \iffalse meta-comment
+%
+% File: sunpath.dtx Copyright (C) 2024 Hong-Phuc Bui
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/hpb-htw/sunpath
+%
+% for those people who are interested.
+%
+% -----------------------------------------------------------------------
+% \fi
+%
+% ^^A To get version of latex run:
+% ^^A `latex '\typeout{\fmtversion}\stop' | grep LaTeX2e`
+%
+% \iffalse
+%<package>\NeedsTeXFormat{LaTeX2e}[2022/11/01]
+%<package>\ProvidesPackage{sunpath}[2024/10/20 v0.5 Draw Sun Path]
+% \fi
+
+% \changes{v0.5}
+% {2024/10/20}
+% {replace prefix "draw" in exposed commands by "sp"}
+% \changes{v0.4-Alpha}
+% {2024/10/20}
+% {rename option altitude projection to altitude mapping}
+% \changes{v0.3-Alpha}
+% {2024/10/16}
+% {add style option in exposed commands;
+% let build.lua read version information from sunpath.dtx file}
+%
+% \changes{v0.2-Alpha}
+% {2024/10/16}
+% {Small fixes in README.md and document}
+%
+% \changes{v0.1-Alpha}
+% {2024/10/10}
+% {Initial implementation}
+
+
+% \section{Implementation}
+%
+% \subsection{Package Dependenies}
+%
+% \begin{macrocode}
+\RequirePackage{expl3}
+\RequirePackage{tikz}
+% \end{macrocode}
+%
+% Load necsessary \texttt{tikz}-libraries.
+% \begin{macrocode}
+\usetikzlibrary{calc,math,through}
+% \end{macrocode}
+
+
+
+
+% \subsection{\texttt{tikz}-Options for the new coordinate system}
+% Setup options for \texttt{tikzpicture} environment.
+%
+% \DescribeMacro{spradius} The radius of the 0° Altitude circle, default 5.5.
+% This value can be accessed via macro \verb:\spradius:.
+%
+% \DescribeMacro{altitude mapping}
+% How the altitude of the sun is mapped on the sunpath diagram.
+% This mapping is a function $f(\theta): [-90,90] \to [0, r]$, where $r$ is saved in \verb|\spradius|.
+%
+% Valid values are \texttt{spherical} and \texttt{equidistance}.
+% Its default value is \texttt{spherical}.
+%
+% This value can be accessed via macro \verb:\altmapping:.
+
+% These options can be used like:
+%
+% \begin{verbatim}
+% \begin{tikzpicture}[spradius=6,altitude projection=equidistance]
+% \coordinate (sunrise) at (sunpath cs:azi=105, alt=66.6);
+% \end{tikzpicture}
+% \end{verbatim}
+%
+% \begin{macrocode}
+\pgfkeys{/tikz/.cd,
+ spradius/.store in=\spradius,
+ spradius=5.5,
+ altitude mapping/.store in = \altmapping,
+ altitude mapping=spherical
+}
+% \end{macrocode}
+%
+
+
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Define the new coordinate system \texttt{sunpath}}
+\makeatletter
+
+% \subsubsection{Azimuth and altitude}
+% Define component \texttt{azi} (=Azimuth angle) and \texttt{alt} (=Altidude angle) for the coordinate system \texttt{sunpath}.
+% \begin{macrocode}
+\tikzset{
+ cs/azi/.store in=\tikz@cs@azi,
+ cs/alt/.store in=\tikz@cs@alt,
+}
+% \end{macrocode}
+
+
+% \subsubsection{Projection functions}
+% Funtions to map the atitude of the sun to the altitude value on the sun path diagram.
+%
+% \DescribeMacro{spherical}
+% maps an altitude angle $\theta$ to the altitude radius on the diagram with the function
+% \[s (\theta) = r \cos(\theta). \]
+%
+% \DescribeMacro{equidistance}
+% maps an altitude angle $\theta$ to the altitude radius on the diagram with the function
+% \[e (\theta) = r - r \cdot \frac{\left\lvert \theta \right\rvert}{90}. \]
+%
+% \DescribeMacro{altradius}
+% this function is used in the coordinate system \texttt{sunpath} to determinate the altitude
+% radius of an azimuth angle on the sun path chart.
+% It depends on the value of the option \verb:altitude projection:.
+%
+%
+% \DescribeMacro{aziangle}
+% maps the azimuth angle $\Phi$ to the azimuth angle on the diagram with the function
+% \[ a(\Phi) = 90 - \Phi. \]
+% \begin{macrocode}
+\tikzset{
+ declare function = {
+ spherical(\alt) = \spradius * cos(\alt);
+ equidistance(\alt) = \spradius - \spradius*abs(\alt)/90;
+ altradius(\alt) = \altmapping(\alt);
+ aziangle(\x) = 90 - \x;
+ }
+}
+% \end{macrocode}
+%
+
+
+% \subsubsection{Coordinate system \texttt{sunpath}}
+% \begin{macrocode}
+\tikzdeclarecoordinatesystem{sunpath}%
+{
+ \tikzset{cs/.cd,azi=0,alt=0,#1}
+ \tikzmath{
+ \r = altradius(\tikz@cs@alt);
+ \angle = aziangle(\tikz@cs@azi);
+ }
+ \pgfpointadd{\pgfpointxy{0}{0}}{%
+ \pgfpointpolarxy{\angle}{\r}
+ }
+}
+% \end{macrocode}
+\makeatother
+
+
+
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Setup optical options for sunpath diagram}
+% These are pre-defined \TikZ{} style for components of the chart. They can be easily changed by using \cmd{\tikzset}.
+%
+% \DescribeMacro{sunpath grid} \tikz{\draw [sunpath grid] (0,0) -- (1,0);} style for azimuth lines and altitude circles
+%
+% \DescribeMacro{sunpath tick} \tikz{\draw [sunpath tick] (0,0) -- (4pt,0);} style for ticks around the horizon line
+%
+% \DescribeMacro{sunpath minor tick} \tikz{\draw [sunpath minor tick] (0,0) -- (4pt,0);} style for minor ticks around horizon line
+%
+% \DescribeMacro{altitude label} \tikz{\node[altitude label] {80};}
+%
+% \DescribeMacro{azimuth label} \tikz{\node[altitude label] {350};} style for text label of altitude circle respective azimuth line
+%
+% \DescribeMacro{direction label} \tikz{\node[direction label] {N E S W}; } style for text label of four directions
+%
+% \begin{macrocode}
+\tikzset{
+ sunpath grid/.style={help lines,color=blue!45!white!80},
+ sunpath tick/.style={draw,thick,color=blue!90!white!80},
+ sunpath minor tick/.style={draw,thin,color=blue!90!white!80},
+ altitude label/.style={
+ font=\footnotesize\sffamily,
+ fill=white,minimum width={width("90")+2pt},
+ inner sep=0.5pt
+ },
+ azimuth label/.style={
+ font=\footnotesize\sffamily,
+ minimum width={width("360")+2pt},
+ inner sep=0.5pt
+ },
+ direction label/.style={
+ font=\normalsize\rmfamily
+ }
+}
+% \end{macrocode}
+
+
+% \subsection{Expose some commands for end-user}
+
+% \DescribeMacro{\spcrosshair} \oarg{style}
+%
+% Draws a thin line from North to South and a thin line from East to West.
+% Default value of \oarg{style} is \texttt{sunpath grid}.
+%
+% \begin{macrocode}
+\NewDocumentCommand\spcrosshair{O{sunpath grid}}{
+ \draw[#1] (-\spradius,0) -- (\spradius,0);
+ \draw[#1] (0,-\spradius) -- (0,\spradius);
+}
+% \end{macrocode}
+
+
+
+
+% \DescribeMacro{\spgeodirection} \oarg{offset}\oarg{style}
+%
+%
+% Puts four geographic directions North, East, South, West around the horinzon line.
+% \oarg{offset} is the distance from horizon to the \TikZ{} node of the directions.
+% Its default value is 22pt.
+% Set it to zero causes that the directions are set very near to the horizon line.
+% \begin{macrocode}
+\NewDocumentCommand\spgeodirection{O{22pt} O{direction label}}{
+ \foreach \dname / \dgrad in {N/0, E/90, S/180, W/270}{
+ \tikzmath{
+ \polarangle = aziangle(\dgrad);
+ }
+ \coordinate (D) at (\polarangle:\spradius cm + #1);
+ \node[#2,anchor=270-\dgrad] at (D) {\dname};
+ }
+}
+% \end{macrocode}
+
+
+
+
+% \DescribeMacro{\spaltitudecircle} \marg{range}\oarg{style}
+%
+% Draws altitude circle given by \marg{range}.
+% The argument \marg{range} must be a valid \TikZ-range, which can be used in \cmd{\foreach}.
+% For example \verb|{{10,20,...,80,85}}|.
+% The argument \oarg{style} define the style of altitude circles, default is \texttt{sunpath~grid}.
+% \begin{macrocode}
+\NewDocumentCommand\spaltitudecircle{m O{sunpath grid}}{
+ \foreach \altitude in #1 {
+ \coordinate (A) at (sunpath cs:azi=0,alt=\altitude) ;
+ \path[draw,sunpath grid] (0,0) circle[radius=altradius(\altitude)];
+ }
+}
+% \end{macrocode}
+
+
+
+
+% \DescribeMacro{\spaltitudelabel} \marg{range}\oarg{azimuth}\oarg{style}
+%
+% Draws the labels of altitude circles given by \marg{range}.
+% Range must be an in \TikZ{} valid numeric range which can be used in \cmd{\foreach}.
+% For example \verb|{{10,20,...,80}}|
+% The labels are placed along the azimuth \oarg{azimuth} (default 135)
+% and typeset with style \oarg{style} (default \texttt{altitude label}).
+%
+% \begin{macrocode}
+\NewDocumentCommand\spaltitudelabel{m O{135} O{altitude label}}{
+ \foreach \altitude in #1 {
+ \coordinate (A) at (sunpath cs:azi=#2,alt=\altitude) ;
+ \node [anchor=east,#3] at (A) {\altitude};
+ }
+}
+% \end{macrocode}
+
+
+
+
+% \DescribeMacro{\spazimuthlabel} \marg{range}\oarg{style}
+%
+% \begin{macrocode}
+\NewDocumentCommand\spazimuthlabel{m O{azimuth label}}{
+ \foreach \azimuth in #1 {
+ \tikzmath{
+ \polarangle = aziangle(\azimuth);
+ }
+ \coordinate (D) at (\polarangle:\spradius cm + 13pt);
+ \node[#2] at (D) {\azimuth};
+ }
+}
+% \end{macrocode}
+
+
+
+
+% \DescribeMacro{\spazimuthline} \marg{range}\marg{start~alt}\marg{end~alt}
+%
+% \begin{macrocode}
+\NewDocumentCommand\spazimuthline{m m m}{
+ \foreach \azimuth in #1{
+ \draw[sunpath grid]
+ (sunpath cs:azi=\azimuth,alt={#2}) -- (sunpath cs:azi=\azimuth,alt={#3});
+ }
+}
+% \end{macrocode}
+
+
+
+
+% \DescribeMacro{\spazimuthtick} \oarg{major}\oarg{minor}\oarg{mid}
+%
+% Draws ticks along and outside the horizon circle. The optional arguments \oarg{major},
+% \oarg{minor} and \oarg{mid} are the length of major ticks (every 10° from Zero),
+% minor ticks (every 1°, from 1°) and the length of the middle ticks (every 30°, from 15°).
+% Their default values are 6pt, 2.5pt and 5pt.
+%
+% \begin{macrocode}
+\NewDocumentCommand\spazimuthtick{O{6pt} O{2.5pt} O{5pt}}{
+ \foreach \azimuth in {10,20,...,360}{
+ \tikzmath{
+ \pa = aziangle(\azimuth);
+ }
+ \path[sunpath tick] (\pa:\spradius) -- (\pa:{\spradius cm + #1});
+ }
+
+ \foreach \azimuth in {1,2,...,360}{
+ \tikzmath{
+ \pa = aziangle(\azimuth);
+ }
+ \path[sunpath minor tick] (\pa:\spradius) -- (\pa:{\spradius cm + #2});
+ }
+
+ \foreach \azimuth in {15,45,...,345}{
+ \tikzmath{
+ \pa = aziangle(\azimuth);
+ }
+ \path[sunpath minor tick] (\pa:\spradius) -- (\pa:{\spradius cm + #3});
+ }
+}
+% \end{macrocode}
+
+
+
+
+%%%%%%%%%%%%%%
+\endinput
+%%%%%%%%%%%%%%
+
+
diff --git a/graphics/pgf/contrib/sunpath/sunpath.equidistance.pdf b/graphics/pgf/contrib/sunpath/sunpath.equidistance.pdf
new file mode 100644
index 0000000000..2b2c5f5c6a
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.equidistance.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/sunpath/sunpath.equidistance.tex b/graphics/pgf/contrib/sunpath/sunpath.equidistance.tex
new file mode 100644
index 0000000000..2bbc7f3cf2
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.equidistance.tex
@@ -0,0 +1,36 @@
+\documentclass{standalone}
+
+
+\usepackage{fontspec}
+\usepackage{sunpath}
+\usetikzlibrary{hobby}
+
+\usepackage{hyperref}
+
+\pagecolor{white}
+\begin{document}
+\begin{tikzpicture}[spradius=6,altitude mapping=equidistance]
+\tikzset{
+ sun path curve/.style={draw=red!20,thick},
+ sun point/.style={radius=2pt,draw=red,fill=red},
+ sun label/.style={below,fill=white,outer sep=4pt,text=red},
+}
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+\spazimuthtick
+
+
+\coordinate (P3) at (sunpath cs:azi=156.854847,alt=31.593335);
+
+\path[sun point] (P3) circle;
+
+\node[sun label,anchor=270-156.854847] at (P3) {12:00};
+
+\spaltitudelabel{{10,20,...,80,85}}
+\spazimuthlabel{{0,15,...,350}}
+\spgeodirection
+\end{tikzpicture}
+\end{document}
+
diff --git a/graphics/pgf/contrib/sunpath/sunpath.ins b/graphics/pgf/contrib/sunpath/sunpath.ins
new file mode 100644
index 0000000000..726943e315
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.ins
@@ -0,0 +1,62 @@
+\iffalse meta-comment
+
+File: sunpath.ins Copyright (C) 2024 by Hong-Phuc Bui
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version. The latest version
+of this license is in the file
+
+ https://www.latex-project.org/lppl.txt
+
+
+The released version of this bundle is available from CTAN.
+
+-----------------------------------------------------------------------
+
+The development version of the bundle can be found at
+
+ https://github.com/hpb-htw/sunpath
+
+for those people who are interested.
+
+-----------------------------------------------------------------------
+
+\fi
+
+\input l3docstrip.tex
+\askforoverwritefalse
+\usedir{tex/latex/sunpath}
+% stop DocStrip adding rather wordy text
+\preamble
+\endpreamble
+\postamble
+Copyright (C) 2024 by
+ Hong-Phuc Bui
+
+It may be distributed and/or modified under the conditions of
+the LaTeX Project Public License (LPPL), either version 1.3c of
+this license or (at your option) any later version. The latest
+version of this license is in the file:
+
+ https://www.latex-project.org/lppl.txt
+
+
+This work consists of the files sunpath.dtx,
+ sunpath.ins,
+ and the derived files sunpath.pdf,
+ sunpath.sty.
+
+\endpostamble
+
+\keepsilent
+
+\generate {%
+ \file{sunpath.sty} {%
+ \from{sunpath.dtx}{package}
+ }
+}
+
+\endbatchfile
+
+
diff --git a/graphics/pgf/contrib/sunpath/sunpath.pdf b/graphics/pgf/contrib/sunpath/sunpath.pdf
new file mode 100644
index 0000000000..77235519dd
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/sunpath/sunpath.scrartcl.pdf b/graphics/pgf/contrib/sunpath/sunpath.scrartcl.pdf
new file mode 100644
index 0000000000..78c93c271a
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.scrartcl.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/sunpath/sunpath.scrartcl.tex b/graphics/pgf/contrib/sunpath/sunpath.scrartcl.tex
new file mode 100644
index 0000000000..d3293d1792
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.scrartcl.tex
@@ -0,0 +1,39 @@
+\documentclass{scrartcl}
+
+\usepackage{fontspec}
+\usepackage{luaotfload}
+\usepackage{tikz}
+\usepackage{graphicx}
+\usepackage{float}
+
+\usepackage{sunpath}
+
+\usetikzlibrary{hobby} % this library let one connect points to curve.
+
+\newcommand{\TikZ}{Ti\textit{k}Z}
+
+\title{
+ \textsf{sunpath} -- Draw Sun Path\\
+ (Test Compatibility only)
+}%
+%
+\author{%
+ Hồng-Phúc Bùi%
+}
+
+
+
+\begin{document}
+%
+\parindent0pt
+%
+\maketitle
+\tableofcontents
+
+\section{Object}
+
+This file tests if this package can be used within a \texttt{scrartcl} class.
+
+\input{sunpath.docpart.tex}
+
+\end{document}
diff --git a/graphics/pgf/contrib/sunpath/sunpath.spherical.pdf b/graphics/pgf/contrib/sunpath/sunpath.spherical.pdf
new file mode 100644
index 0000000000..0655714ca1
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.spherical.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/sunpath/sunpath.spherical.tex b/graphics/pgf/contrib/sunpath/sunpath.spherical.tex
new file mode 100644
index 0000000000..6a231c19c7
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.spherical.tex
@@ -0,0 +1,36 @@
+\documentclass{standalone}
+
+
+\usepackage{fontspec}
+\usepackage{sunpath}
+\usetikzlibrary{hobby}
+
+\usepackage{hyperref}
+
+\pagecolor{white}
+\begin{document}
+\begin{tikzpicture}[spradius=6]
+\tikzset{
+ sun path curve/.style={draw=red!20,thick},
+ sun point/.style={radius=2pt,draw=red,fill=red},
+ sun label/.style={below,fill=white,outer sep=4pt,text=red},
+}
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+\spazimuthtick
+
+
+\coordinate (P3) at (sunpath cs:azi=156.854847,alt=31.593335);
+
+\path[sun point] (P3) circle;
+
+\node[sun label,anchor=270-156.854847] at (P3) {12:00};
+
+\spaltitudelabel{{10,20,...,80,85}}
+\spazimuthlabel{{0,15,...,350}}
+\spgeodirection
+\end{tikzpicture}
+\end{document}
+
diff --git a/graphics/pgf/contrib/sunpath/sunpath.tex b/graphics/pgf/contrib/sunpath/sunpath.tex
new file mode 100644
index 0000000000..1468c48687
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.tex
@@ -0,0 +1,61 @@
+% main document
+% separated from dtx, sothat there is no unrelated things in the dtx itselft, but only code and comment for package
+
+\documentclass{ltxdoc}
+
+\usepackage{fontspec}
+\usepackage{luaotfload}
+\usepackage{tikz}
+\usepackage{graphicx}
+\usepackage{float}
+\usepackage{mathtools}
+
+
+\usepackage{sunpath}
+
+\usetikzlibrary{hobby} % this library let one connect points to curve.
+
+\newcommand{\TikZ}{Ti\textit{k}Z}
+
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+
+\GetFileInfo{\jobname.sty}
+%
+\title{
+ \pkg{sunpath} -- Draw Sun Path%
+ \thanks{This file describes \fileversion, %
+ last revised \filedate.}\\[1ex]%
+ \normalsize{Reference}%
+}%
+%
+\author{%
+ Hồng-Phúc Bùi%
+ \thanks{%
+ E-mail:
+ \href{mailto:Hồng-Phúc Bùi}
+ {hong-phuc.bui (at) htwsaar dot de}%
+ }%
+}
+%
+\date{Released \filedate}
+
+
+\begin{document}
+%
+\parindent0pt
+%
+\maketitle
+\tableofcontents
+
+
+\input{sunpath.docpart.tex}
+
+\vfill\newpage
+% get the document about implementation inside main document
+\DocInput{\jobname.dtx}
+
+\PrintChanges
+\PrintIndex
+\end{document}
diff --git a/graphics/pgf/contrib/sunpath/sunpath.track.pdf b/graphics/pgf/contrib/sunpath/sunpath.track.pdf
new file mode 100644
index 0000000000..789e2c9230
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.track.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/sunpath/sunpath.track.tex b/graphics/pgf/contrib/sunpath/sunpath.track.tex
new file mode 100644
index 0000000000..64f7256356
--- /dev/null
+++ b/graphics/pgf/contrib/sunpath/sunpath.track.tex
@@ -0,0 +1,56 @@
+\documentclass{standalone}
+
+
+\usepackage{fontspec}
+\usepackage{sunpath}
+\usetikzlibrary{hobby}
+
+\usepackage{hyperref}
+
+\pagecolor{white}
+\begin{document}
+\begin{tikzpicture}[spradius=4]
+\tikzset{
+ sun path curve/.style={draw=red!20,thick},
+ sun point/.style={radius=2pt,draw=red,fill=red},
+ sun label/.style={below,fill=white,outer sep=3pt,inner sep=0pt,text=red},
+ small alt label/.style={altitude label,font=\scriptsize\sffamily}
+}
+\spcrosshair
+\spaltitudecircle{{0,10,...,80,85}}
+\spazimuthline{{0,10,...,360}}{85}{70}
+\spazimuthline{{0,5,...,360}}{80}{0}
+\spazimuthtick
+
+\coordinate (P0) at (sunpath cs:azi=98.968673,alt=-0.208672);
+\coordinate (P1) at (sunpath cs:azi=102.009695,alt=2.035492);
+\coordinate (P2) at (sunpath cs:azi=126.513583,alt=19.499874);
+\coordinate (P3) at (sunpath cs:azi=156.854847,alt=31.593335);
+\coordinate (P4) at (sunpath cs:azi=192.292832,alt=33.425294);
+\coordinate (P5) at (sunpath cs:azi=224.708002,alt=24.034984);
+\coordinate (P6) at (sunpath cs:azi=250.626597,alt=7.619801);
+\coordinate (P7) at (sunpath cs:azi=260.810553,alt=-0.244637);
+\path[sun point] (P0) circle;
+\path[sun point] (P1) circle;
+\path[sun point] (P2) circle;
+\path[sun point] (P3) circle;
+\path[sun point] (P4) circle;
+\path[sun point] (P5) circle;
+\path[sun point] (P6) circle;
+\path[sun point] (P7) circle;
+\node[sun label,anchor=270-98.968673] at (P0) {07:44};
+\node[sun label,anchor=270-102.009695] at (P1) {08:00};
+\node[sun label,anchor=270-126.513583] at (P2) {10:00};
+\node[sun label,anchor=270-156.854847] at (P3) {12:00};
+\node[sun label,anchor=270-192.292832] at (P4) {14:00};
+\node[sun label,anchor=270-224.708002] at (P5) {16:00};
+\node[sun label,anchor=270-250.626597] at (P6) {18:00};
+\node[sun label,anchor=270-260.810553] at (P7) {18:53};
+\path[sun path curve] (P0) to [curve through={ (P1) .. (P2) .. (P3) .. (P4) .. (P5) .. (P6) }] (P7) ;
+
+\spaltitudelabel{{10,30,40,...,80,85}}[175][small alt label]
+\spazimuthlabel{{0,15,...,350}}
+\spgeodirection
+\end{tikzpicture}
+\end{document}
+
diff --git a/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.pdf b/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.pdf
index a2c8baa025..d90be6bda7 100644
--- a/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.pdf
+++ b/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.tex b/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.tex
index 041190728b..72a56fa35d 100644
--- a/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.tex
+++ b/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.tex
@@ -50,10 +50,11 @@
\setlength{\parindent}{0pt}
\definecolor{LightGray}{gray}{0.9}
-\def\TPversion{0.1.5}
-\def\TPdate{25/02/2023}
+\def\TPversion{0.1.7}
+\def\TPdate{25/01/2025}
\usepackage[most]{tcolorbox}
+\usepackage{minted2}
\tcbuselibrary{minted}
\NewTCBListing{PresentationCode}{ O{blue} m }{%
sharp corners=downhill,enhanced,arc=12pt,skin=bicolor,%
@@ -86,9 +87,11 @@
\begin{tabular}{c}
{\Huge \texttt{TangramTikz [en]}}\\
\\
- {\LARGE Tangrams, with Ti\textit{k}Z}, \\
+ {\LARGE An extension of Ti\textit{k}Z to display Tangrams,} \\
\\
- {\LARGE with solution and/or color.} \\
+ {\LARGE outlining or not individual pieces,} \\
+ \\
+ {\LARGE with a single or individual colours} \\
\end{tabular}
\medskip
@@ -104,22 +107,22 @@
\begin{center}
\begin{tabular}{c}
\texttt{Cédric Pierquet}\\
- {\ttfamily c pierquet -- at -- outlook . fr}\\
- \texttt{\url{https://github.com/cpierquet/TangramTikz}}
+ {\ttfamily cpierquet -- at -- outlook . fr}\\
+ \texttt{\url{https://forge.apps.education.fr/pierquetcedric/packages-latex}}
\end{tabular}
\end{center}
\vspace{0.5cm}
-{$\blacktriangleright$~~Some commands to display existing Tangrams.}
+{$\blacktriangleright$~~Commands to display predefined Tangrams}
\smallskip
-{$\blacktriangleright$~~Create tangram, with postionning manually the pieces.}
+{$\blacktriangleright$~~Commands to create Tangrams by positioning individual pieces}
\smallskip
-{$\blacktriangleright$~~Idea(s) from \url{https://tex.stackexchange.com/questions/407449/typesetting-tangram-figures-in-latex}}
+{$\blacktriangleright$~~Inspired by \url{https://tex.stackexchange.com/questions/407449/typesetting-tangram-figures-in-latex}}
\vspace{1cm}
@@ -135,14 +138,14 @@
\vspace*{1cm}
\TangramTikz[Couleur=orange]<scale=1>{Maison}
- \TangramTikz[Correction]<scale=1>{Maison}
- \TangramTikz[CorrectionCouleur]<scale=1>{Maison}
+ \TangramTikz[Solution]<scale=1>{Maison}
+ \TangramTikz[ColorSolution]<scale=1>{Maison}
\TangramTikz[ListeCouleurs={blue,red,black,orange,purple},CorrectionCouleur]<scale=1>{Maison}
\end{center}
\vspace{0.5cm}
-%\hfill{}\textit{Merci aux membres du groupe \faFacebook{} du \og Coin \LaTeX{} \fg{} pour leur aide et leurs idées !}
+\hfill{}\textit{Thanks to Eric Martin, teacher-researcher in Sydney, for his careful proofreading of the English version!}
%\hfill{}\textit{Merci à Denis Bitouzé et à Patrick Bideault pour leurs retours et idées !}
@@ -171,56 +174,56 @@
\part{Introduction}
-\section{The package TangramTikz}
+\section{The TangramTikz package}
-\subsection{Source}
+\subsection{Origination}
-Some of the ideas are coming from \url{https://tex.stackexchange.com/questions/407449/typesetting-tangram-figures-in-latex}, specially from Andrew Stacey.
+Some of the ideas come from \url{https://tex.stackexchange.com/questions/407449/typesetting-tangram-figures-in-latex}, with a partial solution by Andrew Stacey.
\smallskip
-The package has been \textit{built} around the ideas from Andrew Stacey.
+The package has then been \textit{built} and \emph{modestly enriched} on the basis of the styles and methods proposed by Andrew Stacey.
-\subsection{Loading of the package, used packages}
+\subsection{Loading the package, used packages}
-The package \textsf{TangramTikz} loads into the preamble by :
+The \textsf{TangramTikz} package is loaded into the preamble using:
\begin{PresentationCode}{listing only}
\usepackage{TangramTikz}
\end{PresentationCode}
-It's fully copatible with usuals compilations, such as \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} or \textsf{xelatex}.
+It is fully compatible with the usual compilation methods, such as \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} or \textsf{xelatex}.
\medskip
-It loads the packages and libraries :
+It loads the following packages and libraries:
\begin{itemize}
- \item \texttt{tikz} awith libraries \Cle{calc} ans \Cle{shapes.geometric} ;
+ \item \texttt{tikz} with the \Cle{calc} and \Cle{shapes.geometric} libraries;
\item \texttt{xstring}, \texttt{xparse}, \texttt{simplekv} and \texttt{listofitems}.
\end{itemize}
-\subsection{The package itself}
+\subsection{Package design}
-The idea is to, thanks to \TikZ, propose \textsf{commands} to display a Tangram Puzzle :
+The aim is to leverage \TikZ\ functionality and define \textsf{commands} to display a Tangram puzzle:
\begin{itemize}
- \item with \textit{full} pieces ;
- \item by puzzle with \textit{border} pieces ;
- \item by puzzle with \textit{border colored} pieces.
+ \item without gaps between pieces, so the overall shape stands out,
+ \item or with a small gap between pieces, which are then individually recognisable,
+ \item in the latter case, with pieces that are either \textit{mono}coloured or \emph{individually} coloured.
\end{itemize}
\begin{PresentationCode}{listing only}
-%independant command to display a Tangram
+%Standalone command to display a Tangram
\TangramTikz[keys]<options tikz>{tangram_name}
\end{PresentationCode}
-There's also an \textsf{environment} and a special \textsf{command} to build the puzzle, by positionning the pieces.
+Also available are an \textsf{environment} and a special \textsf{command} to build a puzzle by positioning each piece.
\begin{PresentationCode}{listing only}
-%environment, with keys, and positionning the pieces
+%Environment, with keys, to position the pieces
\begin{EnvTangramTikz}[keys]<options tikz>
- %positionning the pieces
+ %Position each piece
\PieceTangram[keys]<options pic>(offsetH,offsetV){TangBigTri}
\PieceTangram[keys]<options pic>(offsetH,offsetH){TangBigTri}
\PieceTangram[keys]<options pic>(offsetH,offsetH){TangMedTri}
@@ -228,36 +231,36 @@ There's also an \textsf{environment} and a special \textsf{command} to build the
\PieceTangram[keys]<options pic>(offsetH,offsetH){TangSmalTri}
\PieceTangram[keys]<options pic>(offsetH,offsetH){TangSqua}
\PieceTangram[keys]<options pic>(offsetH,offsetH){TangPara}
- %\filldraw[black] (0,0) circle[radius=4pt] ; %help for positionning
+ %\filldraw[black] (0,0) circle[radius=4pt] ; %Origin to help positioning
\end{EnvTangramTikz}
\end{PresentationCode}
\pagebreak
-\part{Usage of the package}
+\part{Using the package}
-\section{Manually}
+\section{Dealing with individual pieces}
-\subsection{The pieces of the Tangram}
+\subsection{The pieces}
-A Tangram is composed by 7 pieces :
+A Tangram consists of 7 pieces:
\begin{itemize}
- \item 2 big triangles ; 1 medium triangle ; 2 small triangles ;
- \item 1 square ;
+ \item 2 large triangles; 1 medium triangle; 2 small triangles;
+ \item 1 square;
\item 1 parallelogram.
\end{itemize}
-Each piece of the Tangram is defined in \tikzlogo, by an independent \texttt{pic}..
+Each piece that makes up the Tangram is defined in \tikzlogo\ as an individual \texttt{pic}.
\medskip
-A figure to show the 5 pieces :
+Next is a figure that shows the 5 kinds of pieces, with for each of them:
\begin{itemize}
- \item with the \textcolor{purple}{\texttt{name}} of the \texttt{pic} ;
- \item with the initial \textit{orientation} ;
- \item with thier initial \textcolor{red}{\textit{origin}} ;
- \item with their common \textcolor{blue}{\textit{dimensions}} (given in \textit{unit}).
+ \item the \textcolor{purple}{\texttt{name}} of the associated \texttt{pic};
+ \item its initial \textit{orientation};
+ \item its initial \textcolor{red}{\textit{origin}};
+ \item its useful \textcolor{blue}{\textit{dimensions}} (given in \textit{unit}).
\end{itemize}
\begin{center}
@@ -312,49 +315,49 @@ A figure to show the 5 pieces :
\end{tikzpicture}
\end{center}
-Each \textit{piece} can :
+Each \textit{piece} can be:
\begin{itemize}
- \item rotated, thanks to \tikzlogo' option \texttt{rotate=...} ;
- \item fliped vertically or horizontally, thanks to \tikzlogo' option \texttt{xscale=-1} and \texttt{yscale=-1} ;
- \item moved, by placing it at point \texttt{(x,y)}.
+ \item rotated, thanks to \tikzlogo\ \texttt{rotate=...} option;
+ \item flipped vertically or horizontally, thanks to \tikzlogo\ \texttt{xscale=-1} and \texttt{yscale=-1} options;
+ \item moved, by placing its origin at the point of coordinates \texttt{(x,y)}.
\end{itemize}
-Each piece comes with a \tikzlogo' style :
+Each piece comes with a \tikzlogo\ style:
\begin{itemize}
- \item \texttt{TangPuzz} : piece of Tangram, \textit{full}, with a color (\Cle{black} by default) ;
- \item \texttt{TangSol} : piece of tangram, \textit{with white border}, with a color (\Cle{black} by default).
+ \item \texttt{TangPuzz}: Tangram piece, \textit{without border}, coloured (\Cle{black} by default);
+ \item \texttt{TangSol}: Tangram piece, \textit{with a white border}, coloured (\Cle{black} by default).
\end{itemize}
\pagebreak
-\subsection{Positionning of the pieces}
+\subsection{Positioning the pieces}
-A first methodis to use \texttt{pic} syntax in \tikzlogo{} :
+A first method is given by \tikzlogo{} \texttt{pic} syntax:
\begin{PresentationCode}{listing only}
-%environment or tikz command
+%Environment or tikz command
\pic[style,rotate=...,xscale=...,yscale=...] at (x,y) {piece_name} ;
\end{PresentationCode}
-The package \textsf{TangramTikz} proposes a specific command to place the pieces :
+The \textsf{TangramTikz} package offers a specific command to place the pieces:
\begin{PresentationCode}{listing only}
-%environment or tikz command
+%Environment or tikz command
\PieceTangram[style={color}]<xscale=...,yscale=...,rotate=...>(x,y){piece_name}
\end{PresentationCode}
-A Tangram is built form the 7 pieces, by :
+A Tangram is built from the 7 pieces, by:
\begin{itemize}
- \item \textit{putting} pieces at origin ;
- \item \textit{rotating/fliping} for the correct orientation ;
- \item \textit{translating} for the correct position.
+ \item \textit{placing} pieces at the origin;
+ \item \textit{rotating/flipping} them to give them the desired orientation;
+ \item \textit{moving} them to the desired location.
\end{itemize}
\begin{PresentationCode}{}
-%Correction colored version, initial size
+%Coloured solved version, default size
\begin{EnvTangramTikz}
\PieceTangram[TangSol={green}]({0},{0}){TangSqua}
\PieceTangram[TangSol={red}]({-1.5},{1}){TangBigTri}
@@ -365,7 +368,7 @@ A Tangram is built form the 7 pieces, by :
\PieceTangram[TangSol={orange}]({-0.5},{3}){TangMedTri}
\filldraw[black] (0,0) circle[radius=2pt] ; %help
\end{EnvTangramTikz}
-%Normal version, initial size
+%Standard version, default size
\begin{EnvTangramTikz}
\PieceTangram[TangPuzz]({0},{0}){TangSqua}
\PieceTangram[TangPuzz]({-1.5},{1}){TangBigTri}
@@ -379,50 +382,51 @@ A Tangram is built form the 7 pieces, by :
\pagebreak
-\section{Automatic Method}
+\section{Dealing with a whole shape}
\subsection{Command}
-Some predefined tangrams are present in the package \textsf{TangramTikz}, and thre's an independent \textsf{command} to "call" them :
+A collection of predefined Tangrams is included in \textsf{TangramTikz}, together with a standalone \textsf{command} to display them:
\begin{PresentationCode}{listing only}
-%independent command to display a Tangram
+%Standalone command to display a Tangram
\TangramTikz[keys]<options tikz>{tangram_name}
\end{PresentationCode}
\begin{PresentationCode}{}
-%independent command to display Cat/Boat/Kangaroo, with options by default
+%Standalone command to display Cat/Boat/Kangaroo with default options
\TangramTikz{Cat}~~\TangramTikz{Boat}~~\TangramTikz{Kangaroo}
\end{PresentationCode}
\subsection{Keys, options and arguments}
-The first argument, \textit{optional} and between \texttt{[...]}, give the keys :
+The first argument, \textit{optional} and provided within \texttt{[...]}, deals with the keys and their associated options:
\begin{itemize}
- \item the boolean \Cle{Puzzle} to display \textit{uni-}color pieces, without border ; \hfill~default : \Cle{true}
- \item the boolean \Cle{Correction} to display \textit{uni-}color pieces, with border ; \hfill~default : \Cle{false}
- \item \Cle{Color} to configure the \textit{uni-}color with the above bololeans ; \hfill~default : \Cle{black}
- \item the boolean \Cle{ColorCorrection} to display colored pieces with border ; \hfill~default : \Cle{false}
- \item \Cle{ColorList} which are the colors of the pieces (\texttt{BT,MT,ST,SQUA,PARA}) ;
+ \item the boolean \Cle{Puzzle} to display \textit{mono}coloured pieces, without border \hfill~default : \Cle{true}
+ \item the boolean \Cle{Solution} (\textsc{\textcolor{purple}{\scriptsize\textbf{new name since v0.1.7 !}}}) to display \textit{mono}coloured pieces, with a border \hfill~default : \Cle{false}
+ \item \Cle{Color} to configure the \textit{mono}colour associated with the previous booleans \hfill~default : \Cle{black}
+ \item the boolean \Cle{ColorSolution} (\textsc{\textcolor{purple}{\scriptsize\textbf{new name since v0.1.7 !}}}) to display coloured pieces, with a border \hfill~default : \Cle{false}
+ \item \Cle{ColorList} to list the colours of the pieces (\texttt{BT,MT,ST,SQUA,PARA});
\hfill~default : \Cle{red,orange,blue,green,purple}
- \item \Cle{Sep}, the width of the border in \Cle{Correction} mode. \hfill~default : \Cle{1pt}
+ \item \Cle{Sep}, the width of the border in \Cle{Solution} mode. \hfill~default : \Cle{1pt}
\end{itemize}
-The second argument, \textit{optional} ans between \texttt{<...>}, give options to the \tikzlogo{} environnement, for example :
+The second argument, \textit{optional} and within \texttt{<...>}, provides options to the \tikzlogo{} environment, for instance:
\begin{itemize}
- \item unit(s) change, scale change ;
- \item rotation, vertical alignment ;
- \item etc
+ \item change of unit
+ \item change of scale
+ \item rotation
+ \item vertical alignment
\end{itemize}
-The third argument, \textit{mandatory} and between \texttt{\{...\}} is the name of the predefined tangram (list below).
+The third argument, \textit{mandatory} and within \texttt{\{...\}}, is the name of the predefined Tangram (from the following list).
\pagebreak
-\subsection{List of predefined tangrams}
+\subsection{List of predefined Tangrams}
\texttt{\begin{multicols}{5}
\begin{itemize}
@@ -462,15 +466,16 @@ The third argument, \textit{mandatory} and between \texttt{\{...\}} is the name
\item Turtle
\item Crab
\item Snail
+ \item Goose
\end{itemize}
\end{multicols}}
\begin{PresentationCode}{}
\TangramTikz{Rocket}~~
\TangramTikz[Color=red]{Rocket}~~
-\TangramTikz[Correction]{Rocket}~~
-\TangramTikz[Correction,Color=lightgray]{Rocket}~~
-\TangramTikz[ColorCorrection,ColorList={orange,blue,yellow,green,pink},Sep=1mm]{Rocket}
+\TangramTikz[Solution]{Rocket}~~
+\TangramTikz[Solution,Color=lightgray]{Rocket}~~
+\TangramTikz[ColorSolution,ColorList={orange,blue,yellow,green,pink},Sep=1mm]{Rocket}
\TangramTikz<scale=1.5,rotate=30>{Rocket}~~
\TangramTikz<scale=0.75,rotate=-90>{Rocket}
@@ -478,228 +483,238 @@ The third argument, \textit{mandatory} and between \texttt{\{...\}} is the name
\pagebreak
-\part{Gallery of Tangrams}
+\part{A gallery of Tangrams}
\begin{PresentationCode}{}
\TangramTikz{Square}
-\TangramTikz[Correction]{Square}
-\TangramTikz[ColorCorrection]{Square}
+\TangramTikz[Solution]{Square}
+\TangramTikz[ColorSolution]{Square}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Pinguin}
-\TangramTikz[Correction]{Pinguin}
-\TangramTikz[ColorCorrection]{Pinguin}
+\TangramTikz[Solution]{Pinguin}
+\TangramTikz[ColorSolution]{Pinguin}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Boat}
-\TangramTikz[Correction]{Boat}
-\TangramTikz[ColorCorrection]{Boat}
+\TangramTikz[Solution]{Boat}
+\TangramTikz[ColorSolution]{Boat}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Home}
-\TangramTikz[Correction]{Home}
-\TangramTikz[ColorCorrection]{Home}
+\TangramTikz[Solution]{Home}
+\TangramTikz[ColorSolution]{Home}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{FirTree}
-\TangramTikz[Correction]{FirTree}
-\TangramTikz[ColorCorrection]{FirTree}
+\TangramTikz[Solution]{FirTree}
+\TangramTikz[ColorSolution]{FirTree}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Cat}
-\TangramTikz[Correction]{Cat}
-\TangramTikz[ColorCorrection]{Cat}
+\TangramTikz[Solution]{Cat}
+\TangramTikz[ColorSolution]{Cat}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Swan}
-\TangramTikz[Correction]{Swan}
-\TangramTikz[ColorCorrection]{Swan}
+\TangramTikz[Solution]{Swan}
+\TangramTikz[ColorSolution]{Swan}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Pyramid}
-\TangramTikz[Correction]{Pyramid}
-\TangramTikz[ColorCorrection]{Pyramid}
+\TangramTikz[Solution]{Pyramid}
+\TangramTikz[ColorSolution]{Pyramid}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Duck}
-\TangramTikz[Correction]{Duck}
-\TangramTikz[ColorCorrection]{Duck}
+\TangramTikz[Solution]{Duck}
+\TangramTikz[ColorSolution]{Duck}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Rocket}
-\TangramTikz[Correction]{Rocket}
-\TangramTikz[ColorCorrection]{Rocket}
+\TangramTikz[Solution]{Rocket}
+\TangramTikz[ColorSolution]{Rocket}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Candle}
-\TangramTikz[Correction]{Candle}
-\TangramTikz[ColorCorrection]{Candle}
+\TangramTikz[Solution]{Candle}
+\TangramTikz[ColorSolution]{Candle}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Shirt}
-\TangramTikz[Correction]{Shirt}
-\TangramTikz[ColorCorrection]{Shirt}
+\TangramTikz[Solution]{Shirt}
+\TangramTikz[ColorSolution]{Shirt}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Fish}
-\TangramTikz[Correction]{Fish}
-\TangramTikz[ColorCorrection]{Fish}
+\TangramTikz[Solution]{Fish}
+\TangramTikz[ColorSolution]{Fish}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Sailboat}
-\TangramTikz[Correction]{Sailboat}
-\TangramTikz[ColorCorrection]{Sailboat}
+\TangramTikz[Solution]{Sailboat}
+\TangramTikz[ColorSolution]{Sailboat}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Kangaroo}
-\TangramTikz[Correction]{Kangaroo}
-\TangramTikz[ColorCorrection]{Kangaroo}
+\TangramTikz[Solution]{Kangaroo}
+\TangramTikz[ColorSolution]{Kangaroo}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Dog}
-\TangramTikz[Correction]{Dog}
-\TangramTikz[ColorCorrection]{Dog}
+\TangramTikz[Solution]{Dog}
+\TangramTikz[ColorSolution]{Dog}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Plane}
-\TangramTikz[Correction]{Plane}
-\TangramTikz[ColorCorrection]{Plane}
+\TangramTikz[Solution]{Plane}
+\TangramTikz[ColorSolution]{Plane}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Rabbit}
-\TangramTikz[Correction]{Rabbit}
-\TangramTikz[ColorCorrection]{Rabbit}
+\TangramTikz[Solution]{Rabbit}
+\TangramTikz[ColorSolution]{Rabbit}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Rooster}
-\TangramTikz[Correction]{Rooster}
-\TangramTikz[ColorCorrection]{Rooster}
+\TangramTikz[Solution]{Rooster}
+\TangramTikz[ColorSolution]{Rooster}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Jogger}
-\TangramTikz[Correction]{Jogger}
-\TangramTikz[ColorCorrection]{Jogger}
+\TangramTikz[Solution]{Jogger}
+\TangramTikz[ColorSolution]{Jogger}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Dancer}
-\TangramTikz[Correction]{Dancer}
-\TangramTikz[ColorCorrection]{Dancer}
+\TangramTikz[Solution]{Dancer}
+\TangramTikz[ColorSolution]{Dancer}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Camel}
-\TangramTikz[Correction]{Camel}
-\TangramTikz[ColorCorrection]{Camel}
+\TangramTikz[Solution]{Camel}
+\TangramTikz[ColorSolution]{Camel}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Flamingo}
-\TangramTikz[Correction]{Flamingo}
-\TangramTikz[ColorCorrection]{Flamingo}
+\TangramTikz[Solution]{Flamingo}
+\TangramTikz[ColorSolution]{Flamingo}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Heart}
-\TangramTikz[Correction]{Heart}
-\TangramTikz[ColorCorrection]{Heart}
+\TangramTikz[Solution]{Heart}
+\TangramTikz[ColorSolution]{Heart}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Giraffe}
-\TangramTikz[Correction]{Giraffe}
-\TangramTikz[ColorCorrection]{Giraffe}
+\TangramTikz[Solution]{Giraffe}
+\TangramTikz[ColorSolution]{Giraffe}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Horse}
-\TangramTikz[Correction]{Horse}
-\TangramTikz[ColorCorrection]{Horse}
+\TangramTikz[Solution]{Horse}
+\TangramTikz[ColorSolution]{Horse}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Goat}
-\TangramTikz[Correction]{Goat}
-\TangramTikz[ColorCorrection]{Goat}
+\TangramTikz[Solution]{Goat}
+\TangramTikz[ColorSolution]{Goat}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Lions}
-\TangramTikz[Correction]{Lions}
-\TangramTikz[ColorCorrection]{Lions}
+\TangramTikz[Solution]{Lions}
+\TangramTikz[ColorSolution]{Lions}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Factory}
-\TangramTikz[Correction]{Factory}
-\TangramTikz[ColorCorrection]{Factory}
+\TangramTikz[Solution]{Factory}
+\TangramTikz[ColorSolution]{Factory}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Angel}
-\TangramTikz[Correction]{Angel}
-\TangramTikz[ColorCorrection]{Angel}
+\TangramTikz[Solution]{Angel}
+\TangramTikz[ColorSolution]{Angel}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Tower}
-\TangramTikz[Correction]{Tower}
-\TangramTikz[ColorCorrection]{Tower}
+\TangramTikz[Solution]{Tower}
+\TangramTikz[ColorSolution]{Tower}
\end{PresentationCode}
\begin{PresentationCode}{}
-\TangramTikz{Ufo}
-\TangramTikz[Correction]{Ufo}
-\TangramTikz[ColorCorrection]{Ufo}
+\TangramTikz<scale=0.75>{Ufo}
+\TangramTikz[Solution]<scale=0.75>{Ufo}
+\TangramTikz[ColorSolution]<scale=0.75>{Ufo}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Chicken}
-\TangramTikz[Correction]{Chicken}
-\TangramTikz[ColorCorrection]{Chicken}
+\TangramTikz[Solution]{Chicken}
+\TangramTikz[ColorSolution]{Chicken}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Turtle}
-\TangramTikz[Correction]{Turtle}
-\TangramTikz[ColorCorrection]{Turtle}
+\TangramTikz[Solution]{Turtle}
+\TangramTikz[ColorSolution]{Turtle}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Crab}
-\TangramTikz[Correction]{Crab}
-\TangramTikz[ColorCorrection]{Crab}
+\TangramTikz[Solution]{Crab}
+\TangramTikz[ColorSolution]{Crab}
\end{PresentationCode}
\begin{PresentationCode}{}
\TangramTikz{Snail}
-\TangramTikz[Correction]{Snail}
-\TangramTikz[ColorCorrection]{Snail}
+\TangramTikz[Solution]{Snail}
+\TangramTikz[ColorSolution]{Snail}
+\end{PresentationCode}
+
+\begin{PresentationCode}{}
+\TangramTikz<scale=0.75>{Goose}
+\TangramTikz[Solution]<scale=0.75>{Goose}
+\TangramTikz[ColorSolution]<scale=0.75>{Goose}
\end{PresentationCode}
\newpage
\part{History}
+\verb|v0.1.7|~:~~~~Bugfixes in english doc + Renaming certain keys
+
+\verb|v0.1.6|~:~~~~New models
+
\verb|v0.1.5|~:~~~~New models
\verb|v0.1.4|~:~~~~New models
diff --git a/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.pdf b/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.pdf
index 647f1eafea..46e4df411a 100644
--- a/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.pdf
+++ b/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.tex b/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.tex
index e45fbee518..334231dfd3 100644
--- a/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.tex
+++ b/graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.tex
@@ -49,10 +49,11 @@
\setlength{\parindent}{0pt}
\definecolor{LightGray}{gray}{0.9}
-\def\TPversion{0.1.5}
-\def\TPdate{25 Février 2023}
+\def\TPversion{0.1.7}
+\def\TPdate{25 janvier 2025}
\usepackage[most]{tcolorbox}
+\usepackage{minted2}
\tcbuselibrary{minted}
\NewTCBListing{PresentationCode}{ O{blue} m }{%
sharp corners=downhill,enhanced,arc=12pt,skin=bicolor,%
@@ -104,7 +105,7 @@
\begin{tabular}{c}
\texttt{Cédric Pierquet}\\
{\ttfamily c pierquet -- at -- outlook . fr}\\
- \texttt{\url{https://github.com/cpierquet/TangramTikz}}
+ \texttt{\url{https://forge.apps.education.fr/pierquetcedric/packages-latex}}
\end{tabular}
\end{center}
@@ -141,6 +142,8 @@
\vspace{0.5cm}
+\hfill{}\textit{Merci à Eric Martin, enseignant-chercheur à Sydney, pour sa relecture attentive de la version anglaise !}
+
%\hfill{}\textit{Merci aux membres du groupe \faFacebook{} du \og Coin \LaTeX{} \fg{} pour leur aide et leurs idées !}
%\hfill{}\textit{Merci à Denis Bitouzé et à Patrick Bideault pour leurs retours et idées !}
@@ -464,6 +467,7 @@ Le troisième argument, \textit{obligatoire} et entre \texttt{\{...\}} est quant
\item Tortue
\item Crabe
\item Escargot
+ \item Oie
\end{itemize}
\end{multicols}}
@@ -671,9 +675,9 @@ Le troisième argument, \textit{obligatoire} et entre \texttt{\{...\}} est quant
\end{PresentationCode}
\begin{PresentationCode}{}
-\TangramTikz{Ovni}
-\TangramTikz[Correction]{Ovni}
-\TangramTikz[CorrectionCouleur]{Ovni}
+\TangramTikz<scale=0.75>{Ovni}
+\TangramTikz[Correction]<scale=0.75>{Ovni}
+\TangramTikz[CorrectionCouleur]<scale=0.75>{Ovni}
\end{PresentationCode}
\begin{PresentationCode}{}
@@ -700,10 +704,20 @@ Le troisième argument, \textit{obligatoire} et entre \texttt{\{...\}} est quant
\TangramTikz[CorrectionCouleur]{Escargot}
\end{PresentationCode}
+\begin{PresentationCode}{}
+\TangramTikz<scale=0.75>{Oie}
+\TangramTikz[Correction]<scale=0.75>{Oie}
+\TangramTikz[CorrectionCouleur]<scale=0.75>{Oie}
+\end{PresentationCode}
+
\newpage
\part{Historique}
+\verb|v0.1.7|~:~~~~Améliorations pour la version anglaise
+
+\verb|v0.1.6|~:~~~~Nouveaux modèles
+
\verb|v0.1.5|~:~~~~Nouveaux modèles
\verb|v0.1.4|~:~~~~Nouveaux modèles
diff --git a/graphics/pgf/contrib/tangramtikz/tex/TangramTikz.sty b/graphics/pgf/contrib/tangramtikz/tex/TangramTikz.sty
index 9773eb1d11..304ae6310d 100644
--- a/graphics/pgf/contrib/tangramtikz/tex/TangramTikz.sty
+++ b/graphics/pgf/contrib/tangramtikz/tex/TangramTikz.sty
@@ -1,9 +1,11 @@
% Author.........: C. Pierquet
-% licence........: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
+% licence........: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
% Inspiration....: https://tex.stackexchange.com/questions/407449/typesetting-tangram-figures-in-latex
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{TangramTikz}[2023/02/25 v0.1.5 Tangram Puzzles with TikZ]
+\ProvidesPackage{TangramTikz}[2025/01/25 v0.1.7 Tangram Puzzles with TikZ]
+% 0.1.7 Améliorations pour la version [en]
+% 0.1.6 Ajout de modèles
% 0.1.5 Ajout de modèles
% 0.1.4 Ajout de modèles
% 0.1.3 Ajout de modèles
@@ -872,12 +874,35 @@
}%
}
+%the goose / l'oie (0.1.6)
+\NewDocumentCommand\TangramGoose{ s O{TangPuzz} }{%*=colorcorrection,[key for pic]
+ \IfBooleanTF{#1}%
+ {%
+ \PieceTangram[TangSol={\TanGListeCouleurs[1]}]<rotate=-135>({sqrt(2)},{sqrt(2)}){TangGrandTri}
+ \PieceTangram[TangSol={\TanGListeCouleurs[4]}]<rotate=-135>({0},{0}){TangCar}
+ \PieceTangram[TangSol={\TanGListeCouleurs[1]}]<rotate=-45>({-1.5*sqrt(2)},{0.5*sqrt(2)}){TangGrandTri}
+ \PieceTangram[TangSol={\TanGListeCouleurs[5]}]<xscale=-1>({1-1.5*sqrt(2)},{0.5*sqrt(2)}){TangPara}
+ \PieceTangram[TangSol={\TanGListeCouleurs[2]}]({-1.5*sqrt(2)-2},{1+0.5*sqrt(2)}){TangMoyTri}
+ \PieceTangram[TangSol={\TanGListeCouleurs[3]}]<rotate=45>({sqrt(2)},{-1.5*sqrt(2)}){TangPetTri}
+ \PieceTangram[TangSol={\TanGListeCouleurs[3]}]({-0.5},{-sqrt(2)-0.5}){TangPetTri}
+ }%
+ {%
+ \PieceTangram[#2]<rotate=-135>({sqrt(2)},{sqrt(2)}){TangGrandTri}
+ \PieceTangram[#2]<rotate=-135>({0},{0}){TangCar}
+ \PieceTangram[#2]<rotate=-45>({-1.5*sqrt(2)},{0.5*sqrt(2)}){TangGrandTri}
+ \PieceTangram[#2]<xscale=-1>({1-1.5*sqrt(2)},{0.5*sqrt(2)}){TangPara}
+ \PieceTangram[#2]({-1.5*sqrt(2)-2},{1+0.5*sqrt(2)}){TangMoyTri}
+ \PieceTangram[#2]<rotate=45>({sqrt(2)},{-1.5*sqrt(2)}){TangPetTri}
+ \PieceTangram[#2]({-0.5},{-sqrt(2)-0.5}){TangPetTri}
+ }%
+}
+
%macros for tangram creation / commandes pour créer le tangram
\NewDocumentCommand\TangramTikzCreateEN{ m }{%
\readlist*\TanGListeCouleurs{\TangColors}%
\ifboolKV[TGRMTikz]{Puzzle}{#1[TangPuzz={\TangColor}]}{}%
- \ifboolKV[TGRMTikz]{Correction}{#1[TangSol={\TangColor}]}{}%
- \ifboolKV[TGRMTikz]{ColorCorrection}{#1*}{}%
+ \ifboolKV[TGRMTikz]{Solution}{#1[TangSol={\TangColor}]}{}%
+ \ifboolKV[TGRMTikz]{ColorSolution}{#1*}{}%
}
\NewDocumentCommand\TangramTikzCreateFR{ m }{%
\readlist*\TanGListeCouleurs{\TangCouleurs}%
@@ -896,8 +921,9 @@
\setKVdefault[TGRMTikz]{%keys by default [en] and [fr]
Puzzle=true,%
Correction=false,%
- ColorCorrection=false,%
CorrectionCouleur=false,%
+ Solution=false,%en
+ ColorSolution=false,%en
ListeCouleurs={red,orange,blue,green,purple},%
ColorList={red,orange,blue,green,purple},%
Couleur=black,%
@@ -1018,6 +1044,9 @@
%SNAIL
\IfStrEq{#3}{Snail}{\TangramTikzCreateEN{\TangramSnail}}{}%
\IfStrEq{#3}{Escargot}{\TangramTikzCreateFR{\TangramSnail}}{}%
+ %GOOSE
+ \IfStrEq{#3}{Goose}{\TangramTikzCreateEN{\TangramGoose}}{}%
+ \IfStrEq{#3}{Oie}{\TangramTikzCreateFR{\TangramGoose}}{}%
\end{tikzpicture}%
}
diff --git a/graphics/pgf/contrib/tikz-bpmn/README.md b/graphics/pgf/contrib/tikz-bpmn/README.md
new file mode 100644
index 0000000000..573ad22b33
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-bpmn/README.md
@@ -0,0 +1,10 @@
+Version: 2025-01-07
+
+This Tikz library provides primitives for drawing Business Process Modelling and Notation (BPMN) models.
+It includes tasks, subprocesses, events, task markers and gateways.
+The symbols aim to follow the BPMN standard [https://www.omg.org/bpmn/] as closely as possible.
+Please refer to the documentation for further information.
+
+Author: Sander J.J. Leemans, RWTH Aachen University, Germany
+
+This material is subject to the LaTeX Project Public License 1.3c.
diff --git a/graphics/pgf/contrib/tikz-bpmn/tikz-bpmn-doc.pdf b/graphics/pgf/contrib/tikz-bpmn/tikz-bpmn-doc.pdf
new file mode 100644
index 0000000000..a896411446
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-bpmn/tikz-bpmn-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikz-bpmn/tikz-bpmn-doc.tex b/graphics/pgf/contrib/tikz-bpmn/tikz-bpmn-doc.tex
new file mode 100644
index 0000000000..d68bbd3fc7
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-bpmn/tikz-bpmn-doc.tex
@@ -0,0 +1,333 @@
+\documentclass{article}
+
+\usepackage{booktabs,multirow,tabularx,tikz,amssymb,amsmath}
+\usetikzlibrary{bpmn}
+
+\title{The Tikz BPMN package}
+\author{Sander J.J. Leemans}
+
+\begin{document}
+ \maketitle
+
+ This manual describes the BPMN Tikz package, used to draw BPMN models.
+
+ \def\event#1{
+ \eventsymbol{#1}
+ &
+ \eventcode{#1}
+ }
+
+ \def\eventsymbol#1{
+ \begin{tikzpicture}[baseline]
+ \node [#1] {};
+ \end{tikzpicture}
+ }
+ \def\eventcode#1{
+ \texttt{\textbackslash{}node [#1] \{\};}
+ }
+
+ \def\boundary#1{
+ \begin{tikzpicture}[baseline]
+ \node [task, label={[#1]225:}] {};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [task, label=\{[#1]225:\}] \{\};}
+ }
+
+ \section{Usage}
+ Place the file \texttt{tikzlibrarybpmn.code.tex} in the same folder as your .tex file, and include \verb!\usetikzlibrary{bpmn}! in the preamble of your .text file.
+
+ \subsection{Gateways}
+ \begin{tabularx}{\linewidth}{cX}
+ \toprule
+ Symbol & code\\
+ \midrule
+ \event{exclusive gateway}\newline\eventcode{xor gateway}\\
+ \event{parallel gateway}\newline\eventcode{and gateway}\\
+ \event{inclusive gateway}\newline\eventcode{or gateway}\\
+ \event{eventbased gateway}\\
+ \bottomrule
+ \end{tabularx}
+
+ \subsection{Events}
+ \begin{tabularx}{\linewidth}{cX}
+ \toprule
+ Symbol & code\\
+ \midrule
+ \event{start event}\\
+ \event{end event}\\
+ \midrule
+ \event{message start event}\\
+ \event{catching message intermediate event}\\
+ \event{throwing message intermediate event}\\
+ \event{message end event}\\
+ \midrule
+ \event{timer start event}\\
+ \eventsymbol{timer event}
+ &
+ \texttt{\textbackslash{}node [timer event] \{\};}\newline
+ \texttt{\textbackslash{}node [intermediate timer event] \{\};}
+ \\
+ \midrule
+ \event{throwing compensation intermediate event}\\
+ \event{throwing compensation end event}\\
+ \midrule
+ \eventsymbol{error event} & \eventcode{error event} \newline \eventcode{throwing error end event}\\
+ \midrule
+ \event{signal start event}\\
+ \event{catching signal intermediate event} \newline \eventcode{signal intermediate event}\\
+ \event{throwing signal intermediate event}\\
+ \event{signal end event}\\
+ \bottomrule
+ \end{tabularx}
+
+ \subsubsection{Background colour}
+ The background colour is an optional argument for several event styles, and required to be set if the background is not white for correct rendering.
+ The default can be set using
+ \verb=\colorlet{defaultbackgroundcolour}{new default colour}= after loading the package.
+
+ \subsection{Tasks \& sub-processes}
+ \begin{tabularx}{\linewidth}{cX}
+ \toprule
+ Symbol & code\\
+ \midrule
+ \begin{tikzpicture}[baseline]
+ \node [task] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [task] \{A\};}
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [compensation task] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [compensation task] \{A\};}
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [loop task] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [loop task] \{A\};} \newline
+ requires the \texttt{amssymb} and \texttt{amsmath} packages
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [multiinstance task] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [multiinstance task] \{A\};}
+ \\
+
+ \midrule
+
+ \begin{tikzpicture}[baseline]
+ \node [manual task] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [manual task] \{A\};}
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [receive task] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [receive task] \{A\};}
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [script task] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [script task] \{A\};}
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [send task] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [send task] \{A\};}
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [service task] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [service task] \{A\};}
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [user task] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [user task] \{A\};}
+ \\
+ \bottomrule
+ \end{tabularx}
+
+ \begin{tabularx}{\linewidth}{cX}
+ \toprule
+ Symbol & code\\
+ \midrule
+ \begin{tikzpicture}[baseline]
+ \node [subprocess] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [subprocess] \{A\};} \newline
+ \texttt{\textbackslash{}node [collapsed subprocess] \{A\};}
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [adhoc subprocess] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [adhoc subprocess] \{A\};} \newline
+ \texttt{\textbackslash{}node [collapsed adhoc subprocess] \{A\};}
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [compensation subprocess] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [compensation subprocess] \{A\};} \newline
+ \texttt{\textbackslash{}node [collapsed compensation subprocess] \{A\};}
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [loop subprocess] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [loop subprocess] \{A\};} \newline
+ \texttt{\textbackslash{}node [collapsed loop subprocess] \{A\};} \newline
+ requires the \texttt{amssymb} and \texttt{amsmath} packages
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [multiinstance subprocess] {A};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [multiinstance subprocess] \{A\};} \newline
+ \texttt{\textbackslash{}node [collapsed multiinstance subprocess] \{A\};}
+ \\
+
+ \midrule
+
+ \multirow{2}{*}{\begin{tikzpicture}[baseline]
+ \node [expanded subprocess] {};
+ \end{tikzpicture}}
+ &
+ \texttt{\textbackslash{}node [expanded subprocess] \{\};}\newline
+ use in combination with the \verb=fit= key
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [expanded adhoc subprocess] {};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [expanded adhoc subprocess] \{\};}\newline
+ use in combination with the \verb=fit= key
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [expanded compensation subprocess] {};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [expanded compensation subprocess] \{\};}\newline
+ use in combination with the \verb=fit= key
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [expanded loop subprocess] {};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [expanded loop subprocess] \{\};}\newline
+ use in combination with the \verb=fit= key
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [expanded multiinstance subprocess] {};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [expanded multiinstance subprocess] \{\};}\newline
+ use in combination with the \verb=fit= key
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [subprocess label=A] {};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [subprocess label=A] \{\};}\newline
+ use in combination with the \verb=fit= key
+ \\
+ \bottomrule
+ \end{tabularx}
+
+ \subsection{Event sub-processes}
+ \begin{tabularx}{\linewidth}{cX}
+ \toprule
+ Symbol & code\\
+ \midrule
+ \event{message subprocess event}\\
+ \event{timer subprocess event}\\
+ \event{signal subprocess event}\\
+ \event{compensation subprocess event}\\
+ \event{error subprocess event}\\
+ \midrule
+ \event{message noninterrupting subprocess event}\\
+ \event{timer noninterrupting subprocess event}\\
+ \event{signal noninterrupting subprocess event}\\
+ \midrule
+ \event{message event subprocess}\\
+ \event{timer event subprocess}\\
+ \event{signal event subprocess}\\
+ \event{compensation event subprocess}\\
+ \event{error event subprocess}\\
+ \midrule
+ \event{message noninterrupting event subprocess}\\
+ \event{timer noninterrupting event subprocess}\\
+ \event{signal noninterrupting event subprocess}\\
+ \bottomrule
+ \end{tabularx}
+
+ \subsection{Boundary events}
+ In the following, the number 225 controls the position of the boundary event (in degrees).
+ Naturally, a label can be used on any node.
+ To connect associations to a label, use the style \texttt{name=}.
+
+ \noindent\begin{tabularx}{\linewidth}{cX}
+ \toprule
+ Symbol & code\\
+ \midrule
+ \boundary{timer boundary event}\\
+ \boundary{message boundary event}\\
+ \boundary{signal boundary event}\\
+ \boundary{compensation boundary event}\\
+ \boundary{error boundary event}\\
+ \boundary{timer noninterrupting boundary event}\\
+ \boundary{message noninterrupting boundary event}\\
+ \boundary{signal noninterrupting boundary event}\\
+ \bottomrule
+ \end{tabularx}
+
+ All boundary events use fill to draw over the border of the parent node, and accept an argument for the fill colour.
+ The default fill colour can be changed using \verb=\colorlet{defaultbackgroundcolour}{new default colour}= after loading the package.
+
+ \subsection{Data}
+ \begin{tabularx}{\linewidth}{cX}
+ \toprule
+ Symbol & code\\
+ \midrule
+ \event{data object}\\
+ \event{data collection}\\
+ \event{data store}\\
+ \bottomrule
+ \end{tabularx}
+
+
+ \subsection{Resources}
+ \begin{tabularx}{\linewidth}{cX}
+ \toprule
+ Symbol & code\\
+ \midrule
+ \begin{tikzpicture}[baseline]
+ \node [pool] {\phantom{ABCDEF}\strut};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [pool] \{\};} \newline
+ use in combination with the \verb=fit= key
+ \\
+ \begin{tikzpicture}[baseline]
+ \node [pool label=A] {\phantom{ABCDEF}\strut};
+ \end{tikzpicture}
+ &
+ \texttt{\textbackslash{}node [pool label=A] \{\};} \newline
+ use in combination with the \verb=fit= key
+ \\
+ \bottomrule
+ \end{tabularx}
+
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz-bpmn/tikzlibrarybpmn.code.tex b/graphics/pgf/contrib/tikz-bpmn/tikzlibrarybpmn.code.tex
new file mode 100644
index 0000000000..01c9e9db19
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-bpmn/tikzlibrarybpmn.code.tex
@@ -0,0 +1,1031 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{tikz-bpmn}[2011/08/16 BPMN diagrams using the
+Tikz library]
+
+\RequirePackage{xcolor}
+\RequirePackage{tikz}
+\RequirePackage{bm}
+
+%this can be overridden to set the background colour, necessary for drawing double lines and other things.
+\colorlet{defaultbackgroundcolour}{white}
+
+\usetikzlibrary{shapes,shapes.geometric}
+\usetikzlibrary{arrows}
+\usetikzlibrary{calc}
+
+\tikzstyle{every task} = []
+\tikzstyle{every gateway} = []
+\tikzstyle{every sequence} = []
+\tikzstyle{every message} = []
+\tikzstyle{every association} = []
+\tikzstyle{every event} = []
+\tikzstyle{every intermediate event} = []
+\tikzstyle{every token} = []
+\tikzstyle{every call activity} = []
+
+\tikzstyle{task} = [rectangle, draw, minimum width=4em, minimum height=2em,rounded corners,align=center,every task]
+
+\tikzstyle{sequence} = [->,>=triangle 45,every sequence]
+\tikzstyle{reverse sequence} = [sequence,<-]
+\tikzstyle{message} = [o->,dashed,>=open triangle 45,every sequence]
+\tikzstyle{reverse message} = [message,<-o]
+\tikzstyle{association} = [densely dotted,>=angle 45,every association]
+\tikzstyle{event} = [circle,minimum width=1.5em, minimum height=1.5em,draw,every event]
+\tikzstyle{end event} = [event,ultra thick,every event]
+\tikzstyle{intermediate event}[defaultbackgroundcolour] = [event,double=#1,every event, every intermediate event]
+\tikzstyle{token} = [solid,circle,fill,inner sep=0.5mm]
+\tikzstyle{open token} = [solid,circle,draw,fill=red,inner sep=0.5mm,thick]
+
+\tikzset{fit margins/.style={/tikz/afit/.cd,#1,
+ /tikz/.cd,
+ inner xsep=\pgfkeysvalueof{/tikz/afit/left}+\pgfkeysvalueof{/tikz/afit/right},
+ inner ysep=\pgfkeysvalueof{/tikz/afit/top}+\pgfkeysvalueof{/tikz/afit/bottom},
+ xshift=-\pgfkeysvalueof{/tikz/afit/left}+\pgfkeysvalueof{/tikz/afit/right},
+ yshift=-\pgfkeysvalueof{/tikz/afit/bottom}+\pgfkeysvalueof{/tikz/afit/top}},
+ afit/.cd,left/.initial=2pt,right/.initial=2pt,bottom/.initial=2pt,top/.initial=2pt}
+
+\tikzstyle{text annotation} = [
+ font=\tiny,
+ path picture = {
+ \def\w{3mm}
+ \draw ($(path picture bounding box.north west)+(\w,0)$) to (path picture bounding box.north west) to (path picture bounding box.south west) to ($(path picture bounding box.south west)+(\w,0)$);
+ }
+]
+
+%%%%% gateways %%%%%
+
+\tikzstyle{gateway} = [
+ diamond,
+ draw,
+ inner sep=0pt,
+ minimum width=1.5em,
+ minimum height=1.5em,
+ align=center,
+ every gateway
+]
+
+\tikzstyle{and gateway} = [parallel gateway]
+\tikzstyle{parallel gateway} = [
+ gateway,
+ label=center:\Large +
+]
+
+\tikzstyle{xor gateway} = [exclusive gateway]
+\tikzstyle{exclusive gateway} = [
+ gateway,
+ label=center:\Large\texttimes
+]
+
+\tikzstyle{or gateway} = [inclusive gateway]
+\tikzstyle{inclusive gateway} = [
+ gateway,
+ path picture = {
+ \pgfpointdiff{\pgfpointanchor{path picture bounding box}{south east}}{\pgfpointanchor{path picture bounding box}{north east}}
+ \pgfmathsetmacro\d{\csname pgf@y\endcsname}
+ \node [draw, thick, circle, inner sep=0, minimum size=0.55*\d pt, anchor=center] at (path picture bounding box.center) {};
+ }
+]
+
+\tikzstyle{eventbased gateway} = [
+ gateway,
+ path picture = {
+ \pgfpointdiff{\pgfpointanchor{path picture bounding box}{south east}}{\pgfpointanchor{path picture bounding box}{north east}}
+ \pgfmathsetmacro\d{\csname pgf@y\endcsname}
+ \node [draw, thin, circle, inner sep=0, minimum size=0.6*\d pt, anchor=center] at (path picture bounding box.center) {};
+ \node [draw, thin, circle, inner sep=0, minimum size=0.5*\d pt, anchor=center] at (path picture bounding box.center) {};
+ \node [draw, thin, regular polygon, regular polygon sides=5, inner sep=0, minimum size=0.35*\d pt, anchor=center] at (path picture bounding box.center) {};
+ }
+]
+
+%%%%% empty events %%%%%
+
+\tikzstyle{start event} = [event]
+\tikzstyle{none start event} = [start event]
+
+%%%%% message events %%%%%
+
+\tikzstyle{message start event} = [
+ start event,
+ draw message
+]
+
+\tikzstyle{catching message intermediate event}[defaultbackgroundcolour] = [
+ draw message,
+ intermediate event=#1
+]
+
+\tikzstyle{throwing message event}[defaultbackgroundcolour] = [
+ path picture = {
+ \def\w{1.7mm}
+ \def\h{1.1mm}
+ \fill ($(path picture bounding box)+(\w,\h)$) rectangle ($(path picture bounding box)+(-\w,-\h)$);
+ \draw [#1, line cap=round, thin] ($(path picture bounding box)+(\w,\h)$) to (path picture bounding box.center);
+ \draw [#1, line cap=round, thin] ($(path picture bounding box)+(-\w,\h)$) to (path picture bounding box.center);
+ }
+]
+
+\tikzstyle{throwing message intermediate event}[defaultbackgroundcolour] = [
+ draw filled message={#1},
+ intermediate event=#1
+]
+
+\tikzstyle{message end event}[defaultbackgroundcolour] = [
+ end event,
+ draw filled message={#1}
+]
+
+\tikzstyle{terminate event} = [
+ end event,
+ path picture = {
+ \pgfpointdiff{\pgfpointanchor{path picture bounding box}{south east}}{\pgfpointanchor{path picture bounding box}{north east}}
+ \pgfmathsetmacro\d{\csname pgf@y\endcsname}
+ \node [fill, circle, inner sep=0, minimum size=0.65*\d pt, anchor=center] at (path picture bounding box.center) {};
+ }
+]
+
+%%%%% other events %%%%%
+
+\tikzstyle{draw signal}[] = [
+ path picture = {
+ \def\ma{0.8} %1 - margin
+ \pgfpointdiff{\pgfpointanchor{path picture bounding box}{south east}}{\pgfpointanchor{path picture bounding box}{north east}}
+ \pgfmathsetmacro\d{\csname pgf@y\endcsname}
+ \coordinate (a) at ($(path picture bounding box.center)+(90:\ma*0.5*\d pt)$);
+ \coordinate (b) at ($(path picture bounding box.center)+(210:\ma*0.5*\d pt)$);
+ \coordinate (c) at ($(path picture bounding box.center)+(330:\ma*0.5*\d pt)$);
+ \draw [solid, #1] (a) to (b) to (c) to cycle;
+ }
+]
+
+\tikzstyle{draw error}[] = [
+ path picture = {
+ \def\de{38} %degrees low peaks
+ \def\df{100} %degrees high peaks
+ \def\dd{0.38} %width at valleys
+ \def\ma{0.8} %1 - margin
+ \pgfpointdiff{\pgfpointanchor{path picture bounding box}{south east}}{\pgfpointanchor{path picture bounding box}{north east}}
+ \pgfmathsetmacro\d{\csname pgf@y\endcsname}
+ \coordinate (path picture bounding box a) at ($(path picture bounding box.center)+(\de:\ma*0.5*\d pt)$);
+ \coordinate (path picture bounding box b) at ($(path picture bounding box.center)+(180+\de:\ma*0.5*\d pt)$);
+ \coordinate (path picture bounding box c) at ($(path picture bounding box.center)+(\df:\ma*0.5*\d pt)$);
+ \coordinate (path picture bounding box d) at ($(path picture bounding box.center)+(180+\df:\ma*0.5*\d pt)$);
+ \coordinate (path picture bounding box e) at ($(path picture bounding box c)+(0,-\dd*\d pt)$);
+ \coordinate (path picture bounding box f) at ($(path picture bounding box d)+(0,\dd*\d pt)$);
+ \draw [solid, #1] (path picture bounding box a) to (path picture bounding box f) to (path picture bounding box c) to (path picture bounding box b) to (path picture bounding box e) to (path picture bounding box d) to cycle;
+ }
+]
+
+\tikzstyle{draw message} = [
+ path picture = {
+ \def\de{38} %degrees
+ \def\ma{0.2} %margin
+ \def\li{0.4} %lid
+ \coordinate (path picture bounding box a1) at ($(path picture bounding box.east)!{sin(\de)-\ma}!(path picture bounding box.north east)$);
+ \coordinate (path picture bounding box a2) at ($(path picture bounding box.center)!{cos(\de)-\ma}!(path picture bounding box.east)$);
+ \coordinate (path picture bounding box a) at (path picture bounding box a1 -| path picture bounding box a2);
+ \coordinate (path picture bounding box b1) at ($(path picture bounding box.east)!{sin(\de)-\ma}!(path picture bounding box.south east)$);
+ \coordinate (path picture bounding box b) at (path picture bounding box b1 -| path picture bounding box a2);
+ \coordinate (path picture bounding box c1) at ($(path picture bounding box.west)!{sin(\de)-\ma}!(path picture bounding box.north west)$);
+ \coordinate (path picture bounding box c2) at ($(path picture bounding box.center)!{cos(\de)-\ma}!(path picture bounding box.west)$);
+ \coordinate (path picture bounding box c) at (path picture bounding box c1 -| path picture bounding box c2);
+ \coordinate (path picture bounding box d1) at ($(path picture bounding box.west)!{sin(\de)-\ma}!(path picture bounding box.south west)$);
+ \coordinate (path picture bounding box d) at (path picture bounding box d1 -| path picture bounding box c2);
+ \coordinate (path picture bounding box e1) at ($(path picture bounding box a)!0.5!(path picture bounding box c)$);
+ \coordinate (path picture bounding box e2) at ($(path picture bounding box b)!0.5!(path picture bounding box d)$);
+ \coordinate (path picture bounding box e) at ($(path picture bounding box e1)!\li!(path picture bounding box e2)$);
+ \draw [solid] (path picture bounding box a) to (path picture bounding box b) to (path picture bounding box d) to (path picture bounding box c) to cycle;
+ \draw [solid, line cap=round] (path picture bounding box a) to (path picture bounding box e) to (path picture bounding box c);
+ }
+]
+
+\tikzstyle{draw filled message} = [
+ path picture = {
+ \def\de{38} %degrees
+ \def\ma{0.2} %margin
+ \def\li{0.4} %lid
+ \coordinate (path picture bounding box a1) at ($(path picture bounding box.east)!{sin(\de)-\ma}!(path picture bounding box.north east)$);
+ \coordinate (path picture bounding box a2) at ($(path picture bounding box.center)!{cos(\de)-\ma}!(path picture bounding box.east)$);
+ \coordinate (path picture bounding box a) at (path picture bounding box a1 -| path picture bounding box a2);
+ \coordinate (path picture bounding box b1) at ($(path picture bounding box.east)!{sin(\de)-\ma}!(path picture bounding box.south east)$);
+ \coordinate (path picture bounding box b) at (path picture bounding box b1 -| path picture bounding box a2);
+ \coordinate (path picture bounding box c1) at ($(path picture bounding box.west)!{sin(\de)-\ma}!(path picture bounding box.north west)$);
+ \coordinate (path picture bounding box c2) at ($(path picture bounding box.center)!{cos(\de)-\ma}!(path picture bounding box.west)$);
+ \coordinate (path picture bounding box c) at (path picture bounding box c1 -| path picture bounding box c2);
+ \coordinate (path picture bounding box d1) at ($(path picture bounding box.west)!{sin(\de)-\ma}!(path picture bounding box.south west)$);
+ \coordinate (path picture bounding box d) at (path picture bounding box d1 -| path picture bounding box c2);
+ \coordinate (path picture bounding box e1) at ($(path picture bounding box a)!0.5!(path picture bounding box c)$);
+ \coordinate (path picture bounding box e2) at ($(path picture bounding box b)!0.5!(path picture bounding box d)$);
+ \coordinate (path picture bounding box e) at ($(path picture bounding box e1)!\li!(path picture bounding box e2)$);
+ \fill (path picture bounding box a) to (path picture bounding box b) to (path picture bounding box d) to (path picture bounding box c) to cycle;
+ \draw [line cap=round, line width=1pt, #1] (path picture bounding box a) to (path picture bounding box e) to (path picture bounding box c);
+ }
+]
+
+\tikzstyle{draw compensation}[] = [
+ path picture = {
+ \def\de{40} %degrees
+ \def\ma{0.2} %margin
+ \coordinate (a1) at ($(path picture bounding box.east)!{sin(\de)-\ma}!(path picture bounding box.north east)$);
+ \coordinate (a2) at ($(path picture bounding box.center)!{cos(\de)-\ma}!(path picture bounding box.east)$);
+ \coordinate (a) at (a1 -| a2);
+ \coordinate (b1) at ($(path picture bounding box.east)!{sin(\de)-\ma}!(path picture bounding box.south east)$);
+ \coordinate (b) at (b1 -| a2);
+ \coordinate (c) at ($(path picture bounding box.west)!\ma!(path picture bounding box.center)$);
+ \coordinate (d1) at ($(a)!0.5!(b)$);
+ \coordinate (d) at ($(c)!0.5!(d1)$);
+ \coordinate (e) at (d |- a);
+ \coordinate (f) at (d |- b);
+ \draw [solid, #1] (d)
+ to (a)
+ to (b)
+ to cycle;
+ \draw [solid, #1] (c)
+ to (e)
+ to (f)
+ to cycle;
+ }
+]
+
+\tikzstyle{draw timer} = [
+ path picture = {
+ \def\ma{0.75} %1 - margin
+ \pgfpointdiff{\pgfpointanchor{path picture bounding box}{south east}}{\pgfpointanchor{path picture bounding box}{north east}}
+ \pgfmathsetmacro\r{\csname pgf@y\endcsname}
+ \draw [solid, #1] (path picture bounding box.center) circle (\ma*0.5*\r pt);
+ \foreach \angle in {0,30,...,330}
+ \draw [solid, ultra thin, #1] ($(path picture bounding box.center)+(\angle:\ma*0.4*\r pt)$) to ($(path picture bounding box.center)+(\angle:\ma*0.5*\r pt)$);
+ \draw [solid, line cap=round, #1] ($(path picture bounding box.center)+(77:\ma*0.425*\r pt)$) to (path picture bounding box.center);
+ \draw [solid, line cap=round, #1] ($(path picture bounding box.center)+(0:\ma*0.3*\r pt)$) to (path picture bounding box.center);
+ }
+]
+
+\tikzstyle{throwing compensation intermediate event}[defaultbackgroundcolour] = [
+ draw compensation={fill},
+ intermediate event=#1,
+]
+
+\tikzstyle{throwing compensation end event} = [
+ end event,
+ draw compensation={fill,thin}
+]
+
+\tikzstyle{error event} = [throwing error end event]
+\tikzstyle{throwing error end event} = [
+ end event,
+ draw error={fill,thin}
+]
+
+\tikzstyle{timer start event} = [
+ start event,
+ draw timer
+]
+
+\tikzstyle{timer event} = [timer intermediate event]
+\tikzstyle{timer intermediate event}[defaultbackgroundcolour] = [
+ intermediate event=#1,
+ draw timer
+]
+
+\tikzstyle{signal start event} = [
+ start event,
+ draw signal
+]
+
+\tikzstyle{signal intermediate event}[defaultbackgroundcolour] = [catching signal intermediate event=#1]
+\tikzstyle{catching signal intermediate event}[defaultbackgroundcolour] = [
+ intermediate event=#1,
+ draw signal
+]
+
+\tikzstyle{throwing signal intermediate event}[defaultbackgroundcolour] = [
+ intermediate event=#1,
+ draw signal={fill,draw=none}
+]
+
+\tikzstyle{signal end event} = [
+ end event,
+ draw signal={fill,draw=none}
+]
+
+%%%%% boundary events %%%%%
+
+\tikzstyle{boundary event}[defaultbackgroundcolour] = [
+ circle,
+ draw,
+ fill=#1,
+ double=#1,
+ anchor=center
+]
+
+\tikzstyle{noninterrupting boundary event}[defaultbackgroundcolour] = [
+ circle,
+ dashed,
+ dash pattern=on 1.5pt off 1pt,
+ draw,
+ fill=#1,
+ double=#1,
+ anchor=center
+]
+
+\tikzstyle{compensation boundary event}[defaultbackgroundcolour] = [
+ boundary event=#1,
+ draw compensation
+]
+
+\tikzstyle{message boundary event}[defaultbackgroundcolour] = [
+ boundary event=#1,
+ draw message
+]
+
+\tikzstyle{message noninterrupting boundary event}[defaultbackgroundcolour] = [
+ draw message,
+ noninterrupting boundary event=#1
+]
+
+\tikzstyle{timer boundary event}[defaultbackgroundcolour] = [
+ boundary event=#1,
+ draw timer
+]
+
+\tikzstyle{timer noninterrupting boundary event}[defaultbackgroundcolour] = [
+ draw timer,
+ noninterrupting boundary event=#1
+]
+
+\tikzstyle{error boundary event}[defaultbackgroundcolour] = [
+ boundary event=#1,
+ draw error
+]
+
+\tikzstyle{signal boundary event}[defaultbackgroundcolour] = [
+ boundary event=#1,
+ draw signal
+]
+
+\tikzstyle{signal noninterrupting boundary event}[defaultbackgroundcolour] = [
+ draw signal,
+ noninterrupting boundary event=#1
+]
+
+%%%%% event sub-process %%%%%
+
+\tikzstyle{event subprocess} = [
+ expanded subprocess,
+ dotted
+]
+
+\tikzstyle{collapsed event subprocess} = [
+ collapsed subprocess,
+ dotted,
+ label={[anchor=north west,#1,circle,draw,minimum size=0.3cm,inner sep=0,xshift=0.1cm,yshift=-0.1cm]north west:}
+]
+
+\tikzstyle{collapsed noninterrupting event subprocess} = [
+ collapsed subprocess,
+ dotted,
+ label={[anchor=north west,
+ #1,
+ dashed,
+ draw,
+ circle,
+ dash pattern=on 1pt off 1pt,
+ minimum size=0.3cm,
+ inner sep=0,
+ xshift=0.1cm,
+ yshift=-0.1cm]north west:}
+]
+
+\tikzstyle{event subprocess label} = [
+ task,
+ fit margins={left=1.5mm,right=1.5mm,bottom=1.5mm,top=2.1mm},
+ label={[anchor=north west]north west:\footnotesize#1},
+ dotted
+]
+
+\tikzstyle{message event subprocess} = [
+ collapsed event subprocess=draw message
+]
+
+\tikzstyle{timer event subprocess} = [
+ collapsed event subprocess=draw timer
+]
+
+\tikzstyle{compensation event subprocess} = [
+ collapsed event subprocess=draw compensation
+]
+
+\tikzstyle{signal event subprocess} = [
+ collapsed event subprocess=draw signal
+]
+
+\tikzstyle{error event subprocess} = [
+ collapsed event subprocess=draw error
+]
+
+\tikzstyle{message noninterrupting event subprocess} = [
+ collapsed noninterrupting event subprocess=draw message
+]
+
+\tikzstyle{timer noninterrupting event subprocess} = [
+ collapsed noninterrupting event subprocess=draw timer
+]
+
+\tikzstyle{signal noninterrupting event subprocess} = [
+ collapsed noninterrupting event subprocess=draw signal
+]
+
+\tikzstyle{subprocess event} = [
+ start event
+]
+
+\tikzstyle{noninterrupting subprocess event} = [
+ start event,
+ dashed,
+ dash pattern=on 2pt off 2pt
+]
+
+\tikzstyle{message subprocess event} = [
+ subprocess event,
+ draw message
+]
+
+\tikzstyle{message noninterrupting subprocess event} = [
+ noninterrupting subprocess event,
+ draw message
+]
+
+\tikzstyle{timer subprocess event} = [
+ subprocess event,
+ draw timer
+]
+
+\tikzstyle{timer noninterrupting subprocess event} = [
+ noninterrupting subprocess event,
+ draw timer
+]
+
+\tikzstyle{signal subprocess event} = [
+ subprocess event,
+ draw signal
+]
+
+\tikzstyle{signal noninterrupting subprocess event} = [
+ noninterrupting subprocess event,
+ draw signal
+]
+
+\tikzstyle{compensation subprocess event} = [
+ subprocess event,
+ draw compensation
+]
+
+\tikzstyle{error subprocess event} = [
+ subprocess event,
+ draw error
+]
+
+%%%%% call activity %%%%%
+
+\tikzstyle{call task} = [
+ task,
+ thick,
+ every call activity
+]
+
+\tikzstyle{collapsed call subprocess} = [call subprocess]
+\tikzstyle{call subprocess} = [
+ call task,
+ inner sep=3mm,
+ label={[anchor=south,
+ inner sep=-0.25mm,
+ shape=square,
+ draw,
+ regular polygon,
+ regular polygon sides=4,
+ yshift=0.5mm
+ ]below:\footnotesize +},
+ every call activity
+]
+
+%%%%% sub-processes %%%%%
+
+\def\tikzsubprocessmarker{\tikz{\node[draw, regular polygon, regular polygon sides=4, inner sep=-0.25mm]{\footnotesize +};}}
+\def\tikzmultimarker{%
+ \def\x{0.5mm}%
+ \def\y{0.6mm}%
+ \tikz{
+ \node (b) [opacity=0, draw, regular polygon, regular polygon sides=4, inner sep=-0.25mm]{\footnotesize +};
+ \draw ($(b.center)+(0,-\y)$) to ++(0,2*\y);
+ \draw ($(b.center)+(\x,-\y)$) to ++(0,2*\y);
+ \draw ($(b.center)+(-\x,-\y)$) to ++(0,2*\y);
+ }%
+}
+\def\tikzloopmarker{%
+ \tikz{
+ \node (b) [opacity=0, draw, regular polygon, regular polygon sides=4, inner sep=-0.25mm]{\footnotesize +};
+ \node at (b.center) [rotate=170,yshift=-0.9mm] {\pmb{\circlearrowleft}};
+ }%
+}
+\def\tikzcompensationmarker{%
+ \tikz{
+ \def\y{0.4mm}
+ \node (b) [opacity=0, draw, regular polygon, regular polygon sides=4, inner sep=-0.25mm]{\footnotesize +};
+ \draw [rounded corners=0.05mm] (b.center) to ($(b.north)+(0,-\y)$) to (b.west) to ($(b.south)+(0,\y)$) to (b.center);
+ \draw [rounded corners=0.05mm] (b.center) to ($(b.north east)+(0,-\y)$) to ($(b.south east)+(0,\y)$) to cycle;
+ }%
+}
+
+\tikzstyle{subprocess marker} = [
+ task,
+ inner sep=3mm,
+ task marker=#1
+]
+\tikzstyle{task marker} = [
+ task,
+ label={[anchor=south,inner sep=0]below:#1}
+]
+
+\tikzstyle{subprocess} = [
+ subprocess marker=\tikzsubprocessmarker
+]
+\tikzstyle{collapsed subprocess} = [subprocess]
+\tikzstyle{expanded subprocess} = [task, inner sep=3mm]
+\tikzstyle{subprocess label} = [task, fit margins={left=1.5mm,right=1.5mm,bottom=1.5mm,top=2.1mm}, label={[anchor=north]above:\footnotesize#1}]
+
+\tikzstyle{adhoc subprocess} = [collapsed adhoc subprocess]
+\tikzstyle{collapsed adhoc subprocess} = [
+ subprocess marker=\tikzsubprocessmarker{} $\thicksim$
+]
+
+\tikzstyle{expanded adhoc subprocess} = [
+ subprocess marker=$\thicksim$
+]
+
+\tikzstyle{multiinstance task} = [
+ subprocess marker=\tikzmultimarker
+]
+
+\tikzstyle{multiinstance subprocess} = [collapsed multiinstance subprocess]
+\tikzstyle{collapsed multiinstance subprocess} = [
+ subprocess marker=\tikzsubprocessmarker \tikzmultimarker
+]
+
+\tikzstyle{expanded multiinstance subprocess} = [
+ subprocess marker=\tikzmultimarker
+]
+
+\tikzstyle{loop task} = [
+ task marker=\tikzloopmarker
+]
+
+\tikzstyle{loop subprocess} = [collapsed loop subprocess]
+\tikzstyle{collapsed loop subprocess} = [
+ subprocess marker=\tikzsubprocessmarker{} \tikzloopmarker
+]
+
+\tikzstyle{expanded loop subprocess} = [
+ subprocess marker=\tikzloopmarker
+]
+
+\tikzstyle{compensation task} = [
+ fit margins={left=0.8mm,right=0.8mm,bottom=2.1mm,top=0.8mm},
+ task marker=\tikzcompensationmarker
+]
+
+\tikzstyle{compensation subprocess} = [collapsed compensation subprocess]
+\tikzstyle{collapsed compensation subprocess} = [
+ subprocess marker=\tikzsubprocessmarker{} \tikzcompensationmarker
+]
+
+\tikzstyle{expanded compensation subprocess} = [
+ subprocess marker=\tikzcompensationmarker
+]
+
+%%%%% task type marker %%%%%
+
+\tikzstyle{task type marker} = [
+ task,
+ label={[anchor=north west,
+ line width=0.1pt,
+ #1,
+ minimum size=0.2cm,
+ inner sep=0,
+ xshift=0.05cm,
+ yshift=-0.05cm]north west:}
+]
+
+\tikzstyle{manual task} = [
+ task type marker=draw manual
+]
+
+\tikzstyle{receive task} = [
+ task type marker=draw message
+]
+
+\tikzstyle{script task} = [
+ task type marker=draw script
+]
+
+\tikzstyle{send task}[defaultbackgroundcolour] = [
+ task type marker={draw filled message={#1, line width=0.1pt}}
+]
+
+\tikzstyle{service task}[defaultbackgroundcolour] = [
+ task type marker={draw service={#1}}
+]
+
+\tikzstyle{user task} = [
+ task type marker=draw user
+]
+
+\tikzstyle{draw service}[defaultbackgroundcolour] = [
+ path picture = {
+ \coordinate (ne) at ($(path picture bounding box.north east)-(0.5pt,0.5pt)$);
+ \coordinate (sw) at ($(path picture bounding box.south west)+(0.5pt,0.5pt)$);
+ %\draw (path picture bounding box.north east) rectangle (path picture bounding box.south west);
+\coordinate (c1x) at ($(sw)!0.613157894736843!(ne)$);\coordinate (c1y) at ($(sw)!0.774869109947646!(ne)$);\coordinate (c4x) at ($(sw)!0.673684210526316!(ne)$);\coordinate (c4y) at ($(sw)!0.837696335078536!(ne)$);\coordinate (c8x) at ($(sw)!0.665789473684211!(ne)$);\coordinate (c8y) at ($(sw)!0.869109947643979!(ne)$);\coordinate (c12x) at ($(sw)!0.649999999999999!(ne)$);\coordinate (c12y) at ($(sw)!0.890052356020943!(ne)$);\coordinate (c16x) at ($(sw)!0.626315789473683!(ne)$);\coordinate (c16y) at ($(sw)!0.908376963350787!(ne)$);\coordinate (c20x) at ($(sw)!0.594736842105263!(ne)$);\coordinate (c20y) at ($(sw)!0.916230366492146!(ne)$);\coordinate (c24x) at ($(sw)!0.526315789473684!(ne)$);\coordinate (c24y) at ($(sw)!0.853403141361256!(ne)$);\coordinate (c28x) at ($(sw)!0.489473684210527!(ne)$);\coordinate (c28y) at ($(sw)!0.869109947643979!(ne)$);\coordinate (c32x) at ($(sw)!0.452631578947368!(ne)$);\coordinate (c32y) at ($(sw)!0.882198952879582!(ne)$);\coordinate (c36x) at ($(sw)!0.444736842105262!(ne)$);\coordinate (c36y) at ($(sw)!0.976439790575915!(ne)$);\coordinate (c40x) at ($(sw)!0.421052631578948!(ne)$);\coordinate (c40y) at ($(sw)!0.992146596858639!(ne)$);\coordinate (c44x) at ($(sw)!0.389473684210526!(ne)$);\coordinate (c44y) at ($(sw)!1!(ne)$);\coordinate (c48x) at ($(sw)!0.360526315789475!(ne)$);\coordinate (c48y) at ($(sw)!0.992146596858639!(ne)$);\coordinate (c52x) at ($(sw)!0.33421052631579!(ne)$);\coordinate (c52y) at ($(sw)!0.976439790575915!(ne)$);\coordinate (c56x) at ($(sw)!0.328947368421053!(ne)$);\coordinate (c56y) at ($(sw)!0.882198952879582!(ne)$);\coordinate (c60x) at ($(sw)!0.278947368421053!(ne)$);\coordinate (c60y) at ($(sw)!0.866492146596859!(ne)$);\coordinate (c64x) at ($(sw)!0.234210526315788!(ne)$);\coordinate (c64y) at ($(sw)!0.840314136125656!(ne)$);\coordinate (c68x) at ($(sw)!0.150000000000001!(ne)$);\coordinate (c68y) at ($(sw)!0.916230366492146!(ne)$);\coordinate (c72x) at ($(sw)!0.121052631578947!(ne)$);\coordinate (c72y) at ($(sw)!0.908376963350787!(ne)$);\coordinate (c76x) at ($(sw)!0.0947368421052642!(ne)$);\coordinate (c76y) at ($(sw)!0.890052356020943!(ne)$);\coordinate (c80x) at ($(sw)!0.0789473684210531!(ne)$);\coordinate (c80y) at ($(sw)!0.869109947643979!(ne)$);\coordinate (c84x) at ($(sw)!0.0736842105263161!(ne)$);\coordinate (c84y) at ($(sw)!0.837696335078536!(ne)$);\coordinate (c88x) at ($(sw)!0.150000000000001!(ne)$);\coordinate (c88y) at ($(sw)!0.751308900523561!(ne)$);\coordinate (c92x) at ($(sw)!0.131578947368421!(ne)$);\coordinate (c92y) at ($(sw)!0.709424083769635!(ne)$);\coordinate (c96x) at ($(sw)!0.118421052631578!(ne)$);\coordinate (c96y) at ($(sw)!0.667539267015707!(ne)$);\coordinate (c100x) at ($(sw)!0.0184210526315796!(ne)$);\coordinate (c100y) at ($(sw)!0.662303664921466!(ne)$);\coordinate (c104x) at ($(sw)!0.00263157894736852!(ne)$);\coordinate (c104y) at ($(sw)!0.636125654450263!(ne)$);\coordinate (c108x) at ($(sw)!0!(ne)$);\coordinate (c108y) at ($(sw)!0.607329842931938!(ne)$);\coordinate (c112x) at ($(sw)!0.00263157894736852!(ne)$);\coordinate (c112y) at ($(sw)!0.578534031413614!(ne)$);\coordinate (c116x) at ($(sw)!0.0184210526315796!(ne)$);\coordinate (c116y) at ($(sw)!0.55497382198953!(ne)$);\coordinate (c120x) at ($(sw)!0.118421052631578!(ne)$);\coordinate (c120y) at ($(sw)!0.547120418848168!(ne)$);\coordinate (c124x) at ($(sw)!0.126315789473684!(ne)$);\coordinate (c124y) at ($(sw)!0.510471204188483!(ne)$);\coordinate (c128x) at ($(sw)!0.147368421052632!(ne)$);\coordinate (c128y) at ($(sw)!0.473821989528796!(ne)$);\coordinate (c132x) at ($(sw)!0.0736842105263161!(ne)$);\coordinate (c132y) at ($(sw)!0.392670157068063!(ne)$);\coordinate (c136x) at ($(sw)!0.0789473684210531!(ne)$);\coordinate (c136y) at ($(sw)!0.363874345549739!(ne)$);\coordinate (c140x) at ($(sw)!0.0947368421052642!(ne)$);\coordinate (c140y) at ($(sw)!0.340314136125655!(ne)$);\coordinate (c144x) at ($(sw)!0.121052631578947!(ne)$);\coordinate (c144y) at ($(sw)!0.321989528795811!(ne)$);\coordinate (c148x) at ($(sw)!0.150000000000001!(ne)$);\coordinate (c148y) at ($(sw)!0.316753926701573!(ne)$);\coordinate (c152x) at ($(sw)!0.226315789473685!(ne)$);\coordinate (c152y) at ($(sw)!0.382198952879583!(ne)$);\coordinate (c156x) at ($(sw)!0.273684210526316!(ne)$);\coordinate (c156y) at ($(sw)!0.353403141361257!(ne)$);\coordinate (c160x) at ($(sw)!0.328947368421053!(ne)$);\coordinate (c160y) at ($(sw)!0.337696335078534!(ne)$);\coordinate (c164x) at ($(sw)!0.33421052631579!(ne)$);\coordinate (c164y) at ($(sw)!0.23821989528796!(ne)$);\coordinate (c168x) at ($(sw)!0.360526315789475!(ne)$);\coordinate (c168y) at ($(sw)!0.222513089005236!(ne)$);\coordinate (c172x) at ($(sw)!0.389473684210526!(ne)$);\coordinate (c172y) at ($(sw)!0.217277486910995!(ne)$);\coordinate (c176x) at ($(sw)!0.421052631578948!(ne)$);\coordinate (c176y) at ($(sw)!0.222513089005236!(ne)$);\coordinate (c180x) at ($(sw)!0.444736842105262!(ne)$);\coordinate (c180y) at ($(sw)!0.23821989528796!(ne)$);\coordinate (c184x) at ($(sw)!0.452631578947368!(ne)$);\coordinate (c184y) at ($(sw)!0.337696335078534!(ne)$);\coordinate (c188x) at ($(sw)!0.492105263157896!(ne)$);\coordinate (c188y) at ($(sw)!0.350785340314137!(ne)$);\coordinate (c192x) at ($(sw)!0.53421052631579!(ne)$);\coordinate (c192y) at ($(sw)!0.36910994764398!(ne)$);\coordinate (c196x) at ($(sw)!0.594736842105263!(ne)$);\coordinate (c196y) at ($(sw)!0.316753926701573!(ne)$);\coordinate (c200x) at ($(sw)!0.626315789473683!(ne)$);\coordinate (c200y) at ($(sw)!0.321989528795811!(ne)$);\coordinate (c204x) at ($(sw)!0.649999999999999!(ne)$);\coordinate (c204y) at ($(sw)!0.340314136125655!(ne)$);\coordinate (c208x) at ($(sw)!0.665789473684211!(ne)$);\coordinate (c208y) at ($(sw)!0.363874345549739!(ne)$);\coordinate (c212x) at ($(sw)!0.673684210526316!(ne)$);\coordinate (c212y) at ($(sw)!0.392670157068063!(ne)$);\coordinate (c216x) at ($(sw)!0.621052631578948!(ne)$);\coordinate (c216y) at ($(sw)!0.452879581151832!(ne)$);\coordinate (c220x) at ($(sw)!0.647368421052631!(ne)$);\coordinate (c220y) at ($(sw)!0.500000000000001!(ne)$);\coordinate (c224x) at ($(sw)!0.663157894736842!(ne)$);\coordinate (c224y) at ($(sw)!0.547120418848168!(ne)$);\coordinate (c228x) at ($(sw)!0.760526315789472!(ne)$);\coordinate (c228y) at ($(sw)!0.55497382198953!(ne)$);\coordinate (c232x) at ($(sw)!0.776315789473683!(ne)$);\coordinate (c232y) at ($(sw)!0.578534031413614!(ne)$);\coordinate (c236x) at ($(sw)!0.778947368421052!(ne)$);\coordinate (c236y) at ($(sw)!0.607329842931938!(ne)$);\coordinate (c240x) at ($(sw)!0.776315789473683!(ne)$);\coordinate (c240y) at ($(sw)!0.636125654450263!(ne)$);\coordinate (c244x) at ($(sw)!0.760526315789472!(ne)$);\coordinate (c244y) at ($(sw)!0.662303664921466!(ne)$);\coordinate (c248x) at ($(sw)!0.663157894736842!(ne)$);\coordinate (c248y) at ($(sw)!0.667539267015707!(ne)$);\coordinate (c252x) at ($(sw)!0.642105263157894!(ne)$);\coordinate (c252y) at ($(sw)!0.722513089005235!(ne)$);\coordinate (c256x) at ($(sw)!0.613157894736843!(ne)$);\coordinate (c256y) at ($(sw)!0.774869109947646!(ne)$);
+ \draw (c1x |- c1y) -- (c4x |- c4y) -- (c8x |- c8y) -- (c12x |- c12y) -- (c16x |- c16y) -- (c20x |- c20y) -- (c24x |- c24y) -- (c28x |- c28y) -- (c32x |- c32y) -- (c36x |- c36y) -- (c40x |- c40y) -- (c44x |- c44y) -- (c48x |- c48y) -- (c52x |- c52y) -- (c56x |- c56y) -- (c60x |- c60y) -- (c64x |- c64y) -- (c68x |- c68y) -- (c72x |- c72y) -- (c76x |- c76y) -- (c80x |- c80y) -- (c84x |- c84y) -- (c88x |- c88y) -- (c92x |- c92y) -- (c96x |- c96y) -- (c100x |- c100y) -- (c104x |- c104y) -- (c108x |- c108y) -- (c112x |- c112y) -- (c116x |- c116y) -- (c120x |- c120y) -- (c124x |- c124y) -- (c128x |- c128y) -- (c132x |- c132y) -- (c136x |- c136y) -- (c140x |- c140y) -- (c144x |- c144y) -- (c148x |- c148y) -- (c152x |- c152y) -- (c156x |- c156y) -- (c160x |- c160y) -- (c164x |- c164y) -- (c168x |- c168y) -- (c172x |- c172y) -- (c176x |- c176y) -- (c180x |- c180y) -- (c184x |- c184y) -- (c188x |- c188y) -- (c192x |- c192y) -- (c196x |- c196y) -- (c200x |- c200y) -- (c204x |- c204y) -- (c208x |- c208y) -- (c212x |- c212y) -- (c216x |- c216y) -- (c220x |- c220y) -- (c224x |- c224y) -- (c228x |- c228y) -- (c232x |- c232y) -- (c236x |- c236y) -- (c240x |- c240y) -- (c244x |- c244y) -- (c248x |- c248y) -- (c252x |- c252y) -- (c256x |- c256y) ;
+ \coordinate (c301x) at ($(sw)!0.476315789473685!(ne)$);\coordinate (c301y) at ($(sw)!0.672774869109948!(ne)$);\coordinate (c304x) at ($(sw)!0.499999999999999!(ne)$);\coordinate (c304y) at ($(sw)!0.696335078534033!(ne)$);\coordinate (c308x) at ($(sw)!0.49736842105263!(ne)$);\coordinate (c308y) at ($(sw)!0.709424083769635!(ne)$);\coordinate (c312x) at ($(sw)!0.489473684210527!(ne)$);\coordinate (c312y) at ($(sw)!0.719895287958115!(ne)$);\coordinate (c316x) at ($(sw)!0.481578947368422!(ne)$);\coordinate (c316y) at ($(sw)!0.725130890052356!(ne)$);\coordinate (c320x) at ($(sw)!0.471052631578948!(ne)$);\coordinate (c320y) at ($(sw)!0.730366492146597!(ne)$);\coordinate (c324x) at ($(sw)!0.442105263157894!(ne)$);\coordinate (c324y) at ($(sw)!0.704188481675394!(ne)$);\coordinate (c328x) at ($(sw)!0.413157894736843!(ne)$);\coordinate (c328y) at ($(sw)!0.712041884816756!(ne)$);\coordinate (c332x) at ($(sw)!0.410526315789474!(ne)$);\coordinate (c332y) at ($(sw)!0.751308900523561!(ne)$);\coordinate (c336x) at ($(sw)!0.389473684210526!(ne)$);\coordinate (c336y) at ($(sw)!0.761780104712043!(ne)$);\coordinate (c340x) at ($(sw)!0.368421052631578!(ne)$);\coordinate (c340y) at ($(sw)!0.751308900523561!(ne)$);\coordinate (c344x) at ($(sw)!0.365789473684209!(ne)$);\coordinate (c344y) at ($(sw)!0.712041884816756!(ne)$);\coordinate (c348x) at ($(sw)!0.347368421052632!(ne)$);\coordinate (c348y) at ($(sw)!0.706806282722515!(ne)$);\coordinate (c352x) at ($(sw)!0.331578947368421!(ne)$);\coordinate (c352y) at ($(sw)!0.701570680628274!(ne)$);\coordinate (c356x) at ($(sw)!0.294736842105264!(ne)$);\coordinate (c356y) at ($(sw)!0.730366492146597!(ne)$);\coordinate (c360x) at ($(sw)!0.286842105263159!(ne)$);\coordinate (c360y) at ($(sw)!0.725130890052356!(ne)$);\coordinate (c364x) at ($(sw)!0.276315789473685!(ne)$);\coordinate (c364y) at ($(sw)!0.719895287958115!(ne)$);\coordinate (c368x) at ($(sw)!0.271052631578948!(ne)$);\coordinate (c368y) at ($(sw)!0.709424083769635!(ne)$);\coordinate (c372x) at ($(sw)!0.268421052631579!(ne)$);\coordinate (c372y) at ($(sw)!0.696335078534033!(ne)$);\coordinate (c376x) at ($(sw)!0.294736842105264!(ne)$);\coordinate (c376y) at ($(sw)!0.664921465968586!(ne)$);\coordinate (c380x) at ($(sw)!0.28421052631579!(ne)$);\coordinate (c380y) at ($(sw)!0.630890052356022!(ne)$);\coordinate (c384x) at ($(sw)!0.244736842105262!(ne)$);\coordinate (c384y) at ($(sw)!0.630890052356022!(ne)$);\coordinate (c388x) at ($(sw)!0.239473684210525!(ne)$);\coordinate (c388y) at ($(sw)!0.62041884816754!(ne)$);\coordinate (c392x) at ($(sw)!0.239473684210525!(ne)$);\coordinate (c392y) at ($(sw)!0.599476439790576!(ne)$);\coordinate (c396x) at ($(sw)!0.244736842105262!(ne)$);\coordinate (c396y) at ($(sw)!0.586387434554973!(ne)$);\coordinate (c400x) at ($(sw)!0.28421052631579!(ne)$);\coordinate (c400y) at ($(sw)!0.586387434554973!(ne)$);\coordinate (c404x) at ($(sw)!0.294736842105264!(ne)$);\coordinate (c404y) at ($(sw)!0.55759162303665!(ne)$);\coordinate (c408x) at ($(sw)!0.268421052631579!(ne)$);\coordinate (c408y) at ($(sw)!0.526178010471204!(ne)$);\coordinate (c412x) at ($(sw)!0.271052631578948!(ne)$);\coordinate (c412y) at ($(sw)!0.513089005235604!(ne)$);\coordinate (c416x) at ($(sw)!0.276315789473685!(ne)$);\coordinate (c416y) at ($(sw)!0.502617801047122!(ne)$);\coordinate (c420x) at ($(sw)!0.286842105263159!(ne)$);\coordinate (c420y) at ($(sw)!0.497382198952881!(ne)$);\coordinate (c424x) at ($(sw)!0.294736842105264!(ne)$);\coordinate (c424y) at ($(sw)!0.49476439790576!(ne)$);\coordinate (c428x) at ($(sw)!0.328947368421053!(ne)$);\coordinate (c428y) at ($(sw)!0.518324607329842!(ne)$);\coordinate (c432x) at ($(sw)!0.365789473684209!(ne)$);\coordinate (c432y) at ($(sw)!0.502617801047122!(ne)$);\coordinate (c436x) at ($(sw)!0.368421052631578!(ne)$);\coordinate (c436y) at ($(sw)!0.465968586387435!(ne)$);\coordinate (c440x) at ($(sw)!0.378947368421052!(ne)$);\coordinate (c440y) at ($(sw)!0.458115183246073!(ne)$);\coordinate (c444x) at ($(sw)!0.389473684210526!(ne)$);\coordinate (c444y) at ($(sw)!0.455497382198952!(ne)$);\coordinate (c448x) at ($(sw)!0.4!(ne)$);\coordinate (c448y) at ($(sw)!0.458115183246073!(ne)$);\coordinate (c452x) at ($(sw)!0.410526315789474!(ne)$);\coordinate (c452y) at ($(sw)!0.465968586387435!(ne)$);\coordinate (c456x) at ($(sw)!0.413157894736843!(ne)$);\coordinate (c456y) at ($(sw)!0.502617801047122!(ne)$);\coordinate (c460x) at ($(sw)!0.444736842105262!(ne)$);\coordinate (c460y) at ($(sw)!0.515706806282724!(ne)$);\coordinate (c464x) at ($(sw)!0.471052631578948!(ne)$);\coordinate (c464y) at ($(sw)!0.49476439790576!(ne)$);\coordinate (c468x) at ($(sw)!0.481578947368422!(ne)$);\coordinate (c468y) at ($(sw)!0.497382198952881!(ne)$);\coordinate (c472x) at ($(sw)!0.489473684210527!(ne)$);\coordinate (c472y) at ($(sw)!0.502617801047122!(ne)$);\coordinate (c476x) at ($(sw)!0.49736842105263!(ne)$);\coordinate (c476y) at ($(sw)!0.513089005235604!(ne)$);\coordinate (c480x) at ($(sw)!0.499999999999999!(ne)$);\coordinate (c480y) at ($(sw)!0.526178010471204!(ne)$);\coordinate (c484x) at ($(sw)!0.481578947368422!(ne)$);\coordinate (c484y) at ($(sw)!0.547120418848168!(ne)$);\coordinate (c488x) at ($(sw)!0.489473684210527!(ne)$);\coordinate (c488y) at ($(sw)!0.568062827225132!(ne)$);\coordinate (c492x) at ($(sw)!0.49736842105263!(ne)$);\coordinate (c492y) at ($(sw)!0.586387434554973!(ne)$);\coordinate (c496x) at ($(sw)!0.53421052631579!(ne)$);\coordinate (c496y) at ($(sw)!0.586387434554973!(ne)$);\coordinate (c500x) at ($(sw)!0.542105263157895!(ne)$);\coordinate (c500y) at ($(sw)!0.599476439790576!(ne)$);\coordinate (c504x) at ($(sw)!0.542105263157895!(ne)$);\coordinate (c504y) at ($(sw)!0.62041884816754!(ne)$);\coordinate (c508x) at ($(sw)!0.53421052631579!(ne)$);\coordinate (c508y) at ($(sw)!0.630890052356022!(ne)$);\coordinate (c512x) at ($(sw)!0.49736842105263!(ne)$);\coordinate (c512y) at ($(sw)!0.633507853403143!(ne)$);\coordinate (c516x) at ($(sw)!0.489473684210527!(ne)$);\coordinate (c516y) at ($(sw)!0.651832460732984!(ne)$);\coordinate (c520x) at ($(sw)!0.476315789473685!(ne)$);\coordinate (c520y) at ($(sw)!0.672774869109948!(ne)$);
+ \draw (c301x |- c301y) -- (c304x |- c304y) -- (c308x |- c308y) -- (c312x |- c312y) -- (c316x |- c316y) -- (c320x |- c320y) -- (c324x |- c324y) -- (c328x |- c328y) -- (c332x |- c332y) -- (c336x |- c336y) -- (c340x |- c340y) -- (c344x |- c344y) -- (c348x |- c348y) -- (c352x |- c352y) -- (c356x |- c356y) -- (c360x |- c360y) -- (c364x |- c364y) -- (c368x |- c368y) -- (c372x |- c372y) -- (c376x |- c376y) -- (c380x |- c380y) -- (c384x |- c384y) -- (c388x |- c388y) -- (c392x |- c392y) -- (c396x |- c396y) -- (c400x |- c400y) -- (c404x |- c404y) -- (c408x |- c408y) -- (c412x |- c412y) -- (c416x |- c416y) -- (c420x |- c420y) -- (c424x |- c424y) -- (c428x |- c428y) -- (c432x |- c432y) -- (c436x |- c436y) -- (c440x |- c440y) -- (c444x |- c444y) -- (c448x |- c448y) -- (c452x |- c452y) -- (c456x |- c456y) -- (c460x |- c460y) -- (c464x |- c464y) -- (c468x |- c468y) -- (c472x |- c472y) -- (c476x |- c476y) -- (c480x |- c480y) -- (c484x |- c484y) -- (c488x |- c488y) -- (c492x |- c492y) -- (c496x |- c496y) -- (c500x |- c500y) -- (c504x |- c504y) -- (c508x |- c508y) -- (c512x |- c512y) -- (c516x |- c516y) -- (c520x |- c520y) ;
+ \coordinate (c601x) at ($(sw)!0.834210526315788!(ne)$);\coordinate (c601y) at ($(sw)!0.55497382198953!(ne)$);\coordinate (c604x) at ($(sw)!0.892105263157893!(ne)$);\coordinate (c604y) at ($(sw)!0.62041884816754!(ne)$);\coordinate (c608x) at ($(sw)!0.88421052631579!(ne)$);\coordinate (c608y) at ($(sw)!0.649214659685863!(ne)$);\coordinate (c612x) at ($(sw)!0.86578947368421!(ne)$);\coordinate (c612y) at ($(sw)!0.675392670157068!(ne)$);\coordinate (c616x) at ($(sw)!0.844736842105262!(ne)$);\coordinate (c616y) at ($(sw)!0.691099476439792!(ne)$);\coordinate (c620x) at ($(sw)!0.815789473684211!(ne)$);\coordinate (c620y) at ($(sw)!0.701570680628274!(ne)$);\coordinate (c624x) at ($(sw)!0.742105263157895!(ne)$);\coordinate (c624y) at ($(sw)!0.636125654450263!(ne)$);\coordinate (c628x) at ($(sw)!0.705263157894736!(ne)$);\coordinate (c628y) at ($(sw)!0.651832460732984!(ne)$);\coordinate (c632x) at ($(sw)!0.668421052631579!(ne)$);\coordinate (c632y) at ($(sw)!0.662303664921466!(ne)$);\coordinate (c636x) at ($(sw)!0.663157894736842!(ne)$);\coordinate (c636y) at ($(sw)!0.761780104712043!(ne)$);\coordinate (c640x) at ($(sw)!0.636842105263157!(ne)$);\coordinate (c640y) at ($(sw)!0.777486910994766!(ne)$);\coordinate (c644x) at ($(sw)!0.607894736842106!(ne)$);\coordinate (c644y) at ($(sw)!0.782722513089005!(ne)$);\coordinate (c648x) at ($(sw)!0.578947368421052!(ne)$);\coordinate (c648y) at ($(sw)!0.777486910994766!(ne)$);\coordinate (c652x) at ($(sw)!0.550000000000001!(ne)$);\coordinate (c652y) at ($(sw)!0.761780104712043!(ne)$);\coordinate (c656x) at ($(sw)!0.547368421052632!(ne)$);\coordinate (c656y) at ($(sw)!0.662303664921466!(ne)$);\coordinate (c660x) at ($(sw)!0.49736842105263!(ne)$);\coordinate (c660y) at ($(sw)!0.649214659685863!(ne)$);\coordinate (c664x) at ($(sw)!0.452631578947368!(ne)$);\coordinate (c664y) at ($(sw)!0.623036649214661!(ne)$);\coordinate (c668x) at ($(sw)!0.365789473684209!(ne)$);\coordinate (c668y) at ($(sw)!0.701570680628274!(ne)$);\coordinate (c672x) at ($(sw)!0.336842105263158!(ne)$);\coordinate (c672y) at ($(sw)!0.691099476439792!(ne)$);\coordinate (c676x) at ($(sw)!0.31578947368421!(ne)$);\coordinate (c676y) at ($(sw)!0.675392670157068!(ne)$);\coordinate (c680x) at ($(sw)!0.294736842105264!(ne)$);\coordinate (c680y) at ($(sw)!0.649214659685863!(ne)$);\coordinate (c684x) at ($(sw)!0.289473684210527!(ne)$);\coordinate (c684y) at ($(sw)!0.62041884816754!(ne)$);\coordinate (c688x) at ($(sw)!0.365789473684209!(ne)$);\coordinate (c688y) at ($(sw)!0.534031413612566!(ne)$);\coordinate (c692x) at ($(sw)!0.347368421052632!(ne)$);\coordinate (c692y) at ($(sw)!0.49476439790576!(ne)$);\coordinate (c696x) at ($(sw)!0.33421052631579!(ne)$);\coordinate (c696y) at ($(sw)!0.452879581151832!(ne)$);\coordinate (c700x) at ($(sw)!0.234210526315788!(ne)$);\coordinate (c700y) at ($(sw)!0.445026178010473!(ne)$);\coordinate (c704x) at ($(sw)!0.21842105263158!(ne)$);\coordinate (c704y) at ($(sw)!0.421465968586388!(ne)$);\coordinate (c708x) at ($(sw)!0.215789473684211!(ne)$);\coordinate (c708y) at ($(sw)!0.392670157068063!(ne)$);\coordinate (c712x) at ($(sw)!0.21842105263158!(ne)$);\coordinate (c712y) at ($(sw)!0.363874345549739!(ne)$);\coordinate (c716x) at ($(sw)!0.234210526315788!(ne)$);\coordinate (c716y) at ($(sw)!0.337696335078534!(ne)$);\coordinate (c720x) at ($(sw)!0.33421052631579!(ne)$);\coordinate (c720y) at ($(sw)!0.332460732984293!(ne)$);\coordinate (c724x) at ($(sw)!0.347368421052632!(ne)$);\coordinate (c724y) at ($(sw)!0.293193717277488!(ne)$);\coordinate (c728x) at ($(sw)!0.363157894736841!(ne)$);\coordinate (c728y) at ($(sw)!0.259162303664921!(ne)$);\coordinate (c732x) at ($(sw)!0.289473684210527!(ne)$);\coordinate (c732y) at ($(sw)!0.17539267015707!(ne)$);\coordinate (c736x) at ($(sw)!0.294736842105264!(ne)$);\coordinate (c736y) at ($(sw)!0.146596858638744!(ne)$);\coordinate (c740x) at ($(sw)!0.31578947368421!(ne)$);\coordinate (c740y) at ($(sw)!0.120418848167541!(ne)$);\coordinate (c744x) at ($(sw)!0.336842105263158!(ne)$);\coordinate (c744y) at ($(sw)!0.104712041884818!(ne)$);\coordinate (c748x) at ($(sw)!0.365789473684209!(ne)$);\coordinate (c748y) at ($(sw)!0.0994764397905771!(ne)$);\coordinate (c752x) at ($(sw)!0.442105263157894!(ne)$);\coordinate (c752y) at ($(sw)!0.164921465968588!(ne)$);\coordinate (c756x) at ($(sw)!0.492105263157896!(ne)$);\coordinate (c756y) at ($(sw)!0.136125654450262!(ne)$);\coordinate (c760x) at ($(sw)!0.547368421052632!(ne)$);\coordinate (c760y) at ($(sw)!0.117801047120421!(ne)$);\coordinate (c764x) at ($(sw)!0.550000000000001!(ne)$);\coordinate (c764y) at ($(sw)!0.0235602094240846!(ne)$);\coordinate (c768x) at ($(sw)!0.578947368421052!(ne)$);\coordinate (c768y) at ($(sw)!0.00785340314136155!(ne)$);\coordinate (c772x) at ($(sw)!0.607894736842106!(ne)$);\coordinate (c772y) at ($(sw)!0!(ne)$);\coordinate (c776x) at ($(sw)!0.636842105263157!(ne)$);\coordinate (c776y) at ($(sw)!0.00785340314136155!(ne)$);\coordinate (c780x) at ($(sw)!0.663157894736842!(ne)$);\coordinate (c780y) at ($(sw)!0.0235602094240846!(ne)$);\coordinate (c784x) at ($(sw)!0.668421052631579!(ne)$);\coordinate (c784y) at ($(sw)!0.117801047120421!(ne)$);\coordinate (c788x) at ($(sw)!0.710526315789473!(ne)$);\coordinate (c788y) at ($(sw)!0.133507853403141!(ne)$);\coordinate (c792x) at ($(sw)!0.750000000000001!(ne)$);\coordinate (c792y) at ($(sw)!0.154450261780105!(ne)$);\coordinate (c796x) at ($(sw)!0.815789473684211!(ne)$);\coordinate (c796y) at ($(sw)!0.0994764397905771!(ne)$);\coordinate (c800x) at ($(sw)!0.844736842105262!(ne)$);\coordinate (c800y) at ($(sw)!0.104712041884818!(ne)$);\coordinate (c804x) at ($(sw)!0.86578947368421!(ne)$);\coordinate (c804y) at ($(sw)!0.120418848167541!(ne)$);\coordinate (c808x) at ($(sw)!0.88421052631579!(ne)$);\coordinate (c808y) at ($(sw)!0.146596858638744!(ne)$);\coordinate (c812x) at ($(sw)!0.892105263157893!(ne)$);\coordinate (c812y) at ($(sw)!0.17539267015707!(ne)$);\coordinate (c816x) at ($(sw)!0.836842105263157!(ne)$);\coordinate (c816y) at ($(sw)!0.235602094240839!(ne)$);\coordinate (c820x) at ($(sw)!0.863157894736842!(ne)$);\coordinate (c820y) at ($(sw)!0.280104712041885!(ne)$);\coordinate (c824x) at ($(sw)!0.878947368421053!(ne)$);\coordinate (c824y) at ($(sw)!0.332460732984293!(ne)$);\coordinate (c828x) at ($(sw)!0.976315789473683!(ne)$);\coordinate (c828y) at ($(sw)!0.337696335078534!(ne)$);\coordinate (c832x) at ($(sw)!0.992105263157895!(ne)$);\coordinate (c832y) at ($(sw)!0.363874345549739!(ne)$);\coordinate (c836x) at ($(sw)!1!(ne)$);\coordinate (c836y) at ($(sw)!0.392670157068063!(ne)$);\coordinate (c840x) at ($(sw)!0.992105263157895!(ne)$);\coordinate (c840y) at ($(sw)!0.421465968586388!(ne)$);\coordinate (c844x) at ($(sw)!0.976315789473683!(ne)$);\coordinate (c844y) at ($(sw)!0.445026178010473!(ne)$);\coordinate (c848x) at ($(sw)!0.878947368421053!(ne)$);\coordinate (c848y) at ($(sw)!0.452879581151832!(ne)$);\coordinate (c852x) at ($(sw)!0.863157894736842!(ne)$);\coordinate (c852y) at ($(sw)!0.505235602094242!(ne)$);\coordinate (c856x) at ($(sw)!0.834210526315788!(ne)$);\coordinate (c856y) at ($(sw)!0.55497382198953!(ne)$);
+ \draw [fill=#1] (c601x |- c601y) -- (c604x |- c604y) -- (c608x |- c608y) -- (c612x |- c612y) -- (c616x |- c616y) -- (c620x |- c620y) -- (c624x |- c624y) -- (c628x |- c628y) -- (c632x |- c632y) -- (c636x |- c636y) -- (c640x |- c640y) -- (c644x |- c644y) -- (c648x |- c648y) -- (c652x |- c652y) -- (c656x |- c656y) -- (c660x |- c660y) -- (c664x |- c664y) -- (c668x |- c668y) -- (c672x |- c672y) -- (c676x |- c676y) -- (c680x |- c680y) -- (c684x |- c684y) -- (c688x |- c688y) -- (c692x |- c692y) -- (c696x |- c696y) -- (c700x |- c700y) -- (c704x |- c704y) -- (c708x |- c708y) -- (c712x |- c712y) -- (c716x |- c716y) -- (c720x |- c720y) -- (c724x |- c724y) -- (c728x |- c728y) -- (c732x |- c732y) -- (c736x |- c736y) -- (c740x |- c740y) -- (c744x |- c744y) -- (c748x |- c748y) -- (c752x |- c752y) -- (c756x |- c756y) -- (c760x |- c760y) -- (c764x |- c764y) -- (c768x |- c768y) -- (c772x |- c772y) -- (c776x |- c776y) -- (c780x |- c780y) -- (c784x |- c784y) -- (c788x |- c788y) -- (c792x |- c792y) -- (c796x |- c796y) -- (c800x |- c800y) -- (c804x |- c804y) -- (c808x |- c808y) -- (c812x |- c812y) -- (c816x |- c816y) -- (c820x |- c820y) -- (c824x |- c824y) -- (c828x |- c828y) -- (c832x |- c832y) -- (c836x |- c836y) -- (c840x |- c840y) -- (c844x |- c844y) -- (c848x |- c848y) -- (c852x |- c852y) -- (c856x |- c856y) -- cycle;
+ \coordinate (c901x) at ($(sw)!0.694736842105262!(ne)$);\coordinate (c901y) at ($(sw)!0.455497382198952!(ne)$);\coordinate (c904x) at ($(sw)!0.71578947368421!(ne)$);\coordinate (c904y) at ($(sw)!0.481675392670158!(ne)$);\coordinate (c908x) at ($(sw)!0.71578947368421!(ne)$);\coordinate (c908y) at ($(sw)!0.49476439790576!(ne)$);\coordinate (c912x) at ($(sw)!0.710526315789473!(ne)$);\coordinate (c912y) at ($(sw)!0.502617801047122!(ne)$);\coordinate (c916x) at ($(sw)!0.699999999999999!(ne)$);\coordinate (c916y) at ($(sw)!0.510471204188483!(ne)$);\coordinate (c920x) at ($(sw)!0.686842105263159!(ne)$);\coordinate (c920y) at ($(sw)!0.510471204188483!(ne)$);\coordinate (c924x) at ($(sw)!0.657894736842105!(ne)$);\coordinate (c924y) at ($(sw)!0.486910994764399!(ne)$);\coordinate (c928x) at ($(sw)!0.628947368421051!(ne)$);\coordinate (c928y) at ($(sw)!0.497382198952881!(ne)$);\coordinate (c932x) at ($(sw)!0.626315789473683!(ne)$);\coordinate (c932y) at ($(sw)!0.534031413612566!(ne)$);\coordinate (c936x) at ($(sw)!0.61842105263158!(ne)$);\coordinate (c936y) at ($(sw)!0.541884816753927!(ne)$);\coordinate (c940x) at ($(sw)!0.607894736842106!(ne)$);\coordinate (c940y) at ($(sw)!0.544502617801048!(ne)$);\coordinate (c944x) at ($(sw)!0.594736842105263!(ne)$);\coordinate (c944y) at ($(sw)!0.541884816753927!(ne)$);\coordinate (c948x) at ($(sw)!0.586842105263157!(ne)$);\coordinate (c948y) at ($(sw)!0.534031413612566!(ne)$);\coordinate (c952x) at ($(sw)!0.58157894736842!(ne)$);\coordinate (c952y) at ($(sw)!0.497382198952881!(ne)$);\coordinate (c956x) at ($(sw)!0.563157894736841!(ne)$);\coordinate (c956y) at ($(sw)!0.489528795811519!(ne)$);\coordinate (c960x) at ($(sw)!0.547368421052632!(ne)$);\coordinate (c960y) at ($(sw)!0.481675392670158!(ne)$);\coordinate (c964x) at ($(sw)!0.513157894736841!(ne)$);\coordinate (c964y) at ($(sw)!0.510471204188483!(ne)$);\coordinate (c968x) at ($(sw)!0.502631578947367!(ne)$);\coordinate (c968y) at ($(sw)!0.510471204188483!(ne)$);\coordinate (c972x) at ($(sw)!0.492105263157896!(ne)$);\coordinate (c972y) at ($(sw)!0.502617801047122!(ne)$);\coordinate (c976x) at ($(sw)!0.486842105263159!(ne)$);\coordinate (c976y) at ($(sw)!0.49476439790576!(ne)$);\coordinate (c980x) at ($(sw)!0.48421052631579!(ne)$);\coordinate (c980y) at ($(sw)!0.481675392670158!(ne)$);\coordinate (c984x) at ($(sw)!0.513157894736841!(ne)$);\coordinate (c984y) at ($(sw)!0.445026178010473!(ne)$);\coordinate (c988x) at ($(sw)!0.499999999999999!(ne)$);\coordinate (c988y) at ($(sw)!0.413612565445027!(ne)$);\coordinate (c992x) at ($(sw)!0.460526315789473!(ne)$);\coordinate (c992y) at ($(sw)!0.413612565445027!(ne)$);\coordinate (c996x) at ($(sw)!0.457894736842105!(ne)$);\coordinate (c996y) at ($(sw)!0.400523560209424!(ne)$);\coordinate (c1000x) at ($(sw)!0.455263157894736!(ne)$);\coordinate (c1000y) at ($(sw)!0.392670157068063!(ne)$);\coordinate (c1004x) at ($(sw)!0.457894736842105!(ne)$);\coordinate (c1004y) at ($(sw)!0.379581151832462!(ne)$);\coordinate (c1008x) at ($(sw)!0.460526315789473!(ne)$);\coordinate (c1008y) at ($(sw)!0.36910994764398!(ne)$);\coordinate (c1012x) at ($(sw)!0.499999999999999!(ne)$);\coordinate (c1012y) at ($(sw)!0.36649214659686!(ne)$);\coordinate (c1016x) at ($(sw)!0.513157894736841!(ne)$);\coordinate (c1016y) at ($(sw)!0.340314136125655!(ne)$);\coordinate (c1020x) at ($(sw)!0.48421052631579!(ne)$);\coordinate (c1020y) at ($(sw)!0.308900523560211!(ne)$);\coordinate (c1024x) at ($(sw)!0.486842105263159!(ne)$);\coordinate (c1024y) at ($(sw)!0.295811518324608!(ne)$);\coordinate (c1028x) at ($(sw)!0.492105263157896!(ne)$);\coordinate (c1028y) at ($(sw)!0.287958115183247!(ne)$);\coordinate (c1032x) at ($(sw)!0.502631578947367!(ne)$);\coordinate (c1032y) at ($(sw)!0.280104712041885!(ne)$);\coordinate (c1036x) at ($(sw)!0.513157894736841!(ne)$);\coordinate (c1036y) at ($(sw)!0.277486910994765!(ne)$);\coordinate (c1040x) at ($(sw)!0.544736842105264!(ne)$);\coordinate (c1040y) at ($(sw)!0.30366492146597!(ne)$);\coordinate (c1044x) at ($(sw)!0.563157894736841!(ne)$);\coordinate (c1044y) at ($(sw)!0.293193717277488!(ne)$);\coordinate (c1048x) at ($(sw)!0.58157894736842!(ne)$);\coordinate (c1048y) at ($(sw)!0.287958115183247!(ne)$);\coordinate (c1052x) at ($(sw)!0.586842105263157!(ne)$);\coordinate (c1052y) at ($(sw)!0.248691099476442!(ne)$);\coordinate (c1056x) at ($(sw)!0.594736842105263!(ne)$);\coordinate (c1056y) at ($(sw)!0.243455497382201!(ne)$);\coordinate (c1060x) at ($(sw)!0.607894736842106!(ne)$);\coordinate (c1060y) at ($(sw)!0.23821989528796!(ne)$);\coordinate (c1064x) at ($(sw)!0.61842105263158!(ne)$);\coordinate (c1064y) at ($(sw)!0.243455497382201!(ne)$);\coordinate (c1068x) at ($(sw)!0.626315789473683!(ne)$);\coordinate (c1068y) at ($(sw)!0.248691099476442!(ne)$);\coordinate (c1072x) at ($(sw)!0.628947368421051!(ne)$);\coordinate (c1072y) at ($(sw)!0.287958115183247!(ne)$);\coordinate (c1076x) at ($(sw)!0.663157894736842!(ne)$);\coordinate (c1076y) at ($(sw)!0.298429319371729!(ne)$);\coordinate (c1080x) at ($(sw)!0.686842105263159!(ne)$);\coordinate (c1080y) at ($(sw)!0.277486910994765!(ne)$);\coordinate (c1084x) at ($(sw)!0.699999999999999!(ne)$);\coordinate (c1084y) at ($(sw)!0.280104712041885!(ne)$);\coordinate (c1088x) at ($(sw)!0.710526315789473!(ne)$);\coordinate (c1088y) at ($(sw)!0.287958115183247!(ne)$);\coordinate (c1092x) at ($(sw)!0.71578947368421!(ne)$);\coordinate (c1092y) at ($(sw)!0.295811518324608!(ne)$);\coordinate (c1096x) at ($(sw)!0.71578947368421!(ne)$);\coordinate (c1096y) at ($(sw)!0.308900523560211!(ne)$);\coordinate (c1100x) at ($(sw)!0.69736842105263!(ne)$);\coordinate (c1100y) at ($(sw)!0.332460732984293!(ne)$);\coordinate (c1104x) at ($(sw)!0.705263157894736!(ne)$);\coordinate (c1104y) at ($(sw)!0.348167539267016!(ne)$);\coordinate (c1108x) at ($(sw)!0.713157894736841!(ne)$);\coordinate (c1108y) at ($(sw)!0.36910994764398!(ne)$);\coordinate (c1112x) at ($(sw)!0.750000000000001!(ne)$);\coordinate (c1112y) at ($(sw)!0.36910994764398!(ne)$);\coordinate (c1116x) at ($(sw)!0.757894736842104!(ne)$);\coordinate (c1116y) at ($(sw)!0.379581151832462!(ne)$);\coordinate (c1120x) at ($(sw)!0.760526315789472!(ne)$);\coordinate (c1120y) at ($(sw)!0.392670157068063!(ne)$);\coordinate (c1124x) at ($(sw)!0.757894736842104!(ne)$);\coordinate (c1124y) at ($(sw)!0.400523560209424!(ne)$);\coordinate (c1128x) at ($(sw)!0.750000000000001!(ne)$);\coordinate (c1128y) at ($(sw)!0.413612565445027!(ne)$);\coordinate (c1132x) at ($(sw)!0.713157894736841!(ne)$);\coordinate (c1132y) at ($(sw)!0.413612565445027!(ne)$);\coordinate (c1136x) at ($(sw)!0.705263157894736!(ne)$);\coordinate (c1136y) at ($(sw)!0.437172774869111!(ne)$);\coordinate (c1140x) at ($(sw)!0.694736842105262!(ne)$);\coordinate (c1140y) at ($(sw)!0.455497382198952!(ne)$);
+ \draw (c901x |- c901y) -- (c904x |- c904y) -- (c908x |- c908y) -- (c912x |- c912y) -- (c916x |- c916y) -- (c920x |- c920y) -- (c924x |- c924y) -- (c928x |- c928y) -- (c932x |- c932y) -- (c936x |- c936y) -- (c940x |- c940y) -- (c944x |- c944y) -- (c948x |- c948y) -- (c952x |- c952y) -- (c956x |- c956y) -- (c960x |- c960y) -- (c964x |- c964y) -- (c968x |- c968y) -- (c972x |- c972y) -- (c976x |- c976y) -- (c980x |- c980y) -- (c984x |- c984y) -- (c988x |- c988y) -- (c992x |- c992y) -- (c996x |- c996y) -- (c1000x |- c1000y) -- (c1004x |- c1004y) -- (c1008x |- c1008y) -- (c1012x |- c1012y) -- (c1016x |- c1016y) -- (c1020x |- c1020y) -- (c1024x |- c1024y) -- (c1028x |- c1028y) -- (c1032x |- c1032y) -- (c1036x |- c1036y) -- (c1040x |- c1040y) -- (c1044x |- c1044y) -- (c1048x |- c1048y) -- (c1052x |- c1052y) -- (c1056x |- c1056y) -- (c1060x |- c1060y) -- (c1064x |- c1064y) -- (c1068x |- c1068y) -- (c1072x |- c1072y) -- (c1076x |- c1076y) -- (c1080x |- c1080y) -- (c1084x |- c1084y) -- (c1088x |- c1088y) -- (c1092x |- c1092y) -- (c1096x |- c1096y) -- (c1100x |- c1100y) -- (c1104x |- c1104y) -- (c1108x |- c1108y) -- (c1112x |- c1112y) -- (c1116x |- c1116y) -- (c1120x |- c1120y) -- (c1124x |- c1124y) -- (c1128x |- c1128y) -- (c1132x |- c1132y) -- (c1136x |- c1136y) -- (c1140x |- c1140y);
+ }
+]
+
+\tikzstyle{draw manual} = [
+ path picture = {
+ \coordinate (ne) at ($(path picture bounding box.north east)-(0.5pt,0.5pt)$);
+ \coordinate (sw) at ($(path picture bounding box.south west)+(0.5pt,0.5pt)$);
+ %\draw (path picture bounding box.north east) rectangle (path picture bounding box.south west);
+\coordinate (c1x) at ($(sw)!0.70189701897019!(ne)$);
+\coordinate (c2x) at ($(sw)!0.520325203252032!(ne)$);
+\coordinate (c3x) at ($(sw)!0.51219512195122!(ne)$);
+\coordinate (c4x) at ($(sw)!0.506775067750678!(ne)$);
+\coordinate (c5x) at ($(sw)!0.51219512195122!(ne)$);
+\coordinate (c6x) at ($(sw)!0.520325203252032!(ne)$);
+\coordinate (c7x) at ($(sw)!0.905149051490515!(ne)$);
+\coordinate (c8x) at ($(sw)!0.932249322493225!(ne)$);
+\coordinate (c9x) at ($(sw)!0.956639566395664!(ne)$);
+\coordinate (c10x) at ($(sw)!0.975609756097561!(ne)$);
+\coordinate (c11x) at ($(sw)!0.994579945799458!(ne)$);
+\coordinate (c12x) at ($(sw)!1!(ne)$);
+\coordinate (c13x) at ($(sw)!0.986449864498645!(ne)$);
+\coordinate (c14x) at ($(sw)!0.97289972899729!(ne)$);
+\coordinate (c15x) at ($(sw)!0.959349593495935!(ne)$);
+\coordinate (c16x) at ($(sw)!0.284552845528455!(ne)$);
+\coordinate (c17x) at ($(sw)!0.314363143631436!(ne)$);
+\coordinate (c18x) at ($(sw)!0.485094850948509!(ne)$);
+\coordinate (c19x) at ($(sw)!0.528455284552846!(ne)$);
+\coordinate (c20x) at ($(sw)!0.563685636856369!(ne)$);
+\coordinate (c21x) at ($(sw)!0.590785907859079!(ne)$);
+\coordinate (c22x) at ($(sw)!0.590785907859079!(ne)$);
+\coordinate (c23x) at ($(sw)!0.582655826558266!(ne)$);
+\coordinate (c24x) at ($(sw)!0.168021680216802!(ne)$);
+\coordinate (c25x) at ($(sw)!0!(ne)$);
+\coordinate (c26x) at ($(sw)!0!(ne)$);
+\coordinate (c27x) at ($(sw)!0.0921409214092141!(ne)$);
+\coordinate (c28x) at ($(sw)!0.769647696476965!(ne)$);
+\coordinate (c29x) at ($(sw)!0.794037940379404!(ne)$);
+\coordinate (c30x) at ($(sw)!0.815718157181572!(ne)$);
+\coordinate (c31x) at ($(sw)!0.831978319783198!(ne)$);
+\coordinate (c32x) at ($(sw)!0.840108401084011!(ne)$);
+\coordinate (c33x) at ($(sw)!0.826558265582656!(ne)$);
+\coordinate (c34x) at ($(sw)!0.799457994579946!(ne)$);
+\coordinate (c35x) at ($(sw)!0.669376693766938!(ne)$);
+\coordinate (c36x) at ($(sw)!0.650406504065041!(ne)$);
+\coordinate (c37x) at ($(sw)!0.542005420054201!(ne)$);
+\coordinate (c38x) at ($(sw)!0.531165311653117!(ne)$);
+\coordinate (c39x) at ($(sw)!0.528455284552846!(ne)$);
+\coordinate (c40x) at ($(sw)!0.531165311653117!(ne)$);
+\coordinate (c41x) at ($(sw)!0.542005420054201!(ne)$);
+\coordinate (c42x) at ($(sw)!0.688346883468834!(ne)$);
+\coordinate (c43x) at ($(sw)!0.823848238482385!(ne)$);
+\coordinate (c44x) at ($(sw)!0.853658536585366!(ne)$);
+\coordinate (c45x) at ($(sw)!0.875338753387534!(ne)$);
+\coordinate (c46x) at ($(sw)!0.894308943089431!(ne)$);
+\coordinate (c47x) at ($(sw)!0.910569105691057!(ne)$);
+\coordinate (c48x) at ($(sw)!0.921409214092141!(ne)$);
+\coordinate (c49x) at ($(sw)!0.905149051490515!(ne)$);
+\coordinate (c50x) at ($(sw)!0.894308943089431!(ne)$);
+\coordinate (c51x) at ($(sw)!0.880758807588076!(ne)$);
+\coordinate (c52x) at ($(sw)!0.550135501355014!(ne)$);
+\coordinate (c53x) at ($(sw)!0.542005420054201!(ne)$);
+\coordinate (c54x) at ($(sw)!0.536585365853658!(ne)$);
+\coordinate (c55x) at ($(sw)!0.542005420054201!(ne)$);
+\coordinate (c56x) at ($(sw)!0.550135501355014!(ne)$);
+\coordinate (c57x) at ($(sw)!0.688346883468834!(ne)$);
+\coordinate (c58x) at ($(sw)!0.70189701897019!(ne)$);
+\coordinate (c59x) at ($(sw)!0.856368563685637!(ne)$);
+\coordinate (c60x) at ($(sw)!0.888888888888889!(ne)$);
+\coordinate (c61x) at ($(sw)!0.91869918699187!(ne)$);
+\coordinate (c62x) at ($(sw)!0.940379403794038!(ne)$);
+\coordinate (c63x) at ($(sw)!0.959349593495935!(ne)$);
+\coordinate (c64x) at ($(sw)!0.970189701897019!(ne)$);
+\coordinate (c65x) at ($(sw)!0.953929539295393!(ne)$);
+\coordinate (c66x) at ($(sw)!0.937669376693767!(ne)$);
+\coordinate (c67x) at ($(sw)!0.924119241192412!(ne)$);
+\coordinate (c68x) at ($(sw)!0.70189701897019!(ne)$);
+\coordinate (c1y) at ($(sw)!0.73657094216209!(ne)$);
+\coordinate (c2y) at ($(sw)!0.73657094216209!(ne)$);
+\coordinate (c3y) at ($(sw)!0.741947045383272!(ne)$);
+\coordinate (c4y) at ($(sw)!0.752699251825636!(ne)$);
+\coordinate (c5y) at ($(sw)!0.760763406657407!(ne)$);
+\coordinate (c6y) at ($(sw)!0.763451458268!(ne)$);
+\coordinate (c7y) at ($(sw)!0.763451458268!(ne)$);
+\coordinate (c8y) at ($(sw)!0.768827561489182!(ne)$);
+\coordinate (c9y) at ($(sw)!0.774203664710364!(ne)$);
+\coordinate (c10y) at ($(sw)!0.787643922763317!(ne)$);
+\coordinate (c11y) at ($(sw)!0.803772232426863!(ne)$);
+\coordinate (c12y) at ($(sw)!0.82796469692218!(ne)$);
+\coordinate (c13y) at ($(sw)!0.862909367859866!(ne)$);
+\coordinate (c14y) at ($(sw)!0.873661574302225!(ne)$);
+\coordinate (c15y) at ($(sw)!0.879037677523407!(ne)$);
+\coordinate (c16y) at ($(sw)!0.879037677523407!(ne)$);
+\coordinate (c17y) at ($(sw)!0.895165987186953!(ne)$);
+\coordinate (c18y) at ($(sw)!0.895165987186953!(ne)$);
+\coordinate (c19y) at ($(sw)!0.905918193629317!(ne)$);
+\coordinate (c20y) at ($(sw)!0.924734554903457!(ne)$);
+\coordinate (c21y) at ($(sw)!0.956991174230544!(ne)$);
+\coordinate (c22y) at ($(sw)!0.981183638725865!(ne)$);
+\coordinate (c23y) at ($(sw)!1!(ne)$);
+\coordinate (c24y) at ($(sw)!1!(ne)$);
+\coordinate (c25y) at ($(sw)!0.879037677523407!(ne)$);
+\coordinate (c26y) at ($(sw)!0.427445006944135!(ne)$);
+\coordinate (c27y) at ($(sw)!0.376372026342908!(ne)$);
+\coordinate (c28y) at ($(sw)!0.376372026342908!(ne)$);
+\coordinate (c29y) at ($(sw)!0.379060077953497!(ne)$);
+\coordinate (c30y) at ($(sw)!0.392500336006455!(ne)$);
+\coordinate (c31y) at ($(sw)!0.403252542448814!(ne)$);
+\coordinate (c32y) at ($(sw)!0.422068903722953!(ne)$);
+\coordinate (c33y) at ($(sw)!0.448949419828863!(ne)$);
+\coordinate (c34y) at ($(sw)!0.459701626271228!(ne)$);
+\coordinate (c35y) at ($(sw)!0.459701626271228!(ne)$);
+\coordinate (c36y) at ($(sw)!0.46507772949241!(ne)$);
+\coordinate (c37y) at ($(sw)!0.46507772949241!(ne)$);
+\coordinate (c38y) at ($(sw)!0.467765781102998!(ne)$);
+\coordinate (c39y) at ($(sw)!0.478517987545362!(ne)$);
+\coordinate (c40y) at ($(sw)!0.486582142377133!(ne)$);
+\coordinate (c41y) at ($(sw)!0.494646297208908!(ne)$);
+\coordinate (c42y) at ($(sw)!0.494646297208908!(ne)$);
+\coordinate (c43y) at ($(sw)!0.486582142377133!(ne)$);
+\coordinate (c44y) at ($(sw)!0.489270193987726!(ne)$);
+\coordinate (c45y) at ($(sw)!0.497334348819497!(ne)$);
+\coordinate (c46y) at ($(sw)!0.510774606872454!(ne)$);
+\coordinate (c47y) at ($(sw)!0.524214864925407!(ne)$);
+\coordinate (c48y) at ($(sw)!0.543031226199542!(ne)$);
+\coordinate (c49y) at ($(sw)!0.575287845526634!(ne)$);
+\coordinate (c50y) at ($(sw)!0.586040051968998!(ne)$);
+\coordinate (c51y) at ($(sw)!0.59141615519018!(ne)$);
+\coordinate (c52y) at ($(sw)!0.59141615519018!(ne)$);
+\coordinate (c53y) at ($(sw)!0.594104206800774!(ne)$);
+\coordinate (c54y) at ($(sw)!0.604856413243132!(ne)$);
+\coordinate (c55y) at ($(sw)!0.615608619685497!(ne)$);
+\coordinate (c56y) at ($(sw)!0.620984722906679!(ne)$);
+\coordinate (c57y) at ($(sw)!0.620984722906679!(ne)$);
+\coordinate (c58y) at ($(sw)!0.623672774517272!(ne)$);
+\coordinate (c59y) at ($(sw)!0.620984722906679!(ne)$);
+\coordinate (c60y) at ($(sw)!0.623672774517272!(ne)$);
+\coordinate (c61y) at ($(sw)!0.631736929349043!(ne)$);
+\coordinate (c62y) at ($(sw)!0.642489135791407!(ne)$);
+\coordinate (c63y) at ($(sw)!0.661305497065547!(ne)$);
+\coordinate (c64y) at ($(sw)!0.68280990995027!(ne)$);
+\coordinate (c65y) at ($(sw)!0.717754580887955!(ne)$);
+\coordinate (c66y) at ($(sw)!0.731194838940908!(ne)$);
+\coordinate (c67y) at ($(sw)!0.739258993772679!(ne)$);
+\coordinate (c68y) at ($(sw)!0.739258993772679!(ne)$);
+\draw[line width=0.1pt, line cap=rect,line join=round]
+ (c1x |- c1y) -- (c2x |- c2y)-- (c3x |- c3y)-- (c4x |- c4y)-- (c5x |- c5y)-- (c6x |- c6y)-- (c7x |- c7y)-- (c8x |- c8y)-- (c9x |- c9y)-- (c10x |- c10y)-- (c11x |- c11y)-- (c12x |- c12y)-- (c13x |- c13y)-- (c14x |- c14y)-- (c15x |- c15y)-- (c16x |- c16y)-- (c17x |- c17y)-- (c18x |- c18y)-- (c19x |- c19y)-- (c20x |- c20y)-- (c21x |- c21y)-- (c22x |- c22y)-- (c23x |- c23y)-- (c24x |- c24y)-- (c25x |- c25y)-- (c26x |- c26y)-- (c27x |- c27y)-- (c28x |- c28y)-- (c29x |- c29y)-- (c30x |- c30y)-- (c31x |- c31y)-- (c32x |- c32y)-- (c33x |- c33y)-- (c34x |- c34y)-- (c35x |- c35y)-- (c36x |- c36y)-- (c37x |- c37y)-- (c38x |- c38y)-- (c39x |- c39y)-- (c40x |- c40y)-- (c41x |- c41y)-- (c42x |- c42y)-- (c43x |- c43y)-- (c44x |- c44y)-- (c45x |- c45y)-- (c46x |- c46y)-- (c47x |- c47y)-- (c48x |- c48y)-- (c49x |- c49y)-- (c50x |- c50y)-- (c51x |- c51y)-- (c52x |- c52y)-- (c53x |- c53y)-- (c54x |- c54y)-- (c55x |- c55y)-- (c56x |- c56y)-- (c57x |- c57y)-- (c58x |- c58y)-- (c59x |- c59y)-- (c60x |- c60y)-- (c61x |- c61y)-- (c62x |- c62y)-- (c63x |- c63y)-- (c64x |- c64y)-- (c65x |- c65y)-- (c66x |- c66y)-- (c67x |- c67y)-- (c68x |- c68y);
+ }
+]
+
+\tikzstyle{draw script} = [
+ path picture = {
+ \def\de{40} %degrees
+ \def\ma{0.2} %margin
+ \coordinate (a1) at ($(path picture bounding box.east)!{sin(\de)-\ma}!(path picture bounding box.north east)$);
+ \coordinate (a2) at ($(path picture bounding box.center)!{cos(\de)-\ma}!(path picture bounding box.east)$);
+ %\coordinate (ne) at (4.323838pt, -0.8041138pt);
+ %\coordinate (sw) at (0.7419678pt, -4.077197pt);
+ \coordinate (ne) at ($(path picture bounding box.north east)-(0.5pt,0.5pt)$);
+ \coordinate (sw) at ($(path picture bounding box.south west)+(0.5pt,0.5pt)$);
+ \coordinate (sm) at ($(sw)!0.6793108!(ne |- sw)$); %south middle: lower right corner
+ \coordinate (nm) at ($(ne)!0.6793108!(ne -| sw)$); %north middle: top left corner
+ \coordinate (l1) at ($(ne)!0.20377!(sw)$);
+ \coordinate (l2) at ($(ne)!0.4!(sw)$);
+ \coordinate (l3) at ($(ne)!0.626414!(sw)$);
+ \coordinate (l4) at ($(ne)!0.826416!(sw)$);
+ \coordinate (linestart12) at ($(sw)!0.179310!(ne)$);
+ \coordinate (lineend12) at ($(sw)!0.637931!(ne)$);
+ \coordinate (linestart3) at ($(sw)!0.2965524!(ne)$);
+ \coordinate (lineend3) at ($(sw)!0.751723!(ne)$);
+ \coordinate (linestart4) at ($(sw)!0.286207!(ne)$);
+ \coordinate (lineend4) at ($(sw)!0.74137868!(ne)$);
+ \coordinate (em) at ($(ne)!0.4792457!(sw)$);
+ \coordinate (bezierright) at ($(sw)!0.7793097!(ne)$);
+ \coordinate (bezierleft) at ($(sw)!0.0965516!(ne)$);
+ \coordinate (b11x) at ($(sw)!0.632702!(ne)$);
+ \coordinate (b11y) at ($(ne)!0.219119!(sw)$);
+ \coordinate (b12x) at ($(sw)!0.775287!(ne)$);
+ \coordinate (b12y) at ($(ne)!0.087421!(sw)$);
+ \coordinate (b21x) at ($(sw)!0.951148!(ne)$);
+ \coordinate (b21y) at ($(ne)!0.686793!(sw)$);
+ \coordinate (b22x) at ($(sw)!0.933448!(ne)$);
+ \coordinate (b22y) at ($(ne)!0.898365!(sw)$);
+ \coordinate (b31x) at ($(sw)!-0.051781!(ne)$);
+ \coordinate (b31y) at ($(ne)!0.220063!(sw)$);
+ \coordinate (b32x) at ($(sw)!0.092529!(ne)$);
+ \coordinate (b32y) at ($(ne)!0.084087!(sw)$);
+ \coordinate (b41x) at ($(sw)!0.265459!(ne)$);
+ \coordinate (b41y) at ($(ne)!0.694026!(sw)$);
+ \coordinate (b42x) at ($(sw)!0.250402!(ne)$);
+ \coordinate (b42y) at ($(ne)!0.886981!(sw)$);
+ \draw[line width=0.1pt, solid,line cap=round,line join=round]
+ (linestart12 |- l1) -- (lineend12 |- l1) %(302.6953pt, -147.1082pt)
+ (linestart12 |- l2) -- (lineend12 |- l2) %(302.6953pt, -211.3347pt)
+ (linestart3 |- l3) -- (lineend3 |- l3) %(343.4541pt, -285.4421pt)
+ (linestart4 |- l4) -- (lineend4 |- l4) %(339.749pt, -350.9043pt)
+ (ne) -- (nm) %top
+ (sw) -- (sm) %bottom
+ (bezierright |- em)
+ .. controls (b11x |- b11y) and (b12x |- b12y) ..
+ (ne)
+ (bezierright |- em)
+ .. controls (b21x |- b21y) and (b22x |- b22y) ..
+ (sm)
+ (bezierleft |- em)
+ .. controls (b31x |- b31y) and (b32x |- b32y) ..
+ (nm)
+ (bezierleft |- em)
+ .. controls (b41x |- b41y) and (b42x |- b42y) ..
+ (sw);
+ }
+]
+
+\tikzstyle{draw user} = [
+ path picture = {
+ \coordinate (ne) at ($(path picture bounding box.north east)-(0.5pt,0.5pt)$);
+ \coordinate (sw) at ($(path picture bounding box.south west)+(0.5pt,0.5pt)$);
+% \draw (path picture bounding box.north east) rectangle (path picture bounding box.south west);
+\coordinate (c1x) at ($(sw)!0.67936507936508!(ne)$); \coordinate (c1y) at ($(sw)!0.527950310559006!(ne)$);
+\coordinate (c2x) at ($(sw)!0.67936507936508!(ne)$); \coordinate (c2y) at ($(sw)!0.527950310559006!(ne)$);
+\coordinate (c3x) at ($(sw)!0.67936507936508!(ne)$); \coordinate (c3y) at ($(sw)!0.527950310559006!(ne)$);
+\coordinate (c4x) at ($(sw)!0.67936507936508!(ne)$); \coordinate (c4y) at ($(sw)!0.555905797101449!(ne)$);
+\coordinate (c5x) at ($(sw)!0.67936507936508!(ne)$); \coordinate (c5y) at ($(sw)!0.555905797101449!(ne)$);
+\coordinate (c6x) at ($(sw)!0.67936507936508!(ne)$); \coordinate (c6y) at ($(sw)!0.555905797101449!(ne)$);
+\coordinate (c7x) at ($(sw)!0.67936507936508!(ne)$); \coordinate (c7y) at ($(sw)!0.555905797101449!(ne)$);
+\coordinate (c8x) at ($(sw)!0.644444444444444!(ne)$); \coordinate (c8y) at ($(sw)!0.593167701863355!(ne)$);
+\coordinate (c9x) at ($(sw)!0.644444444444444!(ne)$); \coordinate (c9y) at ($(sw)!0.593167701863355!(ne)$);
+\coordinate (c10x) at ($(sw)!0.644444444444444!(ne)$); \coordinate (c10y) at ($(sw)!0.593167701863355!(ne)$);
+\coordinate (c11x) at ($(sw)!0.644444444444444!(ne)$); \coordinate (c11y) at ($(sw)!0.593167701863355!(ne)$);
+\coordinate (c12x) at ($(sw)!0.511111111111112!(ne)$); \coordinate (c12y) at ($(sw)!1!(ne)$);
+\coordinate (c13x) at ($(sw)!0.511111111111112!(ne)$); \coordinate (c13y) at ($(sw)!1!(ne)$);
+\coordinate (c14x) at ($(sw)!0.511111111111112!(ne)$); \coordinate (c14y) at ($(sw)!1!(ne)$);
+\coordinate (c15x) at ($(sw)!0.371428571428571!(ne)$); \coordinate (c15y) at ($(sw)!0.593167701863355!(ne)$);
+\coordinate (c16x) at ($(sw)!0.371428571428571!(ne)$); \coordinate (c16y) at ($(sw)!0.593167701863355!(ne)$);
+\coordinate (c17x) at ($(sw)!0.371428571428571!(ne)$); \coordinate (c17y) at ($(sw)!0.593167701863355!(ne)$);
+\coordinate (c18x) at ($(sw)!0.336507936507936!(ne)$); \coordinate (c18y) at ($(sw)!0.555905797101449!(ne)$);
+\coordinate (c19x) at ($(sw)!0.336507936507936!(ne)$); \coordinate (c19y) at ($(sw)!0.555905797101449!(ne)$);
+\coordinate (c20x) at ($(sw)!0.336507936507936!(ne)$); \coordinate (c20y) at ($(sw)!0.555905797101449!(ne)$);
+\coordinate (c21x) at ($(sw)!0.336507936507936!(ne)$); \coordinate (c21y) at ($(sw)!0.555905797101449!(ne)$);
+\coordinate (c22x) at ($(sw)!0.336507936507936!(ne)$); \coordinate (c22y) at ($(sw)!0.509316770186336!(ne)$);
+\coordinate (c23x) at ($(sw)!0.336507936507936!(ne)$); \coordinate (c23y) at ($(sw)!0.509316770186336!(ne)$);
+\coordinate (c24x) at ($(sw)!0.336507936507936!(ne)$); \coordinate (c24y) at ($(sw)!0.509316770186336!(ne)$);
+\coordinate (c25x) at ($(sw)!0.336507936507936!(ne)$); \coordinate (c25y) at ($(sw)!0.509316770186336!(ne)$);
+\coordinate (c26x) at ($(sw)!0.333333333333333!(ne)$); \coordinate (c26y) at ($(sw)!0.527950310559006!(ne)$);
+\coordinate (c27x) at ($(sw)!0.333333333333333!(ne)$); \coordinate (c27y) at ($(sw)!0.527950310559006!(ne)$);
+\coordinate (c28x) at ($(sw)!0.333333333333333!(ne)$); \coordinate (c28y) at ($(sw)!0.527950310559006!(ne)$);
+\coordinate (c29x) at ($(sw)!0.333333333333333!(ne)$); \coordinate (c29y) at ($(sw)!0.527950310559006!(ne)$);
+\coordinate (c30x) at ($(sw)!0!(ne)$); \coordinate (c30y) at ($(sw)!0.350931677018634!(ne)$);
+\coordinate (c31x) at ($(sw)!0!(ne)$); \coordinate (c31y) at ($(sw)!0.350931677018634!(ne)$);
+\coordinate (c32x) at ($(sw)!0!(ne)$); \coordinate (c32y) at ($(sw)!0.350931677018634!(ne)$);
+\coordinate (c33x) at ($(sw)!0!(ne)$); \coordinate (c33y) at ($(sw)!0!(ne)$);
+\coordinate (c34x) at ($(sw)!0!(ne)$); \coordinate (c34y) at ($(sw)!0!(ne)$);
+\coordinate (c35x) at ($(sw)!0!(ne)$); \coordinate (c35y) at ($(sw)!0!(ne)$);
+\coordinate (c36x) at ($(sw)!0!(ne)$); \coordinate (c36y) at ($(sw)!0!(ne)$);
+\coordinate (c37x) at ($(sw)!1!(ne)$); \coordinate (c37y) at ($(sw)!0!(ne)$);
+\coordinate (c38x) at ($(sw)!1!(ne)$); \coordinate (c38y) at ($(sw)!0!(ne)$);
+\coordinate (c39x) at ($(sw)!1!(ne)$); \coordinate (c39y) at ($(sw)!0!(ne)$);
+\coordinate (c40x) at ($(sw)!1!(ne)$); \coordinate (c40y) at ($(sw)!0!(ne)$);
+\coordinate (c41x) at ($(sw)!1!(ne)$); \coordinate (c41y) at ($(sw)!0.350931677018634!(ne)$);
+\coordinate (c42x) at ($(sw)!1!(ne)$); \coordinate (c42y) at ($(sw)!0.350931677018634!(ne)$);
+\coordinate (c43x) at ($(sw)!1!(ne)$); \coordinate (c43y) at ($(sw)!0.350931677018634!(ne)$);
+\coordinate (c44x) at ($(sw)!1!(ne)$); \coordinate (c44y) at ($(sw)!0.350931677018634!(ne)$);
+\coordinate (c45x) at ($(sw)!0.444444444444444!(ne)$); \coordinate (c45y) at ($(sw)!0.406832298136645!(ne)$);
+\coordinate (c46x) at ($(sw)!0.444444444444444!(ne)$); \coordinate (c46y) at ($(sw)!0.406832298136645!(ne)$);
+\coordinate (c47x) at ($(sw)!0.444444444444444!(ne)$); \coordinate (c47y) at ($(sw)!0.406832298136645!(ne)$);
+\coordinate (c48x) at ($(sw)!0.555555555555556!(ne)$); \coordinate (c48y) at ($(sw)!0.406832298136645!(ne)$);
+\coordinate (c49x) at ($(sw)!0.555555555555556!(ne)$); \coordinate (c49y) at ($(sw)!0.406832298136645!(ne)$);
+\coordinate (c50x) at ($(sw)!0.555555555555556!(ne)$); \coordinate (c50y) at ($(sw)!0.406832298136645!(ne)$);
+\coordinate (c51x) at ($(sw)!0.555555555555556!(ne)$); \coordinate (c51y) at ($(sw)!0.406832298136645!(ne)$);
+\coordinate (c52x) at ($(sw)!0.53015873015873!(ne)$); \coordinate (c52y) at ($(sw)!0.400626293995859!(ne)$);
+\coordinate (c53x) at ($(sw)!0.53015873015873!(ne)$); \coordinate (c53y) at ($(sw)!0.400626293995859!(ne)$);
+\coordinate (c54x) at ($(sw)!0.53015873015873!(ne)$); \coordinate (c54y) at ($(sw)!0.400626293995859!(ne)$);
+\coordinate (c55x) at ($(sw)!0.53015873015873!(ne)$); \coordinate (c55y) at ($(sw)!0.400626293995859!(ne)$);
+\coordinate (c56x) at ($(sw)!0.498412698412698!(ne)$); \coordinate (c56y) at ($(sw)!0.397515527950311!(ne)$);
+\coordinate (c57x) at ($(sw)!0.498412698412698!(ne)$); \coordinate (c57y) at ($(sw)!0.397515527950311!(ne)$);
+\coordinate (c58x) at ($(sw)!0.498412698412698!(ne)$); \coordinate (c58y) at ($(sw)!0.397515527950311!(ne)$);
+\coordinate (c59x) at ($(sw)!0.498412698412698!(ne)$); \coordinate (c59y) at ($(sw)!0.397515527950311!(ne)$);
+\coordinate (c60x) at ($(sw)!0.473015873015873!(ne)$); \coordinate (c60y) at ($(sw)!0.400626293995859!(ne)$);
+\coordinate (c61x) at ($(sw)!0.473015873015873!(ne)$); \coordinate (c61y) at ($(sw)!0.400626293995859!(ne)$);
+\coordinate (c62x) at ($(sw)!0.473015873015873!(ne)$); \coordinate (c62y) at ($(sw)!0.400626293995859!(ne)$);
+\coordinate (c63x) at ($(sw)!0.473015873015873!(ne)$); \coordinate (c63y) at ($(sw)!0.400626293995859!(ne)$);
+\coordinate (c64x) at ($(sw)!0.444444444444444!(ne)$); \coordinate (c64y) at ($(sw)!0.406832298136645!(ne)$);
+\coordinate (b11x1) at ($(sw)!0.798148148148148!(ne)$);
+\coordinate (b11y1) at ($(sw)!0.722670807453416!(ne)$);
+\coordinate (b11x2) at ($(sw)!0.722222222222222!(ne)$);
+\coordinate (b11y2) at ($(sw)!0.994151138716356!(ne)$);
+\coordinate (b11x3) at ($(sw)!0.511111111111112!(ne)$);
+\coordinate (b11y3) at ($(sw)!1!(ne)$);
+\coordinate (b14x1) at ($(sw)!0.297671957671958!(ne)$);
+\coordinate (b14y1) at ($(sw)!1.00020703933747!(ne)$);
+\coordinate (b14x2) at ($(sw)!0.215714285714286!(ne)$);
+\coordinate (b14y2) at ($(sw)!0.723240165631469!(ne)$);
+\coordinate (b14x3) at ($(sw)!0.371428571428571!(ne)$);
+\coordinate (b14y3) at ($(sw)!0.593167701863355!(ne)$);
+\coordinate (b29x1) at ($(sw)!0.209100529100529!(ne)$);
+\coordinate (b29y1) at ($(sw)!0.531418219461698!(ne)$);
+\coordinate (b29x2) at ($(sw)!0.062804232804232!(ne)$);
+\coordinate (b29y2) at ($(sw)!0.455020703933747!(ne)$);
+\coordinate (b29x3) at ($(sw)!0!(ne)$);
+\coordinate (b29y3) at ($(sw)!0.350931677018634!(ne)$);
+\coordinate (b44x1) at ($(sw)!0.935185185185186!(ne)$);
+\coordinate (b44y1) at ($(sw)!0.454606625258799!(ne)$);
+\coordinate (b44x2) at ($(sw)!0.800899470899472!(ne)$);
+\coordinate (b44y2) at ($(sw)!0.523654244306418!(ne)$);
+\coordinate (b44x3) at ($(sw)!0.67936507936508!(ne)$);
+\coordinate (b44y3) at ($(sw)!0.527950310559006!(ne)$);
+\draw[line width=0.1pt, line cap=rect,line join=round]
+ (c1x |- c1y) -- (c2x |- c2y) -- (c3x |- c3y) -- (c4x |- c4y) -- (c5x |- c5y) -- (c6x |- c6y) -- (c7x |- c7y) -- (c8x |- c8y) -- (c9x |- c9y) -- (c10x |- c10y) -- (c11x |- c11y) .. controls (b11x1 |- b11y1) and (b11x2 |- b11y2) .. (b11x3 |- b11y3) -- (c12x |- c12y) -- (c13x |- c13y) -- (c14x |- c14y) .. controls (b14x1 |- b14y1) and (b14x2 |- b14y2) .. (b14x3 |- b14y3) -- (c15x |- c15y) -- (c16x |- c16y) -- (c17x |- c17y) -- (c18x |- c18y) -- (c19x |- c19y) -- (c20x |- c20y) -- (c21x |- c21y) -- (c22x |- c22y) -- (c23x |- c23y) -- (c24x |- c24y) -- (c25x |- c25y) -- (c26x |- c26y) -- (c27x |- c27y) -- (c28x |- c28y) -- (c29x |- c29y) .. controls (b29x1 |- b29y1) and (b29x2 |- b29y2) .. (b29x3 |- b29y3) -- (c30x |- c30y) -- (c31x |- c31y) -- (c32x |- c32y) -- (c33x |- c33y) -- (c34x |- c34y) -- (c35x |- c35y) -- (c36x |- c36y) -- (c37x |- c37y) -- (c38x |- c38y) -- (c39x |- c39y) -- (c40x |- c40y) -- (c41x |- c41y) -- (c42x |- c42y) -- (c43x |- c43y) -- (c44x |- c44y) .. controls (b44x1 |- b44y1) and (b44x2 |- b44y2) .. (b44x3 |- b44y3);
+ (c45x |- c45y) -- (c46x |- c46y) -- (c47x |- c47y) -- (c48x |- c48y) -- (c49x |- c49y) -- (c50x |- c50y) -- (c51x |- c51y) -- (c52x |- c52y) -- (c53x |- c53y) -- (c54x |- c54y) -- (c55x |- c55y) -- (c56x |- c56y) -- (c57x |- c57y) -- (c58x |- c58y) -- (c59x |- c59y) -- (c60x |- c60y) -- (c61x |- c61y) -- (c62x |- c62y) -- (c63x |- c63y) -- (c64x |- c64y) -- cycle;
+ }
+]
+
+%%%%% resources %%%%%
+
+\tikzstyle{pool} = [
+ draw
+]
+
+\tikzstyle{pool label} = [
+ pool,
+ label={[rotate=90,anchor=north]left:\footnotesize #1},
+ fit margins={left=0.8em,right=0.1em,bottom=0.1em,top=0.1em},
+ path picture = {
+ \def\x{1.2em}
+ \draw ($(path picture bounding box.north west)+(\x,0)$) to ($(path picture bounding box.south west)+(\x,0)$);
+ }
+]
+
+%%%%% data %%%%%
+
+\tikzstyle{data object} = [
+ inner sep=0,
+ minimum width=1em,
+ minimum height=1.5em,
+ path picture = {
+ \def\i{0.3em}
+ \draw (path picture bounding box.north west) to (path picture bounding box.south west) to (path picture bounding box.south east) |- ($(path picture bounding box.north east)+(-\i,-\i)$) |- cycle;
+ \draw ($(path picture bounding box.north east)+(-\i,0)$) to ($(path picture bounding box.north east)+(0,-\i)$);
+ }
+]
+
+\tikzstyle{data collection} = [
+ data object,
+ label={[anchor=south,inner sep=0]below:\tikzmultimarker}
+]
+
+\tikzstyle{data store} = [
+ database,
+ database segment height=0.3mm,
+ database bottom segment height=3mm,
+ database aspect ratio=0.25,
+ database radius=0.35cm
+]
+
+%adapted from https://tex.stackexchange.com/questions/442991/database-shape-in-tikz
+\makeatletter
+\tikzset{
+ database/.style={
+ path picture={
+ \draw (0, 1.5*\database@segmentheight+0.5*\database@bottomsegmentheight) circle [x radius=\database@radius,y radius=\database@aspectratio*\database@radius];
+ \draw (-\database@radius, 0.5*\database@segmentheight+0.5*\database@bottomsegmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius];
+ \draw (-\database@radius,-0.5*\database@segmentheight+0.5*\database@bottomsegmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius];
+ \draw (-\database@radius,1.5*\database@segmentheight+0.5*\database@bottomsegmentheight)
+ to ++(0,-2*\database@segmentheight-\database@bottomsegmentheight)
+ arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius]
+ to ++(0,2*\database@segmentheight+\database@bottomsegmentheight);
+ },
+ minimum width=2*\database@radius + 2*\pgflinewidth,
+ minimum height=2*\database@segmentheight + \database@bottomsegmentheight + 2*\database@aspectratio*\database@radius + 2*\pgflinewidth,
+ },
+ database segment height/.store in=\database@segmentheight,
+ database bottom segment height/.store in=\database@bottomsegmentheight,
+ database radius/.store in=\database@radius,
+ database aspect ratio/.store in=\database@aspectratio,
+ database segment height=0.1cm,
+ database radius=0.25cm,
+ database aspect ratio=0.35,
+}
+\makeatother
diff --git a/graphics/pgf/contrib/tikz-decofonts/README.md b/graphics/pgf/contrib/tikz-decofonts/README.md
new file mode 100644
index 0000000000..684a360e7c
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-decofonts/README.md
@@ -0,0 +1,8 @@
+This package provides some macros to present simple decoration fonts, made with TikZ.
+Available decorations are brushpaint and inkline, and gridlcd.
+-------------------------------------------------------------------------------------
+Author...: Cédric Pierquet
+email....: cpierquet@outlook.fr
+Licences.: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
+ CC BY-SA 4.0 (https://tex.stackexchange.com/questions/475141/simulating-paintbrush-strokes-in-tikz from user121799)
+ CC BY-SA 4.0 (https://tex.stackexchange.com/questions/460836/custom-line-cap-to-simulate-inked-line-in-tikz/460842#460842 from user121799) \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz-decofonts/doc/tikz-decofonts-doc.pdf b/graphics/pgf/contrib/tikz-decofonts/doc/tikz-decofonts-doc.pdf
new file mode 100644
index 0000000000..cf67b2a862
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-decofonts/doc/tikz-decofonts-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikz-decofonts/doc/tikz-decofonts-doc.tex b/graphics/pgf/contrib/tikz-decofonts/doc/tikz-decofonts-doc.tex
new file mode 100644
index 0000000000..5b62282d15
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-decofonts/doc/tikz-decofonts-doc.tex
@@ -0,0 +1,469 @@
+% !TeX TXS-program:compile = txs:///arara
+% arara: pdflatex: {shell: no, synctex: no, interaction: batchmode}
+% arara: pdflatex: {shell: no, synctex: no, interaction: batchmode}
+
+\documentclass[11pt,a4paper]{ltxdoc}
+\usepackage{amsmath}
+\usepackage{bera}
+\usepackage{inconsolata}
+\usepackage[T1]{fontenc}
+\usepackage[scale=0.875]{cabin}
+\usepackage{tikz-decofonts}
+\usepackage{fancyvrb}
+\usepackage{setspace}
+\usepackage{fancyhdr}
+\usepackage{tabularray}
+\usepackage{fontawesome5}
+\fancyhf{}
+\renewcommand{\headrulewidth}{0pt}
+\lfoot{\sffamily\small [tikz-decofonts]}
+\cfoot{\sffamily\small - \thepage{} -}
+\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
+\usepackage{hologo}
+\providecommand\tikzlogo{Ti\textit{k}Z}
+\providecommand\TeXLive{\TeX{}Live\xspace}
+\let\TikZ\tikzlogo
+
+\usepackage{hyperref}
+\urlstyle{same}
+\hypersetup{pdfborder=0 0 0}
+\usepackage[margin=2cm]{geometry}
+\setlength{\parindent}{0pt}
+\def\TPversion{0.1.2}
+\def\TPdate{03/02/2025}
+\usepackage{tcolorbox}
+\tcbuselibrary{breakable,skins,hooks,listingsutf8}
+
+\lstset{
+ language=[LaTeX]TeX,%
+ basicstyle=\ttfamily,%
+ keywordstyle={\color{blue}},%
+ classoffset=0,%
+ keywords={},%
+ alsoletter={-},%
+ keywordstyle={\color{blue}},%
+ classoffset=1,%
+ alsoletter={-},%
+ morekeywords={commalists-tools},%
+ keywordstyle={\color{violet}},%
+ classoffset=2,%
+ alsoletter={-},%
+ morekeywords={\tkzbrush,\tkzink,\tkzpixl,\tkzpixletter,\tkzpixlquote,\tkzcomicbubble},%
+ keywordstyle={\color{green!50!black}},%
+ classoffset=3,%
+ morekeywords={},%
+ keywordstyle={\color{orange}}
+}
+
+\newtcblisting{DemoCode}[1]{%
+ enhanced,width=\linewidth,%
+ bicolor,size=title,%
+ colback=cyan!10!white,%
+ colbacklower=cyan!5!white,%
+ colframe=cyan!75!black,%
+ listing options={%
+ breaklines=true,%
+ breakatwhitespace=true,%
+ style=tcblatex,basicstyle=\small\ttfamily,%
+ tabsize=4,%
+ commentstyle={\itshape\color{gray}},
+ keywordstyle={\color{blue}},%
+ classoffset=0,%
+ keywords={\usepackage,\includegraphics,xstring,listofitems,\readlist,\showitems,\xintFor,\xintSeq},%
+ alsoletter={-},%
+ keywordstyle={\color{blue}},%
+ classoffset=1,%
+ alsoletter={-},%
+ morekeywords={euromoney},%
+ keywordstyle={\color{violet}},%
+ classoffset=2,%
+ alsoletter={-},%
+ morekeywords={\tkzbrush,\tkzink,\tkzpixl,\tkzpixletter,\tkzpixlquote,\tkzbicolor,\tkzcomicbubble},%
+ keywordstyle={\color{green!50!black}},%
+ classoffset=3,%
+ morekeywords={color,lines,scale,height,offseth,offsetv,thick,gridcolor,gridafter,nospaceafter,border,colors,style,intdelta,paralcolors},%
+ keywordstyle={\color{orange}}
+ },%
+ #1
+}
+
+\newtcbinputlisting\DemoCodeFile[1]{%
+ enhanced,width=\linewidth,%
+ bicolor,size=title,%
+ colback=lightgray!10!white,%
+ colbacklower=lightgray!5!white,%
+ colframe=lightgray!75!black,%
+ listing options={%
+ breaklines=true,%
+ breakatwhitespace=true,%
+ style=tcblatex,
+ basicstyle=\scriptsize\ttfamily,%
+ tabsize=4,%
+ commentstyle={\itshape\color{gray}},%
+ %lastline=148
+ },%
+ breakable,
+ listing only,%
+ listing file={#1}
+}
+
+\NewDocumentCommand\ShowCode{ m }{%
+ \lstinline{#1}%
+}
+
+\def\sampleformula{$\displaystyle\int_0^1 \dfrac{1+x}{1+x^2}\,\mathrm{d}x$}
+\def\sampletxt{But I must explain to you how all this mistaken idea of denouncing pleasure.}
+\def\samplenum{1500}
+
+\begin{document}
+
+\thispagestyle{empty}
+
+\begin{center}
+ \begin{minipage}{0.88\linewidth}
+ \begin{tcolorbox}[colframe=yellow,colback=yellow!15]
+ \begin{center}
+ \renewcommand{\arraystretch}{1.25}%
+ \begin{tabular}{c}
+ {\Huge \texttt{tikz-decofonts}}\\
+ \\
+ {\LARGE Simple "decoration" fonts, made} \\
+ {\LARGE with Ti\textit{k}Z, for small texts\ldots} \\
+ \\
+ {\small \texttt{Version \TPversion{} -- \TPdate}}
+ \end{tabular}
+ \end{center}
+ \end{tcolorbox}
+ \end{minipage}
+\end{center}
+
+\begin{center}
+ \begin{tabular}{c}
+ \texttt{Cédric Pierquet}\\
+ {\ttfamily c pierquet -- at -- outlook . fr}\\
+ \texttt{\url{https://forge.apps.education.fr/pierquetcedric/packages-latex}} \\
+ \end{tabular}
+\end{center}
+
+\hrule
+
+\vfill
+
+\begin{tcblisting}{colframe=lightgray,colback=lightgray!5,listing only}
+%paintbrush effect
+\tkzbrush[color=blue]{DECORATION}
+%paintink effect
+\tkzink[color=orange]{DECORATION}
+%pixeletter effect
+\tkzpixl[color=violet]{DECORATION}
+%bicolor effect
+\tkzbicolor[colors=blue/red,style=ndiag]{\Huge\sffamily DECORATION}
+\tkzbicolor[colors=teal/orange,style=ellips]{\Huge\sffamily DECORATION}
+\end{tcblisting}
+
+\begin{tcolorbox}[colframe=lightgray,colback=lightgray!5]
+\tkzbrush[color=blue]{DECORATION}
+\end{tcolorbox}
+
+\begin{tcolorbox}[colframe=lightgray,colback=lightgray!5]
+\hfill\tkzink[color=orange]{DECORATION}\hfill~
+\end{tcolorbox}
+
+\begin{tcolorbox}[colframe=lightgray,colback=lightgray!5]
+\hfill\tkzpixl[color=violet]{Decoration}
+\end{tcolorbox}
+
+\begin{tcolorbox}[colframe=lightgray,colback=lightgray!5]
+\hfill\tkzbicolor[colors=blue/red,style=ndiag]{\Huge\sffamily DECORATION}~~\tkzbicolor[colors=teal/orange,style=ellips]{\Huge\sffamily DECORATION}\hfill~
+\end{tcolorbox}
+
+\vfill~
+
+\hrule
+
+\vspace*{5mm}
+
+\textit{Ideas and parts of codes, with \texttt{CC\,BY-SA\,4.0} licenses, come from :}
+
+\begin{itemize}
+ \item \href{https://tex.stackexchange.com/questions/475141/simulating-paintbrush-strokes-in-tikz}{[link on tex.stackexchange]} from \textsf{user121799} for paintbrush;
+ \item \href{https://tex.stackexchange.com/questions/460836/custom-line-cap-to-simulate-inked-line-in-tikz/460842#460842}{[link on tex.stackexchange]} from \textsf{user121799} for inkbrush.
+\end{itemize}
+
+\pagebreak
+
+\phantomsection
+
+\hypertarget{matoc}{}
+
+\tableofcontents
+
+\vspace*{5mm}
+
+%\hrule
+
+\pagebreak
+
+\section{Loading, useful packages, purposes and acknowledgments}
+
+\subsection{Loading and useful packages}
+
+In order to load \texttt{tikz-decofonts}, simply use:
+
+\begin{DemoCode}{listing only}
+\usepackage{tikz-decofonts}
+\end{DemoCode}
+
+Loaded packages are \texttt{tikz}, \texttt{xintexpr}, \texttt{simplekv}, \texttt{listofitems} and \texttt{xstring}.
+
+Loaded \texttt{tikz.librairies} are \texttt{decorations}, \texttt{decorations.pathreplacing}, \texttt{calc}, \texttt{positioning}, \texttt{bbox}, \texttt{arrows.meta}, \texttt{shapes.callouts} and \texttt{bending}.
+
+\smallskip
+
+Globally, height of rendering is about 1cm, but some customization are available.
+
+\subsection{Purposes and acknowledgments}
+
+The purposes of this small package is not to provide full fonts, with all characters, but give restricted possibility to present \textbf{short} texts of title with \textit{cute} effects.
+
+\smallskip
+
+These decorations are not destined to be use for whole paragraphs or texts, but just for fun for small titles or small texts.
+
+\smallskip
+
+Since many calculations are required internally, compilation time can be increased, so be careful with intensive use!
+
+\smallskip
+
+\textit{Ideas and parts of codes, with \texttt{CC\,BY-SA\,4.0} licenses, come from:}
+
+\begin{itemize}
+ \item \href{https://tex.stackexchange.com/questions/475141/simulating-paintbrush-strokes-in-tikz}{[link on tex.stackexchange]} from \textsf{user121799} for paintbrush;
+ \item \href{https://tex.stackexchange.com/questions/460836/custom-line-cap-to-simulate-inked-line-in-tikz/460842#460842}{[link on tex.stackexchange]} from \textsf{user121799} for inkbrush.
+\end{itemize}
+
+Some adjustments (keys, paths) are maid from original code, but the global usage is due to the links above !
+
+\pagebreak
+
+\section{The different effects}
+
+\subsection{Paint brush}
+
+{\small\faBomb} The effect is \textbf{very} \textit{time-consuming} to compile !!
+
+\begin{DemoCode}{listing only}
+%only uppercase letters allowed
+\tkzbrush[color=...,lines=...,scale=...]<tikzpicture options>{short text}
+
+%color = black by default
+%lines = 12 by default
+%scale = 1 by default
+\end{DemoCode}
+
+\begin{DemoCode}{listing only}
+%default output
+\tkzbrush{TIKZ DECORATION}
+\end{DemoCode}
+
+\begin{DemoCode}{text only}
+%default output
+\tkzbrush{TIKZ DECORATION}
+
+\end{DemoCode}
+
+\begin{DemoCode}{listing only}
+%customization(s) (external file for speeding rendering ^^)
+\tkzbrush[color=red,lines=20,scale=1.5]{CUSTOM TEXT}
+\end{DemoCode}
+
+\begin{DemoCode}{text only}
+%customization(s) (external file for speeding rendering ^^)
+\includegraphics{tkzbrushA.pdf}
+\end{DemoCode}
+
+\pagebreak
+
+\subsection{Ink brush}
+
+\begin{DemoCode}{listing only}
+%only uppercase letters allowed
+\tkzink[color=...,thick=...,scale=...]<tikzpicture options>{short text}
+
+%color = black by default
+%thick = 3 by default
+%scale = 1 by default
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%default output
+\tkzink{TIKZ DECORATION}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%customization(s)
+\tkzink[color=olive,thick=5,scale=2]{TIKZ DECORATION}
+\end{DemoCode}
+
+\pagebreak
+
+\subsection{Pixl brush}
+
+\begin{DemoCode}{listing only}
+%regular letters allowed (upper and/or lower), rendered characters are 5 columns x 7 lines
+\tkzpixl%
+ [height=...,thick=...,color=...,gridcolor=...,border=...,
+ offseth=...,offsetv=...,gridafter=...,nospaceafter=...]
+ <tikzpicture options>{short text}
+
+\tkzpixletter%
+ [height=...,thick=...,color=...,gridcolor=...,border=...,
+ offseth=...,offsetv=...,gridafter=...,nospaceafter=...]
+ <tikzpicture options>{letter}
+
+\tkzpixlquote%if problem with '...
+ [height=...,thick=...,color=...,gridcolor=...,
+ offseth=...,offsetv=...,gridafter=...,nospaceafter=...]
+ <tikzpicture options>
+
+%height = 11mm by default, thick = 0.1mm by default
+%color = black by default, gridcolor = gray by default
+%offseth = 1 by default (squares left/right of regular character)
+%offsetv = 2 by default (squares above/below of regular character)
+%boder = false by default (boolean for adding border)
+%gridafter = false by default (boolean for showing grid after pixls)
+%nospaceafter = false by default (boolean for removeing hspace after pixls)
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%default output, comparaison with character w/o offsets (5*7)
+\tkzpixl{And then, 1+1=2 !?!} and \tkzpixletter[offseth=0,offsetv=0]{*}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%customization(s)
+\tkzpixl[color=violet,height=1.75cm,gridafter,offsetv=3,border]{Small custo'm text}
+\end{DemoCode}
+
+\pagebreak
+
+\subsection{Bicolor effect}
+
+\begin{DemoCode}{listing only}
+%compatible with all fonts and/or sizes
+\tkzbicolor%
+ [colors=...,style=...,intdelta=...]
+ {text}
+
+\tkzbicolor%with paral style
+ [paralcolors=...,style=paral,intdelta=...]
+ {text}
+
+%style = midh/midv/rect/ellips/paral (paral by default)
+%colors = red/blue by default,
+%paralcolors = red/blue/orange/gray by default
+%intdelta = 0.66 by default, percentage of int dim for ellips/rect
+\end{DemoCode}
+
+\begin{DemoCode}{listing only}
+\def\sampleformula{$\displaystyle\int_0^1 \dfrac{1+x}{1+x^2}\,\mathrm{d}x$}
+\def\sampletxt{But I must explain to you how all this mistaken idea of denouncing pleasure.}
+\def\samplenum{1500}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\tkzbicolor[style=midh]{\sampleformula}
+or \tkzbicolor[colors=violet/magenta,style=midv]{\sampleformula}
+or \tkzbicolor[colors=darkgray/olive,style=ndiag]{\sampleformula}
+or \tkzbicolor[colors=orange/teal,style=sdiag]{\sampleformula}
+or \tkzbicolor[colors=orange/teal,style=ellips]{\sampleformula}
+or \tkzbicolor[colors=pink/violet,style=rect]{\sampleformula}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\tkzbicolor[style=midh]{\sampletxt}\par
+\tkzbicolor[colors=violet/magenta,style=midv]{\sampletxt}\par
+\tkzbicolor[colors=darkgray/olive,style=ndiag]{\sampletxt}\par
+\tkzbicolor[colors=orange/teal,style=sdiag]{\sampletxt}\par
+\tkzbicolor[colors=orange/teal,style=ellips]{\sampletxt}\par
+\tkzbicolor[colors=pink/violet,style=rect]{\sampletxt}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\tkzbicolor[style=midh]{\parbox{2.5cm}{\sampletxt}}
+\tkzbicolor[colors=violet/gray,style=midv]{\parbox{2.5cm}{\sampletxt}}
+\tkzbicolor[colors=darkgray/olive,style=ndiag]{\parbox{2.5cm}{\sampletxt}}
+\tkzbicolor[colors=orange/cyan,style=sdiag]{\parbox{2.5cm}{\sampletxt}}
+\tkzbicolor[colors=pink/violet,style=ellips]{\parbox{2.5cm}{\sampletxt}}
+\tkzbicolor[colors=pink/violet,style=ellips,intdelta=0.85]{\parbox{2.5cm}{\sampletxt}}
+\tkzbicolor[colors=cyan/darkgray,style=rect]{\parbox{2.5cm}{\sampletxt}}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\tkzbicolor[style=paral]{\parbox{6cm}{\large\sffamily\sampletxt}}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\tkzbicolor[style=midh]{\samplenum}\par
+\tkzbicolor[colors=violet/magenta,style=midv]{\samplenum}\par
+\tkzbicolor[colors=darkgray/olive,style=ndiag]{\samplenum}\par
+\tkzbicolor[colors=orange/teal,style=sdiag]{\samplenum}\par
+\tkzbicolor[colors=orange/teal,style=ellips]{\samplenum}
+\end{DemoCode}
+
+\pagebreak
+
+\subsection{Comic bubble}
+
+\begin{DemoCode}{listing only}
+%style tikz
+\tikzset{comicbubble/.style args={#1#2}{%
+ inner sep=1mm,line join=round,rectangle callout,draw,very thick,
+ text width=#1,align=flush center,callout relative pointer=#2}}
+\end{DemoCode}
+
+\begin{DemoCode}{listing only}
+%independant macro
+\tkzcomicbubble[%
+ width=...,coltxt=...,colbg=...,colframe=...,pospointer=(...),
+ font=...,rcorners=true/false]%
+ <tikz options>{text}
+
+%with tikzpicture environment
+\begin{tikzpicture}
+ %...
+ \tkzcomicbubble*[%
+ width=...,coltxt=...,colbg=...,colframe=...,pospointer=(...),
+ font=...,rcorners=true/false]%
+ <tikz options>{text}
+\end{tikzpicture}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\def\mytext{Let's play with Pythagoras !\relax}
+\tkzcomicbubble[font=\large\bfseries\itshape]{\mytext}~~
+\tkzcomicbubble%
+ [width=3cm,coltxt=red,colframe=teal,font=\bfseries,
+ colbg=yellow!15,pospointer={(150:1em)},rcorners]%
+ <thick>%
+ {\mytext}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%\usepackage{setspace}
+\def\mytext{Let's use Pythagoras !\relax}
+{\tikz[rotate=-15,transform shape]\tkzcomicbubble*[width=2.5cm,font=\large\sffamily]<execute at begin node={\setlength{\baselineskip}{0.75\baselineskip}}>{\mytext};}
+\end{DemoCode}
+
+\pagebreak
+
+\section{History}
+
+\texttt{0.1.2: Comic bubble}
+
+\texttt{0.1.1: Bicolor effect}
+
+\texttt{0.1.0: Initial version}
+
+\end{document}
diff --git a/graphics/pgf/contrib/tikz-decofonts/doc/tkzbrushA.pdf b/graphics/pgf/contrib/tikz-decofonts/doc/tkzbrushA.pdf
new file mode 100644
index 0000000000..764b4cc3a4
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-decofonts/doc/tkzbrushA.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikz-decofonts/doc/tkzbrushA.tex b/graphics/pgf/contrib/tikz-decofonts/doc/tkzbrushA.tex
new file mode 100644
index 0000000000..e130834119
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-decofonts/doc/tkzbrushA.tex
@@ -0,0 +1,11 @@
+% !TeX TXS-program:compile = txs:///arara
+% arara: pdflatex: {shell: no, synctex: no, interaction: batchmode}
+
+\documentclass{standalone}
+\usepackage{tikz-decofonts}
+
+\begin{document}
+
+\tkzbrush[color=red,lines=20,scale=1.5]{CUSTOM TEXT}
+
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz-decofonts/tex/tikz-decofonts.sty b/graphics/pgf/contrib/tikz-decofonts/tex/tikz-decofonts.sty
new file mode 100644
index 0000000000..076894fdf9
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-decofonts/tex/tikz-decofonts.sty
@@ -0,0 +1,1008 @@
+% Author : C. Pierquet
+% licences : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
+% : CC BY-SA 4.0 (https://tex.stackexchange.com/questions/475141/simulating-paintbrush-strokes-in-tikz from user121799)
+% : (https://tex.stackexchange.com/questions/460836/custom-line-cap-to-simulate-inked-line-in-tikz/460842#460842 from user121799)
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{tikz-decofonts}[2025/02/03 0.1.2 Custom fonts, made with TikZ, with effects]
+
+%------History
+% 0.1.2 Bd fonts (with callout.shapes)
+% 0.1.1 Bicolor txt
+% 0.1.0 Initial version
+
+%------Packages and library
+\RequirePackage{tikz}
+\RequirePackage{xstring}
+\RequirePackage{xintexpr}
+\RequirePackage{listofitems}
+\RequirePackage{simplekv}
+\usetikzlibrary{decorations,decorations.pathreplacing,calc,positioning,bbox,arrows.meta,bending,shapes.callouts}
+
+%------Paintbrush
+\pgfmathdeclarerandomlist{randcolor}{{black}{white}}
+\pgfkeys{/brush pars/.cd,
+ lines/.initial={\tkzbrushlines},
+ distance/.initial=0.25pt
+}
+\tikzset{
+ brush/.style={
+ decorate,
+ decoration={
+ show path construction,
+ lineto code={
+ \foreach\Xbrush in{1,...,\pgfkeysvalueof{/brush pars/lines}}{
+ \pgfmathrandomitem{\c}{randcolor}
+ \pgfmathtruncatemacro{\mix}{100-24*rnd}
+ \draw[color=brushcolor!\mix!\c,
+ shorten >={(3-4*rnd)*1pt
+ -0.5*\pgfkeysvalueof{/brush pars/lines}*\pgfkeysvalueof{/brush pars/distance}},
+ shorten <={(3-4*rnd)*1pt
+ -0.5*\pgfkeysvalueof{/brush pars/lines}*\pgfkeysvalueof{/brush pars/distance}}]
+ let \p1=($(\tikzinputsegmentlast)-(\tikzinputsegmentfirst)$),
+ \n1={90+atan2(\y1,\x1)} in
+ ($(\tikzinputsegmentfirst)+(\n1:{((1.02-0.04*rnd)*\Xbrush-\pgfkeysvalueof{/brush pars/lines}/2)*\pgfkeysvalueof{/brush pars/distance}})$)
+ --
+ ($(\tikzinputsegmentlast)+(\n1:{((1.02-0.04*rnd)*\Xbrush-\pgfkeysvalueof{/brush pars/lines}/2)*\pgfkeysvalueof{/brush pars/distance}})$);
+ }
+ },
+ curveto code={
+ \foreach\Xbrush in{1,...,\pgfkeysvalueof{/brush pars/lines}}{
+ \pgfmathrandomitem{\c}{randcolor}
+ \pgfmathtruncatemacro{\mix}{100-24*rnd}
+ \draw[color=brushcolor!\mix!\c,shorten >={(3-4*rnd)*1pt
+ -0.5*\pgfkeysvalueof{/brush pars/lines}*\pgfkeysvalueof{/brush pars/distance}},
+ shorten <={(3-4*rnd)*1pt
+ -0.5*\pgfkeysvalueof{/brush pars/lines}*\pgfkeysvalueof{/brush pars/distance}}]
+ let \p1=($(\tikzinputsegmentsupporta)-(\tikzinputsegmentfirst)$),
+ \p2=($(\tikzinputsegmentsupportb)-(\tikzinputsegmentsupporta)$),
+ \p3=($(\tikzinputsegmentlast)-(\tikzinputsegmentsupportb)$),
+ \n1={90+atan2(\y1,\x1)}, \n2={90+atan2(\y2,\x2)},
+ \n3={90+atan2(\y3,\x3)} in
+ ($(\tikzinputsegmentfirst)+(\n1:{((1.02-0.04*rnd)*\Xbrush-\pgfkeysvalueof{/brush pars/lines}/2)*\pgfkeysvalueof{/brush pars/distance}})$)
+ .. controls ($(\tikzinputsegmentsupporta)+(\n2:{((1.02-0.04*rnd)*\Xbrush-\pgfkeysvalueof{/brush pars/lines}/2)*\pgfkeysvalueof{/brush pars/distance}})$)
+ and ($(\tikzinputsegmentsupportb)+(\n3:{((1.02-0.04*rnd)*\Xbrush-\pgfkeysvalueof{/brush pars/lines}/2)*\pgfkeysvalueof{/brush pars/distance}})$) ..
+ ($(\tikzinputsegmentlast)+(\n3:{((1.02-0.04*rnd)*\Xbrush-\pgfkeysvalueof{/brush pars/lines}/2)*\pgfkeysvalueof{/brush pars/distance}})$);
+ }
+ },
+ }
+ }
+}
+\tikzset{pics/.cd,
+ brushA/.style={code={%
+ \draw[brush] (0,-0.5) -- (0.25,0.5) -- (0.5,-0.5);
+ \draw[brush] (0.125,-0.15) -- (0.375,-0.15);
+ %\path (0.725,0);%
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }%
+ },
+ brushB/.style={code={%
+ \draw[brush] (0,-0.5) -- (0,0.5) to[out=0,in=0,looseness=2.5] (0,0) to[out=0,in=0,looseness=3] cycle;
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushC/.style={code={%
+ \draw[brush] (0,0) to[out=90,in=180] (0.25,0.5) to[out=0,in=110] (0.5,0.325) ;
+ \draw[brush] (0,0) to[out=-90,in=180] (0.25,-0.5) to[out=0,in=-110] (0.5,-0.325) ;
+ %\draw[brush] (0,0) to[out=90,in=110,looseness=2] (0.5,0.325);
+ %\draw[brush](0,0) to[out=-90,in=-110,looseness=2] (0.5,-0.2325);
+ %\path (0.7,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushD/.style={code={%
+ \draw[brush] (0,-0.5) -- (0,0.5) to[out=0,in=0,looseness=1.75] cycle;
+ %\path (0.675,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushE/.style={code={%
+ \draw[brush] (0.425,-0.5) --(0,-0.5) -- (0,0.5) -- (0.425,0.5);
+ \draw[brush] (0,0) -- (0.425,0);
+ \path (0.5,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushF/.style={code={%
+ \draw[brush] (0,-0.5) -- (0,0.5) -- (0.425,0.5);
+ \draw[brush] (0,0) -- (0.425,0);
+ \path (0.5,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushG/.style={code={%
+ \draw[brush] (0,0) to[out=90,in=180] (0.25,0.5) to[out=0,in=100] (0.475,0.325) ;
+ \draw[brush] (0,0) to[out=-90,in=180] (0.25,-0.5) to[out=0,in=-110] (0.475,-0.1) ;
+ \draw[brush] (0.475,-0.1) to (0.275,-0.1);
+ %\draw[brush] (0,0) to[out=90,in=110,looseness=2] (0.5,0.25);
+ %\draw[brush] (0,0) to[out=-90,in=-110,looseness=2] (0.5,-0.25);
+ %\draw[brush] (0.5,-0.25) to (0.25,-0.25);
+ %\path (0.7,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushH/.style={code={%
+ \draw[brush] (0,-0.5) -- (0,0.5);
+ \draw[brush] (0.5,-0.5) -- (0.5,0.5);
+ \draw[brush] (0,0) -- (0.5,0);
+ %\path (0.7,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushI/.style={code={%
+ \draw[brush] (0,-0.5) -- (0,0.5);
+ %\path (0.25,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushJ/.style={code={%
+ \draw[brush] (0.35,0.5) -- (0.35,-0.35) to[out=-90,in=0] (0.175,-0.5) to[out=180,in=-90] (0,-0.3);
+ %\path (0.45,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushK/.style={code={%
+ \draw[brush] (0,-0.5) -- (0,0.5);
+ \draw[brush] (0.4,0.475) -- (0.02,0) -- (0.4,-0.475);
+ %\path (0.6,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushL/.style={code={
+ \draw[brush] (0,0.5) -- (0,-0.5) -- (0.5,-0.5);
+ %\path (0.6,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushM/.style={code={
+ \draw[brush] (0,-0.5) -- (0,0.5) -- (0.25,0.25) -- (0.5,0.5) -- (0.5,-0.5);
+ %\path (0.8,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushN/.style={code={
+ \draw[brush] (0,-0.5) -- (0,0.5) -- (0.5,-0.5) -- (0.5,0.5);
+ %\path (0.8,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushO/.style={code={
+ \draw[brush] (0.25,0) circle(0.25 and 0.5);
+ %\path (0.8,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushP/.style={code={
+ \draw[brush] (0,-0.5) -- (0,0.5) to[out=0,in=0,looseness=2.5] (0,0);
+ %\path (0.6,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushQ/.style={code={
+ \draw[brush] (0.25,0) circle(0.25 and 0.5);
+ \draw[brush](0.35,-0.25) -- (0.475,-0.45);
+ %\path (0.8,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushR/.style={code={
+ \draw[brush] (0,-0.5) -- (0,0.5) to[out=0,in=0,looseness=2.5] (0.05,0) -- (0.5,-0.5);
+ %\path (0.6,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushS/.style={code={
+ \draw[brush] (0.475,0.475) to[out=150,in=165,looseness=2.25] (0.25,0) to[out=-15,in=-30,looseness=2.25] (0.025,-0.475);
+ %\path (0.65,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushT/.style={code={
+ \draw[brush] (0.25,-0.5) -- (0.25,0.5) (0,0.5) -- (0.5,0.5);
+ %\path (0.85,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushU/.style={code={
+ \draw[brush] (0,0.5) -- (0,0) to[out=-90,in=-90,looseness=4] (0.5,0) -- (0.5,0.5);
+ %\path (0.8,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushV/.style={code={
+ \draw[brush] (0,0.5) -- (0.25,-0.5) -- (0.5,0.5);
+ %\path (0.8,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushW/.style={code={
+ \draw[brush] (0,0.5) -- (0.15,-0.5) -- (0.3,-0.25) -- (0.45,-0.5) -- (0.6,0.5);
+ %\path (1.1,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushX/.style={code={
+ \draw[brush] (0,0.5) -- (0.5,-0.5);
+ \draw[brush] (0.5,0.5) -- (0,-0.5);
+ %\path (0.8,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushY/.style={code={
+ \draw[brush] (0,0.5) -- (0.25,0);
+ \draw[brush] (0.5,0.5) -- (0,-0.5);
+ %\path (0.8,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushZ/.style={code={
+ \draw[brush] (0,0.5) --(0.5,0.5) -- (0,-0.5) -- (0.5,-0.5);
+ %\path (0.8,0);
+ %\filldraw[blue] (0,0) circle[radius=2pt] ;
+ }
+ },
+ brushspace/.style={code={\path (0,0) (0.2,0);}},
+}
+
+
+\defKV[tkzbrush]{%
+ scale=\def\tkzbrushscale{#1},%
+ color=\colorlet{brushcolor}{#1},%
+ lines=\def\tkzbrushlines{#1},%
+ thick=\def\tkzbrushthick{#1}
+}
+
+\setKVdefault[tkzbrush]{%
+ scale=1,%
+ color=black,%
+ lines=12,%
+ thick=3
+}
+
+%------inkbrush
+\pgfdeclarearrow{
+ name=ink,
+ parameters= {\the\pgfarrowlength},
+ setup code={
+ \pgfarrowssettipend{0pt}
+ \pgfarrowssetlineend{-\pgfarrowlength}
+ \pgfarrowlinewidth=\pgflinewidth
+ \pgfarrowssavethe\pgfarrowlength
+ },
+ drawing code={
+ \pgfpathmoveto{\pgfpoint{-\pgfarrowlength}{0.5\pgflinewidth}}
+ \pgfpathcurveto{\pgfpoint{-0.75\pgfarrowlength}{0.6\pgflinewidth}}{%
+ \pgfpoint{-0.01\pgfarrowlength}{0.6\pgflinewidth}}{%
+ \pgfpoint{0pt}{0pt}}
+ \pgfpathcurveto{\pgfpoint{-0.01\pgfarrowlength}{-0.5\pgflinewidth}}{%
+ \pgfpoint{-0.2\pgfarrowlength}{-(1+0.3*rnd)*\pgflinewidth}}{%
+ \pgfpoint{-0.3\pgfarrowlength}{-0.8*(1+0.3*rnd)*\pgflinewidth}}
+ \pgfpathcurveto{\pgfpoint{-0.4\pgfarrowlength}{-0.6*(1+0.3*rnd)*\pgflinewidth}}{%
+ \pgfpoint{-0.6\pgfarrowlength}{-0.3*(1+0.3*rnd)*\pgflinewidth}}{%
+ \pgfpoint{-1\pgfarrowlength}{-0.5\pgflinewidth}}
+ \pgfusepathqfill
+ },
+ defaults={length=8pt}
+}
+
+\tikzset{pics/.cd,
+ inkA/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,-0.5) -- (0.25,0.5) -- (0.5,-0.5);
+ \draw[line width={\tkzbrushthick}] (0.125,-0.15) -- (0.375,-0.15);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,-0.55) -- (0.3,0.4) -- (0.6,-0.55);
+ %\draw[line width=5](0.1,1/3-0.45) -- (0.5,1/3-0.45);
+ %\path (0.7,0);
+ }
+ },
+ inkB/.style={code={
+ \draw[line width={\tkzbrushthick},{ink[bend]}-{ink[bend]}] (0,-0.5) -- (0,0.5) to[out=0,in=0,looseness=2.5] (0,0) to[out=0,in=0,looseness=3] cycle;
+ %\draw[line width=5] (0,-0.45) -- (0,0.45) to[out=0,in=0,looseness=2.5] (0,0) to[out=0,in=0,looseness=3] cycle;
+ }
+ },
+ inkC/.style={code={
+ \draw[line width={\tkzbrushthick}] (0,0) to[out=90,in=180] (0.25,0.5) to[out=0,in=110] (0.5,0.325) ;
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0) to[out=-90,in=180] (0.25,-0.5) to[out=0,in=-110] (0.5,-0.325) ;
+ %\draw[line width=5,-{ink[bend]}] (0,0) to[out=90,in=110,looseness=2] (0.5,0.25);
+ %\draw[line width=5,-{ink[bend]}] (0,0) to[out=-90,in=-110,looseness=2] (0.5,-0.25);
+ %\path (0.7,0);
+ }
+ },
+ inkD/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,-0.5) -- (0,0.5) to[out=0,in=0,looseness=1.75] (0.075,-0.5) ;
+ %\draw[line width=5] (0,-0.45) -- (0,0.45) to[out=0,in=0,looseness=2.25] cycle;
+ %\path (0.7,0);
+ }
+ },
+ inkE/.style={code={%
+ \draw[line width={\tkzbrushthick},{ink[bend]}-] (0.5,0.5) -- (0,0.5) -- (0,-0.5) ;
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0) -- (0.425,0) ;
+ \draw[line width={\tkzbrushthick}] (0,-0.5) -- (0.4,-0.5);
+ %\draw[line width={\tkzbrushthick},{ink[bend]}-{ink[bend]}] (0.5,-0.45) --(0,-0.45) -- (0,0.45) -- (0.5,0.45);
+ %\draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0) -- (0.5,0);
+ %\path (0.7,0);
+ }
+ },
+ inkF/.style={code={%
+ \draw[line width={\tkzbrushthick},{ink[bend]}-] (0.5,0.5) -- (0,0.5) -- (0,-0.5) ;
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0) -- (0.425,0) ;
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,-0.45) -- (0,0.45) -- (0.5,0.45);
+ %\draw[line width=5,-{ink[bend]}] (0,0) -- (0.5,0);
+ %\path (0.7,0);
+ }
+ },
+ inkG/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0) to[out=90,in=180] (0.25,0.5) to[out=0,in=100] (0.475,0.325) ;
+ \draw[line width={\tkzbrushthick}] (0,0) to[out=-90,in=180] (0.25,-0.5) to[out=0,in=-110] (0.475,-0.1) ;
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0.475,-0.1) to (0.275,-0.1);
+ %\draw[line width=5,-{ink[bend]}] (0,0) to[out=90,in=110,looseness=2] (0.5,0.25);
+ %\draw[line width=5] (0,0) to[out=-90,in=-110,looseness=2] (0.5,-0.25);
+ %\draw[line width=5,-{ink[bend]}] (0.54,-0.25) to (0.3,-0.25);
+ %\path (0.7,0);
+ }
+ },
+ inkH/.style={code={%
+ \draw[line width={\tkzbrushthick},{ink[bend]}-] (0,-0.5) -- (0,0.5);
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0.5,-0.5) -- ([yshift=1pt]0.5,0.5);
+ \draw[line width={\tkzbrushthick}] (0,0) -- (0.5,0);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,-0.5) -- (0,0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0.5,-0.5) -- (0.5,0.5);
+ %\draw[line width=5] (0,0) -- (0.5,0);
+ \path (0.7,0);
+ }
+ },
+ inkI/.style={code={
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] ([yshift=-0.5pt]0,-0.5) -- ([yshift=1pt]0,0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,-0.45) -- (0,0.45);
+ \path (0.075,0);
+ }
+ },
+ inkJ/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0.35,0.5) -- (0.35,-0.35) to[out=-90,in=0] (0.175,-0.5) to[out=180,in=-90] (0,-0.3);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0.2,0.45) -- (0.2,-0.35) to[out=-90,in=0] (0.1,-0.45) to[out=180,in=-90] (0,-0.35);
+ %\path (0.45,0);
+ }
+ },
+ inkK/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,-0.5) -- ([yshift=1pt]0,0.5);
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0.4,0.5) -- (0.02,0) -- (0.4,-0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,-0.45) -- (0,0.45);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0.4,0.45) -- (0.02,0) -- (0.4,-0.45);
+ %\path (0.6,0);
+ }
+ },
+ inkL/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0.5) -- (0,-0.5) -- (0.5,-0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,0.5) -- (0,-0.45) -- (0.4,-0.45);
+ %\path (0.6,0);
+ }
+ },
+ inkM/.style={code={%
+ \draw[line width={\tkzbrushthick}] (0,-0.5)--(0,0.45) ;
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0.475) -- (0.25,0.25) -- (0.5,0.45) -- (0.5,-0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,-0.45) -- (0,0.45) -- (0.3,0.25) -- (0.6,0.45) -- (0.6,-0.45);
+ %\path (0.8,0);%
+ }
+ },
+ inkN/.style={code={%
+ \draw[line width={\tkzbrushthick}] (0,-0.5)--(0,0.45) ;
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0.475) -- (0.5,-0.51) -- (0.5,0.515);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,-0.45) -- (0,0.45) -- (0.6,-0.4) -- (0.6,0.45);
+ %\path (0.8,0);
+ }
+ },
+ inkO/.style={code={%
+ \draw[line width={\tkzbrushthick}] (0.25,0) circle(0.25 and 0.5);
+ %\path (0.8,0);
+ }
+ },
+ inkP/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,-0.5) -- (0,0.5) to[out=0,in=0,looseness=2.5] (0,0);
+ %\draw[line width=5,{ink[bend]}-] (0,-0.45) -- (0,0.45) to[out=0,in=0,looseness=2.5] (0,0);
+ %\path (0.6,0);
+ }
+ },
+ inkQ/.style={code={%
+ \draw[line width={\tkzbrushthick}] (0.25,0) circle(0.25 and 0.5);
+ \draw[line width={\tkzbrushthick},{ink[bend]}-{ink[bend]}](0.35,-0.25) -- (0.5,-0.5);
+ %\draw[line width=5] (0.3,0) circle(0.3 and 0.48);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}](0.35,-0.25) -- (0.6,-0.45);
+ %\path (0.8,0);
+ }
+ },
+ inkR/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,-0.5) -- (0,0.5) to[out=0,in=0,looseness=2.5] (0.05,0) -- (0.5,-0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,-0.45) -- (0,0.45) to[out=0,in=0,looseness=2.5] (0.05,0) -- (0.4,-0.45);
+ %\path (0.6,0);
+ }
+ },
+ inkS/.style={code={%
+ \draw[line width={\tkzbrushthick},{ink[bend]}-] (0.475,0.475) to[out=150,in=165,looseness=2.25] (0.25,0) to[out=-15,in=-30,looseness=2.25] (0.025,-0.475);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0.5,0.4) to[out=160,in=165,looseness=2] (0.3,0) to[out=-15,in=-20,looseness=2] (0.1,-0.4);
+ %\path (0.65,0);
+ }
+ },
+ inkT/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0.25,-0.5) -- (0.25,0.5) ;
+ \draw[line width={\tkzbrushthick}] (0,0.5) -- (0.5,0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0.35,-0.45) -- (0.35,0.45) (0,0.45) -- (0.7,0.45);
+ %\path (0.85,0);
+ }
+ },
+ inkU/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0.5) -- (0,0.25) to[out=-90,in=180] (0.25,-0.5) to[out=0,in=-90] (0.5,0.25) -- (0.5,0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,0.5) -- (0,0) to[out=-90,in=-90,looseness=2.5] (0.6,0) -- (0.6,0.5);
+ %\path (0.8,0);
+ }
+ },
+ inkV/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0.5) -- (0.25,-0.5) -- (0.5,0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,0.5) -- (0.3,-0.4) -- (0.6,0.5);
+ %\path (0.8,0);
+ }
+ },
+ inkW/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0.5) -- (0.15,-0.5) -- (0.3,-0.25) -- (0.45,-0.5) -- (0.6,0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,0.45) -- (0.3,-0.4) -- (0.45,-0.1) -- (0.6,-0.4) -- (0.9,0.45);
+ %\path (1.1,0);
+ }
+ },
+ inkX/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0.5) -- (0.5,-0.5);
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0.5,0.5) -- (0,-0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,0.45) -- (0.6,-0.45);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0.6,0.45) -- (0,-0.45);
+ %\path (0.8,0);
+ }
+ },
+ inkY/.style={code={
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0.5) -- (0.25,0);
+ \draw[line width={\tkzbrushthick},{ink[bend]}-{ink[bend]}] (0.5,0.5) -- (0,-0.5);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,0.45) -- (0.3,0);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0.6,0.45) -- (0,-0.45);
+ %\path (0.8,0);
+ }
+ },
+ inkZ/.style={code={%
+ \draw[line width={\tkzbrushthick},-{ink[bend]}] (0,0.5) --(0.5,0.5) -- (0,-0.5) -- (0.5,-0.45);
+ %\draw[line width=5,{ink[bend]}-{ink[bend]}] (0,0.45) --(0.6,0.45) -- (0,-0.45) -- (0.6,-0.45);
+ %\path (0.8,0);
+ }
+ },
+ inkspace/.style={code={\path (0,0) (0.2,0);}},
+}
+
+%------macros
+\NewDocumentCommand\tkzbrush{ O{} D<>{} m }{%
+ \restoreKV[tkzbrush]%
+ \setKV[tkzbrush]{#1}%
+ \StrChar{#3}{1}[\myfisrtchar]%
+ \StrLen{#3}[\mynbofchars]%
+ \begin{tikzpicture}%[bezier bounding box]
+ \pic[bezier bounding box,local bounding box=box1,scale={\tkzbrushscale},#2] at (0,0) {brush\myfisrtchar} ;%
+ %on boucle les lettres une par une ??
+ \foreach \i [count=\Y,evaluate=\Y as \Z using {int(\Y+1)}] in {2,...,\mynbofchars}{%
+ \StrChar{#3}{\i}[\mytmpchar]%
+ \IfStrEq{\mytmpchar}{ }%
+ {%
+ \edef\temp{\noexpand\pic[bezier bounding box,right=2mm of box\Y,local bounding box=box\Z,scale={\tkzbrushscale},#2] {brushspace};}
+ \temp%
+ }%
+ {%
+ \edef\temp{\noexpand\pic[bezier bounding box,right=2mm of box\Y,local bounding box=box\Z,scale={\tkzbrushscale},#2] {brush\mytmpchar};}
+ \temp%
+ }%
+ }%
+ \end{tikzpicture}%
+}
+
+\NewDocumentCommand\tkzink{ O{} D<>{} m }{%
+ \restoreKV[tkzbrush]%
+ \setKV[tkzbrush]{#1}%
+ \StrChar{#3}{1}[\myfisrtchar]%
+ \StrLen{#3}[\mynbofchars]%
+ \begin{tikzpicture}[brushcolor,line join=round,line cap=round]%,bezier bounding box]
+ \pic[bezier bounding box,local bounding box=box1,scale={\tkzbrushscale},#2] at (0,0) {ink\myfisrtchar} ;%
+ \foreach \i [count=\Y,evaluate=\Y as \Z using {int(\Y+1)}] in {2,...,\mynbofchars}{%
+ \StrChar{#3}{\i}[\mytmpchar]%
+ \IfStrEq{\mytmpchar}{ }%
+ {%
+ \edef\temp{\noexpand\pic[bezier bounding box,right=2mm of box\Y,local bounding box=box\Z,scale={\tkzbrushscale},#2] {inkspace};}
+ \temp%
+ }%
+ {%
+ \edef\temp{\noexpand\pic[bezier bounding box,right=2mm of box\Y,local bounding box=box\Z,scale={\tkzbrushscale},#2] {ink\mytmpchar};}
+ \temp%
+ }%
+ }%
+ \end{tikzpicture}%
+}
+
+
+%====PixlArt Words
+\def\lsteightbittikzA{0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,1}%7C*5L
+\def\lsteightbittikzB{1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,0}%7C*5L
+\def\lsteightbittikzC{0,1,1,1,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzD{1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0}
+\def\lsteightbittikzE{1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1}
+\def\lsteightbittikzF{1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0}
+\def\lsteightbittikzG{0,1,1,1,0,1,0,0,0,1,1,0,0,0,0,1,0,1,1,1,1,0,0,0,1,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzH{1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1}
+\def\lsteightbittikzI{1,1,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,1,1}
+\def\lsteightbittikzJ{0,0,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,1,1,0,0}
+\def\lsteightbittikzK{1,0,0,0,1,1,0,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,1}
+\def\lsteightbittikzL{1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1}
+\def\lsteightbittikzM{1,0,0,0,1,1,1,0,1,1,1,0,1,0,1,1,0,1,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1}
+\def\lsteightbittikzN{1,0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,0,1,0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1}
+\def\lsteightbittikzO{0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzP{1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0}
+\def\lsteightbittikzQ{0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,1,1,0,1}
+\def\lsteightbittikzR{1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,1}
+\def\lsteightbittikzS{0,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0}
+\def\lsteightbittikzT{1,1,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0}
+\def\lsteightbittikzU{1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzV{1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0}
+\def\lsteightbittikzW{1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0}
+\def\lsteightbittikzX{1,0,0,0,1,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,1,0,0,0,1}
+\def\lsteightbittikzY{1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0}
+\def\lsteightbittikzZ{1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1,1}
+\def\lsteightbittikza{0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,1,1,1,1,1,0,0,0,1,0,1,1,1,1}
+\def\lsteightbittikzaaccent{0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,1,1,1,1,1,0,0,0,1,0,1,1,1,1}
+\def\lsteightbittikzaaigu{0,1,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,1,1,1,1,1,0,0,0,1,0,1,1,1,1}
+\def\lsteightbittikzb{1,0,0,0,0,1,0,0,0,0,1,0,1,1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,0}
+\def\lsteightbittikzc{0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzd{0,0,0,0,1,0,0,0,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,1,1,1,1}
+\def\lsteightbittikze{0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0}
+\def\lsteightbittikzeaccent{0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0}
+\def\lsteightbittikzeaigu{0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0}
+\def\lsteightbittikzf{0,0,1,1,0,0,1,0,0,1,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0}
+\def\lsteightbittikzg{0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,1,1,1,1,0,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzh{1,0,0,0,0,1,0,0,0,0,1,0,1,1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1}
+\def\lsteightbittikzi{0,1,0,0,0,0,1,1,0,0,1,0,0,1,0,0,1,0,1,1,1}
+\def\lsteightbittikziaccent{1,1,1,0,0,0,1,1,0,0,1,0,0,1,0,0,1,0,1,1,1}
+\def\lsteightbittikziaigu{1,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,1,0,1,1,1}
+\def\lsteightbittikzj{0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0}
+\def\lsteightbittikzk{1,0,0,0,1,0,0,0,1,0,0,1,1,0,1,0,1,1,0,0,1,0,1,0,1,0,0,1}
+\def\lsteightbittikzl{1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,1,1}
+\def\lsteightbittikzm{0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,0,1,1,0,0,0,1}
+\def\lsteightbittikzn{0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1}
+\def\lsteightbittikzo{0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzp{0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0}
+\def\lsteightbittikzq{0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,0,0,1,0,0,0,0,1}
+\def\lsteightbittikzr{0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0}
+\def\lsteightbittikzs{0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,0}
+\def\lsteightbittikzt{0,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,1,0}
+\def\lsteightbittikzu{0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,0,1}
+\def\lsteightbittikzv{0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,1,1,1,0,0,0,1,0,0}
+\def\lsteightbittikzw{0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,0,1,1,1,0}
+\def\lsteightbittikzx{0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1}
+\def\lsteightbittikzy{0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,1,1,1,1,0,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzz{0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,1}
+\def\lsteightbittikzzero{0,1,1,1,0,1,0,0,0,1,1,0,0,1,1,1,0,1,0,1,1,1,0,0,1,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzun{0,1,0,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,1,1}
+\def\lsteightbittikzdeux{0,1,1,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,1}
+\def\lsteightbittikztrois{1,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzquatre{0,0,0,1,0,0,0,1,1,0,0,1,0,1,0,1,0,0,1,0,1,1,1,1,1,0,0,0,1,0,0,0,0,1,0}
+\def\lsteightbittikzcinq{1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzsix{0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzsept{1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0}
+\def\lsteightbittikzhuit{0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,0,1,1,1,0}
+\def\lsteightbittikzneuf{0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,0,1,1,1,1,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0}
+\def\lsteightbittikzapostr{1,1,0,1,1,0,0,0,0,0,0,0,0}
+\def\lsteightbittikzparg{0,0,1,0,1,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1}
+\def\lsteightbittikzpard{1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,1,0,0}
+\def\lsteightbittikzfois{0,0,0,0,0,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0}
+\def\lsteightbittikzplus{0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0}
+\def\lsteightbittikzvirgule{0,0,0,0,0,0,0,0,1,1,0,1,1,0}
+\def\lsteightbittikzmoins{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+\def\lsteightbittikzpoint{0,0,0,0,0,0,0,0,0,0,1,1,1,1}
+\def\lsteightbittikzslash{0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0}
+\def\lsteightbittikzdeuxpoints{0,0,1,1,1,1,0,0,1,1,1,1,0,0}
+\def\lsteightbittikzpointvirg{0,0,1,1,1,1,0,0,1,1,0,1,1,0}
+\def\lsteightbittikzinf{0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0}
+\def\lsteightbittikzeggal{0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0}
+\def\lsteightbittikzsup{1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0}
+\def\lsteightbittikzinterro{0,1,1,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0}
+\def\lsteightbittikzexcla{1,1,1,1,1,0,1}
+\def\lsteightbittikzcrog{1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,1,1}
+\def\lsteightbittikzgrod{1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,1,1,1}
+\def\lsteightbittikzbarre{1,1,1,1,1,1,1}
+\def\lsteightbittikzspace{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+
+\newlength{\eightbitpartthick}
+\newlength{\eightbitpartheight}
+\newlength{\eightbitpartunit}
+\setlength{\eightbitpartthick}{0.1mm}
+\setlength{\eightbitpartheight}{11mm}
+\setlength{\eightbitpartunit}{1mm}
+
+\defKV[eightbitpart]{%
+ %unit=\def\eightbitpartunit{#1},%
+ height=\setlength{\eightbitpartheight}{#1},%
+ thick=\setlength{\eightbitpartthick}{#1},%
+ color=\def\eightbitpartcolor{#1},%
+ gridcolor=\def\eightbitpartgridcolor{#1},%
+ offseth=\def\eightbitpartoffseth{#1},%
+ offsetv=\def\eightbitpartoffsetv{#1}%
+}
+
+\setKVdefault[eightbitpart]{%
+ height=11mm,%
+ thick=0.1mm,%
+ color=black,%
+ gridcolor=gray,
+ offseth=1,%
+ offsetv=2,%
+ gridafter=false,%
+ nospaceafter=false,%
+ border=false
+}
+
+\NewDocumentCommand\tkzpixletter{ }{%
+ \begingroup
+ \catcode`\;=12
+ \catcode`\:=12
+ \catcode`\!=12
+ \catcode`\?=12
+ \PixlLetterAux
+}
+
+\NewDocumentCommand\PixlLetterAux{ O{} D<>{} m }{%
+ \endgroup
+ \restoreKV[eightbitpart]%
+ \setKV[eightbitpart]{#1}%
+ \xdef\tmplarg{5}%
+ %MAJUSCULE
+ \IfStrEq{#3}{A}{\xdef\TMPLIST{\lsteightbittikzA}}{}%
+ \IfStrEq{#3}{B}{\xdef\TMPLIST{\lsteightbittikzB}}{}%
+ \IfStrEq{#3}{C}{\xdef\TMPLIST{\lsteightbittikzC}}{}%
+ \IfStrEq{#3}{D}{\xdef\TMPLIST{\lsteightbittikzD}}{}%
+ \IfStrEq{#3}{E}{\xdef\TMPLIST{\lsteightbittikzE}}{}%
+ \IfStrEq{#3}{F}{\xdef\TMPLIST{\lsteightbittikzF}}{}%
+ \IfStrEq{#3}{G}{\xdef\TMPLIST{\lsteightbittikzG}}{}%
+ \IfStrEq{#3}{H}{\xdef\TMPLIST{\lsteightbittikzH}}{}%
+ \IfStrEq{#3}{I}{\xdef\TMPLIST{\lsteightbittikzI}\xdef\tmplarg{3}}{}%
+ \IfStrEq{#3}{J}{\xdef\TMPLIST{\lsteightbittikzJ}}{}%
+ \IfStrEq{#3}{K}{\xdef\TMPLIST{\lsteightbittikzK}}{}%
+ \IfStrEq{#3}{L}{\xdef\TMPLIST{\lsteightbittikzL}}{}%
+ \IfStrEq{#3}{M}{\xdef\TMPLIST{\lsteightbittikzM}}{}%
+ \IfStrEq{#3}{N}{\xdef\TMPLIST{\lsteightbittikzN}}{}%
+ \IfStrEq{#3}{O}{\xdef\TMPLIST{\lsteightbittikzO}}{}%
+ \IfStrEq{#3}{P}{\xdef\TMPLIST{\lsteightbittikzP}}{}%
+ \IfStrEq{#3}{Q}{\xdef\TMPLIST{\lsteightbittikzQ}}{}%
+ \IfStrEq{#3}{R}{\xdef\TMPLIST{\lsteightbittikzR}}{}%
+ \IfStrEq{#3}{S}{\xdef\TMPLIST{\lsteightbittikzS}}{}%
+ \IfStrEq{#3}{T}{\xdef\TMPLIST{\lsteightbittikzT}}{}%
+ \IfStrEq{#3}{U}{\xdef\TMPLIST{\lsteightbittikzU}}{}%
+ \IfStrEq{#3}{V}{\xdef\TMPLIST{\lsteightbittikzV}}{}%
+ \IfStrEq{#3}{W}{\xdef\TMPLIST{\lsteightbittikzW}}{}%
+ \IfStrEq{#3}{X}{\xdef\TMPLIST{\lsteightbittikzX}}{}%
+ \IfStrEq{#3}{Y}{\xdef\TMPLIST{\lsteightbittikzY}}{}%
+ \IfStrEq{#3}{Z}{\xdef\TMPLIST{\lsteightbittikzZ}}{}%
+ %minuscule
+ \IfStrEq{#3}{a}{\xdef\TMPLIST{\lsteightbittikza}}{}%
+ \IfStrEq{#3}{à}{\xdef\TMPLIST{\lsteightbittikzaaccent}}{}%
+ \IfStrEq{#3}{ä}{\xdef\TMPLIST{\lsteightbittikzaaigu}}{}%
+ \IfStrEq{#3}{b}{\xdef\TMPLIST{\lsteightbittikzb}}{}%
+ \IfStrEq{#3}{c}{\xdef\TMPLIST{\lsteightbittikzc}}{}%
+ \IfStrEq{#3}{d}{\xdef\TMPLIST{\lsteightbittikzd}}{}%
+ \IfStrEq{#3}{e}{\xdef\TMPLIST{\lsteightbittikze}}{}%
+ \IfStrEq{#3}{é}{\xdef\TMPLIST{\lsteightbittikzeaccent}}{}%
+ \IfStrEq{#3}{è}{\xdef\TMPLIST{\lsteightbittikzeaccent}}{}%
+ \IfStrEq{#3}{ê}{\xdef\TMPLIST{\lsteightbittikzeaccent}}{}%
+ \IfStrEq{#3}{ë}{\xdef\TMPLIST{\lsteightbittikzeaigu}}{}%
+ \IfStrEq{#3}{f}{\xdef\TMPLIST{\lsteightbittikzf}}{}%
+ \IfStrEq{#3}{g}{\xdef\TMPLIST{\lsteightbittikzg}}{}%
+ \IfStrEq{#3}{h}{\xdef\TMPLIST{\lsteightbittikzh}}{}%
+ \IfStrEq{#3}{i}{\xdef\TMPLIST{\lsteightbittikzi}\xdef\tmplarg{3}}{}%
+ \IfStrEq{#3}{î}{\xdef\TMPLIST{\lsteightbittikziaccent}\xdef\tmplarg{3}}{}%
+ \IfStrEq{#3}{ï}{\xdef\TMPLIST{\lsteightbittikziaigu}\xdef\tmplarg{3}}{}%
+ \IfStrEq{#3}{j}{\xdef\TMPLIST{\lsteightbittikzj}\xdef\tmplarg{4}}{}%
+ \IfStrEq{#3}{k}{\xdef\TMPLIST{\lsteightbittikzk}\xdef\tmplarg{4}}{}%
+ \IfStrEq{#3}{l}{\xdef\TMPLIST{\lsteightbittikzl}\xdef\tmplarg{3}}{}%
+ \IfStrEq{#3}{m}{\xdef\TMPLIST{\lsteightbittikzm}}{}%
+ \IfStrEq{#3}{n}{\xdef\TMPLIST{\lsteightbittikzn}}{}%
+ \IfStrEq{#3}{o}{\xdef\TMPLIST{\lsteightbittikzo}}{}%
+ \IfStrEq{#3}{p}{\xdef\TMPLIST{\lsteightbittikzp}}{}%
+ \IfStrEq{#3}{q}{\xdef\TMPLIST{\lsteightbittikzq}}{}%
+ \IfStrEq{#3}{r}{\xdef\TMPLIST{\lsteightbittikzr}}{}%
+ \IfStrEq{#3}{s}{\xdef\TMPLIST{\lsteightbittikzs}}{}%
+ \IfStrEq{#3}{t}{\xdef\TMPLIST{\lsteightbittikzt}}{}%
+ \IfStrEq{#3}{u}{\xdef\TMPLIST{\lsteightbittikzu}}{}%
+ \IfStrEq{#3}{v}{\xdef\TMPLIST{\lsteightbittikzv}}{}%
+ \IfStrEq{#3}{w}{\xdef\TMPLIST{\lsteightbittikzw}}{}%
+ \IfStrEq{#3}{x}{\xdef\TMPLIST{\lsteightbittikzx}}{}%
+ \IfStrEq{#3}{y}{\xdef\TMPLIST{\lsteightbittikzy}}{}%
+ \IfStrEq{#3}{z}{\xdef\TMPLIST{\lsteightbittikzz}}{}%
+ %chiffres
+ \IfStrEq{#3}{0}{\xdef\TMPLIST{\lsteightbittikzzero}}{}%
+ \IfStrEq{#3}{1}{\xdef\TMPLIST{\lsteightbittikzun}\xdef\tmplarg{3}}{}%
+ \IfStrEq{#3}{2}{\xdef\TMPLIST{\lsteightbittikzdeux}}{}%
+ \IfStrEq{#3}{3}{\xdef\TMPLIST{\lsteightbittikztrois}}{}%
+ \IfStrEq{#3}{4}{\xdef\TMPLIST{\lsteightbittikzquatre}}{}%
+ \IfStrEq{#3}{5}{\xdef\TMPLIST{\lsteightbittikzcinq}}{}%
+ \IfStrEq{#3}{6}{\xdef\TMPLIST{\lsteightbittikzsix}}{}%
+ \IfStrEq{#3}{7}{\xdef\TMPLIST{\lsteightbittikzsept}}{}%
+ \IfStrEq{#3}{8}{\xdef\TMPLIST{\lsteightbittikzhuit}}{}%
+ \IfStrEq{#3}{9}{\xdef\TMPLIST{\lsteightbittikzneuf}}{}%
+ %ponctuation
+ \IfStrEq{#3}{'}{\xdef\TMPLIST{\lsteightbittikzapostr}\xdef\tmplarg{2}}{}%
+ \IfStrEq{#3}{(}{\xdef\TMPLIST{\lsteightbittikzparg}\xdef\tmplarg{3}}{}%
+ \IfStrEq{#3}{)}{\xdef\TMPLIST{\lsteightbittikzpard}\xdef\tmplarg{3}}{}%
+ \IfStrEq{#3}{*}{\xdef\TMPLIST{\lsteightbittikzfois}}{}%
+ \IfStrEq{#3}{+}{\xdef\TMPLIST{\lsteightbittikzplus}}{}%
+ \IfStrEq{#3}{,}{\xdef\TMPLIST{\lsteightbittikzvirgule}\xdef\tmplarg{2}}{}%
+ \IfStrEq{#3}{-}{\xdef\TMPLIST{\lsteightbittikzmoins}}{}%
+ \IfStrEq{#3}{.}{\xdef\TMPLIST{\lsteightbittikzpoint}\xdef\tmplarg{2}}{}%
+ \IfStrEq{#3}{/}{\xdef\TMPLIST{\lsteightbittikzslash}}{}%
+ \IfStrEq{#3}{:}{\xdef\TMPLIST{\lsteightbittikzdeuxpoints}\xdef\tmplarg{2}}{}%
+ \IfStrEq{#3}{;}{\xdef\TMPLIST{\lsteightbittikzpointvirg}\xdef\tmplarg{2}}{}%
+ \IfStrEq{#3}{<}{\xdef\TMPLIST{\lsteightbittikzinf}}{}%
+ \IfStrEq{#3}{=}{\xdef\TMPLIST{\lsteightbittikzeggal}}{}%
+ \IfStrEq{#3}{>}{\xdef\TMPLIST{\lsteightbittikzsup}}{}%
+ \IfStrEq{#3}{?}{\xdef\TMPLIST{\lsteightbittikzinterro}}{}%
+ \IfStrEq{#3}{!}{\xdef\TMPLIST{\lsteightbittikzexcla}\xdef\tmplarg{1}}{}%
+ \IfStrEq{#3}{[}{\xdef\TMPLIST{\lsteightbittikzcrog}\xdef\tmplarg{3}}{}%
+ \IfStrEq{#3}{]}{\xdef\TMPLIST{\lsteightbittikzgrod}\xdef\tmplarg{3}}{}%
+ \IfStrEq{#3}{|}{\xdef\TMPLIST{\lsteightbittikzbarre}\xdef\tmplarg{1}}{}%
+ \IfStrEq{#3}{ }{\xdef\TMPLIST{\lsteightbittikzspace}\xdef\tmplarg{3}}{}%
+ %la case !
+ \xdef\tmpnumbercasesv{\inteval{7+2*\eightbitpartoffsetv}}%
+ \pgfmathsetlength{\eightbitpartunit}{\eightbitpartheight/\tmpnumbercasesv}%
+ %tikzpicture
+ \begin{tikzpicture}[line cap=rect,x=\eightbitpartunit,y=\eightbitpartunit,line width=\eightbitpartthick,#2]
+ %clipping ?
+ %\clip ([shift={(-0.5\eightbitpartthick,-0.5\eightbitpartthick)}]{-\eightbitpartoffseth},{-\eightbitpartoffsetv}) rectangle ([shift={(0.5\eightbitpartthick,0.5\eightbitpartthick)}]{\tmplarg+\eightbitpartoffseth},{7+\eightbitpartoffsetv}) ;
+ %gridbefore
+ \ifboolKV[eightbitpart]{gridafter}%
+ {}%
+ {%
+ \foreach \x in {-\eightbitpartoffseth,...,\numexpr\tmplarg+\eightbitpartoffseth\relax}
+ {%
+ \draw[line width=\eightbitpartthick,\eightbitpartgridcolor] (\x,{-\eightbitpartoffsetv}) --++ (0,{7+2*\eightbitpartoffsetv}) ;
+ }%
+ \foreach \y in {-\eightbitpartoffsetv,...,\numexpr7+\eightbitpartoffseth+\eightbitpartoffseth\relax}
+ {%
+ \draw[line width=\eightbitpartthick,\eightbitpartgridcolor] ({-\eightbitpartoffseth},\y) --++ ({\tmplarg+2*\eightbitpartoffseth},0) ;
+ }%
+ }%
+ \ifnum\tmplarg=1%
+ \foreach \i [count=\j] in \TMPLIST {%
+ \ifnum\i=1%
+ \fill[\eightbitpartcolor] (0,{7-\j}) rectangle++ (1,1) ;
+ \fi%
+ }%
+ \fi%
+ \ifnum\tmplarg=2%
+ \foreach \i [count=\j] in \TMPLIST {%
+ \ifnum\i=1%
+ \xintifboolexpr{ \xintiiOdd{\j} == 1 }%
+ {%si c'est impair
+ \xdef\tmpX{0}%
+ \xdef\tmpY{\xintieval{(\j-1)/2}}%
+ }%
+ {%si c'est pair
+ \xdef\tmpX{1}%
+ \xdef\tmpY{\xintieval{(\j)/2-1}}%
+ }%
+ \fill[\eightbitpartcolor] ({\tmpX},{6-\tmpY}) rectangle++ (1,1) ;
+ \fi%
+ }%
+ \fi%
+ \ifnum\tmplarg>2%
+ \foreach \i [count=\j] in \TMPLIST {%
+ \ifnum\i=1%
+ \xdef\tmpX{\xintiiRem{\j-1}{\tmplarg}}%
+ \xdef\tmpY{\xintiiQuo{\j-1}{\tmplarg}}%
+ \fill[\eightbitpartcolor] ({\tmpX},{6-\tmpY}) rectangle++ (1,1) ;
+ \fi%
+ }%
+ \fi%
+ %gridafter
+ \ifboolKV[eightbitpart]{gridafter}%
+ {%
+ \foreach \x in {-\eightbitpartoffseth,...,\numexpr\tmplarg+\eightbitpartoffseth\relax}
+ {%
+ \draw[line width=\eightbitpartthick,\eightbitpartgridcolor] (\x,{-\eightbitpartoffsetv}) --++ (0,{7+2*\eightbitpartoffsetv}) ;
+ }%
+ \foreach \y in {-\eightbitpartoffsetv,...,\numexpr7+\eightbitpartoffseth+\eightbitpartoffseth\relax}
+ {%
+ \draw[line width=\eightbitpartthick,\eightbitpartgridcolor] ({-\eightbitpartoffseth},\y) --++ ({\tmplarg+2*\eightbitpartoffseth},0) ;
+ }%
+ }%
+ {}%
+ \end{tikzpicture}%
+ \ifboolKV[eightbitpart]{nospaceafter}{\hspace*{-\eightbitpartthick}}{}%
+}
+
+\NewDocumentCommand\tkzpixlquote{ O{} D<>{} }{%
+ \restoreKV[eightbitpart]%
+ \setKV[eightbitpart]{#1}%
+ \xdef\tmplarg{2}%
+ \xdef\tmpnumbercasesv{\inteval{7+2*\eightbitpartoffsetv}}%
+ \pgfmathsetlength{\eightbitpartunit}{\eightbitpartheight/\tmpnumbercasesv}%
+ \begin{tikzpicture}[line cap=rect,x=\eightbitpartunit,y=\eightbitpartunit,line width=\eightbitpartthick,#2]
+ %clipping ?
+ %\clip ({-\eightbitpartoffseth},{-\eightbitpartoffsetv}) rectangle ({\tmplarg+\eightbitpartoffseth},{7+\eightbitpartoffsetv}) ;
+ %gridbefore
+ \ifboolKV[eightbitpart]{gridafter}%
+ {}%
+ {%
+ \foreach \x in {-\eightbitpartoffseth,...,\numexpr\tmplarg+\eightbitpartoffseth\relax}
+ {%
+ \draw[line width=\eightbitpartthick,\eightbitpartgridcolor] (\x,{-\eightbitpartoffsetv}) --++ (0,{7+2*\eightbitpartoffsetv}) ;
+ }%
+ \foreach \y in {-\eightbitpartoffsetv,...,\numexpr7+\eightbitpartoffseth+\eightbitpartoffseth\relax}
+ {%
+ \draw[line width=\eightbitpartthick,\eightbitpartgridcolor] ({-\eightbitpartoffseth},\y) --++ ({\tmplarg+2*\eightbitpartoffseth},0) ;
+ }%
+ }%
+ \fill[\eightbitpartcolor] ({0},{6}) rectangle++ (1,1) ;
+ \fill[\eightbitpartcolor] ({1},{6}) rectangle++ (1,1) ;
+ \fill[\eightbitpartcolor] ({1},{5}) rectangle++ (1,1) ;
+ \fill[\eightbitpartcolor] ({0},{4}) rectangle++ (1,1) ;
+ %gridafter
+ \ifboolKV[eightbitpart]{gridafter}%
+ {%
+ \foreach \x in {-\eightbitpartoffseth,...,\numexpr\tmplarg+\eightbitpartoffseth\relax}
+ {%
+ \draw[line width=\eightbitpartthick,\eightbitpartgridcolor] (\x,{-\eightbitpartoffsetv}) --++ (0,{7+2*\eightbitpartoffsetv}) ;
+ }%
+ \foreach \y in {-\eightbitpartoffsetv,...,\numexpr7+\eightbitpartoffseth+\eightbitpartoffseth\relax}
+ {%
+ \draw[line width=\eightbitpartthick,\eightbitpartgridcolor] ({-\eightbitpartoffseth},\y) --++ ({\tmplarg+2*\eightbitpartoffseth},0) ;
+ }%
+ }%
+ {}%
+ \end{tikzpicture}%
+ \ifboolKV[eightbitpart]{nospaceafter}{\hspace*{-2\eightbitpartthick}}{}%
+}
+
+\NewDocumentCommand\tkzpixl{ }{%
+ \begingroup
+ \catcode`\;=12
+ \catcode`\:=12
+ \catcode`\!=12
+ \catcode`\?=12
+ \PixlLettersAux
+}
+
+\NewDocumentCommand\PixlLettersAux{ O{} D<>{} m }{%
+ \endgroup
+ \setKV[eightbitpart]{#1}%
+ \StrLen{#3}[\tmpnbcaract]%
+ \ifboolKV[eightbitpart]{border}%
+ {%
+ \setlength{\fboxrule}{1.75\eightbitpartthick}%
+ \setlength{\fboxsep}{-\eightbitpartthick}%
+ \fbox{%
+ \foreach \i in {1,...,\tmpnbcaract}{%
+ \StrChar{#3}{\i}[\tmpcaract]%
+ \tkzpixletter[#1]<#2>{\tmpcaract}%
+ \ifnum\i<\tmpnbcaract\hspace*{-\eightbitpartthick}\fi%
+ }%
+ }%
+ \ifboolKV[eightbitpart]{nospaceafter}{\hspace*{-\eightbitpartthick}}{}%
+ \fboxrule=0.4pt%
+ \fboxsep=3.0pt%
+ }%
+ {%
+ \foreach \i in {1,...,\tmpnbcaract}{%
+ \StrChar{#3}{\i}[\tmpcaract]%
+ \tkzpixletter[#1]<#2>{\tmpcaract}%
+ \ifnum\i<\tmpnbcaract\hspace*{-\eightbitpartthick}\fi%
+ \ifboolKV[eightbitpart]{nospaceafter}{\hspace*{-\eightbitpartthick}}{}%
+ }%
+ }%
+}
+
+%====BICOLORTXT
+\defKV[bicolortxt]{colors=\def\bicolortxtcols{#1},style=\def\bicolortxtsttyle{#1},intdelta=\def\bicolortxtdelta{#1},paralcolors=\def\bicolortxtcolstrapez{#1}}
+\setKVdefault[bicolortxt]{colors={red/blue},style=midh,intdelta=0.66,paralcolors={red/blue/orange/gray}}
+
+\NewDocumentCommand\tkzbicolor{ O{} m }{%
+ \restoreKV[bicolortxt]%
+ \setKV[bicolortxt]{#1}%
+ \IfStrEq{\bicolortxtsttyle}{paral}%
+ {%
+ \setsepchar[.]{/}%
+ \readlist*\bicolortrapez{\bicolortxtcolstrapez}%
+ }%
+ {%
+ \StrCut{\bicolortxtcols}{/}{\bicolorabove}{\bicolorbelow}%
+ }%
+ \tikz[baseline=(l.base),inner sep=0pt,outer sep=0pt]{%
+ \node[inner sep=0pt,outer sep=0pt](l){\phantom{#2}};
+ \coordinate (lnw) at ([shift={(-0.5\pgflinewidth,0.5\pgflinewidth)}]l.north west) ;
+ \coordinate (ln) at ([shift={(0,0.5\pgflinewidth)}]l.north) ;
+ \coordinate (lne) at ([shift={(0.5\pgflinewidth,0.5\pgflinewidth)}]l.north east) ;
+ \coordinate (le) at ([shift={(0.5\pgflinewidth,0)}]l.east) ;
+ \coordinate (lse) at ([shift={(0.5\pgflinewidth,-0.5\pgflinewidth)}]l.south east) ;
+ \coordinate (ls) at ([shift={(0,-0.5\pgflinewidth)}]l.south) ;
+ \coordinate (lsw) at ([shift={(-0.5\pgflinewidth,-0.5\pgflinewidth)}]l.south west) ;
+ \coordinate (lw) at ([shift={(-0.5\pgflinewidth,0)}]l.west) ;
+ \IfStrEqCase{\bicolortxtsttyle}{%
+ {ellips}%
+ {%
+ \coordinate (lcircn) at ($(l.center)!\bicolortxtdelta!(l.north)$) ;
+ \coordinate (lcirce) at ($(l.center)!\bicolortxtdelta!(l.east)$) ;
+ }%
+ {rect}%
+ {%
+ \coordinate (lrectnw) at ($(l.center)!\bicolortxtdelta!(l.north west)$) ;
+ \coordinate (lrectse) at ($(l.center)!\bicolortxtdelta!(l.south east)$) ;
+ }%
+ {paral}%
+ {%
+ \coordinate (ltrapna) at ($(l.north west)!0.333!(l.north east)$) ;
+ \coordinate (ltrapnb) at ($(l.north west)!0.666!(l.north east)$) ;
+ \coordinate (ltrapsa) at ($(l.south west)!0.333!(l.south east)$) ;
+ \coordinate (ltrapsb) at ($(l.south west)!0.666!(l.south east)$) ;
+ }%
+ }%
+ \begin{scope}
+ \IfStrEqCase{\bicolortxtsttyle}{%
+ {midh}{\clip(ls)rectangle(lnw);\node[\bicolorabove]at(l){#2};}%
+ {midv}{\clip(lnw)rectangle(le);\node[\bicolorabove]at(l){#2};}%
+ {ndiag}{\clip(lnw)--(lne)--(lse)--cycle;\node[\bicolorabove]at(l){#2};}%
+ {sdiag}{\clip(lsw)--(lnw)--(lne)--cycle;\node[\bicolorabove]at(l){#2};}%
+ {ellips}{\clip(lsw)rectangle(lne);\node[\bicolorabove]at(l){#2};}%
+ {rect}{\clip(lsw)rectangle(lne);\node[\bicolorabove]at(l){#2};}%
+ {paral}{\clip(lsw)--(lnw)--(ltrapna)--cycle;\node[{\bicolortrapez[1]}]at(l){#2};}%
+ }%
+ \end{scope}
+ \begin{scope}
+ \IfStrEqCase{\bicolortxtsttyle}{%
+ {midh}{\clip(ls)rectangle(lne);\node[\bicolorbelow]at(l){#2};}%
+ {midv}{\clip(lsw)rectangle(le);\node[\bicolorbelow]at(l){#2};}%
+ {ndiag}{\clip(lsw)--(lnw)--(lse)--cycle;\node[\bicolorbelow]at(l){#2};}%
+ {sdiag}{\clip(lsw)--(lne)--(lse)--cycle;\node[\bicolorbelow]at(l){#2};}%
+ {ellips}{\clip(lsw)rectangle(lne);\pgfpathellipse{\pgfpointanchor{l}{center}}{\pgfpointanchor{lcirce}{center}}{\pgfpointanchor{lcircn}{center}}\pgfusepath{clip}\node[\bicolorbelow]at(l){#2};}%
+ {rect}{\clip(lrectnw)rectangle(lrectse);\node[\bicolorbelow]at(l){#2};}%
+ {paral}{\clip(lsw)--(ltrapna)--(ltrapnb)--(ltrapsa)--cycle;\node[{\bicolortrapez[2]}]at(l){#2};}%
+ }%
+ \end{scope}
+ \IfStrEq{\bicolortxtsttyle}{paral}%
+ {%
+ \begin{scope}%3
+ \clip(ltrapsa)--(ltrapnb)--(lne)--(ltrapsb)--cycle;\node[{\bicolortrapez[3]}]at(l){#2};
+ \end{scope}
+ \begin{scope}%
+ \clip(ltrapsb)--(lne)--(lse)--cycle;\node[{\bicolortrapez[4]}]at(l){#2};
+ \end{scope}
+ }%
+ {}%
+ }%
+}
+
+%===CALLOUT
+\newlength\comicbubblelgt
+\defKV[comicbubble]{width=\setlength\comicbubblelgt{#1},coltxt=\def\comicbubblecolfont{#1},colbg=\def\comicbubblecolgb{#1},colframe=\def\comicbubblecolframe{#1},pospointer=\def\comicbubblepospointer{#1},font=\def\comicbubblefont{#1}}
+\setKVdefault[comicbubble]{width=4cm,coltxt=black,colbg={},colframe=black,pospointer=(-150:0.75),font={},rcorners=false}
+
+\tikzset{comicbubble/.style args={#1#2}{inner sep=1mm,line join=round,rectangle callout,draw,very thick,text width=#1,align=flush center,callout relative pointer=#2}}
+
+\NewDocumentCommand\tkzcomicbubble{ s O{} D<>{} m }{%
+ \restoreKV[comicbubble]%
+ \setKV[comicbubble]{#2}%
+ \ifboolKV[comicbubble]{rcorners}%
+ {%
+ \tikzset{comicbubble/.append style={rounded corners}}%
+ }%
+ {}%
+ \IfEq{\comicbubblecolgb}{}%
+ {%
+ \tikzset{comicbubblebg/.style={}}%
+ }%
+ {%
+ \tikzset{comicbubblebg/.style={fill=\comicbubblecolgb}}%
+ }%
+ \IfBooleanTF{#1}%independant macro
+ {%
+ \node[comicbubble={\comicbubblelgt}{\comicbubblepospointer},comicbubblebg,text=\comicbubblecolfont,font=\comicbubblefont,#3]{#4}%
+ }%
+ {%
+ {\tikz\node[comicbubble={\comicbubblelgt}{\comicbubblepospointer},comicbubblebg,text=\comicbubblecolfont,font=\comicbubblefont,#3]{#4};}%
+ }%
+}
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz-triminos/README.md b/graphics/pgf/contrib/tikz-triminos/README.md
new file mode 100644
index 0000000000..7a28aaaf39
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-triminos/README.md
@@ -0,0 +1,6 @@
+This package provides a macro to obtain triminos, made with TikZ.
+-----------------------------------------------------------------
+Author.........: Cédric Pierquet
+email..........: cpierquet@outlook.fr
+Licences.......: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
+Inspiration....: https://schule.paul-matthies.de/Trimino.php (CC BY-NC-SA 4.0) \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz-triminos/doc/tikz-triminos-doc.pdf b/graphics/pgf/contrib/tikz-triminos/doc/tikz-triminos-doc.pdf
new file mode 100644
index 0000000000..e67e2d262b
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-triminos/doc/tikz-triminos-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikz-triminos/doc/tikz-triminos-doc.tex b/graphics/pgf/contrib/tikz-triminos/doc/tikz-triminos-doc.tex
new file mode 100644
index 0000000000..5fb0ae2e13
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-triminos/doc/tikz-triminos-doc.tex
@@ -0,0 +1,368 @@
+% !TeX TXS-program:compile = txs:///arara
+% arara: pdflatex: {shell: no, synctex: no, interaction: batchmode}
+% arara: pdflatex: {shell: no, synctex: no, interaction: batchmode}
+
+\documentclass[11pt,a4paper]{ltxdoc}
+\usepackage{amsmath}
+\usepackage{kpfonts}
+\usepackage{inconsolata}
+\usepackage[T1]{fontenc}
+\usepackage[scale=0.875]{cabin}
+\usepackage{tikz-triminos}
+\usepackage{fancyvrb}
+\usepackage{fancyhdr}
+\usepackage{tabularray}
+\fancyhf{}
+\renewcommand{\headrulewidth}{0pt}
+\lfoot{\sffamily\small [tikz-triminos]}
+\cfoot{\sffamily\small - \thepage{} -}
+\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
+\usepackage{hologo}
+\providecommand\tikzlogo{Ti\textit{k}Z}
+\providecommand\TeXLive{\TeX{}Live\xspace}
+\let\TikZ\tikzlogo
+
+\usepackage{hyperref}
+\urlstyle{same}
+\hypersetup{pdfborder=0 0 0}
+\usepackage[margin=2cm]{geometry}
+\setlength{\parindent}{0pt}
+\def\TPversion{0.1.0}
+\def\TPdate{20/01/2025}
+\usepackage{tcolorbox}
+\tcbuselibrary{breakable,skins,hooks,listingsutf8}
+
+\lstset{
+ language=[LaTeX]TeX,%
+ basicstyle=\ttfamily,%
+ keywordstyle={\color{blue}},%
+ classoffset=0,%
+ keywords={},%
+ alsoletter={-},%
+ keywordstyle={\color{blue}},%
+ classoffset=1,%
+ alsoletter={-},%
+ morekeywords={tkz-triminos},%
+ keywordstyle={\color{violet}},%
+ classoffset=2,%
+ alsoletter={-},%
+ morekeywords={\tkztriminos},%
+ keywordstyle={\color{green!50!black}},%
+ classoffset=3,%
+ morekeywords={},%
+ keywordstyle={\color{orange}}
+}
+
+\newtcblisting{DemoCode}[1]{%
+ enhanced,width=\linewidth,%
+ bicolor,size=title,%
+ colback=cyan!10!white,%
+ colbacklower=cyan!5!white,%
+ colframe=cyan!75!black,%
+ listing options={%
+ breaklines=true,%
+ breakatwhitespace=true,%
+ style=tcblatex,basicstyle=\small\ttfamily,%
+ tabsize=4,%
+ commentstyle={\itshape\color{gray}},
+ keywordstyle={\color{blue}},%
+ classoffset=0,%
+ keywords={\usepackage,\includegraphics,xstring,listofitems,\tikzset,\readlist,\showitems,\xintFor,\xintSeq},%
+ alsoletter={-},%
+ keywordstyle={\color{blue}},%
+ classoffset=1,%
+ alsoletter={-},%
+ morekeywords={tikz-triminos},%
+ keywordstyle={\color{violet}},%
+ classoffset=2,%
+ alsoletter={-},%
+ morekeywords={\tkztriminos},%
+ keywordstyle={\color{green!50!black}},%
+ classoffset=3,%
+ morekeywords={size,font,decocolor,decoration,showtxtlogo,showiconlogo,bgcolor,txtlogo,iconlogo,scaledeco,fontdeco},%
+ keywordstyle={\color{orange}}
+ },%
+ #1
+}
+
+\newtcbinputlisting\DemoCodeFile[1]{%
+ enhanced,width=\linewidth,%
+ bicolor,size=title,%
+ colback=lightgray!10!white,%
+ colbacklower=lightgray!5!white,%
+ colframe=lightgray!75!black,%
+ listing options={%
+ breaklines=true,%
+ breakatwhitespace=true,%
+ style=tcblatex,
+ basicstyle=\scriptsize\ttfamily,%
+ tabsize=4,%
+ commentstyle={\itshape\color{gray}},%
+ %lastline=148
+ },%
+ breakable,
+ listing only,%
+ listing file={#1}
+}
+
+\NewDocumentCommand\ShowCode{ m }{%
+ \lstinline{#1}%
+}
+
+\begin{document}
+
+\thispagestyle{empty}
+
+\begin{center}
+ \begin{minipage}{0.88\linewidth}
+ \begin{tcolorbox}[colframe=yellow,colback=yellow!15]
+ \begin{center}
+ \renewcommand{\arraystretch}{1.25}%
+ \begin{tabular}{c}
+ {\Huge \texttt{tikz-triminos}}\\
+ \\
+ {\LARGE Single or several TriMinos,} \\
+ {\LARGE made with Ti\textit{k}Z\ldots} \\
+ \\
+ {\small \texttt{Version \TPversion{} -- \TPdate}}
+ \end{tabular}
+ \end{center}
+ \end{tcolorbox}
+ \end{minipage}
+\end{center}
+
+\begin{center}
+ \begin{tabular}{c}
+ \texttt{Cédric Pierquet}\\
+ {\ttfamily c pierquet -- at -- outlook . fr}\\
+ \texttt{\url{https://forge.apps.education.fr/pierquetcedric/packages-latex}} \\
+ \end{tabular}
+\end{center}
+
+\hrule
+
+\vfill
+
+\begin{tcblisting}{colframe=lightgray,colback=lightgray!5,listing only}
+%single TriMino
+\tkztriminos{One § Two § \faHatWizard}~~\tkztriminos{\faHatWizard § Three § Two}
+\end{tcblisting}
+
+\begin{tcolorbox}[colframe=lightgray,colback=lightgray!5]
+\hfill\tkztriminos<scale=0.85,transform shape>{One § Two § \faHatWizard}~~\tkztriminos<scale=0.85,transform shape>{\faHatWizard § Three § Two}\hfill~
+\end{tcolorbox}
+
+
+\begin{tcblisting}{colframe=lightgray,colback=lightgray!5,listing only}
+%multiple TriMino (9 or 12)
+\tkztriminos[keys]<tikz options>{list of values}
+\end{tcblisting}
+
+\begin{tcolorbox}[colframe=lightgray,colback=lightgray!5]
+\hfill\tkztriminos%
+[size=5cm,showiconlogo,bgcolor=teal!15,font=\large,iconlogo={\scalebox{3}[3]{\textcolor{orange}{\faBahai}}},decocolor=orange]%
+<scale=0.5,rotate=90,transform shape>%
+{%
+ $1+1$ § $2$ §
+ $2+2$ § $4$ §
+ $3+3$ § ${6}$ §
+ {$x_{1}=\frac{-3-\sqrt{41}}{6}$ ; $x_{2}=\frac{-3+\sqrt{41}}{6}$} § $9x^{2}+9x-8$ §
+ $5+5$ § $10$ §
+ ${6}+6$ § $12$ §
+ $7+7$ § $14$ §
+ $8+8$ § $16$ §
+ ${9}+{9}$ § $18$ §
+ $10+10$ § $20$ §
+ $11+11$ § $22$ §
+ $12+12$ § $24$ §
+ $13+13$ § $26$ §
+ $14+14$ § $28$ §
+ $15+15$ § $30$ §
+ $16+16$ § $32$ §
+ $17+17$ § $34$ §
+ $18+18$ § $36$
+}\hfill~
+\end{tcolorbox}
+
+\vfill~
+
+\hrule
+
+\vspace*{2.5mm}
+
+\textit{Inspirations, with \texttt{CC\,BY-NC-SA\,4.0} license, come from \url{https://schule.paul-matthies.de/Trimino.php}}.
+
+\vspace*{2.5mm}
+
+\hrule
+
+\vspace*{2.5mm}
+
+{\tiny\itshape Yes, it's -- again -- a package "clearly too limited which simply aligns, linearly and without any real programmation, the high-level macros of the packages \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|tikz|, \texttt{listofitems}, \texttt{xstring}, \texttt{settobox} and \texttt{simplekv}". But if you don't want to use it, it's easy\ldots don't load it ! If you want to take ownership of the package, with better programming, it's easy too\ldots just ask !}
+
+\vspace*{2.5mm}
+
+\hrule
+
+\pagebreak
+
+\phantomsection
+
+\hypertarget{matoc}{}
+
+\tableofcontents
+
+\vspace*{5mm}
+
+%\hrule
+
+\pagebreak
+
+\section{Loading, useful packages, purposes and acknowledgments}
+
+\subsection{Loading and useful packages}
+
+In order to load \lstinline[language={[latex]TeX},basicstyle=\ttfamily]{tikz-triminos}, simply use:
+
+\begin{DemoCode}{listing only}
+\usepackage{tikz-triminos}
+\end{DemoCode}
+
+%Loaded packages are \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|tikz| (with librairies \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|calc| and \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|decorations text|), \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|ifthen|, \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|simplekv|, \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|listofitems|, \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|fontawesome5| and \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|settobox|.
+
+\subsection{Purposes and acknowledgments}
+
+The purposes of this small package is to provide simple tool to create \textsf{TriMinos} (1 or 9 or 12) with automatic positionning of texts.
+
+\smallskip
+
+\textit{Inspiration come from \url{https://schule.paul-matthies.de/Trimino.php} (CC BY-SA 4.0)}.
+
+\section{Usage}
+
+\subsection{Main macro}
+
+In order to create (single or multiple) \textsf{TriMinos}, simple use:
+
+\begin{DemoCode}{listing only}
+\tkztriminos[keys]<tikz options>{list of values}
+\end{DemoCode}
+
+For \texttt{list of values} argument (seperated with \texttt{§}):
+
+\begin{itemize}
+ \item 3 values can be given (so 1 \textsf{TriMino}) ;
+ \item 19 values can be given (so 9 \textsf{TriMinos}, with 5 \textit{jokers}) ;
+ \item 25 values can be given (so 12 \textsf{TriMinos}, with 10 \textit{jokers}) ;
+ \item 36 values can be given (so 12 full \textsf{TriMinos}).
+\end{itemize}
+
+Moreover:
+
+\begin{itemize}
+ \item if the text is too long for the \textsf{TriMino}, the code adjusts its width ;
+ \item icons of graphicx elements can be used ;
+ \item with \textit{jokers}, the final value is the \textit{joker}.
+\end{itemize}
+
+\begin{DemoCode}{}
+%default output
+\tkztriminos{value 1 § value 2 § a long long value 3}
+\end{DemoCode}
+
+\pagebreak
+
+\subsection{TikZ styles}
+
+Few \TikZ\ styles are available, and they can be modified.
+
+\begin{DemoCode}{listing only}
+%sides of TriMino
+\tikzset{tkztriminoside/.style={thick}}
+
+%labels (with \tkztriminofont given by key)
+\tikzset{tkztriminolabel/.style={font=\tkztriminofont,inner sep=1pt}}
+
+%decoration (with \tkztriminocolor given by key)
+\tikzset{tkztriminosidedeco/.style={semithick,draw=black,fill=\tkztriminocolor}}
+\end{DemoCode}
+
+\subsection{Keys}
+
+Available keys, to be given within \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|[...]| are:
+
+\begin{itemize}
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|size| := size of \textsf{TriMino}\hfill(default \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|5cm|)
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|font| := font for texts\hfill(default \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|\Large|)
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|decoration| :=boolean for showing the \textit{inner} decoration\hfill(default \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|true|)
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|decocolor| := color of the optional \textit{inner} decoration\hfill(default \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|lightgray|)
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|showtxtlogo| := boolean for showing optional circular logo text\hfill(default \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|false|)
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|txtlogo| := text for optional circular logo\hfill(default \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|TriMino~TriMino~TriMino~|)
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|fontdeco| := font for optional circular logo\hfill(default \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|\tiny\sffamily|)
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|showiconlogo| := boolean for showing optional graphic logo\hfill(default \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|false|)
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|iconlogo| := graphic element for center logo
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|bgcolor| := optional background color of \textsf{TriMino}
+ \item \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|scaledeco| :=scale for \textit{inner} decoration\hfill(default \lstinline[language={[latex]TeX},basicstyle=\ttfamily]|0.25|)
+\end{itemize}
+
+\pagebreak
+
+\section{Examples}
+
+\subsection{One TriMino}
+
+\begin{DemoCode}{}
+\tkztriminos%
+ [showiconlogo,size=4cm,bgcolor=yellow!15,decocolor=teal!75,font=\large]
+ {$(x+1)(x+2)$ § $x^2+2x+1$ § $(x-7)^2-4$}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\tkztriminos[showtxtlogo]{%
+ \faHatWizard\,--\,\faHatWizard\,--\,\faHatWizard
+ §
+ \faPython\,--\,\faPython\,--\,\faPython
+ §
+ \faTimes\,--\,\faTimes\,--\,\faTimes
+}
+\end{DemoCode}
+
+\subsection{Several TriMinos}
+
+\begin{DemoCode}{}
+\tkztriminos%
+ [size=5cm,showiconlogo,bgcolor=orange!15,font=\large,decocolor=purple,%
+ iconlogo={\scalebox{2.15}[2.15]{\textcolor{blue!75!black}{\faPuzzlePiece}}}]%
+ <scale=0.75,transform shape>%
+ {%
+ $1+1$ § $2$ §
+ $2+2$ § $4$ §
+ $3+3$ § $6$ §
+ {$x_{1}=\frac{-3-\sqrt{41}}{6}$ ; $x_{2}=\frac{-3+\sqrt{41}}{6}$} § $9x^{2}+9x-8$ §
+ $5+5$ § $10$ §
+ $6+6$ § $12$ §
+ $7+7$ § $14$ §
+ $8+8$ § $16$ §
+ $9+9$ § $18$ §
+ $10+10$ § $20$ §
+ $11+11$ § $22$ §
+ $12+12$ § $24$ §
+ Joker
+}
+\end{DemoCode}
+
+\pagebreak
+
+\begin{DemoCode}{}
+\tkztriminos%
+ [showiconlogo,iconlogo={\includegraphics[height=0.75cm]{pfl-checked}}]%
+ {1a§1b§2a§2b§3a§3b§4a§4b§5a§5b§6a§6b§7a§7b§8a§8b§9a§9b§joker}
+\end{DemoCode}
+
+\pagebreak
+
+\section{History}
+
+\texttt{0.1.0: Initial version}
+
+\end{document}
diff --git a/graphics/pgf/contrib/tikz-triminos/tex/tikz-triminos.sty b/graphics/pgf/contrib/tikz-triminos/tex/tikz-triminos.sty
new file mode 100644
index 0000000000..95e0c32836
--- /dev/null
+++ b/graphics/pgf/contrib/tikz-triminos/tex/tikz-triminos.sty
@@ -0,0 +1,179 @@
+% Author : C. Pierquet
+% licences : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
+% Inspiration.....: https://schule.paul-matthies.de/Trimino.php (CC BY-NC-SA 4.0)
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{tikz-triminos}[2025/01/20 0.1.0 triminos, made with TikZ]
+
+%------History
+% 0.1.0 Initial version
+
+%------Packages and library
+\RequirePackage{tikz}
+\usetikzlibrary{calc,decorations.text}
+\RequirePackage{xstring}
+\RequirePackage{fontawesome5}
+\RequirePackage{ifthen}
+\RequirePackage{settobox}
+\RequirePackage{simplekv}
+\RequirePackage{listofitems}
+
+%------tikz styles
+\tikzset{tkztriminoside/.style={thick}}
+\tikzset{tkztriminolabel/.style={font=\tkztriminofont,inner sep=1pt}}
+\tikzset{tkztriminosidedeco/.style={semithick,draw=black,fill=\tkztriminocolor}}
+
+%------lengths
+\newlength{\tkztriminotmpnode}
+\newlength{\tkztriminosize}
+\newsavebox{\tkztriminobox}
+
+%------keys
+\defKV[tkztrimino]{%
+ size=\setlength\tkztriminosize{#1},
+ font=\def\tkztriminofont{#1},
+ decocolor=\def\tkztriminocolor{#1},
+ bgcolor=\def\tkztriminobgcolor{#1},%
+ txtlogo=\def\tkztriminotxtlogo{#1},%
+ iconlogo=\def\tkztriminoiconlogo{#1},%
+ scaledeco=\def\tkztriminostar{#1},%
+ fontdeco=\def\tkztriminodecofont{#1}
+}
+\setKVdefault[tkztrimino]{%
+ size=5cm,%
+ font=\Large,%
+ decocolor=lightgray,%
+ decoration=true,%
+ showtxtlogo=false,%
+ showiconlogo=false,%
+ bgcolor={},%
+ txtlogo={TriMino~TriMino~TriMino~},%
+ iconlogo={\scalebox{2}[2]{\textcolor{darkgray}{\faBahai}}},%
+ scaledeco=0.25,%
+ fontdeco={\tiny\sffamily}
+}
+
+%------internal macro
+\NewDocumentCommand\inttrimino{ m m m }{%
+ \begin{scope}[shift={#1},rotate=#2,transform shape,line join=round]
+ \IfEq{\tkztriminobgcolor}{}%
+ {%
+ \draw[tkztriminoside] (0,0) --++ (60:{\tkztriminosize}) --++ (-60:{\tkztriminosize}) -- cycle ;
+ }%
+ {%
+ \draw[fill=\tkztriminobgcolor,tkztriminoside] (0,0) --++ (60:{\tkztriminosize}) --++ (-60:{\tkztriminosize}) -- cycle ;
+ }%
+ \ifboolKV[tkztrimino]{decoration}%
+ {%
+ \draw[tkztriminosidedeco] (0,0) --++ (60:{\tkztriminostar\tkztriminosize}) -- (30:{\tkztriminostaralt\tkztriminosize}) -- (0:{\tkztriminostar\tkztriminosize}) -- cycle ;
+ \begin{scope}[shift={(0:{\tkztriminosize})},rotate=120]
+ \fill[tkztriminosidedeco] (0,0) --++ (60:{\tkztriminostar\tkztriminosize}) -- (30:{\tkztriminostaralt\tkztriminosize}) -- (0:{\tkztriminostar\tkztriminosize}) -- cycle ;
+ \end{scope}
+ \begin{scope}[shift={(60:{\tkztriminosize})},rotate=-120]
+ \fill[tkztriminosidedeco] (0,0) --++ (60:{\tkztriminostar\tkztriminosize}) -- (30:{\tkztriminostaralt\tkztriminosize}) -- (0:{\tkztriminostar\tkztriminosize}) -- cycle ;
+ \end{scope}
+ }%
+ {}%
+ \ifboolKV[tkztrimino]{showtxtlogo}%
+ {%
+ \path[decorate,decoration={text along path,text={|\tkztriminodecofont|\tkztriminotxtlogo},text align=fit to path}] (30:{sqrt(3)/3*\tkztriminosize}) circle[radius=0.085\tkztriminosize];
+ }%
+ {}%
+ \ifboolKV[tkztrimino]{showiconlogo}%
+ {%
+ \draw (30:{sqrt(3)/3*\tkztriminosize}) node {\tkztriminoiconlogo};
+ }%
+ {}%
+ \foreach \tkztext [count=\i] in {#3}{
+ \ifnum\i=1
+ \sbox{\tkztriminobox}{\pgfinterruptpicture \tkztriminofont\tkztext\endpgfinterruptpicture}\settoboxwidth{\tkztriminotmpnode}{\tkztriminobox}
+ \ifthenelse{\lengthtest{\tkztriminotmpnode < \fpeval{1-2*\tkztriminostar}\tkztriminosize}}%
+ {%
+ \path (60:{\tkztriminosize}) -- (0,0) node[midway,sloped,above,tkztriminolabel,rotate=180] {\strut\tkztext} ;
+ }%
+ {%
+ \path (60:{\tkztriminosize}) -- (0,0) node[midway,sloped,above,tkztriminolabel,rotate=180] {\strut\resizebox{\fpeval{1-2*\tkztriminostar}\tkztriminosize}{!}{\tkztext}} ;
+ }%
+ \fi
+ \ifnum\i=2
+ \sbox{\tkztriminobox}{\pgfinterruptpicture \tkztriminofont\tkztext\endpgfinterruptpicture}\settoboxwidth{\tkztriminotmpnode}{\tkztriminobox}
+ \ifthenelse{\lengthtest{\tkztriminotmpnode < \fpeval{1-2*\tkztriminostar}\tkztriminosize}}%
+ {%
+ \path (0,0) -- ({\tkztriminosize},0) node[midway,sloped,above,tkztriminolabel] {\strut\tkztext} ;
+ }%
+ {%
+ \path (0,0) -- ({\tkztriminosize},0) node[midway,sloped,above,tkztriminolabel] {\strut\resizebox{\fpeval{1-2*\tkztriminostar}\tkztriminosize}{!}{\tkztext}} ;
+ }%
+ \fi
+ \ifnum\i=3
+ \sbox{\tkztriminobox}{\pgfinterruptpicture \tkztriminofont\tkztext\endpgfinterruptpicture}\settoboxwidth{\tkztriminotmpnode}{\tkztriminobox}
+ \ifthenelse{\lengthtest{\tkztriminotmpnode < \fpeval{1-2*\tkztriminostar}\tkztriminosize}}%
+ {%
+ \path ({\tkztriminosize},0) -- (60:{\tkztriminosize}) node[midway,sloped,above,tkztriminolabel,rotate=180] {\strut\tkztext} ;
+ }%
+ {%
+ \path ({\tkztriminosize},0) -- (60:{\tkztriminosize}) node[midway,sloped,above,tkztriminolabel,rotate=180] {\strut\resizebox{\fpeval{1-2*\tkztriminostar}\tkztriminosize}{!}{\tkztext}} ; ;
+ }%
+ \fi
+ }
+ \end{scope}
+}
+
+%------main macro
+\NewDocumentCommand\tkztriminos{ O{} D<>{} m }{%
+ \restoreKV[tkztrimino]%
+ \setKV[tkztrimino]{#1}%
+ \xdef\tkztriminostaralt{\fpeval{0.5*(\tkztriminostar)}}%
+ \setsepchar{§}%
+ \readlist*\listitemstrimino{#3}%
+ \begin{tikzpicture}[#2]
+ \ifnum\listitemstriminolen=3
+ %only one
+ \inttrimino{(0,0)}{0}{\listitemstrimino[1],\listitemstrimino[2],\listitemstrimino[3]}
+ \fi
+ \ifnum\listitemstriminolen=19
+ %with 9 triminos (5 jokers)
+ \inttrimino{(0,0)}{0}{\listitemstrimino[-1],\listitemstrimino[7],\listitemstrimino[3]}
+ \inttrimino{(0:{\tkztriminosize})}{60}{\listitemstrimino[4],\listitemstrimino[6],\listitemstrimino[2]}
+ \inttrimino{(0:{\tkztriminosize})}{0}{\listitemstrimino[5],\listitemstrimino[9],\listitemstrimino[-1]}
+ \inttrimino{(0,0)}{-60}{\listitemstrimino[8],\listitemstrimino[12],\listitemstrimino[14]}
+ \inttrimino{(0:{\tkztriminosize})}{-120}{\listitemstrimino[15],\listitemstrimino[13],\listitemstrimino[-1]}
+ \inttrimino{(0:{\tkztriminosize})}{-60}{\listitemstrimino[10],\listitemstrimino[16],\listitemstrimino[18]}
+ \inttrimino{(-60:{\tkztriminosize})}{-60}{\listitemstrimino[1],\listitemstrimino[-1],\listitemstrimino[-1]}
+ \inttrimino{(-60:{\tkztriminosize})}{-120}{\listitemstrimino[-1],\listitemstrimino[11],\listitemstrimino[-1]}
+ \inttrimino{(-30:{sqrt(3)*\tkztriminosize})}{-120}{\listitemstrimino[17],\listitemstrimino[-1],\listitemstrimino[-1]}
+ \fi
+ \ifnum\listitemstriminolen=25
+ %with 12 triminos (10 jokers)
+ \inttrimino{(0,0)}{0}{\listitemstrimino[13],\listitemstrimino[11],\listitemstrimino[1]}
+ \inttrimino{(0:{\tkztriminosize})}{60}{\listitemstrimino[2],\listitemstrimino[4],\listitemstrimino[16]}
+ \inttrimino{(0:{\tkztriminosize})}{0}{\listitemstrimino[3],\listitemstrimino[5],\listitemstrimino[17]}
+ \inttrimino{(0,0)}{-60}{\listitemstrimino[12],\listitemstrimino[24],\listitemstrimino[10]}
+ \inttrimino{(0:{\tkztriminosize})}{-120}{\listitemstrimino[7],\listitemstrimino[9],\listitemstrimino[21]}
+ \inttrimino{(0:{\tkztriminosize})}{-60}{\listitemstrimino[6],\listitemstrimino[8],\listitemstrimino[20]}
+ \inttrimino{(-60:{\tkztriminosize})}{-60}{\listitemstrimino[22],\listitemstrimino[-1],\listitemstrimino[-1]}
+ \inttrimino{(-60:{\tkztriminosize})}{-120}{\listitemstrimino[-1],\listitemstrimino[23],\listitemstrimino[-1]}
+ \inttrimino{(-30:{sqrt(3)*\tkztriminosize})}{-120}{\listitemstrimino[19],\listitemstrimino[-1],\listitemstrimino[-1]}
+ \inttrimino{(-60:{2*\tkztriminosize})}{-120}{\listitemstrimino[-1],\listitemstrimino[-1],\listitemstrimino[15]}
+ \inttrimino{(-60:{2*\tkztriminosize})}{-60}{\listitemstrimino[-1],\listitemstrimino[-1],\listitemstrimino[18]}
+ \inttrimino{(-60:{2*\tkztriminosize})}{-180}{\listitemstrimino[-1],\listitemstrimino[-1],\listitemstrimino[14]}
+ \fi
+ \ifnum\listitemstriminolen=36
+ %with 12 triminos tous remplis
+ \inttrimino{(0,0)}{0}{\listitemstrimino[13],\listitemstrimino[11],\listitemstrimino[1]}
+ \inttrimino{(0:{\tkztriminosize})}{60}{\listitemstrimino[2],\listitemstrimino[4],\listitemstrimino[16]}
+ \inttrimino{(0:{\tkztriminosize})}{0}{\listitemstrimino[3],\listitemstrimino[5],\listitemstrimino[17]}
+ \inttrimino{(0,0)}{-60}{\listitemstrimino[12],\listitemstrimino[24],\listitemstrimino[10]}
+ \inttrimino{(0:{\tkztriminosize})}{-120}{\listitemstrimino[7],\listitemstrimino[9],\listitemstrimino[21]}
+ \inttrimino{(0:{\tkztriminosize})}{-60}{\listitemstrimino[6],\listitemstrimino[8],\listitemstrimino[20]}
+ \inttrimino{(-60:{\tkztriminosize})}{-60}{\listitemstrimino[22],\listitemstrimino[31],\listitemstrimino[25]}
+ \inttrimino{(-60:{\tkztriminosize})}{-120}{\listitemstrimino[32],\listitemstrimino[23],\listitemstrimino[33]}
+ \inttrimino{(-30:{sqrt(3)*\tkztriminosize})}{-120}{\listitemstrimino[19],\listitemstrimino[26],\listitemstrimino[35]}
+ \inttrimino{(-60:{2*\tkztriminosize})}{-120}{\listitemstrimino[30],\listitemstrimino[28],\listitemstrimino[15]}
+ \inttrimino{(-60:{2*\tkztriminosize})}{-60}{\listitemstrimino[36],\listitemstrimino[29],\listitemstrimino[18]}
+ \inttrimino{(-60:{2*\tkztriminosize})}{-180}{\listitemstrimino[27],\listitemstrimino[34],\listitemstrimino[14]}
+ \fi
+ \end{tikzpicture}%
+}
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.pdf b/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.pdf
index 68574d0bff..e765213680 100644
--- a/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.pdf
+++ b/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.tex b/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.tex
index 287d240690..f45f5b8eb8 100644
--- a/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.tex
+++ b/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.tex
@@ -4,8 +4,8 @@
\documentclass[french,a4paper,11pt]{article}
\usepackage[margin=2cm,includefoot]{geometry}
-\def\TPversion{0.1.2}
-\def\TPdate{22 juillet 2023}
+\def\TPversion{0.1.3}
+\def\TPdate{16 septembre 2024}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath,amssymb}
@@ -16,6 +16,7 @@
\makesavenoteenv{tabular}
\usepackage{enumitem}
\usepackage{tabularray}
+\UseTblrLibrary{diagbox}
\usepackage{fancyvrb}
\usepackage{fancyhdr}
\fancyhf{}
@@ -206,6 +207,7 @@
\vspace*{-2cm}
+ \def\listecouleursdes{red!25,blue!25,yellow!25,orange!25,green!25}\TirageAleaDesTriDim[EspaceH=-2mm]{5}
\hfill
\begin{EmpilementCubes}
\PlaquePetitsCubes[cyan/red/green/yellow]{ 3111-1-4 / 233123 / 2-1112 }
@@ -242,17 +244,19 @@
\tableofcontents
-\vfill
+\pagebreak
\part{Historique}
+\verb|v0.1.3|~:~~~~Affichage de dés en 3d (avec aléatoire possible)
+
\verb|v0.1.2|~:~~~~Option pour l'épaisseur des traits + \textsf{[line join=round]} pour les cubes
\verb|v0.1.1|~:~~~~Tracé des segments individuels avec l'option \textsf{[line cap=round]}
\verb|v0.1.0|~:~~~~Version initiale
-\newpage
+\pagebreak
\part{Introduction}
@@ -268,7 +272,8 @@ Le package propose des commandes basiques -- et francisées -- pour travailler s
\item une commande pour tracer et personnaliser un cube ;
\item des commandes pour créer/afficher/nommer des points de l'espace ;
\item des commandes pour tracer un ou plusieurs segments ;
- \item des commandes et un environnement pour travailler sur des \textit{empilements} de cubes.
+ \item des commandes et un environnement pour travailler sur des \textit{empilements} de cubes ;
+ \item des commandes pour représenter des dés en perspective (avec aléatoire possible).
\end{itemize}
\vspace*{-\baselineskip}\leavevmode
\end{noteblock}
@@ -297,8 +302,8 @@ Il n'existe pas d'option pour le package, et \texttt{xcolor} n'est pas chargé.
\textsf{tikz3d-fr} charge les packages suivantes :
\begin{itemize}
- \item \texttt{tikz}, \texttt{xstring}, \texttt{xintexpr}, \texttt{simplekv} et \texttt{xinttools} et \texttt{listofitems} ;
- \item les librairies \texttt{\textit{tikz}.calc} et \texttt{\textit{tikz}.babel}.
+ \item \texttt{tikz}, \texttt{xstring}, \texttt{xintexpr}, \texttt{simplekv} et \texttt{xinttools} et \texttt{listofitems}, \texttt{tikz-3dplot} et \texttt{randomlist} ;
+ \item la librairie \texttt{\textit{tikz}.calc}.
\end{itemize}
Il est compatible avec les compilations usuelles en \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} ou \textsf{xelatex}.
@@ -758,4 +763,144 @@ Par exemple, la \textit{grille} associée à l'empilement précédent est :
\end{EmpilementCubes}
\end{PresCode}
+\newpage
+
+\part{Dés à jouer, en 3D}
+
+\section{Fonctionnement global}
+
+\begin{tipblock}
+L'idée est de proposer des commandes pour travailler avec des dés, en 3D, avec possibilité de les \textit{lancer} de manière aléatoire.
+
+\smallskip
+
+La commande peut être autonome pour afficher dé par dé, mais elle peut être également à intégrer dans un environnement \texttt{tikzpicture}.
+\end{tipblock}
+
+\begin{importantblock}
+Par défaut, les dés ont une hauteur proche de 1~cm (sans la perspective).
+
+\smallskip
+
+L'orientation est \textit{globalement} fixée, mais il est possible (dans une certaine mesure) de pivoter les dés (suivants les angles $\theta$ et $\phi$ des coordonnées sphériques).
+
+\smallskip
+
+Il est également possible de spécifier un \textit{angle de vue}, droite ou gauche.
+\end{importantblock}
+
+
+\begin{PresCodeTex}{listing only}
+%affichage indépendant
+\DeTriDim[clés]{numéro(s)}
+\end{PresCodeTex}
+
+\begin{PresCodeTex}{listing only}
+%affichage dans un environnement
+\begin{tikzpicture}
+ \DeTriDim*[clés]{numéro(s)}
+\end{tikzpicture}
+\end{PresCodeTex}
+
+\begin{PresCodeTex}{listing only}
+%tirages aléatoires
+\TirageAleaDesTriDim[clés]{tirages}
+\end{PresCodeTex}
+
+\begin{PresCode}{}
+\DeTriDim{6/2}~\DeTriDim{1/5}~\DeTriDim{6/4}~\DeTriDim{3/2}
+\end{PresCode}
+
+\begin{PresCode}{}
+\begin{tikzpicture}
+ %\tdplotsetmaincoords{70}{110}
+ \DeTriDim*[Echelle=2]{6/2}
+ \DeTriDim*[Echelle=2,Origine={(2,-0.2)}]{6/5}
+ \DeTriDim*[Echelle=2,Origine={(4,-0.4)},]{6/3}
+ \DeTriDim*[Echelle=2,Origine={(6,-0.6)},Hasard]{}
+\end{tikzpicture}
+\end{PresCode}
+
+\begin{PresCode}{}
+\TirageAleaDesTriDim[Vue=G,Yams,Echelle=3,Couleurs={red!25,blue!25,yellow!25}]{3}
+\end{PresCode}
+
+\section{Influence des paramètres}
+
+\subsection{Clés et options}
+
+\begin{tipblock}
+Quelques \Cle{clés} sont disponibles pour cette commande (elles ne sont pas toutes utilisées par les toutes les commandes) :
+
+\begin{itemize}
+ \item \Cle{Echelle} : échelle pour modifier la taille ;\hfill{}défaut \Cle{1}
+ \item \Cle{Couleur} : couleur (individuelle) ;\hfill{}défaut \Cle{lightgray!25}
+ \item \Cle{CouleurPoints} : couleurs des points ;\hfill{}défaut \Cle{black}
+ \item \Cle{Phi} : angle $\phi$ de la perpective ;\hfill{}défaut \Cle{110}
+ \item \Cle{Theta} : angle $\theta$ de la perpective ;\hfill{}défaut \Cle{70}
+ \item \Cle{Vue} : vue de la perspective (\texttt{D/G}) ;\hfill{}défaut \Cle{D}
+ \item \Cle{Hasard} : booléen pour un tirage aléatoire ;\hfill{}défaut \Cle{false}
+ \item \Cle{Origine} : origine du dé pour la version \texttt{tikzpicture} ;
+ \item en ce qui concerne les clés spécifiques au tirage :
+ \begin{itemize}
+ \item \Cle{EspaceH} : espace horizontal entre les dés ;\hfill{}défaut \Cle{0mm}
+ \item \Cle{Couleurs} : liste des couleurs pour les dés ;\hfill{}défaut \Cle{lightgray!25}
+ \item \Cle{Yams} : booléen pour forcer un affichage en ligne.\hfill{}défaut \Cle{false}
+ \end{itemize}
+\end{itemize}
+
+Hormis dans le cas où \texttt{Harsard=true}, l'argument obligatoire, pour l'affichage unique, est à donner sous la forme \texttt{face de devant/face du dessus} (l'autre face visible est déterminée automatiquement).
+\end{tipblock}
+
+\subsection{Exemples}
+
+\begin{PresCode}{}
+\TirageAleaDesTriDim[EspaceH=-2mm]{5}
+
+\TirageAleaDesTriDim[EspaceH=1mm,Echelle=2,Couleurs=darkgray,CouleurPoints=white]{5}
+\end{PresCode}
+
+\begin{PresCode}{}
+\def\listecouleursdes{red!25,blue!25,yellow!25,orange!25,green!25}
+
+\TirageAleaDesTriDim[Yams,Couleurs=brown!10]{10}
+
+\TirageAleaDesTriDim[Yams,Echelle=2,Couleurs=\listecouleursdes,CouleurPoints=magenta]{5}
+
+\TirageAleaDesTriDim[Vue=G,Yams,Echelle=3,Couleurs=\listecouleursdes]{3}
+\end{PresCode}
+
+\subsection{Angles de rotation}
+
+\begin{cautionblock}
+Les paramètres $\theta$ et $\phi$ peuvent être modifiés, en fonction du rendu souhaité.
+
+Mais comme toutes les faces ne sont pas traitées (du fait de la perspective), il est conseillé de rester dans une \textit{fenêtre classique}.
+\end{cautionblock}
+
+\begin{tipblock}
+Vue \texttt{D} :
+
+\begin{tblr}{hlines,vlines,colspec={*{5}{Q[m,c]}}}
+ \diagbox{$\phi$}{$\theta$} & 60 & \textbf{70} & 80 & 85 \\
+ 95 & \DeTriDim[Hasard,Theta=60,Phi=95]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=70,Phi=95]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=80,Phi=95]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=85,Phi=95]<baseline=0pt>{} \\
+ 100 & \DeTriDim[Hasard,Theta=60,Phi=100]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=70,Phi=100]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=80,Phi=100]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=85,Phi=100]<baseline=0pt>{} \\
+ \textbf{110} & \DeTriDim[Hasard,Theta=60,Phi=95]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=70,Phi=110,Couleur=red!25]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=80,Phi=110]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=85,Phi=110]<baseline=0pt>{} \\
+ 120 & \DeTriDim[Hasard,Theta=60,Phi=120]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=70,Phi=120]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=80,Phi=120]<baseline=0pt>{} & \DeTriDim[Hasard,Theta=85,Phi=120]<baseline=0pt>{} \\
+\end{tblr}
+\end{tipblock}
+
+\begin{tipblock}
+Vue \texttt{G} :
+
+\begin{tblr}{hlines,vlines,colspec={*{5}{Q[m,c]}}}
+ \diagbox{$\phi$}{$\theta$} & 60 & \textbf{70} & 80 & 85 \\
+ 95 & \DeTriDim[Vue=G,Hasard,Theta=60,Phi=95]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=70,Phi=95]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=80,Phi=95]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=85,Phi=95]<baseline=0pt>{} \\
+ 100 & \DeTriDim[Vue=G,Hasard,Theta=60,Phi=100]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=70,Phi=100]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=80,Phi=100]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=85,Phi=100]<baseline=0pt>{} \\
+ \textbf{110} & \DeTriDim[Vue=G,Hasard,Theta=60,Phi=95]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=70,Phi=110,Couleur=red!25]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=80,Phi=110]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=85,Phi=110]<baseline=0pt>{} \\
+ 120 & \DeTriDim[Vue=G,Hasard,Theta=60,Phi=120]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=70,Phi=120]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=80,Phi=120]<baseline=0pt>{} & \DeTriDim[Vue=G,Hasard,Theta=85,Phi=120]<baseline=0pt>{} \\
+\end{tblr}
+\end{tipblock}
+
+
\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz3d-fr/tex/tikz3d-fr.sty b/graphics/pgf/contrib/tikz3d-fr/tex/tikz3d-fr.sty
index 5056c951a8..b6d4e20829 100644
--- a/graphics/pgf/contrib/tikz3d-fr/tex/tikz3d-fr.sty
+++ b/graphics/pgf/contrib/tikz3d-fr/tex/tikz3d-fr.sty
@@ -3,15 +3,18 @@
% or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{tikz3d-fr}[2023/07/22 0.1.2 Aide pour l'utilisation de TikZ 3D]
+\ProvidesPackage{tikz3d-fr}[2024/09/16 0.1.3 Aide pour l'utilisation de TikZ 3D]
+%0.1.3 Dés à jouer en 3D
%0.1.2 Option pour l'épaisseur des traits + [line join=round] pour les cubes
%0.1.1 Segments avec [line cap=round]
%0.1.0 Version initiale
%------Packages utiles
\RequirePackage{tikz}
+\RequirePackage{tikz-3dplot}
\RequirePackage{xstring}
\RequirePackage{simplekv}
+\RequirePackage{randomlist}
\RequirePackage{xinttools}
\RequirePackage{xintexpr}
\RequirePackage{listofitems}
@@ -328,4 +331,258 @@
{\end{EnvTikzEspace}}
}
+%====DÉS EN 3D
+\newlength{\detridimoffseth}
+\setlength{\detridimoffseth}{0mm}
+
+\defKV[DeTriDim]{%
+ Echelle=\def\detridimscale{#1},%
+ Couleur=\def\detridimcouleur{#1},%
+ EspaceH=\setlength{\detridimoffseth}{#1},%
+ Couleurs=\def\detridimcouleurs{#1},%
+ CouleurPoints=\def\detridimcouleurpts{#1},%
+ Phi=\def\detridimphi{#1},%
+ Theta=\def\detridimtheta{#1},%
+ Vue=\def\deftridimvue{#1},%
+ Origine=\def\deftridimorigin{#1}
+}
+\setKVdefault[DeTriDim]{%
+ Echelle=1,%
+ Couleur=lightgray!25,%
+ CouleurPoints=black,%
+ Hasard=false,%
+ EspaceH={0mm},%
+ Couleurs=lightgray!25,%
+ Phi=110,%
+ Theta=70,%
+ Vue=D,%
+ Origine={(0,0)},%
+ Yams=false
+}
+
+\NewDocumentCommand\FaceDeTriDim{ m }{%
+ %1 = face avec points communs si besoin pour simplifier le code
+ \xintifboolexpr{#1 == 2 'or' #1 == 4 'or' #1 == 5 'or' #1 == 6}%
+ {%
+ \fill[\detridimcouleurpts] (0.5,0.5) circle[radius=1/6] ; % HG
+ \fill[\detridimcouleurpts] (-0.5,-0.5) circle[radius=1/6] ; % BD
+ }%
+ {}%
+ \xintifboolexpr{#1 == 3 'or' #1 == 4 'or' #1 == 5 'or' #1 == 6}%
+ {%
+ \fill[\detridimcouleurpts] (-0.5,0.5) circle[radius=1/6] ; % HD
+ \fill[\detridimcouleurpts] (0.5,-0.5) circle[radius=1/6] ; % BG
+ }%
+ {}%
+ \xintifboolexpr{#1 == 1 'or' #1 == 3 'or' #1 == 5}%
+ {%
+ \fill[\detridimcouleurpts] (0,0) circle[radius=1/6] ; % CENTRE
+ }%
+ {}%
+ \xintifboolexpr{#1 == 6}%
+ {%
+ \fill[\detridimcouleurpts] (0.5,0) circle[radius=1/6] ; % MG
+ \fill[\detridimcouleurpts] (-0.5,0) circle[radius=1/6] ; % MD
+ }%
+ {}%
+}
+
+%liste pour les faces
+\NewList{detridimfaceU}\SetList{detridimfaceU}{2,3,4,5}
+\NewList{detridimfaceD}\SetList{detridimfaceD}{1,3,4,6}
+\NewList{detridimfaceT}\SetList{detridimfaceT}{1,2,6,5}
+\NewList{detridimfaceQ}\SetList{detridimfaceQ}{1,5,6,2}
+\NewList{detridimfaceC}\SetList{detridimfaceC}{1,3,6,4}
+\NewList{detridimfaceS}\SetList{detridimfaceS}{2,4,5,3}
+
+%commande autonome
+\NewDocumentCommand\DeTriDim{ s O{} D<>{} m }{%
+ %* = mode non autonome
+ %1 = clés
+ %2 = options tikzpicture
+ %3 = faces devant/dessus
+ \restoreKV[DeTriDim]%
+ \setKV[DeTriDim]{#2}%
+ %si aléatoire
+ \ifboolKV[DeTriDim]{Hasard}%
+ {%
+ \xdef\detridimfacedevant{\xinteval{randrange(1,7)}}%
+ \xintifboolexpr{\detridimfacedevant == 1}%
+ {%
+ \GetRandomItem{detridimfaceU}{detridimfacedessus}%
+ }%
+ {}%
+ \xintifboolexpr{\detridimfacedevant == 2}%
+ {%
+ \GetRandomItem{detridimfaceD}{detridimfacedessus}%
+ }%
+ {}%
+ \xintifboolexpr{\detridimfacedevant == 3}%
+ {%
+ \GetRandomItem{detridimfaceT}{detridimfacedessus}%
+ }%
+ {}%
+ \xintifboolexpr{\detridimfacedevant == 4}%
+ {%
+ \GetRandomItem{detridimfaceQ}{detridimfacedessus}%
+ }%
+ {}%
+ \xintifboolexpr{\detridimfacedevant == 5}%
+ {%
+ \GetRandomItem{detridimfaceC}{detridimfacedessus}%
+ }%
+ {}%
+ \xintifboolexpr{\detridimfacedevant == 6}%
+ {%
+ \GetRandomItem{detridimfaceS}{detridimfacedessus}%
+ }%
+ {}%
+ \xdef\detridimfaces{\detridimfacedevant/\detridimfacedessus}%
+ }%
+ {%
+ \xdef\detridimfaces{#4}%
+ \StrCut{#4}{/}{\detridimfacedevant}{\detridimfacedessus}%
+ }%
+ \IfStrEq{\deftridimvue}{D}%
+ {%
+ \IfStrEqCase{\detridimfaces}{%
+ {1/2}{\def\detridimfacedroite{3}}%
+ {1/3}{\def\detridimfacedroite{5}}%
+ {1/5}{\def\detridimfacedroite{4}}%
+ {1/4}{\def\detridimfacedroite{2}}%
+ %
+ {2/1}{\def\detridimfacedroite{4}}%
+ {2/4}{\def\detridimfacedroite{6}}%
+ {2/6}{\def\detridimfacedroite{3}}%
+ {2/3}{\def\detridimfacedroite{1}}%
+ %
+ {3/1}{\def\detridimfacedroite{2}}%
+ {3/2}{\def\detridimfacedroite{6}}%
+ {3/6}{\def\detridimfacedroite{5}}%
+ {3/5}{\def\detridimfacedroite{1}}%
+ %
+ {4/1}{\def\detridimfacedroite{5}}%
+ {4/5}{\def\detridimfacedroite{6}}%
+ {4/6}{\def\detridimfacedroite{2}}%
+ {4/2}{\def\detridimfacedroite{1}}%
+ %
+ {5/1}{\def\detridimfacedroite{3}}%
+ {5/3}{\def\detridimfacedroite{6}}%
+ {5/6}{\def\detridimfacedroite{4}}%
+ {5/4}{\def\detridimfacedroite{1}}%
+ %
+ {6/2}{\def\detridimfacedroite{4}}%
+ {6/4}{\def\detridimfacedroite{5}}%
+ {6/5}{\def\detridimfacedroite{3}}%
+ {6/3}{\def\detridimfacedroite{2}}%
+ }%
+ }%
+ {%
+ \IfStrEqCase{\detridimfaces}{%
+ {1/2}{\def\detridimfacedroite{4}}%
+ {1/3}{\def\detridimfacedroite{2}}%
+ {1/5}{\def\detridimfacedroite{3}}%
+ {1/4}{\def\detridimfacedroite{5}}%
+ %
+ {2/1}{\def\detridimfacedroite{3}}%
+ {2/4}{\def\detridimfacedroite{1}}%
+ {2/6}{\def\detridimfacedroite{4}}%
+ {2/3}{\def\detridimfacedroite{6}}%
+ %
+ {3/1}{\def\detridimfacedroite{5}}%
+ {3/2}{\def\detridimfacedroite{1}}%
+ {3/6}{\def\detridimfacedroite{2}}%
+ {3/5}{\def\detridimfacedroite{6}}%
+ %
+ {4/1}{\def\detridimfacedroite{2}}%
+ {4/5}{\def\detridimfacedroite{1}}%
+ {4/6}{\def\detridimfacedroite{5}}%
+ {4/2}{\def\detridimfacedroite{6}}%
+ %
+ {5/1}{\def\detridimfacedroite{3}}%
+ {5/3}{\def\detridimfacedroite{6}}%
+ {5/6}{\def\detridimfacedroite{4}}%
+ {5/4}{\def\detridimfacedroite{1}}%
+ %
+ {6/2}{\def\detridimfacedroite{3}}%
+ {6/4}{\def\detridimfacedroite{2}}%
+ {6/5}{\def\detridimfacedroite{4}}%
+ {6/3}{\def\detridimfacedroite{5}}%
+ }%
+ }%
+ \IfStrEq{\deftridimvue}{D}{\def\tmpdetridimxscale{1}}{\def\tmpdetridimxscale{-1}}%
+ \IfBooleanF{#1}{\begin{tikzpicture}[#3]}%
+ \tdplotsetmaincoords{\detridimtheta}{\detridimphi}
+ \begin{scope}[shift={(\deftridimorigin)},scale=\fpeval{0.5*\detridimscale},xscale=\tmpdetridimxscale,thick,tdplot_main_coords,rounded corners=\fpeval{\detridimscale*0.5*0.33}cm,fill=\detridimcouleur]
+ \begin{scope}[canvas is xy plane at z=-1]
+ \filldraw (-1,-1) rectangle (1,1);
+ \end{scope}
+ \begin{scope}[canvas is xz plane at y=-1]
+ \filldraw (-1,-1) rectangle (1,1);
+ \end{scope}
+ \begin{scope}[canvas is yz plane at x=-1]
+ \filldraw (-1,-1) rectangle (1,1);
+ \end{scope}
+ \begin{scope}[canvas is xy plane at z=1]%face du dessus
+ \filldraw (-1,-1) rectangle (1,1);
+ \FaceDeTriDim{\detridimfacedessus}
+ \end{scope}
+ \begin{scope}[canvas is xz plane at y=1]%face de droite
+ \filldraw (-1,-1) rectangle (1,1);
+ \FaceDeTriDim{\detridimfacedroite}
+ \end{scope}
+ \begin{scope}[canvas is yz plane at x=1]%face de devant
+ \filldraw (-1,-1) rectangle (1,1);
+ \FaceDeTriDim{\detridimfacedevant}
+ \end{scope}
+ \end{scope}
+ \IfBooleanF{#1}{\end{tikzpicture}}%
+}
+
+\NewDocumentCommand\TirageAleaDesTriDim{ O{} D<>{} m }{%
+ \restoreKV[DeTriDim]%
+ \setKV[DeTriDim]{#1}%
+ \readlist*\detridimlstcolors{\detridimcouleurs}%
+ \ifboolKV[DeTriDim]{Yams}%
+ {%
+ \begin{tikzpicture}[#2]
+ \ifnum\detridimlstcolorslen=1\relax
+ \foreach \i in {1,...,#3}{%
+ \IfStrEq{\deftridimvue}{D}%
+ {%
+ \DeTriDim*[#1,Hasard,Couleur=\detridimcouleurs,Origine={(\i*\detridimscale,-\i*\detridimscale*0.1)}]{}%
+ }%
+ {%
+ \DeTriDim*[#1,Hasard,Couleur=\detridimcouleurs,Origine={(-\i*\detridimscale,-\i*\detridimscale*0.1)}]{}%
+ }%
+ }%
+ \else%
+ \foreach \i in {1,...,#3}{%
+ \itemtomacro\detridimlstcolors[\i]{\tmpdetridimcolor}%
+ \IfStrEq{\deftridimvue}{D}%
+ {%
+ \DeTriDim*[#1,Hasard,Couleur=\tmpdetridimcolor,Origine={(\i*\detridimscale,-\i*\detridimscale*0.1)}]{}%
+ }%
+ {%
+ \DeTriDim*[#1,Hasard,Couleur=\tmpdetridimcolor,Origine={(-\i*\detridimscale,-\i*\detridimscale*0.1)}]{}%
+ }%
+ }%
+ \fi%
+ \end{tikzpicture}
+ }%
+ {%
+ \ifnum\detridimlstcolorslen=1\relax
+ \foreach \i in {1,...,#3}{%
+ \DeTriDim[#1,Hasard,Couleur=\detridimcouleurs]<#2>{}\ifnum\i<#3\relax\hspace*{\detridimoffseth}\fi%
+ }%
+ \else%
+ \foreach \i in {1,...,#3}{%
+ \itemtomacro\detridimlstcolors[\i]{\tmpdetridimcolor}%
+ \DeTriDim[#1,Hasard,Couleur=\tmpdetridimcolor]<#2>{}\ifnum\i<#3\relax\hspace*{\detridimoffseth}\fi%
+ }%
+ \fi%
+ }%
+}
+
+
\endinput \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzbricks/README.md b/graphics/pgf/contrib/tikzbricks/README.md
index 57dd862009..b55cdae41e 100644
--- a/graphics/pgf/contrib/tikzbricks/README.md
+++ b/graphics/pgf/contrib/tikzbricks/README.md
@@ -2,13 +2,13 @@
# TikZbricks
-[![GitHub](https://img.shields.io/github/license/samcarter/tikzbricks.svg?color=blue)](http://www.latex-project.org/lppl.txt)
-[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/samcarter/tikzbricks.svg?label=current%20version)](https://github.com/samcarter/tikzbricks/releases/latest)
-[![CTAN](https://img.shields.io/ctan/v/tikzbricks.svg)](https://ctan.org/pkg/tikzbricks)
+[![License](https://img.shields.io/github/license/samcarter/tikzbricks.svg?color=blue)](https://www.latex-project.org/lppl.txt)
+[![GitHub tag](https://img.shields.io/github/tag/samcarter/tikzbricks.svg?label=current%20version&color=blue)](https://github.com/samcarter/tikzbricks/releases/latest)
+[![CTAN](https://img.shields.io/ctan/v/tikzbricks.svg?color=blue)](https://ctan.org/pkg/tikzbricks)
A small LaTeX package to draw bricks with TikZ. The user can modify the colour, shape and viewpoint.
-This project is licensed under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt .
+This project is licensed under the LaTeX Project Public License v1.3c or later, see https://www.latex-project.org/lppl.txt .
The project repository, including a bug tracker, can be found at https://github.com/samcarter/tikzbricks .
diff --git a/graphics/pgf/contrib/tikzbricks/tikzbricks-doc-settings.sty b/graphics/pgf/contrib/tikzbricks/tikzbricks-doc-settings.sty
index 777cedba6e..dbe497f34b 100644
--- a/graphics/pgf/contrib/tikzbricks/tikzbricks-doc-settings.sty
+++ b/graphics/pgf/contrib/tikzbricks/tikzbricks-doc-settings.sty
@@ -21,7 +21,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{xcolor}
\definecolor{samyellow}{RGB}{246,193,65}
-\definecolor{samorange}{RGB}{241,147,45}
+\definecolor{samorange}{RGB}{241,147,45}% pgfplotsthemebeamer
\definecolor{samred}{RGB}{191,26,46}% TikZbricks
\definecolor{sammagenta}{RGB}{170,42,104}% TikZmarmots
\definecolor{samviolet}{RGB}{136,46,114}% TikZlings
@@ -68,67 +68,27 @@
\RequirePackage{inconsolata}% mono font with bold, but italic is missing
% \RequirePackage[scale=0.85]{cascadia-code}
% \AddToHook{cmd/ttfamily/before}{\fontseries{sl}}
-\RequirePackage{iexec}
+\usepackage{synthslant}% to fake slented comments in inconsolata
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Listings
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\RequirePackage[
- cachedir=$TMPDIR/minted/
-]{minted}
-
-% smuggling custom pygmentize style in cache folder
-% (a real pygmentise style would need installtion in some python folder)
-\begin{filecontents*}[noheader]{./sam.pygstyle}
-\makeatletter
-\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax%
- \let\PYG@ul=\relax \let\PYG@tc=\relax%
- \let\PYG@bc=\relax \let\PYG@ff=\relax}
-\def\PYG@tok#1{\csname PYG@tok@#1\endcsname}
-\def\PYG@toks#1+{\ifx\relax#1\empty\else%
- \PYG@tok{#1}\expandafter\PYG@toks\fi}
-\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{%
- \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}}
-\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}}
-
-% optional arguments
-\expandafter\def\csname PYG@tok@na\endcsname{\def\PYG@tc##1{\textcolor{black}{##1}}}
-
-% macros
-\expandafter\def\csname PYG@tok@k\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
-% curly brakets
-\expandafter\def\csname PYG@tok@nb\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
-
-% comments (italics won't work with the inconsolata font)
-\expandafter\def\csname PYG@tok@c\endcsname{\def\PYG@tc##1{\textcolor{gray}{##1}}}
-
-\def\PYGZbs{\char`\\}
-\def\PYGZus{\char`\_}
-\def\PYGZob{\char`\{}
-\def\PYGZcb{\char`\}}
-\def\PYGZca{\char`\^}
-\def\PYGZam{\char`\&}
-\def\PYGZlt{\char`\<}
-\def\PYGZgt{\char`\>}
-\def\PYGZsh{\char`\#}
-\def\PYGZpc{\char`\%}
-\def\PYGZdl{\char`\$}
-\def\PYGZhy{\char`\-}
-\def\PYGZsq{\char`\'}
-\def\PYGZdq{\char`\"}
-\def\PYGZti{\char`\~}
-% for compatibility with earlier versions
-\def\PYGZat{@}
-\def\PYGZlb{[}
-\def\PYGZrb{]}
-\makeatother
-\end{filecontents*}
-
-\iexec{mkdir -p $TMPDIR/minted && mv sam.pygstyle $TMPDIR/minted/.}
+\RequirePackage[cachedir=./.minted]{minted}
+
+\AddToHook{env/MintedVerbatim/before}{%
+ % optional arguments
+ \@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor{black}{##1}}}%
+ % macros
+ \@namedef{PYG@tok@k}{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}%
+ % curly brakets
+ \@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}%
+ % comments (italics won't work with the inconsolata font)
+ \@namedef{PYG@tok@c}{\def\PYG@tc##1{\textcolor{gray}{\textsynthslant{##1}}}}%
+}
-\usemintedstyle{sam}
+\usemintedstyle{default}
\setminted{
breaksymbolleft={},
tabsize=2,
diff --git a/graphics/pgf/contrib/tikzbricks/tikzbricks-doc.pdf b/graphics/pgf/contrib/tikzbricks/tikzbricks-doc.pdf
index 121c6d41ba..b13c8f53b0 100644
--- a/graphics/pgf/contrib/tikzbricks/tikzbricks-doc.pdf
+++ b/graphics/pgf/contrib/tikzbricks/tikzbricks-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikzbricks/tikzbricks-doc.tex b/graphics/pgf/contrib/tikzbricks/tikzbricks-doc.tex
index 3895d6675e..f1ad0c2c59 100644
--- a/graphics/pgf/contrib/tikzbricks/tikzbricks-doc.tex
+++ b/graphics/pgf/contrib/tikzbricks/tikzbricks-doc.tex
@@ -8,18 +8,10 @@
% https://github.com/samcarter/TikZbricks
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% !TeX program = txs:///arara
-% arara: latexmk: {
-% arara: --> engine: pdflatex,
-% arara: --> options: [
-% arara: --> '-shell-escape',
-% arara: --> '-synctex=1',
-% arara: --> '-interaction=nonstopmode',
-% arara: --> ]
-% arara: --> }
+% arara: latexmk
\documentclass{scrartcl}
% meta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -34,7 +26,7 @@
\url{https://github.com/samcarter/TikZbricks}\\
\url{https://www.ctan.org/pkg/tikzbricks}
}{samcarter}}
-\date{Version v0.5 \textendash{} 2024/04/26}
+\date{Version v0.6 \textendash{} 2024/12/16}
\usepackage[
themecolor=samred
@@ -75,7 +67,7 @@ The package allows to draw bricks with \TikZ. The user can modify their colour,
The package is included in both \texlive and \miktex and available from \CTAN (\url{https://ctan.org/pkg/tikzbricks}).
The development version of this package is located on github at \url{https://github.com/samcarter/TikZbricks}. If you have any problems, ideas or other feedback, please make constructive use of its bug tracker.
-Copyright \raisebox{0.2em}{\tiny\fontfamily{cmr}\selectfont\textcopyright} \texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the \href{http://www.latex-project.org/lppl.txt}{LaTeX project public licence, version 1.3c or later}.
+Copyright \raisebox{0.2em}{\tiny\fontfamily{cmr}\selectfont\textcopyright} \texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the \href{https://www.latex-project.org/lppl.txt}{LaTeX project public licence, version 1.3c or later}.
\section{Basic usage}
@@ -143,6 +135,11 @@ In addition to this basic block, the user can customise the block via the follow
\brick[studtext={TikZ}]{2}{3}
\end{tikzpicture}
\end{tcblisting}
+\begin{tcblisting}{title={Brick text ()}}
+\begin{tikzpicture}
+ \brick[bricktext={TikZ}]{2}{3}
+\end{tikzpicture}
+\end{tcblisting}
All the above options are also available as package options to change the value for the whole document. The default colour can for example be specified like this:
\begin{tcolorbox}[title={Package options ()}]
diff --git a/graphics/pgf/contrib/tikzbricks/tikzbricks.sty b/graphics/pgf/contrib/tikzbricks/tikzbricks.sty
index 01b070bb60..2ca3786a42 100644
--- a/graphics/pgf/contrib/tikzbricks/tikzbricks.sty
+++ b/graphics/pgf/contrib/tikzbricks/tikzbricks.sty
@@ -9,10 +9,10 @@
% https://github.com/samcarter/TikZbricks
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzbricks}[2024/04/26 version v0.5 Drawing bricks with TikZ]
+\ProvidesPackage{tikzbricks}[2024/12/16 version v0.6 Drawing bricks with TikZ]
\RequirePackage{tikz}
\RequirePackage{tikz-3dplot}
@@ -29,12 +29,14 @@
\DeclareOptionX{studcolor}[\brick@color]{\def\brick@default@studcolor{#1}}
\DeclareOptionX{brickheight}[1.3]{\def\brick@default@height{#1}}
\DeclareOptionX{bricklength}[1.0]{\def\brick@default@length{#1}}
+\DeclareOptionX{bricktext}[]{\def\brick@default@facetext{#1}}
\DeclareOptionX{brickwidth}[1.0]{\def\brick@default@width{#1}}
\DeclareOptionX{studradius}[0.35]{\def\brick@default@radius{#1}}
\DeclareOptionX{studheight}[0.3]{\def\brick@default@studheight{#1}}
\DeclareOptionX{studtext}[]{\def\brick@default@text{#1}}
-\ExecuteOptionsX{color,frontcolor,topcolor,sidecolor,studcolor,brickheight,bricklength,brickwidth,studradius,studheight,studtext}
+
+\ExecuteOptionsX{color,frontcolor,topcolor,sidecolor,studcolor,brickheight,bricklength,bricktext,brickwidth,studradius,studheight,studtext}
\ProcessOptionsX
@@ -104,15 +106,17 @@
topcolor/.code = \def\brick@topcolor{#1},
topcolor = \brick@default@topcolor,
sidecolor/.code = \def\brick@sidecolor{#1},
- sidecolor = \brick@default@sidecolor,
+ sidecolor = \brick@default@sidecolor,
studcolor/.code = \def\brick@studcolor{#1},
- studcolor = \brick@default@studcolor,
+ studcolor = \brick@default@studcolor,
brickheight/.code = \def\brick@height{#1},
brickheight = \brick@default@height,
bricklength/.code = \def\brick@length{#1},
bricklength = \brick@default@length,
+ bricktext/.code = \def\brick@facetext{#1},
+ bricktext = \brick@default@facetext,
brickwidth/.code = \def\brick@width{#1},
- brickwidth = \brick@default@width,
+ brickwidth = \brick@default@width,
studradius/.code = \def\brick@radius{#1},
studradius = \brick@default@radius,
studheight/.code = \def\brick@studheight{#1},
@@ -134,42 +138,42 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Drawing the brick
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{scope}[tdplot_main_coords]
-
+
% Drawing faces
\pgfmathparse{sign(sin(\tdplotmainphi))}
\let\brick@sin\pgfmathresult
\pgfmathparse{sign(cos(\tdplotmainphi))}
- \let\brick@cos\pgfmathresult
-
+ \let\brick@cos\pgfmathresult
+
\ifnum\brick@sin<0
% Right
- \fill[\brick@sidecolor,thick]
+ \fill[\brick@sidecolor,thick]
(
\brick@length*\value{brickx},
\brick@width*\value{bricky},
\brick@height*\value{brickz}
- )
- -- ++(0,0,\brick@height)
- -- ++(0,\brick@width*#2,0)
- -- ++(0,0,-\brick@height)
+ )
+ -- ++(0,0,\brick@height)
+ -- ++(0,\brick@width*#2,0)
+ -- ++(0,0,-\brick@height)
-- cycle;
\else
% Left
- \fill[\brick@sidecolor,thick]
+ \fill[\brick@sidecolor,thick]
(
{\brick@length*(#1+\value{brickx})},
\brick@width*\value{bricky},
\brick@height*\value{brickz}
- )
- -- ++(0,0,\brick@height)
- -- ++(0,\brick@width*#2,0)
- -- ++(0,0,-\brick@height)
- -- cycle;
+ )
+ -- ++(0,0,\brick@height)
+ -- ++(0,\brick@width*#2,0)
+ -- ++(0,0,-\brick@height)
+ -- cycle;
\fi
-
+
\ifnum\brick@cos<0
% Front
\fill[\brick@frontcolor,thick]
@@ -178,77 +182,84 @@
{\brick@width*(#2+\value{bricky})},
\brick@height*\value{brickz}
)
- -- ++(\brick@length*#1,0,0)
- -- ++(0,0,\brick@height)
- -- ++(-\brick@length*#1,0,0)
+ -- ++(\brick@length*#1,0,0)
+ -- ++(0,0,\brick@height)
+ -- ++(-\brick@length*#1,0,0)
-- cycle;
+
+ \node[align=center, transform shape, canvas is zx plane at y=0, rotate=-90] at (
+ \brick@length*\value{brickx} + 0.5*\brick@length*#1,
+ {\brick@width*(#2+\value{bricky})},
+ \brick@height*\value{brickz} + 0.5*\brick@height
+ ) {\brick@facetext};
+
\else
- % Back
+ % Back
\fill[\brick@frontcolor,thick]
(
\brick@length*\value{brickx},
\brick@width*\value{bricky},
\brick@height*\value{brickz}
)
- -- ++(\brick@length*#1,0,0)
- -- ++(0,0,\brick@height)
- -- ++(-\brick@length*#1,0,0)
+ -- ++(\brick@length*#1,0,0)
+ -- ++(0,0,\brick@height)
+ -- ++(-\brick@length*#1,0,0)
-- cycle;
\fi
- % Top
- \fill[\brick@topcolor,thick]
+ % Top
+ \fill[\brick@topcolor,thick]
(
\brick@length*\value{brickx},
\brick@width*\value{bricky},
{\brick@height*(1+\value{brickz})}
)
- -- ++(0,\brick@width*#2,0)
- -- ++(\brick@length*#1,0,0)
- -- +(0,-\brick@width*#2,0)
+ -- ++(0,\brick@width*#2,0)
+ -- ++(\brick@length*#1,0,0)
+ -- +(0,-\brick@width*#2,0)
-- cycle;
-
-
+
+
% Drawing studs
\foreach \x in {1,...,#1}{
\foreach \y in {1,...,#2}{
-
+
% Bottom circle
- \fill[\brick@studcolor]
+ \fill[\brick@studcolor]
(
{\brick@length*(\x-0.5+\value{brickx})},
{\brick@width*(\y-0.5+\value{bricky})},
{\brick@height*(1+\value{brickz})}
- )
- circle [radius=\brick@radius];
-
+ )
+ circle [radius=\brick@radius];
+
% Rectangular stem
- \fill[\brick@studcolor]
+ \fill[\brick@studcolor]
(
{\brick@length*(\x-0.5+\value{brickx})},
{\brick@width*(\y-0.5+\value{bricky})},
{\brick@height*(1+\value{brickz})}
- )
- ++(canvas cs:x=-\brick@radius/0.35*10)
- -- ++(canvas cs:y=\brick@studheight*17.8)
- -- ++(canvas cs:x=\brick@radius/0.35*20)
+ )
+ ++(canvas cs:x=-\brick@radius/0.35*10)
+ -- ++(canvas cs:y=\brick@studheight*17.8)
+ -- ++(canvas cs:x=\brick@radius/0.35*20)
-- ++(canvas cs:y=-\brick@studheight*17.8);
-
+
% Top circle with text
- \fill[\brick@topcolor]
+ \fill[\brick@topcolor]
(
{\brick@length*(\x-0.5+\value{brickx})},
{\brick@width*(\y-0.5+\value{bricky})},
{\brick@height*(1+\value{brickz})}
- )
- ++(canvas cs:y=\brick@studheight*17.8)
- circle [radius=\brick@radius]
+ )
+ ++(canvas cs:y=\brick@studheight*17.8)
+ circle [radius=\brick@radius]
node[\brick@color,scale=\scalingfactor*0.5, font=\sffamily] {\brick@text};
}
}
-
+
\end{scope}
}
diff --git a/graphics/pgf/contrib/tikzdotncross/README.md b/graphics/pgf/contrib/tikzdotncross/README.md
index 0c4cbfd2de..7df0e4ae9f 100644
--- a/graphics/pgf/contrib/tikzdotncross/README.md
+++ b/graphics/pgf/contrib/tikzdotncross/README.md
@@ -70,7 +70,13 @@ The Current Maintainer of this work is Alceu Frigeri
- documentation in PDF format
-------------
-* Version 1.1 (this)
+* Version 1.2b/1.2c (this)
+ - correcting package dependencies snafu (issue #1).
+
+* Version 1.2
+ - Added some package options, to change pin defaults, see documentation.
+
+* Version 1.1
- Documentation typos and improvement. Code cleanup.
* Version 1.0
diff --git a/graphics/pgf/contrib/tikzdotncross/doc/tikzdotncross.pdf b/graphics/pgf/contrib/tikzdotncross/doc/tikzdotncross.pdf
index c4bb9648fe..fc34d4c561 100644
--- a/graphics/pgf/contrib/tikzdotncross/doc/tikzdotncross.pdf
+++ b/graphics/pgf/contrib/tikzdotncross/doc/tikzdotncross.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikzdotncross/doc/tikzdotncross.tex b/graphics/pgf/contrib/tikzdotncross/doc/tikzdotncross.tex
index 0719876146..0651e47c3b 100644
--- a/graphics/pgf/contrib/tikzdotncross/doc/tikzdotncross.tex
+++ b/graphics/pgf/contrib/tikzdotncross/doc/tikzdotncross.tex
@@ -15,7 +15,7 @@
%%
%% The Current Maintainer of this work is Alceu Frigeri
%%
-%% This is version {1.1} {2024/01/11}
+%% This is version {1.2c} {2025/01/23}
%%
%% The list of files that compose this work can be found in the README.md file at
%% https://ctan.org/pkg/tikzdotncross
@@ -28,7 +28,6 @@
\SetEnumitemKey{miditemsep}{parsep=0ex,itemsep=0.4ex}
\usepackage[american,siunitx,cuteinductors,smartlabels,arrowmos,EFvoltages,betterproportions]{circuitikz}
-\usetikzlibrary{math}
\usepackage{tikzdotncross}
\RequirePackage[hidelinks,hypertexnames=false]{hyperref}
\begin{document}
@@ -47,11 +46,27 @@ This package offers a few alternative ways for declaring and marking coordinates
%\tableofcontents
\section{Introduction}
-One recurring problem when drawing in general is how to interpret a crossing line. There are many conventions, notably, the old school (like the author of this) a jump denotes ``non touching lines'' while a simple cross is a connection, more recently (like the past 25 years), the winning convention has been that a dot marks a connection, whilst a simple cross denotes ``non touching lines''. Many, for the sake of staying in the safe side of the wall are now marking a connection with dots and non touching lines with a jump, which is a bit overkill, but at least there is no margin for error.
+One recurring problem when drawing circuits in general is how to interpret a crossing line. There are many conventions, notably, for the old school (like the author of this) a jump denotes ``non touching lines'' while a simple cross is a connection, more recently (like the past 25 years), the winning convention has been that a dot marks a connection, whilst a simple cross denotes ``non touching lines''. Many, for the sake of staying in the safe side of the wall, mark a connection with dots and non touching lines with a jump, which is a bit overkill, but at least there is no margin for interpretation errors.
And that's it, this package defines some commands to mark/pin a connection, declaring a coordinate and node at the same spot, for later reference, and a command to draw a line jumping over crossing lines of a pre-existent path.
+\section{Package Options}\label{options}
+\begin{describelist}{option}
+ \describe {pinsize} {pin (circle) size (default: 1.2), in pt.}
+ \describe {pinang} {pin angle (default: 45). }
+ \describe {pincolor} {pin color (default: blue).}
+ \describe {pinlength} {pin length (default: 4), in pt.}
+ \describe {coordcolor} {coordinate color (default: red), used if \tsobj{\showcoordstrue}.}
+\end{describelist}
+
+
+Those can also be set, middle code, via:
+\begin{codedescribe}[code,new=2024/10/22]{\setpindefaults}
+\begin{codesyntax}%
+\tsmacro{\setpindefaults}{options as above}
+\end{codesyntax}
+\end{codedescribe}
\section{Declaring and Marking Coordinates/Nodes}\label{coord}
Those are based on some ideas from Redaelli et al. (\tsobj[pkg]{CircuiTikZ}). Main differences: a variable number of parameters (see below) and it always also adds an empty node n\tsobj[marg]{coord}.
@@ -69,13 +84,16 @@ These will affect how \tsobj{\ncoord,\dotcoord,\odotcoord} will behave, with \ts
\tsobj{\pincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord}\tsverb{)}
\tsobj{\pincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color}\tsverb{)}
\tsobj{\pincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color,angle}\tsverb{)}
-\tsobj{\pincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color,angle,distance}\tsverb{)}
+\tsobj{\pincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color,angle,length}\tsverb{)}
\end{codesyntax}
The \tsobj{\ncoord} always expects a single parameter \tsobj[parg]{coord}. A coordinate named \tsobj[marg]{coord} and node named n\tsobj[marg]{coord} (a ``n'' is added as a prefix) will be created for later use/reference. If \tsobj{\showcoordstrue} is en force, it will also add a pin.
-The \tsobj{\pincoord} always draws a pin, besides declaring a coordinate and node as \tsobj{\ncoord}. It expects one to 4 parameters, as listed. If omitted, the default value for distance is 4 (unit: pt), the default value for the angle is -45 (degrees), the default value for color is blue.
-In fact, the \tsobj{\coord(name)} is just a short cut for \tsverb{\pincoord(name,red,45)}, if \tsobj{\showcoordstrue}.
+The \tsobj{\pincoord} always draws a pin, besides declaring a coordinate and node as \tsobj{\ncoord}. It expects one to 4 parameters, as listed. If omitted, the default length is 4 (unit: pt), the default angle is -45 (degrees), the default color is blue.
+Likewise, if \tsobj{\showcoordstrue}, \tsobj{\coord(name)} is just a short cut for \tsverb{\pincoord(name,red,45)}.
\end{codedescribe}
+\begin{tsremark}
+ Those defaults can be changed via package options, see \ref{options}, or \tsobj{\setpindefaults}.
+\end{tsremark}
\begin{codedescribe}{\dotcoord,\dotpincoord}
\begin{codesyntax}%
@@ -83,7 +101,7 @@ In fact, the \tsobj{\coord(name)} is just a short cut for \tsverb{\pincoord(name
\tsobj{\dotpincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord}\tsverb{)}
\tsobj{\dotpincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color}\tsverb{)}
\tsobj{\dotpincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color,angle}\tsverb{)}
-\tsobj{\dotpincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color,angle,distance}\tsverb{)}
+\tsobj{\dotpincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color,angle,length}\tsverb{)}
\end{codesyntax}
These are the same as \tsobj{\ncoord} and friends, just adding a dot (a filled in, small circle) at the coordinate.
\end{codedescribe}
@@ -94,7 +112,7 @@ These are the same as \tsobj{\ncoord} and friends, just adding a dot (a filled i
\tsobj{\odotpincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord}\tsverb{)}
\tsobj{\odotpincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color}\tsverb{)}
\tsobj{\odotpincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color,angle}\tsverb{)}
-\tsobj{\odotpincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color,angle,distance}\tsverb{)}
+\tsobj{\odotpincoord}\tsverb{(}\tsobj[oarg,sep={,}]{coord,color,angle,length}\tsverb{)}
\end{codesyntax}
These are the same as \tsobj{\ncoord} and friends, just adding an open dot (a small circle filled with white) at the coordinate.
\end{codedescribe}
@@ -114,7 +132,7 @@ Then this will ``calculate'' the intersections between the line (defined by the
At each intersection a semi-circle will be drawn, and finally a line will be draw connecting \tsobj[marg]{coordA} to \tsobj[marg]{coordB} over all intermediate nodes.
-The star version flips the semi-circles.
+The star version flips the semi-circles orientation.
\begin{tsremark}
The default \tsobj[oarg]{cross-name} is ``cross''. It may contain only characters, as any valid \TeX\ macro name. The default \tsobj[oarg]{width} of the semi-circle is 7pt.
\end{tsremark}
@@ -126,7 +144,7 @@ The star version flips the semi-circles.
\end{tsremark}
\end{codedescribe}
-\newpage
+%\newpage
\section{Some Examples}
\textbf{\color{red}Note:} In the examples below, the circuit doesn't make much/any sense, it is just a way to show the commands possibilities.
@@ -175,6 +193,8 @@ And the same with \tsobj{\showcoordsfalse}
\newpage
As said, the main limitation (derived from how \tsobj[pkg]{intersections} works) is that crossings between the line and nodes might not be detected at all. For example, if someone tries to connect the nodes \tsobj[key]{D1,D2}, it will, unfortunately, fail detecting the node (pnp transistor) entirely:
+%\showcoordstrue
+%\setpindefaults{coordcolor=cyan,pincolor=red}
\begin{codestore}[crossdemoC]
\resizebox{0.5\textwidth}{!}{
\begin{tikzpicture}
diff --git a/graphics/pgf/contrib/tikzdotncross/latex/tikzdotncross.sty b/graphics/pgf/contrib/tikzdotncross/latex/tikzdotncross.sty
index 2385fb155e..8c2975e6fa 100644
--- a/graphics/pgf/contrib/tikzdotncross/latex/tikzdotncross.sty
+++ b/graphics/pgf/contrib/tikzdotncross/latex/tikzdotncross.sty
@@ -12,7 +12,7 @@
%%
%% The Current Maintainer of this work is Alceu Frigeri
%%
-%% This is version {1.1} {2024/01/11}
+%% This is version {1.2c} {2025/01/23}
%%
%% The list of files that compose this work can be found in the README.md file at
%% https://ctan.org/pkg/tikzdotncross
@@ -26,8 +26,8 @@
\ProvidesExplPackage
{tikzdotncross}
- {2024/01/11}
- {1.1}
+ {2025/01/23}
+ {1.2c}
{Marking coordinates and crossing paths}
%%%%%%%
@@ -40,8 +40,8 @@
{
name .code:n = {tikzdotncross} ,
prefix .code:n = {tikzdotncross} ,
- date .code:n = {2024/01/11},
- version .code:n = {1.1} ,
+ date .code:n = {2025/01/23},
+ version .code:n = {1.2c} ,
description .code:n = {Marking~ coordinates~ and~ crossing~ paths}
}
\cs_if_exist:NF \PkgInfo
@@ -54,10 +54,50 @@
%%% End of cut-n-paste
%%%%%%%
+%%%
+%%% why that here? well, the token list's commands will be used outside expl3 'domain'
+%%%
+\makeatletter
+
+\keys_define:nn { tikzdotncross }
+ {
+ pin size .tl_set:N = \dotncross@@pinsep ,
+ pin size .value_required:n = true ,
+ pin size .initial:n = 1.2 ,
+ pin size .usage:n = general ,
+
+ pin ang .tl_set:N = \dotncross@@pinang ,
+ pin ang .value_required:n = true ,
+ pin ang .initial:n = 45 ,
+ pin ang .usage:n = general ,
+
+ pin color .tl_set:N = \dotncross@@pincolor ,
+ pin color .value_required:n = true ,
+ pin color .initial:n = blue ,
+ pin color .usage:n = general ,
+
+ pin length .tl_set:N = \dotncross@@pindistance ,
+ pin length .value_required:n = true ,
+ pin length .initial:n = 4 ,
+ pin length .usage:n = general ,
+
+ coord color .tl_set:N = \dotncross@@coordcolor ,
+ coord color .value_required:n = true ,
+ coord color .initial:n = red ,
+ coord color .usage:n = general ,
+ }
+
+\ProcessKeyOptions [ tikzdotncross ]
+
+\NewDocumentCommand{\setpindefaults}{m} {
+ \keys_set:nn {tikzdotncross}{#1}
+}
+
\ExplSyntaxOff
-\makeatletter
-\usetikzlibrary{intersections}
+%\makeatletter
+\usetikzlibrary{math,intersections}
+\RequirePackage{etoolbox}
%%
%% There is no easy and clean way
@@ -84,17 +124,16 @@
\pgfextra{\csxdef{#2T}{\CrossTotal}}
\foreach \aux in {1,...,\csuse{#2T}}{(#2-\aux) node[minimum size=#6-\pgflinewidth,inner sep=0pt](n#2-\aux){}};
\tikzmath{%
- coordinate \Ctmp; real \dx , \dy , \d; int \idx;
+ coordinate \Ctmp; real \dtmp; int \idx;
\Ctmp{from} = (#3);
\Ctmp{to} = (#4);
- \dx{tmp} = \Ctmpx{to} - \Ctmpx{from};
- \dy{tmp} = \Ctmpy{to} - \Ctmpy{from};
- \d{ang} = atan2(\dy{tmp},\dx{tmp});
+ \dtmp{x} = \Ctmpx{to} - \Ctmpx{from};
+ \dtmp{y} = \Ctmpy{to} - \Ctmpy{from};
+ \dtmp{ang} = atan2(\dtmp{y},\dtmp{x});
\Ctmp{1st} = (n#2-1);
\Ctmp{last} = (n#2-\csuse{#2T});
\idx{1st} = 1;
\idx{last} = \csuse{#2T};
- \idx{crossing} = 1;
if \Ctmpx{1st} == \Ctmpx{from} then {
if \Ctmpy{1st} == \Ctmpy{from} then {
\idx{1st} = 2;
@@ -109,9 +148,9 @@
\ifnum\idx{last}<\idx{1st}
\draw (#3) -- (#4);
\else
- \draw[line width=1.8\pgflinewidth,white,rotate=\d{ang}]
+ \draw[line width=1.8\pgflinewidth,white,rotate=\dtmp{ang}]
\foreach \aux in {\idx{1st},...,\idx{last}}{(#2-\aux) +(-#6/2,0) arc[start angle=\dotncross@@sign180,end angle=0,radius=#6/2]};
- \draw[rotate=\d{ang},line cap=round]
+ \draw[rotate=\dtmp{ang},line cap=round]
\foreach \aux in {\idx{1st},...,\idx{last}}{(#2-\aux) +(-#6/2,0) arc[start angle=\dotncross@@sign180,end angle=0,radius=#6/2]};
\gdef\dotncross@@tmpA{#3}
@@ -133,14 +172,14 @@
\newcommand\showcoordsfalse{\let\ncoord=\dotncross@@coordnode \let\dotcoord=\dotncross@@dotcoordnode \let\odotcoord=\dotncross@@odotcoordnode}
\newcommand\showcoordstrue{\let\ncoord=\dotncross@@coordpin \let\dotcoord=\dotncross@@dotcoordpin \let\odotcoord=\dotncross@@odotcoordpin}
-\def\dotncross@@coordpin(#1){\pincoord(#1,red,45)}
-\def\dotncross@@coordnode(#1){coordinate(#1) node[minimum size=1.2pt,inner sep=1.2pt](n#1){}}
+\def\dotncross@@coordpin(#1){\pincoord(#1,\dotncross@@coordcolor,\dotncross@@pinang)}
+\def\dotncross@@coordnode(#1){coordinate(#1) node[minimum size=\dotncross@@pinsep pt,inner sep=\dotncross@@pinsep pt](n#1){}}
-\def\dotncross@@dotcoordpin(#1){\dotpincoord(#1,red,45)}
-\def\dotncross@@dotcoordnode(#1){coordinate(#1) node[circle,minimum size=1.2pt,inner sep=1.2pt,fill](n#1){}}
+\def\dotncross@@dotcoordpin(#1){\dotpincoord(#1,\dotncross@@coordcolor,\dotncross@@pinang)}
+\def\dotncross@@dotcoordnode(#1){coordinate(#1) node[circle,minimum size=\dotncross@@pinsep pt,inner sep=\dotncross@@pinsep pt,fill](n#1){}}
-\def\dotncross@@odotcoordpin(#1){\odotpincoord(#1,red,45)}
-\def\dotncross@@odotcoordnode(#1){coordinate(#1) node[circle,minimum size=1.2pt,inner sep=1.2pt,fill=white,draw](n#1){}}
+\def\dotncross@@odotcoordpin(#1){\odotpincoord(#1,\dotncross@@coordcolor,\dotncross@@pinang)}
+\def\dotncross@@odotcoordnode(#1){coordinate(#1) node[circle,minimum size=\dotncross@@pinsep pt,inner sep=\dotncross@@pinsep pt,fill=white,draw](n#1){}}
%%%%
%%
@@ -155,17 +194,17 @@
\def\dotncross@@pincasew#1#2{\dotncross@@pincase#1,,,,\dotncross@@pincaseA\dotncross@@pincaseB\dotncross@@pincaseC\dotncross@@pincaseD;#2:}
\def\dotncross@@pincase#1,#2,#3,#4,#5#6#7#8#9:{#8:#1:#2:#3:#4:#9:}
\def\dotncross@@pincaseA:#1:#2:#3:#4:#5;#6:{\dotncross@@pincoord{#1}{#2}{#3}{#4}{#6}}
-\def\dotncross@@pincaseB:#1:#2:#3:#4:#5;#6:{\dotncross@@pincoord{#1}{#2}{#3}{4}{#6}}
-\def\dotncross@@pincaseC:#1:#2:#3:#4:#5;#6:{\dotncross@@pincoord{#1}{#2}{-45}{4}{#6}}
-\def\dotncross@@pincaseD:#1:#2:#3:#4:#5;#6:{\dotncross@@pincoord{#1}{blue}{-45}{4}{#6}}
+\def\dotncross@@pincaseB:#1:#2:#3:#4:#5;#6:{\dotncross@@pincoord{#1}{#2}{#3}{\dotncross@@pindistance}{#6}}
+\def\dotncross@@pincaseC:#1:#2:#3:#4:#5;#6:{\dotncross@@pincoord{#1}{#2}{-\dotncross@@pinang}{\dotncross@@pindistance}{#6}}
+\def\dotncross@@pincaseD:#1:#2:#3:#4:#5;#6:{\dotncross@@pincoord{#1}{\dotncross@@pincolor}{-\dotncross@@pinang}{\dotncross@@pindistance}{#6}}
\def\pincoord(#1){\dotncross@@pincasew{#1}{}}
\def\dotpincoord(#1){\dotncross@@pincasew{#1}{circle,fill,}}
\def\odotpincoord(#1){\dotncross@@pincasew{#1}{circle,fill=white,draw,}}
\newcommand\dotncross@@pincoord[5]{%
- coordinate(#1) node[#5minimum size=1.2pt,inner sep=1.2pt](n#1){}
- node[circle, #2, inner sep=1.2pt, outer sep=0pt, radius=1pt, fill=#2!20!white, fill opacity=0.2, draw opacity=0.4, draw,
+ coordinate(#1) node[#5minimum size=\dotncross@@pinsep pt,inner sep=\dotncross@@pinsep pt](n#1){}
+ node[circle, #2, inner sep=\dotncross@@pinsep pt, outer sep=0pt, radius=1pt, fill=#2!20!white, fill opacity=0.2, draw opacity=0.4, draw,
pin={[#2, overlay, inner sep=0pt, outer sep=1pt, font=\tiny, pin distance=#4pt,
pin edge={#2, overlay}]#3:#1}]{}%
}
diff --git a/graphics/pgf/contrib/tikzducks/README.md b/graphics/pgf/contrib/tikzducks/README.md
index 8298baafa7..2acf36b78c 100644
--- a/graphics/pgf/contrib/tikzducks/README.md
+++ b/graphics/pgf/contrib/tikzducks/README.md
@@ -2,13 +2,13 @@
# TikZducks
-[![GitHub](https://img.shields.io/github/license/samcarter/tikzducks.svg?color=blue)](http://www.latex-project.org/lppl.txt)
-[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/samcarter/tikzducks.svg?label=current%20version)](https://github.com/samcarter/tikzducks/releases/latest)
-[![CTAN](https://img.shields.io/ctan/v/tikzducks.svg)](https://ctan.org/pkg/tikzducks)
+[![License](https://img.shields.io/github/license/samcarter/tikzducks.svg?color=blue)](https://www.latex-project.org/lppl.txt)
+[![GitHub tag](https://img.shields.io/github/tag/samcarter/tikzducks.svg?label=current%20version&color=blue)](https://github.com/samcarter/tikzducks/releases/latest)
+[![CTAN](https://img.shields.io/ctan/v/tikzducks.svg?color=blue)](https://ctan.org/pkg/tikzducks)
This is a little LaTeX package for ducks to be used in TikZ pictures.
-This project is licensed under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt .
+This project is licensed under the LaTeX Project Public License v1.3c or later, see https://www.latex-project.org/lppl.txt .
The project repository, including a bug tracker, can be found at https://github.com/samcarter/tikzducks .
diff --git a/graphics/pgf/contrib/tikzducks/t-tikzducks.mkiv b/graphics/pgf/contrib/tikzducks/t-tikzducks.mkiv
deleted file mode 100644
index 19af36180b..0000000000
--- a/graphics/pgf/contrib/tikzducks/t-tikzducks.mkiv
+++ /dev/null
@@ -1,62 +0,0 @@
-% !TeX root = ./testing/context_duck.tex
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% The tikzducks package
-% A package to bring rubber ducks into tikz
-% Maintained by samcarter
-%
-% Project repository and bug tracker:
-% https://github.com/samcarter/tikzducks
-%
-% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-% Code for this ConTeXt User Module kindly provided by @JairoAdelRio https://github.com/samcarter/tikzducks/pull/25
-\writestatus{loading}{ConTeXt User Module / TikZDucks 2024/04/27 version v1.8 Draw rubber ducks in TikZ}
-
-\setupcolors[state=start]
-\usemodule[tikz]
-\enabledirectives[colors.pgf]
-\usetikzlibrary[patterns] % for the wizard hat
-\usetikzlibrary[calc]
-\definecolor[duck@overleafcol][x=48AC3C]
-
-\catcode`\@=11
-
-% Defining commands not available in context %%%%%%%%%%%%%%%%%%%%%%%%%
-\define[2]\scalebox{\scale[factor={\ctxlua{context(3*#1)}}]{#2}}
-\let\tiny\tfxx
-\let\pdfrandomseed\randomseed
-
-% Duck %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\duck{\dosingleempty\doduck}
-\def\doduck[#1]{%
- \iffirstargument
- \startscope%
- \tikzset{/duck/.cd,#1}%
- \duck@draw%
- \stopscope%
- \else
- \startscope%
- \tikzset{/duck/.cd}%
- \duck@draw%
- \stopscope%
- \fi%
-}
-
-% Stripes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\stripes{\dosingleempty\dostripes}
-\def\dostripes[#1]{%
- \iffirstargument
- \tikzset{/stripes/.cd,#1}\stripes@draw
- \else
- \tikzset{/stripes/.cd}\stripes@draw
- \fi
-}
-
-\input tikzducks-generic.tex
-
-\catcode`\@=12
-\endinput
diff --git a/graphics/pgf/contrib/tikzducks/tikzducks-doc-settings.sty b/graphics/pgf/contrib/tikzducks/tikzducks-doc-settings.sty
index 777cedba6e..5cb08d5d21 100644
--- a/graphics/pgf/contrib/tikzducks/tikzducks-doc-settings.sty
+++ b/graphics/pgf/contrib/tikzducks/tikzducks-doc-settings.sty
@@ -21,7 +21,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{xcolor}
\definecolor{samyellow}{RGB}{246,193,65}
-\definecolor{samorange}{RGB}{241,147,45}
+\definecolor{samorange}{RGB}{241,147,45}% pgfplotsthemebeamer
\definecolor{samred}{RGB}{191,26,46}% TikZbricks
\definecolor{sammagenta}{RGB}{170,42,104}% TikZmarmots
\definecolor{samviolet}{RGB}{136,46,114}% TikZlings
@@ -61,6 +61,7 @@
\RequirePackage{footnotehyper}
\makesavenoteenv{tcolorbox}
\RequirePackage[all]{nowidow}
+ \RequirePackage[hyphens]{url}
\RequirePackage[colorlinks=true,breaklinks=true,allcolors=themecolor,hyperfootnotes=false]{hyperref}
}
\RequirePackage[T1]{fontenc}
@@ -68,67 +69,28 @@
\RequirePackage{inconsolata}% mono font with bold, but italic is missing
% \RequirePackage[scale=0.85]{cascadia-code}
% \AddToHook{cmd/ttfamily/before}{\fontseries{sl}}
-\RequirePackage{iexec}
+\RequirePackage{synthslant}% to fake slanted comments in inconsolata
+\RequirePackage{metalogox}% should be loaded after the fonts
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Listings
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\RequirePackage[
- cachedir=$TMPDIR/minted/
-]{minted}
-
-% smuggling custom pygmentize style in cache folder
-% (a real pygmentise style would need installtion in some python folder)
-\begin{filecontents*}[noheader]{./sam.pygstyle}
-\makeatletter
-\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax%
- \let\PYG@ul=\relax \let\PYG@tc=\relax%
- \let\PYG@bc=\relax \let\PYG@ff=\relax}
-\def\PYG@tok#1{\csname PYG@tok@#1\endcsname}
-\def\PYG@toks#1+{\ifx\relax#1\empty\else%
- \PYG@tok{#1}\expandafter\PYG@toks\fi}
-\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{%
- \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}}
-\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}}
-
-% optional arguments
-\expandafter\def\csname PYG@tok@na\endcsname{\def\PYG@tc##1{\textcolor{black}{##1}}}
-
-% macros
-\expandafter\def\csname PYG@tok@k\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
-% curly brakets
-\expandafter\def\csname PYG@tok@nb\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
-
-% comments (italics won't work with the inconsolata font)
-\expandafter\def\csname PYG@tok@c\endcsname{\def\PYG@tc##1{\textcolor{gray}{##1}}}
-
-\def\PYGZbs{\char`\\}
-\def\PYGZus{\char`\_}
-\def\PYGZob{\char`\{}
-\def\PYGZcb{\char`\}}
-\def\PYGZca{\char`\^}
-\def\PYGZam{\char`\&}
-\def\PYGZlt{\char`\<}
-\def\PYGZgt{\char`\>}
-\def\PYGZsh{\char`\#}
-\def\PYGZpc{\char`\%}
-\def\PYGZdl{\char`\$}
-\def\PYGZhy{\char`\-}
-\def\PYGZsq{\char`\'}
-\def\PYGZdq{\char`\"}
-\def\PYGZti{\char`\~}
-% for compatibility with earlier versions
-\def\PYGZat{@}
-\def\PYGZlb{[}
-\def\PYGZrb{]}
-\makeatother
-\end{filecontents*}
-
-\iexec{mkdir -p $TMPDIR/minted && mv sam.pygstyle $TMPDIR/minted/.}
+\RequirePackage[cachedir=./.minted]{minted}
+
+\AddToHook{env/MintedVerbatim/before}{%
+ % optional arguments
+ \@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor{black}{##1}}}%
+ % macros
+ \@namedef{PYG@tok@k}{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}%
+ % curly brackets
+ \@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}%
+ % comments (italics won't work with the inconsolata font)
+ \@namedef{PYG@tok@c}{\def\PYG@tc##1{\textcolor{gray}{\textsynthslant{##1}}}}%
+}
-\usemintedstyle{sam}
+\usemintedstyle{default}
\setminted{
breaksymbolleft={},
tabsize=2,
@@ -196,4 +158,21 @@
\providecommand*{\tikzducks}{Ti\emph{k}Zducks\xspace}
\providecommand*{\tikzlings}{Ti\emph{k}Zlings\xspace}
\providecommand*{\tikzmarmots}{Ti\emph{k}Zmarmots\xspace}
-\providecommand*{\ConTeXt}{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt} \ No newline at end of file
+\providecommand*{\ConTeXt}{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Doc blurb
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\packagename}[1]{\def\@packagename{#1}}
+
+\NewDocumentCommand\blurb{s}{%
+ This package is work in progress, therefore I would be happy to hear your feedback and ideas how to improve the package. The development version of the source code can be found at \url{https://github.com/samcarter/\@packagename}, including an issue tracker.
+ \IfBooleanF#1{%
+ A more stable version of the package can be found on \CTAN (\url{https://ctan.org/pkg/\@packagename}) and is included in both \texlive and \miktex as \texttt{\@packagename}.
+ }%
+ If you seek any other assistance (not bug reports/feature requests), I suggest asking at \url{https://topanswers.xyz/tex}.
+
+ Copyright {\footnotesize\textcopyright} \texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the LaTeX project public licence, version 1.3c or later \url{https://www.latex-project.org/lppl.txt}.
+} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzducks/tikzducks-doc.pdf b/graphics/pgf/contrib/tikzducks/tikzducks-doc.pdf
index 7cc5d36576..5f376543d3 100644
--- a/graphics/pgf/contrib/tikzducks/tikzducks-doc.pdf
+++ b/graphics/pgf/contrib/tikzducks/tikzducks-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikzducks/tikzducks-doc.tex b/graphics/pgf/contrib/tikzducks/tikzducks-doc.tex
index 5cc8af0781..becc316cd5 100644
--- a/graphics/pgf/contrib/tikzducks/tikzducks-doc.tex
+++ b/graphics/pgf/contrib/tikzducks/tikzducks-doc.tex
@@ -8,20 +8,16 @@
% https://github.com/samcarter/tikzducks
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% !TeX program = txs:///arara
-% arara: latexmk: {
-% arara: --> engine: pdflatex,
-% arara: --> options: [
-% arara: --> '-shell-escape',
-% arara: --> '-synctex=1',
-% arara: --> '-interaction=nonstopmode',
-% arara: --> ]
-% arara: --> }
+% arara: latexmk
\documentclass{scrartcl}
+\usepackage[
+ themecolor=samlblue
+]{\jobname-settings}
+
% meta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title{The \texorpdfstring{\tikzducks}{tikzducks} package}
\subtitle{using ducks in \TikZ}
@@ -32,13 +28,10 @@
\end{tikzpicture}\\[0.8em]
\texttt{samcarter}\\
\url{https://github.com/samcarter/tikzducks}\\
- \url{https://www.ctan.org/pkg/tikzducks}
+ \url{https://ctan.org/pkg/tikzducks}
}{samcarter}}
-\date{Version v1.8 \textendash{} 2024/04/27}
-
-\usepackage[
- themecolor=samlblue
-]{\jobname-settings}
+\date{Version v2.0 \textendash{} 2025/01/31}
+\packagename{tikzducks}
\colorlet{blue}{samlblue}
\colorlet{red}{samred}
@@ -51,13 +44,12 @@
% customisation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pgfmathsetseed{2}
-\setlength{\footheight}{41pt}
+\setlength{\footheight}{45pt}
\newlength{\duckoffset}
\cfoot{%
- \shuffleducks
\begin{tikzpicture}[scale=0.5]
- \duck[signpost=\scalebox{0.6}{\thepage},\randomhead]
+ \duck[signpost=\scalebox{0.6}{\thepage},randomhead]
\end{tikzpicture}
}
\pagestyle{scrheadings}
@@ -72,48 +64,13 @@
Rubber ducks can be made of latex, but can they also be made with \LaTeX? Yes! The \tikzducks package is a \LaTeX{} package for rubber ducks to be used in \TikZ pictures.
This project is a continuation of \href{https://tex.stackexchange.com/a/347458/36296}{How can we draw a duck?}.
-This package is work in progress (and will probably never be really finished as there is an infinite amount of things which could be added), therefore I would be happy to hear your feedback and ideas how to improve the package.
-The head version of the source code can be found on \url{https://github.com/samcarter/tikzducks}, including a bug tracker -- please make constructive use of it! A more stable package version can be found on \CTAN (\url{https://www.ctan.org/pkg/tikzducks}) and is included in both \miktex and \texlive as \tikzducks. If you seek any other assistance (not bug reports/feature requests), I suggest asking a question at \url{https://topanswers.xyz/tex}.
-
-\subsection{Acknowledgements}
-
-Without the friendly and helpful community of \TeX{} users this package would not exist. I would like to thank a few fellow users in particular:
-
-First of all
-%
-Carla Maggi for pointing out the overwhelming need of having a \tikzducks package and valuable contribution to the package code, in particular the \hyperref[sec:footballducks]{football ducks},
-%
-Paulo Cereda for his contagious enthusiasm for ducks (\emph{Quack!}) and
-%
-Ulrike Fischer for her useful \TikZ advices and contributions to the package and coming to rescue for keyword highlighting in the package documentation.
-
-Many other users contributed to this package (in random order):
-%
-Enrico Gregorio helped to implement the \saminline|\tikzset{}| interface which makes it much easier to adjust the properties of the ducks to fit the user needs,
-%
-Andrew Stacey contributed the \TikZ Library ``ducks'',
-%
-Symbol~1 solved a few problems with default key values,
-%
-Mihikma created the duck's beard,
-%
-Yudai Nakata helped with problems of \saminline|\pdfrandomseed|,
-%
-@marmot for his seemingly infinite knowledge of \TikZ which he shared with the world,
-%
-@JairoAdelRio for contributing the \ConTeXt{} User Module
-%
-and last but not least my thanks go to Martin Schr\"oder for his feedback to the code review.
-
-The ducks mostly consist of basic geometric shapes drawn in \TikZ. Some of the more complex shapes (e.g.\ the different hair styles) are first drawn in \texttt{inkscape} (\url{https://inkscape.org}) and then exported to \TikZ paths using the \texttt{svg2tikz} extension (\url{https://github.com/xyz2tex/svg2tikz}).
+Without the friendly and helpful community of \TeX{} users this package would not exist. A big thanks to all the users and contributors of this package!
-\subsection{License}
-
-Copyright \raisebox{0.2em}{\tiny\fontfamily{cmr}\selectfont\textcopyright}
-\texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the LaTeX project public licence, version 1.3c or later \url{http://www.latex-project.org/lppl.txt}.
+\blurb
The shown example ducks are purely fictional characters, any resemblance to real ducks or persons is purely coincidental and no copyright infringement is intended.
+\clearpage
\section{Usage}
The basic usage is fairly simple, to draw a duck:
@@ -189,7 +146,7 @@ For everybody suffering from anatidaephobia, there is also a special option to n
This can also be useful to recycle some of the accessories presented in \ref{sec:accessories}.
-For the \TeX{} purists, there is also a picture mode variant:
+For the purists, there is also a picture mode variant:
{
\setlength{\unitlength}{0.6mm}
\begin{tcblisting}{title={\texttt{picture} mode duck}}
@@ -199,46 +156,6 @@ For the \TeX{} purists, there is also a picture mode variant:
\end{tcblisting}
}
-And thanks to @JairoAdelRio there is even a \ConTeXt{} User Module available. Some of the colours might look different and not being a \ConTeXt{} user myself, I can't guarantee maintenance of this module.
-
-\begin{tcolorbox}[title={\ConTeXt{} User Module}]
-\begin{samcode}
-\usemodule[tikzducks]
-\usecolors[xwi]
-\starttext
-
-\starttikzpicture
- \duck[tophat,bowtie]
-\stoptikzpicture
-
-\stoptext
-\end{samcode}
-
-\tcblower
-\begin{tikzpicture}
- \duck[tophat,bowtie]
-\end{tikzpicture}
-\end{tcolorbox}
-
-For those who prefer to work with pdf\TeX:
-
-\begin{tcolorbox}[title={pdfTeX}]
-\begin{samcode}
-\input tikzducks-plain.tex
-
-\tikzpicture
- \duck[bobblehat,cheese]
-\endtikzpicture
-
-\bye
-\end{samcode}
-
-\tcblower
-\begin{tikzpicture}
- \duck[bobblehat,cheese]
-\end{tikzpicture}
-\end{tcolorbox}
-
\subsection{Body parts}
The various parts of the duck can also be coloured independently, i.e.\ \saminline|body|, \saminline|head| or \saminline|bill|:
@@ -588,6 +505,17 @@ There is a multitude of things a duck might need. The following examples all als
\end{tikzpicture}
\end{tcblisting}
+\begin{tcblisting}{title={Sombrero Duck\footnote{The sombrero was kindly contributed by Carla Maggi}}}
+\begin{tikzpicture}
+ \duck[
+ sombrero=orange!70!yellow,
+ sombreroa=green!70!blue,
+ sombrerob=red,
+ sombreroc=blue
+ ]
+\end{tikzpicture}
+\end{tcblisting}
+
\begin{tcblisting}{title={Glasses duck}}
\begin{tikzpicture}
\duck[glasses=red!50!black]
@@ -889,6 +817,12 @@ There is a multitude of things a duck might need. The following examples all als
\end{tikzpicture}
\end{tcblisting}
+\begin{tcblisting}{title={Megaphone Duck}}
+\begin{tikzpicture}
+ \duck[megaphone=lightgray]
+\end{tikzpicture}
+\end{tcblisting}
+
\section{Random ducks}
With all these available accessories it might be hard to decide which one to choose, but don't worry the \tikzducks provide a solution for this dilemma, the random duck, or short \saminline|\randuck|, which automatically creates a duck with a randomly chosen accessories and something on top of the head (hair, a hat, ears, alien antenna ...)
@@ -899,12 +833,11 @@ With all these available accessories it might be hard to decide which one to cho
\end{tikzpicture}
\end{tcblisting}
-In case the duck should not be completely random, but only some of the random elements are desired, these can be accessed independently by using \saminline|\randomhead| and \saminline|\randomaccessories| for a random headpiece and a random accessories, respectively. Small caveat: Before using \saminline|\randomhead| or \saminline|\randomaccessories|, \saminline|\shuffleducks| has to be used to provide the random items (for \saminline|\randuck| this is done automatically).
+In case the duck should not be completely random, but only some of the random elements are desired, these can be accessed independently by using the \saminline|randomhead| and \saminline|randomaccessories| options for a random headpiece and a random accessories, respectively.
\begin{tcblisting}{title={Random head gear and accessories}}
\begin{tikzpicture}
- \shuffleducks
- \duck[\randomhead, \randomaccessories]
+ \duck[randomhead, randomaccessories]
\end{tikzpicture}
\end{tcblisting}
@@ -932,7 +865,8 @@ For convenience the more complex paths of this package are stored in macros, whi
\begin{tikzpicture}
\duck
\path[preaction={fill, red!50!black},
- pattern=fivepointed stars,
+ pattern={Stars[distance=1.7mm,
+ radius=0.5mm,angle=32]},
pattern color=yellow]
\duckpathlonghair;
\end{tikzpicture}
@@ -982,12 +916,17 @@ To distinguish coordinates from multiple ducks in the same \saminline|tikzpictur
Sometimes it might desirable to add things at a specific z-position, for example re-draw a t-shirt with some pattern that should be below the duck's hair and accessories. To facilitate this the \tikzducks provide a couple of hooks:
-\begin{samcode}
-\duckhookbackground, \duckhookbody, \duckhookclothing, \duckhookhair, \duckhookhat, \duckhookforeground
-\end{samcode}
+\begin{itemize}
+\item \saminline|\NewHook{tikzducks/background}|
+\item \saminline|\NewHook{tikzducks/body}|
+\item \saminline|\NewHook{tikzducks/clothing}|
+\item \saminline|\NewHook{tikzducks/hair}|
+\item \saminline|\NewHook{tikzducks/hat}|
+\item \saminline|\NewHook{tikzducks/foreground}|
+\end{itemize}
\begin{center}
-\texttt{\textbackslash duckhook}\dots
+\saminline|\NewHook{tikzducks/...}|
\begin{tikzpicture}[scale=1.59]
\newcommand{\planes}{\fill[gray!20!white,opacity=0.9] (-0.1,-0.1) rectangle (2.4,2.4);}
@@ -1039,21 +978,26 @@ Sometimes it might desirable to add things at a specific z-position, for example
\end{tikzpicture}
\end{center}
-These hooks can be defined by the user as needed:
+These hooks can be utilised by the user as needed:
\begin{tcblisting}{title={Hooks}}
\begin{tikzpicture}
- \begingroup
- \newcommand{\duckhookclothing}{
- \path[pattern=fivepointed stars,
- pattern color=yellow]
- \duckpathjacket;
- }
- \duck[witch=black!50!gray,
- longhair=red!80!black,
- jacket=black!50!gray,
- magicwand]
- \endgroup
+
+ \AddToHook{tikzducks/clothing}{
+ \path[pattern={Stars[distance=1.7mm,
+ radius=0.5mm,angle=32]},
+ pattern color=yellow]
+ \duckpathjacket;
+ }
+
+ \duck[witch=black!50!gray,
+ longhair=red!80!black,
+ jacket=black!50!gray,
+ magicwand]
+
+ % optionally
+ \RemoveFromHook{tikzducks/clothing}
+
\end{tikzpicture}
\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzducks/tikzducks-generic.tex b/graphics/pgf/contrib/tikzducks/tikzducks-generic.tex
deleted file mode 100644
index 25acd13301..0000000000
--- a/graphics/pgf/contrib/tikzducks/tikzducks-generic.tex
+++ /dev/null
@@ -1,1843 +0,0 @@
-% !TeX root = ./testing/test.tex
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% The tikzducks package
-% A package to bring rubber ducks into tikz
-% Maintained by samcarter
-%
-% Project repository and bug tracker:
-% https://github.com/samcarter/tikzducks
-%
-% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\newif\ifduck@name
-\newif\ifduck@invisible
-% Environment %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifduck@water
-% body parts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifduck@grumpy
-\newif\ifduck@laughing
-\newif\ifduck@parrot
-% hair styles %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifduck@shorthair
-\newif\ifduck@longhair
-\newif\ifduck@crazyhair
-\newif\ifduck@recedinghair
-\newif\ifduck@eyebrow
-\newif\ifduck@beard
-\newif\ifduck@mohican
-\newif\ifduck@mullet
-\newif\ifduck@parting
-% clothing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifduck@clothing
-\newif\ifduck@tshirt
-\newif\ifduck@jacket
-\newif\ifduck@tie
-\newif\ifduck@cape
-\newif\ifduck@stripes
-\newif\ifduck@bowtie
-\newif\ifduck@lapel
-\newif\ifduck@aodai
-\newif\ifduck@scarf
-% Headgear %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifduck@alien
-\newif\ifduck@hat
-\newif\ifduck@cap
-\newif\ifduck@santa
-\newif\ifduck@unicorn
-\newif\ifduck@magichat
-\newif\ifduck@chef
-\newif\ifduck@witch
-\newif\ifduck@graduate
-\newif\ifduck@beret
-\newif\ifduck@crown
-\newif\ifduck@queencrown
-\newif\ifduck@kingcrown
-\newif\ifduck@peakedcap
-\newif\ifduck@bunny
-\newif\ifduck@tophat
-\newif\ifduck@darthvader
-\newif\ifduck@harlequin
-\newif\ifduck@strawhat
-\newif\ifduck@helmet
-\newif\ifduck@viking
-\newif\ifduck@devil
-\newif\ifduck@conicalhat
-\newif\ifduck@sailor
-\newif\ifduck@bobblehat
-% Accessories %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifduck@glasses
-\newif\ifduck@sunglasses
-\newif\ifduck@squareglasses
-\newif\ifduck@icecream
-\newif\ifduck@book
-\newif\ifduck@magicwand
-\newif\ifduck@cricket
-\newif\ifduck@rollingpin
-\newif\ifduck@signpost
-\newif\ifduck@lightsaber
-\newif\ifduck@cake
-\newif\ifduck@pizza
-\newif\ifduck@hockey
-\newif\ifduck@baguette
-\newif\ifduck@football
-\newif\ifduck@mask
-\newif\ifduck@necklace
-\newif\ifduck@milkshake
-\newif\ifduck@wine
-\newif\ifduck@prison
-\newif\ifduck@speech
-\newif\ifduck@think
-\newif\ifduck@torch
-\newif\ifduck@easter
-\newif\ifduck@basket
-\newif\ifduck@buttons
-\newif\ifduck@sheep
-\newif\ifduck@horsetail
-\newif\ifduck@crozier
-\newif\ifduck@davidlikespineapplepizza
-\newif\ifduck@wing
-\newif\ifduck@stethoscope
-\newif\ifduck@neckerchief
-\newif\ifduck@snowduck
-\newif\ifduck@vampire
-\newif\ifduck@crystalball
-\newif\ifduck@cheese
-\newif\ifduck@shovel
-\newif\ifduck@pickaxe
-\newif\ifduck@strawbroom
-\newif\ifduck@broom
-\newif\ifduck@umbrella
-\newif\ifduck@umbrellaclosed
-\newif\ifduck@handbag
-\newif\ifduck@cocktail
-\newif\ifduck@overleaf
-\newif\ifduck@banana
-\newif\ifduck@stick
-
-\tikzset{
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Pass unknown keys on to tikz
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- /duck/.search also={/tikz,/pgf},
- /duck/.cd,
- name/.code= \duck@nametrue \def\duck@name{#1},
- invisible/.code = \duck@invisibletrue,
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Environment
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- water/.code = \duck@watertrue
- \def\duck@water{#1},
- water/.default = blue,
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % body parts
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- body/.code = \def\duck@body{#1},
- body = yellow!70!brown,
- head/.code = \def\duck@head{#1},
- eye/.code = \def\duck@eye{#1},
- eye = white!85!yellow,
- pupil/.code = \def\duck@pupil{#1},
- pupil = black,
- bill/.code = \def\duck@bill{#1},
- bill = orange!50!brown,
- grumpy/.code = \duck@grumpytrue,
- laughing/.code = \duck@laughingtrue,
- parrot/.code = \duck@parrottrue,
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % clothing
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- tshirt/.code = \duck@tshirttrue
- \duck@clothingtrue
- \def\duck@tshirt{#1},
- tshirt/.default = white,
- jacket/.code = \duck@jackettrue
- \duck@clothingtrue
- \def\duck@jacket{#1},
- jacket/.default = blue,
- tie/.code = \duck@tietrue
- \def\duck@tie{#1},
- tie/.default = blue,
- cape/.code = \duck@capetrue
- \duck@clothingtrue
- \def\duck@cape{#1},
- cape/.default = red,
- stripes/.code = \duck@stripestrue
- \duck@clothingtrue
- \def\duck@stripes{#1},
- stripes/.default = \stripes ,
- bowtie/.code = \duck@bowtietrue
- \def\duck@bowtie{#1},
- bow tie/.forward to = /duck/bowtie,
- bowtie/.default = black,
- lapel/.code = \duck@lapeltrue
- \def\duck@lapel{#1},
- lapel/.default = black,
- aodai/.code = \duck@aodaitrue
- \duck@clothingtrue
- \def\duck@aodai{#1},
- ao dai/.forward to = /duck/aodai,
- aodai/.default = blue!50!black,
- scarf/.code = \duck@scarftrue
- \def\duck@scarf{#1},
- scarf/.default = red!70!black,
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % hair styles
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- shorthair/.code = \duck@shorthairtrue
- \def\duck@hair{#1},
- short hair/.forward to = /duck/shorthair,
- shorthair/.default = brown,
- longhair/.code = \duck@longhairtrue
- \def\duck@hair{#1},
- long hair/.forward to = /duck/longhair,
- longhair/.default = brown,
- crazyhair/.code = \duck@crazyhairtrue
- \def\duck@hair{#1},
- crazy hair/.forward to = /duck/crazyhair,
- crazyhair/.default = brown,
- recedinghair/.code = \duck@recedinghairtrue
- \def\duck@hair{#1},
- receding hair/.forward to = /duck/recedinghair,
- recedinghair/.default = brown,
- eyebrow/.code = \duck@eyebrowtrue
- \def\duck@eyebrow{#1},
- eyebrow/.default = brown,
- beard/.code = \duck@beardtrue
- \def\duck@beard{#1},
- beard/.default = brown,
- mohican/.code = \duck@mohicantrue
- \def\duck@hair{#1},
- mohican/.default = brown,
- mullet/.code = \duck@mullettrue
- \def\duck@hair{#1},
- mullet/.default = brown,
- parting/.code = \duck@partingtrue
- \def\duck@hair{#1},
- parting/.default = brown,
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Headgear
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- alien/.code = \duck@alientrue
- \def\duck@alien{#1},
- alien/.default = green,
- hat/.code = \duck@hattrue
- \def\duck@hat{#1},
- hat/.default = brown,
- cap/.code = \duck@captrue
- \def\duck@cap{#1},
- cap/.default = blue,
- santa/.code = \duck@santatrue
- \def\duck@santa{#1},
- santa/.default = red!80!black,
- chef/.code = \duck@cheftrue
- \def\duck@chef{#1},
- chef/.default = gray!20!white,
- graduate/.code = \duck@graduatetrue
- \def\duck@graduate{#1},
- graduate/.default = black,
- tassel/.code = \def\duck@tassel{#1},
- tassel = red,
- beret/.code = \duck@berettrue
- \def\duck@beret{#1},
- beret/.default = black,
- unicorn/.code = \duck@unicorntrue
- \def\duck@unicorn{#1},
- unicorn/.default = pink,
- magichat/.code = \duck@magichattrue
- \def\duck@magichat{#1},
- magic hat/.forward to = /duck/magichat,
- magichat/.default = violet,
- magicstars/.code = \def\duck@magicstars{#1},
- magic stars/.forward to = /duck/magicstars,
- magicstars = yellow!80!brown,
- witch/.code = \duck@witchtrue
- \def\duck@witch{#1},
- witch/.default = black,
- crown/.code = \duck@crowntrue
- \def\duck@crown{#1},
- crown/.default = yellow,
- queencrown/.code = \duck@queencrowntrue
- \def\duck@queencrown{#1},
- queen crown/.forward to = /duck/queencrown,
- queencrown/.default = yellow,
- kingcrown/.code = \duck@kingcrowntrue
- \def\duck@kingcrown{#1},
- king crown/.forward to = /duck/kingcrown,
- kingcrown/.default = gray,
- bunny/.code = \duck@bunnytrue
- \def\duck@bunny{#1},
- bunny/.default = \duck@body,
- inear/.code = \def\duck@inear{#1},
- in ear/.forward to = /duck/inear,
- inear = \duck@bunny!50!white,
- peakedcap/.code = \duck@peakedcaptrue
- \def\duck@peakedcap{#1},
- peaked cap/.forward to = /duck/peakedcap,
- peakedcap/.default = blue,
- tophat/.code = \duck@tophattrue
- \def\duck@tophat{#1},
- top hat/.forward to = /duck/tophat,
- tophat/.default = black,
- darthvader/.code = \duck@darthvadertrue
- \def\duck@darthvader{#1},
- darth vader/.forward to = /duck/darthvader,
- darthvader/.default = black,
- harlequin/.code = \duck@harlequintrue
- \def\duck@harlequin{#1},
- harlequin/.default = blue,
- niuqelrah/.code = \def\duck@niuqelrah{#1},
- niuqelrah = red,
- strawhat/.code = \duck@strawhattrue
- \def\duck@strawhat{#1},
- straw hat/.forward to = /duck/strawhat,
- strawhat/.default = gray!30!white,
- ribbon/.code = \def\duck@ribbon{#1},
- ribbon = black,
- helmet/.code = \duck@helmettrue
- \def\duck@helmet{#1},
- helmet/.default = gray,
- devil/.code = \duck@deviltrue
- \def\duck@devil{#1},
- devil/.default = red,
- viking/.code = \duck@vikingtrue
- \def\duck@viking{#1}
- \duck@deviltrue
- \def\duck@devil{brown!20!white},
- viking/.default = gray,
- conicalhat/.code = \duck@conicalhattrue
- \def\duck@conicalhat{#1},
- conical hat/.forward to = /duck/conicalhat,
- conicalhat/.default = brown!90!orange!90!white,
- sailor/.code = \duck@sailortrue
- \def\duck@sailor{#1},
- sailor/.default = white!80!gray,
- bobblehat/.code = \duck@bobblehattrue
- \def\duck@bobblehat{#1},
- bobble hat/.forward to = /duck/bobblehat,
- bobblehat/.default = red!70!black,
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Accessories
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- glasses/.code = \duck@glassestrue
- \def\duck@glasses{#1},
- glasses/.default = black,
- sunglasses/.code = \duck@sunglassestrue
- \def\duck@sunglasses{#1},
- sunglasses/.default = black,
- squareglasses/.code = \duck@squareglassestrue
- \def\duck@squareglasses{#1},
- square glasses/.forward to = /duck/squareglasses,
- squareglasses/.default = black,
- icecream/.code = \duck@icecreamtrue
- \def\duck@cone{#1},
- ice cream/.forward to = /duck/icecream,
- icecream/.default = brown!60!gray,
- flavoura/.code = \def\duck@flavoura{#1},
- flavour a/.forward to = /duck/flavoura,
- flavoura = brown!50!black,
- flavourb/.code = \def\duck@flavourb{#1},
- flavour b/.forward to = /duck/flavourb,
- flavourb = white!70!brown,
- flavourc/.code = \def\duck@flavourc{#1},
- flavour c/.forward to = /duck/flavourc,
- flavourc = red!50!white,
- book/.code = \duck@booktrue
- \def\duck@book{#1},
- bookcolour/.code = \def\duck@bookcolour{#1},
- book colour/.forward to = /duck/bookcolour,
- book color/.forward to = /duck/bookcolour,
- bookcolor/.forward to = /duck/bookcolour,
- bookcolour = brown,
- signpost/.code = \duck@signposttrue
- \def\duck@signpost{#1},
- sign post/.forward to = /duck/signpost,
- signcolour/.code = \def\duck@signcolour{#1},
- sign colour/.forward to = /duck/signcolour,
- sign color/.forward to = /duck/signcolour,
- signcolor/.forward to = /duck/signcolour,
- signcolour = brown!50!black,
- signback/.code = \def\duck@signback{#1},
- sign back/.forward to = /duck/signback,
- signback = green!40!black,
- magicwand/.code = \duck@magicwandtrue,
- magic want/.forward to = /duck/magicwand,
- cricket/.code = \duck@crickettrue
- \def\duck@cricket{#1},
- cricket/.default = brown,
- rollingpin/.code = \duck@rollingpintrue
- \def\duck@rollingpin{#1},
- rolling pin/.forward to = /duck/rollingpin,
- rollingpin/.default = brown,
- lightsaber/.code = \duck@lightsabertrue
- \def\duck@lightsaber{#1},
- light saber/.forward to = /duck/lightsaber,
- lightsaber/.default = green,
- cake/.code = \duck@caketrue
- \def\duck@cake{#1},
- cake/.default = violet,
- pizza/.code = \duck@pizzatrue,
- hockey/.code = \duck@hockeytrue
- \def\duck@hockey{#1},
- hockey/.default = brown,
- baguette/.code = \duck@baguettetrue
- \def\duck@baguette{#1},
- baguette/.default = brown,
- football/.code = \duck@footballtrue
- \def\duck@football{#1},
- football/.default = white,
- mask/.code = \duck@masktrue
- \def\duck@mask{#1},
- mask/.default = black,
- necklace/.code = \duck@necklacetrue
- \def\duck@necklace{#1},
- necklace/.default = white!80!gray,
- milkshake/.code = \duck@milkshaketrue
- \def\duck@milkshake{#1},
- milkshake/.default = red!20!white,
- wine/.code = \duck@winetrue
- \def\duck@wine{#1},
- wine/.default = red!70!black,
- prison/.code = \duck@prisontrue
- \def\duck@prison{#1},
- prison/.default = gray,
- speech/.code = \duck@speechtrue
- \def\duck@speech{#1},
- think/.code = \duck@thinktrue
- \def\duck@think{#1},
- bubblecolour/.code = \def\duck@bubblecolour{#1},
- bubble colour/.forward to = /duck/bubblecolour,
- bubble color/.forward to = /duck/bubblecolour,
- bubblecolor/.forward to = /duck/bubblecolour,
- bubblecolour = gray!30!white,
- torch/.code = \duck@torchtrue
- \def\duck@torch{#1},
- torch/.default = gray,
- basket/.code = \duck@baskettrue
- \def\duck@basket{#1},
- basket/.default = brown!70!gray,
- easter/.code = \duck@eastertrue
- \duck@baskettrue
- \def\duck@basket{#1},
- easter/.default = brown!70!gray,
- egga/.code = \def\duck@egga{#1},
- egg a/.forward to = /duck/egga,
- egga = blue,
- eggb/.code = \def\duck@eggb{#1},
- egg b/.forward to = /duck/eggb,
- eggb = green,
- eggc/.code = \def\duck@eggc{#1},
- egg c/.forward to = /duck/eggc,
- eggc = red,
- buttons/.code = \duck@buttonstrue
- \def\duck@buttons{#1},
- buttons/.default = black,
- sheep/.code = \duck@sheeptrue
- \def\duck@sheep{#1},
- sheep/.default = \duck@body,
- horsetail/.code = \duck@horsetailtrue
- \def\duck@horsetail{#1},
- horsetail/.default = brown,
- crozier/.code = \duck@croziertrue
- \def\duck@crozier{#1},
- crozier/.default = brown,
- davidlikespineapplepizza/.code = \duck@davidlikespineapplepizzatrue
- \duck@speechtrue
- \def\duck@speech{\scalebox{\scalingfactor}{\scalebox{0.9}{\tiny ih, che schifo!}}},
- david likes pineapple pizza/.forward to = /duck/davidlikespineapplepizza,
- wing/.code = \duck@wingtrue
- \def\duck@wing{#1},
- wing/.default = yellow!50!brown,
- stethoscope/.code = \duck@stethoscopetrue
- \def\duck@stethoscope{#1},
- stethoscope/.default = gray,
- neckerchief/.code = \duck@neckerchieftrue
- \def\duck@neckerchief{#1},
- neckerchief/.default = brown,
- woggle/.code = \def\duck@woggle{#1},
- woggle = brown!50!black,
- snowduck/.code = \duck@snowducktrue
- \def\duck@snowduck{#1}
- \def\duck@eye{#1}
- \def\duck@body{#1}
- \duck@tophattrue
- \def\duck@tophat{black}
- \duck@buttonstrue
- \def\duck@buttons{black},
- snow duck/.forward to = /duck/snowduck,
- snowduck/.default = gray!15!white,
- vampire/.code = \duck@vampiretrue
- \def\duck@vampire{#1},
- vampire/.default = white!85!yellow,
- crystalball/.code = \duck@crystalballtrue
- \def\duck@crystalball{#1},
- crystal ball/.forward to = /duck/crystalball,
- crystalball/.default = cyan,
- cheese/.code = \duck@cheesetrue
- \def\duck@cheese{#1},
- cheese/.default = orange,
- shovel/.code = \duck@shoveltrue
- \def\duck@shovel{#1},
- shovel/.default = gray,
- pickaxe/.code = \duck@pickaxetrue
- \def\duck@pickaxe{#1},
- pickaxe/.default = gray,
- strawbroom/.code = \duck@strawbroomtrue
- \def\duck@strawbroom{#1},
- strawbroom/.default = brown!50!white,
- strawbroomstick/.code = \def\duck@strawbroomstick{#1},
- strawbroomstick = brown,
- strawbroomribbon/.code = \def\duck@strawbroomribbon{#1},
- strawbroomribbon = red!50!black,
- broom/.code = \duck@broomtrue
- \def\duck@broom{#1},
- broom/.default = brown,
- broomstick/.code = \def\duck@broomstick{#1},
- broomstick = gray!50!black,
- umbrella/.code = \duck@umbrellatrue
- \def\duck@umbrella{#1},
- umbrella/.default = cyan,
- umbrellaclosed/.code = \duck@umbrellaclosedtrue
- \def\duck@umbrellaclosed{#1},
- umbrellaclosed/.default = cyan,
- umbrella closed/.forward to = /duck/umbrellaclosed,
- handbag/.code = \duck@handbagtrue
- \def\duck@handbag{#1},
- handbag/.default = red!70!black,
- cocktail/.code = \duck@cocktailtrue,
- overleaf/.code = \duck@overleaftrue
- \def\duck@body{duck@overleafcol}
- \duck@graduatetrue
- \def\duck@graduate{black}
- \duck@squareglassestrue
- \def\duck@squareglasses{black},
- banana/.code = \duck@bananatrue
- \def\duck@banana{#1},
- banana/.default = yellow!80!orange,
- stick/.code = \duck@sticktrue
- \def\duck@stick{#1},
- stick/.default = red!60!green,
- leaf/.code = \def\duck@leaf{#1},
- leaf = green!70!red
-}
-
-\def\duck@draw{
-%\scope
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% minimal bounding box size
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@invisible
-\else
- \path (0.1,0.1) rectangle (2.1,2.12);
-\fi
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% defining some coordinates
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@name
- \coordinate (\duck@name-wing) at (0.8,0.7);
- \coordinate (\duck@name-head) at (0.9,2);
- \coordinate (\duck@name-bill) at (0.5,1.3);
- \coordinate (\duck@name-tail) at (1.82,1.41);
-\fi
-\coordinate (wing) at (0.8,0.7);
-\coordinate (head) at (0.9,2);
-\coordinate (bill) at (0.5,1.3);
-\coordinate (tail) at (1.82,1.41);
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% store the current scale factor
-% from https://github.com/samcarter/tikzlings/issues/3#issuecomment-461373494
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\pgfgettransformentries{\tmpscaleA}{\tmpscaleB}{\tmpscaleC}{\tmpscaleD}{\tmp}{\tmp}%
-\pgfmathsetmacro{\scalingfactor}{sqrt(abs(\tmpscaleA*\tmpscaleD-\tmpscaleB*\tmpscaleC))*sqrt(abs((\pgf@xx/1cm)*(\pgf@yy/1cm)-(\pgf@xy/1cm)*(\pgf@yx/1cm)))}%
-\pgfmathsetmacro{\xscalefactor}{\tmpscaleA}
-\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Environment
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\csname duckhookbackground\endcsname
-%
-% water %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@water
- \fill[\duck@water, even odd rule] (1.00,0.40) ellipse[x radius=0.88, y radius=0.35] (1.00,0.40) ellipse[x radius=0.75, y radius=0.25];
- \fill[\duck@water, even odd rule] (1.00,0.40) ellipse[x radius=1.05, y radius=0.50] (1.00,0.40) ellipse[x radius=0.95, y radius=0.42];
- \fill[\duck@water, even odd rule] (1.00,0.40) ellipse[x radius=1.23, y radius=0.63] (1.00,0.40) ellipse[x radius=1.17, y radius=0.57];
- \fill[\duck@water, even odd rule] (1.00,0.40) ellipse[x radius=1.42, y radius=0.77] (1.00,0.40) ellipse[x radius=1.38, y radius=0.73];
-\fi
-%
-% sheep %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@sheep
- \fill[\duck@sheep] (0.65,1.95) circle[radius=0.15] (0.50,1.75) circle[radius=0.15] (0.46,1.51) circle[radius=0.15] (0.37,1.00) circle[radius=0.15] (0.23,0.80) circle[radius=0.15] (0.20,0.60) circle[radius=0.15] (0.25,0.45) circle[radius=0.15] (0.35,0.30) circle[radius=0.15] (0.55,0.25) circle[radius=0.15] (0.75,0.20) circle[radius=0.15] (0.95,0.16) circle[radius=0.15] (1.15,0.20) circle[radius=0.15] (1.35,0.23) circle[radius=0.15] (1.55,0.30) circle[radius=0.15] (1.75,0.38) circle[radius=0.15] (1.95,0.50) circle[radius=0.15] (2.05,0.65) circle[radius=0.15] (2.10,0.85) circle[radius=0.15] (2.05,1.00) circle[radius=0.15] (2.00,1.15) circle[radius=0.15] (1.85,1.35) circle[radius=0.15] (1.60,1.25) circle[radius=0.15] (1.35,1.25) circle[radius=0.15] (1.30,1.50) circle[radius=0.15] (1.30,1.70) circle[radius=0.15] (1.20,1.90) circle[radius=0.15] (0.85,2.05) circle[radius=0.15] (1.05,2.00) circle[radius=0.15];
-\fi
-%
-% devil (back horn) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@devil
- \fill[\duck@devil] (0.7723,2.3756) .. controls (0.6369,2.1184) and (0.7916,2.0228) .. (0.8360,1.9897) .. controls (0.8744,1.9675) and (0.8774,1.9511) .. (0.8853,1.9173) .. controls (0.8853,1.8595) and (0.8407,1.8127) .. (0.7856,1.8127) .. controls (0.7535,1.8178) and (0.7240,1.8231) .. (0.6965,1.8545) .. controls (0.6965,1.8545) and (0.4451,2.2259) .. (0.7723,2.3756) -- cycle;
-\fi
-% Conical Hat (background) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@conicalhat
- \fill[\duck@conicalhat!50!black,rotate=-21] (0.265,1.915) ellipse[x radius=0.79, y radius=0.1];
- \fill[\duck@conicalhat!30!black] (0.5501,0.9739) -- (0.2002,1.9676) -- (0.2946,2.0008) -- (0.6445,1.0072) -- cycle;
-\fi
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% body parts
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@invisible
-\else
-%
-% body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\fill[\duck@body,overlay] \duckpathbody;
-%
-% head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifdefined\duck@head\else\let\duck@head=\duck@body\fi
-\fill[\duck@head]
- (0.90,1.50) ellipse[x radius=0.50, y radius=0.625];
-%
-% bill %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@grumpy
- \fill[\duck@bill] \duckpathgrumpybill;
-\else
- \ifduck@laughing
- \fill[\duck@bill!80!black,overlay] (0.40,1.20) .. controls (0.54,1.36) and (0.65,1.31) .. (0.91,1.37) .. controls (0.45,1.06) and (0.36,1.18) .. (0.40,1.20) -- cycle;
- \fill[\duck@bill,overlay] (0.41,1.47) .. controls (0.64,1.53) and (0.54,1.30) .. (0.91,1.37) .. controls (-0.02,1.10) and (0.28,1.37) .. (0.41,1.47) -- cycle;
- \else
- \ifduck@parrot
- \fill[\duck@bill!80!black]
- (0.40,1.45) .. controls (0.51,1.48) and (0.54,1.44) .. (0.59,1.39) .. controls (0.63,1.34) and (0.69,1.34) .. (0.86,1.35) .. controls (0.43,1.15) and (0.37,1.13) .. (0.34,1.20) .. controls (0.52,1.27) and (0.34,1.40) .. (0.40,1.45) -- cycle;
- \fill[\duck@bill]
- (0.39,1.49) .. controls (0.50,1.52) and (0.54,1.44) .. (0.59,1.39) .. controls (0.63,1.34) and (0.68,1.34) .. (0.86,1.35) .. controls (0.43,1.15) and (0.54,1.40) .. (0.22,1.20) .. controls (0.24,1.52) and (0.39,1.49) .. (0.39,1.49) -- cycle;
- \else
- \fill[\duck@bill] \duckpathbill;
- \fi
- \fi
-\fi
-%
-% Superhero mask %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% has to be behind the eyes
-\ifduck@mask
- \scope
- \clip (0.90,1.50) ellipse[x radius=0.50, y radius=0.625];
- \fill[\duck@mask,rotate=-15] (-0.1,1.59) rectangle (1.3,1.88);
- \endscope
-\fi%
-%
-% right eye %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\fill[\duck@eye, rotate=-20]
- (0.23,1.7675) ellipse[x radius=0.0893, y radius=0.125];
-\fill[\duck@pupil, rotate=-20]
- (0.26,1.7575) ellipse[x radius=0.0357, y radius=0.0714];
-%
-% left eye %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\fill[\duck@eye, rotate=-20]
- (-0.06,1.74) ellipse[x radius=0.0786, y radius=0.1143];
-\fill[\duck@pupil, rotate=-20]
- (-0.03,1.73) ellipse[x radius=0.0286, y radius=0.0643];
-%
-\fi % from no duck
-%
-% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\csname duckhookbody\endcsname
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% clothing
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Strap of the conical hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@conicalhat
- \ifduck@clothing
- \fill[\duck@conicalhat!30!black] (1.5943,1.5059) .. controls (1.4384,1.3576) and (1.2780,1.2120) .. (1.0987,1.0923) -- (1.0617,0.9549) .. controls (1.2151,1.0361) and (1.3476,1.1504) .. (1.4785,1.2630) .. controls (1.5417,1.3187) and (1.6038,1.3757) .. (1.6644,1.4344) -- cycle;
- \else
- \fill[\duck@conicalhat!30!black] (1.5943,1.5059) .. controls (1.4384,1.3576) and (1.2780,1.2120) .. (1.0987,1.0923) .. controls (0.9540,0.9995) and (0.7864,0.9875) .. (0.6358,1.0398) .. controls (0.6727,0.9043) and (0.9752,0.9113) .. (1.0617,0.9549) .. controls (1.2151,1.0361) and (1.3476,1.1504) .. (1.4785,1.2630) .. controls (1.5417,1.3187) and (1.6038,1.3757) .. (1.6644,1.4344) -- cycle;
- \fi
-\fi
-%
-% tshirt %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@tshirt
- \fill[\duck@tshirt,overlay] \duckpathtshirt;
-\fi
-%
-% tie %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@tie
- \fill[\duck@tie,rotate=-12] (0.32,0.7) rectangle (0.43,1.15);
-\fi
-%
-% jacket %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@jacket
- \fill[\duck@jacket,overlay] \duckpathjacket;
-\fi
-%
-% Ão dài %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@aodai
- \fill[\duck@aodai,overlay] (1.819,1.419) .. controls (2.871,0.120) and (0.711,-0.145) .. (0.296,0.251) .. controls (-0.118,0.647) and (0.232,1.073) .. (0.440,1.128) -- (0.567,0.927) .. controls (0.567,0.927) and (0.543,0.906) .. (0.509,0.882) -- (0.481,0.929) -- (0.458,0.915) -- (0.487,0.868) .. controls (0.473,0.859) and (0.457,0.850) .. (0.441,0.842) -- (0.422,0.894) -- (0.397,0.885) -- (0.417,0.831) .. controls (0.404,0.826) and (0.391,0.821) .. (0.378,0.818) -- (0.364,0.869) -- (0.338,0.862) -- (0.351,0.815) .. controls (0.334,0.814) and (0.318,0.817) .. (0.304,0.825) .. controls (0.303,0.774) and (0.329,0.759) .. (0.365,0.763) -- (0.376,0.722) -- (0.402,0.729) -- (0.391,0.768) .. controls (0.405,0.772) and (0.420,0.778) .. (0.435,0.784) -- (0.447,0.750) -- (0.472,0.759) -- (0.459,0.796) .. controls (0.477,0.805) and (0.496,0.815) .. (0.512,0.825) -- (0.533,0.791) -- (0.556,0.805) -- (0.535,0.840) .. controls (0.567,0.860) and (0.590,0.877) .. (0.590,0.877) .. controls (1.011,1.168) and (0.887,0.936) .. (1.819,1.419) -- cycle;
-\fi
-%
-% lapel %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@lapel
- \fill[\duck@lapel] (0.490,1.145) .. controls (0.3984,1.13) and (0.3515,1.08) .. (0.3515,1.08) -- (0.4265,1.0192) -- (0.35,0.98) -- (0.513,0.700) -- (1.0089,0.9162) -- (0.9547,0.9868) -- (1.1194,0.9782) -- (1.0822,1.135) .. controls (0.9616,1.1) and (0.8648,1.0300) .. (0.513,0.700) -- cycle;
-\fi
-%
-% stripes for football jersey %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@stripes
- \duck@stripes
-\fi
-%
-% superhero cape %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@cape
- \fill[\duck@cape,overlay] \duckpathcape;
-\fi
-%
-% bowtie %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@bowtie
- \fill[\duck@bowtie] (0.4382, 1.1105) .. controls (0.3984, 1.0671) and (0.3911, 0.9535) .. (0.4116, 0.9176) .. controls (0.4958, 0.9064) and (0.565, 0.9487) .. (0.565, 0.9487) -- (0.6448, 0.9398) .. controls (0.6448, 0.9398) and (0.6777, 0.8844) .. (0.804, 0.8689) .. controls (0.8323, 0.9056) and (0.8422, 1.0026) .. (0.8284, 1.0551) .. controls (0.7881, 1.0942) and (0.6537, 1.0285) .. (0.6537, 1.0285) -- (0.5739, 1.0374) .. controls (0.5739, 1.0374) and (0.5436, 1.0956) .. (0.4382, 1.1105) -- cycle;
-\fi
-%
-% necklace (not really clothing, but needs to be below the hair) %%%%%
-\ifduck@necklace
- \fill[\duck@necklace] (0.5000,1.112) circle[radius=0.032] (0.5100,1.050) circle[radius=0.032] (0.5200,0.990) circle[radius=0.032] (0.5400,0.931) circle[radius=0.032] (0.5825,0.885) circle[radius=0.032] (0.6450,0.885) circle[radius=0.032] (0.7000,0.910) circle[radius=0.032] (0.7500,0.945) circle[radius=0.032] (0.8000,0.980) circle[radius=0.032] (0.8500,1.020) circle[radius=0.032] (0.9000,1.050) circle[radius=0.032] (0.9500,1.080) circle[radius=0.032] (1.0000,1.110) circle[radius=0.032] (1.0550,1.130) circle[radius=0.032] (1.1100,1.150) circle[radius=0.032] (1.1650,1.165) circle[radius=0.032] (1.2200,1.180) circle[radius=0.032] (1.2750,1.195) circle[radius=0.032] (1.3300,1.210) circle[radius=0.032];
-\fi
-%
-% Scout neckerchief %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@neckerchief
- \fill[\duck@neckerchief]
- (0.3650,1.0892) .. controls (0.4127,1.1589) and (0.4900,1.1450) .. (0.4900,1.1450) .. controls (0.6500,0.9300) and (1.1366,1.2400) .. (1.3675,1.2649) .. controls (1.4131,1.2533) and (1.4052,1.2446) .. (1.4099,1.2124) .. controls (1.3028,1.0810) and (0.7415,0.8930) .. (0.6807,0.9076) .. controls (0.8257,0.7387) and (0.6347,0.7168) .. (0.7151,0.4426) .. controls (0.6059,0.5672) and (0.5513,0.6588) .. (0.5938,0.8388) .. controls (0.5871,0.6953) and (0.4493,0.7565) .. (0.4716,0.4967) .. controls (0.3682,0.6697) and (0.3820,0.7984) .. (0.5321,0.9351) .. controls (0.4635,0.9699) and (0.4115,1.0215) .. (0.3650,1.0892) -- cycle;
- \fill[\duck@woggle, rounded corners=\scalingfactor*1, rotate=-10] (0.33,1.05) rectangle (0.55,0.98);
-\fi
-%
-% Scarf %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@scarf
- \fill[\duck@scarf] (1.3780,1.2876) .. controls (1.1405,1.0484) and (0.7278,0.8710) .. (0.4865,1.1319) .. controls (0.4312,1.1245) and (0.3749,1.1088) .. (0.3443,1.0553) .. controls (0.4097,0.9269) and (0.4360,0.9534) .. (0.5231,0.8623) -- (0.4780,0.5230) -- (0.5666,0.5486) -- (0.6442,0.5011) -- (0.6584,0.6852) -- (0.6881,0.3913) -- (0.7782,0.4358) -- (0.8543,0.4133) -- (0.7988,0.8309) .. controls (1.0539,0.8635) and (1.1298,0.8415) .. (1.4849,1.1302) .. controls (1.4898,1.1985) and (1.4313,1.2543) .. (1.3780,1.2876) -- cycle;
-\fi
-%
-% buttons (same argument as for the necklace)
-\ifduck@buttons
- \ifduck@jacket
- \fill[\duck@buttons] (0.49,0.6) circle[radius=0.05] (0.46,0.45) circle[radius=0.05] (0.45,0.3) circle[radius=0.05];
- \else
- \fill[\duck@buttons] (0.53,0.75) circle[radius=0.05] (0.5,0.6) circle[radius=0.05] (0.47,0.45) circle[radius=0.05];
- \fi
-\fi
-%
-% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\csname duckhookclothing\endcsname
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% hair styles
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% short hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@shorthair
- \path (0.1,0.1) rectangle (2.1,2.25);
- \fill[\duck@hair,overlay] \duckpathshorthair;
-\fi
-%
-% long hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@longhair
- \path (0.1,0.1) rectangle (2.1,2.25);
- \fill[\duck@hair,overlay] \duckpathlonghair;
-\fi
-%
-% crazy hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@crazyhair
- \path (0.1,0.1) rectangle (2.1,2.4);
- \fill[\duck@hair,overlay] \duckpathcrazyhair;
-\fi
-%
-% receding hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@recedinghair
- \path (0.1,0.1) rectangle (2.1,2.18);
- \fill[\duck@hair,overlay] \duckpathrecedinghair;
-\fi
-%
-% mohican hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@mohican
- \path (0.1,0.1) rectangle (2.1,2.24);
- \fill[\duck@hair,overlay] \duckpathmohican;
-\fi
-%
-% mullet hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@mullet
- \path (0.1,0.1) rectangle (2.1,2.17);
- \fill[\duck@hair,overlay] \duckpathmullet;
-\fi
-%
-% middle parting %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@parting
- \path (0.1,0.1) rectangle (2.1,2.22);
- \fill[\duck@hair,overlay] (1.4053,1.5403) .. controls (1.5524,2.2939) and (0.3739,2.5180) .. (0.4084,1.6117) .. controls (0.4248,1.8921) and (0.7860,1.9734) .. (0.7860,1.9734) .. controls (1.1125,1.5754) and (1.3375,1.4715) .. (1.4053,1.5403) -- cycle;
-\fi
-%
-% eye brow %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\pgfkeys{/duck/eyebrow/.@def/.get=\duck@test}
-\ifx\duck@eyebrow\duck@test
- \ifdefined\duck@hair\let\duck@eyebrow=\duck@hair\fi
-\fi%
-\ifduck@eyebrow
- \fill[\duck@eyebrow, rounded corners=\scalingfactor*1, rotate=60] (1.92,0.21) rectangle (1.98,-0.01);
- \fill[\duck@eyebrow, rounded corners=\scalingfactor*1, rotate=100] (1.67,-0.77) rectangle (1.73,-0.95);
-\fi
-%
-% beard %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\pgfkeys{/duck/beard/.@def/.get=\duck@test}
-\ifx\duck@beard\duck@test
- \ifdefined\duck@hair\let\duck@beard=\duck@hair\fi
-\fi%
-\ifduck@beard
- \fill[\duck@beard] (1.3,1.3) circle[radius=0.12] (1.2,1.15) circle[radius=0.12] (0.5,1.05) circle[radius=0.1] (0.525,0.90) circle[radius=0.12] (0.525,0.75) circle[radius=0.12] (0.65,0.65) circle[radius=0.14] (0.75,0.75) circle[radius=0.12] (0.85,0.85) circle[radius=0.12] (0.95,0.95) circle[radius=0.12] (1.05,1.05) circle[radius=0.12] (1.15,1.25) circle[radius=0.12] (1,1.20) circle[radius=0.12] (0.85,1.20) circle[radius=0.12] (0.75,1.15) circle[radius=0.12] (0.65,1.10) circle[radius=0.12] (0.58,1.07) circle[radius=0.12] (0.44,1.46) circle[radius=0.06] (0.52,1.45) circle[radius=0.06] (0.6, 1.41) circle[radius=0.06] (0.68,1.36) circle[radius=0.06] (0.76,1.34) circle[radius=0.06] (0.86,1.26) circle[radius=0.12] (0.38,1.44) circle[radius=0.03] (1,1.28) circle[radius=0.12];
- \fill[\duck@beard] (1.3,1.3) -- (0.5,1.05) -- (0.65,0.65) -- cycle;
-\fi%
-%
-% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\csname duckhookhair\endcsname
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Headgear
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% alien %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@alien
- \fill[\duck@alien,rotate=-25] (0.09,2.1) rectangle (0.16,2.6);
- \fill[\duck@alien,rotate=5] (0.79,1.86) rectangle (0.86,2.25);
- \fill[\duck@alien] (1.20,2.30) circle[radius=0.07];
- \fill[\duck@alien] (0.62,2.35) circle[radius=0.07];
-\fi
-%
-% hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@hat
- \ifdefined\duck@hair % with hair
- \fill[\duck@hat,rotate=-15] (0.44,2.1) ellipse[x radius=0.7, y radius=0.1];
- \fill[\duck@hat,rotate=-15] (0.0,2.1) rectangle (0.88,2.4);
- \fill[\duck@hat,rotate=-15] (0.44,2.4) ellipse[x radius=0.44, y radius=0.08];
- \else % without hair
- \fill[\duck@hat,rotate=-15] (0.44,2.1) ellipse[x radius=0.6, y radius=0.1];
- \fill[\duck@hat,rotate=-15] (0.07,2.1) rectangle (0.81,2.4);
- \fill[\duck@hat,rotate=-15] (0.44,2.4) ellipse[x radius=0.37, y radius=0.08];
- \fi
-\fi
-%
-% cap %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@cap
- \fill[\duck@cap, start angle=0, end angle=150, radius=0.5] (1.4,1.75) arc;
- \fill[\duck@cap,rotate=-15] (0.3,2.05) ellipse[x radius=0.6, y radius=0.15];
-\fi
-%
-% Santa %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@santa
- \fill[\duck@santa]
- (0.430,1.803) .. controls (0.590,2.174) and (0.837,2.065) ..
- (1.118,1.954) .. controls (1.679,1.731) and (1.328,1.193) ..
- (1.647,1.057) .. controls (1.638,1.255) and (1.745,2.104) ..
- (1.168,2.270) .. controls (0.867,2.356) and (0.536,2.280) ..
- (0.430,1.803) -- cycle;
- \fill[white!80!brown]
- (0.44,1.733) .. controls (0.211,2.299) and (1.082,2.188) ..
- (1.456,1.759) .. controls (1.534,1.637) and (1.480,1.545) ..
- (1.400,1.566) .. controls (1.265,1.714) and (0.577,2.267) ..
- (0.44,1.733) -- cycle;
- \fill[white!80!brown] (1.6,1.0) circle[radius=0.17];
-\fi
-%
-% Chef hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@chef
- \fill[\duck@chef,rotate=-15] (0.44,2.1) ellipse[x radius=0.37, y radius=0.08];
- \fill[\duck@chef,rotate=-15] (0.07,2.1) rectangle (0.81,2.55);
- \fill[\duck@chef] (1.01,2.47) circle[radius=0.17];
- \fill[\duck@chef] (1.24,2.35) circle[radius=0.15];
- \fill[\duck@chef] (0.77,2.40) circle[radius=0.12];
- \fill[\duck@chef] (1.39,2.20) circle[radius=0.12];
-\fi
-%
-% graduate hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@graduate
- \fill[\duck@graduate,rotate=-15] (0.44,2.1) ellipse[x radius=0.37, y radius=0.1];
- \fill[\duck@graduate,rotate=-15] (0.07,2.1) rectangle (0.81,2.3);
- \fill[\duck@graduate] (0.3,2.25) -- (1.05,2.35) -- (1.7,1.95) -- (0.92,1.85) -- cycle;
- \fill[\duck@tassel,rounded corners=\scalingfactor*1] (1.12,1.89) -- (1.01,2.1) -- (1.09,2.11) -- (1.2,1.9) -- (1.2,1.3) -- (1.12,1.3) -- cycle;
- \fill[\duck@tassel] (1.16,1.3) ellipse[x radius=0.06, y radius=0.12];
-\fi
-%
-% beret %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@beret
- \fill[\duck@beret,rotate=-25] (0.13,2.15) ellipse[x radius=0.5, y radius=0.17];
- \fill[\duck@beret,rotate=-25] (0.13,2.25) ellipse[x radius=0.55, y radius=0.17];
- \fill[\duck@beret,rotate=-25] (0.13,2.4) circle[radius=0.08];
-\fi
-%
-% unicorn %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@unicorn
- \fill[\duck@unicorn,rotate=25] (1.48,1.4375)--(1.60,1.9)--(1.72,1.4375);
- \fill[\duck@body!100,rotate=25] (1.50,1.43)--(1.60,1.8375)--(1.70,1.43);
-\fi
-%
-% magic hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@magichat
- \path[preaction={fill, \duck@magichat!100},rotate=-5,
- pattern=fivepointed stars, pattern color=\duck@magicstars!100]
- (0.36,1.95)--(0.86,2.95)--(1.20,1.85);
-\fi
-%
-% witch %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@witch
- \fill[\duck@witch,rotate=-15] (0.44,2.13) ellipse[x radius=0.75, y radius=0.17];
- \fill[\duck@witch,rotate=-15] (0.05,2.2)--(0.45,3.2)--(0.82,2.2);
-\fi
-%
-% crown %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@crown
- \path (0.7,1.95) rectangle (1.4,2.45);
- \fill[\duck@crown,overlay] \duckpathcrown;
-\fi
-%
-% Queen crown %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@queencrown
- \fill[\duck@queencrown] \duckpathqueencrown;
-\fi
-%
-% King crown %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@kingcrown
- \fill[\duck@kingcrown] \duckpathkingcrown;
-\fi
-%
-% Bunny ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@bunny
- \path (0.55,1.9) rectangle (1.2,2.55);
- \pgfinterruptboundingbox
- \scope
- \clip[rotate=-5] (0.68,2.38) ellipse[x radius=0.3, y radius=0.4];
- \fill[\duck@bunny,rotate=-5] (1.06,2.2) ellipse[x radius=0.3, y radius=0.4] (0.28,2.26) ellipse[x radius=0.3, y radius=0.4];
- \endscope
-
- \scope
- \clip[rotate=-5] (0.68,2.38) ellipse[x radius=0.25, y radius=0.35];
- \fill[\duck@inear,rotate=-5] (1.06,2.2) ellipse[x radius=0.25, y radius=0.35] (0.28,2.26) ellipse[x radius=0.25, y radius=0.35];
- \endscope
- \endpgfinterruptboundingbox
-\fi
-%
-% peaked cap %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@peakedcap
- \fill[\duck@peakedcap,rotate=-15] (0.35,2.05) ellipse[x radius=0.5, y radius=0.15];
- \fill[\duck@peakedcap,rotate=-25] (0.13,2.15) ellipse[x radius=0.5, y radius=0.17];
- \fill[\duck@peakedcap,rotate=-35] (-0.25,2.2) ellipse[x radius=0.55, y radius=0.17];
-\fi
-%
-% tophat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@tophat
- \fill[\duck@tophat,rotate=-15] (0.44,2.1) ellipse[x radius=0.48, y radius=0.1];
- \fill[\duck@tophat,rotate=-15] (0.12,2.1) -- (0.75,2.1) -- (0.81,2.55) -- (0.07,2.55) -- cycle;
- \fill[\duck@tophat,rotate=-15] (0.44,2.55) ellipse[x radius=0.37, y radius=0.08];
-\fi
-%
-% darth vader %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@darthvader
- \path (0.1,0.1) rectangle (2.1,2.22);
- \fill[\duck@darthvader,overlay] \duckpathdarthvader;
-\fi
-%
-% Harlequin duck %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@harlequin
- \path (0.19,1.85) rectangle (1.85,2.67);
- \fill[\duck@harlequin,overlay] (0.6006,1.9719) .. controls (0.7432,1.8954) and (0.9320,1.8698) .. (0.9320,1.8698) -- (1.0404,2.3839) .. controls (0.9223,2.8873) and (0.1755,2.5634) .. (0.3019,2.2958) .. controls (0.5807,2.5024) and (0.7251,2.3376) .. (0.6006,1.9719) -- cycle;
- \fill[\duck@niuqelrah,overlay] (1.2853,1.8902) .. controls (1.1177,1.8507) and (0.9278,1.8703) .. (0.9278,1.8703) -- (1.0404,2.3839) .. controls (1.3637,2.8347) and (1.9373,2.3532) .. (1.7049,2.1284) .. controls (1.5267,2.3895) and (1.3204,2.2666) .. (1.2853,1.8902) -- cycle;
- \fill[\duck@harlequin] (1.7,2.07) circle[radius=0.1];
- \fill[\duck@niuqelrah] (0.3,2.23) circle[radius=0.1];
-\fi
-%
-% Straw hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@strawhat
- \fill[\duck@strawhat,rotate=-15] (0.44,2.0) ellipse[x radius=0.75, y radius=0.1];
- \fill[\duck@strawhat,rotate=-15] (0.1,2.05) rectangle (0.78,2.5);
- \fill[\duck@strawhat,rotate=-15] (0.44,2.5) ellipse[x radius=0.34, y radius=0.08];
- \fill[\duck@strawhat,rotate=-15] (-0.3,2.02) -- (1.18,2.02) -- (0.78,2.2) -- (0.1,2.2) -- cycle;
- \fill[\duck@ribbon,rotate=-15] (0.44,2.2) ellipse[x radius=0.34, y radius=0.08];
- \fill[\duck@ribbon,rotate=-15] (0.1,2.2) rectangle (0.78,2.3);
- \fill[\duck@strawhat,rotate=-15] (0.44,2.3) ellipse[x radius=0.34, y radius=0.08];
-\fi
-%
-% helmet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@helmet
- \fill[\duck@helmet] (1.4331,1.5155) .. controls (1.4365,1.7226) and (1.3866,2.0493) .. (1.0429,2.1279) .. controls (0.7050,2.2052) and (0.4794,1.9294) .. (0.4481,1.8183) .. controls (0.6062,1.8381) and (1.1506,1.7480) .. (1.4331,1.5155) -- cycle;
- \fill[\duck@helmet!70!black] (1.0282,2.1360) .. controls (0.9395,2.1312) and (0.8696,2.0652) .. (0.8152,2.0010) .. controls (0.7824,1.9609) and (0.7546,1.9169) .. (0.7309,1.8709) .. controls (0.6510,1.8859) and (0.5703,1.8971) .. (0.4892,1.9024) .. controls (0.4595,1.8831) and (0.4114,1.7962) .. (0.4743,1.7961) .. controls (0.5446,1.7868) and (0.6149,1.7767) .. (0.6845,1.7629) .. controls (0.6647,1.7052) and (0.6469,1.6454) .. (0.6401,1.5851) -- (0.6583,1.5355) -- (0.7069,1.5673) .. controls (0.7193,1.6285) and (0.7363,1.6889) .. (0.7590,1.7471) .. controls (0.9991,1.6922) and (1.2114,1.6182) .. (1.4111,1.4722) .. controls (1.4369,1.4960) and (1.4536,1.5229) .. (1.4475,1.5553) .. controls (1.4417,1.5927) and (1.4030,1.6066) .. (1.3766,1.6276) .. controls (1.2054,1.7408) and (1.0085,1.8089) .. (0.8095,1.8546) .. controls (0.8733,1.9674) and (0.9684,2.0703) .. (1.0932,2.1138) .. controls (1.0751,2.1288) and (1.0515,2.1362) .. (1.0282,2.1360) -- cycle;
- \fill[\duck@helmet!50!white] (0.502,1.845) circle[radius=0.015] (0.586,1.835) circle[radius=0.015] (0.684,1.822) circle[radius=0.015] (0.791,1.799) circle[radius=0.015] (0.899,1.770) circle[radius=0.015] (1.003,1.741) circle[radius=0.015] (1.099,1.706) circle[radius=0.015] (1.185,1.673) circle[radius=0.015] (1.276,1.629) circle[radius=0.015] (1.360,1.581) circle[radius=0.015] (0.676,1.606) circle[radius=0.015] (0.695,1.666) circle[radius=0.015] (0.714,1.729) circle[radius=0.015] (0.784,1.889) circle[radius=0.015] (0.835,1.968) circle[radius=0.015] (0.896,2.034) circle[radius=0.015] (0.957,2.081) circle[radius=0.015] (1.020,2.115) circle[radius=0.015] (1.422,1.535) circle[radius=0.015] (0.502,1.845) circle[radius=0.015];
-\fi
-%
-% Viking %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@viking
- \fill[\duck@viking] (1.4331,1.5155) .. controls (1.4365,1.7226) and (1.3866,2.0493) .. (1.0429,2.1279) .. controls (0.7050,2.2052) and (0.4794,1.9294) .. (0.4481,1.8183) .. controls (0.6062,1.8381) and (1.1506,1.7480) .. (1.4331,1.5155) -- cycle;
- \fill[\duck@viking!70!black] (1.0282,2.1360) .. controls (0.9395,2.1312) and (0.8696,2.0652) .. (0.8152,2.0010) .. controls (0.7824,1.9609) and (0.7546,1.9169) .. (0.7309,1.8709) .. controls (0.6510,1.8859) and (0.5703,1.8971) .. (0.4892,1.9024) .. controls (0.4595,1.8831) and (0.4114,1.7962) .. (0.4743,1.7961) .. controls (0.5446,1.7868) and (0.6149,1.7767) .. (0.6845,1.7629) .. controls (0.6845,1.7629) and (0.6845,1.7629) .. (0.7590,1.7471) .. controls (0.9991,1.6922) and (1.2114,1.6182) .. (1.4111,1.4722) .. controls (1.4369,1.4960) and (1.4536,1.5229) .. (1.4475,1.5553) .. controls (1.4417,1.5927) and (1.4030,1.6066) .. (1.3766,1.6276) .. controls (1.2054,1.7408) and (1.0085,1.8089) .. (0.8095,1.8546) .. controls (0.8733,1.9674) and (0.9684,2.0703) .. (1.0932,2.1138) .. controls (1.0751,2.1288) and (1.0515,2.1362) .. (1.0282,2.1360) -- cycle;
- \fill[\duck@viking!50!white] (0.502,1.845) circle[radius=0.015] (0.586,1.835) circle[radius=0.015] (0.684,1.822) circle[radius=0.015] (0.791,1.799) circle[radius=0.015] (0.899,1.770) circle[radius=0.015] (1.003,1.741) circle[radius=0.015] (1.099,1.706) circle[radius=0.015] (1.185,1.673) circle[radius=0.015] (1.276,1.629) circle[radius=0.015] (1.360,1.581) circle[radius=0.015] (0.784,1.889) circle[radius=0.015] (0.835,1.968) circle[radius=0.015] (0.896,2.034) circle[radius=0.015] (0.957,2.081) circle[radius=0.015] (1.020,2.115) circle[radius=0.015] (1.422,1.535) circle[radius=0.015];
-\fi
-%
-% devil (front horn) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@devil
- \fill[\duck@devil] (1.2185,2.3521) .. controls (1.3540,2.0950) and (1.1993,1.9994) .. (1.1548,1.9663) .. controls (1.1165,1.9441) and (1.1134,1.9277) .. (1.1056,1.8938) .. controls (1.1056,1.8361) and (1.1502,1.7893) .. (1.2052,1.7893) .. controls (1.2373,1.7944) and (1.2669,1.7996) .. (1.2944,1.8311) .. controls (1.2944,1.8311) and (1.5458,2.2025) .. (1.2185,2.3521) -- cycle;
-\fi
-%
-% Conical Hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@conicalhat
- \path (0.19,1.4) rectangle (1.68,2.32);
- \fill[\duck@conicalhat,overlay] (1.6722,1.4137) .. controls (1.6722,1.4337) and (1.3592,1.6230) .. (0.9513,1.7735) .. controls (0.5433,1.9239) and (0.1948,1.9784) .. (0.1948,1.9754) .. controls (0.2049,2.0230) and (1.1428,2.36) .. (1.1428,2.3) .. controls (1.1428,2.35) and (1.6821,1.4784) .. (1.6722,1.4137) -- cycle;
-\fi
-%
-% Sailor hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@sailor
- \fill[\duck@sailor] (1.0390,2.2743) .. controls (0.9475,2.2748) and (0.8569,2.2355) .. (0.7943,2.1690) .. controls (0.7147,2.1872) and (0.6335,2.2098) .. (0.5512,2.2029) .. controls (0.5524,2.1164) and (0.5536,2.0299) .. (0.5547,1.9434) .. controls (0.6637,1.9348) and (0.7679,1.8974) .. (0.8716,1.8653) .. controls (1.0321,1.8101) and (1.1932,1.7522) .. (1.3420,1.6697) .. controls (1.3671,1.6622) and (1.3911,1.6147) .. (1.4083,1.6518) .. controls (1.4623,1.7160) and (1.5163,1.7802) .. (1.5702,1.8444) .. controls (1.5154,1.8979) and (1.4433,1.9287) .. (1.3757,1.9624) .. controls (1.3666,2.1156) and (1.2403,2.2511) .. (1.0881,2.2707) .. controls (1.0718,2.2731) and (1.0554,2.2743) .. (1.0390,2.2743) -- cycle;
-\fi
-%
-% Bobble hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@bobblehat
- \pgfinterruptboundingbox
- \fill[\duck@bobblehat] (0.4639,1.7996) .. controls (0.5789,1.8438) and (1.3853,1.6023) .. (1.4046,1.4672) .. controls (1.4581,1.5025) and (1.5242,1.5917) .. (1.4544,1.6879) .. controls (1.5205,2.1879) and (0.7711,2.3780) .. (0.5562,1.9848) .. controls (0.4314,1.9650) and (0.4277,1.8625) .. (0.4639,1.7996) -- cycle;
- \fill[\duck@bobblehat] (1.1,2.2) circle [radius=0.1];
- \endpgfinterruptboundingbox
- \path (0.43,1.3) rectangle (1.5,2.3);
-\fi
-%
-% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\csname duckhookhat\endcsname
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Accessories
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% sunglasses %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@sunglasses
- \fill[\duck@sunglasses,rotate=-17] (0.42,1.8) rectangle (0.8,1.84);
- \fill[\duck@sunglasses,rotate=-17] (0.12,1.8) rectangle (0.22,1.84);
- \fill[\duck@sunglasses,rotate=-20] (0.23,1.7675) circle[radius=0.14];
- \fill[\duck@sunglasses,rotate=-20] (-0.06,1.74) circle[radius=0.13];
-\fi
-%
-% glasses %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@glasses
- \fill[\duck@glasses,rotate=-17] (0.42,1.8) rectangle (0.8,1.84);
- \fill[\duck@glasses,rotate=-17] (0.12,1.8) rectangle (0.22,1.84);
- \fill[\duck@glasses,rotate=-20,even odd rule] (0.23,1.7675) circle[radius=0.14] (0.23,1.7675) circle[radius=0.11];
- \fill[\duck@glasses,rotate=-20,even odd rule] (-0.06,1.74) circle[radius=0.13] (-0.06,1.74) circle[radius=0.095];
-\fi
-%
-% square glasses
-\ifduck@squareglasses
- \fill[\duck@squareglasses,rotate=-17] (0.43,1.8) rectangle (0.8,1.84);
- \fill[\duck@squareglasses,rotate=-17] (0.12,1.8) rectangle (0.22,1.84);
- \fill[\duck@squareglasses,rotate=-20,rounded corners=\scalingfactor*2,even odd rule] (-0.16,1.62) -- (-0.18,1.85) -- (0.05,1.87) -- (0.04,1.62) -- cycle [rounded corners=\scalingfactor*1.5] (-0.14,1.64) -- (-0.16,1.83) -- (0.03,1.85) -- (0.02,1.64) -- cycle;
- \fill[\duck@squareglasses,rotate=-20,rounded corners=\scalingfactor*2,even odd rule] (0.12,1.63) -- (0.10,1.88) -- (0.36,1.90) -- (0.35,1.65) -- cycle [rounded corners=\scalingfactor*1.5] (0.14,1.65) -- (0.12,1.86) -- (0.34,1.88) -- (0.33,1.67) -- cycle;
-\fi
-%
-% icecream %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@icecream
- \fill[\duck@cone,rotate=-20] (0.35,1.20)--(0.50,0.60)--(0.75,1.20);
- \fill[\duck@flavoura] (0.85,1.03) circle[radius=0.12];
- \fill[\duck@flavourb] (1.05,0.95) circle[radius=0.12];
- \fill[\duck@flavourc] (0.95,1.1) circle[radius=0.12];
-\fi
-%
-% book %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@book
- \fill[\duck@bookcolour,rotate=-20]
- (0.40,1.20) rectangle (0.80,0.60);
- \node[rotate=-20*\yscalefactor/\xscalefactor, color=white] at (0.88,0.70) {\duck@book};%
-\fi
-%
-% signpost %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@signpost
- \fill[\duck@signcolour, rounded corners=\scalingfactor*1, rotate=-20] (0.8,0.75) rectangle (0.9,1.75);
- \fill[\duck@signcolour, rounded corners=\scalingfactor*1, rotate=-20] (0.4,1.7) rectangle (1.3,2.4);
- \fill[\duck@signback, rounded corners=\scalingfactor*1, rotate=-20] (0.45,1.75) rectangle (1.25,2.35);
- \node[rotate=-20*\yscalefactor/\xscalefactor, color=white] at (1.5,1.65) {\duck@signpost};
-\fi
-%
-% speech bubble %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@speech
- \fill[\duck@bubblecolour] (-0.5,1.8) ellipse[x radius=0.7, y radius=0.3];
- \fill[\duck@bubblecolour] (-0.2,1.54) -- (0.2,1.35) -- (0.0,1.6) -- cycle;
- \node at (-0.5,1.8) {\duck@speech};
-\fi
-%
-% think bubble %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@think
- \fill[\duck@bubblecolour] (2,2.4) ellipse[x radius=0.7, y radius=0.35];
- \fill[\duck@bubblecolour] (1.55,2.35) circle[radius=0.25] (2.0,2.15) circle[radius=0.25] (2.4,2.25) circle[radius=0.25] (1.6,2.55) circle[radius=0.25] (2.0,2.6) circle[radius=0.25] (2.35,2.5) circle[radius=0.25] (1.65,1.95) circle[radius=0.1] (1.55,1.80) circle[radius=0.06] (1.47,1.70) circle[radius=0.03];
- \node at (2,2.4) {\duck@think};
-\fi
-%
-% magic wand %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@magicwand
- \fill[black,rotate=-30] (0.27,1.23) rectangle (0.37,0.65);
- \fill[white,rotate=-30] (0.27,1.13) rectangle (0.37,1.03);
-\fi
-%
-% cricket bat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@cricket
- \fill[\duck@cricket, rounded corners=\scalingfactor*2, rotate=-30] (0.4,1.2) rectangle (0.7,2.2);
- \fill[\duck@cricket, rounded corners=\scalingfactor*1, rotate=-30] (0.5,0.8) rectangle (0.6,1.3);
-\fi
-%
-% rollingpin %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@rollingpin
- \fill[\duck@rollingpin, rounded corners=\scalingfactor*2, rotate=-60] (-0.18,0.85) rectangle (0.08,1.75);
- \fill[\duck@rollingpin, rounded corners=\scalingfactor*1, rotate=-60] (-0.1,0.65) rectangle (0.0,1.95);
-\fi
-%
-% lightsaber %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@lightsaber
- \fill[\duck@lightsaber, rounded corners=\scalingfactor*1, rotate=-30] (0.5,0.9) rectangle (0.6,2.5);
- \fill[gray!80!black, rounded corners=\scalingfactor*1, rotate=-30] (0.47,0.7) rectangle (0.63,1.2);
-\fi
-%
-% cake %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@cake
- \fill[\duck@cake] (1.00,0.50) ellipse[x radius=0.4, y radius=0.2];
- \fill[\duck@cake] (0.6,0.5) rectangle (1.4,0.7);
- \fill[\duck@cake] (1.00,0.70) ellipse[x radius=0.4, y radius=0.2];
- \fill[\duck@cake!50!white] (0.75,0.75) rectangle (0.8,0.95);
- \fill[\duck@cake!50!white] (1.2,0.75) rectangle (1.25,0.95);
- \fill[\duck@cake!50!white] (0.975,0.65) rectangle (1.025,0.85);
- \fill[white!85!yellow] (1.0,0.93) ellipse[x radius=0.03, y radius=0.06];
- \fill[white!85!yellow] (1.225,1.03) ellipse[x radius=0.03, y radius=0.06];
- \fill[white!85!yellow] (0.775,1.03) ellipse[x radius=0.03, y radius=0.06];
-\fi
-%
-% pizza %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@pizza
- \fill[brown] (1.00,0.60) ellipse[x radius=0.4, y radius=0.2];
- \fill[red!70!black] (1.00,0.60) ellipse[x radius=0.34, y radius=0.16];
- \fill[white!85!yellow] (1.15,0.65) ellipse[x radius=0.065, y radius=0.04];
- \fill[white!85!yellow] (0.81,0.57) ellipse[x radius=0.065, y radius=0.04];
- \fill[white!85!yellow] (0.95,0.68) ellipse[x radius=0.065, y radius=0.04];
- \fill[white!85!yellow] (1.02,0.54) ellipse[x radius=0.065, y radius=0.04];
- \fill[green!40!brown] (1.09,0.54) ellipse[x radius=0.07, y radius=0.02];
- \fill[green!40!brown,rotate=20] (1.0,0.34) ellipse[x radius=0.07, y radius=0.02];
- \fill[green!40!brown,rotate=-20] (0.9,1.05) ellipse[x radius=0.07, y radius=0.02];
- \fill[green!40!brown] (1.00,0.60) ellipse[x radius=0.03, y radius=0.06];
-\fi
-%
-% no pizza %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@davidlikespineapplepizza
- \fill[brown] (1.00,0.60) ellipse[x radius=0.4, y radius=0.2];
- \fill[red!70!black] (1.00,0.60) ellipse[x radius=0.34, y radius=0.16];
- \fill[yellow!70!brown] (1.15,0.65) ellipse[x radius=0.08, y radius=0.06];
- \fill[red!70!black] (1.15,0.65) ellipse[x radius=0.04, y radius=0.03];
- \fill[yellow!70!brown] (0.81,0.57) ellipse[x radius=0.08, y radius=0.06];
- \fill[red!70!black] (0.81,0.57) ellipse[x radius=0.04, y radius=0.03];
- \fill[yellow!70!brown] (0.95,0.68) ellipse[x radius=0.08, y radius=0.06];
- \fill[red!70!black] (0.95,0.68) ellipse[x radius=0.04, y radius=0.03];
- \fill[yellow!70!brown] (1.02,0.54) ellipse[x radius=0.08, y radius=0.06];
- \fill[red!70!black] (1.02,0.54) ellipse[x radius=0.04, y radius=0.03];
- \fill[green!40!brown] (1.09,0.54) ellipse[x radius=0.07, y radius=0.02];
- \fill[green!40!brown,rotate=20] (1.0,0.34) ellipse[x radius=0.07, y radius=0.02];
- \fill[green!40!brown,rotate=-20] (0.9,1.05) ellipse[x radius=0.07, y radius=0.02];
- \fill[green!40!brown] (1.00,0.60) ellipse[x radius=0.03, y radius=0.06];
-\fi
-%
-% Hockey stick %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@hockey
- \fill[\duck@hockey, rounded corners=\scalingfactor*1, rotate=-30] (0.5,0.6) rectangle (0.6,2.1);
- \fill[\duck@hockey, rounded corners=\scalingfactor*3] (0.2,0.2) rectangle (0.85,0.4);
-\fi
-%
-% baguette %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@baguette
- \fill[\duck@baguette!70!white, rounded corners=\scalingfactor*4, rotate=-30] (0.4,0.72) rectangle (0.7,2.0);
- \fill[\duck@baguette!80!black, rotate=5] (1.44,1.1) ellipse[x radius=0.1, y radius=0.03] (1.30,0.9) ellipse[x radius=0.1, y radius=0.03] (1.16,0.7) ellipse[x radius=0.1, y radius=0.03] (1.02,0.5) ellipse[x radius=0.1, y radius=0.03];
-\fi
-%
-% football %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@football
- \fill[\duck@football] (1.2,0.33) circle[radius=0.32];
- \scope
- \clip (1.2,0.33) circle[radius=0.32];
- \fill[black] (1.06,0.30) -- (1.01,0.17) -- (1.14,0.08) -- (1.26,0.14) -- (1.20,0.28) -- cycle (1.37,0.14) -- (1.46,0.27) -- (1.59,0.27) -- (1.41,0.04) -- cycle (1.28,0.38) -- (1.22,0.52) -- (1.33,0.61) -- (1.45,0.51) -- (1.43,0.37) -- cycle (0.87,0.44) -- (1.02,0.40) -- (1.10,0.53) -- (1.07,0.62) -- (0.94,0.57) -- cycle;
- \endscope
-\fi
-%
-% milkshake %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@milkshake
- \fill[cyan!10!white, rotate=-10] (0.8,0.50) ellipse[x radius=0.17, y radius=0.05];
- \fill[cyan!10!white, rotate=-10] (0.8,0.55) ellipse[x radius=0.12, y radius=0.03];
- \scope
- \clip[rotate=-10] (0.58,0.5) rectangle (1.02,1.03);
- \fill[cyan!10!white, rotate=-10] (0.8,0.94) ellipse[x radius=0.18, y radius=0.4];
- \fill[\duck@milkshake, rotate=-10] (0.8,0.94) ellipse[x radius=0.15, y radius=0.36];
- \endscope
- \fill[white!85!yellow] (0.83,0.92) circle[radius=0.05] (0.88,0.9) circle[radius=0.05] (0.93,0.92) circle[radius=0.05] (0.99,0.91) circle[radius=0.05] (1.06,0.86) circle[radius=0.05] (1.13,0.87) circle[radius=0.05] (0.85,0.99) circle[radius=0.05] (0.9,0.98) circle[radius=0.07] (1.0,0.98) circle[radius=0.07] (1.1,0.95) circle[radius=0.07];
- \fill[red!90!black] (1.0,1.1) circle[radius=0.05];
- \fill[white!85!yellow] (0.94,1.05) circle[radius=0.05] (1.03,1.03) circle[radius=0.05];
- \fill[cyan!10!white, rotate=-10] (0.8,0.50) ellipse[x radius=0.17, y radius=0.05];
- \fill[red!90!black,rotate=20] (1.2,0.58) rectangle (1.22,0.85);
-\fi
-%
-% wine %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@wine
- \fill[cyan!10!white, rotate=-10] (0.8,0.50) ellipse[x radius=0.17, y radius=0.05];
- \fill[cyan!10!white, rotate=-10] (0.8,0.55) ellipse[x radius=0.12, y radius=0.03];
- \fill[cyan!10!white, rotate=-10] (0.8,0.7) ellipse[x radius=0.03, y radius=0.2];
- \scope
- \clip[rotate=-10] (0.58,0.5) rectangle (1.02,1.03);
- \fill[cyan!10!white, rotate=-10] (0.8,1.1) ellipse[x radius=0.18, y radius=0.4];
- \endscope
- \scope
- \clip[rotate=-10] (0.58,0.5) rectangle (1.02,0.87);
- \fill[\duck@wine, rotate=-10] (0.8,1.1) ellipse[x radius=0.15, y radius=0.36];
- \endscope
-\fi
-%
-% prison duck %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@prison
- \fill[\duck@prison] (1.5,0.25) circle[radius=0.3];
- \fill[\duck@prison, even odd rule] (1.2,0.1) ellipse[x radius=0.10, y radius=0.07] (1.2,0.1) ellipse[x radius=0.06, y radius=0.04] (1.05,-0.05) ellipse[x radius=0.10, y radius=0.07] (1.05,-0.05) ellipse[x radius=0.06, y radius=0.04] (0.87,-0.2) ellipse[x radius=0.10, y radius=0.07] (0.87,-0.2) ellipse[x radius=0.06, y radius=0.04];
- \fill[\duck@prison, even odd rule] (0.72,-0.2) ellipse[x radius=0.10, y radius=0.07] (0.72,-0.2) ellipse[x radius=0.06, y radius=0.04];
- \fill[\duck@prison,even odd rule,rotate=70] (0.4,-1.05) ellipse[x radius=0.1, y radius=0.07] (0.4,-1.05) ellipse[x radius=0.06, y radius=0.04] (0.2,-0.95) ellipse[x radius=0.1, y radius=0.07] (0.2,-0.95) ellipse[x radius=0.06, y radius=0.04] (0.22,-0.58) ellipse[x radius=0.1, y radius=0.07] (0.22,-0.58) ellipse[x radius=0.06, y radius=0.04];
- \fill[\duck@prison,even odd rule,rotate=110](-0.33,-0.55) ellipse[x radius=0.1, y radius=0.07] (-0.33,-0.55) ellipse[x radius=0.06, y radius=0.04];
- \scope
- \clip[rotate=-12] (0.45,0.15) rectangle (0.63,0.25);
- \fill[\duck@prison,even odd rule,rotate=110](-0.07,-0.6) ellipse[x radius=0.1, y radius=0.07] (-0.07,-0.6) ellipse[x radius=0.06, y radius=0.04];
- \endscope
-\fi
-%
-% torch %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@torch
- \fill[red!50!yellow] \duckpathtorch;
- \fill[red!25!yellow, scale=0.67, xshift=17, yshift=15] \duckpathtorch;
- \fill[white!50!yellow, scale=0.4, xshift=53.5, yshift=45.3] \duckpathtorch;
- \fill[\duck@torch,rounded corners=\scalingfactor*1]
- (1.1,0.96) -- (0.77,0.25) -- (0.83,0.25) -- (1.3,0.86) -- cycle;
- \fill[\duck@torch,rotate=-28]
- (0.62,1.32) ellipse[x radius=0.2, y radius=0.08];
-\fi%
-%
-% sheep %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@sheep
- \scope
- \clip[rotate=-5] (1.2,1.7) ellipse[x radius=0.3, y radius=0.4];
- \fill[\duck@bill,rotate=-5] (0.8,1.5) ellipse[x radius=0.3, y radius=0.4];
- \endscope
-\fi
-%
-% basket %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@basket
- \fill[\duck@basket, start angle=180, end angle=360, x radius=0.35, y radius=0.35] (0.65,0.61) arc -- cycle;
- \fill[\duck@basket, start angle=180, end angle=0, even odd rule] [x radius=0.35, y radius=0.5] (0.65,0.6) arc -- cycle [x radius=0.3, y radius=0.45] (0.7,0.6) arc -- cycle;
- \fill[\duck@basket, even odd rule] (1,0.6) ellipse[x radius=0.35, y radius=0.1] (1,0.6) ellipse[x radius=0.3, y radius=0.07];
- \fill[\duck@basket!75!black] (1,0.6) ellipse[x radius=0.3, y radius=0.07];
-\fi%
-%
-% easter basket %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@easter
- \scope
- \clip [start angle=180, end angle=0, x radius=0.3, y radius=0.45] (0.7,0.6) arc -- cycle [start angle=180, end angle=360, x radius=0.3, y radius=0.07] (0.7,0.6) arc -- cycle;
- \fill[\duck@eggb, rotate=-5] (0.95,0.72) ellipse[x radius=0.09, y radius=0.13];
- \fill[\duck@egga, rotate=10] (0.94,0.42) ellipse[x radius=0.09, y radius=0.13];
- \fill[\duck@eggc, rotate=-30] (0.7,1.08) ellipse[x radius=0.09, y radius=0.13];
- \endscope
-\fi%
-%
-% horse tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\pgfkeys{/duck/horsetail/.@def/.get=\duck@test}
-\ifx\duck@horsetail\duck@test
- \ifdefined\duck@hair\let\duck@horsetail=\duck@hair\fi
-\fi%
-\ifduck@horsetail
- \path (0.1,0.1) rectangle (2.82,2.14);
- \fill[\duck@horsetail,overlay] \duckpathhorsetail;
-\fi
-%
-% crozier %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@crozier
- \scope
- \clip [rotate=-20] (0.6,2.3) rectangle (1.1,1.999);
- \fill[even odd rule,\duck@crozier] (1.5,1.6) circle[radius=0.2] (1.5,1.6) circle[radius=0.1];
- \endscope
- \fill[\duck@crozier,rotate=-20] (0.663,0.5) rectangle (0.763,2.0);
-\fi
-%
-% stethoscope %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@stethoscope
- \fill[\duck@stethoscope,rounded corners=\scalingfactor*0.5,rotate=-18] (0.08,0.7) rectangle (0.13,1.24);
- \fill[\duck@stethoscope] (0.35,0.7) circle[radius=0.1];
- \scope
- \fill[\duck@stethoscope,rounded corners=\scalingfactor*0.5,rotate=-30] (0.53,1.3) rectangle (0.58,1.72);
- \clip[rotate=-30] (0.36,0.89) -- (0.36,1.36) -- (0.79,1.36) -- (0.79,0.89) -- (0.65,0.89) -- (0.65,0.96) -- (0.5,0.96) -- (0.5,0.89) -- cycle ;
- \fill [\duck@stethoscope,rounded corners=\scalingfactor*3,rotate=-30,even odd rule] (0.775,1.35) rectangle (0.375,0.9) [rounded corners=\scalingfactor*2] (0.725,1.3) rectangle (0.425,0.95);
- \endscope
-\fi
-%
-% snow duck %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@snowduck
- \fill[black, rotate=-25] (0.65,0.65) rectangle (0.7,1.8);
- \fill[black, rotate=35] (1.55,0.15) rectangle (1.6,0.5);
- \fill[black, rotate=-35] (0.4,1.7) rectangle (0.45,2.0);
- \fill[black, rotate=-60] (-0.3,2.0) rectangle (-0.35,1.65);
-\fi
-%
-% vampire %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@vampire
- \ifduck@laughing
- \fill[\duck@vampire] (0.55,1.28) -- (0.575,1.22) -- (0.6,1.29) -- cycle;
- \else
- \fill[\duck@vampire] (0.6,1.20) -- (0.625,1.16) -- (0.65,1.223) -- cycle;
- \fi
-\fi
-%
-% crystal ball %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@crystalball
- \shade[ball color=\duck@crystalball,opacity=0.7] (0.93,0.5) circle[radius=0.33];
-\fi
-%
-% Cheese %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@cheese
- \scope[xshift=26,yshift=-2]
- \fill[\duck@cheese] (-0.3200,0.8058) -- (0.0608,0.7220) -- (0.0608,0.6366) -- (-0.3200,0.5410) -- (0.2143,0.4236) .. controls (0.3395,0.4810) and (0.4241,0.5627) .. (0.4117,0.6253) -- (0.4117,0.7634) .. controls (0.4261,0.8618) and (0.2607,0.8954) .. (0.1907,0.8962) -- cycle;
- \fill[\duck@cheese!35!white] (-0.3200,0.8057) -- (-0.3200,0.5410) -- (0.2143,0.4236) -- (0.2143,0.7381) -- cycle;
- \fill[\duck@cheese] (-0.23,0.71) circle[radius=0.04] (0.0,0.55) circle[radius=0.04] (-0.23,0.58) circle[radius=0.02] (-0.15,0.6) circle[radius=0.02] (-0.1,0.7) circle[radius=0.02] (0.1,0.65) circle[radius=0.02] (0,0.65) circle[radius=0.02] (0.1,0.5) circle[radius=0.02] (0.07,0.55) circle[radius=0.01] (0.12,0.6) circle[radius=0.01] (-0.08,0.54) circle[radius=0.01];
- \endscope
-\fi
-%
-% shovel %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@shovel
- \fill[brown!80!black,rotate around={-23:(0.91, 0.88)}] (0.87, 0.28) rectangle ++(0.1,1.4);
- \fill[\duck@shovel] (0.6133, 0.9536) .. controls (0.8388, 0.8117) and (0.9253, 0.7517) .. (1.1962, 0.6696) -- (0.8332, 0.1263) .. controls (0.6458, 0.11) and (0.5417, 0.1644) .. (0.4517, 0.3034) -- cycle;
-\fi
-%
-% pickaxe %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@pickaxe
- \fill[brown!80!black,rotate around={-23:(0.91, 0.88)}] (0.87, 0.28) rectangle ++(0.1,1.4);
- \fill[\duck@pickaxe] (-0.0085, 0.6858) .. controls (0.6422, 0.3523) and (0.7609, 0.3068) .. (1.4114, 0.1108) .. controls (0.6589, 0.1246) and (0.5556, 0.1887) .. (-0.0085, 0.6858) -- cycle;
-\fi
-%
-% strawbroom %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@strawbroom
- \fill[\duck@strawbroomstick] (0.9160,0.5478) -- (1.2792,1.6574) .. controls (1.3063,1.6961) and (1.3956,1.6649) .. (1.3688,1.6176) -- (0.9508,0.5179) .. controls (0.9360,0.5142) and (0.9202,0.5331) .. (0.9160,0.5478) -- cycle;
- \fill[\duck@strawbroom] (0.5528,0.2890) .. controls (0.6449,0.3598) and (0.7460,0.5693) .. (0.8911,0.6871) .. controls (0.9481,0.7215) and (1.0395,0.6925) .. (1.0553,0.6224) .. controls (1.1219,0.4385) and (0.9965,0.2147) .. (1.0056,0.1000) .. controls (0.8926,0.0241) and (0.5950,0.2078) .. (0.5528,0.2890) -- cycle;
- \draw[\duck@strawbroomribbon,line width=\scalingfactor*0.4pt] (0.7916,0.5876) .. controls (0.7916,0.5876) and (0.8210,0.5404) .. (0.8451,0.5304) .. controls (0.8708,0.5197) and (0.9021,0.5419) .. (0.9284,0.5329) .. controls (0.9544,0.5240) and (0.9663,0.4903) .. (0.9919,0.4806) .. controls (1.0148,0.4720) and (1.0653,0.4781) .. (1.0653,0.4781);
- \draw[\duck@strawbroomribbon,line width=\scalingfactor*0.4pt] (0.7565,0.5493) .. controls (0.7565,0.5493) and (0.7897,0.4961) .. (0.8169,0.4848) .. controls (0.8458,0.4727) and (0.8812,0.4978) .. (0.9109,0.4876) .. controls (0.9401,0.4776) and (0.9535,0.4396) .. (0.9824,0.4287) .. controls (1.0083,0.4189) and (1.0652,0.4259) .. (1.0652,0.4259);
-\fi
-%
-% broom %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@broom
- \scope[rotate=-10]
- \draw[\duck@broomstick,line width=\scalingfactor*1.8pt] (0.9, 1.8) -- ++(0,-1.4);
- \draw[\duck@broomstick,line width=\scalingfactor*1.8pt] (0.6, 0.42) -- ++(0.6,0);
- \fill[\duck@broom] (0.6, 0.40) -- ++(-0.05,-0.1) -- ++(0.7,0) -- ++(-0.05, 0.1) -- cycle;
- \endscope
-\fi
-%
-% umbrella %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@umbrella
- \path (0.2,0.4) rectangle (2.22,2.7);
- \fill[gray,overlay] (0.6922,0.5942) -- (0.7426,0.6103) .. controls (0.8276,0.3884) and (0.8855,0.4523) .. (0.9333,0.6543) -- (0.9334,0.6545) -- (0.9335,0.6547) .. controls (1.0347,1.0671) and (1.2906,1.9565) .. (1.2906,1.9565) -- (1.3415,1.9419) .. controls (1.3415,1.9419) and (1.0855,1.0519) .. (0.9849,0.6423) -- (0.9848,0.6420) .. controls (0.9240,0.3633) and (0.7874,0.3312) .. (0.6922,0.5942) -- cycle;
- \fill[\duck@umbrella,overlay] (0.2185,1.9927) .. controls (0.3559,2.1962) and (0.6837,2.0720) .. (0.6761,1.8240) .. controls (0.8398,2.0111) and (1.1891,1.9216) .. (1.1685,1.6915) .. controls (1.3000,1.8765) and (1.6639,1.7626) .. (1.6607,1.5356) .. controls (1.7865,1.7271) and (2.1350,1.6950) .. (2.1626,1.4589) .. controls (2.4996,2.5771) and (0.5644,3.2631) .. (0.2185,1.9927) -- cycle;
-\fi
-%
-% closed umbrella %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@umbrellaclosed
- \fill[gray] (1.3401,0.6996) -- (1.2872,0.7019) .. controls (1.2840,0.9395) and (1.2076,0.8995) .. (1.0930,0.7264) -- (1.0929,0.7262) -- (1.0928,0.7261) .. controls (0.8555,0.3739) and (0.9223,0.4608) .. (0.9223,0.4608) -- (0.8795,0.4920) .. controls (0.8795,0.4920) and (0.8131,0.4057) .. (1.0488,0.7554) -- (1.0489,0.7556) .. controls (1.2022,0.9963) and (1.3414,0.9793) .. (1.3401,0.6996) -- cycle;
- \fill[\duck@umbrellaclosed] (0.6827,0.1263) -- (0.8038,0.6188) -- (0.9548,0.6494) -- (0.9520,0.8231) -- (1.1945,0.6529) -- (1.0218,0.5885) -- (1.0465,0.4566) -- cycle;
-\fi
-%
-% handbag %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@handbag
- \fill[\duck@handbag] (0.7811,0.1751) -- (1.4913,0.3097) -- (1.3315,0.7086) -- (0.7832,0.6152) -- cycle;
- \fill[\duck@handbag!70!black] (0.8857,0.4354) .. controls (0.7861,0.9811) and (1.1796,1.0719) .. (1.2866,0.5155) -- (1.2043,0.4996) .. controls (1.1247,0.8952) and (0.9051,0.8883) .. (0.9676,0.4536) -- cycle;
-\fi
-%
-% cocktail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@cocktail
- \fill[cyan!10!white, rotate=-10] (0.8,0.50) ellipse[x radius=0.17, y radius=0.05];
- \fill[cyan!10!white, rotate=-10] (0.8,0.55) ellipse[x radius=0.12, y radius=0.03];
- \fill[cyan!10!white, rotate=-10] (0.8,0.7) ellipse[x radius=0.03, y radius=0.2];
- \fill[cyan!10!white] (0.92,0.6) -- (0.75,0.9) -- (1.18,0.83) -- cycle;
- \fill[gray!60!white] (0.928,0.64) -- (0.85,0.77) -- (1.08,0.77) -- cycle;
- \fill[green!40!brown!60!white] (0.94,0.71) circle[radius=0.04];
- \fill[red!80!black] (0.94,0.72) circle[radius=0.01];
-\fi
-%
-% banana %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@banana
- \begin{scope}[yshift=10,xshift=19,rotate=-25,scale=1.3]
- \fill[\duck@banana!30!] (0.02,0) .. controls (0.21,0.20) and (0.21,0.40) .. (0.02,0.6) arc [start angle=60,end angle=120, radius =0.04] .. controls (0.07,0.40) and (0.07,0.20) .. (-0.02,0) --cycle ;
- %peel
- \begin{scope}
- \clip (-0.04,-0.01) rectangle (0.20,0.3);
- \fill[\duck@banana] (0.03,0) .. controls (0.22,0.20) and (0.22,0.40) .. (0.03,0.6) arc [start angle=60,end angle=120, radius =0.06] .. controls (0.06,0.40) and (0.06,0.20) .. (-0.03,0);
- \end{scope}
- \fill[\duck@banana!60!] (0.12,0.3) arc [start angle=140, end angle=-100, y radius=0.20, x radius=0.06] arc [start angle=-90, end angle=90, y radius=0.15, x radius=0.02] (0.12,0.3) arc [start angle=60, end angle=270, y radius=0.15, x radius=0.1] arc [start angle=270, end angle=90, y radius=0.13, x radius=0.04];
- \end{scope}
-\fi
-%
-% stick %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@stick
- \begin{scope}[rotate=-30,yshift=16,xshift=12]
- %leaf
- \begin{scope}[rotate=60, xshift=8.2,yshift=8.1]
- \fill[\duck@leaf] (-0.01,0) .. controls (-0.1,0) and (-0.02, 0.2) .. (0,0.2) .. controls (0.02, 0.2) and (0.1,0) .. (0.01,0.0);
- \path[clip] (-0.04,-0.04)-- (-0.01,0) .. controls (-0.1,0) and (-0.02, 0.2) .. (0,0.2) .. controls (0.02, 0.2) and (0.1,0) .. (0.01,0)-- (0.04,-0.04) --cycle;
- \draw[\duck@leaf!80!, line width=0.1] (0,-0.04) -- (0,0.2) \foreach \i in {0.02,0.04,...,0.2} {(0,\i) -- ++(0.1,\i) (0,\i) -- ++(-0.1,\i)} ;
- \end{scope}
- %stick itself
- \fill[\duck@stick!90!red] (-0.04,0.8) -- (-0.04,0.4) arc[start angle=345,end angle=270,radius=0.03] -- ++(0,-0.01) arc[start angle=90,end angle=15,radius=0.03] -- (-0.04,0) arc [start angle=180, end angle=360 ,x radius=0.04, y radius=0.02] -- (0.04, 0.4) arc [start angle=180, end angle=120, radius=0.08] arc [start angle=-90, end angle=90, x radius=0.02, y radius=0.04] arc [start angle=240, end angle=180, radius=0.08] -- (0.04,0.75) arc [start angle=0, end angle=120 ,x radius=0.04, y radius=0.02] --cycle;
- \fill[\duck@stick!90!] (0.08, 0.51) ellipse [x radius=0.02, y radius=0.04] (0,0.75) ellipse [x radius=0.04, y radius=0.02] ;
- \draw[\duck@stick!90!red, line width=0.06] (0.08, 0.51) ellipse [x radius=0.016, y radius=0.032]
- ellipse [x radius=0.012, y radius=0.024] ellipse [x radius=0.008, y radius=0.016] (0,0.75) ellipse [y radius=0.016, x radius=0.032] ellipse [y radius=0.012, x radius=0.024] ellipse [y radius=0.008, x radius=0.016] ;
- \fill[\duck@stick!90!red] (0.08, 0.51) ellipse [x radius=0.004, y radius=0.008] (0,0.75) ellipse [x radius=0.008, y radius=0.004];
- \end{scope}
-\fi
-%
-% overleaf duck %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@overleaf
- \fill[white] \duckpathoverleaf;
-\fi
-%
-% wing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifduck@wing
- \fill[\duck@wing] \duckpathwing;
-\fi
-%
-% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\csname duckhookforeground\endcsname
-%
-%\draw (current bounding box.north west) rectangle (current bounding box.south east);% For debugging bounding boxes
-%
-%\endscope
-}% from `\def\duck@draw{` at the very beginning
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Random ducks
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\pgfmathdeclarerandomlist{head}{{shorthair}{longhair}{crazyhair}{mohican}{mullet}{beard}{alien}{hat}{cap}{santa}{chef}{graduate}{beret}{magichat}{witch}{crown}{bunny}{peakedcap}{tophat}{queencrown}{kingcrown}{harlequin}{strawhat}{parting}}
-\pgfmathdeclarerandomlist{accessories}{{glasses}{sunglasses}{icecream}{book}{signpost}{magicwand}{cricket}{rollingpin}{lightsaber}{cake}{pizza}{hockey}{baguette}{football}{mask}{necklace}{milkshake}{wine}{prison}{cape}{torch}{crozier}{easter}{stethoscope}{neckerchief}{cheese}{shovel}{pickaxe}{crystalball}}
-
-\def\shuffleducks{%
- \pgfmathrandomitem{\head}{head}%
- \edef\randomhead{\head}%
- \pgfmathrandomitem{\accessories}{accessories}%
- \edef\randomaccessories{\accessories}%
-}
-
-\newcommand*{\randuck}[1][]{%
- \shuffleducks%
- \duck[\randomhead, \randomaccessories, #1]%
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Defining some of the more complicate paths for easy reuse
-%
-% naming scheme is \duckpath<name>
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-% body parts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\def\duckpathbody{%
- (0.513,1.145) .. controls (0.267, 1.102) and (-0.125,0.657) ..
- (0.289,0.261) .. controls (0.704,-0.135) and ( 2.863,0.130) ..
- (1.818,1.419) .. controls (0.938, 0.946) and ( 1.240,1.379) ..
- (0.513,1.145) -- cycle
-}
-
-\def\duckpathgrumpybill{%
- (0.406,1.472) .. controls (0.643,1.530) and (0.643,1.530) ..
- (0.800,1.300) .. controls (0.083,0.850) and (0.269,1.369) ..
- (0.406,1.472) -- cycle
-}
-
-\def\duckpathbill{%
- (0.406,1.472) .. controls (0.643,1.530) and (0.541,1.303) ..
- (0.910,1.370) .. controls (0.083,0.850) and (0.269,1.369) ..
- (0.406,1.472) -- cycle
-}
-
-\def\duckpathwing{%
- (1.47,0.56) .. controls (1.51,0.59) and (1.57,0.62) ..
- (1.60,0.66) .. controls (1.61,0.70) and (1.51,0.69) ..
- (1.47,0.69) .. controls (1.48,0.72) and (1.41,0.76) ..
- (1.37,0.74) .. controls (1.35,0.79) and (1.33,0.81) ..
- (1.25,0.80) .. controls (1.25,0.86) and (1.18,0.88) ..
- (1.15,0.88) .. controls (1.20,1.01) and (0.40,0.79) ..
- (0.52,0.57) .. controls (0.63,0.26) and (1.22,0.43) ..
- (1.47,0.56) -- cycle
-}
-
-% clothing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\def\duckpathtshirt{%
- (0.490,1.145) .. controls (0.267, 1.102) and (-0.125,0.657) ..
- (0.289,0.261) .. controls (0.704,-0.135) and ( 2.863,0.130) ..
- (1.818,1.419) .. controls (0.938, 0.976) and ( 1.240,1.279) ..
- (0.590,1.000) -- cycle
-}
-
-\def\duckpathjacket{%
- (0.490,1.145) .. controls (0.267, 1.102) and (-0.125,0.657) ..
- (0.289,0.261) .. controls (0.704,-0.135) and ( 2.863,0.130) ..
- (1.818,1.419) .. controls (0.880, 0.946) and ( 1.240,1.378) ..
- (0.513,0.700) -- cycle
-}
-
-% hair styles %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\def\duckpathshorthair{%
- (1.3947,1.4175) .. controls (1.4546,1.4518) and (1.4699,1.6566) ..
- (1.4343,1.7992) .. controls (1.2528,2.5033) and (0.2339,2.2710) ..
- (0.4151,1.5907) .. controls (0.4345,1.8709) and (0.7421,2.0999) ..
- (0.9494,1.9054) .. controls (1.2241,1.6476) and (1.3316,1.3814) ..
- (1.3947,1.4175) -- cycle
-}
-
-\def\duckpathlonghair{%
- (1.4508,0.7565) .. controls (1.5146,0.7888) and (1.5854,0.8216) ..
- (1.6247,0.8831) .. controls (1.5859,0.8847) and (1.4726,0.9457) ..
- (1.5587,0.9706) .. controls (1.6317,0.9685) and (1.7016,1.0046) ..
- (1.7314,1.0734) .. controls (1.7931,1.1660) and (1.6616,1.1176) ..
- (1.6277,1.1566) .. controls (1.6853,1.1741) and (1.7840,1.1829) ..
- (1.8123,1.2244) .. controls (1.7022,1.2488) and (1.5688,1.2663) ..
- (1.5063,1.3739) .. controls (1.4619,1.5143) and (1.4696,1.6649) ..
- (1.4340,1.8076) .. controls (1.2524,2.5117) and (0.2335,2.2794) ..
- (0.4060,1.5991) .. controls (0.4341,1.8793) and (0.6629,2.1130) ..
- (0.9011,1.9578) .. controls (1.2427,1.7382) and (1.3350,1.4214) ..
- (1.0905,1.0610) .. controls (1.0597,1.0109) and (1.1103,0.9166) ..
- (1.1805,0.8670) .. controls (1.2507,0.8174) and (1.3503,0.7853) ..
- (1.4508,0.7565) -- cycle
-}
-
-\def\duckpathcrazyhair{%
- (0.1977,1.9023) .. controls (0.2633,2.0599) and (0.4819,2.0547) ..
- (0.4713,2.0879) .. controls (0.4647,2.2106) and (0.2516,2.2392) ..
- (0.2516,2.2392) .. controls (0.4352,2.2933) and (0.7427,1.9304) ..
- (0.5743,2.3885) .. controls (0.6017,2.3633) and (0.8307,2.1739) ..
- (0.8082,2.4245) .. controls (0.8271,2.2885) and (0.9195,2.2400) ..
- (0.9933,2.2673) .. controls (1.0814,2.6593) and (0.9688,2.0034) ..
- (1.3350,2.3615) .. controls (1.3657,2.3292) and (1.1627,2.1043) ..
- (1.3424,2.1387) .. controls (1.3102,1.8312) and (1.5049,2.2623) ..
- (1.5049,2.2623) .. controls (1.5049,2.2623) and (1.4675,2.0493) ..
- (1.4287,1.9560) .. controls (1.4287,1.9560) and (1.6830,1.9470) ..
- (1.7178,1.8823) .. controls (1.1926,1.8054) and (2.0160,1.7277) ..
- (1.4923,1.7275) .. controls (1.5366,1.6685) and (1.3013,1.6009) ..
- (1.6500,1.5946) .. controls (0.8836,1.5797) and (1.2764,1.9221) ..
- (0.8957,2.0442) .. controls (0.5516,2.0958) and (0.5228,1.8527) ..
- (0.4695,1.7963) .. controls (0.4825,1.9607) and (0.3601,1.9095) ..
- (0.1977,1.9023) -- cycle
-}
-
-\def\duckpathrecedinghair{%
- (1.3385,1.4841) .. controls (1.4243,1.4529) and (1.4877,1.7127) ..
- (1.3964,1.8658) .. controls (1.1071,2.3511) and (0.5189,2.1609) ..
- (0.4381,1.6816) .. controls (0.4575,1.9618) and (0.9007,2.2059) ..
- (1.1308,2.0390) .. controls (1.4703,1.7469) and (1.0343,1.5949) ..
- (1.3385,1.4841) -- cycle
-}
-
-\def\duckpathmohican{%
- (0.7632,1.7935) .. controls (0.9223,2.3084) and (1.3870,1.8580) ..
- (1.3920,1.5854) .. controls (1.4233,2.1466) and (0.6812,2.5808) ..
- (0.6725,1.8166) .. controls (0.6725,1.8166) and (0.7615,1.7926) ..
- (0.7632,1.7935) -- cycle
-}
-
-\def\duckpathmullet{%
- (1.3723,1.2684) .. controls (1.3723,1.2684) and (1.5129,1.5571) ..
- (1.4435,1.7815) .. controls (1.2652,2.3572) and (0.3342,2.2633) ..
- (0.4106,1.5424) .. controls (0.4204,1.6825) and (0.5692,1.9195) ..
- (0.5692,1.9195) .. controls (0.5692,1.9195) and (0.8475,1.8402) ..
- (1.1031,1.7844) .. controls (1.0808,1.6260) and (1.1130,1.4754) ..
- (1.1130,1.4754) .. controls (1.1956,1.4198) and (1.3001,1.3369) ..
- (1.3723,1.2684) -- cycle
-}
-
-% Acessoires %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\def\duckpathqueencrown{%
- (0.7370,2.0732) .. controls (0.6966,2.2091) and (0.6769,2.3503) ..
- (0.6354,2.4859) .. controls (0.6149,2.5164) and (0.5958,2.5732) ..
- (0.6498,2.5808) .. controls (0.6973,2.5907) and (0.7091,2.5350) ..
- (0.6926,2.5016) .. controls (0.6967,2.4544) and (0.7188,2.4109) ..
- (0.7340,2.3665) .. controls (0.7415,2.3472) and (0.7619,2.2862) ..
- (0.7676,2.3381) .. controls (0.7755,2.3852) and (0.7871,2.4329) ..
- (0.7833,2.4808) .. controls (0.7597,2.5148) and (0.7834,2.5720) ..
- (0.8294,2.5570) .. controls (0.8775,2.5457) and (0.8536,2.4937) ..
- (0.8436,2.4638) .. controls (0.8502,2.3973) and (0.8640,2.3313) ..
- (0.8798,2.2664) .. controls (0.9047,2.2750) and (0.9168,2.3261) ..
- (0.9342,2.3514) .. controls (0.9492,2.3853) and (0.9714,2.4171) ..
- (0.9773,2.4540) .. controls (0.9645,2.4873) and (0.9766,2.5358) ..
- (1.0204,2.5303) .. controls (1.0646,2.5298) and (1.0691,2.4725) ..
- (1.0443,2.4460) .. controls (1.0440,2.3935) and (1.0580,2.3419) ..
- (1.0671,2.2905) .. controls (1.0706,2.2719) and (1.0788,2.2126) ..
- (1.0985,2.2554) .. controls (1.1269,2.3087) and (1.1558,2.3623) ..
- (1.1772,2.4187) .. controls (1.1697,2.4515) and (1.1716,2.5081) ..
- (1.2210,2.5018) .. controls (1.2706,2.4969) and (1.2686,2.4403) ..
- (1.2406,2.4126) .. controls (1.2279,2.3600) and (1.2211,2.3057) ..
- (1.2172,2.2518) .. controls (1.2296,2.2439) and (1.2538,2.2943) ..
- (1.2693,2.3112) .. controls (1.2908,2.3467) and (1.3228,2.3784) ..
- (1.3316,2.4200) .. controls (1.3203,2.4624) and (1.3708,2.5014) ..
- (1.4051,2.4678) .. controls (1.4448,2.4342) and (1.3945,2.3994) ..
- (1.3765,2.3710) .. controls (1.3022,2.2536) and (1.2440,2.1265) ..
- (1.1686,2.0097) .. controls (0.9649,1.9465) and (0.8367,1.9955) ..
- (0.7370,2.0732) -- cycle
-}
-
-\def\duckpathkingcrown{%
- (0.6572,2.0396) .. controls (0.6637,2.0838) and (0.6716,2.1289) ..
- (0.6684,2.1735) .. controls (0.6481,2.2496) and (0.5923,2.3131) ..
- (0.5818,2.3921) .. controls (0.5738,2.4607) and (0.6167,2.5343) ..
- (0.6862,2.5502) .. controls (0.7548,2.5703) and (0.8210,2.5304) ..
- (0.8720,2.4881) .. controls (0.8984,2.4712) and (0.9239,2.4324) ..
- (0.9486,2.4249) .. controls (0.9524,2.4691) and (0.9566,2.5158) ..
- (0.9844,2.5527) .. controls (1.0052,2.5845) and (1.0390,2.6282) ..
- (1.0820,2.6127) .. controls (1.1212,2.5899) and (1.1378,2.5421) ..
- (1.1478,2.5003) .. controls (1.1576,2.4639) and (1.1336,2.4180) ..
- (1.1349,2.3906) .. controls (1.2050,2.4269) and (1.2847,2.4629) ..
- (1.3654,2.4429) .. controls (1.4292,2.4285) and (1.4864,2.3679) ..
- (1.4793,2.2998) .. controls (1.4859,2.2404) and (1.4407,2.1925) ..
- (1.4006,2.1551) .. controls (1.3681,2.1232) and (1.3290,2.0951) ..
- (1.3072,2.0544) .. controls (1.2904,2.0121) and (1.2805,1.9674) ..
- (1.2738,1.9225) .. controls (1.1221,1.8892) and (0.9586,1.8836) ..
- (0.8112,1.9386) .. controls (0.7535,1.9608) and (0.6999,1.9945) ..
- (0.6572,2.0396) -- cycle
-}
-
-\def\duckpathdarthvader{%
- (0.4264,1.9092) .. controls (0.4347,1.9248) and (0.4612,1.9186) ..
- (0.4969,1.9783) .. controls (0.5499,2.0670) and (0.7559,2.2377) ..
- (0.9889,2.2057) .. controls (1.2691,2.1668) and (1.4075,1.8829) ..
- (1.4176,1.7421) .. controls (1.4279,1.5955) and (1.5246,1.3484) ..
- (1.5246,1.3484) --
- (0.9846,1.2036) .. controls (1.0898,1.2735) and (1.0667,1.5598) ..
- (1.0555,1.6034) .. controls (0.9758,1.9147) and (0.8121,1.8681) ..
- (0.7174,1.7694) .. controls (0.5671,2.0370) and (0.4103,1.7556) ..
- (0.4132,1.472) --
- (0.3529,1.415) .. controls (0.3529,1.43938) and (0.3893,1.8379)..
- (0.4264,1.9092) -- cycle
-}
-
-\def\duckpathhorsetail{%
- (1.7248,1.3553) .. controls (2.0530,1.3369) and (2.1427,1.1604) ..
- (2.2915,0.9970) .. controls (2.4759,0.7946) and (2.9531,0.8890) ..
- (2.7668,0.9003) .. controls (2.4670,0.9184) and (2.5158,1.1488) ..
- (2.3907,1.3152) .. controls (2.2788,1.4641) and (1.9414,1.5945) ..
- (1.7248,1.3553) -- cycle
-}
-
-\def\duckpathcape{%
- (0.225,0.966) .. controls (1.314,0.961) and (2.070,0.650) ..
- (2.042,1.245) .. controls (1.863,1.164) and (1.844,1.173) ..
- (1.792,1.340) .. controls (1.635,1.235) and (1.620,1.268) ..
- (1.567,1.393) .. controls (1.358,1.086) and (0.664,1.096) ..
- (0.460,1.110) .. controls (0.461,1.133) and (0.305,1.077) ..
- (0.235,0.966) -- cycle
-}
-
-\def\duckpathcrown{%
- (0.7365,2.0616) .. controls (0.7365,2.0616) and (0.7771,2.1763) ..
- (0.6959,2.4650) -- (0.8895,2.2378) -- (1.0391,2.3943) --
- (1.1260,2.1961) --
- (1.3938,2.3318) .. controls (1.1927,2.1132) and (1.2194,1.9764) ..
- (1.2194,1.9764) .. controls (1.0774,1.9202) and (0.8507,1.9601) ..
- (0.7365,2.0616) -- cycle
-}
-
-\def\duckpathtorch{%
- (1.4338,1.0258) .. controls (1.4308,0.8877) and (1.3468,0.8997) ..
- (1.2447,0.7481) .. controls (1.1427,0.8982) and (1.0721,0.8892) ..
- (1.0646,1.0243) .. controls (1.0541,1.1714) and (1.2642,1.1654) ..
- (1.2492,1.3860) .. controls (1.3093,1.3110) and (1.4383,1.2705) ..
- (1.4338,1.0258) -- cycle
-}
-
-\def\duckpathoverleaf{%
- (1.2699,0.6095) .. controls (1.2710,0.5992) and (1.2752,0.5910) .. (1.2822,0.5852) .. controls (1.2892,0.5793) and (1.2983,0.5763) .. (1.3095,0.5763) .. controls (1.3165,0.5762) and (1.3233,0.5778) .. (1.3295,0.5809) .. controls (1.3353,0.5840) and (1.3401,0.5885) .. (1.3436,0.5940) -- (1.3792,0.5940) .. controls (1.3731,0.5785) and (1.3640,0.5664) .. (1.3521,0.5578) .. controls (1.3398,0.5492) and (1.3252,0.5447) .. (1.3103,0.5449) .. controls (1.3002,0.5448) and (1.2902,0.5467) .. (1.2808,0.5505) .. controls (1.2718,0.5544) and (1.2636,0.5601) .. (1.2567,0.5672) .. controls (1.2500,0.5742) and (1.2446,0.5825) .. (1.2410,0.5915) .. controls (1.2372,0.6005) and (1.2353,0.6101) .. (1.2353,0.6198) .. controls (1.2352,0.6294) and (1.2370,0.6389) .. (1.2404,0.6479) .. controls (1.2438,0.6567) and (1.2489,0.6647) .. (1.2554,0.6715) .. controls (1.2625,0.6790) and (1.2709,0.6850) .. (1.2802,0.6892) .. controls (1.2891,0.6933) and (1.2988,0.6954) .. (1.3086,0.6955) .. controls (1.3207,0.6955) and (1.3325,0.6926) .. (1.3432,0.6871) .. controls (1.3540,0.6813) and (1.3633,0.6732) .. (1.3705,0.6634) .. controls (1.3751,0.6571) and (1.3786,0.6501) .. (1.3807,0.6427) .. controls (1.3831,0.6341) and (1.3842,0.6253) .. (1.3841,0.6164) .. controls (1.3840,0.6139) and (1.3839,0.6119) .. (1.3837,0.6092) .. controls (1.3458,0.6093) and (1.3079,0.6094) .. (1.2699,0.6095) -- cycle(1.3486,0.6358) .. controls (1.3458,0.6453) and (1.3410,0.6525) .. (1.3343,0.6575) .. controls (1.3276,0.6625) and (1.3192,0.6650) .. (1.3090,0.6650) .. controls (1.3004,0.6651) and (1.2920,0.6622) .. (1.2852,0.6570) .. controls (1.2783,0.6517) and (1.2733,0.6443) .. (1.2711,0.6359) .. controls (1.2969,0.6359) and (1.3228,0.6358) .. (1.3486,0.6358) -- cycle(1.5160,0.5487) -- (1.5160,0.5662) .. controls (1.5122,0.5593) and (1.5064,0.5538) .. (1.4992,0.5505) .. controls (1.4920,0.5471) and (1.4828,0.5455) .. (1.4715,0.5455) .. controls (1.4505,0.5455) and (1.4329,0.5527) .. (1.4187,0.5670) .. controls (1.4046,0.5814) and (1.3976,0.5993) .. (1.3975,0.6206) .. controls (1.3975,0.6303) and (1.3993,0.6401) .. (1.4029,0.6492) .. controls (1.4063,0.6580) and (1.4114,0.6661) .. (1.4180,0.6729) .. controls (1.4246,0.6801) and (1.4327,0.6857) .. (1.4416,0.6895) .. controls (1.4509,0.6932) and (1.4608,0.6950) .. (1.4708,0.6949) .. controls (1.4800,0.6951) and (1.4891,0.6933) .. (1.4976,0.6896) .. controls (1.5050,0.6862) and (1.5112,0.6807) .. (1.5156,0.6739) -- (1.5156,0.6911) -- (1.5480,0.6911) -- (1.5480,0.5485) -- (1.5160,0.5485) -- (1.5160,0.5487) -- cycle(1.4436,0.5910) .. controls (1.4513,0.5831) and (1.4619,0.5787) .. (1.4729,0.5789) .. controls (1.4833,0.5789) and (1.4926,0.5829) .. (1.5006,0.5911) .. controls (1.5083,0.5986) and (1.5126,0.6088) .. (1.5126,0.6196) .. controls (1.5127,0.6307) and (1.5084,0.6414) .. (1.5006,0.6494) .. controls (1.4926,0.6577) and (1.4833,0.6619) .. (1.4727,0.6619) .. controls (1.4618,0.6621) and (1.4514,0.6577) .. (1.4439,0.6499) .. controls (1.4361,0.6423) and (1.4318,0.6318) .. (1.4317,0.6205) .. controls (1.4315,0.6092) and (1.4355,0.5991) .. (1.4436,0.5910) -- cycle(1.6366,0.6913) -- (1.6366,0.6617) -- (1.6127,0.6617) -- (1.6127,0.5487) -- (1.5806,0.5487) -- (1.5806,0.6617) -- (1.5637,0.6617) -- (1.5637,0.6913) -- (1.5796,0.6913) -- (1.5796,0.6952) .. controls (1.5796,0.7102) and (1.5838,0.7214) .. (1.5922,0.7288) .. controls (1.6005,0.7362) and (1.6131,0.7399) .. (1.6300,0.7399) .. controls (1.6324,0.7398) and (1.6347,0.7396) .. (1.6370,0.7395) -- (1.6370,0.7097) -- (1.6347,0.7097) .. controls (1.6272,0.7097) and (1.6218,0.7084) .. (1.6186,0.7059) .. controls (1.6154,0.7034) and (1.6138,0.6993) .. (1.6138,0.6936) -- (1.6138,0.6910) .. controls (1.6214,0.6913) and (1.6290,0.6912) .. (1.6366,0.6913) -- cycle(1.1906,0.5487) -- (1.2231,0.5487) -- (1.2231,0.7374) -- (1.1906,0.7374) -- cycle(0.9820,0.6095) .. controls (0.9831,0.5992) and (0.9872,0.5910) .. (0.9943,0.5852) .. controls (1.0013,0.5793) and (1.0104,0.5763) .. (1.0216,0.5763) .. controls (1.0285,0.5762) and (1.0354,0.5778) .. (1.0416,0.5809) .. controls (1.0474,0.5839) and (1.0522,0.5885) .. (1.0556,0.5940) -- (1.0914,0.5940) .. controls (1.0854,0.5785) and (1.0763,0.5664) .. (1.0643,0.5578) .. controls (1.0522,0.5492) and (1.0382,0.5449) .. (1.0225,0.5449) .. controls (1.0124,0.5448) and (1.0024,0.5467) .. (0.9931,0.5505) .. controls (0.9840,0.5544) and (0.9758,0.5601) .. (0.9690,0.5672) .. controls (0.9622,0.5742) and (0.9569,0.5825) .. (0.9532,0.5915) .. controls (0.9495,0.6005) and (0.9475,0.6101) .. (0.9475,0.6198) .. controls (0.9475,0.6294) and (0.9492,0.6389) .. (0.9527,0.6479) .. controls (0.9560,0.6567) and (0.9611,0.6647) .. (0.9677,0.6715) .. controls (0.9747,0.6790) and (0.9830,0.6850) .. (0.9924,0.6892) .. controls (1.0012,0.6933) and (1.0109,0.6955) .. (1.0207,0.6955) .. controls (1.0327,0.6955) and (1.0446,0.6927) .. (1.0552,0.6871) .. controls (1.0660,0.6813) and (1.0753,0.6732) .. (1.0826,0.6634) .. controls (1.0871,0.6571) and (1.0906,0.6501) .. (1.0926,0.6427) .. controls (1.0949,0.6341) and (1.0960,0.6253) .. (1.0959,0.6164) .. controls (1.0959,0.6139) and (1.0957,0.6119) .. (1.0956,0.6092) .. controls (1.0577,0.6100) and (1.0199,0.6095) .. (0.9820,0.6095) -- cycle(1.0606,0.6358) .. controls (1.0578,0.6453) and (1.0531,0.6526) .. (1.0463,0.6575) .. controls (1.0397,0.6625) and (1.0312,0.6650) .. (1.0210,0.6650) .. controls (1.0124,0.6651) and (1.0041,0.6622) .. (0.9973,0.6570) .. controls (0.9903,0.6517) and (0.9853,0.6443) .. (0.9830,0.6359) .. controls (1.0089,0.6359) and (1.0348,0.6358) .. (1.0606,0.6358) -- cycle(1.1761,0.6624) .. controls (1.1632,0.6614) and (1.1542,0.6580) .. (1.1492,0.6523) .. controls (1.1441,0.6465) and (1.1415,0.6363) .. (1.1415,0.6214) -- (1.1415,0.5487) -- (1.1083,0.5487) -- (1.1083,0.6913) -- (1.1394,0.6913) -- (1.1394,0.6748) .. controls (1.1438,0.6808) and (1.1494,0.6856) .. (1.1559,0.6891) .. controls (1.1621,0.6923) and (1.1690,0.6938) .. (1.1760,0.6937) .. controls (1.1760,0.6833) and (1.1761,0.6728) .. (1.1761,0.6624) -- cycle(0.8646,0.8092) .. controls (0.8244,0.8248) and (0.6787,0.8306) .. (0.6784,0.7437) .. controls (0.6359,0.7165) and (0.6078,0.6721) .. (0.6078,0.6246) .. controls (0.6077,0.5410) and (0.7016,0.4916) .. (0.7705,0.5391) .. controls (0.8394,0.5866) and (0.8268,0.6919) .. (0.7486,0.7217) .. controls (0.7411,0.7246) and (0.7248,0.7297) .. (0.7117,0.7286) .. controls (0.6931,0.7168) and (0.6704,0.6924) .. (0.6597,0.6682) .. controls (0.6918,0.7064) and (0.7528,0.6983) .. (0.7737,0.6530) .. controls (0.7947,0.6076) and (0.7614,0.5559) .. (0.7115,0.5562) .. controls (0.6914,0.5562) and (0.6724,0.5649) .. (0.6594,0.5802) .. controls (0.6410,0.6019) and (0.6363,0.6254) .. (0.6400,0.6484) .. controls (0.6532,0.7289) and (0.7487,0.7748) .. (0.8197,0.7924) .. controls (0.7966,0.7801) and (0.7548,0.7600) .. (0.7255,0.7380) .. controls (0.8108,0.7051) and (0.8246,0.7770) .. (0.8646,0.8092) -- cycle(0.8731,0.5487) -- (0.8189,0.6913) -- (0.8542,0.6913) -- (0.8874,0.5965) -- (0.9217,0.6913) -- (0.9561,0.6913) -- (0.8991,0.5487) -- cycle
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Picture mode ducks
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\def\picduck{%
- % bill %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \qbezier(6.5,29.5)(-1,17.5)(16.8,27.3)
- \qbezier(6.5,29.5)(9,30.5)(11.4,28.0)
- \qbezier(11.4,28.0)(13.5,26.5)(16.8,27.3)
- % head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \qbezier(06.5,29.5)(6,41.5)(16.8,42.4)
- \qbezier(16.8,42.4)(29,41)(25.3,24)
- % body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \qbezier(7.8,23.2)(8,22.8)(8,22.5)
- \qbezier(8,22.5)(-5,9)(8,3)
- \qbezier(8,3)(22,-2)(35,6.5)
- \qbezier(35,6.5)(46,15)(35,28.3)
- \qbezier(35,28.3)(30,25)(25.3,24)
- % right eye %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \qbezier(13,32)(13.8,34.5)(16,34)
- \qbezier(16,34)(17.3,33.2)(16.7,31)
- \qbezier(16.7,31)(16,29.1)(14.5,29.3)
- \qbezier(14.5,29.3)(12.7,29.5)(13,32)
- \put(15.3,31.3){\circle*{1.8}}
- % left eye %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \qbezier(7.7,33.2)(8.4,35.7)(10.3,35)
- \qbezier(10.3,35)(11.2,34)(10.4,32.2)
- \qbezier(10.4,32.2)(9.7,30.7)(8.7,30.7)
- \qbezier(8.7,30.7)(7.2,30.9)(7.7,33.2)
- \put(9.5,32.7){\circle*{1.5}}
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% 32237378723223
-% 23737232212232237822
-% 3282232232232232232<3723
-% 382232232232232232232232232
-% 72232322323323223223223223282
-% 7503223223522332322322322322372
-% 9hklke23232<252<2322322322322323
-% 9jzltrg22320fklke23232232232232232
-% 0lzp ye252qkzliuk92323223223223223
-% 2dkfaw233<fzl, .g623232232232232282
-% 3<<432325<eklits9232322322322322322
-% ++#@o$;<32329edw22322322322322322323
-% o++oo@oooo%::12<<<<123223223223223223 328
-% o++o+oo+o+oooooO@=*:<32232232232232232 323782282
-% +o+oo+o+oooooo%-:12232232232232232232 23237322322373
-% ++@+++o o+%-:<32232232232232232232232 32237822322322322322
-% +oOoo&><<32232232232232232232232232282822322322322322322372
-% 37232232232232232232232232232232232232232232232232232237<
-% 728282232232232232232232232232232232232232232232232232232232
-% 282232232232232232232232232232232232232232232232232232232232232
-% 282232232232232232232232232232232232232232232232232232232232232282
-% 7322322322322322322322322322322322322322322322322322322322322322322
-% 23223223223223223223223223223223223223223223223223223223223223223223
-%322322322322322322322322322322322322322322322322322322322322322322322
-%322322322322322322322322322322322322322322322322322322322322322322322
-%232232232232232232232232232232232232232232232232232232232232232232282
-%82232232232232232232232232232232232232232232232232232232232232232282
-%3223223223223223223223223223223223223223223223223223223223223223282
-%273223223223223223223223223223223223223223223223223223223223223723
-% 273223223223223223223223223223223223223223223223223223223223723
-% 228223223223223223223223223223223223223223223223223223228232
-% 2822322322322322322322322322322322322322322322322378232
-% 2378223223223223223223223223223223223223223782232
-% 322378282232232232232232232232282878223223
-% 223232232282828282322322323223
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% stripes for sports jerseys
-%
-% code contributed by Carla Maggi
-% https://tex.stackexchange.com/a/387126/36296
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\tikzset{
- /stripes/.cd,
- color/.code = \def\stripes@color{#1},
- distance/.code = \def\stripes@distance{#1},
- width/.code = \def\stripes@width{#1},
- height/.code = \def\stripes@height{#1},
- initialx/.code = \def\stripes@initialx{#1},
- initialy/.code = \def\stripes@initialy{#1},
- rotate/.code = \def\stripes@rotate{#1},
- emblem/.code = \def\stripes@emblem{#1},
- % setting defaults %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- color = black,
- distance = 0.3,
- width = 0.15,
- height = 2.7,
- initialx = 0.1,
- initialy = -0.3,
- rotate = -10,
- emblem = \empty
-}
-
-\def\stripes@draw{%
- \path (0.1,0.1) rectangle (2.1,1.45);
- \pgfinterruptboundingbox
- \scope
- \clip \duckpathjacket;
- \foreach \shifta in {0,\stripes@distance,...,2.4}{%
- \fill[\stripes@color,rotate around={\stripes@rotate:(1.2,0.9)}]
- ($(\stripes@initialx,\stripes@initialy)+(\shifta,0)$) rectangle ($(\stripes@initialx,\stripes@initialy)+(\shifta,0)+(\stripes@width,\stripes@height)$);
- }
- \endscope
- \endpgfinterruptboundingbox
- \node at (wing) {\stripes@emblem };
-}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%.........................%%%%%%%%%%%%%%%%%%%.........................
-%....................%%%%%%%%%............%%%%%%%%....................
-%................%%%%%%....%%...................%%%%%%................
-%.............%%%%%.......%%%.......................%%%%%.............
-%...........%%%%........%%%%%%%%%...................%%%%%%%...........
-%.........%%%........%%%%%%%%%%%%%%%%..............%%%%%%%%%%.........
-%.......%%%.......%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.......
-%......%%%...%%%%%%%%%%%%%%%%%%%%%%%%%%..............%%%%%%%%%%%......
-%.....%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%................%%%%%%%%%%%.....
-%...%%%%........%%%%%%%%%%%%%%%%%%%%%...................%%%%%%%%%%%...
-%...%%%..........%%%%%%%%%%%%%%%%%%%.....................%%%%%%%%%%...
-%..%%%............%%%%%%%%%%%%%%%%%.......................%%%%%%%%%%..
-%.%%%%............%%%%%%%%%%%%%%%%%........................%%%%%%%%%%.
-%.%%%..............%%%%%%%.......%%%......................%%%.....%%%.
-%%%%..............%%...............%%%...................%%%.......%%%
-%%%..............%%.................%%%..................%%.........%%
-%%%%............%%%...................%%%...............%%..........%%
-%%%%...........%%%.....................%%%.............%%...........%%
-%%%%%..........%%........................%%%%%%%%%%%%%%%%...........%%
-%%%%%........%%%........................%%%%%%%%%%%%%%%%%%.........%%%
-%.%%%%%%%%%%%%%%%......................%%%%%%%%%%%%%%%%%%%.........%%.
-%.%%%%%%%%%%%%%%%%.....................%%%%%%%%%%%%%%%%%%%........%%%.
-%..%%%%%%%%%%%%%%%%...................%%%%%%%%%%%%%%%%%%%%%.......%%..
-%...%%%%%%%%%%%%%%%%%................%%%%%%%%%%%%%%%%%%%%%%......%%...
-%...%%%%%%%%%%%%%%%%%%............%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%....
-%.....%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%....%%%.....
-%......%%%%%%%%%%%%%%%%................%%%%%%%%%%%%%%%%......%%%......
-%.......%%%%%%%%%%%%%%....................%%%%%%%%%%........%%%.......
-%.........%%%%%%%%%%%........................%%%%.........%%%.........
-%...........%%%%%%%%%........................%%........%%%%...........
-%.............%%%%%%%%%.....................%%......%%%%%.............
-%................%%%%%%%%.................%%%...%%%%%%................
-%....................%%%%%%%%......%%%%%%%%%%%%%%%....................
-%..........................%%%%%%%%%%%%%%%%%..........................
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/graphics/pgf/contrib/tikzducks/tikzducks-plain.tex b/graphics/pgf/contrib/tikzducks/tikzducks-plain.tex
deleted file mode 100644
index 9b01fb4d62..0000000000
--- a/graphics/pgf/contrib/tikzducks/tikzducks-plain.tex
+++ /dev/null
@@ -1,61 +0,0 @@
-% !TeX root = ./testing/plain_duck.tex
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% The tikzducks package
-% A package to bring rubber ducks into tikz
-% Maintained by samcarter
-%
-% Project repository and bug tracker:
-% https://github.com/samcarter/tikzducks
-%
-% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\input miniltx
-\input graphicx.sty
-\input tikz.tex
-\usetikzlibrary{calc}%
-\usetikzlibrary{patterns}%
-
-\catcode`\@=11
-
-\let\pdfrandomseed\randomseed
-\font\tiny=cmr5
-
-% Duck %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\duck{\futurelet\next\doduck}
-\def\doduck{%
- \ifx[\next %]
- \expandafter\doduckopt
- \else
- \scope%%
- \tikzset{/duck/.cd}%
- \duck@draw%
- \endscope%%
- \fi
-}
-\def\doduckopt[#1]{%
- \scope%%
- \tikzset{/duck/.cd,#1}%
- \duck@draw%
- \endscope%%
-}
-
-% Stripes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\stripes{\futurelet\next\dostripes}
-\def\dostripes{
- \ifx[\next %]
- \expandafter\dostripesopt
- \else
- \tikzset{/stripes/.cd}\stripes@draw
- \fi
-}
-\def\dostripesopt[#1]{%
- \tikzset{/stripes/.cd,#1}\stripes@draw
-}
-
-\input tikzducks-generic.tex
-
-\catcode`\@=12 \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzducks/tikzducks.sty b/graphics/pgf/contrib/tikzducks/tikzducks.sty
index 786b0e269a..a2cc6c302f 100644
--- a/graphics/pgf/contrib/tikzducks/tikzducks.sty
+++ b/graphics/pgf/contrib/tikzducks/tikzducks.sty
@@ -9,25 +9,27 @@
% https://github.com/samcarter/tikzducks
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzducks}[2024/04/27 version v1.8 Draw rubber ducks in TikZ]
+\ProvidesPackage{tikzducks}[2025/01/31 version v2.0 Draw rubber ducks in TikZ]
-\RequirePackage{expl3}
\RequirePackage{tikz}
-\usetikzlibrary{patterns} % for the wizard hat
+\usetikzlibrary{patterns.meta} % for the wizard hat
\usetikzlibrary{calc} % for the sports jerseys
+\usetikzlibrary{decorations.shapes} % for sombrero
+\usetikzlibrary{decorations.pathmorphing}
-\definecolor{duck@overleafcol}{RGB}{72,172,60}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% misc helper code
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newcommand*{\duck}[1][]{%
- \begin{scope}%
- \tikzset{/duck/.cd,#1}%
- \duck@draw%
- \end{scope}%
-}
+% colour for the overleaf duck
+\definecolor{duck@overleafcol}{RGB}{72,172,60}
+% using a random seed, e.g. for randuck
\ExplSyntaxOn
\ifdefined\sys_rand_seed:
\pgfmathsetseed {\sys_rand_seed:}
@@ -44,9 +46,1849 @@
\fi
\ExplSyntaxOff
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Options
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% for randomhead and randomaccessoires
+\def\duck@listhead{}
+\def\duck@listacces{}
+
+\ExplSyntaxOn
+% based on https://topanswers.xyz/tex?q=8082#a7698
+\NewDocumentCommand{\duck@ini}{om}{
+ \expandafter\newif\csname ifduck@#2\endcsname
+ \IfValueT{#1}{
+ \tl_put_right:cn { duck@list#1 } { {#2} }
+ }
+}
+\ExplSyntaxOff
+
+\duck@ini{name}
+\duck@ini{invisible}
+% Environment %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\duck@ini{water}
+% body parts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\duck@ini{grumpy}
+\duck@ini{laughing}
+\duck@ini{parrot}
+% hair styles %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\duck@ini[head]{shorthair}
+\duck@ini[head]{longhair}
+\duck@ini[head]{crazyhair}
+\duck@ini[head]{recedinghair}
+\duck@ini{eyebrow}
+\duck@ini[head]{beard}
+\duck@ini[head]{mohican}
+\duck@ini[head]{mullet}
+\duck@ini[head]{parting}
+% clothing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\duck@ini{clothing}
+\duck@ini{tshirt}
+\duck@ini{jacket}
+\duck@ini{tie}
+\duck@ini[acces]{cape}
+\duck@ini{stripes}
+\duck@ini[acces]{bowtie}
+\duck@ini{lapel}
+\duck@ini{aodai}
+\duck@ini[acces]{scarf}
+% Headgear %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\duck@ini[head]{alien}
+\duck@ini[head]{hat}
+\duck@ini[head]{cap}
+\duck@ini[head]{santa}
+\duck@ini{unicorn}
+\duck@ini[head]{magichat}
+\duck@ini[head]{chef}
+\duck@ini[head]{witch}
+\duck@ini[head]{graduate}
+\duck@ini[head]{beret}
+\duck@ini[head]{crown}
+\duck@ini[head]{queencrown}
+\duck@ini[head]{kingcrown}
+\duck@ini[head]{peakedcap}
+\duck@ini[head]{bunny}
+\duck@ini[head]{tophat}
+\duck@ini[head]{darthvader}
+\duck@ini[head]{harlequin}
+\duck@ini[head]{strawhat}
+\duck@ini[head]{helmet}
+\duck@ini[head]{viking}
+\duck@ini[head]{devil}
+\duck@ini[head]{conicalhat}
+\duck@ini[head]{sailor}
+\duck@ini[head]{bobblehat}
+\duck@ini[head]{sombrero}
+% Accessories %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\duck@ini[acces]{glasses}
+\duck@ini[acces]{sunglasses}
+\duck@ini[acces]{squareglasses}
+\duck@ini[acces]{icecream}
+\duck@ini[acces]{book}
+\duck@ini[acces]{magicwand}
+\duck@ini[acces]{cricket}
+\duck@ini[acces]{rollingpin}
+\duck@ini[acces]{signpost}
+\duck@ini[acces]{lightsaber}
+\duck@ini[acces]{cake}
+\duck@ini[acces]{pizza}
+\duck@ini[acces]{hockey}
+\duck@ini[acces]{baguette}
+\duck@ini[acces]{football}
+\duck@ini[acces]{mask}
+\duck@ini[acces]{necklace}
+\duck@ini[acces]{milkshake}
+\duck@ini[acces]{wine}
+\duck@ini[acces]{prison}
+\duck@ini{speech}
+\duck@ini{think}
+\duck@ini[acces]{torch}
+\duck@ini[acces]{easter}
+\duck@ini[acces]{basket}
+\duck@ini{buttons}
+\duck@ini{sheep}
+\duck@ini{horsetail}
+\duck@ini[acces]{crozier}
+\duck@ini{davidlikespineapplepizza}
+\duck@ini{wing}
+\duck@ini[acces]{stethoscope}
+\duck@ini[acces]{neckerchief}
+\duck@ini{snowduck}
+\duck@ini{vampire}
+\duck@ini[acces]{crystalball}
+\duck@ini[acces]{cheese}
+\duck@ini[acces]{shovel}
+\duck@ini[acces]{pickaxe}
+\duck@ini[acces]{strawbroom}
+\duck@ini[acces]{broom}
+\duck@ini[acces]{umbrella}
+\duck@ini[acces]{umbrellaclosed}
+\duck@ini[acces]{handbag}
+\duck@ini[acces]{cocktail}
+\duck@ini{overleaf}
+\duck@ini[acces]{banana}
+\duck@ini[acces]{stick}
+\duck@ini{megaphone}
+
+\tikzset{
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % Pass unknown keys on to tikz
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ /duck/.search also={/tikz,/pgf},
+ /duck/.cd,
+ name/.code = \duck@nametrue
+ \def\duck@name{#1},
+ invisible/.code = \duck@invisibletrue,
+ randomhead/.code = \shuffleducks,
+ randomhead/.forward to = /duck/\randomhead,
+ randomaccessories/.code = \shuffleducks,
+ randomaccessories/.forward to = /duck/\randomaccessories,
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % Environment
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ water/.code = \duck@watertrue
+ \def\duck@water{#1},
+ water/.default = blue,
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % body parts
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ body/.code = \def\duck@body{#1},
+ body = yellow!70!brown,
+ head/.code = \def\duck@head{#1},
+ eye/.code = \def\duck@eye{#1},
+ eye = white!85!yellow,
+ pupil/.code = \def\duck@pupil{#1},
+ pupil = black,
+ bill/.code = \def\duck@bill{#1},
+ bill = orange!50!brown,
+ grumpy/.code = \duck@grumpytrue,
+ laughing/.code = \duck@laughingtrue,
+ parrot/.code = \duck@parrottrue,
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % clothing
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ tshirt/.code = \duck@tshirttrue
+ \duck@clothingtrue
+ \def\duck@tshirt{#1},
+ tshirt/.default = white,
+ jacket/.code = \duck@jackettrue
+ \duck@clothingtrue
+ \def\duck@jacket{#1},
+ jacket/.default = blue,
+ tie/.code = \duck@tietrue
+ \def\duck@tie{#1},
+ tie/.default = blue,
+ cape/.code = \duck@capetrue
+ \duck@clothingtrue
+ \def\duck@cape{#1},
+ cape/.default = red,
+ stripes/.code = \duck@stripestrue
+ \duck@clothingtrue
+ \def\duck@stripes{#1},
+ stripes/.default = \stripes ,
+ bowtie/.code = \duck@bowtietrue
+ \def\duck@bowtie{#1},
+ bow tie/.forward to = /duck/bowtie,
+ bowtie/.default = black,
+ lapel/.code = \duck@lapeltrue
+ \def\duck@lapel{#1},
+ lapel/.default = black,
+ aodai/.code = \duck@aodaitrue
+ \duck@clothingtrue
+ \def\duck@aodai{#1},
+ ao dai/.forward to = /duck/aodai,
+ aodai/.default = blue!50!black,
+ scarf/.code = \duck@scarftrue
+ \def\duck@scarf{#1},
+ scarf/.default = red!70!black,
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % hair styles
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ shorthair/.code = \duck@shorthairtrue
+ \def\duck@hair{#1},
+ short hair/.forward to = /duck/shorthair,
+ shorthair/.default = brown,
+ longhair/.code = \duck@longhairtrue
+ \def\duck@hair{#1},
+ long hair/.forward to = /duck/longhair,
+ longhair/.default = brown,
+ crazyhair/.code = \duck@crazyhairtrue
+ \def\duck@hair{#1},
+ crazy hair/.forward to = /duck/crazyhair,
+ crazyhair/.default = brown,
+ recedinghair/.code = \duck@recedinghairtrue
+ \def\duck@hair{#1},
+ receding hair/.forward to = /duck/recedinghair,
+ recedinghair/.default = brown,
+ eyebrow/.code = \duck@eyebrowtrue
+ \def\duck@eyebrow{#1},
+ eyebrow/.default = brown,
+ beard/.code = \duck@beardtrue
+ \def\duck@beard{#1},
+ beard/.default = brown,
+ mohican/.code = \duck@mohicantrue
+ \def\duck@hair{#1},
+ mohican/.default = brown,
+ mullet/.code = \duck@mullettrue
+ \def\duck@hair{#1},
+ mullet/.default = brown,
+ parting/.code = \duck@partingtrue
+ \def\duck@hair{#1},
+ parting/.default = brown,
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % Headgear
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ alien/.code = \duck@alientrue
+ \def\duck@alien{#1},
+ alien/.default = green,
+ hat/.code = \duck@hattrue
+ \def\duck@hat{#1},
+ hat/.default = brown,
+ cap/.code = \duck@captrue
+ \def\duck@cap{#1},
+ cap/.default = blue,
+ santa/.code = \duck@santatrue
+ \def\duck@santa{#1},
+ santa/.default = red!80!black,
+ chef/.code = \duck@cheftrue
+ \def\duck@chef{#1},
+ chef/.default = gray!20!white,
+ graduate/.code = \duck@graduatetrue
+ \def\duck@graduate{#1},
+ graduate/.default = black,
+ tassel/.code = \def\duck@tassel{#1},
+ tassel = red,
+ beret/.code = \duck@berettrue
+ \def\duck@beret{#1},
+ beret/.default = black,
+ unicorn/.code = \duck@unicorntrue
+ \def\duck@unicorn{#1},
+ unicorn/.default = pink,
+ magichat/.code = \duck@magichattrue
+ \def\duck@magichat{#1},
+ magic hat/.forward to = /duck/magichat,
+ magichat/.default = violet,
+ magicstars/.code = \def\duck@magicstars{#1},
+ magic stars/.forward to = /duck/magicstars,
+ magicstars = yellow!80!brown,
+ witch/.code = \duck@witchtrue
+ \def\duck@witch{#1},
+ witch/.default = black,
+ crown/.code = \duck@crowntrue
+ \def\duck@crown{#1},
+ crown/.default = yellow,
+ queencrown/.code = \duck@queencrowntrue
+ \def\duck@queencrown{#1},
+ queen crown/.forward to = /duck/queencrown,
+ queencrown/.default = yellow,
+ kingcrown/.code = \duck@kingcrowntrue
+ \def\duck@kingcrown{#1},
+ king crown/.forward to = /duck/kingcrown,
+ kingcrown/.default = gray,
+ bunny/.code = \duck@bunnytrue
+ \def\duck@bunny{#1},
+ bunny/.default = \duck@body,
+ inear/.code = \def\duck@inear{#1},
+ in ear/.forward to = /duck/inear,
+ inear = \duck@bunny!50!white,
+ peakedcap/.code = \duck@peakedcaptrue
+ \def\duck@peakedcap{#1},
+ peaked cap/.forward to = /duck/peakedcap,
+ peakedcap/.default = blue,
+ tophat/.code = \duck@tophattrue
+ \def\duck@tophat{#1},
+ top hat/.forward to = /duck/tophat,
+ tophat/.default = black,
+ darthvader/.code = \duck@darthvadertrue
+ \def\duck@darthvader{#1},
+ darth vader/.forward to = /duck/darthvader,
+ darthvader/.default = black,
+ harlequin/.code = \duck@harlequintrue
+ \def\duck@harlequin{#1},
+ harlequin/.default = blue,
+ niuqelrah/.code = \def\duck@niuqelrah{#1},
+ niuqelrah = red,
+ strawhat/.code = \duck@strawhattrue
+ \def\duck@strawhat{#1},
+ straw hat/.forward to = /duck/strawhat,
+ strawhat/.default = gray!30!white,
+ ribbon/.code = \def\duck@ribbon{#1},
+ ribbon = black,
+ helmet/.code = \duck@helmettrue
+ \def\duck@helmet{#1},
+ helmet/.default = gray,
+ devil/.code = \duck@deviltrue
+ \def\duck@devil{#1},
+ devil/.default = red,
+ viking/.code = \duck@vikingtrue
+ \def\duck@viking{#1}
+ \duck@deviltrue
+ \def\duck@devil{brown!20!white},
+ viking/.default = gray,
+ conicalhat/.code = \duck@conicalhattrue
+ \def\duck@conicalhat{#1},
+ conical hat/.forward to = /duck/conicalhat,
+ conicalhat/.default = brown!90!orange!90!white,
+ sailor/.code = \duck@sailortrue
+ \def\duck@sailor{#1},
+ sailor/.default = white!80!gray,
+ bobblehat/.code = \duck@bobblehattrue
+ \def\duck@bobblehat{#1},
+ bobble hat/.forward to = /duck/bobblehat,
+ bobblehat/.default = red!70!black,
+ sombrero/.code = \duck@sombrerotrue
+ \def\duck@sombrero{#1},
+ sombrero/.default = orange!70!yellow,
+ sombreroa/.code = \def\duck@sombreroa{#1},
+ sombreroa = green!70!blue,
+ sombrerob/.code = \def\duck@sombrerob{#1},
+ sombrerob = red,
+ sombreroc/.code = \def\duck@sombreroc{#1},
+ sombreroc = blue,
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % Accessories
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ glasses/.code = \duck@glassestrue
+ \def\duck@glasses{#1},
+ glasses/.default = black,
+ sunglasses/.code = \duck@sunglassestrue
+ \def\duck@sunglasses{#1},
+ sunglasses/.default = black,
+ squareglasses/.code = \duck@squareglassestrue
+ \def\duck@squareglasses{#1},
+ square glasses/.forward to = /duck/squareglasses,
+ squareglasses/.default = black,
+ icecream/.code = \duck@icecreamtrue
+ \def\duck@cone{#1},
+ ice cream/.forward to = /duck/icecream,
+ icecream/.default = brown!60!gray,
+ flavoura/.code = \def\duck@flavoura{#1},
+ flavour a/.forward to = /duck/flavoura,
+ flavoura = brown!50!black,
+ flavourb/.code = \def\duck@flavourb{#1},
+ flavour b/.forward to = /duck/flavourb,
+ flavourb = white!70!brown,
+ flavourc/.code = \def\duck@flavourc{#1},
+ flavour c/.forward to = /duck/flavourc,
+ flavourc = red!50!white,
+ book/.code = \duck@booktrue
+ \def\duck@book{#1},
+ bookcolour/.code = \def\duck@bookcolour{#1},
+ book colour/.forward to = /duck/bookcolour,
+ book color/.forward to = /duck/bookcolour,
+ bookcolor/.forward to = /duck/bookcolour,
+ bookcolour = brown,
+ signpost/.code = \duck@signposttrue
+ \def\duck@signpost{#1},
+ sign post/.forward to = /duck/signpost,
+ signcolour/.code = \def\duck@signcolour{#1},
+ sign colour/.forward to = /duck/signcolour,
+ sign color/.forward to = /duck/signcolour,
+ signcolor/.forward to = /duck/signcolour,
+ signcolour = brown!50!black,
+ signback/.code = \def\duck@signback{#1},
+ sign back/.forward to = /duck/signback,
+ signback = green!40!black,
+ magicwand/.code = \duck@magicwandtrue,
+ magic want/.forward to = /duck/magicwand,
+ cricket/.code = \duck@crickettrue
+ \def\duck@cricket{#1},
+ cricket/.default = brown,
+ rollingpin/.code = \duck@rollingpintrue
+ \def\duck@rollingpin{#1},
+ rolling pin/.forward to = /duck/rollingpin,
+ rollingpin/.default = brown,
+ lightsaber/.code = \duck@lightsabertrue
+ \def\duck@lightsaber{#1},
+ light saber/.forward to = /duck/lightsaber,
+ lightsaber/.default = green,
+ cake/.code = \duck@caketrue
+ \def\duck@cake{#1},
+ cake/.default = violet,
+ pizza/.code = \duck@pizzatrue,
+ hockey/.code = \duck@hockeytrue
+ \def\duck@hockey{#1},
+ hockey/.default = brown,
+ baguette/.code = \duck@baguettetrue
+ \def\duck@baguette{#1},
+ baguette/.default = brown,
+ football/.code = \duck@footballtrue
+ \def\duck@football{#1},
+ football/.default = white,
+ mask/.code = \duck@masktrue
+ \def\duck@mask{#1},
+ mask/.default = black,
+ necklace/.code = \duck@necklacetrue
+ \def\duck@necklace{#1},
+ necklace/.default = white!80!gray,
+ milkshake/.code = \duck@milkshaketrue
+ \def\duck@milkshake{#1},
+ milkshake/.default = red!20!white,
+ wine/.code = \duck@winetrue
+ \def\duck@wine{#1},
+ wine/.default = red!70!black,
+ prison/.code = \duck@prisontrue
+ \def\duck@prison{#1},
+ prison/.default = gray,
+ speech/.code = \duck@speechtrue
+ \def\duck@speech{#1},
+ think/.code = \duck@thinktrue
+ \def\duck@think{#1},
+ bubblecolour/.code = \def\duck@bubblecolour{#1},
+ bubble colour/.forward to = /duck/bubblecolour,
+ bubble color/.forward to = /duck/bubblecolour,
+ bubblecolor/.forward to = /duck/bubblecolour,
+ bubblecolour = gray!30!white,
+ torch/.code = \duck@torchtrue
+ \def\duck@torch{#1},
+ torch/.default = gray,
+ basket/.code = \duck@baskettrue
+ \def\duck@basket{#1},
+ basket/.default = brown!70!gray,
+ easter/.code = \duck@eastertrue
+ \duck@baskettrue
+ \def\duck@basket{#1},
+ easter/.default = brown!70!gray,
+ egga/.code = \def\duck@egga{#1},
+ egg a/.forward to = /duck/egga,
+ egga = blue,
+ eggb/.code = \def\duck@eggb{#1},
+ egg b/.forward to = /duck/eggb,
+ eggb = green,
+ eggc/.code = \def\duck@eggc{#1},
+ egg c/.forward to = /duck/eggc,
+ eggc = red,
+ buttons/.code = \duck@buttonstrue
+ \def\duck@buttons{#1},
+ buttons/.default = black,
+ sheep/.code = \duck@sheeptrue
+ \def\duck@sheep{#1},
+ sheep/.default = \duck@body,
+ horsetail/.code = \duck@horsetailtrue
+ \def\duck@horsetail{#1},
+ horsetail/.default = brown,
+ crozier/.code = \duck@croziertrue
+ \def\duck@crozier{#1},
+ crozier/.default = brown,
+ davidlikespineapplepizza/.code = \duck@davidlikespineapplepizzatrue
+ \duck@speechtrue
+ \def\duck@speech{\scalebox{\scalingfactor}{\scalebox{0.9}{\tiny ih, che schifo!}}},
+ david likes pineapple pizza/.forward to = /duck/davidlikespineapplepizza,
+ wing/.code = \duck@wingtrue
+ \def\duck@wing{#1},
+ wing/.default = yellow!50!brown,
+ stethoscope/.code = \duck@stethoscopetrue
+ \def\duck@stethoscope{#1},
+ stethoscope/.default = gray,
+ neckerchief/.code = \duck@neckerchieftrue
+ \def\duck@neckerchief{#1},
+ neckerchief/.default = brown,
+ woggle/.code = \def\duck@woggle{#1},
+ woggle = brown!50!black,
+ snowduck/.code = \duck@snowducktrue
+ \def\duck@snowduck{#1}
+ \def\duck@eye{#1}
+ \def\duck@body{#1}
+ \duck@tophattrue
+ \def\duck@tophat{black}
+ \duck@buttonstrue
+ \def\duck@buttons{black},
+ snow duck/.forward to = /duck/snowduck,
+ snowduck/.default = gray!15!white,
+ vampire/.code = \duck@vampiretrue
+ \def\duck@vampire{#1},
+ vampire/.default = white!85!yellow,
+ crystalball/.code = \duck@crystalballtrue
+ \def\duck@crystalball{#1},
+ crystal ball/.forward to = /duck/crystalball,
+ crystalball/.default = cyan,
+ cheese/.code = \duck@cheesetrue
+ \def\duck@cheese{#1},
+ cheese/.default = orange,
+ shovel/.code = \duck@shoveltrue
+ \def\duck@shovel{#1},
+ shovel/.default = gray,
+ pickaxe/.code = \duck@pickaxetrue
+ \def\duck@pickaxe{#1},
+ pickaxe/.default = gray,
+ strawbroom/.code = \duck@strawbroomtrue
+ \def\duck@strawbroom{#1},
+ strawbroom/.default = brown!50!white,
+ strawbroomstick/.code = \def\duck@strawbroomstick{#1},
+ strawbroomstick = brown,
+ strawbroomribbon/.code = \def\duck@strawbroomribbon{#1},
+ strawbroomribbon = red!50!black,
+ broom/.code = \duck@broomtrue
+ \def\duck@broom{#1},
+ broom/.default = brown,
+ broomstick/.code = \def\duck@broomstick{#1},
+ broomstick = gray!50!black,
+ umbrella/.code = \duck@umbrellatrue
+ \def\duck@umbrella{#1},
+ umbrella/.default = cyan,
+ umbrellaclosed/.code = \duck@umbrellaclosedtrue
+ \def\duck@umbrellaclosed{#1},
+ umbrellaclosed/.default = cyan,
+ umbrella closed/.forward to = /duck/umbrellaclosed,
+ handbag/.code = \duck@handbagtrue
+ \def\duck@handbag{#1},
+ handbag/.default = red!70!black,
+ cocktail/.code = \duck@cocktailtrue,
+ overleaf/.code = \duck@overleaftrue
+ \def\duck@body{duck@overleafcol}
+ \duck@graduatetrue
+ \def\duck@graduate{black}
+ \duck@squareglassestrue
+ \def\duck@squareglasses{black},
+ banana/.code = \duck@bananatrue
+ \def\duck@banana{#1},
+ banana/.default = yellow!80!orange,
+ stick/.code = \duck@sticktrue
+ \def\duck@stick{#1},
+ stick/.default = red!60!green,
+ leaf/.code = \def\duck@leaf{#1},
+ leaf = green!70!red,
+ megaphone/.code = \duck@megaphonetrue
+ \def\duck@megaphone{#1},
+ megaphone/.default = lightgray
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Hooks
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\NewHook{tikzducks/background}
+\NewHook{tikzducks/body}
+\NewHook{tikzducks/clothing}
+\NewHook{tikzducks/hair}
+\NewHook{tikzducks/hat}
+\NewHook{tikzducks/foreground}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Duck
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newcommand*{\duck}[1][]{%
+\begin{scope}%
+\tikzset{/duck/.cd,#1}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% minimal bounding box size
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@invisible
+\else
+ \path (0.1,0.1) rectangle (2.1,2.12);
+\fi
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% defining some coordinates
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@name
+ \coordinate (\duck@name-wing) at (0.8,0.7);
+ \coordinate (\duck@name-head) at (0.9,2);
+ \coordinate (\duck@name-bill) at (0.5,1.3);
+ \coordinate (\duck@name-tail) at (1.82,1.41);
+\fi
+\coordinate (wing) at (0.8,0.7);
+\coordinate (head) at (0.9,2);
+\coordinate (bill) at (0.5,1.3);
+\coordinate (tail) at (1.82,1.41);
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% store the current scale factor
+% from https://github.com/samcarter/tikzlings/issues/3#issuecomment-461373494
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pgfgettransformentries{\tmpscaleA}{\tmpscaleB}{\tmpscaleC}{\tmpscaleD}{\tmp}{\tmp}%
+\pgfmathsetmacro{\scalingfactor}{sqrt(abs(\tmpscaleA*\tmpscaleD-\tmpscaleB*\tmpscaleC))*sqrt(abs((\pgf@xx/1cm)*(\pgf@yy/1cm)-(\pgf@xy/1cm)*(\pgf@yx/1cm)))}%
+\pgfmathsetmacro{\xscalefactor}{\tmpscaleA}
+\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
+\pgfmathsetmacro{\decoscalefactor}{sign(\tmpscaleA)*sign(\tmpscaleD)*\scalingfactor}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Environment
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\UseHook{tikzducks/background}
+\csname duckhookbackground\endcsname
+%
+% water %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@water
+ \fill[\duck@water, even odd rule] (1.00,0.40) ellipse[x radius=0.88, y radius=0.35] (1.00,0.40) ellipse[x radius=0.75, y radius=0.25];
+ \fill[\duck@water, even odd rule] (1.00,0.40) ellipse[x radius=1.05, y radius=0.50] (1.00,0.40) ellipse[x radius=0.95, y radius=0.42];
+ \fill[\duck@water, even odd rule] (1.00,0.40) ellipse[x radius=1.23, y radius=0.63] (1.00,0.40) ellipse[x radius=1.17, y radius=0.57];
+ \fill[\duck@water, even odd rule] (1.00,0.40) ellipse[x radius=1.42, y radius=0.77] (1.00,0.40) ellipse[x radius=1.38, y radius=0.73];
+\fi
+%
+% sheep %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@sheep
+ \fill[\duck@sheep] (0.65,1.95) circle[radius=0.15] (0.50,1.75) circle[radius=0.15] (0.46,1.51) circle[radius=0.15] (0.37,1.00) circle[radius=0.15] (0.23,0.80) circle[radius=0.15] (0.20,0.60) circle[radius=0.15] (0.25,0.45) circle[radius=0.15] (0.35,0.30) circle[radius=0.15] (0.55,0.25) circle[radius=0.15] (0.75,0.20) circle[radius=0.15] (0.95,0.16) circle[radius=0.15] (1.15,0.20) circle[radius=0.15] (1.35,0.23) circle[radius=0.15] (1.55,0.30) circle[radius=0.15] (1.75,0.38) circle[radius=0.15] (1.95,0.50) circle[radius=0.15] (2.05,0.65) circle[radius=0.15] (2.10,0.85) circle[radius=0.15] (2.05,1.00) circle[radius=0.15] (2.00,1.15) circle[radius=0.15] (1.85,1.35) circle[radius=0.15] (1.60,1.25) circle[radius=0.15] (1.35,1.25) circle[radius=0.15] (1.30,1.50) circle[radius=0.15] (1.30,1.70) circle[radius=0.15] (1.20,1.90) circle[radius=0.15] (0.85,2.05) circle[radius=0.15] (1.05,2.00) circle[radius=0.15];
+\fi
+%
+% devil (back horn) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@devil
+ \fill[\duck@devil] (0.7723,2.3756) .. controls (0.6369,2.1184) and (0.7916,2.0228) .. (0.8360,1.9897) .. controls (0.8744,1.9675) and (0.8774,1.9511) .. (0.8853,1.9173) .. controls (0.8853,1.8595) and (0.8407,1.8127) .. (0.7856,1.8127) .. controls (0.7535,1.8178) and (0.7240,1.8231) .. (0.6965,1.8545) .. controls (0.6965,1.8545) and (0.4451,2.2259) .. (0.7723,2.3756) -- cycle;
+\fi
+%
+% Conical Hat (background) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@conicalhat
+ \fill[\duck@conicalhat!50!black,rotate=-21] (0.265,1.915) ellipse[x radius=0.79, y radius=0.1];
+ \fill[\duck@conicalhat!30!black] (0.5501,0.9739) -- (0.2002,1.9676) -- (0.2946,2.0008) -- (0.6445,1.0072) -- cycle;
+\fi
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% body parts
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@invisible
+\else
+%
+% body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\fill[\duck@body,overlay] \duckpathbody;
+%
+% head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifdefined\duck@head\else\let\duck@head=\duck@body\fi
+\fill[\duck@head]
+ (0.90,1.50) ellipse[x radius=0.50, y radius=0.625];
+%
+% bill %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@grumpy
+ \fill[\duck@bill] \duckpathgrumpybill;
+\else
+ \ifduck@laughing
+ \fill[\duck@bill!80!black,overlay] (0.40,1.20) .. controls (0.54,1.36) and (0.65,1.31) .. (0.91,1.37) .. controls (0.45,1.06) and (0.36,1.18) .. (0.40,1.20) -- cycle;
+ \fill[\duck@bill,overlay] (0.41,1.47) .. controls (0.64,1.53) and (0.54,1.30) .. (0.91,1.37) .. controls (-0.02,1.10) and (0.28,1.37) .. (0.41,1.47) -- cycle;
+ \else
+ \ifduck@parrot
+ \fill[\duck@bill!80!black]
+ (0.40,1.45) .. controls (0.51,1.48) and (0.54,1.44) .. (0.59,1.39) .. controls (0.63,1.34) and (0.69,1.34) .. (0.86,1.35) .. controls (0.43,1.15) and (0.37,1.13) .. (0.34,1.20) .. controls (0.52,1.27) and (0.34,1.40) .. (0.40,1.45) -- cycle;
+ \fill[\duck@bill]
+ (0.39,1.49) .. controls (0.50,1.52) and (0.54,1.44) .. (0.59,1.39) .. controls (0.63,1.34) and (0.68,1.34) .. (0.86,1.35) .. controls (0.43,1.15) and (0.54,1.40) .. (0.22,1.20) .. controls (0.24,1.52) and (0.39,1.49) .. (0.39,1.49) -- cycle;
+ \else
+ \fill[\duck@bill] \duckpathbill;
+ \fi
+ \fi
+\fi
+%
+% Superhero mask %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% has to be behind the eyes
+\ifduck@mask
+ \begin{scope}
+ \clip (0.90,1.50) ellipse[x radius=0.50, y radius=0.625];
+ \fill[\duck@mask,rotate=-15] (-0.1,1.59) rectangle (1.3,1.88);
+ \end{scope}
+\fi%
+%
+% right eye %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\fill[\duck@eye, rotate=-20]
+ (0.23,1.7675) ellipse[x radius=0.0893, y radius=0.125];
+\fill[\duck@pupil, rotate=-20]
+ (0.26,1.7575) ellipse[x radius=0.0357, y radius=0.0714];
+%
+% left eye %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\fill[\duck@eye, rotate=-20]
+ (-0.06,1.74) ellipse[x radius=0.0786, y radius=0.1143];
+\fill[\duck@pupil, rotate=-20]
+ (-0.03,1.73) ellipse[x radius=0.0286, y radius=0.0643];
+%
+\fi % from no duck
+%
+% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\UseHook{tikzducks/body}
+\csname duckhookbody\endcsname
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% clothing
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Strap of the conical hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@conicalhat
+ \ifduck@clothing
+ \fill[\duck@conicalhat!30!black] (1.5943,1.5059) .. controls (1.4384,1.3576) and (1.2780,1.2120) .. (1.0987,1.0923) -- (1.0617,0.9549) .. controls (1.2151,1.0361) and (1.3476,1.1504) .. (1.4785,1.2630) .. controls (1.5417,1.3187) and (1.6038,1.3757) .. (1.6644,1.4344) -- cycle;
+ \else
+ \fill[\duck@conicalhat!30!black] (1.5943,1.5059) .. controls (1.4384,1.3576) and (1.2780,1.2120) .. (1.0987,1.0923) .. controls (0.9540,0.9995) and (0.7864,0.9875) .. (0.6358,1.0398) .. controls (0.6727,0.9043) and (0.9752,0.9113) .. (1.0617,0.9549) .. controls (1.2151,1.0361) and (1.3476,1.1504) .. (1.4785,1.2630) .. controls (1.5417,1.3187) and (1.6038,1.3757) .. (1.6644,1.4344) -- cycle;
+ \fi
+\fi
+%
+% tshirt %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@tshirt
+ \fill[\duck@tshirt,overlay] \duckpathtshirt;
+\fi
+%
+% tie %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@tie
+ \fill[\duck@tie,rotate=-12] (0.32,0.7) rectangle (0.43,1.15);
+\fi
+%
+% jacket %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@jacket
+ \fill[\duck@jacket,overlay] \duckpathjacket;
+\fi
+%
+% Ão dài %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@aodai
+ \fill[\duck@aodai,overlay] (1.819,1.419) .. controls (2.871,0.120) and (0.711,-0.145) .. (0.296,0.251) .. controls (-0.118,0.647) and (0.232,1.073) .. (0.440,1.128) -- (0.567,0.927) .. controls (0.567,0.927) and (0.543,0.906) .. (0.509,0.882) -- (0.481,0.929) -- (0.458,0.915) -- (0.487,0.868) .. controls (0.473,0.859) and (0.457,0.850) .. (0.441,0.842) -- (0.422,0.894) -- (0.397,0.885) -- (0.417,0.831) .. controls (0.404,0.826) and (0.391,0.821) .. (0.378,0.818) -- (0.364,0.869) -- (0.338,0.862) -- (0.351,0.815) .. controls (0.334,0.814) and (0.318,0.817) .. (0.304,0.825) .. controls (0.303,0.774) and (0.329,0.759) .. (0.365,0.763) -- (0.376,0.722) -- (0.402,0.729) -- (0.391,0.768) .. controls (0.405,0.772) and (0.420,0.778) .. (0.435,0.784) -- (0.447,0.750) -- (0.472,0.759) -- (0.459,0.796) .. controls (0.477,0.805) and (0.496,0.815) .. (0.512,0.825) -- (0.533,0.791) -- (0.556,0.805) -- (0.535,0.840) .. controls (0.567,0.860) and (0.590,0.877) .. (0.590,0.877) .. controls (1.011,1.168) and (0.887,0.936) .. (1.819,1.419) -- cycle;
+\fi
+%
+% lapel %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@lapel
+ \fill[\duck@lapel] (0.490,1.145) .. controls (0.3984,1.13) and (0.3515,1.08) .. (0.3515,1.08) -- (0.4265,1.0192) -- (0.35,0.98) -- (0.513,0.700) -- (1.0089,0.9162) -- (0.9547,0.9868) -- (1.1194,0.9782) -- (1.0822,1.135) .. controls (0.9616,1.1) and (0.8648,1.0300) .. (0.513,0.700) -- cycle;
+\fi
+%
+% stripes for football jersey %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@stripes
+ \duck@stripes
+\fi
+%
+% superhero cape %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@cape
+ \fill[\duck@cape,overlay] \duckpathcape;
+\fi
+%
+% bowtie %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@bowtie
+ \fill[\duck@bowtie] (0.4382, 1.1105) .. controls (0.3984, 1.0671) and (0.3911, 0.9535) .. (0.4116, 0.9176) .. controls (0.4958, 0.9064) and (0.565, 0.9487) .. (0.565, 0.9487) -- (0.6448, 0.9398) .. controls (0.6448, 0.9398) and (0.6777, 0.8844) .. (0.804, 0.8689) .. controls (0.8323, 0.9056) and (0.8422, 1.0026) .. (0.8284, 1.0551) .. controls (0.7881, 1.0942) and (0.6537, 1.0285) .. (0.6537, 1.0285) -- (0.5739, 1.0374) .. controls (0.5739, 1.0374) and (0.5436, 1.0956) .. (0.4382, 1.1105) -- cycle;
+\fi
+%
+% necklace (not really clothing, but needs to be below the hair) %%%%%
+\ifduck@necklace
+ \fill[\duck@necklace] (0.5000,1.112) circle[radius=0.032] (0.5100,1.050) circle[radius=0.032] (0.5200,0.990) circle[radius=0.032] (0.5400,0.931) circle[radius=0.032] (0.5825,0.885) circle[radius=0.032] (0.6450,0.885) circle[radius=0.032] (0.7000,0.910) circle[radius=0.032] (0.7500,0.945) circle[radius=0.032] (0.8000,0.980) circle[radius=0.032] (0.8500,1.020) circle[radius=0.032] (0.9000,1.050) circle[radius=0.032] (0.9500,1.080) circle[radius=0.032] (1.0000,1.110) circle[radius=0.032] (1.0550,1.130) circle[radius=0.032] (1.1100,1.150) circle[radius=0.032] (1.1650,1.165) circle[radius=0.032] (1.2200,1.180) circle[radius=0.032] (1.2750,1.195) circle[radius=0.032] (1.3300,1.210) circle[radius=0.032];
+\fi
+%
+% Scout neckerchief %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@neckerchief
+ \fill[\duck@neckerchief]
+ (0.3650,1.0892) .. controls (0.4127,1.1589) and (0.4900,1.1450) .. (0.4900,1.1450) .. controls (0.6500,0.9300) and (1.1366,1.2400) .. (1.3675,1.2649) .. controls (1.4131,1.2533) and (1.4052,1.2446) .. (1.4099,1.2124) .. controls (1.3028,1.0810) and (0.7415,0.8930) .. (0.6807,0.9076) .. controls (0.8257,0.7387) and (0.6347,0.7168) .. (0.7151,0.4426) .. controls (0.6059,0.5672) and (0.5513,0.6588) .. (0.5938,0.8388) .. controls (0.5871,0.6953) and (0.4493,0.7565) .. (0.4716,0.4967) .. controls (0.3682,0.6697) and (0.3820,0.7984) .. (0.5321,0.9351) .. controls (0.4635,0.9699) and (0.4115,1.0215) .. (0.3650,1.0892) -- cycle;
+ \fill[\duck@woggle, rounded corners=\scalingfactor*1, rotate=-10] (0.33,1.05) rectangle (0.55,0.98);
+\fi
+%
+% Scarf %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@scarf
+ \fill[\duck@scarf] (1.3780,1.2876) .. controls (1.1405,1.0484) and (0.7278,0.8710) .. (0.4865,1.1319) .. controls (0.4312,1.1245) and (0.3749,1.1088) .. (0.3443,1.0553) .. controls (0.4097,0.9269) and (0.4360,0.9534) .. (0.5231,0.8623) -- (0.4780,0.5230) -- (0.5666,0.5486) -- (0.6442,0.5011) -- (0.6584,0.6852) -- (0.6881,0.3913) -- (0.7782,0.4358) -- (0.8543,0.4133) -- (0.7988,0.8309) .. controls (1.0539,0.8635) and (1.1298,0.8415) .. (1.4849,1.1302) .. controls (1.4898,1.1985) and (1.4313,1.2543) .. (1.3780,1.2876) -- cycle;
+\fi
+%
+% buttons (same argument as for the necklace)
+\ifduck@buttons
+ \ifduck@jacket
+ \fill[\duck@buttons] (0.49,0.6) circle[radius=0.05] (0.46,0.45) circle[radius=0.05] (0.45,0.3) circle[radius=0.05];
+ \else
+ \fill[\duck@buttons] (0.53,0.75) circle[radius=0.05] (0.5,0.6) circle[radius=0.05] (0.47,0.45) circle[radius=0.05];
+ \fi
+\fi
+%
+% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\UseHook{tikzducks/clothing}
+\csname duckhookclothing\endcsname
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% hair styles
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% short hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@shorthair
+ \path (0.1,0.1) rectangle (2.1,2.25);
+ \fill[\duck@hair,overlay] \duckpathshorthair;
+\fi
+%
+% long hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@longhair
+ \path (0.1,0.1) rectangle (2.1,2.25);
+ \fill[\duck@hair,overlay] \duckpathlonghair;
+\fi
+%
+% crazy hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@crazyhair
+ \path (0.1,0.1) rectangle (2.1,2.4);
+ \fill[\duck@hair,overlay] \duckpathcrazyhair;
+\fi
+%
+% receding hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@recedinghair
+ \path (0.1,0.1) rectangle (2.1,2.18);
+ \fill[\duck@hair,overlay] \duckpathrecedinghair;
+\fi
+%
+% mohican hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@mohican
+ \path (0.1,0.1) rectangle (2.1,2.24);
+ \fill[\duck@hair,overlay] \duckpathmohican;
+\fi
+%
+% mullet hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@mullet
+ \path (0.1,0.1) rectangle (2.1,2.17);
+ \fill[\duck@hair,overlay] \duckpathmullet;
+\fi
+%
+% middle parting %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@parting
+ \path (0.1,0.1) rectangle (2.1,2.22);
+ \fill[\duck@hair,overlay] (1.4053,1.5403) .. controls (1.5524,2.2939) and (0.3739,2.5180) .. (0.4084,1.6117) .. controls (0.4248,1.8921) and (0.7860,1.9734) .. (0.7860,1.9734) .. controls (1.1125,1.5754) and (1.3375,1.4715) .. (1.4053,1.5403) -- cycle;
+\fi
+%
+% eye brow %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pgfkeys{/duck/eyebrow/.@def/.get=\duck@test}
+\ifx\duck@eyebrow\duck@test
+ \ifdefined\duck@hair\let\duck@eyebrow=\duck@hair\fi
+\fi%
+\ifduck@eyebrow
+ \fill[\duck@eyebrow, rounded corners=\scalingfactor*1, rotate=60] (1.92,0.21) rectangle (1.98,-0.01);
+ \fill[\duck@eyebrow, rounded corners=\scalingfactor*1, rotate=100] (1.67,-0.77) rectangle (1.73,-0.95);
+\fi
+%
+% beard %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pgfkeys{/duck/beard/.@def/.get=\duck@test}
+\ifx\duck@beard\duck@test
+ \ifdefined\duck@hair\let\duck@beard=\duck@hair\fi
+\fi%
+\ifduck@beard
+ \fill[\duck@beard] (1.3,1.3) circle[radius=0.12] (1.2,1.15) circle[radius=0.12] (0.5,1.05) circle[radius=0.1] (0.525,0.90) circle[radius=0.12] (0.525,0.75) circle[radius=0.12] (0.65,0.65) circle[radius=0.14] (0.75,0.75) circle[radius=0.12] (0.85,0.85) circle[radius=0.12] (0.95,0.95) circle[radius=0.12] (1.05,1.05) circle[radius=0.12] (1.15,1.25) circle[radius=0.12] (1,1.20) circle[radius=0.12] (0.85,1.20) circle[radius=0.12] (0.75,1.15) circle[radius=0.12] (0.65,1.10) circle[radius=0.12] (0.58,1.07) circle[radius=0.12] (0.44,1.46) circle[radius=0.06] (0.52,1.45) circle[radius=0.06] (0.6, 1.41) circle[radius=0.06] (0.68,1.36) circle[radius=0.06] (0.76,1.34) circle[radius=0.06] (0.86,1.26) circle[radius=0.12] (0.38,1.44) circle[radius=0.03] (1,1.28) circle[radius=0.12];
+ \fill[\duck@beard] (1.3,1.3) -- (0.5,1.05) -- (0.65,0.65) -- cycle;
+\fi%
+%
+% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\UseHook{tikzducks/hair}
+\csname duckhookhair\endcsname
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Headgear
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% alien %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@alien
+ \fill[\duck@alien,rotate=-25] (0.09,2.1) rectangle (0.16,2.6);
+ \fill[\duck@alien,rotate=5] (0.79,1.86) rectangle (0.86,2.25);
+ \fill[\duck@alien] (1.20,2.30) circle[radius=0.07];
+ \fill[\duck@alien] (0.62,2.35) circle[radius=0.07];
+\fi
+%
+% hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@hat
+ \ifdefined\duck@hair % with hair
+ \fill[\duck@hat,rotate=-15] (0.44,2.1) ellipse[x radius=0.7, y radius=0.1];
+ \fill[\duck@hat,rotate=-15] (0.0,2.1) rectangle (0.88,2.4);
+ \fill[\duck@hat,rotate=-15] (0.44,2.4) ellipse[x radius=0.44, y radius=0.08];
+ \else % without hair
+ \fill[\duck@hat,rotate=-15] (0.44,2.1) ellipse[x radius=0.6, y radius=0.1];
+ \fill[\duck@hat,rotate=-15] (0.07,2.1) rectangle (0.81,2.4);
+ \fill[\duck@hat,rotate=-15] (0.44,2.4) ellipse[x radius=0.37, y radius=0.08];
+ \fi
+\fi
+%
+% cap %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@cap
+ \fill[\duck@cap, start angle=0, end angle=150, radius=0.5] (1.4,1.75) arc;
+ \fill[\duck@cap,rotate=-15] (0.3,2.05) ellipse[x radius=0.6, y radius=0.15];
+\fi
+%
+% Santa %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@santa
+ \fill[\duck@santa]
+ (0.430,1.803) .. controls (0.590,2.174) and (0.837,2.065) ..
+ (1.118,1.954) .. controls (1.679,1.731) and (1.328,1.193) ..
+ (1.647,1.057) .. controls (1.638,1.255) and (1.745,2.104) ..
+ (1.168,2.270) .. controls (0.867,2.356) and (0.536,2.280) ..
+ (0.430,1.803) -- cycle;
+ \fill[white!80!brown]
+ (0.44,1.733) .. controls (0.211,2.299) and (1.082,2.188) ..
+ (1.456,1.759) .. controls (1.534,1.637) and (1.480,1.545) ..
+ (1.400,1.566) .. controls (1.265,1.714) and (0.577,2.267) ..
+ (0.44,1.733) -- cycle;
+ \fill[white!80!brown] (1.6,1.0) circle[radius=0.17];
+\fi
+%
+% Chef hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@chef
+ \fill[\duck@chef,rotate=-15] (0.44,2.1) ellipse[x radius=0.37, y radius=0.08];
+ \fill[\duck@chef,rotate=-15] (0.07,2.1) rectangle (0.81,2.55);
+ \fill[\duck@chef] (1.01,2.47) circle[radius=0.17];
+ \fill[\duck@chef] (1.24,2.35) circle[radius=0.15];
+ \fill[\duck@chef] (0.77,2.40) circle[radius=0.12];
+ \fill[\duck@chef] (1.39,2.20) circle[radius=0.12];
+\fi
+%
+% graduate hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@graduate
+ \fill[\duck@graduate,rotate=-15] (0.44,2.1) ellipse[x radius=0.37, y radius=0.1];
+ \fill[\duck@graduate,rotate=-15] (0.07,2.1) rectangle (0.81,2.3);
+ \fill[\duck@graduate] (0.3,2.25) -- (1.05,2.35) -- (1.7,1.95) -- (0.92,1.85) -- cycle;
+ \fill[\duck@tassel,rounded corners=\scalingfactor*1] (1.12,1.89) -- (1.01,2.1) -- (1.09,2.11) -- (1.2,1.9) -- (1.2,1.3) -- (1.12,1.3) -- cycle;
+ \fill[\duck@tassel] (1.16,1.3) ellipse[x radius=0.06, y radius=0.12];
+\fi
+%
+% beret %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@beret
+ \fill[\duck@beret,rotate=-25] (0.13,2.15) ellipse[x radius=0.5, y radius=0.17];
+ \fill[\duck@beret,rotate=-25] (0.13,2.25) ellipse[x radius=0.55, y radius=0.17];
+ \fill[\duck@beret,rotate=-25] (0.13,2.4) circle[radius=0.08];
+\fi
+%
+% unicorn %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@unicorn
+ \fill[\duck@unicorn,rotate=25] (1.48,1.4375)--(1.60,1.9)--(1.72,1.4375);
+ \fill[\duck@body!100,rotate=25] (1.50,1.43)--(1.60,1.8375)--(1.70,1.43);
+\fi
+%
+% magic hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@magichat
+ \path[preaction={fill, \duck@magichat!100},rotate=-5,
+ pattern={Stars[distance=1.7mm,radius=0.5mm,angle=32]}, pattern color=\duck@magicstars!100]
+ (0.36,1.95)--(0.86,2.95)--(1.20,1.85);
+\fi
+%
+% witch %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@witch
+ \fill[\duck@witch,rotate=-15] (0.44,2.13) ellipse[x radius=0.75, y radius=0.17];
+ \fill[\duck@witch,rotate=-15] (0.05,2.2)--(0.45,3.2)--(0.82,2.2);
+\fi
+%
+% crown %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@crown
+ \path (0.7,1.95) rectangle (1.4,2.45);
+ \fill[\duck@crown,overlay] \duckpathcrown;
+\fi
+%
+% Queen crown %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@queencrown
+ \fill[\duck@queencrown] \duckpathqueencrown;
+\fi
+%
+% King crown %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@kingcrown
+ \fill[\duck@kingcrown] \duckpathkingcrown;
+\fi
+%
+% Bunny ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@bunny
+ \path (0.55,1.9) rectangle (1.2,2.55);
+ \begin{pgfinterruptboundingbox}
+ \begin{scope}
+ \clip[rotate=-5] (0.68,2.38) ellipse[x radius=0.3, y radius=0.4];
+ \fill[\duck@bunny,rotate=-5] (1.06,2.2) ellipse[x radius=0.3, y radius=0.4] (0.28,2.26) ellipse[x radius=0.3, y radius=0.4];
+ \end{scope}
+
+ \begin{scope}
+ \clip[rotate=-5] (0.68,2.38) ellipse[x radius=0.25, y radius=0.35];
+ \fill[\duck@inear,rotate=-5] (1.06,2.2) ellipse[x radius=0.25, y radius=0.35] (0.28,2.26) ellipse[x radius=0.25, y radius=0.35];
+ \end{scope}
+ \end{pgfinterruptboundingbox}
+\fi
+%
+% peaked cap %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@peakedcap
+ \fill[\duck@peakedcap,rotate=-15] (0.35,2.05) ellipse[x radius=0.5, y radius=0.15];
+ \fill[\duck@peakedcap,rotate=-25] (0.13,2.15) ellipse[x radius=0.5, y radius=0.17];
+ \fill[\duck@peakedcap,rotate=-35] (-0.25,2.2) ellipse[x radius=0.55, y radius=0.17];
+\fi
+%
+% tophat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@tophat
+ \fill[\duck@tophat,rotate=-15] (0.44,2.1) ellipse[x radius=0.48, y radius=0.1];
+ \fill[\duck@tophat,rotate=-15] (0.12,2.1) -- (0.75,2.1) -- (0.81,2.55) -- (0.07,2.55) -- cycle;
+ \fill[\duck@tophat,rotate=-15] (0.44,2.55) ellipse[x radius=0.37, y radius=0.08];
+\fi
+%
+% darth vader %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@darthvader
+ \path (0.1,0.1) rectangle (2.1,2.22);
+ \fill[\duck@darthvader,overlay] \duckpathdarthvader;
+\fi
+%
+% Harlequin duck %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@harlequin
+ \path (0.19,1.85) rectangle (1.85,2.67);
+ \fill[\duck@harlequin,overlay] (0.6006,1.9719) .. controls (0.7432,1.8954) and (0.9320,1.8698) .. (0.9320,1.8698) -- (1.0404,2.3839) .. controls (0.9223,2.8873) and (0.1755,2.5634) .. (0.3019,2.2958) .. controls (0.5807,2.5024) and (0.7251,2.3376) .. (0.6006,1.9719) -- cycle;
+ \fill[\duck@niuqelrah,overlay] (1.2853,1.8902) .. controls (1.1177,1.8507) and (0.9278,1.8703) .. (0.9278,1.8703) -- (1.0404,2.3839) .. controls (1.3637,2.8347) and (1.9373,2.3532) .. (1.7049,2.1284) .. controls (1.5267,2.3895) and (1.3204,2.2666) .. (1.2853,1.8902) -- cycle;
+ \fill[\duck@harlequin] (1.7,2.07) circle[radius=0.1];
+ \fill[\duck@niuqelrah] (0.3,2.23) circle[radius=0.1];
+\fi
+%
+% Straw hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@strawhat
+ \fill[\duck@strawhat,rotate=-15] (0.44,2.0) ellipse[x radius=0.75, y radius=0.1];
+ \fill[\duck@strawhat,rotate=-15] (0.1,2.05) rectangle (0.78,2.5);
+ \fill[\duck@strawhat,rotate=-15] (0.44,2.5) ellipse[x radius=0.34, y radius=0.08];
+ \fill[\duck@strawhat,rotate=-15] (-0.3,2.02) -- (1.18,2.02) -- (0.78,2.2) -- (0.1,2.2) -- cycle;
+ \fill[\duck@ribbon,rotate=-15] (0.44,2.2) ellipse[x radius=0.34, y radius=0.08];
+ \fill[\duck@ribbon,rotate=-15] (0.1,2.2) rectangle (0.78,2.3);
+ \fill[\duck@strawhat,rotate=-15] (0.44,2.3) ellipse[x radius=0.34, y radius=0.08];
+\fi
+%
+% helmet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@helmet
+ \fill[\duck@helmet] (1.4331,1.5155) .. controls (1.4365,1.7226) and (1.3866,2.0493) .. (1.0429,2.1279) .. controls (0.7050,2.2052) and (0.4794,1.9294) .. (0.4481,1.8183) .. controls (0.6062,1.8381) and (1.1506,1.7480) .. (1.4331,1.5155) -- cycle;
+ \fill[\duck@helmet!70!black] (1.0282,2.1360) .. controls (0.9395,2.1312) and (0.8696,2.0652) .. (0.8152,2.0010) .. controls (0.7824,1.9609) and (0.7546,1.9169) .. (0.7309,1.8709) .. controls (0.6510,1.8859) and (0.5703,1.8971) .. (0.4892,1.9024) .. controls (0.4595,1.8831) and (0.4114,1.7962) .. (0.4743,1.7961) .. controls (0.5446,1.7868) and (0.6149,1.7767) .. (0.6845,1.7629) .. controls (0.6647,1.7052) and (0.6469,1.6454) .. (0.6401,1.5851) -- (0.6583,1.5355) -- (0.7069,1.5673) .. controls (0.7193,1.6285) and (0.7363,1.6889) .. (0.7590,1.7471) .. controls (0.9991,1.6922) and (1.2114,1.6182) .. (1.4111,1.4722) .. controls (1.4369,1.4960) and (1.4536,1.5229) .. (1.4475,1.5553) .. controls (1.4417,1.5927) and (1.4030,1.6066) .. (1.3766,1.6276) .. controls (1.2054,1.7408) and (1.0085,1.8089) .. (0.8095,1.8546) .. controls (0.8733,1.9674) and (0.9684,2.0703) .. (1.0932,2.1138) .. controls (1.0751,2.1288) and (1.0515,2.1362) .. (1.0282,2.1360) -- cycle;
+ \fill[\duck@helmet!50!white] (0.502,1.845) circle[radius=0.015] (0.586,1.835) circle[radius=0.015] (0.684,1.822) circle[radius=0.015] (0.791,1.799) circle[radius=0.015] (0.899,1.770) circle[radius=0.015] (1.003,1.741) circle[radius=0.015] (1.099,1.706) circle[radius=0.015] (1.185,1.673) circle[radius=0.015] (1.276,1.629) circle[radius=0.015] (1.360,1.581) circle[radius=0.015] (0.676,1.606) circle[radius=0.015] (0.695,1.666) circle[radius=0.015] (0.714,1.729) circle[radius=0.015] (0.784,1.889) circle[radius=0.015] (0.835,1.968) circle[radius=0.015] (0.896,2.034) circle[radius=0.015] (0.957,2.081) circle[radius=0.015] (1.020,2.115) circle[radius=0.015] (1.422,1.535) circle[radius=0.015] (0.502,1.845) circle[radius=0.015];
+\fi
+%
+% Viking %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@viking
+ \fill[\duck@viking] (1.4331,1.5155) .. controls (1.4365,1.7226) and (1.3866,2.0493) .. (1.0429,2.1279) .. controls (0.7050,2.2052) and (0.4794,1.9294) .. (0.4481,1.8183) .. controls (0.6062,1.8381) and (1.1506,1.7480) .. (1.4331,1.5155) -- cycle;
+ \fill[\duck@viking!70!black] (1.0282,2.1360) .. controls (0.9395,2.1312) and (0.8696,2.0652) .. (0.8152,2.0010) .. controls (0.7824,1.9609) and (0.7546,1.9169) .. (0.7309,1.8709) .. controls (0.6510,1.8859) and (0.5703,1.8971) .. (0.4892,1.9024) .. controls (0.4595,1.8831) and (0.4114,1.7962) .. (0.4743,1.7961) .. controls (0.5446,1.7868) and (0.6149,1.7767) .. (0.6845,1.7629) .. controls (0.6845,1.7629) and (0.6845,1.7629) .. (0.7590,1.7471) .. controls (0.9991,1.6922) and (1.2114,1.6182) .. (1.4111,1.4722) .. controls (1.4369,1.4960) and (1.4536,1.5229) .. (1.4475,1.5553) .. controls (1.4417,1.5927) and (1.4030,1.6066) .. (1.3766,1.6276) .. controls (1.2054,1.7408) and (1.0085,1.8089) .. (0.8095,1.8546) .. controls (0.8733,1.9674) and (0.9684,2.0703) .. (1.0932,2.1138) .. controls (1.0751,2.1288) and (1.0515,2.1362) .. (1.0282,2.1360) -- cycle;
+ \fill[\duck@viking!50!white] (0.502,1.845) circle[radius=0.015] (0.586,1.835) circle[radius=0.015] (0.684,1.822) circle[radius=0.015] (0.791,1.799) circle[radius=0.015] (0.899,1.770) circle[radius=0.015] (1.003,1.741) circle[radius=0.015] (1.099,1.706) circle[radius=0.015] (1.185,1.673) circle[radius=0.015] (1.276,1.629) circle[radius=0.015] (1.360,1.581) circle[radius=0.015] (0.784,1.889) circle[radius=0.015] (0.835,1.968) circle[radius=0.015] (0.896,2.034) circle[radius=0.015] (0.957,2.081) circle[radius=0.015] (1.020,2.115) circle[radius=0.015] (1.422,1.535) circle[radius=0.015];
+\fi
+%
+% devil (front horn) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@devil
+ \fill[\duck@devil] (1.2185,2.3521) .. controls (1.3540,2.0950) and (1.1993,1.9994) .. (1.1548,1.9663) .. controls (1.1165,1.9441) and (1.1134,1.9277) .. (1.1056,1.8938) .. controls (1.1056,1.8361) and (1.1502,1.7893) .. (1.2052,1.7893) .. controls (1.2373,1.7944) and (1.2669,1.7996) .. (1.2944,1.8311) .. controls (1.2944,1.8311) and (1.5458,2.2025) .. (1.2185,2.3521) -- cycle;
+\fi
+%
+% Conical Hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@conicalhat
+ \path (0.19,1.4) rectangle (1.68,2.32);
+ \fill[\duck@conicalhat,overlay] (1.6722,1.4137) .. controls (1.6722,1.4337) and (1.3592,1.6230) .. (0.9513,1.7735) .. controls (0.5433,1.9239) and (0.1948,1.9784) .. (0.1948,1.9754) .. controls (0.2049,2.0230) and (1.1428,2.36) .. (1.1428,2.3) .. controls (1.1428,2.35) and (1.6821,1.4784) .. (1.6722,1.4137) -- cycle;
+\fi
+%
+% Sailor hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@sailor
+ \fill[\duck@sailor] (1.0390,2.2743) .. controls (0.9475,2.2748) and (0.8569,2.2355) .. (0.7943,2.1690) .. controls (0.7147,2.1872) and (0.6335,2.2098) .. (0.5512,2.2029) .. controls (0.5524,2.1164) and (0.5536,2.0299) .. (0.5547,1.9434) .. controls (0.6637,1.9348) and (0.7679,1.8974) .. (0.8716,1.8653) .. controls (1.0321,1.8101) and (1.1932,1.7522) .. (1.3420,1.6697) .. controls (1.3671,1.6622) and (1.3911,1.6147) .. (1.4083,1.6518) .. controls (1.4623,1.7160) and (1.5163,1.7802) .. (1.5702,1.8444) .. controls (1.5154,1.8979) and (1.4433,1.9287) .. (1.3757,1.9624) .. controls (1.3666,2.1156) and (1.2403,2.2511) .. (1.0881,2.2707) .. controls (1.0718,2.2731) and (1.0554,2.2743) .. (1.0390,2.2743) -- cycle;
+\fi
+%
+% Bobble hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@bobblehat
+ \begin{pgfinterruptboundingbox}
+ \fill[\duck@bobblehat] (0.4639,1.7996) .. controls (0.5789,1.8438) and (1.3853,1.6023) .. (1.4046,1.4672) .. controls (1.4581,1.5025) and (1.5242,1.5917) .. (1.4544,1.6879) .. controls (1.5205,2.1879) and (0.7711,2.3780) .. (0.5562,1.9848) .. controls (0.4314,1.9650) and (0.4277,1.8625) .. (0.4639,1.7996) -- cycle;
+ \fill[\duck@bobblehat] (1.1,2.2) circle [radius=0.1];
+ \end{pgfinterruptboundingbox}
+ \path (0.43,1.3) rectangle (1.5,2.3);
+\fi
+%
+% sombrero %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@sombrero
+ \begin{scope}[rotate=-20,xshift=8,yshift=2]
+ \fill[\duck@sombrero] (-.45,2) to[in=200] (0,2.8) to[out=-20] (.45,2) -- cycle;
+ \fill[\duck@sombrero] (-0.65, 1.75) .. controls (-0.85, 1.7) and (-0.85, 1.9) .. (-0.85, 1.9) .. controls (-0.30, 2.2) and (0.30, 2.2) .. ( 0.85, 1.9) .. controls ( 0.85, 1.9) and (0.85, 1.7) .. ( 0.65, 1.75) .. controls ( 0.30, 1.95) and (-0.30, 1.95) .. (-0.65, 1.75) -- cycle;
+ \draw[\duck@sombrerob,line width=\scalingfactor*0.8pt] (-0.85, 1.9) .. controls (-0.30, 2.2) and (0.30, 2.2) .. ( 0.85, 1.9);
+ \draw[decorate, decoration={zigzag, amplitude=\decoscalefactor*1pt, segment length=\scalingfactor*6pt}, \duck@sombreroa, line width=\scalingfactor*1pt] (-0.81, 1.8) .. controls (-0.30, 2.1) and (0.30, 2.1) .. ( 0.82, 1.8);
+ \begin{scope}
+ \clip (-.45,2) to[in=200] (0,2.8) to[out=-20] (.45,2) -- cycle;
+ \draw[decorate,decoration={zigzag, amplitude=\decoscalefactor*1pt, segment length=\scalingfactor*3pt},\duck@sombreroa, line width=\scalingfactor*1pt] (-.4,2.4) to[bend left] (.4,2.4);
+ \fill[decorate,decoration={shape backgrounds,shape=circle, shape size=\scalingfactor*2pt, shape evenly spread=7}, \duck@sombreroc] (-.3,2.6) to[bend left] (.3,2.6);
+ \fill[decorate,decoration={shape backgrounds,shape=circle,shape size=\scalingfactor*2pt,shape evenly spread=9},\duck@sombreroc] (-.4,2.18) to[bend left] (.4,2.18);
+ \end{scope}
+ \end{scope}
+\fi
+%
+% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\UseHook{tikzducks/hat}
+\csname duckhookhat\endcsname
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Accessories
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% sunglasses %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@sunglasses
+ \fill[\duck@sunglasses,rotate=-17] (0.42,1.8) rectangle (0.8,1.84);
+ \fill[\duck@sunglasses,rotate=-17] (0.12,1.8) rectangle (0.22,1.84);
+ \fill[\duck@sunglasses,rotate=-20] (0.23,1.7675) circle[radius=0.14];
+ \fill[\duck@sunglasses,rotate=-20] (-0.06,1.74) circle[radius=0.13];
+\fi
+%
+% glasses %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@glasses
+ \fill[\duck@glasses,rotate=-17] (0.42,1.8) rectangle (0.8,1.84);
+ \fill[\duck@glasses,rotate=-17] (0.12,1.8) rectangle (0.22,1.84);
+ \fill[\duck@glasses,rotate=-20,even odd rule] (0.23,1.7675) circle[radius=0.14] (0.23,1.7675) circle[radius=0.11];
+ \fill[\duck@glasses,rotate=-20,even odd rule] (-0.06,1.74) circle[radius=0.13] (-0.06,1.74) circle[radius=0.095];
+\fi
+%
+% square glasses
+\ifduck@squareglasses
+ \fill[\duck@squareglasses,rotate=-17] (0.43,1.8) rectangle (0.8,1.84);
+ \fill[\duck@squareglasses,rotate=-17] (0.12,1.8) rectangle (0.22,1.84);
+ \fill[\duck@squareglasses,rotate=-20,rounded corners=\scalingfactor*2,even odd rule] (-0.16,1.62) -- (-0.18,1.85) -- (0.05,1.87) -- (0.04,1.62) -- cycle [rounded corners=\scalingfactor*1.5] (-0.14,1.64) -- (-0.16,1.83) -- (0.03,1.85) -- (0.02,1.64) -- cycle;
+ \fill[\duck@squareglasses,rotate=-20,rounded corners=\scalingfactor*2,even odd rule] (0.12,1.63) -- (0.10,1.88) -- (0.36,1.90) -- (0.35,1.65) -- cycle [rounded corners=\scalingfactor*1.5] (0.14,1.65) -- (0.12,1.86) -- (0.34,1.88) -- (0.33,1.67) -- cycle;
+\fi
+%
+% icecream %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@icecream
+ \fill[\duck@cone,rotate=-20] (0.35,1.20)--(0.50,0.60)--(0.75,1.20);
+ \fill[\duck@flavoura] (0.85,1.03) circle[radius=0.12];
+ \fill[\duck@flavourb] (1.05,0.95) circle[radius=0.12];
+ \fill[\duck@flavourc] (0.95,1.1) circle[radius=0.12];
+\fi
+%
+% book %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@book
+ \fill[\duck@bookcolour,rotate=-20]
+ (0.40,1.20) rectangle (0.80,0.60);
+ \node[rotate=-20*\yscalefactor/\xscalefactor, color=white] at (0.88,0.70) {\duck@book};%
+\fi
+%
+% signpost %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@signpost
+ \fill[\duck@signcolour, rounded corners=\scalingfactor*1, rotate=-20] (0.8,0.75) rectangle (0.9,1.75);
+ \fill[\duck@signcolour, rounded corners=\scalingfactor*1, rotate=-20] (0.4,1.7) rectangle (1.3,2.4);
+ \fill[\duck@signback, rounded corners=\scalingfactor*1, rotate=-20] (0.45,1.75) rectangle (1.25,2.35);
+ \node[rotate=-20*\yscalefactor/\xscalefactor, color=white] at (1.5,1.65) {\duck@signpost};
+\fi
+%
+% speech bubble %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@speech
+ \fill[\duck@bubblecolour] (-0.5,1.8) ellipse[x radius=0.7, y radius=0.3];
+ \fill[\duck@bubblecolour] (-0.2,1.54) -- (0.2,1.35) -- (0.0,1.6) -- cycle;
+ \node at (-0.5,1.8) {\duck@speech};
+\fi
+%
+% think bubble %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@think
+ \fill[\duck@bubblecolour] (2,2.4) ellipse[x radius=0.7, y radius=0.35];
+ \fill[\duck@bubblecolour] (1.55,2.35) circle[radius=0.25] (2.0,2.15) circle[radius=0.25] (2.4,2.25) circle[radius=0.25] (1.6,2.55) circle[radius=0.25] (2.0,2.6) circle[radius=0.25] (2.35,2.5) circle[radius=0.25] (1.65,1.95) circle[radius=0.1] (1.55,1.80) circle[radius=0.06] (1.47,1.70) circle[radius=0.03];
+ \node at (2,2.4) {\duck@think};
+\fi
+%
+% magic wand %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@magicwand
+ \fill[black,rotate=-30] (0.27,1.23) rectangle (0.37,0.65);
+ \fill[white,rotate=-30] (0.27,1.13) rectangle (0.37,1.03);
+\fi
+%
+% cricket bat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@cricket
+ \fill[\duck@cricket, rounded corners=\scalingfactor*2, rotate=-30] (0.4,1.2) rectangle (0.7,2.2);
+ \fill[\duck@cricket, rounded corners=\scalingfactor*1, rotate=-30] (0.5,0.8) rectangle (0.6,1.3);
+\fi
+%
+% rollingpin %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@rollingpin
+ \fill[\duck@rollingpin, rounded corners=\scalingfactor*2, rotate=-60] (-0.18,0.85) rectangle (0.08,1.75);
+ \fill[\duck@rollingpin, rounded corners=\scalingfactor*1, rotate=-60] (-0.1,0.65) rectangle (0.0,1.95);
+\fi
+%
+% lightsaber %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@lightsaber
+ \fill[\duck@lightsaber, rounded corners=\scalingfactor*1, rotate=-30] (0.5,0.9) rectangle (0.6,2.5);
+ \fill[gray!80!black, rounded corners=\scalingfactor*1, rotate=-30] (0.47,0.7) rectangle (0.63,1.2);
+\fi
+%
+% cake %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@cake
+ \fill[\duck@cake] (1.00,0.50) ellipse[x radius=0.4, y radius=0.2];
+ \fill[\duck@cake] (0.6,0.5) rectangle (1.4,0.7);
+ \fill[\duck@cake] (1.00,0.70) ellipse[x radius=0.4, y radius=0.2];
+ \fill[\duck@cake!50!white] (0.75,0.75) rectangle (0.8,0.95);
+ \fill[\duck@cake!50!white] (1.2,0.75) rectangle (1.25,0.95);
+ \fill[\duck@cake!50!white] (0.975,0.65) rectangle (1.025,0.85);
+ \fill[white!85!yellow] (1.0,0.93) ellipse[x radius=0.03, y radius=0.06];
+ \fill[white!85!yellow] (1.225,1.03) ellipse[x radius=0.03, y radius=0.06];
+ \fill[white!85!yellow] (0.775,1.03) ellipse[x radius=0.03, y radius=0.06];
+\fi
+%
+% pizza %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@pizza
+ \fill[brown] (1.00,0.60) ellipse[x radius=0.4, y radius=0.2];
+ \fill[red!70!black] (1.00,0.60) ellipse[x radius=0.34, y radius=0.16];
+ \fill[white!85!yellow] (1.15,0.65) ellipse[x radius=0.065, y radius=0.04];
+ \fill[white!85!yellow] (0.81,0.57) ellipse[x radius=0.065, y radius=0.04];
+ \fill[white!85!yellow] (0.95,0.68) ellipse[x radius=0.065, y radius=0.04];
+ \fill[white!85!yellow] (1.02,0.54) ellipse[x radius=0.065, y radius=0.04];
+ \fill[green!40!brown] (1.09,0.54) ellipse[x radius=0.07, y radius=0.02];
+ \fill[green!40!brown,rotate=20] (1.0,0.34) ellipse[x radius=0.07, y radius=0.02];
+ \fill[green!40!brown,rotate=-20] (0.9,1.05) ellipse[x radius=0.07, y radius=0.02];
+ \fill[green!40!brown] (1.00,0.60) ellipse[x radius=0.03, y radius=0.06];
+\fi
+%
+% no pizza %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@davidlikespineapplepizza
+ \fill[brown] (1.00,0.60) ellipse[x radius=0.4, y radius=0.2];
+ \fill[red!70!black] (1.00,0.60) ellipse[x radius=0.34, y radius=0.16];
+ \fill[yellow!70!brown] (1.15,0.65) ellipse[x radius=0.08, y radius=0.06];
+ \fill[red!70!black] (1.15,0.65) ellipse[x radius=0.04, y radius=0.03];
+ \fill[yellow!70!brown] (0.81,0.57) ellipse[x radius=0.08, y radius=0.06];
+ \fill[red!70!black] (0.81,0.57) ellipse[x radius=0.04, y radius=0.03];
+ \fill[yellow!70!brown] (0.95,0.68) ellipse[x radius=0.08, y radius=0.06];
+ \fill[red!70!black] (0.95,0.68) ellipse[x radius=0.04, y radius=0.03];
+ \fill[yellow!70!brown] (1.02,0.54) ellipse[x radius=0.08, y radius=0.06];
+ \fill[red!70!black] (1.02,0.54) ellipse[x radius=0.04, y radius=0.03];
+ \fill[green!40!brown] (1.09,0.54) ellipse[x radius=0.07, y radius=0.02];
+ \fill[green!40!brown,rotate=20] (1.0,0.34) ellipse[x radius=0.07, y radius=0.02];
+ \fill[green!40!brown,rotate=-20] (0.9,1.05) ellipse[x radius=0.07, y radius=0.02];
+ \fill[green!40!brown] (1.00,0.60) ellipse[x radius=0.03, y radius=0.06];
+\fi
+%
+% Hockey stick %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@hockey
+ \fill[\duck@hockey, rounded corners=\scalingfactor*1, rotate=-30] (0.5,0.6) rectangle (0.6,2.1);
+ \fill[\duck@hockey, rounded corners=\scalingfactor*3] (0.2,0.2) rectangle (0.85,0.4);
+\fi
+%
+% baguette %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@baguette
+ \fill[\duck@baguette!70!white, rounded corners=\scalingfactor*4, rotate=-30] (0.4,0.72) rectangle (0.7,2.0);
+ \fill[\duck@baguette!80!black, rotate=5] (1.44,1.1) ellipse[x radius=0.1, y radius=0.03] (1.30,0.9) ellipse[x radius=0.1, y radius=0.03] (1.16,0.7) ellipse[x radius=0.1, y radius=0.03] (1.02,0.5) ellipse[x radius=0.1, y radius=0.03];
+\fi
+%
+% football %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@football
+ \fill[\duck@football] (1.2,0.33) circle[radius=0.32];
+ \begin{scope}
+ \clip (1.2,0.33) circle[radius=0.32];
+ \fill[black] (1.06,0.30) -- (1.01,0.17) -- (1.14,0.08) -- (1.26,0.14) -- (1.20,0.28) -- cycle (1.37,0.14) -- (1.46,0.27) -- (1.59,0.27) -- (1.41,0.04) -- cycle (1.28,0.38) -- (1.22,0.52) -- (1.33,0.61) -- (1.45,0.51) -- (1.43,0.37) -- cycle (0.87,0.44) -- (1.02,0.40) -- (1.10,0.53) -- (1.07,0.62) -- (0.94,0.57) -- cycle;
+ \end{scope}
+\fi
+%
+% milkshake %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@milkshake
+ \fill[cyan!10!white, rotate=-10] (0.8,0.50) ellipse[x radius=0.17, y radius=0.05];
+ \fill[cyan!10!white, rotate=-10] (0.8,0.55) ellipse[x radius=0.12, y radius=0.03];
+ \begin{scope}
+ \clip[rotate=-10] (0.58,0.5) rectangle (1.02,1.03);
+ \fill[cyan!10!white, rotate=-10] (0.8,0.94) ellipse[x radius=0.18, y radius=0.4];
+ \fill[\duck@milkshake, rotate=-10] (0.8,0.94) ellipse[x radius=0.15, y radius=0.36];
+ \end{scope}
+ \fill[white!85!yellow] (0.83,0.92) circle[radius=0.05] (0.88,0.9) circle[radius=0.05] (0.93,0.92) circle[radius=0.05] (0.99,0.91) circle[radius=0.05] (1.06,0.86) circle[radius=0.05] (1.13,0.87) circle[radius=0.05] (0.85,0.99) circle[radius=0.05] (0.9,0.98) circle[radius=0.07] (1.0,0.98) circle[radius=0.07] (1.1,0.95) circle[radius=0.07];
+ \fill[red!90!black] (1.0,1.1) circle[radius=0.05];
+ \fill[white!85!yellow] (0.94,1.05) circle[radius=0.05] (1.03,1.03) circle[radius=0.05];
+ \fill[cyan!10!white, rotate=-10] (0.8,0.50) ellipse[x radius=0.17, y radius=0.05];
+ \fill[red!90!black,rotate=20] (1.2,0.58) rectangle (1.22,0.85);
+\fi
+%
+% wine %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@wine
+ \fill[cyan!10!white, rotate=-10] (0.8,0.50) ellipse[x radius=0.17, y radius=0.05];
+ \fill[cyan!10!white, rotate=-10] (0.8,0.55) ellipse[x radius=0.12, y radius=0.03];
+ \fill[cyan!10!white, rotate=-10] (0.8,0.7) ellipse[x radius=0.03, y radius=0.2];
+ \begin{scope}
+ \clip[rotate=-10] (0.58,0.5) rectangle (1.02,1.03);
+ \fill[cyan!10!white, rotate=-10] (0.8,1.1) ellipse[x radius=0.18, y radius=0.4];
+ \end{scope}
+ \begin{scope}
+ \clip[rotate=-10] (0.58,0.5) rectangle (1.02,0.87);
+ \fill[\duck@wine, rotate=-10] (0.8,1.1) ellipse[x radius=0.15, y radius=0.36];
+ \end{scope}
+\fi
+%
+% prison duck %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@prison
+ \fill[\duck@prison] (1.5,0.25) circle[radius=0.3];
+ \fill[\duck@prison, even odd rule] (1.2,0.1) ellipse[x radius=0.10, y radius=0.07] (1.2,0.1) ellipse[x radius=0.06, y radius=0.04] (1.05,-0.05) ellipse[x radius=0.10, y radius=0.07] (1.05,-0.05) ellipse[x radius=0.06, y radius=0.04] (0.87,-0.2) ellipse[x radius=0.10, y radius=0.07] (0.87,-0.2) ellipse[x radius=0.06, y radius=0.04];
+ \fill[\duck@prison, even odd rule] (0.72,-0.2) ellipse[x radius=0.10, y radius=0.07] (0.72,-0.2) ellipse[x radius=0.06, y radius=0.04];
+ \fill[\duck@prison,even odd rule,rotate=70] (0.4,-1.05) ellipse[x radius=0.1, y radius=0.07] (0.4,-1.05) ellipse[x radius=0.06, y radius=0.04] (0.2,-0.95) ellipse[x radius=0.1, y radius=0.07] (0.2,-0.95) ellipse[x radius=0.06, y radius=0.04] (0.22,-0.58) ellipse[x radius=0.1, y radius=0.07] (0.22,-0.58) ellipse[x radius=0.06, y radius=0.04];
+ \fill[\duck@prison,even odd rule,rotate=110](-0.33,-0.55) ellipse[x radius=0.1, y radius=0.07] (-0.33,-0.55) ellipse[x radius=0.06, y radius=0.04];
+ \begin{scope}
+ \clip[rotate=-12] (0.45,0.15) rectangle (0.63,0.25);
+ \fill[\duck@prison,even odd rule,rotate=110](-0.07,-0.6) ellipse[x radius=0.1, y radius=0.07] (-0.07,-0.6) ellipse[x radius=0.06, y radius=0.04];
+ \end{scope}
+\fi
+%
+% torch %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@torch
+ \fill[red!50!yellow] \duckpathtorch;
+ \fill[red!25!yellow, scale=0.67, xshift=17, yshift=15] \duckpathtorch;
+ \fill[white!50!yellow, scale=0.4, xshift=53.5, yshift=45.3] \duckpathtorch;
+ \fill[\duck@torch,rounded corners=\scalingfactor*1]
+ (1.1,0.96) -- (0.77,0.25) -- (0.83,0.25) -- (1.3,0.86) -- cycle;
+ \fill[\duck@torch,rotate=-28]
+ (0.62,1.32) ellipse[x radius=0.2, y radius=0.08];
+\fi%
+%
+% sheep %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@sheep
+ \begin{scope}
+ \clip[rotate=-5] (1.2,1.7) ellipse[x radius=0.3, y radius=0.4];
+ \fill[\duck@bill,rotate=-5] (0.8,1.5) ellipse[x radius=0.3, y radius=0.4];
+ \end{scope}
+\fi
+%
+% basket %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@basket
+ \fill[\duck@basket, start angle=180, end angle=360, x radius=0.35, y radius=0.35] (0.65,0.61) arc -- cycle;
+ \fill[\duck@basket, start angle=180, end angle=0, even odd rule] [x radius=0.35, y radius=0.5] (0.65,0.6) arc -- cycle [x radius=0.3, y radius=0.45] (0.7,0.6) arc -- cycle;
+ \fill[\duck@basket, even odd rule] (1,0.6) ellipse[x radius=0.35, y radius=0.1] (1,0.6) ellipse[x radius=0.3, y radius=0.07];
+ \fill[\duck@basket!75!black] (1,0.6) ellipse[x radius=0.3, y radius=0.07];
+\fi%
+%
+% easter basket %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@easter
+ \begin{scope}
+ \clip [start angle=180, end angle=0, x radius=0.3, y radius=0.45] (0.7,0.6) arc -- cycle [start angle=180, end angle=360, x radius=0.3, y radius=0.07] (0.7,0.6) arc -- cycle;
+ \fill[\duck@eggb, rotate=-5] (0.95,0.72) ellipse[x radius=0.09, y radius=0.13];
+ \fill[\duck@egga, rotate=10] (0.94,0.42) ellipse[x radius=0.09, y radius=0.13];
+ \fill[\duck@eggc, rotate=-30] (0.7,1.08) ellipse[x radius=0.09, y radius=0.13];
+ \end{scope}
+\fi%
+%
+% horse tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pgfkeys{/duck/horsetail/.@def/.get=\duck@test}
+\ifx\duck@horsetail\duck@test
+ \ifdefined\duck@hair\let\duck@horsetail=\duck@hair\fi
+\fi%
+\ifduck@horsetail
+ \path (0.1,0.1) rectangle (2.82,2.14);
+ \fill[\duck@horsetail,overlay] \duckpathhorsetail;
+\fi
+%
+% crozier %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@crozier
+ \begin{scope}
+ \clip [rotate=-20] (0.6,2.3) rectangle (1.1,1.999);
+ \fill[even odd rule,\duck@crozier] (1.5,1.6) circle[radius=0.2] (1.5,1.6) circle[radius=0.1];
+ \end{scope}
+ \fill[\duck@crozier,rotate=-20] (0.663,0.5) rectangle (0.763,2.0);
+\fi
+%
+% stethoscope %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@stethoscope
+ \fill[\duck@stethoscope,rounded corners=\scalingfactor*0.5,rotate=-18] (0.08,0.7) rectangle (0.13,1.24);
+ \fill[\duck@stethoscope] (0.35,0.7) circle[radius=0.1];
+ \begin{scope}
+ \fill[\duck@stethoscope,rounded corners=\scalingfactor*0.5,rotate=-30] (0.53,1.3) rectangle (0.58,1.72);
+ \clip[rotate=-30] (0.36,0.89) -- (0.36,1.36) -- (0.79,1.36) -- (0.79,0.89) -- (0.65,0.89) -- (0.65,0.96) -- (0.5,0.96) -- (0.5,0.89) -- cycle ;
+ \fill [\duck@stethoscope,rounded corners=\scalingfactor*3,rotate=-30,even odd rule] (0.775,1.35) rectangle (0.375,0.9) [rounded corners=\scalingfactor*2] (0.725,1.3) rectangle (0.425,0.95);
+ \end{scope}
+\fi
+%
+% snow duck %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@snowduck
+ \fill[black, rotate=-25] (0.65,0.65) rectangle (0.7,1.8);
+ \fill[black, rotate=35] (1.55,0.15) rectangle (1.6,0.5);
+ \fill[black, rotate=-35] (0.4,1.7) rectangle (0.45,2.0);
+ \fill[black, rotate=-60] (-0.3,2.0) rectangle (-0.35,1.65);
+\fi
+%
+% vampire %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@vampire
+ \ifduck@laughing
+ \fill[\duck@vampire] (0.55,1.28) -- (0.575,1.22) -- (0.6,1.29) -- cycle;
+ \else
+ \fill[\duck@vampire] (0.6,1.20) -- (0.625,1.16) -- (0.65,1.223) -- cycle;
+ \fi
+\fi
+%
+% crystal ball %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@crystalball
+ \shade[ball color=\duck@crystalball,opacity=0.7] (0.93,0.5) circle[radius=0.33];
+\fi
+%
+% Cheese %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@cheese
+ \begin{scope}[xshift=26,yshift=-2]
+ \fill[\duck@cheese] (-0.3200,0.8058) -- (0.0608,0.7220) -- (0.0608,0.6366) -- (-0.3200,0.5410) -- (0.2143,0.4236) .. controls (0.3395,0.4810) and (0.4241,0.5627) .. (0.4117,0.6253) -- (0.4117,0.7634) .. controls (0.4261,0.8618) and (0.2607,0.8954) .. (0.1907,0.8962) -- cycle;
+ \fill[\duck@cheese!35!white] (-0.3200,0.8057) -- (-0.3200,0.5410) -- (0.2143,0.4236) -- (0.2143,0.7381) -- cycle;
+ \fill[\duck@cheese] (-0.23,0.71) circle[radius=0.04] (0.0,0.55) circle[radius=0.04] (-0.23,0.58) circle[radius=0.02] (-0.15,0.6) circle[radius=0.02] (-0.1,0.7) circle[radius=0.02] (0.1,0.65) circle[radius=0.02] (0,0.65) circle[radius=0.02] (0.1,0.5) circle[radius=0.02] (0.07,0.55) circle[radius=0.01] (0.12,0.6) circle[radius=0.01] (-0.08,0.54) circle[radius=0.01];
+ \end{scope}
+\fi
+%
+% shovel %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@shovel
+ \fill[brown!80!black,rotate around={-23:(0.91, 0.88)}] (0.87, 0.28) rectangle ++(0.1,1.4);
+ \fill[\duck@shovel] (0.6133, 0.9536) .. controls (0.8388, 0.8117) and (0.9253, 0.7517) .. (1.1962, 0.6696) -- (0.8332, 0.1263) .. controls (0.6458, 0.11) and (0.5417, 0.1644) .. (0.4517, 0.3034) -- cycle;
+\fi
+%
+% pickaxe %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@pickaxe
+ \fill[brown!80!black,rotate around={-23:(0.91, 0.88)}] (0.87, 0.28) rectangle ++(0.1,1.4);
+ \fill[\duck@pickaxe] (-0.0085, 0.6858) .. controls (0.6422, 0.3523) and (0.7609, 0.3068) .. (1.4114, 0.1108) .. controls (0.6589, 0.1246) and (0.5556, 0.1887) .. (-0.0085, 0.6858) -- cycle;
+\fi
+%
+% strawbroom %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@strawbroom
+ \fill[\duck@strawbroomstick] (0.9160,0.5478) -- (1.2792,1.6574) .. controls (1.3063,1.6961) and (1.3956,1.6649) .. (1.3688,1.6176) -- (0.9508,0.5179) .. controls (0.9360,0.5142) and (0.9202,0.5331) .. (0.9160,0.5478) -- cycle;
+ \fill[\duck@strawbroom] (0.5528,0.2890) .. controls (0.6449,0.3598) and (0.7460,0.5693) .. (0.8911,0.6871) .. controls (0.9481,0.7215) and (1.0395,0.6925) .. (1.0553,0.6224) .. controls (1.1219,0.4385) and (0.9965,0.2147) .. (1.0056,0.1000) .. controls (0.8926,0.0241) and (0.5950,0.2078) .. (0.5528,0.2890) -- cycle;
+ \draw[\duck@strawbroomribbon,line width=\scalingfactor*0.4pt] (0.7916,0.5876) .. controls (0.7916,0.5876) and (0.8210,0.5404) .. (0.8451,0.5304) .. controls (0.8708,0.5197) and (0.9021,0.5419) .. (0.9284,0.5329) .. controls (0.9544,0.5240) and (0.9663,0.4903) .. (0.9919,0.4806) .. controls (1.0148,0.4720) and (1.0653,0.4781) .. (1.0653,0.4781);
+ \draw[\duck@strawbroomribbon,line width=\scalingfactor*0.4pt] (0.7565,0.5493) .. controls (0.7565,0.5493) and (0.7897,0.4961) .. (0.8169,0.4848) .. controls (0.8458,0.4727) and (0.8812,0.4978) .. (0.9109,0.4876) .. controls (0.9401,0.4776) and (0.9535,0.4396) .. (0.9824,0.4287) .. controls (1.0083,0.4189) and (1.0652,0.4259) .. (1.0652,0.4259);
+\fi
+%
+% broom %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@broom
+ \begin{scope}[rotate=-10]
+ \draw[\duck@broomstick,line width=\scalingfactor*1.8pt] (0.9, 1.8) -- ++(0,-1.4);
+ \draw[\duck@broomstick,line width=\scalingfactor*1.8pt] (0.6, 0.42) -- ++(0.6,0);
+ \fill[\duck@broom] (0.6, 0.40) -- ++(-0.05,-0.1) -- ++(0.7,0) -- ++(-0.05, 0.1) -- cycle;
+ \end{scope}
+\fi
+%
+% umbrella %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@umbrella
+ \path (0.2,0.4) rectangle (2.22,2.7);
+ \fill[gray,overlay] (0.6922,0.5942) -- (0.7426,0.6103) .. controls (0.8276,0.3884) and (0.8855,0.4523) .. (0.9333,0.6543) -- (0.9334,0.6545) -- (0.9335,0.6547) .. controls (1.0347,1.0671) and (1.2906,1.9565) .. (1.2906,1.9565) -- (1.3415,1.9419) .. controls (1.3415,1.9419) and (1.0855,1.0519) .. (0.9849,0.6423) -- (0.9848,0.6420) .. controls (0.9240,0.3633) and (0.7874,0.3312) .. (0.6922,0.5942) -- cycle;
+ \fill[\duck@umbrella,overlay] (0.2185,1.9927) .. controls (0.3559,2.1962) and (0.6837,2.0720) .. (0.6761,1.8240) .. controls (0.8398,2.0111) and (1.1891,1.9216) .. (1.1685,1.6915) .. controls (1.3000,1.8765) and (1.6639,1.7626) .. (1.6607,1.5356) .. controls (1.7865,1.7271) and (2.1350,1.6950) .. (2.1626,1.4589) .. controls (2.4996,2.5771) and (0.5644,3.2631) .. (0.2185,1.9927) -- cycle;
+\fi
+%
+% closed umbrella %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@umbrellaclosed
+ \fill[gray] (1.3401,0.6996) -- (1.2872,0.7019) .. controls (1.2840,0.9395) and (1.2076,0.8995) .. (1.0930,0.7264) -- (1.0929,0.7262) -- (1.0928,0.7261) .. controls (0.8555,0.3739) and (0.9223,0.4608) .. (0.9223,0.4608) -- (0.8795,0.4920) .. controls (0.8795,0.4920) and (0.8131,0.4057) .. (1.0488,0.7554) -- (1.0489,0.7556) .. controls (1.2022,0.9963) and (1.3414,0.9793) .. (1.3401,0.6996) -- cycle;
+ \fill[\duck@umbrellaclosed] (0.6827,0.1263) -- (0.8038,0.6188) -- (0.9548,0.6494) -- (0.9520,0.8231) -- (1.1945,0.6529) -- (1.0218,0.5885) -- (1.0465,0.4566) -- cycle;
+\fi
+%
+% handbag %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@handbag
+ \fill[\duck@handbag] (0.7811,0.1751) -- (1.4913,0.3097) -- (1.3315,0.7086) -- (0.7832,0.6152) -- cycle;
+ \fill[\duck@handbag!70!black] (0.8857,0.4354) .. controls (0.7861,0.9811) and (1.1796,1.0719) .. (1.2866,0.5155) -- (1.2043,0.4996) .. controls (1.1247,0.8952) and (0.9051,0.8883) .. (0.9676,0.4536) -- cycle;
+\fi
+%
+% cocktail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@cocktail
+ \fill[cyan!10!white, rotate=-10] (0.8,0.50) ellipse[x radius=0.17, y radius=0.05];
+ \fill[cyan!10!white, rotate=-10] (0.8,0.55) ellipse[x radius=0.12, y radius=0.03];
+ \fill[cyan!10!white, rotate=-10] (0.8,0.7) ellipse[x radius=0.03, y radius=0.2];
+ \fill[cyan!10!white] (0.92,0.6) -- (0.75,0.9) -- (1.18,0.83) -- cycle;
+ \fill[gray!60!white] (0.928,0.64) -- (0.85,0.77) -- (1.08,0.77) -- cycle;
+ \fill[green!40!brown!60!white] (0.94,0.71) circle[radius=0.04];
+ \fill[red!80!black] (0.94,0.72) circle[radius=0.01];
+\fi
+%
+% banana %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@banana
+ \begin{scope}[yshift=10,xshift=19,rotate=-25,scale=1.3]
+ \fill[\duck@banana!30!] (0.02,0) .. controls (0.21,0.20) and (0.21,0.40) .. (0.02,0.6) arc [start angle=60,end angle=120, radius =0.04] .. controls (0.07,0.40) and (0.07,0.20) .. (-0.02,0) --cycle ;
+ %peel
+ \begin{scope}
+ \clip (-0.04,-0.01) rectangle (0.20,0.3);
+ \fill[\duck@banana] (0.03,0) .. controls (0.22,0.20) and (0.22,0.40) .. (0.03,0.6) arc [start angle=60,end angle=120, radius =0.06] .. controls (0.06,0.40) and (0.06,0.20) .. (-0.03,0);
+ \end{scope}
+ \fill[\duck@banana!60!] (0.12,0.3) arc [start angle=140, end angle=-100, y radius=0.20, x radius=0.06] arc [start angle=-90, end angle=90, y radius=0.15, x radius=0.02] (0.12,0.3) arc [start angle=60, end angle=270, y radius=0.15, x radius=0.1] arc [start angle=270, end angle=90, y radius=0.13, x radius=0.04];
+ \end{scope}
+\fi
+%
+% stick %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@stick
+ \begin{scope}[rotate=-30,yshift=16,xshift=12]
+ %leaf
+ \begin{scope}[rotate=60, xshift=8.2,yshift=8.1]
+ \fill[\duck@leaf] (-0.01,0) .. controls (-0.1,0) and (-0.02, 0.2) .. (0,0.2) .. controls (0.02, 0.2) and (0.1,0) .. (0.01,0.0);
+ \path[clip] (-0.04,-0.04)-- (-0.01,0) .. controls (-0.1,0) and (-0.02, 0.2) .. (0,0.2) .. controls (0.02, 0.2) and (0.1,0) .. (0.01,0)-- (0.04,-0.04) --cycle;
+ \draw[\duck@leaf!80!, line width=0.1] (0,-0.04) -- (0,0.2) \foreach \i in {0.02,0.04,...,0.2} {(0,\i) -- ++(0.1,\i) (0,\i) -- ++(-0.1,\i)} ;
+ \end{scope}
+ %stick itself
+ \fill[\duck@stick!90!red] (-0.04,0.8) -- (-0.04,0.4) arc[start angle=345,end angle=270,radius=0.03] -- ++(0,-0.01) arc[start angle=90,end angle=15,radius=0.03] -- (-0.04,0) arc [start angle=180, end angle=360 ,x radius=0.04, y radius=0.02] -- (0.04, 0.4) arc [start angle=180, end angle=120, radius=0.08] arc [start angle=-90, end angle=90, x radius=0.02, y radius=0.04] arc [start angle=240, end angle=180, radius=0.08] -- (0.04,0.75) arc [start angle=0, end angle=120 ,x radius=0.04, y radius=0.02] --cycle;
+ \fill[\duck@stick!90!] (0.08, 0.51) ellipse [x radius=0.02, y radius=0.04] (0,0.75) ellipse [x radius=0.04, y radius=0.02] ;
+ \draw[\duck@stick!90!red, line width=0.06] (0.08, 0.51) ellipse [x radius=0.016, y radius=0.032]
+ ellipse [x radius=0.012, y radius=0.024] ellipse [x radius=0.008, y radius=0.016] (0,0.75) ellipse [y radius=0.016, x radius=0.032] ellipse [y radius=0.012, x radius=0.024] ellipse [y radius=0.008, x radius=0.016] ;
+ \fill[\duck@stick!90!red] (0.08, 0.51) ellipse [x radius=0.004, y radius=0.008] (0,0.75) ellipse [x radius=0.008, y radius=0.004];
+ \end{scope}
+\fi
+%
+% megaphone %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@megaphone
+ \fill[\duck@megaphone] (0.2,1.2) ellipse[x radius=0.05,y radius=0.1];
+ \fill[\duck@megaphone] (-0.4,1.2) ellipse[x radius=0.1,y radius=0.3];
+ \fill[\duck@megaphone] (0.2,1.3) -- (-0.4,1.5) -- (-0.4,0.9) -- (0.2,1.1) -- cycle;
+ \fill[\duck@megaphone!70!black] (-0.4,1.2) ellipse[x radius=0.07,y radius=0.25];
+ \draw[line width=\scalingfactor*2pt,\duck@megaphone] (-0.05,1.05) circle [radius=0.13];
+\fi
+%
+% overleaf duck %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@overleaf
+ \fill[white] \duckpathoverleaf;
+\fi
+%
+% wing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifduck@wing
+ \fill[\duck@wing] \duckpathwing;
+\fi
+%
+% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\UseHook{tikzducks/foreground}
+\csname duckhookforeground\endcsname
+%
+%\draw (current bounding box.north west) rectangle (current bounding box.south east);% For debugging bounding boxes
+%
+\end{scope}%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Random ducks
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\pgfmathdeclarerandomlist{head}{\duck@listhead}
+\pgfmathdeclarerandomlist{accessories}{\duck@listacces}
+
+\def\shuffleducks{%
+ \pgfmathrandomitem{\head}{head}%
+ \edef\randomhead{\head}%
+ \pgfmathrandomitem{\accessories}{accessories}%
+ \edef\randomaccessories{\accessories}%
+}
+
+\newcommand*{\randuck}[1][]{%
+ \duck[randomhead, randomaccessories, #1]%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Defining some of the more complicate paths for easy reuse
+%
+% naming scheme is \duckpath<name>
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% body parts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\duckpathbody{%
+ (0.513,1.145) .. controls (0.267, 1.102) and (-0.125,0.657) ..
+ (0.289,0.261) .. controls (0.704,-0.135) and ( 2.863,0.130) ..
+ (1.818,1.419) .. controls (0.938, 0.946) and ( 1.240,1.379) ..
+ (0.513,1.145) -- cycle
+}
+
+\def\duckpathgrumpybill{%
+ (0.406,1.472) .. controls (0.643,1.530) and (0.643,1.530) ..
+ (0.800,1.300) .. controls (0.083,0.850) and (0.269,1.369) ..
+ (0.406,1.472) -- cycle
+}
+
+\def\duckpathbill{%
+ (0.406,1.472) .. controls (0.643,1.530) and (0.541,1.303) ..
+ (0.910,1.370) .. controls (0.083,0.850) and (0.269,1.369) ..
+ (0.406,1.472) -- cycle
+}
+
+\def\duckpathwing{%
+ (1.47,0.56) .. controls (1.51,0.59) and (1.57,0.62) ..
+ (1.60,0.66) .. controls (1.61,0.70) and (1.51,0.69) ..
+ (1.47,0.69) .. controls (1.48,0.72) and (1.41,0.76) ..
+ (1.37,0.74) .. controls (1.35,0.79) and (1.33,0.81) ..
+ (1.25,0.80) .. controls (1.25,0.86) and (1.18,0.88) ..
+ (1.15,0.88) .. controls (1.20,1.01) and (0.40,0.79) ..
+ (0.52,0.57) .. controls (0.63,0.26) and (1.22,0.43) ..
+ (1.47,0.56) -- cycle
+}
+
+% clothing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\duckpathtshirt{%
+ (0.490,1.145) .. controls (0.267, 1.102) and (-0.125,0.657) ..
+ (0.289,0.261) .. controls (0.704,-0.135) and ( 2.863,0.130) ..
+ (1.818,1.419) .. controls (0.938, 0.976) and ( 1.240,1.279) ..
+ (0.590,1.000) -- cycle
+}
+
+\def\duckpathjacket{%
+ (0.490,1.145) .. controls (0.267, 1.102) and (-0.125,0.657) ..
+ (0.289,0.261) .. controls (0.704,-0.135) and ( 2.863,0.130) ..
+ (1.818,1.419) .. controls (0.880, 0.946) and ( 1.240,1.378) ..
+ (0.513,0.700) -- cycle
+}
+
+% hair styles %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\duckpathshorthair{%
+ (1.3947,1.4175) .. controls (1.4546,1.4518) and (1.4699,1.6566) ..
+ (1.4343,1.7992) .. controls (1.2528,2.5033) and (0.2339,2.2710) ..
+ (0.4151,1.5907) .. controls (0.4345,1.8709) and (0.7421,2.0999) ..
+ (0.9494,1.9054) .. controls (1.2241,1.6476) and (1.3316,1.3814) ..
+ (1.3947,1.4175) -- cycle
+}
+
+\def\duckpathlonghair{%
+ (1.4508,0.7565) .. controls (1.5146,0.7888) and (1.5854,0.8216) ..
+ (1.6247,0.8831) .. controls (1.5859,0.8847) and (1.4726,0.9457) ..
+ (1.5587,0.9706) .. controls (1.6317,0.9685) and (1.7016,1.0046) ..
+ (1.7314,1.0734) .. controls (1.7931,1.1660) and (1.6616,1.1176) ..
+ (1.6277,1.1566) .. controls (1.6853,1.1741) and (1.7840,1.1829) ..
+ (1.8123,1.2244) .. controls (1.7022,1.2488) and (1.5688,1.2663) ..
+ (1.5063,1.3739) .. controls (1.4619,1.5143) and (1.4696,1.6649) ..
+ (1.4340,1.8076) .. controls (1.2524,2.5117) and (0.2335,2.2794) ..
+ (0.4060,1.5991) .. controls (0.4341,1.8793) and (0.6629,2.1130) ..
+ (0.9011,1.9578) .. controls (1.2427,1.7382) and (1.3350,1.4214) ..
+ (1.0905,1.0610) .. controls (1.0597,1.0109) and (1.1103,0.9166) ..
+ (1.1805,0.8670) .. controls (1.2507,0.8174) and (1.3503,0.7853) ..
+ (1.4508,0.7565) -- cycle
+}
+
+\def\duckpathcrazyhair{%
+ (0.1977,1.9023) .. controls (0.2633,2.0599) and (0.4819,2.0547) ..
+ (0.4713,2.0879) .. controls (0.4647,2.2106) and (0.2516,2.2392) ..
+ (0.2516,2.2392) .. controls (0.4352,2.2933) and (0.7427,1.9304) ..
+ (0.5743,2.3885) .. controls (0.6017,2.3633) and (0.8307,2.1739) ..
+ (0.8082,2.4245) .. controls (0.8271,2.2885) and (0.9195,2.2400) ..
+ (0.9933,2.2673) .. controls (1.0814,2.6593) and (0.9688,2.0034) ..
+ (1.3350,2.3615) .. controls (1.3657,2.3292) and (1.1627,2.1043) ..
+ (1.3424,2.1387) .. controls (1.3102,1.8312) and (1.5049,2.2623) ..
+ (1.5049,2.2623) .. controls (1.5049,2.2623) and (1.4675,2.0493) ..
+ (1.4287,1.9560) .. controls (1.4287,1.9560) and (1.6830,1.9470) ..
+ (1.7178,1.8823) .. controls (1.1926,1.8054) and (2.0160,1.7277) ..
+ (1.4923,1.7275) .. controls (1.5366,1.6685) and (1.3013,1.6009) ..
+ (1.6500,1.5946) .. controls (0.8836,1.5797) and (1.2764,1.9221) ..
+ (0.8957,2.0442) .. controls (0.5516,2.0958) and (0.5228,1.8527) ..
+ (0.4695,1.7963) .. controls (0.4825,1.9607) and (0.3601,1.9095) ..
+ (0.1977,1.9023) -- cycle
+}
+
+\def\duckpathrecedinghair{%
+ (1.3385,1.4841) .. controls (1.4243,1.4529) and (1.4877,1.7127) ..
+ (1.3964,1.8658) .. controls (1.1071,2.3511) and (0.5189,2.1609) ..
+ (0.4381,1.6816) .. controls (0.4575,1.9618) and (0.9007,2.2059) ..
+ (1.1308,2.0390) .. controls (1.4703,1.7469) and (1.0343,1.5949) ..
+ (1.3385,1.4841) -- cycle
+}
+
+\def\duckpathmohican{%
+ (0.7632,1.7935) .. controls (0.9223,2.3084) and (1.3870,1.8580) ..
+ (1.3920,1.5854) .. controls (1.4233,2.1466) and (0.6812,2.5808) ..
+ (0.6725,1.8166) .. controls (0.6725,1.8166) and (0.7615,1.7926) ..
+ (0.7632,1.7935) -- cycle
+}
+
+\def\duckpathmullet{%
+ (1.3723,1.2684) .. controls (1.3723,1.2684) and (1.5129,1.5571) ..
+ (1.4435,1.7815) .. controls (1.2652,2.3572) and (0.3342,2.2633) ..
+ (0.4106,1.5424) .. controls (0.4204,1.6825) and (0.5692,1.9195) ..
+ (0.5692,1.9195) .. controls (0.5692,1.9195) and (0.8475,1.8402) ..
+ (1.1031,1.7844) .. controls (1.0808,1.6260) and (1.1130,1.4754) ..
+ (1.1130,1.4754) .. controls (1.1956,1.4198) and (1.3001,1.3369) ..
+ (1.3723,1.2684) -- cycle
+}
+
+% Accessories %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\duckpathqueencrown{%
+ (0.7370,2.0732) .. controls (0.6966,2.2091) and (0.6769,2.3503) ..
+ (0.6354,2.4859) .. controls (0.6149,2.5164) and (0.5958,2.5732) ..
+ (0.6498,2.5808) .. controls (0.6973,2.5907) and (0.7091,2.5350) ..
+ (0.6926,2.5016) .. controls (0.6967,2.4544) and (0.7188,2.4109) ..
+ (0.7340,2.3665) .. controls (0.7415,2.3472) and (0.7619,2.2862) ..
+ (0.7676,2.3381) .. controls (0.7755,2.3852) and (0.7871,2.4329) ..
+ (0.7833,2.4808) .. controls (0.7597,2.5148) and (0.7834,2.5720) ..
+ (0.8294,2.5570) .. controls (0.8775,2.5457) and (0.8536,2.4937) ..
+ (0.8436,2.4638) .. controls (0.8502,2.3973) and (0.8640,2.3313) ..
+ (0.8798,2.2664) .. controls (0.9047,2.2750) and (0.9168,2.3261) ..
+ (0.9342,2.3514) .. controls (0.9492,2.3853) and (0.9714,2.4171) ..
+ (0.9773,2.4540) .. controls (0.9645,2.4873) and (0.9766,2.5358) ..
+ (1.0204,2.5303) .. controls (1.0646,2.5298) and (1.0691,2.4725) ..
+ (1.0443,2.4460) .. controls (1.0440,2.3935) and (1.0580,2.3419) ..
+ (1.0671,2.2905) .. controls (1.0706,2.2719) and (1.0788,2.2126) ..
+ (1.0985,2.2554) .. controls (1.1269,2.3087) and (1.1558,2.3623) ..
+ (1.1772,2.4187) .. controls (1.1697,2.4515) and (1.1716,2.5081) ..
+ (1.2210,2.5018) .. controls (1.2706,2.4969) and (1.2686,2.4403) ..
+ (1.2406,2.4126) .. controls (1.2279,2.3600) and (1.2211,2.3057) ..
+ (1.2172,2.2518) .. controls (1.2296,2.2439) and (1.2538,2.2943) ..
+ (1.2693,2.3112) .. controls (1.2908,2.3467) and (1.3228,2.3784) ..
+ (1.3316,2.4200) .. controls (1.3203,2.4624) and (1.3708,2.5014) ..
+ (1.4051,2.4678) .. controls (1.4448,2.4342) and (1.3945,2.3994) ..
+ (1.3765,2.3710) .. controls (1.3022,2.2536) and (1.2440,2.1265) ..
+ (1.1686,2.0097) .. controls (0.9649,1.9465) and (0.8367,1.9955) ..
+ (0.7370,2.0732) -- cycle
+}
+
+\def\duckpathkingcrown{%
+ (0.6572,2.0396) .. controls (0.6637,2.0838) and (0.6716,2.1289) ..
+ (0.6684,2.1735) .. controls (0.6481,2.2496) and (0.5923,2.3131) ..
+ (0.5818,2.3921) .. controls (0.5738,2.4607) and (0.6167,2.5343) ..
+ (0.6862,2.5502) .. controls (0.7548,2.5703) and (0.8210,2.5304) ..
+ (0.8720,2.4881) .. controls (0.8984,2.4712) and (0.9239,2.4324) ..
+ (0.9486,2.4249) .. controls (0.9524,2.4691) and (0.9566,2.5158) ..
+ (0.9844,2.5527) .. controls (1.0052,2.5845) and (1.0390,2.6282) ..
+ (1.0820,2.6127) .. controls (1.1212,2.5899) and (1.1378,2.5421) ..
+ (1.1478,2.5003) .. controls (1.1576,2.4639) and (1.1336,2.4180) ..
+ (1.1349,2.3906) .. controls (1.2050,2.4269) and (1.2847,2.4629) ..
+ (1.3654,2.4429) .. controls (1.4292,2.4285) and (1.4864,2.3679) ..
+ (1.4793,2.2998) .. controls (1.4859,2.2404) and (1.4407,2.1925) ..
+ (1.4006,2.1551) .. controls (1.3681,2.1232) and (1.3290,2.0951) ..
+ (1.3072,2.0544) .. controls (1.2904,2.0121) and (1.2805,1.9674) ..
+ (1.2738,1.9225) .. controls (1.1221,1.8892) and (0.9586,1.8836) ..
+ (0.8112,1.9386) .. controls (0.7535,1.9608) and (0.6999,1.9945) ..
+ (0.6572,2.0396) -- cycle
+}
+
+\def\duckpathdarthvader{%
+ (0.4264,1.9092) .. controls (0.4347,1.9248) and (0.4612,1.9186) ..
+ (0.4969,1.9783) .. controls (0.5499,2.0670) and (0.7559,2.2377) ..
+ (0.9889,2.2057) .. controls (1.2691,2.1668) and (1.4075,1.8829) ..
+ (1.4176,1.7421) .. controls (1.4279,1.5955) and (1.5246,1.3484) ..
+ (1.5246,1.3484) --
+ (0.9846,1.2036) .. controls (1.0898,1.2735) and (1.0667,1.5598) ..
+ (1.0555,1.6034) .. controls (0.9758,1.9147) and (0.8121,1.8681) ..
+ (0.7174,1.7694) .. controls (0.5671,2.0370) and (0.4103,1.7556) ..
+ (0.4132,1.472) --
+ (0.3529,1.415) .. controls (0.3529,1.43938) and (0.3893,1.8379)..
+ (0.4264,1.9092) -- cycle
+}
+
+\def\duckpathhorsetail{%
+ (1.7248,1.3553) .. controls (2.0530,1.3369) and (2.1427,1.1604) ..
+ (2.2915,0.9970) .. controls (2.4759,0.7946) and (2.9531,0.8890) ..
+ (2.7668,0.9003) .. controls (2.4670,0.9184) and (2.5158,1.1488) ..
+ (2.3907,1.3152) .. controls (2.2788,1.4641) and (1.9414,1.5945) ..
+ (1.7248,1.3553) -- cycle
+}
+
+\def\duckpathcape{%
+ (0.225,0.966) .. controls (1.314,0.961) and (2.070,0.650) ..
+ (2.042,1.245) .. controls (1.863,1.164) and (1.844,1.173) ..
+ (1.792,1.340) .. controls (1.635,1.235) and (1.620,1.268) ..
+ (1.567,1.393) .. controls (1.358,1.086) and (0.664,1.096) ..
+ (0.460,1.110) .. controls (0.461,1.133) and (0.305,1.077) ..
+ (0.235,0.966) -- cycle
+}
+
+\def\duckpathcrown{%
+ (0.7365,2.0616) .. controls (0.7365,2.0616) and (0.7771,2.1763) ..
+ (0.6959,2.4650) -- (0.8895,2.2378) -- (1.0391,2.3943) --
+ (1.1260,2.1961) --
+ (1.3938,2.3318) .. controls (1.1927,2.1132) and (1.2194,1.9764) ..
+ (1.2194,1.9764) .. controls (1.0774,1.9202) and (0.8507,1.9601) ..
+ (0.7365,2.0616) -- cycle
+}
+
+\def\duckpathtorch{%
+ (1.4338,1.0258) .. controls (1.4308,0.8877) and (1.3468,0.8997) ..
+ (1.2447,0.7481) .. controls (1.1427,0.8982) and (1.0721,0.8892) ..
+ (1.0646,1.0243) .. controls (1.0541,1.1714) and (1.2642,1.1654) ..
+ (1.2492,1.3860) .. controls (1.3093,1.3110) and (1.4383,1.2705) ..
+ (1.4338,1.0258) -- cycle
+}
+
+\def\duckpathoverleaf{%
+ (1.2699,0.6095) .. controls (1.2710,0.5992) and (1.2752,0.5910) .. (1.2822,0.5852) .. controls (1.2892,0.5793) and (1.2983,0.5763) .. (1.3095,0.5763) .. controls (1.3165,0.5762) and (1.3233,0.5778) .. (1.3295,0.5809) .. controls (1.3353,0.5840) and (1.3401,0.5885) .. (1.3436,0.5940) -- (1.3792,0.5940) .. controls (1.3731,0.5785) and (1.3640,0.5664) .. (1.3521,0.5578) .. controls (1.3398,0.5492) and (1.3252,0.5447) .. (1.3103,0.5449) .. controls (1.3002,0.5448) and (1.2902,0.5467) .. (1.2808,0.5505) .. controls (1.2718,0.5544) and (1.2636,0.5601) .. (1.2567,0.5672) .. controls (1.2500,0.5742) and (1.2446,0.5825) .. (1.2410,0.5915) .. controls (1.2372,0.6005) and (1.2353,0.6101) .. (1.2353,0.6198) .. controls (1.2352,0.6294) and (1.2370,0.6389) .. (1.2404,0.6479) .. controls (1.2438,0.6567) and (1.2489,0.6647) .. (1.2554,0.6715) .. controls (1.2625,0.6790) and (1.2709,0.6850) .. (1.2802,0.6892) .. controls (1.2891,0.6933) and (1.2988,0.6954) .. (1.3086,0.6955) .. controls (1.3207,0.6955) and (1.3325,0.6926) .. (1.3432,0.6871) .. controls (1.3540,0.6813) and (1.3633,0.6732) .. (1.3705,0.6634) .. controls (1.3751,0.6571) and (1.3786,0.6501) .. (1.3807,0.6427) .. controls (1.3831,0.6341) and (1.3842,0.6253) .. (1.3841,0.6164) .. controls (1.3840,0.6139) and (1.3839,0.6119) .. (1.3837,0.6092) .. controls (1.3458,0.6093) and (1.3079,0.6094) .. (1.2699,0.6095) -- cycle(1.3486,0.6358) .. controls (1.3458,0.6453) and (1.3410,0.6525) .. (1.3343,0.6575) .. controls (1.3276,0.6625) and (1.3192,0.6650) .. (1.3090,0.6650) .. controls (1.3004,0.6651) and (1.2920,0.6622) .. (1.2852,0.6570) .. controls (1.2783,0.6517) and (1.2733,0.6443) .. (1.2711,0.6359) .. controls (1.2969,0.6359) and (1.3228,0.6358) .. (1.3486,0.6358) -- cycle(1.5160,0.5487) -- (1.5160,0.5662) .. controls (1.5122,0.5593) and (1.5064,0.5538) .. (1.4992,0.5505) .. controls (1.4920,0.5471) and (1.4828,0.5455) .. (1.4715,0.5455) .. controls (1.4505,0.5455) and (1.4329,0.5527) .. (1.4187,0.5670) .. controls (1.4046,0.5814) and (1.3976,0.5993) .. (1.3975,0.6206) .. controls (1.3975,0.6303) and (1.3993,0.6401) .. (1.4029,0.6492) .. controls (1.4063,0.6580) and (1.4114,0.6661) .. (1.4180,0.6729) .. controls (1.4246,0.6801) and (1.4327,0.6857) .. (1.4416,0.6895) .. controls (1.4509,0.6932) and (1.4608,0.6950) .. (1.4708,0.6949) .. controls (1.4800,0.6951) and (1.4891,0.6933) .. (1.4976,0.6896) .. controls (1.5050,0.6862) and (1.5112,0.6807) .. (1.5156,0.6739) -- (1.5156,0.6911) -- (1.5480,0.6911) -- (1.5480,0.5485) -- (1.5160,0.5485) -- (1.5160,0.5487) -- cycle(1.4436,0.5910) .. controls (1.4513,0.5831) and (1.4619,0.5787) .. (1.4729,0.5789) .. controls (1.4833,0.5789) and (1.4926,0.5829) .. (1.5006,0.5911) .. controls (1.5083,0.5986) and (1.5126,0.6088) .. (1.5126,0.6196) .. controls (1.5127,0.6307) and (1.5084,0.6414) .. (1.5006,0.6494) .. controls (1.4926,0.6577) and (1.4833,0.6619) .. (1.4727,0.6619) .. controls (1.4618,0.6621) and (1.4514,0.6577) .. (1.4439,0.6499) .. controls (1.4361,0.6423) and (1.4318,0.6318) .. (1.4317,0.6205) .. controls (1.4315,0.6092) and (1.4355,0.5991) .. (1.4436,0.5910) -- cycle(1.6366,0.6913) -- (1.6366,0.6617) -- (1.6127,0.6617) -- (1.6127,0.5487) -- (1.5806,0.5487) -- (1.5806,0.6617) -- (1.5637,0.6617) -- (1.5637,0.6913) -- (1.5796,0.6913) -- (1.5796,0.6952) .. controls (1.5796,0.7102) and (1.5838,0.7214) .. (1.5922,0.7288) .. controls (1.6005,0.7362) and (1.6131,0.7399) .. (1.6300,0.7399) .. controls (1.6324,0.7398) and (1.6347,0.7396) .. (1.6370,0.7395) -- (1.6370,0.7097) -- (1.6347,0.7097) .. controls (1.6272,0.7097) and (1.6218,0.7084) .. (1.6186,0.7059) .. controls (1.6154,0.7034) and (1.6138,0.6993) .. (1.6138,0.6936) -- (1.6138,0.6910) .. controls (1.6214,0.6913) and (1.6290,0.6912) .. (1.6366,0.6913) -- cycle(1.1906,0.5487) -- (1.2231,0.5487) -- (1.2231,0.7374) -- (1.1906,0.7374) -- cycle(0.9820,0.6095) .. controls (0.9831,0.5992) and (0.9872,0.5910) .. (0.9943,0.5852) .. controls (1.0013,0.5793) and (1.0104,0.5763) .. (1.0216,0.5763) .. controls (1.0285,0.5762) and (1.0354,0.5778) .. (1.0416,0.5809) .. controls (1.0474,0.5839) and (1.0522,0.5885) .. (1.0556,0.5940) -- (1.0914,0.5940) .. controls (1.0854,0.5785) and (1.0763,0.5664) .. (1.0643,0.5578) .. controls (1.0522,0.5492) and (1.0382,0.5449) .. (1.0225,0.5449) .. controls (1.0124,0.5448) and (1.0024,0.5467) .. (0.9931,0.5505) .. controls (0.9840,0.5544) and (0.9758,0.5601) .. (0.9690,0.5672) .. controls (0.9622,0.5742) and (0.9569,0.5825) .. (0.9532,0.5915) .. controls (0.9495,0.6005) and (0.9475,0.6101) .. (0.9475,0.6198) .. controls (0.9475,0.6294) and (0.9492,0.6389) .. (0.9527,0.6479) .. controls (0.9560,0.6567) and (0.9611,0.6647) .. (0.9677,0.6715) .. controls (0.9747,0.6790) and (0.9830,0.6850) .. (0.9924,0.6892) .. controls (1.0012,0.6933) and (1.0109,0.6955) .. (1.0207,0.6955) .. controls (1.0327,0.6955) and (1.0446,0.6927) .. (1.0552,0.6871) .. controls (1.0660,0.6813) and (1.0753,0.6732) .. (1.0826,0.6634) .. controls (1.0871,0.6571) and (1.0906,0.6501) .. (1.0926,0.6427) .. controls (1.0949,0.6341) and (1.0960,0.6253) .. (1.0959,0.6164) .. controls (1.0959,0.6139) and (1.0957,0.6119) .. (1.0956,0.6092) .. controls (1.0577,0.6100) and (1.0199,0.6095) .. (0.9820,0.6095) -- cycle(1.0606,0.6358) .. controls (1.0578,0.6453) and (1.0531,0.6526) .. (1.0463,0.6575) .. controls (1.0397,0.6625) and (1.0312,0.6650) .. (1.0210,0.6650) .. controls (1.0124,0.6651) and (1.0041,0.6622) .. (0.9973,0.6570) .. controls (0.9903,0.6517) and (0.9853,0.6443) .. (0.9830,0.6359) .. controls (1.0089,0.6359) and (1.0348,0.6358) .. (1.0606,0.6358) -- cycle(1.1761,0.6624) .. controls (1.1632,0.6614) and (1.1542,0.6580) .. (1.1492,0.6523) .. controls (1.1441,0.6465) and (1.1415,0.6363) .. (1.1415,0.6214) -- (1.1415,0.5487) -- (1.1083,0.5487) -- (1.1083,0.6913) -- (1.1394,0.6913) -- (1.1394,0.6748) .. controls (1.1438,0.6808) and (1.1494,0.6856) .. (1.1559,0.6891) .. controls (1.1621,0.6923) and (1.1690,0.6938) .. (1.1760,0.6937) .. controls (1.1760,0.6833) and (1.1761,0.6728) .. (1.1761,0.6624) -- cycle(0.8646,0.8092) .. controls (0.8244,0.8248) and (0.6787,0.8306) .. (0.6784,0.7437) .. controls (0.6359,0.7165) and (0.6078,0.6721) .. (0.6078,0.6246) .. controls (0.6077,0.5410) and (0.7016,0.4916) .. (0.7705,0.5391) .. controls (0.8394,0.5866) and (0.8268,0.6919) .. (0.7486,0.7217) .. controls (0.7411,0.7246) and (0.7248,0.7297) .. (0.7117,0.7286) .. controls (0.6931,0.7168) and (0.6704,0.6924) .. (0.6597,0.6682) .. controls (0.6918,0.7064) and (0.7528,0.6983) .. (0.7737,0.6530) .. controls (0.7947,0.6076) and (0.7614,0.5559) .. (0.7115,0.5562) .. controls (0.6914,0.5562) and (0.6724,0.5649) .. (0.6594,0.5802) .. controls (0.6410,0.6019) and (0.6363,0.6254) .. (0.6400,0.6484) .. controls (0.6532,0.7289) and (0.7487,0.7748) .. (0.8197,0.7924) .. controls (0.7966,0.7801) and (0.7548,0.7600) .. (0.7255,0.7380) .. controls (0.8108,0.7051) and (0.8246,0.7770) .. (0.8646,0.8092) -- cycle(0.8731,0.5487) -- (0.8189,0.6913) -- (0.8542,0.6913) -- (0.8874,0.5965) -- (0.9217,0.6913) -- (0.9561,0.6913) -- (0.8991,0.5487) -- cycle
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Picture mode ducks
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\picduck{%
+ % bill %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \qbezier(6.5,29.5)(-1,17.5)(16.8,27.3)
+ \qbezier(6.5,29.5)(9,30.5)(11.4,28.0)
+ \qbezier(11.4,28.0)(13.5,26.5)(16.8,27.3)
+ % head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \qbezier(06.5,29.5)(6,41.5)(16.8,42.4)
+ \qbezier(16.8,42.4)(29,41)(25.3,24)
+ % body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \qbezier(7.8,23.2)(8,22.8)(8,22.5)
+ \qbezier(8,22.5)(-5,9)(8,3)
+ \qbezier(8,3)(22,-2)(35,6.5)
+ \qbezier(35,6.5)(46,15)(35,28.3)
+ \qbezier(35,28.3)(30,25)(25.3,24)
+ % right eye %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \qbezier(13,32)(13.8,34.5)(16,34)
+ \qbezier(16,34)(17.3,33.2)(16.7,31)
+ \qbezier(16.7,31)(16,29.1)(14.5,29.3)
+ \qbezier(14.5,29.3)(12.7,29.5)(13,32)
+ \put(15.3,31.3){\circle*{1.8}}
+ % left eye %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \qbezier(7.7,33.2)(8.4,35.7)(10.3,35)
+ \qbezier(10.3,35)(11.2,34)(10.4,32.2)
+ \qbezier(10.4,32.2)(9.7,30.7)(8.7,30.7)
+ \qbezier(8.7,30.7)(7.2,30.9)(7.7,33.2)
+ \put(9.5,32.7){\circle*{1.5}}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% stripes for sports jerseys
+%
+% code contributed by Carla Maggi
+% https://tex.stackexchange.com/a/387126/36296
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\tikzset{
+ /stripes/.cd,
+ color/.code = \def\stripes@color{#1},
+ distance/.code = \def\stripes@distance{#1},
+ width/.code = \def\stripes@width{#1},
+ height/.code = \def\stripes@height{#1},
+ initialx/.code = \def\stripes@initialx{#1},
+ initialy/.code = \def\stripes@initialy{#1},
+ rotate/.code = \def\stripes@rotate{#1},
+ emblem/.code = \def\stripes@emblem{#1},
+ % setting defaults %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ color = black,
+ distance = 0.3,
+ width = 0.15,
+ height = 2.7,
+ initialx = 0.1,
+ initialy = -0.3,
+ rotate = -10,
+ emblem = \empty
+}
+
\newcommand*{\stripes}[1][]{%
\tikzset{/stripes/.cd,#1}%
- \stripes@draw%
+ \path (0.1,0.1) rectangle (2.1,1.45);
+ \begin{pgfinterruptboundingbox}
+ \begin{scope}
+ \clip \duckpathjacket;
+ \foreach \shifta in {0,\stripes@distance,...,2.4}{%
+ \fill[\stripes@color,rotate around={\stripes@rotate:(1.2,0.9)}]
+ ($(\stripes@initialx,\stripes@initialy)+(\shifta,0)$) rectangle ($(\stripes@initialx,\stripes@initialy)+(\shifta,0)+(\stripes@width,\stripes@height)$);
+ }
+ \end{scope}
+ \end{pgfinterruptboundingbox}
+ \node at (wing) {\stripes@emblem };
}
-
-\input tikzducks-generic
diff --git a/graphics/pgf/contrib/tikzducks/tikzlibraryducks.code.tex b/graphics/pgf/contrib/tikzducks/tikzlibraryducks.code.tex
index 4c90b1f0e6..199d41c1db 100644
--- a/graphics/pgf/contrib/tikzducks/tikzlibraryducks.code.tex
+++ b/graphics/pgf/contrib/tikzducks/tikzlibraryducks.code.tex
@@ -8,7 +8,7 @@
% https://github.com/samcarter/tikzducks
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{tikzducks}
@@ -16,7 +16,7 @@
% This is all that is needed ...
\tikzset{
duck/.pic={%
- \duck@draw
+ \duck
},
duck/.search also={,/tikz,/pgf},
}
diff --git a/graphics/pgf/contrib/tikzlings/DEPENDS.txt b/graphics/pgf/contrib/tikzlings/DEPENDS.txt
new file mode 100644
index 0000000000..c6f29e2964
--- /dev/null
+++ b/graphics/pgf/contrib/tikzlings/DEPENDS.txt
@@ -0,0 +1,4 @@
+hard pgf
+hard pgf-blur
+hard iftex
+hard epstopdf-pkg \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzlings/README.md b/graphics/pgf/contrib/tikzlings/README.md
index d0586008b4..80ee80f485 100644
--- a/graphics/pgf/contrib/tikzlings/README.md
+++ b/graphics/pgf/contrib/tikzlings/README.md
@@ -1,11 +1,30 @@
+![](https://raw.githubusercontent.com/samcarter/tikzlings/main/ICON.png)
+
# TikZlings
-A collection of animals and other beings from the tikz world
-Current version: 2022/06/17 version v1.0
+[![License](https://img.shields.io/github/license/samcarter/tikzlings.svg?color=blue)](https://www.latex-project.org/lppl.txt)
+[![GitHub tag](https://img.shields.io/github/tag/samcarter/tikzlings.svg?label=current%20version&color=blue)](https://github.com/samcarter/tikzlings/releases/latest)
+[![CTAN](https://img.shields.io/ctan/v/tikzlings.svg?color=blue)](https://ctan.org/pkg/tikzlings)
+
+A collection of animals and other beings from the TikZ world.
+
+This project is licensed under the LaTeX Project Public License v1.3c or later, see https://www.latex-project.org/lppl.txt .
+
+The project repository, including a bug tracker, can be found at https://github.com/samcarter/tikzlings .
+
+### Usage
-This project is licensed under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
+```latex
+\documentclass{standalone}
+\usepackage{tikzlings}
-![tikzlings](https://raw.githubusercontent.com/samcarter/tikzlings/master/Examples/tikzlings.png)
+\begin{document}
+\begin{tikzpicture}
+ \penguin
+\end{tikzpicture}
+\end{document}
+```
+For more details, please consult the [package documentation](https://github.com/samcarter/tikzlings/blob/main/DOCUMENTATION.pdf).
diff --git a/graphics/pgf/contrib/tikzlings/README.pdf b/graphics/pgf/contrib/tikzlings/README.pdf
new file mode 100644
index 0000000000..8a112071b7
--- /dev/null
+++ b/graphics/pgf/contrib/tikzlings/README.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikzlings/tikzlibrarytikzlings.code.tex b/graphics/pgf/contrib/tikzlings/tikzlibrarytikzlings.code.tex
index 449b2ce5b1..7fcc0e8397 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlibrarytikzlings.code.tex
+++ b/graphics/pgf/contrib/tikzlings/tikzlibrarytikzlings.code.tex
@@ -8,7 +8,7 @@
% https://github.com/samcarter/tikzlings
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{tikzlings}
@@ -29,6 +29,6 @@
\tikzset{
tikzling/.pic={\tikzling},
- tikzling/.search also={,/tikz,/pgf,/thing},
- thing/.search also={,/tikz,/pgf},
+ tikzling/.search also={,/tikz,/pgf,/thing},
+ thing/.search also={,/tikz,/pgf},
} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-addons.sty b/graphics/pgf/contrib/tikzlings/tikzlings-addons.sty
index 9c41b7cfde..ef2fb63beb 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-addons.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-addons.sty
@@ -9,13 +9,15 @@
% https://github.com/samcarter/tikzlings
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-addons}[2022/06/17 version v1.0 Draw additional items for the tikzlings]
+\ProvidesPackage{tikzlings-addons}[2025/01/05 version v2.2 Draw additional items for the tikzlings]
\RequirePackage{tikz}
\usetikzlibrary{patterns} % for the wizard hat
+\usetikzlibrary{decorations.shapes} % for sombrero
+\usetikzlibrary{decorations.pathmorphing}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -56,60 +58,81 @@
\end{scope}%
}
+\def\thing@listhead{}
+\def\thing@listacces{}
+\def\thing@headtext{head}
+\def\thing@accesstext{acess}
+
+\ExplSyntaxOn
+\NewDocumentCommand{\thing@ini}{om}{
+ \expandafter\newif\csname ifthing@#2\endcsname
+ \def\thing@tmp{#1}
+ \ifx\thing@headtext\thing@tmp
+ \tl_put_right:Nn \thing@listhead { {#2} }
+ \fi
+ \ifx\thing@accesstext\thing@tmp
+ \tl_put_right:Nn \thing@listacces { {#2} }
+ \fi
+}
+\ExplSyntaxOff
+
% Hats %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifthing@hat
-\newif\ifthing@tophat
-\newif\ifthing@beret
-\newif\ifthing@strawhat
-\newif\ifthing@harlequin
-\newif\ifthing@witch
-\newif\ifthing@magichat
-\newif\ifthing@crown
-\newif\ifthing@queencrown
-\newif\ifthing@kingcrown
-\newif\ifthing@santa
-\newif\ifthing@chef
-\newif\ifthing@graduate
-\newif\ifthing@alien
+\thing@ini[head]{hat}
+\thing@ini[head]{tophat}
+\thing@ini[head]{beret}
+\thing@ini[head]{strawhat}
+\thing@ini[head]{harlequin}
+\thing@ini[head]{witch}
+\thing@ini[head]{magichat}
+\thing@ini[head]{crown}
+\thing@ini[head]{queencrown}
+\thing@ini[head]{kingcrown}
+\thing@ini[head]{santa}
+\thing@ini[head]{chef}
+\thing@ini[head]{graduate}
+\thing@ini[head]{sombrero}
+\thing@ini[head]{alien}
% Communication %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifthing@book
-\newif\ifthing@signpost
+\thing@ini[acess]{book}
+\thing@ini[acess]{signpost}
\newif\ifthing@speech
\newif\ifthing@think
% Food %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifthing@pizza
+\thing@ini[acess]{pizza}
\newif\ifthing@davidlikespineapplepizza
-\newif\ifthing@cheese
-\newif\ifthing@baguette
-\newif\ifthing@cake
-\newif\ifthing@icecream
-\newif\ifthing@milkshake
-\newif\ifthing@wine
-\newif\ifthing@cocktail
+\thing@ini[acess]{cheese}
+\thing@ini[acess]{baguette}
+\thing@ini[acess]{cake}
+\thing@ini[acess]{icecream}
+\thing@ini[acess]{milkshake}
+\thing@ini[acess]{wine}
+\thing@ini[acess]{cocktail}
+\thing@ini[acess]{banana}
% Sport %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifthing@cricket
-\newif\ifthing@hockey
-\newif\ifthing@football
+\thing@ini[acess]{cricket}
+\thing@ini[acess]{hockey}
+\thing@ini[acess]{football}
% Other %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifthing@crystalball
-\newif\ifthing@magicwand
-\newif\ifthing@rollingpin
-\newif\ifthing@lightsaber
-\newif\ifthing@torch
-\newif\ifthing@basket
-\newif\ifthing@easter
-\newif\ifthing@crozier
-\newif\ifthing@shovel
-\newif\ifthing@pickaxe
-\newif\ifthing@strawbroom
-\newif\ifthing@broom
-\newif\ifthing@umbrella
-\newif\ifthing@umbrellaclosed
-\newif\ifthing@handbag
+\thing@ini[acess]{crystalball}
+\thing@ini[acess]{magicwand}
+\thing@ini[acess]{rollingpin}
+\thing@ini[acess]{lightsaber}
+\thing@ini[acess]{torch}
+\thing@ini[acess]{basket}
+\thing@ini[acess]{easter}
+\thing@ini[acess]{crozier}
+\thing@ini[acess]{shovel}
+\thing@ini[acess]{pickaxe}
+\thing@ini[acess]{strawbroom}
+\thing@ini[acess]{broom}
+\thing@ini[acess]{umbrella}
+\thing@ini[acess]{umbrellaclosed}
+\thing@ini[acess]{handbag}
+\thing@ini[acess]{stick}
\tikzset{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% General
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -121,62 +144,71 @@
% Hats
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- hat/.code = \thing@hattrue
+ hat/.code = \thing@hattrue
\def\thing@hat{#1},
- hat/.default = blue!40!black,
- tophat/.code = \thing@tophattrue
+ hat/.default = blue!40!black,
+ tophat/.code = \thing@tophattrue
\def\thing@tophat{#1},
top hat/.forward to = /thing/tophat,
tophat/.default = black!90!white,
- beret/.code = \thing@berettrue
+ beret/.code = \thing@berettrue
\def\thing@beret{#1},
- beret/.default = black,
+ beret/.default = black,
strawhat/.code = \thing@strawhattrue
\def\thing@strawhat{#1},
straw hat/.forward to = /thing/strawhat,
strawhat/.default = gray!30!white,
ribbon/.code = \def\thing@ribbon{#1},
ribbon = black,
- harlequin/.code = \thing@harlequintrue
+ harlequin/.code = \thing@harlequintrue
\def\thing@harlequin{#1},
harlequin/.default = blue,
- niuqelrah/.code = \def\thing@niuqelrah{#1},
- niuqelrah = red,
- witch/.code = \thing@witchtrue
- \def\thing@witch{#1},
- witch/.default = black,
- magichat/.code = \thing@magichattrue
+ niuqelrah/.code = \def\thing@niuqelrah{#1},
+ niuqelrah = red,
+ witch/.code = \thing@witchtrue
+ \def\thing@witch{#1},
+ witch/.default = black,
+ magichat/.code = \thing@magichattrue
\def\thing@magichat{#1},
magic hat/.forward to = /thing/magichat,
magichat/.default = violet,
magicstars/.code = \def\thing@magicstars{#1},
- magic stars/.forward to = /thing/magicstars,
- magicstars = yellow!80!brown,
- crown/.code = \thing@crowntrue
+ magic stars/.forward to = /thing/magicstars,
+ magicstars = yellow!80!brown,
+ crown/.code = \thing@crowntrue
\def\thing@crown{#1},
- crown/.default = yellow!90!orange,
- queencrown/.code = \thing@queencrowntrue
+ crown/.default = yellow!90!orange,
+ queencrown/.code = \thing@queencrowntrue
\def\thing@queencrown{#1},
queen crown/.forward to = /thing/queencrown,
queencrown/.default = yellow,
- kingcrown/.code = \thing@kingcrowntrue
+ kingcrown/.code = \thing@kingcrowntrue
\def\thing@kingcrown{#1},
king crown/.forward to = /thing/kingcrown,
kingcrown/.default = gray,
- santa/.code = \thing@santatrue
+ santa/.code = \thing@santatrue
\def\thing@santa{#1},
santa/.default = red!80!black,
- chef/.code = \thing@cheftrue
- \def\thing@chef{#1},
- chef/.default = gray!20!white,
- graduate/.code = \thing@graduatetrue
+ chef/.code = \thing@cheftrue
+ \def\thing@chef{#1},
+ chef/.default = gray!20!white,
+ graduate/.code = \thing@graduatetrue
\def\thing@graduate{#1},
graduate/.default = black,
- tassel/.code = \def\thing@tassel{#1},
+ tassel/.code = \def\thing@tassel{#1},
tassel = red,
- alien/.code = \thing@alientrue
+ sombrero/.code = \thing@sombrerotrue
+ \def\thing@sombrero{#1},
+ sombrero/.default = orange!70!yellow,
+ sombreroa/.code = \def\thing@sombreroa{#1},
+ sombreroa = green!70!blue,
+ sombrerob/.code = \def\thing@sombrerob{#1},
+ sombrerob = red,
+ sombreroc/.code = \def\thing@sombreroc{#1},
+ sombreroc = blue,
+ alien/.code = \thing@alientrue
\def\thing@alien{#1},
- alien/.default = green,
+ alien/.default = green,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Communication
@@ -189,17 +221,17 @@
book color/.forward to = /thing/bookcolour,
bookcolor/.forward to = /thing/bookcolour,
bookcolour = brown,
- signpost/.code = \thing@signposttrue
+ signpost/.code = \thing@signposttrue
\def\thing@signpost{#1},
sign post/.forward to = /thing/signpost,
signcolour/.code = \def\thing@signcolour{#1},
sign colour/.forward to = /thing/signcolour,
sign color/.forward to = /thing/signcolour,
- signcolor/.forward to = /thing/signcolour,
- signcolour = brown!50!black,
+ signcolor/.forward to = /thing/signcolour,
+ signcolour = brown!50!black,
signback/.code = \def\thing@signback{#1},
sign back/.forward to = /thing/signback,
- signback = green!40!black,
+ signback = green!40!black,
speech/.code = \thing@speechtrue
\def\thing@speech{#1},
think/.code = \thing@thinktrue
@@ -207,7 +239,7 @@
bubblecolour/.code = \def\thing@bubblecolour{#1},
bubble colour/.forward to = /thing/bubblecolour,
bubble color/.forward to = /thing/bubblecolour,
- bubblecolor/.forward to = /thing/bubblecolour,
+ bubblecolor/.forward to = /thing/bubblecolour,
bubblecolour = gray!30!white,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -216,12 +248,12 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pizza/.code = \thing@pizzatrue,
davidlikespineapplepizza/.code = \thing@davidlikespineapplepizzatrue
- \thing@speechtrue
+ \thing@speechtrue
\def\thing@speech{\scalebox{\scalingfactor}{\scalebox{0.9}{\tiny ih, che schifo!}}},
david likes pineapple pizza/.forward to = /thing/davidlikespineapplepizza,
cheese/.code = \thing@cheesetrue
\def\thing@cheese{#1},
- cheese/.default = yellow!30!orange!60!white,
+ cheese/.default = yellow!30!orange!60!white,
baguette/.code = \thing@baguettetrue
\def\thing@baguette{#1},
baguette/.default = brown,
@@ -240,14 +272,17 @@
flavourb = white!70!brown,
flavourc/.code = \def\thing@flavourc{#1},
flavour c/.forward to = /thing/flavourc,
- flavourc = red!50!white,
+ flavourc = red!50!white,
milkshake/.code = \thing@milkshaketrue
- \def\thing@milkshake{#1},
- milkshake/.default = red!20!white,
+ \def\thing@milkshake{#1},
+ milkshake/.default = red!20!white,
wine/.code = \thing@winetrue
- \def\thing@wine{#1},
- wine/.default = red!70!black,
- cocktail/.code = \thing@cocktailtrue,
+ \def\thing@wine{#1},
+ wine/.default = red!70!black,
+ cocktail/.code = \thing@cocktailtrue,
+ banana/.code = \thing@bananatrue
+ \def\thing@banana{#1},
+ banana/.default = yellow!80!orange,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Sport
@@ -269,11 +304,11 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
crystalball/.code = \thing@crystalballtrue
\def\thing@crystalball{#1},
- crystal ball/.forward to = /thing/crystalball,
- crystalball/.default = cyan,
+ crystal ball/.forward to = /thing/crystalball,
+ crystalball/.default = cyan,
magicwand/.code = \thing@magicwandtrue,
magic want/.forward to = /thing/magicwand,
- rollingpin/.code = \thing@rollingpintrue
+ rollingpin/.code = \thing@rollingpintrue
\def\thing@rollingpin{#1},
rolling pin/.forward to = /thing/rollingpin,
rollingpin/.default = brown,
@@ -330,7 +365,12 @@
umbrella closed/.forward to = /thing/umbrellaclosed,
handbag/.code = \thing@handbagtrue
\def\thing@handbag{#1},
- handbag/.default = red!70!black,
+ handbag/.default = red!70!black,
+ stick/.code = \thing@sticktrue
+ \def\thing@stick{#1},
+ stick/.default = brown!50!black,
+ leaf/.store in = \thing@leaf,
+ leaf = green!70!red,
}
\def\thing@draw{%
@@ -345,6 +385,7 @@
\pgfmathsetmacro{\scalingfactor}{sqrt(abs(\tmpscaleA*\tmpscaleD-\tmpscaleB*\tmpscaleC))*sqrt(abs((\pgf@xx/1cm)*(\pgf@yy/1cm)-(\pgf@xy/1cm)*(\pgf@yx/1cm)))}%
\pgfmathsetmacro{\xscalefactor}{\tmpscaleA}
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
+\pgfmathsetmacro{\decoscalefactor}{sign(\tmpscaleA)*sign(\tmpscaleD)*\scalingfactor}%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -355,15 +396,15 @@
% Hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@hat
\fill[\thing@hat,rotate around={-15:(-0.3,2.01)}] (-0.3,2.01) rectangle (0.46,2.31);
- \fill[\thing@hat] (0.05,1.92) ellipse[x radius=0.6, y radius=0.1, rotate=-15];
- \fill[\thing@hat] (0.14,2.2) ellipse[x radius=0.37, y radius=0.08, rotate=-15];
+ \fill[\thing@hat] (0.05,1.92) ellipse[x radius=0.6, y radius=0.1, rotate=-15];
+ \fill[\thing@hat] (0.14,2.2) ellipse[x radius=0.37, y radius=0.08, rotate=-15];
\fi
%
% Tophat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@tophat
\fill[\thing@tophat] (0.1,1.94) ellipse[x radius=0.48, y radius=0.1, rotate=-15];
\fill[\thing@tophat,rotate around={-15:(0.15,2.165)}] (-0.17, 1.94) -- (0.46, 1.94) -- (0.52, 2.39) -- (-0.22, 2.39) -- cycle;
- \fill[\thing@tophat] (0.21,2.385) ellipse[x radius=0.37, y radius=0.08, rotate=-15];
+ \fill[\thing@tophat] (0.21,2.385) ellipse[x radius=0.37, y radius=0.08, rotate=-15];
\fi
%
% Beret %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -378,13 +419,13 @@
% Straw hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@strawhat
\begin{scope}[xshift=-16,rotate=12,yshift=-1]
- \fill[\thing@strawhat,rotate=-15] (0.44,2.0) ellipse[x radius=0.75, y radius=0.1];
+ \fill[\thing@strawhat,rotate=-15] (0.44,2.0) ellipse[x radius=0.75, y radius=0.1];
\fill[\thing@strawhat,rotate=-15] (0.1,2.05) rectangle (0.78,2.5);
- \fill[\thing@strawhat,rotate=-15] (0.44,2.5) ellipse[x radius=0.34, y radius=0.08];
+ \fill[\thing@strawhat,rotate=-15] (0.44,2.5) ellipse[x radius=0.34, y radius=0.08];
\fill[\thing@strawhat,rotate=-15] (-0.3,2.02) -- (1.18,2.02) -- (0.78,2.2) -- (0.1,2.2) -- cycle;
- \fill[\thing@ribbon,rotate=-15] (0.44,2.2) ellipse[x radius=0.34, y radius=0.08];
+ \fill[\thing@ribbon,rotate=-15] (0.44,2.2) ellipse[x radius=0.34, y radius=0.08];
\fill[\thing@ribbon,rotate=-15] (0.1,2.2) rectangle (0.78,2.3);
- \fill[\thing@strawhat,rotate=-15] (0.44,2.3) ellipse[x radius=0.34, y radius=0.08];
+ \fill[\thing@strawhat,rotate=-15] (0.44,2.3) ellipse[x radius=0.34, y radius=0.08];
\end{scope}
\fi
%
@@ -401,8 +442,8 @@
%
% witch %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@witch
- \begin{scope}[xshift=-26]
- \fill[\thing@witch,rotate=-15] (0.44,2.13) ellipse[x radius=0.75, y radius=0.17];
+ \begin{scope}[xshift=-26]
+ \fill[\thing@witch,rotate=-15] (0.44,2.13) ellipse[x radius=0.75, y radius=0.17];
\fill[\thing@witch,rotate=-15] (0.05,2.2)--(0.45,3.2)--(0.82,2.2);
\end{scope}
\fi
@@ -410,9 +451,7 @@
% magic hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@magichat
\begin{scope}[xshift=-26]
- \path[preaction={fill, \thing@magichat!100},rotate=-5,
- pattern=fivepointed stars, pattern color=\thing@magicstars!100]
- (0.36,1.95)--(0.86,2.95)--(1.20,1.85);
+ \path[preaction={fill, \thing@magichat!100},rotate=-5,pattern=fivepointed stars, pattern color=\thing@magicstars!100] (0.36,1.95)--(0.86,2.95)--(1.20,1.85);
\end{scope}
\fi
%
@@ -479,17 +518,8 @@
% Santa %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@santa
\begin{scope}[xshift=-26]
- \fill[\thing@santa]
- (0.430,1.803) .. controls (0.590,2.174) and (0.837,2.065) ..
- (1.118,1.954) .. controls (1.679,1.731) and (1.328,1.193) ..
- (1.647,1.057) .. controls (1.638,1.255) and (1.745,2.104) ..
- (1.168,2.270) .. controls (0.867,2.356) and (0.536,2.280) ..
- (0.430,1.803) -- cycle;
- \fill[white!80!brown]
- (0.44,1.733) .. controls (0.211,2.299) and (1.082,2.188) ..
- (1.456,1.759) .. controls (1.534,1.637) and (1.480,1.545) ..
- (1.400,1.566) .. controls (1.265,1.714) and (0.577,2.267) ..
- (0.44,1.733) -- cycle;
+ \fill[\thing@santa] (0.430,1.803) .. controls (0.590,2.174) and (0.837,2.065) .. (1.118,1.954) .. controls (1.679,1.731) and (1.328,1.193) .. (1.647,1.057) .. controls (1.638,1.255) and (1.745,2.104) .. (1.168,2.270) .. controls (0.867,2.356) and (0.536,2.280) .. (0.430,1.803) -- cycle;
+ \fill[white!80!brown] (0.44,1.733) .. controls (0.211,2.299) and (1.082,2.188) .. (1.456,1.759) .. controls (1.534,1.637) and (1.480,1.545) .. (1.400,1.566) .. controls (1.265,1.714) and (0.577,2.267) .. (0.44,1.733) -- cycle;
\fill[white!80!brown] (1.6,1.0) circle[radius=0.17];
\end{scope}
\fi
@@ -497,7 +527,7 @@
% Chef hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@chef
\begin{scope}[xshift=-26]
- \fill[\thing@chef,rotate=-15] (0.44,2.1) ellipse[x radius=0.37, y radius=0.08];
+ \fill[\thing@chef,rotate=-15] (0.44,2.1) ellipse[x radius=0.37, y radius=0.08];
\fill[\thing@chef,rotate=-15] (0.07,2.1) rectangle (0.81,2.55);
\fill[\thing@chef] (1.01,2.47) circle[radius=0.17];
\fill[\thing@chef] (1.24,2.35) circle[radius=0.15];
@@ -509,7 +539,7 @@
% graduate hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@graduate
\begin{scope}[xshift=-26]
- \fill[\thing@graduate,rotate=-15] (0.44,2.1) ellipse[x radius=0.37, y radius=0.1];
+ \fill[\thing@graduate,rotate=-15] (0.44,2.1) ellipse[x radius=0.37, y radius=0.1];
\fill[\thing@graduate,rotate=-15] (0.07,2.1) rectangle (0.81,2.3);
\fill[\thing@graduate] (0.3,2.25) -- (1.05,2.35) -- (1.7,1.95) -- (0.92,1.85) -- cycle;
\fill[\thing@tassel,rounded corners=\scalingfactor*1] (1.12,1.89) -- (1.01,2.1) -- (1.09,2.11) -- (1.2,1.9) -- (1.2,1.3) -- (1.12,1.3) -- cycle;
@@ -517,6 +547,20 @@
\end{scope}
\fi
%
+% sombrero %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifthing@sombrero
+ \fill[\thing@sombrero] (-.45,2) to[in=200] (0,2.8) to[out=-20] (.45,2) -- cycle;
+ \fill[\thing@sombrero] (-0.65, 1.75) .. controls (-0.85, 1.7) and (-0.85, 1.9) .. (-0.85, 1.9) .. controls (-0.30, 2.2) and (0.30, 2.2) .. ( 0.85, 1.9) .. controls ( 0.85, 1.9) and (0.85, 1.7) .. ( 0.65, 1.75) .. controls ( 0.30, 1.95) and (-0.30, 1.95) .. (-0.65, 1.75) -- cycle;
+ \draw[\thing@sombrerob,line width=\scalingfactor*0.8pt] (-0.85, 1.9) .. controls (-0.30, 2.2) and (0.30, 2.2) .. ( 0.85, 1.9);
+ \draw[decorate,decoration={zigzag, amplitude=\decoscalefactor*1pt, segment length=\scalingfactor*6pt},\thing@sombreroa, line width=\scalingfactor*1pt] (-0.81, 1.8) .. controls (-0.30, 2.1) and (0.30, 2.1) .. ( 0.82, 1.8);
+ \begin{scope}
+ \clip (-.45,2) to[in=200] (0,2.8) to[out=-20] (.45,2) -- cycle;
+ \draw[decorate,decoration={zigzag, amplitude=\decoscalefactor*1pt, segment length=\scalingfactor*3pt},\thing@sombreroa, line width=\scalingfactor*1pt] (-.4,2.4) to[bend left] (.4,2.4);
+ \fill[decorate,decoration={shape backgrounds,shape=circle, shape size=\scalingfactor*2pt, shape evenly spread=7}, \thing@sombreroc] (-.3,2.6) to[bend left] (.3,2.6);
+ \fill[decorate,decoration={shape backgrounds,shape=circle,shape size=\scalingfactor*2pt,shape evenly spread=9},\thing@sombreroc] (-.4,2.18) to[bend left] (.4,2.18);
+ \end{scope}
+\fi
+%
% alien %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@alien
\fill[\thing@alien,rotate around={15:(-0.175,2.115)}] (-0.2,1.93) rectangle (-0.15,2.3);
@@ -534,8 +578,7 @@
% book %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@book
\begin{scope}[xshift=-25,yshift=1]
- \fill[\thing@bookcolour,rotate=-20]
- (0.40,1.20) rectangle (0.80,0.60);
+ \fill[\thing@bookcolour,rotate=-20] (0.40,1.20) rectangle (0.80,0.60);
\node[rotate=-20*\yscalefactor/\xscalefactor, color=white] at (0.88,0.70) {\thing@book};%
\end{scope}
\fi
@@ -562,7 +605,7 @@
% think bubble %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@think
\begin{scope}[xshift=-26]
- \fill[\thing@bubblecolour] (2,2.4) ellipse[x radius=0.7, y radius=0.35];
+ \fill[\thing@bubblecolour] (2,2.4) ellipse[x radius=0.7, y radius=0.35];
\fill[\thing@bubblecolour] (1.55,2.35) circle[radius=0.25] (2.0,2.15) circle[radius=0.25] (2.4,2.25) circle[radius=0.25] (1.6,2.55) circle[radius=0.25] (2.0,2.6) circle[radius=0.25] (2.35,2.5) circle[radius=0.25] (1.65,1.95) circle[radius=0.1] (1.55,1.80) circle[radius=0.06] (1.47,1.70) circle[radius=0.03];
\node at (2,2.4) {\thing@think};
\end{scope}
@@ -579,9 +622,9 @@
\begin{scope}[xshift=-28,yshift=2]
\fill[brown] (1.00,0.60) ellipse[x radius=0.4, y radius=0.2];
\fill[red!70!black] (1.00,0.60) ellipse[x radius=0.34, y radius=0.16];
- \fill[white!85!yellow] (1.15,0.65) ellipse[x radius=0.065, y radius=0.04];
- \fill[white!85!yellow] (0.81,0.57) ellipse[x radius=0.065, y radius=0.04];
- \fill[white!85!yellow] (0.95,0.68) ellipse[x radius=0.065, y radius=0.04];
+ \fill[white!85!yellow] (1.15,0.65) ellipse[x radius=0.065, y radius=0.04];
+ \fill[white!85!yellow] (0.81,0.57) ellipse[x radius=0.065, y radius=0.04];
+ \fill[white!85!yellow] (0.95,0.68) ellipse[x radius=0.065, y radius=0.04];
\fill[white!85!yellow] (1.02,0.54) ellipse[x radius=0.065, y radius=0.04];
\fill[green!40!brown] (1.09,0.54) ellipse[x radius=0.07, y radius=0.02];
\fill[green!40!brown,rotate=20] (1.0,0.34) ellipse[x radius=0.07, y radius=0.02];
@@ -589,23 +632,23 @@
\fill[green!40!brown] (1.00,0.60) ellipse[x radius=0.03, y radius=0.06];
\end{scope}
\fi
-% no pizza %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% not pizza %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@davidlikespineapplepizza
\begin{scope}[xshift=-28,yshift=2]
\fill[brown] (1.00,0.60) ellipse[x radius=0.4, y radius=0.2];
\fill[red!70!black] (1.00,0.60) ellipse[x radius=0.34, y radius=0.16];
- \fill[yellow!70!brown] (1.15,0.65) ellipse[x radius=0.08, y radius=0.06];
- \fill[red!70!black] (1.15,0.65) ellipse[x radius=0.04, y radius=0.03];
- \fill[yellow!70!brown] (0.81,0.57) ellipse[x radius=0.08, y radius=0.06];
- \fill[red!70!black] (0.81,0.57) ellipse[x radius=0.04, y radius=0.03];
- \fill[yellow!70!brown] (0.95,0.68) ellipse[x radius=0.08, y radius=0.06];
- \fill[red!70!black] (0.95,0.68) ellipse[x radius=0.04, y radius=0.03];
+ \fill[yellow!70!brown] (1.15,0.65) ellipse[x radius=0.08, y radius=0.06];
+ \fill[red!70!black] (1.15,0.65) ellipse[x radius=0.04, y radius=0.03];
+ \fill[yellow!70!brown] (0.81,0.57) ellipse[x radius=0.08, y radius=0.06];
+ \fill[red!70!black] (0.81,0.57) ellipse[x radius=0.04, y radius=0.03];
+ \fill[yellow!70!brown] (0.95,0.68) ellipse[x radius=0.08, y radius=0.06];
+ \fill[red!70!black] (0.95,0.68) ellipse[x radius=0.04, y radius=0.03];
\fill[yellow!70!brown] (1.02,0.54) ellipse[x radius=0.08, y radius=0.06];
- \fill[red!70!black] (1.02,0.54) ellipse[x radius=0.04, y radius=0.03];
+ \fill[red!70!black] (1.02,0.54) ellipse[x radius=0.04, y radius=0.03];
\fill[green!40!brown] (1.09,0.54) ellipse[x radius=0.07, y radius=0.02];
\fill[green!40!brown,rotate=20] (1.0,0.34) ellipse[x radius=0.07, y radius=0.02];
\fill[green!40!brown,rotate=-20] (0.9,1.05) ellipse[x radius=0.07, y radius=0.02];
- \fill[green!40!brown] (1.00,0.60) ellipse[x radius=0.03, y radius=0.06];
+ \fill[green!40!brown] (1.00,0.60) ellipse[x radius=0.03, y radius=0.06];
\end{scope}
\fi
%
@@ -645,7 +688,7 @@
\fill[\thing@cone,rotate=-20] (0.35,1.20)--(0.50,0.60)--(0.75,1.20);
\fill[\thing@flavoura] (0.85,1.03) circle[radius=0.12];
\fill[\thing@flavourb] (1.05,0.95) circle[radius=0.12];
- \fill[\thing@flavourc] (0.95,1.1) circle[radius=0.12];
+ \fill[\thing@flavourc] (0.95,1.1) circle[radius=0.12];
\end{scope}
\fi
%
@@ -655,7 +698,7 @@
\fill[cyan!10!white, rotate=-10] (0.8,0.50) ellipse[x radius=0.17, y radius=0.05];
\fill[cyan!10!white, rotate=-10] (0.8,0.55) ellipse[x radius=0.12, y radius=0.03];
\begin{scope}
- \clip[rotate=-10] (0.58,0.5) rectangle (1.02,1.03);
+ \clip[rotate=-10] (0.58,0.5) rectangle (1.02,1.03);
\fill[cyan!10!white, rotate=-10] (0.8,0.94) ellipse[x radius=0.18, y radius=0.4];
\fill[\thing@milkshake, rotate=-10] (0.8,0.94) ellipse[x radius=0.15, y radius=0.36];
\end{scope}
@@ -663,7 +706,7 @@
\fill[red!90!black] (1.0,1.1) circle[radius=0.05];
\fill[white!85!yellow] (0.94,1.05) circle[radius=0.05] (1.03,1.03) circle[radius=0.05];
\fill[cyan!10!white, rotate=-10] (0.8,0.50) ellipse[x radius=0.17, y radius=0.05];
- \fill[red!90!black,rotate=20] (1.2,0.58) rectangle (1.22,0.85);
+ \fill[red!90!black,rotate=20] (1.2,0.58) rectangle (1.22,0.85);
\end{scope}
\fi
%
@@ -674,11 +717,11 @@
\fill[cyan!10!white, rotate=-10] (0.8,0.55) ellipse[x radius=0.12, y radius=0.03];
\fill[cyan!10!white, rotate=-10] (0.8,0.7) ellipse[x radius=0.03, y radius=0.2];
\begin{scope}
- \clip[rotate=-10] (0.58,0.5) rectangle (1.02,1.03);
+ \clip[rotate=-10] (0.58,0.5) rectangle (1.02,1.03);
\fill[cyan!10!white, rotate=-10] (0.8,1.1) ellipse[x radius=0.18, y radius=0.4];
\end{scope}
\begin{scope}
- \clip[rotate=-10] (0.58,0.5) rectangle (1.02,0.87);
+ \clip[rotate=-10] (0.58,0.5) rectangle (1.02,0.87);
\fill[\thing@wine, rotate=-10] (0.8,1.1) ellipse[x radius=0.15, y radius=0.36];
\end{scope}
\end{scope}
@@ -697,6 +740,19 @@
\end{scope}
\fi
%
+% banana %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifthing@banana
+ \begin{scope}[yshift=27, xshift=7,rotate=25]
+ \fill[\thing@banana!30!] (0.02,0) .. controls (0.21,0.20) and (0.21,0.40) .. (0.02,0.6) arc [start angle=60,end angle=120, radius =0.04] .. controls (0.07,0.40) and (0.07,0.20) .. (-0.02,0) --cycle ;
+ %peel
+ \begin{scope}
+ \clip (-0.04,-0.01) rectangle (0.20,0.3);
+ \fill[\thing@banana] (0.03,0) .. controls (0.22,0.20) and (0.22,0.40) .. (0.03,0.6) arc [start angle=60,end angle=120, radius =0.06] .. controls (0.06,0.40) and (0.06,0.20) .. (-0.03,0);
+ \end{scope}
+ \fill[\thing@banana!60!] (0.12,0.3) arc [start angle=140, end angle=-100, y radius=0.20, x radius=0.06] arc [start angle=-90, end angle=90, y radius=0.15, x radius=0.02] (0.12,0.3) arc [start angle=60, end angle=270, y radius=0.15, x radius=0.1] arc [start angle=270, end angle=90, y radius=0.13, x radius=0.04];
+ \end{scope}
+\fi
+%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Sport
@@ -740,7 +796,7 @@
\ifthing@crystalball
\shade[ball color=\thing@crystalball,opacity=0.7] (0,0.8) circle[radius=0.33];
\fi
-%
+%
% magic wand %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@magicwand
\begin{scope}[xshift=-16,yshift=2]
@@ -768,51 +824,36 @@
% torch %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@torch
\begin{scope}[xshift=-26]
- \fill[red!50!yellow]
- (1.4338,1.025) .. controls (1.4308,0.8877) and (1.3468,0.8997) ..
- (1.2447,0.748) .. controls (1.1427,0.8982) and (1.0721,0.8892) ..
- (1.0646,1.024) .. controls (1.0541,1.1714) and (1.2642,1.1654) ..
- (1.2492,1.386) .. controls (1.3093,1.3110) and (1.4383,1.2705) ..
- (1.4338,1.025) -- cycle;
- \fill[red!25!yellow, scale=0.67, xshift=17, yshift=15]
- (1.4338,1.025) .. controls (1.4308,0.8877) and (1.3468,0.8997) ..
- (1.2447,0.748) .. controls (1.1427,0.8982) and (1.0721,0.8892) ..
- (1.0646,1.024) .. controls (1.0541,1.1714) and (1.2642,1.1654) ..
- (1.2492,1.386) .. controls (1.3093,1.3110) and (1.4383,1.2705) ..
- (1.4338,1.025) -- cycle;
- \fill[white!50!yellow, scale=0.4, xshift=53.5, yshift=45.3]
- (1.4338,1.025) .. controls (1.4308,0.8877) and (1.3468,0.8997) ..
- (1.2447,0.748) .. controls (1.1427,0.8982) and (1.0721,0.8892) ..
- (1.0646,1.024) .. controls (1.0541,1.1714) and (1.2642,1.1654) ..
- (1.2492,1.386) .. controls (1.3093,1.3110) and (1.4383,1.2705) ..
- (1.4338,1.025) -- cycle;
+ \fill[red!50!yellow] (1.4338,1.025) .. controls (1.4308,0.8877) and (1.3468,0.8997) .. (1.2447,0.748) .. controls (1.1427,0.8982) and (1.0721,0.8892) .. (1.0646,1.024) .. controls (1.0541,1.1714) and (1.2642,1.1654) .. (1.2492,1.386) .. controls (1.3093,1.3110) and (1.4383,1.2705) .. (1.4338,1.025) -- cycle;
+ \fill[red!25!yellow, scale=0.67, xshift=17, yshift=15] (1.4338,1.025) .. controls (1.4308,0.8877) and (1.3468,0.8997) .. (1.2447,0.748) .. controls (1.1427,0.8982) and (1.0721,0.8892) .. (1.0646,1.024) .. controls (1.0541,1.1714) and (1.2642,1.1654) .. (1.2492,1.386) .. controls (1.3093,1.3110) and (1.4383,1.2705) .. (1.4338,1.025) -- cycle;
+ \fill[white!50!yellow, scale=0.4, xshift=53.5, yshift=45.3] (1.4338,1.025) .. controls (1.4308,0.8877) and (1.3468,0.8997) .. (1.2447,0.748) .. controls (1.1427,0.8982) and (1.0721,0.8892) .. (1.0646,1.024) .. controls (1.0541,1.1714) and (1.2642,1.1654) .. (1.2492,1.386) .. controls (1.3093,1.3110) and (1.4383,1.2705) .. (1.4338,1.025) -- cycle;
\fill[\thing@torch,rounded corners=\scalingfactor*1]
(1.1,0.96) -- (0.77,0.25) -- (0.83,0.25) -- (1.3,0.86) -- cycle;
\fill[\thing@torch,rotate=-28] (0.62,1.32) ellipse[x radius=0.2, y radius=0.08];
\end{scope}
\fi%
-%
+%
% basket %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@basket
\begin{scope}[xshift=-28.5]
\fill[\thing@basket, start angle=180, end angle=360, x radius=0.35, y radius=0.35] (0.65,0.61) arc -- cycle;
\fill[\thing@basket, start angle=180, end angle=0, even odd rule] [x radius=0.35, y radius=0.5] (0.65,0.6) arc -- cycle [x radius=0.3, y radius=0.45] (0.7,0.6) arc -- cycle;
- \fill[\thing@basket, even odd rule] (1,0.6) ellipse[x radius=0.35, y radius=0.1] (1,0.6) ellipse[x radius=0.3, y radius=0.07];
+ \fill[\thing@basket, even odd rule] (1,0.6) ellipse[x radius=0.35, y radius=0.1] (1,0.6) ellipse[x radius=0.3, y radius=0.07];
\fill[\thing@basket!75!black] (1,0.6) ellipse[x radius=0.3, y radius=0.07];
- \end{scope}
-\fi%
+ \end{scope}
+\fi%
%
% easter basket %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@easter
\begin{scope}[xshift=-28.5]
\begin{scope}
- \clip [start angle=180, end angle=0, x radius=0.3, y radius=0.45] (0.7,0.6) arc -- cycle [start angle=180, end angle=360, x radius=0.3, y radius=0.07] (0.7,0.6) arc -- cycle;
+ \clip [start angle=180, end angle=0, x radius=0.3, y radius=0.45] (0.7,0.6) arc -- cycle [start angle=180, end angle=360, x radius=0.3, y radius=0.07] (0.7,0.6) arc -- cycle;
\fill[\thing@eggb, rotate=-5] (0.95,0.72) ellipse[x radius=0.09, y radius=0.13];
\fill[\thing@egga, rotate=10] (0.94,0.42) ellipse[x radius=0.09, y radius=0.13];
\fill[\thing@eggc, rotate=-30] (0.7,1.08) ellipse[x radius=0.09, y radius=0.13];
\end{scope}
- \end{scope}
-\fi%
+ \end{scope}
+\fi%
%
% crozier %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifthing@crozier
@@ -821,7 +862,7 @@
\clip [rotate=-20] (0.6,2.3) rectangle (1.1,1.999);
\fill[even odd rule,\thing@crozier] (1.5,1.6) circle[radius=0.2] (1.5,1.6) circle[radius=0.1];
\end{scope}
- \fill[\thing@crozier,rotate=-20] (0.663,0.5) rectangle (0.763,2.0);
+ \fill[\thing@crozier,rotate=-20] (0.663,0.5) rectangle (0.763,2.0);
\end{scope}
\fi
%
@@ -877,4 +918,38 @@
\fill[\thing@handbag!70!black] (0.4143, 0.4354) .. controls (0.5139, 0.9811) and (0.1204, 1.0719) .. (0.0134, 0.5155) -- (0.0957, 0.4996) .. controls (0.1753, 0.8952) and (0.3949, 0.8883) .. (0.3324, 0.4536) -- cycle;
\fi
%
+% stick %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifthing@stick
+ \begin{scope}[rotate=-30,yshift=26,xshift=-7]
+ %leaf
+ \begin{scope}[rotate=60, xshift=8.2,yshift=8.1]
+ \fill[\thing@leaf] (-0.01,0) .. controls (-0.1,0) and (-0.02, 0.2) .. (0,0.2) .. controls (0.02, 0.2) and (0.1,0) .. (0.01,0.0);
+ \path[clip] (-0.04,-0.04)-- (-0.01,0) .. controls (-0.1,0) and (-0.02, 0.2) .. (0,0.2) .. controls (0.02, 0.2) and (0.1,0) .. (0.01,0)-- (0.04,-0.04) --cycle;
+ \draw[\thing@leaf!80!, line width=0.1] (0,-0.04) -- (0,0.2) \foreach \i in {0.02,0.04,...,0.2} {(0,\i) -- ++(0.1,\i) (0,\i) -- ++(-0.1,\i)} ;
+ \end{scope}
+ %stick itself
+ \fill[\thing@stick!90!red] (-0.04,0.8) -- (-0.04,0.4) arc[start angle=345,end angle=270,radius=0.03] -- ++(0,-0.01) arc[start angle=90,end angle=15,radius=0.03] -- (-0.04,0) arc [start angle=180, end angle=360 ,x radius=0.04, y radius=0.02] -- (0.04, 0.4) arc [start angle=180, end angle=120, radius=0.08] arc [start angle=-90, end angle=90, x radius=0.02, y radius=0.04] arc [start angle=240, end angle=180, radius=0.08] -- (0.04,0.75) arc [start angle=0, end angle=120 ,x radius=0.04, y radius=0.02] --cycle;
+ \fill[\thing@stick!90!] (0.08, 0.51) ellipse [x radius=0.02, y radius=0.04] (0,0.75) ellipse [x radius=0.04, y radius=0.02] ;
+ \draw[\thing@stick!90!red, line width=0.06] (0.08, 0.51) ellipse [x radius=0.016, y radius=0.032]
+ ellipse [x radius=0.012, y radius=0.024] ellipse [x radius=0.008, y radius=0.016] (0,0.75) ellipse [y radius=0.016, x radius=0.032] ellipse [y radius=0.012, x radius=0.024] ellipse [y radius=0.008, x radius=0.016] ;
+ \fill[\thing@stick!90!red] (0.08, 0.51) ellipse [x radius=0.004, y radius=0.008] (0,0.75) ellipse [x radius=0.008, y radius=0.004];
+ \end{scope}
+\fi
+%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Random items
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\pgfmathdeclarerandomlist{head}{\thing@listhead}
+\pgfmathdeclarerandomlist{accessories}{\thing@listacces}
+
+\def\shufflethings{%
+ \pgfmathrandomitem{\head}{head}%
+ \edef\randomhead{\head}%
+ \pgfmathrandomitem{\accessories}{accessories}%
+ \edef\randomaccessories{\accessories}%
}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-anteaters.sty b/graphics/pgf/contrib/tikzlings/tikzlings-anteaters.sty
index 6e2b75b30e..a8dfafb0b6 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-anteaters.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-anteaters.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-anteaters}[2022/06/17 version v1.0 Drawing anteaters in TikZ]
+\ProvidesPackage{tikzlings-anteaters}[2025/01/05 version v2.2 Drawing anteaters in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -31,6 +31,8 @@
\newif\ifanteater@threeD
\newif\ifanteater@back
\newif\ifanteater@contour
+\newif\ifanteater@leftstep
+\newif\ifanteater@rightstep
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -48,24 +50,28 @@
body/.store in = \anteater@body,
body = red!55!green!75!blue!66!white,
eye/.store in = \anteater@eye,
- eye = \anteater@body!70!brown!50!darkgray,
+ eye = \anteater@body!70!brown!50!darkgray,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \anteater@threeDtrue,
- back/.code = \anteater@backtrue,
+ 3D/.code = \anteater@threeDtrue,
+ leftstep/.code = \anteater@leftsteptrue,
+ left step/.forward to = /anteater/leftstep,
+ rightstep/.code = \anteater@rightsteptrue,
+ right step/.forward to = /anteater/rightstep,
+ back/.code = \anteater@backtrue,
contour/.code = \anteater@contourtrue
\def\anteater@contour{#1},
- contour/.default = black,
- outline/.forward to = /anteater/contour,
+ contour/.default = black,
+ outline/.forward to = /anteater/contour,
}
\def\anteater@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.75,0.1) rectangle (1.12,2.26);
@@ -83,7 +89,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -101,16 +107,25 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname anteaterhookbackground\endcsname
\csname tikzlinghookbackground\endcsname
- %
+ %
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
- \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \ifanteater@leftstep
+ \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (-0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \else% step
+ \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \fi% step
+ %
+ \ifanteater@rightstep
+ \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \else% step
+ \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \fi% step
%
% Tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifanteater@back
@@ -125,9 +140,8 @@
%
% Collar %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifanteater@back
- \anteater@part@draw[\anteater@body!45!white!95!orange] (-0,1.47) ellipse [x radius=0.36, y radius=0.28];
- \anteater@part@draw[\anteater@body!70!brown!50!darkgray]
- (-0,1.47) ellipse [x radius=0.35, y radius=0.23];
+ \anteater@part@draw[\anteater@body!45!white!95!orange] (-0,1.47) ellipse [x radius=0.36, y radius=0.28];
+ \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (-0,1.47) ellipse [x radius=0.35, y radius=0.23];
\else% back
\anteater@part@draw[\anteater@body!45!white!95!orange] (0.33, 1.55) -- (-0.33, 1.55) .. controls (-0.5, 1.05) and (-0.1, 0.95) .. (0, 0.60) .. controls (0.1, 0.95) and (0.5, 1.05) .. (0.33, 1.55) -- cycle;
\anteater@part@draw[\anteater@body!70!brown!50!darkgray] (0.33, 1.55) -- (-0.33, 1.55) .. controls (-0.45, 1.1) and (-0.1, 1) .. (0, 0.70) .. controls (0.1, 1) and (0.45, 1.1) .. (0.33, 1.55) -- cycle;
@@ -136,15 +150,15 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname anteaterhookbelly\endcsname
\csname tikzlinghookbelly\endcsname
- %
+ %
\ifanteater@back
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\anteater@part@draw[\anteater@body] (-0,1.73) ellipse [x radius=0.36, y radius=0.33];
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (0.5551, 2.2281) .. controls (0.4961, 2.2273) and (0.4390, 2.2093) .. (0.3831, 2.1919) .. controls (0.3282, 2.173) and (0.2725, 2.1539) .. (0.2231, 2.1228) .. controls (0.1875, 2.0984) and (0.1524, 2.0637) .. (0.1470, 2.0187) .. controls (0.1446, 2.0028) and (0.1518, 1.9881) .. (0.1584, 1.9744) .. controls (0.1706, 1.9343) and (0.2090, 1.9063) .. (0.25, 1.9017) .. controls (0.3079, 1.8943) and (0.3684, 1.9134) .. (0.4132, 1.9504) .. controls (0.4657, 1.9988) and (0.5111, 2.0545) .. (0.5513, 2.1133) .. controls (0.5692, 2.1404) and (0.5854, 2.1692) .. (0.5945, 2.2004) .. controls (0.5989, 2.2232) and (0.5717, 2.2282) .. (0.5551, 2.2281) -- cycle;
- \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (-0.5551, 2.2281) .. controls (-0.4961, 2.2273) and (-0.4390, 2.2093) .. (-0.3831, 2.1919) .. controls (-0.3282, 2.173) and (-0.2725, 2.1539) .. (-0.2231, 2.1228) .. controls (-0.1875, 2.0984) and (-0.1524, 2.0637) .. (-0.1470, 2.0187) .. controls (-0.1446, 2.0028) and (-0.1518, 1.9881) .. (-0.1584, 1.9744) .. controls (-0.1706, 1.9343) and (-0.2090, 1.9063) .. (-0.25, 1.9017) .. controls (-0.3079, 1.8943) and (-0.3684, 1.9134) .. (-0.4132, 1.9504) .. controls (-0.4657, 1.9988) and (-0.5111, 2.0545) .. (-0.5513, 2.1133) .. controls (-0.5692, 2.1404) and (-0.5854, 2.1692) .. (-0.5945, 2.2004) .. controls (-0.5989, 2.2232) and (-0.5717, 2.2282) .. (-0.5551, 2.2281) -- cycle;
- %
+ \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (0.5551, 2.2281) .. controls (0.4961, 2.2273) and (0.4390, 2.2093) .. (0.3831, 2.1919) .. controls (0.3282, 2.173) and (0.2725, 2.1539) .. (0.2231, 2.1228) .. controls (0.1875, 2.0984) and (0.1524, 2.0637) .. (0.1470, 2.0187) .. controls (0.1446, 2.0028) and (0.1518, 1.9881) .. (0.1584, 1.9744) .. controls (0.1706, 1.9343) and (0.2090, 1.9063) .. (0.25, 1.9017) .. controls (0.3079, 1.8943) and (0.3684, 1.9134) .. (0.4132, 1.9504) .. controls (0.4657, 1.9988) and (0.5111, 2.0545) .. (0.5513, 2.1133) .. controls (0.5692, 2.1404) and (0.5854, 2.1692) .. (0.5945, 2.2004) .. controls (0.5989, 2.2232) and (0.5717, 2.2282) .. (0.5551, 2.2281) -- cycle;
+ \anteater@part@draw[\anteater@body!70!brown!50!darkgray] (-0.5551, 2.2281) .. controls (-0.4961, 2.2273) and (-0.4390, 2.2093) .. (-0.3831, 2.1919) .. controls (-0.3282, 2.173) and (-0.2725, 2.1539) .. (-0.2231, 2.1228) .. controls (-0.1875, 2.0984) and (-0.1524, 2.0637) .. (-0.1470, 2.0187) .. controls (-0.1446, 2.0028) and (-0.1518, 1.9881) .. (-0.1584, 1.9744) .. controls (-0.1706, 1.9343) and (-0.2090, 1.9063) .. (-0.25, 1.9017) .. controls (-0.3079, 1.8943) and (-0.3684, 1.9134) .. (-0.4132, 1.9504) .. controls (-0.4657, 1.9988) and (-0.5111, 2.0545) .. (-0.5513, 2.1133) .. controls (-0.5692, 2.1404) and (-0.5854, 2.1692) .. (-0.5945, 2.2004) .. controls (-0.5989, 2.2232) and (-0.5717, 2.2282) .. (-0.5551, 2.2281) -- cycle;
+ %
\else% back
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -154,19 +168,18 @@
(-0.4086, 1.9465) .. controls (-0.4679, 1.9952) and (-0.6205, 2.1813) .. (-0.5862, 2.2146) .. controls (-0.5517, 2.2477) and (-0.3434, 2.1152) .. (-0.2841, 2.0665) .. controls (-0.2249, 2.0177) and (-0.2048, 1.9515) .. (-0.2391, 1.9184) .. controls (-0.2736, 1.8853) and (-0.3494, 1.8979) .. (-0.40861, 1.9465) -- cycle;
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \anteater@part@draw[\anteater@body]
- (0.33, 1.71) .. controls (0.16, 1.52) and (0.1, 1.5) .. (0.08, 1.05) .. controls (0.07, 1) and (-0.07, 1) .. (-0.08, 1.05) .. controls (-0.1, 1.5) and (-0.16, 1.52) .. (-0.33, 1.7) .. controls (-0.45, 1.85) and (-0.22, 2.05) .. (0, 2.05) .. controls (0.22, 2.05) and (0.45, 1.85) .. (0.33, 1.7) -- cycle;
+ \anteater@part@draw[\anteater@body] (0.33, 1.71) .. controls (0.16, 1.52) and (0.1, 1.5) .. (0.08, 1.05) .. controls (0.07, 1) and (-0.07, 1) .. (-0.08, 1.05) .. controls (-0.1, 1.5) and (-0.16, 1.52) .. (-0.33, 1.7) .. controls (-0.45, 1.85) and (-0.22, 2.05) .. (0, 2.05) .. controls (0.22, 2.05) and (0.45, 1.85) .. (0.33, 1.7) -- cycle;
%
% Cheeks %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\anteater@part@draw[\anteater@body!45!white!95!orange] (0.3508, 1.739) .. controls (0.3508, 1.739) and (0.2861, 1.8489) .. (0.1571, 1.7664) .. controls (0.0279, 1.684) and (0.0627, 1.0524) .. (0.0627, 1.0524) .. controls (0.0627, 1.0524) and (0.131, 1.3772) .. (0.2314, 1.44) .. controls (0.3599, 1.5206) and (0.3508, 1.739) .. (0.3508, 1.739) -- cycle
(-0.3508, 1.739) .. controls (-0.3508, 1.739) and (-0.2861, 1.8489) .. (-0.1571, 1.7664) .. controls (-0.0279, 1.684) and (-0.0627, 1.0524) .. (-0.0627, 1.0524) .. controls (-0.0627, 1.0524) and (-0.131, 1.3772) .. (-0.2314, 1.44) .. controls (-0.3599, 1.5206) and (-0.3508, 1.739) .. (-0.3508, 1.739) -- cycle;
- %
+ %
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\anteater@part@draw[\anteater@body!70!brown!50!darkgray] (0, 1.08) ellipse[x radius=0.08, y radius=0.05];
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\anteater@part@draw[\anteater@eye] (0.23, 1.7) circle[radius=0.05];
- \anteater@part@draw[\anteater@eye] (-0.23, 1.7) circle[radius=0.05];
+ \anteater@part@draw[\anteater@eye] (-0.23, 1.7) circle[radius=0.05];
\fi% back
%
% Tail if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -177,7 +190,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname anteaterhookbody\endcsname
\csname tikzlinghookbody\endcsname
- %
+ %
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -190,41 +203,47 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-anteaters}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-anteaters}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic anteater}}
%\anteater
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic anteater can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\anteater[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of the eyes can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\anteater[eye=red]
%\end{tcblisting}
%
+%And the anteater can lift its legs:
+%\begin{tcblisting}{title={Walking}}
+%\anteater[leftstep]
+%\anteater[rightstep,xshift=2cm]
+%\end{tcblisting}
+%
%To view the anteater from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\anteater[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the anteater 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the anteater 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\anteater[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\anteater[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-apes.sty b/graphics/pgf/contrib/tikzlings/tikzlings-apes.sty
new file mode 100644
index 0000000000..58edf5c636
--- /dev/null
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-apes.sty
@@ -0,0 +1,401 @@
+ % !TeX root = ./examples/ape.tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This package is part of the TikZlings package
+%% A package to bring cute little animals and other beings into tikz
+%% Maintained by samcarter
+%%
+%% Project repository and bug tracker:
+%% https://github.com/samcarter/tikzlings
+%%
+%% Released under the LaTeX Project Public License v1.3c or later
+%% See https://www.latex-project.org/lppl.txt
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ProvidesPackage{tikzlings-apes}[2025/01/05 version v2.2 Drawing apes in TikZ]
+
+\RequirePackage{tikz}
+\RequirePackage{tikzlings-addons}
+
+\newcommand*{\ape}[1][]{%
+ \begin{scope}%
+ \tikzset{/ape/.cd,#1}%
+ \ape@draw%
+ \end{scope}%
+ \thing[#1]%
+ % adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \csname apehookforeground\endcsname
+ \csname tikzlinghookforeground\endcsname
+}
+
+\newif\ifape@threeD
+\newif\ifape@handposition@hearnoevil
+\newif\ifape@handposition@seenoevil
+\newif\ifape@handposition@speaknoevil
+\newif\ifape@handposition@clap
+\newif\ifape@handposition@waving
+\newif\ifape@back
+\newif\ifape@contour
+\newif\ifape@openmouth
+
+\tikzset{
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % Pass unknown keys on to tikz
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ /ape/.search also={/tikz,/pgf,/thing},
+ /ape/.cd,
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % body
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ body/.store in = \ape@body,
+ body = red!15!brown!80!black,
+ eye/.store in = \ape@eye,
+ eye = \ape@body!40!black,
+ eyes/.forward to = /ape/eye,
+ skin/.store in = \ape@skin,
+ skin = \ape@body!50!gray,
+ nose/.store in = \ape@nose,
+ nose = \ape@skin!60!black,
+ mouth/.store in = \ape@mouth,
+ mouth = \ape@skin!50!black,
+ muzzle/.store in = \ape@muzzle,
+ muzzle = \ape@skin!80!white,
+ legs/.store in = \ape@legs,
+ legs = \ape@body!90!black,
+ arms/.store in = \ape@arms,
+ arms = \ape@body!95!black,
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % options
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ 3D/.code = \ape@threeDtrue,
+ handposition/.code = \csname ape@handposition@#1true\endcsname,
+ kikazaru/.code = \ape@handposition@hearnoeviltrue,
+ mizaru/.code = \ape@handposition@seenoeviltrue,
+ iwazaru/.code = \ape@handposition@speaknoeviltrue,
+ %clap/.code = \ape@handposition@claptrue, %%% should we support this too?
+ %waving/.code = \ape@handposition@wavingtrue, %%% should we support this too?
+ hearnoevil/.code = \ape@handposition@hearnoeviltrue,
+ seenoevil/.code = \ape@handposition@seenoeviltrue,
+ speaknoevil/.code = \ape@handposition@speaknoeviltrue,
+ back/.code = \ape@backtrue,
+ openmouth/.code = \ape@openmouthtrue,
+ open mouth/.forward to = /ape/openmouth,
+ contour/.code = \ape@contourtrue
+ \def\ape@contour{#1}
+ \def\ape@mouth{#1},
+ contour/.default = black,
+ outline/.forward to = /ape/contour,
+}
+
+\def\ape@draw{%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % minimal bounding box size
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \path (-1.435,0.1) rectangle (1.435, 2.27);
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % store the current scale factor
+ % from https://github.com/samcarter/tikzlings/issues/3#issuecomment-461373494
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \pgfgettransformentries{\tmpscaleA}{\tmpscaleB}{\tmpscaleC}{\tmpscaleD}{\tmp}{\tmp}%
+ \pgfmathsetmacro{\scalingfactor}{sqrt(abs(\tmpscaleA*\tmpscaleD-\tmpscaleB*\tmpscaleC))*sqrt(abs((\pgf@xx/1cm)*(\pgf@yy/1cm)-(\pgf@xy/1cm)*(\pgf@yx/1cm)))}%
+ \pgfmathsetmacro{\xscalefactor}{\tmpscaleA}
+ \pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % switch between 2D, 3D and contours, from
+ % https://chat.stackexchange.com/transcript/message/45991801#45991801
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifape@threeD
+ \def\ape@part@draw[##1]{\shade[ball color=##1]}
+ \else% 3D
+ \ifape@contour
+ \def\ape@part@draw[##1]{\draw[##1,\ape@contour,fill=white,line width=\scalingfactor*0.4pt]}
+ \else% contour
+ \def\ape@part@draw[##1]{\fill[##1]}
+ \fi% contour
+ \fi% 3D
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % Body parts
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \csname apehookbackground\endcsname
+ \csname tikzlinghookbackground\endcsname
+ %
+ % Draw backside partially in reversed order %%%%%%%%%%%%%%%%%%%%%%%%
+ \ifape@back
+ % arms / hand for hear-no-evil pose backside %%%%%%%%%%%%%%%%%%%%%
+ \ifape@handposition@hearnoevil%
+ \ape@part@draw[\ape@skin!90!white] (-0.45,1.9) ellipse [x radius=0.3, y radius=0.1,rotate=80];
+ \ape@part@draw[\ape@arms] (-0.55,1.73) {[rotate=-20] arc [start angle=35, end angle=350,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (-0.9,1.61) ellipse[x radius=0.15, y radius=0.6, rotate=-125];
+ \ape@part@draw[\ape@skin!90!white] (0.45,1.9) ellipse [x radius=0.3, y radius=0.1,rotate=100];
+ \ape@part@draw[\ape@arms] (0.55,1.73) {[rotate=20] arc [start angle=145, end angle=-170,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (0.9,1.61) ellipse[x radius=0.15, y radius=0.6, rotate=125];
+ % see-no-evil pose backside %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \else\ifape@handposition@seenoevil%
+ \ape@part@draw[\ape@skin!90!white] (-0.325,1.91) ++(390:0.3 and 0.1) arc [start angle=390, end angle=150,x radius=0.3, y radius=0.1] {[rotate=10] arc [start angle=150, end angle=-60,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (-0.59,1.97) arc [start angle=25, end angle=335,x radius=0.475, y radius=0.15] --cycle;
+ \ape@part@draw[\ape@arms] (-0.93,1.70) ellipse[x radius=0.15, y radius=0.6, rotate=70];
+ \ape@part@draw[\ape@skin!90!white] (0.325,1.91) ++(150:0.3 and 0.1) arc [start angle=150, end angle=390,x radius=0.3, y radius=0.1] {[rotate=-10] arc [start angle=30, end angle=240,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (0.59,1.97) arc [start angle=155, end angle=-155,x radius=0.475, y radius=0.15] --cycle;
+ \ape@part@draw[\ape@arms] (0.93,1.70) ellipse[x radius=0.15, y radius=0.6, rotate=110];
+ % speak-no-evil pose backside %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \else\ifape@handposition@speaknoevil%
+ \ape@part@draw[\ape@arms] (-0.85,1.55) ellipse[x radius=0.15, y radius=0.6, rotate=-100];
+ \ape@part@draw[\ape@skin!90!white] (-0.275,1.46) ++(390:0.3 and 0.1) arc [start angle=390, end angle=150,x radius=0.3, y radius=0.1] {[rotate=10] arc [start angle=150, end angle=-60,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (-0.53,1.52) {[rotate=-10] arc [start angle=15, end angle=335,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (0.85,1.55) ellipse[x radius=0.15, y radius=0.6, rotate=100];
+ \ape@part@draw[\ape@skin!90!white] (0.275,1.46) ++(150:0.3 and 0.1) arc [start angle=150, end angle=390,x radius=0.3, y radius=0.1] {[rotate=-10] arc [start angle=30, end angle=240,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (0.53,1.52) {[rotate=10] arc [start angle=165, end angle=-155,x radius=0.475, y radius=0.15]} --cycle;
+ % clapping hand pose backside %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \else\ifape@handposition@clap%
+ \ape@part@draw[\ape@skin!90!white] (-0.115,2.85) ellipse [x radius=0.3, y radius=0.1,rotate=80];
+ \ape@part@draw[\ape@arms] (-0.23,2.65) {[rotate=10] arc [start angle=35, end angle=350,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (-0.75,1.95) ellipse[x radius=0.15, y radius=0.6, rotate=30];
+ \ape@part@draw[\ape@skin!90!white] (0.115,2.85) ellipse [x radius=0.3, y radius=0.1,rotate=100];
+ \ape@part@draw[\ape@arms] (0.23,2.65) {[rotate=-10] arc [start angle=145, end angle=-170,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (0.75,1.95) ellipse[x radius=0.15, y radius=0.6, rotate=150];
+ % waving left hand pose backside %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \else\ifape@handposition@waving%
+ \ape@part@draw[\ape@arms] (-0.53,1.115) {[rotate=5] arc [start angle=25, end angle=335,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (-0.9,1.25) ellipse[x radius=0.15, y radius=0.6, rotate=-60];
+ \ape@part@draw[\ape@skin!90!white] (0.97,3.2) ++(390:0.3 and 0.1) {[rotate=90] arc [start angle=390, end angle=150,x radius=0.3, y radius=0.1] {[rotate=10] arc [start angle=150, end angle=-60,x radius=0.15, y radius=0.03] } -- cycle};
+ \ape@part@draw[\ape@arms] (1.35,2.74) {[rotate=100] arc [start angle=335, end angle=25,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (0.93,1.70) ellipse[x radius=0.15, y radius=0.6, rotate=-70];
+ % default pose backside %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \else
+ \ape@part@draw[\ape@arms] (-0.53,1.115) {[rotate=5] arc [start angle=25, end angle=335,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (-0.9,1.25) ellipse[x radius=0.15, y radius=0.6, rotate=-60];
+ \ape@part@draw[\ape@arms] (0.53,1.115) {[rotate=-5] arc [start angle=155, end angle=-155,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (0.9,1.25) ellipse[x radius=0.15, y radius=0.6, rotate=60];
+ \fi\fi\fi\fi\fi
+ %
+ % legs / feet backside %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ape@part@draw[\ape@skin] (1.2,0.27) ++(210:0.3 and 0.1) {[rotate=180] arc [start angle=210, end angle=-30,x radius=0.3, y radius=0.1] {[rotate=10] arc [start angle=-30, end angle=-240,x radius=0.15, y radius=0.03]}-- cycle};
+ \ape@part@draw[\ape@legs] (0.7,0.67) ellipse[x radius=0.15, y radius=0.6, rotate=-30];
+ \ape@part@draw[\ape@legs] (0.52,0.68) ellipse[x radius=0.15, y radius=0.7, rotate=-45];
+ \ape@part@draw[\ape@skin] (-1.2,0.27) ++(-30:0.3 and 0.1) {[rotate=180] arc [start angle=-30, end angle=210,x radius=0.3, y radius=0.1] {[rotate=-10] arc [start angle=210, end angle=420,x radius=0.15, y radius=0.03]}-- cycle};
+ \ape@part@draw[\ape@legs] (-0.7,0.67) ellipse[x radius=0.15, y radius=0.6, rotate=30];
+ \ape@part@draw[\ape@legs] (-0.52,0.68) ellipse[x radius=0.15, y radius=0.7, rotate=45];
+ %
+ % head backside %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ape@part@draw[\ape@body] (0, 1.76) circle[x radius=0.4,y radius=0.5];
+ \fi% back
+ %
+ % Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ape@part@draw[\ape@body] ( 0.5, 0.8 ) .. controls ( 0.5 , 0.4) and ( 0.35, 0.17) .. ( 0.0, 0.17) .. controls (-0.35, 0.17) and (-0.5 , 0.4) .. (-0.5, 0.8 ) .. controls (-0.9 , 1.6) and (-0.4, 1.65) .. ( 0.0, 1.65) .. controls ( 0.4, 1.65) and ( 0.9 , 1.6) .. ( 0.5, 0.8) -- cycle;
+ %
+ % adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \csname apehookbelly\endcsname
+ \csname tikzlinghookbelly\endcsname
+ %
+ % Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \unless\ifape@back
+ % Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ape@part@draw[\ape@body] (0, 1.76) circle[x radius=0.4,y radius=0.5];
+ \ape@part@draw[\ape@skin] (0, 1.76) circle[x radius=0.32,y radius=0.40];
+ %
+ % Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ape@part@draw[\ape@eye] (-0.08, 1.9) ellipse[x radius=0.04, y radius=0.04];
+ \ape@part@draw[\ape@eye] (0.08, 1.9) ellipse[x radius=0.04, y radius=0.04];
+ %
+ % muzzle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ape@part@draw[\ape@muzzle] (0, 1.55) ellipse[x radius=0.28, y radius=0.2];
+ %
+ % mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifape@openmouth
+ \ifape@threeD
+ \fill[\ape@mouth] (0,1.5) ellipse[x radius=0.05,y radius=0.07];
+ \else
+ \ape@part@draw[\ape@mouth] (0,1.5) ellipse[x radius=0.05,y radius=0.07];
+ \fi
+ \else
+ \draw[\ape@mouth,line width=\scalingfactor*0.4pt] (0.125, 1.5) arc [start angle=-50, end angle=-130, radius=0.2] ;
+ \fi
+ %
+ % Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifape@threeD
+ \fill[\ape@nose] (-0.03, 1.63) ellipse[x radius=0.025, y radius=0.035, rotate=30 ];
+ \fill[\ape@nose] (0.03, 1.63) ellipse[x radius=0.025, y radius=0.035, rotate=-30 ];
+ \else
+ \ape@part@draw[\ape@nose] (-0.03, 1.63) ellipse[x radius=0.025, y radius=0.035, rotate=30 ];
+ \ape@part@draw[\ape@nose] (0.03, 1.63) ellipse[x radius=0.025, y radius=0.035, rotate=-30 ];
+ \fi
+ %
+ % Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ape@part@draw[\ape@skin] (0.675,0.2) ++(-30:0.3 and 0.1) arc [start angle=-30, end angle=210,x radius=0.3, y radius=0.1] {[rotate=-10] arc [start angle=210, end angle=420,x radius=0.15, y radius=0.03]}-- cycle;
+ \ape@part@draw[\ape@skin] (-0.675,0.2) ++(210:0.3 and 0.1) arc [start angle=210, end angle=-30,x radius=0.3, y radius=0.1] {[rotate=10] arc [start angle=-30, end angle=-240,x radius=0.15, y radius=0.03]}-- cycle;
+ %
+ % Legs %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ape@part@draw[\ape@legs] (0.52,0.68) ellipse[x radius=0.15, y radius=0.7, rotate=-45];
+ \ape@part@draw[\ape@legs] (0.7,0.67) ellipse[x radius=0.15, y radius=0.6, rotate=-30];
+ \ape@part@draw[\ape@legs] (-0.52,0.68) ellipse[x radius=0.15, y radius=0.7, rotate=45];
+ \ape@part@draw[\ape@legs] (-0.7,0.67) ellipse[x radius=0.15, y radius=0.6, rotate=30];
+ %
+ % hear-no-evil pose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifape@handposition@hearnoevil
+ \ape@part@draw[\ape@arms] (-0.9,1.61) ellipse[x radius=0.15, y radius=0.6, rotate=-125];
+ \ape@part@draw[\ape@skin!90!white] (-0.45,1.9) ellipse [x radius=0.3, y radius=0.1,rotate=80];
+ \ape@part@draw[\ape@arms] (-0.55,1.73) {[rotate=-20] arc [start angle=35, end angle=350,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (0.9,1.61) ellipse[x radius=0.15, y radius=0.6, rotate=125];
+ \ape@part@draw[\ape@skin!90!white] (0.45,1.9) ellipse [x radius=0.3, y radius=0.1,rotate=100];
+ \ape@part@draw[\ape@arms] (0.55,1.73) {[rotate=20] arc [start angle=145, end angle=-170,x radius=0.475, y radius=0.15]} --cycle;
+ % see-no-evil pose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \else\ifape@handposition@seenoevil
+ \ape@part@draw[\ape@arms] (-0.93,1.70) ellipse[x radius=0.15, y radius=0.6, rotate=70];
+ \ape@part@draw[\ape@skin!90!white] (-0.325,1.91) ++(390:0.3 and 0.1) arc [start angle=390, end angle=150,x radius=0.3, y radius=0.1] {[rotate=10] arc [start angle=150, end angle=-60,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (-0.59,1.97) arc [start angle=25, end angle=335,x radius=0.475, y radius=0.15] --cycle;
+ \ape@part@draw[\ape@arms] (0.93,1.70) ellipse[x radius=0.15, y radius=0.6, rotate=110];
+ \ape@part@draw[\ape@skin!90!white] (0.325,1.91) ++(150:0.3 and 0.1) arc [start angle=150, end angle=390,x radius=0.3, y radius=0.1] {[rotate=-10] arc [start angle=30, end angle=240,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (0.59,1.97) arc [start angle=155, end angle=-155,x radius=0.475, y radius=0.15] --cycle;
+ % speak-no-evil pose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \else\ifape@handposition@speaknoevil%
+ \ape@part@draw[\ape@arms] (-0.85,1.55) ellipse[x radius=0.15, y radius=0.6, rotate=-100];
+ \ape@part@draw[\ape@skin!90!white] (-0.275,1.46) ++(390:0.3 and 0.1) arc [start angle=390, end angle=150,x radius=0.3, y radius=0.1] {[rotate=10] arc [start angle=150, end angle=-60,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (-0.53,1.52) {[rotate=-10] arc [start angle=15, end angle=335,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (0.85,1.55) ellipse[x radius=0.15, y radius=0.6, rotate=100];
+ \ape@part@draw[\ape@skin!90!white] (0.275,1.46) ++(150:0.3 and 0.1) arc [start angle=150, end angle=390,x radius=0.3, y radius=0.1] {[rotate=-10] arc [start angle=30, end angle=240,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (0.53,1.52) {[rotate=10] arc [start angle=165, end angle=-155,x radius=0.475, y radius=0.15]} --cycle;
+ % clapping pose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \else\ifape@handposition@clap%
+ \ape@part@draw[\ape@arms] (-0.75,1.95) ellipse[x radius=0.15, y radius=0.6, rotate=30];
+ \ape@part@draw[\ape@skin!90!white] (-0.115,2.85) ellipse [x radius=0.3, y radius=0.1,rotate=80];
+ \ape@part@draw[\ape@arms] (-0.23,2.65) {[rotate=10] arc [start angle=35, end angle=350,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (0.75,1.95) ellipse[x radius=0.15, y radius=0.6, rotate=150];
+ \ape@part@draw[\ape@skin!90!white] (0.115,2.85) ellipse [x radius=0.3, y radius=0.1,rotate=100];
+ \ape@part@draw[\ape@arms] (0.23,2.65) {[rotate=-10] arc [start angle=145, end angle=-170,x radius=0.475, y radius=0.15]} --cycle;
+ % waving hand pose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \else\ifape@handposition@waving%
+ \ape@part@draw[\ape@arms] (-0.93,1.70) ellipse[x radius=0.15, y radius=0.6, rotate=70];
+ \ape@part@draw[\ape@skin!90!white] (-0.97,3.2) ++(150:0.3 and 0.1) {[rotate=-90] arc [start angle=150, end angle=390,x radius=0.3, y radius=0.1] {[rotate=-10] arc [start angle=30, end angle=240,x radius=0.15, y radius=0.03] } -- cycle};
+ \ape@part@draw[\ape@arms] (-1.35,2.74) {[rotate=80] arc [start angle=25, end angle=335,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (0.9,1.25) ellipse[x radius=0.15, y radius=0.6, rotate=60];
+ \ape@part@draw[\ape@skin!90!white] (0.325,1.05) ++(150:0.3 and 0.1) arc [start angle=150, end angle=390,x radius=0.3, y radius=0.1] {[rotate=-10] arc [start angle=30, end angle=240,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (0.53,1.115) {[rotate=-5] arc [start angle=155, end angle=-155,x radius=0.475, y radius=0.15]} --cycle;
+ % normal pose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \else
+ \ape@part@draw[\ape@arms] (-0.9,1.25) ellipse[x radius=0.15, y radius=0.6, rotate=-60];
+ \ape@part@draw[\ape@skin!90!white] (-0.325,1.05) ++(390:0.3 and 0.1) arc [start angle=390, end angle=150,x radius=0.3, y radius=0.1] {[rotate=10] arc [start angle=150, end angle=-60,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (-0.53,1.115) {[rotate=5] arc [start angle=25, end angle=335,x radius=0.475, y radius=0.15]} --cycle;
+ \ape@part@draw[\ape@arms] (0.9,1.25) ellipse[x radius=0.15, y radius=0.6, rotate=60];
+ \ape@part@draw[\ape@skin!90!white] (0.325,1.05) ++(150:0.3 and 0.1) arc [start angle=150, end angle=390,x radius=0.3, y radius=0.1] {[rotate=-10] arc [start angle=30, end angle=240,x radius=0.15, y radius=0.03] } -- cycle;
+ \ape@part@draw[\ape@arms] (0.53,1.115) {[rotate=-5] arc [start angle=155, end angle=-155,x radius=0.475, y radius=0.15]} --cycle;
+ \fi\fi\fi\fi\fi%
+ \fi%
+ %
+ % adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \csname apehookbody\endcsname
+ \csname tikzlinghookbody\endcsname
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Documentation
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\clearpage
+%\section[Ape]{Sandra, the orangutan}
+%
+%\emph{The ape was kindly contributed by @NuzzleTOO. It is named after an orangutan who was freed from living alone in a zoo in Bueonos Aires and taken to a sanctuary for great apes after temporarily becoming legally a non-human person.}
+%
+%\subsection{Package name}
+%
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-apes}
+%\end{samcode}
+%\end{tcolorbox}
+%
+%\subsection{Basic Usage}
+%
+%\begin{tcblisting}{title={Basic ape}}
+%\ape
+%\end{tcblisting}
+%
+%\subsection{Options}
+%
+%The basic ape can be modified by changing its colour:
+%\begin{tcblisting}{title={Body colour}}
+%\ape[body=blue]
+%\end{tcblisting}
+%
+%In addition to the colour of the body, the colour of various body parts can be adjusted:
+%\begin{tcblisting}{title={Eye colour}}
+%\ape[eye=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Nose colour}}
+%\ape[nose=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Mouth colour}}
+%\ape[mouth=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Muzzle colour}}
+%\ape[muzzle=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Skin colour}}
+%\ape[skin=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Arm colour}}
+%\ape[arms=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Leg colour}}
+%\ape[legs=red]
+%\end{tcblisting}
+%
+%The ape make can make use of it hands in different ways:
+%\begin{tcblisting}{title={Clapping ape}}
+%\ape[handposition=clap]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Waving ape}}
+%\ape[handposition=waving]
+%\end{tcblisting}
+%
+%Including the gestures of the three mystic apes \textbf{Mizaru} (see no evil), \textbf{Kikazaru} (hear no evil) and \textbf{Iwazaru} (speak no evil):
+%\begin{tcblisting}{title={See no evil}}
+%\ape[handposition=seenoevil]
+%\end{tcblisting}
+%\begin{tcblisting}{title={hear no evil}}
+%\ape[handposition=hearnoevil]
+%\end{tcblisting}
+%\begin{tcblisting}{title={speak no evil}}
+%\ape[handposition=speaknoevil]
+%\end{tcblisting}
+% As shortcuts, these three apes are also available via
+%\saminline|\ape[seenoevil]|, \saminline|\ape[hearnoevil]|, \saminline|\ape[speaknoevil]| and \saminline|\ape[mizaru]|, \saminline|\ape[kikazaru]|, \saminline|\ape[iwazaru]|.
+%
+%To see a hooting ape:
+%\begin{tcblisting}{title={Hooting ape}}
+%\ape[openmouth]
+%\end{tcblisting}
+%
+%To view the ape from behind:
+%\begin{tcblisting}{title={Back view}}
+%\ape[back]
+%\end{tcblisting}
+%
+%The key \saminline|3D| will make the ape 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
+%\ape[3D]
+%\end{tcblisting}
+%
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
+%\ape[contour=black]
+%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-bats.sty b/graphics/pgf/contrib/tikzlings/tikzlings-bats.sty
index 3d1bbb27fd..3c0880f950 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-bats.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-bats.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-bats}[2022/06/17 version v1.0 Drawing bats in TikZ]
+\ProvidesPackage{tikzlings-bats}[2025/01/05 version v2.2 Drawing bats in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -26,13 +26,14 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname bathookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifbat@threeD
\newif\ifbat@back
\newif\ifbat@contour
\newif\ifbat@teeth
+\newif\ifbat@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -50,39 +51,41 @@
body/.store in = \bat@body,
body = black!75!white,
ears/.store in = \bat@ears,
- ears = \bat@body,
+ ears = \bat@body,
eye/.store in = \bat@eye,
eye = white,
pupil/.store in = \bat@pupil,
pupil = black,
mouth/.store in = \bat@mouth,
- mouth = black,
+ mouth = black,
feet/.store in = \bat@feet,
- feet = orange,
+ feet = orange,
wings/.store in = \bat@wings,
- wings = 1,
+ wings = 1,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- teeth/.code = \bat@teethtrue
- \def\bat@teeth{#1},
+ teeth/.code = \bat@teethtrue
+ \def\bat@teeth{#1},
teeth/.default = white,
- 3D/.code = \bat@threeDtrue,
- back/.code = \bat@backtrue,
+ openmouth/.code = \bat@openmouthtrue,
+ open mouth/.forward to = /bat/openmouth,
+ 3D/.code = \bat@threeDtrue,
+ back/.code = \bat@backtrue,
contour/.code = \bat@contourtrue
\def\bat@contour{#1}
\def\bat@antennas{#1}
\def\bat@mouth{#1},
- contour/.default = black,
- outline/.forward to = /bat/contour,
+ contour/.default = black,
+ outline/.forward to = /bat/contour,
}
\def\bat@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.44,0.0) rectangle (0.44, 2.2);
@@ -99,7 +102,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -117,7 +120,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -171,13 +174,17 @@
%
% Teeth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifbat@teeth
- \bat@part@draw[\bat@teeth] (-0.1,1.36) -- (-0.12,1.3) -- (-0.14,1.38) -- cycle;
- \bat@part@draw[\bat@teeth] (0.1,1.36) -- (0.12,1.3) -- (0.14,1.38) -- cycle;
+ \bat@part@draw[\bat@teeth] (-0.1,1.36) -- (-0.12,1.3) -- (-0.14,1.38) -- cycle;
+ \bat@part@draw[\bat@teeth] (0.1,1.36) -- (0.12,1.3) -- (0.14,1.38) -- cycle;
\fi
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\bat@mouth,line width=\scalingfactor*0.4pt] (0.18, 1.42) arc [start angle=-40, end angle=-140, radius=0.23];
- %
+ \ifbat@openmouth
+ \filldraw[\bat@mouth,line width=\scalingfactor*0.4pt] (0.18, 1.42) arc [start angle=-40, end angle=-140, radius=0.23];
+ \else
+ \draw[\bat@mouth,line width=\scalingfactor*0.4pt] (0.18, 1.42) arc [start angle=-40, end angle=-140, radius=0.23];
+ \fi
+ %
%
\fi% back
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -198,63 +205,68 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-bats}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-bats}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic bat}}
%\bat
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic bat can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\bat[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\bat[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil colour}}
%\bat[pupil=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\bat[mouth=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Ear colour}}
%\bat[ears=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Foot colour}}
%\bat[feet=red]
%\end{tcblisting}
%
-%The spread of the wings can be adjusted by passing values between 0 and 1 to the \lstinline|wings| option:
-%\begin{tcblisting}{}
+% The bat can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\bat[openmouth]
+%\end{tcblisting}
+%
+%With the \saminline|wings| option, one can adjust the spread of the wings. It accepts values between~0 and~1:
+%\begin{tcblisting}{title={Wing span}}
%\bat[wings=0.5]
%\end{tcblisting}
%
-%To turn the bat into a vampire bat, the \lstinline|teeth| option can be used:
-%\begin{tcblisting}{}
+%To turn the bat into a vampire bat, the \saminline|teeth| option can be used:
+%\begin{tcblisting}{title={Vampire}}
%\bat[teeth=white]
%\end{tcblisting}
%
%To view the bat from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\bat[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the bat 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the bat 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\bat[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\bat[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-bears.sty b/graphics/pgf/contrib/tikzlings/tikzlings-bears.sty
index 22fbe6c3f3..a85104c34e 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-bears.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-bears.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-bears}[2022/06/17 version v1.0 Draw teddy bears in TikZ]
+\ProvidesPackage{tikzlings-bears}[2025/01/05 version v2.2 Draw teddy bears in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -31,6 +31,7 @@
\newif\ifbear@threeD
\newif\ifbear@back
\newif\ifbear@contour
+\newif\ifbear@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -46,29 +47,31 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
body/.store in = \bear@body,
- body = brown,
+ body = brown!70!black,
eye/.store in = \bear@eye,
- eye = \bear@body!30!black,
+ eye = \bear@body!42!black,
mouth/.store in = \bear@mouth,
- mouth = \bear@body!30!black,
+ mouth = \bear@body!42!black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \bear@threeDtrue,
- back/.code = \bear@backtrue,
+ openmouth/.code = \bear@openmouthtrue,
+ open mouth/.forward to = /bear/openmouth,
+ 3D/.code = \bear@threeDtrue,
+ back/.code = \bear@backtrue,
contour/.code = \bear@contourtrue
\def\bear@contour{#1}
\def\bear@mouth{#1},
- contour/.default = black,
- outline/.forward to = /bear/contour,
+ contour/.default = black,
+ outline/.forward to = /bear/contour,
}
\def\bear@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.8, 0.0) rectangle (0.8, 2.13);
@@ -85,7 +88,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -102,8 +105,20 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
+ % generating saturated/brighter version of body colour
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \extractcolorspecs{\bear@body}{\bear@model}{\bear@colorspec}
+ \convertcolorspec{\bear@model}{\bear@colorspec}{hsb}{\bear@hsbcolorspec}
+ \pgfmathsetmacro{\bear@hue}{(array({\bear@hsbcolorspec},0))}
+ \pgfmathsetmacro{\bear@sat}{(array({\bear@hsbcolorspec},1))-0.38}
+ \pgfmathsetmacro{\bear@bright}{(array({\bear@hsbcolorspec},2))+0.35}
+ \definecolor{bear@bright}{hsb}{\bear@hue,\bear@sat,\bear@bright}
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -111,19 +126,19 @@
\csname tikzlinghookbackground\endcsname
%
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \bear@part@draw[\bear@body!70!black] (0.525,0.9) ellipse[x radius=0.35, y radius=0.15, rotate=-50];
- \bear@part@draw[\bear@body!70!black] (-0.525,0.9) ellipse[x radius=0.35, y radius=0.15, rotate=50];
+ \bear@part@draw[\bear@body] (0.525,0.9) ellipse[x radius=0.35, y radius=0.15, rotate=-50];
+ \bear@part@draw[\bear@body] (-0.525,0.9) ellipse[x radius=0.35, y radius=0.15, rotate=50];
%
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifbear@back
- \bear@part@draw[\bear@body!70!black] (0.425, 0.3) circle[radius=0.28];
- \bear@part@draw[\bear@body!70!black] (-0.425, 0.3) circle[radius=0.28];
+ \bear@part@draw[\bear@body] (0.425, 0.3) circle[radius=0.28];
+ \bear@part@draw[\bear@body] (-0.425, 0.3) circle[radius=0.28];
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \bear@part@draw[\bear@body!70!black] (0,0.75) ellipse[x radius=0.55, y radius=0.65];
+ \bear@part@draw[\bear@body] (0,0.75) ellipse[x radius=0.55, y radius=0.65];
\unless\ifbear@back
- \bear@part@draw[\bear@body!50!white] (0,0.7) ellipse[x radius=0.35, y radius=0.4];
+ \bear@part@draw[bear@bright] (0,0.7) ellipse[x radius=0.35, y radius=0.4];
\fi% back
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -132,36 +147,40 @@
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifbear@back
- \bear@part@draw[\bear@body!70!black] (0.425, 0.3) circle[radius=0.28];
- \bear@part@draw[\bear@body!70!black] (-0.425, 0.3) circle[radius=0.28];
- \bear@part@draw[\bear@body!50!white] (0.425, 0.3) circle[radius=0.17];
- \bear@part@draw[\bear@body!50!white] (-0.425, 0.3) circle[radius=0.17];
+ \bear@part@draw[\bear@body] (0.425, 0.3) circle[radius=0.28];
+ \bear@part@draw[\bear@body] (-0.425, 0.3) circle[radius=0.28];
+ \bear@part@draw[bear@bright] (0.425, 0.3) circle[radius=0.17];
+ \bear@part@draw[bear@bright] (-0.425, 0.3) circle[radius=0.17];
\fi% back
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \bear@part@draw[\bear@body!70!black] (0.375, 1.95) circle[radius=0.15];
- \bear@part@draw[\bear@body!70!black] (-0.375, 1.95) circle[radius=0.15];
+ \bear@part@draw[\bear@body] (0.375, 1.95) circle[radius=0.15];
+ \bear@part@draw[\bear@body] (-0.375, 1.95) circle[radius=0.15];
\unless\ifbear@back
- \bear@part@draw[\bear@body!50!white] (0.375, 1.95) circle[radius=0.1];
- \bear@part@draw[\bear@body!50!white] (-0.375, 1.95) circle[radius=0.1];
+ \bear@part@draw[bear@bright] (0.375, 1.95) circle[radius=0.1];
+ \bear@part@draw[bear@bright] (-0.375, 1.95) circle[radius=0.1];
\fi% back
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \bear@part@draw[\bear@body!70!black] (0, 1.55) circle[radius=0.5];
+ \bear@part@draw[\bear@body] (0, 1.55) circle[radius=0.5];
%
% Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifbear@back
%
% Muzzle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \bear@part@draw[\bear@body!50!white] (0, 1.4) ellipse[x radius=0.28, y radius=0.2];
- \bear@part@draw[\bear@body!70!white!80!red] (0, 1.5) ellipse[x radius=0.15, y radius=0.08];
+ \bear@part@draw[bear@bright] (0, 1.4) ellipse[x radius=0.28, y radius=0.2];
+ \bear@part@draw[bear@bright!60!red] (0, 1.5) ellipse[x radius=0.15, y radius=0.08];
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \bear@part@draw[\bear@eye] (-0.155, 1.7) circle[radius=0.05];
- \bear@part@draw[\bear@eye] (0.155, 1.7) circle[radius=0.05];
+ \bear@part@draw[\bear@eye] (-0.155, 1.7) circle[radius=0.05];
+ \bear@part@draw[\bear@eye] (0.155, 1.7) circle[radius=0.05];
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\bear@mouth,line width=\scalingfactor*0.4pt] (0.145, 1.38) arc [start angle=-20, end angle=-160, radius=0.16];
+ \ifbear@openmouth
+ \filldraw[\bear@mouth,line width=\scalingfactor*0.4pt] (0.145, 1.38) arc [start angle=-20, end angle=-160, radius=0.16];
+ \else
+ \draw[\bear@mouth,line width=\scalingfactor*0.4pt] (0.145, 1.38) arc [start angle=-20, end angle=-160, radius=0.16];
+ \fi
%
\fi% back
%
@@ -183,61 +202,66 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-bears}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-bears}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic bear}}
%\bear
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic teddy bear can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\bear[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\bear[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\bear[mouth=red]
%\end{tcblisting}
%
+% The bear can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\bear[openmouth]
+%\end{tcblisting}
+%
%To view the teddy bear from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\bear[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the teddy bear 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the teddy bear 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\bear[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\bear[contour=black]
%\end{tcblisting}
%
%\subsection{Extension}
%
-%The B\"ar and Ulrike Fischer wrote the fantastic \lstinline|bearwear| package, that provides many different clothing options for the \lstinline|TikZbears|. All the other \tikzlings admire them for the nice clothing!
+%The B\"ar and Ulrike Fischer wrote the fantastic \saminline|bearwear| package, that provides many different clothing options for the \saminline|TikZbears|. All the other \tikzlings admire them for the nice clothing!
%
%A short example:
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Bearwear example}}
%%\usepackage{bearwear}
%\bear
%\bearwear[
-% long sleeves,
+% long sleeves,
% shirt=red!80!black
%]
%\end{tcblisting}
%
-%Many more options and examples can be found in the package documentation \url{https://ctan.org/pkg/bearwear}.
+%Many more options and examples can be found in the package documentation \url{https://ctan.org/pkg/bearwear}.
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-bees.sty b/graphics/pgf/contrib/tikzlings/tikzlings-bees.sty
index 9fec259bdb..18d8ff9bcd 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-bees.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-bees.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-bees}[2022/06/17 version v1.0 Drawing bees in TikZ]
+\ProvidesPackage{tikzlings-bees}[2025/01/05 version v2.2 Drawing bees in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -26,12 +26,13 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname beehookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifbee@threeD
\newif\ifbee@back
\newif\ifbee@contour
+\newif\ifbee@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -49,36 +50,38 @@
body/.store in = \bee@body,
body = yellow!70!orange,
hands/.store in = \bee@hands,
- hands = black,
+ hands = black,
wings/.store in = \bee@wings,
- wings = blue!20!cyan!30!white,
+ wings = blue!20!cyan!30!white,
stripes/.store in = \bee@stripes,
- stripes = black,
+ stripes = black,
antennas/.store in = \bee@antennas,
- antennas = black,
+ antennas = black,
eye/.store in = \bee@eye,
- eye = black,
+ eye = black,
mouth/.store in = \bee@mouth,
- mouth = black,
+ mouth = black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \bee@threeDtrue,
- back/.code = \bee@backtrue,
+ openmouth/.code = \bee@openmouthtrue,
+ open mouth/.forward to = /bee/openmouth,
+ 3D/.code = \bee@threeDtrue,
+ back/.code = \bee@backtrue,
contour/.code = \bee@contourtrue
\def\bee@contour{#1}
\def\bee@antennas{#1}
\def\bee@mouth{#1},
- contour/.default = black,
- outline/.forward to = /bee/contour,
+ contour/.default = black,
+ outline/.forward to = /bee/contour,
}
\def\bee@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.88,0.1) rectangle (0.88, 2.4);
@@ -95,7 +98,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -113,11 +116,11 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \csname beeshookbackground\endcsname
+ \csname beehookbackground\endcsname
\csname tikzlinghookbackground\endcsname
%
\ifbee@back
@@ -141,18 +144,11 @@
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \begin{scope}
- \bee@part@draw[\bee@body] (0,2.1) to[out=180,in=140,looseness=1.2] (-0.3,1.5) to[out=-110,in=180,looseness=1.2] (0,0.15) to[out=00,in=-65,looseness=1.2] (0.3,1.5) to[out=40,in=0,looseness=1.2] cycle;
- \clip (0,2.1) to[out=180,in=140,looseness=1.2] (-0.3,1.5) to[out=-110,in=180,looseness=1.2] (0,0.15) to[out=00,in=-65,looseness=1.2] (0.3,1.5) to[out=40,in=0,looseness=1.2] cycle;
- % stripes
- \bee@part@draw[\bee@stripes] (-0.475,1.3) arc(180:360:0.5 and 0.1) -- ++ (0,-0.15) arc(360:180:0.5 and 0.1) -- cycle
- (-0.475,1.0) arc(180:360:0.5 and 0.1) -- ++ (0,-0.15) arc(360:180:0.5 and 0.1) -- cycle
- (-0.475,0.65) arc(180:360:0.5 and 0.1) -- ++ (0,-0.15) arc(360:180:0.5 and 0.1) -- cycle
- (-0.475,0.35) arc(180:360:0.5 and 0.1) -- ++ (0,-0.15) arc(360:180:0.5 and 0.1) -- cycle;
- \end{scope}
+ \bee@part@draw[\bee@body] (0,2.1) to[out=180,in=140,looseness=1.2] (-0.3,1.5) to[out=-110,in=180,looseness=1.2] (0,0.15) to[out=00,in=-65,looseness=1.2] (0.3,1.5) to[out=40,in=0,looseness=1.2] cycle;
+ \bee@part@draw[\bee@stripes] (-0.3845, 1.2427).. controls (-0.3978, 1.1967) and (-0.4102, 1.1508) .. (-0.4213, 1.1051).. controls (-0.339, 1.0724) and (-0.1703, 1.05) .. (0.025, 1.05).. controls (0.2024, 1.05) and (0.3578, 1.0685) .. (0.4466, 1.0964).. controls (0.4345, 1.1426) and (0.4206, 1.1889) .. (0.4053, 1.2351).. controls (0.3136, 1.2136) and (0.1774, 1.2) .. (0.025, 1.2).. controls (-0.1445, 1.2) and (-0.2941, 1.2169) .. (-0.3845, 1.2427) -- cycle(-0.4505, 0.9692).. controls (-0.4588, 0.9242) and (-0.4654, 0.88) .. (-0.4704, 0.8366).. controls (-0.4375, 0.7877) and (-0.2284, 0.75) .. (0.025, 0.75).. controls (0.2433, 0.75) and (0.4285, 0.778) .. (0.4966, 0.817).. controls (0.4925, 0.8629) and (0.4858, 0.9099) .. (0.4772, 0.9575).. controls (0.3973, 0.9236) and (0.2251, 0.9) .. (0.025, 0.9).. controls (-0.1973, 0.9) and (-0.3855, 0.929) .. (-0.4505, 0.9692) -- cycle(-0.475, 0.65) -- (-0.475, 0.5798).. controls (-0.4712, 0.5424) and (-0.465, 0.5067) .. (-0.4563, 0.4729).. controls (-0.3973, 0.4309) and (-0.2042, 0.4) .. (0.025, 0.4).. controls (0.2141, 0.4) and (0.3785, 0.421) .. (0.4635, 0.452).. controls (0.4809, 0.5028) and (0.4921, 0.5583) .. (0.4975, 0.6175).. controls (0.43, 0.5782) and (0.2442, 0.55) .. (0.025, 0.55).. controls (-0.2511, 0.55) and (-0.475, 0.5947) .. (-0.475, 0.65) -- cycle(-0.3628, 0.2869).. controls (-0.2871, 0.2009) and (-0.1703, 0.15) .. (-0.0, 0.15).. controls (0.1603, 0.15) and (0.2765, 0.1965) .. (0.3564, 0.2753).. controls (0.2681, 0.2596) and (0.1523, 0.25) .. (0.025, 0.25).. controls (-0.1315, 0.25) and (-0.2711, 0.2644) .. (-0.3628, 0.2869) -- cycle;
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \csname beeshookbelly\endcsname
+ \csname beehookbelly\endcsname
\csname tikzlinghookbelly\endcsname
%
% Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -171,16 +167,20 @@
\else% back
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \bee@part@draw[\bee@eye] (-0.15,1.8) circle[radius=0.05];
- \bee@part@draw[\bee@eye] (0.15,1.8) circle[radius=0.05];
+ \bee@part@draw[\bee@eye] (-0.15,1.8) circle[radius=0.05];
+ \bee@part@draw[\bee@eye] (0.15,1.8) circle[radius=0.05];
%
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\bee@part@draw[\bee@hands] (-0.25,0.88) circle[x radius=0.07,y radius=0.2, rotate=25];
\bee@part@draw[\bee@hands] (0.25,0.88) circle[x radius=0.07,y radius=0.2, rotate=-25];
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\bee@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.6) arc [start angle=-40, end angle=-140, radius=0.16];
- %
+ \ifbee@openmouth
+ \filldraw[\bee@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.6) arc [start angle=-40, end angle=-140, radius=0.16];
+ \else
+ \draw[\bee@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.6) arc [start angle=-40, end angle=-140, radius=0.16];
+ \fi
+ %
% Antenna %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\fill[\bee@antennas,rotate around={15:(-0.175,2.115)}] (-0.2,1.93) rectangle (-0.15,2.3);
\fill[\bee@antennas,rotate around={-15:(0.175,2.115)}] (0.2,1.93) rectangle (0.15,2.3);
@@ -190,7 +190,7 @@
\fi% back
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \csname beeshookbody\endcsname
+ \csname beehookbody\endcsname
\csname tikzlinghookbody\endcsname
%
}
@@ -207,15 +207,15 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-bees}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-bees}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic bee}}
%\bee
%\end{tcblisting}
%
@@ -227,36 +227,41 @@
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Antenna colour}}
%\bee[antennas=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\bee[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\bee[mouth=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Wing colour}}
%\bee[wings=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Hand colour}}
%\bee[hands=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Stripe colour}}
%\bee[stripes=red]
%\end{tcblisting}
%
+% The bee can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\bee[openmouth]
+%\end{tcblisting}
+%
%To view the bee from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={back view}}
%\bee[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the bee 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the bee 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\bee[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\bee[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-bugs.sty b/graphics/pgf/contrib/tikzlings/tikzlings-bugs.sty
index 65febf3bbc..8f618899f5 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-bugs.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-bugs.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-bugs}[2022/06/17 version v1.0 Drawing bugs in TikZ]
+\ProvidesPackage{tikzlings-bugs}[2025/01/05 version v2.2 Drawing bugs in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -26,12 +26,15 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname bughookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifbug@threeD
+\newif\ifbug@leftstep
+\newif\ifbug@rightstep
\newif\ifbug@back
\newif\ifbug@contour
+\newif\ifbug@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -49,40 +52,46 @@
body/.store in = \bug@body,
body = black!90!white,
arms/.store in = \bug@arms,
- arms = red!80!black,
+ arms = red!80!black,
wings/.store in = \bug@wings,
- wings = red!80!black,
+ wings = red!80!black,
dots/.store in = \bug@dots,
- dots = black!90!white,
+ dots = black!90!white,
antennas/.store in = \bug@antennas,
- antennas = red!80!black,
+ antennas = red!80!black,
eye/.store in = \bug@eye,
eye = white,
pupil/.store in = \bug@pupil,
pupil = black,
mouth/.store in = \bug@mouth,
- mouth = red,
+ mouth = red,
feet/.store in = \bug@feet,
- feet = red!80!black,
+ feet = red!80!black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \bug@threeDtrue,
- back/.code = \bug@backtrue,
+ 3D/.code = \bug@threeDtrue,
+ leftstep/.code = \bug@leftsteptrue,
+ left step/.forward to = /bug/leftstep,
+ rightstep/.code = \bug@rightsteptrue,
+ right step/.forward to = /bug/rightstep,
+ openmouth/.code = \bug@openmouthtrue,
+ open mouth/.forward to = /bug/openmouth,
+ back/.code = \bug@backtrue,
contour/.code = \bug@contourtrue
\def\bug@contour{#1}
\def\bug@antennas{#1}
\def\bug@mouth{#1},
- contour/.default = black,
- outline/.forward to = /bug/contour,
+ contour/.default = black,
+ outline/.forward to = /bug/contour,
}
\def\bug@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.92,0.02) rectangle (0.92, 2.36);
@@ -99,7 +108,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -117,33 +126,41 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \csname bugshookbackground\endcsname
+ \csname bughookbackground\endcsname
\csname tikzlinghookbackground\endcsname
%
\ifbug@back
- %
+ %
% Antenna %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\draw[\bug@antennas,line width=\scalingfactor*0.8pt] (0.1134, 1.911) .. controls (0.0917, 2.0537) and (0.0986, 2.1999) .. (0.1608, 2.2816) .. controls (0.245, 2.3919) and (0.3278, 2.3011) .. (0.3272, 2.2192) .. controls (0.3266, 2.1341) and (0.2237, 2.0423) .. (0.1978, 2.1538);
\draw[\bug@antennas,line width=\scalingfactor*0.8pt] (-0.1134, 1.911) .. controls (-0.0917, 2.0537) and (-0.0986, 2.1999) .. (-0.1608, 2.2816) .. controls (-0.245, 2.3919) and (-0.3278, 2.3011) .. (-0.3272, 2.2192) .. controls (-0.3266, 2.1341) and (-0.2237, 2.0423) .. (-0.1978, 2.1538);
\else% back
%
% Wings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \bug@part@draw[\bug@wings] (-0.0955, 1.4222) .. controls (-0.2086, 1.6765) and (-0.692, 1.2508) .. (-0.8174, 1.0023) .. controls (-0.9304, 0.7786) and (-0.9533, 0.379) .. (-0.7355, 0.2548) .. controls (-0.5988, 0.1768) and (-0.4043, 0.3269) .. (-0.3054, 0.4494) .. controls (-0.097, 0.7075) and (0.0589, 1.0749) .. (-0.0955, 1.4222) -- cycle;
+ \bug@part@draw[\bug@wings] (-0.0955, 1.4222) .. controls (-0.2086, 1.6765) and (-0.692, 1.2508) .. (-0.8174, 1.0023) .. controls (-0.9304, 0.7786) and (-0.9533, 0.379) .. (-0.7355, 0.2548) .. controls (-0.5988, 0.1768) and (-0.4043, 0.3269) .. (-0.3054, 0.4494) .. controls (-0.097, 0.7075) and (0.0589, 1.0749) .. (-0.0955, 1.4222) -- cycle;
\bug@part@draw[\bug@wings] (0.0955, 1.4222) .. controls (0.2086, 1.6765) and (0.692, 1.2508) .. (0.8174, 1.0023) .. controls (0.9304, 0.7786) and (0.9533, 0.379) .. (0.7355, 0.2548) .. controls (0.5988, 0.1768) and (0.4043, 0.3269) .. (0.3054, 0.4494) .. controls (0.097, 0.7075) and (-0.0589, 1.0749) .. (0.0955, 1.4222) -- cycle;
\ifbug@contour
- \bug@part@draw[\bug@dots] (-0.2,0.85) circle [radius=0.08] (-0.5,0.8) circle [radius=0.08] (-0.8,0.75) circle [radius=0.08] (-0.35,0.6) circle [radius=0.08] (-0.65,0.5) circle [radius=0.08] (-0.3,1.05) circle [radius=0.08] (-0.6,1.1) circle [radius=0.08] (-0.35,1.35) circle [radius=0.08] (0.2,0.85) circle [radius=0.08] (0.5,0.8) circle [radius=0.08] (0.8,0.75) circle [radius=0.08] (0.35,0.6) circle [radius=0.08] (0.65,0.5) circle [radius=0.08] (0.3,1.05) circle [radius=0.08] (0.6,1.1) circle [radius=0.08] (0.35,1.35) circle [radius=0.08];
- \else% contour
- \fill[\bug@dots] (-0.2,0.85) circle [radius=0.08] (-0.5,0.8) circle [radius=0.08] (-0.8,0.75) circle [radius=0.08] (-0.35,0.6) circle [radius=0.08] (-0.65,0.5) circle [radius=0.08] (-0.3,1.05) circle [radius=0.08] (-0.6,1.1) circle [radius=0.08] (-0.35,1.35) circle [radius=0.08] (0.2,0.85) circle [radius=0.08] (0.5,0.8) circle [radius=0.08] (0.8,0.75) circle [radius=0.08] (0.35,0.6) circle [radius=0.08] (0.65,0.5) circle [radius=0.08] (0.3,1.05) circle [radius=0.08] (0.6,1.1) circle [radius=0.08] (0.35,1.35) circle [radius=0.08];
+ \bug@part@draw[\bug@dots] (-0.2,0.85) circle [radius=0.08] (-0.5,0.8) circle [radius=0.08] (-0.8,0.75) circle [radius=0.08] (-0.35,0.6) circle [radius=0.08] (-0.65,0.5) circle [radius=0.08] (-0.3,1.05) circle [radius=0.08] (-0.6,1.1) circle [radius=0.08] (-0.35,1.35) circle [radius=0.08] (0.2,0.85) circle [radius=0.08] (0.5,0.8) circle [radius=0.08] (0.8,0.75) circle [radius=0.08] (0.35,0.6) circle [radius=0.08] (0.65,0.5) circle [radius=0.08] (0.3,1.05) circle [radius=0.08] (0.6,1.1) circle [radius=0.08] (0.35,1.35) circle [radius=0.08];
+ \else% contour
+ \fill[\bug@dots] (-0.2,0.85) circle [radius=0.08] (-0.5,0.8) circle [radius=0.08] (-0.8,0.75) circle [radius=0.08] (-0.35,0.6) circle [radius=0.08] (-0.65,0.5) circle [radius=0.08] (-0.3,1.05) circle [radius=0.08] (-0.6,1.1) circle [radius=0.08] (-0.35,1.35) circle [radius=0.08] (0.2,0.85) circle [radius=0.08] (0.5,0.8) circle [radius=0.08] (0.8,0.75) circle [radius=0.08] (0.35,0.6) circle [radius=0.08] (0.65,0.5) circle [radius=0.08] (0.3,1.05) circle [radius=0.08] (0.6,1.1) circle [radius=0.08] (0.35,1.35) circle [radius=0.08];
\fi% contour
\fi% back
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \bug@part@draw[\bug@feet] (0.2,0.1) ellipse[x radius=0.18, y radius=0.06];
- \bug@part@draw[\bug@feet] (-0.2,0.1) ellipse[x radius=0.18, y radius=0.06];
+ \ifbug@leftstep
+ \bug@part@draw[\bug@feet] (-0.2,0.12) ellipse[x radius=0.18, y radius=0.06];
+ \else% step
+ \bug@part@draw[\bug@feet] (-0.2,0.1) ellipse[x radius=0.18, y radius=0.06];
+ \fi% step
+ \ifbug@rightstep
+ \bug@part@draw[\bug@feet] (0.2,0.12) ellipse[x radius=0.18, y radius=0.06];
+ \else% step
+ \bug@part@draw[\bug@feet] (0.2,0.1) ellipse[x radius=0.18, y radius=0.06];
+ \fi% step
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\bug@part@draw[\bug@body] ( 0.55, 0.75) .. controls ( 0.55, 0.40) and ( 0.55, 0.08) .. ( 0.00, 0.08) .. controls (-0.55, 0.08) and (-0.55, 0.40) .. (-0.55, 0.75) .. controls (-0.55, 1.13) and (-0.30, 1.44) .. ( 0.00, 1.44) .. controls ( 0.30, 1.44) and ( 0.55, 1.13) .. ( 0.55, 0.75) -- cycle;
@@ -152,19 +169,19 @@
\bug@part@draw[\bug@body] (0,1.7) circle [radius=0.37];
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \csname bugshookbelly\endcsname
+ \csname bughookbelly\endcsname
\csname tikzlinghookbelly\endcsname
%
% Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifbug@back
%
% Wings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \bug@part@draw[\bug@wings] (-0.0955, 1.4222) .. controls (-0.2086, 1.6765) and (-0.692, 1.2508) .. (-0.8174, 1.0023) .. controls (-0.9304, 0.7786) and (-0.9533, 0.379) .. (-0.7355, 0.2548) .. controls (-0.5988, 0.1768) and (-0.4043, 0.3269) .. (-0.3054, 0.4494) .. controls (-0.097, 0.7075) and (0.0589, 1.0749) .. (-0.0955, 1.4222) -- cycle;
+ \bug@part@draw[\bug@wings] (-0.0955, 1.4222) .. controls (-0.2086, 1.6765) and (-0.692, 1.2508) .. (-0.8174, 1.0023) .. controls (-0.9304, 0.7786) and (-0.9533, 0.379) .. (-0.7355, 0.2548) .. controls (-0.5988, 0.1768) and (-0.4043, 0.3269) .. (-0.3054, 0.4494) .. controls (-0.097, 0.7075) and (0.0589, 1.0749) .. (-0.0955, 1.4222) -- cycle;
\bug@part@draw[\bug@wings] (0.0955, 1.4222) .. controls (0.2086, 1.6765) and (0.692, 1.2508) .. (0.8174, 1.0023) .. controls (0.9304, 0.7786) and (0.9533, 0.379) .. (0.7355, 0.2548) .. controls (0.5988, 0.1768) and (0.4043, 0.3269) .. (0.3054, 0.4494) .. controls (0.097, 0.7075) and (-0.0589, 1.0749) .. (0.0955, 1.4222) -- cycle;
\ifbug@contour
- \bug@part@draw[\bug@dots] (-0.2,0.85) circle [radius=0.08] (-0.5,0.8) circle [radius=0.08] (-0.8,0.75) circle [radius=0.08] (-0.35,0.6) circle [radius=0.08] (-0.65,0.5) circle [radius=0.08] (-0.3,1.05) circle [radius=0.08] (-0.6,1.1) circle [radius=0.08] (-0.35,1.35) circle [radius=0.08] (0.2,0.85) circle [radius=0.08] (0.5,0.8) circle [radius=0.08] (0.8,0.75) circle [radius=0.08] (0.35,0.6) circle [radius=0.08] (0.65,0.5) circle [radius=0.08] (0.3,1.05) circle [radius=0.08] (0.6,1.1) circle [radius=0.08] (0.35,1.35) circle [radius=0.08];
+ \bug@part@draw[\bug@dots] (-0.2,0.85) circle [radius=0.08] (-0.5,0.8) circle [radius=0.08] (-0.8,0.75) circle [radius=0.08] (-0.35,0.6) circle [radius=0.08] (-0.65,0.5) circle [radius=0.08] (-0.3,1.05) circle [radius=0.08] (-0.6,1.1) circle [radius=0.08] (-0.35,1.35) circle [radius=0.08] (0.2,0.85) circle [radius=0.08] (0.5,0.8) circle [radius=0.08] (0.8,0.75) circle [radius=0.08] (0.35,0.6) circle [radius=0.08] (0.65,0.5) circle [radius=0.08] (0.3,1.05) circle [radius=0.08] (0.6,1.1) circle [radius=0.08] (0.35,1.35) circle [radius=0.08];
\else% contour
- \fill[\bug@dots] (-0.2,0.85) circle [radius=0.08] (-0.5,0.8) circle [radius=0.08] (-0.8,0.75) circle [radius=0.08] (-0.35,0.6) circle [radius=0.08] (-0.65,0.5) circle [radius=0.08] (-0.3,1.05) circle [radius=0.08] (-0.6,1.1) circle [radius=0.08] (-0.35,1.35) circle [radius=0.08] (0.2,0.85) circle [radius=0.08] (0.5,0.8) circle [radius=0.08] (0.8,0.75) circle [radius=0.08] (0.35,0.6) circle [radius=0.08] (0.65,0.5) circle [radius=0.08] (0.3,1.05) circle [radius=0.08] (0.6,1.1) circle [radius=0.08] (0.35,1.35) circle [radius=0.08];
+ \fill[\bug@dots] (-0.2,0.85) circle [radius=0.08] (-0.5,0.8) circle [radius=0.08] (-0.8,0.75) circle [radius=0.08] (-0.35,0.6) circle [radius=0.08] (-0.65,0.5) circle [radius=0.08] (-0.3,1.05) circle [radius=0.08] (-0.6,1.1) circle [radius=0.08] (-0.35,1.35) circle [radius=0.08] (0.2,0.85) circle [radius=0.08] (0.5,0.8) circle [radius=0.08] (0.8,0.75) circle [radius=0.08] (0.35,0.6) circle [radius=0.08] (0.65,0.5) circle [radius=0.08] (0.3,1.05) circle [radius=0.08] (0.6,1.1) circle [radius=0.08] (0.35,1.35) circle [radius=0.08];
\fi% contour
\else% back
%
@@ -179,8 +196,12 @@
\bug@part@draw[\bug@arms] (0.25,0.88) circle[x radius=0.07,y radius=0.18, rotate=-35];
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\bug@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.56) arc [start angle=-40, end angle=-140, radius=0.16];
- %
+ \ifbug@openmouth
+ \filldraw[\bug@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.56) arc [start angle=-40, end angle=-140, radius=0.16];
+ \else
+ \draw[\bug@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.56) arc [start angle=-40, end angle=-140, radius=0.16];
+ \fi
+ %
% Antenna %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\draw[\bug@antennas,line width=\scalingfactor*0.8pt] (0.1134, 1.911) .. controls (0.0917, 2.0537) and (0.0986, 2.1999) .. (0.1608, 2.2816) .. controls (0.245, 2.3919) and (0.3278, 2.3011) .. (0.3272, 2.2192) .. controls (0.3266, 2.1341) and (0.2237, 2.0423) .. (0.1978, 2.1538);
\draw[\bug@antennas,line width=\scalingfactor*0.8pt] (-0.1134, 1.911) .. controls (-0.0917, 2.0537) and (-0.0986, 2.1999) .. (-0.1608, 2.2816) .. controls (-0.245, 2.3919) and (-0.3278, 2.3011) .. (-0.3272, 2.2192) .. controls (-0.3266, 2.1341) and (-0.2237, 2.0423) .. (-0.1978, 2.1538);
@@ -188,7 +209,7 @@
\fi% back
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \csname bugshookbody\endcsname
+ \csname bughookbody\endcsname
\csname tikzlinghookbody\endcsname
%
}
@@ -205,59 +226,70 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-bugs}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-bugs}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic bug}}
%\bug
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic bug can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\bug[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Antenna Colour}}
%\bug[antennas=blue]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\bug[eye=blue]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil colour}}
%\bug[pupil=blue]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\bug[mouth=blue]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Arm colour}}
%\bug[arms=blue]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Wing colour}}
%\bug[wings=blue]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Foot colour}}
%\bug[feet=blue]
%\end{tcblisting}
%
+% The bug can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\bug[openmouth]
+%\end{tcblisting}
+%
+%And the bug can lift its legs:
+%\begin{tcblisting}{title={Walking}}
+%\bug[leftstep]
+%\bug[rightstep,xshift=2cm]
+%\end{tcblisting}
+%
%To view the bug from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\bug[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the bug 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the bug 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\bug[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\bug[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-cats.sty b/graphics/pgf/contrib/tikzlings/tikzlings-cats.sty
index d34599cd7a..41dc7521ad 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-cats.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-cats.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-cats}[2022/06/17 version v1.0 Drawing cats in TikZ]
+\ProvidesPackage{tikzlings-cats}[2025/01/05 version v2.2 Drawing cats in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -24,13 +24,13 @@
\else
\ifdefined\pdfrandomseed % pdflatex
\else
- \ifdefined\randomseed
+ \ifdefined\randomseed
\let\pdfrandomseed\randomseed % post TL19 xelatex and lualatex
\else
\let\pdfrandomseed\time % pre TL19 xelatex
\fi
\fi
- \pgfmathsetseed{\number\pdfrandomseed}
+ \pgfmathsetseed{\number\pdfrandomseed}
\fi
\ExplSyntaxOff
@@ -59,6 +59,7 @@
\newif\ifcat@schroedinger
\newif\ifcat@back
\newif\ifcat@contour
+\newif\ifcat@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -103,21 +104,23 @@
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \cat@threeDtrue,
schroedinger/.code = \cat@schroedingertrue,
- back/.code = \cat@backtrue,
+ openmouth/.code = \cat@openmouthtrue,
+ open mouth/.forward to = /cat/openmouth,
+ 3D/.code = \cat@threeDtrue,
+ back/.code = \cat@backtrue,
contour/.code = \cat@contourtrue
\def\cat@contour{#1}
\def\cat@whiskers{#1},
- contour/.default = black,
- outline/.forward to = /cat/contour,
+ contour/.default = black,
+ outline/.forward to = /cat/contour,
}
\def\cat@draw{%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.56,0.1) rectangle (1.63, 2.22);
@@ -134,7 +137,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -152,7 +155,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -164,7 +167,7 @@
%
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifcat@back
- \cat@part@draw[\cat@paws] (-0.255,0.3) circle[radius=0.18];
+ \cat@part@draw[\cat@paws] (-0.255,0.3) circle[radius=0.18];
\cat@part@draw[\cat@paws] (0.255,0.3) circle[radius=0.18];
\fi% back
%
@@ -176,10 +179,8 @@
\csname tikzlinghookbelly\endcsname
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \cat@part@draw[\cat@body]
- (0.12, 2.0392) .. controls (0.16, 2.1584) and (0.37, 2.22) .. (0.37, 2.20) .. controls (0.37, 2.2) and (0.39, 1.9) .. (0.2721, 1.9) .. controls (0.1891, 1.88) and (0.12, 1.88) .. (0.12, 2.0392) -- cycle;
- \cat@part@draw[\cat@body]
- (-0.12, 2.0392) .. controls (-0.16, 2.1584) and (-0.37, 2.22) .. (-0.37, 2.20) .. controls (-0.37, 2.2) and (-0.39, 1.9) .. (-0.2721, 1.9) .. controls (-0.1891, 1.88) and (-0.12, 1.88) .. (-0.12, 2.0392) -- cycle;
+ \cat@part@draw[\cat@body] (0.12, 2.0392) .. controls (0.16, 2.1584) and (0.37, 2.22) .. (0.37, 2.20) .. controls (0.37, 2.2) and (0.39, 1.9) .. (0.2721, 1.9) .. controls (0.1891, 1.88) and (0.12, 1.88) .. (0.12, 2.0392) -- cycle;
+ \cat@part@draw[\cat@body] (-0.12, 2.0392) .. controls (-0.16, 2.1584) and (-0.37, 2.22) .. (-0.37, 2.20) .. controls (-0.37, 2.2) and (-0.39, 1.9) .. (-0.2721, 1.9) .. controls (-0.1891, 1.88) and (-0.12, 1.88) .. (-0.12, 2.0392) -- cycle;
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cat@part@draw[\cat@body] (0,1.64) circle[radius=0.44];
@@ -196,7 +197,11 @@
\cat@part@draw[\cat@pupil] ( 0.1720, 1.8071) .. controls ( 0.1720+\cat@pupil@width, 1.7827+\cat@pupil@offset) and ( 0.1720+\cat@pupil@width, 1.7584-\cat@pupil@offset) .. ( 0.1720, 1.7341) .. controls ( 0.1720-\cat@pupil@width, 1.7584-\cat@pupil@offset) and ( 0.1720-\cat@pupil@width, 1.7827+\cat@pupil@offset) .. ( 0.1720, 1.8071) -- cycle;
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\cat@whiskers,line width=\scalingfactor*0.2pt] (-0.16, 1.527) .. controls (-0.16, 1.527) and (-0.062, 1.420) .. ( 0.000, 1.556) .. controls ( 0.062, 1.420) and ( 0.16, 1.527) .. ( 0.16, 1.527);
+ \ifcat@openmouth
+ \filldraw[\cat@whiskers,line width=\scalingfactor*0.2pt] (-0.16, 1.527) .. controls (-0.16, 1.527) and (-0.062, 1.420) .. ( 0.000, 1.556) .. controls ( 0.062, 1.420) and ( 0.16, 1.527) .. ( 0.16, 1.527) (0.16,1.527) arc [start angle=-20, end angle=-160, radius=0.17];
+ \else
+ \draw[\cat@whiskers,line width=\scalingfactor*0.2pt] (-0.16, 1.527) .. controls (-0.16, 1.527) and (-0.062, 1.420) .. ( 0.000, 1.556) .. controls ( 0.062, 1.420) and ( 0.16, 1.527) .. ( 0.16, 1.527);
+ \fi
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cat@part@draw[\cat@nose] (-0.069, 1.6452) .. controls (-0.0524, 1.6613) and (0.0524, 1.6613) .. (0.069, 1.6452) .. controls (0.08, 1.625) and (0.0206, 1.55) .. (0, 1.55) .. controls (-0.0206, 1.55) and (-0.08, 1.625) .. (-0.069, 1.6452) -- cycle;
@@ -210,8 +215,8 @@
\fill[\cat@whiskers] (-0.0671, 1.6243) .. controls (-0.1414, 1.6725) and (-0.2182, 1.6964) .. (-0.2925, 1.6482) -- (-0.2925, 1.6582) .. controls (-0.2179, 1.7066) and (-0.1417, 1.6727) .. (-0.0671, 1.6243) -- cycle;
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \cat@part@draw[\cat@paws] (-0.255,0.3) circle[radius=0.18];
- \cat@part@draw[\cat@paws] (0.255,0.3) circle[radius=0.18];
+ \cat@part@draw[\cat@paws] (-0.255,0.3) circle[radius=0.18];
+ \cat@part@draw[\cat@paws] (0.255,0.3) circle[radius=0.18];
%
\fi% back
%
@@ -224,7 +229,7 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.55,0.39) rectangle (0.55, 2.06);
@@ -241,7 +246,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -257,7 +262,7 @@
\fi% 3D
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% Drawing the tomebstone
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -307,50 +312,55 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-cats}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-cats}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic cat}}
%\cat
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic cat can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\cat[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\cat[eye=green]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil colour}}
%\cat[pupil=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Nose colour}}
%\cat[nose=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Whiskers colour}}
%\cat[whiskers=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Paw colour}}
%\cat[paws=red]
%\end{tcblisting}
%
-%The shape of the \lstinline|pupil| can be changed with the \lstinline|pupilwidth| option:
-%\begin{tcblisting}{}
+% The cat can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\cat[openmouth]
+%\end{tcblisting}
+%
+%The shape of the \saminline|pupil| can be changed with the \saminline|pupilwidth| option:
+%\begin{tcblisting}{title={Width of pupils}}
%\cat[pupilwidth=0.015]
%\end{tcblisting}
%
%Additionally several predefined widths exist:
-%\begin{tcolorbox}
-%\begin{lstlisting}[morekeywords={narrow,medium,wide,very,pupils}]
+%\begin{tcolorbox}[title={Predefined pupil widths}]
+%\begin{samcode}
%\cat[narrow pupils]
%
%\cat[medium pupils]
@@ -358,7 +368,7 @@
%\cat[wide pupils]
%
%\cat[very wide pupils]
-%\end{lstlisting}
+%\end{samcode}
%
%\tcblower
%\begin{tikzpicture}[yshift=2.4cm,xshift=1.8cm]
@@ -369,7 +379,7 @@
%\end{tikzpicture}
%\end{tcolorbox}
%
-%There is also the special option \lstinline|schroedinger|. This cat is both alive and dead as long as you did not compile your document.
+%There is also the special option \saminline|schroedinger|. This cat is both alive and dead as long as you did not compile your document.
%Be prepared for a possibly disturbing scene when you open the pdf, this option is not suited for sensitive \tikzlings.
%\begingroup
%\makeatletter
@@ -379,22 +389,22 @@
%}
%\renewcommand{\cathookbackground}{}
%\makeatother
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Schrödingers cat}}
%\cat[schroedinger]
%\end{tcblisting}
%\endgroup
%
%To view the cat from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\cat[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the cat 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the cat 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\cat[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\cat[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-chickens.sty b/graphics/pgf/contrib/tikzlings/tikzlings-chickens.sty
index 1d96fc9d66..ff770860fd 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-chickens.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-chickens.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-chickens}[2022/06/17 version v1.0 Draw chickens in TikZ]
+\ProvidesPackage{tikzlings-chickens}[2025/01/05 version v2.2 Draw chickens in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -31,7 +31,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname chickenhookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifchicken@threeD
@@ -53,7 +53,7 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
body/.store in = \chicken@body,
- body = brown!50!orange!70!yellow!80!white,
+ body = brown!90!orange!70!yellow!40!white,
eye/.store in = \chicken@eye,
eye = white!90!gray,
pupil/.store in = \chicken@pupil,
@@ -61,24 +61,24 @@
bill/.store in = \chicken@bill,
bill = yellow,
feet/.store in = \chicken@feet,
- feet = orange!90!yellow,
+ feet = orange!90!yellow,
comb/.store in = \chicken@comb,
- comb = red,
+ comb = red,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3D/.code = \chicken@threeDtrue,
- back/.code = \chicken@backtrue,
+ back/.code = \chicken@backtrue,
contour/.code = \chicken@contourtrue
\def\chicken@contour{#1},
- contour/.default = black,
- outline/.forward to = /chicken/contour,
+ contour/.default = black,
+ outline/.forward to = /chicken/contour,
baby/.code = \chicken@babytrue
\def\chicken@baby{#1}
\def\chicken@bill{\chicken@feet},
- baby/.default = yellow!80!orange,
+ baby/.default = yellow!80!orange,
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -89,7 +89,7 @@
\def\chicken@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.96, 0.08) rectangle (0.96, 2.35);
@@ -106,7 +106,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -123,8 +123,20 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
+ % generating saturated version of body colour
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \extractcolorspecs{\chicken@body}{\chicken@model}{\chicken@colorspec}
+ \convertcolorspec{\chicken@model}{\chicken@colorspec}{hsb}{\chicken@hsbcolorspec}
+ \pgfmathsetmacro{\chicken@hue}{(array({\chicken@hsbcolorspec},0))}
+ \pgfmathsetmacro{\chicken@sat}{(array({\chicken@hsbcolorspec},1)+0.5)}
+ \pgfmathsetmacro{\chicken@bright}{(array({\chicken@hsbcolorspec},2))}
+ \definecolor{chicken@bodysat50}{hsb}{\chicken@hue,\chicken@sat,\chicken@bright}
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -132,12 +144,12 @@
\csname tikzlinghookbackground\endcsname
%
% Wings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \chicken@part@draw[\chicken@body] (0.57,0.95) ellipse[x radius=0.3, y radius=0.08, rotate=-65];
- \chicken@part@draw[\chicken@body] (0.64,1.07) ellipse[x radius=0.3, y radius=0.08, rotate=-43];
- \chicken@part@draw[\chicken@body] (0.66,1.18) ellipse[x radius=0.3, y radius=0.08, rotate=-18];
- \chicken@part@draw[\chicken@body] (-0.57,0.95) ellipse[x radius=0.3, y radius=0.08, rotate=65];
- \chicken@part@draw[\chicken@body] (-0.64,1.07) ellipse[x radius=0.3, y radius=0.08, rotate=43];
- \chicken@part@draw[\chicken@body] (-0.66,1.18) ellipse[x radius=0.3, y radius=0.08, rotate=18];
+ \chicken@part@draw[chicken@bodysat50] (0.57,0.95) ellipse[x radius=0.3, y radius=0.08, rotate=-65];
+ \chicken@part@draw[chicken@bodysat50] (0.64,1.07) ellipse[x radius=0.3, y radius=0.08, rotate=-43];
+ \chicken@part@draw[chicken@bodysat50] (0.66,1.18) ellipse[x radius=0.3, y radius=0.08, rotate=-18];
+ \chicken@part@draw[chicken@bodysat50] (-0.57,0.95) ellipse[x radius=0.3, y radius=0.08, rotate=65];
+ \chicken@part@draw[chicken@bodysat50] (-0.64,1.07) ellipse[x radius=0.3, y radius=0.08, rotate=43];
+ \chicken@part@draw[chicken@bodysat50] (-0.66,1.18) ellipse[x radius=0.3, y radius=0.08, rotate=18];
%
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifchicken@back
@@ -152,8 +164,8 @@
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \chicken@part@draw[\chicken@body!50!white] ( 0.00, 0.33) .. controls (-0.60, 0.33) and (-0.55, 0.65) .. (-0.55, 0.90) .. controls (-0.55, 1.10) and (-0.48, 1.20) .. (-0.39, 1.40) .. controls (-0.32, 1.58) and (-0.32, 2.09) .. ( 0.00, 2.09) .. controls ( 0.32, 2.09) and ( 0.32, 1.58) .. ( 0.39, 1.40) .. controls ( 0.48, 1.20) and ( 0.55, 1.10) .. ( 0.55, 0.90) .. controls ( 0.55, 0.65) and ( 0.60, 0.33) .. ( 0, 0.33) -- cycle;
- \chicken@part@draw[\chicken@body,decoration={snake,amplitude=\scalingfactor*1.5pt,segment length=\scalingfactor*6.1pt}] ( -0.39, 1.40) .. controls (-0.32, 1.58) and (-0.32, 2.09) .. ( 0.00, 2.09) .. controls ( 0.32, 2.09) and ( 0.32, 1.58) .. ( 0.39, 1.40) decorate {arc [start angle=-60,end angle=-120,radius=0.77]} -- cycle;
+ \chicken@part@draw[\chicken@body] ( 0.00, 0.33) .. controls (-0.60, 0.33) and (-0.55, 0.65) .. (-0.55, 0.90) .. controls (-0.55, 1.10) and (-0.48, 1.20) .. (-0.39, 1.40) .. controls (-0.32, 1.58) and (-0.32, 2.09) .. ( 0.00, 2.09) .. controls ( 0.32, 2.09) and ( 0.32, 1.58) .. ( 0.39, 1.40) .. controls ( 0.48, 1.20) and ( 0.55, 1.10) .. ( 0.55, 0.90) .. controls ( 0.55, 0.65) and ( 0.60, 0.33) .. ( 0, 0.33) -- cycle;
+ \chicken@part@draw[chicken@bodysat50,decoration={snake,amplitude=\scalingfactor*1.5pt,segment length=\scalingfactor*6.1pt}] ( -0.39, 1.40) .. controls (-0.32, 1.58) and (-0.32, 2.09) .. ( 0.00, 2.09) .. controls ( 0.32, 2.09) and ( 0.32, 1.58) .. ( 0.39, 1.40) decorate {arc [start angle=-60,end angle=-120,radius=0.77]} -- cycle;
%
% Comb %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chicken@part@draw[\chicken@comb] (0.04,2.132) ellipse[x radius=0.22, y radius=0.06, rotate=70];
@@ -175,7 +187,7 @@
% Bill %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifchicken@back
\chicken@part@draw[\chicken@comb] (-0.04, 1.57) ellipse[x radius=0.04, y radius=0.08, rotate=-20];
- \chicken@part@draw[\chicken@comb] (0.04, 1.57) ellipse[x radius=0.04, y radius=0.08, rotate=20];
+ \chicken@part@draw[\chicken@comb] (0.04, 1.57) ellipse[x radius=0.04, y radius=0.08, rotate=20];
\chicken@part@draw[\chicken@bill] (-0.09, 1.7) -- (0, 1.58) -- (0.09, 1.7) arc [start angle=50, end angle=130, radius=0.14] -- cycle;
\fi% back
%
@@ -193,10 +205,10 @@
%
% Tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifchicken@back
- \chicken@part@draw[\chicken@body] (0.12, 0.795) ellipse[x radius=0.20, y radius=0.06, rotate=58];
- \chicken@part@draw[\chicken@body] (0.04, 0.87) ellipse[x radius=0.25, y radius=0.06, rotate=80];
- \chicken@part@draw[\chicken@body] (-0.03, 0.83) ellipse[x radius=0.20, y radius=0.06, rotate=102];
- \chicken@part@draw[\chicken@body] (-0.082, 0.76) ellipse[x radius=0.17, y radius=0.06, rotate=130];
+ \chicken@part@draw[chicken@bodysat50] (0.12, 0.795) ellipse[x radius=0.20, y radius=0.06, rotate=58];
+ \chicken@part@draw[chicken@bodysat50] (0.04, 0.87) ellipse[x radius=0.25, y radius=0.06, rotate=80];
+ \chicken@part@draw[chicken@bodysat50] (-0.03, 0.83) ellipse[x radius=0.20, y radius=0.06, rotate=102];
+ \chicken@part@draw[chicken@bodysat50] (-0.082, 0.76) ellipse[x radius=0.17, y radius=0.06, rotate=130];
\fi% back
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -213,7 +225,7 @@
\def\chicken@drawbaby{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.53, 0.1) rectangle (0.53, 1.22);
@@ -230,7 +242,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -248,7 +260,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts (center: x=0.925)
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -341,62 +353,62 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-chickens}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-chickens}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic chicken}}
%\chicken
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic chicken can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\chicken[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Comb colour}}
%\chicken[comb=green]
%\end{tcblisting}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\chicken[eye=red]
%\end{tcblisting}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil color}}
%\chicken[pupil=red]
%\end{tcblisting}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Bill colour}}
%\chicken[bill=red]
%\end{tcblisting}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Foot colour}}
%\chicken[feet=red]
%\end{tcblisting}
%
-%There is also the special option \lstinline|baby| which will draw a baby chicken called \emph{Pio}:
-%\begin{tcblisting}{}
+%There is also the special option \saminline|baby| which will draw a baby chicken called \emph{Pio}:
+%\begin{tcblisting}{title={Baby chicken}}
%\chicken[baby=yellow]
%\end{tcblisting}
%
%To view the chicken from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\chicken[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the chicken 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the chicken 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\chicken[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\chicken[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-coatis.sty b/graphics/pgf/contrib/tikzlings/tikzlings-coatis.sty
index d98c1398f2..1e5bba28a7 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-coatis.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-coatis.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-coatis}[2022/06/17 version v1.0 Drawing coatis in TikZ]
+\ProvidesPackage{tikzlings-coatis}[2025/01/05 version v2.2 Drawing coatis in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -30,6 +30,8 @@
\newif\ifcoati@threeD
\newif\ifcoati@sideward
+\newif\ifcoati@leftstep
+\newif\ifcoati@rightstep
\newif\ifcoati@back
\newif\ifcoati@contour
@@ -47,9 +49,9 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
body/.store in = \coati@body,
- body = brown!50!darkgray!97!yellow,
+ body = brown!50!darkgray!97!yellow!50!darkgray,
eye/.store in = \coati@eye,
- eye = \coati@body!50!black,
+ eye = coati@bodybright!50!black,
rotatehead/.store in = \coati@rotatehead,
rotate head/.forward to = /coati/rotatehead,
rotatehead = 0,
@@ -58,19 +60,23 @@
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \coati@threeDtrue,
+ 3D/.code = \coati@threeDtrue,
sideward/.code = \coati@sidewardtrue,
- back/.code = \coati@backtrue,
+ leftstep/.code = \coati@leftsteptrue,
+ left step/.forward to = /coati/leftstep,
+ rightstep/.code = \coati@rightsteptrue,
+ right step/.forward to = /coati/rightstep,
+ back/.code = \coati@backtrue,
contour/.code = \coati@contourtrue
\def\coati@contour{#1},
- contour/.default = black,
- outline/.forward to = /coati/contour,
+ contour/.default = black,
+ outline/.forward to = /coati/contour,
}
\def\coati@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.84,0.1) rectangle (1.63,2.26);
@@ -87,7 +93,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -102,75 +108,93 @@
\fi% contour
\fi% 3D
%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % generating saturated version of body colour
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \extractcolorspecs{\coati@body}{\coati@model}{\coati@colorspec}
+ \convertcolorspec{\coati@model}{\coati@colorspec}{hsb}{\coati@hsbcolorspec}
+ \pgfmathsetmacro{\coati@hue}{(array({\coati@hsbcolorspec},0))}
+ \pgfmathsetmacro{\coati@sat}{(array({\coati@hsbcolorspec},1)+0.1)}
+ \pgfmathsetmacro{\coati@bright}{(array({\coati@hsbcolorspec},2))+0.13}
+ \definecolor{coati@bodybright}{hsb}{\coati@hue,\coati@sat,\coati@bright}
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname coatihookbackground\endcsname
\csname tikzlinghookbackground\endcsname
- %
+ %
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \coati@part@draw[\coati@body!80!white] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
- \coati@part@draw[\coati@body!80!white] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \ifcoati@leftstep
+ \coati@part@draw[coati@bodybright!80!white] (-0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \else% step
+ \coati@part@draw[coati@bodybright!80!white] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \fi% step
+ \ifcoati@rightstep
+ \coati@part@draw[coati@bodybright!80!white] (0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \else% step
+ \coati@part@draw[coati@bodybright!80!white] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \fi% step
%
% Tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifcoati@back
- \coati@part@draw[\coati@body!50!darkgray] (0.2845, 0.5595) .. controls (0.6382, 0.8326) and (0.7302, 1.5138) .. (1.0504, 1.6639) .. controls (1.3206, 1.7840) and (1.7609, 1.3537) .. (1.5608, 1.3437) .. controls (0.9203, 2.0442) and (0.8642, 0.6247) .. (0.5001, 0.3831) .. controls (0.3214, 0.2645) and (-0.1764, 0.1117) .. (-0.1408, 0.3245) .. controls (-0.1082, 0.5191) and (0.0508, 0.3791) .. (0.2845, 0.5595) -- cycle;
- \begin{scope}
- \clip (0.2845, 0.5595) .. controls (0.6382, 0.8326) and (0.7302, 1.5138) .. (1.0504, 1.6639) .. controls (1.3206, 1.7840) and (1.7609, 1.3537) .. (1.5608, 1.3437) .. controls (0.9203, 2.0442) and (0.8642, 0.6247) .. (0.5001, 0.3831) .. controls (0.3214, 0.2645) and (-0.1764, 0.1117) .. (-0.1408, 0.3245) .. controls (-0.1082, 0.5191) and (0.0508, 0.3791) .. (0.2845, 0.5595) -- cycle;
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-30:(0.8,1.15)}] (0.6,1.1) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-30:(0.9,1.35)}] (0.7,1.3) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-50:(1.0,1.5)}] (0.8,1.45) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-80:(1.2,1.6)}] (1.0,1.55) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-130:(1.5,1.5)}] (1.3,1.45) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-30:(0.55,0.65)}] (0.35,0.6) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-30:(0.65,0.9)}] (0.45,0.85) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-40:(0.35,0.45)}] (0.15,0.4) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-60:(0.05,0.3)}] (-0.15,0.25) rectangle ++(0.4,0.1);
- \end{scope}
+ \coati@part@draw[\coati@body] (0.2845, 0.5595) .. controls (0.6382, 0.8326) and (0.7302, 1.5138) .. (1.0504, 1.6639) .. controls (1.3206, 1.7840) and (1.7609, 1.3537) .. (1.5608, 1.3437) .. controls (0.9203, 2.0442) and (0.8642, 0.6247) .. (0.5001, 0.3831) .. controls (0.3214, 0.2645) and (-0.1764, 0.1117) .. (-0.1408, 0.3245) .. controls (-0.1082, 0.5191) and (0.0508, 0.3791) .. (0.2845, 0.5595) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (1.48, 1.554) -- (1.4139, 1.4752).. controls (1.4389, 1.4583) and (1.4649, 1.4375) .. (1.492, 1.4127) -- (1.5537, 1.4862).. controls (1.5333, 1.5087) and (1.5084, 1.5318) .. (1.48, 1.554) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (1.2166, 1.6794) -- (1.2121, 1.5329).. controls (1.2432, 1.5385) and (1.2764, 1.5364) .. (1.3119, 1.5258) -- (1.3158, 1.6501).. controls (1.2832, 1.6633) and (1.2498, 1.6736) .. (1.2166, 1.6794) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (1.0093, 1.6405).. controls (0.9821, 1.6229) and (0.9566, 1.6014) .. (0.9325, 1.5765) -- (1.0545, 1.4296).. controls (1.0777, 1.4572) and (1.1021, 1.4801) .. (1.1281, 1.4976) -- (1.0093, 1.6405) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange](0.8327, 1.4466).. controls (0.8154, 1.4193) and (0.7988, 1.3901) .. (0.7823, 1.3602) -- (0.9497, 1.2635).. controls (0.9655, 1.2946) and (0.9818, 1.3236) .. (0.9987, 1.3507) -- (0.8327, 1.4466) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.7253, 1.2508).. controls (0.7107, 1.2213) and (0.6961, 1.1912) .. (0.6814, 1.1607) -- (0.859, 1.0582).. controls (0.8717, 1.0897) and (0.8844, 1.1212) .. (0.8975, 1.1514) -- (0.7253, 1.2508) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.5972, 0.9882).. controls (0.5821, 0.9583) and (0.5665, 0.9288) .. (0.5505, 0.8997) -- (0.7501, 0.7845).. controls (0.7627, 0.8154) and (0.7754, 0.8463) .. (0.7878, 0.8781) -- (0.5972, 0.9882) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.464, 0.7574).. controls (0.4448, 0.7293) and (0.4248, 0.7022) .. (0.4037, 0.6767) -- (0.6357, 0.5427).. controls (0.6519, 0.5703) and (0.6676, 0.5997) .. (0.6828, 0.6311) -- (0.464, 0.7574) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange](0.2881, 0.5624).. controls (0.2869, 0.5615) and (0.2857, 0.5604) .. (0.2845, 0.5595).. controls (0.2564, 0.5378) and (0.2295, 0.521) .. (0.2036, 0.5074) -- (0.3683, 0.3141).. controls (0.4022, 0.3288) and (0.4337, 0.3442) .. (0.461, 0.3595) -- (0.2881, 0.5624) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.0822, 0.4628).. controls (0.0453, 0.4543) and (0.0123, 0.4501) .. (-0.0164, 0.445) -- (0.039, 0.2211).. controls (0.0701, 0.2242) and (0.1034, 0.23) .. (0.1379, 0.2379) -- (0.0822, 0.4628) -- cycle;
\fi% back
%
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \coati@part@draw[\coati@body!80!white] (-0.625,1) ellipse[x radius=0.42, y radius=0.13, rotate=70];
- \coati@part@draw[\coati@body!80!white] (0.625,1) ellipse[x radius=0.42, y radius=0.13, rotate=-70];
+ \coati@part@draw[coati@bodybright!80!white] (-0.625,1) ellipse[x radius=0.42, y radius=0.13, rotate=70];
+ \coati@part@draw[coati@bodybright!80!white] (0.625,1) ellipse[x radius=0.42, y radius=0.13, rotate=-70];
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \coati@part@draw[\coati@body!50!darkgray] (0.595, 0.92) .. controls (0.595, 0.26) and (0.355, 0.18) .. (0, 0.18) .. controls (-0.355, 0.18) and (-0.595, 0.26) .. (-0.595, 0.92) .. controls (-0.605, 1.58) and (-0.335, 2.11) .. (0, 2.11) .. controls (0.335, 2.11) and (0.605, 1.58) .. (0.595, 0.92) -- cycle;
+ \coati@part@draw[\coati@body] (0.595, 0.92) .. controls (0.595, 0.26) and (0.355, 0.18) .. (0, 0.18) .. controls (-0.355, 0.18) and (-0.595, 0.26) .. (-0.595, 0.92) .. controls (-0.605, 1.58) and (-0.335, 2.11) .. (0, 2.11) .. controls (0.335, 2.11) and (0.605, 1.58) .. (0.595, 0.92) -- cycle;
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname coatihookbelly\endcsname
\csname tikzlinghookbelly\endcsname
- %
+ %
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{scope}[rotate around={\coati@rotatehead:(0,1.68)}]
%
% Sidewards head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifcoati@sideward
- %
+ %
% Left Ear %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \coati@part@draw[\coati@body!45!white!95!orange] (-0.212, 2.135) ellipse[x radius=0.09, y radius=0.12, rotate=-16];
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (-0.212, 2.135) ellipse[x radius=0.09, y radius=0.12, rotate=-16];
\unless\ifcoati@back
- \coati@part@draw[\coati@body!80!white] (-0.212, 2.135) ellipse[x radius=0.065, y radius=0.09, rotate=-16];
+ \coati@part@draw[coati@bodybright!80!white] (-0.212, 2.135) ellipse[x radius=0.065, y radius=0.09, rotate=-16];
\fi% back
- %
+ %
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifcoati@back
- \coati@part@draw[\coati@body!45!white!95!orange] (0.4569, 1.5608) .. controls (0.3680, 1.3594) and (0.0005, 1.2699) .. (-0.1826, 1.3507) .. controls (-0.3657, 1.4315) and (-0.5475, 1.7632) .. (-0.4587, 1.9646) .. controls (-0.1103, 2.3578) and (0.5123, 2.0832) .. (0.4569, 1.5608) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.4569, 1.5608) .. controls (0.3680, 1.3594) and (0.0005, 1.2699) .. (-0.1826, 1.3507) .. controls (-0.3657, 1.4315) and (-0.5475, 1.7632) .. (-0.4587, 1.9646) .. controls (-0.1103, 2.3578) and (0.5123, 2.0832) .. (0.4569, 1.5608) -- cycle;
\else% back
- \coati@part@draw[\coati@body!45!white!95!orange] (0.4808, 1.7911) .. controls (0.5682, 1.2837) and (-0.3468, 1.3575) .. (-0.6360, 1.3679) .. controls (-0.7582, 1.4729) and (-0.5198, 1.7911) .. (-0.5198, 1.7911) .. controls (-0.3597, 2.2914) and (0.3207, 2.2914) .. (0.4808, 1.7911) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.4808, 1.7911) .. controls (0.5682, 1.2837) and (-0.3468, 1.3575) .. (-0.6360, 1.3679) .. controls (-0.7582, 1.4729) and (-0.5198, 1.7911) .. (-0.5198, 1.7911) .. controls (-0.3597, 2.2914) and (0.3207, 2.2914) .. (0.4808, 1.7911) -- cycle;
\fi% back
- %
+ %
% Cheek %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifcoati@back
- \coati@part@draw[\coati@body!80!white] (0.30, 1.4552) .. controls (0.30, 1.4552) and (0.1016, 1.7565) .. (-0.0005, 1.7581) -- (-0.6360, 1.3679) .. controls (-0.3083, 1.3437) and (0.0283, 1.332) .. (0.30, 1.4552) -- cycle (-0.4166, 1.9824) .. controls (-0.4166, 1.9824) and (-0.2413, 1.9758) .. (-0.2226, 1.9112) -- (-0.6875, 1.4906) .. controls (-0.6875, 1.4906) and (-0.5712, 1.7549) .. (-0.4166, 1.9824) -- cycle;
+ \coati@part@draw[coati@bodybright!80!white] (0.30, 1.4552) .. controls (0.30, 1.4552) and (0.1016, 1.7565) .. (-0.0005, 1.7581) -- (-0.6360, 1.3679) .. controls (-0.3083, 1.3437) and (0.0283, 1.332) .. (0.30, 1.4552) -- cycle (-0.4166, 1.9824) .. controls (-0.4166, 1.9824) and (-0.2413, 1.9758) .. (-0.2226, 1.9112) -- (-0.6875, 1.4906) .. controls (-0.6875, 1.4906) and (-0.5712, 1.7549) .. (-0.4166, 1.9824) -- cycle;
\fi% back
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifcoati@back
- \coati@part@draw[\coati@body!50!black] (-0.605, 1.453) circle[radius=0.09];
+ \coati@part@draw[coati@bodybright!50!black] (-0.605, 1.453) circle[radius=0.09];
\fi% back
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -180,29 +204,29 @@
\fi% back
%
% Right Ear %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \coati@part@draw[\coati@body!45!white!95!orange] (0.417, 1.875) ellipse[x radius=0.1, y radius=0.14, rotate=-16];
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.417, 1.875) ellipse[x radius=0.1, y radius=0.14, rotate=-16];
\unless\ifcoati@back
- \coati@part@draw[\coati@body!80!white] (0.417, 1.875) ellipse[x radius=0.07, y radius=0.10, rotate=-16];
+ \coati@part@draw[coati@bodybright!80!white] (0.417, 1.875) ellipse[x radius=0.07, y radius=0.10, rotate=-16];
\fi% back
%
% Normal Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\else% sidewards
- %
+ %
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifcoati@back
- \coati@part@draw[\coati@body!45!white!95!orange] (0.5, 1.8) .. controls (0.5, 1.58) and (0.2, 1.35) .. (0, 1.35) .. controls (-0.2, 1.35) and (-0.5, 1.58) .. (-0.5, 1.8) .. controls (-0.34, 2.3) and (0.34, 2.3) .. (0.5, 1.8) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.5, 1.8) .. controls (0.5, 1.58) and (0.2, 1.35) .. (0, 1.35) .. controls (-0.2, 1.35) and (-0.5, 1.58) .. (-0.5, 1.8) .. controls (-0.34, 2.3) and (0.34, 2.3) .. (0.5, 1.8) -- cycle;
\else% back
- \coati@part@draw[\coati@body!45!white!95!orange] (0.5, 1.8) .. controls (0.5, 1.58) and (0.2, 1.25) .. (0, 1.16) .. controls (-0.2, 1.25) and (-0.5, 1.58) .. (-0.5, 1.8) .. controls (-0.34, 2.3) and (0.34, 2.3) .. (0.5, 1.8) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.5, 1.8) .. controls (0.5, 1.58) and (0.2, 1.25) .. (0, 1.16) .. controls (-0.2, 1.25) and (-0.5, 1.58) .. (-0.5, 1.8) .. controls (-0.34, 2.3) and (0.34, 2.3) .. (0.5, 1.8) -- cycle;
\fi% back
%
% Cheeks %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifcoati@back
- \coati@part@draw[\coati@body!80!white] (-0.4935, 1.7443) .. controls (-0.4935, 1.7443) and (-0.1917, 1.7798) .. (-0.1371, 1.7333) .. controls (-0.07, 1.2) and (-0.07, 1.2) .. (-0.07, 1.2) .. controls (-0.259, 1.3169) and (-0.46, 1.5665) .. (-0.4935, 1.7443) -- cycle (0.4935, 1.7443) .. controls (0.4935, 1.7443) and (0.1917, 1.7798) .. (0.1371, 1.7333) .. controls (0.07, 1.2) and (0.07, 1.2) .. (0.07, 1.2) .. controls (0.259, 1.3169) and (0.46, 1.5665) .. (0.4935, 1.7443) -- cycle;
+ \coati@part@draw[coati@bodybright!80!white] (-0.4935, 1.7443) .. controls (-0.4935, 1.7443) and (-0.1917, 1.7798) .. (-0.1371, 1.7333) .. controls (-0.07, 1.2) and (-0.07, 1.2) .. (-0.07, 1.2) .. controls (-0.259, 1.3169) and (-0.46, 1.5665) .. (-0.4935, 1.7443) -- cycle (0.4935, 1.7443) .. controls (0.4935, 1.7443) and (0.1917, 1.7798) .. (0.1371, 1.7333) .. controls (0.07, 1.2) and (0.07, 1.2) .. (0.07, 1.2) .. controls (0.259, 1.3169) and (0.46, 1.5665) .. (0.4935, 1.7443) -- cycle;
\fi% back
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \unless\ifcoati@back
- \coati@part@draw[\coati@body!50!black] (0, 1.248) circle[radius=0.09];
+ \unless\ifcoati@back
+ \coati@part@draw[coati@bodybright!50!black] (0, 1.248) circle[radius=0.09];
\fi% back
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -212,37 +236,34 @@
\fi% back
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \coati@part@draw[\coati@body!45!white!95!orange] (0.44, 2.02) circle[radius=0.12];
- \coati@part@draw[\coati@body!45!white!95!orange] (-0.44, 2.02) circle[radius=0.12];
- \unless\ifcoati@back
- \coati@part@draw[\coati@body!80!white] (0.44, 2.02) circle[radius=0.09];
- \coati@part@draw[\coati@body!80!white] (-0.44, 2.02) circle[radius=0.09];
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.44, 2.02) circle[radius=0.12];
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (-0.44, 2.02) circle[radius=0.12];
+ \unless\ifcoati@back
+ \coati@part@draw[coati@bodybright!80!white] (0.44, 2.02) circle[radius=0.09];
+ \coati@part@draw[coati@bodybright!80!white] (-0.44, 2.02) circle[radius=0.09];
\fi% back
- %
+ %
\fi% sidewards
\end{scope}
%
% Tail if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifcoati@back
- \coati@part@draw[\coati@body!50!darkgray] (0.2845, 0.5595) .. controls (0.6382, 0.8326) and (0.7302, 1.5138) .. (1.0504, 1.6639) .. controls (1.3206, 1.7840) and (1.7609, 1.3537) .. (1.5608, 1.3437) .. controls (0.9203, 2.0442) and (0.8642, 0.6247) .. (0.5001, 0.3831) .. controls (0.3214, 0.2645) and (-0.1764, 0.1117) .. (-0.1408, 0.3245) .. controls (-0.1082, 0.5191) and (0.0508, 0.3791) .. (0.2845, 0.5595) -- cycle;
- \begin{scope}
- \clip (0.2845, 0.5595) .. controls (0.6382, 0.8326) and (0.7302, 1.5138) .. (1.0504, 1.6639) .. controls (1.3206, 1.7840) and (1.7609, 1.3537) .. (1.5608, 1.3437) .. controls (0.9203, 2.0442) and (0.8642, 0.6247) .. (0.5001, 0.3831) .. controls (0.3214, 0.2645) and (-0.1764, 0.1117) .. (-0.1408, 0.3245) .. controls (-0.1082, 0.5191) and (0.0508, 0.3791) .. (0.2845, 0.5595) -- cycle;
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-30:(0.8,1.15)}] (0.6,1.1) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-30:(0.9,1.35)}] (0.7,1.3) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-50:(1.0,1.5)}] (0.8,1.45) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-80:(1.2,1.6)}] (1.0,1.55) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-130:(1.5,1.5)}] (1.3,1.45) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-30:(0.55,0.65)}] (0.35,0.6) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-30:(0.65,0.9)}] (0.45,0.85) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-40:(0.35,0.45)}] (0.15,0.4) rectangle ++(0.4,0.1);
- \coati@part@draw[\coati@body!45!white!95!orange,rotate around={-60:(0.05,0.3)}] (-0.15,0.25) rectangle ++(0.4,0.1);
- \end{scope}
+ \coati@part@draw[\coati@body] (0.2845, 0.5595) .. controls (0.6382, 0.8326) and (0.7302, 1.5138) .. (1.0504, 1.6639) .. controls (1.3206, 1.7840) and (1.7609, 1.3537) .. (1.5608, 1.3437) .. controls (0.9203, 2.0442) and (0.8642, 0.6247) .. (0.5001, 0.3831) .. controls (0.3214, 0.2645) and (-0.1764, 0.1117) .. (-0.1408, 0.3245) .. controls (-0.1082, 0.5191) and (0.0508, 0.3791) .. (0.2845, 0.5595) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (1.48, 1.554) -- (1.4139, 1.4752).. controls (1.4389, 1.4583) and (1.4649, 1.4375) .. (1.492, 1.4127) -- (1.5537, 1.4862).. controls (1.5333, 1.5087) and (1.5084, 1.5318) .. (1.48, 1.554) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (1.2166, 1.6794) -- (1.2121, 1.5329).. controls (1.2432, 1.5385) and (1.2764, 1.5364) .. (1.3119, 1.5258) -- (1.3158, 1.6501).. controls (1.2832, 1.6633) and (1.2498, 1.6736) .. (1.2166, 1.6794) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (1.0093, 1.6405).. controls (0.9821, 1.6229) and (0.9566, 1.6014) .. (0.9325, 1.5765) -- (1.0545, 1.4296).. controls (1.0777, 1.4572) and (1.1021, 1.4801) .. (1.1281, 1.4976) -- (1.0093, 1.6405) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange](0.8327, 1.4466).. controls (0.8154, 1.4193) and (0.7988, 1.3901) .. (0.7823, 1.3602) -- (0.9497, 1.2635).. controls (0.9655, 1.2946) and (0.9818, 1.3236) .. (0.9987, 1.3507) -- (0.8327, 1.4466) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.7253, 1.2508).. controls (0.7107, 1.2213) and (0.6961, 1.1912) .. (0.6814, 1.1607) -- (0.859, 1.0582).. controls (0.8717, 1.0897) and (0.8844, 1.1212) .. (0.8975, 1.1514) -- (0.7253, 1.2508) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.5972, 0.9882).. controls (0.5821, 0.9583) and (0.5665, 0.9288) .. (0.5505, 0.8997) -- (0.7501, 0.7845).. controls (0.7627, 0.8154) and (0.7754, 0.8463) .. (0.7878, 0.8781) -- (0.5972, 0.9882) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.464, 0.7574).. controls (0.4448, 0.7293) and (0.4248, 0.7022) .. (0.4037, 0.6767) -- (0.6357, 0.5427).. controls (0.6519, 0.5703) and (0.6676, 0.5997) .. (0.6828, 0.6311) -- (0.464, 0.7574) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange](0.2881, 0.5624).. controls (0.2869, 0.5615) and (0.2857, 0.5604) .. (0.2845, 0.5595).. controls (0.2564, 0.5378) and (0.2295, 0.521) .. (0.2036, 0.5074) -- (0.3683, 0.3141).. controls (0.4022, 0.3288) and (0.4337, 0.3442) .. (0.461, 0.3595) -- (0.2881, 0.5624) -- cycle;
+ \coati@part@draw[coati@bodybright!45!white!95!orange] (0.0822, 0.4628).. controls (0.0453, 0.4543) and (0.0123, 0.4501) .. (-0.0164, 0.445) -- (0.039, 0.2211).. controls (0.0701, 0.2242) and (0.1034, 0.23) .. (0.1379, 0.2379) -- (0.0822, 0.4628) -- cycle;
\fi% back
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname coatihookbody\endcsname
\csname tikzlinghookbody\endcsname
- %
+ %
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -257,51 +278,57 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-coatis}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-coatis}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic coati}}
%\coati
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic coati can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\coati[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of the eyes can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\coati[eye=red]
%\end{tcblisting}
%
%The head of the coati can be rotated, but please don't overdo this, otherwise his neck might break!
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Rotate head}}
%\coati[rotatehead=-15]
%\end{tcblisting}
%
-%For the head an alternative sidewards facing head is available. It can be combined with the \lstinline|rotatehead| option.
-%\begin{tcblisting}{}
+%For the head an alternative sidewards facing head is available. It can be combined with the \saminline|rotatehead| option.
+%\begin{tcblisting}{title={Sidewards head}}
%\coati[sideward]
%\end{tcblisting}
%
+%And the coati can lift its legs:
+%\begin{tcblisting}{title={Walking}}
+%\coati[leftstep]
+%\coati[rightstep,xshift=2cm]
+%\end{tcblisting}
+%
%To view the coati from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\coati[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the coati 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the coati 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\coati[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\coati[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-doc-settings.sty b/graphics/pgf/contrib/tikzlings/tikzlings-doc-settings.sty
new file mode 100644
index 0000000000..dbe497f34b
--- /dev/null
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-doc-settings.sty
@@ -0,0 +1,159 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Personal helper theme for package documentations
+% Copyright samcarter
+%
+% This file may be distributed and/or modified
+% under the LaTeX Project Public License 1.3c or later
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Usage:
+% ln ~/Life/latex/beamertheme-sam/themesam.sty package-doc-settings.sty
+% \usepackage[
+% themecolor=samdblue
+% ]{\jobname-settings}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Colours
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{xcolor}
+\definecolor{samyellow}{RGB}{246,193,65}
+\definecolor{samorange}{RGB}{241,147,45}% pgfplotsthemebeamer
+\definecolor{samred}{RGB}{191,26,46}% TikZbricks
+\definecolor{sammagenta}{RGB}{170,42,104}% TikZmarmots
+\definecolor{samviolet}{RGB}{136,46,114}% TikZlings
+\definecolor{samlila}{RGB}{101,67,159}% Rainbow beamer theme
+\definecolor{samdblue}{RGB}{0,51,134}% beamer theme
+\definecolor{samlblue}{RGB}{22,89,155}% TikZducks
+\definecolor{samteal}{RGB}{25,143,157}% Tcolorbox beamer theme
+\definecolor{samlgreen}{RGB}{68,170,153}% Jigsaw
+\definecolor{samdgreen}{RGB}{78,178,125}
+\definecolor{samlgray}{RGB}{160,160,185}
+\definecolor{samdgray}{RGB}{60,60,85}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Package options
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{xkeyval}
+\DeclareOptionX{themecolor}[samdblue]{\colorlet{themecolor}{#1}}
+\DeclareOptionX{listingcolor}[samlblue]{\colorlet{listingcolor}{#1}}
+\ExecuteOptionsX{themecolor,listingcolor}
+\ProcessOptionsX
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Packages
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\@ifclassloaded{beamer}{}{%
+ \RequirePackage[english]{babel}
+ \RequirePackage[paper=a4paper,margin=2.9cm]{geometry}
+ \RequirePackage{scrlayer-scrpage}
+ \let\hrulefillx\hrulefill
+ \RequirePackage[bitstream-charter]{mathdesign}
+ \let\hrulefill\hrulefillx
+ \RequirePackage[hang,flushmargin,bottom]{footmisc}
+ \RequirePackage{footnotehyper}
+ \makesavenoteenv{tcolorbox}
+ \RequirePackage[all]{nowidow}
+ \RequirePackage[colorlinks=true,breaklinks=true,allcolors=themecolor,hyperfootnotes=false]{hyperref}
+}
+\RequirePackage[T1]{fontenc}
+\RequirePackage{xspace}
+\RequirePackage{inconsolata}% mono font with bold, but italic is missing
+% \RequirePackage[scale=0.85]{cascadia-code}
+% \AddToHook{cmd/ttfamily/before}{\fontseries{sl}}
+\usepackage{synthslant}% to fake slented comments in inconsolata
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Listings
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage[cachedir=./.minted]{minted}
+
+\AddToHook{env/MintedVerbatim/before}{%
+ % optional arguments
+ \@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor{black}{##1}}}%
+ % macros
+ \@namedef{PYG@tok@k}{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}%
+ % curly brakets
+ \@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}%
+ % comments (italics won't work with the inconsolata font)
+ \@namedef{PYG@tok@c}{\def\PYG@tc##1{\textcolor{gray}{\textsynthslant{##1}}}}%
+}
+
+\usemintedstyle{default}
+\setminted{
+ breaksymbolleft={},
+ tabsize=2,
+ breaklines=true,
+}
+\newminted[samcode]{latex}{}
+\newmintinline[saminline]{latex}{}
+
+% use non-bold and all coloured for inline code in articles
+\ifdefined\insertaspectratio\else
+ \patchcmd{\minted@inputpyg@inline}{\minted@input}{\color{listingcolor}\renewcommand\textcolor[3][]{##3}\renewcommand\bfseries{}\minted@input}{}{}
+\fi
+
+\RequirePackage[most]{tcolorbox}
+\tcbuselibrary{minted}
+\tcbset{%
+ colframe=themecolor,
+ fonttitle=\bfseries,
+ sidebyside,
+ center lower,
+ righthand width=5.7cm,
+ bottom=2pt,
+ top=2pt,
+ left=3pt,
+ right=3pt,
+ sidebyside gap=10pt,
+ lower separated=false,
+ listing engine=minted,
+ minted language=latex,
+ colback=themecolor!10,
+ sharp corners,
+ boxrule=0pt,
+ before title={\strut}
+}
+
+% avoid page breaks right in front of the tcolorbox
+\@ifclassloaded{beamer}{}{
+ \tcbuselibrary{hooks}
+ \tcbset{before pre={\nopagebreak[4]}}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% document settings
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\@ifclassloaded{scrartcl}{%
+ \KOMAoptions{parskip=half}
+ \addtokomafont{sectioning}{\color{themecolor}}
+ \addtokomafont{date}{\normalsize}
+ \addtokomafont{author}{\normalsize}
+ \setlength{\footnotemargin}{0.7em}
+}{}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Custom macros
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\providecommand*{\CTAN}{\textsc{CTAN}\xspace}
+\providecommand*{\TikZ}{Ti\emph{k}Z\xspace}
+\providecommand*{\miktex}{MiK\TeX\xspace}
+\providecommand*{\texlive}{\TeX{}Live\xspace}
+\providecommand*{\tikzbrick}{Ti\emph{k}Zbrick\xspace}
+\providecommand*{\tikzducks}{Ti\emph{k}Zducks\xspace}
+\providecommand*{\tikzlings}{Ti\emph{k}Zlings\xspace}
+\providecommand*{\tikzmarmots}{Ti\emph{k}Zmarmots\xspace}
+\providecommand*{\ConTeXt}{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-doc.pdf b/graphics/pgf/contrib/tikzlings/tikzlings-doc.pdf
index 06e80aa725..8fc71e8e20 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-doc.pdf
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-doc.tex b/graphics/pgf/contrib/tikzlings/tikzlings-doc.tex
index 3740b1be81..e2f9a67f83 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-doc.tex
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-doc.tex
@@ -8,42 +8,39 @@
% https://github.com/samcarter/tikzlings
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\documentclass[parskip=half]{scrartcl}
+% arara: latexmk
+\documentclass{scrartcl}
+
+% meta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\title{The \texorpdfstring{\tikzlings}{tikzlings} package}
+\subtitle{drawing animals and beings in \TikZ}
+\author{%
+ \texorpdfstring{
+ \begin{tikzpicture}
+ \penguin
+ \end{tikzpicture}\\[0.8em]
+ \texttt{samcarter}\\
+ \url{https://github.com/samcarter/tikzlings}\\
+ \url{https://www.ctan.org/pkg/tikzlings}
+ }{samcarter}}
+\date{Version v2.2 \textendash{} 2025/01/05}
+
+\usepackage[
+ themecolor=samviolet
+]{\jobname-settings}
+
+\selectcolormodel{rgb}
+\colorlet{blue}{samlblue}
% packages %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\usepackage[T1]{fontenc}
-\usepackage[utf8]{inputenc}
-\usepackage[english]{babel}
-\usepackage[svgnames]{xcolor}
-\usepackage[bitstream-charter]{mathdesign}
\usepackage{tikzlings}
-\usepackage[most]{tcolorbox}
\usepackage{bearwear}
-\usepackage[paper=a4paper,margin=3cm]{geometry}
-\usepackage{url}
-\usepackage{xspace}
-\usepackage{scrlayer-scrpage}
-\usepackage[hang,flushmargin,bottom]{footmisc}
-\usepackage[%
- colorlinks=true,
- breaklinks=true,
- allcolors=SteelBlue!50!black
-]{hyperref}
\usetikzlibrary{3d}
\usetikzlibrary{tikzlings}
-% macros %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newcommand{\CTAN}{\textsc{CTAN}\xspace}
-\newcommand{\TikZ}{Ti\emph{k}Z\xspace}
-\newcommand{\tikzducks}{Ti\emph{k}Zducks\xspace}
-\newcommand{\tikzmarmots}{Ti\emph{k}Zmarmots\xspace}
-\newcommand{\tikzlings}{Ti\emph{k}Zlings\xspace}
-\newcommand{\miktex}{MiK\TeX\xspace}
-\newcommand{\texlive}{\TeX{}Live\xspace}
-
% including commented lines from the .sty files %%%%%%%%%%%%%%%%%%%%%%
% thanks to Phelype Oleinik https://topanswers.xyz/tex?q=1861#a2092
\ExplSyntaxOn
@@ -107,18 +104,15 @@
\ExplSyntaxOff
% customisation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\addtokomafont{sectioning}{\color{SteelBlue}}
-\addtokomafont{date}{\normalsize}
-\addtokomafont{author}{\normalsize}
-
\deftocheading{toc}{}%
\setcounter{tocdepth}{1}
\newcommand*\gobbleentrynumber[1]{}
\newcommand*\mytocformat[1]{#1}
\newcommand*\mytocpageformat[1]{#1}
+\makeatletter
\RedeclareSectionCommand[
- toclinefill=\TOCLineLeaderFill,
+ toclinefill=\hyper@linkstart{link}{\Hy@tocdestname}\TOCLineLeaderFill\hyper@linkend,
tocnumwidth=0pt,
tocentrynumberformat=\gobbleentrynumber,
tocentryformat=\mytocformat,
@@ -126,7 +120,6 @@
tocbeforeskip=0.8ex plus 1pt minus 1pt
]{section}
-\makeatletter
\renewcommand{\sectionlinesformat}[4]{%
\Ifstr{#1}{section}{%
\parbox[t]{\linewidth}{%
@@ -134,98 +127,33 @@
\kern-.75\ht\strutbox\rule{\linewidth}{.8pt}%
}%
}{%
- \@hangfrom{\hskip #2#3}{#4}}%
+ \@hangfrom{\hskip #2#3}{#4}}%
}
\makeatother
\renewcommand*{\subsectionformat}{}
\renewcommand*{\sectionformat}{}
-\setlength{\footnotemargin}{0.7em}
-
-\colorlet{blue}{SteelBlue}
-
-\lstdefinestyle{duckstyle}{%
- language={[latex]TeX},
- tabsize=2,
- breaklines,
- basicstyle=\ttfamily,
- commentstyle={\color{green!50!black}\slshape},
- columns=fullflexible,
- alsodigit={-},
- alsoletter={3},
- emphstyle=\color{red!60!black},
- emph=[1]{
- % package names
- tikzlings, tikzlings-marmots, tikzlings-bears, tikzlings-coatis, tikzlings-koalas, tikzlings-marmots, tikzlings-owls, tikzlings-penguins, tikzlings-snowmen, tikzlings-mice, tikzlings-moles, tikzlings-sloths, tikzlings-pigs, tikzlings-cats, tikzlings-hippos, tikzlings-rhinos, tikzlings-pandas, tikzlings-bees, tikzlings-anteaters, tikzlings-squirrels, tikzlings-sheep, tikzlings-chickens, tikzlings-elephants, tikzlings-bugs, tikzlings-bats, tikzlings-wolves,
- % tikzlings options
- body, 3D, rotatehead, sideward, blush, sleeping, whiskers, teeth, shadow, askphil, leftstep, rightstep, eye, nose, pupil, bill, feet, belly, ask, phil, mouth, rotatearms, paws, back, pupilwidth, globalwarming, wings, antennas, stripes, arms, ears, tail, eyelid, hands, muzzle, schroedinger, toes, monocle, contour, comb, baby,
- % acessoires
- buttons, hat, tophat, beret, strawhat, ribbon, harlequin, niuqelrah, witch, magichat, magicstars, crown, queencrown, kingcrown, santa, chef, graduate, tassel, alien, book, bookcolour, signpost, signcolour, signback, speech, think, bubblecolour, pizza, cheese, baguette, cake, icecream, flavoura, flavourb, flavourc, milkshake, wine, cricket, hockey, football, crystalball, magicwand, rollingpin, lightsaber, torch, basket, easter, egga, eggb, eggc, crozier, shovel, pickaxe, umbrella, umbrellaclosed, handbag, cocktail, strawbroom, strawbroomstick, strawbroomribbon, broom, broomstick,
- % tikz options
- scale, yshift, xshift, rotate,
- % other
- figchild, standalone, document,
- },
- texcsstyle=*\color{SteelBlue!50!black}\bfseries,
- keywordstyle=\color{red!60!black}\bfseries,
- morekeywords={tikzpicture},
- moretexcs={
- % latex keywords
- usepackage, usetikzlibrary,
- % tikzlings names
- marmot, coati, bear, koala, owl, penguin, thing, tikzling, snowman, mouse, moles, sloth, pig, cat, hippo, rhino, panda, bee, anteater, squirrel, bearwear, sheep, chicken, elephant, bug, bat, wolf,
- % other
- tikzlinghookbackground, tikzlinghookbelly, tikzlinghookbody, tikzlinghookforeground, mousehookbelly
- },
- delim ={[s][\ttfamily\color{green!50!black}]{$}{$}},
- moredelim=[is][\footnotesize\ttfamily\color{orange!70!black}]{|}{|},
- index=[1][emph]
+\pgfmathsetseed{2}
+\setlength{\footheight}{50pt}
+
+\cfoot{\thepage}
+\cfoot{%
+ \begin{tikzpicture}[scale=0.5]
+ \tikzling[signpost={\thepage}]
+ \end{tikzpicture}
}
+\pagestyle{scrheadings}
\tcbset{%
- colframe=SteelBlue!50!black,
- arc=0mm,
- fonttitle=\bfseries,
- sidebyside,
- listing options={style=duckstyle},
- center lower,
- righthand width=6.5cm,
- bottom=0pt,
- top=0pt,
tikz lower,
height plus=3cm,
- colback=SteelBlue!30!white
}
-\lstset{style=duckstyle}
-
-\pgfmathsetseed{2}
-\setlength{\footheight}{50pt}
-
-\cfoot{\thepage}
-\pagestyle{scrheadings}
-
\newcommand{\coatihookbackground}{\path (-1.63,0.1) rectangle (1.63,2.26);}
\newcommand{\mousehookbackground}{\path (-1.6,0.1) rectangle (0.905, 2.17);}
\newcommand{\cathookbackground}{\path (-1.6,0.1) rectangle (0.905, 2.17);}
-\cfoot{%
- \begin{tikzpicture}[scale=0.5]
- \tikzling[signpost={\thepage}]
- \end{tikzpicture}
-}
-
-% meta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\title{The \texorpdfstring{\tikzlings}{tikzlings} package}
-\subtitle{drawing animals and beings in \TikZ}
-\author{%
- \texorpdfstring{\texttt{samcarter}\\[0.8em]
- \url{https://github.com/samcarter/tikzlings}\\
- \url{https://www.ctan.org/pkg/tikzlings}
- }{samcarter}}
-\date{Version v1.0 \textendash{} 2022/06/17}
-
\begin{document}
\maketitle
\thispagestyle{scrheadings}
@@ -233,12 +161,12 @@
\section*{Introduction}
\label{intro}
-The \tikzlings are a collection of little animals (and beings) drawn in \TikZ. It is the next evolutionary phase of the \tikzmarmots package extending it with further animals (and beings) and also adding the ability to natively use many of the accessories known from the \tikzducks package.
+The \tikzlings are a collection of little animals (and beings) drawn in \TikZ. It is the next evolutionary phase of the \tikzmarmots package extending it with further animals (and beings) and also adding the ability to natively use many of the accessories known from the \tikzducks package.
-This package is work in progress, therefore I would be happy to hear your feedback and ideas how to improve the package.
-The head version of the source code can be found on \url{github.com/samcarter/tikzlings}, including a bug tracker -- please make constructive use of it!
+This package is work in progress, therefore I would be happy to hear your feedback and ideas how to improve the package.
+The head version of the source code can be found on \url{github.com/samcarter/tikzlings}, including a bug tracker -- please make constructive use of it!
If you seek any other assistance (not bug reports/feature requests), I suggest asking a question at \url{topanswers.xyz/tex}.
-A more stable package version can be found on \CTAN (\url{https://www.ctan.org/pkg/tikzlings}) and is included in both \miktex and \texlive as \tikzlings.
+A more stable package version can be found on \CTAN (\url{https://www.ctan.org/pkg/tikzlings}) and is included in both \miktex and \texlive as \tikzlings.
\subsection*{Acknowledgements}
@@ -247,41 +175,44 @@ I'd like to thank the friendly and helpful community of \TeX{} users for their s
\subsection*{License}
Copyright \raisebox{0.2em}{\tiny\fontfamily{cmr}\selectfont\textcopyright}
-\texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the LaTeX project public licence, version 1.3c or later \url{http://www.latex-project.org/lppl.txt}.
+\texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the LaTeX project public licence, version 1.3c or later \url{https://www.latex-project.org/lppl.txt}.
\clearpage
\section*{The \tikzlings}
-The \tikzlings package is a collection of packages. It can either be loaded as a whole with \lstinline|\usepackage{tikzlings}| or the subpackages containing the individual animals (and beings) can be used separately, e.g.\ by loading \lstinline|\usepackage{tikzlings-marmots}|.
+The \tikzlings package is a collection of packages. It can either be loaded as a whole with \saminline|\usepackage{tikzlings}| or the subpackages containing the individual animals (and beings) can be used separately, e.g.\ by loading \saminline|\usepackage{tikzlings-marmots}|.
-The basic usage is the same for all animals (and beings). Inside a \lstinline|tikzpicture|, the \tikzlings can be added via \color{SteelBlue!50!black}\lstinline|\<name_of_the_tikzling>|\color{black}. For example
+The basic usage is the same for all animals (and beings). Inside a \saminline|tikzpicture|, the \tikzlings can be added via \saminline|\<name_of_the_tikzling>|. For example
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Basic Ti\emph{k}Zling}}
\marmot
\end{tcblisting}
-will produce a marmot. All usual \TikZ and \lstinline|pgf| keys can be passed as optional argument to change the appearance. For example scaling and rotating the \tikzlings can be done by
+will produce a marmot. All usual \TikZ and \saminline|pgf| keys can be passed as optional argument to change the appearance. For example scaling and rotating the \tikzlings can be done by
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Ti\emph{k}Zling with options}}
\penguin[rotate=30,scale=0.5]
\end{tcblisting}
-In addition to the standard options provided by \TikZ each \tikzlings also comes with some additional options which are listed in the following sections. If these additional options consist of multiple words they are available both with and without spaces, for example \lstinline|askphil| and \lstinline|ask phil| will be treated as the same.
+In addition to the standard options provided by \TikZ each \tikzlings also comes with some additional options which are listed in the following sections. If these additional options consist of multiple words they are available both with and without spaces, for example \saminline|askphil| and \saminline|ask phil| will be treated as the same.
To make customisation of the \tikzlings easier, some hooks are provided, which can be redefined by the user in order to add commands at specific layers:
\begin{itemize}
- \color{SteelBlue!50!black}
- \item \lstinline|\<name_of_the_tikzling>hookbackground|
- \item \lstinline|\<name_of_the_tikzling>hookbelly|
- \item \lstinline|\<name_of_the_tikzling>hookbody|
- \item \lstinline|\<name_of_the_tikzling>hookforeground|
+ \item \saminline|\<name_of_the_tikzling>hookbackground|
+ \item \saminline|\<name_of_the_tikzling>hookbelly|
+ \item \saminline|\<name_of_the_tikzling>hookbody|
+ \item \saminline|\<name_of_the_tikzling>hookforeground|
\end{itemize}
With regard to the individual components of the \tikzlings, they are located in the following z order:
-\begin{center}
-\begin{tikzpicture}[scale=1.05]
- \newcommand{\planes}{\fill[SteelBlue!30!white,opacity=0.9] (-1.9,-0.1) rectangle (1.9,2.4);}
- \newcommand{\hooks}{\draw[SteelBlue!50!black, rounded corners=3pt, line width=1pt] (-1.9,-0.1) rectangle (1.9,2.4);}
+
+\begingroup
+ \centering
+ \begin{tikzpicture}[scale=0.95]
+ \newcommand{\planewidth}{2.6}
+ \newcommand{\planeheight}{3.4}
+ \newcommand{\planes}{\fill[gray!20!white,opacity=0.9] (-\planewidth,-0.1) rectangle (\planewidth,\planeheight);}
+ \newcommand{\hooks}{\draw[themecolor, rounded corners=3pt, line width=1pt] (-\planewidth,-0.1) rectangle (\planewidth,\planeheight);}
\newcounter{layer}
\setcounter{layer}{0}
\begin{scope}[canvas is zy plane at x=\thelayer*1.8]
@@ -308,7 +239,7 @@ With regard to the individual components of the \tikzlings, they are located in
\newcommand{\rhinohookbackground}{
\pgfsetfillopacity{0}
\pgfsetstrokeopacity{0}
- }
+ }
\newcommand{\rhinohookbelly}{
\pgfsetfillopacity{1}
\pgfsetstrokeopacity{1}
@@ -331,24 +262,24 @@ With regard to the individual components of the \tikzlings, they are located in
\node[font=\footnotesize\ttfamily,rotate=45] at (0,0.1) {foreground};
\end{scope}
\end{tikzpicture}
-\end{center}
+ \par
+\endgroup
-{\raggedright In addition, the hooks \lstinline|\tikzlinghookbackground|, \lstinline|\tikzlinghookbelly|,\newline \lstinline|\tikzlinghookbody| and \lstinline|\tikzlinghookforeground| are available and will effect all\newline \tikzlings.}
+{\raggedright In addition, the hooks \saminline|\tikzlinghookbackground|, \saminline|\tikzlinghookbelly|,\newline \saminline|\tikzlinghookbody| and \saminline|\tikzlinghookforeground| are available and will effect all\newline \tikzlings.}
A short example how the hooks can be used:
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Hooks}}
\newcommand{\mousehookbelly}{%
-\fill[red!80!black]
-(0.55, 1.35) -- (0.65, 0.3) --
-(-0.65, 0.3) -- (-0.55, 1.35)
--- (0.0, 0.9) -- cycle;
+ \fill[red!80!black] (0.55, 1.35) --
+ (0.65, 0.3) -- (-0.65, 0.3) --
+ (-0.55, 1.35) -- (0.0, 0.9) -- cycle;
}
\mouse
\end{tcblisting}
-Another way to use the \tikzlings is the \TikZ library of the same name. By loading this library, all macros from the normal package can be used. In addition the \TikZ library also defines the \tikzlings as \lstinline|pic|'s:
-\begin{tcolorbox}
-\begin{lstlisting}[morekeywords={bear,penguin,coati,thing,cat,duck,standalone,tikz,document}]
+Another way to use the \tikzlings is the \TikZ library of the same name. By loading this library, all macros from the normal package can be used. In addition the \TikZ library also defines the \tikzlings as \saminline|pic|'s:
+\begin{tcolorbox}[title={Ti\emph{k}z library and \texttt{\textbackslash pic}}]
+\begin{samcode}
\documentclass{standalone}
\usepackage{tikz}
@@ -357,16 +288,16 @@ Another way to use the \tikzlings is the \TikZ library of the same name. By load
\begin{document}
\begin{tikzpicture}
\path (1,0) pic{bear}
- (2,1) pic[
- coati/body=blue,
- scale=0.5
- ]{coati}
- (3,2) pic[
- thing/hat=red
- ]{penguin};
+ (2,1) pic[
+ coati/body=blue,
+ scale=0.5
+ ]{coati}
+ (3,2) pic[
+ thing/hat=red
+ ]{penguin};
\end{tikzpicture}
-\end{document}
-\end{lstlisting}
+\end{document}
+\end{samcode}
\tcblower
\begin{tikzpicture}
@@ -385,7 +316,7 @@ Another way to use the \tikzlings is the \TikZ library of the same name. By load
\subsection*{List of all \tikzlings:}
\begingroup
- \hypersetup{hidelinks}
+ \hypersetup{hidelinks,linktoc=all}
\tableofcontents
\endgroup
@@ -396,7 +327,7 @@ Another way to use the \tikzlings is the \TikZ library of the same name. By load
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% Random Tikzling
+% Random Tikzling
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\clearpage
@@ -406,47 +337,47 @@ Another way to use the \tikzlings is the \TikZ library of the same name. By load
\subsection{Package name}
-\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
+\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth,title={Package usage}]
\vspace*{0.5cm}
-\lstinline|\usepackage{tikzlings}|
+\saminline|\usepackage{tikzlings}|
\vspace*{0.5cm}
\end{tcolorbox}
\subsection{Basic Usage}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Basic Ti\emph{k}Zling}}
\tikzling
\end{tcblisting}
\subsection{Options}
-Options common for all \tikzlings are supported for the \lstinline|\tikzling|. These are the ability to change the body colour
-\begin{tcblisting}{}
+Options common for all \tikzlings are supported for the \saminline|\tikzling|. These are the ability to change the body colour
+\begin{tcblisting}{title={Body colour}}
\tikzling[body=blue]
\end{tcblisting}
to view the \tikzlings from behind
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Back view}}
\tikzling[back]
\end{tcblisting}
-and the \lstinline|3D| key, which will make the Ti\emph{k}Zlings 3-dimensional:
-\begin{tcblisting}{}
+and the \saminline|3D| key, which will make the Ti\emph{k}Zlings 3-dimensional:
+\begin{tcblisting}{title={3D view}}
\tikzling[3D]
\end{tcblisting}
-And finally the \lstinline|contour| key will only draw the outlines:
-\begin{tcblisting}{}
+And finally the \saminline|contour| key will only draw the outlines:
+\begin{tcblisting}{title={Contours}}
\tikzling[contour=black]
\end{tcblisting}
-If an option of a specific Ti\emph{k}Zling is used (for example \lstinline|sleeping|, which only the koala and sloth can do) this option will only work for these \tikzlings. For all other \tikzlings, the option will be silently ignored.
+If an option of a specific Ti\emph{k}Zling is used (for example \saminline|sleeping|, which only the koala and sloth can do) this option will only work for these \tikzlings. For all other \tikzlings, the option will be silently ignored.
-In addition all usual \TikZ and \lstinline|pgf| keys can be used in the optional argument as well as the accessories presented in the following section.
+In addition all usual \TikZ and \saminline|pgf| keys can be used in the optional argument as well as the accessories presented in the following section.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% Accessories
+% Accessories
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\clearpage
@@ -454,125 +385,143 @@ In addition all usual \TikZ and \lstinline|pgf| keys can be used in the optional
To customise the \tikzlings the package provides a number of accessories which can be added to all the \tikzlings simply by adding the respective keyword as optional argument:
-\begin{tcblisting}{}
-\bear[hat]
+\begin{tcblisting}{title={Basic usage}}
+\bear[
+ hat
+]
\end{tcblisting}
-
+
For most of these items, the colour can be customised:
-\begin{tcblisting}{}
-\koala[crown=orange!50!yellow]
+\begin{tcblisting}{title={Customisation}}
+\koala[
+ crown=orange!50!yellow
+]
\end{tcblisting}
-Unfortunately it is very difficult to create accessories that will fit all the different shapes of the \tikzlings. Therefore it is also possible to add them separately as optional argument of the \lstinline|\thing| macro, which allows more control of their size and placement:
+Unfortunately it is very difficult to create accessories that will fit all the different shapes of the \tikzlings. Therefore it is also possible to add them separately as optional argument of the \saminline|\thing| macro, which allows more control of their size and placement:
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Further customisation}}
\owl
-\thing[tophat,scale=1.5,yshift=-0.6cm,xshift=-0.05cm]
+\thing[
+ tophat,
+ scale=1.5,
+ yshift=-0.6cm,
+ xshift=-0.05cm
+]
\end{tcblisting}
A list of all available accessories is given below. For completeness the default colours for each key are shown, but actually it is unnecessary unless it should be changed. In case more than one key is shown, all but the first are optional.
\subsection{Hats}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Hat}}
\penguin[
hat=blue!40!black
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Top hat}}
\snowman[
tophat=black!90!white
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Beret}}
\mouse[
beret=black
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Strawhat}}
\anteater[
strawhat=blue,
ribbon=black
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Harlequin hat}}
\coati[
harlequin=blue,
niuqelrah=red
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Witch hat}}
\cat[
witch=gray
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Magic hat}}
\bear[
magichat=violet,
magicstars=yellow!80!brown
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Crown}}
\sheep[
crown=yellow!90!orange
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Queen crown}}
\bat[
queencrown=yellow
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={King crown}}
\marmot[
kingcrown=gray
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Santa hat}}
\mouse[
santa=red!80!black
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Chefs hat}}
\bear[
chef=gray!20!white
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Graduate cap}}
\wolf[
graduate=black,
tassel=red
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Alien antennas}}
\penguin[
alien=green
]
\end{tcblisting}
+\begin{tcblisting}{title={Sombrero}}
+\marmot[
+ sombrero=orange!70!yellow,
+ sombreroa= green!70!blue,
+ sombrerob= red,
+ sombreroc= blue
+]
+\end{tcblisting}
+
\subsection{Communication}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Book}}
\coati[
book={\tiny\TeX},
bookcolour=brown
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Sign post}}
\pig[
signpost={\TeX},
signcolour= brown!50!black,
@@ -580,14 +529,14 @@ A list of all available accessories is given below. For completeness the default
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Speech bubble}}
\bear[
speech={\TeX},
bubblecolour=gray!30!white
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Thinking bubble}}
\penguin[
think={\TeX},
bubblecolour=gray!30!white
@@ -596,31 +545,31 @@ A list of all available accessories is given below. For completeness the default
\subsection{Food}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Pizza}}
\koala[
pizza
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Cheese}}
\mouse[
cheese=yellow!30!orange!60!white
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Baguette}}
\bug[
baguette=brown
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Cake}}
\moles[
cake=violet
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Ice cream}}
\marmot[
icecream=brown!60!gray,
flavoura=brown!50!black,
@@ -629,33 +578,45 @@ A list of all available accessories is given below. For completeness the default
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Milk shake}}
\penguin[
milkshake=red!20!white
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={wine}}
\owl[
wine=red!70!black
]
\end{tcblisting}
+\begin{tcblisting}{title={Cocktail}}
+\bear[
+ cocktail
+]
+\end{tcblisting}
+
+\begin{tcblisting}{title={Banana}}
+\ape[
+ banana=yellow!80!orange
+]
+\end{tcblisting}
+
\subsection{Sports}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Cricket bat}}
\coati[
cricket=brown
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Hockey stick}}
\bug[
hockey=brown
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Football}}
\elephant[
football=white
]
@@ -663,43 +624,43 @@ A list of all available accessories is given below. For completeness the default
\subsection{Other items}
-\begin{tcblisting}{}
-\marmot[
+\begin{tcblisting}{title={Crystal ball}}
+\meerkat[
crystalball=cyan
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Magic wand}}
\bear[
magicwand
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Rolling pin}}
\coati[
rollingpin=brown
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Light sabre}}
\penguin[
lightsaber=green
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Torch}}
\snowman[
torch=gray
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Basket}}
\mouse[
basket=brown!70!gray
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Easter Basket}}
\sloth[
easter=brown!70!gray,
egga=blue,
@@ -708,25 +669,25 @@ A list of all available accessories is given below. For completeness the default
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Crozier}}
\koala[
crozier=brown
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Shovel}}
\snowman[
shovel=gray
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Pick axe}}
\penguin[
pickaxe=gray
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Straw broom}}
\bug[
strawbroom=brown!50!white,
strawbroomstick=brown,
@@ -734,34 +695,49 @@ A list of all available accessories is given below. For completeness the default
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={broom}}
\chicken[
broom=brown,
broomstick=gray!50!black
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Open umbrella}}
\rhino[
umbrella=cyan
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Closed umbrella}}
\marmot[
umbrellaclosed=cyan
]
\end{tcblisting}
-\begin{tcblisting}{}
+\begin{tcblisting}{title={Handbag}}
\mouse[
handbag=red!70!black
]
\end{tcblisting}
-\begin{tcblisting}{}
-\bear[
- cocktail
+\begin{tcblisting}{title={Stick with leaf}}
+\ape[
+ stick=brown!50!black,
+ leaf=green!70!red
+]
+\end{tcblisting}
+
+\subsection{Random accessories}
+
+Given the number of available accessories, it can be hard to decide which ones to use.
+Luckily, one does not need to decide and pick random accessories instead.
+There are two macros for this purpose, \saminline|\randomhead| and \saminline|\randomaccessories|, which will choose a random headpiece and a random other accessories, respectively.
+Please note, that one needs to initialise these macros with \saminline|\shufflethings| to generate the random accessories.
+\begin{tcblisting}{title={Random accessories}}
+\shufflethings
+\coati[
+ \randomhead,
+ \randomaccessories
]
\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-elephants.sty b/graphics/pgf/contrib/tikzlings/tikzlings-elephants.sty
index ffd517febd..d846c1d9d4 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-elephants.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-elephants.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-elephants}[2022/06/17 version v1.0 Draw teddy elephants in TikZ]
+\ProvidesPackage{tikzlings-elephants}[2025/01/05 version v2.2 Draw teddy elephants in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -48,24 +48,34 @@
body/.store in = \elephant@body,
body = gray,
eye/.store in = \elephant@eye,
- eye = \elephant@body!30!black,
+ eye = \elephant@body!30!black,
+ ears/.store in = \elephant@ears,
+ ears = \elephant@body!30!white,
+ feet/.store in = \elephant@feet,
+ feet = \elephant@body!30!white,
+ hands/.store in = \elephant@hands,
+ hands = \elephant@body!30!white,
+ belly/.store in = \elephant@belly,
+ belly = \elephant@body!30!white,
+ tail/.store in = \elephant@tail,
+ tail = \elephant@body!30!white,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \elephant@threeDtrue,
- back/.code = \elephant@backtrue,
+ 3D/.code = \elephant@threeDtrue,
+ back/.code = \elephant@backtrue,
contour/.code = \elephant@contourtrue
\def\elephant@contour{#1},
- contour/.default = black,
- outline/.forward to = /elephant/contour,
+ contour/.default = black,
+ outline/.forward to = /elephant/contour,
}
\def\elephant@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.86, 0.0) rectangle (0.86, 2.17);
@@ -82,7 +92,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -100,7 +110,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -113,16 +123,16 @@
%
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifelephant@back
- \elephant@part@draw[\elephant@body] (0.425, 0.3) circle[radius=0.28];
+ \elephant@part@draw[\elephant@body] (0.425, 0.3) circle[radius=0.28];
\elephant@part@draw[\elephant@body] (-0.425, 0.3) circle[radius=0.28];
\elephant@part@draw[\elephant@body] (0.57,0.74) circle [radius=0.20];
\elephant@part@draw[\elephant@body] (-0.57,0.74) circle [radius=0.20];
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \elephant@part@draw[\elephant@body] (0,0.75) ellipse[x radius=0.55, y radius=0.65];
+ \elephant@part@draw[\elephant@body] (0,0.75) ellipse[x radius=0.55, y radius=0.65];
\unless\ifelephant@back
- \elephant@part@draw[\elephant@body!30!white] (0,0.7) ellipse[x radius=0.35, y radius=0.4];
+ \elephant@part@draw[\elephant@belly] (0,0.7) ellipse[x radius=0.35, y radius=0.4];
\fi% back
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -131,26 +141,26 @@
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifelephant@back
- \elephant@part@draw[\elephant@body] (0.425, 0.3) circle[radius=0.28];
+ \elephant@part@draw[\elephant@body] (0.425, 0.3) circle[radius=0.28];
\elephant@part@draw[\elephant@body] (-0.425, 0.3) circle[radius=0.28];
- \elephant@part@draw[\elephant@body!30!white] (0.425, 0.3) circle[radius=0.17];
- \elephant@part@draw[\elephant@body!30!white] (-0.425, 0.3) circle[radius=0.17];
- \elephant@part@draw[\elephant@body] (0.57,0.75) circle [radius=0.20];
- \elephant@part@draw[\elephant@body!30!white] (0.57,0.74) circle [radius=0.12];
+ \elephant@part@draw[\elephant@feet] (0.425, 0.3) circle[radius=0.17];
+ \elephant@part@draw[\elephant@feet] (-0.425, 0.3) circle[radius=0.17];
+ \elephant@part@draw[\elephant@body] (0.57,0.75) circle [radius=0.20];
+ \elephant@part@draw[\elephant@hands] (0.57,0.74) circle [radius=0.12];
\elephant@part@draw[\elephant@body] (-0.57,0.74) circle [radius=0.20];
- \elephant@part@draw[\elephant@body!30!white] (-0.57,0.74) circle [radius=0.12];
+ \elephant@part@draw[\elephant@hands] (-0.57,0.74) circle [radius=0.12];
\fi% back
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\elephant@part@draw[\elephant@body] (0.5, 1.7) ellipse [x radius=0.35,y radius=0.45];
\elephant@part@draw[\elephant@body] (-0.5, 1.7) ellipse [x radius=0.35,y radius=0.45];
\unless\ifelephant@back
- \elephant@part@draw[\elephant@body!30!white] (0.5, 1.7) ellipse [x radius=0.25,y radius=0.35];
- \elephant@part@draw[\elephant@body!30!white] (-0.5, 1.7) ellipse [x radius=0.25,y radius=0.35];
+ \elephant@part@draw[\elephant@ears] (0.5, 1.7) ellipse [x radius=0.25,y radius=0.35];
+ \elephant@part@draw[\elephant@ears] (-0.5, 1.7) ellipse [x radius=0.25,y radius=0.35];
\fi% back
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \elephant@part@draw[\elephant@body] (0, 1.55) circle[radius=0.5];
+ \elephant@part@draw[\elephant@body] (0, 1.55) circle[radius=0.5];
%
% Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifelephant@back
@@ -165,15 +175,15 @@
\fi% 3D
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \elephant@part@draw[\elephant@eye] (-0.155, 1.7) circle[radius=0.05];
- \elephant@part@draw[\elephant@eye] (0.155, 1.7) circle[radius=0.05];
+ \elephant@part@draw[\elephant@eye] (-0.155, 1.7) circle[radius=0.05];
+ \elephant@part@draw[\elephant@eye] (0.155, 1.7) circle[radius=0.05];
%
\fi% back
%
% Tail if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifelephant@back
- \draw[\elephant@body!30!white,line width=\scalingfactor*0.6pt] (0, 0.5904) .. controls (-0.1619, 0.4147) and (0.203, 0.4157) .. (0.2422, 0.2712);
- \elephant@part@draw[\elephant@body!30!white] (0.2008, 0.1949) .. controls (0.2452, 0.2121) and (0.2799, 0.242) .. (0.2691, 0.2755) .. controls (0.2611, 0.3005) and (0.2127, 0.3115) .. (0.1927, 0.2945) .. controls (0.1674, 0.2729) and (0.2082, 0.2383) .. (0.2008, 0.1949) -- cycle;
+ \draw[\elephant@tail,line width=\scalingfactor*0.6pt] (0, 0.5904) .. controls (-0.1619, 0.4147) and (0.203, 0.4157) .. (0.2422, 0.2712);
+ \elephant@part@draw[\elephant@tail] (0.2008, 0.1949) .. controls (0.2452, 0.2121) and (0.2799, 0.242) .. (0.2691, 0.2755) .. controls (0.2611, 0.3005) and (0.2127, 0.3115) .. (0.1927, 0.2945) .. controls (0.1674, 0.2729) and (0.2082, 0.2383) .. (0.2008, 0.1949) -- cycle;
\fi% back
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -194,41 +204,56 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-elephants}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-elephants}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic elephant}}
%\elephant
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic elephant can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\elephant[body=blue]
%\end{tcblisting}
%
-%In addition to the colour of the body, the colour of the eyes can be adjusted:
-%\begin{tcblisting}{}
+%In addition to the colour of the body, the colour of various body parts can be adjusted:
+%\begin{tcblisting}{title={Ear colour}}
+%\elephant[ears=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Eye colour}}
%\elephant[eye=red]
%\end{tcblisting}
+%\begin{tcblisting}{title={Hand colour}}
+%\elephant[hands=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Belly colour}}
+%\elephant[belly=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Foot colour}}
+%\elephant[feet=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Tail colour}}
+%\elephant[back,tail=red]
+%\end{tcblisting}
%
%To view the elephant from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\elephant[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the elephant 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the elephant 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\elephant[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\elephant[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-hippos.sty b/graphics/pgf/contrib/tikzlings/tikzlings-hippos.sty
index 4761516d53..22f48a85c0 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-hippos.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-hippos.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-hippos}[2022/06/17 version v1.0 Drawing hippos in TikZ]
+\ProvidesPackage{tikzlings-hippos}[2025/01/05 version v2.2 Drawing hippos in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -31,6 +31,7 @@
\newif\ifhippo@threeD
\newif\ifhippo@back
\newif\ifhippo@contour
+\newif\ifhippo@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -46,33 +47,36 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
body/.store in = \hippo@body,
- body = gray,
+ body = gray!55!white,
eye/.store in = \hippo@eye,
- eye = white,
+ eye = white,
pupil/.store in = \hippo@pupil,
- pupil = black,
+ pupil = black,
toes/.store in = \hippo@toes,
- toes = \hippo@body!55!white,
+ toes = \hippo@body,
mouth/.store in = \hippo@mouth,
- mouth = \hippo@body!70!black,
+ mouth = \hippo@body!50!black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \hippo@threeDtrue,
+ openmouth/.code = \hippo@openmouthtrue,
+ open mouth/.forward to = /hippo/openmouth,
+ 3D/.code = \hippo@threeDtrue
+ \def\hippo@mouth{black},
back/.code = \hippo@backtrue,
contour/.code = \hippo@contourtrue
\def\hippo@contour{#1}
\def\hippo@mouth{#1},
- contour/.default = black,
- outline/.forward to = /hippo/contour,
+ contour/.default = black,
+ outline/.forward to = /hippo/contour,
}
\def\hippo@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.625,0.1) rectangle (0.625, 2.17);
@@ -89,7 +93,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -107,46 +111,43 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname hippohookbackground\endcsname
- \csname tikzlinghookbackground\endcsname
+ \csname tikzlinghookbackground\endcsname
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \hippo@part@draw[\hippo@body] (0.23,2.03) ellipse[x radius=0.09, y radius=0.13, rotate=-30];
- \hippo@part@draw[\hippo@body] (-0.23,2.03) ellipse[x radius=0.09, y radius=0.13, rotate=30];
+ \hippo@part@draw[\hippo@body!70!black] (0.23,2.03) ellipse[x radius=0.09, y radius=0.13, rotate=-30];
+ \hippo@part@draw[\hippo@body!70!black] (-0.23,2.03) ellipse[x radius=0.09, y radius=0.13, rotate=30];
%
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifhippo@back
- \begin{scope}
- \clip (-0.5,0.4) rectangle (0.5,0.13);
- \hippo@part@draw[\hippo@body] (-0.25,0.15) ellipse[x radius=0.16, y radius=0.17];
- \hippo@part@draw[\hippo@body] (0.25,0.15) ellipse[x radius=0.16, y radius=0.17];
- \end{scope}
+ \hippo@part@draw[\hippo@body!70!black] (-0.08,0.13) arc [start angle=0, end angle=180, x radius=0.17, y radius=0.19] -- cycle;
+ \hippo@part@draw[\hippo@body!70!black](0.08,0.13) arc [start angle=180, end angle=0, x radius=0.17, y radius=0.19] -- cycle;
\fi% back
%
% Nose if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifhippo@back
- \hippo@part@draw[\hippo@body!80!white] (0, 1.55) ellipse[x radius=0.42, y radius=0.2];
+ \hippo@part@draw[\hippo@body!85!black] (0, 1.55) ellipse[x radius=0.42, y radius=0.2];
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \hippo@part@draw[\hippo@body!55!white] ( 0.6, 0.8 ) .. controls ( 0.6 , 0.4) and ( 0.35, 0.19) .. ( 0.0, 0.19) .. controls (-0.35, 0.19) and (-0.6 , 0.4) .. (-0.6, 0.8 ) .. controls (-0.6 , 1.3) and (-0.35, 1.65) .. ( 0.0, 1.65) .. controls ( 0.35, 1.65) and ( 0.6 , 1.3) .. ( 0.6, 0.8) -- cycle;
+ \hippo@part@draw[\hippo@body] ( 0.6, 0.8 ) .. controls ( 0.6 , 0.4) and ( 0.35, 0.19) .. ( 0.0, 0.19) .. controls (-0.35, 0.19) and (-0.6 , 0.4) .. (-0.6, 0.8 ) .. controls (-0.6 , 1.3) and (-0.35, 1.65) .. ( 0.0, 1.65) .. controls ( 0.35, 1.65) and ( 0.6 , 1.3) .. ( 0.6, 0.8) -- cycle;
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname hippohookbelly\endcsname
\csname tikzlinghookbelly\endcsname
- %
+ %
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifhippo@back
- \hippo@part@draw[\hippo@body] (0.35,1.0) ellipse[x radius=0.24, y radius=0.13, rotate=90];
- \hippo@part@draw[\hippo@body] (-0.35,1.0) ellipse[x radius=0.24, y radius=0.13, rotate=-90];
+ \hippo@part@draw[\hippo@body!70!black] (0.35,1.0) ellipse[x radius=0.24, y radius=0.13, rotate=90];
+ \hippo@part@draw[\hippo@body!70!black] (-0.35,1.0) ellipse[x radius=0.24, y radius=0.13, rotate=-90];
\fi% back
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \hippo@part@draw[\hippo@body!55!white] (0, 1.76) circle[radius=0.36];
+ \hippo@part@draw[\hippo@body] (0, 1.76) circle[radius=0.36];
%
% Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifhippo@back
@@ -165,29 +166,26 @@
\fi% contour
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \hippo@part@draw[\hippo@body!80!white] (0, 1.55) ellipse[x radius=0.42, y radius=0.2];
- \hippo@part@draw[\hippo@body!70!black] (-0.07, 1.63) circle[radius=0.035];
- \hippo@part@draw[\hippo@body!70!black] (0.07, 1.63) circle[radius=0.035];
+ \hippo@part@draw[\hippo@body!85!black] (0, 1.55) ellipse[x radius=0.42, y radius=0.2];
+ \hippo@part@draw[\hippo@mouth] (-0.07, 1.63) circle[radius=0.035];
+ \hippo@part@draw[\hippo@mouth] (0.07, 1.63) circle[radius=0.035];
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \ifhippo@threeD
- \draw[black,line width=\scalingfactor*0.4pt] (0.125, 1.5) arc [start angle=-50, end angle=-130, radius=0.2] ;
- \else% 3D
+ \ifhippo@openmouth
+ \filldraw[\hippo@mouth,line width=\scalingfactor*0.4pt] (0.125, 1.5) arc [start angle=-50, end angle=-130, radius=0.2];
+ \else% open mouth
\draw[\hippo@mouth,line width=\scalingfactor*0.4pt] (0.125, 1.5) arc [start angle=-50, end angle=-130, radius=0.2];
- \fi% 3D
+ \fi% open mouth
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \begin{scope}
- \clip (-0.5,0.4) rectangle (0.5,0.13);
- \hippo@part@draw[\hippo@body] (-0.25,0.15) ellipse[x radius=0.16, y radius=0.17];
- \hippo@part@draw[\hippo@body] (0.25,0.15) ellipse[x radius=0.16, y radius=0.17];
- \hippo@part@draw[\hippo@toes] (0.25,0.13) ellipse[x radius=0.05, y radius=0.1];
- \hippo@part@draw[\hippo@toes] (0.13,0.11) ellipse[x radius=0.05, y radius=0.1];
- \hippo@part@draw[\hippo@toes] (0.37,0.11) ellipse[x radius=0.05, y radius=0.1];
- \hippo@part@draw[\hippo@toes] (-0.25,0.13) ellipse[x radius=0.05, y radius=0.1];
- \hippo@part@draw[\hippo@toes] (-0.13,0.11) ellipse[x radius=0.05, y radius=0.1];
- \hippo@part@draw[\hippo@toes] (-0.37,0.11) ellipse[x radius=0.05, y radius=0.1];
- \end{scope}
+ \hippo@part@draw[\hippo@body!70!black] (-0.08,0.13) arc [start angle=0, end angle=180, x radius=0.17, y radius=0.19] -- cycle;
+ \hippo@part@draw[\hippo@body!70!black](0.08,0.13) arc [start angle=180, end angle=0, x radius=0.17, y radius=0.19] -- cycle;
+ \hippo@part@draw[\hippo@toes] (-0.08,0.13) arc [start angle=0, end angle=180, x radius=0.05, y radius=0.08] -- cycle;
+ \hippo@part@draw[\hippo@toes] (-0.2,0.13) arc [start angle=0, end angle=180, x radius=0.05, y radius=0.1] -- cycle;
+ \hippo@part@draw[\hippo@toes] (-0.32,0.13) arc [start angle=0, end angle=180, x radius=0.05, y radius=0.08] -- cycle;
+ \hippo@part@draw[\hippo@toes] (0.08,0.13) arc [start angle=180, end angle=0, x radius=0.05, y radius=0.08] -- cycle;
+ \hippo@part@draw[\hippo@toes] (0.2,0.13) arc [start angle=180, end angle=0, x radius=0.05, y radius=0.1] -- cycle;
+ \hippo@part@draw[\hippo@toes] (0.32,0.13) arc [start angle=180, end angle=0, x radius=0.05, y radius=0.08] -- cycle;
%
\fi% back
%
@@ -209,52 +207,57 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-hippos}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-hippos}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic hippo}}
%\hippo
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic hippo can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\hippo[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\hippo[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil colour}}
%\hippo[pupil=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\hippo[mouth=red]
%\end{tcblisting}
%
+% The hippo can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\hippo[openmouth]
+%\end{tcblisting}
+%
%The hippo can also do its nails:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Toe colour}}
%\hippo[toes=red]
%\end{tcblisting}
%
%To view the hippo from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\hippo[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the hippo 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the hippo 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\hippo[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\hippo[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-koalas.sty b/graphics/pgf/contrib/tikzlings/tikzlings-koalas.sty
index 4968d7b516..3b3a297517 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-koalas.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-koalas.sty
@@ -9,15 +9,15 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-koalas}[2022/06/17 version v1.0 Drawing koalas in TikZ]
+\ProvidesPackage{tikzlings-koalas}[2025/01/05 version v2.2 Drawing koalas in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
\usetikzlibrary{shadows.blur}
-\usetikzlibrary{fadings}
+\usetikzlibrary{fadings}
\tikzfading[name=koala@blush,inner color=transparent!50,outer color=transparent!100]
@@ -38,6 +38,7 @@
\newif\ifkoala@threeD
\newif\ifkoala@back
\newif\ifkoala@contour
+\newif\ifkoala@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -55,7 +56,7 @@
body/.store in = \koala@body,
body = gray!75!white,
eye/.store in = \koala@eye,
- eye = black,
+ eye = black,
mouth/.store in = \koala@mouth,
mouth = \koala@body!40!black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -65,23 +66,25 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
blush/.code = \koala@blushtrue
\def\koala@blushcolor{#1},
- blush/.default = red,
- sleeping/.code = \koala@sleepingtrue,
+ blush/.default = red,
+ sleeping/.code = \koala@sleepingtrue,
+ openmouth/.code = \koala@openmouthtrue,
+ open mouth/.forward to = /koala/openmouth,
3D/.code = \koala@threeDtrue
- \def\koala@mouth{black},
- back/.code = \koala@backtrue,
+ \def\koala@mouth{black},
+ back/.code = \koala@backtrue,
contour/.code = \koala@contourtrue
\def\koala@contour{#1}
\def\koala@blushcolor{#1}
\def\koala@mouth{#1},
- contour/.default = black,
- outline/.forward to = /koala/contour,
+ contour/.default = black,
+ outline/.forward to = /koala/contour,
}
\def\koala@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.88,0.1) rectangle (0.88, 2.35);
@@ -98,7 +101,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -116,7 +119,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -124,7 +127,7 @@
\csname tikzlinghookbackground\endcsname
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \koala@part@draw[\koala@body!50!black] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \koala@part@draw[\koala@body!50!black] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
\koala@part@draw[\koala@body!50!black] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -173,18 +176,22 @@
\fill[\koala@body!50!black,rotate around={-20:(-0.2925, 1.6925)}] (-0.29, 1.68) rectangle ++(-0.005, 0.03);
\fill[\koala@body!50!black,rotate around={20:(-0.2143, 1.6925)}] (-0.2168, 1.68) rectangle ++(-0.005, 0.03);
\fill[\koala@body!50!black,rotate around={-40:(-0.3255, 1.7025)}] (-0.323, 1.69) rectangle ++(-0.005, 0.03);
- \fill[\koala@body!50!black,rotate around={40:(-0.1813, 1.7025)}] (-0.1838, 1.69) rectangle ++(-0.005, 0.03);
+ \fill[\koala@body!50!black,rotate around={40:(-0.1813, 1.7025)}] (-0.1838, 1.69) rectangle ++(-0.005, 0.03);
\fill[\koala@body!50!black, even odd rule] (0.3331, 1.741) .. controls (0.3331, 1.685) and (0.1737, 1.685) .. (0.1737, 1.741) .. controls (0.1737, 1.848) and (0.3331, 1.848) .. (0.3331, 1.741) -- cycle (0.328, 1.741) .. controls (0.323, 1.705) and (0.184, 1.705) .. (0.179, 1.741) .. controls (0.184, 1.843) and (0.323, 1.843) .. (0.328, 1.741) -- cycle;
\fill[\koala@body!50!black, even odd rule] (-0.3331, 1.741) .. controls (-0.3331, 1.685) and (-0.1737, 1.685) .. (-0.1737, 1.741) .. controls (-0.1737, 1.848) and (-0.3331, 1.848) .. (-0.3331, 1.741) -- cycle (-0.328, 1.741) .. controls (-0.323, 1.705) and (-0.184, 1.705) .. (-0.179, 1.741) .. controls (-0.184, 1.843) and (-0.323, 1.843) .. (-0.328, 1.741) -- cycle;
\else% sleeping
- \koala@part@draw[\koala@eye] (-0.255, 1.74) circle[radius=0.08];
- \koala@part@draw[\koala@eye] (0.255, 1.74) circle[radius=0.08];
- \fill[white] (-0.27, 1.76) circle[radius=0.015];
- \fill[white] (0.24, 1.76) circle[radius=0.015];
+ \koala@part@draw[\koala@eye] (-0.255, 1.74) circle[radius=0.08];
+ \koala@part@draw[\koala@eye] (0.255, 1.74) circle[radius=0.08];
+ \fill[white] (-0.27, 1.76) circle[radius=0.015];
+ \fill[white] (0.24, 1.76) circle[radius=0.015];
\fi% sleeping
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\koala@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.39) arc [start angle=-40, end angle=-140, radius=0.16];
+ \ifkoala@openmouth
+ \filldraw[\koala@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.39) arc [start angle=-40, end angle=-140, radius=0.16];
+ \else
+ \draw[\koala@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.39) arc [start angle=-40, end angle=-140, radius=0.16];
+ \fi
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -194,7 +201,7 @@
%
% Blushed %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifkoala@blush
- \fill[\koala@blushcolor,path fading=koala@blush] (-0.3, 1.52) circle[radius=0.1];
+ \fill[\koala@blushcolor,path fading=koala@blush] (-0.3, 1.52) circle[radius=0.1];
\fill[\koala@blushcolor,path fading=koala@blush] (0.3, 1.52) circle[radius=0.1];
\fi% blush
%
@@ -218,54 +225,59 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-koalas}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-koalas}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic koala}}
%\koala
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic koala can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\koala[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\koala[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\koala[mouth=red]
%\end{tcblisting}
%
+% The koala can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\koala[openmouth]
+%\end{tcblisting}
+%
%It can also blush
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Blushing koala}}
%\koala[blush=red]
%\end{tcblisting}
%
%and if tired, it is going to take a nap:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Sleep}}
%\koala[sleeping]
%\end{tcblisting}
%
%To view the koala from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\koala[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the koala 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the koala 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\koala[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\koala[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-list.sty b/graphics/pgf/contrib/tikzlings/tikzlings-list.sty
index 09a0967f2c..b8cd2cdb38 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-list.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-list.sty
@@ -1,4 +1,4 @@
-\ProvidesPackage{tikzlings-list}[2022/06/17 version v1.0 Helper package for the tikzlings]
+\ProvidesPackage{tikzlings-list}[2025/01/05 version v2.2 Helper package for the tikzlings]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -11,6 +11,7 @@
\clist_const:Nn \c__tikzlings_clist
{
anteater / anteaters,
+ ape / apes,
bat / bats,
bear / bears,
bee / bees,
@@ -22,6 +23,7 @@
hippo / hippos,
koala / koalas,
marmot / marmots,
+ meerkat / meerkats,
mouse / mice,
moles / moles, % avoid conflict with siunitx's \mole
owl / owls,
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-marmots.sty b/graphics/pgf/contrib/tikzlings/tikzlings-marmots.sty
index d67b9fb51d..8a274a550e 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-marmots.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-marmots.sty
@@ -9,15 +9,15 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-marmots}[2022/06/17 version v1.0 Drawing marmots in TikZ]
+\ProvidesPackage{tikzlings-marmots}[2025/01/05 version v2.2 Drawing marmots in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
\usetikzlibrary{shadows.blur}
-\usetikzlibrary{fadings}
+\usetikzlibrary{fadings}
\tikzfading[name=marmot@blush,inner color=transparent!50,outer color=transparent!100]
@@ -28,13 +28,13 @@
\else
\ifdefined\pdfrandomseed % pdflatex
\else
- \ifdefined\randomseed
+ \ifdefined\randomseed
\let\pdfrandomseed\randomseed % post TL19 xelatex and lualatex
\else
\let\pdfrandomseed\time % pre TL19 xelatex
\fi
\fi
- \pgfmathsetseed{\number\pdfrandomseed}
+ \pgfmathsetseed{\number\pdfrandomseed}
\fi
\ExplSyntaxOff
@@ -47,7 +47,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname marmothookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifmarmot@blush
@@ -60,6 +60,7 @@
\newif\ifmarmot@rightstep
\newif\ifmarmot@back
\newif\ifmarmot@contour
+\newif\ifmarmot@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -77,7 +78,7 @@
body/.store in = \marmot@body,
body = brown,
eye/.store in = \marmot@eye,
- eye = \marmot@body!50!black,
+ eye = \marmot@body!50!black,
mouth/.store in = \marmot@mouth,
mouth = \marmot@body!50!black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -87,13 +88,15 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
blush/.code = \marmot@blushtrue
\def\marmot@blushcolor{#1},
- blush/.default = red,
- whiskers/.code = \marmot@whiskerstrue
+ blush/.default = red,
+ whiskers/.code = \marmot@whiskerstrue
\def\marmot@whiskers{#1},
whiskers/.default = gray,
- teeth/.code = \marmot@teethtrue
- \def\marmot@teeth{#1},
+ teeth/.code = \marmot@teethtrue
+ \def\marmot@teeth{#1},
teeth/.default = white,
+ openmouth/.code = \marmot@openmouthtrue,
+ open mouth/.forward to = /marmot/openmouth,
3D/.code = \marmot@threeDtrue,
shadow/.code = \marmot@shadowtrue,
askphil/.code = \marmot@askphiltrue,
@@ -101,20 +104,20 @@
leftstep/.code = \marmot@leftsteptrue,
left step/.forward to = /marmot/leftstep,
rightstep/.code = \marmot@rightsteptrue,
- right step/.forward to = /marmot/rightstep,
- back/.code = \marmot@backtrue,
+ right step/.forward to = /marmot/rightstep,
+ back/.code = \marmot@backtrue,
contour/.code = \marmot@contourtrue
\def\marmot@contour{#1}
\def\marmot@blushcolor{#1}
\def\marmot@mouth{#1},
- contour/.default = black,
- outline/.forward to = /marmot/contour,
+ contour/.default = black,
+ outline/.forward to = /marmot/contour,
}
\def\marmot@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.625,0.1) rectangle (0.905, 2.17);
@@ -131,7 +134,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -171,20 +174,20 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifmarmot@leftstep
- \marmot@part@draw[\marmot@body!50!black] (-0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \marmot@part@draw[\marmot@body!50!black] (-0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
\else% step
- \marmot@part@draw[\marmot@body!50!black] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \marmot@part@draw[\marmot@body!50!black] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
\fi% step
%
\ifmarmot@rightstep
- \marmot@part@draw[\marmot@body!50!black] (0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \marmot@part@draw[\marmot@body!50!black] (0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
\else% step
- \marmot@part@draw[\marmot@body!50!black] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \marmot@part@draw[\marmot@body!50!black] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
\fi% step
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -221,17 +224,21 @@
\marmot@part@draw[\marmot@body!50!black] (-0.385,0.93) ellipse[x radius=0.24, y radius=0.13, rotate=-70];
%
% Muzzle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \marmot@part@draw[\marmot@body!50!white] (0,1.47) ellipse[x radius=0.23, y radius=0.13];
+ \marmot@part@draw[\marmot@body!50!white] (0,1.47) ellipse[x radius=0.23, y radius=0.13];
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\marmot@part@draw[\marmot@body!50!black] (0,1.6) circle[radius=0.08];
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \marmot@part@draw[\marmot@eye] (-0.155,1.77) circle[radius=0.05];
- \marmot@part@draw[\marmot@eye] (0.155,1.77) circle[radius=0.05];
+ \marmot@part@draw[\marmot@eye] (-0.155,1.77) circle[radius=0.05];
+ \marmot@part@draw[\marmot@eye] (0.155,1.77) circle[radius=0.05];
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \fill[\marmot@mouth] (0.145,1.51) arc [start angle=-20, end angle=-160, radius=0.16] -- (-0.14,1.51) -- (-0.14,1.51) arc [start angle=-160, end angle=-20, radius=0.144] -- cycle ;
+ \ifmarmot@openmouth
+ \filldraw[\marmot@mouth, line width=\scalingfactor*0.4pt] (0.145,1.51) arc [start angle=-20, end angle=-160, radius=0.155] (-0.145,1.51) arc [start angle=-120, end angle=-60, radius=0.29];
+ \else
+ \draw[\marmot@mouth, line width=\scalingfactor*0.4pt] (0.145,1.51) arc [start angle=-20, end angle=-160, radius=0.16];
+ \fi
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -241,8 +248,8 @@
%
% Blushed %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifmarmot@blush
- \fill[\marmot@blushcolor,path fading=marmot@blush] (-0.295,1.6) circle[radius=0.1];
- \fill[\marmot@blushcolor,path fading=marmot@blush] (0.295,1.6) circle[radius=0.1];
+ \fill[\marmot@blushcolor,path fading=marmot@blush] (-0.295,1.6) circle[radius=0.1];
+ \fill[\marmot@blushcolor,path fading=marmot@blush] (0.295,1.6) circle[radius=0.1];
\fi% blush
%
% Wiskers %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -259,7 +266,7 @@
\ifmarmot@teeth
\fill[\marmot@body!50!black] (0.048,1.413) rectangle (-0.048,1.373);
\fill[\marmot@teeth] (-0.045,1.407) rectangle (-0.004,1.376);
- \fill[\marmot@teeth] (0.045,1.407) rectangle (0.004,1.376);
+ \fill[\marmot@teeth] (0.045,1.407) rectangle (0.004,1.376);
\fi% teeth
%
\fi% back
@@ -282,75 +289,80 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-marmots}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-marmots}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic marmot}}
%\marmot
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic marmot can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\marmot[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\marmot[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\marmot[mouth=red]
%\end{tcblisting}
%
+% The marmot can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\marmot[openmouth]
+%\end{tcblisting}
+%
%The marmot can also blush
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Blushing marmot}}
%\marmot[blush=red]
%\end{tcblisting}
%
%and whiskers can be added:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Whiskers colour}}
%\marmot[whiskers=gray]
%\end{tcblisting}
%
%Some marmots even show their chisel teeth:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Teeth colour}}
%\marmot[teeth=white]
%\end{tcblisting}
%
%or can cast a shadow:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Shadow}}
%\marmot[shadow]
%\end{tcblisting}
%
-%This ability is important if you want to ask Punxsutawney Phil\footnote{\url{https://en.wikipedia.org/wiki/Punxsutawney_Phil}} on Groundhog Day how the weather is going to be. With a probability derived from the statistics of 120 Groundhog Days\footnote{\hbadness=99999\url{https://www.livescience.com/32974-punxsutawney-phil-weather-prediction-accuracy.html}} the option \lstinline|askphil| might or might not result in a shadow.
-%\begin{tcblisting}{}
+%This ability is important if you want to ask Punxsutawney Phil\footnote{\url{https://en.wikipedia.org/wiki/Punxsutawney_Phil}} on Groundhog Day how the weather is going to be. With a probability derived from the statistics of 120 Groundhog Days\footnote{\hbadness=99999\url{https://www.livescience.com/32974-punxsutawney-phil-weather-prediction-accuracy.html}} the option \saminline|askphil| might or might not result in a shadow.
+%\begin{tcblisting}{title={Ask Phil}}
%\marmot[askphil]
%\end{tcblisting}
%
-%If a good weather prognosis is derived, the happy marmot can dance by lifting up its left and right foot:
-%\begin{tcblisting}{}
+%If a good weather prognosis is derived, the happy marmot can dance by lifting up its left and right foot:
+%\begin{tcblisting}{title={Walking}}
%\marmot[leftstep]
%\marmot[rightstep,xshift=2cm]
%\end{tcblisting}
%
%To view the marmot from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\marmot[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the marmot 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the marmot 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\marmot[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\marmot[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-meerkats.sty b/graphics/pgf/contrib/tikzlings/tikzlings-meerkats.sty
new file mode 100644
index 0000000000..42337105d6
--- /dev/null
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-meerkats.sty
@@ -0,0 +1,340 @@
+ % !TeX root = ./examples/meerkat.tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This package is part of the TikZlings package
+%% A package to bring cute little animals and other beings into tikz
+%% Maintained by samcarter
+%%
+%% Project repository and bug tracker:
+%% https://github.com/samcarter/tikzlings
+%%
+%% Released under the LaTeX Project Public License v1.3c or later
+%% See https://www.latex-project.org/lppl.txt
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ProvidesPackage{tikzlings-meerkats}[2025/01/05 version v2.2 Drawing meerkats in TikZ]
+
+\RequirePackage{tikz}
+\RequirePackage{tikzlings-addons}
+
+\newcommand*{\meerkat}[1][]{%
+ \begin{scope}%
+ \tikzset{/meerkat/.cd,#1}%
+ \meerkat@draw%
+ \end{scope}%
+ \thing[#1]%
+ % adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \csname meerkathookforeground\endcsname
+ \csname tikzlinghookforeground\endcsname
+ %
+}
+
+\newif\ifmeerkat@standing
+\newif\ifmeerkat@threeD
+\newif\ifmeerkat@back
+\newif\ifmeerkat@contour
+\newif\ifmeerkat@openmouth
+
+\def\meerkat@shift{0}
+
+\tikzset{
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % Pass unknown keys on to tikz
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ /meerkat/.search also={/tikz,/pgf,/thing},
+ /meerkat/.cd,
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % body
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ body/.store in = \meerkat@body,
+ body = brown,
+ upperbody/.store in = \meerkat@upperbody,
+ upperbody = \meerkat@body!70!white,
+ upper body/.forward to = /meerkat/upperbody,
+ chest/.store in = \meerkat@chest,
+ chest = \meerkat@body!45!white,
+ legs/.store in = \meerkat@legs,
+ legs = \meerkat@body,
+ tail/.store in = \meerkat@tail,
+ tail = \meerkat@body,
+ tip/.store in = \meerkat@tip,
+ tip = \meerkat@tail!50!black,
+ ears/.store in = \meerkat@ears,
+ ears = \meerkat@body!50!black,
+ eye/.store in = \meerkat@eye,
+ eye = black,
+ eyecircles/.store in = \meerkat@eyecircles,
+ eyecircles = \meerkat@body!75!black,
+ eye circles/.forward to = /meerkat/eyecircles,
+ muzzle/.store in = \meerkat@muzzle,
+ muzzle = \meerkat@body!45!white,
+ nose/.store in = \meerkat@nose,
+ nose = \meerkat@body!50!black,
+ mouth/.store in = \meerkat@mouth,
+ mouth = \meerkat@body!50!black,
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % options
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ openmouth/.code = \meerkat@openmouthtrue,
+ open mouth/.forward to = /meerkat/openmouth,
+ standing/.code = \meerkat@standingtrue
+ \def\meerkat@shift{15},
+ 3D/.code = \meerkat@threeDtrue,
+ back/.code = \meerkat@backtrue,
+ contour/.code = \meerkat@contourtrue
+ \def\meerkat@contour{#1}
+ \def\meerkat@blushcolor{#1}
+ \def\meerkat@mouth{#1},
+ contour/.default = black,
+ outline/.forward to = /meerkat/contour,
+}
+
+\def\meerkat@draw{%
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % minimal bounding box size
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifmeerkat@standing
+ \path (-0.55,0.05) rectangle (0.85, 2.65);
+ \else
+ \path (-0.55,0.05) rectangle (0.85, 2.13);
+ \fi
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % store the current scale factor
+ % from https://github.com/samcarter/tikzlings/issues/3#issuecomment-461373494
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \pgfgettransformentries{\tmpscaleA}{\tmpscaleB}{\tmpscaleC}{\tmpscaleD}{\tmp}{\tmp}%
+ \pgfmathsetmacro{\scalingfactor}{sqrt(abs(\tmpscaleA*\tmpscaleD-\tmpscaleB*\tmpscaleC))*sqrt(abs((\pgf@xx/1cm)*(\pgf@yy/1cm)-(\pgf@xy/1cm)*(\pgf@yx/1cm)))}%
+ \pgfmathsetmacro{\xscalefactor}{\tmpscaleA}
+ \pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % switch between 2D, 3D and contours, from
+ % https://chat.stackexchange.com/transcript/message/45991801#45991801
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifmeerkat@threeD
+ \def\meerkat@part@draw[##1]{\shade[ball color=##1]}
+ \else% 3D
+ \ifmeerkat@contour
+ \def\meerkat@part@draw[##1]{\draw[##1,\meerkat@contour,fill=white,line width=\scalingfactor*0.4pt]}
+ \else% contour
+ \def\meerkat@part@draw[##1]{\fill[##1]}
+ \fi% contour
+ \fi% 3D
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % Body parts
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \csname meerkathookbackground\endcsname
+ \csname tikzlinghookbackground\endcsname
+ %
+ \ifmeerkat@standing
+ %
+ \unless\ifmeerkat@back
+ % Tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@tail] (0.0071, 1.0065).. controls (0.0949, 0.7556) and (0.2077, 0.5139) .. (0.3436, 0.2854).. controls (0.3809, 0.2966) and (0.4183, 0.3078) .. (0.4557, 0.319).. controls (0.3377, 0.5524) and (0.2434, 0.7968) .. (0.174, 1.049);
+ %
+ % Tip of tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@tip] (0.8483, 0.1284).. controls (0.7159, 0.1309) and (0.575, 0.1064) .. (0.4503, 0.163).. controls (0.3999, 0.1871) and (0.3617, 0.2328) .. (0.3436, 0.2854).. controls (0.3809, 0.2966) and (0.4183, 0.3078) .. (0.4557, 0.319).. controls (0.5224, 0.2163) and (0.6411, 0.1646) .. (0.7581, 0.145).. controls (0.7881, 0.1389) and (0.8182, 0.1337) .. (0.8483, 0.1284) -- cycle;
+ \fi %back
+ %
+ % Legs %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@legs] (-0.3454, 1.3191).. controls (-0.3768, 1.128) and (-0.4158, 0.9325) .. (-0.3865, 0.7386).. controls (-0.3749, 0.6541) and (-0.3231, 0.5584) .. (-0.2285, 0.5516).. controls (-0.1819, 0.5615) and (-0.1524, 0.5219) .. (-0.1531, 0.48).. controls (-0.1406, 0.4015) and (-0.126, 0.3232) .. (-0.1147, 0.2446).. controls (-0.1149, 0.1841) and (-0.2292, 0.195) .. (-0.2042, 0.1256).. controls (-0.1635, 0.0562) and (-0.0406, 0.0684) .. (-0.021, 0.15).. controls (0.0009, 0.2391) and (-0.0108, 0.3319) .. (-0.0078, 0.4229).. controls (-0.0101, 0.4797) and (-0.0028, 0.5377) .. (-0.0126, 0.5937).. controls (-0.0473, 0.6539) and (-0.1009, 0.7107) .. (-0.0889, 0.7877).. controls (-0.0857, 0.8768) and (-0.0601, 0.963) .. (-0.0454, 1.0505);
+ \meerkat@part@draw[\meerkat@legs] (0.3522, 1.3191).. controls (0.3836, 1.128) and (0.4226, 0.9325) .. (0.3932, 0.7386).. controls (0.3817, 0.6541) and (0.3299, 0.5584) .. (0.2352, 0.5516).. controls (0.1887, 0.5615) and (0.1592, 0.5219) .. (0.1599, 0.48).. controls (0.1474, 0.4015) and (0.1327, 0.3232) .. (0.1215, 0.2446).. controls (0.1217, 0.1841) and (0.236, 0.195) .. (0.211, 0.1256).. controls (0.1702, 0.0562) and (0.0474, 0.0684) .. (0.0278, 0.15).. controls (0.0058, 0.2391) and (0.0176, 0.3319) .. (0.0146, 0.4229).. controls (0.0168, 0.4797) and (0.0095, 0.5377) .. (0.0194, 0.5937).. controls (0.0541, 0.6539) and (0.1077, 0.7107) .. (0.0956, 0.7877).. controls (0.0924, 0.8768) and (0.0668, 0.963) .. (0.0521, 1.0505);
+ %
+ \ifmeerkat@back
+ % Tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@tail] (0.0071, 1.0065).. controls (0.0949, 0.7556) and (0.2077, 0.5139) .. (0.3436, 0.2854).. controls (0.3809, 0.2966) and (0.4183, 0.3078) .. (0.4557, 0.319).. controls (0.3377, 0.5524) and (0.2434, 0.7968) .. (0.174, 1.049);
+ %
+ % Tip of tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@tip] (0.8483, 0.1284).. controls (0.7159, 0.1309) and (0.575, 0.1064) .. (0.4503, 0.163).. controls (0.3999, 0.1871) and (0.3617, 0.2328) .. (0.3436, 0.2854).. controls (0.3809, 0.2966) and (0.4183, 0.3078) .. (0.4557, 0.319).. controls (0.5224, 0.2163) and (0.6411, 0.1646) .. (0.7581, 0.145).. controls (0.7881, 0.1389) and (0.8182, 0.1337) .. (0.8483, 0.1284) -- cycle;
+ \fi %back
+ \else % sitting meerkat
+ %
+ \unless\ifmeerkat@back
+ % Tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@tail] (-0.0555, 0.5998).. controls (-0.0555, 0.4298) and (0.1812, 0.2011) .. (0.341, 0.143) -- (0.44, 0.253).. controls (0.3106, 0.3001) and (0.0959, 0.4717) .. (0.0959, 0.6094);
+ %
+ % Tip of the tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@tip] (0.836, 0.132).. controls (0.6422, 0.132) and (0.5231, 0.0767) .. (0.341, 0.143) -- (0.44, 0.253).. controls (0.5922, 0.1976) and (0.6765, 0.1601) .. (0.836, 0.132);
+ \fi % back
+ %
+ % Legs %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@legs] (-0.2759, 0.6554).. controls (-0.2927, 0.7506) and (-0.3983, 0.77) .. (-0.4598, 0.77).. controls (-0.4793, 0.77) and (-0.4959, 0.7543) .. (-0.4971, 0.7349).. controls (-0.5094, 0.5297) and (-0.4208, 0.3526) .. (-0.2493, 0.2393).. controls (-0.2331, 0.2287) and (-0.236, 0.2231) .. (-0.2551, 0.22) -- (-0.4553, 0.1878).. controls (-0.4745, 0.1847) and (-0.5016, 0.1767) .. (-0.5153, 0.1629).. controls (-0.5208, 0.1574) and (-0.5208, 0.1081) .. (-0.5153, 0.1026).. controls (-0.5016, 0.0889) and (-0.4747, 0.0794) .. (-0.4553, 0.0796).. controls (-0.0935, 0.0833) and (-0.055, 0.0466) .. (-0.055, 0.1848).. controls (-0.055, 0.2042) and (-0.0521, 0.2354) .. (-0.0485, 0.2545) -- (-0.0187, 0.4185);
+ \meerkat@part@draw[\meerkat@legs] (0.2759, 0.6554).. controls (0.2927, 0.7506) and (0.3983, 0.77) .. (0.4598, 0.77).. controls (0.4793, 0.77) and (0.4959, 0.7543) .. (0.4971, 0.7349).. controls (0.5094, 0.5297) and (0.4208, 0.3526) .. (0.2493, 0.2393).. controls (0.2331, 0.2287) and (0.236, 0.2231) .. (0.2551, 0.22) -- (0.4553, 0.1878).. controls (0.4745, 0.1847) and (0.5016, 0.1767) .. (0.5153, 0.1629).. controls (0.5208, 0.1574) and (0.5208, 0.1081) .. (0.5153, 0.1026).. controls (0.5016, 0.0889) and (0.4747, 0.0794) .. (0.4553, 0.0796).. controls (0.0935, 0.0833) and (0.055, 0.0466) .. (0.055, 0.1848).. controls (0.055, 0.2042) and (0.0521, 0.2354) .. (0.0485, 0.2545) -- (0.0187, 0.4185);
+ %
+ \ifmeerkat@back
+ % Tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@tail] (-0.0555, 0.5998).. controls (-0.0555, 0.4298) and (0.1812, 0.2011) .. (0.341, 0.143) -- (0.44, 0.253).. controls (0.3106, 0.3001) and (0.0959, 0.4717) .. (0.0959, 0.6094);
+ %
+ % Tip of the tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@tip] (0.836, 0.132).. controls (0.6422, 0.132) and (0.5231, 0.0767) .. (0.341, 0.143) -- (0.44, 0.253).. controls (0.5922, 0.1976) and (0.6765, 0.1601) .. (0.836, 0.132);
+ \fi % back
+ %
+ \fi % standling
+ %
+ \begin{scope}[yshift=\meerkat@shift]
+ %
+ % Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@body] (0,0.77) circle [radius=0.35];
+ %
+ % Upper body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifmeerkat@back
+ \meerkat@part@draw[\meerkat@upperbody] (-0.374, 1.32).. controls (-0.3892, 1.1462) and (-0.2287, 0.903) .. (-0.0859, 0.7515).. controls (-0.0594, 0.7213) and (-0.031, 0.691) .. (0.0, 0.66).. controls (0.031, 0.691) and (0.0595, 0.7213) .. (0.0859, 0.7515).. controls (0.2399, 0.9179) and (0.3892, 1.1462) .. (0.374, 1.32).. controls (0.374, 1.4277) and (0.1868, 1.582) .. (0.0, 1.65).. controls (-0.1876, 1.5817) and (-0.374, 1.4271) .. (-0.374, 1.32) -- cycle;
+ \else
+ \meerkat@part@draw[\meerkat@upperbody] (-0.374, 1.32).. controls (-0.3974, 1.0521) and (-0.176, 0.9289) .. (-0.176, 0.66).. controls (-0.176, 0.467) and (-0.077, 0.467) .. (-0.077, 0.66).. controls (-0.077, 0.6924) and (-0.0803, 0.7227) .. (-0.0859, 0.7515).. controls (-0.0594, 0.7213) and (-0.031, 0.691) .. (-0.0, 0.66).. controls (0.031, 0.691) and (0.0595, 0.7213) .. (0.0859, 0.7515).. controls (0.0803, 0.7227) and (0.077, 0.6924) .. (0.077, 0.66).. controls (0.077, 0.467) and (0.176, 0.467) .. (0.176, 0.66).. controls (0.176, 0.9289) and (0.3974, 1.0521) .. (0.374, 1.32).. controls (0.374, 1.4277) and (0.1868, 1.582) .. (-0.0, 1.65).. controls (-0.1876, 1.5817) and (-0.374, 1.4271) .. (-0.374, 1.32) -- cycle;
+ \fi % back
+ %
+ % adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \csname meerkathookbelly\endcsname
+ \csname tikzlinghookbelly\endcsname
+ %
+ % Chest %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \unless\ifmeerkat@back
+ \meerkat@part@draw[\meerkat@chest] (-0.0, 1.54).. controls (-0.1378, 1.54) and (-0.275, 1.4578) .. (-0.275, 1.32).. controls (-0.275, 1.1168) and (-0.1437, 1.0237) .. (-0.0, 0.88).. controls (0.1437, 1.0237) and (0.275, 1.1168) .. (0.275, 1.32).. controls (0.275, 1.4578) and (0.1378, 1.54) .. (-0.0, 1.54) -- cycle;
+ \fi % back
+ %
+ % Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@ears] (-0.35, 1.87) circle [radius=0.11];
+ \meerkat@part@draw[\meerkat@ears] (0.35, 1.87) circle [radius=0.11];
+ %
+ % Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifmeerkat@back
+ \meerkat@part@draw[\meerkat@muzzle] (0,1.7) ellipse [x radius=0.38, y radius=0.21];
+ \meerkat@part@draw[\meerkat@body] (0,1.775) ellipse [x radius=0.34, y radius=0.32];
+ \else
+ \meerkat@part@draw[\meerkat@body] (0,1.85) ellipse [x radius=0.34, y radius=0.25];
+ \meerkat@part@draw[\meerkat@muzzle] (0,1.7) ellipse [x radius=0.38, y radius=0.21];
+ %
+ % Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@nose] (0.0176, 1.6987) -- (0.0437, 1.7439).. controls (0.0534, 1.7607) and (0.0455, 1.7743) .. (0.0261, 1.7743) -- (-0.0261, 1.7743).. controls (-0.0455, 1.7743) and (-0.0534, 1.7607) .. (-0.0437, 1.7439) -- (-0.0176, 1.6987).. controls (-0.0079, 1.6819) and (0.0079, 1.6819) .. (0.0176, 1.6987) -- cycle;
+ %
+ % Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifmeerkat@openmouth
+ \filldraw[\meerkat@mouth,line width=\scalingfactor*0.4pt] (-0.16, 1.727) .. controls (-0.16, 1.727) and (-0.062, 1.62) .. (0, 1.7) .. controls (0.062, 1.62) and (0.16, 1.727) .. (0.16, 1.727) (0.16, 1.727) arc [start angle=-20, end angle=-160, radius=0.17];
+ \else
+ \draw[\meerkat@mouth,line width=\scalingfactor*0.4pt] (-0.16, 1.727) .. controls (-0.16, 1.727) and (-0.062, 1.62) .. (0, 1.7) .. controls (0.062, 1.62) and (0.16, 1.727) .. (0.16, 1.727);
+ \fi
+ %
+ % Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \meerkat@part@draw[\meerkat@eyecircles,rotate=30] (0.75,1.7) ellipse [x radius=0.14, y radius=0.08];
+ \meerkat@part@draw[\meerkat@eyecircles,rotate=-30] (-0.75,1.7) ellipse [x radius=0.14, y radius=0.08];
+ \meerkat@part@draw[\meerkat@eye] (0.18,1.86) circle [radius=0.055];
+ \meerkat@part@draw[\meerkat@eye] (-0.18,1.86) circle [radius=0.055];
+ \meerkat@part@draw[white] (0.165,1.88) circle [radius=0.01];
+ \meerkat@part@draw[white] (-0.195,1.88) circle [radius=0.01];
+ \fi % back
+ %
+ % adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \csname meerkathookbody\endcsname
+ \csname tikzlinghookbody\endcsname
+ %
+ \end{scope}% body shift
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Documentation
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\clearpage
+%\section[Meerkat]{Ambrogio, the meerkat}
+%
+%\emph{The Meerkat was first created by Carla for the Great TikZlings Extravanganza 2022\footnote{\url{https://github.com/TikZlings/Extravaganza2022}}. Ambrogio got his name from the patreon saint of his home town Milan, Saint Ambrogio}
+%
+%\subsection{Package name}
+%
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-meerkats}
+%\end{samcode}
+%\end{tcolorbox}
+%
+%\subsection{Basic Usage}
+%
+%\begin{tcblisting}{title={Basic meerkat}}
+%\meerkat
+%\end{tcblisting}
+%
+%\subsection{Options}
+%
+%The basic meerkat can be modified by changing its colour:
+%\begin{tcblisting}{title={Body colour}}
+%\meerkat[body=blue]
+%\end{tcblisting}
+%
+%In addition to the colour of the body, the colour of various body parts can be adjusted:
+%\begin{tcblisting}{title={Eye colour}}
+%\meerkat[eye=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Eye circle colour}}
+%\meerkat[eyecircles=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Ear colour}}
+%\meerkat[ears=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Muzzle colour}}
+%\meerkat[muzzle=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Nose colour}}
+%\meerkat[nose=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Mouth colour}}
+%\meerkat[mouth=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Upper body colour}}
+%\meerkat[upperbody=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Chest colour}}
+%\meerkat[chest=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Leg colour}}
+%\meerkat[legs=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Tail colour}}
+%\meerkat[tail=red]
+%\end{tcblisting}
+%\begin{tcblisting}{title={Tail tip colour}}
+%\meerkat[tip=red]
+%\end{tcblisting}
+%
+% The meerkat can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\meerkat[openmouth]
+%\end{tcblisting}
+%
+%The meerkat can also stand up
+%\begin{tcblisting}{title={Standing meerkat}}
+%\meerkat[standing]
+%\end{tcblisting}
+%
+%To view the meerkat from behind:
+%\begin{tcblisting}{title={Back view}}
+%\meerkat[back]
+%\end{tcblisting}
+%
+%The key \saminline|3D| will make the meerkat 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
+%\meerkat[3D]
+%\end{tcblisting}
+%
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
+%\meerkat[contour=black]
+%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-mice.sty b/graphics/pgf/contrib/tikzlings/tikzlings-mice.sty
index b864d03fd6..f6bc29e3a1 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-mice.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-mice.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-mice}[2022/06/17 version v1.0 Drawing mice in TikZ]
+\ProvidesPackage{tikzlings-mice}[2025/01/05 version v2.2 Drawing mice in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -26,7 +26,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname mousehookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifmouse@threeD
@@ -52,7 +52,7 @@
body/.store in = \mouse@body,
body = gray!90!white,
eye/.store in = \mouse@eye,
- eye = \mouse@body!50!black,
+ eye = \mouse@body!50!black,
whiskers/.store in = \mouse@whiskers,
whiskers = \mouse@body!50!black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -68,19 +68,19 @@
leftstep/.code = \mouse@leftsteptrue,
left step/.forward to = /mouse/leftstep,
rightstep/.code = \mouse@rightsteptrue,
- right step/.forward to = /mouse/rightstep,
- back/.code = \mouse@backtrue,
+ right step/.forward to = /mouse/rightstep,
+ back/.code = \mouse@backtrue,
contour/.code = \mouse@contourtrue
\def\mouse@contour{#1}
\def\mouse@whiskers{#1},
- contour/.default = black,
- outline/.forward to = /mouse/contour,
+ contour/.default = black,
+ outline/.forward to = /mouse/contour,
}
\def\mouse@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.625,0.1) rectangle (0.905, 2.17);
@@ -97,7 +97,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -115,24 +115,24 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname mousehookbackground\endcsname
\csname tikzlinghookbackground\endcsname
- %
+ %
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifmouse@leftstep
- \mouse@part@draw[\mouse@body!65!white] (-0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \mouse@part@draw[\mouse@body!65!white] (-0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
\else% step
- \mouse@part@draw[\mouse@body!65!white] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \mouse@part@draw[\mouse@body!65!white] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
\fi% step
%
\ifmouse@rightstep
- \mouse@part@draw[\mouse@body!65!white] (0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \mouse@part@draw[\mouse@body!65!white] (0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
\else% step
- \mouse@part@draw[\mouse@body!65!white] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \mouse@part@draw[\mouse@body!65!white] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
\fi% step
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -154,7 +154,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname mousehookbelly\endcsname
\csname tikzlinghookbelly\endcsname
- %
+ %
% Tail if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifmouse@back
\mouse@part@draw[\mouse@body!65!white] (1.0825, 1.6326) .. controls (1.3527, 1.7527) and (1.6609, 1.3164) .. (1.5928, 1.3124) .. controls (0.9164, 2.186) and (0.8338, 0.6325) .. (0.3708, 0.4451) .. controls (0.2529, 0.3974) and (-0.0064, 0.3874) .. (-0.0064, 0.3874) .. controls (-0.0776, 0.3765) and (-0.0862, 0.5026) .. (-0.0092, 0.5034) .. controls (-0.0092, 0.5034) and (0.0363, 0.4591) .. (0.3516, 0.54360) .. controls (0.6710, 0.6988) and (0.7613, 1.4825) .. (1.0825, 1.6326) -- cycle;
@@ -162,11 +162,7 @@
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifmouse@back
- \mouse@part@draw[\mouse@body!65!white]
- (0.5, 1.8) .. controls (0.5, 1.58) and (0.2, 1.35) ..
- (0, 1.35) .. controls (-0.2, 1.35) and (-0.5, 1.58) ..
- (-0.5, 1.8) .. controls (-0.34, 2.3) and (0.34, 2.3) ..
- (0.5, 1.8) -- cycle;
+ \mouse@part@draw[\mouse@body!65!white] (0.5, 1.8) .. controls (0.5, 1.58) and (0.2, 1.35) .. (0, 1.35) .. controls (-0.2, 1.35) and (-0.5, 1.58) .. (-0.5, 1.8) .. controls (-0.34, 2.3) and (0.34, 2.3) .. (0.5, 1.8) -- cycle;
\else% back
\mouse@part@draw[\mouse@body!65!white] (0.5, 1.8) .. controls (0.5, 1.58) and (0.2, 1.25) .. (0, 1.16) .. controls (-0.2, 1.25) and (-0.5, 1.58) .. (-0.5, 1.8) .. controls (-0.34, 2.3) and (0.34, 2.3) .. (0.5, 1.8) -- cycle;
\fi% back
@@ -198,7 +194,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname mousehookbody\endcsname
\csname tikzlinghookbody\endcsname
- %
+ %
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -213,55 +209,55 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-mice}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-mice}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic mouse}}
%\mouse
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic mouse can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\mouse[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\mouse[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Whiskers colour}}
%\mouse[whiskers=red]
%\end{tcblisting}
%
%The rotation angle of its arms can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Rotating the arms}}
%\mouse[rotatearms=40]
%\end{tcblisting}
%
%And the mouse can lift its legs:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Walking}}
%\mouse[leftstep]
%\mouse[rightstep,xshift=2cm]
%\end{tcblisting}
%
%To view the mouse from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\mouse[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the mouse 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the mouse 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\mouse[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\mouse[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-moles.sty b/graphics/pgf/contrib/tikzlings/tikzlings-moles.sty
index a64afa5720..6363a8944c 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-moles.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-moles.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-moles}[2022/06/17 version v1.0 Drawing moles in TikZ]
+\ProvidesPackage{tikzlings-moles}[2025/01/05 version v2.2 Drawing moles in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -26,12 +26,15 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname moleshookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifmoles@threeD
+\newif\ifmoles@leftstep
+\newif\ifmoles@rightstep
\newif\ifmoles@back
\newif\ifmoles@contour
+\newif\ifmoles@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -49,13 +52,13 @@
body/.store in = \moles@body,
body = gray,
eye/.store in = \moles@eye,
- eye = \moles@body!60!black,
+ eye = \moles@body!60!black,
feet/.store in = \moles@feet,
feet = red!20!white!50!brown,
hands/.store in = \moles@hands,
- hands = red!20!white!50!brown,
+ hands = red!20!white!50!brown,
muzzle/.store in = \moles@muzzle,
- muzzle = red!20!white!50!brown,
+ muzzle = red!20!white!50!brown,
mouth/.store in = \moles@mouth,
mouth = \moles@body!60!black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -63,20 +66,26 @@
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \moles@threeDtrue,
- back/.code = \moles@backtrue,
+ openmouth/.code = \moles@openmouthtrue,
+ open mouth/.forward to = /moles/openmouth,
+ 3D/.code = \moles@threeDtrue,
+ leftstep/.code = \moles@leftsteptrue,
+ left step/.forward to = /moles/leftstep,
+ rightstep/.code = \moles@rightsteptrue,
+ right step/.forward to = /moles/rightstep,
+ back/.code = \moles@backtrue,
contour/.code = \moles@contourtrue
\def\moles@contour{#1}
\def\moles@mouth{#1}
\def\moles@eye{#1},
- contour/.default = black,
- outline/.forward to = /moles/contour,
+ contour/.default = black,
+ outline/.forward to = /moles/contour,
}
\def\moles@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.625,0.1) rectangle (0.905, 2.17);
@@ -93,7 +102,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -111,7 +120,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -119,8 +128,16 @@
\csname tikzlinghookbackground\endcsname
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \moles@part@draw[\moles@feet] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
- \moles@part@draw[\moles@feet] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \ifmoles@leftstep
+ \moles@part@draw[\moles@feet] (-0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \else% step
+ \moles@part@draw[\moles@feet] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \fi% step
+ \ifmoles@rightstep
+ \moles@part@draw[\moles@feet] (0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \else% step
+ \moles@part@draw[\moles@feet] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \fi% step
%
% Tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifmoles@back
@@ -173,15 +190,19 @@
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifmoles@threeD
- \fill[\moles@eye] (-0.165,1.79) ellipse[x radius=0.055, y radius=0.015, rotate=-15];
- \fill[\moles@eye!50!black] (0.165,1.79) ellipse[x radius=0.055, y radius=0.015, rotate=15];
+ \fill[\moles@eye] (-0.165,1.79) ellipse[x radius=0.055, y radius=0.015, rotate=-15];
+ \fill[\moles@eye!50!black] (0.165,1.79) ellipse[x radius=0.055, y radius=0.015, rotate=15];
\else% 3D
- \fill[\moles@eye] (-0.165,1.79) ellipse[x radius=0.055, y radius=0.015, rotate=-15];
- \fill[\moles@eye] (0.165,1.79) ellipse[x radius=0.055, y radius=0.015, rotate=15];
+ \fill[\moles@eye] (-0.165,1.79) ellipse[x radius=0.055, y radius=0.015, rotate=-15];
+ \fill[\moles@eye] (0.165,1.79) ellipse[x radius=0.055, y radius=0.015, rotate=15];
\fi% 3D
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\moles@mouth, line width=\scalingfactor*0.4pt] (0.145,1.51) arc [start angle=-20, end angle=-160, radius=0.16] ;
+ \ifmoles@openmouth
+ \filldraw[\moles@mouth, line width=\scalingfactor*0.4pt] (0.145,1.51) arc [start angle=-20, end angle=-160, radius=0.16] ;
+ \else
+ \draw[\moles@mouth, line width=\scalingfactor*0.4pt] (0.145,1.51) arc [start angle=-20, end angle=-160, radius=0.16];
+ \fi
%
\fi% back
%
@@ -203,58 +224,65 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-moles}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-moles}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\textcolor{red!60!black}{\textbf{Attention:} In contrast to the other \tikzlings the macro name is the plural form to avoid conflicts with \lstinline|siunitx| and similar packages.}
-%\begin{tcblisting}{}
+%\textcolor{samred}{\textbf{Attention:} In contrast to the other \tikzlings the macro name is the plural form to avoid conflicts with \saminline|siunitx| and similar packages.}
+%\begin{tcblisting}{title={Basic mole}}
%\moles
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic mole can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\moles[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\moles[eye=red]
%\end{tcblisting}
-%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Muzzle colour}}
%\moles[muzzle=red]
%\end{tcblisting}
-%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Hand colour}}
%\moles[hands=red]
%\end{tcblisting}
-%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Foot colour}}
%\moles[feet=red]
%\end{tcblisting}
-%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\moles[mouth=red]
%\end{tcblisting}
%
+% The mole can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\moles[openmouth]
+%\end{tcblisting}
+%
+%And the mole can lift its legs:
+%\begin{tcblisting}{title={Walking}}
+%\moles[leftstep]
+%\moles[rightstep,xshift=2cm]
+%\end{tcblisting}
+%
%To view the mole from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\moles[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the mole 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the mole 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\moles[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\moles[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-owls.sty b/graphics/pgf/contrib/tikzlings/tikzlings-owls.sty
index cf57616cc8..23b9f0ff8e 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-owls.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-owls.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-owls}[2022/06/17 version v1.0 Draw owls in TikZ]
+\ProvidesPackage{tikzlings-owls}[2025/01/05 version v2.2 Draw owls in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -26,7 +26,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname owlhookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifowl@threeD
@@ -55,24 +55,24 @@
bill/.store in = \owl@bill,
bill = orange,
feet/.store in = \owl@feet,
- feet = orange,
+ feet = orange,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3D/.code = \owl@threeDtrue,
- back/.code = \owl@backtrue,
+ back/.code = \owl@backtrue,
contour/.code = \owl@contourtrue
\def\owl@contour{#1},
- contour/.default = black,
- outline/.forward to = /owl/contour,
+ contour/.default = black,
+ outline/.forward to = /owl/contour,
}
\def\owl@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.73, 0.08) rectangle (0.73, 2.24);
@@ -89,7 +89,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -107,7 +107,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -116,7 +116,7 @@
%
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\owl@part@draw[\owl@body] (0.575,0.8) ellipse[x radius=0.38, y radius=0.1, rotate=-80];
- \owl@part@draw[\owl@body] (-0.575,0.8) ellipse[x radius=0.38, y radius=0.1, rotate=80];
+ \owl@part@draw[\owl@body] (-0.575,0.8) ellipse[x radius=0.38, y radius=0.1, rotate=80];
%
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifowl@back
@@ -194,50 +194,50 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-owls}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-owls}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic owl}}
%\owl
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic owl can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\owl[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\owl[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil colour}}
%\owl[pupil=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Bill colour}}
%\owl[bill=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Foot colour}}
%\owl[feet=red]
%\end{tcblisting}
%
%To view the owl from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\owl[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the owl 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the owl 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\owl[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\owl[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-pandas.sty b/graphics/pgf/contrib/tikzlings/tikzlings-pandas.sty
index f746d880e1..241f76a2a2 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-pandas.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-pandas.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-pandas}[2022/06/17 version v1.0 Drawing pandas in TikZ]
+\ProvidesPackage{tikzlings-pandas}[2025/01/05 version v2.2 Drawing pandas in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -26,12 +26,13 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname pandahookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifpanda@threeD
\newif\ifpanda@back
\newif\ifpanda@contour
+\newif\ifpanda@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -47,31 +48,33 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
body/.store in = \panda@body,
- body = white!90!black,
+ body = white!90!gray,
eye/.store in = \panda@eye,
- eye = white,
+ eye = white,
pupil/.store in = \panda@pupil,
- pupil = black,
+ pupil = black,
mouth/.store in = \panda@mouth,
- mouth = black,
+ mouth = black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \panda@threeDtrue,
- back/.code = \panda@backtrue,
+ openmouth/.code = \panda@openmouthtrue,
+ open mouth/.forward to = /panda/openmouth,
+ 3D/.code = \panda@threeDtrue,
+ back/.code = \panda@backtrue,
contour/.code = \panda@contourtrue
\def\panda@contour{#1}
\def\panda@mouth{#1},
- contour/.default = black,
- outline/.forward to = /panda/contour,
+ contour/.default = black,
+ outline/.forward to = /panda/contour,
}
\def\panda@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.62,0.05) rectangle (0.62, 2.18);
@@ -88,7 +91,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -106,7 +109,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -115,12 +118,12 @@
%
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifpanda@back
- \panda@part@draw[black] (0.32, 0.27) circle[radius=0.2];
+ \panda@part@draw[black] (0.32, 0.27) circle[radius=0.2];
\panda@part@draw[black] (-0.32, 0.27) circle[radius=0.2];
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \panda@part@draw[\panda@body!55!white] (0,0.78) ellipse[x radius=0.57, y radius=0.65];
+ \panda@part@draw[\panda@body] (0,0.78) ellipse[x radius=0.57, y radius=0.65];
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname pandahookbelly\endcsname
@@ -136,7 +139,7 @@
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifpanda@back
- \panda@part@draw[black] (0.32, 0.27) circle[radius=0.2];
+ \panda@part@draw[black] (0.32, 0.27) circle[radius=0.2];
\panda@part@draw[black] (-0.32, 0.27) circle[radius=0.2];
\fi% back
%
@@ -145,7 +148,7 @@
\panda@part@draw[black] (-0.32, 2) circle[radius=0.15];
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \panda@part@draw[\panda@body!55!white] (0.4897, 1.5886) .. controls (0.4614, 1.8238) and (0.25, 2.1172) .. (0, 2.1134) .. controls (-0.25, 2.1172) and (-0.4614, 1.8238) .. (-0.4897, 1.5886) .. controls (-0.5261, 1.3269) and (-0.2748, 1.2377) .. (0, 1.2377) .. controls (0.2748, 1.2377) and (0.5261, 1.3269) .. (0.4897, 1.5886) -- cycle;
+ \panda@part@draw[\panda@body] (0.4897, 1.5886) .. controls (0.4614, 1.8238) and (0.25, 2.1172) .. (0, 2.1134) .. controls (-0.25, 2.1172) and (-0.4614, 1.8238) .. (-0.4897, 1.5886) .. controls (-0.5261, 1.3269) and (-0.2748, 1.2377) .. (0, 1.2377) .. controls (0.2748, 1.2377) and (0.5261, 1.3269) .. (0.4897, 1.5886) -- cycle;
%
% Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifpanda@back
@@ -159,7 +162,11 @@
\panda@part@draw[\panda@pupil] (-0.17, 1.695) circle[radius=0.02];
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\panda@mouth,line width=\scalingfactor*0.2pt] (-0.16, 1.477) .. controls (-0.16, 1.477) and (-0.062, 1.37) .. (0, 1.506) .. controls (0.062, 1.37) and (0.16, 1.477) .. (0.16, 1.477);
+ \ifpanda@openmouth
+ \filldraw[\panda@mouth,line width=\scalingfactor*0.2pt] (-0.16, 1.477) .. controls (-0.16, 1.477) and (-0.062, 1.37) .. (0, 1.506) .. controls (0.062, 1.37) and (0.16, 1.477) .. (0.16, 1.477) (0.16,1.477) arc [start angle=-20, end angle=-160, radius=0.17];
+ \else
+ \draw[\panda@mouth,line width=\scalingfactor*0.2pt] (-0.16, 1.477) .. controls (-0.16, 1.477) and (-0.062, 1.37) .. (0, 1.506) .. controls (0.062, 1.37) and (0.16, 1.477) .. (0.16, 1.477);
+ \fi
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\panda@part@draw[black] (0,1.55) ellipse[x radius=0.07, y radius=0.04];
@@ -184,47 +191,52 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-pandas}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-pandas}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic panda}}
%\panda
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic panda can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\panda[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\panda[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil colour}}
%\panda[pupil=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\panda[mouth=red]
%\end{tcblisting}
%
+% The panda can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\panda[openmouth]
+%\end{tcblisting}
+%
%To view the panda from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\panda[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the panda 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the panda 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\panda[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\panda[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-penguins.sty b/graphics/pgf/contrib/tikzlings/tikzlings-penguins.sty
index 8bceea8a19..93a76e7ab0 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-penguins.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-penguins.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-penguins}[2022/06/17 version v1.0 Draw penguins in TikZ]
+\ProvidesPackage{tikzlings-penguins}[2025/01/05 version v2.2 Draw penguins in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -26,7 +26,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname penguinhookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifpenguin@threeD
@@ -53,28 +53,28 @@
feet/.store in = \penguin@feet,
feet = yellow!50!orange,
bill/.store in = \penguin@bill,
- bill = orange,
+ bill = orange,
eye/.store in = \penguin@eye,
eye = white!95!black,
pupil/.store in = \penguin@pupil,
- pupil = black,
+ pupil = black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \penguin@threeDtrue,
- back/.code = \penguin@backtrue,
+ 3D/.code = \penguin@threeDtrue,
+ back/.code = \penguin@backtrue,
contour/.code = \penguin@contourtrue
\def\penguin@contour{#1},
- contour/.default = black,
- outline/.forward to = /penguin/contour,
+ contour/.default = black,
+ outline/.forward to = /penguin/contour,
}
\def\penguin@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.865, 0.15) rectangle (0.865, 2.13);
@@ -91,7 +91,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -109,7 +109,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -118,14 +118,12 @@
%
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\penguin@part@draw[\penguin@body] (0.575,1.2) ellipse[x radius=0.38, y radius=0.1, rotate=-50];
- \penguin@part@draw[\penguin@body] (-0.575,1.2) ellipse[x radius=0.38, y radius=0.1, rotate=50];
+ \penguin@part@draw[\penguin@body] (-0.575,1.2) ellipse[x radius=0.38, y radius=0.1, rotate=50];
%
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifpenguin@back
- \penguin@part@draw[\penguin@feet]
- (-0.265, 0.3941) .. controls (-0.283, 0.4505) and (-0.373, 0.6014) .. (-0.470, 0.6533) .. controls (-0.571, 0.7075) and (-0.576, 0.6369) .. (-0.554, 0.596) .. controls (-0.526, 0.5416) and (-0.573, 0.5302) .. (-0.602, 0.5384) .. controls (-0.695, 0.5653) and (-0.767, 0.5169) .. (-0.684, 0.434) .. controls (-0.664, 0.4137) and (-0.587, 0.3557) .. (-0.699, 0.3492) .. controls (-0.772, 0.345) and (-0.779, 0.268) .. (-0.689, 0.2445) .. controls (-0.597, 0.2206) and (-0.476, 0.2043) .. (-0.34, 0.2096) .. controls (-0.252, 0.2131) and (-0.237, 0.3059) .. (-0.265, 0.3941) -- cycle;
- \penguin@part@draw[\penguin@feet]
- (0.265, 0.3941) .. controls (0.283, 0.4505) and (0.3725, 0.6014) .. (0.469, 0.6533) .. controls (0.571, 0.7075) and (0.5756, 0.6369) .. (0.554, 0.596) .. controls (0.526, 0.5416) and (0.5733, 0.5302) .. (0.602, 0.5384) .. controls (0.695, 0.5653) and (0.7672, 0.5169) .. (0.684, 0.434) .. controls (0.663, 0.4137) and (0.587, 0.3557) .. (0.699, 0.3492) .. controls (0.772, 0.345) and (0.7789, 0.268) .. (0.689, 0.2445) .. controls (0.597, 0.2206) and (0.4764, 0.2043) .. (0.34, 0.2096) .. controls (0.252, 0.2131) and (0.2368, 0.3059) .. (0.265, 0.3941) -- cycle;
+ \penguin@part@draw[\penguin@feet] (-0.265, 0.3941) .. controls (-0.283, 0.4505) and (-0.373, 0.6014) .. (-0.470, 0.6533) .. controls (-0.571, 0.7075) and (-0.576, 0.6369) .. (-0.554, 0.596) .. controls (-0.526, 0.5416) and (-0.573, 0.5302) .. (-0.602, 0.5384) .. controls (-0.695, 0.5653) and (-0.767, 0.5169) .. (-0.684, 0.434) .. controls (-0.664, 0.4137) and (-0.587, 0.3557) .. (-0.699, 0.3492) .. controls (-0.772, 0.345) and (-0.779, 0.268) .. (-0.689, 0.2445) .. controls (-0.597, 0.2206) and (-0.476, 0.2043) .. (-0.34, 0.2096) .. controls (-0.252, 0.2131) and (-0.237, 0.3059) .. (-0.265, 0.3941) -- cycle;
+ \penguin@part@draw[\penguin@feet] (0.265, 0.3941) .. controls (0.283, 0.4505) and (0.3725, 0.6014) .. (0.469, 0.6533) .. controls (0.571, 0.7075) and (0.5756, 0.6369) .. (0.554, 0.596) .. controls (0.526, 0.5416) and (0.5733, 0.5302) .. (0.602, 0.5384) .. controls (0.695, 0.5653) and (0.7672, 0.5169) .. (0.684, 0.434) .. controls (0.663, 0.4137) and (0.587, 0.3557) .. (0.699, 0.3492) .. controls (0.772, 0.345) and (0.7789, 0.268) .. (0.689, 0.2445) .. controls (0.597, 0.2206) and (0.4764, 0.2043) .. (0.34, 0.2096) .. controls (0.252, 0.2131) and (0.2368, 0.3059) .. (0.265, 0.3941) -- cycle;
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -142,10 +140,8 @@
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifpenguin@back
- \penguin@part@draw[\penguin@feet]
- (-0.265, 0.3941) .. controls (-0.283, 0.4505) and (-0.373, 0.6014) .. (-0.470, 0.6533) .. controls (-0.571, 0.7075) and (-0.576, 0.6369) .. (-0.554, 0.596) .. controls (-0.526, 0.5416) and (-0.573, 0.5302) .. (-0.602, 0.5384) .. controls (-0.695, 0.5653) and (-0.767, 0.5169) .. (-0.684, 0.434) .. controls (-0.664, 0.4137) and (-0.587, 0.3557) .. (-0.699, 0.3492) .. controls (-0.772, 0.345) and (-0.779, 0.268) .. (-0.689, 0.2445) .. controls (-0.597, 0.2206) and (-0.476, 0.2043) .. (-0.34, 0.2096) .. controls (-0.252, 0.2131) and (-0.237, 0.3059) .. (-0.265, 0.3941) -- cycle;
- \penguin@part@draw[\penguin@feet]
- (0.265, 0.3941) .. controls (0.283, 0.4505) and (0.3725, 0.6014) .. (0.469, 0.6533) .. controls (0.571, 0.7075) and (0.5756, 0.6369) .. (0.554, 0.596) .. controls (0.526, 0.5416) and (0.5733, 0.5302) .. (0.602, 0.5384) .. controls (0.695, 0.5653) and (0.7672, 0.5169) .. (0.684, 0.434) .. controls (0.663, 0.4137) and (0.587, 0.3557) .. (0.699, 0.3492) .. controls (0.772, 0.345) and (0.7789, 0.268) .. (0.689, 0.2445) .. controls (0.597, 0.2206) and (0.4764, 0.2043) .. (0.34, 0.2096) .. controls (0.252, 0.2131) and (0.2368, 0.3059) .. (0.265, 0.3941) -- cycle;
+ \penguin@part@draw[\penguin@feet] (-0.265, 0.3941) .. controls (-0.283, 0.4505) and (-0.373, 0.6014) .. (-0.470, 0.6533) .. controls (-0.571, 0.7075) and (-0.576, 0.6369) .. (-0.554, 0.596) .. controls (-0.526, 0.5416) and (-0.573, 0.5302) .. (-0.602, 0.5384) .. controls (-0.695, 0.5653) and (-0.767, 0.5169) .. (-0.684, 0.434) .. controls (-0.664, 0.4137) and (-0.587, 0.3557) .. (-0.699, 0.3492) .. controls (-0.772, 0.345) and (-0.779, 0.268) .. (-0.689, 0.2445) .. controls (-0.597, 0.2206) and (-0.476, 0.2043) .. (-0.34, 0.2096) .. controls (-0.252, 0.2131) and (-0.237, 0.3059) .. (-0.265, 0.3941) -- cycle;
+ \penguin@part@draw[\penguin@feet] (0.265, 0.3941) .. controls (0.283, 0.4505) and (0.3725, 0.6014) .. (0.469, 0.6533) .. controls (0.571, 0.7075) and (0.5756, 0.6369) .. (0.554, 0.596) .. controls (0.526, 0.5416) and (0.5733, 0.5302) .. (0.602, 0.5384) .. controls (0.695, 0.5653) and (0.7672, 0.5169) .. (0.684, 0.434) .. controls (0.663, 0.4137) and (0.587, 0.3557) .. (0.699, 0.3492) .. controls (0.772, 0.345) and (0.7789, 0.268) .. (0.689, 0.2445) .. controls (0.597, 0.2206) and (0.4764, 0.2043) .. (0.34, 0.2096) .. controls (0.252, 0.2131) and (0.2368, 0.3059) .. (0.265, 0.3941) -- cycle;
\fi% back
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -186,53 +182,53 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-penguins}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-penguins}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic penguin}}
%\penguin
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic penguin can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\penguin[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\penguin[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil colour}}
%\penguin[pupil=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Bill colour}}
%\penguin[bill=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Belly colour}}
%\penguin[belly=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Foot colour}}
%\penguin[feet=red]
%\end{tcblisting}
%
%To view the penguin from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\penguin[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the penguin 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the penguin 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\penguin[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\penguin[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-pigs.sty b/graphics/pgf/contrib/tikzlings/tikzlings-pigs.sty
index d551f0a060..13845d8671 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-pigs.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-pigs.sty
@@ -9,14 +9,14 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-pigs}[2022/06/17 version v1.0 Drawing pigs in TikZ]
+\ProvidesPackage{tikzlings-pigs}[2025/01/05 version v2.2 Drawing pigs in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
-\definecolor{pigdark}{RGB}{241,164,142}
+\definecolor{piglight}{RGB}{247,205,193}
\newcommand*{\pig}[1][]{%
\begin{scope}%
@@ -27,12 +27,13 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname pighookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifpig@threeD
\newif\ifpig@back
\newif\ifpig@contour
+\newif\ifpig@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -48,11 +49,11 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
body/.store in = \pig@body,
- body = pigdark,
+ body = piglight,
eye/.store in = \pig@eye,
- eye = gray,
+ eye = gray,
tail/.store in = \pig@tail,
- tail = \pig@body,
+ tail = pig@bodysat22,
mouth/.store in = \pig@mouth,
mouth = gray,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -60,21 +61,23 @@
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ openmouth/.code = \pig@openmouthtrue,
+ open mouth/.forward to = /pig/openmouth,
3D/.code = \pig@threeDtrue
- \def\pig@mouth{gray!70!black},
- back/.code = \pig@backtrue,
+ \def\pig@mouth{gray!70!black},
+ back/.code = \pig@backtrue,
contour/.code = \pig@contourtrue
\def\pig@contour{#1}
\def\pig@mouth{#1}
\def\pig@tail{#1},
- contour/.default = black,
- outline/.forward to = /pig/contour,
+ contour/.default = black,
+ outline/.forward to = /pig/contour,
}
\def\pig@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.625,0.1) rectangle (0.905, 2.27);
@@ -91,7 +94,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -108,8 +111,20 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
+ % generating saturated version of body colour
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \extractcolorspecs{\pig@body}{\pig@model}{\pig@colorspec}
+ \convertcolorspec{\pig@model}{\pig@colorspec}{hsb}{\pig@hsbcolorspec}
+ \pgfmathsetmacro{\pig@hue}{(array({\pig@hsbcolorspec},0))}
+ \pgfmathsetmacro{\pig@sat}{(array({\pig@hsbcolorspec},1)+0.22)}
+ \pgfmathsetmacro{\pig@bright}{(array({\pig@hsbcolorspec},2))}
+ \definecolor{pig@bodysat22}{hsb}{\pig@hue,\pig@sat,\pig@bright}
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -123,12 +138,12 @@
%
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifpig@back
- \pig@part@draw[\pig@body] (0.3216,0.15) arc (-15:195:0.12) -- (0.16,0.15) to [bend left] (0.25,0.15) -- cycle;
- \pig@part@draw[\pig@body] (-0.3216,0.15) arc (195:-15:0.12) -- (-0.16,0.15) to[bend right] (-0.25,0.15) --cycle;
+ \pig@part@draw[pig@bodysat22] (0.3216,0.15) arc (-15:195:0.12) -- (0.16,0.15) to [bend left] (0.25,0.15) -- cycle;
+ \pig@part@draw[pig@bodysat22] (-0.3216,0.15) arc (195:-15:0.12) -- (-0.16,0.15) to[bend right] (-0.25,0.15) --cycle;
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \pig@part@draw[\pig@body!55!white] ( 0.6, 0.8 ) .. controls ( 0.6 , 0.4) and ( 0.35, 0.16) .. ( 0.0, 0.16) .. controls (-0.35, 0.16) and (-0.6 , 0.4) .. (-0.6, 0.8 ) .. controls (-0.6 , 1.3) and (-0.35, 1.5) .. ( 0.0, 1.5) .. controls ( 0.35, 1.5) and ( 0.6 , 1.3) .. ( 0.6, 0.75) -- cycle;
+ \pig@part@draw[\pig@body] ( 0.6, 0.8 ) .. controls ( 0.6 , 0.4) and ( 0.35, 0.16) .. ( 0.0, 0.16) .. controls (-0.35, 0.16) and (-0.6 , 0.4) .. (-0.6, 0.8 ) .. controls (-0.6 , 1.3) and (-0.35, 1.5) .. ( 0.0, 1.5) .. controls ( 0.35, 1.5) and ( 0.6 , 1.3) .. ( 0.6, 0.75) -- cycle;
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname pighookbelly\endcsname
@@ -136,12 +151,12 @@
%
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifpig@back
- \pig@part@draw[\pig@body] (-0.2402, 0.9823) .. controls (-0.2994, 1.0582) and (-0.3721, 1.0651) .. (-0.4024, 0.9978) .. controls (-0.4327, 0.9305) and (-0.4092, 0.8145) .. (-0.35, 0.7386) .. controls (-0.3311, 0.7145) and (-0.3101, 0.6964) .. (-0.289, 0.6862) .. controls (-0.2755, 0.7023) and (-0.2498, 0.7563) .. (-0.2498, 0.7563) .. controls (-0.2498, 0.7563) and (-0.1790, 0.731) .. (-0.1611, 0.746) .. controls (-0.1611, 0.746) and (-0.1809, 0.9064) .. (-0.2402, 0.9823) -- cycle;
- \pig@part@draw[\pig@body] (0.2402, 0.9823) .. controls (0.2994, 1.0582) and (0.3721, 1.0651) .. (0.4024, 0.9978) .. controls (0.4327, 0.9305) and (0.4092, 0.8145) .. (0.35, 0.7386) .. controls (0.3311, 0.7145) and (0.3101, 0.6964) .. (0.289, 0.6862) .. controls (0.2755, 0.7023) and (0.2498, 0.7563) .. (0.2498, 0.7563) .. controls (0.2498, 0.7563) and (0.1790, 0.731) .. (0.1611, 0.746) .. controls (0.1611, 0.746) and (0.1809, 0.9064) .. (0.2402, 0.9823) -- cycle;
+ \pig@part@draw[pig@bodysat22] (-0.2402, 0.9823) .. controls (-0.2994, 1.0582) and (-0.3721, 1.0651) .. (-0.4024, 0.9978) .. controls (-0.4327, 0.9305) and (-0.4092, 0.8145) .. (-0.35, 0.7386) .. controls (-0.3311, 0.7145) and (-0.3101, 0.6964) .. (-0.289, 0.6862) .. controls (-0.2755, 0.7023) and (-0.2498, 0.7563) .. (-0.2498, 0.7563) .. controls (-0.2498, 0.7563) and (-0.1790, 0.731) .. (-0.1611, 0.746) .. controls (-0.1611, 0.746) and (-0.1809, 0.9064) .. (-0.2402, 0.9823) -- cycle;
+ \pig@part@draw[pig@bodysat22] (0.2402, 0.9823) .. controls (0.2994, 1.0582) and (0.3721, 1.0651) .. (0.4024, 0.9978) .. controls (0.4327, 0.9305) and (0.4092, 0.8145) .. (0.35, 0.7386) .. controls (0.3311, 0.7145) and (0.3101, 0.6964) .. (0.289, 0.6862) .. controls (0.2755, 0.7023) and (0.2498, 0.7563) .. (0.2498, 0.7563) .. controls (0.2498, 0.7563) and (0.1790, 0.731) .. (0.1611, 0.746) .. controls (0.1611, 0.746) and (0.1809, 0.9064) .. (0.2402, 0.9823) -- cycle;
\fi% back
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \pig@part@draw[\pig@body!55!white] (0,1.64) ellipse[x radius=.5, y radius=.5];
+ \pig@part@draw[\pig@body] (0,1.64) ellipse[x radius=.5, y radius=.5];
%
% Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifpig@back
@@ -151,28 +166,32 @@
\pig@part@draw[\pig@eye] ( 0.09, 1.82) circle[radius=0.02];
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \pig@part@draw[\pig@body] (0, 1.62) ellipse[x radius=0.18, y radius=0.14];
+ \pig@part@draw[pig@bodysat22] (0, 1.62) ellipse[x radius=0.18, y radius=0.14];
\pig@part@draw[gray] (-0.06, 1.62) circle[radius=0.035];
\pig@part@draw[gray] ( 0.06, 1.62) circle[radius=0.035];
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\pig@mouth,line width=\scalingfactor*0.4pt] (0.105, 1.46) arc [start angle=-50, end angle=-130, radius=0.16] ;
+ \ifpig@openmouth
+ \filldraw[\pig@mouth,line width=\scalingfactor*0.4pt] (0.105, 1.46) arc [start angle=-50, end angle=-130, radius=0.16];
+ \else
+ \draw[\pig@mouth,line width=\scalingfactor*0.4pt] (0.105, 1.46) arc [start angle=-50, end angle=-130, radius=0.16];
+ \fi
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \pig@part@draw[\pig@body] (0.3216,0.15) arc (-15:195:0.12) -- (0.16,0.15) to [bend left] (0.25,0.15) -- cycle;
- \pig@part@draw[\pig@body] (-0.3216,0.15) arc (195:-15:0.12) -- (-0.16,0.15) to[bend right] (-0.25,0.15) --cycle;
+ \pig@part@draw[pig@bodysat22] (0.3216,0.15) arc (-15:195:0.12) -- (0.16,0.15) to [bend left] (0.25,0.15) -- cycle;
+ \pig@part@draw[pig@bodysat22] (-0.3216,0.15) arc (195:-15:0.12) -- (-0.16,0.15) to[bend right] (-0.25,0.15) --cycle;
%
\fi% back
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \pig@part@draw[\pig@body] (0.22, 2.0392) .. controls (0.22, 2.1584) and (0.49460, 2.255) .. (0.49460, 2.255) .. controls (0.49460, 2.255) and (0.5300, 1.86) .. (0.3721, 1.86) .. controls (0.2891, 1.86) and (0.22, 1.9201) .. (0.22, 2.0392) -- cycle;
- \pig@part@draw[\pig@body!55!white] (0.22, 2.0392) .. controls (0.26, 2.1584) and (0.47, 2.22) .. (0.47, 2.20) .. controls (0.47, 2.2) and (0.49, 1.9) .. (0.3721, 1.9) .. controls (0.2891, 1.88) and (0.22, 1.88) .. (0.22, 2.0392) -- cycle;
- \pig@part@draw[\pig@body] (-0.22, 2.0392) .. controls (-0.22, 2.1584) and (-0.49460, 2.255) .. (-0.49460, 2.255) .. controls (-0.49460, 2.255) and (-0.5300, 1.86) .. (-0.3721, 1.86) .. controls (-0.2891, 1.86) and (-0.22, 1.9201) .. (-0.22, 2.0392) -- cycle;
- \pig@part@draw[\pig@body!55!white] (-0.22, 2.0392) .. controls (-0.26, 2.1584) and (-0.47, 2.22) .. (-0.47, 2.20) .. controls (-0.47, 2.2) and (-0.49, 1.9) .. (-0.3721, 1.9) .. controls (-0.2891, 1.88) and (-0.22, 1.88) .. (-0.22, 2.0392) -- cycle;
- %
+ \pig@part@draw[pig@bodysat22] (0.22, 2.0392) .. controls (0.22, 2.1584) and (0.49460, 2.255) .. (0.49460, 2.255) .. controls (0.49460, 2.255) and (0.5300, 1.86) .. (0.3721, 1.86) .. controls (0.2891, 1.86) and (0.22, 1.9201) .. (0.22, 2.0392) -- cycle;
+ \pig@part@draw[\pig@body] (0.22, 2.0392) .. controls (0.26, 2.1584) and (0.47, 2.22) .. (0.47, 2.20) .. controls (0.47, 2.2) and (0.49, 1.9) .. (0.3721, 1.9) .. controls (0.2891, 1.88) and (0.22, 1.88) .. (0.22, 2.0392) -- cycle;
+ \pig@part@draw[pig@bodysat22] (-0.22, 2.0392) .. controls (-0.22, 2.1584) and (-0.49460, 2.255) .. (-0.49460, 2.255) .. controls (-0.49460, 2.255) and (-0.5300, 1.86) .. (-0.3721, 1.86) .. controls (-0.2891, 1.86) and (-0.22, 1.9201) .. (-0.22, 2.0392) -- cycle;
+ \pig@part@draw[\pig@body] (-0.22, 2.0392) .. controls (-0.26, 2.1584) and (-0.47, 2.22) .. (-0.47, 2.20) .. controls (-0.47, 2.2) and (-0.49, 1.9) .. (-0.3721, 1.9) .. controls (-0.2891, 1.88) and (-0.22, 1.88) .. (-0.22, 2.0392) -- cycle;
+ %
% Tail if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifpig@back
- \draw[\pig@tail,line width=\scalingfactor*0.8pt] (0.8431, 0.583) .. controls (0.8609, 0.4063) and (0.7006, 0.361) .. (0.6384, 0.4293) .. controls (0.5762, 0.4976) and (0.5613, 0.6052) .. (0.6551, 0.629) .. controls (0.7537, 0.6541) and (0.7759, 0.5628) .. (0.7455, 0.4948) .. controls (0.6412, 0.2697) and (0.3543, 0.356) .. (0.2638, 0.4238) .. controls (0.1967, 0.4779) and (0.1788, 0.6076) .. (0.3192, 0.633) .. controls (0.6000, 0.6836) and (0.5130, 0.3048) .. (0.2098, 0.3322) .. controls (0.0809, 0.3438) and (0.0809, 0.5236) .. (0.0809, 0.5236);
+ \draw[\pig@tail,line width=\scalingfactor*0.8pt] (0.8431, 0.583) .. controls (0.8609, 0.4063) and (0.7006, 0.361) .. (0.6384, 0.4293) .. controls (0.5762, 0.4976) and (0.5613, 0.6052) .. (0.6551, 0.629) .. controls (0.7537, 0.6541) and (0.7759, 0.5628) .. (0.7455, 0.4948) .. controls (0.6412, 0.2697) and (0.3543, 0.356) .. (0.2638, 0.4238) .. controls (0.1967, 0.4779) and (0.1788, 0.6076) .. (0.3192, 0.633) .. controls (0.6000, 0.6836) and (0.5130, 0.3048) .. (0.2098, 0.3322) .. controls (0.0809, 0.3438) and (0.0809, 0.5236) .. (0.0809, 0.5236);
\fi% back
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -193,47 +212,52 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-pigs}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-pigs}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic pig}}
%\pig
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic pig can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\pig[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\pig[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Tail colour}}
%\pig[tail=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\pig[mouth=red]
%\end{tcblisting}
%
+% The pig can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\pig[openmouth]
+%\end{tcblisting}
+%
%To view the pig from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\pig[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the pig 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the pig 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\pig[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\pig[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-rhinos.sty b/graphics/pgf/contrib/tikzlings/tikzlings-rhinos.sty
index 5ce10d34be..47f868b0b7 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-rhinos.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-rhinos.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-rhinos}[2022/06/17 version v1.0 Drawing rhinos in TikZ]
+\ProvidesPackage{tikzlings-rhinos}[2025/01/05 version v2.2 Drawing rhinos in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -26,12 +26,13 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname rhinohookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifrhino@threeD
\newif\ifrhino@back
\newif\ifrhino@contour
+\newif\ifrhino@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -47,34 +48,38 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
body/.store in = \rhino@body,
- body = gray,
+ body = gray!55!white,
toes/.store in = \rhino@toes,
- toes = \rhino@body!55!white,
+ toes = \rhino@body,
eye/.store in = \rhino@eye,
- eye = white,
+ eye = white,
pupil/.store in = \rhino@pupil,
- pupil = black,
+ pupil = black,
mouth/.store in = \rhino@mouth,
- mouth = \rhino@body!70!black,
+ mouth = \rhino@body!50!black,
+ horn/.store in = \rhino@horn,
+ horn = white!95!yellow,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ openmouth/.code = \rhino@openmouthtrue,
+ open mouth/.forward to = /rhino/openmouth,
3D/.code = \rhino@threeDtrue
- \def\rhino@mouth{black},
- back/.code = \rhino@backtrue,
+ \def\rhino@mouth{black},
+ back/.code = \rhino@backtrue,
contour/.code = \rhino@contourtrue
\def\rhino@contour{#1}
\def\rhino@mouth{#1},
- contour/.default = black,
- outline/.forward to = /rhino/contour,
+ contour/.default = black,
+ outline/.forward to = /rhino/contour,
}
\def\rhino@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.625,0.1) rectangle (0.625, 2.17);
@@ -91,7 +96,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -109,7 +114,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -117,25 +122,22 @@
\csname tikzlinghookbackground\endcsname
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \rhino@part@draw[\rhino@body] (-0.1772, 2.0686) .. controls (-0.2057, 2.1602) and (-0.3552, 2.2076) .. (-0.3552, 2.1922) .. controls (-0.3552, 2.1922) and (-0.3694, 1.9615) .. (-0.2855, 1.9615) .. controls (-0.2264, 1.9462) and (-0.1772, 1.9462) .. (-0.1772, 2.0686) -- cycle;
- \rhino@part@draw[\rhino@body] (0.1772, 2.0686) .. controls (0.2057, 2.1602) and (0.3552, 2.2076) .. (0.3552, 2.1922) .. controls (0.3552, 2.1922) and (0.3694, 1.9615) .. (0.2855, 1.9615) .. controls (0.2264, 1.9462) and (0.1772, 1.9462) .. (0.1772, 2.0686) -- cycle;
+ \rhino@part@draw[\rhino@body!70!black] (-0.1772, 2.0686) .. controls (-0.2057, 2.1602) and (-0.3552, 2.2076) .. (-0.3552, 2.1922) .. controls (-0.3552, 2.1922) and (-0.3694, 1.9615) .. (-0.2855, 1.9615) .. controls (-0.2264, 1.9462) and (-0.1772, 1.9462) .. (-0.1772, 2.0686) -- cycle;
+ \rhino@part@draw[\rhino@body!70!black] (0.1772, 2.0686) .. controls (0.2057, 2.1602) and (0.3552, 2.2076) .. (0.3552, 2.1922) .. controls (0.3552, 2.1922) and (0.3694, 1.9615) .. (0.2855, 1.9615) .. controls (0.2264, 1.9462) and (0.1772, 1.9462) .. (0.1772, 2.0686) -- cycle;
%
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifrhino@back
- \begin{scope}
- \clip (-0.5,0.4) rectangle (0.5,0.13);
- \rhino@part@draw[\rhino@body] (-0.25,0.15) ellipse[x radius=0.16, y radius=0.17];
- \rhino@part@draw[\rhino@body] (0.25,0.15) ellipse[x radius=0.16, y radius=0.17];
- \end{scope}
+ \rhino@part@draw[\rhino@body!70!black] (-0.08,0.13) arc [start angle=0, end angle=180, x radius=0.17, y radius=0.19] -- cycle;
+ \rhino@part@draw[\rhino@body!70!black](0.08,0.13) arc [start angle=180, end angle=0, x radius=0.17, y radius=0.19] -- cycle;
\fi% back
%
% Nose if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifrhino@back
- \rhino@part@draw[\rhino@body!80!white] (0, 1.55) ellipse[x radius=0.36, y radius=0.2];
+ \rhino@part@draw[\rhino@body!83!black] (0, 1.55) ellipse[x radius=0.36, y radius=0.2];
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \rhino@part@draw[\rhino@body!55!white] ( 0.55, 0.8 ) .. controls ( 0.55 , 0.4) and ( 0.35, 0.19) .. ( 0.0, 0.19) .. controls (-0.35, 0.19) and (-0.55 , 0.4) .. (-0.55, 0.8 ) .. controls (-0.55 , 1.3) and (-0.35, 1.65) .. ( 0.0, 1.65) .. controls ( 0.35, 1.65) and ( 0.55 , 1.3) .. ( 0.55, 0.75) -- cycle;
+ \rhino@part@draw[\rhino@body] ( 0.55, 0.8 ) .. controls ( 0.55 , 0.4) and ( 0.35, 0.19) .. ( 0.0, 0.19) .. controls (-0.35, 0.19) and (-0.55 , 0.4) .. (-0.55, 0.8 ) .. controls (-0.55 , 1.3) and (-0.35, 1.65) .. ( 0.0, 1.65) .. controls ( 0.35, 1.65) and ( 0.55 , 1.3) .. ( 0.55, 0.75) -- cycle;
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname rhinohookbelly\endcsname
@@ -143,12 +145,12 @@
%
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifrhino@back
- \rhino@part@draw[\rhino@body] (0.3,1.0) ellipse[x radius=0.24, y radius=0.13, rotate=90];
- \rhino@part@draw[\rhino@body] (-0.3,1.0) ellipse[x radius=0.24, y radius=0.13, rotate=-90];
+ \rhino@part@draw[\rhino@body!70!black] (0.3,1.0) ellipse[x radius=0.24, y radius=0.13, rotate=90];
+ \rhino@part@draw[\rhino@body!70!black] (-0.3,1.0) ellipse[x radius=0.24, y radius=0.13, rotate=-90];
\fi% back
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \rhino@part@draw[\rhino@body!55!white] (0, 1.76) circle[radius=0.36];
+ \rhino@part@draw[\rhino@body] (0, 1.76) circle[radius=0.36];
%
% Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifrhino@back
@@ -167,26 +169,27 @@
\fi% contour
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \rhino@part@draw[\rhino@body!80!white] (0, 1.55) ellipse[x radius=0.36, y radius=0.2];
+ \rhino@part@draw[\rhino@body!83!black] (0, 1.55) ellipse[x radius=0.36, y radius=0.2];
%
% Horn %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \rhino@part@draw[white!95!yellow] (0, 1.7911) .. controls (-0.0231, 1.7372) and (-0.0463, 1.6832) .. (-0.0642, 1.6274) .. controls (-0.0687, 1.6132) and (-0.0724, 1.5981) .. (-0.0678, 1.5834) .. controls (-0.0603, 1.552) and (-0.0287, 1.5287) .. (0, 1.531) .. controls (0.0287, 1.5287) and (0.0603, 1.552) .. (0.0678, 1.5834) .. controls (0.0724, 1.5981) and (0.0687, 1.6132) .. (0.0642, 1.6274) .. controls (0.0463, 1.6832) and (0.0231, 1.7372) .. (0, 1.7911) -- cycle;
+ \rhino@part@draw[\rhino@horn] (0, 1.7911) .. controls (-0.0231, 1.7372) and (-0.0463, 1.6832) .. (-0.0642, 1.6274) .. controls (-0.0687, 1.6132) and (-0.0724, 1.5981) .. (-0.0678, 1.5834) .. controls (-0.0603, 1.552) and (-0.0287, 1.5287) .. (0, 1.531) .. controls (0.0287, 1.5287) and (0.0603, 1.552) .. (0.0678, 1.5834) .. controls (0.0724, 1.5981) and (0.0687, 1.6132) .. (0.0642, 1.6274) .. controls (0.0463, 1.6832) and (0.0231, 1.7372) .. (0, 1.7911) -- cycle;
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\rhino@mouth,line width=\scalingfactor*0.4pt] (0.125, 1.5) arc [start angle=-50, end angle=-130, radius=0.2] ;
+ \ifrhino@openmouth
+ \filldraw[\rhino@mouth,line width=\scalingfactor*0.4pt] (0.125, 1.5) arc [start angle=-50, end angle=-130, radius=0.2];
+ \else
+ \draw[\rhino@mouth,line width=\scalingfactor*0.4pt] (0.125, 1.5) arc [start angle=-50, end angle=-130, radius=0.2];
+ \fi
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \begin{scope}
- \clip (-0.5,0.4) rectangle (0.5,0.13);
- \rhino@part@draw[\rhino@body] (-0.25,0.15) ellipse[x radius=0.16, y radius=0.17];
- \rhino@part@draw[\rhino@body] (0.25,0.15) ellipse[x radius=0.16, y radius=0.17];
- \rhino@part@draw[\rhino@toes] (0.25,0.13) ellipse[x radius=0.05, y radius=0.1];
- \rhino@part@draw[\rhino@toes] (0.13,0.11) ellipse[x radius=0.05, y radius=0.1];
- \rhino@part@draw[\rhino@toes] (0.37,0.11) ellipse[x radius=0.05, y radius=0.1];
- \rhino@part@draw[\rhino@toes] (-0.25,0.13) ellipse[x radius=0.05, y radius=0.1];
- \rhino@part@draw[\rhino@toes] (-0.13,0.11) ellipse[x radius=0.05, y radius=0.1];
- \rhino@part@draw[\rhino@toes] (-0.37,0.11) ellipse[x radius=0.05, y radius=0.1];
- \end{scope}
+ \rhino@part@draw[\rhino@body!70!black] (-0.08,0.13) arc [start angle=0, end angle=180, x radius=0.17, y radius=0.19] -- cycle;
+ \rhino@part@draw[\rhino@toes] (-0.08,0.13) arc [start angle=0, end angle=180, x radius=0.05, y radius=0.08] -- cycle;
+ \rhino@part@draw[\rhino@toes] (-0.2,0.13) arc [start angle=0, end angle=180, x radius=0.05, y radius=0.1] -- cycle;
+ \rhino@part@draw[\rhino@toes] (-0.32,0.13) arc [start angle=0, end angle=180, x radius=0.05, y radius=0.08] -- cycle;
+ \rhino@part@draw[\rhino@body!70!black](0.08,0.13) arc [start angle=180, end angle=0, x radius=0.17, y radius=0.19] -- cycle;
+ \rhino@part@draw[\rhino@toes] (0.08,0.13) arc [start angle=180, end angle=0, x radius=0.05, y radius=0.08] -- cycle;
+ \rhino@part@draw[\rhino@toes] (0.2,0.13) arc [start angle=180, end angle=0, x radius=0.05, y radius=0.1] -- cycle;
+ \rhino@part@draw[\rhino@toes] (0.32,0.13) arc [start angle=180, end angle=0, x radius=0.05, y radius=0.08] -- cycle;
%
\fi% back
%
@@ -208,52 +211,60 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-rhinos}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-rhinos}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic rhino}}
%\rhino
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic rhino can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\rhino[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\rhino[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil colour}}
%\rhino[pupil=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\rhino[mouth=red]
%\end{tcblisting}
+%\begin{tcblisting}{title={Horn colour}}
+%\rhino[horn=red]
+%\end{tcblisting}
+%
+% The rhino can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\rhino[openmouth]
+%\end{tcblisting}
%
%The hippo can also do its nails:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Toe colour}}
%\rhino[toes=red]
%\end{tcblisting}
%
%To view the rhino from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\rhino[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the rhino 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the rhino 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\rhino[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\rhino[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-sheep.sty b/graphics/pgf/contrib/tikzlings/tikzlings-sheep.sty
index 5c8cd7e6bc..c412796adc 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-sheep.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-sheep.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-sheep}[2022/06/17 version v1.0 Drawing sheep in TikZ]
+\ProvidesPackage{tikzlings-sheep}[2025/01/05 version v2.2 Drawing sheep in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -52,11 +52,11 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
body/.store in = \sheep@body,
- body = brown!50!darkgray!97!yellow,
+ body = brown!50!darkgray!97!yellow!50!darkgray,
eye/.store in = \sheep@eye,
- eye = \sheep@body!50!black,
+ eye = sheep@bright!50!black,
nose/.store in = \sheep@nose,
- nose = \sheep@body!50!black,
+ nose = sheep@bright!50!black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
@@ -64,22 +64,22 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
blush/.code = \sheep@blushtrue
\def\sheep@blushcolor{#1},
- blush/.default = red,
+ blush/.default = red,
monocle/.code = \sheep@monocletrue,
- 3D/.code = \sheep@threeDtrue,
- back/.code = \sheep@backtrue,
+ 3D/.code = \sheep@threeDtrue,
+ back/.code = \sheep@backtrue,
contour/.code = \sheep@contourtrue
\def\sheep@contour{#1}
\def\sheep@blushcolor{#1}
\def\sheep@nose{#1},
- contour/.default = black,
- outline/.forward to = /sheep/contour,
+ contour/.default = black,
+ outline/.forward to = /sheep/contour,
}
\def\sheep@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.7,0.08) rectangle (0.7,2.33);
@@ -94,9 +94,10 @@
\pgfmathsetmacro{\scalingfactor}{sqrt(abs(\tmpscaleA*\tmpscaleD-\tmpscaleB*\tmpscaleC))*sqrt(abs((\pgf@xx/1cm)*(\pgf@yy/1cm)-(\pgf@xy/1cm)*(\pgf@yx/1cm)))}%
\pgfmathsetmacro{\xscalefactor}{\tmpscaleA}
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
+ \pgfmathsetmacro{\decoscalefactor}{sign(\tmpscaleA)*sign(\tmpscaleD)*\scalingfactor}%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -113,28 +114,40 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
+ % generating saturated/brighter version of body colour
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \extractcolorspecs{\sheep@body}{\sheep@model}{\sheep@colorspec}
+ \convertcolorspec{\sheep@model}{\sheep@colorspec}{hsb}{\sheep@hsbcolorspec}
+ \pgfmathsetmacro{\sheep@hue}{(array({\sheep@hsbcolorspec},0))}
+ \pgfmathsetmacro{\sheep@sat}{(array({\sheep@hsbcolorspec},1))}
+ \pgfmathsetmacro{\sheep@bright}{(array({\sheep@hsbcolorspec},2))+0.1}
+ \definecolor{sheep@bright}{hsb}{\sheep@hue,\sheep@sat,\sheep@bright}
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname sheephookbackground\endcsname
\csname tikzlinghookbackground\endcsname
- %
+ %
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sheep@part@draw[\sheep@body] (0.22, 2.0392) .. controls (0.22, 2.1584) and (0.49460, 2.255) .. (0.49460, 2.255) .. controls (0.49460, 2.255) and (0.5300, 1.86) .. (0.3721, 1.86) .. controls (0.2891, 1.86) and (0.22, 1.9201) .. (0.22, 2.0392) -- cycle;
- \sheep@part@draw[\sheep@body!55!white] (0.22, 2.0392) .. controls (0.26, 2.1584) and (0.47, 2.22) .. (0.47, 2.20) .. controls (0.47, 2.2) and (0.49, 1.9) .. (0.3721, 1.9) .. controls (0.2891, 1.88) and (0.22, 1.88) .. (0.22, 2.0392) -- cycle;
- \sheep@part@draw[\sheep@body] (-0.22, 2.0392) .. controls (-0.22, 2.1584) and (-0.49460, 2.255) .. (-0.49460, 2.255) .. controls (-0.49460, 2.255) and (-0.5300, 1.86) .. (-0.3721, 1.86) .. controls (-0.2891, 1.86) and (-0.22, 1.9201) .. (-0.22, 2.0392) -- cycle;
- \sheep@part@draw[\sheep@body!55!white] (-0.22, 2.0392) .. controls (-0.26, 2.1584) and (-0.47, 2.22) .. (-0.47, 2.20) .. controls (-0.47, 2.2) and (-0.49, 1.9) .. (-0.3721, 1.9) .. controls (-0.2891, 1.88) and (-0.22, 1.88) .. (-0.22, 2.0392) -- cycle;
- %
+ \sheep@part@draw[sheep@bright] (0.22, 2.0392) .. controls (0.22, 2.1584) and (0.49460, 2.255) .. (0.49460, 2.255) .. controls (0.49460, 2.255) and (0.5300, 1.86) .. (0.3721, 1.86) .. controls (0.2891, 1.86) and (0.22, 1.9201) .. (0.22, 2.0392) -- cycle;
+ \sheep@part@draw[sheep@bright!55!white] (0.22, 2.0392) .. controls (0.26, 2.1584) and (0.47, 2.22) .. (0.47, 2.20) .. controls (0.47, 2.2) and (0.49, 1.9) .. (0.3721, 1.9) .. controls (0.2891, 1.88) and (0.22, 1.88) .. (0.22, 2.0392) -- cycle;
+ \sheep@part@draw[sheep@bright] (-0.22, 2.0392) .. controls (-0.22, 2.1584) and (-0.49460, 2.255) .. (-0.49460, 2.255) .. controls (-0.49460, 2.255) and (-0.5300, 1.86) .. (-0.3721, 1.86) .. controls (-0.2891, 1.86) and (-0.22, 1.9201) .. (-0.22, 2.0392) -- cycle;
+ \sheep@part@draw[sheep@bright!55!white] (-0.22, 2.0392) .. controls (-0.26, 2.1584) and (-0.47, 2.22) .. (-0.47, 2.20) .. controls (-0.47, 2.2) and (-0.49, 1.9) .. (-0.3721, 1.9) .. controls (-0.2891, 1.88) and (-0.22, 1.88) .. (-0.22, 2.0392) -- cycle;
+ %
% Feet if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifsheep@back
- \sheep@part@draw[\sheep@body] (0.3216,0.15) arc (-15:195:0.12) -- (0.16,0.15) to [bend left] (0.25,0.15) -- cycle;
- \sheep@part@draw[\sheep@body] (-0.3216,0.15) arc (195:-15:0.12) -- (-0.16,0.15) to[bend right] (-0.25,0.15) --cycle;
+ \sheep@part@draw[sheep@bright] (0.3216,0.15) arc (-15:195:0.12) -- (0.16,0.15) to [bend left] (0.25,0.15) -- cycle;
+ \sheep@part@draw[sheep@bright] (-0.3216,0.15) arc (195:-15:0.12) -- (-0.16,0.15) to[bend right] (-0.25,0.15) --cycle;
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sheep@part@draw[\sheep@body!50!darkgray,decorate,decoration={bumps,amplitude=\scalingfactor*2.5pt,segment length=\scalingfactor*10pt}] (0.595, 0.92) .. controls (0.595, 0.26) and (0.355, 0.18) .. (0, 0.18) .. controls (-0.355, 0.18) and (-0.595, 0.26) .. (-0.595, 0.92) .. controls (-0.605, 1.58) and (-0.335, 2.11) .. (0, 2.11) .. controls (0.335, 2.11) and (0.605, 1.58) .. (0.595, 0.92) -- cycle;
+ \sheep@part@draw[\sheep@body,decorate,decoration={bumps,amplitude=\decoscalefactor*2.5pt,segment length=\scalingfactor*10pt}] (0.595, 0.92) .. controls (0.595, 0.26) and (0.355, 0.18) .. (0, 0.18) .. controls (-0.355, 0.18) and (-0.595, 0.26) .. (-0.595, 0.92) .. controls (-0.605, 1.58) and (-0.335, 2.11) .. (0, 2.11) .. controls (0.335, 2.11) and (0.605, 1.58) .. (0.595, 0.92) -- cycle;
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname sheephookbelly\endcsname
@@ -142,30 +155,30 @@
%
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifsheep@back
- \sheep@part@draw[\sheep@body!45!white!95!orange] (-0.2402, 0.9823) .. controls (-0.2994, 1.0582) and (-0.3721, 1.0651) .. (-0.4024, 0.9978) .. controls (-0.4327, 0.9305) and (-0.4092, 0.8145) .. (-0.35, 0.7386) .. controls (-0.3311, 0.7145) and (-0.3101, 0.6964) .. (-0.289, 0.6862) .. controls (-0.2755, 0.7023) and (-0.2498, 0.7563) .. (-0.2498, 0.7563) .. controls (-0.2498, 0.7563) and (-0.1790, 0.731) .. (-0.1611, 0.746) .. controls (-0.1611, 0.746) and (-0.1809, 0.9064) .. (-0.2402, 0.9823) -- cycle;
- \sheep@part@draw[\sheep@body!45!white!95!orange] (0.2402, 0.9823) .. controls (0.2994, 1.0582) and (0.3721, 1.0651) .. (0.4024, 0.9978) .. controls (0.4327, 0.9305) and (0.4092, 0.8145) .. (0.35, 0.7386) .. controls (0.3311, 0.7145) and (0.3101, 0.6964) .. (0.289, 0.6862) .. controls (0.2755, 0.7023) and (0.2498, 0.7563) .. (0.2498, 0.7563) .. controls (0.2498, 0.7563) and (0.1790, 0.731) .. (0.1611, 0.746) .. controls (0.1611, 0.746) and (0.1809, 0.9064) .. (0.2402, 0.9823) -- cycle;
+ \sheep@part@draw[sheep@bright!45!white!95!orange] (-0.2402, 0.9823) .. controls (-0.2994, 1.0582) and (-0.3721, 1.0651) .. (-0.4024, 0.9978) .. controls (-0.4327, 0.9305) and (-0.4092, 0.8145) .. (-0.35, 0.7386) .. controls (-0.3311, 0.7145) and (-0.3101, 0.6964) .. (-0.289, 0.6862) .. controls (-0.2755, 0.7023) and (-0.2498, 0.7563) .. (-0.2498, 0.7563) .. controls (-0.2498, 0.7563) and (-0.1790, 0.731) .. (-0.1611, 0.746) .. controls (-0.1611, 0.746) and (-0.1809, 0.9064) .. (-0.2402, 0.9823) -- cycle;
+ \sheep@part@draw[sheep@bright!45!white!95!orange] (0.2402, 0.9823) .. controls (0.2994, 1.0582) and (0.3721, 1.0651) .. (0.4024, 0.9978) .. controls (0.4327, 0.9305) and (0.4092, 0.8145) .. (0.35, 0.7386) .. controls (0.3311, 0.7145) and (0.3101, 0.6964) .. (0.289, 0.6862) .. controls (0.2755, 0.7023) and (0.2498, 0.7563) .. (0.2498, 0.7563) .. controls (0.2498, 0.7563) and (0.1790, 0.731) .. (0.1611, 0.746) .. controls (0.1611, 0.746) and (0.1809, 0.9064) .. (0.2402, 0.9823) -- cycle;
\fi% back
%
% Hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sheep@part@draw[\sheep@body!50!darkgray,decorate,decoration={bumps,amplitude=\scalingfactor*2.5pt,segment length=\scalingfactor*10pt}] (-0.275,1.98) -- (-0.2,2.2) -- (-0.008,2.2) -- (0.2,2.2) -- (0.275,1.98) -- cycle;
+ \sheep@part@draw[\sheep@body,decorate,decoration={bumps,amplitude=\decoscalefactor*2.5pt,segment length=\scalingfactor*10pt}] (-0.275,1.98) -- (-0.2,2.2) -- (-0.008,2.2) -- (0.2,2.2) -- (0.275,1.98) -- cycle;
%
% Tail if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifsheep@back
- \sheep@part@draw[\sheep@body!45!white!95!orange,rounded corners=\scalingfactor*0.1pt] (0,0.7) -- (0.08, 0.3236) arc (0:-180:\scalingfactor*2pt) -- cycle;
+ \sheep@part@draw[sheep@bright!45!white!95!orange,rounded corners=\scalingfactor*0.1pt] (0,0.7) -- (0.08, 0.3236) arc (0:-180:\scalingfactor*2pt) -- cycle;
\fi% back
%
% Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifsheep@back
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sheep@part@draw[\sheep@body!45!white!95!orange] (0.4, 1.8) .. controls (0.4, 1.5) and (0.2, 1.25) .. (0, 1.16) .. controls (-0.2, 1.25) and (-0.4, 1.5) .. (-0.4, 1.8) .. controls (-0.34, 2.3) and (0.34, 2.3) .. (0.4, 1.8) -- cycle;
+ \sheep@part@draw[sheep@bright!45!white!95!orange] (0.4, 1.8) .. controls (0.4, 1.5) and (0.2, 1.25) .. (0, 1.16) .. controls (-0.2, 1.25) and (-0.4, 1.5) .. (-0.4, 1.8) .. controls (-0.34, 2.3) and (0.34, 2.3) .. (0.4, 1.8) -- cycle;
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sheep@part@draw[\sheep@body] (0.22, 2.0392) .. controls (0.22, 2.1584) and (0.49460, 2.255) .. (0.49460, 2.255) .. controls (0.49460, 2.255) and (0.5300, 1.86) .. (0.3721, 1.86) .. controls (0.2891, 1.86) and (0.22, 1.9201) .. (0.22, 2.0392) -- cycle;
- \sheep@part@draw[\sheep@body!55!white] (0.22, 2.0392) .. controls (0.26, 2.1584) and (0.47, 2.22) .. (0.47, 2.20) .. controls (0.47, 2.2) and (0.49, 1.9) .. (0.3721, 1.9) .. controls (0.2891, 1.88) and (0.22, 1.88) .. (0.22, 2.0392) -- cycle;
- \sheep@part@draw[\sheep@body] (-0.22, 2.0392) .. controls (-0.22, 2.1584) and (-0.49460, 2.255) .. (-0.49460, 2.255) .. controls (-0.49460, 2.255) and (-0.5300, 1.86) .. (-0.3721, 1.86) .. controls (-0.2891, 1.86) and (-0.22, 1.9201) .. (-0.22, 2.0392) -- cycle;
- \sheep@part@draw[\sheep@body!55!white] (-0.22, 2.0392) .. controls (-0.26, 2.1584) and (-0.47, 2.22) .. (-0.47, 2.20) .. controls (-0.47, 2.2) and (-0.49, 1.9) .. (-0.3721, 1.9) .. controls (-0.2891, 1.88) and (-0.22, 1.88) .. (-0.22, 2.0392) -- cycle;
- %
+ \sheep@part@draw[sheep@bright] (0.22, 2.0392) .. controls (0.22, 2.1584) and (0.49460, 2.255) .. (0.49460, 2.255) .. controls (0.49460, 2.255) and (0.5300, 1.86) .. (0.3721, 1.86) .. controls (0.2891, 1.86) and (0.22, 1.9201) .. (0.22, 2.0392) -- cycle;
+ \sheep@part@draw[sheep@bright!55!white] (0.22, 2.0392) .. controls (0.26, 2.1584) and (0.47, 2.22) .. (0.47, 2.20) .. controls (0.47, 2.2) and (0.49, 1.9) .. (0.3721, 1.9) .. controls (0.2891, 1.88) and (0.22, 1.88) .. (0.22, 2.0392) -- cycle;
+ \sheep@part@draw[sheep@bright] (-0.22, 2.0392) .. controls (-0.22, 2.1584) and (-0.49460, 2.255) .. (-0.49460, 2.255) .. controls (-0.49460, 2.255) and (-0.5300, 1.86) .. (-0.3721, 1.86) .. controls (-0.2891, 1.86) and (-0.22, 1.9201) .. (-0.22, 2.0392) -- cycle;
+ \sheep@part@draw[sheep@bright!55!white] (-0.22, 2.0392) .. controls (-0.26, 2.1584) and (-0.47, 2.22) .. (-0.47, 2.20) .. controls (-0.47, 2.2) and (-0.49, 1.9) .. (-0.3721, 1.9) .. controls (-0.2891, 1.88) and (-0.22, 1.88) .. (-0.22, 2.0392) -- cycle;
+ %
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifsheep@back
\sheep@part@draw[\sheep@eye] (0.2, 1.66) circle[radius=0.06];
@@ -176,15 +189,15 @@
\draw[\sheep@nose,line width=\scalingfactor*0.8pt,line cap=round] (0.16,1.43) arc [start angle=-30, end angle=-150, radius=0.185] (0.0,1.335) -- (0,1.175);
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sheep@part@draw[\sheep@body!45!white!95!orange] (0.3216,0.13) arc (-15:195:0.10) -- (0.16,0.13) to [bend left] (0.25,0.13) -- cycle;
- \sheep@part@draw[\sheep@body!45!white!95!orange] (-0.3216,0.13) arc (195:-15:0.10) -- (-0.16,0.13) to[bend right] (-0.25,0.13) --cycle;
+ \sheep@part@draw[sheep@bright!45!white!95!orange] (0.3216,0.13) arc (-15:195:0.10) -- (0.16,0.13) to [bend left] (0.25,0.13) -- cycle;
+ \sheep@part@draw[sheep@bright!45!white!95!orange] (-0.3216,0.13) arc (195:-15:0.10) -- (-0.16,0.13) to[bend right] (-0.25,0.13) --cycle;
%
% Hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sheep@part@draw[\sheep@body!50!darkgray,decorate,decoration={bumps,amplitude=\scalingfactor*2.5pt,segment length=\scalingfactor*10pt}] (-0.275,1.98) -- (-0.2,2.2) -- (-0.008,2.2) -- (0.2,2.2) -- (0.275,1.98) -- cycle;
+ \sheep@part@draw[\sheep@body,decorate,decoration={bumps,amplitude=\decoscalefactor*2.5pt,segment length=\scalingfactor*10pt}] (-0.275,1.98) -- (-0.2,2.2) -- (-0.008,2.2) -- (0.2,2.2) -- (0.275,1.98) -- cycle;
%
% Blush %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifsheep@blush
- \fill[\sheep@blushcolor,path fading=sheep@blush] (-0.25, 1.5) circle[radius=0.1];
+ \fill[\sheep@blushcolor,path fading=sheep@blush] (-0.25, 1.5) circle[radius=0.1];
\fill[\sheep@blushcolor,path fading=sheep@blush] (0.25, 1.5) circle[radius=0.1];
\fi% blush
%
@@ -199,7 +212,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname sheephookbody\endcsname
\csname tikzlinghookbody\endcsname
- %
+ %
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -214,54 +227,54 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-sheep}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-sheep}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic sheep}}
%\sheep
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic sheep can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\sheep[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\sheep[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Nose colour}}
%\sheep[nose=red]
%\end{tcblisting}
%
%The sheep can also blush
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Blushing sheep}}
%\sheep[blush=red]
%\end{tcblisting}
%
%and put on a monocle
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Monocle}}
%\sheep[monocle]
%\end{tcblisting}
%
%To view the sheep from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\sheep[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the sheep 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the sheep 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\sheep[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\sheep[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-sloths.sty b/graphics/pgf/contrib/tikzlings/tikzlings-sloths.sty
index fc7658629d..514fd72731 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-sloths.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-sloths.sty
@@ -9,15 +9,15 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-sloths}[2022/06/17 version v1.0 Drawing sloths in TikZ]
+\ProvidesPackage{tikzlings-sloths}[2025/01/05 version v2.2 Drawing sloths in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
-\definecolor{slothcol}{RGB}{168,156,123}
+\definecolor{slothcol}{RGB}{143,133,105}
\newcommand*{\sloth}[1][]{%
\begin{scope}%
@@ -28,13 +28,14 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname slothhookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifsloth@sleeping
\newif\ifsloth@threeD
\newif\ifsloth@back
\newif\ifsloth@contour
+\newif\ifsloth@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -52,31 +53,33 @@
body/.store in = \sloth@body,
body = slothcol,
eye/.store in = \sloth@eye,
- eye = black,
+ eye = black,
eyelid/.store in = \sloth@eyelid,
- eyelid = \sloth@body!50!white,
+ eyelid = sloth@bright10!50!white,
mouth/.store in = \sloth@mouth,
- mouth = \sloth@body!40!black,
+ mouth = sloth@bright10!40!black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- sleeping/.code = \sloth@sleepingtrue,
- 3D/.code = \sloth@threeDtrue,
- back/.code = \sloth@backtrue,
+ sleeping/.code = \sloth@sleepingtrue,
+ openmouth/.code = \sloth@openmouthtrue,
+ open mouth/.forward to = /sloth/openmouth,
+ 3D/.code = \sloth@threeDtrue,
+ back/.code = \sloth@backtrue,
contour/.code = \sloth@contourtrue
\def\sloth@contour{#1}
\def\sloth@mouth{#1}
\def\sloth@eyelid{#1},
- contour/.default = black,
- outline/.forward to = /sloth/contour,
+ contour/.default = black,
+ outline/.forward to = /sloth/contour,
}
\def\sloth@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.7,0.12) rectangle (0.7, 2.27);
@@ -93,7 +96,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -110,8 +113,20 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
+ % generating saturated/brighter version of body colour
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \extractcolorspecs{\sloth@body}{\sloth@model}{\sloth@colorspec}
+ \convertcolorspec{\sloth@model}{\sloth@colorspec}{hsb}{\sloth@hsbcolorspec}
+ \pgfmathsetmacro{\sloth@hue}{(array({\sloth@hsbcolorspec},0))}
+ \pgfmathsetmacro{\sloth@sat}{(array({\sloth@hsbcolorspec},1))}
+ \pgfmathsetmacro{\sloth@bright}{(array({\sloth@hsbcolorspec},2))+0.1}
+ \definecolor{sloth@bright10}{hsb}{\sloth@hue,\sloth@sat,\sloth@bright}
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -120,29 +135,28 @@
%
% Arms if back %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifsloth@back
- \sloth@part@draw[\sloth@body] (0.53,0.95) ellipse[x radius=0.1, y radius=0.27, rotate=10];
- \sloth@part@draw[\sloth@body] (-0.53,0.95) ellipse[x radius=0.1, y radius=0.27, rotate=-10];
+ \sloth@part@draw[sloth@bright10] (0.53,0.95) ellipse[x radius=0.1, y radius=0.27, rotate=10];
+ \sloth@part@draw[sloth@bright10] (-0.53,0.95) ellipse[x radius=0.1, y radius=0.27, rotate=-10];
\fi% back
%
% Feet if back%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifsloth@back
- \fill[\sloth@body!50!black] (-0.125,0.265) ellipse[x radius=0.07, y radius=0.019,rotate=-10];
- \fill[\sloth@body!50!black] (-0.14,0.21) ellipse[x radius=0.07, y radius=0.017, rotate=-16];
- \fill[\sloth@body!50!black] (-0.16,0.165) ellipse[x radius=0.07, y radius=0.015, rotate=-22];
- \fill[\sloth@body!50!black] (0.125,0.265) ellipse[x radius=0.07, y radius=0.019, rotate=10];
- \fill[\sloth@body!50!black] (0.14,0.21) ellipse[x radius=0.07, y radius=0.017, rotate=16];
- \fill[\sloth@body!50!black] (0.16,0.165) ellipse[x radius=0.07, y radius=0.015, rotate=22];
- \sloth@part@draw[\sloth@body] (0.33,0.31) ellipse[x radius=0.25, y radius=0.13, rotate=25];
- \sloth@part@draw[\sloth@body] (-0.33,0.31) ellipse[x radius=0.25, y radius=0.13, rotate=-25];
+ \fill[sloth@bright10!50!black] (-0.125,0.265) ellipse[x radius=0.07, y radius=0.019,rotate=-10];
+ \fill[sloth@bright10!50!black] (-0.14,0.21) ellipse[x radius=0.07, y radius=0.017, rotate=-16];
+ \fill[sloth@bright10!50!black] (-0.16,0.165) ellipse[x radius=0.07, y radius=0.015, rotate=-22];
+ \fill[sloth@bright10!50!black] (0.125,0.265) ellipse[x radius=0.07, y radius=0.019, rotate=10];
+ \fill[sloth@bright10!50!black] (0.14,0.21) ellipse[x radius=0.07, y radius=0.017, rotate=16];
+ \fill[sloth@bright10!50!black] (0.16,0.165) ellipse[x radius=0.07, y radius=0.015, rotate=22];
+ \sloth@part@draw[sloth@bright10] (0.33,0.31) ellipse[x radius=0.25, y radius=0.13, rotate=25];
+ \sloth@part@draw[sloth@bright10] (-0.33,0.31) ellipse[x radius=0.25, y radius=0.13, rotate=-25];
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sloth@part@draw[\sloth@body!85!black] (0.53,0.85) .. controls (0.53,0.29) and (0.32,0.22) .. (0,0.22) .. controls (-0.32,0.22) and (-0.53,0.29) ..
- (-0.53,0.85) .. controls (-0.53,1.41) and (-0.32,1.87) .. (0,1.87) .. controls (0.33,1.87) and (0.53,1.41) .. (0.53,0.85) -- cycle;
+ \sloth@part@draw[\sloth@body] (0.53,0.85) .. controls (0.53,0.29) and (0.32,0.22) .. (0,0.22) .. controls (-0.32,0.22) and (-0.53,0.29) .. (-0.53,0.85) .. controls (-0.53,1.41) and (-0.32,1.87) .. (0,1.87) .. controls (0.33,1.87) and (0.53,1.41) .. (0.53,0.85) -- cycle;
%
% Belly %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifsloth@back
- \sloth@part@draw[\sloth@body!70!white] (0.36, 0.74) .. controls (0.36, 0.49) and (0.22, 0.41) .. (0, 0.41) .. controls (-0.22, 0.41) and (-0.36, 0.49) .. (-0.36, 0.74) .. controls (-0.36, 1) and (-0.22, 1.16) .. (0, 1.16) .. controls (0.22, 1.16) and (0.36, 1) .. (0.36, 0.74) -- cycle;
+ \sloth@part@draw[sloth@bright10!70!white] (0.36, 0.74) .. controls (0.36, 0.49) and (0.22, 0.41) .. (0, 0.41) .. controls (-0.22, 0.41) and (-0.36, 0.49) .. (-0.36, 0.74) .. controls (-0.36, 1) and (-0.22, 1.16) .. (0, 1.16) .. controls (0.22, 1.16) and (0.36, 1) .. (0.36, 0.74) -- cycle;
\fi% back
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -150,46 +164,42 @@
\csname tikzlinghookbelly\endcsname
%
% Hair %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sloth@part@draw[\sloth@body] (-0.1128,2.0724) .. controls (-0.1128,2.0724) and (-0.1499,2.2329) .. (-0.0972,2.2525) .. controls (-0.1082,2.1318) and (-0.0047,2.0839) .. (-0.0047,2.0839) .. controls (-0.0047,2.0839) and (-0.0219,2.1866) .. (0.0145,2.1933) .. controls (0.0142,2.1159) and (0.0770,2.0884) .. (0.0770,2.0884) -- cycle;
+ \sloth@part@draw[sloth@bright10] (-0.1128,2.0724) .. controls (-0.1128,2.0724) and (-0.1499,2.2329) .. (-0.0972,2.2525) .. controls (-0.1082,2.1318) and (-0.0047,2.0839) .. (-0.0047,2.0839) .. controls (-0.0047,2.0839) and (-0.0219,2.1866) .. (0.0145,2.1933) .. controls (0.0142,2.1159) and (0.0770,2.0884) .. (0.0770,2.0884) -- cycle;
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sloth@part@draw[\sloth@body]
- ( 0.50,1.67) .. controls ( 0.50,1.91) and ( 0.27,2.10) ..
- ( 0.00,2.10) .. controls (-0.27,2.10) and (-0.50,1.91) .. (-0.50,1.67) .. controls (-0.50,1.43) and (-0.33,1.28) ..
- ( 0.00,1.28) .. controls ( 0.33,1.28) and ( 0.50,1.43) ..
- ( 0.50,1.67) -- cycle;
+ \sloth@part@draw[sloth@bright10] ( 0.50,1.67) .. controls ( 0.50,1.91) and ( 0.27,2.10) .. ( 0.00,2.10) .. controls (-0.27,2.10) and (-0.50,1.91) .. (-0.50,1.67) .. controls (-0.50,1.43) and (-0.33,1.28) .. ( 0.00,1.28) .. controls ( 0.33,1.28) and ( 0.50,1.43) .. ( 0.50,1.67) -- cycle;
%
% Show details only from the front %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifsloth@back
%
% Inner part of hat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sloth@part@draw[\sloth@body!50!white] ( 0.40,1.67) .. controls ( 0.40,1.90) and ( 0.12,2.09) .. ( 0.00,1.93) .. controls (-0.12,2.09) and (-0.40,1.90) .. (-0.40,1.67) .. controls (-0.40,1.45) and (-0.25,1.38) .. ( 0.00,1.38) .. controls ( 0.25,1.38) and ( 0.40,1.45) .. ( 0.40,1.67) -- cycle;
+ \sloth@part@draw[sloth@bright10!50!white] ( 0.40,1.67) .. controls ( 0.40,1.90) and ( 0.12,2.09) .. ( 0.00,1.93) .. controls (-0.12,2.09) and (-0.40,1.90) .. (-0.40,1.67) .. controls (-0.40,1.45) and (-0.25,1.38) .. ( 0.00,1.38) .. controls ( 0.25,1.38) and ( 0.40,1.45) .. ( 0.40,1.67) -- cycle;
%
% behind the eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifsloth@contour
\draw[\sloth@contour,fill=white,line width=\scalingfactor*0.4pt] (0.3785,1.5336) .. controls (0.3012,1.5864) and (0.1829,1.6693) .. (0.1377,1.7234) .. controls (0.1184,1.7464) and (0.1624,1.8242) .. (0.1906,1.8137) .. controls (0.2673,1.7851) and (0.3597,1.7125) .. (0.3994,1.6531) .. controls (0.4129,1.6328) and (0.3785,1.5336) .. (0.3785,1.5336) -- cycle;
\draw[\sloth@contour,fill=white,line width=\scalingfactor*0.4pt] (-0.3785,1.5336) .. controls (-0.3012,1.5864) and (-0.1829,1.6693) .. (-0.1377,1.7234) .. controls (-0.1184,1.7464) and (-0.1624,1.8242) .. (-0.1906,1.8137) .. controls (-0.2673,1.7851) and (-0.3597,1.7125) .. (-0.3994,1.6531) .. controls (-0.4129,1.6328) and (-0.3785,1.5336) .. (-0.3785,1.5336) -- cycle;
\else% contour
- \fill[\sloth@body!60!black] (0.3785,1.5336) .. controls (0.3012,1.5864) and (0.1829,1.6693) .. (0.1377,1.7234) .. controls (0.1184,1.7464) and (0.1624,1.8242) .. (0.1906,1.8137) .. controls (0.2673,1.7851) and (0.3597,1.7125) .. (0.3994,1.6531) .. controls (0.4129,1.6328) and (0.3785,1.5336) .. (0.3785,1.5336) -- cycle;
- \fill[\sloth@body!60!black] (-0.3785,1.5336) .. controls (-0.3012,1.5864) and (-0.1829,1.6693) .. (-0.1377,1.7234) .. controls (-0.1184,1.7464) and (-0.1624,1.8242) .. (-0.1906,1.8137) .. controls (-0.2673,1.7851) and (-0.3597,1.7125) .. (-0.3994,1.6531) .. controls (-0.4129,1.6328) and (-0.3785,1.5336) .. (-0.3785,1.5336) -- cycle;
+ \fill[sloth@bright10!60!black] (0.3785,1.5336) .. controls (0.3012,1.5864) and (0.1829,1.6693) .. (0.1377,1.7234) .. controls (0.1184,1.7464) and (0.1624,1.8242) .. (0.1906,1.8137) .. controls (0.2673,1.7851) and (0.3597,1.7125) .. (0.3994,1.6531) .. controls (0.4129,1.6328) and (0.3785,1.5336) .. (0.3785,1.5336) -- cycle;
+ \fill[sloth@bright10!60!black] (-0.3785,1.5336) .. controls (-0.3012,1.5864) and (-0.1829,1.6693) .. (-0.1377,1.7234) .. controls (-0.1184,1.7464) and (-0.1624,1.8242) .. (-0.1906,1.8137) .. controls (-0.2673,1.7851) and (-0.3597,1.7125) .. (-0.3994,1.6531) .. controls (-0.4129,1.6328) and (-0.3785,1.5336) .. (-0.3785,1.5336) -- cycle;
\fi% contour
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifsloth@sleeping
- \fill[\sloth@eyelid] (0.195, 1.705) rectangle ++(0.005, 0.02);
- \fill[\sloth@eyelid,rotate around={22:(0.195, 1.76)}] (0.195, 1.705) rectangle ++(0.005, 0.02);
- \fill[\sloth@eyelid,rotate around={44:(0.195, 1.76)}] (0.195, 1.701) rectangle ++(0.005, 0.02);
- \fill[\sloth@eyelid,rotate around={-22:(0.195, 1.76)}] (0.195, 1.705) rectangle ++(0.005, 0.02);
- \fill[\sloth@eyelid,rotate around={-44:(0.195, 1.76)}] (0.195, 1.705) rectangle ++(0.005, 0.02);
+ \fill[\sloth@eyelid] (0.195, 1.705) rectangle ++(0.005, 0.02);
+ \fill[\sloth@eyelid,rotate around={22:(0.195, 1.76)}] (0.195, 1.705) rectangle ++(0.005, 0.02);
+ \fill[\sloth@eyelid,rotate around={44:(0.195, 1.76)}] (0.195, 1.701) rectangle ++(0.005, 0.02);
+ \fill[\sloth@eyelid,rotate around={-22:(0.195, 1.76)}] (0.195, 1.705) rectangle ++(0.005, 0.02);
+ \fill[\sloth@eyelid,rotate around={-44:(0.195, 1.76)}] (0.195, 1.705) rectangle ++(0.005, 0.02);
%
- \fill[\sloth@eyelid] (-0.195, 1.705) rectangle ++(0.005, 0.02);
- \fill[\sloth@eyelid,rotate around={22:(-0.195, 1.76)}] (-0.195, 1.705) rectangle ++(0.005, 0.02);
- \fill[\sloth@eyelid,rotate around={44:(-0.195, 1.76)}] (-0.195, 1.705) rectangle ++(0.005, 0.02);
- \fill[\sloth@eyelid,rotate around={-22:(-0.195, 1.76)}] (-0.195, 1.705) rectangle ++(0.005, 0.02);
- \fill[\sloth@eyelid,rotate around={-44:(-0.195, 1.76)}] (-0.195, 1.701) rectangle ++(0.005, 0.02);
+ \fill[\sloth@eyelid] (-0.195, 1.705) rectangle ++(0.005, 0.02);
+ \fill[\sloth@eyelid,rotate around={22:(-0.195, 1.76)}] (-0.195, 1.705) rectangle ++(0.005, 0.02);
+ \fill[\sloth@eyelid,rotate around={44:(-0.195, 1.76)}] (-0.195, 1.705) rectangle ++(0.005, 0.02);
+ \fill[\sloth@eyelid,rotate around={-22:(-0.195, 1.76)}] (-0.195, 1.705) rectangle ++(0.005, 0.02);
+ \fill[\sloth@eyelid,rotate around={-44:(-0.195, 1.76)}] (-0.195, 1.701) rectangle ++(0.005, 0.02);
%
\sloth@part@draw[\sloth@eyelid] (0.237, 1.743) .. controls (0.237, 1.712) and (0.157, 1.712) .. (0.157, 1.743) .. controls (0.157, 1.802) and (0.237, 1.802) .. (0.237, 1.743) -- cycle;
- \sloth@part@draw[\sloth@eyelid] (-0.237, 1.743) .. controls (-0.237, 1.712) and (-0.157, 1.712) .. (-0.157, 1.743) .. controls (-0.157, 1.802) and (-0.237, 1.802) .. (-0.237, 1.743) -- cycle;
+ \sloth@part@draw[\sloth@eyelid] (-0.237, 1.743) .. controls (-0.237, 1.712) and (-0.157, 1.712) .. (-0.157, 1.743) .. controls (-0.157, 1.802) and (-0.237, 1.802) .. (-0.237, 1.743) -- cycle;
\else% sleeping
\sloth@part@draw[\sloth@eye] (0.193,1.75) circle[radius=0.04];
\sloth@part@draw[\sloth@eye] (-0.193,1.75) circle[radius=0.04];
@@ -198,14 +208,18 @@
\fi% sleeping
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sloth@part@draw[\sloth@body!40!black] (0,1.665) ellipse[x radius=0.078, y radius=0.048];
+ \sloth@part@draw[sloth@bright10!40!black] (0,1.665) ellipse[x radius=0.078, y radius=0.048];
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \draw[\sloth@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.55) arc [start angle=-40, end angle=-140, radius=0.16];
+ \ifsloth@openmouth
+ \filldraw[\sloth@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.55) arc [start angle=-40, end angle=-140, radius=0.16];
+ \else
+ \draw[\sloth@mouth,line width=\scalingfactor*0.4pt] (0.115, 1.55) arc [start angle=-40, end angle=-140, radius=0.16];
+ \fi
%
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sloth@part@draw[\sloth@body] (-0.50, 1.24) .. controls (-0.54, 1.24) and (-0.55, 1.20) .. (-0.56, 1.17) .. controls (-0.61, 1.06) and (-0.63, 0.95) .. (-0.64, 0.83) .. controls (-0.64, 0.80) and (-0.64, 0.77) .. (-0.63, 0.74) .. controls (-0.57, 0.66) and (-0.47, 0.60) .. (-0.38, 0.56) .. controls (-0.31, 0.54) and (-0.23, 0.52) .. (-0.16, 0.54) .. controls (-0.12, 0.54) and (-0.10, 0.59) .. (-0.13, 0.61) .. controls (-0.17, 0.68) and (-0.24, 0.73) .. (-0.30, 0.77) .. controls (-0.34, 0.79) and (-0.38, 0.81) .. (-0.42, 0.83) .. controls (-0.41, 0.92) and (-0.41, 1.01) .. (-0.42, 1.09) .. controls (-0.43, 1.14) and (-0.44, 1.19) .. (-0.48, 1.23) .. controls (-0.48, 1.24) and (-0.49, 1.24) .. (-0.50, 1.24) -- cycle;
- \sloth@part@draw[\sloth@body] (0.50, 1.24) .. controls (0.54, 1.24) and (0.55, 1.20) .. (0.56, 1.17) .. controls (0.61, 1.06) and (0.63, 0.95) .. (0.64, 0.83) .. controls (0.64, 0.80) and (0.64, 0.77) .. (0.63, 0.74) .. controls (0.57, 0.66) and (0.47, 0.60) .. (0.38, 0.56) .. controls (0.31, 0.54) and (0.23, 0.52) .. (0.16, 0.54) .. controls (0.12, 0.54) and (0.10, 0.59) .. (0.13, 0.61) .. controls (0.17, 0.68) and (0.24, 0.73) .. (0.30, 0.77) .. controls (0.34, 0.79) and (0.38, 0.81) .. (0.42, 0.83) .. controls (0.41, 0.92) and (0.41, 1.01) .. (0.42, 1.09) .. controls (0.43, 1.14) and (0.44, 1.19) .. (0.48, 1.23) .. controls (0.48, 1.24) and (0.49, 1.24) .. (0.50, 1.24) -- cycle;
+ \sloth@part@draw[sloth@bright10] (-0.50, 1.24) .. controls (-0.54, 1.24) and (-0.55, 1.20) .. (-0.56, 1.17) .. controls (-0.61, 1.06) and (-0.63, 0.95) .. (-0.64, 0.83) .. controls (-0.64, 0.80) and (-0.64, 0.77) .. (-0.63, 0.74) .. controls (-0.57, 0.66) and (-0.47, 0.60) .. (-0.38, 0.56) .. controls (-0.31, 0.54) and (-0.23, 0.52) .. (-0.16, 0.54) .. controls (-0.12, 0.54) and (-0.10, 0.59) .. (-0.13, 0.61) .. controls (-0.17, 0.68) and (-0.24, 0.73) .. (-0.30, 0.77) .. controls (-0.34, 0.79) and (-0.38, 0.81) .. (-0.42, 0.83) .. controls (-0.41, 0.92) and (-0.41, 1.01) .. (-0.42, 1.09) .. controls (-0.43, 1.14) and (-0.44, 1.19) .. (-0.48, 1.23) .. controls (-0.48, 1.24) and (-0.49, 1.24) .. (-0.50, 1.24) -- cycle;
+ \sloth@part@draw[sloth@bright10] (0.50, 1.24) .. controls (0.54, 1.24) and (0.55, 1.20) .. (0.56, 1.17) .. controls (0.61, 1.06) and (0.63, 0.95) .. (0.64, 0.83) .. controls (0.64, 0.80) and (0.64, 0.77) .. (0.63, 0.74) .. controls (0.57, 0.66) and (0.47, 0.60) .. (0.38, 0.56) .. controls (0.31, 0.54) and (0.23, 0.52) .. (0.16, 0.54) .. controls (0.12, 0.54) and (0.10, 0.59) .. (0.13, 0.61) .. controls (0.17, 0.68) and (0.24, 0.73) .. (0.30, 0.77) .. controls (0.34, 0.79) and (0.38, 0.81) .. (0.42, 0.83) .. controls (0.41, 0.92) and (0.41, 1.01) .. (0.42, 1.09) .. controls (0.43, 1.14) and (0.44, 1.19) .. (0.48, 1.23) .. controls (0.48, 1.24) and (0.49, 1.24) .. (0.50, 1.24) -- cycle;
%
\ifsloth@contour
\draw[\sloth@contour,fill=white,line width=\scalingfactor*0.4pt] (0.15, 0.61) ellipse[x radius=0.017, y radius=0.07, rotate=110];
@@ -216,18 +230,18 @@
\draw[\sloth@contour,fill=white,line width=\scalingfactor*0.4pt] (-0.17, 0.57) ellipse[x radius=0.015, y radius=0.07, rotate=-117];
\draw[\sloth@contour,fill=white,line width=\scalingfactor*0.4pt] (-0.19, 0.53) ellipse[x radius=0.012, y radius=0.062, rotate=-125];
\else% contour
- \fill[\sloth@body!50!black] (0.15, 0.61) ellipse[x radius=0.017, y radius=0.07, rotate=110];
- \fill[\sloth@body!50!black] (0.17, 0.57) ellipse[x radius=0.015, y radius=0.07, rotate=117];
- \fill[\sloth@body!50!black] (0.19, 0.53) ellipse[x radius=0.012, y radius=0.062, rotate=125];
+ \fill[sloth@bright10!50!black] (0.15, 0.61) ellipse[x radius=0.017, y radius=0.07, rotate=110];
+ \fill[sloth@bright10!50!black] (0.17, 0.57) ellipse[x radius=0.015, y radius=0.07, rotate=117];
+ \fill[sloth@bright10!50!black] (0.19, 0.53) ellipse[x radius=0.012, y radius=0.062, rotate=125];
%
- \fill[\sloth@body!50!black] (-0.15, 0.61) ellipse[x radius=0.017, y radius=0.07, rotate=-110];
- \fill[\sloth@body!50!black] (-0.17, 0.57) ellipse[x radius=0.015, y radius=0.07, rotate=-117];
- \fill[\sloth@body!50!black] (-0.19, 0.53) ellipse[x radius=0.012, y radius=0.062, rotate=-125];
+ \fill[sloth@bright10!50!black] (-0.15, 0.61) ellipse[x radius=0.017, y radius=0.07, rotate=-110];
+ \fill[sloth@bright10!50!black] (-0.17, 0.57) ellipse[x radius=0.015, y radius=0.07, rotate=-117];
+ \fill[sloth@bright10!50!black] (-0.19, 0.53) ellipse[x radius=0.012, y radius=0.062, rotate=-125];
\fi% contour
%
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \sloth@part@draw[\sloth@body] (0.33,0.31) ellipse[x radius=0.25, y radius=0.13, rotate=25];
- \sloth@part@draw[\sloth@body] (-0.33,0.31) ellipse[x radius=0.25, y radius=0.13, rotate=-25];
+ \sloth@part@draw[sloth@bright10] (0.33,0.31) ellipse[x radius=0.25, y radius=0.13, rotate=25];
+ \sloth@part@draw[sloth@bright10] (-0.33,0.31) ellipse[x radius=0.25, y radius=0.13, rotate=-25];
%
\ifsloth@contour
\draw[\sloth@contour,fill=white,line width=\scalingfactor*0.4pt] (-0.125,0.265) ellipse[x radius=0.07, y radius=0.019, rotate=-10];
@@ -237,12 +251,12 @@
\draw[\sloth@contour,fill=white,line width=\scalingfactor*0.4pt] (0.14,0.21) ellipse[x radius=0.07, y radius=0.017, rotate=16];
\draw[\sloth@contour,fill=white,line width=\scalingfactor*0.4pt] (0.16,0.165) ellipse[x radius=0.07, y radius=0.015, rotate=22];
\else% contour
- \fill[\sloth@body!50!black] (-0.125,0.265) ellipse[x radius=0.07, y radius=0.019, rotate=-10];
- \fill[\sloth@body!50!black] (-0.14,0.21) ellipse[x radius=0.07, y radius=0.017, rotate=-16];
- \fill[\sloth@body!50!black] (-0.16,0.165) ellipse[x radius=0.07, y radius=0.015, rotate=-22];
- \fill[\sloth@body!50!black] (0.125,0.265) ellipse[x radius=0.07, y radius=0.019, rotate=10];
- \fill[\sloth@body!50!black] (0.14,0.21) ellipse[x radius=0.07, y radius=0.017, rotate=16];
- \fill[\sloth@body!50!black] (0.16,0.165) ellipse[x radius=0.07, y radius=0.015, rotate=22];
+ \fill[sloth@bright10!50!black] (-0.125,0.265) ellipse[x radius=0.07, y radius=0.019, rotate=-10];
+ \fill[sloth@bright10!50!black] (-0.14,0.21) ellipse[x radius=0.07, y radius=0.017, rotate=-16];
+ \fill[sloth@bright10!50!black] (-0.16,0.165) ellipse[x radius=0.07, y radius=0.015, rotate=-22];
+ \fill[sloth@bright10!50!black] (0.125,0.265) ellipse[x radius=0.07, y radius=0.019, rotate=10];
+ \fill[sloth@bright10!50!black] (0.14,0.21) ellipse[x radius=0.07, y radius=0.017, rotate=16];
+ \fill[sloth@bright10!50!black] (0.16,0.165) ellipse[x radius=0.07, y radius=0.015, rotate=22];
\fi% contour
%
\fi% back
@@ -265,52 +279,57 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-sloths}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-sloths}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic sloth}}
%\sloth
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic sloth can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\sloth[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\sloth[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\sloth[mouth=red]
%\end{tcblisting}
%
+% The sloth can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\sloth[openmouth]
+%\end{tcblisting}
+%
%If tired, the sloth can take a nap:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Sleep}}
%\sloth[sleeping]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eyelid colour}}
%\sloth[sleeping,eyelid=red]
%\end{tcblisting}
%
%To view the sloth from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\sloth[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the sloth 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the sloth 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\sloth[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\sloth[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-snowmen.sty b/graphics/pgf/contrib/tikzlings/tikzlings-snowmen.sty
index a95bda001c..600b17227a 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-snowmen.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-snowmen.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-snowmen}[2022/06/17 version v1.0 Draw snowmen in TikZ]
+\ProvidesPackage{tikzlings-snowmen}[2025/01/05 version v2.2 Draw snowmen in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -26,13 +26,14 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname snowmanhookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifsnowman@threeD
\newif\ifsnowman@back
\newif\ifsnowman@globalwarming
\newif\ifsnowman@contour
+\newif\ifsnowman@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -56,29 +57,31 @@
mouth/.store in = \snowman@mouth,
mouth = black,
buttons/.store in = \snowman@buttons,
- buttons = black,
+ buttons = black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \snowman@threeDtrue,
+ openmouth/.code = \snowman@openmouthtrue,
+ open mouth/.forward to = /snowman/openmouth,
+ 3D/.code = \snowman@threeDtrue,
back/.code = \snowman@backtrue,
globalwarming/.code= \snowman@globalwarmingtrue
\def\snowman@globalwarming{#1},
- globalwarming/.default = blue!10!white,
+ globalwarming/.default = blue!10!white,
global warming/.forward to = /snowman/globalwarming,
contour/.code = \snowman@contourtrue
\def\snowman@contour{#1}
\def\snowman@mouth{#1},
- contour/.default = black,
- outline/.forward to = /snowman/contour,
+ contour/.default = black,
+ outline/.forward to = /snowman/contour,
}
\def\snowman@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.75, 0.0) rectangle (0.75, 2.13);
@@ -95,7 +98,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -113,7 +116,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -135,25 +138,25 @@
\csname tikzlinghookbelly\endcsname
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \fill[\snowman@mouth] (0,1.23) circle[radius=0.025];
- \fill[\snowman@mouth] (0.06,1.3) circle[radius=0.025];
- \fill[\snowman@mouth] (-0.06,1.27) circle[radius=0.025];
- \fill[\snowman@mouth] (0.09,1.37) circle[radius=0.025];
- \fill[\snowman@mouth] (-0.18,1.28) circle[radius=0.025];
- \fill[\snowman@mouth] (0.2,1.28) circle[radius=0.025];
+ \fill[\snowman@mouth] (0,1.23) circle[radius=0.025];
+ \fill[\snowman@mouth] (0.06,1.3) circle[radius=0.025];
+ \fill[\snowman@mouth] (-0.06,1.27) circle[radius=0.025];
+ \fill[\snowman@mouth] (0.09,1.37) circle[radius=0.025];
+ \fill[\snowman@mouth] (-0.18,1.28) circle[radius=0.025];
+ \fill[\snowman@mouth] (0.2,1.28) circle[radius=0.025];
\fill[\snowman@mouth] (-0.25,1.2) circle[radius=0.025];
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \snowman@part@draw[\snowman@eye] (-0.5,1.75) circle[radius=0.06];
- \snowman@part@draw[\snowman@eye] (-0.1,1.55) circle[radius=0.06];
+ \snowman@part@draw[\snowman@eye] (-0.5,1.75) circle[radius=0.06];
+ \snowman@part@draw[\snowman@eye] (-0.1,1.55) circle[radius=0.06];
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \snowman@part@draw[\snowman@nose] (-0.6,1.4) -- (-0.8,1.42) -- (-0.6,1.54) (-0.6,1.4) arc[radius=0.07, start angle=-90, end angle=90];
+ \snowman@part@draw[\snowman@nose] (-0.6,1.4) -- (-0.8,1.42) -- (-0.6,1.54) (-0.6,1.4) arc[radius=0.07, start angle=-90, end angle=90];
%
% Buttons %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\snowman@part@draw[\snowman@buttons] (0.1,0.8) circle[radius=0.06];
\snowman@part@draw[\snowman@buttons] (-0.15,0.55) circle[radius=0.06];
- \snowman@part@draw[\snowman@buttons] (0,0.25) circle[radius=0.06];
+ \snowman@part@draw[\snowman@buttons] (0,0.25) circle[radius=0.06];
%
% normal snowman %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\else% global warming
@@ -165,7 +168,7 @@
% Body + Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\snowman@part@draw[\snowman@body] (0,0.5) ellipse[x radius=0.6, y radius=0.5];
\snowman@part@draw[\snowman@body] (0,1.1) ellipse[x radius=0.5, y radius=0.4];
- \snowman@part@draw[\snowman@body] (0,1.7) circle[radius=0.4];
+ \snowman@part@draw[\snowman@body] (0,1.7) circle[radius=0.4];
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname snowmanhookbelly\endcsname
@@ -182,18 +185,25 @@
\fill[\snowman@mouth] (-0.08,1.522) circle[radius=0.016];
\fill[\snowman@mouth] (0.12,1.543) circle[radius=0.016];
\fill[\snowman@mouth] (-0.12,1.543) circle[radius=0.016];
+ \ifsnowman@openmouth
+ \fill[\snowman@mouth] (0,1.57) circle[radius=0.016];
+ \fill[\snowman@mouth] (-0.04,1.565) circle[radius=0.016];
+ \fill[\snowman@mouth] (-0.08,1.56) circle[radius=0.016];
+ \fill[\snowman@mouth] (0.04,1.565) circle[radius=0.016];
+ \fill[\snowman@mouth] (0.08,1.56) circle[radius=0.016];
+ \fi
%
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \snowman@part@draw[\snowman@eye] (-0.155,1.8) circle[radius=0.04];
- \snowman@part@draw[\snowman@eye] (0.155,1.8) circle[radius=0.04];
+ \snowman@part@draw[\snowman@eye] (-0.155,1.8) circle[radius=0.04];
+ \snowman@part@draw[\snowman@eye] (0.155,1.8) circle[radius=0.04];
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\snowman@part@draw[\snowman@nose] (0,1.72) arc [radius=0.05, start angle=90, end angle=270] (0,1.62) -- (0.15,1.64) -- (0,1.72);
%
% Buttons %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \snowman@part@draw[\snowman@buttons] (0,1.15) circle[radius=0.04];
- \snowman@part@draw[\snowman@buttons] (0,0.95) circle[radius=0.04];
- \snowman@part@draw[\snowman@buttons] (0,0.75) circle[radius=0.04];
+ \snowman@part@draw[\snowman@buttons] (0,1.15) circle[radius=0.04];
+ \snowman@part@draw[\snowman@buttons] (0,0.95) circle[radius=0.04];
+ \snowman@part@draw[\snowman@buttons] (0,0.75) circle[radius=0.04];
%
\fi% back
%
@@ -217,55 +227,60 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-snowmen}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-snowmen}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic snowman}}
%\snowman
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic snowman can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\snowman[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of various body parts can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\snowman[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Nose colour}}
%\snowman[nose=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Mouth colour}}
%\snowman[mouth=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Button colour}}
%\snowman[buttons=red]
%\end{tcblisting}
%
+% The snowman can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\snowman[openmouth]
+%\end{tcblisting}
+%
%The biggest enemy of the snowman are raising temperatures:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Global warming}}
%\snowman[globalwarming,tophat]
%\end{tcblisting}
%
%To view the snowman from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\snowman[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the snowman 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the snowman 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\snowman[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\snowman[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-squirrels.sty b/graphics/pgf/contrib/tikzlings/tikzlings-squirrels.sty
index 0852a3fd92..7f132d7585 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-squirrels.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-squirrels.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-squirrels}[2022/06/17 version v1.0 Drawing squirrels in TikZ]
+\ProvidesPackage{tikzlings-squirrels}[2025/01/05 version v2.2 Drawing squirrels in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -29,8 +29,11 @@
}
\newif\ifsquirrel@threeD
+\newif\ifsquirrel@leftstep
+\newif\ifsquirrel@rightstep
\newif\ifsquirrel@back
\newif\ifsquirrel@contour
+\newif\ifsquirrel@openmouth
\tikzset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -48,16 +51,25 @@
body/.store in = \squirrel@body,
body = brown!40!gray!90!red,
eye/.store in = \squirrel@eye,
- eye = white,
+ eye = white,
pupil/.store in = \squirrel@pupil,
- pupil = black,
+ pupil = black,
+ mouth/.store in = \squirrel@mouth,
+ mouth = \squirrel@body!70!brown!60!black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- 3D/.code = \squirrel@threeDtrue,
- back/.code = \squirrel@backtrue,
+ openmouth/.code = \squirrel@openmouthtrue,
+ open mouth/.forward to = /squirrel/openmouth,
+ 3D/.code = \squirrel@threeDtrue
+ \def\squirrel@mouth{\squirrel@body!40!black},
+ leftstep/.code = \squirrel@leftsteptrue,
+ left step/.forward to = /squirrel/leftstep,
+ rightstep/.code = \squirrel@rightsteptrue,
+ right step/.forward to = /squirrel/rightstep,
+ back/.code = \squirrel@backtrue,
contour/.code = \squirrel@contourtrue
\def\squirrel@contour{#1},
contour/.default = black,
@@ -67,7 +79,7 @@
\def\squirrel@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.53,0.1) rectangle (1.12,2.15);
%
@@ -83,7 +95,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -101,16 +113,24 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname squirrelhookbackground\endcsname
\csname tikzlinghookbackground\endcsname
- %
+ %
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
- \squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \ifsquirrel@leftstep
+ \squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (-0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \else% step
+ \squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \fi% step
+ \ifsquirrel@rightstep
+ \squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \else% step
+ \squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \fi% step
%
% Tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifsquirrel@back
@@ -119,8 +139,7 @@
\fi% back
%
% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \squirrel@part@draw[\squirrel@body]
- (0.5,0.5) .. controls (0.5,0.09) and (-0.5,0.09) .. (-0.5,0.5) .. controls (-0.5,0.85) and (-0.25,1.6) .. (0,1.7) .. controls (0.25,1.6) and (0.5,0.85) .. (0.5,0.5) -- cycle;
+ \squirrel@part@draw[\squirrel@body] (0.5,0.5) .. controls (0.5,0.09) and (-0.5,0.09) .. (-0.5,0.5) .. controls (-0.5,0.85) and (-0.25,1.6) .. (0,1.7) .. controls (0.25,1.6) and (0.5,0.85) .. (0.5,0.5) -- cycle;
%
% Belly %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifsquirrel@back
@@ -132,17 +151,16 @@
\csname tikzlinghookbelly\endcsname
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (0.1920,1.9906) .. controls (0.1657,2.0780) and (0.1839,2.1332) .. (0.1839,2.1332) .. controls (0.1839,2.1332) and (0.1123,2.1773) .. (0.0941,2.0720) .. controls (0.0716,2.0156) and (0.0753,1.9519) .. (0.1023,1.9293) .. controls (0.1293,1.9068) and (0.1696,1.9342) .. (0.1920,1.9906) -- cycle;
- \squirrel@part@draw[\squirrel@body!70!brown!50!darkgray]
- (-0.1920,1.9906) .. controls (-0.1657,2.0780) and (-0.1839,2.1332) .. (-0.1839,2.1332) .. controls (-0.1839,2.1332) and (-0.1123,2.1773) .. (-0.0941,2.0720) .. controls (-0.0716,2.0156) and (-0.0753,1.9519) .. (-0.1023,1.9293) .. controls (-0.1293,1.9068) and (-0.1696,1.9342) .. (-0.1920,1.9906) -- cycle;
+ \squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (0.1920,1.9906) .. controls (0.1657,2.0780) and (0.1839,2.1332) .. (0.1839,2.1332) .. controls (0.1839,2.1332) and (0.1123,2.1773) .. (0.0941,2.0720) .. controls (0.0716,2.0156) and (0.0753,1.9519) .. (0.1023,1.9293) .. controls (0.1293,1.9068) and (0.1696,1.9342) .. (0.1920,1.9906) -- cycle;
+ \squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (-0.1920,1.9906) .. controls (-0.1657,2.0780) and (-0.1839,2.1332) .. (-0.1839,2.1332) .. controls (-0.1839,2.1332) and (-0.1123,2.1773) .. (-0.0941,2.0720) .. controls (-0.0716,2.0156) and (-0.0753,1.9519) .. (-0.1023,1.9293) .. controls (-0.1293,1.9068) and (-0.1696,1.9342) .. (-0.1920,1.9906) -- cycle;
%
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifsquirrel@contour
- \squirrel@part@draw[\squirrel@body] (0,1.75) circle[radius=0.3];
- \squirrel@part@draw[\squirrel@body] (0.2,1.6) circle[radius=0.15];
+ \squirrel@part@draw[\squirrel@body] (0,1.75) circle[radius=0.3];
+ \squirrel@part@draw[\squirrel@body] (0.2,1.6) circle[radius=0.15];
\squirrel@part@draw[\squirrel@body] (-0.2,1.6) circle[radius=0.15];
\ifsquirrel@back
- \squirrel@part@draw[\squirrel@body] (0,1.75) circle[radius=0.3];
+ \squirrel@part@draw[\squirrel@body] (0,1.75) circle[radius=0.3];
\fi% back
\else% contour
\squirrel@part@draw[\squirrel@body] (0,1.75) circle[radius=0.3] (0.2,1.6) circle[radius=0.15] (-0.2,1.6) circle[radius=0.15];
@@ -156,7 +174,7 @@
%
% Nose %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\squirrel@part@draw[\squirrel@body!70!brown!60!black] (0,1.66) ellipse[x radius=0.06, y radius=0.03];
- %
+ %
% Eyes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\squirrel@part@draw[\squirrel@eye] (0.07,1.78) ellipse[x radius=0.05, y radius=0.07];
\squirrel@part@draw[\squirrel@eye] (-0.07,1.78) ellipse[x radius=0.05, y radius=0.07];
@@ -165,15 +183,19 @@
%
% Mouth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifsquirrel@contour
+ \draw[\squirrel@contour,fill=white,line width=\scalingfactor*0.4pt] (-0.15,1.61) .. controls (-0.15,1.61) and (-0.15,1.52) .. (0.0,1.61) .. controls (0.15,1.52) and (0.15,1.61) .. (0.15,1.61) (0.15,1.61) arc [start angle=-20, end angle=-160, radius=0.16];
\draw[\squirrel@contour,fill=white,line width=\scalingfactor*0.4pt] (-0.025,1.567) rectangle ++(0.02,0.03);
\draw[\squirrel@contour,fill=white,line width=\scalingfactor*0.4pt] (0.025,1.567) rectangle ++(-0.02,0.03);
\draw[\squirrel@contour,line width=\scalingfactor*0.4pt] (-0.15,1.61) .. controls (-0.15,1.61) and (-0.15,1.52) .. (0.0,1.61) .. controls (0.15,1.52) and (0.15,1.61) .. (0.15,1.61);
\else% contour
+ \ifsquirrel@openmouth
+ \filldraw[\squirrel@mouth,line width=\scalingfactor*0.4pt] (-0.15,1.61) .. controls (-0.15,1.61) and (-0.15,1.52) .. (0.0,1.61) .. controls (0.15,1.52) and (0.15,1.61) .. (0.15,1.61) (0.15,1.61) arc [start angle=-20, end angle=-160, radius=0.16];
+ \fi% open mouth
\fill[white] (-0.025,1.567) rectangle ++(0.02,0.03);
\fill[white] (0.025,1.567) rectangle ++(-0.02,0.03);
- \draw[\squirrel@body!70!brown!60!black,line width=\scalingfactor*0.4pt] (-0.15,1.61) .. controls (-0.15,1.61) and (-0.15,1.52) .. (0.0,1.61) .. controls (0.15,1.52) and (0.15,1.61) .. (0.15,1.61);
+ \draw[\squirrel@mouth,line width=\scalingfactor*0.4pt] (-0.15,1.61) .. controls (-0.15,1.61) and (-0.15,1.52) .. (0.0,1.61) .. controls (0.15,1.52) and (0.15,1.61) .. (0.15,1.61);
\fi% contour
- %
+ %
% Arms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (0.2,0.85) ellipse[x radius=0.22, y radius=0.11, rotate=70];
\squirrel@part@draw[\squirrel@body!70!brown!50!darkgray] (-0.2,0.85) ellipse[x radius=0.22, y radius=0.11, rotate=-70];
@@ -183,7 +205,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname squirrelhookbody\endcsname
\csname tikzlinghookbody\endcsname
- %
+ %
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -198,44 +220,58 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-squirrels}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-squirrels}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic squirrel}}
%\squirrel
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic squirrel can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\squirrel[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of the eyes can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\squirrel[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil colour}}
%\squirrel[pupil=red]
%\end{tcblisting}
+%\begin{tcblisting}{title={Mouth colour}}
+%\squirrel[mouth=red]
+%\end{tcblisting}
+%
+% The squirrel can open its mouth:
+%\begin{tcblisting}{title={Open mouth}}
+%\squirrel[openmouth]
+%\end{tcblisting}
+%
+%And the squirrel can lift its legs:
+%\begin{tcblisting}{title={Walking}}
+%\squirrel[leftstep]
+%\squirrel[rightstep,xshift=2cm]
+%\end{tcblisting}
%
%To view the squirrel from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\squirrel[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the squirrel 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the squirrel 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\squirrel[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\squirrel[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings-wolves.sty b/graphics/pgf/contrib/tikzlings/tikzlings-wolves.sty
index 060e7b21f2..f4bf79719a 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings-wolves.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings-wolves.sty
@@ -9,10 +9,10 @@
%% https://github.com/samcarter/tikzlings
%%
%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
+%% See https://www.latex-project.org/lppl.txt
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings-wolves}[2022/06/17 version v1.0 Drawing wolves in TikZ]
+\ProvidesPackage{tikzlings-wolves}[2025/01/05 version v2.2 Drawing wolves in TikZ]
\RequirePackage{tikz}
\RequirePackage{tikzlings-addons}
@@ -27,7 +27,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname wolfhookforeground\endcsname
\csname tikzlinghookforeground\endcsname
- %
+ %
}
\newif\ifwolf@threeD
@@ -53,9 +53,9 @@
body/.store in = \wolf@body,
body = gray!90!white,
eye/.store in = \wolf@eye,
- eye = white,
+ eye = white,
pupil/.store in = \wolf@pupil,
- pupil = black,
+ pupil = black,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% options
@@ -69,18 +69,18 @@
leftstep/.code = \wolf@leftsteptrue,
left step/.forward to = /wolf/leftstep,
rightstep/.code = \wolf@rightsteptrue,
- right step/.forward to = /wolf/rightstep,
- back/.code = \wolf@backtrue,
+ right step/.forward to = /wolf/rightstep,
+ back/.code = \wolf@backtrue,
contour/.code = \wolf@contourtrue
\def\wolf@contour{#1},
- contour/.default = black,
- outline/.forward to = /wolf/contour,
+ contour/.default = black,
+ outline/.forward to = /wolf/contour,
}
\def\wolf@draw{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
- % minimal bounding box size
+ % minimal bounding box size
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\path (-0.625,0.1) rectangle (0.905, 2.17);
@@ -97,7 +97,7 @@
\pgfmathsetmacro{\yscalefactor}{\tmpscaleD}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
+ %
% switch between 2D, 3D and contours, from
% https://chat.stackexchange.com/transcript/message/45991801#45991801
%
@@ -115,32 +115,32 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Body parts
- %
+ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname wolfhookbackground\endcsname
\csname tikzlinghookbackground\endcsname
- %
+ %
% Feet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifwolf@leftstep
- \wolf@part@draw[\wolf@body!65!white] (-0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \wolf@part@draw[\wolf@body!65!white] (-0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
\else% step
- \wolf@part@draw[\wolf@body!65!white] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \wolf@part@draw[\wolf@body!65!white] (-0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
\fi% step
%
\ifwolf@rightstep
- \wolf@part@draw[\wolf@body!65!white] (0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
+ \wolf@part@draw[\wolf@body!65!white] (0.255,0.25) ellipse[x radius=0.23, y radius=0.09];
\else% step
- \wolf@part@draw[\wolf@body!65!white] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
+ \wolf@part@draw[\wolf@body!65!white] (0.255,0.2) ellipse[x radius=0.23, y radius=0.09];
\fi% step
%
% Ears %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\wolf@part@draw[\wolf@body] (0.22, 2.0392) .. controls (0.22, 2.1584) and (0.49460, 2.255) .. (0.49460, 2.255) .. controls (0.49460, 2.255) and (0.5300, 1.86) .. (0.3721, 1.86) .. controls (0.2891, 1.86) and (0.22, 1.9201) .. (0.22, 2.0392) -- cycle;
- \wolf@part@draw[\wolf@body!55!white] (0.22, 2.0392) .. controls (0.26, 2.1584) and (0.47, 2.22) .. (0.47, 2.20) .. controls (0.47, 2.2) and (0.49, 1.9) .. (0.3721, 1.9) .. controls (0.2891, 1.88) and (0.22, 1.88) .. (0.22, 2.0392) -- cycle;
+ \wolf@part@draw[\wolf@body!55!white] (0.22, 2.0392) .. controls (0.26, 2.1584) and (0.47, 2.22) .. (0.47, 2.20) .. controls (0.47, 2.2) and (0.49, 1.9) .. (0.3721, 1.9) .. controls (0.2891, 1.88) and (0.22, 1.88) .. (0.22, 2.0392) -- cycle;
\wolf@part@draw[\wolf@body] (-0.22, 2.0392) .. controls (-0.22, 2.1584) and (-0.49460, 2.255) .. (-0.49460, 2.255) .. controls (-0.49460, 2.255) and (-0.5300, 1.86) .. (-0.3721, 1.86) .. controls (-0.2891, 1.86) and (-0.22, 1.9201) .. (-0.22, 2.0392) -- cycle;
- \wolf@part@draw[\wolf@body!55!white] (-0.22, 2.0392) .. controls (-0.26, 2.1584) and (-0.47, 2.22) .. (-0.47, 2.20) .. controls (-0.47, 2.2) and (-0.49, 1.9) .. (-0.3721, 1.9) .. controls (-0.2891, 1.88) and (-0.22, 1.88) .. (-0.22, 2.0392) -- cycle;
- %
+ \wolf@part@draw[\wolf@body!55!white] (-0.22, 2.0392) .. controls (-0.26, 2.1584) and (-0.47, 2.22) .. (-0.47, 2.20) .. controls (-0.47, 2.2) and (-0.49, 1.9) .. (-0.3721, 1.9) .. controls (-0.2891, 1.88) and (-0.22, 1.88) .. (-0.22, 2.0392) -- cycle;
+ %
% Tail %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\unless\ifwolf@back
\wolf@part@draw[\wolf@body!50!darkgray] (1.0893, 1.5779) .. controls (0.3433, 1.6612) and (0.4863, 0.6062) .. (-0.0243, 0.348) .. controls (1.0671, 0.068) and (0.8133, 1.1808) .. (1.0893, 1.5779) -- cycle;
@@ -161,7 +161,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname wolfhookbelly\endcsname
\csname tikzlinghookbelly\endcsname
- %
+ %
% Head %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifwolf@back
\wolf@part@draw[\wolf@body!70!white!95!brown] (0.5, 1.8) .. controls (0.5, 1.58) and (0.2, 1.35) .. (0, 1.35) .. controls (-0.2, 1.35) and (-0.5, 1.58) .. (-0.5, 1.8) .. controls (-0.34, 2.3) and (0.34, 2.3) .. (0.5, 1.8) -- cycle;
@@ -202,7 +202,7 @@
% adding hook for users to customise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\csname wolfhookbody\endcsname
\csname tikzlinghookbody\endcsname
- %
+ %
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -217,55 +217,55 @@
%
%\subsection{Package name}
%
-%\begin{tcolorbox}[lower separated=false, lefthand width=.8\linewidth]
-%\vspace*{0.5cm}
-%\lstinline|\usepackage{tikzlings-wolves}|
-%\vspace*{0.5cm}
+%\begin{tcolorbox}[title={Package usage}]
+%\begin{samcode}
+%\usepackage{tikzlings-wolves}
+%\end{samcode}
%\end{tcolorbox}
%
%\subsection{Basic Usage}
%
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Basic wolf}}
%\wolf
%\end{tcblisting}
%
%\subsection{Options}
%
%The basic wolf can be modified by changing its colour:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Body colour}}
%\wolf[body=blue]
%\end{tcblisting}
%
%In addition to the colour of the body, the colour of the eyes can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Eye colour}}
%\wolf[eye=red]
%\end{tcblisting}
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Pupil Colour}}
%\wolf[pupil=red]
%\end{tcblisting}
%
%The rotation angle of its arms can be adjusted:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Rotating the arms}}
%\wolf[rotatearms=40]
%\end{tcblisting}
%
%And the wolf can lift its legs:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Walking}}
%\wolf[leftstep]
%\wolf[rightstep,xshift=2cm]
%\end{tcblisting}
%
%To view the wolf from behind:
-%\begin{tcblisting}{}
+%\begin{tcblisting}{title={Back view}}
%\wolf[back]
%\end{tcblisting}
%
-%The key \lstinline|3D| will make the wolf 3-dimensional:
-%\begin{tcblisting}{}
+%The key \saminline|3D| will make the wolf 3-dimensional:
+%\begin{tcblisting}{title={3D view}}
%\wolf[3D]
%\end{tcblisting}
%
-%And finally the \lstinline|contour| key will only draw the outlines:
-%\begin{tcblisting}{}
+%And finally the \saminline|contour| key will only draw the outlines:
+%\begin{tcblisting}{title={Contours}}
%\wolf[contour=black]
%\end{tcblisting}
diff --git a/graphics/pgf/contrib/tikzlings/tikzlings.sty b/graphics/pgf/contrib/tikzlings/tikzlings.sty
index ecd7562fb8..4db7af570a 100644
--- a/graphics/pgf/contrib/tikzlings/tikzlings.sty
+++ b/graphics/pgf/contrib/tikzlings/tikzlings.sty
@@ -9,10 +9,10 @@
% https://github.com/samcarter/tikzlings
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzlings}[2022/06/17 version v1.0 Collection of packages to draw animals and other beings in TikZ]
+\ProvidesPackage{tikzlings}[2025/01/05 version v2.2 Collection of packages to draw animals and other beings in TikZ]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -49,13 +49,13 @@
\else
\ifdefined\pdfrandomseed % pdflatex
\else
- \ifdefined\randomseed
+ \ifdefined\randomseed
\let\pdfrandomseed\randomseed % post TL19 xelatex and lualatex
\else
\let\pdfrandomseed\time % pre TL19 xelatex
\fi
\fi
- \pgfmathsetseed{\number\pdfrandomseed}
+ \pgfmathsetseed{\number\pdfrandomseed}
\fi
% #1: tikzling name.
diff --git a/graphics/pgf/contrib/tikzmarmots/README.md b/graphics/pgf/contrib/tikzmarmots/README.md
index f9c865db22..eb987721e6 100644
--- a/graphics/pgf/contrib/tikzmarmots/README.md
+++ b/graphics/pgf/contrib/tikzmarmots/README.md
@@ -2,15 +2,15 @@
# TikZmarmots
-[![GitHub](https://img.shields.io/github/license/samcarter/tikzmarmots.svg?color=blue)](http://www.latex-project.org/lppl.txt)
-[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/samcarter/tikzmarmots.svg?label=current%20version)](https://github.com/samcarter/tikzmarmots/releases/latest)
-[![CTAN](https://img.shields.io/ctan/v/tikzmarmots.svg)](https://ctan.org/pkg/tikzmarmots)
+[![License](https://img.shields.io/github/license/samcarter/tikzmarmots.svg?color=blue)](https://www.latex-project.org/lppl.txt)
+[![GitHub tag](https://img.shields.io/github/tag/samcarter/tikzmarmots.svg?label=current%20version&color=blue)](https://github.com/samcarter/tikzmarmots/releases/latest)
+[![CTAN](https://img.shields.io/ctan/v/tikzmarmots.svg?color=blue)](https://ctan.org/pkg/tikzmarmots)
This is a little LaTeX package to draw marmots with TikZ.
> *Notice: this package has been merged into the TikZlings package and, starting with version 2.0, is now a wrapper around the `tikzlings-marmots` package. The previous version can be accessed via `\usepackage{tikzmarmots}[v1]`.*
-This project is licensed under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt .
+This project is licensed under the LaTeX Project Public License v1.3c or later, see https://www.latex-project.org/lppl.txt .
The project repository, including a bug tracker, can be found at https://github.com/samcarter/tikzmarmots .
diff --git a/graphics/pgf/contrib/tikzmarmots/tikzlibrarymarmots.code.tex b/graphics/pgf/contrib/tikzmarmots/tikzlibrarymarmots.code.tex
index 41b7f854c2..4b3e80e64b 100644
--- a/graphics/pgf/contrib/tikzmarmots/tikzlibrarymarmots.code.tex
+++ b/graphics/pgf/contrib/tikzmarmots/tikzlibrarymarmots.code.tex
@@ -8,7 +8,7 @@
% https://github.com/samcarter/tikzmarmots
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{tikzmarmots}
diff --git a/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc-settings.sty b/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc-settings.sty
index 3042db1f4a..dbe497f34b 100644
--- a/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc-settings.sty
+++ b/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc-settings.sty
@@ -21,7 +21,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{xcolor}
\definecolor{samyellow}{RGB}{246,193,65}
-\definecolor{samorange}{RGB}{241,147,45}
+\definecolor{samorange}{RGB}{241,147,45}% pgfplotsthemebeamer
\definecolor{samred}{RGB}{191,26,46}% TikZbricks
\definecolor{sammagenta}{RGB}{170,42,104}% TikZmarmots
\definecolor{samviolet}{RGB}{136,46,114}% TikZlings
@@ -58,72 +58,37 @@
\RequirePackage[bitstream-charter]{mathdesign}
\let\hrulefill\hrulefillx
\RequirePackage[hang,flushmargin,bottom]{footmisc}
- \RequirePackage[colorlinks=true,breaklinks=true,allcolors=themecolor]{hyperref}
+ \RequirePackage{footnotehyper}
+ \makesavenoteenv{tcolorbox}
\RequirePackage[all]{nowidow}
+ \RequirePackage[colorlinks=true,breaklinks=true,allcolors=themecolor,hyperfootnotes=false]{hyperref}
}
\RequirePackage[T1]{fontenc}
\RequirePackage{xspace}
\RequirePackage{inconsolata}% mono font with bold, but italic is missing
% \RequirePackage[scale=0.85]{cascadia-code}
% \AddToHook{cmd/ttfamily/before}{\fontseries{sl}}
+\usepackage{synthslant}% to fake slented comments in inconsolata
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Listings
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\RequirePackage[
- cachedir=./build/
-]{minted}
-
-% smuggling custom pygmentize style in cache folder
-% (a real pygmentise style would need installtion in some python folder)
-\begin{filecontents*}[noheader]{./build/sam.pygstyle}
-\makeatletter
-\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax%
- \let\PYG@ul=\relax \let\PYG@tc=\relax%
- \let\PYG@bc=\relax \let\PYG@ff=\relax}
-\def\PYG@tok#1{\csname PYG@tok@#1\endcsname}
-\def\PYG@toks#1+{\ifx\relax#1\empty\else%
- \PYG@tok{#1}\expandafter\PYG@toks\fi}
-\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{%
- \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}}
-\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}}
-
-% optional arguments
-\expandafter\def\csname PYG@tok@na\endcsname{\def\PYG@tc##1{\textcolor{black}{##1}}}
-
-% macros
-\expandafter\def\csname PYG@tok@k\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
-% curly brakets
-\expandafter\def\csname PYG@tok@nb\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
-
-% comments (italics won't work with the inconsolata font)
-\expandafter\def\csname PYG@tok@c\endcsname{\def\PYG@tc##1{\textcolor{gray}{##1}}}
-
-\def\PYGZbs{\char`\\}
-\def\PYGZus{\char`\_}
-\def\PYGZob{\char`\{}
-\def\PYGZcb{\char`\}}
-\def\PYGZca{\char`\^}
-\def\PYGZam{\char`\&}
-\def\PYGZlt{\char`\<}
-\def\PYGZgt{\char`\>}
-\def\PYGZsh{\char`\#}
-\def\PYGZpc{\char`\%}
-\def\PYGZdl{\char`\$}
-\def\PYGZhy{\char`\-}
-\def\PYGZsq{\char`\'}
-\def\PYGZdq{\char`\"}
-\def\PYGZti{\char`\~}
-% for compatibility with earlier versions
-\def\PYGZat{@}
-\def\PYGZlb{[}
-\def\PYGZrb{]}
-\makeatother
-\end{filecontents*}
+\RequirePackage[cachedir=./.minted]{minted}
+
+\AddToHook{env/MintedVerbatim/before}{%
+ % optional arguments
+ \@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor{black}{##1}}}%
+ % macros
+ \@namedef{PYG@tok@k}{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}%
+ % curly brakets
+ \@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}%
+ % comments (italics won't work with the inconsolata font)
+ \@namedef{PYG@tok@c}{\def\PYG@tc##1{\textcolor{gray}{\textsynthslant{##1}}}}%
+}
-\usemintedstyle{sam}
+\usemintedstyle{default}
\setminted{
breaksymbolleft={},
tabsize=2,
diff --git a/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.pdf b/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.pdf
index 708c67b774..7dec03ac3b 100644
--- a/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.pdf
+++ b/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.tex b/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.tex
index 6a0d533bd1..f3cdeb1da1 100644
--- a/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.tex
+++ b/graphics/pgf/contrib/tikzmarmots/tikzmarmots-doc.tex
@@ -8,18 +8,10 @@
% https://github.com/samcarter/tikzmarmots
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% !TeX program = txs:///arara
-% arara: latexmk: {
-% arara: --> engine: pdflatex,
-% arara: --> options: [
-% arara: --> '-shell-escape',
-% arara: --> '-synctex=1',
-% arara: --> '-interaction=nonstopmode',
-% arara: --> ]
-% arara: --> }
+% arara: latexmk
\documentclass{scrartcl}
% meta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -34,7 +26,7 @@
\url{https://github.com/samcarter/tikzmarmots}\\
\url{https://www.ctan.org/pkg/tikzmarmots}
}{samcarter}}
-\date{Version v2.1 \textendash{} 2024/04/24}
+\date{Version v2.2 \textendash{} 2024/12/11}
\usepackage[
themecolor=sammagenta
@@ -147,7 +139,7 @@ A more stable package version can be found on \CTAN (\url{www.ctan.org/pkg/tikzm
If you seek any other assistance (not bug reports/feature requests), I suggest asking on \href{https://tex.stackexchange.com}{TeX.Stackexchange}.
Copyright \raisebox{0.2em}{\tiny\fontfamily{cmr}\selectfont\textcopyright}
-\texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the LaTeX project public licence, version 1.3c or later \url{http://www.latex-project.org/lppl.txt}.
+\texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the LaTeX project public licence, version 1.3c or later \url{https://www.latex-project.org/lppl.txt}.
The shown example marmots are purely fictional characters, any resemblance to real marmots or persons is purely coincidental and no copyright infringement is intended.
@@ -229,9 +221,7 @@ The above list of available customisations does not sound very exhaustive, but t
As already said in the introduction, this package focuses on the marmots themselves and does not provide additional accessories.
However there is no need to despair! There are many accessories available from the \saminline|tikzlings-addons| package (\url{https://www.ctan.org/pkg/tikzlings}).
-\addtocounter{footnote}{1}
-\footnotetext[\thefootnote]{The Marmot Queen is inspired by \href{http://www.ilregnodeifanes.it/inglese/summary.htm}{The Fanes' saga}}
-\begin{tcblisting}{title={Marmot Queen$^{\thefootnote}$}}
+\begin{tcblisting}{title={Marmot Queen\footnote{The Marmot Queen is inspired by \href{http://www.ilregnodeifanes.it/inglese/summary.htm}{The Fanes' saga}}}}
%\usepackage{tikzlings-addons}
\begin{tikzpicture}
\marmot
@@ -250,6 +240,6 @@ The items can be modified with the usual \TikZ keys and come with additional opt
\end{tikzpicture}
\end{tcblisting}
- Please consult the \href{http://mirrors.ctan.org/graphics/pgf/contrib/tikzlings/tikzlings-doc.pdf}{\tikzlings package documentation} for an exhaustive list of options.
+ Please consult the \href{https://mirrors.ctan.org/graphics/pgf/contrib/tikzlings/tikzlings-doc.pdf}{\tikzlings package documentation} for an exhaustive list of options.
\end{document}
diff --git a/graphics/pgf/contrib/tikzmarmots/tikzmarmots-v1.sty b/graphics/pgf/contrib/tikzmarmots/tikzmarmots-v1.sty
index 7651accdfb..6ec62bacf0 100644
--- a/graphics/pgf/contrib/tikzmarmots/tikzmarmots-v1.sty
+++ b/graphics/pgf/contrib/tikzmarmots/tikzmarmots-v1.sty
@@ -9,7 +9,7 @@
% https://github.com/samcarter/tikzmarmots
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ProvidesPackage{tikzmarmots}
diff --git a/graphics/pgf/contrib/tikzmarmots/tikzmarmots.sty b/graphics/pgf/contrib/tikzmarmots/tikzmarmots.sty
index 7a929dd930..a0562c35fc 100644
--- a/graphics/pgf/contrib/tikzmarmots/tikzmarmots.sty
+++ b/graphics/pgf/contrib/tikzmarmots/tikzmarmots.sty
@@ -9,9 +9,9 @@
% https://github.com/samcarter/tikzmarmots
%
% Released under the LaTeX Project Public License v1.3c or later
-% See http://www.latex-project.org/lppl.txt
+% See https://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{tikzmarmots}[2024/04/24 version v2.1 Drawing marmots in TikZ]
+\ProvidesPackage{tikzmarmots}[2024/12/11 version v2.2 Drawing marmots in TikZ]
\RequirePackage{tikzlings-marmots}
diff --git a/graphics/pgf/contrib/tikzpingus/README.md b/graphics/pgf/contrib/tikzpingus/README.md
index d3661f480e..edee8b85c0 100644
--- a/graphics/pgf/contrib/tikzpingus/README.md
+++ b/graphics/pgf/contrib/tikzpingus/README.md
@@ -2,8 +2,8 @@
[![made-with-latex](https://img.shields.io/badge/Made%20with-LaTeX-1f425f.svg)](https://www.latex-project.org/) [![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg)](https://opensource.org/licenses/GPL-3.0) [![PR's Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat)](http://makeapullrequest.com) [![CTAN](https://badgen.net/badge/On/CTAN/cyan)](https://www.ctan.org/pkg/tikzpingus) [![build](https://github.com/EagleoutIce/tikzpingus/actions/workflows/compile.yaml/badge.svg)](https://github.com/EagleoutIce/tikzpingus/actions/workflows/compile.yaml)
-This package is a work-in-progress package allowing you to typeset little penguins in LaTeX with PGF/Ti*k*Z.
-The [documentation](https://media.githubusercontent.com/media/EagleoutIce/tikzpingus/gh-pages/doc/build/tikzpingus-doc.pdf) will constantly evolve.
+This package allows you to typeset (cute) little penguins in LaTeX with PGF/Ti*k*Z.
+The [documentation](https://media.githubusercontent.com/media/EagleoutIce/tikzpingus/gh-pages/doc/build/tikzpingus-doc.pdf) contains a reference for all currently available options. See the examples below for a quick overview.
----
@@ -26,7 +26,7 @@ Currently, most options I have added arose from concrete situations and are not
[![Penguin Tech](https://github.com/EagleoutIce/tikzpingus/blob/gh-pages/hey-pingu-4.png?raw=true)](https://media.githubusercontent.com/media/EagleoutIce/tikzpingus/gh-pages/examples/build/hey-pingu.pdf#page=4)
-If you just load the library by `\usepackage{tikzpingus}` all options will work, and you might want to use the `glows`-option (`\usepackage[glows]{tikzpingus}`) so that lightsabers and other glowing elements look waaay nicer (but may produce artifacts in some pdf-viewers). However, if loading the library takes too long for you, using the `bare` option will drastically reduce the default options available while allowing you to load specific libraries with `\pinguloadlibraries{<list of libraries>}`.
+If you just load the library by `\usepackage{tikzpingus}` all options will work, and you might want to use the `glows`-option (`\usepackage[glows]{tikzpingus}`) so that lightsabers and other glowing elements look waaay nicer (but may produce artifacts in some pdf-viewers).
[![Penguin Cake](https://github.com/EagleoutIce/tikzpingus/blob/gh-pages/hey-pingu-5.png?raw=true)](https://media.githubusercontent.com/media/EagleoutIce/tikzpingus/gh-pages/examples/build/hey-pingu.pdf#page=5)
@@ -40,6 +40,6 @@ Clothes are a work in progress for a long time now. While there are pants, shirt
## More Fun
-For the title image of a computer-science course on software-product-lines, I created a small and incomplete but really fun feature model:
+For the title image of a computer science course on software product lines, I created a small and incomplete but really fun feature model:
[![Penguin-SPL](https://github.com/EagleoutIce/tikzpingus/blob/gh-pages/spl-1.png?raw=true)](https://media.githubusercontent.com/media/EagleoutIce/tikzpingus/gh-pages/examples/build/spl.pdf)
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-bee.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-bee.lib.tex
deleted file mode 100644
index 66e613445d..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-bee.lib.tex
+++ /dev/null
@@ -1,64 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-% TODO: integrate?
-% TODO: allow to specify rotation anchor
-
-\pingu@create@extra{bee}{%
- bee/.code = {\pingu@set@extra{bee}{true}\pingu@color{bee}{#1}},
- bee/.default = pingu@yellow!60!pingu@white,%
- bee body/.code = \pingu@color{bee@body}{#1},
- bee eyes/.code = \pingu@color{bee@eyes}{#1},
- bee wings/.code = \pingu@color{bee@wings}{#1},
- bee mouth/.code = \pingu@color{bee@mouth}{#1},
- bee blush/.code = \pingu@color{bee@blush}{#1},
- bee position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@bee@angle{#1}\def\pingu@x@bee@xshift{#2}\def\pingu@x@bee@yshift{#3}\def\pingu@x@bee@scale{#4}},
-}{bee body=pingu@black!82!gray,bee wings=pingu@blue!8!pingu@white,bee mouth=\pingu@color@bee@body,bee eyes=\pingu@color@bee@body,bee blush=pingu@red!21!\pingu@color@bee,bee position={-27.5:(8mm,15mm){.875}}}
-
-\def\pingu@bee@x@lbody{ (left) to[out=270,in=150] (0,-.725) to[out=30,in=270] (right)}
-
-\def\pingu@draw@ea@bee{%
-\scope[very path/.append style={line join=round},rotate around={\pingu@x@bee@angle:(\pingu@name-head)},shift={(\pingu@name-head)},shift={(\pingu@x@bee@xshift,\pingu@x@bee@yshift)},scale=\pingu@x@bee@scale]
-% wings
-\coordinate (wl) at(20:2.55mm);
-\coordinate (wr) at(160:2.55mm);
-\pingu@draw[fill=\pingu@color@bee@wings!80!white,rotate around=-32:(wl)]{\pingu@color@bee@body} (wl) ellipse [x radius=6.15mm, y radius=2.75mm];
-\pingu@draw[fill=\pingu@color@bee@wings!80!white,rotate around=32:(wr)]{\pingu@color@bee@body} (wr) ellipse [x radius=6.15mm, y radius=2.75mm];
-\pingu@draw[fill=\pingu@color@bee@wings,rotate around=19:(wl)]{\pingu@color@bee@body} (wl) ellipse [x radius=6.55mm, y radius=3.125mm];
-\pingu@draw[fill=\pingu@color@bee@wings,rotate around=-19:(wr)]{\pingu@color@bee@body} (wr) ellipse [x radius=6.55mm, y radius=3.125mm];
-% body
-\path (-.375,0) coordinate (left) -- (.375,0) coordinate (right);
-% TODO: block draw?
-\pingu@block[draw=\pingu@color@bee@body]{\pingu@color@bee@body} \pingu@bee@x@lbody;
-\scope\clip\pingu@bee@x@lbody;
-\foreach \angl in {30,1} {
-\pingu@block{\pingu@color@bee} (-\angl:.75) to[bend left=14] (180+\angl:.75) -- ++(0,-1.75mm)
- to[bend right=14] (-\angl-14:.75) -- cycle;
-}\endscope
-% left and right arm
-\foreach\m/\s/\k in {right/-2.45/95,left/-.75/80} {
-\scope[shift=(\m),yshift=\s,rotate around=\k:(\m),scale=.166]
-\pingu@block{\pingu@color@bee@body} (-.965,0) arc(270:90:.29) -- ++(1.233,0) arc (90:-90:.29) -- cycle;
-\endscope}
-% sting
-\pingu@draw[line cap=round,thick]{\pingu@color@bee@body} (0,-.725) -- ++(0,-.035);
-% head
-\pingu@draw[fill=\pingu@color@bee,rounded corners=1.5pt]{\pingu@color@bee@body} (.85mm,-.55mm) to[bend right=30,looseness=.9] ([xshift=1.45mm,yshift=1.35mm]right) arc(0:180:{(.75cm+2*1.45mm)/2} and {(.75cm+2*1.45mm)/2.05}) to[bend right=30,looseness=.9] (-.85mm,-.55mm) -- cycle;
-% eyes [intersect with left and right]
-\pingu@block{\pingu@color@bee@eyes} (left|-0,2.265mm)++(.6mm,0) coordinate (el) circle[radius=.6mm];
-\coordinate (ell) at ([yshift=-.8mm]el);
-\pingu@block[rotate around=3:(ell)]{\pingu@color@bee@blush} ([yshift=-.8mm]el) ellipse[x radius=.412mm, y radius=.165mm];
-\pingu@block{\pingu@color@bee@eyes} (right|-0,2.265mm)++(-.6mm,0) coordinate (er) circle[radius=.6mm];
-\coordinate (err) at ([yshift=-.8mm]er);
-\pingu@block[rotate around=-1:(err)]{\pingu@color@bee@blush} ([yshift=-.8mm]er) ellipse[x radius=.4mm, y radius=.155mm];
-% mouth
-\scope[yshift=1mm]
-\pingu@draw[semithick,line cap=round]{\pingu@color@bee@mouth} (-.6mm,0) arc (180:360:.6mm and .415mm);
-% antenna
-\pingu@draw[line cap=round]{\pingu@color@bee@body} (123:4mm) to[out=110,in=-41] ++(-1mm,3mm) coordinate (@);
-\pingu@block[rotate around=-41:(@)]{\pingu@color@bee@body} ([xshift=-.1mm,yshift=-.185mm]@) ellipse[x radius=.55mm,y radius=.35mm];
-\pingu@draw[line cap=round]{\pingu@color@bee@body} (57:4mm) to[out=70,in=180+41] ++(1mm,3mm) coordinate (@);
-\pingu@block[rotate around=41:(@)]{\pingu@color@bee@body} ([xshift=-.1mm,yshift=-.2mm]@) ellipse[x radius=.55mm,y radius=.35mm];
-\endscope
-\endscope
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-christmas.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-christmas.lib.tex
deleted file mode 100644
index b86e799d79..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-christmas.lib.tex
+++ /dev/null
@@ -1,153 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@extra{santahat}{%
- santa hat/.code = \pingu@set@extra{santahat}{true}\pingu@color{santahat}{#1}\pgfqkeys{/pingu}{hair=\@pingu@none},
- santa hat/.default = pingu@red!87!pingu@black,
- santa hat second/.code = \pingu@color{santahat@second}{#1},
- santa hat bobble/.code = \pingu@color{santahat@bobble}{#1}
-}{santa hat second={pingu@white!97!\pingu@color@santahat},santa hat bobble={\pingu@color@santahat@second}}
-\def\pingu@draw@ea@santahat{%
-\path (\pingu@name-head-center)+(152:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-santa-right);
-\path (\pingu@name-head-center)+(5:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-santa-left);
-\pingu@layer{middle}[]
-\pingu@block{\pingu@color@santahat@second} (\pingu@name-santa-right) to[out=48,in=132] (\pingu@name-santa-left) to[out=30,in=-45,looseness=1.325] ++(0,3.2mm)
-to[out=135,in=47,looseness=1.025] coordinate[pos=.915] (\pingu@name-santa-ur) coordinate[pos=.055] (\pingu@name-santa-ul) ([yshift=2mm]\pingu@name-santa-right) to[out=240,in=140] cycle;
-\endpingu@layer
-\pingu@layer{background}[]
-\pingu@block{\pingu@color@santahat} (\pingu@name-santa-ur) arc(145:-25:11.85mm and 14.915mm)
- to[bend right=7] coordinate[pos=.5] (\pingu@name-santa-lc) ++(-1.11mm,.375mm) to[bend right=11] (\pingu@name-santa-ul) to[bend right=15] cycle;
-\pingu@block{\pingu@color@santahat@bobble} (\pingu@name-santa-lc) circle[radius=2.625mm];
-\endpingu@layer
-}
-\pingu@create@extra{santabeard}{%
- santa beard/.code = \pingu@set@extra{santabeard}{true}\pingu@color{santabeard}{#1},
- santa beard/.default = pingu@white!96!pingu@red!98!pingu@black!92!gray,
- santa beard string/.code = \pingu@color{santabeard@string}{#1}
-}{santa beard string=\pingu@color@body@main!85!pingu@black}
-\def\pingu@draw@ea@santabeard{%
-% \coordinate (\pingu@name-santa-beard-center) at ([yshift=1.25mm]\pingu@name-belly-center);
-\pingu@block{\pingu@color@santabeard@string} ([xshift=-.35mm,yshift=.575mm]\pingu@name-head-back-con-right) to[bend right=28,edge node={foreach[count=\i] \l in {0.03,0.085,...,0.992} {coordinate[pos=\l-rand*.015,yshift=-.85pt] (\pingu@name-santa-beard-\i)}}]
-([yshift=.575mm,xshift=.35mm]\pingu@name-head-back-con-left) arc(20:110:.05mm and .15mm) to[bend left=26] ([yshift=.575mm+.15mm,xshift=-.35mm]\pingu@name-head-back-con-right) to[bend right] cycle;
-\ifx\pingu@color@santabeard\@pingu@none\else% to allow for random
-\xdef\@pmaxY{18}\xdef\@pmaxYI{17}%
-\foreach[evaluate=\j as \maxj using int(\@pmaxY-\j),evaluate=\j as \widthred using \j/23pt] \j in {0,...,\@pmaxYI} {
-\foreach[remember=\i as \li (initially 0)] \i in {1,...,\maxj} {
- \pgfmathsetmacro\@ptmp{94+rand*2.6}
- \pingu@block{\pingu@color@santabeard!\@ptmp!pingu@black} (\pingu@name-santa-beard-\i) circle [radius=1.85pt-\widthred pt+rand*.35pt];
- \ifnum\li>0 % make middle of last
- \path (\pingu@name-santa-beard-\li) -- (\pingu@name-santa-beard-\i) coordinate[pos=.5,yshift=-1.1pt,xshift=.133pt] (\pingu@name-santa-beard-\li); % smoll shift
- \fi
-}}\fi
-}
-
-\pingu@create@extra{woolhat}{%
- wool hat/.code = \pingu@set@extra{woolhat}{true}\pingu@color{woolhat}{#1}\pgfqkeys{/pingu}{hair=\@pingu@none},
- wool hat/.default = pingu@blue!57!pingu@black,
- wool hat second/.code = \pingu@color{woolhat@second}{#1},
- wool hat bobble/.code = \pingu@color{woolhat@bobble}{#1}
-}{wool hat second={\pingu@color@woolhat!55!pingu@white},wool hat bobble={\pingu@color@woolhat@second}}
-\def\pingu@draw@ea@woolhat{%
-\path ([yshift=.5mm,xshift=.165mm]\pingu@name-head-center)+(165:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-wool-right);
-\path ([yshift=.5mm,xshift=-.045mm]\pingu@name-head-center)+(4:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-wool-left);
-\pingu@layer{middle}[]
-\pingu@block{\pingu@color@woolhat@second} (\pingu@name-wool-right) to[out=37,in=170] (\pingu@name-wool-left) to[out=50,in=-55] ++(0,1.52mm) coordinate (\pingu@name-wool-left-up)
-to[out=167,in=38] coordinate[pos=.915] (\pingu@name-wool-ur) coordinate[pos=.055] (\pingu@name-wool-ul) ([yshift=1.5mm]\pingu@name-wool-right) coordinate (\pingu@name-wool-right-up) to[out=240,in=140] cycle;
-\endpingu@layer
-\path (\pingu@name-wool-left-up) -- (\pingu@name-wool-right-up) coordinate[pos=.455,yshift=9.75mm] (@mid);
-\pingu@block{\pingu@color@woolhat} (\pingu@name-wool-right-up) to[out=71,in=203] [rounded corners=2pt] (@mid) to[out=-34,in=100] [sharp corners] (\pingu@name-wool-left-up) to[in=37,out=172] cycle;
-\pingu@layer{background}[]
-\pingu@block{\pingu@color@woolhat@bobble} (@mid) circle [radius=1.25mm];
-\endpingu@layer
-}
-
-
-\pingu@create@extra{deerhat}{%
- deer hat/.code = \pingu@set@extra{deerhat}{true}\pingu@color{deerhat}{#1}\pgfqkeys{/pingu}{hair=\@pingu@none},
- deer hat/.default = pingu@bronze!57!pingu@black,
- deer hat b/.code = \pingu@color{deerhat@b}{#1},
- deer hat band/.code = \pingu@color{deerhat@band}{#1},
-}{deer hat band={\pingu@color@deerhat!85!pingu@black},deer hat b=\pingu@color@deerhat}
-\pgfmathsetmacro\pingu@deerhat@baseang@l{90-360*(1-\pinguanglehl)}
-\pgfmathsetmacro\pingu@deerhat@baseang@r{90-360*(1-\pinguanglehr)}
-\def\pingu@deerhat@baseoff{47}
-\def\pingu@deerhat@yshift{.15mm}
-\def\pingu@deerhat@linewidth{1.32mm}
-\def\pingu@deerhat@headoff@l{22}
-\def\pingu@deerhat@headoff@r{19}
-\def\pingu@draw@ea@deerhat{%
-\path ([yshift=-\pingu@deerhat@yshift]\pingu@name-head-left) arc (\pingu@deerhat@baseang@l:\pingu@deerhat@baseang@l-\pingu@deerhat@baseoff:\pingu@w@half{} and \pingu@head@h@half) coordinate[yshift=.05mm] (@target);
-\pingu@draw[line width=.7mm]{\pingu@color@deerhat@band} ([xshift=-.8mm]@target) arc (\pingu@deerhat@baseang@l-\pingu@deerhat@baseoff:360+\pingu@deerhat@baseang@r+\pingu@deerhat@baseoff:\pingu@w@half{}-.8mm and \pingu@head@h@half);
-
-\path ([yshift=-\pingu@deerhat@yshift]\pingu@name-head-top) arc (90:90-\pingu@deerhat@headoff@l:\pingu@w@half{} and \pingu@head@h@half) coordinate (@left);
-\path ([yshift=-\pingu@deerhat@yshift]\pingu@name-head-top) arc (90:90+\pingu@deerhat@headoff@r:\pingu@w@half{} and \pingu@head@h@half) coordinate (@right);
-
-\pgfonlayer{background}
-\pingu@draw[line width=\pingu@deerhat@linewidth,rounded corners=2pt,line cap=round]{\pingu@color@deerhat} (@left) to[bend right=4] ++(.85mm,1.5mm) coordinate (@a) -- ++(3.15mm,.5mm) coordinate (@b) -- ++(4.65mm,4.35mm) coordinate[pos=.5] (@c) to[bend right=10] ++(-.75mm,2.55mm);
-\pingu@draw[line width=\pingu@deerhat@linewidth,rounded corners=2pt,line cap=round]{\pingu@color@deerhat} ([xshift=-.135mm,yshift=-.425mm]@a) to[bend left=3] ++(1mm,3.9mm) ([xshift=-.4mm,yshift=-.05mm]@b) to[bend right=2] ++(3.75mm,.1mm) (@c) to[bend left=12] ++(-1mm,3.5mm);
-\pingu@draw[line width=\pingu@deerhat@linewidth,rounded corners=2pt,line cap=round]{\pingu@color@deerhat@b} (@right) to[bend left=4] ++(-.85mm,1.5mm) coordinate (@a) -- ++(-3.15mm,.5mm) coordinate (@b) -- ++(-4.65mm,4.35mm) coordinate[pos=.5] (@c) to[bend left=10] ++(.75mm,2.55mm);
-\pingu@draw[line width=\pingu@deerhat@linewidth,rounded corners=2pt,line cap=round]{\pingu@color@deerhat@b} ([yshift=-.425mm,xshift=.135mm]@a) to[bend right=3] ++(-1mm,3.9mm) ([xshift=.4mm,yshift=-.05mm]@b) to[bend right=2] ++(-3.75mm,.1mm) (@c) to[bend right=12] ++(1mm,3.5mm);
-\endpgfonlayer
-}
-
-\pingu@create@wing@extra{present}{%
- present \@lr/.code = {\pingu@set@extra{present\@lr}{true}\pingu@color{present\@lr}{##1}},
- present \@lr/.default = pingu@red!50!pingu@black!60!red,
- present \@lr\space width/.code = \@namedef{pingu@present@\@lr @width}{##1},
- present \@lr\space height/.code = \@namedef{pingu@present@\@lr @height}{##1},
- present \@lr\space ribbon/.code = \pingu@color{present\@lr @ribbon}{##1},%
- present \@lr\space band/.code = \pingu@color{present\@lr @band}{##1},%
- present \@lr\space band width/.code = \@namedef{pingu@present@\@lr @band@width}{##1},
- present \@lr\space xshift/.code = \@namedef{pingu@present@\@lr @xshift}{##1},
- present \@lr\space yshift/.code = \@namedef{pingu@present@\@lr @yshift}{##1},
- present \@lr\space band second height/.code = \@namedef{pingu@present@\@lr @band@second@height}{##1},
- present \@lr\space band second yshift/.code = \@namedef{pingu@present@\@lr @band@second@yshift}{##1},
- present \@lr\space lid/.code = \pingu@color{present\@lr @lid}{##1},%
- present \@lr\space lid height/.code = \@namedef{pingu@present@\@lr @lid@height}{##1},
- present \@lr\space lid overhang/.code = \@namedef{pingu@present@\@lr @lid@overhang}{##1},
- present \@lr\space lid yshift/.code = \@namedef{pingu@present@\@lr @lid@yshift}{##1},
- present \@lr\space lid band/.code = \pingu@color{present\@lr @lid@band}{##1},%
-}{present \@lr\space band=pingu@green!70!pingu@black!90!pingu@white,present \@lr\space width=7.75mm,present \@lr\space band width=1.75mm,present \@lr\space height=7mm,present \@lr\space yshift=-0.25*(\csname pingu@present@\@lr @height\endcsname),present \@lr\space band second height=\csname pingu@present@\@lr @band@width\endcsname, present \@lr\space band second yshift=0.5*(\csname pingu@present@\@lr @height\endcsname),present \@lr\space xshift=-0.25*(\csname pingu@present@\@lr @width\endcsname),present \@lr\space lid=\csname pingu@color@present\@lr\endcsname!92!pingu@black,present \@lr\space lid height=1.33mm,present \@lr\space lid overhang=.125mm,present \@lr\space lid yshift=0,present \@lr\space lid band=\csname pingu@color@present\@lr @band\endcsname!98!pingu@black,present \@lr\space ribbon=\csname pingu@color@present\@lr @band\endcsname!97!pingu@black}
-
-% TODO: more ribbon color control
-% #1 wing
-\def\pingu@draw@wi@present#1{%
- \pingu@setup@wing{present}{#1}%
- \scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
- \pingu@block[rounded corners=2pt]{\@col}(\pingu@name-wing-#1)++(-{0.5*(\csname pingu@present@#1@width\endcsname)+\csname pingu@present@#1@xshift\endcsname},{\csname pingu@present@#1@yshift\endcsname}) coordinate (@ll) rectangle ++({\csname pingu@present@#1@width\endcsname},{\csname pingu@present@#1@height\endcsname}) coordinate (@ur);
- % vert band
- \pingu@block{\csname pingu@color@present#1@band\endcsname}(@ll)++({0.5*(\csname pingu@present@#1@width\endcsname)-0.5*(\csname pingu@present@#1@band@width\endcsname)},0) rectangle ++({\csname pingu@present@#1@band@width\endcsname},{\csname pingu@present@#1@height\endcsname});
- % horiz band
- \pingu@block{\csname pingu@color@present#1@band\endcsname}(@ll)++(0,{\csname pingu@present@#1@band@second@yshift\endcsname-0.5*(\csname pingu@present@#1@band@second@height\endcsname)}) rectangle ++({\csname pingu@present@#1@width\endcsname},{\csname pingu@present@#1@band@second@height\endcsname});
- % lid
- \pingu@block[rounded corners=.75pt]{\csname pingu@color@present#1@lid\endcsname} ([yshift={\csname pingu@present@\@lr @lid@yshift\endcsname},xshift=\csname pingu@present@\@lr @lid@overhang\endcsname]@ur) rectangle ++({-\csname pingu@present@#1@width\endcsname-2*(\csname pingu@present@\@lr @lid@overhang\endcsname)},-\csname pingu@present@#1@lid@height\endcsname) coordinate (@ll);
- % upper lid band
- \pingu@block{\csname pingu@color@present#1@lid@band\endcsname}(@ll)++({0.5*(\csname pingu@present@#1@width\endcsname)-0.5*(\csname pingu@present@#1@band@width\endcsname)+\csname pingu@present@\@lr @lid@overhang\endcsname},0) rectangle ++({\csname pingu@present@#1@band@width\endcsname},{\csname pingu@present@#1@lid@height\endcsname});
- % ribbon
- \path (@ll)++({0.5*(\csname pingu@present@#1@width\endcsname)+\csname pingu@present@\@lr @lid@overhang\endcsname+0.2*(\csname pingu@present@#1@band@width\endcsname)},{\csname pingu@present@#1@lid@height\endcsname+.25mm}) coordinate (@top);
- \pingu@block[even odd rule]{\csname pingu@color@present#1@ribbon\endcsname} (@top) to[out=40,in=110] ++(4mm,1mm)
- to[out=-70,in=-20] ++(-4mm,-1.5mm) to[bend left=55] cycle ([xshift=.5mm]@top) to[out=40,in=110] ++(2.55mm,.5mm)
- to[out=-70,in=-20] [rounded corners=1pt] ++(-2.85mm,-.835mm) -- cycle;
- \path (@ll)++({0.5*(\csname pingu@present@#1@width\endcsname)+\csname pingu@present@\@lr @lid@overhang\endcsname-0.2*(\csname pingu@present@#1@band@width\endcsname)},{\csname pingu@present@#1@lid@height\endcsname+.25mm}) coordinate (@top);
- \pingu@block[even odd rule]{\csname pingu@color@present#1@ribbon\endcsname} (@top) to[out=180-40,in=180-110] ++(-3.6mm,1mm)
- to[out=-110,in=-160] ++(3.6mm,-1.5mm) to[bend right=55] cycle ([xshift=-.5mm]@top) to[out=140,in=70] ++(-2.55mm,.5mm)
- to[out=-110,in=-160] [rounded corners=1pt] ++(2.55mm,-.75mm) -- cycle;
- \pingu@block[rounded corners=.5pt]{\csname pingu@color@present#1@ribbon\endcsname} (@top)++(-.3mm,-.65mm) rectangle ++(1.3mm,.65mm); % TODO: make that round? (i.e., bend edges)
- \endscope
-}
-
-\pingu@create@wing@extra{snowball}{%
- snowball \@lr/.code = {\pingu@set@extra{snowball\@lr}{true}\pingu@color{snowball\@lr}{##1}},
- snowball \@lr/.default = pingu@white!90!pingu@black,
- snowball \@lr\space size/.code = \expandafter\def\csname pingu@snowball@\@lr @size\endcsname{##1},
- snowball \@lr\space xshift/.code = \expandafter\def\csname pingu@snowball@\@lr @xshift\endcsname{##1},
- snowball \@lr\space yshift/.code = \expandafter\def\csname pingu@snowball@\@lr @yshift\endcsname{##1}
-}{snowball \@lr\space size=2.33mm, snowball \@lr\space xshift=0pt, snowball \@lr\space yshift=0pt}
-
-% #1 wing
-% TODO: shifts
-\def\pingu@draw@wi@snowball#1{%
-\pingu@setup@wing{snowball}{#1}%
- \pingu@draw[opacity=.35]{\@col} ([xshift=\csname pingu@snowball@#1@xshift\endcsname,yshift=\csname pingu@snowball@#1@yshift\endcsname]\pingu@name-wing-#1) coordinate (@) circle[radius=\csname pingu@snowball@#1@size\endcsname];
- \pingu@block[rotate around={\@angle-1:(\pingu@name-wing-#1)},decoration={random steps,segment length=1pt,amplitude=.075pt},decorate,rounded corners=.35pt,save path=\snowball@outer]{\@col}(@) circle[radius=\csname pingu@snowball@#1@size\endcsname];
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-cloak.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-cloak.lib.tex
deleted file mode 100644
index cef863291e..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-cloak.lib.tex
+++ /dev/null
@@ -1,78 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\newif\if@pingu@x@cloak@wings
-\pingu@create@extra{cloak}{%
- cloak/.code = \pingu@set@extra{cloak}{true}\pingu@color{cloak}{#1},
- cloak/.default = pingu@bronze,
- cloak cap/.code = \pingu@color{cloak@cap}{#1},
- cloak wings color/.code = \pingu@color{cloak@wings}{#1},
- cloak bottom color/.code = \pingu@color{cloak@bottom}{#1},
- cloak front color/.code = \pingu@color{cloak@front}{#1},
- cloak padding/.code = \def\pingu@x@cloak@padding{#1},
- cloak wings/.is if = @pingu@x@cloak@wings,
- cape/.style = {/pingu/cloak=#1, /pingu/cloak wings=false,/pingu/cloak front color=\@pingu@none, /pingu/cloak cap=\@pingu@none,/pingu/cloak front color=\@pingu@none},
- cape/.default = pingu@bronze,
-}{cloak padding=1.95mm,cloak bottom color=\pingu@color@cloak!90!black,cloak cap=\pingu@color@cloak!98!pingu@black,cloak front color=\pingu@color@cloak!90!white,cloak wings color=\pingu@color@cloak@front!94!pingu@black,cloak wings=true}
-\def\pingu@draw@cloth@cloak@behind{%
- \pingu@block[bottom color=\pingu@color@cloak@bottom,top color=\pingu@color@cloak]{\pingu@color@cloak} (\pingu@name-bottom-center)++(-\pingu@x@cloak@padding-\pingu@w@half,-.5mm) arc (180:0:{\pingu@x@cloak@padding+\pingu@w@half} and \pingu@one) to[bend left=1] (\pingu@name-wings-side-left) arc(0:180:\pingu@w@half{} and .75mm) to[bend left=1] cycle;
-}
-
-\def\pingu@draw@cloth@cloak@middle{\pingu@block[rounded corners=.7mm]{\pingu@color@cloak@front}
-(\pingu@name-bottom-center)++(-\pingu@x@cloak@padding-\pingu@w@half,-.5mm) arc (180:250:{\pingu@x@cloak@padding+\pingu@w@half} and \pingu@one) to[bend right=6]
-([xshift=1.3mm,yshift=.4mm]\pingu@name-wings-side-right) to[bend right=3] ([yshift=.65mm]\pingu@name-wings-side-right);
-\pingu@block[rounded corners=.7mm]{\pingu@color@cloak@front}
-(\pingu@name-bottom-center)++(\pingu@x@cloak@padding+\pingu@w@half,-.5mm) arc (0:-70:{\pingu@x@cloak@padding+\pingu@w@half} and \pingu@one) to[bend left=6]
-([xshift=-1.3mm,yshift=.4mm]\pingu@name-wings-side-left) to[bend left=3] ([yshift=.65mm]\pingu@name-wings-side-left);}
-
-% TODO: if flags to draw parts
-\def\pingu@draw@cloth@cloak{%
-\scope[rounded corners=.6\p@]
- % wings
- \if@pingu@x@cloak@wings
- \edef\@la{\csname @pingu@wingdown@\@pingu@select@leftwing@ @\endcsname}
- \ifnum\@la>0 % wing is going inverted up or down / \ => left
- \pingu@layer{foreground}[]
- \ifnum\@la>70
- \pingu@block[right color=\pingu@color@cloak@front,left color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} (\pingu@name-wing-left-start)++(.5mm,-3.5mm) to[bend left=10] (\pingu@name-wing-left-low) to[bend right=13] (\pingu@name-wing-left-up) to[bend left=3] (\pingu@name-wing-left-start-up) to[bend left] ([xshift=.35mm,yshift=1mm]\pingu@name-wing-left-start);
- \else % down
- \pingu@block[right color=\pingu@color@cloak@front,left color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} (\pingu@name-wing-left-start)++(.5mm,-3.5mm) to[bend left=10] (\pingu@name-wing-left-low) to[bend right=13] (\pingu@name-wing-left-up) to[bend left=3] ([xshift=1mm,yshift=1mm]\pingu@name-wing-left-start-up) to[bend left=4.5] ([xshift=.5mm,yshift=-3.5mm]\pingu@name-wing-left-start);
- \fi
- \endpingu@layer
- \else
- \ifnum\@la<-90% normal up \ / => left side
- \pingu@block[upper right=\pingu@color@cloak@wings,lower right=\pingu@color@cloak@front,lower left=\pingu@color@cloak@front,upper left=\pingu@color@cloak@front]{\pingu@color@cloak@wings} ([xshift=.25mm]\pingu@name-wing-left-start-low) to[bend right=14] (\pingu@name-wing-left-low) to[bend left=8] ([yshift=-.5mm]\pingu@name-wing-left-up) to[bend right=17] ([yshift=1.6mm]\pingu@name-wing-left-start-up) to[bend right=13] ([xshift=-.15mm,yshift=.15mm]\pingu@name-waist-left) -- cycle;
- \else % normal and hugging down => right
- \pingu@block[top color=\pingu@color@cloak@front,middle color=\pingu@color@cloak,bottom color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} plot[smooth] coordinates {([xshift=-1.38mm]\pingu@name-wings-side-left) (\pingu@name-wing-left-start-low) ([yshift=.65mm,xshift=-.65mm]\pingu@name-wing-left-low) ([yshift=.65mm,xshift=-.65mm]\pingu@name-wing-left-up) ([xshift=.68mm]\pingu@name-wings-side-left) ([xshift=-1.38mm]\pingu@name-wings-side-left)};
- \fi
- \fi
- \edef\@ra{\csname @pingu@wingdown@\@pingu@select@rightwing@ @\endcsname}
- \ifnum\@ra>0 % wing is going inverted up or down => right
- \pingu@layer{foreground}[]
- \ifnum\@ra>70
- \pingu@block[left color=\pingu@color@cloak@front,middle color=\pingu@color@cloak@front,right color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} (\pingu@name-wing-right-start-low) to[bend right=10] (\pingu@name-wing-right-low) to[bend left=13] (\pingu@name-wing-right-up) to[bend right=3] (\pingu@name-wing-right-start-up) -- ++(-.25mm,0mm) to[bend right=11] cycle;
- \else
- \pingu@block[left color=\pingu@color@cloak@front,middle color=\pingu@color@cloak@front,right color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} ([xshift=1mm,yshift=-1mm]\pingu@name-wing-right-start-low) to[bend right=10] (\pingu@name-wing-right-low) to[bend left=13] (\pingu@name-wing-right-up) to[bend right=3] ([xshift=-1mm,yshift=1mm]\pingu@name-wing-right-start-up) to[bend right=4.5] ([xshift=-.5mm,yshift=-3.5mm]\pingu@name-wing-right-start);
- \fi
- \endpingu@layer
- \else
- \ifnum\@ra<-90% normal up => right side
- \pingu@block[upper left=\pingu@color@cloak@wings,lower left=\pingu@color@cloak@front,lower right=\pingu@color@cloak@front,upper right=\pingu@color@cloak@front]{\pingu@color@cloak@wings} ([xshift=.25mm]\pingu@name-wing-right-start-low) to[bend left=14] (\pingu@name-wing-right-low) to[bend right=8] ([yshift=-.5mm]\pingu@name-wing-right-up) to[bend left=17] ([yshift=1.6mm]\pingu@name-wing-right-start-up) to[bend left=13] ([xshift=.15mm,yshift=.15mm]\pingu@name-waist-right) -- cycle;
- \else % normal and hugging down => left
- \pingu@block[top color=\pingu@color@cloak@front,middle color=\pingu@color@cloak@front,bottom color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} plot[smooth] coordinates {([xshift=1.38mm]\pingu@name-wings-side-right) (\pingu@name-wing-right-start-low) ([yshift=.85mm,xshift=-.35mm]\pingu@name-wing-right-low) ([yshift=.85mm,xshift=.35mm]\pingu@name-wing-right-up) ([xshift=-.68mm]\pingu@name-wings-side-right) ([xshift=1.38mm]\pingu@name-wings-side-right)};
- \fi
- \fi
-\fi
- % cape
- \pingu@block[rounded corners=.8mm]{\pingu@color@cloak@cap} ([xshift=.85mm,yshift=-2.75mm]\pingu@name-wing-left-start) to[bend left=4] ([xshift=-.45mm,yshift=-.65mm]\pingu@name-wings-side-left) to[bend right=3]
- (\pingu@name-head)
- to[bend right=3]
- ([xshift=.4mm,yshift=-.65mm]\pingu@name-wings-side-right) [rounded corners=.15mm] to[bend left=3] ([xshift=-.85mm,yshift=-2.75mm]\pingu@name-wing-right-start)
- to[bend left=8]
- ([xshift=-.66mm]\pingu@name-wings-side-right)
- [rounded corners=.15mm]
- to[bend left=32] ++(\pingu@w@half+.66mm,\pingu@w@half+1.2\pingu@one)
- to[bend left=32] ++(\pingu@w@half+.66mm,-\pingu@w@half-1.2\pingu@one)
- to[bend left=8] cycle;
-\endscope
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-devil.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-devil.lib.tex
deleted file mode 100644
index a1ec5f9a55..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-devil.lib.tex
+++ /dev/null
@@ -1,90 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@extra{devilhorns}{%
- devilhorns/.forward to = /pingu/devil horns,
- devil-horns/.forward to = /pingu/devil horns,
- devil horns/.code = \pingu@set@extra{devilhorns}{true}\pingu@color{devilhorns}{#1},
- devil horns/.default = pingu@purple,
- devil horns b/.code = \pingu@color{devilhorns@b}{#1},
- devilhorns b/.forward to = /pingu/devil horns b,
- devil-horns b/.forward to = /pingu/devil horns b
-}{devil horns b=\pingu@color@devilhorns}
-
-\pgfmathsetmacro\pingu@devilhorns@baseang@l{90-360*(1-\pinguanglehl)}
-\pgfmathsetmacro\pingu@devilhorns@baseang@r{90-360*(1-\pinguanglehr)}
-\def\pingu@devilhorns@baseoff{12}
-\def\pingu@devilhorns@yshift{.65mm}
-\def\pingu@draw@ea@devilhorns{%
- % 90 - 360*.06
- \pingu@block{\pingu@color@devilhorns} ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-left) arc (\pingu@devilhorns@baseang@l:\pingu@devilhorns@baseang@l-\pingu@devilhorns@baseoff:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-devilhorns-left-goal) to[out=32,in=-32,looseness=.9] ++(.3mm,2.65mm) to[bend left=17] ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-left) -- cycle;
- \pingu@block{\pingu@color@devilhorns} ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-left) to [bend right=38] (\pingu@name-devilhorns-left-goal) to[bend right=30] ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-left) -- cycle;
- \pingu@block{\pingu@color@devilhorns@b} ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-right) arc (\pingu@devilhorns@baseang@r:\pingu@devilhorns@baseang@r+\pingu@devilhorns@baseoff:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-devilhorns-right-goal) to[out=148,in=-148,looseness=.9] ++(-.3mm,2.65mm) to[bend right=17] ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-right) -- cycle;
- \pingu@block{\pingu@color@devilhorns@b} ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-right) to [bend left=38] (\pingu@name-devilhorns-right-goal) to[bend left=30] ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-right) -- cycle;
-}
-
-% wip hack
-\colorlet{pingu@devil@ring}{pingu@black}
-\def\pingu@devil@x@opacity{.75}
-\pingu@eyes@s{devil}{%
-\pingu@layer{foreground}[]
- \pingu@block{pingu@devil@ring} ([yshift=.75mm,xshift=\pingu@eye@shift]\pingu@name-eye-back-left) coordinate (\pingu@name-eye-left) ellipse [x radius=.1535cm, y radius=.1575cm];
- \pingu@block{\pingu@color@eye@second@left} ([yshift=.75mm,xshift=\pingu@eye@shift]\pingu@name-eye-back-left) coordinate (\pingu@name-eye-left) ellipse [x radius=.1325cm, y radius=.1375cm];
- \fill[\pingu@color@eye@left,/pingu/@glow] (\pingu@name-eye-left) circle [radius=1.325mm];
- \pingu@block[fill opacity=\pingu@devil@x@opacity]{\pingu@color@eye@left} (\pingu@name-eye-left)++(0,.36) to[bend right=58] ++(.36,-.36) to[bend right=58] ++(-.36,-.36) to[bend right=58] ++(-.36,.36) to[bend right=58] cycle;
- \fill[/pingu/@glow,fill=\pingu@color@eye@left!20!pingu@yellow!15!pingu@white] (\pingu@name-eye-left)++(0,.10) to[bend right=60] ++(.10,-.10) to[bend right=60] ++(-.10,-.10) to[bend right=60] ++(-.10,.10) to[bend right=60] cycle;
- \fill[\pingu@color@eye@left!20!pingu@yellow!7!pingu@white] (\pingu@name-eye-left) circle [radius=.5pt]; %
- \pingu@block{pingu@white} (\pingu@name-eye-left) circle [radius=.15pt];
-\endpingu@layer
-}{%
-\pingu@layer{foreground}[]
- \pingu@block{pingu@black} ([yshift=.75mm,xshift=-\pingu@eye@shift]\pingu@name-eye-back-right) coordinate (\pingu@name-eye-right) ellipse [x radius=.1535cm, y radius=.1575cm];
- \pingu@block{\pingu@color@eye@second@right} ([yshift=.75mm,xshift=-\pingu@eye@shift]\pingu@name-eye-back-right) coordinate (\pingu@name-eye-right) ellipse [x radius=.1325cm, y radius=.1375cm];
- \fill[\pingu@color@eye@right,/pingu/@glow] (\pingu@name-eye-right) circle [radius=1.325mm];
- \pingu@block[fill opacity=.75]{\pingu@color@eye@right} (\pingu@name-eye-right)++(0,.36) to[bend right=58] ++(.36,-.36) to[bend right=58] ++(-.36,-.36) to[bend right=58] ++(-.36,.36) to[bend right=58] cycle;
- \fill[/pingu/@glow,fill=\pingu@color@eye@right!20!pingu@yellow!15!pingu@white] (\pingu@name-eye-right)++(0,.10) to[bend right=60] ++(.10,-.10) to[bend right=60] ++(-.10,-.10) to[bend right=60] ++(-.10,.10) to[bend right=60] cycle;
- \fill[\pingu@color@eye@right!20!pingu@yellow!7!pingu@white] (\pingu@name-eye-right) circle [radius=.5pt]; %
- \pingu@block{pingu@white} (\pingu@name-eye-right) circle [radius=.15pt];
-\endpingu@layer
-}[pingu@purple]
-
-\pingu@create@wing@extra{devilfork}{%
- devil fork \@lr/.code = {\pingu@set@extra{devilfork\@lr}{true}\pingu@color{devilfork\@lr}{##1}},
- devil fork \@lr/.default = pingu@red,
- devil fork \@lr\space second/.code= \pingu@color{devilfork\@lr @second}{##1},
- devil fork \@lr\space length/.code =\expandafter\def\csname pingu@devilfork@\@lr @length\endcsname{##1}
-}{devil fork \@lr\space length=20mm,devil fork \@lr\space second=pingu@bronze!10!black}
-\def\pingu@draw@wi@devilfork#1{%
- \pingu@setup@wing{devilfork}{#1}%
-\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
- \pingu@block{\csname pingu@color@devilfork#1@second\endcsname} (\pingu@name-wing-#1)++(\@sidesign*-.2mm,-7mm) -- ++(0,\csname pingu@devilfork@#1@length\endcsname) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-devilfork-#1-top) -- ++(0,-\csname pingu@devilfork@#1@length\endcsname) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
- \pingu@block{\@col} ([yshift=4mm]\pingu@name-devilfork-#1-top) to[out=240,in=90] ++(-.65mm,-4mm) to[out=180,in=-60] ++(-1mm,5.5mm) to[out=240,in=90] ++(-.65mm,-5.9mm) to[bend right] ++(4.4mm,0) to[out=90,in=-60] ++(-.65mm,5.9mm) to[out=240,in=0] ++(-1mm,-5.5mm) to[out=90,in=-60] cycle;
-\endscope
-}
-
-\pingu@create@extra{devilwings}{%
- devilwings/.forward to = /pingu/devil wings,
- devil-wings/.forward to = /pingu/devil wings,
- devil wings/.code = \pingu@set@extra{devilwings}{true}\pingu@color{devilwings}{#1},
- devil wings/.default = pingu@black,
- devil wings b/.code = \pingu@color{devilwings@b}{#1},
- devilwings b/.forward to = /pingu/devil wings b,
- devil-wings b/.forward to = /pingu/devil wings b
-}{devil wings b=\pingu@color@devilwings}
-
-% taken over and adapted from the old penguins
-% lower wing based on https://tex.stackexchange.com/a/464828
-\def\@pingu@devilwings@lower@wing@code{(0,0.2) -- (0,1.4) -- (-2,1.4) .. controls (-4,0.8) .. (-4.3,0.2) .. controls (-4.48,0.08) .. (-4.5,-0.15) .. controls (-4.9,-0.5) and (-4.9,-0.7) .. (-4.7,-0.9) .. controls (-4.7,-1) .. (-4.6,-1.1) .. controls (-4.9,-1.8) .. (-4.2,-2) -- (-4,-2.4) .. controls (-4.1,-3) .. (-3.6,-3.1) -- (-3.25,-3.7) .. controls (-3.5,-4.5) .. (-4.1,-5.4) .. controls (-4.2,-5.9) and (-3.6,-5.9) .. (-3.5,-5.4) .. controls (-3.55,-5.1) and (-3.4,-4.8) .. (-3,-4.1) -- (-2.6,-4.1) .. controls (-2.35,-4.35) .. (-2,-4.2) .. controls (-1.75,-4.6) and (-1.25,-4.6) .. (-1.25,-3.90) .. controls (-0.9,-4) .. (-0.6,-2.8) -- (-0.3,-1) -- (0,0.2)}
-
-\def\pingu@draw@eb@devilwings{%
-\pgfonlayer{background}
- \scope[scale=0.225,shift={(\pingu@name-head-back-con-right)}]
- \pingu@block[thick,rounded corners=.75mm]{\pingu@color@devilwings} \@pingu@devilwings@lower@wing@code;
- \pingu@block[thick]{\pingu@color@devilwings} (0,1) -- (0,2.2) [rounded corners=5mm] parabola[bend at end] (-6,6) -- (-5,1) -- (0,1);
- \endscope
- \scope[scale=0.225,shift={(\pingu@name-head-back-con-left)},xscale=-1]
- \pingu@block[thick,rounded corners=0.75mm]{\pingu@color@devilwings@b} \@pingu@devilwings@lower@wing@code;
- \pingu@block[thick]{\pingu@color@devilwings@b} (0,1) -- (0,2.2) [rounded corners=5mm] parabola[bend at end] (-6,6) -- (-5,1) -- (0,1);
- \endscope
-\endpgfonlayer
-}
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-doc.pdf b/graphics/pgf/contrib/tikzpingus/tikzpingus-doc.pdf
index c46bbc7fe2..e528ff38a7 100644
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-doc.pdf
+++ b/graphics/pgf/contrib/tikzpingus/tikzpingus-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-doc.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-doc.tex
index 68581ee966..d78d3aaae9 100644
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-doc.tex
+++ b/graphics/pgf/contrib/tikzpingus/tikzpingus-doc.tex
@@ -2,7 +2,8 @@
% Licensed under GNU General Public License version 3
% https://opensource.org/licenses/gpl-3.0.html
\errorcontextlines9999
-\documentclass[parskip=half,english,numbers=noenddot,footnotes=nomultiple,oneside]{scrartcl}
+\documentclass[parskip=half,english,numbers=noenddot,footnotes=nomultiple,oneside,fontsize=10pt,DIV=14]{scrartcl}
+%
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
@@ -24,8 +25,9 @@
\usepackage[hyper]{listings}
\usepackage[skins,breakable,hooks,xparse,listingsutf8,external]{tcolorbox}
-\usepackage{lmodern}
-\usepackage{CrimsonPro}
+\usepackage[sfdefault,scale=.9]{FiraSans}
+% fitting math font
+\usepackage{newtxsf}
\usepackage{imakeidx}
\usepackage{tikz}
@@ -68,7 +70,7 @@
\let\say\enquote
\def\DTLlistformatoxford{,}\def\DTLandname{and}
% TODO: do guard against same keys for different selectors
-\long\def\ParseDTLListElement#1"#2"\@nil{\textsuperscript{\smash{\raisebox{2pt}{\ifcsname pingu@@lib@#2@\CurrentList @\endcsname\index[\current@indexfile]{Libraries!\textit{\csname pingu@@lib@#2@\CurrentList @\endcsname}!#2?\hyperref[expl-list:\CurrentList]{\protect\lpingu{#2} {\tiny\sffamily(\MapDTLList{\CurrentList})}}}~$\underset{\text{\tiny\smash{\raisebox{3pt}{\textsf{\hyperref[Libraries]{\@declaredcolor{gray}Library}}}}}}{\text{\textit{\tiny\strut\csname pingu@@lib@#2@\CurrentList @\endcsname}}}$\fi}}}}
+\long\def\ParseDTLListElement#1"#2"\@nil{}
\def\DTLlistformatitem#1{\textit{#1\expandafter\ParseDTLListElement :#1\@nil}}
\newcommand*\typesetselection[1][]{\begingroup\ifx!#1!\else\def\DTLlistformatitem##1{#1}\fi\dotypesetselection}
\def\dotypesetselection#1{\label{expl-list:#1}\def\CurrentList{#1}\expandafter\DTLformatlist\expandafter{\csname @pingu@#1@\endcsname}\endgroup}
@@ -216,8 +218,8 @@
\def\@toggle@showcase{\ifx\@showcase@cur\@showcase@pre\global\let\@showcase@cur\@empty\else \global\let\@showcase@cur\@showcase@pre\fi}
\newcommand\ShowcaseThis[2][]{\ifx\@showcase@cur\@showcase@pre \global\let\@showcase@cur\@empty\expandafter\gpreto\else \global\let\@showcase@cur\@showcase@pre\expandafter\gappto\fi\pengu@all@showcases{{#2=#1},}}
-\RedeclareSectionCommand[runin=false,afterskip=-2mm]{section}
-\RedeclareSectionCommand[runin=false,afterskip=-2mm]{subsection}
+\RedeclareSectionCommand[runin=false,beforeskip=3mm,afterskip=-2mm]{section}
+\RedeclareSectionCommand[runin=false,beforeskip=3mm,afterskip=-2mm]{subsection}
\RedeclareSectionCommand[runin=false,beforeskip=2mm,afterskip=-2mm]{subsubsection}
\tcbset{%
@@ -244,6 +246,9 @@
% allow the oxes to have minor overlaps
\newcommand\DefineKey[2][/pingu/]{%
\StrSubstitute{#2}{ }{-}[\keyexternalname]%
+ % create valid artifact path names for github
+ \StrSubstitute{\keyexternalname}{:}{_}[\keyexternalname]%
+ \StrSubstitute{\keyexternalname}{*}{_}[\keyexternalname]%
% only use _ to keep the length intact when replace with the backslash
\StrSubstitute{\keyexternalname}{\\}{_}[\keyexternalname]%
{\def\\{_}\protected@xdef\@key{#2}}%
@@ -278,7 +283,7 @@
\ifx\@tmpb\@empty\lpingu{#1#2}\@explainsuff\else\lpingu{#1#2 =\ }\texttt{<\textit{\@tmpb}>}\fi\hfill
\ifx\@tmp\@empty\else{\@declaredcolor{gray}(}#4{\@declaredcolor{gray})}\fi
}
- }\ifcsname pingu@@lib@\@key @\endcsname\index[\current@indexfile]{Libraries!\textit{\csname pingu@@lib@#2@\endcsname}!\@idxkey?\hyperref[pk:#1\@key]{\protect\lpingu{#2}}}\rlap{~\quad\raisebox{2.75pt}{$\underset{\text{\tiny\smash{\raisebox{3pt}{\textsf{\hyperref[Libraries]{\@declaredcolor{gray}Library}}}}}}{\text{\textit{\footnotesize\parbox{4em}{\null\hfill\strut\csname pingu@@lib@#2@\endcsname\hfill\null}}}}$}}\fi\kern-\linewidth\par\endgroup
+ }\kern-\linewidth\par\endgroup
}
{\endminipage\smallskip\par}
@@ -361,8 +366,6 @@
{\@declaredcolor{gray}\small This is an alias for \keyref[#1]{#3}.}%
\endkeyexplain\endgroup}
-\def\lib#1{\tikz[baseline=-.6ex]\node[draw=teal,fill=teal!3!white,very thick,rounded corners=2pt,inner ysep=0pt]{\sffamily\strut#1};}
-
\def\TikZ{Ti\textit{k}Z}
\def\tikzpingus{\TikZ pingus}
@@ -410,7 +413,7 @@
\texorpdfstring{Florian Sihler\\*
\url{https://github.com/EagleoutIce/tikzpingus}
}{Florian Sihler}}
-\date{Version v1.1 \textendash{} 2023/09/17}
+\date{Version v1.2 \textendash{} 2024/11/27}
\begin{document}
\maketitle
@@ -438,7 +441,7 @@
\node[above=3mm,font=\bfseries\sffamily\Large] at(current bounding box.north) {Motivation};
\end{tikzpicture}\vspace*{-\baselineskip}
\end{center}
-\footnotetext{Why \say{pingu} and not \say{pengu}? Well, this is the third try on achieving cute penguins without using any templates or vector formats as a basis. As a German, the short form \say{pingu} was merely a typo that originated from the German word \say{pinguin} for \say{penguin}. It somewhat stuck\ldots}
+\footnotetext{Why \say{pingu} and not \say{pengu}? Well, this is the third try on achieving cute penguins without using any templates or vector formats as a basis. As a German, the short form \say{pingu} was merely a typo that originated from the German word \say{pinguin} for \say{penguin}. It somewhat stuck\ldots{}}
\endgroup\vfill
\begin{center}
@@ -538,6 +541,7 @@ Please note, that \say{left} and \say{right} have been chosen from the penguin-p
\begin{commandexplain}{pingu}{\opt{penguin keys}}
The command to draw the penguin!
+ If you want to use |\pengu| instead, you can use |\let\pengu\pingu| in your preamble to create an alias.
\end{commandexplain}
\clearpage Besides the keys defined by this package, you can use the keys of \TikZ\ and |pgf| as well (the duck was generated by the lovely \href{https://github.com/samcarter/tikzducks}{tikzducks} package):
@@ -622,8 +626,8 @@ changed with the name option:
This view excluded a lot of special data collected on the wings!
While there is more information stored for each wing, the following five coordinates are the most important to place items into penguins hand:\vspace*{-1.5em}
\begin{center}
- \null\hfill\parbox[c]{2.5\wd\pinguwingright}{\scalebox{2.5}{\usebox\pinguwingright}}\hfill\parbox[c]{4cm}{\centering\small\@declaredcolor{gray}\sffamily And yes, the wings are deliberately placed asymmetrical.\endgraf}\hfill
- \parbox[c]{2.5\wd\pinguwingleft}{\scalebox{2.5}{\usebox\pinguwingleft}}\hfill\null
+ \null\hfill\parbox[c]{2.6\wd\pinguwingright}{\scalebox{2.5}{\usebox\pinguwingright}}\hfill\parbox[c]{3.5cm}{\centering\small\@declaredcolor{gray}\sffamily And yes, the wings are deliberately placed asymmetrical.\endgraf}\hfill
+ \parbox[c]{2.6\wd\pinguwingleft}{\scalebox{2.5}{\usebox\pinguwingleft}}\hfill\null
\end{center}
\paragraph{The Body} Similarly to the wing position, different
@@ -683,28 +687,6 @@ With \cmdref{pingudefaults} and \cmdref{pingudefaultsappend} (similar, but exten
To overwrite these keys, see \cmdref{pingudefaults}.
\end{commandexplain}
-\subsection{Libraries}
-\label{Libraries}\index{Libraries}I've split the penguin features into a set of libraries. While all of them are loaded by default, the |bare| package-option disables the automatic loading of all libraries. They can be loaded (locally to the current group) using \cmdref{pinguloadlibrary} and \cmdref{pinguloadlibraries} passing on a comma separated list of desired libraries.
-See the full reference or the index to learn which key comes from which library.
-Please note that~--- at the moment~--- not all components of a library are labeled correctly.
-% TODO: already count that? % global let?
-\foreach[count=\i] \l/\xs in \pingu@defaultlibs{\xdef\pingu@defaultlibs@count{\i}}%
-Currently there are the following libraries:
-\foreach[count=\i] \l/\xs in \pingu@defaultlibs{%
- \ifx\l\empty\else
- \index[\current@indexfile]{Libraries!\textit{\l}}\textit{\l}\ifnum\numexpr\pingu@defaultlibs@count-1>\i,\space\else
- \ifnum\pingu@defaultlibs@count=\i\else,~and\space\fi\fi
- \fi
-}.
-
-\begin{commandexplain}{pinguloadlibrary}{\mand{library}}
- Load a penguin library (actually, due to the implementation, you can use this command just like \cmdref{pinguloadlibraries} and load multiple libraries).
-\end{commandexplain}
-
-\begin{commandexplain}{pinguloadlibraries}{\mand{libraries}}
- Load multiple penguin libraries, separated by a comma. For example: \texttt{\cmdref{pinguloadlibraries}\{shirts, glasses\}}.
-\end{commandexplain}
-
\subsection{Changing the wings}
\label{subsec:wings}As already demonstrated, it is possible to change the wing positions!
All selected wing-items will adapt to the wing-position (although not all wing-items will make sense with every wing-position).
@@ -768,7 +750,7 @@ So I have started to create some predefined styles, that do change some of the p
\itemsep0pt
\foreach \tx/\s in {{draw everything with a line}/{:line}, {fill main penguin}/{:fill}, {draw components with transparency}/{:ghost parts}, {draw all layers with transparency}/{:ghost}, {set main \say{devil}-components}/{:devil},{flip the penguin (swaps left \& right)}/{:back},{do not draw main pingu}/{:hide},{mix the main penguin with a given color}/{:mix},{mix the main penguin completely with a given color}/{:mix-draw},{mix everything with a given color}/{:mix-all}} {
\item \parbox[t]{.8\linewidth}{\raggedright\expandafter\dkeyref\expandafter{\s}, \tx.} \hfill
- \parbox[t]{.175\linewidth}{\scalebox{.4}{%
+ \parbox[t]{.175\linewidth}{\scalebox{.4}{%git@github.com:EagleoutIce/tikzpingus.git
\begin{tikzpicture}[baseline=.35\baselineskip]%
\pingu[\s]
\end{tikzpicture}%
@@ -2554,6 +2536,165 @@ Currently, this is a very cumbersome command to change various hat parameters at
\end{tcblisting}
\endsubkeyexplain
+\subsubsection{The graduate cap}
+\showkeyexplain{graduate}{color}{pingu@black!95!white}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[graduate=green]
+\end{tikzpicture}
+\end{tcblisting}
+\endshowkeyexplain
+
+\keyalias{graduate cap}{graduate}
+
+{\def\pingu@color@graduate{<graduate-color>}
+\subkeyexplain{graduate}{graduate top}{color}{\pingu@color@graduate@top}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[graduate, graduate top=green]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyalias{graduate cap top}{graduate top}{graduate}
+}
+
+{
+\subkeyexplain{graduate}{graduate tilt}{length}{\pingu@x@graduate@tilt}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[graduate, graduate tilt=5mm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyalias{graduate cap tilt}{graduate tilt}{graduate}
+}
+
+{\def\pingu@color@graduate{<graduate-color>}
+\def\pingu@color@graduate@tassel{<graduate-tassel-color>}
+\subkeyexplain{graduate}{graduate tassel}{color}{\pingu@color@graduate@tassel}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[graduate, graduate tassel=green]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyalias{graduate cap tassel}{graduate tassel}{graduate}
+}
+
+{\def\pingu@color@graduate{<graduate-color>}
+\def\pingu@color@graduate@tassel{<graduate-tassel-color>}
+\subkeyexplain{graduate}{graduate tassel drop}{color}{\pingu@color@graduate@tassel@drop}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[graduate, graduate tassel,
+ graduate tassel drop=green]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyalias{graduate cap tassel drop}{graduate tassel drop}{graduate}
+}
+
+{\def\pingu@color@graduate{<graduate-color>}
+\def\pingu@color@graduate@tassel{<graduate-tassel-color>}
+\subkeyexplain{graduate}{graduate tassel start}{coordinate}{\pingu@x@tassel@start}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[graduate, graduate tassel,
+ graduate tassel start={(2mm,4mm)}]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyalias{graduate cap tassel start}{graduate tassel start}{graduate}
+}
+
+{\def\pingu@color@graduate{<graduate-color>}
+\def\pingu@color@graduate@tassel{<graduate-tassel-color>}
+\subkeyexplain{graduate}{graduate tassel width}{length}{\pingu@x@tassel@width}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[graduate, graduate tassel,
+ graduate tassel width=2mm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyalias{graduate cap tassel width}{graduate tassel width}{graduate}
+}
+
+{\def\pingu@color@graduate{<graduate-color>}
+\def\pingu@color@graduate@tassel{<graduate-tassel-color>}
+\subkeyexplain{graduate}{graduate tassel length}{length}{\pingu@x@tassel@length}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[graduate, graduate tassel,
+ graduate tassel length=12mm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyalias{graduate cap tassel length}{graduate tassel length}{graduate}
+}
+
+{\def\pingu@color@graduate{<graduate-color>}
+\def\pingu@color@graduate@tassel{<graduate-tassel-color>}
+\def\pingu@x@tassel@width{<graduate-tassel-width>}
+\subkeyexplain{graduate}{graduate tassel drop size}{length}{\pingu@x@tassel@length}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[graduate, graduate tassel,
+ graduate tassel drop size=4mm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyalias{graduate cap tassel drop size}{graduate tassel drop size}{graduate}
+}
+
+\subkeyexplain{graduate}{graduate position}{angle>:(<x>,<y>)<scale}{\pingu@x@graduate@angle:(\pingu@x@graduate@xshift,\pingu@x@graduate@yshift)\{\pingu@x@graduate@scale\}}
+Currently, this is a very cumbersome command to change various graduate parameters at the same time:
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[graduate,
+ graduate position={1:(0cm,-.09cm){1.33}}]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyalias{graduate cap position}{graduate position}{graduate}
+
+
+
+\subsubsection{The space helmet}
+\showkeyexplain{space helmet}{color}{pingu@black!45!white}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[space helmet=green]
+\end{tikzpicture}
+\end{tcblisting}
+\endshowkeyexplain
+
+\subkeyexplain{space helmet}{space helmet glass}{color}{\pingu@color@spacehelmet@glass}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[space helmet, space helmet glass=green]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{space helmet}{space helmet glass opacity}{factor}{\pingu@x@spacehelmet@glass@opacity}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[space helmet, space helmet glass opacity=1]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{space helmet}{space helmet position}{angle>:(<x>,<y>)<scale}{\pingu@x@spacehelmet@angle:(\pingu@x@spacehelmet@xshift,\pingu@x@spacehelmet@yshift)\{\pingu@x@spacehelmet@scale\}}
+Currently, this is a very cumbersome command to change various space helmet parameters at the same time:
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[space helmet, space helmet position={1:(0cm,-.09cm){1.33}}]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+
\subsubsection{The mitra}
\showkeyexplain{mitra}{color}{pingu@red!67!pingu@black}
\begin{tcblisting}{@}
@@ -2580,7 +2721,7 @@ Currently, this is a very cumbersome command to change various hat parameters at
\end{tcblisting}
\endsubkeyexplain
-\subkeyexplain{mitra}{mitra overset}{lenght}{\pingu@x@mitra@overset}
+\subkeyexplain{mitra}{mitra overset}{length}{\pingu@x@mitra@overset}
\begin{tcblisting}{@}
\begin{tikzpicture}
\pingu[mitra,mitra overset=2.5mm]
@@ -4188,7 +4329,7 @@ Changes the banners right stick length:
\end{tcblisting}
\endsubkeyexplain
-\subkeyexplain{banner}{banner sticks length}{color}{\pingu@banner@stick@left@l}
+\subkeyexplain{banner}{banner sticks length}{length}{\pingu@banner@stick@left@l}
Calls \keyref{banner stick left length} and \keyref{banner stick right length} with the same length:
\begin{tcblisting}{@}
\begin{tikzpicture}
@@ -4344,6 +4485,202 @@ Change the bending of the banner:
\end{tcblisting}
\endsubkeyexplain
+\subsubsection{The flower}
+
+\showkeyexplain{flower left}{color}{pingu@white!80!pingu@black}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left=green]
+\end{tikzpicture}
+\end{tcblisting}
+\endshowkeyexplain
+
+\subkeyexplain{flower left}{flower left size}{length}{\pingu@flower@left@size}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left size=12mm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower left}{flower left center}{color}{\pingu@color@flower@left@center}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left center=green]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower left}{flower left center size}{length}{\pingu@flower@left@center@size}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left center size=1cm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyexplain{flower left}{flower left stem}{color}{\pingu@color@flower@left@stem}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left stem=purple]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower left}{flower left stem length}{length}{\pingu@flower@left@stem@length}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left stem length=1cm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower left}{flower left stem width}{length}{\pingu@flower@left@stem@width}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left stem width=1cm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower left}{flower left stem tilt}{length}{\pingu@flower@left@stem@tilt}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left stem tilt=-1cm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower left}{flower left petal count}{count}{\pingu@flower@left@petals}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left petal count=8]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower left}{flower left petal width}{length}{\pingu@flower@left@petals@width}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left petal width=1cm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower left}{flower left petal start angle}{length}{\pingu@flower@left@petals@start@angle}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left petal start angle=-40]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower left}{flower left petal peak}{factor}{\pingu@flower@left@petals@peak}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower left, flower left petal peak=12]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+
+\showkeyexplain{flower right}{color}{pingu@white!80!pingu@black}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right=green]
+\end{tikzpicture}
+\end{tcblisting}
+\endshowkeyexplain
+
+\subkeyexplain{flower right}{flower right size}{length}{\pingu@flower@right@size}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right size=12mm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower right}{flower right center}{color}{\pingu@color@flower@right@center}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right center=green]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower right}{flower right center size}{length}{\pingu@flower@right@center@size}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right center size=1cm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+\subkeyexplain{flower right}{flower right stem}{color}{\pingu@color@flower@right@stem}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right stem=purple]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower right}{flower right stem length}{length}{\pingu@flower@right@stem@length}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right stem length=1cm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower right}{flower right stem width}{length}{\pingu@flower@right@stem@width}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right stem width=1cm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower right}{flower right stem tilt}{length}{\pingu@flower@right@stem@tilt}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right stem tilt=-1cm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower right}{flower right petal count}{count}{\pingu@flower@right@petals}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right petal count=8]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower right}{flower right petal width}{length}{\pingu@flower@right@petals@width}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right petal width=1cm]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower right}{flower right petal start angle}{length}{\pingu@flower@right@petals@start@angle}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right petal start angle=-40]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+\subkeyexplain{flower right}{flower right petal peak}{factor}{\pingu@flower@right@petals@peak}
+\begin{tcblisting}{@}
+\begin{tikzpicture}
+ \pingu[flower right, flower right petal peak=12]
+\end{tikzpicture}
+\end{tcblisting}
+\endsubkeyexplain
+
+
+
+
\subsubsection{The cane}
\showkeyexplain{cane left}{color}{pingu@bronze}
@@ -7098,11 +7435,11 @@ As another example, this is the definition of the \say{flat bill} (\keyref{bill
% \end{commandexplain}
\begin{commandexplain}{pingu@headcon@x}{}
- This dimension holds a hardcoded value defining the x-position offseting the connection point of the penguin head. Its default value is \the\pingu@headcon@x. It may be removed in the future (or replaced by an option).
+ This dimension holds a hardcoded value defining the x-position offsetting the connection point of the penguin head. Its default value is \the\pingu@headcon@x. It may be removed in the future (or replaced by an option).
\end{commandexplain}
\begin{commandexplain}{pingu@headcon@y}{}
- This dimension holds a hardcoded value defining the y-position offseting the connection point of the penguin head. Its default value is \the\pingu@headcon@y. It may be removed in the future (or replaced by an option).
+ This dimension holds a hardcoded value defining the y-position offsetting the connection point of the penguin head. Its default value is \the\pingu@headcon@y. It may be removed in the future (or replaced by an option).
\end{commandexplain}
\subsubsection{The Code}
@@ -7114,9 +7451,9 @@ This code, defines three commands: \cmddef{pingu@bodytype@select}, \cmddef{pingu
The macro \cmddef{pingu@x@bodytype@none} is defined as follows:
\includecode{pingu@x@bodytype@none}
-\important\space Please note, that when writing the initial penguin, i did not intend to allow additional body shapes. Therefore, most of the defaults and \say{globals} are must be defined here (alongside a lot of hardcoding).
+\important\space Please note, that when writing the initial penguin, I did not intend to allow additional body shapes. Therefore, most of the defaults and \say{globals} must be defined here (alongside a lot of hardcoding).
-Within the initialization of all penguin options, we defuine the main colors:
+Within the initialization of all penguin options, we define the main colors:
% \pgfqkeys{/pingu}{
\includecode{bodytype\ keys}
With this, the body has three colors to work with: \cmdcoldef{body@main}, \cmdcoldef{body@head}, and \cmdcoldef{body@front}.
@@ -7162,7 +7499,7 @@ With this, the body has three colors to work with: \cmdcoldef{body@main}, \cmdco
\subsubsection{The Code}
-Similary to the eyes, the feet of the penguin are controlled by two selections for the left, and the right foot. There are no extra coordinates necessary, therefore \cmdref{pingu@create@selection} receives no argument for the \textit{none}-version:
+Similarly to the eyes, the feet of the penguin are controlled by two selections for the left, and the right foot. There are no extra coordinates necessary, therefore \cmdref{pingu@create@selection} receives no argument for the \textit{none}-version:
\includecode{feet\ selectors}
This defines the six commands: \cmddef{pingu@leftfoot@select}, \cmddef{pingu@leftfoot@add}, \cmddef{@pingu@drawer@leftfoot@}, \cmddef{pingu@rightfoot@select}, \cmddef{pingu@rightfoot@add}, and \cmddef{@pingu@drawer@rightfoot@}.
@@ -7181,7 +7518,7 @@ Now on how to add new feet. While it is possible to use \cmdref{pingu@leftfoot@a
For this, i created the command \cmdref{pingu@feet@s}\ldots
\begin{commandexplain}{pingu@feet@s}{\mand{name}\mand{left-foot}\mand{right-foot}\opt[pingu@yellow]{default color}}
- Allows to easily add new feet.
+ Allows easily adding new feet.
\end{commandexplain}
The macro \cmdref{pingu@feet@s} is defined with the help of \cmddef{pingu@feet@s@} like this:
\includecode{pingu@feet@s}
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-emotions.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-emotions.lib.tex
deleted file mode 100644
index b482ccb220..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-emotions.lib.tex
+++ /dev/null
@@ -1,56 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@eyes@s{sad}{%
- \path (\pingu@name-eye-back-left)++(\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-left);
- \pingu@block{\pingu@color@eye@left} (\pingu@name-eye-left)++(15:.1225cm and .1275cm) arc (15:-245:.1225cm and .1275cm) to[out=-45,in=175] cycle;
-}{%
- \path (\pingu@name-eye-back-right)++(-\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-right);
- \pingu@block{\pingu@color@eye@right} (\pingu@name-eye-right)++(165:.1225cm and .1275cm) arc (165:425:.1225cm and .1275cm) to[out=225,in=5] cycle;
-}
-
-\pingu@eyes@s{angry}{%
- \path (\pingu@name-eye-back-left)++(\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-left);
- \pingu@block{\pingu@color@eye@left} (\pingu@name-eye-left) ellipse [x radius=.1225cm, y radius=.1275cm];
- \pingu@block{\pingu@color@body@front} (\pingu@name-eye-left) ++(120:.1225cm and .1275cm) ellipse [x radius=1.5mm,y radius=.5mm];
-}{%
- \path (\pingu@name-eye-back-right)++(-\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-right);
- \pingu@block{\pingu@color@eye@right} (\pingu@name-eye-right) ellipse [x radius=.1225cm, y radius=.1275cm];
- \pingu@block{\pingu@color@body@front} (\pingu@name-eye-right) ++(60:.1225cm and .1275cm) ellipse [x radius=1.5mm,y radius=.5mm];
-}
-
-\pingu@bill@s{angry}{%
-\pingu@block{\pingu@color@bill} (\pingu@name-bill)++(-.19cm,0)
- to[out=-90,in=170] ++(1.9mm,-2.25mm) coordinate (\pingu@name-bill-bottom)
- to[out=10,in=-90] ++(1.9mm,2.25mm)
- to[bend right=.25cm] cycle;
-}
-
-\pingu@create@extra{blush}{%
- blush/.code = \pingu@set@extra{blush}{true}\pingu@color{blush}{#1},
- blush/.default = pingu@red,
- blush second/.code = \pingu@color{blush@second}{#1},
- blush opacity/.code = \def\pingu@x@blush@opacity{#1},
-}{blush opacity=.35,blush second=\pingu@color@blush}
-\def\pingu@draw@eb@blush{%
- \pingu@block[/pingu/@glow,opacity=\pingu@x@blush@opacity]{\pingu@color@blush} ([yshift=-2.7mm,xshift=-1.85mm]\pingu@name-eye-right) ellipse [x radius=2.66mm,y radius=2.25mm];
- \pingu@block[/pingu/@glow,opacity=\pingu@x@blush@opacity]{\pingu@color@blush@second} ([yshift=-2.7mm,xshift=1.85mm]\pingu@name-eye-left) ellipse [x radius=2.66mm,y radius=2.25mm];
-}
-
-\pingu@eyes@s{hearts}{%
- \path (\pingu@name-eye-back-left)++(\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-left);
- \pingu@block[rounded corners=0pt]{\pingu@color@eye@left} ([yshift=.3mm]\pingu@name-eye-left) arc(0:180:.065cm)
- to[out=270,in=110] ++(.13cm,-.2cm) to[out=70,in=270] ++(.13cm,.2cm) arc (0:180:.065cm) -- cycle;
-}{%
- \path (\pingu@name-eye-back-right)++(-\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-right);
- \pingu@block{\pingu@color@eye@right} ([yshift=.3mm]\pingu@name-eye-right) arc(0:180:.065cm)
- to[out=270,in=110] ++(.13cm,-.2cm) to[out=70,in=270] ++(.13cm,.2cm) arc (0:180:.065cm) -- cycle;
-}
-
-\pingu@eyes@s{critical}{%
- \pingu@block{\pingu@color@eye@left} ([yshift=.75mm,xshift=\pingu@eye@shift]\pingu@name-eye-back-left) coordinate (\pingu@name-eye-left) ellipse [x radius=1.13mm, y radius=.145cm];
- \pingu@draw[thick]{\pingu@color@eye@left} (\pingu@name-eye-left)++(45:1.35mm and 1.85mm) arc(45:135:1.35mm and 1.85mm);
-}{%
- \pingu@block{\pingu@color@eye@right} ([yshift=.75mm,xshift=-\pingu@eye@shift]\pingu@name-eye-back-right) coordinate(\pingu@name-eye-right) ellipse [x radius=1.13mm, y radius=.145cm];
- \pingu@draw[thick]{\pingu@color@eye@right} (\pingu@name-eye-right)++(45:1.35mm and 1.85mm) arc(45:135:1.35mm and 1.85mm);
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-flags.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-flags.lib.tex
deleted file mode 100644
index 3e1955bb1a..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-flags.lib.tex
+++ /dev/null
@@ -1,45 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@wing@extra{flag}{%
- flag \@lr/.code = {\pingu@set@extra{flag\@lr}{true}\pingu@color{flag\@lr}{##1}},
- flag \@lr/.default = pingu@purple,
- flag \@lr\space pole/.code = \pingu@color{flag\@lr @pole}{##1},
- flag \@lr\space code/.code = \expandafter\def\csname pingu@flag@\@lr @code\endcsname{##1},
- flag \@lr\space bobble/.code = {\pingu@color{flag\@lr @bobble}{##1}},
- pride flag \@lr/.style = {%
- /pingu/flag \@lr\space code = {%
- \noexpand\node[/pingu/@flag@first,/pingu/@flag={{rgb:yellow,1;red,5;magenta,2;black,1}}{1.9mm}] (a) at (0,0) {};
- \noexpand\node[below,/pingu/@flag={{rgb:yellow,5;red,5;green,1;white,1}}{1.9mm}] (b) at (a.south) {};
- \noexpand\node[below,/pingu/@flag={yellow}{1.9mm}] (c) at (b.south) {};
- \noexpand\node[below,/pingu/@flag={{rgb:blue,1;cyan,1;green,4;black,2}}{1.9mm}] (d) at (c.south) {};
- \noexpand\node[below,/pingu/@flag={{rgb:magenta,3;blue,5;cyan,4;black,3}}{1.9mm}] (e) at (d.south) {};
- \noexpand\node[below,/pingu/@flag={{rgb:red,2;magenta,2;blue,5}}{1.9mm}] (f) at (e.south) {};
- }, /pingu/flag \@lr, /pingu/flag \@lr\space pole={##1}%
- },%
- @flag/.style 2 args={tape bend height=.5mm,shape=tape,minimum height=##2, minimum width=15mm,outer sep=\z@,inner sep=\z@,fill=##1,draw=##1,rotate=\noexpand\@angle},
- pride flag \@lr/.default = pingu@bronze,%
- german flag \@lr/.style = {%
- /pingu/flag \@lr\space code = {%
- \noexpand\node[/pingu/@flag@first,/pingu/@flag={black}{3.33mm}] (a) at (0,0) {};
- \noexpand\node[below,/pingu/@flag={red}{3.33mm}] (b) at (a.south) {};
- \noexpand\node[below,/pingu/@flag={yellow}{3.33mm}] (c) at (b.south) {};
- }, /pingu/flag \@lr, /pingu/flag \@lr\space pole={##1}%
- },%
- german flag \@lr/.default = pingu@bronze%
-}{flag \@lr\space bobble=pingu@bronze, flag \@lr\space pole=pingu@bronze, flag \@lr\space code = {%
- \noexpand\node[/pingu/@flag@first,/pingu/@flag={\noexpand\@col}{9.75mm}] (a) at (0,0) {};
-}}
-\def\pingu@draw@wi@flag#1{%
- \pingu@setup@wing{flag}{#1}%
-\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
- % NOTE: not full foreground if placed under the wing
- \pingu@layer{foreground}[shift={(\pingu@name-wing-#1)},shift={(\@sidesign*.15mm,17.5mm-3.5\p@)}]
- \if@pingu@wing@item@side@left@\pgfqkeys{/pingu}{@flag@first/.style={below right}}\else\pgfqkeys{/pingu}{@flag@first/.style={below left}}\fi
- \csname pingu@flag@#1@code\endcsname
- \pingu@block[thick]{\csname pingu@color@flag#1@pole\endcsname}(\pingu@name-wing-#1)++(\@sidesign*-.15mm,3mm) -- ++(0,13.65mm) -| ++(\@sidesign*.6mm,-13.65mm) -- cycle;
- \endpingu@layer
- \pingu@block[thick]{\csname pingu@color@flag#1@pole\endcsname}(\pingu@name-wing-#1)++(\@sidesign*-.15mm,-3mm) -- ++(0,20mm) arc(180:0:\@sidesign*.3mm and .375mm) -- ++(0,-20mm) arc(360:180:\@sidesign*.3mm and .375mm) -- cycle;
- \pingu@block{\csname pingu@color@flag#1@bobble\endcsname} (\pingu@name-wing-#1)++(\@sidesign*.15mm,17.5mm) circle [radius=2.15\p@];
-\endscope
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-formal.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-formal.lib.tex
deleted file mode 100644
index 7e058876b9..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-formal.lib.tex
+++ /dev/null
@@ -1,116 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@extra{tie}{%
- tie/.code = \pingu@set@extra{tie}{true}\pingu@color{tie}{#1},
- tie/.default = pingu@green,
- tie knot/.code = \pingu@color{tie@knot}{#1},
- tie length/.code = \def\pingu@x@tie@length{#1},
- tie offset/.code = \def\pingu@x@tie@offset{#1},
- tie width/.code = \def\pingu@x@tie@width{#1},
- tie pattern/.code = \def\pingu@x@tie@pattern{#1},
- tie dots/.style = {%
- tie pattern={%
- \pingu@block[postaction={pattern={Dots[angle=40,distance=1.5pt,radius=.35pt]},pattern color=#1}]{\pingu@color@tie} \pingupathxtie;
- \pingu@block[postaction={pattern={Dots[angle=-30,distance=1.45pt,radius=.35pt@]},pattern color=#1}]{\pingu@color@tie@knot} \pingupathxtieknot;
- }%
- },
- tie dots/.default={pingu@white}%
-}{% defaults
- tie length=.625\pingu@side@h@half, tie offset=.399cm,%
- tie knot=\pingu@color@tie!92!black, tie width=.21cm,%
- tie pattern={%
- \pingu@block{\pingu@color@tie} \pingupathxtie;
- \pingu@block{\pingu@color@tie@knot} \pingupathxtieknot;
- }%
-}
-\def\pingupathxtie{[rounded corners=.15mm] (\pingu@name-tie-start)++(-.4mm,-.25mm) -- ++(-\pingu@x@tie@width/2, -\pingu@x@tie@length+.125cm) -- ++(\pingu@x@tie@width/2+.4mm,-.125cm) -- ++(\pingu@x@tie@width/2+.4mm,.125cm) -- +(-\pingu@x@tie@width/2, \pingu@x@tie@length-.125cm) -- cycle}
-\def\pingupathxtieknot{[rounded corners=.25mm] (\pingu@name-tie-start)++(-.095cm-.02*\pingu@x@tie@width,\z@) -- ++(.3mm,-.15cm-.01*\pingu@x@tie@width) -- ++(.13cm+.04*\pingu@x@tie@width,\z@) -- ++(.3mm,.15cm+.01*\pingu@x@tie@width) -- cycle}
-\def\pingu@draw@eb@tie{%
- \path (\pingu@name-bill)++(0,-\pingu@x@tie@offset) coordinate(\pingu@name-tie-start);
- \pingu@x@tie@pattern
-}
-
-\pingu@create@extra{bowtie}{%
- bowtie/.forward to = /pingu/bow tie,
- bow-tie/.forward to = /pingu/bow tie,
- bow tie/.code = \pingu@set@extra{bowtie}{true}\pingu@color{bowtie}{#1},
- bow tie/.default = pingu@blue,
- bow tie b/.code = \pingu@color{bowtie@b}{#1},
- bowtie b/.forward to = /pingu/bow tie b,
- bow-tie b/.forward to = /pingu/bow tie b,
- bowtie offset/.forward to = /pingu/bow tie offset,
- bow-tie offset/.forward to = /pingu/bow tie offset,
- bow tie offset/.code = \def\pingu@x@bowtie@offset{#1},
- bowtie knot/.forward to = /pingu/bow tie knot,
- bow-tie knot/.forward to = /pingu/bow tie knot,
- bow tie knot/.code = \pingu@color{bowtie@knot}{#1},
-}{% defaults
- bow tie knot=\pingu@color@bowtie!92!black,bow tie offset=.315cm,%
- bow tie b=\pingu@color@bowtie%
-}
-
-\def\pingupathxbowtieknot{[rounded corners=.25mm] (\pingu@name-bow-tie-start)++(-.0625cm,-.35mm) to[bend right=10] ++(.125cm,0) -- ++(0,-.13cm) to[bend right=10] ++(-.125cm, 0) -- cycle}
-\def\pingupathxbowtieleft{[rounded corners=.25mm] (\pingu@name-bow-tie-start)++(-.15mm,-.06cm) to[out=155,in=-5] ++(-.25cm,.065cm) to[bend right=15] ++(0,-.21cm) to[in=-155,out=5] ++(.25cm,.065cm) -- cycle}
-\def\pingupathxbowtieright{[rounded corners=.25mm] (\pingu@name-bow-tie-start)++(.15mm,-.06cm) to[out=25,in=-175] ++(.25cm,.065cm) to[bend left=15] ++(0,-.21cm) to[in=-25,out=175] ++(-.25cm,.065cm) -- cycle}
-\def\pingu@draw@eb@bowtie{%
- \path (\pingu@name-bill)++(0,-\pingu@x@bowtie@offset) coordinate(\pingu@name-bow-tie-start);
- \pingu@block{\pingu@color@bowtie} \pingupathxbowtieleft;
- \pingu@block{\pingu@color@bowtie@b} \pingupathxbowtieright;
- \pingu@block{\pingu@color@bowtie@knot} \pingupathxbowtieknot;
-}
-
-\newif\if@pingu@x@pants@bands
-\pingu@create@extra{pants}{%
- pants/.code = \pingu@set@extra{pants}{true}\pingu@color{pants}{#1},
- pants/.default = pingu@red,
- pants bands/.is if = @pingu@x@pants@bands,
- pants button left/.code = \pingu@color{pants@button@left}{#1},
- pants button right/.code = \pingu@color{pants@button@right}{#1},
- pants buttons/.style = {/pingu/pants button left={#1}, /pingu/pants button right={#1}},
- pants button left shade/.code = \pingu@color{pants@button@left@shade}{#1},
- pants button right shade/.code = \pingu@color{pants@button@right@shade}{#1},
- pants buttons shade/.style = {/pingu/pants button left shade={#1}, /pingu/pants button right shade={#1}},
- pants without buttons/.forward to=/pingu/pants no buttons,
- pants no buttons/.style = {/pingu/pants buttons=\@pingu@none, /pingu/pants buttons shade=\@pingu@none},
- pants extra height/.code = \def\pingu@x@pants@extra@height{#1},
-}{pants extra height=1.5mm,pants buttons=pingu@black,pants button left shade=\pingu@color@pants@button@left!70!white,pants button right shade=\pingu@color@pants@button@right!70!white}
-
-\def\pingu@draw@eb@pants{%
-\pingu@block[rounded corners=\p@]{\pingu@color@pants} ([xshift=.85mm,yshift=\pingu@x@pants@extra@height]\pingu@name-waist-right) coordinate(@tmp) to[bend right=6] ([xshift=-.85mm,yshift=\pingu@x@pants@extra@height]\pingu@name-waist-left) coordinate(@tmpb) -- ++(0,-\pingu@x@pants@extra@height) arc(180:270:.85mm and 2.25mm) to[bend left=\pingu@bend] (\pingu@name-bottom-center-|\pingu@name-waist-left) to[bend left=15] ([yshift=-.15mm]\pingu@name-bottom-center) to[bend left=15] (\pingu@name-bottom-center-|\pingu@name-waist-right) to[bend left=6] ([yshift=-2.5mm]\pingu@name-waist-right) arc (-90:0:.85mm and 2.25mm) -- cycle;
-\if@pingu@x@pants@bands
-\pingu@layer{middle}[]
-% draw stripes
-\scope
-\clip \pingu@path@lowerpingu;
-\pingu@block{\pingu@color@pants} (@tmp)++(.55mm,-\pingu@one) to[bend right=3] ([yshift=1.65mm]\pingu@name-wings-side-right) -- ++(-.25mm,-.25mm) to[bend left=3] ([yshift=-\pingu@one]@tmp) -- cycle;
-\pingu@block{\pingu@color@pants} (@tmpb)++(-.55mm,-\pingu@one) to[bend left=3] ([yshift=1.65mm]\pingu@name-wings-side-left) -- ++(.25mm,-.25mm) to[bend right=3] ([yshift=-\pingu@one]@tmpb) -- cycle;
-\endscope
-\fi
-\pingu@block{\pingu@color@pants@button@right}(@tmp)++(.25mm,-.25mm)circle[radius=.7mm];
-\pingu@block{\pingu@color@pants@button@left}(@tmpb)++(-.25mm,-.25mm)circle[radius=.7mm];
-\pingu@block[even odd rule]{\pingu@color@pants@button@right@shade}(@tmp)++(.25mm,-.25mm)circle[radius=.7mm] circle[radius=.615mm];
-\pingu@block[even odd rule]{\pingu@color@pants@button@left@shade}(@tmpb)++(-.25mm,-.25mm)circle[radius=.7mm] circle[radius=.615mm];
-\@for\i:={0,90,180,270}\do{
- \pingu@block{\pingu@color@pants@button@right@shade} (@tmp)++(.25mm,-.25mm)++(\i:.
- 35mm) circle[radius=.1mm];
- \pingu@block{\pingu@color@pants@button@left@shade} (@tmpb)++(-.25mm,-.25mm)++(\i:.35mm) circle[radius=.1mm];
-}%
-\if@pingu@x@pants@bands \endpingu@layer \fi
-}
-
-
-\pingu@create@extra{belt}{%
- belt/.code = \pingu@set@extra{belt}{true}\pingu@color{belt}{#1},
- belt/.default = pingu@bronze!80!black,
- belt knot color/.code = \pingu@color{belt@knot}{#1}
-}{% defaults
- belt knot color = pingu@silver
-}
-
-\def\pingu@draw@eb@belt@wh{1.25mm}
-\def\pingu@draw@eb@belt{%
- \path ([yshift=-1.66mm/2]\pingu@name-waist-left) -- ([yshift=-1.66mm/2]\pingu@name-waist-right) coordinate[pos=.5] (\pingu@name @belt@center);
- \pingu@block[rounded corners=.5pt]{\pingu@color@belt} (\pingu@name-waist-left) coordinate (@) to[bend left=5] (\pingu@name-waist-right) -- ++(0,-1.66mm) to[bend right=5] ([yshift=-1.66mm]@) -- cycle;
- \pingu@block[rounded corners=1.5pt]{\pingu@color@belt@knot} ([xshift=-1mm,yshift=-.7mm-1.66mm/2]\pingu@name @belt@center) rectangle ++(2mm,2mm);
-}
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-fun.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-fun.lib.tex
deleted file mode 100644
index f4d49e5cad..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-fun.lib.tex
+++ /dev/null
@@ -1,309 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@extra{cakehat}{%
- cake-hat/.code = \pingu@set@extra{cakehat}{true}\pingu@color{cakehat}{#1},
- cake-hat/.default = pingu@white!92!\pingu@color@cakehat@top,
- cake-hat top/.code = \pingu@color{cakehat@top}{#1},
- cake-hat shade/.code = \pingu@color{cakehat@shade}{#1},
- cake-hat candle/.code = \pingu@color{cakehat@candle}{#1},
- cake-hat candle fire/.code = \pingu@color{cakehat@candle@fire}{#1},
- cake-hat candle fire 2/.code = \pingu@color{cakehat@candle@fire@b}{#1},
- cake-hat candle fire 3/.code = \pingu@color{cakehat@candle@fire@c}{#1},
- cake-hat candle wick/.code = \pingu@color{cakehat@candle@wick}{#1},
- cake-hat candle shade/.code = \pingu@color{cakehat@candle@shade}{#1},
- cake-hat candle back/.code = \pingu@color{cakehat@candle@back}{#1},
- cake-hat outline/.code = \pingu@color{cakehat@outline}{#1},
- cake-hat outline width/.code = \def\pingu@x@cakehat@outline@w{#1},
- cake-hat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@cakehat@angle{#1}\def\pingu@x@cakehat@xshift{#2}\def\pingu@x@cakehat@yshift{#3}\def\pingu@x@cakehat@scale{#4}}
-}{cake-hat position={-9:(1mm,0mm)1},cake-hat outline=pingu@black!80!\pingu@color@cakehat,cake-hat outline width=.25pt,cake-hat top=pingu@purple,cake-hat candle=pingu@purple!60!pingu@black,cake-hat candle back=\pingu@color@cakehat@candle!85!black,cake-hat candle wick=pingu@black,cake-hat candle fire=pingu@red,cake-hat candle fire 2=\pingu@color@cakehat@candle@fire!50!yellow,cake-hat candle fire 3=\pingu@color@cakehat@candle@fire@b!50!white,cake-hat shade=gray,cake-hat candle shade=gray!80!\pingu@color@cakehat@candle@back}
-
-\def\pingu@p@cake@outline{(-6.25mm,-.25cm) to[bend left=2] (\pingu@name-cake-tl) arc (180:0:1.375cm/2+.01mm and 1.41mm) to[bend left=2] ++(0,-3.125mm*.97) to[bend left=20] (-6mm,-.26cm) -- cycle}
-\def\pingu@draw@ea@cakehat{%
-\scope[rotate around={\pingu@x@cakehat@angle:(\pingu@name-head-top)},%
-shift={(\pingu@name-head-top)},
-shift={(\pingu@x@cakehat@xshift,\pingu@x@cakehat@yshift)},
-scale=\pingu@x@cakehat@scale]
- \pingu@block{\pingu@color@cakehat} [rounded corners=.2mm](-6.25mm,-.25cm) to[bend left=2] coordinate[pos=.97] (\pingu@name-cake-tl) ++(0,3.125mm) to[bend right=20]
- ++(1.375cm,0) to[bend left=2] coordinate[pos=.03] (\pingu@name-cake-tr) ++(0,-3.125mm) to[bend left=20] (-6mm,-.26cm) -- cycle;
- \pingu@block[fill opacity=.1]{\pingu@color@cakehat@shade} [rounded corners=.2mm](-6.25mm,-.25cm) to[bend right=20]
- ++(1.375cm,0) to[bend right=2] ++(0,3.125mm) [sharp corners] to[bend left=20] (-6.25mm,-.225cm) [rounded corners=.2mm] -- cycle;
- \path (\pingu@name-cake-tl) -- (\pingu@name-cake-tr) coordinate[pos=.5] (\pingu@name-cake-tc);
- % cake side
- \scope
- \clip\pingu@p@cake@outline;
- \path (\pingu@name-cake-tl) arc (180:360:1.375cm/2+.01mm and 1.41mm) foreach[count=\i] \a in {0,.19,.295,.375,.485,.625,.72,.85,1} {coordinate[pos=\a] (\pingu@name-cake-\i)};
- \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-1) ellipse [x radius=.255mm,y radius=2mm];
- \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-9) ellipse [x radius=.265mm,y radius=1.45mm];
- \foreach \i in {2,...,9} {
- \pgfmathsetmacro\@tmprand{rand}
- \pingu@draw[opacity=.5]{gray} (\pingu@name-cake-\i)++(-.02mm,0) to[bend left=1] ++(+.145mm,{-1.075mm-(\@tmprand+.15)*.5125mm}) arc(370:300:.145mm);
- \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-\i)++(0,.1mm) -- ++(-.125mm,0) to[bend left=1] ++(0,{-1.2mm-(\@tmprand+.15)*.5125mm}) arc(170:370:.145mm) to[bend right=1] cycle;
- }
- \foreach \i in {2,...,9} {
- \ifnum\i=2\relax
- \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-\the\numexpr\i-1\relax)++(-.05mm,-.5mm) to[bend left=8] ([xshift=-.05mm,yshift=-.25mm]\pingu@name-cake-\i) -- ++(0,.33mm) to[bend right=30] (\pingu@name-cake-\the\numexpr\i-1\relax);
- \else\ifnum\i=9\relax
- \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-\the\numexpr\i-1\relax)++(-.05mm,-.25mm) to[bend left=8] ([xshift=-.05mm,yshift=-.5mm]\pingu@name-cake-\i) -- ++(0,.33mm) to[bend right=30] (\pingu@name-cake-\the\numexpr\i-1\relax);
- \else
- \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-\the\numexpr\i-1\relax)++(-.05mm,-.25mm) to[bend left=9.5+2*rand] ([xshift=-.05mm,yshift=-.25mm]\pingu@name-cake-\i) -- ++(0,.33mm) to[bend right=30] (\pingu@name-cake-\the\numexpr\i-1\relax);
- \fi\fi
- }
- \endscope
- \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-tc) ellipse [x radius=1.375cm/2+.01mm, y radius=1.41mm];
- % outline
- \pingu@draw[line width=\pingu@x@cakehat@outline@w,rounded corners=.075mm]{\pingu@color@cakehat@outline} \pingu@p@cake@outline;
-% % 3d sides
-% \pingu@block[rounded corners=.04mm]{\pingu@color@cakehat@top} ([xshift=.1mm,yshift=.125mm]\pingu@name-cake-tl) to[out=246,in=97] ++(-.11mm,-2.125mm) -- ++(.04mm,0) to[bend right=12] (\pingu@name-cake-ttl) -- cycle;
-% \pingu@block[rounded corners=.09mm]{green} ([xshift=-.1mm]\pingu@name-cake-ttr) to[out=294,in=83] ++(.125mm,-2.125mm) to[bend left=12] ([xshift=-.11mm,yshift=.125mm]\pingu@name-cake-tr) -- cycle;
- % candle
- \pingu@block{\pingu@color@cakehat@candle@back} (\pingu@name-cake-tc)++(.8mm,2.66mm) to[bend right=7] ++(-1.1mm,-.1mm) to[bend right=30]++(1.1mm,0) -- cycle;
- % wick
- \pingu@draw[very thin]{\pingu@color@cakehat@candle@wick} (\pingu@name-cake-tc)++(.25mm,2mm) to[out=75,in=-95] coordinate[pos=.8] (\pingu@name-wick-1) ++(0,1mm) coordinate(\pingu@name-wick-top);
- \pingu@block{\pingu@color@cakehat@candle@fire} (\pingu@name-wick-1)++(-.045mm,0) to[out=115,in=240] ++(0,1.5mm) to[out=300,in=65] ([xshift=.045mm]\pingu@name-wick-1) -- cycle;
- \pingu@block{\pingu@color@cakehat@candle@fire@b} (\pingu@name-wick-1)++(-.045mm,0) to[out=105,in=240] ++(0,1.3mm) to[out=300,in=75] ([xshift=.045mm]\pingu@name-wick-1) -- cycle;
- \pingu@block{\pingu@color@cakehat@candle@fire@c} (\pingu@name-wick-1)++(-.035mm,0) to[out=95,in=250] ++(0,1.1mm) to[out=290,in=85] ([xshift=.035mm]\pingu@name-wick-1) -- cycle;
- % front
- \pingu@block{\pingu@color@cakehat@candle} (\pingu@name-cake-tc)++(.25mm,0) ++(.55mm,0) to[bend left=0.5] ++(0,2.66mm) to[bend left=20] ++(-1.1mm,-.1mm) to[bend right=0.5] ++(0,-2.66mm) to[bend right=20] cycle;
- \pingu@block[fill opacity=.125]{\pingu@color@cakehat@candle@shade} (\pingu@name-cake-tc)++(-.3mm,-.1mm) to[bend right=20] ++(1.1mm,0) to[bend left=.5] ++(0,2.66mm) to[bend left=15] ++(-1.1mm,-2.5mm) -- cycle;
- \pingu@block[fill opacity=.225]{\pingu@color@cakehat@candle@shade} (\pingu@name-cake-tc)++(-.3mm,-.1mm) to[bend left=2] ++(1.1mm,-1.1mm) to[bend left=5] ++(1.1mm,0) to[bend left=2] ++(-1.1mm,1.2mm) to[bend left =15] cycle;
- \pingu@block[fill opacity=.225]{\pingu@color@cakehat@candle@shade} (\pingu@name-cake-tc)++(1.35mm,-1.25mm) circle [radius=.1mm];
-\endscope
-}
-\pingu@create@extra{pumpkinhat}{%
- pumpkin-hat/.code = \pingu@set@extra{pumpkinhat}{true}\pingu@color{pumpkinhat}{#1},
- pumpkin-hat/.default = pingu@bronze!97!white,
- pumpkin-hat stalk/.code = \pingu@color{pumpkinhat@stalk}{#1},
- pumpkin-hat stalk top/.code = \pingu@color{pumpkinhat@stalk@top}{#1},
- pumpkin-hat stripe a/.code = \pingu@color{pumpkinhat@stripe@a}{#1},
- pumpkin-hat stripe b/.code = \pingu@color{pumpkinhat@stripe@b}{#1},
- pumpkin-hat stripe c/.code = \pingu@color{pumpkinhat@stripe@c}{#1},
- pumpkin-hat outline/.code = \pingu@color{pumpkinhat@outline}{#1},
- pumpkin-hat outline width/.code = \def\pingu@x@pumpkinhat@outline@w{#1},
- pumpkin-hat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@pumpkinhat@angle{#1}\def\pingu@x@pumpkinhat@xshift{#2}\def\pingu@x@pumpkinhat@yshift{#3}\def\pingu@x@pumpkinhat@scale{#4}}
-}{pumpkin-hat position={-9:(1.65mm,.25mm)1.05},pumpkin-hat stalk=pingu@green!95!\pingu@color@pumpkinhat!45!pingu@black,pumpkin-hat stalk top=\pingu@color@pumpkinhat@stalk!95!pingu@black,pumpkin-hat stripe a=pingu@black,pumpkin-hat stripe b=\pingu@color@pumpkinhat@stripe@a,pumpkin-hat stripe c=\pingu@color@pumpkinhat@stripe@b,pumpkin-hat outline=pingu@black,pumpkin-hat outline width=.7pt}
-
-\def\pingu@pumpkinhat@outerpath{(0,.125cm)++(-60:6.75mm and 5.5mm) arc(-60:86: 6.75mm and 5.5mm) to[bend left=3] ++(-1.75mm,0) arc(95:242:6.75mm and 5.5mm) to[bend left=5] cycle;}
-\def\pingu@draw@ea@pumpkinhat{%
-\scope[rotate around={\pingu@x@pumpkinhat@angle:(\pingu@name-head-top)},%
-shift={(\pingu@name-head-top)},
-shift={(\pingu@x@pumpkinhat@xshift,\pingu@x@pumpkinhat@yshift)},
-scale=\pingu@x@pumpkinhat@scale]
- % give it a small cut
- \pingu@block{\pingu@color@pumpkinhat} (0,.125cm)++(-60:6.75mm and 5.5mm) coordinate (@pkll) arc(-60:86: 6.75mm and 5.5mm) coordinate (@pkl) to[bend left=3] coordinate[pos=.5] (@pkuc) ++(-1.75mm,0) coordinate (@pkr) arc(95:242:6.75mm and 5.5mm) coordinate (@pklr) to[bend left=5] coordinate[pos=.5] (@pklc) cycle;
- \pingu@draw[line join=round,line width=\pingu@x@pumpkinhat@outline@w]{\pingu@color@pumpkinhat@outline} \pingu@pumpkinhat@outerpath;
-\scope
-\clip (0,.125cm)++(-60:6.75mm and 5.5mm) coordinate (@pkll) arc(-60:86: 6.75mm and 5.5mm) coordinate (@pkl) to[bend left=3] ++(-1.75mm,0) coordinate (@pkr) arc(95:242:6.75mm and 5.5mm) coordinate (@pklr) to[bend left=5] cycle;
- \pingu@draw[line cap=round,opacity=.3]{\pingu@color@pumpkinhat@stripe@a} (@pklr) to[bend left=55] (@pkr);
- \pingu@draw[line cap=round,opacity=.3]{\pingu@color@pumpkinhat@stripe@c} (@pkll) to[bend right=55] (@pkl);
- \pingu@draw[line cap=round,opacity=.3]{\pingu@color@pumpkinhat@stripe@b} (@pklc) to[bend right=5] (@pkuc);
-\endscope
-\pingu@block{\pingu@color@pumpkinhat@stalk} ([yshift=-.5*\pingu@x@pumpkinhat@outline@w]@pkl) to[bend left=3] ([yshift=-.5*\pingu@x@pumpkinhat@outline@w]@pkr) to[bend right=8] ++(.85mm,2mm) -- ++(.65mm,0) coordinate[pos=.5] (@pkc) to[bend right=3] cycle;
-\pingu@block{\pingu@color@pumpkinhat@stalk@top} (@pkc) ellipse[x radius=.65mm/2, y radius=.085mm];
-\endscope
-}
-
-\pingu@create@wing@extra{lollipop}{%
- lollipop \@lr/.code = {\pingu@set@extra{lollipop\@lr}{true}\pingu@color{lollipop\@lr}{##1}},
- lollipop \@lr/.default = pingu@green,
- lollipop \@lr\space handle/.code = \pingu@color{lollipop\@lr @handle}{##1},%
- lollipop \@lr\space second/.code = \pingu@color{lollipop\@lr @second}{##1}%
-}{lollipop \@lr\space handle=pingu@bronze,lollipop \@lr\space second={\csname pingu@color@lollipop\@lr\endcsname!86!white}}
-
-% #1 wing
-\def\pingu@draw@wi@lollipop#1{%
- \pingu@setup@wing{lollipop}{#1}%
- \pingu@draw[thick,rotate around={\@angle:(\pingu@name-wing-#1)}]{\csname pingu@color@lollipop#1@handle\endcsname}(\pingu@name-wing-#1)++(0,4.75mm) -- ++(0,-6.25mm);
- \pingu@block[thick,rotate around={\@angle:(\pingu@name-wing-#1)}]{\@col}(\pingu@name-wing-#1)++(0,4.75mm) coordinate (\pingu@name-lollipop-#1-top) circle[radius=1.4mm];
- \pingu@block[thick,rotate around={\@angle-1:(\pingu@name-lollipop-#1-top)}]{\csname pingu@color@lollipop#1@second\endcsname} (\pingu@name-lollipop-#1-top) ellipse [x radius=1.57mm, y radius=1.5\p@];
- \pingu@block[thick,rotate around={\@angle-1:(\pingu@name-lollipop-#1-top)}]{\@col} (\pingu@name-lollipop-#1-top)++(0,.5\p@) ellipse [x radius=1.4mm, y radius=\p@];
-}
-
-\pingu@create@extra{heart}{%
- heart/.code = {\pingu@set@extra{heart}{true}\pingu@color{heart}{#1}},
- heart/.default = lightgray
-}{}
-
-\def\pingu@draw@eb@heart{%
- \pingu@block[sharp corners]{\pingu@color@heart}
- ([yshift=1mm]\pingu@name-belly-center) arc(0:180:.13cm)
- to[out=270,in=110] ++(.26cm,-.36cm) to[out=70,in=270] ++(.26cm,.36cm) arc (0:180:.13cm) -- cycle;
-}
-
-\pingu@create@extra{vampireteeth}{%
- vampire teeth/.code = {\pingu@set@extra{vampireteeth}{true}\pingu@color{vampireteeth}{#1}},
- vampire teeth/.default = pingu@yellow!10!pingu@black!70!lightgray
-}{}
-
-\def\pingu@draw@eb@vampireteeth{%
- \pingu@block{\pingu@color@vampireteeth} (\pingu@name-bill) ++(-1.35mm,-2.5mm)
- arc(180:0:1.35mm and 2.5mm)
- arc(0:180:1.35mm and .95mm);
-}
-
-\pingu@create@wing@extra{broom}{%
- broom \@lr/.code = {\pingu@set@extra{broom\@lr}{true}\pingu@color{broom\@lr}{##1}},
- broom \@lr/.default = pingu@bronze,
- broom \@lr\space length/.code = \expandafter\def\csname pingu@broom@\@lr @length\endcsname{##1},
- broom \@lr\space shift/.code = \expandafter\def\csname pingu@broom@\@lr @shift\endcsname{##1},
- broom \@lr\space band/.code = \pingu@color{broom@\@lr @band}{##1},
- broom \@lr\space bristles a/.code = \pingu@color{broom@\@lr @bristles@a}{##1},
- broom \@lr\space bristles b/.code = \pingu@color{broom@\@lr @bristles@b}{##1},
- broom \@lr\space bristles c/.code = \pingu@color{broom@\@lr @bristles@c}{##1},
-}{broom \@lr\space length=22mm,broom \@lr\space shift=8mm, broom \@lr\space band=pingu@red!80!pingu@black!80!pingu@bronze, broom \@lr\space bristles a=pingu@bronze!16!pingu@yellow!41!pingu@white!80!brown!95!\csname pingu@color@broom\@lr\endcsname, broom \@lr\space bristles b=\csname pingu@color@broom@\@lr @bristles@a\endcsname!83!pingu@white, broom \@lr\space bristles c=\csname pingu@color@broom@\@lr @bristles@b\endcsname!83!pingu@white}
-\def\pingu@draw@wi@broom#1{%
- \pingu@setup@wing{broom}{#1}%
- % TODO: mirror on other wing?
-\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
- \pingu@block{\csname pingu@color@broom#1\endcsname}(\pingu@name-wing-#1)++(\@sidesign*-.2mm,-\csname pingu@broom@#1@shift\endcsname) -- ++(0,\csname pingu@broom@#1@length\endcsname) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-broom-#1-top) -- ++(0,-\csname pingu@broom@#1@length\endcsname) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
- \pingu@block[rounded corners=.44pt]{\csname pingu@color@broom@#1@bristles@a\endcsname} (\pingu@name-broom-#1-top)++(-1mm,-2mm) to[out=115,in=240] ++(1mm,10.5mm) to[out=300,in=65] ([xshift=.95mm,yshift=-2mm]\pingu@name-broom-#1-top) to[bend right=4] ([xshift=-.75mm,yshift=-2mm]\pingu@name-broom-#1-top) -- cycle;
- \pingu@block[rounded corners=.44pt]{\csname pingu@color@broom@#1@bristles@a\endcsname} (\pingu@name-broom-#1-top)++(-1mm,-2mm) to[out=115,in=240] ++(1.66mm,9.75mm) to[out=300,in=65] coordinate[pos=.81] (@l) coordinate[pos=.79] (@l2) ([xshift=.95mm,yshift=-2mm]\pingu@name-broom-#1-top) to[bend right=4] ([xshift=-.75mm,yshift=-2mm]\pingu@name-broom-#1-top) -- cycle;
- \pingu@block[rounded corners=.44pt]{\csname pingu@color@broom@#1@bristles@a\endcsname} (\pingu@name-broom-#1-top)++(-1mm,-2mm) to[out=115,in=240] coordinate[pos=.17] (@r) coordinate[pos=.19] (@r2) ++(.25mm,10.5mm) to[out=300,in=65] ([xshift=.95mm,yshift=-2mm]\pingu@name-broom-#1-top) to[bend right=4] ([xshift=-.75mm,yshift=-2mm]\pingu@name-broom-#1-top) -- cycle;
- \pingu@block[rounded corners=.44pt]{\csname pingu@color@broom@#1@bristles@b\endcsname} (\pingu@name-broom-#1-top)++(-.75mm,-1.75mm) to[out=115,in=240] ++(1.35mm,9.25mm) to[out=300,in=65] ([xshift=.75mm,yshift=-1.75mm]\pingu@name-broom-#1-top) -- cycle;
- \pingu@block[rounded corners=.44pt]{\csname pingu@color@broom@#1@bristles@b\endcsname} (\pingu@name-broom-#1-top)++(-.75mm,-1.75mm) to[out=115,in=240] ++(0mm,9.65mm) to[out=300,in=65] ([xshift=.75mm,yshift=-1.75mm]\pingu@name-broom-#1-top) -- cycle;
- \pingu@block{\csname pingu@color@broom@#1@bristles@c\endcsname} (\pingu@name-broom-#1-top)++(-.5mm,-1.5mm) to[out=115,in=240] ++(.5mm,9.5mm) to[out=300,in=65] ([xshift=.5mm,yshift=-1.5mm]\pingu@name-broom-#1-top) -- cycle;
- % TODO: broom cap color etc
- \pingu@block{\csname pingu@color@broom@#1@band\endcsname} (@r) to[bend right=10] (@l) -- (@l2) to[bend left=10] (@r2);
-\endscope
-}
-
-\tikzset{pingu@clip even odd rule/.code={\pgfseteorule}, % Credit to Andrew Stacey
-pingu@invclip/.style={
- clip,insert path=
- [pingu@clip even odd rule]{
- [reset cm](-\maxdimen,-\maxdimen)rectangle(\maxdimen,\maxdimen)
- }
-}}
-\pingu@create@extra{jackolantern}{%
- jack o lantern/.code = \pingu@set@extra{jackolantern}{true}\pingu@color{jackolantern}{#1},
- jack o lantern/.default = pingu@bronze!97!pingu@black,
- jack o lantern helmet/.style = {jack o lantern=#1,jack o lantern background=none,jack o lantern position={-2.15:(2.05mm,-11.35mm){1.5}},jack o lantern back stripe a=\@pingu@none, jack o lantern back stripe b=\@pingu@none,jack o lantern back stripe c=\@pingu@none,jack o lantern height=6.25mm,jack o lantern width=6.1mm,hair=\@pingu@none},
- jack o lantern helmet/.default = pingu@bronze!97!pingu@black,
- jack o lantern stalk/.code = \pingu@color{jackolantern@stalk}{#1},
- jack o lantern stalk top/.code = \pingu@color{jackolantern@stalk@top}{#1},
- jack o lantern background/.code= \pingu@color{jackolantern@background}{#1},
- jack o lantern stripe a/.code = \pingu@color{jackolantern@stripe@a}{#1},
- jack o lantern stripe b/.code = \pingu@color{jackolantern@stripe@b}{#1},
- jack o lantern stripe c/.code = \pingu@color{jackolantern@stripe@c}{#1},
- jack o lantern back stripe a/.code = \pingu@color{jackolantern@backstripe@a}{#1},
- jack o lantern back stripe b/.code = \pingu@color{jackolantern@backstripe@b}{#1},
- jack o lantern back stripe c/.code = \pingu@color{jackolantern@backstripe@c}{#1},
- jack o lantern outline/.code = \pingu@color{jackolantern@outline}{#1},
- jack o lantern outline width/.code = \def\pingu@x@jackolantern@outline@w{#1},
- jack o lantern height/.code = \def\pingu@x@jackolantern@height{#1},
- jack o lantern width/.code = \def\pingu@x@jackolantern@width{#1},
- jack o lantern position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@jackolantern@angle{#1}\def\pingu@x@jackolantern@xshift{#2}\def\pingu@x@jackolantern@yshift{#3}\def\pingu@x@jackolantern@scale{#4}}
-}{jack o lantern position={-9:(3.15mm,.95mm){1.3}},jack o lantern stripe a=pingu@black,jack o lantern stripe b=\pingu@color@jackolantern@stripe@a,jack o lantern stripe c=\pingu@color@jackolantern@stripe@b,jack o lantern back stripe a=pingu@black,jack o lantern back stripe b=\pingu@color@jackolantern@stripe@a,jack o lantern back stripe c=\pingu@color@jackolantern@stripe@b,jack o lantern outline=pingu@black,jack o lantern outline width=.7pt,jack o lantern stalk=pingu@green!95!\pingu@color@jackolantern!45!pingu@black,jack o lantern stalk top=\pingu@color@jackolantern@stalk!95!pingu@black,jack o lantern background=\pingu@color@jackolantern!85!pingu@black,jack o lantern height=5.5mm,jack o lantern width=5.75mm}
-
-\def\pingu@jackolantern@outerpath{(0,.125cm)++(-60:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) arc(-60:86:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) to[bend right=3] ++(-3.75mm,0) arc(95:242:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) to[bend left=5] cycle;}
-\def\pingu@x@jackolantern{(-5.15mm,.6mm) to[bend right] ++(1.5mm,-.5mm) -- ++(.33mm,.33mm) to[bend right=10] ++(1.5mm,0) -- ++(.66mm,-.75mm) -- ++(.66mm,.75mm) to[bend right=10] ++(1.5mm,0) -- ++(.33mm,-.33mm) to[bend right] ++(1.5mm,.5mm) to[bend left] ++(-1.5mm,-2.15mm) to[bend left=10] ++(-.33mm,.33mm) to[bend left=10] ++(-1.5mm,0) -- ++(-.66mm,-.5mm) -- ++(-.66mm,.5mm) to[bend left=10] ++(-1.5mm,0) -- ++(-.33mm,-.33mm) to[bend left] cycle}
-
-\def\pingu@x@jackolantern@eye@left{(0.9mm,2mm) -- ++(2mm,-.15mm) to[bend right=40] ++(-.5mm,2mm) -- cycle}
-\def\pingu@x@jackolantern@eye@right{(-3mm,2mm) -- ++(-2mm,-.15mm) to[bend left=40] ++(.5mm,2mm) -- cycle}
-\def\pingu@x@jackolantern@nose{(0.965mm*0.5-3.225mm*0.5,1mm) -- ++(1mm,1.2mm) to[bend right=10] ++(-2mm,0) -- cycle}
-
-\def\pingu@draw@ea@jackolantern{%
-\scope[rotate around={\pingu@x@jackolantern@angle:(\pingu@name-head-top)},%
-shift={(\pingu@name-head-top)},
-shift={(\pingu@x@jackolantern@xshift,\pingu@x@jackolantern@yshift)},
-scale=\pingu@x@jackolantern@scale]
-\scope
-\pgfinterruptboundingbox
-\path[pingu@invclip]\pingu@x@jackolantern \pingu@x@jackolantern@eye@left \pingu@x@jackolantern@eye@right \pingu@x@jackolantern@nose;
- % give it a small cut
- \pingu@block{\pingu@color@jackolantern} (0,.125cm)++(-60:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) coordinate (@pkll) arc(-60:86: {\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) coordinate (@pkl) to[bend right=3] coordinate[pos=.5] (@pkuc) coordinate[pos=.225] (@pksl) coordinate[pos=.775] (@pksr) ++(-3.75mm,0) coordinate (@pkr) arc(95:242:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) coordinate (@pklr) to[bend left=5] coordinate[pos=.5] (@pklc) cycle;
- \pingu@draw[line join=round,line width=\pingu@x@jackolantern@outline@w]{\pingu@color@jackolantern@outline} \pingu@jackolantern@outerpath;
-\endpgfinterruptboundingbox
-\scope
-\clip (0,.125cm)++(-60:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) arc(-60:86:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) to[bend right=3] ++(-3.75mm,0) arc(95:242:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) to[bend left=5] cycle;
- \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@stripe@a} (@pklr) to[bend left=42] (@pkr);
- \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@stripe@c} (@pkll) to[bend right=54] (@pkl);
- \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@stripe@b} (@pklc) to[bend right=6] (@pkuc);
-\endscope
-\endscope
- \pingu@draw[fill=\pingu@color@jackolantern@background,rounded corners=.25pt]{\pingu@color@jackolantern@outline} \pingu@x@jackolantern@eye@left;
- \pingu@draw[fill=\pingu@color@jackolantern@background,rounded corners=.25pt]{\pingu@color@jackolantern@outline} \pingu@x@jackolantern@eye@right;
-
- \pingu@draw[fill=\pingu@color@jackolantern@background,rounded corners=.25pt]{\pingu@color@jackolantern@outline} \pingu@x@jackolantern@nose;
-
- \pingu@draw[fill=\pingu@color@jackolantern@background]{\pingu@color@jackolantern@outline} \pingu@x@jackolantern;
- \scope
- \clip\pingu@x@jackolantern \pingu@x@jackolantern@eye@left \pingu@x@jackolantern@eye@right \pingu@x@jackolantern@nose;
- \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@backstripe@a} ([xshift=1.6mm]@pklr) to[bend left=18] (@pkr);
- \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@backstripe@c} ([xshift=-1.6mm]@pkll) to[bend right=22] (@pkl);
- \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@backstripe@b} (@pklc) to[bend right=1] (@pkuc);
- \endscope
- \pingu@block{\pingu@color@jackolantern@stalk} ([yshift=-.5*\pingu@x@jackolantern@outline@w]@pksl) to[bend left=3] ([yshift=-.5*\pingu@x@jackolantern@outline@w]@pksr) to[bend right=8] ++(.85mm,2mm) -- ++(.65mm,0) coordinate[pos=.5] (@pkc) to[bend right=3] cycle;
-\pingu@block{\pingu@color@jackolantern@stalk@top} (@pkc) ellipse[x radius=.65mm/2, y radius=.085mm];
-\endscope
-}
-
-\pingu@create@wing@extra{hammer}{%
- hammer \@lr/.code = {\pingu@set@extra{hammer\@lr}{true}\pingu@color{hammer\@lr}{##1}},
- hammer \@lr/.default = pingu@silver,
- hammer \@lr\space handle length/.code = \expandafter\def\csname pingu@hammer@\@lr @length\endcsname{##1},
- hammer \@lr\space handle shift/.code = \expandafter\def\csname pingu@hammer@\@lr @shift\endcsname{##1},
- hammer \@lr\space width/.code = \expandafter\def\csname pingu@hammer@\@lr @width\endcsname{##1},
- hammer \@lr\space height/.code = \expandafter\def\csname pingu@hammer@\@lr @height\endcsname{##1},
- hammer \@lr\space xshift/.code = \expandafter\def\csname pingu@hammer@\@lr @xshift\endcsname{##1},
- hammer \@lr\space yshift/.code = \expandafter\def\csname pingu@hammer@\@lr @yshift\endcsname{##1},
- hammer \@lr\space handle/.code = \pingu@color{hammer@\@lr @handle}{##1},%
- hammer \@lr\space with knob/.style = {hammer \@lr=##1, hammer \@lr\space handle length=\dimexpr9mm+\csname pingu@hammer@\@lr @height\endcsname+.5mm,hammer \@lr\space yshift=\dimexpr-.5mm-\csname pingu@hammer@\@lr @height\endcsname},
- hammer \@lr\space with knob/.default = pingu@silver
-}{hammer \@lr\space handle length=9mm, hammer \@lr\space handle=pingu@bronze, hammer \@lr\space handle shift=-4mm, hammer \@lr\space width=7mm,hammer \@lr\space height=3.5mm, hammer \@lr\space xshift=-0.5*\csname pingu@hammer@\@lr @width\endcsname,hammer \@lr\space yshift=-1mm}
-\def\pingu@draw@wi@hammer#1{%
- \pingu@setup@wing{hammer}{#1}%
-\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
-% \csname pingu@color@hammer#1\endcsname
- \pingu@block{\csname pingu@color@hammer@#1@handle\endcsname}(\pingu@name-wing-#1)++(\@sidesign*-.2mm,\csname pingu@hammer@#1@shift\endcsname) -- ++(0,\csname pingu@hammer@#1@length\endcsname) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-hammer-#1-top) -- ++(0,-\csname pingu@hammer@#1@length\endcsname) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
- \pingu@block[rounded corners=2pt]{\csname pingu@color@hammer#1\endcsname} (\pingu@name-hammer-#1-top)++(\csname pingu@hammer@#1@xshift\endcsname,\csname pingu@hammer@#1@yshift\endcsname) rectangle ++(\csname pingu@hammer@#1@width\endcsname,\csname pingu@hammer@#1@height\endcsname);
-\endscope
-}
-
-\pingu@create@wing@extra{plank}{%
- plank \@lr/.code = {\pingu@set@extra{plank\@lr}{true}\pingu@color{plank\@lr}{##1}},
- plank \@lr/.default = pingu@bronze!80!pingu@black,
- plank \@lr\space width/.code = \expandafter\def\csname pingu@plank@\@lr @width\endcsname{##1},
- plank \@lr\space height/.code = \expandafter\def\csname pingu@plank@\@lr @height\endcsname{##1},
- plank \@lr\space xshift/.code = \expandafter\def\csname pingu@plank@\@lr @xshift\endcsname{##1},
- plank \@lr\space yshift/.code = \expandafter\def\csname pingu@plank@\@lr @yshift\endcsname{##1}
-}{plank \@lr\space width=7mm,plank \@lr\space height=16.5mm, plank \@lr\space xshift=0mm,plank \@lr\space yshift=-1mm}
-\def\pingu@draw@wi@plank#1{%
- \pingu@setup@wing{plank}{#1}%
-\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
-\pingu@block[rounded corners=2pt]{\@col}([xshift=\csname pingu@plank@#1@xshift\endcsname,yshift=\csname pingu@plank@#1@yshift\endcsname]\pingu@name-wing-#1)++({-.5*(\csname pingu@plank@#1@width\endcsname)},{-.5*(\csname pingu@plank@#1@height\endcsname)}) rectangle ++({\csname pingu@plank@#1@width\endcsname},{\csname pingu@plank@#1@height\endcsname});
-\endscope
-}
-
-% \usetikzlibrary{spy}
-
-\pingu@create@wing@extra{magnifier}{%
- magnifier \@lr/.code = {\pingu@set@extra{magnifier\@lr}{true}\pingu@color{magnifier\@lr}{##1}}, % \noexpand\tikzset{/pingu/@pingu/.append style={spy scope={circle,draw,magnification=4,size=1cm}}}
- magnifier \@lr/.default = pingu@bronze,
- magnifier \@lr\space handle length/.code = \expandafter\def\csname pingu@magnifier@\@lr @length\endcsname{##1},
- magnifier \@lr\space handle shift/.code = \expandafter\def\csname pingu@magnifier@\@lr @shift\endcsname{##1},
- magnifier \@lr\space size/.code = \expandafter\def\csname pingu@magnifier@\@lr @size\endcsname{##1},
- magnifier \@lr\space glass/.code = \pingu@color{magnifier@\@lr @glass}{##1},
- magnifier \@lr\space opacity/.code = \expandafter\def\csname pingu@magnifier@\@lr @opacity\endcsname{##1},
- magnifier \@lr\space thick/.code = \expandafter\def\csname pingu@magnifier@\@lr @thick\endcsname{##1},
- magnifier \@lr\space xshift/.code = \expandafter\def\csname pingu@magnifier@\@lr @xshift\endcsname{##1},
- magnifier \@lr\space yshift/.code = \expandafter\def\csname pingu@magnifier@\@lr @yshift\endcsname{##1},
- magnifier \@lr\space handle/.code = \pingu@color{magnifier@\@lr @handle}{##1}%
-}{magnifier \@lr\space handle length=3.5mm, magnifier \@lr\space handle shift=-4mm, magnifier \@lr\space xshift=0mm,magnifier \@lr\space yshift=1mm,magnifier \@lr\space size=2.5mm,magnifier \@lr\space thick=.5mm,magnifier \@lr\space glass=pingu@blue!90!pingu@yellow,magnifier \@lr\space opacity=0.24}
-\def\pingu@draw@wi@magnifier#1{%
- \pingu@setup@wing{magnifier}{#1}%
- \scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
-% \csname pingu@color@magnifier#1\endcsname
- \path ([yshift=\csname pingu@magnifier@#1@yshift\endcsname+\csname pingu@magnifier@#1@size\endcsname,xshift=\csname pingu@magnifier@\@lr @xshift\endcsname]\pingu@name-wing-#1) coordinate (@);
-
- % \spy[draw=green] on (@) in node at (@);
-% \pgfonlayer{foreground}
- \pingu@block[even odd rule]{\@col} (@) circle[radius=\csname pingu@magnifier@#1@size\endcsname] circle[radius=\csname pingu@magnifier@#1@size\endcsname-\csname pingu@magnifier@#1@thick\endcsname];
-
- \pingu@block[opacity=\csname pingu@magnifier@#1@opacity\endcsname]{\csname pingu@color@magnifier@#1@glass\endcsname} (@) circle[radius=\csname pingu@magnifier@#1@size\endcsname-\csname pingu@magnifier@#1@thick\endcsname];
-
- \pingu@block{\@col} % TODO: adapt size
- (@) ([shift={(-70:2.5mm)}]@) to[out=230,in=90] ++(-.5mm,-\csname pingu@magnifier@#1@length\endcsname) arc(360:180:.33mm) to[out=90,in=-50] ++(-.5mm,\csname pingu@magnifier@#1@length\endcsname);%
-% \endpgfonlayer
-\endscope
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-glasses.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-glasses.lib.tex
deleted file mode 100644
index 609adcb71d..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-glasses.lib.tex
+++ /dev/null
@@ -1,105 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@extra{glasses}{%
- glasses/.code = \pingu@set@extra{glasses}{true}\pingu@color{glasses}{#1},
- glasses/.default = pingu@black,
- glasses left fill/.code = \pingu@color{glasses@fill@l}{#1},
- glasses right fill/.code = \pingu@color{glasses@fill@r}{#1},
- glasses left opacity/.code = \def\pingu@x@glasses@op@l{#1},
- glasses right opacity/.code = \def\pingu@x@glasses@op@r{#1},
- glasses fill/.style = {/pingu/glasses left fill=#1, /pingu/glasses right fill=#1},
- glasses opacity/.style = {/pingu/glasses left opacity=#1, /pingu/glasses right opacity=#1},
- glasses line width/.code = \def\pingu@x@glasses@lw{#1},
- sunglasses/.forward to = /pingu/sun glasses,
- glasses bend left/.code = \def\pingu@x@glasses@bend@l{#1},
- glasses bend right/.code = \def\pingu@x@glasses@bend@r{#1},
- glasses bend/.style = {/pingu/glasses bend left=#1,/pingu/glasses bend right=#1},
- sun glasses/.style = {/pingu/glasses, /pingu/glasses fill=#1},
- sun glasses/.default = pingu@black,
-}{glasses line width=1.125\p@,glasses fill=\@pingu@none,glasses opacity=.825,glasses bend left=32.5,glasses bend right=32.5}
-
-\def\pingu@draw@ea@glasses{% fact: 1.33; modified first shift and ht
- \pingu@block[opacity=\pingu@x@glasses@op@l]{\pingu@color@glasses@fill@l} (\pingu@name-eye-left)++(-2.66mm,1.75mm) to[bend left=8] ++(5.586mm,0) to[out=-80,in=70] ++(-.266mm,-3.6mm) to[bend left=\pingu@x@glasses@bend@l] ++(-4.8545mm,\z@) to[out=135,in=-90] ++(-1.064mm,3.5mm) -- cycle;
- \pingu@block[opacity=\pingu@x@glasses@op@r]{\pingu@color@glasses@fill@r} (\pingu@name-eye-right)++(2.66mm,1.75mm) to[bend right=8] ++(-5.586mm,0) to[out=-100,in=110] ++(.266mm,-3.6mm) to[bend right=\pingu@x@glasses@bend@r] ++(4.8545mm,\z@) to[out=45,in=-90] ++(1.064mm,3.5mm) -- cycle;
- \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses} [rounded corners=.25mm](\pingu@name-eye-left)++(-2.66mm,1.75mm) coordinate (\pingu@name-glasses-left-mid) to[bend left=8] ++(5.586mm,0) coordinate (\pingu@name-glasses-left-outer) to[out=-80,in=70] ++(-.266mm,-3.6mm) to[bend left=\pingu@x@glasses@bend@l] ++(-4.8545mm,\z@) to[out=135,in=-90] coordinate[pos=.9] (\pingu@name-glasses-left-mid-b) ++(-1.064mm,3.5mm) -- cycle;
- \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses} [rounded corners=.25mm] (\pingu@name-eye-right)++(2.66mm,1.75mm) coordinate (\pingu@name-glasses-right-mid) to[bend right=8] ++(-5.586mm,0) coordinate (\pingu@name-glasses-right-outer) to[out=-100,in=110] ++(.266mm,-3.6mm) to[bend right=\pingu@x@glasses@bend@r] ++(4.8545mm,\z@) to[out=45,in=-90] coordinate[pos=.9] (\pingu@name-glasses-right-mid-b) ++(1.064mm,3.5mm) -- cycle;
- \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses} (\pingu@name-glasses-right-mid) to[bend right=10] (\pingu@name-glasses-left-mid);
- \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses} (\pingu@name-glasses-right-mid-b) to[bend left=20] (\pingu@name-glasses-left-mid-b);
- \scope
- \clip[use path=\pingu@upperpingu];
- \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses}
- (\pingu@name-glasses-right-mid) to[bend right=8] ++(-5.586mm,0) -- ++(-5mm,.5mm);
- \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses}
- (\pingu@name-glasses-left-mid) to[bend left=8] ++(5.586mm,0) -- ++(5mm,.5mm);
- \endscope
-}
-\pingu@create@extra{glassesround}{%
- glasses round/.code = \pingu@set@extra{glassesround}{true}\pingu@color{glassesround}{#1},
- glasses round/.default = pingu@black,
- glasses round left fill/.code = \pingu@color{glassesround@fill@l}{#1},
- glasses round right fill/.code = \pingu@color{glassesround@fill@r}{#1},
- glasses round fill/.style = {/pingu/glasses round left fill=#1, /pingu/glasses round right fill=#1},
- glasses round left opacity/.code = \def\pingu@x@glassesround@op@l{#1},
- glasses round right opacity/.code = \def\pingu@x@glassesround@op@r{#1},
- glasses round opacity/.style = {/pingu/glasses round left opacity=#1, /pingu/glasses round right opacity=#1},
- glasses round left radius/.code = \def\pingu@x@glassesround@r@l{#1},
- glasses round right radius/.code = \def\pingu@x@glassesround@r@r{#1},
- glasses round radius/.style = {/pingu/glasses round left radius=#1, /pingu/glasses round right radius=#1},
- glasses round line width/.code = \def\pingu@x@glassesround@lw{#1},
- sunglasses round/.forward to = /pingu/sun glasses round,
- sun glasses round/.style = {/pingu/glasses round, /pingu/glasses round fill=#1},
- sun glasses round/.default = pingu@black,
- % todo: width/radius allow for different
-}{glasses round line width=.75\p@,glasses round fill=\@pingu@none,glasses round opacity=.825,glasses round radius=3.15mm}
-\def\pingu@draw@ea@glassesround{% fact: 1.33; modified first shift and ht
- \pingu@block[opacity=\pingu@x@glassesround@op@l]{\pingu@color@glassesround@fill@l} (\pingu@name-eye-left) circle [radius=\pingu@x@glassesround@r@l];
- \pingu@block[opacity=\pingu@x@glassesround@op@r]{\pingu@color@glassesround@fill@r} (\pingu@name-eye-right) circle [radius=\pingu@x@glassesround@r@r];
- \pingu@draw[line width=\pingu@x@glassesround@lw]{\pingu@color@glassesround} [rounded corners=.25mm](\pingu@name-eye-left) ++(150:\pingu@x@glassesround@r@l) coordinate (\pingu@name-glassesround-left-mid) arc (150:510:\pingu@x@glassesround@r@l);
- \pingu@draw[line width=\pingu@x@glassesround@lw]{\pingu@color@glassesround} [rounded corners=.25mm] (\pingu@name-eye-right) ++(30:\pingu@x@glassesround@r@r) coordinate (\pingu@name-glassesround-right-mid) arc (30:390:\pingu@x@glassesround@r@r);
- \pingu@draw[line width=\pingu@x@glassesround@lw]{\pingu@color@glassesround} (\pingu@name-glassesround-left-mid) to[bend right=30] (\pingu@name-glassesround-right-mid);
- \scope
- \clip[use path=\pingu@upperpingu];
- \pingu@draw[line width=\pingu@x@glassesround@lw]{\pingu@color@glassesround}
- (\pingu@name-glassesround-right-mid) arc(30:150:\pingu@x@glassesround@r@l) -- ++(-5mm,.65mm);
- \pingu@draw[line width=\pingu@x@glassesround@lw]{\pingu@color@glassesround}
- (\pingu@name-glassesround-left-mid) arc(150:30:\pingu@x@glassesround@r@r) -- ++(5mm,.65mm);
- \endscope
-}
-\pingu@create@extra{monocleleft}{%
- monocle left/.code = \pingu@set@extra{monocleleft}{true}\pingu@color{monocleleft}{#1},
- monocle left/.default = pingu@black,
- monocle left glass/.code = \pingu@color{monocleleft@glass}{#1},
- monocle left fill/.forward to = /pingu/monocle left glass,
- monocle left opacity/.code = \def\pingu@x@monocleleft@opacity{#1},
- monocle left fill opacity/.forward to = /pingu/monocle left opacity,
- monocle left string/.code = \pingu@color{monocleleft@string}{#1},
- monocle left string length/.code= \def\pingu@x@monocleleft@string@l{#1},
- monocle left blob/.code = \pingu@color{monocleleft@blob}{#1},
-}{monocle left glass=pingu@blue,monocle left opacity=.155,monocle left string=\pingu@color@monocleleft,monocle left blob=\pingu@color@monocleleft,monocle left string length=5.55mm}
-
-\def\pingu@draw@eb@monocle@l{%
- \pingu@block[/pingu/glow,opacity=\pingu@x@monocleleft@opacity]{\pingu@color@monocleleft@glass} (\pingu@name-eye-left) circle[radius=2mm];
- \pingu@draw[thin]{\pingu@color@monocleleft@string} (\pingu@name-eye-left)++(2mm,0)
- to[out=-75,in=100] ++(0,-\pingu@x@monocleleft@string@l);
- \pingu@block{\pingu@color@monocleleft@blob} (\pingu@name-eye-left)++(2mm,-\pingu@x@monocleleft@string@l) circle [radius=.65\p@];
- \pingu@draw[semithick]{\pingu@color@monocleleft} (\pingu@name-eye-left) circle[radius=2mm];
-}
-\pingu@create@extra{monocleright}{%
- monocle right/.code = \pingu@set@extra{monocleright}{true}\pingu@color{monocleright}{#1},
- monocle right/.default = pingu@black,
- monocle right glass/.code = \pingu@color{monocleright@glass}{#1},
- monocle right fill/.forward to = /pingu/monocle right glass,
- monocle right opacity/.code = \def\pingu@x@monocleright@opacity{#1},
- monocle right fill opacity/.forward to = /pingu/monocle right opacity,
- monocle right string/.code = \pingu@color{monocleright@string}{#1},
- monocle right string length/.code= \def\pingu@x@monocleright@string@r{#1},
- monocle right blob/.code = \pingu@color{monocleright@blob}{#1},
-}{monocle right glass=pingu@blue,monocle right opacity=.155,monocle right string=\pingu@color@monocleright,monocle right blob=\pingu@color@monocleright,monocle right string length=5.55mm}
-\def\pingu@draw@eb@monocle@r{%
- \pingu@block[/pingu/glow,opacity=\pingu@x@monocleright@opacity]{\pingu@color@monocleright@glass} (\pingu@name-eye-right) circle[radius=2mm];
- \pingu@draw[thin]{\pingu@color@monocleright@string} (\pingu@name-eye-right)++(-2mm,0)
- to[out=-105,in=80] ++(0,-\pingu@x@monocleright@string@r);
- \pingu@block{\pingu@color@monocleright@blob} (\pingu@name-eye-right)++(-2mm,-\pingu@x@monocleright@string@r) circle [radius=.65\p@];
- \pingu@draw[semithick]{\pingu@color@monocleright} (\pingu@name-eye-right) circle[radius=2mm];
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-hats.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-hats.lib.tex
deleted file mode 100644
index f37d2c3363..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-hats.lib.tex
+++ /dev/null
@@ -1,173 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@extra{strawhat}{%
- % extra strawhat (tikzducks basis)
- straw hat/.forward to = /pingu/strawhat,
- strawhat/.default = brown!50!white,
- strawhat/.code = \pingu@set@extra{strawhat}{true}\pingu@color{strawhat}{#1},
- straw hat ribbon/.forward to = /pingu/strawhat ribbon,
- strawhat ribbon/.code = \pingu@color{strawhat@ribbon}{#1},
- straw hat position/.forward to= /pingu/strawhat position,
- strawhat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@strawhat@angle{#1}\def\pingu@x@strawhat@xshift{#2}\def\pingu@x@strawhat@yshift{#3}\def\pingu@x@strawhat@scale{#4}},
-}{strawhat ribbon= gray!85!black,strawhat position={-26.5:(-.185cm,.14cm){1.375}}}
-
-\def\pingu@draw@ea@strawhat{%
-\scope[rotate around={\pingu@x@strawhat@angle:(\pingu@name-head)},shift={(\pingu@name-head)},shift={(\pingu@x@strawhat@xshift,\pingu@x@strawhat@yshift)},scale=\pingu@x@strawhat@scale]
-\pingu@block{\pingu@color@strawhat} (.34cm,0) ellipse[x radius=.75cm, y radius=\pingu@one];
-\pingu@block{\pingu@color@strawhat} (0,.5mm) rectangle (.68cm,5mm);
-\pingu@block{\pingu@color@strawhat} (.34cm,5mm) ellipse[x radius=.34cm, y radius=.8mm];
-\pingu@block{\pingu@color@strawhat} (-.3955cm,.2mm) -- (1.0755cm,.2mm) -- (.68cm,2mm) -- (0,2mm) -- cycle;
-\pingu@block{\pingu@color@strawhat@ribbon} (.34cm,2mm) ellipse[x radius=.34cm, y radius=.8mm];
-\pingu@block{\pingu@color@strawhat@ribbon} (0,2mm) rectangle (.68cm,3mm);
-\pingu@block{\pingu@color@strawhat} (.34cm,3mm) ellipse[x radius=.34cm, y radius=.8mm];
-\endscope}
-
-\pingu@create@extra{hat}{%
- hat/.default = pingu@black!90!black,
- hat/.code = \pingu@set@extra{hat}{true}\pingu@color{hat}{#1},
- hat base/.code = \pingu@color{hat@base}{#1},
- hat coronal/.code = \pingu@color{hat@coronal}{#1},
- hat ribbon/.code = \pingu@color{hat@ribbon}{#1},
- hat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@hat@angle{#1}\def\pingu@x@hat@xshift{#2}\def\pingu@x@hat@yshift{#3}\def\pingu@x@hat@scale{#4}},
-}{hat position={-2:(.35mm,0)1},hat base=\pingu@color@hat,hat coronal=\pingu@color@hat!91!white,hat ribbon=\pingu@color@hat!87!white}
-
-\newdimen\pingu@hat@w@half \pingu@hat@w@half=.925cm
-\newdimen\pingu@hat@h \pingu@hat@h=.625cm
-\def\pingupathhatupper{[rounded corners=.25mm](-.65cm,-.25cm) to[out=90,in=200] ++(.35cm,\pingu@hat@h) to[bend left=11] ++(.25cm,0) to[bend right=2.5] ++(\pingu@one,0) to[bend left=11] ++(.25cm,0) to[out=-20,in=90] ++(.35cm,-\pingu@hat@h) to[bend left=12] (-.65cm,-.25cm) -- cycle}
-\def\pingu@draw@ea@hat{%
-\scope[rotate around={\pingu@x@hat@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@hat@xshift,\pingu@x@hat@yshift)},scale=\pingu@x@hat@scale]
-\pingu@block[/pingu/@draw=\pingu@color@hat@coronal,thick]{\pingu@color@hat@base} (0,-.25cm)++(180:\pingu@hat@w@half{} and .15cm) arc (180:360:\pingu@hat@w@half{} and .15cm) arc (0:180:\pingu@hat@w@half{} and .115cm) -- cycle;
-\pingu@block{\pingu@color@hat} \pingupathhatupper;
-\scope
-\clip\pingupathhatupper;
-\pingu@block{\pingu@color@hat@ribbon} (\z@,.2mm) ellipse [x radius=.95\pingu@hat@w@half, y radius=.13cm];
-\pingu@block{\pingu@color@hat} (\z@,.134cm) ellipse [x radius=.95\pingu@hat@w@half, y radius=.13cm];
-\endscope\endscope}
-
-\pingu@create@extra{cap}{%
- cap/.default = pingu@bronze,
- cap/.code = \pingu@set@extra{cap}{true}\pingu@color{cap}{#1},
- cap padding/.code = {\def\pingu@x@cap@padding{#1}},
- cap extra height/.code = {\def\pingu@x@cap@height{#1}},
-}{cap padding=.8mm, cap extra height=0pt}
-
-\def\pingu@draw@ea@cap{%
-\pingu@layer{foreground}[]
-\pingu@block[rounded corners=.7mm]{\pingu@color@cap} ([xshift=.25mm]\pingu@name-wing-left-start) to[bend left=4] ([xshift=-\pingu@x@cap@padding]\pingu@name-wings-side-left) to[bend right=3]
-([yshift=\pingu@x@cap@height]\pingu@name-head)
-to[bend right=3]
-([xshift=\pingu@x@cap@padding]\pingu@name-wings-side-right) [rounded corners=.15mm] to[bend left=4] ([xshift=-.25mm]\pingu@name-wing-right-start)
-to[bend left=8]
-([xshift=-\pingu@x@cap@padding]\pingu@name-wings-side-right)
-[rounded corners=.15mm]
-to[bend left=32] ++(\pingu@w@half+\pingu@x@cap@padding,\pingu@w@half+\pingu@one)
-to[bend left=32] ++(\pingu@w@half+\pingu@x@cap@padding,-\pingu@w@half-\pingu@one)
-to[bend left=8] cycle;
-\endpingu@layer
-}
-
-\pingu@create@extra{constructionhelmet}{%
- construction helmet/.default = pingu@yellow,
- construction helmet/.code = \pingu@set@extra{constructionhelmet}{true}\pingu@color{constructionhelmet}{#1},
- construction helmet padding/.code = {\def\pingu@x@constructionhelmet@padding{#1}},
- construction helmet extra height/.code = {\def\pingu@x@constructionhelmet@height{#1}},
- construction helmet position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@constructionhelmet@angle{#1}\def\pingu@x@constructionhelmet@xshift{#2}\def\pingu@x@constructionhelmet@yshift{#3}\def\pingu@x@constructionhelmet@scale{#4}},
-}{construction helmet padding=.325cm, construction helmet extra height=0pt,construction helmet position={-.5:(.05mm,-1.25mm)1}}
-
-\newdimen\pingu@constructionhelmet@w@half \pingu@constructionhelmet@w@half=.85cm
-\def\pingu@draw@ea@constructionhelmet{%
-\scope[rotate around={\pingu@x@constructionhelmet@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@constructionhelmet@xshift,\pingu@x@constructionhelmet@yshift)},scale=\pingu@x@constructionhelmet@scale]
-\pingu@block{\pingu@color@constructionhelmet} (0,-.25cm)++(180:\pingu@constructionhelmet@w@half{} and \pingu@x@constructionhelmet@padding) arc (180:360:\pingu@constructionhelmet@w@half{} and \pingu@x@constructionhelmet@padding) arc (0:180:\pingu@constructionhelmet@w@half{} and .2cm) -- cycle;
-\scope
-\pingu@block{\pingu@color@constructionhelmet!93!pingu@black} (0,-.25cm)++(0:{.95\pingu@constructionhelmet@w@half} and .675cm) arc (0:180:{.95\pingu@constructionhelmet@w@half} and .675cm) coordinate[pos=.212] (@a) coordinate[pos=.256] (@aa) coordinate[pos=.788] (@b) coordinate[pos=.744] (@bb) arc (180:360:{.95\pingu@constructionhelmet@w@half} and .125cm) -- cycle;
-\clip (0,-.25cm)++(0:{.95\pingu@constructionhelmet@w@half} and .675cm) arc (0:180:{.95\pingu@constructionhelmet@w@half} and .675cm) arc (180:360:{.95\pingu@constructionhelmet@w@half} and .125cm) -- cycle;
-\pingu@block{\pingu@color@constructionhelmet!99!pingu@black} (-.75mm,-.25cm-.125cm) to[bend left=1] ++ (0,.675cm+.125cm) -- ++(1.5mm,0) to[bend right=1] ++(0,-.675cm-.125cm) -- cycle;
-\pingu@block{\pingu@color@constructionhelmet!99!pingu@black} (-.95mm,-.25cm-.125cm) to[bend left=3] ++ (-8mm,.675cm+.125cm) -- ++(1.5mm,0) to[bend right=3] ++(8mm,-.675cm-.125cm) -- cycle;
-\pingu@block{\pingu@color@constructionhelmet!99!pingu@black} (-.55mm,-.25cm-.125cm) to[bend right=3] ++ (8mm,.675cm+.125cm) -- ++(1.5mm,0) to[bend left=3] ++(-8mm,-.675cm-.125cm) -- cycle;
-\endscope
-% get the 3d wobbles
-\pingu@block[rounded corners=.03mm]{\pingu@color@constructionhelmet!99!pingu@black} (-.75mm,-.25cm+.675cm-.25mm) -- ++(0,.3mm) -| ++(1.5mm,-.3mm) -- cycle;
-\pingu@block{\pingu@color@constructionhelmet!99!pingu@black} (@a) to[bend right=14] (@aa);
-\pingu@block{\pingu@color@constructionhelmet!99!pingu@black} (@bb) to[bend right=14] (@b);
-\endscope
-}
-
-\pingu@create@extra{conicalhat}{%
- conical hat/.default = pingu@bronze,
- conical hat/.code = \pingu@set@extra{conicalhat}{true}\pingu@color{conicalhat}{#1},
- conical hat rounding/.code = {\def\pingu@x@conicalhat@rounding{#1}},
- conical hat shade/.code = {\def\pingu@x@conicalhat@shade{#1}},
- conical hat height/.code = {\def\pingu@x@conicalhat@height{#1}},
- conical hat width/.code = {\def\pingu@x@conicalhat@width{#1}},
- conical hat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@conicalhat@angle{#1}\def\pingu@x@conicalhat@xshift{#2}\def\pingu@x@conicalhat@yshift{#3}\def\pingu@x@conicalhat@scale{#4}},
-}{conical hat position={-15:(2mm,-3mm)1}, conical hat height=8mm, conical hat width=2.25cm,conical hat shade=\pingu@color@conicalhat!80!pingu@black, conical hat rounding=.4pt}
-
-\def\pingu@draw@ea@conicalhat{%
-\scope[rotate around={\pingu@x@conicalhat@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@conicalhat@xshift,\pingu@x@conicalhat@yshift)},scale=\pingu@x@conicalhat@scale]
-
-\pingu@layer{background}[]
-\pingu@block[rounded corners=\pingu@x@conicalhat@rounding]{\pingu@x@conicalhat@shade} (0,-.22cm)++(180:{\pingu@x@conicalhat@width/2+.05mm} and 1mm) coordinate (@) arc (180:360:{\pingu@x@conicalhat@width/2+.05mm} and 1mm) -- ++(.15mm,.3mm) to[bend right=5] ++(-\pingu@x@conicalhat@width/2, \pingu@x@conicalhat@height-.025cm) to[bend right=5] ([xshift=-.15mm,yshift=.3mm]@) -- cycle;
-\endpingu@layer
-
-\pingu@block[rounded corners=\pingu@x@conicalhat@rounding]{\pingu@color@conicalhat} (0,-.25cm)++(180:\pingu@x@conicalhat@width/2 and 1mm) coordinate (@) arc (180:0:\pingu@x@conicalhat@width/2 and 1mm) -- ++(.225mm,.6mm) to[bend right=5] ++(-\pingu@x@conicalhat@width/2, \pingu@x@conicalhat@height) to[bend right=5] ([xshift=-.225mm,yshift=.6mm]@) -- cycle;
-\endscope
-}
-
-\pingu@create@extra{witchhat}{%
- witch hat/.code = \pingu@set@extra{witchhat}{true}\pingu@color{witchhat}{#1},
- witch hat/.default = pingu@purple!40!black,
- witch hat base/.code = \pingu@color{witchhat@base}{#1},
- witch hat coronal/.code = \pingu@color{witchhat@coronal}{#1},
- witch hat ribbon/.code = \pingu@color{witchhat@ribbon}{#1},
- witch hat band/.code = \pingu@color{witchhat@band}{#1},
- witch hat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@witchhat@angle{#1}\def\pingu@x@witchhat@xshift{#2}\def\pingu@x@witchhat@yshift{#3}\def\pingu@x@witchhat@scale{#4}},
-}{witch hat position={-7:(.625mm,.45mm){1.15}},witch hat base=\pingu@color@witchhat,witch hat coronal=\pingu@color@witchhat!91!white,witch hat ribbon=\pingu@color@witchhat!87!white,witch hat band=!hide}
-
-\newdimen\pingu@witchhat@w@half \pingu@witchhat@w@half=1.125cm
-\newdimen\pingu@witchhat@h \pingu@witchhat@h=1.3cm
-\def\pingupathwitchhatupper{[rounded corners=.65mm](-.625cm,-.25cm) -- ++(.8cm,\pingu@witchhat@h-4.5mm) -- ++(6.5mm,4.5mm) -- ++(-1.5mm,-4.5mm) -- ++(-1.25mm,-\pingu@witchhat@h+4.5mm)}
-\def\pingu@draw@ea@witchhat{%
-\scope[rotate around={\pingu@x@witchhat@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@witchhat@xshift,\pingu@x@witchhat@yshift)},scale=\pingu@x@witchhat@scale]
-\pingu@draw[semithick]{\pingu@color@witchhat@band} (-.615cm,-.25cm) to[out=-100,in=180] ++(.5cm,-1.1cm) to[bend right=5] ++(3.5mm,.1mm) to[out=0,in=-78] ++(.433cm,1.1cm);
-\pingu@block[/pingu/@draw=\pingu@color@witchhat@coronal,thick]{\pingu@color@witchhat@base} (0,-.25cm)++(180:\pingu@witchhat@w@half{} and .15cm) arc (180:360:\pingu@witchhat@w@half{} and .15cm) arc (0:180:\pingu@witchhat@w@half{} and .115cm) -- cycle;
-\pingu@block{\pingu@color@witchhat} \pingupathwitchhatupper;
-\clip\pingupathwitchhatupper;
-\pingu@block{\pingu@color@witchhat@ribbon} (\z@,.2mm) ellipse [x radius=.95\pingu@witchhat@w@half, y radius=.12cm];
-\pingu@block{\pingu@color@witchhat} (\z@,.134cm) ellipse [x radius=.95\pingu@witchhat@w@half, y radius=.12cm];
-\endscope
-}
-
-
-\pingu@create@extra{mitra}{%
- mitra/.default = pingu@red!67!pingu@black,%pingu@black!90!black,
- mitra/.code = \pingu@set@extra{mitra}{true}\pingu@color{mitra}{#1},
- mitra height/.code = {\def\pingu@x@mitra@height{#1}},
- mitra background/.code = \pingu@color{mitra@background}{#1},
- mitra overset/.code = {\def\pingu@x@mitra@overset{#1}},
- mitra lower angle/.code = {\def\pingu@x@mitra@lowerangle{#1}},
- mitra upper angle/.code = {\def\pingu@x@mitra@upperangle{#1}},
- mitra lower band/.code = \pingu@color{mitra@lower@band}{#1},
- mitra lower band height/.code = {\def\pingu@x@mitra@lowerband@height{#1}},
- mitra upper band/.code = \pingu@color{mitra@upper@band}{#1},
- mitra upper band height/.code = {\def\pingu@x@mitra@upperband@height{#1}},
- mitra center band/.code = \pingu@color{mitra@center@band}{#1},
- mitra center band width/.code = {\def\pingu@x@mitra@centerband@width{#1}},
- mitra position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@mitra@angle{#1}\def\pingu@x@mitra@xshift{#2}\def\pingu@x@mitra@yshift{#3}\def\pingu@x@mitra@scale{#4}},
-}{mitra position={0:(0,0)1},mitra height=1.125cm,mitra overset=1.25mm,mitra lower angle=125,mitra upper angle=-35,mitra lower band=pingu@yellow!75!pingu@black,mitra center band=\pingu@color@mitra@lower@band,mitra lower band height=.2,mitra center band width={2*\pingu@x@mitra@lowerband@height},mitra upper band=\pingu@color@mitra@lower@band,mitra upper band height={1.5*\pingu@x@mitra@lowerband@height},mitra background=\pingu@color@mitra!80!pingu@black}
-
-\newdimen\pingu@mitra@w@half \pingu@mitra@w@half=.625cm
-\def\pingu@x@mitra@path{(0,-.2185cm)++(180:\pingu@mitra@w@half{} and .035cm) arc (180:360:\pingu@mitra@w@half{} and .035cm) [rounded corners=1pt] -- ++(\pingu@x@mitra@overset,.3*\pingu@x@mitra@height) to[out=\pingu@x@mitra@lowerangle,in=\pingu@x@mitra@upperangle] ++(-\pingu@x@mitra@overset-\pingu@mitra@w@half,.7*\pingu@x@mitra@height)
-to[out=180-\pingu@x@mitra@upperangle,in=180-\pingu@x@mitra@lowerangle] ++(-\pingu@x@mitra@overset-\pingu@mitra@w@half,-.7*\pingu@x@mitra@height) [sharp corners] -- cycle}
-\def\pingu@draw@ea@mitra{%
-\scope[rotate around={\pingu@x@mitra@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@mitra@xshift,\pingu@x@mitra@yshift)},scale=\pingu@x@mitra@scale]
-\pingu@block{\pingu@color@mitra@background} (0,-.2185cm)++(180:\pingu@mitra@w@half{} and .035cm) arc (180:360:\pingu@mitra@w@half{} and .035cm) [rounded corners=1pt] -- ++(\pingu@x@mitra@overset,.3*\pingu@x@mitra@height) to[out=\pingu@x@mitra@lowerangle,in=\pingu@x@mitra@upperangle] ++(-\pingu@x@mitra@overset-\pingu@mitra@w@half-.66mm,.7*\pingu@x@mitra@height-.1mm)
-to[out=180-\pingu@x@mitra@upperangle+2,in=180-\pingu@x@mitra@lowerangle-2] ++(-\pingu@x@mitra@overset-\pingu@mitra@w@half+.66mm,-.7*\pingu@x@mitra@height+.1mm) [sharp corners] -- cycle;
-\pingu@block{\pingu@color@mitra} \pingu@x@mitra@path;
-% \pingu@block{\pingu@color@mitra} \pingupathmitraupper;
-\scope\clip\pingu@x@mitra@path;
-% TODO: switch to factors non relative to \pingu@x@mitra@overset
-\pingu@block{\pingu@color@mitra@lower@band} (0,-.2185cm)++(180:\pingu@mitra@w@half{} and .035cm) arc (180:360:\pingu@mitra@w@half{} and .035cm) -- ++(\pingu@x@mitra@lowerband@height*\pingu@x@mitra@overset,\pingu@x@mitra@lowerband@height*.3*\pingu@x@mitra@height) arc (0:-180:{\pingu@x@mitra@lowerband@height*\pingu@x@mitra@overset+\pingu@mitra@w@half} and .035cm) -- cycle;
-\pingu@block{\pingu@color@mitra@center@band} (\pingu@x@mitra@centerband@width*\pingu@x@mitra@overset+.1mm,-.2185cm) to[bend right=4] ++(0,\pingu@x@mitra@height) to[bend right] ++(-2*\pingu@x@mitra@centerband@width*\pingu@x@mitra@overset-.1mm,0) to[bend left=4] ++(0,-\pingu@x@mitra@height) -- cycle;
-\pingu@block{\pingu@color@mitra@upper@band} (0,.3*\pingu@x@mitra@height-.2185cm-0.5*\pingu@x@mitra@upperband@height*.3*\pingu@x@mitra@height)++(180:{\pingu@x@mitra@overset+\pingu@mitra@w@half} and .035cm) arc (180:360:{\pingu@x@mitra@overset+\pingu@mitra@w@half} and .035cm) -- ++(0,\pingu@x@mitra@upperband@height*.3*\pingu@x@mitra@height) arc (0:-180:{\pingu@x@mitra@overset+\pingu@mitra@w@half} and .035cm) -- cycle;
-\endscope\endscope} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-horse.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-horse.lib.tex
deleted file mode 100644
index 1fefbf8c48..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-horse.lib.tex
+++ /dev/null
@@ -1,229 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-% TODO: get all of this customizable
-\colorlet{base@a}{lightgray!95!black}
-\colorlet{base@b}{lightgray!79!black}
-
-\colorlet{a}{lightgray!63!black}
-\colorlet{b}{lightgray!81!black}
-\def\basew{12}
-\def\pingu@@horse@scale{.1}
-
-\def\pingu@@horse@@main{(1.275,.55) -- ++(\if@pingu@@horse@@donkey@.05\else.1\fi,.2) -- ++(\if@pingu@@horse@@donkey@-.2\else-.25\fi,.25) to[bend right=4] ++(-.425,1.75) to[bend left=15] ++(.05,.2) to[bend right=30] ++(-.1,1.9) to[bend left=30] ++(0,1.65) coordinate(@back) to[bend left=30] ++(2,.625) to[bend right=18,looseness=.8] ++(3.25,-.1) [rounded corners=2*\pingu@@horse@scale] coordinate(@hair) to[out=34,in=185] ++(3,1.3) to[bend left=19] coordinate[pos=.5](@ear) ++(.85,-.4) to[bend left=5] ++(.24,-.45) to[bend right=20] ++(\if@pingu@@horse@@donkey@.25\else0\fi,\if@pingu@@horse@@donkey@-1.2\else-.7\fi) to[bend left=2] ++(.1,-.55) to[out=-85,in=-60,looseness=.75] ++(\if@pingu@@horse@@donkey@-.55\else-.475\fi,\if@pingu@@horse@@donkey@-.45\else-.35\fi) coordinate(@mouth) to[out=-135,in=-120] ++(\if@pingu@@horse@@donkey@-.4\else-.37\fi,\if@pingu@@horse@@donkey@.2\else.25\fi) -- ++(0,.1)
-to[out=125,in=-68] ++(-.58,.615) coordinate (@mouth-low)
-to[out=215,in=80] ++(-1.25,-2) to[bend left=24] ++(-.65,-1) to[out=258,in=86] ++(-.42,-1.25) to[bend left=3] ++(-.2,-.6) to[bend right=10] ++(-.14,-1.15) to[bend left=2] coordinate[pos=.62] (@hooffront) ++(.355,-.565) to[bend left=15] ++(-.4,-.075) to[bend left=10] ++(-.28,.1) to[bend left=9] ++(.06,.3) to[bend right=9] ++(-.2,.4) to[out=80,in=-80] ++(.138,1.4) to[out=70,in=-103] ++(.2,1.3) to[bend right=10] ++(-.225,.44) coordinate (@frontleg) to[out=196,in=\if@pingu@@horse@@donkey@-65\else-25\fi] ++(-3.3,\if@pingu@@horse@@donkey@.4\else.575\fi) coordinate (@backleg) to[bend right=\if@pingu@@horse@@donkey@16\else10\fi] ++(-.8,\if@pingu@@horse@@donkey@-1.375\else-1.5\fi) to[bend right=\if@pingu@@horse@@donkey@9\else20\fi] ++(.1,-2.35) -- ++(\if@pingu@@horse@@donkey@.1\else.2\fi,-.25)
-coordinate (@hoofback) to[bend right=\if@pingu@@horse@@donkey@9\else8\fi] ++(.15,-.26) to[bend left=10] ++(\if@pingu@@horse@@donkey@-.66\else-.55\fi,\if@pingu@@horse@@donkey@-.15\else-.05\fi) -- cycle}
-
-% #1 is the wing for the color and key assignments
-\def\pingu@@drawer@horse#1{
-% this ensures all coordinates are set in place
-% i know this i inefficient, but atm this is of no greater
-% concern -- i can not use layers as they would clash with that
-% of the penguin and who wants that... no one does!
-% penguins deserve freedom!
-\path \pingu@@horse@@main;
-
-% no we draw "behind" the horse:
-
-% Sockel
-\csname if@pingu@x@horse@#1@base@\endcsname
-\pingu@block[draw=\csname pingu@color@horse#1@base@shade@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@base@shade\endcsname} (4.35-\basew/2,.433) -- ++(0,-.5) arc(180:360:\basew/2 and 1) -- ++(0,.5) arc(360:180:\basew/2 and 1);
-\pingu@block[draw=\csname pingu@color@horse#1@base@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@base\endcsname} (4.35,.433) ellipse[x radius=\basew/2,y radius=1];
-\fi
-% background front leg
-\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1\endcsname} [rounded corners=1*\pingu@@horse@scale](@frontleg) to[out=266,in=85] ++(.09,-.5) to[bend left=10] ++(-.15,-.8)
-to[bend right=7] ++(-.05,-.2) to[bend left=13] ++(-.2,-1.15) to[bend right=13] ++(.15,-.2) to[bend left=10] ++(-.07,-.3) to[bend right=100] ++(.45,-.1) to[bend right=10] coordinate[pos=0.08](@hooffront@) ([yshift=5mm,xshift=3mm]@frontleg) -- cycle;
-\pingu@block[draw=\csname pingu@color@horse#1@fr@hoof\endcsname!80!pingu@black,line width=2pt*\pingu@@horse@scale,rounded corners=.12]{\csname pingu@color@horse#1@fr@hoof\endcsname} (@hooffront@) to[bend left=2] ++(0,-.565*.665) to[bend left=59] ++(-.225,-.08) -- ++(-.02,.03) to[bend left=20] ++(-.315,.11) to[bend right=6] ++(.092,.2) to[bend right=25] cycle;
-% background back le0
-\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1\endcsname} [rounded corners=1*\pingu@@horse@scale](@backleg) to[out=-115,in=\if@pingu@@horse@@donkey@120\else130\fi] ++(-.3,-3.5) -- ++(.2,-.3) coordinate(@hoofback@) to[bend left] ++(-.5,-.1)
--- ++(\if@pingu@@horse@@donkey@-.2\else-.05\fi,.15) -- ++(0,.15) to[bend left=\if@pingu@@horse@@donkey@45\else60\fi] cycle;
-\pingu@block[draw=\csname pingu@color@horse#1@br@hoof\endcsname!80!pingu@black,line width=2pt*\pingu@@horse@scale]{\csname pingu@color@horse#1@br@hoof\endcsname} (@hoofback@) to[bend right=\if@pingu@@horse@@donkey@9\else9\fi] ++(.206,-.265) to[bend left=10] ++(\if@pingu@@horse@@donkey@-.66\else-.55\fi,\if@pingu@@horse@@donkey@-.15\else-.05\fi) -- ++(-1.73mm,2.42mm) to[bend right=6] cycle;
-
-\if@pingu@@horse@@donkey@
-\pingu@block[draw=\csname pingu@color@horse#1@tail@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@tail\endcsname} [rounded corners=1*\pingu@@horse@scale](@back) to[out=215,in=95] ++(-.1,-2) to[out=270,in=92] ++(0,-.75) [sharp corners] to[bend right=20] coordinate[pos=.5] (@) ++(.15,0) to[bend right=10] cycle;
-% TODO: hide support
-%\node[draw=\csname pingu@color@horse#1@tail@draw\endcsname,fill=\csname pingu@color@horse#1@tail\endcsname,cloud,cloud puffs=30,cloud ignores aspect,scale=1.33*\pingu@@horse@scale,yshift=16mm,rotate=-5,line width=\@pingu@@horse@lw*\pingu@@horse@scale] at (@) {\rotatebox{90}{\phantom{A}\hskip7.5em}};
-\scope[rotate around={180:(@)}] % adapted from the broom
-\pingu@block[rounded corners=.44pt,draw=\csname pingu@color@horse#1@tail@draw\endcsname]{\csname pingu@color@horse#1@tail\endcsname} (@)++(-1mm,-2mm) to[out=115,in=240] ++(3mm,12.5mm) to[out=300,in=65] ([xshift=.95mm,yshift=-2mm]@) to[bend right=4] ([xshift=-.75mm,yshift=-2mm]@) -- cycle;
-\pingu@block[rounded corners=.44pt,draw=\csname pingu@color@horse#1@tail@draw\endcsname]{\csname pingu@color@horse#1@tail\endcsname} (@)++(-1mm,-2mm) to[out=115,in=240] coordinate[pos=.17] (@r) coordinate[pos=.19] (@r2) ++(-.75mm,10.5mm) to[out=300,in=65] ([xshift=.95mm,yshift=-2mm]@) to[bend right=4] ([xshift=-.75mm,yshift=-2mm]@) -- cycle;
-\pingu@block[rounded corners=.44pt,draw=\csname pingu@color@horse#1@tail@draw\endcsname]{\csname pingu@color@horse#1@tail\endcsname}(@)++(-.5mm,-1.5mm) to[out=115,in=240] ++(.5mm,12mm) to[out=300,in=65] ([xshift=.5mm,yshift=-1.5mm]@) -- cycle;
-\endscope
-\else
-\pingu@block[draw=\csname pingu@color@horse#1@tail@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@tail\endcsname} [rounded corners=1*\pingu@@horse@scale](@back) to[out=215,in=90] ++(-.4,-2.5) to[out=270,in=92] ++(0,-2.8) [sharp corners] to[bend right=20] ++(.6,0) to[bend right=10] cycle;
-\fi
-
-% back ear
-\if@pingu@@horse@@donkey@
-\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} ([xshift=.2mm,yshift=-1.5mm]@ear) to[bend left=20] ++(.373,1.465) coordinate(@) to[bend left=10] ++(-.15,-1.5);
-\else
-\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} ([xshift=.2mm,yshift=-1.5mm]@ear) to[bend left=20] ++(.373,.565) coordinate(@) to[bend left=10] ++(-.15,-.75);
-\fi
-% and here comes the wheeee (imagine-horse-sound)
-\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1\endcsname} [rounded corners=1*\pingu@@horse@scale] \pingu@@horse@@main;
-
-\pingu@draw[line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@draw\endcsname} ([yshift=-.1mm]@mouth-low) to[bend left=12] ++(.06,.65);
-\pingu@draw[line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@mouth\endcsname} ([yshift=-.115mm]@mouth) -- ++(-.035,.225);
-
-\edef\pingu@tmp{\if@pingu@@horse@@donkey@4.5mm\else3.85mm\fi}%
-\edef\pingu@tmpb{\if@pingu@@horse@@donkey@3.65mm\else2.45mm\fi}%
-\pingu@draw[line width=\@pingu@@horse@lw*\pingu@@horse@scale,line join=round]{\csname pingu@color@horse#1@nose\endcsname} ([xshift=\pingu@tmp,yshift=\pingu@tmpb]@mouth) to[out=140,in=10] ++(-.17,-.074) to[bend right=49] cycle;
-
-\pingu@draw[line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@draw\endcsname} ([yshift=-.35mm]@frontleg) to[bend left=12] ++(.01,.325);
-\pingu@draw[line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@draw\endcsname} ([yshift=-.2mm]@backleg) to[bend right=13] ++(.25,.425);
-
-\if@pingu@@horse@@donkey@
-\pingu@block[draw=\csname pingu@color@horse#1@mane@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@mane\endcsname} [rounded corners=1*\pingu@@horse@scale](@hair) to[out=34,in=185] ++(3,1.3) to[bend left=10] ++(.415,-.1) -- ++(-.1,-.25) to[out=186,in=35] ([yshift=-4mm,xshift=1.5mm]@hair) -- cycle;
-
-\pingu@block[draw=\csname pingu@color@horse#1@thatch@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@thatch\endcsname} [rounded corners=1*\pingu@@horse@scale]([xshift=2.1mm,yshift=-1.05mm]@ear) -- ++(-.1,-.2) to[bend left=4] ++(.45,-.275) to[bend right=9] cycle;
-\else
-\pingu@block[draw=\csname pingu@color@horse#1@mane@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@mane\endcsname} [rounded corners=1*\pingu@@horse@scale](@hair) to[out=34,in=185] ++(3,1.3) to[bend left=10] ++(.415,-.1) -- ++(-.1,-.4) to[out=194,in=30] ([yshift=-11.5mm,xshift=1.5mm]@hair) -- cycle;
-
-\pingu@block[draw=\csname pingu@color@horse#1@thatch@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@thatch\endcsname} [rounded corners=1*\pingu@@horse@scale]([xshift=2mm,yshift=-1mm]@ear) -- ++(-.1,-.3275) to[bend left=4] ++(.455,-.175) to[bend right=9] cycle;
-\fi
-
-% ear
-\if@pingu@@horse@@donkey@
-\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} ([xshift=-1mm,yshift=-1mm]@ear) to[bend left=15] ++(.393,1.685) coordinate(@) to[bend right=17] ++(-.15,-1.8);
-\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} (@) to[bend right=17] ++(-.15,-1.8) to[bend right=14] cycle;
-\else
-\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} ([xshift=-.75mm,yshift=-1mm]@ear) to[bend left=20] ++(.393,.585) coordinate(@) to[bend right=10] ++(-.15,-.7);
-\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} (@) to[bend right=7] ++(-.15,-.7) to[bend right=14] cycle;
-\fi
-
-% the eye; this is no error it has draw as fill
-\pingu@block{\csname pingu@color@horse#1@eyes\endcsname} [rounded corners=.25*\pingu@@horse@scale] ([xshift=3mm,yshift=-7.5mm]@ear) to[bend right=20] ++(.125,-.2) to[bend right=50] ++(.1,.125) to[bend left=15] cycle;
-
-\pingu@block[draw=\csname pingu@color@horse#1@fl@hoof\endcsname!80!pingu@black,line width=2pt*\pingu@@horse@scale]{\csname pingu@color@horse#1@fl@hoof\endcsname} (@hooffront) to[bend left=2] ++(.355*.49,-.545*.49) to[bend left=11] ++(-.45-.295,-.05+0.033)to[bend right=2] ++(.046,.29) to[bend right=10] cycle;
-\pingu@block[draw=\csname pingu@color@horse#1@bl@hoof\endcsname!80!pingu@black,line width=2pt*\pingu@@horse@scale]{\csname pingu@color@horse#1@bl@hoof\endcsname} (@hoofback) to[bend right=\if@pingu@@horse@@donkey@9\else8\fi] ++(.15,-.26) to[bend left=10] ++(\if@pingu@@horse@@donkey@-.66\else-.55\fi,\if@pingu@@horse@@donkey@-.15\else-.05\fi) -- ++(-1.73mm,2.42mm) to[bend right=6] cycle; %to[bend left=2] ++(.355*.65,-.565*.65) to[bend left=15] ++(-.395,-.075) to[bend left=10] ++(-.293,.105) to[bend left=9] ++(.06,.3) to[bend left=5] cycle;
-}
-
-% universal switch for all three positions
-\newif\if@pingu@@horse@@donkey@
-
-\newif\if@pingu@x@horse@left@flip@
-\newif\if@pingu@x@horse@right@flip@
-\newif\if@pingu@x@horse@left@base@
-\newif\if@pingu@x@horse@right@base@
-\newif\if@pingu@x@horse@left@donkey@
-\newif\if@pingu@x@horse@right@donkey@
-\pingu@create@wing@extra{horse}{%
- horse \@lr/.code = {\pingu@set@extra{horse\@lr}{true}\pingu@color{horse\@lr}{##1}},
- horse \@lr/.default = pingu@bronze!80!pingu@black,
- horse \@lr\space flip/.is if = @pingu@x@horse@\@lr @flip@,
- horse \@lr\space donkey/.is if = @pingu@x@horse@\@lr @donkey@,
- horse \@lr\space has base/.is if = @pingu@x@horse@\@lr @base@,
- horse \@lr\space draw/.code = \pingu@color{horse\@lr @draw}{##1},%
- horse \@lr\space line width/.code = \@namedef{pingu@horse\@lr @x@line@width}{##1},%
- horse \@lr\space mane/.code = \pingu@color{horse\@lr @mane}{##1},%
- horse \@lr\space mane draw/.code = \pingu@color{horse\@lr @mane@draw}{##1},%
- horse \@lr\space thatch/.code = \pingu@color{horse\@lr @thatch}{##1},%
- horse \@lr\space thatch draw/.code = \pingu@color{horse\@lr @thatch@draw}{##1},%
- horse \@lr\space tail/.code = \pingu@color{horse\@lr @tail}{##1},%
- horse \@lr\space tail draw/.code = \pingu@color{horse\@lr @tail@draw}{##1},%
- horse \@lr\space eyes/.code = \pingu@color{horse\@lr @eyes}{##1},%
- horse \@lr\space eye/.forward to = /pingu/horse \@lr\space eyes,%
- horse \@lr\space mouth/.code = \pingu@color{horse\@lr @mouth}{##1},%
- horse \@lr\space nose/.code = \pingu@color{horse\@lr @nose}{##1},%
- horse \@lr\space ears/.code = \pingu@color{horse\@lr @ears}{##1},%
- horse \@lr\space base/.code = \pingu@color{horse\@lr @base}{##1},%
- horse \@lr\space base draw/.code = \pingu@color{horse\@lr @base@draw}{##1},%
- horse \@lr\space base shade/.code = \pingu@color{horse\@lr @base@shade}{##1},%
- horse \@lr\space base shade draw/.code = \pingu@color{horse\@lr @base@shade@draw}{##1},%
- horse \@lr\space front left hoof/.code = \pingu@color{horse\@lr @fl@hoof}{##1},%
- horse \@lr\space front right hoof/.code= \pingu@color{horse\@lr @fr@hoof}{##1},%
- horse \@lr\space back left hoof/.code = \pingu@color{horse\@lr @bl@hoof}{##1},%
- horse \@lr\space back right hoof/.code = \pingu@color{horse\@lr @br@hoof}{##1},%
- horse \@lr\space front hoofs/.style = {/pingu/horse \@lr\space front left hoof=##1,/pingu/horse \@lr\space front right hoof=##1},
- horse \@lr\space back hoofs/.style = {/pingu/horse \@lr\space back left hoof=##1,/pingu/horse \@lr\space back right hoof=##1},
- horse \@lr\space hoofs/.style = {/pingu/horse \@lr\space front hoofs=##1,/pingu/horse \@lr\space back hoofs=##1},
- horse \@lr\space hoofs/.default = gray!80!white,
- % TODO: allow colors to be styles?
- horse \@lr\space xshift/.code = \@namedef{pingu@x@horse\@lr @xshift}{##1},
- horse \@lr\space yshift/.code = \@namedef{pingu@x@horse\@lr @yshift}{##1},
- horse \@lr\space on base/.style ={/pingu/horse \@lr\space yshift=4cm},
-}{horse \@lr\space draw=\csname pingu@color@horse\@lr\endcsname!80!pingu@black,horse \@lr\space mane=\csname pingu@color@horse\@lr\endcsname!86!pingu@white,horse \@lr\space mane draw=\csname pingu@color@horse\@lr @mane\endcsname!80!pingu@black,horse \@lr\space eyes=\csname pingu@color@horse\@lr @draw\endcsname,horse \@lr\space mouth=\csname pingu@color@horse\@lr @draw\endcsname,horse \@lr\space nose=\csname pingu@color@horse\@lr @draw\endcsname,horse \@lr\space ears=\csname pingu@color@horse\@lr\endcsname,horse \@lr\space thatch=\csname pingu@color@horse\@lr @mane\endcsname,horse \@lr\space thatch draw=\csname pingu@color@horse\@lr @thatch\endcsname!80!pingu@black,horse \@lr\space tail=\csname pingu@color@horse\@lr @mane\endcsname,horse \@lr\space tail draw=\csname pingu@color@horse\@lr @tail\endcsname!80!pingu@black,horse \@lr\space has base=false,horse \@lr\space base=lightgray!90!black,horse \@lr\space base draw=\csname pingu@color@horse\@lr @base\endcsname!91!pingu@black,horse \@lr\space base shade=lightgray!80!black,horse \@lr\space base shade draw=\csname pingu@color@horse\@lr @base@shade\endcsname!91!pingu@black,horse \@lr\space xshift=0pt,horse \@lr\space yshift=0pt,horse \@lr\space flip=\ifx\@lr\pingu@str@wing@left true\else false\fi,horse \@lr\space donkey=false,horse \@lr\space line width=1.75pt,horse \@lr\space hoofs=\@pingu@none}
-
-\def\pingu@draw@wi@horse#1{%
- \pingu@setup@wing{horse}{#1}%
-\scope[scale=\pingu@@horse@scale,every path/.append style={line cap=round, line join=round},shift=(\pingu@name-wing-#1),rotate around={\@angle-5:(\pingu@name-wing-#1)}]
-\csname if@pingu@x@horse@#1@flip@\endcsname
-\scope[xshift=-4cm-\csname pingu@x@horse#1@xshift\endcsname,yshift=-42mm+\csname pingu@x@horse#1@yshift\endcsname]
-\else
-\scope[xshift=4cm+\csname pingu@x@horse#1@xshift\endcsname,yshift=-42mm+\csname pingu@x@horse#1@yshift\endcsname,xscale=-1]
-\fi
-\csname if@pingu@x@horse@#1@donkey@\endcsname
- \@pingu@@horse@@donkey@true
-\fi
- \edef\@pingu@@horse@lw{\csname pingu@horse#1@x@line@width\endcsname}
- \pingu@@drawer@horse{#1}
- % TODO-SET: hoof
-\endscope\endscope
-}
-% todo: make statue extra
-% todo: make horse hat
-
-% to get on horse we create some kind of third wing item: 'on'
-% that will be used to initialize all of the colors and keys
-\newif\if@pingu@x@horse@on@flip@
-\newif\if@pingu@x@horse@on@base@
-\newif\if@pingu@x@horse@on@boundingbox@
-\newif\if@pingu@x@horse@on@donkey@
-% TODO: select keys
-% TODO: option so it does not affect the bounding box (default!)
-\pingu@create@extra{horseon}{%
- on horse/.code = {\pingu@set@extra{horseon}{true}\pingu@color{horseon}{#1}},
- on horse/.default = pingu@bronze!80!pingu@black,
- horse behind/.style = {on horse=#1, on horse scale=.325, on horse yshift=6.15cm},
- horse behind/.default = pingu@bronze!80!pingu@black,
- on horse flip/.is if = @pingu@x@horse@on@flip@,
- on horse donkey/.is if = @pingu@x@horse@on@donkey@,
- on horse has base/.is if = @pingu@x@horse@on@base@,
- on horse has bounding box/.is if = @pingu@x@horse@on@boundingbox@,
- on horse draw/.code = \pingu@color{horseon@draw}{#1},%
- on horse line width/.code = \@namedef{pingu@horseon@x@line@width}{#1},%
- on horse mane/.code = \pingu@color{horseon@mane}{#1},%
- on horse mane draw/.code = \pingu@color{horseon@mane@draw}{#1},%
- on horse thatch/.code = \pingu@color{horseon@thatch}{#1},%
- on horse thatch draw/.code = \pingu@color{horseon@thatch@draw}{#1},%
- on horse tail/.code = \pingu@color{horseon@tail}{#1},%
- on horse tail draw/.code = \pingu@color{horseon@tail@draw}{#1},%
- on horse eyes/.code = \pingu@color{horseon@eyes}{#1},%
- on horse eye/.forward to = /pingu/on horse eyes,%
- on horse mouth/.code = \pingu@color{horseon@mouth}{#1},%
- on horse nose/.code = \pingu@color{horseon@nose}{#1},%
- on horse ears/.code = \pingu@color{horseon@ears}{#1},%
- on horse base/.code = \pingu@color{horseon@base}{#1},%
- on horse base draw/.code = \pingu@color{horseon@base@draw}{#1},%
- on horse base shade/.code = \pingu@color{horseon@base@shade}{#1},%
- on horse base shade draw/.code = \pingu@color{horseon@base@shade@draw}{#1},%
- on horse front left hoof/.code = \pingu@color{horseon@fl@hoof}{#1},%
- on horse front right hoof/.code = \pingu@color{horseon@fr@hoof}{#1},%
- on horse back left hoof/.code = \pingu@color{horseon@bl@hoof}{#1},%
- on horse back right hoof/.code = \pingu@color{horseon@br@hoof}{#1},%
- on horse front hoofs/.style = {/pingu/on horse front left hoof=#1,/pingu/on horse front right hoof=#1},
- on horse back hoofs/.style = {/pingu/on horse back left hoof=#1,/pingu/on horse back right hoof=#1},
- on horse hoofs/.style = {/pingu/on horse front hoofs=#1,/pingu/on horse back hoofs=#1},
- on horse hoofs/.default = gray!80!white,
- on horse xshift/.code = \@namedef{pingu@x@horseon@xshift}{#1},
- on horse yshift/.code = \@namedef{pingu@x@horseon@yshift}{#1},
- on horse scale/.code = \@namedef{pingu@x@horseon@scale}{#1}
-}{on horse draw=\pingu@color@horseon!80!pingu@black,on horse mane=\pingu@color@horseon!86!pingu@white,on horse mane draw=\pingu@color@horseon@mane!80!pingu@black,on horse eyes=\pingu@color@horseon@draw,on horse mouth=\pingu@color@horseon@draw,on horse nose=\pingu@color@horseon@draw,on horse ears=\pingu@color@horseon,on horse thatch=\pingu@color@horseon@mane,on horse thatch draw=\pingu@color@horseon@thatch!80!pingu@black,on horse tail=\pingu@color@horseon@mane,on horse tail draw=\pingu@color@horseon@tail!80!pingu@black,on horse has base=false,on horse base=lightgray!90!black,on horse base draw=\pingu@color@horseon@base!91!pingu@black,on horse base shade=lightgray!80!black,on horse base shade draw=\pingu@color@horseon@base@shade!91!pingu@black,on horse xshift=0pt,on horse yshift=0pt,on horse flip=false,on horse scale=0.75,on horse has bounding box=false,on horse donkey=false,on horse line width=1.75pt,on horse hoofs=\@pingu@none}
-
-
-\def\pingu@draw@eb@horseon{%
-\pingu@layer{background}[scale=\pingu@x@horseon@scale,every path/.append style={line cap=round, line join=round},shift=(\pingu@name-bottom-center)]
-\if@pingu@x@horse@on@donkey@
- \@pingu@@horse@@donkey@true
-\fi
-\if@pingu@x@horse@on@flip@
- \scope[xshift=-45mm-\pingu@x@horseon@xshift,yshift=-67mm+\pingu@x@horseon@yshift,xscale=\if@pingu@x@horse@on@donkey@ 1.1\else1\fi,yscale=\if@pingu@@horse@@donkey@.9\else1\fi]
- \else
- \scope[xshift=45mm+\pingu@x@horseon@xshift,yshift=-67mm+\pingu@x@horseon@yshift,xscale=\if@pingu@x@horse@on@donkey@-1.1\else-1\fi,yscale=\if@pingu@@horse@@donkey@.9\else1\fi]
- \fi
-\edef\@pingu@@horse@lw{\pingu@horseon@x@line@width}
-\if@pingu@x@horse@on@boundingbox@\else\pgfinterruptboundingbox\fi
- \pingu@@drawer@horse{on}
-\if@pingu@x@horse@on@boundingbox@\else\endpgfinterruptboundingbox\fi
-\endscope\endpingu@layer
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-magic.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-magic.lib.tex
deleted file mode 100644
index a5e3fb2ddc..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-magic.lib.tex
+++ /dev/null
@@ -1,14 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@wing@extra{handcast}{%
- handcast \@lr/.forward to = /pingu/hand cast \@lr,
- hand cast \@lr/.code = {\pingu@set@extra{handcast\@lr}{true}\@namedef{pingu@handcast@\@lr}{##1}},
- hand cast \@lr/.default = {X},
- handcast \@lr\space color/.forward to = /pingu/hand cast \@lr\space color,
- hand cast \@lr\space color/.code = \pingu@color{handcast@\@lr @color}{##1},%
-}{hand cast \@lr\space color=pingu@purple}
-\def\pingu@draw@wi@handcast#1{%
- \pingu@setup@wing{handcast}{#1}%
- \path[rotate around={\@angle:(\pingu@name-wing-#1)}] (\pingu@name-wing-#1)++(0,5mm) node[\csname pingu@color@handcast@#1@color\endcsname] {\@nameuse{pingu@handcast@#1}};
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-medieval.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-medieval.lib.tex
deleted file mode 100644
index 4e81c4416c..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-medieval.lib.tex
+++ /dev/null
@@ -1,205 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\newif\if@pingu@x@rook@draw@hatch@
-\pingu@create@extra{rook}{%
- rook/.code = \pingu@set@extra{rook}{true}\pingu@color{rook}{#1},
- rook/.default = pingu@silver,
- rook back/.code = \pingu@color{rook@back}{#1},
- rook hatch/.is if = @pingu@x@rook@draw@hatch@,
- rook hatch/.default = true,
- rook shade/.code = \pingu@color{rook@shade}{#1},
-}{rook back=\pingu@color@rook!85!black,rook shade=\pingu@color@rook!92!black,rook hatch}
-\def\pingu@draw@ea@rook{%
-\if@pingu@do@back@\else\if@pingu@x@rook@draw@hatch@\else\pingu@layer{foreground}[]\fi\fi
- \pingu@block[even odd rule]{\pingu@color@rook} ([xshift=-.2mm]\pingu@name-wings-side-right|-\pingu@name-foot-right) [rounded corners=\p@] to[bend right=9] coordinate[pos=.15] (@tmpe) ([xshift=.2mm]\pingu@name-wings-side-left|-\pingu@name-foot-left) [sharp corners] to[bend right=1.5*\pingu@bend] (\pingu@name-wings-side-left|-\pingu@name-head-top) coordinate (@tmp) to[bend left=3] coordinate[pos=.3] (@tmpc) coordinate[pos=.7] (@tmpd) (\pingu@name-wings-side-right|-\pingu@name-head-top) [rounded corners=\p@] coordinate (@tmpb) to[bend right=1.5*\pingu@bend] cycle \if@pingu@x@rook@draw@hatch@ (\pingu@name-head-center) ellipse[x radius=.8\pingu@w@half, y radius=.45\pingu@w@half]\fi;
- \pingu@block{\pingu@color@rook} (@tmp) to[bend right=2] ++(0,2mm) [rounded corners=.25mm] to[bend left=1] ++(-2mm,-.1mm) -- ++(0,-2.25mm);
- \pingu@block{\pingu@color@rook} (@tmpb) to[bend left=2] ++(0,2mm) [rounded corners=.25mm] to[bend right=1] ++(2mm,-.1mm) -- ++(0,-2.25mm);
-
- \pingu@block{\pingu@color@rook} (@tmpc)++(-2mm,-.25mm) [rounded corners=.25mm] to[bend left=2] ++(0,2.25mm) to[bend right=1] ++(4mm,.05mm) -- ++(0,-2.25mm);
- \pingu@block{\pingu@color@rook} (@tmpd)++(2mm,-.25mm) [rounded corners=.25mm] to[bend left=2] ++(0,2.25mm) to[bend left=1] ++(-4mm,-.05mm) -- ++(0,-2.25mm);
-
- % custom shade boi (or gurl, wateva)
- \scope
- \clip ([xshift=-.2mm]\pingu@name-wings-side-right|-\pingu@name-foot-right) [rounded corners=\p@] to[bend right=5] ([xshift=.2mm]\pingu@name-wings-side-left|-\pingu@name-foot-left) [sharp corners] to[bend right=1.5*\pingu@bend] (\pingu@name-wings-side-left|-\pingu@name-head-top) -- ++(0,2mm) to[bend left=3] (\pingu@name-wings-side-right|-\pingu@name-head-top) to[bend right=1.5*\pingu@bend] cycle;
- \if@pingu@x@rook@draw@hatch@
- \clip[/pingu/@invclip] (\pingu@name-head-center) ellipse[x radius=.8\pingu@w@half, y radius=.45\pingu@w@half];
- \fi
- \pingu@block{\pingu@color@rook@shade} (@tmpe) to[bend right=5] ([xshift=.2mm]@tmpe-|@tmp) to[bend right=1.5*\pingu@bend] ([yshift=2mm]@tmp) to[bend left=10] cycle;
- \endscope
- \if@pingu@do@back@\else\if@pingu@x@rook@draw@hatch@\else\endpingu@layer\fi\fi
-
- \pingu@layer{background}[]
- \pingu@block{\pingu@color@rook@back} (@tmp) to[bend right=3] coordinate[pos=.3] (@tmpc) coordinate[pos=.7] (@tmpd) (@tmpb) to[bend right=30] cycle;
- \pingu@block{\pingu@color@rook@back} (@tmpb) to[bend left=2] ++(0,2mm) [rounded corners=.25mm] to[bend left=1] ++(2mm,.1mm) -- ++(0,-2.25mm);
- \pingu@block{\pingu@color@rook@back} (@tmp) to[bend right=2] ++(0,2mm) [rounded corners=.25mm] to[bend right=1] ++(-2mm,.1mm) -- ++(0,-2.25mm);
-
- \pingu@block{\pingu@color@rook@back} (@tmpc)++(-2mm,-.49mm) [rounded corners=.25mm] to[bend left=2] ++(0,2.25mm) to[bend right=1] ++(4mm,.05mm) -- ++(0,-2.25mm);
- \pingu@block{\pingu@color@rook@back} (@tmpd)++(2mm,-.49mm) [rounded corners=.25mm] to[bend left=2] ++(0,2.25mm) to[bend left=1] ++(-4mm,-.05mm) -- ++(0,-2.25mm);
- \endpingu@layer
-}
-
-\newif\if@pingu@x@crown@ddd@ % 3d
-\newif\if@pingu@x@crown@shade@ % 3d
-\pingu@create@extra{crown}{%
- crown/.code = \pingu@set@extra{crown}{true}\pingu@color{crown}{#1},
- crown/.default = pingu@yellow,
- crown 3d/.is if = @pingu@x@crown@ddd@, crown 3d/.default = true,
- crown 2d/.style = {crown=#1, crown 3d=false},
- crown 2d/.default = pingu@yellow,
- crown back/.code = \pingu@color{crown@back}{#1},
- crown front bend/.code = \def\pingu@x@crown@f@bend{#1},
- crown back bend/.code = \def\pingu@x@crown@b@bend{#1},
- crown gem shade/.is if = @pingu@x@crown@shade@, crown gem shade/.default = true,
- crown gem colors/.code n args = 7{\pingu@color{crown@gem@a}{#1}\pingu@color{crown@gem@b}{#2}\pingu@color{crown@gem@c}{#3}\pingu@color{crown@gem@d}{#4}\pingu@color{crown@gem@e}{#5}\pingu@color{crown@gem@f}{#6}\pingu@color{crown@gem@g}{#7}},
- crown gem ring/.code = \pingu@color{crown@gem@ring}{#1},
- crown position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@crown@angle{#1}\def\pingu@x@crown@xshift{#2}\def\pingu@x@crown@yshift{#3}\def\pingu@x@crown@scale{#4}},
-}{crown position={-9:(1mm,0mm)1},crown front bend=16,crown back bend=9,crown back=\pingu@color@crown!93!black,crown 3d,crown gem colors={pingu@purple}{pingu@blue}{pingu@green}{pingu@purple}{pingu@green}{pingu@blue}{pingu@purple},crown gem ring=\pingu@color@crown!85!white,crown gem shade}
-
-% color | bend1 | bend1
-\def\pingu@draw@ea@crown@s#1#2#3{
-\pingu@block{#1} [rounded corners=.2mm](-6.25mm,-.25cm) to[bend left=2] ++(0,3.125mm) to[bend #2=\pingu@x@crown@f@bend]
- coordinate[pos=0] (r2) coordinate[pos=.07] (r1)
- coordinate[pos=.14-.07] (a1) coordinate[pos=.14] (a2) coordinate[pos=.14+.07] (a3)
- coordinate[pos=.30-.08] (b1) coordinate[pos=.30] (b2) coordinate[pos=.30+.08] (b3)
- coordinate[pos=.50- .1] (c1) coordinate[pos=.50] (x2) coordinate[pos=.50+ .1] (c3)
- coordinate[pos=.69-.08] (d1) coordinate[pos=.69] (d2) coordinate[pos=.69+.08] (d3)
- coordinate[pos=.85-.07] (e1) coordinate[pos=.85] (e2) coordinate[pos=.85+.07] (e3)
- coordinate[pos=1] (l2) coordinate[pos=.93] (l1)
- ++(1.375cm,0) to[bend left=2] ++(0,-3.125mm) to[bend #3=\pingu@x@crown@f@bend] (-6mm,-.25cm) -- cycle;
-\path (x2)++(0,.9mm) coordinate (c2);
-\@for\a:={a,b,c,d,e}\do{
- \pingu@block{#1} ([yshift=-.1mm]\a1) to[bend right=\pingu@x@crown@f@bend] ([yshift=-.1mm]\a3) to[bend right=2] ([yshift=1.85mm]\a2) to[bend right=2] ([yshift=-.1mm]\a1) -- cycle;
-}
-\pingu@block{#1} (l2)++(0,-.2mm) to[bend right=2] ++(0,1.95mm) -- (l1) -- cycle;
-\pingu@block{#1} (r2)++(0,-.2mm) to[bend left=2] ++(0,1.95mm) -- (r1) -- cycle;
-}
-
-% color | at | shift | scale
-\def\pingu@draw@ea@crown@g#1#2#3#4{
-\scope[shift={(#22)},shift={(#3,-.33mm)}]
- \pingu@block{\pingu@color@crown@gem@ring} ellipse [x radius=.715mm*#4, y radius=.925mm*#4];
- \pingu@block{#1} ellipse [x radius=.633mm*#4, y radius=.85mm*#4];
- \protected@edef\@tmp{#1}\ifx\@tmp\@pingu@none\else
- \if@pingu@x@crown@shade@
- \shade[ball color=#1,fill opacity=.45,shading angle=-95] ellipse [x radius=.633mm*#4, y radius=.85mm*#4];
- \else
- \pingu@block[rotate around={7:(42:.3mm*#4 and .4mm*#4)}]{#1!45!pingu@white} (42:.3mm*#4 and .4mm*#4) ellipse[x radius=.17mm*#4, y radius=.24mm*#4];
- \pingu@block[rotate around={7:(232:.275mm*#4 and .35mm*#4)}]{#1!45!pingu@white} (232:.275mm*#4 and .35mm*#4) ellipse[x radius=.06mm*#4, y radius=.085mm*#4];
- \fi\fi
-\endscope
-}
-\def\pingu@draw@ea@crown{%
-\scope[rotate around={\pingu@x@crown@angle:(\pingu@name-head-top)},%
- shift={(\pingu@name-head-top)},
- shift={(\pingu@x@crown@xshift,\pingu@x@crown@yshift)},
- scale=\pingu@x@crown@scale]
-% draw front
-\if@pingu@x@crown@ddd@
- \pingu@draw@ea@crown@s{\pingu@color@crown}{right}{left}
- \def\@tmpa{.05mm}\def\@tmpb{.025mm}
-\else
- \pingu@draw@ea@crown@s{\pingu@color@crown}{left}{right}
- \def\@tmpa{-.015mm}\def\@tmpb{-.035mm}
-\fi
-% draw the emeralds
-\pingu@draw@ea@crown@g{\pingu@color@crown@gem@b}{a}{-\@tmpa}1
-\pingu@draw@ea@crown@g{\pingu@color@crown@gem@c}{b}{-\@tmpb}1
-\pingu@draw@ea@crown@g{\pingu@color@crown@gem@d}{x}{\z@}{1.35}
-\pingu@draw@ea@crown@g{\pingu@color@crown@gem@e}{d}{\@tmpb}1
-\pingu@draw@ea@crown@g{\pingu@color@crown@gem@f}{e}{\@tmpa}1
-\pingu@layer{background}[]
-\pingu@block{\pingu@color@crown@gem@a} (r2)++(0,-.33mm) ellipse [x radius=.3mm, y radius=.8mm];
-\pingu@block{\pingu@color@crown@gem@ring} (r2)++(0,-.33mm) ellipse [x radius=.1mm, y radius=.885mm];
-\pingu@block{\pingu@color@crown@gem@g} (l2)++(0,-.33mm) ellipse [x radius=.3mm, y radius=.8mm];
-\pingu@block{\pingu@color@crown@gem@ring} (l2)++(0,-.33mm) ellipse [x radius=.1mm, y radius=.885mm];
-% draw back if 3d
-\if@pingu@x@crown@ddd@
- \pingu@draw@ea@crown@s{\pingu@color@crown@back}{left}{right}
-\fi
-\endpingu@layer
-\endscope
-}
-
-\newif\if@pingu@x@princesscrown@ddd@
-\newif\if@pingu@x@princesscrown@shade@
-\newif\if@pingu@x@princesscrown@bobbles@
-\pingu@create@extra{princesscrown}{%
- princess crown/.code = \pingu@set@extra{princesscrown}{true}\pingu@color{princesscrown}{#1},
- princess crown/.default = pingu@yellow,
- princess crown 3d/.is if= @pingu@x@princesscrown@ddd@, princess crown 3d/.default = true,
- princess crown 2d/.style = {princess crown=#1, princess crown 3d=false},
- princess crown 2d/.default = pingu@yellow,
- princess crown back/.code = \pingu@color{princesscrown@back}{#1},
- princess crown front bend/.code = \def\pingu@x@princesscrown@f@bend{#1},
- princess crown back bend/.code = \def\pingu@x@princesscrown@b@bend{#1},
- princess crown gem shade/.is if = @pingu@x@princesscrown@shade@,
- princess crown bobbles/.is if = @pingu@x@princesscrown@bobbles@,
- princess crown gem shade/.default = true,
- princess crown gem colors/.code n args = 5{\pingu@color{princesscrown@gem@a}{#1}\pingu@color{princesscrown@gem@b}{#2}\pingu@color{princesscrown@gem@c}{#3}\pingu@color{princesscrown@gem@d}{#4}\pingu@color{princesscrown@gem@e}{#5}},
- princess crown gem ring/.code = \pingu@color{princesscrown@gem@ring}{#1},
- princess crown position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@princesscrown@angle{#1}\def\pingu@x@princesscrown@xshift{#2}\def\pingu@x@princesscrown@yshift{#3}\def\pingu@x@princesscrown@scale{#4}},
-}{princess crown position={-9:(1mm,0mm)1},princess crown front bend=12,princess crown back bend=7,princess crown back=\pingu@color@princesscrown!93!black,princess crown 3d,princess crown gem colors={pingu@purple}{pingu@blue}{pingu@green}{pingu@blue}{pingu@purple},princess crown gem ring=\pingu@color@princesscrown!85!white,princess crown gem shade,princess crown bobbles}
-
-% color | bend1 | bend2
-\def\pingu@draw@ea@princesscrown@s#1#2#3{
-\pingu@block{#1} [rounded corners=.2mm](-3.25mm,-.15cm) to[bend left=2] ++(0,2.32mm) to[bend #2=\pingu@x@princesscrown@f@bend]
- coordinate[pos=0] (r2) coordinate[pos=.065] (r1)
- coordinate[pos=.11] (a1) coordinate[pos=.2] (a2) coordinate[pos=.29] (a3)
- coordinate[pos=.35] (b1) coordinate[pos=.50] (x2) coordinate[pos=.65] (b3)
- coordinate[pos=.71] (c1) coordinate[pos=.8] (c2) coordinate[pos=.89] (c3)
- coordinate[pos=1] (l2) coordinate[pos=.93] (l1)
- ++(8mm,0) to[bend left=2] ++(0,-2.32mm) to[bend #3=\pingu@x@princesscrown@f@bend] (-3mm,-.15cm) -- cycle;
-\path (x2)++(0,.9mm) coordinate (b2);
-\@for\a:={a,b,c}\do{
- \pingu@block{#1} ([yshift=-.1mm]\a1) to[bend right=\pingu@x@princesscrown@f@bend] ([yshift=-.1mm]\a3) to[bend left=2] ([yshift=2.15mm]\a2) to[bend left=2] ([yshift=-.1mm]\a1) -- cycle;
- \if@pingu@x@princesscrown@bobbles@\pingu@block{#1} ([yshift=2.15mm]\a2) circle [radius=.45\p@];\fi
-}
-\pingu@block{#1} (l2)++(0,-.2mm) to[bend left=2] ++(0,2.25mm) -- (l1) -- cycle;
-\pingu@block{#1} (r2)++(0,-.2mm) to[bend right=2] ++(0,2.25mm) -- (r1) -- cycle;
-\if@pingu@x@princesscrown@bobbles@\pingu@block{#1} (l2)++(0,2.05mm) circle [radius=.45\p@];
-\pingu@block{#1} (r2)++(0,2.05mm) circle [radius=.45\p@];\fi
-}
-
-% draw single gem; color | at | shift | scale
-\def\pingu@draw@ea@princesscrown@g#1#2#3#4{
-\scope[shift={(#22)},shift={(#3,-.33mm)}]
- \pingu@block{\pingu@color@princesscrown@gem@ring} ellipse [x radius=.715mm*#4, y radius=.925mm*#4];
- \pingu@block{#1} ellipse [x radius=.633mm*#4, y radius=.85mm*#4];
- \protected@edef\@tmp{#1}\ifx\@tmp\@pingu@none\else
- \if@pingu@x@princesscrown@shade@
- \shade[ball color=#1,fill opacity=.45,shading angle=-95] ellipse [x radius=.633mm*#4, y radius=.85mm*#4];
- \else
- \pingu@block[rotate around={7:(42:.3mm*#4 and .4mm*#4)}]{#1!45!pingu@white} (42:.3mm*#4 and .4mm*#4) ellipse[x radius=.17mm*#4, y radius=.24mm*#4];
- \pingu@block[rotate around={7:(232:.275mm*#4 and .35mm*#4)}]{#1!45!pingu@white} (232:.275mm*#4 and .35mm*#4) ellipse[x radius=.06mm*#4, y radius=.085mm*#4];
- \fi\fi
-\endscope}
-\def\pingu@draw@ea@princesscrown{%
-\scope[rotate around={\pingu@x@princesscrown@angle:(\pingu@name-head-top)},%
- shift={(\pingu@name-head-top)},
- shift={(\pingu@x@princesscrown@xshift,\pingu@x@princesscrown@yshift)},
- scale=\pingu@x@princesscrown@scale]
-% draw front
-\if@pingu@x@princesscrown@ddd@
- \pingu@draw@ea@princesscrown@s{\pingu@color@princesscrown}{right}{left}
- \def\@tmpa{.05mm}
-\else
- \pingu@draw@ea@princesscrown@s{\pingu@color@princesscrown}{left}{right}
- \def\@tmpa{-.015mm}
-\fi
-% draw the emaralds
-\pingu@draw@ea@princesscrown@g{\pingu@color@princesscrown@gem@b}{a}{-\@tmpa}{.95}
-\pingu@draw@ea@princesscrown@g{\pingu@color@princesscrown@gem@c}{x}{\z@}{1.3}
-\pingu@draw@ea@princesscrown@g{\pingu@color@princesscrown@gem@d}{c}{\@tmpa}{.95}
-\pingu@layer{background}[]
-\pingu@block{\pingu@color@princesscrown@gem@a} (r2)++(0,-.33mm) ellipse [x radius=.3mm, y radius=.8mm];
-\pingu@block{\pingu@color@princesscrown@gem@ring} (r2)++(0,-.33mm) ellipse [x radius=.1mm, y radius=.885mm];
-\pingu@block{\pingu@color@princesscrown@gem@e} (l2)++(0,-.33mm) ellipse [x radius=.3mm, y radius=.8mm];
-\pingu@block{\pingu@color@princesscrown@gem@ring} (l2)++(0,-.33mm) ellipse [x radius=.1mm, y radius=.885mm];
-% draw back if 3d
-\if@pingu@x@princesscrown@ddd@
- \pingu@draw@ea@princesscrown@s{\pingu@color@princesscrown@back}{left}{right}
-\fi
-\endpingu@layer
-\endscope
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-movement.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-movement.lib.tex
deleted file mode 100644
index 0916cda347..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-movement.lib.tex
+++ /dev/null
@@ -1,75 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@bodytype@add{tilt-right}{%
-\pingu@block[save path=\pingu@lowerpingu]{\pingu@color@body@main} (0,\pingu@outer@off)
-% left side
-to[bend right=\pingu@bend] coordinate[pos=.775] (\pingu@name-waist-right) ++(0,-\pingu@side@h@half-\pingu@outer@off)
-% feety stuff
-arc (180:270:\pingu@foot@outer@w{}-1mm and \pingu@foot@outer@h) coordinate[yshift=-.2mm] (\pingu@name-foot-right)
-arc (270:332:\pingu@foot@inner@w{}+1mm and 2.5*\pingu@foot@inner@h)
-coordinate (\pingu@name-bottom-center)
-arc (208:270:\pingu@foot@inner@w{} and 1.25*\pingu@foot@inner@h) coordinate[yshift=-.4mm] (\pingu@name-foot-left)
-arc (270:360:\pingu@foot@outer@w{} and 1.125*\pingu@foot@outer@h)%
-% right side
-to[bend right=\pingu@bend] coordinate[pos=.225] (\pingu@name-waist-left) ++(0,\pingu@side@h@half+\pingu@outer@off)
-% coordinate
-coordinate (\pingu@name-wings-side-left)
--- (0,\pingu@outer@off) coordinate (\pingu@name-wings-side-right) coordinate[pos=.5] (\pingu@name-head-center) -- cycle;
-
-\pingu@block[save path=\pingu@upperpingu]{\pingu@color@body@head} (\pingu@name-head-center)
-++(0,\pingu@head@h@half) coordinate (\pingu@name-head-top)
-arc(90:450:\pingu@w@half{} and \pingu@head@h@half)
-coordinate[pos=\pinguanglehr] (\pingu@name-head-right)
-coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
-
-\coordinate (\pingu@name-belly-back) at (\pingu@w@half,-1cm);
-\coordinate (\pingu@name-belly-center) at (\pingu@w@half,-.68\pingu@side@h@half);
-\pingu@block[save path=\pingu@whitepingu]{\pingu@color@body@front} (\pingu@name-belly-back)++(-\pingu@w@half+\pingu@one,\pingu@lower@off) to[bend right=.8\pingu@bend] ++(-.05mm,1.05cm-\pingu@side@h@half-\pingu@lower@off) arc (180:270:3.7mm and 2mm) arc (270:331:5mm and 3*.85mm) arc (207:270:5.3mm and 1.125*.85mm) arc (270:360:4.025mm and 1.25*2mm) to[bend right=.8\pingu@bend] ++(0,\pingu@side@h@half-1.05cm+\pingu@lower@off) arc (0:180:\pingu@w@half-.96mm and \pingu@w@half-\pingu@one) -- cycle;
-
-\coordinate (\pingu@name-eye-back-right) at ([xshift=-.275cm,yshift=.25cm-\pingu@outer@off]\pingu@name-head-center);
-\coordinate (\pingu@name-eye-back-left) at ([xshift=.275cm,yshift=.25cm-\pingu@outer@off]\pingu@name-head-center);
-
-\coordinate (\pingu@name-head-back-con-right) at ([xshift=-\pingu@headcon@x,yshift=-\pingu@headcon@y]\pingu@name-eye-back-right);
-\coordinate (\pingu@name-head-back-con-left) at ([xshift=\pingu@headcon@x,yshift=-\pingu@headcon@y]\pingu@name-eye-back-left);
-
-\pingu@block{\pingu@color@body@front} (\pingu@name-eye-back-right)++(0,-.25mm) ellipse [x radius=.525cm,y radius=.625cm];
-\pingu@block{\pingu@color@body@front} (\pingu@name-eye-back-left)++(0,-.25mm) ellipse [x radius=.525cm,y radius=.625cm];
-}
-
-
-\pingu@bodytype@add{tilt-left}{%
-\pingu@block[save path=\pingu@lowerpingu]{\pingu@color@body@main} (0,\pingu@outer@off)
-% left side
-to[bend right=\pingu@bend] coordinate[pos=.775] (\pingu@name-waist-right) ++(0,-\pingu@side@h@half-\pingu@outer@off)
-% feety stuff
-arc (180:270:\pingu@foot@outer@w{}-1mm and 1.25*\pingu@foot@outer@h) coordinate[yshift=-.2mm] (\pingu@name-foot-right)
-arc (270:332:\pingu@foot@inner@w{}+1mm and 1.125*\pingu@foot@inner@h)
-coordinate (\pingu@name-bottom-center)
-arc (208:270:\pingu@foot@inner@w{} and 2.5*\pingu@foot@inner@h) coordinate[yshift=-.4mm] (\pingu@name-foot-left)
-arc (270:360:\pingu@foot@outer@w{} and \pingu@foot@outer@h)%
-% right side
-to[bend right=\pingu@bend] coordinate[pos=.225] (\pingu@name-waist-left) ++(0,\pingu@side@h@half+\pingu@outer@off)
-% coordinate
-coordinate (\pingu@name-wings-side-left)
--- (0,\pingu@outer@off) coordinate (\pingu@name-wings-side-right) coordinate[pos=.5] (\pingu@name-head-center) -- cycle;
-
-\pingu@block[save path=\pingu@upperpingu]{\pingu@color@body@head} (\pingu@name-head-center)
-++(0,\pingu@head@h@half) coordinate (\pingu@name-head-top)
-arc(90:450:\pingu@w@half{} and \pingu@head@h@half)
-coordinate[pos=\pinguanglehr] (\pingu@name-head-right)
-coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
-
-\coordinate (\pingu@name-belly-back) at (\pingu@w@half,-1cm);
-\coordinate (\pingu@name-belly-center) at (\pingu@w@half,-.68\pingu@side@h@half);
-\pingu@block[save path=\pingu@whitepingu]{\pingu@color@body@front} (\pingu@name-belly-back)++(-\pingu@w@half+\pingu@one,\pingu@lower@off) to[bend right=.8\pingu@bend] ++(-.05mm,1.05cm-\pingu@side@h@half-\pingu@lower@off) arc (180:270:4.025mm and 1.25*2mm) arc (270:331:5.25mm and 1.125*.85mm) arc (207:270:5mm and 3*.85mm) arc (270:360:3.75mm and 2mm) to[bend right=.8\pingu@bend] ++(0,\pingu@side@h@half-1.05cm+\pingu@lower@off) arc (0:180:\pingu@w@half-.96mm and \pingu@w@half-\pingu@one) -- cycle;
-
-\coordinate (\pingu@name-eye-back-right) at ([xshift=-.275cm,yshift=.25cm-\pingu@outer@off]\pingu@name-head-center);
-\coordinate (\pingu@name-eye-back-left) at ([xshift=.275cm,yshift=.25cm-\pingu@outer@off]\pingu@name-head-center);
-
-\coordinate (\pingu@name-head-back-con-right) at ([xshift=-\pingu@headcon@x,yshift=-\pingu@headcon@y]\pingu@name-eye-back-right);
-\coordinate (\pingu@name-head-back-con-left) at ([xshift=\pingu@headcon@x,yshift=-\pingu@headcon@y]\pingu@name-eye-back-left);
-
-\pingu@block{\pingu@color@body@front} (\pingu@name-eye-back-right)++(0,-.25mm) ellipse [x radius=.525cm,y radius=.625cm];
-\pingu@block{\pingu@color@body@front} (\pingu@name-eye-back-left)++(0,-.25mm) ellipse [x radius=.525cm,y radius=.625cm];
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-safe.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-safe.lib.tex
deleted file mode 100644
index d25913d3cd..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-safe.lib.tex
+++ /dev/null
@@ -1,30 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@extra{mask}{%
- mask/.code = {\pingu@set@extra{mask}{true}\pingu@color{mask}{#1}},
- mask/.default = pingu@white!61!gray,%
- mask band/.code = \pingu@color{mask@band}{#1},%
- mask line width/.code = \def\pingu@x@mask@line@width{#1},%
- mask band inner/.code = \pingu@color{mask@band@inner}{#1},%
- mask band outer/.code = \pingu@color{mask@band@outer}{#1}%
-}{mask band=\pingu@color@body@main, mask band inner=\pingu@color@mask@band!60!\pingu@color@mask, mask band outer=\pingu@color@mask@band!82!\pingu@color@mask,mask line width=.565pt}
-
-\def\pingu@draw@ea@mask{%
-\pingu@block{\pingu@color@mask} [rounded corners=.8mm] ([xshift=-5mm,yshift=.75mm]\pingu@name-bill) coordinate (@ul) [rounded corners=.1mm]-- ++(3.5mm,.55mm) to[bend left=3] ++(3mm,0) -- ++(3.5mm,-.55mm) coordinate (@ur) -- ++(0,-4.25mm)[rounded corners=.8mm] coordinate (@lr) -- ++(-3.5mm,-.45mm) to[bend left=3] ++(-3mm,0) [rounded corners=.1mm] -- ++(-3.5mm,.45mm) coordinate (@ll) -- cycle;
-\scope
-\clip[use path=\pingu@upperpingu];
-\pingu@draw[line width=\pingu@x@mask@line@width]{\pingu@color@mask@band} ([yshift=-.1mm,xshift=.2mm]@ul) to[bend left=3] ([yshift=-1.1mm]\pingu@name-wings-side-right);
-\pingu@draw[line width=\pingu@x@mask@line@width]{\pingu@color@mask@band} ([yshift=-.1mm,xshift=-.2mm]@ur) to[bend right=3] ([yshift=-1.1mm]\pingu@name-wings-side-left);
-\endscope\scope
-\clip[use path=\pingu@lowerpingu];
-\pingu@draw[line width=\pingu@x@mask@line@width]{\pingu@color@mask@band} ([yshift=.01mm,xshift=.2mm]@ll) to[bend left=3] ([yshift=2mm]\pingu@name-wing-right-start);
-\pingu@draw[line width=\pingu@x@mask@line@width]{\pingu@color@mask@band} ([yshift=.01mm,xshift=-.2mm]@lr) to[bend right=3] ([yshift=2mm]\pingu@name-wing-left-start);
-\endscope
-% TODO: fix this sloppy overwrite
-\pingu@block{\pingu@color@mask} [rounded corners=.8mm] ([xshift=-5mm,yshift=.75mm]\pingu@name-bill) coordinate (@ul) [rounded corners=.1mm]-- ++(3.5mm,.55mm) to[bend left=3] ++(3mm,0) -- ++(3.5mm,-.55mm) coordinate (@ur) -- ++(0,-4.25mm)[rounded corners=.8mm] coordinate (@lr) -- ++(-3.5mm,-.45mm) to[bend left=3] ++(-3mm,0) [rounded corners=.1mm] -- ++(-3.5mm,.45mm) coordinate (@ll) -- cycle;
-\pingu@draw[very thin]{\pingu@color@mask@band@inner} ([xshift=-5mm,yshift=.75mm-4.25mm/2]\pingu@name-bill) to[bend right=1] ++(10mm,0);
-\foreach \i/\b/\c in {1.6mm/very thin/\pingu@color@mask@band@inner,.8mm/very thin/\pingu@color@mask@band@inner,0mm//\pingu@color@mask@band@outer} {
-\pingu@draw[\b]{\c} [rounded corners=.8mm] ([xshift=-5mm,yshift=.75mm-\i]\pingu@name-bill) [rounded corners=.1mm]-- ++(3.5mm,.55mm) to[bend left=3] ++(3mm,0) -- ++(3.5mm,-.55mm) -- ++(0,-4.25mm+2*\i)[rounded corners=.8mm] -- ++(-3.5mm,-.45mm) to[bend left=3] ++(-3mm,0) [rounded corners=.1mm] -- ++(-3.5mm,.45mm) -- cycle;
-}
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-science-fiction.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-science-fiction.lib.tex
deleted file mode 100644
index 226a4645b8..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-science-fiction.lib.tex
+++ /dev/null
@@ -1,190 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\newif\if@pingu@x@lightsaber@glow@left
-\newif\if@pingu@x@lightsaber@glow@right
-\newif\if@pingu@x@lightsaber@double@left
-\newif\if@pingu@x@lightsaber@double@right
-\def\pingu@x@saberglow@w@half{.9mm}
-\def\pingulightsaberfactor{.013}
-\pingu@create@wing@extra{lightsaber}{%
- lightsaber \@lr/.code = {\pingu@set@extra{lightsaber\@lr}{true}\pingu@color{lightsaber\@lr}{##1}},
- lightsaber \@lr/.default = pingu@blue,
- lightsaber \@lr\space handle/.code = \pingu@color{lightsaber\@lr @handle}{##1},%
- lightsaber \@lr\space deco/.code = \pingu@color{lightsaber\@lr @deco}{##1},%
- lightsaber \@lr\space ribbs/.code = \pingu@color{lightsaber\@lr @ribbs}{##1},%
- lightsaber \@lr\space button/.code = \pingu@color{lightsaber\@lr @button}{##1},%
- lightsaber \@lr\space button b/.code = \pingu@color{lightsaber\@lr @button@b}{##1},%
- lightsaber \@lr\space color b/.code = \pingu@color{lightsaber\@lr @color@b}{##1},%
- lightsaber \@lr\space length/.code = {\@namedef{pingu@x@lightsaber@length@\@lr}{##1}},%
- lightsaber \@lr\space length b/.code = {\@namedef{pingu@x@lightsaber@length@b@\@lr}{##1}},%
- lightsaber \@lr\space yshift/.code = {\@namedef{pingu@x@lightsaber@yshift@\@lr}{##1}},%
- lightsaber \@lr\space glow/.is if = @pingu@x@lightsaber@glow@\@lr,%
- lightsaber \@lr\space double/.is if = @pingu@x@lightsaber@double@\@lr,%
- lightsaber \@lr\space glow core/.code = \pingu@color{lightsaber\@lr @glow@core}{##1},%
- lightsaber \@lr\space solid/.style = {/pingu/lightsaber \@lr\space glow=false},
- lightsaber \@lr\space disabled/.style = {/pingu/lightsaber \@lr\space solid,/pingu/lightsaber \@lr=\@pingu@none},
- lightsaber \@lr\space outer glow factor/.code = {\@namedef{pingu@x@lightsaber@ogf@\@lr}{##1}}%
-}{lightsaber \@lr\space handle=pingu@silver, lightsaber \@lr\space deco=pingu@silver!12!pingu@black, lightsaber \@lr\space button=pingu@red!85!pingu@black,lightsaber \@lr\space button b=pingu@red!85!pingu@black, lightsaber \@lr\space ribbs=pingu@silver!50!pingu@black,lightsaber \@lr\space length=2cm,lightsaber \@lr\space glow=\ifpengu@setup@glows@ true\else false\fi,lightsaber \@lr\space glow core=white,lightsaber \@lr\space outer glow factor=\pingulightsaberfactor,lightsaber \@lr\space yshift=0pt,lightsaber \@lr\space length b=\csname pingu@x@lightsaber@length@\@lr\endcsname,lightsaber \@lr\space color b=\noexpand\@col}
-
-% #region lightsaber base
-\def\pingu@draw@wi@lightsaber@base#1{%
-% deco-elements
- % base
- \pingu@block{\csname pingu@color@lightsaber#1@deco\endcsname}(\pingu@name-wing-#1)++(-.4mm,2.65mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) -- ++(0,-5mm) -- ++(.8mm,0) |- cycle;
- \if@pingu@wing@item@side@left@
- % ribbs; single path saves memory :D
- \pingu@block{\csname pingu@color@lightsaber#1@ribbs\endcsname}(\pingu@name-wing-#1)++(-.40mm,2.225mm+\csname pingu@x@lightsaber@yshift@#1\endcsname)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
- arc(90:270:.075mm) -- ++(.8mm,0) |- cycle;
- % button
- \pingu@block{\csname pingu@color@lightsaber#1@button@b\endcsname}(\pingu@name-wing-#1)++(.49mm,-1.75mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) ellipse [x radius=.1mm, y radius=.3mm];
- \pingu@block{\csname pingu@color@lightsaber#1@button\endcsname}(\pingu@name-wing-#1)++(.49mm,1.9mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) ellipse [x radius=.1mm, y radius=.3mm];
- % cover
- \pingu@block{\csname pingu@color@lightsaber#1@handle\endcsname}(\pingu@name-wing-#1)++(-.5mm,2.65mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) arc(180:90:.15mm) -- ++(.7mm,0) arc(90:0:.16mm) -- ++(0,-5mm) arc(360:270:.15mm) -- ++(-.7mm,0) arc (270:180:.15mm) -- ++(0,.25mm) arc(270:360:.33mm and .2mm) -- ++(0,4.1mm) arc(0:90:.33mm and .2mm) -- ++(0,.25mm) -- cycle;
- \else
- % ribbs; single path saves memory :D (the second)
- \pingu@block{\csname pingu@color@lightsaber#1@ribbs\endcsname}(\pingu@name-wing-#1)++(.40mm,2.225mm+\csname pingu@x@lightsaber@yshift@#1\endcsname)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
- arc(90:-90:.075mm) -- ++(-.8mm,0) |- cycle;
- % buttons
- \pingu@block{\csname pingu@color@lightsaber#1@button@b\endcsname}(\pingu@name-wing-#1)++(-.49mm,-1.75mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) ellipse [x radius=.1mm, y radius=.3mm];
- \pingu@block{\csname pingu@color@lightsaber#1@button\endcsname}(\pingu@name-wing-#1)++(-.49mm,1.9mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) ellipse [x radius=.1mm, y radius=.3mm];
- % cover
- \pingu@block{\csname pingu@color@lightsaber#1@handle\endcsname}(\pingu@name-wing-#1)++(.5mm,2.65mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) arc(0:90:.15mm) -- ++(-.7mm,0) arc(90:180:.16mm) -- ++(0,-5mm) arc(180:270:.15mm) -- ++(.7mm,0) arc (270:360:.15mm) -- ++(0,.25mm) arc(270:180:.33mm and .2mm) -- ++(0,4.1mm) arc(180:90:.33mm and .2mm) -- ++(0,.25mm) -- cycle;
- \fi
-}
-% #endregion
-% #1 wing, #2 yshift, #3 angle, #4 length, #5 color
-\def\pingu@draw@wi@lightsaber@pre#1#2#3#4#5{
- \scope[rotate around={#3:(\pingu@name-wing-#1)}]
- \csname if@pingu@x@lightsaber@glow@#1\endcsname
- \@for\i:={0,2,4,6,7,8,9,10,11,12,13,14,15,16,17}\do{
- \pingu@block[fill opacity=\ifnum\i>14 .225\else.1\fi*\i/20]{#5} (\pingu@name-wing-#1)++(-\pingu@x@saberglow@w@half+\i*\i mm/440,#2) -- ++(.05mm,#4) arc(180:0:\pingu@x@saberglow@w@half-.05mm-\i*\i mm/440 and \ifnum\i>14 .85mm\else\pingu@one\fi-\i mm/30) -- ++(.05mm,-#4) arc (0:-180:\pingu@x@saberglow@w@half-\i*\i mm/440 and .35mm);
- }
- \else % draw solid
- \pingu@block{#5} (\pingu@name-wing-#1)++(-.425mm,#2-.1mm) -- ++(.05mm,#4) arc(180:0:.375mm and .375mm) -- ++(.05mm,-#4) arc (0:-180:.425mm and .05mm);
- \fi
- \endscope
-}
-
-% #1 wing, #2 yshift, #3 angle, #4 length, #5 color
-\def\pingu@draw@wi@lightsaber@post#1#2#3#4#5{
- \scope[rotate around={#3:(\pingu@name-wing-#1)}]
- \csname if@pingu@x@lightsaber@glow@#1\endcsname
- \ifdim\csname pingu@x@lightsaber@ogf@#1\endcsname pt>\z@
- \pingu@layer{foreground}[]
- \pgfinterruptboundingbox
- \path[clip,/pingu/@invclip] (\pingu@name-wing-#1)++(-.275mm,#2-.1mm) -- ++(.1mm,#4) arc(180:0:.175mm and .25mm) -- ++(.1mm,-#4) arc (0:-180:.275mm and .065mm);
- \@for\i:={1,1.1,1.2,1.3,1.4}\do{
- \pingu@block[fill opacity=\csname pingu@x@lightsaber@ogf@#1\endcsname/\i]{#5} (\pingu@name-wing-#1) ++(.05mm,#2+#4/2) circle[radius=\i*#4];
- }
- \endpgfinterruptboundingbox
- \endpingu@layer
- \fi
- % fadings had a rotation angle bug
- \@for\i:={1,2}\do{
- \pingu@block[fill opacity=.125*\i/10]{#5} (\pingu@name-wing-#1)++(-\pingu@x@saberglow@w@half+\i*\i mm/440,#2) -- ++(.05mm,#4) arc(180:0:\pingu@x@saberglow@w@half-.05mm-\i*\i mm/440 and \pingu@one-\i mm/30) -- ++(.05mm,-#4) arc (0:-180:\pingu@x@saberglow@w@half-\i*\i mm/440 and .35mm);
- }
- \pingu@block{\csname pingu@color@lightsaber#1@glow@core\endcsname} (\pingu@name-wing-#1)++(-.275mm,#2-.1mm) -- ++(.1mm,#4) arc(180:0:.175mm and .25mm) -- ++(.1mm,-#4) arc (0:-180:.275mm and .065mm);
- \fi
- \endscope
-}
-
-% #1 wing
-\def\pingu@draw@wi@lightsaber#1{%
- \pingu@setup@wing{lightsaber}{#1}%
- \scope[rotate around={\@angle:([yshift=+\csname pingu@x@lightsaber@yshift@#1\endcsname]\pingu@name-wing-#1)},xscale=1.2]
- \pingu@draw@wi@lightsaber@pre{#1}{2.9mm+\csname pingu@x@lightsaber@yshift@#1\endcsname}{0}{\csname pingu@x@lightsaber@length@#1\endcsname}{\@col}
- \csname if@pingu@x@lightsaber@double@#1\endcsname
- \pingu@draw@wi@lightsaber@pre{#1}{2.65mm-\csname pingu@x@lightsaber@yshift@#1\endcsname}{180}{\csname pingu@x@lightsaber@length@b@#1\endcsname}{\csname pingu@color@lightsaber#1@color@b\endcsname}
- \fi
- \pingu@draw@wi@lightsaber@base{#1}
- % afterglow (whuile watching everglow :D)
- \pingu@draw@wi@lightsaber@post{#1}{2.9mm+\csname pingu@x@lightsaber@yshift@#1\endcsname}{0}{\csname pingu@x@lightsaber@length@#1\endcsname}{\@col}
- \csname if@pingu@x@lightsaber@double@#1\endcsname
- \pingu@draw@wi@lightsaber@post{#1}{2.65mm-\csname pingu@x@lightsaber@yshift@#1\endcsname}{180}{\csname pingu@x@lightsaber@length@b@#1\endcsname}{\csname pingu@color@lightsaber#1@color@b\endcsname}
- \fi
- \endscope
-}
-
-
-\newif\if@pingu@x@lightstaff@glow@left
-\newif\if@pingu@x@lightstaff@glow@right
-\pingu@create@wing@extra{lightstaff}{%
- light-staff \@lr/.code = {\pingu@set@extra{lightstaff\@lr}{true}\pingu@color{lightstaff\@lr}{##1}},
- light-staff \@lr/.default = pingu@green,
- light-staff \@lr\space length/.code =\expandafter\def\csname pingu@lightstaff@\@lr @length\endcsname{##1},
- light-staff \@lr\space glow length/.code =\expandafter\def\csname pingu@lightstaff@\@lr @glow@length\endcsname{##1},
- light-staff \@lr\space head/.code = \pingu@color{lightstaff\@lr}{##1},%
- light-staff \@lr\space staff/.code = \pingu@color{lightstaff@\@lr @staff}{##1},%
- light-staff \@lr\space core/.code = \pingu@color{lightstaff@\@lr @head@core}{##1},%
- light-staff \@lr\space core width/.code = \expandafter\def\csname pingu@lightstaff@\@lr @core@width\endcsname{##1},%
- light-staff \@lr\space glow/.is if = @pingu@x@lightstaff@glow@\@lr,%
- light-staff \@lr\space outer glow factor/.code = {\@namedef{pingu@x@lightstaff@ogf@\@lr}{##1}},%
-}{light-staff \@lr\space length=28mm,light-staff \@lr\space staff=pingu@bronze,light-staff \@lr\space head=pingu@green,light-staff \@lr\space core=pingu@white,light-staff \@lr\space glow=\ifpengu@setup@glows@ true\else false\fi,light-staff \@lr\space outer glow factor=.022,light-staff \@lr\space glow length=13mm,light-staff \@lr\space core width=.44mm}
-\def\pingu@draw@wi@lightstaff#1{%
- \pingu@setup@wing{lightstaff}{#1}%
-\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
- \pingu@block{\csname pingu@color@lightstaff@#1@staff\endcsname}(\pingu@name-wing-#1)++(\@sidesign*-.2mm,-11mm) -- ++(0,\csname pingu@lightstaff@#1@length\endcsname) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-lightstaff-#1-top) -- ++(0,-\csname pingu@lightstaff@#1@length\endcsname) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
- \pingu@draw@wi@lightstaff@pre{#1}{[yshift=-1.1mm]\pingu@name-lightstaff-#1-top}{\@col}
- \pingu@block{\csname pingu@color@lightstaff@#1@head@core\endcsname} ([yshift=-1.1mm]\pingu@name-lightstaff-#1-top) -- ++(-\csname pingu@lightstaff@#1@core@width\endcsname,1mm) -- ++(0,2mm) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname,1mm) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname,-1mm) -- ++(0,-2mm) -- cycle;
- \pingu@draw@wi@lightstaff@post{#1}{[yshift=-1.1mm]\pingu@name-lightstaff-#1-top}{\@col}
-\endscope
-}
-
-% #1 wing, #2 start, #3 color
-\def\pingu@draw@wi@lightstaff@pre#1#2#3{
-\csname if@pingu@x@lightstaff@glow@#1\endcsname
-\@for\i:={0,1,2,3,6,7,9,10,13}\do{
- \pingu@block[fill opacity=\ifnum\i>14 .225\else.1\fi*\i/20]{#3} (#2)++(0,-\i mm/15) -- ++(-\csname pingu@lightstaff@#1@core@width\endcsname-\i mm/30,1mm+\i mm/30) -- ++(0,2mm+\i mm/15) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname+\i mm/30,1mm+\i mm/30) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname+\i mm/30,-1mm-\i mm/30) -- ++(0,-2mm-\i mm/15) -- cycle;
- % -- ++(.05mm,#4) arc(180:0:\pingu@x@saberglow@w@half-.05mm-\i*\i mm/440 and \ifnum\i>14 .85mm\else\pingu@one\fi-\i mm/30) -- ++(.05mm,-#4) arc (0:-180:\pingu@x@saberglow@w@half-\i*\i mm/440 and .35mm);
-}
-\else % draw solid
- \pingu@block{#3} (#2) -- ++(-.55mm,1mm) -- ++(0,2mm) -- ++(.55mm,1mm) -- ++(.55mm,-1mm) -- ++(0,-2mm) -- cycle;
-\fi
-}
-
-\def\pingu@draw@wi@lightstaff@post#1#2#3{
-\csname if@pingu@x@lightstaff@glow@#1\endcsname
-\ifdim\csname pingu@x@lightstaff@ogf@#1\endcsname pt>\z@
-\pingu@layer{foreground}[]
-\pgfinterruptboundingbox
-\@for\i:={1,1.1,1.2,1.3,1.4}\do{
- \pingu@block[fill opacity=\csname pingu@x@lightstaff@ogf@#1\endcsname/\i]{#3} (#2)++(0,2mm) circle[radius=\i*\csname pingu@lightstaff@#1@glow@length\endcsname];
-}
-\endpgfinterruptboundingbox
-\pingu@block[opacity=.65]{\csname pingu@color@lightstaff@#1@head@core\endcsname} (#2)++(0,.5mm) -- ++(-.20mm,.75mm) -- ++(0,1.5mm) -- ++(.20mm,.75mm) -- ++(.20mm,-.75mm) -- ++(0,-1.5mm) -- cycle;
-\endpingu@layer
-\fi
-% fadings hat a rotation angle bug
-\@for\i:={1,2}\do{
- \pingu@block[fill opacity=.125*\i/10]{#3} (#2)++(0,-\i mm/15+2mm) -- ++(-\csname pingu@lightstaff@#1@core@width\endcsname-\i mm/30,1mm+\i mm/30) -- ++(0,2mm+\i mm/15) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname+\i mm/30,1mm+\i mm/30) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname+\i mm/30,-1mm-\i mm/30) -- ++(0,-2mm-\i mm/15) -- cycle;
-}
-\pingu@block{\csname pingu@color@lightstaff@#1@head@core\endcsname} (#2) -- ++(-\csname pingu@lightstaff@#1@core@width\endcsname,1mm) -- ++(0,2mm) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname,1mm) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname,-1mm) -- ++(0,-2mm) -- cycle;
-\fi
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-shirts.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-shirts.lib.tex
deleted file mode 100644
index ce337dd4b1..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-shirts.lib.tex
+++ /dev/null
@@ -1,63 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\newif\if@pingu@shirt@above
-\pingu@create@extra{shirt}{%
- shirt/.code = \pingu@set@extra{shirt}{true}\pingu@color{shirt}{#1},
- shirt/.default = pingu@bronze,
- shirt above/.is if = @pingu@shirt@above,
- shirt raise/.code = \def\pingu@shirt@raise{#1},
- shirt padding/.code = \def\pingu@shirt@padding{#1},
- shirt button top/.code = \pingu@color{shirt@button@top}{#1},
- shirt button middle/.code = \pingu@color{shirt@button@middle}{#1},
- shirt button bottom/.code = \pingu@color{shirt@button@bottom}{#1},
- shirt buttons/.style = {/pingu/shirt button top={#1}, /pingu/shirt button middle={#1}, /pingu/shirt button bottom={#1}},
- shirt button top shade/.code = \pingu@color{shirt@button@top@shade}{#1},
- shirt button middle shade/.code = \pingu@color{shirt@button@middle@shade}{#1},
- shirt button bottom shade/.code = \pingu@color{shirt@button@bottom@shade}{#1},
- shirt buttons shade/.style = {/pingu/shirt button top shade={#1}, /pingu/shirt button middle shade={#1}, /pingu/shirt button bottom shade={#1}},
- shirt without buttons/.forward to=/pingu/shirt no buttons,
- shirt no buttons/.style = {/pingu/shirt buttons=\@pingu@none, /pingu/shirt buttons shade=\@pingu@none},
-}{shirt buttons=pingu@black,shirt padding=0mm,shirt button top shade=\pingu@color@shirt@button@top!70!\pingu@color@shirt!70!white,shirt button middle shade=\pingu@color@shirt@button@middle!70!\pingu@color@shirt!70!white,shirt button bottom shade=\pingu@color@shirt@button@bottom!70!\pingu@color@shirt!70!white,shirt raise=2.25mm,shirt above=false}
-\def\pingu@draw@cloth@shirt@behind{}
-
-\def\pingu@draw@cloth@shirt@middle{\if@pingu@shirt@above\else\pingu@draw@cloth@shirt@main\fi}
-
-\def\pingu@draw@cloth@shirt@main{%
-\coordinate (\pingu@name-shirt-low) at ([yshift=\pingu@shirt@raise]\pingu@name-belly-center);
-\pingu@block{\pingu@color@shirt} [rounded corners=.131mm] ([xshift=.2mm,yshift=.18mm]\pingu@name-head-back-con-right) -- (\pingu@name-shirt-low) -- ([xshift=-.1mm,yshift=.24mm]\pingu@name-head-back-con-left) to[bend left=12] (\pingu@name-waist-left) to[bend left=3] ([xshift=\pingu@shirt@padding]\pingu@name-bottom-center-|\pingu@name-waist-left) to[bend left=10] ([yshift=-1.1\pingu@one]\pingu@name-bottom-center) to[bend left=10] ([xshift=-\pingu@shirt@padding]\pingu@name-bottom-center-|\pingu@name-waist-right) to[bend left=3] (\pingu@name-waist-right) to[bend left=12] (\pingu@name-head-back-con-right) -- cycle;
-
-\coordinate (\pingu@name-shirt-bt) at ([yshift=-\pingu@one]\pingu@name-shirt-low);
-\pingu@block{\pingu@color@shirt@button@top}(\pingu@name-shirt-bt) circle[radius=.4mm];
-\pingu@block{\pingu@color@shirt@button@middle}(\pingu@name-shirt-bt)++(0,-1.35mm)circle[radius=.4mm];
-\pingu@block{\pingu@color@shirt@button@bottom}(\pingu@name-shirt-bt)++(0,2*-1.35mm)circle[radius=.4mm];
-\pingu@block[even odd rule]{\pingu@color@shirt@button@top@shade}(\pingu@name-shirt-bt) circle[radius=.4mm] circle[radius=.465mm];
-\pingu@block[even odd rule]{\pingu@color@shirt@button@middle@shade}(\pingu@name-shirt-bt)++(0,-1.35mm)circle[radius=.4mm] circle[radius=.465mm];
-\pingu@block[even odd rule]{\pingu@color@shirt@button@bottom@shade}(\pingu@name-shirt-bt)++(0,2*-1.35mm)circle[radius=.4mm] circle[radius=.465mm];
-\@for\i:={0,90,180,270}\do{
- \pingu@block{\pingu@color@shirt@button@top@shade} (\pingu@name-shirt-bt)++(\i:.
- 25mm) circle[radius=.065mm];
- \pingu@block{\pingu@color@shirt@button@middle@shade} (\pingu@name-shirt-bt)++(0,-1.35mm)++(\i:.25mm) circle[radius=.065mm];
- \pingu@block{\pingu@color@shirt@button@bottom@shade} (\pingu@name-shirt-bt)++(0,2*-1.35mm)++(\i:.25mm) circle[radius=.065mm];
-}}
-
-% TODO: if flags to draw parts
-\def\pingu@draw@cloth@shirt{\if@pingu@shirt@above\pingu@draw@cloth@shirt@main\fi}
-
-\pingu@create@extra{secondshirt}{%
- second shirt/.code = \pingu@set@extra{secondshirt}{true}\pingu@color{secondshirt}{#1},
- second shirt raise/.code = \def\pingu@secondshirt@raise{#1},
- second shirt neck/.code = \pingu@color{secondshirt@neck}{#1},
- second shirt/.default = purple,
-}{second shirt raise=3.35mm,second shirt neck=\pingu@color@secondshirt!32!pingu@white}
-\def\pingu@draw@cloth@secondshirt@behind{}
-
-\def\pingu@draw@cloth@secondshirt@middle{%
-\coordinate (\pingu@name-secondshirt-low) at ([yshift=\pingu@secondshirt@raise]\pingu@name-belly-center);
-\pingu@block{\pingu@color@secondshirt} [rounded corners=.131mm] ([xshift=.2mm,yshift=.05mm]\pingu@name-head-back-con-right) -- (\pingu@name-secondshirt-low) -- ([xshift=-.16mm,yshift=.09mm]\pingu@name-head-back-con-left) to[bend left=12] (\pingu@name-waist-left) to[bend left=3] ([xshift=-.22mm]\pingu@name-bottom-center-|\pingu@name-waist-left) to[bend left=10] ([yshift=-1\pingu@one]\pingu@name-bottom-center) to[bend left=10] ([xshift=.22mm]\pingu@name-bottom-center-|\pingu@name-waist-right) to[bend left=3] (\pingu@name-waist-right) to[bend left=12] (\pingu@name-head-back-con-right) -- cycle;
-\pingu@draw{\pingu@color@secondshirt@neck} [rounded corners=.131mm] ([xshift=.025mm,yshift=-.09mm]\pingu@name-head-back-con-right) -- ([xshift=.2mm,yshift=.05mm]\pingu@name-head-back-con-right) -- (\pingu@name-secondshirt-low) -- ([xshift=-.19mm,yshift=.09mm]\pingu@name-head-back-con-left) -- ([xshift=-.02mm,yshift=-.02mm]\pingu@name-head-back-con-left);
-}
-
-% TODO: if flags to draw parts
-\def\pingu@draw@cloth@secondshirt{%
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-signs.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-signs.lib.tex
deleted file mode 100644
index f1a42a0556..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-signs.lib.tex
+++ /dev/null
@@ -1,53 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@wing@extra{signpost}{%
- signpost \@lr/.forward to = /pingu/sign post \@lr,
- sign post \@lr/.code = {\pingu@set@extra{signpost\@lr}{true}\@namedef{pingu@signpost@\@lr}{##1}},
- sign post \@lr/.default = {},
- signpost \@lr\space color/.forward to = /pingu/sign post \@lr\space color,
- sign post \@lr\space color/.code = \pingu@color{signpost\@lr}{##1},
- signpost \@lr\space fontcolor/.forward to = /pingu/sign post \@lr\space font color,
- sign post \@lr\space font color/.code = \pingu@color{signpost\@lr @font}{##1},
-}{sign post \@lr\space color=brown!70!black, sign post \@lr\space font color=white!90!brown}
-\def\pingu@draw@wi@signpost#1{%
- \pingu@setup@wing{signpost}{#1}%
- \def\@rot{\if@pingu@wing@item@side@left@-5\else+5\fi}%
-\scope[rotate around={\@angle+\@rot:(\pingu@name-wing-#1)}]
- \pingu@block[thick]{\@col}(\pingu@name-wing-#1)++(\@sidesign*-.225mm,-2mm) -- ++(0,15mm) arc(180:0:\@sidesign*.45mm and .375mm) -- ++(0,-15mm) arc(360:180:\@sidesign*.45mm and .375mm) -- cycle;
- \path (\pingu@name-wing-#1)++(\@sidesign*.225mm,13mm) node[fill=\@col,rounded corners=2\p@,minimum width=14mm,minimum height=8mm,align=center,rotate=\@angle+\@rot,text=\csname pingu@color@signpost#1@font\endcsname] {\csname pingu@signpost@#1\endcsname};
-\endscope
-}
-
-\pingu@create@extra{banner}{%
- banner/.code = \pingu@set@extra{banner}{true}\@namedef{pingu@banner}{#1},
- banner/.default = Bannertext,
- banner band/.code = \pingu@color{banner@band}{#1},
- banner text color/.code = \pingu@color{banner@text@color}{#1},
- banner sticks color/.style={/pingu/banner stick left color=#1,/pingu/banner stick right color=#1},
- banner stick left color/.code = \pingu@color{banner@stick@left}{#1},
- banner stick right color/.code = \pingu@color{banner@stick@right}{#1},
- banner sticks length/.style={/pingu/banner stick left length=#1,/pingu/banner stick right length=#1},
- banner stick left length/.code = \@namedef{pingu@banner@stick@left@l}{#1},
- banner stick right length/.code = \@namedef{pingu@banner@stick@right@l}{#1},
- banner raise/.code = \@namedef{pingu@banner@raise}{#1},
- banner height/.code = \@namedef{pingu@banner@height}{#1},
- banner font/.code = \@namedef{pingu@banner@font}{#1},
- banner bent/.code = \@namedef{pingu@banner@bent}{#1}
-}{banner band=pingu@white!91!pingu@black,banner text color=pingu@black,banner sticks color=pingu@bronze,banner stick left length=20mm, banner stick right length=20mm,banner bent=30,banner raise=-1mm,banner height=4mm,banner font=\bfseries}
-
-\usetikzlibrary{decorations.text}
-\def\pingu@draw@ea@banner{%
-\pingu@setup@wing{staff}{left}% we do not need the staff color, but we will use it
-\scope[rotate around={\@angle:(\pingu@name-wing-left)}]
- \pingu@block{\pingu@color@banner@stick@left}(\pingu@name-wing-left)++(\@sidesign*-.2mm,-7mm) -- ++(0,\pingu@banner@stick@left@l) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-s-left) -- ++(0,-\pingu@banner@stick@left@l) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
- \path (\pingu@name-s-left)++(.5mm,\pingu@banner@height) coordinate (\pingu@name-s-left-top) ++(0,-2*\pingu@banner@height) coordinate (\pingu@name-s-left-bot);
-\endscope
-\pingu@setup@wing{staff}{right}% we do not need the staff color, but we will use it
-\scope[rotate around={\@angle:(\pingu@name-wing-right)}]
- \pingu@block{\pingu@color@banner@stick@right}(\pingu@name-wing-right)++(\@sidesign*-.2mm,-7mm) -- ++(0,\pingu@banner@stick@right@l) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-s-right) -- ++(0,-\pingu@banner@stick@right@l) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
- \path (\pingu@name-s-right)++(-.5mm,\pingu@banner@height) coordinate (\pingu@name-s-right-top) ++(0,-2*\pingu@banner@height) coordinate (\pingu@name-s-right-bot);
-\endscope
-\pingu@block[rounded corners=.3mm]{\pingu@color@banner@band} (\pingu@name-s-left-top) to[bend right=\pingu@banner@bent] (\pingu@name-s-right-top) -- (\pingu@name-s-right-bot) to[bend left=\pingu@banner@bent] (\pingu@name-s-left-bot) -- cycle;
-\path[postaction={decorate},decoration={text color=\pingu@color@banner@text@color,text along path, raise=\pingu@banner@raise, text={|\pingu@banner@font|\pingu@banner},text align={center,left indent=1mm,right indent=1mm}}] (\pingu@name-s-right) to[bend left=\pingu@banner@bent+3] (\pingu@name-s-left);
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-sport.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-sport.lib.tex
deleted file mode 100644
index 257f8685da..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-sport.lib.tex
+++ /dev/null
@@ -1,79 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@extra{medal}{%
- medal/.code = {\pingu@set@extra{medal}{true}\pingu@color{medal}{#1}},
- medal/.default = pingu@yellow,%
- gold medal/.style = {medal, medal text=#1}, gold medal/.default={1},
- silver medal/.style = {medal=pingu@silver, medal text=#1}, silver medal/.default={2},
- bronze medal/.style = {medal=pingu@bronze, medal text=#1}, bronze medal/.default={3},
- medal band/.code = \pingu@color{medal@band}{#1},%
- medal shade/.code = \pingu@color{medal@shade}{#1},%
- medal shade width/.code = \def\pingu@medal@shade@w{#1},%
- medal text/.code = \def\pingu@x@medal@text{#1},%
- medal text style/.style = {\pingu@color@medal!65!pingu@white},
-}{medal band=pingu@red,medal text={},medal shade={\pingu@color@medal!65!pingu@white},medal shade width=.75\p@}
-
-\def\pingu@draw@eb@medal{%
-\coordinate (\pingu@name-medal-center) at ([yshift=1.25mm]\pingu@name-belly-center);
-\pingu@block{\pingu@color@medal@band} [rounded corners=.15mm] (\pingu@name-head-back-con-right) -- (\pingu@name-medal-center) -- (\pingu@name-head-back-con-left) to[bend left=11] ++(-1.35mm,-.5mm) -- ([yshift=.7mm]\pingu@name-medal-center) -- ([xshift=1.35mm,yshift=-.5mm]\pingu@name-head-back-con-right) to[bend left=11] (\pingu@name-head-back-con-right) -- cycle;
-\pingu@block{\pingu@color@medal} (\pingu@name-medal-center) circle [radius=2.35mm];
-\pingu@draw[line width=\pingu@medal@shade@w]{\pingu@color@medal@shade} (\pingu@name-medal-center) circle [radius=2.35mm];
-\node[/pingu/@text,/pingu/medal text style] at (\pingu@name-medal-center) {\pingu@x@medal@text};
-}
-\newif\if@pingu@x@headband@knot@
-\newif\if@pingu@x@headband@bands@
-\pingu@create@extra{headband}{%
- headband/.forward to = /pingu/head band,
- head-band/.forward to = /pingu/head band,
- head band/.code = \pingu@set@extra{headband}{true}\pingu@color{headband}{#1},
- head band/.default = pingu@red,
- headband bend/.forward to = /pingu/head band bend,
- head-band bend/.forward to = /pingu/head band bend,
- head band bend/.code = \def\pingu@x@headband@bend{#1},
- headband angle/.forward to = /pingu/head band angle,
- head-band angle/.forward to = /pingu/head band angle,
- head band angle/.code = \def\pingu@x@headband@angle{#1},
- headband upper angle/.forward to = /pingu/head band upper angle,
- head-band upper angle/.forward to = /pingu/head band upper angle,
- head band upper angle/.code = \def\pingu@x@headband@upangle{#1},
- % knot
- headband knot/.forward to = /pingu/head band knot,
- head-band knot/.forward to = /pingu/head band knot,
- head band knot/.is if = @pingu@x@headband@knot@,
- headband knot color/.forward to = /pingu/head band knot color,
- head-band knot color/.forward to = /pingu/head band knot color,
- head band knot color/.code = \pingu@color{headband@knot}{#1},
- headband knot a color/.forward to = /pingu/head band knot a color,
- head-band knot a color/.forward to = /pingu/head band knot a color,
- head band knot a color/.code = \pingu@color{headband@knot@a}{#1},
- headband knot b color/.forward to = /pingu/head band knot b color,
- head-band knot b color/.forward to = /pingu/head band knot b color,
- head band knot b color/.code = \pingu@color{headband@knot@b}{#1},
- headband bands/.forward to = /pingu/head band bands,
- head-band bands/.forward to = /pingu/head band bands,
- head band bands/.is if = @pingu@x@headband@bands@,
- headband bands a color/.forward to = /pingu/head band bands a color,
- head-band bands a color/.forward to = /pingu/head band bands a color,
- head band bands a color/.code = \pingu@color{headband@bands@a}{#1},
- headband bands b color/.forward to = /pingu/head band bands b color,
- head-band bands b color/.forward to = /pingu/head band bands b color,
- head band bands b color/.code = \pingu@color{headband@bands@b}{#1},
-}{head band bend=9, head band angle=16,head band upper angle=49, head band knot color=\pingu@color@headband!78!black,head band knot a color=\pingu@color@headband@knot!90!black,head band knot b color=\pingu@color@headband@knot@a,head band bands,head band bands a color=\pingu@color@headband!78!black,head band bands b color=\pingu@color@headband}
-
-\def\pingu@draw@ea@headband@wh{1.25mm}
-\def\pingu@draw@ea@headband{%
- \path (\pingu@name-head-center)+(\pingu@x@headband@upangle-\pingu@x@headband@angle:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-head-band-lower);
- \path (\pingu@name-head-center)+(\pingu@x@headband@upangle:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-head-band-upper);
- \if@pingu@x@headband@bands@
- \pingu@block{\pingu@color@headband@bands@a} (\pingu@name-head-band-lower) to[out=-50,in=75] ++(2.75mm,-4mm) to[bend right] ++(.6mm,0) to[out=80,in=-5] (\pingu@name-head-band-upper) -- cycle;
- \pingu@block{\pingu@color@headband@bands@b} (\pingu@name-head-band-lower) to[out=-80,in=80] ++(1.75mm,-3.35mm) to[bend right] ++(.45mm,0) to[out=80,in=-8] (\pingu@name-head-band-upper) -- cycle;
- \fi
- \pingu@block{\pingu@color@headband} (\pingu@name-head-center)+(\pingu@x@headband@upangle:\pingu@w@half{} and \pingu@head@h@half) to[bend left=\pingu@x@headband@bend] coordinate[pos=.5] (\pingu@name-headband-center-a) +(180-\pingu@x@headband@upangle:\pingu@w@half{} and \pingu@head@h@half) arc(180-\pingu@x@headband@upangle:180-\pingu@x@headband@upangle+\pingu@x@headband@angle:\pingu@w@half{} and \pingu@head@h@half) to[bend right=\pingu@x@headband@bend] coordinate[pos=.5] (\pingu@name-headband-center-b) (\pingu@name-head-band-lower) arc(\pingu@x@headband@upangle-\pingu@x@headband@angle:\pingu@x@headband@upangle:\pingu@w@half{} and \pingu@head@h@half) -- cycle;
- \path (\pingu@name-headband-center-a) -- (\pingu@name-headband-center-b) coordinate[pos=.5] (\pingu@name-headband-center);
- \if@pingu@x@headband@knot@
- \pingu@block[rounded corners=.25mm]{\pingu@color@headband@knot@a} (\pingu@name-headband-center-a)++(-.15mm,-.6mm) to[out=155,in=-5] ++(-3mm,\pingu@one) to[bend right=15] ([xshift=-3mm,yshift=-.2mm]\pingu@name-headband-center-b) to[in=-155,out=5] ++(.285cm,.8mm) -- cycle;
- \pingu@block[rounded corners=.25mm]{\pingu@color@headband@knot@b} (\pingu@name-headband-center-a)++(.15mm,-.6mm) to[out=25,in=-175] ++(3mm,\pingu@one) to[bend left=15] ([xshift=3mm,yshift=-.2mm]\pingu@name-headband-center-b) to[in=-25,out=175] ++(-.285cm,.8mm) -- cycle;
- \pingu@block[rounded corners=.25mm]{\pingu@color@headband@knot} (\pingu@name-headband-center-a)++(-\pingu@draw@ea@headband@wh,.12mm) to[bend right=9] ++(2*\pingu@draw@ea@headband@wh,0) -- ([xshift=\pingu@draw@ea@headband@wh,yshift=-.12mm]\pingu@name-headband-center-b) to[bend right=9] ++(-2*\pingu@draw@ea@headband@wh, 0) -- cycle;
- \fi
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus-technology.lib.tex b/graphics/pgf/contrib/tikzpingus/tikzpingus-technology.lib.tex
deleted file mode 100644
index fbb2f48419..0000000000
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus-technology.lib.tex
+++ /dev/null
@@ -1,126 +0,0 @@
-% Florian Sihler, 2022
-% Licensed under GNU General Public License version 3
-% https://opensource.org/licenses/gpl-3.0.html
-\pingu@create@extra{vrheadset}{%
- vr-headset/.code = \pingu@set@extra{vrheadset}{true}\pingu@color{vrheadset}{#1},
- vr-headset/.default = pingu@black!92!gray,
- vr-headset band/.code = \pingu@color{vrheadset@band}{#1},
- vr-headset band top/.code = \pingu@color{vrheadset@band@top}{#1},
- vr-headset text/.code = \def\pingu@x@vrheadset@text{#1},
- vr-headset text color/.code = \pingu@color{vrheadset@text@color}{#1},
- vr-headset hair/.style = {/pingu/hair 2=!hide,/pingu/hair 3=!hide,/pingu/hair 4=!hide}
-}{vr-headset band=\pingu@color@vrheadset!92!gray,vr-headset text={\textit{\textsf{VR\thinspace\texttrademark}}},vr-headset text color=pingu@white,vr-headset band top=\pingu@color@vrheadset!96!gray}
-
-\def\pingu@draw@ea@vrheadset{%
-\pingu@layer{middle}[]
- \pingu@block{\pingu@color@vrheadset} [rounded corners=1.25mm]([yshift=3.45mm]\pingu@name-waist-right|-\pingu@name-eye-right) to[bend left=2] coordinate[pos=.5] (@) ([yshift=3.45mm]\pingu@name-waist-left|-\pingu@name-eye-left) to[bend left=3] coordinate (\pingu@name-vrh-ol) ++(0,-6.25mm) to[bend left=13] ([yshift=-1mm]\pingu@name-head-center) to[bend left=13] ([yshift=3.45mm-6.25mm]\pingu@name-waist-right|-\pingu@name-eye-right) -- cycle;
- \path (\pingu@name-vrh-ol)++(-2.25mm,2mm) node[text=\pingu@color@vrheadset@text@color,scale=.25] {\pingu@x@vrheadset@text};
-\endpingu@layer
-\if@pingu@do@back@\else
- % top band
- \pingu@block[rounded corners=1pt]{\pingu@color@vrheadset@band@top} (@)++(-1.05mm+.15mm,0) to[bend right=2] ([xshift=-.85mm+.3mm,yshift=.3mm]\pingu@name-head-top) to[bend left=2] ++(1.6mm,0) to[bend left=2] ([xshift=1.25mm+.15mm]@);
-\fi
- % we draw a band for the background
-\pingu@layer{background}[]
-\pingu@block[line cap=round]{\pingu@color@vrheadset@band} ([yshift=1mm]\pingu@name-waist-right|-\pingu@name-eye-right) to[bend left=3] coordinate[pos=.5] (@b) ([yshift=1mm]\pingu@name-waist-left|-\pingu@name-eye-left) arc(90:-90:.25mm and 1mm) to[bend right=3] ([yshift=-1mm]\pingu@name-waist-right|-\pingu@name-eye-right) arc (270:90:.25mm and 1mm);
-\pingu@block[rounded corners=1pt]{\pingu@color@vrheadset@band@top} (@b)++(-1.25mm+.2mm,-1.25mm) to[bend right=2] ([xshift=-.85mm+.3mm,yshift=.3mm]\pingu@name-head-top) to[bend right=2] ++(1.6mm,0) to[bend right=2] ([xshift=1.15mm+.2mm,yshift=-1.25mm]@b) -- cycle;
-\endpingu@layer
-}
-\pingu@create@extra{headphone}{%
- headphones/.forward to = /pingu/headphone,
- headphone/.code = \pingu@set@extra{headphone}{true}\pingu@color{headphone}{#1},
- headphone/.default = pingu@blue!80!pingu@black,
- headphone left/.code = \pingu@color{headphone@left}{#1},
- headphone right/.code = \pingu@color{headphone@right}{#1},
- headphones outer/.forward to = /pingu/headphone outer,
- headphone outer/.style = {/pingu/headphone left outer=#1,/pingu/headphone right outer=#1}, headphone outer/.default = pingu@black,
- headphone left outer/.code = \pingu@color{headphone@left@p}{#1}, headphone left outer/.default =pingu@black,
- headphone right outer/.code = \pingu@color{headphone@right@p}{#1}, headphone right outer/.default=pingu@black,
- headphones inner/.forward to = /pingu/headphone inner,
- headphone inner/.style = {/pingu/headphone left inner=#1,/pingu/headphone right inner=#1}, headphone inner/.default = pingu@black,
- headphone left inner/.code = \pingu@color{headphone@left@i}{#1}, headphone left inner/.default = pingu@black,
- headphone right inner/.code = \pingu@color{headphone@right@i}{#1}, headphone right inner/.default=pingu@black,
-}{headphone left=\pingu@color@headphone!65!pingu@black,headphone right=\pingu@color@headphone@left,headphone left outer=\@pingu@none,
-,headphone right outer=\@pingu@none,,headphone left inner=\@pingu@none,
-,headphone right inner=\@pingu@none}
-
-\def\pingu@draw@ea@headphone{%
-\if@pingu@do@back@ \pingu@layer{background}[] \fi
- \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@right@p} ([xshift=-\pingu@one,yshift=3.22mm]\pingu@name-wings-side-right|-\pingu@name-eye-right) arc (93:273:.565mm and 2.11mm) -- ++(.8mm,.075mm) -- ++(0,4.075mm);
- \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@right@i} ([xshift=\pingu@one-.366mm,yshift=3.22mm]\pingu@name-wings-side-right|-\pingu@name-eye-right) arc (87:-93:.565mm and 2.14mm) -- ++(-.8mm,.075mm) -- ++(0,4.075mm) -- cycle;
- \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@right} ([xshift=-\pingu@one+.2mm,yshift=3.22mm]\pingu@name-wings-side-right|-\pingu@name-eye-right) arc (92:272:.565mm and 2.1mm) -- ++(.8mm,-.05mm) arc (270:450:.425mm and 2.1mm) -- cycle;
- \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@left@p} ([xshift=\pingu@one,yshift=3.22mm]\pingu@name-wings-side-left|-\pingu@name-eye-left) arc (87:-93:.565mm and 2.11mm) -- ++(-.8mm,.075mm) -- ++(0,4.075mm) -- cycle;
- \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@left@i} ([xshift=-\pingu@one+.366mm,yshift=3.22mm]\pingu@name-wings-side-left|-\pingu@name-eye-left) arc (93:273:.565mm and 2.14mm) -- ++(.8mm,.075mm) -- ++(0,4.075mm);
- \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@left} ([xshift=\pingu@one-.2mm,yshift=3.22mm]\pingu@name-wings-side-left|-\pingu@name-eye-left) arc (88:-92:.565mm and 2.1mm) -- ++(-.8mm,-.05mm) arc (270:90:.425mm and 2.1mm) -- cycle;
- \pingu@block{\pingu@color@headphone} ([xshift=-\pingu@one,yshift=\pingu@one]\pingu@name-wings-side-right|-\pingu@name-eye-right)
- arc(180:0:{\pingu@one+\pingu@w@half} and {\pingu@head@h@half-.5\pingu@one}) arc(0:-180:.65mm and .33mm)
- arc(0:180:{\pingu@one+\pingu@w@half-2*.65mm} and {\pingu@head@h@half+.33\pingu@one-2*.6mm-1.1\pingu@one})
- arc(0:-180:.65mm and .33mm) -- cycle;
-\if@pingu@do@back@ \endpingu@layer \fi
-}
-
-\pingu@create@wing@extra{vrcontroller}{%
-vr-controller \@lr/.code = {\pingu@set@extra{vrcontroller\@lr}{true}\pingu@color{vrcontroller\@lr}{##1}},
-vr-controller \@lr/.default = pingu@green,
-vr-controller \@lr\space handle/.code = \pingu@color{vrcontroller\@lr @handle}{##1},%
-vr-controller \@lr\space second/.code = \pingu@color{vrcontroller\@lr @second}{##1},%
-vr-controller \@lr\space second shade/.code = \pingu@color{vrcontroller\@lr @second@shade}{##1}%
-}{vr-controller \@lr\space handle={\csname pingu@color@vrcontroller\@lr\endcsname!76!pingu@black},vr-controller \@lr\space second={\csname pingu@color@vrcontroller\@lr\endcsname!56!pingu@black},vr-controller \@lr\space second shade={\csname pingu@color@vrcontroller\@lr\endcsname!96!pingu@black}}
-
-% #1 wing
-\def\pingu@draw@wi@vrcontroller#1{%
- \pingu@setup@wing{vrcontroller}{#1}%
- \pingu@block[rotate around={\@angle:(\pingu@name-wing-#1)}]{\csname pingu@color@vrcontroller#1@handle\endcsname}(\pingu@name-wing-#1)++(.5mm,5mm) to[bend right=1] ++(-.25mm,-5.5mm) arc (0:-180:.325mm and .1mm) to[bend right=1] ++(-.7mm,5.5mm) -- cycle coordinate[pos=.5] (@);
- \def\@y{2.06mm} \def\@@y{.78mm}
- \pingu@block[rotate around={\@angle:(\pingu@name-wing-#1)},even odd rule]{\csname pingu@color@vrcontroller#1@second\endcsname}([yshift=.1mm]@) arc (90:450:{\@y} and 1mm) coordinate[pos=.25] (@r) coordinate[pos=.75] (@l) ([yshift=-.6mm]@) arc (90:0:{\@@y} and .25mm) arc (0:-180:{\@@y} and .35mm) arc (180:90:{\@@y} and .25mm);
- % \pingu@draw[rotate around={\@angle:(\pingu@name-wing-#1)}]{\csname pingu@color@vrcontroller#1@second@shade\endcsname} ([yshift=-.9mm]@)++(180:{\@@y} and .3mm) arc (180:0:{\@@y} and .3mm);
- \def\@toruslow{(@l) to[bend left=7] ++(-.2mm,-.875mm) to[bend left=15] coordinate[pos=.95] (@c) ++(-2*\@y+.4mm,0) [sharp corners] to[bend left=7] ++(-.2mm,.875mm) to[bend right=30] cycle}
- \pingu@block[rounded corners=.1mm,rotate around={\@angle:(\pingu@name-wing-#1)}]{\csname pingu@color@vrcontroller#1@second\endcsname} \@toruslow;
- \scope[rounded corners=.1mm,rotate around={\@angle:(\pingu@name-wing-#1)}]
- \clip \@toruslow;
- \pingu@block[opacity=.1]{black} (@l) to[bend left=14] (@c) -- ++(0,-2mm) -| cycle;
- \endscope
-}
-
-
-\pingu@create@wing@extra{laptop}{%
- laptop \@lr/.code = {\pingu@set@extra{laptop\@lr}{true}\pingu@color{laptop\@lr}{##1}},
- laptop \@lr/.default = gray!80!pingu@white,
- laptop \@lr\space bracket/.code = \pingu@color{laptop\@lr @bracket}{##1},
- laptop \@lr\space lower/.code = \pingu@color{laptop\@lr @lower}{##1},
- laptop \@lr\space key/.code = \pingu@color{laptop\@lr @key}{##1},
- laptop \@lr\space display/.code = \pingu@color{laptop\@lr @display}{##1},
- laptop \@lr\space content/.code = \@namedef{pingu@x@laptop\@lr @content}{##1}, % tikz content
- laptop \@lr\space mid/.code = \@namedef{pingu@x@laptop\@lr @mid}{##1}, % tikz content
-}{laptop \@lr\space bracket=pingu@black!80!\csname pingu@color@laptop\@lr\endcsname,laptop \@lr\space lower=\csname pingu@color@laptop\@lr\endcsname!95!pingu@black,laptop \@lr\space key=\csname pingu@color@laptop\@lr\endcsname!92!pingu@white,laptop \@lr\space display=\csname pingu@color@laptop\@lr\endcsname!32!pingu@white,laptop \@lr\space content={},laptop \@lr\space mid={}}
-
-% #1 wing
-\def\pingu@draw@wi@laptop#1{%
- \pingu@setup@wing{laptop}{#1}%
- \scope[rotate around={\@angle+5:(\pingu@name-wing-#1)},shift={(\pingu@name-wing-#1)}]
- \pingu@block[rounded corners=1pt]{\csname pingu@color@laptop#1@lower\endcsname}(-6.9mm,0) -- ++(-.1mm,-4.75mm) -- ++(14mm,0) -- ++(-.1mm,4.75mm) -- cycle;
- \pingu@block[rounded corners=1pt]{\@col}(-6.9mm,0) -- ++(0,7mm) -- ++(13.8mm,0) -- ++(0,-7mm) -- cycle;
- \pingu@block[rounded corners=.125mm]{\csname pingu@color@laptop#1@bracket\endcsname}(-6.4mm,.125mm) -- ++(0,-.25mm) -- ++(12.8mm,0) -- ++(0,.25mm) -- cycle;
- % keys
- \foreach[count=\y from 0,evaluate=\y as \extpadding using 0.005*\y,evaluate=\y as \rextpadding using 0.05*\y] \row in {
- % manually account for padding
- {0,1,1,1,1,1,1,1,1,1,1,1,1,1},
- {.63,1.5,1,1,1,1,1,1,1,1,1,1,1},
- {0,1,1,1,1,1,1,1,1,1,1,1,1,1},
- {0,1,1,1,1,1,4.62,1,1,1,1},
- } {
- \def\lengthincr{-\rextpadding mm}
- \foreach[count=\i from 0,evaluate=\len as \l using 0.85*\len] \len in \row {
- \ifnum\i=0 \else % first one is silent:
- \pingu@block[rounded corners=.125mm]{\csname pingu@color@laptop#1@key\endcsname}(\lengthincr-6.4mm,-\y mm-.5mm) rectangle ++(\l mm,-.75mm) node[midway,centered,text=\@col,scale=.3] {\textbullet};
- \fi
- \xdef\lengthincr{\the\dimexpr\lengthincr+\l mm+.13mm+\extpadding mm}
- }
- }
- % display, we modify the lower shift to adjust height offset
- \pingu@block[rounded corners=1pt]{\csname pingu@color@laptop#1@display\endcsname}(-6.7mm,.25mm+.05mm) rectangle ++(13.4mm,6.45mm) node[midway,centered,rotate=\@angle+5,text width=13.2mm,align=center,minimum height=6.2mm] {\csname pingu@x@laptop#1@mid\endcsname};
- \scope[shift={(-6.7mm,.25mm+.05mm)}]
- \csname pingu@x@laptop#1@content\endcsname
- \endscope
- \endscope
-} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikzpingus/tikzpingus.sty b/graphics/pgf/contrib/tikzpingus/tikzpingus.sty
index 903d95a98f..49d8108223 100644
--- a/graphics/pgf/contrib/tikzpingus/tikzpingus.sty
+++ b/graphics/pgf/contrib/tikzpingus/tikzpingus.sty
@@ -2,13 +2,13 @@
% Licensed under GNU General Public License version 3
% https://opensource.org/licenses/gpl-3.0.html
\def\tikzpingus@filename{tikzpingus}
-\ProvidesPackage{\tikzpingus@filename}[2023/09/17 version v1.1 Penguins in TikZ]
+\ProvidesPackage{\tikzpingus@filename}[2024/11/27 version v1.2 Penguins in TikZ]
\newif\ifpengu@setup@glows@
\DeclareOption{glows}{\pengu@setup@glows@true}\DeclareOption{noglows}{\pengu@setup@glows@false}
\newif\ifpengu@setup@manual@layers@
\DeclareOption{manual-layers}{\pengu@setup@manual@layers@true}\DeclareOption{nomanual-layers}{\pengu@setup@manual@layers@false}
-\newif\ifpengu@setup@bare@
-\DeclareOption{bare}{\pengu@setup@bare@true}\DeclareOption{nobare}{\pengu@setup@bare@false}
+% \newif\ifpengu@setup@bare@
+% \DeclareOption{bare}{\pengu@setup@bare@true}\DeclareOption{nobare}{\pengu@setup@bare@false}
\ProcessOptions*
\RequirePackage{etoolbox}
@@ -364,26 +364,23 @@
\ifpengu@setup@manual@layers@\pgfsetlayers{background,main,middle,foreground}\fi\begingroup
\@pingu@do@back@false
\pgfqkeys{/pingu}{defaults, #1}%
+\let\pingu@path@lowerpingu\pingu@default@path@lowerpingu\relax
+\let\pingu@path@upperpingu\pingu@default@path@upperpingu\relax
\ifdim\pingu@side@h@half<10.33mm \PackageWarning{\tikzpingus@filename}{Penguins with a height below 10.33mm may have unwanted artifacts.}\fi
\scope[/pingu/@pingu,/pingu/@pingu@main]
\scope[/pingu/@body]
\@pingu@drawer@bodytype@
\pingu@body@app
\endscope
-
-\path (\pingu@name-head-center)++(0,-.05mm-\pingu@outer@off) coordinate (\pingu@name-bill);
-
+\path(\pingu@name-head-center)++(0,-.05mm-\pingu@outer@off) coordinate (\pingu@name-bill);
\scope[shift=(\pingu@name-belly-center),/pingu/@belly]
\clip[use path=\pingu@whitepingu]; \pingu@belly@raw
\endscope
-\coordinate (\pingu@name-head) at (\pingu@w@half,.7375cm);
-
+\coordinate(\pingu@name-head) at (\pingu@w@half,.7375cm);
\scope[/pingu/@eyes]
\@pingu@drawer@lefteye@ \@pingu@drawer@righteye@
\endscope
-
\pingu@layer{background}[]\pingu@draw@clothing@behind\endpingu@layer
-
\pingu@draw@clothing@middle
\scope[/pingu/@extras,/pingu/@extras@below]
\pingu@draw@extras@below
@@ -444,7 +441,7 @@
% #region lower-pingu
% Note: to be used in clippies
-\def\pingu@path@lowerpingu{(0,\pingu@outer@off)
+\def\pingu@default@path@lowerpingu{(0,\pingu@outer@off)
% left side
to[bend right=\pingu@bend] ++(0,-\pingu@side@h@half-\pingu@outer@off)
% feety stuff
@@ -453,8 +450,9 @@ arc (208:270:\pingu@foot@inner@w{} and \pingu@foot@inner@h) arc (270:360:\pingu@
% right side
to[bend right=\pingu@bend] ++(0,\pingu@side@h@half+\pingu@outer@off)
arc(0:180:\pingu@w@half{} and \pingu@head@h@half) -- cycle}% arc clip to secure wings
-\def\pingu@path@upperpingu{(\pingu@name-head-center) ellipse [x radius=\pingu@w@half, y radius=\pingu@head@h@half]}
-
+\def\pingu@default@path@upperpingu{(\pingu@name-head-center) ellipse [x radius=\pingu@w@half, y radius=\pingu@head@h@half]}
+\let\pingu@path@lowerpingu\pingu@default@path@lowerpingu
+\let\pingu@path@upperpingu\pingu@default@path@upperpingu
% #endregion
% #endregion
@@ -601,6 +599,21 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
% #endregion
% #region legacy
\pingu@bodytype@add{legacy}{%
+\gdef\pingu@path@lowerpingu{%
+(0,\pingu@outer@off)
+% left side
+to[bend right=1.25*\pingu@bend] ++(0,-.95\pingu@side@h@half-\pingu@outer@off+.65\pingu@one)%
+% feety stuff
+to[out=270,in=270]
+++(2*\pingu@w@half,0)
+% right side
+to[bend right=1.25*\pingu@bend] ++(0,.95\pingu@side@h@half+\pingu@outer@off-.65\pingu@one)
+arc(0:180:\pingu@w@half{} and \pingu@head@h@half) -- cycle
+}
+\gdef\pingu@path@upperpingu{(\pingu@name-head-center)
+++(0,\pingu@head@h@half)
+arc(90:450:\pingu@w@half{} and \pingu@head@h@half);
+}
\pingu@block[save path=\pingu@lowerpingu]{\pingu@color@body@main} (0,\pingu@outer@off)
% left side
to[bend right=1.25*\pingu@bend] coordinate[pos=.77] (\pingu@name-waist-right) ++(0,-.95\pingu@side@h@half-\pingu@outer@off+.65\pingu@one) coordinate (@b) % for bottom clip
@@ -753,6 +766,9 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
\def\@pingu@wingangle@items@none@{90}
\def\@pingu@wingdown@none@{90}
+% to hide it with the glow
+\def\pingu@wing@compensator#1{#1}
+
% #region wings-normal
\@pingu@wings@s{normal}{%
\coordinate (\pingu@name-wing-left-start) at ([yshift=-6.5mm]\pingu@name-wings-side-left);
@@ -778,8 +794,8 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
\path[/pingu/@invclip] \pingu@path@lowerpingu;
\endpgfinterruptboundingbox
\pingu@block[rotate around={-39:(\pingu@name-wing-left-start)}]{\pingu@color@left@wing} (\pingu@name-wing-left-start) ellipse [x radius=2.2mm, y radius=9.35mm] +(90:.22cm and .935cm) coordinate (\pingu@name-wing-left-tip) +(150:.22cm and .935cm) coordinate (\pingu@name-wing-left-cap-up) +(-3:.22cm and .935cm) coordinate (\pingu@name-wing-left-cap-down) +(90:.175cm and .75cm) coordinate (\pingu@name-wing-left);
- \pingu@block{\pingu@color@left@wing} (\pingu@name-wing-left-start)++(.03mm,4.6mm) to[out=-80,in=220] (\pingu@name-wing-left-cap-up) -- (\pingu@name-wing-left-start) -- cycle;
- \pingu@block{\pingu@color@left@wing} (\pingu@name-wing-left-start)++(.085mm,-4.4mm) to[out=80,in=-131] (\pingu@name-wing-left-cap-down) -- (\pingu@name-wing-left-start) -- cycle;
+ \pingu@wing@compensator{\pingu@block{\pingu@color@left@wing} (\pingu@name-wing-left-start)++(.03mm,4.6mm) to[out=-80,in=220] (\pingu@name-wing-left-cap-up) -- (\pingu@name-wing-left-start) -- cycle;
+ \pingu@block{\pingu@color@left@wing} (\pingu@name-wing-left-start)++(.085mm,-4.4mm) to[out=80,in=-131] (\pingu@name-wing-left-cap-down) -- (\pingu@name-wing-left-start) -- cycle;}
\endscope}{%
\coordinate (\pingu@name-wing-right-start) at ([yshift=-5.85mm]\pingu@name-wings-side-right);
\scope[xshift=\p@] % shift to avoid rounding errors in pdf viewers
@@ -787,8 +803,8 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
\path[/pingu/@invclip] \pingu@path@lowerpingu;
\endpgfinterruptboundingbox
\pingu@block[rotate around={39:(\pingu@name-wing-right-start)}]{\pingu@color@right@wing} (\pingu@name-wing-right-start) ellipse [x radius=.22cm, y radius=.935cm] +(90:.22cm and .935cm) coordinate (\pingu@name-wing-right-tip) +(30:.22cm and .935cm) coordinate (\pingu@name-wing-right-cap-up) +(177:.22cm and .935cm) coordinate (\pingu@name-wing-right-cap-down) +(90:.175cm and .775cm) coordinate (\pingu@name-wing-right);
- \pingu@block{\pingu@color@right@wing} (\pingu@name-wing-right-start)++(-.03mm,4.6mm) to[out=-100,in=-45] (\pingu@name-wing-right-cap-up) -- (\pingu@name-wing-right-start) -- cycle;
- \pingu@block{\pingu@color@right@wing} (\pingu@name-wing-right-start)++(-.1mm,-4.4mm) to[out=100,in=-50] (\pingu@name-wing-right-cap-down) -- (\pingu@name-wing-right-start) -- cycle;
+ \pingu@wing@compensator{\pingu@block{\pingu@color@right@wing} (\pingu@name-wing-right-start)++(-.03mm,4.6mm) to[out=-100,in=-45] (\pingu@name-wing-right-cap-up) -- (\pingu@name-wing-right-start) -- cycle;
+ \pingu@block{\pingu@color@right@wing} (\pingu@name-wing-right-start)++(-.1mm,-4.4mm) to[out=100,in=-50] (\pingu@name-wing-right-cap-down) -- (\pingu@name-wing-right-start) -- cycle;}
\endscope}{\pingu@wi@above}{-10}{-110}
% #endregion
% #region wings-raise
@@ -845,8 +861,8 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
\path[/pingu/@invclip] \pingu@path@lowerpingu;
\endpgfinterruptboundingbox
\pingu@block[rotate around={-128:(\pingu@name-wing-left-start)}]{\pingu@color@left@wing} (\pingu@name-wing-left-start) ellipse [x radius=.235cm, y radius=.925cm] +(90:.235cm and .935cm) coordinate (\pingu@name-wing-left-tip) +(175:.235cm and .935cm) coordinate (\pingu@name-wing-left-cap-up) +(22:.235cm and .935cm) coordinate (\pingu@name-wing-left-cap-down) +(90:.175cm and .775cm) coordinate (\pingu@name-wing-left);
-\pingu@block{\pingu@color@left@wing} (\pingu@name-wing-left-start)++(.03mm,4.6mm) to[out=-80,in=140] (\pingu@name-wing-left-cap-up) -- (\pingu@name-wing-left-start) -- cycle;
-\pingu@block{\pingu@color@left@wing} (\pingu@name-wing-left-start)++(.085mm,-4.4mm) to[out=82,in=155] (\pingu@name-wing-left-cap-down) -- (\pingu@name-wing-left-start) -- cycle;
+\pingu@wing@compensator{\pingu@block{\pingu@color@left@wing} (\pingu@name-wing-left-start)++(.03mm,4.6mm) to[out=-80,in=140] (\pingu@name-wing-left-cap-up) -- (\pingu@name-wing-left-start) -- cycle;
+\pingu@block{\pingu@color@left@wing} (\pingu@name-wing-left-start)++(.085mm,-4.4mm) to[out=82,in=155] (\pingu@name-wing-left-cap-down) -- (\pingu@name-wing-left-start) -- cycle;}
\endscope}{%
\coordinate (\pingu@name-wing-right-start) at ([yshift=-6.25mm]\pingu@name-wings-side-right);
\scope[xshift=\p@] % shift to avoid rounding errors in pdf viewers
@@ -854,8 +870,8 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
\path[/pingu/@invclip] \pingu@path@lowerpingu;
\endpgfinterruptboundingbox
\pingu@block[rotate around={128:(\pingu@name-wing-right-start)}]{\pingu@color@right@wing} (\pingu@name-wing-right-start) ellipse [x radius=.235cm, y radius=.935cm] +(90:.235cm and .935cm) coordinate (\pingu@name-wing-right-tip) +(5:.235cm and .935cm) coordinate (\pingu@name-wing-right-cap-up) +(160:.235cm and .935cm) coordinate (\pingu@name-wing-right-cap-down) +(90:.175cm and .775cm) coordinate (\pingu@name-wing-right);
-\pingu@block{\pingu@color@right@wing} (\pingu@name-wing-right-start)++(-.03mm,4.6mm) to[out=-100,in=40] (\pingu@name-wing-right-cap-up) -- (\pingu@name-wing-right-start) -- cycle;
-\pingu@block{\pingu@color@right@wing} (\pingu@name-wing-right-start)++(-.085mm,-4.4mm) to[out=92,in=20] (\pingu@name-wing-right-cap-down) -- (\pingu@name-wing-right-start) -- cycle;
+\pingu@wing@compensator{\pingu@block{\pingu@color@right@wing} (\pingu@name-wing-right-start)++(-.03mm,4.6mm) to[out=-100,in=40] (\pingu@name-wing-right-cap-up) -- (\pingu@name-wing-right-start) -- cycle;
+\pingu@block{\pingu@color@right@wing} (\pingu@name-wing-right-start)++(-.085mm,-4.4mm) to[out=92,in=20] (\pingu@name-wing-right-cap-down) -- (\pingu@name-wing-right-start) -- cycle;}
\endscope}{\pingu@wi@above}{-30}{-62}
\let\@pingu@wings@s\relax
% #endregion
@@ -1075,6 +1091,7 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
\pingu@xif@eb{devilwings}{devilwings}%
\pingu@xif@eb{glow}{glow}%
\pingu@xif@eb{belt}{belt}%
+ \pingu@xif@eb{santabeard}{santabeard}%
\pingu@xif@eb{tie}{tie}%
\pingu@xif@eb{pants}{pants}%
\pingu@xif@eb{medal}{medal}%
@@ -1161,9 +1178,11 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
\pingu@layer{background}[]
\@for\i:={\pingu@x@extra@glow@steps}\do{
\scope[/pingu/@block/.append style={draw=\pingu@color@glow,line width=\pingu@x@extra@glow@width@func},/pingu/@draw/.append style={draw=\pingu@color@glow,line width=\pingu@x@extra@glow@width@func},opacity=\pingu@x@extra@glow@func,transparency group]
- \pingu@draw{\pingu@color@glow} \pingu@path@lowerpingu;
+ \pingu@draw[sharp corners]{\pingu@color@glow} \pingu@path@lowerpingu;
+ \pingu@draw[sharp corners]{\pingu@color@glow} \pingu@path@upperpingu;
% todo: disable re set of coordinates
- % only draw, if not ofset
+ % only draw, if not offset
+ \tikzset{rounded corners/.style={}}\def\pingu@wing@compensator##1{}%
\csname @pingu@wingitem@\@pingu@select@leftwing@ @\endcsname\@pingu@drawer@leftwing@\fi
\csname @pingu@wingitem@\@pingu@select@rightwing@ @\endcsname\@pingu@drawer@rightwing@\fi
\endscope
@@ -1185,8 +1204,11 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
\pingu@xif@ea{glassesround}{glassesround}%
\pingu@xif@ea{devilhorns}{devilhorns}%
\pingu@xif@ea{headband}{headband}%
+ \pingu@xif@ea{vrheadset}{vrheadset}%
\pingu@xif@ea{strawhat}{strawhat}%
+ \pingu@xif@ea{graduate}{graduate}%
\pingu@xif@ea{hat}{hat}%
+ \pingu@xif@ea{spacehelmet}{spacehelmet}%
\pingu@xif@ea{mitra}{mitra}%
\pingu@xif@ea{witchhat}{witchhat}%
\pingu@xif@ea{constructionhelmet}{constructionhelmet}%
@@ -1198,13 +1220,11 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
\pingu@xif@ea{princesscrown}{princesscrown}%
\pingu@xif@ea{rook}{rook}%
\pingu@xif@ea{halo}{halo}%
- \pingu@xif@ea{vrheadset}{vrheadset}%
\pingu@xif@ea{headphone}{headphone}%
\pingu@xif@ea{sheriffstar}{sheriffstar}%
\pingu@xif@ea{santahat}{santahat}%
\pingu@xif@ea{woolhat}{woolhat}%
\pingu@xif@ea{deerhat}{deerhat}%
- \pingu@xif@ea{santabeard}{santabeard}%
\pingu@xif@ea{banner}{banner}%
\pingu@xif@ea{bee}{bee}%
}
@@ -1381,69 +1401,2345 @@ coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
}
% #endregion
-\def\pingu@@dummy@lib#1#2{%
- \pgfqkeys{/pingu}{#1/.code={\PackageError{\tikzpingus@filename}{To use '#1' you need to load the '#2' library via '\string\pinguloadlibrary{#2}'}}}%
- \expandafter\def\csname pingu@@lib@#1@\endcsname{#2}%
-}
-\def\pingu@@dummy@selector#1#2#3{%
- \expandafter\csname pingu@#3@add\endcsname{#1}{\PackageError{\tikzpingus@filename}{To use '#1' with '#3' you need to load the '#2' library via '\string\pinguloadlibrary{#2}'}}%
- \expandafter\def\csname pingu@@lib@#1@#3@\endcsname{#2}%
-}
-\def\pingu@dummy@lib#1#2{\edef\tmp@list{#2}\@for\@current:=\tmp@list\do{\expandafter\pingu@@dummy@lib\expandafter{\@current}{#1}}\xappto\pingu@defaultlibs{,{#1}/{#2}}\xappto\pingu@@defaultlibs{,#1}}%
-% library | selector | keys
-\def\pingu@dummy@selector#1#2#3{\edef\tmp@list{#3}\@for\@current:=\tmp@list\do{\expandafter\pingu@@dummy@selector\expandafter{\@current}{#1}{#2}}}
-\def\pingu@defaultlibs{}\def\pingu@@defaultlibs{}
-\providecommand\pingulibpathprefix{}
-\def\pingu@load@library#1{%
-% store common catcodes
-\expandafter\edef\csname pingu@lib@#1@atcode\endcsname{\the\catcode`\@}%
-\expandafter\edef\csname pingu@lib@#1@barcode\endcsname{\the\catcode`\|}%
-\expandafter\edef\csname pingu@lib@#1@dollarcode\endcsname{\the\catcode`\$}%
-\catcode`\@=11 \catcode`\|=12 \catcode`\$=3\relax
-\def\pingu@tmp{\pingulibpathprefix tikzpingus-#1.lib.tex}\relax
-\InputIfFileExists{\pingu@tmp}{}{\PackageError{\tikzpingus@filename}{There is no '#1' library (searched: '\pingu@tmp')}}
-% restore catcodes
-\catcode`\@=\csname pingu@lib@#1@atcode\endcsname
-\catcode`\|=\csname pingu@lib@#1@barcode\endcsname
-\catcode`\$=\csname pingu@lib@#1@dollarcode\endcsname
-}
-\def\pingu@loadlibrary#1{%
-\ifcsname pingu@lib@#1@loaded\endcsname\else% do not load again
- \expandafter\let\csname pingu@lib@#1@loaded\endcsname=\@empty
- \pingu@load@library{#1}\relax
+
+% #region bee-lib
+\pingu@create@extra{bee}{%
+ bee/.code = {\pingu@set@extra{bee}{true}\pingu@color{bee}{#1}},
+ bee/.default = pingu@yellow!60!pingu@white,%
+ bee body/.code = \pingu@color{bee@body}{#1},
+ bee eyes/.code = \pingu@color{bee@eyes}{#1},
+ bee wings/.code = \pingu@color{bee@wings}{#1},
+ bee mouth/.code = \pingu@color{bee@mouth}{#1},
+ bee blush/.code = \pingu@color{bee@blush}{#1},
+ bee position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@bee@angle{#1}\def\pingu@x@bee@xshift{#2}\def\pingu@x@bee@yshift{#3}\def\pingu@x@bee@scale{#4}},
+}{bee body=pingu@black!82!gray,bee wings=pingu@blue!8!pingu@white,bee mouth=\pingu@color@bee@body,bee eyes=\pingu@color@bee@body,bee blush=pingu@red!21!\pingu@color@bee,bee position={-27.5:(8mm,15mm){.875}}}
+
+\def\pingu@bee@x@lbody{ (left) to[out=270,in=150] (0,-.725) to[out=30,in=270] (right)}
+
+\def\pingu@draw@ea@bee{%
+\scope[very path/.append style={line join=round},rotate around={\pingu@x@bee@angle:(\pingu@name-head)},shift={(\pingu@name-head)},shift={(\pingu@x@bee@xshift,\pingu@x@bee@yshift)},scale=\pingu@x@bee@scale]
+% wings
+\coordinate (wl) at(20:2.55mm);
+\coordinate (wr) at(160:2.55mm);
+\pingu@draw[fill=\pingu@color@bee@wings!80!white,rotate around=-32:(wl)]{\pingu@color@bee@body} (wl) ellipse [x radius=6.15mm, y radius=2.75mm];
+\pingu@draw[fill=\pingu@color@bee@wings!80!white,rotate around=32:(wr)]{\pingu@color@bee@body} (wr) ellipse [x radius=6.15mm, y radius=2.75mm];
+\pingu@draw[fill=\pingu@color@bee@wings,rotate around=19:(wl)]{\pingu@color@bee@body} (wl) ellipse [x radius=6.55mm, y radius=3.125mm];
+\pingu@draw[fill=\pingu@color@bee@wings,rotate around=-19:(wr)]{\pingu@color@bee@body} (wr) ellipse [x radius=6.55mm, y radius=3.125mm];
+% body
+\path (-.375,0) coordinate (left) -- (.375,0) coordinate (right);
+% TODO: block draw?
+\pingu@block[draw=\pingu@color@bee@body]{\pingu@color@bee@body} \pingu@bee@x@lbody;
+\scope\clip\pingu@bee@x@lbody;
+\foreach \angl in {30,1} {
+\pingu@block{\pingu@color@bee} (-\angl:.75) to[bend left=14] (180+\angl:.75) -- ++(0,-1.75mm)
+ to[bend right=14] (-\angl-14:.75) -- cycle;
+}\endscope
+% left and right arm
+\foreach\m/\s/\k in {right/-2.45/95,left/-.75/80} {
+\scope[shift=(\m),yshift=\s,rotate around=\k:(\m),scale=.166]
+\pingu@block{\pingu@color@bee@body} (-.965,0) arc(270:90:.29) -- ++(1.233,0) arc (90:-90:.29) -- cycle;
+\endscope}
+% sting
+\pingu@draw[line cap=round,thick]{\pingu@color@bee@body} (0,-.725) -- ++(0,-.035);
+% head
+\pingu@draw[fill=\pingu@color@bee,rounded corners=1.5pt]{\pingu@color@bee@body} (.85mm,-.55mm) to[bend right=30,looseness=.9] ([xshift=1.45mm,yshift=1.35mm]right) arc(0:180:{(.75cm+2*1.45mm)/2} and {(.75cm+2*1.45mm)/2.05}) to[bend right=30,looseness=.9] (-.85mm,-.55mm) -- cycle;
+% eyes [intersect with left and right]
+\pingu@block{\pingu@color@bee@eyes} (left|-0,2.265mm)++(.6mm,0) coordinate (el) circle[radius=.6mm];
+\coordinate (ell) at ([yshift=-.8mm]el);
+\pingu@block[rotate around=3:(ell)]{\pingu@color@bee@blush} ([yshift=-.8mm]el) ellipse[x radius=.412mm, y radius=.165mm];
+\pingu@block{\pingu@color@bee@eyes} (right|-0,2.265mm)++(-.6mm,0) coordinate (er) circle[radius=.6mm];
+\coordinate (err) at ([yshift=-.8mm]er);
+\pingu@block[rotate around=-1:(err)]{\pingu@color@bee@blush} ([yshift=-.8mm]er) ellipse[x radius=.4mm, y radius=.155mm];
+% mouth
+\scope[yshift=1mm]
+\pingu@draw[semithick,line cap=round]{\pingu@color@bee@mouth} (-.6mm,0) arc (180:360:.6mm and .415mm);
+% antenna
+\pingu@draw[line cap=round]{\pingu@color@bee@body} (123:4mm) to[out=110,in=-41] ++(-1mm,3mm) coordinate (@);
+\pingu@block[rotate around=-41:(@)]{\pingu@color@bee@body} ([xshift=-.1mm,yshift=-.185mm]@) ellipse[x radius=.55mm,y radius=.35mm];
+\pingu@draw[line cap=round]{\pingu@color@bee@body} (57:4mm) to[out=70,in=180+41] ++(1mm,3mm) coordinate (@);
+\pingu@block[rotate around=41:(@)]{\pingu@color@bee@body} ([xshift=-.1mm,yshift=-.2mm]@) ellipse[x radius=.55mm,y radius=.35mm];
+\endscope
+\endscope
+}
+
+\pingu@create@wing@extra{flower}{%
+ flower \@lr/.code = {\pingu@set@extra{flower\@lr}{true}\pingu@color{flower\@lr}{##1}},
+ flower \@lr/.default = pingu@purple!80!pingu@yellow,
+ flower \@lr\space center/.code = \pingu@color{flower@\@lr @center}{##1},
+ flower \@lr\space center size/.code = \expandafter\def\csname pingu@flower@\@lr @center@size\endcsname{##1},
+ flower \@lr\space stem/.code = \pingu@color{flower@\@lr @stem}{##1},
+ flower \@lr\space stem length/.code = \expandafter\def\csname pingu@flower@\@lr @stem@length\endcsname{##1},
+ flower \@lr\space stem width/.code = \expandafter\def\csname pingu@flower@\@lr @stem@width\endcsname{##1},
+ flower \@lr\space stem tilt/.code = \expandafter\def\csname pingu@flower@\@lr @stem@tilt\endcsname{##1},
+ flower \@lr\space size/.code = \expandafter\def\csname pingu@flower@\@lr @size\endcsname{##1},
+ flower \@lr\space petal count/.code = \expandafter\def\csname pingu@flower@\@lr @petals\endcsname{##1},
+ flower \@lr\space petal width/.code = \expandafter\def\csname pingu@flower@\@lr @petals@width\endcsname{##1},
+ flower \@lr\space petal start angle/.code = \expandafter\def\csname pingu@flower@\@lr @petals@start@angle\endcsname{##1},
+ flower \@lr\space petal peak/.code = \expandafter\def\csname pingu@flower@\@lr @petals@peak\endcsname{##1},
+}{flower \@lr\space size=.3mm, flower \@lr\space center=brown!50!pingu@yellow, flower \@lr\space center size=.65mm, flower \@lr\space stem=green!90!pingu@yellow!70!pingu@black, flower \@lr\space stem length=6mm,flower \@lr\space stem width=.15mm,flower \@lr\space stem tilt=-.5mm, flower \@lr\space petal count=5, flower \@lr\space petal start angle=27, flower \@lr\space petal width=4.5pt, flower \@lr\space petal peak=2}
+
+% #1 wing
+\def\pingu@draw@wi@flower#1{%
+\pingu@setup@wing{flower}{#1}%
+ \pingu@draw[line width=\csname pingu@flower@#1@stem@width\endcsname]{\csname pingu@color@flower@#1@stem\endcsname} ([yshift=-.5mm]\pingu@name-wing-#1) to[out=80,in=-20] ++(\csname pingu@flower@#1@stem@tilt\endcsname,\csname pingu@flower@#1@stem@length\endcsname) coordinate (\pingu@name-flower-center-#1) coordinate (@);
+\pgfmathsetmacro\AnglePerPetal{360/\csname pingu@flower@#1@petals\endcsname}
+\edef\@currwidth{\csname pingu@flower@#1@petals@width\endcsname}%
+\foreach \i in {1,...,\csname pingu@flower@#1@petals\endcsname} {
+ \pgfmathsetmacro{\@currrot}{\i*\AnglePerPetal+\csname pingu@flower@#1@petals@start@angle\endcsname}%
+ \scope[rotate around={\@currrot:(@)}]
+\pingu@block{\@col} (@) to[bend right=4] ++(\@currwidth,.5*\csname pingu@flower@#1@size\endcsname) arc(-9:189:\@currwidth\space and \@currwidth*\csname pingu@flower@#1@petals@peak\endcsname) to[bend right=4] ++(\@currwidth,-.5*\csname pingu@flower@#1@size\endcsname) -- cycle;
+\endscope
+\pingu@block{\csname pingu@color@flower@#1@center\endcsname} (\pingu@name-flower-center-#1) circle[radius=\csname pingu@flower@#1@center@size\endcsname];
+}
+}
+% #endregion
+% #endregion
+
+% #region christmas-lib
+\pingu@create@extra{santahat}{%
+ santa hat/.code = \pingu@set@extra{santahat}{true}\pingu@color{santahat}{#1}\pgfqkeys{/pingu}{hair=\@pingu@none},
+ santa hat/.default = pingu@red!87!pingu@black,
+ santa hat second/.code = \pingu@color{santahat@second}{#1},
+ santa hat bobble/.code = \pingu@color{santahat@bobble}{#1}
+}{santa hat second={pingu@white!97!\pingu@color@santahat},santa hat bobble={\pingu@color@santahat@second}}
+\def\pingu@draw@ea@santahat{%
+\path (\pingu@name-head-center)+(152:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-santa-right);
+\path (\pingu@name-head-center)+(5:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-santa-left);
+\pingu@layer{middle}[]
+\pingu@block{\pingu@color@santahat@second} (\pingu@name-santa-right) to[out=48,in=132] (\pingu@name-santa-left) to[out=30,in=-45,looseness=1.325] ++(0,3.2mm)
+to[out=135,in=47,looseness=1.025] coordinate[pos=.915] (\pingu@name-santa-ur) coordinate[pos=.055] (\pingu@name-santa-ul) ([yshift=2mm]\pingu@name-santa-right) to[out=240,in=140] cycle;
+\endpingu@layer
+\pingu@layer{background}[]
+\pingu@block{\pingu@color@santahat} (\pingu@name-santa-ur) arc(145:-25:11.85mm and 14.915mm)
+ to[bend right=7] coordinate[pos=.5] (\pingu@name-santa-lc) ++(-1.11mm,.375mm) to[bend right=11] (\pingu@name-santa-ul) to[bend right=15] cycle;
+\pingu@block{\pingu@color@santahat@bobble} (\pingu@name-santa-lc) circle[radius=2.625mm];
+\endpingu@layer
+}
+\pingu@create@extra{santabeard}{%
+ santa beard/.code = \pingu@set@extra{santabeard}{true}\pingu@color{santabeard}{#1},
+ santa beard/.default = pingu@white!96!pingu@red!98!pingu@black!92!gray,
+ santa beard string/.code = \pingu@color{santabeard@string}{#1}
+}{santa beard string=\pingu@color@body@main!85!pingu@black}
+\def\pingu@draw@eb@santabeard{%
+% \coordinate (\pingu@name-santa-beard-center) at ([yshift=1.25mm]\pingu@name-belly-center);
+\pingu@block{\pingu@color@santabeard@string} ([xshift=-.35mm,yshift=.575mm]\pingu@name-head-back-con-right) to[bend right=28,edge node={foreach[count=\i] \l in {0.03,0.085,...,0.992} {coordinate[pos=\l-rand*.015,yshift=-.85pt] (\pingu@name-santa-beard-\i)}}]
+([yshift=.575mm,xshift=.35mm]\pingu@name-head-back-con-left) arc(20:110:.05mm and .15mm) to[bend left=26] ([yshift=.575mm+.15mm,xshift=-.35mm]\pingu@name-head-back-con-right) to[bend right] cycle;
+\ifx\pingu@color@santabeard\@pingu@none\else% to allow for random
+\xdef\@pmaxY{18}\xdef\@pmaxYI{17}%
+\foreach[evaluate=\j as \maxj using int(\@pmaxY-\j),evaluate=\j as \widthred using \j/23pt] \j in {0,...,\@pmaxYI} {
+\foreach[remember=\i as \li (initially 0)] \i in {1,...,\maxj} {
+ \pgfmathsetmacro\@ptmp{94+rand*2.6}
+ \pingu@block{\pingu@color@santabeard!\@ptmp!pingu@black} (\pingu@name-santa-beard-\i) circle [radius=1.85pt-\widthred pt+rand*.35pt];
+ \ifnum\li>0 % make middle of last
+ \path (\pingu@name-santa-beard-\li) -- (\pingu@name-santa-beard-\i) coordinate[pos=.5,yshift=-1.1pt,xshift=.133pt] (\pingu@name-santa-beard-\li); % smoll shift
+ \fi
+}}\fi
+}
+
+\pingu@create@extra{woolhat}{%
+ wool hat/.code = \pingu@set@extra{woolhat}{true}\pingu@color{woolhat}{#1}\pgfqkeys{/pingu}{hair=\@pingu@none},
+ wool hat/.default = pingu@blue!57!pingu@black,
+ wool hat second/.code = \pingu@color{woolhat@second}{#1},
+ wool hat bobble/.code = \pingu@color{woolhat@bobble}{#1}
+}{wool hat second={\pingu@color@woolhat!55!pingu@white},wool hat bobble={\pingu@color@woolhat@second}}
+\def\pingu@draw@ea@woolhat{%
+\path ([yshift=.5mm,xshift=.165mm]\pingu@name-head-center)+(165:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-wool-right);
+\path ([yshift=.5mm,xshift=-.045mm]\pingu@name-head-center)+(4:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-wool-left);
+\pingu@layer{middle}[]
+\pingu@block{\pingu@color@woolhat@second} (\pingu@name-wool-right) to[out=37,in=170] (\pingu@name-wool-left) to[out=50,in=-55] ++(0,1.52mm) coordinate (\pingu@name-wool-left-up)
+to[out=167,in=38] coordinate[pos=.915] (\pingu@name-wool-ur) coordinate[pos=.055] (\pingu@name-wool-ul) ([yshift=1.5mm]\pingu@name-wool-right) coordinate (\pingu@name-wool-right-up) to[out=240,in=140] cycle;
+\endpingu@layer
+\path (\pingu@name-wool-left-up) -- (\pingu@name-wool-right-up) coordinate[pos=.455,yshift=9.75mm] (@mid);
+\pingu@block{\pingu@color@woolhat} (\pingu@name-wool-right-up) to[out=71,in=203] [rounded corners=2pt] (@mid) to[out=-34,in=100] [sharp corners] (\pingu@name-wool-left-up) to[in=37,out=172] cycle;
+\pingu@layer{background}[]
+\pingu@block{\pingu@color@woolhat@bobble} (@mid) circle [radius=1.25mm];
+\endpingu@layer
+}
+
+
+\pingu@create@extra{deerhat}{%
+ deer hat/.code = \pingu@set@extra{deerhat}{true}\pingu@color{deerhat}{#1}\pgfqkeys{/pingu}{hair=\@pingu@none},
+ deer hat/.default = pingu@bronze!57!pingu@black,
+ deer hat b/.code = \pingu@color{deerhat@b}{#1},
+ deer hat band/.code = \pingu@color{deerhat@band}{#1},
+}{deer hat band={\pingu@color@deerhat!85!pingu@black},deer hat b=\pingu@color@deerhat}
+\pgfmathsetmacro\pingu@deerhat@baseang@l{90-360*(1-\pinguanglehl)}
+\pgfmathsetmacro\pingu@deerhat@baseang@r{90-360*(1-\pinguanglehr)}
+\def\pingu@deerhat@baseoff{47}
+\def\pingu@deerhat@yshift{.15mm}
+\def\pingu@deerhat@linewidth{1.32mm}
+\def\pingu@deerhat@headoff@l{22}
+\def\pingu@deerhat@headoff@r{19}
+\def\pingu@draw@ea@deerhat{%
+\path ([yshift=-\pingu@deerhat@yshift]\pingu@name-head-left) arc (\pingu@deerhat@baseang@l:\pingu@deerhat@baseang@l-\pingu@deerhat@baseoff:\pingu@w@half{} and \pingu@head@h@half) coordinate[yshift=.05mm] (@target);
+\pingu@draw[line width=.7mm]{\pingu@color@deerhat@band} ([xshift=-.8mm]@target) arc (\pingu@deerhat@baseang@l-\pingu@deerhat@baseoff:360+\pingu@deerhat@baseang@r+\pingu@deerhat@baseoff:\pingu@w@half{}-.8mm and \pingu@head@h@half);
+
+\path ([yshift=-\pingu@deerhat@yshift]\pingu@name-head-top) arc (90:90-\pingu@deerhat@headoff@l:\pingu@w@half{} and \pingu@head@h@half) coordinate (@left);
+\path ([yshift=-\pingu@deerhat@yshift]\pingu@name-head-top) arc (90:90+\pingu@deerhat@headoff@r:\pingu@w@half{} and \pingu@head@h@half) coordinate (@right);
+
+\pgfonlayer{background}
+\pingu@draw[line width=\pingu@deerhat@linewidth,rounded corners=2pt,line cap=round]{\pingu@color@deerhat} (@left) to[bend right=4] ++(.85mm,1.5mm) coordinate (@a) -- ++(3.15mm,.5mm) coordinate (@b) -- ++(4.65mm,4.35mm) coordinate[pos=.5] (@c) to[bend right=10] ++(-.75mm,2.55mm);
+\pingu@draw[line width=\pingu@deerhat@linewidth,rounded corners=2pt,line cap=round]{\pingu@color@deerhat} ([xshift=-.135mm,yshift=-.425mm]@a) to[bend left=3] ++(1mm,3.9mm) ([xshift=-.4mm,yshift=-.05mm]@b) to[bend right=2] ++(3.75mm,.1mm) (@c) to[bend left=12] ++(-1mm,3.5mm);
+\pingu@draw[line width=\pingu@deerhat@linewidth,rounded corners=2pt,line cap=round]{\pingu@color@deerhat@b} (@right) to[bend left=4] ++(-.85mm,1.5mm) coordinate (@a) -- ++(-3.15mm,.5mm) coordinate (@b) -- ++(-4.65mm,4.35mm) coordinate[pos=.5] (@c) to[bend left=10] ++(.75mm,2.55mm);
+\pingu@draw[line width=\pingu@deerhat@linewidth,rounded corners=2pt,line cap=round]{\pingu@color@deerhat@b} ([yshift=-.425mm,xshift=.135mm]@a) to[bend right=3] ++(-1mm,3.9mm) ([xshift=.4mm,yshift=-.05mm]@b) to[bend right=2] ++(-3.75mm,.1mm) (@c) to[bend right=12] ++(1mm,3.5mm);
+\endpgfonlayer
+}
+
+\pingu@create@wing@extra{present}{%
+ present \@lr/.code = {\pingu@set@extra{present\@lr}{true}\pingu@color{present\@lr}{##1}},
+ present \@lr/.default = pingu@red!50!pingu@black!60!red,
+ present \@lr\space width/.code = \@namedef{pingu@present@\@lr @width}{##1},
+ present \@lr\space height/.code = \@namedef{pingu@present@\@lr @height}{##1},
+ present \@lr\space ribbon/.code = \pingu@color{present\@lr @ribbon}{##1},%
+ present \@lr\space band/.code = \pingu@color{present\@lr @band}{##1},%
+ present \@lr\space band width/.code = \@namedef{pingu@present@\@lr @band@width}{##1},
+ present \@lr\space xshift/.code = \@namedef{pingu@present@\@lr @xshift}{##1},
+ present \@lr\space yshift/.code = \@namedef{pingu@present@\@lr @yshift}{##1},
+ present \@lr\space band second height/.code = \@namedef{pingu@present@\@lr @band@second@height}{##1},
+ present \@lr\space band second yshift/.code = \@namedef{pingu@present@\@lr @band@second@yshift}{##1},
+ present \@lr\space lid/.code = \pingu@color{present\@lr @lid}{##1},%
+ present \@lr\space lid height/.code = \@namedef{pingu@present@\@lr @lid@height}{##1},
+ present \@lr\space lid overhang/.code = \@namedef{pingu@present@\@lr @lid@overhang}{##1},
+ present \@lr\space lid yshift/.code = \@namedef{pingu@present@\@lr @lid@yshift}{##1},
+ present \@lr\space lid band/.code = \pingu@color{present\@lr @lid@band}{##1},%
+}{present \@lr\space band=pingu@green!70!pingu@black!90!pingu@white,present \@lr\space width=7.75mm,present \@lr\space band width=1.75mm,present \@lr\space height=7mm,present \@lr\space yshift=-0.25*(\csname pingu@present@\@lr @height\endcsname),present \@lr\space band second height=\csname pingu@present@\@lr @band@width\endcsname, present \@lr\space band second yshift=0.5*(\csname pingu@present@\@lr @height\endcsname),present \@lr\space xshift=-0.25*(\csname pingu@present@\@lr @width\endcsname),present \@lr\space lid=\csname pingu@color@present\@lr\endcsname!92!pingu@black,present \@lr\space lid height=1.33mm,present \@lr\space lid overhang=.125mm,present \@lr\space lid yshift=0,present \@lr\space lid band=\csname pingu@color@present\@lr @band\endcsname!98!pingu@black,present \@lr\space ribbon=\csname pingu@color@present\@lr @band\endcsname!97!pingu@black}
+
+% TODO: more ribbon color control
+% #1 wing
+\def\pingu@draw@wi@present#1{%
+ \pingu@setup@wing{present}{#1}%
+ \scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
+ \pingu@block[rounded corners=2pt]{\@col}(\pingu@name-wing-#1)++(-{0.5*(\csname pingu@present@#1@width\endcsname)+\csname pingu@present@#1@xshift\endcsname},{\csname pingu@present@#1@yshift\endcsname}) coordinate (@ll) rectangle ++({\csname pingu@present@#1@width\endcsname},{\csname pingu@present@#1@height\endcsname}) coordinate (@ur);
+ % vert band
+ \pingu@block{\csname pingu@color@present#1@band\endcsname}(@ll)++({0.5*(\csname pingu@present@#1@width\endcsname)-0.5*(\csname pingu@present@#1@band@width\endcsname)},0) rectangle ++({\csname pingu@present@#1@band@width\endcsname},{\csname pingu@present@#1@height\endcsname});
+ % horiz band
+ \pingu@block{\csname pingu@color@present#1@band\endcsname}(@ll)++(0,{\csname pingu@present@#1@band@second@yshift\endcsname-0.5*(\csname pingu@present@#1@band@second@height\endcsname)}) rectangle ++({\csname pingu@present@#1@width\endcsname},{\csname pingu@present@#1@band@second@height\endcsname});
+ % lid
+ \pingu@block[rounded corners=.75pt]{\csname pingu@color@present#1@lid\endcsname} ([yshift={\csname pingu@present@\@lr @lid@yshift\endcsname},xshift=\csname pingu@present@\@lr @lid@overhang\endcsname]@ur) rectangle ++({-\csname pingu@present@#1@width\endcsname-2*(\csname pingu@present@\@lr @lid@overhang\endcsname)},-\csname pingu@present@#1@lid@height\endcsname) coordinate (@ll);
+ % upper lid band
+ \pingu@block{\csname pingu@color@present#1@lid@band\endcsname}(@ll)++({0.5*(\csname pingu@present@#1@width\endcsname)-0.5*(\csname pingu@present@#1@band@width\endcsname)+\csname pingu@present@\@lr @lid@overhang\endcsname},0) rectangle ++({\csname pingu@present@#1@band@width\endcsname},{\csname pingu@present@#1@lid@height\endcsname});
+ % ribbon
+ \path (@ll)++({0.5*(\csname pingu@present@#1@width\endcsname)+\csname pingu@present@\@lr @lid@overhang\endcsname+0.2*(\csname pingu@present@#1@band@width\endcsname)},{\csname pingu@present@#1@lid@height\endcsname+.25mm}) coordinate (@top);
+ \pingu@block[even odd rule]{\csname pingu@color@present#1@ribbon\endcsname} (@top) to[out=40,in=110] ++(4mm,1mm)
+ to[out=-70,in=-20] ++(-4mm,-1.5mm) to[bend left=55] cycle ([xshift=.5mm]@top) to[out=40,in=110] ++(2.55mm,.5mm)
+ to[out=-70,in=-20] [rounded corners=1pt] ++(-2.85mm,-.835mm) -- cycle;
+ \path (@ll)++({0.5*(\csname pingu@present@#1@width\endcsname)+\csname pingu@present@\@lr @lid@overhang\endcsname-0.2*(\csname pingu@present@#1@band@width\endcsname)},{\csname pingu@present@#1@lid@height\endcsname+.25mm}) coordinate (@top);
+ \pingu@block[even odd rule]{\csname pingu@color@present#1@ribbon\endcsname} (@top) to[out=180-40,in=180-110] ++(-3.6mm,1mm)
+ to[out=-110,in=-160] ++(3.6mm,-1.5mm) to[bend right=55] cycle ([xshift=-.5mm]@top) to[out=140,in=70] ++(-2.55mm,.5mm)
+ to[out=-110,in=-160] [rounded corners=1pt] ++(2.55mm,-.75mm) -- cycle;
+ \pingu@block[rounded corners=.5pt]{\csname pingu@color@present#1@ribbon\endcsname} (@top)++(-.3mm,-.65mm) rectangle ++(1.3mm,.65mm); % TODO: make that round? (i.e., bend edges)
+ \endscope
+}
+
+\pingu@create@wing@extra{snowball}{%
+ snowball \@lr/.code = {\pingu@set@extra{snowball\@lr}{true}\pingu@color{snowball\@lr}{##1}},
+ snowball \@lr/.default = pingu@white!90!pingu@black,
+ snowball \@lr\space size/.code = \expandafter\def\csname pingu@snowball@\@lr @size\endcsname{##1},
+ snowball \@lr\space xshift/.code = \expandafter\def\csname pingu@snowball@\@lr @xshift\endcsname{##1},
+ snowball \@lr\space yshift/.code = \expandafter\def\csname pingu@snowball@\@lr @yshift\endcsname{##1}
+}{snowball \@lr\space size=2.33mm, snowball \@lr\space xshift=0pt, snowball \@lr\space yshift=0pt}
+
+% #1 wing
+% TODO: shifts
+\def\pingu@draw@wi@snowball#1{%
+\pingu@setup@wing{snowball}{#1}%
+ \pingu@draw[opacity=.35]{\@col} ([xshift=\csname pingu@snowball@#1@xshift\endcsname,yshift=\csname pingu@snowball@#1@yshift\endcsname]\pingu@name-wing-#1) coordinate (@) circle[radius=\csname pingu@snowball@#1@size\endcsname];
+ \pingu@block[rotate around={\@angle-1:(\pingu@name-wing-#1)},decoration={random steps,segment length=1pt,amplitude=.075pt},decorate,rounded corners=.35pt,save path=\snowball@outer]{\@col}(@) circle[radius=\csname pingu@snowball@#1@size\endcsname];
+}
+% #endregion
+
+% #region cloak-lib
+\newif\if@pingu@x@cloak@wings
+\pingu@create@extra{cloak}{%
+ cloak/.code = \pingu@set@extra{cloak}{true}\pingu@color{cloak}{#1},
+ cloak/.default = pingu@bronze,
+ cloak cap/.code = \pingu@color{cloak@cap}{#1},
+ cloak wings color/.code = \pingu@color{cloak@wings}{#1},
+ cloak bottom color/.code = \pingu@color{cloak@bottom}{#1},
+ cloak front color/.code = \pingu@color{cloak@front}{#1},
+ cloak padding/.code = \def\pingu@x@cloak@padding{#1},
+ cloak wings/.is if = @pingu@x@cloak@wings,
+ cape/.style = {/pingu/cloak=#1, /pingu/cloak wings=false,/pingu/cloak front color=\@pingu@none, /pingu/cloak cap=\@pingu@none,/pingu/cloak front color=\@pingu@none},
+ cape/.default = pingu@bronze,
+}{cloak padding=1.95mm,cloak bottom color=\pingu@color@cloak!90!black,cloak cap=\pingu@color@cloak!98!pingu@black,cloak front color=\pingu@color@cloak!90!white,cloak wings color=\pingu@color@cloak@front!94!pingu@black,cloak wings=true}
+\def\pingu@draw@cloth@cloak@behind{%
+ \pingu@block[bottom color=\pingu@color@cloak@bottom,top color=\pingu@color@cloak]{\pingu@color@cloak} (\pingu@name-bottom-center)++(-\pingu@x@cloak@padding-\pingu@w@half,-.5mm) arc (180:0:{\pingu@x@cloak@padding+\pingu@w@half} and \pingu@one) to[bend left=1] (\pingu@name-wings-side-left) arc(0:180:\pingu@w@half{} and .75mm) to[bend left=1] cycle;
+}
+
+\def\pingu@draw@cloth@cloak@middle{\pingu@block[rounded corners=.7mm]{\pingu@color@cloak@front}
+(\pingu@name-bottom-center)++(-\pingu@x@cloak@padding-\pingu@w@half,-.5mm) arc (180:250:{\pingu@x@cloak@padding+\pingu@w@half} and \pingu@one) to[bend right=6]
+([xshift=1.3mm,yshift=.4mm]\pingu@name-wings-side-right) to[bend right=3] ([yshift=.65mm]\pingu@name-wings-side-right);
+\pingu@block[rounded corners=.7mm]{\pingu@color@cloak@front}
+(\pingu@name-bottom-center)++(\pingu@x@cloak@padding+\pingu@w@half,-.5mm) arc (0:-70:{\pingu@x@cloak@padding+\pingu@w@half} and \pingu@one) to[bend left=6]
+([xshift=-1.3mm,yshift=.4mm]\pingu@name-wings-side-left) to[bend left=3] ([yshift=.65mm]\pingu@name-wings-side-left);}
+
+% TODO: if flags to draw parts
+\def\pingu@draw@cloth@cloak{%
+\scope[rounded corners=.6\p@]
+ % wings
+ \if@pingu@x@cloak@wings
+ \edef\@la{\csname @pingu@wingdown@\@pingu@select@leftwing@ @\endcsname}
+ \ifnum\@la>0 % wing is going inverted up or down / \ => left
+ \pingu@layer{foreground}[]
+ \ifnum\@la>70
+ \pingu@block[right color=\pingu@color@cloak@front,left color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} (\pingu@name-wing-left-start)++(.5mm,-3.5mm) to[bend left=10] (\pingu@name-wing-left-low) to[bend right=13] (\pingu@name-wing-left-up) to[bend left=3] (\pingu@name-wing-left-start-up) to[bend left] ([xshift=.35mm,yshift=1mm]\pingu@name-wing-left-start);
+ \else % down
+ \pingu@block[right color=\pingu@color@cloak@front,left color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} (\pingu@name-wing-left-start)++(.5mm,-3.5mm) to[bend left=10] (\pingu@name-wing-left-low) to[bend right=13] (\pingu@name-wing-left-up) to[bend left=3] ([xshift=1mm,yshift=1mm]\pingu@name-wing-left-start-up) to[bend left=4.5] ([xshift=.5mm,yshift=-3.5mm]\pingu@name-wing-left-start);
+ \fi
+ \endpingu@layer
+ \else
+ \ifnum\@la<-90% normal up \ / => left side
+ \pingu@block[upper right=\pingu@color@cloak@wings,lower right=\pingu@color@cloak@front,lower left=\pingu@color@cloak@front,upper left=\pingu@color@cloak@front]{\pingu@color@cloak@wings} ([xshift=.25mm]\pingu@name-wing-left-start-low) to[bend right=14] (\pingu@name-wing-left-low) to[bend left=8] ([yshift=-.5mm]\pingu@name-wing-left-up) to[bend right=17] ([yshift=1.6mm]\pingu@name-wing-left-start-up) to[bend right=13] ([xshift=-.15mm,yshift=.15mm]\pingu@name-waist-left) -- cycle;
+ \else % normal and hugging down => right
+ \pingu@block[top color=\pingu@color@cloak@front,middle color=\pingu@color@cloak,bottom color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} plot[smooth] coordinates {([xshift=-1.38mm]\pingu@name-wings-side-left) (\pingu@name-wing-left-start-low) ([yshift=.65mm,xshift=-.65mm]\pingu@name-wing-left-low) ([yshift=.65mm,xshift=-.65mm]\pingu@name-wing-left-up) ([xshift=.68mm]\pingu@name-wings-side-left) ([xshift=-1.38mm]\pingu@name-wings-side-left)};
+ \fi
+ \fi
+ \edef\@ra{\csname @pingu@wingdown@\@pingu@select@rightwing@ @\endcsname}
+ \ifnum\@ra>0 % wing is going inverted up or down => right
+ \pingu@layer{foreground}[]
+ \ifnum\@ra>70
+ \pingu@block[left color=\pingu@color@cloak@front,middle color=\pingu@color@cloak@front,right color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} (\pingu@name-wing-right-start-low) to[bend right=10] (\pingu@name-wing-right-low) to[bend left=13] (\pingu@name-wing-right-up) to[bend right=3] (\pingu@name-wing-right-start-up) -- ++(-.25mm,0mm) to[bend right=11] cycle;
+ \else
+ \pingu@block[left color=\pingu@color@cloak@front,middle color=\pingu@color@cloak@front,right color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} ([xshift=1mm,yshift=-1mm]\pingu@name-wing-right-start-low) to[bend right=10] (\pingu@name-wing-right-low) to[bend left=13] (\pingu@name-wing-right-up) to[bend right=3] ([xshift=-1mm,yshift=1mm]\pingu@name-wing-right-start-up) to[bend right=4.5] ([xshift=-.5mm,yshift=-3.5mm]\pingu@name-wing-right-start);
+ \fi
+ \endpingu@layer
+ \else
+ \ifnum\@ra<-90% normal up => right side
+ \pingu@block[upper left=\pingu@color@cloak@wings,lower left=\pingu@color@cloak@front,lower right=\pingu@color@cloak@front,upper right=\pingu@color@cloak@front]{\pingu@color@cloak@wings} ([xshift=.25mm]\pingu@name-wing-right-start-low) to[bend left=14] (\pingu@name-wing-right-low) to[bend right=8] ([yshift=-.5mm]\pingu@name-wing-right-up) to[bend left=17] ([yshift=1.6mm]\pingu@name-wing-right-start-up) to[bend left=13] ([xshift=.15mm,yshift=.15mm]\pingu@name-waist-right) -- cycle;
+ \else % normal and hugging down => left
+ \pingu@block[top color=\pingu@color@cloak@front,middle color=\pingu@color@cloak@front,bottom color=\pingu@color@cloak@wings]{\pingu@color@cloak@wings} plot[smooth] coordinates {([xshift=1.38mm]\pingu@name-wings-side-right) (\pingu@name-wing-right-start-low) ([yshift=.85mm,xshift=-.35mm]\pingu@name-wing-right-low) ([yshift=.85mm,xshift=.35mm]\pingu@name-wing-right-up) ([xshift=-.68mm]\pingu@name-wings-side-right) ([xshift=1.38mm]\pingu@name-wings-side-right)};
+ \fi
+ \fi
+\fi
+ % cape
+ \pingu@block[rounded corners=.8mm]{\pingu@color@cloak@cap} ([xshift=.85mm,yshift=-2.75mm]\pingu@name-wing-left-start) to[bend left=4] ([xshift=-.45mm,yshift=-.65mm]\pingu@name-wings-side-left) to[bend right=3]
+ (\pingu@name-head)
+ to[bend right=3]
+ ([xshift=.4mm,yshift=-.65mm]\pingu@name-wings-side-right) [rounded corners=.15mm] to[bend left=3] ([xshift=-.85mm,yshift=-2.75mm]\pingu@name-wing-right-start)
+ to[bend left=8]
+ ([xshift=-.66mm]\pingu@name-wings-side-right)
+ [rounded corners=.15mm]
+ to[bend left=32] ++(\pingu@w@half+.66mm,\pingu@w@half+1.2\pingu@one)
+ to[bend left=32] ++(\pingu@w@half+.66mm,-\pingu@w@half-1.2\pingu@one)
+ to[bend left=8] cycle;
+\endscope
+}
+% #endregion
+
+% #region devil-lib
+\pingu@create@extra{devilhorns}{%
+ devilhorns/.forward to = /pingu/devil horns,
+ devil-horns/.forward to = /pingu/devil horns,
+ devil horns/.code = \pingu@set@extra{devilhorns}{true}\pingu@color{devilhorns}{#1},
+ devil horns/.default = pingu@purple,
+ devil horns b/.code = \pingu@color{devilhorns@b}{#1},
+ devilhorns b/.forward to = /pingu/devil horns b,
+ devil-horns b/.forward to = /pingu/devil horns b
+}{devil horns b=\pingu@color@devilhorns}
+
+\pgfmathsetmacro\pingu@devilhorns@baseang@l{90-360*(1-\pinguanglehl)}
+\pgfmathsetmacro\pingu@devilhorns@baseang@r{90-360*(1-\pinguanglehr)}
+\def\pingu@devilhorns@baseoff{12}
+\def\pingu@devilhorns@yshift{.65mm}
+\def\pingu@draw@ea@devilhorns{%
+ % 90 - 360*.06
+ \pingu@block{\pingu@color@devilhorns} ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-left) arc (\pingu@devilhorns@baseang@l:\pingu@devilhorns@baseang@l-\pingu@devilhorns@baseoff:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-devilhorns-left-goal) to[out=32,in=-32,looseness=.9] ++(.3mm,2.65mm) to[bend left=17] ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-left) -- cycle;
+ \pingu@block{\pingu@color@devilhorns} ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-left) to [bend right=38] (\pingu@name-devilhorns-left-goal) to[bend right=30] ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-left) -- cycle;
+ \pingu@block{\pingu@color@devilhorns@b} ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-right) arc (\pingu@devilhorns@baseang@r:\pingu@devilhorns@baseang@r+\pingu@devilhorns@baseoff:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-devilhorns-right-goal) to[out=148,in=-148,looseness=.9] ++(-.3mm,2.65mm) to[bend right=17] ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-right) -- cycle;
+ \pingu@block{\pingu@color@devilhorns@b} ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-right) to [bend left=38] (\pingu@name-devilhorns-right-goal) to[bend left=30] ([yshift=-\pingu@devilhorns@yshift]\pingu@name-head-right) -- cycle;
+}
+
+% wip hack
+\colorlet{pingu@devil@ring}{pingu@black}
+\def\pingu@devil@x@opacity{.75}
+\pingu@eyes@s{devil}{%
+\pingu@layer{foreground}[]
+ \pingu@block{pingu@devil@ring} ([yshift=.75mm,xshift=\pingu@eye@shift]\pingu@name-eye-back-left) coordinate (\pingu@name-eye-left) ellipse [x radius=.1535cm, y radius=.1575cm];
+ \pingu@block{\pingu@color@eye@second@left} ([yshift=.75mm,xshift=\pingu@eye@shift]\pingu@name-eye-back-left) coordinate (\pingu@name-eye-left) ellipse [x radius=.1325cm, y radius=.1375cm];
+ \fill[\pingu@color@eye@left,/pingu/@glow] (\pingu@name-eye-left) circle [radius=1.325mm];
+ \pingu@block[fill opacity=\pingu@devil@x@opacity]{\pingu@color@eye@left} (\pingu@name-eye-left)++(0,.36) to[bend right=58] ++(.36,-.36) to[bend right=58] ++(-.36,-.36) to[bend right=58] ++(-.36,.36) to[bend right=58] cycle;
+ \fill[/pingu/@glow,fill=\pingu@color@eye@left!20!pingu@yellow!15!pingu@white] (\pingu@name-eye-left)++(0,.10) to[bend right=60] ++(.10,-.10) to[bend right=60] ++(-.10,-.10) to[bend right=60] ++(-.10,.10) to[bend right=60] cycle;
+ \fill[\pingu@color@eye@left!20!pingu@yellow!7!pingu@white] (\pingu@name-eye-left) circle [radius=.5pt]; %
+ \pingu@block{pingu@white} (\pingu@name-eye-left) circle [radius=.15pt];
+\endpingu@layer
+}{%
+\pingu@layer{foreground}[]
+ \pingu@block{pingu@black} ([yshift=.75mm,xshift=-\pingu@eye@shift]\pingu@name-eye-back-right) coordinate (\pingu@name-eye-right) ellipse [x radius=.1535cm, y radius=.1575cm];
+ \pingu@block{\pingu@color@eye@second@right} ([yshift=.75mm,xshift=-\pingu@eye@shift]\pingu@name-eye-back-right) coordinate (\pingu@name-eye-right) ellipse [x radius=.1325cm, y radius=.1375cm];
+ \fill[\pingu@color@eye@right,/pingu/@glow] (\pingu@name-eye-right) circle [radius=1.325mm];
+ \pingu@block[fill opacity=.75]{\pingu@color@eye@right} (\pingu@name-eye-right)++(0,.36) to[bend right=58] ++(.36,-.36) to[bend right=58] ++(-.36,-.36) to[bend right=58] ++(-.36,.36) to[bend right=58] cycle;
+ \fill[/pingu/@glow,fill=\pingu@color@eye@right!20!pingu@yellow!15!pingu@white] (\pingu@name-eye-right)++(0,.10) to[bend right=60] ++(.10,-.10) to[bend right=60] ++(-.10,-.10) to[bend right=60] ++(-.10,.10) to[bend right=60] cycle;
+ \fill[\pingu@color@eye@right!20!pingu@yellow!7!pingu@white] (\pingu@name-eye-right) circle [radius=.5pt]; %
+ \pingu@block{pingu@white} (\pingu@name-eye-right) circle [radius=.15pt];
+\endpingu@layer
+}[pingu@purple]
+
+\pingu@create@wing@extra{devilfork}{%
+ devil fork \@lr/.code = {\pingu@set@extra{devilfork\@lr}{true}\pingu@color{devilfork\@lr}{##1}},
+ devil fork \@lr/.default = pingu@red,
+ devil fork \@lr\space second/.code= \pingu@color{devilfork\@lr @second}{##1},
+ devil fork \@lr\space length/.code =\expandafter\def\csname pingu@devilfork@\@lr @length\endcsname{##1}
+}{devil fork \@lr\space length=20mm,devil fork \@lr\space second=pingu@bronze!10!black}
+\def\pingu@draw@wi@devilfork#1{%
+ \pingu@setup@wing{devilfork}{#1}%
+\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
+ \pingu@block{\csname pingu@color@devilfork#1@second\endcsname} (\pingu@name-wing-#1)++(\@sidesign*-.2mm,-7mm) -- ++(0,\csname pingu@devilfork@#1@length\endcsname) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-devilfork-#1-top) -- ++(0,-\csname pingu@devilfork@#1@length\endcsname) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
+ \pingu@block{\@col} ([yshift=4mm]\pingu@name-devilfork-#1-top) to[out=240,in=90] ++(-.65mm,-4mm) to[out=180,in=-60] ++(-1mm,5.5mm) to[out=240,in=90] ++(-.65mm,-5.9mm) to[bend right] ++(4.4mm,0) to[out=90,in=-60] ++(-.65mm,5.9mm) to[out=240,in=0] ++(-1mm,-5.5mm) to[out=90,in=-60] cycle;
+\endscope
+}
+
+\pingu@create@extra{devilwings}{%
+ devilwings/.forward to = /pingu/devil wings,
+ devil-wings/.forward to = /pingu/devil wings,
+ devil wings/.code = \pingu@set@extra{devilwings}{true}\pingu@color{devilwings}{#1},
+ devil wings/.default = pingu@black,
+ devil wings b/.code = \pingu@color{devilwings@b}{#1},
+ devilwings b/.forward to = /pingu/devil wings b,
+ devil-wings b/.forward to = /pingu/devil wings b
+}{devil wings b=\pingu@color@devilwings}
+
+% taken over and adapted from the old penguins
+% lower wing based on https://tex.stackexchange.com/a/464828
+\def\@pingu@devilwings@lower@wing@code{(0,0.2) -- (0,1.4) -- (-2,1.4) .. controls (-4,0.8) .. (-4.3,0.2) .. controls (-4.48,0.08) .. (-4.5,-0.15) .. controls (-4.9,-0.5) and (-4.9,-0.7) .. (-4.7,-0.9) .. controls (-4.7,-1) .. (-4.6,-1.1) .. controls (-4.9,-1.8) .. (-4.2,-2) -- (-4,-2.4) .. controls (-4.1,-3) .. (-3.6,-3.1) -- (-3.25,-3.7) .. controls (-3.5,-4.5) .. (-4.1,-5.4) .. controls (-4.2,-5.9) and (-3.6,-5.9) .. (-3.5,-5.4) .. controls (-3.55,-5.1) and (-3.4,-4.8) .. (-3,-4.1) -- (-2.6,-4.1) .. controls (-2.35,-4.35) .. (-2,-4.2) .. controls (-1.75,-4.6) and (-1.25,-4.6) .. (-1.25,-3.90) .. controls (-0.9,-4) .. (-0.6,-2.8) -- (-0.3,-1) -- (0,0.2)}
+
+\def\pingu@draw@eb@devilwings{%
+\pgfonlayer{background}
+ \scope[scale=0.225,shift={(\pingu@name-head-back-con-right)}]
+ \pingu@block[thick,rounded corners=.75mm]{\pingu@color@devilwings} \@pingu@devilwings@lower@wing@code;
+ \pingu@block[thick]{\pingu@color@devilwings} (0,1) -- (0,2.2) [rounded corners=5mm] parabola[bend at end] (-6,6) -- (-5,1) -- (0,1);
+ \endscope
+ \scope[scale=0.225,shift={(\pingu@name-head-back-con-left)},xscale=-1]
+ \pingu@block[thick,rounded corners=0.75mm]{\pingu@color@devilwings@b} \@pingu@devilwings@lower@wing@code;
+ \pingu@block[thick]{\pingu@color@devilwings@b} (0,1) -- (0,2.2) [rounded corners=5mm] parabola[bend at end] (-6,6) -- (-5,1) -- (0,1);
+ \endscope
+\endpgfonlayer
+}
+% #endregion
+
+% #region emotions-lib
+\pingu@eyes@s{sad}{%
+ \path (\pingu@name-eye-back-left)++(\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-left);
+ \pingu@block{\pingu@color@eye@left} (\pingu@name-eye-left)++(15:.1225cm and .1275cm) arc (15:-245:.1225cm and .1275cm) to[out=-45,in=175] cycle;
+}{%
+ \path (\pingu@name-eye-back-right)++(-\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-right);
+ \pingu@block{\pingu@color@eye@right} (\pingu@name-eye-right)++(165:.1225cm and .1275cm) arc (165:425:.1225cm and .1275cm) to[out=225,in=5] cycle;
+}
+
+\pingu@eyes@s{angry}{%
+ \path (\pingu@name-eye-back-left)++(\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-left);
+ \pingu@block{\pingu@color@eye@left} (\pingu@name-eye-left) ellipse [x radius=.1225cm, y radius=.1275cm];
+ \pingu@block{\pingu@color@body@front} (\pingu@name-eye-left) ++(120:.1225cm and .1275cm) ellipse [x radius=1.5mm,y radius=.5mm];
+}{%
+ \path (\pingu@name-eye-back-right)++(-\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-right);
+ \pingu@block{\pingu@color@eye@right} (\pingu@name-eye-right) ellipse [x radius=.1225cm, y radius=.1275cm];
+ \pingu@block{\pingu@color@body@front} (\pingu@name-eye-right) ++(60:.1225cm and .1275cm) ellipse [x radius=1.5mm,y radius=.5mm];
+}
+
+\pingu@bill@s{angry}{%
+\pingu@block{\pingu@color@bill} (\pingu@name-bill)++(-.19cm,0)
+ to[out=-90,in=170] ++(1.9mm,-2.25mm) coordinate (\pingu@name-bill-bottom)
+ to[out=10,in=-90] ++(1.9mm,2.25mm)
+ to[bend right=.25cm] cycle;
+}
+
+\pingu@create@extra{blush}{%
+ blush/.code = \pingu@set@extra{blush}{true}\pingu@color{blush}{#1},
+ blush/.default = pingu@red,
+ blush second/.code = \pingu@color{blush@second}{#1},
+ blush opacity/.code = \def\pingu@x@blush@opacity{#1},
+}{blush opacity=.35,blush second=\pingu@color@blush}
+\def\pingu@draw@eb@blush{%
+ \pingu@block[/pingu/@glow,opacity=\pingu@x@blush@opacity]{\pingu@color@blush} ([yshift=-2.7mm,xshift=-1.85mm]\pingu@name-eye-right) ellipse [x radius=2.66mm,y radius=2.25mm];
+ \pingu@block[/pingu/@glow,opacity=\pingu@x@blush@opacity]{\pingu@color@blush@second} ([yshift=-2.7mm,xshift=1.85mm]\pingu@name-eye-left) ellipse [x radius=2.66mm,y radius=2.25mm];
+}
+
+\pingu@eyes@s{hearts}{%
+ \path (\pingu@name-eye-back-left)++(\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-left);
+ \pingu@block[rounded corners=0pt]{\pingu@color@eye@left} ([yshift=.3mm]\pingu@name-eye-left) arc(0:180:.065cm)
+ to[out=270,in=110] ++(.13cm,-.2cm) to[out=70,in=270] ++(.13cm,.2cm) arc (0:180:.065cm) -- cycle;
+}{%
+ \path (\pingu@name-eye-back-right)++(-\pingu@eye@shift,.75mm) coordinate (\pingu@name-eye-right);
+ \pingu@block{\pingu@color@eye@right} ([yshift=.3mm]\pingu@name-eye-right) arc(0:180:.065cm)
+ to[out=270,in=110] ++(.13cm,-.2cm) to[out=70,in=270] ++(.13cm,.2cm) arc (0:180:.065cm) -- cycle;
+}
+
+\pingu@eyes@s{critical}{%
+ \pingu@block{\pingu@color@eye@left} ([yshift=.75mm,xshift=\pingu@eye@shift]\pingu@name-eye-back-left) coordinate (\pingu@name-eye-left) ellipse [x radius=1.13mm, y radius=.145cm];
+ \pingu@draw[thick]{\pingu@color@eye@left} (\pingu@name-eye-left)++(45:1.35mm and 1.85mm) arc(45:135:1.35mm and 1.85mm);
+}{%
+ \pingu@block{\pingu@color@eye@right} ([yshift=.75mm,xshift=-\pingu@eye@shift]\pingu@name-eye-back-right) coordinate(\pingu@name-eye-right) ellipse [x radius=1.13mm, y radius=.145cm];
+ \pingu@draw[thick]{\pingu@color@eye@right} (\pingu@name-eye-right)++(45:1.35mm and 1.85mm) arc(45:135:1.35mm and 1.85mm);
+}
+% #endregion
+
+% #region flags-lib
+\pingu@create@wing@extra{flag}{%
+ flag \@lr/.code = {\pingu@set@extra{flag\@lr}{true}\pingu@color{flag\@lr}{##1}},
+ flag \@lr/.default = pingu@purple,
+ flag \@lr\space pole/.code = \pingu@color{flag\@lr @pole}{##1},
+ flag \@lr\space code/.code = \expandafter\def\csname pingu@flag@\@lr @code\endcsname{##1},
+ flag \@lr\space bobble/.code = {\pingu@color{flag\@lr @bobble}{##1}},
+ pride flag \@lr/.style = {%
+ /pingu/flag \@lr\space code = {%
+ \noexpand\node[/pingu/@flag@first,/pingu/@flag={{rgb:yellow,1;red,5;magenta,2;black,1}}{1.9mm}] (a) at (0,0) {};
+ \noexpand\node[below,/pingu/@flag={{rgb:yellow,5;red,5;green,1;white,1}}{1.9mm}] (b) at (a.south) {};
+ \noexpand\node[below,/pingu/@flag={yellow}{1.9mm}] (c) at (b.south) {};
+ \noexpand\node[below,/pingu/@flag={{rgb:blue,1;cyan,1;green,4;black,2}}{1.9mm}] (d) at (c.south) {};
+ \noexpand\node[below,/pingu/@flag={{rgb:magenta,3;blue,5;cyan,4;black,3}}{1.9mm}] (e) at (d.south) {};
+ \noexpand\node[below,/pingu/@flag={{rgb:red,2;magenta,2;blue,5}}{1.9mm}] (f) at (e.south) {};
+ }, /pingu/flag \@lr, /pingu/flag \@lr\space pole={##1}%
+ },%
+ @flag/.style 2 args={tape bend height=.5mm,shape=tape,minimum height=##2, minimum width=15mm,outer sep=\z@,inner sep=\z@,fill=##1,draw=##1,rotate=\noexpand\@angle},
+ pride flag \@lr/.default = pingu@bronze,%
+ german flag \@lr/.style = {%
+ /pingu/flag \@lr\space code = {%
+ \noexpand\node[/pingu/@flag@first,/pingu/@flag={black}{3.33mm}] (a) at (0,0) {};
+ \noexpand\node[below,/pingu/@flag={red}{3.33mm}] (b) at (a.south) {};
+ \noexpand\node[below,/pingu/@flag={yellow}{3.33mm}] (c) at (b.south) {};
+ }, /pingu/flag \@lr, /pingu/flag \@lr\space pole={##1}%
+ },%
+ german flag \@lr/.default = pingu@bronze%
+}{flag \@lr\space bobble=pingu@bronze, flag \@lr\space pole=pingu@bronze, flag \@lr\space code = {%
+ \noexpand\node[/pingu/@flag@first,/pingu/@flag={\noexpand\@col}{9.75mm}] (a) at (0,0) {};
+}}
+\def\pingu@draw@wi@flag#1{%
+ \pingu@setup@wing{flag}{#1}%
+\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
+ % NOTE: not full foreground if placed under the wing
+ \pingu@layer{foreground}[shift={(\pingu@name-wing-#1)},shift={(\@sidesign*.15mm,17.5mm-3.5\p@)}]
+ \if@pingu@wing@item@side@left@\pgfqkeys{/pingu}{@flag@first/.style={below right}}\else\pgfqkeys{/pingu}{@flag@first/.style={below left}}\fi
+ \csname pingu@flag@#1@code\endcsname
+ \pingu@block[thick]{\csname pingu@color@flag#1@pole\endcsname}(\pingu@name-wing-#1)++(\@sidesign*-.15mm,3mm) -- ++(0,13.65mm) -| ++(\@sidesign*.6mm,-13.65mm) -- cycle;
+ \endpingu@layer
+ \pingu@block[thick]{\csname pingu@color@flag#1@pole\endcsname}(\pingu@name-wing-#1)++(\@sidesign*-.15mm,-3mm) -- ++(0,20mm) arc(180:0:\@sidesign*.3mm and .375mm) -- ++(0,-20mm) arc(360:180:\@sidesign*.3mm and .375mm) -- cycle;
+ \pingu@block{\csname pingu@color@flag#1@bobble\endcsname} (\pingu@name-wing-#1)++(\@sidesign*.15mm,17.5mm) circle [radius=2.15\p@];
+\endscope
+}
+% #endregion
+
+% #region formal-lib
+\pingu@create@extra{tie}{%
+ tie/.code = \pingu@set@extra{tie}{true}\pingu@color{tie}{#1},
+ tie/.default = pingu@green,
+ tie knot/.code = \pingu@color{tie@knot}{#1},
+ tie length/.code = \def\pingu@x@tie@length{#1},
+ tie offset/.code = \def\pingu@x@tie@offset{#1},
+ tie width/.code = \def\pingu@x@tie@width{#1},
+ tie pattern/.code = \def\pingu@x@tie@pattern{#1},
+ tie dots/.style = {%
+ tie pattern={%
+ \pingu@block[postaction={pattern={Dots[angle=40,distance=1.5pt,radius=.35pt]},pattern color=#1}]{\pingu@color@tie} \pingupathxtie;
+ \pingu@block[postaction={pattern={Dots[angle=-30,distance=1.45pt,radius=.35pt@]},pattern color=#1}]{\pingu@color@tie@knot} \pingupathxtieknot;
+ }%
+ },
+ tie dots/.default={pingu@white}%
+}{% defaults
+ tie length=.625\pingu@side@h@half, tie offset=.399cm,%
+ tie knot=\pingu@color@tie!92!black, tie width=.21cm,%
+ tie pattern={%
+ \pingu@block{\pingu@color@tie} \pingupathxtie;
+ \pingu@block{\pingu@color@tie@knot} \pingupathxtieknot;
+ }%
+}
+\def\pingupathxtie{[rounded corners=.15mm] (\pingu@name-tie-start)++(-.4mm,-.25mm) -- ++(-\pingu@x@tie@width/2, -\pingu@x@tie@length+.125cm) -- ++(\pingu@x@tie@width/2+.4mm,-.125cm) -- ++(\pingu@x@tie@width/2+.4mm,.125cm) -- +(-\pingu@x@tie@width/2, \pingu@x@tie@length-.125cm) -- cycle}
+\def\pingupathxtieknot{[rounded corners=.25mm] (\pingu@name-tie-start)++(-.095cm-.02*\pingu@x@tie@width,\z@) -- ++(.3mm,-.15cm-.01*\pingu@x@tie@width) -- ++(.13cm+.04*\pingu@x@tie@width,\z@) -- ++(.3mm,.15cm+.01*\pingu@x@tie@width) -- cycle}
+\def\pingu@draw@eb@tie{%
+ \path (\pingu@name-bill)++(0,-\pingu@x@tie@offset) coordinate(\pingu@name-tie-start);
+ \pingu@x@tie@pattern
+}
+
+\pingu@create@extra{bowtie}{%
+ bowtie/.forward to = /pingu/bow tie,
+ bow-tie/.forward to = /pingu/bow tie,
+ bow tie/.code = \pingu@set@extra{bowtie}{true}\pingu@color{bowtie}{#1},
+ bow tie/.default = pingu@blue,
+ bow tie b/.code = \pingu@color{bowtie@b}{#1},
+ bowtie b/.forward to = /pingu/bow tie b,
+ bow-tie b/.forward to = /pingu/bow tie b,
+ bowtie offset/.forward to = /pingu/bow tie offset,
+ bow-tie offset/.forward to = /pingu/bow tie offset,
+ bow tie offset/.code = \def\pingu@x@bowtie@offset{#1},
+ bowtie knot/.forward to = /pingu/bow tie knot,
+ bow-tie knot/.forward to = /pingu/bow tie knot,
+ bow tie knot/.code = \pingu@color{bowtie@knot}{#1},
+}{% defaults
+ bow tie knot=\pingu@color@bowtie!92!black,bow tie offset=.315cm,%
+ bow tie b=\pingu@color@bowtie%
+}
+
+\def\pingupathxbowtieknot{[rounded corners=.25mm] (\pingu@name-bow-tie-start)++(-.0625cm,-.35mm) to[bend right=10] ++(.125cm,0) -- ++(0,-.13cm) to[bend right=10] ++(-.125cm, 0) -- cycle}
+\def\pingupathxbowtieleft{[rounded corners=.25mm] (\pingu@name-bow-tie-start)++(-.15mm,-.06cm) to[out=155,in=-5] ++(-.25cm,.065cm) to[bend right=15] ++(0,-.21cm) to[in=-155,out=5] ++(.25cm,.065cm) -- cycle}
+\def\pingupathxbowtieright{[rounded corners=.25mm] (\pingu@name-bow-tie-start)++(.15mm,-.06cm) to[out=25,in=-175] ++(.25cm,.065cm) to[bend left=15] ++(0,-.21cm) to[in=-25,out=175] ++(-.25cm,.065cm) -- cycle}
+\def\pingu@draw@eb@bowtie{%
+ \path (\pingu@name-bill)++(0,-\pingu@x@bowtie@offset) coordinate(\pingu@name-bow-tie-start);
+ \pingu@block{\pingu@color@bowtie} \pingupathxbowtieleft;
+ \pingu@block{\pingu@color@bowtie@b} \pingupathxbowtieright;
+ \pingu@block{\pingu@color@bowtie@knot} \pingupathxbowtieknot;
+}
+
+\newif\if@pingu@x@pants@bands
+\pingu@create@extra{pants}{%
+ pants/.code = \pingu@set@extra{pants}{true}\pingu@color{pants}{#1},
+ pants/.default = pingu@red,
+ pants bands/.is if = @pingu@x@pants@bands,
+ pants button left/.code = \pingu@color{pants@button@left}{#1},
+ pants button right/.code = \pingu@color{pants@button@right}{#1},
+ pants buttons/.style = {/pingu/pants button left={#1}, /pingu/pants button right={#1}},
+ pants button left shade/.code = \pingu@color{pants@button@left@shade}{#1},
+ pants button right shade/.code = \pingu@color{pants@button@right@shade}{#1},
+ pants buttons shade/.style = {/pingu/pants button left shade={#1}, /pingu/pants button right shade={#1}},
+ pants without buttons/.forward to=/pingu/pants no buttons,
+ pants no buttons/.style = {/pingu/pants buttons=\@pingu@none, /pingu/pants buttons shade=\@pingu@none},
+ pants extra height/.code = \def\pingu@x@pants@extra@height{#1},
+}{pants extra height=1.5mm,pants buttons=pingu@black,pants button left shade=\pingu@color@pants@button@left!70!white,pants button right shade=\pingu@color@pants@button@right!70!white}
+
+\def\pingu@draw@eb@pants{%
+\pingu@block[rounded corners=\p@]{\pingu@color@pants} ([xshift=.85mm,yshift=\pingu@x@pants@extra@height]\pingu@name-waist-right) coordinate(@tmp) to[bend right=6] ([xshift=-.85mm,yshift=\pingu@x@pants@extra@height]\pingu@name-waist-left) coordinate(@tmpb) -- ++(0,-\pingu@x@pants@extra@height) arc(180:270:.85mm and 2.25mm) to[bend left=\pingu@bend] (\pingu@name-bottom-center-|\pingu@name-waist-left) to[bend left=15] ([yshift=-.15mm]\pingu@name-bottom-center) to[bend left=15] (\pingu@name-bottom-center-|\pingu@name-waist-right) to[bend left=6] ([yshift=-2.5mm]\pingu@name-waist-right) arc (-90:0:.85mm and 2.25mm) -- cycle;
+\if@pingu@x@pants@bands
+\pingu@layer{middle}[]
+% draw stripes
+\scope
+\clip \pingu@path@lowerpingu;
+\pingu@block{\pingu@color@pants} (@tmp)++(.55mm,-\pingu@one) to[bend right=3] ([yshift=1.65mm]\pingu@name-wings-side-right) -- ++(-.25mm,-.25mm) to[bend left=3] ([yshift=-\pingu@one]@tmp) -- cycle;
+\pingu@block{\pingu@color@pants} (@tmpb)++(-.55mm,-\pingu@one) to[bend left=3] ([yshift=1.65mm]\pingu@name-wings-side-left) -- ++(.25mm,-.25mm) to[bend right=3] ([yshift=-\pingu@one]@tmpb) -- cycle;
+\endscope
\fi
+\pingu@block{\pingu@color@pants@button@right}(@tmp)++(.25mm,-.25mm)circle[radius=.7mm];
+\pingu@block{\pingu@color@pants@button@left}(@tmpb)++(-.25mm,-.25mm)circle[radius=.7mm];
+\pingu@block[even odd rule]{\pingu@color@pants@button@right@shade}(@tmp)++(.25mm,-.25mm)circle[radius=.7mm] circle[radius=.615mm];
+\pingu@block[even odd rule]{\pingu@color@pants@button@left@shade}(@tmpb)++(-.25mm,-.25mm)circle[radius=.7mm] circle[radius=.615mm];
+\@for\i:={0,90,180,270}\do{
+ \pingu@block{\pingu@color@pants@button@right@shade} (@tmp)++(.25mm,-.25mm)++(\i:.
+ 35mm) circle[radius=.1mm];
+ \pingu@block{\pingu@color@pants@button@left@shade} (@tmpb)++(-.25mm,-.25mm)++(\i:.35mm) circle[radius=.1mm];
+}%
+\if@pingu@x@pants@bands \endpingu@layer \fi
+}
+
+
+\pingu@create@extra{belt}{%
+ belt/.code = \pingu@set@extra{belt}{true}\pingu@color{belt}{#1},
+ belt/.default = pingu@bronze!80!black,
+ belt knot color/.code = \pingu@color{belt@knot}{#1}
+}{% defaults
+ belt knot color = pingu@silver
+}
+
+\def\pingu@draw@eb@belt@wh{1.25mm}
+\def\pingu@draw@eb@belt{%
+ \path ([yshift=-1.66mm/2]\pingu@name-waist-left) -- ([yshift=-1.66mm/2]\pingu@name-waist-right) coordinate[pos=.5] (\pingu@name @belt@center);
+ \pingu@block[rounded corners=.5pt]{\pingu@color@belt} (\pingu@name-waist-left) coordinate (@) to[bend left=5] (\pingu@name-waist-right) -- ++(0,-1.66mm) to[bend right=5] ([yshift=-1.66mm]@) -- cycle;
+ \pingu@block[rounded corners=1.5pt]{\pingu@color@belt@knot} ([xshift=-1mm,yshift=-.7mm-1.66mm/2]\pingu@name @belt@center) rectangle ++(2mm,2mm);
+}
+% #endregion
+
+% #region fun-lib
+\pingu@create@extra{cakehat}{%
+ cake-hat/.code = \pingu@set@extra{cakehat}{true}\pingu@color{cakehat}{#1},
+ cake-hat/.default = pingu@white!92!\pingu@color@cakehat@top,
+ cake-hat top/.code = \pingu@color{cakehat@top}{#1},
+ cake-hat shade/.code = \pingu@color{cakehat@shade}{#1},
+ cake-hat candle/.code = \pingu@color{cakehat@candle}{#1},
+ cake-hat candle fire/.code = \pingu@color{cakehat@candle@fire}{#1},
+ cake-hat candle fire 2/.code = \pingu@color{cakehat@candle@fire@b}{#1},
+ cake-hat candle fire 3/.code = \pingu@color{cakehat@candle@fire@c}{#1},
+ cake-hat candle wick/.code = \pingu@color{cakehat@candle@wick}{#1},
+ cake-hat candle shade/.code = \pingu@color{cakehat@candle@shade}{#1},
+ cake-hat candle back/.code = \pingu@color{cakehat@candle@back}{#1},
+ cake-hat outline/.code = \pingu@color{cakehat@outline}{#1},
+ cake-hat outline width/.code = \def\pingu@x@cakehat@outline@w{#1},
+ cake-hat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@cakehat@angle{#1}\def\pingu@x@cakehat@xshift{#2}\def\pingu@x@cakehat@yshift{#3}\def\pingu@x@cakehat@scale{#4}}
+}{cake-hat position={-9:(1mm,0mm)1},cake-hat outline=pingu@black!80!\pingu@color@cakehat,cake-hat outline width=.25pt,cake-hat top=pingu@purple,cake-hat candle=pingu@purple!60!pingu@black,cake-hat candle back=\pingu@color@cakehat@candle!85!black,cake-hat candle wick=pingu@black,cake-hat candle fire=pingu@red,cake-hat candle fire 2=\pingu@color@cakehat@candle@fire!50!yellow,cake-hat candle fire 3=\pingu@color@cakehat@candle@fire@b!50!white,cake-hat shade=gray,cake-hat candle shade=gray!80!\pingu@color@cakehat@candle@back}
+
+\def\pingu@p@cake@outline{(-6.25mm,-.25cm) to[bend left=2] (\pingu@name-cake-tl) arc (180:0:1.375cm/2+.01mm and 1.41mm) to[bend left=2] ++(0,-3.125mm*.97) to[bend left=20] (-6mm,-.26cm) -- cycle}
+\def\pingu@draw@ea@cakehat{%
+\scope[rotate around={\pingu@x@cakehat@angle:(\pingu@name-head-top)},%
+shift={(\pingu@name-head-top)},
+shift={(\pingu@x@cakehat@xshift,\pingu@x@cakehat@yshift)},
+scale=\pingu@x@cakehat@scale]
+ \pingu@block{\pingu@color@cakehat} [rounded corners=.2mm](-6.25mm,-.25cm) to[bend left=2] coordinate[pos=.97] (\pingu@name-cake-tl) ++(0,3.125mm) to[bend right=20]
+ ++(1.375cm,0) to[bend left=2] coordinate[pos=.03] (\pingu@name-cake-tr) ++(0,-3.125mm) to[bend left=20] (-6mm,-.26cm) -- cycle;
+ \pingu@block[fill opacity=.1]{\pingu@color@cakehat@shade} [rounded corners=.2mm](-6.25mm,-.25cm) to[bend right=20]
+ ++(1.375cm,0) to[bend right=2] ++(0,3.125mm) [sharp corners] to[bend left=20] (-6.25mm,-.225cm) [rounded corners=.2mm] -- cycle;
+ \path (\pingu@name-cake-tl) -- (\pingu@name-cake-tr) coordinate[pos=.5] (\pingu@name-cake-tc);
+ % cake side
+ \scope
+ \clip\pingu@p@cake@outline;
+ \path (\pingu@name-cake-tl) arc (180:360:1.375cm/2+.01mm and 1.41mm) foreach[count=\i] \a in {0,.19,.295,.375,.485,.625,.72,.85,1} {coordinate[pos=\a] (\pingu@name-cake-\i)};
+ \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-1) ellipse [x radius=.255mm,y radius=2mm];
+ \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-9) ellipse [x radius=.265mm,y radius=1.45mm];
+ \foreach \i in {2,...,9} {
+ \pgfmathsetmacro\@tmprand{rand}
+ \pingu@draw[opacity=.5]{gray} (\pingu@name-cake-\i)++(-.02mm,0) to[bend left=1] ++(+.145mm,{-1.075mm-(\@tmprand+.15)*.5125mm}) arc(370:300:.145mm);
+ \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-\i)++(0,.1mm) -- ++(-.125mm,0) to[bend left=1] ++(0,{-1.2mm-(\@tmprand+.15)*.5125mm}) arc(170:370:.145mm) to[bend right=1] cycle;
+ }
+ \foreach \i in {2,...,9} {
+ \ifnum\i=2\relax
+ \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-\the\numexpr\i-1\relax)++(-.05mm,-.5mm) to[bend left=8] ([xshift=-.05mm,yshift=-.25mm]\pingu@name-cake-\i) -- ++(0,.33mm) to[bend right=30] (\pingu@name-cake-\the\numexpr\i-1\relax);
+ \else\ifnum\i=9\relax
+ \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-\the\numexpr\i-1\relax)++(-.05mm,-.25mm) to[bend left=8] ([xshift=-.05mm,yshift=-.5mm]\pingu@name-cake-\i) -- ++(0,.33mm) to[bend right=30] (\pingu@name-cake-\the\numexpr\i-1\relax);
+ \else
+ \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-\the\numexpr\i-1\relax)++(-.05mm,-.25mm) to[bend left=9.5+2*rand] ([xshift=-.05mm,yshift=-.25mm]\pingu@name-cake-\i) -- ++(0,.33mm) to[bend right=30] (\pingu@name-cake-\the\numexpr\i-1\relax);
+ \fi\fi
+ }
+ \endscope
+ \pingu@block{\pingu@color@cakehat@top} (\pingu@name-cake-tc) ellipse [x radius=1.375cm/2+.01mm, y radius=1.41mm];
+ % outline
+ \pingu@draw[line width=\pingu@x@cakehat@outline@w,rounded corners=.075mm]{\pingu@color@cakehat@outline} \pingu@p@cake@outline;
+% % 3d sides
+% \pingu@block[rounded corners=.04mm]{\pingu@color@cakehat@top} ([xshift=.1mm,yshift=.125mm]\pingu@name-cake-tl) to[out=246,in=97] ++(-.11mm,-2.125mm) -- ++(.04mm,0) to[bend right=12] (\pingu@name-cake-ttl) -- cycle;
+% \pingu@block[rounded corners=.09mm]{green} ([xshift=-.1mm]\pingu@name-cake-ttr) to[out=294,in=83] ++(.125mm,-2.125mm) to[bend left=12] ([xshift=-.11mm,yshift=.125mm]\pingu@name-cake-tr) -- cycle;
+ % candle
+ \pingu@block{\pingu@color@cakehat@candle@back} (\pingu@name-cake-tc)++(.8mm,2.66mm) to[bend right=7] ++(-1.1mm,-.1mm) to[bend right=30]++(1.1mm,0) -- cycle;
+ % wick
+ \pingu@draw[very thin]{\pingu@color@cakehat@candle@wick} (\pingu@name-cake-tc)++(.25mm,2mm) to[out=75,in=-95] coordinate[pos=.8] (\pingu@name-wick-1) ++(0,1mm) coordinate(\pingu@name-wick-top);
+ \pingu@block{\pingu@color@cakehat@candle@fire} (\pingu@name-wick-1)++(-.045mm,0) to[out=115,in=240] ++(0,1.5mm) to[out=300,in=65] ([xshift=.045mm]\pingu@name-wick-1) -- cycle;
+ \pingu@block{\pingu@color@cakehat@candle@fire@b} (\pingu@name-wick-1)++(-.045mm,0) to[out=105,in=240] ++(0,1.3mm) to[out=300,in=75] ([xshift=.045mm]\pingu@name-wick-1) -- cycle;
+ \pingu@block{\pingu@color@cakehat@candle@fire@c} (\pingu@name-wick-1)++(-.035mm,0) to[out=95,in=250] ++(0,1.1mm) to[out=290,in=85] ([xshift=.035mm]\pingu@name-wick-1) -- cycle;
+ % front
+ \pingu@block{\pingu@color@cakehat@candle} (\pingu@name-cake-tc)++(.25mm,0) ++(.55mm,0) to[bend left=0.5] ++(0,2.66mm) to[bend left=20] ++(-1.1mm,-.1mm) to[bend right=0.5] ++(0,-2.66mm) to[bend right=20] cycle;
+ \pingu@block[fill opacity=.125]{\pingu@color@cakehat@candle@shade} (\pingu@name-cake-tc)++(-.3mm,-.1mm) to[bend right=20] ++(1.1mm,0) to[bend left=.5] ++(0,2.66mm) to[bend left=15] ++(-1.1mm,-2.5mm) -- cycle;
+ \pingu@block[fill opacity=.225]{\pingu@color@cakehat@candle@shade} (\pingu@name-cake-tc)++(-.3mm,-.1mm) to[bend left=2] ++(1.1mm,-1.1mm) to[bend left=5] ++(1.1mm,0) to[bend left=2] ++(-1.1mm,1.2mm) to[bend left =15] cycle;
+ \pingu@block[fill opacity=.225]{\pingu@color@cakehat@candle@shade} (\pingu@name-cake-tc)++(1.35mm,-1.25mm) circle [radius=.1mm];
+\endscope
+}
+\pingu@create@extra{pumpkinhat}{%
+ pumpkin-hat/.code = \pingu@set@extra{pumpkinhat}{true}\pingu@color{pumpkinhat}{#1},
+ pumpkin-hat/.default = pingu@bronze!97!white,
+ pumpkin-hat stalk/.code = \pingu@color{pumpkinhat@stalk}{#1},
+ pumpkin-hat stalk top/.code = \pingu@color{pumpkinhat@stalk@top}{#1},
+ pumpkin-hat stripe a/.code = \pingu@color{pumpkinhat@stripe@a}{#1},
+ pumpkin-hat stripe b/.code = \pingu@color{pumpkinhat@stripe@b}{#1},
+ pumpkin-hat stripe c/.code = \pingu@color{pumpkinhat@stripe@c}{#1},
+ pumpkin-hat outline/.code = \pingu@color{pumpkinhat@outline}{#1},
+ pumpkin-hat outline width/.code = \def\pingu@x@pumpkinhat@outline@w{#1},
+ pumpkin-hat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@pumpkinhat@angle{#1}\def\pingu@x@pumpkinhat@xshift{#2}\def\pingu@x@pumpkinhat@yshift{#3}\def\pingu@x@pumpkinhat@scale{#4}}
+}{pumpkin-hat position={-9:(1.65mm,.25mm)1.05},pumpkin-hat stalk=pingu@green!95!\pingu@color@pumpkinhat!45!pingu@black,pumpkin-hat stalk top=\pingu@color@pumpkinhat@stalk!95!pingu@black,pumpkin-hat stripe a=pingu@black,pumpkin-hat stripe b=\pingu@color@pumpkinhat@stripe@a,pumpkin-hat stripe c=\pingu@color@pumpkinhat@stripe@b,pumpkin-hat outline=pingu@black,pumpkin-hat outline width=.7pt}
+
+\def\pingu@pumpkinhat@outerpath{(0,.125cm)++(-60:6.75mm and 5.5mm) arc(-60:86: 6.75mm and 5.5mm) to[bend left=3] ++(-1.75mm,0) arc(95:242:6.75mm and 5.5mm) to[bend left=5] cycle;}
+\def\pingu@draw@ea@pumpkinhat{%
+\scope[rotate around={\pingu@x@pumpkinhat@angle:(\pingu@name-head-top)},%
+shift={(\pingu@name-head-top)},
+shift={(\pingu@x@pumpkinhat@xshift,\pingu@x@pumpkinhat@yshift)},
+scale=\pingu@x@pumpkinhat@scale]
+ % give it a small cut
+ \pingu@block{\pingu@color@pumpkinhat} (0,.125cm)++(-60:6.75mm and 5.5mm) coordinate (@pkll) arc(-60:86: 6.75mm and 5.5mm) coordinate (@pkl) to[bend left=3] coordinate[pos=.5] (@pkuc) ++(-1.75mm,0) coordinate (@pkr) arc(95:242:6.75mm and 5.5mm) coordinate (@pklr) to[bend left=5] coordinate[pos=.5] (@pklc) cycle;
+ \pingu@draw[line join=round,line width=\pingu@x@pumpkinhat@outline@w]{\pingu@color@pumpkinhat@outline} \pingu@pumpkinhat@outerpath;
+\scope
+\clip (0,.125cm)++(-60:6.75mm and 5.5mm) coordinate (@pkll) arc(-60:86: 6.75mm and 5.5mm) coordinate (@pkl) to[bend left=3] ++(-1.75mm,0) coordinate (@pkr) arc(95:242:6.75mm and 5.5mm) coordinate (@pklr) to[bend left=5] cycle;
+ \pingu@draw[line cap=round,opacity=.3]{\pingu@color@pumpkinhat@stripe@a} (@pklr) to[bend left=55] (@pkr);
+ \pingu@draw[line cap=round,opacity=.3]{\pingu@color@pumpkinhat@stripe@c} (@pkll) to[bend right=55] (@pkl);
+ \pingu@draw[line cap=round,opacity=.3]{\pingu@color@pumpkinhat@stripe@b} (@pklc) to[bend right=5] (@pkuc);
+\endscope
+\pingu@block{\pingu@color@pumpkinhat@stalk} ([yshift=-.5*\pingu@x@pumpkinhat@outline@w]@pkl) to[bend left=3] ([yshift=-.5*\pingu@x@pumpkinhat@outline@w]@pkr) to[bend right=8] ++(.85mm,2mm) -- ++(.65mm,0) coordinate[pos=.5] (@pkc) to[bend right=3] cycle;
+\pingu@block{\pingu@color@pumpkinhat@stalk@top} (@pkc) ellipse[x radius=.65mm/2, y radius=.085mm];
+\endscope
}
-\def\pinguloadlibrary#1{\edef\tmp@list{#1}\@for\tmp@elem:=\tmp@list\do{\ifx\tmp@elem\@empty\else\pingu@loadlibrary{\tmp@elem}\fi}}
-\let\pinguloadlibraries\pinguloadlibrary
-
-\pingu@dummy@lib{shirts}{shirt,second shirt}
-\pingu@dummy@lib{glasses}{glasses,glasses round,monocle left,monocle right}
-\pingu@dummy@lib{medieval}{rook,crown,princess crown}
-\pingu@dummy@lib{cloak}{cloak,cape}
-\pingu@dummy@lib{christmas}{santa hat,santa beard,wool hat,deer hat,present left, present right,snowball left, snowball right}
-\pingu@dummy@lib{science-fiction}{lightsaber left,lightsaber right}
-\pingu@dummy@lib{fun}{cake-hat,pumpkin-hat,lollipop left,lollipop right,vampire teeth,broom left,broom right,jack o lantern,jack o lantern helmet,hammer left, hammer right,plank left, plank right,magnifier left, magnifier right}
-\pingu@dummy@lib{technology}{vr-headset,headphone,vr-controller left,vr-controller right,laptop left,laptop right}
-\pingu@dummy@lib{flags}{flag left,flag right}
-\pingu@dummy@lib{hats}{strawhat,hat,cap,construction helmet,conical hat,witch hat,mitra}
-\pingu@dummy@lib{sport}{head band,medal}
-\pingu@dummy@lib{formal}{tie,bow tie,pants,belt}
-\pingu@dummy@lib{signs}{sign post left,sign post right}
-\pingu@dummy@lib{devil}{devil horns,devil wings,devil fork left,devil fork right,eyes devil,left eye devil,right eye devil}
-\pingu@dummy@selector{devil}{lefteye}{devil}
-\pingu@dummy@selector{devil}{righteye}{devil}
-\pingu@dummy@lib{safe}{mask}
-\pingu@dummy@lib{magic}{hand cast left,hand cast right}
-\pingu@dummy@lib{movement}{}% register the lib
-\pingu@dummy@selector{movement}{bodytype}{tilt-right,tilt-left}
-\pingu@dummy@lib{emotions}{eyes sad,left eye sad,right eye sad,eyes angry,left eye angry,right eye angry,eyes hearts,left eye heart,right eye hearts,bill angry,blush,eyes critical,left eye critical,right eye critical}
-\pingu@dummy@selector{emotions}{lefteye}{sad,angry,hearts}
-\pingu@dummy@selector{emotions}{righteye}{sad,angry,hearts}
-
-\pingu@dummy@lib{horse}{horse left,horse right,on horse,horse behind}
-\pingu@dummy@lib{bee}{bee}
-
-\ifpengu@setup@bare@\else
-\pinguloadlibraries{\pingu@@defaultlibs}
+
+\pingu@create@wing@extra{lollipop}{%
+ lollipop \@lr/.code = {\pingu@set@extra{lollipop\@lr}{true}\pingu@color{lollipop\@lr}{##1}},
+ lollipop \@lr/.default = pingu@green,
+ lollipop \@lr\space handle/.code = \pingu@color{lollipop\@lr @handle}{##1},%
+ lollipop \@lr\space second/.code = \pingu@color{lollipop\@lr @second}{##1}%
+}{lollipop \@lr\space handle=pingu@bronze,lollipop \@lr\space second={\csname pingu@color@lollipop\@lr\endcsname!86!white}}
+
+% #1 wing
+\def\pingu@draw@wi@lollipop#1{%
+ \pingu@setup@wing{lollipop}{#1}%
+ \pingu@draw[thick,rotate around={\@angle:(\pingu@name-wing-#1)}]{\csname pingu@color@lollipop#1@handle\endcsname}(\pingu@name-wing-#1)++(0,4.75mm) -- ++(0,-6.25mm);
+ \pingu@block[thick,rotate around={\@angle:(\pingu@name-wing-#1)}]{\@col}(\pingu@name-wing-#1)++(0,4.75mm) coordinate (\pingu@name-lollipop-#1-top) circle[radius=1.4mm];
+ \pingu@block[thick,rotate around={\@angle-1:(\pingu@name-lollipop-#1-top)}]{\csname pingu@color@lollipop#1@second\endcsname} (\pingu@name-lollipop-#1-top) ellipse [x radius=1.57mm, y radius=1.5\p@];
+ \pingu@block[thick,rotate around={\@angle-1:(\pingu@name-lollipop-#1-top)}]{\@col} (\pingu@name-lollipop-#1-top)++(0,.5\p@) ellipse [x radius=1.4mm, y radius=\p@];
+}
+
+\pingu@create@extra{heart}{%
+ heart/.code = {\pingu@set@extra{heart}{true}\pingu@color{heart}{#1}},
+ heart/.default = lightgray
+}{}
+
+\def\pingu@draw@eb@heart{%
+ \pingu@block[sharp corners]{\pingu@color@heart}
+ ([yshift=1mm]\pingu@name-belly-center) arc(0:180:.13cm)
+ to[out=270,in=110] ++(.26cm,-.36cm) to[out=70,in=270] ++(.26cm,.36cm) arc (0:180:.13cm) -- cycle;
+}
+
+\pingu@create@extra{vampireteeth}{%
+ vampire teeth/.code = {\pingu@set@extra{vampireteeth}{true}\pingu@color{vampireteeth}{#1}},
+ vampire teeth/.default = pingu@yellow!10!pingu@black!70!lightgray
+}{}
+
+\def\pingu@draw@eb@vampireteeth{%
+ \pingu@block{\pingu@color@vampireteeth} (\pingu@name-bill) ++(-1.35mm,-2.5mm)
+ arc(180:0:1.35mm and 2.5mm)
+ arc(0:180:1.35mm and .95mm);
+}
+
+\pingu@create@wing@extra{broom}{%
+ broom \@lr/.code = {\pingu@set@extra{broom\@lr}{true}\pingu@color{broom\@lr}{##1}},
+ broom \@lr/.default = pingu@bronze,
+ broom \@lr\space length/.code = \expandafter\def\csname pingu@broom@\@lr @length\endcsname{##1},
+ broom \@lr\space shift/.code = \expandafter\def\csname pingu@broom@\@lr @shift\endcsname{##1},
+ broom \@lr\space band/.code = \pingu@color{broom@\@lr @band}{##1},
+ broom \@lr\space bristles a/.code = \pingu@color{broom@\@lr @bristles@a}{##1},
+ broom \@lr\space bristles b/.code = \pingu@color{broom@\@lr @bristles@b}{##1},
+ broom \@lr\space bristles c/.code = \pingu@color{broom@\@lr @bristles@c}{##1},
+}{broom \@lr\space length=22mm,broom \@lr\space shift=8mm, broom \@lr\space band=pingu@red!80!pingu@black!80!pingu@bronze, broom \@lr\space bristles a=pingu@bronze!16!pingu@yellow!41!pingu@white!80!brown!95!\csname pingu@color@broom\@lr\endcsname, broom \@lr\space bristles b=\csname pingu@color@broom@\@lr @bristles@a\endcsname!83!pingu@white, broom \@lr\space bristles c=\csname pingu@color@broom@\@lr @bristles@b\endcsname!83!pingu@white}
+\def\pingu@draw@wi@broom#1{%
+ \pingu@setup@wing{broom}{#1}%
+ % TODO: mirror on other wing?
+\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
+ \pingu@block{\csname pingu@color@broom#1\endcsname}(\pingu@name-wing-#1)++(\@sidesign*-.2mm,-\csname pingu@broom@#1@shift\endcsname) -- ++(0,\csname pingu@broom@#1@length\endcsname) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-broom-#1-top) -- ++(0,-\csname pingu@broom@#1@length\endcsname) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
+ \pingu@block[rounded corners=.44pt]{\csname pingu@color@broom@#1@bristles@a\endcsname} (\pingu@name-broom-#1-top)++(-1mm,-2mm) to[out=115,in=240] ++(1mm,10.5mm) to[out=300,in=65] ([xshift=.95mm,yshift=-2mm]\pingu@name-broom-#1-top) to[bend right=4] ([xshift=-.75mm,yshift=-2mm]\pingu@name-broom-#1-top) -- cycle;
+ \pingu@block[rounded corners=.44pt]{\csname pingu@color@broom@#1@bristles@a\endcsname} (\pingu@name-broom-#1-top)++(-1mm,-2mm) to[out=115,in=240] ++(1.66mm,9.75mm) to[out=300,in=65] coordinate[pos=.81] (@l) coordinate[pos=.79] (@l2) ([xshift=.95mm,yshift=-2mm]\pingu@name-broom-#1-top) to[bend right=4] ([xshift=-.75mm,yshift=-2mm]\pingu@name-broom-#1-top) -- cycle;
+ \pingu@block[rounded corners=.44pt]{\csname pingu@color@broom@#1@bristles@a\endcsname} (\pingu@name-broom-#1-top)++(-1mm,-2mm) to[out=115,in=240] coordinate[pos=.17] (@r) coordinate[pos=.19] (@r2) ++(.25mm,10.5mm) to[out=300,in=65] ([xshift=.95mm,yshift=-2mm]\pingu@name-broom-#1-top) to[bend right=4] ([xshift=-.75mm,yshift=-2mm]\pingu@name-broom-#1-top) -- cycle;
+ \pingu@block[rounded corners=.44pt]{\csname pingu@color@broom@#1@bristles@b\endcsname} (\pingu@name-broom-#1-top)++(-.75mm,-1.75mm) to[out=115,in=240] ++(1.35mm,9.25mm) to[out=300,in=65] ([xshift=.75mm,yshift=-1.75mm]\pingu@name-broom-#1-top) -- cycle;
+ \pingu@block[rounded corners=.44pt]{\csname pingu@color@broom@#1@bristles@b\endcsname} (\pingu@name-broom-#1-top)++(-.75mm,-1.75mm) to[out=115,in=240] ++(0mm,9.65mm) to[out=300,in=65] ([xshift=.75mm,yshift=-1.75mm]\pingu@name-broom-#1-top) -- cycle;
+ \pingu@block{\csname pingu@color@broom@#1@bristles@c\endcsname} (\pingu@name-broom-#1-top)++(-.5mm,-1.5mm) to[out=115,in=240] ++(.5mm,9.5mm) to[out=300,in=65] ([xshift=.5mm,yshift=-1.5mm]\pingu@name-broom-#1-top) -- cycle;
+ % TODO: broom cap color etc
+ \pingu@block{\csname pingu@color@broom@#1@band\endcsname} (@r) to[bend right=10] (@l) -- (@l2) to[bend left=10] (@r2);
+\endscope
+}
+
+\tikzset{pingu@clip even odd rule/.code={\pgfseteorule}, % Credit to Andrew Stacey
+pingu@invclip/.style={
+ clip,insert path=
+ [pingu@clip even odd rule]{
+ [reset cm](-\maxdimen,-\maxdimen)rectangle(\maxdimen,\maxdimen)
+ }
+}}
+\pingu@create@extra{jackolantern}{%
+ jack o lantern/.code = \pingu@set@extra{jackolantern}{true}\pingu@color{jackolantern}{#1},
+ jack o lantern/.default = pingu@bronze!97!pingu@black,
+ jack o lantern helmet/.style = {jack o lantern=#1,jack o lantern background=none,jack o lantern position={-2.15:(2.05mm,-11.35mm){1.5}},jack o lantern back stripe a=\@pingu@none, jack o lantern back stripe b=\@pingu@none,jack o lantern back stripe c=\@pingu@none,jack o lantern height=6.25mm,jack o lantern width=6.1mm,hair=\@pingu@none},
+ jack o lantern helmet/.default = pingu@bronze!97!pingu@black,
+ jack o lantern stalk/.code = \pingu@color{jackolantern@stalk}{#1},
+ jack o lantern stalk top/.code = \pingu@color{jackolantern@stalk@top}{#1},
+ jack o lantern background/.code= \pingu@color{jackolantern@background}{#1},
+ jack o lantern stripe a/.code = \pingu@color{jackolantern@stripe@a}{#1},
+ jack o lantern stripe b/.code = \pingu@color{jackolantern@stripe@b}{#1},
+ jack o lantern stripe c/.code = \pingu@color{jackolantern@stripe@c}{#1},
+ jack o lantern back stripe a/.code = \pingu@color{jackolantern@backstripe@a}{#1},
+ jack o lantern back stripe b/.code = \pingu@color{jackolantern@backstripe@b}{#1},
+ jack o lantern back stripe c/.code = \pingu@color{jackolantern@backstripe@c}{#1},
+ jack o lantern outline/.code = \pingu@color{jackolantern@outline}{#1},
+ jack o lantern outline width/.code = \def\pingu@x@jackolantern@outline@w{#1},
+ jack o lantern height/.code = \def\pingu@x@jackolantern@height{#1},
+ jack o lantern width/.code = \def\pingu@x@jackolantern@width{#1},
+ jack o lantern position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@jackolantern@angle{#1}\def\pingu@x@jackolantern@xshift{#2}\def\pingu@x@jackolantern@yshift{#3}\def\pingu@x@jackolantern@scale{#4}}
+}{jack o lantern position={-9:(3.15mm,.95mm){1.3}},jack o lantern stripe a=pingu@black,jack o lantern stripe b=\pingu@color@jackolantern@stripe@a,jack o lantern stripe c=\pingu@color@jackolantern@stripe@b,jack o lantern back stripe a=pingu@black,jack o lantern back stripe b=\pingu@color@jackolantern@stripe@a,jack o lantern back stripe c=\pingu@color@jackolantern@stripe@b,jack o lantern outline=pingu@black,jack o lantern outline width=.7pt,jack o lantern stalk=pingu@green!95!\pingu@color@jackolantern!45!pingu@black,jack o lantern stalk top=\pingu@color@jackolantern@stalk!95!pingu@black,jack o lantern background=\pingu@color@jackolantern!85!pingu@black,jack o lantern height=5.5mm,jack o lantern width=5.75mm}
+
+\def\pingu@jackolantern@outerpath{(0,.125cm)++(-60:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) arc(-60:86:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) to[bend right=3] ++(-3.75mm,0) arc(95:242:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) to[bend left=5] cycle;}
+\def\pingu@x@jackolantern{(-5.15mm,.6mm) to[bend right] ++(1.5mm,-.5mm) -- ++(.33mm,.33mm) to[bend right=10] ++(1.5mm,0) -- ++(.66mm,-.75mm) -- ++(.66mm,.75mm) to[bend right=10] ++(1.5mm,0) -- ++(.33mm,-.33mm) to[bend right] ++(1.5mm,.5mm) to[bend left] ++(-1.5mm,-2.15mm) to[bend left=10] ++(-.33mm,.33mm) to[bend left=10] ++(-1.5mm,0) -- ++(-.66mm,-.5mm) -- ++(-.66mm,.5mm) to[bend left=10] ++(-1.5mm,0) -- ++(-.33mm,-.33mm) to[bend left] cycle}
+
+\def\pingu@x@jackolantern@eye@left{(0.9mm,2mm) -- ++(2mm,-.15mm) to[bend right=40] ++(-.5mm,2mm) -- cycle}
+\def\pingu@x@jackolantern@eye@right{(-3mm,2mm) -- ++(-2mm,-.15mm) to[bend left=40] ++(.5mm,2mm) -- cycle}
+\def\pingu@x@jackolantern@nose{(0.965mm*0.5-3.225mm*0.5,1mm) -- ++(1mm,1.2mm) to[bend right=10] ++(-2mm,0) -- cycle}
+
+\def\pingu@draw@ea@jackolantern{%
+\scope[rotate around={\pingu@x@jackolantern@angle:(\pingu@name-head-top)},%
+shift={(\pingu@name-head-top)},
+shift={(\pingu@x@jackolantern@xshift,\pingu@x@jackolantern@yshift)},
+scale=\pingu@x@jackolantern@scale]
+\scope
+\pgfinterruptboundingbox
+\path[pingu@invclip]\pingu@x@jackolantern \pingu@x@jackolantern@eye@left \pingu@x@jackolantern@eye@right \pingu@x@jackolantern@nose;
+ % give it a small cut
+ \pingu@block{\pingu@color@jackolantern} (0,.125cm)++(-60:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) coordinate (@pkll) arc(-60:86: {\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) coordinate (@pkl) to[bend right=3] coordinate[pos=.5] (@pkuc) coordinate[pos=.225] (@pksl) coordinate[pos=.775] (@pksr) ++(-3.75mm,0) coordinate (@pkr) arc(95:242:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) coordinate (@pklr) to[bend left=5] coordinate[pos=.5] (@pklc) cycle;
+ \pingu@draw[line join=round,line width=\pingu@x@jackolantern@outline@w]{\pingu@color@jackolantern@outline} \pingu@jackolantern@outerpath;
+\endpgfinterruptboundingbox
+\scope
+\clip (0,.125cm)++(-60:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) arc(-60:86:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) to[bend right=3] ++(-3.75mm,0) arc(95:242:{\pingu@x@jackolantern@width} and \pingu@x@jackolantern@height) to[bend left=5] cycle;
+ \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@stripe@a} (@pklr) to[bend left=42] (@pkr);
+ \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@stripe@c} (@pkll) to[bend right=54] (@pkl);
+ \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@stripe@b} (@pklc) to[bend right=6] (@pkuc);
+\endscope
+\endscope
+ \pingu@draw[fill=\pingu@color@jackolantern@background,rounded corners=.25pt]{\pingu@color@jackolantern@outline} \pingu@x@jackolantern@eye@left;
+ \pingu@draw[fill=\pingu@color@jackolantern@background,rounded corners=.25pt]{\pingu@color@jackolantern@outline} \pingu@x@jackolantern@eye@right;
+
+ \pingu@draw[fill=\pingu@color@jackolantern@background,rounded corners=.25pt]{\pingu@color@jackolantern@outline} \pingu@x@jackolantern@nose;
+
+ \pingu@draw[fill=\pingu@color@jackolantern@background]{\pingu@color@jackolantern@outline} \pingu@x@jackolantern;
+ \scope
+ \clip\pingu@x@jackolantern \pingu@x@jackolantern@eye@left \pingu@x@jackolantern@eye@right \pingu@x@jackolantern@nose;
+ \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@backstripe@a} ([xshift=1.6mm]@pklr) to[bend left=18] (@pkr);
+ \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@backstripe@c} ([xshift=-1.6mm]@pkll) to[bend right=22] (@pkl);
+ \pingu@draw[line cap=round,opacity=.2]{\pingu@color@jackolantern@backstripe@b} (@pklc) to[bend right=1] (@pkuc);
+ \endscope
+ \pingu@block{\pingu@color@jackolantern@stalk} ([yshift=-.5*\pingu@x@jackolantern@outline@w]@pksl) to[bend left=3] ([yshift=-.5*\pingu@x@jackolantern@outline@w]@pksr) to[bend right=8] ++(.85mm,2mm) -- ++(.65mm,0) coordinate[pos=.5] (@pkc) to[bend right=3] cycle;
+\pingu@block{\pingu@color@jackolantern@stalk@top} (@pkc) ellipse[x radius=.65mm/2, y radius=.085mm];
+\endscope
+}
+
+\pingu@create@wing@extra{hammer}{%
+ hammer \@lr/.code = {\pingu@set@extra{hammer\@lr}{true}\pingu@color{hammer\@lr}{##1}},
+ hammer \@lr/.default = pingu@silver,
+ hammer \@lr\space handle length/.code = \expandafter\def\csname pingu@hammer@\@lr @length\endcsname{##1},
+ hammer \@lr\space handle shift/.code = \expandafter\def\csname pingu@hammer@\@lr @shift\endcsname{##1},
+ hammer \@lr\space width/.code = \expandafter\def\csname pingu@hammer@\@lr @width\endcsname{##1},
+ hammer \@lr\space height/.code = \expandafter\def\csname pingu@hammer@\@lr @height\endcsname{##1},
+ hammer \@lr\space xshift/.code = \expandafter\def\csname pingu@hammer@\@lr @xshift\endcsname{##1},
+ hammer \@lr\space yshift/.code = \expandafter\def\csname pingu@hammer@\@lr @yshift\endcsname{##1},
+ hammer \@lr\space handle/.code = \pingu@color{hammer@\@lr @handle}{##1},%
+ hammer \@lr\space with knob/.style = {hammer \@lr=##1, hammer \@lr\space handle length=\dimexpr9mm+\csname pingu@hammer@\@lr @height\endcsname+.5mm,hammer \@lr\space yshift=\dimexpr-.5mm-\csname pingu@hammer@\@lr @height\endcsname},
+ hammer \@lr\space with knob/.default = pingu@silver
+}{hammer \@lr\space handle length=9mm, hammer \@lr\space handle=pingu@bronze, hammer \@lr\space handle shift=-4mm, hammer \@lr\space width=7mm,hammer \@lr\space height=3.5mm, hammer \@lr\space xshift=-0.5*\csname pingu@hammer@\@lr @width\endcsname,hammer \@lr\space yshift=-1mm}
+\def\pingu@draw@wi@hammer#1{%
+ \pingu@setup@wing{hammer}{#1}%
+\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
+% \csname pingu@color@hammer#1\endcsname
+ \pingu@block{\csname pingu@color@hammer@#1@handle\endcsname}(\pingu@name-wing-#1)++(\@sidesign*-.2mm,\csname pingu@hammer@#1@shift\endcsname) -- ++(0,\csname pingu@hammer@#1@length\endcsname) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-hammer-#1-top) -- ++(0,-\csname pingu@hammer@#1@length\endcsname) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
+ \pingu@block[rounded corners=2pt]{\csname pingu@color@hammer#1\endcsname} (\pingu@name-hammer-#1-top)++(\csname pingu@hammer@#1@xshift\endcsname,\csname pingu@hammer@#1@yshift\endcsname) rectangle ++(\csname pingu@hammer@#1@width\endcsname,\csname pingu@hammer@#1@height\endcsname);
+\endscope
+}
+
+\pingu@create@wing@extra{plank}{%
+ plank \@lr/.code = {\pingu@set@extra{plank\@lr}{true}\pingu@color{plank\@lr}{##1}},
+ plank \@lr/.default = pingu@bronze!80!pingu@black,
+ plank \@lr\space width/.code = \expandafter\def\csname pingu@plank@\@lr @width\endcsname{##1},
+ plank \@lr\space height/.code = \expandafter\def\csname pingu@plank@\@lr @height\endcsname{##1},
+ plank \@lr\space xshift/.code = \expandafter\def\csname pingu@plank@\@lr @xshift\endcsname{##1},
+ plank \@lr\space yshift/.code = \expandafter\def\csname pingu@plank@\@lr @yshift\endcsname{##1}
+}{plank \@lr\space width=7mm,plank \@lr\space height=16.5mm, plank \@lr\space xshift=0mm,plank \@lr\space yshift=-1mm}
+\def\pingu@draw@wi@plank#1{%
+ \pingu@setup@wing{plank}{#1}%
+\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
+\pingu@block[rounded corners=2pt]{\@col}([xshift=\csname pingu@plank@#1@xshift\endcsname,yshift=\csname pingu@plank@#1@yshift\endcsname]\pingu@name-wing-#1)++({-.5*(\csname pingu@plank@#1@width\endcsname)},{-.5*(\csname pingu@plank@#1@height\endcsname)}) rectangle ++({\csname pingu@plank@#1@width\endcsname},{\csname pingu@plank@#1@height\endcsname});
+\endscope
+}
+
+% \usetikzlibrary{spy}
+
+\pingu@create@wing@extra{magnifier}{%
+ magnifier \@lr/.code = {\pingu@set@extra{magnifier\@lr}{true}\pingu@color{magnifier\@lr}{##1}}, % \noexpand\tikzset{/pingu/@pingu/.append style={spy scope={circle,draw,magnification=4,size=1cm}}}
+ magnifier \@lr/.default = pingu@bronze,
+ magnifier \@lr\space handle length/.code = \expandafter\def\csname pingu@magnifier@\@lr @length\endcsname{##1},
+ magnifier \@lr\space handle shift/.code = \expandafter\def\csname pingu@magnifier@\@lr @shift\endcsname{##1},
+ magnifier \@lr\space size/.code = \expandafter\def\csname pingu@magnifier@\@lr @size\endcsname{##1},
+ magnifier \@lr\space glass/.code = \pingu@color{magnifier@\@lr @glass}{##1},
+ magnifier \@lr\space opacity/.code = \expandafter\def\csname pingu@magnifier@\@lr @opacity\endcsname{##1},
+ magnifier \@lr\space thick/.code = \expandafter\def\csname pingu@magnifier@\@lr @thick\endcsname{##1},
+ magnifier \@lr\space xshift/.code = \expandafter\def\csname pingu@magnifier@\@lr @xshift\endcsname{##1},
+ magnifier \@lr\space yshift/.code = \expandafter\def\csname pingu@magnifier@\@lr @yshift\endcsname{##1},
+ magnifier \@lr\space handle/.code = \pingu@color{magnifier@\@lr @handle}{##1}%
+}{magnifier \@lr\space handle length=3.5mm, magnifier \@lr\space handle shift=-4mm, magnifier \@lr\space xshift=0mm,magnifier \@lr\space yshift=1mm,magnifier \@lr\space size=2.5mm,magnifier \@lr\space thick=.5mm,magnifier \@lr\space glass=pingu@blue!90!pingu@yellow,magnifier \@lr\space opacity=0.24}
+\def\pingu@draw@wi@magnifier#1{%
+ \pingu@setup@wing{magnifier}{#1}%
+ \scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
+% \csname pingu@color@magnifier#1\endcsname
+ \path ([yshift=\csname pingu@magnifier@#1@yshift\endcsname+\csname pingu@magnifier@#1@size\endcsname,xshift=\csname pingu@magnifier@\@lr @xshift\endcsname]\pingu@name-wing-#1) coordinate (@);
+
+ % \spy[draw=green] on (@) in node at (@);
+% \pgfonlayer{foreground}
+ \pingu@block[even odd rule]{\@col} (@) circle[radius=\csname pingu@magnifier@#1@size\endcsname] circle[radius=\csname pingu@magnifier@#1@size\endcsname-\csname pingu@magnifier@#1@thick\endcsname];
+
+ \pingu@block[opacity=\csname pingu@magnifier@#1@opacity\endcsname]{\csname pingu@color@magnifier@#1@glass\endcsname} (@) circle[radius=\csname pingu@magnifier@#1@size\endcsname-\csname pingu@magnifier@#1@thick\endcsname];
+
+ \pingu@block{\@col} % TODO: adapt size
+ (@) ([shift={(-70:2.5mm)}]@) to[out=230,in=90] ++(-.5mm,-\csname pingu@magnifier@#1@length\endcsname) arc(360:180:.33mm) to[out=90,in=-50] ++(-.5mm,\csname pingu@magnifier@#1@length\endcsname);%
+% \endpgfonlayer
+\endscope
+}
+% #endregion
+
+% #region glasses-lib
+\pingu@create@extra{glasses}{%
+ glasses/.code = \pingu@set@extra{glasses}{true}\pingu@color{glasses}{#1},
+ glasses/.default = pingu@black,
+ glasses left fill/.code = \pingu@color{glasses@fill@l}{#1},
+ glasses right fill/.code = \pingu@color{glasses@fill@r}{#1},
+ glasses left opacity/.code = \def\pingu@x@glasses@op@l{#1},
+ glasses right opacity/.code = \def\pingu@x@glasses@op@r{#1},
+ glasses fill/.style = {/pingu/glasses left fill=#1, /pingu/glasses right fill=#1},
+ glasses opacity/.style = {/pingu/glasses left opacity=#1, /pingu/glasses right opacity=#1},
+ glasses line width/.code = \def\pingu@x@glasses@lw{#1},
+ sunglasses/.forward to = /pingu/sun glasses,
+ glasses bend left/.code = \def\pingu@x@glasses@bend@l{#1},
+ glasses bend right/.code = \def\pingu@x@glasses@bend@r{#1},
+ glasses bend/.style = {/pingu/glasses bend left=#1,/pingu/glasses bend right=#1},
+ sun glasses/.style = {/pingu/glasses, /pingu/glasses fill=#1},
+ sun glasses/.default = pingu@black,
+}{glasses line width=1.125\p@,glasses fill=\@pingu@none,glasses opacity=.825,glasses bend left=32.5,glasses bend right=32.5}
+
+\def\pingu@draw@ea@glasses{% fact: 1.33; modified first shift and ht
+ \pingu@block[opacity=\pingu@x@glasses@op@l]{\pingu@color@glasses@fill@l} (\pingu@name-eye-left)++(-2.66mm,1.75mm) to[bend left=8] ++(5.586mm,0) to[out=-80,in=70] ++(-.266mm,-3.6mm) to[bend left=\pingu@x@glasses@bend@l] ++(-4.8545mm,\z@) to[out=135,in=-90] ++(-1.064mm,3.5mm) -- cycle;
+ \pingu@block[opacity=\pingu@x@glasses@op@r]{\pingu@color@glasses@fill@r} (\pingu@name-eye-right)++(2.66mm,1.75mm) to[bend right=8] ++(-5.586mm,0) to[out=-100,in=110] ++(.266mm,-3.6mm) to[bend right=\pingu@x@glasses@bend@r] ++(4.8545mm,\z@) to[out=45,in=-90] ++(1.064mm,3.5mm) -- cycle;
+ \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses} [rounded corners=.25mm](\pingu@name-eye-left)++(-2.66mm,1.75mm) coordinate (\pingu@name-glasses-left-mid) to[bend left=8] ++(5.586mm,0) coordinate (\pingu@name-glasses-left-outer) to[out=-80,in=70] ++(-.266mm,-3.6mm) to[bend left=\pingu@x@glasses@bend@l] ++(-4.8545mm,\z@) to[out=135,in=-90] coordinate[pos=.9] (\pingu@name-glasses-left-mid-b) ++(-1.064mm,3.5mm) -- cycle;
+ \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses} [rounded corners=.25mm] (\pingu@name-eye-right)++(2.66mm,1.75mm) coordinate (\pingu@name-glasses-right-mid) to[bend right=8] ++(-5.586mm,0) coordinate (\pingu@name-glasses-right-outer) to[out=-100,in=110] ++(.266mm,-3.6mm) to[bend right=\pingu@x@glasses@bend@r] ++(4.8545mm,\z@) to[out=45,in=-90] coordinate[pos=.9] (\pingu@name-glasses-right-mid-b) ++(1.064mm,3.5mm) -- cycle;
+ \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses} (\pingu@name-glasses-right-mid) to[bend right=10] (\pingu@name-glasses-left-mid);
+ \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses} (\pingu@name-glasses-right-mid-b) to[bend left=20] (\pingu@name-glasses-left-mid-b);
+ \scope
+ \clip[use path=\pingu@upperpingu];
+ \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses}
+ (\pingu@name-glasses-right-mid) to[bend right=8] ++(-5.586mm,0) -- ++(-5mm,.5mm);
+ \pingu@draw[line width=\pingu@x@glasses@lw]{\pingu@color@glasses}
+ (\pingu@name-glasses-left-mid) to[bend left=8] ++(5.586mm,0) -- ++(5mm,.5mm);
+ \endscope
+}
+\pingu@create@extra{glassesround}{%
+ glasses round/.code = \pingu@set@extra{glassesround}{true}\pingu@color{glassesround}{#1},
+ glasses round/.default = pingu@black,
+ glasses round left fill/.code = \pingu@color{glassesround@fill@l}{#1},
+ glasses round right fill/.code = \pingu@color{glassesround@fill@r}{#1},
+ glasses round fill/.style = {/pingu/glasses round left fill=#1, /pingu/glasses round right fill=#1},
+ glasses round left opacity/.code = \def\pingu@x@glassesround@op@l{#1},
+ glasses round right opacity/.code = \def\pingu@x@glassesround@op@r{#1},
+ glasses round opacity/.style = {/pingu/glasses round left opacity=#1, /pingu/glasses round right opacity=#1},
+ glasses round left radius/.code = \def\pingu@x@glassesround@r@l{#1},
+ glasses round right radius/.code = \def\pingu@x@glassesround@r@r{#1},
+ glasses round radius/.style = {/pingu/glasses round left radius=#1, /pingu/glasses round right radius=#1},
+ glasses round line width/.code = \def\pingu@x@glassesround@lw{#1},
+ sunglasses round/.forward to = /pingu/sun glasses round,
+ sun glasses round/.style = {/pingu/glasses round, /pingu/glasses round fill=#1},
+ sun glasses round/.default = pingu@black,
+ % todo: width/radius allow for different
+}{glasses round line width=.75\p@,glasses round fill=\@pingu@none,glasses round opacity=.825,glasses round radius=3.15mm}
+\def\pingu@draw@ea@glassesround{% fact: 1.33; modified first shift and ht
+ \pingu@block[opacity=\pingu@x@glassesround@op@l]{\pingu@color@glassesround@fill@l} (\pingu@name-eye-left) circle [radius=\pingu@x@glassesround@r@l];
+ \pingu@block[opacity=\pingu@x@glassesround@op@r]{\pingu@color@glassesround@fill@r} (\pingu@name-eye-right) circle [radius=\pingu@x@glassesround@r@r];
+ \pingu@draw[line width=\pingu@x@glassesround@lw]{\pingu@color@glassesround} [rounded corners=.25mm](\pingu@name-eye-left) ++(150:\pingu@x@glassesround@r@l) coordinate (\pingu@name-glassesround-left-mid) arc (150:510:\pingu@x@glassesround@r@l);
+ \pingu@draw[line width=\pingu@x@glassesround@lw]{\pingu@color@glassesround} [rounded corners=.25mm] (\pingu@name-eye-right) ++(30:\pingu@x@glassesround@r@r) coordinate (\pingu@name-glassesround-right-mid) arc (30:390:\pingu@x@glassesround@r@r);
+ \pingu@draw[line width=\pingu@x@glassesround@lw]{\pingu@color@glassesround} (\pingu@name-glassesround-left-mid) to[bend right=30] (\pingu@name-glassesround-right-mid);
+ \scope
+ \clip[use path=\pingu@upperpingu];
+ \pingu@draw[line width=\pingu@x@glassesround@lw]{\pingu@color@glassesround}
+ (\pingu@name-glassesround-right-mid) arc(30:150:\pingu@x@glassesround@r@l) -- ++(-5mm,.65mm);
+ \pingu@draw[line width=\pingu@x@glassesround@lw]{\pingu@color@glassesround}
+ (\pingu@name-glassesround-left-mid) arc(150:30:\pingu@x@glassesround@r@r) -- ++(5mm,.65mm);
+ \endscope
+}
+\pingu@create@extra{monocleleft}{%
+ monocle left/.code = \pingu@set@extra{monocleleft}{true}\pingu@color{monocleleft}{#1},
+ monocle left/.default = pingu@black,
+ monocle left glass/.code = \pingu@color{monocleleft@glass}{#1},
+ monocle left fill/.forward to = /pingu/monocle left glass,
+ monocle left opacity/.code = \def\pingu@x@monocleleft@opacity{#1},
+ monocle left fill opacity/.forward to = /pingu/monocle left opacity,
+ monocle left string/.code = \pingu@color{monocleleft@string}{#1},
+ monocle left string length/.code= \def\pingu@x@monocleleft@string@l{#1},
+ monocle left blob/.code = \pingu@color{monocleleft@blob}{#1},
+}{monocle left glass=pingu@blue,monocle left opacity=.155,monocle left string=\pingu@color@monocleleft,monocle left blob=\pingu@color@monocleleft,monocle left string length=5.55mm}
+
+\def\pingu@draw@eb@monocle@l{%
+ \pingu@block[/pingu/glow,opacity=\pingu@x@monocleleft@opacity]{\pingu@color@monocleleft@glass} (\pingu@name-eye-left) circle[radius=2mm];
+ \pingu@draw[thin]{\pingu@color@monocleleft@string} (\pingu@name-eye-left)++(2mm,0)
+ to[out=-75,in=100] ++(0,-\pingu@x@monocleleft@string@l);
+ \pingu@block{\pingu@color@monocleleft@blob} (\pingu@name-eye-left)++(2mm,-\pingu@x@monocleleft@string@l) circle [radius=.65\p@];
+ \pingu@draw[semithick]{\pingu@color@monocleleft} (\pingu@name-eye-left) circle[radius=2mm];
+}
+\pingu@create@extra{monocleright}{%
+ monocle right/.code = \pingu@set@extra{monocleright}{true}\pingu@color{monocleright}{#1},
+ monocle right/.default = pingu@black,
+ monocle right glass/.code = \pingu@color{monocleright@glass}{#1},
+ monocle right fill/.forward to = /pingu/monocle right glass,
+ monocle right opacity/.code = \def\pingu@x@monocleright@opacity{#1},
+ monocle right fill opacity/.forward to = /pingu/monocle right opacity,
+ monocle right string/.code = \pingu@color{monocleright@string}{#1},
+ monocle right string length/.code= \def\pingu@x@monocleright@string@r{#1},
+ monocle right blob/.code = \pingu@color{monocleright@blob}{#1},
+}{monocle right glass=pingu@blue,monocle right opacity=.155,monocle right string=\pingu@color@monocleright,monocle right blob=\pingu@color@monocleright,monocle right string length=5.55mm}
+\def\pingu@draw@eb@monocle@r{%
+ \pingu@block[/pingu/glow,opacity=\pingu@x@monocleright@opacity]{\pingu@color@monocleright@glass} (\pingu@name-eye-right) circle[radius=2mm];
+ \pingu@draw[thin]{\pingu@color@monocleright@string} (\pingu@name-eye-right)++(-2mm,0)
+ to[out=-105,in=80] ++(0,-\pingu@x@monocleright@string@r);
+ \pingu@block{\pingu@color@monocleright@blob} (\pingu@name-eye-right)++(-2mm,-\pingu@x@monocleright@string@r) circle [radius=.65\p@];
+ \pingu@draw[semithick]{\pingu@color@monocleright} (\pingu@name-eye-right) circle[radius=2mm];
+}
+% #endregion
+
+% #region hats-lib
+\pingu@create@extra{strawhat}{%
+ % extra strawhat (tikzducks basis)
+ straw hat/.forward to = /pingu/strawhat,
+ strawhat/.default = brown!50!white,
+ strawhat/.code = \pingu@set@extra{strawhat}{true}\pingu@color{strawhat}{#1},
+ straw hat ribbon/.forward to = /pingu/strawhat ribbon,
+ strawhat ribbon/.code = \pingu@color{strawhat@ribbon}{#1},
+ straw hat position/.forward to= /pingu/strawhat position,
+ strawhat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@strawhat@angle{#1}\def\pingu@x@strawhat@xshift{#2}\def\pingu@x@strawhat@yshift{#3}\def\pingu@x@strawhat@scale{#4}},
+}{strawhat ribbon= gray!85!black,strawhat position={-26.5:(-.185cm,.14cm){1.375}}}
+
+\def\pingu@draw@ea@strawhat{%
+\scope[rotate around={\pingu@x@strawhat@angle:(\pingu@name-head)},shift={(\pingu@name-head)},shift={(\pingu@x@strawhat@xshift,\pingu@x@strawhat@yshift)},scale=\pingu@x@strawhat@scale]
+\pingu@block{\pingu@color@strawhat} (.34cm,0) ellipse[x radius=.75cm, y radius=\pingu@one];
+\pingu@block{\pingu@color@strawhat} (0,.5mm) rectangle (.68cm,5mm);
+\pingu@block{\pingu@color@strawhat} (.34cm,5mm) ellipse[x radius=.34cm, y radius=.8mm];
+\pingu@block{\pingu@color@strawhat} (-.3955cm,.2mm) -- (1.0755cm,.2mm) -- (.68cm,2mm) -- (0,2mm) -- cycle;
+\pingu@block{\pingu@color@strawhat@ribbon} (.34cm,2mm) ellipse[x radius=.34cm, y radius=.8mm];
+\pingu@block{\pingu@color@strawhat@ribbon} (0,2mm) rectangle (.68cm,3mm);
+\pingu@block{\pingu@color@strawhat} (.34cm,3mm) ellipse[x radius=.34cm, y radius=.8mm];
+\endscope}
+
+\pingu@create@extra{hat}{%
+ hat/.default = pingu@black!90!black,
+ hat/.code = \pingu@set@extra{hat}{true}\pingu@color{hat}{#1},
+ hat base/.code = \pingu@color{hat@base}{#1},
+ hat coronal/.code = \pingu@color{hat@coronal}{#1},
+ hat ribbon/.code = \pingu@color{hat@ribbon}{#1},
+ hat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@hat@angle{#1}\def\pingu@x@hat@xshift{#2}\def\pingu@x@hat@yshift{#3}\def\pingu@x@hat@scale{#4}},
+}{hat position={-2:(.35mm,0)1},hat base=\pingu@color@hat,hat coronal=\pingu@color@hat!91!white,hat ribbon=\pingu@color@hat!87!white}
+
+\newdimen\pingu@hat@w@half \pingu@hat@w@half=.925cm
+\newdimen\pingu@hat@h \pingu@hat@h=.625cm
+\def\pingupathhatupper{[rounded corners=.25mm](-.65cm,-.25cm) to[out=90,in=200] ++(.35cm,\pingu@hat@h) to[bend left=11] ++(.25cm,0) to[bend right=2.5] ++(\pingu@one,0) to[bend left=11] ++(.25cm,0) to[out=-20,in=90] ++(.35cm,-\pingu@hat@h) to[bend left=12] (-.65cm,-.25cm) -- cycle}
+\def\pingu@draw@ea@hat{%
+\scope[rotate around={\pingu@x@hat@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@hat@xshift,\pingu@x@hat@yshift)},scale=\pingu@x@hat@scale]
+\pingu@block[/pingu/@draw=\pingu@color@hat@coronal,thick]{\pingu@color@hat@base} (0,-.25cm)++(180:\pingu@hat@w@half{} and .15cm) arc (180:360:\pingu@hat@w@half{} and .15cm) arc (0:180:\pingu@hat@w@half{} and .115cm) -- cycle;
+\pingu@block{\pingu@color@hat} \pingupathhatupper;
+\scope
+\clip\pingupathhatupper;
+\pingu@block{\pingu@color@hat@ribbon} (\z@,.2mm) ellipse [x radius=.95\pingu@hat@w@half, y radius=.13cm];
+\pingu@block{\pingu@color@hat} (\z@,.134cm) ellipse [x radius=.95\pingu@hat@w@half, y radius=.13cm];
+\endscope\endscope}
+
+% TODO: tassel
+\pingu@create@extra{graduate}{%
+ graduate cap/.forward to = /pingu/graduate,
+ graduate/.default = pingu@black!95!white,
+ graduate/.code = \pingu@set@extra{graduate}{true}\pingu@color{graduate}{#1},
+ graduate cap top/.forward to = /pingu/graduate top,
+ graduate top/.code = \pingu@color{graduate@top}{#1},
+ graduate cap tilt/.forward to = /pingu/graduate tilt,
+ graduate tilt/.code = \def\pingu@x@graduate@tilt{#1},
+ graduate cap tassel/.forward to = /pingu/graduate tassel,
+ graduate tassel/.code = \pingu@color{graduate@tassel}{#1},
+ graduate tassel/.default = pingu@red!65!black,
+ graduate cap tassel drop/.forward to = /pingu/graduate tassel drop,
+ graduate tassel drop/.code = \pingu@color{graduate@tassel@drop}{#1},
+ graduate cap tassel start/.forward to = /pingu/graduate tassel start,
+ graduate tassel start/.code = \def\pingu@x@tassel@start{#1},
+ graduate cap tassel width/.forward to = /pingu/graduate tassel width,
+ graduate tassel width/.code = \def\pingu@x@tassel@width{#1},
+ graduate cap tassel length/.forward to = /pingu/graduate length,
+ graduate tassel length/.code = \def\pingu@x@tassel@length{#1},
+ graduate cap tassel drop size/.forward to = /pingu/graduate drop size,
+ graduate tassel drop size/.code = \def\pingu@x@tassel@drop@size{#1},
+ graduate cap position/.forward to = /pingu/graduate position,
+ graduate position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@graduate@angle{#1}\def\pingu@x@graduate@xshift{#2}\def\pingu@x@graduate@yshift{#3}\def\pingu@x@graduate@scale{#4}},
+}{graduate position={-27:(-.19cm,.14cm){1.375}}, graduate top=\pingu@color@graduate!95!white,graduate tilt=2.33mm,graduate tassel=\@pingu@none, graduate tassel width=.5mm, graduate tassel length=5.5mm,graduate tassel drop size=.75*\pingu@x@tassel@width,graduate tassel drop=\pingu@color@graduate@tassel,graduate cap tassel start={(.55cm,3.5mm-\pingu@x@graduate@tilt)}} % ; tassel color to hide
+
+\def\pingu@draw@ea@graduate{%
+\scope[rotate around={\pingu@x@graduate@angle:(\pingu@name-head)},shift={(\pingu@name-head)},shift={(\pingu@x@graduate@xshift,\pingu@x@graduate@yshift)},scale=\pingu@x@graduate@scale]
+\pingu@block{\pingu@color@graduate} (0,1mm) rectangle (.75cm,3.5mm);
+\pingu@block{\pingu@color@graduate} (.375cm,1mm) ellipse[x radius=.375cm, y radius=.8mm];
+\pingu@block[rounded corners=.33mm]{\pingu@color@graduate@top} (-3mm,3.5mm)
+ % minor slant for visuals
+ -- ++(.675cm + .1mm,\pingu@x@graduate@tilt) -- (1.05cm,3.5mm) -- ++(-.675cm - .1mm,-\pingu@x@graduate@tilt) -- cycle;
+% counter rotation
+\scope[rotate around={-\pingu@x@graduate@angle:(\pingu@name-head)}]
+\pingu@draw[line width=\pingu@x@tassel@width]{\pingu@color@graduate@tassel} \pingu@x@tassel@start to[out=-45,in=90] ++(.2*\pingu@x@tassel@length,-\pingu@x@tassel@length) coordinate(@);
+\pingu@block{\pingu@color@graduate@tassel@drop} (@) circle[x radius=\pingu@x@tassel@drop@size, y radius=1.75*\pingu@x@tassel@drop@size];
+\endscope
+\endscope}
+
+\pingu@create@extra{cap}{%
+ cap/.default = pingu@bronze,
+ cap/.code = \pingu@set@extra{cap}{true}\pingu@color{cap}{#1},
+ cap padding/.code = {\def\pingu@x@cap@padding{#1}},
+ cap extra height/.code = {\def\pingu@x@cap@height{#1}},
+}{cap padding=.8mm, cap extra height=0pt}
+
+\def\pingu@draw@ea@cap{%
+\pingu@layer{foreground}[]
+\pingu@block[rounded corners=.7mm]{\pingu@color@cap} ([xshift=.25mm]\pingu@name-wing-left-start) to[bend left=4] ([xshift=-\pingu@x@cap@padding]\pingu@name-wings-side-left) to[bend right=3]
+([yshift=\pingu@x@cap@height]\pingu@name-head)
+to[bend right=3]
+([xshift=\pingu@x@cap@padding]\pingu@name-wings-side-right) [rounded corners=.15mm] to[bend left=4] ([xshift=-.25mm]\pingu@name-wing-right-start)
+to[bend left=8]
+([xshift=-\pingu@x@cap@padding]\pingu@name-wings-side-right)
+[rounded corners=.15mm]
+to[bend left=32] ++(\pingu@w@half+\pingu@x@cap@padding,\pingu@w@half+\pingu@one)
+to[bend left=32] ++(\pingu@w@half+\pingu@x@cap@padding,-\pingu@w@half-\pingu@one)
+to[bend left=8] cycle;
+\endpingu@layer
+}
+
+\pingu@create@extra{constructionhelmet}{%
+ construction helmet/.default = pingu@yellow,
+ construction helmet/.code = \pingu@set@extra{constructionhelmet}{true}\pingu@color{constructionhelmet}{#1},
+ construction helmet padding/.code = {\def\pingu@x@constructionhelmet@padding{#1}},
+ construction helmet extra height/.code = {\def\pingu@x@constructionhelmet@height{#1}},
+ construction helmet position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@constructionhelmet@angle{#1}\def\pingu@x@constructionhelmet@xshift{#2}\def\pingu@x@constructionhelmet@yshift{#3}\def\pingu@x@constructionhelmet@scale{#4}},
+}{construction helmet padding=.325cm, construction helmet extra height=0pt,construction helmet position={-.5:(.05mm,-1.25mm)1}}
+
+\newdimen\pingu@constructionhelmet@w@half \pingu@constructionhelmet@w@half=.85cm
+\def\pingu@draw@ea@constructionhelmet{%
+\scope[rotate around={\pingu@x@constructionhelmet@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@constructionhelmet@xshift,\pingu@x@constructionhelmet@yshift)},scale=\pingu@x@constructionhelmet@scale]
+\pingu@block{\pingu@color@constructionhelmet} (0,-.25cm)++(180:\pingu@constructionhelmet@w@half{} and \pingu@x@constructionhelmet@padding) arc (180:360:\pingu@constructionhelmet@w@half{} and \pingu@x@constructionhelmet@padding) arc (0:180:\pingu@constructionhelmet@w@half{} and .2cm) -- cycle;
+\scope
+\pingu@block{\pingu@color@constructionhelmet!93!pingu@black} (0,-.25cm)++(0:{.95\pingu@constructionhelmet@w@half} and .675cm) arc (0:180:{.95\pingu@constructionhelmet@w@half} and .675cm) coordinate[pos=.212] (@a) coordinate[pos=.256] (@aa) coordinate[pos=.788] (@b) coordinate[pos=.744] (@bb) arc (180:360:{.95\pingu@constructionhelmet@w@half} and .125cm) -- cycle;
+\clip (0,-.25cm)++(0:{.95\pingu@constructionhelmet@w@half} and .675cm) arc (0:180:{.95\pingu@constructionhelmet@w@half} and .675cm) arc (180:360:{.95\pingu@constructionhelmet@w@half} and .125cm) -- cycle;
+\pingu@block{\pingu@color@constructionhelmet!99!pingu@black} (-.75mm,-.25cm-.125cm) to[bend left=1] ++ (0,.675cm+.125cm) -- ++(1.5mm,0) to[bend right=1] ++(0,-.675cm-.125cm) -- cycle;
+\pingu@block{\pingu@color@constructionhelmet!99!pingu@black} (-.95mm,-.25cm-.125cm) to[bend left=3] ++ (-8mm,.675cm+.125cm) -- ++(1.5mm,0) to[bend right=3] ++(8mm,-.675cm-.125cm) -- cycle;
+\pingu@block{\pingu@color@constructionhelmet!99!pingu@black} (-.55mm,-.25cm-.125cm) to[bend right=3] ++ (8mm,.675cm+.125cm) -- ++(1.5mm,0) to[bend left=3] ++(-8mm,-.675cm-.125cm) -- cycle;
+\endscope
+% get the 3d wobbles
+\pingu@block[rounded corners=.03mm]{\pingu@color@constructionhelmet!99!pingu@black} (-.75mm,-.25cm+.675cm-.25mm) -- ++(0,.3mm) -| ++(1.5mm,-.3mm) -- cycle;
+\pingu@block{\pingu@color@constructionhelmet!99!pingu@black} (@a) to[bend right=14] (@aa);
+\pingu@block{\pingu@color@constructionhelmet!99!pingu@black} (@bb) to[bend right=14] (@b);
+\endscope
+}
+
+\pingu@create@extra{conicalhat}{%
+ conical hat/.default = pingu@bronze,
+ conical hat/.code = \pingu@set@extra{conicalhat}{true}\pingu@color{conicalhat}{#1},
+ conical hat rounding/.code = {\def\pingu@x@conicalhat@rounding{#1}},
+ conical hat shade/.code = {\def\pingu@x@conicalhat@shade{#1}},
+ conical hat height/.code = {\def\pingu@x@conicalhat@height{#1}},
+ conical hat width/.code = {\def\pingu@x@conicalhat@width{#1}},
+ conical hat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@conicalhat@angle{#1}\def\pingu@x@conicalhat@xshift{#2}\def\pingu@x@conicalhat@yshift{#3}\def\pingu@x@conicalhat@scale{#4}},
+}{conical hat position={-15:(2mm,-3mm)1}, conical hat height=8mm, conical hat width=2.25cm,conical hat shade=\pingu@color@conicalhat!80!pingu@black, conical hat rounding=.4pt}
+
+\def\pingu@draw@ea@conicalhat{%
+\scope[rotate around={\pingu@x@conicalhat@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@conicalhat@xshift,\pingu@x@conicalhat@yshift)},scale=\pingu@x@conicalhat@scale]
+
+\pingu@layer{background}[]
+\pingu@block[rounded corners=\pingu@x@conicalhat@rounding]{\pingu@x@conicalhat@shade} (0,-.22cm)++(180:{\pingu@x@conicalhat@width/2+.05mm} and 1mm) coordinate (@) arc (180:360:{\pingu@x@conicalhat@width/2+.05mm} and 1mm) -- ++(.15mm,.3mm) to[bend right=5] ++(-\pingu@x@conicalhat@width/2, \pingu@x@conicalhat@height-.025cm) to[bend right=5] ([xshift=-.15mm,yshift=.3mm]@) -- cycle;
+\endpingu@layer
+
+\pingu@block[rounded corners=\pingu@x@conicalhat@rounding]{\pingu@color@conicalhat} (0,-.25cm)++(180:\pingu@x@conicalhat@width/2 and 1mm) coordinate (@) arc (180:0:\pingu@x@conicalhat@width/2 and 1mm) -- ++(.225mm,.6mm) to[bend right=5] ++(-\pingu@x@conicalhat@width/2, \pingu@x@conicalhat@height) to[bend right=5] ([xshift=-.225mm,yshift=.6mm]@) -- cycle;
+\endscope
+}
+
+\pingu@create@extra{spacehelmet}{%
+ space helmet/.default = pingu@black!45!white,
+ space helmet/.code = \pingu@set@extra{spacehelmet}{true}\pingu@color{spacehelmet}{#1},
+ space helmet glass/.code= \pingu@color{spacehelmet@glass}{#1},
+ space helmet glass opacity/.code = \def\pingu@x@spacehelmet@glass@opacity{#1},
+ space helmet position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@spacehelmet@angle{#1}\def\pingu@x@spacehelmet@xshift{#2}\def\pingu@x@spacehelmet@yshift{#3}\def\pingu@x@spacehelmet@scale{#4}},
+}{space helmet position={-2:(.35mm,0)1},space helmet glass=pingu@blue!40!pingu@yellow!50!white,space helmet glass opacity=.33}
+
+\newdimen\pingu@spacehelmet@w@half \pingu@spacehelmet@w@half=.935cm
+\newdimen\pingu@spacehelmet@h \pingu@spacehelmet@h=1.125cm
+\def\pingu@draw@ea@spacehelmet{%
+\scope[rotate around={\pingu@x@spacehelmet@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@spacehelmet@xshift,\pingu@x@spacehelmet@yshift)},scale=\pingu@x@spacehelmet@scale]
+\pingu@block[opacity=\pingu@x@spacehelmet@glass@opacity]{\pingu@color@spacehelmet@glass} (\pingu@name-head-center) ellipse [x radius=.9\pingu@spacehelmet@w@half, y radius=.45\pingu@spacehelmet@h];
+
+\pingu@block[/pingu/@draw=\pingu@color@spacehelmet,thick, even odd rule]{\pingu@color@spacehelmet}
+ ([yshift=-1mm]\pingu@name-wings-side-right) to[bend right=57] ([yshift=-1mm]\pingu@name-wings-side-left)
+ arc (0:180:\pingu@spacehelmet@w@half{} and \pingu@spacehelmet@h) -- cycle
+ (\pingu@name-head-center) ellipse [x radius=.9\pingu@spacehelmet@w@half, y radius=.45\pingu@spacehelmet@h];
+\endscope}
+
+\pingu@create@extra{witchhat}{%
+ witch hat/.code = \pingu@set@extra{witchhat}{true}\pingu@color{witchhat}{#1},
+ witch hat/.default = pingu@purple!40!black,
+ witch hat base/.code = \pingu@color{witchhat@base}{#1},
+ witch hat coronal/.code = \pingu@color{witchhat@coronal}{#1},
+ witch hat ribbon/.code = \pingu@color{witchhat@ribbon}{#1},
+ witch hat band/.code = \pingu@color{witchhat@band}{#1},
+ witch hat position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@witchhat@angle{#1}\def\pingu@x@witchhat@xshift{#2}\def\pingu@x@witchhat@yshift{#3}\def\pingu@x@witchhat@scale{#4}},
+}{witch hat position={-7:(.625mm,.45mm){1.15}},witch hat base=\pingu@color@witchhat,witch hat coronal=\pingu@color@witchhat!91!white,witch hat ribbon=\pingu@color@witchhat!87!white,witch hat band=!hide}
+
+\newdimen\pingu@witchhat@w@half \pingu@witchhat@w@half=1.125cm
+\newdimen\pingu@witchhat@h \pingu@witchhat@h=1.3cm
+\def\pingupathwitchhatupper{[rounded corners=.65mm](-.625cm,-.25cm) -- ++(.8cm,\pingu@witchhat@h-4.5mm) -- ++(6.5mm,4.5mm) -- ++(-1.5mm,-4.5mm) -- ++(-1.25mm,-\pingu@witchhat@h+4.5mm)}
+\def\pingu@draw@ea@witchhat{%
+\scope[rotate around={\pingu@x@witchhat@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@witchhat@xshift,\pingu@x@witchhat@yshift)},scale=\pingu@x@witchhat@scale]
+\pingu@draw[semithick]{\pingu@color@witchhat@band} (-.615cm,-.25cm) to[out=-100,in=180] ++(.5cm,-1.1cm) to[bend right=5] ++(3.5mm,.1mm) to[out=0,in=-78] ++(.433cm,1.1cm);
+\pingu@block[/pingu/@draw=\pingu@color@witchhat@coronal,thick]{\pingu@color@witchhat@base} (0,-.25cm)++(180:\pingu@witchhat@w@half{} and .15cm) arc (180:360:\pingu@witchhat@w@half{} and .15cm) arc (0:180:\pingu@witchhat@w@half{} and .115cm) -- cycle;
+\pingu@block{\pingu@color@witchhat} \pingupathwitchhatupper;
+\clip\pingupathwitchhatupper;
+\pingu@block{\pingu@color@witchhat@ribbon} (\z@,.2mm) ellipse [x radius=.95\pingu@witchhat@w@half, y radius=.12cm];
+\pingu@block{\pingu@color@witchhat} (\z@,.134cm) ellipse [x radius=.95\pingu@witchhat@w@half, y radius=.12cm];
+\endscope
+}
+
+
+\pingu@create@extra{mitra}{%
+ mitra/.default = pingu@red!67!pingu@black,%pingu@black!90!black,
+ mitra/.code = \pingu@set@extra{mitra}{true}\pingu@color{mitra}{#1},
+ mitra height/.code = {\def\pingu@x@mitra@height{#1}},
+ mitra background/.code = \pingu@color{mitra@background}{#1},
+ mitra overset/.code = {\def\pingu@x@mitra@overset{#1}},
+ mitra lower angle/.code = {\def\pingu@x@mitra@lowerangle{#1}},
+ mitra upper angle/.code = {\def\pingu@x@mitra@upperangle{#1}},
+ mitra lower band/.code = \pingu@color{mitra@lower@band}{#1},
+ mitra lower band height/.code = {\def\pingu@x@mitra@lowerband@height{#1}},
+ mitra upper band/.code = \pingu@color{mitra@upper@band}{#1},
+ mitra upper band height/.code = {\def\pingu@x@mitra@upperband@height{#1}},
+ mitra center band/.code = \pingu@color{mitra@center@band}{#1},
+ mitra center band width/.code = {\def\pingu@x@mitra@centerband@width{#1}},
+ mitra position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@mitra@angle{#1}\def\pingu@x@mitra@xshift{#2}\def\pingu@x@mitra@yshift{#3}\def\pingu@x@mitra@scale{#4}},
+}{mitra position={0:(0,0)1},mitra height=1.125cm,mitra overset=1.25mm,mitra lower angle=125,mitra upper angle=-35,mitra lower band=pingu@yellow!75!pingu@black,mitra center band=\pingu@color@mitra@lower@band,mitra lower band height=.2,mitra center band width={2*\pingu@x@mitra@lowerband@height},mitra upper band=\pingu@color@mitra@lower@band,mitra upper band height={1.5*\pingu@x@mitra@lowerband@height},mitra background=\pingu@color@mitra!80!pingu@black}
+
+\newdimen\pingu@mitra@w@half \pingu@mitra@w@half=.625cm
+\def\pingu@x@mitra@path{(0,-.2185cm)++(180:\pingu@mitra@w@half{} and .035cm) arc (180:360:\pingu@mitra@w@half{} and .035cm) [rounded corners=1pt] -- ++(\pingu@x@mitra@overset,.3*\pingu@x@mitra@height) to[out=\pingu@x@mitra@lowerangle,in=\pingu@x@mitra@upperangle] ++(-\pingu@x@mitra@overset-\pingu@mitra@w@half,.7*\pingu@x@mitra@height)
+to[out=180-\pingu@x@mitra@upperangle,in=180-\pingu@x@mitra@lowerangle] ++(-\pingu@x@mitra@overset-\pingu@mitra@w@half,-.7*\pingu@x@mitra@height) [sharp corners] -- cycle}
+\def\pingu@draw@ea@mitra{%
+\scope[rotate around={\pingu@x@mitra@angle:(\pingu@name-head-top)},shift={(\pingu@name-head-top)},shift={(\pingu@x@mitra@xshift,\pingu@x@mitra@yshift)},scale=\pingu@x@mitra@scale]
+\pingu@block{\pingu@color@mitra@background} (0,-.2185cm)++(180:\pingu@mitra@w@half{} and .035cm) arc (180:360:\pingu@mitra@w@half{} and .035cm) [rounded corners=1pt] -- ++(\pingu@x@mitra@overset,.3*\pingu@x@mitra@height) to[out=\pingu@x@mitra@lowerangle,in=\pingu@x@mitra@upperangle] ++(-\pingu@x@mitra@overset-\pingu@mitra@w@half-.66mm,.7*\pingu@x@mitra@height-.1mm)
+to[out=180-\pingu@x@mitra@upperangle+2,in=180-\pingu@x@mitra@lowerangle-2] ++(-\pingu@x@mitra@overset-\pingu@mitra@w@half+.66mm,-.7*\pingu@x@mitra@height+.1mm) [sharp corners] -- cycle;
+\pingu@block{\pingu@color@mitra} \pingu@x@mitra@path;
+% \pingu@block{\pingu@color@mitra} \pingupathmitraupper;
+\scope\clip\pingu@x@mitra@path;
+% TODO: switch to factors non relative to \pingu@x@mitra@overset
+\pingu@block{\pingu@color@mitra@lower@band} (0,-.2185cm)++(180:\pingu@mitra@w@half{} and .035cm) arc (180:360:\pingu@mitra@w@half{} and .035cm) -- ++(\pingu@x@mitra@lowerband@height*\pingu@x@mitra@overset,\pingu@x@mitra@lowerband@height*.3*\pingu@x@mitra@height) arc (0:-180:{\pingu@x@mitra@lowerband@height*\pingu@x@mitra@overset+\pingu@mitra@w@half} and .035cm) -- cycle;
+\pingu@block{\pingu@color@mitra@center@band} (\pingu@x@mitra@centerband@width*\pingu@x@mitra@overset+.1mm,-.2185cm) to[bend right=4] ++(0,\pingu@x@mitra@height) to[bend right] ++(-2*\pingu@x@mitra@centerband@width*\pingu@x@mitra@overset-.1mm,0) to[bend left=4] ++(0,-\pingu@x@mitra@height) -- cycle;
+\pingu@block{\pingu@color@mitra@upper@band} (0,.3*\pingu@x@mitra@height-.2185cm-0.5*\pingu@x@mitra@upperband@height*.3*\pingu@x@mitra@height)++(180:{\pingu@x@mitra@overset+\pingu@mitra@w@half} and .035cm) arc (180:360:{\pingu@x@mitra@overset+\pingu@mitra@w@half} and .035cm) -- ++(0,\pingu@x@mitra@upperband@height*.3*\pingu@x@mitra@height) arc (0:-180:{\pingu@x@mitra@overset+\pingu@mitra@w@half} and .035cm) -- cycle;
+\endscope\endscope}
+% #endregion
+
+% #region horse-lib
+\colorlet{base@a}{lightgray!95!black}
+\colorlet{base@b}{lightgray!79!black}
+
+\colorlet{a}{lightgray!63!black}
+\colorlet{b}{lightgray!81!black}
+\def\basew{12}
+\def\pingu@@horse@scale{.1}
+
+\def\pingu@@horse@@main{(1.275,.55) -- ++(\if@pingu@@horse@@donkey@.05\else.1\fi,.2) -- ++(\if@pingu@@horse@@donkey@-.2\else-.25\fi,.25) to[bend right=4] ++(-.425,1.75) to[bend left=15] ++(.05,.2) to[bend right=30] ++(-.1,1.9) to[bend left=30] ++(0,1.65) coordinate(@back) to[bend left=30] ++(2,.625) to[bend right=18,looseness=.8] ++(3.25,-.1) [rounded corners=2*\pingu@@horse@scale] coordinate(@hair) to[out=34,in=185] ++(3,1.3) to[bend left=19] coordinate[pos=.5](@ear) ++(.85,-.4) to[bend left=5] ++(.24,-.45) to[bend right=20] ++(\if@pingu@@horse@@donkey@.25\else0\fi,\if@pingu@@horse@@donkey@-1.2\else-.7\fi) to[bend left=2] ++(.1,-.55) to[out=-85,in=-60,looseness=.75] ++(\if@pingu@@horse@@donkey@-.55\else-.475\fi,\if@pingu@@horse@@donkey@-.45\else-.35\fi) coordinate(@mouth) to[out=-135,in=-120] ++(\if@pingu@@horse@@donkey@-.4\else-.37\fi,\if@pingu@@horse@@donkey@.2\else.25\fi) -- ++(0,.1)
+to[out=125,in=-68] ++(-.58,.615) coordinate (@mouth-low)
+to[out=215,in=80] ++(-1.25,-2) to[bend left=24] ++(-.65,-1) to[out=258,in=86] ++(-.42,-1.25) to[bend left=3] ++(-.2,-.6) to[bend right=10] ++(-.14,-1.15) to[bend left=2] coordinate[pos=.62] (@hooffront) ++(.355,-.565) to[bend left=15] ++(-.4,-.075) to[bend left=10] ++(-.28,.1) to[bend left=9] ++(.06,.3) to[bend right=9] ++(-.2,.4) to[out=80,in=-80] ++(.138,1.4) to[out=70,in=-103] ++(.2,1.3) to[bend right=10] ++(-.225,.44) coordinate (@frontleg) to[out=196,in=\if@pingu@@horse@@donkey@-65\else-25\fi] ++(-3.3,\if@pingu@@horse@@donkey@.4\else.575\fi) coordinate (@backleg) to[bend right=\if@pingu@@horse@@donkey@16\else10\fi] ++(-.8,\if@pingu@@horse@@donkey@-1.375\else-1.5\fi) to[bend right=\if@pingu@@horse@@donkey@9\else20\fi] ++(.1,-2.35) -- ++(\if@pingu@@horse@@donkey@.1\else.2\fi,-.25)
+coordinate (@hoofback) to[bend right=\if@pingu@@horse@@donkey@9\else8\fi] ++(.15,-.26) to[bend left=10] ++(\if@pingu@@horse@@donkey@-.66\else-.55\fi,\if@pingu@@horse@@donkey@-.15\else-.05\fi) -- cycle}
+
+% #1 is the wing for the color and key assignments
+\def\pingu@@drawer@horse#1{
+% this ensures all coordinates are set in place
+% i know this i inefficient, but atm this is of no greater
+% concern -- i can not use layers as they would clash with that
+% of the penguin and who wants that... no one does!
+% penguins deserve freedom!
+\path \pingu@@horse@@main;
+
+% no we draw "behind" the horse:
+
+% Sockel
+\csname if@pingu@x@horse@#1@base@\endcsname
+\pingu@block[draw=\csname pingu@color@horse#1@base@shade@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@base@shade\endcsname} (4.35-\basew/2,.433) -- ++(0,-.5) arc(180:360:\basew/2 and 1) -- ++(0,.5) arc(360:180:\basew/2 and 1);
+\pingu@block[draw=\csname pingu@color@horse#1@base@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@base\endcsname} (4.35,.433) ellipse[x radius=\basew/2,y radius=1];
+\fi
+% background front leg
+\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1\endcsname} [rounded corners=1*\pingu@@horse@scale](@frontleg) to[out=266,in=85] ++(.09,-.5) to[bend left=10] ++(-.15,-.8)
+to[bend right=7] ++(-.05,-.2) to[bend left=13] ++(-.2,-1.15) to[bend right=13] ++(.15,-.2) to[bend left=10] ++(-.07,-.3) to[bend right=100] ++(.45,-.1) to[bend right=10] coordinate[pos=0.08](@hooffront@) ([yshift=5mm,xshift=3mm]@frontleg) -- cycle;
+\pingu@block[draw=\csname pingu@color@horse#1@fr@hoof\endcsname!80!pingu@black,line width=2pt*\pingu@@horse@scale,rounded corners=.12]{\csname pingu@color@horse#1@fr@hoof\endcsname} (@hooffront@) to[bend left=2] ++(0,-.565*.665) to[bend left=59] ++(-.225,-.08) -- ++(-.02,.03) to[bend left=20] ++(-.315,.11) to[bend right=6] ++(.092,.2) to[bend right=25] cycle;
+% background back le0
+\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1\endcsname} [rounded corners=1*\pingu@@horse@scale](@backleg) to[out=-115,in=\if@pingu@@horse@@donkey@120\else130\fi] ++(-.3,-3.5) -- ++(.2,-.3) coordinate(@hoofback@) to[bend left] ++(-.5,-.1)
+-- ++(\if@pingu@@horse@@donkey@-.2\else-.05\fi,.15) -- ++(0,.15) to[bend left=\if@pingu@@horse@@donkey@45\else60\fi] cycle;
+\pingu@block[draw=\csname pingu@color@horse#1@br@hoof\endcsname!80!pingu@black,line width=2pt*\pingu@@horse@scale]{\csname pingu@color@horse#1@br@hoof\endcsname} (@hoofback@) to[bend right=\if@pingu@@horse@@donkey@9\else9\fi] ++(.206,-.265) to[bend left=10] ++(\if@pingu@@horse@@donkey@-.66\else-.55\fi,\if@pingu@@horse@@donkey@-.15\else-.05\fi) -- ++(-1.73mm,2.42mm) to[bend right=6] cycle;
+
+\if@pingu@@horse@@donkey@
+\pingu@block[draw=\csname pingu@color@horse#1@tail@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@tail\endcsname} [rounded corners=1*\pingu@@horse@scale](@back) to[out=215,in=95] ++(-.1,-2) to[out=270,in=92] ++(0,-.75) [sharp corners] to[bend right=20] coordinate[pos=.5] (@) ++(.15,0) to[bend right=10] cycle;
+% TODO: hide support
+%\node[draw=\csname pingu@color@horse#1@tail@draw\endcsname,fill=\csname pingu@color@horse#1@tail\endcsname,cloud,cloud puffs=30,cloud ignores aspect,scale=1.33*\pingu@@horse@scale,yshift=16mm,rotate=-5,line width=\@pingu@@horse@lw*\pingu@@horse@scale] at (@) {\rotatebox{90}{\phantom{A}\hskip7.5em}};
+\scope[rotate around={180:(@)}] % adapted from the broom
+\pingu@block[rounded corners=.44pt,draw=\csname pingu@color@horse#1@tail@draw\endcsname]{\csname pingu@color@horse#1@tail\endcsname} (@)++(-1mm,-2mm) to[out=115,in=240] ++(3mm,12.5mm) to[out=300,in=65] ([xshift=.95mm,yshift=-2mm]@) to[bend right=4] ([xshift=-.75mm,yshift=-2mm]@) -- cycle;
+\pingu@block[rounded corners=.44pt,draw=\csname pingu@color@horse#1@tail@draw\endcsname]{\csname pingu@color@horse#1@tail\endcsname} (@)++(-1mm,-2mm) to[out=115,in=240] coordinate[pos=.17] (@r) coordinate[pos=.19] (@r2) ++(-.75mm,10.5mm) to[out=300,in=65] ([xshift=.95mm,yshift=-2mm]@) to[bend right=4] ([xshift=-.75mm,yshift=-2mm]@) -- cycle;
+\pingu@block[rounded corners=.44pt,draw=\csname pingu@color@horse#1@tail@draw\endcsname]{\csname pingu@color@horse#1@tail\endcsname}(@)++(-.5mm,-1.5mm) to[out=115,in=240] ++(.5mm,12mm) to[out=300,in=65] ([xshift=.5mm,yshift=-1.5mm]@) -- cycle;
+\endscope
+\else
+\pingu@block[draw=\csname pingu@color@horse#1@tail@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@tail\endcsname} [rounded corners=1*\pingu@@horse@scale](@back) to[out=215,in=90] ++(-.4,-2.5) to[out=270,in=92] ++(0,-2.8) [sharp corners] to[bend right=20] ++(.6,0) to[bend right=10] cycle;
+\fi
+
+% back ear
+\if@pingu@@horse@@donkey@
+\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} ([xshift=.2mm,yshift=-1.5mm]@ear) to[bend left=20] ++(.373,1.465) coordinate(@) to[bend left=10] ++(-.15,-1.5);
+\else
+\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} ([xshift=.2mm,yshift=-1.5mm]@ear) to[bend left=20] ++(.373,.565) coordinate(@) to[bend left=10] ++(-.15,-.75);
\fi
+% and here comes the wheeee (imagine-horse-sound)
+\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1\endcsname} [rounded corners=1*\pingu@@horse@scale] \pingu@@horse@@main;
+
+\pingu@draw[line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@draw\endcsname} ([yshift=-.1mm]@mouth-low) to[bend left=12] ++(.06,.65);
+\pingu@draw[line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@mouth\endcsname} ([yshift=-.115mm]@mouth) -- ++(-.035,.225);
+
+\edef\pingu@tmp{\if@pingu@@horse@@donkey@4.5mm\else3.85mm\fi}%
+\edef\pingu@tmpb{\if@pingu@@horse@@donkey@3.65mm\else2.45mm\fi}%
+\pingu@draw[line width=\@pingu@@horse@lw*\pingu@@horse@scale,line join=round]{\csname pingu@color@horse#1@nose\endcsname} ([xshift=\pingu@tmp,yshift=\pingu@tmpb]@mouth) to[out=140,in=10] ++(-.17,-.074) to[bend right=49] cycle;
+
+\pingu@draw[line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@draw\endcsname} ([yshift=-.35mm]@frontleg) to[bend left=12] ++(.01,.325);
+\pingu@draw[line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@draw\endcsname} ([yshift=-.2mm]@backleg) to[bend right=13] ++(.25,.425);
+
+\if@pingu@@horse@@donkey@
+\pingu@block[draw=\csname pingu@color@horse#1@mane@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@mane\endcsname} [rounded corners=1*\pingu@@horse@scale](@hair) to[out=34,in=185] ++(3,1.3) to[bend left=10] ++(.415,-.1) -- ++(-.1,-.25) to[out=186,in=35] ([yshift=-4mm,xshift=1.5mm]@hair) -- cycle;
+
+\pingu@block[draw=\csname pingu@color@horse#1@thatch@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@thatch\endcsname} [rounded corners=1*\pingu@@horse@scale]([xshift=2.1mm,yshift=-1.05mm]@ear) -- ++(-.1,-.2) to[bend left=4] ++(.45,-.275) to[bend right=9] cycle;
+\else
+\pingu@block[draw=\csname pingu@color@horse#1@mane@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@mane\endcsname} [rounded corners=1*\pingu@@horse@scale](@hair) to[out=34,in=185] ++(3,1.3) to[bend left=10] ++(.415,-.1) -- ++(-.1,-.4) to[out=194,in=30] ([yshift=-11.5mm,xshift=1.5mm]@hair) -- cycle;
+
+\pingu@block[draw=\csname pingu@color@horse#1@thatch@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@thatch\endcsname} [rounded corners=1*\pingu@@horse@scale]([xshift=2mm,yshift=-1mm]@ear) -- ++(-.1,-.3275) to[bend left=4] ++(.455,-.175) to[bend right=9] cycle;
+\fi
+
+% ear
+\if@pingu@@horse@@donkey@
+\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} ([xshift=-1mm,yshift=-1mm]@ear) to[bend left=15] ++(.393,1.685) coordinate(@) to[bend right=17] ++(-.15,-1.8);
+\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} (@) to[bend right=17] ++(-.15,-1.8) to[bend right=14] cycle;
+\else
+\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} ([xshift=-.75mm,yshift=-1mm]@ear) to[bend left=20] ++(.393,.585) coordinate(@) to[bend right=10] ++(-.15,-.7);
+\pingu@block[draw=\csname pingu@color@horse#1@draw\endcsname,line width=\@pingu@@horse@lw*\pingu@@horse@scale]{\csname pingu@color@horse#1@ears\endcsname} (@) to[bend right=7] ++(-.15,-.7) to[bend right=14] cycle;
+\fi
+
+% the eye; this is no error it has draw as fill
+\pingu@block{\csname pingu@color@horse#1@eyes\endcsname} [rounded corners=.25*\pingu@@horse@scale] ([xshift=3mm,yshift=-7.5mm]@ear) to[bend right=20] ++(.125,-.2) to[bend right=50] ++(.1,.125) to[bend left=15] cycle;
+
+\pingu@block[draw=\csname pingu@color@horse#1@fl@hoof\endcsname!80!pingu@black,line width=2pt*\pingu@@horse@scale]{\csname pingu@color@horse#1@fl@hoof\endcsname} (@hooffront) to[bend left=2] ++(.355*.49,-.545*.49) to[bend left=11] ++(-.45-.295,-.05+0.033)to[bend right=2] ++(.046,.29) to[bend right=10] cycle;
+\pingu@block[draw=\csname pingu@color@horse#1@bl@hoof\endcsname!80!pingu@black,line width=2pt*\pingu@@horse@scale]{\csname pingu@color@horse#1@bl@hoof\endcsname} (@hoofback) to[bend right=\if@pingu@@horse@@donkey@9\else8\fi] ++(.15,-.26) to[bend left=10] ++(\if@pingu@@horse@@donkey@-.66\else-.55\fi,\if@pingu@@horse@@donkey@-.15\else-.05\fi) -- ++(-1.73mm,2.42mm) to[bend right=6] cycle; %to[bend left=2] ++(.355*.65,-.565*.65) to[bend left=15] ++(-.395,-.075) to[bend left=10] ++(-.293,.105) to[bend left=9] ++(.06,.3) to[bend left=5] cycle;
+}
+
+% universal switch for all three positions
+\newif\if@pingu@@horse@@donkey@
+
+\newif\if@pingu@x@horse@left@flip@
+\newif\if@pingu@x@horse@right@flip@
+\newif\if@pingu@x@horse@left@base@
+\newif\if@pingu@x@horse@right@base@
+\newif\if@pingu@x@horse@left@donkey@
+\newif\if@pingu@x@horse@right@donkey@
+\pingu@create@wing@extra{horse}{%
+ horse \@lr/.code = {\pingu@set@extra{horse\@lr}{true}\pingu@color{horse\@lr}{##1}},
+ horse \@lr/.default = pingu@bronze!80!pingu@black,
+ horse \@lr\space flip/.is if = @pingu@x@horse@\@lr @flip@,
+ horse \@lr\space donkey/.is if = @pingu@x@horse@\@lr @donkey@,
+ horse \@lr\space has base/.is if = @pingu@x@horse@\@lr @base@,
+ horse \@lr\space draw/.code = \pingu@color{horse\@lr @draw}{##1},%
+ horse \@lr\space line width/.code = \@namedef{pingu@horse\@lr @x@line@width}{##1},%
+ horse \@lr\space mane/.code = \pingu@color{horse\@lr @mane}{##1},%
+ horse \@lr\space mane draw/.code = \pingu@color{horse\@lr @mane@draw}{##1},%
+ horse \@lr\space thatch/.code = \pingu@color{horse\@lr @thatch}{##1},%
+ horse \@lr\space thatch draw/.code = \pingu@color{horse\@lr @thatch@draw}{##1},%
+ horse \@lr\space tail/.code = \pingu@color{horse\@lr @tail}{##1},%
+ horse \@lr\space tail draw/.code = \pingu@color{horse\@lr @tail@draw}{##1},%
+ horse \@lr\space eyes/.code = \pingu@color{horse\@lr @eyes}{##1},%
+ horse \@lr\space eye/.forward to = /pingu/horse \@lr\space eyes,%
+ horse \@lr\space mouth/.code = \pingu@color{horse\@lr @mouth}{##1},%
+ horse \@lr\space nose/.code = \pingu@color{horse\@lr @nose}{##1},%
+ horse \@lr\space ears/.code = \pingu@color{horse\@lr @ears}{##1},%
+ horse \@lr\space base/.code = \pingu@color{horse\@lr @base}{##1},%
+ horse \@lr\space base draw/.code = \pingu@color{horse\@lr @base@draw}{##1},%
+ horse \@lr\space base shade/.code = \pingu@color{horse\@lr @base@shade}{##1},%
+ horse \@lr\space base shade draw/.code = \pingu@color{horse\@lr @base@shade@draw}{##1},%
+ horse \@lr\space front left hoof/.code = \pingu@color{horse\@lr @fl@hoof}{##1},%
+ horse \@lr\space front right hoof/.code= \pingu@color{horse\@lr @fr@hoof}{##1},%
+ horse \@lr\space back left hoof/.code = \pingu@color{horse\@lr @bl@hoof}{##1},%
+ horse \@lr\space back right hoof/.code = \pingu@color{horse\@lr @br@hoof}{##1},%
+ horse \@lr\space front hoofs/.style = {/pingu/horse \@lr\space front left hoof=##1,/pingu/horse \@lr\space front right hoof=##1},
+ horse \@lr\space back hoofs/.style = {/pingu/horse \@lr\space back left hoof=##1,/pingu/horse \@lr\space back right hoof=##1},
+ horse \@lr\space hoofs/.style = {/pingu/horse \@lr\space front hoofs=##1,/pingu/horse \@lr\space back hoofs=##1},
+ horse \@lr\space hoofs/.default = gray!80!white,
+ % TODO: allow colors to be styles?
+ horse \@lr\space xshift/.code = \@namedef{pingu@x@horse\@lr @xshift}{##1},
+ horse \@lr\space yshift/.code = \@namedef{pingu@x@horse\@lr @yshift}{##1},
+ horse \@lr\space on base/.style ={/pingu/horse \@lr\space yshift=4cm},
+}{horse \@lr\space draw=\csname pingu@color@horse\@lr\endcsname!80!pingu@black,horse \@lr\space mane=\csname pingu@color@horse\@lr\endcsname!86!pingu@white,horse \@lr\space mane draw=\csname pingu@color@horse\@lr @mane\endcsname!80!pingu@black,horse \@lr\space eyes=\csname pingu@color@horse\@lr @draw\endcsname,horse \@lr\space mouth=\csname pingu@color@horse\@lr @draw\endcsname,horse \@lr\space nose=\csname pingu@color@horse\@lr @draw\endcsname,horse \@lr\space ears=\csname pingu@color@horse\@lr\endcsname,horse \@lr\space thatch=\csname pingu@color@horse\@lr @mane\endcsname,horse \@lr\space thatch draw=\csname pingu@color@horse\@lr @thatch\endcsname!80!pingu@black,horse \@lr\space tail=\csname pingu@color@horse\@lr @mane\endcsname,horse \@lr\space tail draw=\csname pingu@color@horse\@lr @tail\endcsname!80!pingu@black,horse \@lr\space has base=false,horse \@lr\space base=lightgray!90!black,horse \@lr\space base draw=\csname pingu@color@horse\@lr @base\endcsname!91!pingu@black,horse \@lr\space base shade=lightgray!80!black,horse \@lr\space base shade draw=\csname pingu@color@horse\@lr @base@shade\endcsname!91!pingu@black,horse \@lr\space xshift=0pt,horse \@lr\space yshift=0pt,horse \@lr\space flip=\ifx\@lr\pingu@str@wing@left true\else false\fi,horse \@lr\space donkey=false,horse \@lr\space line width=1.75pt,horse \@lr\space hoofs=\@pingu@none}
+
+\def\pingu@draw@wi@horse#1{%
+ \pingu@setup@wing{horse}{#1}%
+\scope[scale=\pingu@@horse@scale,every path/.append style={line cap=round, line join=round},shift=(\pingu@name-wing-#1),rotate around={\@angle-5:(\pingu@name-wing-#1)}]
+\csname if@pingu@x@horse@#1@flip@\endcsname
+\scope[xshift=-4cm-\csname pingu@x@horse#1@xshift\endcsname,yshift=-42mm+\csname pingu@x@horse#1@yshift\endcsname]
+\else
+\scope[xshift=4cm+\csname pingu@x@horse#1@xshift\endcsname,yshift=-42mm+\csname pingu@x@horse#1@yshift\endcsname,xscale=-1]
+\fi
+\csname if@pingu@x@horse@#1@donkey@\endcsname
+ \@pingu@@horse@@donkey@true
+\fi
+ \edef\@pingu@@horse@lw{\csname pingu@horse#1@x@line@width\endcsname}
+ \pingu@@drawer@horse{#1}
+ % TODO-SET: hoof
+\endscope\endscope
+}
+% todo: make statue extra
+% todo: make horse hat
+
+% to get on horse we create some kind of third wing item: 'on'
+% that will be used to initialize all of the colors and keys
+\newif\if@pingu@x@horse@on@flip@
+\newif\if@pingu@x@horse@on@base@
+\newif\if@pingu@x@horse@on@boundingbox@
+\newif\if@pingu@x@horse@on@donkey@
+% TODO: select keys
+% TODO: option so it does not affect the bounding box (default!)
+\pingu@create@extra{horseon}{%
+ on horse/.code = {\pingu@set@extra{horseon}{true}\pingu@color{horseon}{#1}},
+ on horse/.default = pingu@bronze!80!pingu@black,
+ horse behind/.style = {on horse=#1, on horse scale=.325, on horse yshift=6.15cm},
+ horse behind/.default = pingu@bronze!80!pingu@black,
+ on horse flip/.is if = @pingu@x@horse@on@flip@,
+ on horse donkey/.is if = @pingu@x@horse@on@donkey@,
+ on horse has base/.is if = @pingu@x@horse@on@base@,
+ on horse has bounding box/.is if = @pingu@x@horse@on@boundingbox@,
+ on horse draw/.code = \pingu@color{horseon@draw}{#1},%
+ on horse line width/.code = \@namedef{pingu@horseon@x@line@width}{#1},%
+ on horse mane/.code = \pingu@color{horseon@mane}{#1},%
+ on horse mane draw/.code = \pingu@color{horseon@mane@draw}{#1},%
+ on horse thatch/.code = \pingu@color{horseon@thatch}{#1},%
+ on horse thatch draw/.code = \pingu@color{horseon@thatch@draw}{#1},%
+ on horse tail/.code = \pingu@color{horseon@tail}{#1},%
+ on horse tail draw/.code = \pingu@color{horseon@tail@draw}{#1},%
+ on horse eyes/.code = \pingu@color{horseon@eyes}{#1},%
+ on horse eye/.forward to = /pingu/on horse eyes,%
+ on horse mouth/.code = \pingu@color{horseon@mouth}{#1},%
+ on horse nose/.code = \pingu@color{horseon@nose}{#1},%
+ on horse ears/.code = \pingu@color{horseon@ears}{#1},%
+ on horse base/.code = \pingu@color{horseon@base}{#1},%
+ on horse base draw/.code = \pingu@color{horseon@base@draw}{#1},%
+ on horse base shade/.code = \pingu@color{horseon@base@shade}{#1},%
+ on horse base shade draw/.code = \pingu@color{horseon@base@shade@draw}{#1},%
+ on horse front left hoof/.code = \pingu@color{horseon@fl@hoof}{#1},%
+ on horse front right hoof/.code = \pingu@color{horseon@fr@hoof}{#1},%
+ on horse back left hoof/.code = \pingu@color{horseon@bl@hoof}{#1},%
+ on horse back right hoof/.code = \pingu@color{horseon@br@hoof}{#1},%
+ on horse front hoofs/.style = {/pingu/on horse front left hoof=#1,/pingu/on horse front right hoof=#1},
+ on horse back hoofs/.style = {/pingu/on horse back left hoof=#1,/pingu/on horse back right hoof=#1},
+ on horse hoofs/.style = {/pingu/on horse front hoofs=#1,/pingu/on horse back hoofs=#1},
+ on horse hoofs/.default = gray!80!white,
+ on horse xshift/.code = \@namedef{pingu@x@horseon@xshift}{#1},
+ on horse yshift/.code = \@namedef{pingu@x@horseon@yshift}{#1},
+ on horse scale/.code = \@namedef{pingu@x@horseon@scale}{#1}
+}{on horse draw=\pingu@color@horseon!80!pingu@black,on horse mane=\pingu@color@horseon!86!pingu@white,on horse mane draw=\pingu@color@horseon@mane!80!pingu@black,on horse eyes=\pingu@color@horseon@draw,on horse mouth=\pingu@color@horseon@draw,on horse nose=\pingu@color@horseon@draw,on horse ears=\pingu@color@horseon,on horse thatch=\pingu@color@horseon@mane,on horse thatch draw=\pingu@color@horseon@thatch!80!pingu@black,on horse tail=\pingu@color@horseon@mane,on horse tail draw=\pingu@color@horseon@tail!80!pingu@black,on horse has base=false,on horse base=lightgray!90!black,on horse base draw=\pingu@color@horseon@base!91!pingu@black,on horse base shade=lightgray!80!black,on horse base shade draw=\pingu@color@horseon@base@shade!91!pingu@black,on horse xshift=0pt,on horse yshift=0pt,on horse flip=false,on horse scale=0.75,on horse has bounding box=false,on horse donkey=false,on horse line width=1.75pt,on horse hoofs=\@pingu@none}
+
+
+\def\pingu@draw@eb@horseon{%
+\pingu@layer{background}[scale=\pingu@x@horseon@scale,every path/.append style={line cap=round, line join=round},shift=(\pingu@name-bottom-center)]
+\if@pingu@x@horse@on@donkey@
+ \@pingu@@horse@@donkey@true
+\fi
+\if@pingu@x@horse@on@flip@
+ \scope[xshift=-45mm-\pingu@x@horseon@xshift,yshift=-67mm+\pingu@x@horseon@yshift,xscale=\if@pingu@x@horse@on@donkey@ 1.1\else1\fi,yscale=\if@pingu@@horse@@donkey@.9\else1\fi]
+ \else
+ \scope[xshift=45mm+\pingu@x@horseon@xshift,yshift=-67mm+\pingu@x@horseon@yshift,xscale=\if@pingu@x@horse@on@donkey@-1.1\else-1\fi,yscale=\if@pingu@@horse@@donkey@.9\else1\fi]
+ \fi
+\edef\@pingu@@horse@lw{\pingu@horseon@x@line@width}
+\if@pingu@x@horse@on@boundingbox@\else\pgfinterruptboundingbox\fi
+ \pingu@@drawer@horse{on}
+\if@pingu@x@horse@on@boundingbox@\else\endpgfinterruptboundingbox\fi
+\endscope\endpingu@layer
+}
+% #endregion
+
+% #region magic-lib
+\pingu@create@wing@extra{handcast}{%
+ handcast \@lr/.forward to = /pingu/hand cast \@lr,
+ hand cast \@lr/.code = {\pingu@set@extra{handcast\@lr}{true}\@namedef{pingu@handcast@\@lr}{##1}},
+ hand cast \@lr/.default = {X},
+ handcast \@lr\space color/.forward to = /pingu/hand cast \@lr\space color,
+ hand cast \@lr\space color/.code = \pingu@color{handcast@\@lr @color}{##1},%
+}{hand cast \@lr\space color=pingu@purple}
+\def\pingu@draw@wi@handcast#1{%
+ \pingu@setup@wing{handcast}{#1}%
+ \path[rotate around={\@angle:(\pingu@name-wing-#1)}] (\pingu@name-wing-#1)++(0,5mm) node[\csname pingu@color@handcast@#1@color\endcsname] {\@nameuse{pingu@handcast@#1}};
+}
+% #endregion
+
+% #region medieval-lib
+\newif\if@pingu@x@rook@draw@hatch@
+\pingu@create@extra{rook}{%
+ rook/.code = \pingu@set@extra{rook}{true}\pingu@color{rook}{#1},
+ rook/.default = pingu@silver,
+ rook back/.code = \pingu@color{rook@back}{#1},
+ rook hatch/.is if = @pingu@x@rook@draw@hatch@,
+ rook hatch/.default = true,
+ rook shade/.code = \pingu@color{rook@shade}{#1},
+}{rook back=\pingu@color@rook!85!black,rook shade=\pingu@color@rook!92!black,rook hatch}
+\def\pingu@draw@ea@rook{%
+\if@pingu@do@back@\else\if@pingu@x@rook@draw@hatch@\else\pingu@layer{foreground}[]\fi\fi
+ \pingu@block[even odd rule]{\pingu@color@rook} ([xshift=-.2mm]\pingu@name-wings-side-right|-\pingu@name-foot-right) [rounded corners=\p@] to[bend right=9] coordinate[pos=.15] (@tmpe) ([xshift=.2mm]\pingu@name-wings-side-left|-\pingu@name-foot-left) [sharp corners] to[bend right=1.5*\pingu@bend] (\pingu@name-wings-side-left|-\pingu@name-head-top) coordinate (@tmp) to[bend left=3] coordinate[pos=.3] (@tmpc) coordinate[pos=.7] (@tmpd) (\pingu@name-wings-side-right|-\pingu@name-head-top) [rounded corners=\p@] coordinate (@tmpb) to[bend right=1.5*\pingu@bend] cycle \if@pingu@x@rook@draw@hatch@ (\pingu@name-head-center) ellipse[x radius=.8\pingu@w@half, y radius=.45\pingu@w@half]\fi;
+ \pingu@block{\pingu@color@rook} (@tmp) to[bend right=2] ++(0,2mm) [rounded corners=.25mm] to[bend left=1] ++(-2mm,-.1mm) -- ++(0,-2.25mm);
+ \pingu@block{\pingu@color@rook} (@tmpb) to[bend left=2] ++(0,2mm) [rounded corners=.25mm] to[bend right=1] ++(2mm,-.1mm) -- ++(0,-2.25mm);
+
+ \pingu@block{\pingu@color@rook} (@tmpc)++(-2mm,-.25mm) [rounded corners=.25mm] to[bend left=2] ++(0,2.25mm) to[bend right=1] ++(4mm,.05mm) -- ++(0,-2.25mm);
+ \pingu@block{\pingu@color@rook} (@tmpd)++(2mm,-.25mm) [rounded corners=.25mm] to[bend left=2] ++(0,2.25mm) to[bend left=1] ++(-4mm,-.05mm) -- ++(0,-2.25mm);
+
+ % custom shade boi (or gurl, wateva)
+ \scope
+ \clip ([xshift=-.2mm]\pingu@name-wings-side-right|-\pingu@name-foot-right) [rounded corners=\p@] to[bend right=5] ([xshift=.2mm]\pingu@name-wings-side-left|-\pingu@name-foot-left) [sharp corners] to[bend right=1.5*\pingu@bend] (\pingu@name-wings-side-left|-\pingu@name-head-top) -- ++(0,2mm) to[bend left=3] (\pingu@name-wings-side-right|-\pingu@name-head-top) to[bend right=1.5*\pingu@bend] cycle;
+ \if@pingu@x@rook@draw@hatch@
+ \clip[/pingu/@invclip] (\pingu@name-head-center) ellipse[x radius=.8\pingu@w@half, y radius=.45\pingu@w@half];
+ \fi
+ \pingu@block{\pingu@color@rook@shade} (@tmpe) to[bend right=5] ([xshift=.2mm]@tmpe-|@tmp) to[bend right=1.5*\pingu@bend] ([yshift=2mm]@tmp) to[bend left=10] cycle;
+ \endscope
+ \if@pingu@do@back@\else\if@pingu@x@rook@draw@hatch@\else\endpingu@layer\fi\fi
+
+ \pingu@layer{background}[]
+ \pingu@block{\pingu@color@rook@back} (@tmp) to[bend right=3] coordinate[pos=.3] (@tmpc) coordinate[pos=.7] (@tmpd) (@tmpb) to[bend right=30] cycle;
+ \pingu@block{\pingu@color@rook@back} (@tmpb) to[bend left=2] ++(0,2mm) [rounded corners=.25mm] to[bend left=1] ++(2mm,.1mm) -- ++(0,-2.25mm);
+ \pingu@block{\pingu@color@rook@back} (@tmp) to[bend right=2] ++(0,2mm) [rounded corners=.25mm] to[bend right=1] ++(-2mm,.1mm) -- ++(0,-2.25mm);
+
+ \pingu@block{\pingu@color@rook@back} (@tmpc)++(-2mm,-.49mm) [rounded corners=.25mm] to[bend left=2] ++(0,2.25mm) to[bend right=1] ++(4mm,.05mm) -- ++(0,-2.25mm);
+ \pingu@block{\pingu@color@rook@back} (@tmpd)++(2mm,-.49mm) [rounded corners=.25mm] to[bend left=2] ++(0,2.25mm) to[bend left=1] ++(-4mm,-.05mm) -- ++(0,-2.25mm);
+ \endpingu@layer
+}
+
+\newif\if@pingu@x@crown@ddd@ % 3d
+\newif\if@pingu@x@crown@shade@ % 3d
+\pingu@create@extra{crown}{%
+ crown/.code = \pingu@set@extra{crown}{true}\pingu@color{crown}{#1},
+ crown/.default = pingu@yellow,
+ crown 3d/.is if = @pingu@x@crown@ddd@, crown 3d/.default = true,
+ crown 2d/.style = {crown=#1, crown 3d=false},
+ crown 2d/.default = pingu@yellow,
+ crown back/.code = \pingu@color{crown@back}{#1},
+ crown front bend/.code = \def\pingu@x@crown@f@bend{#1},
+ crown back bend/.code = \def\pingu@x@crown@b@bend{#1},
+ crown gem shade/.is if = @pingu@x@crown@shade@, crown gem shade/.default = true,
+ crown gem colors/.code n args = 7{\pingu@color{crown@gem@a}{#1}\pingu@color{crown@gem@b}{#2}\pingu@color{crown@gem@c}{#3}\pingu@color{crown@gem@d}{#4}\pingu@color{crown@gem@e}{#5}\pingu@color{crown@gem@f}{#6}\pingu@color{crown@gem@g}{#7}},
+ crown gem ring/.code = \pingu@color{crown@gem@ring}{#1},
+ crown position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@crown@angle{#1}\def\pingu@x@crown@xshift{#2}\def\pingu@x@crown@yshift{#3}\def\pingu@x@crown@scale{#4}},
+}{crown position={-9:(1mm,0mm)1},crown front bend=16,crown back bend=9,crown back=\pingu@color@crown!93!black,crown 3d,crown gem colors={pingu@purple}{pingu@blue}{pingu@green}{pingu@purple}{pingu@green}{pingu@blue}{pingu@purple},crown gem ring=\pingu@color@crown!85!white,crown gem shade}
+
+% color | bend1 | bend1
+\def\pingu@draw@ea@crown@s#1#2#3{
+\pingu@block{#1} [rounded corners=.2mm](-6.25mm,-.25cm) to[bend left=2] ++(0,3.125mm) to[bend #2=\pingu@x@crown@f@bend]
+ coordinate[pos=0] (r2) coordinate[pos=.07] (r1)
+ coordinate[pos=.14-.07] (a1) coordinate[pos=.14] (a2) coordinate[pos=.14+.07] (a3)
+ coordinate[pos=.30-.08] (b1) coordinate[pos=.30] (b2) coordinate[pos=.30+.08] (b3)
+ coordinate[pos=.50- .1] (c1) coordinate[pos=.50] (x2) coordinate[pos=.50+ .1] (c3)
+ coordinate[pos=.69-.08] (d1) coordinate[pos=.69] (d2) coordinate[pos=.69+.08] (d3)
+ coordinate[pos=.85-.07] (e1) coordinate[pos=.85] (e2) coordinate[pos=.85+.07] (e3)
+ coordinate[pos=1] (l2) coordinate[pos=.93] (l1)
+ ++(1.375cm,0) to[bend left=2] ++(0,-3.125mm) to[bend #3=\pingu@x@crown@f@bend] (-6mm,-.25cm) -- cycle;
+\path (x2)++(0,.9mm) coordinate (c2);
+\@for\a:={a,b,c,d,e}\do{
+ \pingu@block{#1} ([yshift=-.1mm]\a1) to[bend right=\pingu@x@crown@f@bend] ([yshift=-.1mm]\a3) to[bend right=2] ([yshift=1.85mm]\a2) to[bend right=2] ([yshift=-.1mm]\a1) -- cycle;
+}
+\pingu@block{#1} (l2)++(0,-.2mm) to[bend right=2] ++(0,1.95mm) -- (l1) -- cycle;
+\pingu@block{#1} (r2)++(0,-.2mm) to[bend left=2] ++(0,1.95mm) -- (r1) -- cycle;
+}
+
+% color | at | shift | scale
+\def\pingu@draw@ea@crown@g#1#2#3#4{
+\scope[shift={(#22)},shift={(#3,-.33mm)}]
+ \pingu@block{\pingu@color@crown@gem@ring} ellipse [x radius=.715mm*#4, y radius=.925mm*#4];
+ \pingu@block{#1} ellipse [x radius=.633mm*#4, y radius=.85mm*#4];
+ \protected@edef\@tmp{#1}\ifx\@tmp\@pingu@none\else
+ \if@pingu@x@crown@shade@
+ \shade[ball color=#1,fill opacity=.45,shading angle=-95] ellipse [x radius=.633mm*#4, y radius=.85mm*#4];
+ \else
+ \pingu@block[rotate around={7:(42:.3mm*#4 and .4mm*#4)}]{#1!45!pingu@white} (42:.3mm*#4 and .4mm*#4) ellipse[x radius=.17mm*#4, y radius=.24mm*#4];
+ \pingu@block[rotate around={7:(232:.275mm*#4 and .35mm*#4)}]{#1!45!pingu@white} (232:.275mm*#4 and .35mm*#4) ellipse[x radius=.06mm*#4, y radius=.085mm*#4];
+ \fi\fi
+\endscope
+}
+\def\pingu@draw@ea@crown{%
+\scope[rotate around={\pingu@x@crown@angle:(\pingu@name-head-top)},%
+ shift={(\pingu@name-head-top)},
+ shift={(\pingu@x@crown@xshift,\pingu@x@crown@yshift)},
+ scale=\pingu@x@crown@scale]
+% draw front
+\if@pingu@x@crown@ddd@
+ \pingu@draw@ea@crown@s{\pingu@color@crown}{right}{left}
+ \def\@tmpa{.05mm}\def\@tmpb{.025mm}
+\else
+ \pingu@draw@ea@crown@s{\pingu@color@crown}{left}{right}
+ \def\@tmpa{-.015mm}\def\@tmpb{-.035mm}
+\fi
+% draw the emeralds
+\pingu@draw@ea@crown@g{\pingu@color@crown@gem@b}{a}{-\@tmpa}1
+\pingu@draw@ea@crown@g{\pingu@color@crown@gem@c}{b}{-\@tmpb}1
+\pingu@draw@ea@crown@g{\pingu@color@crown@gem@d}{x}{\z@}{1.35}
+\pingu@draw@ea@crown@g{\pingu@color@crown@gem@e}{d}{\@tmpb}1
+\pingu@draw@ea@crown@g{\pingu@color@crown@gem@f}{e}{\@tmpa}1
+\pingu@layer{background}[]
+\pingu@block{\pingu@color@crown@gem@a} (r2)++(0,-.33mm) ellipse [x radius=.3mm, y radius=.8mm];
+\pingu@block{\pingu@color@crown@gem@ring} (r2)++(0,-.33mm) ellipse [x radius=.1mm, y radius=.885mm];
+\pingu@block{\pingu@color@crown@gem@g} (l2)++(0,-.33mm) ellipse [x radius=.3mm, y radius=.8mm];
+\pingu@block{\pingu@color@crown@gem@ring} (l2)++(0,-.33mm) ellipse [x radius=.1mm, y radius=.885mm];
+% draw back if 3d
+\if@pingu@x@crown@ddd@
+ \pingu@draw@ea@crown@s{\pingu@color@crown@back}{left}{right}
+\fi
+\endpingu@layer
+\endscope
+}
+
+\newif\if@pingu@x@princesscrown@ddd@
+\newif\if@pingu@x@princesscrown@shade@
+\newif\if@pingu@x@princesscrown@bobbles@
+\pingu@create@extra{princesscrown}{%
+ princess crown/.code = \pingu@set@extra{princesscrown}{true}\pingu@color{princesscrown}{#1},
+ princess crown/.default = pingu@yellow,
+ princess crown 3d/.is if= @pingu@x@princesscrown@ddd@, princess crown 3d/.default = true,
+ princess crown 2d/.style = {princess crown=#1, princess crown 3d=false},
+ princess crown 2d/.default = pingu@yellow,
+ princess crown back/.code = \pingu@color{princesscrown@back}{#1},
+ princess crown front bend/.code = \def\pingu@x@princesscrown@f@bend{#1},
+ princess crown back bend/.code = \def\pingu@x@princesscrown@b@bend{#1},
+ princess crown gem shade/.is if = @pingu@x@princesscrown@shade@,
+ princess crown bobbles/.is if = @pingu@x@princesscrown@bobbles@,
+ princess crown gem shade/.default = true,
+ princess crown gem colors/.code n args = 5{\pingu@color{princesscrown@gem@a}{#1}\pingu@color{princesscrown@gem@b}{#2}\pingu@color{princesscrown@gem@c}{#3}\pingu@color{princesscrown@gem@d}{#4}\pingu@color{princesscrown@gem@e}{#5}},
+ princess crown gem ring/.code = \pingu@color{princesscrown@gem@ring}{#1},
+ princess crown position/.code args = {#1:(#2,#3)#4}{\def\pingu@x@princesscrown@angle{#1}\def\pingu@x@princesscrown@xshift{#2}\def\pingu@x@princesscrown@yshift{#3}\def\pingu@x@princesscrown@scale{#4}},
+}{princess crown position={-9:(1mm,0mm)1},princess crown front bend=12,princess crown back bend=7,princess crown back=\pingu@color@princesscrown!93!black,princess crown 3d,princess crown gem colors={pingu@purple}{pingu@blue}{pingu@green}{pingu@blue}{pingu@purple},princess crown gem ring=\pingu@color@princesscrown!85!white,princess crown gem shade,princess crown bobbles}
+
+% color | bend1 | bend2
+\def\pingu@draw@ea@princesscrown@s#1#2#3{
+\pingu@block{#1} [rounded corners=.2mm](-3.25mm,-.15cm) to[bend left=2] ++(0,2.32mm) to[bend #2=\pingu@x@princesscrown@f@bend]
+ coordinate[pos=0] (r2) coordinate[pos=.065] (r1)
+ coordinate[pos=.11] (a1) coordinate[pos=.2] (a2) coordinate[pos=.29] (a3)
+ coordinate[pos=.35] (b1) coordinate[pos=.50] (x2) coordinate[pos=.65] (b3)
+ coordinate[pos=.71] (c1) coordinate[pos=.8] (c2) coordinate[pos=.89] (c3)
+ coordinate[pos=1] (l2) coordinate[pos=.93] (l1)
+ ++(8mm,0) to[bend left=2] ++(0,-2.32mm) to[bend #3=\pingu@x@princesscrown@f@bend] (-3mm,-.15cm) -- cycle;
+\path (x2)++(0,.9mm) coordinate (b2);
+\@for\a:={a,b,c}\do{
+ \pingu@block{#1} ([yshift=-.1mm]\a1) to[bend right=\pingu@x@princesscrown@f@bend] ([yshift=-.1mm]\a3) to[bend left=2] ([yshift=2.15mm]\a2) to[bend left=2] ([yshift=-.1mm]\a1) -- cycle;
+ \if@pingu@x@princesscrown@bobbles@\pingu@block{#1} ([yshift=2.15mm]\a2) circle [radius=.45\p@];\fi
+}
+\pingu@block{#1} (l2)++(0,-.2mm) to[bend left=2] ++(0,2.25mm) -- (l1) -- cycle;
+\pingu@block{#1} (r2)++(0,-.2mm) to[bend right=2] ++(0,2.25mm) -- (r1) -- cycle;
+\if@pingu@x@princesscrown@bobbles@\pingu@block{#1} (l2)++(0,2.05mm) circle [radius=.45\p@];
+\pingu@block{#1} (r2)++(0,2.05mm) circle [radius=.45\p@];\fi
+}
+
+% draw single gem; color | at | shift | scale
+\def\pingu@draw@ea@princesscrown@g#1#2#3#4{
+\scope[shift={(#22)},shift={(#3,-.33mm)}]
+ \pingu@block{\pingu@color@princesscrown@gem@ring} ellipse [x radius=.715mm*#4, y radius=.925mm*#4];
+ \pingu@block{#1} ellipse [x radius=.633mm*#4, y radius=.85mm*#4];
+ \protected@edef\@tmp{#1}\ifx\@tmp\@pingu@none\else
+ \if@pingu@x@princesscrown@shade@
+ \shade[ball color=#1,fill opacity=.45,shading angle=-95] ellipse [x radius=.633mm*#4, y radius=.85mm*#4];
+ \else
+ \pingu@block[rotate around={7:(42:.3mm*#4 and .4mm*#4)}]{#1!45!pingu@white} (42:.3mm*#4 and .4mm*#4) ellipse[x radius=.17mm*#4, y radius=.24mm*#4];
+ \pingu@block[rotate around={7:(232:.275mm*#4 and .35mm*#4)}]{#1!45!pingu@white} (232:.275mm*#4 and .35mm*#4) ellipse[x radius=.06mm*#4, y radius=.085mm*#4];
+ \fi\fi
+\endscope}
+\def\pingu@draw@ea@princesscrown{%
+\scope[rotate around={\pingu@x@princesscrown@angle:(\pingu@name-head-top)},%
+ shift={(\pingu@name-head-top)},
+ shift={(\pingu@x@princesscrown@xshift,\pingu@x@princesscrown@yshift)},
+ scale=\pingu@x@princesscrown@scale]
+% draw front
+\if@pingu@x@princesscrown@ddd@
+ \pingu@draw@ea@princesscrown@s{\pingu@color@princesscrown}{right}{left}
+ \def\@tmpa{.05mm}
+\else
+ \pingu@draw@ea@princesscrown@s{\pingu@color@princesscrown}{left}{right}
+ \def\@tmpa{-.015mm}
+\fi
+% draw the emaralds
+\pingu@draw@ea@princesscrown@g{\pingu@color@princesscrown@gem@b}{a}{-\@tmpa}{.95}
+\pingu@draw@ea@princesscrown@g{\pingu@color@princesscrown@gem@c}{x}{\z@}{1.3}
+\pingu@draw@ea@princesscrown@g{\pingu@color@princesscrown@gem@d}{c}{\@tmpa}{.95}
+\pingu@layer{background}[]
+\pingu@block{\pingu@color@princesscrown@gem@a} (r2)++(0,-.33mm) ellipse [x radius=.3mm, y radius=.8mm];
+\pingu@block{\pingu@color@princesscrown@gem@ring} (r2)++(0,-.33mm) ellipse [x radius=.1mm, y radius=.885mm];
+\pingu@block{\pingu@color@princesscrown@gem@e} (l2)++(0,-.33mm) ellipse [x radius=.3mm, y radius=.8mm];
+\pingu@block{\pingu@color@princesscrown@gem@ring} (l2)++(0,-.33mm) ellipse [x radius=.1mm, y radius=.885mm];
+% draw back if 3d
+\if@pingu@x@princesscrown@ddd@
+ \pingu@draw@ea@princesscrown@s{\pingu@color@princesscrown@back}{left}{right}
+\fi
+\endpingu@layer
+\endscope
+}
+% #endregion
+
+% #region movement-lib
+\pingu@bodytype@add{tilt-right}{%
+\pingu@block[save path=\pingu@lowerpingu]{\pingu@color@body@main} (0,\pingu@outer@off)
+% left side
+to[bend right=\pingu@bend] coordinate[pos=.775] (\pingu@name-waist-right) ++(0,-\pingu@side@h@half-\pingu@outer@off)
+% feety stuff
+arc (180:270:\pingu@foot@outer@w{}-1mm and \pingu@foot@outer@h) coordinate[yshift=-.2mm] (\pingu@name-foot-right)
+arc (270:332:\pingu@foot@inner@w{}+1mm and 2.5*\pingu@foot@inner@h)
+coordinate (\pingu@name-bottom-center)
+arc (208:270:\pingu@foot@inner@w{} and 1.25*\pingu@foot@inner@h) coordinate[yshift=-.4mm] (\pingu@name-foot-left)
+arc (270:360:\pingu@foot@outer@w{} and 1.125*\pingu@foot@outer@h)%
+% right side
+to[bend right=\pingu@bend] coordinate[pos=.225] (\pingu@name-waist-left) ++(0,\pingu@side@h@half+\pingu@outer@off)
+% coordinate
+coordinate (\pingu@name-wings-side-left)
+-- (0,\pingu@outer@off) coordinate (\pingu@name-wings-side-right) coordinate[pos=.5] (\pingu@name-head-center) -- cycle;
+
+\pingu@block[save path=\pingu@upperpingu]{\pingu@color@body@head} (\pingu@name-head-center)
+++(0,\pingu@head@h@half) coordinate (\pingu@name-head-top)
+arc(90:450:\pingu@w@half{} and \pingu@head@h@half)
+coordinate[pos=\pinguanglehr] (\pingu@name-head-right)
+coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
+
+\coordinate (\pingu@name-belly-back) at (\pingu@w@half,-1cm);
+\coordinate (\pingu@name-belly-center) at (\pingu@w@half,-.68\pingu@side@h@half);
+\pingu@block[save path=\pingu@whitepingu]{\pingu@color@body@front} (\pingu@name-belly-back)++(-\pingu@w@half+\pingu@one,\pingu@lower@off) to[bend right=.8\pingu@bend] ++(-.05mm,1.05cm-\pingu@side@h@half-\pingu@lower@off) arc (180:270:3.7mm and 2mm) arc (270:331:5mm and 3*.85mm) arc (207:270:5.3mm and 1.125*.85mm) arc (270:360:4.025mm and 1.25*2mm) to[bend right=.8\pingu@bend] ++(0,\pingu@side@h@half-1.05cm+\pingu@lower@off) arc (0:180:\pingu@w@half-.96mm and \pingu@w@half-\pingu@one) -- cycle;
+
+\coordinate (\pingu@name-eye-back-right) at ([xshift=-.275cm,yshift=.25cm-\pingu@outer@off]\pingu@name-head-center);
+\coordinate (\pingu@name-eye-back-left) at ([xshift=.275cm,yshift=.25cm-\pingu@outer@off]\pingu@name-head-center);
+
+\coordinate (\pingu@name-head-back-con-right) at ([xshift=-\pingu@headcon@x,yshift=-\pingu@headcon@y]\pingu@name-eye-back-right);
+\coordinate (\pingu@name-head-back-con-left) at ([xshift=\pingu@headcon@x,yshift=-\pingu@headcon@y]\pingu@name-eye-back-left);
+
+\pingu@block{\pingu@color@body@front} (\pingu@name-eye-back-right)++(0,-.25mm) ellipse [x radius=.525cm,y radius=.625cm];
+\pingu@block{\pingu@color@body@front} (\pingu@name-eye-back-left)++(0,-.25mm) ellipse [x radius=.525cm,y radius=.625cm];
+}
+
+
+\pingu@bodytype@add{tilt-left}{%
+\pingu@block[save path=\pingu@lowerpingu]{\pingu@color@body@main} (0,\pingu@outer@off)
+% left side
+to[bend right=\pingu@bend] coordinate[pos=.775] (\pingu@name-waist-right) ++(0,-\pingu@side@h@half-\pingu@outer@off)
+% feety stuff
+arc (180:270:\pingu@foot@outer@w{}-1mm and 1.25*\pingu@foot@outer@h) coordinate[yshift=-.2mm] (\pingu@name-foot-right)
+arc (270:332:\pingu@foot@inner@w{}+1mm and 1.125*\pingu@foot@inner@h)
+coordinate (\pingu@name-bottom-center)
+arc (208:270:\pingu@foot@inner@w{} and 2.5*\pingu@foot@inner@h) coordinate[yshift=-.4mm] (\pingu@name-foot-left)
+arc (270:360:\pingu@foot@outer@w{} and \pingu@foot@outer@h)%
+% right side
+to[bend right=\pingu@bend] coordinate[pos=.225] (\pingu@name-waist-left) ++(0,\pingu@side@h@half+\pingu@outer@off)
+% coordinate
+coordinate (\pingu@name-wings-side-left)
+-- (0,\pingu@outer@off) coordinate (\pingu@name-wings-side-right) coordinate[pos=.5] (\pingu@name-head-center) -- cycle;
+
+\pingu@block[save path=\pingu@upperpingu]{\pingu@color@body@head} (\pingu@name-head-center)
+++(0,\pingu@head@h@half) coordinate (\pingu@name-head-top)
+arc(90:450:\pingu@w@half{} and \pingu@head@h@half)
+coordinate[pos=\pinguanglehr] (\pingu@name-head-right)
+coordinate[pos=\pinguanglehl] (\pingu@name-head-left);
+
+\coordinate (\pingu@name-belly-back) at (\pingu@w@half,-1cm);
+\coordinate (\pingu@name-belly-center) at (\pingu@w@half,-.68\pingu@side@h@half);
+\pingu@block[save path=\pingu@whitepingu]{\pingu@color@body@front} (\pingu@name-belly-back)++(-\pingu@w@half+\pingu@one,\pingu@lower@off) to[bend right=.8\pingu@bend] ++(-.05mm,1.05cm-\pingu@side@h@half-\pingu@lower@off) arc (180:270:4.025mm and 1.25*2mm) arc (270:331:5.25mm and 1.125*.85mm) arc (207:270:5mm and 3*.85mm) arc (270:360:3.75mm and 2mm) to[bend right=.8\pingu@bend] ++(0,\pingu@side@h@half-1.05cm+\pingu@lower@off) arc (0:180:\pingu@w@half-.96mm and \pingu@w@half-\pingu@one) -- cycle;
+
+\coordinate (\pingu@name-eye-back-right) at ([xshift=-.275cm,yshift=.25cm-\pingu@outer@off]\pingu@name-head-center);
+\coordinate (\pingu@name-eye-back-left) at ([xshift=.275cm,yshift=.25cm-\pingu@outer@off]\pingu@name-head-center);
+
+\coordinate (\pingu@name-head-back-con-right) at ([xshift=-\pingu@headcon@x,yshift=-\pingu@headcon@y]\pingu@name-eye-back-right);
+\coordinate (\pingu@name-head-back-con-left) at ([xshift=\pingu@headcon@x,yshift=-\pingu@headcon@y]\pingu@name-eye-back-left);
+
+\pingu@block{\pingu@color@body@front} (\pingu@name-eye-back-right)++(0,-.25mm) ellipse [x radius=.525cm,y radius=.625cm];
+\pingu@block{\pingu@color@body@front} (\pingu@name-eye-back-left)++(0,-.25mm) ellipse [x radius=.525cm,y radius=.625cm];
+}
+% #endregion
+
+% #region safe-lib
+\pingu@create@extra{mask}{%
+ mask/.code = {\pingu@set@extra{mask}{true}\pingu@color{mask}{#1}},
+ mask/.default = pingu@white!61!gray,%
+ mask band/.code = \pingu@color{mask@band}{#1},%
+ mask line width/.code = \def\pingu@x@mask@line@width{#1},%
+ mask band inner/.code = \pingu@color{mask@band@inner}{#1},%
+ mask band outer/.code = \pingu@color{mask@band@outer}{#1}%
+}{mask band=\pingu@color@body@main, mask band inner=\pingu@color@mask@band!60!\pingu@color@mask, mask band outer=\pingu@color@mask@band!82!\pingu@color@mask,mask line width=.565pt}
+
+\def\pingu@draw@ea@mask{%
+\pingu@block{\pingu@color@mask} [rounded corners=.8mm] ([xshift=-5mm,yshift=.75mm]\pingu@name-bill) coordinate (@ul) [rounded corners=.1mm]-- ++(3.5mm,.55mm) to[bend left=3] ++(3mm,0) -- ++(3.5mm,-.55mm) coordinate (@ur) -- ++(0,-4.25mm)[rounded corners=.8mm] coordinate (@lr) -- ++(-3.5mm,-.45mm) to[bend left=3] ++(-3mm,0) [rounded corners=.1mm] -- ++(-3.5mm,.45mm) coordinate (@ll) -- cycle;
+\scope
+\clip[use path=\pingu@upperpingu];
+\pingu@draw[line width=\pingu@x@mask@line@width]{\pingu@color@mask@band} ([yshift=-.1mm,xshift=.2mm]@ul) to[bend left=3] ([yshift=-1.1mm]\pingu@name-wings-side-right);
+\pingu@draw[line width=\pingu@x@mask@line@width]{\pingu@color@mask@band} ([yshift=-.1mm,xshift=-.2mm]@ur) to[bend right=3] ([yshift=-1.1mm]\pingu@name-wings-side-left);
+\endscope\scope
+\clip[use path=\pingu@lowerpingu];
+\pingu@draw[line width=\pingu@x@mask@line@width]{\pingu@color@mask@band} ([yshift=.01mm,xshift=.2mm]@ll) to[bend left=3] ([yshift=2mm]\pingu@name-wing-right-start);
+\pingu@draw[line width=\pingu@x@mask@line@width]{\pingu@color@mask@band} ([yshift=.01mm,xshift=-.2mm]@lr) to[bend right=3] ([yshift=2mm]\pingu@name-wing-left-start);
+\endscope
+% TODO: fix this sloppy overwrite
+\pingu@block{\pingu@color@mask} [rounded corners=.8mm] ([xshift=-5mm,yshift=.75mm]\pingu@name-bill) coordinate (@ul) [rounded corners=.1mm]-- ++(3.5mm,.55mm) to[bend left=3] ++(3mm,0) -- ++(3.5mm,-.55mm) coordinate (@ur) -- ++(0,-4.25mm)[rounded corners=.8mm] coordinate (@lr) -- ++(-3.5mm,-.45mm) to[bend left=3] ++(-3mm,0) [rounded corners=.1mm] -- ++(-3.5mm,.45mm) coordinate (@ll) -- cycle;
+\pingu@draw[very thin]{\pingu@color@mask@band@inner} ([xshift=-5mm,yshift=.75mm-4.25mm/2]\pingu@name-bill) to[bend right=1] ++(10mm,0);
+\foreach \i/\b/\c in {1.6mm/very thin/\pingu@color@mask@band@inner,.8mm/very thin/\pingu@color@mask@band@inner,0mm//\pingu@color@mask@band@outer} {
+\pingu@draw[\b]{\c} [rounded corners=.8mm] ([xshift=-5mm,yshift=.75mm-\i]\pingu@name-bill) [rounded corners=.1mm]-- ++(3.5mm,.55mm) to[bend left=3] ++(3mm,0) -- ++(3.5mm,-.55mm) -- ++(0,-4.25mm+2*\i)[rounded corners=.8mm] -- ++(-3.5mm,-.45mm) to[bend left=3] ++(-3mm,0) [rounded corners=.1mm] -- ++(-3.5mm,.45mm) -- cycle;
+}
+}
+% #endregion
+
+% #region science-fiction
+\newif\if@pingu@x@lightsaber@glow@left
+\newif\if@pingu@x@lightsaber@glow@right
+\newif\if@pingu@x@lightsaber@double@left
+\newif\if@pingu@x@lightsaber@double@right
+\def\pingu@x@saberglow@w@half{.9mm}
+\def\pingulightsaberfactor{.013}
+\pingu@create@wing@extra{lightsaber}{%
+ lightsaber \@lr/.code = {\pingu@set@extra{lightsaber\@lr}{true}\pingu@color{lightsaber\@lr}{##1}},
+ lightsaber \@lr/.default = pingu@blue,
+ lightsaber \@lr\space handle/.code = \pingu@color{lightsaber\@lr @handle}{##1},%
+ lightsaber \@lr\space deco/.code = \pingu@color{lightsaber\@lr @deco}{##1},%
+ lightsaber \@lr\space ribbs/.code = \pingu@color{lightsaber\@lr @ribbs}{##1},%
+ lightsaber \@lr\space button/.code = \pingu@color{lightsaber\@lr @button}{##1},%
+ lightsaber \@lr\space button b/.code = \pingu@color{lightsaber\@lr @button@b}{##1},%
+ lightsaber \@lr\space color b/.code = \pingu@color{lightsaber\@lr @color@b}{##1},%
+ lightsaber \@lr\space length/.code = {\@namedef{pingu@x@lightsaber@length@\@lr}{##1}},%
+ lightsaber \@lr\space length b/.code = {\@namedef{pingu@x@lightsaber@length@b@\@lr}{##1}},%
+ lightsaber \@lr\space yshift/.code = {\@namedef{pingu@x@lightsaber@yshift@\@lr}{##1}},%
+ lightsaber \@lr\space glow/.is if = @pingu@x@lightsaber@glow@\@lr,%
+ lightsaber \@lr\space double/.is if = @pingu@x@lightsaber@double@\@lr,%
+ lightsaber \@lr\space glow core/.code = \pingu@color{lightsaber\@lr @glow@core}{##1},%
+ lightsaber \@lr\space solid/.style = {/pingu/lightsaber \@lr\space glow=false},
+ lightsaber \@lr\space disabled/.style = {/pingu/lightsaber \@lr\space solid,/pingu/lightsaber \@lr=\@pingu@none},
+ lightsaber \@lr\space outer glow factor/.code = {\@namedef{pingu@x@lightsaber@ogf@\@lr}{##1}}%
+}{lightsaber \@lr\space handle=pingu@silver, lightsaber \@lr\space deco=pingu@silver!12!pingu@black, lightsaber \@lr\space button=pingu@red!85!pingu@black,lightsaber \@lr\space button b=pingu@red!85!pingu@black, lightsaber \@lr\space ribbs=pingu@silver!50!pingu@black,lightsaber \@lr\space length=2cm,lightsaber \@lr\space glow=\ifpengu@setup@glows@ true\else false\fi,lightsaber \@lr\space glow core=white,lightsaber \@lr\space outer glow factor=\pingulightsaberfactor,lightsaber \@lr\space yshift=0pt,lightsaber \@lr\space length b=\csname pingu@x@lightsaber@length@\@lr\endcsname,lightsaber \@lr\space color b=\noexpand\@col}
+
+% #region lightsaber base
+\def\pingu@draw@wi@lightsaber@base#1{%
+% deco-elements
+ % base
+ \pingu@block{\csname pingu@color@lightsaber#1@deco\endcsname}(\pingu@name-wing-#1)++(-.4mm,2.65mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) -- ++(0,-5mm) -- ++(.8mm,0) |- cycle;
+ \if@pingu@wing@item@side@left@
+ % ribbs; single path saves memory :D
+ \pingu@block{\csname pingu@color@lightsaber#1@ribbs\endcsname}(\pingu@name-wing-#1)++(-.40mm,2.225mm+\csname pingu@x@lightsaber@yshift@#1\endcsname)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -| ++(.8mm,-.165mm) -- ++(-.8mm,0)
+ arc(90:270:.075mm) -- ++(.8mm,0) |- cycle;
+ % button
+ \pingu@block{\csname pingu@color@lightsaber#1@button@b\endcsname}(\pingu@name-wing-#1)++(.49mm,-1.75mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) ellipse [x radius=.1mm, y radius=.3mm];
+ \pingu@block{\csname pingu@color@lightsaber#1@button\endcsname}(\pingu@name-wing-#1)++(.49mm,1.9mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) ellipse [x radius=.1mm, y radius=.3mm];
+ % cover
+ \pingu@block{\csname pingu@color@lightsaber#1@handle\endcsname}(\pingu@name-wing-#1)++(-.5mm,2.65mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) arc(180:90:.15mm) -- ++(.7mm,0) arc(90:0:.16mm) -- ++(0,-5mm) arc(360:270:.15mm) -- ++(-.7mm,0) arc (270:180:.15mm) -- ++(0,.25mm) arc(270:360:.33mm and .2mm) -- ++(0,4.1mm) arc(0:90:.33mm and .2mm) -- ++(0,.25mm) -- cycle;
+ \else
+ % ribbs; single path saves memory :D (the second)
+ \pingu@block{\csname pingu@color@lightsaber#1@ribbs\endcsname}(\pingu@name-wing-#1)++(.40mm,2.225mm+\csname pingu@x@lightsaber@yshift@#1\endcsname)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -| ++(-.8mm,-.165mm) -- ++(.8mm,0)
+ arc(90:-90:.075mm) -- ++(-.8mm,0) |- cycle;
+ % buttons
+ \pingu@block{\csname pingu@color@lightsaber#1@button@b\endcsname}(\pingu@name-wing-#1)++(-.49mm,-1.75mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) ellipse [x radius=.1mm, y radius=.3mm];
+ \pingu@block{\csname pingu@color@lightsaber#1@button\endcsname}(\pingu@name-wing-#1)++(-.49mm,1.9mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) ellipse [x radius=.1mm, y radius=.3mm];
+ % cover
+ \pingu@block{\csname pingu@color@lightsaber#1@handle\endcsname}(\pingu@name-wing-#1)++(.5mm,2.65mm+\csname pingu@x@lightsaber@yshift@#1\endcsname) arc(0:90:.15mm) -- ++(-.7mm,0) arc(90:180:.16mm) -- ++(0,-5mm) arc(180:270:.15mm) -- ++(.7mm,0) arc (270:360:.15mm) -- ++(0,.25mm) arc(270:180:.33mm and .2mm) -- ++(0,4.1mm) arc(180:90:.33mm and .2mm) -- ++(0,.25mm) -- cycle;
+ \fi
+}
+% #endregion
+% #1 wing, #2 yshift, #3 angle, #4 length, #5 color
+\def\pingu@draw@wi@lightsaber@pre#1#2#3#4#5{
+ \scope[rotate around={#3:(\pingu@name-wing-#1)}]
+ \csname if@pingu@x@lightsaber@glow@#1\endcsname
+ \@for\i:={0,2,4,6,7,8,9,10,11,12,13,14,15,16,17}\do{
+ \pingu@block[fill opacity=\ifnum\i>14 .225\else.1\fi*\i/20]{#5} (\pingu@name-wing-#1)++(-\pingu@x@saberglow@w@half+\i*\i mm/440,#2) -- ++(.05mm,#4) arc(180:0:\pingu@x@saberglow@w@half-.05mm-\i*\i mm/440 and \ifnum\i>14 .85mm\else\pingu@one\fi-\i mm/30) -- ++(.05mm,-#4) arc (0:-180:\pingu@x@saberglow@w@half-\i*\i mm/440 and .35mm);
+ }
+ \else % draw solid
+ \pingu@block{#5} (\pingu@name-wing-#1)++(-.425mm,#2-.1mm) -- ++(.05mm,#4) arc(180:0:.375mm and .375mm) -- ++(.05mm,-#4) arc (0:-180:.425mm and .05mm);
+ \fi
+ \endscope
+}
+
+% #1 wing, #2 yshift, #3 angle, #4 length, #5 color
+\def\pingu@draw@wi@lightsaber@post#1#2#3#4#5{
+ \scope[rotate around={#3:(\pingu@name-wing-#1)}]
+ \csname if@pingu@x@lightsaber@glow@#1\endcsname
+ \ifdim\csname pingu@x@lightsaber@ogf@#1\endcsname pt>\z@
+ \pingu@layer{foreground}[]
+ \pgfinterruptboundingbox
+ \path[clip,/pingu/@invclip] (\pingu@name-wing-#1)++(-.275mm,#2-.1mm) -- ++(.1mm,#4) arc(180:0:.175mm and .25mm) -- ++(.1mm,-#4) arc (0:-180:.275mm and .065mm);
+ \@for\i:={1,1.1,1.2,1.3,1.4}\do{
+ \pingu@block[fill opacity=\csname pingu@x@lightsaber@ogf@#1\endcsname/\i]{#5} (\pingu@name-wing-#1) ++(.05mm,#2+#4/2) circle[radius=\i*#4];
+ }
+ \endpgfinterruptboundingbox
+ \endpingu@layer
+ \fi
+ % fadings had a rotation angle bug
+ \@for\i:={1,2}\do{
+ \pingu@block[fill opacity=.125*\i/10]{#5} (\pingu@name-wing-#1)++(-\pingu@x@saberglow@w@half+\i*\i mm/440,#2) -- ++(.05mm,#4) arc(180:0:\pingu@x@saberglow@w@half-.05mm-\i*\i mm/440 and \pingu@one-\i mm/30) -- ++(.05mm,-#4) arc (0:-180:\pingu@x@saberglow@w@half-\i*\i mm/440 and .35mm);
+ }
+ \pingu@block{\csname pingu@color@lightsaber#1@glow@core\endcsname} (\pingu@name-wing-#1)++(-.275mm,#2-.1mm) -- ++(.1mm,#4) arc(180:0:.175mm and .25mm) -- ++(.1mm,-#4) arc (0:-180:.275mm and .065mm);
+ \fi
+ \endscope
+}
+
+% #1 wing
+\def\pingu@draw@wi@lightsaber#1{%
+ \pingu@setup@wing{lightsaber}{#1}%
+ \scope[rotate around={\@angle:([yshift=+\csname pingu@x@lightsaber@yshift@#1\endcsname]\pingu@name-wing-#1)},xscale=1.2]
+ \pingu@draw@wi@lightsaber@pre{#1}{2.9mm+\csname pingu@x@lightsaber@yshift@#1\endcsname}{0}{\csname pingu@x@lightsaber@length@#1\endcsname}{\@col}
+ \csname if@pingu@x@lightsaber@double@#1\endcsname
+ \pingu@draw@wi@lightsaber@pre{#1}{2.65mm-\csname pingu@x@lightsaber@yshift@#1\endcsname}{180}{\csname pingu@x@lightsaber@length@b@#1\endcsname}{\csname pingu@color@lightsaber#1@color@b\endcsname}
+ \fi
+ \pingu@draw@wi@lightsaber@base{#1}
+ % afterglow (whuile watching everglow :D)
+ \pingu@draw@wi@lightsaber@post{#1}{2.9mm+\csname pingu@x@lightsaber@yshift@#1\endcsname}{0}{\csname pingu@x@lightsaber@length@#1\endcsname}{\@col}
+ \csname if@pingu@x@lightsaber@double@#1\endcsname
+ \pingu@draw@wi@lightsaber@post{#1}{2.65mm-\csname pingu@x@lightsaber@yshift@#1\endcsname}{180}{\csname pingu@x@lightsaber@length@b@#1\endcsname}{\csname pingu@color@lightsaber#1@color@b\endcsname}
+ \fi
+ \endscope
+}
+
+
+\newif\if@pingu@x@lightstaff@glow@left
+\newif\if@pingu@x@lightstaff@glow@right
+\pingu@create@wing@extra{lightstaff}{%
+ light-staff \@lr/.code = {\pingu@set@extra{lightstaff\@lr}{true}\pingu@color{lightstaff\@lr}{##1}},
+ light-staff \@lr/.default = pingu@green,
+ light-staff \@lr\space length/.code =\expandafter\def\csname pingu@lightstaff@\@lr @length\endcsname{##1},
+ light-staff \@lr\space glow length/.code =\expandafter\def\csname pingu@lightstaff@\@lr @glow@length\endcsname{##1},
+ light-staff \@lr\space head/.code = \pingu@color{lightstaff\@lr}{##1},%
+ light-staff \@lr\space staff/.code = \pingu@color{lightstaff@\@lr @staff}{##1},%
+ light-staff \@lr\space core/.code = \pingu@color{lightstaff@\@lr @head@core}{##1},%
+ light-staff \@lr\space core width/.code = \expandafter\def\csname pingu@lightstaff@\@lr @core@width\endcsname{##1},%
+ light-staff \@lr\space glow/.is if = @pingu@x@lightstaff@glow@\@lr,%
+ light-staff \@lr\space outer glow factor/.code = {\@namedef{pingu@x@lightstaff@ogf@\@lr}{##1}},%
+}{light-staff \@lr\space length=28mm,light-staff \@lr\space staff=pingu@bronze,light-staff \@lr\space head=pingu@green,light-staff \@lr\space core=pingu@white,light-staff \@lr\space glow=\ifpengu@setup@glows@ true\else false\fi,light-staff \@lr\space outer glow factor=.022,light-staff \@lr\space glow length=13mm,light-staff \@lr\space core width=.44mm}
+\def\pingu@draw@wi@lightstaff#1{%
+ \pingu@setup@wing{lightstaff}{#1}%
+\scope[rotate around={\@angle:(\pingu@name-wing-#1)}]
+ \pingu@block{\csname pingu@color@lightstaff@#1@staff\endcsname}(\pingu@name-wing-#1)++(\@sidesign*-.2mm,-11mm) -- ++(0,\csname pingu@lightstaff@#1@length\endcsname) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-lightstaff-#1-top) -- ++(0,-\csname pingu@lightstaff@#1@length\endcsname) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
+ \pingu@draw@wi@lightstaff@pre{#1}{[yshift=-1.1mm]\pingu@name-lightstaff-#1-top}{\@col}
+ \pingu@block{\csname pingu@color@lightstaff@#1@head@core\endcsname} ([yshift=-1.1mm]\pingu@name-lightstaff-#1-top) -- ++(-\csname pingu@lightstaff@#1@core@width\endcsname,1mm) -- ++(0,2mm) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname,1mm) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname,-1mm) -- ++(0,-2mm) -- cycle;
+ \pingu@draw@wi@lightstaff@post{#1}{[yshift=-1.1mm]\pingu@name-lightstaff-#1-top}{\@col}
+\endscope
+}
+
+% #1 wing, #2 start, #3 color
+\def\pingu@draw@wi@lightstaff@pre#1#2#3{
+\csname if@pingu@x@lightstaff@glow@#1\endcsname
+\@for\i:={0,1,2,3,6,7,9,10,13}\do{
+ \pingu@block[fill opacity=\ifnum\i>14 .225\else.1\fi*\i/20]{#3} (#2)++(0,-\i mm/15) -- ++(-\csname pingu@lightstaff@#1@core@width\endcsname-\i mm/30,1mm+\i mm/30) -- ++(0,2mm+\i mm/15) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname+\i mm/30,1mm+\i mm/30) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname+\i mm/30,-1mm-\i mm/30) -- ++(0,-2mm-\i mm/15) -- cycle;
+ % -- ++(.05mm,#4) arc(180:0:\pingu@x@saberglow@w@half-.05mm-\i*\i mm/440 and \ifnum\i>14 .85mm\else\pingu@one\fi-\i mm/30) -- ++(.05mm,-#4) arc (0:-180:\pingu@x@saberglow@w@half-\i*\i mm/440 and .35mm);
+}
+\else % draw solid
+ \pingu@block{#3} (#2) -- ++(-.55mm,1mm) -- ++(0,2mm) -- ++(.55mm,1mm) -- ++(.55mm,-1mm) -- ++(0,-2mm) -- cycle;
+\fi
+}
+
+\def\pingu@draw@wi@lightstaff@post#1#2#3{
+\csname if@pingu@x@lightstaff@glow@#1\endcsname
+\ifdim\csname pingu@x@lightstaff@ogf@#1\endcsname pt>\z@
+\pingu@layer{foreground}[]
+\pgfinterruptboundingbox
+\@for\i:={1,1.1,1.2,1.3,1.4}\do{
+ \pingu@block[fill opacity=\csname pingu@x@lightstaff@ogf@#1\endcsname/\i]{#3} (#2)++(0,2mm) circle[radius=\i*\csname pingu@lightstaff@#1@glow@length\endcsname];
+}
+\endpgfinterruptboundingbox
+\pingu@block[opacity=.65]{\csname pingu@color@lightstaff@#1@head@core\endcsname} (#2)++(0,.5mm) -- ++(-.20mm,.75mm) -- ++(0,1.5mm) -- ++(.20mm,.75mm) -- ++(.20mm,-.75mm) -- ++(0,-1.5mm) -- cycle;
+\endpingu@layer
+\fi
+% fadings hat a rotation angle bug
+\@for\i:={1,2}\do{
+ \pingu@block[fill opacity=.125*\i/10]{#3} (#2)++(0,-\i mm/15+2mm) -- ++(-\csname pingu@lightstaff@#1@core@width\endcsname-\i mm/30,1mm+\i mm/30) -- ++(0,2mm+\i mm/15) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname+\i mm/30,1mm+\i mm/30) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname+\i mm/30,-1mm-\i mm/30) -- ++(0,-2mm-\i mm/15) -- cycle;
+}
+\pingu@block{\csname pingu@color@lightstaff@#1@head@core\endcsname} (#2) -- ++(-\csname pingu@lightstaff@#1@core@width\endcsname,1mm) -- ++(0,2mm) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname,1mm) -- ++(\csname pingu@lightstaff@#1@core@width\endcsname,-1mm) -- ++(0,-2mm) -- cycle;
+\fi
+}
+% #endregion
+
+% #region shirts-lib
+\newif\if@pingu@shirt@above
+\pingu@create@extra{shirt}{%
+ shirt/.code = \pingu@set@extra{shirt}{true}\pingu@color{shirt}{#1},
+ shirt/.default = pingu@bronze,
+ shirt above/.is if = @pingu@shirt@above,
+ shirt raise/.code = \def\pingu@shirt@raise{#1},
+ shirt padding/.code = \def\pingu@shirt@padding{#1},
+ shirt button top/.code = \pingu@color{shirt@button@top}{#1},
+ shirt button middle/.code = \pingu@color{shirt@button@middle}{#1},
+ shirt button bottom/.code = \pingu@color{shirt@button@bottom}{#1},
+ shirt buttons/.style = {/pingu/shirt button top={#1}, /pingu/shirt button middle={#1}, /pingu/shirt button bottom={#1}},
+ shirt button top shade/.code = \pingu@color{shirt@button@top@shade}{#1},
+ shirt button middle shade/.code = \pingu@color{shirt@button@middle@shade}{#1},
+ shirt button bottom shade/.code = \pingu@color{shirt@button@bottom@shade}{#1},
+ shirt buttons shade/.style = {/pingu/shirt button top shade={#1}, /pingu/shirt button middle shade={#1}, /pingu/shirt button bottom shade={#1}},
+ shirt without buttons/.forward to=/pingu/shirt no buttons,
+ shirt no buttons/.style = {/pingu/shirt buttons=\@pingu@none, /pingu/shirt buttons shade=\@pingu@none},
+}{shirt buttons=pingu@black,shirt padding=0mm,shirt button top shade=\pingu@color@shirt@button@top!70!\pingu@color@shirt!70!white,shirt button middle shade=\pingu@color@shirt@button@middle!70!\pingu@color@shirt!70!white,shirt button bottom shade=\pingu@color@shirt@button@bottom!70!\pingu@color@shirt!70!white,shirt raise=2.25mm,shirt above=false}
+\def\pingu@draw@cloth@shirt@behind{}
+
+\def\pingu@draw@cloth@shirt@middle{\if@pingu@shirt@above\else\pingu@draw@cloth@shirt@main\fi}
+
+\def\pingu@draw@cloth@shirt@main{%
+\coordinate (\pingu@name-shirt-low) at ([yshift=\pingu@shirt@raise]\pingu@name-belly-center);
+\pingu@block{\pingu@color@shirt} [rounded corners=.131mm] ([xshift=.2mm,yshift=.18mm]\pingu@name-head-back-con-right) -- (\pingu@name-shirt-low) -- ([xshift=-.1mm,yshift=.24mm]\pingu@name-head-back-con-left) to[bend left=12] (\pingu@name-waist-left) to[bend left=3] ([xshift=\pingu@shirt@padding]\pingu@name-bottom-center-|\pingu@name-waist-left) to[bend left=10] ([yshift=-1.1\pingu@one]\pingu@name-bottom-center) to[bend left=10] ([xshift=-\pingu@shirt@padding]\pingu@name-bottom-center-|\pingu@name-waist-right) to[bend left=3] (\pingu@name-waist-right) to[bend left=12] (\pingu@name-head-back-con-right) -- cycle;
+
+\coordinate (\pingu@name-shirt-bt) at ([yshift=-\pingu@one]\pingu@name-shirt-low);
+\pingu@block{\pingu@color@shirt@button@top}(\pingu@name-shirt-bt) circle[radius=.4mm];
+\pingu@block{\pingu@color@shirt@button@middle}(\pingu@name-shirt-bt)++(0,-1.35mm)circle[radius=.4mm];
+\pingu@block{\pingu@color@shirt@button@bottom}(\pingu@name-shirt-bt)++(0,2*-1.35mm)circle[radius=.4mm];
+\pingu@block[even odd rule]{\pingu@color@shirt@button@top@shade}(\pingu@name-shirt-bt) circle[radius=.4mm] circle[radius=.465mm];
+\pingu@block[even odd rule]{\pingu@color@shirt@button@middle@shade}(\pingu@name-shirt-bt)++(0,-1.35mm)circle[radius=.4mm] circle[radius=.465mm];
+\pingu@block[even odd rule]{\pingu@color@shirt@button@bottom@shade}(\pingu@name-shirt-bt)++(0,2*-1.35mm)circle[radius=.4mm] circle[radius=.465mm];
+\@for\i:={0,90,180,270}\do{
+ \pingu@block{\pingu@color@shirt@button@top@shade} (\pingu@name-shirt-bt)++(\i:.
+ 25mm) circle[radius=.065mm];
+ \pingu@block{\pingu@color@shirt@button@middle@shade} (\pingu@name-shirt-bt)++(0,-1.35mm)++(\i:.25mm) circle[radius=.065mm];
+ \pingu@block{\pingu@color@shirt@button@bottom@shade} (\pingu@name-shirt-bt)++(0,2*-1.35mm)++(\i:.25mm) circle[radius=.065mm];
+}}
+
+% TODO: if flags to draw parts
+\def\pingu@draw@cloth@shirt{\if@pingu@shirt@above\pingu@draw@cloth@shirt@main\fi}
+
+\pingu@create@extra{secondshirt}{%
+ second shirt/.code = \pingu@set@extra{secondshirt}{true}\pingu@color{secondshirt}{#1},
+ second shirt raise/.code = \def\pingu@secondshirt@raise{#1},
+ second shirt neck/.code = \pingu@color{secondshirt@neck}{#1},
+ second shirt/.default = purple,
+}{second shirt raise=3.35mm,second shirt neck=\pingu@color@secondshirt!32!pingu@white}
+\def\pingu@draw@cloth@secondshirt@behind{}
+
+\def\pingu@draw@cloth@secondshirt@middle{%
+\coordinate (\pingu@name-secondshirt-low) at ([yshift=\pingu@secondshirt@raise]\pingu@name-belly-center);
+\pingu@block{\pingu@color@secondshirt} [rounded corners=.131mm] ([xshift=.2mm,yshift=.05mm]\pingu@name-head-back-con-right) -- (\pingu@name-secondshirt-low) -- ([xshift=-.16mm,yshift=.09mm]\pingu@name-head-back-con-left) to[bend left=12] (\pingu@name-waist-left) to[bend left=3] ([xshift=-.22mm]\pingu@name-bottom-center-|\pingu@name-waist-left) to[bend left=10] ([yshift=-1\pingu@one]\pingu@name-bottom-center) to[bend left=10] ([xshift=.22mm]\pingu@name-bottom-center-|\pingu@name-waist-right) to[bend left=3] (\pingu@name-waist-right) to[bend left=12] (\pingu@name-head-back-con-right) -- cycle;
+\pingu@draw{\pingu@color@secondshirt@neck} [rounded corners=.131mm] ([xshift=.025mm,yshift=-.09mm]\pingu@name-head-back-con-right) -- ([xshift=.2mm,yshift=.05mm]\pingu@name-head-back-con-right) -- (\pingu@name-secondshirt-low) -- ([xshift=-.19mm,yshift=.09mm]\pingu@name-head-back-con-left) -- ([xshift=-.02mm,yshift=-.02mm]\pingu@name-head-back-con-left);
+}
+
+% TODO: if flags to draw parts
+\def\pingu@draw@cloth@secondshirt{%
+}
+% #endregion
+
+% #region signs-lib
+\pingu@create@wing@extra{signpost}{%
+ signpost \@lr/.forward to = /pingu/sign post \@lr,
+ sign post \@lr/.code = {\pingu@set@extra{signpost\@lr}{true}\@namedef{pingu@signpost@\@lr}{##1}},
+ sign post \@lr/.default = {},
+ signpost \@lr\space color/.forward to = /pingu/sign post \@lr\space color,
+ sign post \@lr\space color/.code = \pingu@color{signpost\@lr}{##1},
+ signpost \@lr\space fontcolor/.forward to = /pingu/sign post \@lr\space font color,
+ sign post \@lr\space font color/.code = \pingu@color{signpost\@lr @font}{##1},
+}{sign post \@lr\space color=brown!70!black, sign post \@lr\space font color=white!90!brown}
+\def\pingu@draw@wi@signpost#1{%
+ \pingu@setup@wing{signpost}{#1}%
+ \def\@rot{\if@pingu@wing@item@side@left@-5\else+5\fi}%
+\scope[rotate around={\@angle+\@rot:(\pingu@name-wing-#1)}]
+ \pingu@block[thick]{\@col}(\pingu@name-wing-#1)++(\@sidesign*-.225mm,-2mm) -- ++(0,15mm) arc(180:0:\@sidesign*.45mm and .375mm) -- ++(0,-15mm) arc(360:180:\@sidesign*.45mm and .375mm) -- cycle;
+ \path (\pingu@name-wing-#1)++(\@sidesign*.225mm,13mm) node[fill=\@col,rounded corners=2\p@,minimum width=14mm,minimum height=8mm,align=center,rotate=\@angle+\@rot,text=\csname pingu@color@signpost#1@font\endcsname] {\csname pingu@signpost@#1\endcsname};
+\endscope
+}
+
+\pingu@create@extra{banner}{%
+ banner/.code = \pingu@set@extra{banner}{true}\@namedef{pingu@banner}{#1},
+ banner/.default = Bannertext,
+ banner band/.code = \pingu@color{banner@band}{#1},
+ banner text color/.code = \pingu@color{banner@text@color}{#1},
+ banner sticks color/.style={/pingu/banner stick left color=#1,/pingu/banner stick right color=#1},
+ banner stick left color/.code = \pingu@color{banner@stick@left}{#1},
+ banner stick right color/.code = \pingu@color{banner@stick@right}{#1},
+ banner sticks length/.style={/pingu/banner stick left length=#1,/pingu/banner stick right length=#1},
+ banner stick left length/.code = \@namedef{pingu@banner@stick@left@l}{#1},
+ banner stick right length/.code = \@namedef{pingu@banner@stick@right@l}{#1},
+ banner raise/.code = \@namedef{pingu@banner@raise}{#1},
+ banner height/.code = \@namedef{pingu@banner@height}{#1},
+ banner font/.code = \@namedef{pingu@banner@font}{#1},
+ banner bent/.code = \@namedef{pingu@banner@bent}{#1}
+}{banner band=pingu@white!91!pingu@black,banner text color=pingu@black,banner sticks color=pingu@bronze,banner stick left length=20mm, banner stick right length=20mm,banner bent=30,banner raise=-1mm,banner height=4mm,banner font=\bfseries}
+
+\usetikzlibrary{decorations.text}
+\def\pingu@draw@ea@banner{%
+\pingu@setup@wing{staff}{left}% we do not need the staff color, but we will use it
+\scope[rotate around={\@angle:(\pingu@name-wing-left)}]
+ \pingu@block{\pingu@color@banner@stick@left}(\pingu@name-wing-left)++(\@sidesign*-.2mm,-7mm) -- ++(0,\pingu@banner@stick@left@l) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-s-left) -- ++(0,-\pingu@banner@stick@left@l) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
+ \path (\pingu@name-s-left)++(.5mm,\pingu@banner@height) coordinate (\pingu@name-s-left-top) ++(0,-2*\pingu@banner@height) coordinate (\pingu@name-s-left-bot);
+\endscope
+\pingu@setup@wing{staff}{right}% we do not need the staff color, but we will use it
+\scope[rotate around={\@angle:(\pingu@name-wing-right)}]
+ \pingu@block{\pingu@color@banner@stick@right}(\pingu@name-wing-right)++(\@sidesign*-.2mm,-7mm) -- ++(0,\pingu@banner@stick@right@l) arc(180:0:\@sidesign*.4mm and .3mm) coordinate[pos=.5] (\pingu@name-s-right) -- ++(0,-\pingu@banner@stick@right@l) arc(360:180:\@sidesign*.4mm and .3mm) -- cycle;
+ \path (\pingu@name-s-right)++(-.5mm,\pingu@banner@height) coordinate (\pingu@name-s-right-top) ++(0,-2*\pingu@banner@height) coordinate (\pingu@name-s-right-bot);
+\endscope
+\pingu@block[rounded corners=.3mm]{\pingu@color@banner@band} (\pingu@name-s-left-top) to[bend right=\pingu@banner@bent] (\pingu@name-s-right-top) -- (\pingu@name-s-right-bot) to[bend left=\pingu@banner@bent] (\pingu@name-s-left-bot) -- cycle;
+\path[postaction={decorate},decoration={text color=\pingu@color@banner@text@color,text along path, raise=\pingu@banner@raise, text={|\pingu@banner@font|\pingu@banner},text align={center,left indent=1mm,right indent=1mm}}] (\pingu@name-s-right) to[bend left=\pingu@banner@bent+3] (\pingu@name-s-left);
+}
+% #endregion
+
+% #region sport-lib
+\pingu@create@extra{medal}{%
+ medal/.code = {\pingu@set@extra{medal}{true}\pingu@color{medal}{#1}},
+ medal/.default = pingu@yellow,%
+ gold medal/.style = {medal, medal text=#1}, gold medal/.default={1},
+ silver medal/.style = {medal=pingu@silver, medal text=#1}, silver medal/.default={2},
+ bronze medal/.style = {medal=pingu@bronze, medal text=#1}, bronze medal/.default={3},
+ medal band/.code = \pingu@color{medal@band}{#1},%
+ medal shade/.code = \pingu@color{medal@shade}{#1},%
+ medal shade width/.code = \def\pingu@medal@shade@w{#1},%
+ medal text/.code = \def\pingu@x@medal@text{#1},%
+ medal text style/.style = {\pingu@color@medal!65!pingu@white},
+}{medal band=pingu@red,medal text={},medal shade={\pingu@color@medal!65!pingu@white},medal shade width=.75\p@}
+
+\def\pingu@draw@eb@medal{%
+\coordinate (\pingu@name-medal-center) at ([yshift=1.25mm]\pingu@name-belly-center);
+\pingu@block{\pingu@color@medal@band} [rounded corners=.15mm] (\pingu@name-head-back-con-right) -- (\pingu@name-medal-center) -- (\pingu@name-head-back-con-left) to[bend left=11] ++(-1.35mm,-.5mm) -- ([yshift=.7mm]\pingu@name-medal-center) -- ([xshift=1.35mm,yshift=-.5mm]\pingu@name-head-back-con-right) to[bend left=11] (\pingu@name-head-back-con-right) -- cycle;
+\pingu@block{\pingu@color@medal} (\pingu@name-medal-center) circle [radius=2.35mm];
+\pingu@draw[line width=\pingu@medal@shade@w]{\pingu@color@medal@shade} (\pingu@name-medal-center) circle [radius=2.35mm];
+\node[/pingu/@text,/pingu/medal text style] at (\pingu@name-medal-center) {\pingu@x@medal@text};
+}
+\newif\if@pingu@x@headband@knot@
+\newif\if@pingu@x@headband@bands@
+\pingu@create@extra{headband}{%
+ headband/.forward to = /pingu/head band,
+ head-band/.forward to = /pingu/head band,
+ head band/.code = \pingu@set@extra{headband}{true}\pingu@color{headband}{#1},
+ head band/.default = pingu@red,
+ headband bend/.forward to = /pingu/head band bend,
+ head-band bend/.forward to = /pingu/head band bend,
+ head band bend/.code = \def\pingu@x@headband@bend{#1},
+ headband angle/.forward to = /pingu/head band angle,
+ head-band angle/.forward to = /pingu/head band angle,
+ head band angle/.code = \def\pingu@x@headband@angle{#1},
+ headband upper angle/.forward to = /pingu/head band upper angle,
+ head-band upper angle/.forward to = /pingu/head band upper angle,
+ head band upper angle/.code = \def\pingu@x@headband@upangle{#1},
+ % knot
+ headband knot/.forward to = /pingu/head band knot,
+ head-band knot/.forward to = /pingu/head band knot,
+ head band knot/.is if = @pingu@x@headband@knot@,
+ headband knot color/.forward to = /pingu/head band knot color,
+ head-band knot color/.forward to = /pingu/head band knot color,
+ head band knot color/.code = \pingu@color{headband@knot}{#1},
+ headband knot a color/.forward to = /pingu/head band knot a color,
+ head-band knot a color/.forward to = /pingu/head band knot a color,
+ head band knot a color/.code = \pingu@color{headband@knot@a}{#1},
+ headband knot b color/.forward to = /pingu/head band knot b color,
+ head-band knot b color/.forward to = /pingu/head band knot b color,
+ head band knot b color/.code = \pingu@color{headband@knot@b}{#1},
+ headband bands/.forward to = /pingu/head band bands,
+ head-band bands/.forward to = /pingu/head band bands,
+ head band bands/.is if = @pingu@x@headband@bands@,
+ headband bands a color/.forward to = /pingu/head band bands a color,
+ head-band bands a color/.forward to = /pingu/head band bands a color,
+ head band bands a color/.code = \pingu@color{headband@bands@a}{#1},
+ headband bands b color/.forward to = /pingu/head band bands b color,
+ head-band bands b color/.forward to = /pingu/head band bands b color,
+ head band bands b color/.code = \pingu@color{headband@bands@b}{#1},
+}{head band bend=9, head band angle=17,head band upper angle=50, head band knot color=\pingu@color@headband!78!black,head band knot a color=\pingu@color@headband@knot!90!black,head band knot b color=\pingu@color@headband@knot@a,head band bands,head band bands a color=\pingu@color@headband!78!black,head band bands b color=\pingu@color@headband}
+
+\def\pingu@draw@ea@headband@wh{1.25mm}
+\def\pingu@draw@ea@headband{%
+ \path (\pingu@name-head-center)+(\pingu@x@headband@upangle-\pingu@x@headband@angle:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-head-band-lower);
+ \path (\pingu@name-head-center)+(\pingu@x@headband@upangle:\pingu@w@half{} and \pingu@head@h@half) coordinate (\pingu@name-head-band-upper);
+ \if@pingu@x@headband@bands@
+ \pingu@block{\pingu@color@headband@bands@a} (\pingu@name-head-band-lower) to[out=-50,in=75] ++(2.75mm,-4mm) to[bend right] ++(.6mm,0) to[out=80,in=-5] (\pingu@name-head-band-upper) -- cycle;
+ \pingu@block{\pingu@color@headband@bands@b} (\pingu@name-head-band-lower) to[out=-80,in=80] ++(1.75mm,-3.35mm) to[bend right] ++(.45mm,0) to[out=80,in=-8] (\pingu@name-head-band-upper) -- cycle;
+ \fi
+ \pingu@block{\pingu@color@headband} (\pingu@name-head-center)+(\pingu@x@headband@upangle:\pingu@w@half{} and \pingu@head@h@half) to[bend left=\pingu@x@headband@bend] coordinate[pos=.5] (\pingu@name-headband-center-a) +(180-\pingu@x@headband@upangle:\pingu@w@half{} and \pingu@head@h@half) arc(180-\pingu@x@headband@upangle:180-\pingu@x@headband@upangle+\pingu@x@headband@angle:\pingu@w@half{} and \pingu@head@h@half) to[bend right=\pingu@x@headband@bend] coordinate[pos=.5] (\pingu@name-headband-center-b) (\pingu@name-head-band-lower) arc(\pingu@x@headband@upangle-\pingu@x@headband@angle:\pingu@x@headband@upangle:\pingu@w@half{} and \pingu@head@h@half) -- cycle;
+ \path (\pingu@name-headband-center-a) -- (\pingu@name-headband-center-b) coordinate[pos=.5] (\pingu@name-headband-center);
+ \if@pingu@x@headband@knot@
+ \pingu@block[rounded corners=.25mm]{\pingu@color@headband@knot@a} (\pingu@name-headband-center-a)++(-.15mm,-.6mm) to[out=155,in=-5] ++(-3mm,\pingu@one) to[bend right=15] ([xshift=-3mm,yshift=-.2mm]\pingu@name-headband-center-b) to[in=-155,out=5] ++(.285cm,.8mm) -- cycle;
+ \pingu@block[rounded corners=.25mm]{\pingu@color@headband@knot@b} (\pingu@name-headband-center-a)++(.15mm,-.6mm) to[out=25,in=-175] ++(3mm,\pingu@one) to[bend left=15] ([xshift=3mm,yshift=-.2mm]\pingu@name-headband-center-b) to[in=-25,out=175] ++(-.285cm,.8mm) -- cycle;
+ \pingu@block[rounded corners=.25mm]{\pingu@color@headband@knot} (\pingu@name-headband-center-a)++(-\pingu@draw@ea@headband@wh,.12mm) to[bend right=9] ++(2*\pingu@draw@ea@headband@wh,0) -- ([xshift=\pingu@draw@ea@headband@wh,yshift=-.12mm]\pingu@name-headband-center-b) to[bend right=9] ++(-2*\pingu@draw@ea@headband@wh, 0) -- cycle;
+ \fi
+}
+% #endregion
+
+% #region technology-lib
+\pingu@create@extra{vrheadset}{%
+ vr-headset/.code = \pingu@set@extra{vrheadset}{true}\pingu@color{vrheadset}{#1},
+ vr-headset/.default = pingu@black!92!gray,
+ vr-headset band/.code = \pingu@color{vrheadset@band}{#1},
+ vr-headset band top/.code = \pingu@color{vrheadset@band@top}{#1},
+ vr-headset text/.code = \def\pingu@x@vrheadset@text{#1},
+ vr-headset text color/.code = \pingu@color{vrheadset@text@color}{#1},
+ vr-headset hair/.style = {/pingu/hair 2=!hide,/pingu/hair 3=!hide,/pingu/hair 4=!hide}
+}{vr-headset band=\pingu@color@vrheadset!92!gray,vr-headset text={\textit{\textsf{VR\thinspace\texttrademark}}},vr-headset text color=pingu@white,vr-headset band top=\pingu@color@vrheadset!96!gray}
+
+\def\pingu@draw@ea@vrheadset{%
+\pingu@layer{middle}[]
+ \pingu@block{\pingu@color@vrheadset} [rounded corners=1.25mm]([yshift=3.45mm]\pingu@name-waist-right|-\pingu@name-eye-right) to[bend left=2] coordinate[pos=.5] (@) ([yshift=3.45mm]\pingu@name-waist-left|-\pingu@name-eye-left) to[bend left=3] coordinate (\pingu@name-vrh-ol) ++(0,-6.25mm) to[bend left=13] ([yshift=-1mm]\pingu@name-head-center) to[bend left=13] ([yshift=3.45mm-6.25mm]\pingu@name-waist-right|-\pingu@name-eye-right) -- cycle;
+ \path (\pingu@name-vrh-ol)++(-2.25mm,2mm) node[text=\pingu@color@vrheadset@text@color,scale=.25] {\pingu@x@vrheadset@text};
+\endpingu@layer
+\if@pingu@do@back@\else
+ % top band
+ \pingu@block[rounded corners=1pt]{\pingu@color@vrheadset@band@top} (@)++(-1.05mm+.15mm,0) to[bend right=2] ([xshift=-.85mm+.3mm,yshift=.3mm]\pingu@name-head-top) to[bend left=2] ++(1.6mm,0) to[bend left=2] ([xshift=1.25mm+.15mm]@);
+\fi
+ % we draw a band for the background
+\pingu@layer{background}[]
+\pingu@block[line cap=round]{\pingu@color@vrheadset@band} ([yshift=1mm]\pingu@name-waist-right|-\pingu@name-eye-right) to[bend left=3] coordinate[pos=.5] (@b) ([yshift=1mm]\pingu@name-waist-left|-\pingu@name-eye-left) arc(90:-90:.25mm and 1mm) to[bend right=3] ([yshift=-1mm]\pingu@name-waist-right|-\pingu@name-eye-right) arc (270:90:.25mm and 1mm);
+\pingu@block[rounded corners=1pt]{\pingu@color@vrheadset@band@top} (@b)++(-1.25mm+.2mm,-1.25mm) to[bend right=2] ([xshift=-.85mm+.3mm,yshift=.3mm]\pingu@name-head-top) to[bend right=2] ++(1.6mm,0) to[bend right=2] ([xshift=1.15mm+.2mm,yshift=-1.25mm]@b) -- cycle;
+\endpingu@layer
+}
+\pingu@create@extra{headphone}{%
+ headphones/.forward to = /pingu/headphone,
+ headphone/.code = \pingu@set@extra{headphone}{true}\pingu@color{headphone}{#1},
+ headphone/.default = pingu@blue!80!pingu@black,
+ headphone left/.code = \pingu@color{headphone@left}{#1},
+ headphone right/.code = \pingu@color{headphone@right}{#1},
+ headphones outer/.forward to = /pingu/headphone outer,
+ headphone outer/.style = {/pingu/headphone left outer=#1,/pingu/headphone right outer=#1}, headphone outer/.default = pingu@black,
+ headphone left outer/.code = \pingu@color{headphone@left@p}{#1}, headphone left outer/.default =pingu@black,
+ headphone right outer/.code = \pingu@color{headphone@right@p}{#1}, headphone right outer/.default=pingu@black,
+ headphones inner/.forward to = /pingu/headphone inner,
+ headphone inner/.style = {/pingu/headphone left inner=#1,/pingu/headphone right inner=#1}, headphone inner/.default = pingu@black,
+ headphone left inner/.code = \pingu@color{headphone@left@i}{#1}, headphone left inner/.default = pingu@black,
+ headphone right inner/.code = \pingu@color{headphone@right@i}{#1}, headphone right inner/.default=pingu@black,
+}{headphone left=\pingu@color@headphone!65!pingu@black,headphone right=\pingu@color@headphone@left,headphone left outer=\@pingu@none,
+,headphone right outer=\@pingu@none,,headphone left inner=\@pingu@none,
+,headphone right inner=\@pingu@none}
+
+\def\pingu@draw@ea@headphone{%
+\if@pingu@do@back@ \pingu@layer{background}[] \fi
+ \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@right@p} ([xshift=-\pingu@one,yshift=3.22mm]\pingu@name-wings-side-right|-\pingu@name-eye-right) arc (93:273:.565mm and 2.11mm) -- ++(.8mm,.075mm) -- ++(0,4.075mm);
+ \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@right@i} ([xshift=\pingu@one-.366mm,yshift=3.22mm]\pingu@name-wings-side-right|-\pingu@name-eye-right) arc (87:-93:.565mm and 2.14mm) -- ++(-.8mm,.075mm) -- ++(0,4.075mm) -- cycle;
+ \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@right} ([xshift=-\pingu@one+.2mm,yshift=3.22mm]\pingu@name-wings-side-right|-\pingu@name-eye-right) arc (92:272:.565mm and 2.1mm) -- ++(.8mm,-.05mm) arc (270:450:.425mm and 2.1mm) -- cycle;
+ \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@left@p} ([xshift=\pingu@one,yshift=3.22mm]\pingu@name-wings-side-left|-\pingu@name-eye-left) arc (87:-93:.565mm and 2.11mm) -- ++(-.8mm,.075mm) -- ++(0,4.075mm) -- cycle;
+ \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@left@i} ([xshift=-\pingu@one+.366mm,yshift=3.22mm]\pingu@name-wings-side-left|-\pingu@name-eye-left) arc (93:273:.565mm and 2.14mm) -- ++(.8mm,.075mm) -- ++(0,4.075mm);
+ \pingu@block[rounded corners=.1mm]{\pingu@color@headphone@left} ([xshift=\pingu@one-.2mm,yshift=3.22mm]\pingu@name-wings-side-left|-\pingu@name-eye-left) arc (88:-92:.565mm and 2.1mm) -- ++(-.8mm,-.05mm) arc (270:90:.425mm and 2.1mm) -- cycle;
+ \pingu@block{\pingu@color@headphone} ([xshift=-\pingu@one,yshift=1.75\pingu@one]\pingu@name-wings-side-right|-\pingu@name-eye-right)
+ arc(180:0:{\pingu@one+\pingu@w@half} and {\pingu@head@h@half-1.3\pingu@one}) arc(0:-180:.6mm and .33mm)
+ arc(0:180:{\pingu@one+\pingu@w@half-2*.6mm} and {\pingu@head@h@half+.33\pingu@one-2*.6mm-1.8\pingu@one})
+ arc(0:-180:.6mm and .33mm) -- cycle;
+\if@pingu@do@back@ \endpingu@layer \fi
+}
+
+\pingu@create@wing@extra{vrcontroller}{%
+vr-controller \@lr/.code = {\pingu@set@extra{vrcontroller\@lr}{true}\pingu@color{vrcontroller\@lr}{##1}},
+vr-controller \@lr/.default = pingu@green,
+vr-controller \@lr\space handle/.code = \pingu@color{vrcontroller\@lr @handle}{##1},%
+vr-controller \@lr\space second/.code = \pingu@color{vrcontroller\@lr @second}{##1},%
+vr-controller \@lr\space second shade/.code = \pingu@color{vrcontroller\@lr @second@shade}{##1}%
+}{vr-controller \@lr\space handle={\csname pingu@color@vrcontroller\@lr\endcsname!76!pingu@black},vr-controller \@lr\space second={\csname pingu@color@vrcontroller\@lr\endcsname!56!pingu@black},vr-controller \@lr\space second shade={\csname pingu@color@vrcontroller\@lr\endcsname!96!pingu@black}}
+
+% #1 wing
+\def\pingu@draw@wi@vrcontroller#1{%
+ \pingu@setup@wing{vrcontroller}{#1}%
+ \pingu@block[rotate around={\@angle:(\pingu@name-wing-#1)}]{\csname pingu@color@vrcontroller#1@handle\endcsname}(\pingu@name-wing-#1)++(.5mm,5mm) to[bend right=1] ++(-.25mm,-5.5mm) arc (0:-180:.325mm and .1mm) to[bend right=1] ++(-.7mm,5.5mm) -- cycle coordinate[pos=.5] (@);
+ \def\@y{2.06mm} \def\@@y{.78mm}
+ \pingu@block[rotate around={\@angle:(\pingu@name-wing-#1)},even odd rule]{\csname pingu@color@vrcontroller#1@second\endcsname}([yshift=.1mm]@) arc (90:450:{\@y} and 1mm) coordinate[pos=.25] (@r) coordinate[pos=.75] (@l) ([yshift=-.6mm]@) arc (90:0:{\@@y} and .25mm) arc (0:-180:{\@@y} and .35mm) arc (180:90:{\@@y} and .25mm);
+ % \pingu@draw[rotate around={\@angle:(\pingu@name-wing-#1)}]{\csname pingu@color@vrcontroller#1@second@shade\endcsname} ([yshift=-.9mm]@)++(180:{\@@y} and .3mm) arc (180:0:{\@@y} and .3mm);
+ \def\@toruslow{(@l) to[bend left=7] ++(-.2mm,-.875mm) to[bend left=15] coordinate[pos=.95] (@c) ++(-2*\@y+.4mm,0) [sharp corners] to[bend left=7] ++(-.2mm,.875mm) to[bend right=30] cycle}
+ \pingu@block[rounded corners=.1mm,rotate around={\@angle:(\pingu@name-wing-#1)}]{\csname pingu@color@vrcontroller#1@second\endcsname} \@toruslow;
+ \scope[rounded corners=.1mm,rotate around={\@angle:(\pingu@name-wing-#1)}]
+ \clip \@toruslow;
+ \pingu@block[opacity=.1]{black} (@l) to[bend left=14] (@c) -- ++(0,-2mm) -| cycle;
+ \endscope
+}
+
+
+\pingu@create@wing@extra{laptop}{%
+ laptop \@lr/.code = {\pingu@set@extra{laptop\@lr}{true}\pingu@color{laptop\@lr}{##1}},
+ laptop \@lr/.default = gray!80!pingu@white,
+ laptop \@lr\space bracket/.code = \pingu@color{laptop\@lr @bracket}{##1},
+ laptop \@lr\space lower/.code = \pingu@color{laptop\@lr @lower}{##1},
+ laptop \@lr\space key/.code = \pingu@color{laptop\@lr @key}{##1},
+ laptop \@lr\space display/.code = \pingu@color{laptop\@lr @display}{##1},
+ laptop \@lr\space content/.code = \@namedef{pingu@x@laptop\@lr @content}{##1}, % tikz content
+ laptop \@lr\space mid/.code = \@namedef{pingu@x@laptop\@lr @mid}{##1}, % tikz content
+}{laptop \@lr\space bracket=pingu@black!80!\csname pingu@color@laptop\@lr\endcsname,laptop \@lr\space lower=\csname pingu@color@laptop\@lr\endcsname!95!pingu@black,laptop \@lr\space key=\csname pingu@color@laptop\@lr\endcsname!92!pingu@white,laptop \@lr\space display=\csname pingu@color@laptop\@lr\endcsname!32!pingu@white,laptop \@lr\space content={},laptop \@lr\space mid={}}
+
+% #1 wing
+\def\pingu@draw@wi@laptop#1{%
+ \pingu@setup@wing{laptop}{#1}%
+ \scope[rotate around={\@angle+5:(\pingu@name-wing-#1)},shift={(\pingu@name-wing-#1)}]
+ \pingu@block[rounded corners=1pt]{\csname pingu@color@laptop#1@lower\endcsname}(-6.9mm,0) -- ++(-.1mm,-4.75mm) -- ++(14mm,0) -- ++(-.1mm,4.75mm) -- cycle;
+ \pingu@block[rounded corners=1pt]{\@col}(-6.9mm,0) -- ++(0,7mm) -- ++(13.8mm,0) -- ++(0,-7mm) -- cycle;
+ \pingu@block[rounded corners=.125mm]{\csname pingu@color@laptop#1@bracket\endcsname}(-6.4mm,.125mm) -- ++(0,-.25mm) -- ++(12.8mm,0) -- ++(0,.25mm) -- cycle;
+ % keys
+ \foreach[count=\y from 0,evaluate=\y as \extpadding using 0.005*\y,evaluate=\y as \rextpadding using 0.05*\y] \row in {
+ % manually account for padding
+ {0,1,1,1,1,1,1,1,1,1,1,1,1,1},
+ {.63,1.5,1,1,1,1,1,1,1,1,1,1,1},
+ {0,1,1,1,1,1,1,1,1,1,1,1,1,1},
+ {0,1,1,1,1,1,4.62,1,1,1,1},
+ } {
+ \def\lengthincr{-\rextpadding mm}
+ \foreach[count=\i from 0,evaluate=\len as \l using 0.85*\len] \len in \row {
+ \ifnum\i=0 \else % first one is silent:
+ \pingu@block[rounded corners=.125mm]{\csname pingu@color@laptop#1@key\endcsname}(\lengthincr-6.4mm,-\y mm-.5mm) rectangle ++(\l mm,-.75mm) node[midway,centered,text=\@col,scale=.3] {\textbullet};
+ \fi
+ \xdef\lengthincr{\the\dimexpr\lengthincr+\l mm+.13mm+\extpadding mm}
+ }
+ }
+ % display, we modify the lower shift to adjust height offset
+ \pingu@block[rounded corners=1pt]{\csname pingu@color@laptop#1@display\endcsname}(-6.7mm,.25mm+.05mm) rectangle ++(13.4mm,6.45mm) node[midway,centered,rotate=\@angle+5,text width=13.2mm,align=center,minimum height=6.2mm] {\csname pingu@x@laptop#1@mid\endcsname};
+ \scope[shift={(-6.7mm,.25mm+.05mm)}]
+ \csname pingu@x@laptop#1@content\endcsname
+ \endscope
+ \endscope
+}
+% #endregion
\endinput
diff --git a/graphics/pgf/contrib/tikzquads/README.md b/graphics/pgf/contrib/tikzquads/README.md
index 4ea07b35cb..ab8d126c52 100644
--- a/graphics/pgf/contrib/tikzquads/README.md
+++ b/graphics/pgf/contrib/tikzquads/README.md
@@ -79,6 +79,9 @@ The Current Maintainer of this work is Alceu Frigeri
## Changelog
+* Version 1.1 (this)
+ - Added a 'raw sources' key (see manual)
+ - a few typos in the documentation
* Version 1.0
- Initial release by CTAN
diff --git a/graphics/pgf/contrib/tikzquads/doc/tikzquads.pdf b/graphics/pgf/contrib/tikzquads/doc/tikzquads.pdf
index 4ea887cb74..0bfc7d4b14 100644
--- a/graphics/pgf/contrib/tikzquads/doc/tikzquads.pdf
+++ b/graphics/pgf/contrib/tikzquads/doc/tikzquads.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikzquads/doc/tikzquads.tex b/graphics/pgf/contrib/tikzquads/doc/tikzquads.tex
index b6f6f1a30b..0e549ead63 100644
--- a/graphics/pgf/contrib/tikzquads/doc/tikzquads.tex
+++ b/graphics/pgf/contrib/tikzquads/doc/tikzquads.tex
@@ -15,7 +15,7 @@
%%
%% The Current Maintainer of this work is Alceu Frigeri
%%
-%% This is version {1.0} {2024/01/13}
+%% This is version {1.1} {2024/10/17}
%%
%% The list of files that compose this work can be found in the README.md file at
%% https://ctan.org/pkg/tikzdotncross
@@ -91,7 +91,7 @@ This package defines a few extra shapes (single / dual port boxes) designed to b
\tableofcontents
\section{Introduction}
-In standard text books, both for Circuits Theory and Electronics, quite frequently, in the process of modelling sub-circuits, one ends representing them either:
+In standard text books, Circuits Theory and Electronics alike, quite frequently, in the process of modelling sub-circuits, one ends representing them either:
\begin{itemize}
\item as a single port \emph{black box}, or
\item as a dual port \emph{black box}
@@ -113,7 +113,7 @@ This package defines a few, parameterized shapes for each case:
\item Quad G
\item Quad H
\end{itemize}
-Lastly, this package also defines a \emph{Pseudo-Graph load line} shape, for those moments where a true graph, \tsobj[pkg]{pgfplots}, isn't needed.
+Lastly, this package also defines a \emph{Pseudo-Graph load line} shape, for those moments where a true graph, like the ones \tsobj[pkg]{pgfplots} enables, isn't needed.
\end{itemize}
\subsection{CircuiTi\emph{k}Z}
@@ -161,7 +161,7 @@ The point being that, regardless of the sub-shape orientation, the intuitive geo
\subsection{General Keys}\label{generalkeys}
-These are the keys to fine tuning a shape:
+General keys to fine tuning a shape:
\begin{describelist*}[30mm]{keys}
\describe {outer sep} {Text outer separation, initial value: 1.5pt}
\describe {inner sep} {Text inner separation, initial value: 1pt}
@@ -392,7 +392,7 @@ node[Quad Z]{}
\tscode*[emph={draw,node},emph2={x,y,fit,to,outer,inner,node},emph3={Quad,ToQuad,Black,ToBlack,Box,Thevenin,ToThevenin,Norton,ToNorton},basicstyle={\scriptsize\ttfamily},numbers=left,codeprefix={}]{QuadZDef}
-This shape, besides the base anchors (see \ref{quadanchors}) it has 4 internal nodes: \tsobj[key]{<node>-Z11,<node>-Z12,<node>-Z21,<node>-Z22} and each of those sub-nodes has geographic anchors as defined at \ref{auxiliarynodes}.
+Besides the base anchors (see \ref{quadanchors}) it has 4 internal nodes: \tsobj[key]{<node>-Z11,<node>-Z12,<node>-Z21,<node>-Z22} and each of those sub-nodes has geographic anchors as defined at \ref{auxiliarynodes}.
\begin{tsremark}
There is also a \tsobj[key]{ToQuad Z} to be used in a \tsobj[key]{to[ ]} path, in which case the key \tsobj[key]{outer x fit to} style will be triggered with the starting and ending points of the \tsobj[key]{to[ ]} path.
\end{tsremark}
@@ -423,6 +423,7 @@ There is also a \tsobj[key]{ToQuad Z} to be used in a \tsobj[key]{to[ ]} path, i
\describe{I2}{Initial value:\tsverb{$I_2$}}
\describe{V1}{Initial value:\tsverb{$V_1$}}
\describe{V2}{Initial value:\tsverb{$V_2$}}
+ \describe {raw sources} {This will suppress the control variables (I1, I2) in the sources' labels}
\describe{Z11}{Initial value:\tsverb{$Z_{11}$}}
\describe{Z12}{Initial value:\tsverb{$Z_{12}$}}
\describe{Z21}{Initial value:\tsverb{$Z_{21}$}}
@@ -448,7 +449,7 @@ node[Quad Y]{}
\end{codestore}
\tscode*[emph={draw,node},emph2={x,y,fit,to,outer,inner,node},emph3={Quad,ToQuad,Black,ToBlack,Box,Thevenin,ToThevenin,Norton,ToNorton},basicstyle={\scriptsize\ttfamily},numbers=left,codeprefix={}]{QuadYDef}
-This shape, besides the base anchors (see \ref{quadanchors}) it has 4 internal nodes: \tsobj[key]{<node>-Y11,<node>-Y12,<node>-Y21,<node>-Y22} and each of those sub-nodes has geographic anchors as defined at \ref{auxiliarynodes}.
+Besides the base anchors (see \ref{quadanchors}) it has 4 internal nodes: \tsobj[key]{<node>-Y11,<node>-Y12,<node>-Y21,<node>-Y22} and each of those sub-nodes has geographic anchors as defined at \ref{auxiliarynodes}.
\begin{tsremark}
There is also a \tsobj[key]{ToQuad Y} to be used in a \tsobj[key]{to[ ]} path, in which case the key \tsobj[key]{outer x fit to} style will be triggered with the starting and ending points of the \tsobj[key]{to[ ]} path.
\end{tsremark}
@@ -479,6 +480,7 @@ There is also a \tsobj[key]{ToQuad Y} to be used in a \tsobj[key]{to[ ]} path, i
\describe{I2}{Initial value:\tsverb{$I_2$}}
\describe{V1}{Initial value:\tsverb{$V_1$}}
\describe{V2}{Initial value:\tsverb{$V_2$}}
+ \describe {raw sources} {This will suppress the control variables (V1, V2) in the sources' labels}
\describe{Y11}{Initial value:\tsverb{$Y_{11}$}}
\describe{Y12}{Initial value:\tsverb{$Y_{12}$}}
\describe{Y21}{Initial value:\tsverb{$Y_{21}$}}
@@ -503,7 +505,7 @@ node[Quad G]{}
\tscode*[emph={draw,node},emph2={x,y,fit,to,outer,inner,node},emph3={Quad,ToQuad,Black,ToBlack,Box,Thevenin,ToThevenin,Norton,ToNorton},basicstyle={\scriptsize\ttfamily},numbers=left,codeprefix={}]{QuadGDef}
-This shape, besides the base anchors (see \ref{quadanchors}) it has 4 internal nodes: \tsobj[key]{<node>-G11,<node>-G12,<node>-G21,<node>-G22} and each of those sub-nodes has geographic anchors as defined at \ref{auxiliarynodes}.
+Besides the base anchors (see \ref{quadanchors}) it has 4 internal nodes: \tsobj[key]{<node>-G11,<node>-G12,<node>-G21,<node>-G22} and each of those sub-nodes has geographic anchors as defined at \ref{auxiliarynodes}.
\begin{tsremark}
There is also a \tsobj[key]{ToQuad G} to be used in a \tsobj[key]{to[ ]} path, in which case the key \tsobj[key]{outer x fit to} style will be triggered with the starting and ending points of the \tsobj[key]{to[ ]} path.
\end{tsremark}
@@ -535,6 +537,7 @@ There is also a \tsobj[key]{ToQuad G} to be used in a \tsobj[key]{to[ ]} path, i
\describe{I2}{Initial value:\tsverb{$I_2$}}
\describe{V1}{Initial value:\tsverb{$V_1$}}
\describe{V2}{Initial value:\tsverb{$V_2$}}
+ \describe {raw sources} {This will suppress the control variables (V1, I2) in the sources' labels}
\describe{G11}{Initial value:\tsverb{$G_{11}$}}
\describe{G12}{Initial value:\tsverb{$G_{12}$}}
\describe{G21}{Initial value:\tsverb{$G_{21}$}}
@@ -559,7 +562,7 @@ node[Quad H]{}
\tscode*[emph={draw,node},emph2={x,y,fit,to,outer,inner,node},emph3={Quad,ToQuad,Black,ToBlack,Box,Thevenin,ToThevenin,Norton,ToNorton},basicstyle={\scriptsize\ttfamily},numbers=left,codeprefix={}]{QuadHDef}
-This shape, besides the base anchors (see \ref{quadanchors}) it has 4 internal nodes: \tsobj[key]{<node>-H11,<node>-H12,<node>-H21,<node>-H22} and each of those sub-nodes has geographic anchors as defined at \ref{auxiliarynodes}.
+Besides the base anchors (see \ref{quadanchors}) it has 4 internal nodes: \tsobj[key]{<node>-H11,<node>-H12,<node>-H21,<node>-H22} and each of those sub-nodes has geographic anchors as defined at \ref{auxiliarynodes}.
\begin{tsremark}
There is also a \tsobj[key]{ToQuad H} to be used in a \tsobj[key]{to[ ]} path, in which case the key \tsobj[key]{outer x fit to} style will be triggered with the starting and ending points of the \tsobj[key]{to[ ]} path.
\end{tsremark}
@@ -592,6 +595,7 @@ There is also a \tsobj[key]{ToQuad H} to be used in a \tsobj[key]{to[ ]} path, i
\describe{I2}{Initial value:\tsverb{$I_2$}}
\describe{V1}{Initial value:\tsverb{$V_1$}}
\describe{V2}{Initial value:\tsverb{$V_2$}}
+ \describe {raw sources} {This will suppress the control variables (I1, V2) in the sources' labels}
\describe{H11}{Initial value:\tsverb{$H_{11}$}}
\describe{H12}{Initial value:\tsverb{$H_{12}$}}
\describe{H21}{Initial value:\tsverb{$H_{21}$}}
diff --git a/graphics/pgf/contrib/tikzquads/latex/tikzquads.sty b/graphics/pgf/contrib/tikzquads/latex/tikzquads.sty
index 31fc675742..1cdaf13300 100644
--- a/graphics/pgf/contrib/tikzquads/latex/tikzquads.sty
+++ b/graphics/pgf/contrib/tikzquads/latex/tikzquads.sty
@@ -12,7 +12,7 @@
%%
%% The Current Maintainer of this work is Alceu Frigeri
%%
-%% This is version {1.0} {2024/01/13}
+%% This is version {1.1} {2024/10/17}
%%
%% The list of files that compose this work can be found in the README.md file at
%% https://ctan.org/pkg/tikzquads
@@ -27,8 +27,8 @@
\ProvidesExplPackage
{tikzquads}
- {2024/01/13}
- {1.0}
+ {2024/10/17}
+ {1.1}
{CircuiTikZ Extension - Quadripoles and Dipoles}
\ExplSyntaxOn
@@ -42,8 +42,8 @@
{
name .code:n = {tikzquads} ,
prefix .code:n = {tikzquads} ,
- date .code:n = {2024/01/13},
- version .code:n = {1.0} ,
+ date .code:n = {2024/10/17},
+ version .code:n = {1.1} ,
description .code:n = {CircuiTikZ~ Extension~- Quadripoles~ and~ Dipoles}
}
\cs_if_exist:NF \PkgInfo
@@ -86,6 +86,7 @@
\newtoggle{tikzquads@@toggle@outermarks}
\newtoggle{tikzquads@@toggle@beziertip}
\newtoggle{tikzquads@@toggle@roundsources}
+\newtoggle{tikzquads@@toggle@rawsources}
%
%
@@ -301,7 +302,7 @@
%%%%%%%%%%%%%%%
%%%
-%%% "QUadKeys" Path (Quadripoles)
+%%% "QuadKeys" Path (Quadripoles)
%%%
%%%%%%%%%%%%%%%
@@ -503,6 +504,8 @@
inner marks/.style={@inner marks},
@outer marks/.code={\toggletrue{tikzquads@@toggle@outermarks}},
outer marks/.style={@outer marks},
+ @raw sources/.code={\toggletrue{tikzquads@@toggle@rawsources}},
+ raw sources/.style={@raw sources},
@invert/.code={\toggletrue{tikzquads@@toggle@inverted}},
invert/.style={%
/tikz/xscale=-1,
@@ -803,7 +806,11 @@
\SearchValueOf{QuadKeys}{#3}{\@@valC}
\pgftransformresetnontranslations
\tikzquads@@CondDraw{#1}{}{\pgftext[\tikzquads@@TanchorA,at={\pgfpointanchor{\tikz@fig@name-#1}{\tikzquads@@NanchorA}}]{\@@valA}}
- \tikzquads@@CondDraw{#2}{}{\pgftext[\tikzquads@@TanchorB,at={\pgfpointanchor{\tikz@fig@name-#2}{\tikzquads@@NanchorB}}]{\@@valB\@@valC}}
+ \ifboolexpr{togl{tikzquads@@toggle@rawsources}}{%
+ \tikzquads@@CondDraw{#2}{}{\pgftext[\tikzquads@@TanchorB,at={\pgfpointanchor{\tikz@fig@name-#2}{\tikzquads@@NanchorB}}]{\@@valB}}
+ }{%
+ \tikzquads@@CondDraw{#2}{}{\pgftext[\tikzquads@@TanchorB,at={\pgfpointanchor{\tikz@fig@name-#2}{\tikzquads@@NanchorB}}]{\@@valB\@@valC}}
+ }
}
}
@@ -901,7 +908,11 @@
\SearchValueOf{QuadKeys}{#4}{\@@valC}
\pgftransformresetnontranslations
\tikzquads@@CondDraw{#2}{}{\pgftext[\tikzquads@@TanchorA,at={\pgfpointanchor{\tikz@fig@name-#2}{\tikzquads@@NanchorA}}]{\@@valA}}
- \tikzquads@@CondDraw{#3}{}{\pgftext[\tikzquads@@TanchorB,at={\pgfpointanchor{\tikz@fig@name-#3}{\tikzquads@@NanchorB}}]{\@@valB\@@valC}}
+ \ifboolexpr{togl{tikzquads@@toggle@rawsources}}{%
+ \tikzquads@@CondDraw{#3}{}{\pgftext[\tikzquads@@TanchorB,at={\pgfpointanchor{\tikz@fig@name-#3}{\tikzquads@@NanchorB}}]{\@@valB}}
+ }{%
+ \tikzquads@@CondDraw{#3}{}{\pgftext[\tikzquads@@TanchorB,at={\pgfpointanchor{\tikz@fig@name-#3}{\tikzquads@@NanchorB}}]{\@@valB\@@valC}}
+ }
}
}
diff --git a/graphics/pgf/contrib/timechart/README.md b/graphics/pgf/contrib/timechart/README.md
new file mode 100644
index 0000000000..8a4830fa6a
--- /dev/null
+++ b/graphics/pgf/contrib/timechart/README.md
@@ -0,0 +1,16 @@
+# `timechart` - A package for drawing chronological charts
+
+## Description
+
+This package provides for the easy creation of chronological charts which show visually the relative historical
+positions of people and events. Each event or period can be specified by a single line of LaTeX code comprising
+(possibly uncertain) start and finish dates and a label, and the package takes care of indicating the uncertainties and
+whether intervals extend beyond the specified bounds of the chart.
+
+## Author
+
+This package is by Alan J. Cain: a.j.cain (AT) gmail.com
+
+## Licence
+
+Released under the LaTeX Project Public License v1.3c or later: https://www.latex-project.org/lppl.txt
diff --git a/graphics/pgf/contrib/timechart/timechart-doc.pdf b/graphics/pgf/contrib/timechart/timechart-doc.pdf
new file mode 100644
index 0000000000..31b778e9de
--- /dev/null
+++ b/graphics/pgf/contrib/timechart/timechart-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/timechart/timechart.dtx b/graphics/pgf/contrib/timechart/timechart.dtx
new file mode 100644
index 0000000000..82048a452a
--- /dev/null
+++ b/graphics/pgf/contrib/timechart/timechart.dtx
@@ -0,0 +1,3458 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2025 Alan J. Cain
+%
+% This file may be distributed and/or modified under the conditions of the LaTeX Project Public Licence, either version
+% 1.3 of this licence or (at your option) any later version. The latest version of this licence is in:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.3c or later is part of all distributions of LaTeX version 2008-05-04 or later.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\PassOptionsToPackage{inline}{enumitem}
+\documentclass{l3doc}
+
+
+
+% Make space for larger numbers in contents
+
+\makeatletter
+\ExplSyntaxOn
+
+\cs_gset:Npn \l@subsection { \@dottedtocline{2}{2.5em}{2.8em} }
+\cs_gset:Npn \l@subsubsection { \@dottedtocline{3}{5.3em}{4em} }
+
+\ExplSyntaxOff
+\makeatother
+
+
+
+% Link formatting
+
+\usepackage{xcolor}
+
+\definecolor{linkcolor}{rgb}{0.0,0.4,0.7}
+\colorlet{citecolor}{linkcolor}
+\colorlet{urlcolor}{linkcolor}
+
+\hypersetup{
+ linkcolor=linkcolor,%
+ citecolor=citecolor,%
+ urlcolor=urlcolor,%
+}
+
+\newcommand*\fullref[2]{%
+ \hyperref[#2]{#1\penalty 200\ \ref*{#2}}%
+}
+
+
+
+% Use siunitx for typesetting dimensions
+
+\usepackage{siunitx}
+\sisetup{
+ mode=match,
+}
+\DeclareSIUnit\point{pt}
+
+
+
+% Listings and grammars
+
+\usepackage{listings}
+\lstset{
+ language=[LaTeX]TeX,
+ basicstyle=\small\ttfamily,
+ basewidth=0.5em,
+ numbers=left,
+ numberstyle=\scriptsize\sffamily,
+}
+
+\usepackage{simplebnf}
+
+
+
+% Macros for describing keys
+
+\newlist{optionlist}{description}{1}
+\setlist[optionlist]{
+ leftmargin=3em,
+ style=unboxed,
+ labelsep=1em,
+ font=\descriptionitemcolon,
+ nosep,
+}
+\newcommand*{\descriptionitemcolon}[1]{\kern 1em #1:}
+
+
+\newcommand*\key[1]{\texttt{#1}}
+\newcommand*\val[1]{\texttt{#1}}
+\newcommand*\keyval[2]{\texttt{#1=#2}}
+
+\usepackage{xcolor}
+\definecolor{keycolor}{rgb}{0.8,0.0,0.0}
+\definecolor{keyvaluecolor}{rgb}{0.0,0.65,0.0}
+
+\ExplSyntaxOn
+
+\NewDocumentEnvironment{describekey}{ m m m }{
+ \group_begin:
+ \group_begin:
+ \noindent{\textcolor{keycolor}{\texttt{#1}}}
+ \str_if_empty:nF{#2}
+ {
+ \skip_set:Nn{\parfillskip}{0pt}
+ \str_case:nnF{#2}
+ {
+ {style}
+ {
+ \hfil
+ (style,~initially~#3)
+ }
+ }
+ {
+ \textcolor{keyvaluecolor}{\texttt{=}\meta{#2}}
+ \str_if_empty:nF{#3}
+ {
+ \hfil
+ (default\nobreakspace\texttt{#3})
+ }
+ }
+ }
+ \par
+ \group_end:
+ \nobreak
+ \skip_add:Nn{\leftskip}{\parindent}
+ \noindent\ignorespaces
+}{
+ \par
+ \group_end:
+}
+
+\ExplSyntaxOff
+
+
+\newcommand*\mcode[1]{\texttt{#1}}
+\newcommand*\param[1]{\texttt{\##1}}
+
+
+
+% Other macros
+
+\newcommand*\TikZ{\texorpdfstring{Ti\textit{k}Z}{TikZ}}
+\newcommand*\ISO{\textsc{iso}}
+
+
+
+% Timechart
+
+\usepackage{timechart}
+
+\input{timechart-example1-setup.tex}
+
+
+
+\begin{document}
+\DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+%
+% \GetFileInfo{timechart.sty}
+%
+%
+%
+% \title{^^A
+% \pkg{timechart} ^^A
+% --- A package for drawing chronological charts^^A
+% \thanks{This file describes \fileversion, last revised \filedate.}^^A
+% }
+%
+% \author{^^A
+% Alan J. Cain^^A
+% }
+%
+% \date{Released \filedate}
+%
+% \maketitle
+%
+%
+%
+% \begin{abstract}
+% This package provides for the easy creation of chronological charts which show visually the relative historical
+% positions of people and events. Each event or period can be specified by a single line of \LaTeX\ code comprising
+% (possibly uncertain) start and finish dates and a label, and the package takes care of indicating the uncertainties
+% and whether intervals extend beyond the specified bounds of the chart.
+% \end{abstract}
+%
+%
+%
+% \tableofcontents
+%
+%
+%
+% \begin{documentation}
+%
+% \setcounter{secnumdepth}{2}
+%
+%
+% \section{Introduction}
+%
+% The \pkg{timechart} package provides a system for the easy creation of chronological charts --- of the type pioneered
+% by Joseph Priestley (1733--1804) in his `Chart of Biography' and more famously in his `New Chart of
+% History'\footnote{\textsc{url}:~\url{https://commons.wikimedia.org/wiki/File:A_New_Chart_of_History_color.jpg}} ---
+% which can show visually the relative historical positions of people and events. An example of what \pkg{timechart} can
+% be used to produce is shown in \fullref{Figure}{fig:example1} on page~\pageref{fig:example1}.
+%
+% \begin{figure}[p]
+% \centering
+% \input{timechart-example1-timechart.tex}
+% \caption{Timechart showing the lifetimes of Roman emperors from \timechartmakebeforeyear{50} to
+% \timechartmakeafteryear{500}. Marks on each lifetime indicate the beginning (and, where relevant, the end) of that
+% emperor's reign. Colours generally indicate dynasties, with shades of green indicating periods when the imperial
+% power shifted between many short-reigning emperors.}
+% \label{fig:example1}
+% \end{figure}
+%
+% Essentially (and this was a design requirement), \emph{only one line} of \LaTeX\ code is required for each interval
+% (which, in the case of \fullref{Figure}{fig:example1}, are mostly lifetimes). The \pkg{timechart} package takes care
+% of indicating ranges of possible dates by suitable fading from or to transparency. It also handles indicators to show
+% that intervals continue outside the specified scope of the chart.
+%
+% \pkg{timechart} was developed from, and replaced, a set of macros used to create the chronological charts in the
+% author's book \textit{Form \& Number: A History of Mathematical Beauty}, which is available on the Internet Archive
+% under a Creative Commons licence.\footnote{\textsc{url}:
+% \url{https://archive.org/details/cain_formandnumber_ebook_large}}
+%
+%
+%
+% \paragraph*{Licence.} \noindent\pkg{timechart} is released under the LaTeX Project Public Licence v1.3c or
+% later.\footnote{\textsc{url}: \url{https://www.latex-project.org/lppl.txt}}
+%
+%
+%
+% \paragraph*{Acknowledgements.} The author thanks Tânia Paulista for reading and commenting on an earlier draft of the
+% documentation.
+%
+%
+%
+% \section{Requirements}
+%
+% \pkg{timechart} requires PGF/\TikZ\ and a \LaTeX\ kernel with \pkg{expl3} support (any kernel version since 2020-02-02
+% should suffice).
+%
+%
+%
+% \section{Installation}
+%
+% To install manually, run \texttt{tex timechart.ins} and copy the file \file{timechart.sty} to somewhere \LaTeX\ can
+% find it.
+%
+%
+%
+% \section{Getting started}
+%
+% The \pkg{timechart} package is loaded as usual via \cs{usepackage}\texttt{\{timechart\}}. There are no package
+% options.
+%
+% The small example in \fullref{Section}{sec:example} illustrates the basic principles of \pkg{timechart}.
+% \fullref{Section}{sec:full-example} shows the full code used to produce the large example in \fullref{Figure}{fig:example1}.
+%
+%
+%
+%
+%
+% \section{Example}
+% \label{sec:example}
+%
+% This section illustrates how to create the small chart shown in \fullref{Figure}{fig:example2-v2} on
+% page~\pageref{fig:example2-v2}.
+%
+% The basic environment is \env{timechart}, which includes the specification of the start and finish years. The start
+% year \timechartmakebeforeyear{50} is specified as \mcode{-50}, the finish year \timechartmakeafteryear{75} as
+% \mcode{75}. Each interval in the chart is specified using the \cs{timechartinterval} command, which takes three
+% mandatory parameters: a start year, a finish year, and a label. The following code produces the flawed preliminary
+% version shown in \fullref{Figure}{fig:example2-v1}.
+%
+% \lstinputlisting{timechart-example2-v1.tex}
+%
+% \begin{figure}[ht]
+% \centering
+% \input{timechart-example2-v1.tex}
+% \medskip
+% \caption{Flawed preliminary version of a chart showing the lifetimes of Roman emperors of the Julio-Claudian
+% dynasty. (The final version is shown in \fullref{Figure}{fig:example2-v2}.)}
+% \label{fig:example2-v1}
+% \end{figure}
+%
+% This first attempt result illustrates some of the principles of \pkg{timechart}. Each interval has been placed on its
+% own line. More precisely, the \(y\) coordinate of the first interval is \(0\) and each use of \cs{timechartinterval}
+% increments the `current \(y\) coordinate' by a specified amount. (Various commands are available to set the \(y\)
+% coordinate manually or to reset it automatically when it passes certain bounds; see
+% \fullref{Subsection}{subsec:positioning}.) Horizontally, the chart starts and finishes at the specified years. The topmost
+% interval, indicating Augustus' life, has been truncated with an indicator that it begins before the specified start
+% year of the chart. Vertically, the chart has been sized to fit around the specified intervals.
+%
+% But this version is hardly satisfactory, for many reasons. The chart finishes between two minor ticks on the axis,
+% because the intervals between major and minor ticks default respectively to 10 years and 50 years. The black intervals
+% and text do not contrast well with the black axis and grid. The serif font is perhaps not best suited to label the
+% intervals. And the label `Augustus' has been lost, since labels are by default placed on the left of intervals. To
+% rectify these problems, some changes are necessary, all of which can be made using key-value syntax in an optional
+% parameter to the \env{timechart} environment or the \cs{timechartinterval} command:
+% \begin{enumerate}
+% \item Set the intervals between major and minor ticks to 5 years and 25 years respectively, by setting
+% \keyval{minor tick interval}{5} and \keyval{major tick interval}{25}.
+% \item Change the colour of the grid to light grey by appending \keyval{draw}{lightgray} to the \key{grid} style
+% \item Change the colour of the axis to grey by appending \keyval{draw}{gray} to the \key{axis line}, \key{minor
+% tick}, and \key{major tick} styles.
+% \item Change the font used for interval labels to small san-serif by appending \keyval{node
+% font}{\cs{sffamily}\cs{small}} to the \key{interval label} style
+% \item Change the colour of the intervals by defining a style \key{julioclaudian} that sets \keyval{interval bar
+% color}{red!80!black} and applying it to each interval via its optional argument. (While \key{interval bar
+% color} could be set locally for each interval, it is better to define a style that corresponds to the
+% semantic meaning of the colour: in this case, a single dynasty.)
+% \item Use the \key{right} key to place some labels on the right
+% \end{enumerate}
+%
+% The result is the following code, which produces \fullref{Figure}{fig:example2-v2}.
+%
+% \lstinputlisting{timechart-example2-v2.tex}
+%
+% \begin{figure}[ht]
+% \centering
+% \input{timechart-example2-v2.tex}
+% \caption{Chart showing the lifetimes of Roman emperors of the Julio-Claudian dynasty.}
+% \label{fig:example2-v2}
+% \end{figure}
+%
+%
+%
+% \section{Configuration}
+%
+% All \pkg{timechart} configuration, global or local, is via PGF keys, so some familiarity with their use is beneficial;
+% see the PGF/\TikZ\ manual.
+%
+% Configuration keys for \pkg{timechart} are contained in \key{/timechart/} in the PGF keys hierarchy. The
+% \meta{options} passed to the \env{timechart} environment or any of the commands \cs{timechartinterval},
+% \cs{timecharttext}, or \cs{timechartspace} are processed within \key{/timechart/} (since \key{/timechart/.cd} is
+% executed before keys are processed).
+%
+% The user may wish to define PGF styles for different kinds of interval within a chart. For example, one could
+% define styles \key{science} and \key{art} that set a particular colour for the interval, and write
+% \cs{timechartinterval}\key{[science]}\marg{birth}\marg{death}\marg{name} or
+% \cs{timechartinterval}\key{[art]}\marg{birth}\marg{death}\marg{name} to distinguish visually the lifetimes of
+% various scientists and artists.
+%
+%
+%
+% \section{Specifying dates and date ranges}
+% \label{sec:dates-and-ranges}
+%
+% Using \pkg{timechart} requires specification of dates and date ranges for the start and finish of each interval, both
+% of which may be uncertain.
+%
+% The basic specification of a date uses \ISO~8601 format \mcode{YYYY-MM-DD}. This format specifies a date with
+% day-level precision; use \mcode{YYYY-MM} and \mcode{YYYY} for month- and year-level precision. If the date is prefixed
+% by \mcode{-}, it is treated as the corresponding date before the epoch. (This is a difference with \ISO~8601, in which
+% \texttt{0} represents \timechartmakebeforeyear{1}, \texttt{-1} represents \timechartmakebeforeyear{2}, and so on.) So
+% (assuming that one is using \textsc{bce}/\textsc{ce}) one uses \mcode{-100} to indicate \timechartmakebeforeyear{100}
+% and \mcode{100} to indicate \timechartmakeafteryear{100}. (The era indicators `\textsc{bce}' and `\textsc{ce}' appear
+% on the axis. Alternative era indicators --- or a different epoch --- can be specified; see
+% \fullref{Section}{sec:era-indicators}.)
+%
+% A date can be prefixed with a \mcode{c} to indicate `circa', such as \mcode{c-100} for `circa
+% \timechartmakebeforeyear{100}' and \mcode{c100} for `circa \timechartmakeafteryear{100}'. When an interval is drawn in
+% a chart, `circa' will be indicated by automatically creating (or extending) a range according to the value of the key
+% \key{circa uncertainty} (see \fullref{Subsection}{subsec:intervals}).
+%
+% A date range comprises two dates (each with or without \mcode{c}) separated by a slash \mcode{/}, with the first date
+% being earlier (or equal to) the second date. (The slash indicates a range of dates per \ISO~8601.) A date
+% range can be used to indicate a broader uncertainty than the default `circa', or to indicate a definite range within
+% which an interval starts or ends.
+%
+% \begin{description}
+% \item[Examples of correctly formatted dates and date ranges:] \mcode{-50}, \mcode{100}, \mcode{c-50},
+% \mcode{c100}, \mcode{-50/100}, \mcode{c-50 / +100}, \mcode{-50/c100}, \mcode{c-50/c100}, \mcode{-585-05-28},
+% \mcode{1947-12-01}, \mcode{1989-11}.
+%
+% \item[Examples of incorrectly formatted date and date ranges:] \mcode{100?}, \mcode{100CE}, \mcode{100BCE},
+% \mcode{-50-100}, \mcode{100/-50}.
+% \end{description}
+%
+% \noindent That is, the syntax for dates and date ranges is per the following (not-quite-formal) grammar:
+%
+% \smallskip
+%
+% \begin{bnf}
+% \meta{cdate-or-crange} ::= \meta{cdate}
+% | \meta{crange} ;;
+% \meta{cdate} ::= \meta{date}
+% | \mcode{c}\meta{date} ;;
+% \meta{date} ::= \meta{pdate}
+% | \mcode{-}\meta{pdate} ;;
+% \meta{pdate} ::= \meta{year}\mcode{-}\meta{month}\mcode{-}\meta{day}
+% | \meta{year}\mcode{-}\meta{month}
+% | \meta{year} ;;
+% \meta{crange} ::= \meta{\(\text{date}_1\)}\mcode{/}\meta{\(\text{date}_2\)}
+% | \mcode{c}\meta{\(\text{date}_1\)}\mcode{/}\meta{\(\text{date}_2\)}
+% | \meta{\(\text{date}_1\)}\mcode{/}\mcode{c}\meta{\(\text{date}_2\)}
+% | \mcode{c}\meta{\(\text{date}_1\)}\mcode{/}\mcode{c}\meta{\(\text{date}_2\)} ~~~(with \(\text{date}_1 \leq \text{date}_2\)) ;;
+% \end{bnf}
+%
+% \smallskip
+%
+% \noindent The bounds of the \env{timechart} environment (see \fullref{Section}{sec:timechart-env}) must satisfy
+% \meta{cdate} in this grammar (although only the \meta{year} is used); the start and finish dates of an
+% \cs{timechartinterval} command (see \fullref{Subsection}{subsec:intervals}) must satisfy \meta{cdate-or-crange}; the
+% parameter of an \cs{timecharttext} command (see \fullref{Subsection}{subsec:text}) must satisfy \meta{date}.
+%
+% \medskip
+% \noindent \textit{Note.} For performance reasons, the date parser does only limited error-checking. Months outside the
+% range from \mcode{01} to \mcode{12} or days outside the range of the specified month will be ignored. Otherwise
+% malformed dates or date ranges may produce obscure error messages or unexpected results.
+%
+%
+%
+% \section{\env{timechart} environment}
+% \label{sec:timechart-env}
+%
+% \begin{function}{timechart}
+% \begin{syntax}
+% \cs{begin}\texttt{\{}\env{timechart}\texttt{\}}\oarg{options}\marg{start}\marg{finish}
+% \meta{content}
+% \cs{end}\texttt{\{}\env{timechart}\texttt{\}}
+% \end{syntax}
+% This is the main environment for creating a chronological chart. The mandatory arguments \meta{start} and
+% \meta{finish} specify the first and last years of the chart. These can be dates with circa indicators (that is, they
+% satisfy \meta{cdate} in the grammar in \fullref{Section}{sec:dates-and-ranges}), but the circa specifier has no
+% effect and only the `year' part of the date is used. The optional argument \meta{options} supplies PGF keys that
+% apply to the entire chart.
+%
+% The \meta{content} comprises commands like \cs{timechartinterval}, \cs{timecharttext}, \cs{timechartspace},
+% commands for positioning, as described in \fullref{Section}{sec:within}, and the user's own \TikZ\ code.
+% \end{function}
+%
+%
+%
+% \subsection{General configuration of the \env{timechart} environment}
+%
+% \begin{describekey}{/timechart/width}{dimension}{\cs{textwidth}}
+% The width of the chart. This refers to the width of the grid and axis of the chart, not
+% including intervals that pass beyond the specified limits of the chart, or axis labels that protrude beyond the
+% width of the axis itself.
+% \end{describekey}
+%
+%
+% \begin{describekey}{/timechart/tolerance}{dimension}{5pt}
+% The length by which an interval is allowed to pass beyond the limits of the chart before it `counts' as doing so
+% and the appropriate indicator is drawn.
+% \end{describekey}
+%
+%
+% \begin{describekey}{/timechart/beyond length}{dimension}{5pt}
+% The length of the indicator that an interval passes beyond the limits of the chart.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/beyond x radius}{dimension}{4pt}
+% The horizontal radius of the concave part of the indicator that an interval passes beyond the limits of the chart.
+% (The vertical radius will be half the thickness of the bar.)
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/ystep}{dimension}{-10pt}
+% The default length (positive or negative) by which the current \(y\) coordinate is automatically adjusted after each
+% interval, text, or space is placed.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/minor tick interval}{number}{10}
+% The number of years (which must be positive) between each minor tick on the axis.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/major tick interval}{number}{50}
+% The number of years (which must be positive) between each major tick on the axis and each vertical line in the grid.
+% \end{describekey}
+%
+%
+%
+% \subsection{Grid configuration}
+%
+% \begin{describekey}{/timechart/no grid}{}{}
+% Do not draw the grid.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/grid top ysep}{dimension}{3pt}
+% Distance between the top of the grid and the topmost interval or space.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/grid bottom ysep}{dimension}{3pt}
+% Distance between the bottom of the grid and the bottommost interval or space.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/grid}{style}{empty}
+% Style for drawing the grid.
+% \end{describekey}
+%
+%
+%
+% \subsection{Axis configuration}
+%
+% \begin{describekey}{/timechart/no axis}{}{}
+% Do not draw the axis.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/axis line}{style}{\keyval{line cap}{rect}}
+% Style for drawing the axis line.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/minor tick}{style}{empty}
+% Style for drawing minor ticks.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/minor tick length}{dimension}{1.5mm}
+% Length of minor ticks.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/major tick}{style}{empty}
+% Style for drawing major ticks.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/major tick length}{dimension}{3mm}
+% Length of major ticks.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/major tick label}{style}{as described below}
+% Style for labels on the major ticks on the axis. The intial style essentially sets \keyval{inner sep}{0},
+% \keyval{outer sep}{0}, \keyval{anchor}{mid west}, \keyval{rotate}{90}.
+% \end{describekey}
+%
+%
+%
+% \section{Within the \env{timechart} environment}
+% \label{sec:within}
+%
+%
+%
+%
+% \subsection{Intervals}
+% \label{subsec:intervals}
+%
+% \begin{function}{\timechartinterval}
+% \begin{syntax}
+% \cs{timechartinterval}\oarg{options}\marg{start}\marg{finish}\marg{label}
+% \end{syntax}
+% This command creates an interval in the chart at the current \(y\) coordinate between the specified \meta{start} and
+% \meta{finish}, with the given \meta{label}. These arguments are mandatory. Each of \meta{start} and \meta{finish}
+% can be either a year or a range of years, possibly with circa markers. That is, each must satisfy
+% \meta{cyear-or-crange} in the grammar in \fullref{Section}{sec:dates-and-ranges}.
+%
+% The optional argument \meta{options} specifies PGF keys within \key{/timechart/} that are applied locally to the
+% interval.
+%
+% The current \(y\) coordinate will be adjusted according to \key{/timechart/ystep} unless \key{/timechart/no
+% autostep} has been set.
+% \end{function}
+%
+%
+%
+% \subsubsection{Interval configuration}
+%
+% \begin{describekey}{/timechart/no autostep}{}{}
+% Do not automatically alter the current \(y\) coordinate by the amount specified in \key{/timechart/ystep}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/ref}{label}{none}
+% Make the interval label a hyperlink to the position labelled by \meta{label}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/mark}{comma-separated list of years}{empty}
+% Draw marks in the interval at the years contained in the list. Each entry in the list must be a definite year (that
+% is, must satisfy \meta{year} in the grammar in \fullref{Section}{sec:dates-and-ranges}). The colour of marks can be
+% specified using \key{/timechart/interval mark color}. \key{/timechart/marks} is a synonym for this key.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/circa uncertainty}{number}{3}
+% Treat a circa indicator \mcode{c} as indicating an uncertainity of \(\pm\meta{number}\).
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval minimum width}{dimension}{1pt}
+% Ensure that any interval has a width of at least \meta{dimension}. This is useful to ensure that a single event is
+% visible in the chart.
+%
+% If an interval is specified with start and finish ranges, and with \keyval{start range}{fade} and \keyval{finish
+% range}{fade}, then the `certain' portion of the interval will also have width at least \meta{dimension}. (This
+% restriction prevents a common rendering error where start and finish fadings around a `certain' interval of length
+% \(0\) would not quite meet.)
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval bar color}{color}{black}
+% Fill the interval bar with \meta{color}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval bar thickness}{dimension}{8pt}
+% Set the vertical thickness of the interval bar to \meta{dimension}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval bar node name}{string}{bar node}
+% Set the name of the node containing the interval bar to \meta{string}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval mark color}{color}{gray}
+% Draw marks using \meta{color}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval label}{style}{empty}
+% Style to apply to an interval label.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval label centered}{style}{as below}
+% Style to apply to an interval label placed centrally. Initially, this style executes the style
+% \key{/timechart/interval label} and sets \keyval{text}{white}. The reason for a separate style for centred labels is
+% that often a contrasting colour will be required. For instance, labels positioned to the left and right may be
+% black, but if the bar is black, a centred label should be a light colour.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval label centered background}{style}{as below}
+% Style to apply to the `background' interval label placed centrally. Initially, this style executes
+% \key{/timechart/interval label}. The `background' interval label is simply the usual label and is placed in the same
+% location, but on a layer behind the bar and, unlike the label itself, is not clipped. The reason for this style is
+% that if the bar is narrow, part of the label text (such as ascenders and/or descenders) may naturally extend beyond
+% the bar itself and it may be useful that thse should appear in a different colour.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval label baseline}{dimension}{-3pt}
+% Position the baseline of the interval label \meta{dimension} below the current \(y\) coordinate (which is the
+% midpoint of the interval bar).
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval label pos}{position}{left}
+% Specify where to place the label relative to the interval bar: \meta{position} may be \val{left}, \val{center}, or
+% \val{right}. The position \val{center} places the label at the midpoint of \emph{the visible segment of the solid
+% part} of the interval bar (that is, not including fading at the start or finish of the bar, and not including part
+% of the bart that would extend beyond the bounds of the chart). Further, a centred label is clipped to the size of
+% the bar and a unclipped `background' copy of it is drawn behind the bar, so that the portion appearing `on' and
+% `outside' the bar can have different styles. (See the keys \key{/timechart/interval label centered} and
+% \key{/timechart/interval label centered background}.)
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/interval label node name}{string}{label node}
+% Set the name of the node containing the interval label to \meta{string}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/start range}{range-type}{fade}
+% Type of indication of the range where an interval may start. \meta{range-type} can be \val{fade}, which produces an
+% indicator like \timechartlegendstartrange[legend item width=8mm], or \val{slant}, which produces
+% \timechartlegendstartrange[legend item width=8mm,start range=slant].
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/finish range}{range-type}{fade}
+% Type of indication of the range where an interval may finish. \meta{range-type} can be \val{fade}, which produces an
+% indicator like \timechartlegendfinishrange[legend item width=8mm], or \val{slant}, which produces
+% \timechartlegendfinishrange[legend item width=8mm,finish range=slant].
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/fade minimum width}{dimension}{0pt}
+% No start or finish range indicator of type \val{fade} will be drawn if it is smaller than \meta{dimension}. Using
+% this key is sometimes necessary because, under certain limited circumstances, a very narrow fading can cause
+% PGF/\TikZ\ to produce a \texttt{dimension too large} error.
+% \end{describekey}
+%
+%
+%
+% \subsection{Text}
+% \label{subsec:text}
+%
+% \begin{function}{\timecharttext}
+% \begin{syntax}
+% \cs{timecharttext}\oarg{options}\marg{year}\marg{text}
+% \end{syntax}
+% Place \meta{text} in the time chart at the current \(y\) coordinate and at the horizontal position of \meta{year},
+% which must be a definite year (that is, must satsify \meta{year} in the grammar in
+% \fullref{Section}{sec:dates-and-ranges}).
+%
+% The optional argument \meta{options} specifies PGF keys within \key{/timechart/} that are applied locally.
+%
+% The current \(y\) coordinate will be adjusted according to \key{/timechart/ystep} unless \key{/timechart/no
+% autostep} has been set.
+% \end{function}
+%
+%
+%
+% \subsubsection{Text configuration}
+%
+% \begin{describekey}{/timechart/text node name}{string}{text node}
+% Set the name of the node containing the text to \meta{string}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/text}{style}{empty}
+% Style to apply to the text.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/text baseline}{dimension}{-3pt}
+% Position the baseline of the text \meta{dimension} below the current \(y\) coordinate.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/text pos}{position}{left}
+% Specify where to place the label relative to the given \meta{year}: \meta{position} may be \val{left}, \val{center},
+% or \val{right}.
+% \end{describekey}
+%
+%
+%
+% \subsection{Space}
+%
+% \begin{function}{\timechartspace}
+% \begin{syntax}
+% \cs{timechartspace}\oarg{options}
+% \end{syntax}
+% Create a space in the time chart at the current \(y\) coordinate, with the same effect on vertical spacing as an
+% interval. More precisely, the current \(y\) coordinate will be adjusted according to \key{/timechart/ystep} unless
+% \key{/timechart/no autostep} has been set.
+%
+% The optional argument \meta{options} specifies PGF keys within \key{/timechart/} that are applied locally.
+% \end{function}
+%
+%
+%
+% \subsection{Positioning}
+% \label{subsec:positioning}
+%
+% The commands \cs{timechartinterval}, \cs{timecharttext}, and \cs{timechartspace} all act at the current \(y\)
+% coordinate and change its value according to \key{/timechart/ystep} (unless \key{/timechart/no autostep} is used).
+% There are several functions to set the current \(y\) coordinate and to have it reset automatically.
+%
+% \begin{function}{\timechartsety}
+% \begin{syntax}
+% \cs{timechartsety}\marg{dimension}
+% \end{syntax}
+% Set the current \(y\) coordinate to \meta{dimension}.
+% \end{function}
+%
+% \begin{function}{\timechartsavey}
+% \begin{syntax}
+% \cs{timechartsavey}
+% \end{syntax}
+% Save the current \(y\) coordinate. If \cs{timechartresety} is used, the \(y\) coordinate resets to the last saved
+% \(y\) coordinate. If the current \(y\) coordinate exceeds the minimum or maximum set by
+% \cs{timechartsetyminimumautoreset} and \cs{timechartsetymaximumautoreset}, it will be reset to the last saved \(y\)
+% coordinate.
+% \end{function}
+%
+% \begin{function}{\timechartresety}
+% \begin{syntax}
+% \cs{timechartresety}
+% \end{syntax}
+% Reset the \(y\) coordinate to the last coordinate saved using \cs{timechartsavey}, or to \(0\) if there has been no
+% use of \cs{timechartsavey} within the current \env{timechart} environment.
+% \end{function}
+%
+% \begin{function}{\timechartsetyminimumautoreset, \timechartsetymaximumautoreset}
+% \begin{syntax}
+% \cs{timechartsetyminimumautoreset}\marg{min-coordinate}
+% \cs{timechartsetymaximumautoreset}\marg{max-coordinate}
+% \end{syntax}
+% Set \(y\) coordinates that automatically trigger \cs{timechartresety} if the current \(y\) coordinate goes below
+% \meta{min-coordinate} or above \meta{max-coordinate}.
+% \end{function}
+%
+% \begin{function}{\timechartstepy}
+% \begin{syntax}
+% \cs{timechartstepy}\oarg{count}
+% \end{syntax}
+% Manually step the current \(y\) coordinate by \meta{count} times the value of \key{/timechart/ystep}. The default
+% value of \meta{count} is 1. (The \key{/timechart/no autostep} does not affect \cs{timechartstepy}.)
+% \end{function}
+%
+%
+%
+% \subsection{Completion}
+%
+% \begin{function}{\timechartfinish}
+% Signal that the chart is complete and that the grid and axis should be drawn (unless the keys \key{/timechart/no
+% grid} and/or \key{/timechart/no axis} have been used). It is not necessary to use this command: if it is not given,
+% the grid and axis will be drawn at the end of the \env{timechart} environment. But after this command, the \TikZ\
+% nodes \texttt{grid} and \texttt{axis} are available, containing (respectively) the grid and the axis. These can be
+% used in for further \TikZ\ drawing.
+%
+% Note that after \cs{timechartfinish}, none of the various \cs{timechart}\ldots\ commands are available inside that
+% \env{timechart} environment.
+% \end{function}
+%
+%
+%
+% \subsection{Shortcut keys}
+%
+% \begin{describekey}{/timechart/left}{}{}
+% Equivalent to setting \key{/timechart/interval label pos} and \key{/timechart/text pos} to \val{left}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/center}{}{}
+% Equivalent to setting \key{/timechart/interval label pos} and \key{/timechart/text pos} to \val{center}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/right}{}{}
+% Equivalent to setting \key{/timechart/interval label pos} and \key{/timechart/text pos}{right} to \val{right}.
+% \end{describekey}
+%
+%
+%
+% \section{Era indicators}
+% \label{sec:era-indicators}
+%
+% \begin{function}{\timechartmakebeforeyear,\timechartmakeafteryear}
+% \begin{syntax}
+% \cs{timechartmakebeforeyear}\marg{number}
+% \cs{timechartmakeafteryear}\marg{number}
+% \end{syntax}
+% Typeset \meta{number} (which should be a positive whole number) as a year before or after the epoch. By default,
+% \cs{timechartmakebeforeyear}\marg{number} produces \timechartmakebeforeyear{\meta{number}} and
+% \cs{timechartmakeafteryear}\marg{number} produces \timechartmakeafteryear{\meta{number}}.
+%
+% These commands are used for axis labels and can be re-defined by the user. For example, if \textsc{bc}/\textsc{ad}
+% is preferred to \textsc{bce}/\textsc{ce}, the user can define
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\renewcommand*{\timechartmakebeforeyear}[1]{#1~\textsc{bc}}
+\renewcommand*{\timechartmakeafteryear}[1]{\textsc{ad}~#1}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Similarly, if \textsc{ah}/\textsc{bh} is preferred, the user can define
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\renewcommand*{\timechartmakebeforeyear}[1]{#1~\textsc{bh}}
+\renewcommand*{\timechartmakeafteryear}[1]{\textsc{ah}~#1}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% \end{function}
+%
+%
+%
+% \section{Legend}
+% \label{sec:keys}
+%
+% \pkg{timechart} supplies a number of auxiliary macros for creating a legend to explain, for example the significance
+% of different colours of intervals. For example, \fullref{Figure}{fig:example1-legend} shows a suitable legend for
+% \fullref{Figure}{fig:example1}.
+%
+% \begin{figure}[t]
+% \centering
+% \input{timechart-example1-legend.tex}
+% \caption{Example legend for the timechart shown in \fullref{Figure}{fig:example1}.}
+% \label{fig:example1-legend}
+% \end{figure}
+%
+% The \cs{timechartlength}\ldots\ macros are \emph{not} meant to be used inside a \env{timechart} environment, but in
+% locations such as running text or a \env{tabular} environment.
+%
+% \begin{function}{\timechartlegenditem}
+% \begin{syntax}
+% \cs{timechartlegenditem}\oarg{options}
+% \end{syntax}
+% Draw a bar suitable for use in a legend. \meta{options} specifies PGF keys that are applied within
+% \key{/timechart}. The same PGF keys that affect interval bars affect the drawn bar, as do the keys listed below.
+% \end{function}
+%
+% \begin{function}{\timechartlegendstartrange, \timechartlegendfinishrange}
+% \begin{syntax}
+% \cs{timechartlegendstartrange}\oarg{options}
+% \cs{timechartlegendfinishrange}\oarg{options}
+% \end{syntax}
+% Draw a bar suitable for use in a legend, with a start or finish range. \meta{options} specifies PGF keys that are
+% applied within \key{/timechart/}. The same PGF keys that affect interval bars affect the drawn bar, as do the
+% keys listed below.
+% \end{function}
+%
+% \begin{describekey}{/timechart/legend item width}{dimension}{9mm}
+% When using macros \cs{timechartlegenditem}, \cs{timechartlegendstartrange}, or \cs{timechartlegendfinishrange}, draw
+% a bar of total width \meta{dimension}.
+% \end{describekey}
+%
+% \begin{describekey}{/timechart/legend item range width}{dimension}{3mm}
+% When using \cs{timechartlegendstartrange} or \cs{timechartlegendfinishrange}, draw a bar with a range of width
+% \meta{dimension}.
+% \end{describekey}
+%
+%
+%
+% \section{Usage notes}
+%
+% \subsection{Additional \TikZ\ code}
+%
+% The \env{timechart} environment is a \env{tikzpicture}. The user can add any \TikZ\ code before, between, or after
+% content created using the \cs{timechart}\ldots\ commands. Each use of \cs{timechartinterval} defines two nodes. One,
+% by default named \val{bar node}, contains the interval bar; the other, by default named \val{label node}, contains the
+% interval label. Similarly, text added using \cs{timecharttext} is contained in a node, by default named \val{text
+% node}. (The default names are re-used, but can be changed using the keys \key{/timechart/interval bar node name},
+% \key{/timechart/interval label node name}, and \key{/timechart/text node name}.) The user can use these nodes to
+% position extra content.
+%
+% If the \cs{timechartcomplete} command is used (after which the \cs{timechart}\ldots\ commands are no longer available
+% within the \env{timechart} environment) the nodes \mcode{grid} and \mcode{axis}, which contain the grid and the axis,
+% are also available.
+%
+%
+%
+% \subsection{\texorpdfstring{`year zero'}{year zero}}
+%
+% Although calendars typically do not admit a `year zero' (for instance, \timechartmakebeforeyear{1} is immediately
+% followed by \timechartmakeafteryear{1}, with no intervening `year zero'), \pkg{timechart} does allow \val{0} for the
+% \meta{start} or \meta{finish} of the \env{timechart} environment or as the \meta{start} or \meta{finish} of
+% \cs{timechartinterval} or the \meta{year} of \cs{timecharttext}. But `year zero' is indicated on the axis by a special
+% epoch marker showing the last year before and first year after the epoch.
+%
+%
+%
+% \subsection{\texorpdfstring{\texttt{dimension too large}}{dimension too large} error}
+%
+% Under certain limited circumstances, a very narrow fading can cause PGF/\TikZ\ to produce a \texttt{dimension too
+% large} error. This error can be triggered by a range of type \val{fade} at the start or end of an interval when the
+% range is small compared to the width of the chart. In this case, the fading is unlikely to be visible, so one can
+% simply set \key{/timechart/fade minimum width} to a suitable small positive value, which will stop the fading from
+% being drawn and so prevent the error.
+%
+%
+%
+% \section{Appendix: full example source}
+% \label{sec:full-example}
+%
+% This section contains the necessary source code to produce the example timechart and legend shown in
+% \fullref{Figures}{fig:example1} and \ref{fig:example1-legend} on pages \pageref{fig:example1} and
+% \pageref{fig:example1-legend}.
+%
+%
+%
+% \subsection{Setup source}
+%
+% \lstinputlisting{timechart-example1-setup.tex}
+%
+%
+%
+% \subsection{Timechart source}
+%
+% \lstinputlisting[breaklines=true]{timechart-example1-timechart.tex}
+%
+%
+%
+% \subsection{Legend source}
+%
+% \lstinputlisting{timechart-example1-legend.tex}
+%
+%
+%
+% \end{documentation}
+%
+%
+%
+% \begin{implementation}
+%
+% \setcounter{secnumdepth}{7}
+%
+%
+%
+% \section{Implementation}
+%
+% \begin{macrocode}
+%<*package>
+%<@@=timechart>
+% \end{macrocode}
+%
+%
+%
+% \subsection{Coding standard}
+%
+% This package makes extensive use of \pkg{pgfmath} computations. The usual \pkg{expl3} standard of ending variables
+% with a type indicator (\texttt{\_bool}, \texttt{\_int}, etc.) is therefore adapted as follows:
+% \begin{itemize}
+% \item[\texttt{\_year}] Stores a year, which could in principle be fractional.
+% \item[\texttt{\_pgf}] Stores a length calculated by \pkg{pgfmath}. (Unlike \texttt{\_dim}, there is no underlying
+% dimension register.)
+% \item[\texttt{\_x}] Stores a raw \(x\) coordinate (not in \TikZ's XY-coordinate system).
+% \item[\texttt{\_y}] Stores a raw \(y\) coordinate (not in \TikZ's XY-coordinate system).
+% \item[\texttt{\_text}] Stores text (not an \pkg{expl3} string).
+% \end{itemize}
+%
+%
+%
+% \subsection{Initial set-up}
+%
+% Package identification/version information.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[2020-02-02]
+\ProvidesExplPackage{timechart}{2025-02-15}{0.51}
+ {Typesetting chronological charts}
+% \end{macrocode}
+%
+%
+%
+% \subsection{Load TikZ}
+%
+% \begin{macrocode}
+\RequirePackage{tikz}
+% \end{macrocode}
+% In the remainder of the package, only a limited subset of \TikZ\ is used, and PGF code is preferred. For PGF keys, it
+% is necessary to use \texttt{\textasciitilde} in place of a space.
+%
+%
+%
+% \subsection{Scratch variables}
+%
+% \begin{macro}{\l_@@_tmpa_bool,\l_@@_tmpb_bool,\l_@@_tmpc_bool,\l_@@_tmpd_bool}
+% Scratch boolean variables.
+% \begin{macrocode}
+\bool_new:N\l_@@_tmpa_bool
+\bool_new:N\l_@@_tmpb_bool
+\bool_new:N\l_@@_tmpc_bool
+\bool_new:N\l_@@_tmpd_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_tmpa_dim,\l_@@_tmpb_dim,\l_@@_tmpc_dim,\l_@@_tmpd_dim}
+% Scratch dimension variables, reusing \cs{l_tmpa_dim} and \cs{l_tmpb_dim} with uniform names.
+% \begin{macrocode}
+\cs_set_eq:NN\l_@@_tmpa_dim\l_tmpa_dim
+\cs_set_eq:NN\l_@@_tmpb_dim\l_tmpb_dim
+\dim_new:N\l_@@_tmpc_dim
+\dim_new:N\l_@@_tmpd_dim
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Generic auxiliary functions}
+%
+% \begin{macro}{\@@_make_ref:NN}
+% Make hyperreference from text, if the supplied target is non-empty.
+% \begin{arguments}
+% \item Reference for hyperlink target, or empty.
+% \item Text.
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Npn\@@_make_ref:NN #1#2
+ {
+ \str_if_empty:NTF #1
+ { #2 }
+ { \hyperref[#1]{#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{PGF auxiliary functions}
+%
+% \begin{macro}{@@_pgfmathsetbool:nn}
+% Set an \pkg{expl3} boolean variable to the outcome of a \pkg{pgfmath} comparison. This macro is simply a wrapper
+% around \cs{pgfmathsetmacro} using \mcode{ifthenelse} and returning the boolean literal true or false.
+% \begin{macrocode}
+\cs_new:Npn\@@_pgfmathsetbool:nn #1#2
+ {
+ \pgfmathsetmacro{#1}{ifthenelse(#2,"\c_true_bool","\c_false_bool")}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_if_equal:nnF}%
+% Use \pkg{pgfmath} to check whether \param{1} and \param{2} are equal. If not, execute \param{3}.
+% \begin{macrocode}
+\cs_new:Npn\@@_if_equal:nnF #1#2#3
+ {
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}{#1==#2}
+ \bool_if:NF\l_@@_tmpa_bool{#3}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_pgfextractxy:nnn}
+% Extract coordinates of \param{3} (a PGF point) to dimension variables \param{1} and \param{2}. This macro simply
+% combines the functionality of \cs{pgfextractx} and \cs{pgfextracty}.
+% \begin{macrocode}
+\cs_new:Npn\@@_pgfextractxy:nnn #1#2#3
+ {
+ \pgf@process{#3}
+ #1=\pgf@x\relax
+ #2=\pgf@y\relax
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_hsmash_pgfnode:nnnnn}
+% Do the same as \cs{pgfnode} but only update the bounding box `vertically'.
+% \begin{macrocode}
+\cs_new:Npn\@@_hsmash_pgfnode:nnnnn #1#2#3#4#5
+ {
+ \pgfinterruptboundingbox
+ \pgfnode{#1}{#2}{#3}{#4}{#5}
+ \pgfcoordinate
+ {@@_tmpa_coord}
+ {\pgfpointanchor{current~bounding~box}{south}}
+ \pgfcoordinate
+ {@@_tmpb_coord}
+ {\pgfpointanchor{current~bounding~box}{north}}
+ \endpgfinterruptboundingbox
+ \pgfextractx
+ {\l_@@_tmpa_dim}
+ {\pgfpointanchor{@@_tmpa_coord}{center}}
+ \pgfextractx
+ {\l_@@_tmpb_dim}
+ {\pgfpointanchor{@@_tmpb_coord}{center}}
+ \pgfpathmoveto{\pgfpoint{\l_@@_tmpa_dim}{0}}
+ \pgfpathmoveto{\pgfpoint{\l_@@_tmpb_dim}{0}}
+ \pgfusepath{discard}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_make_rectangle_node:nnnn}
+% Make a node with south west corner \param{1}, north east corner \param{2}, and name \param{3}. \param{1} and
+% \param{2} should be given as PGF points. \param{4} is a boolean literal indicating whether the path should be
+% stroked.
+% \begin{macrocode}
+\cs_new:Npn\@@_make_rectangle_node:nnnn #1#2#3#4
+ {
+ \group_begin:
+ \@@_pgfextractxy:nnn
+ {\l_@@_tmpa_dim}{\l_@@_tmpb_dim}{#1}
+ \@@_pgfextractxy:nnn
+ {\l_@@_tmpc_dim}{\l_@@_tmpd_dim}{#2}
+ \pgftransformshift{#1}
+ \pgfset{
+ minimum~width=\l_@@_tmpc_dim-\l_@@_tmpa_dim,
+ minimum~height=\l_@@_tmpd_dim-\l_@@_tmpb_dim,
+ inner~sep=0,
+ outer~sep=0,
+ }
+ \bool_if:NTF #4
+ { \pgfnode{rectangle}{south~west}{}{#3}{\pgfusepath{draw}} }
+ { \pgfnode{rectangle}{south~west}{}{#3}{\pgfusepath{discard}} }
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_left_nonclip_x,\l_@@_right_nonclip_x}
+% In order to clip `only on one side', define coordinates for specifying the `other side' of the clipping path.
+% \begin{macrocode}
+\pgfmathsetmacro{\l_@@_left_nonclip_x}{-16000pt}
+\pgfmathsetmacro{\l_@@_right_nonclip_x}{16000pt}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_style_line_width:nn}
+% Set macro \param{1} to be the line width set by the PGF style \param{2}. Note that \cs{begingroup} and \cs{endgroup}
+% are used here because of the definition of \cs{pgfmathsmuggle}.
+% \begin{macrocode}
+\cs_new:Npn\@@_set_style_line_width:nn #1#2
+ {
+ \begingroup
+ \tikzset{#2}
+ \pgfmathsetlengthmacro{#1}{\pgflinewidth}
+ \pgfmathsmuggle #1
+ \endgroup
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{PGF keys}
+%
+% All PGF keys for this package are under \key{/timechart/}.
+% \begin{macrocode}
+\pgfkeys{
+ /timechart/.cd,
+% \end{macrocode}
+% Keys applicable to whole chart.
+% \begin{macrocode}
+ width/.initial=\textwidth,
+ tolerance/.initial=5pt,
+ beyond~length/.initial=5pt,
+ beyond~x~radius/.initial=4pt,
+ ystep/.initial=-10pt,
+ minor~tick~interval/.initial=10,
+ major~tick~interval/.initial=50,
+% \end{macrocode}
+% Keys applicable to the grid.
+% \begin{macrocode}
+ no~grid/.code = { \bool_set_false:N\l_@@_grid_bool },
+ grid~top~ysep/.initial={3pt},
+ grid~bottom~ysep/.initial={3pt},
+ grid/.style={},
+% \end{macrocode}
+% Keys applicable to the axis.
+% \begin{macrocode}
+ no~axis/.code = { \bool_set_false:N\l_@@_axis_bool },
+ axis~line/.style={
+ line~cap=rect,
+ },
+ axis~ysep/.initial=3pt,
+ minor~tick/.style={},
+ minor~tick~length/.initial=1.5mm,
+ major~tick/.style={},
+ major~tick~length/.initial=3mm,
+ major~tick~label/.style={
+ inner~sep=0,
+ outer~sep=0,
+ anchor=mid~west,
+ rotate=90,
+ },
+% \end{macrocode}
+% Keys applicable to intervals, texts, spaces, and legends.
+% \begin{macrocode}
+ no~autostep/.code = { \bool_set_false:Nz\l_@@_autostep_bool },
+ ref/.initial={},
+ mark/.initial={},
+ marks/.forward~to=/timechart/mark,
+ circa~uncertainty/.initial=3,
+ interval~minimum~width/.initial=1pt,
+ interval~bar~color/.initial=black,
+ interval~bar~thickness/.initial=8pt,
+ interval~bar~node~name/.initial = {bar~node},
+ interval~mark~color/.initial=gray,
+ interval~label/.style={},
+ interval~label~centered/.style={/timechart/interval~label,text=white},
+ interval~label~centered~background/.style={/timechart/interval~label},
+ interval~label~baseline/.initial=-3pt,
+ interval~label~pos/.is~choice,
+ interval~label~pos/left/.code
+ = { \int_set:Nn\l_@@_label_pos_int{0} },
+ interval~label~pos/center/.code
+ = { \int_set:Nn\l_@@_label_pos_int{1} },
+ interval~label~pos/right/.code
+ = { \int_set:Nn\l_@@_label_pos_int{2} },
+ interval~label~node~name/.initial = {label~node},
+ start~range/.is~choice,
+ start~range/fade/.code
+ = { \int_set:Nn\l_@@_start_range_type_int{0} },
+ start~range/slant/.code
+ = { \int_set:Nn\l_@@_start_range_type_int{1} },
+ finish~range/.is~choice,
+ finish~range/fade/.code
+ = { \int_set:Nn\l_@@_finish_range_type_int{0} },
+ finish~range/slant/.code
+ = { \int_set:Nn\l_@@_finish_range_type_int{1} },
+ fade~minimum~width/.initial = 0pt,
+% \end{macrocode}
+% Keys applicable only to texts.
+% \begin{macrocode}
+ text~node~name/.initial = {text~node},
+ text/.style={},
+ text~baseline/.initial=-3pt,
+ text~pos/.is~choice,
+ text~pos/left/.code = { \int_set:Nn\l_@@_text_pos_int{0} },
+ text~pos/center/.code = { \int_set:Nn\l_@@_text_pos_int{1} },
+ text~pos/right/.code = { \int_set:Nn\l_@@_text_pos_int{2} },
+% \end{macrocode}
+% Keys applicable only to legends.
+% \begin{macrocode}
+ legend~item~width/.initial=9mm,
+ legend~item~range~width/.initial=3mm,
+% \end{macrocode}
+% Shortcuts for positioning.
+% \begin{macrocode}
+ left/.code = {
+ \int_set:Nn\l_@@_label_pos_int{0}
+ \int_set:Nn\l_@@_text_pos_int{0}
+ },
+ center/.code = {
+ \int_set:Nn\l_@@_label_pos_int{1}
+ \int_set:Nn\l_@@_text_pos_int{1}
+ },
+ right/.code = {
+ \int_set:Nn\l_@@_label_pos_int{2}
+ \int_set:Nn\l_@@_text_pos_int{2}
+ },
+}
+% \end{macrocode}
+%
+% \begin{macro}{\l_@@_grid_bool}
+% Boolean indicating whether the grid will be drawn. This variable is by default true but can be set false via the
+% \key{/timechart/no grid} PGF key.
+% \begin{macrocode}
+\bool_new:N\l_@@_grid_bool
+\bool_set_true:N\l_@@_grid_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_axis_bool}
+% Boolean indicating whether the axis will be drawn. This variable is by default true but can be set false via the
+% \key{/timechart/no axis} PGF key.
+% \begin{macrocode}
+\bool_new:N\l_@@_axis_bool
+\bool_set_true:N\l_@@_axis_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_autostep_bool}
+% Boolean indicating whether to automatically step the \(y\) coordinate after an interval, text, or space. This
+% variable is by default true but can be set false via the \key{/timechart/no autostep} PGF key.
+% \begin{macrocode}
+\bool_new:N\l_@@_autostep_bool
+\bool_set_true:N\l_@@_autostep_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_label_pos_int}
+% An integer to hold the interval label position. This is set via the \key{/timechart/interval label pos} PGF key.
+% \begin{macrocode}
+\int_new:N \l_@@_label_pos_int
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_text_pos_int}
+% An integer to hold the text position. This is set via the \key{/timechart/text pos} PGF key.
+% \begin{macrocode}
+\int_new:N \l_@@_text_pos_int
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_start_range_type_int,\l_@@_finish_range_type_int}
+% Integers to hold the type of the start/end ranges. These are set via the \key{/timechart/start range} and
+% \key{/timechart/finish range} PGF keys.
+% \begin{macrocode}
+\int_new:N \l_@@_start_range_type_int
+\int_new:N \l_@@_finish_range_type_int
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Main environment}
+%
+% \begin{macro}{timechart}
+% The main environment.
+% \begin{arguments}
+% \item PGF keys to apply.
+% \item Start year.
+% \item End year.
+% \end{arguments}
+% \begin{macrocode}
+\NewDocumentEnvironment{timechart}{ O{} m m }
+ { \@@_main_begin:nnn{#1}{#2}{#3} }
+ { \@@_main_end: }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_main_begin:nnn}
+% This command uses values specified by PGF keys to make some necessary calculations to begin the chart.
+% \begin{macrocode}
+\cs_new:Npn \@@_main_begin:nnn #1#2#3
+ {
+% \end{macrocode}
+% Process the supplied PGF keys and retrieve values that affect the chart as a whole.
+% \begin{macrocode}
+ \pgfkeys{
+ /timechart/.cd,
+ #1,
+ width/.get=\l_@@_width_pgf,
+ tolerance/.get=\l_@@_tolerance_pgf,
+ ystep/.get=\l_@@_ystep_pgf,
+ grid~top~ysep/.get=\l_@@_grid_top_ysep_pgf,
+ grid~bottom~ysep/.get=\l_@@_grid_bottom_ysep_pgf,
+ beyond~length/.get=\l_@@_beyond_length_pgf,
+ beyond~x~radius/.get=\l_@@_beyond_x_radius_pgf,
+ minor~tick~interval/.get=\l_@@_minor_tick_interval_year,
+ major~tick~interval/.get=\l_@@_major_tick_interval_year,
+ }
+% \end{macrocode}
+% Start the \TikZ\ picture and set up the necessary layers.
+% \begin{macrocode}
+ \tikzpicture
+ \pgfdeclarelayer{grid}
+ \pgfdeclarelayer{labelbg}
+ \pgfsetlayers{grid,labelbg,main}
+% \end{macrocode}
+% Store the line width of the grid and axis, treating them as \qty{0}{\point} if they are disabled.
+% \begin{macrocode}
+ \bool_if:NTF\l_@@_grid_bool
+ {
+ \@@_set_style_line_width:nn
+ {\l_@@_grid_line_width}
+ {/timechart/grid}
+ }
+ { \pgfmathsetlengthmacro{\l_@@_grid_line_width}{0} }
+ \bool_if:NTF\l_@@_axis_bool
+ {
+ \@@_set_style_line_width:nn
+ {\l_@@_axis_line_width}
+ {/timechart/axis~line}
+ \@@_set_style_line_width:nn
+ {\l_@@_major_tick_line_width}
+ {/timechart/major~tick}
+ \@@_set_style_line_width:nn
+ {\l_@@_minor_tick_line_width}
+ {/timechart/minor~tick}
+ }
+ {
+ \pgfmathsetlengthmacro{\l_@@_axis_line_width}{0}
+ \pgfmathsetlengthmacro{\l_@@_major_tick_line_width}{0}
+ \pgfmathsetlengthmacro{\l_@@_minor_tick_line_width}{0}
+ }
+% \end{macrocode}
+% Store the start and finish years (ignoring circa, month, day), and then set up the conversion from years to \(x\)
+% coordinates. \cs{l_@@_x} is the \(x\)-distance corresponding to one year, and \mcode{yeartox} is the \pkg{pgfmath}
+% function that does the conversion.
+% \begin{macrocode}
+ \@@_parse_date:NNn\l_tmpa_bool\l_@@_start_year{#2}
+ \@@_parse_date:NNn\l_tmpa_bool\l_@@_finish_year{#3}
+ \pgfmathsetmacro{\l_@@_start_year}
+ {floor(\l_@@_start_year)}
+ \pgfmathsetmacro{\l_@@_finish_year}
+ {floor(\l_@@_finish_year)}
+ \pgfmathsetmacro{\l_@@_x}
+ {
+ (
+ \l_@@_width_pgf
+ - max(
+ \l_@@_grid_line_width,
+ \l_@@_axis_line_width,
+ \l_@@_major_tick_line_width,
+ \l_@@_minor_tick_line_width
+ )
+ )/(\l_@@_finish_year-\l_@@_start_year)
+ }
+ \pgfkeys{
+ /pgf/declare~function={
+ yeartox(\n)=\l_@@_x*(\n-\l_@@_start_year);
+ },
+ }
+% \end{macrocode}
+% Calculate the start and finish \(x\) coordinates.
+% \begin{macrocode}
+ \pgfmathsetmacro{\l_@@_start_x}
+ {yeartox(\l_@@_start_year)}
+ \pgfmathsetmacro{\l_@@_finish_x}
+ {yeartox(\l_@@_finish_year)}
+ \pgfmathsetmacro{\l_@@_start_tolerance_x}{
+ \l_@@_start_x-(\l_@@_tolerance_pgf)
+ }
+ \pgfmathsetmacro{\l_@@_finish_tolerance_x}{
+ \l_@@_finish_x+(\l_@@_tolerance_pgf)
+ }
+ \pgfmathsetmacro{\l_@@_start_beyond_x}{
+ \l_@@_start_x-(\l_@@_beyond_length_pgf)
+ }
+ \pgfmathsetmacro{\l_@@_finish_beyond_x}{
+ \l_@@_finish_x+(\l_@@_beyond_length_pgf)
+ }
+% \end{macrocode}
+% Set up tracking of current \(y\) coordinate.
+% \begin{macrocode}
+ \pgfmathsetmacro{\l_@@_current_y}{0}
+ \pgfmathsetmacro{\l_@@_saved_y}{0}
+ \pgfmathsetmacro{\l_@@_auto_reset_minimum_y}{-16000pt}
+ \pgfmathsetmacro{\l_@@_auto_reset_maximum_y}{16000pt}
+% \end{macrocode}
+% Calculate some years used in loops.
+% \begin{macrocode}
+ \pgfmathsetmacro{\l_@@_start_plus_year}{
+ \l_@@_start_year+\l_@@_minor_tick_interval_year
+ }
+ \pgfmathsetmacro{\l_@@_start_plusplus_year}{
+ \l_@@_start_year+(2*\l_@@_minor_tick_interval_year)
+ }
+ \pgfmathsetmacro{\l_@@_end_minus_year}{
+ \l_@@_finish_year-\l_@@_minor_tick_interval_year
+ }
+% \end{macrocode}
+% Begin a group and make available the user commands \cs{timechart}\ldots. (The group will be ended by
+% \cs{@@_main_end_user:}.)
+% \begin{macrocode}
+ \group_begin:
+ \cs_set_eq:NN\timechartinterval\@@_interval_user:Ommm
+ \cs_set_eq:NN\timecharttext\@@_text_user:Omm
+ \cs_set_eq:NN\timechartspace\@@_space_user:O
+ \cs_set_eq:NN\timechartsety\@@_set_y_user:m
+ \cs_set_eq:NN\timechartsavey\@@_save_y_user:
+ \cs_set_eq:NN\timechartresety\@@_reset_y_user:
+ \cs_set_eq:NN\timechartsetyminimumautoreset
+ \@@_set_y_minimum_auto_reset_user:m
+ \cs_set_eq:NN\timechartsetymaximumautoreset
+ \@@_set_y_maximum_auto_reset_user:m
+ \cs_set_eq:NN\timechartstepy\@@_step_y_user:O
+ \cs_set_eq:NN\timechartfinish\@@_main_end_user:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_main_end:}
+% Make sure the chart is complete and end the \TikZ\ picture. \cs{@@_main_end_user:} ends the group begun by
+% \cs{@@_main_begin:nnn}, so whether the user has \emph{not} called it (as \cs{timechartfinish}) is equivalent to it
+% being equal to \cs{timechartfinish}.
+% \begin{macrocode}
+\cs_new:Npn\@@_main_end:
+ {
+ \cs_if_eq:NNT\timechartfinish\@@_main_end_user:
+ { \@@_main_end_user: }
+ \endtikzpicture
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_main_end_user:}
+% End the group begun by \cs{@@_main_begin:nnn}, draw the axis and grid, and set the bounding box. This macro is made
+% available as \cs{timechartfinish} inside the \env{timechart} environment.
+% \begin{macrocode}
+\cs_new:Npn\@@_main_end_user:
+ {
+% \end{macrocode}
+% The aim here is to set the bounding box (1) to fit horizontally the axis \emph{not} including labels and the grid
+% and (2) to fit vertically the axis including labels and the grid . All the `horizonatal' data is already known, and
+% the `vertical' data is determined by the \emph{current} bounding box. So extract the `vertical' data and then reset
+% the bounding box.
+% \begin{macrocode}
+ \pgfextracty{\l_@@_tmpa_dim}
+ { \pgfpointanchor{current~bounding~box}{south} }
+ \pgfextracty{\l_@@_tmpb_dim}
+ { \pgfpointanchor{current~bounding~box}{north} }
+ \pgfresetboundingbox
+% \end{macrocode}
+% If the timechart is empty, then the extracted \(y\) coordinates of `north' and `south' anchors of the bounding box
+% will be \qty{-16000}{\point} and \qty{16000}{\point} respectively. Test for this and treat them as both having \(y\)
+% coordinate \qty{0}{\point} in this case.
+% \begin{macrocode}
+ \dim_compare:nNnTF{\l_@@_tmpa_dim}>{\l_@@_tmpb_dim}
+ {
+ \pgfmathsetmacro{\l_@@_content_bottom_y}{0pt}
+ \pgfmathsetmacro{\l_@@_content_top_y}{0pt}
+ }
+ {
+ \pgfmathsetmacro{\l_@@_content_bottom_y}
+ {\l_@@_tmpa_dim}
+ \pgfmathsetmacro{\l_@@_content_top_y}
+ {\l_@@_tmpb_dim}
+ }
+% \end{macrocode}
+% Now draw the grid and axis if necessary and set the bounding box if not.
+% \begin{macrocode}
+ \bool_if:NTF{\l_@@_grid_bool}
+ {
+ \@@_grid_draw:
+ \pgfmathsetmacro{\l_@@_axis_y}
+ {
+ \l_@@_content_top_y
+ + \l_@@_grid_top_ysep_pgf
+ + \pgfkeysvalueof{/timechart/axis~ysep}
+ }
+ }
+ {
+ \@@_nogrid_bounding_box_set:
+ \pgfmathsetmacro{\l_@@_axis_y}
+ {
+ \l_@@_content_top_y
+ +\pgfkeysvalueof{/timechart/axis~ysep}
+ }
+ }
+ \bool_if:NT{\l_@@_axis_bool}
+ { \@@_axis_draw: }
+% \end{macrocode}
+% Finally, end the group begun by \cs{@@_main_begin:nnn}.
+% \begin{macrocode}
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Grid drawing}
+%
+% \begin{macro}{\@@_grid_draw:}
+% Draw the grid of the chart, assuming that the \(y\) coordinates of the top and bottom of the content have
+% been calculated and stored in \cs{l_@@_content_top_y} and \cs{l_@@_content_bottom_y}.
+% \begin{macrocode}
+\cs_new:Npn\@@_grid_draw:
+ {
+ \pgfmathsetmacro{\l_@@_grid_bottom_y}{
+ \l_@@_content_bottom_y-\l_@@_grid_bottom_ysep_pgf
+ }
+ \pgfmathsetmacro{\l_@@_grid_top_y}{
+ \l_@@_content_top_y+\l_@@_grid_top_ysep_pgf
+ }
+ \pgfonlayer{ grid }
+ \scope[/timechart/grid]
+ \foreach \year in {
+ \l_@@_start_plus_year,
+ \l_@@_start_plusplus_year,
+ ...,
+ \l_@@_end_minus_year
+ } {
+ \group_begin:
+% \end{macrocode}
+% Only draw gridlines at major ticks.
+% \begin{macrocode}
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}
+ { Mod(\year,\l_@@_major_tick_interval_year)==0 }
+ \bool_if:NT\l_@@_tmpa_bool
+ {
+ \pgftransformshift{ \pgfpoint{yeartox(\year)}{0} }
+ \pgfpathmoveto{ \pgfpoint{0}{\l_@@_grid_top_y} }
+ \pgfpathlineto{ \pgfpoint{0}{\l_@@_grid_bottom_y} }
+ \pgfusepath{ draw }
+ }
+ \group_end:
+ }
+% \end{macrocode}
+% Define and draw the grid node.
+% \begin{macrocode}
+ \@@_make_rectangle_node:nnnn
+ { \pgfpoint{\l_@@_start_x}{\l_@@_grid_bottom_y} }
+ { \pgfpoint{\l_@@_finish_x}{\l_@@_grid_top_y} }
+ { grid }
+ { \c_true_bool }
+ \endscope
+ \endpgfonlayer
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Axis drawing}
+%
+% \begin{macro}{\@@_axis_draw:}
+% Draw the axis, with large/small ticks and labels on appropriate years, assuming that the \(y\) coordinate has been
+% calculated and stored in \cs{l_@@_axis_y}.
+% \begin{macrocode}
+\cs_new:Npn\@@_axis_draw:
+ {
+ \group_begin:
+ \pgfkeys{
+ /timechart/minor~tick~length/.get=\@@_minor_tick_length_pgf,
+ /timechart/major~tick~length/.get=\@@_major_tick_length_pgf,
+ }
+% \end{macrocode}
+% Shift to the \(y\) coordinate of the axis line.
+% \begin{macrocode}
+ \pgftransformshift{ \pgfpoint{0}{\l_@@_axis_y} }
+% \end{macrocode}
+% Work out the first and last years which will have a major tick (since these are marked with the era).
+% \begin{macrocode}
+ \pgfmathsetmacro{\@@_start_major_tick_year}
+ {
+ \l_@@_start_year
+ -Mod(
+ \l_@@_start_year,
+ \l_@@_major_tick_interval_year
+ )
+ }
+ \pgfmathsetmacro{\@@_start_major_tick_year}
+ {
+ ifthenelse(
+ \@@_start_major_tick_year<\l_@@_start_year,
+ \@@_start_major_tick_year
+ +\l_@@_major_tick_interval_year,
+ \@@_start_major_tick_year
+ )
+ }
+ \pgfmathsetmacro{\@@_finish_major_tick_year}
+ {
+ \l_@@_finish_year
+ -Mod(
+ \l_@@_finish_year,
+ \l_@@_major_tick_interval_year
+ )
+ }
+% \end{macrocode}
+% Loop over years and draw the appropriate ticks.
+% \begin{macrocode}
+ \foreach \year in {
+ \l_@@_start_year,
+ \l_@@_start_plus_year,
+ ...,
+ \l_@@_finish_year
+ } {
+ \pgfmathsetmacro{\x}{yeartox(\year)}
+ \@@_pgfmathsetbool:nn
+ {\l_@@_tmpa_bool}
+ { Mod(\year,\l_@@_major_tick_interval_year)==0 }
+ \bool_if:NTF\l_@@_tmpa_bool
+ { \@@_axis_draw_labelled_major_tick:NN\x\year }
+ { \@@_axis_draw_minor_tick:N\x }
+ }
+ \@@_draw_axis_line
+% \end{macrocode}
+% Define the axis node.
+% \begin{macrocode}
+ \pgfextracty{\l_@@_tmpa_dim}
+ { \pgfpointanchor{current~bounding~box}{north} }
+ \@@_make_rectangle_node:nnnn
+ { \pgfpoint{\l_@@_start_x}{0} }
+ { \pgfpoint{\l_@@_finish_x}{\l_@@_tmpa_dim} }
+ { axis }
+ { \c_false_bool }
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% All the remaining axis-related macros (which begin \cs{@@_axis_draw_}) assume that a transformation has been applied
+% so that the axis line is at \(y=0\).
+%
+% \begin{macro}{\@@_axis_draw_minor_tick:N}
+% Draw an unlabelled tick at \(x\) coordinate \param{1}.
+% \begin{macrocode}
+\cs_new:Npn\@@_axis_draw_minor_tick:N #1
+ {
+ \scope[/timechart/minor~tick]
+ \pgfpathmoveto{ \pgfpoint{#1}{0} }
+ \pgfpathlineto{ \pgfpoint{#1}{\@@_minor_tick_length_pgf} }
+ \pgfusepath{draw}
+ \endscope
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_axis_draw_labelled_major_tick:NN}
+% Draw a labelled major tick at \(x\) coordinate \param{1}, with label for year \param{2}, using the special epoch
+% marker if the year is 0, and showing the era if and only if the year is for the first or last major tick. This macro
+% assumes that \cs{@@_start_major_tick_year} and \cs{@@_finish_major_tick_year} have been calculated.
+% \begin{macrocode}
+\cs_new:Npn\@@_axis_draw_labelled_major_tick:NN #1#2
+ {
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}{#2==0}
+ \bool_if:NTF \l_@@_tmpa_bool
+ { \@@_axis_draw_zero_tick:N #1 }
+ {
+ \@@_pgfmathsetbool:nn{\l_@@_tmpb_bool}
+ { #2==\@@_start_major_tick_year }
+ \@@_pgfmathsetbool:nn{\l_@@_tmpc_bool}
+ { #2==\@@_finish_major_tick_year }
+ \bool_set:Nn\l_@@_tmpd_bool
+ { \l_@@_tmpb_bool || \l_@@_tmpc_bool }
+ \@@_axis_draw_major_tick:N #1
+ \@@_axis_draw_year_label:nnnnnn
+ { #1 }
+ { #2 }
+ { \l_@@_tmpd_bool }
+ { mid~west }
+ { 0 }
+ { \@@_major_tick_length_pgf+1mm }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_axis_draw_major_tick:N}
+% Draw a major tick at \(x\) coordinate \param{1}.
+% \begin{macrocode}
+\cs_new:Npn\@@_axis_draw_major_tick:N #1
+ {
+ \scope[/timechart/major~tick]
+ \pgfpathmoveto{ \pgfpoint{#1}{0} }
+ \pgfpathlineto{ \pgfpoint{#1}{\@@_major_tick_length_pgf} }
+ \pgfusepath{draw}
+ \endscope
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_axis_draw_zero_tick:N}
+% Draw a special (labelled) tick for year zero at \(x=\param{1}\).
+% \begin{macrocode}
+\cs_new:Npn\@@_axis_draw_zero_tick:N #1
+ {
+ \group_begin:
+ \pgftransformshift{ \pgfpoint{#1}{0} }
+% \end{macrocode}
+% The mark is a cross made up of four arcs and the miter joins between them. The parameter \cs{r} is the arc radius.
+% The parameter \cs{a} is how many degrees should be trimmed from the start/end of a quarter-circle to form each arc.
+% Thus the length of the miter is dependent on \cs{a}.
+% \begin{macrocode}
+ \pgfmathsetmacro{\a}{5}
+ \pgfmathsetlengthmacro{\r}{1mm}
+ \pgfmathsetlengthmacro{\t}{\r*(cos(\a)-cos(90-\a))/(1-cos(90-\a))}
+% \end{macrocode}
+% The drawing process is: move to the start of the tick, draw the tick, draw the four arcs, then draw a small part of
+% the tick again. The last step is not mathematically necessary for a smooth join, but ensures that the join
+% \emph{appears} smooth.
+% \begin{macrocode}
+ \scope[/timechart/major~tick,line~join=miter]
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{0}{\@@_major_tick_length_pgf}}
+ \pgfpatharc{0}{90-\a}{\t~and~\r}
+ \pgfpatharc{270+\a}{360-\a}{\r}
+ \pgfpatharc{180+\a}{270-\a}{\r}
+ \pgfpatharc{90+\a}{180-\a}{\t~and~\r}
+ \pgfpathlineto{\pgfpoint{0}{\@@_major_tick_length_pgf-1pt}}
+ \pgfusepath{draw}
+ \endscope
+% \end{macrocode}
+% There is no year 0, so label the zero mark with the 1 before and 1 after the epoch.
+% \begin{macrocode}
+ \@@_axis_draw_year_label:nnnnnn
+ { 0 }
+ { -1 }
+ { \c_true_bool }
+ { base~west }
+ { -.5mm }
+ { 5.5mm }
+ \@@_axis_draw_year_label:nnnnnn
+ { 0 }
+ { 1 }
+ { \c_true_bool }
+ { north~west }
+ { .5mm }
+ { 5.5mm }
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_axis_draw_line}
+% Draw the axis line itself.
+% \begin{macrocode}
+\cs_new:Npn\@@_draw_axis_line
+ {
+ \scope[/timechart/axis~line]
+ \pgfpathmoveto{ \pgfpoint{\l_@@_start_x}{0} }
+ \pgfpathlineto{ \pgfpoint{\l_@@_finish_x}{0} }
+ \pgfusepath{draw}
+ \endscope
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_axis_draw_year_label:nnnnnn}
+% Draw a year label.
+% \begin{arguments}
+% \item \(x\) coordinate.
+% \item Year for label.
+% \item Boolean literal indicating whether the era should be shown.
+% \item Anchor for node.
+% \item \(x\) offset (dimension).
+% \item \(y\) offset (dimension).
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Npn\@@_axis_draw_year_label:nnnnnn #1#2#3#4#5#6
+ {
+ \group_begin:
+ \pgftransformshift{ \pgfpoint{#1+#5}{#6} }
+ \pgfmathtruncatemacro{\absyear}{ abs(#2) }
+ \scope[/timechart/major~tick~label]
+ \bool_if:NTF #3
+ {
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}{#2<0}
+ \bool_if:NTF\l_@@_tmpa_bool
+ { \cs_set_eq:NN\@@_make_year:n\timechartmakebeforeyear }
+ { \cs_set_eq:NN\@@_make_year:n\timechartmakeafteryear }
+ \@@_hsmash_pgfnode:nnnnn
+ {rectangle}
+ {#4}
+ {\@@_make_year:n{\absyear}}
+ {}
+ {}
+ }
+ { \pgfnode{rectangle}{#4}{\absyear}{}{} }
+ \endscope
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\timechartmakebeforeyear,\timechartmakeafteryear}
+% User-redefineable macros to format a year as before or after the epoch.
+% \begin{macrocode}
+\cs_new:Npn\timechartmakebeforeyear #1
+ {
+ #1\nobreakspace\textsc{bce}
+ }
+\cs_new:Npn\timechartmakeafteryear #1
+ {
+ #1\nobreakspace\textsc{ce}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Bounding box}
+%
+% \begin{macro}{\@@_nogrid_bounding_box_set:}
+% Set the bounding box when no grid is being drawn.
+% \begin{macrocode}
+\cs_new:Npn\@@_nogrid_bounding_box_set:
+ {
+ \pgfpathmoveto
+ { \pgfpoint{\l_@@_start_x}{\l_@@_content_bottom_y} }
+ \pgfpathmoveto
+ { \pgfpoint{\l_@@_finish_x}{\l_@@_content_top_y} }
+ \pgfusepath{discard}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Positioning}
+%
+% \begin{macro}{\@@_set_y_user:m}
+% Set current \(y\) coordinate to \param{1}. This macro will be made available as \cs{timechartsety} in the
+% \env{timechart} environment.
+% \begin{macrocode}
+\cs_new:Npn\@@_set_y_user:m #1
+ {
+ \pgfmathsetmacro{\l_@@_current_y}{#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_save_y_user:}
+% Save the current \(y\) coordinate. This macro will be made available as \cs{timechartsavey} in the
+% \env{timechart} environment.
+% \begin{macrocode}
+\cs_new:Npn\@@_save_y_user:
+ {
+ \pgfmathsetmacro{\l_@@_saved_y}{\l_@@_current_y}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_reset_y_user:}
+% Set the current \(y\) coordinate to the last saved coordinate. This macro will be made available as
+% \cs{timechartsresety} in the \env{timechart} environment.
+% \begin{macrocode}
+\cs_new:Npn\@@_reset_y_user:
+ {
+ \pgfmathsetmacro{\l_@@_current_y}{\l_@@_saved_y}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_y_minimum_auto_reset_user:m}
+% Set a \(y\) coordinate below which \cs{@@_step_y_user:} will automatically reset the currrent \(y\) coordinate to
+% the last saved \(y\) coordinate. This macro will be made available as \cs{timechartssetyminimumautoreset} in the
+% \env{timechart} environment.
+% \begin{macrocode}
+\cs_new:Npn\@@_set_y_minimum_auto_reset_user:m #1
+ {
+ \pgfmathsetmacro{\l_@@_auto_reset_minimum_y}{#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_set_y_maximum_auto_reset_user:m}
+% Set a \(y\) coordinate above which \cs{@@_step_y_user:} will automatically reset the currrent \(y\) coordinate to
+% the last saved \(y\) coordinate. This macro will be made available as \cs{timechartssetymaximumautoreset} in the
+% \env{timechart} environment.
+% \begin{macrocode}
+\cs_new:Npn\@@_set_y_maximum_auto_reset_user:m #1
+ {
+ \pgfmathsetmacro{\l_@@_auto_reset_maximum_y}{#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_step_y_user:O}
+% Increment the current \(y\) coordinate by \param{1} times the length specified in \key{/timechart/ystep}. This
+% macro will be made available as \cs{timechartstepy} in the \env{timechart} environment.
+% \begin{macrocode}
+\NewDocumentCommand{\@@_step_y_user:O}{ O{1} }
+ {
+ \pgfmathsetmacro{\l_@@_current_y}
+ {\l_@@_current_y+#1*\l_@@_ystep_pgf}
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}
+ {
+ or(
+ \l_@@_current_y<\l_@@_auto_reset_minimum_y,
+ \l_@@_current_y>\l_@@_auto_reset_maximum_y
+ )
+ }
+ \bool_if:nT{\l_@@_tmpa_bool}
+ { \pgfmathsetmacro{\l_@@_current_y}{\l_@@_saved_y)} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Bounds checking}
+%
+% \begin{macro}{\@@_if_x_in_bounds:nT}%
+% Check if \(x\) coordinate \param{1} is (strictly) within the bounds of the chart; if so, execute \param{2}.
+% \begin{macrocode}
+\cs_new:Npn\@@_if_x_in_bounds:nT #1#2
+ {
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}{
+ and(
+ #1>=\l_@@_start_x,
+ #1<=\l_@@_finish_x
+ )
+ }
+ \bool_if:NT\l_@@_tmpa_bool
+ {#2}
+ }
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_if_x_in_tolerance_bounds_x:nT}%
+% Check if \(x\) coordinate \param{1} is within the specified tolerance of the bounds of the chart; if so, execute
+% \param{2}.
+% \begin{macrocode}
+\cs_new:Npn\@@_if_x_in_tolerance_bounds:nT #1#2
+ {
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}{
+ and(
+ #1>=\l_@@_start_tolerance_x,
+ #1<=\l_@@_finish_tolerance_x
+ )
+ }
+ \bool_if:NT\l_@@_tmpa_bool{#2}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_if_x_range_intersect_tolerance_bounds_x:nnT}%
+% Check if the range between \(x\) coordinates \param{1} and \param{2} intersects the range of the bounds of the chart
+% plus the specified tolerance; if so, execute \param{3}.
+% \begin{macrocode}
+\cs_new:Npn\@@_if_x_range_intersect_tolerance_bounds:nnT #1#2#3
+ {
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}{
+ or(
+ or(
+ and(
+ #2>=\l_@@_start_tolerance_x,
+ #2<=\l_@@_finish_tolerance_x
+ ),
+ and(
+ #1>=\l_@@_start_tolerance_x,
+ #1<=\l_@@_finish_tolerance_x
+ )
+ ),
+ and(
+ #1<\l_@@_start_tolerance_x,
+ #2>\l_@@_finish_tolerance_x
+ )
+ )
+ }
+ \bool_if:NT\l_@@_tmpa_bool
+ {#3}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Date and date range parsing}
+%
+% \begin{macro}{\@@_parse_date_or_daterange:NNNNNn}
+% Parse the text in \param{6}, which should represent a date or date range, into parameters \param{1}--\param{5}.
+% \begin{arguments}
+% \item range indicator boolean variable.
+% \item minimum circa indicator boolean variable.
+% \item minimum variable.
+% \item maximum circa indicator boolean variable.
+% \item maximum variable.
+% \item text to parse.
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Npn\@@_parse_date_or_daterange:NNNNNn #1#2#3#4#5#6
+{
+ \bool_set:Nn #1 {\@@_is_nondaterange_p:w #6/\q_stop}
+ \bool_set_inverse:N #1
+ \bool_if:nTF #1
+ { \@@_parse_range:w #2#3#4#5\q_mark #6\q_stop }
+ {
+ \@@_parse_date:NNn #2#3{#6}
+ \bool_set_eq:NN #4#2
+ \pgfmathsetmacro{#5}{#3}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_is_nondaterange_p:w}
+% To be called in the form \cs{@@_is_nondaterange_p:w}\meta{text}\texttt{/}\cs{q_stop}. Return boolean true if and
+% only if \meta{text} (known to be either a date or date range) contains a range marker.
+% \begin{macrocode}
+\cs_new:Npn\@@_is_nondaterange_p:w #1/#2\q_stop
+{
+ \tl_if_empty_p:n{#2}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_parse_range:w}
+% To be called in the form
+% \cs{@@_parse_range:w}\meta{cmin}\meta{min}\meta{cmax}\meta{max}\cs{q_mark}\meta{text}\cs{q_stop}. Parse \meta{text}
+% (known to represent a date range) into minimum circa indicator boolean variable \meta{cmin}, minimum variable
+% \meta{min}, maximum circa indicator boolean variable \meta{cmax}, maximum variable \meta{max}.
+% \begin{macrocode}
+\cs_new:Npn\@@_parse_range:w #1#2#3#4\q_mark #5/#6\q_stop
+{
+ \_@@_parse_date:NNn #1#2{#5}
+ \_@@_parse_date:NNn #3#4{#6}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_date:NNn}
+% Parse text (known to represent a date) into the supplied variables. Parameters \param{1} and \param{2} are the
+% variables for (respectively) circa indicator boolean and date, and \param{3} is the text to be parsed:
+% \begin{arguments}
+% \item circa indicator boolean variable.
+% \item date variable.
+% \item text to parse.
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Npn\@@_parse_date:NNn #1#2#3
+{
+ \bool_set:Nn #1 { \@@_is_circa_p:w #3c\q_stop }
+ \bool_if:NTF #1
+ { \@@_parse_circa_date:w #2\q_mark #3\q_stop }
+ { \@@_parse_noncirca_date:Nn #2{#3} }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_is_circa_p:w}
+% To be called in the form \cs{@@_is_circa_p:w}\meta{text}\texttt{c}\cs{q_stop}. Return boolean true if and only if
+% \meta{text} (known to be either a date or a date with a circa indicator) has a circa indicator.
+% \begin{macrocode}
+\cs_new:Npn\@@_is_circa_p:w #1c#2\q_stop
+{
+ \tl_if_empty_p:n{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_circa_date:w}
+% To be called in the form \cs{@@_parse_circa_date:w}\meta{var}\cs{q_mark}\meta{text}\cs{q_stop}. Parse \meta{text}
+% (known to represent a circa date) into the supplied variable. \param{1} is the variable for the date and \param{2}
+% is the text to be parsed.
+% \begin{macrocode}
+\cs_new:Npn\@@_parse_circa_date:w #1\q_mark c#2\q_stop
+{
+ \@@_parse_noncirca_date:Nn #1{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_noncirca_date:w}
+% To be called in the form \cs{@@_parse_noncirca_date:w}\meta{var}\cs{q_mark}\meta{text}\break\cs{q_stop}. Parse
+% \meta{text} (known to represent a non-circa date) into the supplied variable. \param{1} is the variable for the date
+% and \param{2} is the text to be parsed.
+% \begin{macrocode}
+\cs_new:Npn\@@_parse_noncirca_date:Nn #1#2
+{
+ \bool_if:nTF { \@@_is_before_p:w #2-\q_stop }
+ { \@@_parse_before_date:w #1\q_mark #2\q_stop }
+ { \@@_parse_signed_date:w #1\q_mark #2-0-0\q_stop }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_is_before_p:w}
+% To be called in the form \cs{@@_is_before_p:w}\meta{text}\texttt{-}\cs{q_stop}. Return boolean true if and only if
+% \meta{text} (known to be a date without a circa indicator) begins with a \texttt{-}.
+% \begin{macrocode}
+\cs_new:Npn\@@_is_before_p:w #1-#2\q_stop
+{
+ \tl_if_empty_p:n{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_before_date:w}
+% To be called in the form \cs{@@_parse_before_date:w}\meta{var}\cs{q_mark}\meta{text}\cs{q_stop}. Parse \meta{text}
+% (known to represent a date with a leading \texttt{-}) into the supplied variable. \param{1} is the variable for the
+% date and \param{2} is the text to be parsed.
+% \begin{macrocode}
+\cs_new:Npn\@@_parse_before_date:w #1\q_mark-#2\q_stop
+{
+ \@@_parse_signed_date:w #1-\q_mark #2-0-0\q_stop
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Now comes that actual parsing of an ISO-format date \texttt{YYYY-MM-DD}. The following macros serve as lookup tables
+% for the number of days in the \(n\)-th month and the number of days in the year up to the start of the \(n\)-th month.
+% \begin{macrocode}
+\cs_new:cpn{c_@@_year_days_pgf}{365}
+\cs_new:cpn{c_@@_month_days_1_pgf}{31}
+\cs_new:cpn{c_@@_month_days_2_pgf}{28}
+\cs_new:cpn{c_@@_month_days_3_pgf}{31}
+\cs_new:cpn{c_@@_month_days_4_pgf}{30}
+\cs_new:cpn{c_@@_month_days_5_pgf}{31}
+\cs_new:cpn{c_@@_month_days_6_pgf}{30}
+\cs_new:cpn{c_@@_month_days_7_pgf}{31}
+\cs_new:cpn{c_@@_month_days_8_pgf}{31}
+\cs_new:cpn{c_@@_month_days_9_pgf}{30}
+\cs_new:cpn{c_@@_month_days_10_pgf}{31}
+\cs_new:cpn{c_@@_month_days_11_pgf}{30}
+\cs_new:cpn{c_@@_month_days_12_pgf}{31}
+\cs_new:cpn{c_@@_cumulative_days_1_pgf}{0}
+\cs_new:cpn{c_@@_cumulative_days_2_pgf}{31}
+\cs_new:cpn{c_@@_cumulative_days_3_pgf}{59}
+\cs_new:cpn{c_@@_cumulative_days_4_pgf}{90}
+\cs_new:cpn{c_@@_cumulative_days_5_pgf}{120}
+\cs_new:cpn{c_@@_cumulative_days_6_pgf}{151}
+\cs_new:cpn{c_@@_cumulative_days_7_pgf}{181}
+\cs_new:cpn{c_@@_cumulative_days_8_pgf}{212}
+\cs_new:cpn{c_@@_cumulative_days_9_pgf}{243}
+\cs_new:cpn{c_@@_cumulative_days_10_pgf}{273}
+\cs_new:cpn{c_@@_cumulative_days_11_pgf}{304}
+\cs_new:cpn{c_@@_cumulative_days_12_pgf}{334}
+% \end{macrocode}
+%
+% \begin{macro}{\@@_parse_signed_date:w}
+% To be called in the form \cs{@@_parse_positive_date:w}\meta{var}\meta{sign}\cs{q_mark}\break
+% \meta{text}\texttt{-0-0}\cs{q_stop}. Parse \meta{text} (known to represent a non-circa date) into the supplied
+% variable. \param{1} is the variable for the date and \param{2} is possibly \texttt{-}.
+%
+% There is a trick in the parsing:
+% \begin{enumerate}
+% \item If \meta{text} has the form \meta{year}\texttt{-}\meta{month}\texttt{-}\meta{day}, then parameters
+% \param{3}, \param{4}, and \param{5} will be, respectively, \meta{year}, \meta{month}, and
+% \meta{day}\texttt{-0-0}. Thus \param{5} will be evaulated by \pkg{pgfmath} to \meta{day}.
+% \item If \meta{text} has the form \meta{year}\texttt{-}\meta{month}, then parameters \param{3}, \param{4}, and
+% \param{5} will be, respectively, \meta{year}, \meta{month}, and \texttt{0-0}. Thus \param{5} will be
+% evaulated by \pkg{pgfmath} to \(0\).
+% \item If \meta{text} is simply \meta{year}, then parameters \param{3}, \param{4}, and \param{5} will be,
+% respectively, \meta{year}, \texttt{0}, and \texttt{0}.
+% \end{enumerate}
+% \begin{macrocode}
+\cs_new:Npn\@@_parse_signed_date:w #1#2\q_mark #3-#4-#5\q_stop
+{
+ \pgfmathtruncatemacro{\@@_parsed_year_pgf}{#2#3}
+ \pgfmathtruncatemacro{\@@_parsed_month_pgf}{#4}
+ \pgfmathtruncatemacro{\@@_parsed_day_pgf}{#5}
+ \@@_pgfmathsetbool:nn{\l_tmpa_bool}{
+ or(
+ \@@_parsed_month_pgf < 1,
+ \@@_parsed_month_pgf > 12,
+ )
+ }
+ \bool_if:NTF\l_tmpa_bool
+ {
+% \end{macrocode}
+% \textit{Case: no valid month is given.} Use only the year.
+% \begin{macrocode}
+ \pgfmathsetmacro{#1}{#2#3}
+ }
+ {
+% \end{macrocode}
+% \textit{Case: a valid month is given.} Get the number of days in the year, in the month, and in the year up to the
+% month. Then check if the year is a leap year and, if so, make the appropriate adjustments.
+% \begin{macrocode}
+ \cs_set_eq:NN\l_@@_year_days_pgf\c_@@_year_days_pgf
+ \cs_set_eq:Nc\l_@@_month_days_pgf
+ { c_@@_month_days_\@@_parsed_month_pgf _pgf }
+ \cs_set_eq:Nc\l_@@_cumulative_days_pgf
+ { c_@@_cumulative_days_\@@_parsed_month_pgf _pgf }
+ \@@_pgfmathsetbool:nn{\l_tmpa_bool}{
+ or(
+ Mod(\@@_parsed_year_pgf,400) == 0,
+ and(
+ Mod(\@@_parsed_year_pgf,4) == 0,
+ Mod(\@@_parsed_year_pgf,100) != 0
+ )
+ )
+ }
+ \bool_if:NT\l_tmpa_bool
+ {
+ \pgfmathsetmacro{\l_@@_year_days_pgf}
+ { \l_@@_year_days_pgf+1 }
+ \@@_pgfmathsetbool:nn{\l_tmpb_bool}
+ { \@@_parsed_month == 1 }
+ \bool_if:NF\l_tmpb_bool
+ {
+ \@@_pgfmathsetbool:nn{\l_tmpb_bool}
+ { \@@_parsed_month == 2 }
+ \bool_if:NF\l_tmpb_bool
+ {
+ \pgfmathsetmacro{\l_@@_month_days_pgf}
+ { \l_@@_month_days_pgf + 1 }
+ }
+ {
+ \pgfmathsetmacro{\l_@@_cumulative_days_pgf}
+ { \l_@@_cumulative_days_pgf + 1 }
+ }
+ }
+ }
+ \@@_pgfmathsetbool:nn{\l_tmpa_bool}{
+ or(
+ \@@_parsed_day_pgf < 1,
+ \@@_parsed_day_pgf > \l_@@_month_days_pgf,
+ )
+ }
+ \bool_if:NTF\l_tmpa_bool
+ {
+% \end{macrocode}
+% \textit{Sub-case: no valid day is given.} Use only the year and month.
+% \begin{macrocode}
+ \pgfmathsetmacro{#1}
+ {
+ #2#3
+ + \l_@@_cumulative_days_pgf/\l_@@_year_days_pgf
+ }
+ }
+ {
+% \end{macrocode}
+% \textit{Sub-case: a valid day is given.} Use the year, month, and day.
+% \begin{macrocode}
+ \pgfmathsetmacro{#1}
+ {
+ #2#3
+ + (
+ \l_@@_cumulative_days_pgf
+ + \@@_parsed_day_pgf
+ )/\l_@@_year_days_pgf
+ }
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Interval drawing}
+%
+% \subsubsection{Preliminaries}
+%
+% \begin{macro}{
+% \l_@@_start_is_range_bool,
+% \l_@@_startmin_circa_bool,
+% \l_@@_startmax_circa_bool,
+% \l_@@_finish_is_range_bool,
+% \l_@@_finishmin_circa_bool,
+% \l_@@_finishmax_circa_bool,
+% }
+% These boolean variables will be used to hold parsed data for the start and finish of an interval: whether it is a
+% range, whether the beginning of that range is qualified by `circa', and whether the end of that range is qualified
+% by `circa'.
+% \begin{macrocode}
+\bool_new:N\l_@@_start_is_range_bool
+\bool_new:N\l_@@_startmin_circa_bool
+\bool_new:N\l_@@_startmax_circa_bool
+\bool_new:N\l_@@_finish_is_range_bool
+\bool_new:N\l_@@_finishmin_circa_bool
+\bool_new:N\l_@@_finishmax_circa_bool
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Error message definition}
+%
+% \begin{macrocode}
+\msg_new:nnn{timechart}{interval_dates_invalid}
+ { Invalid~interval~dates:~#1~to~#2 }
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Main macros}
+%
+% \begin{macro}{\@@_interval_user:Ommm}
+% Draw an interval. This macro will be made available as \cs{timechartinterval} inside the \env{timechart}
+% environment.
+% \begin{arguments}
+% \item PGF keys under \key{/timechart/} to apply.
+% \item Start year.
+% \item Finish year.
+% \item Label.
+% \end{arguments}
+% \begin{macrocode}
+\NewDocumentCommand{\@@_interval_user:Ommm}{ O{} m m m }
+ {
+ \group_begin:
+% \end{macrocode}
+% Parse the start and finish dates or date ranges.
+% \begin{macrocode}
+ \@@_parse_date_or_daterange:NNNNNn
+ \l_@@_start_is_range_bool
+ \l_@@_startmin_circa_bool\l_@@_startmin_year
+ \l_@@_startmax_circa_bool\l_@@_startmax_year
+ {#2}
+ \@@_parse_date_or_daterange:NNNNNn
+ \l_@@_finish_is_range_bool
+ \l_@@_finishmin_circa_bool\l_@@_finishmin_year
+ \l_@@_finishmax_circa_bool\l_@@_finishmax_year
+ {#3}
+% \end{macrocode}
+% Check the results of parsing and only proceed if they are valid.
+% \begin{macrocode}
+ \@@_pgfmathsetbool:nn{\l_tmpa_bool}{
+ and(
+ \l_@@_startmin_year <= \l_@@_startmax_year,
+ and(
+ \l_@@_startmax_year <= \l_@@_finishmin_year,
+ \l_@@_finishmin_year <= \l_@@_finishmax_year
+ )
+ )
+ }
+ \bool_if:NTF\l_tmpa_bool
+ {
+ \@@_interval_checked:nn{#1}{#4}
+ \group_end:
+ \bool_if:NT\l_@@_autostep_bool
+ { \@@_step_y_user:O }
+ }
+ {
+ \msg_error:nnnn{timechart}{interval_dates_invalid}{#2}{#3}
+ \group_end:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_interval_checked:nn}
+% Draw an interval using the parsed and checked years or year ranges.
+% \begin{arguments}
+% \item PGF keys under \key{/timechart/} to apply.
+% \item Label.
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Npn \@@_interval_checked:nn #1#2
+ {
+% \end{macrocode}
+% Process keys supplied locally and retrieve the only value needed at this stage.
+% \begin{macrocode}
+ \pgfqkeys{/timechart}{
+ #1,
+ circa~uncertainty/.get=\l_@@_circa_uncertainty_year
+ }
+% \end{macrocode}
+% Do the minimum amount of calculation necessary to check whether any part of interval is visible.
+% \begin{macrocode}
+ \bool_if:NTF\l_@@_startmin_circa_bool
+ {
+ \pgfmathsetmacro{\l_@@_start_extreme_x}
+ { yeartox(\l_@@_startmin_year
+ - \l_@@_circa_uncertainty_year) }
+ }
+ {
+ \pgfmathsetmacro{\l_@@_start_extreme_x}
+ { yeartox(\l_@@_startmin_year) }
+ }
+ \bool_if:NTF\l_@@_finishmax_circa_bool
+ {
+ \pgfmathsetmacro{\l_@@_finish_extreme_x}
+ { yeartox(\l_@@_finishmax_year
+ + \l_@@_circa_uncertainty_year) }
+ }
+ {
+ \pgfmathsetmacro{\l_@@_finish_extreme_x}
+ { yeartox(\l_@@_finishmax_year) }
+ }
+% \end{macrocode}
+% Draw the interval if some part of it is visible.
+% \begin{macrocode}
+ \@@_if_x_range_intersect_tolerance_bounds:nnT
+ {\l_@@_start_extreme_x}{\l_@@_finish_extreme_x}
+ { \@@_draw_visible_interval:nn{#1}{#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{@@_draw_visible_interval:nn}
+% Draw an interval of which some part is known to be visible.
+% \begin{arguments}
+% \item PGF keys
+% \item Label
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Npn\@@_draw_visible_interval:nn #1#2
+ {
+% \end{macrocode}
+% Retrieve PGF key values.
+% \begin{macrocode}
+ \pgfqkeys{/timechart}{
+ ref/.get=\l_@@_ref_text,
+ mark/.get=\l_@@_mark_text,
+ interval~minimum~width/.get=\l_@@_minimum_width_pgf,
+ interval~bar~color/.get=\l_@@_bar_color,
+ interval~bar~thickness/.get=\l_@@_bar_thickness_pgf,
+ interval~mark~color/.get=\l_@@_mark_color,
+ interval~label~baseline/.get=\l_@@_text_baseline_pgf,
+ interval~label~node~name/.get=\l_@@_interval_label_node_name,
+ }
+% \end{macrocode}
+% Do the remaining calculations.
+% \begin{macrocode}
+ \pgfmathsetlengthmacro{\l_@@_bar_half_thickness_pgf}
+ {.5*\l_@@_bar_thickness_pgf}
+ \cs_set:Npn\l_@@_label_text{#2}
+ \bool_if:NTF\l_@@_startmax_circa_bool
+ {
+ \pgfmathsetmacro{\l_@@_start_definite_x}
+ { yeartox(\l_@@_startmax_year
+ + \l_@@_circa_uncertainty_year) }
+ }
+ {
+ \pgfmathsetmacro{\l_@@_start_definite_x}
+ { yeartox(\l_@@_startmax_year) }
+ }
+ \bool_if:NTF\l_@@_finishmin_circa_bool
+ {
+ \pgfmathsetmacro{\l_@@_finish_definite_x}
+ { yeartox(\l_@@_finishmin_year
+ - \l_@@_circa_uncertainty_year) }
+ }
+ {
+ \pgfmathsetmacro{\l_@@_finish_definite_x}
+ { yeartox(\l_@@_finishmin_year) }
+ }
+% \end{macrocode}
+% It is possible that circa indicators have made \cs{l_@@_start_definite_x} greater than \cs{l_@@_finish_definite_x}.
+% Check for this; if so, set them both to their average.
+% \begin{macrocode}
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}
+ {
+ \l_@@_start_definite_x > \l_@@_finish_definite_x
+ }
+ \bool_if:NT\l_@@_tmpa_bool
+ {
+ \pgfmathsetmacro{\l_@@_start_definite_x}
+ {
+ .5*(
+ \l_@@_start_definite_x
+ + \l_@@_finish_definite_x
+ )
+ }
+ \pgfmathsetmacro{\l_@@_finish_definite_x}
+ { \l_@@_start_definite_x }
+ }
+% \end{macrocode}
+% Calculate whether it is necessary to make an adjustment to ensure that the minimum width requirement is satisfied,
+% and store in \cs{l_@@_tmpa_bool}.
+% \begin{macrocode}
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}
+ {
+ (\l_@@_finish_extreme_x-\l_@@_start_extreme_x)
+ < \l_@@_minimum_width_pgf
+ }
+% \end{macrocode}
+% Calculate whether it is necessary to make an adjustment to prevent a rendering glitch when there are two fadings and
+% a zero-width (or very small) definite part, and store in \cs{l_@@_tmpb_bool}. Note the quick test for both ranges
+% being fadings.
+% \begin{macrocode}
+ \int_if_zero:nTF
+ {
+ \l_@@_start_range_type_int
+ + \l_@@_finish_range_type_int
+ }
+ {
+ \@@_pgfmathsetbool:nn{\l_@@_tmpb_bool}
+ {
+ (
+ \l_@@_finish_definite_x
+ - \l_@@_start_definite_x
+ )
+ < \l_@@_minimum_width_pgf
+ }
+ }
+ { \bool_set_false:N\l_@@_tmpb_bool }
+% \end{macrocode}
+% Make the adjustment if necessary.
+% \begin{macrocode}
+ \bool_if:nT{
+ \l_@@_tmpa_bool || \l_@@_tmpb_bool
+ }{
+ \pgfmathsetmacro{\l_@@_width_adjust}
+ { .5*\l_@@_minimum_width_pgf }
+ \pgfmathsetmacro{\l_@@_start_definite_x}
+ { \l_@@_start_definite_x-\l_@@_width_adjust }
+ \pgfmathsetmacro{\l_@@_finish_definite_x}
+ { \l_@@_finish_definite_x+\l_@@_width_adjust }
+ \pgfmathsetmacro{\l_@@_start_extreme_x}
+ {
+ min(
+ \l_@@_start_extreme_x,
+ \l_@@_start_definite_x
+ )
+ }
+ \pgfmathsetmacro{\l_@@_finish_extreme_x}
+ {
+ max(
+ \l_@@_finish_extreme_x,
+ \l_@@_finish_definite_x
+ )
+ }
+ }
+ \pgfmathsetmacro{\l_@@_start_solid_x}
+ { \l_@@_start_definite_x }
+ \pgfmathsetmacro{\l_@@_finish_solid_x}
+ { \l_@@_finish_definite_x }
+% \end{macrocode}
+% All the data needed to draw the interval are now ready. Shift to the correct vertical coordinate and open a scope for
+% drawing.
+% \begin{macrocode}
+ \pgftransformshift{ \pgfpoint{0}{\l_@@_current_y} }
+ \pgfscope
+% \end{macrocode}
+% First, do the necessary clipping if the interval extends beyond the specified tolerance from the chart, then process
+% the ranges, then draw the solid part of the bar, then do the labelling, then define the node for the bar. Note that
+% ranges wth the `slant' style function by adding a new clipping path and extending the solid part, so that there is
+% only \emph{one} solid rectangle drawn.
+% \begin{macrocode}
+ \@@_interval_beyond_clip:
+ \int_case:nn {\l_@@_start_range_type_int}
+ {
+ {0}{ \@@_interval_start_range_fade: }
+ {1}{ \@@_interval_start_range_slant: }
+ }
+ \int_case:nn {\l_@@_finish_range_type_int}
+ {
+ {0}{ \@@_interval_finish_range_fade: }
+ {1}{ \@@_interval_finish_range_slant: }
+ }
+ \@@_interval_draw_solid:
+ \@@_interval_mark:
+ \@@_interval_define_bar_node:
+ \endpgfscope
+ \@@_interval_label:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Clipping}
+%
+% \begin{macro}{\@@_interval_beyond_clip:}
+% If the interval bar extends beyond the specified tolerance from the chart, clip it appropriately. To avoid repeated
+% computation, use \cs{l_@@_tmpa_bool} and \cs{l_@@_tmpb_bool} to store whether it is necessary to clip on the left
+% and right (respectively). If both are false, there is no need for any clipping.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_beyond_clip:
+ {
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}
+ {\l_@@_start_extreme_x<=\l_@@_start_tolerance_x}
+ \@@_pgfmathsetbool:nn{\l_@@_tmpb_bool}
+ {\l_@@_finish_extreme_x>=\l_@@_finish_tolerance_x}
+ \bool_if:nT{ \l_@@_tmpa_bool || \l_@@_tmpb_bool }
+ { \@@_interval_beyond_clip_aux: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_interval_beyond_clip_aux:}
+% This macro does the actual clipping. The clipping path starts at the north-east and proceeds clockwise.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_beyond_clip_aux:
+ {
+ \pgfinterruptboundingbox
+ \bool_if:NTF\l_@@_tmpb_bool
+ {
+ \pgfpathmoveto{
+ \pgfpoint
+ {\l_@@_finish_beyond_x}
+ {\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_finish_beyond_x}
+ {\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfpatharc
+ {90}
+ {270}
+ {\l_@@_beyond_x_radius_pgf
+ ~and~\l_@@_bar_half_thickness_pgf}
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_finish_beyond_x}
+ {-\l_@@_bar_thickness_pgf}
+ }
+ }
+ {
+ \pgfpathmoveto{
+ \pgfpoint
+ {\l_@@_right_nonclip_x}
+ {\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_right_nonclip_x}
+ {-\l_@@_bar_thickness_pgf}
+ }
+ }
+ \bool_if:NTF\l_@@_tmpa_bool
+ {
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_start_beyond_x}
+ {-\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_start_beyond_x}
+ {-\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfpatharc
+ {-90}
+ {90}
+ {\l_@@_beyond_x_radius_pgf
+ ~and~\l_@@_bar_half_thickness_pgf}
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_start_beyond_x}
+ {\l_@@_bar_thickness_pgf}
+ }
+ }
+ {
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_left_nonclip_x}
+ {-\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_left_nonclip_x}
+ {\l_@@_bar_thickness_pgf}
+ }
+ }
+ \pgfpathclose
+ \pgfusepath{clip}
+ \endpgfinterruptboundingbox
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Fading in/out}
+%
+% Set up the PGF `in' fading.
+% \begin{macrocode}
+\pgfdeclarehorizontalshading{@@_fade_in_shading}{4bp}{
+ color(0bp)=(transparent!100);
+ color(1bp)=(transparent!100);
+ color(3bp)=(transparent!0);
+ color(4bp)=(transparent!0)
+}
+\pgfdeclarefading
+ {@@_fade_in}
+ {\pgfuseshading{@@_fade_in_shading}}
+% \end{macrocode}
+%
+% \begin{macro}{\@@_interval_start_range_fade:}
+% Draw fading to indicate a start range. Because some PDF renderers may otherwise leave a gap between the fade and
+% solid part, compute \cs{l_@@_fade_extra_pgf} and draw this amount of overlap with the solid part. Because of the
+% definition of the `in' fading, \cs{l_@@_fade_extra_pgf} must not exceed half of the fade width. And the overlap
+% should not exceed the actual length of the solid part.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_start_range_fade:
+ {
+ \pgfmathsetlengthmacro{\l_@@_fade_width_pgf}
+ { \l_@@_start_solid_x-\l_@@_start_extreme_x }
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}
+ { \l_@@_fade_width_pgf
+ > \pgfkeysvalueof{/timechart/fade~minimum~width} }
+ \bool_if:NT \l_@@_tmpa_bool
+ {
+ \@@_if_x_range_intersect_tolerance_bounds:nnT
+ {\l_@@_start_extreme_x}{\l_@@_start_solid_x}
+ {
+ \pgfmathsetmacro{\l_@@_fade_extra_pgf}
+ {
+ min(
+ .49*\l_@@_fade_width_pgf,
+ \l_@@_finish_solid_x-\l_@@_start_solid_x
+ )
+ }
+ \pgfscope
+ \pgfpathrectanglecorners{
+ \pgfpoint
+ {\l_@@_start_extreme_x}
+ {-\l_@@_bar_half_thickness_pgf}
+ }{
+ \pgfpoint
+ {\l_@@_start_solid_x+\l_@@_fade_extra_pgf}
+ {\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfgettransform{\@@_transform_current}
+ \pgfsetfading{@@_fade_in}{
+ \pgfsettransform{\@@_transform_current}
+ \pgftransformshift{
+ \pgfpoint
+ {
+ .5*\l_@@_start_extreme_x
+ +.5*\l_@@_start_solid_x
+ }
+ {0}
+ }
+ \pgftransformxscale{
+ (\l_@@_start_solid_x-\l_@@_start_extreme_x)
+ /2bp
+ }
+ \pgftransformyscale{\l_@@_bar_thickness_pgf/4bp}
+ }
+ \pgfsetfillcolor{\l_@@_bar_color}
+ \pgfusepath{fill}
+ \endpgfscope
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% Set up the PGF `out' fading.
+% \begin{macrocode}
+\pgfdeclarehorizontalshading{@@_fade_out_shading}{4bp}{
+ color(0bp)=(transparent!0);
+ color(1bp)=(transparent!0);
+ color(3bp)=(transparent!100);
+ color(4bp)=(transparent!100)
+}
+\pgfdeclarefading
+ {@@_fade_out}
+ {\pgfuseshading{@@_fade_out_shading}}
+% \end{macrocode}
+%
+% \begin{macro}{\@@_interval_finish_range_fade:}
+% Draw fading to indicate a finish range. As in \cs{@@_interval_start_range_fade:}, a small overlap is computed.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_finish_range_fade:
+ {
+ \pgfmathsetlengthmacro{\l_@@_fade_width_pgf}
+ { \l_@@_finish_extreme_x-\l_@@_finish_solid_x }
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}
+ { \l_@@_fade_width_pgf
+ > \pgfkeysvalueof{/timechart/fade~minimum~width} }
+ \bool_if:NT \l_@@_tmpa_bool
+ {
+ \@@_if_x_range_intersect_tolerance_bounds:nnT
+ {\l_@@_finish_solid_x}{\l_@@_finish_extreme_x}
+ {
+ \pgfmathsetmacro{\l_@@_fade_extra_pgf}
+ {
+ min(
+ .49*\l_@@_fade_width_pgf,
+ \l_@@_finish_solid_x-\l_@@_start_solid_x
+ )
+ }
+ \pgfscope
+ \pgfpathrectanglecorners{
+ \pgfpoint
+ {\l_@@_finish_solid_x-\l_@@_fade_extra_pgf}
+ {-\l_@@_bar_half_thickness_pgf}
+ }{
+ \pgfpoint
+ {\l_@@_finish_extreme_x}
+ {\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfgettransform{\@@_transform_current}
+ \pgfsetfading{@@_fade_out}{
+ \pgfsettransform{\@@_transform_current}
+ \pgftransformshift{
+ \pgfpoint{
+ .5*\l_@@_finish_solid_x
+ +.5*\l_@@_finish_extreme_x
+ }
+ {0}
+ }
+ \pgftransformxscale{
+ (\l_@@_finish_extreme_x-\l_@@_finish_solid_x)
+ /2bp
+ }
+ \pgftransformyscale{\l_@@_bar_thickness_pgf/4bp}
+ }
+ \pgfsetfillcolor{\l_@@_bar_color}
+ \pgfusepath{fill}
+ \endpgfscope
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Slant in/out}
+%
+% \begin{macro}{\@@_interval_start_range_slant:}
+% Clip and modify \cs{l_@@_start_solid_x} to draw a slanting shape to indicate the start range.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_start_range_slant:
+ {
+ \@@_if_equal:nnF
+ {\l_@@_start_extreme_x}{\l_@@_start_solid_x}
+ {
+ \@@_if_x_range_intersect_tolerance_bounds:nnT
+ {\l_@@_start_extreme_x}{\l_@@_start_solid_x}
+ {
+ \pgfinterruptboundingbox
+ \pgfpathmoveto{
+ \pgfpoint
+ {\l_@@_start_extreme_x}
+ {-\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_start_solid_x}
+ {\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_start_solid_x}
+ {\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_right_nonclip_x}
+ {\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_right_nonclip_x}
+ {-\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_start_extreme_x}
+ {-\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathclose
+ \pgfusepath{clip}
+ \endpgfinterruptboundingbox
+ \pgfmathsetmacro{\l_@@_start_solid_x}
+ {\l_@@_start_extreme_x}
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_interval_finish_range_slant:}
+% Clip and modify \cs{l_@@_finish_solid_x} to draw a slanting shape to indicate the finish range.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_finish_range_slant:
+ {
+ \@@_if_equal:nnF
+ {\l_@@_finish_solid_x}{\l_@@_finish_extreme_x}
+ {
+ \@@_if_x_range_intersect_tolerance_bounds:nnT
+ {\l_@@_finish_solid_x}{\l_@@_finish_extreme_x}
+ {
+ \pgfinterruptboundingbox
+ \pgfpathmoveto{
+ \pgfpoint
+ {\l_@@_finish_solid_x}
+ {-\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_finish_extreme_x}
+ {\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_finish_extreme_x}
+ {\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_left_nonclip_x}
+ {\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_left_nonclip_x}
+ {-\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_finish_solid_x}
+ {-\l_@@_bar_thickness_pgf}
+ }
+ \pgfpathclose
+ \pgfusepath{clip}
+ \endpgfinterruptboundingbox
+ \pgfmathsetmacro{\l_@@_finish_solid_x}
+ {\l_@@_finish_extreme_x}
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Solid bar}
+%
+% \begin{macro}{\@@_interval_draw_solid:}
+% Draw the solid part of an interval.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_draw_solid:
+ {
+ \@@_if_x_range_intersect_tolerance_bounds:nnT
+ {\l_@@_start_solid_x}
+ {\l_@@_finish_solid_x}
+ {
+ \pgfpathrectanglecorners{
+ \pgfpoint
+ {\l_@@_start_solid_x}
+ {-\l_@@_bar_half_thickness_pgf}
+ }{
+ \pgfpoint
+ {\l_@@_finish_solid_x}
+ {\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfsetfillcolor{\l_@@_bar_color}
+ \pgfusepath{fill}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Marks}
+%
+% \begin{macrocode}
+\msg_new:nnn{timechart}{interval_mark_outside}
+ { Attempt~to~mark~outside~interval~at~date~#1 }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_interval_mark:}
+% Draw marks on an interval.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_mark:
+ {
+ \pgfscope
+ \pgfsetstrokecolor{\l_@@_mark_color}
+ \foreach \year in \l_@@_mark_text
+ {
+ \pgfmathsetmacro{\l_@@_mark_x}{yeartox(\year)}
+ \@@_pgfmathsetbool:nn{\l_@@_tmpa_bool}
+ {
+ or (
+ \l_@@_mark_x < \l_@@_start_extreme_x,
+ \l_@@_mark_x > \l_@@_finish_extreme_x
+ )
+ }
+ \bool_if:NT\l_@@_tmpa_bool
+ { \msg_error:nne{timechart}{interval_mark_outside}{\year} }
+ \pgfpathmoveto{
+ \pgfpoint
+ {\l_@@_mark_x}
+ {-\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfpathlineto{
+ \pgfpoint
+ {\l_@@_mark_x}
+ {\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfusepath{draw}
+ }
+ \endpgfscope
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Bar node}
+%
+% \begin{macro}{\@@_interval_define_bar_node:}
+% Define a node with into which the bar fits exactly.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_define_bar_node:
+ {
+ \@@_make_rectangle_node:nnnn
+ {
+ \pgfpoint
+ {\l_@@_start_extreme_x}
+ {-\l_@@_bar_half_thickness_pgf}
+ }{
+ \pgfpoint
+ {\l_@@_finish_extreme_x}
+ {\l_@@_bar_half_thickness_pgf}
+ }
+ {\pgfkeysvalueof{/timechart/interval~bar~node~name}}
+ {\c_false_bool}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Label}
+%
+% \begin{macro}{\@@_interval_label:}
+% Place the label for the item.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_label:
+ {
+ \str_if_empty:NF \l_@@_label_text
+ {
+ \pgfinterruptboundingbox
+ \int_case:nn {\l_@@_label_pos_int}
+ {
+ {0}{ \@@_interval_label_left: }
+ {1}{ \@@_interval_label_center: }
+ {2}{ \@@_interval_label_right: }
+ }
+ \endpgfinterruptboundingbox
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_interval_label_left:}
+% Place the label on the left of the interval.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_label_left:
+ {
+ \@@_if_x_in_bounds:nT{\l_@@_start_extreme_x}
+ {
+ \group_begin:
+ \pgftransformshift{
+ \pgfpoint
+ {\l_@@_start_extreme_x}
+ {\l_@@_text_baseline_pgf}
+ }
+ \node[/timechart/interval~label,anchor=base~east]
+ (\l_@@_interval_label_node_name)
+ at (0,0)
+ {
+ \@@_make_ref:NN
+ \l_@@_ref_text
+ \l_@@_label_text
+ };
+ \group_end:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_interval_label_right:}
+% Place the label on the right of the interval.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_label_right:
+ {
+ \@@_if_x_in_bounds:nT{\l_@@_finish_extreme_x}
+ {
+ \group_begin:
+ \pgftransformshift{
+ \pgfpoint
+ {\l_@@_finish_extreme_x}
+ {\l_@@_text_baseline_pgf}
+ }
+ \node[/timechart/interval~label,anchor=base~west]
+ (\l_@@_interval_label_node_name)
+ at (0,0)
+ {
+ \@@_make_ref:NN
+ \l_@@_ref_text
+ \l_@@_label_text
+ };
+ \group_end:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_interval_label_center:}
+% Place the label at the center of the interval.
+% \begin{macrocode}
+\cs_new:Npn\@@_interval_label_center:
+ {
+ \pgfmathsetlengthmacro{\l_@@_label_anchor_x}
+ {
+ .5*max(\l_@@_start_definite_x,\l_@@_start_x)
+ + .5*min(\l_@@_finish_definite_x,\l_@@_finish_x)
+ }
+% \end{macrocode}
+% First draw the `background label' on the layer below the bar.
+% \begin{macrocode}
+ \group_begin:
+ \pgftransformshift{
+ \pgfpoint
+ {\l_@@_label_anchor_x}
+ {\l_@@_text_baseline_pgf}
+ }
+ \pgfonlayer{labelbg}
+ \node[
+ /timechart/interval~label~centered~background,
+ anchor=base
+ ]
+ at (0,0)
+ { \l_@@_label_text };
+ \endpgfonlayer
+ \group_end:
+% \end{macrocode}
+% Then draw the label on top of the bar, clipping it to the bar outline.
+% \begin{macrocode}
+ \pgfscope
+ \pgfpathrectanglecorners{
+ \pgfpoint
+ {\l_@@_start_extreme_x}
+ {-\l_@@_bar_half_thickness_pgf}
+ }{
+ \pgfpoint
+ {\l_@@_finish_extreme_x}
+ {\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfusepath{clip}
+ \group_begin:
+ \pgftransformshift{
+ \pgfpoint
+ {\l_@@_label_anchor_x}
+ {\l_@@_text_baseline_pgf}
+ }
+ \node[
+ /timechart/interval~label~centered,
+ anchor=base
+ ]
+ (\l_@@_interval_label_node_name)
+ at (0,0)
+ {
+ \@@_make_ref:NN
+ \l_@@_ref_text
+ \l_@@_label_text
+ };
+ \group_end:
+ \endpgfscope
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Text}
+%
+% \begin{macro}{\@@_text_user:Omm}
+% Place text. This macro will be made available as \cs{timecharttext} inside the \env{timechart} environment.
+% \begin{arguments}
+% \item PGF keys under \key{/timechart/} to apply.
+% \item Year at which to place text.
+% \item Text.
+% \end{arguments}
+% \begin{macrocode}
+\NewDocumentCommand{\@@_text_user:Omm}{ O{} m m }
+ {
+ \str_if_empty:nF{#3}{
+ \group_begin:
+ \pgfmathsetmacro{\l_@@_text_x}{yeartox(#2)}
+ \@@_if_x_in_tolerance_bounds:nT{\l_@@_text_x}
+ {
+% \end{macrocode}
+% Process keys supplied locally and retrieve needed keys.
+% \begin{macrocode}
+ \pgfqkeys{/timechart}{
+ #1,
+ ref/.get=\l_@@_ref_text,
+ text~node~name/.get=\l_@@_node_name_text,
+ text~baseline/.get=\l_@@_text_baseline_pgf,
+ }
+% \end{macrocode}
+% Shift to the correct vertical coordinate and place the text.
+% \begin{macrocode}
+ \pgftransformshift{
+ \pgfpoint{0}{\l_@@_current_y}
+ }
+ \pgfinterruptboundingbox
+ \group_begin:
+ \pgftransformshift{
+ \pgfpoint{\l_@@_text_x}{\l_@@_text_baseline_pgf}
+ }
+ \cs_set:Npn\l_@@_text{#3}
+ \int_case:nn {\l_@@_text_pos_int}
+ {
+ {0}{ \cs_set:Npn\l_@@_node_anchor_text{base~east} }
+ {1}{ \cs_set:Npn\l_@@_node_anchor_text{base} }
+ {2}{ \cs_set:Npn\l_@@_node_anchor_text{base~west} }
+ }
+ \node[/timechart/text,anchor=\l_@@_node_anchor_text]
+ (\l_@@_node_name_text)
+ at (0,0)
+ {
+ \@@_make_ref:NN
+ \l_@@_ref_text
+ \l_@@_text
+ };
+ \group_end:
+ \endpgfinterruptboundingbox
+ }
+ \group_end:
+ }
+% \end{macrocode}
+% Since the text itself does not affect the bounding box, create a space (which will handle the automatic step).
+% \begin{macrocode}
+ \@@_space_user:O[#1]
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Space}
+%
+% \begin{macro}{\@@_space_user:O}
+% Create a vertical space as if there were an interval at the current coordinate. This macro will be made available as
+% \cs{timechartspace} inside the \env{timechart} environment.
+% \begin{macrocode}
+\NewDocumentCommand{\@@_space_user:O}{ O{} }
+ {
+ \group_begin:
+% \end{macrocode}
+% Process keys supplied locally and retreive the one needed value.
+
+% \begin{macrocode}
+ \pgfqkeys{/timechart}{
+ #1,
+ interval~bar~thickness/.get=\l_@@_bar_thickness_pgf,
+ }
+ \pgfmathsetlengthmacro{\l_@@_bar_half_thickness_pgf}
+ { .5*\l_@@_bar_thickness_pgf }
+% \end{macrocode}
+% Shift to the correct vertical coordinate and create the space.
+% \begin{macrocode}
+ \pgftransformshift{
+ \pgfpoint{0}{\l_@@_current_y}
+ }
+ \pgfpathmoveto{
+ \pgfpoint{0}{-\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfpathmoveto{
+ \pgfpoint{0}{\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfusepath{discard}
+ \group_end:
+ \bool_if:NT\l_@@_autostep_bool{
+ \@@_step_y_user:O
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Legends}
+%
+% \begin{macro}{\timechartlegenditem}
+% Draw a bar suitable for use in a legend, applying style in \param{1}.
+% \begin{macrocode}
+\NewDocumentCommand{\timechartlegenditem}{ O{} }
+ {
+ \@@_legend_aux:nn{#1}{
+ \pgfmathsetlengthmacro{\l_@@_start_solid_x}{0}
+ \pgfmathsetlengthmacro{\l_@@_finish_solid_x}
+ {\l_@@_legenditem_width_pgf}
+ \@@_interval_draw_solid:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\timechartlegendstartrange,\timechartlegendfinishrange}
+% Draw a bar with start/finish range, suitable for use in a legend, applying style in \param{1}.
+% \begin{macrocode}
+\NewDocumentCommand{\timechartlegendstartrange}{ O{} }
+ {
+ \@@_legend_aux:nn{#1}{
+ \pgfmathsetlengthmacro{\l_@@_start_extreme_x}{0}
+ \pgfmathsetlengthmacro{\l_@@_start_solid_x}
+ {\pgfkeysvalueof{/timechart/legend~item~range~width}}
+ \pgfmathsetlengthmacro{\l_@@_finish_solid_x}
+ {\l_@@_legenditem_width_pgf}
+ \int_case:nn {\l_@@_start_range_type_int}
+ {
+ {0}{ \@@_interval_start_range_fade: }
+ {1}{ \@@_interval_start_range_slant: }
+ }
+ \@@_interval_draw_solid:
+ }
+ }
+\NewDocumentCommand{\timechartlegendfinishrange}{ O{} }
+ {
+ \@@_legend_aux:nn{#1}{
+ \pgfmathsetlengthmacro{\l_@@_start_solid_x}{0}
+ \pgfmathsetlengthmacro{\l_@@_finish_solid_x}
+ {
+ \l_@@_legenditem_width_pgf
+ -\pgfkeysvalueof{/timechart/legend~item~range~width}
+ }
+ \pgfmathsetlengthmacro{\l_@@_finish_extreme_x}
+ {\l_@@_legenditem_width_pgf}
+ \int_case:nn {\l_@@_finish_range_type_int}
+ {
+ {0}{ \@@_interval_finish_range_fade: }
+ {1}{ \@@_interval_finish_range_slant: }
+ }
+ \@@_interval_draw_solid:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_legend_aux:nn}
+% Auxiliary command for legend items. Draw a \TikZ\ picture, applying PGF keys \param{1} under \key{/timechart/}
+% and using \TikZ\ code \param{2}.
+% \begin{macrocode}
+\cs_new:Npn\@@_legend_aux:nn #1#2
+ {
+ \tikzpicture
+% \end{macrocode}
+% Process supplied PGF keys and retrieve only those necessary.
+% \begin{macrocode}
+ \pgfkeys{
+ /timechart/.cd,
+ #1,
+ interval~bar~thickness/.get=\l_@@_bar_thickness_pgf,
+ interval~bar~color/.get=\l_@@_bar_color,
+ interval~minimum~width/.get=\l_@@_minimum_width_pgf,
+ beyond~length/.get=\l_@@_beyond_length_pgf,
+ legend~item~width/.get=\l_@@_legenditem_width_pgf,
+ }
+ \pgfmathsetlengthmacro{\l_@@_bar_half_thickness_pgf}
+ {.5*\l_@@_bar_thickness_pgf}
+ \pgfmathsetmacro{\l_@@_start_x}{0}
+ \pgfmathsetmacro{\l_@@_finish_x}
+ {\l_@@_legenditem_width_pgf}
+ \pgfmathsetlengthmacro{\l_@@_start_beyond_x}
+ {\l_@@_start_x-\l_@@_beyond_length_pgf}
+ \pgfmathsetlengthmacro{\l_@@_finish_beyond_x}
+ {\l_@@_finish_x+\l_@@_beyond_length_pgf}
+ \pgfmathsetmacro{\l_@@_current_y}{0}
+% \end{macrocode}
+% Ensure that the legend is `visible' from the perspective of the drawing macros.
+% \begin{macrocode}
+ \pgfmathsetmacro{\l_@@_start_tolerance_x}
+ {\l_@@_start_x-10mm}
+ \pgfmathsetmacro{\l_@@_finish_tolerance_x}
+ {\l_@@_finish_x+10mm}
+ #2
+% \end{macrocode}
+% Make sure that the legend has the required bounding box.
+% \begin{macrocode}
+ \pgfresetboundingbox
+ \pgfmoveto{
+ \pgfpoint{0}{-\l_@@_bar_half_thickness_pgf}
+ }
+ \pgfmoveto{
+ \pgfpoint
+ {\l_@@_legenditem_width_pgf}
+ {\l_@@_bar_half_thickness_pgf}
+ }
+ \endtikzpicture%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/graphics/pgf/contrib/timechart/timechart.ins b/graphics/pgf/contrib/timechart/timechart.ins
new file mode 100644
index 0000000000..e4a9c32bed
--- /dev/null
+++ b/graphics/pgf/contrib/timechart/timechart.ins
@@ -0,0 +1,38 @@
+%%
+%% Copyright (C) 2025 Alan J. Cain
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public Licence, either
+%% version 1.3 of this licence or (at your option) any later
+%% version. The latest version of this licence is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008-05-04 or later.
+%%
+\input l3docstrip.tex
+\askforoverwritefalse
+\nopostamble
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2025 Alan J. Cain
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public Licence, either
+version 1.3 of this licence or (at your option) any later
+version. The latest version of this licence is in:
+
+http://www.latex-project.org/lppl.txt
+
+and version 1.3c or later is part of all distributions of
+LaTeX version 2008-05-04 or later.
+
+\endpreamble
+
+\generate{\file{timechart.sty}{\from{timechart.dtx}{package}}}
+
+\endbatchfile
diff --git a/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-en.pdf b/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-en.pdf
index 6ef7f59476..ce114e03f7 100644
--- a/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-en.pdf
+++ b/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-en.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-en.tex b/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-en.tex
index 88e9abb16a..27d56d19a5 100644
--- a/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-en.tex
+++ b/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-en.tex
@@ -6,6 +6,7 @@
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{tkz-grapheur}
+\pgfplotsset{compat=newest}
\usepackage{amsmath}
\usepackage{fancyvrb}
\usepackage{fancyhdr}
@@ -13,6 +14,7 @@
\usepackage{nicefrac}
\usepackage{fontawesome5}
\usepackage{tcolorbox}
+\usepackage{minted2}
\tcbuselibrary{skins,minted}
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
@@ -29,11 +31,12 @@
\hypersetup{pdfborder=0 0 0}
\usepackage[margin=2cm]{geometry}
\setlength{\parindent}{0pt}
-\def\TPversion{0.1.5}
-\def\TPdate{22/06/2024}
+\def\TPversion{0.2.0}
+\def\TPdate{29/10/2024}
\usepackage{soul}
\usepackage{codehigh}
\usepackage{tabularray}
+\usepackage{alphalph}
\sethlcolor{lightgray!25}
\NewDocumentCommand\MontreCode{ m }{%
\hl{\vphantom{\texttt{pf}}\texttt{#1}}%
@@ -532,7 +535,7 @@ The mandatory arguments correspond to the x-coordinates (in \TikZ\ language) and
\subsection{Draw a line}\label{tracstraight}
-The idea is to propose a command to draw a line, from:
+The idea is to propose a command to draw a line (or an asymptote), from:
\begin{itemize}
\item of two points (or nodes);
@@ -542,6 +545,7 @@ The idea is to propose a command to draw a line, from:
\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
%in the GraphiqueTikz environment
\DrawLine[keys]{point or node}{point or node or slope}
+\DrawAsymptote[keys]{x value}
\end{tcblisting}
The optional \MontreCode{[keys]} available are:
@@ -564,6 +568,7 @@ The optional \MontreCode{[keys]} available are:
\DrawLine[Color=red]{(-2,-1)}{(2,4)}
\DrawLine[Color=blue,Start=-5,End=3]{(A)}{(B)}
\DrawLine[Color=olive,Slope]{(C)}{0.25}
+ \DrawAsymptote[Color=brown]{-6}
\end{GraphTikz}
\end{tcblisting}
@@ -1396,7 +1401,11 @@ The last mandatory argument is the work point (abscissa version or node followin
\section{Commands specific to two-variable statistics}
-\subsection{The point cloud}\label{scatter}
+\subsection{Limitations}
+
+Given the specific features of \TikZ, we advise you not to use values that are too \textit{large} at axis level (this can cause problems with years, for example), or else you'll have to \textit{transform} axis and/or data values so that everything is displayed as it should be (also beware of regressions, calculations, etc.).
+
+\subsection{The point scatter}\label{scatter}
In addition to commands linked to functions, it is also possible to represent double statistical series.
@@ -1490,7 +1499,7 @@ In partnership with the \MontreCode{xint-regression} package, loaded by the pack
The command, similar to that of defining a curve, is:
\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
-\DrawRegression[keys]<no fct>{type}<rounded>{listex}{listey}
+\DrawRegression[keys]<name fct>{type}<rounded>{listex}{listey}
\end{tcblisting}
The \MontreCode{[keys]} available are, classically:
@@ -1651,60 +1660,146 @@ $\begin{cases}
\gamma \approx \RoundNb[0]{\Cgamma}
\end{cases}$.
\end{tcblisting}
-%
-%\newpage
-%
-%\section{Liste des commandes}
-%
-%Les commandes disponibles sont :
-%
-%\NewDocumentCommand\lstcmd{ m m m }{%
-% \item[\texttt{#1}] : \mintinline{latex}|#2|\hfill{}page \pageref{#3}
-%}
-%
-%\begin{description}
-% \lstcmd{environnement~~}{\begin{GraphiqueTikz}...\end{GraphiqueTikz}}{creaenvt}
-% \lstcmd{axes et grilles}{\TracerAxesGrille}{creaaxesgr}
-% \lstcmd{aj val axes X~~}{\RajouterValeursAxeX}{ajoutvals}
-% \lstcmd{aj val axes Y~~}{\RajouterValeursAxeY}{ajoutvals}
-% \lstcmd{def fonction~~~}{\DefineCurve}{deftracfct}
-% \lstcmd{tracé courbe~~~}{\DrawCurve}{deftracfct}
-% \lstcmd{def interpo~~~~}{\DefineCurveInterpo}{deftracinterpo}
-% \lstcmd{tracé interpo~~}{\DrawCurveInterpo}{deftracinterpo}
-% \lstcmd{def spline~~~~~}{\DefineSplineCurve}{deftracfctspline}
-% \lstcmd{tracé spline~~~}{\DrawSplineCurve}{deftracfctspline}
-% \lstcmd{tracé droite~~~}{\TracerDroite}{tracdroite}
-% \lstcmd{def points~~~~~}{\DefinirPts}{defpts}
-% \lstcmd{def image~~~~~~}{\DefinirImage}{defpts}
-% \lstcmd{marq pts~~~~~~~}{\MarquerPts}{markpts}
-% \lstcmd{placer txt~~~~~}{\PlacerTexte}{placetxt}
-% \lstcmd{récup absc~~~~~}{\RecupererAbscisse}{recupcoordo}
-% \lstcmd{récup ordo~~~~~}{\RecupererOrdonnee}{recupcoordo}
-% \lstcmd{récup coordos~~}{\RecupererCoordonnees}{recupcoordo}
-% \lstcmd{images~~~~~~~~~}{\PlacerImages}{images}
-% \lstcmd{antécédents~~~~}{\TrouverAntecedents}{defanteced}
-% \lstcmd{antécédents~~~~}{\PlacerAntecedents}{tracanteced}
-% \lstcmd{intersection~~~}{\TrouverIntersections}{intersect}
-% \lstcmd{maximum~~~~~~~~}{\TrouverMaximum}{maximum}
-% \lstcmd{minimum~~~~~~~~}{\TrouverMinimum}{minimum}
-% \lstcmd{intégrale~~~~~~}{\DrawIntegral}{integr}
-% \lstcmd{tangente~~~~~~~}{\DrawTangente}{tgte}
-% \lstcmd{loi normale~~~~}{\DefinirLoiNormale}{loinormale}
-% \lstcmd{loi normale~~~~}{\TracerLoiNormale}{loinormale}
-% \lstcmd{loi khideux~~~~}{\DefinirLoiKhiDeux}{loikhideux}
-% \lstcmd{loi khideux~~~~}{\TracerLoiKhiDeux}{loikhideux}
-% \lstcmd{stats 2 var~~~~}{\TracerNuage}{nuage}
-% \lstcmd{regressions~~~~}{\TracerAjustement}{regressions}
-% \lstcmd{arrondi~~~~~~~~}{\RoundNb}{numarrond}
-% \lstcmd{nb aléat~~~~~~~}{\ChoisirNbAlea}{nbalea}
-%\end{description}
+
+\subsection{Monte-Carle method}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%in the GraphiqueTikz environment
+\SimulateMonteCarlo[keys]<function>}{number of points}[\nbptsmcok][\nbptsmcko]
+\end{tcblisting}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+\begin{GraphTikz}%
+ [x=10cm,y=10cm,Xmin=0,Xmax=1,Xgrid=0.1,Xgrids=0.05,
+ Ymin=0,Ymax=1,Ygrid=0.1,Ygrids=0.05]
+ \DrawAxisGrids[Enlarge=2.5mm,Last]{auto}{auto}
+ \DefineCurve[Trace,Color=teal,Step=0.001]<f>{sqrt(1-x^2)}
+ \SimulateMonteCarlo<f>{5000}
+\end{GraphTikz}
+
+There is \textcolor{blue}{\num{\nbptsmcok}} blue points,
+there is \textcolor{red}{\num{\nbptsmcko}} red points.
+
+And $\frac{\num{\nbptsmcok}}{\num{\nbptsmc}}
+\approx \RoundNb[4]{\nbptsmcok/\nbptsmc}$
+et $\frac{\pi}{4} \approx \RoundNb[4]{pi/4}$.
+\end{tcblisting}
\pagebreak
+\subsection{Some pgfplots macros}
+
+In addition to pgfplots/axis, there's few \textit{simple} macros in order to work with \MontreCode{pgfplots/axis} environement.
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%find intersection of two [name path] objects defined
+\findintersectionspgf[nodename baises]{object1}{object2}[\myt]
+%global extraction of coordinates
+\gextractxnodepgf{node}[\myxcoord]
+\gextractynodepgf{node}[\myycoord]
+\gextractxynodepgf{node}[\myxcoord][\myycoord]
+%area between curves
+\fillbetweencurvespgf[tikz options]{curve1}{curve2}<soft domain options>
+%cubic splines
+\addplotspline(*)[tikz options]<coeffs>{list of points}[\myspline]
+\end{tcblisting}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%\usepackage{alphalph}
+
+\begin{tikzpicture}
+ \begin{axis}%
+ [%
+ axis y line=center,axis x line=middle, %axis
+ axis line style={line width=0.8pt,-latex},
+ x=0.33cm,y=0.55cm,xmin=1985,xmax=2030,ymin=56,ymax=70, %units
+ grid=both,xtick distance=5,ytick distance=2, %gridp
+ minor x tick num=4,minor y tick num=1, %grids
+ extra x ticks={1985},extra x tick style={grid=none}, %origx
+ extra y ticks={56},extra y tick style={grid=none}, %origy
+ x tick label style={/pgf/number format/.cd,use comma,1000 sep={}}, %year
+ major tick length={2*3pt},minor tick length={1.5*3pt}, %grads
+ every tick/.style={line width=0.8pt},enlargelimits=false, %style
+ enlarge x limits={abs=2.5mm,upper},enlarge y limits={abs=2.5mm,upper}, %énlarge
+ ]
+ %spline + y=66
+ \addplot[name path global=eqtest,mark=none,red,line width=1.05pt,domain=1985:2030] {66} ;
+ \def\LISTETEST{1985/60/0§1995/68/0§2015/58/0§2025/69/0§2030/62/-2}
+ \addplotspline*[line width=1.05pt,violet,name path global=splinecubtest]{\LISTETEST}[\monsplineviolet]
+ %equation f(x)=66
+ \findintersectionspgf[MonItsc]{eqtest}{splinecubtest}
+ %extraction of coordinates
+ \gextractxnodepgf{(MonItsc-1)}[\xMonItscA]
+ \gextractxnodepgf{(MonItsc-2)}[\xMonItscB]
+ \gextractxnodepgf{(MonItsc-3)}[\xMonItscC]
+ \gextractxnodepgf{(MonItsc-4)}[\xMonItscD]
+ %vizualisation
+ \xintFor* #1 in {\xintSeq{1}{4}}\do{%
+ \draw[line width=0.9pt,densely dashed,olive,->,>=latex] (MonItsc-#1) -- (\csname xMonItsc\AlphAlph{#1}\endcsname,56) ;
+ \filldraw[olive] (MonItsc-#1) circle[radius=1.75pt] ;
+ }
+ %area
+ \path [name path=xaxis] (1985,56) -- (2030,56);
+ \fillbetweencurvespgf{splinecubtest}{xaxis}<domain={\xMonItscB:\xMonItscA}>
+ \fillbetweencurvespgf{splinecubtest}{xaxis}<domain={\xMonItscD:\xMonItscC}>
+ \end{axis}
+\end{tikzpicture}
+
+Solutions of $f(x)=66$ are \RoundNb[0]{\xMonItscA} \&\ \RoundNb[0]{\xMonItscB} \&\ \RoundNb[0]{\xMonItscC} \&\ \RoundNb[0]{\xMonItscD}.
+\end{tcblisting}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,text only}
+\begin{tikzpicture}
+ \begin{axis}%
+ [%
+ axis y line=center,axis x line=middle, %axis
+ axis line style={line width=0.8pt,-latex},
+ x=0.33cm,y=0.55cm,xmin=1985,xmax=2030,ymin=56,ymax=70, %units
+ grid=both,xtick distance=5,ytick distance=2, %gridp
+ minor x tick num=4,minor y tick num=1, %grids
+ extra x ticks={1985},extra x tick style={grid=none}, %origx
+ extra y ticks={56},extra y tick style={grid=none}, %origy
+ x tick label style={/pgf/number format/.cd,use comma,1000 sep={}}, %year
+ major tick length={2*3pt},minor tick length={1.5*3pt}, %grads
+ every tick/.style={line width=0.8pt},enlargelimits=false, %style
+ enlarge x limits={abs=2.5mm,upper},enlarge y limits={abs=2.5mm,upper}, %énlarge
+ ]
+ %spline + y=66
+ \addplot[name path global=eqtest,mark=none,red,line width=1.05pt,domain=1985:2030] {66} ;
+ \def\LISTETEST{1985/60/0§1995/68/0§2015/58/0§2025/69/0§2030/62/-2}
+ \addplotspline*[line width=1.05pt,violet,name path global=splinecubtest]{\LISTETEST}[\monsplineviolet]
+ %equation f(x)=66
+ \findintersectionspgf[MonItsc]{eqtest}{splinecubtest}
+ %extraction of coordinates
+ \gextractxnodepgf{(MonItsc-1)}[\xMonItscA]
+ \gextractxnodepgf{(MonItsc-2)}[\xMonItscB]
+ \gextractxnodepgf{(MonItsc-3)}[\xMonItscC]
+ \gextractxnodepgf{(MonItsc-4)}[\xMonItscD]
+ %vizualisation
+ \xintFor* #1 in {\xintSeq{1}{4}}\do{%
+ \draw[line width=0.9pt,densely dashed,olive,->,>=latex] (MonItsc-#1) -- (\csname xMonItsc\AlphAlph{#1}\endcsname,56) ;
+ \filldraw[olive] (MonItsc-#1) circle[radius=1.75pt] ;
+ }
+ %area
+ \path [name path=xaxis] (1985,56) -- (2030,56);
+ \fillbetweencurvespgf{splinecubtest}{xaxis}<domain={\xMonItscB:\xMonItscA}>
+ \fillbetweencurvespgf{splinecubtest}{xaxis}<domain={\xMonItscD:\xMonItscC}>
+ \end{axis}
+\end{tikzpicture}
+
+Solutions of $f(x)=66$ are \RoundNb[0]{\xMonItscA} \&\ \RoundNb[0]{\xMonItscB} \&\ \RoundNb[0]{\xMonItscC} \&\ \RoundNb[0]{\xMonItscD}.
+\end{tcblisting}
+
+
+
\section{History}
\begin{quote}
\begin{verbatim}
+0.2.0 : [Alt] key for Hermite spline + few pgfplots macros
+0.1.9 : Bugfix
+0.1.8 : New commands [in french doc] (binomial, cabweb,\ldots)
+0.1.6 : Vertical asymptote + [in french doc] commands for integrals
0.1.5 : Initial version [en]
\end{verbatim}
\end{quote}
diff --git a/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-fr.pdf b/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-fr.pdf
index c53d69179c..0a5577dafe 100644
--- a/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-fr.pdf
+++ b/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-fr.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-fr.tex b/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-fr.tex
index 9ea6b13200..e851265a5f 100644
--- a/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-fr.tex
+++ b/graphics/pgf/contrib/tkz-grapheur/doc/tkz-grapheur-doc-fr.tex
@@ -6,13 +6,17 @@
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{tkz-grapheur}
+\pgfplotsset{compat=newest}
+\usepackage{alphalph}
\usepackage{amsmath}
+\usepackage{enumitem}
\usepackage{fancyvrb}
\usepackage{fancyhdr}
\usepackage{hyperref}
\usepackage{nicefrac}
\usepackage{fontawesome5}
\usepackage{tcolorbox}
+\usepackage{minted2}
\tcbuselibrary{skins,minted}
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
@@ -29,8 +33,8 @@
\hypersetup{pdfborder=0 0 0}
\usepackage[margin=2cm]{geometry}
\setlength{\parindent}{0pt}
-\def\TPversion{0.1.5}
-\def\TPdate{22/06/2024}
+\def\TPversion{0.2.0}
+\def\TPdate{29/10/2024}
\usepackage{soul}
\usepackage{codehigh}
\usepackage{tabularray}
@@ -39,7 +43,7 @@
\hl{\vphantom{\texttt{pf}}\texttt{#1}}%
}
\usepackage[french]{babel}
-
+\sisetup{group-minimum-digits=4}
\renewcommand{\footnoterule}{\vfill\kern -3pt \hrule width 0.4\columnwidth \kern 2.6pt}
\begin{document}
@@ -174,7 +178,7 @@
\subsection{Description et idées générales}
-Avec ce modeste package, loin des capacités offertes par exemple par les excellents packages \MontreCode{tkz-*}\footnote{par exemple tkz-base \url{https://ctan.org/pkg/tkz-base} et tkz-fct \url{https://ctan.org/pkg/tkz-fct}.} (d'Alain Matthes) ou \MontreCode{tzplot}\footnote{CTAN : \url{https://ctan.org/pkg/tzplot}.} (de In-Sung Cho), il est possible de travailler sur des graphiques de fonctions, en langage \TikZ, de manière \textit{intuitive} et \textit{explicite}.
+Avec ce modeste package, loin des capacités offertes par exemple par les excellents packages \MontreCode{pgfplots}\footnote{CTAN : \url{https://ctan.org/pkg/pgfplots}}, \MontreCode{tkz-*}\footnote{par exemple tkz-base \url{https://ctan.org/pkg/tkz-base} et tkz-fct \url{https://ctan.org/pkg/tkz-fct}.} (d'Alain Matthes) ou \MontreCode{tzplot}\footnote{CTAN : \url{https://ctan.org/pkg/tzplot}.} (de In-Sung Cho), il est possible de travailler sur des graphiques de fonctions, en langage \TikZ, de manière \textit{intuitive} et \textit{explicite}.
\smallskip
@@ -183,7 +187,7 @@ Concernant le fonctionnement global :
\smallskip
\begin{itemize}
- \item des styles particuliers pour les objets utilisés ont été définis, mais ils peuvent localement être modifiés ;
+ \item des styles particuliers pour les objets utilisés ont été définis (modifiables localement) ;
\item le nom des commandes est sous forme \textit{opérationnelle}, de sorte que la construction des éléments graphiques a une forme quasi \textit{algorithmique}.
\end{itemize}
@@ -209,7 +213,8 @@ Il sera ensuite possible :
\item de tracer des courbes ;
\item de déterminer graphiquement des images ou des antécédents ;
\item de rajouter des éléments de dérivation (tangentes) ou d'intégration (domaine) ;
- \item de tracer une droite d'ajustement linéaire ou la courbe d'un autre ajustement.
+ \item de tracer une droite d'ajustement linéaire ou la courbe d'un autre ajustement ;
+ \item \dots
\end{itemize}
\subsection{Packages utilisés, et options du package}
@@ -221,6 +226,7 @@ Le package utilise :
\begin{itemize}
\item \MontreCode{tikz}, avec les librairies \MontreCode{calc,intersections,patterns,patterns.meta,bbox} ;
\item \MontreCode{simplekv}, \MontreCode{xintexpr}, \MontreCode{xstring}, \MontreCode{listofitems} ;
+ \item \MontreCode{pgfplots}, avec la librairie \MontreCode{fillbetween} (désactivable via \MontreCode{[nonpgfplots]}) ;
\item \MontreCode{xint-regression}\footnote{CTAN : \url{https://ctan.org/pkg/xint-regression}.} (pour les régressions, désactivable via \MontreCode{[nonxintreg]}).
\end{itemize}
@@ -228,7 +234,9 @@ Le package utilise :
Le package charge également \MontreCode{siunitx} avec les options classiques \texttt{[fr]}, mais il est possible de ne pas le charger en utilisant l'option \MontreCode{[nonsiunitx]}.
-\smallskip
+\pagebreak
+
+\subsection{Chargement du package}
Le package charge également la librairie \TikZ\ \MontreCode{babel}, mais il est possible de ne pas la charger en utilisant l'option \MontreCode{[nontikzbabel]}.
@@ -245,9 +253,11 @@ Les différentes options sont bien évidemment cumulables.
%chargement sans tikz.babel
\usepackage[nontikzbabel]{tkz-grapheur}
-\end{tcblisting}
-\pagebreak
+%chargement sans pgfplots + options compat
+\usepackage[nonpgfplots]{tkz-grapheur}
+\pgfplotsset{compat=...}
+\end{tcblisting}
À noter également que certaines commandes peuvent utiliser des packages comme \MontreCode{nicefrac}, qui sera donc à charger le cas échéant.
@@ -263,13 +273,15 @@ Il est possible, dû aux calculs (multiples) effectués en interne, que le temps
La précision des résultats (de détermination) semble être aux environs de $10^{-4}$, ce qui devrait normalement garantir des tracés et lectures \textit{satisfaisantes}. Il est quand même conseillé d'être prudent quant aux résultats obtenus et ceux attendus.
+\pagebreak
+
\subsection{Exemple introductif}
On peut par exemple partir de l'exemple suivant, pour \textit{illustrer} le cheminement des commandes de ce package. Les commandes et la syntaxe seront détaillées dans les sections suivantes !
\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
\begin{GraphiqueTikz}%
- [x=7.5cm,y=7.5cm,Xmin=0,Xmax=1.001,Xgrille=0.1,Xgrilles=0.02,
+ [x=10cm,y=10cm,Xmin=0,Xmax=1.001,Xgrille=0.1,Xgrilles=0.02,
Ymin=0,Ymax=1.001,Ygrille=0.1,Ygrilles=0.02]
\TracerAxesGrilles[Elargir=2.5mm,Police=\small]%
{0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1}
@@ -331,16 +343,24 @@ Concernant les styles des \textit{objets}, ils sont donnés ci-dessous.
\tikzset{pflgrillep/.style={thin,lightgray}}
\tikzset{pflgrilles/.style={very thin,lightgray}}
\tikzset{pflaxes/.style={line width=0.8pt,->,>=latex}}
+\end{tcblisting}
-%style des points (courbe / nuage /labels)
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%style des points (courbe / nuage /labels / montecarlo)
\tikzset{pflpoint/.style={line width=0.95pt}}
\tikzset{pflpointc/.style={radius=1.75pt}}
\tikzset{pflpointnuage/.style={radius=1.75pt}}
+\tikzset{pflpointmc/.style={radius=0.875pt}}
\tikzset{pflnoeud/.style={}} %pour les inner sep par exemple :-)
+\tikzset{pflcourbediscont/.style={line width=1.1pt}}
+\end{tcblisting}
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
%style des courbes
\tikzset{pflcourbe/.style={line width=1.05pt}}
+\end{tcblisting}
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
%style des traits (normaux, antécédents, images)
\tikzset{pfltrait/.style={line width=0.8pt}}
\tikzset{pfltraitantec/.style={line width=0.95pt,densely dashed}}
@@ -352,6 +372,18 @@ Concernant les styles des \textit{objets}, ils sont donnés ci-dessous.
\tikzset{pflflechegd/.style={<->,>=latex}}
\end{tcblisting}
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%style des constructions ECC (courbe / paramètres)
+\tikzset{pfltraitsparamecc/.style={line width=0.9pt,densely dashed}}
+\tikzset{pflcourbeecc/.style={line width=1.05pt}}
+\end{tcblisting}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%style des constructions récurrence
+\tikzset{pfltraitrec/.style={line width=0.8pt}}
+\tikzset{pfltraitrecpointill/.style={pfltraitrec,densely dashed}}
+\end{tcblisting}
+
L'idée est donc de pouvoir redéfinir globalement ou localement les styles, et éventuellement de rajouter des éléments, en utilisant \mintinline{latex}|monstyle/.append style={...}|.
\subsection{Création de l'environnement}\label{creaenvt}
@@ -544,9 +576,12 @@ L'idée est de proposer une commande pour tracer une droite, à partir :
\item d'un point (ou nœud) et de la pente.
\end{itemize}
+Il existe également une commande pour une asymptote verticale.
+
\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
%dans l'environnement GraphiqueTikz
\TracerDroite[clés]{point ou nœud}{point ou noeud ou pente}
+\TracerAsymptote[clés]{abscisse}
\end{tcblisting}
Les \MontreCode{[clés]}, optionnelles, disponibles sont :
@@ -569,6 +604,7 @@ Les \MontreCode{[clés]}, optionnelles, disponibles sont :
\TracerDroite[Couleur=red]{(-2,-1)}{(2,4)}
\TracerDroite[Couleur=blue,Debut=-5,Fin=3]{(A)}{(B)}
\TracerDroite[Couleur=olive,Pente]{(C)}{0.25}
+ \TracerAsymptote[Couleur=brown]{-6}
\end{GraphiqueTikz}
\end{tcblisting}
@@ -676,7 +712,8 @@ Les \MontreCode{[clés]} pour la définition ou le tracé, optionnelles, disponi
\item \MontreCode{Nom} : nom de la courbe d'interpolation (important pour la suite !) ;
\item \MontreCode{Coeffs} : modifier (voir la documentation de \textsf{ProfLycee}\footnote{CTAN : \url{https://ctan.org/pkg/proflycee}} les \textit{coefficients} du spline ;
\item \MontreCode{Couleur} : couleur du tracé (\MontreCode{black} par défaut) ;
- \item \MontreCode{Trace} : booléen pour tracer également la courbe (\MontreCode{false} par défaut).
+ \item \MontreCode{Trace} : booléen pour tracer également la courbe (\MontreCode{false} par défaut) ;
+ \item \MontreCode{Alt} : booléen pour activer une autre \textit{méthode de calcul} (\MontreCode{false} par défaut).
\end{itemize}
L'argument obligatoire permet quant à lui de spécifier la liste des points supports sous la forme \MontreCode{x1/y1/f'1§x2/y2/f'2§...} avec :
@@ -690,12 +727,13 @@ L'argument obligatoire permet quant à lui de spécifier la liste des points sup
\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
\begin{GraphiqueTikz}%
- [x=0.8cm,y=1cm,Xmin=-7,Xmax=4,Ymin=-3,Ymax=5]
+ [x=0.8cm,y=0.8cm,Xmin=-7,Xmax=4,Ymin=-3,Ymax=5]
\TracerAxesGrilles[Elargir=2.5mm]{-7,-6,...,4}{-3,-2,...,5}
%définition de la liste des points support du spline
\def\LISTETEST{-6/4/-2§-5/2/-2§-4/0/-2§-2/-2/0§1/2/2§3/3.5/0.5}
- %définition et tracé du spline cubique
+ %définition et tracé du spline cubique (x2)
\DefinirCourbeSpline[Nom=splinetest,Trace,Couleur=olive]{\LISTETEST}
+ \DefinirCourbeSpline[Alt,Nom=splinetest,Trace,Couleur=teal]{\LISTETEST}
\end{GraphiqueTikz}
\end{tcblisting}
@@ -823,6 +861,38 @@ Les \MontreCode{[clés]}, optionnelles, disponibles sont :
\end{GraphiqueTikz}
\end{tcblisting}
+\subsection{Marquer des points de discontinuité}\label{ptsdiscont}
+
+Il est possible de marquer des points de discontinuité, mais c'est commande est \textit{déconnectée} des commandes de tracé de courbes/splines.
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%dans l'environnement GraphiqueTikz
+\AfficherPtsDiscont[clés]{liste}
+\end{tcblisting}
+
+Le premier argument, \textit{optionnel} et entre \MontreCode{[...]}, contient les \MontreCode{Clés} suivantes :
+
+\begin{itemize}
+ \item \MontreCode{Couleur=...} (\MontreCode{black} par défaut) ;
+ \item \MontreCode{Pos=...} (\MontreCode{D} par défaut) pour choisir la position de la discontinuité (parmi \MontreCode{G/D}) ;
+ \item \MontreCode{Echelle=...} (\MontreCode{1} par défaut) pour modifier l'échelle du symbole ;
+ \item \MontreCode{Type=...} (\MontreCode{par} par défaut) pour choisir le type de symbole, parmi \MontreCode{par/cro/rond/demirond}.
+\end{itemize}
+
+Le second argument, obligatoire et entre \MontreCode{\{...\}} permet de préciser la liste des points en lesquels le symbole de discontinuité sera positionné, sous la forme \MontreCode{x1/y1/d1 § x2/y2/d2 § ...} avec les points \MontreCode{(xi;yi)} et \MontreCode{f'(xi)=di}.
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+\begin{GraphiqueTikz}[x=1cm,y=1cm,Xmin=0,Xmax=10,Ymin=0,Ymax=5]
+ \TracerAxesGrilles[Elargir=2.5mm]{auto}{auto}
+ \DefinirCourbeSpline[Trace,Couleur=red]{0/1/-1 § 4/4/0}
+ \AfficherPtsDiscont{4/4/0}
+ \AfficherPtsDiscont[Pos=G,Type=cro]{0/1/-1}
+ \DefinirCourbeSpline[Trace,Couleur=blue]{5/1/1.5 § 8/4/0.5}
+ \AfficherPtsDiscont[Couleur=blue,Type=rond]{8/4/0.5}
+ \AfficherPtsDiscont[Couleur=blue,Pos=G,Type=demirond,Echelle=2]{5/1/1.5}
+\end{GraphiqueTikz}
+\end{tcblisting}
+
\subsection{Récupérer les coordonnées de nœuds}\label{recupcoordo}
Il est également possible, dans l'optique d'une réutilisation de coordonnées, de récupérer les coordonnées d'un nœud (défini ou déterminé).
@@ -1330,6 +1400,60 @@ Le dernier argument obligatoire est le point de travail (version abscisse ou nœ
\pagebreak
+\subsection{Suites récurrentes et toiles}\label{toilerecurr}
+
+L'idée est d'obtenir une commande pour tracer la \og toile \fg{} permettant d'obtenir -- graphiquement -- les termes d'une suite récurrente définie par une relation $u_{n+1}=f(u_n)$.
+
+La commande est compatible avec une fonction précédemment définie, mais également avec une courbe type \textit{spline} précédemment définie.
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%dans l'environnement GraphiqueTikz
+\TracerToileRecurrence[clés]{fct ou courbe}
+\end{tcblisting}
+
+Le premier argument, \textit{optionnel} et entre \MontreCode{[...]}, contient les \MontreCode{Clés} suivantes :
+
+\begin{itemize}
+ \item \MontreCode{Couleur=...} (\MontreCode{black} par défaut) ;
+ \item \MontreCode{Spline=...} (\MontreCode{false} par défaut) pour spécifier qu'une courbe \textit{spline} est utilisée ;
+ \item \MontreCode{No=...} (\MontreCode{0} par défaut) est l'indice initial ;
+ \item \MontreCode{Uno=...} est qui est la valeur du terme initial (à donner obligatoirement !) ;
+ \item \MontreCode{Nom=...} (\MontreCode{u} par défaut) est le nom de la suite ;
+ \item \MontreCode{Nb=...} (\MontreCode{5} par défaut) ;
+ \item \MontreCode{AffTermes=...} (\MontreCode{false} par défaut) qui est un booléen pour afficher les termes ;
+ \item \MontreCode{AffPointilles=...} (\MontreCode{true} par défaut) pour afficher les pointillés ;
+ \item \MontreCode{TailleLabel=...} (\MontreCode{\textbackslash small} par défaut) ;
+ \item \MontreCode{PosLabel=...} (\MontreCode{below} par défaut).
+\end{itemize}
+
+Le second argument, obligatoire et entre \MontreCode{\{...\}} permet de préciser l'objet avec lequel il faut effectuer les tracés (fonction ou nom\_courbe).
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+\begin{GraphiqueTikz}%
+ [x=0.75cm,y=0.75cm,Xmin=0,Xmax=10,Xgrille=1,Xgrilles=0.5,
+ Ymin=0,Ymax=8,Ygrille=1,Ygrilles=0.5]
+ \TracerAxesGrilles[Elargir=2.5mm,Police=\small]{auto}{auto}
+ \DefinirCourbe[Couleur=red,Nom=cf,Debut=0,Fin=10,Trace]<f>{sqrt(5*x)+1}
+ \TracerCourbe[Couleur=blue]{x}
+ \TracerToileRecurrence[Couleur=orange,No=1,Uno=1]{f}
+\end{GraphiqueTikz}
+\end{tcblisting}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+\begin{GraphiqueTikz}[x=4cm,y=3cm,Xmin=0,Xmax=2.5,Xgrille=1,Xgrilles=0.25,
+ Ymin=0,Ymax=1.25,Ygrille=0.5,Ygrilles=0.25]
+ \TracerAxesGrilles[Elargir=2.5mm,Police=\small]{auto}{auto}
+ \DefinirCourbeInterpo[Nom=interpotest,Couleur=blue,Trace]%
+ {(0,0)(0.5,0.75)(1,0.25)(2,1)(2.5,0.25)}
+ \TracerCourbe[Couleur=olive]{x}
+ \TracerToileRecurrence%
+ [AffTermes,Couleur=purple,Spline,No=0,Uno=2,PosLabel=above left]%
+ {interpotest}
+\end{GraphiqueTikz}
+\end{tcblisting}
+
+\pagebreak
+
\section{Commandes spécifiques des fonctions de densité}
\subsection{Loi normale}\label{loinormale}
@@ -1413,11 +1537,244 @@ Les \MontreCode{[clés]}, optionnelles, disponibles sont :
\end{GraphiqueTikz}
\end{tcblisting}
+\subsection{Histogramme pour une loi binomiale}\label{histobinom}
+
+Il est également possible (d'une manière moins explicite que dans \MontreCode{ProfLycee}) de représenter l'histogramme d'une loi binomiale (\MontreCode{ProfLycee} permet de déterminer les unités automatiquement, ici elles doivent être précisées et connues).
+
+Il est également possible de rajouter la loi normale \og associée \fg.
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%dans l'environnement GraphiqueTikz
+\TracerHistoBinomiale[clés]<nom fct normale>{n}{p}
+\end{tcblisting}
+
+Le premier argument, optionnel et entre \MontreCode{[...]} propose les clés suivantes :
+
+\begin{itemize}
+
+ \item \MontreCode{Plage} : plage, sous la forme \MontreCode{a-b} du coloriage éventuel ;
+ \item \MontreCode{CouleurPlage} : couleur de la plage éventuelle ;
+ \item \MontreCode{ClipX} : restriction de l'axe Ox, sous la forme \MontreCode{a-b} ;
+ \item \MontreCode{AffNormale} : booléen (\MontreCode{true} par défaut) pour rajouter la loi normale ;
+ \item \MontreCode{CouleurNormale} : couleur pour la loi normale.
+\end{itemize}
+
+Les arguments obligatoires et entre \MontreCode{\{...\}} permettent de spécifier les paramètres de la loi binomiale.
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+%les unités ont été déterminées au préalable...
+\begin{GraphiqueTikz}[x=0.2cm,y=50cm,Origx=-0.5,Xmin=-0.5,Xmax=50.5,
+ Xgrille=5,Xgrilles=1,Ymin=0,Ymax=0.12,Ygrille=0.01,Ygrilles=0.001]
+ \TracerAxesGrilles[Elargir=2.5mm,Police=\small,Grille=false]%
+ {0,5,...,50}{auto}
+ \TracerHistoBinomiale{50}{0.4}
+\end{GraphiqueTikz}
+\end{tcblisting}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+%les unités ont été déterminées au préalable...
+\begin{GraphiqueTikz}[x=0.5cm,y=100cm,Origx=14.5,Xmin=14.5,Xmax=35.5,
+ Xgrille=5,Xgrilles=1,Ymin=0,Ymax=0.09,Ygrille=0.01,Ygrilles=0.001]
+ \TracerAxesGrilles[Elargir=2.5mm,Police=\small,Grille=false]%
+ {15,20,...,35}{auto}
+ \TracerHistoBinomiale%
+ [ClipX=15-35,Plage=18-25,CouleurPlage=teal,AffNormale,CouleurNormale=red]%
+ {1000}{0.02}
+\end{GraphiqueTikz}
+\end{tcblisting}
+
\pagebreak
-\section{Commandes spécifiques des statistiques à deux variables}
+\section{Commandes spécifiques des méthodes intégrales}
+
+\subsection{Méthodes géométriques}\label{methodesintergrales}
+
+L'idée est de proposer plusieurs méthodes graphiques pour illustrer graphiquement une intégrale, via :
-\subsection{Le nuage de points}\label{nuage}
+\begin{itemize}
+ \item une méthode des rectangles (Gauche, Droite ou Milieu) ;
+ \item la méthode des trapèzes.
+\end{itemize}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%dans l'environnement GraphiqueTikz
+\RepresenterMethodeIntegrale[clés]<fonction>{a}{b}
+\end{tcblisting}
+
+Les \MontreCode{Clés} disponibles sont :
+
+\begin{itemize}
+ \item \MontreCode{Spline} : booléen pour préciser qu'un spline est utilisé, \MontreCode{false} par défaut ;
+ \item \MontreCode{Couleur} : couleur des tracés, \MontreCode{red} par défaut ;
+ \item \MontreCode{NbSubDiv} : nombre de subdivisions, \MontreCode{10} par défaut ;
+ \item \MontreCode{Methode} : méthode géométrique utilisée, parmi parmi \MontreCode{RectanglesGauche / RectanglesDroite / RectanglesMilieu / Trapezes} pour spécifier la méthode utilisée, \MontreCode{RectanglesGauche} par défaut ;
+ \item \MontreCode{Remplir} : booléen, \MontreCode{true} par défaut, pour remplir les éléments graphiques ;
+ \item \MontreCode{CouleurRemplissage} : couleur de remplissage, définie par rapport à la couleur principale par défaut ;
+ \item \MontreCode{Opacite} : opacité, \MontreCode{0.25} par défaut, du remplissage.
+\end{itemize}
+
+\smallskip
+
+Le deuxième argument, optionnel et entre \MontreCode{<...>}, correspond à la fonction ou le spline \textbf{précédemment définie} !
+
+\smallskip
+
+Les deux derniers arguments, obligatoires, correspondent aux bornes de l'intégrale.
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+\begin{GraphiqueTikz}
+ [x=0.66cm,y=0.033cm,Xmin=0,Xmax=21,Xgrille=2,Xgrilles=1,
+ Ymin=0,Ymax=160,Ygrille=20,Ygrilles=10]
+ \TracerAxesGrilles[Elargir=2.5mm]{auto}{auto}
+ \DefinirCourbe[Couleur=red,Nom=cf,Debut=1,Fin=20,Trace]<f>{80*x*exp(-0.2*x)}
+ \RepresenterMethodeIntegrale[Couleur=teal]<f>{5}{15}
+\end{GraphiqueTikz}
+\end{tcblisting}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+\begin{GraphiqueTikz}
+ [x=0.66cm,y=0.033cm,Xmin=0,Xmax=21,Xgrille=2,Xgrilles=1,
+ Ymin=0,Ymax=160,Ygrille=20,Ygrilles=10]
+ \TracerAxesGrilles[Elargir=2.5mm]{auto}{auto}
+ \DefinirCourbe[Couleur=red,Nom=cf,Debut=1,Fin=20,Trace]<f>{80*x*exp(-0.2*x)}
+ \RepresenterMethodeIntegrale
+ [Methode=RectanglesDroite,Couleur=orange,NbSubDiv=7]<f>{1}{10}
+\end{GraphiqueTikz}
+\end{tcblisting}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+\begin{GraphiqueTikz}
+ [x=0.66cm,y=0.033cm,Xmin=0,Xmax=21,Xgrille=2,Xgrilles=1,
+ Ymin=0,Ymax=160,Ygrille=20,Ygrilles=10]
+ \TracerAxesGrilles[Elargir=2.5mm]{auto}{auto}
+ \DefinirCourbe[Couleur=red,Nom=cf,Debut=1,Fin=20,Trace]<f>{80*x*exp(-0.2*x)}
+ \RepresenterMethodeIntegrale
+ [Methode=RectanglesMilieu,Couleur=yellow,NbSubDiv=25]<f>{1}{20}
+\end{GraphiqueTikz}
+\end{tcblisting}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+\begin{GraphiqueTikz}
+ [x=0.66cm,y=0.033cm,Xmin=0,Xmax=21,Xgrille=2,Xgrilles=1,
+ Ymin=0,Ymax=160,Ygrille=20,Ygrilles=10]
+ \TracerAxesGrilles[Elargir=2.5mm]{auto}{auto}
+ \DefinirCourbe[Couleur=red,Nom=cf,Debut=1,Fin=20,Trace]<f>{80*x*exp(-0.2*x)}
+ \RepresenterMethodeIntegrale
+ [Methode=Trapezes,Couleur=pink,Remplir=false]<f>{1}{20}
+\end{GraphiqueTikz}
+\end{tcblisting}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+\begin{GraphiqueTikz}%
+ [x=0.8cm,y=1cm,Xmin=-7,Xmax=4,Ymin=0,Ymax=5]
+ \TracerAxesGrilles[Elargir=2.5mm]{auto}{auto}
+ \DefinirListeSpline{-6.5/0/2.5§-2/4/0§3.75/0/-1}[\lstsplineB]
+ \DefinirCourbeSpline[Nom=splinered]{\lstsplineB}
+ \TracerCourbeSpline[Couleur=red]{\lstsplineB}
+ \RepresenterMethodeIntegrale[Methode=RectanglesMilieu,Spline,Couleur=teal]<splinered>{-5}{1.25}
+\end{GraphiqueTikz}
+\end{tcblisting}
+
+\subsection{Méthode de Monte-Carlo}\label{montecarlo}
+
+L'idée est de proposer une commande pour simuler un calcul intégral via la méthode de Monte-Carlo.
+
+Le code se charge de simuler les \textit{tirages}, et les résultats peuvent être stockés dans des macros.
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%dans l'environnement GraphiqueTikz
+\SimulerMonteCarlo[clés]<fonction>{nb essais}[\nbptsmcok][\nbptsmcko]
+\end{tcblisting}
+
+Les \MontreCode{Clés} disponibles sont :
+
+\begin{itemize}
+ \item \MontreCode{Couleurs} : couleurs des points, \MontreCode{blue/red} par défaut ;
+ \item \MontreCode{BornesX} : bornes \textit{horizontales} pour la simulation, valant \MontreCode{\textbackslash pflxmin,\textbackslash pflxmax} par défaut ;
+ \item \MontreCode{BornesY} : bornes \textit{verticales} pour la simulation, valant \MontreCode{\textbackslash pflymin,\textbackslash pflymax} par défaut.
+\end{itemize}
+
+Le deuxième argument, optionnel et entre \MontreCode{<...>}, est la fonction \textbf{précédemment définie} à utiliser.
+
+\smallskip
+
+Les deux derniers arguments, optionnels et entre \MontreCode{[...]}, sont les macros dans lesquelles sont stockées les résultats de la simulation. Ces macros sont \MontreCode{\textbackslash nbptsmcok} et \MontreCode{\textbackslash nbptsmcko} par défaut.
+
+À noter que la macro \MontreCode{\textbackslash nbptsmc} permet de récupérer le nombre de points utilisés.
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+%avec \sisetup{group-minimum-digits=4} pour le formatage des "milliers"
+
+\begin{GraphiqueTikz}%
+ [x=10cm,y=10cm,Xmin=0,Xmax=1,Xgrille=0.1,Xgrilles=0.05,
+ Ymin=0,Ymax=1,Ygrille=0.1,Ygrilles=0.05]
+ \TracerAxesGrilles[Elargir=2.5mm,Dernier]{auto}{auto}
+ \DefinirCourbe[Trace,Couleur=teal,Pas=0.001]<f>{sqrt(1-x^2)}
+ \SimulerMonteCarlo<f>{5000}
+\end{GraphiqueTikz}
+
+Le nombre de points bleus est de \textcolor{blue}{\num{\nbptsmcok}},
+le nombre de points rouges est de \textcolor{red}{\num{\nbptsmcko}}.
+
+La proportion de points bleus est de $\frac{\num{\nbptsmcok}}{\num{\nbptsmc}}
+\approx \ArrondirNum[4]{\nbptsmcok/\nbptsmc}$
+et $\frac{\pi}{4} \approx \ArrondirNum[4]{pi/4}$.
+\end{tcblisting}
+
+\pagebreak
+
+\section{Commandes spécifiques des statistiques}
+
+\subsection{Limitations}
+
+Compte-tenu des spécificités de \TikZ, il est conseillé de ne pas utiliser de valeurs trop \textit{grandes} au niveau de axes (cela peut coincer avec des année par exemple\ldots), ou bien il faudra \textit{transformer} les valeurs des axes et/ou des données pour que tout s'affiche comme il faut (attention également aux régressions, aux calculs\ldots).
+
+\subsection{Courbe des ECC/FCC (1 variable)}\label{cbeECC}
+
+Il est possible de travailler sur une représentation de la courbe des ECC/FCC.
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+\TracerCourbeECC[clés]{liste valeurs}{liste effectifs}
+\end{tcblisting}
+
+Le code se charge de déterminer une valeur des paramètres, pour utilisation ultérieure (avec arrondis éventuels car ils sont obtenus par \textit{conversions}) :
+
+\begin{itemize}
+ \item le premier quartile, $Q_1$, est stocké dans la macro \MontreCode{\textbackslash ValPremQuartile} ;
+ \item la médiane, méd, est stocké dans la macro \MontreCode{\textbackslash ValMed} ;
+ \item le troisième quartile, $Q_3$, est stocké dans la macro \MontreCode{\textbackslash ValTroisQuartile}.
+\end{itemize}
+
+Les \MontreCode{Clés} disponibles sont :
+
+\begin{itemize}
+ \item \MontreCode{Couleur=...} : couleur du tracé, \MontreCode{black} par défaut ;
+ \item \MontreCode{AffParams} : booléen, \MontreCode{true} par défaut, pour afficher les paramètres ;
+ \item \MontreCode{CouleursParams=...} : couleur des paramètres, \MontreCode{black} par défaut ;
+ \item \MontreCode{TraitsComplets} : booléen, \MontreCode{true} par défaut, pour afficher les pointillés en entier
+\end{itemize}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+\begin{GraphiqueTikz}[x=0.15cm,y=0.03cm,Xmin=0,Xmax=75,Xgrille=10,Xgrilles=5,
+ Ymin=0,Ymax=200,Ygrille=20,Ygrilles=10]
+ \TracerAxesGrilles[Elargir=2.5mm,Police=\small]{auto}{auto}
+ \TracerCourbeECC%
+ [Couleur=blue,CouleursParams={lime!75!black/pink!75!black},
+ TraitsComplets=false]%
+ {0,15,25,35,40,45,55,65,75}%
+ {15,20,50,30,35,25,15,10}
+ %ajouts 'manuels'
+ \PlacerTexte[Couleur=lime!75!black,Police=\small,Position=below]%
+ {(\ValPremQuartile,0)}{\ArrondirNum[0]{\ValPremQuartile}}
+ \PlacerTexte[Couleur=lime!75!black,Police=\small,Position=below]%
+ {(\ValTroisQuartile,0)}{\ArrondirNum[0]{\ValTroisQuartile}}
+ \PlacerTexte[Couleur=pink!75!black,Police=\small,Position=below]%
+ {(\ValMed,0)}{\ArrondirNum[0]{\ValMed}}
+\end{GraphiqueTikz}
+
+\end{tcblisting}
+
+\subsection{Le nuage de points (2 variables)}\label{nuage}
En marge des commandes liées aux fonctions, il est également possible de représenter des séries statistiques doubles.
@@ -1460,7 +1817,7 @@ Les arguments, obligatoires, permettent de spécifier :
\end{GraphiqueTikz}
\end{tcblisting}
-\subsection{La droite de régression}\label{reglin}
+\subsection{La droite de régression (2 variables)}\label{reglin}
La droite de régression linéaire (obtenue par la méthode des moindres carrés) peut facilement être rajoutée, en utilisant la clé \MontreCode{TracerDroite}.
@@ -1494,7 +1851,7 @@ Dans ce cas, de nouvelles clés sont disponibles :
\end{GraphiqueTikz}
\end{tcblisting}
-\subsection{Autres régressions}\label{regressions}
+\subsection{Autres régressions (2 variables)}\label{regressions}
En partenariat avec le package \MontreCode{xint-regression}, chargé par le package (mais \textit{désactivable} via l'option \MontreCode{[nonxintreg]}), il est possible de travailler sur d'autres types de régression :
@@ -1752,10 +2109,10 @@ $\begin{cases}
Les commandes disponibles sont :
\NewDocumentCommand\lstcmd{ m m m }{%
- \item[\texttt{#1}] : \mintinline{latex}|#2|\hfill{}page \pageref{#3}
+ \item[\footnotesize\texttt{#1}]{\footnotesize : \mintinline{latex}|#2|\hfill{}page \pageref{#3}}
}
-\begin{description}
+\begin{description}[noitemsep]
\lstcmd{environnement~~}{\begin{GraphiqueTikz}...\end{GraphiqueTikz}}{creaenvt}
\lstcmd{axes et grilles}{\TracerAxesGrille}{creaaxesgr}
\lstcmd{aj val axes X~~}{\RajouterValeursAxeX}{ajoutvals}
@@ -1767,10 +2124,12 @@ Les commandes disponibles sont :
\lstcmd{def spline~~~~~}{\DefinirCourbeSpline}{deftracfctspline}
\lstcmd{tracé spline~~~}{\TracerCourbeSpline}{deftracfctspline}
\lstcmd{tracé droite~~~}{\TracerDroite}{tracdroite}
+ \lstcmd{asymptote vert~}{\TracerAsymptote}{tracdroite}
\lstcmd{def points~~~~~}{\DefinirPts}{defpts}
\lstcmd{def image~~~~~~}{\DefinirImage}{defpts}
\lstcmd{marq pts~~~~~~~}{\MarquerPts}{markpts}
\lstcmd{placer txt~~~~~}{\PlacerTexte}{placetxt}
+ \lstcmd{pts discont~~~~}{\AfficherPtsDiscont}{ptsdiscont}
\lstcmd{récup absc~~~~~}{\RecupererAbscisse}{recupcoordo}
\lstcmd{récup ordo~~~~~}{\RecupererOrdonnee}{recupcoordo}
\lstcmd{récup coordos~~}{\RecupererCoordonnees}{recupcoordo}
@@ -1781,23 +2140,151 @@ Les commandes disponibles sont :
\lstcmd{maximum~~~~~~~~}{\TrouverMaximum}{maximum}
\lstcmd{minimum~~~~~~~~}{\TrouverMinimum}{minimum}
\lstcmd{intégrale~~~~~~}{\TracerIntegrale}{integr}
+ \lstcmd{méthodes int~~~}{\RepresenterMethodeIntegrale}{methodesintergrales}
+ \lstcmd{Monte-Carlo~~~~}{\SimulerMonteCarlo}{montecarlo}
\lstcmd{tangente~~~~~~~}{\TracerTangente}{tgte}
+ \lstcmd{toile récurr~~~}{\TracerToileRecurrence}{toilerecurr}
\lstcmd{loi normale~~~~}{\DefinirLoiNormale}{loinormale}
\lstcmd{loi normale~~~~}{\TracerLoiNormale}{loinormale}
\lstcmd{loi khideux~~~~}{\DefinirLoiKhiDeux}{loikhideux}
\lstcmd{loi khideux~~~~}{\TracerLoiKhiDeux}{loikhideux}
+ \lstcmd{loi binom~~~~~~}{\TracerHistoBinomiale}{histobinom}
+ \lstcmd{courbe ECC~~~~~}{\TracerCourbeECC}{cbeECC}
\lstcmd{stats 2 var~~~~}{\TracerNuage}{nuage}
\lstcmd{regressions~~~~}{\TracerAjustement}{regressions}
\lstcmd{arrondi~~~~~~~~}{\ArrondirNum}{numarrond}
\lstcmd{nb aléat~~~~~~~}{\ChoisirNbAlea}{nbalea}
\end{description}
+\newpage
+
+\section{Quelques commandes liées à pgfplots}
+
+\subsection{Introduction}
+
+Pour des graphiques avec des fenêtres d'affichage \textit{particulières}, il est fort possible que les commandes \textit{classiques} de \MontreCode{tkz-grapheur} coincent, avec notamment des \MontreCode{dimension tool large}$\ldots$
+
+\smallskip
+
+Dans ce cas, il est possible d'utiliser plutôt l'environnement \MontreCode{axis} de \MontreCode{pgfplots} qui est plus palier ce problème \textit{interne}$\ldots$
+
+\MontreCode{tkz-grapheur} ne fournit pas d'environnement dédié pour la création de la fenêtre, mais quelques commandes spécifiques ont été intégrées pour certains points, avec un fonctionnement assez semblable (donc se référer aux paragraphes précédents) à celui des commandes \textit{classiques}.
+
+\subsection{Macros spécifique pgfplots/axis}
+
+\begin{tcblisting}{listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5,listing only}
+%déterminer l'intersection de deux objets préalablement définis via [name path]
+\findintersectionspgf[base nom nœuds]{objet1}{objet2}[macro nb total]
+
+%extraction (globale, non limitée à l'environnement) et stockage de coordonnées
+\gextractxnodepgf{nœud}[\myxcoord]
+\gextractynodepgf{nœud}[\myycoord]
+\gextractxynodepgf{nœud}[\myxcoord][\myycoord]
+
+%domaine entre courbes
+\fillbetweencurvespgf[options tikz]{courbe1}{courbe2}<options soft domain>
+
+%splines cubiques
+\addplotspline(*)[options tikz]<coeffs>{liste des points support}[\monspline]
+\end{tcblisting}
+
+\subsection{Exemple illustré}
+
+\begin{tcblisting}{listing only,listing engine=minted,minted language=latex,colframe=lightgray,colback=lightgray!5}
+%\usepackage{alphalph}
+
+\begin{tikzpicture}
+ \begin{axis}%
+ [%
+ axis y line=center,axis x line=middle, %axes
+ axis line style={line width=0.8pt,-latex},
+ x=0.33cm,y=0.55cm,xmin=1985,xmax=2030,ymin=56,ymax=70, %unités
+ grid=both,xtick distance=5,ytick distance=2, %grillep
+ minor x tick num=4,minor y tick num=1, %grilles
+ extra x ticks={1985},extra x tick style={grid=none}, %origx
+ extra y ticks={56},extra y tick style={grid=none}, %origy
+ x tick label style={/pgf/number format/.cd,use comma,1000 sep={}}, %année
+ major tick length={2*3pt},minor tick length={1.5*3pt}, %grads
+ every tick/.style={line width=0.8pt},enlargelimits=false, %style
+ enlarge x limits={abs=2.5mm,upper},enlarge y limits={abs=2.5mm,upper}, %élargir
+ ]
+ %spline + y=66
+ \addplot[name path global=eqtest,mark=none,red,line width=1.05pt,domain=1985:2030] {66} ;
+ \def\LISTETEST{1985/60/0§1995/68/0§2015/58/0§2025/69/0§2030/62/-2}
+ \addplotspline*[line width=1.05pt,violet,name path global=splinecubtest]{\LISTETEST}[\monsplineviolet]
+ %recherche d'antécédents
+ \findintersectionspgf[MonItsc]{eqtest}{splinecubtest}
+ %extraction des coordonnées
+ \gextractxnodepgf{(MonItsc-1)}[\xMonItscA]
+ \gextractxnodepgf{(MonItsc-2)}[\xMonItscB]
+ \gextractxnodepgf{(MonItsc-3)}[\xMonItscC]
+ \gextractxnodepgf{(MonItsc-4)}[\xMonItscD]
+ %visualisation
+ \xintFor* #1 in {\xintSeq{1}{4}}\do{%
+ \draw[line width=0.9pt,densely dashed,olive,->,>=latex] (MonItsc-#1) -- (\csname xMonItsc\AlphAlph{#1}\endcsname,56) ;
+ \filldraw[olive] (MonItsc-#1) circle[radius=1.75pt] ;
+ }
+ %intégrale
+ \path [name path=xaxis] (1985,56) -- (2030,56);
+ \fillbetweencurvespgf{splinecubtest}{xaxis}<domain={\xMonItscB:\xMonItscA}>
+ \fillbetweencurvespgf{splinecubtest}{xaxis}<domain={\xMonItscD:\xMonItscC}>
+ \end{axis}
+\end{tikzpicture}
+
+Les solutions de $f(x)=66$ sont d'environ \ArrondirNum*[0]{\xMonItscA} \&\ \ArrondirNum*[0]{\xMonItscB} \&\ \ArrondirNum*[0]{\xMonItscC} \&\ \ArrondirNum*[0]{\xMonItscD}.
+\end{tcblisting}
+
+\begin{tikzpicture}
+ \begin{axis}%
+ [%
+ axis y line=center,axis x line=middle, %axes
+ axis line style={line width=0.8pt,-latex},
+ x=0.33cm,y=0.55cm,xmin=1985,xmax=2030,ymin=56,ymax=70, %unités
+ grid=both,xtick distance=5,ytick distance=2, %grillep
+ minor x tick num=4,minor y tick num=1, %grilles
+ extra x ticks={1985},extra x tick style={grid=none}, %originex
+ extra y ticks={56},extra y tick style={grid=none}, %originey
+ x tick label style={/pgf/number format/.cd,use comma,1000 sep={}}, %année
+ major tick length={2*3pt},minor tick length={1.5*3pt}, %grads
+ every tick/.style={line width=0.8pt},enlargelimits=false, %style
+ enlarge x limits={abs=2.5mm,upper},enlarge y limits={abs=2.5mm,upper}, %élargir
+ ]
+ %spline + y=66
+ \addplot[name path global=eqtest,mark=none,red,line width=1.05pt,domain=1985:2030] {66} ;
+ \def\LISTETEST{1985/60/0§1995/68/0§2015/58/0§2025/69/0§2030/62/-2}
+ \addplotspline*[line width=1.05pt,violet,name path global=splinecubtest]{\LISTETEST}[\monsplineviolet]
+ %recherche d'antécédents
+ \findintersectionspgf[MonItsc]{eqtest}{splinecubtest}
+ %extraction des coordonnées
+ \gextractxnodepgf{(MonItsc-1)}[\xMonItscA]
+ \gextractxnodepgf{(MonItsc-2)}[\xMonItscB]
+ \gextractxnodepgf{(MonItsc-3)}[\xMonItscC]
+ \gextractxnodepgf{(MonItsc-4)}[\xMonItscD]
+ %visualisation
+ \xintFor* #1 in {\xintSeq{1}{4}}\do{%
+ \draw[line width=0.9pt,densely dashed,olive,->,>=latex] (MonItsc-#1) -- (\csname xMonItsc\AlphAlph{#1}\endcsname,56) ;
+ \filldraw[olive] (MonItsc-#1) circle[radius=1.75pt] ;
+ }
+ %intégrale
+ \path [name path=xaxis] (1985,56) -- (2030,56);
+ \fillbetweencurvespgf{splinecubtest}{xaxis}<domain={\xMonItscB:\xMonItscA}>
+ \fillbetweencurvespgf{splinecubtest}{xaxis}<domain={\xMonItscD:\xMonItscC}>
+ \end{axis}
+\end{tikzpicture}
+
+Les solutions de $f(x)=66$ sont d'environ \ArrondirNum*[0]{\xMonItscA} \&\ \ArrondirNum*[0]{\xMonItscB} \&\ \ArrondirNum*[0]{\xMonItscC} \&\ \ArrondirNum*[0]{\xMonItscD}.
+
\pagebreak
\section{Historique}
-\begin{quote}
+{\footnotesize \begin{quote}
\begin{verbatim}
+0.2.0 : Méthode alternative des splines cubiques + commandes auxiliaires pgfplots
+0.1.9 : Correction d'un bug avec la détermination d'unités
+0.1.8 : Courbes ECC/FCC + Toile récurrence + Points discontinuité + HistoBinom
+0.1.7 : Méthodes intégrales avec des splines
+0.1.6 : Asymptote verticale + Méthodes intégrales (géom + Monte Carlo)
0.1.5 : Correction d'un bug sur les rajouts de valeurs + NÅ“ud pour une image + [en] version !
0.1.4 : Placement de texte
0.1.3 : Ajout de régressions avec le package xint-regression
@@ -1805,6 +2292,6 @@ Les commandes disponibles sont :
0.1.1 : Densité loi normale et khi deux + Marquage points + Améliorations
0.1.0 : Version initiale
\end{verbatim}
-\end{quote}
+\end{quote}}
\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tkz-grapheur/tex/tkz-grapheur.sty b/graphics/pgf/contrib/tkz-grapheur/tex/tkz-grapheur.sty
index 3de4286c8e..be1337a970 100644
--- a/graphics/pgf/contrib/tkz-grapheur/tex/tkz-grapheur.sty
+++ b/graphics/pgf/contrib/tkz-grapheur/tex/tkz-grapheur.sty
@@ -2,9 +2,14 @@
% licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{tkz-grapheur}[2024/06/22 0.1.5.Des outils en TikZ pour travailler comme avec un grapheur]
+\ProvidesPackage{tkz-grapheur}[2024/10/29 0.2.0 Des outils en TikZ pour travailler comme avec un grapheur]
%====HISTORIQUE
+% v 0.2.0 Petites commandes en lien avec pgfplots + modification mineure splinecubique (calculs Alt)
+% v 0.1.9 Correction d'un bug avec la détermination des unités...
+% v 0.1.8 Ajout des courbes d'ECC/FCC + Toile récurrence + Points discontinuité + Histobinom
+% v 0.1.7 Méthodes intégrales avec des splines
+% v 0.1.6 Asymptote verticale + Monte Carlo + Méthode intégrales (rectangles, etc)
% v 0.1.5 Correction d'un bug avec les valeurs manuelles + NÅ“ud pour une image + [en] version !
% v 0.1.4 Ajout des placements de textes
% v 0.1.3 Régressions, avec xintreg (désactivable)
@@ -25,6 +30,10 @@
\DeclareOption{nonxintreg}{\@loadxintregfalse}%
\DeclareOption{noxintreg}{\@loadxintregfalse}%
+\newif\if@loadpgfplots \@loadpgfplotstrue
+\DeclareOption{nonpgfplots}{\@loadpgfplotsfalse}%
+\DeclareOption{nopgfplots}{\@loadpgfplotsfalse}%
+
\newif\if@lngenglish \@lngenglishfalse
\DeclareOption{english}{\@lngenglishtrue}%
@@ -34,6 +43,10 @@
%====BASE
\RequirePackage{tikz}
\RequirePackage{ifthen}
+\if@loadpgfplots
+ \RequirePackage{pgfplots}
+ \usepgfplotslibrary{fillbetween}
+\fi
\usetikzlibrary{calc,intersections,patterns,patterns.meta,bbox}
\RequirePackage{simplekv}
\RequirePackage{xintexpr}
@@ -49,7 +62,7 @@
\if@lngenglish
\sisetup{mode=match,propagate-math-font=true,reset-math-version=false,reset-text-family=false,reset-text-series=false,reset-text-shape=false,text-family-to-math=true,text-series-to-math=true}
\else
- \sisetup{locale=FR,output-decimal-marker={,},mode=match,propagate-math-font=true,reset-math-version=false,reset-text-family=false,reset-text-series=false,reset-text-shape=false,text-family-to-math=true,text-series-to-math=true}
+ \sisetup{locale=FR,output-decimal-marker={,},mode=match,propagate-math-font=true,reset-math-version=false,reset-text-family=false,reset-text-series=false,reset-text-shape=false,text-family-to-math=true,text-series-to-math=true}%,group-minimum-digits=4}
\fi
\fi
@@ -97,19 +110,37 @@
%====PATCH NUM
\@ifundefined{ArrondirNum}%
{%
- \NewDocumentCommand\ArrondirNum{ O{2} m}{\num{\xintfloateval{round(#2,#1)}}\relax}%
+ \NewDocumentCommand\ArrondirNum{ s O{2} m}{%
+ \IfBooleanTF{#1}%
+ {%
+ \xintfloateval{round(#3,#2)}\relax%
+ }%
+ {%
+ \num{\xintfloateval{round(#3,#2)}}\relax%
+ }%
+ }%
}%
{%
- \RenewDocumentCommand\ArrondirNum{ O{2} m}{\num{\xintfloateval{round(#2,#1)}}\relax}%
+ \RenewDocumentCommand\ArrondirNum{ s O{2} m}{%
+ \IfBooleanTF{#1}%
+ {%
+ \xintfloateval{round(#3,#2)}\relax%
+ }%
+ {%
+ \num{\xintfloateval{round(#3,#2)}}\relax%
+ }%
+ }%
}%
%====STYLES DE BASE
\tikzset{pflnoeud/.style={}}
\tikzset{pflpoint/.style={line width=0.95pt}}
+\tikzset{pflpointmc/.style={radius=0.875pt}}
\tikzset{pflpointc/.style={radius=1.75pt}}
\tikzset{pflpointnuage/.style={radius=1.75pt}}
\tikzset{pflcadre/.style={line width=0.8pt,gray}}
\tikzset{pflcourbe/.style={line width=1.05pt}}
+\tikzset{pflcourbediscont/.style={line width=1.1pt}}
\tikzset{pfltrait/.style={line width=0.8pt}}
\tikzset{pflflecheg/.style={<-,>=latex}}
\tikzset{pflfleched/.style={->,>=latex}}
@@ -316,9 +347,9 @@
}
\newcommand\TikZUnites{
- \coordinate (@0) at (0,0) ;
- \coordinate (@X) at (1,0) ;
- \coordinate (@Y) at (0,1) ;
+ \coordinate (@0) at (\pflOx,\pflOy) ;
+ \coordinate (@X) at ({\pflOx+1},\pflOy) ;
+ \coordinate (@Y) at ({\pflOx},{\pflOy+1}) ;
\DistanceEntreNoeuds[\pflxunit]{@0}{@X}
\DistanceEntreNoeuds[\pflyunit]{@0}{@Y}
}
@@ -863,17 +894,18 @@
Nom=spline,%
Couleur=black,%
Coeffs=3,%
- Trace=false
+ Trace=false,%
+ Alt=false
}
-\NewDocumentCommand\GenererSpline{ m m O{\monspline} }{%
+\NewDocumentCommand\GenererSpline{ s m m O{\monspline} }{%
%1=liste
\setsepchar[.]{§./}%
- \readlist*\SPLlistepoints{#1}%
+ \readlist*\SPLlistepoints{#2}%
%les données
\def\tmpsplinenumdeb{1}
\def\tmpsplinenumfin{\SPLlistepointslen}%
- \pflextractcoeff{#2}{\tmpsplinenumdeb}%
+ \pflextractcoeff{#3}{\tmpsplinenumdeb}%
%nb de calculs
\def\SPLnbsplines{\inteval{\tmpsplinenumfin-1}}%
%extraction des coordonnées
@@ -883,10 +915,16 @@
\itemtomacro\SPLlistepoints[\tmpsplinenumdeb,1]\xb%
\itemtomacro\SPLlistepoints[\tmpsplinenumdeb,2]\yb%
\itemtomacro\SPLlistepoints[\tmpsplinenumdeb,3]\fprimeb%
- \xdef#3{(\xa,\ya) ..controls +({atan \fprimea}:{(\xb-\xa)/\COEFFA}) and +({-180 + atan \fprimeb}:{(\xb-\xa)/\COEFFA}).. (\xb,\yb)}%
+ \IfBooleanTF{#1}%
+ {%
+ \xdef#4{(\xa,\ya) ..controls +({(\xb-\xa)/\COEFFA},{\fprimea*(\xb-\xa)/\COEFFA}) and +({-(\xb-\xa)/\COEFFA},{-\fprimeb*(\xb-\xa)/\COEFFA}).. (\xb,\yb)}%
+ }%
+ {%
+ \xdef#4{(\xa,\ya) ..controls +({atan \fprimea}:{(\xb-\xa)/\COEFFA}) and +({-180 + atan \fprimeb}:{(\xb-\xa)/\COEFFA}).. (\xb,\yb)}%
+ }%
\foreach \i in {\tmpsplinenumdeb,...,\SPLnbsplines}{%
%extraction des coeffs de compensation
- \pflextractcoeff{#2}{\i}%
+ \pflextractcoeff{#3}{\i}%
\def\j{\inteval{\i+1}}%
\itemtomacro\SPLlistepoints[\i,1]\xa%
\itemtomacro\SPLlistepoints[\i,2]\ya%
@@ -894,7 +932,13 @@
\itemtomacro\SPLlistepoints[\j,1]\xb%
\itemtomacro\SPLlistepoints[\j,2]\yb%
\itemtomacro\SPLlistepoints[\j,3]\fprimeb%
- \xdef#3{#3 ..controls +({atan \fprimea}:{(\xb-\xa)/\COEFFA}) and +({-180 + atan \fprimeb}:{(\xb-\xa)/\COEFFB}).. (\xb,\yb)}%
+ \IfBooleanTF{#1}%
+ {%
+ \xdef#4{#4 ..controls +({(\xb-\xa)/\COEFFA},{\fprimea*(\xb-\xa)/\COEFFA}) and +({-(\xb-\xa)/\COEFFA},{-\fprimeb*(\xb-\xa)/\COEFFA}).. (\xb,\yb)}%
+ }%
+ {%
+ \xdef#4{#4 ..controls +({atan \fprimea}:{(\xb-\xa)/\COEFFA}) and +({-180 + atan \fprimeb}:{(\xb-\xa)/\COEFFB}).. (\xb,\yb)}%
+ }%
}%
}
@@ -902,7 +946,13 @@
%1=liste
\restoreKV[GraphiqueTikzSpline]%
\setKV[GraphiqueTikzSpline]{#1}%
- \GenererSpline{#2}{\pflsplinecoeffs}[#3]%
+ \ifboolKV[GraphiqueTikzSpline]{Alt}%
+ {%
+ \GenererSpline*{#2}{\pflsplinecoeffs}[#3]%
+ }%
+ {%
+ \GenererSpline{#2}{\pflsplinecoeffs}[#3]%
+ }%
\begin{scope}
\ifboolKV[GraphiqueTikzSpline]{Trace}%
{%
@@ -934,7 +984,13 @@
%1=liste
\restoreKV[GraphiqueTikzSpline]%
\setKV[GraphiqueTikzSpline]{#1}%
- \GenererSpline{#2}{\pflsplinecoeffs}[#3]%
+ \ifboolKV[GraphiqueTikzSpline]{Alt}%
+ {%
+ \GenererSpline*{#2}{\pflsplinecoeffs}[#3]%
+ }%
+ {%
+ \GenererSpline{#2}{\pflsplinecoeffs}[#3]%
+ }%
\begin{scope}
\draw[pflcourbe,{\useKV[GraphiqueTikzSpline]{Couleur}}] #3 ;
\end{scope}
@@ -1012,6 +1068,146 @@
\end{scope}
}
+%====MONTE CARLO
+\defKV[graphiquetikzmontecarlo]{%
+ Couleurs=\def\graphtikzmccols{#1},%
+ BornesX=\def\graphtikzmcxbornes{#1},%
+ BornesY=\def\graphtikzmcybornes{#1}
+}
+
+\setKVdefault[graphiquetikzmontecarlo]{%
+ Couleurs={blue/red},%
+ BornesX={\pflxmin,\pflxmax},%
+ BornesY={\pflymin,\pflymax}
+}
+
+\NewDocumentCommand\SimulerMonteCarlo{ O{} D<>{f} m O{\nbptsmcok} O{\nbptsmcko} }{%
+ \restoreKV[graphiquetikzmontecarlo]%
+ \setKV[graphiquetikzmontecarlo]{#1}%
+ \StrCut{\graphtikzmccols}{/}{\tmpMCcolOK}{\tmpMCcolKO}%
+ \StrCut{\graphtikzmcxbornes}{,}{\tmpMCxmin}{\tmpMCxmax}%
+ \StrCut{\graphtikzmcybornes}{,}{\tmpMCymin}{\tmpMCymax}%
+ \xdef#4{0}%
+ \xdef#5{0}%
+ \xdef\nbptsmc{#3}%
+ \foreach \i in {1,...,#3}{%
+ \xdef\tmpMCrandX{\xintfloateval{random()*((\tmpMCxmax)-(\tmpMCxmin))+(\tmpMCxmin)}}%
+ \xdef\tmpMCrandY{\xintfloateval{random()*((\tmpMCymax)-(\tmpMCymin))+(\tmpMCymin)}}%
+ \xdef\tmpMCrandfX{\xintfloateval{#2(\tmpMCrandX)}}%
+ \xintifboolexpr{ \tmpMCrandfX > \tmpMCrandY }%
+ {%
+ \xdef#4{\xinteval{#4+1}}%
+ \filldraw[\tmpMCcolOK] (\tmpMCrandX,\tmpMCrandY) circle[pflpointmc] ;
+ }%
+ {%
+ \xdef#5{\xinteval{#5+1}}%
+ \filldraw[\tmpMCcolKO] (\tmpMCrandX,\tmpMCrandY) circle[pflpointmc] ;
+ }%
+ }%
+}
+
+%====MÉTHODES INTÉGRALES
+
+\defKV[graphiquetikzintegr]{%
+ Couleur=\def\graphtikzintgrcol{#1},%
+ CouleurRemplissage=\def\graphtikzintgrcolrempl{#1},%
+ NbSubDiv=\def\graphtikzintgrnb{#1},%
+ Methode=\def\graphtikzintgrtype{#1},%
+ Opacite=\def\graphtikzintgropac{#1}
+}
+
+\setKVdefault[graphiquetikzintegr]{%
+ Couleur=red,%
+ NbSubDiv=10,%
+ Methode=RectanglesGauche,%
+ Remplir=true,%
+ CouleurRemplissage={\graphtikzintgrcol!25},%
+ Opacite=0.25,%
+ Spline=false
+}
+
+\NewDocumentCommand\RepresenterMethodeIntegrale{ O{} D<>{f} m m }{%opts+nom_fct/spline+a+b
+ \useKVdefault[graphiquetikzintegr]%
+ \setKV[graphiquetikzintegr]{#1}%
+ \ifboolKV[graphiquetikzintegr]{Remplir}%
+ {%
+ \tikzset{pflfigureintegr/.style={pfltrait,\graphtikzintgrcol,fill=\graphtikzintgrcolrempl,fill opacity=\graphtikzintgropac}}%
+ }%
+ {%
+ \tikzset{pflfigureintegr/.style={pfltrait,\graphtikzintgrcol}}%
+ }%
+ \tikzset{figureintegr/.style={pfltrait,\graphtikzintgrcol,fill=\graphtikzintgrcolrempl,fill opacity=\graphtikzintgropac}}%
+ \def\TmpH{(#4-#3)/\graphtikzintgrnb}
+ \ifboolKV[graphiquetikzintegr]{Spline}%
+ {%
+ \IfEq{\graphtikzintgrtype}{RectanglesGauche}%
+ {%
+ \foreach \i in {0,...,\inteval{\graphtikzintgrnb-1}}{%
+ \path[draw=none,pflcourbe,name path=tmpintmethod] ({#3+\i*\TmpH},{\pflymin})--({#3+\i*\TmpH},{\pflymax}) ;
+ \path[name intersections={of=#2 and tmpintmethod,name=KLM}] ;
+ \draw[pflfigureintegr] let \p1 = (KLM-1) in ({#3+\i*\TmpH},{0}) rectangle++ ({\TmpH},{\y1}) ;
+ }%
+ }%
+ {}%
+ \IfEq{\graphtikzintgrtype}{RectanglesDroite}%
+ {%
+ \foreach \i in {0,...,\inteval{\graphtikzintgrnb-1}}{%
+ \path[draw=none,pflcourbe,name path=tmpintmethod] ({#3+(\i+1)*\TmpH},{\pflymin})--({#3+(\i+1)*\TmpH},{\pflymax}) ;
+ \path[name intersections={of=#2 and tmpintmethod,name=KLM}] ;
+ \draw[pflfigureintegr] let \p1 = (KLM-1) in ({#3+\i*\TmpH},{0}) rectangle++ ({\TmpH},{\y1}) ;
+ }%
+ }%
+ {}%
+ \IfEq{\graphtikzintgrtype}{RectanglesMilieu}%
+ {%
+ \foreach \i in {0,...,\inteval{\graphtikzintgrnb-1}}{%
+ \path[draw=none,pflcourbe,name path=tmpintmethod] ({#3+(\i+0.5)*\TmpH},{\pflymin})--({#3+(\i+0.5)*\TmpH},{\pflymax}) ;
+ \path[name intersections={of=#2 and tmpintmethod,name=KLM}] ;
+ \draw[pflfigureintegr] let \p1 = (KLM-1) in ({#3+\i*\TmpH},{0}) rectangle++ ({\TmpH},{\y1}) ;
+ }%
+ }%
+ {}%
+ \IfEq{\graphtikzintgrtype}{Trapezes}%
+ {%
+ \foreach \i in {0,...,\inteval{\graphtikzintgrnb-1}}{%
+ \path[draw=none,pflcourbe,name path=tmpintmethodg] ({#3+(\i)*\TmpH},{\pflymin})--({#3+(\i)*\TmpH},{\pflymax}) ;
+ \path[name intersections={of=#2 and tmpintmethodg,name=KLMg}] ;
+ \path[draw=none,pflcourbe,name path=tmpintmethodd] ({#3+(\i+1)*\TmpH},{\pflymin})--({#3+(\i+1)*\TmpH},{\pflymax}) ;
+ \path[name intersections={of=#2 and tmpintmethodd,name=KLMd}] ;
+ \draw[pflfigureintegr] ({#3+\i*\TmpH},{0}) -- (KLMg-1) -- (KLMd-1) -- ({#3+(\i+1)*\TmpH},{0}) -- cycle ;
+ }%
+ }%
+ {}%
+ }%
+ {%
+ \IfEq{\graphtikzintgrtype}{RectanglesGauche}%
+ {%
+ \foreach \i in {0,...,\inteval{\graphtikzintgrnb-1}}%
+ \draw[pflfigureintegr] ({#3+\i*\TmpH},{0}) rectangle++ ({\TmpH},{\xintfloateval{#2(#3+\i*\TmpH)}}) ;
+ }%
+ {}%
+ \IfEq{\graphtikzintgrtype}{RectanglesDroite}%
+ {%
+ \foreach \i in {0,...,\inteval{\graphtikzintgrnb-1}}%
+ \draw[pflfigureintegr] ({#3+\i*\TmpH},{0}) rectangle++ ({\TmpH},{\xintfloateval{#2(#3+(\i+1)*\TmpH)}}) ;
+ }%
+ {}%
+ \IfEq{\graphtikzintgrtype}{RectanglesMilieu}%
+ {%
+ \foreach \i in {0,...,\inteval{\graphtikzintgrnb-1}}%
+ \draw[pflfigureintegr] ({#3+\i*\TmpH},{0}) rectangle++ ({\TmpH},{\xintfloateval{#2(#3+(\i+0.5)*\TmpH)}}) ;
+ }%
+ {}%
+ \IfEq{\graphtikzintgrtype}{Trapezes}%
+ {%
+ \foreach \i in {0,...,\inteval{\graphtikzintgrnb-1}}%
+ \draw[pflfigureintegr] ({#3+\i*\TmpH},{0}) -- ({#3+\i*\TmpH},{\xintfloateval{#2(#3+\i*\TmpH)}}) -- ({#3+(\i+1)*\TmpH},{\xintfloateval{#2(#3+(\i+1)*\TmpH)}}) -- ({#3+(\i+1)*\TmpH},{0}) -- cycle ;
+ }%
+ {}%
+ }%
+}
+
+
%====INTÉGRALES
%v2 avec modification de la clé [Type=...] ?
\defKV[GraphiqueTikzIntegr]{%
@@ -1961,6 +2157,16 @@
\end{scope}
}
+%====asymptote
+\NewDocumentCommand\TracerAsymptote{ O{} m D<>{} }{%
+ \restoreKV[GraphiquetikzDroite]%
+ \setKV[GraphiquetikzDroite]{#1}%
+ %tracé
+ \draw[pfltrait,{\useKV[GraphiquetikzDroite]{Couleur}},#3] ({#2},{\pflymin})--({#2},{\pflymax}) ;
+}
+
+
+%====MinMax
\defKV[GraphiqueTikzMinMax]{%
Pas=\def\pflminmaxstep{#1},%
Methode=\def\pflminmaxmethode{#1},%
@@ -2059,7 +2265,7 @@
}
\setKVdefault[GraphiqueTikzNode]{%
Couleur=black,%
- Debut={\normalfont\normalsize},%
+ Police={\normalfont\normalsize},%
Position={}
}
\NewDocumentCommand\PlacerTexte{ O{} m m }{%
@@ -2117,6 +2323,7 @@
\tikzset{tkzgrphnode/.style={}}
\tikzset{tkzgrphpoint/.style={line width=0.95pt}}
\tikzset{tkzgrphpointc/.style={radius=1.75pt}}
+\tikzset{tkzgrphpointmc/.style={radius=0.875pt}}
\tikzset{tkzgrphscatter/.style={radius=1.75pt}}
\tikzset{tkzgrphframe/.style={line width=0.8pt,gray}}
\tikzset{tkzgrphcurve/.style={line width=1.05pt}}
@@ -2861,7 +3068,8 @@
Name=spline,%
Color=black,%
Coeffs=3,%
- Trace=false
+ Trace=false,%
+ Alt=false
}
\NewDocumentCommand\GenerateSpline{ m m O{\myspline} }{%
@@ -3898,11 +4106,11 @@
}
%====droite
-\defKV[GraphiquetikzDroite]{%
+\defKV[GraphicTikzLine]{%
Name=\def\pfldroitename{#1}
}
-\setKVdefault[GraphiquetikzDroite]{%
+\setKVdefault[GraphicTikzLine]{%
Slope=false,%
Color=black,%
Start={\pflxmin},%
@@ -3911,15 +4119,15 @@
}
\NewDocumentCommand\DrawLine{ O{} m m D<>{} }{%
- \restoreKV[GraphiquetikzDroite]%
- \setKV[GraphiquetikzDroite]{#1}%
+ \restoreKV[GraphicTikzLine]%
+ \setKV[GraphicTikzLine]{#1}%
%1er point
\path #2;%
\pgfgetlastxy{\macrox}{\macroy}%
\xdef\pfldtetikzxA{\xintfloateval{(\ConvertPtToCm{\macrox})/(\pflxunit)}}%
\xdef\pfldtetikzyA{\xintfloateval{(\ConvertPtToCm{\macroy})/(\pflyunit)}}%
%2ème point si besoin
- \ifboolKV[GraphiquetikzDroite]{Slope}%
+ \ifboolKV[GraphicTikzLine]{Slope}%
{%
\xdef\pfldtepente{\xintfloateval{#3}}%
}%
@@ -3936,24 +4144,33 @@
{%
\IfEq{\pfldroitename}{}%
{%
- \draw[tkzgrphline,{\useKV[GraphiquetikzDroite]{Color}},#4] (\pfldtetikzxA,\pflymin) -- (\pfldtetikzxA,\pflymax) ;
+ \draw[tkzgrphline,{\useKV[GraphicTikzLine]{Color}},#4] (\pfldtetikzxA,\pflymin) -- (\pfldtetikzxA,\pflymax) ;
}%
{%
- \draw[tkzgrphline,{\useKV[GraphiquetikzDroite]{Color}},#4,name path global=\pfldroitename] (\pfldtetikzxA,\pflymin) -- (\pfldtetikzxA,\pflymax) ;
+ \draw[tkzgrphline,{\useKV[GraphicTikzLine]{Color}},#4,name path global=\pfldroitename] (\pfldtetikzxA,\pflymin) -- (\pfldtetikzxA,\pflymax) ;
}%
}%
{%
\IfEq{\pfldroitename}{}%
{%
- \draw[tkzgrphline,{\useKV[GraphiquetikzDroite]{Color}},domain={\useKV[GraphiquetikzDroite]{Start}}:{\useKV[GraphiquetikzDroite]{End}},samples=2,#4] plot (\x,{\pfldtepente*(\x-\pfldtetikzxA)+\pfldtetikzyA}) ;
+ \draw[tkzgrphline,{\useKV[GraphicTikzLine]{Color}},domain={\useKV[GraphicTikzLine]{Start}}:{\useKV[GraphicTikzLine]{End}},samples=2,#4] plot (\x,{\pfldtepente*(\x-\pfldtetikzxA)+\pfldtetikzyA}) ;
}%
{%
- \draw[tkzgrphline,{\useKV[GraphiquetikzDroite]{Color}},domain={\useKV[GraphiquetikzDroite]{Start}}:{\useKV[GraphiquetikzDroite]{End}},samples=2,name path global=\pfldroitename,#4] plot (\x,{\pfldtepente*(\x-\pfldtetikzxA)+\pfldtetikzyA}) ;
+ \draw[tkzgrphline,{\useKV[GraphicTikzLine]{Color}},domain={\useKV[GraphicTikzLine]{Start}}:{\useKV[GraphicTikzLine]{End}},samples=2,name path global=\pfldroitename,#4] plot (\x,{\pfldtepente*(\x-\pfldtetikzxA)+\pfldtetikzyA}) ;
}%
}%
\end{scope}
}
+%====asymptote
+\NewDocumentCommand\DrawAsymptote{ O{} m D<>{} }{%
+ \restoreKV[GraphicTikzLine]%
+ \setKV[GraphicTikzLine]{#1}%
+ %tracé
+ \draw[tkzgrphline,{\useKV[GraphicTikzLine]{Color}},#3] ({#2},{\pflymin})--({#2},{\pflymax}) ;
+}
+
+%====minmax
\defKV[GraphicTikzMinMax]{%
Pas=\def\pflminmaxstep{#1},%
Method=\def\pflminmaxmethode{#1},%
@@ -4061,4 +4278,457 @@
\draw #2 node[tkzgrphnode,font=\pflnodefonte,text=\pflnodecol,\pfnodepos] {#3} ;
}
+%====MONTE CARLO
+\defKV[GraphicTikzmontecarlo]{%
+ Colors=\def\graphtikzmccols{#1},%
+ BoundsX=\def\graphtikzmcxbornes{#1},%
+ BoundsY=\def\graphtikzmcybornes{#1}
+}
+
+\setKVdefault[GraphicTikzmontecarlo]{%
+ Colors={blue/red},%
+ BoundsX={\pflxmin,\pflxmax},%
+ BoundsY={\pflymin,\pflymax}
+}
+
+\NewDocumentCommand\SimulateMonteCarlo{ O{} D<>{f} m O{\nbptsmcok} O{\nbptsmcko} }{%
+ \restoreKV[GraphicTikzmontecarlo]%
+ \setKV[GraphicTikzmontecarlo]{#1}%
+ \StrCut{\graphtikzmccols}{/}{\tmpMCcolOK}{\tmpMCcolKO}%
+ \StrCut{\graphtikzmcxbornes}{,}{\tmpMCxmin}{\tmpMCxmax}%
+ \StrCut{\graphtikzmcybornes}{,}{\tmpMCymin}{\tmpMCymax}%
+ \xdef#4{0}%
+ \xdef#5{0}%
+ \xdef\nbptsmc{#3}%
+ \foreach \i in {1,...,#3}{%
+ \xdef\tmpMCrandX{\xintfloateval{random()*((\tmpMCxmax)-(\tmpMCxmin))+(\tmpMCxmin)}}%
+ \xdef\tmpMCrandY{\xintfloateval{random()*((\tmpMCymax)-(\tmpMCymin))+(\tmpMCymin)}}%
+ \xdef\tmpMCrandfX{\xintfloateval{#2(\tmpMCrandX)}}%
+ \xintifboolexpr{ \tmpMCrandfX > \tmpMCrandY }%
+ {%
+ \xdef#4{\xinteval{#4+1}}%
+ \filldraw[\tmpMCcolOK] (\tmpMCrandX,\tmpMCrandY) circle[tkzgrphpointmc] ;
+ }%
+ {%
+ \xdef#5{\xinteval{#5+1}}%
+ \filldraw[\tmpMCcolKO] (\tmpMCrandX,\tmpMCrandY) circle[tkzgrphpointmc] ;
+ }%
+ }%
+}
+
+%====ECC
+\defKV[tkzgECC]{%
+ Couleur=\def\tkzecc@coul@graph{#1},%
+ CouleursParams=\def\tkzecc@coul@params{#1}
+}
+
+\setKVdefault[tkzgECC]{%
+ Couleur=black,%
+ AffParams=true,%
+ CouleursParams={black},%
+ TraitsComplets=true
+}
+
+\tikzset{pfltraitsparamecc/.style={line width=0.9pt,densely dashed}}
+\tikzset{pflcourbeecc/.style={line width=1.05pt}}
+
+\NewDocumentCommand\TracerCourbeECC{ O{} m m }{%
+ \restoreKV[tkzgECC]%
+ \setKV[tkzgECC]{#1}%
+ \IfSubStr{\tkzecc@coul@params}{/}%
+ {%
+ \StrCut{\tkzecc@coul@params}{/}{\tkzecc@coul@quart}{\tkzecc@coul@med}%
+ }%
+ {%
+ \def\tkzecc@coul@quart{\tkzecc@coul@params}\def\tkzecc@coul@med{\tkzecc@coul@params}%
+ }%
+ \readlist*\DataClass{#2}%
+ \readlist*\DataEff{#3}%
+ \xdef\DonneesECC{0}%
+ \xintFor* ##1 in {\xintSeq{1}{\DataEfflen}}\do{%
+ \xdef\DonneesTmp{0}
+ \xintFor* ##2 in {\xintSeq{1}{##1}}\do{%
+ \xdef\DonneesTmp{\xintfloateval{\DonneesTmp+\DataEff[##2]}}%
+ }%
+ \xdef\DonneesECC{\DonneesECC,\DonneesTmp}%
+ }%
+ \readlist*\DataECC\DonneesECC%
+ \itemtomacro\DataClass[1]\DonneesXmin%
+ \itemtomacro\DataClass[-1]\DonneesXmax%
+ \itemtomacro\DataECC[-1]\DonneesEffMax%
+ \xdef\DonneesListeECC{(\DataClass[1],\DataECC[1])}%
+ \xintFor* ##1 in {\xintSeq{2}{\DataECClen}}\do{%
+ \xdef\DonneesListeECC{\DonneesListeECC--(\DataClass[##1],\DataECC[##1])}%
+ }%
+ %paramètres par interpolation
+ \xintFor* ##1 in {\xintSeq{1}{\DataEfflen}}\do{%
+ \xdef\isuiv{\xinteval{##1+1}}%
+ \xintifboolexpr{\DataECC[##1] < (0.25*\DonneesEffMax) 'and' \DataECC[\isuiv] >= (0.25*\DonneesEffMax)}%
+ {%
+ \xdef\pentetmpECC{(\DataECC[\isuiv]-\DataECC[##1])/(\DataClass[\isuiv]-\DataClass[##1])}%OK
+ \xdef\ValPremQuartile{\xintfloateval{(0.25*\DonneesEffMax+\pentetmpECC*\DataClass[##1]-\DataECC[##1])/(\pentetmpECC)}}%
+ }
+ {}%
+ \xintifboolexpr{\DataECC[##1] < (0.50*\DonneesEffMax) 'and' \DataECC[\isuiv] >= (0.50*\DonneesEffMax)}%
+ {%
+ \xdef\pentetmpECC{(\DataECC[\isuiv]-\DataECC[##1])/(\DataClass[\isuiv]-\DataClass[##1])}%OK
+ \xdef\ValMed{\xintfloateval{(0.50*\DonneesEffMax+\pentetmpECC*\DataClass[##1]-\DataECC[##1])/(\pentetmpECC)}}%
+ }
+ {}%
+ \xintifboolexpr{\DataECC[##1] < (0.75*\DonneesEffMax) 'and' \DataECC[\isuiv] >= (0.75*\DonneesEffMax)}%
+ {%
+ \xdef\pentetmpECC{(\DataECC[\isuiv]-\DataECC[##1])/(\DataClass[\isuiv]-\DataClass[##1])}%OK
+ \xdef\ValTroisQuartile{\xintfloateval{(0.75*\DonneesEffMax+\pentetmpECC*\DataClass[##1]-\DataECC[##1])/(\pentetmpECC)}}%
+ }
+ {}%
+ }%
+ %partie graphique
+ \draw[pflcourbeecc,\tkzecc@coul@graph] \DonneesListeECC ;
+ \xintFor* ##1 in {\xintSeq{1}{\DataECClen}}\do{%
+ \filldraw[\tkzecc@coul@graph] (\DataClass[##1],\DataECC[##1]) circle[pflpointnuage] ;
+ }%
+ \ifboolKV[tkzgECC]{AffParams}%
+ {%
+ %médiane
+ \ifboolKV[tkzgECC]{TraitsComplets}%
+ {%
+ \draw[pfltraitsparamecc,\tkzecc@coul@med] (\pflxmin,{0.50*\DonneesEffMax})--(\pflxmax,{0.50*\DonneesEffMax});
+ \draw[pfltraitsparamecc,\tkzecc@coul@quart] (\pflxmin,{0.25*\DonneesEffMax})--++({\pflxmax-\pflxmin},0);
+ \draw[pfltraitsparamecc,\tkzecc@coul@quart] (\pflxmin,{0.75*\DonneesEffMax})--++({\pflxmax-\pflxmin},0);
+ }%
+ {%
+ \draw[pfltraitsparamecc,\tkzecc@coul@med] (\pflxmin,{0.50*\DonneesEffMax})--(\ValMed,{0.50*\DonneesEffMax});
+ \draw[pfltraitsparamecc,\tkzecc@coul@quart] (\pflxmin,{0.25*\DonneesEffMax})--++({\ValPremQuartile-\pflxmin},0);
+ \draw[pfltraitsparamecc,\tkzecc@coul@quart] (\pflxmin,{0.75*\DonneesEffMax})--++({\ValTroisQuartile-\pflxmin},0);
+ }%
+ \draw[pfltraitsparamecc,\tkzecc@coul@med] (\ValMed,{0.5*\DonneesEffMax})--(\ValMed,0) ; \draw[\tkzecc@coul@med,thick,fill=white] (\ValMed,{0.5*\DonneesEffMax}) circle[pflpointnuage] ;
+ \draw[pfltraitsparamecc,\tkzecc@coul@quart] (\ValPremQuartile,{0.25*\DonneesEffMax})--(\ValPremQuartile,\pflymin) ; \draw[\tkzecc@coul@quart,thick,fill=white] (\ValPremQuartile,{0.25*\DonneesEffMax}) circle[pflpointnuage] ;
+ \draw[pfltraitsparamecc,\tkzecc@coul@quart] (\ValTroisQuartile,{0.75*\DonneesEffMax})--(\ValTroisQuartile,\pflymin) ; \draw[\tkzecc@coul@quart,thick,fill=white] (\ValTroisQuartile,{0.75*\DonneesEffMax}) circle[pflpointnuage] ;
+ }%
+ {}%
+}
+
+%====PTS DISCONTINUITÉ
+\defKV[tkzptdiscont]{%
+ Couleur=\def\pfldiscontcouleur{#1},%
+ Pos=\def\pfldiscontpos{#1},%
+ Echelle=\def\pfldiscontechelle{#1},%
+ Type=\def\pfldisconttype{#1}
+}
+
+\setKVdefault[tkzptdiscont]{%
+ Couleur=black,%
+ Pos=D,%
+ Echelle=1,%
+ Type=par
+}
+
+\NewDocumentCommand\AfficherPtsDiscont{ O{} m }{%
+ \restoreKV[tkzptdiscont]
+ \setKV[tkzptdiscont]{#1}%
+ \setsepchar[.]{§./}%
+ \readlist*\SPLlisteDiscont{#2}%
+ \def\SPLlisteDiscontNb{\SPLlisteDiscontlen}%
+ \foreach \i in {1,...,\SPLlisteDiscontNb}{%
+ \begin{scope}[shift={(\SPLlisteDiscont[\i,1],\SPLlisteDiscont[\i,2])},rotate={atan \SPLlisteDiscont[\i,3]},scale=\pfldiscontechelle]
+ \IfStrEq{\pfldisconttype}{rond}%
+ {%
+ \draw[pflcourbediscont,fill=white,draw=\pfldiscontcouleur] (0,0) circle[radius=3pt] ;
+ }{}%
+ \IfStrEq{\pfldiscontpos}{D}%
+ {%
+ \IfStrEq{\pfldisconttype}{par}%
+ {%
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) to[out=90,in=170] (4pt,5pt) ;
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) to[out=-90,in=-170] (4pt,-5pt) ;
+ }{}%
+ \IfStrEq{\pfldisconttype}{demirond}%
+ {%
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) to[out=90,in=180] (3pt,3pt) ;
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) to[out=-90,in=180] (3pt,-3pt) ;
+ }{}%
+ \IfStrEq{\pfldisconttype}{cro}%
+ {%
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) |- (4pt,5pt) ;
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) |- (4pt,-5pt) ;
+ }{}%
+ }%
+ {%
+ \IfStrEq{\pfldisconttype}{par}%
+ {%
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) to[out=90,in=-10] (-4pt,5pt) ;
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) to[out=-90,in=10] (-4pt,-5pt) ;
+ }{}%
+ \IfStrEq{\pfldisconttype}{demirond}%
+ {%
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) to[out=90,in=0] (-3pt,3pt) ;
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) to[out=-90,in=0] (-3pt,-3pt) ;
+ }{}%
+ \IfStrEq{\pfldisconttype}{cro}%
+ {%
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) |- (-4pt,5pt) ;
+ \draw[pflcourbediscont,\pfldiscontcouleur] (0,0) |- (-4pt,-5pt) ;
+ }{}%
+ }%
+ \end{scope}
+ }%
+}
+
+%====TOILE RÉCURRENCE (OK avec courbe + spline !!)
+\tikzset{pfltraitrec/.style={line width=0.8pt}}
+\tikzset{pfltraitrecpointill/.style={pfltraitrec,densely dashed}}
+
+\defKV[tkzwebrecurr]{%
+ Couleur=\def\pflrecurcolor{#1},%
+ Nom=\def\pflrecurnom{#1},%
+ No=\def\pflrecurno{#1},%
+ Nb=\def\pflrecurnb{#1},%
+ Uno=\def\pflrecuruno{#1},
+ TailleLabel=\def\pflrecurlabelsize{#1},%
+ PosLabel=\def\pflrecurlabelpos{#1}
+}
+
+\setKVdefault[tkzwebrecurr]{%
+ Couleur=black,%
+ Spline=false,%
+ No=0,%
+ Nom=u,%
+ Nb=5,%
+ AffTermes=false,%
+ AffPointilles=true,%
+ TailleLabel=\small,%
+ PosLabel=below
+}
+
+\NewDocumentCommand\TracerToileRecurrence{ O{} m }{
+ %<clés> + fonction/courbe
+ \useKVdefault[tkzwebrecurr]%
+ \setKV[tkzwebrecurr]{#1}% on paramètres les nouvelles clés et on les simplifie
+ \ifboolKV[tkzwebrecurr]{Spline}%
+ {%
+ \foreach \i [remember=\i as \x (initially \pflrecuruno)] in {1,...,\pflrecurnb}{%
+ %\xdef\y{\xintfloateval{#2(\x)}}%
+ \path[draw=none,pflcourbe,name path=tmprecur] ({\x},{\pflymin})--({\x},{\pflymax}) ;
+ \path[name intersections={of=#2 and tmprecur,name=ZZZZ}] ;
+ %\coordinate (\pflrecurnoms) at (ZZZZ-1) ;
+ \GetYcoord{(ZZZZ-1)}[\y]
+ %test de la position courbe / bissectrice ?
+ \ifnum \i=1
+ \newdimen \X
+ \newdimen \Y
+ \X = \x pt
+ \Y = \y pt
+ \ifdim \Y < \X
+ \draw[pfltraitrec,\pflrecurcolor] (\x,\y)--(\y,\y) ;
+ \else
+ \draw[pfltraitrec,\pflrecurcolor] (\x,\x)--(\x,\y)--(\y,\y) ;
+ \fi
+ \else
+ \draw[pfltraitrec,\pflrecurcolor] (\x,\x)--(\x,\y)--(\y,\y) ;
+ \fi
+ \ifboolKV[tkzwebrecurr]{AffPointilles}%
+ {%
+ \def\indice{\fpeval{\i+\pflrecurno-1}}%
+ \ifboolKV[tkzwebrecurr]{AffTermes}%
+ {%
+ \draw[pfltraitrecpointill,\pflrecurcolor] (\x,\y)--(\x,\pflxmin) node[\pflrecurlabelpos,font=\pflrecurlabelsize]{$\pflrecurnom_{\indice}$};%
+ }%
+ {%
+ \draw[pfltraitrecpointill,\pflrecurcolor] (\x,\y)--(\x,\pflxmin) ;%
+ }%
+ }%
+ {}
+ \def\i{\y}%
+ }%
+ }%
+ {%
+ \foreach \i [remember=\i as \x (initially \pflrecuruno)] in {1,...,\pflrecurnb}{%
+ \xdef\y{\xintfloateval{#2(\x)}}%
+ %test de la position courbe / bissectrice ?
+ \ifnum \i=1
+ \newdimen \X
+ \newdimen \Y
+ \X = \x pt
+ \Y = \y pt
+ \ifdim \Y < \X
+ \draw[pfltraitrec,\pflrecurcolor] (\x,\y)--(\y,\y) ;
+ \else
+ \draw[pfltraitrec,\pflrecurcolor] (\x,\x)--(\x,\y)--(\y,\y) ;
+ \fi
+ \else
+ \draw[pfltraitrec,\pflrecurcolor] (\x,\x)--(\x,\y)--(\y,\y) ;
+ \fi
+ \ifboolKV[tkzwebrecurr]{AffPointilles}%
+ {%
+ \def\indice{\fpeval{\i+\pflrecurno-1}}%
+ \ifboolKV[tkzwebrecurr]{AffTermes}%
+ {%
+ \draw[pfltraitrecpointill,\pflrecurcolor] (\x,\y)--(\x,\pflxmin) node[\pflrecurlabelpos,font=\pflrecurlabelsize]{$\pflrecurnom_{\indice}$};%
+ }%
+ {%
+ \draw[pfltraitrecpointill,\pflrecurcolor] (\x,\y)--(\x,\pflxmin) ;%
+ }%
+ }%
+ {}
+ \def\i{\xintfloateval{\y}}%
+ }%
+ }%
+}
+
+%====HISTOBINOM
+\defKV[tkzHistoBinom]{%
+ Plage=\def\tkzGraphBinomPlage{#1},%
+ CouleurPlage=\def\tkzGraphBimomColPlage{#1},%
+ ClipX=\def\tkzGraphBinomXminmax{#1},%
+ CouleurNormale=\def\tkzGraphBinomColNorm{#1}
+}
+\setKVdefault[tkzHistoBinom]{%
+ Plage={},%
+ CouleurPlage=black,%
+ ClipX={},%
+ AffNormale=false,%
+ CouleurNormale=black
+}
+
+\NewDocumentCommand\TracerHistoBinomiale{ O{} D<>{phi} m m }{%
+ \restoreKV[tkzHistoBinom]%
+ \setKV[tkzHistoBinom]{#1}
+ \def\tkzGraphBinomN{#3}%
+ \def\tkzGraphBinomP{#4}%
+ \IfStrEq{\tkzGraphBinomXminmax}{}%
+ {%
+ \xdef\tkzGraphBinomXmin{0}%
+ \xdef\tkzGraphBinomXmax{\tkzGraphBinomN}%
+ }%
+ {%
+ \StrCut{\tkzGraphBinomXminmax}{-}{\tkzGraphBinomXmin}{\tkzGraphBinomXmax}%
+ \IfStrEq{\tkzGraphBinomXmin}{*}{\xdef\tkzGraphBinomXmin{0}}{}%
+ \IfStrEq{\tkzGraphBinomXmax}{*}{\xdef\tkzGraphBinomXmax{\tkzGraphBinomN}}{}%
+ }%
+ \IfStrEq{\tkzGraphBinomPlage}{}%
+ {}%
+ {%
+ \StrCut{\tkzGraphBinomPlage}{-}{\tkzGraphBinomColorMin}{\tkzGraphBinomColorMax}%
+ \IfStrEq{\tkzGraphBinomColorMin}{*}{\xdef\tkzGraphBinomColorMin{\tkzGraphBinomXmin}}{}%
+ \IfStrEq{\tkzGraphBinomColorMax}{*}{\xdef\tkzGraphBinomColorMax{\tkzGraphBinomXmax}}{}%
+ }%
+ %coloriage éventuel
+ \IfStrEq{\tkzGraphBinomPlage}{}%
+ {}%
+ {%
+ \xintFor* ##1 in {\xintSeq{\tkzGraphBinomColorMin}{\tkzGraphBinomColorMax}}\do{%
+ \xdef\tkztmpYYY{\xintfloateval{binomial(\tkzGraphBinomN,##1)*(\tkzGraphBinomP)^(##1)*(1-(\tkzGraphBinomP))^((\tkzGraphBinomN)-(##1))}}%
+ \draw[draw=none,fill=\tkzGraphBimomColPlage,fill opacity=0.5] ({##1-0.5},{\pflymin}) rectangle++ (1,{\tkztmpYYY-\pflymin}) ;
+ }%
+ }%
+ %tracé
+ \xintFor* ##1 in {\xintSeq{\tkzGraphBinomXmin}{\tkzGraphBinomXmax}}\do{%
+ \xdef\tkztmpYYY{\xintfloateval{binomial(\tkzGraphBinomN,##1)*(\tkzGraphBinomP)^(##1)*(1-(\tkzGraphBinomP))^((\tkzGraphBinomN)-(##1))}}%
+ \draw[pfltrait] ({##1-0.5},{\pflymin}) rectangle++ (1,{\tkztmpYYY-\pflymin}) ;
+ }%
+ \ifboolKV[tkzHistoBinom]{AffNormale}%
+ {%
+ \xdef\tkzMinNormHistoBinom{\xintfloateval{{\tkzGraphBinomXmin-0.5}}}%
+ \xdef\tkzMaxNormHistoBinom{\xintfloateval{{\tkzGraphBinomXmax+0.5}}}%
+ \xdef\tkzEsperNorm{\xintfloateval{(#3)*(#4)}}%
+ \xdef\tkzVarNorm{\xintfloateval{sqrt((#3)*(#4)*(1-(#4)))}}%
+ \DefinirLoiNormale[Trace,Couleur=\tkzGraphBinomColNorm,pflcourbe,Debut=\tkzMinNormHistoBinom,Fin=\tkzMaxNormHistoBinom]<#2>{\tkzEsperNorm}{\tkzVarNorm}
+ }%
+ {}%
+}
+
+%====pgfplots small macros
+\NewDocumentCommand\findintersectionspgf{ O{ITSC} m m D<>{\myt} }{%
+ %1 = name of node name
+ %2 = 1st object
+ %3 = 2d object
+ %4 = macro storing number of intersections
+ \path[name intersections={of=#2 and #3,name=#1,total=\t}] \pgfextra{\xdef#4{\t}} ;
+}
+
+\NewDocumentCommand\gextractxnodepgf{ m O{\myxcoord} }{%
+ \path \pgfextra{\pgfplotspointgetcoordinates{#1}\pgfkeysgetvalue{/data point/x}{\tmpxgetvalue}\xdef#2{\tmpxgetvalue}} ;
+}
+
+\NewDocumentCommand\gextractynodepgf{ m O{\myycoord} }{%
+ \path \pgfextra{\pgfplotspointgetcoordinates{#1}\pgfkeysgetvalue{/data point/y}{\tmpygetvalue}\xdef#2{\tmpygetvalue}} ;
+}
+
+\NewDocumentCommand\gextractxynodepgf{ m O{\myxcoord} O{\myycoord} }{%
+ \path \pgfextra{\pgfplotspointgetcoordinates{#1}\pgfkeysgetvalue{/data point/x}{\tmpxgetvalue}\xdef#2{\tmpxgetvalue}\pgfkeysgetvalue{/data point/y}{\tmpygetvalue}\xdef#3{\tmpygetvalue}} ;
+}
+
+\NewDocumentCommand\fillbetweencurvespgf{ O{gray,fill opacity=0.25} m m D<>{} }{%
+ \addplot[#1] fill between [of=#2 and #3,soft clip={#4}];
+}
+
+\NewDocumentCommand\gensplinecubicpgf{ s m m O{\monspline} }{%
+ %1=liste
+ \setsepchar[.]{§./}%
+ \readlist*\SPLlistepoints{#2}%
+ %les données
+ \def\tmpsplinenumdeb{1}
+ \def\tmpsplinenumfin{\SPLlistepointslen}%
+ \pflextractcoeff{#3}{\tmpsplinenumdeb}%
+ %nb de calculs
+ \def\SPLnbsplines{\inteval{\tmpsplinenumfin-1}}%
+ %extraction des coordonnées
+ \itemtomacro\SPLlistepoints[\tmpsplinenumdeb,1]\xa%
+ \itemtomacro\SPLlistepoints[\tmpsplinenumdeb,2]\ya%
+ \itemtomacro\SPLlistepoints[\tmpsplinenumdeb,3]\fprimea%
+ \itemtomacro\SPLlistepoints[\tmpsplinenumdeb,1]\xb%
+ \itemtomacro\SPLlistepoints[\tmpsplinenumdeb,2]\yb%
+ \itemtomacro\SPLlistepoints[\tmpsplinenumdeb,3]\fprimeb%
+ \IfBooleanTF{#1}%
+ {%
+ \xdef\tmpcontrolsxa{\xintfloateval{(\xa)+(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsya{\xintfloateval{(\ya)+\fprimea*(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsxb{\xintfloateval{(\xb)-(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsyb{\xintfloateval{(\yb)-\fprimeb*(\xb-\xa)/\COEFFA}}%
+ }%
+ {%
+ \xdef\tmpcontrolsxa{\xintfloateval{(\xa)+cos(atand(\fprimea))*(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsya{\xintfloateval{(\ya)+sin(atand(\fprimea))*(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsxb{\xintfloateval{(\xb)-cos(atand(\fprimeb))*(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsyb{\xintfloateval{(\yb)-sin(atand(\fprimeb))*(\xb-\xa)/\COEFFA}}%
+ }%
+ \xdef#4{(\xa,\ya) ..controls (\tmpcontrolsxa,\tmpcontrolsya) and (\tmpcontrolsxb,\tmpcontrolsyb).. (\xb,\yb)}%
+ \foreach \i in {\tmpsplinenumdeb,...,\SPLnbsplines}{%
+ %extraction des coeffs de compensation
+ \pflextractcoeff{#3}{\i}%
+ \def\j{\inteval{\i+1}}%
+ \itemtomacro\SPLlistepoints[\i,1]\xa%
+ \itemtomacro\SPLlistepoints[\i,2]\ya%
+ \itemtomacro\SPLlistepoints[\i,3]\fprimea%
+ \itemtomacro\SPLlistepoints[\j,1]\xb%
+ \itemtomacro\SPLlistepoints[\j,2]\yb%
+ \itemtomacro\SPLlistepoints[\j,3]\fprimeb%
+ \IfBooleanTF{#1}%
+ {%
+ \xdef\tmpcontrolsxa{\xintfloateval{(\xa)+(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsya{\xintfloateval{(\ya)+\fprimea*(\xb-\xa)/\COEFFA\fprimea*(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsxb{\xintfloateval{(\xb)-(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsyb{\xintfloateval{(\yb)-\fprimeb*(\xb-\xa)/\COEFFA}}%
+ }%
+ {%
+ \xdef\tmpcontrolsxa{\xintfloateval{(\xa)+cos(atand(\fprimea))*(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsya{\xintfloateval{(\ya)+sin(atand(\fprimea))*(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsxb{\xintfloateval{(\xb)-cos(atand(\fprimeb))*(\xb-\xa)/\COEFFA}}%
+ \xdef\tmpcontrolsyb{\xintfloateval{(\yb)-sin(atand(\fprimeb))*(\xb-\xa)/\COEFFA}}%
+ }%
+ \xdef#4{#4 ..controls (\tmpcontrolsxa,\tmpcontrolsya) and (\tmpcontrolsxb,\tmpcontrolsyb).. (\xb,\yb)}%
+ }%
+}
+
+\NewDocumentCommand\addplotspline{ s O{} D<>{3} m O{\monspline} }{%
+ \IfBooleanTF{#1}%
+ {%
+ \gensplinecubicpgf*{#4}{#3}[#5]%
+ }%
+ {%
+ \gensplinecubicpgf{#4}{#3}[#5]%
+ }%
+ \draw[#2] #5 ;
+}
+
\endinput \ No newline at end of file
diff --git a/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-en.pdf b/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-en.pdf
index 44c8e897ce..14f9e46afe 100644
--- a/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-en.pdf
+++ b/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-en.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-en.tex b/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-en.tex
index b0a81f9e6a..95cbe02f11 100644
--- a/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-en.tex
+++ b/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-en.tex
@@ -21,8 +21,8 @@
\hypersetup{pdfborder=0 0 0}
\usepackage[margin=2cm]{geometry}
\setlength{\parindent}{0pt}
-\def\TPversion{0.1.1}
-\def\TPdate{26/11/2023}
+\def\TPversion{0.1.2}
+\def\TPdate{21/10/2024}
\usepackage{tcolorbox}
\tcbuselibrary{skins,hooks,listingsutf8}
\usepackage{soul}
@@ -135,6 +135,7 @@ Loaded are useful package are :
\begin{quote}
\begin{verbatim}
+0.1.2 : Key [ShortVersion] in order to reduce number of border cells
0.1.1 : Adding two schemes of colors
0.1.0 : Initial version
\end{verbatim}
@@ -160,7 +161,9 @@ All the available keys are presented in the following paragraph, but concerning
%
\BoardTrivialPursuit[Radius=4,BorderHeight=1.25] %beware of the rendering...
-\BoardTrivialPursuit[Unit=0.33] %'optimal' rendering
+\BoardTrivialPursuit[Unit=0.33]
+%
+\BoardTrivialPursuit[Unit=0.33,ShortVersion]
\end{tcblisting}
\pagebreak
@@ -188,7 +191,8 @@ Available \textsf{keys} are :
\item \MontreCode{Blank} := boolean for an empty board, and \MontreCode{false} by default ;
\item \MontreCode{Unit} := to precis an unit (better than a scale !), and \MontreCode{1} by default ;
\item \MontreCode{Thickness} := thickness of the borders, and \MontreCode{0.8pt} by default ;
- \item \MontreCode{Rotation} := possible rotation of the board, and \MontreCode{0} by default.
+ \item \MontreCode{Rotation} := possible rotation of the board, and \MontreCode{0} by default ;
+ \item \MontreCode{ShortVersion} := use 5 cells instead 6 between 'big cells', and \MontreCode{false} by default.
\end{itemize}
\begin{tcblisting}{colframe=lightgray,colback=lightgray!5}
diff --git a/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-fr.pdf b/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-fr.pdf
index 2b6b766846..16dcd58e8b 100644
--- a/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-fr.pdf
+++ b/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-fr.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-fr.tex b/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-fr.tex
index ff50c6a07d..d93190d0e0 100644
--- a/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-fr.tex
+++ b/graphics/pgf/contrib/trivialpursuit/doc/TrivialPursuit-doc-fr.tex
@@ -21,8 +21,8 @@
\hypersetup{pdfborder=0 0 0}
\usepackage[margin=2cm]{geometry}
\setlength{\parindent}{0pt}
-\def\TPversion{0.1.1}
-\def\TPdate{26 novembre 2023}
+\def\TPversion{0.1.2}
+\def\TPdate{21 octobre 2024}
\usepackage{tcolorbox}
\tcbuselibrary{skins,hooks,listingsutf8}
\usepackage{soul}
@@ -135,6 +135,7 @@ Les packages chargés et utilisés par \MontreCode{TrivialPursuit} sont :
\begin{quote}
\begin{verbatim}
+0.1.2 : Ajout d'une clé [VersionCourte] pour diminuer le nombre de cases
0.1.1 : Ajout de palettes de couleurs prédéfinies
0.1.0 : Version initiale
\end{verbatim}
@@ -160,7 +161,9 @@ Toutes les clés disponibles sont présentées dans le paragraphe suivant, mais
%
\PlateauTrivialPursuit[Rayon=4,HauteurCases=1.25] %attention au rendu...
-\PlateauTrivialPursuit[Unite=0.33] %le rendu est 'optimal'
+\PlateauTrivialPursuit[Unite=0.33]
+%
+\PlateauTrivialPursuit[Unite=0.33,VersionCourte]
\end{tcblisting}
\pagebreak
@@ -188,7 +191,8 @@ Les \textsf{clés} disponibles sont :
\item \MontreCode{Vide} := booléen pour afficher le plateau vide, et valant \MontreCode{false} par défaut ;
\item \MontreCode{Unite} := pour préciser l'unité (et gérer un facteur d'échelle), et valant \MontreCode{1} par défaut ;
\item \MontreCode{Epaisseur} := épaisseur des tracés, et valant \MontreCode{0.8pt} par défaut ;
- \item \MontreCode{Rotation} := rotation éventuelle du plateau, et valant \MontreCode{0} par défaut.
+ \item \MontreCode{Rotation} := rotation éventuelle du plateau, et valant \MontreCode{0} par défaut ;
+ \item \MontreCode{VersionCourte} := utiliser 5 cases au lieu de 6 entre les camemberts, et valant \MontreCode{false} par défaut.
\end{itemize}
\begin{tcblisting}{colframe=lightgray,colback=lightgray!5}
diff --git a/graphics/pgf/contrib/trivialpursuit/tex/TrivialPursuit.sty b/graphics/pgf/contrib/trivialpursuit/tex/TrivialPursuit.sty
index d8b8411130..9bc0185a91 100644
--- a/graphics/pgf/contrib/trivialpursuit/tex/TrivialPursuit.sty
+++ b/graphics/pgf/contrib/trivialpursuit/tex/TrivialPursuit.sty
@@ -4,7 +4,8 @@
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{TrivialPursuit}[2023/11/26 0.1.1 Present a Trivial Pursuit Board]
+\ProvidesPackage{TrivialPursuit}[2024/10/21 0.1.2 Present a Trivial Pursuit Board]
+% 0.1.2 'Short' version
% 0.1.1 Adding schemes of colors
% 0.1.0 Initial version
@@ -62,7 +63,8 @@
Epaisseur=0.8pt,%
Rotation=0,%
Jokers=true,%
- IconeJoker={\faDice}
+ IconeJoker={\faDice},%
+ VersionCourte=false
}
%====INTERN COMMANDS
@@ -113,17 +115,17 @@
\ifboolKV[TrivPurs]{Couleurs}%
{%
%Couleur du 1er camembert
- \filldraw[{\triv@purs@lstcol[1]}] (PB-47)--(GB-47) arc ({-\triv@purs@anglecases}:{\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-1) arc ({\triv@purs@anglecases}:{-\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-47)--(GB-47) arc ({-\triv@purs@anglecases}:{\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-1) arc ({\triv@purs@anglecases}:{-\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
%Couleur du 2ème
- \filldraw[{\triv@purs@lstcol[2]}] (PB-7)--(GB-7) arc ({7*\triv@purs@anglecases}:{9*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-9) arc ({9*\triv@purs@anglecases}:{7*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-7)--(GB-7) arc ({7*\triv@purs@anglecases}:{9*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-9) arc ({9*\triv@purs@anglecases}:{7*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
%Couleur du 3ème
- \filldraw[{\triv@purs@lstcol[3]}] (PB-15)--(GB-15) arc ({15*\triv@purs@anglecases}:{17*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-17) arc ({17*\triv@purs@anglecases}:{15*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-15)--(GB-15) arc ({15*\triv@purs@anglecases}:{17*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-17) arc ({17*\triv@purs@anglecases}:{15*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
%Couleur du 4ème
- \filldraw[{\triv@purs@lstcol[4]}] (PB-23)--(GB-23) arc ({23*\triv@purs@anglecases}:{25*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-25) arc ({25*\triv@purs@anglecases}:{23*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-23)--(GB-23) arc ({23*\triv@purs@anglecases}:{25*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-25) arc ({25*\triv@purs@anglecases}:{23*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
%Couleur du 5ème
- \filldraw[{\triv@purs@lstcol[5]}] (PB-31)--(GB-31) arc ({31*\triv@purs@anglecases}:{33*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-33) arc ({33*\triv@purs@anglecases}:{31*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-31)--(GB-31) arc ({31*\triv@purs@anglecases}:{33*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-33) arc ({33*\triv@purs@anglecases}:{31*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
%Couleur du 6ème
- \filldraw[{\triv@purs@lstcol[6]}] (PB-39)--(GB-39) arc ({39*\triv@purs@anglecases}:{41*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-41) arc ({41*\triv@purs@anglecases}:{39*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-39)--(GB-39) arc ({39*\triv@purs@anglecases}:{41*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-41) arc ({41*\triv@purs@anglecases}:{39*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
}%
{}%
%si on affiche les icones
@@ -141,7 +143,7 @@
\NewDocumentCommand\RemplirCaseTrivial{ m m m }{%deb + fin + numcouleur
\ifboolKV[TrivPurs]{Couleurs}%
{%
- \filldraw[{\triv@purs@lstcol[#3]}] (PB-#1)--(GB-#1) arc ({#1*\triv@purs@anglecases}:{#2*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-#2) arc ({#2*\triv@purs@anglecases}:{#1*\triv@purs@anglecases}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[#3]}] (PB-#1)--(GB-#1) arc ({#1*\triv@purs@anglecases}:{#2*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-#2) arc ({#2*\triv@purs@anglecases}:{#1*\triv@purs@anglecases}:{\triv@purs@rayonint});
}%
{}%
\ifboolKV[TrivPurs]{Icones}%
@@ -160,7 +162,7 @@
\xdef\tmpcaseap{\xinteval{#2+1}}%
\xintifboolexpr{#2 > 1 'and' #2 < 5}%
{%
- \filldraw[{\triv@purs@lstcol[#3]}] (C-#1-\tmpcase)--(D-#1-\tmpcase)--(D-#1-#2)--(C-#1-#2)--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[#3]}] (C-#1-\tmpcase)--(D-#1-\tmpcase)--(D-#1-#2)--(C-#1-#2)--cycle ;
}%
{}%
\xintifboolexpr{#2 == 5}%
@@ -178,12 +180,12 @@
{%
\xintifboolexpr{#1 == 1}%
{%
- \filldraw[{\triv@purs@lstcol[#3]}] (C-1-1)--(PB-\triv@purs@numcasavant) arc({-\triv@purs@anglecases}:{\triv@purs@anglecases}:{\triv@purs@rayonint}) --(D-1-1)--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[#3]}] (C-1-1)--(PB-\triv@purs@numcasavant) arc({-\triv@purs@anglecases}:{\triv@purs@anglecases}:{\triv@purs@rayonint}) --(D-1-1)--cycle ;
}%
{%
\xdef\tmp@ii{\xinteval{(-1+8*(#1-1))}}%
\xdef\tmp@jj{\xinteval{(\tmp@ii+2)}}%
- \filldraw[{\triv@purs@lstcol[#3]}] (C-#1-1)--(PB-\tmp@ii) arc({\tmp@ii*\triv@purs@anglecases}:{\tmp@jj*\triv@purs@anglecases}:{\triv@purs@rayonint}) --(D-#1-1)--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[#3]}] (C-#1-1)--(PB-\tmp@ii) arc({\tmp@ii*\triv@purs@anglecases}:{\tmp@jj*\triv@purs@anglecases}:{\triv@purs@rayonint}) --(D-#1-1)--cycle ;
}%
}%
{}%
@@ -398,6 +400,361 @@
\end{scope}
}
+%courte
+\NewDocumentCommand\CreationNoeudsTrivialCourt{}{%OK !!!!!!!!!!!!!!
+ %création des nœuds grand bord petit bord GB-i (et PB-i)
+ \coordinate (GB-1) at ({7.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-1) at ({7.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-2) at ({7.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-2) at ({7.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-3) at ({7.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-3) at ({7.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-4) at ({7.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-4) at ({7.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-5) at ({7.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-5) at ({7.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-6) at ({7.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-6) at ({7.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-7) at ({67.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-7) at ({67.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-8) at ({67.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-8) at ({67.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-9) at ({67.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-9) at ({67.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-10) at ({67.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-10) at ({67.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-11) at ({67.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-11) at ({67.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-12) at ({67.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-12) at ({67.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-13) at ({127.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-13) at ({127.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-14) at ({127.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-14) at ({127.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-15) at ({127.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-15) at ({127.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-16) at ({127.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-16) at ({127.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-17) at ({127.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-17) at ({127.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-18) at ({127.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-18) at ({127.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-19) at ({187.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-19) at ({187.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-20) at ({187.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-20) at ({187.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-21) at ({187.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-21) at ({187.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-22) at ({187.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-22) at ({187.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-23) at ({187.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-23) at ({187.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-24) at ({187.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-24) at ({187.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-25) at ({247.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-25) at ({247.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-26) at ({247.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-26) at ({247.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-27) at ({247.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-27) at ({247.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-28) at ({247.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-28) at ({247.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-29) at ({247.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-29) at ({247.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-30) at ({247.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-30) at ({247.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-31) at ({307.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-31) at ({307.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-32) at ({307.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-32) at ({307.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-33) at ({307.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-33) at ({307.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-34) at ({307.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-34) at ({307.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-35) at ({307.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-35) at ({307.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-36) at ({307.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-36) at ({307.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ %tests ?!?!
+% \foreach \i in {1,...,36}{%OK
+% \filldraw[teal] (GB-\i) circle[radius=1.75pt] node[font=\tiny\ttfamily] {GB-\i};
+% \filldraw[purple] (PB-\i) circle[radius=1.75pt] node[font=\tiny\ttfamily] {PB-\i};
+% }
+ %création des nœuds pour la figure centrale, boucle pour les 1ers + le dernier
+ \foreach \i in {1,...,\triv@purs@nbcat}{%
+ \coordinate (OM-\i) at ({30+(\i-1)*60}:{\triv@purs@rayonhexag}) ;
+ %\filldraw[orange] (OM-\i) circle[radius=1.75pt] node[font=\tiny\ttfamily] {OM-\i};
+ }%
+ %les nœuds des cases verticales
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-1-\j) at ($(PB-1)!\tmp@coeff!(OM-1)$) ;
+ %\filldraw[yellow] (D-1-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-1-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-2-\j) at ($(PB-6)!\tmp@coeff!(OM-1)$) ;
+ %\filldraw[yellow] (D-2-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-2-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-3-\j) at ($(PB-7)!\tmp@coeff!(OM-2)$) ;
+ %\filldraw[yellow] (D-3-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-3-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-4-\j) at ($(PB-12)!\tmp@coeff!(OM-2)$) ;
+ %\filldraw[yellow] (D-4-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-4-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-5-\j) at ($(PB-13)!\tmp@coeff!(OM-3)$) ;
+ %\filldraw[yellow] (D-5-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-5-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-6-\j) at ($(PB-18)!\tmp@coeff!(OM-3)$) ;
+ %\filldraw[yellow] (D-6-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-5-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-7-\j) at ($(PB-19)!\tmp@coeff!(OM-4)$) ;
+ %\filldraw[yellow] (D-7-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-7-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-8-\j) at ($(PB-24)!\tmp@coeff!(OM-4)$) ;
+ %\filldraw[yellow] (D-8-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-8-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-9-\j) at ($(PB-25)!\tmp@coeff!(OM-5)$) ;
+ %\filldraw[yellow] (D-9-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-9-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-10-\j) at ($(PB-30)!\tmp@coeff!(OM-5)$) ;
+ %\filldraw[yellow] (D-10-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-10-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-11-\j) at ($(PB-31)!\tmp@coeff!(OM-6)$) ;
+ %\filldraw[yellow] (D-11-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-11-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-12-\j) at ($(PB-36)!\tmp@coeff!(OM-6)$) ;
+ %\filldraw[yellow] (D-12-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-12-\j};
+ }%
+}
+
+\NewDocumentCommand\RemplirCasesTourCourt{}{%
+ %-------Vertical
+ %niveau 1 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (OM-6)--(OM-1)--(D-1-4)--(D-12-4)--cycle ;
+ \node[rotate={90},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-6)!0.5!(D-1-4)$) {\triv@purs@lsticons[2]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (D-12-4)--(D-1-4)--(D-1-3)--(D-12-3)--cycle ;
+ \node[rotate={90},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-12-4)!0.5!(D-1-3)$) {\triv@purs@lsticons[6]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (D-12-3)--(D-1-3)--(D-1-2)--(D-12-2)--cycle ;
+ \node[rotate={90},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-12-3)!0.5!(D-1-2)$) {\triv@purs@lsticons[5]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (D-12-2)--(D-1-2)--(D-1-1)--(D-12-1)--cycle ;
+ \node[rotate={90},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-12-2)!0.5!(D-1-1)$) {\triv@purs@lsticons[3]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (D-1-1)--(PB-1) arc({\triv@purs@anglecases}:{-\triv@purs@anglecases}:{\triv@purs@rayonint}) --(D-12-1)--cycle ;
+ \node[rotate={90},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-12-1)!0.5!(PB-1)$) {\triv@purs@lsticons[4]} ;
+ %niveau 2 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (OM-1)--(OM-2)--(D-3-4)--(D-2-4)--cycle ;
+ \node[rotate={90+(8)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-1)!0.5!(D-3-4)$) {\triv@purs@lsticons[3]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (D-2-4)--(D-3-4)--(D-3-3)--(D-2-3)--cycle ;
+ \node[rotate={90+(8)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-2-4)!0.5!(D-3-3)$) {\triv@purs@lsticons[1]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (D-2-3)--(D-3-3)--(D-3-2)--(D-2-2)--cycle ;
+ \node[rotate={90+(8)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-2-3)!0.5!(D-3-2)$) {\triv@purs@lsticons[6]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (D-2-2)--(D-3-2)--(D-3-1)--(D-2-1)--cycle ;
+ \node[rotate={90+(8)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-2-2)!0.5!(D-3-1)$) {\triv@purs@lsticons[4]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (D-3-1)--(PB-7) arc({67.5}:{52.5}:{\triv@purs@rayonint}) --(D-2-1)--cycle ;
+ \node[rotate={90+(8)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-2-1)!0.5!(PB-7)$) {\triv@purs@lsticons[5]} ;
+ %niveau 3 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (OM-2)--(OM-3)--(D-5-4)--(D-4-4)--cycle ;
+ \node[rotate={90+(16)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-2)!0.5!(D-5-4)$) {\triv@purs@lsticons[4]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (D-4-4)--(D-5-4)--(D-5-3)--(D-4-3)--cycle ;
+ \node[rotate={90+(16)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-4-4)!0.5!(D-5-3)$) {\triv@purs@lsticons[2]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (D-4-3)--(D-5-3)--(D-5-2)--(D-4-2)--cycle ;
+ \node[rotate={90+(16)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-4-3)!0.5!(D-5-2)$) {\triv@purs@lsticons[1]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (D-4-2)--(D-5-2)--(D-5-1)--(D-4-1)--cycle ;
+ \node[rotate={90+(16)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-4-2)!0.5!(D-5-1)$) {\triv@purs@lsticons[5]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (D-5-1)--(PB-13) arc({127.5}:{112.5}:{\triv@purs@rayonint}) --(D-4-1)--cycle ;
+ \node[rotate={90+(16)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-4-1)!0.5!(PB-13)$) {\triv@purs@lsticons[6]} ;
+ %niveau 4 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (OM-3)--(OM-4)--(D-7-4)--(D-6-4)--cycle ;
+ \node[rotate={90+(24)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-3)!0.5!(D-7-4)$) {\triv@purs@lsticons[5]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (D-6-4)--(D-7-4)--(D-7-3)--(D-6-3)--cycle ;
+ \node[rotate={90+(24)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-6-4)!0.5!(D-7-3)$) {\triv@purs@lsticons[3]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (D-6-3)--(D-7-3)--(D-7-2)--(D-6-2)--cycle ;
+ \node[rotate={90+(24)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-6-3)!0.5!(D-7-2)$) {\triv@purs@lsticons[2]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (D-6-2)--(D-7-2)--(D-7-1)--(D-6-1)--cycle ;
+ \node[rotate={90+(24)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-6-2)!0.5!(D-7-1)$) {\triv@purs@lsticons[6]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (D-7-1)--(PB-19) arc({187.5}:{172.5}:{\triv@purs@rayonint}) --(D-6-1)--cycle ;
+ \node[rotate={90+(24)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-6-1)!0.5!(PB-19)$) {\triv@purs@lsticons[1]} ;
+ %niveau 5 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (OM-4)--(OM-5)--(D-9-4)--(D-8-4)--cycle ;
+ \node[rotate={90+(32)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-4)!0.5!(D-9-4)$) {\triv@purs@lsticons[6]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (D-8-4)--(D-9-4)--(D-9-3)--(D-8-3)--cycle ;
+ \node[rotate={90+(32)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-8-4)!0.5!(D-9-3)$) {\triv@purs@lsticons[4]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (D-8-3)--(D-9-3)--(D-9-2)--(D-8-2)--cycle ;
+ \node[rotate={90+(32)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-8-3)!0.5!(D-9-2)$) {\triv@purs@lsticons[3]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (D-8-2)--(D-9-2)--(D-9-1)--(D-8-1)--cycle ;
+ \node[rotate={90+(32)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-8-2)!0.5!(D-9-1)$) {\triv@purs@lsticons[1]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (D-9-1)--(PB-25) arc({247.5}:{232.5}:{\triv@purs@rayonint}) --(D-8-1)--cycle ;
+ \node[rotate={90+(32)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-8-1)!0.5!(PB-25)$) {\triv@purs@lsticons[2]} ;
+ %niveau 6 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (OM-5)--(OM-6)--(D-11-4)--(D-10-4)--cycle ;
+ \node[rotate={90+(40)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-5)!0.5!(D-11-4)$) {\triv@purs@lsticons[1]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (D-10-4)--(D-11-4)--(D-11-3)--(D-10-3)--cycle ;
+ \node[rotate={90+(40)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-10-4)!0.5!(D-11-3)$) {\triv@purs@lsticons[5]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (D-10-3)--(D-11-3)--(D-11-2)--(D-10-2)--cycle ;
+ \node[rotate={90+(40)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-10-3)!0.5!(D-11-2)$) {\triv@purs@lsticons[4]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (D-10-2)--(D-11-2)--(D-11-1)--(D-10-1)--cycle ;
+ \node[rotate={90+(40)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-10-2)!0.5!(D-11-1)$) {\triv@purs@lsticons[2]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (D-11-1)--(PB-31) arc({307.5}:{292.5}:{\triv@purs@rayonint}) --(D-10-1)--cycle ;
+ \node[rotate={90+(40)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-10-1)!0.5!(PB-31)$) {\triv@purs@lsticons[3]} ;
+ %--------BORDS !!!
+ \ifboolKV[TrivPurs]{Couleurs}%
+ {%
+ %Secteur1
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-1)--(GB-1) arc ({7.5+0*9}:{7.5+1*9}:{\triv@purs@rayon})--(PB-2) arc ({7.5+1*9}:{7.5+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-2)--(GB-2) arc ({7.5+1*9}:{7.5+2*9}:{\triv@purs@rayon})--(PB-3) arc ({7.5+2*9}:{7.5+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-4)--(GB-4) arc ({7.5+3*9}:{7.5+4*9}:{\triv@purs@rayon})--(PB-5) arc ({7.5+4*9}:{7.5+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-5)--(GB-5) arc ({7.5+4*9}:{7.5+5*9}:{\triv@purs@rayon})--(PB-6) arc ({7.5+5*9}:{7.5+4*9}:{\triv@purs@rayonint});
+ %Secteur2
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-7)--(GB-7) arc ({7.5+60+0*9}:{7.5+60+1*9}:{\triv@purs@rayon})--(PB-8) arc ({7.5+60+1*9}:{7.5+60+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-8)--(GB-8) arc ({7.5+60+1*9}:{7.5+60+2*9}:{\triv@purs@rayon})--(PB-9) arc ({7.5+60+2*9}:{7.5+60+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-10)--(GB-10) arc ({7.5+60+3*9}:{7.5+60+4*9}:{\triv@purs@rayon})--(PB-11) arc ({7.5+60+4*9}:{7.5+60+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-11)--(GB-11) arc ({7.5+60+4*9}:{7.5+60+5*9}:{\triv@purs@rayon})--(PB-12) arc ({7.5+60+5*9}:{7.5+60+4*9}:{\triv@purs@rayonint});
+ %Secteur3
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-13)--(GB-13) arc ({7.5+120+0*9}:{7.5+120+1*9}:{\triv@purs@rayon})--(PB-14) arc ({7.5+120+1*9}:{7.5+120+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-14)--(GB-14) arc ({7.5+120+1*9}:{7.5+120+2*9}:{\triv@purs@rayon})--(PB-15) arc ({7.5+120+2*9}:{7.5+120+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-16)--(GB-16) arc ({7.5+120+3*9}:{7.5+120+4*9}:{\triv@purs@rayon})--(PB-17) arc ({7.5+120+4*9}:{7.5+120+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-17)--(GB-17) arc ({7.5+120+4*9}:{7.5+120+5*9}:{\triv@purs@rayon})--(PB-18) arc ({7.5+120+5*9}:{7.5+120+4*9}:{\triv@purs@rayonint});
+ %Secteur4
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-19)--(GB-19) arc ({7.5+180+0*9}:{7.5+180+1*9}:{\triv@purs@rayon})--(PB-20) arc ({7.5+180+1*9}:{7.5+180+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-20)--(GB-20) arc ({7.5+180+1*9}:{7.5+180+2*9}:{\triv@purs@rayon})--(PB-21) arc ({7.5+180+2*9}:{7.5+180+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-22)--(GB-22) arc ({7.5+180+3*9}:{7.5+180+4*9}:{\triv@purs@rayon})--(PB-23) arc ({7.5+180+4*9}:{7.5+180+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-23)--(GB-23) arc ({7.5+180+4*9}:{7.5+180+5*9}:{\triv@purs@rayon})--(PB-24) arc ({7.5+180+5*9}:{7.5+180+4*9}:{\triv@purs@rayonint});
+ %Secteur5
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-25)--(GB-25) arc ({7.5+240+0*9}:{7.5+240+1*9}:{\triv@purs@rayon})--(PB-26) arc ({7.5+240+1*9}:{7.5+240+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-26)--(GB-26) arc ({7.5+240+1*9}:{7.5+240+2*9}:{\triv@purs@rayon})--(PB-27) arc ({7.5+240+2*9}:{7.5+240+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-28)--(GB-28) arc ({7.5+240+3*9}:{7.5+240+4*9}:{\triv@purs@rayon})--(PB-29) arc ({7.5+240+4*9}:{7.5+240+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-29)--(GB-29) arc ({7.5+240+4*9}:{7.5+240+5*9}:{\triv@purs@rayon})--(PB-30) arc ({7.5+240+5*9}:{7.5+240+4*9}:{\triv@purs@rayonint});
+ %Secteur6
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-31)--(GB-31) arc ({7.5+300+0*9}:{7.5+300+1*9}:{\triv@purs@rayon})--(PB-32) arc ({7.5+300+1*9}:{7.5+300+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-32)--(GB-32) arc ({7.5+300+1*9}:{7.5+300+2*9}:{\triv@purs@rayon})--(PB-33) arc ({7.5+300+2*9}:{7.5+300+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-34)--(GB-34) arc ({7.5+300+3*9}:{7.5+300+4*9}:{\triv@purs@rayon})--(PB-35) arc ({7.5+300+4*9}:{7.5+300+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-35)--(GB-35) arc ({7.5+300+4*9}:{7.5+300+5*9}:{\triv@purs@rayon})--(PB-36) arc ({7.5+300+5*9}:{7.5+300+4*9}:{\triv@purs@rayonint});
+ }%
+ {}%
+ \ifboolKV[TrivPurs]{Icones}%
+ {%
+ %secteur1
+ \node[rotate={90+0.5*(7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[4]} ;
+ \node[rotate={90+0.5*(7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[3]} ;
+ \node[rotate={90+0.5*(7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[6]} ;
+ \node[rotate={90+0.5*(7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[5]} ;
+ %secteur2
+ \node[rotate={90+0.5*(2*60+7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*60+7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[5]} ;
+ \node[rotate={90+0.5*(2*60+7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*60+7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[4]} ;
+ \node[rotate={90+0.5*(2*60+7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*60+7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[1]} ;
+ \node[rotate={90+0.5*(2*60+7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*60+7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[6]} ;
+ %secteur3
+ \node[rotate={90+0.5*(2*120+7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*120+7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[6]} ;
+ \node[rotate={90+0.5*(2*120+7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*120+7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[5]} ;
+ \node[rotate={90+0.5*(2*120+7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*120+7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[2]} ;
+ \node[rotate={90+0.5*(2*120+7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*120+7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[1]} ;
+ %secteur4
+ \node[rotate={90+0.5*(2*180+7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*180+7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[1]} ;
+ \node[rotate={90+0.5*(2*180+7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*180+7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[6]} ;
+ \node[rotate={90+0.5*(2*180+7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*180+7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[3]} ;
+ \node[rotate={90+0.5*(2*180+7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*180+7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[2]} ;
+ %secteur5
+ \node[rotate={90+0.5*(2*240+7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*240+7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[2]} ;
+ \node[rotate={90+0.5*(2*240+7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*240+7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[1]} ;
+ \node[rotate={90+0.5*(2*240+7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*240+7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[4]} ;
+ \node[rotate={90+0.5*(2*240+7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*240+7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[3]} ;
+ %secteur6
+ \node[rotate={90+0.5*(2*300+7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*300+7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[3]} ;
+ \node[rotate={90+0.5*(2*300+7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*300+7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[2]} ;
+ \node[rotate={90+0.5*(2*300+7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*300+7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[5]} ;
+ \node[rotate={90+0.5*(2*300+7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*300+7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[4]} ;
+ }%
+ {}%
+
+ %les jokers
+ \ifboolKV[TrivPurs]{Icones}%
+ {%
+ \ifboolKV[TrivPurs]{Jokers}%
+ {%
+ \node[rotate=30,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({30}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ \node[rotate=90,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({90}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ \node[rotate=150,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({150}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ \node[rotate=210,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({210}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ \node[rotate=270,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({270}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ \node[rotate=330,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({330}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ }%
+ {}%
+ }%
+ {}%
+}
+\NewDocumentCommand\TraceBorduresTrivialCourt{ }{%OK Court
+ %les tracés des cases
+ \draw[EpTraits] (0,0) circle[radius=\triv@purs@rayon] ;
+ \draw[EpTraits] (0,0) circle[radius={\triv@purs@rayon-\triv@purs@hautcases}] ;
+ \foreach \i in {1,...,36}{%
+ \draw[EpTraits] (PB-\i)--(GB-\i) ;
+ }
+ \draw[EpTraits] (PB-1)--(OM-1)--(OM-6)--(PB-36) ;
+ \draw[EpTraits] (PB-6)--(OM-1)--(OM-2)--(PB-7) ;
+ \draw[EpTraits] (PB-12)--(OM-2)--(OM-3)--(PB-13) ;
+ \draw[EpTraits] (PB-18)--(OM-3)--(OM-4)--(PB-19) ;
+ \draw[EpTraits] (PB-24)--(OM-4)--(OM-5)--(PB-25) ;
+ \draw[EpTraits] (PB-30)--(OM-5)--(OM-6)--(PB-31) ;
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \draw[EpTraits] (D-2-\j)--(D-3-\j) ;
+ \draw[EpTraits] (D-4-\j)--(D-5-\j) ;
+ \draw[EpTraits] (D-6-\j)--(D-7-\j) ;
+ \draw[EpTraits] (D-8-\j)--(D-9-\j) ;
+ \draw[EpTraits] (D-10-\j)--(D-11-\j) ;
+ \draw[EpTraits] (D-12-\j)--(D-1-\j) ;
+ }%
+}
+
+\NewDocumentCommand\RemplirCamembertsTrivialCourt{ }{%numéro des camemberts, en partant de la droite
+ \ifboolKV[TrivPurs]{Couleurs}%
+ {%
+ %Couleur du 1er camembert
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-36)--(GB-36) arc ({-\triv@purs@anglecases}:{\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-1) arc ({\triv@purs@anglecases}:{-\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ %Couleur du 2ème
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-6)--(GB-6) arc ({7*\triv@purs@anglecases}:{9*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-7) arc ({9*\triv@purs@anglecases}:{7*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ %Couleur du 3ème
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-12)--(GB-12) arc ({15*\triv@purs@anglecases}:{17*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-13) arc ({17*\triv@purs@anglecases}:{15*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ %Couleur du 4ème
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-18)--(GB-18) arc ({23*\triv@purs@anglecases}:{25*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-19) arc ({25*\triv@purs@anglecases}:{23*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ %Couleur du 5ème
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-24)--(GB-24) arc ({31*\triv@purs@anglecases}:{33*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-25) arc ({33*\triv@purs@anglecases}:{31*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ %Couleur du 6ème
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-30)--(GB-30) arc ({39*\triv@purs@anglecases}:{41*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-31) arc ({41*\triv@purs@anglecases}:{39*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ }%
+ {}%
+ %si on affiche les icones
+ \ifboolKV[TrivPurs]{Icones}%
+ {%
+ \node[rotate={90+0*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[1]} ;
+ \node[rotate={90+8*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({8*\triv@purs@anglecases}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[2]} ;
+ \node[rotate={90+16*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({16*\triv@purs@anglecases}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[3]} ;
+ \node[rotate={90+24*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({24*\triv@purs@anglecases}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[4]} ;
+ \node[rotate={90+32*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({32*\triv@purs@anglecases}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[5]} ;
+ \node[rotate={90+40*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({40*\triv@purs@anglecases}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[6]} ;
+ }%
+ {}%
+}
+
%====CREATION
\NewDocumentCommand\PlateauTrivialPursuit{ O{} D<>{} }{%
\restoreKV[TrivPurs]% revenir au valeurs par défaut
@@ -433,18 +790,35 @@
\useasboundingbox (0,0) circle[radius={\triv@purs@rayon}] ;
%création
\begin{scope}[rotate=\triv@purs@rotate]
- %les nœuds OK
- \CreationNoeudsTrivial
- %test avec centre OK
- \ifboolKV[TrivPurs]{Centre}{\RemplirCentreTrivial}{}
- %camemberts OK
- \RemplirCamembertsTrivial
- %cases OK
- \RemplirCasesTour
- %bordures
- \TraceBorduresTrivial
- %logo central
- \ifboolKV[TrivPurs]{Logo}{\LogoTrivialPursuit}{}
+ \ifboolKV[TrivPurs]{VersionCourte}%
+ {%
+ %les nœuds OK
+ \CreationNoeudsTrivialCourt
+ %test avec centre OK
+ \ifboolKV[TrivPurs]{Centre}{\RemplirCentreTrivial}{}
+ %camemberts OK
+ \RemplirCamembertsTrivialCourt
+ %cases OK
+ \RemplirCasesTourCourt
+ %bordures
+ \TraceBorduresTrivialCourt
+ %logo central
+ \ifboolKV[TrivPurs]{Logo}{\LogoTrivialPursuit}{}
+ }%
+ {%
+ %les nœuds OK
+ \CreationNoeudsTrivial
+ %test avec centre OK
+ \ifboolKV[TrivPurs]{Centre}{\RemplirCentreTrivial}{}
+ %camemberts OK
+ \RemplirCamembertsTrivial
+ %cases OK
+ \RemplirCasesTour
+ %bordures
+ \TraceBorduresTrivial
+ %logo central
+ \ifboolKV[TrivPurs]{Logo}{\LogoTrivialPursuit}{}
+ }%
\end{scope}
\end{tikzpicture}%
}
@@ -477,7 +851,8 @@
Thickness=0.8pt,%
Rotation=0,%
Jokers=true,%
- IconJoker={\faDice}
+ IconJoker={\faDice},%
+ ShortVersion=false
}
%====INTERN COMMANDS
@@ -528,17 +903,17 @@
\ifboolKV[TrivPursEN]{Colors}%
{%
%Couleur du 1er camembert
- \filldraw[{\triv@purs@lstcol[1]}] (PB-47)--(GB-47) arc ({-\triv@purs@anglecases}:{\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-1) arc ({\triv@purs@anglecases}:{-\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-47)--(GB-47) arc ({-\triv@purs@anglecases}:{\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-1) arc ({\triv@purs@anglecases}:{-\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
%Couleur du 2ème
- \filldraw[{\triv@purs@lstcol[2]}] (PB-7)--(GB-7) arc ({7*\triv@purs@anglecases}:{9*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-9) arc ({9*\triv@purs@anglecases}:{7*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-7)--(GB-7) arc ({7*\triv@purs@anglecases}:{9*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-9) arc ({9*\triv@purs@anglecases}:{7*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
%Couleur du 3ème
- \filldraw[{\triv@purs@lstcol[3]}] (PB-15)--(GB-15) arc ({15*\triv@purs@anglecases}:{17*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-17) arc ({17*\triv@purs@anglecases}:{15*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-15)--(GB-15) arc ({15*\triv@purs@anglecases}:{17*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-17) arc ({17*\triv@purs@anglecases}:{15*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
%Couleur du 4ème
- \filldraw[{\triv@purs@lstcol[4]}] (PB-23)--(GB-23) arc ({23*\triv@purs@anglecases}:{25*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-25) arc ({25*\triv@purs@anglecases}:{23*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-23)--(GB-23) arc ({23*\triv@purs@anglecases}:{25*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-25) arc ({25*\triv@purs@anglecases}:{23*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
%Couleur du 5ème
- \filldraw[{\triv@purs@lstcol[5]}] (PB-31)--(GB-31) arc ({31*\triv@purs@anglecases}:{33*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-33) arc ({33*\triv@purs@anglecases}:{31*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-31)--(GB-31) arc ({31*\triv@purs@anglecases}:{33*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-33) arc ({33*\triv@purs@anglecases}:{31*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
%Couleur du 6ème
- \filldraw[{\triv@purs@lstcol[6]}] (PB-39)--(GB-39) arc ({39*\triv@purs@anglecases}:{41*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-41) arc ({41*\triv@purs@anglecases}:{39*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-39)--(GB-39) arc ({39*\triv@purs@anglecases}:{41*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-41) arc ({41*\triv@purs@anglecases}:{39*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
}%
{}%
%si on affiche les icones
@@ -556,7 +931,7 @@
\NewDocumentCommand\FillCellTrivial{ m m m }{%deb + fin + numcouleur
\ifboolKV[TrivPursEN]{Colors}%
{%
- \filldraw[{\triv@purs@lstcol[#3]}] (PB-#1)--(GB-#1) arc ({#1*\triv@purs@anglecases}:{#2*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-#2) arc ({#2*\triv@purs@anglecases}:{#1*\triv@purs@anglecases}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[#3]}] (PB-#1)--(GB-#1) arc ({#1*\triv@purs@anglecases}:{#2*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-#2) arc ({#2*\triv@purs@anglecases}:{#1*\triv@purs@anglecases}:{\triv@purs@rayonint});
}%
{}%
\ifboolKV[TrivPursEN]{Icons}%
@@ -575,17 +950,17 @@
\xdef\tmpcaseap{\xinteval{#2+1}}%
\xintifboolexpr{#2 > 1 'and' #2 < 5}%
{%
- \filldraw[{\triv@purs@lstcol[#3]}] (C-#1-\tmpcase)--(D-#1-\tmpcase)--(D-#1-#2)--(C-#1-#2)--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[#3]}] (C-#1-\tmpcase)--(D-#1-\tmpcase)--(D-#1-#2)--(C-#1-#2)--cycle ;
}%
{}%
\xintifboolexpr{#2 == 5}%
{%
\xintifboolexpr{#1 == 1}%
{%
- \filldraw[{\triv@purs@lstcol[#3]}] (C-#1-\tmpcase)--(D-#1-\tmpcase)--(OM-#1)--(OM-6)--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[#3]}] (C-#1-\tmpcase)--(D-#1-\tmpcase)--(OM-#1)--(OM-6)--cycle ;
}%
{%
- \filldraw[{\triv@purs@lstcol[#3]}] (C-#1-\tmpcase)--(D-#1-\tmpcase)--(OM-#1)--(OM-\tmpnivav)--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[#3]}] (C-#1-\tmpcase)--(D-#1-\tmpcase)--(OM-#1)--(OM-\tmpnivav)--cycle ;
}%
}%
{}%
@@ -593,12 +968,12 @@
{%
\xintifboolexpr{#1 == 1}%
{%
- \filldraw[{\triv@purs@lstcol[#3]}] (C-1-1)--(PB-\triv@purs@numcasavant) arc({-\triv@purs@anglecases}:{\triv@purs@anglecases}:{\triv@purs@rayonint}) --(D-1-1)--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[#3]}] (C-1-1)--(PB-\triv@purs@numcasavant) arc({-\triv@purs@anglecases}:{\triv@purs@anglecases}:{\triv@purs@rayonint}) --(D-1-1)--cycle ;
}%
{%
\xdef\tmp@ii{\xinteval{(-1+8*(#1-1))}}%
\xdef\tmp@jj{\xinteval{(\tmp@ii+2)}}%
- \filldraw[{\triv@purs@lstcol[#3]}] (C-#1-1)--(PB-\tmp@ii) arc({\tmp@ii*\triv@purs@anglecases}:{\tmp@jj*\triv@purs@anglecases}:{\triv@purs@rayonint}) --(D-#1-1)--cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[#3]}] (C-#1-1)--(PB-\tmp@ii) arc({\tmp@ii*\triv@purs@anglecases}:{\tmp@jj*\triv@purs@anglecases}:{\triv@purs@rayonint}) --(D-#1-1)--cycle ;
}%
}%
{}%
@@ -766,7 +1141,7 @@
\begin{scope}[shift={(0:{0.15*\triv@purs@lgcamemb})}]
\ifboolKV[TrivPursEN]{Colors}%
{%
- \filldraw[{\triv@purs@lstcol[1]}] (0,0)--({-30}:{0.765*\triv@purs@lgcamemb}) arc (-30:30:{0.765*\triv@purs@lgcamemb}) -- cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (0,0)--({-30}:{0.765*\triv@purs@lgcamemb}) arc (-30:30:{0.765*\triv@purs@lgcamemb}) -- cycle ;
}%
{}%
\draw[EpTraitsPlus] (0,0)--({-30}:{0.765*\triv@purs@lgcamemb}) arc (-30:30:{0.765*\triv@purs@lgcamemb}) -- cycle ;
@@ -774,7 +1149,7 @@
\begin{scope}[shift={(60:{0.15*\triv@purs@lgcamemb})}]
\ifboolKV[TrivPursEN]{Colors}%
{%
- \filldraw[{\triv@purs@lstcol[2]}] (0,0)--({30}:{0.765*\triv@purs@lgcamemb}) arc (30:90:{0.765*\triv@purs@lgcamemb}) -- cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (0,0)--({30}:{0.765*\triv@purs@lgcamemb}) arc (30:90:{0.765*\triv@purs@lgcamemb}) -- cycle ;
}%
{}%
\draw[EpTraitsPlus] (0,0)--({30}:{0.765*\triv@purs@lgcamemb}) arc (30:90:{0.765*\triv@purs@lgcamemb}) -- cycle ;
@@ -782,7 +1157,7 @@
\begin{scope}[shift={(120:{0.15*\triv@purs@lgcamemb})}]
\ifboolKV[TrivPursEN]{Colors}%
{%
- \filldraw[{\triv@purs@lstcol[3]}] (0,0)--({90}:{0.765*\triv@purs@lgcamemb}) arc (90:150:{0.765*\triv@purs@lgcamemb}) -- cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (0,0)--({90}:{0.765*\triv@purs@lgcamemb}) arc (90:150:{0.765*\triv@purs@lgcamemb}) -- cycle ;
}%
{}%
\draw[EpTraitsPlus] (0,0)--({90}:{0.765*\triv@purs@lgcamemb}) arc (90:150:{0.765*\triv@purs@lgcamemb}) -- cycle ;
@@ -790,7 +1165,7 @@
\begin{scope}[shift={(180:{0.15*\triv@purs@lgcamemb})}]
\ifboolKV[TrivPursEN]{Colors}%
{%
- \filldraw[{\triv@purs@lstcol[4]}] (0,0)--({150}:{0.765*\triv@purs@lgcamemb}) arc (150:210:{0.765*\triv@purs@lgcamemb}) -- cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (0,0)--({150}:{0.765*\triv@purs@lgcamemb}) arc (150:210:{0.765*\triv@purs@lgcamemb}) -- cycle ;
}%
{}%
\draw[EpTraitsPlus] (0,0)--({150}:{0.765*\triv@purs@lgcamemb}) arc (150:210:{0.765*\triv@purs@lgcamemb}) -- cycle ;
@@ -798,7 +1173,7 @@
\begin{scope}[shift={(240:{0.15*\triv@purs@lgcamemb})}]
\ifboolKV[TrivPursEN]{Colors}%
{%
- \filldraw[{\triv@purs@lstcol[5]}] (0,0)--({210}:{0.765*\triv@purs@lgcamemb}) arc (210:270:{0.765*\triv@purs@lgcamemb}) -- cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (0,0)--({210}:{0.765*\triv@purs@lgcamemb}) arc (210:270:{0.765*\triv@purs@lgcamemb}) -- cycle ;
}%
{}%
\draw[EpTraitsPlus] (0,0)--({210}:{0.765*\triv@purs@lgcamemb}) arc (210:270:{0.765*\triv@purs@lgcamemb}) -- cycle ;
@@ -806,13 +1181,368 @@
\begin{scope}[shift={(300:{0.15*\triv@purs@lgcamemb})}]
\ifboolKV[TrivPursEN]{Colors}%
{%
- \filldraw[{\triv@purs@lstcol[6]}] (0,0)--({270}:{0.765*\triv@purs@lgcamemb}) arc (270:330:{0.765*\triv@purs@lgcamemb}) -- cycle ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (0,0)--({270}:{0.765*\triv@purs@lgcamemb}) arc (270:330:{0.765*\triv@purs@lgcamemb}) -- cycle ;
}%
{}%
\draw[EpTraitsPlus] (0,0)--({270}:{0.765*\triv@purs@lgcamemb}) arc (270:330:{0.765*\triv@purs@lgcamemb}) -- cycle ;
\end{scope}
}
+%courte
+\NewDocumentCommand\CreationNodesTrivialShort{}{%OK !!!!!!!!!!!!!!
+ %création des nœuds grand bord petit bord GB-i (et PB-i)
+ \coordinate (GB-1) at ({7.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-1) at ({7.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-2) at ({7.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-2) at ({7.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-3) at ({7.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-3) at ({7.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-4) at ({7.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-4) at ({7.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-5) at ({7.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-5) at ({7.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-6) at ({7.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-6) at ({7.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-7) at ({67.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-7) at ({67.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-8) at ({67.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-8) at ({67.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-9) at ({67.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-9) at ({67.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-10) at ({67.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-10) at ({67.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-11) at ({67.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-11) at ({67.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-12) at ({67.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-12) at ({67.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-13) at ({127.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-13) at ({127.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-14) at ({127.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-14) at ({127.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-15) at ({127.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-15) at ({127.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-16) at ({127.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-16) at ({127.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-17) at ({127.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-17) at ({127.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-18) at ({127.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-18) at ({127.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-19) at ({187.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-19) at ({187.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-20) at ({187.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-20) at ({187.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-21) at ({187.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-21) at ({187.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-22) at ({187.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-22) at ({187.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-23) at ({187.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-23) at ({187.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-24) at ({187.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-24) at ({187.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-25) at ({247.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-25) at ({247.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-26) at ({247.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-26) at ({247.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-27) at ({247.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-27) at ({247.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-28) at ({247.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-28) at ({247.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-29) at ({247.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-29) at ({247.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-30) at ({247.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-30) at ({247.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-31) at ({307.5}:{\triv@purs@rayon}) ;
+ \coordinate (PB-31) at ({307.5}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-32) at ({307.5+9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-32) at ({307.5+9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-33) at ({307.5+2*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-33) at ({307.5+2*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-34) at ({307.5+3*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-34) at ({307.5+3*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-35) at ({307.5+4*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-35) at ({307.5+4*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ \coordinate (GB-36) at ({307.5+5*9}:{\triv@purs@rayon}) ;
+ \coordinate (PB-36) at ({307.5+5*9}:{\triv@purs@rayon-\triv@purs@hautcases}) ;
+ %tests ?!?!
+% \foreach \i in {1,...,36}{%OK
+% \draw[EpTraits,fill=teal] (GB-\i) circle[radius=1.75pt] node[font=\tiny\ttfamily] {GB-\i};
+% \draw[EpTraits,fill=purple] (PB-\i) circle[radius=1.75pt] node[font=\tiny\ttfamily] {PB-\i};
+% }
+ %création des nœuds pour la figure centrale, boucle pour les 1ers + le dernier
+ \foreach \i in {1,...,\triv@purs@nbcat}{%
+ \coordinate (OM-\i) at ({30+(\i-1)*60}:{\triv@purs@rayonhexag}) ;
+ %\draw[EpTraits,fill=orange] (OM-\i) circle[radius=1.75pt] node[font=\tiny\ttfamily] {OM-\i};
+ }%
+ %les nœuds des cases verticales
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-1-\j) at ($(PB-1)!\tmp@coeff!(OM-1)$) ;
+ %\draw[EpTraits,fill=yellow] (D-1-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-1-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-2-\j) at ($(PB-6)!\tmp@coeff!(OM-1)$) ;
+ %\draw[EpTraits,fill=yellow] (D-2-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-2-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-3-\j) at ($(PB-7)!\tmp@coeff!(OM-2)$) ;
+ %\draw[EpTraits,fill=yellow] (D-3-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-3-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-4-\j) at ($(PB-12)!\tmp@coeff!(OM-2)$) ;
+ %\draw[EpTraits,fill=yellow] (D-4-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-4-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-5-\j) at ($(PB-13)!\tmp@coeff!(OM-3)$) ;
+ %\draw[EpTraits,fill=yellow] (D-5-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-5-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-6-\j) at ($(PB-18)!\tmp@coeff!(OM-3)$) ;
+ %\draw[EpTraits,fill=yellow] (D-6-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-5-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-7-\j) at ($(PB-19)!\tmp@coeff!(OM-4)$) ;
+ %\draw[EpTraits,fill=yellow] (D-7-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-7-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-8-\j) at ($(PB-24)!\tmp@coeff!(OM-4)$) ;
+ %\draw[EpTraits,fill=yellow] (D-8-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-8-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-9-\j) at ($(PB-25)!\tmp@coeff!(OM-5)$) ;
+ %\draw[EpTraits,fill=yellow] (D-9-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-9-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-10-\j) at ($(PB-30)!\tmp@coeff!(OM-5)$) ;
+ %\draw[EpTraits,fill=yellow] (D-10-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-10-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-11-\j) at ($(PB-31)!\tmp@coeff!(OM-6)$) ;
+ %\draw[EpTraits,fill=yellow] (D-11-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-11-\j};
+ }%
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \xdef\tmp@coeff{\xintfloateval{\j/(\triv@purs@nbcat-1)}}%
+ \coordinate (D-12-\j) at ($(PB-36)!\tmp@coeff!(OM-6)$) ;
+ %\draw[EpTraits,fill=yellow] (D-12-\j) circle[radius=1.75pt] node[font=\tiny\ttfamily] {D-12-\j};
+ }%
+}
+
+\NewDocumentCommand\FillCellsBorderShort{}{%
+ %-------Vertical
+ %niveau 1 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (OM-6)--(OM-1)--(D-1-4)--(D-12-4)--cycle ;
+ \node[rotate={90},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-6)!0.5!(D-1-4)$) {\triv@purs@lsticons[2]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (D-12-4)--(D-1-4)--(D-1-3)--(D-12-3)--cycle ;
+ \node[rotate={90},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-12-4)!0.5!(D-1-3)$) {\triv@purs@lsticons[6]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (D-12-3)--(D-1-3)--(D-1-2)--(D-12-2)--cycle ;
+ \node[rotate={90},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-12-3)!0.5!(D-1-2)$) {\triv@purs@lsticons[5]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (D-12-2)--(D-1-2)--(D-1-1)--(D-12-1)--cycle ;
+ \node[rotate={90},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-12-2)!0.5!(D-1-1)$) {\triv@purs@lsticons[3]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (D-1-1)--(PB-1) arc({\triv@purs@anglecases}:{-\triv@purs@anglecases}:{\triv@purs@rayonint}) --(D-12-1)--cycle ;
+ \node[rotate={90},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-12-1)!0.5!(PB-1)$) {\triv@purs@lsticons[4]} ;
+ %niveau 2 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (OM-1)--(OM-2)--(D-3-4)--(D-2-4)--cycle ;
+ \node[rotate={90+(8)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-1)!0.5!(D-3-4)$) {\triv@purs@lsticons[3]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (D-2-4)--(D-3-4)--(D-3-3)--(D-2-3)--cycle ;
+ \node[rotate={90+(8)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-2-4)!0.5!(D-3-3)$) {\triv@purs@lsticons[1]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (D-2-3)--(D-3-3)--(D-3-2)--(D-2-2)--cycle ;
+ \node[rotate={90+(8)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-2-3)!0.5!(D-3-2)$) {\triv@purs@lsticons[6]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (D-2-2)--(D-3-2)--(D-3-1)--(D-2-1)--cycle ;
+ \node[rotate={90+(8)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-2-2)!0.5!(D-3-1)$) {\triv@purs@lsticons[4]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (D-3-1)--(PB-7) arc({67.5}:{52.5}:{\triv@purs@rayonint}) --(D-2-1)--cycle ;
+ \node[rotate={90+(8)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-2-1)!0.5!(PB-7)$) {\triv@purs@lsticons[5]} ;
+ %niveau 3 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (OM-2)--(OM-3)--(D-5-4)--(D-4-4)--cycle ;
+ \node[rotate={90+(16)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-2)!0.5!(D-5-4)$) {\triv@purs@lsticons[4]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (D-4-4)--(D-5-4)--(D-5-3)--(D-4-3)--cycle ;
+ \node[rotate={90+(16)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-4-4)!0.5!(D-5-3)$) {\triv@purs@lsticons[2]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (D-4-3)--(D-5-3)--(D-5-2)--(D-4-2)--cycle ;
+ \node[rotate={90+(16)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-4-3)!0.5!(D-5-2)$) {\triv@purs@lsticons[1]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (D-4-2)--(D-5-2)--(D-5-1)--(D-4-1)--cycle ;
+ \node[rotate={90+(16)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-4-2)!0.5!(D-5-1)$) {\triv@purs@lsticons[5]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (D-5-1)--(PB-13) arc({127.5}:{112.5}:{\triv@purs@rayonint}) --(D-4-1)--cycle ;
+ \node[rotate={90+(16)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-4-1)!0.5!(PB-13)$) {\triv@purs@lsticons[6]} ;
+ %niveau 4 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (OM-3)--(OM-4)--(D-7-4)--(D-6-4)--cycle ;
+ \node[rotate={90+(24)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-3)!0.5!(D-7-4)$) {\triv@purs@lsticons[5]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (D-6-4)--(D-7-4)--(D-7-3)--(D-6-3)--cycle ;
+ \node[rotate={90+(24)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-6-4)!0.5!(D-7-3)$) {\triv@purs@lsticons[3]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (D-6-3)--(D-7-3)--(D-7-2)--(D-6-2)--cycle ;
+ \node[rotate={90+(24)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-6-3)!0.5!(D-7-2)$) {\triv@purs@lsticons[2]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (D-6-2)--(D-7-2)--(D-7-1)--(D-6-1)--cycle ;
+ \node[rotate={90+(24)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-6-2)!0.5!(D-7-1)$) {\triv@purs@lsticons[6]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (D-7-1)--(PB-19) arc({187.5}:{172.5}:{\triv@purs@rayonint}) --(D-6-1)--cycle ;
+ \node[rotate={90+(24)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-6-1)!0.5!(PB-19)$) {\triv@purs@lsticons[1]} ;
+ %niveau 5 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (OM-4)--(OM-5)--(D-9-4)--(D-8-4)--cycle ;
+ \node[rotate={90+(32)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-4)!0.5!(D-9-4)$) {\triv@purs@lsticons[6]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (D-8-4)--(D-9-4)--(D-9-3)--(D-8-3)--cycle ;
+ \node[rotate={90+(32)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-8-4)!0.5!(D-9-3)$) {\triv@purs@lsticons[4]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (D-8-3)--(D-9-3)--(D-9-2)--(D-8-2)--cycle ;
+ \node[rotate={90+(32)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-8-3)!0.5!(D-9-2)$) {\triv@purs@lsticons[3]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (D-8-2)--(D-9-2)--(D-9-1)--(D-8-1)--cycle ;
+ \node[rotate={90+(32)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-8-2)!0.5!(D-9-1)$) {\triv@purs@lsticons[1]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (D-9-1)--(PB-25) arc({247.5}:{232.5}:{\triv@purs@rayonint}) --(D-8-1)--cycle ;
+ \node[rotate={90+(32)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-8-1)!0.5!(PB-25)$) {\triv@purs@lsticons[2]} ;
+ %niveau 6 vertical
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (OM-5)--(OM-6)--(D-11-4)--(D-10-4)--cycle ;
+ \node[rotate={90+(40)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(OM-5)!0.5!(D-11-4)$) {\triv@purs@lsticons[1]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (D-10-4)--(D-11-4)--(D-11-3)--(D-10-3)--cycle ;
+ \node[rotate={90+(40)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-10-4)!0.5!(D-11-3)$) {\triv@purs@lsticons[5]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (D-10-3)--(D-11-3)--(D-11-2)--(D-10-2)--cycle ;
+ \node[rotate={90+(40)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-10-3)!0.5!(D-11-2)$) {\triv@purs@lsticons[4]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (D-10-2)--(D-11-2)--(D-11-1)--(D-10-1)--cycle ;
+ \node[rotate={90+(40)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-10-2)!0.5!(D-11-1)$) {\triv@purs@lsticons[2]} ;
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (D-11-1)--(PB-31) arc({307.5}:{292.5}:{\triv@purs@rayonint}) --(D-10-1)--cycle ;
+ \node[rotate={90+(40)*\triv@purs@anglecases},scale={0.75*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ($(D-10-1)!0.5!(PB-31)$) {\triv@purs@lsticons[3]} ;
+ %--------BORDS !!!
+ \ifboolKV[TrivPursEN]{Colors}%
+ {%
+ %Secteur1
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-1)--(GB-1) arc ({7.5+0*9}:{7.5+1*9}:{\triv@purs@rayon})--(PB-2) arc ({7.5+1*9}:{7.5+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-2)--(GB-2) arc ({7.5+1*9}:{7.5+2*9}:{\triv@purs@rayon})--(PB-3) arc ({7.5+2*9}:{7.5+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-4)--(GB-4) arc ({7.5+3*9}:{7.5+4*9}:{\triv@purs@rayon})--(PB-5) arc ({7.5+4*9}:{7.5+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-5)--(GB-5) arc ({7.5+4*9}:{7.5+5*9}:{\triv@purs@rayon})--(PB-6) arc ({7.5+5*9}:{7.5+4*9}:{\triv@purs@rayonint});
+ %Secteur2
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-7)--(GB-7) arc ({7.5+60+0*9}:{7.5+60+1*9}:{\triv@purs@rayon})--(PB-8) arc ({7.5+60+1*9}:{7.5+60+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-8)--(GB-8) arc ({7.5+60+1*9}:{7.5+60+2*9}:{\triv@purs@rayon})--(PB-9) arc ({7.5+60+2*9}:{7.5+60+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-10)--(GB-10) arc ({7.5+60+3*9}:{7.5+60+4*9}:{\triv@purs@rayon})--(PB-11) arc ({7.5+60+4*9}:{7.5+60+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-11)--(GB-11) arc ({7.5+60+4*9}:{7.5+60+5*9}:{\triv@purs@rayon})--(PB-12) arc ({7.5+60+5*9}:{7.5+60+4*9}:{\triv@purs@rayonint});
+ %Secteur3
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-13)--(GB-13) arc ({7.5+120+0*9}:{7.5+120+1*9}:{\triv@purs@rayon})--(PB-14) arc ({7.5+120+1*9}:{7.5+120+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-14)--(GB-14) arc ({7.5+120+1*9}:{7.5+120+2*9}:{\triv@purs@rayon})--(PB-15) arc ({7.5+120+2*9}:{7.5+120+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-16)--(GB-16) arc ({7.5+120+3*9}:{7.5+120+4*9}:{\triv@purs@rayon})--(PB-17) arc ({7.5+120+4*9}:{7.5+120+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-17)--(GB-17) arc ({7.5+120+4*9}:{7.5+120+5*9}:{\triv@purs@rayon})--(PB-18) arc ({7.5+120+5*9}:{7.5+120+4*9}:{\triv@purs@rayonint});
+ %Secteur4
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-19)--(GB-19) arc ({7.5+180+0*9}:{7.5+180+1*9}:{\triv@purs@rayon})--(PB-20) arc ({7.5+180+1*9}:{7.5+180+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-20)--(GB-20) arc ({7.5+180+1*9}:{7.5+180+2*9}:{\triv@purs@rayon})--(PB-21) arc ({7.5+180+2*9}:{7.5+180+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-22)--(GB-22) arc ({7.5+180+3*9}:{7.5+180+4*9}:{\triv@purs@rayon})--(PB-23) arc ({7.5+180+4*9}:{7.5+180+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-23)--(GB-23) arc ({7.5+180+4*9}:{7.5+180+5*9}:{\triv@purs@rayon})--(PB-24) arc ({7.5+180+5*9}:{7.5+180+4*9}:{\triv@purs@rayonint});
+ %Secteur5
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-25)--(GB-25) arc ({7.5+240+0*9}:{7.5+240+1*9}:{\triv@purs@rayon})--(PB-26) arc ({7.5+240+1*9}:{7.5+240+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-26)--(GB-26) arc ({7.5+240+1*9}:{7.5+240+2*9}:{\triv@purs@rayon})--(PB-27) arc ({7.5+240+2*9}:{7.5+240+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-28)--(GB-28) arc ({7.5+240+3*9}:{7.5+240+4*9}:{\triv@purs@rayon})--(PB-29) arc ({7.5+240+4*9}:{7.5+240+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-29)--(GB-29) arc ({7.5+240+4*9}:{7.5+240+5*9}:{\triv@purs@rayon})--(PB-30) arc ({7.5+240+5*9}:{7.5+240+4*9}:{\triv@purs@rayonint});
+ %Secteur6
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-31)--(GB-31) arc ({7.5+300+0*9}:{7.5+300+1*9}:{\triv@purs@rayon})--(PB-32) arc ({7.5+300+1*9}:{7.5+300+0*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-32)--(GB-32) arc ({7.5+300+1*9}:{7.5+300+2*9}:{\triv@purs@rayon})--(PB-33) arc ({7.5+300+2*9}:{7.5+300+1*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-34)--(GB-34) arc ({7.5+300+3*9}:{7.5+300+4*9}:{\triv@purs@rayon})--(PB-35) arc ({7.5+300+4*9}:{7.5+300+3*9}:{\triv@purs@rayonint});
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-35)--(GB-35) arc ({7.5+300+4*9}:{7.5+300+5*9}:{\triv@purs@rayon})--(PB-36) arc ({7.5+300+5*9}:{7.5+300+4*9}:{\triv@purs@rayonint});
+ }%
+ {}%
+ \ifboolKV[TrivPursEN]{Icons}%
+ {%
+ %secteur1
+ \node[rotate={90+0.5*(7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[4]} ;
+ \node[rotate={90+0.5*(7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[3]} ;
+ \node[rotate={90+0.5*(7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[6]} ;
+ \node[rotate={90+0.5*(7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[5]} ;
+ %secteur2
+ \node[rotate={90+0.5*(2*60+7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*60+7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[5]} ;
+ \node[rotate={90+0.5*(2*60+7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*60+7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[4]} ;
+ \node[rotate={90+0.5*(2*60+7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*60+7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[1]} ;
+ \node[rotate={90+0.5*(2*60+7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*60+7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[6]} ;
+ %secteur3
+ \node[rotate={90+0.5*(2*120+7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*120+7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[6]} ;
+ \node[rotate={90+0.5*(2*120+7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*120+7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[5]} ;
+ \node[rotate={90+0.5*(2*120+7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*120+7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[2]} ;
+ \node[rotate={90+0.5*(2*120+7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*120+7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[1]} ;
+ %secteur4
+ \node[rotate={90+0.5*(2*180+7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*180+7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[1]} ;
+ \node[rotate={90+0.5*(2*180+7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*180+7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[6]} ;
+ \node[rotate={90+0.5*(2*180+7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*180+7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[3]} ;
+ \node[rotate={90+0.5*(2*180+7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*180+7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[2]} ;
+ %secteur5
+ \node[rotate={90+0.5*(2*240+7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*240+7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[2]} ;
+ \node[rotate={90+0.5*(2*240+7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*240+7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[1]} ;
+ \node[rotate={90+0.5*(2*240+7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*240+7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[4]} ;
+ \node[rotate={90+0.5*(2*240+7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*240+7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[3]} ;
+ %secteur6
+ \node[rotate={90+0.5*(2*300+7.5+0*9+7.5+1*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*300+7.5+7.5+1*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[3]} ;
+ \node[rotate={90+0.5*(2*300+7.5+1*9+7.5+2*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*300+7.5+1*9+7.5+2*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[2]} ;
+ \node[rotate={90+0.5*(2*300+7.5+3*9+7.5+4*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*300+7.5+3*9+7.5+4*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[5]} ;
+ \node[rotate={90+0.5*(2*300+7.5+5*9+7.5+5*9)},scale={\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0.5*(2*300+7.5+4*9+7.5+5*9)}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[4]} ;
+ }%
+ {}%
+
+ %les jokers
+ \ifboolKV[TrivPursEN]{Icons}%
+ {%
+ \ifboolKV[TrivPursEN]{Jokers}%
+ {%
+ \node[rotate=30,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({30}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ \node[rotate=90,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({90}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ \node[rotate=150,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({150}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ \node[rotate=210,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({210}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ \node[rotate=270,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({270}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ \node[rotate=330,scale={\triv@purs@scaleicons*\triv@purs@hautcases}] at ({330}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@iconjok} ;
+ }%
+ {}%
+ }%
+ {}%
+}
+\NewDocumentCommand\DrawBordersTrivialShort{ }{%OK Court
+ %les tracés des cases
+ \draw[EpTraits] (0,0) circle[radius=\triv@purs@rayon] ;
+ \draw[EpTraits] (0,0) circle[radius={\triv@purs@rayon-\triv@purs@hautcases}] ;
+ \foreach \i in {1,...,36}{%
+ \draw[EpTraits] (PB-\i)--(GB-\i) ;
+ }
+ \draw[EpTraits] (PB-1)--(OM-1)--(OM-6)--(PB-36) ;
+ \draw[EpTraits] (PB-6)--(OM-1)--(OM-2)--(PB-7) ;
+ \draw[EpTraits] (PB-12)--(OM-2)--(OM-3)--(PB-13) ;
+ \draw[EpTraits] (PB-18)--(OM-3)--(OM-4)--(PB-19) ;
+ \draw[EpTraits] (PB-24)--(OM-4)--(OM-5)--(PB-25) ;
+ \draw[EpTraits] (PB-30)--(OM-5)--(OM-6)--(PB-31) ;
+ \foreach \j in {1,...,\xinteval{\triv@purs@nbcat-2}}{%
+ \draw[EpTraits] (D-2-\j)--(D-3-\j) ;
+ \draw[EpTraits] (D-4-\j)--(D-5-\j) ;
+ \draw[EpTraits] (D-6-\j)--(D-7-\j) ;
+ \draw[EpTraits] (D-8-\j)--(D-9-\j) ;
+ \draw[EpTraits] (D-10-\j)--(D-11-\j) ;
+ \draw[EpTraits] (D-12-\j)--(D-1-\j) ;
+ }%
+}
+
+\NewDocumentCommand\FillCamembersTrivialShort{ }{%numéro des camemberts, en partant de la droite
+ \ifboolKV[TrivPursEN]{Colors}%
+ {%
+ %Couleur du 1er camembert
+ \draw[EpTraits,fill={\triv@purs@lstcol[1]}] (PB-36)--(GB-36) arc ({-\triv@purs@anglecases}:{\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-1) arc ({\triv@purs@anglecases}:{-\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ %Couleur du 2ème
+ \draw[EpTraits,fill={\triv@purs@lstcol[2]}] (PB-6)--(GB-6) arc ({7*\triv@purs@anglecases}:{9*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-7) arc ({9*\triv@purs@anglecases}:{7*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ %Couleur du 3ème
+ \draw[EpTraits,fill={\triv@purs@lstcol[3]}] (PB-12)--(GB-12) arc ({15*\triv@purs@anglecases}:{17*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-13) arc ({17*\triv@purs@anglecases}:{15*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ %Couleur du 4ème
+ \draw[EpTraits,fill={\triv@purs@lstcol[4]}] (PB-18)--(GB-18) arc ({23*\triv@purs@anglecases}:{25*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-19) arc ({25*\triv@purs@anglecases}:{23*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ %Couleur du 5ème
+ \draw[EpTraits,fill={\triv@purs@lstcol[5]}] (PB-24)--(GB-24) arc ({31*\triv@purs@anglecases}:{33*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-25) arc ({33*\triv@purs@anglecases}:{31*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ %Couleur du 6ème
+ \draw[EpTraits,fill={\triv@purs@lstcol[6]}] (PB-30)--(GB-30) arc ({39*\triv@purs@anglecases}:{41*\triv@purs@anglecases}:{\triv@purs@rayon})--(PB-31) arc ({41*\triv@purs@anglecases}:{39*\triv@purs@anglecases}:{\triv@purs@rayonint})--cycle ;
+ }%
+ {}%
+ %si on affiche les icones
+ \ifboolKV[TrivPursEN]{Icons}%
+ {%
+ \node[rotate={90+0*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({0}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[1]} ;
+ \node[rotate={90+8*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({8*\triv@purs@anglecases}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[2]} ;
+ \node[rotate={90+16*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({16*\triv@purs@anglecases}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[3]} ;
+ \node[rotate={90+24*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({24*\triv@purs@anglecases}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[4]} ;
+ \node[rotate={90+32*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({32*\triv@purs@anglecases}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[5]} ;
+ \node[rotate={90+40*\triv@purs@anglecases},scale={1.5*\triv@purs@scaleicons*\triv@purs@hautcases},anchor=center] at ({40*\triv@purs@anglecases}:{\triv@purs@rayon-0.5*\triv@purs@hautcases}) {\triv@purs@lsticons[6]} ;
+ }%
+ {}%
+}
+
%====CREATION
\NewDocumentCommand\BoardTrivialPursuit{ O{} D<>{} }{%
\restoreKV[TrivPursEN]% revenir au valeurs par défaut
@@ -848,18 +1578,35 @@
\useasboundingbox (0,0) circle[radius={\triv@purs@rayon}] ;
%création
\begin{scope}[rotate=\triv@purs@rotate]
- %les nœuds OK
- \CreationNodesTrivial
- %test avec centre OK
- \ifboolKV[TrivPursEN]{Center}{\FillCenterTrivial}{}
- %camemberts OK
- \FillCamembersTrivial
- %cases OK
- \FillCellsBorder
- %bordures
- \DrawBordersTrivial
- %logo central
- \ifboolKV[TrivPursEN]{Logo}{\LogoCenterTrivialPursuit}{}
+ \ifboolKV[TrivPursEN]{ShortVersion}%
+ {%
+ %les nœuds OK
+ \CreationNodesTrivialShort
+ %test avec centre OK
+ \ifboolKV[TrivPursEN]{Center}{\FillCenterTrivial}{}
+ %camemberts OK
+ \FillCamembersTrivialShort
+ %cases OK
+ \FillCellsBorderShort
+ %bordures
+ \DrawBordersTrivialShort
+ %logo central
+ \ifboolKV[TrivPursEN]{Logo}{\LogoCenterTrivialPursuit}{}
+ }%
+ {%
+ %les nœuds OK
+ \CreationNodesTrivial
+ %test avec centre OK
+ \ifboolKV[TrivPursEN]{Center}{\FillCenterTrivial}{}
+ %camemberts OK
+ \FillCamembersTrivial
+ %cases OK
+ \FillCellsBorder
+ %bordures
+ \DrawBordersTrivial
+ %logo central
+ \ifboolKV[TrivPursEN]{Logo}{\LogoCenterTrivialPursuit}{}
+ }%
\end{scope}
\end{tikzpicture}%
}
diff --git a/graphics/pgf/contrib/wheelchart/README.md b/graphics/pgf/contrib/wheelchart/README.md
index ec414f3440..df9f81a74d 100644
--- a/graphics/pgf/contrib/wheelchart/README.md
+++ b/graphics/pgf/contrib/wheelchart/README.md
@@ -2,9 +2,11 @@
## Diagrams with circular or other shapes using Ti*k*Z and LaTeX3
-Version 3.0 (2024/03/08)
+Version 4.0 (2024/07/28)
-This package is based on the package [Ti*k*Z](https://ctan.org/pkg/pgf) and can be used to draw various kinds of diagrams such as a bar chart, doughnut chart, infographic, pie chart, ring chart, square chart, sunburst chart, waffle chart and wheel chart with Ti*k*Z. It provides several options to customize the diagrams. It is also possible to specify a plot for the shape of the chart. Furthermore a legend can be added and the table of contents can be displayed as one of these diagrams.
+This package is based on the package [Ti*k*Z](https://ctan.org/pkg/pgf) and can be used to draw various kinds of diagrams such as bar charts, doughnut charts, infographics, pie charts, ring charts, square charts, sunburst charts, waffle charts and wheel charts.
+
+It provides several options to customize the diagrams. It is also possible to specify a plot for the shape of the chart. Furthermore a legend can be added and the table of contents can be displayed as one of these diagrams.
%% README.md
%% Copyright 2022-2024 Matthias Floré
diff --git a/graphics/pgf/contrib/wheelchart/wheelchart.pdf b/graphics/pgf/contrib/wheelchart/wheelchart.pdf
index 2cfa0dd1be..808551f33c 100644
--- a/graphics/pgf/contrib/wheelchart/wheelchart.pdf
+++ b/graphics/pgf/contrib/wheelchart/wheelchart.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/wheelchart/wheelchart.sty b/graphics/pgf/contrib/wheelchart/wheelchart.sty
index e2c8543976..21e232b099 100644
--- a/graphics/pgf/contrib/wheelchart/wheelchart.sty
+++ b/graphics/pgf/contrib/wheelchart/wheelchart.sty
@@ -18,7 +18,7 @@
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{tikz}
\usetikzlibrary{calc}
-\ProvidesExplPackage{wheelchart}{2024/03/08}{3.0}{Diagrams with circular or other shapes using TikZ and LaTeX3}
+\ProvidesExplPackage{wheelchart}{2024/07/28}{4.0}{Diagrams with circular or other shapes using TikZ and LaTeX3}
%%> \subsection{Variables}
@@ -59,6 +59,8 @@
\fp_const:Nn \c__wheelchart_arc_data_end_factor_left_fp { 1 }
\fp_const:Nn \c__wheelchart_arc_data_end_factor_right_fp { 0 }
\fp_new:N \l__wheelchart_arc_data_line_sep_factor_fp
+\fp_new:N \l__wheelchart_arc_data_lines_pos_fp
+\fp_new:N \l__wheelchart_arc_data_lines_shift_fp
\fp_new:N \l__wheelchart_arc_data_pos_fp
\fp_new:N \l__wheelchart_arc_data_radius_plot_false_fp
\fp_new:N \l__wheelchart_arc_data_sep_fp
@@ -168,6 +170,9 @@
\int_new:N \l__wheelchart_lines_ext_top_dir_int
\int_new:N \l__wheelchart_max_list_items_int
+\regex_const:Nn \c__wheelchart_braces_regex { \{(.+)\} }
+\regex_const:Nn \c__wheelchart_key_braces_regex { [\w\s]+\{(.+)\} }
+
\seq_new:N \l__wheelchart_arc_data_seq
\seq_new:N \l__wheelchart_discrete_coefficients_first_seq
\seq_new:N \l__wheelchart_discrete_coefficients_second_seq
@@ -180,8 +185,8 @@
{
sign ( \l__wheelchart_arc_data_dir_fp ) *
(
- \cs:w c__wheelchart_arc_data_start_factor_\l__wheelchart_arc_data_align_tl _fp\cs_end:
- + \cs:w c__wheelchart_arc_data_end_factor_\l__wheelchart_arc_data_align_tl _fp\cs_end:
+ \cs:w c__wheelchart_arc_data_start_factor_\l__wheelchart_arc_data_align_tl _fp \cs_end:
+ + \cs:w c__wheelchart_arc_data_end_factor_\l__wheelchart_arc_data_align_tl _fp \cs_end:
)
}
\tl_new:N \l__wheelchart_arc_data_align_tl
@@ -262,7 +267,7 @@
\cs_new_protected:Npn \__wheelchart_caption_and_title:nnnnn #1#2#3#4#5
{
- \__wheelchart_if_text:nn {#1}
+ \__wheelchart_if_text:nnn {#1} { o }
{
\node [ anchor = #2 , align = #3 , / wheelchart / #1_style ]
at ( $ (#4) + ( 0 , { #5 * ( \pgfkeysvalueof { / wheelchart / #1~sep } ) } ) $ )
@@ -282,12 +287,12 @@
{
\fp_eval:n
{
- ( 1 - (#1) ) * \cs:w g__wheelchart_slice_inner_start_angle_\WCcount _fp\cs_end:
- + (#1) * \cs:w g__wheelchart_slice_inner_end_angle_\WCcount _fp\cs_end:
+ ( 1 - (#1) ) * \cs:w g__wheelchart_slice_inner_start_angle_\WCcount _fp \cs_end:
+ + (#1) * \cs:w g__wheelchart_slice_inner_end_angle_\WCcount _fp \cs_end:
+ \l__wheelchart_counter_or_clockwise_fp * (#2)
}
}
- { \fp_eval:n { \cs:w g__wheelchart_inner_radius_\WCcount _fp\cs_end: - (#4) } }
+ { \fp_eval:n { \cs:w g__wheelchart_inner_radius_\WCcount _fp \cs_end: - (#4) } }
)
! { \fp_eval:n {#3} } !
(
@@ -295,12 +300,12 @@
{
\fp_eval:n
{
- ( 1 - (#1) ) * \cs:w g__wheelchart_slice_outer_start_angle_\WCcount _fp\cs_end:
- + (#1) * \cs:w g__wheelchart_slice_outer_end_angle_\WCcount _fp\cs_end:
+ ( 1 - (#1) ) * \cs:w g__wheelchart_slice_outer_start_angle_\WCcount _fp \cs_end:
+ + (#1) * \cs:w g__wheelchart_slice_outer_end_angle_\WCcount _fp \cs_end:
+ \l__wheelchart_counter_or_clockwise_fp * (#2)
}
}
- { \fp_eval:n { \cs:w g__wheelchart_outer_radius_\WCcount _fp\cs_end: + (#4) } }
+ { \fp_eval:n { \cs:w g__wheelchart_outer_radius_\WCcount _fp \cs_end: + (#4) } }
)
$%note the () around the #i's to keep these contents together
}
@@ -374,10 +379,10 @@
\path let
\p { l__wheelchart_def_angle_1 } =
\__wheelchart_point_plot_true:nnnnn { \WCcount } {#1} {#2} { 0 }
- { \fp_eval:n { (#4) + 1 / \cs:w g__wheelchart_samples_\WCcount _fp\cs_end: } } ,
+ { \fp_eval:n { (#4) + 1 / \cs:w g__wheelchart_samples_\WCcount _fp \cs_end: } } ,
\p { l__wheelchart_def_angle_2 } =
\__wheelchart_point_plot_true:nnnnn { \WCcount } {#1} {#2} { 1 }
- { \fp_eval:n { (#4) + 1 / \cs:w g__wheelchart_samples_\WCcount _fp\cs_end: } }
+ { \fp_eval:n { (#4) + 1 / \cs:w g__wheelchart_samples_\WCcount _fp \cs_end: } }
in [ / utils / exec = { \__wheelchart_def_angle_aux: } ]
;
}
@@ -392,10 +397,10 @@
{
( 1 - (#2) ) *
(
- \cs:w g__wheelchart_slice_outer_start_angle_#1_fp\cs_end:
- - \cs:w g__wheelchart_slice_inner_start_angle_#1_fp\cs_end:
+ \cs:w g__wheelchart_slice_outer_start_angle_#1_fp \cs_end:
+ - \cs:w g__wheelchart_slice_inner_start_angle_#1_fp \cs_end:
)
- + (#2) * ( \cs:w g__wheelchart_slice_outer_end_angle_#1_fp\cs_end: - \cs:w g__wheelchart_slice_inner_end_angle_#1_fp\cs_end: )
+ + (#2) * ( \cs:w g__wheelchart_slice_outer_end_angle_#1_fp \cs_end: - \cs:w g__wheelchart_slice_inner_end_angle_#1_fp \cs_end: )
}
\cs_new:Npn \__wheelchart_def_angle_plot_false:nnnnn #1#2#3#4#5
@@ -410,11 +415,11 @@
(
sqrt
(
- ( \cs:w g__wheelchart_outer_radius_#1_fp\cs_end: + \cs:w g__wheelchart_inner_radius_#1_fp\cs_end: ) ^ 2
- - \cs:w g__wheelchart_outer_radius_#1_fp\cs_end: * \cs:w g__wheelchart_inner_radius_#1_fp\cs_end: *
+ ( \cs:w g__wheelchart_outer_radius_#1_fp \cs_end: + \cs:w g__wheelchart_inner_radius_#1_fp \cs_end: ) ^ 2
+ - \cs:w g__wheelchart_outer_radius_#1_fp \cs_end: * \cs:w g__wheelchart_inner_radius_#1_fp \cs_end: *
(
2 + 2 * cosd ( \__wheelchart_def_angle_plot_false_aux_angle:nn {#1} {#2} )
- + \cs:w g__wheelchart_outer_radius_#1_fp\cs_end: * \cs:w g__wheelchart_inner_radius_#1_fp\cs_end:
+ + \cs:w g__wheelchart_outer_radius_#1_fp \cs_end: * \cs:w g__wheelchart_inner_radius_#1_fp \cs_end:
*
(
(
@@ -425,25 +430,25 @@
)
)
)
- + \cs:w g__wheelchart_inner_radius_#1_fp\cs_end: *
+ + \cs:w g__wheelchart_inner_radius_#1_fp \cs_end: *
(
- \cs:w g__wheelchart_inner_radius_#1_fp\cs_end:
- - \cs:w g__wheelchart_outer_radius_#1_fp\cs_end:
+ \cs:w g__wheelchart_inner_radius_#1_fp \cs_end:
+ - \cs:w g__wheelchart_outer_radius_#1_fp \cs_end:
* cosd ( \__wheelchart_def_angle_plot_false_aux_angle:nn {#1} {#2} )
)
/ \__wheelchart_def_radius:nnn {#1} {#4} {#5}
)
- * \cs:w g__wheelchart_outer_radius_#1_fp\cs_end: * sind ( \__wheelchart_def_angle_plot_false_aux_angle:nn {#1} {#2} )
+ * \cs:w g__wheelchart_outer_radius_#1_fp \cs_end: * sind ( \__wheelchart_def_angle_plot_false_aux_angle:nn {#1} {#2} )
/
(
- ( \cs:w g__wheelchart_outer_radius_#1_fp\cs_end: + \cs:w g__wheelchart_inner_radius_#1_fp\cs_end: ) ^ 2
- - 2 * \cs:w g__wheelchart_outer_radius_#1_fp\cs_end: * \cs:w g__wheelchart_inner_radius_#1_fp\cs_end:
+ ( \cs:w g__wheelchart_outer_radius_#1_fp \cs_end: + \cs:w g__wheelchart_inner_radius_#1_fp \cs_end: ) ^ 2
+ - 2 * \cs:w g__wheelchart_outer_radius_#1_fp \cs_end: * \cs:w g__wheelchart_inner_radius_#1_fp \cs_end:
* ( 1 + cosd ( \__wheelchart_def_angle_plot_false_aux_angle:nn {#1} {#2} ) )
)
)
}
- + ( 1 - (#2) ) * ( \cs:w g__wheelchart_slice_inner_start_angle_#1_fp\cs_end: )
- + (#2) * ( \cs:w g__wheelchart_slice_inner_end_angle_#1_fp\cs_end: )
+ + ( 1 - (#2) ) * ( \cs:w g__wheelchart_slice_inner_start_angle_#1_fp \cs_end: )
+ + (#2) * ( \cs:w g__wheelchart_slice_inner_end_angle_#1_fp \cs_end: )
+ \l__wheelchart_counter_or_clockwise_fp * (#3)
}
}
@@ -451,7 +456,7 @@
\cs_new_protected:Npn \__wheelchart_def_coord:nnnn #1#2#3#4
{
\path let \p { l__wheelchart_coord } =
- ( \cs:w __wheelchart_#2_plot:nn\cs_end: {#4} { \fp_use:c { g__wheelchart_#2_radius_\WCcount _fp } } )
+ ( \cs:w __wheelchart_#2_plot:nn \cs_end: {#4} { \fp_use:c { g__wheelchart_#2_radius_\WCcount _fp } } )
in
[
/ utils / exec =
@@ -484,11 +489,11 @@
<
\l__wheelchart_gap_fp
?
- min ( \cs:w g__wheelchart_abs_half_angle_minus_new_angle_\WCcount _fp\cs_end: , \l__wheelchart_gap_max_angle_def_fp )
+ min ( \cs:w g__wheelchart_abs_half_angle_minus_new_angle_\WCcount _fp \cs_end: , \l__wheelchart_gap_max_angle_def_fp )
:
asind ( min ( \l__wheelchart_gap_fp / ( (#2) + 1 - sign (#2) ) , 1 ) ) + \l__wheelchart_gap_polar_fp
- %note the min ( ... , 1 ) such that the asind is always defined
- %also note the + 1 - sign (#2) such that the denominator is also nonzero if #2 = 0
+ %note the min ( ... , 1 ) so that the asind is always defined
+ %also note the + 1 - sign (#2) so that the denominator is also nonzero if #2 = 0
}
}
@@ -516,7 +521,7 @@
:
\g__wheelchart_new_angle_fp - \g__wheelchart_angle_fp
)
- / \cs:w g__wheelchart_samples_1_fp\cs_end:
+ / \cs:w g__wheelchart_samples_1_fp \cs_end:
}
\path let
\p { l__wheelchart_slices_orientation_1 } =
@@ -579,8 +584,8 @@
{
\fp_eval:n
{
- ( 1 - (#2) ) * ( \cs:w g__wheelchart_inner_radius_#1_fp\cs_end: - (#3) )
- + (#2) * ( \cs:w g__wheelchart_outer_radius_#1_fp\cs_end: + (#3) )
+ ( 1 - (#2) ) * ( \cs:w g__wheelchart_inner_radius_#1_fp \cs_end: - (#3) )
+ + (#2) * ( \cs:w g__wheelchart_outer_radius_#1_fp \cs_end: + (#3) )
}
}
@@ -591,26 +596,26 @@
{
\fp_gset:cn { g__wheelchart_slice_#1_#2_angle_\WCcount _fp }
{
- \cs:w g__wheelchart_#3angle_fp\cs_end: +
+ \cs:w g__wheelchart_#3angle_fp \cs_end: +
(
\l__wheelchart_counter_or_clockwise_fp *
- ( (#4) * \cs:w g__wheelchart_#1_gap_\WCcount _fp\cs_end: + \cs:w l__wheelchart_slices_#1_#2_angle_shift_fp\cs_end: )
+ ( (#4) * \cs:w g__wheelchart_#1_gap_\WCcount _fp \cs_end: + \cs:w l__wheelchart_slices_#1_#2_angle_shift_fp \cs_end: )
)
}
}
{
\fp_gset:cn { g__wheelchart_slice_#1_#2_angle_\WCcount _fp }
{
- \cs:w g__wheelchart_#3angle_fp\cs_end: +
+ \cs:w g__wheelchart_#3angle_fp \cs_end: +
(
\l__wheelchart_counter_or_clockwise_fp *
(
- (#4) * \cs:w g__wheelchart_#1_gap_\WCcount _fp\cs_end: + \cs:w l__wheelchart_slices_#1_#2_angle_shift_fp\cs_end:
+ (#4) * \cs:w g__wheelchart_#1_gap_\WCcount _fp \cs_end: + \cs:w l__wheelchart_slices_#1_#2_angle_shift_fp \cs_end:
- asind
(
- \cs:w g__wheelchart_inner_radius_\WCcount _fp\cs_end:
- * sind ( \cs:w l__wheelchart_slices_#1_#2_angle_shift_fp\cs_end: )
- / \cs:w g__wheelchart_outer_radius_\WCcount _fp\cs_end:
+ \cs:w g__wheelchart_inner_radius_\WCcount _fp \cs_end:
+ * sind ( \cs:w l__wheelchart_slices_#1_#2_angle_shift_fp \cs_end: )
+ / \cs:w g__wheelchart_outer_radius_\WCcount _fp \cs_end:
)
)
)
@@ -620,8 +625,8 @@
\cs_new_protected:Npn \__wheelchart_def_slice_keys:n #1
{
- {%note the double {{...}} such that the contents is in a group
- %such that pgfkeys which are specific to the current slice are local for this slice
+ {%note the double braces {{...}} so that the contents is in a group
+ %and in particular, pgfkeys which are specific to the current slice are local for this slice
\clist_if_in:NVT \l__wheelchart_slice_range_local_clist \WCcount
{
\pgfkeys { / wheelchart , slice_final /. expanded = { \exp_not:v { l__wheelchart_slice_\WCcount _keys_clist } } }
@@ -663,24 +668,24 @@
%g__wheelchart_WCcount_counter to be larger than \WCtotalcount
\tl_build_end:N \WClegend
\cs_set:Npn \WCcount { \theg__wheelchart_WCcount_counter }
- \cs_set:Npn \WCpercentage { \cs:w l__wheelchart_WCpercentage_\theg__wheelchart_WCcount_counter\cs_end: }
- \cs_set:Npn \WCpercentagerounded { \cs:w l__wheelchart_WCpercentagerounded_\theg__wheelchart_WCcount_counter\cs_end: }
+ \cs_set:Npn \WCpercentage { \cs:w l__wheelchart_WCpercentage_\theg__wheelchart_WCcount_counter \cs_end: }
+ \cs_set:Npn \WCpercentagerounded { \cs:w l__wheelchart_WCpercentagerounded_\theg__wheelchart_WCcount_counter \cs_end: }
\str_if_eq:eeTF { \l__wheelchart_type_tl } { etoc }
{
\cs_set:Npn \WCetocthelinkedname
- { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_linked_name_\theg__wheelchart_WCcount_counter\cs_end: }
+ { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_linked_name_\theg__wheelchart_WCcount_counter \cs_end: }
\cs_set:Npn \WCetocthelinkednumber
- { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_linked_number_\theg__wheelchart_WCcount_counter\cs_end: }
+ { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_linked_number_\theg__wheelchart_WCcount_counter \cs_end: }
\cs_set:Npn \WCetocthelinkedpage
- { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_linked_page_\theg__wheelchart_WCcount_counter\cs_end: }
+ { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_linked_page_\theg__wheelchart_WCcount_counter \cs_end: }
\cs_set:Npn \WCetocthename
- { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_name_\theg__wheelchart_WCcount_counter\cs_end: }
+ { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_name_\theg__wheelchart_WCcount_counter \cs_end: }
\cs_set:Npn \WCetocthenumber
- { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_number_\theg__wheelchart_WCcount_counter\cs_end: }
+ { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_number_\theg__wheelchart_WCcount_counter \cs_end: }
\cs_set:Npn \WCetocthepage
- { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_page_\theg__wheelchart_WCcount_counter\cs_end: }
+ { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_page_\theg__wheelchart_WCcount_counter \cs_end: }
\cs_set:Npn \WCetocthenumberofpages
- { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_number_of_pages_\theg__wheelchart_WCcount_counter\cs_end: }
+ { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _the_number_of_pages_\theg__wheelchart_WCcount_counter \cs_end: }
}
{
\clist_if_empty:NTF \l__wheelchart_header_clist
@@ -688,7 +693,7 @@
\int_step_inline:nn { \l__wheelchart_max_list_items_int }
{
\cs_set:cpn { WCvar\int_to_Alph:n {##1} }
- { \cs:w l__wheelchart_item_WCvar\int_to_Alph:n {##1}_\theg__wheelchart_WCcount_counter\cs_end: }
+ { \cs:w l__wheelchart_item_WCvar\int_to_Alph:n {##1}_\theg__wheelchart_WCcount_counter \cs_end: }
}
}
{
@@ -717,13 +722,13 @@
(
atand
(
- \cs:w g__wheelchart_#3_y_fp\cs_end: - \cs:w g__wheelchart_#4_y_fp\cs_end: ,
- \cs:w g__wheelchart_#3_x_fp\cs_end: - \cs:w g__wheelchart_#4_x_fp\cs_end:
+ \cs:w g__wheelchart_#3_y_fp \cs_end: - \cs:w g__wheelchart_#4_y_fp \cs_end: ,
+ \cs:w g__wheelchart_#3_x_fp \cs_end: - \cs:w g__wheelchart_#4_x_fp \cs_end:
)
- atand
(
- \cs:w g__wheelchart_#1_y_fp\cs_end: - \cs:w g__wheelchart_#2_y_fp\cs_end: ,
- \cs:w g__wheelchart_#1_x_fp\cs_end: - \cs:w g__wheelchart_#2_x_fp\cs_end:
+ \cs:w g__wheelchart_#1_y_fp \cs_end: - \cs:w g__wheelchart_#2_y_fp \cs_end: ,
+ \cs:w g__wheelchart_#1_x_fp \cs_end: - \cs:w g__wheelchart_#2_x_fp \cs_end:
)
)
}
@@ -969,9 +974,9 @@
\__wheelchart_for_loop:n
{
\pgfkeysvalueof { / wheelchart / before~slices }
- \int_step_inline:nn { \fp_eval:n { round ( \cs:w g__wheelchart_value_\WCcount _fp\cs_end: ) } }
- %note that \fp_eval:n { round ( ... ) } is necessary even when the value is an integer because if parse=pgfmath
- %then .0 is added and then \int_step_inline:nn { \cs:w g__wheelchart_value_\WCcount _fp\cs_end: } would give the messages
+ \int_step_inline:nn { \fp_eval:n { round ( \cs:w g__wheelchart_value_\WCcount _fp \cs_end: ) } }
+ %note that \fp_eval:n { round ( ... ) } is necessary even when the value is an integer because pgfmath
+ %could have added .0 and then \int_step_inline:nn { \cs:w g__wheelchart_value_\WCcount _fp \cs_end: } would give the messages
%Missing character: There is no . in font nullfont! Missing character: There is no 0 in font nullfont!
{
\int_gincr:N \g__wheelchart_discrete_count_int
@@ -1082,7 +1087,7 @@
\cs_set:Npe \WCmidangle
{ \fp_use:c { g__wheelchart_WCmidangle_\WCcount _fp } }
\pgfkeysvalueof { / wheelchart / for~loop~start }%this must be placed after the definition of macros such as \WCpercentage
- %such that these macros can be used in the key for loop start
+ %so that these macros can be used in the key for loop start
\begin { scope }
[
shift = { ( \WCmidangle \c_colon_str \fp_use:c { g__wheelchart_explode_\WCcount _fp } ) } ,
@@ -1161,16 +1166,21 @@
\fp_gset:cn { g__wheelchart_#1_\WCcount _fp } { \pgfmathresult }
}
-\cs_new_protected:Npn \__wheelchart_if_text:nn #1#2
+\cs_new_protected:Npn \__wheelchart_if_text:nnn #1#2#3
{
%https://tex.stackexchange.com/questions/42280/expand-away-empty-macros-within-ifthenelse
%https://tex.stackexchange.com/questions/44919/proper-way-to-detect-empty-blank-text
\begin { pgfinterruptpicture }
+ \DeclareDocumentCommand \\ {#2} {}
+ %for arc data, \\ is used with seq_set_split so has no optional argument thus then #2 is empty
+ %otherwise, #2 is o
+ %no s because an optional star does not apply in a node
+ %no ! because a space between \\ and its optional argument is allowed in a node
%https://tex.stackexchange.com/questions/459853/savebox-within-tikzpicture-results-in-an-empty-savebox
\hbox_gset:Nn \g__wheelchart_if_text_box { \pgfkeysvalueof { / wheelchart / #1 } }
\end { pgfinterruptpicture }
\dim_compare:nNnT { \box_wd:N \g__wheelchart_if_text_box } > { 0 pt }
- { {#2} }
+ { {#3} }
}
\cs_new_protected:Npn \__wheelchart_initial:n #1
@@ -1182,7 +1192,7 @@
\tl_if_empty:nTF {#1}
{ \cs_set:Npn \WCtotalcount { 0 } }
{
- \cs:w seq_set_split:Ne\l__wheelchart_expand_list_tl\cs_end:
+ \cs:w seq_set_split:Ne\l__wheelchart_expand_list_tl \cs_end:
\l__wheelchart_list_seq
{ \pgfkeysvalueof { / wheelchart / separator~rows } }
{#1}
@@ -1190,7 +1200,7 @@
\int_zero:N \l__wheelchart_max_list_items_int
\seq_map_indexed_inline:Nn \l__wheelchart_list_seq
{
- \cs:w seq_set_split:Ne\l__wheelchart_expand_list_items_tl\cs_end:
+ \cs:w seq_set_split:Ne\l__wheelchart_expand_list_items_tl \cs_end:
\l__wheelchart_list_items_seq
{ \pgfkeysvalueof { / wheelchart / separator~columns } }
{##2}
@@ -1245,7 +1255,7 @@
\etocsetnexttocdepth { -1 }%only for the next toc
\etocsetstyle { \l__wheelchart_etoc_level_tl } {} {}
{
- \int_compare:nNnT { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _count_int\cs_end: } > { 0 }
+ \int_compare:nNnT { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _count_int \cs_end: } > { 0 }
{
\cs_gset:cpe
{
@@ -1304,7 +1314,7 @@
{}
\int_gzero_new:c { g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _count_int }
\pgfkeysvalueof { / wheelchart / etoc~code }
- \int_compare:nNnT { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _count_int\cs_end: } > { 0 }
+ \int_compare:nNnT { \cs:w g__wheelchart_etoc_item_\l__wheelchart_etoc_name_tl _count_int \cs_end: } > { 0 }
{
\cs_gset:cpe
{
@@ -1331,32 +1341,32 @@
{
\__wheelchart_def_slice_keys:n
{ \__wheelchart_gdef_count_fp:nn { value } { value } }
- \cs_set:Npe \WCtotalnum { \fp_eval:n { \WCtotalnum + \cs:w g__wheelchart_value_\WCcount _fp\cs_end: } }
+ \cs_set:Npe \WCtotalnum { \fp_eval:n { \WCtotalnum + \cs:w g__wheelchart_value_\WCcount _fp \cs_end: } }
}
\int_step_inline:nn { \WCtotalcount }
{
\cs_set:cpe { l__wheelchart_WCpercentage_##1 }
- { \fp_eval:n { \cs:w g__wheelchart_value_##1_fp\cs_end: / ( \WCtotalnum / 100 ) } }
+ { \fp_eval:n { \cs:w g__wheelchart_value_##1_fp \cs_end: / ( \WCtotalnum / 100 ) } }
\cs_set:cpe { l__wheelchart_WCpercentagerounded_##1 }
- { \fp_eval:n { round ( \cs:w l__wheelchart_WCpercentage_##1\cs_end: , \pgfkeysvalueof { / wheelchart / perc~precision } ) } }
+ { \fp_eval:n { round ( \cs:w l__wheelchart_WCpercentage_##1 \cs_end: , \pgfkeysvalueof { / wheelchart / perc~precision } ) } }
}
}
\cs_new_protected:Npn \__wheelchart_inner_and_wheel_data:n #1
{
- \__wheelchart_if_text:nn { #1~data }
+ \__wheelchart_if_text:nnn { #1~data } { o }
{
\__wheelchart_def_fp:nn { #1_data_angle_pos } { #1~data~angle~pos }
\__wheelchart_def_fp:nn { #1_data_angle_shift } { #1~data~angle~shift }
\__wheelchart_def_fp:nn { #1_data_pos } { #1~data~pos }
\__wheelchart_def_fp:nn { #1_data_sep } { #1~data~sep }
\node [ align = left , / wheelchart / #1_data_style ] at
- \cs:w __wheelchart_point_plot_\bool_to_str:N \l__wheelchart_plot_bool :nnnnn\cs_end:
+ \cs:w __wheelchart_point_plot_\bool_to_str:N \l__wheelchart_plot_bool :nnnnn \cs_end:
{ \WCcount }
- { \cs:w l__wheelchart_#1_data_angle_pos_fp\cs_end: }
- { \cs:w l__wheelchart_#1_data_angle_shift_fp\cs_end: }
- { \cs:w l__wheelchart_#1_data_pos_fp\cs_end: }
- { \cs:w l__wheelchart_#1_data_sep_fp\cs_end: }
+ { \cs:w l__wheelchart_#1_data_angle_pos_fp \cs_end: }
+ { \cs:w l__wheelchart_#1_data_angle_shift_fp \cs_end: }
+ { \cs:w l__wheelchart_#1_data_pos_fp \cs_end: }
+ { \cs:w l__wheelchart_#1_data_sep_fp \cs_end: }
{ \pgfkeysvalueof { / wheelchart / #1~data } } ;
}
}
@@ -1366,13 +1376,13 @@
\cs_new_protected:Npn \__wheelchart_legend_append:nn #1#2
{
- \tl_build_put_right:NV \WClegend \l__wheelchart_legend_row_tl%note the V specifier such that \WClegend can also be combined
- %with an S column of the package siunitx and such that \WClegend can be used in a tblr environment of the package tabularray
+ \tl_build_put_right:NV \WClegend \l__wheelchart_legend_row_tl%note the V specifier so that \WClegend can also be combined
+ %with an S column of the package siunitx and so that \WClegend can be used in a tblr environment of the package tabularray
%and then the option expand=\WClegend needs to be given to the tblr environment
\tl_build_put_right:Nn \WClegend { \protect \setcounter { g__wheelchart_WCcount_counter } }%note the \protect for in case that
%\WClegend would be parsed in a particular way
%note that the counter g__wheelchart_WCcount_counter is defined globally and at the end of the previous \l__wheelchart_legend_row_tl
- %such that this value is defined and has the right value at the start of the next \l__wheelchart_legend_row_tl
+ %so that this value is defined and has the right value at the start of the next \l__wheelchart_legend_row_tl
%if \WClegend is used in a tblr environment of the package tabularray then \UseTblrLibrary{counter} is required
\tl_build_put_right:Ne \WClegend { { \int_eval:n {#1} } }
\tl_build_put_right:Nn \WClegend {#2}
@@ -1414,8 +1424,8 @@
{
atand
(
- \cs:w g__wheelchart_#3_y_fp\cs_end: - \cs:w g__wheelchart_#4_y_fp\cs_end: ,
- \cs:w g__wheelchart_#3_x_fp\cs_end: - \cs:w g__wheelchart_#4_x_fp\cs_end:
+ \cs:w g__wheelchart_#3_y_fp \cs_end: - \cs:w g__wheelchart_#4_y_fp \cs_end: ,
+ \cs:w g__wheelchart_#3_x_fp \cs_end: - \cs:w g__wheelchart_#4_x_fp \cs_end:
)
}
\fp_set:Nn \l__wheelchart_slices_arc_coord_fp
@@ -1440,7 +1450,7 @@
)
:
atand ( ( \l__wheelchart_slices_arc_A_fp - ( 1 / \l__wheelchart_slices_arc_A_fp ) ) / 2 )
- }%note the min ( \l__wheelchart_slices_arc_B_fp , 0 ) such that the acosd is always defined
+ }%note the min ( \l__wheelchart_slices_arc_B_fp , 0 ) so that the acosd is always defined
}
}
]
@@ -1486,8 +1496,8 @@
* abs ( ( 1 / \l__wheelchart_slices_arc_A_fp ) + \l__wheelchart_slices_arc_A_fp )
* sqrt
(
- ( \cs:w g__wheelchart_#3_x_fp\cs_end: - \cs:w g__wheelchart_#4_x_fp\cs_end: ) ^ 2
- + ( \cs:w g__wheelchart_#3_y_fp\cs_end: - \cs:w g__wheelchart_#4_y_fp\cs_end: ) ^ 2
+ ( \cs:w g__wheelchart_#3_x_fp \cs_end: - \cs:w g__wheelchart_#4_x_fp \cs_end: ) ^ 2
+ + ( \cs:w g__wheelchart_#3_y_fp \cs_end: - \cs:w g__wheelchart_#4_y_fp \cs_end: ) ^ 2
)
}
}
@@ -1539,11 +1549,11 @@
\fp_eval:n
{
(
- \cs:w g__wheelchart_#3_x_fp\cs_end: + \cs:w g__wheelchart_#4_x_fp\cs_end: +
+ \cs:w g__wheelchart_#3_x_fp \cs_end: + \cs:w g__wheelchart_#4_x_fp \cs_end: +
(
\g__wheelchart_slices_orientation_fp * ( \l__wheelchart_slices_arrow_coord_fp - 1 )
* \l__wheelchart_slices_arrow_A_fp
- * ( \cs:w g__wheelchart_#3_y_fp\cs_end: - \cs:w g__wheelchart_#4_y_fp\cs_end: )
+ * ( \cs:w g__wheelchart_#3_y_fp \cs_end: - \cs:w g__wheelchart_#4_y_fp \cs_end: )
)
)
/ 2
@@ -1552,11 +1562,11 @@
\fp_eval:n
{
(
- \cs:w g__wheelchart_#3_y_fp\cs_end: + \cs:w g__wheelchart_#4_y_fp\cs_end: +
+ \cs:w g__wheelchart_#3_y_fp \cs_end: + \cs:w g__wheelchart_#4_y_fp \cs_end: +
(
\g__wheelchart_slices_orientation_fp * ( \l__wheelchart_slices_arrow_coord_fp - 1 )
* \l__wheelchart_slices_arrow_A_fp
- * ( \cs:w g__wheelchart_#4_x_fp\cs_end: - \cs:w g__wheelchart_#3_x_fp\cs_end: )
+ * ( \cs:w g__wheelchart_#4_x_fp \cs_end: - \cs:w g__wheelchart_#3_x_fp \cs_end: )
)
)
/ 2
@@ -1593,10 +1603,10 @@
{
\fp_eval:n
{
- ( 1 - (#1) / max ( round ( \cs:w g__wheelchart_value_\WCcount _fp\cs_end: ) , 1 ) )
- * \cs:w g__wheelchart_slice_#2_start_angle_\WCcount _fp\cs_end:
- + (#1) * \cs:w g__wheelchart_slice_#2_end_angle_\WCcount _fp\cs_end:
- / max ( round ( \cs:w g__wheelchart_value_\WCcount _fp\cs_end: ) , 1 )
+ ( 1 - (#1) / max ( round ( \cs:w g__wheelchart_value_\WCcount _fp \cs_end: ) , 1 ) )
+ * \cs:w g__wheelchart_slice_#2_start_angle_\WCcount _fp \cs_end:
+ + (#1) * \cs:w g__wheelchart_slice_#2_end_angle_\WCcount _fp \cs_end:
+ / max ( round ( \cs:w g__wheelchart_value_\WCcount _fp \cs_end: ) , 1 )
}
}
@@ -1617,17 +1627,19 @@
arc_style /. style = {} ,
arc~around~line /. initial = 1 ,
arc~around~text /. default = true ,%this key is not set up with /.is choice or \bool_set:Nn
- %such that for example \WCvarA can be used as value for this key
+ %so that for example \WCvarA can be used as value for this key
arc~around~text /. initial = false ,
arc~data /. initial = {} ,
arc~data~align /. code = { \tl_set:Nn \l__wheelchart_arc_data_align_tl {#1} } ,%this key is not set up with /.is choice
- %such that for example \WCvarA can be used as value for this key
+ %so that for example \WCvarA can be used as value for this key
arc~data~align = center ,
arc~data~angle~pos /. initial = 0.5 ,
arc~data~angle~shift /. initial = 0 ,
arc~data~dir /. initial = 1 ,
arc~data~expand /. initial = n ,
arc~data~line~sep~factor /. initial = 1 ,
+ arc~data~lines~pos /. initial = 0.5 ,
+ arc~data~lines~shift /. initial = 0 ,
arc~data~pos /. initial = 1 ,
arc~data~sep /. initial = 1 ex / 1 cm ,
arc~data~style /. style = { arc_data_style /. style = {#1} } ,
@@ -1640,7 +1652,7 @@
arc~sep /. initial = 1 ex / 1 cm ,
at /. initial = { ( 0 , 0 ) } ,
before~slices /. initial = {} ,
- bool_set_true /. code = { \bool_set_true:N #1 } ,
+ bool_set_true /. code = \bool_set_true:N #1 ,
caption /. initial = {} ,
caption~left /. initial = {} ,
caption~left~sep /. initial = 0.5 ,
@@ -1670,9 +1682,9 @@
data~style /. style = { data_style /. style = {#1} } ,
data_style /. style = {} ,
discrete /. is~choice ,
- discrete / false /. code = { \bool_set_false:N \l__wheelchart_discrete_bool } ,
+ discrete / false /. code = \bool_set_false:N \l__wheelchart_discrete_bool ,
discrete / false /. value~forbidden ,
- discrete / true /. code = { \bool_set_true:N \l__wheelchart_discrete_bool } ,
+ discrete / true /. code = \bool_set_true:N \l__wheelchart_discrete_bool ,
discrete / true /. value~forbidden ,
discrete /. default = true ,
discrete = false ,
@@ -1777,7 +1789,7 @@
legend /. initial = {} ,
legend~columns /. initial = 1 ,
legend~entry /. initial = {} ,
- legend~only /. code = { \bool_set:Nn \l__wheelchart_legend_only_bool { \cs:w c_#1_bool\cs_end: } } ,
+ legend~only /. code = \bool_set:Nn \l__wheelchart_legend_only_bool { \cs:w c_#1_bool \cs_end: } ,
legend~only /. default = true ,
legend~only = false ,
legend~row /. code =
@@ -1800,7 +1812,7 @@
} ,
lines~ext~dirsep /. initial = 0 ,
lines~ext~fixed /. default = true ,%this key is not set up with /.is choice or \bool_set:Nn
- %such that for example \WCvarA can be used as value for this key
+ %so that for example \WCvarA can be used as value for this key
lines~ext~fixed /. initial = false ,
lines~ext~fixed~left /. initial =
{
@@ -1808,7 +1820,7 @@
{
\l__wheelchart_lines_ext_dir_int *
(
- \cs:w g__wheelchart_outer_radius_\WCcount _fp\cs_end: + \l__wheelchart_lines_sep_fp
+ \cs:w g__wheelchart_outer_radius_\WCcount _fp \cs_end: + \l__wheelchart_lines_sep_fp
+ \l__wheelchart_lines_fp + \l__wheelchart_lines_ext_fp
)
}
@@ -1819,7 +1831,7 @@
{
\l__wheelchart_lines_ext_dir_int *
(
- \cs:w g__wheelchart_outer_radius_\WCcount _fp\cs_end: + \l__wheelchart_lines_sep_fp
+ \cs:w g__wheelchart_outer_radius_\WCcount _fp \cs_end: + \l__wheelchart_lines_sep_fp
+ \l__wheelchart_lines_fp + \l__wheelchart_lines_ext_fp
)
}
@@ -1870,7 +1882,7 @@
outer_plot_style /. style = {} ,
outer~radius /. initial = 3 ,
perc~precision /. initial = 0 ,
- pie /. code = { \bool_set:Nn \l__wheelchart_pie_bool { \cs:w c_#1_bool\cs_end: } } ,
+ pie /. code = \bool_set:Nn \l__wheelchart_pie_bool { \cs:w c_#1_bool \cs_end: } ,
pie /. default = true ,
pie = false ,
plot /. style =
@@ -2029,12 +2041,12 @@
} ,
slices~inner /. initial =
{
- \fp_compare:nNnT { \cs:w g__wheelchart_inner_radius_\WCcount _fp\cs_end: } > { 0 }
+ \fp_compare:nNnT { \cs:w g__wheelchart_inner_radius_\WCcount _fp \cs_end: } > { 0 }
{
\fp_compare:nNnT
- { \cs:w g__wheelchart_inner_gap_\WCcount _fp\cs_end: }
+ { \cs:w g__wheelchart_inner_gap_\WCcount _fp \cs_end: }
<
- { \cs:w g__wheelchart_abs_half_angle_minus_new_angle_\WCcount _fp\cs_end: }
+ { \cs:w g__wheelchart_abs_half_angle_minus_new_angle_\WCcount _fp \cs_end: }
{
arc
[
@@ -2212,7 +2224,7 @@
{}
}
} ,
- slices~start~arrow/.style~2~args =
+ slices~start~arrow /. style~2~args =
{
slices~start =
{
@@ -2241,13 +2253,13 @@
(#1) -
\fp_eval:n
{
- \l__wheelchart_counter_or_clockwise_fp * \cs:w g__wheelchart_value_1_fp\cs_end: * 0.5
+ \l__wheelchart_counter_or_clockwise_fp * \cs:w g__wheelchart_value_1_fp \cs_end: * 0.5
* ( \l__wheelchart_total_angle_fp / \WCtotalnum )
}
}
} ,
start~half /. default = 90 ,
- title /. initial= {} ,
+ title /. initial = {} ,
title~left /. initial = {} ,
title~left~sep /. initial = 0.5 ,
title~left~style /. style = { title~left_style /. style = {#1} } ,
@@ -2283,13 +2295,13 @@
{
\cs_set:cpn {#1}
{ \use:e { \clist_item:nn {#2} { \int_mod:nn { \WCcount - 1 } { \clist_count:n {#2} } + 1 } } }
- %note the \use:e such that \WClist<name> also works when given as an argument to pgfmath
+ %note the \use:e so that \WClist<name> also works when given as an argument to pgfmath
%if the list contains a macro, for example
%\begin{tikzpicture}
%\def\n{1}
%\wheelchart[
- % value=\WClistA,
- % WClistA={\n}
+ % value=\WClistA,
+ % WClistA=\n
%]{\exampleforthismanual}
%\end{tikzpicture}
%https://tex.stackexchange.com/questions/671298/clist-item-and-pgfmathsetmacro-causing-an-error
@@ -2331,18 +2343,18 @@
{
\tl_set:Ne \l__wheelchart_key_name_tl { \pgfkeyscurrentname }%it is necessary to define \l__wheelchart_key_name_tl
%because \pgfkeyscurrentname will be overwritten by / errors / unknown~key /. expanded
- \regex_match:nVTF { \{(.+)\} } \l__wheelchart_key_name_tl
+ \regex_match:NVTF \c__wheelchart_braces_regex \l__wheelchart_key_name_tl
{
\tl_set:Ne \l__wheelchart_key_range_tl { \pgfkeyscurrentname }
- \regex_replace_all:nnN { \{(.+)\} } {} \l__wheelchart_key_name_tl
- \regex_replace_all:nnN { [\w\s]+\{(.+)\} } { \1 } \l__wheelchart_key_range_tl
+ \regex_replace_all:NnN \c__wheelchart_braces_regex {} \l__wheelchart_key_name_tl
+ \regex_replace_all:NnN \c__wheelchart_key_braces_regex { \1 } \l__wheelchart_key_range_tl
\str_if_eq:eeTF { \l__wheelchart_key_range_tl } { list }
{
\pgfkeys { / wheelchart , WC_list = { l__wheelchart_list_\l__wheelchart_key_name_tl } {#1} }
\pgfkeys
{
/ wheelchart ,
- \l__wheelchart_key_name_tl /. expand~once = { \cs:w l__wheelchart_list_\l__wheelchart_key_name_tl\cs_end: }
+ \l__wheelchart_key_name_tl /. expand~once = { \cs:w l__wheelchart_list_\l__wheelchart_key_name_tl \cs_end: }
}
}
{
@@ -2393,12 +2405,12 @@
\NewDocumentCommand \wheelchart { O {} m }
{
- {%note the double braces {{...}} such that the contents is in a group and such that & can be used in pgfmath in a tabular
+ {%note the double braces {{...}} so that the contents is in a group and so that & can be used in pgfmath in a tabular
\pgfkeys { / wheelchart , #1 }
\IfPackageLoadedTF { siunitx }
{ \cs_set:Npn \WCperc { \qty { \WCpercentagerounded } { \percent } } }
{ \cs_set:Npn \WCperc { \WCpercentagerounded \, \% } }%the definition of \WCperc is placed inside the command \wheelchart
- %such that \WCperc is not defined outside this command
+ %so that \WCperc is not defined outside this command
\bool_if:NTF \l__wheelchart_legend_only_bool
{
\__wheelchart_initial:n {#2}
@@ -2430,7 +2442,7 @@
{
\g__wheelchart_angle_fp +
(
- \l__wheelchart_counter_or_clockwise_fp * \cs:w g__wheelchart_value_\WCcount _fp\cs_end:
+ \l__wheelchart_counter_or_clockwise_fp * \cs:w g__wheelchart_value_\WCcount _fp \cs_end:
* ( \l__wheelchart_total_angle_fp / \WCtotalnum )
)
}
@@ -2455,7 +2467,7 @@
\fp_gset:cn { g__wheelchart_abs_half_angle_minus_new_angle_\WCcount _fp }
{ abs ( \g__wheelchart_angle_fp - \g__wheelchart_new_angle_fp ) / 2 }
\fp_set:Nn \l__wheelchart_abs_half_angle_minus_new_angle_minus_gap_polar_fp
- { \cs:w g__wheelchart_abs_half_angle_minus_new_angle_\WCcount _fp\cs_end: - \l__wheelchart_gap_polar_fp }
+ { \cs:w g__wheelchart_abs_half_angle_minus_new_angle_\WCcount _fp \cs_end: - \l__wheelchart_gap_polar_fp }
\fp_gzero_new:c { g__wheelchart_outer_gap_\WCcount _fp }
\fp_gzero_new:c { g__wheelchart_inner_gap_\WCcount _fp }
\bool_if:NTF \l__wheelchart_plot_bool
@@ -2466,7 +2478,7 @@
{
\fp_set:Nn \l__wheelchart_gap_max_angle_def_fp
{
- \cs:w g__wheelchart_inner_radius_\WCcount _fp\cs_end: > 0
+ \cs:w g__wheelchart_inner_radius_\WCcount _fp \cs_end: > 0
?
90
:
@@ -2490,8 +2502,8 @@
)
)
}
- \__wheelchart_def_gap:nn { outer } { \cs:w g__wheelchart_outer_radius_\WCcount _fp\cs_end: }
- \__wheelchart_def_gap:nn { inner } { \cs:w g__wheelchart_inner_radius_\WCcount _fp\cs_end: }
+ \__wheelchart_def_gap:nn { outer } { \cs:w g__wheelchart_outer_radius_\WCcount _fp \cs_end: }
+ \__wheelchart_def_gap:nn { inner } { \cs:w g__wheelchart_inner_radius_\WCcount _fp \cs_end: }
\fp_compare:nNnT { \l__wheelchart_abs_half_angle_minus_new_angle_minus_gap_polar_fp } > { 0.01 }
{
\fp_gset:cn { g__wheelchart_inner_radius_\WCcount _fp }
@@ -2508,7 +2520,7 @@
)
)
,
- \cs:w g__wheelchart_inner_radius_\WCcount _fp\cs_end:
+ \cs:w g__wheelchart_inner_radius_\WCcount _fp \cs_end:
)
}
}
@@ -2523,14 +2535,14 @@
\__wheelchart_gdef_count_fp:nn { data_pos } { data~pos }
\__wheelchart_gdef_count_fp:nn { data_sep } { data~sep }
\__wheelchart_def_angle:nnnn
- { \cs:w g__wheelchart_data_angle_pos_\WCcount _fp\cs_end: }
- { \cs:w g__wheelchart_data_angle_shift_\WCcount _fp\cs_end: }
- { \cs:w g__wheelchart_data_pos_\WCcount _fp\cs_end: }
- { \cs:w g__wheelchart_data_sep_\WCcount _fp\cs_end: }
+ { \cs:w g__wheelchart_data_angle_pos_\WCcount _fp \cs_end: }
+ { \cs:w g__wheelchart_data_angle_shift_\WCcount _fp \cs_end: }
+ { \cs:w g__wheelchart_data_pos_\WCcount _fp \cs_end: }
+ { \cs:w g__wheelchart_data_sep_\WCcount _fp \cs_end: }
\cs_set:Npe \WCdataangle { \pgfmathresult }
\__wheelchart_gdef_count_fp:nn { explode } { explode }
\pgfkeysvalueof { / wheelchart / for~loop~start }%this must be placed after the definition of macros such as
- %\WCpercentage such that these macros can be used in the key for loop start
+ %\WCpercentage so that these macros can be used in the key for loop start
\int_compare:nNnT { \WCcount } = { 1 }
{
\begin { scope }
@@ -2601,7 +2613,7 @@
[
shift /. expanded =
{
- \cs:w __wheelchart_point_plot_\bool_to_str:N \l__wheelchart_plot_bool :nnnnn\cs_end:
+ \cs:w __wheelchart_point_plot_\bool_to_str:N \l__wheelchart_plot_bool :nnnnn \cs_end:
{ \WCcount }
{ \l__wheelchart_slices_angle_pos_fp }
{ \l__wheelchart_slices_angle_shift_fp }
@@ -2639,9 +2651,9 @@
\__wheelchart_for_loop:n
{
\bool_if:NT \l__wheelchart_wheel_lines_bool
- %this is placed inside \__wheelchart_for_loop:n such that wheel lines can be applied for specific slices
+ %this is placed inside \__wheelchart_for_loop:n so that wheel lines can be applied for specific slices
{
- \int_step_inline:nnn { 0 } { \fp_eval:n { round ( \cs:w g__wheelchart_value_\WCcount _fp\cs_end: ) } }
+ \int_step_inline:nnn { 0 } { \fp_eval:n { round ( \cs:w g__wheelchart_value_\WCcount _fp \cs_end: ) } }
%note the \fp_eval:n { round ( ... ) } to avoid the messages Missing character: There is no ... in font nullfont!
{
\bool_if:NTF \l__wheelchart_plot_bool
@@ -2783,14 +2795,14 @@
\fp_compare:nF { \l__wheelchart_lines_fp == 0 && \l__wheelchart_lines_ext_fp == 0 }
{
\draw [ / wheelchart / lines_style ] let \p { l__wheelchart_lines_1 } =
- \cs:w __wheelchart_point_plot_\bool_to_str:N \l__wheelchart_plot_bool :nnnnn\cs_end:
+ \cs:w __wheelchart_point_plot_\bool_to_str:N \l__wheelchart_plot_bool :nnnnn \cs_end:
{ \WCcount }
- { \cs:w g__wheelchart_data_angle_pos_\WCcount _fp\cs_end: }
- { \cs:w g__wheelchart_data_angle_shift_\WCcount _fp\cs_end: }
- { \cs:w g__wheelchart_data_pos_\WCcount _fp\cs_end: }
+ { \cs:w g__wheelchart_data_angle_pos_\WCcount _fp \cs_end: }
+ { \cs:w g__wheelchart_data_angle_shift_\WCcount _fp \cs_end: }
+ { \cs:w g__wheelchart_data_pos_\WCcount _fp \cs_end: }
{ \l__wheelchart_lines_sep_fp + \l__wheelchart_lines_fp }
in
- \cs:w __wheelchart_point_plot_\bool_to_str:N \l__wheelchart_plot_bool :nnnnn\cs_end:
+ \cs:w __wheelchart_point_plot_\bool_to_str:N \l__wheelchart_plot_bool :nnnnn \cs_end:
{ \WCcount }
{ \l__wheelchart_lines_angle_pos_fp }
{ \l__wheelchart_lines_angle_shift_fp }
@@ -2838,7 +2850,7 @@
{
\fp_eval:n
{
- \l__wheelchart_lines_ext_dir_int * \cs:w g__wheelchart_data_sep_\WCcount _fp\cs_end:
+ \l__wheelchart_lines_ext_dir_int * \cs:w g__wheelchart_data_sep_\WCcount _fp \cs_end:
}
} ,
0
@@ -2849,7 +2861,7 @@
}
;
}
- \__wheelchart_if_text:nn { data }
+ \__wheelchart_if_text:nnn { data } { o }
{
\fp_compare:nNnTF { \l__wheelchart_lines_ext_fp } = { 0 }
{
@@ -2876,13 +2888,13 @@
\coordinate
[
at =
- \cs:w __wheelchart_point_plot_\bool_to_str:N \l__wheelchart_plot_bool :nnnnn\cs_end:
+ \cs:w __wheelchart_point_plot_\bool_to_str:N \l__wheelchart_plot_bool :nnnnn \cs_end:
{ \WCcount }
- { \cs:w g__wheelchart_data_angle_pos_\WCcount _fp\cs_end: }
- { \cs:w g__wheelchart_data_angle_shift_\WCcount _fp\cs_end: }
- { \cs:w g__wheelchart_data_pos_\WCcount _fp\cs_end: }
+ { \cs:w g__wheelchart_data_angle_pos_\WCcount _fp \cs_end: }
+ { \cs:w g__wheelchart_data_angle_shift_\WCcount _fp \cs_end: }
+ { \cs:w g__wheelchart_data_pos_\WCcount _fp \cs_end: }
{
- \cs:w g__wheelchart_data_sep_\WCcount _fp\cs_end: +
+ \cs:w g__wheelchart_data_sep_\WCcount _fp \cs_end: +
(
\l__wheelchart_lines_fp == 0
?
@@ -2902,7 +2914,7 @@
\node [ anchor = \l__wheelchart_data_anchor_tl , align = left , / wheelchart / data_style ]
at ( g__wheelchart_data_coordinate )
{ \pgfkeysvalueof { / wheelchart / data } } ;%a separate \node and not at the end of the \draw with lines_style
- %such that the key lines style is not passed to this \node
+ %so that the key lines style is not passed to this \node
}
\__wheelchart_def_fp:nn { arc_around_line } { arc~around~line }
\__wheelchart_def_fp:nn { arc_data_angle_pos } { arc~data~angle~pos }
@@ -2913,14 +2925,16 @@
\fp_gset:Nn \g__wheelchart_half_ex_over_one_cm_fp { 0.5 ex / 1 cm }%
\endpgfinterruptpicture%
\fp_gset:Nn \g__wheelchart_arc_data_aux_ii_fp { 0 }
- \__wheelchart_if_text:nn { arc~data }
+ \__wheelchart_if_text:nnn { arc~data } {}
{
- \cs_set:Npn \WCperc { \WCpercentagerounded { \, } { \% } }%such that \WCperc follows the arc if used in arc data
+ \cs_set:Npn \WCperc { \WCpercentagerounded { \, } { \% } }%so that \WCperc follows the arc if used in arc data
%this redefinition of \WCperc is local to the group of arc data
\__wheelchart_def_fp:nn { arc_data_pos } { arc~data~pos }
\__wheelchart_def_fp:nn { arc_data_sep } { arc~data~sep }
\__wheelchart_def_fp:nn { arc_data_line_sep_factor } { arc~data~line~sep~factor }
- \cs:w seq_set_split:Nn\pgfkeysvalueof { / wheelchart / arc~data~expand }\cs_end:
+ \__wheelchart_def_fp:nn { arc_data_lines_pos } { arc~data~lines~pos }
+ \__wheelchart_def_fp:nn { arc_data_lines_shift } { arc~data~lines~shift }
+ \cs:w seq_set_split:Nn\pgfkeysvalueof { / wheelchart / arc~data~expand } \cs_end:
\l__wheelchart_arc_data_seq
{ \\ }
{ \pgfkeysvalueof { / wheelchart / arc~data } }
@@ -2928,13 +2942,17 @@
{
\fp_set:Nn \l__wheelchart_arc_data_text_pos_fp
{
- \l__wheelchart_arc_data_pos_fp + 2 * \g__wheelchart_slices_orientation_fp
- * ( 2 * ####1 - \seq_count:N \l__wheelchart_arc_data_seq - 1 ) * sign ( \l__wheelchart_arc_data_dir_fp )
+ \l__wheelchart_arc_data_pos_fp + 4 * \g__wheelchart_slices_orientation_fp *
+ (
+ ####1 - 1 - \l__wheelchart_arc_data_lines_pos_fp * ( \seq_count:N \l__wheelchart_arc_data_seq - 1 )
+ + \l__wheelchart_arc_data_lines_shift_fp
+ )
+ * sign ( \l__wheelchart_arc_data_dir_fp )
* \l__wheelchart_arc_data_line_sep_factor_fp * \g__wheelchart_half_ex_over_one_cm_fp
/
(
- \cs:w g__wheelchart_outer_radius_\WCcount _fp\cs_end:
- - \cs:w g__wheelchart_inner_radius_\WCcount _fp\cs_end:
+ \cs:w g__wheelchart_outer_radius_\WCcount _fp \cs_end:
+ - \cs:w g__wheelchart_inner_radius_\WCcount _fp \cs_end:
+ 2 * \l__wheelchart_arc_data_sep_fp
)
}%the sign is needed because \l__wheelchart_arc_data_dir_fp is not necessarily 1 or -1
@@ -2957,9 +2975,9 @@
/ wheelchart / arc_data_style
}
}%get the length of the path
- %note the option overlay such that this does not increase the bounding box
+ %note the option overlay so that this does not increase the bounding box
%note the {} at the start of text and the braces around \fp_gset:Nn ...
- %such that the compilation does not stall
+ %so that the compilation does not stall
{ 0 }
{ 1 }
{ \l__wheelchart_plot_variable_tl }
@@ -3033,7 +3051,7 @@
{ \l__wheelchart_arc_data_text_pos_fp }
{ \l__wheelchart_arc_data_sep_fp + \g__wheelchart_half_ex_over_one_cm_fp }
+ \l__wheelchart_counter_or_clockwise_fp * \l__wheelchart_arc_data_dir_fp
- * \cs:w c__wheelchart_arc_data_start_factor_\l__wheelchart_arc_data_align_tl _fp\cs_end:
+ * \cs:w c__wheelchart_arc_data_start_factor_\l__wheelchart_arc_data_align_tl _fp \cs_end:
* \l__wheelchart_arc_data_total_angle_plot_false_fp
}
\path
@@ -3188,7 +3206,7 @@
}
\bool_if:NT \l__wheelchart_legend_row_bool
{ \__wheelchart_def_WClegend: }
- \__wheelchart_if_text:nn { middle }
+ \__wheelchart_if_text:nnn { middle } { o }
{ \node [ align = center , / wheelchart / middle_style ] at ( 0 , 0 ) { \pgfkeysvalueof { / wheelchart / middle } } ; }
\pgfkeysvalueof { / wheelchart / legend }
\end { scope }
@@ -3203,4 +3221,6 @@
\end { scope }
}
}
- } \ No newline at end of file
+ }
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/contrib/wheelchart/wheelchart.tex b/graphics/pgf/contrib/wheelchart/wheelchart.tex
index 5f0857f1a6..952fc93a81 100644
--- a/graphics/pgf/contrib/wheelchart/wheelchart.tex
+++ b/graphics/pgf/contrib/wheelchart/wheelchart.tex
@@ -137,7 +137,7 @@
\setcounter{secnumdepth}{2}
\title{The \texttt{wheelchart} package\\[12pt]\large Diagrams with circular or other shapes using \tikzname{} and \LaTeX3}
\author{Matthias Floré}
-\date{Version 3.0 (2024/03/08)}%\\[12pt]
+\date{Version 4.0 (2024/07/28)}%\\[12pt]
\begin{document}
\iftotalpages%
\newsavebox{\fancyfootdefaultbox}%
@@ -155,7 +155,11 @@
\maketitle
\thispagestyle{fancy}
\begin{abstract}
-\noindent This package is based on the package |tikz| (see \cite{TtTaPGFp}) and can be used to draw various kinds of diagrams such as a bar chart, doughnut chart, infographic, pie chart, ring chart, square chart, sunburst chart, waffle chart and wheel chart with \tikzname. It provides several options to customize the diagrams. It is also possible to specify a plot for the shape of the chart. Furthermore a legend can be added and the table of contents can be displayed as one of these diagrams. Other tools for creating wheel charts or pie charts can be found in \cite{MpMP}, \cite{JhcIparowcltopotPGFm}, \cite{Tumfdb}, \cite{XdPCbupp} and \cite{RSVpaaMfp}.% This is the manual for version .
+\noindent This package is based on the package |tikz| (see \cite{TtTaPGFp}) and can be used to draw various kinds of diagrams such as bar charts, doughnut charts, infographics, pie charts, ring charts, square charts, sunburst charts, waffle charts and wheel charts.
+
+\noindent It provides several options to customize the diagrams. It is also possible to specify a plot for the shape of the chart. Furthermore a legend can be added and the table of contents can be displayed as one of these diagrams.
+
+\noindent Other tools for creating wheel charts or pie charts can be found in \cite{MpMP}, \cite{JhcIparowcltopotPGFm}, \cite{Tumfdb}, \cite{XdPCbupp} and \cite{RSVpaaMfp}.% This is the manual for version .
\end{abstract}
\section*{\contentsname}
\iftotalpages
@@ -257,7 +261,7 @@ The default wheelchart with these data is shown below.
\end{tikzpicture}
\end{codeexample}
\end{command}
-\newpage%such that this section has its own block in the header
+\newpage%so that this section has its own block in the header
\section{Additional macros}
\begin{command}{\WCangle\opt{\oarg{number}}\marg{angle pos}\marg{angle shift}\marg{pos}\marg{sep}}
This command gives the angle in degrees of the point which is constructed as follows.
@@ -670,6 +674,11 @@ In the example below, it is necessary to use |arc data expand=e| and to place |\
\begin{key}{/wheelchart/arc data line sep factor=\marg{factor} (initially 1)}
The contents of the key |arc data| can consist of multiple lines separated by |\\|. The \meta{factor} determines the spacing between these lines.
\end{key}
+\begin{key}{/wheelchart/arc data lines pos=\marg{factor} (initially 0.5)}
+\end{key}
+\begin{key}{/wheelchart/arc data lines shift=\marg{value} (initially 0)}
+The positioning of the lines of the key |arc data| is determined by the index $k-1-\text{|arc data lines pos|}\cdot(N-1)+\text{|arc data lines shift|}$ where $N$ is the number of lines and $k\in\{1,\dots,N\}$.
+\end{key}
\begin{key}{/wheelchart/arc data pos=\marg{value} (initially 1)}
\end{key}
\begin{key}{/wheelchart/arc data sep=\marg{value} (initially 1ex/1cm)}
@@ -738,7 +747,6 @@ This key accepts a list of keys which will be applied to the node where the cont
\begin{codeexample}[width=10cm]
\begin{tikzpicture}
\wheelchart[
- at={(5,2)},
caption=Caption,
caption style={font=\scshape},
caption left=Caption left,
@@ -2909,6 +2917,11 @@ The following example is an answer to the question on \url{https://tex.stackexch
\item In v2.0, the key |arc data angle shift| was not taken into account for the key |arc| in combination with the key |arc around text|. This is fixed in v3.0.
\item In v2.0, the number of items for each slice in the \meta{wheelchart data} which can be accessed with the macros |\WCvarA| and so on was determined by the number of items for the last slice. For example, |data{1}=\WCvarD| in combination with the \meta{wheelchart data} |1/black/A/a,2/gray/B| was not possible with v2.0. This is not a limitation anymore with v3.0.
\end{itemize}
+\item[] \textbf{Version 4.0 (2024/07/28)}
+\begin{itemize}
+\item Added the keys |arc data lines pos| and |arc data lines shift|.
+\item Solved an incompatibility if |\\| is used in a key such as |data| inside an environment such as |center|.
+\end{itemize}
\end{itemize}
\begin{thebibliography}{9}
\bibitem{JhcIparowcltopotPGFm}
diff --git a/graphics/pgf/contrib/wordle/README.md b/graphics/pgf/contrib/wordle/README.md
index f1977a1ae7..fdfd996870 100644
--- a/graphics/pgf/contrib/wordle/README.md
+++ b/graphics/pgf/contrib/wordle/README.md
@@ -1,8 +1,33 @@
-wordle is a package to work with Wordle game.
------------------------------------------------------------
-wordle est un package pour travailler avec le jeu du sutom.
------------------------------------------------------------
-Author : Cédric Pierquet
-email : cpierquet@outlook.fr
-Licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
-Source : https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex \ No newline at end of file
+![v![]()ersion](https://img.shields.io/github/v/tag/AndrewMathas/wordle?color=success&label=version)
+<a href="http://www.latex-project.org/lppl.txt"><img src="https://img.shields.io/badge/license-LPPLv1.3c-blueviolet.svg"></a>
+<a href="https://www.latex-project.org/"><img src="https://img.shields.io/badge/latex-20B2AA?logo=Latex"></a>
+
+# Wordle
+
+A stupidly feature-rich LaTeX package for typesetting **Wordle** puzzles. This package provides a stupidly feature-rich way of creating Wordle puzzles in LaTeX, which [Wikipedia](https://en.wikipedia.org/wiki/Wordle) describes as a hugely popular web-based word game created and developed by Welsh software engineer Josh Wardle.
+
+This package provides the `wordle` environment, which uses the syntax:
+
+```tex
+% \usepackage{wordle}
+\begin{wordle}{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+\end{wordle}
+```
+
+Ce package fournit un moyen stupidement riche en fonctionnalités de créer des puzzles **Wordle** en LaTeX, que [Wikipedia](https://en.wikipedia.org/wiki/Wordle) décrit comme comme un jeu de lettres en ligne extrêmement populaire, créé et développé par l'ingénieur logiciel gallois Josh Wardle.
+
+```tex
+% \usepackage{wordle}
+\begin{GrilleSutom}{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+\end{GrilleSutom}
+```
+
+### Authors
+Andrew Mathas and Cédric Pierquet
+
diff --git a/graphics/pgf/contrib/wordle/doc/wordle-doc-en.pdf b/graphics/pgf/contrib/wordle/doc/wordle-doc-en.pdf
deleted file mode 100644
index aadb07f54b..0000000000
--- a/graphics/pgf/contrib/wordle/doc/wordle-doc-en.pdf
+++ /dev/null
Binary files differ
diff --git a/graphics/pgf/contrib/wordle/doc/wordle-doc-en.tex b/graphics/pgf/contrib/wordle/doc/wordle-doc-en.tex
deleted file mode 100644
index 06352f5ad5..0000000000
--- a/graphics/pgf/contrib/wordle/doc/wordle-doc-en.tex
+++ /dev/null
@@ -1,426 +0,0 @@
-% !TeX TXS-program:compile = txs:///arara
-% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode}
-% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
-
-\documentclass[english,a4paper,11pt]{article}
-\usepackage[margin=2cm,includefoot]{geometry}
-\def\TPversion{0.1.1}
-\def\TPdate{03/09/2023}
-\usepackage{amssymb,amsfonts,amsmath}
-\usepackage[utf8]{inputenc}
-%\usepackage[T1]{fontenc}
-\usepackage{wordle}
-\usepackage{awesomebox}
-\usepackage{fontawesome5}
-\usepackage{footnote}
-\makesavenoteenv{tabular}
-\usepackage{enumitem}
-\usepackage{tabularray}
-\usepackage{fancyvrb}
-\usepackage{fancyhdr}
-\fancyhf{}
-\renewcommand{\headrulewidth}{0pt}
-\lfoot{\sffamily\small [wordle]}
-\cfoot{\sffamily\small - \thepage{} -}
-\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
-
-%\usepackage{hvlogos}
-\usepackage{xspace}
-\usepackage{hologo}
-\providecommand\tikzlogo{Ti\textit{k}Z}
-\providecommand\TeXLive{\TeX{}Live\xspace}
-\providecommand\PSTricks{\textsf{PSTricks}\xspace}
-\let\pstricks\PSTricks
-\let\TikZ\tikzlogo
-\newcommand\TableauDocumentation{%
- \begin{tblr}{width=\linewidth,colspec={X[c]X[c]X[c]X[c]X[c]X[c]},cells={font=\sffamily}}
- {\LARGE \LaTeX} & & & & &\\
- & {\LARGE \hologo{pdfLaTeX}} & & & & \\
- & & {\LARGE \hologo{LuaLaTeX}} & & & \\
- & & & {\LARGE \TikZ} & & \\
- & & & & {\LARGE \TeXLive} & \\
- & & & & & {\LARGE \hologo{MiKTeX}} \\
- \end{tblr}
-}
-
-\usepackage{hyperref}
-\urlstyle{same}
-\hypersetup{pdfborder=0 0 0}
-\setlength{\parindent}{0pt}
-\definecolor{LightGray}{gray}{0.9}
-
-\usepackage{babel}
-%\AddThinSpaceBeforeFootnotes
-%\FrenchFootnotes
-
-\usepackage{listings}
-
-\usepackage{newverbs}
-\newverbcommand{\motcletex}{\color{cyan!75!black}}{}
-\newverbcommand{\packagetex}{\color{violet!75!black}}{}
-
-\usepackage[most]{tcolorbox}
-\tcbuselibrary{listingsutf8}
-\newtcblisting{DemoCode}[1][]{%
- enhanced,width=0.95\linewidth,center,%
- bicolor,size=title,%
- colback=cyan!2!white,%
- colbacklower=cyan!1!white,%
- colframe=cyan!75!black,%
- listing options={%
- breaklines=true,%
- breakatwhitespace=true,%
- style=tcblatex,basicstyle=\small\ttfamily,%
- tabsize=4,%
- commentstyle={\itshape\color{gray}},
- keywordstyle={\color{blue}},%
- classoffset=0,%
- keywords={},%
- alsoletter={-},%
- keywordstyle={\color{blue}},%
- classoffset=1,%
- alsoletter={-},%
- morekeywords={center,justify},%
- keywordstyle={\color{violet}},%
- classoffset=2,%
- alsoletter={-},%
- morekeywords={WordleGrid},%
- keywordstyle={\color{green!50!black}},%
- classoffset=3,%
- morekeywords={Colors,Rounded,Unit,Font,ColorLetters,Letters,Style,Thickness,BorderColor},%
- keywordstyle={\color{orange}}
- },%
- #1
-}
-
-\tcbset{vignettes/.style={%
- nobeforeafter,box align=base,boxsep=0pt,enhanced,sharp corners=all,rounded corners=southeast,%
- boxrule=0.75pt,left=7pt,right=1pt,top=0pt,bottom=0.25pt,%
- }
-}
-
-\tcbset{vignetteMaJ/.style={%
- fontupper={\vphantom{pf}\footnotesize\ttfamily},
- vignettes,colframe=purple!50!black,coltitle=white,colback=purple!10,%
- overlay={\begin{tcbclipinterior}%
- \fill[fill=purple!75]($(interior.south west)$) rectangle node[rotate=90]{\tiny \sffamily{\textcolor{black}{\scalebox{0.66}[0.66]{\textbf{MàJ}}}}} ($(interior.north west)+(5pt,0pt)$);%
- \end{tcbclipinterior}}
- }
-}
-
-\newcommand\Cle[1]{{\small\sffamily\textlangle \textcolor{orange}{#1}\textrangle}}
-\newcommand\cmaj[1]{\tcbox[vignetteMaJ]{#1}\xspace}
-
-\begin{document}
-
-\setlength{\aweboxleftmargin}{0.07\linewidth}
-\setlength{\aweboxcontentwidth}{0.93\linewidth}
-\setlength{\aweboxvskip}{8pt}
-
-\pagestyle{fancy}
-
-\thispagestyle{empty}
-
-\vspace{2cm}
-
-\begin{center}
- \begin{minipage}{0.75\linewidth}
- \begin{tcolorbox}[colframe=yellow,colback=yellow!15]
- \begin{center}
- \begin{tabular}{c}
- {\Huge \texttt{wordle} [en]}\\
- \\
- {\LARGE Grids of Wordle,} \\
- \\
- {\LARGE made with \textsf{Ti\textit{k}Z}.} \\
- \end{tabular}
-
- \bigskip
-
- {\small \texttt{Version \TPversion{} -- \TPdate}}
- \end{center}
- \end{tcolorbox}
-\end{minipage}
-\end{center}
-
-\begin{center}
- \begin{tabular}{c}
- \texttt{Cédric Pierquet}\\
- {\ttfamily c pierquet -- at -- outlook . fr}\\
- \texttt{\url{https://github.com/cpierquet/wordle}}
-\end{tabular}
-\end{center}
-
-\vspace{0.25cm}
-
-{$\blacktriangleright$~~Create Wordle grids Wordle/Sutom\footnotemark\footnotetext{\url{https://en.wikipedia.org/wiki/Wordle}}.}
-
-\vspace{0.25cm}
-
-{$\blacktriangleright$~~Specify colors and font\footnotemark\footnotetext{Ideas from \url{ttps://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex}}.
-
-\vspace{0.5cm}
-
-\begin{center}
-\begin{WordleGrid}{CRAZE}
- GRAIL TRACK CRAMP CRABS CRAZY CRAZE
-\end{WordleGrid}
-\end{center}
-
-\begin{center}
-\begin{WordleGrid}[Rounded=0,Colors={lightgray,orange,teal},Style=alt,Unit=0.5,Letters=false]{LADLE}
- FLAIL LAPEL LADLE
-\end{WordleGrid}
-%
-\hspace{5mm}
-%
-\begin{WordleGrid}[Rounded=0,Colors={lightgray,orange,teal},Style=alt,Unit=0.5]{LADLE}
- FLAIL LAPEL LADLE
-\end{WordleGrid}
-\end{center}
-
-\vspace{0.25cm}
-
-%\hfill{}\textit{Merci à Denis Bitouzé et à Gilles Le Bourhis pour leurs retours et idées !}
-
-\smallskip
-
-\vfill
-
-\hrule
-
-\medskip
-
-\TableauDocumentation
-
-\medskip
-
-\hrule
-
-\vspace*{1cm}
-
-\newpage
-
-\phantomsection
-\hypertarget{matoc}{}
-
-\tableofcontents
-
-\vfill
-
-\section{History}
-
-\verb|v0.1.1|~:~~~~Bugfix with english version.
-
-\verb|v0.1.0|~:~~~~Initial version.
-
-\newpage
-
-\section{The wordle package}
-
-\subsection{The game}
-
-\begin{noteblock}
-Wordle is a web-based word game created and developed by Welsh software engineer Josh Wardle. Players have six attempts to guess a five-letter word, with feedback given for each guess in the form of colored tiles indicating when letters match or occupy the correct position.
-
-Every day, a five-letter word is chosen which players aim to guess within six tries. After every guess, each letter is marked as either green, yellow or gray: green indicates that letter is correct and in the correct position, yellow means it is in the answer but not in the right position, while gray indicates it is not in the answer at all. Multiple instances of the same letter in a guess, such as the "o"s in "robot", will be colored green or yellow only if the letter also appears multiple times in the answer; otherwise, excess repeating letters will be colored gray.
-
-\smallskip
-
-\hfill{\scriptsize \url{https://en.wikipedia.org/wiki/Wordle}}
-\end{noteblock}
-
-\subsection{The package}
-
-\begin{noteblock}
-This package can display, in a \textsf{tex} file, a wordle grid (with \TikZ{} and within a \motcletex!minipage!), with ability :
-
-\begin{itemize}
- \item to change dimensions and colors ;
- \item to pick style for misplaced letters ;
- \item to change borders and corners ;
- \item to print or not the letters.
-\end{itemize}
-
-It's possible to "play" with other words than five-letter words !
-\end{noteblock}
-
-\begin{importantblock}
-Most of source code, in \hologo{LaTeX3}, is given by thread from \texttt{tex.stackexchange}, proposed by user \textsf{3141592653589793238}.
-\end{importantblock}
-
-\subsection{Loading of the package, used packages}
-
-\begin{importantblock}
-The package \packagetex!wordle! loads within the preamble.
-
-There's no option, and \packagetex!xcolor! isn't loaded.
-\end{importantblock}
-
-\begin{DemoCode}[listing only]
-\documentclass{article}
-\usepackage{wordle}
-
-\end{DemoCode}
-
-\begin{noteblock}
-\packagetex!wordle! loads the following packages and libraries :
-
-\begin{itemize}
- \item \packagetex!tikz!;
- \item \packagetex!simplekv! ;
- \item \packagetex!xstring!.
-\end{itemize}
-
-It’s mostly compatible with \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} or \textsf{xelatex} compilation !
-\end{noteblock}
-
-\vfill~
-
-\pagebreak
-
-\section{WordleGrid environment}
-
-\subsection{Environment}
-
-\begin{cautionblock}
-The environment to display a Wordle grid is \packagetex!WordleGrid!.
-
-It works with keys, between \texttt{[...]} and needs to know :
-
-\begin{itemize}
- \item the good word ;
- \item the different guesses.
-\end{itemize}
-
-The code create the grid and the colors !
-\end{cautionblock}
-
-\begin{DemoCode}[listing only]
-\begin{WordleGrid}[keys]{good word}
- guess n°1
- guess n°2
- guess n°3
-\end{WordleGrid}
-\end{DemoCode}
-
-\begin{noteblock}
-the grid is created with a \motcletex!minipage!, with automatic width and spacings !
-\end{noteblock}
-
-\begin{DemoCode}[]
-%default output
-\begin{WordleGrid}{REBUS}
- ARISE
- ROUTE
- RULES
- REBUS
-\end{WordleGrid}
-\end{DemoCode}
-
-\subsection{Keys and options}
-
-\begin{tipblock}
-The first argument, mandatory and between \texttt{[...]}, proposes the following \Cle{keys} :
-
-\begin{itemize}
- \item \Cle{Colors} : = colors of the boxes \Cle{back,misplaced,good} ;
-
- \hfill{}default : \Cle{WordleBack,WordleBad,WordleGood},%
- \item \Cle{Rounded} := arc for corners, in mm ; \hfill{}default : \Cle{0.1}
- \item \Cle{Unit} := width of cases, in cm ; \hfill{}default : \Cle{1}
- \item \Cle{Font} := font for letters ; \hfill{}default : \Cle{\textbackslash LARGE\textbackslash bfseries\textbackslash sffamily}
- \item \Cle{ColorLetters} := color for letters ; \hfill{}default : \Cle{white}
- \item \Cle{BorderColor} := color fot the border ; \hfill{}default : \Cle{white}
- \item \Cle{Letters} := boolean to print letters ; \hfill{}default : \Cle{true}
- \item \Cle{Style} := style within \Cle{default / other} to change the style ; \hfill{}default : \Cle{default}
- \item \Cle{Thick} := thickness of the borders, in mm. \hfill{}default : \Cle{0.25}
-\end{itemize}
-\vspace*{-\baselineskip}\leavevmode
-\end{tipblock}
-
-\begin{tipblock}
-The second argument, optional and between \texttt{\{...\}} is the correct word.
-
-\smallskip
-
-Different guesses are given within the body of the environment (line by line or space separated).
-\end{tipblock}
-
-\subsection{Examples}
-
-\begin{DemoCode}[]
-\begin{WordleGrid}{BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-%
-\hspace{5mm}
-%
-\begin{WordleGrid}[Style=alt]{BURGH}
- ABATE HERBS BURLY BURGH
-\end{WordleGrid}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{WordleGrid}
- [Thickness=0.3,BorderColor=black,%
- Colors={lightgray,orange,teal}]{BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-%
-\hspace{5mm}
-%
-\begin{WordleGrid}
- [Rounded=0,Thickness=0.3,BorderColor=black,%
- Colors={lightgray,orange,teal}]{BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{WordleGrid}[Unit=2,Font=\Huge\ttfamily,ColorLetters=black]{BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{WordleGrid}%
- [Unit=0.75,Rounded=0,Colors={cyan,orange,violet},Letters=false]{BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-\hspace{5mm}
-\begin{WordleGrid}%
- [Unit=0.75,Rounded=0,Colors={cyan,orange,violet},Style=alt]
- {BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-\hspace{5mm}
-\begin{WordleGrid}%
- [Unit=0.75,Rounded=0,Colors={cyan,orange,violet},Style=alt,Letters=false]
- {BURGH}
- ABATE
- HERBS
- BURLY
- BURGH
-\end{WordleGrid}
-\end{DemoCode}
-
-\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.pdf b/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.pdf
deleted file mode 100644
index 3277ca9a99..0000000000
--- a/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.pdf
+++ /dev/null
Binary files differ
diff --git a/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.tex b/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.tex
deleted file mode 100644
index f365cbb459..0000000000
--- a/graphics/pgf/contrib/wordle/doc/wordle-doc-fr.tex
+++ /dev/null
@@ -1,422 +0,0 @@
-% !TeX TXS-program:compile = txs:///arara
-% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode}
-% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
-
-\documentclass[french,a4paper,11pt]{article}
-\usepackage[margin=2cm,includefoot]{geometry}
-\def\TPversion{0.1.1}
-\def\TPdate{3 septembre 2023}
-\usepackage{amssymb,amsfonts,amsmath}
-\usepackage[utf8]{inputenc}
-%\usepackage[T1]{fontenc}
-\usepackage{wordle}
-\usepackage{awesomebox}
-\usepackage{fontawesome5}
-\usepackage{footnote}
-\makesavenoteenv{tabular}
-\usepackage{enumitem}
-\usepackage{tabularray}
-\usepackage{fancyvrb}
-\usepackage{fancyhdr}
-\fancyhf{}
-\renewcommand{\headrulewidth}{0pt}
-\lfoot{\sffamily\small [wordle]}
-\cfoot{\sffamily\small - \thepage{} -}
-\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
-
-%\usepackage{hvlogos}
-\usepackage{hologo}
-\providecommand\tikzlogo{Ti\textit{k}Z}
-\providecommand\TeXLive{\TeX{}Live\xspace}
-\providecommand\PSTricks{\textsf{PSTricks}\xspace}
-\let\pstricks\PSTricks
-\let\TikZ\tikzlogo
-\newcommand\TableauDocumentation{%
- \begin{tblr}{width=\linewidth,colspec={X[c]X[c]X[c]X[c]X[c]X[c]},cells={font=\sffamily}}
- {\LARGE \LaTeX} & & & & &\\
- & {\LARGE \hologo{pdfLaTeX}} & & & & \\
- & & {\LARGE \hologo{LuaLaTeX}} & & & \\
- & & & {\LARGE \TikZ} & & \\
- & & & & {\LARGE \TeXLive} & \\
- & & & & & {\LARGE \hologo{MiKTeX}} \\
- \end{tblr}
-}
-
-\usepackage{hyperref}
-\urlstyle{same}
-\hypersetup{pdfborder=0 0 0}
-\setlength{\parindent}{0pt}
-\definecolor{LightGray}{gray}{0.9}
-
-\usepackage{babel}
-\AddThinSpaceBeforeFootnotes
-\FrenchFootnotes
-
-\usepackage{listings}
-
-\usepackage{newverbs}
-\newverbcommand{\motcletex}{\color{cyan!75!black}}{}
-\newverbcommand{\packagetex}{\color{violet!75!black}}{}
-
-\usepackage[most]{tcolorbox}
-\tcbuselibrary{listingsutf8}
-\newtcblisting{DemoCode}[1][]{%
- enhanced,width=0.95\linewidth,center,%
- bicolor,size=title,%
- colback=cyan!2!white,%
- colbacklower=cyan!1!white,%
- colframe=cyan!75!black,%
- listing options={%
- breaklines=true,%
- breakatwhitespace=true,%
- style=tcblatex,basicstyle=\small\ttfamily,%
- tabsize=4,%
- commentstyle={\itshape\color{gray}},
- keywordstyle={\color{blue}},%
- classoffset=0,%
- keywords={},%
- alsoletter={-},%
- keywordstyle={\color{blue}},%
- classoffset=1,%
- alsoletter={-},%
- morekeywords={center,justify},%
- keywordstyle={\color{violet}},%
- classoffset=2,%
- alsoletter={-},%
- morekeywords={GrilleSutom},%
- keywordstyle={\color{green!50!black}},%
- classoffset=3,%
- morekeywords={Couleurs,Arrondi,Unite,Police,CouleurLettres,Lettres,Style,Epaisseur,CouleurBordure},%
- keywordstyle={\color{orange}}
- },%
- #1
-}
-
-\tcbset{vignettes/.style={%
- nobeforeafter,box align=base,boxsep=0pt,enhanced,sharp corners=all,rounded corners=southeast,%
- boxrule=0.75pt,left=7pt,right=1pt,top=0pt,bottom=0.25pt,%
- }
-}
-
-\tcbset{vignetteMaJ/.style={%
- fontupper={\vphantom{pf}\footnotesize\ttfamily},
- vignettes,colframe=purple!50!black,coltitle=white,colback=purple!10,%
- overlay={\begin{tcbclipinterior}%
- \fill[fill=purple!75]($(interior.south west)$) rectangle node[rotate=90]{\tiny \sffamily{\textcolor{black}{\scalebox{0.66}[0.66]{\textbf{MàJ}}}}} ($(interior.north west)+(5pt,0pt)$);%
- \end{tcbclipinterior}}
- }
-}
-
-\newcommand\Cle[1]{{\small\sffamily\textlangle \textcolor{orange}{#1}\textrangle}}
-\newcommand\cmaj[1]{\tcbox[vignetteMaJ]{#1}\xspace}
-
-\begin{document}
-
-\setlength{\aweboxleftmargin}{0.07\linewidth}
-\setlength{\aweboxcontentwidth}{0.93\linewidth}
-\setlength{\aweboxvskip}{8pt}
-
-\pagestyle{fancy}
-
-\thispagestyle{empty}
-
-\vspace{2cm}
-
-\begin{center}
- \begin{minipage}{0.75\linewidth}
- \begin{tcolorbox}[colframe=yellow,colback=yellow!15]
- \begin{center}
- \begin{tabular}{c}
- {\Huge \texttt{wordle} [fr]}\\
- \\
- {\LARGE Des grilles de Wordle (Sutom),} \\
- \\
- {\LARGE avec \textsf{Ti\textit{k}Z}.} \\
- \end{tabular}
-
- \bigskip
-
- {\small \texttt{Version \TPversion{} -- \TPdate}}
- \end{center}
- \end{tcolorbox}
-\end{minipage}
-\end{center}
-
-\begin{center}
- \begin{tabular}{c}
- \texttt{Cédric Pierquet}\\
- {\ttfamily c pierquet -- at -- outlook . fr}\\
- \texttt{\url{https://github.com/cpierquet/wordle}}
-\end{tabular}
-\end{center}
-
-\vspace{0.25cm}
-
-{$\blacktriangleright$~~Créer des grilles de Wordle/Sutom\footnotemark\footnotetext{\url{https://fr.wikipedia.org/wiki/Wordle}}.}
-
-\vspace{0.25cm}
-
-{$\blacktriangleright$~~Gestion des couleurs, de la taille\footnotemark\footnotetext{Idées venant de \url{ttps://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex}}.
-
-\vspace{1cm}
-
-\begin{center}
-\begin{GrilleSutom}{LUCIOLE}
- LAPINES
- LUMIERE
- LOURDES
- LUCIOLE
-\end{GrilleSutom}
-\end{center}
-
-\medskip
-
-\begin{center}
-\begin{GrilleSutom}[Arrondi=0,Couleurs={lightgray,orange,teal},Style=alt,Unite=0.5,Lettres=false]{REBUS}
- ABRIS
- ROUTE
- RUDES
- REBUS
-\end{GrilleSutom}
-%
-\hspace{5mm}
-%
-\begin{GrilleSutom}[Arrondi=0,Couleurs={lightgray,orange,teal},Style=alt,Unite=0.5]{REBUS}
- ABRIS
- ROUTE
- RUDES
- REBUS
-\end{GrilleSutom}
-\end{center}
-
-\vspace{0.5cm}
-
-%\hfill{}\textit{Merci à Denis Bitouzé et à Gilles Le Bourhis pour leurs retours et idées !}
-
-\smallskip
-
-\vfill
-
-\hrule
-
-\medskip
-
-\TableauDocumentation
-
-\medskip
-
-\hrule
-
-\vspace*{1cm}
-
-\newpage
-
-\phantomsection
-\hypertarget{matoc}{}
-
-\tableofcontents
-
-\vfill
-
-\section{Historique}
-
-\verb|v0.1.0|~:~~~~Correction d'un bug avec la version anglaise.
-
-\verb|v0.1.0|~:~~~~Version initiale.
-
-\newpage
-
-\section{Le package wordle}
-
-\subsection{Le principe du jeu}
-
-\begin{noteblock}
-Wordle est un jeu de lettres en ligne gratuit développé en 2021 par Josh Wardle. Ce jeu est une adaptation directe du jeu télévisé américain Lingo (Motus en France) qui propose de faire deviner un mot par plusieurs tentatives, en indiquant pour chacune d'entre-elles la position des lettres bien placées et mal placées.
-
-Le but du jeu est de deviner un mot spécifique de cinq lettres en un maximum de six tentatives, en tapant des lettres sur un écran de six lignes de cinq cases chacune. La personne qui joue inscrit sur la première ligne un mot de cinq lettres de son choix et entre sa proposition. Après chaque proposition, les lettres apparaissent en couleurs : le fond gris représente les lettres qui ne se trouvent pas dans le mot recherché, le fond jaune représente les lettres qui se trouvent ailleurs dans le mot, et le fond vert représente les lettres qui se trouvent à la bonne place dans le mot à trouver.
-
-\smallskip
-
-\hfill{\scriptsize \url{https://fr.wikipedia.org/wiki/Wordle}}
-\end{noteblock}
-
-\subsection{Le package}
-
-\begin{noteblock}
-Le package propose de quoi afficher, dans son document \LaTeX, une grille de Wordle (ou de Sutom) à l'aide de \TikZ{} et d'une \motcletex!minipage!, avec la possibilité :
-
-\begin{itemize}
- \item de spécifier les dimensions, la couleur ;
- \item de choisir le style des lettres mal placées ;
- \item de personnaliser les bordure et les coins ;
- \item d'afficher ou non les lettres.
-\end{itemize}
-
-Contrairement au jeu \og initial \fg, il est possible de travailler avec des mots de longueur différente de 5 !
-\end{noteblock}
-
-\begin{importantblock}
-Une bonne partie du code, en \hologo{LaTeX3}, est issu d'un fil sur \texttt{tex.stackexchange}, et proposé par l'internaute \textsf{3141592653589793238}.
-\end{importantblock}
-
-\subsection{Chargement du package, packages utilisés}
-
-\begin{importantblock}
-Le package se charge, de manière classique, dans le préambule.
-
-Il n'existe pas d'option pour le package, et \packagetex!xcolor! n'est pas chargé.
-\end{importantblock}
-
-\begin{DemoCode}[listing only]
-\documentclass{article}
-\usepackage{wordle}
-
-\end{DemoCode}
-
-\begin{noteblock}
-\packagetex!wordle! charge les packages suivants :
-
-\begin{itemize}
- \item \packagetex!tikz!;
- \item \packagetex!simplekv! ;
- \item \packagetex!xstring!.
-\end{itemize}
-
-Il est compatible avec les compilations usuelles en \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} ou \textsf{xelatex}.
-\end{noteblock}
-
-\vfill~
-
-\pagebreak
-
-\section{Environnement GrilleSutom}
-
-\subsection{Fonctionnement global}
-
-\begin{cautionblock}
-L'environnement dédié à la création de la grille du Sutom est \packagetex!GrilleSutom!.
-
-Il fonctionne avec un système de clés, entre \texttt{[...]}, et nécessite de préciser :
-
-\begin{itemize}
- \item le bon mot ;
- \item les différentes propositions.
-\end{itemize}
-
-Le code se charge de mettre en forme (grâce à une \motcletex!minipage!) la grille et les différentes couleurs d'aide.
-\end{cautionblock}
-
-\begin{DemoCode}[listing only]
-\begin{GrilleSutom}[clés]{mot à trouver}
- proposition n°1
- proposition n°2
- proposition n°3
-\end{GrilleSutom}
-\end{DemoCode}
-
-\begin{noteblock}
-Comme indiqué dans l'introduction, la grille est créée à l'aide d'un environnement \motcletex!minipage!, avec gestion automatique de la largeur et des espacements.
-\end{noteblock}
-
-\begin{DemoCode}[]
-%sortie par défaut
-\begin{GrilleSutom}{SUTOM}
- SAUCE
- SAUTS
- SUTOM
-\end{GrilleSutom}
-\end{DemoCode}
-
-\subsection{Clés et options}
-
-\begin{tipblock}
-Le premier argument, optionnel et entre \texttt{[...]}, propose les \Cle{clés} suivantes :
-
-\begin{itemize}
- \item \Cle{Couleurs} : = couleur des cases, sous la forme \Cle{fond,mal placée,bien placée} ;
-
- \hfill{}défaut : \Cle{cyan!75!black,yellow,red},%
- \item \Cle{Arrondi} := arrondi des coins, en mm ; \hfill{}défaut : \Cle{0.1}
- \item \Cle{Unite} := largeur des cases, en cm ; \hfill{}défaut : \Cle{1}
- \item \Cle{Police} := police des lettres ; \hfill{}défaut : \Cle{\textbackslash LARGE\textbackslash bfseries\textbackslash sffamily}
- \item \Cle{CouleurLettres} := couleur des lettres ; \hfill{}défaut : \Cle{white}
- \item \Cle{CouleurBordure} := couleur de la bordure des cases ; \hfill{}défaut : \Cle{white}
- \item \Cle{Lettres} := booléen pour afficher les lettre ; \hfill{}défaut : \Cle{true}
- \item \Cle{Style} := style parmi \Cle{rond / autre} pour changer le style ; \hfill{}défaut : \Cle{rond}
- \item \Cle{Epaisseur} := épaisseur des traits, en mm. \hfill{}défaut : \Cle{0.25}
-\end{itemize}
-\vspace*{-\baselineskip}\leavevmode
-\end{tipblock}
-
-\begin{tipblock}
-Le second argument, obligatoire et entre \texttt{\{...\}} correspond au mot correct à trouver.
-
-\smallskip
-
-Les différentes propositions sont à donner (ligne par ligne ou séparées par des espaces) dans le corps de l'environnement.
-\end{tipblock}
-
-\subsection{Exemples}
-
-\begin{DemoCode}[]
-\begin{GrilleSutom}{BOURDON}
- BALEINE
- BOURBON
- BROMURE
- BOURDON
-\end{GrilleSutom}
-%
-\hspace{5mm}
-%
-\begin{GrilleSutom}[Style=alt]{BOURDON}
- BALEINE BOURBON BROMURE BOURDON
-\end{GrilleSutom}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{GrilleSutom}
- [Style=alt,Epaisseur=0.3,CouleurBordure=black,%
- Couleurs={lightgray,orange,teal}]%
- {BOURDON}
- BALEINE BOURBON BROMURE BOURDON
-\end{GrilleSutom}
-%
-\hspace{5mm}
-%
-\begin{GrilleSutom}
- [Arrondi=0,Epaisseur=0.3,CouleurBordure=black,%
- Couleurs={lightgray,orange,teal}]%
- {BOURDON}
- BALEINE BOURBON BROMURE BOURDON
-\end{GrilleSutom}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{GrilleSutom}[Unite=2,Police=\Huge\ttfamily,CouleurLettres=black]{BOURDON}
- BALEINE
- BOURBON
- BROMURE
- BOURDON
-\end{GrilleSutom}
-\end{DemoCode}
-
-\begin{DemoCode}[]
-\begin{GrilleSutom}%
- [Unite=0.75,Arrondi=0,Couleurs={cyan,orange,violet},%
- Style=alt,Lettres=false]{REBUS}
- ABRIS
- ROUTE
- RUDES
- REBUS
-\end{GrilleSutom}
-\hspace{5mm}
-\begin{GrilleSutom}%
- [Unite=0.75,Arrondi=0,Couleurs={cyan,orange,violet},Style=alt]{REBUS}
- ABRIS
- ROUTE
- RUDES
- REBUS
-\end{GrilleSutom}
-\end{DemoCode}
-
-\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/wordle/tex/wordle.sty b/graphics/pgf/contrib/wordle/tex/wordle.sty
deleted file mode 100644
index 4df1801ba0..0000000000
--- a/graphics/pgf/contrib/wordle/tex/wordle.sty
+++ /dev/null
@@ -1,298 +0,0 @@
-% Author.........: C. Pierquet
-% licence........: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
-% Inspiration....: https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex
-
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{wordle}[2023/09/03 v0.1.1 Wordle grid]
-% 0.1.1 Coorection d'un bug sur la version anglaise
-% 0.1.0 Version initiale + quelques modèles
-
-%------Packages utiles
-\RequirePackage{tikz}
-\RequirePackage{simplekv}
-\RequirePackage{xstring}
-
-%commandes utiles
-\usepackage{expl3}
-\ExplSyntaxOn
-
-%boite en [fr]
-\cs_new:Npn \l__sutom_boite_lettre:nn #1#2#3
-{
- \ifboolKV[SUTOM]{Lettres}%
- {%
- \tikz \draw[rounded~corners=\fpeval{#3*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) node[midway,font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#2} ;
- }%
- {%
- \tikz \draw[rounded~corners=\fpeval{#3*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- }%
-}
-
-\cs_new:Npn \l__sutom_boite_lettre_rond:nn #1#2#3#4
-{
- \IfStrEq{\SutomStyle}{rond}
- {%
- \tikz {\draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- \ifboolKV[SUTOM]{Lettres}%
- {%
- \draw[line~width=\SutomWidth~mm,draw=#2,fill=#2] ({0.5*\SutomUnit},{0.5*\SutomUnit}) circle[radius=\fpeval{0.5*\SutomUnit-0.1*\SutomWidth}] node[font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#3} ;
- }%
- {%
- \draw[line~width=\SutomWidth~mm,draw=#2,fill=#2] ({0.5*\SutomUnit},{0.5*\SutomUnit}) circle[radius=\fpeval{0.5*\SutomUnit-0.1*\SutomWidth}];
- }%
- }%
- }%
- {%
- \ifboolKV[SUTOM]{Lettres}%
- {%
- \tikz \draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,line~width=0\SutomWidth~mm,draw=\SutomBorder,fill=#2] (0,0) rectangle++ (\SutomUnit,\SutomUnit) node[midway,font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#3} ;
- }%
- {%
- \tikz \draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,line~width=\SutomWidth~mm,draw=\SutomBorder,fill=#2] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- }%
- }%
-}
-
-%boite en [en]
-\cs_new:Npn \l__wordle_boite_lettre:nn #1#2#3
-{
- \ifboolKV[WORDLE]{Letters}%
- {%
- \tikz \draw[rounded~corners=\fpeval{#3*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) node[midway,font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#2} ;
- }%
- {%
- \tikz \draw[rounded~corners=\fpeval{#3*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- }%
-}
-
-\cs_new:Npn \l__wordle_boite_lettre_rond:nn #1#2#3#4
-{
- \IfStrEq{\SutomStyle}{default}
- {%
- \ifboolKV[WORDLE]{Letters}%
- {%
- \tikz \draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,line~width=\SutomWidth~mm,draw=\SutomBorder,fill=#2] (0,0) rectangle++ (\SutomUnit,\SutomUnit) node[midway,font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#3} ;
- }%
- {%
- \tikz \draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,line~width=\SutomWidth~mm,draw=\SutomBorder,fill=#2] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- }%
- }%
- {%
- \tikz {\draw[rounded~corners=\fpeval{#4*\SutomUnit}cm,draw=\SutomBorder,line~width=\SutomWidth~mm,fill=#1] (0,0) rectangle++ (\SutomUnit,\SutomUnit) ;
- \ifboolKV[WORDLE]{Letters}%
- {%
- \draw[line~width=\SutomWidth~mm,draw=#2,fill=#2] ({0.5*\SutomUnit},{0.5*\SutomUnit}) circle[radius=\fpeval{0.5*\SutomUnit-0.1*\SutomWidth}] node[font=\SutomFonte,text=\SutomFonteColor,scale=\SutomUnit] {#3} ;
- }%
- {%
- \draw[line~width=\SutomWidth~mm,draw=#2,fill=#2] ({0.5*\SutomUnit},{0.5*\SutomUnit}) circle[radius=\fpeval{0.5*\SutomUnit-0.1*\SutomWidth}];
- }%
- }%
- }%
-}
-
-\seq_new:N \l_wordle_seq % the answer
-\prop_new:N \l_wordle_prop % count letters in wordle
-\seq_new:N \l_words_seq % list of all words
-\prop_new:N \l_word_prop % count letters in word
-\int_new:N \l_letter_int % index of current letter in word
-
-% a conditional for nonnegative prop counter in \l_word_prop
-\prg_new_protected_conditional:Npnn \if_wordle_letter_nonnegative:n #1 {TF}
-{
- \prop_if_in:NnTF \l_word_prop {#1}
- { % letter in in prop
- \prop_get:NnN \l_word_prop {#1} \l_tmpa_tl
- \int_compare:nNnTF {\l_tmpa_tl} < {0}
- {\prg_return_false:} {\prg_return_true:}
- }
- {\prg_return_false:}
-}
-
-% a conditional for comparing letters
-\prg_new_protected_conditional:Npnn \if_wordle_letters_agree:n #1 {T, TF}
-{
- \str_set:Nx \l_tmpa_str {\seq_item:Nn \l_wordle_seq {\l_letter_int}}
- \str_if_eq:nVTF {#1} \l_tmpa_str {\prg_return_true:} {\prg_return_false:}
-}
-
-% add #3 to <prop=#1>.#2
-\cs_new_protected:Npn \wordle__add_to_prop_counter:Nnn #1#2#3
-{
- \prop_put_if_new:Nnn #1 {#2} {0}
- \prop_pop:NnN #1 {#2} \l_tmp_a
- \prop_put:Nnx #1 {#2} {\int_eval:n {#3+\l_tmp_a}}
-}
-
-% make \l_wordle_prop<x> = #x's in wordle_seq
-\cs_new_protected:Npn \count_letters_in_wordle:n #1
-{
- \wordle__add_to_prop_counter:Nnn \l_wordle_prop {#1} {1}%
-}
-
-% first run: subtract correct matches from letter counts
-\cs_new:Npn \count_letters_in_word:n #1
-{
- \int_incr:N \l_letter_int
- \if_wordle_letters_agree:nT {#1}
- { \wordle__add_to_prop_counter:Nnn \l_word_prop {#1} {-1} }%
-}
-
-%commande [fr]
-% on the second run we print a coloured wordle word
-\cs_new:Npn \write_letters_in_word:n #1
-{
- \int_incr:N \l_letter_int
- \if_wordle_letters_agree:nTF {#1}
- { \l__sutom_boite_lettre:nn {\SutomBienPlacee}{#1}{\SutomRounded} }
- {
- % subtract 1 from the prop counter
- \wordle__add_to_prop_counter:Nnn \l_word_prop {#1} {-1}
- % if the counter is non-negative this is a pseudo match
- \if_wordle_letter_nonnegative:nTF {#1}
- { \l__sutom_boite_lettre_rond:nn {\SutomCoulFond}{\SutomCoulMalPlacee}{#1}{\SutomRounded} }
- { \l__sutom_boite_lettre:nn {\SutomCoulFond}{#1}{\SutomRounded} }
- }%
-}
-
-%commande [en]
-% on the second run we print a coloured wordle word
-\cs_new:Npn \write_letters_in_wordle:n #1
-{
- \int_incr:N \l_letter_int
- \if_wordle_letters_agree:nTF {#1}
- { \l__wordle_boite_lettre:nn {\SutomBienPlacee}{#1}{\SutomRounded} }
- {
- % subtract 1 from the prop counter
- \wordle__add_to_prop_counter:Nnn \l_word_prop {#1} {-1}
- % if the counter is non-negative this is a pseudo match
- \if_wordle_letter_nonnegative:nTF {#1}
- { \l__wordle_boite_lettre_rond:nn {\SutomCoulFond}{\SutomCoulMalPlacee}{#1}{\SutomRounded} }
- { \l__wordle_boite_lettre:nn {\SutomCoulFond}{#1}{\SutomRounded} }
- }%
-}
-
-%clés [fr]
-\defKV[SUTOM]{%
- Couleurs=\def\SutomCouleurs{#1},%
- Arrondi=\def\SutomRounded{#1},%
- Unite=\def\SutomUnit{#1},%
- Police=\def\SutomFonte{#1},%
- CouleurLettres=\def\SutomFonteColor{#1},%
- Style=\def\SutomStyle{#1},%
- Epaisseur=\def\SutomWidth{#1},%
- CouleurBordure=\def\SutomBorder{#1}
-}
-
-\setKVdefault[SUTOM]{%
- Couleurs={cyan!75!black,yellow,red},%
- Arrondi=0.1,%
- Unite=1,%
- Police=\LARGE\bfseries\sffamily,%
- CouleurLettres=white,%
- Lettres=true,%
- Style=rond,%
- Epaisseur=0.25,%
- CouleurBordure=white
-}
-
-%environnement [fr]
-\NewDocumentEnvironment{GrilleSutom}{ O{} m b }%
-{%
- \restoreKV[SUTOM]%
- \setKV[SUTOM]{#1}%
- \StrBefore{\SutomCouleurs}{,}[\SutomCoulFond]%
- \StrBetween[1,2]{\SutomCouleurs}{,}{,}[\SutomCoulMalPlacee]%
- \StrBehind[2]{\SutomCouleurs}{,}[\SutomBienPlacee]%
- \StrLen{#2}[\SutomNbLettres]%
- \def\SutomLarg{\fpeval{1.01*\SutomUnit*\SutomNbLettres}}%
- \begin{minipage}{\SutomLarg~cm}
- \lineskip=0pt%
- \parindent=0pt%
- % split the answer into letters
- \seq_set_split:Nnn \l_wordle_seq {} {#2}
- % we need to count the number of times each letter appears in \l_wordle_seq
- \prop_clear:N \l_wordle_prop
- \tl_map_function:nN {#2} \count_letters_in_wordle:n
- % split the solution into words
- \regex_split:nnN {\s} {#3} \l_words_seq
- % process the words
- \seq_map_inline:Nn \l_words_seq
- {
- \int_zero:N \l_letter_int
- \prop_set_eq:NN \l_word_prop \l_wordle_prop
- \tl_map_function:nN {##1} \count_letters_in_word:n
- \int_zero:N \l_letter_int
- \tl_map_function:nN {##1} \write_letters_in_word:n
- \par
- }
-}%
-{%
- \end{minipage}%
-}
-
-%clés [en]
-\definecolor{WordleBack}{HTML}{797D7F}
-\definecolor{WordleBad}{HTML}{CAB557}
-\definecolor{WordleGood}{HTML}{6AAB64}
-
-\defKV[WORDLE]{%
- Colors=\def\SutomCouleurs{#1},%
- Rounded=\def\SutomRounded{#1},%
- Unit=\def\SutomUnit{#1},%
- Fonte=\def\SutomFonte{#1},%
- ColorLetters=\def\SutomFonteColor{#1},%
- Style=\def\SutomStyle{#1},%
- Thickness=\def\SutomWidth{#1},%
- BorderColor=\def\SutomBorder{#1}
-}
-
-\setKVdefault[WORDLE]{%
- Colors={WordleBack,WordleBad,WordleGood},%
- Rounded=0.1,%
- Unit=1,%
- Fonte=\LARGE\bfseries\sffamily,%
- CouleurLettres=white,%
- Letters=true,%
- Style=default,%
- Thick=0.25,%
- BorderColor=white
-}
-
-%environnement [en]
-\NewDocumentEnvironment{WordleGrid}{ O{} m b }
-{%
- \restoreKV[WORDLE]%
- \setKV[WORDLE]{#1}%
- \StrBefore{\SutomCouleurs}{,}[\SutomCoulFond]%
- \StrBetween[1,2]{\SutomCouleurs}{,}{,}[\SutomCoulMalPlacee]%
- \StrBehind[2]{\SutomCouleurs}{,}[\SutomBienPlacee]%
- \StrLen{#2}[\SutomNbLettres]%
- \def\SutomLarg{\fpeval{1.01*\SutomUnit*\SutomNbLettres}}%
- \begin{minipage}{\SutomLarg~cm}
- \parindent=0pt
- \lineskip=0pt
- % split the answer into letters
- \seq_set_split:Nnn \l_wordle_seq {} {#2}
- % we need to count the number of times each letter appears in \l_wordle_seq
- \prop_clear:N \l_wordle_prop
- \tl_map_function:nN {#2} \count_letters_in_wordle:n
- % split the solution into words
- \regex_split:nnN {\s} {#3} \l_words_seq
- % process the words
- \seq_map_inline:Nn \l_words_seq
- {
- \int_zero:N \l_letter_int
- \prop_set_eq:NN \l_word_prop \l_wordle_prop
- \tl_map_function:nN {##1} \count_letters_in_word:n
- \int_zero:N \l_letter_int
- \tl_map_function:nN {##1} \write_letters_in_wordle:n
- \par
- }
-}%
-{%
- \end{minipage}%
-}
-
-\ExplSyntaxOff
-
-\endinput \ No newline at end of file
diff --git a/graphics/pgf/contrib/wordle/wordle-doc-en.pdf b/graphics/pgf/contrib/wordle/wordle-doc-en.pdf
new file mode 100644
index 0000000000..7845bc31b5
--- /dev/null
+++ b/graphics/pgf/contrib/wordle/wordle-doc-en.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/wordle/wordle-doc-en.tex b/graphics/pgf/contrib/wordle/wordle-doc-en.tex
new file mode 100644
index 0000000000..a638ed9496
--- /dev/null
+++ b/graphics/pgf/contrib/wordle/wordle-doc-en.tex
@@ -0,0 +1,921 @@
+% !TeX TS-program = pdflatex
+
+\documentclass[svgnames]{report}
+\usepackage{wordle}
+\usepackage{manfnt}
+\usepackage{enumitem}
+\setlist[description]{font=\sffamily\bfseries\color{ForestGreen},labelwidth=\textwidth}
+\usepackage{booktabs}
+\usepackage[a4paper,margin=18mm]{geometry}
+\synctex=1
+\parindent=0pt
+\parskip=2mm
+
+\usepackage{cmap} % fix search and cut-and-paste in Acrobat
+\setcounter{secnumdepth}{0}
+
+\usepackage{listings}\lstset{language=[LaTeX]TeX,framerule=2pt}
+\lstset{language=[LaTeX]TeX,
+ texcsstyle=*\bfseries\color{Peru},
+ backgroundcolor=\color{Ivory},
+ numbers=none,
+ breaklines=true,
+ keywordstyle=\color{Sienna},
+ commentstyle=\color{BurlyWood},
+ tabsize=2,
+ morekeywords={Wordle,wordle,GrilleSutom},
+ resetmargins=true,
+}
+% hyperref links to ctan
+\newcommand\ctan[1]{\href{https://www.ctan.org/pkg/#1}{\texttt{#1}}}
+
+\newcommand\Section[1]{\subsection{\textcolor{DarkGreen}{#1}}}
+
+\ExplSyntaxOn
+\NewDocumentCommand\option{ omo }{%
+ \IfNoValueTF{#1}{\textsf{#2}}
+ {%
+ \textbf{\textcolor{Crimson}{#2}}
+ \str_if_empty:nF {#1}{~(default:~\textcolor{DarkRed}{#1})}%
+ \IfNoValueF{#3}{\hfill\textcolor{Gray}{[accepts:~#3]}}%
+ }%
+ \index{#2}%
+}
+\ExplSyntaxOff
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage{imakeidx}
+\indexsetup{level=\section*, toclevel=section, noclearpage}
+\makeindex[intoc,columns=3]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage[skins,listings]{tcolorbox}
+\usetikzlibrary{backgrounds, shapes.geometric} % for tikz={framed,...}
+
+\DeclareTotalTCBox\keyword{ O{} v }{
+ fontupper=\sffamily,
+ nobeforeafter,
+ skin=tile,
+ verbatim,
+ on line,
+ tcbox raise base,
+ top=0pt,bottom=0pt,left=0mm,right=0mm,
+ colback=OldLace,
+ colupper=ForestGreen,
+ #1}
+{#2}
+
+\lstdefinestyle{tikz}{style=tcblatex,
+ classoffset=0,
+ texcsstyle=*\color{DarkGoldenrod},%
+ deletetexcs={begin, end},
+ moretexcs={,%
+ node,
+ draw,
+ true,
+ false
+ },%
+ classoffset=1,
+ keywordstyle=\color{ForestGreen},%
+ morekeywords={wordle,GrilleSutom},
+ classoffset=2,
+ keywordstyle=\color{Crimson},%
+ morekeywords={
+ absent,
+ align,
+ border,
+ borders,
+ case,
+ color,
+ colors,
+ colour,
+ colours,
+ correct,
+ empty,
+ font,
+ frame,
+ frames,
+ letters,
+ lower,
+ name,
+ natural,
+ noalign,
+ noletters,
+ params,
+ present,
+ rounded,
+ rows,
+ scale,
+ sensitive,
+ separation,
+ shape,
+ shapes,
+ size,
+ strict,
+ style,
+ style,
+ text,
+ thickness,
+ tikz,
+ tile,
+ upper,
+ },
+ classoffset=3,
+ keywordstyle=\color{DarkOrange},%
+ morekeywords={
+ hard,
+ standard,
+ sutom,
+ }
+}
+
+\DeclareTCBListing{example}{ !O{} }{%
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ lefthand width=50mm,
+ listing style=tikz,
+ sidebyside,
+ sidebyside align=center,
+ sidebyside gap=4mm,
+ text and listing,
+ text outside listing,
+ boxsep = 0pt,
+ #1
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\makeatletter
+\author{Andrew Mathas and Cédric Pierquet}
+\usepackage{tikz}
+\usetikzlibrary{shadows.blur}
+\tikzset{shadowed/.style={blur shadow={shadow blur steps=5},
+ bottom color=ForestGreen!30,
+ draw=MediumSeaGreen!70,
+ shade,
+ font=\normalfont\Huge\bfseries\scshape,
+ rounded corners=8pt,
+ top color=SeaGreen,
+ },
+ boxes/.style={draw=SeaGreen,
+ fill=Cornsilk,
+ font=\sffamily\small,
+ inner sep=5pt,
+ rectangle,
+ rounded corners=8pt,
+ text=DarkGreen,
+ }
+}
+\newcommand\Wordle{%
+ \begin{tikzpicture}[remember picture,overlay]
+ \node[yshift=-3cm] at (current page.north west)
+ {\begin{tikzpicture}[remember picture, overlay]
+ \draw[shadowed](30mm,0) rectangle node[white]{wordle} (\paperwidth-30mm,16mm);
+ \node[anchor=west,boxes] at (4cm,0cm) {\@author};
+ \node[anchor=east,boxes] at (\paperwidth-4cm,0) {Version \wordle@version};
+ \end{tikzpicture}
+ };
+ \end{tikzpicture}
+ \vspace*{20mm}
+}
+
+\def\@oddfoot{\textsc{Wordle} --- \wordle@version~(released~\wordle@release)\hfill\thepage}
+
+\usepackage[colorlinks=true,linkcolor=blue,urlcolor=MediumBlue]{hyperref}
+\hypersetup{
+ pdfcreator={ Generated by pdfLaTeX },
+ pdfinfo={
+ Author ={ Andrew Mathas and Cédric Pierquet},
+ Keywords={ wordle },
+ License ={ LaTeX Project Public License v1.3c or later },
+ Subject ={ LaTeXing Wordle puzzles },
+ Title ={ Wordle - \wordle@version }
+ },
+}
+\makeatother
+
+\begin{document}
+
+ \Wordle
+
+ This package provides a stupidly feature-rich way of creating
+ \keyword{Wordle} puzzles in \LaTeX, which
+ \href{https://en.wikipedia.org/wiki/Wordle}{Wikipedia} describes as a
+ hugely popular web-based word game created and developed by Welsh
+ software engineer Josh Wardle. This package is an enhanced version of
+ one of the solutions to a question asked by \textcolor{FireBrick}{valerio\_new}
+ on
+ \href{https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex/660056#660056}{tex.stackexchange.com}.
+
+ This package provides the \keyword{wordle} environment, which uses the
+ syntax:
+
+ \begin{tcblisting}{
+ listing only,
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ listing style=tikz,
+ boxsep = 0pt,
+ }
+ % \usepackage{wordle}
+ \begin{wordle}[wordle settings]{solution}[optional tikz commands]
+ guess1 guess2 ...
+ \end{wordle}
+ \end{tcblisting}
+ \index{environment!wordle}
+ \index{wordle}
+
+ and the \keyword{GrilleSutom} environment, for \keyword{Sutom}, the French version of
+ the games:
+
+ \begin{tcblisting}{
+ listing only,
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ listing style=tikz,
+ boxsep = 0pt,
+ }
+ % \usepackage{wordle}
+ \begin{GrilleSutom}[sutom settings]{solution}[optional TikZ commands]
+ guess1 guess2 ...
+ \end{GrilleSutom}
+ \end{tcblisting}
+ \index{environment!GrilleSutom}
+ \index{GrilleSutom}
+ \index{sutom}
+
+ The words in the puzzle can be entered on a single lines, or on separate
+ lines. Here are some examples:
+
+ \begin{example}
+ \begin{wordle}{ANVIL}
+ % English version of sutom (wordle)
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ \begin{example}
+ % French version of wordle (sutom)
+ \begin{GrilleSutom}{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ As in the online puzzles, the \keyword{wordle} environment
+ automatically colours the letter tiles
+ \keyword[colback=WordleCorrect,colupper=White]{green}
+ when the letter is in the same position as the solution, and as
+ \keyword[colback=WordlePresent,colupper=White]{gold} when
+ the letter is in the solution but it is not in the correct position.
+ Similarly, \keyword{GrilleSutom} colours the correct letters
+ \keyword[colback=WordleSutomCorrect,colupper=White]{red}
+ and the present letters
+ \keyword[colback=WordleSutomPresent,colupper=White]{gold}.
+ As described below, these colours can be changed to suit your tastes.
+
+ The number of letters in the puzzle is determined by the solution,
+ being constrained only by the page width.
+
+ \begin{example}
+ \begin{wordle}[rows=4]{orange}
+ normal
+ orders
+ orange
+ \end{wordle}
+ \end{example}
+
+ The letters in the puzzle can be entered in upper case, lower case, or
+ mixed case. By default, the case of the letters is ignored when
+ determining the colours of the letter tiles.
+
+ As described below, the \keyword{wordle} and \keyword{GrilleSutom}
+ environments accept an array of different options that change the
+ colours, fonts, and shapes of the tile. In addition, you can the case
+ sensitivity of the environments, add extra rows to the puzzle, disable
+ special formatting of the \textit{letter tiles}. These options are
+ given as a comma separated list key-value pairs. They can be set
+ locally, using the optional argument of the \keyword|wordle|
+ environment, or they can be set globally (more accurately, in the
+ current \LaTeX\ group) using the \keyword{\WordleSetup} command
+ \index{\textbackslash WordleSetup}, or as global package options, via
+ \keyword{\usepackage[options]{wordle}}. The order of the options does
+ not matter, except that later options take precedence over earlier
+ ones, with the exception of \option{tikz} and \option{tile style} keys
+ which are always applied last.
+
+ The \keyword{wordle} puzzles are drawn using \ctan{TikZ}, with each
+ letter in the puzzle sitting inside a \ctan{TikZ} node. Many of the
+ options control the settings of these nodes.
+
+ The descriptions of the options below are grouped according to their
+ function.
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Wordle styles}
+
+ The \option{style} key can be used to change many characteristics of
+ the tiles in a \keyword{wordle} puzzle, including their colours, the
+ fonts and so on. The more common settings can be setting using the
+ \option{style} keyword. \textit{The style should always be set first
+ because, otherwise, the style settings may override earlier settings.}
+
+ The following styles are supported:
+
+ \textcolor{DarkOrange}{sutom}
+ \index{style!sutom}
+ \index{sutom}
+
+ \begin{example}
+ \begin{wordle}[style=sutom]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ The \textcolor{DarkOrange}{sutom} style is the default
+ style for the \keyword{GrilleSutom} environment.
+
+ \textcolor{DarkOrange}{standard}
+ \index{style!standard}
+
+ \begin{example}
+ \begin{wordle}[style=standard]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ The \textcolor{DarkOrange}{standard} style is the default style for the
+ \keyword{wordle} environment.
+
+ \textcolor{DarkOrange}{hard}
+ \index{style!hard}
+
+ \begin{example}
+ \begin{wordle}[style=hard]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Options for the individual styles of the letter tiles}
+
+ There are four types of letter tiles in \keyword{wordle}:
+ \option{absent}, \option{present}, \option{correct} and
+ \option{empty}, corresponding to letters not in the solution,
+ incorrectly placed letters, correctly placed letters, and empty
+ tiles, respectively. The options in this section can be used to set
+ the text, tile and border colours, shapes, and frames of these tiles.
+
+ The letter tiles in a \keyword{wordle} environment are typeset inside
+ a \ctan{TikZ} \keyword{\node}. The options below control the different
+ style settings of these nodes.
+
+ \option[--]{colours}[comma separated list of valid colours]
+
+ The \option{colours} option is a short-hand for specifying the colours
+ of the \option{absent}, \option{present}, \option{correct} and
+ \option{empty} tiles, in that order. Later colours can be omitted but
+ the colours should be given in this order, from left to right.
+ If only one colour is given then this colour is applied to all tiles.
+
+ \begin{example}
+ \begin{wordle}[colours={LightGray,Orange,Teal}]{cellar}
+ pounds
+ taylor
+ cellar
+ \end{wordle}
+ \end{example}
+
+ The colours can also be set individually using \option{absent colour},
+ \option{present colour}, \option{correct colour} and \option{empty
+ colour}. To support north American dialects, is also possible to use
+ \option{colors}, \option{absent color}, \option{present color},
+ \option{correct color} and \option{empty color}.
+
+ \begin{example}
+ \begin{wordle}[absent colour=DarkGray,present color=Salmon,
+ correct color=SeaGreen]{cellar}
+ pounds
+ taylor
+ cellar
+ \end{wordle}
+ \end{example}
+
+ \option[white]{borders}[comma separated list of valid colours]
+
+ Similar to the \option{colours} option, this is a short-hand for the
+ setting border colour of the \option{absent}, \option{present},
+ \option{correct} and \option{empty} tiles, in that order.
+ If only one colour is given then this colour is applied to all tiles.
+
+ \begin{example}
+ \begin{wordle}[borders={red, orange,blue}]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ You can set the border borders of the individual tiles using
+ \option{absent border}, \option{present border}, \option{correct
+ border} and \option{empty border}
+
+ \option[false]{frames}[comma separated list of true/false]
+
+ This is a short-hand for adding a rectangular frame around the
+ \option{absent}, \option{present}, \option{correct} and \option{empty}
+ tiles, in that order, with the same background colour as the
+ \option{absent} file. This is only useful for non-square tiles.
+
+ \begin{example}
+ \begin{wordle}[frames={false,true,true}, shapes=circle]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ You can set the frames of the individual tiles using
+ \option{absent frame}, \option{present frame},
+ \option{correct frame} and \option{empty~frame}.
+
+ \option[rectangle]{shapes}[comma separated list of TikZ shapes]
+
+ Similar to the \option{colours} option, this is a short-hand for the
+ setting shape colour of the \option{absent}, \option{present},
+ \option{correct} and \option{empty} tiles, in that order.
+
+ \begin{example}
+ \begin{wordle}[shapes={circle, rectangle, circle}]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ You can set the shape shapes of the individual tiles using
+ \option{absent shape}, \option{present shape},
+ \option{correct shape} and \option{empty shape}
+ You can use the shapes provided by the \ctan{TikZ}
+ \texttt{shapes.geometric} package, including \texttt{diamond},
+ \texttt{ellipse}, \texttt{trapezium} and \texttt{star}; see
+ section~71.2 of the \ctan{TikZ} manual.
+
+ \begin{example}
+ % \usepackage{shapes.geometric}
+ \begin{wordle}[shapes={diamond, ellipse, star}]{LADLE}
+ FLAIL
+ LAPEL
+ *
+ LADLE
+ LOVER
+ \end{wordle}
+ \end{example}
+
+ \option[white]{text}[comma separated list of valid colours]
+
+ This is a short-hand for the setting the text colours of the
+ \option{absent}, \option{present}, \option{correct} and \option{empty}
+ tiles, in that order.
+
+ \begin{example}
+ \begin{wordle}[text={red, orange,blue}]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ You can set the text borders of the individual tiles using
+ \option{absent text}, \option{present border}, \option{correct
+ text} and \option{empty border}
+
+
+ \Section{Common tile characteristics}
+
+ The following options apply to all tiles.
+
+ \option[]{noalign} (default) \qquad
+ \option[]{align}
+
+ The options tweak the vertical alignment of the letters in each row of
+ the puzzle. This is only likely to be useful if you have lower case
+ letters in your puzzle.
+
+ \begin{example}
+ \begin{wordle}[align]{agony}
+ groan
+ angry
+ agony
+ \end{wordle}
+ \end{example}
+
+ \begin{example}
+ \begin{wordle}[noalign]{agony} % the default
+ groan
+ angry
+ agony
+ \end{wordle}
+ \end{example}
+
+ \option[\textbackslash Large\textbackslash bfseries\textbackslash sffamily]{font}
+ [LaTeX font specification]
+
+ Sets the font used by all \keyword{wordle} letters. Any valid sequence
+ of \LaTeX\ font commands can be used.
+
+ \begin{example}
+ \begin{wordle}[font=\large\sffamily]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ \option[1mm]{rounded}[a length]
+
+ Set TikZ \texttt{rounded corners} key for the \keyword{wordle} letter tiles.
+
+ \begin{example}
+ \begin{wordle}[rounded=2mm]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ \option[0.5mm]{separation}[a length]
+
+ Sets the separation distance between the \keyword{wordle} letter
+ tiles.
+
+ \begin{example}
+ \begin{wordle}[separation=2mm, borders=black]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ \option[1]{scale}[a number]
+
+ The \option{scale} option rescales the \keyword{wordle} environment.
+ The \option{scale} alters the dimensions sets by the \option{rounded},
+ \option{separation} \option{size} and \option{thickness} options. If
+ you change the scale, then you will almost certainly want
+ to change font size font as well, which you can do using the
+ \option{font} option:
+
+ \begin{example}
+ \begin{wordle}[scale=1.5, font=\huge\bfseries]{SIZE}
+ HELP
+ WISE
+ SIZE
+ \end{wordle}
+ \end{example}
+
+ \option[8mm]{size}[a length]
+
+ The \option{size} option sets the size of the \keyword{wordle} letter
+ tiles. Unlike the \option{scale} option, \option{size} only changes
+ the dimensions of the letter tiles.
+
+ \begin{example}
+ \begin{wordle}[size=10mm, font=\huge\bfseries]{LADLE}
+ FLAIL LAPEL * LADLE
+ \end{wordle}
+ \end{example}
+
+ \option[0.25mm]{thickness}[a length]
+
+ Sets the border thickness of the \keyword{wordle} letter tiles. By
+ default, the borders of the tiles are white, which makes this setting
+ hard to see, so the following example changes the border to red.
+
+ \begin{example}
+ \begin{wordle}[thickness=1mm, borders=red]{LADLE}
+ FLAIL
+ LAPEL
+ LADLE
+ \end{wordle}
+ \end{example}
+
+ \option[--]{tile style}[comma separated list of TikZ style keys]
+
+ A comma-separated list of \ctan{Tikz} node keys that are appended to
+ the style of the \ctan{TikZ} node that contains each of the
+ \keyword{wordle} letters. Some of the options given above can be set
+ directly using the \option{tile style} option. When using the
+ \option{tile style}, be careful not to break the special formatting of
+ letters provided by the \keyword{wordle} environment.\par
+
+ With most of the \keyword{wordle} options, the latter options take
+ precedence, however, the \option{tile style} option is applied last,
+ so it overrides any competing options.
+
+ % TODO: Fix this because it looks like this style is being applied
+ % twice because the PDF file shows a rotation of 90 = 2*45...
+ \begin{example}
+ \begin{wordle}[tile style={rotate=45}]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Extra rows and columns}
+
+ By default, all of the words in a \keyword{wordle} puzzle are assumed
+ to have the same number of letters as the solution, and the number of
+ rows in the puzzle is number of words given in the environment. The
+ options below give more control over the number of rows and columns in
+ the puzzle.
+
+ \option[]{letters} (default)\qquad
+ \option[]{noletters}
+
+ By default, the letters in the puzzle are printed. You can hide the
+ letters from the puzzle, while still keeping the \keyword{wordle} tile
+ colouring, using \option{noletters}.
+
+ \begin{example}
+ \begin{wordle}[letters]{CRAZE} % the default
+ TRACE
+ CREAM
+ CRAZE
+ \end{wordle}
+ \end{example}
+
+ \begin{example}
+ \begin{wordle}[noletters]{CRAZE}
+ TRACE
+ CREAM
+ CRAZE
+ \end{wordle}
+ \end{example}
+
+ \option[false]{strict}[true/false/--]
+
+ By default, the \keyword{wordle} environment does not check that each
+ word in the puzzle has the same length as the solution, so missing
+ and extra letters receive no special processing.
+
+ \begin{example}
+ \begin{wordle}[strict=false]{CRAZE} % the default
+ GRAIL
+ CRAMPS
+ CRAM
+ CRABS
+ \end{wordle}
+ \end{example}
+
+ The \option{strict} option enforces the word length in the puzzle by
+ marking missing letters as incorrect and striking out extra letters.
+
+ \begin{example}
+ \begin{wordle}[strict]{CRAZE}
+ GRAIL
+ CRAMPS
+ CRAM
+ CRABS
+ \end{wordle}
+ \end{example}
+
+ \option[--]{rows}
+
+ By default, a \keyword{wordle} environment displays the words
+ in the puzzle environment with one word per row. You can add extra
+ (blank) rows to the puzzle with the \option{rows} option.
+
+ \begin{example}
+ \begin{wordle}[rows=4]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+ The \option{rows} option only adds extra rows to the puzzle if they
+ are needed. This option does not prevent ``extra'' rows from
+ appearing.
+
+ \begin{example}
+ \begin{wordle}[rows=2]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+
+ \option[]{*}
+
+ You can disable the special colouring of letter tiles in a
+ \keyword{wordle} puzzle by adding an asterisk,~\option{*}, as a
+ \textit{word}, into the puzzle.
+
+ \begin{example}
+ \begin{wordle}{ANVIL}
+ CRANE
+ NATAL
+ * % disable wordle colouring
+ ANNUL
+ ANVIL
+ \end{wordle}
+ \end{example}
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Case sensitivity}
+ \index{case~sensitive}
+ \index{case~sensitive!lower case}
+ \index{case~sensitive!natural case}
+ \index{case~sensitive!upper case}
+
+ By default, the letters are printed in upper and lower case, exactly
+ as typed, and the letter comparisons are not case sensitive.
+
+ \option[false]{case~sensitive}
+
+ By default the \keyword{wordle} puzzles are not case sensitive, but
+ you can make them case sensitive using this option. Note that
+ \keyword{case sensitive} is the same as \keyword{case sensitive=true}
+ (and the default option is the same as
+ \keyword{case sensitive=false}).
+
+ \begin{example}
+ \begin{wordle}[case sensitive=false]{youth} % the default
+ North
+ South
+ Youth
+ \end{wordle}
+ \end{example}
+
+ Here is a case sensitive version of this puzzle.
+
+ \begin{example}
+ \begin{wordle}[case sensitive]{youth}
+ North
+ South
+ Youth
+ \end{wordle}
+ \end{example}
+
+ As this puzzle is case sensitive, the \keyword{Y} on the last line is
+ not marked as being correct because it does not match the \keyword{y}
+ in the solution.
+
+ \option[]{natural case} (default) \qquad
+ \option[]{lower case} \qquad
+ \option[]{upper case}
+
+ The \option{lower case} and \option{upper case} options force all
+ letters in the puzzle to be in lower or upper case, respectively.
+
+ \begin{example}
+ \begin{wordle}[lower case]{YOUTH}
+ North
+ South
+ Youth
+ \end{wordle}
+ \end{example}
+
+ \begin{example}
+ \begin{wordle}[upper case]{youth}
+ North
+ South
+ Youth
+ \end{wordle}
+ \end{example}
+
+ As these examples show, both of these options disable the case
+ sensitivity of the tests for colouring the \keyword{wordle} tiles;
+ that is, they set \option{case sensitive=false}. To balance the
+ \option{lower case} and \option{upper case} options, the
+ \option{natural case} option makes the \keyword{wordle} environment
+ restores the default behaviour, which respects the case of the letters
+ as typed into the environment. The \option{natural case} option does
+ not change the \option{case sensitive} setting.
+
+ \begin{example}
+ \begin{wordle}[natural case]{youth} % the default
+ North
+ South
+ youth
+ \end{wordle}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Adding \ctan{TikZ} code}
+
+ The \keyword{wordle} environment is a fancy wrapper around a
+ \keyword{tikzpicture} environment, with some code under the hood that
+ automatically colours the letter tiles according to how well they
+ match the solution. The options in this section describe how to access
+ the underlying \ctan{TikZ} layer.
+
+ \option[]{tikz}[TikZ commands]
+
+ The \option{tikz} option passes \ctan{TikZ} keys to the underlying
+ \keyword{tikzpicture} environment. The \option{tikz} option is almost
+ the same as using a \keyword{\tikzset{...}} command before the
+ \keyword{wordle} environment except that it is applied to the
+ \keyword{tikpicture} environment, which contains the \keyword{wordle}
+ puzzle, such that the \option{tikz} keys are applied \textit{after}
+ all of options above and \textit{before} \option{tile style} is
+ applied.
+
+ \begin{example}
+ % \usetikzlibrary{backgrounds}
+ \begin{wordle}[
+ tikz={framed,
+ background rectangle/.style={
+ double,ultra thick, draw=SteelBlue
+ }
+ }]{youth}
+ North South youth
+ \end{wordle}
+ \end{example}
+
+ As this example indicates, it is advisable to enclose complicated
+ \ctan{TikZ} settings inside braces.
+
+ \option[W]{name}
+
+ All of the tiles in a \keyword{wordle} puzzle are given node names of
+ the form $\langle$\textsf{name}$\rangle$-$\mathsf{r}$-$\mathsf{c}$,
+ for the tile in row~$\mathsf{r}$ and column~$\mathsf{c}$. By default,
+ the prefix \textsf{name} is \texttt{W}. Within reason, the
+ \option{name} prefix can be changed to anything you like using the
+ \option{name} option.
+
+ One way to use the named nodes for the letter tiles is with
+ \ctan{TikZ} \texttt{overlay} and \texttt{remember picture} keys:
+
+ \begin{example}
+ \begin{wordle}[tikz={remember picture}]{CRAZE}
+ TRACE
+ CREAM
+ CRAZE
+ \end{wordle}
+ \end{example}
+
+ This makes it possible, for example, to draw arrows to tiles in a
+ \keyword{wordle} puzzle:
+
+ \begin{example}
+ \tikz[remember picture]\draw[overlay, very thick, opacity=0.5,->,red](0,0)node{No M!} to [out=90, in=180](W-2-5);
+ \end{example}
+
+ A second use of the tile node names is in conjunction with \ctan{TikZ}
+ commands that can be added to a \keyword{wordle} puzzle using the
+ second optional argument to the environment. As with the \option{tikz}
+ option, it is advisable to enclose complicated \ctan{TikZ} commands
+ inside braces.
+
+ \begin{example}
+ \begin{wordle}[name=M,
+ tikz={arr/.style={Red,ultra thick,->}}
+ ]{MACAW}
+ [{
+ \draw[arr](M-1-3.south)--(M-3-2.north)--(M-4-2.north);
+ \draw[arr](M-1-1.south)--(M-3-5)--(M-4-3.north east);
+ }]
+ CRANE HOTLY BASIC MACAW
+ \end{wordle}
+ \end{example}
+
+ In practice, we are not convinced that anyone will find a real use for this!
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{The package code}
+
+ The \keyword{wordle} package is a \LaTeX3 package. There are many
+ comments in the code explaining how the code works. The automatic
+ colouring of the letter tiles is a fun exercise in \LaTeX3
+ programming, which was motivated by a
+ \href{https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex/660056#660056}{tex.stackexchange.com} post.
+
+ Bug reports and feature requests can be made on \href{https://github.com/AndrewMathas/Wordle}{github}.
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \printindex
+
+\end{document}
diff --git a/graphics/pgf/contrib/wordle/wordle-doc-fr.pdf b/graphics/pgf/contrib/wordle/wordle-doc-fr.pdf
new file mode 100644
index 0000000000..09d306b0f3
--- /dev/null
+++ b/graphics/pgf/contrib/wordle/wordle-doc-fr.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/wordle/wordle-doc-fr.tex b/graphics/pgf/contrib/wordle/wordle-doc-fr.tex
new file mode 100644
index 0000000000..039bc7a158
--- /dev/null
+++ b/graphics/pgf/contrib/wordle/wordle-doc-fr.tex
@@ -0,0 +1,767 @@
+% !TeX TS-program = pdflatex
+
+\documentclass[svgnames]{report}
+\usepackage[utf8]{inputenc}
+\usepackage{wordle}
+\usepackage{manfnt}
+\usepackage{enumitem}
+\setlist[description]{font=\sffamily\bfseries\color{ForestGreen},labelwidth=\textwidth}
+\usepackage{booktabs}
+\usepackage[a4paper,margin=18mm]{geometry}
+\synctex=1
+\parindent=0pt
+\parskip=2mm
+
+\usepackage{cmap} % fix search and cut-and-paste in Acrobat
+\setcounter{secnumdepth}{0}
+
+\usepackage{listings}\lstset{language=[LaTeX]TeX,framerule=2pt}
+\lstset{language=[LaTeX]TeX,
+ texcsstyle=*\bfseries\color{Peru},
+ backgroundcolor=\color{Ivory},
+ numbers=none,
+ breaklines=true,
+ keywordstyle=\color{Sienna},
+ commentstyle=\color{BurlyWood},
+ tabsize=2,
+ morekeywords={Wordle,wordle,GrilleSutom},
+ resetmargins=true,
+}
+% hyperref links to ctan
+\newcommand\ctan[1]{\href{https://www.ctan.org/pkg/#1}{\texttt{#1}}}
+
+\newcommand\Section[1]{\subsection{\textcolor{DarkGreen}{#1}}}
+
+\ExplSyntaxOn
+\NewDocumentCommand\option{ omo }{%
+ \IfNoValueTF{#1}{\textsf{#2}}
+ {%
+ \textbf{\textcolor{Crimson}{#2}}
+ \str_if_empty:nF {#1}{~(défaut~:~\textcolor{DarkRed}{#1})}%
+ \IfNoValueF{#3}{\hfill\textcolor{Gray}{[accepte~:~#3]}}%
+ }%
+ \index{#2}%
+}
+\ExplSyntaxOff
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage{imakeidx}
+\indexsetup{level=\section*, toclevel=section, noclearpage}
+\makeindex[intoc,columns=3]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage[skins,listings]{tcolorbox}
+\usetikzlibrary{backgrounds, shapes.geometric} % for tikz={framed,...}
+
+\DeclareTotalTCBox\keyword{ O{} v }{
+ fontupper=\sffamily,
+ nobeforeafter,
+ skin=tile,
+ verbatim,
+ on line,
+ tcbox raise base,
+ top=0pt,bottom=0pt,left=0mm,right=0mm,
+ colback=OldLace,
+ colupper=ForestGreen,
+ #1}
+{#2}
+
+\lstdefinestyle{tikz}{style=tcblatex,
+ classoffset=0,
+ texcsstyle=*\color{DarkGoldenrod},%
+ deletetexcs={begin, end},
+ moretexcs={,%
+ node,
+ draw,
+ true,
+ false
+ },%
+ classoffset=1,
+ keywordstyle=\color{ForestGreen},%
+ morekeywords={wordle,GrilleSutom},
+ classoffset=2,
+ keywordstyle=\color{Crimson},%
+ morekeywords={
+ absent,
+ Strict,
+ Taille,
+ Lignes,
+ Epaisseur,
+ align,
+ border,
+ borders,
+ Bords,
+ Cadres,
+ Style,
+ Formes,
+ Separation,
+ case,
+ Police,
+ Arrondi,
+ Echelle,
+ NonLettres,
+ color,
+ Couleurs,
+ CouleurBordures,
+ CouleurLettres,
+ bordure,
+ couleur,
+ colours,
+ correct,
+ vide,
+ font,
+ frame,
+ frames,
+ letters,
+ lower,
+ params,
+ name,
+ natural,
+ noalign,
+ noletters,
+ present,
+ rounded,
+ rows,
+ scale,
+ sensitive,
+ separation,
+ shape,
+ shapes,
+ size,
+ strict,
+ style,
+ style,
+ text,
+ thickness,
+ tikz,
+ tile,
+ upper,
+ },
+ classoffset=3,
+ keywordstyle=\color{DarkOrange},%
+ morekeywords={
+ hard,
+ standard,
+ sutom,
+ }
+}
+
+\DeclareTCBListing{example}{ !O{} }{%
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ lefthand width=50mm,
+ listing style=tikz,
+ sidebyside,
+ sidebyside align=center,
+ sidebyside gap=4mm,
+ text and listing,
+ text outside listing,
+ boxsep = 0pt,
+ #1
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\makeatletter
+\author{Andrew Mathas \&\ Cédric Pierquet}
+\usepackage{tikz}
+\usetikzlibrary{shadows.blur}
+\tikzset{shadowed/.style={blur shadow={shadow blur steps=5},
+ bottom color=ForestGreen!30,
+ draw=MediumSeaGreen!70,
+ shade,
+ font=\normalfont\Huge\bfseries\scshape,
+ rounded corners=8pt,
+ top color=SeaGreen,
+ },
+ boxes/.style={draw=SeaGreen,
+ fill=Cornsilk,
+ font=\sffamily\small,
+ inner sep=5pt,
+ rectangle,
+ rounded corners=8pt,
+ text=DarkGreen,
+ }
+}
+\newcommand\Wordle{%
+ \begin{tikzpicture}[remember picture,overlay]
+ \node[yshift=-3cm] at (current page.north west)
+ {\begin{tikzpicture}[remember picture, overlay]
+ \draw[shadowed](30mm,0) rectangle node[white]{wordle} (\paperwidth-30mm,16mm);
+ \node[anchor=west,boxes] at (4cm,0cm) {\@author};
+ \node[anchor=east,boxes] at (\paperwidth-4cm,0) {Version \wordle@version};
+ \end{tikzpicture}
+ };
+ \end{tikzpicture}
+ \vspace*{20mm}
+}
+
+\def\@oddfoot{\textsc{Wordle} --- \wordle@version~(version~du~\wordle@release)\hfill\thepage}
+
+\usepackage[colorlinks=true,linkcolor=blue,urlcolor=MediumBlue]{hyperref}
+\hypersetup{
+ pdfcreator={ Generated by pdfLaTeX },
+ pdfinfo={
+ Author ={ Andrew Mathas et Cédric Pierquet },
+ Keywords={ wordle },
+ License ={ LaTeX Project Public License v1.3c or later },
+ Subject ={ LaTeXing Wordle puzzles },
+ Title ={ Wordle - \wordle@version }
+ },
+}
+\makeatother
+
+\begin{document}
+
+ \Wordle
+
+ Ce package fournit un moyen \textit{stupidement} riche en fonctionnalités de créer des puzzles \keyword{Wordle} en \LaTeX, que \href{https://en.wikipedia.org/wiki/Wordle}{Wikipedia} décrit comme
+ comme un jeu de lettres en ligne extrêmement populaire, créé et développé par l'ingénieur logiciel gallois Josh Wardle. Ce paquet
+ est une version améliorée d'une des solutions à une question posée par \textcolor{FireBrick}{valerio\_new} sur \href{https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex/660056#660056}{tex.stackexchange.com}.
+
+ Ce paquet fournit l'environnement \keyword{GrilleSutom}, qui utilise la syntaxe :
+
+ \begin{tcblisting}{
+ listing only,
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ listing style=tikz,
+ boxsep = 0pt,
+ }
+ % \usepackage{wordle}
+ \begin{GrilleSutom}[params sutom]{solution}[commandes tikz optionnelles]
+ essai1 essai2 ...
+ \end{GrilleSutom}
+ \end{tcblisting}
+ \index{environnement!GrilleSutom}
+ \index{GrilleSutom}
+ \index{sutom}
+
+ et l'environnement \keyword{wordle}, pour la version anglaise du jeu :
+
+ \begin{tcblisting}{
+ listing only,
+ skin=bicolor,
+ colframe=MediumSeaGreen,
+ colbacklower=OldLace,
+ colback=LawnGreen!20,
+ listing style=tikz,
+ boxsep = 0pt,
+ }
+ % \usepackage{wordle}
+ \begin{wordle}[params wordle]{solution}[commandes tikz optionnelles]
+ essai1 essai2 ...
+ \end{wordle}
+ \end{tcblisting}
+ \index{environnement!wordle}
+ \index{wordle}
+
+ Les mots du puzzle peuvent être saisis sur une seule ligne ou sur des lignes séparées. Voici quelques exemples :
+
+ \begin{example}
+ %Version fr du wordle (sutom)
+ \begin{GrilleSutom}{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ % Version en du sutom (wordle)
+ \begin{wordle}{SUTOM}
+ SAUCE
+ SAUTS
+ SUTOM
+ \end{wordle}
+ \end{example}
+
+ Comme pour les puzzles en ligne, l'environnement \keyword{GrilleSutom}
+ colore automatiquement les lettres en
+ \keyword[colback=WordleSutomCorrect,colupper=White]{rouge}
+ lorsque la lettre se trouve dans la même position que la solution, et en
+ \keyword[colback=WordlePresent,colupper=White]{or} lorsque la lettre est dans la solution mais qu'elle n'est pas bien placée.
+ De même, \keyword{GrilleSutom} colore les lettres correctes en
+ \keyword[colback=WordleCorrect,colupper=White]{vert}
+ et les lettres actuelles en
+ \keyword[colback=WordleCorrect,colupper=White]{or}.
+ Comme décrites ci-dessous, ces couleurs peuvent être modifiées en fonction de vos goûts.
+
+ Le nombre de lettres du puzzle est déterminé par la solution, et n'est limité que par la largeur de la page.
+
+ \begin{example}
+ \begin{GrilleSutom}[Lignes=4]{orange}
+ normal
+ ordres
+ orange
+ \end{GrilleSutom}
+ \end{example}
+
+ Les lettres du puzzle peuvent être saisies en majuscules, en minuscules ou en mélange de majuscules et de minuscules. Par défaut, la casse des lettres est ignorée lors de la détermination des couleurs des cases de lettres.
+
+ Comme décrit ci-dessous, les environnements \keyword{wordle} et \keyword{GrilleSutom} acceptent une liste d'options différentes qui modifient les couleurs, les polices et les formes de la tuile. De plus, vous pouvez modifier la sensibilité à la casse des environnements, ajouter des lignes supplémentaires au puzzle, désactiver la mise en forme spéciale des \textit{cases de lettres}. Ces options sont données sous la forme d'une liste séparée par des virgules de paires \texttt{clé-valeur}. Elles peuvent être définies localement, en utilisant l'argument optionnel de l'environnement \keyword|wordle|, ou globalement (plus précisément, dans le groupe \LaTeX\ actuel) en utilisant la commande \keyword{\ParamsSutom} \index{\textbackslash ParamsSutom}, ou comme options globales du package, via \keyword{\usepackage[options]{wordle}}. L'ordre des options n'a pas d'importance, sauf que les options ultérieures ont priorité sur les options précédentes, à l'exception des clés \option{tikz} et \option{tile style} qui sont toujours appliquées en dernier.
+
+ Les puzzles \keyword{wordle} sont dessinés à l'aide de \ctan{TikZ}, chaque lettre du puzzle étant placée à l'intérieur d'un nœud \ctan{TikZ}. De nombreuses options contrôlent les paramètres de ces nœuds. Les descriptions des options ci-dessous sont regroupées en fonction de leur fonction.
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Styles Wordle}
+
+ La clé \option{Style} peut être utilisée pour modifier de nombreuses caractéristiques des cases dans un puzzle \keyword{wordle}, y compris leurs couleurs, les polices et ainsi de suite. Les paramètres les plus courants peuvent être définis à l'aide du mot-clé \option{style}. \textit{Le style doit toujours être défini en premier car, sinon, les paramètres de style peuvent remplacer les paramètres précédents.}
+
+ Les styles suivants sont pris en charge :
+
+ \textcolor{DarkOrange}{sutom}
+ \index{Style!sutom}
+ \index{sutom}
+
+ \begin{example}
+ \begin{GrilleSutom}[Style=sutom]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ En plus de définir les couleurs des cases, les cadres et les formes, le style \textsf{sutom} définit également la taille des cases à 8 mm. Le style \textsf{sutom} est le style par défaut pour l'environnement \keyword{GrilleSutom}.
+
+ \textcolor{DarkOrange}{standard}
+ \index{style!standard}
+
+ \begin{example}
+ \begin{GrilleSutom}[Style=standard]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ Le style \textcolor{DarkOrange}{standard} est le style par défaut pour l'environnement \keyword{wordle}.
+
+ \textcolor{DarkOrange}{hard}
+ \index{style!hard}
+
+ \begin{example}
+ \begin{GrilleSutom}[Style=hard]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Options pour les styles individuels des cases de lettres}
+
+ Il existe quatre types de cases de lettres dans \keyword{wordle} :
+ \option{absent}, \option{present}, \option{correct} et
+ \option{vide}, correspondant respectivement aux lettres qui ne sont pas dans la solution,
+ aux lettres mal placées, aux lettres correctement placées et aux cases vides. Les options de cette section peuvent être utilisées pour
+ définir les couleurs du texte, des cases et des bordures, les formes et les cadres de ces cases.
+
+ Les cases de lettres dans un environnement \keyword{wordle} sont composées à l'intérieur
+ d'un \keyword{\node} \ctan{TikZ}. Les options ci-dessous contrôlent les
+ différents paramètres de style de ces nœuds.
+
+ \option[--]{Couleurs}[liste de couleurs valides séparées par des virgules]
+
+ L'option \option{Couleurs} est un raccourci pour spécifier les
+ couleurs des cases \option{absent}, \option{present}, \option{correct} et
+ \option{vide}, dans cet ordre. Les couleurs suivantes peuvent être omises, mais
+ les couleurs doivent être données dans cet ordre, de gauche à droite.
+ Si une seule couleur est donnée, cette couleur est appliquée à toutes les cases.
+
+ \begin{example}
+ \begin{GrilleSutom}[Couleurs={LightGray,Orange,Teal}]{cellar}
+ pounds
+ taylor
+ cellar
+ \end{GrilleSutom}
+ \end{example}
+
+ Les couleurs peuvent également être définies individuellement à l'aide de \option{couleur absent}, \option{couleur present}, \option{couleur correct} et \option{couleur vide}.
+
+ \begin{example}
+ \begin{GrilleSutom}[couleur absent=DarkGray,couleur present=Salmon,
+ couleur correct=SeaGreen]{cellar}
+ pounds
+ taylor
+ cellar
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[white]{CouleurBordures}[liste de couleurs valides séparées par des virgules]
+
+ de manière similaire à l'option \option{Couleurs}, il s'agit d'un raccourci pour le paramétrage des couleurs des bordures des cases \option{absent}, \option{present},
+ \option{correct} et \option{vide}, dans cet ordre.
+
+ Si une seule couleur est donnée, elle est appliquée à toutes les cases.
+
+ \begin{example}
+ \begin{GrilleSutom}[CouleurBordures={red,orange,blue}]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ Les bordures pour les cases individuelles peuvent être paramétrer via
+ \option{bordure absent}, \option{bordure present}, \option{bordure correct} et \option{bordure vide}.
+
+ \option[false]{Cadres}[liste de booléens true/false séparées par des virgules]
+
+ Il s'agit d'un raccourci pour ajouter un cadre autour des cases \option{absent}, \option{present}, \option{correct} et \option{vide}, dans cet ordre, avec la même couleur que \option{absent}. C'est utile uniquement pour les cases non carrée.
+
+ \begin{example}
+ \begin{GrilleSutom}[Cadres={false,true,true},Formes=circle]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ Les cadres pour les cases individuelles peuvent être paramétrer via \option{cadre absent}, \option{cadre present},
+ \option{cadre correct} and \option{cadre vide}.
+
+ \option[rectangle]{Formes}[liste de formes TikZ séparées par des virgules]
+
+ De même que pour l'option \option{Couleurs}, c'est un raccourci pour paramétrer les formes des cases \option{absent}, \option{present},
+ \option{correct} et \option{vide}, dans cet ordre.
+
+ \begin{example}
+ \begin{GrilleSutom}[Formes={circle, rectangle, circle}]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ Les formes individuelles peuvent être paramétrer via \option{forme absent}, \option{forme present},
+ \option{forme correct} et \option{forme vide}.
+
+ Les formes proposés par le package \ctan{TikZ}
+ \texttt{shapes.geometric}, incluant \texttt{diamond},
+ \texttt{ellipse}, \texttt{trapezium} et \texttt{star} (voir section~71.2 du manuel \ctan{TikZ}).
+
+ \begin{example}
+ % \usepackage{shapes.geometric}
+ \begin{GrilleSutom}[Formes={diamond,ellipse,star}]{LADLE}
+ FLAIL
+ LAPEL
+ *
+ LADLE
+ LOVER
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[white]{CouleurLettres}[liste de couleurs valides séparées par des virgules]
+
+ Il s'agir d'un raccourci pour paramétrer la couleur des lettres des cases \option{absent}, \option{present}, \option{correct} et \option{vide}, dans cet ordre.
+
+ \begin{example}
+ \begin{GrilleSutom}[CouleurLettres={red,orange,blue}]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ Les cases individuelles peuvent être paramétrer via \option{coultxt absent}, \option{coultxt present}, \option{coultxt correct} et \option{coultxt vide}.
+
+
+ \Section{Caractéristiques communes des cases}
+
+ Les options suivantes s'appliquent à toutes les cases.
+
+ \option[]{nonalign} (default) \qquad
+ \option[]{align}
+
+ Cette option s'occupe de l'alignement vertical des lettres. C'est utile essentiellement lors de l'utilisation de minuscules.
+
+ \begin{example}
+ \begin{GrilleSutom}[align]{agony}
+ groan
+ angry
+ agony
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}{agony} % nonalign par defaut
+ groan
+ angry
+ agony
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[\textbackslash Large\textbackslash bfseries\textbackslash sffamily]{Police}
+ [Police \LaTeX]
+
+ Cela permet de paramétrer la police de toutes les lettres. Toute commande valide est acceptée.
+
+ \begin{example}
+ \begin{GrilleSutom}[Police=\large\ttfamily]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[1mm]{Arrondi}[une longueur]
+
+ Cela permet de paramétrer le paramètres \texttt{rounded corners} (de TikZ) pour les cases \keyword{wordle}.
+
+ \begin{example}
+ \begin{GrilleSutom}[Arrondi=2.5mm]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[0.5mm]{Separation}[une longueur]
+
+ Cela permet de paramétrer la séparation entre les cases du \keyword{wordle}.
+
+ \begin{example}
+ \begin{GrilleSutom}[Separation=2mm,CouleurBordures=black]{REBUS}
+ ABRIS
+ ROUTE
+ REBUS
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[1]{Echelle}[un nombre]
+
+ L'option \option{Echelle} applique un facteur à l'environnement \keyword{wordle}.
+ Cette option modifie les dimensions définies par les options \option{Arrondi},
+ \option{Separation}, \option{Taille} et \option{Epaisseur}. Si vous changez l'échelle, vous voudrez également changer la police de caractères via \option{Police} :
+
+ \begin{example}
+ \begin{GrilleSutom}[Echelle=1.5,Police=\huge\bfseries]{SIZE}
+ HELP
+ WISE
+ SIZE
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[8mm]{Taille}[une longueur]
+
+ L'option \option{Taille} définit la taille des cases. Contrairement à l'option \option{Echelle}, \option{Taille} change uniquement la dimension des cases.
+
+ \begin{example}
+ \begin{GrilleSutom}[Taille=10mm,Police=\huge\bfseries]{REPU}
+ ABRI ROUE * REPU
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[0.25mm]{Epaisseur}[une longueur]•
+
+ Cela permet de paramétrer la taille des bordures des cases. Par défaut la couleur est blanche, donc pour illustrer cette option elle sera paramétrer en rouge.
+
+ \begin{example}
+ \begin{GrilleSutom}[Epaisseur=0.75mm,CouleurBordures=red]{LADLE}
+ FLAIL
+ LAPEL
+ LADLE
+ \end{GrilleSutom}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Lignes et colonnes supplémentaires}
+
+ Par défaut, le nombre de lignes et de colonnes de la grille est fixée par les mots donnés.
+
+ \option[]{Lettres} (défaut)\qquad
+ \option[]{NonLettres}
+
+ Par dafut, les lettres sont affichées, mais l'option \option{NonLettres} peuvent être cachées.
+
+ \begin{example}
+ \begin{GrilleSutom}{CRAZE} % the default
+ TRACE
+ CREAM
+ CRAZE
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[NonLettres]{CRAZE}
+ TRACE
+ CREAM
+ CRAZE
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[false]{Strict}[true/false/--]
+
+ Par défaut, l'environnement ne vérifie pas si tous les mots sont la même taille, donc les lettres \textit{en trop} n'ont pas de style particulier.
+
+ \begin{example}
+ \begin{GrilleSutom}[Strict=false]{CRAZE} % par defaut
+ GRAIL
+ CRAMPS
+ CRAM
+ CRABS
+ \end{GrilleSutom}
+ \end{example}
+
+ L'option booléenne \option{Strict} force un style particulier des lettre \textit{en trop}.
+
+ \begin{example}
+ \begin{GrilleSutom}[Strict]{CRAZE}
+ GRAIL
+ CRAMPS
+ CRAM
+ CRABS
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[--]{Lignes}
+
+ Par défaut, l'environnement \keyword{wordle} affiche le nombre de lignes en adéquation avec le nombre de mots donnés. L'option \option{Lignes} permet de modifier le nombre de lignes (évenuellement vides).
+
+ \begin{example}
+ \begin{GrilleSutom}[Lignes=4]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[Lignes=2]{ANVIL}
+ CRANE
+ NATAL
+ ANVIL
+ \end{GrilleSutom}
+ \end{example}
+
+ \option[]{*}
+
+ Le style des case peut être annulé en ajoutant un astérisque,~\option{*}, en tant que mot.
+
+ \begin{example}
+ \begin{GrilleSutom}{ANVIL}
+ CRANE
+ NATAL
+ * % annule la mise en forme
+ ANNUL
+ ANVIL
+ \end{GrilleSutom}
+ \end{example}
+
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Sensibilité à la casse}
+ \index{case~sensitive}
+ \index{case~sensitive!lower case}
+ \index{case~sensitive!natural case}
+ \index{case~sensitive!upper case}
+
+ Par défaut, les lettres peuvent être écrites en majuscule ou en minuscule, comme saisies par l'utilisateur.
+
+ L'option (voir doc en anglais) \option{case~sensitive} permet de spécifier un paramétrage de la casse.
+
+ \begin{example}
+ \begin{GrilleSutom}[case sensitive=false]{youth} % par defaut
+ North
+ South
+ Youth
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[case sensitive]{youth}
+ North
+ South
+ Youth
+ \end{GrilleSutom}
+ \end{example}
+
+ Les options \textit{fines} \option{natural case} (défaut), \option{lower case}et \option{upper case} permettent de travailler plus finement sur la casse des lettres correctes et/ou mal placées.
+
+ \begin{example}
+ \begin{GrilleSutom}[lower case]{YOUTH}
+ North
+ South
+ Youth
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[upper case]{youth}
+ North
+ South
+ Youth
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[natural case]{youth} % par defaut
+ North
+ South
+ youth
+ \end{GrilleSutom}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Style \ctan{TikZ} complémentaire}
+
+ \option[]{tikz}[commandes TikZ]
+
+ \begin{example}
+ % \usetikzlibrary{backgrounds}
+ \begin{GrilleSutom}[
+ tikz={framed,
+ background rectangle/.style={
+ double,ultra thick, draw=SteelBlue
+ }
+ }]{youth}
+ North South youth
+ \end{GrilleSutom}
+ \end{example}
+
+ \pagebreak
+
+ \option[W]{Nom}
+
+ \begin{example}
+ \begin{GrilleSutom}[tikz={remember picture}]{CRAZE}
+ TRACE
+ CREAM
+ CRAZE
+ \end{GrilleSutom}
+ \end{example}
+
+ \begin{example}
+ \tikz[remember picture]\draw[overlay, very thick, opacity=0.5,->,red](0,0)node{Pas de M !!!} to [out=90, in=180](W-2-5);
+ \end{example}
+
+ \begin{example}
+ \begin{GrilleSutom}[name=M,
+ tikz={arr/.style={red,ultra thick,->}}
+ ]{MACAW}
+ [{
+ \draw[arr](M-1-3.south)--(M-3-2.north)--(M-4-2.north);
+ \draw[arr](M-1-1.south)--(M-3-5)--(M-4-3.north east);
+ }]
+ CRANE HOTLY BASIC MACAW
+ \end{GrilleSutom}
+ \end{example}
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \Section{Le code}
+
+ Le package \keyword{wordle} est écrit en \LaTeX3. Beaucoup de commentaires permettent d'expliciter le fonctionnement du code. La coloration automatique des cases est un exercice amusant en \LaTeX3, motivépar un message issu de
+ \href{https://tex.stackexchange.com/questions/659860/wordle-like-colored-letter-boxes-in-latex/660056#660056}{tex.stackexchange.com}.
+
+ Le dépôt \href{https://github.com/AndrewMathas/Wordle}{github.com/AndrewMathas/Wordle} est disponible pour signaler tout bug.
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \printindex
+
+\end{document}
diff --git a/graphics/pgf/contrib/wordle/wordle.sty b/graphics/pgf/contrib/wordle/wordle.sty
new file mode 100644
index 0000000000..a463f22837
--- /dev/null
+++ b/graphics/pgf/contrib/wordle/wordle.sty
@@ -0,0 +1,670 @@
+% ---------------------------------------------------------------
+% wordle --- A latex package for typesetting wordle puzzles
+%
+% E-mail: andrew.mathas@gmail.com and cpierquet@outlook.fr
+% Released under the LaTeX Project Public License v1.3c or later
+% See http://www.latex-project.org/lppl.txt
+% ----------------------------------------------------------------
+
+\NeedsTeXFormat{LaTeX2e}
+
+% Package version
+\def\wordle@version{0.3.0}
+\def\wordle@release{2024-08-18}
+
+\providecommand\DeclareRelease[3]{}
+\providecommand\DeclareCurrentRelease[2]{}
+\DeclareRelease{\wordle@version}{\wordle@release}{wordle.sty}
+\DeclareCurrentRelease{}{\wordle@release}
+
+\ProvidesExplPackage{wordle} {\wordle@release} {\wordle@version}
+ {A latex package for typesetting wordle puzzles}
+
+% ----------------------------------------------------------------
+% Required packages
+%\RequirePackage{xcolor}
+\RequirePackage{tikz}
+
+% ----------------------------------------------------------------
+% predefined tile colours
+
+% from https://www.nytimes.com/games/wordle
+\definecolor{WordleAbsent} {HTML} {797D7F}
+\definecolor{WordlePresent} {HTML} {F7DA21}
+\definecolor{WordleCorrect} {HTML} {6AAB64}
+\definecolor{WordleEmpty} {HTML} {F5F5DC}
+
+\definecolor{WordleHardPresent} {HTML} {95BEFA}
+\definecolor{WordleHardCorrect} {HTML} {FB9B00}
+
+% from https://sutom.nocle.fr/#
+\definecolor{WordleSutomAbsent} {HTML} {0077B7}
+\definecolor{WordleSutomPresent} {HTML} {FFBB00}
+\definecolor{WordleSutomCorrect} {HTML} {EB2152}
+
+% ----------------------------------------------------------------
+% package variables
+
+\bool_new:N \l__wordle_case_sensitive_bool % case sensitive mode (false by default)
+\bool_new:N \l__wordle_strict_bool % strict mode (false by default)
+
+\dim_new:N \l__wordle_grid_dim
+\dim_new:N \l__wordle_rounded_dim
+\dim_new:N \l__wordle_sep_dim
+\dim_new:N \l__wordle_size_dim
+\dim_new:N \l__wordle_thickness_dim
+
+\int_new:N \l__wordle_rows_int
+
+\fp_new:N \l__wordle_scale_fp
+
+\tl_new:N \l__wordle_align_tl
+\tl_new:N \l__wordle_depth_tl
+\tl_new:N \l__wordle_font_tl
+\tl_new:N \l__wordle_name_tl
+\tl_new:N \l__wordle_style_tl
+\tl_new:N \l__wordle_tikz_tl
+\tl_new:N \l__wordle_tile_style_tl
+
+\tl_new:N \l__wordle_present_border_tl
+\tl_new:N \l__wordle_present_colour_tl
+\tl_new:N \l__wordle_present_frame_tl
+\tl_new:N \l__wordle_present_shape_tl
+\tl_new:N \l__wordle_present_text_tl
+
+\tl_new:N \l__wordle_correct_border_tl
+\tl_new:N \l__wordle_correct_colour_tl
+\tl_new:N \l__wordle_correct_frame_tl
+\tl_new:N \l__wordle_correct_shape_tl
+\tl_new:N \l__wordle_correct_text_tl
+
+\tl_new:N \l__wordle_empty_border_tl
+\tl_new:N \l__wordle_empty_colour_tl
+\tl_new:N \l__wordle_empty_frame_tl
+\tl_new:N \l__wordle_empty_shape_tl
+\tl_new:N \l__wordle_empty_text_tl
+
+\tl_new:N \l__wordle_absent_border_tl
+\tl_new:N \l__wordle_absent_colour_tl
+\tl_new:N \l__wordle_absent_frame_tl
+\tl_new:N \l__wordle_absent_shape_tl
+\tl_new:N \l__wordle_absent_text_tl
+
+
+% ----------------------------------------------------------------
+% Assign up to four style attributes from comma separated list to absent,
+% present, correct, empty, respectively. If there is only one entry in
+% the list then everything is set equal to that entry
+\cs_new_nopar:Npn \__wordle_set_style:nn #1#2
+{
+ \seq_set_split:Nnn \l_tmpa_seq {,} {#2}
+ \int_compare:nNnTF {\seq_count:N \l_tmpa_seq} = {1}
+ {
+ \tl_set:co {l__wordle_absent_#1_tl} {#2}
+ \tl_set:co {l__wordle_present_#1_tl} {#2}
+ \tl_set:co {l__wordle_correct_#1_tl} {#2}
+ \tl_set:co {l__wordle_empty_#1_tl} {#2}
+ }
+ {
+ \seq_pop_left:NNT \l_tmpa_seq \l_tmpa_tl { \tl_set:co {l__wordle_absent_#1_tl} {\l_tmpa_tl} }
+ \seq_pop_left:NNT \l_tmpa_seq \l_tmpa_tl { \tl_set:co {l__wordle_present_#1_tl} {\l_tmpa_tl} }
+ \seq_pop_left:NNT \l_tmpa_seq \l_tmpa_tl { \tl_set:co {l__wordle_correct_#1_tl} {\l_tmpa_tl} }
+ \seq_pop_left:NNT \l_tmpa_seq \l_tmpa_tl { \tl_set:co {l__wordle_empty_#1_tl} {\l_tmpa_tl} }
+ }
+}
+
+% apply the wordle styles
+\cs_new_nopar:Npn \__wordle_apply_style:n #1 {
+ \str_case:enF { #1 }
+ {
+ {hard}
+ {
+ \__wordle_set_style:nn {border} {white}
+ \__wordle_set_style:nn {colour} {WordleAbsent,WordleHardPresent,WordleHardCorrect,WordleEmpty}
+ \__wordle_set_style:nn {frame} {false}
+ \__wordle_set_style:nn {shape} {rectangle}
+ \__wordle_set_style:nn {text} {white,white,white,black}
+ }
+
+ {alt}
+ { % alt appears in the English version of Cedric's manual for sutom
+ \__wordle_set_style:nn {border} {white}
+ \__wordle_set_style:nn {colour} {WordleSutomAbsent,WordleSutomPresent,WordleSutomCorrect,WordleEmpty}
+ \__wordle_set_style:nn {frame} {false,true,false,false}
+ \__wordle_set_style:nn {shape} {rectangle,circle,rectangle,circle}
+ \__wordle_set_style:nn {text} {white,white,white,black}
+ \tl_set:Nn \l_wordle_font_tl {\LARGE\bfseries\sffamily}
+
+ }
+
+ {sutom}
+ {
+ \__wordle_set_style:nn {border} {white}
+ \__wordle_set_style:nn {colour} {WordleSutomAbsent,WordleSutomPresent,WordleSutomCorrect,WordleEmpty}
+ \__wordle_set_style:nn {frame} {false,true,false,false}
+ \__wordle_set_style:nn {shape} {rectangle,circle,rectangle,circle}
+ \__wordle_set_style:nn {text} {white,white,white,black}
+ \tl_set:Nn \l_wordle_font_tl {\LARGE\bfseries\sffamily}
+ }
+ }
+ {
+ % default style
+ \__wordle_set_style:nn {border} {white}
+ \__wordle_set_style:nn {colour} {WordleAbsent,WordlePresent,WordleCorrect,WordleEmpty}
+ \__wordle_set_style:nn {frame} {false}
+ \__wordle_set_style:nn {shape} {rectangle}
+ \__wordle_set_style:nn {text} {white,white,white,black}
+ }
+}
+
+% rescale dimensions
+\cs_new_nopar:Npn \__wordle_rescale:n #1
+{
+ \fp_set:Nn \l__wordle_scale_fp {#1}
+ \dim_set:Nn \l__wordle_rounded_dim { \fp_eval:n {#1*\dim_to_decimal_in_mm:n {\l__wordle_rounded_dim }}mm }
+ \dim_set:Nn \l__wordle_sep_dim { \fp_eval:n {#1*\dim_to_decimal_in_mm:n {\l__wordle_sep_dim }}mm }
+ \dim_set:Nn \l__wordle_size_dim { \fp_eval:n {#1*\dim_to_decimal_in_mm:n {\l__wordle_size_dim }}mm }
+ \dim_set:Nn \l__wordle_thickness_dim { \fp_eval:n {#1*\dim_to_decimal_in_mm:n {\l__wordle_thickness_dim}}mm }
+}
+
+
+% ----------------------------------------------------------------
+% just in case we're running an old version of latex
+\providecommand \IfFormatAtLeastTF { \@ifl@t@r \fmtversion }
+
+\IfFormatAtLeastTF { 2022-06-01 }
+ { \ProcessKeyOptions [ wordle ] }
+ {
+ \RequirePackage { l3keys2e }
+ \ProcessKeysOptions { wordle }
+ }
+
+% ----------------------------------------------------------------
+% Define keys for the package options and their defaults
+
+\keys_define:nn { wordle }
+{
+ % apply puzzle styles: sets colours of absent, present, correct and empty tiles
+ style .code:n = {
+ \seq_set_from_clist:Nn \l_tmpa_seq {#1}
+ \seq_map_inline:Nn \l_tmpa_seq { \__wordle_apply_style:n { \str_lowercase:n{##1}} }
+ },
+ Style .meta:n = { style = #1 },
+ style .initial:n = standard,
+
+ % specifying tile colours and shapes
+ borders .code:n = { \__wordle_set_style:nn {border} {#1} },
+ BorderColor .code:n = { \__wordle_set_style:nn {border} {#1} },
+ CouleurBordures.code:n = { \__wordle_set_style:nn {border} {#1} },
+
+ Couleurs .code:n = { \__wordle_set_style:nn {colour} {#1} },
+ colours .code:n = { \__wordle_set_style:nn {colour} {#1} },
+
+ frames .code:n = { \__wordle_set_style:nn {frame} {#1} },
+ Cadres .code:n = { \__wordle_set_style:nn {frame} {#1} },
+ frames .default:n = true,
+ shapes .code:n = { \__wordle_set_style:nn {shape} {#1} },
+ Formes .code:n = { \__wordle_set_style:nn {shape} {#1} },
+
+ % text colour
+ text .code:n = { \__wordle_set_style:nn {text} {#1} },
+ CouleurLettres .code:n = { \__wordle_set_style:nn {text} {#1} },
+
+ % align letters in puzzle
+ align .code:n = {
+ \tl_set:Nn \l__wordle_align_tl {\vphantom{azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN}}
+ \tl_set:Nn \l__wordle_depth_tl {text~depth=0pt}
+ },
+ noalign .code:n = {
+ \tl_set:Nn \l__wordle_align_tl {}
+ \tl_set:Nn \l__wordle_depth_tl {}
+ },
+ nonalign .meta:n = { noalign },
+ align .initial:n = {true},
+
+ absent .tl_set:N = \l__wordle_absent_colour_tl,
+ absent~color .tl_set:N = \l__wordle_absent_colour_tl,
+ couleur~absent .tl_set:N = \l__wordle_absent_colour_tl,
+ absent~colour .tl_set:N = \l__wordle_absent_colour_tl,
+ bordure~absent .tl_set:N = \l__wordle_absent_border_tl,
+ absent~border .tl_set:N = \l__wordle_absent_border_tl,
+ absent~frame .tl_set:N = \l__wordle_absent_frame_tl,
+ cadre~absent .tl_set:N = \l__wordle_absent_frame_tl,
+ absent~frame .default:n = true,
+ absent~shape .tl_set:N = \l__wordle_absent_shape_tl,
+ forme~absent .tl_set:N = \l__wordle_absent_shape_tl,
+ absent~text .tl_set:N = \l__wordle_absent_text_tl,
+ coultxt~absent .tl_set:N = \l__wordle_absent_text_tl,
+
+ correct .tl_set:N = \l__wordle_correct_colour_tl,
+ correct~color .tl_set:N = \l__wordle_correct_colour_tl,
+ correct~colour .tl_set:N = \l__wordle_correct_colour_tl,
+ couleur~correct.tl_set:N = \l__wordle_correct_colour_tl,
+ correct~border .tl_set:N = \l__wordle_correct_border_tl,
+ bordure~correct.tl_set:N = \l__wordle_correct_border_tl,
+ correct~frame .tl_set:N = \l__wordle_correct_frame_tl,
+ cadre~correct .tl_set:N = \l__wordle_correct_frame_tl,
+ correct~frame .default:n = true,
+ correct~shape .tl_set:N = \l__wordle_correct_shape_tl,
+ forme~correct .tl_set:N = \l__wordle_correct_shape_tl,
+ correct~text .tl_set:N = \l__wordle_correct_text_tl,
+ coultxt~correct.tl_set:N = \l__wordle_correct_text_tl,
+
+ empty .tl_set:N = \l__wordle_empty_colour_tl,
+ couleur~vide .tl_set:N = \l__wordle_empty_colour_tl,
+ empty~color .tl_set:N = \l__wordle_empty_colour_tl,
+ empty~colour .tl_set:N = \l__wordle_empty_colour_tl,
+ empty~border .tl_set:N = \l__wordle_empty_border_tl,
+ bordure~vide .tl_set:N = \l__wordle_empty_border_tl,
+ empty~frame .tl_set:N = \l__wordle_empty_frame_tl,
+ cadre~vide .tl_set:N = \l__wordle_empty_frame_tl,
+ empty~frame .default:n = true,
+ empty~shape .tl_set:N = \l__wordle_empty_shape_tl,
+ forme~vide .tl_set:N = \l__wordle_empty_shape_tl,
+ empty~text .tl_set:N = \l__wordle_empty_text_tl,
+ coultxt~vide. tl_set:N = \l__wordle_empty_text_tl,
+
+ present .tl_set:N = \l__wordle_present_colour_tl,
+ couleur~present.tl_set:N = \l__wordle_present_colour_tl,
+ present~color .tl_set:N = \l__wordle_present_colour_tl,
+ present~colour .tl_set:N = \l__wordle_present_colour_tl,
+ present~border .tl_set:N = \l__wordle_present_border_tl,
+ bordure~present.tl_set:N = \l__wordle_present_border_tl,
+ present~frame .tl_set:N = \l__wordle_present_frame_tl,
+ cadre~present .tl_set:N = \l__wordle_present_frame_tl,
+ present~frame .default:n = true,
+ present~shape .tl_set:N = \l__wordle_present_shape_tl,
+ forme~present .tl_set:N = \l__wordle_present_shape_tl,
+ present~text .tl_set:N = \l__wordle_present_text_tl,
+ coultxt~present.tl_set:N = \l__wordle_present_text_tl,
+
+ % text font
+ font .tl_set:N = \l__wordle_font_tl,
+ Fonte .tl_set:N = \l__wordle_font_tl,
+ Police .tl_set:N = \l__wordle_font_tl,
+ font .initial:n = \Large\bfseries\sffamily,
+
+ % tile size
+ size .dim_set:N = \l__wordle_size_dim,
+ Taille .dim_set:N = \l__wordle_size_dim,
+ size .initial:n = 8mm,
+
+ % thickness of tile border
+ thickness .dim_set:N = \l__wordle_thickness_dim,
+ Epaisseur .dim_set:N = \l__wordle_thickness_dim,
+ Thick .code:n = {\dim_set:Nn \l__wordle_thickness_dim {#1mm}},
+ thickness .initial:n = 0.25mm,
+
+ % rounded-corner = #
+ rounded .dim_set:N = \l__wordle_rounded_dim,
+ Arrondi .dim_set:N = \l__wordle_rounded_dim,
+ rounded .default:n = 4pt,
+ Rounded .code:n = {\dim_set:Nn \l__wordle_rounded_dim {#1mm}},
+ rounded .initial:n = 1mm,
+
+ % separation between tiles
+ separation .dim_set:N = \l__wordle_sep_dim,
+ Separation .dim_set:N = \l__wordle_sep_dim,
+ separation .initial:n = 0.5mm,
+
+ % rescale tiles
+ scale .code:n = { \__wordle_rescale:n {#1} },
+ Echelle .code:n = { \__wordle_rescale:n {#1} },
+ scale .initial:n = 1,
+ Unit .code:n = { \__wordle_rescale:n {#1} },
+ Unite .code:n = { \__wordle_rescale:n {#1} },
+
+ % letter case
+ case~sensitive .bool_set:N = \l__wordle_case_sensitive_bool,
+ case~sensitive .default:n = true,
+ case~sensitive .initial:n = false,
+
+ % letter visibility
+ letters .code:n = {\cs_set_eq:NN \__wordle_letter:n \__wordle_letter_natural:n},
+ Lettres .code:n = {\cs_set_eq:NN \__wordle_letter:n \__wordle_letter_natural:n},
+ noletters .code:n = {\cs_set_eq:NN \__wordle_letter:n \__wordle_letter_none:n},
+ NonLettres .code:n = {\cs_set_eq:NN \__wordle_letter:n \__wordle_letter_none:n},
+ letters .initial:n = true,
+
+ % forced letter case
+ natural~case .code:n = {
+ \cs_set_eq:NN \__wordle_letter:n \__wordle_letter_natural:n
+ },
+ lower~case .code:n = {
+ \cs_set_eq:NN \__wordle_letter:n \__wordle_letter_lower:n
+ \bool_set_false:N \l__wordle_case_sensitive_bool
+ },
+ upper~case .code:n = {
+ \cs_set_eq:NN \__wordle_letter:n \__wordle_letter_upper:n
+ \bool_set_false:N \l__wordle_case_sensitive_bool
+ },
+
+ % puzzle specs: rows and columns
+ rows .int_set:N = \l__wordle_rows_int,
+ Lignes .int_set:N = \l__wordle_rows_int,
+ rows .initial:n = 0,
+
+ strict .bool_set:N = \l__wordle_strict_bool,
+ Strict .bool_set:N = \l__wordle_strict_bool,
+ strict .default:n = true,
+ strict .initial:n = false,
+
+ % tikz settings
+ tile~style .tl_set:N = \l__wordle_tile_style_tl,
+ Style~case .tl_set:N = \l__wordle_tile_style_tl,
+ tile~style .initial:n = ,
+
+ name .tl_set:N = \l__wordle_name_tl,
+ Nom .tl_set:N = \l__wordle_name_tl,
+ name .initial:n = W,
+ tikz .tl_set:N = \l__wordle_tikz_tl,
+ tikz .initial:n = ,
+}
+
+% user settings
+\NewDocumentCommand\WordleSetup{ m }{ \keys_set:nn { wordle } {#1} }
+\NewDocumentCommand\ParamsSutom{ m }{ \keys_set:nn { wordle } {#1} }
+
+% ----------------------------------------------------------------
+% Define TikZ Wordle styles for the letters. Using tikz styles both
+% ensures consistency and has the added advantage of taking care of
+% expansion issues with the tile settings
+\tikzset{/Wordle/.is~family, /Wordle,
+ tile/.style = {
+ /tikz, % change back to using tikz keys
+ inner~sep = \l__wordle_sep_dim,
+ minimum~height = \l__wordle_size_dim,
+ minimum~size = \l__wordle_size_dim,
+ rounded~corners= \l__wordle_rounded_dim,
+ line~width = \l__wordle_thickness_dim,
+ font = \l__wordle_font_tl,
+ % scale = \fp_to_decimal:N \l__wordle_scale_fp,
+ text = \tl_use:c {l__wordle_#1_text_tl},
+ fill = \tl_use:c {l__wordle_#1_colour_tl},
+ shape = \tl_use:c {l__wordle_#1_shape_tl},
+ },
+ frame/.style = {
+ /Wordle/tile=#1,
+ /tikz, % change back to using tikz keys
+ draw = \tl_use:c{l__wordle_#1_border_tl},
+ minimum~size = {\l__wordle_size_dim+\l__wordle_thickness_dim},
+ fill = \tl_use:c {l__wordle_#1_colour_tl},
+ shape = rectangle,
+ },
+}
+
+% apply a TikZ setting
+\cs_new_nopar:Npn \__wordle_tikzset:n #1 { \exp_args:Nx \tikzset{#1} }
+
+% ----------------------------------------------------------------
+% preprocessing of the wordle letters
+\cs_new_nopar:Npn \__wordle_letter_none:n #1 {}
+\cs_new_nopar:Npn \__wordle_letter_natural:n #1 {#1}
+\cs_new_nopar:Npn \__wordle_letter_lower:n #1 { \str_lowercase:n {#1} }
+\cs_new_nopar:Npn \__wordle_letter_upper:n #1 { \str_uppercase:n {#1} }
+
+% by default wordle letters are not processed
+\cs_set_eq:NN \__wordle_letter:n \__wordle_letter_natural:n
+
+% Print a letter in a box as a node. There is slightly different behaviour
+% depending on whether the tile is frames or we are in strict mode. The way
+% that the entry is printed depends is controlled by \__wordle_letter:n.
+\cs_new_nopar:Npn \wordle__boxed_letter:nn #1#2
+{
+ % determine the node name, which takes the form <W>-<row>-<col>
+ \tl_set:No \l_tmpa_tl
+ {
+ \l__wordle_name_tl-\int_eval:n{1+\l__wordle_row_index_int}-\int_use:N\l__wordle_letter_index_int
+ }
+
+ % the construction of the node depends on whether the tile is framed
+ \tl_if_eq:cnTF {l__wordle_#1_frame_tl} {true}
+ {
+ % draw the frame
+ \node[/Wordle/frame=absent] % frame use the absent fill colour
+ at ({\l__wordle_letter_index_int*\l__wordle_grid_dim},{-\l__wordle_row_index_int*\l__wordle_grid_dim}){};
+ % draw the tile
+ \node[/Wordle/tile=#1]
+ (\l_tmpa_tl) at ({\l__wordle_letter_index_int*\l__wordle_grid_dim},
+ {-\l__wordle_row_index_int*\l__wordle_grid_dim})
+ { \l__wordle_align_tl\__wordle_letter:n {#2} };
+ }
+ {
+ % draw the tile, with a border
+ \node[/Wordle/frame=#1, /Wordle/tile=#1]
+ (\l_tmpa_tl) at ({\l__wordle_letter_index_int*\l__wordle_grid_dim},
+ {-\l__wordle_row_index_int*\l__wordle_grid_dim})
+ { \l__wordle_align_tl\__wordle_letter:n {#2} };
+ }
+
+ % if strict then put a slash through any extra letters
+ \bool_if:NT \l__wordle_strict_bool
+ {
+ \int_compare:nNnT {\l__wordle_letter_index_int} > {\seq_count:N \l__wordle_answer_seq }
+ {
+ \draw[red,ultra~thick] (\tl_use:N\l_tmpa_tl.south~west)--(\tl_use:N\l_tmpa_tl.north~east);
+ }
+ }
+}
+
+\seq_new:N \l__wordle_answer_seq % the answer
+\prop_new:N \l__wordle_answer_counts_prop % count letters in wordle
+\seq_new:N \l__wordle_solution_seq % list of all words
+\prop_new:N \l__wordle_word_counts_prop % count letters in word
+\int_new:N \l__wordle_letter_index_int % index of current letter in word
+\int_new:N \l__wordle_row_index_int % TikZ row index in solution
+
+% a conditional for non-negative prop counter in \l__wordle_word_counts_prop
+\prg_new_protected_conditional:Npnn \if__wordle_letter_nonnegative:n #1 {TF}
+{
+ \prop_if_in:NnTF \l__wordle_word_counts_prop {#1}
+ { % letter in in prop
+ \prop_get:NnN \l__wordle_word_counts_prop {#1} \l_tmpa_tl
+ \int_compare:nNnTF {\l_tmpa_tl} < {0}
+ {\prg_return_false:} {\prg_return_true:}
+ }
+ {\prg_return_false:}
+}
+
+\cs_generate_variant:Nn \str_if_eq:nVTF {xVTF}
+
+% a conditional for comparing letters
+\prg_new_protected_conditional:Npnn \if__wordle_letters_agree:n #1 {T, TF}
+{
+ \str_set:Nx \l_tmpa_str
+ {\seq_item:Nn \l__wordle_answer_seq {\l__wordle_letter_index_int}}
+
+
+ \bool_if:NTF \l__wordle_case_sensitive_bool
+ {\str_if_eq:nVTF {#1} \l_tmpa_str {\prg_return_true:} {\prg_return_false:}}
+ {\str_if_eq:xVTF {\str_uppercase:n{#1}} \l_tmpa_str {\prg_return_true:} {\prg_return_false:}}
+}
+
+% add #3 to <prop=#1>.#2
+\cs_new_nopar:Npn \wordle__add_to_prop_counter:Nnn #1#2#3
+{
+ \prop_put_if_new:Nnn #1 {#2} {0}
+ \prop_pop:NnN #1 {#2} \l_tmp_a
+ \prop_put:Nnx #1 {#2} {\int_eval:n {#3+\l_tmp_a}}
+}
+
+% make \l__wordle_answer_counts_prop<x> = #x's in wordle_seq
+\cs_new_nopar:Npn \wordle__count_letters_in_answer:n #1
+{
+ \wordle__add_to_prop_counter:Nnn \l__wordle_answer_counts_prop {#1} {1}
+}
+
+% first run: subtract correct matches from letter counts
+\cs_new_nopar:Npn \wordle__count_letters_in_word:n #1
+{
+ \int_incr:N \l__wordle_letter_index_int
+ \if__wordle_letters_agree:nT {#1}
+ { \wordle__add_to_prop_counter:Nnn \l__wordle_word_counts_prop {#1} {-1} }
+}
+
+% on the second run we print a coloured wordle word
+\cs_new_nopar:Npn \wordle__write_letters_in_word:n #1
+{
+ \int_incr:N \l__wordle_letter_index_int
+ \if__wordle_letters_agree:nTF {#1}
+ { \wordle__boxed_letter:nn {correct} {#1} }
+ {
+ % subtract 1 from the prop counter
+ \wordle__add_to_prop_counter:Nnn \l__wordle_word_counts_prop {#1} {-1}
+ % if the counter is non-negative this is a pseudo match
+ \if__wordle_letter_nonnegative:nTF {#1}
+ { \wordle__boxed_letter:nn {present} {#1} }
+ { \wordle__boxed_letter:nn {absent} {#1} }
+ }
+}
+
+\cs_generate_variant:Nn \seq_set_split:Nnn {Nnx}
+\cs_generate_variant:Nn \cs_set_nopar:Nn {NV}
+
+% typeset the word "#1", colouring letters using the wordle convention
+\cs_new_nopar:Npn \wordle__mark_word:n #1
+{
+ \str_if_eq:nnTF {#1} {*}
+ {
+ \cs_set_eq:NN \wordle__process_word:n \wordle__empty_word:n
+ }
+ {
+ \prop_set_eq:NN \l__wordle_word_counts_prop \l__wordle_answer_counts_prop
+ \tl_map_function:nN {#1} \wordle__count_letters_in_word:n
+ \int_zero:N \l__wordle_letter_index_int
+ \tl_map_function:nN {#1} \wordle__write_letters_in_word:n
+
+ % if strict then check lengths
+ \bool_if:NT \l__wordle_strict_bool
+ {
+ \int_while_do:nNnn {\l__wordle_letter_index_int} < {\seq_count:N\l__wordle_answer_seq}
+ {
+ \int_incr:N \l__wordle_letter_index_int
+ \wordle__boxed_letter:nn {absent} {\c_space_tl}
+ }
+ }
+
+ % increment the row index
+ \int_incr:N \l__wordle_row_index_int
+ }
+}
+
+% typeset the word "#1" by putting boxes around each letter
+\cs_new_nopar:Npn \wordle__empty_word:n #1
+{
+ \tl_map_inline:nn {#1}
+ {
+ \int_incr:N \l__wordle_letter_index_int
+ \wordle__boxed_letter:nn {empty} {##1}
+ }
+ % if strict then check lengths
+ \bool_if:NT \l__wordle_strict_bool
+ {
+ \int_while_do:nNnn {\l__wordle_ltter_index_int} < {\seq_count:N\l__wordle_answer_seq}
+ {
+ \int_incr:N \l__wordle_letter_index_int
+ \wordle__boxed_letter:nn {empty} {\c_space_tl}
+ }
+ }
+ \int_incr:N \l__wordle_row_index_int
+}
+
+\cs_set_eq:NN \wordle__process_word:n \wordle__mark_word:n
+
+\NewDocumentEnvironment{wordle}{ O{} m O{} b }
+{
+ % apply wordle environment options
+ \WordleSetup{#1}
+ \begin{tikzpicture}
+
+ % apply any tikz settings -- we need to some expansion trickery to do this
+ \__wordle_tikzset:n {\l__wordle_tikz_tl}
+ \__wordle_tikzset:n {/Wordle/tile/.append~style={\l__wordle_depth_tl,\l__wordle_tile_style_tl}}
+
+ % set grid dimension = box size + separation
+ \dim_set:Nn \l__wordle_grid_dim {\l__wordle_size_dim+\l__wordle_sep_dim}
+
+ % split the answer into letters
+ \bool_if:NTF \l__wordle_case_sensitive_bool
+ { \seq_set_split:Nnn \l__wordle_answer_seq {} {#2} }
+ { \seq_set_split:Nnx \l__wordle_answer_seq {} {\str_uppercase:n {#2}} }
+
+ % count the number of times letters appear in \l__wordle_answer_seq
+ \prop_clear:N \l__wordle_answer_counts_prop
+ \tl_map_function:nN {#2} \wordle__count_letters_in_answer:n
+
+ % split the solution into words
+ \regex_split:nnN {\s} {#4} \l__wordle_solution_seq
+
+ % process the words
+ \int_zero:N \l__wordle_row_index_int
+ \seq_map_inline:Nn \l__wordle_solution_seq
+ {
+ \int_zero:N \l__wordle_letter_index_int
+ \wordle__process_word:n {##1}
+ }
+
+ % if required, add extra required blank rows
+ \int_while_do:nNnn {\l__wordle_row_index_int} < {\l__wordle_rows_int}
+ {
+ \int_zero:N \l__wordle_letter_index_int
+ \int_while_do:nNnn {\l__wordle_letter_index_int} < {\seq_count:N\l__wordle_answer_seq}
+ {
+ \int_incr:N \l__wordle_letter_index_int
+ \wordle__boxed_letter:nn {empty} {\c_space_tl}
+ }
+ \int_incr:N \l__wordle_row_index_int
+ }
+
+ % finally, execute the optional TikZ commands
+ #3
+
+ \end{tikzpicture}
+}{}
+
+% wrapper environment for Gridwordle
+\NewDocumentEnvironment{GridWordle}{ O{} m O{} b }
+ {
+ \begin{wordle}[#1]{#2}[#3]#4]\end{wordle}
+ }
+ {}
+
+% wrapper environment for GrilleSutom
+\NewDocumentEnvironment{GrilleSutom}{ O{} m O{} b }
+ {
+ \begin{wordle}[style=sutom,#1]{#2}[#3]#4\end{wordle}
+ }
+ {}
+
+\endinput
+
+% ----------------------------------------------------------------
+% CHANGE LOG
+%
+% Version 0.3 - \wordle@release
+% - merged AM & CP packages, adding styles and streamlining options, french keys
+%
+% Version 0.2 - \wordle@release
+% - added documentation and cleaned some of the options
+%
+% Version 0.1 - 2022-10-01
+% - initial version
+%
+% ----------------------------------------------------------------
+%
+% Copyright (C) 2022-3 by Andrew Mathas <andrew.mathas@gmail.com>
+% and Cédric Pierquet cpierquet@outlook.fr
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License (LPPL), either
+% version 1.3c of this license or (at your option) any later
+% version. The latest version of this license is in the file:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% This work is "maintained" (as per LPPL maintenance status) by
+% Andrew Mathas.
+%
+% This work consists of the files:
+% wordle.sty
+% wordle.tex
diff --git a/graphics/pstricks/base/Changes b/graphics/pstricks/base/Changes
index 5871e81cb9..44178e4383 100644
--- a/graphics/pstricks/base/Changes
+++ b/graphics/pstricks/base/Changes
@@ -1,4 +1,4 @@
-% $Id: Changes 913 2024-07-09 16:27:10Z herbert $
+% $Id: Changes 1031 2024-11-16 08:55:54Z herbert $
For all changes see file History! Here are only the last one changes
listed.
@@ -11,6 +11,7 @@ pstricks.tex --------
versions like 2.47a have only changes in other files, but not
in this main package.
+3.21 2024-11-16 - fix for missing \pscoor
3.20 2024-07-09 - changed \clipbox to \psclipbox to prevent clash with
other package which also uses \clipbox
3.19c 2024-02-02 - fix for check of wrong docname "pstricks.tex" in pstricks.sty (RN)
diff --git a/graphics/pstricks/base/doc/pst-news24.pdf b/graphics/pstricks/base/doc/pst-news24.pdf
index e102b8a602..6a94cf63ea 100644
--- a/graphics/pstricks/base/doc/pst-news24.pdf
+++ b/graphics/pstricks/base/doc/pst-news24.pdf
Binary files differ
diff --git a/graphics/pstricks/base/generic/pstricks.tex b/graphics/pstricks/base/generic/pstricks.tex
index 66b00657b9..094dcbb232 100644
--- a/graphics/pstricks/base/generic/pstricks.tex
+++ b/graphics/pstricks/base/generic/pstricks.tex
@@ -88,8 +88,8 @@
\let\pgfforeach\foreach
%
-\def\fileversion{3.20}
-\def\filedate{2024/07/09}
+\def\fileversion{3.21}
+\def\filedate{2024/11/16}
\pst@addfams{pstricks}
%
%\define@boolkey[psset]{pstricks}[Pst@]{useURWfonts}[true]{}
@@ -4109,6 +4109,36 @@ pop
\define@key[psset]{pstricks}{margin}[0pt]{\ps@readmargin#1,,,,\@nil}
\psset[pstricks]{margin=0pt}
%
+
+\ExplSyntaxOn
+\define@key[psset]{pstricks}{alt}[]{\tl_set:Ne\l__tag_graphic_alt_tl{\text_purify:n{#1}}}
+%\define@boolkey[psset]{pstricks}[]{artifact}[true]{}
+\define@key[psset]{pstricks}{artifact}{%
+ \bool_set_true:N \l__tag_graphic_artifact_bool
+ \bool_set_false:N \l__tag_graphic_BBox_bool
+}
+\define@key[psset]{pstricks}{actualtext}[]{%
+ \tl_set:Ne\l__tag_graphic_actual_tl{\text_purify:n{#1}}
+ \bool_set_false:N \l__tag_graphic_BBox_bool
+}
+\define@key[psset]{pstricks}{correct-BBox}{%
+ \bool_set_true:N \l__tag_graphic_bboxcorr_bool
+ \seq_set_split:Nnn\l__tag_graphic_bboxcorr_seq{~}{#1~0pt~0pt~0pt~0pt}%
+}
+\define@key[psset]{pstricks}{tag}[]{%
+ \str_case:nnF {#1}{
+ {artifact}
+ {
+ \bool_set_true:N \l__tag_graphic_artifact_bool
+ \bool_set_false:N \l__tag_graphic_BBox_bool
+ }
+ {false}{\tag_stop:}
+ }
+ {\tl_set:Nn\l__tag_graphic_struct_tl{#1}}
+ }
+
+\ExplSyntaxOff
+
\newcount\ps@imagectr
\ps@imagectr=0
%\newif\ifPst@findcoor
@@ -4120,7 +4150,7 @@ pop
\def\pst@@picture[#1]{\@ifnextchar({\pst@@picture@i[#1]}{\pst@@picture@@i[#1]}}%
\def\pst@@picture@@i[#1]{%
\def\pic@coor{(0,0)(0,0)}%
-% \gdef\pscoor{(10,10)}%
+ \gdef\pscoor{(10,10)}%
\ifPst@calcframe
\typeout{>>>Check for file \jobname-\the\numexpr\ps@imagectr+1.psaux}%
\IfFileExists{\jobname-\the\numexpr\ps@imagectr+1.psaux}
diff --git a/graphics/pstricks/contrib/pst-circ/Changes b/graphics/pstricks/contrib/pst-circ/Changes
index 7c65cba773..4e7aef8965 100644
--- a/graphics/pstricks/contrib/pst-circ/Changes
+++ b/graphics/pstricks/contrib/pst-circ/Changes
@@ -1,3 +1,4 @@
+2.20 2024-10-10 reset fillstyle for OA until the connections are drawn
2.19 2021-09-09 fixes for use with lualatex
2.18 2021-04-28 Added new transistors: JFET (N and P channels),
D-MOSFET (N and P channels), and IGBT
diff --git a/graphics/pstricks/contrib/pst-circ/doc/pst-circ-doc.pdf b/graphics/pstricks/contrib/pst-circ/doc/pst-circ-doc.pdf
index 1d65756456..d66436aff7 100644
--- a/graphics/pstricks/contrib/pst-circ/doc/pst-circ-doc.pdf
+++ b/graphics/pstricks/contrib/pst-circ/doc/pst-circ-doc.pdf
Binary files differ
diff --git a/graphics/pstricks/contrib/pst-circ/tex/pst-circ.tex b/graphics/pstricks/contrib/pst-circ/tex/pst-circ.tex
index 4a3e81fde0..298ac906bc 100644
--- a/graphics/pstricks/contrib/pst-circ/tex/pst-circ.tex
+++ b/graphics/pstricks/contrib/pst-circ/tex/pst-circ.tex
@@ -1,4 +1,4 @@
-%% $Id: pst-circ.tex 210 2021-09-10 07:52:09Z herbert $
+%% $Id: pst-circ.tex 1015 2024-10-10 12:02:54Z herbert $
%% This is file `pst-circ.tex'
%%
%% IMPORTANT NOTICE:
@@ -26,8 +26,8 @@
\ifx\PSTXKeyLoaded\endinput \else\input pst-xkey \fi
\ifx\PSTMultidoLoaded\endinput\else\input multido.tex\fi
%
-\def\fileversion{2.19}
-\def\filedate{2021/09/09}
+\def\fileversion{2.20}
+\def\filedate{2024/10/10}
\message{`pst-circ' v\fileversion (hv)}
%
\edef\PstAtCode{\the\catcode`\@}
@@ -1022,6 +1022,7 @@
/YC Y1 Y2 add 2 div def
XC YC end ){C@}
\rput(C@){\pst@draw@OA}
+ \psset{fillstyle=none}% reset, otherwise the connectionlines are also used for a fillstyle
\ncangle[arrows=-,arm=.5,angleA=0,angleB=180]{#1}{\ifPst@OAinvert Minus@\else Plus@\fi}
\ncput[npos=2]{\pnode{\ifPst@OAinvert Minus@@\else Plus@@\fi}}
\ifPst@OAiplus
@@ -1905,9 +1906,9 @@
\fi
\pcline[fillstyle=none,linestyle=none](#2)(#3)
%%%%%
- \pst@intensity{#2}{#3}
- \pst@tension{#2}{#3}
- \fi%
+ \pst@intensity{#2}{#3}%
+ \pst@tension{#2}{#3}%
+ \fi
}%
%
\def\pst@intensity#1#2{%
@@ -2112,15 +2113,15 @@
\pnode(0.5,0){dipole@2}
\psframe[linewidth=1.5\pslinewidth,fillstyle=solid,fillcolor=black](-0.5,-0.25)(0.5,0.25)
\else
- \pscurve[arrows=-,linewidth=1.5\pslinewidth](-1,0)(-0.75,0.5)(-0.5,0)
- \pscurve[arrows=-,linewidth=1.5\pslinewidth](-0.5,0)(-0.25,0.5)(0,0)
- \pscurve[arrows=-,linewidth=1.5\pslinewidth](0,0)(0.25,0.5)(0.5,0)
- \pscurve[arrows=-,linewidth=1.5\pslinewidth](0.5,0)(0.75,0.5)(1,0)
- \pnode(-1,0){dipole@1}
- \pnode(1,0){dipole@2}
- \fi\fi\fi\fi%
- \ifPst@variable\psline{->}(-0.75,-0.5)(0.75,0.5)\fi%
- }
+ \pscurve[arrows=-,linewidth=1.5\pslinewidth](-1,0)(-0.75,0.5)(-0.5,0)%
+ \pscurve[arrows=-,linewidth=1.5\pslinewidth](-0.5,0)(-0.25,0.5)(0,0)%
+ \pscurve[arrows=-,linewidth=1.5\pslinewidth](0,0)(0.25,0.5)(0.5,0)%
+ \pscurve[arrows=-,linewidth=1.5\pslinewidth](0.5,0)(0.75,0.5)(1,0)%
+ \pnode(-1,0){dipole@1}%
+ \pnode(1,0){dipole@2}%
+ \fi\fi\fi\fi
+ \ifPst@variable\psline{->}(-0.75,-0.5)(0.75,0.5)\fi
+}
%
\def\pst@draw@Ucc{%
\pnode(-0.5,0){dipole@1}
diff --git a/graphics/pstricks/contrib/pst-coil/Changes b/graphics/pstricks/contrib/pst-coil/Changes
index d9028ebf31..c9fa1b1dae 100644
--- a/graphics/pstricks/contrib/pst-coil/Changes
+++ b/graphics/pstricks/contrib/pst-coil/Changes
@@ -2,6 +2,7 @@ pst-coil.sty --------
2010-02-01 message for loading the pro file
pst-coil.tex --------
+v. 1.08 2024-08-13 - added alternative macro \psAltCoil
v. 1.07 2015-05-13 - modified psSin
v. 1.06 2011-09-18 - fix bug with \pszigzag
v. 1.05 2011-07-12 - added optional argument bow for circular
diff --git a/graphics/pstricks/contrib/pst-coil/README b/graphics/pstricks/contrib/pst-coil/README
index 8f8b07cfa0..0484bb5078 100644
--- a/graphics/pstricks/contrib/pst-coil/README
+++ b/graphics/pstricks/contrib/pst-coil/README
@@ -9,4 +9,4 @@ pst-coil-doc.bib - The documentation, bibfile
--
-Herbert Voss 2006-11-05
+hoss@tug.org 2024-08-13
diff --git a/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.bib b/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.bib
index b29fe53b65..1281ed1318 100644
--- a/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.bib
+++ b/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.bib
@@ -60,7 +60,7 @@
author = {Michel Goosens and Frank Mittelbach and Sebastian Rahtz and Denis Roegel and Herbert Vo{\ss}},
title = {The {\LaTeX} {G}raphics {C}ompanion},
publisher = {{Addison-Wesley Publishing Company}},
- edition = second,
+ edition = 2,
year = {2007},
address = {Reading, Mass.}
}
diff --git a/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.pdf b/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.pdf
index 26f0e655ba..13ae4342bb 100644
--- a/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.pdf
+++ b/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.pdf
Binary files differ
diff --git a/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.tex b/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.tex
index 201f8298c0..ebcd0aa051 100644
--- a/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.tex
+++ b/graphics/pstricks/contrib/pst-coil/doc/pst-coil-doc.tex
@@ -1,9 +1,13 @@
-%% $Id: pst-coil-doc.tex 539 2011-07-12 08:22:33Z herbert $
-\documentclass[11pt,english,BCOR10mm,DIV12,bibliography=totoc,parskip=false,smallheadings
- headexclude,footexclude,oneside,dvipsnames,svgnames]{pst-doc}
+%% $Id: pst-coil-doc.tex 930 2024-08-13 18:19:44Z herbert $
+\errorcontextlines=100
+%\RequirePackage{pdfmanagement-testphase}
+\DocumentMetadata{}
+\documentclass[11pt,english,BCOR=10mm,DIV=12,bibliography=totoc,parskip=false,headings=small,
+ headinclude=false,footinclude=false,twoside,english]{pst-doc}
\listfiles
-\usepackage[utf8]{inputenc}
+\addbibresource{\jobname.bib}
+\usepackage{csquotes,animate}
\usepackage{pst-plot,pst-node,pst-coil}
\SpecialCoor
\let\pstFV\fileversion
@@ -25,7 +29,7 @@
\author{Timothy Van Zandt\\Herbert Vo\ss\\Michael Sharpe}
\date{\today}
-\maketitle
+\settitle
\begin{abstract}
Coils, springs and zigzag curves
@@ -42,7 +46,7 @@ elaborated on at the corresponding places.
\vfill
\noindent
Thanks to:
-Marco Daniel, Denis Girou, Uwe Siart.
+Marco Daniel, Denis Girou, Manuel Luque, Uwe Siart.
\end{abstract}
\clearpage
@@ -561,6 +565,146 @@ Th other connections behave completely analogue to those dealt with the
package \LPack{pst-node} so that
no further explanations are needed here.
+
+\section{Alternative macro}
+
+The macro \Lcs{psAltCoil} depends on the code from Manuel Luque. It uses a different way
+to draw coils with a kind of perspective view. The possible optional parameter are:
+
+\begin{itemize}
+ \item \Lkeyword{N}\textsf{=10} : number of coils
+ \item \Lkeyword{l0}\texttt{=5} : initial length in cm
+ \item \Lkeyword{R}\texttt{=0.5} : initial radius in cm
+ \item \Lkeyword{arm}\texttt{=0} : arm length in cm
+ \item \Lkeyword{alpha}\texttt{=15} : projection angle
+ \item \Lkeyword{nS}\texttt{=25} : number of steps per coil
+\end{itemize}
+
+
+\begin{LTXexample}[pos=t]
+\begin{pspicture}[showgrid,arrowsize=0.2,arrowinset=0.1](-2,-1.4)(14,2)
+\psAltCoil[N=20,l0=10,alpha=20,arm=0.5,linewidth=0.05]{*-*}(0,0)(11,0)
+\psline[linewidth=0.5\pslinewidth](0.5,0)(0.5,1.25)
+\psline[linewidth=0.5\pslinewidth](10.5,0)(10.5,1.25)
+\psline{<->}(0.5,1)(10.5,1)
+\uput[u](5.5,1){l0=10 cm}
+\psline[linewidth=0.5\pslinewidth](0,0)(0,1.25)
+\psline{>-}(-0.22,1)(0.5,1)
+\uput[u](0.25,1){dl}
+\psline[linewidth=0.5\pslinewidth](11,0)(11,1.25)
+\psline{-<}(10.5,1)(11.25,1)
+\uput[u](10.75,1){dl}
+\end{pspicture}
+\end{LTXexample}
+
+
+\begin{LTXexample}[pos=t]
+\begin{pspicture}[showgrid,arrowsize=0.2,arrowinset=0.1](-2,-1.4)(14,2)
+\psAltCoil[N=20,l0=10,R=0.5,alpha=20,arm=0.5,linewidth=0.05]{*-*}(-2,0)(14,0)
+\psline[linewidth=0.5\pslinewidth](-1.5,0)(-1.5,1.25)
+\psline[linewidth=0.5\pslinewidth](13.5,0)(13.5,1.25)
+\psline{<->}(-1.5,1)(13.5,1)
+\uput[u](5.5,1){L=15 cm}
+\psline[linewidth=0.5\pslinewidth](-2,0)(-2,1.25)
+\psline{>-}(-2.25,1)(-1.5,1)
+\uput[u](-1.75,1){dl}
+\psline[linewidth=0.5\pslinewidth](14,0)(14,1.25)
+\psline{-<}(13.5,1)(14.25,1)
+\uput[u](13.75,1){dl}
+\end{pspicture}
+\end{LTXexample}
+
+
+
+The next animation needs Adobe Acrobat to view:
+
+\begin{minipage}{4cm}
+\psset{unit=0.5}
+\def\nFrames{44}% 44 images
+\def\calc{
+ /Z0 -16 def
+ /OMEGA 20 0.1 div sqrt def % pulsation des oscillations
+ /Period TwoPi OMEGA div def % 0.4442883
+ /ti \rt\space def
+ /ZR Z0 -5 OMEGA RadtoDeg ti mul cos mul add def }
+\newcommand\bille{%
+ \psset{linewidth=0.02,fillstyle=solid,fillcolor=yellow!50}
+ \pscircle*[linecolor=yellow](0,0){0.5}
+ \psarc[linecolor=black](0,0){0.425}{-110}{90}
+ \psarc[linecolor=black](0,0){0.3}{-90}{70}
+ \psarc[linecolor=black](0,0){0.2}{-70}{60}}
+
+\begin{animateinline}[controls,loop,%
+ begin={\begin{pspicture}(-2,1)(2,-23)},
+ end={\end{pspicture}}]{5}% 5 images/s
+\multiframe{\nFrames}{rt=0+0.01}{%
+ \psframe*(-2,1)(2,-23)
+ \psframe[fillstyle=hlines,linestyle=none,hatchcolor=white](-1,0)(1,0.2)
+ \psline[linecolor=white](-1,0)(1,0)
+ \psdot[linecolor=white](0,0)
+ \psgrid[subgriddiv=0,gridcolor=white,griddots=10,gridlabels=0pt]
+ \psAltCoil[arm=0.5,alpha=25,N=20,l0=10,linecolor=white,linewidth=0.05](0,0)(! 0 \calc ZR)
+ \rput(! 0 \calc ZR 0.5 sub){\pscircle*[linecolor=yellow](0,0){0.5}}
+}
+\end{animateinline}
+\end{minipage}%
+\begin{minipage}{\dimexpr\linewidth-4cm}
+\begin{verbatim}
+\psset{unit=0.75}
+\def\nFrames{44}% 44 images
+\def\calc{
+ /Z0 -16 def
+ /OMEGA 20 0.1 div sqrt def
+ /Period TwoPi OMEGA div def % 0.4442883
+ /ti \rt\space def % rt variable from animate
+ /ZR Z0 -5 OMEGA RadtoDeg ti mul cos mul add def }
+\begin{animateinline}[controls,loop,%
+ begin={\begin{pspicture}(-2,1)(2,-23)},
+ end={\end{pspicture}}]{5}% 5 images/s
+\multiframe{\nFrames}{rt=0+0.01}{%
+ \psframe*(-2,1)(2,-23)
+ \psframe[fillstyle=hlines,linestyle=none,
+ hatchcolor=white](-1,0)(1,0.2)
+ \psline[linecolor=white](-1,0)(1,0)
+ \psdot[linecolor=white](0,0)
+ \psgrid[subgriddiv=0,gridcolor=white,griddots=10,gridlabels=0pt]
+ \psAltCoil[arm=0.5,alpha=25,N=20,l0=10,linecolor=white,
+ linewidth=0.05](0,0)(! 0 \calc ZR)
+ \rput(! 0 \calc ZR 0.5 sub){\pscircle*[linecolor=yellow](0,0){0.5}}
+}
+\end{animateinline}
+\end{verbatim}
+\end{minipage}
+
+
+
+\begin{LTXexample}[pos=l]
+\begin{pspicture}[showgrid](0,0)(6,11)
+\psAltCoil[linecolor=blue,N=20,linewidth=0.1,
+ alpha=-20,arm=1,arrowinset=0.1]{<->}(1,2)(5,10)
+\end{pspicture}
+\end{LTXexample}
+
+
+\begin{LTXexample}[pos=l]
+\begin{pspicture}[showgrid](0,0)(4,6)
+\psAltCoil[linecolor=red,N=20](1,5)(3,1)
+\end{pspicture}
+\end{LTXexample}
+
+
+\begin{LTXexample}[pos=t]
+\begin{pspicture}[showgrid](0,-5)(16,5)
+\psAltCoil[linecolor=blue,N=25,R=1,l0=5,arm=0.5,alpha=-20,
+ doubleline=true](0,3)(16,3)
+\psAltCoil[linecolor=red,N=8,alpha=25](0,0)(4,0)
+\psAltCoil[linecolor=black,N=8,alpha=25](16,0)
+\psAltCoil[linecolor=blue,N=15.5,l0=5,arm=0.5,alpha=0](0,-2)(16,-2)
+\end{pspicture}
+\end{LTXexample}
+
+
+
\clearpage
\section{List of all optional arguments for \texttt{pst-coil}}
@@ -570,8 +714,7 @@ no further explanations are needed here.
\nocite{*}
\bgroup
\RaggedRight
-\bibliographystyle{plain}
-\bibliography{pst-coil-doc}
+\printbibliography
\egroup
\printindex
diff --git a/graphics/pstricks/contrib/pst-coil/dvips/pst-coil.pro b/graphics/pstricks/contrib/pst-coil/dvips/pst-coil.pro
index 9513e99194..b5484af58c 100644
--- a/graphics/pstricks/contrib/pst-coil/dvips/pst-coil.pro
+++ b/graphics/pstricks/contrib/pst-coil/dvips/pst-coil.pro
@@ -41,8 +41,8 @@
/roundValue ED
/relativePeriod ED
/Periods ED
- /y1 ED /x1 ED /y0 ED /x0 ED
- y1 y0 sub x1 x0 sub 2 copy Pyth
+ /y_1 ED /x_1 ED /y_0 ED /x_0 ED
+ y_1 y_0 sub x_1 x_0 sub 2 copy Pyth
dup /TotalLength ED
ArmA sub ArmB sub /SinLength ED
Atan /RotAngle ED
@@ -54,7 +54,7 @@
/dxStep SinLength 360 div def % the default step for x pos
/xStep 360 PointsPerPeriod div def % the step for the for loop
/mtrx CM def
- x0 y0 translate
+ x_0 y_0 translate
RotAngle rotate
1 0 0 0 ArrowA ArmA 0 lineto
1 xStep 360 { % PointsPerPeriod times
@@ -77,7 +77,9 @@
BeginAngle 180 div AspectCos mul add BeginAngle cos
/lineto load stopped { moveto } if
BeginAngle Inc EndAngle { CoilLoop } for
- EndAngle CoilLoop mtrx setmatrix } def
+ EndAngle CoilLoop mtrx setmatrix
+} def
+%
/ZigZag { 15 dict begin
/ArmB ED /ArmA ED
2 div /w ED
@@ -109,7 +111,7 @@
%/psi ang 90 sub theta sub def % angle of B from center if bow>0
/rho HalfLength theta sin div def % radius of circle
bow 0 gt { /direc 1 def /thetaB ang 90 sub theta sub def } % travel B to A in pos drn
- { /direc -1 def /thetaB ang 90 add theta add def } ifelse % travel B to A in neg drn
+ { /direc -1 def /thetaB ang 90 add theta add def } ifelse % travel B to A in neg drn
%thetaB=angle from center to B
rho thetaB 180 add PtoC translate % origin now at center
/h h rho div RadtoDeg def
@@ -123,9 +125,14 @@
/arg thetaB ArmB direc mul add def % argument for 2nd point
% thetaB = direc = bow = HalfLength = theta = rho = arg = h = n =
mark rho thetaB PtoC rho arg PtoC /arg arg h 2 div add def
- n { w 0 gt { rhoo }{ rhoi } ifelse arg PtoC /w w neg def /arg arg h add def } repeat
+ n {
+ w 0 gt { rhoo }{ rhoi } ifelse
+ arg PtoC
+ /w w neg def
+ /arg arg h add def
+ } repeat
rho thetaB theta2 ArmA sub direc mul add PtoC rho thetaB theta2 direc mul add PtoC
- } def
+} def
%
end
% END pst-coil.pro
diff --git a/graphics/pstricks/contrib/pst-coil/latex/pst-coil.sty b/graphics/pstricks/contrib/pst-coil/latex/pst-coil.sty
index d5b0311532..1def1526c0 100644
--- a/graphics/pstricks/contrib/pst-coil/latex/pst-coil.sty
+++ b/graphics/pstricks/contrib/pst-coil/latex/pst-coil.sty
@@ -1,4 +1,4 @@
-%% $Id: pst-coil.sty 539 2011-07-12 08:22:33Z herbert $
+%% $Id: pst-coil.sty 930 2024-08-13 18:19:44Z herbert $
\RequirePackage{pstricks}
\ProvidesPackage{pst-coil}[2010/02/01 package wrapper for
pst-coil.tex (hv)]
diff --git a/graphics/pstricks/contrib/pst-coil/tex/pst-coil.tex b/graphics/pstricks/contrib/pst-coil/tex/pst-coil.tex
index cd15fa0537..0aff59732c 100644
--- a/graphics/pstricks/contrib/pst-coil/tex/pst-coil.tex
+++ b/graphics/pstricks/contrib/pst-coil/tex/pst-coil.tex
@@ -1,4 +1,4 @@
-%% $Id: pst-coil.tex 578 2011-09-18 17:18:46Z herbert $
+%% $Id: pst-coil.tex 930 2024-08-13 18:19:44Z herbert $
%% BEGIN pst-coil.tex
%%
%% Coils and zigzags with PSTricks
@@ -7,7 +7,7 @@
%%
%%
%% COPYRIGHT 1993, 1994, 1999 by Timothy Van Zandt, tvz@nwu.edu.
-%% 2006-2015 Herbert Voss, hvoss@tug.org
+%% 2006-2024 Herbert Voss, hvoss@tug.org
%%
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN
@@ -21,8 +21,8 @@
\ifx\PSTnodeLoaded\endinput \else\input pst-node.tex\fi
\ifx\PSTXKeyLoaded\endinput \else\input pst-xkey \fi
%
-\def\fileversion{1.07}
-\def\filedate{2015/05/13}
+\def\fileversion{1.08}
+\def\filedate{2024/08/13}
%
\edef\TheAtCode{\the\catcode`\@}
\catcode`\@=11
@@ -48,7 +48,15 @@
\let\psk@coilarmB\psk@coilarmA}
\define@key[psset]{pst-coil}{coilaspect}[45]{\pst@getangle{#1}\psk@coilaspect}
\define@key[psset]{pst-coil}{coilinc}[10]{\pst@getangle{#1}\psk@coilinc}
-%
+%%%%%% alternative macro
+\define@key[psset]{pst-coil}{N}[10]{\def\psk@NoOfSpirals{#1 }}
+\define@key[psset]{pst-coil}{R}[1]{\def\psk@InitialWidth{#1 }}% in cm
+\define@key[psset]{pst-coil}{l0}[10]{\def\psk@InitialLength{#1 }}
+\define@key[psset]{pst-coil}{alpha}[15]{\def\psk@coil@Alpha{#1 }}
+\define@key[psset]{pst-coil}{arm}[0]{\def\psk@coil@arm{#1 }}
+\define@key[psset]{pst-coil}{nS}[25]{\def\psk@coil@NoOfPointsPerCoil{#1 }}
+\psset[pst-coil]{N=10,R=0.5,alpha=15,arm=0,l0=5,nS=25}
+
\psset[pst-coil]{coilaspect=45,coilarm=.5cm,coilheight=1,coilwidth=1cm,coilinc=10}
%
\def\pscoil{\def\pst@par{}\pst@object{pscoil}}
@@ -198,7 +206,7 @@
{ \psk@function }
\tx@Sin
}%
- \showpointsfalse%
+ \showpointsfalse
\end@OpenObj}
%
\def\ncsin{\pst@object{ncsin}}
@@ -220,6 +228,49 @@
\def\pcsin{\def\pst@par{}\pst@object{pcsin}}
\def\pcsin@i{\pc@object\ncsin@ii}
%
+\def\psAltCoil{\def\pst@par{}\pst@object{psAltCoil}}
+\def\psAltCoil@i{\pst@getarrows\psAltCoil@ii}
+\def\psAltCoil@ii(#1){\@ifnextchar({\psAltCoil@iii{1}(#1)}{\psAltCoil@iii{\z@}(0,0)(#1)}}
+\def\psAltCoil@iii#1(#2)(#3){%
+ \begin@OpenObj
+ \pst@getcoor{#2}\pst@tempa
+ \pst@getcoor{#3}\pst@tempb
+ \addto@pscode{%
+ \pst@tempa \pst@tempb
+ /y1 ED /x1 ED /y0 ED /x0 ED
+ x0 y0 translate
+ y1 y0 sub x1 x0 sub 2 copy Pyth
+ /Longueur ED
+ Atan rotate
+ /NoOfSpirals \psk@NoOfSpirals def % nombre de spires
+ /Alpha \psk@coil@Alpha def
+ /R_0 \psk@InitialWidth \pst@number\psunit mul def
+ /arm \psk@coil@arm \pst@number\psunit mul def
+ /l_0 \psk@InitialLength \pst@number\psunit mul def
+ /nS \psk@coil@NoOfPointsPerCoil def
+ /Pas_0 l_0 NoOfSpirals div def
+ /Pas Longueur 2 arm mul sub NoOfSpirals div def
+ % longueur de l'hélice sur un tour
+ % = sqrt(4*pi^2*R^2+p^2)
+ /Longueur_Helice_pas 39.47842 R_0 dup mul mul Pas_0 dup mul add sqrt def
+ % R=1/(2*pi)*sqrt(L^2-p^2)
+ /Radius 0.1591549 Longueur_Helice_pas dup mul Pas dup mul sub sqrt mul def
+ /xH {Radius 360 t mul cos mul Radius sub} def
+ /yH {Radius 360 t mul sin mul} def
+ /zH {Pas t mul arm add} def
+ /Inc 1 NoOfSpirals nS mul div def % nS(50) points par spires
+ 1 setlinejoin
+ 1 0 0 0 ArrowA arm 0 lineto
+ 0 Inc NoOfSpirals {
+ /t ED
+ zH xH Alpha tan mul sub
+ yH
+ lineto
+ } for
+ Longueur 0
+ ArrowB lineto
+ }%
+ \end@OpenObj}
%
\catcode`\@=\TheAtCode\relax
\endinput
diff --git a/graphics/pstricks/contrib/pst-diffraction/Changes b/graphics/pstricks/contrib/pst-diffraction/Changes
index 9f4fe42b2b..d40c814ac7 100644
--- a/graphics/pstricks/contrib/pst-diffraction/Changes
+++ b/graphics/pstricks/contrib/pst-diffraction/Changes
@@ -1,4 +1,7 @@
pst-diffraction.tex --------
+2.06a 2024-07-15 - small fix in the documentation
+2.06 2024-07-10 - fix for missing contrast option for \psdiffractionCircular (Keno Wehr)
+2.05 2024-07-10 - removed unused optional argument gamma
2.04a 2024-06-29 - bugfix for the documentation header
- removed german and french docs
2.04 2010-01-05 - fix bug with missing \space for keywords
diff --git a/graphics/pstricks/contrib/pst-diffraction/README b/graphics/pstricks/contrib/pst-diffraction/README
index 86d7c0bb59..3d95ca6feb 100644
--- a/graphics/pstricks/contrib/pst-diffraction/README
+++ b/graphics/pstricks/contrib/pst-diffraction/README
@@ -1,7 +1,7 @@
%% Package `pst-diffraction.tex'
%%
-%% Manuel Luque (ml _at_ pstricks.de) (France)
-%% Herbert Voss (hv _at_ pstricks.de) (Germany)
+%% Manuel Luque (France)
+%% Herbert Voss (hvoss _at_ tug.org) (Germany)
%%
%% 2024-06-29
%%
@@ -19,24 +19,14 @@ Save the files
pst-diffraction.sty
pst-diffraction.tex
-pst-diffraction.pro
in any place, where latex or any other TeX program will find it.
-The pro file should go into $TEXMF$/dvips/pstricks/.
-
-pst-diffraction uses the extended version of the keyval package. So
-be sure that you
-- have installed xkeyval with the special pst-xkey
- (CTAN: tex-archive/macros/latex/contrib/xkeyval/)
-- do not load another package after pst-diffraction, which loads
- the old keyval.sty or pst-key.tex
You can run the documentation with
-make DE
-make E
-make FR
-or for all make all ;-) this will take a lot of time, because
+make
+
+or for all make all ;-) this may take some time, because
the images are very big.
If you like to get the documentation file in another format run
@@ -50,8 +40,7 @@ to get a PostScript file. But pay attention, that the pst-diffraction
files are saved in the above mentioned way, before you run
latex on the documentation file.
-The intermediate DVI file works only with viewers which can
-interprete the embedded PostScript code.
+Running the files with lualatex is possible, but may take a lot of
+time in fact of the heavy calculations.
-For another PDF output read the introduction from
-the documentation.
+hvoss@tug.org
diff --git a/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.bib b/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.bib
index 737b6dbba9..0d2ecefe77 100644
--- a/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.bib
+++ b/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.bib
@@ -1,45 +1,105 @@
-@STRING{dtk = {{D}ie {\TeX}nische {K}om{\"o}die} }
+@STRING{tugboat = {TUGboat} }
+@STRING{dtk = {Die {\TeX}nische Komödie} }
+@STRING{bretter = {Bretter, die die Welt bedeuten } }
+
+@Book{companion,
+ author = {Michel Goosens and Frank Mittelbach and Sebastian Rahtz and Dennis Roegel and Herbert Voß},
+ title = {The {\LaTeX} Graphics Companion},
+ publisher = {Lehmanns Media},
+ edition = {2},
+ date = {2022},
+ location = {Berlin},
+ note={Preprint of the english version, 2nd edition}
+}
+
+@Article{girou:01:,
+ author = {Denis Girou},
+ title = {Présentation de PSTricks},
+ journal = {Cahier {GUT}enberg},
+ year = 1994,
+ volume = {16},
+ month = apr,
+ pages = {21-70}
+}
+
+@Article{girou:02:,
+ author = {Timothy Van Zandt and Denis Girou},
+ title = {Inside {PST}ricks},
+ journal = TUGboat,
+ year = 1994,
+ volume = {15},
+ month = sep,
+ pages = {239-246}
+}
@Book{PostScript,
Author = {Kollock, Nikolai G.},
- Title = {PostScript richtig eingesetzt: vom Konzept zum
- praktischen Einsatz},
+ Title = {PostScript richtig eingesetzt: vom Konzept zum praktischen Einsatz},
Publisher = {IWT},
Address = {Vaterstetten},
year = 1989,
}
-@Manual{pstricks,
- Title = {PSTricks - {\PS} macros for Generic TeX},
- Author = {Timothy Van Zandt},
- Organization = {},
- Address = {\url{http://www.tug.org/application/PSTricks}},
- Note = {},
- year = 1993,
+@ctan{multido,
+title = {The Multido package},
+subtitle = {A loop facility for Generic TeX},
+author = {Van Zandt, Timothy and Voß, Herbert and Niepraschk, Rolf},
+url = {macros/latex/multido},
+urldate = {2018-09-01},
+version = {1.42}
}
-@Manual{pdftricks,
- Title = {PSTricks Support for pdf},
- Author = {Herbert Voss},
- Organization = {},
- Address = {\url{http://PSTricks.de/pdf/pdfoutput.phtml}},
- Note = {},
- year = 2002,
+@Book{PSTricks2,
+ author = {Herbert Voß},
+ title = {\texttt{PSTricks} -- {G}rafik f\"ur \TeX{} und \LaTeX},
+ edition = {7},
+ publisher = {DANTE {\eV} and Lehmanns Media},
+ date = {2016},
+ address = {Heidelberg and Hamburg}
}
-@Manual{miwi,
- Title = {References for \TeX{} and Friends},
- Author = {Michael Wiedmann and Peter Karp},
- Organization = {},
- Address = {\url{http://www.miwie.org/tex-refs/}},
- Note = {},
- year = 2003,
+@Book{PSTricksE,
+ author = {Herbert Voß},
+ title = {\texttt{PSTricks} -- Graphics and PostScript for \LaTeX},
+ edition = {1},
+ publisher = {UIT},
+ date = {2011},
+ address = {Cambridge -- UK}
+}
+
+@Book{LTXquick,
+ author = {Herbert Voß},
+ title = {{\LaTeX} quick reference},
+ edition = {1},
+ publisher = {UIT},
+ year = {2012},
+ address = {Cambridge -- UK}
+}
+
+@Book{presentations,
+ author = {Herbert Voß},
+ title = {Presentations with \LaTeX},
+ edition = {2},
+ publisher = {DANTE {\eV} and Lehmanns Media},
+ year = {2019},
+ address = {Heidelberg and Berlin}
}
+@Book{tbt,
+ author = {Victor Eijkhout},
+ title = {\TeX\ by Topic -- {A} \TeX{}nician Reference},
+ edition = {1},
+ publisher = {DANTE {\eV} and Lehmanns Media},
+ year = {2014},
+ address = {Heidelberg and Berlin}
+}
+
+
+
@Article{dtk02.1:voss:mathematischen,
- author = {Herbert Vo{\ss}},
+ author = {Herbert Voß},
title = {Die mathematischen {F}unktionen von {P}ostscript},
journal = dtk,
year = 2002,
@@ -49,7 +109,6 @@
month = mar,
pages = {40-47},
annote = bretter,
- keywords = {},
abstract = { \PS, faktisch genauso alt wie {\TeX}, ist im
Verh{\"a}ltnis dazu allgemein noch weniger bekannt, wenn es
darum geht zu beurteilen, was es denn nun im eigentlichen
@@ -61,31 +120,30 @@
gezeigt. }
}
-@Book{companion,
- author = {Michel Goosens and Frank Mittelbach and Sebastian Rahtz and Denis Roegel and Herbert Vo{\ss}},
- title = {The {\LaTeX} {G}raphics {C}ompanion},
- publisher = {{Addison-Wesley Publishing Company}},
- edition = 2,
- year = {2007},
- address = {Reading, Mass.}
+
+@Book{PostScript,
+ Author = {Kollock, Nikolai G.},
+ Title = {PostScript richtig eingesetzt: vom Konzept zum
+ praktischen Einsatz},
+ Publisher = {IWT},
+ Address = {Vaterstetten},
+ year = 1989,
}
-@Book{PSTricks2,
- author = {Herbert Vo\ss},
- title = {\texttt{PSTricks} -- {G}rafik f\"ur \TeX{} und \LaTeX},
- edition = {4.},
- publisher = {DANTE -- Lehmanns},
- year = {2007},
- address = {Heidelberg/Hamburg}
+@online{pstricks,
+ Title = {PSTricks - {\PS} macros for Generic TeX},
+ Author = {Timothy Van Zandt},
+ Organization = {},
+ url = {http://www.tug.org/application/PSTricks},
+ year = 1993,
}
-@Book{LaTeXRef,
- author = {Herbert Vo\ss},
- title = {\LaTeX\ Referenz},
- edition = {1.},
- publisher = {DANTE -- Lehmanns},
- year = {2007},
- address = {Heidelberg/Hamburg}
+
+@online{pdftricks,
+ Title = {PSTricks Support for pdf},
+ Author = {Herbert Voß},
+ url = {http://PSTricks.de/pdf/pdfoutput.phtml},
+ year = 2002,
}
@Book{diffraction,
@@ -107,12 +165,11 @@
publisher = {Society of {P}hoto {O}ptical}
}
-@Manual{Fresnel,
+@online{Fresnel,
Title = {Augustin Fresnel},
Author = {Manuel Luque},
Organization = {},
- Address = {\url{http://melusine.eu.org/syracuse/mluque/fresnel/augustin/fresnel.html}},
- Note = {},
+ url = {http://melusine.eu.org/syracuse/mluque/fresnel/augustin/fresnel.html},
year = 2004
}
diff --git a/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.pdf b/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.pdf
index 33256a5b76..d6e0b803ac 100644
--- a/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.pdf
+++ b/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.pdf
Binary files differ
diff --git a/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.tex b/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.tex
index f38f06f02e..382907d86c 100644
--- a/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.tex
+++ b/graphics/pstricks/contrib/pst-diffraction/doc/pst-diffraction-doc.tex
@@ -1,13 +1,16 @@
%% $Id: pst-diffraction-docE.tex 134 2009-09-27 12:28:50Z herbert $
-\documentclass[11pt,english,BCOR10mm,DIV12,bibliography=totoc,parskip=false,smallheadings,
- headexclude,footexclude,oneside]{pst-doc}
-\usepackage{pst-grad,pst-diffraction}
-\let\pstDiffractionFV\fileversion
+\documentclass[11pt,english,BCOR=10mm,DIV=12,bibliography=totoc,parskip=false,headings=small,
+ headinclude=false,footinclude=false,twoside,english]{pst-doc}
-\usepackage{libertinus}
+%\usepackage{libertinus}
\usepackage{biblatex}
\addbibresource{pst-diffraction-doc.bib}
+\usepackage{xurl,pst-grad,pst-diffraction}
+\let\pstDiffractionFV\fileversion
+
+
+
\lstset{pos=t,wide=true,language=PSTricks,
morekeywords={psdiffractionRectangle,psdiffractionCircle,psdiffractionCircular},basicstyle=\footnotesize\ttfamily}
\lstdefinestyle{syntax}{backgroundcolor=\color{blue!20},numbers=none,xleftmargin=0pt,xrightmargin=0pt,
@@ -16,6 +19,15 @@
frame=single}
\newcommand*\psp{\texttt{pspicture}\xspace}
%
+
+\renewcommand\bgImage{%
+\begin{pspicture}(-3.5,-3.5)(3.5,3.5)
+\psdiffractionCircular[f=10,showFunc=true]
+\end{pspicture}
+}
+
+\def\eV{e.\kern-1pt{}V\kern-1pt}
+
\begin{document}
\title{\texttt{pst-diffraction}}
@@ -24,21 +36,18 @@ apertures; v.\pstDiffractionFV}
\author{Manuel Luque \\ Herbert Vo\ss}
\docauthor{Herbert Voß}
\date{\today}
-\maketitle
+%\maketitle
+\settitle
\tableofcontents
-
-\clearpage
-
-\begin{abstract}
-\noindent
+\psset{unit=1cm}
\vfill\noindent
Thanks to: Julien Cubizolles,
Doris Wagner,
Timothy Van Zandt, Keno Wehr,
Michael Zedler.
-\end{abstract}
+
\section{Optical setup}
@@ -136,7 +145,7 @@ By default the settings are as follows:
\begin{tabular}{@{}lll@{}}
\Lkeyword{a}=0.2e-3 in m; & \Lkeyword{k}=1; & \Lkeyword{f}=5 in m;\\
-\Lkeyword{lambda}=650 in nm; & \Lkeyword{pixel}=0.5; & \Lkeyword{contrast}=38, greates value;\\
+\Lkeyword{lambda}=650 in nm; & \Lkeyword{pixel}=0.5; & \Lkeyword{contrast}=38, greatest value;\\
\Lkeyword{colorMode}=3; & \Lkeyword{IIID}=\false.
\end{tabular}
@@ -156,7 +165,7 @@ By default the settings are as follows:
\end{pspicture}
\hfill
\begin{pspicture}(-1.5,-2.5)(3.5,3.5)
-\psdiffractionRectangle[IIID,Alpha=30,f=2.5]
+\psdiffractionRectangle[IIID,Alpha=30,f=2.5]% for Alpha see package pst-3dplot
\end{pspicture}
\end{lstlisting}
@@ -200,6 +209,7 @@ By default the settings are as follows:
\hfill
\begin{pspicture}(-1.5,-2)(3.5,3)
\psdiffractionRectangle[IIID,Alpha=20,a=0.5e-3,k=2,f=10,lambda=515,colorMode=1]
+% % for Alpha see package pst-3dplot
\end{pspicture}
\end{lstlisting}
@@ -211,6 +221,7 @@ By default the settings are as follows:
\hfill
\begin{pspicture}(-3.5,-1)(3.5,4)
\psdiffractionRectangle[IIID,Alpha=10,a=0.5e-3,k=20,f=10,pixel=0.5,lambda=450]
+% % for Alpha see package pst-3dplot
\end{pspicture}
\begin{lstlisting}[style=example]
@@ -220,6 +231,7 @@ By default the settings are as follows:
\hfill
\begin{pspicture}(-3.5,-1)(3.5,4)
\psdiffractionRectangle[IIID,Alpha=10,a=0.5e-3,k=20,f=10,pixel=0.5,lambda=450]
+% % for Alpha see package pst-3dplot
\end{pspicture}
\end{lstlisting}
@@ -230,7 +242,7 @@ It is also possible to render the diffraction pattern of two congruent rectangle
by using the option \Lkeyword{twoSlit}.
By default this option is deactivated.
The distance of the two rectangles is specified by the option $s$.
-The default for $s$ is $12e^{-3}\,\mathrm{m}$.
+The default for $s$ is $12\cdot10^{-3}\,\mathrm{m}$.
\begin{center}
@@ -249,12 +261,14 @@ The default for $s$ is $12e^{-3}\,\mathrm{m}$.
\begin{center}
\begin{pspicture}(-2,-1)(4,4)
\psdiffractionRectangle[IIID,Alpha=20,a=0.5e-3,k=10,f=10,pixel=0.5,lambda=650,twoSlit,s=2e-3]
+% % for Alpha see package pst-3dplot
\end{pspicture}
\end{center}
\begin{lstlisting}[pos=t,style=example,wide=false]
\begin{pspicture}(-2,-1)(4,4)
\psdiffractionRectangle[IIID,Alpha=20,a=0.5e-3,k=10,f=10,pixel=0.5,lambda=650,twoSlit,s=2e-3]
+% % for Alpha see package pst-3dplot
\end{pspicture}
\end{lstlisting}
@@ -271,9 +285,9 @@ cropped if its height exceeds the margin of the environment \Lenv{pspicture*}).
\hspace*{-1cm}%
\begin{LTXexample}[pos=t,style=example,wide=false]
-\begin{pspicture}(-3.5,-3.5)(3.5,3.5)
+\begin{pspicture*}(-3.5,-3.5)(3.5,3.5)
\psdiffractionCircular[r=0.5e-3,f=10,pixel=0.5,lambda=520]
-\end{pspicture}
+\end{pspicture*}
%
\begin{pspicture}(-3.5,-1.5)(3.5,3.5)
\psdiffractionCircular[IIID,r=0.5e-3,f=10,pixel=0.5,lambda=520]
@@ -281,6 +295,20 @@ cropped if its height exceeds the margin of the environment \Lenv{pspicture*}).
\end{LTXexample}
+\begin{LTXexample}[pos=t,style=example,wide=false]
+\begin{pspicture}(-3.5,-3.5)(3.5,3.5)
+\psdiffractionCircular[f=10]
+\end{pspicture}
+\hfill
+\begin{pspicture}(-3.5,-3.5)(3.5,3.5)
+\psdiffractionCircular[f=10,showFunc=true]
+\end{pspicture}
+\end{LTXexample}
+
+
+
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Diffraction from two circular apertures}
Only the case of equal radii is provided, this common radius can be defined like in the
@@ -291,7 +319,7 @@ Furthermore one has to give the half distance of the circles measured from their
The rendering process could take some time in this case\dots
-\begin{pspicture}(-3,-3.5)(3.5,3.5)
+\begin{pspicture}(-3.5,-3.5)(4,3.5)
\psdiffractionCircular[r=0.5e-3,f=10,d=3e-3,lambda=515,twoHole]
\end{pspicture}
%
@@ -312,7 +340,7 @@ The rendering process could take some time in this case\dots
\hspace*{-1cm}%
-\begin{pspicture}(-3,-3)(3.5,4)
+\begin{pspicture}(-4,-3)(4,4)
\psdiffractionCircular[r=0.5e-3,f=10,d=2e-3,lambda=700,twoHole,colorMode=0]
\end{pspicture}
%
@@ -336,21 +364,22 @@ or $d=\frac{2r}{1.22}$ (see
\url{http://www.unice.fr/DeptPhys/optique/diff/trouscirc/diffrac.html}).
\hspace*{-1cm}%
-\begin{pspicture}(-3,-3.5)(3,3.5)
+\begin{pspicture}(-4,-3.5)(3,4.5)
\psdiffractionCircular[r=0.5e-3,f=10,d=4.1e-4,lambda=632,twoHole]
\end{pspicture}
%
-\begin{pspicture}(-3.5,-1.5)(3.5,3)
+\begin{pspicture}(-5,-2)(3.5,3)
\psdiffractionCircular[IIID,r=0.5e-3,f=10,d=4.1e-4,lambda=632,twoHole]
\end{pspicture}
+\bigskip
\begin{lstlisting}[style=example]
\begin{pspicture}(-3,-3.5)(3,3.5)
\psdiffractionCircular[r=0.5e-3,f=10,d=4.1e-4,lambda=632,twoHole]
\end{pspicture}
%
-\begin{pspicture}(-3.5,-1.5)(3.5,3)
+\begin{pspicture}(-5,-1.5)(3.5,3)
\psdiffractionCircular[IIID,r=0.5e-3,f=10,d=4.1e-4,lambda=632,twoHole]
\end{pspicture}
\end{lstlisting}
@@ -377,7 +406,7 @@ option \Lkeyword{colorMode}=0.
\makebox[\linewidth]{%
\begin{pspicture}(-3,-3)(3,2.5)
-\psdiffractionTriangle[f=10,h=1e-3,lambda=515,contrast=38]
+\psdiffractionTriangle[f=10,h=1e-3,lambda=515,contrast=18]
\end{pspicture}
\quad
\begin{pspicture}(-3,-3)(3,2.5)
@@ -391,7 +420,7 @@ option \Lkeyword{colorMode}=0.
\begin{lstlisting}[style=example]
\begin{pspicture}(-3,-3)(3,2.5)
-\psdiffractionTriangle[f=10,h=1e-3,lambda=515,contrast=38]
+\psdiffractionTriangle[f=10,h=1e-3,lambda=515,contrast=18]
\end{pspicture}
\quad
\begin{pspicture}(-3,-3)(3,2.5)
@@ -433,9 +462,8 @@ option \Lkeyword{colorMode}=0.
-\clearpage
-\section{List of all optional arguments for \texttt{pst-diff}}
-\Loption{pst-diff} is the short form for the keywords in the package \LPack{pst-diffraction}.
+\section{List of all optional arguments for \texttt{pst-diffraction}}
+%\Loption{pst-diff} is the short form for the keywords in the package \LPack{pst-diffraction}.
\xkvview{family=pst-diff,columns={key,type,default}}
@@ -444,7 +472,6 @@ option \Lkeyword{colorMode}=0.
\raggedright
\nocite{*}
\printbibliography
-%\bibliography{pst-diffraction-doc}
\printindex
diff --git a/graphics/pstricks/contrib/pst-diffraction/tex/pst-diffraction.tex b/graphics/pstricks/contrib/pst-diffraction/tex/pst-diffraction.tex
index 345fba99c4..2ff137b0a8 100644
--- a/graphics/pstricks/contrib/pst-diffraction/tex/pst-diffraction.tex
+++ b/graphics/pstricks/contrib/pst-diffraction/tex/pst-diffraction.tex
@@ -25,8 +25,8 @@
\ifx\PSTThreeDplotLoaded\endinput\else\input pst-3dplot.tex\fi
\ifx\PSTXKeyLoaded\endinput\else \input pst-xkey.tex \fi
%
-\def\fileversion{2.04a}
-\def\filedate{2024/06/29}
+\def\fileversion{2.06a}
+\def\filedate{2024/07/15}
\message{`PST-diffraction v\fileversion, \filedate\space (ML,hv)}%
\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
\pst@addfams{pst-diff}
@@ -40,7 +40,7 @@
\define@key[psset]{pst-diff}{s}{\def\psk@Diffraction@Slit@s{#1 }} % distance entre les fentes
\define@key[psset]{pst-diff}{lambda}{\pst@checknum{#1}\psk@Diffraction@Slit@Lambda }% en nm
\define@key[psset]{pst-diff}{f}{\pst@checknum{#1}\psk@Diffraction@Slit@F }% focus en m
-\define@key[psset]{pst-diff}{gamma}{\pst@checknum{#1}\psk@Diffraction@gamma@G }
+%\define@key[psset]{pst-diff}{gamma}{\pst@checknum{#1}\psk@Diffraction@gamma@G }
\define@key[psset]{pst-diff}{pixel}{\pst@checknum{#1}\psk@Diffraction@Slit@pixel }
\define@key[psset]{pst-diff}{colorMode}{\pst@getint{#1}\psk@Diffraction@colorMode }
% 0 black and white inverse
@@ -65,7 +65,8 @@
\psset[pst-diff]{a=0.2e-3,f=5,k=1,r=1e-3,
d=6e-3,s=12e-3,h=0.5e-3,
lambda=650,pixel=0.5,
- contrast=38,gamma=0.8,twoHole=false,twoSlit=false,colorMode=3, scale=1,
+ contrast=38,%gamma=0.8,
+ twoHole=false,twoSlit=false,colorMode=3, scale=1,
IIID=false, showFunc=false}
%
% load the pstricks-add.pro only, if not already done
@@ -82,7 +83,7 @@
/focus \psk@Diffraction@Slit@F def
/widthSlit \psk@Diffraction@Slit@A def
/heightSlit \psk@Diffraction@Slit@k widthSlit mul def
- /Gamma \psk@Diffraction@gamma@G def
+ %/Gamma \psk@Diffraction@gamma@G def
/pixel \psk@Diffraction@Slit@pixel def
/SlitSeparation \psk@Diffraction@Slit@s def
\psk@Diffraction@Slit@Lambda tx@addDict begin wavelengthToRGB Red Green Blue end
@@ -162,7 +163,7 @@
\addto@pscode{%
% les dimensions sont en mètres
/focus \psk@Diffraction@Slit@F def
- /Gamma \psk@Diffraction@gamma@G def
+ %/Gamma \psk@Diffraction@gamma@G def
/pixel \psk@Diffraction@Slit@pixel def
/contrast 1e\psk@Diffraction@Slit@contrast def
/r \psk@Diffraction@Circular@r def
@@ -253,7 +254,8 @@
/y { yPts 2845 div } bind def
/R { x dup mul y dup mul add sqrt } bind def % R en m
/m Coeff R mul def
- 1 1e38 m J1Card Facteur x mul cos dup mul mul neg exp sub
+ % 1 1e38 m J1Card Facteur x mul cos dup mul mul neg exp sub
+ 1 contrast m J1Card Facteur x mul cos dup mul mul neg exp sub % fix by Keno Wehr
dup /intensity ED
dup dup
Red mul 3 -1 roll
@@ -283,7 +285,7 @@
\ifPst@Diffraction@IIID \else
newpath
R_limite neg %1.5 mul
- cm dup moveto
+ cm dup moveto
R_limite 2 mul cm 0 rlineto
0 R_limite 2 mul cm rlineto
R_limite neg 2 mul cm 0 rlineto
@@ -294,7 +296,8 @@
R_limite -0.001 0 {
/Radius exch def
/m Coeff Radius 0.01 mul mul def
- 1 1e38 m J1Card neg exp sub
+% 1 1e38 m J1Card neg exp sub
+ 1 contrast m J1Card neg exp sub % fix by keno wehr
dup /intensity ED
dup dup
Red mul 3 -1 roll % R
@@ -396,7 +399,7 @@
% les dimensions sont en mètres
/f \psk@Diffraction@Slit@F def
/h \psk@Diffraction@Triangle@h def
- /Gamma \psk@Diffraction@gamma@G def
+ %/Gamma \psk@Diffraction@gamma@G def
/L { \psk@Diffraction@Slit@Lambda 1e-9 mul} bind def % longueur d'onde en m
/pixel \psk@Diffraction@Slit@pixel def
/k { TwoPi f L mul div } bind def
diff --git a/graphics/pstricks/contrib/pst-node/Changes b/graphics/pstricks/contrib/pst-node/Changes
index 25e9da74cc..6ef6294b36 100644
--- a/graphics/pstricks/contrib/pst-node/Changes
+++ b/graphics/pstricks/contrib/pst-node/Changes
@@ -1,4 +1,5 @@
----- pst-node.tex
+1.45 2024-07-10 - fix \algparnode (Erich Schmidt)
1.44 2024-07-04 - modified \psparnode and \algparnode (Erich Schmidt)
1.43 2022-10-31 - fix for lualatex and empty value in \psk@nrot
1.42a 2020-04-01 - fix typo in the documentation
@@ -57,12 +58,14 @@
----- pst-node.sty
+1.02 2024-07-10 - update package versions (hv)
1.01 2012-09-18 - update package versions (hv)
1.00 2011-06-05 - make ancient variant 97 available (hv)
2008-12-12 first version (hv)
----- pst-node.pro
+1.15a 2024-07-10 - typos
1.15 2014-01-27 - comment out empty lines
1.14 2012-09-18 - add subroutines for global dict
1.13 2011-11-21 - fix bug for xelatex and scaling
diff --git a/graphics/pstricks/contrib/pst-node/README b/graphics/pstricks/contrib/pst-node/README
index 8e820c8558..29b62ef30c 100644
--- a/graphics/pstricks/contrib/pst-node/README
+++ b/graphics/pstricks/contrib/pst-node/README
@@ -4,7 +4,7 @@ if these packages are new to your TeX distribution.
For more information see the documentation of your LaTeX distribution
on installing packages into your LaTeX distribution or the
TeX Frequently Asked Questions:
-(http://www.tex.ac.uk/cgi-bin/texfaq2html?label=instpackages).
+(https://texfaq.org/#installing).
pst-node needs pstricks, which should be part of your
local TeX installation, otherwise get it from a CTAN server, f.ex.
diff --git a/graphics/pstricks/contrib/pst-node/doc/pst-node-doc.pdf b/graphics/pstricks/contrib/pst-node/doc/pst-node-doc.pdf
index 5f6e785518..f8bebfdf1e 100644
--- a/graphics/pstricks/contrib/pst-node/doc/pst-node-doc.pdf
+++ b/graphics/pstricks/contrib/pst-node/doc/pst-node-doc.pdf
Binary files differ
diff --git a/graphics/pstricks/contrib/pst-node/doc/pst-node-doc.tex b/graphics/pstricks/contrib/pst-node/doc/pst-node-doc.tex
index 5b23189446..a4d0faa964 100644
--- a/graphics/pstricks/contrib/pst-node/doc/pst-node-doc.tex
+++ b/graphics/pstricks/contrib/pst-node/doc/pst-node-doc.tex
@@ -1,7 +1,8 @@
%\RequirePackage{pdfmanagement-testphase}
\DocumentMetadata{}
-%% $Id: pst-node-doc.tex 438 2022-01-31 17:45:26Z herbert $
-\documentclass[fontsize=11pt,english,BCOR=10mm,DIV=12,bibliography=totoc,parskip=false,headings=small,
+%% $Id: pst-node-doc.tex 920 2024-07-11 07:41:04Z herbert $
+\documentclass[fontsize=11pt,english,BCOR=10mm,DIV=12,bibliography=totoc,parskip=false,
+ headings=small,
headinclude=false,footinclude=false,oneside]{pst-doc}
\listfiles
@@ -1357,7 +1358,7 @@ Here is how I used \Lcs{nput} to mark an angle in a previous example:
\end{pspicture}
\end{LTXexample}
-\clearpage%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\clearpage%%%%%%%%%%%%%%%%%%%%%%%%%%
For the put macros there are several possibilities:
@@ -1412,7 +1413,7 @@ will produce the same effect as
\end{LTXexample}
-\clearpage%%%%%%%%%%%%%%%%%%%%%%%%%
+%\clearpage%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Normal behavior with rotation}
If there are a point $B$ of type node and a point $A$ of any type then
@@ -1590,7 +1591,7 @@ connections:
You can include the node connections inside the \Lcs{psmatrix}, in the last entry
and right before \Lcs{endpsmatrix}. One advantage to doing this is that
-\Lkeyset{shortput=tab} is the default within a \Lcs{psmatrix}.
+\Lkeyset{shortput=tab} is the default within a \Lcs{psmatrix}.\label{tab}
\begin{LTXexample}
$ \begin{psmatrix}
@@ -2507,7 +2508,12 @@ For example,
\end{verbatim}
If your expression in \texttt{t} is algebraic, you must specify the keyword \texttt{algebraic}, as in
- \Lcs{fnpnode}\verb|[algebraic]{0.5}{x*(x+1)/2}{P}|.
+
+
+\begin{verbatim}
+\fnpnode[algebraic]{0.5}{x*(x+1)/2}{P}
+\end{verbatim}
+
\begin{LTXexample}[width=.35\textwidth]
\begin{pspicture}[showgrid](-.5,-.5)(2.5,3)
@@ -2574,7 +2580,7 @@ turn a list of coordinates into a node sequence P0 P1 ...
\begin{LTXexample}[width=.35\textwidth]
\begin{pspicture}[showgrid,algebraic](-.5,-.5)(2.5,2)
\pnodes{B}(.1,.1)(1;10)(*2 {x^2/4})(0,1.4)
-%definesuP0..P3--now join them
+% defines P0..P3 -- now join them
\psnline[arrowscale=2]{-D>}(0,3){B}
\end{pspicture}
\end{LTXexample}
@@ -2635,7 +2641,7 @@ Conversion between any angle unit and radian unit
\begin{LTXexample}[width=.35\textwidth]
\begin{pspicture}[showgrid,algebraic](-.5,-.5)(2.5,2)
\pnodes{P}(.1,.1)(1;10)(*2 {x^2/4})(0,1.4)
-%defines P0..P3--now join them
+% defines P0..P3 -- now join them
\psncurve[arrowscale=2]{-D>}(0,3){P}
\end{pspicture}
\end{LTXexample}
@@ -2644,7 +2650,7 @@ Conversion between any angle unit and radian unit
\begin{LTXexample}[width=.35\textwidth]
\begin{pspicture}[showgrid,algebraic](-.5,-.5)(2.5,2)
\pnodes{P}(.1,.1)(1;10)(*2 {x^2/4})(0,1.4)
-%defines P0..P3--now join them
+% defines P0..P3 -- now join them
\psnccurve[arrowscale=2]{-D>}(0,3){P}
\end{pspicture}
\end{LTXexample}
@@ -2753,7 +2759,7 @@ line from \verb|<basept>+<nodexpr1>| to \verb|<basept>+<nodexpr2>|.
\curvepnode{2}{\pfn}{P}% sets P, Ptang
\normalvec(Ptang){Q}\uput[-45](P){P}
\psxline[linecolor=red]{<->}(P){-(Ptang)}{1.5(Ptang)}
-\psxline[linecolor=blue]{->}(P){}{.5(Q)}%can use } for {(0,0)}
+\psxline[linecolor=blue]{->}(P){}{.5(Q)}% can use {} for {(0,0)}
\end{pspicture}
\end{LTXexample}
\vspace{2pc}
diff --git a/graphics/pstricks/contrib/pst-node/dvips/pst-node.pro b/graphics/pstricks/contrib/pst-node/dvips/pst-node.pro
index b75ef89863..4c7ee95623 100644
--- a/graphics/pstricks/contrib/pst-node/dvips/pst-node.pro
+++ b/graphics/pstricks/contrib/pst-node/dvips/pst-node.pro
@@ -1,13 +1,13 @@
-% $Id: pst-node.pro 438 2022-01-31 17:45:26Z herbert $
+% $Id: pst-node.pro 919 2024-07-10 18:31:27Z herbert $
%%
%% PostScript prologue for pst-node.tex.
-%% Version 1.15, 2014/01/27.
+%% Version 1.15a, 2024/07/10.
%%
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN archives
%% in directory macros/latex/base/lppl.txt.
%
-%%%% EMPTY lines are not alowed!!! Problem with pst-eps -> \par
+%%%% EMPTY lines are not allowed!!! Problem with pst-eps -> \par
%
%
tx@Dict begin % from main pstricks dict
diff --git a/graphics/pstricks/contrib/pst-node/latex/pst-node.sty b/graphics/pstricks/contrib/pst-node/latex/pst-node.sty
index a7f494f031..4fe6a63aa2 100644
--- a/graphics/pstricks/contrib/pst-node/latex/pst-node.sty
+++ b/graphics/pstricks/contrib/pst-node/latex/pst-node.sty
@@ -1,10 +1,10 @@
-% $Id: pst-node.sty 438 2022-01-31 17:45:26Z herbert $
+% $Id: pst-node.sty 919 2024-07-10 18:31:27Z herbert $
%%
%% This is file `pst-node.sty'.
%%
%% IMPORTANT NOTICE:
%%
-%% pst-node.sty Copyright (C) 2004-2017 Herbert Voss <voss@perce.de>
+%% pst-node.sty Copyright (C) 2004-2024 Herbert Voss <voss@perce.de>
%% Rolf Niepraschk <Rolf.Niepraschk@ptb.de>
%%
%% This package may be distributed under the terms of the LaTeX Project
@@ -14,7 +14,7 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pst-node}
- [2012/09/18 v1.01 LaTeX wrapper for `pst-node' (HV)]
+ [2024/07/10 v1.02 LaTeX wrapper for `pst-node' (HV)]
%
\newif\ifpst@OldVersion\pst@OldVersionfalse
\DeclareOption{97}{\pst@OldVersiontrue}
@@ -32,13 +32,14 @@
\@addtofilelist{pst-node97.pro}}{}%
\else
\RequirePackage{pstricks}
-\ProvidesPackage{pst-node}[2010/04/22 package wrapper for pst-node.tex]
+\ProvidesPackage{pst-node}[2024/07/10 package wrapper for pst-node.tex]
\input{pst-node.tex}
\ProvidesFile{pst-node.tex}
[\filedate\space \fileversion\space `pst-node' (tvz,hv)]
\IfFileExists{pst-node.pro}{%
\ProvidesFile{pst-node.pro}
- [2014/01/27 v. 1.15, PostScript prologue file (hv)]
+ [2024/07/10 v. 1.15a, PostScript prologue file (hv)]
\@addtofilelist{pst-node.pro}}{}%
\fi
+
\endinput
diff --git a/graphics/pstricks/contrib/pst-node/tex/pst-node.tex b/graphics/pstricks/contrib/pst-node/tex/pst-node.tex
index 8e618ef220..a653d76eea 100644
--- a/graphics/pstricks/contrib/pst-node/tex/pst-node.tex
+++ b/graphics/pstricks/contrib/pst-node/tex/pst-node.tex
@@ -1,4 +1,4 @@
-% $Id: pst-node.tex 654 2022-11-21 06:19:14Z herbert $
+% $Id: pst-node.tex 918 2024-07-10 17:41:55Z herbert $
%%
%% BEGIN pst-node.tex
%%
@@ -18,8 +18,8 @@
\ifx\PSTricksLoaded\endinput\else\input pstricks.tex \fi\relax
\ifx\PSTXKeyLoaded\endinput\else \input pst-xkey \fi
%
-\def\fileversion{1.44}
-\def\filedate{2024/07/04}
+\def\fileversion{1.45}
+\def\filedate{2024/07/10}
\message{ v\fileversion, \filedate}
%
\edef\TheAtCode{\the\catcode`\@}
@@ -1386,8 +1386,8 @@ tx@NodeDict \pst@tempg known
/dy YB YA sub def
/angle dy dx Atan def
/linelength \pst@number\pst@dimb \pst@number\psunit div def
- XA linelength angle cos mul add YA linelength angle sin mul add ){#4}%
-}
+ XA linelength angle cos mul add YA linelength angle sin mul add ){#4}}
+%
\def\psRelNode{\pst@object{psRelNode}}
\def\psRelNode@i(#1)(#2)#3#4{{% A - B - factor - node name
\use@par
@@ -1537,8 +1537,7 @@ tx@NodeDict \pst@tempg known
\def\trim@ #1{\trim@@ @#1 @ #1 @ @@}%
\def\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}%
\def\unbrace#1{#1}%
-\unbrace{\def\trim@@@ #1 } #2@#3{\expandafter\def%
- \expandafter #3\expandafter {#1}}%
+\unbrace{\def\trim@@@ #1 } #2@#3{\expandafter\def\expandafter #3\expandafter {#1}}%
%
\def\hasparen#1(#2\@nil{%check if expression contains a (--call with \hasparen#1(\@nil
\ifx\relax#2\relax \@parenfalse \else \@parentrue\fi}%
@@ -1577,24 +1576,28 @@ tx@NodeDict \pst@tempg known
\expandafter\testAlg\my@tempA|\@nil\my@next {#1}{#2}{#3}}
%
\def\psparnode#1#2#3{%
-% #1=t value, #2=x(t) y(t) in PS form,#3=node name,
- \pnode(! /t #1 def #2){#3}%
- \pnode(! /t #1 dup abs 1 lt {0.001 sub}{dup 0 gt {0.999} {1.001} ifelse mul} ifelse def
- #2
- /t #1 dup abs 1 lt {0.001 add}{dup 0 lt {0.999} {1.001} ifelse mul} ifelse def
- #2 3 -1 roll sub 3 1 roll exch sub 2 copy exch dup mul exch dup mul add sqrt
- dup 3 1 roll div 3 1 roll div){#3tang}% unit tangent vector at t
-}%
-
+ % #1=t value, #2=x(t) y(t) in PS form, #3=node name,
+ % also returns unit tangent vector at t with node #3tang
+ \pnode(! /t #1 def #2){#3}%
+ \pnode(! /t #1 dup abs 1 lt {0.001 sub} {dup 0 gt {0.999} {1.001} ifelse mul} ifelse def
+ #2
+ /t #1 dup abs 1 lt {0.001 add} {dup 0 lt {0.999} {1.001} ifelse mul} ifelse def
+ #2
+ 3 -1 roll sub 3 1 roll exch sub 2 copy exch dup mul exch dup mul add sqrt
+ dup 3 1 roll div 3 1 roll div){#3tang}% unit tangent vector at t
+}%
+%
\def\algparnode#1#2#3{%
-% #1=t value, #2=x(t) | y(t) in alg form,#3=node name,
- \pstVerb{tx@Dict begin /Func (#2) AlgParser cvx def end }
- \pnode(!/t #1 def Func){#3}
- \pnode(!/t #1 .001 sub def
- Func
- /t #1 dup abs 1 lt {0.001 add}{dup 0 lt {0.999} {1.001} ifelse mul } ifelse def
- Func 3 -1 roll sub 3 1 roll exch sub 2 copy exch dup mul exch dup mul add sqrt
- dup 3 1 roll div 3 1 roll div){#3tang}% unit tangent vector at t
+% #1=t value, #2=x(t) | y(t) in alg form, #3=node name,
+% also returns unit tangent vector at t with node #3tang
+ \pstVerb{tx@Dict begin /Func (#2) AlgParser cvx def end }%
+ \pnode(! /t #1 def Func){#3}%
+ \pnode(! /t #1 dup abs 1 lt {0.001 sub} {dup 0 gt {0.999} {1.001} ifelse mul} ifelse def
+ Func
+ /t #1 dup abs 1 lt {0.001 add}{dup 0 lt {0.999} {1.001} ifelse mul } ifelse def
+ Func
+ 3 -1 roll sub 3 1 roll exch sub 2 copy exch dup mul exch dup mul add sqrt
+ dup 3 1 roll div 3 1 roll div){#3tang}% unit tangent vector at t
}%
%
\def\nodex#1{%
@@ -1635,8 +1638,7 @@ tx@NodeDict \pst@tempg known
\nodexn{#3}{@TMP@a}%
\AplusB(#1)(@TMP@a){@TMP@B}%
\psline(@TMP@A)(@TMP@B)%
-}%
-\ignorespaces}%
+}\ignorespaces}%
%
\def\curvepnodes{\pst@object{curvepnodes}}
\def\curvepnodes@i#1#2#3#4{{%optional [plotpoints=xx]
@@ -1686,7 +1688,7 @@ tx@NodeDict \pst@tempg known
\else
\multido{\i=0+1}{\pst@cntc}{\pnode(!/x \pst@number\pst@dima\space def x #3){#4\i}%
\advance\pst@dima \pst@dimb}%
-\fi%
+\fi
\expandafter\xdef \csname \PST@root nodecount\endcsname {\the\pst@cnta}%
\ifnum\Pst@Debug>0 \typeout{Created nodes #40 .. #4\the\pst@cnta}\fi%
}\ignorespaces}%
diff --git a/graphics/pstricks/contrib/pst-optic/Changes b/graphics/pstricks/contrib/pst-optic/Changes
index e51864d848..f5d28372a2 100644
--- a/graphics/pstricks/contrib/pst-optic/Changes
+++ b/graphics/pstricks/contrib/pst-optic/Changes
@@ -1,4 +1,5 @@
---- pst-optic.tex
+1.05 2024-10-28 - added individueal color setting for the focal, center amd parallel beam
1.04 2024-06-02 - small fixes to code and documentation
1.03 2024-05-17 - small fixes to code and documentation
1.02a 2023-05-07 - fix documentation for \psRefractionRay
diff --git a/graphics/pstricks/contrib/pst-optic/README b/graphics/pstricks/contrib/pst-optic/README
index 0f33952022..2fe9d76fc7 100644
--- a/graphics/pstricks/contrib/pst-optic/README
+++ b/graphics/pstricks/contrib/pst-optic/README
@@ -3,7 +3,7 @@
%% Manuel Luque <Mluque5130@aol.com> (France)
%% Herbert Voss <hvoss@tug.org> (Germany)
%%
-%% 2024-06-02
+%% 2024-10-28
%%
Save the files
@@ -21,6 +21,5 @@ dvips pst-optic-doc.dvi
to get a PostScript file. But pay attention, that the pst-optic
files are saved in the above mentioned way, before you run
-latex on the documentation file. Or simply use lualatex to get
-directly the pdf.
+latex on the documentation file.
diff --git a/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.bib b/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.bib
index 6eea964780..d906cfcd47 100644
--- a/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.bib
+++ b/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.bib
@@ -105,7 +105,6 @@
altnumber = 14,
month = mar,
pages = {40--47},
- annote = bretter,
abstract = { \PS, faktisch genauso alt wie {\TeX}, ist im
Verh{\"a}ltnis dazu allgemein noch weniger bekannt, wenn es
darum geht zu beurteilen, was es denn nun im eigentlichen
diff --git a/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.pdf b/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.pdf
index 182863a16e..4a4002f476 100644
--- a/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.pdf
+++ b/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.pdf
Binary files differ
diff --git a/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.tex b/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.tex
index 5ec11a0297..2af432ab37 100644
--- a/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.tex
+++ b/graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.tex
@@ -1,4 +1,4 @@
-%% $Id: pst-optic-doc.tex 903 2024-06-02 06:16:43Z herbert $
+%% $Id: pst-optic-doc.tex 1019 2024-10-28 07:59:50Z herbert $
\DocumentMetadata{}
\documentclass[11pt,english,bibliography=totoc,parskip=false,headings=small,
@@ -69,7 +69,7 @@ Table~\ref{tab:defaultLens} and \ref{tab:defaultSpiegel}.
Node A as string & \Lkeyword{nameA} & A\\
Angle A in degrees & \Lkeyword{spotA} & 270\\
Node B as string & \Lkeyword{nameB} & B\\
- Angle B in degrees & \Lkeyword{spotB} & 270\\
+ Angle B in degrees & \Lkeyword{spotB} & 90\\
Node F as string & \Lkeyword{nameF} & F\\
Angle F in degrees & \Lkeyword{spotF} & 270\\
Node O as string & \Lkeyword{nameO} & O\\
@@ -144,7 +144,21 @@ There are macros for the convergent and divergent lens
% \fill[fillstyle=solid,fillcolor=BleuVerre]
-The predefined options for \Lcs{lens} are \texttt{xLeft=-7.5, xRight=7.5, yBottom=-3, yTop=3}.
+The predefined options for \Lcs{lens} are \texttt{xLeft=-7.5, xRight=7.5,
+yBottom=-3, yTop=3}. The default color for the rays is red, which can be changed
+with the key \Lkeyword{raycolor}. An individual color setting is possible
+for the focal, center, and parallel ray with the keywords:
+\Lkeyword{parallelrayColor},
+\Lkeyword{focalrayColor},
+and \Lkeyword{centerrayColor}
+
+
+\begin{LTXexample}
+\begin{pspicture*}(-5,-3)(5,3)
+\rput(0,0){\lens[lensType=DVG, parallelrayColor=blue, focalrayColor=red!80!blue!30,
+ centerrayColor=green, lensScale=1,focus=1,OA=-3,lensGlass,lensWidth=0.5]}
+\end{pspicture*}
+\end{LTXexample}
\subsection{Short forms}
@@ -230,7 +244,8 @@ Using \Lcs{lens}\OptArg{\Lkeyword{lensType}=\ldots} gives the in figures \ref{fi
\caption{Available options for lenses with the defaults}\label{tab:defaultLens}
\begin{tabular}{@{} l l l @{}}
\emph{Option} & \emph{Name} & \emph{Default}\\\hline
- Lense type (\Lkeyval{CVG}|\Lkeyval{DVG}|\Lkeyval{PCVG}|\Lkeyval{PDVG}) & \Lkeyword{lensType} & \Lkeyval{CVG}\\
+ Lense type (\Lkeyval{CVG}|\Lkeyval{DVG}|\Lkeyval{PCVG}|\Lkeyval{PDVG})
+ & \Lkeyword{lensType} & \Lkeyval{CVG}\\
Lense height in cm & \Lkeyword{lensHeight} & 5cm\\
Lense width in cm & \Lkeyword{lensWidth} & 0.5cm\footnotemark\\
vertical scale (obsolet) & \Lkeyword{lensScale} & 1\\
@@ -244,7 +259,8 @@ Using \Lcs{lens}\OptArg{\Lkeyword{lensType}=\ldots} gives the in figures \ref{fi
Arrow length in cm & \Lkeyword{lensArrowSize}${}^2$ & 0.2\\
Arrow inset in cm & \Lkeyword{lensArrowInset}${}^2$ & 0.5\\
\end{tabular}
-\footnotetext{\textsuperscript{1} only for \Lkeyset{lensGlass=true}, otherwise set to \texttt{2\textbackslash pslinewidth}}
+\footnotetext{\textsuperscript{1} only for \Lkeyset{lensGlass=true},
+otherwise set to \texttt{2\textbackslash pslinewidth}}
\footnotetext{\textsuperscript{2} only for \Lkeyset{lensGlass=false}}
\end{minipage}
\end{table}
diff --git a/graphics/pstricks/contrib/pst-optic/tex/pst-optic.tex b/graphics/pstricks/contrib/pst-optic/tex/pst-optic.tex
index 0c06f849b3..c60869c4b4 100644
--- a/graphics/pstricks/contrib/pst-optic/tex/pst-optic.tex
+++ b/graphics/pstricks/contrib/pst-optic/tex/pst-optic.tex
@@ -1,4 +1,4 @@
-%%%% $Id: pst-optic.tex 903 2024-06-02 06:16:43Z herbert $
+%%%% $Id: pst-optic.tex 1019 2024-10-28 07:59:50Z herbert $
%% This is file `pst-optic.tex',
%%
%% IMPORTANT NOTICE:
@@ -8,8 +8,6 @@
%% Manuel Luque <Mluque5130@aol.com> (France)
%% Herbert Voss <hvoss@tug.org> (Germany)
%%
-%% 2024-06-02
-%%
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN archives
%% in directory macros/latex/base/lppl.txt.
@@ -30,8 +28,8 @@
\ifx\PSTMultidoLoaded\endinput\else\input multido.tex\fi
\ifx\PSTXKeyLoaded\endinput\else \input pst-xkey\fi
%
-\def\fileversion{1.04}
-\def\filedate{2024/06/02}
+\def\fileversion{1.05}
+\def\filedate{2024/10/28}
\message{`PST-Optic' v\fileversion, \filedate\space (Manuel Luque and Herbert Voss)}
%
\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
@@ -169,14 +167,27 @@
\definecolor{BleuVerre}{cmyk}{0.2,0,0,0}
\definecolor{JauneVert}{cmyk}{0.3,0,1,0}
\newpsstyle{rayuresJaunes}{fillstyle=hlines,hatchsep=2\pslinewidth,hatchcolor=JauneVert}
-\define@key[psset]{pst-optic}{rayColor}[red]{\pst@getcolor{#1}\psk@optic@rayColor}
+
+\define@key[psset]{pst-optic}{rayColor}[red]{%
+ \pst@getcolor{#1}\psk@optic@rayColor
+ \pst@getcolor{#1}\psk@optic@parallelrayColor
+ \def\psk@optic@paralleltipcolor{#1}%
+ \pst@getcolor{#1}\psk@optic@focalrayColor
+ \def\psk@optic@focaltipcolor{#1}%
+ \pst@getcolor{#1}\psk@optic@centerrayColor
+ \def\psk@optic@centertipcolor{#1}%
+}
+\define@key[psset]{pst-optic}{parallelrayColor}[red]{\pst@getcolor{#1}\psk@optic@parallelrayColor}
+\define@key[psset]{pst-optic}{focalrayColor}[red]{\pst@getcolor{#1}\psk@optic@focalrayColor}
+\define@key[psset]{pst-optic}{centerrayColor}[red]{\pst@getcolor{#1}\psk@optic@centerrayColor}
+
\psset[pst-optic]{rayColor=red}
\define@key[psset]{pst-optic}{rayWidth}[1.5\pslinewidth]{\def\psk@optic@rayWidth{#1}}
\psset[pst-optic]{rayWidth=1.5\pslinewidth}
%
\newpsstyle{opticalAxis}{linewidth=0.5pt,linecolor=black,linestyle=solid}
%
-%
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Utility stuff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -491,7 +502,7 @@
\uput[-90](Center'){Center'}
\psdots(Center)
\uput[-90](Center){Center}
- \psset{linecolor=\psk@optic@rayColor}
+ \psset{linecolor=\psk@optic@rayColor} %%%%%%%%%%%%%%%%%%%%%%
\psline[linewidth=1.5\pslinewidth,arrowinset=0]{->}(A)(B)
\ifx\psk@optic@lensType\lensTypeCVG
% the parallel ray
@@ -682,18 +693,21 @@
% dessin de l'image
\psline[linewidth=1.5\pslinewidth,arrowinset=0,linestyle=dashed]{->}(A')(B')
%dessin des rayons
- \psset{linecolor=\psk@optic@rayColor}
- \Arrows[length=16,arrows=-](B)(O)
- \Arrows(B)(I)
- \psline(B)(I)
- \psOutLine[arrows=->,length=1](B')(I){END1}
- \psOutLine[length=5](B')(I){END2}
- \psline[linestyle=dashed](F')(I)
- \Arrows[arrows=->>](B)(I')
- \psline(B)(I')
- \psOutLine[arrows=->>,length=2](B')(I'){END3}
- \psOutLine[length=10](B')(I'){END4}
- \psline[linestyle=dashed](B')(I')
+%% \psset{linecolor=\psk@optic@rayColor}
+ %% center beam
+ \Arrows[linecolor=\psk@optic@centerrayColor,length=16,arrows=-](B)(O)
+ %% parallel beam
+ \Arrows[linecolor=\psk@optic@parallelrayColor](B)(I)
+ \psline[linecolor=\psk@optic@parallelrayColor](B)(I)
+ \psOutLine[linecolor=\psk@optic@parallelrayColor,arrows=->,length=1](B')(I){END1}
+ \psOutLine[linecolor=\psk@optic@parallelrayColor,length=5](B')(I){END2}
+ \psline[linecolor=\psk@optic@parallelrayColor,linestyle=dashed](F')(I)
+ %% focal beam
+ \Arrows[linecolor=\psk@optic@focalrayColor,arrows=->>](B)(I')
+ \psline[linecolor=\psk@optic@focalrayColor](B)(I')
+ \psOutLine[linecolor=\psk@optic@focalrayColor,arrows=->>,length=2](B')(I'){END3}
+ \psOutLine[linecolor=\psk@optic@focalrayColor,length=10](B')(I'){END4}
+ \psline[linecolor=\psk@optic@focalrayColor,linestyle=dashed](B')(I')
%\uput[45](I'){I'}
%\uput[45](I){I}
\uput[\psk@optic@spotA](A){$\mathrm{\psk@optic@nameA}$}%
@@ -713,17 +727,22 @@
% dessin de l'image
\psline[linewidth=1.5\pslinewidth,arrowinset=0]{->}(A')(B')
%dessin des rayons
- \psset{linecolor=\psk@optic@rayColor}
- \pcline(B)(B')
- \Arrows[length=16,arrows=-](B)(O)
- \Arrows(B)(I)
- \psline(B)(I)
- \Arrows[length=10,posStart=0,arrows=-](I)(F')
- \Arrows[posStart=1,arrows=->](I)(F')
- \Arrows[arrows=->>](B)(I')
- \psline(B)(I')(B')
- \Arrows[length=10,arrows=-](I')(B')
- \Arrows[length=2,posStart=0.5,arrows=->>](I')(B')
+% \psset{linecolor=\psk@optic@rayColor}%% No global setting
+ %% Center beam
+ \pcline[linecolor=\psk@optic@centerrayColor](B)(B')%%CMittelpunktsstrahl
+ \Arrows[linecolor=\psk@optic@centerrayColor,length=16,arrows=-](B)(O)
+ \Arrows[linecolor=\psk@optic@centerrayColor](B)(I)
+ %% parallel beam
+ \psline[linecolor=\psk@optic@parallelrayColor,tipcolor=\psk@optic@paralleltipcolor](B)(I)
+ \Arrows[linecolor=\psk@optic@parallelrayColor](B)(I)
+ \Arrows[linecolor=\psk@optic@parallelrayColor,length=10,posStart=0,arrows=-](I)(F')
+ \Arrows[linecolor=\psk@optic@parallelrayColor,posStart=1,arrows=->](I)(F')
+ %% focal beam
+ \psline[linecolor=\psk@optic@focalrayColor](B)(I')(B')
+ \Arrows[linecolor=\psk@optic@focalrayColor,arrows=->>](B)(I')
+ \Arrows[linecolor=\psk@optic@focalrayColor,length=10,arrows=-](I')(B')
+ \Arrows[linecolor=\psk@optic@focalrayColor,length=2,posStart=0.5,
+ arrows=->>,tipcolor=\psk@optic@focaltipcolor](I')(B')
%\uput[-45](I'){I'}
%\uput[45](I){I}
\uput[\psk@optic@spotA](A){$\mathrm{\psk@optic@nameA}$}
@@ -736,7 +755,8 @@
%Lentille convergente : CVG
%(#2) est l'abscisse du centre optique
\def\lens{\@ifnextchar[{\pst@lens}{\pst@lens[]}}
-\def\pst@lens[#1]{{%
+\def\pst@lens[#1]{%
+ \begingroup
\psset[pst-optic,pstricks]{xLeft=-7.5,xRight=7.5,yBottom=-3,yTop=3,#1}%
% \psset[pst-optic,pstricks]{#1}%
\pst@killglue%
@@ -771,7 +791,7 @@
\pnode(! \psk@optic@xRight\space A'B' YO add){I1}
\pnode(! \psk@optic@xRight\space neg A'B' YO add){I2}
\else%
- \pnode(!%
+ \pnode(!
/OF' \psk@optic@focus\space def
/AB \psk@optic@AB\space def
/OA \psk@optic@OA\space def
@@ -812,7 +832,8 @@
\psset{arrows=<->}%
\fi\fi
\psline[linecolor=\psk@optic@lensColor,
- linewidth=\psk@optic@lensWidth,arrowsize=\psk@optic@lensArrowSize,
+ linewidth=2\pslinewidth, %\psk@optic@lensWidth,
+ arrowsize=\psk@optic@lensArrowSize,
arrowinset=\psk@optic@lensArrowInset]%
(! XO -0.5 \psk@optic@lensHeight\space mul
\psk@optic@lensScale\space mul YO add)%
@@ -829,7 +850,8 @@
\pst@drawCVGRays\fi\fi
\fi
\end{pspicture*}%
-}\ignorespaces}
+ \endgroup
+ \ignorespaces}
%
% 25 december 2002 Herbert <voss@perce.de>
% make the lenses dynamical to width _and_ height
@@ -1243,7 +1265,9 @@
\uput[-45](B'){B'}
\fi
\end{pspicture}%
-}\ignorespaces}
+ }%
+ \ignorespaces
+}
%
%
\def\mirrorDVG{\@ifnextchar[{% Herbert Voss 2003/01/05
@@ -1640,12 +1664,12 @@
\pst@getcoor{#8}\pst@tempp
\def\pst@optic@cIn{#6} % refraction number 1
\def\pst@optic@cOut{#7} % refraction number 2
- \pnode(!%
- /YA \pst@tempA exch pop \pst@number\psyunit div def
+ \pnode(!
+ /YA \pst@tempA exch pop \pst@number\psyunit div def
/XA \pst@tempA pop \pst@number\psxunit div def
/YB \pst@tempB exch pop \pst@number\psyunit div def
/XB \pst@tempB pop \pst@number\psxunit div def
- /YC \pst@tempc exch pop \pst@number\psyunit div def
+ /YC \pst@tempc exch pop \pst@number\psyunit div def
/XC \pst@tempc pop \pst@number\psxunit div def
/YD \pst@tempd exch pop \pst@number\psyunit div def
/XD \pst@tempd pop \pst@number\psxunit div def
@@ -1656,8 +1680,11 @@
/dY2 YD YC sub def
/dX2 XD XC sub def
% the gradient of the material (if negativ then it must be the nominator)
- /Gamma dY2 dX2 mul 0 lt {dY2 abs neg dX2 abs}{dY2 dX2} ifelse atan def
-% the perpendicular line is: 90°-Gamma
+% if = 0 then substract 180°
+ /Gamma dY2 dX2 mul 0 ge {dY2 dX2}{dY2 abs neg dX2 abs} ifelse atan
+ %dup 0 eq { 180 sub } if
+ def
+% the perpendicular line is: 90°-Gamma
/GammaStrich 90 Gamma sub def
% the angle of the incoming ray
/AlphaStrich dY1 dX1 atan def
@@ -1667,7 +1694,7 @@
% the law of Snell: sin(Alpha)/sin(Beta) = n2/n1
% sin(Beta)>1 is a total reflection instead of a refraction
/sinBeta \pst@optic@cIn\space \pst@optic@cOut\space div Alpha sin mul def
- sinBeta abs 1 le{
+ sinBeta abs 1 le {
/Root 1 sinBeta dup mul sub Sqrt def
/Beta sinBeta Root atan def
}{
@@ -1677,7 +1704,7 @@
/BetaStrich 90 Gamma sub Beta add def
% Determine the intermediate point
XP BetaStrich cos sub
- YP BetaStrich sin add ){#8'}%
+ YP BetaStrich sin add ){#8'}
%\qdisk(#8){5pt}
}\ignorespaces}
%
diff --git a/graphics/tpic2pdftex/Makefile.in b/graphics/tpic2pdftex/Makefile.in
index 3ee8644210..35ec5ed91b 100644
--- a/graphics/tpic2pdftex/Makefile.in
+++ b/graphics/tpic2pdftex/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# Makefile.in generated by automake 1.17 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+# Copyright (C) 1994-2024 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -70,6 +70,8 @@ am__make_running_with_option = \
test $$has_opt = yes
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+am__rm_f = rm -f $(am__rm_f_notfound)
+am__rm_rf = rm -rf $(am__rm_f_notfound)
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -123,10 +125,9 @@ am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
+ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \
}
am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
SCRIPTS = $(bin_SCRIPTS)
@@ -261,6 +262,7 @@ am__sh_e_setup = case $$- in *e*) set +e;; esac
# Default flags passed to test drivers.
am__common_driver_flags = \
--color-tests "$$am__color_tests" \
+ $$am__collect_skipped_logs \
--enable-hard-errors "$$am__enable_hard_errors" \
--expect-failure "$$am__expect_failure"
# To be inserted before the command running the test. Creates the
@@ -285,6 +287,11 @@ if test -f "./$$f"; then dir=./; \
elif test -f "$$f"; then dir=; \
else dir="$(srcdir)/"; fi; \
tst=$$dir$$f; log='$@'; \
+if test -n '$(IGNORE_SKIPPED_LOGS)'; then \
+ am__collect_skipped_logs='--collect-skipped-logs no'; \
+else \
+ am__collect_skipped_logs=''; \
+fi; \
if test -n '$(DISABLE_HARD_ERRORS)'; then \
am__enable_hard_errors=no; \
else \
@@ -345,20 +352,22 @@ distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
am__remove_distdir = \
if test -d "$(distdir)"; then \
- find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
- && rm -rf "$(distdir)" \
+ find "$(distdir)" -type d ! -perm -700 -exec chmod u+rwx {} ';' \
+ ; rm -rf "$(distdir)" \
|| { sleep 5 && rm -rf "$(distdir)"; }; \
else :; fi
am__post_remove_distdir = $(am__remove_distdir)
DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
+GZIP_ENV = -9
DIST_TARGETS = dist-gzip
# Exists only to be overridden by the user if desired.
AM_DISTCHECK_DVI_TARGET = dvi
distuninstallcheck_listfiles = find . -type f -print
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
-distcleancheck_listfiles = find . -type f -print
+distcleancheck_listfiles = \
+ find . \( -type f -a \! \
+ \( -name .nfs* -o -name .smb* -o -name .__afs* \) \) -print
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -414,8 +423,10 @@ ac_ct_CC = @ac_ct_CC@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
+am__rm_f_notfound = @am__rm_f_notfound@
am__tar = @am__tar@
am__untar = @am__untar@
+am__xargs_n = @am__xargs_n@
bindir = @bindir@
build_alias = @build_alias@
builddir = @builddir@
@@ -594,7 +605,6 @@ cscope cscopelist:
am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
am--force-recheck:
@:
-
$(TEST_SUITE_LOG): $(TEST_LOGS)
@$(am__set_TESTS_bases); \
am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
@@ -670,10 +680,37 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
result_count $$1 "XPASS:" $$xpass "$$red"; \
result_count $$1 "ERROR:" $$error "$$mgn"; \
}; \
+ output_system_information () \
+ { \
+ echo; \
+ { uname -a | $(AWK) '{ \
+ printf "System information (uname -a):"; \
+ for (i = 1; i < NF; ++i) \
+ { \
+ if (i != 2) \
+ printf " %s", $$i; \
+ } \
+ printf "\n"; \
+}'; } 2>&1; \
+ if test -r /etc/os-release; then \
+ echo "Distribution information (/etc/os-release):"; \
+ sed 8q /etc/os-release; \
+ elif test -r /etc/issue; then \
+ echo "Distribution information (/etc/issue):"; \
+ cat /etc/issue; \
+ fi; \
+ }; \
+ please_report () \
+ { \
+echo "Some test(s) failed. Please report this to $(PACKAGE_BUGREPORT),"; \
+echo "together with the test-suite.log file (gzipped) and your system"; \
+echo "information. Thanks."; \
+ }; \
{ \
echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
$(am__rst_title); \
create_testsuite_report --no-color; \
+ output_system_information; \
echo; \
echo ".. contents:: :depth: 2"; \
echo; \
@@ -693,26 +730,25 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
create_testsuite_report --maybe-color; \
echo "$$col$$br$$std"; \
if $$success; then :; else \
- echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG) for debugging.$${std}";\
if test -n "$(PACKAGE_BUGREPORT)"; then \
- echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ please_report | sed -e "s/^/$${col}/" -e s/'$$'/"$${std}"/; \
fi; \
echo "$$col$$br$$std"; \
fi; \
$$success || exit 1
check-TESTS: $(dist_check_SCRIPTS)
- @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
- @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
- @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @$(am__rm_f) $(RECHECK_LOGS)
+ @$(am__rm_f) $(RECHECK_LOGS:.log=.trs)
+ @$(am__rm_f) $(TEST_SUITE_LOG)
@set +e; $(am__set_TESTS_bases); \
log_list=`for i in $$bases; do echo $$i.log; done`; \
- trs_list=`for i in $$bases; do echo $$i.trs; done`; \
- log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ log_list=`echo $$log_list`; \
$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
exit $$?;
recheck: all $(dist_check_SCRIPTS)
- @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @$(am__rm_f) $(TEST_SUITE_LOG)
@set +e; $(am__set_TESTS_bases); \
bases=`for i in $$bases; do echo $$i; done \
| $(am__list_recheck_tests)` || exit 1; \
@@ -741,7 +777,7 @@ distdir: $(BUILT_SOURCES)
distdir-am: $(DISTFILES)
$(am__remove_distdir)
- test -d "$(distdir)" || mkdir "$(distdir)"
+ $(AM_V_at)$(MKDIR_P) "$(distdir)"
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
@@ -827,7 +863,7 @@ dist dist-all:
distcheck: dist
case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \
- eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+ eval GZIP= gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
*.tar.bz2*) \
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.lz*) \
@@ -837,7 +873,7 @@ distcheck: dist
*.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
*.shar.gz*) \
- eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+ eval GZIP= gzip -dc $(distdir).shar.gz | unshar ;;\
*.zip*) \
unzip $(distdir).zip ;;\
*.tar.zst*) \
@@ -937,17 +973,17 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
- -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
- -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
- -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ -$(am__rm_f) $(TEST_LOGS)
+ -$(am__rm_f) $(TEST_LOGS:.log=.trs)
+ -$(am__rm_f) $(TEST_SUITE_LOG)
clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+ -$(am__rm_f) $(CLEANFILES)
distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
- -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+ -$(am__rm_f) $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES)
+ -$(am__rm_f) $(DISTCLEANFILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@@ -1062,3 +1098,10 @@ $(tpic_files): Makefile
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
+
+# Tell GNU make to disable its built-in pattern rules.
+%:: %,v
+%:: RCS/%,v
+%:: RCS/%
+%:: s.%
+%:: SCCS/s.%
diff --git a/graphics/tpic2pdftex/aclocal.m4 b/graphics/tpic2pdftex/aclocal.m4
index 6f522ebc71..1a674a31f4 100644
--- a/graphics/tpic2pdftex/aclocal.m4
+++ b/graphics/tpic2pdftex/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
+# generated automatically by aclocal 1.17 -*- Autoconf -*-
-# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+# Copyright (C) 1996-2024 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
-# Copyright (C) 2002-2021 Free Software Foundation, Inc.
+# Copyright (C) 2002-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
# generated from the m4 files accompanying Automake X.Y.
# (This private macro should not be called outside this file.)
AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.16'
+[am__api_version='1.17'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.16.5], [],
+m4_if([$1], [1.17], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.16.5])dnl
+[AM_AUTOMAKE_VERSION([1.17])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+# Copyright (C) 2001-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -110,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
# AM_CONDITIONAL -*- Autoconf -*-
-# Copyright (C) 1997-2021 Free Software Foundation, Inc.
+# Copyright (C) 1997-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -141,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE(
Usually this means the macro was only invoked conditionally.]])
fi])])
-# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+# Copyright (C) 1999-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -273,7 +273,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
# icc doesn't choke on unknown options, it will just issue warnings
# or remarks (even with -Werror). So we grep stderr for any message
# that says an option was ignored or not supported.
- # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # When given -MP, icc 7.0 and 7.1 complain thus:
# icc: Command line warning: ignoring option '-M'; no argument required
# The diagnosis changed in icc 8.0:
# icc: Command line remark: option '-MP' not supported
@@ -332,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
# Generate code to set up dependency tracking. -*- Autoconf -*-
-# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+# Copyright (C) 1999-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -400,7 +400,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
# Do all the work for Automake. -*- Autoconf -*-
-# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+# Copyright (C) 1996-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -534,7 +534,7 @@ if test -z "$CSCOPE"; then
fi
AC_SUBST([CSCOPE])
-AC_REQUIRE([AM_SILENT_RULES])dnl
+AC_REQUIRE([_AM_SILENT_RULES])dnl
dnl The testsuite driver may need to know about EXEEXT, so add the
dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
@@ -542,47 +542,9 @@ AC_CONFIG_COMMANDS_PRE(dnl
[m4_provide_if([_AM_COMPILER_EXEEXT],
[AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-# POSIX will say in a future version that running "rm -f" with no argument
-# is OK; and we want to be able to make that assumption in our Makefile
-# recipes. So use an aggressive probe to check that the usage we want is
-# actually supported "in the wild" to an acceptable degree.
-# See automake bug#10828.
-# To make any issue more visible, cause the running configure to be aborted
-# by default if the 'rm' program in use doesn't match our expectations; the
-# user can still override this though.
-if rm -f && rm -fr && rm -rf; then : OK; else
- cat >&2 <<'END'
-Oops!
-
-Your 'rm' program seems unable to run without file operands specified
-on the command line, even when the '-f' option is present. This is contrary
-to the behaviour of most rm programs out there, and not conforming with
-the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
-
-Please tell bug-automake@gnu.org about your system, including the value
-of your $PATH and any error possibly output before this message. This
-can help us improve future automake versions.
+AC_REQUIRE([_AM_PROG_RM_F])
+AC_REQUIRE([_AM_PROG_XARGS_N])
-END
- if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
- echo 'Configuration will proceed anyway, since you have set the' >&2
- echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
- echo >&2
- else
- cat >&2 <<'END'
-Aborting the configuration process, to ensure you take notice of the issue.
-
-You can download and install GNU coreutils to get an 'rm' implementation
-that behaves properly: <https://www.gnu.org/software/coreutils/>.
-
-If you want to complete the configuration process using your problematic
-'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
-to "yes", and re-run configure.
-
-END
- AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
- fi
-fi
dnl The trailing newline in this macro's definition is deliberate, for
dnl backward compatibility and to allow trailing 'dnl'-style comments
dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
@@ -615,7 +577,7 @@ for _am_header in $config_headers :; do
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+# Copyright (C) 2001-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -636,7 +598,7 @@ if test x"${install_sh+set}" != xset; then
fi
AC_SUBST([install_sh])])
-# Copyright (C) 2003-2021 Free Software Foundation, Inc.
+# Copyright (C) 2003-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -658,7 +620,7 @@ AC_SUBST([am__leading_dot])])
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
# From Jim Meyering
-# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+# Copyright (C) 1996-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -693,7 +655,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
# Check to see how 'make' treats includes. -*- Autoconf -*-
-# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+# Copyright (C) 2001-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -736,7 +698,7 @@ AC_SUBST([am__quote])])
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
-# Copyright (C) 1997-2021 Free Software Foundation, Inc.
+# Copyright (C) 1997-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -770,7 +732,7 @@ fi
# Helper functions for option handling. -*- Autoconf -*-
-# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+# Copyright (C) 2001-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -799,7 +761,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+# Copyright (C) 1999-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -846,7 +808,23 @@ AC_LANG_POP([C])])
# For backward compatibility.
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
-# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+# Copyright (C) 2022-2024 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_RM_F
+# ---------------
+# Check whether 'rm -f' without any arguments works.
+# https://bugs.gnu.org/10828
+AC_DEFUN([_AM_PROG_RM_F],
+[am__rm_f_notfound=
+AS_IF([(rm -f && rm -fr && rm -rf) 2>/dev/null], [], [am__rm_f_notfound='""'])
+AC_SUBST(am__rm_f_notfound)
+])
+
+# Copyright (C) 2001-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -865,16 +843,169 @@ AC_DEFUN([AM_RUN_LOG],
# Check to make sure that the build environment is sane. -*- Autoconf -*-
-# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+# Copyright (C) 1996-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# _AM_SLEEP_FRACTIONAL_SECONDS
+# ----------------------------
+AC_DEFUN([_AM_SLEEP_FRACTIONAL_SECONDS], [dnl
+AC_CACHE_CHECK([whether sleep supports fractional seconds],
+ am_cv_sleep_fractional_seconds, [dnl
+AS_IF([sleep 0.001 2>/dev/null], [am_cv_sleep_fractional_seconds=yes],
+ [am_cv_sleep_fractional_seconds=no])
+])])
+
+# _AM_FILESYSTEM_TIMESTAMP_RESOLUTION
+# -----------------------------------
+# Determine the filesystem's resolution for file modification
+# timestamps. The coarsest we know of is FAT, with a resolution
+# of only two seconds, even with the most recent "exFAT" extensions.
+# The finest (e.g. ext4 with large inodes, XFS, ZFS) is one
+# nanosecond, matching clock_gettime. However, it is probably not
+# possible to delay execution of a shell script for less than one
+# millisecond, due to process creation overhead and scheduling
+# granularity, so we don't check for anything finer than that. (See below.)
+AC_DEFUN([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION], [dnl
+AC_REQUIRE([_AM_SLEEP_FRACTIONAL_SECONDS])
+AC_CACHE_CHECK([filesystem timestamp resolution],
+ am_cv_filesystem_timestamp_resolution, [dnl
+# Default to the worst case.
+am_cv_filesystem_timestamp_resolution=2
+
+# Only try to go finer than 1 sec if sleep can do it.
+# Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work,
+# - 1 sec is not much of a win compared to 2 sec, and
+# - it takes 2 seconds to perform the test whether 1 sec works.
+#
+# Instead, just use the default 2s on platforms that have 1s resolution,
+# accept the extra 1s delay when using $sleep in the Automake tests, in
+# exchange for not incurring the 2s delay for running the test for all
+# packages.
+#
+am_try_resolutions=
+if test "$am_cv_sleep_fractional_seconds" = yes; then
+ # Even a millisecond often causes a bunch of false positives,
+ # so just try a hundredth of a second. The time saved between .001 and
+ # .01 is not terribly consequential.
+ am_try_resolutions="0.01 0.1 $am_try_resolutions"
+fi
+
+# In order to catch current-generation FAT out, we must *modify* files
+# that already exist; the *creation* timestamp is finer. Use names
+# that make ls -t sort them differently when they have equal
+# timestamps than when they have distinct timestamps, keeping
+# in mind that ls -t prints the *newest* file first.
+rm -f conftest.ts?
+: > conftest.ts1
+: > conftest.ts2
+: > conftest.ts3
+
+# Make sure ls -t actually works. Do 'set' in a subshell so we don't
+# clobber the current shell's arguments. (Outer-level square brackets
+# are removed by m4; they're present so that m4 does not expand
+# <dollar><star>; be careful, easy to get confused.)
+if (
+ set X `[ls -t conftest.ts[12]]` &&
+ {
+ test "$[]*" != "X conftest.ts1 conftest.ts2" ||
+ test "$[]*" != "X conftest.ts2 conftest.ts1";
+ }
+); then :; else
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ _AS_ECHO_UNQUOTED(
+ ["Bad output from ls -t: \"`[ls -t conftest.ts[12]]`\""],
+ [AS_MESSAGE_LOG_FD])
+ AC_MSG_FAILURE([ls -t produces unexpected output.
+Make sure there is not a broken ls alias in your environment.])
+fi
+
+for am_try_res in $am_try_resolutions; do
+ # Any one fine-grained sleep might happen to cross the boundary
+ # between two values of a coarser actual resolution, but if we do
+ # two fine-grained sleeps in a row, at least one of them will fall
+ # entirely within a coarse interval.
+ echo alpha > conftest.ts1
+ sleep $am_try_res
+ echo beta > conftest.ts2
+ sleep $am_try_res
+ echo gamma > conftest.ts3
+
+ # We assume that 'ls -t' will make use of high-resolution
+ # timestamps if the operating system supports them at all.
+ if (set X `ls -t conftest.ts?` &&
+ test "$[]2" = conftest.ts3 &&
+ test "$[]3" = conftest.ts2 &&
+ test "$[]4" = conftest.ts1); then
+ #
+ # Ok, ls -t worked. If we're at a resolution of 1 second, we're done,
+ # because we don't need to test make.
+ make_ok=true
+ if test $am_try_res != 1; then
+ # But if we've succeeded so far with a subsecond resolution, we
+ # have one more thing to check: make. It can happen that
+ # everything else supports the subsecond mtimes, but make doesn't;
+ # notably on macOS, which ships make 3.81 from 2006 (the last one
+ # released under GPLv2). https://bugs.gnu.org/68808
+ #
+ # We test $MAKE if it is defined in the environment, else "make".
+ # It might get overridden later, but our hope is that in practice
+ # it does not matter: it is the system "make" which is (by far)
+ # the most likely to be broken, whereas if the user overrides it,
+ # probably they did so with a better, or at least not worse, make.
+ # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html
+ #
+ # Create a Makefile (real tab character here):
+ rm -f conftest.mk
+ echo 'conftest.ts1: conftest.ts2' >conftest.mk
+ echo ' touch conftest.ts2' >>conftest.mk
+ #
+ # Now, running
+ # touch conftest.ts1; touch conftest.ts2; make
+ # should touch ts1 because ts2 is newer. This could happen by luck,
+ # but most often, it will fail if make's support is insufficient. So
+ # test for several consecutive successes.
+ #
+ # (We reuse conftest.ts[12] because we still want to modify existing
+ # files, not create new ones, per above.)
+ n=0
+ make=${MAKE-make}
+ until test $n -eq 3; do
+ echo one > conftest.ts1
+ sleep $am_try_res
+ echo two > conftest.ts2 # ts2 should now be newer than ts1
+ if $make -f conftest.mk | grep 'up to date' >/dev/null; then
+ make_ok=false
+ break # out of $n loop
+ fi
+ n=`expr $n + 1`
+ done
+ fi
+ #
+ if $make_ok; then
+ # Everything we know to check worked out, so call this resolution good.
+ am_cv_filesystem_timestamp_resolution=$am_try_res
+ break # out of $am_try_res loop
+ fi
+ # Otherwise, we'll go on to check the next resolution.
+ fi
+done
+rm -f conftest.ts?
+# (end _am_filesystem_timestamp_resolution)
+])])
+
# AM_SANITY_CHECK
# ---------------
AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
+[AC_REQUIRE([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION])
+# This check should not be cached, as it may vary across builds of
+# different projects.
+AC_MSG_CHECKING([whether build environment is sane])
# Reject unsafe characters in $srcdir or the absolute working directory
# name. Accept space and tab only in the latter.
am_lf='
@@ -893,49 +1024,40 @@ esac
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
-if (
- am_has_slept=no
- for am_try in 1 2; do
- echo "timestamp, slept: $am_has_slept" > conftest.file
- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
- if test "$[*]" = "X"; then
- # -L didn't work.
- set X `ls -t "$srcdir/configure" conftest.file`
- fi
- if test "$[*]" != "X $srcdir/configure conftest.file" \
- && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
- alias in your environment])
- fi
- if test "$[2]" = conftest.file || test $am_try -eq 2; then
- break
- fi
- # Just in case.
- sleep 1
- am_has_slept=yes
- done
- test "$[2]" = conftest.file
- )
-then
- # Ok.
- :
-else
- AC_MSG_ERROR([newly created file is older than distributed files!
+am_build_env_is_sane=no
+am_has_slept=no
+rm -f conftest.file
+for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ if (
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[]*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ test "$[]2" = conftest.file
+ ); then
+ am_build_env_is_sane=yes
+ break
+ fi
+ # Just in case.
+ sleep "$am_cv_filesystem_timestamp_resolution"
+ am_has_slept=yes
+done
+
+AC_MSG_RESULT([$am_build_env_is_sane])
+if test "$am_build_env_is_sane" = no; then
+ AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
-AC_MSG_RESULT([yes])
+
# If we didn't sleep, we still need to ensure time stamps of config.status and
# generated files are strictly newer.
am_sleep_pid=
-if grep 'slept: no' conftest.file >/dev/null 2>&1; then
- ( sleep 1 ) &
+AS_IF([test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1],, [dnl
+ ( sleep "$am_cv_filesystem_timestamp_resolution" ) &
am_sleep_pid=$!
-fi
+])
AC_CONFIG_COMMANDS_PRE(
[AC_MSG_CHECKING([that generated files are newer than configure])
if test -n "$am_sleep_pid"; then
@@ -946,18 +1068,18 @@ AC_CONFIG_COMMANDS_PRE(
rm -f conftest.file
])
-# Copyright (C) 2009-2021 Free Software Foundation, Inc.
+# Copyright (C) 2009-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# AM_SILENT_RULES([DEFAULT])
-# --------------------------
-# Enable less verbose build rules; with the default set to DEFAULT
-# ("yes" being less verbose, "no" or empty being verbose).
-AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules], [dnl
+# _AM_SILENT_RULES
+# ----------------
+# Enable less verbose build rules support.
+AC_DEFUN([_AM_SILENT_RULES],
+[AM_DEFAULT_VERBOSITY=1
+AC_ARG_ENABLE([silent-rules], [dnl
AS_HELP_STRING(
[--enable-silent-rules],
[less verbose build output (undo: "make V=1")])
@@ -965,11 +1087,6 @@ AS_HELP_STRING(
[--disable-silent-rules],
[verbose build output (undo: "make V=0")])dnl
])
-case $enable_silent_rules in @%:@ (((
- yes) AM_DEFAULT_VERBOSITY=0;;
- no) AM_DEFAULT_VERBOSITY=1;;
- *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
-esac
dnl
dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
dnl do not support nested variable expansions.
@@ -988,14 +1105,6 @@ am__doit:
else
am_cv_make_support_nested_variables=no
fi])
-if test $am_cv_make_support_nested_variables = yes; then
- dnl Using '$V' instead of '$(V)' breaks IRIX make.
- AM_V='$(V)'
- AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
-else
- AM_V=$AM_DEFAULT_VERBOSITY
- AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
-fi
AC_SUBST([AM_V])dnl
AM_SUBST_NOTMAKE([AM_V])dnl
AC_SUBST([AM_DEFAULT_V])dnl
@@ -1004,9 +1113,33 @@ AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
AM_BACKSLASH='\'
AC_SUBST([AM_BACKSLASH])dnl
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+dnl Delay evaluation of AM_DEFAULT_VERBOSITY to the end to allow multiple calls
+dnl to AM_SILENT_RULES to change the default value.
+AC_CONFIG_COMMANDS_PRE([dnl
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+esac
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+])dnl
])
-# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Set the default verbosity level to DEFAULT ("yes" being less verbose, "no" or
+# empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_REQUIRE([_AM_SILENT_RULES])
+AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1])])
+
+# Copyright (C) 2001-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1034,7 +1167,7 @@ fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
-# Copyright (C) 2006-2021 Free Software Foundation, Inc.
+# Copyright (C) 2006-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1053,7 +1186,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Check how to create a tarball. -*- Autoconf -*-
-# Copyright (C) 2004-2021 Free Software Foundation, Inc.
+# Copyright (C) 2004-2024 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1099,15 +1232,19 @@ m4_if([$1], [v7],
am_uid=`id -u || echo unknown`
am_gid=`id -g || echo unknown`
AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
- if test $am_uid -le $am_max_uid; then
- AC_MSG_RESULT([yes])
+ if test x$am_uid = xunknown; then
+ AC_MSG_WARN([ancient id detected; assuming current UID is ok, but dist-ustar might not work])
+ elif test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
else
- AC_MSG_RESULT([no])
- _am_tools=none
+ AC_MSG_RESULT([no])
+ _am_tools=none
fi
AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
- if test $am_gid -le $am_max_gid; then
- AC_MSG_RESULT([yes])
+ if test x$gm_gid = xunknown; then
+ AC_MSG_WARN([ancient id detected; assuming current GID is ok, but dist-ustar might not work])
+ elif test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
_am_tools=none
@@ -1184,6 +1321,26 @@ AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
+# Copyright (C) 2022-2024 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_XARGS_N
+# ----------------
+# Check whether 'xargs -n' works. It should work everywhere, so the fallback
+# is not optimized at all as we never expect to use it.
+AC_DEFUN([_AM_PROG_XARGS_N],
+[AC_CACHE_CHECK([xargs -n works], am_cv_xargs_n_works, [dnl
+AS_IF([test "`echo 1 2 3 | xargs -n2 echo`" = "1 2
+3"], [am_cv_xargs_n_works=yes], [am_cv_xargs_n_works=no])])
+AS_IF([test "$am_cv_xargs_n_works" = yes], [am__xargs_n='xargs -n'], [dnl
+ am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "$@" "$am__xargs_n_arg"; done; }'
+])dnl
+AC_SUBST(am__xargs_n)
+])
+
m4_include([../../m4/kpse-common.m4])
m4_include([../../m4/kpse-warnings.m4])
m4_include([../../m4/kpse-win32.m4])
diff --git a/graphics/tpic2pdftex/configure.texk b/graphics/tpic2pdftex/configure.texk
index 34f8982c14..a54279b813 100755
--- a/graphics/tpic2pdftex/configure.texk
+++ b/graphics/tpic2pdftex/configure.texk
@@ -667,6 +667,8 @@ CC
MAINT
MAINTAINER_MODE_FALSE
MAINTAINER_MODE_TRUE
+am__xargs_n
+am__rm_f_notfound
AM_BACKSLASH
AM_DEFAULT_VERBOSITY
AM_DEFAULT_V
@@ -2406,7 +2408,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-am__api_version='1.16'
+am__api_version='1.17'
@@ -2509,6 +2511,165 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether sleep supports fractional seconds" >&5
+printf %s "checking whether sleep supports fractional seconds... " >&6; }
+if test ${am_cv_sleep_fractional_seconds+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if sleep 0.001 2>/dev/null
+then :
+ am_cv_sleep_fractional_seconds=yes
+else case e in #(
+ e) am_cv_sleep_fractional_seconds=no ;;
+esac
+fi
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_sleep_fractional_seconds" >&5
+printf "%s\n" "$am_cv_sleep_fractional_seconds" >&6; }
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking filesystem timestamp resolution" >&5
+printf %s "checking filesystem timestamp resolution... " >&6; }
+if test ${am_cv_filesystem_timestamp_resolution+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) # Default to the worst case.
+am_cv_filesystem_timestamp_resolution=2
+
+# Only try to go finer than 1 sec if sleep can do it.
+# Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work,
+# - 1 sec is not much of a win compared to 2 sec, and
+# - it takes 2 seconds to perform the test whether 1 sec works.
+#
+# Instead, just use the default 2s on platforms that have 1s resolution,
+# accept the extra 1s delay when using $sleep in the Automake tests, in
+# exchange for not incurring the 2s delay for running the test for all
+# packages.
+#
+am_try_resolutions=
+if test "$am_cv_sleep_fractional_seconds" = yes; then
+ # Even a millisecond often causes a bunch of false positives,
+ # so just try a hundredth of a second. The time saved between .001 and
+ # .01 is not terribly consequential.
+ am_try_resolutions="0.01 0.1 $am_try_resolutions"
+fi
+
+# In order to catch current-generation FAT out, we must *modify* files
+# that already exist; the *creation* timestamp is finer. Use names
+# that make ls -t sort them differently when they have equal
+# timestamps than when they have distinct timestamps, keeping
+# in mind that ls -t prints the *newest* file first.
+rm -f conftest.ts?
+: > conftest.ts1
+: > conftest.ts2
+: > conftest.ts3
+
+# Make sure ls -t actually works. Do 'set' in a subshell so we don't
+# clobber the current shell's arguments. (Outer-level square brackets
+# are removed by m4; they're present so that m4 does not expand
+# <dollar><star>; be careful, easy to get confused.)
+if (
+ set X `ls -t conftest.ts[12]` &&
+ {
+ test "$*" != "X conftest.ts1 conftest.ts2" ||
+ test "$*" != "X conftest.ts2 conftest.ts1";
+ }
+); then :; else
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ printf "%s\n" ""Bad output from ls -t: \"`ls -t conftest.ts[12]`\""" >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
+as_fn_error $? "ls -t produces unexpected output.
+Make sure there is not a broken ls alias in your environment.
+See 'config.log' for more details" "$LINENO" 5; }
+fi
+
+for am_try_res in $am_try_resolutions; do
+ # Any one fine-grained sleep might happen to cross the boundary
+ # between two values of a coarser actual resolution, but if we do
+ # two fine-grained sleeps in a row, at least one of them will fall
+ # entirely within a coarse interval.
+ echo alpha > conftest.ts1
+ sleep $am_try_res
+ echo beta > conftest.ts2
+ sleep $am_try_res
+ echo gamma > conftest.ts3
+
+ # We assume that 'ls -t' will make use of high-resolution
+ # timestamps if the operating system supports them at all.
+ if (set X `ls -t conftest.ts?` &&
+ test "$2" = conftest.ts3 &&
+ test "$3" = conftest.ts2 &&
+ test "$4" = conftest.ts1); then
+ #
+ # Ok, ls -t worked. If we're at a resolution of 1 second, we're done,
+ # because we don't need to test make.
+ make_ok=true
+ if test $am_try_res != 1; then
+ # But if we've succeeded so far with a subsecond resolution, we
+ # have one more thing to check: make. It can happen that
+ # everything else supports the subsecond mtimes, but make doesn't;
+ # notably on macOS, which ships make 3.81 from 2006 (the last one
+ # released under GPLv2). https://bugs.gnu.org/68808
+ #
+ # We test $MAKE if it is defined in the environment, else "make".
+ # It might get overridden later, but our hope is that in practice
+ # it does not matter: it is the system "make" which is (by far)
+ # the most likely to be broken, whereas if the user overrides it,
+ # probably they did so with a better, or at least not worse, make.
+ # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html
+ #
+ # Create a Makefile (real tab character here):
+ rm -f conftest.mk
+ echo 'conftest.ts1: conftest.ts2' >conftest.mk
+ echo ' touch conftest.ts2' >>conftest.mk
+ #
+ # Now, running
+ # touch conftest.ts1; touch conftest.ts2; make
+ # should touch ts1 because ts2 is newer. This could happen by luck,
+ # but most often, it will fail if make's support is insufficient. So
+ # test for several consecutive successes.
+ #
+ # (We reuse conftest.ts[12] because we still want to modify existing
+ # files, not create new ones, per above.)
+ n=0
+ make=${MAKE-make}
+ until test $n -eq 3; do
+ echo one > conftest.ts1
+ sleep $am_try_res
+ echo two > conftest.ts2 # ts2 should now be newer than ts1
+ if $make -f conftest.mk | grep 'up to date' >/dev/null; then
+ make_ok=false
+ break # out of $n loop
+ fi
+ n=`expr $n + 1`
+ done
+ fi
+ #
+ if $make_ok; then
+ # Everything we know to check worked out, so call this resolution good.
+ am_cv_filesystem_timestamp_resolution=$am_try_res
+ break # out of $am_try_res loop
+ fi
+ # Otherwise, we'll go on to check the next resolution.
+ fi
+done
+rm -f conftest.ts?
+# (end _am_filesystem_timestamp_resolution)
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_filesystem_timestamp_resolution" >&5
+printf "%s\n" "$am_cv_filesystem_timestamp_resolution" >&6; }
+
+# This check should not be cached, as it may vary across builds of
+# different projects.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
printf %s "checking whether build environment is sane... " >&6; }
# Reject unsafe characters in $srcdir or the absolute working directory
@@ -2529,49 +2690,45 @@ esac
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
-if (
- am_has_slept=no
- for am_try in 1 2; do
- echo "timestamp, slept: $am_has_slept" > conftest.file
- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
- if test "$*" = "X"; then
- # -L didn't work.
- set X `ls -t "$srcdir/configure" conftest.file`
- fi
- if test "$*" != "X $srcdir/configure conftest.file" \
- && test "$*" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
- alias in your environment" "$LINENO" 5
- fi
- if test "$2" = conftest.file || test $am_try -eq 2; then
- break
- fi
- # Just in case.
- sleep 1
- am_has_slept=yes
- done
- test "$2" = conftest.file
- )
-then
- # Ok.
- :
-else
- as_fn_error $? "newly created file is older than distributed files!
+am_build_env_is_sane=no
+am_has_slept=no
+rm -f conftest.file
+for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ if (
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ test "$2" = conftest.file
+ ); then
+ am_build_env_is_sane=yes
+ break
+ fi
+ # Just in case.
+ sleep "$am_cv_filesystem_timestamp_resolution"
+ am_has_slept=yes
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_build_env_is_sane" >&5
+printf "%s\n" "$am_build_env_is_sane" >&6; }
+if test "$am_build_env_is_sane" = no; then
+ as_fn_error $? "newly created file is older than distributed files!
Check your system clock" "$LINENO" 5
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-printf "%s\n" "yes" >&6; }
+
# If we didn't sleep, we still need to ensure time stamps of config.status and
# generated files are strictly newer.
am_sleep_pid=
-if grep 'slept: no' conftest.file >/dev/null 2>&1; then
- ( sleep 1 ) &
+if test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1
+then :
+
+else case e in #(
+ e) ( sleep "$am_cv_filesystem_timestamp_resolution" ) &
am_sleep_pid=$!
+ ;;
+esac
fi
rm -f conftest.file
@@ -2861,17 +3018,13 @@ else
fi
rmdir .tst 2>/dev/null
+AM_DEFAULT_VERBOSITY=1
# Check whether --enable-silent-rules was given.
if test ${enable_silent_rules+y}
then :
enableval=$enable_silent_rules;
fi
-case $enable_silent_rules in # (((
- yes) AM_DEFAULT_VERBOSITY=0;;
- no) AM_DEFAULT_VERBOSITY=1;;
- *) AM_DEFAULT_VERBOSITY=1;;
-esac
am_make=${MAKE-make}
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
printf %s "checking whether $am_make supports nested variables... " >&6; }
@@ -2894,15 +3047,45 @@ esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
-if test $am_cv_make_support_nested_variables = yes; then
- AM_V='$(V)'
- AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
-else
- AM_V=$AM_DEFAULT_VERBOSITY
- AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
-fi
AM_BACKSLASH='\'
+am__rm_f_notfound=
+if (rm -f && rm -fr && rm -rf) 2>/dev/null
+then :
+
+else case e in #(
+ e) am__rm_f_notfound='""' ;;
+esac
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking xargs -n works" >&5
+printf %s "checking xargs -n works... " >&6; }
+if test ${am_cv_xargs_n_works+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test "`echo 1 2 3 | xargs -n2 echo`" = "1 2
+3"
+then :
+ am_cv_xargs_n_works=yes
+else case e in #(
+ e) am_cv_xargs_n_works=no ;;
+esac
+fi ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_xargs_n_works" >&5
+printf "%s\n" "$am_cv_xargs_n_works" >&6; }
+if test "$am_cv_xargs_n_works" = yes
+then :
+ am__xargs_n='xargs -n'
+else case e in #(
+ e) am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "" "$am__xargs_n_arg"; done; }'
+ ;;
+esac
+fi
+
@@ -4149,7 +4332,7 @@ else case e in #(
# icc doesn't choke on unknown options, it will just issue warnings
# or remarks (even with -Werror). So we grep stderr for any message
# that says an option was ignored or not supported.
- # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # When given -MP, icc 7.0 and 7.1 complain thus:
# icc: Command line warning: ignoring option '-M'; no argument required
# The diagnosis changed in icc 8.0:
# icc: Command line remark: option '-MP' not supported
@@ -4467,47 +4650,9 @@ fi
-# POSIX will say in a future version that running "rm -f" with no argument
-# is OK; and we want to be able to make that assumption in our Makefile
-# recipes. So use an aggressive probe to check that the usage we want is
-# actually supported "in the wild" to an acceptable degree.
-# See automake bug#10828.
-# To make any issue more visible, cause the running configure to be aborted
-# by default if the 'rm' program in use doesn't match our expectations; the
-# user can still override this though.
-if rm -f && rm -fr && rm -rf; then : OK; else
- cat >&2 <<'END'
-Oops!
-Your 'rm' program seems unable to run without file operands specified
-on the command line, even when the '-f' option is present. This is contrary
-to the behaviour of most rm programs out there, and not conforming with
-the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
-Please tell bug-automake@gnu.org about your system, including the value
-of your $PATH and any error possibly output before this message. This
-can help us improve future automake versions.
-END
- if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
- echo 'Configuration will proceed anyway, since you have set the' >&2
- echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
- echo >&2
- else
- cat >&2 <<'END'
-Aborting the configuration process, to ensure you take notice of the issue.
-
-You can download and install GNU coreutils to get an 'rm' implementation
-that behaves properly: <https://www.gnu.org/software/coreutils/>.
-
-If you want to complete the configuration process using your problematic
-'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
-to "yes", and re-run configure.
-
-END
- as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
- fi
-fi
# am_maintainer_mode
@@ -4853,6 +4998,18 @@ printf %s "checking that generated files are newer than configure... " >&6; }
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
printf "%s\n" "done" >&6; }
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+esac
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+
if test -n "$EXEEXT"; then
am__EXEEXT_TRUE=
am__EXEEXT_FALSE='#'